[
  {
    "path": ".circleci/config.yml",
    "content": "version: 2.1\n\nsetup: true\norbs:\n  continuation: circleci/continuation@1\n\njobs:\n  set-matrix:\n    executor: continuation/default\n    docker:\n      - image: cimg/base:current\n    resource_class: large\n    steps:\n      - checkout\n      - run:\n          name: Set matrix\n          command: |\n            MATRIX_JSON=$(python .github/workflows/ci_set_matrix.py)\n            echo \"MATRIX_JSON=$MATRIX_JSON\"\n\n            BUILDSYSTEM_LIST=(\n              \"cmake\"\n              \"make\"\n            )\n\n            TOOLCHAIN_LIST=(\n              \"aarch64-gcc\"\n              \"arm-clang\"\n              \"arm-gcc\"\n              \"esp-idf\"\n              \"ft9xx-gcc\"\n              \"msp430-gcc\"\n              \"riscv-gcc\"\n            )\n\n            # only build IAR if not forked PR, since IAR token is not shared\n            if [ -z $CIRCLE_PR_USERNAME ]; then\n              TOOLCHAIN_LIST+=(\"arm-iar\")\n            fi\n\n            gen_build_entry() {\n              local build_system=\"$1\"\n              local toolchain=\"$2\"\n              local family=\"$3\"\n              local build_args=\"\"\n\n              if [[ \"$toolchain\" == \"arm-iar\" || \"$build_system\" == \"make\" ]]; then\n                build_args=\"--one-random\"\n              fi\n\n              if [[ \"$toolchain\" == \"esp-idf\" ]]; then\n                echo \"      - build-vm:\" >> .circleci/config2.yml\n              else\n                echo \"      - build:\" >> .circleci/config2.yml\n              fi\n              echo \"          matrix:\" >> .circleci/config2.yml\n              echo \"            alias: build-${build_system}-${toolchain}\" >> .circleci/config2.yml\n              echo \"            parameters:\" >> .circleci/config2.yml\n              echo \"              build-system: ['$build_system']\" >> .circleci/config2.yml\n              echo \"              toolchain: ['$toolchain']\" >> .circleci/config2.yml\n              echo \"              family: $family\" >> .circleci/config2.yml\n              echo \"              resource_class: ['large']\" >> .circleci/config2.yml\n              echo \"              build-args: ['$build_args']\" >> .circleci/config2.yml\n            }\n\n            # Collect all build aliases for code-metrics requires (cmake only, exclude esp-idf)\n            BUILD_ALIASES=()\n\n            for build_system in \"${BUILDSYSTEM_LIST[@]}\"; do\n              for toolchain in \"${TOOLCHAIN_LIST[@]}\"; do\n                # make does not support these toolchains\n                if [ \"$build_system\" == \"make\" ] && { [ \"$toolchain\" == \"arm-clang\" ] || [ \"$toolchain\" == \"arm-iar\" ] || [ \"$toolchain\" == \"esp-idf\" ]; }; then\n                  continue\n                fi\n\n                FAMILY=$(echo $MATRIX_JSON | jq -r \".\\\"$toolchain\\\"\")\n                echo \"FAMILY_${toolchain}=$FAMILY\"\n                gen_build_entry \"$build_system\" \"$toolchain\" \"$FAMILY\"\n\n                # Only add cmake builds: excluding esp-idf or build_args=\"--one-random\" to metrics requirements\n                if [ \"$build_system\" == \"cmake\" ] && [ \"$toolchain\" != \"esp-idf\" ] && [ \"$toolchain\" != \"arm-iar\" ]; then\n                  BUILD_ALIASES+=(\"build-${build_system}-${toolchain}\")\n                fi\n              done\n            done\n\n            # Add code-metrics job that requires all build jobs\n            echo \"      - code-metrics:\" >> .circleci/config2.yml\n            echo \"          requires:\" >> .circleci/config2.yml\n            for alias in \"${BUILD_ALIASES[@]}\"; do\n              echo \"            - $alias\" >> .circleci/config2.yml\n            done\n\n      - continuation/continue:\n          configuration_path: .circleci/config2.yml\n\nworkflows:\n  set-matrix:\n    jobs:\n      - set-matrix\n"
  },
  {
    "path": ".circleci/config2.yml",
    "content": "version: 2.1\n\ncommands:\n  setup-toolchain:\n    parameters:\n        toolchain:\n            type: string\n\n    steps:\n      - run:\n          name: Set toolchain url and key\n          command: |\n            toolchain_url=$(jq -r '.\"<< parameters.toolchain >>\"' .github/actions/setup_toolchain/toolchain.json)\n            # only cache if not a github link\n            if [[ $toolchain_url != \"https://github.com\"* ]]; then\n              echo \"<< parameters.toolchain >>-$toolchain_url\" > toolchain_key\n            fi\n            echo \"export toolchain_url=$toolchain_url\" >> $BASH_ENV\n\n      - restore_cache:\n          name: Restore Toolchain Cache\n          key: deps-{{ checksum \"toolchain_key\" }}\n          paths:\n            - ~/cache/<< parameters.toolchain >>\n\n      - run:\n          name: Install Toolchain\n          command: |\n            # download if folder does not exist (not cached)\n            if [ ! -d ~/cache/<< parameters.toolchain >> ]; then\n              mkdir -p ~/cache/<< parameters.toolchain >>\n              if [[ << parameters.toolchain >> == rx-gcc ]]; then\n                wget --progress=dot:giga $toolchain_url -O toolchain.run\n                chmod +x toolchain.run\n                ./toolchain.run -p ~/cache/<< parameters.toolchain >>/gnurx -y\n              elif [[ << parameters.toolchain >> == ft9xx-gcc ]]; then\n                wget --progress=dot:giga $toolchain_url -O ~/cache/<< parameters.toolchain >>/ft9xxtoolchain.deb\n              elif [[ << parameters.toolchain >> == arm-iar ]]; then\n                wget --progress=dot:giga https://netstorage.iar.com/FileStore/STANDARD/001/003/926/iar-lmsc-tools_1.8_amd64.deb -O ~/cache/<< parameters.toolchain >>/iar-lmsc-tools.deb\n                wget --progress=dot:giga $toolchain_url -O ~/cache/<< parameters.toolchain >>/toolchain.deb\n              else\n                wget --progress=dot:giga $toolchain_url -O toolchain.tar.gz\n                tar -C ~/cache/<< parameters.toolchain >> -xaf toolchain.tar.gz\n              fi\n            fi\n\n            # Add toolchain to PATH\n            if [[ << parameters.toolchain >> == arm-iar ]]; then\n              # Install IAR since we only cache deb file\n              sudo dpkg -i ~/cache/<< parameters.toolchain >>/iar-lmsc-tools.deb\n              sudo dpkg --ignore-depends=libusb-1.0-0 -i ~/cache/<< parameters.toolchain >>/toolchain.deb\n              echo \"export PATH=$PATH:/opt/iar/cxarm/arm/bin\" >> $BASH_ENV\n            elif [[ << parameters.toolchain >> == ft9xx-gcc ]]; then\n              sudo apt install -y ~/cache/<< parameters.toolchain >>/ft9xxtoolchain.deb\n              echo \"export PATH=$PATH:/opt/ft32/bin\" >> $BASH_ENV\n            else\n              echo \"export PATH=$PATH:`echo ~/cache/<< parameters.toolchain >>/*/bin`\" >> $BASH_ENV\n            fi\n\n      - save_cache:\n          name: Save Toolchain Cache\n          key: deps-{{ checksum \"toolchain_key\" }}\n          paths:\n            - ~/cache/<< parameters.toolchain >>\n\n  build:\n    parameters:\n      build-system:\n        type: string\n      toolchain:\n        type: string\n      family:\n        type: string\n      build-args:\n        type: string\n        default: \"\"\n\n    steps:\n      - checkout\n      - run:\n          name: Get Dependencies\n          command: |\n            python tools/get_deps.py << parameters.family >>\n\n            # Install ninja  if cmake build system\n            if [ << parameters.build-system >> == \"cmake\" ]; then\n              NINJA_URL=https://github.com/ninja-build/ninja/releases/download/v1.12.1/ninja-linux.zip\n              wget $NINJA_URL -O ninja-linux.zip\n              unzip ninja-linux.zip -d ~/bin\n            fi\n\n            # rx-gcc is 32-bit binary\n            if [[ << parameters.toolchain >> == rx-gcc ]]; then\n              sudo dpkg --add-architecture i386\n              sudo apt update\n              sudo apt install libc6:i386 libstdc++6:i386 zlib1g:i386\n            fi\n\n            # Install Pico SDK\n            if [ << parameters.family >> == \"rp2040\" ]; then\n              git clone --depth 1 https://github.com/raspberrypi/pico-sdk.git ~/pico-sdk\n              echo \"export PICO_SDK_PATH=~/pico-sdk\" >> $BASH_ENV\n            fi\n\n      - when:\n          condition:\n            not:\n              equal: [esp-idf, << parameters.toolchain >>]\n          steps:\n            - setup-toolchain:\n                toolchain: << parameters.toolchain >>\n\n      - run:\n          name: Build\n          no_output_timeout: 20m\n          command: |\n            if [ << parameters.toolchain >> == esp-idf ]; then\n              docker run --rm -v $PWD:/project -w /project espressif/idf:v5.5.3 python tools/build.py << parameters.build-args >> --target all << parameters.family >>\n            else\n              # Toolchain option default is gcc\n              if [ << parameters.toolchain >> == arm-clang ]; then\n                TOOLCHAIN_OPTION=\"--toolchain clang\"\n              elif [ << parameters.toolchain >> == arm-iar ]; then\n                TOOLCHAIN_OPTION=\"--toolchain iar\"\n                iccarm --version\n              elif [ << parameters.toolchain >> == arm-gcc ]; then\n                TOOLCHAIN_OPTION=\"--toolchain gcc\"\n              fi\n\n              # circleci docker return $nproc as 36 core, limit parallel to 4 (resource-class = large)\n              # Required for IAR, also prevent crashed/killed by docker\n              BUILD_PY_ARGS=\"-s << parameters.build-system >> $TOOLCHAIN_OPTION -j 4 << parameters.build-args >> --target all\"\n              if [ << parameters.build-system >> == \"cmake\" ]; then\n                BUILD_PY_ARGS=\"$BUILD_PY_ARGS --target tinyusb_metrics\"\n              fi\n              python tools/build.py $BUILD_PY_ARGS << parameters.family >>\n            fi\n\n      # Only collect and persist metrics for cmake builds (excluding esp-idf and --one-random)\n      - when:\n          condition:\n            and:\n              - equal: [ cmake, << parameters.build-system >> ]\n              - not:\n                  equal: [ esp-idf, << parameters.toolchain >> ]\n              - not:\n                  equal: [ arm-iar, << parameters.toolchain >> ]\n          steps:\n            - run:\n                name: Collect Metrics\n                command: |\n                  # Create unique directory per toolchain to avoid workspace conflicts\n                  METRICS_DIR=\"/tmp/metrics/<< parameters.toolchain >>\"\n                  mkdir -p \"${METRICS_DIR}\"\n                  # Copy all metrics.json files\n                  for f in cmake-build/cmake-build-*/metrics.json; do\n                    if [ -f \"$f\" ]; then\n                      BOARD_DIR=$(dirname \"$f\" | xargs basename)\n                      cp \"$f\" \"${METRICS_DIR}/${BOARD_DIR}.json\"\n                    fi\n                  done\n\n            - persist_to_workspace:\n                root: /tmp\n                paths:\n                  - metrics/<< parameters.toolchain >>\n\njobs:\n  # Build using docker\n  build:\n    parameters:\n      resource_class:\n        type: string\n        default: large\n      build-system:\n        type: string\n      toolchain:\n        type: string\n      family:\n        type: string\n      build-args:\n        type: string\n        default: \"\"\n\n    docker:\n      - image: cimg/base:current\n    working_directory: ~/project/tinyusb\n    resource_class: << parameters.resource_class >>\n\n    steps:\n      - build:\n          build-system: << parameters.build-system >>\n          toolchain: << parameters.toolchain >>\n          family: << parameters.family >>\n          build-args: << parameters.build-args >>\n\n  # Build using VM\n  build-vm:\n    parameters:\n      resource_class:\n        type: string\n        default: large\n      build-system:\n        type: string\n      toolchain:\n        type: string\n      family:\n        type: string\n      build-args:\n        type: string\n        default: \"\"\n\n    machine:\n      image: ubuntu-2404:current\n    working_directory: ~/project/tinyusb\n    resource_class: << parameters.resource_class >>\n\n    steps:\n      - build:\n          build-system: << parameters.build-system >>\n          toolchain: << parameters.toolchain >>\n          family: << parameters.family >>\n          build-args: << parameters.build-args >>\n\n  # Aggregate code metrics from all builds\n  code-metrics:\n    docker:\n      - image: cimg/python:3.12\n    resource_class: large\n    steps:\n      - checkout\n      - attach_workspace:\n          at: /tmp\n\n      - run:\n          name: Aggregate Code Metrics\n          command: |\n            python tools/get_deps.py\n            # Combine all metrics files from all toolchain subdirectories\n            ls -R /tmp/metrics\n            if ls /tmp/metrics/*/*.json 1> /dev/null 2>&1; then\n              python tools/metrics.py combine -j -m -f tinyusb/src /tmp/metrics/*/*.json\n            else\n              echo \"No metrics files found\"\n              exit 1\n            fi\n\n      - store_artifacts:\n          path: metrics.json\n          destination: metrics.json\n\n      # Compare with base master metrics on PR branches\n      - when:\n          condition:\n            not:\n              equal: [ master, << pipeline.git.branch >> ]\n          steps:\n            - run:\n                name: Download Base Branch Metrics\n                command: |\n                  # Download metrics.json artifact from the latest successful build on master branch\n                  mkdir -p base-metrics\n                  # Use CircleCI API to get the latest artifact\n                  curl -s -L \"https://dl.circleci.com/api/v2/project/gh/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/latest/artifacts?branch=master&filter=successful\" \\\n                    -H \"Circle-Token: ${CIRCLE_TOKEN:-}\" | \\\n                    jq -r '.items[] | select(.path == \"metrics.json\") | .url' | \\\n                    head -1 | xargs -I {} curl -s -L -o base-metrics/metrics.json {} || true\n\n            - run:\n                name: Compare with Base Branch\n                command: |\n                  if [ -f base-metrics/metrics.json ]; then\n                    python tools/metrics.py compare -f tinyusb/src base-metrics/metrics.json metrics.json\n                    cat metrics_compare.md\n                  else\n                    echo \"No base metrics found, skipping comparison\"\n                    cp metrics.md metrics_compare.md\n                  fi\n\n            - store_artifacts:\n                path: metrics_compare.md\n                destination: metrics_compare.md\n\nworkflows:\n  build:\n    jobs:\n# The jobs below are populated dynamically by config.yml set-matrix job\n# Example entries that will be generated:\n#      - build:\n#          matrix:\n#            alias: build-cmake-arm-gcc\n#            parameters:\n#              toolchain: [ 'arm-gcc' ]\n#              build-system: [ 'cmake' ]\n#              family: [ 'nrf' ]\n#              resource_class: ['large']\n#      - code-metrics:\n#          requires:\n#            - build-cmake-arm-gcc\n"
  },
  {
    "path": ".clang-format",
    "content": "---\nLanguage: Cpp\nBasedOnStyle: LLVM\nAlignAfterOpenBracket: Align\nAlignConsecutiveAssignments:\n  Enabled: true\n  AcrossEmptyLines: false\n  AcrossComments: false\nAlignConsecutiveBitFields:\n  Enabled: true\n  AcrossEmptyLines: false\n  AcrossComments: false\nAlignConsecutiveDeclarations:\n  Enabled: true\n  AcrossEmptyLines: false\n  AcrossComments: false\nAlignConsecutiveMacros:\n  Enabled: true\n  AcrossEmptyLines: true\n  AcrossComments: false\nAlignConsecutiveShortCaseStatements:\n  Enabled: true\n  AcrossEmptyLines: true\n  AcrossComments: true\n  AlignCaseColons: false\nAlignEscapedNewlines: LeftWithLastLine\nAlignOperands: true\nAlignTrailingComments:\n  Kind: Always\n  OverEmptyLines: 2\nAllowAllArgumentsOnNextLine: false\nAllowAllConstructorInitializersOnNextLine: false\nAllowAllParametersOfDeclarationOnNextLine: false\nAllowShortBlocksOnASingleLine: Empty\nAllowShortCaseExpressionOnASingleLine: true\nAllowShortCaseLabelsOnASingleLine: false\nAllowShortEnumsOnASingleLine: false\nAllowShortFunctionsOnASingleLine: None\nAllowShortIfStatementsOnASingleLine: Never\nAlwaysBreakTemplateDeclarations: Yes\nBinPackArguments: true\nBreakBeforeBraces: Custom\nBraceWrapping:\n  AfterCaseLabel: false\n  AfterClass: false\n  AfterControlStatement: false\n  AfterEnum: false\n  AfterFunction: false\n  AfterNamespace: false\n  AfterStruct: false\n  AfterUnion: false\n  AfterExternBlock: false\n  BeforeCatch: true\n  BeforeElse: false\n  BeforeLambdaBody: false\n  BeforeWhile: false\n  SplitEmptyFunction: true\n  SplitEmptyRecord: true\n  SplitEmptyNamespace: true\nBracedInitializerIndentWidth: 2\nBreakBeforeBinaryOperators: None\nBreakConstructorInitializers: AfterColon\nBreakConstructorInitializersBeforeComma: false\nContinuationIndentWidth: 2\nColumnLimit: 120\nConstructorInitializerAllOnOneLineOrOnePerLine: false\nCpp11BracedListStyle: true\nIncludeBlocks: Preserve\nIncludeCategories:\n  - Regex: '^<.*'\n    Priority: 1\n  - Regex: '^\".*'\n    Priority: 2\n  - Regex: '.*'\n    Priority: 3\nIncludeIsMainRegex: '([-_](test|unittest))?$'\nIndentPPDirectives: BeforeHash\nInsertBraces: true\nIndentCaseLabels: true\nInsertNewlineAtEOF: true\nMacroBlockBegin: ''\nMacroBlockEnd: ''\nMaxEmptyLinesToKeep: 2\nNamespaceIndentation: All\nPenaltyBreakBeforeFirstCallParameter: 1000000\nPenaltyBreakOpenParenthesis: 1000000\nPPIndentWidth: 2\nQualifierAlignment: Custom\nQualifierOrder: ['static', 'const', 'volatile', 'restrict', 'type']\nSpaceAfterTemplateKeyword: false\nSpaceBeforeRangeBasedForLoopColon: false\nSpaceInEmptyParentheses: false\nSpacesInAngles: false\nSpacesInConditionalStatement: false\nSpacesInCStyleCastParentheses: false\nSpacesInParentheses: false\nSortIncludes: false\nTabWidth: 2\n...\n"
  },
  {
    "path": ".codespellrc",
    "content": "# See: https://github.com/codespell-project/codespell#using-a-config-file\n[codespell]\n# In the event of a false positive, add the problematic word, in all lowercase, to 'ignore-words.txt' (one word per line).\n# Or copy & paste the whole problematic line to 'exclude-file.txt'\nignore-words = tools/codespell/ignore-words.txt\nexclude-file = tools/codespell/exclude-file.txt\ncheck-filenames =\ncheck-hidden =\ncount =\nskip = *.rb,.cproject,.git,./lib,./examples/*/*/_build,./examples/*/*/ses,./examples/*/*/ozone,./hw/mcu,./tests_obsolete\n"
  },
  {
    "path": ".gitattributes",
    "content": "# Set the default behavior, in case people don't have core.autocrlf set.\n* text=auto\n\n*.c text\n*.cpp text\n*.h text\n*.icf text\n*.js text\n*.json text\n*.ld text\n*.md text\n*.mk text\n*.py text\n*.rst text\n*.s text\n*.txt text\n*.xml text\n*.yml text\n\nMakefile text\n\n# Windows-only Visual Studio things\n\n*.sln        text eol=crlf\n*.csproj     text eol=crlf\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: Bug Report\ndescription: Report a problem with TinyUSB\nlabels: 'Bug 🐞'\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report!\n        It's okay to leave some blank if it doesn't apply to your problem.\n\n  - type: dropdown\n    attributes:\n      label: Operating System\n      options:\n              - Linux\n              - MacOS\n              - RaspberryPi OS\n              - Windows 7\n              - Windows 10\n              - Windows 11\n              - Others\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Commit SHA\n      placeholder: e.g 3a042b37da28d0ba1e5593eb1068ca5645d77b56 or version bundled by esp-idf or pico-sdk\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Board\n      placeholder: e.g Adafruit Feather nRF52840 Express\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Firmware\n      placeholder: |\n        e.g examples/device/cdc_msc. If it is custom firmware, it is preferably compiled like one in example folder and reviewable for people to comment on. The easiest way is\n        - Fork this repo, checkout a new branch\n        - Add your-own-example based on stock one\n        - Push and post it here.\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: What happened ?\n      placeholder: A clear and concise description of what the bug is.\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: How to reproduce ?\n      placeholder: |\n        Exact steps in chronological order, details should be specific e.g if you use a command/script to test with, please post it as well.\n        1. Go to '...'\n        2. Click on '....'\n        3. See error\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Debug Log as txt file (LOG/CFG_TUSB_DEBUG=2)\n      placeholder: |\n        Attach your debug log txt file here, where the issue occurred, best with comments to explain the actual events.\n\n        Note1: Please DO NOT paste your lengthy log contents here since it hurts the readability.\n        Note2: To enable logging, add `LOG=2` to to the make command if building with stock examples or set `CFG_TUSB_DEBUG=2` in your tusb_config.h.\n        More information can be found at [example's readme](https://github.com/hathach/tinyusb/blob/master/docs/getting_started.md)\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Screenshots\n      description: If applicable, add screenshots to help explain your problem.\n    validations:\n      required: false\n\n  - type: checkboxes\n    attributes:\n      label: I have checked existing issues, discussion and documentation\n      description: You agree to check all the resources above before opening a new issue.\n      options:\n        - label: I confirm I have checked existing issues, discussion and documentation.\n          required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: TinyUSB Discussion\n    url: https://github.com/hathach/tinyusb/discussions\n    about: If you have other questions or need help, post it here.\n  - name: TinyUSB Docs\n    url: https://docs.tinyusb.org/\n    about: Online documentation\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: Feature Request\ndescription: Suggest an idea for this project\nlabels: 'Feature 💡'\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this request!\n        It's okay to leave some blank if it doesn't apply to your request.\n\n  - type: input\n    attributes:\n      label: Related area\n      description: Please briefly explain the area of your Feature Request.\n      placeholder: eg. new port support, device stack, class driver ...\n    validations:\n      required: true\n\n  - type: input\n    attributes:\n      label: Hardware specification\n      description: Please provide if your proposal depends on specific Hardware.\n      placeholder: eg. rp2040, samd51 ...\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Is your feature request related to a problem?\n      description: Please provide a clear and concise description of what the problem is. Add relevant issue link.\n      placeholder: ex. I'm facing the issue/missing function...\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: Describe the solution you'd like\n      description: Please provide a clear and concise description of what you want to happen.\n      placeholder: ex. When using this function...\n    validations:\n      required: true\n\n  - type: checkboxes\n    attributes:\n      label: I have checked existing issues, dicussion and documentation\n      description: You agree to check all the resources above before opening a new issue.\n      options:\n        - label: I confirm I have checked existing issues, dicussion and documentation.\n          required: true\n"
  },
  {
    "path": ".github/actions/get_deps/action.yml",
    "content": "name: Get dependencies\n\ninputs:\n  arg:\n    description: 'Arguments to get_deps.py'\n    required: true\n\nruns:\n  using: \"composite\"\n  steps:\n    - name: Checkout pico-sdk for rp2040\n      if: >-\n        contains(inputs.arg, 'rp2040') ||\n        contains(inputs.arg, 'rp2350') ||\n        contains(inputs.arg, 'raspberry_pi_pico') ||\n        contains(inputs.arg, 'adafruit_fruit_jam')\n      uses: actions/checkout@v6\n      with:\n        repository: raspberrypi/pico-sdk\n        ref: master\n        path: pico-sdk\n\n    - name: Linux dependencies\n      if: runner.os == 'Linux'\n      run: |\n        NINJA_URL=https://github.com/ninja-build/ninja/releases/download/v1.13.1/ninja-linux.zip\n        wget $NINJA_URL -O ninja-linux.zip\n        unzip ninja-linux.zip -d ninja-bin\n        pip install membrowse\n        echo >> $GITHUB_PATH \"${{ github.workspace }}/ninja-bin\"\n      shell: bash\n\n    - name: Get Dependencies\n      env:\n        ARG: ${{ inputs.arg }}\n      run: |\n        python3 tools/get_deps.py ${ARG}\n        echo \"PICO_SDK_PATH=${{ github.workspace }}/pico-sdk\" >> $GITHUB_ENV\n      shell: bash\n"
  },
  {
    "path": ".github/actions/setup_toolchain/action.yml",
    "content": "name: Setup Toolchain\n\ninputs:\n  toolchain:\n    description: 'Toolchain name'\n    required: true\n\noutputs:\n  build_option:\n    description: 'Build option for the toolchain e.g --toolchain clang'\n    value: ${{ steps.set-toolchain-option.outputs.build_option }}\n\nruns:\n  using: \"composite\"\n  steps:\n    - name: Pull ESP-IDF docker\n      if: inputs.toolchain == 'esp-idf'\n      uses: ./.github/actions/setup_toolchain/espressif\n      with:\n        toolchain: ${{ inputs.toolchain }}\n\n    - name: Get Toolchain URL\n      if: inputs.toolchain != 'esp-idf'\n      id: set-toolchain-url\n      env:\n        TOOLCHAIN: ${{ inputs.toolchain }}\n      run: |\n        TOOLCHAIN_URL=$(jq -r --arg tc \"$TOOLCHAIN\" '.[$tc]' .github/actions/setup_toolchain/toolchain.json)\n        echo \"toolchain_url=$TOOLCHAIN_URL\"\n        echo \"toolchain_url=$TOOLCHAIN_URL\" >> $GITHUB_OUTPUT\n      shell: bash\n\n    - name: Download Toolchain\n      if: inputs.toolchain != 'esp-idf'\n      uses: ./.github/actions/setup_toolchain/download\n      with:\n        toolchain: ${{ inputs.toolchain }}\n        toolchain_url: ${{ steps.set-toolchain-url.outputs.toolchain_url }}\n\n    - name: Set toolchain option\n      id: set-toolchain-option\n      env:\n        TOOLCHAIN: ${{ inputs.toolchain }}\n      run: |\n          BUILD_OPTION=\"\"\n          if [[ \"$TOOLCHAIN\" == *\"clang\"* ]]; then\n            BUILD_OPTION=\"--toolchain clang\"\n          elif [[ \"$TOOLCHAIN\" == \"arm-iar\" ]]; then\n            BUILD_OPTION=\"--toolchain iar\"\n          fi\n          echo \"build_option=$BUILD_OPTION\"\n          echo \"build_option=$BUILD_OPTION\" >> $GITHUB_OUTPUT\n      shell: bash\n"
  },
  {
    "path": ".github/actions/setup_toolchain/download/action.yml",
    "content": "name: Download Toolchain\n\ninputs:\n  toolchain:\n    description: 'Toolchain name'\n    required: true\n  toolchain_url:\n    description: 'Toolchain URL'\n    required: true\n\nruns:\n  using: \"composite\"\n  steps:\n    - name: Cache Toolchain\n      if: ${{ !startsWith(inputs.toolchain_url, 'https://github.com') }}\n      uses: actions/cache@v5\n      id: cache-toolchain-download\n      with:\n        path: ~/cache/${{ inputs.toolchain }}\n        key: ${{ runner.os }}-${{ inputs.toolchain }}-${{ inputs.toolchain_url }}\n\n    - name: Install Toolchain\n      if: steps.cache-toolchain-download.outputs.cache-hit != 'true'\n      env:\n        TOOLCHAIN: ${{ inputs.toolchain }}\n        TOOLCHAIN_URL: ${{ inputs.toolchain_url }}\n      run: |\n        mkdir -p ~/cache/${TOOLCHAIN}\n        FILE_EXT=\"${TOOLCHAIN_URL##*.}\"\n\n        if [[ ${TOOLCHAIN} == rx-gcc ]]; then\n          wget --progress=dot:giga ${TOOLCHAIN_URL} -O toolchain.run\n          chmod +x toolchain.run\n          ./toolchain.run -p ~/cache/${TOOLCHAIN}/gnurx -y\n        elif [[ ${TOOLCHAIN} == ft9xx-gcc ]]; then\n          wget --progress=dot:giga ${TOOLCHAIN_URL} -O ~/cache/${TOOLCHAIN}/ft9xxtoolchain.deb\n        elif [[ ${TOOLCHAIN} == arm-iar ]]; then\n          wget --progress=dot:giga https://netstorage.iar.com/FileStore/STANDARD/001/003/926/iar-lmsc-tools_1.8_amd64.deb -O ~/cache/${TOOLCHAIN}/iar-lmsc-tools.deb\n          wget --progress=dot:giga ${TOOLCHAIN_URL} -O ~/cache/${TOOLCHAIN}/cxarm.deb\n        elif [[ ${FILE_EXT} == zip ]]; then\n          curl -L \"$TOOLCHAIN_URL\" -o toolchain.zip\n          unzip -q toolchain.zip -d ~/cache/${TOOLCHAIN}\n          ~/cache/${TOOLCHAIN}/xpack-arm-none-eabi-gcc-14.2.1-1.1/bin/arm-none-eabi-gcc.exe --version\n        elif [[ ${FILE_EXT} == gz ]]; then\n          wget --progress=dot:giga ${TOOLCHAIN_URL} -O toolchain.tar.gz\n          tar -C ~/cache/${TOOLCHAIN} -xaf toolchain.tar.gz\n        else\n          echo \"Unsupported toolchain file extension: ${FILE_EXT}\"\n          exit 1\n        fi\n      shell: bash\n\n    - name: Setup Toolchain\n      env:\n        TOOLCHAIN: ${{ inputs.toolchain }}\n      run: |\n        if [[ ${TOOLCHAIN} == arm-iar ]]; then\n          sudo dpkg -i ~/cache/${TOOLCHAIN}/iar-lmsc-tools.deb\n          sudo apt install -y ~/cache/${TOOLCHAIN}/cxarm.deb\n          TOOLCHAIN_PATH=\"/opt/iar/cxarm/arm/bin\"\n        elif [[ ${TOOLCHAIN} == ft9xx-gcc ]]; then\n          sudo apt install -y ~/cache/${TOOLCHAIN}/ft9xxtoolchain.deb\n          TOOLCHAIN_PATH=\"/opt/ft32/bin\"\n        else\n          # Find the single toolchain bin directory\n          TOOLCHAIN_BIN_DIRS=(~/cache/${TOOLCHAIN}/*/bin)\n          if [[ ${#TOOLCHAIN_BIN_DIRS[@]} -ne 1 ]]; then\n            echo \"Error: Expected exactly one toolchain bin directory, found ${#TOOLCHAIN_BIN_DIRS[@]}\"\n            exit 1\n          fi\n          TOOLCHAIN_PATH=\"${TOOLCHAIN_BIN_DIRS[0]}\"\n        fi\n        # Convert to native path for Windows compatibility\n        if [[ \"$RUNNER_OS\" == \"Windows\" ]]; then\n          TOOLCHAIN_PATH=$(cygpath -w \"$TOOLCHAIN_PATH\")\n        fi\n        echo \"$TOOLCHAIN_PATH\" >> $GITHUB_PATH\n      shell: bash\n"
  },
  {
    "path": ".github/actions/setup_toolchain/espressif/action.yml",
    "content": "name: Setup ESP-IDF Toolchain\n\ninputs:\n  toolchain:\n    description: 'Toolchain name'\n    required: true\n  toolchain_version:\n    description: 'Toolchain version'\n    required: false\n    default: 'v5.5.3'\n\nruns:\n  using: \"composite\"\n  steps:\n    - name: Set DOCKER_ESP_IDF\n      env:\n        TOOLCHAIN: ${{ inputs.toolchain }}\n      run: |\n        DOCKER_ESP_IDF=$HOME/cache/${TOOLCHAIN}/docker_image.tar\n        echo \"DOCKER_ESP_IDF=$DOCKER_ESP_IDF\" >> $GITHUB_ENV\n      shell: bash\n\n    - name: Cache Docker Image\n      uses: actions/cache@v5\n      id: cache-toolchain-espressif\n      with:\n        path: ${{ env.DOCKER_ESP_IDF }}\n        key: ${{ inputs.toolchain }}-${{ inputs.toolchain_version }}\n\n    - name: Pull and Save Docker Image\n      if: steps.cache-toolchain-espressif.outputs.cache-hit != 'true'\n      env:\n        TOOLCHAIN_VERSION: ${{ inputs.toolchain_version }}\n      run: |\n        docker pull espressif/idf:${TOOLCHAIN_VERSION}\n        mkdir -p $(dirname $DOCKER_ESP_IDF)\n        docker save -o $DOCKER_ESP_IDF espressif/idf:${TOOLCHAIN_VERSION}\n        du -sh $DOCKER_ESP_IDF\n      shell: bash\n\n    - name: Load Docker Image\n      if: steps.cache-toolchain-espressif.outputs.cache-hit == 'true'\n      run: |\n        du -sh $DOCKER_ESP_IDF\n        docker load --input $DOCKER_ESP_IDF\n      shell: bash\n\n    - name: Tag Local Image\n      env:\n        TOOLCHAIN_VERSION: ${{ inputs.toolchain_version }}\n      run: |\n        docker tag espressif/idf:${TOOLCHAIN_VERSION} espressif/idf:tinyusb\n        docker images\n      shell: bash\n"
  },
  {
    "path": ".github/actions/setup_toolchain/toolchain.json",
    "content": "{\n  \"aarch64-gcc\": \"https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf.tar.xz\",\n  \"arm-clang\": \"https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm/releases/download/release-19.1.1/LLVM-ET-Arm-19.1.1-Linux-x86_64.tar.xz\",\n  \"arm-gcc\": \"https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v14.2.1-1.1/xpack-arm-none-eabi-gcc-14.2.1-1.1-linux-x64.tar.gz\",\n  \"ft9xx-gcc\": \"https://github.com/Bridgetek/ft32-toolchain-linux/releases/download/v2.7.6/ft9xxtoolchain_2.7.6_amd64.deb\",\n  \"arm-gcc-macos-latest\": \"https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v14.2.1-1.1/xpack-arm-none-eabi-gcc-14.2.1-1.1-darwin-arm64.tar.gz\",\n  \"arm-gcc-windows-latest\": \"https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v14.2.1-1.1/xpack-arm-none-eabi-gcc-14.2.1-1.1-win32-x64.zip\",\n  \"msp430-gcc\": \"http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPGCC/9_2_0_0/export/msp430-gcc-9.2.0.50_linux64.tar.bz2\",\n  \"riscv-gcc\": \"https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz\",\n  \"rx-gcc\": \"https://github.com/hathach/rx_device/releases/download/0.0.1/gcc-8.3.0.202411-GNURX-ELF.run\",\n  \"arm-iar\": \"https://netstorage.iar.com/FileStore/STANDARD/001/003/723/cxarm-9.70.1.deb\"\n}\n"
  },
  {
    "path": ".github/membrowse_pr_message.j2",
    "content": "{#- Top 10 targets with biggest memory changes + project dashboard link -#}\n{% set section_columns = ['.text', '.rodata', '.data', '.bss'] -%}\n{#- --- Compute per-target total absolute delta and collect changed targets --- -#}\n{% set changed = [] -%}\n{% for target in targets -%}\n{% if target.has_changes -%}\n{% set ns = namespace(total_delta=0, total_current=0) -%}\n{% for region in target.regions -%}\n{% set ns.total_delta = ns.total_delta + region.delta -%}\n{% set ns.total_current = ns.total_current + region.used_size -%}\n{% endfor -%}\n{% set total_old = ns.total_current - ns.total_delta -%}\n{% set pct = (ns.total_delta / total_old * 100) if total_old > 0 else 0 -%}\n{% set abs_pct = (ns.total_delta | abs) if total_old == 0 else (pct | abs) -%}\n{% set _ = changed.append({'target': target, 'total_current': ns.total_current, 'total_old': total_old, 'total_delta': ns.total_delta, 'pct': pct, 'abs_pct': abs_pct}) -%}\n{% endif -%}\n{% endfor -%}\n{#- --- Sort by absolute percentage change descending and take top 10 --- -#}\n{% set sorted_changed = changed | sort(attribute='abs_pct', reverse=true) -%}\n{% set top10 = sorted_changed[:10] -%}\n{#- --- Render --- -#}\n{% if top10 %}\n### Top {{ top10 | length }} targets by memory change (%) (out of {{ targets | length }} targets) {% if dashboard_url %} [View Project Dashboard →]({{ dashboard_url }}){% endif %}\n\n| target | .text | .rodata | .data | .bss | total | % diff |\n|--------|-------|---------|-------|------|-------|--------|\n{% for info in top10 -%}\n{% set target = info.target -%}\n{% set section_map = {} -%}\n{% for section in target.sections -%}\n{% set _ = section_map.update({section.name: section}) -%}\n{% endfor -%}\n| {% if target.comparison_url %}[{{ target.name }}]({{ target.comparison_url }}){% else %}{{ target.name }}{% endif %} |\n{%- for col in section_columns %} {% if col in section_map %}{{ \"{:,}\".format(section_map[col].old.size) }} → {{ \"{:,}\".format(section_map[col].size) }} ({{ section_map[col].delta_str }}){% else %}—{% endif %} |{% endfor %} {{ \"{:,}\".format(info.total_old) }} → {{ \"{:,}\".format(info.total_current) }} ({% if info.total_delta >= 0 %}+{{ \"{:,}\".format(info.total_delta) }}{% else %}{{ \"{:,}\".format(info.total_delta) }}{% endif %}) | {% if info.total_old > 0 %}{% if info.pct >= 0 %}+{% endif %}{{ \"%.1f\" | format(info.pct) }}%{% else %}N/A{% endif %} |\n{% endfor %}\n{% else %}\nNo memory changes detected across {{ targets | length }} target{{ 's' if targets | length != 1 else '' }}.{% if dashboard_url %} [View Project Dashboard →]({{ dashboard_url }}){% endif %}\n{% endif -%}\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\non:\n  workflow_dispatch:\n  push:\n    branches: [master]\n  pull_request:\n  release:\n    types: [ published ]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\nenv:\n  HIL_JSON: test/hil/tinyusb.json\n\njobs:\n  # Check if the code changes and we need to run ci build\n  # Cannot use paths filter in the on-event since we want this workflow to run even when there are no code changes, to register the commit chain\n  check-paths:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      pull-requests: read\n    outputs:\n      code_changed: ${{ steps.filter.outputs.code }}\n    steps:\n      - uses: actions/checkout@v6\n        with:\n          fetch-depth: 2  # Needed for push commit comparison\n      - uses: dorny/paths-filter@v4\n        id: filter\n        with:\n          filters: |\n            code:\n              - 'src/**'\n              - 'examples/**'\n              - 'lib/**'\n              - 'hw/**'\n              - 'test/hil/**'\n              - 'tools/build.py'\n              - 'tools/get_deps.py'\n              - '.github/actions/**'\n              - '.github/workflows/build.yml'\n              - '.github/workflows/build_util.yml'\n              - '.github/workflows/ci_set_matrix.py'\n\n  set-matrix:\n    runs-on: ubuntu-latest\n    outputs:\n      json: ${{ steps.set-matrix-json.outputs.matrix }}\n      hil_json: ${{ steps.set-matrix-json.outputs.hil_matrix }}\n    steps:\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n\n      - name: Generate matrix json\n        id: set-matrix-json\n        run: |\n          # build matrix\n          MATRIX_JSON=$(python .github/workflows/ci_set_matrix.py)/\n          echo \"matrix=$MATRIX_JSON\"\n          echo \"matrix=$MATRIX_JSON\" >> $GITHUB_OUTPUT\n          # hil matrix\n          HIL_MATRIX_JSON=$(python test/hil/hil_ci_set_matrix.py ${{ env.HIL_JSON }})\n          echo \"hil_matrix=$HIL_MATRIX_JSON\"\n          echo \"hil_matrix=$HIL_MATRIX_JSON\" >> $GITHUB_OUTPUT\n\n  # ------------------------------------------------------------------------------\n  # CMake build: only one board per family (first alphabetically). Full build is done by CircleCI in PR\n  # Note:\n  # For Make and IAR build: will be done on CircleCI only (one random per family as well)\n  # ------------------------------------------------------------------------------\n  cmake:\n    needs: [ check-paths, set-matrix ]\n    uses: ./.github/workflows/build_util.yml\n    strategy:\n      fail-fast: false\n      matrix:\n        toolchain:\n          - 'aarch64-gcc'\n          #- 'arm-clang'\n          - 'arm-gcc'\n          #- 'esp-idf'\n          - 'ft9xx-gcc'\n          - 'msp430-gcc'\n          - 'riscv-gcc'\n    with:\n      build-system: 'cmake'\n      toolchain: ${{ matrix.toolchain }}\n      build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain]) }}\n      build-options: '--one-first'\n      upload-metrics: true\n      upload-artifacts: false\n      upload-membrowse: true\n      code-changed: ${{ needs.check-paths.outputs.code_changed == 'true' }}\n    secrets: inherit\n\n  code-metrics:\n    needs: [ check-paths, cmake ]\n    if: needs.check-paths.outputs.code_changed == 'true'\n    runs-on: ubuntu-latest\n    permissions:\n      pull-requests: write\n      contents: write\n    steps:\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n        with:\n          fetch-tags: ${{ github.event_name == 'release' }}\n\n      - name: Download Artifacts\n        uses: actions/download-artifact@v5\n        with:\n          pattern: metrics-*\n          path: cmake-build\n          merge-multiple: true\n\n      - name: Aggregate Code Metrics\n        run: |\n          python tools/get_deps.py\n          python tools/metrics.py combine -j -m -f tinyusb/src cmake-build/*/metrics.json\n\n      - name: Upload Metrics Artifact\n        if: github.event_name == 'push' || github.event_name == 'release'\n        uses: actions/upload-artifact@v7\n        with:\n          name: metrics-tinyusb\n          path: metrics.json\n\n      - name: Download Base Branch Metrics\n        if: github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'\n        uses: dawidd6/action-download-artifact@v11\n        with:\n          workflow: build.yml\n          workflow_conclusion: ''\n          branch: ${{ github.base_ref }}\n          name: metrics-tinyusb\n          path: base-metrics\n        continue-on-error: true\n\n      - name: Download Previous Release Asset\n        if: github.event_name == 'release'\n        env:\n          GH_TOKEN: ${{ github.token }}\n        run: |\n          PREV_TAG=$(git tag --sort=-creatordate | head -n 2 | tail -n 1)\n          echo \"Previous Release: $PREV_TAG\"\n          echo \"PREV_TAG=$PREV_TAG\" >> $GITHUB_ENV\n\n          mkdir -p base-metrics\n          gh release download $PREV_TAG -p metrics.json -D base-metrics || echo \"No metrics.json found in $PREV_TAG release\"\n\n      - name: Compare with Base Branch\n        if: github.event_name != 'push'\n        run: |\n          if [ -f base-metrics/metrics.json ]; then\n            python tools/metrics.py compare -m -f tinyusb/src base-metrics/metrics.json metrics.json\n            cat metrics_compare.md\n          else\n            echo \"No base metrics found, skipping comparison\"\n            cp metrics.md metrics_compare.md\n          fi\n\n      - name: Upload Release Assets\n        if: github.event_name == 'release'\n        env:\n          GH_TOKEN: ${{ github.token }}\n        run: |\n          CURR_TAG=${{ github.event.release.tag_name }}\n          COMPARE_FILE=\"metrics_compare_${CURR_TAG}-${PREV_TAG}.md\"\n          mv metrics_compare.md $COMPARE_FILE\n          gh release upload $CURR_TAG metrics.json $COMPARE_FILE\n\n      - name: Save PR number\n        if: github.event_name == 'pull_request'\n        run: echo ${{ github.event.number }} > pr_number.txt\n\n      - name: Upload Metrics Comment Artifact\n        if: github.event_name == 'pull_request'\n        uses: actions/upload-artifact@v7\n        with:\n          name: metrics-comment\n          path: |\n            metrics_compare.md\n            metrics.json\n            pr_number.txt\n\n      - name: Post Code Metrics as PR Comment\n        if: (github.event_name == 'workflow_dispatch') || (github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == false)\n        uses: marocchino/sticky-pull-request-comment@v2\n        with:\n          header: code-metrics\n          path: metrics_compare.md\n\n  # ---------------------------------------\n  # Build Make/CMake on Windows/MacOS\n  # ---------------------------------------\n  build-os:\n    needs: [ check-paths ]\n    if: needs.check-paths.outputs.code_changed == 'true'\n    uses: ./.github/workflows/build_util.yml\n    strategy:\n      fail-fast: false\n      matrix:\n        os: [ windows-latest, macos-latest ]\n        build-system: [ 'make', 'cmake' ]\n    with:\n      os: ${{ matrix.os }}\n      build-system: ${{ matrix.build-system }}\n      toolchain: 'arm-gcc-${{ matrix.os }}'\n      build-args: '[\"stm32h7rs\"]'\n      build-options: '--one-random'\n\n  # ---------------------------------------\n  # Zephyr\n  # ---------------------------------------\n  zephyr:\n    needs: [ check-paths ]\n    # skip zephyr build due to failed build, fix later\n    if: false\n    #if: needs.check-paths.outputs.code_changed == 'true'\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n\n      - name: Setup Zephyr project\n        uses: zephyrproject-rtos/action-zephyr-setup@v1\n        with:\n          app-path: examples\n          toolchains: arm-zephyr-eabi\n\n      - name: Build\n        run: |\n          west build -b nrf52840dk -d examples/device/cdc_msc/build examples/device/cdc_msc -- -DRTOS=zephyr\n          west build -b nrf52840dk -d examples/device/msc_dual_lun/build examples/device/msc_dual_lun -- -DRTOS=zephyr\n\n  # ---------------------------------------\n  # Hardware in the loop (HIL)\n  # Run on PR only (hil-tinyusb), hil-hfp only run on non-forked PR\n  # ---------------------------------------\n  hil-build:\n    needs: [ check-paths, set-matrix ]\n    if: needs.check-paths.outputs.code_changed == 'true' && github.repository_owner == 'hathach'\n    uses: ./.github/workflows/build_util.yml\n    strategy:\n      fail-fast: false\n      matrix:\n        toolchain:\n          - 'arm-gcc'\n          - 'esp-idf'\n    with:\n      build-system: 'cmake'\n      toolchain: ${{ matrix.toolchain }}\n      build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.hil_json)[matrix.toolchain]) }}\n      upload-artifacts: true\n\n  # ---------------------------------------\n  # Hardware in the loop (HIL)\n  # self-hosted on local VM, for attached hardware checkout HIL_JSON\n  # ---------------------------------------\n  hil-tinyusb:\n    needs: hil-build\n    runs-on: [ self-hosted, X64, hathach, hardware-in-the-loop ]\n    steps:\n      - name: Get Skip Boards from previous run\n        if: github.run_attempt != '1'\n        run: |\n          if [ -f \"${{ env.HIL_JSON }}.skip\" ]; then\n            SKIP_BOARDS=$(cat \"${{ env.HIL_JSON }}.skip\")\n          else\n            SKIP_BOARDS=\"\"\n          fi\n          echo \"SKIP_BOARDS=$SKIP_BOARDS\"\n          echo \"SKIP_BOARDS=$SKIP_BOARDS\" >> $GITHUB_ENV\n\n      - name: Clean workspace\n        run: |\n          echo \"Cleaning up for the first run\"\n          rm -rf \"${{ github.workspace }}\"\n          mkdir -p \"${{ github.workspace }}\"\n\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n\n      - name: Download Artifacts\n        uses: actions/download-artifact@v5\n        with:\n          pattern: binaries-*\n          path: cmake-build\n          merge-multiple: true\n\n      - name: Test on actual hardware\n        run: |\n          python3 test/hil/hil_test.py ${{ env.HIL_JSON }} $SKIP_BOARDS || \\\n          (if [ -f \"${{ env.HIL_JSON }}.skip\" ]; then\n            SKIP_BOARDS=$(cat \"${{ env.HIL_JSON }}.skip\")\n            echo \"Re-running with SKIP_BOARDS=$SKIP_BOARDS\"\n            python3 test/hil/hil_test.py ${{ env.HIL_JSON }} $SKIP_BOARDS\n          else\n            exit 1\n          fi)\n\n  # ---------------------------------------\n  # Hardware in the loop (HIL)\n  # self-hosted by HFP, build with IAR toolchain, for attached hardware checkout test/hil/hfp.json\n  # Since IAR Token secret is not passed to forked PR, only build non-forked PR\n  # ---------------------------------------\n  hil-hfp:\n    needs: [ check-paths ]\n    if: |\n      needs.check-paths.outputs.code_changed == 'true' &&\n      github.repository_owner == 'hathach' &&\n      !(github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork == true)\n    runs-on: [ self-hosted, Linux, X64, hifiphile ]\n    env:\n      IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}\n    steps:\n      - name: Clean workspace\n        run: |\n          echo \"Cleaning up previous run\"\n          rm -rf \"${{ github.workspace }}\"3\n          mkdir -p \"${{ github.workspace }}\"\n\n      - name: Toolchain version\n        run: |\n          iccarm --version\n\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n\n      - name: Get build boards\n        run: |\n          MATRIX_JSON=$(python test/hil/hil_ci_set_matrix.py test/hil/hfp.json)\n          BUILD_ARGS=$(echo $MATRIX_JSON | jq -r '.[\"arm-gcc\"] | join(\" \")')\n          echo \"BUILD_ARGS=$BUILD_ARGS\"\n          echo \"BUILD_ARGS=$BUILD_ARGS\" >> $GITHUB_ENV\n\n      - name: Get Dependencies\n        run: python3 tools/get_deps.py $BUILD_ARGS\n\n      - name: Build\n        run: python3 tools/build.py --toolchain iar $BUILD_ARGS\n\n      - name: Test on actual hardware (hardware in the loop)\n        run: python3 test/hil/hil_test.py hfp.json\n"
  },
  {
    "path": ".github/workflows/build_util.yml",
    "content": "name: Reusable build util\n\non:\n  workflow_call:\n    inputs:\n      os:\n        required: false\n        type: string\n        default: 'ubuntu-latest'\n      build-system:\n        required: true\n        type: string\n      toolchain:\n        required: true\n        type: string\n      build-args:\n        required: true\n        type: string\n      build-options:\n        required: false\n        default: ''\n        type: string\n      upload-artifacts:\n        required: false\n        default: false\n        type: boolean\n      upload-metrics:\n        required: false\n        default: false\n        type: boolean\n      upload-membrowse:\n        required: false\n        default: false\n        type: boolean\n      code-changed:\n        required: false\n        default: true\n        type: boolean\n\njobs:\n  family:\n    runs-on: ${{ inputs.os }}\n    strategy:\n      fail-fast: false\n      matrix:\n        arg: ${{ fromJSON(inputs.build-args) }}\n    steps:\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: ${{ !inputs.upload-membrowse && 1 || 0 }}\n\n      - name: Setup Toolchain\n        id: setup-toolchain\n        uses: ./.github/actions/setup_toolchain\n        with:\n          toolchain: ${{ inputs.toolchain }}\n\n      - name: Get Dependencies\n        uses: ./.github/actions/get_deps\n        with:\n          arg: ${{ matrix.arg }}\n\n      - name: Build\n        if: ${{ inputs.code-changed }}\n        env:\n          IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}\n        run: |\n          if [ \"${{ inputs.toolchain }}\" == \"esp-idf\" ]; then\n            docker run --rm -e MEMBROWSE_API_KEY=\"$MEMBROWSE_API_KEY\" -v $PWD:/project -w /project espressif/idf:tinyusb python tools/build.py --target all ${{ matrix.arg }}\n          else\n            BUILD_PY_ARGS=\"-s ${{ inputs.build-system }} ${{ steps.setup-toolchain.outputs.build_option }} ${{ inputs.build-options }} --target all\"\n            if [ \"${{ inputs.upload-metrics }}\" = \"true\" ]; then\n              BUILD_PY_ARGS=\"$BUILD_PY_ARGS --target tinyusb_metrics\"\n            fi\n            python tools/build.py $BUILD_PY_ARGS ${{ matrix.arg }}\n          fi\n        shell: bash\n\n      - name: Membrowse Upload\n        if: inputs.toolchain != 'esp-idf' && inputs.upload-membrowse == true\n        continue-on-error: true\n        env:\n          MEMBROWSE_API_KEY: ${{ secrets.MEMBROWSE_API_KEY }}\n        run: |\n          # if code-changed is false --> there is no elf -> membrowse target upload with --identical flag\n          BUILD_PY_ARGS=\"-s ${{ inputs.build-system }} ${{ steps.setup-toolchain.outputs.build_option }} ${{ inputs.build-options }}\"\n          python tools/build.py $BUILD_PY_ARGS --target examples-membrowse-upload -j 1 ${{ matrix.arg }}\n        shell: bash\n\n      - name: Upload Artifacts for Metrics\n        if: inputs.upload-metrics == true && inputs.code-changed == true\n        uses: actions/upload-artifact@v7\n        with:\n          name: metrics-${{ matrix.arg }}\n          path: cmake-build/cmake-build-*/metrics.json\n\n      - name: Upload Artifacts for Hardware Testing\n        if: inputs.upload-artifacts == true && inputs.code-changed == true\n        uses: actions/upload-artifact@v7\n        with:\n          name: binaries-${{ matrix.arg }}\n          path: |\n            cmake-build/cmake-build-*/*/*/*.elf\n            cmake-build/cmake-build-*/*/*/*.bin\n            cmake-build/cmake-build-*/*/*/*.bin\n            cmake-build/cmake-build-*/*/*/bootloader/bootloader.bin\n            cmake-build/cmake-build-*/*/*/partition_table/partition-table.bin\n            cmake-build/cmake-build-*/*/*/config.env\n            cmake-build/cmake-build-*/*/*/flash_args\n            cmake-build/hw/mcu/**/*.ld\n"
  },
  {
    "path": ".github/workflows/ci_set_matrix.py",
    "content": "#!/usr/bin/env python3\nimport json\n\n# toolchain, url\ntoolchain_list = [\n    \"aarch64-gcc\",\n    \"arm-clang\",\n    \"arm-iar\",\n    \"arm-gcc\",\n    \"esp-idf\",\n    \"ft9xx-gcc\",\n    \"msp430-gcc\",\n    \"riscv-gcc\",\n    \"rx-gcc\"\n]\n\n# family: [supported toolchain]\nfamily_list = {\n    \"at32f402_405\": [\"arm-gcc\"],\n    \"at32f403a_407\": [\"arm-gcc\"],\n    \"at32f413\": [\"arm-gcc\"],\n    \"at32f415\": [\"arm-gcc\"],\n    \"at32f423\": [\"arm-gcc\"],\n    \"at32f425\": [\"arm-gcc\"],\n    \"at32f435_437\": [\"arm-gcc\"],\n    \"at32f45x\": [\"arm-gcc\"],\n    \"broadcom_32bit\": [\"arm-gcc\"],\n    \"broadcom_64bit\": [\"aarch64-gcc\"],\n    \"ch32f20x\": [\"arm-gcc\"],\n    \"ch32v10x\": [\"riscv-gcc\"],\n    \"ch32v20x\": [\"riscv-gcc\"],\n    \"ch32v30x\": [\"riscv-gcc\"],\n    \"da1469x\": [\"arm-gcc\"],\n    \"fomu\": [\"riscv-gcc\"],\n    \"ft9xx\": [\"ft9xx-gcc\"],\n    \"gd32vf103\": [\"riscv-gcc\"],\n    \"hpmicro\": [\"riscv-gcc\"],\n    \"imxrt\": [\"arm-gcc\", \"arm-clang\"],\n    \"kinetis_k\": [\"arm-gcc\"],\n    \"kinetis_k32l\": [\"arm-gcc\"],\n    \"kinetis_kl\": [\"arm-gcc\"],\n    \"lpc11\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc13\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc15\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc17\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc18\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc40\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc43\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc51\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc54\": [\"arm-gcc\", \"arm-clang\"],\n    \"lpc55\": [\"arm-gcc\", \"arm-clang\"],\n    \"maxim\": [\"arm-gcc\"],\n    \"mcx\": [\"arm-gcc\"],\n    \"mm32\": [\"arm-gcc\"],\n    \"msp430\": [\"msp430-gcc\"],\n    \"msp432e4\": [\"arm-gcc\"],\n    \"nrf\": [\"arm-gcc\", \"arm-clang\"],\n    \"nuc100_120\": [\"arm-gcc\"],\n    \"nuc121_125\": [\"arm-gcc\"],\n    \"nuc126\": [\"arm-gcc\"],\n    \"nuc505\": [\"arm-gcc\"],\n    \"ra\": [\"arm-gcc\"],\n    \"rp2040\": [\"arm-gcc\"],\n    \"rw61x\": [\"arm-gcc\"],\n    \"rx\": [\"rx-gcc\"],\n    \"samd11\": [\"arm-gcc\", \"arm-clang\"],\n    \"samd2x_l2x\": [\"arm-gcc\", \"arm-clang\"],\n    \"samd5x_e5x\": [\"arm-gcc\", \"arm-clang\"],\n    \"samg\": [\"arm-gcc\", \"arm-clang\"],\n    \"stm32c0\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32f0\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32f1\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32f2\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32f3\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32f4\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32f7\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32g0\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32g4\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32h5\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32h7\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32h7rs\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32l0\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32l4\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32n6\": [\"arm-gcc\"],\n    \"stm32u0\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32u5\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32wb\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"stm32wba\": [\"arm-gcc\", \"arm-clang\", \"arm-iar\"],\n    \"tm4c\": [\"arm-gcc\"],\n    \"xmc4000\": [\"arm-gcc\"],\n    # S3, P4 will be built by hil test\n    # \"-bespressif_s3_devkitm\": [\"esp-idf\"],\n    # \"-bespressif_p4_function_ev\": [\"esp-idf\"],\n}\n\n\ndef set_matrix_json():\n    matrix = {}\n    for toolchain in toolchain_list:\n        filtered_families = [family for family, supported_toolchain in family_list.items() if\n                             toolchain in supported_toolchain]\n        matrix[toolchain] = filtered_families\n\n    print(json.dumps(matrix))\n\n\nif __name__ == '__main__':\n    set_matrix_json()\n"
  },
  {
    "path": ".github/workflows/cifuzz.yml",
    "content": "name: CIFuzz\non:\n  workflow_dispatch:\n  pull_request:\n    branches:\n      - master\n    paths:\n      - '**.c'\n      - '**.cc'\n      - '**.cpp'\n      - '**.cxx'\n      - '**.h'\njobs:\n Fuzzing:\n   runs-on: ubuntu-latest\n   steps:\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: 'tinyusb'\n       language: c++\n\n   - name: Run Fuzzers\n     uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master\n     with:\n       oss-fuzz-project-name: 'tinyusb'\n       language: c++\n       fuzz-seconds: 400\n\n   - name: Upload Crash\n     uses: actions/upload-artifact@v7\n     if: failure() && steps.build.outcome == 'success'\n     with:\n       name: artifacts\n       path: ./out/artifacts\n"
  },
  {
    "path": ".github/workflows/claude-code-review.yml",
    "content": "name: Claude Code Review\n\non:\n  pull_request_target:\n    types: [opened, synchronize, ready_for_review, reopened]\n\njobs:\n  claude-review:\n    if: false\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      pull-requests: write\n      issues: read\n      id-token: write\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 1\n\n      - name: Run Claude Code Review\n        id: claude-review\n        uses: anthropics/claude-code-action@v1\n        with:\n          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}\n          plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'\n          plugins: 'code-review@claude-code-plugins'\n          prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'\n          # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md\n          # or https://code.claude.com/docs/en/cli-reference for available options\n"
  },
  {
    "path": ".github/workflows/claude.yml",
    "content": "name: Claude Code\n\non:\n  issue_comment:\n    types: [created]\n  pull_request_review_comment:\n    types: [created]\n  issues:\n    types: [opened, assigned]\n  pull_request_review:\n    types: [submitted]\n\njobs:\n  claude:\n    if: |\n      (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||\n      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||\n      (github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||\n      (github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))\n    runs-on: ubuntu-latest\n    permissions:\n      contents: read\n      pull-requests: read\n      issues: read\n      id-token: write\n      actions: read # Required for Claude to read CI results on PRs\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 1\n\n      - name: Run Claude Code\n        id: claude\n        uses: anthropics/claude-code-action@v1\n        with:\n          claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}\n\n          # This is an optional setting that allows Claude to read CI results on PRs\n          additional_permissions: |\n            actions: read\n\n          # Optional: Give a custom prompt to Claude. If this is not specified, Claude will perform the instructions specified in the comment that tagged it.\n          # prompt: 'Update the pull request description to include a summary of changes.'\n\n          # Optional: Add claude_args to customize behavior and configuration\n          # See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md\n          # or https://code.claude.com/docs/en/cli-reference for available options\n          # claude_args: '--allowed-tools Bash(gh pr:*)'\n"
  },
  {
    "path": ".github/workflows/labeler.yml",
    "content": "name: Labeler\n\non:\n  issues:\n    types: [opened]\n  pull_request_target:\n    types: [opened]\n\njobs:\n  label-priority:\n    runs-on: ubuntu-latest\n    permissions:\n      issues: write\n      pull-requests: write\n    steps:\n      - name: Label New Issue or PR\n        uses: actions/github-script@v7\n        with:\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          script: |\n            let label = '';\n            let username = '';\n            let issueOrPrNumber = 0;\n\n            if (context.eventName === 'issues') {\n              username = context.payload.issue.user.login;\n              issueOrPrNumber = context.payload.issue.number;\n            } else if (context.eventName === 'pull_request_target') {\n              username = context.payload.pull_request.user.login;\n              issueOrPrNumber = context.payload.pull_request.number;\n            }\n\n            // Check if an Adafruit member\n            try {\n              const adafruitResponse = await github.rest.orgs.checkMembershipForUser({\n                org: 'adafruit',\n                username: username\n              });\n\n              if (adafruitResponse.status === 204) {\n                console.log('Adafruit Member');\n                label = 'Prio Urgent';\n              }\n            } catch (error) {\n              console.log('Not an Adafruit member');\n            }\n\n            // Check if a contributor\n            if (label == '') {\n              try {\n                const collaboratorResponse = await github.rest.repos.checkCollaborator({\n                  owner: context.repo.owner,\n                  repo: context.repo.repo,\n                  username: username\n                });\n\n                if (collaboratorResponse.status === 204) {\n                  console.log('Contributor');\n                  label = 'Prio Higher';\n                }\n              } catch (error) {\n                console.log('Not a contributor');\n              }\n            }\n\n            if (label !== '') {\n              await github.rest.issues.addLabels({\n                owner: context.repo.owner,\n                repo: context.repo.repo,\n                issue_number: issueOrPrNumber,\n                labels: [label]\n              });\n            }\n"
  },
  {
    "path": ".github/workflows/membrowse-comment.yml",
    "content": "name: Membrowse Comment\n\non:\n  workflow_run:\n    workflows: [\"Build\"]\n    types:\n      - completed\n\njobs:\n  post-comment:\n    runs-on: ubuntu-latest\n    # Run the comment job even if some of the builds fail\n    if: >\n      github.event.workflow_run.event == 'pull_request' &&\n      github.event.workflow_run.conclusion != 'cancelled'\n    permissions:\n      contents: read\n      actions: read\n      pull-requests: write\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n\n      - name: Post Membrowse PR comment\n        if: ${{ env.MEMBROWSE_API_KEY != '' }}\n        uses: membrowse/membrowse-action/comment-action@v1\n        with:\n          api_key: ${{ secrets.MEMBROWSE_API_KEY }}\n          commit: ${{ github.event.workflow_run.head_sha }}\n          comment_template: .github/membrowse_pr_message.j2\n        env:\n          MEMBROWSE_API_KEY: ${{ secrets.MEMBROWSE_API_KEY }}\n          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n"
  },
  {
    "path": ".github/workflows/membrowse-onboard.yml",
    "content": "name: Onboard to Membrowse\n\non:\n  workflow_dispatch:\n    inputs:\n      num_commits:\n        description: 'Number of commits to process'\n        required: true\n        default: '10'\n        type: string\n\njobs:\n  load-targets:\n    runs-on: ubuntu-22.04\n    outputs:\n      targets: ${{ steps.load.outputs.targets }}\n      toolchains: ${{ steps.load.outputs.toolchains }}\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n\n      - name: Load target matrix\n        id: load\n        run: |\n          echo \"targets=$(jq -c '.targets' .github/membrowse-targets.json)\" >> $GITHUB_OUTPUT\n          echo \"toolchains=$(jq -c '.toolchains' .github/membrowse-targets.json)\" >> $GITHUB_OUTPUT\n\n  onboard:\n    needs: load-targets\n    runs-on: ubuntu-22.04\n    strategy:\n      fail-fast: false\n      matrix:\n        include: ${{ fromJson(needs.load-targets.outputs.targets) }}\n\n    steps:\n      - name: Checkout repository\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0\n          submodules: recursive\n\n      - name: Install packages\n        run: |\n          ${{ fromJson(needs.load-targets.outputs.toolchains)[matrix.toolchain].setup_cmd }} && python3 tools/get_deps.py ${{ matrix.get_deps || matrix.port }}\n\n      - name: Setup ccache\n        uses: hendrikmuhs/ccache-action@v1\n        with:\n          key: ${{ matrix.port }}-${{ matrix.board }}\n\n      - name: Run Membrowse Onboard Action\n        uses: membrowse/membrowse-action/onboard-action@v1\n        with:\n          target_name: ${{ matrix.port }}-${{ matrix.board }}-${{ matrix.example }}\n          num_commits: ${{ github.event.inputs.num_commits }}\n          build_script: python3 tools/build.py -s cmake -b ${{ matrix.board }}\n          elf: cmake-build/cmake-build-${{ matrix.board }}/device/${{ matrix.example }}/${{ matrix.example }}.elf\n          ld: ${{ matrix.ld }}\n          linker_vars: ${{ matrix.linker_vars || '' }}\n          api_key: ${{ secrets.MEMBROWSE_API_KEY }}\n          api_url: ${{ vars.MEMBROWSE_API_URL }}\n"
  },
  {
    "path": ".github/workflows/metrics_comment.yml",
    "content": "name: Metrics Comment\n\non:\n  workflow_run:\n    workflows: [\"Build\"]\n    types:\n      - completed\n\njobs:\n  post-comment:\n    runs-on: ubuntu-latest\n    if: >\n      github.event.workflow_run.event == 'pull_request' &&\n      github.event.workflow_run.conclusion == 'success'\n    permissions:\n      actions: read\n      pull-requests: write\n    steps:\n      - name: Download Artifacts\n        uses: actions/download-artifact@v5\n        with:\n          run-id: ${{ github.event.workflow_run.id }}\n          github-token: ${{ secrets.GITHUB_TOKEN }}\n          name: metrics-comment\n\n      - name: Read PR Number\n        id: pr_number\n        run: |\n          if [ -f pr_number.txt ]; then\n            echo \"number=$(cat pr_number.txt)\" >> $GITHUB_OUTPUT\n          fi\n\n      - name: Post Code Metrics as PR Comment\n        if: steps.pr_number.outputs.number != ''\n        uses: marocchino/sticky-pull-request-comment@v2\n        with:\n          header: code-metrics\n          path: metrics_compare.md\n          number: ${{ steps.pr_number.outputs.number }}\n"
  },
  {
    "path": ".github/workflows/pre-commit.yml",
    "content": "name: pre-commit\n\non:\n  workflow_dispatch:\n  push:\n  pull_request:\n    branches: [ master ]\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  pre-commit:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Setup Ruby\n      uses: ruby/setup-ruby@v1\n      with:\n        ruby-version: '3.0'\n\n    - name: Checkout TinyUSB\n      uses: actions/checkout@v6\n\n    - name: Get Dependencies\n      run: |\n        gem install ceedling\n        #cd test/unit-test\n        #ceedling test:all\n\n    - name: Run pre-commit\n      uses: pre-commit/action@v3.0.1\n\n    - name: Build Fuzzer\n      run: |\n        sudo apt install libc++-dev libc++abi-dev\n        clang --version\n        export CC=clang\n        export CXX=clang++\n        fuzz_harness=$(ls -d test/fuzz/device/*/)\n        for h in $fuzz_harness\n        do\n          make -C $h get-deps\n          make -C $h all\n        done\n"
  },
  {
    "path": ".github/workflows/static_analysis.yml",
    "content": "name: Static Analysis\non:\n  workflow_dispatch:\n  push:\n    branches: [ master ]\n    paths:\n      - 'src/**'\n      - 'examples/**'\n      - 'hw/bsp/**'\n      - '.github/workflows/static_analysis.yml'\n  pull_request:\n    branches: [ master ]\n    paths:\n      - 'src/**'\n      - 'examples/**'\n      - 'hw/bsp/**'\n      - '.github/workflows/static_analysis.yml'\n\npermissions:\n  actions: read\n  contents: read\n  security-events: write\n#  pull-requests: write\n#  checks: write\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ github.ref }}\n  cancel-in-progress: true\n\njobs:\n  CodeQL:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        board:\n          - 'metro_m4_express'\n    steps:\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n\n      - name: Get Dependencies\n        uses: ./.github/actions/get_deps\n        with:\n          arg: -b${{ matrix.board }}\n\n      - name: Setup Toolchain\n        uses: ./.github/actions/setup_toolchain\n        with:\n          toolchain: 'arm-gcc'\n\n      - name: Initialize CodeQL\n        uses: github/codeql-action/init@v4\n        with:\n          languages: 'c-cpp'\n          queries: security-and-quality\n\n      - name: Build\n        run: |\n          mkdir -p build\n          cmake examples -B build -G Ninja -DBOARD=${{ matrix.board }} -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=MinSizeRel\n          cmake --build build\n\n      - name: Perform CodeQL Analysis\n        uses: github/codeql-action/analyze@v4\n        with:\n          category: CodeQL\n          upload: false\n        id: analyze\n\n      - name: Filter SARIF report\n        uses: advanced-security/filter-sarif@v1\n        with:\n          patterns: |\n            -hw/mcu/**\n            -lib/**\n          input: ${{ steps.analyze.outputs.sarif-output }}/cpp.sarif\n          output: ${{ steps.analyze.outputs.sarif-output }}/cpp.sarif\n\n      - name: Upload SARIF\n        uses: github/codeql-action/upload-sarif@v4\n        with:\n          sarif_file: ${{ steps.analyze.outputs.sarif-output }}\n          category: CodeQL\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@v7\n        with:\n          name: codeql-${{ matrix.board }}\n          path: ${{ steps.analyze.outputs.sarif-output }}\n\n  PVS-Studio:\n    # Only run on non-forked PR since secrets token is required\n    if: github.repository_owner == 'hathach' && github.event.pull_request.head.repo.fork == false\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        board:\n          - 'raspberry_pi_pico'\n    steps:\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n\n      - name: Get Dependencies\n        uses: ./.github/actions/get_deps\n        with:\n          arg: -b${{ matrix.board }}\n\n      - name: Setup Toolchain\n        uses: ./.github/actions/setup_toolchain\n        with:\n          toolchain: 'arm-gcc'\n\n      - name: Install Tools\n        run: |\n          wget -q -O - https://files.pvs-studio.com/etc/pubkey.txt | sudo apt-key add -\n          sudo wget -O /etc/apt/sources.list.d/viva64.list https://files.pvs-studio.com/etc/viva64.list\n          sudo apt update\n          sudo apt install pvs-studio\n          pvs-studio-analyzer credentials ${{ secrets.PVS_STUDIO_CREDENTIALS }}\n          pvs-studio-analyzer --version\n\n      - name: Analyze\n        run: |\n          mkdir -p build\n          cmake examples -B build -G Ninja -DBOARD=${{ matrix.board }} -DCMAKE_BUILD_TYPE=MinSizeRel\n          cmake --build build\n          pvs-studio-analyzer analyze -f build/compile_commands.json -R .PVS-Studio/.pvsconfig -j4 --security-related-issues --misra-cpp-version 2008 --misra-c-version 2023 --use-old-parser -e lib/ -e hw/mcu/ -e */iar/cxarm/ -e pico-sdk/\n          plog-converter -t sarif -o pvs-studio-${{ matrix.board }}.sarif PVS-Studio.log\n\n      - name: Upload SARIF\n        uses: github/codeql-action/upload-sarif@v4\n        with:\n          sarif_file: pvs-studio-${{ matrix.board }}.sarif\n          category: PVS-Studio\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@v7\n        with:\n          name: pvs-studio-${{ matrix.board }}\n          path: pvs-studio-${{ matrix.board }}.sarif\n\n  SonarQube:\n    # Only run on non-forked PR since secrets token is required\n    if: github.repository_owner == 'hathach' && github.event.pull_request.head.repo.fork == false\n    runs-on: ubuntu-latest\n    env:\n      BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory\n    strategy:\n      fail-fast: false\n      matrix:\n        board:\n          - 'stm32h743eval'\n    steps:\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n        with:\n          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis\n\n      - name: Get Dependencies\n        uses: ./.github/actions/get_deps\n        with:\n          arg: -b${{ matrix.board }}\n\n      - name: Setup Toolchain\n        uses: ./.github/actions/setup_toolchain\n        with:\n          toolchain: 'arm-gcc'\n\n      - name: Install Build Wrapper\n        uses: SonarSource/sonarqube-scan-action/install-build-wrapper@v6\n\n      - name: Run Build Wrapper\n        run: |\n          cmake examples -B build -G Ninja -DBOARD=${{ matrix.board }} -DCMAKE_BUILD_TYPE=MinSizeRel\n          build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} cmake --build build/\n\n      - name: SonarQube Scan\n        uses: SonarSource/sonarqube-scan-action@v6\n        env:\n          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}\n        with:\n          # Consult https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner/ for more information and options\n          args: >\n            --define sonar.cfamily.compile-commands=${{ env.BUILD_WRAPPER_OUT_DIR }}/compile_commands.json\n\n  IAR-CStat:\n    # Only run on non-forked PR since secrets token is required\n    #if: github.repository_owner == 'hathach' && github.event.pull_request.head.repo.fork == false\n    if: false\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        board:\n          - 'b_g474e_dpow1'\n    steps:\n      - name: Checkout TinyUSB\n        uses: actions/checkout@v6\n\n      - name: Get Dependencies\n        uses: ./.github/actions/get_deps\n        with:\n          arg: -b${{ matrix.board }}\n\n      - name: Setup Toolchain\n        uses: ./.github/actions/setup_toolchain\n        with:\n          toolchain: 'arm-iar'\n\n      - name: Install CMake 4.2\n        run: |\n          # IAR CSTAT requires CMake >= 4.1\n          wget -q https://github.com/Kitware/CMake/releases/download/v4.2.0-rc1/cmake-4.2.0-rc1-linux-x86_64.tar.gz\n          tar -xzf cmake-4.2.0-rc1-linux-x86_64.tar.gz\n          echo \"${{ github.workspace }}/cmake-4.2.0-rc1-linux-x86_64/bin\" >> $GITHUB_PATH\n\n      - name: Build and run IAR C-STAT Analysis\n        env:\n          IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}\n        run: |\n          # CMake run post build to generate C-STAT SARIF report\n          cmake --version\n          mkdir -p build\n          cmake examples/device/cdc_msc -B build -G Ninja -DBOARD=${{ matrix.board }} -DTOOLCHAIN=iar -DIAR_CSTAT=1 -DCMAKE_BUILD_TYPE=MinSizeRel\n          cmake --build build\n          # Merge sarif files for codeql upload\n          npm i -g @microsoft/sarif-multitool\n          npx @microsoft/sarif-multitool merge --merge-runs --output-file iar-cstat-${{ matrix.board }}.sarif build/cstat_sarif/*.sarif\n\n      - name: Upload SARIF\n        uses: github/codeql-action/upload-sarif@v4\n        with:\n          sarif_file: iar-cstat-${{ matrix.board }}.sarif\n          category: IAR-CStat\n\n      - name: Upload artifact\n        uses: actions/upload-artifact@v7\n        with:\n          name: iar-cstat-${{ matrix.board }}\n          path: iar-cstat-${{ matrix.board }}.sarif\n"
  },
  {
    "path": ".github/workflows/trigger.yml",
    "content": "name: Trigger Repos\n\non:\n  workflow_dispatch:\n  push:\n    branches: master\n  release:\n    types:\n      - created\n\njobs:\n  trigger-mynewt:\n    if: github.repository == 'hathach/tinyusb'\n    runs-on: ubuntu-latest\n    steps:\n    - name: Trigger mynewt-tinyusb-example\n      shell: bash\n      run: |\n        curl -X POST -H \"Authorization: token ${{ secrets.API_TOKEN_GITHUB }}\" -H \"Accept: application/vnd.github.everest-preview+json\" -H \"Content-Type: application/json\" --data '{\"event_type\": \"rebuild\"}' https://api.github.com/repos/hathach/mynewt-tinyusb-example/dispatches\n\n  mirror-tinyusb-src:\n    if: github.repository == 'hathach/tinyusb'\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v6\n\n    - name: Push to tinyusb_src\n      run: |\n        # clone tinyusb_src with PAT\n        git config --global user.email \"thach@tinyusb.org\"\n        git config --global user.name \"hathach\"\n        git clone --depth 1 --single-branch --branch main \"https://${{ secrets.API_TOKEN_GITHUB }}@github.com/hathach/tinyusb_src.git\" tinyusb_src\n\n        # Remove all files\n        rm -rf tinyusb_src/*\n\n        # Copy src and other files\n        cp -r src tinyusb_src/\n        cp LICENSE tinyusb_src/\n        cd tinyusb_src\n\n        # Commit if there is changes\n        if [ -n \"$(git status --porcelain)\" ]; then\n          git add .\n          git commit --message \"Update from https://github.com/$GITHUB_REPOSITORY/commit/$GITHUB_SHA\"\n          git push\n        fi\n\n    - name: Create tinyusb_src Release\n      if: ${{ github.event_name == 'release' }}\n      run: |\n        # Push tag\n        cd tinyusb_src\n        git tag ${{ github.event.release.tag_name }}\n        git push origin ${{ github.event.release.tag_name }}\n\n        # Send POST reqwuest to release https://docs.github.com/en/rest/reference/repos#create-a-release\n        bb=\"For release note, please checkout https://github.com/hathach/tinyusb/releases/tag/${{ github.event.release.tag_name }}\"\n        curl -X POST -H \"Authorization: token ${{ secrets.API_TOKEN_GITHUB }}\" -H \"Accept: application/vnd.github.v3+json\" --data '{\"tag_name\": \"${{ github.event.release.tag_name }}\", \"name\": \"${{ github.event.release.name }}\", \"body\": \"$bb\", \"draft\": ${{ github.event.release.draft }}, \"prerelease\": ${{ github.event.release.prerelease }}}' https://api.github.com/repos/hathach/tinyusb_src/releases\n"
  },
  {
    "path": ".gitignore",
    "content": "html\nlatex\n*.a\n*.d\n*.o\n*.P\n*.axf\n*.bin\n*.elf\n*.env\n*.ind\n*.log\n*.map\n*.obj\n*.jlink\n*.emSession\n*.ninja*\n*.eww\n*.ewp\n*.ewt\n*.ewd\n*.hex\n.venv/\ncmake_install.cmake\nCMakeCache.txt\nsettings/\n.settings/\n.vscode/\n.gdb_history\n/examples/*/*/build*\ntest_old/\ntests_obsolete/\n_build/\nbuild/\n/examples/*/*/ses\n/examples/*/*/ozone\n/examples/obsolete\nhw/bsp/**/cubemx/*/\n.mxproject\n# coverity intermediate files\ncov-int\n# cppcheck build directories\n*-build-dir\n/_bin/\n__pycache__\ncmake-build/\ncmake-build-*\nsdkconfig\n.PVS-Studio\n.vscode/\nCMakeFiles\nDebug\nRelWithDebInfo\nRelease\nBrowseInfo\n.cmake_build\nREADME_processed.rst\n"
  },
  {
    "path": ".idea/.gitignore",
    "content": "# Default ignored files\n/shelf/\n/workspace.xml\n# Datasource local storage ignored files\n/dataSources/\n/dataSources.local.xml\n# Editor-based HTTP Client requests\n/httpRequests/\n# GitHub Copilot persisted chat sessions\n/copilot/chatSessions\n"
  },
  {
    "path": ".idea/cmake.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CMakeSharedSettings\">\n    <configurations>\n      <configuration PROFILE_NAME=\"raspberrypi_zero\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=raspberrypi_zero -DLOG=1\" />\n      <configuration PROFILE_NAME=\"raspberrypi_zero2\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=raspberrypi_zero2 -DLOG=1\" />\n      <configuration PROFILE_NAME=\"raspberrypi_cm4\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=raspberrypi_cm4 -DLOG=1\" />\n      <configuration PROFILE_NAME=\"raspberry_pi_pico\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=raspberry_pi_pico -DLOG=1\" />\n      <configuration PROFILE_NAME=\"raspberry_pi_pico-pio_host\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=raspberry_pi_pico -DLOG=1 -DCFLAGS_CLI=&quot;-DCFG_TUH_RPI_PIO_USB=1&quot;\" />\n      <configuration PROFILE_NAME=\"raspberry_pi_pico2\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=raspberry_pi_pico2 -DLOG=1\" />\n      <configuration PROFILE_NAME=\"raspberry_pi_pico2-pio_host\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=raspberry_pi_pico2 -DLOG=1 -DCFLAGS_CLI=&quot;-DCFG_TUH_RPI_PIO_USB=1&quot;\" />\n      <configuration PROFILE_NAME=\"feather_rp2040\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=pico_sdk -DPICO_BOARD=adafruit_feather_rp2040 -DLOG=1\" />\n      <configuration PROFILE_NAME=\"feather_rp2040_max3421\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=feather_rp2040_max3421 -DLOG=1\" />\n      <configuration PROFILE_NAME=\"metro_rp2040\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=pico_sdk -DPICO_BOARD=adafruit_metro_rp2040 -DLOG=1 -DMAX3421_HOST=1\" />\n      <configuration PROFILE_NAME=\"adafruit_metro_rp2350\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=adafruit_metro_rp2350 -DLOG=1 -DCFLAGS_CLI=&quot;-DCFG_TUH_RPI_PIO_USB=1&quot;\" />\n      <configuration PROFILE_NAME=\"adafruit_fruit_jam\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=adafruit_fruit_jam -DLOG=1 -DCFLAGS_CLI=&quot;-DCFG_TUH_RPI_PIO_USB=1&quot;\" />\n      <configuration PROFILE_NAME=\"adafruit_feather_esp32_v2\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=adafruit_feather_esp32_v2 -DMAX3421_HOST=1 -DLOG=1\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"adafruit_feather_esp32s2\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=adafruit_feather_esp32s2 -DMAX3421_HOST=1 -DLOG=1\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"adafruit_feather_esp32s3\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=adafruit_feather_esp32s3 -DMAX3421_HOST=1 -DLOG=1\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"adafruit_metro_esp32s2\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=adafruit_metro_esp32s2 -DMAX3421_HOST=1 -DLOG=1\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"espressif_kaluga_1\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=espressif_kaluga_1 -DMAX3421_HOST=1 -DLOG=1\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"espressif_s3_devkitc\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=espressif_s3_devkitc -DLOG=1\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"espressif_s3_devkitc-DMA\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=espressif_s3_devkitc -DLOG=1 -DCFLAGS_CLI=&quot;-DCFG_TUD_DWC2_DMA_ENABLE=1 -DCFG_TUH_DWC2_DMA_ENABLE=1&quot;\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"espressif_p4_function_ev\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=espressif_p4_function_ev -DLOG=1\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"espressif_p4_function_ev-DMA\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=espressif_p4_function_ev -DLOG=1 -DCFLAGS_CLI=&quot;-DCFG_TUD_DWC2_DMA_ENABLE=1 -DCFG_TUH_DWC2_DMA_ENABLE=1&quot;\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"espressif_c3_devkitc\" ENABLED=\"false\" TOOLCHAIN_NAME=\"ESP-IDF\" GENERATION_OPTIONS=\"-DBOARD=espressif_c3_devkitc -DMAX3421_HOST=1 -DLOG=1\">\n        <ADDITIONAL_GENERATION_ENVIRONMENT>\n          <envs>\n            <env name=\"ESPBAUD\" value=\"1500000\" />\n          </envs>\n        </ADDITIONAL_GENERATION_ENVIRONMENT>\n      </configuration>\n      <configuration PROFILE_NAME=\"feather_m0_express\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=feather_m0_express -DLOG=1 -DLOGGER=RTT -DMAX3421_HOST=1\" />\n      <configuration PROFILE_NAME=\"metro_m0_express\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=metro_m0_express -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"metro_m0_express-max3421\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=metro_m0_express -DLOG=1 -DLOGGER=RTT -DMAX3421_HOST=1\" />\n      <configuration PROFILE_NAME=\"samd11_xplained\" ENABLED=\"false\" CONFIG_NAME=\"MinSizeRel\" GENERATION_OPTIONS=\"-DBOARD=samd11_xplained\" />\n      <configuration PROFILE_NAME=\"atsaml21_xpro\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=atsaml21_xpro\" />\n      <configuration PROFILE_NAME=\"feather_m4_express\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=feather_m4_express -DLOG=1 -DLOGGER=RTT -DMAX3421_HOST=1\" />\n      <configuration PROFILE_NAME=\"metro_m4_express\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=metro_m4_express -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"metro_m4_express-max3421\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=metro_m4_express -DLOG=1 -DLOGGER=RTT -DMAX3421_HOST=1\" />\n      <configuration PROFILE_NAME=\"feather_m4_express-zephyr\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=feather_m4_express -DLOG=1 -DMAX3421_HOST=1 -DRTOS=zephyr\" />\n      <configuration PROFILE_NAME=\"itsybitsy_m4\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=itsybitsy_m4\" />\n      <configuration PROFILE_NAME=\"same54_xplained\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=same54_xplained -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"samg55_xplained\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=samg55_xplained\" />\n      <configuration PROFILE_NAME=\"same70_xplained\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=same70_xplained -DLOG=1\" />\n      <configuration PROFILE_NAME=\"feather_nrf52840_express\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=feather_nrf52840_express -DLOG=1 -DLOGGER=RTT -DMAX3421_HOST=1\" />\n      <configuration PROFILE_NAME=\"nrf52840dk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=nrf52840dk -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"nrf52840dk-zephyr\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=nrf52840dk -DLOG=1 -DTRACE_ETM=1 -DRTOS=zephyr\" BUILD_OPTIONS=\"-v\" />\n      <configuration PROFILE_NAME=\"nrf5340dk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=nrf5340dk -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"metro m7 1011 sd\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=metro_m7_1011_sd -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"metro_m7_1011\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=metro_m7_1011 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"rt1010 evk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=mimxrt1010_evk -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"rt1024 evk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=mimxrt1024_evk -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"rt1050 evk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=mimxrt1050_evkb -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"mimxrt1060_evk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=mimxrt1060_evk -DLOG=1\" />\n      <configuration PROFILE_NAME=\"mimxrt1064_evk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=mimxrt1064_evk\" />\n      <configuration PROFILE_NAME=\"rt1170 evkb\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=mimxrt1170_evkb -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"stm32f072disco\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f072disco -DLOG=0 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32f103_mini_2\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f103_mini_2 -DLOG=1 -DLOGGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32f103ze_iar\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f103ze_iar -DLOG=1 -DLOGGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32f207nucleo\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f207nucleo -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32f303disco\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f303disco -DLOG=0 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32f411disco\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f411disco -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32f412disco\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f412disco -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32f723disco\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f723disco -DLOG=0\" />\n      <configuration PROFILE_NAME=\"stm32f723disco-DMA\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f723disco -DLOG=1 -DLOGGER=RTT -DCFLAGS_CLI=&quot;-DCFG_TUD_DWC2_DMA_ENABLE=1 -DCFG_TUH_DWC2_DMA_ENABLE=1&quot;\" />\n      <configuration PROFILE_NAME=\"stm32f723disco_device1\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f723disco -DLOG=0 -DRHPORT_DEVICE=1\" />\n      <configuration PROFILE_NAME=\"stm32f769disco\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32f769disco -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32g0b1nucleo\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32g0b1nucleo\" />\n      <configuration PROFILE_NAME=\"stm32g474nucleo\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32g474nucleo\" />\n      <configuration PROFILE_NAME=\"b_g474e_dpow1\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=b_g474e_dpow1 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32h563nucleo\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=stm32h563nucleo -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"stm32h743eval\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32h743eval -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"stm32h743eval-DMA\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32h743eval -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1 -DCFLAGS_CLI=&quot;-DCFG_TUD_DWC2_DMA_ENABLE=1&quot;\" />\n      <configuration PROFILE_NAME=\"stm32h743eval_host1\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32h743eval -DRHPORT_HOST=1 -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"stm32h743eval IAR\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" TOOLCHAIN_NAME=\"iccarm\" GENERATION_OPTIONS=\"-DBOARD=stm32h743eval -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1 -DIAR_CSTAT=1\" />\n      <configuration PROFILE_NAME=\"stm32h743nucleo\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32h743nucleo -DLOG=1\" />\n      <configuration PROFILE_NAME=\"stm32h7s3nucleo\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32h7s3nucleo -DLOG=1\" />\n      <configuration PROFILE_NAME=\"stm32l0538disco\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32l0538disco -DLOG=0 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32l476disco\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32l476disco -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32u083cdk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32u083cdk -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32u575nucleo\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32u575nucleo -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32u5a5nucleo\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=stm32u5a5nucleo -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"stm32wb55nucleo\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=stm32wb55nucleo\" />\n      <configuration PROFILE_NAME=\"ra2a1_ek\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ra2a1_ek -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"ra4m1_ek\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ra4m1_ek -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"ra4m3_ek\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ra4m3_ek -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"ra6m1_ek\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ra6m1_ek -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"ra6m5_ek\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ra6m5_ek -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"ra6m5_ek PORT0\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ra6m5_ek -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1 -DRHPORT_DEVICE=0\" />\n      <configuration PROFILE_NAME=\"ra8m1_ek\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ra8m1_ek -DLOG=2 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"ra8m1_ek PORT0\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ra8m1_ek -DLOG=2 -DLOGGER=RTT -DTRACE_ETM=1 -DRHPORT_DEVICE=0\" />\n      <configuration PROFILE_NAME=\"uno_r4\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=uno_r4 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"portenta_c33\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=portenta_c33 -DLOG=1\" />\n      <configuration PROFILE_NAME=\"lpcxpresso11u37\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso11u37\" />\n      <configuration PROFILE_NAME=\"lpcxpresso11u68\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso11u68 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"lpcxpresso1347\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso1347 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"lpcxpresso1549\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso1549 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"lpcxpresso1769\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso1769 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"mcb1800\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=mcb1800 -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"ea4088 quickstart\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ea4088_quickstart -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"ea4357\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ea4357 -DLOG=1 -DLOGGER=RTT -DTRACE_ETM=1\" />\n      <configuration PROFILE_NAME=\"lpcxpresso51u68\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso51u68 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"lpc5414\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso54114 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"lpc54628\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso54628 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"lpc55s69\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=lpcxpresso55s69 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"mcxn947brk\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=mcxn947brk -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"frdm_mcxa153\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=frdm_mcxa153 -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"frdm_kl25z\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=frdm_kl25z -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"frdm_k32l2a4s\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=frdm_k32l2a4s\" />\n      <configuration PROFILE_NAME=\"frdm_k64f\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=frdm_k64f -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"msp430f5529\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=msp_exp430f5529lp\" />\n      <configuration PROFILE_NAME=\"msp_exp432e401y\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=msp_exp432e401y -DLOG=1\" />\n      <configuration PROFILE_NAME=\"ek_tm4c123gxl\" ENABLED=\"false\" CONFIG_NAME=\"MinSizeRel\" GENERATION_OPTIONS=\"-DBOARD=ek_tm4c123gxl -DLOG=1\" />\n      <configuration PROFILE_NAME=\"xmc4500_relax\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=xmc4500_relax -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"xmc4500_relax_dma\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=xmc4500_relax -DLOG=1 -DLOGGER=RTT -DCFLAGS_CLI=&quot;-DCFG_TUD_DWC2_DMA=1&quot;\" />\n      <configuration PROFILE_NAME=\"f1c100s\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=f1c100s\" />\n      <configuration PROFILE_NAME=\"mm32f327x_mb39\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=mm32f327x_mb39\" />\n      <configuration PROFILE_NAME=\"fomu\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=fomu\" />\n      <configuration PROFILE_NAME=\"sipeed_longan_nano\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=sipeed_longan_nano\" />\n      <configuration PROFILE_NAME=\"ch32v103r_r1_1v0\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ch32v103r_r1_1v0\" />\n      <configuration PROFILE_NAME=\"nanoch32v203\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=nanoch32v203\" />\n      <configuration PROFILE_NAME=\"ch32v203c_r0_1v0\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ch32v203c_r0_1v0 -DLOG=0\" />\n      <configuration PROFILE_NAME=\"ch32v203c_r0_1v0 USBFS\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ch32v203c_r0_1v0 -DPORT=1\" />\n      <configuration PROFILE_NAME=\"ch32v203g_r0_1v0\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=ch32v203g_r0_1v0\" />\n      <configuration PROFILE_NAME=\"nanoch32v305\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=nanoch32v305 -DLOG=1\" />\n      <configuration PROFILE_NAME=\"ch32v307v_r1_1v0\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=ch32v307v_r1_1v0 -DLOG=1\" />\n      <configuration PROFILE_NAME=\"ch32v307v_r1_1v0 USBFS\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=ch32v307v_r1_1v0 -DSPEED=full\" />\n      <configuration PROFILE_NAME=\"da14695_dk_usb\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=da14695_dk_usb\" />\n      <configuration PROFILE_NAME=\"max32650fthr\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=max32650fthr -DLOG=0 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"max32666fthr\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=max32666fthr -DLOG=0 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"max32690evkit\" ENABLED=\"false\" CONFIG_NAME=\"Debug\" GENERATION_OPTIONS=\"-DBOARD=max32690evkit -DLOG=1 -DLOGGER=RTT\" />\n      <configuration PROFILE_NAME=\"at_start_f403a\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=at_start_f403a -DLOG=1\" />\n      <configuration PROFILE_NAME=\"at_start_f423\" ENABLED=\"false\" GENERATION_OPTIONS=\"-DBOARD=at_start_f423 -DLOG=1\" />\n    </configurations>\n  </component>\n</project>"
  },
  {
    "path": ".idea/debugServers/AT32F423VCT7.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"AT32F423VCT7\" uniqueID=\"de4ea1de-6dcf-413e-a21f-aaeaeb0f3dbc\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"AT32F423VCT7\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/ST_LINK.xml",
    "content": "<component name=\"DebugServers\">\n  <stlink-debug-target name=\"ST-LINK\" uniqueID=\"cf98f5f4-9c5b-4340-ab06-16ddd7f07062\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/opt/st/stm32cubeclt_1.20.0/STLink-gdb-server/bin/ST-LINK_gdbserver\" programmer=\"/opt/st/stm32cubeclt_1.20.0/STM32CubeProgrammer/bin\" />\n    <st-link />\n    <device interface=\"SWD\" />\n    <connection port=\"61234\" warmup-ms=\"500\" />\n    <swo enabled=\"false\" port=\"61235\" />\n  </stlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/at32f403acgu7.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"at32f403acgu7\" uniqueID=\"13a1c815-97d7-4b16-8fcc-564bddfe2270\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"AT32F403ACGU7\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/esp32s2.xml",
    "content": "<component name=\"DebugServers\">\n  <generic-debug-target name=\"esp32s2\" uniqueID=\"254eff00-2acf-48fe-b255-1d0c0c9c4a7a\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\">$USER_HOME$/.espressif/tools/xtensa-esp-elf-gdb/14.2_20240403/xtensa-esp-elf-gdb/bin/xtensa-esp32s2-elf-gdb</debugger>\n      <env />\n    </debugger>\n    <gdbserver exe=\"$USER_HOME$/.espressif/tools/openocd-esp32/v0.12.0-esp32-20241016/openocd-esp32/bin/openocd\" args=\"-f board/esp32s2-kaluga-1.cfg\">\n      <env />\n    </gdbserver>\n    <console port=\"4444\" />\n    <target download-type=\"NONE\" reset-command=\"monitor reset halt\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" remote-string=\"tcp::3333\" warmup-ms=\"500\" />\n  </generic-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/lpc1769.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"lpc1769\" uniqueID=\"8f746157-a0c3-435f-b417-10f26c3b2699\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"LPC1769\" reset-before=\"false\" frequency=\"12000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/lpc55s69.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"lpc55s69\" uniqueID=\"7de47452-94f1-4f1d-b03c-0f4ad3556d01\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"LPC55S69_M33_0\" reset-before=\"false\" frequency=\"12000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/max32690.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"max32690\" uniqueID=\"cb5e7c25-cbda-4c6d-94e9-28a85a81ba66\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"MAX32690\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/mcxa153.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"mcxa153\" uniqueID=\"6a023429-69e6-4f8c-a592-4995cdf255db\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"MCXA153\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/nrf52833.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"nrf52833\" uniqueID=\"19eede9f-2096-4b30-9390-14d415964264\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"nRF52833_xxAA\" reset-before=\"false\" frequency=\"12000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/nrf5340.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"nrf5340\" uniqueID=\"d82e668b-1307-4266-8a5c-3752be6795c9\" selected=\"true\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"nRF5340_xxAA_APP\" reset-before=\"false\" frequency=\"12000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/ra6m1.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"ra6m1\" uniqueID=\"c8cdc79a-939b-4342-92b1-d24da72d12fe\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"R7FA6M1AD\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/ra6m5.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"ra6m5\" uniqueID=\"19100d9f-7329-47da-b566-f9faf297f47c\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"R7FA6M5BH\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/rp2040.xml",
    "content": "<component name=\"DebugServers\">\n  <generic-debug-target name=\"rp2040\" uniqueID=\"006ce655-8571-401e-a94b-6a4f6d519724\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/local/bin/openocd\" args=\"-f interface/cmsis-dap.cfg -f target/rp2040.cfg -c &quot;adapter speed 5000&quot;\">\n      <env />\n    </gdbserver>\n    <console enabled=\"true\" port=\"4444\" />\n    <target download-type=\"UPDATED_ONLY\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" remote-string=\"tcp::3333\" warmup-ms=\"500\" />\n  </generic-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/rp2350.xml",
    "content": "<component name=\"DebugServers\">\n  <generic-debug-target name=\"rp2350\" uniqueID=\"939fdf16-9c30-4261-8435-3e8df7fd5800\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/local/bin/openocd\" args=\"-f interface/cmsis-dap.cfg -f target/rp2350.cfg -c &quot;adapter speed 5000&quot;\">\n      <env />\n    </gdbserver>\n    <console enabled=\"true\" port=\"4444\" />\n    <target download-type=\"UPDATED_ONLY\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" remote-string=\"tcp::3333\" warmup-ms=\"500\" />\n  </generic-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/rt1011.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"rt1011\" uniqueID=\"e10c53c4-acf5-4a6f-a05d-32b7b042d70a\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"MIMXRT1011xxx5A\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/rt1060.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"rt1060\" uniqueID=\"851396c6-2030-4694-b86d-21ba9547ddcb\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"MIMXRT1062xxx6A\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/rt1064.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"rt1064\" uniqueID=\"9602472b-6ce8-4a2d-9636-1c03b5fcd6da\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"MIMXRT1064xxx6A\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/rt1170.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"rt1170\" uniqueID=\"cfc772e4-782e-49a3-99fb-b6f726e14f9d\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"MIMXRT1176xxxA_M7\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/s3.xml",
    "content": "<component name=\"DebugServers\">\n  <esp-idf-debug-target name=\"s3\" uniqueID=\"e096f0d4-5923-482d-bcc3-169a2cfd7cdc\">\n    <console enabled=\"false\" />\n    <target />\n  </esp-idf-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/sam21.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"sam21\" uniqueID=\"b22537b6-0924-4a2b-8721-48a8952239de\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"ATSAMD21G18A\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/sam51.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"sam51\" uniqueID=\"481ff0d4-6501-4394-8b6b-f7a2ca4c2675\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"ATSAMD51J19A\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/stm32f072.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"stm32f072\" uniqueID=\"f5c65701-0f8d-4923-a7ea-3ee2547147ae\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"STM32F072RB\" reset-before=\"false\" frequency=\"12000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/stm32f303.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"stm32f303\" uniqueID=\"1cdd63e5-1736-42be-bff3-4c48e1f169fa\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"STM32F303VC\" reset-before=\"false\" frequency=\"12000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/stm32f411.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"stm32f411\" uniqueID=\"c48950a7-634c-49b6-b136-204ed0b71718\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"STM32F411VE\" reset-before=\"false\" frequency=\"12000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/stm32f769.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"stm32f769\" uniqueID=\"7a47302f-f7e5-434b-b20b-78e95318dd0c\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"STM32F769NI\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/stm32h563.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"stm32h563\" uniqueID=\"a3e9293d-113b-48b3-b83d-dd4249984abe\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"STM32H562ZI\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/stm32h743.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"stm32h743\" uniqueID=\"6d6a3ed6-f66d-4f6a-9e70-6aafe5c971d0\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"STM32H743XI\" reset-before=\"false\" frequency=\"16000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/stm32l053.xml",
    "content": "<component name=\"DebugServers\">\n  <jlink-debug-target name=\"stm32l053\" uniqueID=\"51d156d7-86a6-4006-814a-ed14981d7b49\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver exe=\"/usr/bin/JLinkGDBServerCLExe\" />\n    <console port=\"19021\" />\n    <target device=\"STM32L053R8\" reset-before=\"false\" frequency=\"12000\" />\n    <connection extended-remote=\"false\" port=\"4444\" warmup-ms=\"500\" />\n    <swo />\n  </jlink-debug-target>\n</component>"
  },
  {
    "path": ".idea/debugServers/wch_riscv.xml",
    "content": "<component name=\"DebugServers\">\n  <generic-debug-target name=\"wch-riscv\" uniqueID=\"c471e2d0-3cb4-4e7e-aeb7-a33d0c8fdc08\">\n    <debugger version=\"1\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <env />\n    </debugger>\n    <gdbserver dir=\"$CMakeProjectDir$\" exe=\"$USER_HOME$/app/riscv-openocd-wch/src/openocd\" args=\"-f hw/bsp/ch32v20x/wch-riscv.cfg\">\n      <env />\n    </gdbserver>\n    <console enabled=\"true\" port=\"4444\" />\n    <target download-type=\"UPDATED_ONLY\" reset-command=\"monitor reset init; resume 0x08000000\" reset-before=\"false\" />\n    <connection extended-remote=\"false\" remote-string=\"tcp::3333\" warmup-ms=\"500\" />\n  </generic-debug-target>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/k64f.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"k64f\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;MK64FN1M0xxx12&quot; -if swd -speed 10000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/kl25.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"kl25\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;MKL25Z128xxx4&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/lpc1857.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"lpc1857\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;lpc1857&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"device_info\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"device_info\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/lpc4088.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"lpc4088\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;lpc4088&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/lpc54628.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"lpc54628\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;LPC54628J512&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/lpc55s69.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"lpc55s69\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;lpc55s69&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/mcx947.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"mcx947\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;MCXN947_M33_0&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun -jlinkscriptfile $ProjectFileDir$/hw/bsp/mcx/debug.jlinkscript\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/nrf52840.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"nrf52840\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nrf\" PROGRAM_PARAMS=\"-select usb=752001685 -device &quot;nrf52840_xxaa&quot; -if swd -speed 8000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/nrf5340.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"nrf5340\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nrf\" PROGRAM_PARAMS=\"-select usb=752001685 -device &quot;nrf5340_xxaa_app&quot; -if swd -speed 16000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/ra2a1.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"ra2a1\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"renesas\" PROGRAM_PARAMS=\"-device &quot;R7FA2A1AB&quot; -if swd -speed 20000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/ra4m1.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"ra4m1\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"renesas\" PROGRAM_PARAMS=\"-device &quot;R7FA4M1AB&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun -jlinkscriptfile $PROJECT_DIR$/hw/bsp/ra/debug.jlinkscript\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/ra6m1.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"ra6m1\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"renesas\" PROGRAM_PARAMS=\"-device &quot;R7FA6M1AD&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun -jlinkscriptfile $PROJECT_DIR$/hw/bsp/ra/debug.jlinkscript\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/ra6m5.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"ra6m5\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"renesas\" PROGRAM_PARAMS=\"-device &quot;R7FA6M5BH&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun -jlinkscriptfile $PROJECT_DIR$/hw/bsp/ra/debug.jlinkscript\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/rp2040.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"rp2040\" type=\"com.jetbrains.cidr.embedded.openocd.conf.type\" factoryName=\"com.jetbrains.cidr.embedded.openocd.conf.factory\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <openocd version=\"1\" gdb-port=\"3333\" telnet-port=\"4444\" board-config=\"$PROJECT_DIR$/hw/bsp/rp2040/rp2040-openocd.cfg\" reset-type=\"INIT\" download-type=\"UPDATED_ONLY\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n    </openocd>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/rt1010.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"rt1010\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;MIMXRT1011xxx5A&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun -jlinkscriptfile $ProjectFileDir$/hw/bsp/imxrt/debug.jlinkscript\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/rt1060.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"rt1060\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"nxp\" PROGRAM_PARAMS=\"-device &quot;MIMXRT1062xxx5A&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"device_info\" TARGET_NAME=\"device_info\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"device_info\" RUN_TARGET_NAME=\"device_info\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/samd21g18.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"samd21g18\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"microchip\" PROGRAM_PARAMS=\"-device &quot;ATSAMD21G18&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/samd51j19.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"samd51j19\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"microchip\" PROGRAM_PARAMS=\"-device &quot;ATSAMD51J19A&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/stlink.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"stlink\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" PROGRAM_PARAMS=\"-p 49578 -cp &quot;$USER_HOME$/st/stm32cubeide_1.16.1/plugins/com.st.stm32cube.ide.mcu.externaltools.cubeprogrammer.linux64_2.1.400.202404281720/tools/bin&quot; --frequency 8000 --swd\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" CONFIG_NAME=\"raspberry_pi_pico\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::49578\" executable=\"$USER_HOME$/st/stm32cubeide_1.16.1/plugins/com.st.stm32cube.ide.mcu.externaltools.stlink-gdb-server.linux64_2.1.400.202404281720/tools/bin/ST-LINK_gdbserver\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/stm32g474.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"stm32g474\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"stm32\" PROGRAM_PARAMS=\"-device &quot;stm32g474re&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/stm32h563.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"stm32h563\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"stm32\" PROGRAM_PARAMS=\"-device &quot;stm32h563zi&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/stm32h743.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"stm32h743\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"stm32\" PROGRAM_PARAMS=\"-device &quot;stm32h743xi&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc_hid\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc_hid\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/stm32u5a5.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"stm32u5a5\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"stm32\" PROGRAM_PARAMS=\"-device &quot;stm32u5a5zj&quot; -if swd -speed 50000 -port 25321 -nogui -singlerun\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/runConfigurations/uno_r4.xml",
    "content": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"uno_r4\" type=\"com.jetbrains.cidr.embedded.customgdbserver.type\" factoryName=\"com.jetbrains.cidr.embedded.customgdbserver.factory\" folderName=\"renesas\" PROGRAM_PARAMS=\"-device &quot;R7FA4M1AB&quot; -if swd -speed 20000 -port 25321 -nogui -singlerun -jlinkscriptfile $PROJECT_DIR$/hw/bsp/ra/debug.jlinkscript\" REDIRECT_INPUT=\"false\" ELEVATE=\"false\" USE_EXTERNAL_CONSOLE=\"false\" EMULATE_TERMINAL=\"false\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"tinyusb_examples\" TARGET_NAME=\"cdc_msc\" version=\"1\" RUN_TARGET_PROJECT_NAME=\"tinyusb_examples\" RUN_TARGET_NAME=\"cdc_msc\">\n    <custom-gdb-server version=\"1\" gdb-connect=\"tcp::25321\" executable=\"/usr/bin/JLinkGDBServer\" warmup-ms=\"0\" download-type=\"ALWAYS\" reset-cmd=\"monitor reset\" reset-type=\"AFTER_DOWNLOAD\" connection-mode=\"REMOTE\" gdbserver-enable=\"false\" console-enabled=\"false\" console-port=\"0\">\n      <debugger kind=\"GDB\" isBundled=\"true\" />\n      <extra-debugger-params debugger-working-dir=\"\" debugger-env-pass-parent=\"true\" custom-script=\"\" />\n    </custom-gdb-server>\n    <method v=\"2\">\n      <option name=\"CLION.COMPOUND.BUILD\" enabled=\"true\" />\n    </method>\n  </configuration>\n</component>"
  },
  {
    "path": ".idea/vcs.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping directory=\"$PROJECT_DIR$\" vcs=\"Git\" />\n    <mapping directory=\"$PROJECT_DIR$/hw/mcu/raspberry_pi/Pico-PIO-USB\" vcs=\"Git\" />\n  </component>\n</project>"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò\n#\n# SPDX-License-Identifier: Unlicense\n\nrepos:\n- repo: https://github.com/pre-commit/pre-commit-hooks\n  rev: v4.4.0\n  hooks:\n  - id: check-yaml\n  - id: trailing-whitespace\n    exclude: |\n      (?x)^(\n        hw/bsp/mcx/sdk/\n      )\n  - id: end-of-file-fixer\n    exclude: |\n      (?x)^(\n        .idea/|\n        hw/bsp/mcx/sdk/|\n        docs/contributing/code_of_conduct.rst|\n        docs/info/contributors.rst\n      )\n  - id: forbid-submodules\n\n- repo: https://github.com/codespell-project/codespell\n  rev: v2.2.4\n  hooks:\n  - id: codespell\n    args: [-w]\n    exclude: |\n      (?x)^(\n        lib/|\n        hw/bsp/mcx/sdk/\n      )\n\n- repo: local\n  hooks:\n  - id: unit-test\n    name: unit-test\n    files: ^(src/|test/unit-test/)\n    entry: sh -c \"cd test/unit-test && ceedling test:all\"\n    pass_filenames: false\n    types_or: [c, header]\n    language: system\n\n#  - id: build-fuzzer\n#    name: build-fuzzer\n#    files: ^(src/|test/fuzz/)\n#    language: system\n#    types_or: [c, header]\n#    entry: |\n#      bash -c 'export CC=clang\n#      export CXX=clang++\n#      fuzz_harness=$(ls -d test/fuzz/device/*/)\n#      for h in $fuzz_harness\n#      do\n#        make -C $h get-deps\n#        make -C $h all\n#      done'\n"
  },
  {
    "path": ".readthedocs.yaml",
    "content": "# .readthedocs.yaml\n# Read the Docs configuration file\n# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details\n\nversion: 2\n\n# Set the version of Python and other tools you might need\nbuild:\n  os: ubuntu-22.04\n  tools:\n    python: \"3.11\"\n\n# Build documentation in the docs/ directory with Sphinx\nsphinx:\n   configuration: docs/conf.py\n\n# Optionally declare the Python requirements required to build your docs\npython:\n  install:\n    - requirements: docs/requirements.txt\n\nsubmodules:\n  include: []\n  recursive: false\n"
  },
  {
    "path": "AGENTS.md",
    "content": "# TinyUSB Agent Instructions\n\nTinyUSB is an open-source cross-platform USB Host/Device stack for embedded systems, designed to be memory-safe with no\ndynamic allocation and thread-safe with all interrupt events deferred to non-ISR task functions.\n\nAlways reference these instructions first and fallback to search or bash commands only when you encounter unexpected\ninformation that does not match the info here.\n\n## Shared Ground Rules\n- Keep TinyUSB memory-safe: avoid dynamic allocation, defer ISR work to task context, and follow C99 with two-space indentation/no tabs.\n- Match file organization: core stack under `src`, MCU/BSP support in `hw/{mcu,bsp}`, examples under `examples/{device,host,dual}`, docs in `docs`, tests under `test/{unit-test,fuzz,hil}`.\n- Use descriptive snake_case for helpers, reserve `tud_`/`tuh_` for public APIs, `TU_` for macros, and keep headers self-contained with `#if CFG_TUSB_MCU` guards where needed.\n- Prefer `.clang-format` for C/C++ formatting, run `pre-commit run --all-files` before submitting, and document board/HIL coverage when applicable.\n- Commit in imperative mood, keep changes scoped, and supply PRs with linked issues plus test/build evidence.\n\n\n## Bootstrap and Build Setup\n\n- Install ARM GCC toolchain: `sudo apt-get update && sudo apt-get install -y gcc-arm-none-eabi`\n- Fetch core dependencies: `python3 tools/get_deps.py` -- takes <1 second. NEVER CANCEL.\n- For specific board families: `python3 tools/get_deps.py FAMILY_NAME` (e.g., rp2040, stm32f4), or\n  `python3 tools/get_deps.py -b BOARD_NAME`\n- Dependencies are cached in `lib/` and `hw/mcu/` directories\n- For **Espressif** boards, initialize the ESP-IDF environment before any build/flash/monitor command:\n  `. $HOME/code/esp-idf/export.sh`\n\n## Build Examples\n\nChoose ONE of these approaches:\n**Option 1: Individual Example with CMake and Ninja (RECOMMENDED)**\n\n```bash\ncd examples/device/cdc_msc\nmkdir -p build && cd build\ncmake -DBOARD=raspberry_pi_pico -G Ninja -DCMAKE_BUILD_TYPE=MinSizeRel ..\ncmake --build .\n```\n\n-- takes 1-2 seconds. NEVER CANCEL. Set timeout to 5+ minutes.\n\n**Option 2: All Examples for a Board**\n\ndifferent folder than Option 1\n\n```bash\ncd examples/\nmkdir -p build && cd build\ncmake -DBOARD=raspberry_pi_pico -G Ninja -DCMAKE_BUILD_TYPE=MinSizeRel ..\ncmake --build .\n```\n\n-- takes 15-20 seconds, may have some objcopy failures that are non-critical. NEVER CANCEL. Set timeout to 30+ minutes.\n\n**Option 3: Individual Example with Make**\n\n```bash\ncd examples/device/cdc_msc\nmake BOARD=raspberry_pi_pico all\n```\n\n-- takes 2-3 seconds. NEVER CANCEL. Set timeout to 5+ minutes.\n\n**Option 4: Espressif Example with ESP-IDF**\n\nOnly ESP-IDF-enabled examples are supported for Espressif boards. Use FreeRTOS examples such as `examples/device/cdc_msc_freertos`\nthat contain `idf_component_register()` support.\n\n```bash\n. $HOME/code/esp-idf/export.sh\ncd examples/device/cdc_msc_freertos\nidf.py -DBOARD=espressif_s3_devkitc build\n```\n\nUse `-DBOARD=...` with any supported board under `hw/bsp/espressif/boards/`. NEVER CANCEL. Set timeout to 10+ minutes.\n\n\n## Build Options\n\n- **Debug build**:\n    - CMake: `-DCMAKE_BUILD_TYPE=Debug`\n    - Make: `DEBUG=1`\n- **With logging**:\n    - CMake: `-DLOG=2`\n    - Make: `LOG=2`\n- **With RTT logger**:\n    - CMake: `-DLOG=2 -DLOGGER=rtt`\n    - Make: `LOG=2 LOGGER=rtt`\n- **RootHub port selection**:\n    - CMake: `-DRHPORT_DEVICE=1`\n    - Make: `RHPORT_DEVICE=1`\n- **Port speed**:\n    - CMake: `-DRHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED`\n    - Make: `RHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED`\n\n## Flashing and Deployment\n\n- **Flash with JLink**:\n    - CMake: `ninja cdc_msc-jlink`\n    - Make: `make BOARD=raspberry_pi_pico flash-jlink`\n- **Flash with OpenOCD**:\n    - CMake: `ninja cdc_msc-openocd`\n    - Make: `make BOARD=raspberry_pi_pico flash-openocd`\n- **Generate UF2**:\n    - CMake: `ninja cdc_msc-uf2`\n    - Make: `make BOARD=raspberry_pi_pico all uf2`\n- **List all targets** (CMake/Ninja): `ninja -t targets`\n- **Espressif flash**:\n    - Run `. $HOME/code/esp-idf/export.sh`\n    - `cd examples/device/cdc_msc_freertos`\n    - `idf.py -DBOARD=espressif_s3_devkitc flash`\n- **Espressif serial monitor / chip log output**:\n    - Run `. $HOME/code/esp-idf/export.sh`\n    - `cd examples/device/cdc_msc_freertos`\n    - `idf.py -DBOARD=espressif_s3_devkitc monitor`\n\n## GDB Debugging\n\nLook up the board's `JLINK_DEVICE` and `OPENOCD_OPTION` from `hw/bsp/*/boards/*/board.cmake` (or `board.mk`).\n\n### JLinkGDBServer\n\n**Terminal 1 – start the GDB server:**\n```bash\nJLinkGDBServer -device stm32h743xi -if SWD -speed 4000 \\\n  -port 2331 -swoport 2332 -telnetport 2333 -nogui\n```\n\n**Terminal 2 – connect GDB:**\n```bash\narm-none-eabi-gdb /tmp/build/firmware.elf\n(gdb) target remote :2331\n(gdb) monitor reset halt\n(gdb) load\n(gdb) continue\n```\n\nTo break on entry instead of running immediately:\n```bash\n(gdb) monitor reset halt\n(gdb) load\n(gdb) break main\n(gdb) continue\n```\n\n### OpenOCD\n\n**Terminal 1 – start the GDB server:**\n```bash\nopenocd -f interface/stlink.cfg -f target/stm32h7x.cfg\n# or with J-Link probe:\nopenocd -f interface/jlink.cfg -f target/stm32h7x.cfg\n```\n\nFor **rp2040/rp2350** with a CMSIS-DAP probe (e.g. Picoprobe, debugprobe):\n```bash\nopenocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c \"adapter speed 5000\"\n# or for rp2350:\nopenocd -f interface/cmsis-dap.cfg -f target/rp2350.cfg -c \"adapter speed 5000\"\n```\n\nFor boards that define `OPENOCD_OPTION` in `board.cmake`, use those options directly:\n```bash\nopenocd $(cat hw/bsp/FAMILY/boards/BOARD/board.cmake | grep OPENOCD_OPTION | ...)\n```\n\n**Terminal 2 – connect GDB (OpenOCD default port is 3333):**\n```bash\narm-none-eabi-gdb /tmp/build/firmware.elf\n(gdb) target remote :3333\n(gdb) monitor reset halt\n(gdb) load\n(gdb) continue\n```\n\n### RTT Logging with JLinkGDBServer\n\n- Build with RTT logging enabled (example):\n  `cd examples/device/cdc_msc && make BOARD=stm32h743eval LOG=2 LOGGER=rtt all`\n- Flash with J-Link:\n  `cd examples/device/cdc_msc && make BOARD=stm32h743eval LOG=2 LOGGER=rtt flash-jlink`\n- Launch GDB server with RTT port (keep this running in terminal 1):\n  `JLinkGDBServer -device stm32h743xi -if SWD -speed 4000 -port 2331 -swoport 2332 -telnetport 2333 -RTTTelnetPort 19021 -nogui`\n- Read RTT output (terminal 2):\n  `JLinkRTTClient`\n- Capture RTT to file (optional):\n  `JLinkRTTClient | tee rtt.log`\n- For non-interactive capture:\n  `timeout 20s JLinkRTTClient > rtt.log`\n\n## Unit Testing\n\n- Install Ceedling: `sudo gem install ceedling`\n- Run all unit tests: `cd test/unit-test && ceedling` or `cd test/unit-test && ceedling test:all` -- takes 4 seconds.\n  NEVER CANCEL. Set timeout to 10+ minutes.\n- Run specific test: `cd test/unit-test && ceedling test:test_fifo`\n- Tests use Unity framework with CMock for mocking\n\n## Hardware-in-the-Loop (HIL) Testing\n\n- `-B examples` means `examples` is the parent folder that contains multi-board build outputs such as `examples/cmake-build-BOARD_NAME/...`\n- Select config file before running HIL tests:\n    - if GitHub Actions self-hosted runner service is running, use `tinyusb.json`\n    - otherwise use `local.json`\n    - example:\n      `HIL_CONFIG=$( (systemctl list-units --type=service --state=running 2>/dev/null; systemctl --user list-units --type=service --state=running 2>/dev/null) | grep -q 'actions\\.runner' && echo tinyusb.json || echo local.json )`\n- Run tests on actual hardware, one of following ways:\n    - test a specific board `python test/hil/hil_test.py -b BOARD_NAME -B examples $HIL_CONFIG`\n    - test all boards in config `python test/hil/hil_test.py -B examples $HIL_CONFIG`\n- In case of error, enabled verbose mode with `-v` flag for detailed logs. Also try to observe script output, and try to\n  modify hil_test.py (temporarily) to add more debug prints to pinpoint the issue.\n- Requires pre-built (all) examples for target boards (see Build Examples section 2)\n\ntake 2-5 minutes. NEVER CANCEL. Set timeout to 20+ minutes.\n\n## Documentation\n\n- Install requirements: `pip install -r docs/requirements.txt`\n- Build docs: `cd docs && sphinx-build -b html . _build` -- takes 2-3 seconds. NEVER CANCEL. Set timeout to 10+ minutes.\n\n## Code Size Metrics\n\nGenerate and compare code size metrics to evaluate the impact of changes. This is the most common workflow\nwhen making code changes — use it to verify size impact before committing.\n\n**Quick single-board metrics (preferred for iterative development):**\n\n```bash\nrm -rf cmake-build\npython3 tools/build.py -b raspberry_pi_pico --target all --target tinyusb_metrics\npython3 tools/metrics.py combine -j -m -f tinyusb/src cmake-build/cmake-build-*/metrics.json\n```\n\nThis builds all examples for one board and produces `metrics.json` + `metrics.md`. Takes ~30 seconds.\nNEVER CANCEL. Set timeout to 10+ minutes.\n\n**Comparing with master (before/after workflow):**\n\n1. On master: build and save baseline\n   ```bash\n   rm -rf cmake-build\n   python3 tools/build.py -b raspberry_pi_pico --target all --target tinyusb_metrics\n   python3 tools/metrics.py combine -j -m -f tinyusb/src cmake-build/cmake-build-*/metrics.json\n   mv metrics.json metrics_master.json\n   ```\n2. Switch to your branch: rebuild\n   ```bash\n   rm -rf cmake-build\n   python3 tools/build.py -b raspberry_pi_pico --target all --target tinyusb_metrics\n   python3 tools/metrics.py combine -j -m -f tinyusb/src cmake-build/cmake-build-*/metrics.json\n   ```\n3. Compare: `python3 tools/metrics.py compare -m -f tinyusb/src metrics_master.json metrics.json`\n   Produces `metrics_compare.md` showing size differences.\n\n**Full CI metrics (all arm-gcc families, for thorough validation):**\n\n```bash\nrm -rf cmake-build\nFAMILIES=$(python3 .github/workflows/ci_set_matrix.py | python3 -c \"import sys,json; d=json.load(sys.stdin); print(' '.join(d.get('arm-gcc',[])))\")\npython3 tools/build.py --one-first --target all --target tinyusb_metrics $FAMILIES\npython3 tools/metrics.py combine -j -m -f tinyusb/src cmake-build/cmake-build-*/metrics.json\n```\n\nBuilds the first board of each family. Takes 2-4 minutes. NEVER CANCEL. Set timeout to 10+ minutes.\n\n## Code Quality and Validation\n\n- Format code: `clang-format -i path/to/file.c` (uses `.clang-format` config)\n- Check spelling: `pip install codespell && codespell` (uses `.codespellrc` config)\n- Pre-commit hooks validate unit tests and code quality automatically\n\n## Static Analysis with PVS-Studio\n\n- **Analyze whole project**:\n  ```bash\n  pvs-studio-analyzer analyze -f examples/cmake-build-raspberry_pi_pico/compile_commands.json -R .PVS-Studio/.pvsconfig -o pvs-report.log -j12 --dump-files --misra-cpp-version 2008 --misra-c-version 2023 --use-old-parser\n  ```\n- **Analyze specific source files**:\n  ```bash\n  pvs-studio-analyzer analyze -f examples/cmake-build-raspberry_pi_pico/compile_commands.json -R .PVS-Studio/.pvsconfig -S path/to/file.c -o pvs-report.log -j12 --dump-files --misra-cpp-version 2008 --misra-c-version 2023 --use-old-parser\n  ```\n- **Multiple specific files**:\n  ```bash\n  pvs-studio-analyzer analyze -f examples/cmake-build-raspberry_pi_pico/compile_commands.json -R .PVS-Studio/.pvsconfig -S src/file1.c -S src/file2.c -o pvs-report.log -j12 --dump-files --misra-cpp-version 2008 --misra-c-version 2023 --use-old-parser\n  ```\n- Requires `compile_commands.json` in the build directory (generated by CMake with `-DCMAKE_EXPORT_COMPILE_COMMANDS=ON`)\n- Use `-f` option to specify path to `compile_commands.json`\n- Use `-R .PVS-Studio/.pvsconfig` to specify rule configuration file\n- Use `-j12` for parallel analysis with 12 threads\n- `--dump-files` saves preprocessed files for debugging\n- `--misra-c-version 2023` enables MISRA C:2023 checks\n- `--misra-cpp-version 2008` enables MISRA C++:2008 checks\n- `--use-old-parser` uses legacy parser for compatibility\n- Analysis takes ~10-30 seconds depending on project size. Set timeout to 5+ minutes.\n- View results: `plog-converter -a GA:1,2 -t errorfile pvs-report.log` or open in PVS-Studio GUI\n\n## Validation Checklist\n\n### ALWAYS Run These After Making Changes\n\n1. **Pre-commit validation** (RECOMMENDED): `pre-commit run --all-files`\n    - Install pre-commit: `pip install pre-commit && pre-commit install`\n    - Runs all quality checks, unit tests, spell checking, and formatting\n    - Takes 10-15 seconds. NEVER CANCEL. Set timeout to 15+ minutes.\n2. **Build validation**: Build at least one board with all example that exercises your changes, see Build Examples\n   section (option 2)\n3. Run unit tests relevant to touched modules; add fuzz/HIL coverage when modifying parsers or protocol state machines.\n\n### Manual Testing Scenarios\n- **Device examples**: Cannot be fully tested without real hardware, but must build successfully\n- **Unit tests**: Exercise core stack functionality - ALL tests must pass\n- **Build system**: Must be able to build examples for multiple board families\n\n### Board Selection for Testing\n- **STM32F4**: `stm32f407disco` - no external SDK required, good for testing\n- **RP2040**: `raspberry_pi_pico` - requires Pico SDK, commonly used\n- **Other families**: Check `hw/bsp/FAMILY/boards/` for available boards\n\n## Release Instructions\n\n**DO NOT commit files automatically - only modify files and let the maintainer review before committing.**\n\n1. Bump the release version variable at the top of `tools/make_release.py`.\n2. Execute `python3 tools/make_release.py` to refresh:\n   - `src/tusb_option.h` (version defines)\n   - `repository.yml` (version mapping)\n   - `library.json` (PlatformIO version)\n   - `sonar-project.properties` (SonarQube version)\n   - `docs/reference/boards.rst` (generated board documentation)\n   - `hw/bsp/BoardPresets.json` (CMake presets)\n3. Generate release notes for `docs/info/changelog.rst`:\n   - Get commit list: `git log <last-release-tag>..HEAD --oneline`\n   - **Visit GitHub PRs** for merged pull requests to understand context and gather details\n   - Use GitHub tools to search/read PRs: `github-mcp-server-list_pull_requests`, `github-mcp-server-pull_request_read`\n   - Extract key changes, API modifications, bug fixes, and new features from PR descriptions\n   - Add new changelog entry following the existing format:\n     - Version heading with equals underline (e.g., `0.20.0` followed by `======`)\n     - Release date in italics (e.g., `*November 19, 2024*`)\n     - Major sections: General, API Changes, Controller Driver (DCD & HCD), Device Stack, Host Stack, Testing\n     - Use bullet lists with descriptive categorization\n     - Reference function names, config macros, and file paths using RST inline code (double backticks)\n     - Include meaningful descriptions, not just commit messages\n4. **Validation before commit**:\n   - Run unit tests: `cd test/unit-test && ceedling test:all`\n   - Build at least one example: `cd examples/device/cdc_msc && make BOARD=stm32f407disco all`\n   - Verify changed files look correct: `git diff --stat`\n5. **Leave files unstaged** for maintainer to review, modify if needed, and commit with message: `Bump version to X.Y.Z`\n6. **After maintainer commits**: Create annotated tag with `git tag -a vX.Y.Z -m \"Release X.Y.Z\"`\n7. Push commit and tag: `git push origin <branch> && git push origin vX.Y.Z`\n8. Create GitHub release from the tag with changelog content\n\n## Repository Structure Quick Reference\n```\n├── src/                  # Core TinyUSB stack\n│   ├── class/            # USB device classes (CDC, HID, MSC, Audio, etc.)\n│   ├── portable/         # MCU-specific drivers (organized by vendor)\n│   ├── device/           # USB device stack core\n│   ├── host/             # USB host stack core\n│   └── common/           # Shared utilities (FIFO, etc.)\n├── examples/             # Example applications\n│   ├── device/           # Device examples (cdc_msc, hid_generic, etc.)\n│   ├── host/             # Host examples\n│   └── dual/             # Dual-role examples\n├── hw/bsp/               # Board Support Packages\n│   └── FAMILY/boards/    # Board-specific configurations\n├── test/unit-test/       # Unit tests using Ceedling\n├── tools/                # Build and utility scripts\n└── docs/                 # Sphinx documentation\n```\n\n#### Build Time Reference\n- **Dependency fetch**: <1 second\n- **Single example build**: 1-3 seconds\n- **Unit tests**: ~4 seconds\n- **Documentation build**: ~2.5 seconds\n- **Full board examples**: 15-20 seconds\n- **Toolchain installation**: 2-5 minutes (one-time)\n\n#### Key Files to Know\n- `tools/get_deps.py`: Manages dependencies for MCU families\n- `tools/build.py`: Builds multiple examples, supports make/cmake\n- `src/tusb.h`: Main TinyUSB header file\n- `src/tusb_config.h`: Configuration template\n- `examples/device/cdc_msc/`: Most commonly used example for testing\n- `test/unit-test/project.yml`: Ceedling test configuration\n\n#### MCU Reference Manuals and Datasheets\n- Look in `$HOME/Documents/Calibre Library` for all MCU reference manuals, datasheets and board schematics.\n\n#### Debugging Build Issues\n- **Missing compiler**: Install `gcc-arm-none-eabi` package\n- **Missing dependencies**: Run `python3 tools/get_deps.py FAMILY`\n- **Board not found**: Check `hw/bsp/FAMILY/boards/` for valid board names\n- **objcopy errors**: Often non-critical in full builds, try individual example builds\n\n#### Working with USB Device Classes\n- **CDC (Serial)**: `src/class/cdc/` - Virtual serial port\n- **HID**: `src/class/hid/` - Human Interface Device (keyboard, mouse, etc.)\n- **MSC**: `src/class/msc/` - Mass Storage Class (USB drive)\n- **Audio**: `src/class/audio/` - USB Audio Class\n- Each class has device (`*_device.c`) and host (`*_host.c`) implementations\n\n#### MCU Family Support\n- **STM32**: Largest support (F0, F1, F2, F3, F4, F7, G0, G4, H7, L4, U5, etc.)\n- **Raspberry Pi**: RP2040, RP2350 with PIO-USB host support\n- **NXP**: iMXRT, Kinetis, LPC families\n- **Microchip**: SAM D/E/G/L families\n- Check `hw/bsp/` for complete list and `docs/reference/boards.rst` for details\n\n### Code Style Guidelines\n\n#### General Coding Standards\n- Use C99 standard\n- Memory-safe: no dynamic allocation\n- Thread-safe: defer all interrupt events to non-ISR task functions\n- 2-space indentation, no tabs\n- Use snake_case for variables/functions\n- Use UPPER_CASE for macros and constants\n- Follow existing variable naming patterns in files you're modifying\n- Include proper header comments with MIT license\n- Add descriptive comments for non-obvious functions\n\n#### Best Practices\n- When including headers, group in order: C stdlib, tusb common, drivers, classes\n- Always check return values from functions that can fail\n- Use TU_ASSERT() for error checking with return statements\n- Follow the existing code patterns in the files you're modifying\n\nRemember: TinyUSB is designed for embedded systems - builds are fast, tests are focused, and the codebase is optimized for resource-constrained environments.\n"
  },
  {
    "path": "CODE_OF_CONDUCT.rst",
    "content": "***************\nCode of Conduct\n***************\n\nOur Pledge\n----------\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our\nproject and our community a harassment-free experience for everyone,\nregardless of age, body size, disability, ethnicity, sex\ncharacteristics, gender identity and expression, level of experience,\neducation, socio-economic status, nationality, personal appearance,\nrace, religion, or sexual identity and orientation.\n\nOur Standards\n-------------\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n-  Using welcoming and inclusive language\n-  Being respectful of differing viewpoints and experiences\n-  Gracefully accepting constructive criticism\n-  Focusing on what is best for the community\n-  Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n-  The use of sexualized language or imagery and unwelcome sexual\n   attention or advances\n-  Trolling, insulting/derogatory comments, and personal or political\n   attacks\n-  Public or private harassment\n-  Publishing others' private information, such as a physical or\n   electronic address, without explicit permission\n-  Other conduct which could reasonably be considered inappropriate in a\n   professional setting\n\nOur Responsibilities\n--------------------\n\nProject maintainers are responsible for clarifying the standards of\nacceptable behavior and are expected to take appropriate and fair\ncorrective action in response to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit,\nor reject comments, commits, code, wiki edits, issues, and other\ncontributions that are not aligned to this Code of Conduct, or to ban\ntemporarily or permanently any contributor for other behaviors that they\ndeem inappropriate, threatening, offensive, or harmful.\n\nScope\n-----\n\nThis Code of Conduct applies both within project spaces and in public\nspaces when an individual is representing the project or its community.\nExamples of representing a project or community include using an\nofficial project e-mail address, posting via an official social media\naccount, or acting as an appointed representative at an online or\noffline event. Representation of a project may be further defined and\nclarified by project maintainers.\n\nEnforcement\n-----------\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may\nbe reported by contacting the project team at thach@tinyusb.org. All\ncomplaints will be reviewed and investigated and will result in a\nresponse that is deemed necessary and appropriate to the circumstances.\nThe project team is obligated to maintain confidentiality with regard to\nthe reporter of an incident. Further details of specific enforcement\npolicies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in\ngood faith may face temporary or permanent repercussions as determined\nby other members of the project's leadership.\n\nAttribution\n-----------\n\nThis Code of Conduct is adapted from the `Contributor\nCovenant <https://www.contributor-covenant.org>`__, version 1.4,\navailable at\nhttps://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "CONTRIBUTORS.rst",
    "content": "************\nContributors\n************\n\nSpecial thanks to all the people who spent their precious time and effort to help this project so far.\nlist contributors and their awesome work for the stack:\n\nNotable contributors\n====================\n\n(sorted alphabetically)\n\n`Adafruit Team <https://github.com/adafruit>`__\n-----------------------------------------------\n\n-  Main supporter and sponsor for hardware boards and kits\n-  Discussion and suggestion for feature and improvement\n-  Design the project logo\n\n\n`Gordon McNab <https://github.com/ftdigdm>`__\n---------------------------------------------\n\n-  Add new DCD port for Bridgetek FT90x and FT93x\n\n\n`Ha Thach <https://github.com/hathach>`__\n-----------------------------------------\n\n-  *Author and maintainer*\n-  Most features development\n\n\n`Heiko Kuester <https://github.com/IngHK>`__\n--------------------------------------------\n\n-  Add CH34x and PL2303 support (CDC host)\n-  Improve FTDI and CP210x support (CDC host)\n\n\n`Hristo Gochkov <https://github.com/me-no-dev>`__\n-------------------------------------------------\n\n-  Improve ESP32s2 DCD\n\n\n`Jacob Berg Potter <https://github.com/j4cbo>`__\n------------------------------------------------\n\n-  Add new class driver for network CDC-NCM\n\n\n`Jan Dümpelmann <https://github.com/duempel>`__\n-----------------------------------------------\n\n-  Improve transfer performance for Synopsys DCD for STM32 MCUs\n\n\n`Jeff Epler <https://github.com/jepler>`__\n------------------------------------------\n\n-  Improve MIDI class driver\n\n\n`Jerzy Kasenberg <https://github.com/kasjer>`__\n-----------------------------------------------\n\n-  Add new DCD port for Dialog DA1469x\n-  Add new DCD port for PIC32MZ\n-  Add new class driver for Bluetooth HCI\n-  Add ISO transfer for STM32 Synopsys, Nordic nRF, Dialog DA1469x\n-  Improve Audio driver and add uac2\\_headset example\n-  Improve STM32 Synopsys DCD with various PRs\n\n\n`J McCarthy <https://github.com/xmos-jmccarthy>`__\n--------------------------------------------------\n\n-  Add new DFU 1.1 class driver\n-  Add new example for dfu\n\n\n`Kamil Tomaszewski <https://github.com/kamtom480>`__\n----------------------------------------------------\n\n-  Add new DCD port for Sony CXD56 (spresnese board)\n\n\n`Kay Sievers <https://github.com/kaysievers>`__\n-----------------------------------------------\n\n-  Improve MIDI driver with packet API\n\n\n`Koji KITAYAMA <https://github.com/kkitayam>`__\n-----------------------------------------------\n\n-  Add new DCD and HCD port for NXP Kinetis KL25\n-  Add new DCD and HCD port for Renesas RX family (RX600, RX700 ..) with GR-CITRUS, RX65n target board\n-  Add new DCD and HCD port for Mentor musb with MSP432E4\n-  Add new class driver for USB Video Class (UVC 1.5)\n\n`Nathan Conrad <https://github.com/pigrew>`__\n---------------------------------------------\n\n-  Add new DCD port for STM32 fsdev Fullspeed device for STM32 L0,\n   F0, F1, F3 etc ...\n-  Add new class driver for USB Test and Measurement Class (USBTMC)\n-  Various improvement e.g Zero-length packet, Lint setup\n-  Board support for STM32F070RB Nucleo, STM32F303 Discovery\n\n\n`Peter Lawrence <https://github.com/majbthrd>`__\n------------------------------------------------\n\n-  Add new DCD port for Nuvoton NUC 120, 121, 125, 126, 505\n-  Add new class driver for network RNDIS, CDC-ECM\n-  Enhance CDC-NCM network driver to compatible with RNDIS/ECM\n-  Add *net\\_lwip\\_webserver* example for demonstration of usbnet with lwip\n-  Board support for NuTiny NUC120, NUC121s, NUC125s, NUC126V, NUC505\n-  Improve multiple cdc interfaces API & add cdc\\_dual\\_ports example\n\n\n`Rafael Silva <https://github.com/perigoso>`__\n----------------------------------------------\n\n-  Port DCD Synopsys to support Silabs EFM32GG12 with SLTB009A board\n-  Rewrite documentation in rst and setup for readthedocs\n-  Generalize Renesas driver and support RA family with EK-RA4M3 board\n\n\n`Raspberry Pi Team <https://github.com/raspberrypi>`__\n------------------------------------------------------\n\n-  Add new DCD port for Raspberry Pi RP2040\n-  Add new HCD port for Raspberry Pi RP2040\n\n\n`Reinhard Panhuber <https://github.com/PanRe>`__\n------------------------------------------------\n\n-  Add new class driver for USB Audio Class 2.0 (UAC2)\n-  Rework tu\\_fifo with unmasked pointer, add DMA support, and constant address support\n-  Add new DCD/USBD edpt\\_xfer\\_fifo() API for optimizing endpoint transfer\n-  Add and greatly improve Isochronous transfer\n-  Add new audio examples: audio\\_test and audio\\_4\\_channel\\_mic\n\n\n`Scott Shawcroft <https://github.com/tannewt>`__\n------------------------------------------------\n\n-  Add new DCD port for SAMD21 and SAMD51\n-  Add new class driver for Musical Instrument Digital Interface (MIDI)\n-  Improve USBD control transfer, MSC, CDC class driver\n-  Board support for Metro M0 & M4 express\n-  Write the excellent porting.md documentation\n-  Add initial Makefile\n\n`Sean Cross <https://github.com/xobs>`__\n----------------------------------------\n\n-  Add new DCD port for ValentyUSB eptri (fomu board)\n\n\n`Sylvain \"tnt\" Munaut <https://github.com/smunaut>`__\n-----------------------------------------------------\n\n-  Add new class driver for DFU Runtime\n\n\n`Tian Yunhao <https://github.com/t123yh>`__\n-------------------------------------------\n\n-  Add new DCD port for Allwinner F1C100S/F1C200S\n-  Add support for osal_rtx4\n\n`Timon Skerutsch <https://github.com/PTS93>`__\n----------------------------------------------\n\n-  Add hid\\_test.js script and extensive test for bi-directional raw HID\n\n\n`Tod E. Kurt <https://github.com/todbot>`__\n-------------------------------------------\n\n-  Add hid\\_test.js script and extensive test for bi-directional raw HID\n\n\n`Uwe Bonnes <https://github.com/UweBonnes>`__\n---------------------------------------------\n\n-  Improve STM32 Synopsys highspeed DCD\n\n\n`William D. Jones <https://github.com/cr1901>`__\n------------------------------------------------\n\n-  Add new DCD port for Synopsys DesignWare for STM32 L4, F2, F4,\n   F7, H7 etc ...\n-  Add new DCD port for TI MSP430\n-  Board support for STM32F407 Discovery, STM32H743 Nucleo, pyboard v1.1, msp\\_exp430f5529lp etc ...\n\n\n`Zixun Li <https://github.com/HiFiPhile>`__\n-------------------------------------------\n\n-  Add new DCD port for Microchip SAMx7x\n-  Add IAR compiler support\n-  Improve UAC2, CDC, DFU class driver\n-  Improve stm32_fsdev, chipidea_ci_hs, lpc_ip3511 DCD\n-  Host IAR Build CI & hardware in the loop (HITL) test\n\n\n`Full contributors list <https://github.com/hathach/tinyusb/contributors>`__\n============================================================================\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2012-2026, hathach (tinyusb.org)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.rst",
    "content": "TinyUSB\n=======\n\n|Build Status| |CircleCI Status| |Documentation Status| |Static Analysis| |Fuzzing Status| |Membrowse| |License|\n\nSponsors\n--------\n\nTinyUSB is funded by: Adafruit. Purchasing products from them helps to support this project.\n\n.. figure:: docs/assets/adafruit_logo.svg\n   :alt: Adafruit Logo\n   :align: left\n   :target: https://www.adafruit.com\n\n.. raw:: html\n\n   <div class=\"clear-both\"></div>\n\nOverview\n--------\n\n.. figure:: docs/assets/logo.svg\n   :alt: TinyUSB\n   :align: left\n\n.. raw:: html\n\n   <div class=\"clear-both\"></div>\n\nTinyUSB is an open-source cross-platform USB Host/Device stack for embedded systems. It’s designed for memory safety\n(no dynamic allocation) and thread safety (all interrupts deferred to non-ISR task functions). The stack emphasizes portability,\nsmall footprint, and real-time performance across 50+ MCU families.\n\nKey Features\n------------\n\n* **Thread-safe:** USB interrupts deferred to task context\n* **Memory-safe:** No dynamic allocation, all buffers static\n* **Portable:** Supports 50+ MCU families\n* **Comprehensive:** Includes CDC, HID, MSC, Audio, and Host support\n* **RTOS-friendly:** Works with bare metal, FreeRTOS, RT-Thread, and Mynewt\n\n.. figure:: docs/assets/stack.svg\n   :width: 500px\n   :align: left\n   :alt: stackup\n\n.. raw:: html\n\n   <div class=\"clear-both\"></div>\n\n::\n\n    .\n    ├── docs            # Documentation\n    ├── examples        # Examples with make and cmake build system\n    ├── hw\n    │   ├── bsp         # Supported boards source files\n    │   └── mcu         # Low level mcu core & peripheral drivers\n    ├── lib             # Sources from 3rd party such as FreeRTOS, FatFs ...\n    ├── src             # All sources files for TinyUSB stack itself.\n    ├── test            # Tests: unit test, fuzzing, hardware test\n    └── tools           # Files used internally\n\n\nGetting started\n---------------\n\nSee the `online documentation <https://docs.tinyusb.org>`_ for information about using TinyUSB and how it is implemented.\n\nCheck out `Getting Started`_ guide for adding TinyUSB to your project or building the examples. If you are new to TinyUSB, we recommend starting with the ``cdc_msc`` example. There is a handful of `Supported Boards`_ that should work out of the box.\n\nWe use `GitHub Discussions <https://github.com/hathach/tinyusb/discussions>`_ as our forum. It is a great place to ask questions and advice from the community or to discuss your TinyUSB-based projects.\n\nFor bugs and feature requests, please `raise an issue <https://github.com/hathach/tinyusb/issues>`_ and follow the templates there.\n\nSee `Porting`_ guide for adding support for new MCUs and boards.\n\nDevice Stack\n------------\n\nSupports multiple device configurations by dynamically changing USB descriptors, low power functions such like suspend, resume, and remote wakeup. The following device classes are supported:\n\n-  Audio Class 1.0/2.0 (UAC1/UAC2)\n-  Bluetooth Host Controller Interface (BTH HCI)\n-  Communication Device Class (CDC)\n-  Device Firmware Update (DFU): DFU mode (WIP) and Runtime\n-  Human Interface Device (HID): Generic (In & Out), Keyboard, Mouse, Gamepad etc ...\n-  Printer class\n-  Mass Storage Class (MSC): with multiple LUNs\n-  Musical Instrument Digital Interface (MIDI)\n-  Media Transfer Protocol (MTP/PTP)\n-  Network with RNDIS, Ethernet Control Model (ECM), Network Control Model (NCM)\n-  Test and Measurement Class (USBTMC)\n-  Video class 1.5 (UVC): work in progress\n-  Vendor-specific class support with generic In & Out endpoints. Can be used with MS OS 2.0 compatible descriptor to load winUSB driver without INF file.\n-  `WebUSB <https://github.com/WICG/webusb>`__ with vendor-specific class\n\nIf you have a special requirement, ``usbd_app_driver_get_cb()`` can be used to write your own class driver without modifying the stack. Here is how the RPi team added their reset interface `raspberrypi/pico-sdk#197 <https://github.com/raspberrypi/pico-sdk/pull/197>`_\n\nHost Stack\n----------\n\n- Communication Device Class: CDC-ACM\n- Vendor serial over USB: FTDI, CP210x, CH34x, PL2303\n- Human Interface Device (HID): Keyboard, Mouse, Generic\n- Mass Storage Class (MSC)\n- Musical Instrument Digital Interface (MIDI)\n- Hub with multiple-level support\n\nSimilar to the Device Stack, if you have a special requirement, ``usbh_app_driver_get_cb()`` can be used to write your own class driver without modifying the stack.\n\nPower Delivery Stack\n--------------------\n\n- Power Delivery 3.0 (PD3.0) with USB Type-C support (WIP)\n- Super early stage, only for testing purpose\n- Only support STM32 G4\n\nOS Abstraction layer\n--------------------\n\nTinyUSB is completely thread-safe by pushing all Interrupt Service Request (ISR) events into a central queue, then processing them later in the non-ISR context task function. It also uses semaphore/mutex to access shared resources such as Communication Device Class (CDC) FIFO. Therefore the stack needs to use some of the OS's basic APIs. Following OSes are already supported out of the box.\n\n- **No OS**\n- **FreeRTOS**\n- `RT-Thread <https://github.com/RT-Thread/rt-thread>`_: `repo <https://github.com/RT-Thread-packages/tinyusb>`_\n- **Mynewt** Due to the newt package build system, Mynewt examples are better to be on its `own repo <https://github.com/hathach/mynewt-tinyusb-example>`_\n\nSupported CPUs\n--------------\n\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Manufacturer | Family                      | Device | Host | Highspeed | Driver                 | Note               |\n+==============+=============================+========+======+===========+========================+====================+\n| Allwinner    | F1C100s/F1C200s             | ✔      |      | ✔         | sunxi                  | musb variant       |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Analog       | MAX3421E                    |        | ✔    | ✖         | max3421                | via SPI            |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | MAX32 650, 666, 690,        | ✔      |      | ✔         | musb                   | 1-dir ep           |\n|              | MAX78002                    |        |      |           |                        |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Artery AT32  | F403a_407, F413             | ✔      |      |           | fsdev                  | 512 USB RAM        |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | F415, F435_437, F423,       | ✔      | ✔    |           | dwc2                   |                    |\n|              | F425, F45x                  |        |      |           |                        |                    |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | F402_F405                   | ✔      | ✔    | ✔         | dwc2                   | F405 is HS         |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Bridgetek    | FT90x                       | ✔      |      | ✔         | ft9xx                  | 1-dir ep           |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Broadcom     | BCM2711, BCM2837            | ✔      |      | ✔         | dwc2                   |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Dialog       | DA1469x                     | ✔      | ✖    | ✖         | da146xx                |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Espressif    | S2, S3, H4                  | ✔      | ✔    | ✖         | dwc2                   |                    |\n| ESP32        +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | P4                          | ✔      | ✔    | ✔         | dwc2                   |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| GigaDevice   | GD32VF103                   | ✔      |      | ✖         | dwc2                   |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| HPMicro      | HPM6750                     | ✔      | ✔    | ✔         | ci_hs, ehci            |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Infineon     | XMC4500                     | ✔      | ✔    | ✖         | dwc2                   |                    |\n+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+\n| MicroChip    | SAM | D11, D21, L21, L22    | ✔      |      | ✖         | samd                   |                    |\n|              |     +-----------------------+--------+------+-----------+------------------------+--------------------+\n|              |     | D51, E5x              | ✔      |      | ✖         | samd                   |                    |\n|              |     +-----------------------+--------+------+-----------+------------------------+--------------------+\n|              |     | G55                   | ✔      |      | ✖         | samg                   | 1-dir ep           |\n|              |     +-----------------------+--------+------+-----------+------------------------+--------------------+\n|              |     | E70,S70,V70,V71       | ✔      |      | ✔         | samx7x                 | 1-dir ep           |\n|              +-----+-----------------------+--------+------+-----------+------------------------+--------------------+\n|              | PIC | 24                    | ✔      |      |           | pic                    | ci_fs variant      |\n|              |     +-----------------------+--------+------+-----------+------------------------+--------------------+\n|              |     | 32 mm, mk, mx         | ✔      |      |           | pic                    | ci_fs variant      |\n|              |     +-----------------------+--------+------+-----------+------------------------+--------------------+\n|              |     | dsPIC33               | ✔      |      |           | pic                    | ci_fs variant      |\n|              |     +-----------------------+--------+------+-----------+------------------------+--------------------+\n|              |     | 32mz                  | ✔      |      |           | pic32mz                | musb variant       |\n+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+\n| MindMotion   | mm32                        | ✔      |      | ✖         | mm32f327x_otg          | ci_fs variant      |\n+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+\n| NordicSemi   | nRF 52833, 52840, 5340      | ✔      | ✖    | ✖         | nrf5x                  | only ep8 is ISO    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Nuvoton      | NUC120                      | ✔      | ✖    | ✖         | nuc120                 |                    |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | NUC121/NUC125, NUC126       | ✔      | ✖    | ✖         | nuc121                 |                    |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | NUC505                      | ✔      |      | ✔         | nuc505                 |                    |\n+--------------+---------+-------------------+--------+------+-----------+------------------------+--------------------+\n| NXP          | iMXRT   | RT 10xx, 11xx     | ✔      | ✔    | ✔         | ci_hs, ehci            |                    |\n|              +---------+-------------------+--------+------+-----------+------------------------+--------------------+\n|              | Kinetis | KL                | ✔      | ⚠    | ✖         | ci_fs, khci            |                    |\n|              |         +-------------------+--------+------+-----------+------------------------+--------------------+\n|              |         | K32L2             | ✔      |      | ✖         | khci                   | ci_fs variant      |\n|              +---------+-------------------+--------+------+-----------+------------------------+--------------------+\n|              | LPC     | 11u, 13, 15       | ✔      | ✖    | ✖         | lpc_ip3511             |                    |\n|              |         +-------------------+--------+------+-----------+------------------------+--------------------+\n|              |         | 17, 40            | ✔      | ⚠    | ✖         | lpc17_40, ohci         |                    |\n|              |         +-------------------+--------+------+-----------+------------------------+--------------------+\n|              |         | 18, 43            | ✔      | ✔    | ✔         | ci_hs, ehci            |                    |\n|              |         +-------------------+--------+------+-----------+------------------------+--------------------+\n|              |         | 51u               | ✔      | ✖    | ✖         | lpc_ip3511             |                    |\n|              |         +-------------------+--------+------+-----------+------------------------+--------------------+\n|              |         | 54                | ⚠      | ⚠    | ✔         | lpc_ip3511, lpc_ip3516 | NRND, read errata  |\n|              |         +-------------------+--------+------+-----------+------------------------+--------------------+\n|              |         | 55                | ✔      | ✔    | ✔         | lpc_ip3511, lpc_ip3516 |                    |\n|              +---------+-------------------+--------+------+-----------+------------------------+--------------------+\n|              | MCX     | N9                | ✔      |      | ✔         | ci_fs, ci_hs, ehci     |                    |\n|              |         +-------------------+--------+------+-----------+------------------------+--------------------+\n|              |         | A15               | ✔      |      |           | ci_fs                  |                    |\n|              +---------+-------------------+--------+------+-----------+------------------------+--------------------+\n|              | RW61x                       | ✔      | ✔    | ✔         | ci_hs, ehci            |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Raspberry Pi | RP2040, RP2350              | ✔      | ✔    | ✖         | rp2040, pio_usb        |                    |\n+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+\n| Renesas      | RX  | 63N, 65N, 72N         | ✔      | ✔    | ✖         | rusb2                  |                    |\n|              +-----+-----------------------+--------+------+-----------+------------------------+--------------------+\n|              | RA  | 4M1, 4M3, 6M1         | ✔      | ✔    | ✖         | rusb2                  |                    |\n|              |     +-----------------------+--------+------+-----------+------------------------+--------------------+\n|              |     | 6M5                   | ✔      | ✔    | ✔         | rusb2                  |                    |\n+--------------+-----+-----------------------+--------+------+-----------+------------------------+--------------------+\n| Silabs       | EFM32GG12                   | ✔      |      | ✖         | dwc2                   |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| Sony         | CXD56                       | ✔      | ✖    | ✔         | cxd56                  |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| ST STM32     | F0, F3, L0, L1, L5, WBx5    | ✔      | ✖    | ✖         | stm32_fsdev            |                    |\n|              +----+------------------------+--------+------+-----------+------------------------+--------------------+\n|              | F1 | 102, 103               | ✔      | ✖    | ✖         | stm32_fsdev            | 512 USB RAM        |\n|              |    +------------------------+--------+------+-----------+------------------------+--------------------+\n|              |    | 105, 107               | ✔      | ✔    | ✖         | dwc2                   |                    |\n|              +----+------------------------+--------+------+-----------+------------------------+--------------------+\n|              | F2, F4, F7, H7, H7RS        | ✔      | ✔    | ✔         | dwc2                   |                    |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | C0, G0, H5, U3              | ✔      | ✔    | ✖         | stm32_fsdev            | 2KB USB RAM        |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | G4                          | ✔      | ✖    | ✖         | stm32_fsdev            | 1KB USB RAM        |\n|              +----+------------------------+--------+------+-----------+------------------------+--------------------+\n|              | L4 | 4x2, 4x3               | ✔      | ✖    | ✖         | stm32_fsdev            | 1KB USB RAM        |\n|              |    +------------------------+--------+------+-----------+------------------------+--------------------+\n|              |    | 4x5, 4x6, 4+           | ✔      | ✔    | ✖         | dwc2                   |                    |\n|              +----+------------------------+--------+------+-----------+------------------------+--------------------+\n|              | N6                          | ✔      | ✔    | ✔         | dwc2                   |                    |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | U0                          | ✔      | ✖    | ✖         | stm32_fsdev            | 1KB USB RAM        |\n|              +----+------------------------+--------+------+-----------+------------------------+--------------------+\n|              | U5 | 535, 545               | ✔      | ✔    | ✖         | stm32_fsdev            | 2KB USB RAM        |\n|              |    +------------------------+--------+------+-----------+------------------------+--------------------+\n|              |    | 575, 585               | ✔      | ✔    | ✖         | dwc2                   |                    |\n|              |    +------------------------+--------+------+-----------+------------------------+--------------------+\n|              |    | 59x,5Ax,5Fx,5Gx        | ✔      | ✔    | ✔         | dwc2                   |                    |\n+--------------+----+------------------------+--------+------+-----------+------------------------+--------------------+\n| TI           | MSP430                      | ✔      | ✖    | ✖         | msp430x5xx             |                    |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | MSP432E4, TM4C123           | ✔      |      | ✖         | musb                   |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| ValentyUSB   | eptri                       | ✔      | ✖    | ✖         | eptri                  |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n| WCH          | CH32F20x                    | ✔      |      | ✔         | ch32_usbhs             |                    |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | CH32V20x                    | ✔      |      | ✖         | stm32_fsdev/ch32_usbfs |                    |\n|              +-----------------------------+--------+------+-----------+------------------------+--------------------+\n|              | CH32V305, CH32V307          | ✔      |      | ✔         | ch32_usbfs/hs          |                    |\n+--------------+-----------------------------+--------+------+-----------+------------------------+--------------------+\n\nTable Legend\n^^^^^^^^^^^^\n\n========= =========================\n✔         Supported\n⚠         Partial support\n✖         Not supported by hardware\n\\[empty\\] Unknown\n========= =========================\n\nDevelopment Tools\n-----------------\n\nThe following tools are provided freely to support the development of the TinyUSB project:\n\n- `IAR Build Tools (CX) <https://iar.com>`_ Professional IDE and compiler for embedded development.\n- `JetBrains CLion <https://www.jetbrains.com/clion/>`_ Cross-platform IDE for C and C++ development.\n- `PVS-Studio <https://pvs-studio.com/en/pvs-studio/?utm_source=website&utm_medium=github&utm_campaign=open_source>`_ static analyzer for C, C++, C#, and Java code.\n\n\n.. |Build Status| image:: https://github.com/hathach/tinyusb/actions/workflows/build.yml/badge.svg\n   :target: https://github.com/hathach/tinyusb/actions/workflows/build.yml\n.. |CircleCI Status| image:: https://dl.circleci.com/status-badge/img/circleci/4AYHvUhFxdnY4rA7LEsdqW/QmrpoL2AjGqetvFQNqtWyq/tree/master.svg?style=svg\n   :target: https://dl.circleci.com/status-badge/redirect/circleci/4AYHvUhFxdnY4rA7LEsdqW/QmrpoL2AjGqetvFQNqtWyq/tree/master\n.. |Documentation Status| image:: https://readthedocs.org/projects/tinyusb/badge/?version=latest\n   :target: https://docs.tinyusb.org/en/latest/?badge=latest\n.. |Static Analysis| image:: https://github.com/hathach/tinyusb/actions/workflows/static_analysis.yml/badge.svg\n   :target: https://github.com/hathach/tinyusb/actions/workflows/static_analysis.yml\n.. |Fuzzing Status| image:: https://oss-fuzz-build-logs.storage.googleapis.com/badges/tinyusb.svg\n   :target: https://oss-fuzz-build-logs.storage.googleapis.com/index.html#tinyusb\n.. |Membrowse| image:: https://membrowse.com/badge.svg\n   :target: https://membrowse.com/public/hathach/tinyusb\n.. |License| image:: https://img.shields.io/badge/license-MIT-brightgreen.svg\n   :target: https://opensource.org/licenses/MIT\n\n\n.. _Changelog: docs/info/changelog.rst\n.. _Contributors: CONTRIBUTORS.rst\n.. _Getting Started: docs/getting_started.rst\n.. _Supported Boards: docs/reference/boards.rst\n.. _Dependencies: docs/reference/dependencies.rst\n.. _Concurrency: docs/reference/concurrency.rst\n.. _Code of Conduct: CODE_OF_CONDUCT.rst\n.. _Porting: docs/porting.rst\n"
  },
  {
    "path": "SConscript",
    "content": "# RT-Thread building script for bridge\n\nimport os\nfrom building import *\n\nobjs = []\ncwd  = GetCurrentDir()\n\nobjs = objs + SConscript(cwd + '/lib/rt-thread/SConscript')\n\nReturn('objs')\n"
  },
  {
    "path": "docs/_static/custom.css",
    "content": ".clear-both {\n  clear: both;\n}\n"
  },
  {
    "path": "docs/conf.py",
    "content": "#!/usr/bin/env python3\n# Configuration file for the Sphinx documentation builder.\n#\n# This file only contains a selection of the most common options. For a full\n# list see the documentation:\n# https://www.sphinx-doc.org/en/master/usage/configuration.html\n\nimport re\nfrom pathlib import Path\n\n# -- Path setup --------------------------------------------------------------\n\n\n# -- Project information -----------------------------------------------------\n\nproject = 'TinyUSB'\ncopyright = '2025, Ha Thach'\nauthor = 'Ha Thach'\n\n\n# -- General configuration ---------------------------------------------------\n\nextensions = [\n    'sphinx.ext.autodoc',\n    'sphinx.ext.intersphinx',\n    'sphinx.ext.todo',\n    'sphinx_autodoc_typehints',\n]\n\ntemplates_path = ['_templates']\n\nexclude_patterns = ['_build']\n\n\n# -- Options for HTML output -------------------------------------------------\n\nhtml_theme = 'furo'\nhtml_title = 'TinyUSB'\nhtml_logo = 'assets/logo.svg'\nhtml_favicon = 'assets/logo.svg'\nhtml_theme_options = {\n    'sidebar_hide_name': True,\n}\nhtml_static_path = ['_static']\nhtml_css_files = ['custom.css']\n\ntodo_include_todos = True\n\n# pre-process path in README.rst\ndef preprocess_readme():\n    \"\"\"Modify figure paths in README.rst for Sphinx builds.\"\"\"\n    src = Path(__file__).parent.parent / \"README.rst\"\n    tgt = Path(__file__).parent.parent / \"README_processed.rst\"\n    if src.exists():\n        content = src.read_text(encoding='utf-8')\n        content = re.sub(r\"docs/\", r\"\", content)\n        content = re.sub(r\"\\.rst\\b\", r\".html\", content)\n        if not content.endswith(\"\\n\"):\n            content += \"\\n\"\n        tgt.write_text(content, encoding='utf-8')\n\npreprocess_readme()\n"
  },
  {
    "path": "docs/faq.rst",
    "content": "**************************\nFrequently Asked Questions\n**************************\n\nGeneral Questions\n=================\n\n**Q: What microcontrollers does TinyUSB support?**\n\nTinyUSB supports 50+ MCU families including STM32, RP2040, NXP (iMXRT, Kinetis, LPC), Microchip SAM, Nordic nRF5x, ESP32, and many others. See :doc:`reference/boards` for the complete list.\n\n**Q: Can I use TinyUSB in commercial projects?**\n\nYes, TinyUSB is released under the MIT license, allowing commercial use with minimal restrictions.\n\n**Q: Does TinyUSB require an RTOS?**\n\nNo, TinyUSB works in bare metal environments. It also supports FreeRTOS, RT-Thread, ThreadX, and Mynewt.\n\n**Q: How much memory does TinyUSB use?**\n\nTypical usage: 8-20KB flash, 1-4KB RAM depending on enabled classes and configuration. The stack uses static allocation only.\n\nBuild and Setup\n================\n\n**Q: Why do I get \"arm-none-eabi-gcc: command not found\"?**\n\nInstall the ARM GCC toolchain: ``sudo apt-get install gcc-arm-none-eabi`` on Ubuntu/Debian, or download from ARM's website for other platforms.\n\n**Q: Build fails with \"Board 'X' not found\"**\n\nCheck available boards: ``ls hw/bsp/FAMILY/boards/`` or run ``python tools/build.py -l`` to list all supported boards.\n\n**Q: What are the dependencies and how do I get them?**\n\nRun ``python tools/get_deps.py FAMILY`` where FAMILY is your MCU family (e.g., stm32f4, rp2040). This downloads MCU-specific drivers and libraries.\n\n**Q: Can I use my own build system instead of Make/CMake?**\n\nYes, just add all ``.c`` files from ``src/`` to your project and configure include paths. See :doc:`getting_started` for details.\n\n**Q: Error: \"tusb_config.h: No such file or directory\"**\n\nThis is a very common issue. You need to create ``tusb_config.h`` in your project and ensure it's in your include path. The file must define ``CFG_TUSB_MCU`` and ``CFG_TUSB_OS`` at minimum. Copy from ``examples/device/*/tusb_config.h`` as a starting point.\n\n**Q: RP2040 + pico-sdk ignores my tusb_config.h settings**\n\nThe pico-sdk build system can override ``tusb_config.h`` settings. The ``CFG_TUSB_OS`` setting is often ignored because pico-sdk sets it to ``OPT_OS_PICO`` internally. Use pico-sdk specific configuration methods or modify the CMake configuration.\n\n**Q: \"multiple definition of dcd_...\" errors with STM32**\n\nThis happens when multiple USB drivers are included. Ensure you're only including the correct portable driver for your STM32 family. Check that ``CFG_TUSB_MCU`` is set correctly and you don't have conflicting source files.\n\nDevice Development\n==================\n\n**Q: My USB device isn't recognized by the host**\n\nCommon causes:\n- Invalid USB descriptors - validate with ``LOG=2`` build\n- ``tud_task()`` not called regularly in main loop\n- Incorrect ``tusb_config.h`` settings\n- USB cable doesn't support data (charging-only cable)\n\n**Q: Windows shows \"Device Descriptor Request Failed\"**\n\nThis typically indicates:\n- Malformed device descriptor\n- USB timing issues (check crystal/clock configuration)\n- Power supply problems during enumeration\n- Conflicting devices on the same USB hub\n\n**Q: How do I implement a custom USB class?**\n\nUse the vendor class interface (``CFG_TUD_VENDOR``) or implement a custom class driver. See ``src/class/vendor/`` for examples.\n\n**Q: Can I have multiple configurations or interfaces?**\n\nYes, TinyUSB supports multiple configurations and composite devices. Modify the descriptors in ``usb_descriptors.c`` accordingly.\n\n**Q: How do I change Vendor ID/Product ID?**\n\nEdit the device descriptor in ``usb_descriptors.c``. For production, obtain your own VID from USB-IF or use one from your silicon vendor.\n\n**Q: Device works alone but fails when connected through USB hub**\n\nThis is a known issue where some devices interfere with each other when connected to the same hub. Try:\n- Using different USB hubs\n- Connecting devices to separate USB ports\n- Checking for power supply issues with the hub\n\nHost Development\n================\n\n**Q: Why doesn't my host application detect any devices?**\n\nCheck:\n- Power supply - host mode requires more power than device mode\n- USB connector type - use USB-A for host applications\n- Board supports host mode on the selected port\n- Enable logging with ``LOG=2`` to see enumeration details\n\n**Q: Can I connect multiple devices simultaneously?**\n\nYes, through a USB hub. TinyUSB supports multi-level hubs and multiple device connections.\n\n**Q: Does TinyUSB support USB 3.0?**\n\nNo, TinyUSB currently supports USB 2.0 and earlier. USB 3.0 devices typically work in USB 2.0 compatibility mode.\n\nConfiguration and Features\n==========================\n\n**Q: How do I enable/disable specific USB classes?**\n\nEdit ``tusb_config.h`` and set the corresponding ``CFG_TUD_*`` or ``CFG_TUH_*`` macros to 1 (enable) or 0 (disable).\n\n**Q: Can I use both device and host modes simultaneously?**\n\nYes, with dual-role/OTG capable hardware. See ``examples/dual/`` for implementation examples.\n\n**Q: How do I optimize for code size?**\n\n- Disable unused classes in ``tusb_config.h``\n- Use ``CFG_TUSB_DEBUG = 0`` for release builds\n- Compile with ``-Os`` optimization\n- Consider using only required endpoints/interfaces\n\n**Q: Does TinyUSB support low power/suspend modes?**\n\nYes, TinyUSB handles USB suspend/resume. Implement ``tud_suspend_cb()`` and ``tud_resume_cb()`` for custom power management.\n\n**Q: What CFG_TUSB_MCU should I use for x86/PC platforms?**\n\nFor PC/motherboard applications, there's no standard MCU option. You may need to use a generic option or modify TinyUSB for your specific use case. Consider using libusb or other PC-specific USB libraries instead.\n\n**Q: RP2040 FreeRTOS configuration issues**\n\nThe RP2040 pico-sdk has specific requirements for FreeRTOS integration. The ``CFG_TUSB_OS`` setting may be overridden by the SDK. Use pico-sdk specific configuration methods and ensure proper task stack sizes for the USB task.\n\nDebugging and Troubleshooting\n=============================\n\n**Q: How do I debug USB communication issues?**\n\n1. Enable logging: build with ``LOG=2``\n2. Use ``LOGGER=rtt`` or ``LOGGER=swo`` for high-speed logging\n3. Use USB protocol analyzers for detailed traffic analysis\n4. Check with different host systems (Windows/Linux/macOS)\n\n**Q: My application crashes or hard faults**\n\nCommon causes:\n- Stack overflow - increase stack size in linker script\n- Incorrect interrupt configuration\n- Buffer overruns in USB callbacks\n- Build with ``DEBUG=1`` and use a debugger\n\n**Q: Performance is poor or USB transfers are slow**\n\n- Ensure ``tud_task()``/``tuh_task()`` called frequently (< 1ms intervals)\n- Use DMA for USB transfers if supported by your MCU\n- Optimize endpoint buffer sizes\n- Consider using high-speed USB if available\n\n**Q: Some USB devices don't work with my host application**\n\n- Not all devices follow USB standards perfectly\n- Some may need device-specific handling\n- Composite devices may have partial support\n- Check device descriptors and implement custom drivers if needed\n\n**Q: ESP32-S3 USB host/device issues**\n\nESP32-S3 has specific USB implementation challenges:\n- Ensure proper USB pin configuration\n- Check power supply requirements for host mode\n- Some features may be limited compared to other MCUs\n- Use ESP32-S3 specific examples and documentation\n"
  },
  {
    "path": "docs/getting_started.rst",
    "content": "***************\nGetting Started\n***************\n\nThis guide will get you up and running with TinyUSB quickly with working examples.\n\nProject Structure\n====================\n\nTinyUSB separates example applications from board-specific hardware configurations:\n\n* **Example applications**: Located in `examples/ <https://github.com/hathach/tinyusb/tree/master/examples/>`_ directories\n* **Board Support Packages (BSP)**: Located in ``hw/bsp/FAMILY/boards/BOARD_NAME/`` with hardware abstraction including pin mappings, clock settings, and linker scripts\n* **Build system**: Located in `examples/build_system/ <https://github.com/hathach/tinyusb/tree/master/examples/build_system>`_ which supports both Make and CMake. Though some MCU families such as espressif or rp2040 only support cmake\n\nFor example, stm32h743eval is located in `hw/bsp/stm32h7/boards/stm32h743eval <https://github.com/hathach/tinyusb/tree/master/hw/bsp/stm32h7/boards/stm32h743eval>`_ where ``FAMILY=stm32h7`` and ``BOARD=stm32h743eval``. When you build with ``BOARD=stm32h743eval``, the build system automatically finds the corresponding BSP using the FAMILY.\n\nFor guidance on integrating TinyUSB into your own firmware (configuration, descriptors, initialization, and callback workflow), see :doc:`integration`.\n\nQuick Start Examples\n====================\n\nThe fastest way to understand TinyUSB is to see it working. These examples demonstrate core functionality and can be built immediately.\n\nWe'll assume you are using the **STM32H743 Eval board** (BOARD=stm32h743eval) under the **stm32h7** family. For other boards, see ``Board Support Packages`` below.\n\nGet the Code\n------------\n\n.. code-block:: bash\n\n   $ git clone https://github.com/hathach/tinyusb tinyusb\n   $ cd tinyusb\n   $ python tools/get_deps.py -b stm32h743eval  # or python tools/get_deps.py stm32h7\n\n.. note::\n   Some MCU families require additional SDKs, please follow their instructions to install and set it up\n\n   * **rp2040**: Requires `pico-sdk <https://github.com/raspberrypi/pico-sdk>`_\n   * **Espressif (esp32)**: Requires `esp-idf <https://github.com/espressif/esp-idf>`_. Only a few examples support the ESP-IDF build system. Look for ones with `src/CMakeLists.txt` that contain `idf_component_register()`, such as `cdc_msc_freertos`.\n\nSimple Device Example\n---------------------\n\nThe `cdc_msc <https://github.com/hathach/tinyusb/tree/master/examples/device/cdc_msc>`_ example creates a USB device with both a virtual serial port (CDC) and mass storage (MSC).\n\n**What it does:**\n\n* Appears as a serial port that echoes back any text you send\n* Appears as a small USB drive with a README.TXT file\n* Blinks an LED to show activity\n\n**Build and run with CMake:**\n\n.. code-block:: bash\n\n   $ cd examples/device/cdc_msc\n   $ cmake -DBOARD=stm32h743eval -B build # add \"-G Ninja\" to use Ninja build\n   $ cmake --build build\n   # cmake --build build --target cdc_msc-jlink\n\n.. tip::\n   Flashed/Debugger can be selected with --target ``-jlink``, ``-stlink`` or ``-openocd`` depending on your board. Use ``--target help`` to list all supported targets.\n\n**Build and run with Make:**\n\n.. code-block:: bash\n\n   $ cd examples/device/cdc_msc\n   $ make BOARD=stm32h743eval all\n   $ make BOARD=stm32h743eval flash-jlink\n\n.. tip::\n   Flashed/Debugger can be selected with target ``flash-jlink``, ``flash-stlink`` or ``flash-openocd`` depending on your board.\n\nConnect the device to your computer and you'll see both a new serial port and a small USB drive appear.\n\nSimple Host Example\n-------------------\n\nThe `cdc_msc_hid <https://github.com/hathach/tinyusb/tree/master/examples/host/cdc_msc_hid>`_ example creates a USB host that can connect to USB devices with CDC, MSC, or HID interfaces.\n\n**What it does:**\n\n* Detects and enumerates connected USB devices\n* Communicates with CDC devices (like USB-to-serial adapters)\n* Reads from MSC devices (like USB drives)\n* Receives input from HID devices (like keyboards and mice)\n\n**Build and run with CMake:**\n\n.. code-block:: bash\n\n   $ cd examples/host/cdc_msc_hid\n   $ cmake -DBOARD=stm32h743eval -B build\n   $ cmake --build build\n\n**Build and run with Make:**\n\n.. code-block:: bash\n\n   $ cd examples/host/cdc_msc_hid\n   $ make BOARD=stm32h743eval all\n   $ make BOARD=stm32h743eval flash-jlink\n\nConnect USB devices to see enumeration messages and device-specific interactions in the serial output.\n\nAdditional Build Options\n------------------------\n\nDebug and Logging\n^^^^^^^^^^^^^^^^^\n\nTinyUSB built-in logging can be enabled by setting `CFG_TUSB_DEBUG` which is done by passing ``LOG=level``. The higher the level, the more verbose the logging.\n\nIn addition to traditional hw uart as default, logging with debugger such as `Segger RTT <https://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer/>`_ (10x faster) is also supported with `LOGGER=rtt` option.\n\n.. code-block:: bash\n\n   $ cmake -B build -DBOARD=stm32h743eval -DLOG=2               # logging level 2 with uart\n   $ cmake -B build -DBOARD=stm32h743eval -DLOG=2 -DLOGGER=rtt  # logging level 2 with RTT\n\n.. code-block:: bash\n\n   $ make BOARD=stm32h743eval LOG=2 all              # logging level 2 with uart\n   $ make BOARD=stm32h743eval LOG=2 LOGGER=rtt all   # logging level 2 with RTT\n\nRootHub Port Selection\n^^^^^^^^^^^^^^^^^^^^^^\n\nSome boards support multiple usb controllers (roothub ports), by default one rh port is used as device, another as host in ``board.mk/board.cmake``. This can be overridden with option ``RHPORT_DEVICE=n`` or ``RHPORT_HOST=n`` To choose another port. For example to select the HS port of a STM32F746Disco board, use:\n\n.. code-block:: bash\n\n   $ cmake -B build -DBOARD=stm32h743eval -DRHPORT_DEVICE=1 # select roothub port 1 as device\n\n.. code-block:: bash\n\n   $ make BOARD=stm32h743eval RHPORT_DEVICE=1 all # select roothub port 1 as device\n\nRootHub Port Speed\n^^^^^^^^^^^^^^^^^^\n\nA MCU can support multiple operational speed. By default, the example build system will use the fastest supported on the board. Use option ``RHPORT_DEVICE_SPEED=OPT_MODE_FULL/HIGH_SPEED/`` or ``RHPORT_HOST_SPEED=OPT_MODE_FULL/HIGH_SPEED/`` e.g To force operating speed\n\n.. code-block:: bash\n\n   $ cmake -B build -DBOARD=stm32h743eval -DRHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED\n\n.. code-block:: bash\n\n   $ make BOARD=stm32h743eval RHPORT_DEVICE_SPEED=OPT_MODE_FULL_SPEED all\n\n\nIAR Embedded Workbench\n----------------------\n\nFor IAR users, project connection files are available. Import `tools/iar_template.ipcf <https://github.com/hathach/tinyusb/tree/master/tools/iar_template.ipcf>`_ or use native CMake support (IAR 9.50.1+). See `tools/iar_gen.py <https://github.com/hathach/tinyusb/tree/master/tools/iar_gen.py>`_ for automated project generation.\n\n\nCommon Issues and Solutions\n---------------------------\n\n**Build Errors**\n\n* **\"arm-none-eabi-gcc: command not found\"**: Install ARM GCC toolchain: ``sudo apt-get install gcc-arm-none-eabi``\n* **\"Board 'X' not found\"**: Check the available boards in ``hw/bsp/FAMILY/boards/`` or run ``python tools/build.py -l``\n* **Missing dependencies**: Run ``python tools/get_deps.py FAMILY`` where FAMILY matches your board or ``python tools/get_deps.py -b BOARD``\n\n**Runtime Issues**\n\n* **Device not recognized**: Check USB descriptors implementation and ``tusb_config.h`` settings\n* **Enumeration failure**: Enable logging with ``LOG=2`` and check for USB protocol errors\n* **Hard faults/crashes**: Verify interrupt handler setup and stack size allocation\n\n**Linux Permissions**\n\nSome examples require udev permissions to access USB devices:\n\n.. code-block:: bash\n\n   $ cp `examples/device/99-tinyusb.rules <https://github.com/hathach/tinyusb/tree/master/examples/device/99-tinyusb.rules>`_ /etc/udev/rules.d/\n   $ sudo udevadm control --reload-rules && sudo udevadm trigger\n\nNext Steps\n==========\n\n* Check :doc:`integration` for integrating TinyUSB into your own firmware\n* Check :doc:`reference/boards` for board-specific information\n* Explore more examples in `examples/device/ <https://github.com/hathach/tinyusb/tree/master/examples/device>`_ and `examples/host/ <https://github.com/hathach/tinyusb/tree/master/examples/host>`_ directories\n* Read :doc:`reference/usb_concepts` to understand USB fundamentals\n"
  },
  {
    "path": "docs/index.rst",
    "content": ".. include:: ../README_processed.rst\n\n.. toctree::\n   :maxdepth: 2\n   :caption: Information\n\n   getting_started\n   integration\n   porting\n   reference/index\n   faq\n   troubleshooting\n\n.. toctree::\n   :maxdepth: 1\n   :caption: Project Info\n\n   info/index\n\n.. toctree::\n   :caption: External Links\n   :hidden:\n\n   Source Code <https://github.com/hathach/tinyusb>\n   Issue Tracker <https://github.com/hathach/tinyusb/issues>\n   Discussions <https://github.com/hathach/tinyusb/discussions>\n"
  },
  {
    "path": "docs/info/changelog.rst",
    "content": "*********\nChangelog\n*********\n\n0.20.0\n======\n\n*November 19, 2025*\n\nGeneral\n-------\n\n- New MCUs and Boards:\n\n  - Add STM32U3 device support (adjusted from STM32U0)\n  - Add nRF54H20 support with initial board configuration\n  - Rename board names: pca10056→nrf52840dk, pca10059→nrf52840dongle, pca10095→nrf5340dk\n  - Improve CMake: Move startup and linker files from board target to executable. Enhance target warning flags and fix various build warnings\n\n- Code Quality and Static Analysis:\n\n  - Add PVS-Studio static analysis to CI\n  - Add SonarQube scan support\n  - Add IAR C-Stat analysis capability\n  - Add ``.clang-format`` for consistent code formatting\n  - Fix numerous alerts and warnings found by static analysis tools\n\n- Documentation:\n\n  - Improve Getting Started documentation structure and flow\n  - Add naming conventions and buffer handling documentation\n\nController Driver (DCD & HCD)\n-----------------------------\n\n- DWC2\n\n  - Fix incorrect handling of Zero-Length Packets (ZLP) in the DWC2 driver when receiving data (OUT transfers)\n  - Improve EP0 multi-packet logic\n  - Support EP0 with max packet size = 8\n  - For IN endpoint, write initial packet directly to FIFO and only use TXFE interrupt for subsequent packets\n  - Fix ISO with bInterval > 2 using incomplete IN interrupt handling.\n  - Fix compile issues when enabling both host and device\n  - Clear pending suspend interrupt after USB reset (enum end)\n  - Improve host closing endpoint and channel handling when device is unplugged\n\n- FSDEV (STM32)\n\n  - Fix AT32 USB interrupt remapping in ``dcd_int_enable()``\n\n- OHCI\n\n  - Add initial LPC55 OHCI support\n  - Improve data cache support\n\nDevice Stack\n------------\n\n- USBD Core\n\n  - Support configurable EP0 buffer size CFG_TUD_ENDPOINT0_BUFSIZE\n  - Make dcd_edpt_iso_alloc/activate as default API for ISO endpoint\n\n- Audio\n\n  - Add UAC1 support\n  - Implement RX FIFO threshold adjustment with `tud_audio_get/set_ep_in_fifo_threshold()`\n\n- CDC\n\n  - Migrate to endpoint stream API\n\n- HID\n\n  - Fix HID stylus descriptor\n\n- MIDI\n\n  - Migrate to endpoint stream API\n  - Add ``tud_midi_n_packet_write_n()`` and ``tud_midi_n_packet_read_n()``\n\n- MTP\n\n  - Fix incorrect MTP xact_len calculation\n\n- Video\n\n  - Add bufferless operation callback for dynamic frame generation with tud_video_prepare_payload_cb()\n\nHost Stack\n----------\n\nNo changes\n\n0.19.0\n======\n\nGeneral\n-------\n\n- New MCUs and Boards:\n\n  - Add ESP32-H4, ESP32-C5, ESP32-C61 support\n  - Add STM32U0, STM32WBA, STM32N6\n  - Add AT32F405, AT32F403A, AT32F415, AT32F423 support\n  - Add CH32V305 support and CH32V20x USB host support\n  - Add MCXA156 SDK 2.16 support and FRDM-MCXA156 board\n\nAPI Changes\n-----------\n\n- Core APIs\n\n  - Add weak callbacks with new syntax for better compiler compatibility\n  - Add ``tusb_deinit()`` to cleanup stack\n  - Add time functions: ``tusb_time_millis_api()`` and ``tusb_time_delay_ms_api()``\n  - Add ``osal_critical`` APIs for critical section handling\n  - Introduce ``xfer_isr()`` callback for ISO transfer optimization in device classes\n\n- Device APIs\n\n  - CDC: Add notification support ``tud_cdc_configure()``, ``tud_cdc_n_notify_uart_state()``,\n    ``tud_cdc_n_notify_conn_speed_change()``, ``tud_cdc_notify_complete_cb()``\n  - MSC: Add ``tud_msc_inquiry2_cb()`` with bufsize parameter, update ``tud_msc_async_io_done()``\n    with ``in_isr`` parameter\n  - Audio: Add ``tud_audio_n_mounted()`` and various FIFO access functions\n  - MTP: Add ``tud_mtp_mounted()``, ``tud_mtp_data_send()``, ``tud_mtp_data_receive()``,\n    ``tud_mtp_response_send()``, ``tud_mtp_event_send()``\n\n- Host APIs\n\n  - Core: Add ``tuh_edpt_close()``, ``tuh_address_set()``, ``tuh_descriptor_get_device_local()``,\n    ``tuh_descriptor_get_string_langid()``, ``tuh_connected()``, ``tuh_bus_info_get()``\n  - Add enumeration callbacks: ``tuh_enum_descriptor_device_cb()``,\n    ``tuh_enum_descriptor_configuration_cb()``\n  - CDC: Add ``tuh_cdc_get_control_line_state_local()``, ``tuh_cdc_get/set_dtr/rts()``,\n    ``tuh_cdc_connect/disconnect()`` and sync versions of all control APIs\n  - MIDI: Add ``tuh_midi_itf_get_info()``, ``tuh_midi_packet_read_n()``,\n    ``tuh_midi_packet_write_n()``, ``tuh_midi_read_available()``, ``tuh_midi_write_flush()``,\n    ``tuh_midi_descriptor_cb()``\n\nController Driver (DCD & HCD)\n-----------------------------\n\n- DWC2\n\n  - Support DWC2 v4.30a with improved reset procedure\n  - Fix core reset: wait for AHB idle before reset\n  - Add STM32 DWC2 data cache support with proper alignment\n  - Host improvements:\n    - Fix disconnect detection and SOF flag handling\n    - Fix HFIR timing off-by-one error\n    - Retry IN token immediately for bInterval=1\n    - Proper attach debouncing (200ms)\n    - Fix all retry intervals\n    - Resume OUT transfer when PING ACKed\n  - Fix enumeration racing conditions\n  - Refactor bitfields for better code generation\n\n- FSDEV (STM32)\n\n  - Fix AT32 compile issues after single-buffered endpoint changes\n  - Add configurable single-buffered isochronous endpoints\n  - Fix STM32H7 recurrent suspend ISR\n  - Fix STM32L4 GPIOD clock enable for variants without GPIOD\n  - Fix STM32 PHYC PLL stability wait\n  - Improve PMA size handling for STM32U0\n\n- EHCI\n\n  - Fix removed QHD getting reused\n  - Fix NXP USBPHY disconnection detection\n\n- Chipidea/NXP\n\n  - Fix race condition with spinlock\n  - Improve iMXRT support: fix build, disable BOARD_ConfigMPU, fix attach debouncing on port1 highspeed\n  - Fix iMXRT1064 and add to HIL test pool\n\n- MAX3421E\n\n  - Use spinlock for thread safety instead of atomic flag\n  - Implement ``hcd_edpt_close()``\n\n- RP2040\n\n  - Fix audio ISO transfer: reset state before notifying stack\n  - Fix CMake RTOS cache variable\n  - Abort transfer if active in ``iso_activate()``\n\n- SAMD\n\n  - Add host controller driver support\n\nDevice Stack\n------------\n\n- USBD Core\n\n  - Introduce ``xfer_isr()`` callback for interrupt-time transfer handling\n  - Add ``usbd_edpt_xfer_fifo()`` stub\n  - Revert endpoint busy/claim status if ``xfer_isr()`` defers to ``xfer_cb()``\n\n- Audio\n\n  - Major simplification of UAC driver and alt settings management\n  - Move ISO transfers into ``xfer_isr()`` for better performance\n  - Remove FIFO mutex (single producer/consumer optimization)\n  - Add implicit feedback support for data IN endpoints\n  - Fix alignment issues\n  - Update buffer macros with cache line size alignment\n\n- CDC\n\n  - Add notification support: ``CFG_TUD_CDC_NOTIFY``, ``tud_cdc_n_notify_conn_speed_change()``, ``tud_cdc_notify_complete_cb()``\n  - Reduce default bInterval from 16ms to 1ms for better responsiveness\n  - Rename ``tud_cdc_configure_fifo()`` to ``tud_cdc_configure()`` and add ``tx_overwritable_if_not_connected`` option\n  - Fix web serial robustness with major overhaul and logic cleanup\n\n- HID\n\n  - Add Usage Page and Table for Power Devices (0x84 - 0x85)\n  - Fix HID descriptor parser variable size and 4-byte item handling\n  - Add consumer page configurations\n\n- MIDI\n\n  - Fix MIDI interface descriptor handling after audio streaming interface\n  - Skip RX data with all zeroes\n\n- MSC\n\n  - Add async I/O support for MSC using ``tud_msc_async_io_done()``\n  - Add ``tud_msc_inquiry2_cb()`` with bufsize for full inquiry response\n\n- MTP\n\n  - Add new Media Transfer Protocol (MTP) device class driver\n  - Support MTP operations: GetDeviceInfo, SendObjectInfo, SendObject\n  - Add MTP event support with ``tud_mtp_event_send()``\n  - Implement filesystem example with callbacks\n  - Add hardware-in-the-loop testing support\n\n- NCM\n\n  - Add USB NCM link state control support\n  - Fix DHCP offer/ACK destination\n\n- USBTMC\n\n  - Add vendor-specific message support\n\n- Vendor\n\n  - Fix vendor device reset and open issues\n  - Fix descriptor parsing for ``CFG_TUD_VENDOR > 1``\n  - Fix vendor FIFO argument calculation\n\nHost Stack\n----------\n\n- USBH Core\n\n  - Major enumeration improvements:\n    - Fix enumeration racing conditions\n    - Add proper attach debouncing with hub/rootport handling (200ms delay)\n    - Reduce ``ENUM_DEBOUNCING_DELAY_MS`` to 200ms\n    - Always get language ID, manufacturer, product, and serial strings during enumeration\n    - Always get first 2 bytes of string descriptor to determine length (prevents buffer overflow)\n    - Support devices with multiple configurations\n  - Add ``tuh_enum_descriptor_device_cb()`` and ``tuh_enum_descriptor_configuration_cb()`` callbacks\n  - Add ``tuh_descriptor_get_string_langid()`` API\n  - Hub improvements:\n    - Check status before getting first device descriptor\n    - Properly handle port status and change detection\n    - Queue status endpoint for detach/remove events\n    - Fix hub status change endpoint handling\n  - Fix endpoint management:\n    - ``hcd_edpt_open()`` returns false if endpoint already opened\n    - Add ``hcd_edpt_close()`` implementation\n    - Abort pending transfers on close\n  - Add roothub debouncing flag to ignore attach/remove during debouncing\n  - Move address setting and bus info management to separate structures\n  - Force removed devices in same bus info before setting address\n\n- CDC Serial Host\n\n  - Major refactor to generalize CDC serial drivers (FTDI, CP210x, CH34x, PL2303, ACM)\n  - Add explicit ``sync()`` API with ``TU_API_SYNC()`` returning ``tusb_xfer_result_t``\n  - Rename ``tuh_cdc_get_local_line_coding()`` to ``tuh_cdc_get_line_coding_local()``\n  - Add ``tuh_cdc_get_control_line_state_local()``\n  - Implement ``tuh_cdc_get/set_dtr/rts()`` as inline functions\n\n- MIDI Host\n\n  - Major API changes:\n    - Rename ``tuh_midi_stream_flush()`` to ``tuh_midi_write_flush()``\n    - Add ``tuh_midi_packet_read_n()`` and ``tuh_midi_packet_write_n()``\n    - Add ``CFG_TUH_MIDI_STREAM_API`` to opt out of stream API\n    - Change API to use index instead of device address (supports multiple MIDI per device)\n  - Rename ``tuh_midi_get_num_rx/tx_cables()`` to ``tuh_midi_get_rx/tx_cable_count()``\n  - Add ``tuh_midi_descriptor_cb()`` and ``tuh_midi_itf_get_info()``\n\n- MSC Host\n\n  - Continue async I/O improvements\n\n- HID Host\n\n  - Fix version string to actually show version\n\n0.18.0\n======\n\nGeneral\n-------\n\n- New MCUs:\n\n  - Add esp32p4 OTG highspeed support\n  - Add stm32 u0, c0, h7rs\n\n- Better support dcache, make sure all usb-transferred buffer are cache line aligned and occupy full cache line\n- Build ARM IAR with CircleCI\n- Improve HIL with `dual/host_info_to_device_cdc`` optional for pico/pico2, enable dwc2 dma test\n\nAPI Changes\n-----------\n\n- Change signature of ``tusb_init(rhport, tusb_rhport_init_t*)``, ``tusb_init(void)`` is now deprecated but still available for backward compatibility\n- Add new ``tusb_int_handler(rhport, in_isr)``\n- Add time-related APIs: ``tusb_time_millis_api()`` and ``tusb_time_delay_ms_api()`` for non-RTOS, required for some ports/configuration\n- New configuration macros:\n\n  - ``CFG_TUD/TUH_MEM_DCACHE_ENABLE`` enable data cache sync for endpoint buffer\n  - ``CFG_TUD/TUH_MEM_DCACHE_LINE_SIZE`` set cache line size\n  - ``CFG_TUD/TUH_DWC2_SLAVE_ENABLE`` enable dwc2 slave mode\n  - ``CFG_TUD/TUH_DWC2_DMA_ENABLE`` enable dwc2 dma mode\n\nController Driver (DCD & HCD)\n-----------------------------\n\n- DWC2\n\n  - Add DMA support for both device and host controller\n  - Add host driver support including: full/high speed, control/bulk/interrupt (CBI) transfer, split CBI i.e FS/LS attached via highspeed hub, hub support\n\n- RP2: implement ``dcd_edpt_iso_alloc()`` and ``dcd_edpt_iso_activate()`` for isochronous endpoint\n- iMXRT1170 support M4 core\n\nDevice Stack\n------------\n\n- Vendor Fix  class reset\n- NCM fix recursions in ``tud_network_recv_renew()``\n- Audio fix align issue of ``_audiod_fct.alt_setting``\n- UVC support format frame based\n- Change ``dcd_dcache_()`` return type from void to bool\n- HID add Usage Table for Physical Input Device Page (0x0F)\n\nHost Stack\n----------\n\n- Fix an duplicated attach issue which cause USBH Defer Attach until current enumeration complete message\n\n0.17.0\n======\n\nGeneral\n-------\n\n- Improved CI: build both cmake and make. Make use of CircleCI for part of build process to speed up CI\n- Add CodeQL Workflow for Code Security Analysis\n- Add Clang compiler support\n- Add default implementation for weak callbacks functions for better Keil compatibility\n- Upgrade hardware-in-the-loop (HIL) testing with more boards and examples: including dual stack example\n\nController Driver (DCD & HCD)\n-----------------------------\n\n- Chipidea\n\n  - Support MCXA\n\n- DWC2\n\n  - Fix tickless issue with stm32f7: disable ULPI clock during sleep when using internal phy\n  - Fix SOF interrupt handling\n  - Fix fifo level half/empty issue\n  - Add DWC2 Test Mode support.\n  - for esp32 force disconnect/connect using USB_WRAP otg pad override\n\n- FSDEV\n\n  - Rewrite and Generalize driver to support non-stm32 mcu such as wch\n  - Simplify PMA, HW FIFO access and bit manipulation for different access scheme 1x16, 2x16 and 32 bit\n  - Add support for ch32 usbd e.g ch32v203\n  - Add support for STM32G4 and STM32U5 microcontrollers.\n  - Fix h5 (32-bit) errata 2.15.1: Buffer description table update completes after CTR interrupt triggers\n  - ISO EP buffer allocation improvements, implement ``dcd_edpt_close_all()``\n\n  - Fix ch32v203 race condition and stability issue with\n\n    - fix ch32v203 seems to unconditionally accept ZLP on EP0 OUT.\n    - fix v203 race condition between rx bufsize and RX_STAT which cause PMAOVR, occurs with WRITE10\n    - correctly handle setup prepare at ``dcd_edpt0_status_complete()``, which fixes the race condition with windows where we could miss setup packet (setup bit set, but count = 0)\n\n- MAX3421E\n\n  - Add support for rp2040, esp32 (c3, c6, h2, etc..)\n  - Add ``hcd_deinit()`` for max3421\n  - Retry NAK handling next frame to reduce CPU and SPI bus usage\n  - add ``cpuctl`` and ``pinctl`` to ``tuh_configure()`` option for max3421\n  - Implement hcd abort transfer for Max3421\n  - Properly Handle NAK Response in MAX3421E driver: correctly switch and skip writing to 2 FIFOs when NAK received. Otherwise, the driver may hang in certain conditions.\n\n- MSP430: support non-bus-powered\n\n- MUSB\n\n  - Add support for Analoog devices: max32650, max32666, max32690, max3278002\n\n- nRF\n\n  - Fix ``dcd_edpt_open()`` for iso endpoint\n  - Handle ISOOUT CRC errors\n  - Add compile support with old nordic sdk\n  - Fix a few race conditions\n\n- OHCI\n\n  - Allow more than 16 devices\n\n- RP2040\n\n  - Correctly abort control transfer when new setup arrived. Due to RP2040-E2 only able to fix B2 or later\n  - Implement hcd abort transfer for rp2040\n  - Add support for rp2350\n\n- RUSB2\n\n  - Support ra2a1 pipe number scheme\n\n- WCH CH32\n\n  - Added support for USB OTG/FS and FSDev Driver. Update CH32V307 to allow manual select FS or HS driver.\n  - Fixed various bugs in CH32v307 usbhs driver: endpoint handling and data transfer management.\n\nDevice Stack\n------------\n\n- Add ``tud_deinit()`` and ``class driver deinit()`` to deinitialize TinyUSB device stack.\n- Add support for generic SOF callback.\n- Add set address recovery time 2ms per USB spec.\n\n- Audio\n\n  - Add audio_test_freertos & audio_4_channel_mic_freertos\n  - Improved support for Audio Class 2.0 (UAC2) with various bug fixes.\n  - Add feedback by fifo counting.\n\n- Bluetooth HCI\n\n  - Issue ZLP on ACL IN ep when transfer is multiple of endpoint max packet size\n\n- CDC\n\n  - Add ``tud_cdc_configure_fifo()`` to make RX/TX buffer persistent (not clear when disconnected)\n  - Add missing capability bit for CDC ACM serial break support\n  - Enhanced CDC class with better handling of large data transmissions.\n  - Add missing capability bit for CDC ACM serial break support\n\n- HID\n\n  - Added missing key codes for keypad\n  - Added HID Lighting and Illumination functionality\n  - Fixed issues in the HID class for more reliable device enumeration.\n  - Support HID Mouse with absolute positioning\n  - Use separate buffer for control SET_REPORT, fix conflict with interrupt endpoint out\n\n- MSC: Added support for SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL\n\n- Net\n\n  - Rewrite of NCM device driver to improve throughput\n  - removed obsolete ``tud_network_link_state_cb()``\n\n- USBTMC Added notification support\n\n- Vendor\n\n  - Migrate to new endpoint stream API, support non-buffered TX/RX\n  - Add ZLP for ``write()`` when needed\n\n- Video\n\n  - Enhance UVC descriptors and example\n  - Video Added support for USB Video Class (UVC) with MJPEG.\n  - Fix multiple interfaces, add an example of 2ch video capture.\n  - Fix race for ``tud_video_n_streaming()`` check\n\nHost Stack\n----------\n\n- Added ``tuh_deinit()`` to de-initialize TinyUSB host stack.\n- Added support for new USB mass storage class APIs.\n- Improved error handling and retry mechanisms for unstable devices.\n\n- CDC Serial\n\n  - Add support for ch34x\n  - Allow to overwrite ``CFG_TUH_CDC_FTDI/CP210X/CH32X_VID_PID_LIST``\n  - Enhanced stability of CDC-ACM devices during enumeration.\n\n- HID\n\n  - Add ``tuh_hid_receive_abort()``\n  - Add ``tuh_hid_get_report()``\n\n- Hub\n\n  - Prevent status request to invalid ep_num\n  - Fix double status xfer\n  - unroll hub removal\n\n0.16.0\n======\n\n- New controller driver: MAX3421e (usb host shield), rusb2 (Renesas USB2.0), ChipIdea fullspeed\n- New MCUs: MCXn9, nRF5340, STM32: G0, G4, L5, U575, U5A5, RA6m5, CH32F20x\n- Add initial TypeC PowerDelivery support with STM32G4\n- Remove submodules and use python script to manage repo dependencies #1947\n- Add CMake support for most families and boards, move build file from tools/ to examples/build_system\n- Add ETM trace support with JTrace for nrf52840, nrf5340, mcb1857, stm32h743eval, ra6m5\n- [osal] Make it possible to override the ``osal_task_delay()`` in osal_none\n- Add CDC+UAC2 composite device example\n- Enhance Hardware-in-the-loop (HIL) testing with more boards: rp2040, stm32l412nucleo, stm32f746disco, lpcxpresso43s67\n\nController Driver (DCD & HCD)\n-----------------------------\n\n- Add new ISO endpoint API: ``dcd_edpt_iso_alloc()`` and ``dcd_edpt_iso_activate()``\n- Remove legacy driver st/synopsys\n\n- EHCI\n\n  - [iMXRT] Add dache clean/invalidate when memory is in cacheable memory\n  - Fix portsc write issue which cause problem with enumeration\n  - Fix an issue when doing port reset write to portsc\n  - Fix port change detect is not recognized when power on with attached device\n  - Fix xfer failed with disconnected device as stalled\n  - Fix error on EHCI causes xfer error in non-queued qhd which cause memory fault\n  - Un-roll recursive hub removal with usbh queue\n  - Fix issue when removing queue head\n  - Implement ``hcd_edpt_abort_xfer()``\n  - use standard USB complete interrupt instead of custom chipidea async/period interrupt to be more compatible with other ehci implementation\n  - refactor usb complete & error isr processing, merge, update. Fix EHCI QHD reuses QTD on wrong endpoint\n  - Improve bus reset, fix ``send_setup()`` not carried out if halted previously\n  - Fix clear qhd halted bit if not caused by STALL protocol to allow for next transfer\n\n- ChipIdea Highspeed\n\n  - Fix control transfer issue when previous status and new setup complete in the same isr frame\n  - [imxrt] Add dcache support for cache region\n\n- ChipIdea Fullspeed\n\n  - Generalize ChipIdea Fullspeed driver for mcxn9 (port 0), kinetis\n\n- nrf\n\n  - Fix DMA race condition with ISO OUT transfer #1946\n  - Add support for nRF5340 with pca10095 board\n\n- Renesas rusb2\n\n  - Generalize rusb2 driver for ra, rx mcus\n  - rework both dcd and hcd for better multiple ports support\n  - Add support for board with HS USB port: ra6m5 port1\n\n- rp2040\n\n  - [dcd] Make writes to SIE_CTRL aware of concurrent access\n  - [hcd] add ``hcd_frame_number()``, ``hcd_edpt_abort_xfer()`` for pio-usb host\n\n- stm32 fsdev:\n\n  - Add STM32L5 support\n  - Implement ``dcd_edpt_iso_alloc()`` and ``dcd_edpt_iso_activate()``\n\n- OHCI\n\n  - Allows configurable root hub ports, handles SMM mode (Ref OHCI spec 5.1.1.3.3) and Bios mode (Ref OHCI spec 5.1.1.3.4)\n  - Fix FrameIntervalToggle must be toggled after we write the FrameInterval (Ref OHCI Spec 7.3.1)\n  - Wait PowerOnToPowerGoodTime after we enable power of the RH ports (Ref OHCI Spec 7.4.1)\n  - Generate port interrupts for devices already connected during init.\n  - Fix issue when removing queue head\n  - Disable MIE during IRQ processing and clear HccaDoneHead on completion as per OCHI Spec Page 80\n\nDevice Stack\n------------\n\n- Add optional hooks ``tud_event_hook_cb()``\n- Audio (UAC2)\n\n  - Fix feedback EP buffer alignment.\n  - Fix encoding, update example\n  - Improve IN transfer\n\n- Bluetooth\n\n  - Add historical EP compatibility for Bluetooth HCI\n\n- CDC\n\n  - Fix line_coding alignment\n  - Fix typo in cdc line coding enum\n\n- MIDI\n\n  - Fix ``stream_write()`` always writes system messages to cable 0\n  - Fix incorrect NOTE_ON, NOTE_OFF definitions\n\n- USBTMC: Fix tmc488 bit order\n\n- Vendor: fix ``read()``/``write()`` race condition\n\n- Video (UVC)\n\n  - Add the capability for video class to handle a bulk endpoint in the streaming interface.\n\nHost Stack\n----------\n\n- USBH\n\n  - Add new APIs: ``tuh_interface_set()``, ``tuh_task_event_ready()``, ``tuh_edpt_abort_xfer()``, ``tuh_rhport_reset_bus()``, ``tuh_rhport_is_active()``\n  - Fix issue when device generate multiple attach/detach/attach when plugging in\n  - Prefer application callback over built-in driver on transfer complete event\n  - Correct ``hcd_edpt_clear_stall()`` API signature\n  - Separate bus reset delay and contact debouncing delay in enumeration\n  - Support ``usbh_app_driver_get_cb()`` for application drivers\n  - Fix usbh enumeration removal race condition\n  - Add optional hooks ``tuh_event_hook_cb()``\n\n- CDC\n\n  - Breaking: change ``tuh_cdc_itf_get_info()`` to use tuh_itf_info_t instead of tuh_cdc_info_t\n  - Fix cdc host enumeration issue when device does not support line request\n  - Add support for vendor usb2uart serial: ftdi, cp210x, ch9102f\n  - Improve sync control API e.g  ``tuh_cdc_set_control_line_state()``, ``tuh_cdc_set_line_coding()``\n\n- HID\n\n  - Add new APIs ``tuh_hid_send_report()``, ``tuh_hid_itf_get_info()``, ``tuh_hid_receive_ready()``, ``tuh_hid_send_ready()``, ``tuh_hid_set_default_protocol()``\n  - Change meaning of CFG_TUH_HID to total number of HID interfaces supported. Previously ``CFG_TUH_HID`` is max number of interfaces per device which is rather limited and consume more resources than needed.\n\n- HUB\n\n  - Fix handling of empty \"status change\" interrupt\n  - Fix issue with hub status_change is not aligned\n\n- MSC\n\n  - Fix bug in ``tuh_msc_ready()``\n  - Fix host msc get maxlun not using aligned section memory\n\n0.15.0\n======\n\n- Add codespell to detect typo\n- Add support for fuzzing and bagde for oss-fuzz\n- [osal]\n\n  - Allow the use of non-static allocation for FreeRTOS\n  - Fix FreeRTOS wrong task switch in some cases\n\n- Fix tu_fifo memory overflown when repeatedly write to overwritable fifo (accumulated more than 2 depths)\n- Better support for IAR (ARM) with ci build check for stm32 mcus.\n- Fix Windows build for some mingw gnu make situations\n\nController Driver (DCD & HCD)\n-----------------------------\n\n- Add new port support (WIP) for WCH CH32V307 USB Highspeed\n- Add new port support (WIP) for PIC32MM/MX & PIC24\n\n- [nRF]\n\n  - Fix endpoint internal state when closed\n  - Fix reception of large ISO packets\n\n- [rp2040]\n\n  - [dcd] Implement workaround for Errata 15. This enable SOF when bulk-in endpoint is in use and reduce its bandwidth to only 80%\n  - [hcd] Fix shared irq slots filling up when ``hcd_init()`` is called multiple times\n  - [hcd] Support host bulk endpoint using hw \"interrupt\" endpoint. Note speed limit is 64KB/s\n\n- [samd][dcd] Add support for ISO endpoint\n- [dwc2][dcd] Add support for stm32u5xx\n- [esp32sx] Fix Isochronous transfers only transmitted on even frame\n- [lpc_ip3511][dcd] Add isochronous support and fix endpoint accidental write\n- [ft90x] Improve and enhance support for FT9xx MCU, tested with more examples\n\nDevice Stack\n------------\n\n- [Video]\n\n  - Add support for MJPEG\n  - Fix probe on macOS\n\n- [MIDI]\n\n  - Support port name strings\n  - fix MS Header wTotalLength computation\n\n- [HID]\n\n  - Add FIDO descriptor template\n  - change length in ``tud_hid_report_complete_cb()`` from ``uint8_t`` to ``uint16_t``\n\n- [CDC]\n\n  - Fix autoflush for FIFO < MPS\n  - Fix tx fifo memory overflown when DTR is not set and ``tud_cdc_write()`` is called repeatedly with large enough data\n\n- [USBTMC] Fix packet size with highspeed\n\nHost Stack\n----------\n\n- Retry a few times with transfers in enumeration since device can be unstable when starting up\n- [MSC] Rework host masstorage API. Add new ``host/msc_file_explorer`` example\n- [CDC]\n\n  - Add support for host cdc\n  - Fix host cdc with device without IAD e.g Arduino Due\n\n0.14.0\n======\n\n- Improve compiler support for CCRX and IAR\n- Add timeout to ``osal_queue_receive()``\n- Add ``tud_task_ext(timeout, in_isr)`` as generic version of ``tud_task()``. Same as ``tuh_task_ext()``, ``tuh_task()``\n- Enable more warnings ``-Wnull-dereference -Wuninitialized -Wunused -Wredundant-decls -Wconversion``\n- Add new examples\n\n  - ``host/bare_api`` to demonstrate generic (app-level) enumeration and endpoint transfer\n  - ``dual/host_hid_to_device_cdc`` to run both device and host stack concurrently, get HID report from host and print out to device CDC. This example only work with multiple-controller MCUs and rp2040 with the help of pio-usb as added controller.\n\nController Driver (DCD & HCD)\n-----------------------------\n\n- Enhance rhports management to better support dual roles\n\n  - ``CFG_TUD_ENABLED``/``CFG_TUH_ENABLED``, ``CFG_TUD_MAX_SPEED``/``CFG_TUH_MAX_SPEED`` can be used to replace ``CFG_TUSB_RHPORT0_MODE``/``CFG_TUSB_RHPORT1_MODE``\n  - ``tud_init(rphort)``, ``tuh_init(rhport)`` can be used to init stack on specified roothub port (controller) instead of ``tusb_init(void)``\n- Add dcd/hcd port specific defines ``TUP_`` (stand for tinyusb port-specific)\n- [dwc2]\n\n  - Update to support stm32 h72x, h73x with only 1 otg controller\n  - Fix overwrite with grstctl when disable endpoint\n- [EHCI] Fix an issue with EHCI driver\n- [msp430] Fix for possible bug in msp430-elf-gcc 9.3.0\n- [nrf5x] Fix DMA access race condition using atomic function\n- [pic32] Fix PIC32 santiy\n- [rp2040]\n\n  - Add PICO-PIO-USB as controller (device/host) support for rp2040\n  - Use shared IRQ handlers, so user can also hook the USB IRQ\n  - Fix resumed signal not reported to device stack\n- [stm32fsdev] Add support for stm32wb55\n\nDevice Stack\n------------\n\n- [Audio] Add support for feedback endpoint computation\n\n  - New API ``tud_audio_feedback_params_cb()``, ``tud_audio_feedback_interval_isr()``.\n  - Supported computation method are: frequency with fixed/float or power of 2. Feedback with fifo count is not yet supported.\n  - Fix nitfs (should be 3) in ``TUD_AUDIO_HEADSET_STEREO_DESCRIPTOR``\n  - Fix typo in ``audiod_rx_done_cb()``\n\n- [DFU] Fix coexistence with other interfaces BTH, RNDIS\n- [MSC] Fix inquiry response additional length field\n- [Venndor] Improve write performance\n\nHost Stack\n----------\n\n- Add new API ``tuh_configure(rhport, cfg_id, cfg_param)`` for dynamnic port specific behavior configuration\n- [HID] Open OUT endpoint if available\n- [Hub] hub clear port and device interrupts\n- [USBH] Major improvement\n\n  - Rework usbh control transfer with complete callback. New API ``tuh_control_xfer()`` though still only carry 1 usbh (no queueing) at a time.\n  - Add generic endpoint transfer with ``tuh_edpt_open()``, ``tuh_edpt_xfer()``. Require ``CFG_TUH_API_EDPT_XFER=1``\n  - Support app-level enumeration with new APIs\n\n    - ``tuh_descriptor_get()``, ``tuh_descriptor_get_device()``, ``tuh_descriptor_get_configuration()``, ``tuh_descriptor_get_hid_report()``\n    - ``tuh_descriptor_get_string()``, ``tuh_descriptor_get_manufacturer_string()``, ``tuh_descriptor_get_product_string()``, ``tuh_descriptor_get_serial_string()``\n    - Also add ``_sync()`` as sync/blocking version for above APIs\n\n0.13.0\n======\n\n- [tu_fifo] Fix locked mutex when full, and return type in ``peek_n()``\n\nController Driver (DCD & HCD)\n-----------------------------\n\n- [DWC2] Generalize synopsys dwc2 with synopsys/dwc2 which support both FS and HS phy (UTMI and ULPI) for various MCUs.\n\n  - Broadcom 28/27xx on raspberrypi SBC\n  - Silicon Labs EFM32\n  - Espressif ESP32 Sx\n  - GigaDevice GD32\n  - ST STM32\n  - Infineon XMC\n- [KL25] Add new HCD for NXP KL25\n- [MUSB] Add new DCD and HCD for Mentor musb with TI MSP432E4\n- [F1C100s] Add new DCD for Allwinner F1C100s family\n- [PIC32MZ] Add new DCD for PIC32MZ\n- [nRF] Fix/Enhance various race condition with: EASY DMA, request HFXO, EPOUT\n- [ChipIdea] rename Transdimension to more popular ChipIdea Highspeed,\n- [RP2040] various update/fix for hcd/dcd\n- [FT9XX] new DCD port for Bridgetek FT90x and FT93x devices\n- [DA1469X] Fix resume\n- [OHCI] Fix device array out of bound\n\nNote: legacy drivers such as st/synopsys, nxp/transdimension are still present in this release but won't receive more update and could be removed in the future.\n\nDevice Stack\n------------\n\n- [Audio] Support disabling feedback format correction (16.16 <-> 10.14 format)\n- [MSC] Add ``tud_msc_request_sense_cb()`` callback, change most default sense error to medium not present (0x02, 0x3A, 0x00)\n- [Video] Fix video_capture example fails enumeration when 8FPS\n\nHost Stack\n----------\n\nNo notable changes\n\n0.12.0\n======\n\n- add ``CFG_TUSB_OS_INC_PATH`` for os include path\n\nDevice Controller Driver (DCD)\n------------------------------\n\n- Getting device stack to pass USB Compliance Verification test (chapter9, HID, MSC). Ports are tested:\n  nRF, SAMD 21/51, rp2040, stm32f4, Renesas RX, iMXRT, ESP32-S2/3, Kinetic KL25/32, DA146xx\n- Added ``dcd_edpt_close_all()`` for switching configuration\n- [Transdimension] Support ``dcd_edpt_xfer_fifo()`` with auto wrap over if fifo buffer is 4K aligned and size is multiple of 4K.\n- [DA146xx] Improve vbus, reset, suspend, resume detection, and remote wakeup.\n\nDevice Stack\n------------\n\n- Add new network driver Network Control Model (CDC-NCM), update ``net_lwip_webserver`` to work with NCM (need re-configure example)\n- Add new USB Video Class UVC 1.5 driver and video_capture example (work in progress)\n- Fix potential buffer overflow for HID, bluetooth drivers\n\nHost Controller Driver (HCD)\n----------------------------\n\nNo notable changes\n\nHost Stack\n----------\n\nNo notable changes\n\n0.11.0 (2021-08-29)\n===================\n\n- Add host/hid_controller example: only worked/tested with Sony PS4 DualShock controller\n- Add device/hid_boot_interface example\n- Add support for Renesas CCRX toolchain for RX mcu\n\nDevice Controller Driver (DCD)\n------------------------------\n\n- Add new DCD port for SAMx7x (E70, S70, V70, V71)\n- Add new mcu K32L2Bxx\n- Add new mcu GD32VF103\n- Add new mcu STM32l151\n- Add new mcu SAML21\n- Add new mcu RX65n RX72n\n- Fix NUC120/121/126 USBRAM can only be accessed in byte manner. Also improve set_address & disable sof\n- Add Suspend/Resume handling for Renesas RX family.\n- Fix DA1469x no VBUS startup\n\nSynopsys\n^^^^^^^^\n\n- Fix Synopsys set address bug which could cause re-enumeration failed\n- Fix ``dcd_synopsys`` driver integer overflow in HS mode (issue #968)\n\nnRF5x\n^^^^^\n\n- Add nRF5x suspend, resume and remote wakeup\n- Fix nRF5x race condition with ``TASKS_EP0RCVOUT``\n\nRP2040\n^^^^^^\n\n- Add RP2040 suspend & resume support\n- Implement double buffer for both host and device (#891). However device EPOUT is still single buffered due to techinical issue with short packet\n\nDevice Stack\n------------\n\nUSBD\n^^^^\n\n- Better support big endian mcu\n- Add ``tuh_inited()`` and ``tud_inited()``, will separate ``tusb_init/inited()`` to ``tud/tuh_init/inited()``\n- Add ``dcd_attr.h`` for defining common controller attribute such as max endpoints\n\nBluetooth\n^^^^^^^^^\n\n- Fix stridx error in descriptor template\n\nDFU\n^^^\n\n- Enhance DFU implementation to support multiple alternate interface and better support ``bwPollTimeout``\n- Rename ``CFG_TUD_DFU_MODE`` to simply ``CFG_TUD_DFU``\n\nHID\n^^^\n\n- Fix newline usage keyboard (ENTER 0x28)\n- Better support Hid Get/Set report\n- Change max gamepad support from 16 to 32 buttons\n\nMIDI\n^^^^\n\n- Fix midi available\n- Fix midi data\n- Fix an issue when calling midi API when not enumerated yet\n\nUAC2\n^^^^\n\n- Fix bug and enhance of UAC2\n\nVendor\n^^^^^^\n\n- Fix vendor fifo deadlock in certain case\n- Add ``tud_vendor_n_read_flush()``\n\nHost Controller Driver (HCD)\n----------------------------\n\nRP2040\n^^^^^^\n\n- Implement double buffered to fix E4 errata and boost performance\n- Lots of rp2040 update and enhancement\n\nHost Stack\n----------\n\n- Major update and rework most of host stack, still needs more improvement\n- Lots of improvement and update in parsing configuration and control\n- Rework and major update to HID driver. Will default to enable boot interface if available\n- Separate ``CFG_TUH_DEVICE_MAX`` and ``CFG_TUH_HUB`` for better management and reduce SRAM usage\n\n0.10.1 (2021-06-03)\n===================\n\n- rework rp2040 examples and CMake build, allow better integration with pico-sdk\n\nHost Controller Driver (HCD)\n----------------------------\n\n- Fix rp2040 host driver: incorrect PID with low speed device with max packet size of 8 bytes\n- Improve hub driver\n- Remove obsolete ``hcd_pipe_queue_xfer()``/``hcd_pipe_xfer()``\n- Use ``hcd_frame_number()`` instead of micro frame\n- Fix OHCI endpoint address and ``xferred_bytes`` in xfer complete event\n\n0.10.0 (2021-05-28)\n===================\n\n- Rework tu_fifo_t with separated mutex for read and write, better support DMA with read/write buffer info. And constant address mode\n- Improve audio_test example and add audio_4_channel_mic example\n- Add new dfu example\n- Remove pico-sdk from submodule\n\nDevice Controller Driver (DCD)\n------------------------------\n\n- Add new DCD port for Silabs EFM32GG12 with board Thunderboard Kit (SLTB009A)\n- Add new DCD port Renesas RX63N, board GR-CITRUS\n- Add new (optional) endpoint API dcd_edpt_xfer_fifo\n- Fix build with nRF5340\n- Fix build with lpc15 and lpc54\n- Fix build with lpc177x_8x\n- STM32 Synopsys: greatly improve Isochronous transfer with ``edpt_xfer_fifo()`` API\n- Support LPC55 port1 highspeed\n- Add support for Espressif esp32s3\n- nRF: fix race condition that could cause drop packet of Bulk OUT transfer\n\nUSB Device Driver (USBD)\n------------------------\n\n- Add new (optional) endpoint ADPI ``usbd_edpt_xfer_fifo()``\n\nDevice Class Driver\n-------------------\n\nCDC\n\n- [Breaking] ``tud_cdc_peek()``, ``tud_vendor_peek()`` no longer support random offset and dropped position parameter.\n\nDFU\n\n- Add new DFU 1.1 class driver (WIP)\n\nHID\n\n- Fix keyboard report descriptor template\n- Add more hid keys constant from 0x6B to 0xA4\n\n- [Breaking] rename API\n\n  - ``HID_PROTOCOL_NONE/KEYBOARD/MOUSE`` to ``HID_ITF_PROTOCOL_NONE/KEYBOARD/MOUSE``\n  - ``tud_hid_boot_mode()`` to ``tud_hid_get_protocol()``\n  - ``tud_hid_boot_mode_cb()`` to ``tud_hid_set_protocol_cb()``\n\nMIDI\n\n- Fix MIDI buffer overflow issue\n\n- [Breaking] rename API\n\n  - Rename ``tud_midi_read()`` to ``tud_midi_stream_read()``\n  - Rename ``tud_midi_write()`` to ``tud_midi_stream_write()``\n  - Rename ``tud_midi_receive()`` to ``tud_midi_packet_read()``\n  - Rename ``tud_midi_send()`` to ``tud_midi_packet_write()``\n\nHost Controller Driver (HCD)\n----------------------------\n\n- No noticeable changes\n\nUSB Host Driver (USBH)\n----------------------\n\n- No noticeable changes\n\nHost Class Driver\n-----------------\n\n- HID: Rework host hid driver, basically everything changes\n\n\n0.9.0 (2021-03-12)\n==================\n\nDevice Stack\n------------\n\nDevice Controller Driver (DCD)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nRP2040\n\n- Fix endpoint buffer reallocation overrun problem\n- Fix osal_pico queue overflow in initialization\n- Fix Isochronous endpoint buffer size in transfer\n- Optimize hardware endpoint struct to reduce RAM usage\n- Fix enum walkaround forever check for SE0 when pull up is disabled\n\nSony CXD56\n\n- Pass the correct speed on Spresense\n- Fix setup processed flag\n\nNXP Transdimention\n\n- Update dcd_init() to reset controller to device mode\n\nUSB Device Driver (USBD)\n^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Fix issue with status zlp (``tud_control_status()``) is returned by class driver with SET/CLEAR_FEATURE for endpoint.\n- Correct endpoint size check for fullspeed bulk, can be 8, 16, 32, 64\n- Ack SET_INTERFACE even if it is not implemented by class driver.\n\nDevice Class Driver\n^^^^^^^^^^^^^^^^^^^\n\nDFU Runtime\n\n- rename ``dfu_rt()`` to ``dfu_runtime()`` for easy reading\n\nCDC\n\n- Add ``tud_cdc_send_break_cb()`` to support break request\n- Improve CDC receive, minor behavior changes: when ``tud_cdc_rx_wanted_cb()`` is invoked wanted_char may not be the last byte in the fifo\n\nHID\n\n- [Breaking] Add itf argument to hid API to support multiple instances, follow API has signature changes\n\n  - ``tud_hid_descriptor_report_cb()``\n  - ``tud_hid_get_report_cb()``\n  - ``tud_hid_set_report_cb()``\n  - ``tud_hid_boot_mode_cb()``\n  - ``tud_hid_set_idle_cb()``\n\n- Add report complete callback ``tud_hid_report_complete_cb()`` API\n- Add DPad/Hat support for HID Gamepad\n\n  - ``TUD_HID_REPORT_DESC_GAMEPAD()`` now support 16 buttons, 2 joysticks, 1 hat/dpad\n  - Add ``hid_gamepad_report_t`` along with ``GAMEPAD_BUTTON_`` and ``GAMEPAD_HAT_`` enum\n  - Add Gamepad to ``hid_composite`` / ``hid_composite_freertos`` example\n\nMIDI\n\n- Fix dropping MIDI sysex message when fifo is full\n- Fix typo in ``tud_midi_write24()``, make example less ambiguous for cable and channel\n- Fix incorrect endpoint descriptor length, MIDI v1 use Audio v1 which has 9-byte endpoint descriptor (instead of 7)\n\nHost Stack\n----------\n\nHost Controller Driver (HCD)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\n- Add rhport to ``hcd_init()``\n- Improve EHCI/OHCI driver abstraction\n\n  - Move echi/ohci files to portable/\n  - Rename ``hcd_lpc18_43`` to ``hcd_transdimension``\n  - Sub hcd API with ``hcd_ehci_init()``, ``hcd_ehci_register_addr()``\n\n- Update NXP transdimension ``hcd_init()`` to reset controller to host mode\n\n  - Ported hcd to rt10xx\n\nUSB Host Driver (USBH)\n^^^^^^^^^^^^^^^^^^^^^^\n\n- No noticeable changes to usbh\n\nHost Class Driver\n^^^^^^^^^^^^^^^^^\n\nMSC\n\n- Rename ``tuh_msc_scsi_inquiry()`` to ``tuh_msc_inquiry()``\n- Rename ``tuh_msc_mounted_cb()``/``tuh_msc_unmounted_cb()`` to ``tuh_msc_mount_cb()``/``tuh_msc_unmount_cb()`` to match device stack naming\n- Change ``tuh_msc_is_busy()`` to ``tuh_msc_ready()``\n- Add read10 and write10 function: ``tuh_msc_read10()``, ``tuh_msc_write10()``\n- Read_Capacity is invoked as part of enumeration process\n- Add ``tuh_msc_get_block_count()``, ``tuh_msc_get_block_size()``\n- Add ``CFG_TUH_MSC_MAXLUN`` (default to 4) to hold lun capacities\n\nOthers\n------\n\n- Add basic support for rt-thread OS\n- Change zero bitfield length to more explicit padding\n- Build example now fetch required submodules on the fly while running ``make`` without prior submodule init for mcu drivers\n- Update pico-sdk to v1.1.0\n\n**New Boards**\n\n- Microchip SAM E54 Xplained Pro\n- LPCXpresso 55s28\n- LPCXpresso 18s37\n\n\n0.8.0 (2021-02-05)\n==================\n\nDevice Controller Driver\n------------------------\n\n- Added new device support for Raspberry Pi RP2040\n- Added new device support for NXP Kinetis KL25ZXX\n- Use ``dcd_event_bus_reset()`` with link speed to replace bus_signal\n\n- ESP32-S2:\n\n  - Add bus suspend and wakeup support\n\n- SAMD21:\n\n  - Fix (walkaround) samd21 setup_packet overflow by USB DMA\n\n- STM32 Synopsys:\n\n  - Rework USB FIFO allocation scheme and allow RX FIFO size reduction\n\n- Sony CXD56\n\n  - Update Update Spresense SDK to 2.0.2\n  - Fix dcd issues with setup packets\n  - Correct EP number for cdc_msc example\n\nUSB Device\n----------\n\n**USBD**\n\n- Rework usbd control transfer to have additional stage parameter for setup, data, status\n- Fix ``tusb_init()`` return true instead of ``TUSB_ERROR_NONE``\n- Added new API ``tud_connected()`` that return true after device got out of bus reset and received the very first setup packet\n\n**Class Driver**\n\n- CDC\n\n  - Allow to transmit data, even if the host does not support control line states i.e set DTR\n\n- HID\n\n  - change default ``CFG_TUD_HID_EP_BUFSIZE`` from 16 to 64\n\n- MIDI\n\n  - Fix midi sysex sending bug\n\n- MSC\n\n  - Invoke only scsi complete callback after status transaction is complete.\n  - Fix ``scsi_mode_sense6_t`` padding, which cause IAR compiler internal error.\n\n- USBTMC\n\n  - Change interrupt endpoint example size to 8 instead of 2 for better compatibility with mcu\n\n**Example**\n\n- Support make from windows ``cmd.exe``\n- Add HID Consumer Control (media keys) to ``hid_composite`` & ``hid_composite_freertos`` examples\n\n\nUSB Host\n--------\n\nNo noticeable changes to host stack\n\nNew Boards\n----------\n\n- NXP/Freescale Freedom FRDM-KL25Z\n- Feather Double M33 express\n- Raspberry Pi Pico\n- Adafruit Feather RP2040\n- Adafruit Itsy Bitsy RP2040\n- Adafruit QT RP2040\n- Adfruit Feather ESP32-S2\n- Adafruit Magtag 29\" Eink\n- Adafruit Metro ESP32-S2\n- Adafruit PyBadge\n- Adafruit PyPortal\n- Great Scott Gadgets' LUNA D11 & D21\n\n\n0.7.0 (2020-11-08)\n==================\n\nDevice Controller Driver\n------------------------\n\n- Added new support for Espressif ESP32-S2\n- Added new support for Dialog DA1469x\n- Enhance STM32 Synopsys\n\n- Support bus events disconnection/suspend/resume/wakeup\n\n  - Improve transfer performance with optimizing xfer and fifo size\n  - Support Highspeed port (OTG_HS) with both internal and external PHY\n  - Support multiple usb ports with rhport=1 is highspeed on selected MCUs e.g H743, F23. It is possible to have OTG_HS to run on Fullspeed PHY (e.g lacking external PHY)\n  - Add ISO transfer, fix odd/even frame\n  - Fix FIFO flush during stall\n  - Implement ``dcd_edpt_close()`` API\n  - Support F105, F107\n\n- Enhance STM32 fsdev\n\n  - Improve dcd fifo allocation\n  - Fix ISTR race condition\n  - Support remap USB IRQ on supported MCUs\n  - Implement ``dcd_edpt_close()`` API\n\n- Enhance NUC 505: enhance set configure behavior\n\n- Enhance SAMD\n\n  - Fix race condition with setup packet\n  - Add SAMD11 option ``OPT_MCU_SAMD11``\n  - Add SAME5x option ``OPT_MCU_SAME5X``\n\n- Fix SAMG control data toggle and stall race condition\n\n- Enhance nRF\n\n  - Fix hanged when ``tud_task()`` is called within critical section (disabled interrupt)\n  - Fix disconnect bus event not submitted\n  - Implement ISO transfer and ``dcd_edpt_close()``\n\n\nUSB Device\n----------\n\n**USBD**\n\n- Add new class driver for **Bluetooth HCI** class driver with example can be found in [mynewt-tinyusb-example](https://github.com/hathach/mynewt-tinyusb-example) since it needs mynewt OS to run with.\n- Fix USBD endpoint usage racing condition with ``usbd_edpt_claim()``/``usbd_edpt_release()``\n- Added ``tud_task_event_ready()`` and ``osal_queue_empty()``. This API is needed to check before enter low power mode with WFI/WFE\n- Rename USB IRQ Handler to ``dcd_int_handler()``. Application must define IRQ handler in which it calls this API.\n- Add ``dcd_connect()`` and ``dcd_disconnect()`` to enable/disable internal pullup on D+/D- on supported MCUs.\n- Add ``usbd_edpt_open()``\n- Remove ``dcd_set_config()``\n- Add ``OPT_OS_CUMSTOM`` as hook for application to overwrite and/or add their own OS implementation\n- Support SET_INTERFACE, GET_INTERFACE request\n- Add Logging for debug with optional uart/rtt/swo printf retarget or ``CFG_TUSB_DEBUG_PRINTF`` hook\n- Add IAR compiler support\n- Support multiple configuration descriptors. ``TUD_CONFIG_DESCRIPTOR()`` template has extra config_num as 1st argument\n- Improve USB Highspeed support with actual link speed detection with ``dcd_event_bus_reset()``\n\n- Enhance class driver management\n\n  - ``usbd_driver_open()`` add max length argument, and return length of interface (0 for not supported). Return value is used for finding appropriate driver\n  - Add application implemented class driver via ``usbd_app_driver_get_cb()``\n  - IAD is handled to assign driver id\n\n- Added ``tud_descriptor_device_qualifier_cb()`` callback\n- Optimize ``tu_fifo`` bulk write/read transfer\n- Forward non-std control request to class driver\n- Let application handle Microsoft OS 1.0 Descriptors (the 0xEE index string)\n- Fix OSAL FreeRTOS yield from ISR\n\n**Class Drivers**\n\n- USBNET: remove ACM-EEM due to lack of support from host\n- USBTMC: fix descriptors when INT EP is disabled\n\n- CDC:\n\n  - Send zero length packet for end of data when needed\n  - Add ``tud_cdc_tx_complete_cb()`` callback\n  - Change ``tud_cdc_n_write_flush()`` return number of bytes forced to transfer, and flush when writing enough data to fifo\n\n- MIDI:\n\n  - Add packet interface\n  - Add multiple jack descriptors\n  - Fix MIDI driver for sysex\n\n- DFU Runtime: fix response to SET_INTERFACE and DFU_GETSTATUS request\n\n- Rename some configure macro to make it clear that those are used directly for endpoint transfer\n\n  - ``CFG_TUD_HID_BUFSIZE`` to ``CFG_TUD_HID_EP_BUFSIZE``\n  - ``CFG_TUD_CDC_EPSIZE`` to ``CFG_TUD_CDC_EP_BUFSIZE``\n  - ``CFG_TUD_MSC_BUFSIZE`` to ``CFG_TUD_MSC_EP_BUFSIZE``\n  - ``CFG_TUD_MIDI_EPSIZE`` to ``CFG_TUD_MIDI_EP_BUFSIZE``\n\n- HID:\n\n  - Fix gamepad template descriptor\n  - Add multiple HID interface API\n  - Add extra comma to HID_REPORT_ID\n\nUSB Host\n--------\n\n- Rework USB host stack (still work in progress)\n   - Fix compile error with pipehandle\n   - Rework usbh control and enumeration as non-blocking\n\n- Improve Hub, MSC, HID host driver\n\nExamples\n--------\n\n- Add new ``hid_composite_freertos``\n- Add new ``dynamic_configuration`` to demonstrate how to switch configuration descriptors\n- Add new ``hid_multiple_interface``\n\n- Enhance ``net_lwip_webserver`` example\n\n  - Add multiple configuration: RNDIS for Windows, CDC-ECM for macOS (Linux will work with both)\n  - Update lwip to STABLE-2_1_2_RELEASE for ``net_lwip_webserver``\n\n- Added new Audio example: ``audio_test`` ``uac2_headsest``\n\nNew Boards\n----------\n\n- Espressif ESP32-S2: saola_1, kaluga_1\n- STM32: F746 Nucleo, H743 Eval, H743 Nucleo, F723 discovery, stlink v3 mini, STM32L4r5 Nucleo\n- Dialog DA1469x dk pro and dk usb\n- Microchip: Great Scoot Gadgets' LUNA, samd11_xplained, D5035-01, atsamd21 xplained pro\n- nRF: ItsyBitsy nRF52840\n\n\n0.6.0 (2020-03-30)\n==================\n\nAdded **CONTRIBUTORS.md** to give proper credit for contributors to the stack. Special thanks to `Nathan Conrad <https://github.com/pigrew>`__ , `Peter Lawrence <https://github.com/majbthrd>`__ , `William D. Jones <https://github.com/cr1901>`__ and `Sean Cross <https://github.com/xobs>`__ and others for spending their precious time to add lots of features and ports for this release.\n\nAdded\n-----\n\n**MCU**\n\n- Added support for Microchip SAMG55\n- Added support for Nordic nRF52833\n- Added support for Nuvoton: NUC120, NUC121/NUC125, NUC126, NUC505\n- Added support for NXP LPC: 51Uxx, 54xxx, 55xx\n- Added support for NXP iMXRT: RT1011, RT1015, RT1021, RT1052, RT1062, RT1064\n- Added support for Sony CXD56 (Spresense)\n- Added support for STM32: L0, F0, F1, F2, F3, F4, F7, H7\n- Added support for TI MSP430\n- Added support for ValentyUSB's eptri\n\n**Class Driver**\n\n- Added DFU Runtime class driver\n- Added Network class driver with RNDIS, CDC-ECM, CDC-EEM (work in progress)\n- Added USBTMC class driver\n- Added WebUSB class driver using vendor-specific class\n- Added multiple instances support for CDC and MIDI\n- Added a handful of unit test with Ceedling.\n- Added LOG support for debugging with CFG_TUSB_DEBUG\n- Added ``tud_descriptor_bos_cb()`` for BOS descriptor (required for USB 2.1)\n- Added ``dcd_edpt0_status_complete()`` as optional API for DCD\n\n**Examples**\n\nFollowing examples are added:\n\n- ``board_test``\n- ``cdc_dual_ports``\n- ``dfu_rt``\n- ``hid_composite``\n- ``net_lwip_webserver``\n- ``usbtmc``\n- ``webusb_serial``\n\nChanged\n-------\n\n- Changed ``tud_descriptor_string_cb()`` to have additional Language ID argument\n- Merged ``hal_nrf5x.c`` into ``dcd_nrf5x.c``\n- Merged ``dcd_samd21.c`` and ``dcd_samd51.c`` into ``dcd_samd.c``\n- Generalized ``dcd_stm32f4.c`` to ``dcd_synopsys.c``\n- Changed ``cdc_msc_hid`` to ``cdc_msc`` (drop hid) due to limited endpoints number of some MCUs\n- Improved DCD SAMD stability, fix missing setup packet occasionally\n- Improved ``usbd/usbd_control`` with proper handling of zero-length packet (ZLP)\n- Improved STM32 DCD FSDev\n- Improved STM32 DCD Synopsys\n- Migrated CI from Travis to Github Action\n- Updated nrfx submodule to 2.1.0\n- Fixed mynewt osal queue definition\n- Fixed ``cdc_msc_freertos`` example build for all MCUs\n\n\n0.5.0 (2019-06)\n===============\n\nFirst release, device stack works great, host stack works but still need improvement.\n\n- Special thanks to @adafruit team, especially @tannewt to help out immensely to rework device stack: simplify osal & control transfer, adding SAMD21/SAMD51 ports, writing porting docs, adding MIDI class support etc...\n- Thanks to @cr1901 for adding STM32F4 port.\n- Thanks to @PTS93 and @todbot for HID raw API\n"
  },
  {
    "path": "docs/info/code_of_conduct.rst",
    "content": ".. include:: ../../CODE_OF_CONDUCT.rst\n"
  },
  {
    "path": "docs/info/contributors.rst",
    "content": ".. include:: ../../CONTRIBUTORS.rst"
  },
  {
    "path": "docs/info/index.rst",
    "content": "****\nInfo\n****\n\nIndex\n=====\n\n.. toctree::\n   :maxdepth: 2\n\n   changelog\n   contributors\n   code_of_conduct\n"
  },
  {
    "path": "docs/integration.rst",
    "content": "*******************\nIntegrating TinyUSB\n*******************\n\nOnce you've seen TinyUSB working in the examples, use this guide to wire the stack into your own firmware.\n\nIntegration Steps\n=================\n\n1. **Get TinyUSB**: Copy this repository or add it as a git submodule to your project at ``your_project/tinyusb``.\n2. **Add source files**: Add every ``.c`` file from ``tinyusb/src/`` to your project build system.\n\n.. note::\n   Only supported dcd/hcd drivers for your CPU sources under ``tinyusb/src/portable/vendor/usbip/`` are needed. Add\n\n3. **Configure TinyUSB**: Create ``tusb_config.h`` with macros such as ``CFG_TUSB_MCU``, ``CFG_TUSB_OS``, and class enable flags. Start from any example's ``tusb_config.h`` and tweak.\n4. **Configure include paths**: Add ``your_project/tinyusb/src`` (and the folder holding ``tusb_config.h``) to your include paths.\n5. **Implement USB descriptors**: For device stack, implement the ``tud_descriptor_*_cb()`` callbacks (device) or host descriptor helpers that match your product.\n6. **Initialize TinyUSB**: Call ``tusb_init()`` once the clocks/peripherals are ready. Pass ``tusb_rhport_init_t`` if you need per-port settings.\n7. **Handle interrupts**: From the USB ISR call ``tusb_int_handler(rhport, true)`` so the stack can process events.\n8. **Run USB tasks**: Call ``tud_task()`` (device) or ``tuh_task()`` (host) regularly from the main loop, RTOS task.\n9. **Implement class callbacks**: Provide the callbacks for the classes you enabled (e.g., ``tud_cdc_rx_cb()``, ``tuh_msc_mount_cb()``).\n\nMinimal Example\n===============\n\n.. code-block:: c\n\n   #include \"tusb.h\"\n\n   int main(void) {\n     board_init();  // Your board initialization\n\n     // Init device stack on roothub port 0 for highspeed device\n     tusb_rhport_init_t dev_init = {\n       .role  = TUSB_ROLE_DEVICE,\n       .speed = TUSB_SPEED_HIGH\n     };\n     tusb_init(0, &dev_init);\n\n     // init host stack on roothub port 1 for fullspeed host\n     tusb_rhport_init_t host_init = {\n       .role  = TUSB_ROLE_HOST,\n       .speed = TUSB_SPEED_FULL\n     };\n     tusb_init(1, &host_init);\n\n     while (1) {\n       tud_task();  // device task\n       tuh_task();  // host task\n\n       app_task();  // Your application logic\n     }\n   }\n\n   void USB0_IRQHandler(void) {\n     // forward interrupt port 0 to TinyUSB stack\n     tusb_int_handler(0, true);\n   }\n\n   void USB1_IRQHandler(void) {\n     // forward interrupt port 1 to TinyUSB stack\n     tusb_int_handler(1, true);\n   }\n\n.. note::\n   Unlike many libraries, TinyUSB callbacks don't need to be registered. Implement functions with the prescribed names (for example ``tud_cdc_rx_cb()``) and the stack will invoke them automatically.\n\n.. note::\n   Naming follows ``tud_*`` for device APIs and ``tuh_*`` for host APIs. Refer to :doc:`reference/glossary` for a summary of the prefixes and callback naming rules.\n\n\nSTM32CubeIDE Integration\n========================\n\nTo integrate TinyUSB device stack with STM32CubeIDE\n\n1. In STM32CubeMX, enable USB_OTG_FS/HS under Connectivity, set to \"Device_Only\" mode\n2. Enable the USB global interrupt in NVIC Settings\n3. Add ``tusb.h`` include and call ``tusb_init()`` in main.c\n4. Call ``tud_task()`` in your main loop\n5. In the generated ``stm32xxx_it.c``, modify the USB IRQ handler to call ``tud_int_handler(0)``\n\n.. code-block:: c\n\n   void OTG_FS_IRQHandler(void) {\n     tud_int_handler(0);\n   }\n\n6. Create ``tusb_config.h`` and ``usb_descriptors.c`` files\n\n.. tip::\n   STM32CubeIDE generated code conflicts with TinyUSB. Don't use STM32's built-in USB middleware (USB Device Library) when using TinyUSB. Disable USB code generation in STM32CubeMX and let TinyUSB handle all USB functionality.\n"
  },
  {
    "path": "docs/porting.rst",
    "content": "\n*******\nPorting\n*******\n\nTinyUSB is designed to be a universal USB protocol stack for microcontrollers. It\nhandles most of the high level USB protocol and relies on the microcontroller's USB peripheral for\ndata transactions on different endpoints. Porting is the process of adding low-level support for\nthe rest of the common stack. Once the low-level is implemented, it is very easy to add USB support\nfor the microcontroller to other projects, especially those already using TinyUSB such as CircuitPython.\n\nBelow are instructions on how to get the cdc_msc device example running on a new microcontroller. Doing so includes adding the common code necessary for other uses while minimizing other extra code. Whenever you see a phrase or word in ``<>`` it should be replaced.\n\nRegister defs\n-------------\n\nThe first step to adding support is including the register definitions and startup code for the\nmicrocontroller in TinyUSB. We write the TinyUSB implementation against these structs instead of higher level functions to keep the code small and to prevent function name collisions in linking of larger projects. For ARM microcontrollers this is the CMSIS definitions. They should be\nplaced in the ``hw/mcu/<vendor>/<chip_family>`` directory.\n\nOnce this is done, create a directory in ``hw/bsp/<your board name>`` for the specific board you are using to test the code (duplicating an existing board's directory is the best way to get started). The board should be a readily available development board so that others can also test.\n\nBuild\n-----\n\nNow that those directories are in place, we can start our iteration process to get the example building successfully. To build, run from the root of TinyUSB:\n\n.. code-block:: bash\n\n   make -C examples/device/cdc_msc BOARD=<board>\n\nUnless you've read ahead, this will fail miserably. Now, lets get it to fail less by updating the files in the board directory. The code in the board's directory is responsible for setting up the microcontroller's clocks and pins so that USB works. TinyUSB itself only operates on the USB peripheral. The board directory also includes information what files are needed to build the example.\n\nOne of the first things to change is the ``-DCFG_TUSB_MCU`` C flag in the ``board.mk`` file. This is used to tell TinyUSB what platform is being built. So, add an entry to ``src/tusb_option.h`` and update the ``CFLAGS`` to match.\n\nUpdate ``board.mk``'s VENDOR and CHIP_FAMILY values when creating the directory for the struct files. Duplicate one of the other sources from ``src/portable`` into ``src/portable/<vendor>/<chip_family>`` and delete all of the implementation internals. We'll cover what everything there does later. For now, get it compiling.\n\nImplementation\n--------------\n\nAt this point you should get an error due to an implementation issue and hopefully the build is setup for the new MCU. You will still need to modify the ``board.mk`` to include specific ``CFLAGS``, the linker script, linker flags, source files, include directories. All file paths are relative to the top of the TinyUSB repo.\n\nBoard Support (BSP)\n^^^^^^^^^^^^^^^^^^^\n\nThe board support code is only used for self-contained examples and testing. It is not used when TinyUSB is part of a larger project. Its responsible for getting the MCU started and the USB peripheral clocked. It also optionally provides LED definitions that are used to blink an LED to show that the code is running.\n\nIt is located in ``hw/bsp/<board name>/board_<board name>.c``.\n\n``board_init()``\n~~~~~~~~~~~~~~~~\n\n``board_init()`` is responsible for starting the MCU, setting up the USB clock and USB pins. It is also responsible for initializing LED pins.\n\nOne useful clock debugging technique is to set up a PWM output at a known value such as 500hz based on the USB clock so that you can verify it is correct with a logic probe or oscilloscope.\n\nSetup your USB in a crystal-less mode when available. That makes the code easier to port across boards.\n\n``board_led_write()``\n~~~~~~~~~~~~~~~~~~~~~\n\nFeel free to skip this until you want to verify your demo code is running. To implement, set the pin corresponding to the led to output a value that lights the LED when ``state`` is true.\n\nOS Abstraction Layer (OSAL)\n^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nThe OS Abstraction Layer is responsible for providing basic data structures for TinyUSB that may allow for concurrency when used with an RTOS. Without an RTOS it simply handles concurrency issues between the main code and interrupts. The code is almost entirely agnostic of MCU and lives in ``src/osal``.\n\nIn RTOS configurations, ``tud_task()``/``tuh_task()`` blocks behind a synchronization structure when the event queue is empty, so that the scheduler may give the CPU to a different task. To take advantage of the library's capability to yield the CPU when there are no actionable USB device events, ensure that the ``CFG_TUSB_OS`` symbol is defined, e.g ``OPT_OS_FREERTOS`` enables the FreeRTOS scheduler to schedule other threads than that which calls ``tud_task()``/``tuh_task()``.\n\nDevice API\n^^^^^^^^^^\n\nAfter the USB device is setup, the USB device code works by processing events on the main thread (by calling ``tud_task()``). These events are queued by the USB interrupt handler. So, there are three parts to the device low-level API: device setup, endpoint setup and interrupt processing.\n\nAll of the code for the low-level device API is in ``src/portable/<vendor>/<chip family>/dcd_<chip family>.c``.\n\nDevice Setup\n~~~~~~~~~~~~\n\n``dcd_init()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nInitializes the USB peripheral for device mode and enables it.\nThis function should enable internal D+/D- pull-up for enumeration.\n\n``dcd_int_enable()`` / ``dcd_int_disable()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nEnables or disables the USB device interrupt(s). May be used to prevent concurrency issues when mutating data structures shared between main code and the interrupt handler.\n\n``dcd_int_handler()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nProcesses all the hardware generated events e.g Bus reset, new data packet from host etc ... It will be called by application in the MCU USB interrupt handler.\n\n``dcd_set_address()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nCalled when the device is given a new bus address.\n\nIf your peripheral automatically changes address during enumeration (like the nrf52) you may leave this empty and also no queue an event for the corresponding SETUP packet.\n\n``dcd_remote_wakeup()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nCalled to remote wake up host when suspended (e.g hid keyboard)\n\n``dcd_connect()`` / ``dcd_disconnect()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nConnect or disconnect the data-line pull-up resistor. Define only if MCU has an internal pull-up. (BSP may define for MCU without internal pull-up.)\n\nSpecial events\n~~~~~~~~~~~~~~\n\nYou must let TinyUSB know when certain events occur so that it can continue its work. There are a few methods you can call to queue events for TinyUSB to process.\n\n``dcd_event_bus_signal()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nThere are a number of events that your peripheral may communicate about the state of the bus. Here is an overview of what they are. Events in **BOLD** must be provided for TinyUSB to work.\n\n\n* **DCD_EVENT_RESET** - Triggered when the host resets the bus causing the peripheral to reset. Do any other internal reset you need from the interrupt handler such as resetting the control endpoint.\n* DCD_EVENT_SOF - Signals the start of a new USB frame.\n\nCalls to this look like:\n\n.. code-block:: c\n\n   dcd_event_bus_signal(0, DCD_EVENT_BUS_RESET, true);\n\n\nThe first ``0`` is the USB peripheral number. Statically saying ``0`` is common for single USB device MCUs.\n\nThe ``true`` indicates the call is from an interrupt handler and will always be the case when porting in this way.\n\n``dcd_setup_received()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nSETUP packets are a special type of transaction that can occur at any time on the control endpoint, numbered ``0``. Since they are unique, most peripherals have special handling for them. Their data is always 8 bytes in length as well.\n\nCalls to this look like:\n\n.. code-block:: c\n\n   dcd_event_setup_received(0, setup, true);\n\n\nAs before with ``dcd_event_bus_signal()`` the first argument is the USB peripheral number and the third is true to signal its being called from an interrupt handler. The middle argument is byte array of length 8 with the contents of the SETUP packet. It can be stack allocated because it is copied into the queue.\n\nEndpoints\n~~~~~~~~~\n\nEndpoints are the core of the USB data transfer process. They come in a few forms such as control, isochronous, bulk, and interrupt. We won't cover the details here except with some caveats in open below. In general, data is transferred by setting up a buffer of a given length to be transferred on a given endpoint address and then waiting for an interrupt to signal that the transfer is finished. Further details below.\n\nEndpoints within USB have an address which encodes both the number and direction of an endpoint. TinyUSB provides ``tu_edpt_number()`` and ``tu_edpt_dir()`` to unpack this data from the address. Here is a snippet that does it.\n\n.. code-block:: c\n\n   uint8_t epnum = tu_edpt_number(ep_addr);\n   uint8_t dir   = tu_edpt_dir(ep_addr);\n\n\n``dcd_edpt_open()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nOpening an endpoint is done for all non-control endpoints once the host picks a configuration that the device should use. At this point, the endpoint should be enabled in the peripheral and configured to match the endpoint descriptor. Pay special attention to the direction of the endpoint you can get from the helper methods above. It will likely change what registers you are setting.\n\nAlso make sure to enable endpoint specific interrupts.\n\n``dcd_edpt_close()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\n.. warning::\n   This function is deprecated, ISO transfer should implement dcd_edpt_iso_alloc() and dcd_edpt_iso_activate() instead.\n\nClose an endpoint. his function is used for implementing alternate settings.\n\nAfter calling this, the device should not respond to any packets directed towards this endpoint. When called, this function must abort any transfers in progress through this endpoint, before returning.\n\nImplementation is optional. Must be called from the USB task. Interrupts could be disabled or enabled during the call.\n\n``dcd_edpt_iso_alloc() / dcd_edpt_iso_activate()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\ndcd_edpt_iso_alloc() is used to allocate largest buffer (for all alternative interfaces) for ISO endpoints when device is enumerated. This allows DCD to allocate necessary resources for ISO endpoints in the future.\n\ndcd_edpt_iso_activate() is used to activate or deactivate ISO endpoint when alternate setting is set with active max packet size.\n\n``dcd_edpt_xfer()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\n``dcd_edpt_xfer()`` is responsible for configuring the peripheral to send or receive data from the host. \"xfer\" is short for \"transfer\". **This is one of the core methods you must implement for TinyUSB to work (one other is the interrupt handler).**  Data from the host is the OUT direction and data to the host is IN. It  is used for all endpoints including the control endpoint 0. Make sure to handle the zero-length packet STATUS packet on endpoint 0 correctly. It may be a special transaction to the peripheral.\n\nBesides that, all other transactions are relatively straight-forward. The endpoint address provides the endpoint\nnumber and direction which usually determines where to write the buffer info. The buffer and its length are usually\nwritten to a specific location in memory and the peripheral is told the data is valid. (Maybe by writing a 1 to a\nregister or setting a counter register to 0 for OUT or length for IN.)\n\nThe transmit buffer alignment is determined by ``CFG_TUSB_MEM_ALIGN``.\n\nOne potential pitfall is that the buffer may be longer than the maximum endpoint size of one USB\npacket. Some peripherals can handle transmitting multiple USB packets for a provided buffer (like the SAMD21).\nOthers (like the nRF52) may need each USB packet queued individually. To make this work you'll need to track\nsome state for yourself and queue up an intermediate USB packet from the interrupt handler.\n\nOnce the transaction is going, the interrupt handler will notify TinyUSB of transfer completion.\nDuring transmission, the IN data buffer is guaranteed to remain unchanged in memory until the ``dcd_xfer_complete()`` function is called.\n\nThe ``dcd_edpt_xfer()`` function must never add zero-length-packets (ZLP) on its own to a transfer. If a ZLP is required,\nthen it must be explicitly sent by the stack calling ``dcd_edpt_xfer()``, by calling ``dcd_edpt_xfer()`` a second time with len=0.\nFor control transfers, this is automatically done in ``usbd_control.c``.\n\nAt the moment, only a single buffer can be transmitted at once. There is no provision for double-buffering. new ``dcd_edpt_xfer()`` will not\nbe called again on the same endpoint address until the driver calls ``dcd_xfer_complete()`` (except in cases of USB resets).\n\n``dcd_xfer_complete()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nOnce a transfer completes you must call ``dcd_xfer_complete()`` from the USB interrupt handler to let TinyUSB know that a transaction has completed. Here is a sample call:\n\n.. code-block:: c\n\n   dcd_event_xfer_complete(0, ep_addr, xfer->actual_len, XFER_RESULT_SUCCESS, true);\n\n\nThe arguments are:\n\n\n* the USB peripheral number\n* the endpoint address\n* the actual length of the transfer. (OUT transfers may be smaller than the buffer given in ``dcd_edpt_xfer()``)\n* the result of the transfer. Failure isn't handled yet.\n* ``true`` to note the call is from an interrupt handler.\n\n``dcd_edpt_stall()`` / ``dcd_edpt_clear_stall()``\n\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\"\n\nStalling is one way an endpoint can indicate failure such as when an unsupported command is transmitted. The pair of ``dcd_edpt_stall()``, ``dcd_edpt_clear_stall()`` help manage the stall state of all endpoints.\n\nWoohoo!\n-------\n\nAt this point you should have everything working! 🙂 Of course, you may not write perfect code. Here are some tips and tricks for debugging.\n\nUse `WireShark <https://www.wireshark.org/>`_ or `a Beagle <https://www.totalphase.com/protocols/usb/>`_ to sniff the USB traffic. When things aren't working its likely very early in the USB enumeration process. Figuring out where can help clue in where the issue is. For example:\n\n\n* If the host sends a SETUP packet and its not ACKed then your USB peripheral probably isn't started correctly.\n* If the peripheral is started correctly but it still didn't work, then verify your usb clock is correct. (You did output a PWM based on it right? 🙂)\n* If the SETUP packet is ACKed but nothing is sent back then you interrupt handler isn't queueing the setup packet correctly. (Also, if you are using your own code instead of an example ``tud_task()`` may not be called.) If that's OK, the ``dcd_xfer_complete()`` may not be setting up the next transaction correctly.\n"
  },
  {
    "path": "docs/reference/architecture.rst",
    "content": "************\nArchitecture\n************\n\nThis document explains TinyUSB's internal architecture, design principles, and how different components work together.\n\nDesign Principles\n=================\n\nMemory Safety\n-------------\n\nTinyUSB is designed for resource-constrained embedded systems with strict memory requirements:\n\nTinyUSB uses **no dynamic allocation** - all memory is statically allocated at compile time for predictability. All buffers have bounded, compile-time defined sizes to prevent overflow issues. The TinyUSB core avoids heap allocation, resulting in **predictable memory usage** where consumption is fully deterministic.\n\nThread Safety\n-------------\n\nTinyUSB achieves thread safety through a deferred interrupt model:\n\n- **ISR deferral**: USB interrupts are captured and deferred to task context\n- **Single-threaded processing**: All USB protocol handling occurs in task context\n- **Queue-based design**: Events are queued from ISR and processed in ``tud_task()``\n- **RTOS integration**: Proper semaphore/mutex usage for shared resources\n\nPortability\n-----------\n\nThe stack is designed to work across diverse microcontroller families:\n\n- **Hardware abstraction**: MCU-specific code isolated in portable drivers\n- **OS abstraction**: RTOS dependencies isolated in OSAL layer\n- **Modular design**: Features can be enabled/disabled at compile time\n- **Standard compliance**: Strict adherence to USB specifications\n\nCore Architecture\n=================\n\nLayer Structure\n---------------\n\nTinyUSB follows a layered architecture from hardware to application:\n\n.. figure:: ../assets/stack.svg\n   :width: 500px\n   :align: left\n   :alt: stackup\n\n.. raw:: html\n\n   <div class=\"clear-both\"></div>\n\nComponent Overview\n------------------\n\n- **Application Layer**: Your main application code that uses TinyUSB APIs.\n- **Class Drivers**: Implement specific USB device classes (CDC, HID, MSC, etc.) and handle class-specific requests.\n- **Device/Host Core**: Implements USB protocol state machines, endpoint management, and core USB functionality.\n- **OS Abstraction**: Provides threading primitives and synchronization for different RTOS environments.\n- **Device/Host Controller Driver**: drivers that interface with MCU USB peripherals. Several MCUs may share a common driver.\n\nDevice Stack Architecture\n=========================\n\nThis section is concerned with the **Device Stack**, i.e., the component of TinyUSB used in USB devices (that talk to a USB host).\n\nCore Components\n---------------\n\n**Device Controller Driver (DCD)**:\n- MCU-specific USB device peripheral driver\n- Handles endpoint configuration and data transfers\n- Abstracts hardware differences between MCU families\n- Located in ``src/portable/VENDOR/USBIP/``\n\n**USB Device Core (USBD)**:\n- Implements USB device state machine\n- Handles standard USB requests (Chapter 9)\n- Manages device configuration and enumeration\n- Located in ``src/device/``\n\n**Class Drivers**:\n- Implement USB class specifications\n- Handle class-specific requests and data transfer\n- Provide application APIs\n- Located in ``src/class/*/``\n\nData Flow\n---------\n\n**Control Transfers (Setup Requests)**:\n\n.. code-block:: none\n\n   USB Bus → DCD → USBD Core → Class Driver → Application\n                     ↓\n              Standard requests handled in core\n                     ↓\n           Class-specific requests → Class Driver\n\n**Data Transfers**:\n\n.. code-block:: none\n\n   Application → Class Driver → USBD Core → DCD → USB Bus\n   USB Bus → DCD → USBD Core → Class Driver → Application\n\nEvent Processing\n----------------\n\nTinyUSB uses a deferred interrupt model for thread safety:\n\n1. **Interrupt Occurs**: USB hardware generates interrupt\n2. **ISR Handler**: ``dcd_int_handler()`` captures event, minimal processing\n3. **Event Queuing**: Events queued for later processing\n4. **Task Processing**: ``tud_task()`` (called by application code) processes queued events\n5. **Callback Execution**: Application callbacks executed in task context\n\n.. code-block:: none\n\n   USB IRQ → ISR → Event Queue → tud_task() → Class Callbacks → Application\n\nHost Stack Architecture\n=======================\n\nThis section is concerned with the **Host Stack**, i.e., the component of TinyUSB used in USB hosts, managing connected USB devices.\n\nCore Components\n---------------\n\n**Host Controller Driver (HCD)**:\n- MCU-specific USB host peripheral driver\n- Manages USB pipes and data transfers\n- Handles host controller hardware\n- Located in ``src/portable/VENDOR/FAMILY/``\n\n**USB Host Core (USBH)**:\n- Implements USB host functionality\n- Manages device enumeration and configuration\n- Handles pipe management and scheduling\n- Located in ``src/host/``\n\n**Hub Driver**:\n- Manages USB hub devices\n- Handles port management and device detection\n- Supports multi-level hub topologies\n- Located in ``src/host/``\n\nDevice Enumeration\n------------------\n\nThe host stack follows USB enumeration process:\n\n1. **Device Detection**: Hub or root hub detects device connection\n2. **Reset and Address**: Reset device, assign unique address\n3. **Descriptor Retrieval**: Get device, configuration, and class descriptors\n4. **Driver Matching**: Find appropriate class driver for device\n5. **Configuration**: Configure device and start communication\n6. **Class Operation**: Normal class-specific communication\n\n.. code-block:: none\n\n   Device Connect → Reset → Get Descriptors → Load Driver → Configure → Operate\n\nClass Architecture\n==================\n\nCommon Class Structure\n----------------------\n\nAll USB classes follow a similar architecture:\n\n**Device Classes**:\n- ``*_device.c``: Device-side implementation\n- ``*_device.h``: Device API definitions\n- Implement class-specific descriptors\n- Handle class requests and data transfer\n\n**Host Classes**:\n- ``*_host.c``: Host-side implementation\n- ``*_host.h``: Host API definitions\n- Manage connected devices of this class\n- Provide application interface\n\nClass Driver Interface\n----------------------\n\nSee ``usbd.c``.\n\n**Required Functions**:\n- ``init()``: Initialize class driver\n- ``reset()``: Reset class state\n- ``open()``: Configure class endpoints\n- ``control_xfer_cb()``: Handle control requests\n- ``xfer_cb()``: Handle data transfer completion\n\n**Optional Functions**:\n- ``close()``: Clean up class resources\n- ``deinit()``: Deinitialize class driver\n- ``sof()``: Start-of-frame processing\n- ``xfer_isr()``: Called from USB ISR context on transfer completion. Data will get queued for ``xfer_cb()`` only if this returns ``false``.\n\nDescriptor Management\n---------------------\n\nEach class is responsible for:\n- **Interface Descriptors**: Define class type and endpoints\n- **Class-Specific Descriptors**: Additional class requirements\n- **Endpoint Descriptors**: Define data transfer characteristics\n\nMemory Management\n=================\n\nStatic Allocation Model\n-----------------------\n\nTinyUSB uses only static memory allocation; it allocates fixed-size endpoint buffers for each configured endpoint, static buffers for class-specific data handling, a fixed buffer dedicated to control transfers, and static event queues for deferred interrupt processing.\n\nBuffer Management\n-----------------\n\n**Endpoint Buffers**:\n- Allocated per endpoint at compile time\n- Size defined by ``CFG_TUD_*_EP_BUFSIZE`` macros\n- Used for USB data transfers\n\n**FIFO Buffers**:\n- Ring buffers for streaming data\n- Size defined by ``CFG_TUD_*_RX/TX_BUFSIZE`` macros\n- Separate read/write pointers\n\nThreading Model\n===============\n\nTask-Based Design\n-----------------\n\nTinyUSB uses a cooperative task model; it provides main tasks - ``tud_task()`` for device and ``tuh_task()`` for host operation. These tasks must be called regularly (typically less than 1ms intervals) to ensure all USB events are processed in task context, where application callbacks also execute.\n\nRTOS Integration\n----------------\n\n**Bare Metal**:\n- Application calls ``tud_task()`` in main loop\n- No threading primitives needed\n- Simplest integration method\n\n**FreeRTOS**:\n- USB task runs at high priority\n- Semaphores used for synchronization\n- Queue for inter-task communication\n\n**Other RTOS**:\n- Similar patterns with RTOS-specific primitives\n- OSAL layer abstracts RTOS differences\n\nInterrupt Handling\n------------------\n\n**Interrupt Service Routine**:\n- Minimal processing in ISR\n- Event capture and queuing only\n- Quick return to avoid blocking\n\n**Deferred Processing**:\n- All complex processing in task context\n- Thread-safe access to data structures\n- Application callbacks in known context\n\nMemory Usage Patterns\n---------------------\n\n**Flash Memory**:\n- Core stack: 8-15KB depending on features\n- Each class: 1-4KB additional\n- Portable driver: 2-8KB depending on MCU\n\n**RAM Usage**:\n- Core stack: 1-2KB\n- Endpoint buffers: User configurable\n- Class buffers: Depends on configuration\n"
  },
  {
    "path": "docs/reference/boards.rst",
    "content": "****************\nSupported Boards\n****************\n\nThe board support code is only used for self-contained examples and testing. It is not used when TinyUSB is part of a larger project.\nIt is responsible for getting the MCU started and the USB peripheral clocked with minimal of on-board devices\n\n-  One LED : for status\n-  One Button : to get input from user\n-  One UART : needed for logging with LOGGER=uart, maybe required for host/dual examples\n\nFollowing boards are supported\n\nAnalog Devices\n--------------\n\n=============  ================  ========  =================================================================================================================  ======\nBoard          Name              Family    URL                                                                                                                Note\n=============  ================  ========  =================================================================================================================  ======\napard32690     APARD32690-SL     maxim     https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/ad-apard32690-sl.html\nmax32650evkit  MAX32650 EVKIT    maxim     https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32650-evkit.html\nmax32650fthr   MAX32650 Feather  maxim     https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32650fthr.html\nmax32651evkit  MAX32651 EVKIT    maxim     https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32651-evkit.html\nmax32666evkit  MAX32666 EVKIT    maxim     https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32666evkit.html\nmax32666fthr   MAX32666 Feather  maxim     https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32666fthr.html\nmax32690evkit  MAX32690 EVKIT    maxim     https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32690evkit.html\nmax78002evkit  MAX78002 EVKIT    maxim     https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max78002evkit.html\n=============  ================  ========  =================================================================================================================  ======\n\nArtery\n------\n\n=========================  =============================  =============  ====================================================  ======\nBoard                      Name                           Family         URL                                                   Note\n=========================  =============================  =============  ====================================================  ======\nat_start_f402              AT-START-F402                  at32f402_405   https://www.arterychip.com/en/product/AT32F402.jsp\nat_start_f405              AT-START-F405                  at32f402_405   https://www.arterychip.com/en/product/AT32F405.jsp\nat32f403a_weact_blackpill  WeAct BlackPill AT32F403ACGU7  at32f403a_407  https://github.com/WeActStudio/WeActStudio.BlackPill\nat_start_f403a             AT-START-F403a                 at32f403a_407  https://www.arterychip.com/en/product/AT32F403.jsp\nat_start_f407              AT-START-F407                  at32f403a_407  https://www.arterychip.com/en/product/AT32F407.jsp\nat_start_f413              AT-START-F413                  at32f413       https://www.arterychip.com/en/product/AT32F413.jsp\nat_start_f415              AT-START-F415                  at32f415       https://www.arterychip.com/en/product/AT32F415.jsp\nat_start_f423              AT-START-F423                  at32f423       https://www.arterychip.com/en/product/AT32F423.jsp\nat_start_f425              AT-START-F425                  at32f425       https://www.arterychip.com/en/product/AT32F425.jsp\nat_start_f435              AT-START-F435                  at32f435_437   https://www.arterychip.com/en/product/AT32F435.jsp\nat_start_f437              AT-START-F437                  at32f435_437   https://www.arterychip.com/en/product/AT32F437.jsp\nat_start_f455              AT-START-F455                  at32f45x       https://www.arterychip.com/en/product/AT32F455.jsp\nat_start_f456              AT-START-F456                  at32f45x       https://www.arterychip.com/en/product/AT32F456.jsp\nat_start_f457              AT-START-F457                  at32f45x       https://www.arterychip.com/en/product/AT32F457.jsp\n=========================  =============================  =============  ====================================================  ======\n\nBridgetek\n---------\n\n=========  =========  ========  =====================================  ======\nBoard      Name       Family    URL                                    Note\n=========  =========  ========  =====================================  ======\nmm900evxb  MM900EVxB  ft9xx     https://brtchip.com/product/mm900ev1b\n=========  =========  ========  =====================================  ======\n\nEspressif\n---------\n\n=========================  ==============================  =========  ========================================================================================================  ======\nBoard                      Name                            Family     URL                                                                                                       Note\n=========================  ==============================  =========  ========================================================================================================  ======\nadafruit_feather_esp32_v2  Adafruit Feather ESP32 v2       espressif  https://www.adafruit.com/product/5400\nadafruit_feather_esp32c6   Adafruit Feather EPS32-C6       espressif  https://www.adafruit.com/product/5933\nadafruit_feather_esp32s2   Adafruit Feather ESP32S2        espressif  https://www.adafruit.com/product/5000\nadafruit_feather_esp32s3   Adafruit Feather ESP32S3        espressif  https://www.adafruit.com/product/5323\nadafruit_magtag_29gray     Adafruit MagTag 2.9\" Grayscale  espressif  https://www.adafruit.com/product/4800\nadafruit_metro_esp32s2     Adafruit Metro ESP32-S2         espressif  https://www.adafruit.com/product/4775\nespressif_addax_1          Espresif Addax-1                espressif  n/a\nespressif_c3_devkitc       Espresif C3 DevKitC             espressif  https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c3/esp32-c3-devkitc-02/index.html\nespressif_c6_devkitc       Espresif C6 DevKitC             espressif  https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c6/esp32-c6-devkitc-1/index.html\nespressif_kaluga_1         Espresif Kaluga 1               espressif  https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s2/esp32-s2-kaluga-1/index.html\nespressif_p4_function_ev   Espresif P4 Function EV         espressif  https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32p4/esp32-p4-function-ev-board/index.html\nespressif_s2_devkitc       Espresif S2 DevKitC             espressif  https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s2/esp32-s2-devkitc-1/index.html\nespressif_s3_devkitc       Espresif S3 DevKitC             espressif  https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp32-s3-devkitc-1/index.html\nespressif_s3_devkitm       Espresif S3 DevKitM             espressif  https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp32-s3-devkitm-1/index.html\nespressif_saola_1          Espresif S2 Saola 1             espressif  https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s2/esp32-s2-saola-1/index.html\n=========================  ==============================  =========  ========================================================================================================  ======\n\nGigaDevice\n----------\n\n==================  ==================  =========  =============================  ======\nBoard               Name                Family     URL                            Note\n==================  ==================  =========  =============================  ======\nsipeed_longan_nano  Sipeed Longan Nano  gd32vf103  https://longan.sipeed.com/en/\n==================  ==================  =========  =============================  ======\n\nHPMicro\n-------\n\n===========  ===========  ========  ==========================================================================  ======\nBoard        Name         Family    URL                                                                         Note\n===========  ===========  ========  ==========================================================================  ======\nhpm6750evk2  HPM6750EVK2  hpmicro   https://hpm-sdk.readthedocs.io/en/v1.6.0/boards/hpm6750evk2/README_en.html\n===========  ===========  ========  ==========================================================================  ======\n\nInfineon\n--------\n\n=============  =================  ========  =============================================================================  ======\nBoard          Name               Family    URL                                                                            Note\n=============  =================  ========  =============================================================================  ======\nxmc4500_relax  XMC4500 relax kit  xmc4000   https://www.infineon.com/cms/en/product/evaluation-boards/kit_xmc45_relax_v1/\nxmc4700_relax  XMC4700 relax kit  xmc4000   https://www.infineon.com/cms/en/product/evaluation-boards/kit_xmc47_relax_v1/\n=============  =================  ========  =============================================================================  ======\n\nMicrochip\n---------\n\n=========================  ===================================  ==========  =================================================================================  ======\nBoard                      Name                                 Family      URL                                                                                Note\n=========================  ===================================  ==========  =================================================================================  ======\nolimex_emz64               Olimex PIC32-EMZ64                   pic32mz     https://www.olimex.com/Products/PIC/Development/PIC32-EMZ64/open-source-hardware\nolimex_hmz144              Olimex PIC32-HMZ144                  pic32mz     https://www.olimex.com/Products/PIC/Development/PIC32-HMZ144/open-source-hardware\ncynthion_d11               Great Scott Gadgets Cynthion         samd11      https://greatscottgadgets.com/cynthion/\nsamd11_xplained            SAMD11 Xplained Pro                  samd11      https://www.microchip.com/en-us/development-tool/ATSAMD11-XPRO\natsamd21_xpro              SAMD21 Xplained Pro                  samd2x_l2x  https://www.microchip.com/DevelopmentTools/ProductDetails/ATSAMD21-XPRO\natsaml21_xpro              SAML21 Xplained Pro                  samd2x_l2x  https://www.microchip.com/en-us/development-tool/atsaml21-xpro-b\ncircuitplayground_express  Adafruit Circuit Playground Express  samd2x_l2x  https://www.adafruit.com/product/3333\ncuriosity_nano             SAMD21 Curiosty Nano                 samd2x_l2x  https://www.microchip.com/en-us/development-tool/dm320119\ncynthion_d21               Great Scott Gadgets Cynthion         samd2x_l2x  https://greatscottgadgets.com/cynthion/\nfeather_m0_express         Adafruit Feather M0 Express          samd2x_l2x  https://www.adafruit.com/product/3403\nitsybitsy_m0               Adafruit ItsyBitsy M0                samd2x_l2x  https://www.adafruit.com/product/3727\nmetro_m0_express           Adafruit Metro M0 Express            samd2x_l2x  https://www.adafruit.com/product/3505\nqtpy                       Adafruit QT Py                       samd2x_l2x  https://www.adafruit.com/product/4600\nsaml22_feather             SAML22 Feather                       samd2x_l2x  https://github.com/joeycastillo/Feather-Projects/tree/main/SAML22%20Feather\nseeeduino_xiao             Seeeduino XIAO                       samd2x_l2x  https://wiki.seeedstudio.com/Seeeduino-XIAO/\nsensorwatch_m0             SensorWatch                          samd2x_l2x  https://github.com/joeycastillo/Sensor-Watch\nsparkfun_samd21_mini_usb   SparkFun SAMD21 Mini                 samd2x_l2x  https://www.sparkfun.com/products/13664\ntrinket_m0                 Adafruit Trinket M0                  samd2x_l2x  https://www.adafruit.com/product/3500\nd5035_01                   D5035-01                             samd5x_e5x  https://github.com/RudolphRiedel/USB_CAN-FD\nfeather_m4_express         Adafruit Feather M4 Express          samd5x_e5x  https://www.adafruit.com/product/3857\nitsybitsy_m4               Adafruit ItsyBitsy M4                samd5x_e5x  https://www.adafruit.com/product/3800\nmetro_m4_express           Adafruit Metro M4 Express            samd5x_e5x  https://www.adafruit.com/product/3382\npybadge                    Adafruit PyBadge                     samd5x_e5x  https://www.adafruit.com/product/4200\npyportal                   Adafruit PyPortal                    samd5x_e5x  https://www.adafruit.com/product/4116\nsame54_xplained            SAME54 Xplained Pro                  samd5x_e5x  https://www.microchip.com/DevelopmentTools/ProductDetails/ATSAME54-XPRO\nsame70_qmtech              SAME70 QMTech                        same7x      https://www.aliexpress.com/item/1005003173783268.html\nsame70_xplained            SAME70 Xplained                      same7x      https://www.microchip.com/en-us/development-tool/atsame70-xpld\nsamg55_xplained            SAMG55 Xplained Pro                  samg        https://www.microchip.com/DevelopmentTools/ProductDetails/ATSAMG55-XPRO\n=========================  ===================================  ==========  =================================================================================  ======\n\nMindMotion\n----------\n\n=====================  ======================================  ========  ===============================================================================================  ======\nBoard                  Name                                    Family    URL                                                                                              Note\n=====================  ======================================  ========  ===============================================================================================  ======\nmm32f327x_mb39         MM32F3273G9P MB-039                     mm32      https://www.mindmotion.com.cn/support/development_tools/evaluation_boards/evboard/mm32f3273g9p/\nmm32f327x_pitaya_lite  DshanMCU Pitaya Lite with MM32F3273G8P  mm32      https://gitee.com/weidongshan/DshanMCU-Pitaya-c\n=====================  ======================================  ========  ===============================================================================================  ======\n\nNXP\n---\n\n==================  =========================================  ============  =========================================================================================================================================================================  ======\nBoard               Name                                       Family        URL                                                                                                                                                                        Note\n==================  =========================================  ============  =========================================================================================================================================================================  ======\nmetro_m7_1011       Adafruit Metro M7 1011                     imxrt         https://www.adafruit.com/product/5600\nmimxrt1010_evk      i.MX RT1010 Evaluation Kit                 imxrt         https://www.nxp.com/design/design-center/development-boards-and-designs/i-mx-evaluation-and-development-boards/i-mx-rt1010-evaluation-kit:MIMXRT1010-EVK\nmimxrt1015_evk      i.MX RT1015 Evaluation Kit                 imxrt         https://www.nxp.com/design/design-center/development-boards-and-designs/MIMXRT1015-EVK\nmimxrt1020_evk      i.MX RT1020 Evaluation Kit                 imxrt         https://www.nxp.com/design/design-center/development-boards-and-designs/MIMXRT1020-EVK\nmimxrt1024_evk      i.MX RT1024 Evaluation Kit                 imxrt         https://www.nxp.com/design/design-center/development-boards-and-designs/i-mx-evaluation-and-development-boards/i-mx-rt1024-evaluation-kit:MIMXRT1024-EVK\nmimxrt1050_evkb     i.MX RT1050 Evaluation Kit revB            imxrt         https://www.nxp.com/part/IMXRT1050-EVKB\nmimxrt1060_evk      i.MX RT1060 Evaluation Kit revB            imxrt         https://www.nxp.com/design/design-center/development-boards-and-designs/MIMXRT1060-EVKB\nmimxrt1064_evk      i.MX RT1064 Evaluation Kit                 imxrt         https://www.nxp.com/design/design-center/development-boards-and-designs/MIMXRT1064-EVK\nmimxrt1170_evkb     i.MX RT1070 Evaluation Kit                 imxrt         https://www.nxp.com/design/design-center/development-boards-and-designs/i-mx-evaluation-and-development-boards/i-mx-rt1170-evaluation-kit:MIMXRT1170-EVKB\nteensy_40           Teensy 4.0                                 imxrt         https://www.pjrc.com/store/teensy40.html\nteensy_41           Teensy 4.1                                 imxrt         https://www.pjrc.com/store/teensy41.html\nfrdm_k64f           Freedom K64F                               kinetis_k     https://www.nxp.com/design/design-center/development-boards-and-designs/general-purpose-mcus/freedom-development-platform-for-kinetis-k64-k63-and-k24-mcus:FRDM-K64F\nteensy_35           Teensy 3.5                                 kinetis_k     https://www.pjrc.com/store/teensy35.html\nfrdm_k32l2a4s       Freedom K32L2A4S                           kinetis_k32l  https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-K32L2A4S\nfrdm_k32l2b         Freedom K32L2B3                            kinetis_k32l  https://www.nxp.com/design/design-center/development-boards-and-designs/general-purpose-mcus/nxp-freedom-development-platform-for-k32-l2b-mcus:FRDM-K32L2B3\nkuiic               Kuiic                                      kinetis_k32l  https://github.com/nxf58843/kuiic\nfrdm_kl25z          fomu                                       kinetis_kl    https://www.nxp.com/design/design-center/development-boards-and-designs/general-purpose-mcus/freedom-development-platform-for-kinetis-kl14-kl15-kl24-kl25-mcus:FRDM-KL25Z\nlpcxpresso11u37     LPCXpresso11U37                            lpc11         https://www.nxp.com/design/design-center/development-boards-and-designs/OM13074\nlpcxpresso11u68     LPCXpresso11U68                            lpc11         https://www.nxp.com/design/design-center/development-boards-and-designs/OM13058\nlpcxpresso1347      LPCXpresso1347                             lpc13         https://www.nxp.com/products/no-longer-manufactured/lpcxpresso-board-for-lpc1347:OM13045\nlpcxpresso1549      LPCXpresso1549                             lpc15         https://www.nxp.com/design/design-center/development-boards-and-designs/OM13056\nlpcxpresso1769      LPCXpresso1769                             lpc17         https://www.nxp.com/design/design-center/development-boards-and-designs/OM13000\nmbed1768            mbed 1768                                  lpc17         https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-arm-cortex-m3/arm-mbed-lpc1768-board:OM11043\nlpcxpresso18s37     LPCXpresso18s37                            lpc18         https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso18s37-development-board:OM13076\nmcb1800             Keil MCB1800                               lpc18         https://www.keil.com/arm/mcb1800/\nea4088_quickstart   Embedded Artists LPC4088 QuickStart Board  lpc40         https://www.embeddedartists.com/products/lpc4088-quickstart-board/\nea4357              Embedded Artists LPC4357 Development Kit   lpc43         https://www.embeddedartists.com/products/lpc4357-developers-kit/\nlpcxpresso43s67     LPCXpresso43S67                            lpc43         https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso43s67-development-board:OM13084\nlpcxpresso51u68     LPCXpresso51u68                            lpc51         https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpcxpresso51u68-for-the-lpc51u68-mcus:OM40005\nlpcxpresso54114     LPCXpresso54114                            lpc54         https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso54114-board:OM13089\nlpcxpresso54608     LPCXpresso54608                            lpc54         https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-development-board-for-lpc5460x-mcus:OM13092\nlpcxpresso54628     LPCXpresso54628                            lpc54         https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso54628-development-board:OM13098\ndouble_m33_express  Double M33 Express                         lpc55         https://www.crowdsupply.com/steiert-solutions/double-m33-express\nlpcxpresso55s28     LPCXpresso55s28                            lpc55         https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso55s28-development-board:LPC55S28-EVK\nlpcxpresso55s69     LPCXpresso55s69                            lpc55         https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso55s69-development-board:LPC55S69-EVK\nmcu_link            MCU Link                                   lpc55         https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/mcu-link-debug-probe:MCU-LINK\nfrdm_mcxa153        Freedom MCXA153                            mcx           https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-MCXA153\nfrdm_mcxa156        Freedom MCXA156                            mcx           https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-MCXA156\nfrdm_mcxn947        Freedom MCXN947                            mcx           https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-MCXN947\nmcxn947brk          MCXN947 Breakout                           mcx           n/a\nfrdm_rw612          FRDM-RW612                                 rw61x         https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-RW612\n==================  =========================================  ============  =========================================================================================================================================================================  ======\n\nNordic Semiconductor\n--------------------\n\n===========================  =====================================  ========  ==============================================================================  ======\nBoard                        Name                                   Family    URL                                                                             Note\n===========================  =====================================  ========  ==============================================================================  ======\nadafruit_clue                Adafruit CLUE                          nrf       https://www.adafruit.com/product/4500\narduino_nano33_ble           Arduino Nano 33 BLE                    nrf       https://store.arduino.cc/arduino-nano-33-ble\ncircuitplayground_bluefruit  Adafruit Circuit Playground Bluefruit  nrf       https://www.adafruit.com/product/4333\nfeather_nrf52840_express     Adafruit Feather nRF52840 Express      nrf       https://www.adafruit.com/product/4062\nfeather_nrf52840_sense       Adafruit Feather nRF52840 Sense        nrf       https://www.adafruit.com/product/4516\nitsybitsy_nrf52840           Adafruit ItsyBitsy nRF52840 Express    nrf       https://www.adafruit.com/product/4481\nnrf52833dk                   Nordic nRF52833 DK                     nrf       https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52833-DK\nnrf52840dk                   Nordic nRF52840DK                      nrf       https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK\nnrf52840dongle               Nordic nRF52840 Dongle                 nrf       https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-Dongle\nnrf5340dk                    Nordic nRF5340 DK                      nrf       https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF5340-DK\nnrf54h20dk                   Nordic nRF54H20 DK                     nrf       https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF5340-DK\n===========================  =====================================  ========  ==============================================================================  ======\n\nRaspberry Pi\n------------\n\n================================  ============================================  ==============  ==========================================================  ======\nBoard                             Name                                          Family          URL                                                         Note\n================================  ============================================  ==============  ==========================================================  ======\nraspberrypi_zero                  Raspberry Pi Zero                             broadcom_32bit  https://www.raspberrypi.org/products/raspberry-pi-zero/\nraspberrypi_cm4                   Raspberry CM4                                 broadcom_64bit  https://www.raspberrypi.org/products/compute-module-4\nraspberrypi_zero2                 Raspberry Zero2                               broadcom_64bit  https://www.raspberrypi.org/products/raspberry-pi-zero-2-w\nadafruit_feather_rp2040_usb_host  Adafruit Feather RP2040 with USB Type A Host  rp2040          https://www.adafruit.com/product/5723\nadafruit_fruit_jam                Adafruit Fruit Jam - Mini RP2350              rp2040          https://www.adafruit.com/product/6200\nadafruit_metro_rp2350             Adafruit Metro RP2350                         rp2040          https://www.adafruit.com/product/6003\nraspberry_pi_pico                 Pico                                          rp2040          https://www.raspberrypi.com/products/raspberry-pi-pico/\nraspberry_pi_pico2                Pico2                                         rp2040          https://www.raspberrypi.com/products/raspberry-pi-pico-2/\nraspberry_pi_pico_w               Pico                                          rp2040          https://www.raspberrypi.com/products/raspberry-pi-pico/\n================================  ============================================  ==============  ==========================================================  ======\n\nRenesas\n-------\n\n==============  ===========================  ========  ================================================================================================================================================================  ======\nBoard           Name                         Family    URL                                                                                                                                                               Note\n==============  ===========================  ========  ================================================================================================================================================================  ======\nda14695_dk_usb  DA14695-00HQDEVKT-U          da1469x   https://www.renesas.com/en/products/wireless-connectivity/bluetooth-low-energy/da14695-00hqdevkt-u-smartbond-da14695-bluetooth-low-energy-52-usb-development-kit\nda1469x_dk_pro  DA1469x Development Kit Pro  da1469x   https://lpccs-docs.renesas.com/um-b-090-da1469x_getting_started/DA1469x_The_hardware/DA1469x_The_hardware.html\nportenta_c33    Arduino Portenta C33         ra        https://www.arduino.cc/pro/hardware-product-portenta-c33/\nra2a1_ek        RA2A1 EK                     ra        https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra2a1-evaluation-kit-ra2a1-mcu-group\nra4m1_ek        RA4M1 EK                     ra        https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra4m1-evaluation-kit-ra4m1-mcu-group\nra4m3_ek        RA4M3 EK                     ra        https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra4m3-evaluation-kit-ra4m3-mcu-group\nra6m1_ek        RA6M1 EK                     ra        https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra6m1-evaluation-kit-ra6m1-mcu-group\nra6m5_ek        RA6M5 EK                     ra        https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra6m5-evaluation-kit-ra6m5-mcu-group\nra8m1_ek        RA8M1 EK                     ra        https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra8m1-evaluation-kit-ra8m1-mcu-group\nuno_r4          Arduino UNO R4               ra        https://store-usa.arduino.cc/pages/uno-r4\n==============  ===========================  ========  ================================================================================================================================================================  ======\n\nSTMicroelectronics\n------------------\n\n===================  =================================  =========  =================================================================  ======\nBoard                Name                               Family     URL                                                                Note\n===================  =================================  =========  =================================================================  ======\nstm32c071nucleo      STM32C071 Nucleo                   stm32c0    https://www.st.com/en/evaluation-tools/nucleo-g071rb.html\nstm32f070rbnucleo    STM32 F070 Nucleo                  stm32f0    https://www.st.com/en/evaluation-tools/nucleo-f070rb.html\nstm32f072disco       STM32 F072 Discovery               stm32f0    https://www.st.com/en/evaluation-tools/32f072bdiscovery.html\nstm32f072eval        STM32 F072 Eval                    stm32f0    https://www.st.com/en/evaluation-tools/stm32072b-eval.html\nstm32f103_bluepill   STM32 F103 Bluepill                stm32f1    https://stm32-base.org/boards/STM32F103C8T6-Blue-Pill\nstm32f103_mini_2     STM32 F103 Mini v2                 stm32f1    https://stm32-base.org/boards/STM32F103RCT6-STM32-Mini-V2.0\nstm32f103ze_iar      IAR STM32 F103ze starter kit       stm32f1    n/a\nstm32f207nucleo      STM32 F207 Nucleo                  stm32f2    https://www.st.com/en/evaluation-tools/nucleo-f207zg.html\nstm32f303disco       STM32 F303 Discovery               stm32f3    https://www.st.com/en/evaluation-tools/stm32f3discovery.html\nfeather_stm32f405    Adafruit Feather STM32F405         stm32f4    https://www.adafruit.com/product/4382\npyboardv11           Pyboard v1.1                       stm32f4    https://www.adafruit.com/product/2390\nstm32f401blackpill   STM32 F401 Blackpill               stm32f4    https://stm32-base.org/boards/STM32F401CCU6-WeAct-Black-Pill-V1.2\nstm32f407blackvet    STM32 F407 Blackvet                stm32f4    https://stm32-base.org/boards/STM32F407VET6-STM32-F4VE-V2.0\nstm32f407disco       STM32 F407 Discovery               stm32f4    https://www.st.com/en/evaluation-tools/stm32f4discovery.html\nstm32f411blackpill   STM32 F411 Blackpill               stm32f4    https://stm32-base.org/boards/STM32F411CEU6-WeAct-Black-Pill-V2.0\nstm32f411disco       STM32 F411 Discovery               stm32f4    https://www.st.com/en/evaluation-tools/32f411ediscovery.html\nstm32f412disco       STM32 F412 Discovery               stm32f4    https://www.st.com/en/evaluation-tools/32f412gdiscovery.html\nstm32f412nucleo      STM32 F412 Nucleo                  stm32f4    https://www.st.com/en/evaluation-tools/nucleo-f412zg.html\nstm32f439nucleo      STM32 F439 Nucleo                  stm32f4    https://www.st.com/en/evaluation-tools/nucleo-f439zi.html\nstlinkv3mini         Stlink-v3 mini                     stm32f7    https://www.st.com/en/development-tools/stlink-v3mini.html\nstm32f723disco       STM32 F723 Discovery               stm32f7    https://www.st.com/en/evaluation-tools/32f723ediscovery.html\nstm32f746disco       STM32 F746 Discovery               stm32f7    https://www.st.com/en/evaluation-tools/32f746gdiscovery.html\nstm32f746nucleo      STM32 F746 Nucleo                  stm32f7    https://www.st.com/en/evaluation-tools/nucleo-f746zg.html\nstm32f767nucleo      STM32 F767 Nucleo                  stm32f7    https://www.st.com/en/evaluation-tools/nucleo-f767zi.html\nstm32f769disco       STM32 F769 Discovery               stm32f7    https://www.st.com/en/evaluation-tools/32f769idiscovery.html\nstm32g0b1nucleo      STM32 G0B1 Nucleo                  stm32g0    https://www.st.com/en/evaluation-tools/nucleo-g0b1re.html\nb_g474e_dpow1        STM32 B-G474E-DPOW1 Discovery kit  stm32g4    https://www.st.com/en/evaluation-tools/b-g474e-dpow1.html\nstm32g474nucleo      STM32 G474 Nucleo                  stm32g4    https://www.st.com/en/evaluation-tools/nucleo-g474re.html\nstm32g491nucleo      STM32 G491 Nucleo                  stm32g4    https://www.st.com/en/evaluation-tools/nucleo-g491re.html\nstm32h503nucleo      STM32 H503 Nucleo                  stm32h5    https://www.st.com/en/evaluation-tools/nucleo-h503rb.html\nstm32h563nucleo      STM32 H563 Nucleo                  stm32h5    https://www.st.com/en/evaluation-tools/nucleo-h563zi.html\nstm32h573i_dk        STM32 H573i Discovery              stm32h5    https://www.st.com/en/evaluation-tools/stm32h573i-dk.html\ndaisyseed            Daisy Seed                         stm32h7    https://electro-smith.com/products/daisy-seed\nstm32h723nucleo      STM32 H723 Nucleo                  stm32h7    https://www.st.com/en/evaluation-tools/nucleo-h723zg.html\nstm32h743eval        STM32 H743 Eval                    stm32h7    https://www.st.com/en/evaluation-tools/stm32h743i-eval.html\nstm32h743nucleo      STM32 H743 Nucleo                  stm32h7    https://www.st.com/en/evaluation-tools/nucleo-h743zi.html\nstm32h745disco       STM32 H745 Discovery               stm32h7    https://www.st.com/en/evaluation-tools/stm32h745i-disco.html\nstm32h747disco       STM32 H747 Discovery               stm32h7    https://www.st.com/en/evaluation-tools/stm32h747i-disco.html\nstm32h750_weact      STM32 H750 WeAct                   stm32h7    https://www.adafruit.com/product/5032\nstm32h750bdk         STM32 H750b Discovery Kit          stm32h7    https://www.st.com/en/evaluation-tools/stm32h750b-dk.html\nwaveshare_openh743i  Waveshare Open H743i               stm32h7    https://www.waveshare.com/openh743i-c-standard.htm\nstm32h7s3nucleo      STM32 H7S3L8 Nucleo                stm32h7rs  https://www.st.com/en/evaluation-tools/nucleo-h7s3l8.html\nstm32l052dap52       STM32 L052 DAP                     stm32l0    n/a\nstm32l0538disco      STM32 L0538 Discovery              stm32l0    https://www.st.com/en/evaluation-tools/32l0538discovery.html\nstm32l412nucleo      STM32 L412 Nucleo                  stm32l4    https://www.st.com/en/evaluation-tools/nucleo-l412kb.html\nstm32l476disco       STM32 L476 Disco                   stm32l4    https://www.st.com/en/evaluation-tools/32l476gdiscovery.html\nstm32l496nucleo      STM32 L496 Nucleo                  stm32l4    https://www.st.com/en/evaluation-tools/nucleo-l496ZG-P.html\nstm32l4p5nucleo      STM32 L4P5 Nucleo                  stm32l4    https://www.st.com/en/evaluation-tools/nucleo-l4p5zg.html\nstm32l4r5nucleo      STM32 L4R5 Nucleo                  stm32l4    https://www.st.com/en/evaluation-tools/nucleo-l4r5zi.html\nstm32n6570dk         STM32 N6570-DK                     stm32n6    https://www.st.com/en/evaluation-tools/stm32n6570-dk.html\nstm32n657nucleo      STM32 N657X0-Q Nucleo              stm32n6    https://www.st.com/en/evaluation-tools/nucleo-n657x0-q.html\nstm32u083cdk         STM32U083C-DK Discovery Kit        stm32u0    https://www.st.com/en/evaluation-tools/stm32u083c-dk.html\nb_u585i_iot2a        STM32 B-U585i IOT2A Discovery kit  stm32u5    https://www.st.com/en/evaluation-tools/b-u585i-iot02a.html\nstm32u545nucleo      STM32 U545 Nucleo                  stm32u5    https://www.st.com/en/evaluation-tools/nucleo-u545re-q.html\nstm32u575eval        STM32 U575 Eval                    stm32u5    https://www.st.com/en/evaluation-tools/stm32u575i-ev.html\nstm32u575nucleo      STM32 U575 Nucleo                  stm32u5    https://www.st.com/en/evaluation-tools/nucleo-u575zi-q.html\nstm32u5a5nucleo      STM32 U5a5 Nucleo                  stm32u5    https://www.st.com/en/evaluation-tools/nucleo-u5a5zj-q.html\nstm32wb55nucleo      STM32 P-NUCLEO-WB55                stm32wb    https://www.st.com/en/evaluation-tools/p-nucleo-wb55.html\nstm32wba_nucleo      STM32 NUCLEO-WBA65RI               stm32wba   https://www.st.com/en/evaluation-tools/nucleo-wba65ri.html\n===================  =================================  =========  =================================================================  ======\n\nSunxi\n-----\n\n=======  =================  ========  =========================================  ======\nBoard    Name               Family    URL                                        Note\n=======  =================  ========  =========================================  ======\nf1c100s  Lctech Pi F1C200s  f1c100s   https://linux-sunxi.org/Lctech_Pi_F1C200s\n=======  =================  ========  =========================================  ======\n\nTexas Instruments\n-----------------\n\n=================  =====================  ========  =========================================  ======\nBoard              Name                   Family    URL                                        Note\n=================  =====================  ========  =========================================  ======\nmsp_exp430f5529lp  MSP430F5529 LaunchPad  msp430    https://www.ti.com/tool/MSP-EXP430F5529LP\nmsp_exp432e401y    MSP432E401Y LaunchPad  msp432e4  https://www.ti.com/tool/MSP-EXP432E401Y\nek_tm4c123gxl      TM4C123G LaunchPad     tm4c      https://www.ti.com/tool/EK-TM4C123GXL\nek_tm4c1294xl      TM4C1294 LaunchPad     tm4c      https://www.ti.com/tool/EK-TM4C1294XL\n=================  =====================  ========  =========================================  ======\n\nTomu\n----\n\n=======  ======  ========  =========================  ======\nBoard    Name    Family    URL                        Note\n=======  ======  ========  =========================  ======\nfomu     fomu    fomu      https://tomu.im/fomu.html\n=======  ======  ========  =========================  ======\n\nWCH\n---\n\n================  ================  ========  =====================================================================  ======\nBoard             Name              Family    URL                                                                    Note\n================  ================  ========  =====================================================================  ======\nch32f205r-r0      CH32F205r-r0      ch32f20x  https://github.com/openwch/ch32f20x\nch32v103r_r1_1v0  CH32V103R-R1-1v1  ch32v10x  https://github.com/openwch/ch32v103/tree/main/SCHPCB/CH32V103R-R1-1v1\nch32v203c_r0_1v0  CH32V203C-R0-1v0  ch32v20x  https://github.com/openwch/ch32v20x/tree/main/SCHPCB/CH32V203C-R0\nch32v203g_r0_1v0  CH32V203G-R0-1v0  ch32v20x  https://github.com/openwch/ch32v20x/tree/main/SCHPCB/CH32V203C-R0\nnanoch32v203      nanoCH32V203      ch32v20x  https://github.com/wuxx/nanoCH32V203\nch32v307v_r1_1v0  CH32V307V-R1-1v0  ch32v30x  https://github.com/openwch/ch32v307/tree/main/SCHPCB/CH32V307V-R1-1v0\nnanoch32v305      nanoCH32V305      ch32v30x  https://github.com/wuxx/nanoCH32V305\n================  ================  ========  =====================================================================  ======\n"
  },
  {
    "path": "docs/reference/concurrency.rst",
    "content": "***********\nConcurrency\n***********\n\nThe TinyUSB library is designed to operate on single-core MCUs with multi-threaded applications in mind. Interaction with interrupts is especially important to pay attention to.\nIt is compatible with optionally using an RTOS.\n\nGeneral\n-------\n\nWhen writing code, keep in mind that the OS (if using an RTOS) may swap out your code at any time. Also, your code can be preempted by an interrupt at any time.\n\nApplication Code\n----------------\n\nThe USB core does not execute application callbacks while in an interrupt context. Calls to application code are from within the USB core task context. Note that the application core will call class drivers from within its own task.\n\nClass Drivers\n-------------\n\nClass driver code should never be called from an interrupt context by the USB core, though the application is allowed to call class driver functions from interrupts. USB core functions may be called simultaneously by multiple tasks. Use care that proper locking is used to guard the USBD core functions from this case.\n\nClass drivers are allowed to call ``usbd_*`` functions, but not ``dcd_*`` functions.\n\nUSB Core\n--------\n\nAll functions that may be called from an (USB core) interrupt context have a ``bool in_isr`` parameter to remind the implementer that special care must be taken.\n\nInterrupt handlers must not directly call class driver code, they must pass a message to the USB core's task.\n\n ``usbd_*`` functions may be called from interrupts without any notice. They may also be called simultaneously by multiple tasks.\n\nDevice Drivers\n--------------\n\nMuch of the processing of the USB stack is done in an interrupt context, and care must be taken in order to ensure variables are handled in the appropriate ways by the compiler and optimizer.\n\nIn particular:\n\n*  Ensure that all memory-mapped registers (including packet memory) are marked as volatile. GCC's optimizer will even combine memory accesses (like two 16-bit to be a 32-bit) if you don't mark the pointers as volatile. On some architectures, this can use macros like _I , _O , or _IO.\n*  All defined global variables are marked as ``static``.\n"
  },
  {
    "path": "docs/reference/dependencies.rst",
    "content": "************\nDependencies\n************\n\nMCU low-level peripheral drivers and external libraries for building TinyUSB examples\n\n========================================  ================================================================  ========================================  ========================================================================================================================================================================================================================================================================================================================================\nLocal Path                                Repo                                                              Commit                                    Required by\n========================================  ================================================================  ========================================  ========================================================================================================================================================================================================================================================================================================================================\nhw/mcu/allwinner                          https://github.com/hathach/allwinner_driver.git                   8e5e89e8e132c0fd90e72d5422e5d3d68232b756  fc100s\nhw/mcu/analog/msdk                        https://github.com/analogdevicesinc/msdk.git                      b20b398d3e5e2007594e54a74ba3d2a2e50ddd75  maxim\nhw/mcu/artery/at32f402_405                https://github.com/ArteryTek/AT32F402_405_Firmware_Library.git    4424515c2663e82438654e0947695295df2abdfe  at32f402_405\nhw/mcu/artery/at32f403a_407               https://github.com/ArteryTek/AT32F403A_407_Firmware_Library.git   f2cb360c3d28fada76b374308b8c4c61d37a090b  at32f403a_407\nhw/mcu/artery/at32f413                    https://github.com/ArteryTek/AT32F413_Firmware_Library.git        f6fe62dfec9fd40c5b63d92fc5ef2c2b5e77a450  at32f413\nhw/mcu/artery/at32f415                    https://github.com/ArteryTek/AT32F415_Firmware_Library.git        716f545aa1290ff144ccf023a8e797b951e1bc8e  at32f415\nhw/mcu/artery/at32f423                    https://github.com/ArteryTek/AT32F423_Firmware_Library.git        2afa7f12852e57a9e8aab3a892c641e1a8635a18  at32f423\nhw/mcu/artery/at32f425                    https://github.com/ArteryTek/AT32F425_Firmware_Library.git        620233e1357d5c1b7e2bde6b9dd5196822b91817  at32f425\nhw/mcu/artery/at32f435_437                https://github.com/ArteryTek/AT32F435_437_Firmware_Library.git    25439cc6650a8ae0345934e8707a5f38c7ae41f8  at32f435_437\nhw/mcu/artery/at32f45x                    https://github.com/ArteryTek/AT32F45x_Firmware_Library.git        3d4a1b38be8ebac292e2350ca53bc4bfa4430233  at32f45x\nhw/mcu/bridgetek/ft9xx/ft90x-sdk          https://github.com/BRTSG-FOSS/ft90x-sdk.git                       03f74eac84645178fdde7f2e5ca9acdcb7bd9dcd  ft9xx\nhw/mcu/broadcom                           https://github.com/adafruit/broadcom-peripherals.git              08370086080759ed54ac1136d62d2ad24c6fa267  broadcom_32bit broadcom_64bit\nhw/mcu/gd/nuclei-sdk                      https://github.com/Nuclei-Software/nuclei-sdk.git                 7eb7bfa9ea4fbeacfafe1d5f77d5a0e6ed3922e7  gd32vf103\nhw/mcu/hpmicro/hpm_sdk                    https://github.com/hpmicro/hpm_sdk                                8d2af741ecc4aaa82d7ee395dc1ce25d7070c3ff  hpmicro\nhw/mcu/infineon/mtb-xmclib-cat3           https://github.com/Infineon/mtb-xmclib-cat3.git                   daf5500d03cba23e68c2f241c30af79cd9d63880  xmc4000\nhw/mcu/microchip                          https://github.com/hathach/microchip_driver.git                   9e8b37e307d8404033bb881623a113931e1edf27  sam3x samd11 samd21 samd51 samd5x_e5x same5x same7x samd2x_l2x samg\nhw/mcu/mindmotion/mm32sdk                 https://github.com/hathach/mm32sdk.git                            b93e856211060ae825216c6a1d6aa347ec758843  mm32\nhw/mcu/nordic/nrfx                        https://github.com/NordicSemiconductor/nrfx.git                   11f57e578c7feea13f21c79ea0efab2630ac68c7  nrf\nhw/mcu/nuvoton                            https://github.com/majbthrd/nuc_driver.git                        2204191ec76283371419fbcec207da02e1bc22fa  nuc100_120 nuc121_125 nuc126 nuc505\nhw/mcu/nxp/lpcopen                        https://github.com/hathach/nxp_lpcopen.git                        b41cf930e65c734d8ec6de04f1d57d46787c76ae  lpc11 lpc13 lpc15 lpc17 lpc18 lpc40 lpc43\nhw/mcu/nxp/mcux-devices-kinetis           https://github.com/nxp-mcuxpresso/mcux-devices-kinetis            98a155e666c54f396e528ec3131f27a5d5b71f76  kinetis_k32l\nhw/mcu/nxp/mcux-devices-lpc               https://github.com/nxp-mcuxpresso/mcux-devices-lpc                8096b783ec09d0d1c8629025a5f9d8e7df26e520  lpc51 lpc55\nhw/mcu/nxp/mcux-devices-mcx               https://github.com/nxp-mcuxpresso/mcux-devices-mcx                ada1c97c761123ec0c179bb9bb9f744bf9a11475  mcx\nhw/mcu/nxp/mcux-devices-rt                https://github.com/nxp-mcuxpresso/mcux-devices-rt                 dba2b523c9df61f3330bd186242f8210a8e47c45  imxrt\nhw/mcu/nxp/mcux-sdk                       https://github.com/nxp-mcuxpresso/mcux-sdk                        a1bdae309a14ec95a4f64a96d3315a4f89c397c6  kinetis_k kinetis_kl lpc54 rw61x\nhw/mcu/nxp/mcuxsdk-core                   https://github.com/nxp-mcuxpresso/mcuxsdk-core                    0c5c6b16deb211110e06bde896cdff59ab213e16  imxrt kinetis_k32l lpc51 lpc55 mcx\nhw/mcu/raspberry_pi/Pico-PIO-USB          https://github.com/sekigon-gonnoc/Pico-PIO-USB.git                675543bcc9baa8170f868ab7ba316d418dbcf41f  rp2040\nhw/mcu/renesas/fsp                        https://github.com/renesas/fsp.git                                edcc97d684b6f716728a60d7a6fea049d9870bd6  ra\nhw/mcu/renesas/rx                         https://github.com/kkitayam/rx_device.git                         706b4e0cf485605c32351e2f90f5698267996023  rx\nhw/mcu/silabs/cmsis-dfp-efm32gg12b        https://github.com/cmsis-packs/cmsis-dfp-efm32gg12b.git           f1c31b7887669cb230b3ea63f9b56769078960bc  efm32\nhw/mcu/sony/cxd56/spresense-exported-sdk  https://github.com/sonydevworld/spresense-exported-sdk.git        2ec2a1538362696118dc3fdf56f33dacaf8f4067  spresense\nhw/mcu/st/cmsis-device-u0                 https://github.com/STMicroelectronics/cmsis-device-u0.git         e3a627c6a5bc4eb2388e1885a95cc155e1672253  stm32u0\nhw/mcu/st/cmsis-device-wba                https://github.com/STMicroelectronics/cmsis-device-wba.git        647d8522e5fd15049e9a1cc30ed19d85e5911eaf  stm32wba\nhw/mcu/st/cmsis_device_c0                 https://github.com/STMicroelectronics/cmsis_device_c0.git         517611273f835ffe95318947647bc1408f69120d  stm32c0\nhw/mcu/st/cmsis_device_f0                 https://github.com/STMicroelectronics/cmsis_device_f0.git         cbb5da5d48b4b5f2efacdc2f033be30f9d29889f  stm32f0\nhw/mcu/st/cmsis_device_f1                 https://github.com/STMicroelectronics/cmsis_device_f1.git         c8e9a4a4f16b6d2cb2a2083cbe5161025280fb22  stm32f1\nhw/mcu/st/cmsis_device_f2                 https://github.com/STMicroelectronics/cmsis_device_f2.git         49321f1e4d2bd3e65687b37f2652a28ea7983674  stm32f2\nhw/mcu/st/cmsis_device_f3                 https://github.com/STMicroelectronics/cmsis_device_f3.git         5558e64e3675a1e1fcb1c71f468c7c407c1b1134  stm32f3\nhw/mcu/st/cmsis_device_f4                 https://github.com/STMicroelectronics/cmsis_device_f4.git         3c77349ce04c8af401454cc51f85ea9a50e34fc1  stm32f4\nhw/mcu/st/cmsis_device_f7                 https://github.com/STMicroelectronics/cmsis_device_f7.git         2352e888e821aa0f4fe549bd5ea81d29c67a3222  stm32f7\nhw/mcu/st/cmsis_device_g0                 https://github.com/STMicroelectronics/cmsis_device_g0.git         f484fe852535f913a02ee79787eafa74dd7f9488  stm32g0\nhw/mcu/st/cmsis_device_g4                 https://github.com/STMicroelectronics/cmsis_device_g4.git         7c39c32593b03764aaa57531588b8bf7cdd443a5  stm32g4\nhw/mcu/st/cmsis_device_h5                 https://github.com/STMicroelectronics/cmsis_device_h5.git         5273b8f134ba65f5b8174c4141b711b5c0d295b2  stm32h5\nhw/mcu/st/cmsis_device_h7                 https://github.com/STMicroelectronics/cmsis_device_h7.git         45b818cab6ee2806e3a27c80e330957223424392  stm32h7\nhw/mcu/st/cmsis_device_h7rs               https://github.com/STMicroelectronics/cmsis_device_h7rs.git       57ea11f70ebf1850e1048989d665c9070f0bb863  stm32h7rs\nhw/mcu/st/cmsis_device_l0                 https://github.com/STMicroelectronics/cmsis_device_l0.git         7b7ae8cd71437331e1d7824f157d00c7bb4a5044  stm32l0\nhw/mcu/st/cmsis_device_l1                 https://github.com/STMicroelectronics/cmsis_device_l1.git         a23ade4ccf14012085fedf862e33a536ab7ed8be  stm32l1\nhw/mcu/st/cmsis_device_l4                 https://github.com/STMicroelectronics/cmsis_device_l4.git         a2530753e86dd326a75467d28feb92e2ba7d0df2  stm32l4\nhw/mcu/st/cmsis_device_l5                 https://github.com/STMicroelectronics/cmsis_device_l5.git         7d9a51481f0e6c376e62c3c849e6caf652c66482  stm32l5\nhw/mcu/st/cmsis_device_n6                 https://github.com/STMicroelectronics/cmsis-device-n6.git         7bcdc944fbf7cf5928d3c1d14054ca13261d33ec  stm32n6\nhw/mcu/st/cmsis_device_u5                 https://github.com/STMicroelectronics/cmsis_device_u5.git         6e67187dec98035893692ab2923914cb5f4e0117  stm32u5\nhw/mcu/st/cmsis_device_wb                 https://github.com/STMicroelectronics/cmsis_device_wb.git         cda2cb9fc4a5232ab18efece0bb06b0b60910083  stm32wb\nhw/mcu/st/stm32-mfxstm32l152              https://github.com/STMicroelectronics/stm32-mfxstm32l152.git      7f4389efee9c6a655b55e5df3fceef5586b35f9b  stm32h7\nhw/mcu/st/stm32-tcpp0203                  https://github.com/STMicroelectronics/stm32-tcpp0203.git          9918655bff176ac3046ccf378b5c7bbbc6a38d15  stm32h5 stm32h7rs stm32n6\nhw/mcu/st/stm32c0xx_hal_driver            https://github.com/STMicroelectronics/stm32c0xx_hal_driver.git    c283b143bef6bdaacf64240ee6f15eb61dad6125  stm32c0\nhw/mcu/st/stm32f0xx_hal_driver            https://github.com/STMicroelectronics/stm32f0xx_hal_driver.git    94399697cb5eeaf8511b81b7f50dc62f0a5a3f6c  stm32f0\nhw/mcu/st/stm32f1xx_hal_driver            https://github.com/STMicroelectronics/stm32f1xx_hal_driver.git    18074e3e5ecad0b380a5cf5a9131fe4b5ed1b2b7  stm32f1\nhw/mcu/st/stm32f2xx_hal_driver            https://github.com/STMicroelectronics/stm32f2xx_hal_driver.git    ae7b47fe41cf75ccaf65cbf8ee8749b18ba0e0f3  stm32f2\nhw/mcu/st/stm32f3xx_hal_driver            https://github.com/STMicroelectronics/stm32f3xx_hal_driver.git    e098c8c8ce6f426bcee7db3a37c0932ea881eb0b  stm32f3\nhw/mcu/st/stm32f4xx_hal_driver            https://github.com/STMicroelectronics/stm32f4xx_hal_driver.git    b6f0ed3829f3829eb358a2e7417d80bba1a42db7  stm32f4\nhw/mcu/st/stm32f7xx_hal_driver            https://github.com/STMicroelectronics/stm32f7xx_hal_driver.git    e1446fa12ffda80ea1016faf349e45b2047fff12  stm32f7\nhw/mcu/st/stm32g0xx_hal_driver            https://github.com/STMicroelectronics/stm32g0xx_hal_driver.git    a248a9e484d58943b46c68f6c49b4b276778bd59  stm32g0\nhw/mcu/st/stm32g4xx_hal_driver            https://github.com/STMicroelectronics/stm32g4xx_hal_driver.git    10138a41749ea62d53ecab65b2bc2a950acc04d2  stm32g4\nhw/mcu/st/stm32h5xx_hal_driver            https://github.com/STMicroelectronics/stm32h5xx_hal_driver.git    3c84eaa6000ab620be01afbcfba2735389afe09b  stm32h5\nhw/mcu/st/stm32h7rsxx_hal_driver          https://github.com/STMicroelectronics/stm32h7rsxx-hal-driver.git  9e83b95ae0f70faa067eddce2da617d180937f9b  stm32h7rs\nhw/mcu/st/stm32h7xx_hal_driver            https://github.com/STMicroelectronics/stm32h7xx_hal_driver.git    dbfb749f229e1aa89e50b54229ca87766e180d2d  stm32h7\nhw/mcu/st/stm32l0xx_hal_driver            https://github.com/STMicroelectronics/stm32l0xx_hal_driver.git    65da4cd8a10ad859ec8d9cd71f3f6c50735bd473  stm32l0\nhw/mcu/st/stm32l1xx_hal_driver            https://github.com/STMicroelectronics/stm32l1xx_hal_driver.git    54f0b7568ce2acb33d090c70c897ee32229c1d32  stm32l1\nhw/mcu/st/stm32l4xx_hal_driver            https://github.com/STMicroelectronics/stm32l4xx_hal_driver.git    3e039bbf62f54bbd834d578185521cff80596efe  stm32l4\nhw/mcu/st/stm32l5xx_hal_driver            https://github.com/STMicroelectronics/stm32l5xx_hal_driver.git    3340b9a597bcf75cc173345a90a74aa2a4a37510  stm32l5\nhw/mcu/st/stm32n6xx_hal_driver            https://github.com/STMicroelectronics/stm32n6xx-hal-driver.git    bc6c41f8f67d61b47af26695d0bf67762a000666  stm32n6\nhw/mcu/st/stm32u0xx_hal_driver            https://github.com/STMicroelectronics/stm32u0xx-hal-driver.git    cbfb5ac654256445237fd32b3587ac6a238d24f1  stm32u0\nhw/mcu/st/stm32u5xx_hal_driver            https://github.com/STMicroelectronics/stm32u5xx_hal_driver.git    2c5e2568fbdb1900a13ca3b2901fdd302cac3444  stm32u5\nhw/mcu/st/stm32wbaxx_hal_driver           https://github.com/STMicroelectronics/stm32wbaxx_hal_driver.git   9442fbb71f855ff2e64fbf662b7726beba511a24  stm32wba\nhw/mcu/st/stm32wbxx_hal_driver            https://github.com/STMicroelectronics/stm32wbxx_hal_driver.git    d60dd46996876506f1d2e9abd6b1cc110c8004cd  stm32wb\nhw/mcu/ti                                 https://github.com/hathach/ti_driver.git                          083944907e7d08fcb1f614b47598ce45935b8da1  msp430 msp432e4 tm4c\nhw/mcu/wch/ch32f20x                       https://github.com/openwch/ch32f20x.git                           77c4095087e5ed2c548ec9058e655d0b8757663b  ch32f20x\nhw/mcu/wch/ch32v103                       https://github.com/openwch/ch32v103.git                           7578cae0b21f86dd053a1f781b2fc6ab99d0ec17  ch32v10x\nhw/mcu/wch/ch32v20x                       https://github.com/openwch/ch32v20x.git                           c4c38f507e258a4e69b059ccc2dc27dde33cea1b  ch32v20x\nhw/mcu/wch/ch32v307                       https://github.com/openwch/ch32v307.git                           184f21b852cb95eed58e86e901837bc9fff68775  ch32v30x\nlib/CMSIS_5                               https://github.com/ARM-software/CMSIS_5.git                       2b7495b8535bdcb306dac29b9ded4cfb679d7e5c  kinetis_k kinetis_kl lpc54 rw61x mm32 msp432e4 nrf samd2x_l2x lpc11 lpc13 lpc15 lpc17 lpc18 lpc40 lpc43 stm32c0 stm32f0 stm32f1 stm32f2 stm32f3 stm32f4 stm32f7 stm32g0 stm32g4 stm32h5 stm32h7 stm32h7rs stm32l0 stm32l1 stm32l4 stm32l5 stm32u0 stm32u5 stm32wb stm32wba sam3x samd11 samd21 samd51 samd5x_e5x same5x same7x samg tm4c\nlib/CMSIS_6                               https://github.com/ARM-software/CMSIS_6.git                       6f0a58d01aa9bd2feba212097f9afe7acd991d52  imxrt kinetis_k32l ra stm32n6 lpc51 lpc55 mcx\nlib/FreeRTOS-Kernel                       https://github.com/FreeRTOS/FreeRTOS-Kernel.git                   cc0e0707c0c748713485b870bb980852b210877f  all\nlib/lwip                                  https://github.com/lwip-tcpip/lwip.git                            159e31b689577dbf69cf0683bbaffbd71fa5ee10  all\nlib/sct_neopixel                          https://github.com/gsteiert/sct_neopixel.git                      e73e04ca63495672d955f9268e003cffe168fcd8  lpc55\nlib/threadx                               https://github.com/eclipse-threadx/threadx.git                    4b6e8100d932a3a67b34c6eb17f84f3bffb9e2ae  all\ntools/linkermap                           https://github.com/hathach/linkermap.git                          8e1f440fa15c567aceb5aa0d14f6d18c329cc67f  all\ntools/uf2                                 https://github.com/microsoft/uf2.git                              c594542b2faa01cc33a2b97c9fbebc38549df80a  all\n========================================  ================================================================  ========================================  ========================================================================================================================================================================================================================================================================================================================================\n"
  },
  {
    "path": "docs/reference/glossary.rst",
    "content": "********\nGlossary\n********\n\n.. glossary::\n\n   BSP\n      Board Support Package. A collection of board-specific code that provides hardware abstraction for a particular development board, including pin mappings, clock settings, linker scripts, and hardware initialization routines. Located in ``hw/bsp/FAMILY/boards/BOARD_NAME``.\n\n   Bulk Transfer\n      USB transfer type used for large amounts of data that doesn't require guaranteed timing. Used by mass storage devices and CDC class.\n\n   CDC\n      Communications Device Class. USB class for devices that communicate serial data, creating virtual serial ports.\n\n   Control Transfer\n      USB transfer type used for device configuration and control. All USB devices must support control transfers on endpoint 0.\n\n   DCD\n      Device Controller Driver. The hardware abstraction layer for USB device controllers in TinyUSB. See also HCD.\n\n   Descriptor\n      Data structures that describe USB device capabilities, configuration, and interfaces to the host.\n\n   Device Class\n      USB specification defining how devices of a particular type (e.g., storage, audio, HID) communicate with hosts.\n\n   DFU\n      Device Firmware Update. USB class that allows firmware updates over USB.\n\n   Endpoint\n      Communication channel between host and device. Each endpoint has a direction (IN/OUT) and transfer type.\n\n   Enumeration\n      Process where USB host discovers and configures a newly connected device.\n\n   HCD\n      Host Controller Driver. The hardware abstraction layer for USB host controllers in TinyUSB. See also DCD.\n\n   HID\n      Human Interface Device. USB class for input devices like keyboards, mice, and game controllers.\n\n   High Speed\n      USB 2.0 speed mode operating at 480 Mbps.\n\n   Full Speed\n      USB speed mode operating at 12 Mbps, supported by USB 1.1 and 2.0.\n\n   Low Speed\n      USB speed mode operating at 1.5 Mbps, typically used by simple input devices.\n\n   Interrupt Transfer\n      USB transfer type for small, time-sensitive data with guaranteed maximum latency.\n\n   Isochronous Transfer\n      USB transfer type for time-critical data like audio/video with guaranteed bandwidth but no error correction.\n\n   MSC\n      Mass Storage Class. USB class for storage devices like USB drives.\n\n   OSAL\n      Operating System Abstraction Layer. TinyUSB component that abstracts RTOS differences.\n\n   OTG\n      On-The-Go. USB specification allowing devices to act as both host and device.\n\n   Pipe\n      Host-side communication channel to a device endpoint.\n\n   Root Hub\n      The USB hub built into the host controller, where devices connect directly.\n\n   Stall\n      USB protocol mechanism where an endpoint responds with a STALL handshake to indicate an error condition or unsupported request. Used for error handling, not flow control.\n\n   Super Speed\n      USB 3.0 speed mode operating at 5 Gbps. Not supported by TinyUSB.\n\n   tud\n      TinyUSB Device. Function prefix for all device stack APIs (e.g., ``tud_task()``, ``tud_cdc_write()``).\n\n   tuh\n      TinyUSB Host. Function prefix for all host stack APIs (e.g., ``tuh_task()``, ``tuh_cdc_receive()``).\n\n   UAC\n      USB Audio Class. USB class for audio devices.\n\n   UVC\n      USB Video Class. USB class for video devices like cameras.\n\n   VID\n      Vendor Identifier. 16-bit number assigned by USB-IF to identify device manufacturers.\n\n   PID\n      Product Identifier. 16-bit number assigned by vendor to identify specific products.\n\n   USB-IF\n      USB Implementers Forum. Organization that maintains USB specifications and assigns VIDs.\n"
  },
  {
    "path": "docs/reference/index.rst",
    "content": "*********\nReference\n*********\n\nComplete reference documentation for TinyUSB APIs, configuration, and supported hardware.\n\n.. toctree::\n   :maxdepth: 2\n\n   architecture\n   usb_concepts\n   boards\n   dependencies\n   concurrency\n   glossary\n"
  },
  {
    "path": "docs/reference/usb_concepts.rst",
    "content": "************\nUSB Concepts\n************\n\nThis document provides a brief introduction to USB protocol fundamentals that are essential for understanding TinyUSB development.\n\nTinyUSB API Naming Conventions\n===============================\n\nTinyUSB uses consistent function prefixes to organize its API:\n\n* **tusb_**: Core stack functions (initialization, interrupt handling)\n* **tud_**: Device stack functions (e.g., ``tud_task()``, ``tud_cdc_write()``)\n* **tuh_**: Host stack functions (e.g., ``tuh_task()``, ``tuh_cdc_receive()``)\n* **tu_**: Internal utility functions (generally not used by applications)\n\nThis naming makes it easy to identify which part of the stack a function belongs to and ensures there are no naming conflicts when using both device and host stacks together.\n\nUSB Protocol Basics\n====================\n\nUniversal Serial Bus (USB) is a standardized communication protocol designed for connecting devices to hosts (typically computers). Understanding these core concepts is essential for effective TinyUSB development.\n\nHost and Device Roles\n----------------------\n\n**USB Host**: The controlling side of a USB connection (typically a computer). The host:\n- Initiates all communication\n- Provides power to devices\n- Manages the USB bus\n- Enumerates and configures devices\n\n**TinyUSB Host Stack**: Enable with ``CFG_TUH_ENABLED=1`` in ``tusb_config.h``. Call ``tuh_task()`` regularly in your main loop. See the :doc:`../getting_started` Quick Start Examples for implementation details.\n\n**USB Device**: The peripheral side (keyboard, mouse, storage device, etc.). Devices:\n- Respond to host requests\n- Cannot initiate communication\n- Receive power from the host\n- Must be enumerated by the host before use\n\n**TinyUSB Device Stack**: Enable with ``CFG_TUD_ENABLED=1`` in ``tusb_config.h``. Call ``tud_task()`` regularly in your main loop. See the :doc:`../getting_started` Quick Start Examples for implementation details.\n\n**OTG (On-The-Go)**: Some devices can switch between host and device roles dynamically. **TinyUSB Support**: Both stacks can be enabled simultaneously on OTG-capable hardware. See ``examples/dual/`` for dual-role implementations.\n\nUSB Transfers\n=============\n\nEvery USB transfer consists of the host issuing a request, and the device replying to that request. The host is the bus master and initiates all communication.\nDevices cannot initiate sending data; for unsolicited incoming data, polling is used by the host.\n\nUSB defines four transfer types, each intended for different use cases:\n\nControl Transfers\n-----------------\n\nUsed for device configuration and control commands.\n\n**Characteristics**:\n- Bidirectional (uses both IN and OUT)\n- Guaranteed delivery with error detection\n- Limited data size (8-64 bytes per packet)\n- All devices must support control transfers on endpoint 0\n\n**Usage**: Device enumeration, configuration changes, class-specific commands\n\n**TinyUSB Context**: Handled automatically by the core stack for standard requests; class drivers handle class-specific requests. Endpoint 0 is managed by ``src/device/usbd.c`` and ``src/host/usbh.c``. Configure buffer size with ``CFG_TUD_ENDPOINT0_SIZE`` (typically 64 bytes).\n\nBulk Transfers\n--------------\n\nUsed for large amounts of data that don't require guaranteed timing.\n\n**Characteristics**:\n- Unidirectional (separate IN and OUT endpoints)\n- Guaranteed delivery with error detection\n- Large packet sizes (up to 512 bytes for High Speed)\n- Uses available bandwidth when no other transfers are active\n\n**Usage**: File transfers, large data communication, CDC serial data\n\n**TinyUSB Context**: Used by MSC (mass storage) and CDC classes for data transfer. Configure endpoint buffer sizes with ``CFG_TUD_MSC_EP_BUFSIZE`` and ``CFG_TUD_CDC_EP_BUFSIZE``. See ``src/class/msc/`` and ``src/class/cdc/`` for implementation details.\n\nInterrupt Transfers\n-------------------\n\nUsed for small, time-sensitive data with guaranteed maximum latency.\n\n**Characteristics**:\n- Unidirectional (separate IN and OUT endpoints)\n- Guaranteed delivery with error detection\n- Small packet sizes (up to 64 bytes for Full Speed)\n- Regular polling interval (1ms to 255ms)\n\n**Usage**: Keyboard/mouse input, sensor data, status updates\n\n**TinyUSB Context**: Used by HID class for input reports. Configure with ``CFG_TUD_HID`` and ``CFG_TUD_HID_EP_BUFSIZE``. Send reports using ``tud_hid_report()`` or ``tud_hid_keyboard_report()``. See ``src/class/hid/`` and HID examples in ``examples/device/hid_*/``.\n\nIsochronous Transfers\n---------------------\n\nUsed for time-critical streaming data.\n\n**Characteristics**:\n- Unidirectional (separate IN and OUT endpoints)\n- No error correction (speed over reliability)\n- Guaranteed bandwidth\n- Real-time delivery\n\n**Usage**: Audio, video streaming\n\n**TinyUSB Context**: Used by Audio class for streaming audio data. Configure with ``CFG_TUD_AUDIO`` and related audio configuration macros. See ``src/class/audio/`` and audio examples in ``examples/device/audio_*/`` for UAC2 implementation.\n\nEndpoints and Addressing\n=========================\n\nEndpoint Basics\n---------------\n\n**Endpoint**: A communication channel between host and device.\n\n- Each endpoint has a number (0-15) and direction\n- Endpoint 0 is reserved for control transfers\n- Other endpoints are assigned by device class requirements\n\n**TinyUSB Endpoint Management**: Configure maximum endpoints with ``CFG_TUD_ENDPOINT_MAX``. Endpoints are automatically allocated by enabled classes. See your board's ``usb_descriptors.c`` for endpoint assignments.\n\n**Direction**:\n- **OUT**: Host to device (host sends data out)\n- **IN**: Device to host (host reads data in)\n- Note that in TinyUSB code, for ``tx``/``rx``, the device perspective is used typically: E.g., ``tud_cdc_tx_complete_cb()`` designates the callback executed once the device has completed sending data to the host (in device mode).\n\n**Addressing**: Endpoints are addressed as EPx IN/OUT (e.g., EP1 IN, EP2 OUT)\n\nEndpoint Configuration\n----------------------\n\nEach endpoint is configured with a specific **transfer type** (control, bulk, interrupt, or isochronous), a **direction** (IN, OUT, or bidirectional for control only), a **maximum packet size** that depends on USB speed and transfer type, and an **interval** for interrupt and isochronous endpoints.\n\n**TinyUSB Configuration**: Endpoint characteristics are defined in descriptors (``usb_descriptors.c``) and automatically configured by the stack. Buffer sizes are set via ``CFG_TUD_*_EP_BUFSIZE`` macros.\n\nError Handling and Flow Control\n-------------------------------\n\n**Transfer Results**: USB transfers can complete with different results. An **ACK** indicates a successful transfer, while a **NAK** signals that the device is not ready (commonly used for flow control). A **STALL** response indicates an error condition or unsupported request, and **Timeout** occurs when a transfer fails to complete within the expected time frame.\n\n**Flow Control in USB**: Unlike network protocols, USB doesn't use traditional congestion control. Instead, devices use NAK responses when not ready to receive data, applications implement buffering and proper timing strategies, and some classes (like CDC) support hardware flow control mechanisms such as RTS/CTS.\n\n**TinyUSB Handling**: Transfer results are represented as ``xfer_result_t`` enum values. The stack automatically handles NAK responses and timing. STALL conditions indicate application-level errors that should be addressed in class drivers.\n\nUSB Device States\n=================\n\nA USB device progresses through several states:\n\n1. **Attached**: Device is physically connected\n2. **Powered**: Device receives power from host\n3. **Default**: Device responds to address 0\n4. **Address**: Device has been assigned a unique address\n5. **Configured**: Device is ready for normal operation\n6. **Suspended**: Device is in low-power state\n\n**TinyUSB State Management**: State transitions are handled automatically by ``src/device/usbd.c``. You can implement ``tud_mount_cb()`` and ``tud_umount_cb()`` to respond to configuration changes, and ``tud_suspend_cb()``/``tud_resume_cb()`` for power management.\n\nDevice Enumeration Process\n==========================\n\nWhen a device is connected, the host follows this process:\n\n1. **Detection**: Host detects device connection\n2. **Reset**: Host resets the device\n3. **Descriptor Requests**: Host requests device descriptors\n4. **Address Assignment**: Host assigns unique address to device\n5. **Configuration**: Host selects and configures device\n6. **Class Loading**: Host loads appropriate drivers\n7. **Normal Operation**: Device is ready for use\n\n**TinyUSB Role**: The device stack handles steps 1-6 automatically; your application handles step 7.\n\nUSB Descriptors\n===============\n\nDescriptors are data structures that describe device capabilities:\n\nDevice Descriptor\n-----------------\nDescribes the device (VID, PID, USB version, etc.)\n\nConfiguration Descriptor\n------------------------\nDescribes device configuration (power requirements, interfaces, etc.)\n\nInterface Descriptor\n--------------------\nDescribes a functional interface (class, endpoints, etc.)\n\nEndpoint Descriptor\n-------------------\nDescribes endpoint characteristics (type, direction, size, etc.)\n\nString Descriptors\n------------------\nHuman-readable strings (manufacturer, product name, etc.)\n\n**TinyUSB Implementation**: You provide descriptors in ``usb_descriptors.c`` via callback functions:\n- ``tud_descriptor_device_cb()`` - Device descriptor\n- ``tud_descriptor_configuration_cb()`` - Configuration descriptor\n- ``tud_descriptor_string_cb()`` - String descriptors\n\nThe stack automatically handles descriptor requests during enumeration. See examples in ``examples/device/*/usb_descriptors.c`` for reference implementations.\n\nUSB Classes\n===========\n\nUSB classes define standardized protocols for device types:\n\n**Class Code**: Identifies the device type in descriptors\n**Class Driver**: Software that implements the class protocol\n**Class Requests**: Standardized commands for the class\n\n**Common TinyUSB-Supported Classes**:\n- **CDC (02h)**: Communication devices (virtual serial ports) - Enable with ``CFG_TUD_CDC``\n- **HID (03h)**: Human interface devices (keyboards, mice) - Enable with ``CFG_TUD_HID``\n- **MSC (08h)**: Mass storage devices (USB drives) - Enable with ``CFG_TUD_MSC``\n- **Audio (01h)**: Audio devices (speakers, microphones) - Enable with ``CFG_TUD_AUDIO``\n- **MIDI**: MIDI devices - Enable with ``CFG_TUD_MIDI``\n- **DFU**: Device Firmware Update - Enable with ``CFG_TUD_DFU``\n- **Vendor**: Custom vendor classes - Enable with ``CFG_TUD_VENDOR``\n\n.. note::\n   **Vendor Class Buffer Configuration**: Unlike other USB classes, the vendor class supports setting buffer sizes to 0 in ``tusb_config.h`` (``CFG_TUD_VENDOR_RX_BUFSIZE = 0``) to disable internal buffering. When disabled, data goes directly to ``tud_vendor_rx_cb()`` and the ``tud_vendor_read()``/``tud_vendor_write()`` functions are not available - applications must handle data directly in callbacks.\n\nSee ``examples/device/*/tusb_config.h`` for configuration examples.\n\nUSB Speeds\n==========\n\nUSB supports multiple speed modes:\n\n**Low Speed (1.5 Mbps)**:\n- Simple devices (mice, keyboards)\n- Limited endpoint types and sizes\n\n**Full Speed (12 Mbps)**:\n- Most common for embedded devices\n- All transfer types supported\n- Maximum packet sizes: Control (64), Bulk (64), Interrupt (64)\n\n**High Speed (480 Mbps)**:\n- High-performance devices\n- Larger packet sizes: Control (64), Bulk (512), Interrupt (1024)\n- Requires more complex hardware\n\n**Super Speed (5 Gbps)**:\n- USB 3.0 and later\n- Not supported by TinyUSB\n\n**TinyUSB Speed Support**: Most TinyUSB ports support Full Speed and High Speed. Speed is typically auto-detected by hardware. Configure speed requirements in board configuration (``hw/bsp/FAMILY/boards/BOARD/board.mk``) and ensure your MCU supports the desired speed.\n\nUSB Controller Abstraction\n===========================\n\nUSB controllers are hardware peripherals that handle the low-level USB protocol implementation. Understanding how they work helps explain TinyUSB's architecture and portability.\n\nController Fundamentals\n-----------------------\n\n**What Controllers Do**:\n- Handle USB signaling and protocol timing\n- Manage endpoint buffers and data transfers\n- Generate interrupts for USB events\n- Implement USB electrical specifications\n\n**Key Components**: USB controllers consist of several key components working together. The **Physical Layer** provides USB signal drivers and receivers for electrical interfacing. The **Protocol Engine** handles USB packets and ACK/NAK responses according to the USB specification. **Endpoint Buffers** provide hardware FIFOs or RAM for data storage during transfers. Finally, the **Interrupt Controller** generates events for software processing when USB activities occur.\n\nController Architecture Types\n-----------------------------\n\nDifferent MCU vendors implement USB controllers with varying architectures.\nTo list a few common patterns:\n\n**FIFO-Based Controllers** (e.g., STM32 OTG, NXP LPC):\n- Shared or dedicated FIFOs for endpoint data\n- Software manages FIFO allocation and data flow\n- Common in higher-end MCUs with flexible configurations\n\n**Buffer-Based Controllers** (e.g., STM32 FSDEV, Microchip SAMD, RP2040):\n- Fixed packet memory areas for each endpoint\n- Hardware automatically handles packet placement\n- Simpler programming model, common in smaller MCUs\n\n**Descriptor-Based Controllers** (e.g., NXP EHCI-style):\n- Use descriptor chains to describe transfers\n- Hardware processes transfer descriptors independently\n- More complex but can handle larger transfers autonomously\n\nTinyUSB Controller Abstraction\n------------------------------\n\nTinyUSB abstracts controller differences through the TinyUSB **Device Controller Driver (DCD)** layer.\nThese internal details don't matter to users of TinyUSB typically; however, when debugging, knowledge about internal details helps sometimes.\n\n**Portable Interface** (``src/device/usbd.h``):\n- Standardized function signatures for all controllers\n- Common endpoint and transfer management APIs\n- Unified interrupt and event handling\n\n**Controller-Specific Drivers** (``src/portable/VENDOR/FAMILY/``):\n- Implement the DCD interface for specific hardware\n- Handle vendor-specific register layouts and behaviors\n- Manage controller-specific quirks and workarounds\n\n**Common DCD Functions**:\n- ``dcd_init()`` - Initialize controller hardware\n- ``dcd_edpt_open()`` - Configure endpoint with type and size\n- ``dcd_edpt_xfer()`` - Start data transfer on endpoint\n- ``dcd_int_handler()`` - Process USB interrupts\n- ``dcd_connect()/dcd_disconnect()`` - Control USB bus connection\n\nHost Controller Driver (HCD)\n-----------------------------\n\nTinyUSB also abstracts USB host controllers through the **Host Controller Driver (HCD)** layer for host mode applications.\n\n**Portable Interface** (``src/host/usbh.h``):\n- Standardized interface for all host controllers\n- Common device enumeration and pipe management\n- Unified transfer scheduling and completion handling\n\n**Common HCD Functions**:\n- ``hcd_init()`` - Initialize host controller hardware\n- ``hcd_port_connect_status()`` - Check device connection status\n- ``hcd_port_reset()`` - Reset connected device\n- ``hcd_edpt_open()`` - Open communication pipe to device endpoint\n- ``hcd_edpt_xfer()`` - Transfer data to/from connected device\n\n**Host vs Device Architecture**: While DCD is reactive (responds to host requests), HCD is active (initiates all communication). Host controllers manage device enumeration, driver loading, and transfer scheduling to multiple connected devices.\n\nTinyUSB Event System & Thread Safety\n====================================\n\nDeferred Interrupt Processing\n-----------------------------\n\n**Core Architectural Principle**: TinyUSB uses a deferred interrupt processing model where all USB hardware events are captured in interrupt service routines (ISRs) but processed later in non-interrupt context.\n\n**Event Flow**:\n\n1. **Hardware Event**: USB controller generates interrupt (e.g., data received, transfer complete)\n2. **ISR Handling**: TinyUSB ISR captures the event and pushes it to a central event queue\n3. **Deferred Processing**: Application calls ``tud_task()`` or ``tuh_task()`` to process queued events\n4. **Class Driver Callbacks**: Events trigger appropriate class driver functions and user callbacks\n\n**Buffer Integration**: The deferred processing model works seamlessly with TinyUSB's buffer/FIFO design. Since callbacks run in task context (not ISR), it's safe and straightforward to enqueue TX data directly in RX callbacks - for example, processing incoming CDC data and immediately sending a response.\n\nController Event Flow\n---------------------\n\n**Typical USB Event Processing**:\n\n1. **Hardware Event**: USB controller detects bus activity (setup packet, data transfer, etc.)\n2. **Interrupt Generation**: Controller generates interrupt to CPU\n3. **ISR Processing**: ``dcd_int_handler()`` reads controller status\n4. **Event Queuing**: Events are queued for later processing (thread safety)\n5. **Task Processing**: ``tud_task()`` processes queued events\n6. **Class Notification**: Appropriate class drivers handle the event\n7. **Application Callback**: User code responds to the event\n\nUSB Class Driver Architecture\n==============================\n\nTinyUSB implements USB classes through a standardized driver pattern that provides consistent integration with the core stack while allowing class-specific functionality.\n\nClass Driver Pattern\n---------------------\n\n**Standardized Entry Points**: Each class driver implements these core functions:\n\n- ``*_init()`` - Initialize class driver state and buffers\n- ``*_reset()`` - Reset to initial state on USB bus reset\n- ``*_open()`` - Parse and configure interfaces during enumeration\n- ``*_control_xfer_cb()`` - Handle class-specific control requests\n- ``*_xfer_cb()`` - Handle transfer completion callbacks\n\n**Multi-Instance Support**: Classes support multiple instances using ``_n`` suffixed APIs:\n\n.. code-block:: c\n\n   // Single instance (default instance 0)\n   tud_cdc_write(data, len);\n\n   // Multiple instances\n   tud_cdc_n_write(0, data, len);  // Instance 0\n   tud_cdc_n_write(1, data, len);  // Instance 1\n\n**Integration with Core Stack**: Class drivers are automatically discovered and integrated through function pointers in driver tables. The core stack calls class drivers during enumeration, control requests, and data transfers without requiring explicit registration.\n\nClass Driver Types\n-------------------\n\nTinyUSB classes have different architectural patterns based on their buffering capabilities and callback designs.\n\nMost classes like CDC, MIDI, and HID always use internal buffers for data management. These classes provide notification-only callbacks such as ``tud_cdc_rx_cb(uint8_t itf)`` that signal when data is available, requiring applications to use class-specific APIs like ``tud_cdc_read()`` and ``tud_cdc_write()`` to access the data. HID is slightly different in that it provides direct buffer access in some callbacks (``tud_hid_set_report_cb()`` receives buffer and size parameters), but it still maintains internal endpoint buffering that cannot be disabled.\n\nThe **Vendor Class** is unique in that it supports both buffered and direct modes. When buffered, vendor class behaves like other classes with ``tud_vendor_read()`` and ``tud_vendor_write()`` APIs. However, when buffering is disabled by setting buffer size to 0, the vendor class provides direct buffer access through ``tud_vendor_rx_cb(itf, buffer, bufsize)`` callbacks, eliminating internal FIFO overhead and providing direct endpoint control.\n\n**Block-Oriented Classes** like MSC operate differently by handling large data blocks through callback interfaces. The application implements storage access functions such as ``tud_msc_read10_cb()`` and ``tud_msc_write10_cb()``, while the TinyUSB stack manages the USB protocol aspects and the application manages the underlying storage.\n\nPower Management\n================\n\nUSB provides power to devices:\n\n**Bus-Powered**: Device draws power from USB bus (up to 500mA)\n**Self-Powered**: Device has its own power source\n**Suspend/Resume**: Devices must enter low-power mode when bus is idle\n\n**TinyUSB Power Management**:\n- Implement ``tud_suspend_cb()`` and ``tud_resume_cb()`` for power management\n- Configure power requirements in device descriptor (``bMaxPower`` field)\n- Use ``tud_remote_wakeup()`` to wake the host from suspend (if supported)\n- Enable remote wakeup with ``CFG_TUD_USBD_ENABLE_REMOTE_WAKEUP``\n\nNext Steps\n==========\n\n- Start with :doc:`../getting_started` for basic setup\n- Review ``examples/device/*/tusb_config.h`` for configuration examples\n- Explore examples in ``examples/device/`` and ``examples/host/`` directories\n"
  },
  {
    "path": "docs/requirements.txt",
    "content": "sphinx>=5.0\nfuro>=2020.12.30.b24\nsphinx-autodoc-typehints>=1.10\njinja2>=3.0.3\n"
  },
  {
    "path": "docs/troubleshooting.rst",
    "content": "***************\nTroubleshooting\n***************\n\nThis guide helps you diagnose and fix common issues when developing with TinyUSB.\n\nBuild Issues\n============\n\nToolchain Problems\n------------------\n\n**\"arm-none-eabi-gcc: command not found\"**\n\nThe ARM GCC toolchain is not installed or not in PATH.\n\n*Solution*:\n\n.. code-block:: bash\n\n   # Ubuntu/Debian\n   $ sudo apt-get update && sudo apt-get install gcc-arm-none-eabi\n\n   # macOS with Homebrew\n   $ brew install --cask gcc-arm-embedded\n\n   # Windows: Download from ARM website and add to PATH\n\n**\"make: command not found\" or CMake errors**\n\nBuild tools are missing.\n\n*Solution*:\n\n.. code-block:: bash\n\n   # Ubuntu/Debian\n   $ sudo apt-get install build-essential cmake\n\n   # macOS\n   $ xcode-select --install\n   $ brew install cmake\n\nDependency Issues\n-----------------\n\n**\"No rule to make target\" or missing header files**\n\nDependencies for your MCU family are not downloaded.\n\n*Solution*:\n\n.. code-block:: bash\n\n   # Download dependencies for specific board or family\n   $ python tools/get_deps.py -b stm32h743eval  # Replace with your board\n   $ python tools/get_deps.py stm32f4           # Replace with your family\n\n   # Or from example directory\n   cd examples/device/cdc_msc\n   make BOARD=your_board get-deps\n\n**Board Not Found**\n\nInvalid board name in build command.\n\n*Diagnosis*:\n\n.. code-block:: bash\n\n   # List available boards for a family\n   ls hw/bsp/stm32f4/boards/\n\n*Solution*: Use exact board name from the listing.\n\nRuntime Issues\n==============\n\nDevice Mode Problems\n--------------------\n\n**Device not recognized by host**\n\nThe most common issue - host doesn't see your USB device.\n\n*Diagnosis steps*:\n\n1. Check USB cable (must support data, not just power)\n2. Enable logging: build with ``LOG=2``\n3. Use different USB ports/hosts\n4. Check device manager (Windows) or ``dmesg`` (Linux)\n\n*Common causes and solutions*:\n\n- **Invalid descriptors**: Review ``usb_descriptors.c`` carefully\n- **``tud_task()`` not called**: Ensure regular calls in main loop (< 1ms interval)\n- **Wrong USB configuration**: Check ``tusb_config.h`` settings\n- **Hardware issues**: Verify USB pins, crystal/clock configuration\n\n**Enumeration starts but fails**\n\nDevice is detected but configuration fails.\n\n*Diagnosis*:\n\n.. code-block:: bash\n\n   # Build with logging enabled\n   make BOARD=your_board LOG=2 all\n\n*Look for*:\n\n- Setup request handling errors\n- Endpoint configuration problems\n- String descriptor issues\n\n*Solutions*:\n\n- Implement all required descriptors\n- Check endpoint sizes match descriptors\n- Ensure control endpoint (EP0) handling is correct\n\n**Data transfer issues**\n\nDevice enumerates but data doesn't transfer correctly.\n\n*Common causes*:\n\n- Buffer overruns in class callbacks\n- Incorrect endpoint usage (IN vs OUT)\n- Flow control issues in CDC class\n\n*Solutions*:\n\n- Check buffer sizes in callbacks\n- Verify endpoint directions in descriptors\n- Implement proper flow control\n\nHost Mode Problems\n------------------\n\n**No devices detected**\n\nHost application doesn't see connected devices.\n\n*Hardware checks*:\n\n- Power supply adequate for host mode\n- USB-A connector for host (not micro-USB)\n- Board supports host mode on selected port\n\n*Software checks*:\n\n- ``tuh_task()`` called regularly\n- Host stack enabled in ``tusb_config.h``\n- Correct root hub port configuration\n\n**Device enumeration fails**\n\nDevices connect but enumeration fails.\n\n*Diagnosis*:\n\n.. code-block:: bash\n\n   # Enable host logging\n   make BOARD=your_board LOG=2 RHPORT_HOST=1 all\n\n*Common issues*:\n\n- Power supply insufficient during enumeration\n- Timing issues with slow devices\n- USB hub compatibility problems\n\n**Class driver issues**\n\nDevice enumerates but class-specific communication fails.\n\n*Troubleshooting*:\n\n- Check device descriptors match expected class\n- Verify interface/endpoint assignments\n- Some devices need device-specific handling\n\nPerformance Issues\n==================\n\nSlow Transfer Speeds\n--------------------\n\n**Symptoms**: Lower than expected USB transfer rates\n\n*Causes and solutions*: Improve **task scheduling** by calling ``tud_task()``/``tuh_task()`` more frequently to ensure timely USB event processing. Consider increasing **endpoint buffer sizes** for bulk transfers to reduce the frequency of small transfers. Enable **DMA usage** for USB transfers if your hardware supports it to offload CPU processing. Finally, use **High Speed** (480 Mbps) instead of Full Speed (12 Mbps) when possible to achieve better throughput.\n\nHigh CPU Usage\n--------------\n\n**Symptoms**: MCU spending too much time in USB handling\n\n*Solutions*:\n\n- Use efficient logging (RTT/SWO instead of UART)\n- Reduce log level in production builds\n- Optimize descriptor parsing\n- Use DMA for data transfers\n\nHardware-Specific Issues\n========================\n\nSTM32 Issues\n------------\n\n**Clock configuration problems**:\n\n- USB requires precise 48MHz clock\n- HSE crystal must be configured correctly\n- PLL settings affect USB timing\n\n**Pin configuration**:\n\n- USB pins need specific alternate function settings\n- VBUS sensing configuration\n- ID pin for OTG applications\n\nRP2040 Issues\n-------------\n\n**PIO-USB for host mode**:\n\n- Requires specific pin assignments\n- CPU overclocking may be needed for reliable operation\n- Timing-sensitive - avoid long interrupt disable periods\n\nESP32 Issues\n------------\n\n**USB peripheral differences**:\n\n- ESP32-S2/S3/P4 have different USB capabilities\n- DMA configuration varies between models\n\nAdvanced Debugging\n==================\n\nUsing USB Analyzers\n-------------------\n\nFor complex issues, hardware USB analyzers provide detailed protocol traces:\n\n- **Wireshark** with USBPcap (Windows) or usbmon (Linux)\n- **Hardware analyzers**: Total Phase Beagle, LeCroy USB analyzers\n- **Logic analyzers**: For timing analysis of USB signals\n\nDebugging with GDB\n------------------\n\nDebugging with traditional debuggers is limited due to the real time nature of USB.\nHowever, especially for diagnosis of crashes, it can still be useful.\n\n.. code-block:: bash\n\n   # Build with debug info\n   make BOARD=your_board DEBUG=1 all\n\n   # Use with debugger\n   arm-none-eabi-gdb build/your_app.elf\n\n*Useful breakpoints*:\n\n- ``dcd_int_handler()`` - USB interrupt entry\n- ``tud_task()`` - Main device task\n- Class-specific callbacks\n\nCustom Logging\n--------------\n\nFor production debugging, implement custom logging:\n\n.. code-block:: c\n\n   // In tusb_config.h\n   #define CFG_TUSB_DEBUG_PRINTF   my_printf\n\n   // Your implementation\n   void my_printf(const char* format, ...) {\n     // Send to RTT, SWO, or custom interface\n   }\n\nGetting Help\n============\n\nWhen reporting issues:\n\n1. **Minimal reproducible example**: Simplify to bare minimum\n2. **Build information**: Board, toolchain version, build flags\n3. **Logs**: Include output with ``LOG=2`` enabled\n4. **Hardware details**: Board revision, USB connections, power supply\n5. **Host environment**: OS version, USB port type\n\n**Resources**:\n\n- GitHub Discussions: https://github.com/hathach/tinyusb/discussions\n- Issue Tracker: https://github.com/hathach/tinyusb/issues\n- Documentation: https://docs.tinyusb.org\n"
  },
  {
    "path": "examples/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../hw/bsp/family_support.cmake)\n\nproject(tinyusb_examples C CXX ASM)\n\nset(EXAMPLES_LIST\n  device\n  dual\n  host\n  typec\n  )\nset(MAPJSON_PATTERNS \"\")\n\nforeach (example ${EXAMPLES_LIST})\n  add_subdirectory(${example})\n  list(APPEND MAPJSON_PATTERNS \"${CMAKE_BINARY_DIR}/${example}/*/*.map.json\")\nendforeach ()\n\n# Post-build: run metrics.py on all map.json files\nfind_package(Python3 REQUIRED COMPONENTS Interpreter)\nadd_custom_target(tinyusb_metrics\n  COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/../tools/metrics.py\n  combine -f tinyusb/src -j -o ${CMAKE_BINARY_DIR}/metrics\n  ${MAPJSON_PATTERNS}\n  COMMENT \"Generating average code size metrics\"\n  VERBATIM\n  )\n\n#add_custom_command(TARGET tinyusb_metrics POST_BUILD\n#  COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/../tools/metrics.py compare ${TOP}/cmake-build/cmake-build-${BOARD}/metrics.json ${CMAKE_BINARY_DIR}/metrics.json\n#  COMMENT \"Generating average code size metrics\"\n#  VERBATIM\n#  )\n"
  },
  {
    "path": "examples/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/arm1176jzf-s.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mcpu=arm1176jzf-s\n    -ffreestanding\n  )\n  # set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=arm1176jzf-s\n    -mfpu=none\n    -mfloat-abi=soft\n    -ffreestanding\n  )\n  #set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  message(FATAL_ERROR \"IAR not supported\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/arm926ej-s.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mcpu=arm926ej-s\n    -ffreestanding\n    )\n  # set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=arm926ej-s\n    -mfpu=none\n    -mfloat-abi=soft\n    -ffreestanding\n    )\n  #set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  message(FATAL_ERROR \"IAR not supported\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-a53.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n\tset(TOOLCHAIN_COMMON_FLAGS\n\t\t-mcpu=cortex-a53\n\t\t)\n\t# set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n\tset(TOOLCHAIN_COMMON_FLAGS\n\t\t--target=arm-none-eabi\n\t\t-mcpu=cortex-a53\n\t\t)\n\t#set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n\tmessage(FATAL_ERROR \"IAR not supported\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-a72.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n\tset(TOOLCHAIN_COMMON_FLAGS\n\t\t-mcpu=cortex-a72\n\t\t)\n\t# set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n\tset(TOOLCHAIN_COMMON_FLAGS\n\t\t--target=arm-none-eabi\n\t\t-mcpu=cortex-a72\n\t\t)\n\t#set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n\tmessage(FATAL_ERROR \"IAR not supported\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m0.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m0\n    -mfloat-abi=soft\n    )\n  set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m0\n    )\n  set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m0\n    )\n  set(FREERTOS_PORT IAR_ARM_CM0 CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m0plus.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m0plus\n    -mfloat-abi=soft\n    )\n  set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m0plus\n    )\n  set(FREERTOS_PORT GCC_ARM_CM0 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m0\n    )\n  set(FREERTOS_PORT IAR_ARM_CM0 CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m23.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m23\n    -mfloat-abi=soft\n    )\n  set(FREERTOS_PORT GCC_ARM_CM23_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m23\n    )\n  set(FREERTOS_PORT GCC_ARM_CM23_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m23\n    )\n  set(FREERTOS_PORT IAR_ARM_CM23_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m3.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m3\n    )\n  set(FREERTOS_PORT GCC_ARM_CM3 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m3\n    )\n  set(FREERTOS_PORT GCC_ARM_CM3 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m3\n    )\n  set(FREERTOS_PORT IAR_ARM_CM3 CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m33-nodsp-nofp.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m33+nodsp\n    -mfloat-abi=soft\n    )\n  set(FREERTOS_PORT GCC_ARM_CM33_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  message(FATAL_ERROR \"Clang is not supported for this target\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m33+nodsp\n    )\n  set(FREERTOS_PORT IAR_ARM_CM33_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m33-nodsp.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m33+nodsp\n    -mfloat-abi=hard\n    -mfpu=fpv5-sp-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM33_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m33+nodsp\n    -mfpu=fpv5-sp-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM33_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m33+nodsp\n    --fpu VFPv5-SP\n    )\n  set(FREERTOS_PORT IAR_ARM_CM33_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m33.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m33\n    -mfloat-abi=hard\n    -mfpu=fpv5-sp-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM33_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m33\n    -mfpu=fpv5-sp-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM33_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m33\n    --fpu VFPv5-SP\n    )\n  set(FREERTOS_PORT IAR_ARM_CM33_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m4-nofpu.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m4\n    -mfloat-abi=soft\n    )\n  if (NOT DEFINED FREERTOS_PORT)\n    set(FREERTOS_PORT GCC_ARM_CM3 CACHE INTERNAL \"\")\n  endif ()\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m4\n    )\n  if (NOT DEFINED FREERTOS_PORT)\n    set(FREERTOS_PORT GCC_ARM_CM3 CACHE INTERNAL \"\")\n  endif ()\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m4\n    --fpu none\n    )\n\n  if (NOT DEFINED FREERTOS_PORT)\n    set(FREERTOS_PORT IAR_ARM_CM3 CACHE INTERNAL \"\")\n  endif ()\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m4.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m4\n    -mfloat-abi=hard\n    -mfpu=fpv4-sp-d16\n    )\n  if (NOT DEFINED FREERTOS_PORT)\n    set(FREERTOS_PORT GCC_ARM_CM4F CACHE INTERNAL \"\")\n  endif ()\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m4\n    -mfpu=fpv4-sp-d16\n    )\n  if (NOT DEFINED FREERTOS_PORT)\n    set(FREERTOS_PORT GCC_ARM_CM4F CACHE INTERNAL \"\")\n  endif ()\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m4\n    --fpu VFPv4_sp\n    )\n\n  if (NOT DEFINED FREERTOS_PORT)\n    set(FREERTOS_PORT IAR_ARM_CM4F CACHE INTERNAL \"\")\n  endif ()\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m55.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m55\n    -mfloat-abi=hard\n    -mfpu=fpv5-d16\n    -mcmse\n    )\n  set(FREERTOS_PORT GCC_ARM_CM55_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m55\n    -mfpu=fpv5-d16\n    -mcmse\n    )\n  set(FREERTOS_PORT GCC_ARM_CM55_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m55\n    --fpu VFPv5_D16\n    --cmse\n    )\n  set(FREERTOS_PORT IAR_ARM_CM55_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m7-fpsp.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m7\n    -mfloat-abi=hard\n    -mfpu=fpv5-sp-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM7 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m7\n    -mfpu=fpv5-sp-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM7 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m7\n    --fpu VFPv5_sp\n    )\n  set(FREERTOS_PORT IAR_ARM_CM7 CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m7.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m7\n    -mfloat-abi=hard\n    -mfpu=fpv5-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM7 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m7\n    -mfpu=fpv5-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM7 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m7\n    --fpu VFPv5_D16\n    )\n  set(FREERTOS_PORT IAR_ARM_CM7 CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/cortex-m85.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mthumb\n    -mcpu=cortex-m85\n    -mfloat-abi=hard\n    -mfpu=fpv5-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM85_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --target=arm-none-eabi\n    -mcpu=cortex-m85\n    -mfpu=fpv5-d16\n    )\n  set(FREERTOS_PORT GCC_ARM_CM85_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    --cpu cortex-m85\n    --fpu VFPv5_D16\n    )\n  set(FREERTOS_PORT IAR_ARM_CM85_NTZ_NONSECURE CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/ft32.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -fvar-tracking\n    -fvar-tracking-assignments\n    )\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  message(FATAL_ERROR \"Clang is not supported for this target\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  message(FATAL_ERROR \"IAR is not supported for this target\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/msp430.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(FREERTOS_PORT GCC_MSP430F449 CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  message(FATAL_ERROR \"Clang is not supported for this target\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(FREERTOS_PORT IAR_MSP430 CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/rv32i-ilp32.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -march=rv32i_zicsr\n    -mabi=ilp32\n    )\n  set(FREERTOS_PORT GCC_RISC_V CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -march=rv32i_zicsr\n    -mabi=ilp32\n    )\n  set(FREERTOS_PORT GCC_RISC_V CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  message(FATAL_ERROR \"IAR not supported\")\n  set(FREERTOS_PORT IAR_RISC_V CACHE INTERNAL \"\")\n\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/rv32imac-ilp32.cmake",
    "content": "if (TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -march=rv32imac_zicsr_zifencei\n    -mabi=ilp32\n    )\n  set(FREERTOS_PORT GCC_RISC_V CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"clang\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -march=rv32imac_zicsr_zifencei\n    -mabi=ilp32\n    )\n  set(FREERTOS_PORT GCC_RISC_V CACHE INTERNAL \"\")\n\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  message(FATAL_ERROR \"IAR not supported\")\n  set(FREERTOS_PORT IAR_RISC_V CACHE INTERNAL \"\")\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/rx610.cmake",
    "content": "if (NOT DEFINED TOOLCHAIN OR TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mcpu=rx610\n    -misa=v1\n    -mlittle-endian-data\n    -fshort-enums\n    )\n  set(FREERTOS_PORT GCC_RX600 CACHE INTERNAL \"\")\n\nelse ()\n  message(FATAL_ERROR \"Toolchain ${TOOLCHAIN} is not supported for RX\")\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/cpu/rx64m.cmake",
    "content": "if (NOT DEFINED TOOLCHAIN OR TOOLCHAIN STREQUAL \"gcc\")\n  set(TOOLCHAIN_COMMON_FLAGS\n    -mcpu=rx64m\n    -misa=v2\n    -mlittle-endian-data\n    -fshort-enums\n    )\n  set(FREERTOS_PORT GCC_RX600 CACHE INTERNAL \"\")\n\nelse ()\n  message(FATAL_ERROR \"Toolchain ${TOOLCHAIN} is not supported for RX\")\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/aarch64_gcc.cmake",
    "content": "if (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER \"aarch64-none-elf-gcc\")\nendif ()\n\nif (NOT DEFINED CMAKE_CXX_COMPILER)\n  set(CMAKE_CXX_COMPILER \"aarch64-none-elf-g++\")\nendif ()\n\nset(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})\nfind_program(CMAKE_SIZE aarch64-none-elf-size)\nfind_program(CMAKE_OBJCOPY aarch64-none-elf-objcopy)\nfind_program(CMAKE_OBJDUMP aarch64-none-elf-objdump)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/common.cmake)\n\nget_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)\nif (IS_IN_TRY_COMPILE)\n  set(CMAKE_C_LINK_FLAGS \"${CMAKE_C_LINK_FLAGS} -nostdlib\")\n  set(CMAKE_CXX_LINK_FLAGS \"${CMAKE_CXX_LINK_FLAGS} -nostdlib\")\n  cmake_print_variables(CMAKE_C_LINK_FLAGS)\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/arm_clang.cmake",
    "content": "if (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER \"clang\")\nendif ()\n\nif (NOT DEFINED CMAKE_CXX_COMPILER)\n  set(CMAKE_CXX_COMPILER \"clang++\")\nendif ()\n\nset(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})\n\nfind_program(CMAKE_SIZE llvm-size)\nfind_program(CMAKE_OBJCOPY llvm-objcopy)\nfind_program(CMAKE_OBJDUMP llvm-objdump)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/common.cmake)\n\nget_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)\nif (IS_IN_TRY_COMPILE)\n  set(CMAKE_C_LINK_FLAGS \"${CMAKE_C_LINK_FLAGS} -nostdlib\")\n  set(CMAKE_CXX_LINK_FLAGS \"${CMAKE_CXX_LINK_FLAGS} -nostdlib\")\n  cmake_print_variables(CMAKE_C_LINK_FLAGS)\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/arm_gcc.cmake",
    "content": "if (RTOS STREQUAL zephyr)\n  return()\nendif ()\n\nif (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER \"arm-none-eabi-gcc\")\nendif ()\n\nif (NOT DEFINED CMAKE_CXX_COMPILER)\n  set(CMAKE_CXX_COMPILER \"arm-none-eabi-g++\")\nendif ()\n\nset(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})\nfind_program(CMAKE_SIZE arm-none-eabi-size)\nfind_program(CMAKE_OBJCOPY arm-none-eabi-objcopy)\nfind_program(CMAKE_OBJDUMP arm-none-eabi-objdump)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/common.cmake)\n\nget_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)\nif (IS_IN_TRY_COMPILE)\n  set(CMAKE_C_LINK_FLAGS \"${CMAKE_C_LINK_FLAGS} -nostdlib\")\n  set(CMAKE_CXX_LINK_FLAGS \"${CMAKE_CXX_LINK_FLAGS} -nostdlib\")\n  cmake_print_variables(CMAKE_C_LINK_FLAGS)\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/arm_iar.cmake",
    "content": "if (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER \"iccarm\")\nendif()\n\nif (NOT DEFINED CMAKE_CXX_COMPILER)\n  set(CMAKE_CXX_COMPILER \"iccarm\")\nendif()\n\nif (NOT DEFINED CMAKE_ASM_COMPILER)\n  set(CMAKE_ASM_COMPILER \"iasmarm\")\nendif()\n\nfind_program(CMAKE_SIZE size)\nfind_program(CMAKE_OBJCOPY ielftool)\nfind_program(CMAKE_OBJDUMP iefdumparm)\n\nfind_program(CMAKE_IAR_CSTAT icstat)\nfind_program(CMAKE_IAR_CHECKS ichecks)\nfind_program(CMAKE_IAR_REPORT ireport)\n\nif (IAR_CSTAT)\ncmake_minimum_required(VERSION 4.1)\nset(CMAKE_C_ICSTAT ${CMAKE_IAR_CSTAT}\n  --checks=${CMAKE_CURRENT_LIST_DIR}/cstat_sel_checks.txt\n  --db=${CMAKE_BINARY_DIR}/cstat.db\n  --sarif_dir=${CMAKE_BINARY_DIR}/cstat_sarif\n  --exclude=${TOP}/hw/mcu\n  --exclude=${TOP}/lib\n  )\nendif ()\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/common.cmake)\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/common.cmake",
    "content": "include(CMakePrintHelpers)\n\n# ----------------------------------------------------------------------------\n# Common\n# ----------------------------------------------------------------------------\nset(CMAKE_SYSTEM_NAME Generic)\nset(CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_CPU})\nset_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)\n\n# Look for includes and libraries only in the target system prefix.\nset(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)\nset(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)\n\n# pass TOOLCHAIN_CPU to\nset(CMAKE_TRY_COMPILE_PLATFORM_VARIABLES CMAKE_SYSTEM_PROCESSOR CMAKE_SYSTEM_CPU)\ninclude(${CMAKE_CURRENT_LIST_DIR}/../cpu/${CMAKE_SYSTEM_CPU}.cmake)\n\n# ----------------------------------------------------------------------------\n# Compile flags\n# ----------------------------------------------------------------------------\nset(TOOLCHAIN_C_FLAGS)\nset(TOOLCHAIN_ASM_FLAGS)\nset(TOOLCHAIN_EXE_LINKER_FLAGS)\n\nif (TOOLCHAIN STREQUAL \"gcc\" OR TOOLCHAIN STREQUAL \"clang\")\n  list(APPEND TOOLCHAIN_COMMON_FLAGS\n    -fdata-sections\n    -ffunction-sections\n#    -fsingle-precision-constant # not supported by clang\n    -fno-strict-aliasing\n    -g # include debug info for bloaty\n    )\n  set(TOOLCHAIN_EXE_LINKER_FLAGS \"-Wl,--print-memory-usage -Wl,--gc-sections -Wl,--cref\")\n\n  if (TOOLCHAIN STREQUAL clang)\n    set(TOOLCHAIN_ASM_FLAGS \"-x assembler-with-cpp\")\n  endif ()\nelseif (TOOLCHAIN STREQUAL \"iar\")\n  set(TOOLCHAIN_C_FLAGS --debug)\n  set(TOOLCHAIN_EXE_LINKER_FLAGS --diag_suppress=Li065)\nendif ()\n\n# join the toolchain flags into a single string\nlist(JOIN TOOLCHAIN_COMMON_FLAGS \" \" TOOLCHAIN_COMMON_FLAGS)\n\nset(CMAKE_C_FLAGS_INIT \"${TOOLCHAIN_COMMON_FLAGS} ${TOOLCHAIN_C_FLAGS}\")\nset(CMAKE_CXX_FLAGS_INIT \"${TOOLCHAIN_COMMON_FLAGS} ${TOOLCHAIN_C_FLAGS}\")\nset(CMAKE_ASM_FLAGS_INIT \"${TOOLCHAIN_COMMON_FLAGS} ${TOOLCHAIN_ASM_FLAGS}\")\nset(CMAKE_EXE_LINKER_FLAGS_INIT ${TOOLCHAIN_EXE_LINKER_FLAGS})\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/cstat_sel_checks.txt",
    "content": "# IAR C-STAT Checks Manifest Handler V2.7.5.562\n#\nMISRAC2012-Dir-4.3\nMISRAC2012-Dir-4.7_c\nMISRAC2012-Dir-4.10\nMISRAC2012-Dir-4.11_a\nMISRAC2012-Dir-4.11_b\nMISRAC2012-Dir-4.11_c\nMISRAC2012-Dir-4.11_d\nMISRAC2012-Dir-4.11_e\nMISRAC2012-Dir-4.11_f\nMISRAC2012-Dir-4.11_g\nMISRAC2012-Dir-4.11_h\nMISRAC2012-Dir-4.11_i\nMISRAC2012-Dir-4.12\nMISRAC2012-Dir-4.14_a\nMISRAC2012-Dir-4.14_b\nMISRAC2012-Dir-4.14_c\nMISRAC2012-Dir-4.14_d\nMISRAC2012-Dir-4.14_e\nMISRAC2012-Dir-4.14_f\nMISRAC2012-Dir-4.14_g\nMISRAC2012-Dir-4.14_h\nMISRAC2012-Dir-4.14_i\nMISRAC2012-Dir-4.14_j\nMISRAC2012-Dir-4.14_l\nMISRAC2012-Dir-4.14_m\nMISRAC2012-Dir-4.15\nMISRAC2012-Rule-1.3_a\nMISRAC2012-Rule-1.3_b\nMISRAC2012-Rule-1.3_c\nMISRAC2012-Rule-1.3_d\nMISRAC2012-Rule-1.3_e\nMISRAC2012-Rule-1.3_f\nMISRAC2012-Rule-1.3_g\nMISRAC2012-Rule-1.3_h\nMISRAC2012-Rule-1.3_i\nMISRAC2012-Rule-1.3_j\nMISRAC2012-Rule-1.3_k\nMISRAC2012-Rule-1.3_l\nMISRAC2012-Rule-1.3_m\nMISRAC2012-Rule-1.3_n\nMISRAC2012-Rule-1.3_o\nMISRAC2012-Rule-1.3_p\nMISRAC2012-Rule-1.3_q\nMISRAC2012-Rule-1.3_r\nMISRAC2012-Rule-1.3_s\nMISRAC2012-Rule-1.3_t\nMISRAC2012-Rule-1.3_u\nMISRAC2012-Rule-1.3_v\nMISRAC2012-Rule-1.4\nMISRAC2012-Rule-1.5_b\nMISRAC2012-Rule-1.5_c\nMISRAC2012-Rule-1.5_d\nMISRAC2012-Rule-1.5_e\nMISRAC2012-Rule-1.5_f\nMISRAC2012-Rule-1.5_g\nMISRAC2012-Rule-2.1_a\nMISRAC2012-Rule-2.1_b\nMISRAC2012-Rule-2.2_a\nMISRAC2012-Rule-2.2_b\nMISRAC2012-Rule-2.2_c\nMISRAC2012-Rule-3.1\nMISRAC2012-Rule-3.2\nMISRAC2012-Rule-5.1\nMISRAC2012-Rule-5.2_c89\nMISRAC2012-Rule-5.2_c99\nMISRAC2012-Rule-5.3_c89\nMISRAC2012-Rule-5.3_c99\nMISRAC2012-Rule-5.4_c89\nMISRAC2012-Rule-5.4_c99\nMISRAC2012-Rule-5.5_c89\nMISRAC2012-Rule-5.5_c99\nMISRAC2012-Rule-5.6\nMISRAC2012-Rule-5.7\nMISRAC2012-Rule-5.8\nMISRAC2012-Rule-6.1\nMISRAC2012-Rule-6.2\nMISRAC2012-Rule-6.3\nMISRAC2012-Rule-7.1\nMISRAC2012-Rule-7.2\nMISRAC2012-Rule-7.3\nMISRAC2012-Rule-7.4_a\nMISRAC2012-Rule-7.4_b\nMISRAC2012-Rule-7.5\nMISRAC2012-Rule-7.6\nMISRAC2012-Rule-8.1\nMISRAC2012-Rule-8.2_a\nMISRAC2012-Rule-8.2_b\nMISRAC2012-Rule-8.3\nMISRAC2012-Rule-8.4\nMISRAC2012-Rule-8.5_a\nMISRAC2012-Rule-8.5_b\nMISRAC2012-Rule-8.10\nMISRAC2012-Rule-8.12\nMISRAC2012-Rule-8.14\nMISRAC2012-Rule-8.15\nMISRAC2012-Rule-9.1_a\nMISRAC2012-Rule-9.1_b\nMISRAC2012-Rule-9.1_d\nMISRAC2012-Rule-9.1_e\nMISRAC2012-Rule-9.2\nMISRAC2012-Rule-9.3\nMISRAC2012-Rule-9.4\nMISRAC2012-Rule-9.5_a\nMISRAC2012-Rule-9.5_b\nMISRAC2012-Rule-9.6\nMISRAC2012-Rule-9.7\nMISRAC2012-Rule-10.1_R2\nMISRAC2012-Rule-10.1_R3\nMISRAC2012-Rule-10.1_R4\nMISRAC2012-Rule-10.1_R5\nMISRAC2012-Rule-10.1_R6\nMISRAC2012-Rule-10.1_R7\nMISRAC2012-Rule-10.1_R8\nMISRAC2012-Rule-10.1_R10\nMISRAC2012-Rule-10.2\nMISRAC2012-Rule-10.3\nMISRAC2012-Rule-10.4_a\nMISRAC2012-Rule-10.4_b\nMISRAC2012-Rule-10.6\nMISRAC2012-Rule-10.7\nMISRAC2012-Rule-10.8\nMISRAC2012-Rule-11.1\nMISRAC2012-Rule-11.2\nMISRAC2012-Rule-11.3\nMISRAC2012-Rule-11.6\nMISRAC2012-Rule-11.7\nMISRAC2012-Rule-11.8\nMISRAC2012-Rule-11.9\nMISRAC2012-Rule-11.10\nMISRAC2012-Rule-12.2\nMISRAC2012-Rule-12.5\nMISRAC2012-Rule-12.6\nMISRAC2012-Rule-13.1\nMISRAC2012-Rule-13.2_a\nMISRAC2012-Rule-13.2_b\nMISRAC2012-Rule-13.2_c\nMISRAC2012-Rule-13.5\nMISRAC2012-Rule-13.6\nMISRAC2012-Rule-14.1_a\nMISRAC2012-Rule-14.1_b\nMISRAC2012-Rule-14.2\nMISRAC2012-Rule-14.3_a\nMISRAC2012-Rule-14.3_b\nMISRAC2012-Rule-14.4_a\nMISRAC2012-Rule-14.4_b\nMISRAC2012-Rule-14.4_c\nMISRAC2012-Rule-14.4_d\nMISRAC2012-Rule-15.2\nMISRAC2012-Rule-15.3\nMISRAC2012-Rule-15.6_a\nMISRAC2012-Rule-15.6_b\nMISRAC2012-Rule-15.6_c\nMISRAC2012-Rule-15.6_d\nMISRAC2012-Rule-15.6_e\nMISRAC2012-Rule-15.7\nMISRAC2012-Rule-16.1\nMISRAC2012-Rule-16.2\nMISRAC2012-Rule-16.3\nMISRAC2012-Rule-16.4\nMISRAC2012-Rule-16.5\nMISRAC2012-Rule-16.6\nMISRAC2012-Rule-16.7\nMISRAC2012-Rule-17.1\nMISRAC2012-Rule-17.2_a\nMISRAC2012-Rule-17.2_b\nMISRAC2012-Rule-17.3\nMISRAC2012-Rule-17.4\nMISRAC2012-Rule-17.5\nMISRAC2012-Rule-17.6\nMISRAC2012-Rule-17.7\nMISRAC2012-Rule-17.13\nMISRAC2012-Rule-18.1_a\nMISRAC2012-Rule-18.1_b\nMISRAC2012-Rule-18.1_c\nMISRAC2012-Rule-18.1_d\nMISRAC2012-Rule-18.2\nMISRAC2012-Rule-18.3\nMISRAC2012-Rule-18.4\nMISRAC2012-Rule-18.6_a\nMISRAC2012-Rule-18.6_b\nMISRAC2012-Rule-18.6_c\nMISRAC2012-Rule-18.6_d\nMISRAC2012-Rule-18.7\nMISRAC2012-Rule-18.8\nMISRAC2012-Rule-18.9\nMISRAC2012-Rule-18.10\nMISRAC2012-Rule-19.1\nMISRAC2012-Rule-20.2\nMISRAC2012-Rule-20.4_c89\nMISRAC2012-Rule-20.4_c99\nMISRAC2012-Rule-20.6_a\nMISRAC2012-Rule-20.6_b\nMISRAC2012-Rule-20.7\nMISRAC2012-Rule-21.1\nMISRAC2012-Rule-21.2\nMISRAC2012-Rule-21.3\nMISRAC2012-Rule-21.4\nMISRAC2012-Rule-21.5\nMISRAC2012-Rule-21.6\nMISRAC2012-Rule-21.7\nMISRAC2012-Rule-21.8\nMISRAC2012-Rule-21.9\nMISRAC2012-Rule-21.10\nMISRAC2012-Rule-21.12_a\nMISRAC2012-Rule-21.12_b\nMISRAC2012-Rule-21.12_c\nMISRAC2012-Rule-21.13\nMISRAC2012-Rule-21.14\nMISRAC2012-Rule-21.15\nMISRAC2012-Rule-21.16\nMISRAC2012-Rule-21.17_a\nMISRAC2012-Rule-21.17_b\nMISRAC2012-Rule-21.17_c\nMISRAC2012-Rule-21.17_d\nMISRAC2012-Rule-21.17_e\nMISRAC2012-Rule-21.17_f\nMISRAC2012-Rule-21.18_a\nMISRAC2012-Rule-21.18_b\nMISRAC2012-Rule-21.19_a\nMISRAC2012-Rule-21.19_b\nMISRAC2012-Rule-21.20\nMISRAC2012-Rule-21.21\nMISRAC2012-Rule-21.22\nMISRAC2012-Rule-21.23\nMISRAC2012-Rule-21.24\nMISRAC2012-Rule-21.25\nMISRAC2012-Rule-22.1_a\nMISRAC2012-Rule-22.1_b\nMISRAC2012-Rule-22.2_a\nMISRAC2012-Rule-22.2_b\nMISRAC2012-Rule-22.2_c\nMISRAC2012-Rule-22.3\nMISRAC2012-Rule-22.4\nMISRAC2012-Rule-22.5_a\nMISRAC2012-Rule-22.5_b\nMISRAC2012-Rule-22.6\nMISRAC2012-Rule-22.7_a\nMISRAC2012-Rule-22.7_b\nMISRAC2012-Rule-22.8\nMISRAC2012-Rule-22.9\nMISRAC2012-Rule-22.10\nMISRAC2012-Rule-23.2\nMISRAC2012-Rule-23.4\nMISRAC2012-Rule-23.6\nMISRAC2012-Rule-23.8\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/ft32_gcc.cmake",
    "content": "if (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER \"ft32-elf-gcc\")\nendif ()\n\nif (NOT DEFINED CMAKE_CXX_COMPILER)\n  set(CMAKE_CXX_COMPILER \"ft32-elf-g++\")\nendif ()\n\nset(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})\n\nfind_program(CMAKE_SIZE ft32-elf-size)\nfind_program(CMAKE_OBJCOPY ft32-elf-objcopy)\nfind_program(CMAKE_OBJDUMP ft32-elf-objdump)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/common.cmake)\n\nget_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)\nif (IS_IN_TRY_COMPILE)\n  set(CMAKE_C_LINK_FLAGS \"${CMAKE_C_LINK_FLAGS} -nostdlib\")\n  set(CMAKE_CXX_LINK_FLAGS \"${CMAKE_CXX_LINK_FLAGS} -nostdlib\")\n  cmake_print_variables(CMAKE_C_LINK_FLAGS)\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/msp430_gcc.cmake",
    "content": "if (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER \"msp430-elf-gcc\")\nendif ()\n\nif (NOT DEFINED CMAKE_CXX_COMPILER)\n  set(CMAKE_CXX_COMPILER \"msp430-elf-g++\")\nendif ()\n\nset(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})\n\nfind_program(CMAKE_SIZE msp430-elf-size)\nfind_program(CMAKE_OBJCOPY msp430-elf-objcopy)\nfind_program(CMAKE_OBJDUMP msp430-elf-objdump)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/common.cmake)\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/riscv_gcc.cmake",
    "content": "# default Toolchain from https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack\nif (NOT DEFINED CROSS_COMPILE)\n  set(CROSS_COMPILE \"riscv-none-elf-\")\nendif ()\n\nif (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc)\nendif ()\n\nif (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc)\nendif ()\n\nif (NOT DEFINED CMAKE_CXX_COMPILER)\n  set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}g++)\nendif ()\n\nset(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})\nfind_program(CMAKE_SIZE ${CROSS_COMPILE}size)\nfind_program(CMAKE_OBJCOPY ${CROSS_COMPILE}objcopy)\nfind_program(CMAKE_OBJDUMP ${CROSS_COMPILE}objdump)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/common.cmake)\n\nget_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)\nif (IS_IN_TRY_COMPILE)\n  set(CMAKE_C_LINK_FLAGS \"${CMAKE_C_LINK_FLAGS} -nostdlib\")\n  set(CMAKE_CXX_LINK_FLAGS \"${CMAKE_CXX_LINK_FLAGS} -nostdlib\")\n  cmake_print_variables(CMAKE_C_LINK_FLAGS)\nendif ()\n"
  },
  {
    "path": "examples/build_system/cmake/toolchain/rx_gcc.cmake",
    "content": "# Cross Compiler for RX\nif (NOT DEFINED CROSS_COMPILE)\n  set(CROSS_COMPILE \"rx-elf-\")\nendif ()\n\nif (NOT DEFINED CMAKE_C_COMPILER)\n  set(CMAKE_C_COMPILER ${CROSS_COMPILE}gcc)\nendif ()\n\nif (NOT DEFINED CMAKE_CXX_COMPILER)\n  set(CMAKE_CXX_COMPILER ${CROSS_COMPILE}g++)\nendif ()\n\nset(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER})\nfind_program(CMAKE_SIZE ${CROSS_COMPILE}size)\nfind_program(CMAKE_OBJCOPY ${CROSS_COMPILE}objcopy)\nfind_program(CMAKE_OBJDUMP ${CROSS_COMPILE}objdump)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/common.cmake)\n\nget_property(IS_IN_TRY_COMPILE GLOBAL PROPERTY IN_TRY_COMPILE)\nif (IS_IN_TRY_COMPILE)\n  set(CMAKE_C_LINK_FLAGS \"${CMAKE_C_LINK_FLAGS} -nostdlib\")\n  set(CMAKE_CXX_LINK_FLAGS \"${CMAKE_CXX_LINK_FLAGS} -nostdlib\")\n  cmake_print_variables(CMAKE_C_LINK_FLAGS)\nendif ()\n"
  },
  {
    "path": "examples/build_system/make/cpu/arm1176jzf-s.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mcpu=arm1176jzf-s \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n\t#CFLAGS += --cpu cortex-a53\n\t#ASFLAGS += --cpu cortex-a53\n\nendif\n"
  },
  {
    "path": "examples/build_system/make/cpu/arm926ej-s.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mcpu=arm926ej-s \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n\t#CFLAGS += --cpu cortex-a53\n\t#ASFLAGS += --cpu cortex-a53\n\nendif\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-a53.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mcpu=cortex-a53 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n\tCFLAGS += \\\n\t\t--cpu cortex-a53 \\\n\n\tASFLAGS += \\\n\t\t--cpu cortex-a53 \\\n\nendif\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-a72.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mcpu=cortex-a72 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n\tCFLAGS += \\\n\t\t--cpu cortex-a72 \\\n\n\tASFLAGS += \\\n\t\t--cpu cortex-a72 \\\n\nendif\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m0.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m0 \\\n    -mfloat-abi=soft \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m0 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  # IAR Flags\n  CFLAGS += --cpu cortex-m0\n  ASFLAGS += --cpu cortex-m0\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM0\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m0plus.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m0plus \\\n    -mfloat-abi=soft \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m0plus \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  # IAR Flags\n  CFLAGS += --cpu cortex-m0+\n  ASFLAGS += --cpu cortex-m0+\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM0\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m23.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m23 \\\n    -mfloat-abi=soft \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m23 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  # IAR Flags\n  CFLAGS += --cpu cortex-m23\n  ASFLAGS += --cpu cortex-m23\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM23\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m3.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m3 \\\n    -mfloat-abi=soft \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m3 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  # IAR Flags\n  CFLAGS += --cpu cortex-m3\n  ASFLAGS += --cpu cortex-m3\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM3\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m33-nodsp-nofp.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n\t-mthumb \\\n\t-mcpu=cortex-m33+nodsp \\\n\t-mfloat-abi=soft \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m33 \\\n\t  -mfpu=softvp \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  CFLAGS += \\\n\t\t--cpu cortex-m33+nodsp \\\n\n  ASFLAGS += \\\n\t\t--cpu cortex-m33+nodsp \\\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM33_NTZ/non_secure\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m33.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m33 \\\n    -mfloat-abi=hard \\\n    -mfpu=fpv5-sp-d16 \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m33 \\\n\t  -mfpu=fpv5-sp-d16 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  CFLAGS += \\\n\t\t--cpu cortex-m33 \\\n\t\t--fpu VFPv5-SP \\\n\n  ASFLAGS += \\\n\t\t--cpu cortex-m33 \\\n\t\t--fpu VFPv5-SP \\\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM33_NTZ/non_secure\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m4-nofpu.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m4 \\\n    -mfloat-abi=soft\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m4\n\nelse ifeq ($(TOOLCHAIN),iar)\n  CFLAGS += --cpu cortex-m4 --fpu none\n  ASFLAGS += --cpu cortex-m4 --fpu none\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM3\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m4.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m4 \\\n    -mfloat-abi=hard \\\n    -mfpu=fpv4-sp-d16 \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m4 \\\n\t  -mfpu=fpv4-sp-d16 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  CFLAGS += --cpu cortex-m4 --fpu VFPv4-SP\n  ASFLAGS += --cpu cortex-m4 --fpu VFPv4-SP\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM4F\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m55.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m55 \\\n    -mfloat-abi=hard \\\n    -mfpu=fpv5-d16 \\\n    -mcmse\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m55 \\\n\t  -mfpu=fpv5-d16 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  CFLAGS += \\\n  \t--cpu cortex-m55 \\\n  \t--fpu VFPv5_D16 \\\n\n  ASFLAGS += \\\n\t\t--cpu cortex-m55 \\\n\t\t--fpu VFPv5_D16 \\\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM55_NTZ/non_secure\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m7-fpsp.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m7 \\\n    -mfloat-abi=hard \\\n    -mfpu=fpv5-sp-d16 \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m7 \\\n\t  -mfpu=fpv5-sp-d16 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  CFLAGS += \\\n  \t--cpu cortex-m7 \\\n  \t--fpu VFPv5_sp \\\n\n  ASFLAGS += \\\n\t\t--cpu cortex-m7 \\\n\t\t--fpu VFPv5_sp \\\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM7/r0p1\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m7.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m7 \\\n    -mfloat-abi=hard \\\n    -mfpu=fpv5-d16 \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m7 \\\n\t  -mfpu=fpv5-d16 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  CFLAGS += \\\n  \t--cpu cortex-m7 \\\n  \t--fpu VFPv5_D16 \\\n\n  ASFLAGS += \\\n\t\t--cpu cortex-m7 \\\n\t\t--fpu VFPv5_D16 \\\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM7/r0p1\n"
  },
  {
    "path": "examples/build_system/make/cpu/cortex-m85.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -mthumb \\\n    -mcpu=cortex-m85 \\\n    -mfloat-abi=hard \\\n    -mfpu=fpv5-d16 \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n\t  --target=arm-none-eabi \\\n\t  -mcpu=cortex-m85 \\\n\t  -mfpu=fpv5-d16 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  CFLAGS += \\\n  \t--cpu cortex-m85 \\\n  \t--fpu VFPv5_D16 \\\n\n  ASFLAGS += \\\n\t\t--cpu cortex-m85 \\\n\t\t--fpu VFPv5_D16 \\\n\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/ARM_CM85_NTZ/non_secure\n"
  },
  {
    "path": "examples/build_system/make/cpu/msp430.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  # nothing to add\nelse ifeq ($(TOOLCHAIN),clang)\n  # nothing to add\nelse ifeq ($(TOOLCHAIN),iar)\n  # nothing to add\nelse\n  $(error \"TOOLCHAIN is not supported\")\nendif\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC ?= $(FREERTOS_PORTABLE_PATH)/GCC_MSP430F449\n"
  },
  {
    "path": "examples/build_system/make/cpu/rv32i-ilp32.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -march=rv32i_zicsr \\\n    -mabi=ilp32 \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n    -march=rv32i_zicsr \\\n    -mabi=ilp32 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  $(error not support)\nendif\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RISC-V\n"
  },
  {
    "path": "examples/build_system/make/cpu/rv32imac-ilp32.mk",
    "content": "ifeq ($(TOOLCHAIN),gcc)\n  CFLAGS += \\\n    -march=rv32imac_zicsr_zifencei \\\n    -mabi=ilp32 \\\n\nelse ifeq ($(TOOLCHAIN),clang)\n  CFLAGS += \\\n    -march=rv32imac_zicsr_zifencei \\\n    -mabi=ilp32 \\\n\nelse ifeq ($(TOOLCHAIN),iar)\n  $(error not support)\n\nendif\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RISC-V\n"
  },
  {
    "path": "examples/build_system/make/toolchain/arm_clang.mk",
    "content": "CC = clang\nCXX = clang++\nAS = $(CC) -x assembler-with-cpp\nLD = $(CC)\n\nGDB = $(CROSS_COMPILE)gdb\nOBJCOPY = llvm-objcopy\nSIZE = llvm-size\n\ninclude ${TOP}/examples/build_system/make/toolchain/gcc_common.mk\n"
  },
  {
    "path": "examples/build_system/make/toolchain/arm_gcc.mk",
    "content": "# makefile for arm gcc toolchain\n\n# Can be set by family, default to ARM GCC\nCROSS_COMPILE ?= arm-none-eabi-\n\nCC = $(CROSS_COMPILE)gcc\nCXX = $(CROSS_COMPILE)g++\nAS = $(CC) -x assembler-with-cpp\nLD = $(CC)\n\nGDB = $(CROSS_COMPILE)gdb\nOBJCOPY = $(CROSS_COMPILE)objcopy\nSIZE = $(CROSS_COMPILE)size\n\nCFLAGS += \\\n  -fsingle-precision-constant \\\n\nLIBS += -lgcc -lm -lnosys\n\ninclude ${TOP}/examples/build_system/make/toolchain/gcc_common.mk\n"
  },
  {
    "path": "examples/build_system/make/toolchain/arm_iar.mk",
    "content": "# makefile for arm iar toolchain\n\nCC = iccarm\nAS = iasmarm\nLD = ilinkarm\nOBJCOPY = ielftool --silent\nSIZE = size\n\n# Enable extension mode (gcc compatible)\nCFLAGS += -e --debug --silent\n\n# silent mode\nASFLAGS += -S $(addprefix -I,$(INC))\n"
  },
  {
    "path": "examples/build_system/make/toolchain/clang_rules.mk",
    "content": "include ${TOP}/examples/build_system/make/toolchain/gcc_rules.mk\n"
  },
  {
    "path": "examples/build_system/make/toolchain/gcc_common.mk",
    "content": "# ---------------------------------------\n# Compiler Flags\n# ---------------------------------------\nCFLAGS += \\\n  -MD \\\n  -ggdb \\\n  -fdata-sections \\\n  -ffunction-sections \\\n  -fno-strict-aliasing \\\n  -Wall \\\n  -Wextra \\\n  -Werror \\\n  -Wfatal-errors \\\n  -Wdouble-promotion \\\n  -Wstrict-prototypes \\\n  -Wstrict-overflow \\\n  -Werror-implicit-function-declaration \\\n  -Wfloat-equal \\\n  -Wundef \\\n  -Wshadow \\\n  -Wwrite-strings \\\n  -Wsign-compare \\\n  -Wmissing-format-attribute \\\n  -Wunreachable-code \\\n  -Wcast-align \\\n  -Wcast-function-type \\\n  -Wcast-qual \\\n  -Wnull-dereference \\\n  -Wuninitialized \\\n  -Wunused \\\n  -Wreturn-type \\\n  -Wredundant-decls \\\n\nCFLAGS_CLANG += \\\n  -Wno-error=unknown-warning-option\n\n#  -Wmissing-prototypes \\\n# conversion is too strict for most mcu driver, may be disable sign/int/arith-conversion\n#  -Wconversion\n\n# Size Optimization as default\nCFLAGS_OPTIMIZED ?= -Os\n\n# Debugging/Optimization\nifeq ($(DEBUG), 1)\n  CFLAGS += -O0\n  NO_LTO = 1\nelse\n  CFLAGS += $(CFLAGS_OPTIMIZED)\nendif\n\n# ---------------------------------------\n# Linker Flags\n# ---------------------------------------\nLDFLAGS += \\\n  -Wl,-Map=$@.map \\\n  -Wl,--cref \\\n  -Wl,-gc-sections \\\n\n# renesas rx does not support --print-memory-usage flags\nifneq ($(FAMILY),rx)\nLDFLAGS += -Wl,--print-memory-usage\nendif\n\nifeq ($(TOOLCHAIN),gcc)\nCC_VERSION := $(shell $(CC) -dumpversion)\nCC_VERSION_MAJOR = $(firstword $(subst ., ,$(CC_VERSION)))\n\n# from version 12\nifeq ($(strip $(if $(CMDEXE),\\\n               $(shell if $(CC_VERSION_MAJOR) geq 12 (echo 1) else (echo 0)),\\\n               $(shell expr $(CC_VERSION_MAJOR) \\>= 12))), 1)\nLDFLAGS += -Wl,--no-warn-rwx-segment\nendif\nendif\n"
  },
  {
    "path": "examples/build_system/make/toolchain/gcc_rules.mk",
    "content": "SRC_S += $(SRC_S_GCC)\n\n# Assembly files can be name with upper case .S, convert it to .s\nSRC_S := $(SRC_S:.S=.s)\n\n# Due to GCC LTO bug https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966\n# assembly file should be placed first in linking order\n# '_asm' suffix is added to object of assembly file\nOBJ += $(addprefix $(BUILD)/obj/, $(SRC_S:.s=_asm.o))\nOBJ += $(addprefix $(BUILD)/obj/, $(SRC_C:.c=.o))\n\nCFLAGS += $(CFLAGS_GCC) -MD\n\n# LTO makes it difficult to analyze map file for optimizing size purpose\n# We will run this option in ci\nifeq ($(NO_LTO),1)\nCFLAGS := $(filter-out -flto,$(CFLAGS))\nendif\n\nifneq ($(CFLAGS_SKIP),)\nCFLAGS := $(filter-out $(CFLAGS_SKIP),$(CFLAGS))\nendif\n\nifeq ($(TOOLCHAIN),clang)\nCFLAGS += $(CFLAGS_CLANG)\nLDFLAGS += $(CFLAGS) $(LDFLAGS_CLANG)\nelse\nLDFLAGS += $(CFLAGS) $(LDFLAGS_GCC)\nendif\n\n# TODO should be removed after all examples are updated\nifdef LD_FILE\nLDFLAGS += -Wl,-T,$(TOP)/$(LD_FILE)\nendif\n\nifdef LD_FILE_GCC\nLDFLAGS += -Wl,-T,$(TOP)/$(LD_FILE_GCC)\nendif\n\nASFLAGS += $(CFLAGS)\n\n# libc\nifneq ($(BOARD), spresense)\nLIBS += -lc\nendif\n\n# ---------------------------------------\n# Rules\n# ---------------------------------------\n\n# Compile .c file\n$(BUILD)/obj/%.o: %.c\n\t@echo CC $(notdir $@)\n\t@$(CC) $(CFLAGS) -c -o $@ $<\n\n# ASM sources lower case .s\n$(BUILD)/obj/%_asm.o: %.s\n\t@echo AS $(notdir $@)\n\t@$(AS) $(ASFLAGS) -c -o $@ $<\n\n# ASM sources upper case .S\n$(BUILD)/obj/%_asm.o: %.S\n\t@echo AS $(notdir $@)\n\t@$(AS) $(ASFLAGS) -c -o $@ $<\n\nOBJCOPY_BIN_OPTION ?=\n$(BUILD)/$(PROJECT).bin: $(BUILD)/$(PROJECT).elf\n\t@echo CREATE $@\n\t$(OBJCOPY) -O binary $(OBJCOPY_BIN_OPTION) $^ $@\n\n$(BUILD)/$(PROJECT).hex: $(BUILD)/$(PROJECT).elf\n\t@echo CREATE $@\n\t@$(OBJCOPY) -O ihex $^ $@\n\n$(BUILD)/$(PROJECT).elf: $(OBJ)\n\t@echo LINK $@\n\t@$(LD) -o $@ $(LDFLAGS) $^ -Wl,--start-group $(LIBS) -Wl,--end-group\n"
  },
  {
    "path": "examples/build_system/make/toolchain/iar_rules.mk",
    "content": "SRC_S += $(SRC_S_IAR)\n\n# Assembly files can be name with upper case .S, convert it to .s\nSRC_S := $(SRC_S:.S=.s)\n\n# Due to GCC LTO bug https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966\n# assembly file should be placed first in linking order\n# '_asm' suffix is added to object of assembly file\nOBJ += $(addprefix $(BUILD)/obj/, $(SRC_S:.s=_asm.o))\nOBJ += $(addprefix $(BUILD)/obj/, $(SRC_C:.c=.o))\n\n# Linker script\nLDFLAGS += --config $(TOP)/$(LD_FILE_IAR)\n\n# ---------------------------------------\n# Rules\n# ---------------------------------------\n\n# Compile .c file\n$(BUILD)/obj/%.o: %.c\n\t@echo CC $(notdir $@)\n\t@$(CC) $(CFLAGS) -c -o $@ $<\n\n# ASM sources lower case .s\n$(BUILD)/obj/%_asm.o: %.s\n\t@echo AS $(notdir $@)\n\t@$(AS) $(ASFLAGS) -c -o $@ $<\n\n# ASM sources upper case .S\n$(BUILD)/obj/%_asm.o: %.S\n\t@echo AS $(notdir $@)\n\t@$(AS) $(ASFLAGS) -c -o $@ $<\n\n$(BUILD)/$(PROJECT).bin: $(BUILD)/$(PROJECT).elf\n\t@echo CREATE $@\n\t@$(OBJCOPY) --bin $^ $@\n\n$(BUILD)/$(PROJECT).hex: $(BUILD)/$(PROJECT).elf\n\t@echo CREATE $@\n\t@$(OBJCOPY) --ihex $^ $@\n\n$(BUILD)/$(PROJECT).elf: $(OBJ)\n\t@echo LINK $@\n\t@$(LD) -o $@ $(LDFLAGS) $^\n"
  },
  {
    "path": "examples/build_system/make/toolchain/riscv_gcc.mk",
    "content": "# makefile for arm gcc toolchain\n\n# Can be set by family, default to ARM GCC\nCROSS_COMPILE ?= riscv-none-elf-\n\nCC = $(CROSS_COMPILE)gcc\nCXX = $(CROSS_COMPILE)g++\nAS = $(CC) -x assembler-with-cpp\nLD = $(CC)\n\nGDB = $(CROSS_COMPILE)gdb\nOBJCOPY = $(CROSS_COMPILE)objcopy\nSIZE = $(CROSS_COMPILE)size\n\nCFLAGS += \\\n  -fsingle-precision-constant \\\n\nLIBS += -lgcc -lm -lnosys\n\ninclude ${TOP}/examples/build_system/make/toolchain/gcc_common.mk\n"
  },
  {
    "path": "examples/device/99-tinyusb.rules",
    "content": "# Copy this file to the location of your distribution's udev rules, for example on Ubuntu:\n#   sudo cp 99-tinyusb.rules /etc/udev/rules.d/\n# Then reload udev configuration by executing:\n#   sudo udevadm control --reload-rules\n#   sudo udevadm trigger\n\n# Check SUBSYSTEM\nSUBSYSTEMS==\"hidraw\", KERNEL==\"hidraw*\", MODE=\"0666\", GROUP=\"dialout\"\n\n# Rule applies to all TinyUSB example\nATTRS{idVendor}==\"cafe\", MODE=\"0666\", GROUP=\"dialout\"\n\n# Rule to blacklist TinyUSB example from being manipulated by ModemManager.\nSUBSYSTEMS==\"usb\", ATTRS{idVendor}==\"cafe\", ENV{ID_MM_DEVICE_IGNORE}=\"1\"\n\n# Xplained Pro SamG55 Device\nSUBSYSTEMS==\"usb\", ATTRS{idVendor}==\"03eb\", ATTRS{idProduct}==\"2111\", MODE=\"0666\", GROUP=\"users\", ENV{ID_MM_DEVICE_IGNORE}=\"1\"\nSUBSYSTEMS==\"tty\", ATTRS{idVendor}==\"03eb\", ATTRS{idProduct}==\"2111\", MODE=\"0666\", GROUP=\"users\", ENV{ID_MM_DEVICE_IGNORE}=\"1\"\n\n# TI Stellaris/Tiva-C Launchpad ICDI\nSUBSYSTEM==\"usb\", ATTRS{idVendor}==\"1cbe\", ATTRS{idProduct}==\"00fd\", MODE=\"0666\"\n"
  },
  {
    "path": "examples/device/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../hw/bsp/family_support.cmake)\n\nproject(tinyusb_device_examples C CXX ASM)\nfamily_initialize_project(tinyusb_device_examples ${CMAKE_CURRENT_LIST_DIR})\n\n# family_add_subdirectory will filter what to actually add based on selected FAMILY\nset(EXAMPLE_LIST\n  audio_4_channel_mic\n  audio_4_channel_mic_freertos\n  audio_test\n  audio_test_freertos\n  audio_test_multi_rate\n  board_test\n  cdc_dual_ports\n  cdc_msc\n  cdc_msc_freertos\n  cdc_uac2\n  dfu\n  dfu_runtime\n  dynamic_configuration\n  hid_boot_interface\n  hid_composite\n  hid_composite_freertos\n  hid_generic_inout\n  hid_multiple_interface\n  midi_test\n  midi_test_freertos\n  msc_dual_lun\n  mtp\n  net_lwip_webserver\n  printer_to_cdc\n  uac2_headset\n  uac2_speaker_fb\n  usbtmc\n  video_capture\n  video_capture_2ch\n  webusb_serial\n  )\n\nforeach (example ${EXAMPLE_LIST})\n  family_add_subdirectory(${example})\nendforeach ()\n"
  },
  {
    "path": "examples/device/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(audio_4_channel_mic C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Add libm for GCC\nif (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n  target_link_libraries(${PROJECT_NAME} PUBLIC m)\nendif()\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n  src/main.c \\\n  src/usb_descriptors.c \\\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic/skip.txt",
    "content": "mcu:SAMD11\nmcu:SAME5X\nmcu:SAMG\nfamily:broadcom_64bit\nfamily:espressif\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Reinhard Panhuber\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* plot_audio_samples.py requires following modules:\n * $ sudo apt install libportaudio\n * $ pip3 install sounddevice matplotlib\n *\n * Then run\n * $ python3 plot_audio_samples.py\n */\n\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"tusb_config.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n#define AUDIO_SAMPLE_RATE CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Audio controls\n// Current states\nbool mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];      // +1 for master channel 0\nuint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// +1 for master channel 0\nuint32_t sampFreq;\nuint8_t clkValid;\n\n// Range states\naudio20_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state\naudio20_control_range_4_n_t(1) sampleFreqRng;                                    // Sample frequency range state\n\n// Audio test data, 4 channels muxed together, buffer[0] for CH0, buffer[1] for CH1, buffer[2] for CH2, buffer[3] for CH3\nuint16_t i2s_dummy_buffer[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX * CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE / 1000];\n\nvoid led_blinking_task(void);\nvoid audio_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // Init values\n  sampFreq = AUDIO_SAMPLE_RATE;\n  clkValid = 1;\n\n  sampleFreqRng.wNumSubRanges = 1;\n  sampleFreqRng.subrange[0].bMin = AUDIO_SAMPLE_RATE;\n  sampleFreqRng.subrange[0].bMax = AUDIO_SAMPLE_RATE;\n  sampleFreqRng.subrange[0].bRes = 0;\n\n  // Generate dummy data\n  uint16_t *p_buff = i2s_dummy_buffer;\n  uint16_t dataVal = 0;\n  for (uint16_t cnt = 0; cnt < AUDIO_SAMPLE_RATE / 1000; cnt++) {\n    // CH0 saw wave\n    *p_buff++ = dataVal;\n    // CH1 inverted saw wave\n    *p_buff++ = 3200 + AUDIO_SAMPLE_RATE / 1000 - dataVal;\n    dataVal += 32;\n    // CH3 square wave\n    *p_buff++ = cnt < (AUDIO_SAMPLE_RATE / 1000 / 2) ? 3400 : 5000;\n    // CH4 sinus wave\n    float t = 2 * 3.1415f * cnt / (AUDIO_SAMPLE_RATE / 1000);\n    *p_buff++ = (uint16_t) ((int16_t) (sinf(t) * 750) + 6000);\n  }\n\n  while (1) {\n    tud_task();// tinyusb device task\n    led_blinking_task();\n    audio_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// AUDIO Task\n//--------------------------------------------------------------------+\n\n// This task simulates an audio receive callback, one frame is received every 1ms.\n// We assume that the audio data is read from an I2S buffer.\n// In a real application, this would be replaced with actual I2S receive callback.\nvoid audio_task(void) {\n  static uint32_t start_ms = 0;\n  uint32_t curr_ms = tusb_time_millis_api();\n  if (start_ms == curr_ms) {\n    return; // not enough time\n  }\n  start_ms = curr_ms;\n  tud_audio_write(i2s_dummy_buffer, AUDIO_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX);\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API Implementations\n//--------------------------------------------------------------------+\n\n// Invoked when audio class specific set request received for an EP\nbool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) ep;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an interface\nbool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) itf;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  (void) itf;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // If request is for our feature unit\n  if (entityID == 2) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Request uses format layout 1\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_1_t));\n\n        mute[channelNum] = ((audio20_control_cur_1_t *) pBuff)->bCur;\n\n        TU_LOG2(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n        return true;\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        // Request uses format layout 2\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_2_t));\n\n        volume[channelNum] = (uint16_t) ((audio20_control_cur_2_t *) pBuff)->bCur;\n\n        TU_LOG2(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n        return true;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an EP\nbool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) ep;\n\n  //\treturn tud_control_xfer(rhport, p_request, &tmp, 1);\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an interface\nbool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) itf;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  // uint8_t itf = TU_U16_LOW(p_request->wIndex); \t\t\t// Since we have only one audio function implemented, we do not need the itf value\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // Input terminal (Microphone input)\n  if (entityID == 1) {\n    switch (ctrlSel) {\n      case AUDIO20_TE_CTRL_CONNECTOR: {\n        // The terminal connector control only has a get request with only the CUR attribute.\n        audio20_desc_channel_cluster_t ret;\n\n        // Those are dummy values for now\n        ret.bNrChannels = 1;\n        ret.bmChannelConfig = (audio20_channel_config_t) 0;\n        ret.iChannelNames = 0;\n\n        TU_LOG2(\"    Get terminal connector\\r\\n\");\n\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n      } break;\n\n        // Unknown/Unsupported control selector\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Feature unit\n  if (entityID == 2) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Audio control mute cur parameter block consists of only one byte - we thus can send it right away\n        // There does not exist a range parameter block for mute\n        TU_LOG2(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n        return tud_control_xfer(rhport, p_request, &mute[channelNum], 1);\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG2(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n            return tud_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG2(\"    Get Volume range of channel: %u\\r\\n\", channelNum);\n\n            // Copy values - only for testing - better is version below\n            audio20_control_range_2_n_t(1) ret;\n\n            ret.wNumSubRanges = 1;\n            ret.subrange[0].bMin = -90;// -90 dB\n            ret.subrange[0].bMax = 90; // +90 dB\n            ret.subrange[0].bRes = 1;  // 1 dB steps\n\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Clock Source unit\n  if (entityID == 4) {\n    switch (ctrlSel) {\n      case AUDIO20_CS_CTRL_SAM_FREQ:\n        // channelNum is always zero in this case\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG2(\"    Get Sample Freq.\\r\\n\");\n            // Buffered control transfer is needed for IN flow control to work\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG2(\"    Get Sample Freq. range\\r\\n\");\n            return tud_control_xfer(rhport, p_request, &sampleFreqRng, sizeof(sampleFreqRng));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n      case AUDIO20_CS_CTRL_CLK_VALID:\n        // Only cur attribute exists for this request\n        TU_LOG2(\"    Get Sample Freq. valid\\r\\n\");\n        return tud_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));\n\n      // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  TU_LOG2(\"  Unsupported entity: %d\\r\\n\", entityID);\n  return false;// Yet not implemented\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;// toggle\n}\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic/src/plot_audio_samples.py",
    "content": "#!/usr/bin/env python3\nimport sounddevice as sd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport platform\n\nif __name__ == '__main__':\n\n    # If you got \"ValueError: No input device matching\", that is because your PC name example device\n    # differently from tested list below. Uncomment the next line to see full list and try to pick correct one\n    # print(sd.query_devices())\n\n    fs = 48000  \t\t# Sample rate\n    duration = 1   # Duration of recording\n\n    if platform.system() == 'Windows':\n        # WDM-KS is needed since there are more than one MicNode device APIs (at least in Windows)\n        device = 'Microphone (MicNode_4_Ch), Windows WASAPI'\n    elif platform.system() == 'Darwin':\n        device = 'MicNode_4_Ch'\n    else:\n        device ='default'\n\n    myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=4, dtype='int16', device=device)\n    print('Waiting...')\n    sd.wait()  # Wait until recording is finished\n    print('Done!')\n\n\n    time = np.arange(0, duration, 1 / fs)  # time vector\n    # strip starting zero\n\n    plt.plot(time, myrecording)\n    plt.xlabel('Time [s]')\n    plt.ylabel('Amplitude')\n    plt.title('MicNode 4 Channel')\n    plt.legend(['CH-1', 'CH-2', 'CH-3','CH-4'])\n    plt.show()\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS               OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG            0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED           1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED         BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_AUDIO             1\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n//--------------------------------------------------------------------\n// AUDIO CLASS DRIVER CONFIGURATION\n//--------------------------------------------------------------------\n\n// Have a look into audio_device.h for all configurations\n#define CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE              48000\n\n#define CFG_TUD_AUDIO_ENABLE_EP_IN                    1\n#define CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX    2         // This value is not required by the driver, it parses this information from the descriptor once the alternate interface is set by the host - we use it for the setup\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX            4         // This value is not required by the driver, it parses this information from the descriptor once the alternate interface is set by the host - we use it for the setup\n#define CFG_TUD_AUDIO_EP_SZ_IN                        TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n\n#define CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL              1\n\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX             CFG_TUD_AUDIO_EP_SZ_IN\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ          (TUD_OPT_HIGH_SPEED ? 32 : 4) * CFG_TUD_AUDIO_EP_SZ_IN // Example write FIFO every 1ms, so it should be 8 times larger for HS device\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VENDOR, 5) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for Audio\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum\n{\n  ITF_NUM_AUDIO_CONTROL = 0,\n  ITF_NUM_AUDIO_STREAMING,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO20_MIC_FOUR_CH_DESC_LEN)\n\n#if TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_AUDIO   0x03\n\n#elif TU_CHECK_MCU(OPT_MCU_NRF5X)\n  // nRF5x ISO can only be endpoint 8\n  #define EPNUM_AUDIO   0x08\n\n#else\n  #define EPNUM_AUDIO   0x01\n#endif\n\nuint8_t const desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_AUDIO20_MIC_FOUR_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, /*_nBitsUsedPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX*8, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO_EP_SZ_IN)\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const* string_desc_arr [] = {\n    (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n    \"PaniRCorp\",                   // 1: Manufacturer\n    \"MicNode_4_Ch\",                // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"UAC2\",                        // 4: Audio Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = (uint16_t) str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(audio_4_channel_mic_freertos C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Add libm for GCC\nif (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n  target_link_libraries(${PROJECT_NAME} PUBLIC m)\nendif()\n\n# Configure compilation flags and libraries for the example with FreeRTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} freertos)\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/Makefile",
    "content": "RTOS = freertos\ninclude ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE = \\\n\tsrc/main.c \\\n\tsrc/usb_descriptors.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/README.md",
    "content": "# How to build example for Esp32s3\n1. Load idf environment variables (eg. using the esp-idf alias `get_idf` if configured)\n\n2. cd into examples directory\n```\n$ cd /tinyusb/examples/device/audio_4_channel_mic_freertos\n```\n\n3. Run cmake in project directory specifying the board\n```\n$ cmake -DBOARD=espressif_s3_devkitc -B build -G Ninja .\n$ ninja.exe -C build\n```\n\n4. Flash the binary onto the esp32-s3 by copy-paste of the full command output by the esp-idf build system replacing **(PORT)** with eg. /dev/ttyUSB0\n\neg.\n\n> /home/kaspernyhus/.espressif/python_env/idf4.4_py3.8_env/bin/python ../../../../esp-idf/components/esptool_py/esptool/esptool.py -p /dev/ttyUSB0 -b 460800 --before default_reset --after hard_reset --chip esp32s3  write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 _build/espressif_s3_devkitc/bootloader/bootloader.bin 0x8000 _build/espressif_s3_devkitc/partition_table/partition-table.bin 0x10000 _build/espressif_s3_devkitc/audio_4_channel_mic_freertos.bin\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/sdkconfig.defaults",
    "content": "CONFIG_IDF_CMAKE=y\nCONFIG_FREERTOS_HZ=1000\nCONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y\nCONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/skip.txt",
    "content": "mcu:CH32F20X\nmcu:CH32V103\nmcu:CH32V20X\nmcu:CH32V307\nmcu:CXD56\nmcu:F1C100S\nmcu:GD32VF103\nmcu:MCXA15\nmcu:MKL25ZXX\nmcu:MSP430x5xx\nmcu:FT90X\nmcu:RP2040\nmcu:SAMD11\nmcu:VALENTYUSB_EPTRI\nmcu:RAXXX\nmcu:STM32L0\nboard:lpcxpresso11u37\nboard:lpcxpresso1347\nfamily:broadcom_32bit\nfamily:broadcom_64bit\nfamily:nuc121_125\nfamily:hpmicro\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\" \"usb_descriptors.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Reinhard Panhuber\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* plot_audio_samples.py requires following modules:\n * $ sudo apt install libportaudio\n * $ pip3 install sounddevice matplotlib\n *\n * Then run\n * $ python3 plot_audio_samples.py\n */\n\n#include <math.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#ifdef ESP_PLATFORM\n  // ESP-IDF need \"freertos/\" prefix in include path.\n  // CFG_TUSB_OS_INC_PATH should be defined accordingly.\n  #include \"freertos/FreeRTOS.h\"\n  #include \"freertos/queue.h\"\n  #include \"freertos/semphr.h\"\n  #include \"freertos/task.h\"\n  #include \"freertos/timers.h\"\n\n  #define USBD_STACK_SIZE 4096\n#else\n\n  #include \"FreeRTOS.h\"\n  #include \"queue.h\"\n  #include \"semphr.h\"\n  #include \"task.h\"\n  #include \"timers.h\"\n\n  // Increase stack size when debug log is enabled\n  #define USBD_STACK_SIZE (4 * configMINIMAL_STACK_SIZE / 2) * (CFG_TUSB_DEBUG ? 2 : 1)\n#endif\n\n#define BLINKY_STACK_SIZE configMINIMAL_STACK_SIZE\n#define AUDIO_STACK_SIZE configMINIMAL_STACK_SIZE\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n#define AUDIO_SAMPLE_RATE CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\n// static task\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t blinky_stack[BLINKY_STACK_SIZE];\nStaticTask_t blinky_taskdef;\n\nStackType_t usb_device_stack[USBD_STACK_SIZE];\nStaticTask_t usb_device_taskdef;\n\nStackType_t audio_stack[AUDIO_STACK_SIZE];\nStaticTask_t audio_taskdef;\n#endif\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Audio controls\n// Current states\nbool mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];      // +1 for master channel 0\nuint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// +1 for master channel 0\nuint32_t sampFreq;\nuint8_t clkValid;\n\n// Range states\naudio20_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state\naudio20_control_range_4_n_t(1) sampleFreqRng;                                    // Sample frequency range state\n\n// Audio test data, 4 channels muxed together, buffer[0] for CH0, buffer[1] for CH1, buffer[2] for CH2, buffer[3] for CH3\nuint16_t i2s_dummy_buffer[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX * CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE / 1000];\n\nvoid led_blinking_task(void *param);\nvoid usb_device_task(void *param);\nvoid audio_isr_task(void *param);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // Init values\n  sampFreq = AUDIO_SAMPLE_RATE;\n  clkValid = 1;\n\n  sampleFreqRng.wNumSubRanges = 1;\n  sampleFreqRng.subrange[0].bMin = AUDIO_SAMPLE_RATE;\n  sampleFreqRng.subrange[0].bMax = AUDIO_SAMPLE_RATE;\n  sampleFreqRng.subrange[0].bRes = 0;\n\n  // Generate dummy data\n  uint16_t *p_buff = i2s_dummy_buffer;\n  uint16_t dataVal = 0;\n  for (uint16_t cnt = 0; cnt < AUDIO_SAMPLE_RATE / 1000; cnt++) {\n    // CH0 saw wave\n    *p_buff++ = dataVal;\n    // CH1 inverted saw wave\n    *p_buff++ = 3200 + AUDIO_SAMPLE_RATE / 1000 - dataVal;\n    dataVal += 32;\n    // CH3 square wave\n    *p_buff++ = cnt < (AUDIO_SAMPLE_RATE / 1000 / 2) ? 3400 : 5000;\n    // CH4 sinus wave\n    float t = 2 * 3.1415f * cnt / (AUDIO_SAMPLE_RATE / 1000);\n    *p_buff++ = (uint16_t) ((int16_t) (sinf(t) * 750) + 6000);\n  }\n\n#if configSUPPORT_STATIC_ALLOCATION\n  // blinky task\n  xTaskCreateStatic(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);\n\n  // Create a task for tinyusb device stack\n  xTaskCreateStatic(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, usb_device_stack, &usb_device_taskdef);\n\n  // Audio receive (I2S) ISR simulation\n  // To simulate a ISR the priority is set to the highest\n  xTaskCreateStatic(audio_isr_task, \"audio\", AUDIO_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, audio_stack, &audio_taskdef);\n#else\n  xTaskCreate(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, NULL);\n  xTaskCreate(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, NULL);\n  xTaskCreate(audio_isr_task, \"audio\", AUDIO_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n#endif\n\n  // only start scheduler for non-espressif mcu\n  #ifndef ESP_PLATFORM\n    vTaskStartScheduler();\n  #endif\n\n  return 0;\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n// USB Device Driver task\n// This top level thread process all usb events and invoke callbacks\nvoid usb_device_task(void *param) {\n  (void) param;\n\n  // init device stack on configured roothub port\n  // This should be called after scheduler/kernel is started.\n  // Otherwise it could cause kernel issue since USB IRQ handler does use RTOS queue API.\n  tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // RTOS forever loop\n  while (1) {\n    // tinyusb device task\n    tud_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// AUDIO Task\n//--------------------------------------------------------------------+\n\n// This task simulates an audio receive ISR, one frame is received every 1ms.\n// We assume that the audio data is read from an I2S buffer.\n// In a real application, this would be replaced with actual I2S receive callback.\nvoid audio_isr_task(void *param) {\n  (void) param;\n  while (1) {\n    vTaskDelay(1);\n    tud_audio_write(i2s_dummy_buffer, AUDIO_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX);\n  }\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API Implementations\n//--------------------------------------------------------------------+\n\n// Invoked when audio class specific set request received for an EP\nbool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) ep;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an interface\nbool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) itf;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  (void) itf;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // If request is for our feature unit\n  if (entityID == 2) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Request uses format layout 1\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_1_t));\n\n        mute[channelNum] = ((audio20_control_cur_1_t *) pBuff)->bCur;\n\n        TU_LOG1(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n        return true;\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        // Request uses format layout 2\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_2_t));\n\n        volume[channelNum] = ((audio20_control_cur_2_t *) pBuff)->bCur;\n        TU_LOG1(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n        return true;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an EP\nbool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) ep;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an interface\nbool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) itf;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  // uint8_t itf = TU_U16_LOW(p_request->wIndex); \t\t\t// Since we have only one audio function implemented, we do not need the itf value\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // Input terminal (Microphone input)\n  if (entityID == 1) {\n    switch (ctrlSel) {\n      case AUDIO20_TE_CTRL_CONNECTOR: {\n        // The terminal connector control only has a get request with only the CUR attribute.\n        audio20_desc_channel_cluster_t ret;\n\n        // Those are dummy values for now\n        ret.bNrChannels = 1;\n        ret.bmChannelConfig = 0;\n        ret.iChannelNames = 0;\n\n        TU_LOG1(\"    Get terminal connector\\r\\n\");\n\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n      } break;\n\n        // Unknown/Unsupported control selector\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Feature unit\n  if (entityID == 2) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Audio control mute cur parameter block consists of only one byte - we thus can send it right away\n        // There does not exist a range parameter block for mute\n        TU_LOG1(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n        return tud_control_xfer(rhport, p_request, &mute[channelNum], 1);\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG1(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n            return tud_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG1(\"    Get Volume range of channel: %u\\r\\n\", channelNum);\n\n            // Copy values - only for testing - better is version below\n            audio20_control_range_2_n_t(1) ret;\n\n            ret.wNumSubRanges = 1;\n            ret.subrange[0].bMin = -90;// -90 dB\n            ret.subrange[0].bMax = 90; // +90 dB\n            ret.subrange[0].bRes = 1;  // 1 dB steps\n\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Clock Source unit\n  if (entityID == 4) {\n    switch (ctrlSel) {\n      case AUDIO20_CS_CTRL_SAM_FREQ:\n        // channelNum is always zero in this case\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG1(\"    Get Sample Freq.\\r\\n\");\n            // Buffered control transfer is needed for IN flow control to work\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG1(\"    Get Sample Freq. range\\r\\n\");\n            return tud_control_xfer(rhport, p_request, &sampleFreqRng, sizeof(sampleFreqRng));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n      case AUDIO20_CS_CTRL_CLK_VALID:\n        // Only cur attribute exists for this request\n        TU_LOG1(\"    Get Sample Freq. valid\\r\\n\");\n        return tud_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));\n\n      // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  TU_LOG1(\"  Unsupported entity: %d\\r\\n\", entityID);\n  return false;// Yet not implemented\n}\n\n///--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void *param) {\n  (void) param;\n  static bool led_state = false;\n\n  while (1) {\n    // Blink every interval ms\n    vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);\n\n    board_led_write(led_state);\n    led_state = 1 - led_state;// toggle\n  }\n}\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/src/plot_audio_samples.py",
    "content": "#!/usr/bin/env python3\nimport sounddevice as sd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport platform\n\nif __name__ == '__main__':\n\n    # If you got \"ValueError: No input device matching\", that is because your PC name example device\n    # differently from tested list below. Uncomment the next line to see full list and try to pick correct one\n    # print(sd.query_devices())\n\n    fs = 48000  \t\t# Sample rate\n    duration = 100e-3   # Duration of recording\n\n    if platform.system() == 'Windows':\n        # WDM-KS is needed since there are more than one MicNode device APIs (at least in Windows)\n        device = 'Microphone (MicNode_4_Ch), Windows WDM-KS'\n    elif platform.system() == 'Darwin':\n        device = 'MicNode_4_Ch'\n    else:\n        device ='default'\n\n    myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=4, dtype='int16', device=device)\n    print('Waiting...')\n    sd.wait()  # Wait until recording is finished\n    print('Done!')\n\n    time = np.arange(0, duration, 1 / fs)  # time vector\n    plt.plot(time, myrecording)\n    plt.xlabel('Time [s]')\n    plt.ylabel('Amplitude')\n    plt.title('MicNode 4 Channel')\n    plt.show()\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n// This examples use FreeRTOS\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_FREERTOS\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG            0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED           1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED         BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_AUDIO             1\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n//--------------------------------------------------------------------\n// AUDIO CLASS DRIVER CONFIGURATION\n//--------------------------------------------------------------------\n\n// Have a look into audio_device.h for all configurations\n#define CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE              48000\n\n#define CFG_TUD_AUDIO_ENABLE_EP_IN                    1\n#define CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX    2         // This value is not required by the driver, it parses this information from the descriptor once the alternate interface is set by the host - we use it for the setup\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX            4         // This value is not required by the driver, it parses this information from the descriptor once the alternate interface is set by the host - we use it for the setup\n#define CFG_TUD_AUDIO_EP_SZ_IN                        TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n\n#define CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL              1\n\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX             CFG_TUD_AUDIO_EP_SZ_IN\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ          (TUD_OPT_HIGH_SPEED ? 32 : 4) * CFG_TUD_AUDIO_EP_SZ_IN // Example write FIFO every 1ms, so it should be 8 times larger for HS device\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/audio_4_channel_mic_freertos/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VENDOR, 5) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for Audio\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum\n{\n  ITF_NUM_AUDIO_CONTROL = 0,\n  ITF_NUM_AUDIO_STREAMING,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO20_MIC_FOUR_CH_DESC_LEN)\n\n#if TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_AUDIO   0x03\n\n#elif TU_CHECK_MCU(OPT_MCU_NRF5X)\n  // nRF5x ISO can only be endpoint 8\n  #define EPNUM_AUDIO   0x08\n\n#else\n  #define EPNUM_AUDIO   0x01\n#endif\n\nuint8_t const desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_AUDIO20_MIC_FOUR_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, /*_nBitsUsedPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX*8, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO_EP_SZ_IN)\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nchar const* string_desc_arr [] = {\n    (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n    \"PaniRCorp\",                   // 1: Manufacturer\n    \"MicNode_4_Ch\",                // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"UAC2\",                        // 4: Audio Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/audio_test/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(audio_test C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/audio_test/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/audio_test/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/audio_test/skip.txt",
    "content": "mcu:SAMD11\nmcu:SAME5X\nmcu:SAMG\nfamily:espressif\n"
  },
  {
    "path": "examples/device/audio_test/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Reinhard Panhuber\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* plot_audio_samples.py requires following modules:\n * $ sudo apt install libportaudio\n * $ pip3 install sounddevice matplotlib\n *\n * Then run\n * $ python3 plot_audio_samples.py\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Audio controls\n// Current states\nbool mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];      // +1 for master channel 0\nuint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// +1 for master channel 0\nuint32_t sampFreq;\nuint8_t clkValid;\n\n// Range states\naudio20_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state\naudio20_control_range_4_n_t(1) sampleFreqRng;                                    // Sample frequency range state\n\n// Audio test data\nuint16_t test_buffer_audio[CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX / 2];\nuint16_t startVal = 0;\n\nvoid led_blinking_task(void);\nvoid audio_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // Init values\n  sampFreq = CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE;\n  clkValid = 1;\n\n  sampleFreqRng.wNumSubRanges = 1;\n  sampleFreqRng.subrange[0].bMin = CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE;\n  sampleFreqRng.subrange[0].bMax = CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE;\n  sampleFreqRng.subrange[0].bRes = 0;\n\n  while (1) {\n    tud_task();// tinyusb device task\n    led_blinking_task();\n    audio_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n\n//--------------------------------------------------------------------+\n// AUDIO Task\n//--------------------------------------------------------------------+\n\n// This task simulates an audio receive callback, one frame is received every 1ms.\n// We assume that the audio data is read from an I2S buffer.\n// In a real application, this would be replaced with actual I2S receive callback.\nvoid audio_task(void) {\n  static uint32_t start_ms = 0;\n  uint32_t curr_ms = tusb_time_millis_api();\n  if (start_ms == curr_ms) {\n    return; // not enough time\n  }\n  start_ms = curr_ms;\n  for (size_t cnt = 0; cnt < sizeof(test_buffer_audio) / 2; cnt++) {\n    test_buffer_audio[cnt] = startVal++;\n  }\n  tud_audio_write((uint8_t *) test_buffer_audio, sizeof(test_buffer_audio));\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API Implementations\n//--------------------------------------------------------------------+\n\n// Invoked when audio class specific set request received for an EP\nbool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) ep;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an interface\nbool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) itf;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  (void) itf;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // If request is for our feature unit\n  if (entityID == 2) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Request uses format layout 1\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_1_t));\n\n        mute[channelNum] = ((audio20_control_cur_1_t *) pBuff)->bCur;\n\n        TU_LOG2(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n        return true;\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        // Request uses format layout 2\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_2_t));\n\n        volume[channelNum] = (uint16_t) ((audio20_control_cur_2_t *) pBuff)->bCur;\n\n        TU_LOG2(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n        return true;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an EP\nbool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) ep;\n\n  //\treturn tud_control_xfer(rhport, p_request, &tmp, 1);\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an interface\nbool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) itf;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  // uint8_t itf = TU_U16_LOW(p_request->wIndex); \t\t\t// Since we have only one audio function implemented, we do not need the itf value\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // Input terminal (Microphone input)\n  if (entityID == 1) {\n    switch (ctrlSel) {\n      case AUDIO20_TE_CTRL_CONNECTOR: {\n        // The terminal connector control only has a get request with only the CUR attribute.\n        audio20_desc_channel_cluster_t ret;\n\n        // Those are dummy values for now\n        ret.bNrChannels = 1;\n        ret.bmChannelConfig = (audio20_channel_config_t) 0;\n        ret.iChannelNames = 0;\n\n        TU_LOG2(\"    Get terminal connector\\r\\n\");\n\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n      } break;\n\n        // Unknown/Unsupported control selector\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Feature unit\n  if (entityID == 2) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Audio control mute cur parameter block consists of only one byte - we thus can send it right away\n        // There does not exist a range parameter block for mute\n        TU_LOG2(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &mute[channelNum], 1);\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG2(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG2(\"    Get Volume range of channel: %u\\r\\n\", channelNum);\n\n            // Copy values - only for testing - better is version below\n            audio20_control_range_2_n_t(1)\n                ret;\n\n            ret.wNumSubRanges = 1;\n            ret.subrange[0].bMin = -90;// -90 dB\n            ret.subrange[0].bMax = 90; // +90 dB\n            ret.subrange[0].bRes = 1;  // 1 dB steps\n\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Clock Source unit\n  if (entityID == 4) {\n    switch (ctrlSel) {\n      case AUDIO20_CS_CTRL_SAM_FREQ:\n        // channelNum is always zero in this case\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG2(\"    Get Sample Freq.\\r\\n\");\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG2(\"    Get Sample Freq. range\\r\\n\");\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampleFreqRng, sizeof(sampleFreqRng));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n      case AUDIO20_CS_CTRL_CLK_VALID:\n        // Only cur attribute exists for this request\n        TU_LOG2(\"    Get Sample Freq. valid\\r\\n\");\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));\n\n      // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  TU_LOG2(\"  Unsupported entity: %d\\r\\n\", entityID);\n  return false;// Yet not implemented\n}\n\nbool tud_audio_set_itf_close_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  (void) p_request;\n  startVal = 0;\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;// toggle\n}\n"
  },
  {
    "path": "examples/device/audio_test/src/plot_audio_samples.py",
    "content": "#!/usr/bin/env python3\nimport sounddevice as sd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport platform\nimport csv\n\nif __name__ == '__main__':\n\n    # If you got \"ValueError: No input device matching\", that is because your PC name example device\n    # differently from tested list below. Uncomment the next line to see full list and try to pick correct one\n    # print(sd.query_devices())\n\n    fs = 48000           # Sample rate\n    duration = 3    # Duration of recording\n\n    if platform.system() == 'Windows':\n        # MME is needed since there are more than one MicNode device APIs (at least in Windows)\n        device = 'Microphone (MicNode), Windows WASAPI'\n    elif platform.system() == 'Darwin':\n        device = 'MicNode'\n    else:\n        device ='default'\n\n    myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16', device=device)\n    print('Waiting...')\n    sd.wait()  # Wait until recording is finished\n    print('Done!')\n\n    time = np.arange(0, duration, 1 / fs)  # time vector\n    plt.plot(time, myrecording)\n    plt.xlabel('Time [s]')\n    plt.ylabel('Amplitude')\n    plt.title('MicNode')\n    plt.show()\n\n    samples = np.array(myrecording)\n    np.savetxt('Output.csv', samples, delimiter=\",\", fmt='%s')\n"
  },
  {
    "path": "examples/device/audio_test/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS                 OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG              0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n// CFG_TUSB_DEBUG is defined by compiler in DEBUG build\n// #define CFG_TUSB_DEBUG           0\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_AUDIO             1\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n//--------------------------------------------------------------------\n// AUDIO CLASS DRIVER CONFIGURATION\n//--------------------------------------------------------------------\n\n// Have a look into audio_device.h for all configurations\n#define CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE                              48000\n\n#define CFG_TUD_AUDIO_ENABLE_EP_IN                                    1\n#define CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX                    2                                       // Driver gets this info from the descriptors - we define it here to use it to setup the descriptors and to do calculations with it below\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX                            1                                       // Driver gets this info from the descriptors - we define it here to use it to setup the descriptors and to do calculations with it below - be aware: for different number of channels you need another descriptor!\n#define CFG_TUD_AUDIO_EP_SZ_IN                                        TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX                             CFG_TUD_AUDIO_EP_SZ_IN\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ                          (TUD_OPT_HIGH_SPEED ? 32 : 4) * CFG_TUD_AUDIO_EP_SZ_IN // Example write FIFO every 1ms, so it should be 8 times larger for HS device\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/audio_test/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VENDOR, 5) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for Audio\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum\n{\n  ITF_NUM_AUDIO_CONTROL = 0,\n  ITF_NUM_AUDIO_STREAMING,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO20_MIC_ONE_CH_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_AUDIO   0x03\n\n#elif TU_CHECK_MCU(OPT_MCU_NRF5X)\n  // nRF5x ISO can only be endpoint 8\n  #define EPNUM_AUDIO   0x08\n\n#else\n  #define EPNUM_AUDIO   0x01\n#endif\n\nuint8_t const desc_configuration[] =\n{\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_AUDIO20_MIC_ONE_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, /*_nBitsUsedPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX*8, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO_EP_SZ_IN)\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nchar const* string_desc_arr [] =\n{\n    (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n    \"PaniRCorp\",                   // 1: Manufacturer\n    \"MicNode\",                     // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"UAC2\",                        // 4: Audio Interface\n\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/audio_test_freertos/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(audio_test_freertos C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example with FreeRTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} freertos)\n"
  },
  {
    "path": "examples/device/audio_test_freertos/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/audio_test_freertos/Makefile",
    "content": "RTOS = freertos\ninclude ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE = \\\n\tsrc/main.c \\\n\tsrc/usb_descriptors.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/audio_test_freertos/README.md",
    "content": "# How to build example for Esp32s3\n1. Load idf environment variables (eg. using the esp-idf alias `get_idf` if configured)\n\n2. cd into examples directory\n```\n$ cd /tinyusb/examples/device/audio_test_freertos\n```\n\n3. Run cmake in project directory specifying the board\n```\n$ cmake -DBOARD=espressif_s3_devkitc -B build -G Ninja .\n$ ninja.exe -C build\n```\n\n4. Flash the binary onto the esp32-s3 by copy-paste of the full command output by the esp-idf build system replacing **(PORT)** with eg. /dev/ttyUSB0\n\neg.\n\n> /home/kaspernyhus/.espressif/python_env/idf4.4_py3.8_env/bin/python ../../../../esp-idf/components/esptool_py/esptool/esptool.py -p /dev/ttyUSB0 -b 460800 --before default_reset --after hard_reset --chip esp32s3  write_flash --flash_mode dio --flash_size detect --flash_freq 80m 0x0 _build/espressif_s3_devkitc/bootloader/bootloader.bin 0x8000 _build/espressif_s3_devkitc/partition_table/partition-table.bin 0x10000 _build/espressif_s3_devkitc/audio_test_freertos.bin\n"
  },
  {
    "path": "examples/device/audio_test_freertos/sdkconfig.defaults",
    "content": "CONFIG_IDF_CMAKE=y\nCONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y\nCONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y\n"
  },
  {
    "path": "examples/device/audio_test_freertos/skip.txt",
    "content": "mcu:CH32F20X\nmcu:CH32V103\nmcu:CH32V20X\nmcu:CH32V307\nmcu:CXD56\nmcu:F1C100S\nmcu:GD32VF103\nmcu:MCXA15\nmcu:MKL25ZXX\nmcu:MSP430x5xx\nmcu:FT90X\nmcu:RP2040\nmcu:SAMD11\nmcu:VALENTYUSB_EPTRI\nmcu:RAXXX\nfamily:broadcom_32bit\nfamily:broadcom_64bit\nboard:stm32l0538disco\nfamily:nuc121_125\nfamily:hpmicro\n"
  },
  {
    "path": "examples/device/audio_test_freertos/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\" \"usb_descriptors.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/audio_test_freertos/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Reinhard Panhuber\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* plot_audio_samples.py requires following modules:\n * $ sudo apt install libportaudio\n * $ pip3 install sounddevice matplotlib\n *\n * Then run\n * $ python3 plot_audio_samples.py\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#ifdef ESP_PLATFORM\n  // ESP-IDF need \"freertos/\" prefix in include path.\n  // CFG_TUSB_OS_INC_PATH should be defined accordingly.\n  #include \"freertos/FreeRTOS.h\"\n  #include \"freertos/queue.h\"\n  #include \"freertos/semphr.h\"\n  #include \"freertos/task.h\"\n  #include \"freertos/timers.h\"\n\n  #define USBD_STACK_SIZE 4096\n#else\n\n  #include \"FreeRTOS.h\"\n  #include \"queue.h\"\n  #include \"semphr.h\"\n  #include \"task.h\"\n  #include \"timers.h\"\n\n  // Increase stack size when debug log is enabled\n  #define USBD_STACK_SIZE (4 * configMINIMAL_STACK_SIZE / 2) * (CFG_TUSB_DEBUG ? 2 : 1)\n#endif\n\n#define BLINKY_STACK_SIZE configMINIMAL_STACK_SIZE\n#define AUDIO_STACK_SIZE configMINIMAL_STACK_SIZE\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\n// static task\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t blinky_stack[BLINKY_STACK_SIZE];\nStaticTask_t blinky_taskdef;\n\nStackType_t usb_device_stack[USBD_STACK_SIZE];\nStaticTask_t usb_device_taskdef;\n\nStackType_t audio_stack[AUDIO_STACK_SIZE];\nStaticTask_t audio_taskdef;\n#endif\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Audio controls\n// Current states\nbool mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];      // +1 for master channel 0\nuint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// +1 for master channel 0\nuint32_t sampFreq;\nuint8_t clkValid;\n\n// Range states\naudio20_control_range_2_n_t(1) volumeRng[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// Volume range state\naudio20_control_range_4_n_t(1) sampleFreqRng;                                    // Sample frequency range state\n\n// Audio test data\nuint16_t test_buffer_audio[CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE / 1000 * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX / 2];\nuint16_t startVal = 0;\n\nvoid led_blinking_task(void *param);\nvoid usb_device_task(void *param);\nvoid audio_isr_task(void *param);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // Init values\n  sampFreq = CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE;\n  clkValid = 1;\n\n  sampleFreqRng.wNumSubRanges = 1;\n  sampleFreqRng.subrange[0].bMin = CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE;\n  sampleFreqRng.subrange[0].bMax = CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE;\n  sampleFreqRng.subrange[0].bRes = 0;\n\n#if configSUPPORT_STATIC_ALLOCATION\n  // blinky task\n  xTaskCreateStatic(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);\n\n  // Create a task for tinyusb device stack\n  xTaskCreateStatic(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, usb_device_stack, &usb_device_taskdef);\n\n  // Audio receive (I2S) ISR simulation\n  // To simulate a ISR the priority is set to the highest\n  xTaskCreateStatic(audio_isr_task, \"audio\", AUDIO_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, audio_stack, &audio_taskdef);\n#else\n  xTaskCreate(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, NULL);\n  xTaskCreate(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(audio_isr_task, \"audio\", AUDIO_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n#endif\n\n  // only start scheduler for non-espressif mcu\n  #ifndef ESP_PLATFORM\n    vTaskStartScheduler();\n  #endif\n\n  return 0;\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n// USB Device Driver task\n// This top level thread process all usb events and invoke callbacks\nvoid usb_device_task(void *param) {\n  (void) param;\n\n  // init device stack on configured roothub port\n  // This should be called after scheduler/kernel is started.\n  // Otherwise it could cause kernel issue since USB IRQ handler does use RTOS queue API.\n  tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // RTOS forever loop\n  while (1) {\n    // tinyusb device task\n    tud_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// AUDIO Task\n//--------------------------------------------------------------------+\n\n// This task simulates an audio receive ISR, one frame is received every 1ms.\n// We assume that the audio data is read from an I2S buffer.\n// In a real application, this would be replaced with actual I2S receive callback.\nvoid audio_isr_task(void *param) {\n  (void) param;\n  while (1) {\n    vTaskDelay(1);\n    for (size_t cnt = 0; cnt < sizeof(test_buffer_audio) / 2; cnt++) {\n      test_buffer_audio[cnt] = startVal++;\n    }\n    tud_audio_write((uint8_t *) test_buffer_audio, sizeof(test_buffer_audio));\n  }\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API Implementations\n//--------------------------------------------------------------------+\n\n// Invoked when audio class specific set request received for an EP\nbool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) ep;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an interface\nbool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) itf;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  (void) itf;\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // If request is for our feature unit\n  if (entityID == 2) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Request uses format layout 1\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_1_t));\n\n        mute[channelNum] = ((audio20_control_cur_1_t *) pBuff)->bCur;\n\n        TU_LOG1(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n        return true;\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        // Request uses format layout 2\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_2_t));\n\n        volume[channelNum] = (uint16_t) ((audio20_control_cur_2_t *) pBuff)->bCur;\n        TU_LOG1(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n        return true;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an EP\nbool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) ep;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an interface\nbool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  (void) channelNum;\n  (void) ctrlSel;\n  (void) itf;\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Page 91 in UAC2 specification\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  // uint8_t itf = TU_U16_LOW(p_request->wIndex); \t\t\t// Since we have only one audio function implemented, we do not need the itf value\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // Input terminal (Microphone input)\n  if (entityID == 1) {\n    switch (ctrlSel) {\n      case AUDIO20_TE_CTRL_CONNECTOR: {\n        // The terminal connector control only has a get request with only the CUR attribute.\n        audio20_desc_channel_cluster_t ret;\n\n        // Those are dummy values for now\n        ret.bNrChannels = 1;\n        ret.bmChannelConfig = (audio20_channel_config_t) 0;\n        ret.iChannelNames = 0;\n\n        TU_LOG1(\"    Get terminal connector\\r\\n\");\n\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n      } break;\n\n        // Unknown/Unsupported control selector\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Feature unit\n  if (entityID == 2) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Audio control mute cur parameter block consists of only one byte - we thus can send it right away\n        // There does not exist a range parameter block for mute\n        TU_LOG1(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &mute[channelNum], 1);\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG1(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG1(\"    Get Volume range of channel: %u\\r\\n\", channelNum);\n\n            // Copy values - only for testing - better is version below\n            audio20_control_range_2_n_t(1)\n                ret;\n\n            ret.wNumSubRanges = 1;\n            ret.subrange[0].bMin = -90;// -90 dB\n            ret.subrange[0].bMax = 90; // +90 dB\n            ret.subrange[0].bRes = 1;  // 1 dB steps\n\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Clock Source unit\n  if (entityID == 4) {\n    switch (ctrlSel) {\n      case AUDIO20_CS_CTRL_SAM_FREQ:\n        // channelNum is always zero in this case\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG1(\"    Get Sample Freq.\\r\\n\");\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG1(\"    Get Sample Freq. range\\r\\n\");\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampleFreqRng, sizeof(sampleFreqRng));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n      case AUDIO20_CS_CTRL_CLK_VALID:\n        // Only cur attribute exists for this request\n        TU_LOG1(\"    Get Sample Freq. valid\\r\\n\");\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));\n\n      // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  TU_LOG1(\"  Unsupported entity: %d\\r\\n\", entityID);\n  return false;// Yet not implemented\n}\n\nbool tud_audio_set_itf_close_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  (void) p_request;\n  startVal = 0;\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void *param) {\n  (void) param;\n  static bool led_state = false;\n\n  while (1) {\n    // Blink every interval ms\n    vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);\n\n    board_led_write(led_state);\n    led_state = 1 - led_state;// toggle\n  }\n}\n"
  },
  {
    "path": "examples/device/audio_test_freertos/src/plot_audio_samples.py",
    "content": "#!/usr/bin/env python3\nimport sounddevice as sd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport platform\n\nif __name__ == '__main__':\n\n    # If you got \"ValueError: No input device matching\", that is because your PC name example device\n    # differently from tested list below. Uncomment the next line to see full list and try to pick correct one\n    # print(sd.query_devices())\n\n    fs = 48000           # Sample rate\n    duration = 3    # Duration of recording\n\n    if platform.system() == 'Windows':\n        # MME is needed since there are more than one MicNode device APIs (at least in Windows)\n        device = 'Microphone (MicNode), Windows WASAPI'\n    elif platform.system() == 'Darwin':\n        device = 'MicNode'\n    else:\n        device ='default'\n\n    myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16', device=device)\n    print('Waiting...')\n    sd.wait()  # Wait until recording is finished\n    print('Done!')\n\n    time = np.arange(0, duration, 1 / fs)  # time vector\n    plt.plot(time, myrecording)\n    plt.xlabel('Time [s]')\n    plt.ylabel('Amplitude')\n    plt.title('MicNode')\n    plt.show()\n"
  },
  {
    "path": "examples/device/audio_test_freertos/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n// This examples use FreeRTOS\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS                 OPT_OS_FREERTOS\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG              0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n// CFG_TUSB_DEBUG is defined by compiler in DEBUG build\n// #define CFG_TUSB_DEBUG           0\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_AUDIO             1\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n//--------------------------------------------------------------------\n// AUDIO CLASS DRIVER CONFIGURATION\n//--------------------------------------------------------------------\n\n// Have a look into audio_device.h for all configurations\n#define CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE                              48000\n\n#define CFG_TUD_AUDIO_ENABLE_EP_IN                                    1\n#define CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX                    2                                       // Driver gets this info from the descriptors - we define it here to use it to setup the descriptors and to do calculations with it below\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX                            1                                       // Driver gets this info from the descriptors - we define it here to use it to setup the descriptors and to do calculations with it below - be aware: for different number of channels you need another descriptor!\n#define CFG_TUD_AUDIO_EP_SZ_IN                                        TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX                             CFG_TUD_AUDIO_EP_SZ_IN\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ                          (TUD_OPT_HIGH_SPEED ? 32 : 4) * CFG_TUD_AUDIO_EP_SZ_IN // Example write FIFO every 1ms, so it should be 8 times larger for HS device\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/audio_test_freertos/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VENDOR, 5) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for Audio\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum\n{\n  ITF_NUM_AUDIO_CONTROL = 0,\n  ITF_NUM_AUDIO_STREAMING,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO20_MIC_ONE_CH_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_AUDIO   0x03\n\n#elif TU_CHECK_MCU(OPT_MCU_NRF5X)\n  // nRF5x ISO can only be endpoint 8\n  #define EPNUM_AUDIO   0x08\n\n#else\n  #define EPNUM_AUDIO   0x01\n#endif\n\nuint8_t const desc_configuration[] =\n{\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_AUDIO20_MIC_ONE_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX, /*_nBitsUsedPerSample*/ CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_TX*8, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO_EP_SZ_IN)\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nchar const* string_desc_arr [] =\n{\n    (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n    \"PaniRCorp\",                   // 1: Manufacturer\n    \"MicNode\",                     // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"UAC2\",                        // 4: Audio Interface\n\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(audio_test_multi_rate C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/skip.txt",
    "content": "mcu:SAMD11\nmcu:SAME5X\nmcu:SAMG\nfamily:espressif\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Reinhard Panhuber\n * Copyright (c) 2022 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* plot_audio_samples.py requires following modules:\n * $ sudo apt install libportaudio\n * $ pip3 install sounddevice matplotlib\n *\n * Then run\n * $ python3 plot_audio_samples.py\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Audio controls\n// Current states\nbool mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];      // +1 for master channel 0\nint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX + 1];// +1 for master channel 0\nuint32_t sampFreq;\nuint8_t bytesPerSample;\nuint8_t clkValid;\n\n// Range states\n// List of supported sample rates\nstatic const uint32_t sampleRatesList[] =\n    {\n        32000, 48000, 96000};\n\n#define N_sampleRates TU_ARRAY_SIZE(sampleRatesList)\n\n// Bytes per format of every Alt settings\nstatic const uint8_t bytesPerSampleAltList[CFG_TUD_AUDIO_FUNC_1_N_FORMATS] =\n    {\n        CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX,\n        CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX,\n};\n\n// Audio test data\nCFG_TUD_MEM_ALIGN uint8_t test_buffer_audio[(TUD_OPT_HIGH_SPEED ? 8 : 1) * CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX];\nuint16_t startVal = 0;\n\nvoid led_blinking_task(void);\nvoid audio_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // Init values\n  sampFreq = sampleRatesList[0];\n  clkValid = 1;\n\n  while (1) {\n    tud_task();// tinyusb device task\n    led_blinking_task();\n    audio_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// AUDIO Task\n//--------------------------------------------------------------------+\n\n// This task simulates an audio receive callback, one frame is received every 1ms.\n// We assume that the audio data is read from an I2S buffer.\n// In a real application, this would be replaced with actual I2S receive callback.\nvoid audio_task(void) {\n  static uint32_t start_ms = 0;\n  uint32_t curr_ms = tusb_time_millis_api();\n  if (start_ms == curr_ms) {\n    return; // not enough time\n  }\n  start_ms = curr_ms;\n  // 16bit\n  if (bytesPerSample == 2) {\n    uint16_t *pData_16 = (uint16_t *) ((void *) test_buffer_audio);\n    for (size_t cnt = 0; cnt < sampFreq / 1000; cnt++) {\n      pData_16[cnt] = startVal++;\n    }\n  }\n  // 24bit in 32bit slot\n  else if (bytesPerSample == 4) {\n    uint32_t *pData_32 = (uint32_t *) ((void *) test_buffer_audio);\n    for (size_t cnt = 0; cnt < sampFreq / 1000; cnt++) {\n      pData_32[cnt] = (uint32_t) startVal++ << 16U;\n    }\n  }\n  tud_audio_write((uint8_t *) test_buffer_audio, (uint16_t) (sampFreq / 1000 * bytesPerSample));\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API Implementations\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// UAC1 Helper Functions\n//--------------------------------------------------------------------+\n\nstatic bool audio10_set_req_ep(tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n\n  switch (ctrlSel) {\n    case AUDIO10_EP_CTRL_SAMPLING_FREQ:\n      if (p_request->bRequest == AUDIO10_CS_REQ_SET_CUR) {\n        // Request uses 3 bytes\n        TU_VERIFY(p_request->wLength == 3);\n\n        sampFreq = tu_unaligned_read32(pBuff) & 0x00FFFFFF;\n\n        TU_LOG2(\"EP set current freq: %\" PRIu32 \"\\r\\n\", sampFreq);\n\n        return true;\n      }\n      break;\n\n    // Unknown/Unsupported control\n    default:\n      TU_BREAKPOINT();\n      return false;\n  }\n\n  return false;\n}\n\nstatic bool audio10_get_req_ep(uint8_t rhport, tusb_control_request_t const *p_request) {\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n\n  switch (ctrlSel) {\n    case AUDIO10_EP_CTRL_SAMPLING_FREQ:\n      if (p_request->bRequest == AUDIO10_CS_REQ_GET_CUR) {\n        TU_LOG2(\"EP get current freq\\r\\n\");\n\n        uint8_t freq[3];\n        freq[0] = (uint8_t) (sampFreq & 0xFF);\n        freq[1] = (uint8_t) ((sampFreq >> 8) & 0xFF);\n        freq[2] = (uint8_t) ((sampFreq >> 16) & 0xFF);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, freq, sizeof(freq));\n      }\n      break;\n\n    // Unknown/Unsupported control\n    default:\n      TU_BREAKPOINT();\n      return false;\n  }\n\n  return false;\n}\n\nstatic bool audio10_set_req_entity(tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // If request is for our feature unit (ID defined in usbd.h)\n  if (entityID == 0x02) {\n    switch (ctrlSel) {\n      case AUDIO10_FU_CTRL_MUTE:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_SET_CUR:\n            // Only 1st form is supported\n            TU_VERIFY(p_request->wLength ==1);\n\n            mute[channelNum] = pBuff[0];\n\n            TU_LOG2(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n            return true;\n\n          default:\n            return false; // not supported\n        }\n\n      case AUDIO10_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_SET_CUR:\n            // Only 1st form is supported\n            TU_VERIFY(p_request->wLength == 2);\n\n            volume[channelNum] = (int16_t)tu_unaligned_read16(pBuff) / 256;\n\n            TU_LOG2(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n            return true;\n\n          default:\n            return false; // not supported\n        }\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  return false;\n}\n\nstatic bool audio10_get_req_entity(uint8_t rhport, tusb_control_request_t const *p_request) {\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // If request is for our feature unit (ID defined in usbd.h)\n  if (entityID == 0x02) {\n    switch (ctrlSel) {\n      case AUDIO10_FU_CTRL_MUTE:\n        // Audio control mute cur parameter block consists of only one byte - we thus can send it right away\n        // There does not exist a range parameter block for mute\n        TU_LOG2(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &mute[channelNum], 1);\n\n      case AUDIO10_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_GET_CUR:\n            TU_LOG2(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t vol = (int16_t) volume[channelNum];\n              vol = vol * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &vol, sizeof(vol));\n            }\n\n          case AUDIO10_CS_REQ_GET_MIN:\n            TU_LOG2(\"    Get Volume min of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t min = -90; // -90 dB\n              min = min * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &min, sizeof(min));\n            }\n\n          case AUDIO10_CS_REQ_GET_MAX:\n            TU_LOG2(\"    Get Volume max of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t max = 30; // +30 dB\n              max = max * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &max, sizeof(max));\n            }\n\n          case AUDIO10_CS_REQ_GET_RES:\n            TU_LOG2(\"    Get Volume res of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t res = 1; // 1 dB\n              res = res * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &res, sizeof(res));\n            }\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// UAC2 Helper Functions\n//--------------------------------------------------------------------+\n\n#if TUD_OPT_HIGH_SPEED\n\nstatic bool audio20_set_req_entity(tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // We do not support any set range requests here, only current value requests\n  TU_VERIFY(p_request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  // If request is for our feature unit\n  if (entityID == UAC2_ENTITY_FEATURE_UNIT) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Request uses format layout 1\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_1_t));\n\n        mute[channelNum] = ((audio20_control_cur_1_t *) pBuff)->bCur;\n\n        TU_LOG2(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n        return true;\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        // Request uses format layout 2\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_2_t));\n\n        volume[channelNum] = (int16_t) ((audio20_control_cur_2_t *) pBuff)->bCur;\n\n        TU_LOG2(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n        return true;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Clock Source unit\n  if (entityID == UAC2_ENTITY_CLOCK) {\n    switch (ctrlSel) {\n      case AUDIO20_CS_CTRL_SAM_FREQ:\n        TU_VERIFY(p_request->wLength == sizeof(audio20_control_cur_4_t));\n\n        sampFreq = (uint32_t) ((audio20_control_cur_4_t *) pBuff)->bCur;\n\n        TU_LOG2(\"Clock set current freq: %\" PRIu32 \"\\r\\n\", sampFreq);\n\n        return true;\n        break;\n\n      // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  return false;\n}\n\nstatic bool audio20_get_req_entity(uint8_t rhport, tusb_control_request_t const *p_request) {\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // Input terminal (Microphone input)\n  if (entityID == UAC2_ENTITY_INPUT_TERMINAL) {\n    switch (ctrlSel) {\n      case AUDIO20_TE_CTRL_CONNECTOR: {\n        // The terminal connector control only has a get request with only the CUR attribute.\n        audio20_desc_channel_cluster_t ret;\n\n        // Those are dummy values for now\n        ret.bNrChannels = 1;\n        ret.bmChannelConfig = 0;\n        ret.iChannelNames = 0;\n\n        TU_LOG2(\"    Get terminal connector\\r\\n\");\n\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n      } break;\n\n        // Unknown/Unsupported control selector\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Feature unit\n  if (entityID == UAC2_ENTITY_FEATURE_UNIT) {\n    switch (ctrlSel) {\n      case AUDIO20_FU_CTRL_MUTE:\n        // Audio control mute cur parameter block consists of only one byte - we thus can send it right away\n        // There does not exist a range parameter block for mute\n        TU_LOG2(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &mute[channelNum], 1);\n\n      case AUDIO20_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG2(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &volume[channelNum], sizeof(volume[channelNum]));\n\n          case AUDIO20_CS_REQ_RANGE:\n            TU_LOG2(\"    Get Volume range of channel: %u\\r\\n\", channelNum);\n\n            // Copy values - only for testing - better is version below\n            audio20_control_range_2_n_t(1)\n                ret;\n\n            ret.wNumSubRanges = 1;\n            ret.subrange[0].bMin = -90;// -90 dB\n            ret.subrange[0].bMax = 30; // +30 dB\n            ret.subrange[0].bRes = 1;  // 1 dB steps\n\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, (void *) &ret, sizeof(ret));\n\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Clock Source unit\n  if (entityID == UAC2_ENTITY_CLOCK) {\n    switch (ctrlSel) {\n      case AUDIO20_CS_CTRL_SAM_FREQ:\n        // channelNum is always zero in this case\n        switch (p_request->bRequest) {\n          case AUDIO20_CS_REQ_CUR:\n            TU_LOG2(\"    Get Sample Freq.\\r\\n\");\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &sampFreq, sizeof(sampFreq));\n\n          case AUDIO20_CS_REQ_RANGE: {\n            TU_LOG2(\"    Get Sample Freq. range\\r\\n\");\n            audio20_control_range_4_n_t(N_sampleRates) rangef =\n                {\n                    .wNumSubRanges = tu_htole16(N_sampleRates)};\n            TU_LOG1(\"Clock get %d freq ranges\\r\\n\", N_sampleRates);\n            for (uint8_t i = 0; i < N_sampleRates; i++) {\n              rangef.subrange[i].bMin = (int32_t) sampleRatesList[i];\n              rangef.subrange[i].bMax = (int32_t) sampleRatesList[i];\n              rangef.subrange[i].bRes = 0;\n              TU_LOG1(\"Range %d (%d, %d, %d)\\r\\n\", i, (int) rangef.subrange[i].bMin, (int) rangef.subrange[i].bMax, (int) rangef.subrange[i].bRes);\n            }\n            return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &rangef, sizeof(rangef));\n          }\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n      case AUDIO20_CS_CTRL_CLK_VALID:\n        // Only cur attribute exists for this request\n        TU_LOG2(\"    Get Sample Freq. valid\\r\\n\");\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &clkValid, sizeof(clkValid));\n\n      // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  return false;\n}\n\n#endif // TUD_OPT_HIGH_SPEED\n\n//--------------------------------------------------------------------+\n// Main Callback Functions\n//--------------------------------------------------------------------+\n\n// Invoked when set interface is called, typically on start/stop streaming or format change\nbool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  //uint8_t const itf = tu_u16_low(tu_le16toh(p_request->wIndex));\n  uint8_t const alt = tu_u16_low(tu_le16toh(p_request->wValue));\n\n  // Clear buffer when streaming format is changed\n  if (alt != 0) {\n    bytesPerSample = bytesPerSampleAltList[alt - 1];\n  }\n  return true;\n}\n\n// Invoked when audio class specific set request received for an EP\nbool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  if (tud_audio_version() == 1) {\n    return audio10_set_req_ep(p_request, pBuff);\n  } else if (tud_audio_version() == 2) {\n    // We do not support any requests here\n  }\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an EP\nbool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_get_req_ep(rhport, p_request);\n  } else if (tud_audio_version() == 2) {\n    // We do not support any requests here\n  }\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_set_req_entity(p_request, pBuff);\n#if TUD_OPT_HIGH_SPEED\n  } else if (tud_audio_version() == 2) {\n    return audio20_set_req_entity(p_request, pBuff);\n#endif\n  }\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_get_req_entity(rhport, p_request);\n#if TUD_OPT_HIGH_SPEED\n  } else if (tud_audio_version() == 2) {\n    return audio20_get_req_entity(rhport, p_request);\n#endif\n  }\n\n  return false;// Yet not implemented\n}\n\nbool tud_audio_set_itf_close_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  (void) p_request;\n  startVal = 0;\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;// toggle\n}\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/src/plot_audio_samples.py",
    "content": "#!/usr/bin/env python3\nimport sounddevice as sd\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport platform\nimport csv\n\nif __name__ == '__main__':\n\n    # If you got \"ValueError: No input device matching\", that is because your PC name example device\n    # differently from tested list below. Uncomment the next line to see full list and try to pick correct one\n    # print(sd.query_devices())\n\n    fs = 96000           # Sample rate\n    duration = 100e-3    # Duration of recording\n\n    if platform.system() == 'Windows':\n        # MME is needed since there are more than one MicNode device APIs (at least in Windows)\n        device = 'Microphone (MicNode) MME'\n    elif platform.system() == 'Darwin':\n        device = 'MicNode'\n    else:\n        device ='default'\n\n    myrecording = sd.rec(int(duration * fs), samplerate=fs, channels=1, dtype='int16', device=device)\n    print('Waiting...')\n    sd.wait()  # Wait until recording is finished\n    print('Done!')\n\n    time = np.arange(0, duration, 1 / fs)  # time vector\n    plt.plot(time, myrecording)\n    plt.xlabel('Time [s]')\n    plt.ylabel('Amplitude')\n    plt.title('MicNode')\n    plt.show()\n\n    samples = np.array(myrecording)\n    np.savetxt('Output.csv', samples, delimiter=\",\", fmt='%s')\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS                 OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG              0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n// CFG_TUSB_DEBUG is defined by compiler in DEBUG build\n// #define CFG_TUSB_DEBUG           0\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_AUDIO             1\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n//--------------------------------------------------------------------\n// AUDIO CLASS DRIVER CONFIGURATION\n//--------------------------------------------------------------------\n\n#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE                         96000\n\n// How many formats are used, need to adjust USB descriptor if changed\n#define CFG_TUD_AUDIO_FUNC_1_N_FORMATS                               2\n\n// 16bit in 16bit slots\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX          2\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX                  16\n\n// 24bit in 32bit slots (UAC2 only)\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX          4\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX                  24\n\n// Have a look into audio_device.h for all configurations\n\n#define CFG_TUD_AUDIO_ENABLE_EP_IN                                   1\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX                           1 // Driver gets this info from the descriptors - we define it here to use it to setup the descriptors and to do calculations with it below - be aware: for different number of channels you need another descriptor!\n\n// UAC1 (Full-Speed) Endpoint size calculation\n#define CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_IN                     TUD_AUDIO_EP_SIZE(false, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n\n// UAC2 (High-Speed) Endpoint size calculation\n#define CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_IN                     TUD_AUDIO_EP_SIZE(true, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n#define CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_IN                     TUD_AUDIO_EP_SIZE(true, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n\n// Maximum EP IN size for all AS alternate settings used\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX                            TU_MAX(CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_IN, TU_MAX(CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_IN, CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_IN))\n\n// Tx flow control needs buffer size >= 4* EP size to work correctly\n// Example write FIFO every 1ms (8 HS frames), so buffer size should be 8 times larger for HS device\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ                         TU_MAX(4 * CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_IN, TU_MAX(32 * CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_IN, 32 * CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_IN))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2022 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VENDOR, 5) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for Audio\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum {\n  ITF_NUM_AUDIO_CONTROL = 0,\n  ITF_NUM_AUDIO_STREAMING,\n  ITF_NUM_TOTAL\n};\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_AUDIO   0x03\n\n#elif TU_CHECK_MCU(OPT_MCU_NRF5X)\n  // nRF5x ISO can only be endpoint 8\n  #define EPNUM_AUDIO   0x08\n\n#else\n  #define EPNUM_AUDIO   0x01\n#endif\n\n#define CONFIG_UAC1_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + TUD_AUDIO10_MIC_ONE_CH_DESC_LEN(3))\n\nuint8_t const desc_uac1_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_UAC1_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_AUDIO10_MIC_ONE_CH_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_nBytesPerSample*/ 2, /*_nBitsUsedPerSample*/ 16, /*_epin*/ 0x80 | EPNUM_AUDIO, /*_epsize*/ CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_IN, 32000, 48000, 96000)\n};\n\nTU_VERIFY_STATIC(sizeof(desc_uac1_configuration) == CONFIG_UAC1_TOTAL_LEN, \"Incorrect size\");\n\n#if TUD_OPT_HIGH_SPEED\n#define CONFIG_UAC2_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + TUD_AUDIO20_MIC_ONE_CH_2_FORMAT_DESC_LEN)\n\nuint8_t const desc2_uac2_configuration[] = {\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_UAC2_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_AUDIO20_MIC_ONE_CH_2_FORMAT_DESCRIPTOR(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_stridx*/ 0, /*_epin*/ 0x80 | EPNUM_AUDIO)\n};\n\nTU_VERIFY_STATIC(sizeof(desc2_uac2_configuration) == CONFIG_UAC2_TOTAL_LEN, \"Incorrect size\");\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\ntusb_desc_device_qualifier_t const desc_device_qualifier = {\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = 0x0200,\n\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index;// for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_uac1_configuration : desc2_uac2_configuration;\n}\n\n#endif// highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  if(tud_speed_get() == TUSB_SPEED_FULL) {\n    return desc_uac1_configuration;\n  } else {\n    return desc2_uac2_configuration;\n  }\n#else\n    return desc_uac1_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nchar const* string_desc_arr [] = {\n    (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n    \"PaniRCorp\",                   // 1: Manufacturer\n    \"MicNode\",                     // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"UAC2\",                        // 4: Audio Interface\n\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/audio_test_multi_rate/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\n// #include \"tusb.h\"\n\n// Unit numbers are arbitrary selected\n#define UAC2_ENTITY_CLOCK                   0x04\n#define UAC2_ENTITY_INPUT_TERMINAL          0x01\n#define UAC2_ENTITY_OUTPUT_TERMINAL         0x03\n#define UAC2_ENTITY_FEATURE_UNIT            0x02\n\n\n#define TUD_AUDIO20_MIC_ONE_CH_2_FORMAT_DESC_LEN (TUD_AUDIO20_DESC_IAD_LEN\\\n    + TUD_AUDIO20_DESC_STD_AC_LEN\\\n    + TUD_AUDIO20_DESC_CS_AC_LEN\\\n    + TUD_AUDIO20_DESC_CLK_SRC_LEN\\\n    + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(1)\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    /* Interface 1, Alternate 1 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n    /* Interface 1, Alternate 2 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN)\n\n\n#define TUD_AUDIO20_MIC_ONE_CH_2_FORMAT_DESCRIPTOR(_itfnum, _stridx, _epin) \\\n  /* Standard Interface Association Descriptor (IAD) */\\\n  TUD_AUDIO20_DESC_IAD(/*_firstitf*/ _itfnum, /*_nitfs*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Standard AC Interface Descriptor(4.7.1) */\\\n  TUD_AUDIO20_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n  /* Class-Specific AC Interface Header Descriptor(4.7.2) */\\\n  TUD_AUDIO20_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO20_FUNC_MICROPHONE, /*_totallen*/ TUD_AUDIO20_DESC_CLK_SRC_LEN+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN+TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(1), /*_ctrl*/ AUDIO20_CS_AS_INTERFACE_CTRL_LATENCY_POS),\\\n  /* Clock Source Descriptor(4.7.2.1) */\\\n  TUD_AUDIO20_DESC_CLK_SRC(/*_clkid*/ UAC2_ENTITY_CLOCK, /*_attr*/ AUDIO20_CLOCK_SOURCE_ATT_INT_PRO_CLK, /*_ctrl*/ AUDIO20_CTRL_RW << AUDIO20_CLOCK_SOURCE_CTRL_CLK_FRQ_POS | AUDIO20_CTRL_R << AUDIO20_CLOCK_SOURCE_CTRL_CLK_VAL_POS, /*_assocTerm*/ 0x01,  /*_stridx*/ 0x00),\\\n  /* Input Terminal Descriptor(4.7.2.4) */\\\n  TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ UAC2_ENTITY_INPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ UAC2_ENTITY_OUTPUT_TERMINAL, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_nchannelslogical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS, /*_stridx*/ 0x00),\\\n  /* Output Terminal Descriptor(4.7.2.5) */\\\n  TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ UAC2_ENTITY_OUTPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ UAC2_ENTITY_INPUT_TERMINAL, /*_srcid*/ UAC2_ENTITY_FEATURE_UNIT, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n  /* Feature Unit Descriptor(4.7.2.8) */\\\n  TUD_AUDIO20_DESC_FEATURE_UNIT(/*_unitid*/ UAC2_ENTITY_FEATURE_UNIT, /*_srcid*/ 0x01, /*_stridx*/ 0x00, /*_ctrlch0master*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch1*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ 0x00),\\\n  /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n  /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n  TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX),\\\n  /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n  TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_IN, /*_interval*/ 0x01),\\\n  /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000),\\\n  /* Interface 1, Alternate 2 - alternate interface for data streaming */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x02, /*_nEPs*/ 0x01, /*_stridx*/ 0x00),\\\n  /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n  /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n  TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX),\\\n  /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n  TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_IN, /*_interval*/ 0x01),\\\n  /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000)\n\n\n#endif\n"
  },
  {
    "path": "examples/device/board_test/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(board_test C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nif (RTOS STREQUAL zephyr)\n  set(EXE_NAME app)\nelse()\n  set(EXE_NAME ${PROJECT_NAME})\n  add_executable(${EXE_NAME})\nendif()\n\n# Example source\ntarget_sources(${EXE_NAME} PRIVATE\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  )\n\n# Example include\ntarget_include_directories(${EXE_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${EXE_NAME} ${RTOS})\n"
  },
  {
    "path": "examples/device/board_test/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/board_test/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/board_test/sdkconfig.defaults",
    "content": "CONFIG_IDF_CMAKE=y\nCONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y\nCONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y\n"
  },
  {
    "path": "examples/device/board_test/src/CMakeLists.txt",
    "content": "idf_component_register(SRCS \"main.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/board_test/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include \"bsp/board_api.h\"\n\n/* Blink pattern\n * - 250 ms  : button is not pressed\n * - 1000 ms : button is pressed (and hold)\n */\nenum {\n  BLINK_PRESSED = 250,\n  BLINK_UNPRESSED = 1000\n};\n\n#define HELLO_STR   \"Hello from TinyUSB\\r\\n\"\n\n// board test example does not use both device and host stack\n#if CFG_TUSB_OS != OPT_OS_NONE\nuint32_t tusb_time_millis_api(void) {\n  return osal_time_millis();\n}\n\nvoid tusb_time_delay_ms_api(uint32_t ms) {\n  osal_task_delay(ms);\n}\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n// Task parameter type: ULONG for ThreadX, void* for FreeRTOS and noos\n#if CFG_TUSB_OS == OPT_OS_THREADX\n  #define RTOS_PARAM ULONG\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  #define RTOS_PARAM void*\n  static void freertos_init(void);\n#else\n  #define RTOS_PARAM void*\n#endif\n\nstatic void board_test_loop(RTOS_PARAM param) {\n  (void) param;\n  uint32_t start_ms = 0;\n  (void) start_ms;\n  bool led_state = false;\n\n  while (1) {\n    uint32_t interval_ms = board_button_read() ? BLINK_PRESSED : BLINK_UNPRESSED;\n\n    int ch = board_getchar();\n    if (ch > 0) {\n      board_putchar(ch);\n      #ifndef LOGGER_UART\n      board_uart_write(&ch, 1);\n      #endif\n    }\n\n    // Blink and print every interval ms\n    #if CFG_TUSB_OS == OPT_OS_FREERTOS\n    vTaskDelay(interval_ms / portTICK_PERIOD_MS);\n    #elif CFG_TUSB_OS == OPT_OS_THREADX\n    tx_thread_sleep(_osal_ms2tick(interval_ms));\n    #else\n    if (tusb_time_millis_api() - start_ms < interval_ms) {\n      continue; // not enough time\n    }\n    #endif\n    start_ms = tusb_time_millis_api();\n\n    if (ch < 0) {\n      // skip if echoing\n      printf(HELLO_STR);\n\n      #ifndef LOGGER_UART\n      board_uart_write(HELLO_STR, sizeof(HELLO_STR)-1);\n      #endif\n    }\n\n    board_led_write(led_state);\n    led_state = !led_state; // toggle\n  }\n}\n\nint main(void) {\n  board_init();\n  board_led_write(true);\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  freertos_init();\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n  tx_kernel_enter();\n#else\n  board_test_loop(NULL);\n#endif\n\n  return 0;\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n//--------------------------------------------------------------------+\n// FreeRTOS\n//--------------------------------------------------------------------+\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n\n#ifdef ESP_PLATFORM\n#define MAIN_STACK_SIZE   4096\n#else\n#define MAIN_STACK_SIZE   512\n#endif\n\n#if configSUPPORT_STATIC_ALLOCATION\nstatic StackType_t  _main_stack[MAIN_STACK_SIZE];\nstatic StaticTask_t _main_taskdef;\n#endif\n\nstatic void freertos_init(void) {\n  #if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(board_test_loop, \"main\", MAIN_STACK_SIZE, NULL, 1, _main_stack, &_main_taskdef);\n  #else\n  xTaskCreate(board_test_loop, \"main\", MAIN_STACK_SIZE, NULL, 1, NULL);\n  #endif\n\n  #ifndef ESP_PLATFORM\n  vTaskStartScheduler();\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// ThreadX\n//--------------------------------------------------------------------+\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n\n#define MAIN_TASK_STACK_SIZE  1024\nstatic TX_THREAD _main_thread;\nstatic ULONG _main_thread_stack[MAIN_TASK_STACK_SIZE / sizeof(ULONG)];\n\nvoid tx_application_define(void *first_unused_memory) {\n  (void) first_unused_memory;\n  static CHAR main_thread_name[] = \"main\";\n  tx_thread_create(&_main_thread, main_thread_name, board_test_loop, 0,\n                   _main_thread_stack, MAIN_TASK_STACK_SIZE,\n                   1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);\n}\n#endif\n"
  },
  {
    "path": "examples/device/board_test/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n  #error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n  #define CFG_TUSB_OS               OPT_OS_NONE\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n// This example only test LED & GPIO, disable both device and host stack\n#define CFG_TUD_ENABLED   0\n#define CFG_TUH_ENABLED   0\n\n// CFG_TUSB_DEBUG is defined by compiler in DEBUG build\n// #define CFG_TUSB_DEBUG           0\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/cdc_dual_ports/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(cdc_dual_ports C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/cdc_dual_ports/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/cdc_dual_ports/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/cdc_dual_ports/skip.txt",
    "content": "board:stm32f407disco\nboard:stm32f411disco\n"
  },
  {
    "path": "examples/device/cdc_dual_ports/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nstatic void led_blinking_task(void);\nstatic void cdc_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    cdc_task();\n    led_blinking_task();\n  }\n}\n\n// echo to either Serial0 or Serial1\n// with Serial0 as all lower case, Serial1 as all upper case\nstatic void echo_serial_port(uint8_t itf, uint8_t buf[], uint32_t count) {\n  uint8_t const case_diff = 'a' - 'A';\n\n  for (uint32_t i = 0; i < count; i++) {\n    if (itf == 0) {\n      // echo back 1st port as lower case\n      if (isupper(buf[i])) {\n        buf[i] += case_diff;\n      }\n    } else {\n      // echo back 2nd port as upper case\n      if (islower(buf[i])) {\n        buf[i] -= case_diff;\n      }\n    }\n\n    tud_cdc_n_write_char(itf, buf[i]);\n  }\n  tud_cdc_n_write_flush(itf);\n}\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// USB CDC\n//--------------------------------------------------------------------+\nstatic void cdc_task(void) {\n  for (uint8_t itf = 0; itf < CFG_TUD_CDC; itf++) {\n    // connected() check for DTR bit\n    // Most but not all terminal client set this when making connection\n    // if ( tud_cdc_n_connected(itf) )\n    {\n      if (tud_cdc_n_available(itf)) {\n        uint8_t buf[64];\n        uint32_t count = tud_cdc_n_read(itf, buf, sizeof(buf));\n\n        // echo back to both serial ports\n        echo_serial_port(0, buf, count);\n        echo_serial_port(1, buf, count);\n      }\n\n      // Press on-board button to send Uart status notification\n      static uint32_t btn_prev = 0;\n      static cdc_notify_uart_state_t uart_state = { .value = 0 };\n      const uint32_t btn = board_button_read();\n      if (!btn_prev && btn) {\n        uart_state.dsr ^= 1;\n        tud_cdc_notify_uart_state(&uart_state);\n      }\n      btn_prev = btn;\n    }\n  }\n}\n\n// Invoked when cdc when line state changed e.g connected/disconnected\n// Use to reset to DFU when disconnect with 1200 bps\nvoid tud_cdc_line_state_cb(uint8_t instance, bool dtr, bool rts) {\n  (void)rts;\n\n  // DTR = false is counted as disconnected\n  if (!dtr) {\n    // touch1200 only with first CDC instance (Serial)\n    if (instance == 0) {\n      cdc_line_coding_t coding;\n      tud_cdc_get_line_coding(&coding);\n      if (coding.bit_rate == 1200) {\n        board_reset_to_bootloader();\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/cdc_dual_ports/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by board.mk\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               2\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n#define CFG_TUD_CDC_NOTIFY        1 // Enable use of notification endpoint\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/cdc_dual_ports/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n\n    // Use Interface Association Descriptor (IAD) for CDC\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum {\n  ITF_NUM_CDC_0 = 0,\n  ITF_NUM_CDC_0_DATA,\n  ITF_NUM_CDC_1,\n  ITF_NUM_CDC_1_DATA,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + CFG_TUD_CDC * TUD_CDC_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_CDC_0_NOTIF   0x81\n  #define EPNUM_CDC_0_OUT     0x02\n  #define EPNUM_CDC_0_IN      0x82\n\n  #define EPNUM_CDC_1_NOTIF   0x84\n  #define EPNUM_CDC_1_OUT     0x05\n  #define EPNUM_CDC_1_IN      0x85\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_CDC_0_NOTIF   0x83\n  #define EPNUM_CDC_0_OUT     0x02\n  #define EPNUM_CDC_0_IN      0x81\n\n  #define EPNUM_CDC_1_NOTIF   0x86\n  #define EPNUM_CDC_1_OUT     0x05\n  #define EPNUM_CDC_1_IN      0x84\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_0_NOTIF   0x81\n  #define EPNUM_CDC_0_OUT     0x02\n  #define EPNUM_CDC_0_IN      0x83\n\n  #define EPNUM_CDC_1_NOTIF   0x84\n  #define EPNUM_CDC_1_OUT     0x05\n  #define EPNUM_CDC_1_IN      0x86\n\n#else\n  #define EPNUM_CDC_0_NOTIF   0x81\n  #define EPNUM_CDC_0_OUT     0x02\n  #define EPNUM_CDC_0_IN      0x82\n\n  #define EPNUM_CDC_1_NOTIF   0x83\n  #define EPNUM_CDC_1_OUT     0x04\n  #define EPNUM_CDC_1_IN      0x84\n#endif\n\nstatic uint8_t const desc_fs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // 1st CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_0, 4, EPNUM_CDC_0_NOTIF, 16, EPNUM_CDC_0_OUT, EPNUM_CDC_0_IN, 64),\n\n  // 2nd CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_1, 4, EPNUM_CDC_1_NOTIF, 16, EPNUM_CDC_1_OUT, EPNUM_CDC_1_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\nstatic uint8_t const desc_hs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // 1st CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_0, 4, EPNUM_CDC_0_NOTIF, 16, EPNUM_CDC_0_OUT, EPNUM_CDC_0_IN, 512),\n\n  // 2nd CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC_1, 4, EPNUM_CDC_1_NOTIF, 16, EPNUM_CDC_1_OUT, EPNUM_CDC_1_IN, 512),\n};\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = USB_BCD,\n\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index;// for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration;\n}\n\n#endif// highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] = {\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n  \"TinyUSB CDC\",                 // 4: CDC Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) { return NULL; }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) { chr_count = max_count; }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/cdc_msc/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(cdc_msc C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nif (RTOS STREQUAL zephyr)\n  set(EXE_NAME app)\nelse()\n  set(EXE_NAME ${PROJECT_NAME})\n  add_executable(${EXE_NAME})\nendif()\n\n# Example source\ntarget_sources(${EXE_NAME} PRIVATE\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${EXE_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${EXE_NAME} ${RTOS})\n"
  },
  {
    "path": "examples/device/cdc_msc/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/cdc_msc/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n  src/main.c \\\n  src/msc_disk.c \\\n  src/usb_descriptors.c \\\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/cdc_msc/prj.conf",
    "content": "CONFIG_GPIO=y\nCONFIG_FPU=y\nCONFIG_NO_OPTIMIZATIONS=y\nCONFIG_UART_INTERRUPT_DRIVEN=y\nCONFIG_NRFX_POWER=y\n"
  },
  {
    "path": "examples/device/cdc_msc/skip.txt",
    "content": "mcu:SAMD11\nfamily:espressif\nboard:ch32v203g_r0_1v0\n"
  },
  {
    "path": "examples/device/cdc_msc/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED     = 1000,\n  BLINK_SUSPENDED   = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\nstatic bool     blink_enable      = true;\n\nvoid led_blinking_task(void);\nvoid cdc_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {.role = TUSB_ROLE_DEVICE, .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n\n    cdc_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void)remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n\n//--------------------------------------------------------------------+\n// USB CDC\n//--------------------------------------------------------------------+\nvoid cdc_task(void) {\n  // connected() check for DTR bit\n  // Most but not all terminal client set this when making connection\n  // if ( tud_cdc_connected() )\n  {\n    // connected and there are data available\n    if (tud_cdc_available()) {\n      // read data\n      char     buf[64];\n      uint32_t count = tud_cdc_read(buf, sizeof(buf));\n      (void)count;\n\n      // Echo back\n      // Note: Skip echo by commenting out write() and write_flush()\n      // for throughput test e.g\n      //    $ dd if=/dev/zero of=/dev/ttyACM0 count=10000\n      tud_cdc_write(buf, count);\n      tud_cdc_write_flush();\n    }\n\n    // Press on-board button to send Uart status notification\n    static cdc_notify_uart_state_t uart_state = {.value = 0};\n\n    static uint32_t btn_prev = 0;\n    const uint32_t  btn      = board_button_read();\n\n    if ((btn_prev == 0u) && (btn != 0u)) {\n      uart_state.dsr ^= 1;\n      uart_state.dcd ^= 1;\n      tud_cdc_notify_uart_state(&uart_state);\n    }\n    btn_prev = btn;\n  }\n}\n\n// Invoked when cdc when line state changed e.g connected/disconnected\nvoid tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {\n  (void)itf;\n  (void)rts;\n\n  if (dtr) {\n    // Terminal connected\n    blink_enable = false;\n    board_led_write(true);\n  } else {\n    // Terminal disconnected\n    blink_enable = true;\n  }\n}\n\n// Invoked when CDC interface received data from host\nvoid tud_cdc_rx_cb(uint8_t itf) {\n  (void)itf;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms  = 0;\n  static bool     led_state = false;\n\n  if (blink_enable) {\n    // Blink every interval ms\n    if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n      return; // not enough time\n    }\n    start_ms += blink_interval_ms;\n\n    board_led_write(led_state);\n    led_state = !led_state;\n  }\n}\n"
  },
  {
    "path": "examples/device/cdc_msc/src/msc_disk.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#if CFG_TUD_MSC\n\n// whether host does safe-eject\nstatic bool ejected = false;\n\n// Some MCU doesn't have enough 8KB SRAM to store the whole disk\n// We will use Flash as read-only disk with board that has\n// CFG_EXAMPLE_MSC_READONLY defined\n\n#define README_CONTENTS \\\n\"This is tinyusb's MassStorage Class demo.\\r\\n\\r\\n\\\nIf you find any bugs or get any questions, feel free to file an\\r\\n\\\nissue at github.com/hathach/tinyusb\"\n\nenum {\n  DISK_BLOCK_NUM = 16,// 8KB is the smallest size that windows allow to mount\n  DISK_BLOCK_SIZE = 512\n};\n\nstatic\n#ifdef CFG_EXAMPLE_MSC_READONLY\nconst\n#endif\nuint8_t msc_disk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] = {\n  //------------- Block0: Boot Sector -------------//\n  // byte_per_sector    = DISK_BLOCK_SIZE; fat12_sector_num_16  = DISK_BLOCK_NUM;\n  // sector_per_cluster = 1; reserved_sectors = 1;\n  // fat_num            = 1; fat12_root_entry_num = 16;\n  // sector_per_fat     = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0;\n  // drive_number       = 0x80; media_type = 0xf8; extended_boot_signature = 0x29;\n  // filesystem_type    = \"FAT12   \"; volume_serial_number = 0x1234; volume_label = \"TinyUSB MSC\";\n  // FAT magic code at offset 510-511\n  {\n      0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00,\n      0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x34, 0x12, 0x00, 0x00, 'T', 'i', 'n', 'y', 'U',\n      'S', 'B', ' ', 'M', 'S', 'C', 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00,\n\n      // Zero up to 2 last bytes of FAT magic code\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA\n  },\n\n  //------------- Block1: FAT12 Table -------------//\n  {\n      0xF8, 0xFF, 0xFF, 0xFF, 0x0F// first 2 entries must be F8FF, third entry is cluster end of readme file\n  },\n\n  //------------- Block2: Root Directory -------------//\n  {\n      // first entry is volume label\n      'T', 'i', 'n', 'y', 'U', 'S', 'B', ' ', 'M', 'S', 'C', 0x08, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      // second entry is readme file\n      'R', 'E', 'A', 'D', 'M', 'E', ' ', ' ', 'T', 'X', 'T', 0x20, 0x00, 0xC6, 0x52, 0x6D,\n      0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00,\n      sizeof(README_CONTENTS) - 1, 0x00, 0x00, 0x00// readme's files size (4 Bytes)\n  },\n\n  //------------- Block3: Readme Content -------------//\n  {README_CONTENTS}\n};\n\n// Invoked when received SCSI_CMD_INQUIRY, v2 with full inquiry response\n// Some inquiry_resp's fields are already filled with default values, application can update them\n// Return length of inquiry response, typically sizeof(scsi_inquiry_resp_t) (36 bytes), can be longer if included vendor data.\nuint32_t tud_msc_inquiry2_cb(uint8_t lun, scsi_inquiry_resp_t *inquiry_resp, uint32_t bufsize) {\n  (void) lun;\n  (void) bufsize;\n  const char vid[] = \"TinyUSB\";\n  const char pid[] = \"Mass Storage\";\n  const char rev[] = \"1.0\";\n\n  (void) strncpy((char*) inquiry_resp->vendor_id, vid, 8);\n  (void) strncpy((char*) inquiry_resp->product_id, pid, 16);\n  (void) strncpy((char*) inquiry_resp->product_rev, rev, 4);\n\n  return sizeof(scsi_inquiry_resp_t); // 36 bytes\n}\n\n// Invoked when received Test Unit Ready command.\n// return true allowing host to read/write this LUN e.g SD card inserted\nbool tud_msc_test_unit_ready_cb(uint8_t lun) {\n  (void) lun;\n\n  // RAM disk is ready until ejected\n  if (ejected) {\n    // Additional Sense 3A-00 is NOT_FOUND\n    return tud_msc_set_sense(lun, SCSI_SENSE_NOT_READY, 0x3a, 0x00);\n  }\n\n  return true;\n}\n\n// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size\n// Application update block count and block size\nvoid tud_msc_capacity_cb(uint8_t lun, uint32_t *block_count, uint16_t *block_size) {\n  (void) lun;\n  *block_count = DISK_BLOCK_NUM;\n  *block_size = DISK_BLOCK_SIZE;\n}\n\n// Invoked when received Start Stop Unit command\n// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage\n// - Start = 1 : active mode, if load_eject = 1 : load disk storage\nbool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject) {\n  (void) lun;\n  (void) power_condition;\n\n  if (load_eject) {\n    if (start) {\n      // load disk storage\n    } else {\n      // unload disk storage\n      ejected = true;\n    }\n  }\n\n  return true;\n}\n\n// Callback invoked when received READ10 command.\n// Copy disk's data to buffer (up to bufsize) and return number of copied bytes.\nint32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void *buffer, uint32_t bufsize) {\n  (void) lun;\n\n  // out of ramdisk\n  if (lba >= DISK_BLOCK_NUM) {\n    return -1;\n  }\n\n  // Check for overflow of offset + bufsize\n  if (lba * DISK_BLOCK_SIZE + offset + bufsize > DISK_BLOCK_NUM * DISK_BLOCK_SIZE) {\n    return -1;\n  }\n\n  uint8_t const *addr = msc_disk[lba] + offset;\n  (void) memcpy(buffer, addr, bufsize);\n\n  return (int32_t) bufsize;\n}\n\nbool tud_msc_is_writable_cb(uint8_t lun) {\n  (void) lun;\n\n  #ifdef CFG_EXAMPLE_MSC_READONLY\n  return false;\n  #else\n  return true;\n  #endif\n}\n\n// Callback invoked when received WRITE10 command.\n// Process data in buffer to disk's storage and return number of written bytes\nint32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t *buffer, uint32_t bufsize) {\n  (void) lun;\n\n  // out of ramdisk\n  if (lba >= DISK_BLOCK_NUM) {\n    return -1;\n  }\n\n  #ifndef CFG_EXAMPLE_MSC_READONLY\n  uint8_t *addr = msc_disk[lba] + offset;\n  (void) memcpy(addr, buffer, bufsize);\n  #else\n  (void) lba;\n  (void) offset;\n  (void) buffer;\n  #endif\n\n  return (int32_t) bufsize;\n}\n\n// Callback invoked when received an SCSI command not in built-in list below\n// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE\n// - READ10 and WRITE10 has their own callbacks\nint32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer, uint16_t bufsize) {\n  (void) lun;\n  (void) scsi_cmd;\n  (void) buffer;\n  (void) bufsize;\n\n  // currently no other commands are supported\n\n  // Set Sense = Invalid Command Operation\n  (void) tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);\n\n  return -1; // stall/failed command request;\n}\n\n#endif\n"
  },
  {
    "path": "examples/device/cdc_msc/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN    __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE   64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC              1\n#define CFG_TUD_MSC              1\n#define CFG_TUD_HID              0\n#define CFG_TUD_MIDI             0\n#define CFG_TUD_VENDOR           0\n\n#define CFG_TUD_CDC_NOTIFY        1 // Enable use of notification endpoint\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// MSC Buffer size of Device Mass storage\n#define CFG_TUD_MSC_EP_BUFSIZE   512\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/cdc_msc/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n\n    // Use Interface Association Descriptor (IAD) for CDC\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum {\n  ITF_NUM_CDC = 0,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_MSC,\n  ITF_NUM_TOTAL\n};\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n  #define EPNUM_MSC_OUT     0x05\n  #define EPNUM_MSC_IN      0x85\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_CDC_NOTIF   0x83\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x81\n\n  #define EPNUM_MSC_OUT     0x05\n  #define EPNUM_MSC_IN      0x84\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n\n  #define EPNUM_MSC_OUT     0x04\n  #define EPNUM_MSC_IN      0x85\n\n#else\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n  #define EPNUM_MSC_OUT     0x03\n  #define EPNUM_MSC_IN      0x83\n\n#endif\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN)\n\n// full speed configuration\nstatic uint8_t const desc_fs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 16, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\n\n// high speed configuration\nstatic uint8_t const desc_hs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 16, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 512),\n};\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n    .bLength            = sizeof(tusb_desc_device_qualifier_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n    .bcdUSB             = USB_BCD,\n\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n    .bNumConfigurations = 0x01,\n    .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] = {\n    (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n    \"TinyUSB\",                     // 1: Manufacturer\n    \"TinyUSB Device\",              // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"TinyUSB CDC\",                 // 4: CDC Interface\n    \"TinyUSB MSC\",                 // 5: MSC Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) { return NULL; }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) { chr_count = max_count; }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(cdc_msc_freertos C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example with FreeRTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} freertos)\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/Makefile",
    "content": "RTOS = freertos\ninclude ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE = \\\n\tsrc/main.c \\\n\tsrc/msc_disk.c \\\n\tsrc/usb_descriptors.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/sdkconfig.defaults",
    "content": "CONFIG_IDF_CMAKE=y\nCONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y\nCONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/skip.txt",
    "content": "mcu:CH32F20X\nmcu:CH32V103\nmcu:CH32V20X\nmcu:CH32V307\nmcu:CXD56\nmcu:F1C100S\nmcu:GD32VF103\nmcu:MCXA15\nmcu:MKL25ZXX\nmcu:MSP430x5xx\nmcu:FT90X\nmcu:RP2040\nmcu:SAMD11\nmcu:VALENTYUSB_EPTRI\nmcu:RAXXX\nmcu:STM32L0\nfamily:broadcom_32bit\nfamily:broadcom_64bit\nfamily:nuc121_125\nfamily:hpmicro\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\" \"usb_descriptors.c\" \"msc_disk.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#ifdef ESP_PLATFORM\n  #define USBD_STACK_SIZE     4096\n#else\n  // Increase stack size when debug log is enabled\n  #define USBD_STACK_SIZE    (3*configMINIMAL_STACK_SIZE/2) * (CFG_TUSB_DEBUG ? 2 : 1)\n#endif\n\n#define CDC_STACK_SIZE      (configMINIMAL_STACK_SIZE * (CFG_TUSB_DEBUG ? 2 : 1))\n#define BLINKY_STACK_SIZE   configMINIMAL_STACK_SIZE\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\n// static task\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t blinky_stack[BLINKY_STACK_SIZE];\nStaticTask_t blinky_taskdef;\n\nStackType_t  usb_device_stack[USBD_STACK_SIZE];\nStaticTask_t usb_device_taskdef;\n\nStackType_t  cdc_stack[CDC_STACK_SIZE];\nStaticTask_t cdc_taskdef;\n#endif\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nstatic void usb_device_task(void *param);\nvoid led_blinking_task(void* param);\nvoid cdc_task(void *params);\nextern void msc_disk_init(void);\n//--------------------------------------------------------------------+\n// Main\n//--------------------------------------------------------------------+\n\nint main(void) {\n  board_init();\n\n  // Create task for: tinyusb, blinky, cdc\n#if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);\n  xTaskCreateStatic(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_device_stack, &usb_device_taskdef);\n  xTaskCreateStatic(cdc_task, \"cdc\", CDC_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, cdc_stack, &cdc_taskdef);\n#else\n  xTaskCreate(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, NULL);\n  xTaskCreate(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(cdc_task, \"cdc\", CDC_STACK_SZIE, NULL, configMAX_PRIORITIES - 2, NULL);\n#endif\n\n#ifndef ESP_PLATFORM\n  // only start scheduler for non-espressif mcu\n  vTaskStartScheduler();\n#endif\n\n  return 0;\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n// USB Device Driver task\n// This top level thread process all usb events and invoke callbacks\nstatic void usb_device_task(void *param) {\n  (void) param;\n\n  // init device stack on configured roothub port\n  // This should be called after scheduler/kernel is started.\n  // Otherwise it could cause kernel issue since USB IRQ handler does use RTOS queue API.\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  msc_disk_init();\n  // RTOS forever loop\n  while (1) {\n    // put this thread to waiting state until there is new events\n    tud_task();\n\n    // following code only run if tud_task() process at least 1 event\n    tud_cdc_write_flush();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// USB CDC\n//--------------------------------------------------------------------+\nvoid cdc_task(void *params) {\n  (void) params;\n\n  // RTOS forever loop\n  while (1) {\n    // connected() check for DTR bit\n    // Most but not all terminal client set this when making connection\n    // if ( tud_cdc_connected() )\n    {\n      // There are data available\n      while (tud_cdc_available()) {\n        uint8_t buf[64];\n\n        // read and echo back\n        uint32_t count = tud_cdc_read(buf, sizeof(buf));\n        (void) count;\n\n        // Echo back\n        // Note: Skip echo by commenting out write() and write_flush()\n        // for throughput test e.g\n        //    $ dd if=/dev/zero of=/dev/ttyACM0 count=10000\n        tud_cdc_write(buf, count);\n      }\n\n      tud_cdc_write_flush();\n\n      // Press on-board button to send Uart status notification\n      static uint32_t btn_prev = 0;\n      static cdc_notify_uart_state_t uart_state = { .value = 0 };\n      const uint32_t btn = board_button_read();\n      if (!btn_prev && btn) {\n        uart_state.dsr ^= 1;\n        tud_cdc_notify_uart_state(&uart_state);\n      }\n      btn_prev = btn;\n    }\n\n    // For ESP32-Sx this delay is essential to allow idle how to run and reset watchdog\n    vTaskDelay(1);\n  }\n}\n\n// Invoked when cdc when line state changed e.g connected/disconnected\nvoid tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {\n  (void) itf;\n  (void) rts;\n\n  // TODO set some indicator\n  if (dtr) {\n    // Terminal connected\n  } else {\n    // Terminal disconnected\n  }\n}\n\n// Invoked when CDC interface received data from host\nvoid tud_cdc_rx_cb(uint8_t itf) {\n  (void) itf;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void* param) {\n  (void) param;\n    static bool led_state = false;\n\n  while (1) {\n    // Blink every interval ms\n    vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);\n\n    board_led_write(led_state);\n    led_state = 1 - led_state; // toggle\n  }\n}\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/src/msc_disk.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#if CFG_TUD_MSC\n\n// Use async IO in example or not\n#define CFG_EXAMPLE_MSC_ASYNC_IO    1\n\n// Simulate read/write operation delay\n#define CFG_EXAMPLE_MSC_IO_DELAY_MS 0\n\n#if CFG_EXAMPLE_MSC_ASYNC_IO\n#define IO_STACK_SIZE      configMINIMAL_STACK_SIZE\n\ntypedef struct {\n  uint8_t lun;\n  bool is_read;\n  uint32_t lba;\n  uint32_t offset;\n  void* buffer;\n  uint32_t bufsize;\n} io_ops_t;\n\nQueueHandle_t io_queue;\n#if configSUPPORT_STATIC_ALLOCATION\nuint8_t io_queue_buf[sizeof(io_ops_t)];\nStaticQueue_t io_queue_static;\nStackType_t  io_stack[IO_STACK_SIZE];\nStaticTask_t io_taskdef;\n#endif\n\nstatic void io_task(void *params);\n#endif\n\nvoid msc_disk_init(void);\n\n// whether host does safe-eject\nstatic bool ejected = false;\n\n// Some MCU doesn't have enough 8KB SRAM to store the whole disk\n// We will use Flash as read-only disk with board that has\n// CFG_EXAMPLE_MSC_READONLY defined\n\n#define README_CONTENTS \\\n\"This is tinyusb's MassStorage Class demo.\\r\\n\\r\\n\\\nIf you find any bugs or get any questions, feel free to file an\\r\\n\\\nissue at github.com/hathach/tinyusb\"\n\nenum {\n  DISK_BLOCK_NUM  = 16, // 8KB is the smallest size that windows allow to mount\n  DISK_BLOCK_SIZE = 512\n};\n\nstatic\n#ifdef CFG_EXAMPLE_MSC_READONLY\nconst\n#endif\nuint8_t msc_disk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] =\n{\n  //------------- Block0: Boot Sector -------------//\n  // byte_per_sector    = DISK_BLOCK_SIZE; fat12_sector_num_16  = DISK_BLOCK_NUM;\n  // sector_per_cluster = 1; reserved_sectors = 1;\n  // fat_num            = 1; fat12_root_entry_num = 16;\n  // sector_per_fat     = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0;\n  // drive_number       = 0x80; media_type = 0xf8; extended_boot_signature = 0x29;\n  // filesystem_type    = \"FAT12   \"; volume_serial_number = 0x1234; volume_label = \"TinyUSB MSC\";\n  // FAT magic code at offset 510-511\n  {\n      0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00,\n      0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x34, 0x12, 0x00, 0x00, 'T' , 'i' , 'n' , 'y' , 'U' ,\n      'S' , 'B' , ' ' , 'M' , 'S' , 'C' , 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00,\n\n      // Zero up to 2 last bytes of FAT magic code\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA\n  },\n\n  //------------- Block1: FAT12 Table -------------//\n  {\n      0xF8, 0xFF, 0xFF, 0xFF, 0x0F // // first 2 entries must be F8FF, third entry is cluster end of readme file\n  },\n\n  //------------- Block2: Root Directory -------------//\n  {\n      // first entry is volume label\n      'T' , 'i' , 'n' , 'y' , 'U' , 'S' , 'B' , ' ' , 'M' , 'S' , 'C' , 0x08, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      // second entry is readme file\n      'R' , 'E' , 'A' , 'D' , 'M' , 'E' , ' ' , ' ' , 'T' , 'X' , 'T' , 0x20, 0x00, 0xC6, 0x52, 0x6D,\n      0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00,\n      sizeof(README_CONTENTS)-1, 0x00, 0x00, 0x00 // readme's files size (4 Bytes)\n  },\n\n  //------------- Block3: Readme Content -------------//\n  README_CONTENTS\n};\n\n#if CFG_EXAMPLE_MSC_ASYNC_IO\nvoid msc_disk_init(void) {\n\n#if configSUPPORT_STATIC_ALLOCATION\n  io_queue = xQueueCreateStatic(1, sizeof(io_ops_t), io_queue_buf, &io_queue_static);\n  xTaskCreateStatic(io_task, \"io\", IO_STACK_SIZE, NULL, 2, io_stack, &io_taskdef);\n#else\n  io_queue = xQueueCreate(1, sizeof(io_ops_t));\n  xTaskCreate(io_task, \"io\", IO_STACK_SIZE, NULL, 2, NULL);\n#endif\n}\n\nstatic void io_task(void *params) {\n  (void) params;\n  io_ops_t io_ops;\n  while (1) {\n    if (xQueueReceive(io_queue, &io_ops, portMAX_DELAY)) {\n      uint8_t* addr = (uint8_t*) (uintptr_t) (msc_disk[io_ops.lba] + io_ops.offset);\n      int32_t nbytes = io_ops.bufsize;\n      if (io_ops.is_read) {\n        memcpy(io_ops.buffer, addr, io_ops.bufsize);\n      } else {\n#ifndef CFG_EXAMPLE_MSC_READONLY\n        memcpy((uint8_t*) addr, io_ops.buffer, io_ops.bufsize);\n#else\n        nbytes = -1; // failed to write\n#endif\n      }\n\n      tusb_time_delay_ms_api(CFG_EXAMPLE_MSC_IO_DELAY_MS);\n      tud_msc_async_io_done(nbytes, false);\n    }\n  }\n}\n\n#else\nvoid msc_disk_init() {}\n#endif\n\n// Invoked when received SCSI_CMD_INQUIRY, v2 with full inquiry response\n// Some inquiry_resp's fields are already filled with default values, application can update them\n// Return length of inquiry response, typically sizeof(scsi_inquiry_resp_t) (36 bytes), can be longer if included vendor data.\nuint32_t tud_msc_inquiry2_cb(uint8_t lun, scsi_inquiry_resp_t* inquiry_resp, uint32_t bufsize) {\n  (void) lun;\n  (void) bufsize;\n  const char vid[] = \"TinyUSB\";\n  const char pid[] = \"Mass Storage\";\n  const char rev[] = \"1.0\";\n\n  strncpy((char*) inquiry_resp->vendor_id, vid, 8);\n  strncpy((char*) inquiry_resp->product_id, pid, 16);\n  strncpy((char*) inquiry_resp->product_rev, rev, 4);\n\n  return sizeof(scsi_inquiry_resp_t); // 36 bytes\n}\n\n// Invoked when received Test Unit Ready command.\n// return true allowing host to read/write this LUN e.g SD card inserted\nbool tud_msc_test_unit_ready_cb(uint8_t lun) {\n  (void) lun;\n\n  // RAM disk is ready until ejected\n  if (ejected) {\n    // Additional Sense 3A-00 is NOT_FOUND\n    tud_msc_set_sense(lun, SCSI_SENSE_NOT_READY, 0x3a, 0x00);\n    return false;\n  }\n\n  return true;\n}\n\n// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size\n// Application update block count and block size\nvoid tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size) {\n  (void) lun;\n  *block_count = DISK_BLOCK_NUM;\n  *block_size  = DISK_BLOCK_SIZE;\n}\n\n// Invoked when received Start Stop Unit command\n// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage\n// - Start = 1 : active mode, if load_eject = 1 : load disk storage\nbool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject) {\n  (void) lun;\n  (void) power_condition;\n\n  if (load_eject) {\n    if (start) {\n      // load disk storage\n    } else {\n      // unload disk storage\n      ejected = true;\n    }\n  }\n\n  return true;\n}\n\n// Callback invoked when received READ10 command.\n// Copy disk's data to buffer (up to bufsize) and return number of copied bytes.\nint32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) {\n  (void) lun;\n\n  // out of ramdisk\n  if (lba >= DISK_BLOCK_NUM) {\n    return TUD_MSC_RET_ERROR;\n  }\n\n  // Check for overflow of offset + bufsize\n  if (lba * DISK_BLOCK_SIZE + offset + bufsize > DISK_BLOCK_NUM * DISK_BLOCK_SIZE) {\n    return TUD_MSC_RET_ERROR;\n  }\n\n  #if CFG_EXAMPLE_MSC_ASYNC_IO\n  io_ops_t io_ops = {.is_read = true, .lun = lun, .lba = lba, .offset = offset, .buffer = buffer, .bufsize = bufsize};\n\n  // Send IO operation to IO task\n  TU_ASSERT(xQueueSend(io_queue, &io_ops, 0) == pdPASS);\n\n  return TUD_MSC_RET_ASYNC;\n  #else\n  uint8_t const *addr = msc_disk[lba] + offset;\n  memcpy(buffer, addr, bufsize);\n  return bufsize;\n  #endif\n}\n\nbool tud_msc_is_writable_cb (uint8_t lun) {\n  (void) lun;\n\n  #ifdef CFG_EXAMPLE_MSC_READONLY\n  return false;\n  #else\n  return true;\n  #endif\n}\n\n// Callback invoked when received WRITE10 command.\n// Process data in buffer to disk's storage and return number of written bytes\nint32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize) {\n  // out of ramdisk\n  if (lba >= DISK_BLOCK_NUM) {\n    return TUD_MSC_RET_ERROR;\n  }\n\n  // Check for overflow of offset + bufsize\n  if (lba * DISK_BLOCK_SIZE + offset + bufsize > DISK_BLOCK_NUM * DISK_BLOCK_SIZE) {\n    return TUD_MSC_RET_ERROR;\n  }\n\n#ifdef CFG_EXAMPLE_MSC_READONLY\n  (void) lun;\n  (void) buffer;\n  return bufsize;\n#elif CFG_EXAMPLE_MSC_ASYNC_IO\n  io_ops_t io_ops = {.is_read = false, .lun = lun, .lba = lba, .offset = offset, .buffer = buffer, .bufsize = bufsize};\n\n  // Send IO operation to IO task\n  TU_ASSERT(xQueueSend(io_queue, &io_ops, 0) == pdPASS);\n\n  return TUD_MSC_RET_ASYNC;\n  #else\n  uint8_t *addr = msc_disk[lba] + offset;\n  memcpy(addr, buffer, bufsize);\n  tusb_time_delay_ms_api(CFG_EXAMPLE_MSC_IO_DELAY_MS);\n\n  return bufsize;\n#endif\n}\n\n// Callback invoked when received an SCSI command not in built-in list below\n// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE\n// - READ10 and WRITE10 has their own callbacks\nint32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize) {\n  (void) lun;\n  (void) scsi_cmd;\n  (void) buffer;\n  (void) bufsize;\n\n  // currently no other commands are supported\n\n  // Set Sense = Invalid Command Operation\n  (void) tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);\n\n  return -1; // stall/failed command request;\n}\n\n#endif\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT     0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by board.mk\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n// This examples use FreeRTOS\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_FREERTOS\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n// can be defined by compiler in DEBUG build\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN    __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE   64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC              1\n#define CFG_TUD_MSC              1\n#define CFG_TUD_HID              0\n#define CFG_TUD_MIDI             0\n#define CFG_TUD_VENDOR           0\n\n#define CFG_TUD_CDC_NOTIFY        1 // Enable use of notification endpoint\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// MSC Buffer size of Device Mass storage\n#define CFG_TUD_MSC_EP_BUFSIZE   512\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/cdc_msc_freertos/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n\n    // Use Interface Association Descriptor (IAD) for CDC\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum {\n  ITF_NUM_CDC = 0,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_MSC,\n  ITF_NUM_TOTAL\n};\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n  #define EPNUM_MSC_OUT     0x05\n  #define EPNUM_MSC_IN      0x85\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_CDC_NOTIF   0x83\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x81\n\n  #define EPNUM_MSC_OUT     0x05\n  #define EPNUM_MSC_IN      0x84\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n\n  #define EPNUM_MSC_OUT     0x04\n  #define EPNUM_MSC_IN      0x85\n\n#else\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n  #define EPNUM_MSC_OUT     0x03\n  #define EPNUM_MSC_IN      0x83\n\n#endif\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN)\n\nstatic uint8_t const desc_fs_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 16, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\n\n// high speed configuration\nstatic uint8_t const desc_hs_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 16, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 5, EPNUM_MSC_OUT, EPNUM_MSC_IN, 512),\n};\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier =\n{\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = USB_BCD,\n\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const*) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] = {\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n  \"TinyUSB CDC\",                 // 4: CDC Interface\n  \"TinyUSB MSC\",                 // 5: MSC Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) { return NULL; }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) { chr_count = max_count; }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/cdc_uac2/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(cdc_uac2 C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/cdc_app.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/uac2_app.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example... see the corresponding function\n# in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n\n# Uncomment me to enable UART based debugging\n# pico_enable_stdio_uart(${PROJECT_NAME} 1)\n"
  },
  {
    "path": "examples/device/cdc_uac2/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/cdc_uac2/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n  src/cdc_app.c \\\n  src/main.c \\\n  src/uac2_app.c \\\n  src/usb_descriptors.c \\\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/cdc_uac2/README.md",
    "content": "#### Composite CDC + UAC2 on Pico\n\nThis example provides a composite CDC + UAC2 device on top of a Raspberry Pi\nPico board.\n\n\n#### Use Cases\n\n- The CDC + UAC2 composite device happens to be important, especially in the\n  amateur radio community.\n\n  Modern radios (`rigs`) like Icom IC-7300 + IC-705 expose a sound card and a\n  serial device (`composite device`) to the computer over a single USB cable.\n  This allows for Audio I/O and CAT control over a single USB cable which is\n  very convenient.\n\n  By including and maintaining this example in TinyUSB repository, we enable\n  the amateur radio community to build (`homebrew`) radios with similar\n  functionality as the (expensive) commercial rigs.\n\n  This PR is important in bridging this specific gap between the commercial\n  rigs and homebrew equipment.\n\n- https://digirig.net/digirig-mobile-rev-1-9/ is a digital interface for\n  interfacing radios (that lack an inbuilt digital interface) with computers.\n  Digirig Mobile works brilliantly (is OSS!) and is a big improvement over\n  traditional digital interfaces (like the SignaLink USB Interface). By using a\n  Raspberry Pi Pico powered CDC + UAC2 composite device, we can simplify the\n  Digirig Mobile schematic, drastically reduce the manufacturing cost, and\n  (again) enable the homebrewers community to homebrew a modern digital interface\n  with ease themselves.\n\n\n#### Build Steps\n\n```\ncd examples/device/cdc_uac2\n\nexport PICO_SDK_PATH=$HOME/pico-sdk\n\ncmake -DFAMILY=rp2040 pico .\n\ncmake -DFAMILY=rp2040 -DCMAKE_BUILD_TYPE=Debug # use this for debugging\n\nmake BOARD=raspberry_pi_pico all\n```\n\n\n#### Development Notes\n\nPlease try to keep this code synchronized with the `uac2_headset` example\nincluded in this repository.\n"
  },
  {
    "path": "examples/device/cdc_uac2/skip.txt",
    "content": "mcu:LPC11UXX\nmcu:LPC13XX\nmcu:NUC121\nmcu:SAMD11\nmcu:SAME5X\nmcu:SAMG\nboard:stm32l052dap52\nfamily:espressif\n"
  },
  {
    "path": "examples/device/cdc_uac2/src/cdc_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2022 Angel Molina (angelmolinu@gmail.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"common.h\"\n\n// Invoked when cdc when line state changed e.g connected/disconnected\nvoid tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {\n  (void) itf;\n  (void) rts;\n\n  if (dtr) {\n    // Terminal connected\n  } else {\n    // Terminal disconnected\n  }\n}\n\n// Invoked when CDC interface received data from host\nvoid tud_cdc_rx_cb(uint8_t itf) {\n  uint8_t buf[64];\n  uint32_t count;\n\n  // connected() check for DTR bit\n  // Most but not all terminal client set this when making connection\n  if (tud_cdc_connected()) {\n    if (tud_cdc_available() > 0) {\n      count = tud_cdc_n_read(itf, buf, sizeof(buf));\n      (void) count;\n\n      tud_cdc_n_write(itf, buf, count);\n      tud_cdc_n_write_flush(itf);\n      // dummy code to check that cdc serial is responding\n      board_led_write(0);\n      board_delay(50);\n      board_led_write(1);\n      board_delay(50);\n      board_led_write(0);\n    }\n  }\n}\n"
  },
  {
    "path": "examples/device/cdc_uac2/src/common.h",
    "content": "#ifndef __COMMON_H__\n#define __COMMON_H__\n\n/* Blink pattern\n * - 25 ms   : streaming data\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum\n{\n  BLINK_STREAMING = 25,\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nenum\n{\n  VOLUME_CTRL_0_DB = 0,\n  VOLUME_CTRL_10_DB = 2560,\n  VOLUME_CTRL_20_DB = 5120,\n  VOLUME_CTRL_30_DB = 7680,\n  VOLUME_CTRL_40_DB = 10240,\n  VOLUME_CTRL_50_DB = 12800,\n  VOLUME_CTRL_60_DB = 15360,\n  VOLUME_CTRL_70_DB = 17920,\n  VOLUME_CTRL_80_DB = 20480,\n  VOLUME_CTRL_90_DB = 23040,\n  VOLUME_CTRL_100_DB = 25600,\n  VOLUME_CTRL_SILENCE = 0x8000,\n};\n\nvoid led_blinking_task(void);\nvoid audio_task(void);\n\n#endif\n"
  },
  {
    "path": "examples/device/cdc_uac2/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenberg\n * Copyright (c) 2022 Angel Molina <angelmolinu@gmail.com>\n * Copyright (c) 2023 Dhiru Kholia <dhiru.kholia@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"common.h\"\n\nextern uint32_t blink_interval_ms;\n\n#if (CFG_TUSB_MCU == OPT_MCU_RP2040)\n#include \"pico/stdlib.h\"\n#endif\n\n/*------------- MAIN -------------*/\nint main(void)\n{\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n#if (CFG_TUSB_MCU == OPT_MCU_RP2040)\n  stdio_init_all();\n#endif\n\n  TU_LOG1(\"CDC UAC2 example running\\r\\n\");\n\n  while (1)\n  {\n    tud_task(); // TinyUSB device task\n    led_blinking_task();\n    audio_task();\n#if (CFG_TUSB_MCU == OPT_MCU_RP2040)\n    // printf(\"Hello, world!\\r\\n\");\n#endif\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void)\n{\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void)\n{\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en)\n{\n  (void)remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void)\n{\n  blink_interval_ms = BLINK_MOUNTED;\n}\n"
  },
  {
    "path": "examples/device/cdc_uac2/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               1\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_AUDIO             1\n#define CFG_TUD_VENDOR            0\n\n//--------------------------------------------------------------------\n// AUDIO CLASS DRIVER CONFIGURATION\n//--------------------------------------------------------------------\n\n// How many formats are used, need to adjust USB descriptor if changed\n#define CFG_TUD_AUDIO_FUNC_1_N_FORMATS                               2\n\n// Audio format type I specifications\n#if defined(__RX__)\n#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE                         48000     // 16bit/48kHz is the best quality for Renesas RX\n#else\n#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE                         96000     // 24bit/96kHz is the best quality for full-speed, high-speed is needed beyond this\n#endif\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX                           1\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX                           1         // Changed\n\n// 16bit in 16bit slots\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX          2\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX                  16\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX          2\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX                  16\n\n#if defined(__RX__)\n// 8bit in 8bit slots\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX          1\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_TX                  8\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX          1\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX                  8\n#else\n// 24bit in 32bit slots\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX          4\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_TX                  24\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX          4\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX                  24\n#endif\n\n// EP and buffer size - for isochronous EP´s, the buffer and EP size are equal (different sizes would not make sense)\n#define CFG_TUD_AUDIO_ENABLE_EP_IN                1\n\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_IN    TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_EP_SZ_IN    TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX         TU_MAX(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_IN, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_IN) // Maximum EP IN size for all AS alternate settings used\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ      (TUD_OPT_HIGH_SPEED ? 32 : 4) * CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX // Example read FIFO every 1ms, so it should be 8 times larger for HS device\n\n// EP and buffer size - for isochronous EP´s, the buffer and EP size are equal (different sizes would not make sense)\n#define CFG_TUD_AUDIO_ENABLE_EP_OUT               1\n\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_OUT   TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX)\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_EP_SZ_OUT   TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX)\n\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX        TU_MAX(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_OUT, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_EP_SZ_OUT) // Maximum EP IN size for all AS alternate settings used\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ     (TUD_OPT_HIGH_SPEED ? 32 : 4) * CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX // Example read FIFO every 1ms, so it should be 8 times larger for HS device\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/cdc_uac2/src/uac2_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenberg\n * Copyright (c) 2022 Angel Molina (angelmolinu@gmail.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n#include \"common.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\n\n// List of supported sample rates\nconst uint32_t sample_rates[] = {44100, 48000};\nuint32_t current_sample_rate  = 44100;\n\n#define N_SAMPLE_RATES  TU_ARRAY_SIZE(sample_rates)\n\nuint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Audio controls\n// Current states\nint8_t mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];       // +1 for master channel 0\nint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];    // +1 for master channel 0\n\n// Buffer for speaker data\nint32_t spk_buf[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ / 4];\n// Speaker data size received in the last frame\nuint16_t spk_data_size;\n// Resolution per format\nconst uint8_t resolutions_per_format[CFG_TUD_AUDIO_FUNC_1_N_FORMATS] = {CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX};\n// Current resolution, update on format change\nuint8_t current_resolution;\n\n//--------------------------------------------------------------------+\n// AUDIO Task\n//--------------------------------------------------------------------+\n\n// This task simulates an audio transfer callback, one frame is sent/received every 1ms.\n// In a real application, this would be replaced with actual I2S send/receive callback.\nvoid audio_task(void) {\n  static uint32_t start_ms = 0;\n  uint32_t curr_ms = tusb_time_millis_api();\n  if (start_ms == curr_ms) {\n    return; // not enough time\n  }\n  start_ms = curr_ms;\n  // When new data arrived, copy data from speaker buffer, to microphone buffer\n  // and send it over\n  // Only support speaker & headphone both have the same resolution\n  // If one is 16bit another is 24bit be care of LOUD noise !\n  spk_data_size = tud_audio_read(spk_buf, sizeof(spk_buf));\n  if (spk_data_size) {\n      tud_audio_write((uint8_t *) spk_buf, spk_data_size);\n  }\n}\n\n// Helper for clock get requests\nstatic bool tud_audio_clock_get_request(uint8_t rhport, audio20_control_request_t const *request)\n{\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_CLOCK);\n\n  if (request->bControlSelector == AUDIO20_CS_CTRL_SAM_FREQ)\n  {\n    if (request->bRequest == AUDIO20_CS_REQ_CUR)\n    {\n      TU_LOG1(\"Clock get current freq %\" PRIu32 \"\\r\\n\", current_sample_rate);\n\n      audio20_control_cur_4_t curf = { (int32_t) tu_htole32(current_sample_rate) };\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *)request, &curf, sizeof(curf));\n    }\n    else if (request->bRequest == AUDIO20_CS_REQ_RANGE)\n    {\n      audio20_control_range_4_n_t(N_SAMPLE_RATES) rangef =\n      {\n        .wNumSubRanges = tu_htole16(N_SAMPLE_RATES)\n      };\n      TU_LOG1(\"Clock get %d freq ranges\\r\\n\", N_SAMPLE_RATES);\n      for(uint8_t i = 0; i < N_SAMPLE_RATES; i++)\n      {\n        rangef.subrange[i].bMin = (int32_t) sample_rates[i];\n        rangef.subrange[i].bMax = (int32_t) sample_rates[i];\n        rangef.subrange[i].bRes = 0;\n        TU_LOG1(\"Range %d (%d, %d, %d)\\r\\n\", i, (int)rangef.subrange[i].bMin, (int)rangef.subrange[i].bMax, (int)rangef.subrange[i].bRes);\n      }\n\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *)request, &rangef, sizeof(rangef));\n    }\n  }\n  else if (request->bControlSelector == AUDIO20_CS_CTRL_CLK_VALID &&\n           request->bRequest == AUDIO20_CS_REQ_CUR)\n  {\n    audio20_control_cur_1_t cur_valid = { .bCur = 1 };\n    TU_LOG1(\"Clock get is valid %u\\r\\n\", cur_valid.bCur);\n    return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *)request, &cur_valid, sizeof(cur_valid));\n  }\n  TU_LOG1(\"Clock get request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n  return false;\n}\n\n// Helper for clock set requests\nstatic bool tud_audio_clock_set_request(uint8_t rhport, audio20_control_request_t const *request, uint8_t const *buf)\n{\n  (void)rhport;\n\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_CLOCK);\n  TU_VERIFY(request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  if (request->bControlSelector == AUDIO20_CS_CTRL_SAM_FREQ)\n  {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_4_t));\n\n    current_sample_rate = (uint32_t) ((audio20_control_cur_4_t const *)buf)->bCur;\n\n    TU_LOG1(\"Clock set current freq: %\" PRIu32 \"\\r\\n\", current_sample_rate);\n\n    return true;\n  }\n  else\n  {\n    TU_LOG1(\"Clock set request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n    return false;\n  }\n}\n\n// Helper for feature unit get requests\nstatic bool tud_audio_feature_unit_get_request(uint8_t rhport, audio20_control_request_t const *request)\n{\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_SPK_FEATURE_UNIT);\n\n  if (request->bControlSelector == AUDIO20_FU_CTRL_MUTE && request->bRequest == AUDIO20_CS_REQ_CUR)\n  {\n    audio20_control_cur_1_t mute1 = { .bCur = mute[request->bChannelNumber] };\n    TU_LOG1(\"Get channel %u mute %d\\r\\n\", request->bChannelNumber, mute1.bCur);\n    return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *)request, &mute1, sizeof(mute1));\n  }\n  else if (request->bControlSelector == AUDIO20_FU_CTRL_VOLUME)\n  {\n    if (request->bRequest == AUDIO20_CS_REQ_RANGE)\n    {\n      audio20_control_range_2_n_t(1) range_vol = {\n        .wNumSubRanges = tu_htole16(1),\n        .subrange[0] = { .bMin = tu_htole16(-VOLUME_CTRL_50_DB), tu_htole16(VOLUME_CTRL_0_DB), tu_htole16(256) }\n      };\n      TU_LOG1(\"Get channel %u volume range (%d, %d, %u) dB\\r\\n\", request->bChannelNumber,\n              range_vol.subrange[0].bMin / 256, range_vol.subrange[0].bMax / 256, range_vol.subrange[0].bRes / 256);\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *)request, &range_vol, sizeof(range_vol));\n    }\n    else if (request->bRequest == AUDIO20_CS_REQ_CUR)\n    {\n      audio20_control_cur_2_t cur_vol = { .bCur = tu_htole16(volume[request->bChannelNumber]) };\n      TU_LOG1(\"Get channel %u volume %d dB\\r\\n\", request->bChannelNumber, cur_vol.bCur / 256);\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *)request, &cur_vol, sizeof(cur_vol));\n    }\n  }\n  TU_LOG1(\"Feature unit get request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n\n  return false;\n}\n\n// Helper for feature unit set requests\nstatic bool tud_audio_feature_unit_set_request(uint8_t rhport, audio20_control_request_t const *request, uint8_t const *buf)\n{\n  (void)rhport;\n\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_SPK_FEATURE_UNIT);\n  TU_VERIFY(request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  if (request->bControlSelector == AUDIO20_FU_CTRL_MUTE)\n  {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_1_t));\n\n    mute[request->bChannelNumber] = ((audio20_control_cur_1_t const *)buf)->bCur;\n\n    TU_LOG1(\"Set channel %d Mute: %d\\r\\n\", request->bChannelNumber, mute[request->bChannelNumber]);\n\n    return true;\n  }\n  else if (request->bControlSelector == AUDIO20_FU_CTRL_VOLUME)\n  {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_2_t));\n\n    volume[request->bChannelNumber] = ((audio20_control_cur_2_t const *)buf)->bCur;\n\n    TU_LOG1(\"Set channel %d volume: %d dB\\r\\n\", request->bChannelNumber, volume[request->bChannelNumber] / 256);\n\n    return true;\n  }\n  else\n  {\n    TU_LOG1(\"Feature unit set request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n    return false;\n  }\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API Implementations\n//--------------------------------------------------------------------+\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  audio20_control_request_t const *request = (audio20_control_request_t const *)p_request;\n\n  if (request->bEntityID == UAC2_ENTITY_CLOCK) {\n    return tud_audio_clock_get_request(rhport, request);\n  }\n  if (request->bEntityID == UAC2_ENTITY_SPK_FEATURE_UNIT) {\n    return tud_audio_feature_unit_get_request(rhport, request);\n  } else {\n    TU_LOG1(\"Get request not handled, entity = %d, selector = %d, request = %d\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n  }\n  return false;\n}\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *buf) {\n  audio20_control_request_t const *request = (audio20_control_request_t const *)p_request;\n\n  if (request->bEntityID == UAC2_ENTITY_SPK_FEATURE_UNIT) {\n    return tud_audio_feature_unit_set_request(rhport, request, buf);\n  }\n  if (request->bEntityID == UAC2_ENTITY_CLOCK) {\n    return tud_audio_clock_set_request(rhport, request, buf);\n  }\n  TU_LOG1(\"Set request not handled, entity = %d, selector = %d, request = %d\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n\n  return false;\n}\n\nbool tud_audio_set_itf_close_ep_cb(uint8_t rhport, tusb_control_request_t const * p_request)\n{\n  (void)rhport;\n\n  uint8_t const itf = tu_u16_low(tu_le16toh(p_request->wIndex));\n  uint8_t const alt = tu_u16_low(tu_le16toh(p_request->wValue));\n\n  if (ITF_NUM_AUDIO_STREAMING_SPK == itf && alt == 0) {\n    // Audio streaming stop\n    blink_interval_ms = BLINK_MOUNTED;\n  }\n\n  return true;\n}\n\nbool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const * p_request)\n{\n  (void)rhport;\n  uint8_t const itf = tu_u16_low(tu_le16toh(p_request->wIndex));\n  uint8_t const alt = tu_u16_low(tu_le16toh(p_request->wValue));\n\n  TU_LOG2(\"Set interface %d alt %d\\r\\n\", itf, alt);\n  if (ITF_NUM_AUDIO_STREAMING_SPK == itf && alt != 0) {\n    // Audio streaming start\n    blink_interval_ms = BLINK_STREAMING;\n  }\n\n  if(alt != 0)\n  {\n    current_resolution = resolutions_per_format[alt-1];\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void)\n{\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return;\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;\n}\n"
  },
  {
    "path": "examples/device/cdc_uac2/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Jerzy Kasenberg\n * Copyright (c) 2022 Angel Molina (angelmolinu@gmail.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VENDOR, 5) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD)\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *)&desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n#define CONFIG_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO_HEADSET_STEREO_DESC_LEN + CFG_TUD_CDC * TUD_CDC_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_AUDIO_IN    0x03\n  #define EPNUM_AUDIO_OUT   0x03\n\n  #define EPNUM_CDC_NOTIF   0x84\n  #define EPNUM_CDC_OUT     0x05\n  #define EPNUM_CDC_IN      0x85\n\n#elif CFG_TUSB_MCU == OPT_MCU_NRF5X\n  // ISO endpoints for NRF5x are fixed to 0x08 (0x88)\n  #define EPNUM_AUDIO_IN    0x08\n  #define EPNUM_AUDIO_OUT   0x08\n\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_AUDIO_IN    0x01\n  #define EPNUM_AUDIO_OUT   0x02\n\n  #define EPNUM_CDC_NOTIF   0x83\n  #define EPNUM_CDC_OUT     0x04\n  #define EPNUM_CDC_IN      0x85\n\n#else\n  #define EPNUM_AUDIO_IN    0x01\n  #define EPNUM_AUDIO_OUT   0x01\n\n  #define EPNUM_CDC_NOTIF   0x83\n  #define EPNUM_CDC_OUT     0x04\n  #define EPNUM_CDC_IN      0x84\n#endif\n\nstatic uint8_t const desc_fs_configuration[] =\n{\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_AUDIO_HEADSET_STEREO_DESCRIPTOR(2, EPNUM_AUDIO_OUT, EPNUM_AUDIO_IN | 0x80),\n\n    // CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 6, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64)\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\n\n// high speed configuration\nstatic uint8_t const desc_hs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_AUDIO_HEADSET_STEREO_DESCRIPTOR(2, EPNUM_AUDIO_OUT, EPNUM_AUDIO_IN | 0x80),\n\n    // CDC: Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 6, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512)\n};\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n    .bLength            = sizeof(tusb_desc_device_qualifier_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n    .bcdUSB             = 0x0100,\n\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n    .bNumConfigurations = 0x01,\n    .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void)index; // for multiple configurations\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 },  // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                      // 1: Manufacturer\n  \"TinyUSB headset\",              // 2: Product\n  NULL,                           // 3: Serials will use unique ID if possible\n  \"TinyUSB Speakers\",             // 4: Audio Interface\n  \"TinyUSB Microphone\",           // 5: Audio Interface\n  \"TinyUSB CDC\",                  // 6: Audio Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/cdc_uac2/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenbreg\n * Copyright (c) 2022 Angel Molina (angelmolinu@gmail.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\n// #include \"tusb.h\"\n\n// Unit numbers are arbitrary selected\n#define UAC2_ENTITY_CLOCK               0x04\n// Speaker path\n#define UAC2_ENTITY_SPK_INPUT_TERMINAL  0x01\n#define UAC2_ENTITY_SPK_FEATURE_UNIT    0x02\n#define UAC2_ENTITY_SPK_OUTPUT_TERMINAL 0x03\n// Microphone path\n#define UAC2_ENTITY_MIC_INPUT_TERMINAL  0x11\n#define UAC2_ENTITY_MIC_OUTPUT_TERMINAL 0x13\n\nenum\n{\n  ITF_NUM_AUDIO_CONTROL = 0,\n  ITF_NUM_AUDIO_STREAMING_SPK,\n  ITF_NUM_AUDIO_STREAMING_MIC,\n  ITF_NUM_CDC,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_TOTAL\n};\n\n#define TUD_AUDIO_HEADSET_STEREO_DESC_LEN (TUD_AUDIO20_DESC_IAD_LEN\\\n    + TUD_AUDIO20_DESC_STD_AC_LEN\\\n    + TUD_AUDIO20_DESC_CS_AC_LEN\\\n    + TUD_AUDIO20_DESC_CLK_SRC_LEN\\\n    + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(2)\\\n    + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n    /* Interface 1, Alternate 2 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n    /* Interface 2, Alternate 0 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    /* Interface 2, Alternate 1 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n    /* Interface 2, Alternate 2 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN)\n\n#define TUD_AUDIO_HEADSET_STEREO_DESCRIPTOR(_stridx, _epout, _epin) \\\n    /* Standard Interface Association Descriptor (IAD) */\\\n    TUD_AUDIO20_DESC_IAD(/*_firstitfs*/ ITF_NUM_AUDIO_CONTROL, /*_nitfs*/ 3, /*_stridx*/ 0x00),\\\n    /* Standard AC Interface Descriptor(4.7.1) */\\\n    TUD_AUDIO20_DESC_STD_AC(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n    /* Class-Specific AC Interface Header Descriptor(4.7.2) */\\\n    TUD_AUDIO20_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO20_FUNC_HEADSET, /*_totallen*/ TUD_AUDIO20_DESC_CLK_SRC_LEN+TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(2)+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN, /*_ctrl*/ AUDIO20_CS_AS_INTERFACE_CTRL_LATENCY_POS),\\\n    /* Clock Source Descriptor(4.7.2.1) */\\\n    TUD_AUDIO20_DESC_CLK_SRC(/*_clkid*/ UAC2_ENTITY_CLOCK, /*_attr*/ 3, /*_ctrl*/ 7, /*_assocTerm*/ 0x00,  /*_stridx*/ 0x00),    \\\n    /* Input Terminal Descriptor(4.7.2.4) */\\\n    TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x00, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_nchannelslogical*/ 0x02, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ 0 * (AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS), /*_stridx*/ 0x00),\\\n    /* Feature Unit Descriptor(4.7.2.8) */\\\n    TUD_AUDIO20_DESC_FEATURE_UNIT(/*_unitid*/ UAC2_ENTITY_SPK_FEATURE_UNIT, /*_srcid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_stridx*/ 0x00, /*_ctrlch0master*/ (AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS), /*_ctrlch1*/ (AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS), /*_ctrlch2*/ (AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS)),\\\n    /* Output Terminal Descriptor(4.7.2.5) */\\\n    TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ UAC2_ENTITY_SPK_OUTPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_OUT_HEADPHONES, /*_assocTerm*/ 0x00, /*_srcid*/ UAC2_ENTITY_SPK_FEATURE_UNIT, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n    /* Input Terminal Descriptor(4.7.2.4) */\\\n    TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ UAC2_ENTITY_MIC_INPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ 0x00, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_nchannelslogical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ 0 * (AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS), /*_stridx*/ 0x00),\\\n    /* Output Terminal Descriptor(4.7.2.5) */\\\n    TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x00, /*_srcid*/ UAC2_ENTITY_MIC_INPUT_TERMINAL, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n    /* Standard AS Interface Descriptor(4.9.1) */\\\n    /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_SPK), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x05),\\\n    /* Standard AS Interface Descriptor(4.9.1) */\\\n    /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_SPK), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ 0x05),\\\n    /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n    /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n    TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n    TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (uint8_t) (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_ADAPTIVE | TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX), /*_interval*/ 0x01),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC, /*_lockdelay*/ 0x0001),\\\n    /* Interface 1, Alternate 2 - alternate interface for data streaming */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_SPK), /*_altset*/ 0x02, /*_nEPs*/ 0x01, /*_stridx*/ 0x05),\\\n    /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n    /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n    TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n    TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (uint8_t) (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_ADAPTIVE | TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX), /*_interval*/ 0x01),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC, /*_lockdelay*/ 0x0001),\\\n    /* Standard AS Interface Descriptor(4.9.1) */\\\n    /* Interface 2, Alternate 0 - default alternate setting with 0 bandwidth */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_MIC), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x04),\\\n    /* Standard AS Interface Descriptor(4.9.1) */\\\n    /* Interface 2, Alternate 1 - alternate interface for data streaming */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_MIC), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ 0x04),\\\n    /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n    /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n    TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n    TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (uint8_t) (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_ASYNCHRONOUS | TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX), /*_interval*/ 0x01),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000),\\\n    /* Interface 2, Alternate 2 - alternate interface for data streaming */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_MIC), /*_altset*/ 0x02, /*_nEPs*/ 0x01, /*_stridx*/ 0x04),\\\n    /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n    /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n    TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_TX),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n    TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (uint8_t) (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_ASYNCHRONOUS | TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX), /*_interval*/ 0x01),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000)\n\n#endif\n"
  },
  {
    "path": "examples/device/dfu/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(dfu C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/dfu/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/dfu/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE = \\\n\tsrc/main.c \\\n\tsrc/usb_descriptors.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/dfu/skip.txt",
    "content": "mcu:TM4C\nmcu:BCM2835\nfamily:espressif\n"
  },
  {
    "path": "examples/device/dfu/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/*\n  * After device is enumerated in dfu mode run the following commands\n  *\n  * To transfer firmware from host to device (best to test with text file)\n  *\n  * $ dfu-util -d cafe -a 0 -D [filename]\n  * $ dfu-util -d cafe -a 1 -D [filename]\n  *\n  * To transfer firmware from device to host:\n  *\n  * $ dfu-util -d cafe -a 0 -U [filename]\n  * $ dfu-util -d cafe -a 1 -U [filename]\n  *\n  */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\nconst char *upload_image[2] = {\"Hello world from TinyUSB DFU! - Partition 0\",\n                               \"Hello world from TinyUSB DFU! - Partition 1\"};\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED     = 1000,\n  BLINK_SUSPENDED   = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {.role = TUSB_ROLE_DEVICE, .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void)remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// DFU callbacks\n// Note: alt is used as the partition number, in order to support multiple partitions like FLASH, EEPROM, etc.\n//--------------------------------------------------------------------+\n\n// Invoked right before tud_dfu_download_cb() (state=DFU_DNBUSY) or tud_dfu_manifest_cb() (state=DFU_MANIFEST)\n// Application return timeout in milliseconds (bwPollTimeout) for the next download/manifest operation.\n// During this period, USB host won't try to communicate with us.\nuint32_t tud_dfu_get_timeout_cb(uint8_t alt, uint8_t state) {\n  if (state == DFU_DNBUSY) {\n    // For this example\n    // - Atl0 Flash is fast : 1   ms\n    // - Alt1 EEPROM is slow: 100 ms\n    return (alt == 0) ? 1 : 100;\n  } else if (state == DFU_MANIFEST) {\n    // since we don't buffer entire image and do any flashing in manifest stage\n    return 0;\n  } else {\n    // nothing to do\n  }\n\n  return 0;\n}\n\n// Invoked when received DFU_DNLOAD (wLength>0) following by DFU_GETSTATUS (state=DFU_DNBUSY) requests\n// This callback could be returned before flashing op is complete (async).\n// Once finished flashing, application must call tud_dfu_finish_flashing()\nvoid tud_dfu_download_cb(uint8_t alt, uint16_t block_num, const uint8_t *data, uint16_t length) {\n  (void)alt;\n  (void)block_num;\n\n  //printf(\"\\r\\nReceived Alt %u BlockNum %u of length %u\\r\\n\", alt, wBlockNum, length);\n\n  for (uint16_t i = 0; i < length; i++) {\n    printf(\"%c\", data[i]);\n  }\n\n  // flashing op for download complete without error\n  tud_dfu_finish_flashing(DFU_STATUS_OK);\n}\n\n// Invoked when download process is complete, received DFU_DNLOAD (wLength=0) following by DFU_GETSTATUS (state=Manifest)\n// Application can do checksum, or actual flashing if buffered entire image previously.\n// Once finished flashing, application must call tud_dfu_finish_flashing()\nvoid tud_dfu_manifest_cb(uint8_t alt) {\n  (void)alt;\n  printf(\"Download completed, enter manifestation\\r\\n\");\n\n  // flashing op for manifest is complete without error\n  // Application can perform checksum, should it fail, use appropriate status such as errVERIFY.\n  tud_dfu_finish_flashing(DFU_STATUS_OK);\n}\n\n// Invoked when received DFU_UPLOAD request\n// Application must populate data with up to length bytes and\n// Return the number of written bytes\nuint16_t tud_dfu_upload_cb(uint8_t alt, uint16_t block_num, uint8_t *data, uint16_t length) {\n  (void)block_num;\n  (void)length;\n\n  if (block_num != 0u) {\n    return 0; // for this example we only support single block upload\n  }\n\n  const uint16_t xfer_len = tu_min16((uint16_t)strlen(upload_image[alt]), length);\n  memcpy(data, upload_image[alt], xfer_len);\n\n  return xfer_len;\n}\n\n// Invoked when the Host has terminated a download or upload transfer\nvoid tud_dfu_abort_cb(uint8_t alt) {\n  (void)alt;\n  printf(\"Host aborted transfer\\r\\n\");\n}\n\n// Invoked when a DFU_DETACH request is received\nvoid tud_dfu_detach_cb(void) {\n  printf(\"Host detach, we should probably reboot\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK + Indicator pulse\n//--------------------------------------------------------------------+\n\nvoid led_blinking_task(void) {\n  static uint32_t start_ms  = 0;\n  static bool     led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/dfu/src/tusb_config.h",
    "content": "/*\n * tusb_config.h\n *\n *  Created on: May 5, 2021\n *      Author: Jeremiah McCarthy\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_DFU               1\n\n// DFU buffer size, it has to be set to the buffer size used in TUD_DFU_DESCRIPTOR\n#define CFG_TUD_DFU_XFER_BUFSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/dfu/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n) ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID         (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4))\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic const tusb_desc_device_t desc_device =\n  {.bLength         = sizeof(tusb_desc_device_t),\n   .bDescriptorType = TUSB_DESC_DEVICE,\n   .bcdUSB          = 0x0201,\n\n#if CFG_TUD_CDC\n   // Use Interface Association Descriptor (IAD) for CDC\n   // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n   .bDeviceClass    = TUSB_CLASS_MISC,\n   .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n   .bDeviceProtocol = MISC_PROTOCOL_IAD,\n#else\n   .bDeviceClass    = 0x00,\n   .bDeviceSubClass = 0x00,\n   .bDeviceProtocol = 0x00,\n#endif\n\n   .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n\n   .idVendor  = 0xCafe,\n   .idProduct = USB_PID,\n   .bcdDevice = 0x0100,\n\n   .iManufacturer = 0x01,\n   .iProduct      = 0x02,\n   .iSerialNumber = 0x03,\n\n   .bNumConfigurations = 0x01};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nconst uint8_t *tud_descriptor_device_cb(void) {\n  return (const uint8_t *)&desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\n// Number of Alternate Interface (each for 1 flash partition)\n#define ALT_COUNT 2\n\nenum {\n  ITF_NUM_DFU_MODE,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_DFU_DESC_LEN(ALT_COUNT))\n#define FUNC_ATTRS       (DFU_ATTR_CAN_UPLOAD | DFU_ATTR_CAN_DOWNLOAD | DFU_ATTR_MANIFESTATION_TOLERANT)\n\nuint8_t const desc_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, Alternate count, starting string index, attributes, detach timeout, transfer size\n  TUD_DFU_DESCRIPTOR(ITF_NUM_DFU_MODE, ALT_COUNT, 4, FUNC_ATTRS, 1000, CFG_TUD_DFU_XFER_BUFSIZE),\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nconst uint8_t *tud_descriptor_configuration_cb(uint8_t index) {\n  (void)index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// BOS Descriptor\n//--------------------------------------------------------------------+\n\n/* Microsoft OS 2.0 registry property descriptor\n  Per MS requirements https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx\n  device should create DeviceInterfaceGUIDs. It can be done by driver and\n  in case of real PnP solution device should expose MS \"Microsoft OS 2.0\n  registry property descriptor\". Such descriptor can insert any record\n  into Windows registry per device/configuration/interface. In our case it\n  will insert \"DeviceInterfaceGUIDs\" multistring property.\n  GUID is freshly generated and should be OK to use.\n  https://developers.google.com/web/fundamentals/native-hardware/build-for-webusb/\n  (Section Microsoft OS compatibility descriptors)\n*/\n\n#define BOS_TOTAL_LEN            (TUD_BOS_DESC_LEN + TUD_BOS_MICROSOFT_OS_DESC_LEN)\n#define MS_OS_20_DESC_LEN        0xA2\n#define VENDOR_REQUEST_MICROSOFT 1\n\n// BOS Descriptor is required for webUSB\nconst uint8_t desc_bos[] = {\n  // total length, number of device caps\n  TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 1),\n\n  // Microsoft OS 2.0 descriptor\n  TUD_BOS_MS_OS_20_DESCRIPTOR(MS_OS_20_DESC_LEN, 1)};\n\nconst uint8_t *tud_descriptor_bos_cb(void) {\n  return desc_bos;\n}\n\nconst uint8_t desc_ms_os_20[] = {\n  // Set header: length, type, windows version, total length\n  U16_TO_U8S_LE(0x000A), U16_TO_U8S_LE(MS_OS_20_SET_HEADER_DESCRIPTOR), U32_TO_U8S_LE(0x06030000),\n  U16_TO_U8S_LE(MS_OS_20_DESC_LEN),\n\n  // MS OS 2.0 Compatible ID descriptor: length, type, compatible ID, sub compatible ID\n  U16_TO_U8S_LE(0x0014), U16_TO_U8S_LE(MS_OS_20_FEATURE_COMPATBLE_ID), 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sub-compatible\n\n  // MS OS 2.0 Registry property descriptor: length, type\n  U16_TO_U8S_LE(MS_OS_20_DESC_LEN - 0x0A - 0x14), U16_TO_U8S_LE(MS_OS_20_FEATURE_REG_PROPERTY),\n  U16_TO_U8S_LE(0x0007), U16_TO_U8S_LE(0x002A),// wPropertyDataType, wPropertyNameLength and PropertyName \"DeviceInterfaceGUIDs\\0\" in UTF-16\n  'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00,\n  'r', 0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 's', 0x00, 0x00, 0x00,\n  U16_TO_U8S_LE(0x0050),// wPropertyDataLength\n  //bPropertyData: {3E7E0711-DF3B-4158-A32F-E5951B2AB9A1}.\n  '{', 0x00, '3', 0x00, 'E', 0x00, '7', 0x00, 'E', 0x00, '0', 0x00, '7', 0x00, '1', 0x00, '1', 0x00, '-', 0x00,\n  'D', 0x00, 'F', 0x00, '3', 0x00, 'B', 0x00, '-', 0x00, '4', 0x00, '1', 0x00, '5', 0x00, '8', 0x00, '-', 0x00,\n  'A', 0x00, '3', 0x00, '2', 0x00, 'F', 0x00, '-', 0x00, 'E', 0x00, '5', 0x00, '9', 0x00, '5', 0x00, '1', 0x00,\n  'B', 0x00, '2', 0x00, 'A', 0x00, 'B', 0x00, '9', 0x00, 'A', 0x00, '1', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\nTU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, \"Incorrect size\");\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, const tusb_control_request_t *request) {\n  // nothing to with DATA & ACK stage\n  if (stage != CONTROL_STAGE_SETUP) {\n    return true;\n  }\n\n  if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR) {\n    if (request->bRequest == VENDOR_REQUEST_MICROSOFT) {\n      if (request->wIndex == 7) {\n        return tud_control_xfer(rhport, request, (void *)(uintptr_t)desc_ms_os_20, MS_OS_20_DESC_LEN);\n      } else {\n        return false;\n      }\n    }\n  }\n\n  // stall unknown request\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic const char *string_desc_arr[] = {\n  (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                  // 1: Manufacturer\n  \"TinyUSB Device\",           // 2: Product\n  NULL,                       // 3: Serials will use unique ID if possible\n  \"FLASH\",                    // 4: DFU Partition 1\n  \"EEPROM\",                   // 5: DFU Partition 2\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nconst uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void)langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count              = strlen(str);\n      const size_t max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/dfu_runtime/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(dfu_runtime C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/dfu_runtime/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/dfu_runtime/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/dfu_runtime/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* After device is enumerated, run following command\n *\n * $ dfu-util -l\n *\n * It should be able to list our device as in Runtime mode. Then run\n *\n * $ dfu-util -e\n *\n * This will send DETACH command to put device into bootloader. Since this example\n * is minimal, it doesn't actually go into DFU mode but rather change the LED blinking\n * pattern to fast rate as indicator.\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 1000 ms : device should reboot\n * - 250 ms  : device not mounted\n * - 0 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_DFU_MODE = 100,\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void)\n{\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1)\n  {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void)\n{\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void)\n{\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en)\n{\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void)\n{\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n// Invoked on DFU_DETACH request to reboot to the bootloader\nvoid tud_dfu_runtime_reboot_to_dfu_cb(void)\n{\n  blink_interval_ms = BLINK_DFU_MODE;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK + Indicator pulse\n//--------------------------------------------------------------------+\n\nvoid led_blinking_task(void)\n{\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/dfu_runtime/src/tusb_config.h",
    "content": "/*\n * tusb_config.h\n *\n *  Created on: Oct 28, 2019\n *      Author: Sylvain Munaut\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n\n#define CFG_TUD_DFU_RUNTIME 1\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/dfu_runtime/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n) ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID         (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4))\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic const tusb_desc_device_t desc_device = {\n  .bLength = sizeof(tusb_desc_device_t),\n  .bDescriptorType = TUSB_DESC_DEVICE,\n  .bcdUSB = 0x0201,\n\n#if CFG_TUD_CDC\n  // Use Interface Association Descriptor (IAD) for CDC\n  // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n  .bDeviceClass = TUSB_CLASS_MISC,\n  .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol = MISC_PROTOCOL_IAD,\n#else\n  .bDeviceClass = 0x00,\n  .bDeviceSubClass = 0x00,\n  .bDeviceProtocol = 0x00,\n#endif\n\n  .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n\n  .idVendor = 0xCafe,\n  .idProduct = USB_PID,\n  .bcdDevice = 0x0100,\n\n  .iManufacturer = 0x01,\n  .iProduct = 0x02,\n  .iSerialNumber = 0x03,\n\n  .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum {\n  ITF_NUM_DFU_RT,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_DFU_RT_DESC_LEN)\n\nuint8_t const desc_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, attributes, detach timeout, transfer size */\n  TUD_DFU_RT_DESCRIPTOR(ITF_NUM_DFU_RT, 4, 0x0d, 1000, 4096),\n};\n\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index;// for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// BOS Descriptor\n//--------------------------------------------------------------------+\n\n/* Microsoft OS 2.0 registry property descriptor\n  Per MS requirements https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx\n  device should create DeviceInterfaceGUIDs. It can be done by driver and\n  in case of real PnP solution device should expose MS \"Microsoft OS 2.0\n  registry property descriptor\". Such descriptor can insert any record\n  into Windows registry per device/configuration/interface. In our case it\n  will insert \"DeviceInterfaceGUIDs\" multistring property.\n  GUID is freshly generated and should be OK to use.\n  https://developers.google.com/web/fundamentals/native-hardware/build-for-webusb/\n  (Section Microsoft OS compatibility descriptors)\n*/\n\n#define BOS_TOTAL_LEN (TUD_BOS_DESC_LEN + TUD_BOS_MICROSOFT_OS_DESC_LEN)\n#define MS_OS_20_DESC_LEN 0xA2\n#define VENDOR_REQUEST_MICROSOFT 1\n\n// BOS Descriptor is required for webUSB\nconst uint8_t desc_bos[] = {\n  // total length, number of device caps\n  TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 1),\n\n  // Microsoft OS 2.0 descriptor\n  TUD_BOS_MS_OS_20_DESCRIPTOR(MS_OS_20_DESC_LEN, 1)};\n\nconst uint8_t *tud_descriptor_bos_cb(void) {\n  return desc_bos;\n}\n\nuint8_t const desc_ms_os_20[] = {\n    // Set header: length, type, windows version, total length\n    U16_TO_U8S_LE(0x000A), U16_TO_U8S_LE(MS_OS_20_SET_HEADER_DESCRIPTOR), U32_TO_U8S_LE(0x06030000), U16_TO_U8S_LE(MS_OS_20_DESC_LEN),\n\n    // MS OS 2.0 Compatible ID descriptor: length, type, compatible ID, sub compatible ID\n    U16_TO_U8S_LE(0x0014), U16_TO_U8S_LE(MS_OS_20_FEATURE_COMPATBLE_ID), 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sub-compatible\n\n    // MS OS 2.0 Registry property descriptor: length, type\n    U16_TO_U8S_LE(MS_OS_20_DESC_LEN - 0x0A - 0x14), U16_TO_U8S_LE(MS_OS_20_FEATURE_REG_PROPERTY),\n    U16_TO_U8S_LE(0x0007), U16_TO_U8S_LE(0x002A),// wPropertyDataType, wPropertyNameLength and PropertyName \"DeviceInterfaceGUIDs\\0\" in UTF-16\n    'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00,\n    'r', 0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 's', 0x00, 0x00, 0x00,\n    U16_TO_U8S_LE(0x0050),// wPropertyDataLength\n    //bPropertyData: {F7CC2C68-3B14-4D72-B876-1A981AD2C9E5}.\n    '{', 0x00, 'F', 0x00, '7', 0x00, 'C', 0x00, 'C', 0x00, '2', 0x00, 'C', 0x00, '6', 0x00, '8', 0x00, '-', 0x00,\n    '3', 0x00, 'B', 0x00, '1', 0x00, '4', 0x00, '-', 0x00, '4', 0x00, 'D', 0x00, '7', 0x00, '2', 0x00, '-', 0x00,\n    'B', 0x00, '8', 0x00, '7', 0x00, '6', 0x00, '-', 0x00, '1', 0x00, 'A', 0x00, '9', 0x00, '8', 0x00, '1', 0x00,\n    'A', 0x00, 'D', 0x00, '2', 0x00, 'C', 0x00, '9', 0x00, 'E', 0x00, '5', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\nTU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, \"Incorrect size\");\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request) {\n  // nothing to with DATA & ACK stage\n  if (stage != CONTROL_STAGE_SETUP) {\n    return true;\n  }\n\n  if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR) {\n    if (request->bRequest == VENDOR_REQUEST_MICROSOFT) {\n      if (request->wIndex == 7) {\n        return tud_control_xfer(rhport, request, (void *)(uintptr_t)desc_ms_os_20, MS_OS_20_DESC_LEN);\n      } else {\n        return false;\n      }\n    }\n  }\n\n  switch (request->bmRequestType_bit.type) {\n    case TUSB_REQ_TYPE_VENDOR:\n      switch (request->bRequest) {\n        case VENDOR_REQUEST_MICROSOFT:\n          if (request->wIndex == 7) {\n            return tud_control_xfer(rhport, request, (void *) (uintptr_t) desc_ms_os_20, MS_OS_20_DESC_LEN);\n          } else {\n            return false;\n          }\n\n        default:\n          break;\n      }\n      break;\n\n    default:\n      break;\n  }\n\n  // stall unknown request\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] = {\n  (const char[]){0x09, 0x04},// 0: is supported language is English (0x0409)\n  \"TinyUSB\",                 // 1: Manufacturer\n  \"TinyUSB Device\",          // 2: Product\n  NULL,                      // 3: Serials will use unique ID if possible\n  \"TinyUSB DFU runtime\",     // 4: DFU runtime\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nconst uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void)langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count              = strlen(str);\n      const size_t max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/dynamic_configuration/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(dynamic_configuration C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/dynamic_configuration/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/dynamic_configuration/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/dynamic_configuration/skip.txt",
    "content": "mcu:SAMD11\nfamily:espressif\nboard:ch32v203g_r0_1v0\n"
  },
  {
    "path": "examples/device/dynamic_configuration/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\nvoid cdc_task(void);\nvoid midi_task(void);\n\n/*------------- MAIN -------------*/\nint main(void)\n{\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1)\n  {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n    cdc_task();\n    midi_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void)\n{\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void)\n{\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en)\n{\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void)\n{\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n\n//--------------------------------------------------------------------+\n// USB CDC\n//--------------------------------------------------------------------+\nvoid cdc_task(void) {\n  if (tud_cdc_connected()) {\n    // connected and there are data available read and echo back\n    if (tud_cdc_available()) {\n      uint8_t buf[64];\n      uint32_t count = tud_cdc_read(buf, sizeof(buf));\n\n      for (uint32_t i = 0; i < count; i++) {\n        tud_cdc_write_char(buf[i]);\n        if (buf[i] == '\\r') {\n          tud_cdc_write_char('\\n');\n        }\n      }\n\n      tud_cdc_write_flush();\n    }\n  }\n}\n\n// Invoked when cdc when line state changed e.g connected/disconnected\nvoid tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {\n  (void) itf;\n\n  // connected\n  if (dtr && rts) {\n    // print initial message when connected\n    tud_cdc_write_str(\"\\r\\nTinyUSB CDC MSC device example\\r\\n\");\n  }\n}\n\n// Invoked when CDC interface received data from host\nvoid tud_cdc_rx_cb(uint8_t itf) { (void) itf; }\n\n//--------------------------------------------------------------------+\n// MIDI Task\n//--------------------------------------------------------------------+\n\n// Variable that holds the current position in the sequence.\nuint32_t note_pos = 0;\n\n// Store example melody as an array of note values\nstatic const uint8_t note_sequence[] =\n{\n  74,78,81,86,90,93,98,102,57,61,66,69,73,78,81,85,88,92,97,100,97,92,88,85,81,78,\n  74,69,66,62,57,62,66,69,74,78,81,86,90,93,97,102,97,93,90,85,81,78,73,68,64,61,\n  56,61,64,68,74,78,81,86,90,93,98,102\n};\n\nvoid midi_task(void) {\n  static uint32_t start_ms = 0;\n\n  uint8_t const cable_num = 0; // MIDI jack associated with USB endpoint\n  uint8_t const channel   = 0; // 0 for channel 1\n\n  // The MIDI interface always creates input and output port/jack descriptors\n  // regardless of these being used or not. Therefore incoming traffic should be read\n  // (possibly just discarded) to avoid the sender blocking in IO\n  uint8_t packet[4];\n  while( tud_midi_available() ) tud_midi_packet_read(packet);\n\n  // send note every 1000 ms\n  if (tusb_time_millis_api() - start_ms < 286) {\n    return; // not enough time\n  }\n  start_ms += 286;\n\n  // Previous positions in the note sequence.\n  int previous = (int) (note_pos - 1);\n\n  // If we currently are at position 0, set the\n  // previous position to the last note in the sequence.\n  if (previous < 0) {\n    previous = sizeof(note_sequence) - 1;\n  }\n\n  // Send Note On for current position at full velocity (127) on channel 1.\n  uint8_t note_on[3] = { 0x90 | channel, note_sequence[note_pos], 127 };\n  tud_midi_stream_write(cable_num, note_on, 3);\n\n  // Send Note Off for previous note.\n  uint8_t note_off[3] = { 0x80 | channel, note_sequence[previous], 0};\n  tud_midi_stream_write(cable_num, note_off, 3);\n\n  // Increment position\n  note_pos++;\n\n  // If we are at the end of the sequence, start over.\n  if (note_pos >= sizeof(note_sequence)) {\n    note_pos = 0;\n  }\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return;// not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;// toggle\n}\n"
  },
  {
    "path": "examples/device/dynamic_configuration/src/msc_disk.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#if CFG_TUD_MSC\n\n// Some MCU doesn't have enough 8KB SRAM to store the whole disk\n// We will use Flash as read-only disk with board that has\n// CFG_EXAMPLE_MSC_READONLY defined\n\n#define README_CONTENTS \\\n\"This is tinyusb's MassStorage Class demo.\\r\\n\\r\\n\\\nIf you find any bugs or get any questions, feel free to file an\\r\\n\\\nissue at github.com/hathach/tinyusb\"\n\nenum\n{\n  DISK_BLOCK_NUM  = 16, // 8KB is the smallest size that windows allow to mount\n  DISK_BLOCK_SIZE = 512\n};\n\nstatic\n#ifdef CFG_EXAMPLE_MSC_READONLY\nconst\n#endif\nuint8_t msc_disk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] =\n{\n  //------------- Block0: Boot Sector -------------//\n  // byte_per_sector    = DISK_BLOCK_SIZE; fat12_sector_num_16  = DISK_BLOCK_NUM;\n  // sector_per_cluster = 1; reserved_sectors = 1;\n  // fat_num            = 1; fat12_root_entry_num = 16;\n  // sector_per_fat     = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0;\n  // drive_number       = 0x80; media_type = 0xf8; extended_boot_signature = 0x29;\n  // filesystem_type    = \"FAT12   \"; volume_serial_number = 0x1234; volume_label = \"TinyUSB MSC\";\n  // FAT magic code at offset 510-511\n  {\n      0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00,\n      0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x34, 0x12, 0x00, 0x00, 'T' , 'i' , 'n' , 'y' , 'U' ,\n      'S' , 'B' , ' ' , 'M' , 'S' , 'C' , 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00,\n\n      // Zero up to 2 last bytes of FAT magic code\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA\n  },\n\n  //------------- Block1: FAT12 Table -------------//\n  {\n      0xF8, 0xFF, 0xFF, 0xFF, 0x0F // // first 2 entries must be F8FF, third entry is cluster end of readme file\n  },\n\n  //------------- Block2: Root Directory -------------//\n  {\n      // first entry is volume label\n      'T' , 'i' , 'n' , 'y' , 'U' , 'S' , 'B' , ' ' , 'M' , 'S' , 'C' , 0x08, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      // second entry is readme file\n      'R' , 'E' , 'A' , 'D' , 'M' , 'E' , ' ' , ' ' , 'T' , 'X' , 'T' , 0x20, 0x00, 0xC6, 0x52, 0x6D,\n      0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00,\n      sizeof(README_CONTENTS)-1, 0x00, 0x00, 0x00 // readme's files size (4 Bytes)\n  },\n\n  //------------- Block3: Readme Content -------------//\n  README_CONTENTS\n};\n\n// Invoked when received SCSI_CMD_INQUIRY, v2 with full inquiry response\n// Some inquiry_resp's fields are already filled with default values, application can update them\n// Return length of inquiry response, typically sizeof(scsi_inquiry_resp_t) (36 bytes), can be longer if included vendor data.\nuint32_t tud_msc_inquiry2_cb(uint8_t lun, scsi_inquiry_resp_t *inquiry_resp, uint32_t bufsize) {\n  (void) lun;\n  (void) bufsize;\n  const char vid[] = \"TinyUSB\";\n  const char pid[] = \"Mass Storage\";\n  const char rev[] = \"1.0\";\n\n  strncpy((char*) inquiry_resp->vendor_id, vid, 8);\n  strncpy((char*) inquiry_resp->product_id, pid, 16);\n  strncpy((char*) inquiry_resp->product_rev, rev, 4);\n\n  return sizeof(scsi_inquiry_resp_t); // 36 bytes\n}\n\n// Invoked when received Test Unit Ready command.\n// return true allowing host to read/write this LUN e.g SD card inserted\nbool tud_msc_test_unit_ready_cb(uint8_t lun)\n{\n  (void) lun;\n\n  return true; // RAM disk is always ready\n}\n\n// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size\n// Application update block count and block size\nvoid tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size)\n{\n  (void) lun;\n\n  *block_count = DISK_BLOCK_NUM;\n  *block_size  = DISK_BLOCK_SIZE;\n}\n\n// Invoked when received Start Stop Unit command\n// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage\n// - Start = 1 : active mode, if load_eject = 1 : load disk storage\nbool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject)\n{\n  (void) lun;\n  (void) power_condition;\n\n  if ( load_eject )\n  {\n    if (start)\n    {\n      // load disk storage\n    }else\n    {\n      // unload disk storage\n    }\n  }\n\n  return true;\n}\n\n// Callback invoked when received READ10 command.\n// Copy disk's data to buffer (up to bufsize) and return number of copied bytes.\nint32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) {\n  (void) lun;\n\n  // out of ramdisk\n  if ( lba >= DISK_BLOCK_NUM ) {\n    return -1;\n  }\n\n  uint8_t const* addr = msc_disk[lba] + offset;\n  memcpy(buffer, addr, bufsize);\n\n  return (int32_t) bufsize;\n}\n\n// Callback invoked when received WRITE10 command.\n// Process data in buffer to disk's storage and return number of written bytes\nint32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize) {\n  (void) lun;\n\n  // out of ramdisk\n  if ( lba >= DISK_BLOCK_NUM ) {\n    return -1;\n  }\n\n#ifndef CFG_EXAMPLE_MSC_READONLY\n  uint8_t* addr = msc_disk[lba] + offset;\n  memcpy(addr, buffer, bufsize);\n#else\n  (void) lba; (void) offset; (void) buffer;\n#endif\n\n  return (int32_t) bufsize;\n}\n\n// Callback invoked when received an SCSI command not in built-in list below\n// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE\n// - READ10 and WRITE10 has their own callbacks\nint32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize) {\n  (void) lun;\n  (void) scsi_cmd;\n  (void) buffer;\n  (void) bufsize;\n\n  // currently no other commands are supported\n\n  // Set Sense = Invalid Command Operation\n  (void) tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);\n\n  return -1; // stall/failed command request;\n}\n\n#endif\n"
  },
  {
    "path": "examples/device/dynamic_configuration/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               1\n#define CFG_TUD_MSC               1\n#define CFG_TUD_MIDI              1\n#define CFG_TUD_HID               0\n#define CFG_TUD_VENDOR            0\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE    (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE    (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// MIDI FIFO size of TX and RX\n#define CFG_TUD_MIDI_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_MIDI_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// MSC Buffer size of Device Mass storage\n#define CFG_TUD_MSC_EP_BUFSIZE    512\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/dynamic_configuration/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n// Configuration mode\n// 0 : enumerated as CDC/MIDI. Board button is not pressed when enumerating\n// 1 : enumerated as MSC. Board button is pressed when enumerating\nstatic uint32_t mode = 0;\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\ntusb_desc_device_t const desc_device_0 =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for CDC\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\ntusb_desc_device_t const desc_device_1 =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n    .bDeviceClass       = 0,\n    .bDeviceSubClass    = 0,\n    .bDeviceProtocol    = 0,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID + 11, // should be different PID than desc0\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  mode = board_button_read();\n  return (uint8_t const*) (mode ? &desc_device_1 : &desc_device_0);\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum\n{\n  ITF_0_NUM_CDC = 0,\n  ITF_0_NUM_CDC_DATA,\n  ITF_0_NUM_MIDI,\n  ITF_0_NUM_MIDI_STREAMING,\n  ITF_0_NUM_TOTAL\n};\n\nenum\n{\n  ITF_1_NUM_MSC = 0,\n  ITF_1_NUM_TOTAL\n};\n\n#define CONFIG_0_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MIDI_DESC_LEN)\n#define CONFIG_1_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_MSC_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_0_CDC_NOTIF   0x81\n  #define EPNUM_0_CDC_OUT     0x02\n  #define EPNUM_0_CDC_IN      0x82\n\n  #define EPNUM_0_MIDI_OUT    0x05\n  #define EPNUM_0_MIDI_IN     0x85\n\n  #define EPNUM_1_MSC_OUT     0x02\n  #define EPNUM_1_MSC_IN      0x82\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_0_CDC_NOTIF   0x81\n  #define EPNUM_0_CDC_OUT     0x02\n  #define EPNUM_0_CDC_IN      0x83\n\n  #define EPNUM_0_MIDI_OUT    0x04\n  #define EPNUM_0_MIDI_IN     0x85\n\n  #define EPNUM_1_MSC_OUT     0x01\n  #define EPNUM_1_MSC_IN      0x82\n\n#else\n  #define EPNUM_0_CDC_NOTIF   0x81\n  #define EPNUM_0_CDC_OUT     0x02\n  #define EPNUM_0_CDC_IN      0x82\n\n  #define EPNUM_0_MIDI_OUT    0x03\n  #define EPNUM_0_MIDI_IN     0x83\n\n  #define EPNUM_1_MSC_OUT     0x01\n  #define EPNUM_1_MSC_IN      0x81\n#endif\n\nuint8_t const desc_configuration_0[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_0_NUM_TOTAL, 0, CONFIG_0_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_0_NUM_CDC, 0, EPNUM_0_CDC_NOTIF, 8, EPNUM_0_CDC_OUT, EPNUM_0_CDC_IN, TUD_OPT_HIGH_SPEED ? 512 : 64),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MIDI_DESCRIPTOR(ITF_0_NUM_MIDI, 0, EPNUM_0_MIDI_OUT, EPNUM_0_MIDI_IN, TUD_OPT_HIGH_SPEED ? 512 : 64),\n};\n\n\nuint8_t const desc_configuration_1[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_1_NUM_TOTAL, 0, CONFIG_1_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MSC_DESCRIPTOR(ITF_1_NUM_MSC, 0, EPNUM_1_MSC_OUT, EPNUM_1_MSC_IN, TUD_OPT_HIGH_SPEED ? 512 : 64),\n};\n\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return mode ? desc_configuration_1 : desc_configuration_0;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/hid_boot_interface/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(hid_boot_interface C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/hid_boot_interface/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/hid_boot_interface/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE = \\\n\tsrc/main.c \\\n\tsrc/usb_descriptors.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/hid_boot_interface/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED     = 1000,\n  BLINK_SUSPENDED   = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\nvoid hid_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {.role = TUSB_ROLE_DEVICE, .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n\n    hid_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void)remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// USB HID\n//--------------------------------------------------------------------+\n\n// Every 10ms, we will sent 1 report for each HID profile (keyboard, mouse etc ..)\n// tud_hid_report_complete_cb() is used to send the next report after previous one is complete\nvoid hid_task(void) {\n  // Poll every 10ms\n  const uint32_t  interval_ms = 10;\n  static uint32_t start_ms    = 0;\n\n  if (tusb_time_millis_api() - start_ms < interval_ms) {\n    return; // not enough time\n  }\n  start_ms += interval_ms;\n\n  uint32_t const btn = board_button_read();\n\n  if (tud_suspended() && btn) {\n    // Wake up host if we are in suspend mode\n    // and REMOTE_WAKEUP feature is enabled by host\n    tud_remote_wakeup();\n  } else {\n    // keyboard interface\n    if (tud_hid_n_ready(ITF_NUM_KEYBOARD)) {\n      // used to avoid send multiple consecutive zero report for keyboard\n      static bool has_keyboard_key = false;\n\n      uint8_t const report_id = 0;\n      uint8_t const modifier  = 0;\n\n      if (btn) {\n        uint8_t keycode[6] = {0};\n        keycode[0]         = HID_KEY_ARROW_RIGHT;\n\n        tud_hid_n_keyboard_report(ITF_NUM_KEYBOARD, report_id, modifier, keycode);\n        has_keyboard_key = true;\n      } else {\n        // send empty key report if previously has key pressed\n        if (has_keyboard_key) {\n          tud_hid_n_keyboard_report(ITF_NUM_KEYBOARD, report_id, modifier, NULL);\n        }\n        has_keyboard_key = false;\n      }\n    }\n\n    // mouse interface\n    if (tud_hid_n_ready(ITF_NUM_MOUSE)) {\n      if (btn) {\n        uint8_t const report_id   = 0;\n        uint8_t const button_mask = 0;\n        int8_t const  vertical    = 0;\n        int8_t const  horizontal  = 0;\n        int8_t const  delta       = 5;\n\n        tud_hid_n_mouse_report(ITF_NUM_MOUSE, report_id, button_mask, delta, delta, vertical, horizontal);\n      }\n    }\n  }\n}\n\n// Invoked when received SET_PROTOCOL request\n// protocol is either HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)\nvoid tud_hid_set_protocol_cb(uint8_t instance, uint8_t protocol) {\n  (void)instance;\n  (void)protocol;\n\n  // nothing to do since we use the same compatible boot report for both Boot and Report mode.\n  // TODO set a indicator for user\n}\n\n// Invoked when sent REPORT successfully to host\n// Application can use this to send the next report\n// Note: For composite reports, report[0] is report ID\nvoid tud_hid_report_complete_cb(uint8_t instance, uint8_t const *report, uint16_t len) {\n  (void)instance;\n  (void)report;\n  (void)len;\n\n  // nothing to do\n}\n\n// Invoked when received GET_REPORT control request\n// Application must fill buffer report's content and return its length.\n// Return zero will cause the stack to STALL request\nuint16_t tud_hid_get_report_cb(\n    uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t *buffer, uint16_t reqlen) {\n  // TODO not Implemented\n  (void)instance;\n  (void)report_id;\n  (void)report_type;\n  (void)buffer;\n  (void)reqlen;\n\n  return 0;\n}\n\n// Invoked when received SET_REPORT control request or\n// received data on OUT endpoint ( Report ID = 0, Type = 0 )\nvoid tud_hid_set_report_cb(\n    uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer, uint16_t bufsize) {\n  (void)report_id;\n\n  // keyboard interface\n  if (instance == ITF_NUM_KEYBOARD) {\n    // Set keyboard LED e.g Capslock, Numlock etc...\n    if (report_type == HID_REPORT_TYPE_OUTPUT) {\n      // bufsize should be (at least) 1\n      if (bufsize < 1) {\n        return;\n      }\n\n      uint8_t const kbd_leds = buffer[0];\n\n      if (kbd_leds & KEYBOARD_LED_CAPSLOCK) {\n        // Capslock On: disable blink, turn led on\n        blink_interval_ms = 0;\n        board_led_write(true);\n      } else {\n        // Caplocks Off: back to normal blink\n        board_led_write(false);\n        blink_interval_ms = BLINK_MOUNTED;\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms  = 0;\n  static bool     led_state = false;\n\n  // blink is disabled\n  if (!blink_interval_ms) {\n    return;\n  }\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/hid_boot_interface/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_HID               2 // 1 for boot keyboard, 1 for boot mouse\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n// HID buffer size Should be sufficient to hold ID (if any) + Data\n#define CFG_TUD_HID_EP_BUFSIZE    8\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/hid_boot_interface/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n) ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID         (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4))\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n  .bLength         = sizeof(tusb_desc_device_t),\n  .bDescriptorType = TUSB_DESC_DEVICE,\n  .bcdUSB          = 0x0200,\n  .bDeviceClass    = 0x00,\n  .bDeviceSubClass = 0x00,\n  .bDeviceProtocol = 0x00,\n  .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n\n  .idVendor  = 0xCafe,\n  .idProduct = USB_PID,\n  .bcdDevice = 0x0100,\n\n  .iManufacturer = 0x01,\n  .iProduct      = 0x02,\n  .iSerialNumber = 0x03,\n\n  .bNumConfigurations = 0x01};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  return (uint8_t const *)&desc_device;\n}\n\n//--------------------------------------------------------------------+\n// HID Report Descriptor\n//--------------------------------------------------------------------+\n\nuint8_t const desc_hid_keyboard_report[] = {TUD_HID_REPORT_DESC_KEYBOARD()};\n\nuint8_t const desc_hid_mouse_report[] = {TUD_HID_REPORT_DESC_MOUSE()};\n\n// Invoked when received GET HID REPORT DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_hid_descriptor_report_cb(uint8_t instance) {\n  return (instance == 0) ? desc_hid_keyboard_report : desc_hid_mouse_report;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + 2 * TUD_HID_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n// LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n// 1 Interrupt, 2 Bulk, 3 Iso, 4 Interrupt, 5 Bulk etc ...\n#define EPNUM_KEYBOARD 0x81\n#define EPNUM_MOUSE    0x84\n#else\n#define EPNUM_KEYBOARD 0x81\n#define EPNUM_MOUSE    0x82\n#endif\n\nuint8_t const desc_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n\n  // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval\n  TUD_HID_DESCRIPTOR(\n      ITF_NUM_KEYBOARD, 0, HID_ITF_PROTOCOL_KEYBOARD, sizeof(desc_hid_keyboard_report), EPNUM_KEYBOARD,\n      CFG_TUD_HID_EP_BUFSIZE, 10),\n\n  // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval\n  TUD_HID_DESCRIPTOR(\n      ITF_NUM_MOUSE, 0, HID_ITF_PROTOCOL_MOUSE, sizeof(desc_hid_mouse_report), EPNUM_MOUSE, CFG_TUD_HID_EP_BUFSIZE,\n      10)};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void)index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] = {\n  (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                  // 1: Manufacturer\n  \"TinyUSB Device\",           // 2: Product\n  NULL,                       // 3: Serials will use unique ID if possible\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void)langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL: chr_count = board_usb_get_serial(_desc_str + 1, 32); break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/hid_boot_interface/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\nenum\n{\n  ITF_NUM_KEYBOARD,\n  ITF_NUM_MOUSE,\n  ITF_NUM_TOTAL\n};\n\n#endif\n"
  },
  {
    "path": "examples/device/hid_composite/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(hid_composite C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/hid_composite/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/hid_composite/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/hid_composite/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED     = 1000,\n  BLINK_SUSPENDED   = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\nvoid hid_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {.role = TUSB_ROLE_DEVICE, .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n    hid_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void)remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// USB HID\n//--------------------------------------------------------------------+\n\nstatic void send_hid_report(uint8_t report_id, uint32_t btn) {\n  // skip if hid is not ready yet\n  if (!tud_hid_ready()) {\n    return;\n  }\n\n  switch (report_id) {\n    case REPORT_ID_KEYBOARD: {\n      // use to avoid send multiple consecutive zero report for keyboard\n      static bool has_keyboard_key = false;\n\n      if (btn != 0u) {\n        uint8_t keycode[6] = {0};\n        keycode[0]         = HID_KEY_A;\n\n        tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode);\n        has_keyboard_key = true;\n      } else {\n        // send empty key report if previously has key pressed\n        if (has_keyboard_key) {\n          tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);\n        }\n        has_keyboard_key = false;\n      }\n      break;\n    }\n\n    case REPORT_ID_MOUSE: {\n      int8_t const delta = 5;\n\n      // no button, right + down, no scroll, no pan\n      tud_hid_mouse_report(REPORT_ID_MOUSE, 0x00, delta, delta, 0, 0);\n      break;\n    }\n\n    case REPORT_ID_CONSUMER_CONTROL: {\n      // use to avoid send multiple consecutive zero report\n      static bool has_consumer_key = false;\n\n      if (btn != 0u) {\n        // volume down\n        uint16_t volume_down = HID_USAGE_CONSUMER_VOLUME_DECREMENT;\n        tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &volume_down, 2);\n        has_consumer_key = true;\n      } else {\n        // send empty key report (release key) if previously has key pressed\n        uint16_t empty_key = 0;\n        if (has_consumer_key) {\n          tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &empty_key, 2);\n        }\n        has_consumer_key = false;\n      }\n      break;\n    }\n\n    case REPORT_ID_GAMEPAD: {\n      // use to avoid send multiple consecutive zero report for keyboard\n      static bool has_gamepad_key = false;\n\n      hid_gamepad_report_t report = {.x = 0, .y = 0, .z = 0, .rz = 0, .rx = 0, .ry = 0, .hat = 0, .buttons = 0};\n\n      if (btn != 0u) {\n        report.hat     = GAMEPAD_HAT_UP;\n        report.buttons = GAMEPAD_BUTTON_A;\n        tud_hid_report(REPORT_ID_GAMEPAD, &report, sizeof(report));\n\n        has_gamepad_key = true;\n      } else {\n        report.hat     = GAMEPAD_HAT_CENTERED;\n        report.buttons = 0;\n        if (has_gamepad_key) {\n          tud_hid_report(REPORT_ID_GAMEPAD, &report, sizeof(report));\n        }\n        has_gamepad_key = false;\n      }\n      break;\n    }\n\n    case REPORT_ID_STYLUS_PEN: {\n      static bool         touch_state = false;\n      hid_stylus_report_t report      = {.attr = 0, .x = 0, .y = 0};\n\n      if (btn != 0u) {\n        report.attr = STYLUS_ATTR_TIP_SWITCH | STYLUS_ATTR_IN_RANGE;\n        report.x    = 100;\n        report.y    = 100;\n        tud_hid_report(REPORT_ID_STYLUS_PEN, &report, sizeof(report));\n        touch_state = true;\n      } else {\n        report.attr = 0;\n        if (touch_state) {\n          tud_hid_report(REPORT_ID_STYLUS_PEN, &report, sizeof(report));\n        }\n        touch_state = false;\n      }\n      break;\n    }\n\n    default: break; // unknown report id\n  }\n}\n\n// Every 10ms, we will sent 1 report for each HID profile (keyboard, mouse etc ..)\n// tud_hid_report_complete_cb() is used to send the next report after previous one is complete\nvoid hid_task(void) {\n  // Poll every 10ms\n  const uint32_t  interval_ms = 10;\n  static uint32_t start_ms    = 0;\n\n  if (tusb_time_millis_api() - start_ms < interval_ms) {\n    return; // not enough time\n  }\n  start_ms += interval_ms;\n\n  uint32_t const btn = board_button_read();\n\n  // Remote wakeup\n  if (tud_suspended() && btn != 0u) {\n    // Wake up host if we are in suspend mode\n    // and REMOTE_WAKEUP feature is enabled by host\n    tud_remote_wakeup();\n  } else {\n    // Send the 1st of report chain, the rest will be sent by tud_hid_report_complete_cb()\n    send_hid_report(REPORT_ID_KEYBOARD, btn);\n  }\n}\n\n// Invoked when sent REPORT successfully to host\n// Application can use this to send the next report\n// Note: For composite reports, report[0] is report ID\nvoid tud_hid_report_complete_cb(uint8_t instance, uint8_t const *report, uint16_t len) {\n  (void)instance;\n  (void)len;\n\n  uint8_t next_report_id = report[0] + 1u;\n\n  if (next_report_id < REPORT_ID_COUNT) {\n    send_hid_report(next_report_id, board_button_read());\n  }\n}\n\n// Invoked when received GET_REPORT control request\n// Application must fill buffer report's content and return its length.\n// Return zero will cause the stack to STALL request\nuint16_t tud_hid_get_report_cb(\n    uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t *buffer, uint16_t reqlen) {\n  // TODO not Implemented\n  (void)instance;\n  (void)report_id;\n  (void)report_type;\n  (void)buffer;\n  (void)reqlen;\n\n  return 0;\n}\n\n// Invoked when received SET_REPORT control request or\n// received data on OUT endpoint ( Report ID = 0, Type = 0 )\nvoid tud_hid_set_report_cb(\n    uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer, uint16_t bufsize) {\n  (void)instance;\n\n  if (report_type == HID_REPORT_TYPE_OUTPUT) {\n    // Set keyboard LED e.g Capslock, Numlock etc...\n    if (report_id == REPORT_ID_KEYBOARD) {\n      // bufsize should be (at least) 1\n      if (bufsize < 1) {\n        return;\n      }\n\n      uint8_t const kbd_leds = buffer[0];\n\n      if ((kbd_leds & KEYBOARD_LED_CAPSLOCK) != 0u) {\n        // Capslock On: disable blink, turn led on\n        blink_interval_ms = 0;\n        board_led_write(true);\n      } else {\n        // Caplocks Off: back to normal blink\n        board_led_write(false);\n        blink_interval_ms = BLINK_MOUNTED;\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms  = 0;\n  static bool     led_state = false;\n\n  // blink is disabled\n  if (0u == blink_interval_ms) {\n    return;\n  }\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/hid_composite/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_HID               1\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n// HID buffer size Should be sufficient to hold ID (if any) + Data\n#define CFG_TUD_HID_EP_BUFSIZE    16\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/hid_composite/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n    .bDeviceClass       = 0x00,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// HID Report Descriptor\n//--------------------------------------------------------------------+\n\nuint8_t const desc_hid_report[] =\n{\n  TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD         )),\n  TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(REPORT_ID_MOUSE            )),\n  TUD_HID_REPORT_DESC_STYLUS_PEN( HID_REPORT_ID(REPORT_ID_STYLUS_PEN     )),\n  TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL )),\n  TUD_HID_REPORT_DESC_GAMEPAD ( HID_REPORT_ID(REPORT_ID_GAMEPAD          ))\n};\n\n// Invoked when received GET HID REPORT DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_hid_descriptor_report_cb(uint8_t instance)\n{\n  (void) instance;\n  return desc_hid_report;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum\n{\n  ITF_NUM_HID,\n  ITF_NUM_TOTAL\n};\n\n#define  CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN)\n\n#define EPNUM_HID   0x81\n\nuint8_t const desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n\n  // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval\n  TUD_HID_DESCRIPTOR(ITF_NUM_HID, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 5)\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier =\n{\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = USB_BCD,\n\n  .bDeviceClass       = 0x00,\n  .bDeviceSubClass    = 0x00,\n  .bDeviceProtocol    = 0x00,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void)\n{\n  return (uint8_t const*) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n\n  // other speed config is basically configuration with type = OTHER_SPEED_CONFIG\n  memcpy(desc_other_speed_config, desc_configuration, CONFIG_TOTAL_LEN);\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  // this example use the same configuration for both high and full speed mode\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n\n  // This example use the same configuration for both high and full speed mode\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/hid_composite/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\nenum\n{\n  REPORT_ID_KEYBOARD = 1,\n  REPORT_ID_MOUSE,\n  REPORT_ID_STYLUS_PEN,\n  REPORT_ID_CONSUMER_CONTROL,\n  REPORT_ID_GAMEPAD,\n  REPORT_ID_COUNT\n};\n\n#endif /* USB_DESCRIPTORS_H_ */\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(hid_composite_freertos C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example with FreeRTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} freertos)\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/Makefile",
    "content": "RTOS = freertos\ninclude ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE = \\\n\tsrc/main.c \\\n\tsrc/usb_descriptors.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/sdkconfig.defaults",
    "content": "CONFIG_IDF_CMAKE=y\nCONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y\nCONFIG_FREERTOS_SUPPORT_STATIC_ALLOCATION=y\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/skip.txt",
    "content": "mcu:CH32F20X\nmcu:CH32V103\nmcu:CH32V20X\nmcu:CH32V307\nmcu:CXD56\nmcu:F1C100S\nmcu:GD32VF103\nmcu:MCXA15\nmcu:MKL25ZXX\nmcu:MSP430x5xx\nmcu:FT90X\nmcu:RP2040\nmcu:SAMD11\nmcu:VALENTYUSB_EPTRI\nmcu:RAXXX\nfamily:broadcom_32bit\nfamily:broadcom_64bit\nfamily:hpmicro\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/src/CMakeLists.txt",
    "content": "idf_component_register(SRCS \"main.c\" \"usb_descriptors.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n#ifdef ESP_PLATFORM\n  // ESP-IDF need \"freertos/\" prefix in include path.\n  // CFG_TUSB_OS_INC_PATH should be defined accordingly.\n  #include \"freertos/FreeRTOS.h\"\n  #include \"freertos/semphr.h\"\n  #include \"freertos/queue.h\"\n  #include \"freertos/task.h\"\n  #include \"freertos/timers.h\"\n\n  #define USBD_STACK_SIZE     4096\n\n#else\n  #include \"FreeRTOS.h\"\n  #include \"semphr.h\"\n  #include \"queue.h\"\n  #include \"task.h\"\n  #include \"timers.h\"\n\n  // Increase stack size when debug log is enabled\n  #define USBD_STACK_SIZE    (3*configMINIMAL_STACK_SIZE/2) * (CFG_TUSB_DEBUG ? 2 : 1)\n#endif\n\n#define HID_STACK_SZIE      (configMINIMAL_STACK_SIZE * (CFG_TUSB_DEBUG ? 2 : 1))\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\n// static timer & task\n#if configSUPPORT_STATIC_ALLOCATION\nStaticTimer_t blinky_tmdef;\n\nStackType_t  usb_device_stack[USBD_STACK_SIZE];\nStaticTask_t usb_device_taskdef;\n\nStackType_t  hid_stack[HID_STACK_SZIE];\nStaticTask_t hid_taskdef;\n#endif\n\nTimerHandle_t blinky_tm;\n\nvoid led_blinky_cb(TimerHandle_t xTimer);\nvoid usb_device_task(void* param);\nvoid hid_task(void* params);\n\n//--------------------------------------------------------------------+\n// Main\n//--------------------------------------------------------------------+\n\nint main(void)\n{\n  board_init();\n\n#if configSUPPORT_STATIC_ALLOCATION\n  // soft timer for blinky\n  blinky_tm = xTimerCreateStatic(NULL, pdMS_TO_TICKS(BLINK_NOT_MOUNTED), true, NULL, led_blinky_cb, &blinky_tmdef);\n\n  // Create a task for tinyusb device stack\n  xTaskCreateStatic(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_device_stack, &usb_device_taskdef);\n\n  // Create HID task\n  xTaskCreateStatic(hid_task, \"hid\", HID_STACK_SZIE, NULL, configMAX_PRIORITIES-2, hid_stack, &hid_taskdef);\n#else\n  blinky_tm = xTimerCreate(NULL, pdMS_TO_TICKS(BLINK_NOT_MOUNTED), true, NULL, led_blinky_cb);\n  xTaskCreate(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES-1, NULL);\n  xTaskCreate(hid_task, \"hid\", HID_STACK_SZIE, NULL, configMAX_PRIORITIES-2, NULL);\n#endif\n\n  xTimerStart(blinky_tm, 0);\n\n  // only start scheduler for non-espressif mcu\n#ifndef ESP_PLATFORM\n  vTaskStartScheduler();\n#endif\n\n  return 0;\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n// USB Device Driver task\n// This top level thread process all usb events and invoke callbacks\nvoid usb_device_task(void* param)\n{\n  (void) param;\n\n  // init device stack on configured roothub port\n  // This should be called after scheduler/kernel is started.\n  // Otherwise it could cause kernel issue since USB IRQ handler does use RTOS queue API.\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // RTOS forever loop\n  while (1)\n  {\n    // put this thread to waiting state until there is new events\n    tud_task();\n\n    // following code only run if tud_task() process at least 1 event\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void)\n{\n  xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_MOUNTED), 0);\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void)\n{\n  xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_NOT_MOUNTED), 0);\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en)\n{\n  (void) remote_wakeup_en;\n  xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_SUSPENDED), 0);\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void)\n{\n  if (tud_mounted())\n  {\n    xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_MOUNTED), 0);\n  }\n  else\n  {\n    xTimerChangePeriod(blinky_tm, pdMS_TO_TICKS(BLINK_NOT_MOUNTED), 0);\n  }\n}\n\n//--------------------------------------------------------------------+\n// USB HID\n//--------------------------------------------------------------------+\n\nstatic void send_hid_report(uint8_t report_id, uint32_t btn)\n{\n  // skip if hid is not ready yet\n  if ( !tud_hid_ready() ) return;\n\n  switch(report_id)\n  {\n    case REPORT_ID_KEYBOARD:\n    {\n      // use to avoid send multiple consecutive zero report for keyboard\n      static bool has_keyboard_key = false;\n\n      if ( btn )\n      {\n        uint8_t keycode[6] = { 0 };\n        keycode[0] = HID_KEY_A;\n\n        tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, keycode);\n        has_keyboard_key = true;\n      }else\n      {\n        // send empty key report if previously has key pressed\n        if (has_keyboard_key) tud_hid_keyboard_report(REPORT_ID_KEYBOARD, 0, NULL);\n        has_keyboard_key = false;\n      }\n    }\n    break;\n\n    case REPORT_ID_MOUSE:\n    {\n      int8_t const delta = 5;\n\n      // no button, right + down, no scroll, no pan\n      tud_hid_mouse_report(REPORT_ID_MOUSE, 0x00, delta, delta, 0, 0);\n    }\n    break;\n\n    case REPORT_ID_CONSUMER_CONTROL:\n    {\n      // use to avoid send multiple consecutive zero report\n      static bool has_consumer_key = false;\n\n      if ( btn )\n      {\n        // volume down\n        uint16_t volume_down = HID_USAGE_CONSUMER_VOLUME_DECREMENT;\n        tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &volume_down, 2);\n        has_consumer_key = true;\n      }else\n      {\n        // send empty key report (release key) if previously has key pressed\n        uint16_t empty_key = 0;\n        if (has_consumer_key) tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &empty_key, 2);\n        has_consumer_key = false;\n      }\n    }\n    break;\n\n    case REPORT_ID_GAMEPAD:\n    {\n      // use to avoid send multiple consecutive zero report for keyboard\n      static bool has_gamepad_key = false;\n\n      hid_gamepad_report_t report =\n      {\n        .x   = 0, .y = 0, .z = 0, .rz = 0, .rx = 0, .ry = 0,\n        .hat = 0, .buttons = 0\n      };\n\n      if ( btn )\n      {\n        report.hat = GAMEPAD_HAT_UP;\n        report.buttons = GAMEPAD_BUTTON_A;\n        tud_hid_report(REPORT_ID_GAMEPAD, &report, sizeof(report));\n\n        has_gamepad_key = true;\n      }else\n      {\n        report.hat = GAMEPAD_HAT_CENTERED;\n        report.buttons = 0;\n        if (has_gamepad_key) tud_hid_report(REPORT_ID_GAMEPAD, &report, sizeof(report));\n        has_gamepad_key = false;\n      }\n    }\n    break;\n\n    default: break;\n  }\n}\n\nvoid hid_task(void* param)\n{\n  (void) param;\n\n  while(1)\n  {\n    // Poll every 10ms\n    vTaskDelay(pdMS_TO_TICKS(10));\n\n    uint32_t const btn = board_button_read();\n\n    // Remote wakeup\n    if ( tud_suspended() && btn )\n    {\n      // Wake up host if we are in suspend mode\n      // and REMOTE_WAKEUP feature is enabled by host\n      tud_remote_wakeup();\n    }\n    else\n    {\n      // Send the 1st of report chain, the rest will be sent by tud_hid_report_complete_cb()\n      send_hid_report(REPORT_ID_KEYBOARD, btn);\n    }\n  }\n}\n\n// Invoked when sent REPORT successfully to host\n// Application can use this to send the next report\n// Note: For composite reports, report[0] is report ID\nvoid tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_t len)\n{\n  (void) instance;\n  (void) len;\n\n  uint8_t next_report_id = report[0] + 1;\n\n  if (next_report_id < REPORT_ID_COUNT)\n  {\n    send_hid_report(next_report_id, board_button_read());\n  }\n}\n\n\n// Invoked when received GET_REPORT control request\n// Application must fill buffer report's content and return its length.\n// Return zero will cause the stack to STALL request\nuint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen)\n{\n  // TODO not Implemented\n  (void) instance;\n  (void) report_id;\n  (void) report_type;\n  (void) buffer;\n  (void) reqlen;\n\n  return 0;\n}\n\n// Invoked when received SET_REPORT control request or\n// received data on OUT endpoint ( Report ID = 0, Type = 0 )\nvoid tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize)\n{\n  (void) instance;\n\n  if (report_type == HID_REPORT_TYPE_OUTPUT)\n  {\n    // Set keyboard LED e.g Capslock, Numlock etc...\n    if (report_id == REPORT_ID_KEYBOARD)\n    {\n      // bufsize should be (at least) 1\n      if ( bufsize < 1 ) return;\n\n      uint8_t const kbd_leds = buffer[0];\n\n      if (kbd_leds & KEYBOARD_LED_CAPSLOCK)\n      {\n        // Capslock On: disable blink, turn led on\n        xTimerStop(blinky_tm, portMAX_DELAY);\n        board_led_write(true);\n      }else\n      {\n        // Caplocks Off: back to normal blink\n        board_led_write(false);\n        xTimerStart(blinky_tm, portMAX_DELAY);\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinky_cb(TimerHandle_t xTimer)\n{\n  (void) xTimer;\n  static bool led_state = false;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT     0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by board.mk\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n// This examples use FreeRTOS\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_FREERTOS\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n// can be defined by compiler in DEBUG build\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_HID               1\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n// HID buffer size Should be sufficient to hold ID (if any) + Data\n#define CFG_TUD_HID_EP_BUFSIZE    16\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n    .bDeviceClass       = 0x00,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// HID Report Descriptor\n//--------------------------------------------------------------------+\n\nuint8_t const desc_hid_report[] =\n{\n  TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD         )),\n  TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(REPORT_ID_MOUSE            )),\n  TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL )),\n  TUD_HID_REPORT_DESC_GAMEPAD ( HID_REPORT_ID(REPORT_ID_GAMEPAD          ))\n};\n\n// Invoked when received GET HID REPORT DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_hid_descriptor_report_cb(uint8_t instance)\n{\n  (void) instance;\n  return desc_hid_report;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum\n{\n  ITF_NUM_HID,\n  ITF_NUM_TOTAL\n};\n\n#define  CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN)\n\n#define EPNUM_HID   0x81\n\nuint8_t const desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n\n  // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval\n  TUD_HID_DESCRIPTOR(ITF_NUM_HID, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID, CFG_TUD_HID_EP_BUFSIZE, 5)\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier =\n{\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = USB_BCD,\n\n  .bDeviceClass       = 0x00,\n  .bDeviceSubClass    = 0x00,\n  .bDeviceProtocol    = 0x00,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void)\n{\n  return (uint8_t const*) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n\n  // other speed config is basically configuration with type = OTHER_SPEED_CONFIG\n  memcpy(desc_other_speed_config, desc_configuration, CONFIG_TOTAL_LEN);\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  // this example use the same configuration for both high and full speed mode\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/hid_composite_freertos/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\nenum\n{\n  REPORT_ID_KEYBOARD = 1,\n  REPORT_ID_MOUSE,\n  REPORT_ID_CONSUMER_CONTROL,\n  REPORT_ID_GAMEPAD,\n  REPORT_ID_COUNT\n};\n\n#endif /* USB_DESCRIPTORS_H_ */\n"
  },
  {
    "path": "examples/device/hid_generic_inout/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(hid_generic_inout C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/hid_generic_inout/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/hid_generic_inout/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/hid_generic_inout/boards.js",
    "content": "module.exports = {\n\t\"Adafruit Boards\":[0x239A,0xFFFF],\n\t\"TinyUSB example\":[0xCAFE,0xFFFF]\n}\n"
  },
  {
    "path": "examples/device/hid_generic_inout/hid_test.js",
    "content": "// IMPORTANT: install the dependency via 'npm i node-hid' in the same location as the script\n// If the install fails on windows you may need to run 'npm i -g windows-build-tools' first to be able to compile native code needed for this library\n\nvar HID = require('node-hid');\nvar os = require('os')\n// list of supported devices\nvar boards = require('./boards.js')\nvar devices = HID.devices();\n\n// this will choose any device found in the boards.js file\nvar deviceInfo = devices.find(anySupportedBoard);\nvar reportLen = 64;\n\nvar message = \"Hello World!\"\n\n// Turn our string into an array of integers e.g. 'ascii codes', though charCodeAt spits out UTF-16\n// This means if you have characters in your string that are not Latin-1 you will have to add additional logic for character codes above 255\nvar messageBuffer = Array.from(message, function(c){return c.charCodeAt(0)});\n\n// HIDAPI requires us to prepend a 0 for single hid report as dummy reportID\nmessageBuffer.unshift(0)\n\n// Some OSes expect that you always send a buffer that equals your report length\n// So lets fill up the rest of the buffer with zeros\nvar paddingBuf = Array(reportLen-messageBuffer.length);\npaddingBuf.fill(0)\nmessageBuffer = messageBuffer.concat(paddingBuf)\n\n// check if we actually found a device and if so send our messageBuffer to it\nif( deviceInfo ) {\n\tconsole.log(deviceInfo)\n\tvar device = new HID.HID( deviceInfo.path );\n\n\t// register an event listener for data coming from the device\n\tdevice.on(\"data\", function(data) {\n\t\t// Print what we get from the device\n\t\tconsole.log(data.toString('ascii'));\n\t});\n\n\t// the same for any error that occur\n\tdevice.on(\"error\", function(err) {console.log(err)});\n\n\t// send our message to the device every 500ms\n\tsetInterval(function () {\n\t\tdevice.write(messageBuffer);\n\t},500)\n}\n\n\nfunction anySupportedBoard(d) {\n\n\tfor (var key in boards) {\n\t    if (boards.hasOwnProperty(key)) {\n\t        if (isDevice(boards[key],d)) {\n\t        \tconsole.log(\"Found \" + d.product);\n\t        \treturn true;\n\t        }\n\t    }\n\t}\n\treturn false;\n}\n\n\nfunction isDevice(board,d){\n\t// product id 0xff is matches all\n\treturn d.vendorId==board[0] && (d.productId==board[1] || board[1] == 0xFFFF);\n}\n"
  },
  {
    "path": "examples/device/hid_generic_inout/hid_test.py",
    "content": "#!/usr/bin/env python3\n# Install python3 HID package https://pypi.org/project/hid/\nimport hid\n\n# default is TinyUSB (0xcafe), Adafruit (0x239a), RaspberryPi (0x2e8a), Espressif (0x303a) VID\nUSB_VID = (0xcafe, 0x239a, 0x2e8a, 0x303a)\n\nprint(\"VID list: \" + \", \".join('%02x' % v for v in USB_VID))\n\nfor vid in  USB_VID:\n    for dict in hid.enumerate(vid):\n        print(dict)\n        dev = hid.Device(dict['vendor_id'], dict['product_id'])\n        if dev:\n            while True:\n                # Get input from console and encode to UTF8 for array of chars.\n                # hid generic in/out is single report therefore by HIDAPI requirement\n                # it must be preceded, with 0x00 as dummy reportID\n                str_out = b'\\x00'\n                str_out += input(\"Send text to HID Device : \").encode('utf-8')\n                dev.write(str_out)\n                str_in = dev.read(64)\n                print(\"Received from HID Device:\", str_in, '\\n')\n"
  },
  {
    "path": "examples/device/hid_generic_inout/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* This example demonstrate HID Generic raw Input & Output.\n * It will receive data from Host (In endpoint) and echo back (Out endpoint).\n * HID Report descriptor use vendor for usage page (using template TUD_HID_REPORT_DESC_GENERIC_INOUT)\n *\n * There are 2 ways to test the sketch\n * 1. Using nodejs\n * - Install nodejs and npm to your PC\n *\n * - Install excellent node-hid (https://github.com/node-hid/node-hid) by\n *   $ npm install node-hid\n *\n * - Run provided hid test script\n *   $ node hid_test.js\n *\n * 2. Using python\n * - Install `hid` package (https://pypi.org/project/hid/) by\n *   $ pip install hid\n *\n * - hid package replies on hidapi (https://github.com/libusb/hidapi) for backend,\n *   which already available in Linux. However on windows, you may need to download its dlls from their release page and\n *   copy it over to folder where python is installed.\n *\n * - Run provided hid test script to send and receive data to this device.\n *   $ python3 hid_test.py\n */\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void)\n{\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1)\n  {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void)\n{\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void)\n{\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en)\n{\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void)\n{\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// USB HID\n//--------------------------------------------------------------------+\n\n// Invoked when received GET_REPORT control request\n// Application must fill buffer report's content and return its length.\n// Return zero will cause the stack to STALL request\nuint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen)\n{\n  // TODO not Implemented\n  (void) itf;\n  (void) report_id;\n  (void) report_type;\n  (void) buffer;\n  (void) reqlen;\n\n  return 0;\n}\n\n// Invoked when received SET_REPORT control request or\n// received data on OUT endpoint ( Report ID = 0, Type = 0 )\nvoid tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize)\n{\n  // This example doesn't use multiple report and report ID\n  (void) itf;\n  (void) report_id;\n  (void) report_type;\n\n  // echo back anything we received from host\n  tud_hid_report(0, buffer, bufsize);\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void)\n{\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if ( tusb_time_millis_api() - start_ms < blink_interval_ms) return; // not enough time\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/hid_generic_inout/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               1\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n// HID buffer size Should be sufficient to hold ID (if any) + Data\n#define CFG_TUD_HID_EP_BUFSIZE    64\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/hid_generic_inout/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n    .bDeviceClass       = 0x00,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// HID Report Descriptor\n//--------------------------------------------------------------------+\n\nuint8_t const desc_hid_report[] =\n{\n  TUD_HID_REPORT_DESC_GENERIC_INOUT(CFG_TUD_HID_EP_BUFSIZE)\n};\n\n// Invoked when received GET HID REPORT DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_hid_descriptor_report_cb(uint8_t itf)\n{\n  (void) itf;\n  return desc_hid_report;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum\n{\n  ITF_NUM_HID,\n  ITF_NUM_TOTAL\n};\n\n#define  CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_HID_INOUT_DESC_LEN)\n\n#if defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_HID_OUT   0x01\n  #define EPNUM_HID_IN    0x82\n#else\n  #define EPNUM_HID_OUT   0x01\n  #define EPNUM_HID_IN    0x81\n#endif\n\nuint8_t const desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, protocol, report descriptor len, EP Out & In address, size & polling interval\n  TUD_HID_INOUT_DESCRIPTOR(ITF_NUM_HID, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_HID_OUT, EPNUM_HID_IN, CFG_TUD_HID_EP_BUFSIZE, 10)\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/hid_multiple_interface/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(hid_multiple_interface C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/hid_multiple_interface/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/hid_multiple_interface/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/hid_multiple_interface/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n// Interface index depends on the order in configuration descriptor\nenum {\n  ITF_KEYBOARD = 0,\n  ITF_MOUSE = 1\n};\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\nvoid hid_task(void);\n\n/*------------- MAIN -------------*/\nint main(void)\n{\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1)\n  {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n\n    hid_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void)\n{\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void)\n{\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en)\n{\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void)\n{\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// USB HID\n//--------------------------------------------------------------------+\n\nvoid hid_task(void)\n{\n  // Poll every 10ms\n  const uint32_t interval_ms = 10;\n  static uint32_t start_ms = 0;\n\n  if ( tusb_time_millis_api() - start_ms < interval_ms) return; // not enough time\n  start_ms += interval_ms;\n\n  uint32_t const btn = board_button_read();\n\n  // Remote wakeup\n  if ( tud_suspended() && btn )\n  {\n    // Wake up host if we are in suspend mode\n    // and REMOTE_WAKEUP feature is enabled by host\n    tud_remote_wakeup();\n  }\n\n  /*------------- Keyboard -------------*/\n  if ( tud_hid_n_ready(ITF_KEYBOARD) )\n  {\n    // use to avoid send multiple consecutive zero report for keyboard\n    static bool has_key = false;\n\n    if ( btn )\n    {\n      uint8_t keycode[6] = { 0 };\n      keycode[0] = HID_KEY_A;\n\n      tud_hid_n_keyboard_report(ITF_KEYBOARD, 0, 0, keycode);\n\n      has_key = true;\n    }else\n    {\n      // send empty key report if previously has key pressed\n      if (has_key) tud_hid_n_keyboard_report(ITF_KEYBOARD, 0, 0, NULL);\n      has_key = false;\n    }\n  }\n\n  /*------------- Mouse -------------*/\n  if ( tud_hid_n_ready(ITF_MOUSE) )\n  {\n    if ( btn )\n    {\n      int8_t const delta = 5;\n\n      // no button, right + down, no scroll pan\n      tud_hid_n_mouse_report(ITF_MOUSE, 0, 0x00, delta, delta, 0, 0);\n    }\n  }\n}\n\n\n// Invoked when received GET_REPORT control request\n// Application must fill buffer report's content and return its length.\n// Return zero will cause the stack to STALL request\nuint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen)\n{\n  // TODO not Implemented\n  (void) itf;\n  (void) report_id;\n  (void) report_type;\n  (void) buffer;\n  (void) reqlen;\n\n  return 0;\n}\n\n// Invoked when received SET_REPORT control request or\n// received data on OUT endpoint ( Report ID = 0, Type = 0 )\nvoid tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize)\n{\n  // TODO set LED based on CAPLOCK, NUMLOCK etc...\n  (void) itf;\n  (void) report_id;\n  (void) report_type;\n  (void) buffer;\n  (void) bufsize;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void)\n{\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if ( tusb_time_millis_api() - start_ms < blink_interval_ms) return; // not enough time\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/hid_multiple_interface/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_HID               2\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n// HID buffer size Should be sufficient to hold ID (if any) + Data\n#define CFG_TUD_HID_EP_BUFSIZE    8\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/hid_multiple_interface/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n    .bDeviceClass       = 0x00,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// HID Report Descriptor\n//--------------------------------------------------------------------+\n\nuint8_t const desc_hid_report1[] =\n{\n  TUD_HID_REPORT_DESC_KEYBOARD()\n};\n\nuint8_t const desc_hid_report2[] =\n{\n  TUD_HID_REPORT_DESC_MOUSE()\n};\n\n// Invoked when received GET HID REPORT DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_hid_descriptor_report_cb(uint8_t itf)\n{\n  if (itf == 0)\n  {\n    return desc_hid_report1;\n  }\n  else if (itf == 1)\n  {\n    return desc_hid_report2;\n  }\n\n  return NULL;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum\n{\n  ITF_NUM_HID1,\n  ITF_NUM_HID2,\n  ITF_NUM_TOTAL\n};\n\n#define  CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN + TUD_HID_DESC_LEN)\n\n#define EPNUM_HID1   0x81\n#define EPNUM_HID2   0x82\n\nuint8_t const desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n\n  // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval\n  TUD_HID_DESCRIPTOR(ITF_NUM_HID1, 4, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report1), EPNUM_HID1, CFG_TUD_HID_EP_BUFSIZE, 10),\n  TUD_HID_DESCRIPTOR(ITF_NUM_HID2, 5, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report2), EPNUM_HID2, CFG_TUD_HID_EP_BUFSIZE, 10)\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 },  // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                      // 1: Manufacturer\n  \"TinyUSB Device\",               // 2: Product\n  NULL,                           // 3: Serials will use unique ID if possible\n  \"Keyboard Interface\",           // 4: Interface 1 String\n  \"Mouse Interface\",              // 5: Interface 2 String\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/midi_test/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(midi_test C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/midi_test/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/midi_test/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/midi_test/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* This MIDI example send sequence of note (on/off) repeatedly. To test on PC, you need to install\n * synth software and midi connection management software. On\n * - Linux (Ubuntu): install qsynth, qjackctl. Then connect TinyUSB output port to FLUID Synth input port\n * - Windows: install MIDI-OX\n * - MacOS: SimpleSynth\n */\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\nvoid midi_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n    midi_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// MIDI Task\n//--------------------------------------------------------------------+\n\n// Variable that holds the current position in the sequence.\nuint32_t note_pos = 0;\n\n// Store example melody as an array of note values\nconst uint8_t note_sequence[] = {\n  74,78,81,86,90,93,98,102,57,61,66,69,73,78,81,85,88,92,97,100,97,92,88,85,81,78,\n  74,69,66,62,57,62,66,69,74,78,81,86,90,93,97,102,97,93,90,85,81,78,73,68,64,61,\n  56,61,64,68,74,78,81,86,90,93,98,102\n};\n\nvoid midi_task(void)\n{\n  static uint32_t start_ms = 0;\n\n  uint8_t const cable_num = 0; // MIDI jack associated with USB endpoint\n  uint8_t const channel   = 0; // 0 for channel 1\n\n  // The MIDI interface always creates input and output port/jack descriptors\n  // regardless of these being used or not. Therefore incoming traffic should be read\n  // (possibly just discarded) to avoid the sender blocking in IO\n  while (tud_midi_available()) {\n    uint8_t packet[4];\n    tud_midi_packet_read(packet);\n  }\n\n  // send note periodically\n  if (tusb_time_millis_api() - start_ms < 286) {\n    return; // not enough time\n  }\n  start_ms += 286;\n\n  // Previous positions in the note sequence.\n  int previous = (int) (note_pos - 1);\n\n  // If we currently are at position 0, set the\n  // previous position to the last note in the sequence.\n  if (previous < 0) {\n    previous = sizeof(note_sequence) - 1;\n  }\n\n  // Send Note On for current position at full velocity (127) on channel 1.\n  uint8_t note_on[3] = { 0x90 | channel, note_sequence[note_pos], 127 };\n  tud_midi_stream_write(cable_num, note_on, 3);\n\n  // Send Note Off for previous note.\n  uint8_t note_off[3] = { 0x80 | channel, note_sequence[previous], 0};\n  tud_midi_stream_write(cable_num, note_off, 3);\n\n  // Increment position\n  note_pos++;\n\n  // If we are at the end of the sequence, start over.\n  if (note_pos >= sizeof(note_sequence)) {\n    note_pos = 0;\n  }\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void)\n{\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if ( tusb_time_millis_api() - start_ms < blink_interval_ms) return; // not enough time\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/midi_test/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              1\n#define CFG_TUD_VENDOR            0\n\n// MIDI FIFO size of TX and RX\n#define CFG_TUD_MIDI_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_MIDI_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/midi_test/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n    .bDeviceClass       = 0x00,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum {\n  ITF_NUM_MIDI = 0,\n  ITF_NUM_MIDI_STREAMING,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_MIDI_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_MIDI_OUT  0x02\n  #define EPNUM_MIDI_IN   0x82\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_MIDI_OUT  0x02\n  #define EPNUM_MIDI_IN   0x81\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_MIDI_OUT  0x01\n  #define EPNUM_MIDI_IN   0x82\n\n#else\n  #define EPNUM_MIDI_OUT  0x01\n  #define EPNUM_MIDI_IN   0x81\n#endif\n\nstatic uint8_t const desc_fs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MIDI_DESCRIPTOR(ITF_NUM_MIDI, 0, EPNUM_MIDI_OUT, (0x80 | EPNUM_MIDI_IN), 64)\n};\n\n#if TUD_OPT_HIGH_SPEED\nstatic uint8_t const desc_hs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MIDI_DESCRIPTOR(ITF_NUM_MIDI, 0, EPNUM_MIDI_OUT, (0x80 | EPNUM_MIDI_IN), 512)\n};\n#endif\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ?  desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] = {\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      const size_t max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/midi_test_freertos/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(midi_test_freertos C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example with FreeRTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} freertos)\n"
  },
  {
    "path": "examples/device/midi_test_freertos/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/midi_test_freertos/Makefile",
    "content": "RTOS = freertos\ninclude ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n  src/main.c \\\n  src/usb_descriptors.c \\\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/midi_test_freertos/skip.txt",
    "content": "mcu:CH32F20X\nmcu:CH32V103\nmcu:CH32V20X\nmcu:CH32V307\nmcu:CXD56\nmcu:F1C100S\nmcu:GD32VF103\nmcu:MCXA15\nmcu:MKL25ZXX\nmcu:MSP430x5xx\nmcu:FT90X\nmcu:RP2040\nmcu:SAMD11\nmcu:VALENTYUSB_EPTRI\nmcu:RAXXX\nfamily:broadcom_32bit\nfamily:broadcom_64bit\nfamily:hpmicro\n"
  },
  {
    "path": "examples/device/midi_test_freertos/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS main.c usb_descriptors.c\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/midi_test_freertos/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* This MIDI example send sequence of note (on/off) repeatedly. To test on PC, you need to install\n * synth software and midi connection management software. On\n * - Linux (Ubuntu): install qsynth, qjackctl. Then connect TinyUSB output port to FLUID Synth input port\n * - Windows: install MIDI-OX\n * - MacOS: SimpleSynth\n */\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n#ifdef ESP_PLATFORM\n  #define USBD_STACK_SIZE     4096\n#else\n  // Increase stack size when debug log is enabled\n  #define USBD_STACK_SIZE    (3*configMINIMAL_STACK_SIZE/2) * (CFG_TUSB_DEBUG ? 2 : 1)\n#endif\n\n#define BLINKY_STACK_SIZE   configMINIMAL_STACK_SIZE\n#define MIDI_STACK_SIZE     (configMINIMAL_STACK_SIZE * (CFG_TUSB_DEBUG ? 2 : 1))\n\n// static task\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t blinky_stack[BLINKY_STACK_SIZE];\nStaticTask_t blinky_taskdef;\n\nStackType_t  usb_device_stack[USBD_STACK_SIZE];\nStaticTask_t usb_device_taskdef;\n\nStackType_t  midi_stack[MIDI_STACK_SIZE];\nStaticTask_t midi_taskdef;\n#endif\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid usb_device_task(void *param);\nvoid led_blinking_task(void* param);\nvoid midi_task(void* param);\n\n//--------------------------------------------------------------------+\n// Main\n//--------------------------------------------------------------------+\nint main(void) {\n  board_init();\n\n#if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);\n  xTaskCreateStatic(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_device_stack, &usb_device_taskdef);\n  xTaskCreateStatic(midi_task, \"midi\", MIDI_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, midi_stack, &midi_taskdef);\n#else\n  xTaskCreate(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, NULL);\n  xTaskCreate(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(midi_task, \"midi\", MIDI_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, NULL);\n#endif\n\n#ifndef ESP_PLATFORM\n  // only start scheduler for non-espressif mcu\n  vTaskStartScheduler();\n#endif\n\n  return 0;\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n// USB Device Driver task\n// This top level thread process all usb events and invoke callbacks\nvoid usb_device_task(void *param) {\n  (void) param;\n\n  // init device stack on configured roothub port\n  // This should be called after scheduler/kernel is started.\n  // Otherwise it could cause kernel issue since USB IRQ handler does use RTOS queue API.\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // RTOS forever loop\n  while (1) {\n    // put this thread to waiting state until there is new events\n    tud_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// MIDI Task\n//--------------------------------------------------------------------+\n\n// Store example melody as an array of note values\nconst uint8_t note_sequence[] = {\n  74,78,81,86,90,93,98,102,57,61,66,69,73,78,81,85,88,92,97,100,97,92,88,85,81,78,\n  74,69,66,62,57,62,66,69,74,78,81,86,90,93,97,102,97,93,90,85,81,78,73,68,64,61,\n  56,61,64,68,74,78,81,86,90,93,98,102\n};\n\nvoid midi_task(void* param) {\n  (void) param;\n\n  const uint8_t cable_num = 0; // MIDI jack associated with USB endpoint\n  const uint8_t channel   = 0; // 0 for channel 1\n\n  // Variable that holds the current position in the sequence.\n  uint32_t note_pos = 0;\n\n  while (1) {\n    // send note periodically\n    vTaskDelay(286  / portTICK_PERIOD_MS);\n\n    // Previous positions in the note sequence.\n    int previous = (int) (note_pos - 1);\n\n    // If we currently are at position 0, set the\n    // previous position to the last note in the sequence.\n    if (previous < 0) {\n      previous = sizeof(note_sequence) - 1;\n    }\n\n    // Send Note On for current position at full velocity (127) on channel 1.\n    uint8_t note_on[3] = { 0x90 | channel, note_sequence[note_pos], 127 };\n    tud_midi_stream_write(cable_num, note_on, 3);\n\n    // Send Note Off for previous note.\n    uint8_t note_off[3] = { 0x80 | channel, note_sequence[previous], 0};\n    tud_midi_stream_write(cable_num, note_off, 3);\n\n    // Increment position\n    note_pos++;\n\n    // If we are at the end of the sequence, start over.\n    if (note_pos >= sizeof(note_sequence)) {\n      note_pos = 0;\n    }\n\n    // The MIDI interface always creates input and output port/jack descriptors\n    // regardless of these being used or not. Therefore incoming traffic should be read\n    // (possibly just discarded) to avoid the sender blocking in IO\n    while (tud_midi_available()) {\n      uint8_t packet[4];\n      tud_midi_packet_read(packet);\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void* param) {\n  (void) param;\n  static bool led_state = false;\n\n  while (1) {\n    // Blink every interval ms\n    vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);\n\n    board_led_write(led_state);\n    led_state = 1 - led_state; // toggle\n  }\n}\n"
  },
  {
    "path": "examples/device/midi_test_freertos/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_FREERTOS\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              1\n#define CFG_TUD_VENDOR            0\n\n// MIDI FIFO size of TX and RX\n#define CFG_TUD_MIDI_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_MIDI_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/midi_test_freertos/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n    .bDeviceClass       = 0x00,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum {\n  ITF_NUM_MIDI = 0,\n  ITF_NUM_MIDI_STREAMING,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_MIDI_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_MIDI_OUT  0x02\n  #define EPNUM_MIDI_IN   0x82\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_MIDI_OUT  0x02\n  #define EPNUM_MIDI_IN   0x81\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_MIDI_OUT  0x01\n  #define EPNUM_MIDI_IN   0x82\n\n#else\n  #define EPNUM_MIDI_OUT  0x01\n  #define EPNUM_MIDI_IN   0x81\n#endif\n\nstatic uint8_t const desc_fs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MIDI_DESCRIPTOR(ITF_NUM_MIDI, 0, EPNUM_MIDI_OUT, (0x80 | EPNUM_MIDI_IN), 64)\n};\n\n#if TUD_OPT_HIGH_SPEED\nstatic uint8_t const desc_hs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MIDI_DESCRIPTOR(ITF_NUM_MIDI, 0, EPNUM_MIDI_OUT, (0x80 | EPNUM_MIDI_IN), 512)\n};\n#endif\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ?  desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] = {\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      const size_t max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/msc_dual_lun/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(msc_dual_lun C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nif (RTOS STREQUAL zephyr)\n  set(EXE_NAME app)\nelse()\n  set(EXE_NAME ${PROJECT_NAME})\n  add_executable(${EXE_NAME})\nendif()\n\n# Example source\ntarget_sources(${EXE_NAME} PRIVATE\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk_dual.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${EXE_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${EXE_NAME} ${RTOS})\n"
  },
  {
    "path": "examples/device/msc_dual_lun/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/msc_dual_lun/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/msc_dual_lun/prj.conf",
    "content": "CONFIG_GPIO=y\nCONFIG_FPU=y\nCONFIG_NO_OPTIMIZATIONS=y\nCONFIG_UART_INTERRUPT_DRIVEN=y\nCONFIG_NRFX_POWER=y\n"
  },
  {
    "path": "examples/device/msc_dual_lun/skip.txt",
    "content": "mcu:SAMD11\nmcu:MKL25ZXX\nfamily:espressif\n"
  },
  {
    "path": "examples/device/msc_dual_lun/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED     = 1000,\n  BLINK_SUSPENDED   = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Task parameter type: ULONG for ThreadX, void* for FreeRTOS and noos\n#if CFG_TUSB_OS == OPT_OS_THREADX\n  #define RTOS_PARAM ULONG\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  #define RTOS_PARAM void*\n  static void freertos_init(void);\n#else\n  #define RTOS_PARAM void*\n#endif\n\nvoid led_blinking_task(RTOS_PARAM param);\n\n//--------------------------------------------------------------------+\n// USB Device Task\n//--------------------------------------------------------------------+\nstatic void usb_device_init(void) {\n  tusb_rhport_init_t dev_init = {\n    .role  = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n  board_init_after_tusb();\n}\n\n#if CFG_TUSB_OS != OPT_OS_NONE && CFG_TUSB_OS != OPT_OS_PICO\nstatic void usb_device_task(RTOS_PARAM param) {\n  (void) param;\n  usb_device_init();\n\n  while (1) {\n    tud_task();\n  }\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Main\n//--------------------------------------------------------------------+\nint main(void) {\n  board_init();\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  freertos_init();\n\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n  tx_kernel_enter();\n\n#else\n  // noos + pico-sdk: init USB then run polling loop\n  usb_device_init();\n\n  while (1) {\n    tud_task();\n    led_blinking_task(NULL);\n  }\n#endif\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(RTOS_PARAM param) {\n  (void) param;\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  while (1) {\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n    vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n    tx_thread_sleep(_osal_ms2tick(blink_interval_ms));\n#else\n    if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n      return; // not enough time\n    }\n#endif\n\n    start_ms += blink_interval_ms;\n    board_led_write(led_state);\n    led_state = 1 - led_state; // toggle\n  }\n}\n\n//--------------------------------------------------------------------+\n// FreeRTOS\n//--------------------------------------------------------------------+\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n\n#ifdef ESP_PLATFORM\n#define USBD_STACK_SIZE   4096\n#else\n#define USBD_STACK_SIZE   (3*configMINIMAL_STACK_SIZE/2 * (CFG_TUSB_DEBUG ? 2 : 1))\n#endif\n#define BLINKY_STACK_SIZE   configMINIMAL_STACK_SIZE\n\n#if configSUPPORT_STATIC_ALLOCATION\nstatic StackType_t  _usb_device_stack[USBD_STACK_SIZE];\nstatic StaticTask_t _usb_device_taskdef;\nstatic StackType_t  _blinky_stack[BLINKY_STACK_SIZE];\nstatic StaticTask_t _blinky_taskdef;\n#endif\n\n\nstatic void freertos_init(void) {\n  #if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(usb_device_task,     \"usbd\",   USBD_STACK_SIZE,   NULL, configMAX_PRIORITIES - 1, _usb_device_stack, &_usb_device_taskdef);\n  xTaskCreateStatic(led_blinking_task,   \"blinky\", BLINKY_STACK_SIZE, NULL, 1,                        _blinky_stack,     &_blinky_taskdef);\n  #else\n  xTaskCreate(usb_device_task,           \"usbd\",   USBD_STACK_SIZE,   NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(led_blinking_task,         \"blinky\", BLINKY_STACK_SIZE, NULL, 1,                        NULL);\n  #endif\n  #ifndef ESP_PLATFORM\n  vTaskStartScheduler();\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// ThreadX\n//--------------------------------------------------------------------+\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n\n#define USBD_STACK_SIZE   4096\n#define BLINKY_STACK_SIZE 512\n\nstatic TX_THREAD _usb_device_thread;\nstatic ULONG     _usb_device_stack[USBD_STACK_SIZE / sizeof(ULONG)];\nstatic TX_THREAD _blinky_thread;\nstatic ULONG     _blinky_stack[BLINKY_STACK_SIZE / sizeof(ULONG)];\n\nvoid tx_application_define(void *first_unused_memory) {\n  (void) first_unused_memory;\n  static CHAR usbd_name[]   = \"usbd\";\n  static CHAR blinky_name[] = \"blinky\";\n  tx_thread_create(&_usb_device_thread, usbd_name, usb_device_task, 0,\n                   _usb_device_stack, USBD_STACK_SIZE,\n                   0, 0, TX_NO_TIME_SLICE, TX_AUTO_START);\n  tx_thread_create(&_blinky_thread, blinky_name, led_blinking_task, 0,\n                   _blinky_stack, BLINKY_STACK_SIZE,\n                   1, 1, TX_NO_TIME_SLICE, TX_AUTO_START);\n}\n\n#endif\n"
  },
  {
    "path": "examples/device/msc_dual_lun/src/msc_disk_dual.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#if CFG_TUD_MSC\n\n// When button is pressed, LUN1 will be set to not ready to simulate\n// medium not present (e.g SD card removed)\n\n// Some MCU doesn't have enough 8KB SRAM to store the whole disk\n// We will use Flash as read-only disk with board that has\n// CFG_EXAMPLE_MSC_READONLY defined\n#if defined(CFG_EXAMPLE_MSC_READONLY) || defined(CFG_EXAMPLE_MSC_DUAL_READONLY)\n  #define MSC_CONST const\n#else\n  #define MSC_CONST\n#endif\n\nenum {\n  DISK_BLOCK_NUM  = 16, // 8KB is the smallest size that windows allow to mount\n  DISK_BLOCK_SIZE = 512\n};\n\n\n//--------------------------------------------------------------------+\n// LUN 0\n//--------------------------------------------------------------------+\n#define README0_CONTENTS \\\n\"LUN0: This is tinyusb's MassStorage Class demo.\\r\\n\\r\\n\\\nIf you find any bugs or get any questions, feel free to file an\\r\\n\\\nissue at github.com/hathach/tinyusb\"\n\n\nMSC_CONST uint8_t msc_disk0[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] = {\n  //------------- Block0: Boot Sector -------------//\n  // byte_per_sector    = DISK_BLOCK_SIZE; fat12_sector_num_16  = DISK_BLOCK_NUM;\n  // sector_per_cluster = 1; reserved_sectors = 1;\n  // fat_num            = 1; fat12_root_entry_num = 16;\n  // sector_per_fat     = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0;\n  // drive_number       = 0x80; media_type = 0xf8; extended_boot_signature = 0x29;\n  // filesystem_type    = \"FAT12   \"; volume_serial_number = 0x1234; volume_label = \"TinyUSB 0  \";\n  // FAT magic code at offset 510-511\n  {\n      0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00,\n      0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x34, 0x12, 0x00, 0x00, 'T' , 'i' , 'n' , 'y' , 'U' ,\n      'S' , 'B' , ' ' , '0' , ' ' , ' ' , 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00,\n\n      // Zero up to 2 last bytes of FAT magic code\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA\n  },\n\n  //------------- Block1: FAT12 Table -------------//\n  {\n      0xF8, 0xFF, 0xFF, 0xFF, 0x0F // // first 2 entries must be F8FF, third entry is cluster end of readme file\n  },\n\n  //------------- Block2: Root Directory -------------//\n  {\n      // first entry is volume label\n      'T' , 'i' , 'n' , 'y' , 'U' , 'S' , 'B' , ' ' , '0' , ' ' , ' ' , 0x08, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      // second entry is readme file\n      'R' , 'E' , 'A' , 'D' , 'M' , 'E' , '0' , ' ' , 'T' , 'X' , 'T' , 0x20, 0x00, 0xC6, 0x52, 0x6D,\n      0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00,\n      sizeof(README0_CONTENTS)-1, 0x00, 0x00, 0x00 // readme's files size (4 Bytes)\n  },\n\n  //------------- Block3: Readme Content -------------//\n  README0_CONTENTS\n};\n\n//--------------------------------------------------------------------+\n// LUN 1\n//--------------------------------------------------------------------+\n#define README1_CONTENTS \\\n\"LUN1: This is tinyusb's MassStorage Class demo.\\r\\n\\r\\n\\\nIf you find any bugs or get any questions, feel free to file an\\r\\n\\\nissue at github.com/hathach/tinyusb\"\n\nMSC_CONST uint8_t msc_disk1[DISK_BLOCK_NUM][DISK_BLOCK_SIZE] =\n{\n  //------------- Block0: Boot Sector -------------//\n  // byte_per_sector    = DISK_BLOCK_SIZE; fat12_sector_num_16  = DISK_BLOCK_NUM;\n  // sector_per_cluster = 1; reserved_sectors = 1;\n  // fat_num            = 1; fat12_root_entry_num = 16;\n  // sector_per_fat     = 1; sector_per_track = 1; head_num = 1; hidden_sectors = 0;\n  // drive_number       = 0x80; media_type = 0xf8; extended_boot_signature = 0x29;\n  // filesystem_type    = \"FAT12   \"; volume_serial_number = 0x5678; volume_label = \"TinyUSB 1  \";\n  // FAT magic code at offset 510-511\n  {\n      0xEB, 0x3C, 0x90, 0x4D, 0x53, 0x44, 0x4F, 0x53, 0x35, 0x2E, 0x30, 0x00, 0x02, 0x01, 0x01, 0x00,\n      0x01, 0x10, 0x00, 0x10, 0x00, 0xF8, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x29, 0x78, 0x56, 0x00, 0x00, 'T' , 'i' , 'n' , 'y' , 'U' ,\n      'S' , 'B' , ' ' , '1' , ' ' , ' ' , 0x46, 0x41, 0x54, 0x31, 0x32, 0x20, 0x20, 0x20, 0x00, 0x00,\n\n      // Zero up to 2 last bytes of FAT magic code\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA\n  },\n\n  //------------- Block1: FAT12 Table -------------//\n  {\n      0xF8, 0xFF, 0xFF, 0xFF, 0x0F // // first 2 entries must be F8FF, third entry is cluster end of readme file\n  },\n\n  //------------- Block2: Root Directory -------------//\n  {\n      // first entry is volume label\n      'T' , 'i' , 'n' , 'y' , 'U' , 'S' , 'B' , ' ' , '1' , ' ' , ' ' , 0x08, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x6D, 0x65, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      // second entry is readme file\n      'R' , 'E' , 'A' , 'D' , 'M' , 'E' , '1' , ' ' , 'T' , 'X' , 'T' , 0x20, 0x00, 0xC6, 0x52, 0x6D,\n      0x65, 0x43, 0x65, 0x43, 0x00, 0x00, 0x88, 0x6D, 0x65, 0x43, 0x02, 0x00,\n      sizeof(README1_CONTENTS)-1, 0x00, 0x00, 0x00 // readme's files size (4 Bytes)\n  },\n\n  //------------- Block3: Readme Content -------------//\n  README1_CONTENTS\n};\n\n// Invoked to determine max LUN\nuint8_t tud_msc_get_maxlun_cb(void) {\n  return 2; // dual LUN\n}\n\n// Invoked when received SCSI_CMD_INQUIRY, v2 with full inquiry response\n// Some inquiry_resp's fields are already filled with default values, application can update them\n// Return length of inquiry response, typically sizeof(scsi_inquiry_resp_t) (36 bytes), can be longer if included vendor data.\nuint32_t tud_msc_inquiry2_cb(uint8_t lun, scsi_inquiry_resp_t *inquiry_resp, uint32_t bufsize) {\n  (void) lun;\n  (void) bufsize;\n  const char vid[] = \"TinyUSB\";\n  const char pid[] = \"Mass Storage\";\n  const char rev[] = \"1.0\";\n\n  strncpy((char*) inquiry_resp->vendor_id, vid, 8);\n  strncpy((char*) inquiry_resp->product_id, pid, 16);\n  strncpy((char*) inquiry_resp->product_rev, rev, 4);\n\n  return sizeof(scsi_inquiry_resp_t); // 36 bytes\n}\n\n// Invoked when received Test Unit Ready command.\n// return true allowing host to read/write this LUN e.g SD card inserted\nbool tud_msc_test_unit_ready_cb(uint8_t lun) {\n  return ( lun == 1 && board_button_read() ) ? false : true;\n}\n\n// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size\n// Application update block count and block size\nvoid tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size) {\n  (void) lun;\n\n  *block_count = DISK_BLOCK_NUM;\n  *block_size  = DISK_BLOCK_SIZE;\n}\n\n// Invoked when received Start Stop Unit command\n// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage\n// - Start = 1 : active mode, if load_eject = 1 : load disk storage\nbool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject) {\n  (void) lun;\n  (void) power_condition;\n\n  if (load_eject) {\n    if (start) {\n      // load disk storage\n    } else {\n      // unload disk storage\n    }\n  }\n\n  return true;\n}\n\n// Callback invoked when received READ10 command.\n// Copy disk's data to buffer (up to bufsize) and return number of copied bytes.\nint32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize) {\n  // out of ramdisk\n  if (lba >= DISK_BLOCK_NUM) return -1;\n\n  uint8_t const* addr = (lun ? msc_disk1[lba] : msc_disk0[lba]) + offset;\n  memcpy(buffer, addr, bufsize);\n\n  return (int32_t) bufsize;\n}\n\nbool tud_msc_is_writable_cb(uint8_t lun) {\n  (void) lun;\n\n#if defined(CFG_EXAMPLE_MSC_READONLY) || defined(CFG_EXAMPLE_MSC_DUAL_READONLY)\n  return false;\n#else\n  return true;\n#endif\n}\n\n// Callback invoked when received WRITE10 command.\n// Process data in buffer to disk's storage and return number of written bytes\nint32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize) {\n  // out of ramdisk\n  if (lba >= DISK_BLOCK_NUM) {\n    return -1;\n  }\n\n  #if defined(CFG_EXAMPLE_MSC_READONLY) || defined(CFG_EXAMPLE_MSC_DUAL_READONLY)\n  (void) lun;\n  (void) lba;\n  (void) offset;\n  (void) buffer;\n#else\n  uint8_t* addr = (lun ? msc_disk1[lba] : msc_disk0[lba])  + offset;\n  memcpy(addr, buffer, bufsize);\n#endif\n\n  return (int32_t) bufsize;\n}\n\n// Callback invoked when received an SCSI command not in built-in list below\n// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE\n// - READ10 and WRITE10 has their own callbacks (MUST not be handled here)\nint32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize) {\n  (void) buffer;\n  (void) bufsize;\n\n  switch (scsi_cmd[0]) {\n    default:\n      // Set Sense = Invalid Command Operation\n      tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);\n\n      // negative means error -> tinyusb could stall and/or response with failed status\n      return -1;\n  }\n}\n\n#endif\n"
  },
  {
    "path": "examples/device/msc_dual_lun/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               1\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n// MSC Buffer size of Device Mass storage\n#define CFG_TUD_MSC_EP_BUFSIZE    512\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/msc_dual_lun/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n    .bDeviceClass       = 0x00,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum\n{\n  ITF_NUM_MSC,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_MSC_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  //  0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_MSC_OUT   0x02\n  #define EPNUM_MSC_IN    0x82\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_MSC_OUT  0x02\n  #define EPNUM_MSC_IN   0x81\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_MSC_OUT  0x01\n  #define EPNUM_MSC_IN   0x82\n\n#else\n  #define EPNUM_MSC_OUT   0x01\n  #define EPNUM_MSC_IN    0x81\n\n#endif\n\nstatic uint8_t const desc_fs_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 0, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\nstatic uint8_t const desc_hs_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 0, EPNUM_MSC_OUT, EPNUM_MSC_IN, 512),\n};\n#endif\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ?  desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/mtp/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(mtp C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nif (RTOS STREQUAL zephyr)\n  set(EXE_NAME app)\nelse()\n  set(EXE_NAME ${PROJECT_NAME})\n  add_executable(${EXE_NAME})\nendif()\n\n# Example source\ntarget_sources(${EXE_NAME} PRIVATE\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/mtp_fs_example.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${EXE_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${EXE_NAME} ${RTOS})\n"
  },
  {
    "path": "examples/device/mtp/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/mtp/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/mtp/prj.conf",
    "content": "CONFIG_GPIO=y\nCONFIG_FPU=y\nCONFIG_NO_OPTIMIZATIONS=y\nCONFIG_UART_INTERRUPT_DRIVEN=y\nCONFIG_NRFX_POWER=y\nCONFIG_NRFX_UARTE0=y\n"
  },
  {
    "path": "examples/device/mtp/skip.txt",
    "content": "board:cynthion_d11\n"
  },
  {
    "path": "examples/device/mtp/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ennebi Elettronica (https://ennebielettronica.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) return; // not enough time\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/mtp/src/mtp_fs_example.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ennebi Elettronica (https://ennebielettronica.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#include \"tinyusb_logo_png.h\"\n\n//--------------------------------------------------------------------+\n// Dataset\n//--------------------------------------------------------------------+\n\n//------------- device info -------------//\n#define DEV_INFO_MANUFACTURER   \"TinyUSB\"\n#define DEV_INFO_MODEL          \"MTP Example\"\n#define DEV_INFO_VERSION        \"1.0\"\n#define DEV_PROP_FRIENDLY_NAME  \"TinyUSB MTP\"\n\n//------------- storage info -------------//\n#define STORAGE_DESCRIPTION { 'd', 'i', 's', 'k', 0 }\n#define VOLUME_IDENTIFIER { 'v', 'o', 'l', 0 }\n\nenum {\n  STORAGE_DESC_LEN = TU_ARRAY_SIZE((uint16_t[]) STORAGE_DESCRIPTION),\n  VOLUME_ID_LEN = TU_ARRAY_SIZE((uint16_t[])VOLUME_IDENTIFIER)\n};\n\ntypedef MTP_STORAGE_INFO_STRUCT(STORAGE_DESC_LEN, VOLUME_ID_LEN) storage_info_t;\n\nstorage_info_t storage_info = {\n  #ifdef CFG_EXAMPLE_MTP_READONLY\n  .storage_type = MTP_STORAGE_TYPE_FIXED_ROM,\n  #else\n  .storage_type = MTP_STORAGE_TYPE_FIXED_RAM,\n  #endif\n\n  .filesystem_type = MTP_FILESYSTEM_TYPE_GENERIC_HIERARCHICAL,\n  .access_capability = MTP_ACCESS_CAPABILITY_READ_WRITE,\n  .max_capacity_in_bytes = 0, // calculated at runtime\n  .free_space_in_bytes = 0, // calculated at runtime\n  .free_space_in_objects = 0, // calculated at runtime\n  .storage_description = {\n    .count = (TU_FIELD_SIZE(storage_info_t, storage_description)-1) / sizeof(uint16_t),\n    .utf16 = STORAGE_DESCRIPTION\n  },\n  .volume_identifier = {\n    .count = (TU_FIELD_SIZE(storage_info_t, volume_identifier)-1) / sizeof(uint16_t),\n    .utf16 = VOLUME_IDENTIFIER\n  }\n};\n\n//--------------------------------------------------------------------+\n// MTP FILESYSTEM\n//--------------------------------------------------------------------+\n// only allow to add 1 more object to make it simpler to manage memory\n#define FS_MAX_FILE_COUNT 3UL\n#define FS_MAX_FILENAME_LEN 16\n\n#ifdef CFG_EXAMPLE_MTP_READONLY\n  #define FS_MAX_CAPACITY_BYTES  0\n#else\n  #define FS_MAX_CAPACITY_BYTES (4 * 1024UL)\n\n  // object data buffer (excluding 2 predefined files) with simple allocation pointer\n  uint8_t fs_buf[FS_MAX_CAPACITY_BYTES];\n#endif\n\n#define FS_FIXED_DATETIME \"20250808T173500.0\" // \"YYYYMMDDTHHMMSS.s\"\n#define README_TXT_CONTENT \"TinyUSB MTP Filesystem example\"\n\ntypedef struct {\n  uint16_t name[FS_MAX_FILENAME_LEN];\n  uint16_t object_format;\n  uint16_t protection_status;\n  uint32_t image_pix_width;\n  uint32_t image_pix_height;\n  uint32_t image_bit_depth;\n  uint32_t parent;\n  uint16_t association_type;\n  uint32_t size;\n  uint8_t* data;\n} fs_file_t;\n\n// Files system, handle is index + 1\nstatic fs_file_t fs_objects[FS_MAX_FILE_COUNT] = {\n  {\n    .name = { 'r', 'e', 'a', 'd', 'm', 'e', '.', 't', 'x', 't', 0 }, // readme.txt\n    .object_format = MTP_OBJ_FORMAT_TEXT,\n    .protection_status = MTP_PROTECTION_STATUS_READ_ONLY,\n    .image_pix_width = 0,\n    .image_pix_height = 0,\n    .image_bit_depth = 0,\n    .parent = 0,\n    .association_type = MTP_ASSOCIATION_UNDEFINED,\n    .size = sizeof(README_TXT_CONTENT)-1,\n    .data = (uint8_t*) (uintptr_t) README_TXT_CONTENT,\n  },\n  {\n    .name = { 't', 'i', 'n', 'y', 'u', 's', 'b', '.', 'p', 'n', 'g', 0 }, // \"tinyusb.png\"\n    .object_format = MTP_OBJ_FORMAT_PNG,\n    .protection_status = MTP_PROTECTION_STATUS_READ_ONLY,\n    .image_pix_width = 128,\n    .image_pix_height = 64,\n    .image_bit_depth = 32,\n    .parent = 0,\n    .association_type = MTP_ASSOCIATION_UNDEFINED,\n    .size = LOGO_LEN,\n    .data = (uint8_t*) (uintptr_t) logo_bin\n  }\n};\n\nenum {\n  SUPPORTED_STORAGE_ID = 0x00010001u // physical = 1, logical = 1\n};\n\nstatic int32_t fs_get_device_info(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_open_close_session(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_get_storage_ids(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_get_storage_info(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_get_device_properties(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_get_object_handles(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_get_object_info(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_get_object(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_delete_object(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_send_object_info(tud_mtp_cb_data_t* cb_data);\nstatic int32_t fs_send_object(tud_mtp_cb_data_t* cb_data);\n\ntypedef int32_t (*fs_op_handler_t)(tud_mtp_cb_data_t* cb_data);\ntypedef struct {\n  uint32_t op_code;\n  fs_op_handler_t handler;\n}fs_op_handler_dict_t;\n\nfs_op_handler_dict_t fs_op_handler_dict[] = {\n  { MTP_OP_GET_DEVICE_INFO,       fs_get_device_info    },\n  { MTP_OP_OPEN_SESSION,          fs_open_close_session },\n  { MTP_OP_CLOSE_SESSION,         fs_open_close_session },\n  { MTP_OP_GET_STORAGE_IDS,       fs_get_storage_ids       },\n  { MTP_OP_GET_STORAGE_INFO,      fs_get_storage_info      },\n  { MTP_OP_GET_DEVICE_PROP_DESC,  fs_get_device_properties  },\n  { MTP_OP_GET_DEVICE_PROP_VALUE, fs_get_device_properties },\n  { MTP_OP_GET_OBJECT_HANDLES,    fs_get_object_handles    },\n  { MTP_OP_GET_OBJECT_INFO,       fs_get_object_info       },\n  { MTP_OP_GET_OBJECT,            fs_get_object            },\n  { MTP_OP_DELETE_OBJECT,         fs_delete_object         },\n  { MTP_OP_SEND_OBJECT_INFO,      fs_send_object_info      },\n  { MTP_OP_SEND_OBJECT,           fs_send_object           },\n};\n\nstatic bool is_session_opened = false;\nstatic uint32_t send_obj_handle = 0;\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n// Get pointer to object info from handle\nstatic inline fs_file_t* fs_get_file(uint32_t handle) {\n  if (handle == 0 || handle > FS_MAX_FILE_COUNT) {\n    return NULL;\n  }\n  return &fs_objects[handle-1];\n}\n\nstatic inline bool fs_file_exist(fs_file_t* f) {\n  return f->name[0] != 0;\n}\n\n// Get the number of allocated nodes in filesystem\nstatic uint32_t fs_get_file_count(void) {\n  uint32_t count = 0;\n  for (size_t i = 0; i < FS_MAX_FILE_COUNT; i++) {\n    if (fs_file_exist(&fs_objects[i])) {\n      count++;\n    }\n  }\n  return count;\n}\n\nstatic inline fs_file_t* fs_create_file(void) {\n  for (size_t i = 0; i < FS_MAX_FILE_COUNT; i++) {\n    fs_file_t* f = &fs_objects[i];\n    if (!fs_file_exist(f)) {\n      send_obj_handle = i + 1;\n      return f;\n    }\n  }\n  return NULL;\n}\n\n// simple malloc\nstatic inline uint8_t* fs_malloc(size_t size) {\n#ifdef CFG_EXAMPLE_MTP_READONLY\n  (void) size;\n  return NULL;\n#else\n  if (size > FS_MAX_CAPACITY_BYTES)  {\n    return NULL;\n  }\n  return fs_buf;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Control Request callback\n//--------------------------------------------------------------------+\nbool tud_mtp_request_cancel_cb(tud_mtp_request_cb_data_t* cb_data) {\n  mtp_request_reset_cancel_data_t cancel_data;\n  memcpy(&cancel_data, cb_data->buf, sizeof(cancel_data));\n  (void) cancel_data.code;\n  (void ) cancel_data.transaction_id;\n  return true;\n}\n\n// Invoked when received Device Reset request\n// return false to stall the request\nbool tud_mtp_request_device_reset_cb(tud_mtp_request_cb_data_t* cb_data) {\n  (void) cb_data;\n  return true;\n}\n\n// Invoked when received Get Extended Event request. Application fill callback data's buffer for response\n// return negative to stall the request\nint32_t tud_mtp_request_get_extended_event_cb(tud_mtp_request_cb_data_t* cb_data) {\n  (void) cb_data;\n  return false; // not implemented yet\n}\n\n// Invoked when received Get DeviceStatus request. Application fill callback data's buffer for response\n// return negative to stall the request\nint32_t tud_mtp_request_get_device_status_cb(tud_mtp_request_cb_data_t* cb_data) {\n  uint16_t* buf16 = (uint16_t*)(uintptr_t) cb_data->buf;\n  buf16[0] = 4; // length\n  buf16[1] = MTP_RESP_OK; // status\n  return 4;\n}\n\n//--------------------------------------------------------------------+\n// Bulk Only Protocol\n//--------------------------------------------------------------------+\nint32_t tud_mtp_command_received_cb(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  fs_op_handler_t handler = NULL;\n  for (size_t i = 0; i < TU_ARRAY_SIZE(fs_op_handler_dict); i++) {\n    if (fs_op_handler_dict[i].op_code == command->header.code) {\n      handler = fs_op_handler_dict[i].handler;\n      break;\n    }\n  }\n\n  int32_t resp_code;\n  if (handler == NULL) {\n    resp_code = MTP_RESP_OPERATION_NOT_SUPPORTED;\n  } else {\n    resp_code = handler(cb_data);\n    if (resp_code > MTP_RESP_UNDEFINED) {\n      // send response if needed\n      io_container->header->code = (uint16_t)resp_code;\n      tud_mtp_response_send(io_container);\n    }\n  }\n\n  return resp_code;\n}\n\nint32_t tud_mtp_data_xfer_cb(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n\n  fs_op_handler_t handler = NULL;\n  for (size_t i = 0; i < TU_ARRAY_SIZE(fs_op_handler_dict); i++) {\n    if (fs_op_handler_dict[i].op_code == command->header.code) {\n      handler = fs_op_handler_dict[i].handler;\n      break;\n    }\n  }\n\n  int32_t resp_code;\n  if (handler == NULL) {\n    resp_code = MTP_RESP_OPERATION_NOT_SUPPORTED;\n  } else {\n    resp_code = handler(cb_data);\n    if (resp_code > MTP_RESP_UNDEFINED) {\n      // send response if needed\n      io_container->header->code = (uint16_t)resp_code;\n      tud_mtp_response_send(io_container);\n    }\n  }\n\n  return 0;\n}\n\nint32_t tud_mtp_data_complete_cb(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* resp = &cb_data->io_container;\n  switch (command->header.code) {\n    case MTP_OP_SEND_OBJECT_INFO: {\n      fs_file_t* f = fs_get_file(send_obj_handle);\n      if (f == NULL) {\n        resp->header->code = MTP_RESP_GENERAL_ERROR;\n        break;\n      }\n      // parameter is: storage id, parent handle, new handle\n      (void) mtp_container_add_uint32(resp, SUPPORTED_STORAGE_ID);\n      (void) mtp_container_add_uint32(resp, f->parent);\n      (void) mtp_container_add_uint32(resp, send_obj_handle);\n      resp->header->code = MTP_RESP_OK;\n      break;\n    }\n\n    default:\n      resp->header->code = (cb_data->xfer_result == XFER_RESULT_SUCCESS) ? MTP_RESP_OK : MTP_RESP_GENERAL_ERROR;\n      break;\n  }\n\n  tud_mtp_response_send(resp);\n  return 0;\n}\n\nint32_t tud_mtp_response_complete_cb(tud_mtp_cb_data_t* cb_data) {\n  (void) cb_data;\n  return 0; // nothing to do\n}\n\n//--------------------------------------------------------------------+\n// File System Handlers\n//--------------------------------------------------------------------+\nstatic int32_t fs_get_device_info(tud_mtp_cb_data_t* cb_data) {\n  // Device info is already prepared up to playback formats. Application only need to add string fields\n  int32_t resp_code = 0;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  (void) mtp_container_add_cstring(io_container, DEV_INFO_MANUFACTURER);\n  (void) mtp_container_add_cstring(io_container, DEV_INFO_MODEL);\n  (void) mtp_container_add_cstring(io_container, DEV_INFO_VERSION);\n\n  enum { MAX_SERIAL_NCHARS = 32 };\n  uint16_t serial_utf16[MAX_SERIAL_NCHARS+1];\n  size_t nchars = board_usb_get_serial(serial_utf16, MAX_SERIAL_NCHARS);\n  serial_utf16[tu_min32(nchars, MAX_SERIAL_NCHARS)] = 0; // ensure null termination\n  (void) mtp_container_add_string(io_container, serial_utf16);\n\n  if (!tud_mtp_data_send(io_container)) {\n    resp_code = MTP_RESP_DEVICE_BUSY;\n  }\n  return resp_code;\n}\n\nstatic int32_t fs_open_close_session(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  if (command->header.code == MTP_OP_OPEN_SESSION) {\n    if (is_session_opened) {\n      return MTP_RESP_SESSION_ALREADY_OPEN;\n    }\n    is_session_opened = true;\n  } else { // close session\n    if (!is_session_opened) {\n      return MTP_RESP_SESSION_NOT_OPEN;\n    }\n    is_session_opened = false;\n  }\n  return MTP_RESP_OK;\n}\n\nstatic int32_t fs_get_storage_ids(tud_mtp_cb_data_t* cb_data) {\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  uint32_t storage_ids [] = { SUPPORTED_STORAGE_ID };\n  (void) mtp_container_add_auint32(io_container, 1, storage_ids);\n  tud_mtp_data_send(io_container);\n  return 0;\n}\n\nstatic int32_t fs_get_storage_info(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  const uint32_t storage_id = command->params[0];\n  TU_VERIFY(SUPPORTED_STORAGE_ID == storage_id, -1);\n  // update storage info with current free space\n  storage_info.max_capacity_in_bytes = sizeof(README_TXT_CONTENT) + LOGO_LEN + FS_MAX_CAPACITY_BYTES;\n  storage_info.free_space_in_objects = FS_MAX_FILE_COUNT - fs_get_file_count();\n  storage_info.free_space_in_bytes = storage_info.free_space_in_objects ? FS_MAX_CAPACITY_BYTES : 0;\n  (void) mtp_container_add_raw(io_container, &storage_info, sizeof(storage_info));\n  tud_mtp_data_send(io_container);\n  return 0;\n}\n\nstatic int32_t fs_get_device_properties(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  const uint16_t dev_prop_code = (uint16_t) command->params[0];\n\n  if (command->header.code == MTP_OP_GET_DEVICE_PROP_DESC) {\n    // get describing dataset\n    mtp_device_prop_desc_header_t device_prop_header;\n    device_prop_header.device_property_code = dev_prop_code;\n    switch (dev_prop_code) {\n      case MTP_DEV_PROP_DEVICE_FRIENDLY_NAME:\n        device_prop_header.datatype = MTP_DATA_TYPE_STR;\n        device_prop_header.get_set = MTP_MODE_GET;\n        (void) mtp_container_add_raw(io_container, &device_prop_header, sizeof(device_prop_header));\n        (void) mtp_container_add_cstring(io_container, DEV_PROP_FRIENDLY_NAME); // factory\n        (void) mtp_container_add_cstring(io_container, DEV_PROP_FRIENDLY_NAME); // current\n        (void) mtp_container_add_uint8(io_container, 0); // no form\n        tud_mtp_data_send(io_container);\n        break;\n\n      default:\n        return MTP_RESP_PARAMETER_NOT_SUPPORTED;\n    }\n  } else {\n    // get value\n    switch (dev_prop_code) {\n      case MTP_DEV_PROP_DEVICE_FRIENDLY_NAME:\n        (void) mtp_container_add_cstring(io_container, DEV_PROP_FRIENDLY_NAME);\n        tud_mtp_data_send(io_container);\n        break;\n\n      default:\n        return MTP_RESP_PARAMETER_NOT_SUPPORTED;\n    }\n  }\n  return 0;\n}\n\nstatic int32_t fs_get_object_handles(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n\n  const uint32_t storage_id = command->params[0];\n  const uint32_t obj_format = command->params[1]; // optional\n  const uint32_t parent_handle = command->params[2]; // folder handle, 0xFFFFFFFF is root\n  (void)obj_format;\n\n  if (storage_id != 0xFFFFFFFFu && storage_id != SUPPORTED_STORAGE_ID) {\n    return MTP_RESP_INVALID_STORAGE_ID;\n  }\n\n  uint32_t handles[FS_MAX_FILE_COUNT] = { 0 };\n  uint32_t count = 0u;\n  for (uint8_t i = 0u; i < FS_MAX_FILE_COUNT; i++) {\n    fs_file_t* f = &fs_objects[i];\n    if (fs_file_exist(f) &&\n        (parent_handle == f->parent || (parent_handle == 0xFFFFFFFFu && f->parent == 0u))) {\n      handles[count++] = (uint32_t) i + 1u; // handle is index + 1\n    }\n  }\n  (void) mtp_container_add_auint32(io_container, count, handles);\n  tud_mtp_data_send(io_container);\n\n  return 0;\n}\n\nstatic int32_t fs_get_object_info(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  const uint32_t obj_handle = command->params[0];\n  fs_file_t* f = fs_get_file(obj_handle);\n  if (f == NULL) {\n    return MTP_RESP_INVALID_OBJECT_HANDLE;\n  }\n  mtp_object_info_header_t obj_info_header = {\n    .storage_id = SUPPORTED_STORAGE_ID,\n    .object_format = f->object_format,\n    .protection_status =  f->protection_status,\n    .object_compressed_size = f->size,\n    .thumb_format = MTP_OBJ_FORMAT_UNDEFINED,\n    .thumb_compressed_size = 0,\n    .thumb_pix_width = 0,\n    .thumb_pix_height = 0,\n    .image_pix_width = f->image_pix_width,\n    .image_pix_height = f->image_pix_height,\n    .image_bit_depth = f->image_bit_depth,\n    .parent_object = f->parent,\n    .association_type = f->association_type,\n    .association_desc = 0,\n    .sequence_number = 0\n  };\n  (void) mtp_container_add_raw(io_container, &obj_info_header, sizeof(obj_info_header));\n  (void) mtp_container_add_string(io_container, f->name);\n  (void) mtp_container_add_cstring(io_container, FS_FIXED_DATETIME);\n  (void) mtp_container_add_cstring(io_container, FS_FIXED_DATETIME);\n  (void) mtp_container_add_cstring(io_container, \"\"); // keywords, not used\n  tud_mtp_data_send(io_container);\n\n  return 0;\n}\n\nstatic int32_t fs_get_object(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  const uint32_t obj_handle = command->params[0];\n  const fs_file_t* f = fs_get_file(obj_handle);\n  if (f == NULL) {\n    return MTP_RESP_INVALID_OBJECT_HANDLE;\n  }\n\n  if (cb_data->phase == MTP_PHASE_COMMAND) {\n    // If file contents is larger than CFG_TUD_MTP_EP_BUFSIZE, data may only partially is added here\n    // the rest will be sent in tud_mtp_data_more_cb\n    (void) mtp_container_add_raw(io_container, f->data, f->size);\n    tud_mtp_data_send(io_container);\n  } else if (cb_data->phase == MTP_PHASE_DATA) {\n    // continue sending remaining data: file contents offset is xferred byte minus header size\n    const uint32_t offset = cb_data->total_xferred_bytes - sizeof(mtp_container_header_t);\n    const uint32_t xact_len = tu_min32(f->size - offset, io_container->payload_bytes);\n    if (xact_len > 0) {\n      memcpy(io_container->payload, f->data + offset, xact_len);\n      tud_mtp_data_send(io_container);\n    }\n  } else {\n    // nothing to do\n  }\n\n  return 0;\n}\n\nstatic int32_t fs_send_object_info(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  const uint32_t storage_id = command->params[0];\n  const uint32_t parent_handle = command->params[1]; // folder handle, 0xFFFFFFFF is root\n  (void) parent_handle;\n\n  if (!is_session_opened) {\n    return MTP_RESP_SESSION_NOT_OPEN;\n  }\n  if (storage_id != 0xFFFFFFFFu && storage_id != SUPPORTED_STORAGE_ID) {\n    return MTP_RESP_INVALID_STORAGE_ID;\n  }\n\n  if (cb_data->phase == MTP_PHASE_COMMAND) {\n    (void) tud_mtp_data_receive(io_container);\n  } else if (cb_data->phase == MTP_PHASE_DATA) {\n    mtp_object_info_header_t* obj_info = (mtp_object_info_header_t*) io_container->payload;\n    if (obj_info->storage_id != 0 && obj_info->storage_id != SUPPORTED_STORAGE_ID) {\n      return MTP_RESP_INVALID_STORAGE_ID;\n    }\n\n    if (obj_info->parent_object != 0 && obj_info->parent_object != 0xFFFFFFFFu) { // not root\n      fs_file_t* parent = fs_get_file(obj_info->parent_object);\n      if (parent == NULL || 0u == parent->association_type) {\n        return MTP_RESP_INVALID_PARENT_OBJECT;\n      }\n    }\n\n    uint8_t* f_buf = fs_malloc(obj_info->object_compressed_size);\n    if (f_buf == NULL) {\n      return MTP_RESP_STORE_FULL;\n    }\n    fs_file_t* f = fs_create_file();\n    if (f == NULL) {\n      return MTP_RESP_STORE_FULL;\n    }\n\n    f->object_format = obj_info->object_format;\n    f->protection_status = obj_info->protection_status;\n    f->image_pix_width = obj_info->image_pix_width;\n    f->image_pix_height = obj_info->image_pix_height;\n    f->image_bit_depth = obj_info->image_bit_depth;\n    f->parent = obj_info->parent_object;\n    f->association_type = obj_info->association_type;\n    f->size = obj_info->object_compressed_size;\n    f->data = f_buf;\n    uint8_t* buf = io_container->payload + sizeof(mtp_object_info_header_t);\n    (void) mtp_container_get_string(buf, f->name);\n    // ignore date created/modified/keywords\n  } else {\n    // nothing to do\n  }\n\n  return 0;\n}\n\nstatic int32_t fs_send_object(tud_mtp_cb_data_t* cb_data) {\n  mtp_container_info_t* io_container = &cb_data->io_container;\n  fs_file_t* f = fs_get_file(send_obj_handle);\n  if (f == NULL) {\n    return MTP_RESP_INVALID_OBJECT_HANDLE;\n  }\n\n  if (cb_data->phase == MTP_PHASE_COMMAND) {\n    io_container->header->len += f->size;\n    tud_mtp_data_receive(io_container);\n  } else {\n    // file contents offset is total xferred minus header size minus last received chunk\n    const uint32_t offset = cb_data->total_xferred_bytes - sizeof(mtp_container_header_t) - io_container->payload_bytes;\n    memcpy(f->data + offset, io_container->payload, io_container->payload_bytes);\n    if (cb_data->total_xferred_bytes - sizeof(mtp_container_header_t) < f->size) {\n      tud_mtp_data_receive(io_container);\n    }\n  }\n\n  return 0;\n}\n\nstatic int32_t fs_delete_object(tud_mtp_cb_data_t* cb_data) {\n  const mtp_container_command_t* command = cb_data->command_container;\n  const uint32_t obj_handle = command->params[0];\n  const uint32_t obj_format = command->params[1]; // optional\n  (void) obj_format;\n\n  if (!is_session_opened) {\n    return MTP_RESP_SESSION_NOT_OPEN;\n  }\n  fs_file_t* f = fs_get_file(obj_handle);\n  if (f == NULL) {\n    return MTP_RESP_INVALID_OBJECT_HANDLE;\n  }\n\n  // delete object by clear the name\n  f->name[0] = 0;\n  return MTP_RESP_OK;\n}\n"
  },
  {
    "path": "examples/device/mtp/src/tinyusb_logo_png.h",
    "content": "// convert using tools/file2carray.py\nenum { LOGO_LEN = 2733 };\nstatic const uint8_t logo_bin[] __attribute__((aligned(16))) = {\n    0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,\n    0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x08, 0x06, 0x00, 0x00, 0x00, 0xd2, 0xd6, 0x7f,\n    0x7f, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,\n    0xbd, 0xa7, 0x93, 0x00, 0x00, 0x0a, 0x62, 0x49, 0x44, 0x41, 0x54, 0x78, 0x9c, 0xed, 0x9c, 0x7d,\n    0x54, 0x54, 0x65, 0x1a, 0xc0, 0x7f, 0xc3, 0x00, 0x29, 0x1f, 0x31, 0x88, 0x61, 0x90, 0xd6, 0xa1,\n    0xb3, 0xba, 0x1a, 0x18, 0x7e, 0xf2, 0xad, 0x40, 0x82, 0xb8, 0x9b, 0x2b, 0x43, 0x1e, 0xd2, 0x00,\n    0x53, 0xc0, 0xea, 0xec, 0xc9, 0x70, 0x18, 0x3d, 0x5b, 0xb1, 0x9e, 0x4a, 0x6d, 0x13, 0x2d, 0xcb,\n    0x76, 0xcd, 0x00, 0xf3, 0x8b, 0x10, 0x8a, 0x8e, 0xd6, 0xee, 0xda, 0x8a, 0x96, 0x30, 0x66, 0xa2,\n    0xa0, 0x91, 0x64, 0xae, 0x16, 0x98, 0x45, 0x9d, 0x2c, 0x93, 0x8f, 0x05, 0x11, 0x92, 0x81, 0xbb,\n    0x7f, 0xa8, 0x93, 0x33, 0x23, 0xcc, 0xdc, 0x61, 0x60, 0x46, 0xb8, 0xbf, 0xbf, 0x78, 0xdf, 0xfb,\n    0x3c, 0xcf, 0xfb, 0xc0, 0x7d, 0xee, 0x73, 0xdf, 0xf7, 0xb9, 0xef, 0x8b, 0x8c, 0x6b, 0x08, 0x82,\n    0x90, 0x08, 0x2c, 0x03, 0x02, 0x81, 0x21, 0x48, 0x0c, 0x44, 0xda, 0x81, 0x6a, 0xe0, 0x55, 0x99,\n    0x4c, 0x56, 0x0c, 0x20, 0x03, 0x10, 0x04, 0x61, 0x35, 0xb0, 0xc2, 0x86, 0x8e, 0x49, 0xf4, 0x3f,\n    0x6b, 0x64, 0x32, 0x59, 0x96, 0x4c, 0x10, 0x84, 0x19, 0xc0, 0x47, 0x5c, 0x0b, 0x06, 0x89, 0x41,\n    0x45, 0xac, 0x03, 0xa0, 0x42, 0xba, 0xf9, 0x83, 0x15, 0x95, 0x4c, 0x10, 0x84, 0x8b, 0x80, 0x97,\n    0xad, 0x3d, 0x91, 0xb0, 0x09, 0x4d, 0x32, 0x41, 0x10, 0x3a, 0x01, 0x07, 0x5b, 0x7b, 0x22, 0x61,\n    0x1b, 0x1c, 0x90, 0xd2, 0xff, 0xa0, 0x46, 0x7a, 0xf2, 0x07, 0x39, 0x52, 0x00, 0x0c, 0x72, 0x1c,\n    0x2d, 0x55, 0x3c, 0x52, 0x5e, 0x4e, 0x53, 0x63, 0x93, 0x28, 0x9d, 0x49, 0x93, 0x27, 0x31, 0xe2,\n    0xce, 0x3b, 0x4d, 0xca, 0x5d, 0xba, 0x74, 0x89, 0xea, 0x13, 0xd5, 0x26, 0xe5, 0x46, 0x8c, 0xf0,\n    0xe6, 0x77, 0xa3, 0x47, 0x8b, 0xf2, 0x41, 0x42, 0x1f, 0x99, 0x20, 0x08, 0x5d, 0x58, 0x30, 0x0f,\n    0x48, 0x7c, 0x68, 0x2e, 0x9f, 0x57, 0x55, 0x89, 0xd2, 0xd9, 0x94, 0x9b, 0xc3, 0xcc, 0xb8, 0x38,\n    0x93, 0x72, 0x27, 0xbf, 0x38, 0x49, 0xc2, 0x9c, 0x39, 0x78, 0x78, 0x78, 0x74, 0x2b, 0xd3, 0xd6,\n    0xd6, 0x46, 0xbc, 0x52, 0xc9, 0x9a, 0x75, 0x6b, 0x45, 0xf9, 0x20, 0xa1, 0x8f, 0xc5, 0x19, 0xa0,\n    0x3f, 0xa8, 0xfc, 0xec, 0x38, 0x72, 0xc7, 0x9b, 0xbb, 0xb8, 0x22, 0x2b, 0x8b, 0x4e, 0x6d, 0x67,\n    0x3f, 0x7b, 0x34, 0xf0, 0x90, 0xe6, 0x00, 0x83, 0x1c, 0xbb, 0x0e, 0x80, 0xb6, 0xb6, 0x36, 0x5e,\n    0x5c, 0xb5, 0x8a, 0x0f, 0x76, 0xbf, 0x0f, 0x40, 0xdd, 0x77, 0xdf, 0xf1, 0xe2, 0xaa, 0x55, 0x1c,\n    0xfe, 0xf4, 0xb0, 0x8d, 0x3d, 0x1b, 0x38, 0xd8, 0x75, 0x00, 0x68, 0xb5, 0x5a, 0x34, 0xa5, 0x65,\n    0x9c, 0x3a, 0x75, 0x0a, 0x80, 0xa6, 0xa6, 0xff, 0xa1, 0x29, 0x2d, 0xa3, 0xae, 0xee, 0x3b, 0x1b,\n    0x7b, 0x36, 0x70, 0xb0, 0xeb, 0x39, 0x80, 0xbb, 0xbb, 0x3b, 0x1f, 0x6b, 0xca, 0x74, 0xed, 0xfb,\n    0x03, 0xef, 0xd7, 0xb5, 0x57, 0x64, 0x65, 0xd9, 0xca, 0xad, 0x01, 0x85, 0x5d, 0x07, 0x80, 0xbd,\n    0x70, 0xb9, 0xf5, 0x32, 0x3f, 0x5f, 0xf8, 0x19, 0xb9, 0x83, 0x03, 0x6e, 0xee, 0xee, 0x28, 0x14,\n    0x0a, 0x1c, 0x1c, 0xec, 0x3a, 0x79, 0x9a, 0x8d, 0xd9, 0xcb, 0xc0, 0x8e, 0x8e, 0x0e, 0x56, 0x3e,\n    0xff, 0xbc, 0xae, 0xfd, 0xf1, 0xfe, 0x8f, 0xb8, 0x78, 0xf1, 0xa2, 0xa8, 0xc1, 0x22, 0xa6, 0x4d,\n    0x63, 0xe4, 0xa8, 0x91, 0x7a, 0x7d, 0xa1, 0x61, 0x61, 0x3c, 0x38, 0x7b, 0xb6, 0xae, 0xfd, 0xf7,\n    0x0d, 0x1b, 0x38, 0x73, 0xfa, 0x0c, 0xfb, 0xf7, 0xed, 0xe3, 0xe1, 0xf9, 0xf3, 0xba, 0xfd, 0x43,\n    0x1f, 0xab, 0x3c, 0x86, 0xd0, 0xd5, 0x45, 0x50, 0x48, 0x30, 0x69, 0x8b, 0x17, 0x73, 0xef, 0xbd,\n    0xf7, 0xea, 0xae, 0x7d, 0xb4, 0x7f, 0x3f, 0x07, 0x35, 0x1a, 0x51, 0xbe, 0xad, 0x5c, 0xbd, 0x1a,\n    0xb9, 0x5c, 0x0e, 0x5c, 0x9d, 0x6b, 0x94, 0xec, 0x2d, 0xe1, 0xa0, 0x46, 0x43, 0xf5, 0x89, 0x13,\n    0xb4, 0xb7, 0xb7, 0xeb, 0xc9, 0xba, 0xb9, 0xb9, 0xe1, 0x1f, 0x10, 0x40, 0x4c, 0x6c, 0x0c, 0xf1,\n    0x09, 0x09, 0x0c, 0x1b, 0x36, 0x4c, 0x77, 0xed, 0xc7, 0x1f, 0x7f, 0x64, 0xd3, 0xc6, 0x8d, 0xa2,\n    0xc6, 0x06, 0x70, 0x90, 0x39, 0xf0, 0xec, 0x5f, 0xb3, 0x18, 0xea, 0xe2, 0x22, 0x4a, 0xef, 0xdd,\n    0xa2, 0x77, 0x38, 0x79, 0xf2, 0x0b, 0xbd, 0xbe, 0xe4, 0x94, 0x14, 0xc6, 0xdd, 0x77, 0x9f, 0x59,\n    0xfa, 0x66, 0x07, 0x40, 0x5b, 0x5b, 0x1b, 0xe3, 0xc7, 0x99, 0x67, 0x54, 0x0c, 0x8b, 0xd2, 0x52,\n    0x59, 0xf1, 0xdc, 0x73, 0xba, 0x76, 0x5c, 0x4c, 0x2c, 0x67, 0x6b, 0x6b, 0x45, 0xd9, 0x28, 0x28,\n    0x2a, 0x24, 0x24, 0x34, 0x54, 0xd7, 0x5e, 0xff, 0xf2, 0x2b, 0xbc, 0xf9, 0xc6, 0x1b, 0xa2, 0x6c,\n    0x9c, 0xa9, 0xad, 0xa1, 0xa1, 0xa1, 0x81, 0x7f, 0x6c, 0x78, 0x9d, 0xe2, 0xe2, 0x77, 0xcd, 0x5e,\n    0x62, 0x0e, 0x19, 0x32, 0x84, 0xa5, 0x99, 0x99, 0xa4, 0xa5, 0xa7, 0xe9, 0x96, 0xac, 0x73, 0xe3,\n    0x95, 0x54, 0x57, 0x9b, 0x2e, 0x64, 0x19, 0xf2, 0xf4, 0xb3, 0xcf, 0xf2, 0xd8, 0x13, 0x8f, 0x9b,\n    0x2d, 0xdf, 0xdc, 0xdc, 0x4c, 0x44, 0x68, 0x28, 0x97, 0x5b, 0x2f, 0xeb, 0xfa, 0x14, 0x0a, 0x05,\n    0x87, 0xca, 0x0f, 0x9b, 0x1d, 0x48, 0x03, 0x23, 0x8f, 0x59, 0x81, 0xea, 0x13, 0x27, 0x98, 0x3d,\n    0xeb, 0x0f, 0x14, 0x15, 0x16, 0x8a, 0xaa, 0x2f, 0xb4, 0xb7, 0xb7, 0xb3, 0x76, 0xcd, 0x1a, 0x32,\n    0x96, 0x3c, 0x45, 0xa7, 0x56, 0x0b, 0xc0, 0x53, 0xaa, 0xa5, 0x16, 0xf9, 0x90, 0x97, 0x9b, 0xa3,\n    0x77, 0x33, 0x4d, 0x51, 0xb4, 0xb3, 0xd0, 0x48, 0x3e, 0xe5, 0xd1, 0x05, 0xa2, 0xb2, 0x88, 0x14,\n    0x00, 0xd7, 0x78, 0xe2, 0xb1, 0xc7, 0x69, 0x68, 0x68, 0xb0, 0x58, 0x7f, 0x5f, 0x49, 0x09, 0x6b,\n    0xb3, 0xaf, 0x56, 0x25, 0xa3, 0xa2, 0xa3, 0x09, 0x9c, 0x30, 0x41, 0xb4, 0x8d, 0xc6, 0x86, 0x46,\n    0x76, 0x16, 0x14, 0x98, 0x25, 0xab, 0xd5, 0x6a, 0x29, 0xc8, 0xcf, 0xd7, 0xeb, 0x73, 0x72, 0x72,\n    0x22, 0x29, 0x25, 0x45, 0xd4, 0x98, 0x66, 0x4f, 0x02, 0x9d, 0x9d, 0x9d, 0xd9, 0x71, 0x83, 0x73,\n    0xab, 0x57, 0xae, 0xa4, 0xb6, 0xa6, 0x46, 0xd4, 0x60, 0x19, 0x2a, 0x15, 0x93, 0xa7, 0x4c, 0xd1,\n    0xeb, 0xf3, 0xf1, 0xf5, 0x11, 0x65, 0xa3, 0xaf, 0x68, 0x6a, 0x6c, 0xec, 0xb5, 0x8d, 0x1d, 0xdb,\n    0xb7, 0x91, 0xf8, 0x70, 0x22, 0xa3, 0xc7, 0x8c, 0x61, 0x69, 0xa6, 0x8a, 0xb4, 0x85, 0x8b, 0x44,\n    0xdb, 0xc8, 0xcb, 0xcd, 0x21, 0x39, 0x25, 0x05, 0x17, 0xd7, 0x9e, 0x9f, 0xe2, 0x0f, 0xf7, 0xec,\n    0xe1, 0xfc, 0xf9, 0xf3, 0x7a, 0x7d, 0x73, 0xe2, 0xe3, 0xf1, 0xf6, 0xf6, 0x16, 0x35, 0x9e, 0xd9,\n    0x01, 0x20, 0x97, 0xcb, 0x09, 0x8f, 0x08, 0xd7, 0xb5, 0xdd, 0xdd, 0xdd, 0x45, 0x0d, 0x04, 0x30,\n    0x76, 0xdc, 0x58, 0x3d, 0x1b, 0xf6, 0xc4, 0x5d, 0x77, 0xdd, 0x45, 0x70, 0x48, 0x08, 0x23, 0x47,\n    0x8d, 0xa4, 0xab, 0xab, 0x8b, 0xe3, 0xc7, 0x8e, 0x73, 0xf4, 0xc8, 0x11, 0x51, 0x36, 0x3a, 0xb5,\n    0x9d, 0x14, 0x15, 0x16, 0xf2, 0xdc, 0x0b, 0x2f, 0x30, 0x3d, 0x32, 0x92, 0x29, 0x53, 0xa7, 0x70,\n    0xfc, 0xd8, 0x71, 0x51, 0x36, 0xae, 0x67, 0x01, 0x53, 0x73, 0x81, 0xfc, 0x6d, 0xdb, 0x8d, 0xfa,\n    0x16, 0xa5, 0xa5, 0x8a, 0x1a, 0x0b, 0xa4, 0x57, 0x80, 0x8e, 0x98, 0x99, 0xb1, 0xac, 0x5b, 0xff,\n    0x0a, 0x19, 0x2a, 0x15, 0x2a, 0xb5, 0x9a, 0x82, 0xa2, 0x42, 0xfe, 0xfc, 0xe4, 0x93, 0xa2, 0xed,\n    0x94, 0x95, 0xfe, 0x56, 0xb7, 0x58, 0x92, 0x91, 0x61, 0x91, 0x2f, 0xa6, 0xe6, 0x02, 0x95, 0x15,\n    0x15, 0x46, 0x93, 0xcc, 0xb0, 0xf0, 0x70, 0xb3, 0x67, 0xfe, 0x37, 0x22, 0x05, 0x40, 0x0f, 0x2c,\n    0x4a, 0x4b, 0xd5, 0x2d, 0x0d, 0xcd, 0xe5, 0xfb, 0xba, 0x3a, 0x9a, 0x9a, 0xae, 0x7e, 0x26, 0x8f,\n    0x98, 0x36, 0x8d, 0xa9, 0x41, 0x53, 0x45, 0x8f, 0x6b, 0x6a, 0x2e, 0xb0, 0xe5, 0xad, 0xb7, 0x8c,\n    0xfa, 0x52, 0xd3, 0xd3, 0x44, 0x8f, 0x03, 0x52, 0x00, 0xf4, 0x88, 0x97, 0x97, 0x17, 0x0a, 0x85,\n    0x42, 0xb4, 0x5e, 0x7d, 0x7d, 0xbd, 0xee, 0xe7, 0x25, 0x19, 0xd6, 0x5d, 0x11, 0x7c, 0x7b, 0xee,\n    0x5b, 0xca, 0x0e, 0x94, 0xea, 0xf5, 0xf9, 0xf9, 0xf9, 0x11, 0x19, 0x15, 0x65, 0xd1, 0x38, 0x76,\n    0x1b, 0x00, 0x81, 0x81, 0x81, 0x6c, 0xdc, 0xb4, 0x89, 0xdc, 0xcd, 0x9b, 0x89, 0x57, 0x2a, 0x01,\n    0x58, 0x98, 0xba, 0x88, 0x3d, 0x25, 0x7b, 0xd9, 0xf5, 0xcf, 0x0f, 0x48, 0x4d, 0x4b, 0x43, 0x26,\n    0xeb, 0xfb, 0xed, 0x8c, 0xb7, 0xdf, 0x7e, 0xbb, 0x68, 0x9d, 0xc6, 0x86, 0xdf, 0x26, 0x94, 0xe1,\n    0x11, 0xe1, 0x4c, 0x0d, 0x0a, 0xb2, 0xc8, 0xc6, 0xcd, 0xb2, 0xc0, 0xb6, 0xad, 0x5b, 0xe9, 0xea,\n    0xea, 0xd2, 0xeb, 0x4b, 0x7b, 0x6c, 0xb1, 0xc5, 0x95, 0x49, 0xbb, 0x2c, 0x05, 0xfb, 0xfa, 0xfa,\n    0x52, 0x50, 0x54, 0xa8, 0x5b, 0xcf, 0xce, 0x88, 0x8d, 0x61, 0x7a, 0x64, 0x24, 0xf1, 0x09, 0x4a,\n    0x9d, 0x4c, 0x60, 0x60, 0x20, 0x1d, 0x37, 0x59, 0x0a, 0x59, 0x1b, 0x4b, 0x82, 0xac, 0xab, 0x4b,\n    0xbf, 0x8e, 0x90, 0xa1, 0x5a, 0xca, 0x82, 0xa4, 0x64, 0xd1, 0x76, 0x0c, 0x57, 0x04, 0x4d, 0x4d,\n    0x4d, 0xec, 0xde, 0xb5, 0x4b, 0x4f, 0x46, 0xa1, 0x50, 0xa0, 0x54, 0x2a, 0x6f, 0xa6, 0x6e, 0x16,\n    0x76, 0x99, 0x01, 0xe6, 0x28, 0x95, 0x0c, 0x75, 0x71, 0x61, 0x5d, 0x76, 0x36, 0xe1, 0x21, 0xa1,\n    0xe4, 0x6f, 0xdf, 0x41, 0x7c, 0x82, 0x92, 0xa3, 0x47, 0x8e, 0x70, 0xbf, 0xbf, 0x3f, 0x33, 0x1f,\n    0x98, 0x41, 0x4b, 0x4b, 0x0b, 0xf3, 0x93, 0x1e, 0xb1, 0xb5, 0xab, 0x66, 0x11, 0x1a, 0x16, 0x46,\n    0x50, 0x70, 0xb0, 0x68, 0x3d, 0xc3, 0x2c, 0x50, 0x58, 0x50, 0x40, 0xdb, 0x65, 0xfd, 0xd7, 0x42,\n    0xf2, 0x82, 0x14, 0xd1, 0xe5, 0xe3, 0x1b, 0xb1, 0xcb, 0x00, 0x18, 0x35, 0x6a, 0x14, 0x70, 0x75,\n    0x69, 0xf6, 0xe8, 0xc2, 0x85, 0xb8, 0xb9, 0xbb, 0x01, 0x57, 0x9f, 0xc6, 0x27, 0x97, 0x3c, 0xc5,\n    0xdc, 0xc4, 0x44, 0x5a, 0x2f, 0xb5, 0x72, 0xcf, 0xdd, 0x77, 0xdb, 0xd2, 0x4d, 0x51, 0xa8, 0x97,\n    0x2f, 0xb7, 0x48, 0xef, 0xfa, 0x5c, 0x40, 0xab, 0xd5, 0x52, 0xb8, 0x73, 0xa7, 0xde, 0x35, 0x27,\n    0x27, 0x27, 0x92, 0x17, 0x2c, 0xe8, 0x95, 0x5f, 0x76, 0xf9, 0x0a, 0x70, 0x76, 0x76, 0x06, 0x30,\n    0xfa, 0xe5, 0x82, 0x43, 0x42, 0x08, 0x0e, 0x09, 0xd1, 0xb5, 0xaf, 0x97, 0x5e, 0x6f, 0x05, 0xa6,\n    0x4c, 0x9d, 0x42, 0x70, 0x48, 0x08, 0x15, 0x47, 0x8f, 0x8a, 0xd2, 0xbb, 0x9e, 0x05, 0xbc, 0x86,\n    0x7b, 0xf1, 0xd3, 0xf9, 0x9f, 0xf4, 0xae, 0x59, 0x52, 0xf8, 0x31, 0xc4, 0x2e, 0x03, 0xa0, 0x20,\n    0x3f, 0x9f, 0xd2, 0xd2, 0x03, 0x26, 0xe5, 0x04, 0x41, 0xe8, 0x07, 0x6f, 0xac, 0x87, 0x4a, 0x9d,\n    0xc9, 0x23, 0x0f, 0xcf, 0x13, 0xad, 0xf7, 0x56, 0x5e, 0x1e, 0xc3, 0xef, 0x18, 0x6e, 0xd4, 0x6f,\n    0x49, 0xe1, 0xc7, 0x10, 0xbb, 0x0c, 0x80, 0xea, 0xea, 0xea, 0x9b, 0x7e, 0x4d, 0xf3, 0xf0, 0xf0,\n    0x20, 0x2a, 0x3a, 0x9a, 0xdb, 0x86, 0xdc, 0x46, 0xd5, 0x67, 0x55, 0xa2, 0x4b, 0xd1, 0xb6, 0x66,\n    0x6a, 0x50, 0x10, 0xa1, 0x61, 0x61, 0x1c, 0x29, 0x2f, 0x17, 0xa5, 0x57, 0x5f, 0x5f, 0xaf, 0xb7,\n    0xb4, 0x04, 0xcb, 0x0b, 0x3f, 0x86, 0xd8, 0xe5, 0x1c, 0xe0, 0x99, 0xac, 0x2c, 0x6a, 0xbf, 0x3d,\n    0x47, 0x4c, 0x6c, 0xac, 0xae, 0x2f, 0x6e, 0xd6, 0x2c, 0x0e, 0x68, 0xca, 0x58, 0xbf, 0xe1, 0x35,\n    0x5e, 0xca, 0xce, 0xe6, 0xc3, 0x92, 0xbd, 0x24, 0xce, 0x13, 0xff, 0x34, 0xd9, 0x9a, 0xcc, 0x65,\n    0x6a, 0xab, 0xd8, 0xb1, 0xb4, 0xf0, 0x63, 0x88, 0x5d, 0x06, 0xc0, 0xdd, 0xf7, 0x5c, 0x9d, 0xdc,\n    0xd5, 0xd6, 0xd4, 0x20, 0x93, 0xc9, 0xc8, 0x50, 0xa9, 0xd8, 0xf8, 0xe6, 0x26, 0x14, 0x9e, 0x9e,\n    0x1c, 0xd4, 0x68, 0x78, 0x79, 0xed, 0x5a, 0xae, 0x5c, 0xb9, 0xc2, 0x5f, 0x9e, 0x7e, 0xda, 0xc6,\n    0x9e, 0x8a, 0x67, 0xd2, 0xe4, 0xc9, 0xbd, 0xfe, 0x1e, 0xd2, 0x9b, 0xc2, 0x8f, 0x21, 0x76, 0xf9,\n    0x0a, 0xa8, 0xad, 0xa9, 0x61, 0x66, 0x5c, 0x1c, 0x1b, 0x73, 0xde, 0xa4, 0x53, 0xab, 0xc5, 0x3f,\n    0x20, 0x00, 0xad, 0x56, 0x4b, 0xf6, 0x4b, 0x2f, 0xb1, 0x7d, 0xeb, 0x36, 0x00, 0x66, 0xc4, 0xc4,\n    0x30, 0x61, 0xe2, 0x44, 0x9c, 0x9c, 0x9c, 0x6c, 0xec, 0xad, 0x78, 0x54, 0x6a, 0x75, 0xaf, 0x76,\n    0x36, 0xa7, 0x2e, 0x4e, 0xb7, 0xda, 0x96, 0x34, 0xbb, 0xcc, 0x00, 0x9b, 0x73, 0xf3, 0xa8, 0xac,\n    0xa8, 0x60, 0xec, 0xd8, 0xb1, 0xf8, 0x07, 0x04, 0xf0, 0x7d, 0x5d, 0x1d, 0x49, 0xf3, 0xe6, 0xeb,\n    0x6e, 0xbe, 0xe7, 0x30, 0x4f, 0xc6, 0x8d, 0x1b, 0x47, 0xcd, 0xd7, 0x35, 0x74, 0x74, 0x74, 0xd8,\n    0xd8, 0x5b, 0xf1, 0x4c, 0x9c, 0x34, 0x89, 0x88, 0x69, 0xd3, 0x2c, 0xd2, 0x55, 0x28, 0x14, 0x24,\n    0x24, 0x24, 0x58, 0xcd, 0x17, 0x8b, 0x33, 0x80, 0x25, 0x25, 0x52, 0x73, 0x69, 0x69, 0x69, 0x21,\n    0x69, 0xde, 0x7c, 0x7c, 0x7c, 0x7c, 0x70, 0x75, 0x73, 0xe3, 0xdc, 0x37, 0xdf, 0xd0, 0xd9, 0xf9,\n    0x5b, 0x75, 0xad, 0xa5, 0xb9, 0x85, 0x88, 0xd0, 0x30, 0xae, 0xdc, 0x82, 0x37, 0xff, 0x3a, 0x2a,\n    0x75, 0x26, 0x9f, 0x1e, 0x3a, 0x24, 0x5a, 0xaf, 0xb7, 0x85, 0x1f, 0x43, 0x2c, 0x0e, 0x80, 0x61,\n    0x5e, 0xc3, 0x4c, 0x0b, 0x19, 0xf0, 0xeb, 0xaf, 0xbf, 0x9a, 0x25, 0xf7, 0xc7, 0xd9, 0x0f, 0xe2,\n    0xef, 0x1f, 0xd0, 0xed, 0xf5, 0x96, 0xe6, 0x66, 0xaa, 0xaa, 0xaa, 0xa8, 0xac, 0xa8, 0x10, 0xed,\n    0x83, 0xbd, 0x30, 0x61, 0xe2, 0x44, 0xa6, 0x47, 0x46, 0xf2, 0xc9, 0xc1, 0x83, 0x66, 0xeb, 0x38,\n    0x3a, 0x3a, 0x92, 0x94, 0x2c, 0xbe, 0xa4, 0xdc, 0xa3, 0x4d, 0x4b, 0x15, 0xc7, 0x8c, 0xf9, 0xbd,\n    0x68, 0x1d, 0xc3, 0x42, 0x46, 0x77, 0x44, 0x47, 0x3f, 0x40, 0xc2, 0xdc, 0x87, 0x4c, 0xca, 0xe5,\n    0xe5, 0xe4, 0xb2, 0x2e, 0x3b, 0x5b, 0xb4, 0x1f, 0xf6, 0x82, 0x7a, 0xf9, 0x32, 0x0e, 0x7d, 0xf2,\n    0x89, 0xd9, 0xf5, 0x8c, 0x39, 0xf1, 0xf1, 0x66, 0x9d, 0xae, 0x16, 0x83, 0xc5, 0x01, 0x10, 0x33,\n    0x33, 0x96, 0xb5, 0x6b, 0xd6, 0x88, 0xd2, 0x29, 0x7e, 0xe7, 0x1d, 0x62, 0x66, 0xc6, 0xe2, 0xe7,\n    0xe7, 0xd7, 0xa3, 0x5c, 0x5e, 0x6e, 0x2e, 0x1f, 0xbc, 0xbf, 0xbb, 0xdb, 0xeb, 0x1e, 0x0a, 0x05,\n    0xea, 0x65, 0xcb, 0x49, 0x5f, 0x9c, 0xce, 0xeb, 0xaf, 0xbd, 0x26, 0xca, 0x07, 0x7b, 0x22, 0x60,\n    0xfc, 0x78, 0x22, 0xa3, 0xa2, 0xd0, 0x94, 0x95, 0x99, 0x16, 0xc6, 0x7a, 0x4b, 0xbf, 0x1b, 0xb1,\n    0x38, 0x00, 0xfc, 0xfc, 0xfc, 0x88, 0x9b, 0x35, 0x8b, 0x7d, 0x25, 0x25, 0x66, 0xeb, 0x9c, 0x3b,\n    0x77, 0x8e, 0xb8, 0x19, 0x31, 0x78, 0x8f, 0xf0, 0xc6, 0xd5, 0xc5, 0x95, 0xfa, 0x86, 0x06, 0x94,\n    0x09, 0x4a, 0xbd, 0x6d, 0xe1, 0x00, 0x0d, 0xf5, 0xf5, 0x46, 0x7b, 0xf1, 0x6f, 0x64, 0xc8, 0x85,\n    0x5f, 0x68, 0x6e, 0x6e, 0xc6, 0x41, 0x2e, 0xc7, 0xb1, 0x9b, 0xd3, 0xc3, 0xb7, 0x0a, 0x2a, 0x75,\n    0x26, 0x07, 0x35, 0x1a, 0x93, 0x59, 0xc0, 0x5a, 0x85, 0x1f, 0x43, 0x7a, 0xf5, 0xd7, 0x7b, 0x7e,\n    0xe5, 0x0b, 0x9c, 0xfa, 0xf2, 0x4b, 0x7e, 0xf8, 0xe1, 0x07, 0xb3, 0x75, 0xba, 0xba, 0xba, 0x4c,\n    0xbe, 0x0a, 0x9e, 0xc9, 0xca, 0x32, 0xeb, 0x15, 0xb0, 0xf7, 0xc3, 0xff, 0xd0, 0xda, 0xda, 0x6a,\n    0xf6, 0xd8, 0xf6, 0x48, 0xc0, 0xf8, 0xf1, 0x44, 0x45, 0x47, 0x53, 0x56, 0x5a, 0xda, 0xa3, 0x5c,\n    0x5f, 0x3c, 0xfd, 0xd0, 0xcb, 0x00, 0xf0, 0x1e, 0x31, 0x82, 0xe2, 0xdd, 0xbb, 0x58, 0x9e, 0xa9,\n    0xa6, 0xfc, 0xb0, 0xf5, 0x4e, 0xec, 0xd6, 0xd4, 0x7c, 0xdd, 0xe3, 0x3a, 0xf9, 0xe2, 0xc5, 0x5f,\n    0xf8, 0xec, 0xd8, 0x71, 0xde, 0x2b, 0x2e, 0xb6, 0xda, 0x98, 0xb6, 0x44, 0xa5, 0xce, 0x44, 0x53,\n    0x56, 0xd6, 0x6d, 0x16, 0xb0, 0x66, 0xe1, 0xc7, 0x90, 0x5e, 0xe7, 0x4f, 0x6f, 0x6f, 0x6f, 0xf2,\n    0x77, 0x16, 0x70, 0xac, 0xb2, 0x92, 0x3d, 0xff, 0xfa, 0x37, 0xe5, 0x87, 0x0f, 0x53, 0xf7, 0x7d,\n    0x5d, 0x8f, 0x87, 0x2b, 0xe4, 0x72, 0x39, 0xc3, 0xef, 0xb8, 0x03, 0x1f, 0x1f, 0x1f, 0x46, 0x8f,\n    0x1e, 0x63, 0x74, 0x3d, 0x2f, 0x27, 0x97, 0xbc, 0x9c, 0xdc, 0xde, 0xba, 0x76, 0xcb, 0xe0, 0x1f,\n    0x10, 0x40, 0xf4, 0x8c, 0x07, 0x28, 0xfd, 0xf8, 0xe6, 0x1f, 0xc0, 0xac, 0x59, 0xf8, 0x31, 0xc4,\n    0xe2, 0x7f, 0x11, 0xd3, 0x13, 0x9d, 0x5a, 0x2d, 0x3f, 0x5f, 0xb8, 0x40, 0x73, 0x73, 0x33, 0xda,\n    0x6b, 0x6b, 0xf5, 0xa1, 0x2e, 0x2e, 0x38, 0x3b, 0x39, 0x31, 0xd4, 0xc5, 0x05, 0x4f, 0x4f, 0x4f,\n    0xd1, 0x9b, 0x2d, 0x07, 0x3a, 0xff, 0x3d, 0x75, 0x8a, 0xf8, 0xd9, 0x7f, 0x32, 0xca, 0x02, 0x62,\n    0x8f, 0x7a, 0x89, 0xa5, 0x4f, 0x66, 0x50, 0x72, 0x47, 0x47, 0x7c, 0x7d, 0x7d, 0xf1, 0xf5, 0xf5,\n    0xed, 0x0b, 0xf3, 0x03, 0x92, 0xfb, 0xfc, 0xfd, 0x09, 0x09, 0x0d, 0x35, 0xfa, 0x52, 0xf8, 0x48,\n    0x72, 0x72, 0x9f, 0xdd, 0x7c, 0xb0, 0xd3, 0x52, 0xf0, 0x60, 0xa4, 0xad, 0xad, 0x8d, 0xd3, 0xa7,\n    0x4f, 0xeb, 0xf5, 0x39, 0x3a, 0x3a, 0x92, 0x2c, 0xf2, 0xa8, 0x97, 0x58, 0xa4, 0x00, 0xb0, 0x13,\n    0x76, 0xbd, 0xf7, 0x9e, 0xd1, 0xf1, 0xb4, 0x39, 0xf1, 0xf1, 0xdc, 0xe9, 0x63, 0xdd, 0xc2, 0x8f,\n    0x21, 0x52, 0x00, 0xd8, 0x01, 0x82, 0x20, 0xf0, 0xf6, 0x0e, 0xe3, 0xdd, 0xcd, 0x7d, 0xb5, 0xf4,\n    0xbb, 0x11, 0x29, 0x00, 0xec, 0x80, 0xb2, 0x03, 0xa5, 0x9c, 0x3d, 0x7b, 0x56, 0xaf, 0x2f, 0x34,\n    0x2c, 0xac, 0x4f, 0x0a, 0x3f, 0x86, 0x48, 0x01, 0x60, 0x07, 0x6c, 0xdd, 0xb2, 0xc5, 0xa8, 0x2f,\n    0x35, 0x3d, 0xbd, 0x5f, 0xc6, 0x96, 0x02, 0xc0, 0xc6, 0x7c, 0x75, 0xe6, 0x2b, 0xa3, 0x9d, 0xc2,\n    0x7e, 0x7e, 0x7e, 0x44, 0x45, 0x47, 0xf5, 0xcb, 0xf8, 0x52, 0x00, 0xd8, 0x98, 0x2d, 0x9b, 0x37,\n    0x1b, 0xad, 0xfd, 0xfb, 0xb2, 0xf0, 0x63, 0x48, 0x9f, 0x14, 0x82, 0x24, 0xcc, 0xa3, 0xbe, 0xbe,\n    0x9e, 0xe9, 0x61, 0xe1, 0x7a, 0xfb, 0x24, 0xfa, 0xba, 0xf0, 0x63, 0x88, 0x94, 0x01, 0x6c, 0xc8,\n    0xdb, 0x3b, 0x76, 0x18, 0x6d, 0x92, 0x49, 0x4a, 0xb1, 0xee, 0x8e, 0x1f, 0x53, 0x48, 0x19, 0xc0,\n    0x86, 0xb4, 0xb6, 0xb6, 0xa2, 0x35, 0x38, 0xdd, 0xe4, 0xea, 0xea, 0xda, 0xaf, 0x9f, 0xb8, 0xa5,\n    0x00, 0x18, 0xe4, 0x38, 0x00, 0xb7, 0xd6, 0xf9, 0x2a, 0x09, 0xab, 0xe2, 0x00, 0xf4, 0xfe, 0xdf,\n    0x63, 0x49, 0xdc, 0xaa, 0x34, 0x3a, 0x00, 0xe2, 0x0e, 0xaa, 0x49, 0x0c, 0x24, 0xca, 0x65, 0x82,\n    0x20, 0x44, 0x03, 0x07, 0x90, 0xe6, 0x01, 0x83, 0x0d, 0x01, 0x88, 0x75, 0x90, 0xc9, 0x64, 0x65,\n    0xc0, 0x8b, 0xb6, 0xf6, 0x46, 0xa2, 0xdf, 0xf9, 0x9b, 0x4c, 0x26, 0x3b, 0xa0, 0x7b, 0xea, 0x05,\n    0x41, 0x98, 0x0b, 0xa8, 0x81, 0x89, 0xc0, 0x50, 0x9b, 0xb9, 0x25, 0xd1, 0x97, 0xb4, 0x03, 0x9f,\n    0x03, 0xeb, 0x65, 0x32, 0xd9, 0x2e, 0x80, 0xff, 0x03, 0xff, 0x08, 0x81, 0xdd, 0xa8, 0xcb, 0xf5,\n    0x99, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82,\n};\n"
  },
  {
    "path": "examples/device/mtp/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ennebi Elettronica (https://ennebielettronica.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_MTP               1\n#define CFG_TUD_MTP_EP_BUFSIZE    512\n#define CFG_TUD_MTP_EP_CONTROL_BUFSIZE  16 // should be enough to hold data in MTP control request\n\n//------------- MTP device info -------------//\n#define CFG_TUD_MTP_DEVICEINFO_EXTENSIONS   \"microsoft.com: 1.0; \"\n#define CFG_TUD_MTP_DEVICEINFO_SUPPORTED_OPERATIONS \\\n   MTP_OP_GET_DEVICE_INFO, \\\n   MTP_OP_OPEN_SESSION, \\\n   MTP_OP_CLOSE_SESSION, \\\n   MTP_OP_GET_STORAGE_IDS, \\\n   MTP_OP_GET_STORAGE_INFO, \\\n   MTP_OP_GET_OBJECT_HANDLES, \\\n   MTP_OP_GET_OBJECT_INFO, \\\n   MTP_OP_GET_OBJECT, \\\n   MTP_OP_DELETE_OBJECT, \\\n   MTP_OP_SEND_OBJECT_INFO, \\\n   MTP_OP_SEND_OBJECT, \\\n   MTP_OP_RESET_DEVICE, \\\n   MTP_OP_GET_DEVICE_PROP_DESC, \\\n   MTP_OP_GET_DEVICE_PROP_VALUE, \\\n   MTP_OP_SET_DEVICE_PROP_VALUE\n\n#define CFG_TUD_MTP_DEVICEINFO_SUPPORTED_EVENTS \\\n    MTP_EVENT_OBJECT_ADDED\n\n#define CFG_TUD_MTP_DEVICEINFO_SUPPORTED_DEVICE_PROPERTIES  \\\n    MTP_DEV_PROP_DEVICE_FRIENDLY_NAME\n\n#define CFG_TUD_MTP_DEVICEINFO_CAPTURE_FORMATS \\\n    MTP_OBJ_FORMAT_UNDEFINED, \\\n    MTP_OBJ_FORMAT_ASSOCIATION, \\\n    MTP_OBJ_FORMAT_TEXT, \\\n    MTP_OBJ_FORMAT_PNG\n\n#define CFG_TUD_MTP_DEVICEINFO_PLAYBACK_FORMATS \\\n    MTP_OBJ_FORMAT_UNDEFINED, \\\n    MTP_OBJ_FORMAT_ASSOCIATION, \\\n    MTP_OBJ_FORMAT_TEXT, \\\n    MTP_OBJ_FORMAT_PNG\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/mtp/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]  MTP | VENDOR | MIDI | HID | MSC | CDC [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) | PID_MAP(MTP, 5))\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n    .bDeviceClass       = TUSB_CLASS_UNSPECIFIED,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum\n{\n  ITF_NUM_MTP = 0,\n  ITF_NUM_TOTAL\n};\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_MTP_EVT     0x81\n  #define EPNUM_MTP_OUT     0x02\n  #define EPNUM_MTP_IN      0x82\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_MTP_EVT     0x83\n  #define EPNUM_MTP_OUT     0x02\n  #define EPNUM_MTP_IN      0x81\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_MTP_EVT     0x81\n  #define EPNUM_MTP_OUT     0x03\n  #define EPNUM_MTP_IN      0x82\n\n#else\n  #define EPNUM_MTP_EVT     0x81\n  #define EPNUM_MTP_OUT     0x02\n  #define EPNUM_MTP_IN      0x82\n#endif\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_MTP_DESC_LEN)\n\n// full speed configuration\nconst uint8_t desc_fs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n  // Interface number, string index, EP event, EP event size, EP event polling, EP Out & EP In address, EP size\n  TUD_MTP_DESCRIPTOR(ITF_NUM_MTP, 4, EPNUM_MTP_EVT, 64, 1, EPNUM_MTP_OUT, EPNUM_MTP_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\n\n// high speed configuration\nstatic uint8_t const desc_hs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n  // Interface number, string index, EP event, EP event size, EP event polling, EP Out & EP In address, EP size\n  TUD_MTP_DESCRIPTOR(ITF_NUM_MTP, 4, EPNUM_MTP_EVT, 64, 1, EPNUM_MTP_OUT, EPNUM_MTP_IN, 512),\n};\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n    .bLength            = sizeof(tusb_desc_device_qualifier_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n    .bcdUSB             = USB_BCD,\n\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n    .bNumConfigurations = 0x01,\n    .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nconst uint8_t*tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n  STRID_MTP,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUsb\",                     // 1: Manufacturer\n  \"TinyUsb Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n  \"TinyUSB MTP\",                 // 4: MTP Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n      // Cap at max char\n      chr_count = strlen(str);\n      const size_t max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/../../../hw/bsp/family_support.cmake)\n\n\n# Prefer the tinyusb lwip\nset(LWIP ${TOP}/lib/lwip)\n\n# If we can't find one from tinyusb then check cmake var before giving up\nif (NOT EXISTS ${LWIP}/src)\n  set(LWIP ${TINYUSB_LWIP_PATH})\nendif()\n\nif (NOT EXISTS ${LWIP}/src)\n  family_example_missing_dependency(${PROJECT_NAME} \"lib/lwip\")\n  return()\nendif()\n\nproject(net_lwip_webserver C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_LIST_DIR}/src/main.c\n  ${CMAKE_CURRENT_LIST_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_LIST_DIR}/src\n  ${LWIP}/src/include\n  ${LWIP}/src/include/ipv4\n  ${LWIP}/src/include/lwip/apps\n  ${TOP}/lib/networking\n  )\n\n# lib/networking sources\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${TOP}/lib/networking/dhserver.c\n  ${TOP}/lib/networking/dnserver.c\n  ${TOP}/lib/networking/rndis_reports.c\n  )\n\n# lwip sources\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${LWIP}/src/core/altcp.c\n  ${LWIP}/src/core/altcp_alloc.c\n  ${LWIP}/src/core/altcp_tcp.c\n  ${LWIP}/src/core/def.c\n  ${LWIP}/src/core/dns.c\n  ${LWIP}/src/core/inet_chksum.c\n  ${LWIP}/src/core/init.c\n  ${LWIP}/src/core/ip.c\n  ${LWIP}/src/core/mem.c\n  ${LWIP}/src/core/memp.c\n  ${LWIP}/src/core/netif.c\n  ${LWIP}/src/core/pbuf.c\n  ${LWIP}/src/core/raw.c\n  ${LWIP}/src/core/stats.c\n  ${LWIP}/src/core/sys.c\n  ${LWIP}/src/core/tcp.c\n  ${LWIP}/src/core/tcp_in.c\n  ${LWIP}/src/core/tcp_out.c\n  ${LWIP}/src/core/timeouts.c\n  ${LWIP}/src/core/udp.c\n  ${LWIP}/src/core/ipv4/autoip.c\n  ${LWIP}/src/core/ipv4/dhcp.c\n  ${LWIP}/src/core/ipv4/etharp.c\n  ${LWIP}/src/core/ipv4/icmp.c\n  ${LWIP}/src/core/ipv4/igmp.c\n  ${LWIP}/src/core/ipv4/ip4.c\n  ${LWIP}/src/core/ipv4/ip4_addr.c\n  ${LWIP}/src/core/ipv4/ip4_frag.c\n  ${LWIP}/src/netif/ethernet.c\n  ${LWIP}/src/netif/slipif.c\n  ${LWIP}/src/apps/http/httpd.c\n  ${LWIP}/src/apps/http/fs.c\n  ${LWIP}/src/apps/lwiperf/lwiperf.c\n  )\n\n# due to warnings from other net source, we need to prevent error from some of the warnings options\nif (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n  target_compile_options(${PROJECT_NAME} PUBLIC\n    -Wno-error=null-dereference\n    -Wno-error=conversion\n    -Wno-error=sign-conversion\n    -Wno-error=sign-compare\n    )\nelseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n\nendif ()\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\n# suppress warning caused by lwip\nCFLAGS_GCC += \\\n  -Wno-error=null-dereference \\\n  -Wno-error=unused-parameter \\\n  -Wno-error=unused-variable\n\nINC += \\\n  src \\\n  $(TOP)/lib/lwip/src/include \\\n  $(TOP)/lib/lwip/src/include/ipv4 \\\n  $(TOP)/lib/lwip/src/include/lwip/apps \\\n  $(TOP)/lib/networking\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\n# lwip sources\nSRC_C += \\\n  lib/lwip/src/core/altcp.c \\\n  lib/lwip/src/core/altcp_alloc.c \\\n  lib/lwip/src/core/altcp_tcp.c \\\n  lib/lwip/src/core/def.c \\\n  lib/lwip/src/core/dns.c \\\n  lib/lwip/src/core/inet_chksum.c \\\n  lib/lwip/src/core/init.c \\\n  lib/lwip/src/core/ip.c \\\n  lib/lwip/src/core/mem.c \\\n  lib/lwip/src/core/memp.c \\\n  lib/lwip/src/core/netif.c \\\n  lib/lwip/src/core/pbuf.c \\\n  lib/lwip/src/core/raw.c \\\n  lib/lwip/src/core/stats.c \\\n  lib/lwip/src/core/sys.c \\\n  lib/lwip/src/core/tcp.c \\\n  lib/lwip/src/core/tcp_in.c \\\n  lib/lwip/src/core/tcp_out.c \\\n  lib/lwip/src/core/timeouts.c \\\n  lib/lwip/src/core/udp.c \\\n  lib/lwip/src/core/ipv4/autoip.c \\\n  lib/lwip/src/core/ipv4/dhcp.c \\\n  lib/lwip/src/core/ipv4/etharp.c \\\n  lib/lwip/src/core/ipv4/icmp.c \\\n  lib/lwip/src/core/ipv4/igmp.c \\\n  lib/lwip/src/core/ipv4/ip4.c \\\n  lib/lwip/src/core/ipv4/ip4_addr.c \\\n  lib/lwip/src/core/ipv4/ip4_frag.c \\\n  lib/lwip/src/core/ipv6/dhcp6.c \\\n  lib/lwip/src/core/ipv6/ethip6.c \\\n  lib/lwip/src/core/ipv6/icmp6.c \\\n  lib/lwip/src/core/ipv6/inet6.c \\\n  lib/lwip/src/core/ipv6/ip6.c \\\n  lib/lwip/src/core/ipv6/ip6_addr.c \\\n  lib/lwip/src/core/ipv6/ip6_frag.c \\\n  lib/lwip/src/core/ipv6/mld6.c \\\n  lib/lwip/src/core/ipv6/nd6.c \\\n  lib/lwip/src/netif/ethernet.c \\\n  lib/lwip/src/netif/slipif.c \\\n  lib/lwip/src/apps/http/httpd.c \\\n  lib/lwip/src/apps/http/fs.c \\\n  lib/lwip/src/apps/lwiperf/lwiperf.c \\\n  lib/networking/dhserver.c \\\n  lib/networking/dnserver.c \\\n  lib/networking/rndis_reports.c\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/skip.txt",
    "content": "mcu:CH32V103\nmcu:CH32V20X\nmcu:LPC11UXX\nmcu:LPC13XX\nmcu:LPC15XX\nmcu:MCXA15\nmcu:MSP430x5xx\nmcu:NUC121\nmcu:SAMD11\nmcu:STM32L0\nmcu:STM32F0\nmcu:KINETIS_KL\nmcu:STM32H7RS\nmcu:STM32N6\nfamily:broadcom_64bit\nfamily:broadcom_32bit\nfamily:espressif\nboard:at_start_f425\nboard:curiosity_nano\nboard:frdm_kl25z\n# lpc55 has weird error 'ncm_interface' causes a section type conflict with 'ntb_parameters'\nfamily:lpc55\nfamily:nuc126\nfamily:nuc100_120\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/src/arch/bpstruct.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. 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 * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#if defined(__ICCARM__)\n#pragma pack(1)\n#endif\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/src/arch/cc.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. 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 * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef CC_H__\n#define CC_H__\n\n//#include \"cpu.h\"\n\ntypedef int sys_prot_t;\n\n\n\n/* define compiler specific symbols */\n#if defined (__ICCARM__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n#define PACK_STRUCT_USE_INCLUDES\n\n#elif defined (__CC_ARM)\n\n#define PACK_STRUCT_BEGIN __packed\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#elif defined (__GNUC__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT __attribute__ ((__packed__))\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#elif defined (__TASKING__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#endif\n\n#define LWIP_PLATFORM_ASSERT(x) do { if(!(x)) while(1); } while(0)\n\n#endif /* CC_H__ */\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/src/arch/epstruct.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. 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 * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n\n#if defined(__ICCARM__)\n#pragma pack()\n#endif\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/src/lwipopts.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. 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 * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Simon Goldschmidt\n *\n */\n#ifndef LWIPOPTS_H__\n#define LWIPOPTS_H__\n\n/* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */\n#define NO_SYS                          1\n#define MEM_ALIGNMENT                   4\n#define LWIP_RAW                        0\n#define LWIP_NETCONN                    0\n#define LWIP_SOCKET                     0\n#define LWIP_DHCP                       0\n#define LWIP_ICMP                       1\n#define LWIP_UDP                        1\n#define LWIP_TCP                        1\n#define LWIP_IPV4                       1\n#define LWIP_IPV6                       0\n#define ETH_PAD_SIZE                    0\n#define LWIP_IP_ACCEPT_UDP_PORT(p)      ((p) == PP_NTOHS(67))\n\n#define TCP_MSS                         (1500 /*mtu*/ - 20 /*iphdr*/ - 20 /*tcphhr*/)\n#define TCP_SND_BUF                     (4 * TCP_MSS)\n#define TCP_WND                         (4 * TCP_MSS)\n\n#define ETHARP_SUPPORT_STATIC_ENTRIES   1\n\n#define LWIP_HTTPD_CGI                  0\n#define LWIP_HTTPD_SSI                  0\n#define LWIP_HTTPD_SSI_INCLUDE_TAG      0\n\n#define LWIP_SINGLE_NETIF               1\n#define LWIP_NETIF_LINK_CALLBACK        1\n\n#define PBUF_POOL_SIZE                  4\n\n#define HTTPD_USE_CUSTOM_FSDATA         0\n\n#define LWIP_MULTICAST_PING             1\n#define LWIP_BROADCAST_PING             1\n#define LWIP_IPV6_MLD                   0\n#define LWIP_IPV6_SEND_ROUTER_SOLICIT   0\n\n#endif /* __LWIPOPTS_H__ */\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Peter Lawrence\n *\n * influenced by lrndis https://github.com/fetisov/lrndis\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/*\nthis appears as either a RNDIS or CDC-ECM USB virtual network adapter; the OS picks its preference\n\nRNDIS should be valid on Linux and Windows hosts, and CDC-ECM should be valid on Linux and macOS hosts\n\nThe MCU appears to the host as IP address 192.168.7.1, and provides a DHCP server, DNS server, and web server.\n\nLink State Control:\n- Press the user button to toggle the network link state (UP/DOWN)\n- This simulates \"ethernet cable unplugged/plugged\" events\n- The host OS will see the network interface as disconnected/connected accordingly\n- Use this to test network error handling and recovery in host applications\n*/\n/*\nSome smartphones *may* work with this implementation as well, but likely have limited (broken) drivers,\nand likely their manufacturer has not tested such functionality.  Some code workarounds could be tried:\n\nThe smartphone may only have an ECM driver, but refuse to automatically pick ECM (unlike the OSes above);\ntry modifying ./examples/devices/net_lwip_webserver/usb_descriptors.c so that CONFIG_ID_ECM is default.\n\nThe smartphone may be artificially picky about which Ethernet MAC address to recognize; if this happens,\ntry changing the first byte of tud_network_mac_address[] below from 0x02 to 0x00 (clearing bit 1).\n*/\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#include \"dhserver.h\"\n#include \"dnserver.h\"\n#include \"httpd.h\"\n#include \"lwip/ethip6.h\"\n#include \"lwip/init.h\"\n#include \"lwip/timeouts.h\"\n#include \"lwip/sys.h\"\n\n#ifdef INCLUDE_IPERF\n  #include \"lwip/apps/lwiperf.h\"\n#endif\n\n#define INIT_IP4(a, b, c, d) \\\n  { PP_HTONL(LWIP_MAKEU32(a, b, c, d)) }\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n/* lwip context */\nstatic struct netif netif_data;\n\n/* this is used by this code, ./class/net/net_driver.c, and usb_descriptors.c */\n/* ideally speaking, this should be generated from the hardware's unique ID (if available) */\n/* it is suggested that the first byte is 0x02 to indicate a link-local address */\nuint8_t tud_network_mac_address[6] = {0x02, 0x02, 0x84, 0x6A, 0x96, 0x00};\n\n/* network parameters of this MCU */\nstatic const ip4_addr_t ipaddr = INIT_IP4(192, 168, 7, 1);\nstatic const ip4_addr_t netmask = INIT_IP4(255, 255, 255, 0);\nstatic const ip4_addr_t gateway = INIT_IP4(0, 0, 0, 0);\n\n/* database IP addresses that can be offered to the host; this must be in RAM to store assigned MAC addresses */\nstatic dhcp_entry_t entries[] = {\n    /* mac ip address               lease time */\n    {{0}, INIT_IP4(192, 168, 7, 2), 24 * 60 * 60},\n    {{0}, INIT_IP4(192, 168, 7, 3), 24 * 60 * 60},\n    {{0}, INIT_IP4(192, 168, 7, 4), 24 * 60 * 60},\n};\n\nstatic const dhcp_config_t dhcp_config = {\n    .router = INIT_IP4(0, 0, 0, 0),  /* router address (if any) */\n    .port = 67,                      /* listen port */\n    .dns = INIT_IP4(192, 168, 7, 1), /* dns server (if any) */\n    \"usb\",                           /* dns suffix */\n    TU_ARRAY_SIZE(entries),          /* num entry */\n    entries                          /* entries */\n};\n\nstatic err_t linkoutput_fn(struct netif *netif, struct pbuf *p) {\n  (void) netif;\n\n  for (;;) {\n    /* if TinyUSB isn't ready, we must signal back to lwip that there is nothing we can do */\n    if (!tud_ready())\n      return ERR_USE;\n\n    /* if the network driver can accept another packet, we make it happen */\n    if (tud_network_can_xmit(p->tot_len)) {\n      tud_network_xmit(p, 0 /* unused for this example */);\n      return ERR_OK;\n    }\n\n    /* transfer execution to TinyUSB in the hopes that it will finish transmitting the prior packet */\n    tud_task();\n  }\n}\n\nstatic err_t ip4_output_fn(struct netif *netif, struct pbuf *p, const ip4_addr_t *addr) {\n  return etharp_output(netif, p, addr);\n}\n\n#if LWIP_IPV6\nstatic err_t ip6_output_fn(struct netif *netif, struct pbuf *p, const ip6_addr_t *addr) {\n  return ethip6_output(netif, p, addr);\n}\n#endif\n\nstatic err_t netif_init_cb(struct netif *netif) {\n  LWIP_ASSERT(\"netif != NULL\", (netif != NULL));\n  netif->mtu = CFG_TUD_NET_MTU;\n  netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_UP;\n  netif->state = NULL;\n  netif->name[0] = 'E';\n  netif->name[1] = 'X';\n  netif->linkoutput = linkoutput_fn;\n  netif->output = ip4_output_fn;\n#if LWIP_IPV6\n  netif->output_ip6 = ip6_output_fn;\n#endif\n  return ERR_OK;\n}\n\n/* notifies the USB host about the link state change. */\nstatic void usbnet_netif_link_callback(struct netif *netif) {\n    bool link_up = netif_is_link_up(netif);\n    tud_network_link_state(BOARD_TUD_RHPORT, link_up);\n}\n\nstatic void init_lwip(void) {\n  struct netif *netif = &netif_data;\n\n  lwip_init();\n\n  /* the lwip virtual MAC address must be different from the host's; to ensure this, we toggle the LSbit */\n  netif->hwaddr_len = sizeof(tud_network_mac_address);\n  memcpy(netif->hwaddr, tud_network_mac_address, sizeof(tud_network_mac_address));\n  netif->hwaddr[5] ^= 0x01;\n\n  netif = netif_add(netif, &ipaddr, &netmask, &gateway, NULL, netif_init_cb, ethernet_input);\n#if LWIP_IPV6\n  netif_create_ip6_linklocal_address(netif, 1);\n#endif\n  netif_set_default(netif);\n\n#if LWIP_NETIF_LINK_CALLBACK\n  // Set the link callback to notify USB host about link state changes\n  netif_set_link_callback(netif, usbnet_netif_link_callback);\n  netif_set_link_up(netif);\n#else\n  tud_network_link_state(BOARD_TUD_RHPORT, true);\n#endif\n}\n\n/* handle any DNS requests from dns-server */\nstatic bool dns_query_proc(const char *name, ip4_addr_t *addr) {\n  if (0 == strcmp(name, \"tiny.usb\")) {\n    *addr = ipaddr;\n    return true;\n  }\n  return false;\n}\n\nbool tud_network_recv_cb(const uint8_t *src, uint16_t size) {\n  struct netif *netif = &netif_data;\n\n  if (size) {\n    struct pbuf *p = pbuf_alloc(PBUF_RAW, size, PBUF_POOL);\n\n    if (p == NULL) {\n      printf(\"ERROR: Failed to allocate pbuf of size %d\\n\", size);\n      return false;\n    }\n\n    /* Copy buf to pbuf */\n    pbuf_take(p, src, size);\n\n    // Surrender ownership of our pbuf unless there was an error\n    // Only call pbuf_free if not Ok else it will panic with \"pbuf_free: p->ref > 0\"\n    // or steal it from whatever took ownership of it with undefined consequences.\n    // See: https://savannah.nongnu.org/patch/index.php?10121\n    if (netif->input(p, netif) != ERR_OK) {\n      printf(\"ERROR: netif input failed\\n\");\n      pbuf_free(p);\n    }\n    // Signal tinyusb that the current frame has been processed.\n    tud_network_recv_renew();\n  }\n\n  return true;\n}\n\nuint16_t tud_network_xmit_cb(uint8_t *dst, void *ref, uint16_t arg) {\n  struct pbuf *p = (struct pbuf *) ref;\n\n  (void) arg; /* unused for this example */\n\n  return pbuf_copy_partial(p, dst, p->tot_len, 0);\n}\n\nstatic void led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n\nstatic void handle_link_state_switch(void) {\n  /* Check for button press to toggle link state */\n  static bool last_link_state = true;\n  static bool last_button_state = false;\n  bool current_button_state = board_button_read();\n\n  if (current_button_state && !last_button_state) {\n    /* Button pressed - toggle link state */\n    last_link_state = !last_link_state;\n    if (last_link_state) {\n      printf(\"Link state: UP\\n\");\n      netif_set_link_up(&netif_data);\n    } else {\n      printf(\"Link state: DOWN\\n\");\n      netif_set_link_down(&netif_data);\n    }\n    /* LWIP callback will notify USB host about the change */\n  }\n  last_button_state = current_button_state;\n\n}\n\nint main(void) {\n  /* initialize TinyUSB */\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  /* initialize lwip, dhcp-server, dns-server, and http */\n  init_lwip();\n  while (!netif_is_up(&netif_data));\n  while (dhserv_init(&dhcp_config) != ERR_OK);\n  while (dnserv_init(IP_ADDR_ANY, 53, dns_query_proc) != ERR_OK);\n  httpd_init();\n\n#ifdef INCLUDE_IPERF\n  // test with: iperf -c 192.168.7.1 -e -i 1 -M 5000 -l 8192 -r\n  lwiperf_start_tcp_server_default(NULL, NULL);\n#endif\n\n#if CFG_TUD_NCM\n  printf(\"USB NCM network interface initialized\\n\");\n#elif CFG_TUD_ECM_RNDIS\n  printf(\"USB RNDIS/ECM network interface initialized\\n\");\n#endif\n\n  while (1) {\n    tud_task();\n    sys_check_timeouts(); // service lwip\n    handle_link_state_switch();\n    led_blinking_task();\n  }\n}\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n/* lwip has provision for using a mutex, when applicable */\n/* This implementation is for single-threaded use only */\nsys_prot_t sys_arch_protect(void) {\n  return 0;\n}\nvoid sys_arch_unprotect(sys_prot_t pval) {\n  (void) pval;\n}\n\n/* lwip needs a millisecond time source, and the TinyUSB board support code has one available */\nuint32_t sys_now(void) {\n  return tusb_time_millis_api();\n}\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"lwipopts.h\"\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n  #define BOARD_TUD_RHPORT 0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n  #define BOARD_TUD_MAX_SPEED OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n  #error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n  #define CFG_TUSB_OS OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n  #define CFG_TUSB_DEBUG 0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED 1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n  #define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n  #define CFG_TUSB_MEM_ALIGN __attribute__((aligned(4)))\n#endif\n\n// Use different configurations to test all net devices (also due to resource limitations)\n#ifndef USE_ECM\n#if TU_CHECK_MCU(OPT_MCU_LPC15XX, OPT_MCU_LPC40XX, OPT_MCU_LPC51UXX, OPT_MCU_LPC54)\n  #define USE_ECM 1\n#elif TU_CHECK_MCU(OPT_MCU_SAMD21, OPT_MCU_SAML2X)\n  #define USE_ECM 1\n#elif TU_CHECK_MCU(OPT_MCU_STM32F0, OPT_MCU_STM32F1)\n  #define USE_ECM 1\n#elif TU_CHECK_MCU(OPT_MCU_MAX32690, OPT_MCU_MAX32650, OPT_MCU_MAX32666, OPT_MCU_MAX78002)\n  #define USE_ECM 1\n#else\n  #define USE_ECM 0\n  #define INCLUDE_IPERF\n#endif\n#endif\n\n//--------------------------------------------------------------------\n// NCM CLASS CONFIGURATION, SEE \"ncm.h\" FOR PERFORMANCE TUNING\n//--------------------------------------------------------------------\n\n// Must be >> MTU\n// Can be set to 2048 without impact\n#define CFG_TUD_NCM_IN_NTB_MAX_SIZE (2 * TCP_MSS + 100)\n\n// Must be >> MTU\n// Can be set to smaller values if wNtbOutMaxDatagrams==1\n#define CFG_TUD_NCM_OUT_NTB_MAX_SIZE (2 * TCP_MSS + 100)\n\n// Number of NCM transfer blocks for reception side\n#ifndef CFG_TUD_NCM_OUT_NTB_N\n  #define CFG_TUD_NCM_OUT_NTB_N 1\n#endif\n\n// Number of NCM transfer blocks for transmission side\n#ifndef CFG_TUD_NCM_IN_NTB_N\n  #define CFG_TUD_NCM_IN_NTB_N 1\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n  #define CFG_TUD_ENDPOINT0_SIZE 64\n#endif\n\n//------------- CLASS -------------//\n\n// Network class has 2 drivers: ECM/RNDIS and NCM.\n// Only one of the drivers can be enabled\n#define CFG_TUD_ECM_RNDIS     USE_ECM\n#define CFG_TUD_NCM           (1 - CFG_TUD_ECM_RNDIS)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/net_lwip_webserver/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"class/net/net_device.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]       NET | VENDOR | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n) ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID                                                                                           \\\n  (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) | \\\n   PID_MAP(ECM_RNDIS, 5) | PID_MAP(NCM, 5))\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n  STRID_INTERFACE,\n  STRID_MAC,\n  STRID_COUNT\n};\n\nenum {\n  ITF_NUM_CDC = 0,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_TOTAL\n};\n\nenum {\n#if CFG_TUD_ECM_RNDIS\n  CONFIG_ID_RNDIS = 0,\n  CONFIG_ID_ECM   = 1,\n#else\n  CONFIG_ID_NCM = 0,\n#endif\n  CONFIG_ID_COUNT\n};\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic const tusb_desc_device_t desc_device = {\n  .bLength         = sizeof(tusb_desc_device_t),\n  .bDescriptorType = TUSB_DESC_DEVICE,\n#if CFG_TUD_NCM\n  .bcdUSB = 0x0201,\n#else\n  .bcdUSB = 0x0200,\n#endif\n  // Use Interface Association Descriptor (IAD) device class\n  .bDeviceClass    = TUSB_CLASS_MISC,\n  .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n\n  .idVendor  = 0xCafe,\n  .idProduct = USB_PID,\n  .bcdDevice = 0x0101,\n\n  .iManufacturer = STRID_MANUFACTURER,\n  .iProduct      = STRID_PRODUCT,\n  .iSerialNumber = STRID_SERIAL,\n\n  .bNumConfigurations = CONFIG_ID_COUNT // multiple configurations\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nconst uint8_t *tud_descriptor_device_cb(void) {\n  return (const uint8_t *)&desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n#define MAIN_CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_RNDIS_DESC_LEN)\n#define ALT_CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_CDC_ECM_DESC_LEN)\n#define NCM_CONFIG_TOTAL_LEN  (TUD_CONFIG_DESC_LEN + TUD_CDC_NCM_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n// LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n// 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n#define EPNUM_NET_NOTIF 0x81\n#define EPNUM_NET_OUT   0x02\n#define EPNUM_NET_IN    0x82\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n// CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n// 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n#define EPNUM_NET_NOTIF 0x83\n#define EPNUM_NET_OUT   0x02\n#define EPNUM_NET_IN    0x81\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n// MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n//    e.g EP1 OUT & EP1 IN cannot exist together\n#define EPNUM_NET_NOTIF 0x81\n#define EPNUM_NET_OUT   0x02\n#define EPNUM_NET_IN    0x83\n\n#else\n#define EPNUM_NET_NOTIF 0x81\n#define EPNUM_NET_OUT   0x02\n#define EPNUM_NET_IN    0x82\n#endif\n\n#if CFG_TUD_ECM_RNDIS\n\nstatic uint8_t const rndis_configuration[] = {\n  // Config number (index+1), interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(CONFIG_ID_RNDIS + 1, ITF_NUM_TOTAL, 0, MAIN_CONFIG_TOTAL_LEN, 0, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_RNDIS_DESCRIPTOR(\n      ITF_NUM_CDC, STRID_INTERFACE, EPNUM_NET_NOTIF, 8, EPNUM_NET_OUT, EPNUM_NET_IN, CFG_TUD_NET_ENDPOINT_SIZE),\n};\n\nstatic const uint8_t ecm_configuration[] = {\n  // Config number (index+1), interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(CONFIG_ID_ECM + 1, ITF_NUM_TOTAL, 0, ALT_CONFIG_TOTAL_LEN, 0, 100),\n\n  // Interface number, description string index, MAC address string index, EP notification address and size, EP data address (out, in), and size, max segment size.\n  TUD_CDC_ECM_DESCRIPTOR(\n      ITF_NUM_CDC, STRID_INTERFACE, STRID_MAC, EPNUM_NET_NOTIF, 64, EPNUM_NET_OUT, EPNUM_NET_IN,\n      CFG_TUD_NET_ENDPOINT_SIZE, CFG_TUD_NET_MTU),\n};\n\n#else\n\nstatic uint8_t const ncm_configuration[] = {\n  // Config number (index+1), interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(CONFIG_ID_NCM + 1, ITF_NUM_TOTAL, 0, NCM_CONFIG_TOTAL_LEN, 0, 100),\n\n  // Interface number, description string index, MAC address string index, EP notification address and size, EP data address (out, in), and size, max segment size.\n  TUD_CDC_NCM_DESCRIPTOR(\n      ITF_NUM_CDC, STRID_INTERFACE, STRID_MAC, EPNUM_NET_NOTIF, 64, EPNUM_NET_OUT, EPNUM_NET_IN,\n      CFG_TUD_NET_ENDPOINT_SIZE, CFG_TUD_NET_MTU),\n};\n\n#endif\n\n// Configuration array: RNDIS and CDC-ECM\n// - Windows only works with RNDIS\n// - MacOS only works with CDC-ECM\n// - Linux will work on both\nstatic const uint8_t *const configuration_arr[CONFIG_ID_COUNT] = {\n#if CFG_TUD_ECM_RNDIS\n  [CONFIG_ID_RNDIS] = rndis_configuration,\n  [CONFIG_ID_ECM]   = ecm_configuration\n#else\n  [CONFIG_ID_NCM] = ncm_configuration\n#endif\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nconst uint8_t *tud_descriptor_configuration_cb(uint8_t index) {\n  return (index < CONFIG_ID_COUNT) ? configuration_arr[index] : NULL;\n}\n\n#if CFG_TUD_NCM\n//--------------------------------------------------------------------+\n// BOS Descriptor\n//--------------------------------------------------------------------+\n\n/* Used to automatically load the NCM driver on Windows 10, otherwise manual driver install is needed.\n   Associate NCM interface with WINNCM driver. */\n\n/* Microsoft OS 2.0 registry property descriptor\nPer MS requirements https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx\ndevice should create DeviceInterfaceGUIDs. It can be done by driver and\nin case of real PnP solution device should expose MS \"Microsoft OS 2.0\nregistry property descriptor\". Such descriptor can insert any record\ninto Windows registry per device/configuration/interface. In our case it\nwill insert \"DeviceInterfaceGUIDs\" multistring property.\n\nGUID is freshly generated and should be OK to use.\n\nhttps://developers.google.com/web/fundamentals/native-hardware/build-for-webusb/\n(Section Microsoft OS compatibility descriptors)\n*/\n\n#define BOS_TOTAL_LEN     (TUD_BOS_DESC_LEN + TUD_BOS_MICROSOFT_OS_DESC_LEN)\n\n#define MS_OS_20_DESC_LEN 0xB2\n\n// BOS Descriptor is required for webUSB\nconst uint8_t desc_bos[] = {\n  // total length, number of device caps\n  TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 1),\n\n  // Microsoft OS 2.0 descriptor\n  TUD_BOS_MS_OS_20_DESCRIPTOR(MS_OS_20_DESC_LEN, 1)};\n\nconst uint8_t *tud_descriptor_bos_cb(void) {\n  return desc_bos;\n}\n\nconst uint8_t desc_ms_os_20[] = {\n  // Set header: length, type, windows version, total length\n  U16_TO_U8S_LE(0x000A), U16_TO_U8S_LE(MS_OS_20_SET_HEADER_DESCRIPTOR), U32_TO_U8S_LE(0x06030000),\n  U16_TO_U8S_LE(MS_OS_20_DESC_LEN),\n\n  // Configuration subset header: length, type, configuration index, reserved, configuration total length\n  U16_TO_U8S_LE(0x0008), U16_TO_U8S_LE(MS_OS_20_SUBSET_HEADER_CONFIGURATION), 0, 0,\n  U16_TO_U8S_LE(MS_OS_20_DESC_LEN - 0x0A),\n\n  // Function Subset header: length, type, first interface, reserved, subset length\n  U16_TO_U8S_LE(0x0008), U16_TO_U8S_LE(MS_OS_20_SUBSET_HEADER_FUNCTION), ITF_NUM_CDC, 0,\n  U16_TO_U8S_LE(MS_OS_20_DESC_LEN - 0x0A - 0x08),\n\n  // MS OS 2.0 Compatible ID descriptor: length, type, compatible ID, sub compatible ID\n  U16_TO_U8S_LE(0x0014), U16_TO_U8S_LE(MS_OS_20_FEATURE_COMPATBLE_ID), 'W', 'I', 'N', 'N', 'C', 'M', 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sub-compatible\n\n  // MS OS 2.0 Registry property descriptor: length, type\n  U16_TO_U8S_LE(MS_OS_20_DESC_LEN - 0x0A - 0x08 - 0x08 - 0x14), U16_TO_U8S_LE(MS_OS_20_FEATURE_REG_PROPERTY),\n  U16_TO_U8S_LE(0x0007),\n  U16_TO_U8S_LE(0x002A), // wPropertyDataType, wPropertyNameLength and PropertyName \"DeviceInterfaceGUIDs\\0\" in UTF-16\n  'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00, 'r',\n  0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 's', 0x00, 0x00, 0x00,\n  U16_TO_U8S_LE(0x0050), // wPropertyDataLength\n                         //bPropertyData: {12345678-0D08-43FD-8B3E-127CA8AFFF9D}\n  '{', 0x00, '1', 0x00, '2', 0x00, '3', 0x00, '4', 0x00, '5', 0x00, '6', 0x00, '7', 0x00, '8', 0x00, '-', 0x00, '0',\n  0x00, 'D', 0x00, '0', 0x00, '8', 0x00, '-', 0x00, '4', 0x00, '3', 0x00, 'F', 0x00, 'D', 0x00, '-', 0x00, '8', 0x00,\n  'B', 0x00, '3', 0x00, 'E', 0x00, '-', 0x00, '1', 0x00, '2', 0x00, '7', 0x00, 'C', 0x00, 'A', 0x00, '8', 0x00, 'A',\n  0x00, 'F', 0x00, 'F', 0x00, 'F', 0x00, '9', 0x00, 'D', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00};\n\nTU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, \"Incorrect size\");\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, const tusb_control_request_t *request) {\n  // nothing to with DATA & ACK stage\n  if (stage != CONTROL_STAGE_SETUP) {\n    return true;\n  }\n\n  switch (request->bmRequestType_bit.type) {\n    case TUSB_REQ_TYPE_VENDOR:\n      switch (request->bRequest) {\n        case 1:\n          if (request->wIndex == 7) {\n            // Get Microsoft OS 2.0 compatible descriptor\n            uint16_t total_len;\n            memcpy(&total_len, desc_ms_os_20 + 8, 2);\n\n            return tud_control_xfer(rhport, request, (void *)(uintptr_t)desc_ms_os_20, total_len);\n          } else {\n            return false;\n          }\n\n        default:\n          break; // nothing to do\n      }\n      break;\n\n    default:\n      break; // nothing to do\n  }\n\n  // stall unknown request\n  return false;\n}\n\n#endif\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// array of pointer to string descriptors\nstatic const char *string_desc_arr[STRID_COUNT] = {\n  [STRID_LANGID]       = (const char[]){0x09, 0x04},  // supported language is English (0x0409)\n  [STRID_MANUFACTURER] = \"TinyUSB\",                   // Manufacturer\n  [STRID_PRODUCT]      = \"TinyUSB Device\",            // Product\n  [STRID_SERIAL]       = NULL,                        // Serials will use unique ID if possible\n  [STRID_INTERFACE]    = \"TinyUSB Network Interface\", // Interface Description\n  [STRID_MAC]          = NULL                         // STRID_MAC index is handled separately\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nconst uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void)langid;\n  unsigned int chr_count = 0;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    case STRID_MAC:\n      // Convert MAC address into UTF-16\n      for (unsigned i = 0; i < sizeof(tud_network_mac_address); i++) {\n        _desc_str[1 + chr_count++] = \"0123456789ABCDEF\"[(tud_network_mac_address[i] >> 4) & 0xf];\n        _desc_str[1 + chr_count++] = \"0123456789ABCDEF\"[(tud_network_mac_address[i] >> 0) & 0xf];\n      }\n      break;\n\n    default: {\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (index >= sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) {\n        return NULL;\n      }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n\n      const size_t max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) {\n        chr_count = max_count;\n      }\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n    }\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/printer_to_cdc/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(printer_to_cdc C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/printer_to_cdc/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/printer_to_cdc/README.md",
    "content": "#### Printer to CDC\n\nThis example demonstrates a USB composite device with a Printer class interface and a CDC serial interface. Data flows bidirectionally between the two:\n\n- Data sent to the Printer (from host) is forwarded to the CDC serial port\n- Data sent to the CDC serial port (from host) is forwarded to the Printer IN endpoint\n\nThis is useful for debugging printer class communication or as a reference for implementing printer class devices.\n\n#### USB Interfaces\n\n| Interface | Class | Description |\n|-----------|-------|-------------|\n| 0 | CDC ACM | Virtual serial port |\n| 2 | Printer | USB Printer (bidirectional, protocol 2) |\n\n#### How to Test\n\nThe device exposes two endpoints on the host:\n- `/dev/ttyACM0` (CDC serial port)\n- `/dev/usb/lp0` (USB printer)\n\nNote: the actual device numbers may vary depending on your system.\n\n**Prerequisites (Linux):**\n\n```bash\n# Load the USB printer kernel module if not already loaded\nsudo modprobe usblp\n\n# Check devices exist\nls /dev/ttyACM* /dev/usb/lp*\n```\n\n**Test Printer to CDC (host writes to printer, reads from CDC):**\n\n```bash\n# Terminal 1: read from CDC\ncat /dev/ttyACM0\n\n# Terminal 2: write to printer\necho \"hello from printer\" > /dev/usb/lp0\n# \"hello from printer\" appears in Terminal 1\n```\n\n**Test CDC to Printer (host writes to CDC, reads from printer):**\n\n```bash\n# Terminal 1: read from printer IN endpoint\ncat /dev/usb/lp0\n\n# Terminal 2: write to CDC\necho \"hello from cdc\" > /dev/ttyACM0\n# \"hello from cdc\" appears in Terminal 1\n```\n\n**Interactive bidirectional test:**\n\n```bash\n# Terminal 1: open CDC serial port\nminicom -D /dev/ttyACM0\n\n# Terminal 2: send to printer\necho \"tinyusb print example\" > /dev/usb/lp0\n# Text appears in minicom. Type in minicom to send data back through printer TX.\n```\n\n#### IEEE 1284 Device ID\n\nThe device responds to GET_DEVICE_ID requests with:\n\n```\nMFG:TinyUSB;MDL:Printer to CDC;CMD:PS;CLS:PRINTER;\n```\n\nVerify with:\n\n```bash\ncat /sys/class/usbmisc/lp0/device/ieee1284_id\n```\n"
  },
  {
    "path": "examples/device/printer_to_cdc/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2026 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* This example demonstrates a USB Printer + CDC composite device.\n * Data received on the Printer interface is forwarded to the CDC serial port,\n * and data received on the CDC serial port is forwarded back to the Printer interface.\n *\n * To test:\n *   1. Flash the device\n *   2. Open a serial terminal on the CDC port (e.g. /dev/ttyACM0)\n *   3. Send data to the printer: echo \"hello\" > /dev/usb/lp0\n *   4. The data appears on the CDC serial terminal\n *   5. Type in the serial terminal to send data back through the printer TX\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#include \"usb_descriptors.h\"\n\n// -------------------------------------------------------------------+\n// Tasks\n// -------------------------------------------------------------------+\n\n// Forward data from Printer RX to CDC TX\nstatic void printer_to_cdc_task(void) {\n  uint32_t avail = tud_printer_read_available();\n  if (avail == 0 || !tud_cdc_write_available()) {\n    return;\n  }\n\n  uint8_t buf[64];\n  uint32_t count = tud_printer_read(buf, TU_MIN(sizeof(buf), tud_cdc_write_available()));\n  if (count > 0) {\n    tud_cdc_write(buf, count);\n    tud_cdc_write_flush();\n  }\n}\n\n// Forward data from CDC RX to Printer TX\nstatic void cdc_to_printer_task(void) {\n  uint32_t avail = tud_printer_write_available();\n  if (tud_cdc_available() == 0 || avail == 0) {\n    return;\n  }\n\n  uint8_t buf[64];\n  uint32_t count = tud_cdc_read(buf, TU_MIN(sizeof(buf), avail));\n  if (count > 0) {\n    tud_printer_write(buf, count);\n    tud_printer_write_flush();\n  }\n}\n\nint main(void) {\n  board_init();\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {.role = TUSB_ROLE_DEVICE, .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task();             // tinyusb device task\n    printer_to_cdc_task();  // forward printer data to CDC\n    cdc_to_printer_task();  // forward CDC data to printer\n  }\n}\n\n//--------------------------------------------------------------------+\n// Printer callbacks\n//--------------------------------------------------------------------+\n\nvoid tud_printer_rx_cb(uint8_t itf) {\n  (void)itf;\n}\n\n// IEEE 1284 Device ID: first 2 bytes are big-endian total length (including the 2 length bytes).\n// The rest is the Device ID string using standard abbreviated keys.\nstatic const char printer_device_id[] =\n  \"\\x00\\x34\" // total length = 52 = 0x0034 (big-endian)\n  \"MFG:TinyUSB;\"\n  \"MDL:Printer to CDC;\"\n  \"CMD:PS;\"\n  \"CLS:PRINTER;\";\n\nTU_VERIFY_STATIC(sizeof(printer_device_id) - 1 == 52, \"device ID length mismatch\");\n\nuint8_t const *tud_printer_get_device_id_cb(uint8_t itf) {\n  (void)itf;\n  return (uint8_t const *)printer_device_id;\n}\n"
  },
  {
    "path": "examples/device/printer_to_cdc/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2026 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef _TUSB_CONFIG_H_\n#define _TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n  #define BOARD_TUD_RHPORT 0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n  #define BOARD_TUD_MAX_SPEED OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n  #error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n  #define CFG_TUSB_OS OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n  #define CFG_TUSB_DEBUG 0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED 1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n  #define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n  #define CFG_TUSB_MEM_ALIGN __attribute__((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n  #define CFG_TUD_ENDPOINT0_SIZE 64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_HID     0\n#define CFG_TUD_CDC     1\n#define CFG_TUD_MSC     0\n#define CFG_TUD_MIDI    0\n#define CFG_TUD_VENDOR  0\n#define CFG_TUD_PRINTER 1\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// Printer buffer sizes\n#define CFG_TUD_PRINTER_RX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_PRINTER_TX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_PRINTER_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_PRINTER_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/printer_to_cdc/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2026 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#include \"usb_descriptors.h\"\n\n#define USB_VID   0xCafe\n#define USB_PID   0x4005\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n  .bLength            = sizeof(tusb_desc_device_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE,\n  .bcdUSB             = USB_BCD,\n\n  // Use Interface Association Descriptor (IAD) for CDC\n  // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n  .idVendor           = USB_VID,\n  .idProduct          = USB_PID,\n  .bcdDevice          = 0x0100,\n\n  .iManufacturer      = 0x01,\n  .iProduct           = 0x02,\n  .iSerialNumber      = 0x03,\n\n  .bNumConfigurations = 0x01\n};\n\nuint8_t const *tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\n// Endpoint numbers\n#if defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n  #define EPNUM_PRINTER_OUT 0x04\n  #define EPNUM_PRINTER_IN  0x85\n#else\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n  #define EPNUM_PRINTER_OUT 0x03\n  #define EPNUM_PRINTER_IN  0x83\n#endif\n\n// full speed configuration\nstatic uint8_t const desc_fs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 16, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),\n\n  // Interface number, string index, EP Bulk Out address, EP Bulk In address, EP size\n  TUD_PRINTER_DESCRIPTOR(ITF_NUM_PRINTER, 5, EPNUM_PRINTER_OUT, EPNUM_PRINTER_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// high speed configuration\nstatic uint8_t const desc_hs_configuration[] = {\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 16, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512),\n\n  TUD_PRINTER_DESCRIPTOR(ITF_NUM_PRINTER, 5, EPNUM_PRINTER_OUT, EPNUM_PRINTER_IN, 512),\n};\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = USB_BCD,\n\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *) &desc_device_qualifier;\n}\n\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index;\n\n  // if link speed is high return fullspeed config, and vice versa\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // TUD_OPT_HIGH_SPEED\n\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index;\n\n#if TUD_OPT_HIGH_SPEED\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n  STRID_CDC,\n  STRID_PRINTER,\n};\n\nstatic char const *string_desc_arr[] = {\n  (const char[]) { 0x09, 0x04 }, // 0: supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serial, use unique ID if possible\n  \"TinyUSB CDC\",                 // 4: CDC Interface\n  \"TinyUSB Printer\",             // 5: Printer Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) { return NULL; }\n\n      const char *str = string_desc_arr[index];\n\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1;\n      if (chr_count > max_count) { chr_count = max_count; }\n\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/printer_to_cdc/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2026 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\nenum {\n  ITF_NUM_CDC,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_PRINTER,\n  ITF_NUM_TOTAL,\n};\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_PRINTER_DESC_LEN)\n\n#endif /* USB_DESCRIPTORS_H_ */\n"
  },
  {
    "path": "examples/device/uac2_headset/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(uac2_headset C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/uac2_headset/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/uac2_headset/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/uac2_headset/skip.txt",
    "content": "mcu:LPC11UXX\nmcu:LPC13XX\nmcu:NUC121\nmcu:SAMD11\nmcu:SAME5X\nmcu:SAMG\nboard:stm32l052dap52\nfamily:espressif\n"
  },
  {
    "path": "examples/device/uac2_headset/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\n\n// List of supported sample rates\nconst uint32_t sample_rates[] = {44100, 48000};\n\nuint32_t current_sample_rate = 44100;\n\n#define N_SAMPLE_RATES TU_ARRAY_SIZE(sample_rates)\n\n/* Blink pattern\n * - 25 ms   : streaming data\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_STREAMING = 25,\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nenum {\n  VOLUME_CTRL_0_DB = 0,\n  VOLUME_CTRL_10_DB = 2560,\n  VOLUME_CTRL_20_DB = 5120,\n  VOLUME_CTRL_30_DB = 7680,\n  VOLUME_CTRL_40_DB = 10240,\n  VOLUME_CTRL_50_DB = 12800,\n  VOLUME_CTRL_60_DB = 15360,\n  VOLUME_CTRL_70_DB = 17920,\n  VOLUME_CTRL_80_DB = 20480,\n  VOLUME_CTRL_90_DB = 23040,\n  VOLUME_CTRL_100_DB = 25600,\n  VOLUME_CTRL_SILENCE = 0x8000,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Audio controls\n// Current states\nuint8_t mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];   // +1 for master channel 0\nint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];// +1 for master channel 0\n\n// Buffer for microphone data\nint32_t mic_buf[CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ / 4];\n// Buffer for speaker data\nint32_t spk_buf[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ / 4];\n// Speaker data size received in the last frame\nint spk_data_size;\n// Resolution per format\nconst uint8_t resolutions_per_format[CFG_TUD_AUDIO_FUNC_1_N_FORMATS] = {CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX,\n                                                                        CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX};\n// Current resolution, update on format change\nuint8_t current_resolution;\n\nvoid led_blinking_task(void);\nvoid audio_task(void);\nvoid audio_control_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  TU_LOG1(\"Headset running\\r\\n\");\n\n  while (1) {\n    tud_task();// TinyUSB device task\n    audio_task();\n    audio_control_task();\n    led_blinking_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// Audio Callback Functions\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// UAC1 Helper Functions\n//--------------------------------------------------------------------+\n\nstatic bool audio10_set_req_ep(tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n\n  switch (ctrlSel) {\n    case AUDIO10_EP_CTRL_SAMPLING_FREQ:\n      if (p_request->bRequest == AUDIO10_CS_REQ_SET_CUR) {\n        // Request uses 3 bytes\n        TU_VERIFY(p_request->wLength == 3);\n\n        current_sample_rate = tu_unaligned_read32(pBuff) & 0x00FFFFFF;\n\n        TU_LOG2(\"EP set current freq: %\" PRIu32 \"\\r\\n\", current_sample_rate);\n\n        return true;\n      }\n      break;\n\n    // Unknown/Unsupported control\n    default:\n      TU_BREAKPOINT();\n      return false;\n  }\n\n  return false;\n}\n\nstatic bool audio10_get_req_ep(uint8_t rhport, tusb_control_request_t const *p_request) {\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n\n  switch (ctrlSel) {\n    case AUDIO10_EP_CTRL_SAMPLING_FREQ:\n      if (p_request->bRequest == AUDIO10_CS_REQ_GET_CUR) {\n        TU_LOG2(\"EP get current freq\\r\\n\");\n\n        uint8_t freq[3];\n        freq[0] = (uint8_t) (current_sample_rate & 0xFF);\n        freq[1] = (uint8_t) ((current_sample_rate >> 8) & 0xFF);\n        freq[2] = (uint8_t) ((current_sample_rate >> 16) & 0xFF);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, freq, sizeof(freq));\n      }\n      break;\n\n    // Unknown/Unsupported control\n    default:\n      TU_BREAKPOINT();\n      return false;\n  }\n\n  return false;\n}\n\nstatic bool audio10_set_req_entity(tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // If request is for our speaker feature unit\n  if (entityID == UAC1_ENTITY_SPK_FEATURE_UNIT) {\n    switch (ctrlSel) {\n      case AUDIO10_FU_CTRL_MUTE:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_SET_CUR:\n            // Only 1st form is supported\n            TU_VERIFY(p_request->wLength == 1);\n\n            mute[channelNum] = pBuff[0];\n\n            TU_LOG2(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n            return true;\n\n          default:\n            return false; // not supported\n        }\n\n      case AUDIO10_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_SET_CUR:\n            // Only 1st form is supported\n            TU_VERIFY(p_request->wLength == 2);\n\n            volume[channelNum] = (int16_t)tu_unaligned_read16(pBuff) / 256;\n\n            TU_LOG2(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n            return true;\n\n          default:\n            return false; // not supported\n        }\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  return false;\n}\n\nstatic bool audio10_get_req_entity(uint8_t rhport, tusb_control_request_t const *p_request) {\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // If request is for our speaker feature unit\n  if (entityID == UAC1_ENTITY_SPK_FEATURE_UNIT) {\n    switch (ctrlSel) {\n      case AUDIO10_FU_CTRL_MUTE:\n        // Audio control mute cur parameter block consists of only one byte - we thus can send it right away\n        // There does not exist a range parameter block for mute\n        TU_LOG2(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &mute[channelNum], 1);\n\n      case AUDIO10_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_GET_CUR:\n            TU_LOG2(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t vol = (int16_t) volume[channelNum];\n              vol = vol * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &vol, sizeof(vol));\n            }\n\n          case AUDIO10_CS_REQ_GET_MIN:\n            TU_LOG2(\"    Get Volume min of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t min = -90; // -90 dB\n              min = min * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &min, sizeof(min));\n            }\n\n          case AUDIO10_CS_REQ_GET_MAX:\n            TU_LOG2(\"    Get Volume max of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t max = 30; // +30 dB\n              max = max * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &max, sizeof(max));\n            }\n\n          case AUDIO10_CS_REQ_GET_RES:\n            TU_LOG2(\"    Get Volume res of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t res = 1; // 1 dB\n              res = res * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &res, sizeof(res));\n            }\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// UAC2 Helper Functions\n//--------------------------------------------------------------------+\n\n#if TUD_OPT_HIGH_SPEED\n\n// Helper for clock get requests\nstatic bool audio20_clock_get_request(uint8_t rhport, audio20_control_request_t const *request) {\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_CLOCK);\n\n  if (request->bControlSelector == AUDIO20_CS_CTRL_SAM_FREQ) {\n    if (request->bRequest == AUDIO20_CS_REQ_CUR) {\n      TU_LOG1(\"Clock get current freq %\" PRIu32 \"\\r\\n\", current_sample_rate);\n\n      audio20_control_cur_4_t curf = {(int32_t) tu_htole32(current_sample_rate)};\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &curf, sizeof(curf));\n    } else if (request->bRequest == AUDIO20_CS_REQ_RANGE) {\n      audio20_control_range_4_n_t(N_SAMPLE_RATES) rangef =\n          {\n              .wNumSubRanges = tu_htole16(N_SAMPLE_RATES)};\n      TU_LOG1(\"Clock get %d freq ranges\\r\\n\", N_SAMPLE_RATES);\n      for (uint8_t i = 0; i < N_SAMPLE_RATES; i++) {\n        rangef.subrange[i].bMin = (int32_t) sample_rates[i];\n        rangef.subrange[i].bMax = (int32_t) sample_rates[i];\n        rangef.subrange[i].bRes = 0;\n        TU_LOG1(\"Range %d (%d, %d, %d)\\r\\n\", i, (int) rangef.subrange[i].bMin, (int) rangef.subrange[i].bMax, (int) rangef.subrange[i].bRes);\n      }\n\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &rangef, sizeof(rangef));\n    }\n  } else if (request->bControlSelector == AUDIO20_CS_CTRL_CLK_VALID &&\n             request->bRequest == AUDIO20_CS_REQ_CUR) {\n    audio20_control_cur_1_t cur_valid = {.bCur = 1};\n    TU_LOG1(\"Clock get is valid %u\\r\\n\", cur_valid.bCur);\n    return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &cur_valid, sizeof(cur_valid));\n  }\n  TU_LOG1(\"Clock get request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n  return false;\n}\n\n// Helper for clock set requests\nstatic bool audio20_clock_set_request(uint8_t rhport, audio20_control_request_t const *request, uint8_t const *buf) {\n  (void) rhport;\n\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_CLOCK);\n  TU_VERIFY(request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  if (request->bControlSelector == AUDIO20_CS_CTRL_SAM_FREQ) {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_4_t));\n\n    current_sample_rate = (uint32_t) ((audio20_control_cur_4_t const *) buf)->bCur;\n\n    TU_LOG1(\"Clock set current freq: %\" PRIu32 \"\\r\\n\", current_sample_rate);\n\n    return true;\n  } else {\n    TU_LOG1(\"Clock set request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n    return false;\n  }\n}\n\n// Helper for feature unit get requests\nstatic bool audio20_feature_unit_get_request(uint8_t rhport, audio20_control_request_t const *request) {\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_SPK_FEATURE_UNIT);\n\n  if (request->bControlSelector == AUDIO20_FU_CTRL_MUTE && request->bRequest == AUDIO20_CS_REQ_CUR) {\n    audio20_control_cur_1_t mute1 = {.bCur = mute[request->bChannelNumber]};\n    TU_LOG1(\"Get channel %u mute %d\\r\\n\", request->bChannelNumber, mute1.bCur);\n    return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &mute1, sizeof(mute1));\n  } else if (request->bControlSelector == AUDIO20_FU_CTRL_VOLUME) {\n    if (request->bRequest == AUDIO20_CS_REQ_RANGE) {\n      audio20_control_range_2_n_t(1) range_vol = {\n          .wNumSubRanges = tu_htole16(1),\n          .subrange[0] = {.bMin = tu_htole16(-VOLUME_CTRL_50_DB), tu_htole16(VOLUME_CTRL_0_DB), tu_htole16(256)}};\n      TU_LOG1(\"Get channel %u volume range (%d, %d, %u) dB\\r\\n\", request->bChannelNumber,\n              range_vol.subrange[0].bMin / 256, range_vol.subrange[0].bMax / 256, range_vol.subrange[0].bRes / 256);\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &range_vol, sizeof(range_vol));\n    } else if (request->bRequest == AUDIO20_CS_REQ_CUR) {\n      audio20_control_cur_2_t cur_vol = {.bCur = tu_htole16(volume[request->bChannelNumber])};\n      TU_LOG1(\"Get channel %u volume %d dB\\r\\n\", request->bChannelNumber, cur_vol.bCur / 256);\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &cur_vol, sizeof(cur_vol));\n    }\n  }\n  TU_LOG1(\"Feature unit get request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n\n  return false;\n}\n\n// Helper for feature unit set requests\nstatic bool audio20_feature_unit_set_request(uint8_t rhport, audio20_control_request_t const *request, uint8_t const *buf) {\n  (void) rhport;\n\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_SPK_FEATURE_UNIT);\n  TU_VERIFY(request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  if (request->bControlSelector == AUDIO20_FU_CTRL_MUTE) {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_1_t));\n\n    mute[request->bChannelNumber] = ((audio20_control_cur_1_t const *) buf)->bCur;\n\n    TU_LOG1(\"Set channel %d Mute: %d\\r\\n\", request->bChannelNumber, mute[request->bChannelNumber]);\n\n    return true;\n  } else if (request->bControlSelector == AUDIO20_FU_CTRL_VOLUME) {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_2_t));\n\n    volume[request->bChannelNumber] = ((audio20_control_cur_2_t const *) buf)->bCur;\n\n    TU_LOG1(\"Set channel %d volume: %d dB\\r\\n\", request->bChannelNumber, volume[request->bChannelNumber] / 256);\n\n    return true;\n  } else {\n    TU_LOG1(\"Feature unit set request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n    return false;\n  }\n}\n\nstatic bool audio20_get_req_entity(uint8_t rhport, tusb_control_request_t const *p_request) {\n  audio20_control_request_t const *request = (audio20_control_request_t const *) p_request;\n\n  if (request->bEntityID == UAC2_ENTITY_CLOCK)\n    return audio20_clock_get_request(rhport, request);\n  if (request->bEntityID == UAC2_ENTITY_SPK_FEATURE_UNIT)\n    return audio20_feature_unit_get_request(rhport, request);\n  else {\n    TU_LOG1(\"Get request not handled, entity = %d, selector = %d, request = %d\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n  }\n  return false;\n}\n\nstatic bool audio20_set_req_entity(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *buf) {\n  audio20_control_request_t const *request = (audio20_control_request_t const *) p_request;\n\n  if (request->bEntityID == UAC2_ENTITY_SPK_FEATURE_UNIT)\n    return audio20_feature_unit_set_request(rhport, request, buf);\n  if (request->bEntityID == UAC2_ENTITY_CLOCK)\n    return audio20_clock_set_request(rhport, request, buf);\n  TU_LOG1(\"Set request not handled, entity = %d, selector = %d, request = %d\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n\n  return false;\n}\n\n#endif // TUD_OPT_HIGH_SPEED\n\n// Invoked when audio class specific set request received for an EP\nbool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  if (tud_audio_version() == 1) {\n    return audio10_set_req_ep(p_request, pBuff);\n  } else if (tud_audio_version() == 2) {\n    // We do not support any requests here\n  }\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an EP\nbool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_get_req_ep(rhport, p_request);\n  } else if (tud_audio_version() == 2) {\n    // We do not support any requests here\n  }\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_get_req_entity(rhport, p_request);\n#if TUD_OPT_HIGH_SPEED\n  } else if (tud_audio_version() == 2) {\n    return audio20_get_req_entity(rhport, p_request);\n#endif\n  }\n\n  return false;\n}\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *buf) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_set_req_entity(p_request, buf);\n#if TUD_OPT_HIGH_SPEED\n  } else if (tud_audio_version() == 2) {\n    return audio20_set_req_entity(rhport, p_request, buf);\n#endif\n  }\n\n  return false;\n}\n\nbool tud_audio_set_itf_close_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  uint8_t const itf = tu_u16_low(tu_le16toh(p_request->wIndex));\n  uint8_t const alt = tu_u16_low(tu_le16toh(p_request->wValue));\n\n  if (ITF_NUM_AUDIO_STREAMING_SPK == itf && alt == 0) {\n    blink_interval_ms = BLINK_MOUNTED;\n  }\n\n  return true;\n}\n\nbool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  uint8_t const itf = tu_u16_low(tu_le16toh(p_request->wIndex));\n  uint8_t const alt = tu_u16_low(tu_le16toh(p_request->wValue));\n\n  TU_LOG2(\"Set interface %d alt %d\\r\\n\", itf, alt);\n  if (ITF_NUM_AUDIO_STREAMING_SPK == itf && alt != 0) {\n    blink_interval_ms = BLINK_STREAMING;\n  }\n\n  // Clear buffer when streaming format is changed\n  spk_data_size = 0;\n  if (alt != 0) {\n    current_resolution = resolutions_per_format[alt - 1];\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// AUDIO Task\n//--------------------------------------------------------------------+\n\n// This task simulates an audio transfer callback, one frame is sent/received every 1ms.\n// In a real application, this would be replaced with actual I2S send/receive callback.\nvoid audio_task(void) {\n  static uint32_t start_ms = 0;\n  uint32_t curr_ms = tusb_time_millis_api();\n  if (start_ms == curr_ms) return;// not enough time\n  start_ms = curr_ms;\n  // When new data arrived, copy data from speaker buffer, to microphone buffer\n  // and send it over\n  // Only support speaker & headphone both have the same resolution\n  // If one is 16bit another is 24bit be care of LOUD noise !\n  spk_data_size = tud_audio_read(spk_buf, sizeof(spk_buf));\n  if (spk_data_size) {\n    if (current_resolution == 16) {\n      int16_t *src = (int16_t *) spk_buf;\n      int16_t *limit = (int16_t *) spk_buf + spk_data_size / 2;\n      int16_t *dst = (int16_t *) mic_buf;\n      while (src < limit) {\n        // Combine two channels into one\n        int32_t left = *src++;\n        int32_t right = *src++;\n        *dst++ = (int16_t) ((left >> 1) + (right >> 1));\n      }\n      tud_audio_write((uint8_t *) mic_buf, (uint16_t) (spk_data_size / 2));\n      spk_data_size = 0;\n    } else if (current_resolution == 24) {\n      int32_t *src = spk_buf;\n      int32_t *limit = spk_buf + spk_data_size / 4;\n      int32_t *dst = mic_buf;\n      while (src < limit) {\n        // Combine two channels into one\n        int32_t left = *src++;\n        int32_t right = *src++;\n        *dst++ = (int32_t) ((uint32_t) ((left >> 1) + (right >> 1)) & 0xffffff00ul);\n      }\n      tud_audio_write((uint8_t *) mic_buf, (uint16_t) (spk_data_size / 2));\n      spk_data_size = 0;\n    }\n  }\n}\n\nvoid audio_control_task(void) {\n  // Press on-board button to control volume\n  // Open host volume control, volume should switch between 10% and 100%\n\n  // Poll every 50ms\n  const uint32_t interval_ms = 50;\n  static uint32_t start_ms = 0;\n  static uint32_t btn_prev = 0;\n\n  if (tusb_time_millis_api() - start_ms < interval_ms) return;// not enough time\n  start_ms += interval_ms;\n\n  uint32_t btn = board_button_read();\n\n  // Even UAC1 spec have status interrupt support like UAC2, most host do not support it\n  // So you have to either use UAC2 or use old day HID volume control\n  TU_VERIFY((tud_audio_version() == 1),);\n\n  if (!btn_prev && btn) {\n    // Adjust volume between 0dB (100%) and -30dB (10%)\n    for (int i = 0; i < CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1; i++) {\n      volume[i] = volume[i] == 0 ? -VOLUME_CTRL_30_DB : 0;\n    }\n\n    // 6.1 Interrupt Data Message\n    const audio_interrupt_data_t data = {.v2 = {\n        .bInfo = 0,                                      // Class-specific interrupt, originated from an interface\n        .bAttribute = AUDIO20_CS_REQ_CUR,                // Caused by current settings\n        .wValue_cn_or_mcn = 0,                           // CH0: master volume\n        .wValue_cs = AUDIO20_FU_CTRL_VOLUME,             // Volume change\n        .wIndex_ep_or_int = 0,                           // From the interface itself\n        .wIndex_entity_id = UAC2_ENTITY_SPK_FEATURE_UNIT,// From feature unit\n    }};\n\n    tud_audio_int_write(&data);\n  }\n\n  btn_prev = btn;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) return;\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;\n}\n"
  },
  {
    "path": "examples/device/uac2_headset/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_AUDIO             1\n#define CFG_TUD_VENDOR            0\n\n//--------------------------------------------------------------------\n// AUDIO CLASS DRIVER CONFIGURATION\n//--------------------------------------------------------------------\n\n// Allow volume controlled by on-baord button\n#define CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP                            1\n\n// How many formats are used, need to adjust USB descriptor if changed\n#define CFG_TUD_AUDIO_FUNC_1_N_FORMATS                               2\n\n// Audio format type I specifications\n/* 24bit/48kHz is the best quality for headset or 24bit/96kHz for 2ch speaker,\n   high-speed is needed beyond this */\n#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE                         48000\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX                           1\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX                           2\n\n// 16bit in 16bit slots\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX          2\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX                  16\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX          2\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX                  16\n\n// 24bit in 32bit slots (UAC2 only)\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX          4\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_TX                  24\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX          4\n#define CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX                  24\n\n// EP and buffer size - for isochronous EP´s, the buffer and EP size are equal (different sizes would not make sense)\n#define CFG_TUD_AUDIO_ENABLE_EP_IN                1\n\n// UAC1 (Full-Speed) Endpoint size calculation\n#define CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_IN   TUD_AUDIO_EP_SIZE(false, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n\n// UAC2 (High-Speed) Endpoint size calculation\n#define CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_IN   TUD_AUDIO_EP_SIZE(true, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n#define CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_IN   TUD_AUDIO_EP_SIZE(true, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX)\n\n// Maximum EP IN size for all AS alternate settings used\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX         TU_MAX(CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_IN, TU_MAX(CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_IN, CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_IN))\n\n// Tx flow control needs buffer size >= 4* EP size to work correctly\n// Example write FIFO every 1ms (8 HS frames), so buffer size should be 8 times larger for HS device\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ      TU_MAX(4 * CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_IN, TU_MAX(32 * CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_IN, 32 * CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_IN))\n\n// EP and buffer size - for isochronous EP´s, the buffer and EP size are equal (different sizes would not make sense)\n#define CFG_TUD_AUDIO_ENABLE_EP_OUT               1\n\n// UAC1 (Full-Speed) Endpoint size calculation\n#define CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_OUT  TUD_AUDIO_EP_SIZE(false, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX)\n\n// UAC2 (High-Speed) Endpoint size calculation\n#define CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_OUT  TUD_AUDIO_EP_SIZE(true, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX)\n#define CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_OUT  TUD_AUDIO_EP_SIZE(true, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX)\n\n// Maximum EP OUT size for all AS alternate settings used\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX        TU_MAX(CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_OUT, TU_MAX(CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_OUT, CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_OUT))\n\n// Rx flow control needs buffer size >= 4* EP size to work correctly\n// Example read FIFO every 1ms (8 HS frames), so buffer size should be 8 times larger for HS device\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ     TU_MAX(4 * CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_OUT, TU_MAX(32 * CFG_TUD_AUDIO20_FUNC_1_FORMAT_1_EP_SZ_OUT, 32 * CFG_TUD_AUDIO20_FUNC_1_FORMAT_2_EP_SZ_OUT))\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/uac2_headset/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VENDOR, 5) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for Audio\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *)&desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n#define CONFIG_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + CFG_TUD_AUDIO * TUD_AUDIO_HEADSET_STEREO_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_AUDIO_IN    0x03\n  #define EPNUM_AUDIO_OUT   0x03\n  #define EPNUM_AUDIO_INT   0x01\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_AUDIO_IN    0x01\n  #define EPNUM_AUDIO_OUT   0x02\n  #define EPNUM_AUDIO_INT   0x03\n\n#elif CFG_TUSB_MCU == OPT_MCU_NRF5X\n  // ISO endpoints for NRF5x are fixed to 0x08 (0x88)\n  #define EPNUM_AUDIO_IN    0x08\n  #define EPNUM_AUDIO_OUT   0x08\n  #define EPNUM_AUDIO_INT   0x01\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_AUDIO_IN    0x01\n  #define EPNUM_AUDIO_OUT   0x02\n  #define EPNUM_AUDIO_INT   0x03\n\n#else\n  #define EPNUM_AUDIO_IN    0x01\n  #define EPNUM_AUDIO_OUT   0x01\n  #define EPNUM_AUDIO_INT   0x02\n#endif\n\n#define CONFIG_UAC1_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + TUD_AUDIO10_HEADSET_STEREO_DESC_LEN(2))\n\nuint8_t const desc_uac1_configuration[] =\n{\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_UAC1_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, bytes per sample RX/TX, bits used per sample RX/TX, EP Out & EP In address, EP sizes, sample rate\n    TUD_AUDIO10_HEADSET_STEREO_DESCRIPTOR(ITF_NUM_AUDIO_CONTROL, 4, \\\n      CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX, \\\n      CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX, \\\n      EPNUM_AUDIO_OUT, CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_OUT, \\\n      EPNUM_AUDIO_IN | 0x80, CFG_TUD_AUDIO10_FUNC_1_FORMAT_1_EP_SZ_IN, \\\n      44100, 48000)\n};\n\nTU_VERIFY_STATIC(sizeof(desc_uac1_configuration) == CONFIG_UAC1_TOTAL_LEN, \"Incorrect size\");\n\n#if TUD_OPT_HIGH_SPEED\n\n#define CONFIG_UAC2_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + TUD_AUDIO20_HEADSET_STEREO_DESC_LEN)\n\nuint8_t const desc_uac2_configuration[] =\n{\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_UAC2_TOTAL_LEN, 0x00, 100),\n\n    // String index, EP Out & EP In address, EP Interrupt address\n    TUD_AUDIO20_HEADSET_STEREO_DESCRIPTOR(5, EPNUM_AUDIO_OUT, EPNUM_AUDIO_IN | 0x80, EPNUM_AUDIO_INT | 0x80)\n};\n\nTU_VERIFY_STATIC(sizeof(desc_uac2_configuration) == CONFIG_UAC2_TOTAL_LEN, \"Incorrect size\");\n\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\ntusb_desc_device_qualifier_t const desc_device_qualifier =\n{\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = 0x0200,\n\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void)\n{\n  return (uint8_t const *) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_uac1_configuration : desc_uac2_configuration;\n}\n#endif\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void)index; // for multiple configurations\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  if(tud_speed_get() == TUSB_SPEED_FULL) {\n    return desc_uac1_configuration;\n  } else {\n    return desc_uac2_configuration;\n  }\n#else\n  return desc_uac1_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 },  // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                      // 1: Manufacturer\n  \"TinyUSB Headset\",              // 2: Product\n  NULL,                           // 3: Serials will use unique ID if possible\n  \"TinyUSB UAC1 Headset\",         // 4: Function\n  \"TinyUSB UAC2 Headset\",         // 5: Function\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/uac2_headset/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenbreg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\nenum\n{\n  ITF_NUM_AUDIO_CONTROL = 0,\n  ITF_NUM_AUDIO_STREAMING_SPK,\n  ITF_NUM_AUDIO_STREAMING_MIC,\n  ITF_NUM_TOTAL\n};\n\n//--------------------------------------------------------------------+\n// UAC2 DESCRIPTOR TEMPLATES\n//--------------------------------------------------------------------+\n\n// Unit numbers are arbitrary selected\n#define UAC2_ENTITY_CLOCK               0x04\n// Speaker path\n#define UAC2_ENTITY_SPK_INPUT_TERMINAL  0x01\n#define UAC2_ENTITY_SPK_FEATURE_UNIT    0x02\n#define UAC2_ENTITY_SPK_OUTPUT_TERMINAL 0x03\n// Microphone path\n#define UAC2_ENTITY_MIC_INPUT_TERMINAL  0x11\n#define UAC2_ENTITY_MIC_OUTPUT_TERMINAL 0x13\n\n#define TUD_AUDIO20_HEADSET_STEREO_DESC_LEN (TUD_AUDIO20_DESC_IAD_LEN\\\n    + TUD_AUDIO20_DESC_STD_AC_LEN\\\n    + TUD_AUDIO20_DESC_CS_AC_LEN\\\n    + TUD_AUDIO20_DESC_CLK_SRC_LEN\\\n    + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(2)\\\n    + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n    + TUD_AUDIO20_DESC_STD_AC_INT_EP_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    /* Interface 1, Alternate 1 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n    /* Interface 1, Alternate 2 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n    /* Interface 2, Alternate 0 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    /* Interface 2, Alternate 1 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n    /* Interface 2, Alternate 2 */\\\n    + TUD_AUDIO20_DESC_STD_AS_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n    + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN)\n\n#define TUD_AUDIO20_HEADSET_STEREO_DESCRIPTOR(_stridx, _epout, _epin, _epint) \\\n    /* Standard Interface Association Descriptor (IAD) */\\\n    TUD_AUDIO20_DESC_IAD(/*_firstitf*/ ITF_NUM_AUDIO_CONTROL, /*_nitfs*/ ITF_NUM_TOTAL, /*_stridx*/ 0x00),\\\n    /* Standard AC Interface Descriptor(4.7.1) */\\\n    TUD_AUDIO20_DESC_STD_AC(/*_itfnum*/ ITF_NUM_AUDIO_CONTROL, /*_nEPs*/ 0x01, /*_stridx*/ _stridx),\\\n    /* Class-Specific AC Interface Header Descriptor(4.7.2) */\\\n    TUD_AUDIO20_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO20_FUNC_HEADSET, /*_totallen*/ TUD_AUDIO20_DESC_CLK_SRC_LEN+TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(2)+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN, /*_ctrl*/ AUDIO20_CS_AS_INTERFACE_CTRL_LATENCY_POS),\\\n    /* Clock Source Descriptor(4.7.2.1) */\\\n    TUD_AUDIO20_DESC_CLK_SRC(/*_clkid*/ UAC2_ENTITY_CLOCK, /*_attr*/ 3, /*_ctrl*/ 7, /*_assocTerm*/ 0x00,  /*_stridx*/ 0x00),    \\\n    /* Input Terminal Descriptor(4.7.2.4) */\\\n    TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_nchannelslogical*/ 0x02, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ 0 * (AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS), /*_stridx*/ 0x00),\\\n    /* Feature Unit Descriptor(4.7.2.8) */\\\n    TUD_AUDIO20_DESC_FEATURE_UNIT(/*_unitid*/ UAC2_ENTITY_SPK_FEATURE_UNIT, /*_srcid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_stridx*/ 0x00, /*_ctrlch0master*/ (AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS), /*_ctrlch1*/ (AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS), /*_ctrlch2*/ (AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS)),\\\n    /* Output Terminal Descriptor(4.7.2.5) */\\\n    TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ UAC2_ENTITY_SPK_OUTPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_OUT_HEADPHONES, /*_assocTerm*/ 0x00, /*_srcid*/ UAC2_ENTITY_SPK_FEATURE_UNIT, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n    /* Input Terminal Descriptor(4.7.2.4) */\\\n    TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ UAC2_ENTITY_MIC_INPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ 0x00, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_nchannelslogical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ 0 * (AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS), /*_stridx*/ 0x00),\\\n    /* Output Terminal Descriptor(4.7.2.5) */\\\n    TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_srcid*/ UAC2_ENTITY_MIC_INPUT_TERMINAL, /*_clkid*/ UAC2_ENTITY_CLOCK, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n    /* Standard AC Interrupt Endpoint Descriptor(4.8.2.1) */\\\n    TUD_AUDIO20_DESC_STD_AC_INT_EP(/*_ep*/ _epint, /*_interval*/ 0x01), \\\n    /* Standard AS Interface Descriptor(4.9.1) */\\\n    /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_SPK), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n    /* Standard AS Interface Descriptor(4.9.1) */\\\n    /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_SPK), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ _stridx),\\\n    /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n    /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n    TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_RX),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n    TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ADAPTIVE | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX), /*_interval*/ 0x01),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC, /*_lockdelay*/ 0x0001),\\\n    /* Interface 1, Alternate 2 - alternate interface for data streaming */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_SPK), /*_altset*/ 0x02, /*_nEPs*/ 0x01, /*_stridx*/ _stridx),\\\n    /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_SPK_INPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n    /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n    TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_RX),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n    TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ADAPTIVE | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX), /*_interval*/ 0x01),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC, /*_lockdelay*/ 0x0001),\\\n    /* Standard AS Interface Descriptor(4.9.1) */\\\n    /* Interface 2, Alternate 0 - default alternate setting with 0 bandwidth */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_MIC), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n    /* Standard AS Interface Descriptor(4.9.1) */\\\n    /* Interface 2, Alternate 1 - alternate interface for data streaming */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_MIC), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ _stridx),\\\n    /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n    /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n    TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_RESOLUTION_TX),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n    TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_1_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX), /*_interval*/ 0x01),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000),\\\n    /* Interface 2, Alternate 2 - alternate interface for data streaming */\\\n    TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)(ITF_NUM_AUDIO_STREAMING_MIC), /*_altset*/ 0x02, /*_nEPs*/ 0x01, /*_stridx*/ _stridx),\\\n    /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ UAC2_ENTITY_MIC_OUTPUT_TERMINAL, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n    /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n    TUD_AUDIO20_DESC_TYPE_I_FORMAT(CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_RESOLUTION_TX),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n    TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ TUD_AUDIO_EP_SIZE(TUD_OPT_HIGH_SPEED, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE, CFG_TUD_AUDIO_FUNC_1_FORMAT_2_N_BYTES_PER_SAMPLE_TX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_TX), /*_interval*/ 0x01),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n    TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000)\n\n//--------------------------------------------------------------------+\n// UAC1 DESCRIPTOR TEMPLATES\n//--------------------------------------------------------------------+\n\n// UAC1 entity IDs for speaker and microphone\n// Speaker path\n#define UAC1_ENTITY_SPK_INPUT_TERMINAL  0x01\n#define UAC1_ENTITY_SPK_FEATURE_UNIT    0x02\n#define UAC1_ENTITY_SPK_OUTPUT_TERMINAL 0x03\n// Microphone path\n#define UAC1_ENTITY_MIC_INPUT_TERMINAL  0x11\n#define UAC1_ENTITY_MIC_OUTPUT_TERMINAL 0x13\n\n#define TUD_AUDIO10_HEADSET_STEREO_DESC_LEN(_nfreqs) (\\\n    +TUD_AUDIO10_DESC_STD_AC_LEN\\\n    + TUD_AUDIO10_DESC_CS_AC_LEN(2)\\\n    + TUD_AUDIO10_DESC_INPUT_TERM_LEN\\\n    + TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(2)\\\n    + TUD_AUDIO10_DESC_OUTPUT_TERM_LEN\\\n    + TUD_AUDIO10_DESC_INPUT_TERM_LEN\\\n    + TUD_AUDIO10_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 (speaker) */\\\n    + TUD_AUDIO10_DESC_STD_AS_LEN\\\n    /* Interface 1, Alternate 1 (speaker) */\\\n    + TUD_AUDIO10_DESC_STD_AS_LEN\\\n    + TUD_AUDIO10_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO10_DESC_TYPE_I_FORMAT_LEN(_nfreqs)\\\n    + TUD_AUDIO10_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO10_DESC_CS_AS_ISO_EP_LEN\\\n    /* Interface 2, Alternate 0 (microphone) */\\\n    + TUD_AUDIO10_DESC_STD_AS_LEN\\\n    /* Interface 2, Alternate 1 (microphone) */\\\n    + TUD_AUDIO10_DESC_STD_AS_LEN\\\n    + TUD_AUDIO10_DESC_CS_AS_INT_LEN\\\n    + TUD_AUDIO10_DESC_TYPE_I_FORMAT_LEN(_nfreqs)\\\n    + TUD_AUDIO10_DESC_STD_AS_ISO_EP_LEN\\\n    + TUD_AUDIO10_DESC_CS_AS_ISO_EP_LEN)\n\n\n#define TUD_AUDIO10_HEADSET_STEREO_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample_RX, _nBitsUsedPerSample_RX, _nBytesPerSample_TX, _nBitsUsedPerSample_TX, _epout, _epoutsize, _epin, _epinsize, ...) \\\n    /* Standard AC Interface Descriptor(4.3.1) */\\\n    TUD_AUDIO10_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n    /* Class-Specific AC Interface Header Descriptor(4.3.2) */\\\n    TUD_AUDIO10_DESC_CS_AC(/*_bcdADC*/ 0x0100, /*_totallen*/ (TUD_AUDIO10_DESC_INPUT_TERM_LEN+TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(2)+TUD_AUDIO10_DESC_OUTPUT_TERM_LEN+TUD_AUDIO10_DESC_INPUT_TERM_LEN+TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(1)+TUD_AUDIO10_DESC_OUTPUT_TERM_LEN), /*_itf*/ ((_itfnum)+1), ((_itfnum)+2)),\\\n    /* Speaker Input Terminal Descriptor(4.3.2.1) */\\\n    TUD_AUDIO10_DESC_INPUT_TERM(/*_termid*/ UAC1_ENTITY_SPK_INPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ UAC1_ENTITY_MIC_OUTPUT_TERMINAL, /*_nchannels*/ 0x02, /*_channelcfg*/ AUDIO10_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_stridx*/ 0x00),\\\n    /* Speaker Feature Unit Descriptor(4.3.2.5) */\\\n    TUD_AUDIO10_DESC_FEATURE_UNIT(/*_unitid*/ UAC1_ENTITY_SPK_FEATURE_UNIT, /*_srcid*/ UAC1_ENTITY_SPK_INPUT_TERMINAL, /*_stridx*/ 0x00, /*_ctrlmaster*/ (AUDIO10_FU_CONTROL_BM_MUTE | AUDIO10_FU_CONTROL_BM_VOLUME), /*_ctrlch1*/ (AUDIO10_FU_CONTROL_BM_MUTE | AUDIO10_FU_CONTROL_BM_VOLUME), /*_ctrlch2*/ (AUDIO10_FU_CONTROL_BM_MUTE | AUDIO10_FU_CONTROL_BM_VOLUME)),\\\n    /* Speaker Output Terminal Descriptor(4.3.2.2) */\\\n    TUD_AUDIO10_DESC_OUTPUT_TERM(/*_termid*/ UAC1_ENTITY_SPK_OUTPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_OUT_HEADPHONES, /*_assocTerm*/ 0x00, /*_srcid*/ UAC1_ENTITY_SPK_FEATURE_UNIT, /*_stridx*/ 0x00),\\\n    /* Microphone Input Terminal Descriptor(4.3.2.1) */\\\n    TUD_AUDIO10_DESC_INPUT_TERM(/*_termid*/ UAC1_ENTITY_MIC_INPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ 0x00, /*_nchannels*/ 0x01, /*_channelcfg*/ AUDIO10_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_stridx*/ 0x00),\\\n    /* Microphone Output Terminal Descriptor(4.3.2.2) */\\\n    TUD_AUDIO10_DESC_OUTPUT_TERM(/*_termid*/ UAC1_ENTITY_MIC_OUTPUT_TERMINAL, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ UAC1_ENTITY_SPK_INPUT_TERMINAL, /*_srcid*/ UAC1_ENTITY_MIC_INPUT_TERMINAL, /*_stridx*/ 0x00),\\\n    /* Standard AS Interface Descriptor(4.5.1) - Speaker Interface 1, Alternate 0 */\\\n    TUD_AUDIO10_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n    /* Standard AS Interface Descriptor(4.5.1) - Speaker Interface 1, Alternate 1 */\\\n    TUD_AUDIO10_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ _stridx),\\\n    /* Class-Specific AS Interface Descriptor(4.5.2) */\\\n    TUD_AUDIO10_DESC_CS_AS_INT(/*_termid*/ UAC1_ENTITY_SPK_INPUT_TERMINAL, /*_delay*/ 0x01, /*_formattype*/ AUDIO10_DATA_FORMAT_TYPE_I_PCM),\\\n    /* Type I Format Type Descriptor(2.2.5) */\\\n    TUD_AUDIO10_DESC_TYPE_I_FORMAT(/*_nrchannels*/ 0x02, /*_subframesize*/ _nBytesPerSample_RX, /*_bitresolution*/ _nBitsUsedPerSample_RX, /*_freqs*/ __VA_ARGS__),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.6.1.1) */\\\n    TUD_AUDIO10_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ADAPTIVE), /*_maxEPsize*/ _epoutsize, /*_interval*/ 0x01, /*_syncep*/ 0x00),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.6.1.2) */\\\n    TUD_AUDIO10_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO10_CS_AS_ISO_DATA_EP_ATT_SAMPLING_FRQ, /*_lockdelayunits*/ AUDIO10_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC, /*_lockdelay*/ 0x0001),\\\n    /* Standard AS Interface Descriptor(4.5.1) - Microphone Interface 2, Alternate 0 */\\\n    TUD_AUDIO10_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+2), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n    /* Standard AS Interface Descriptor(4.5.1) - Microphone Interface 2, Alternate 1 */\\\n    TUD_AUDIO10_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+2), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ _stridx),\\\n    /* Class-Specific AS Interface Descriptor(4.5.2) */\\\n    TUD_AUDIO10_DESC_CS_AS_INT(/*_termid*/ UAC1_ENTITY_MIC_OUTPUT_TERMINAL, /*_delay*/ 0x01, /*_formattype*/ AUDIO10_DATA_FORMAT_TYPE_I_PCM),\\\n    /* Type I Format Type Descriptor(2.2.5) */\\\n    TUD_AUDIO10_DESC_TYPE_I_FORMAT(/*_nrchannels*/ 0x01, /*_subframesize*/ _nBytesPerSample_TX, /*_bitresolution*/ _nBitsUsedPerSample_TX, /*_freqs*/ __VA_ARGS__),\\\n    /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.6.1.1) */\\\n    TUD_AUDIO10_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS), /*_maxEPsize*/ _epinsize, /*_interval*/ 0x01, /*_syncep*/ 0x00),\\\n    /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.6.1.2) */\\\n    TUD_AUDIO10_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO10_CS_AS_ISO_DATA_EP_ATT_SAMPLING_FRQ, /*_lockdelayunits*/ AUDIO10_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC, /*_lockdelay*/ 0x0001)\n\n#endif\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(uac2_speaker_fb C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/skip.txt",
    "content": "mcu:LPC11UXX\nmcu:LPC13XX\nmcu:NUC121\nmcu:SAMD11\nmcu:SAME5X\nmcu:SAMG\nboard:stm32l052dap52\nfamily:broadcom_64bit\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/src/audio_debug.py",
    "content": "#!/usr/bin/env python3\n# Install python3 HID package https://pypi.org/project/hid/\n# Install python3 matplotlib package https://pypi.org/project/matplotlib/\n\nfrom ctypes import Structure, c_uint32, c_uint8, c_int8, c_int16, c_uint16\nimport signal\ntry:\n    import hid\n    import matplotlib.pyplot as plt\n    import matplotlib.animation as animation\nexcept:\n    print(\"Missing import, please try 'pip install hid matplotlib' or consult your OS's python package manager.\")\n    exit(1)\n\n# Example must be compiled with CFG_AUDIO_DEBUG=1\nVID = 0xcafe\nPID = 0x4014\n\nCFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX = 2\n\nclass audio_debug_info_t (Structure):\n    _fields_ = [(\"sample_rate\", c_uint32),\n                (\"alt_settings\", c_uint8),\n                (\"mute\", (CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1) * c_int8),\n                (\"volume\", (CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1) * c_int16),\n                (\"fifo_size\", c_uint16),\n                (\"fifo_count\", c_uint16),\n                (\"fifo_count_avg\", c_uint16)\n                ]\n\ndev = hid.Device(VID, PID)\n\nif dev:\n    signal.signal(signal.SIGINT, signal.SIG_DFL)\n    # Create figure for plotting\n    fig = plt.figure()\n    ax = fig.add_subplot(1, 1, 1)\n    fifo_avg = []\n    fifo_cnt = []\n    # This function is called periodically from FuncAnimation\n    def animate(i):\n        info = None\n        for i in range(30):\n            try:\n                str_in = dev.read(64, 50)\n                info = audio_debug_info_t.from_buffer_copy(str_in)\n\n                global fifo_avg\n                global fifo_cnt\n                fifo_avg.append(info.fifo_count_avg)\n                fifo_cnt.append(info.fifo_count)\n            except:\n                exit(1)\n        # Limit to 1000 items\n        fifo_avg = fifo_avg[-1000:]\n        fifo_cnt = fifo_cnt[-1000:]\n\n        if info is not None:\n            # Draw x and y lists\n            ax.clear()\n            ax.plot(fifo_cnt, label='FIFO count')\n            ax.plot(fifo_avg, label='FIFO average')\n            ax.legend()\n            ax.set_ylim(bottom=0, top=info.fifo_size)\n\n            # Format plot\n            ax.set_title('FIFO information')\n            ax.grid(True)\n\n            print(f'Sample rate:{info.sample_rate} | Alt settings:{info.alt_settings} | Volume:{info.volume[:]}')\n\n    ani = animation.FuncAnimation(fig, animate, interval=10, cache_frame_data=False) # type: ignore\n    plt.show(block=True)\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/src/common_types.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef _COMMON_TYPES_H_\n#define _COMMON_TYPES_H_\n\nenum\n{\n  ITF_NUM_AUDIO_CONTROL = 0,\n  ITF_NUM_AUDIO_STREAMING,\n#if CFG_AUDIO_DEBUG\n  ITF_NUM_DEBUG,\n#endif\n  ITF_NUM_TOTAL\n};\n\n#if CFG_AUDIO_DEBUG\ntypedef struct\n  {\n    uint32_t sample_rate;\n    uint8_t alt_settings;\n    uint8_t mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];\n    int16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];\n    uint16_t fifo_size;\n    uint16_t fifo_count;\n    uint16_t fifo_count_avg;\n  } audio_debug_info_t;\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"common_types.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 25 ms   : streaming data\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_STREAMING = 25,\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nenum {\n  VOLUME_CTRL_0_DB = 0,\n  VOLUME_CTRL_10_DB = 2560,\n  VOLUME_CTRL_20_DB = 5120,\n  VOLUME_CTRL_30_DB = 7680,\n  VOLUME_CTRL_40_DB = 10240,\n  VOLUME_CTRL_50_DB = 12800,\n  VOLUME_CTRL_60_DB = 15360,\n  VOLUME_CTRL_70_DB = 17920,\n  VOLUME_CTRL_80_DB = 20480,\n  VOLUME_CTRL_90_DB = 23040,\n  VOLUME_CTRL_100_DB = 25600,\n  VOLUME_CTRL_SILENCE = 0x8000,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Audio controls\n// Current states\nuint8_t mute[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];   // +1 for master channel 0\nint16_t volume[CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1];// +1 for master channel 0\nuint32_t current_sample_rate = 44100;\n\n// Buffer for speaker data\nuint16_t i2s_dummy_buffer[CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ / 2];\n\nvoid led_blinking_task(void);\nvoid audio_task(void);\n\n#if CFG_AUDIO_DEBUG\nvoid audio_debug_task(void);\nuint8_t current_alt_settings;\nvolatile uint16_t fifo_count;\nvolatile uint32_t fifo_count_avg;\n#endif\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO};\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  TU_LOG1(\"Speaker running\\r\\n\");\n\n  while (1) {\n    tud_task();// TinyUSB device task\n    led_blinking_task();\n#if CFG_AUDIO_DEBUG\n    audio_debug_task();\n#endif\n    audio_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API Implementations\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// UAC1 Helper Functions\n//--------------------------------------------------------------------+\n\nstatic bool audio10_set_req_ep(tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n\n  switch (ctrlSel) {\n    case AUDIO10_EP_CTRL_SAMPLING_FREQ:\n      if (p_request->bRequest == AUDIO10_CS_REQ_SET_CUR) {\n        // Request uses 3 bytes\n        TU_VERIFY(p_request->wLength == 3);\n\n        current_sample_rate = tu_unaligned_read32(pBuff) & 0x00FFFFFF;\n\n        TU_LOG2(\"EP set current freq: %\" PRIu32 \"\\r\\n\", current_sample_rate);\n\n        return true;\n      }\n      break;\n\n    // Unknown/Unsupported control\n    default:\n      TU_BREAKPOINT();\n      return false;\n  }\n\n  return false;\n}\n\nstatic bool audio10_get_req_ep(uint8_t rhport, tusb_control_request_t const *p_request) {\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n\n  switch (ctrlSel) {\n    case AUDIO10_EP_CTRL_SAMPLING_FREQ:\n      if (p_request->bRequest == AUDIO10_CS_REQ_GET_CUR) {\n        TU_LOG2(\"EP get current freq\\r\\n\");\n\n        uint8_t freq[3];\n        freq[0] = (uint8_t) (current_sample_rate & 0xFF);\n        freq[1] = (uint8_t) ((current_sample_rate >> 8) & 0xFF);\n        freq[2] = (uint8_t) ((current_sample_rate >> 16) & 0xFF);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, freq, sizeof(freq));\n      }\n      break;\n\n    // Unknown/Unsupported control\n    default:\n      TU_BREAKPOINT();\n      return false;\n  }\n\n  return false;\n}\n\nstatic bool audio10_set_req_entity(tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // If request is for our feature unit\n  if (entityID == UAC1_ENTITY_FEATURE_UNIT) {\n    switch (ctrlSel) {\n      case AUDIO10_FU_CTRL_MUTE:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_SET_CUR:\n            // Only 1st form is supported\n            TU_VERIFY(p_request->wLength == 1);\n\n            mute[channelNum] = pBuff[0];\n\n            TU_LOG2(\"    Set Mute: %d of channel: %u\\r\\n\", mute[channelNum], channelNum);\n            return true;\n\n          default:\n            return false; // not supported\n        }\n\n      case AUDIO10_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_SET_CUR:\n            // Only 1st form is supported\n            TU_VERIFY(p_request->wLength == 2);\n\n            volume[channelNum] = (int16_t)tu_unaligned_read16(pBuff) / 256;\n\n            TU_LOG2(\"    Set Volume: %d dB of channel: %u\\r\\n\", volume[channelNum], channelNum);\n            return true;\n\n          default:\n            return false; // not supported\n        }\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  return false;\n}\n\nstatic bool audio10_get_req_entity(uint8_t rhport, tusb_control_request_t const *p_request) {\n  uint8_t channelNum = TU_U16_LOW(p_request->wValue);\n  uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n  uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n  // If request is for our feature unit\n  if (entityID == UAC1_ENTITY_FEATURE_UNIT) {\n    switch (ctrlSel) {\n      case AUDIO10_FU_CTRL_MUTE:\n        // Audio control mute cur parameter block consists of only one byte - we thus can send it right away\n        // There does not exist a range parameter block for mute\n        TU_LOG2(\"    Get Mute of channel: %u\\r\\n\", channelNum);\n        return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &mute[channelNum], 1);\n\n      case AUDIO10_FU_CTRL_VOLUME:\n        switch (p_request->bRequest) {\n          case AUDIO10_CS_REQ_GET_CUR:\n            TU_LOG2(\"    Get Volume of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t vol = (int16_t) volume[channelNum];\n              vol = vol * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &vol, sizeof(vol));\n            }\n\n          case AUDIO10_CS_REQ_GET_MIN:\n            TU_LOG2(\"    Get Volume min of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t min = -90; // -90 dB\n              min = min * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &min, sizeof(min));\n            }\n\n          case AUDIO10_CS_REQ_GET_MAX:\n            TU_LOG2(\"    Get Volume max of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t max = 30; // +30 dB\n              max = max * 256; // convert to 1/256 dB units\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &max, sizeof(max));\n            }\n\n          case AUDIO10_CS_REQ_GET_RES:\n            TU_LOG2(\"    Get Volume res of channel: %u\\r\\n\", channelNum);\n            {\n              int16_t res = 128; // 0.5 dB\n              return tud_audio_buffer_and_schedule_control_xfer(rhport, p_request, &res, sizeof(res));\n            }\n            // Unknown/Unsupported control\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n        break;\n\n        // Unknown/Unsupported control\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// UAC2 Helper Functions\n//--------------------------------------------------------------------+\n\n#if TUD_OPT_HIGH_SPEED\n// List of supported sample rates for UAC2\nconst uint32_t sample_rates[] = {44100, 48000, 88200, 96000};\n\n#define N_SAMPLE_RATES TU_ARRAY_SIZE(sample_rates)\n\nstatic bool audio20_clock_get_request(uint8_t rhport, audio20_control_request_t const *request) {\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_CLOCK);\n\n  if (request->bControlSelector == AUDIO20_CS_CTRL_SAM_FREQ) {\n    if (request->bRequest == AUDIO20_CS_REQ_CUR) {\n      TU_LOG1(\"Clock get current freq %\" PRIu32 \"\\r\\n\", current_sample_rate);\n\n      audio20_control_cur_4_t curf = {(int32_t) tu_htole32(current_sample_rate)};\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &curf, sizeof(curf));\n    } else if (request->bRequest == AUDIO20_CS_REQ_RANGE) {\n      audio20_control_range_4_n_t(N_SAMPLE_RATES) rangef =\n          {\n              .wNumSubRanges = tu_htole16(N_SAMPLE_RATES)};\n      TU_LOG1(\"Clock get %d freq ranges\\r\\n\", N_SAMPLE_RATES);\n      for (uint8_t i = 0; i < N_SAMPLE_RATES; i++) {\n        rangef.subrange[i].bMin = (int32_t) sample_rates[i];\n        rangef.subrange[i].bMax = (int32_t) sample_rates[i];\n        rangef.subrange[i].bRes = 0;\n        TU_LOG1(\"Range %d (%d, %d, %d)\\r\\n\", i, (int) rangef.subrange[i].bMin, (int) rangef.subrange[i].bMax, (int) rangef.subrange[i].bRes);\n      }\n\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &rangef, sizeof(rangef));\n    }\n  } else if (request->bControlSelector == AUDIO20_CS_CTRL_CLK_VALID &&\n             request->bRequest == AUDIO20_CS_REQ_CUR) {\n    audio20_control_cur_1_t cur_valid = {.bCur = 1};\n    TU_LOG1(\"Clock get is valid %u\\r\\n\", cur_valid.bCur);\n    return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &cur_valid, sizeof(cur_valid));\n  }\n  TU_LOG1(\"Clock get request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n  return false;\n}\n\nstatic bool audio20_clock_set_request(audio20_control_request_t const *request, uint8_t const *buf) {\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_CLOCK);\n  TU_VERIFY(request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  if (request->bControlSelector == AUDIO20_CS_CTRL_SAM_FREQ) {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_4_t));\n\n    current_sample_rate = (uint32_t) ((audio20_control_cur_4_t const *) buf)->bCur;\n\n    TU_LOG1(\"Clock set current freq: %\" PRIu32 \"\\r\\n\", current_sample_rate);\n\n    return true;\n  } else {\n    TU_LOG1(\"Clock set request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n    return false;\n  }\n}\n\nstatic bool audio20_feature_unit_get_request(uint8_t rhport, audio20_control_request_t const *request) {\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_FEATURE_UNIT);\n\n  if (request->bControlSelector == AUDIO20_FU_CTRL_MUTE && request->bRequest == AUDIO20_CS_REQ_CUR) {\n    audio20_control_cur_1_t mute1 = {.bCur = mute[request->bChannelNumber]};\n    TU_LOG1(\"Get channel %u mute %d\\r\\n\", request->bChannelNumber, mute1.bCur);\n    return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &mute1, sizeof(mute1));\n  } else if (request->bControlSelector == AUDIO20_FU_CTRL_VOLUME) {\n    if (request->bRequest == AUDIO20_CS_REQ_RANGE) {\n      audio20_control_range_2_n_t(1) range_vol = {\n          .wNumSubRanges = tu_htole16(1),\n          .subrange[0] = {.bMin = tu_htole16(-VOLUME_CTRL_50_DB), tu_htole16(VOLUME_CTRL_0_DB), tu_htole16(256)}};\n      TU_LOG1(\"Get channel %u volume range (%d, %d, %u) dB\\r\\n\", request->bChannelNumber,\n              range_vol.subrange[0].bMin / 256, range_vol.subrange[0].bMax / 256, range_vol.subrange[0].bRes / 256);\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &range_vol, sizeof(range_vol));\n    } else if (request->bRequest == AUDIO20_CS_REQ_CUR) {\n      audio20_control_cur_2_t cur_vol = {.bCur = tu_htole16(volume[request->bChannelNumber])};\n      TU_LOG1(\"Get channel %u volume %d dB\\r\\n\", request->bChannelNumber, cur_vol.bCur / 256);\n      return tud_audio_buffer_and_schedule_control_xfer(rhport, (tusb_control_request_t const *) request, &cur_vol, sizeof(cur_vol));\n    }\n  }\n  TU_LOG1(\"Feature unit get request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n\n  return false;\n}\n\nstatic bool audio20_feature_unit_set_request(audio20_control_request_t const *request, uint8_t const *buf) {\n  TU_ASSERT(request->bEntityID == UAC2_ENTITY_FEATURE_UNIT);\n  TU_VERIFY(request->bRequest == AUDIO20_CS_REQ_CUR);\n\n  if (request->bControlSelector == AUDIO20_FU_CTRL_MUTE) {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_1_t));\n\n    mute[request->bChannelNumber] = ((audio20_control_cur_1_t const *) buf)->bCur;\n\n    TU_LOG1(\"Set channel %d Mute: %d\\r\\n\", request->bChannelNumber, mute[request->bChannelNumber]);\n\n    return true;\n  } else if (request->bControlSelector == AUDIO20_FU_CTRL_VOLUME) {\n    TU_VERIFY(request->wLength == sizeof(audio20_control_cur_2_t));\n\n    volume[request->bChannelNumber] = ((audio20_control_cur_2_t const *) buf)->bCur;\n\n    TU_LOG1(\"Set channel %d volume: %d dB\\r\\n\", request->bChannelNumber, volume[request->bChannelNumber] / 256);\n\n    return true;\n  } else {\n    TU_LOG1(\"Feature unit set request not supported, entity = %u, selector = %u, request = %u\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n    return false;\n  }\n}\n\nstatic bool audio20_get_req_entity(uint8_t rhport, tusb_control_request_t const *p_request) {\n  audio20_control_request_t const *request = (audio20_control_request_t const *) p_request;\n\n  if (request->bEntityID == UAC2_ENTITY_CLOCK)\n    return audio20_clock_get_request(rhport, request);\n  if (request->bEntityID == UAC2_ENTITY_FEATURE_UNIT)\n    return audio20_feature_unit_get_request(rhport, request);\n  else {\n    TU_LOG1(\"Get request not handled, entity = %d, selector = %d, request = %d\\r\\n\",\n            request->bEntityID, request->bControlSelector, request->bRequest);\n  }\n  return false;\n}\n\nstatic bool audio20_set_req_entity(tusb_control_request_t const *p_request, uint8_t *buf) {\n  audio20_control_request_t const *request = (audio20_control_request_t const *) p_request;\n\n  if (request->bEntityID == UAC2_ENTITY_FEATURE_UNIT)\n    return audio20_feature_unit_set_request(request, buf);\n  if (request->bEntityID == UAC2_ENTITY_CLOCK)\n    return audio20_clock_set_request(request, buf);\n  TU_LOG1(\"Set request not handled, entity = %d, selector = %d, request = %d\\r\\n\",\n          request->bEntityID, request->bControlSelector, request->bRequest);\n\n  return false;\n}\n\n#endif // TUD_OPT_HIGH_SPEED\n\n//--------------------------------------------------------------------+\n// Main Callback Functions\n//--------------------------------------------------------------------+\n\nbool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  uint8_t const itf = tu_u16_low(tu_le16toh(p_request->wIndex));\n  uint8_t const alt = tu_u16_low(tu_le16toh(p_request->wValue));\n\n  TU_LOG2(\"Set interface %d alt %d\\r\\n\", itf, alt);\n  if (ITF_NUM_AUDIO_STREAMING == itf && alt != 0)\n    blink_interval_ms = BLINK_STREAMING;\n\n#if CFG_AUDIO_DEBUG\n  current_alt_settings = alt;\n#endif\n\n  return true;\n}\n\n// Invoked when audio class specific set request received for an EP\nbool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) pBuff;\n\n  if (tud_audio_version() == 1) {\n    return audio10_set_req_ep(p_request, pBuff);\n  } else if (tud_audio_version() == 2) {\n    // We do not support any requests here\n  }\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific get request received for an EP\nbool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_get_req_ep(rhport, p_request);\n  } else if (tud_audio_version() == 2) {\n    // We do not support any requests here\n  }\n\n  return false;// Yet not implemented\n}\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *buf) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_set_req_entity(p_request, buf);\n#if TUD_OPT_HIGH_SPEED\n  } else if (tud_audio_version() == 2) {\n    return audio20_set_req_entity(p_request, buf);\n#endif\n  }\n\n  return false;\n}\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  if (tud_audio_version() == 1) {\n    return audio10_get_req_entity(rhport, p_request);\n#if TUD_OPT_HIGH_SPEED\n  } else if (tud_audio_version() == 2) {\n    return audio20_get_req_entity(rhport, p_request);\n#endif\n  }\n\n  return false;\n}\n\nbool tud_audio_set_itf_close_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  uint8_t const itf = tu_u16_low(tu_le16toh(p_request->wIndex));\n  uint8_t const alt = tu_u16_low(tu_le16toh(p_request->wValue));\n\n  if (ITF_NUM_AUDIO_STREAMING == itf && alt == 0) {\n    blink_interval_ms = BLINK_MOUNTED;\n  }\n\n  return true;\n}\n\nvoid tud_audio_feedback_params_cb(uint8_t func_id, uint8_t alt_itf, audio_feedback_params_t *feedback_param) {\n  (void) func_id;\n  (void) alt_itf;\n  // Set feedback method to fifo counting\n  feedback_param->method = AUDIO_FEEDBACK_METHOD_FIFO_COUNT;\n  feedback_param->sample_freq = current_sample_rate;\n\n  // About FIFO threshold:\n  //\n  // By default the threshold is set to half FIFO size, which works well in most cases,\n  // you can reduce the threshold to have less latency.\n  //\n  // For example, here we could set the threshold to 2 ms of audio data, as audio_task() read audio data every 1 ms,\n  // having 2 ms threshold allows some margin and a quick response:\n  //\n  // feedback_param->fifo_count.fifo_threshold =\n  //    current_sample_rate * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX / 1000 * 2;\n}\n\n#if CFG_AUDIO_DEBUG\nbool tud_audio_rx_done_isr(uint8_t rhport, uint16_t n_bytes_received, uint8_t func_id, uint8_t ep_out, uint8_t cur_alt_setting) {\n  (void) rhport;\n  (void) n_bytes_received;\n  (void) func_id;\n  (void) ep_out;\n  (void) cur_alt_setting;\n\n  fifo_count = tud_audio_available();\n  // Same averaging method used in UAC2 class\n  const uint32_t ff_count32 = (uint32_t) fifo_count << 16;\n  fifo_count_avg = (uint32_t) (((uint64_t) fifo_count_avg * 63 + ff_count32) >> 6);\n\n  return true;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// AUDIO Task\n//--------------------------------------------------------------------+\n\n// This task simulates an audio transmit callback, one frame is sent every 1ms.\n// In a real application, this would be replaced with actual I2S transmit callback.\nvoid audio_task(void) {\n  static uint32_t start_ms = 0;\n  uint32_t curr_ms = tusb_time_millis_api();\n  if (start_ms == curr_ms) return;// not enough time\n  start_ms = curr_ms;\n\n  uint16_t length = (uint16_t) (current_sample_rate / 1000 * CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX);\n\n  if (current_sample_rate == 44100 && (curr_ms % 10 == 0)) {\n    // Take one more sample every 10 cycles, to have a average reading speed of 44.1\n    // This correction is not needed in real world cases\n    length += CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX;\n  } else if (current_sample_rate == 88200 && (curr_ms % 5 == 0)) {\n    // Take one more sample every 5 cycles, to have a average reading speed of 88.2\n    // This correction is not needed in real world cases\n    length += CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX * CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX;\n  }\n\n  tud_audio_read(i2s_dummy_buffer, length);\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) return;\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;\n}\n\n#if CFG_AUDIO_DEBUG\n//--------------------------------------------------------------------+\n// HID interface for audio debug\n//--------------------------------------------------------------------+\n// Every 1ms, we will sent 1 debug information report\nvoid audio_debug_task(void) {\n  static uint32_t start_ms = 0;\n  uint32_t curr_ms = tusb_time_millis_api();\n  if (start_ms == curr_ms) return;// not enough time\n  start_ms = curr_ms;\n\n  audio_debug_info_t debug_info;\n  debug_info.sample_rate = current_sample_rate;\n  debug_info.alt_settings = current_alt_settings;\n  debug_info.fifo_size = CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ;\n  debug_info.fifo_count = fifo_count;\n  debug_info.fifo_count_avg = (uint16_t) (fifo_count_avg >> 16);\n  for (int i = 0; i < CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX + 1; i++) {\n    debug_info.mute[i] = mute[i];\n    debug_info.volume[i] = volume[i];\n  }\n\n  if (tud_hid_ready())\n    tud_hid_report(0, &debug_info, sizeof(debug_info));\n}\n\n// Invoked when received GET_REPORT control request\n// Unused here\nuint16_t tud_hid_get_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t *buffer, uint16_t reqlen) {\n  // TODO not Implemented\n  (void) itf;\n  (void) report_id;\n  (void) report_type;\n  (void) buffer;\n  (void) reqlen;\n\n  return 0;\n}\n\n// Invoked when received SET_REPORT control request or\n// Unused here\nvoid tud_hid_set_report_cb(uint8_t itf, uint8_t report_id, hid_report_type_t report_type, uint8_t const *buffer, uint16_t bufsize) {\n  // This example doesn't use multiple report and report ID\n  (void) itf;\n  (void) report_id;\n  (void) report_type;\n  (void) buffer;\n  (void) bufsize;\n}\n\n#endif\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n// It's recommended to disable debug unless for control requests debugging,\n// as the extra time needed will impact data stream !\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n// Expose audio class debug information via HID interface\n#ifndef CFG_AUDIO_DEBUG\n#define CFG_AUDIO_DEBUG           1\n#endif\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n#define CFG_TUD_HID_EP_BUFSIZE    64\n\n//------------- CLASS -------------//\n#define CFG_TUD_AUDIO             1\n\n#if CFG_AUDIO_DEBUG\n#define CFG_TUD_HID               1\n#else\n#define CFG_TUD_HID               0\n#endif\n\n#define CFG_TUD_CDC               0\n#define CFG_TUD_MSC               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            0\n\n//--------------------------------------------------------------------\n// AUDIO CLASS DRIVER CONFIGURATION\n//--------------------------------------------------------------------\n\n#define CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX              2\n\n// 16bit data in 16bit slots\n#define CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX      2\n#define CFG_TUD_AUDIO_FUNC_1_RESOLUTION_RX              16\n\n// UAC1 Full-Speed endpoint size\n#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE_FS     48000\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_FS           TUD_AUDIO_EP_SIZE(false, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE_FS, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX)\n// UAC2 High-Speed endpoint size\n#define CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE_HS     96000\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_HS           TUD_AUDIO_EP_SIZE(true, CFG_TUD_AUDIO_FUNC_1_MAX_SAMPLE_RATE_HS, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_N_CHANNELS_RX)\n\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX          TU_MAX(CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_FS, CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_HS)\n\n// AUDIO_FEEDBACK_METHOD_FIFO_COUNT needs buffer size >= 4* EP size to work correctly\n// Example read FIFO every 1ms (8 HS frames), so buffer size should be 8 times larger for HS device\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ       TU_MAX(4 * CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_FS, 32 * CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_HS)\n\n// Enable OUT EP\n#define CFG_TUD_AUDIO_ENABLE_EP_OUT                 1\n\n// Enable feedback EP\n#define CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP            1\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n#include \"common_types.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VENDOR, 5) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for Audio\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n\n#if CFG_AUDIO_DEBUG\n//--------------------------------------------------------------------+\n// HID Report Descriptor\n//--------------------------------------------------------------------+\n\nuint8_t const desc_hid_report[] = {\n  HID_USAGE_PAGE_N ( HID_USAGE_PAGE_VENDOR, 2   ),\\\n  HID_USAGE        ( 0x01                       ),\\\n  HID_COLLECTION   ( HID_COLLECTION_APPLICATION ),\\\n  HID_USAGE       ( 0x02                                   ),\\\n  HID_LOGICAL_MIN ( 0x00                                   ),\\\n  HID_LOGICAL_MAX_N ( 0xff, 2                              ),\\\n  HID_REPORT_SIZE ( 8                                      ),\\\n  HID_REPORT_COUNT( sizeof(audio_debug_info_t)             ),\\\n  HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\\\n  HID_COLLECTION_END\n};\n\n// Invoked when received GET HID REPORT DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_hid_descriptor_report_cb(uint8_t itf) {\n  (void) itf;\n  return desc_hid_report;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_AUDIO       0x03\n  #define EPNUM_AUDIO_FB    0x03\n  #define EPNUM_DEBUG       0x04\n\n#elif TU_CHECK_MCU(OPT_MCU_NRF5X)\n  // nRF5x ISO can only be endpoint 8\n  #define EPNUM_AUDIO       0x08\n  #define EPNUM_AUDIO_FB    0x08\n  #define EPNUM_DEBUG       0x01\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_AUDIO       0x02\n  #define EPNUM_AUDIO_FB    0x01\n  #define EPNUM_DEBUG       0x03\n\n#else\n  #define EPNUM_AUDIO       0x01\n  #define EPNUM_AUDIO_FB    0x01\n  #define EPNUM_DEBUG       0x02\n#endif\n\n#if CFG_AUDIO_DEBUG\n  #define CONFIG_UAC1_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + TUD_AUDIO10_SPEAKER_STEREO_FB_DESC_LEN(2) + TUD_HID_DESC_LEN)\n#else\n  #define CONFIG_UAC1_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + TUD_AUDIO10_SPEAKER_STEREO_FB_DESC_LEN(2))\n#endif\n\nuint8_t const desc_uac1_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_UAC1_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, byte per sample, bit per sample, EP Out, EP size, EP feedback, sample rates (44.1kHz, 48kHz)\n  TUD_AUDIO10_SPEAKER_STEREO_FB_DESCRIPTOR(ITF_NUM_AUDIO_CONTROL, 5, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_RESOLUTION_RX, EPNUM_AUDIO, CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_FS, EPNUM_AUDIO_FB | 0x80, 44100, 48000),\n\n#if CFG_AUDIO_DEBUG\n  // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval\n  TUD_HID_DESCRIPTOR(ITF_NUM_DEBUG, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_DEBUG | 0x80, CFG_TUD_HID_EP_BUFSIZE, 7)\n#endif\n};\n\nTU_VERIFY_STATIC(sizeof(desc_uac1_configuration) == CONFIG_UAC1_TOTAL_LEN, \"Incorrect size\");\n\n#if TUD_OPT_HIGH_SPEED\n\n#if CFG_AUDIO_DEBUG\n  #define CONFIG_UAC2_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + TUD_AUDIO20_SPEAKER_STEREO_FB_DESC_LEN + TUD_HID_DESC_LEN)\n#else\n  #define CONFIG_UAC2_TOTAL_LEN    \t(TUD_CONFIG_DESC_LEN + TUD_AUDIO20_SPEAKER_STEREO_FB_DESC_LEN)\n#endif\n\nuint8_t const desc_uac2_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_UAC2_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, byte per sample, bit per sample, EP Out, EP size, EP feedback, feedback EP size,\n  TUD_AUDIO20_SPEAKER_STEREO_FB_DESCRIPTOR(ITF_NUM_AUDIO_CONTROL, 4, CFG_TUD_AUDIO_FUNC_1_N_BYTES_PER_SAMPLE_RX, CFG_TUD_AUDIO_FUNC_1_RESOLUTION_RX, EPNUM_AUDIO, CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_HS, EPNUM_AUDIO_FB | 0x80, 4),\n\n#if CFG_AUDIO_DEBUG\n  // Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval\n  TUD_HID_DESCRIPTOR(ITF_NUM_DEBUG, 0, HID_ITF_PROTOCOL_NONE, sizeof(desc_hid_report), EPNUM_DEBUG | 0x80, CFG_TUD_HID_EP_BUFSIZE, 7)\n#endif\n};\n\nTU_VERIFY_STATIC(sizeof(desc_uac2_configuration) == CONFIG_UAC2_TOTAL_LEN, \"Incorrect size\");\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\ntusb_desc_device_qualifier_t const desc_device_qualifier = {\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = 0x0200,\n\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index;// for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_uac1_configuration : desc_uac2_configuration;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  if(tud_speed_get() == TUSB_SPEED_FULL) {\n    return desc_uac1_configuration;\n  } else {\n    return desc_uac2_configuration;\n  }\n#else\n    return desc_uac1_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 },  // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                      // 1: Manufacturer\n  \"TinyUSB Speaker\",              // 2: Product\n  NULL,                           // 3: Serials will use unique ID if possible\n  \"UAC2 Speaker\",                 // 4: Audio Interface\n  \"UAC1 Speaker\",                 // 5: UAC1 Audio Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/uac2_speaker_fb/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\n//--------------------------------------------------------------------+\n// UAC2 DESCRIPTOR TEMPLATES\n//--------------------------------------------------------------------+\n\n// Defined in TUD_AUDIO20_SPEAKER_STEREO_FB_DESCRIPTOR\n#define UAC2_ENTITY_CLOCK               0x04\n#define UAC2_ENTITY_INPUT_TERMINAL      0x01\n#define UAC2_ENTITY_FEATURE_UNIT        0x02\n#define UAC2_ENTITY_OUTPUT_TERMINAL     0x03\n\n#define TUD_AUDIO20_SPEAKER_STEREO_FB_DESC_LEN (TUD_AUDIO20_DESC_IAD_LEN\\\n  + TUD_AUDIO20_DESC_STD_AC_LEN\\\n  + TUD_AUDIO20_DESC_CS_AC_LEN\\\n  + TUD_AUDIO20_DESC_CLK_SRC_LEN\\\n  + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n  + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n  + TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(2)\\\n  + TUD_AUDIO20_DESC_STD_AS_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_LEN\\\n  + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n  + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n  + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_ISO_FB_EP_LEN)\n\n#define TUD_AUDIO20_SPEAKER_STEREO_FB_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epout, _epoutsize, _epfb, _epfbsize) \\\n  /* Standard Interface Association Descriptor (IAD) */\\\n  TUD_AUDIO20_DESC_IAD(/*_firstitf*/ _itfnum, /*_nitfs*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Standard AC Interface Descriptor(4.7.1) */\\\n  TUD_AUDIO20_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n  /* Class-Specific AC Interface Header Descriptor(4.7.2) */\\\n  TUD_AUDIO20_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO20_FUNC_DESKTOP_SPEAKER, /*_totallen*/ TUD_AUDIO20_DESC_CLK_SRC_LEN+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN+TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(2), /*_ctrl*/ AUDIO20_CS_AS_INTERFACE_CTRL_LATENCY_POS),\\\n  /* Clock Source Descriptor(4.7.2.1) */\\\n  TUD_AUDIO20_DESC_CLK_SRC(/*_clkid*/ 0x04, /*_attr*/ AUDIO20_CLOCK_SOURCE_ATT_INT_PRO_CLK, /*_ctrl*/ (AUDIO20_CTRL_RW << AUDIO20_CLOCK_SOURCE_CTRL_CLK_FRQ_POS), /*_assocTerm*/ 0x01,  /*_stridx*/ 0x00),\\\n  /* Input Terminal Descriptor(4.7.2.4) */\\\n  TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x00, /*_clkid*/ 0x04, /*_nchannelslogical*/ 0x02, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ 0 * (AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS), /*_stridx*/ 0x00),\\\n  /* Output Terminal Descriptor(4.7.2.5) */\\\n  TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_OUT_DESKTOP_SPEAKER, /*_assocTerm*/ 0x01, /*_srcid*/ 0x02, /*_clkid*/ 0x04, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n  /* Feature Unit Descriptor(4.7.2.8) */\\\n  TUD_AUDIO20_DESC_FEATURE_UNIT(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_stridx*/ 0x00, /*_ctrlch0master*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch1*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch2*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum) + 1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum) + 1), /*_altset*/ 0x01, /*_nEPs*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ 0x01, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x02, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n  /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n  TUD_AUDIO20_DESC_TYPE_I_FORMAT(_nBytesPerSample, _nBitsUsedPerSample),\\\n  /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n  TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ _epoutsize, /*_interval*/ 0x01),\\\n  /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC, /*_lockdelay*/ 0x0001),\\\n  /* Standard AS Isochronous Feedback Endpoint Descriptor(4.10.2.1) */\\\n  TUD_AUDIO20_DESC_STD_AS_ISO_FB_EP(/*_ep*/ _epfb, /*_epsize*/ _epfbsize, /*_interval*/ TUD_OPT_HIGH_SPEED ? 4 : 1)\n\n//--------------------------------------------------------------------+\n// UAC1 DESCRIPTOR TEMPLATES\n//--------------------------------------------------------------------+\n\n// Defined in TUD_AUDIO10_SPEAKER_STEREO_FB_DESCRIPTOR\n#define UAC1_ENTITY_INPUT_TERMINAL      0x01\n#define UAC1_ENTITY_FEATURE_UNIT        0x02\n#define UAC1_ENTITY_OUTPUT_TERMINAL     0x03\n\n#define TUD_AUDIO10_SPEAKER_STEREO_FB_DESC_LEN(_nfreqs) (\\\n  + TUD_AUDIO10_DESC_STD_AC_LEN\\\n  + TUD_AUDIO10_DESC_CS_AC_LEN(1)\\\n  + TUD_AUDIO10_DESC_INPUT_TERM_LEN\\\n  + TUD_AUDIO10_DESC_OUTPUT_TERM_LEN\\\n  + TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(2)\\\n  + TUD_AUDIO10_DESC_STD_AS_LEN\\\n  + TUD_AUDIO10_DESC_STD_AS_LEN\\\n  + TUD_AUDIO10_DESC_CS_AS_INT_LEN\\\n  + TUD_AUDIO10_DESC_TYPE_I_FORMAT_LEN(_nfreqs)\\\n  + TUD_AUDIO10_DESC_STD_AS_ISO_EP_LEN\\\n  + TUD_AUDIO10_DESC_CS_AS_ISO_EP_LEN\\\n  + TUD_AUDIO10_DESC_STD_AS_ISO_SYNC_EP_LEN)\n\n#define TUD_AUDIO10_SPEAKER_STEREO_FB_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epout, _epoutsize, _epfb, ...) \\\n  /* Standard AC Interface Descriptor(4.3.1) */\\\n  TUD_AUDIO10_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n  /* Class-Specific AC Interface Header Descriptor(4.3.2) */\\\n  TUD_AUDIO10_DESC_CS_AC(/*_bcdADC*/ 0x0100, /*_totallen*/ (TUD_AUDIO10_DESC_INPUT_TERM_LEN+TUD_AUDIO10_DESC_OUTPUT_TERM_LEN+TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(2)), /*_itf*/ ((_itfnum)+1)),\\\n  /* Input Terminal Descriptor(4.3.2.1) */\\\n  TUD_AUDIO10_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x00, /*_nchannels*/ 0x02, /*_channelcfg*/ AUDIO10_CHANNEL_CONFIG_LEFT_FRONT | AUDIO10_CHANNEL_CONFIG_RIGHT_FRONT, /*_idxchannelnames*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Output Terminal Descriptor(4.3.2.2) */\\\n  TUD_AUDIO10_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_OUT_DESKTOP_SPEAKER, /*_assocTerm*/ 0x00, /*_srcid*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Feature Unit Descriptor(4.3.2.5) */\\\n  TUD_AUDIO10_DESC_FEATURE_UNIT(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_stridx*/ 0x00, /*_ctrlmaster*/ (AUDIO10_FU_CONTROL_BM_MUTE | AUDIO10_FU_CONTROL_BM_VOLUME), /*_ctrlch1*/ (AUDIO10_FU_CONTROL_BM_MUTE | AUDIO10_FU_CONTROL_BM_VOLUME), /*_ctrlch2*/ (AUDIO10_FU_CONTROL_BM_MUTE | AUDIO10_FU_CONTROL_BM_VOLUME)),\\\n  /* Standard AS Interface Descriptor(4.5.1) */\\\n  /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n  TUD_AUDIO10_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Standard AS Interface Descriptor(4.5.1) */\\\n  /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n  TUD_AUDIO10_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x01, /*_nEPs*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Class-Specific AS Interface Descriptor(4.5.2) */\\\n  TUD_AUDIO10_DESC_CS_AS_INT(/*_termid*/ 0x01, /*_delay*/ 0x00, /*_formattype*/ AUDIO10_DATA_FORMAT_TYPE_I_PCM),\\\n  /* Type I Format Type Descriptor(2.2.5) */\\\n  TUD_AUDIO10_DESC_TYPE_I_FORMAT(/*_nrchannels*/ 0x02, /*_subframesize*/ _nBytesPerSample, /*_bitresolution*/ _nBitsUsedPerSample, /*_freqs*/ __VA_ARGS__),\\\n  /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.6.1.1) */\\\n  TUD_AUDIO10_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS), /*_maxEPsize*/ _epoutsize, /*_interval*/ 0x01, /*_sync_ep*/ _epfb),\\\n  /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.6.1.2) */\\\n  TUD_AUDIO10_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO10_CS_AS_ISO_DATA_EP_ATT_SAMPLING_FRQ, /*_lockdelayunits*/ AUDIO10_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000),\\\n  /* Standard AS Isochronous Synch Endpoint Descriptor (4.6.2.1) */\\\n  TUD_AUDIO10_DESC_STD_AS_ISO_SYNC_EP(/*_ep*/ _epfb, /*_bRefresh*/ 0)\n\n//---------------------------------------------------------------------------+\n//          UAC1 Isochronous Synch Endpoint bRefresh Workaround\n//\n// bRefresh value is set to 0, while UAC1 spec requires it to be between\n// 1 (2 ms) and 9 (512 ms)\n//\n// This value has been tested to work with Windows, macOS and Linux.\n//\n// Rationale:\n// Some USB device controllers (e.g. Synopsys DWC2) require a known transfer\n// interval to manually schedule isochronous IN transfers. For data isochronous\n// endpoints, the bInterval field in the endpoint descriptor is used. However,\n// for synch endpoint it's unclear which field the host uses to determine the\n// transfer interval. Windows and macOS use bRefresh, while Linux uses bInterval.\n//\n// Since bInterval is fixed to 1, if bRefresh is set to 2 then Windows and macOS\n// will schedule the feedback transfer every 4 ms, but Linux will schedule it\n// every 1 ms. DWC2 controller cannot handle this discrepancy without knwowing\n// the actual interval, therefore we set bRefresh to 0 to let the transfer\n// execute every 1 ms, which is the same as bInterval.\n//\n// Rant:\n// WTF USB-IF? Why have two fields that mean the same thing? Why not just use\n// bInterval for both data and synch endpoints? Why is bRefresh even necessary?\n//\n// Note:\n// For the moment DWC2 driver doesn't have proper support for bInterval > 1\n// for isochronous IN endpoints. The implementation would be complex and CPU\n// intensive (cfr.\n// https://github.com/torvalds/linux/blob/master/drivers/usb/dwc2/gadget.c)\n// It MAY work in some cases if you are lucky, but it's not guaranteed.\n//---------------------------------------------------------------------------+\n\n#endif\n"
  },
  {
    "path": "examples/device/usbtmc/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(usbtmc C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usbtmc_app.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/usbtmc/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/usbtmc/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/usbtmc/skip.txt",
    "content": "mcu:BCM2835\nfamily:espressif\n"
  },
  {
    "path": "examples/device/usbtmc/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"main.h\"\n#include \"usbtmc_app.h\"\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 0 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 0,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void)\n{\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1)\n  {\n    tud_task(); // tinyusb device task\n    led_blinking_task();\n    usbtmc_app_task_iter();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void)\n{\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void)\n{\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en)\n{\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void)\n{\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK + Indicator pulse\n//--------------------------------------------------------------------+\n\n\nvolatile uint8_t doPulse = false;\n// called from USB context\nvoid led_indicator_pulse(void) {\n\tdoPulse = true;\n}\n\nvoid led_blinking_task(void)\n{\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n  if(blink_interval_ms == BLINK_MOUNTED) // Mounted\n  {\n    if(doPulse)\n    {\n      led_state = true;\n      board_led_write(true);\n      start_ms = tusb_time_millis_api();\n      doPulse = false;\n    }\n    else if (led_state == true)\n    {\n      if ( tusb_time_millis_api() - start_ms < 750) //Spec says blink must be between 500 and 1000 ms.\n      {\n        return; // not enough time\n      }\n      led_state = false;\n      board_led_write(false);\n    }\n  }\n  else\n  {\n    // Blink every interval ms\n    if ( tusb_time_millis_api() - start_ms < blink_interval_ms) return; // not enough time\n    start_ms += blink_interval_ms;\n\n    board_led_write(led_state);\n    led_state = 1 - led_state; // toggle\n  }\n}\n"
  },
  {
    "path": "examples/device/usbtmc/src/main.h",
    "content": "#ifndef MAIN_H\n#define MAIN_H\nvoid led_indicator_pulse(void);\n\n#endif\n"
  },
  {
    "path": "examples/device/usbtmc/src/tusb_config.h",
    "content": "/*\n * tusb_config.h\n *\n *  Created on: Sep 5, 2019\n *      Author: nconrad\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n\n#define CFG_TUD_USBTMC                1\n#define CFG_TUD_USBTMC_ENABLE_INT_EP  1\n#define CFG_TUD_USBTMC_ENABLE_488     1\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/usbtmc/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"class/usbtmc/usbtmc.h\"\n#include \"class/usbtmc/usbtmc_device.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n#define USB_VID   0xcafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n    .bDeviceClass       = TUSB_CLASS_UNSPECIFIED,\n    .bDeviceSubClass    = 0x00,\n    .bDeviceProtocol    = 0x00,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\n#if defined(CFG_TUD_USBTMC)\n\n#  define TUD_USBTMC_DESC_MAIN(_itfnum,_bNumEndpoints, _bulkMaxPacketLength) \\\n     TUD_USBTMC_IF_DESCRIPTOR(_itfnum, _bNumEndpoints,  /*_stridx = */ 4u, TUD_USBTMC_PROTOCOL_USB488), \\\n     TUD_USBTMC_BULK_DESCRIPTORS(/* OUT = */0x01, /* IN = */ 0x81, /* packet size = */_bulkMaxPacketLength)\n\n#if CFG_TUD_USBTMC_ENABLE_INT_EP\n// USBTMC Interrupt xfer always has length of 2, but we use epMaxSize=8 for\n//  compatibility with mcus that only allow 8, 16, 32 or 64 for FS endpoints\n#  define TUD_USBTMC_DESC(_itfnum, _bulkMaxPacketLength) \\\n     TUD_USBTMC_DESC_MAIN(_itfnum, /* _epCount = */ 3, _bulkMaxPacketLength), \\\n     TUD_USBTMC_INT_DESCRIPTOR(/* INT ep # */ 0x82, /* epMaxSize = */ 8, /* bInterval = */16u )\n#  define TUD_USBTMC_DESC_LEN (TUD_USBTMC_IF_DESCRIPTOR_LEN + TUD_USBTMC_BULK_DESCRIPTORS_LEN + TUD_USBTMC_INT_DESCRIPTOR_LEN)\n\n#else\n\n#  define TUD_USBTMC_DESC(_itfnum, _bulkMaxPacketLength) \\\n     TUD_USBTMC_DESC_MAIN(_itfnum, /* _epCount = */ 2u, _bulkMaxPacketLength)\n#  define TUD_USBTMC_DESC_LEN (TUD_USBTMC_IF_DESCRIPTOR_LEN + TUD_USBTMC_BULK_DESCRIPTORS_LEN)\n\n#endif /* CFG_TUD_USBTMC_ENABLE_INT_EP */\n\n#else\n#  define USBTMC_DESC_LEN (0)\n#endif /* CFG_TUD_USBTMC */\n\nenum\n{\n  ITF_NUM_USBTMC,\n  ITF_NUM_TOTAL\n};\n\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_USBTMC_DESC_LEN)\n\nstatic uint8_t const desc_fs_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  TUD_USBTMC_DESC(ITF_NUM_USBTMC, /* _bulkMaxPacketLength = */ 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n\nstatic uint8_t const desc_hs_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  TUD_USBTMC_DESC(ITF_NUM_USBTMC, /* _bulkMaxPacketLength = */ 512),\n};\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier =\n{\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = USB_BCD,\n\n  .bDeviceClass       = TUSB_CLASS_UNSPECIFIED,\n  .bDeviceSubClass    = 0x00,\n  .bDeviceProtocol    = 0x00,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void)\n{\n  return (uint8_t const*) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ?  desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n  \"TinyUSB USBTMC\",              // 4: USBTMC\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/usbtmc/src/usbtmc_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Nathan Conrad\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <string.h>\n#include <stdlib.h>     /* atoi */\n#include \"tusb.h\"\n#include \"bsp/board_api.h\"\n#include \"main.h\"\n#include \"usbtmc_app.h\"\n\n#if (CFG_TUD_USBTMC_ENABLE_488)\nstatic usbtmc_response_capabilities_488_t const\n#else\nstatic usbtmc_response_capabilities_t const\n#endif\ntud_usbtmc_app_capabilities  =\n{\n    .USBTMC_status = USBTMC_STATUS_SUCCESS,\n    .bcdUSBTMC = USBTMC_VERSION,\n    .bmIntfcCapabilities =\n    {\n        .listenOnly = 0,\n        .talkOnly = 0,\n        .supportsIndicatorPulse = 1\n    },\n    .bmDevCapabilities = {\n        .canEndBulkInOnTermChar = 0\n    },\n\n#if (CFG_TUD_USBTMC_ENABLE_488)\n    .bcdUSB488 = USBTMC_488_VERSION,\n    .bmIntfcCapabilities488 =\n    {\n        .supportsTrigger = 1,\n        .supportsREN_GTL_LLO = 0,\n        .is488_2 = 1\n    },\n    .bmDevCapabilities488 =\n    {\n      .SCPI = 1,\n      .SR1 = 0,\n      .RL1 = 0,\n      .DT1 =0,\n    }\n#endif\n};\n\n#define IEEE4882_STB_QUESTIONABLE (0x08u)\n#define IEEE4882_STB_MAV          (0x10u)\n#define IEEE4882_STB_SER          (0x20u)\n#define IEEE4882_STB_SRQ          (0x40u)\n\nstatic const char idn[] = \"TinyUSB,ModelNumber,SerialNumber,FirmwareVer123456\\r\\n\";\n//static const char idn[] = \"TinyUSB,ModelNumber,SerialNumber,FirmwareVer and a bunch of other text to make it longer than a packet, perhaps? lets make it three transfers...\\n\";\nstatic volatile uint8_t status;\n\n// 0=not query, 1=queried, 2=delay,set(MAV), 3=delay 4=ready?\n// (to simulate delay)\nstatic volatile uint16_t queryState = 0;\nstatic volatile uint32_t queryDelayStart;\nstatic volatile uint32_t bulkInStarted;\nstatic volatile uint32_t idnQuery;\n\nstatic uint32_t resp_delay = 125u; // Adjustable delay, to allow for better testing\nstatic size_t buffer_len;\nstatic size_t buffer_tx_ix; // for transmitting using multiple transfers\nstatic uint8_t buffer[225]; // A few packets long should be enough.\n\n\nvoid tud_usbtmc_open_cb(uint8_t interface_id)\n{\n  (void)interface_id;\n  tud_usbtmc_start_bus_read();\n}\n\n#if (CFG_TUD_USBTMC_ENABLE_488)\nusbtmc_response_capabilities_488_t const *\n#else\nusbtmc_response_capabilities_t const *\n#endif\ntud_usbtmc_get_capabilities_cb(void)\n{\n  return &tud_usbtmc_app_capabilities;\n}\n\n\nbool tud_usbtmc_msg_trigger_cb(usbtmc_msg_generic_t* msg) {\n  (void)msg;\n  // Let trigger set the SRQ\n  status |= IEEE4882_STB_SRQ;\n  return true;\n}\n\nbool tud_usbtmc_msgBulkOut_start_cb(usbtmc_msg_request_dev_dep_out const * msgHeader)\n{\n  (void)msgHeader;\n  buffer_len = 0;\n  if(msgHeader->TransferSize > sizeof(buffer))\n  {\n\n    return false;\n  }\n  return true;\n}\n\nbool tud_usbtmc_msg_data_cb(void *data, size_t len, bool transfer_complete)\n{\n  // If transfer isn't finished, we just ignore it (for now)\n\n  if(len + buffer_len < sizeof(buffer))\n  {\n    memcpy(&(buffer[buffer_len]), data, len);\n    buffer_len += len;\n  }\n  else\n  {\n    return false; // buffer overflow!\n  }\n  queryState = transfer_complete;\n  idnQuery = 0;\n\n  if ( transfer_complete && (len >= 4) &&\n       (!strncmp(\"*idn?\", data, 4) || !strncmp(\"*IDN?\", data, 4)) )\n  {\n    idnQuery = 1;\n  }\n\n  if ( transfer_complete &&\n       (!strncmp(\"delay \", data, 5) || !strncmp(\"DELAY \", data, 5)) )\n  {\n    queryState = 0;\n    int d = atoi((char*)data + 5);\n    if(d > 10000)\n      d = 10000;\n    if(d<0)\n      d=0;\n    resp_delay = (uint32_t)d;\n  }\n  tud_usbtmc_start_bus_read();\n  return true;\n}\n\nbool tud_usbtmc_msgBulkIn_complete_cb(void)\n{\n  if((buffer_tx_ix == buffer_len) || idnQuery) // done\n  {\n    status &= (uint8_t)~(IEEE4882_STB_MAV); // clear MAV\n    queryState = 0;\n    bulkInStarted = 0;\n    buffer_tx_ix = 0;\n  }\n  tud_usbtmc_start_bus_read();\n\n  return true;\n}\n\nstatic unsigned int msgReqLen;\n\nbool tud_usbtmc_msgBulkIn_request_cb(usbtmc_msg_request_dev_dep_in const * request)\n{\n  msgReqLen = request->TransferSize;\n\n#ifdef xDEBUG\n  uart_tx_str_sync(\"MSG_IN_DATA: Requested!\\r\\n\");\n#endif\n  if(queryState == 0 || (buffer_tx_ix == 0))\n  {\n    TU_ASSERT(bulkInStarted == 0);\n    bulkInStarted = 1;\n\n    // > If a USBTMC interface receives a Bulk-IN request prior to receiving a USBTMC command message\n    //   that expects a response, the device must NAK the request (*not stall*)\n  }\n  else\n  {\n    size_t txlen = tu_min32(buffer_len-buffer_tx_ix,msgReqLen);\n    tud_usbtmc_transmit_dev_msg_data(&buffer[buffer_tx_ix], txlen,\n        (buffer_tx_ix+txlen) == buffer_len, false);\n    buffer_tx_ix += txlen;\n  }\n  // Always return true indicating not to stall the EP.\n  return true;\n}\n\nvoid usbtmc_app_task_iter(void) {\n  switch(queryState) {\n  case 0:\n    break;\n  case 1:\n    queryDelayStart = tusb_time_millis_api();\n    queryState = 2;\n    break;\n  case 2:\n    if( (tusb_time_millis_api() - queryDelayStart) > resp_delay) {\n      queryDelayStart = tusb_time_millis_api();\n      queryState=3;\n      status |= 0x10u; // MAV\n      status |= 0x40u; // SRQ\n    }\n    break;\n  case 3:\n    if( (tusb_time_millis_api() - queryDelayStart) > resp_delay) {\n      queryState = 4;\n    }\n    break;\n  case 4: // time to transmit;\n    if(bulkInStarted && (buffer_tx_ix == 0)) {\n      if(idnQuery)\n      {\n        tud_usbtmc_transmit_dev_msg_data(idn,  tu_min32(sizeof(idn)-1,msgReqLen),true,false);\n        queryState = 0;\n        bulkInStarted = 0;\n      }\n      else\n      {\n        buffer_tx_ix = tu_min32(buffer_len,msgReqLen);\n        tud_usbtmc_transmit_dev_msg_data(buffer, buffer_tx_ix, buffer_tx_ix == buffer_len, false);\n      }\n      // MAV is cleared in the transfer complete callback.\n    }\n    break;\n  default:\n    TU_ASSERT(false,);\n  }\n}\n\nbool tud_usbtmc_initiate_clear_cb(uint8_t *tmcResult)\n{\n  *tmcResult = USBTMC_STATUS_SUCCESS;\n  queryState = 0;\n  bulkInStarted = false;\n  status = 0;\n  return true;\n}\n\nbool tud_usbtmc_check_clear_cb(usbtmc_get_clear_status_rsp_t *rsp)\n{\n  queryState = 0;\n  bulkInStarted = false;\n  status = 0;\n  buffer_tx_ix = 0u;\n  buffer_len = 0u;\n  rsp->USBTMC_status = USBTMC_STATUS_SUCCESS;\n  rsp->bmClear.BulkInFifoBytes = 0u;\n  return true;\n}\nbool tud_usbtmc_initiate_abort_bulk_in_cb(uint8_t *tmcResult)\n{\n  bulkInStarted = 0;\n  *tmcResult = USBTMC_STATUS_SUCCESS;\n  return true;\n}\nbool tud_usbtmc_check_abort_bulk_in_cb(usbtmc_check_abort_bulk_rsp_t *rsp)\n{\n  (void)rsp;\n  tud_usbtmc_start_bus_read();\n  return true;\n}\n\nbool tud_usbtmc_initiate_abort_bulk_out_cb(uint8_t *tmcResult)\n{\n  *tmcResult = USBTMC_STATUS_SUCCESS;\n  return true;\n\n}\nbool tud_usbtmc_check_abort_bulk_out_cb(usbtmc_check_abort_bulk_rsp_t *rsp)\n{\n  (void)rsp;\n  tud_usbtmc_start_bus_read();\n  return true;\n}\n\nvoid tud_usbtmc_bulkIn_clearFeature_cb(void)\n{\n}\nvoid tud_usbtmc_bulkOut_clearFeature_cb(void)\n{\n  tud_usbtmc_start_bus_read();\n}\n\n// Return status byte, but put the transfer result status code in the rspResult argument.\nuint8_t tud_usbtmc_get_stb_cb(uint8_t *tmcResult)\n{\n  uint8_t old_status = status;\n  status = (uint8_t)(status & ~(IEEE4882_STB_SRQ)); // clear SRQ\n\n  *tmcResult = USBTMC_STATUS_SUCCESS;\n  // Increment status so that we see different results on each read...\n\n  return old_status;\n}\n\nbool tud_usbtmc_indicator_pulse_cb(tusb_control_request_t const * msg, uint8_t *tmcResult)\n{\n  (void)msg;\n  led_indicator_pulse();\n  *tmcResult = USBTMC_STATUS_SUCCESS;\n  return true;\n}\n"
  },
  {
    "path": "examples/device/usbtmc/src/usbtmc_app.h",
    "content": "\n#ifndef USBTMC_APP_H\n#define USBTMC_APP_H\n\nvoid usbtmc_app_task_iter(void);\n\n#endif\n"
  },
  {
    "path": "examples/device/usbtmc/visaQuery.py",
    "content": "#!/usr/bin/env python3\n\nimport pyvisa\nimport time\nimport sys\n\n\ndef test_idn():\n\tidn = inst.query(\"*idn?\");\n\tassert (idn == \"TinyUSB,ModelNumber,SerialNumber,FirmwareVer123456\\r\\n\")\n\tassert (inst.is_4882_compliant)\n\ndef test_echo(m,n):\n\tlongstr = \"0123456789abcdefghijklmnopqrstuvwxyz\" * 50\n\tt0 = time.monotonic()\n\n\t#Next try echo from 1 to 175 characters (200 is max buffer size on DUT)\n\tfor i in range(m,n):\n\t\t#print(i)\n\t\tx = longstr[0:i]\n\t\txt = x + inst.write_termination\n\t\ty = inst.query(x)\n\t\t#print(x)\n\t\t#print (\":\".join(\"{:02x}\".format(ord(c)) for c in xt))\n\t\t#print (\":\".join(\"{:02x}\".format(ord(c)) for c in y))\n\t\tassert(xt == y), f\"failed i={i}\"\n\t\t#inst.read_stb();# Just to make USB logging easier by sending a control query (bad thing is that this made things slow)\n\tt = time.monotonic() - t0\n\tprint(f\"  elapsed: {t:0.3} sec\")\n\ndef test_trig():\n\t# clear SRQ\n\tinst.read_stb()\n\tassert (inst.read_stb() == 0)\n\tinst.assert_trigger()\n\ttime.sleep(0.3) # SRQ may have some delay\n\tassert (inst.read_stb() & 0x40), \"SRQ not set after 0.3 seconds\"\n\tassert (inst.read_stb() == 0)\n\n\ndef test_mav():\n\tinst.write(\"delay 50\")\n\tinst.read_stb() # clear STB\n\tassert (inst.read_stb() == 0)\n\tinst.write(\"123\")\n\ttime.sleep(0.3)\n\tassert (inst.read_stb() & 0x10), \"MAV not set after 0.5 seconds\"\n\n\trsp = inst.read()\n\tassert(rsp == \"123\\r\\n\")\n\n\ndef test_srq():\n\tassert (inst.read_stb() == 0)\n\tinst.write(\"123\")\n\n\t#inst.enable_event(pyvisa.constants.VI_EVENT_SERVICE_REQ, pyvisa.constants.VI_QUEUE)\n\t#waitrsp = inst.wait_on_event(pyvisa.constants.VI_EVENT_SERVICE_REQ, 5000)\n\t#inst.discard_events(pyvisa.constants.VI_EVENT_SERVICE_REQ, pyvisa.constants.VI_QUEUE)\n\t#inst.wait_for_srq()\n\ttime.sleep(0.3)\n\tstb = inst.read_stb()\n\tmsg =  \"SRQ not set after 0.5 seconds, was {:02x}\".format(stb)\n\tassert (stb == 0x50),msg\n\n\tassert (inst.read_stb() == 0x10), \"SRQ set at second read!\"\n\n\trsp = inst.read()\n\tassert(rsp == \"123\\r\\n\")\n\ndef test_read_timeout():\n\tinst.timeout = 500\n\t# First read with no MAV\n\tinst.read_stb()\n\tassert (inst.read_stb() == 0)\n\tinst.write(\"delay 500\")\n\tt0 = time.monotonic()\n\ttry:\n\t\trsp = inst.read()\n\t\tassert(False), \"Read should have resulted in timeout\"\n\texcept pyvisa.VisaIOError:\n\t\tprint(\"  Got expected exception\")\n\tt = time.monotonic() - t0\n\tassert ((t*1000.0) > (inst.timeout - 300))\n\tassert ((t*1000.0) < (inst.timeout + 300))\n\tprint(f\"Delay was {t:0.3}\")\n\t# Response is still in queue, so send a clear (to be more helpful to the next test)\n\tinst.clear()\n\ttime.sleep(0.3)\n\tassert(0 ==  (inst.read_stb() & 0x10)), \"MAV not reset after clear\"\n\ndef test_abort_in():\n\tinst.timeout = 200\n\t# First read with no MAV\n\tinst.read_stb()\n\tassert (inst.read_stb() == 0)\n\tinst.write(\"delay 500\")\n\tinst.write(\"xxx\")\n\tt0 = time.monotonic()\n\ttry:\n\t\trsp = inst.read()\n\t\tassert(False), \"Read should have resulted in timeout\"\n\texcept pyvisa.VisaIOError:\n\t\tprint(\"  Got expected exception\")\n\tt = time.monotonic() - t0\n\tassert ((t*1000.0) > (inst.timeout - 300))\n\tassert ((t*1000.0) < (inst.timeout + 300))\n\tprint(f\"  Delay was {t:0.3}\")\n\t# Response is still in queue, so read it out (to be more helpful to the next test)\n\tinst.timeout = 800\n\ty = inst.read()\n\tassert(y == \"xxx\\r\\n\")\n\ndef test_indicate():\n\t# perform indicator pulse\n\tusb_iface = inst.get_visa_attribute(pyvisa.constants.VI_ATTR_USB_INTFC_NUM)\n\tretv = inst.control_in(request_type_bitmap_field=0xA1, request_id=64, request_value=0x0000, index=usb_iface, length=0x0001)\n\t# pyvisa used to return (statuscode,bytes), but now only returns bytes, so we need to handle both cases\n\tif(isinstance(retv,bytes)):\n\t\tassert(retv == b'\\x01')\n\telse:\n\t\tassert((retv[1] == pyvisa.constants.StatusCode(0)) and (retv[0] == b'\\x01')), f\"indicator pulse failed: retv={retv}\"\n\n\ndef test_multi_read():\n\told_chunk_size = inst.chunk_size\n\tlongstr = \"0123456789abcdefghijklmnopqrstuvwxyz\" * 10\n\ttimeout = 10\n\tx = longstr[0:174]\n\tinst.chunk_size = 50 # Seems chunk size only applies to read but not write\n\tinst.write(x)\n\t# I'm not sure how to request just the remaining bit using a max count... so just read it all.\n\ty = inst.read()\n\tassert (x + \"\\r\\n\" == y)\n\t#inst.chunk_size = old_chunk_size\n\ndef test_stall_ep0():\n\tusb_iface = inst.get_visa_attribute(pyvisa.constants.VI_ATTR_USB_INTFC_NUM)\n\tinst.read_stb()\n\t# This is an invalid request, should create stall.\n\ttry:\n\t\tretv = inst.control_in(request_type_bitmap_field=0xA1, request_id=60, request_value=0x0000, index=usb_iface, length=0x0001)\n\t\tassert(False)\n\texcept pyvisa.VisaIOError:\n\t\tpass\n\n\tassert (inst.read_stb() == 0)\n\n\nrm = pyvisa.ResourceManager()\nreslist = rm.list_resources(\"USB?::?*::INSTR\")\nprint(reslist)\n\nif (len(reslist) == 0):\n    sys.exit()\n\ninst = rm.open_resource(reslist[0]);\ninst.timeout = 3000\n\ninst.clear()\n\nprint(\"+ IDN\")\ntest_idn()\n\nprint(\"+test abort in\")\ntest_abort_in()\n\n\ninst.timeout = 2000\n\nprint(\"+ multi read\")\ntest_multi_read()\n\nprint(\"+ echo delay=0\")\ninst.write(\"delay 0\")\ntest_echo(1,175)\n\nprint(\"+ echo delay=2\")\ninst.write(\"delay 2\")\ntest_echo(1,175)\n\nprint(\"+ echo delay=150\")\ninst.write(\"delay 150\")\ntest_echo(53,76)\ntest_echo(165,170)\n\nprint(\"+ Read timeout (no MAV)\")\ntest_read_timeout()\n\nprint(\"+ Test EP0 stall recovery\")\ntest_stall_ep0()\n\nprint(\"+ MAV\")\ntest_mav()\n\nprint(\"+ SRQ\")\ntest_srq()\n\nprint(\"+ indicate\")\ntest_indicate()\n\nprint(\"+ TRIG\")\ntest_trig()\n\n# Untested:\n#  abort bulk out\n#  LLO, GTL, etc\n#  Throughput rate?\n#  Transmitting a message using multiple transfers\n\ninst.close()\nprint(\"Test complete\")\n"
  },
  {
    "path": "examples/device/video_capture/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(video_capture C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\nif (FORCE_READONLY)\ntarget_compile_definitions(${PROJECT_NAME} PRIVATE\n  CFG_EXAMPLE_VIDEO_READONLY\n)\nendif()\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n)\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n)\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/video_capture/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/video_capture/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nifeq ($(DISABLE_MJPEG),1)\nCFLAGS += -DCFG_EXAMPLE_VIDEO_DISABLE_MJPEG\nendif\nifeq ($(FORCE_READONLY),1)\nCFLAGS += -DCFG_EXAMPLE_VIDEO_READONLY\nendif\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/video_capture/skip.txt",
    "content": "mcu:CH32V103\nmcu:CH32V20X\nmcu:MSP430x5xx\nmcu:NUC121\nmcu:SAMD11\n"
  },
  {
    "path": "examples/device/video_capture/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\" \"usb_descriptors.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/video_capture/src/images.h",
    "content": "#if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)\n// uncopmressed frame\nstatic const unsigned char frame_buffer[128 * (96 + 1) * 2] = {\n  /* 0 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 1 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 2 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 3 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 4 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 5 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 6 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 7 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 8 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 9 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 10 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 11 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 12 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 13 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 14 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 15 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 16 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 17 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 18 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 19 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 20 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 21 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 22 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 23 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 24 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 25 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 26 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 27 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 28 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 29 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 30 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 31 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 32 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 33 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 34 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 35 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 36 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 37 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 38 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 39 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 40 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 41 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 42 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 43 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 44 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 45 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 46 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 47 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 48 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 49 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 50 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 51 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 52 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 53 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 54 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 55 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 56 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 57 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 58 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 59 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 60 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 61 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 62 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 63 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 64 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 65 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 66 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 67 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 68 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 69 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 70 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 71 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 72 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 73 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 74 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 75 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 76 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 77 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 78 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 79 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 80 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 81 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 82 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 83 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 84 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 85 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 86 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 87 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 88 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 89 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 90 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 91 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 92 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 93 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 94 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 95 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 96 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n};\n\n#else\n\n// mpeg compressed data (not CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)\n#define color_bar_0_jpg_len  511\n#define color_bar_1_jpg_len  512\n#define color_bar_2_jpg_len  511\n#define color_bar_3_jpg_len  511\n#define color_bar_4_jpg_len  511\n#define color_bar_5_jpg_len  512\n#define color_bar_6_jpg_len  511\n#define color_bar_7_jpg_len  511\n\nunsigned char color_bar_0_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x92, 0x8a, 0x00,\n  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,\n  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,\n  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,\n  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,\n  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,\n  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,\n  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00,\n  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,\n  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,\n  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,\n  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,\n  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,\n  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,\n  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00,\n  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,\n  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,\n  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,\n  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,\n  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,\n  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,\n  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0xff, 0xd9\n};\nunsigned char color_bar_1_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x7d, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94,\n  0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51,\n  0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63,\n  0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45,\n  0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84,\n  0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94,\n  0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51,\n  0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63,\n  0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45,\n  0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84,\n  0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94,\n  0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51,\n  0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63,\n  0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45,\n  0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84,\n  0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x7f, 0xff, 0xd9\n};\nunsigned char color_bar_2_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x75, 0x14, 0xcc,\n  0xc4, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94,\n  0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18,\n  0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51,\n  0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61,\n  0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25,\n  0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c,\n  0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94,\n  0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18,\n  0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51,\n  0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61,\n  0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25,\n  0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c,\n  0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94,\n  0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18,\n  0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51,\n  0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61,\n  0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25,\n  0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x33, 0xff, 0xd9\n};\nunsigned char color_bar_3_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x5a, 0x2a, 0x08,\n  0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a,\n  0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c,\n  0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac,\n  0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4,\n  0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9,\n  0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12,\n  0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63,\n  0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a,\n  0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c,\n  0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac,\n  0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4,\n  0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9,\n  0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12,\n  0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63,\n  0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a,\n  0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c,\n  0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac,\n  0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4,\n  0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9,\n  0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12,\n  0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x91, 0xff, 0xd9\n};\nunsigned char color_bar_4_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x4a, 0x2a, 0xcb,\n  0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56,\n  0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62,\n  0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4,\n  0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09,\n  0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31,\n  0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5,\n  0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36,\n  0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56,\n  0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62,\n  0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4,\n  0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09,\n  0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31,\n  0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5,\n  0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36,\n  0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56,\n  0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62,\n  0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4,\n  0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09,\n  0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31,\n  0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5,\n  0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x9f, 0xff, 0xd9\n};\nunsigned char color_bar_5_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x6d, 0x14, 0x8d,\n  0x04, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15,\n  0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56,\n  0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65,\n  0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c,\n  0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28,\n  0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15,\n  0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56,\n  0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65,\n  0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c,\n  0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28,\n  0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15,\n  0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56,\n  0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65,\n  0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c,\n  0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28,\n  0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x7f, 0xff, 0xd9\n};\nunsigned char color_bar_6_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x65, 0x15, 0xa0,\n  0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15,\n  0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19,\n  0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b,\n  0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a,\n  0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45,\n  0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c,\n  0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15,\n  0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19,\n  0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b,\n  0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a,\n  0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45,\n  0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c,\n  0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15,\n  0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19,\n  0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b,\n  0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a,\n  0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45,\n  0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x33, 0xff, 0xd9\n};\nunsigned char color_bar_7_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x8e, 0x8a, 0x00,\n  0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad,\n  0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25,\n  0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3,\n  0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2,\n  0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6,\n  0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a,\n  0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c,\n  0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad,\n  0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25,\n  0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3,\n  0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2,\n  0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6,\n  0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a,\n  0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c,\n  0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad,\n  0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25,\n  0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3,\n  0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2,\n  0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6,\n  0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a,\n  0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x47, 0xff, 0xd9\n};\n#endif\n"
  },
  {
    "path": "examples/device/video_capture/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void* param);\nvoid usb_device_task(void *param);\nvoid video_task(void* param);\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\nvoid freertos_init(void);\n#endif\n\n#if !defined(CFG_EXAMPLE_VIDEO_READONLY) || defined(CFG_EXAMPLE_VIDEO_BUFFERLESS)\n/* EBU color bars: https://stackoverflow.com/questions/6939422 */\nstatic uint8_t const bar_color[8][4] = {\n  /*  Y,   U,   Y,   V */\n  { 235, 128, 235, 128}, /* 100% White */\n  { 219,  16, 219, 138}, /* Yellow */\n  { 188, 154, 188,  16}, /* Cyan */\n  { 173,  42, 173,  26}, /* Green */\n  {  78, 214,  78, 230}, /* Magenta */\n  {  63, 102,  63, 240}, /* Red */\n  {  32, 240,  32, 118}, /* Blue */\n  {  16, 128,  16, 128}, /* Black */\n};\n#endif\n\n//--------------------------------------------------------------------+\n// Main\n//--------------------------------------------------------------------+\nint main(void) {\n  board_init();\n\n  // If using FreeRTOS: create blinky, tinyusb device, video task\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  freertos_init();\n#else\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    led_blinking_task(NULL);\n    video_task(NULL);\n  }\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n#ifdef CFG_EXAMPLE_VIDEO_BUFFERLESS\n\n#ifndef CFG_EXAMPLE_VIDEO_DISABLE_MJPEG\n  #error Demo only supports YUV2 please define CFG_EXAMPLE_VIDEO_DISABLE_MJPEG\n#endif\n\nvoid tud_video_prepare_payload_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx, tud_video_payload_request_t* request)\n{\n  static uint32_t frame_counter = 0;\n  (void)ctl_idx;\n  (void)stm_idx;\n\n  /* Offset will be zero at the start of a new frame */\n  if (!request->offset) frame_counter++;\n\n  for (size_t buf_pos = 0; buf_pos < request->length; buf_pos += 2) {\n\n    /* Position within the current line (pixel relative) */\n    int line_pos = ((request->offset + buf_pos)>>1) % FRAME_WIDTH;\n\n    /* Choose color based on the position and change the table offset every 4 frames */\n    const uint8_t* color = bar_color[(line_pos/(FRAME_WIDTH / 8) + (frame_counter>>2)) % 8];\n\n    /* Copy pixel data for odd or even pixels */\n    memcpy(&((uint8_t*)request->buf)[buf_pos], &color[(line_pos & 1) ? 2 : 0], 2);\n  }\n\n}\n#endif\n\n//--------------------------------------------------------------------+\n// USB Video\n//--------------------------------------------------------------------+\nstatic unsigned frame_num = 0;\nstatic unsigned tx_busy = 0;\nstatic unsigned interval_ms = 1000 / FRAME_RATE;\n#ifndef CFG_EXAMPLE_VIDEO_BUFFERLESS\n\n#ifdef CFG_EXAMPLE_VIDEO_READONLY\n// For mcus that does not have enough SRAM for frame buffer, we use fixed frame data.\n// To further reduce the size, we use MJPEG format instead of YUY2.\n#include \"images.h\"\n\n#if !defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)\nstatic struct {\n  uint32_t       size;\n  uint8_t const *buffer;\n} const frames[] = {\n  {color_bar_0_jpg_len, color_bar_0_jpg},\n  {color_bar_1_jpg_len, color_bar_1_jpg},\n  {color_bar_2_jpg_len, color_bar_2_jpg},\n  {color_bar_3_jpg_len, color_bar_3_jpg},\n  {color_bar_4_jpg_len, color_bar_4_jpg},\n  {color_bar_5_jpg_len, color_bar_5_jpg},\n  {color_bar_6_jpg_len, color_bar_6_jpg},\n  {color_bar_7_jpg_len, color_bar_7_jpg},\n};\n#endif\n\n#else\n\n// YUY2 frame buffer\nstatic uint8_t frame_buffer[FRAME_WIDTH * FRAME_HEIGHT * 16 / 8];\n\nstatic void fill_color_bar(uint8_t* buffer, unsigned start_position) {\n  uint8_t* p;\n\n  /* Generate the 1st line */\n  uint8_t* end = &buffer[FRAME_WIDTH * 2];\n  unsigned idx = (FRAME_WIDTH / 2 - 1) - (start_position % (FRAME_WIDTH / 2));\n  p = &buffer[idx * 4];\n  for (unsigned i = 0; i < 8; ++i) {\n    for (int j = 0; j < FRAME_WIDTH / (2 * 8); ++j) {\n      memcpy(p, &bar_color[i], 4);\n      p += 4;\n      if (end <= p) {\n        p = buffer;\n      }\n    }\n  }\n\n  /* Duplicate the 1st line to the others */\n  p = &buffer[FRAME_WIDTH * 2];\n  for (unsigned i = 1; i < FRAME_HEIGHT; ++i) {\n    memcpy(p, buffer, FRAME_WIDTH * 2);\n    p += FRAME_WIDTH * 2;\n  }\n}\n\n#endif\n\n#endif /* NDEF CFG_EXAMPLE_VIDEO_BUFFERLESS */\n\nstatic void video_send_frame(void) {\n  static unsigned start_ms = 0;\n  static unsigned already_sent = 0;\n\n  if (!tud_video_n_streaming(0, 0)) {\n    already_sent = 0;\n    frame_num = 0;\n    return;\n  }\n\n  if (!already_sent) {\n    already_sent = 1;\n    tx_busy = 1;\n    start_ms = tusb_time_millis_api();\n#if defined(CFG_EXAMPLE_VIDEO_BUFFERLESS)\n    tud_video_n_frame_xfer(0, 0, NULL, FRAME_WIDTH * FRAME_HEIGHT * 16 / 8);\n#elif defined (CFG_EXAMPLE_VIDEO_READONLY)\n    #if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)\n    tud_video_n_frame_xfer(0, 0, (void*)(uintptr_t)&frame_buffer[(frame_num % (FRAME_WIDTH / 2)) * 4],\n                           FRAME_WIDTH * FRAME_HEIGHT * 16/8);\n    #else\n    tud_video_n_frame_xfer(0, 0, (void*)(uintptr_t)frames[frame_num % 8].buffer, frames[frame_num % 8].size);\n    #endif\n#else\n    fill_color_bar(frame_buffer, frame_num);\n    tud_video_n_frame_xfer(0, 0, (void*) frame_buffer, FRAME_WIDTH * FRAME_HEIGHT * 16 / 8);\n#endif\n  }\n\n  unsigned cur = tusb_time_millis_api();\n  if (cur - start_ms < interval_ms) {\n    return; // not enough time\n  }\n  if (tx_busy) {\n    return;\n  }\n  start_ms += interval_ms;\n  tx_busy = 1;\n\n#if defined(CFG_EXAMPLE_VIDEO_BUFFERLESS)\n  tud_video_n_frame_xfer(0, 0, NULL, FRAME_WIDTH * FRAME_HEIGHT * 16 / 8);\n#elif defined(CFG_EXAMPLE_VIDEO_READONLY)\n  #if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)\n  tud_video_n_frame_xfer(0, 0, (void*)(uintptr_t)&frame_buffer[(frame_num % (FRAME_WIDTH / 2)) * 4],\n                         FRAME_WIDTH * FRAME_HEIGHT * 16/8);\n  #else\n  tud_video_n_frame_xfer(0, 0, (void*)(uintptr_t)frames[frame_num % 8].buffer, frames[frame_num % 8].size);\n  #endif\n#else\n  fill_color_bar(frame_buffer, frame_num);\n  tud_video_n_frame_xfer(0, 0, (void*) frame_buffer, FRAME_WIDTH * FRAME_HEIGHT * 16 / 8);\n#endif\n}\n\n\nvoid video_task(void* param) {\n  (void) param;\n\n  while(1) {\n    video_send_frame();\n\n    #if CFG_TUSB_OS == OPT_OS_FREERTOS\n    vTaskDelay(interval_ms / portTICK_PERIOD_MS);\n    #else\n    return;\n    #endif\n  }\n}\n\nvoid tud_video_frame_xfer_complete_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx) {\n  (void) ctl_idx;\n  (void) stm_idx;\n  tx_busy = 0;\n  /* flip buffer */\n  ++frame_num;\n}\n\nint tud_video_commit_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx,\n                        video_probe_and_commit_control_t const* parameters) {\n  (void) ctl_idx;\n  (void) stm_idx;\n  /* convert unit to ms from 100 ns */\n  interval_ms = parameters->dwFrameInterval / 10000;\n  return VIDEO_ERROR_NONE;\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void* param) {\n  (void) param;\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  while (1) {\n    #if CFG_TUSB_OS == OPT_OS_FREERTOS\n    vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);\n    #else\n    if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n      return; // not enough time\n    }\n    #endif\n\n    start_ms += blink_interval_ms;\n    board_led_write(led_state);\n    led_state = 1 - led_state; // toggle\n  }\n}\n\n//--------------------------------------------------------------------+\n// FreeRTOS\n//--------------------------------------------------------------------+\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n\n#define BLINKY_STACK_SIZE   configMINIMAL_STACK_SIZE\n#define VIDEO_STACK_SIZE    (configMINIMAL_STACK_SIZE*4)\n\n#ifdef ESP_PLATFORM\n  #define USBD_STACK_SIZE     4096\n  int main(void);\n  void app_main(void) {\n    main();\n  }\n#else\n  // Increase stack size when debug log is enabled\n  #define USBD_STACK_SIZE    (3*configMINIMAL_STACK_SIZE/2) * (CFG_TUSB_DEBUG ? 2 : 1)\n#endif\n\n// static task\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t blinky_stack[BLINKY_STACK_SIZE];\nStaticTask_t blinky_taskdef;\n\nStackType_t  usb_device_stack[USBD_STACK_SIZE];\nStaticTask_t usb_device_taskdef;\n\nStackType_t  video_stack[VIDEO_STACK_SIZE];\nStaticTask_t video_taskdef;\n#endif\n\n// USB Device Driver task\n// This top level thread process all usb events and invoke callbacks\nvoid usb_device_task(void *param) {\n  (void) param;\n\n  // init device stack on configured roothub port\n  // This should be called after scheduler/kernel is started.\n  // Otherwise, it could cause kernel issue since USB IRQ handler does use RTOS queue API.\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // RTOS forever loop\n  while (1) {\n    // put this thread to waiting state until there is new events\n    tud_task();\n  }\n}\n\nvoid freertos_init(void) {\n  #if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);\n  xTaskCreateStatic(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_device_stack, &usb_device_taskdef);\n  xTaskCreateStatic(video_task, \"cdc\", VIDEO_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, video_stack, &video_taskdef);\n  #else\n  xTaskCreate(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, NULL);\n  xTaskCreate(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(video_task, \"video\", VIDEO_STACK_SZIE, NULL, configMAX_PRIORITIES - 2, NULL);\n  #endif\n\n  // only start scheduler for non-espressif mcu\n  #ifndef ESP_PLATFORM\n  vTaskStartScheduler();\n  #endif\n}\n#endif\n"
  },
  {
    "path": "examples/device/video_capture/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n// The number of video control interfaces\n#define CFG_TUD_VIDEO            1\n\n// The number of video streaming interfaces\n#define CFG_TUD_VIDEO_STREAMING  1\n\n// video streaming endpoint buffer size\n#define CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE  256\n\n// use bulk endpoint for streaming interface\n #define CFG_TUD_VIDEO_STREAMING_BULK 0\n\n//#define CFG_EXAMPLE_VIDEO_READONLY\n//#define CFG_EXAMPLE_VIDEO_DISABLE_MJPEG\n//#define CFG_EXAMPLE_VIDEO_BUFFERLESS\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/video_capture/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]  VIDEO | AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VIDEO, 5) | PID_MAP(VENDOR, 6) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n  STRID_UVC_CONTROL,\n  STRID_UVC_STREAMING,\n};\n\n// array of pointer to string descriptors\nchar const* string_desc_arr[] = {\n    (const char[]) {0x09, 0x04}, // 0: is supported language is English (0x0409)\n    \"TinyUSB\",                     // 1: Manufacturer\n    \"TinyUSB Device\",              // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"UVC Control\",                 // 4: UVC Interface\n    \"UVC Streaming\",               // 5: UVC Interface\n};\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n\n    // Use Interface Association Descriptor (IAD) for Video\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = STRID_MANUFACTURER,\n    .iProduct           = STRID_PRODUCT,\n    .iSerialNumber      = STRID_SERIAL,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const* tud_descriptor_device_cb(void) {\n  return (uint8_t const*) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\n/* Time stamp base clock. It is a deprecated parameter. */\n#define UVC_CLOCK_FREQUENCY    27000000\n\n/* video capture path */\n#define UVC_ENTITY_CAP_INPUT_TERMINAL  0x01\n#define UVC_ENTITY_CAP_OUTPUT_TERMINAL 0x02\n\nenum {\n  ITF_NUM_VIDEO_CONTROL,\n  ITF_NUM_VIDEO_STREAMING,\n  ITF_NUM_TOTAL\n};\n\n// Select appropriate endpoint number\n#if TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_VIDEO_IN    (CFG_TUD_VIDEO_STREAMING_BULK ? 0x82 : 0x83)\n#elif TU_CHECK_MCU(OPT_MCU_NRF5X)\n  // nRF5x ISO can only be endpoint 8\n  #define EPNUM_VIDEO_IN    (CFG_TUD_VIDEO_STREAMING_BULK ? 0x81 : 0x88)\n#elif TU_CHECK_MCU(OPT_MCU_MAX32650, OPT_MCU_MAX32666, OPT_MCU_MAX32690, OPT_MCU_MAX78002)\n  #define EPNUM_VIDEO_IN    0x81\n#else\n  #define EPNUM_VIDEO_IN    0x81\n#endif\n\n#if defined(CFG_EXAMPLE_VIDEO_READONLY) && !defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)\n  #define USE_MJPEG 1\n#else\n  #define USE_MJPEG 0\n#endif\n\n#define USE_ISO_STREAMING (!CFG_TUD_VIDEO_STREAMING_BULK)\n\ntypedef struct TU_ATTR_PACKED {\n  tusb_desc_interface_t itf;\n  tusb_desc_video_control_header_1itf_t header;\n  tusb_desc_video_control_camera_terminal_t camera_terminal;\n  tusb_desc_video_control_output_terminal_t output_terminal;\n} uvc_control_desc_t;\n\n/* Windows support YUY2 and NV12\n * https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/usb-video-class-driver-overview */\n\ntypedef struct TU_ATTR_PACKED {\n  tusb_desc_interface_t itf;\n  tusb_desc_video_streaming_input_header_1byte_t header;\n\n#if USE_MJPEG\n  tusb_desc_video_format_mjpeg_t format;\n  tusb_desc_video_frame_mjpeg_continuous_t frame;\n#else\n  tusb_desc_video_format_uncompressed_t format;\n  tusb_desc_video_frame_uncompressed_continuous_t frame;\n#endif\n\n  tusb_desc_video_streaming_color_matching_t color;\n\n#if USE_ISO_STREAMING\n  // For ISO streaming, USB spec requires to alternate interface\n  tusb_desc_interface_t itf_alt;\n#endif\n\n  tusb_desc_endpoint_t ep;\n} uvc_streaming_desc_t;\n\ntypedef struct TU_ATTR_PACKED {\n  tusb_desc_configuration_t config;\n  tusb_desc_interface_assoc_t iad;\n  uvc_control_desc_t video_control;\n  uvc_streaming_desc_t video_streaming;\n} uvc_cfg_desc_t;\n\nconst uvc_cfg_desc_t desc_fs_configuration = {\n    .config = {\n        .bLength = sizeof(tusb_desc_configuration_t),\n        .bDescriptorType = TUSB_DESC_CONFIGURATION,\n\n        .wTotalLength = sizeof(uvc_cfg_desc_t),\n        .bNumInterfaces = ITF_NUM_TOTAL,\n        .bConfigurationValue = 1,\n        .iConfiguration = 0,\n        .bmAttributes =  TU_BIT(7),\n        .bMaxPower = 100 / 2\n    },\n    .iad = {\n        .bLength = sizeof(tusb_desc_interface_assoc_t),\n        .bDescriptorType = TUSB_DESC_INTERFACE_ASSOCIATION,\n\n        .bFirstInterface = ITF_NUM_VIDEO_CONTROL,\n        .bInterfaceCount = 2,\n        .bFunctionClass = TUSB_CLASS_VIDEO,\n        .bFunctionSubClass = VIDEO_SUBCLASS_INTERFACE_COLLECTION,\n        .bFunctionProtocol = VIDEO_ITF_PROTOCOL_UNDEFINED,\n        .iFunction = 0\n    },\n\n    .video_control = {\n        .itf = {\n            .bLength = sizeof(tusb_desc_interface_t),\n            .bDescriptorType = TUSB_DESC_INTERFACE,\n\n            .bInterfaceNumber = ITF_NUM_VIDEO_CONTROL,\n            .bAlternateSetting = 0,\n            .bNumEndpoints = 0,\n            .bInterfaceClass = TUSB_CLASS_VIDEO,\n            .bInterfaceSubClass = VIDEO_SUBCLASS_CONTROL,\n            .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n            .iInterface = STRID_UVC_CONTROL\n        },\n        .header = {\n            .bLength = sizeof(tusb_desc_video_control_header_1itf_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VC_HEADER,\n\n            .bcdUVC = VIDEO_BCD_1_50,\n            .wTotalLength = sizeof(uvc_control_desc_t) - sizeof(tusb_desc_interface_t), // CS VC descriptors only\n            .dwClockFrequency = UVC_CLOCK_FREQUENCY,\n            .bInCollection = 1,\n            .baInterfaceNr = { ITF_NUM_VIDEO_STREAMING }\n        },\n        .camera_terminal = {\n            .bLength = sizeof(tusb_desc_video_control_camera_terminal_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VC_INPUT_TERMINAL,\n\n            .bTerminalID = UVC_ENTITY_CAP_INPUT_TERMINAL,\n            .wTerminalType = VIDEO_ITT_CAMERA,\n            .bAssocTerminal = 0,\n            .iTerminal = 0,\n            .wObjectiveFocalLengthMin = 0,\n            .wObjectiveFocalLengthMax = 0,\n            .wOcularFocalLength = 0,\n            .bControlSize = 3,\n            .bmControls = { 0, 0, 0 }\n        },\n        .output_terminal = {\n            .bLength = sizeof(tusb_desc_video_control_output_terminal_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VC_OUTPUT_TERMINAL,\n\n            .bTerminalID = UVC_ENTITY_CAP_OUTPUT_TERMINAL,\n            .wTerminalType = VIDEO_TT_STREAMING,\n            .bAssocTerminal = 0,\n            .bSourceID = UVC_ENTITY_CAP_INPUT_TERMINAL,\n            .iTerminal = 0\n        }\n    },\n\n    .video_streaming = {\n        .itf = {\n            .bLength = sizeof(tusb_desc_interface_t),\n            .bDescriptorType = TUSB_DESC_INTERFACE,\n\n            .bInterfaceNumber = ITF_NUM_VIDEO_STREAMING,\n            .bAlternateSetting = 0,\n            .bNumEndpoints = CFG_TUD_VIDEO_STREAMING_BULK, // bulk 1, iso 0\n            .bInterfaceClass = TUSB_CLASS_VIDEO,\n            .bInterfaceSubClass = VIDEO_SUBCLASS_STREAMING,\n            .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n            .iInterface = STRID_UVC_STREAMING\n        },\n        .header = {\n            .bLength = sizeof(tusb_desc_video_streaming_input_header_1byte_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VS_INPUT_HEADER,\n\n            .bNumFormats = 1,\n            .wTotalLength = sizeof(uvc_streaming_desc_t) - sizeof(tusb_desc_interface_t)\n                - sizeof(tusb_desc_endpoint_t) - (USE_ISO_STREAMING ? sizeof(tusb_desc_interface_t) : 0) , // CS VS descriptors only\n            .bEndpointAddress = EPNUM_VIDEO_IN,\n            .bmInfo = 0,\n            .bTerminalLink = UVC_ENTITY_CAP_OUTPUT_TERMINAL,\n            .bStillCaptureMethod = 0,\n            .bTriggerSupport = 0,\n            .bTriggerUsage = 0,\n            .bControlSize = 1,\n            .bmaControls = { 0 }\n        },\n        .format = {\n#if USE_MJPEG\n            .bLength = sizeof(tusb_desc_video_format_mjpeg_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VS_FORMAT_MJPEG,\n            .bFormatIndex = 1, // 1-based index\n            .bNumFrameDescriptors = 1,\n            .bmFlags = 0,\n#else\n            .bLength = sizeof(tusb_desc_video_format_uncompressed_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED,\n            .bFormatIndex = 1, // 1-based index\n            .bNumFrameDescriptors = 1,\n            .guidFormat = { TUD_VIDEO_GUID_YUY2 },\n            .bBitsPerPixel = 16,\n#endif\n            .bDefaultFrameIndex = 1,\n            .bAspectRatioX = 0,\n            .bAspectRatioY = 0,\n            .bmInterlaceFlags = 0,\n            .bCopyProtect = 0\n        },\n        .frame = {\n#if USE_MJPEG\n            .bLength = sizeof(tusb_desc_video_frame_mjpeg_continuous_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VS_FRAME_MJPEG,\n#else\n            .bLength = sizeof(tusb_desc_video_frame_uncompressed_continuous_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VS_FRAME_UNCOMPRESSED,\n#endif\n            .bFrameIndex = 1, // 1-based index\n            .bmCapabilities = 0,\n            .wWidth = FRAME_WIDTH,\n            .wHeight = FRAME_HEIGHT,\n            .dwMinBitRate = FRAME_WIDTH * FRAME_HEIGHT * 16 * 1,\n            .dwMaxBitRate = FRAME_WIDTH * FRAME_HEIGHT * 16 * FRAME_RATE,\n            .dwMaxVideoFrameBufferSize = FRAME_WIDTH * FRAME_HEIGHT * 16 / 8,\n            .dwDefaultFrameInterval = 10000000 / FRAME_RATE,\n            .bFrameIntervalType = 0, // continuous\n            .dwFrameInterval = {\n                10000000 / FRAME_RATE, // min\n                10000000, // max\n                10000000 / FRAME_RATE // step\n            }\n        },\n        .color = {\n            .bLength = sizeof(tusb_desc_video_streaming_color_matching_t),\n            .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n            .bDescriptorSubType = VIDEO_CS_ITF_VS_COLORFORMAT,\n\n            .bColorPrimaries = VIDEO_COLOR_PRIMARIES_BT709,\n            .bTransferCharacteristics = VIDEO_COLOR_XFER_CH_BT709,\n            .bMatrixCoefficients = VIDEO_COLOR_COEF_SMPTE170M\n        },\n\n#if USE_ISO_STREAMING\n        .itf_alt = {\n            .bLength = sizeof(tusb_desc_interface_t),\n            .bDescriptorType = TUSB_DESC_INTERFACE,\n\n            .bInterfaceNumber = ITF_NUM_VIDEO_STREAMING,\n            .bAlternateSetting = 1,\n            .bNumEndpoints = 1,\n            .bInterfaceClass = TUSB_CLASS_VIDEO,\n            .bInterfaceSubClass = VIDEO_SUBCLASS_STREAMING,\n            .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n            .iInterface = STRID_UVC_STREAMING\n        },\n#endif\n\n        .ep = {\n            .bLength = sizeof(tusb_desc_endpoint_t),\n            .bDescriptorType = TUSB_DESC_ENDPOINT,\n\n            .bEndpointAddress = EPNUM_VIDEO_IN,\n            .bmAttributes = {\n                .xfer = CFG_TUD_VIDEO_STREAMING_BULK ? TUSB_XFER_BULK : TUSB_XFER_ISOCHRONOUS,\n                .sync = CFG_TUD_VIDEO_STREAMING_BULK ? 0 : 1 // asynchronous\n            },\n            .wMaxPacketSize = CFG_TUD_VIDEO_STREAMING_BULK ? 64 : CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE,\n            .bInterval = 1\n        }\n    }\n};\n\n#if TUD_OPT_HIGH_SPEED\nuvc_cfg_desc_t desc_hs_configuration;\n\nstatic uint8_t * get_hs_configuration_desc(void) {\n  static bool init = false;\n\n  if (!init) {\n    desc_hs_configuration = desc_fs_configuration;\n    // change endpoint bulk size to 512 if bulk streaming\n    if (CFG_TUD_VIDEO_STREAMING_BULK) {\n      desc_hs_configuration.video_streaming.ep.wMaxPacketSize = 512;\n    }\n  }\n  init = true;\n\n  return (uint8_t *) &desc_hs_configuration;\n}\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n    .bLength            = sizeof(tusb_desc_device_qualifier_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n    .bcdUSB             = USB_BCD,\n\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n    .bNumConfigurations = 0x01,\n    .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const*) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n  // if link speed is high return fullspeed config, and vice versa\n  if (tud_speed_get() == TUSB_SPEED_HIGH) {\n    return (uint8_t const*) &desc_fs_configuration;\n  } else {\n    return get_hs_configuration_desc();\n  }\n}\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const* tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  if (tud_speed_get() == TUSB_SPEED_HIGH) {\n    return get_hs_configuration_desc();\n  } else\n#endif\n  {\n    return (uint8_t const*) &desc_fs_configuration;\n  }\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (index >= sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) return NULL;\n\n      const char* str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/video_capture/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenbreg\n * Copyright (c) 2021 Koji KITAYAMA\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef _USB_DESCRIPTORS_H_\n#define _USB_DESCRIPTORS_H_\n\n#define FRAME_WIDTH   128\n#define FRAME_HEIGHT  96\n#define FRAME_RATE    10\n\n// NOTE: descriptor template is not used but leave here as reference\n\n#define TUD_VIDEO_CAPTURE_DESC_UNCOMPR_LEN (\\\n    TUD_VIDEO_DESC_IAD_LEN\\\n    /* control */\\\n    + TUD_VIDEO_DESC_STD_VC_LEN\\\n    + (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\\\n    + TUD_VIDEO_DESC_CAMERA_TERM_LEN\\\n    + TUD_VIDEO_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\\\n    + TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\\\n    /* Interface 1, Alternate 1 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + 7/* Endpoint */\\\n  )\n\n#define TUD_VIDEO_CAPTURE_DESC_MJPEG_LEN (\\\n    TUD_VIDEO_DESC_IAD_LEN\\\n    /* control */\\\n    + TUD_VIDEO_DESC_STD_VC_LEN\\\n    + (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\\\n    + TUD_VIDEO_DESC_CAMERA_TERM_LEN\\\n    + TUD_VIDEO_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\\\n    + TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\\\n    /* Interface 1, Alternate 1 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + 7/* Endpoint */\\\n  )\n\n#define TUD_VIDEO_CAPTURE_DESC_UNCOMPR_BULK_LEN (\\\n    TUD_VIDEO_DESC_IAD_LEN\\\n    /* control */\\\n    + TUD_VIDEO_DESC_STD_VC_LEN\\\n    + (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\\\n    + TUD_VIDEO_DESC_CAMERA_TERM_LEN\\\n    + TUD_VIDEO_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\\\n    + TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\\\n    + 7/* Endpoint */\\\n  )\n\n#define TUD_VIDEO_CAPTURE_DESC_MJPEG_BULK_LEN (\\\n    TUD_VIDEO_DESC_IAD_LEN\\\n    /* control */\\\n    + TUD_VIDEO_DESC_STD_VC_LEN\\\n    + (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\\\n    + TUD_VIDEO_DESC_CAMERA_TERM_LEN\\\n    + TUD_VIDEO_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\\\n    + TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\\\n    + 7/* Endpoint */\\\n  )\n\n/* Windows support YUY2 and NV12\n * https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/usb-video-class-driver-overview */\n\n#define TUD_VIDEO_DESC_CS_VS_FMT_YUY2(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_YUY2, 16, _frmidx, _asrx, _asry, _interlace, _cp)\n#define TUD_VIDEO_DESC_CS_VS_FMT_NV12(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_NV12, 12, _frmidx, _asrx, _asry, _interlace, _cp)\n#define TUD_VIDEO_DESC_CS_VS_FMT_M420(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_M420, 12, _frmidx, _asrx, _asry, _interlace, _cp)\n#define TUD_VIDEO_DESC_CS_VS_FMT_I420(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_I420, 12, _frmidx, _asrx, _asry, _interlace, _cp)\n\n#define TUD_VIDEO_CAPTURE_DESCRIPTOR_UNCOMPR(_stridx, _epin, _width, _height, _fps, _epsize) \\\n  TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \\\n  /* Video control 0 */ \\\n  TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx),                                  \\\n    /* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \\\n    TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \\\n      /* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \\\n      TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \\\n      TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \\\n  /* Video stream alt. 0 */ \\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 0, _stridx), \\\n    /* Video stream header for without still image capture */ \\\n    TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \\\n        /*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\\\n        _epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \\\n        /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \\\n        /*bmaControls(1)*/0), \\\n      /* Video stream format */ \\\n      TUD_VIDEO_DESC_CS_VS_FMT_YUY2(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \\\n        /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \\\n        /* Video stream frame format */ \\\n        TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT(/*bFrameIndex */1, 0, _width, _height, \\\n            _width * _height * 16, _width * _height * 16 * _fps, \\\n            _width * _height * 16 / 8, \\\n            (10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \\\n        TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \\\n  /* VS alt 1 */\\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 1, 1, _stridx), \\\n    /* EP */ \\\n    TUD_VIDEO_DESC_EP_ISO(_epin, _epsize, 1)\n\n#define TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG(_stridx, _epin, _width, _height, _fps, _epsize) \\\n  TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \\\n  /* Video control 0 */ \\\n  TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx),                                \\\n    /* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \\\n    TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \\\n      /* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \\\n      TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \\\n      TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \\\n  /* Video stream alt. 0 */ \\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 0, _stridx), \\\n    /* Video stream header for without still image capture */ \\\n    TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \\\n        /*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\\\n        _epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \\\n        /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \\\n        /*bmaControls(1)*/0), \\\n      /* Video stream format */ \\\n      TUD_VIDEO_DESC_CS_VS_FMT_MJPEG(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \\\n        /*bmFlags*/0, /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \\\n        /* Video stream frame format */ \\\n        TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT(/*bFrameIndex */1, 0, _width, _height, \\\n            _width * _height * 16, _width * _height * 16 * _fps, \\\n            _width * _height * 16 / 8, \\\n            (10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \\\n        TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \\\n  /* VS alt 1 */\\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 1, 1, _stridx), \\\n    /* EP */ \\\n    TUD_VIDEO_DESC_EP_ISO(_epin, _epsize, 1)\n\n\n#define TUD_VIDEO_CAPTURE_DESCRIPTOR_UNCOMPR_BULK(_stridx, _epin, _width, _height, _fps, _epsize) \\\n  TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \\\n  /* Video control 0 */ \\\n  TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \\\n    /* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \\\n    TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \\\n      /* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \\\n      TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \\\n      TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \\\n  /* Video stream alt. 0 */ \\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 1, _stridx), \\\n    /* Video stream header for without still image capture */ \\\n    TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \\\n        /*wTotalLength - bLength */\\\n        TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\\\n        _epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \\\n        /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \\\n        /*bmaControls(1)*/0), \\\n      /* Video stream format */ \\\n      TUD_VIDEO_DESC_CS_VS_FMT_YUY2(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \\\n        /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \\\n        /* Video stream frame format */ \\\n        TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT(/*bFrameIndex */1, 0, _width, _height, \\\n            _width * _height * 16, _width * _height * 16 * _fps, \\\n            _width * _height * 16 / 8, \\\n            (10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \\\n        TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \\\n        TUD_VIDEO_DESC_EP_BULK(_epin, _epsize, 1)\n\n#define TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG_BULK(_stridx, _epin, _width, _height, _fps, _epsize) \\\n  TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \\\n  /* Video control 0 */ \\\n  TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx),                                     \\\n    /* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \\\n    TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \\\n      /* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \\\n      TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \\\n      TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, UVC_ENTITY_CAP_INPUT_TERMINAL, 0), \\\n  /* Video stream alt. 0 */ \\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 1, _stridx), \\\n    /* Video stream header for without still image capture */ \\\n    TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \\\n        /*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\\\n        _epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \\\n        /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \\\n        /*bmaControls(1)*/0), \\\n      /* Video stream format */ \\\n      TUD_VIDEO_DESC_CS_VS_FMT_MJPEG(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \\\n        /*bmFlags*/0, /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \\\n        /* Video stream frame format */ \\\n        TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT(/*bFrameIndex */1, 0, _width, _height, \\\n            _width * _height * 16, _width * _height * 16 * _fps, \\\n            _width * _height * 16 / 8, \\\n            (10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \\\n        TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \\\n        /* EP */ \\\n        TUD_VIDEO_DESC_EP_BULK(_epin, _epsize, 1)\n\n\n#endif\n"
  },
  {
    "path": "examples/device/video_capture_2ch/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(video_capture_2ch C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\nif (FORCE_READONLY)\ntarget_compile_definitions(${PROJECT_NAME} PRIVATE\n  CFG_EXAMPLE_VIDEO_READONLY\n)\nendif()\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n)\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n)\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/video_capture_2ch/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/video_capture_2ch/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nifeq ($(DISABLE_MJPEG),1)\nCFLAGS += -DCFG_EXAMPLE_VIDEO_DISABLE_MJPEG\nendif\nifeq ($(FORCE_READONLY),1)\nCFLAGS += -DCFG_EXAMPLE_VIDEO_READONLY\nendif\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/video_capture_2ch/skip.txt",
    "content": "mcu:MSP430x5xx\nmcu:NUC121\nmcu:SAMD11\nmcu:GD32VF103\nmcu:CH32V103\nmcu:CH32V20X\nmcu:CH32V307\nmcu:STM32L0\nfamily:espressif\nboard:curiosity_nano\nboard:kuiic\nboard:frdm_k32l2b\nboard:lpcxpresso11u68\nboard:stm32f303disco\nboard:stm32l412nucleo\nboard:ek_tm4c123gxl\nboard:uno_r4\nboard:ra4m1_ek\n"
  },
  {
    "path": "examples/device/video_capture_2ch/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\" \"usb_descriptors.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/video_capture_2ch/src/images.h",
    "content": "#if defined(CFG_EXAMPLE_VIDEO_READONLY)\n//--------------------------------------------------------------------+\n// YUY2 Uncompressed Frame (fixed)\n//--------------------------------------------------------------------+\nstatic const unsigned char framebuf_yuy2_readonly[128 * (96 + 1) * 2] = {\n  /* 0 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 1 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 2 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 3 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 4 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 5 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 6 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 7 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 8 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 9 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 10 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 11 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 12 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 13 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 14 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 15 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 16 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 17 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 18 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 19 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 20 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 21 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 22 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 23 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 24 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 25 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 26 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 27 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 28 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 29 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 30 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 31 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 32 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 33 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 34 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 35 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 36 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 37 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 38 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 39 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 40 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 41 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 42 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 43 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 44 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 45 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 46 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 47 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 48 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 49 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 50 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 51 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 52 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 53 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 54 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 55 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 56 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 57 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 58 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 59 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 60 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 61 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 62 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 63 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 64 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 65 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 66 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 67 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 68 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 69 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 70 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 71 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 72 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 73 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 74 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 75 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 76 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 77 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 78 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 79 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 80 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 81 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 82 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 83 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 84 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 85 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 86 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 87 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 88 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 89 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 90 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 91 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 92 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 93 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 94 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 95 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  /* 96 */\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80, 0xeb, 0x80,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a, 0xdb, 0x10, 0xdb, 0x8a,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10, 0xbc, 0x9a, 0xbc, 0x10,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a, 0xad, 0x2a, 0xad, 0x1a,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6, 0x4e, 0xd6, 0x4e, 0xe6,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0, 0x3f, 0x66, 0x3f, 0xf0,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76, 0x20, 0xf0, 0x20, 0x76,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n  0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80, 0x10, 0x80,\n};\n\n#endif\n\n//--------------------------------------------------------------------+\n// MPEG Compressed Frame (fixed)\n//--------------------------------------------------------------------+\n\nunsigned char color_bar_0_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x92, 0x8a, 0x00,\n  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,\n  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,\n  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,\n  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,\n  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,\n  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,\n  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00,\n  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,\n  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,\n  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,\n  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,\n  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,\n  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,\n  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00,\n  0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45,\n  0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89,\n  0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad,\n  0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25,\n  0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3,\n  0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1,\n  0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0xff, 0xd9\n};\nunsigned char color_bar_1_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x7d, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94,\n  0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51,\n  0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63,\n  0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45,\n  0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84,\n  0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94,\n  0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51,\n  0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63,\n  0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45,\n  0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84,\n  0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94,\n  0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51,\n  0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63,\n  0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45,\n  0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84,\n  0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x7f, 0xff, 0xd9\n};\nunsigned char color_bar_2_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x75, 0x14, 0xcc,\n  0xc4, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94,\n  0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18,\n  0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51,\n  0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61,\n  0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25,\n  0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c,\n  0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94,\n  0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18,\n  0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51,\n  0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61,\n  0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25,\n  0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c,\n  0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94,\n  0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18,\n  0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51,\n  0x40, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61,\n  0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x18, 0xda, 0x2b, 0x63, 0x61, 0x28, 0xac, 0xc6, 0x25,\n  0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x2c, 0x51, 0x40, 0x09, 0x45, 0x66, 0x33, 0xff, 0xd9\n};\nunsigned char color_bar_3_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x5a, 0x2a, 0x08,\n  0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a,\n  0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c,\n  0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac,\n  0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4,\n  0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9,\n  0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12,\n  0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63,\n  0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a,\n  0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c,\n  0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac,\n  0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4,\n  0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9,\n  0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12,\n  0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63,\n  0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a,\n  0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c,\n  0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac,\n  0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4,\n  0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9,\n  0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12,\n  0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x91, 0xff, 0xd9\n};\nunsigned char color_bar_4_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x4a, 0x2a, 0xcb,\n  0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56,\n  0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62,\n  0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4,\n  0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09,\n  0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31,\n  0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5,\n  0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36,\n  0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56,\n  0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62,\n  0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4,\n  0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09,\n  0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31,\n  0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5,\n  0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36,\n  0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56,\n  0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62,\n  0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4,\n  0xc8, 0x4a, 0x2b, 0x31, 0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09,\n  0x45, 0x66, 0x32, 0xc5, 0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31,\n  0x8d, 0xa2, 0xb6, 0x36, 0x12, 0x8a, 0xcc, 0x62, 0x51, 0x5a, 0x99, 0x09, 0x45, 0x66, 0x32, 0xc5,\n  0x14, 0x00, 0x94, 0x56, 0x63, 0x12, 0x8a, 0xd4, 0xc8, 0x4a, 0x2b, 0x31, 0x9f, 0xff, 0xd9\n};\nunsigned char color_bar_5_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x6d, 0x14, 0x8d,\n  0x04, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15,\n  0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56,\n  0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65,\n  0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c,\n  0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28,\n  0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15,\n  0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56,\n  0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65,\n  0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c,\n  0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28,\n  0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98,\n  0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15,\n  0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32,\n  0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56,\n  0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65,\n  0x8a, 0x28, 0x01, 0x28, 0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c,\n  0x6c, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x65, 0x8a, 0x28, 0x01, 0x28,\n  0xac, 0xc6, 0x25, 0x15, 0xa9, 0x90, 0x94, 0x56, 0x63, 0x1b, 0x45, 0x6c, 0x6c, 0x7f, 0xff, 0xd9\n};\nunsigned char color_bar_6_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x65, 0x15, 0xa0,\n  0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15,\n  0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19,\n  0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b,\n  0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a,\n  0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45,\n  0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c,\n  0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15,\n  0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19,\n  0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b,\n  0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a,\n  0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45,\n  0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c,\n  0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15,\n  0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19,\n  0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b,\n  0x1b, 0x09, 0x45, 0x66, 0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a,\n  0x2b, 0x31, 0x89, 0x45, 0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66,\n  0x31, 0x28, 0xad, 0x4c, 0x84, 0xa2, 0xb3, 0x19, 0x62, 0x8a, 0x00, 0x4a, 0x2b, 0x31, 0x89, 0x45,\n  0x6a, 0x64, 0x25, 0x15, 0x98, 0xc6, 0xd1, 0x5b, 0x1b, 0x09, 0x45, 0x66, 0x33, 0xff, 0xd9\n};\nunsigned char color_bar_7_jpg[] = {\n  0xff, 0xd8, 0xff, 0xdb, 0x00, 0x43, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xdb, 0x00, 0x43, 0x01, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x11,\n  0x08, 0x00, 0x60, 0x00, 0x80, 0x03, 0x01, 0x21, 0x00, 0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xff,\n  0xda, 0x00, 0x0c, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 0x11, 0x00, 0x3f, 0x00, 0x8e, 0x8a, 0x00,\n  0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad,\n  0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25,\n  0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3,\n  0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2,\n  0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6,\n  0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a,\n  0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c,\n  0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad,\n  0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25,\n  0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3,\n  0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2,\n  0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6,\n  0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a,\n  0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c,\n  0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad,\n  0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25,\n  0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3,\n  0x18, 0x94, 0x56, 0xa6, 0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2,\n  0xb5, 0x32, 0x12, 0x8a, 0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6,\n  0x42, 0x51, 0x59, 0x8c, 0xb1, 0x45, 0x00, 0x25, 0x15, 0x98, 0xc4, 0xa2, 0xb5, 0x32, 0x12, 0x8a,\n  0xcc, 0x63, 0x68, 0xad, 0x8d, 0x84, 0xa2, 0xb3, 0x18, 0x94, 0x56, 0xa6, 0x47, 0xff, 0xd9\n};\n"
  },
  {
    "path": "examples/device/video_capture_2ch/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void* param);\nvoid usb_device_task(void *param);\nvoid video_task(void* param);\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\nvoid freertos_init(void);\n#endif\n\n\n//--------------------------------------------------------------------+\n// Main\n//--------------------------------------------------------------------+\nint main(void) {\n  board_init();\n\n  // If using FreeRTOS: create blinky, tinyusb device, video task\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  freertos_init();\n#else\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    led_blinking_task(NULL);\n    video_task(NULL);\n  }\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// USB Video\n//--------------------------------------------------------------------+\n#define FRAMEBUF_SIZE (FRAME_WIDTH * FRAME_HEIGHT * 16 / 8)\n\nstatic unsigned frame_num[CFG_TUD_VIDEO_STREAMING] = {1};\nstatic unsigned tx_busy = 0;\nstatic unsigned interval_ms[CFG_TUD_VIDEO_STREAMING] = {1000 / FRAME_RATE};\n\n// For mcus that does not have enough SRAM for frame buffer, we use fixed frame data.\n// To further reduce the size, we use MJPEG format instead of YUY2.\n#include \"images.h\"\n\nstatic struct {\n  uint32_t       size;\n  uint8_t const *buffer;\n} const framebuf_mjpeg[] = {\n    {sizeof(color_bar_0_jpg), color_bar_0_jpg},\n    {sizeof(color_bar_1_jpg), color_bar_1_jpg},\n    {sizeof(color_bar_2_jpg), color_bar_2_jpg},\n    {sizeof(color_bar_3_jpg), color_bar_3_jpg},\n    {sizeof(color_bar_4_jpg), color_bar_4_jpg},\n    {sizeof(color_bar_5_jpg), color_bar_5_jpg},\n    {sizeof(color_bar_6_jpg), color_bar_6_jpg},\n    {sizeof(color_bar_7_jpg), color_bar_7_jpg},\n};\n\n#if !defined(CFG_EXAMPLE_VIDEO_READONLY)\n// YUY2 frame buffer\nstatic uint8_t framebuf_yuy2[FRAMEBUF_SIZE];\n\nstatic void fill_color_bar(uint8_t* buffer, unsigned start_position) {\n  /* EBU color bars: https://stackoverflow.com/questions/6939422 */\n  static uint8_t const bar_color[8][4] = {\n      /*  Y,   U,   Y,   V */\n      { 235, 128, 235, 128}, /* 100% White */\n      { 219,  16, 219, 138}, /* Yellow */\n      { 188, 154, 188,  16}, /* Cyan */\n      { 173,  42, 173,  26}, /* Green */\n      {  78, 214,  78, 230}, /* Magenta */\n      {  63, 102,  63, 240}, /* Red */\n      {  32, 240,  32, 118}, /* Blue */\n      {  16, 128,  16, 128}, /* Black */\n  };\n  uint8_t* p;\n\n  /* Generate the 1st line */\n  uint8_t* end = &buffer[FRAME_WIDTH * 2];\n  unsigned idx = (FRAME_WIDTH / 2 - 1) - (start_position % (FRAME_WIDTH / 2));\n  p = &buffer[idx * 4];\n  for (unsigned i = 0; i < 8; ++i) {\n    for (int j = 0; j < FRAME_WIDTH / (2 * 8); ++j) {\n      memcpy(p, &bar_color[i], 4);\n      p += 4;\n      if (end <= p) {\n        p = buffer;\n      }\n    }\n  }\n\n  /* Duplicate the 1st line to the others */\n  p = &buffer[FRAME_WIDTH * 2];\n  for (unsigned i = 1; i < FRAME_HEIGHT; ++i) {\n    memcpy(p, buffer, FRAME_WIDTH * 2);\n    p += FRAME_WIDTH * 2;\n  }\n}\n#endif\n\nstatic size_t get_framebuf(uint_fast8_t ctl_idx, uint_fast8_t stm_idx, size_t fnum, void **fb) {\n  uint32_t idx = ctl_idx + stm_idx;\n\n  if (idx == 0) {\n    // stream 0 use uncompressed YUY2 frame\n    #if defined(CFG_EXAMPLE_VIDEO_READONLY)\n    *fb = (void*)(uintptr_t ) &framebuf_yuy2_readonly[(fnum % (FRAME_WIDTH / 2)) * 4];\n    #else\n    fill_color_bar(framebuf_yuy2, frame_num[idx]);\n    *fb = framebuf_yuy2;\n    #endif\n\n    return FRAMEBUF_SIZE;\n  }else {\n    // stream 1 use MJPEG frame\n    size_t const bar_id = fnum & 0x7;\n\n    *fb = (void*)(uintptr_t) framebuf_mjpeg[bar_id].buffer;\n    return framebuf_mjpeg[bar_id].size;\n  }\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nstatic void video_send_frame(uint_fast8_t ctl_idx, uint_fast8_t stm_idx) {\n  static unsigned start_ms[CFG_TUD_VIDEO_STREAMING] = {0, };\n  static unsigned already_sent = 0;\n\n  uint32_t idx = ctl_idx + stm_idx;\n  if (!tud_video_n_streaming(ctl_idx, stm_idx)) {\n    already_sent &= ~(1u << idx);\n    frame_num[idx] = 0;\n    return;\n  }\n  void* fp;\n  size_t fb_size;\n\n  if (!(already_sent & (1u << idx))) {\n    already_sent |= 1u << idx;\n    tx_busy |= 1u << idx;\n    start_ms[idx] = tusb_time_millis_api();\n\n    fb_size = get_framebuf(ctl_idx, stm_idx, frame_num[idx], &fp);\n    tud_video_n_frame_xfer(ctl_idx, stm_idx, fp, fb_size);\n  }\n\n  unsigned cur = tusb_time_millis_api();\n  if (cur - start_ms[idx] < interval_ms[idx]) return; // not enough time\n  if (tx_busy & (1u << idx)) return;\n  start_ms[idx] += interval_ms[idx];\n  tx_busy |= 1u << idx;\n\n  fb_size = get_framebuf(ctl_idx, stm_idx, frame_num[idx], &fp);\n  tud_video_n_frame_xfer(ctl_idx, stm_idx, fp, fb_size);\n}\n\n\nvoid video_task(void* param) {\n  (void) param;\n\n  while(1) {\n    video_send_frame(0, 0);\n    video_send_frame(1, 0);\n\n    #if CFG_TUSB_OS == OPT_OS_FREERTOS\n    vTaskDelay(interval_ms[0] / portTICK_PERIOD_MS);\n    #else\n    return;\n    #endif\n  }\n}\n\nvoid tud_video_frame_xfer_complete_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx) {\n  uint32_t idx = ctl_idx + stm_idx;\n  tx_busy &= ~(1u << idx);\n  /* flip buffer */\n  ++frame_num[idx];\n}\n\nint tud_video_commit_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx,\n                        video_probe_and_commit_control_t const* parameters) {\n  uint32_t idx = ctl_idx + stm_idx;\n  /* convert unit to ms from 100 ns */\n  interval_ms[idx] = parameters->dwFrameInterval / 10000;\n  return VIDEO_ERROR_NONE;\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void* param) {\n  (void) param;\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  while (1) {\n    #if CFG_TUSB_OS == OPT_OS_FREERTOS\n    vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);\n    #else\n    if (tusb_time_millis_api() - start_ms < blink_interval_ms) return; // not enough time\n    #endif\n\n    start_ms += blink_interval_ms;\n    board_led_write(led_state);\n    led_state = 1 - led_state; // toggle\n  }\n}\n\n//--------------------------------------------------------------------+\n// FreeRTOS\n//--------------------------------------------------------------------+\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n\n#define BLINKY_STACK_SIZE   configMINIMAL_STACK_SIZE\n#define VIDEO_STACK_SIZE    (configMINIMAL_STACK_SIZE*4)\n\n#ifdef ESP_PLATFORM\n  #define USBD_STACK_SIZE     4096\n  int main(void);\n  void app_main(void) {\n    main();\n  }\n#else\n  // Increase stack size when debug log is enabled\n  #define USBD_STACK_SIZE    (3*configMINIMAL_STACK_SIZE/2) * (CFG_TUSB_DEBUG ? 2 : 1)\n#endif\n\n// static task\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t blinky_stack[BLINKY_STACK_SIZE];\nStaticTask_t blinky_taskdef;\n\nStackType_t  usb_device_stack[USBD_STACK_SIZE];\nStaticTask_t usb_device_taskdef;\n\nStackType_t  video_stack[VIDEO_STACK_SIZE];\nStaticTask_t video_taskdef;\n#endif\n\n// USB Device Driver task\n// This top level thread process all usb events and invoke callbacks\nvoid usb_device_task(void *param) {\n  (void) param;\n\n  // init device stack on configured roothub port\n  // This should be called after scheduler/kernel is started.\n  // Otherwise, it could cause kernel issue since USB IRQ handler does use RTOS queue API.\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  // RTOS forever loop\n  while (1) {\n    // put this thread to waiting state until there is new events\n    tud_task();\n  }\n}\n\nvoid freertos_init(void) {\n  #if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);\n  xTaskCreateStatic(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_device_stack, &usb_device_taskdef);\n  xTaskCreateStatic(video_task, \"cdc\", VIDEO_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, video_stack, &video_taskdef);\n  #else\n  xTaskCreate(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, NULL);\n  xTaskCreate(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(video_task, \"video\", VIDEO_STACK_SZIE, NULL, configMAX_PRIORITIES - 2, NULL);\n  #endif\n\n  // only start scheduler for non-espressif mcu\n  #ifndef ESP_PLATFORM\n  vTaskStartScheduler();\n  #endif\n}\n#endif\n"
  },
  {
    "path": "examples/device/video_capture_2ch/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n// The number of video control interfaces\n#define CFG_TUD_VIDEO            2\n\n// The number of video streaming interfaces\n#define CFG_TUD_VIDEO_STREAMING  2\n\n// video streaming endpoint buffer size\n#define CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE  256\n\n// use bulk endpoint for streaming interface\n#define CFG_TUD_VIDEO_STREAMING_BULK 1\n\n//#define CFG_EXAMPLE_VIDEO_READONLY\n//#define CFG_EXAMPLE_VIDEO_DISABLE_MJPEG\n\n#define CFG_TUD_VIDEO_LOG_LEVEL 1\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/video_capture_2ch/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]  VIDEO | AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n    PID_MAP(MIDI, 3) | PID_MAP(AUDIO, 4) | PID_MAP(VIDEO, 5) | PID_MAP(VENDOR, 6) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n  STRID_UVC_CONTROL_1,\n  STRID_UVC_STREAMING_1,\n  STRID_UVC_CONTROL_2,\n  STRID_UVC_STREAMING_2,\n};\n\n// array of pointer to string descriptors\nchar const* string_desc_arr[] = {\n    (const char[]) {0x09, 0x04}, // 0: is supported language is English (0x0409)\n    \"TinyUSB\",                   // 1: Manufacturer\n    \"TinyUSB Device\",            // 2: Product\n    NULL,                        // 3: Serials will use unique ID if possible\n    \"UVC Control 1\",             // 4: UVC Interface 1\n    \"UVC Streaming 1\",           // 5: UVC Interface 1\n    \"UVC Control 2\",             // 6: UVC Interface 2\n    \"UVC Streaming 2\",           // 7: UVC Interface 2\n\n};\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n\n    // Use Interface Association Descriptor (IAD) for Video\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = STRID_MANUFACTURER,\n    .iProduct           = STRID_PRODUCT,\n    .iSerialNumber      = STRID_SERIAL,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const* tud_descriptor_device_cb(void) {\n  return (uint8_t const*) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\n/* Time stamp base clock. It is a deprecated parameter. */\n#define UVC_CLOCK_FREQUENCY    27000000\n\n/* video capture path */\n#define UVC_ENTITY_CAP_INPUT_TERMINAL  0x01\n#define UVC_ENTITY_CAP_OUTPUT_TERMINAL 0x02\n\nenum {\n  ITF_NUM_VIDEO_CONTROL_1,\n  ITF_NUM_VIDEO_STREAMING_1,\n  ITF_NUM_VIDEO_CONTROL_2,\n  ITF_NUM_VIDEO_STREAMING_2,\n  ITF_NUM_TOTAL\n};\n\n#define EPNUM_VIDEO_IN_1    0x81\n#define EPNUM_VIDEO_IN_2    0x82\n\n#if defined(CFG_EXAMPLE_VIDEO_READONLY) && !defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)\n  #define USE_MJPEG 1\n#else\n  #define USE_MJPEG 0\n#endif\n\n#define USE_ISO_STREAMING (!CFG_TUD_VIDEO_STREAMING_BULK)\n\ntypedef struct TU_ATTR_PACKED {\n  tusb_desc_interface_t itf;\n  tusb_desc_video_control_header_1itf_t header;\n  tusb_desc_video_control_camera_terminal_t camera_terminal;\n  tusb_desc_video_control_output_terminal_t output_terminal;\n} uvc_control_desc_t;\n\n/* Windows support YUY2 and NV12\n * https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/usb-video-class-driver-overview */\n\ntypedef struct TU_ATTR_PACKED {\n  tusb_desc_interface_t itf;\n  tusb_desc_video_streaming_input_header_1byte_t header;\n  tusb_desc_video_format_uncompressed_t format;\n  tusb_desc_video_frame_uncompressed_continuous_t frame;\n  tusb_desc_video_streaming_color_matching_t color;\n\n#if USE_ISO_STREAMING\n  // For ISO streaming, USB spec requires to alternate interface\n  tusb_desc_interface_t itf_alt;\n#endif\n\n  tusb_desc_endpoint_t ep;\n} uvc_streaming_yuy2_desc_t;\n\ntypedef struct TU_ATTR_PACKED {\n  tusb_desc_interface_t itf;\n  tusb_desc_video_streaming_input_header_1byte_t header;\n  tusb_desc_video_format_mjpeg_t format;\n  tusb_desc_video_frame_mjpeg_continuous_t frame;\n  tusb_desc_video_streaming_color_matching_t color;\n\n#if USE_ISO_STREAMING\n  // For ISO streaming, USB spec requires to alternate interface\n  tusb_desc_interface_t itf_alt;\n#endif\n\n  tusb_desc_endpoint_t ep;\n} uvc_streaming_mpeg_desc_t;\n\ntypedef struct TU_ATTR_PACKED {\n  tusb_desc_configuration_t config;\n\n  struct TU_ATTR_PACKED {\n    tusb_desc_interface_assoc_t iad;\n    uvc_control_desc_t video_control;\n    uvc_streaming_yuy2_desc_t video_streaming;\n  } uvc_yuy2;\n\n  struct TU_ATTR_PACKED {\n    tusb_desc_interface_assoc_t iad;\n    uvc_control_desc_t video_control;\n    uvc_streaming_mpeg_desc_t video_streaming;\n  } uvc_mpeg;\n} uvc_cfg_desc_t;\n\nconst uvc_cfg_desc_t desc_fs_configuration = {\n    .config = {\n        .bLength = sizeof(tusb_desc_configuration_t),\n        .bDescriptorType = TUSB_DESC_CONFIGURATION,\n\n        .wTotalLength = sizeof(uvc_cfg_desc_t),\n        .bNumInterfaces = ITF_NUM_TOTAL,\n        .bConfigurationValue = 1,\n        .iConfiguration = 0,\n        .bmAttributes =  TU_BIT(7),\n        .bMaxPower = 100 / 2\n    },\n    //------------- Stream 0: YUY2 -------------//\n    .uvc_yuy2 = {\n        .iad = {\n            .bLength = sizeof(tusb_desc_interface_assoc_t),\n            .bDescriptorType = TUSB_DESC_INTERFACE_ASSOCIATION,\n\n            .bFirstInterface = ITF_NUM_VIDEO_CONTROL_1,\n            .bInterfaceCount = 2,\n            .bFunctionClass = TUSB_CLASS_VIDEO,\n            .bFunctionSubClass = VIDEO_SUBCLASS_INTERFACE_COLLECTION,\n            .bFunctionProtocol = VIDEO_ITF_PROTOCOL_UNDEFINED,\n            .iFunction = 0\n        },\n        .video_control = {\n            .itf = {\n                .bLength = sizeof(tusb_desc_interface_t),\n                .bDescriptorType = TUSB_DESC_INTERFACE,\n\n                .bInterfaceNumber = ITF_NUM_VIDEO_CONTROL_1,\n                .bAlternateSetting = 0,\n                .bNumEndpoints = 0,\n                .bInterfaceClass = TUSB_CLASS_VIDEO,\n                .bInterfaceSubClass = VIDEO_SUBCLASS_CONTROL,\n                .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n                .iInterface = STRID_UVC_CONTROL_1\n            },\n            .header = {\n                .bLength = sizeof(tusb_desc_video_control_header_1itf_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VC_HEADER,\n\n                .bcdUVC = VIDEO_BCD_1_50,\n                .wTotalLength = sizeof(uvc_control_desc_t) - sizeof(tusb_desc_interface_t), // CS VC descriptors only\n                .dwClockFrequency = UVC_CLOCK_FREQUENCY,\n                .bInCollection = 1,\n                .baInterfaceNr = {ITF_NUM_VIDEO_STREAMING_1}\n            },\n            .camera_terminal = {\n                .bLength = sizeof(tusb_desc_video_control_camera_terminal_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VC_INPUT_TERMINAL,\n\n                .bTerminalID = UVC_ENTITY_CAP_INPUT_TERMINAL,\n                .wTerminalType = VIDEO_ITT_CAMERA,\n                .bAssocTerminal = 0,\n                .iTerminal = 0,\n                .wObjectiveFocalLengthMin = 0,\n                .wObjectiveFocalLengthMax = 0,\n                .wOcularFocalLength = 0,\n                .bControlSize = 3,\n                .bmControls = {0, 0, 0}\n            },\n            .output_terminal = {\n                .bLength = sizeof(tusb_desc_video_control_output_terminal_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VC_OUTPUT_TERMINAL,\n\n                .bTerminalID = UVC_ENTITY_CAP_OUTPUT_TERMINAL,\n                .wTerminalType = VIDEO_TT_STREAMING,\n                .bAssocTerminal = 0,\n                .bSourceID = UVC_ENTITY_CAP_INPUT_TERMINAL,\n                .iTerminal = 0\n            }\n        },\n\n        .video_streaming = {\n            .itf = {\n                .bLength = sizeof(tusb_desc_interface_t),\n                .bDescriptorType = TUSB_DESC_INTERFACE,\n\n                .bInterfaceNumber = ITF_NUM_VIDEO_STREAMING_1,\n                .bAlternateSetting = 0,\n                .bNumEndpoints = CFG_TUD_VIDEO_STREAMING_BULK, // bulk 1, iso 0\n                .bInterfaceClass = TUSB_CLASS_VIDEO,\n                .bInterfaceSubClass = VIDEO_SUBCLASS_STREAMING,\n                .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n                .iInterface = STRID_UVC_STREAMING_1\n            },\n            .header = {\n                .bLength = sizeof(tusb_desc_video_streaming_input_header_1byte_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VS_INPUT_HEADER,\n\n                .bNumFormats = 1,\n                .wTotalLength = sizeof(uvc_streaming_yuy2_desc_t) - sizeof(tusb_desc_interface_t)\n                                - sizeof(tusb_desc_endpoint_t) -\n                                (USE_ISO_STREAMING ? sizeof(tusb_desc_interface_t) : 0), // CS VS descriptors only\n                .bEndpointAddress = EPNUM_VIDEO_IN_1,\n                .bmInfo = 0,\n                .bTerminalLink = UVC_ENTITY_CAP_OUTPUT_TERMINAL,\n                .bStillCaptureMethod = 0,\n                .bTriggerSupport = 0,\n                .bTriggerUsage = 0,\n                .bControlSize = 1,\n                .bmaControls = {0}\n            },\n            .format = {\n                .bLength = sizeof(tusb_desc_video_format_uncompressed_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED,\n                .bFormatIndex = 1, // 1-based index\n                .bNumFrameDescriptors = 1,\n                .guidFormat = {TUD_VIDEO_GUID_YUY2},\n                .bBitsPerPixel = 16,\n                .bDefaultFrameIndex = 1,\n                .bAspectRatioX = 0,\n                .bAspectRatioY = 0,\n                .bmInterlaceFlags = 0,\n                .bCopyProtect = 0\n            },\n            .frame = {\n                .bLength = sizeof(tusb_desc_video_frame_uncompressed_continuous_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VS_FRAME_UNCOMPRESSED,\n                .bFrameIndex = 1, // 1-based index\n                .bmCapabilities = 0,\n                .wWidth = FRAME_WIDTH,\n                .wHeight = FRAME_HEIGHT,\n                .dwMinBitRate = FRAME_WIDTH * FRAME_HEIGHT * 16 * 1,\n                .dwMaxBitRate = FRAME_WIDTH * FRAME_HEIGHT * 16 * FRAME_RATE,\n                .dwMaxVideoFrameBufferSize = FRAME_WIDTH * FRAME_HEIGHT * 16 / 8,\n                .dwDefaultFrameInterval = 10000000 / FRAME_RATE,\n                .bFrameIntervalType = 0, // continuous\n                .dwFrameInterval = {\n                    10000000 / FRAME_RATE, // min\n                    10000000, // max\n                    10000000 / FRAME_RATE // step\n                }\n            },\n            .color = {\n                .bLength = sizeof(tusb_desc_video_streaming_color_matching_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VS_COLORFORMAT,\n\n                .bColorPrimaries = VIDEO_COLOR_PRIMARIES_BT709,\n                .bTransferCharacteristics = VIDEO_COLOR_XFER_CH_BT709,\n                .bMatrixCoefficients = VIDEO_COLOR_COEF_SMPTE170M\n            },\n\n#if USE_ISO_STREAMING\n            .itf_alt = {\n                .bLength = sizeof(tusb_desc_interface_t),\n                .bDescriptorType = TUSB_DESC_INTERFACE,\n\n                .bInterfaceNumber = ITF_NUM_VIDEO_STREAMING_1,\n                .bAlternateSetting = 1,\n                .bNumEndpoints = 1,\n                .bInterfaceClass = TUSB_CLASS_VIDEO,\n                .bInterfaceSubClass = VIDEO_SUBCLASS_STREAMING,\n                .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n                .iInterface = STRID_UVC_STREAMING_1\n            },\n#endif\n            .ep = {\n                .bLength = sizeof(tusb_desc_endpoint_t),\n                .bDescriptorType = TUSB_DESC_ENDPOINT,\n\n                .bEndpointAddress = EPNUM_VIDEO_IN_1,\n                .bmAttributes = {\n                    .xfer = CFG_TUD_VIDEO_STREAMING_BULK ? TUSB_XFER_BULK : TUSB_XFER_ISOCHRONOUS,\n                    .sync = CFG_TUD_VIDEO_STREAMING_BULK ? 0 : 1 // asynchronous\n                },\n                .wMaxPacketSize = CFG_TUD_VIDEO_STREAMING_BULK ? 64 : CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE,\n                .bInterval = 1\n            }\n        }\n    },\n      //------------- Stream 1: MPEG -------------//\n    .uvc_mpeg = {\n        .iad = {\n            .bLength = sizeof(tusb_desc_interface_assoc_t),\n            .bDescriptorType = TUSB_DESC_INTERFACE_ASSOCIATION,\n\n            .bFirstInterface = ITF_NUM_VIDEO_CONTROL_2,\n            .bInterfaceCount = 2,\n            .bFunctionClass = TUSB_CLASS_VIDEO,\n            .bFunctionSubClass = VIDEO_SUBCLASS_INTERFACE_COLLECTION,\n            .bFunctionProtocol = VIDEO_ITF_PROTOCOL_UNDEFINED,\n            .iFunction = 0\n        },\n\n        .video_control = {\n            .itf = {\n                .bLength = sizeof(tusb_desc_interface_t),\n                .bDescriptorType = TUSB_DESC_INTERFACE,\n\n                .bInterfaceNumber = ITF_NUM_VIDEO_CONTROL_2,\n                .bAlternateSetting = 0,\n                .bNumEndpoints = 0,\n                .bInterfaceClass = TUSB_CLASS_VIDEO,\n                .bInterfaceSubClass = VIDEO_SUBCLASS_CONTROL,\n                .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n                .iInterface = STRID_UVC_CONTROL_2\n            },\n            .header = {\n                .bLength = sizeof(tusb_desc_video_control_header_1itf_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VC_HEADER,\n\n                .bcdUVC = VIDEO_BCD_1_50,\n                .wTotalLength = sizeof(uvc_control_desc_t) - sizeof(tusb_desc_interface_t), // CS VC descriptors only\n                .dwClockFrequency = UVC_CLOCK_FREQUENCY,\n                .bInCollection = 1,\n                .baInterfaceNr = { ITF_NUM_VIDEO_STREAMING_2 }\n            },\n            .camera_terminal = {\n                .bLength = sizeof(tusb_desc_video_control_camera_terminal_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VC_INPUT_TERMINAL,\n\n                .bTerminalID = UVC_ENTITY_CAP_INPUT_TERMINAL,\n                .wTerminalType = VIDEO_ITT_CAMERA,\n                .bAssocTerminal = 0,\n                .iTerminal = 0,\n                .wObjectiveFocalLengthMin = 0,\n                .wObjectiveFocalLengthMax = 0,\n                .wOcularFocalLength = 0,\n                .bControlSize = 3,\n                .bmControls = { 0, 0, 0 }\n            },\n            .output_terminal = {\n                .bLength = sizeof(tusb_desc_video_control_output_terminal_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VC_OUTPUT_TERMINAL,\n\n                .bTerminalID = UVC_ENTITY_CAP_OUTPUT_TERMINAL,\n                .wTerminalType = VIDEO_TT_STREAMING,\n                .bAssocTerminal = 0,\n                .bSourceID = UVC_ENTITY_CAP_INPUT_TERMINAL,\n                .iTerminal = 0\n            }\n        },\n\n        .video_streaming = {\n            .itf = {\n                .bLength = sizeof(tusb_desc_interface_t),\n                .bDescriptorType = TUSB_DESC_INTERFACE,\n\n                .bInterfaceNumber = ITF_NUM_VIDEO_STREAMING_2,\n                .bAlternateSetting = 0,\n                .bNumEndpoints = CFG_TUD_VIDEO_STREAMING_BULK, // bulk 1, iso 0\n                .bInterfaceClass = TUSB_CLASS_VIDEO,\n                .bInterfaceSubClass = VIDEO_SUBCLASS_STREAMING,\n                .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n                .iInterface = STRID_UVC_STREAMING_2\n            },\n            .header = {\n                .bLength = sizeof(tusb_desc_video_streaming_input_header_1byte_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VS_INPUT_HEADER,\n\n                .bNumFormats = 1,\n                .wTotalLength = sizeof(uvc_streaming_mpeg_desc_t) - sizeof(tusb_desc_interface_t)\n                                - sizeof(tusb_desc_endpoint_t) - (USE_ISO_STREAMING ? sizeof(tusb_desc_interface_t) : 0) , // CS VS descriptors only\n                .bEndpointAddress = EPNUM_VIDEO_IN_2,\n                .bmInfo = 0,\n                .bTerminalLink = UVC_ENTITY_CAP_OUTPUT_TERMINAL,\n                .bStillCaptureMethod = 0,\n                .bTriggerSupport = 0,\n                .bTriggerUsage = 0,\n                .bControlSize = 1,\n                .bmaControls = { 0 }\n            },\n            .format = {\n                .bLength = sizeof(tusb_desc_video_format_mjpeg_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VS_FORMAT_MJPEG,\n                .bFormatIndex = 1, // 1-based index\n                .bNumFrameDescriptors = 1,\n                .bmFlags = 0,\n                .bDefaultFrameIndex = 1,\n                .bAspectRatioX = 0,\n                .bAspectRatioY = 0,\n                .bmInterlaceFlags = 0,\n                .bCopyProtect = 0\n            },\n            .frame = {\n                .bLength = sizeof(tusb_desc_video_frame_mjpeg_continuous_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VS_FRAME_MJPEG,\n                .bFrameIndex = 1, // 1-based index\n                .bmCapabilities = 0,\n                .wWidth = FRAME_WIDTH,\n                .wHeight = FRAME_HEIGHT,\n                .dwMinBitRate = FRAME_WIDTH * FRAME_HEIGHT * 16 * 1,\n                .dwMaxBitRate = FRAME_WIDTH * FRAME_HEIGHT * 16 * FRAME_RATE,\n                .dwMaxVideoFrameBufferSize = FRAME_WIDTH * FRAME_HEIGHT * 16 / 8,\n                .dwDefaultFrameInterval = 10000000 / FRAME_RATE,\n                .bFrameIntervalType = 0, // continuous\n                .dwFrameInterval = {\n                    10000000 / FRAME_RATE, // min\n                    10000000, // max\n                    10000000 / FRAME_RATE // step\n                }\n            },\n            .color = {\n                .bLength = sizeof(tusb_desc_video_streaming_color_matching_t),\n                .bDescriptorType = TUSB_DESC_CS_INTERFACE,\n                .bDescriptorSubType = VIDEO_CS_ITF_VS_COLORFORMAT,\n\n                .bColorPrimaries = VIDEO_COLOR_PRIMARIES_BT709,\n                .bTransferCharacteristics = VIDEO_COLOR_XFER_CH_BT709,\n                .bMatrixCoefficients = VIDEO_COLOR_COEF_SMPTE170M\n            },\n\n#if USE_ISO_STREAMING\n            .itf_alt = {\n                .bLength = sizeof(tusb_desc_interface_t),\n                .bDescriptorType = TUSB_DESC_INTERFACE,\n\n                .bInterfaceNumber = ITF_NUM_VIDEO_STREAMING_2,\n                .bAlternateSetting = 1,\n                .bNumEndpoints = 1,\n                .bInterfaceClass = TUSB_CLASS_VIDEO,\n                .bInterfaceSubClass = VIDEO_SUBCLASS_STREAMING,\n                .bInterfaceProtocol = VIDEO_ITF_PROTOCOL_15,\n                .iInterface = STRID_UVC_STREAMING_2\n            },\n#endif\n            .ep = {\n                .bLength = sizeof(tusb_desc_endpoint_t),\n                .bDescriptorType = TUSB_DESC_ENDPOINT,\n\n                .bEndpointAddress = EPNUM_VIDEO_IN_2,\n                .bmAttributes = {\n                    .xfer = CFG_TUD_VIDEO_STREAMING_BULK ? TUSB_XFER_BULK : TUSB_XFER_ISOCHRONOUS,\n                    .sync = CFG_TUD_VIDEO_STREAMING_BULK ? 0 : 1 // asynchronous\n                },\n                .wMaxPacketSize = CFG_TUD_VIDEO_STREAMING_BULK ? 64 : CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE,\n                .bInterval = 1\n            }\n        }\n    }\n};\n\n#if TUD_OPT_HIGH_SPEED\nuvc_cfg_desc_t desc_hs_configuration;\n\nstatic uint8_t * get_hs_configuration_desc(void) {\n  static bool init = false;\n\n  if (!init) {\n    desc_hs_configuration = desc_fs_configuration;\n    // change endpoint bulk size to 512 if bulk streaming\n    if (CFG_TUD_VIDEO_STREAMING_BULK) {\n      desc_hs_configuration.uvc_yuy2.video_streaming.ep.wMaxPacketSize = 512;\n      desc_hs_configuration.uvc_mpeg.video_streaming.ep.wMaxPacketSize = 512;\n    }\n  }\n  init = true;\n\n  return (uint8_t *) &desc_hs_configuration;\n}\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n    .bLength            = sizeof(tusb_desc_device_qualifier_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n    .bcdUSB             = USB_BCD,\n\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n    .bNumConfigurations = 0x01,\n    .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const*) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n  // if link speed is high return fullspeed config, and vice versa\n  if (tud_speed_get() == TUSB_SPEED_HIGH) {\n    return (uint8_t const*) &desc_fs_configuration;\n  } else {\n    return get_hs_configuration_desc();\n  }\n}\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const* tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  if (tud_speed_get() == TUSB_SPEED_HIGH) {\n    return get_hs_configuration_desc();\n  } else\n#endif\n  {\n    return (uint8_t const*) &desc_fs_configuration;\n  }\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (index >= sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) return NULL;\n\n      const char* str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/video_capture_2ch/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenbreg\n * Copyright (c) 2021 Koji KITAYAMA\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef _USB_DESCRIPTORS_H_\n#define _USB_DESCRIPTORS_H_\n\n#define FRAME_WIDTH   128\n#define FRAME_HEIGHT  96\n#define FRAME_RATE    10\n\n// NOTE: descriptor template is not used but leave here as reference\n\n#define TUD_VIDEO_CAPTURE_DESC_UNCOMPR_LEN (\\\n    TUD_VIDEO_DESC_IAD_LEN\\\n    /* control */\\\n    + TUD_VIDEO_DESC_STD_VC_LEN\\\n    + (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\\\n    + TUD_VIDEO_DESC_CAMERA_TERM_LEN\\\n    + TUD_VIDEO_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\\\n    + TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\\\n    /* Interface 1, Alternate 1 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + 7/* Endpoint */\\\n  )\n\n#define TUD_VIDEO_CAPTURE_DESC_MJPEG_LEN (\\\n    TUD_VIDEO_DESC_IAD_LEN\\\n    /* control */\\\n    + TUD_VIDEO_DESC_STD_VC_LEN\\\n    + (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\\\n    + TUD_VIDEO_DESC_CAMERA_TERM_LEN\\\n    + TUD_VIDEO_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\\\n    + TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\\\n    /* Interface 1, Alternate 1 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + 7/* Endpoint */\\\n  )\n\n#define TUD_VIDEO_CAPTURE_DESC_UNCOMPR_BULK_LEN (\\\n    TUD_VIDEO_DESC_IAD_LEN\\\n    /* control */\\\n    + TUD_VIDEO_DESC_STD_VC_LEN\\\n    + (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\\\n    + TUD_VIDEO_DESC_CAMERA_TERM_LEN\\\n    + TUD_VIDEO_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\\\n    + TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\\\n    + 7/* Endpoint */\\\n  )\n\n#define TUD_VIDEO_CAPTURE_DESC_MJPEG_BULK_LEN (\\\n    TUD_VIDEO_DESC_IAD_LEN\\\n    /* control */\\\n    + TUD_VIDEO_DESC_STD_VC_LEN\\\n    + (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\\\n    + TUD_VIDEO_DESC_CAMERA_TERM_LEN\\\n    + TUD_VIDEO_DESC_OUTPUT_TERM_LEN\\\n    /* Interface 1, Alternate 0 */\\\n    + TUD_VIDEO_DESC_STD_VS_LEN\\\n    + (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\\\n    + TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN\\\n    + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\\\n    + 7/* Endpoint */\\\n  )\n\n/* Windows support YUY2 and NV12\n * https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/usb-video-class-driver-overview */\n\n#define TUD_VIDEO_DESC_CS_VS_FMT_YUY2(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_YUY2, 16, _frmidx, _asrx, _asry, _interlace, _cp)\n#define TUD_VIDEO_DESC_CS_VS_FMT_NV12(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_NV12, 12, _frmidx, _asrx, _asry, _interlace, _cp)\n#define TUD_VIDEO_DESC_CS_VS_FMT_M420(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_M420, 12, _frmidx, _asrx, _asry, _interlace, _cp)\n#define TUD_VIDEO_DESC_CS_VS_FMT_I420(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_I420, 12, _frmidx, _asrx, _asry, _interlace, _cp)\n\n#define TUD_VIDEO_CAPTURE_DESCRIPTOR_UNCOMPR(_stridx, _epin, _width, _height, _fps, _epsize) \\\n  TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \\\n  /* Video control 0 */ \\\n  TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx),                                  \\\n    /* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \\\n    TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \\\n      /* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \\\n      TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \\\n      TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \\\n  /* Video stream alt. 0 */ \\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 0, _stridx), \\\n    /* Video stream header for without still image capture */ \\\n    TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \\\n        /*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\\\n        _epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \\\n        /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \\\n        /*bmaControls(1)*/0), \\\n      /* Video stream format */ \\\n      TUD_VIDEO_DESC_CS_VS_FMT_YUY2(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \\\n        /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \\\n        /* Video stream frame format */ \\\n        TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT(/*bFrameIndex */1, 0, _width, _height, \\\n            _width * _height * 16, _width * _height * 16 * _fps, \\\n            _width * _height * 16 / 8, \\\n            (10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \\\n        TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \\\n  /* VS alt 1 */\\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 1, 1, _stridx), \\\n    /* EP */ \\\n    TUD_VIDEO_DESC_EP_ISO(_epin, _epsize, 1)\n\n#define TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG(_stridx, _epin, _width, _height, _fps, _epsize) \\\n  TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \\\n  /* Video control 0 */ \\\n  TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx),                                \\\n    /* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \\\n    TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \\\n      /* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \\\n      TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \\\n      TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \\\n  /* Video stream alt. 0 */ \\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 0, _stridx), \\\n    /* Video stream header for without still image capture */ \\\n    TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \\\n        /*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\\\n        _epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \\\n        /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \\\n        /*bmaControls(1)*/0), \\\n      /* Video stream format */ \\\n      TUD_VIDEO_DESC_CS_VS_FMT_MJPEG(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \\\n        /*bmFlags*/0, /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \\\n        /* Video stream frame format */ \\\n        TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT(/*bFrameIndex */1, 0, _width, _height, \\\n            _width * _height * 16, _width * _height * 16 * _fps, \\\n            _width * _height * 16 / 8, \\\n            (10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \\\n        TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \\\n  /* VS alt 1 */\\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 1, 1, _stridx), \\\n    /* EP */ \\\n    TUD_VIDEO_DESC_EP_ISO(_epin, _epsize, 1)\n\n\n#define TUD_VIDEO_CAPTURE_DESCRIPTOR_UNCOMPR_BULK(_stridx, _epin, _width, _height, _fps, _epsize) \\\n  TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \\\n  /* Video control 0 */ \\\n  TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \\\n    /* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \\\n    TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \\\n      /* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \\\n      TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \\\n      TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \\\n  /* Video stream alt. 0 */ \\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 1, _stridx), \\\n    /* Video stream header for without still image capture */ \\\n    TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \\\n        /*wTotalLength - bLength */\\\n        TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\\\n        _epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \\\n        /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \\\n        /*bmaControls(1)*/0), \\\n      /* Video stream format */ \\\n      TUD_VIDEO_DESC_CS_VS_FMT_YUY2(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \\\n        /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \\\n        /* Video stream frame format */ \\\n        TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT(/*bFrameIndex */1, 0, _width, _height, \\\n            _width * _height * 16, _width * _height * 16 * _fps, \\\n            _width * _height * 16 / 8, \\\n            (10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \\\n        TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \\\n        TUD_VIDEO_DESC_EP_BULK(_epin, _epsize, 1)\n\n#define TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG_BULK(_stridx, _epin, _width, _height, _fps, _epsize) \\\n  TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \\\n  /* Video control 0 */ \\\n  TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx),                                     \\\n    /* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \\\n    TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \\\n      /* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \\\n      TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \\\n      TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, UVC_ENTITY_CAP_INPUT_TERMINAL, 0), \\\n  /* Video stream alt. 0 */ \\\n  TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 1, _stridx), \\\n    /* Video stream header for without still image capture */ \\\n    TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \\\n        /*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\\\n        _epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \\\n        /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \\\n        /*bmaControls(1)*/0), \\\n      /* Video stream format */ \\\n      TUD_VIDEO_DESC_CS_VS_FMT_MJPEG(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \\\n        /*bmFlags*/0, /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \\\n        /* Video stream frame format */ \\\n        TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT(/*bFrameIndex */1, 0, _width, _height, \\\n            _width * _height * 16, _width * _height * 16 * _fps, \\\n            _width * _height * 16 / 8, \\\n            (10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \\\n        TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \\\n        /* EP */ \\\n        TUD_VIDEO_DESC_EP_BULK(_epin, _epsize, 1)\n\n\n#endif\n"
  },
  {
    "path": "examples/device/webusb_serial/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(webusb_serial C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/device/webusb_serial/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/device/webusb_serial/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/device/webusb_serial/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\" \"usb_descriptors.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/device/webusb_serial/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* This example demonstrates WebUSB as web serial with browser with WebUSB support (e.g Chrome).\n * After enumerated successfully, browser will pop-up notification\n * with URL to landing page, click on it to test\n *  - Click \"Connect\" and select device, When connected the on-board LED will litted up.\n *  - Any charters received from either webusb/Serial will be echo back to webusb and Serial\n *\n * Note:\n * - The WebUSB landing page notification is currently disabled in Chrome\n * on Windows due to Chromium issue 656702 (https://crbug.com/656702). You have to\n * go to landing page (below) to test\n *\n * - On Windows 7 and prior: You need to use Zadig tool to manually bind the\n * WebUSB interface with the WinUSB driver for Chrome to access. From windows 8 and 10, this\n * is done automatically by firmware.\n *\n * - On Linux/macOS, udev permission may need to be updated by\n *   - copying '/examples/device/99-tinyusb.rules' file to /etc/udev/rules.d/ then\n *   - run 'sudo udevadm control --reload-rules && sudo udevadm trigger'\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED     = 1000,\n  BLINK_SUSPENDED   = 2500,\n\n  BLINK_ALWAYS_ON   = UINT32_MAX,\n  BLINK_ALWAYS_OFF  = 0\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n#define URL  \"example.tinyusb.org/webusb-serial/index.html\"\n\nconst tusb_desc_webusb_url_t desc_url = {\n  .bLength         = 3 + sizeof(URL) - 1,\n  .bDescriptorType = 3, // WEBUSB URL type\n  .bScheme         = 1, // 0: http, 1: https\n  .url             = URL\n};\n\nstatic bool web_serial_connected = false;\n\n//------------- prototypes -------------//\nvoid led_blinking_task(void);\nvoid cdc_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    tud_cdc_write_flush();\n    led_blinking_task();\n  }\n}\n\n// send characters to both CDC and WebUSB\nstatic void echo_all(const uint8_t buf[], uint32_t count) {\n  // echo to web serial\n  if (web_serial_connected) {\n    tud_vendor_write(buf, count);\n    tud_vendor_write_flush();\n  }\n\n  // echo to cdc\n  if (tud_cdc_connected()) {\n    tud_cdc_write(buf, count);\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void)remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// WebUSB use vendor class\n//--------------------------------------------------------------------+\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const* request) {\n  // nothing to with DATA & ACK stage\n  if (stage != CONTROL_STAGE_SETUP) {\n    return true;\n  }\n\n  switch (request->bmRequestType_bit.type) {\n    case TUSB_REQ_TYPE_VENDOR:\n      switch (request->bRequest) {\n        case VENDOR_REQUEST_WEBUSB:\n          // match vendor request in BOS descriptor\n          // Get landing page url\n          return tud_control_xfer(rhport, request, (void*)(uintptr_t)&desc_url, desc_url.bLength);\n\n        case VENDOR_REQUEST_MICROSOFT:\n          if (request->wIndex == 7) {\n            // Get Microsoft OS 2.0 compatible descriptor\n            uint16_t total_len;\n            memcpy(&total_len, desc_ms_os_20 + 8, 2);\n\n            return tud_control_xfer(rhport, request, (void*)(uintptr_t)desc_ms_os_20, total_len);\n          } else {\n            return false;\n          }\n\n        default: break;\n      }\n      break;\n\n    case TUSB_REQ_TYPE_CLASS:\n      if (request->bRequest == 0x22) {\n        // Webserial simulate the CDC_REQUEST_SET_CONTROL_LINE_STATE (0x22) to connect and disconnect.\n        web_serial_connected = (request->wValue != 0);\n\n        // Always lit LED if connected\n        if (web_serial_connected) {\n          board_led_write(true);\n          blink_interval_ms = BLINK_ALWAYS_ON;\n\n          tud_vendor_write_str(\"\\r\\nWebUSB interface connected\\r\\n\");\n          tud_vendor_write_flush();\n        } else {\n          tud_vendor_write_clear(); // anything left in the buffer is now thrown out\n          blink_interval_ms = BLINK_MOUNTED;\n        }\n\n        // response with status OK\n        return tud_control_status(rhport, request);\n      }\n      break;\n\n    default: break;\n  }\n\n  // stall unknown request\n  return false;\n}\n\nvoid tud_vendor_rx_cb(uint8_t idx, const uint8_t *buffer, uint32_t bufsize) {\n  (void)idx;\n  (void)buffer;\n  (void)bufsize;\n\n  while (tud_vendor_available()) {\n    uint8_t        buf[64];\n    const uint32_t count = tud_vendor_read(buf, sizeof(buf));\n    echo_all(buf, count);\n  }\n}\n\n//--------------------------------------------------------------------+\n// USB CDC\n//--------------------------------------------------------------------+\n\n// Invoked when cdc when line state changed e.g connected/disconnected\nvoid tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {\n  (void)itf;\n\n  // connected\n  if (dtr && rts) {\n    // print initial message when connected\n    tud_cdc_write_str(\"\\r\\nTinyUSB WebUSB device example\\r\\n\");\n  }\n}\n\n// Invoked when CDC interface received data from host\nvoid tud_cdc_rx_cb(uint8_t idx) {\n  (void)idx;\n  while (tud_cdc_available()) {\n    uint8_t        buf[64];\n    const uint32_t count = tud_cdc_read(buf, sizeof(buf));\n    echo_all(buf, count); // echo back to both web serial and cdc\n  }\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/device/webusb_serial/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC               1\n#define CFG_TUD_MSC               0\n#define CFG_TUD_HID               0\n#define CFG_TUD_MIDI              0\n#define CFG_TUD_VENDOR            1\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE    (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE    (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// Vendor FIFO size of TX and RX\n// If zero: vendor endpoints will not be buffered\n#define CFG_TUD_VENDOR_RX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_VENDOR_TX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/device/webusb_serial/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"usb_descriptors.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]       MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0210, // at least 2.1 or 3.x for BOS & webUSB\n\n    // Use Interface Association Descriptor (IAD) for CDC\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\nenum\n{\n  ITF_NUM_CDC = 0,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_VENDOR,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN + TUD_VENDOR_DESC_LEN)\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In etc ...\n  #define EPNUM_CDC_NOTIF  0x81\n  #define EPNUM_CDC_OUT    0x02\n  #define EPNUM_CDC_IN     0x82\n\n  #define EPNUM_VENDOR_OUT 0x05\n  #define EPNUM_VENDOR_IN  0x85\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_CDC_NOTIF   0x83\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x81\n\n  #define EPNUM_VENDOR_OUT  0x05\n  #define EPNUM_VENDOR_IN   0x84\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n\n  #define EPNUM_VENDOR_OUT  0x04\n  #define EPNUM_VENDOR_IN   0x85\n\n#else\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n  #define EPNUM_VENDOR_OUT  0x03\n  #define EPNUM_VENDOR_IN   0x83\n#endif\n\nuint8_t const desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, 0x80 | EPNUM_CDC_IN, TUD_OPT_HIGH_SPEED ? 512 : 64),\n\n  // Interface number, string index, EP Out & IN address, EP size\n  TUD_VENDOR_DESCRIPTOR(ITF_NUM_VENDOR, 5, EPNUM_VENDOR_OUT, 0x80 | EPNUM_VENDOR_IN, TUD_OPT_HIGH_SPEED ? 512 : 64)\n};\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  (void) index; // for multiple configurations\n  return desc_configuration;\n}\n\n//--------------------------------------------------------------------+\n// BOS Descriptor\n//--------------------------------------------------------------------+\n\n/* Microsoft OS 2.0 registry property descriptor\nPer MS requirements https://msdn.microsoft.com/en-us/library/windows/hardware/hh450799(v=vs.85).aspx\ndevice should create DeviceInterfaceGUIDs. It can be done by driver and\nin case of real PnP solution device should expose MS \"Microsoft OS 2.0\nregistry property descriptor\". Such descriptor can insert any record\ninto Windows registry per device/configuration/interface. In our case it\nwill insert \"DeviceInterfaceGUIDs\" multistring property.\n\nGUID is freshly generated and should be OK to use.\n\nhttps://developers.google.com/web/fundamentals/native-hardware/build-for-webusb/\n(Section Microsoft OS compatibility descriptors)\n*/\n\n#define BOS_TOTAL_LEN      (TUD_BOS_DESC_LEN + TUD_BOS_WEBUSB_DESC_LEN + TUD_BOS_MICROSOFT_OS_DESC_LEN)\n\n#define MS_OS_20_DESC_LEN  0xB2\n\n// BOS Descriptor is required for webUSB\nuint8_t const desc_bos[] =\n{\n  // total length, number of device caps\n  TUD_BOS_DESCRIPTOR(BOS_TOTAL_LEN, 2),\n\n  // Vendor Code, iLandingPage\n  TUD_BOS_WEBUSB_DESCRIPTOR(VENDOR_REQUEST_WEBUSB, 1),\n\n  // Microsoft OS 2.0 descriptor\n  TUD_BOS_MS_OS_20_DESCRIPTOR(MS_OS_20_DESC_LEN, VENDOR_REQUEST_MICROSOFT)\n};\n\nuint8_t const * tud_descriptor_bos_cb(void)\n{\n  return desc_bos;\n}\n\n\nuint8_t const desc_ms_os_20[] =\n{\n  // Set header: length, type, windows version, total length\n  U16_TO_U8S_LE(0x000A), U16_TO_U8S_LE(MS_OS_20_SET_HEADER_DESCRIPTOR), U32_TO_U8S_LE(0x06030000), U16_TO_U8S_LE(MS_OS_20_DESC_LEN),\n\n  // Configuration subset header: length, type, configuration index, reserved, configuration total length\n  U16_TO_U8S_LE(0x0008), U16_TO_U8S_LE(MS_OS_20_SUBSET_HEADER_CONFIGURATION), 0, 0, U16_TO_U8S_LE(MS_OS_20_DESC_LEN-0x0A),\n\n  // Function Subset header: length, type, first interface, reserved, subset length\n  U16_TO_U8S_LE(0x0008), U16_TO_U8S_LE(MS_OS_20_SUBSET_HEADER_FUNCTION), ITF_NUM_VENDOR, 0, U16_TO_U8S_LE(MS_OS_20_DESC_LEN-0x0A-0x08),\n\n  // MS OS 2.0 Compatible ID descriptor: length, type, compatible ID, sub compatible ID\n  U16_TO_U8S_LE(0x0014), U16_TO_U8S_LE(MS_OS_20_FEATURE_COMPATBLE_ID), 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sub-compatible\n\n  // MS OS 2.0 Registry property descriptor: length, type\n  U16_TO_U8S_LE(MS_OS_20_DESC_LEN-0x0A-0x08-0x08-0x14), U16_TO_U8S_LE(MS_OS_20_FEATURE_REG_PROPERTY),\n  U16_TO_U8S_LE(0x0007), U16_TO_U8S_LE(0x002A), // wPropertyDataType, wPropertyNameLength and PropertyName \"DeviceInterfaceGUIDs\\0\" in UTF-16\n  'D', 0x00, 'e', 0x00, 'v', 0x00, 'i', 0x00, 'c', 0x00, 'e', 0x00, 'I', 0x00, 'n', 0x00, 't', 0x00, 'e', 0x00,\n  'r', 0x00, 'f', 0x00, 'a', 0x00, 'c', 0x00, 'e', 0x00, 'G', 0x00, 'U', 0x00, 'I', 0x00, 'D', 0x00, 's', 0x00, 0x00, 0x00,\n  U16_TO_U8S_LE(0x0050), // wPropertyDataLength\n\t//bPropertyData: “{975F44D9-0D08-43FD-8B3E-127CA8AFFF9D}”.\n  '{', 0x00, '9', 0x00, '7', 0x00, '5', 0x00, 'F', 0x00, '4', 0x00, '4', 0x00, 'D', 0x00, '9', 0x00, '-', 0x00,\n  '0', 0x00, 'D', 0x00, '0', 0x00, '8', 0x00, '-', 0x00, '4', 0x00, '3', 0x00, 'F', 0x00, 'D', 0x00, '-', 0x00,\n  '8', 0x00, 'B', 0x00, '3', 0x00, 'E', 0x00, '-', 0x00, '1', 0x00, '2', 0x00, '7', 0x00, 'C', 0x00, 'A', 0x00,\n  '8', 0x00, 'A', 0x00, 'F', 0x00, 'F', 0x00, 'F', 0x00, '9', 0x00, 'D', 0x00, '}', 0x00, 0x00, 0x00, 0x00, 0x00\n};\n\nTU_VERIFY_STATIC(sizeof(desc_ms_os_20) == MS_OS_20_DESC_LEN, \"Incorrect size\");\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] =\n{\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials will use unique ID if possible\n  \"TinyUSB CDC\",                 // 4: CDC Interface\n  \"TinyUSB WebUSB\"               // 5: Vendor Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch ( index ) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if ( !(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])) ) return NULL;\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if ( chr_count > max_count ) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for ( size_t i = 0; i < chr_count; i++ ) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/device/webusb_serial/src/usb_descriptors.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#ifndef USB_DESCRIPTORS_H_\n#define USB_DESCRIPTORS_H_\n\nenum\n{\n  VENDOR_REQUEST_WEBUSB = 1,\n  VENDOR_REQUEST_MICROSOFT = 2\n};\n\nextern uint8_t const desc_ms_os_20[];\n\n#endif /* USB_DESCRIPTORS_H_ */\n"
  },
  {
    "path": "examples/device/webusb_serial/website/application.js",
    "content": "'use strict';\n\n(async () => {\n  // bind to the html\n  const uiBody = document.body;\n  const uiToggleThemeBtn = document.getElementById('theme-toggle');\n\n  const uiConnectWebUsbSerialBtn = document.getElementById('connect_webusb_serial_btn');\n  const uiConnectSerialBtn = document.getElementById('connect_serial_btn');\n  const uiDisconnectBtn = document.getElementById('disconnect_btn');\n\n  const uiNewlineModeSelect = document.getElementById('newline_mode_select');\n  const uiAutoReconnectCheckbox = document.getElementById('auto_reconnect_checkbox');\n  const uiForgetDeviceBtn = document.getElementById('forget_device_btn');\n  const uiForgetAllDevicesBtn = document.getElementById('forget_all_devices_btn');\n  const uiResetAllBtn = document.getElementById('reset_all_btn');\n  const uiCopyOutputBtn = document.getElementById('copy_output_btn');\n  const uiDownloadOutputCsvBtn = document.getElementById('download_csv_output_btn');\n\n  const uiStatusSpan = document.getElementById('status_span');\n\n  const uiCommandHistoryClearBtn = document.getElementById('clear_command_history_btn');\n  const uiCommandHistoryScrollbox = document.getElementById('command_history_scrollbox');\n  const uiCommandLineInput = document.getElementById('command_line_input');\n  const uiSendModeBtn = document.getElementById('send_mode_btn');\n\n  const uiReceivedDataClearBtn = document.getElementById('clear_received_data_btn');\n  const uiReceivedDataScrollbox = document.getElementById('received_data_scrollbox');\n\n  const uiNearTheBottomThreshold = 100; // pixels from the bottom to trigger scroll\n\n  const maxCommandHistoryLength = 123; // max number of command history entries\n  const maxReceivedDataLength = 8192 / 8; // max number of received data entries\n\n  const THEME_STATES = ['auto', 'light', 'dark'];\n\n  /// https://stackoverflow.com/a/6234804/4479969\n  const escapeHtml = unsafe => {\n    if (typeof unsafe !== 'string') unsafe = String(unsafe);\n    return unsafe\n      .replaceAll(\"&\", \"&amp;\")\n      .replaceAll(\"<\", \"&lt;\")\n      .replaceAll(\">\", \"&gt;\")\n      .replaceAll('\"', \"&quot;\")\n      .replaceAll(\"'\", \"&#039;\");\n  };\n\n  class CommandHistoryEntry {\n    constructor(text) {\n      this.text = text;\n      this.time = Date.now();\n      this.count = 1;\n    }\n  }\n\n  class ReceivedDataEntry {\n    constructor(text) {\n      this.text = text;\n      this.time = Date.now();\n      this.terminated = false;\n    }\n  }\n\n  class Application {\n    constructor() {\n      this.currentPort = null;\n      this.textEncoder = new TextEncoder();\n      this.textDecoder = new TextDecoder();\n\n      this.reconnectTimeoutId = null;\n\n      this.commandHistory = [];\n      this.uiCommandHistoryIndex = -1;\n\n      this.receivedData = [];\n\n      // bind the UI elements\n      uiToggleThemeBtn.addEventListener('click', () => this.toggleTheme());\n      // Listener for OS Theme Changes\n      window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {\n        const currentPreference = localStorage.getItem('theme') || 'auto';\n        // Only act if the user is in automatic mode\n        if (currentPreference === 'auto') {\n          this.setTheme('auto');\n        }\n      });\n\n      uiConnectWebUsbSerialBtn.addEventListener('click', () => this.connectWebUsbSerialPort());\n      uiConnectSerialBtn.addEventListener('click', () => this.connectSerialPort());\n      uiDisconnectBtn.addEventListener('click', () => this.disconnectPort());\n      uiNewlineModeSelect.addEventListener('change', () => this.setNewlineMode());\n      uiAutoReconnectCheckbox.addEventListener('change', () => this.autoReconnectChanged());\n      uiForgetDeviceBtn.addEventListener('click', () => this.forgetPort());\n      uiForgetAllDevicesBtn.addEventListener('click', () => this.forgetAllPorts());\n      uiResetAllBtn.addEventListener('click', () => this.resetAll());\n      uiCopyOutputBtn.addEventListener('click', () => this.copyOutput());\n      uiDownloadOutputCsvBtn.addEventListener('click', () => this.downloadOutputCsv());\n      uiCommandHistoryClearBtn.addEventListener('click', () => this.clearCommandHistory());\n      uiCommandLineInput.addEventListener('keydown', (e) => this.handleCommandLineInput(e));\n      uiSendModeBtn.addEventListener('click', () => this.toggleSendMode());\n      uiReceivedDataClearBtn.addEventListener('click', () => this.clearReceivedData());\n\n      window.addEventListener('beforeunload', () => this.beforeUnloadHandler());\n\n      // restore state from localStorage\n      try {\n        this.restoreState();\n      } catch (error) {\n        console.error('Failed to restore state from localStorage', error);\n        this.resetAll();\n        this.restoreState();\n      }\n\n      this.updateUIConnectionState();\n      this.connectWebUsbSerialPort(true);\n    }\n\n    beforeUnloadHandler() {\n      // Save the scroll position of the command history and received data\n      localStorage.setItem('commandHistoryScrollTop', uiCommandHistoryScrollbox.scrollTop);\n      localStorage.setItem('receivedDataScrollTop', uiReceivedDataScrollbox.scrollTop);\n    }\n\n    restoreState() {\n      // Restore theme choice\n      const savedTheme = localStorage.getItem('theme');\n      if (savedTheme) {\n        this.setTheme(savedTheme);\n      }\n\n      // Restore command history\n      let savedCommandHistory = JSON.parse(localStorage.getItem('commandHistory') || '[]');\n      for (const cmd of savedCommandHistory) {\n        this.addCommandToHistoryUI(cmd);\n      }\n      // Restore scroll position for command history\n      const commandHistoryScrollTop = localStorage.getItem('commandHistoryScrollTop');\n      if (commandHistoryScrollTop) {\n        uiCommandHistoryScrollbox.scrollTop = parseInt(commandHistoryScrollTop, 10);\n      }\n\n      // Restore received data\n      let savedReceivedData = JSON.parse(localStorage.getItem('receivedData') || '[]');\n      for (let line of savedReceivedData) {\n        line.terminated = true;\n        this.addReceivedDataEntryUI(line);\n      }\n      // Restore scroll position for received data\n      const receivedDataScrollTop = localStorage.getItem('receivedDataScrollTop');\n      if (receivedDataScrollTop) {\n        uiReceivedDataScrollbox.scrollTop = parseInt(receivedDataScrollTop, 10);\n      }\n\n      this.sendMode = localStorage.getItem('sendMode') || 'command';\n      this.setSendMode(this.sendMode);\n\n      uiAutoReconnectCheckbox.checked = !(localStorage.getItem('autoReconnect') === 'false');\n\n      let savedNewlineMode = localStorage.getItem('newlineMode');\n      if (savedNewlineMode) {\n        uiNewlineModeSelect.value = savedNewlineMode;\n      }\n    }\n\n    setTheme(theme) {\n      const modeName = theme.charAt(0).toUpperCase() + theme.slice(1);\n      uiToggleThemeBtn.textContent = `Theme: ${modeName}`;\n\n      if (theme === 'auto') {\n        // In auto mode, we rely on the OS preference.\n        // We check the media query and add/remove the class accordingly.\n        const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;\n        if (prefersDark) {\n          uiBody.classList.add('dark-mode');\n        } else {\n          uiBody.classList.remove('dark-mode');\n        }\n      } else if (theme === 'light') {\n        // Force light mode by removing the class.\n        uiBody.classList.remove('dark-mode');\n      } else if (theme === 'dark') {\n        // Force dark mode by adding the class.\n        uiBody.classList.add('dark-mode');\n      }\n\n      // Save the theme to localStorage\n      localStorage.setItem('theme', theme);\n    }\n\n    toggleTheme() {\n      const currentTheme = localStorage.getItem('theme') || 'auto';\n      const nextThemeIndex = (THEME_STATES.indexOf(currentTheme) + 1) % THEME_STATES.length;\n      const nextTheme = THEME_STATES[nextThemeIndex];\n      this.setTheme(nextTheme);\n    }\n\n    addCommandToHistoryUI(commandHistoryEntry) {\n      let commandHistoryEntryBtn = null;\n\n      let lastCommandMatched = false;\n      if (this.commandHistory.length > 0) {\n        let lastCommandEntry = this.commandHistory[this.commandHistory.length - 1];\n        if (lastCommandEntry.text === commandHistoryEntry.text) {\n          lastCommandEntry.count++;\n          lastCommandEntry.time = Date.now();\n          lastCommandMatched = true;\n\n          // Update the last command entry\n          commandHistoryEntryBtn = uiCommandHistoryScrollbox.lastElementChild;\n          let time_str = new Date(lastCommandEntry.time).toLocaleString();\n          commandHistoryEntryBtn.querySelector('.command-history-entry-time').textContent = time_str;\n          commandHistoryEntryBtn.querySelector('.command-history-entry-text').textContent = lastCommandEntry.text;\n          commandHistoryEntryBtn.querySelector('.command-history-entry-count').textContent = '×' + lastCommandEntry.count;\n        }\n      }\n      if (!lastCommandMatched) {\n        this.commandHistory.push(commandHistoryEntry);\n\n        // Create a new command history entry\n        commandHistoryEntryBtn = document.createElement('button');\n        commandHistoryEntryBtn.className = 'command-history-entry';\n        commandHistoryEntryBtn.type = 'button';\n        let time_str = new Date(commandHistoryEntry.time).toLocaleString();\n        commandHistoryEntryBtn.innerHTML = `\n          <span class=\"command-history-entry-time\">${escapeHtml(time_str)}</span>\n          <span class=\"command-history-entry-text\">${escapeHtml(commandHistoryEntry.text)}</span>\n          <span class=\"command-history-entry-count\">×${escapeHtml(commandHistoryEntry.count)}</span>\n        `;\n        commandHistoryEntryBtn.addEventListener('click', () => {\n          if (uiCommandLineInput.disabled) return;\n          uiCommandLineInput.value = commandHistoryEntry.text;\n          uiCommandLineInput.focus();\n        });\n\n        uiCommandHistoryScrollbox.appendChild(commandHistoryEntryBtn);\n      }\n\n      // Limit the command history length\n      while (this.commandHistory.length > maxCommandHistoryLength) {\n        this.commandHistory.shift();\n        uiCommandHistoryScrollbox.removeChild(uiCommandHistoryScrollbox.firstElementChild);\n      }\n    }\n\n    appendNewCommandToHistory(commandHistoryEntry) {\n      const wasNearBottom = this.isNearBottom(uiCommandHistoryScrollbox);\n\n      this.addCommandToHistoryUI(commandHistoryEntry);\n\n      // Save the command history to localStorage\n      localStorage.setItem('commandHistory', JSON.stringify(this.commandHistory));\n\n      // Scroll to the new entry if near the bottom\n      if (wasNearBottom) {\n        this.scrollToBottom(uiCommandHistoryScrollbox);\n      }\n    }\n\n    clearCommandHistory() {\n      this.commandHistory = [];\n      uiCommandHistoryScrollbox.textContent = '';\n      localStorage.removeItem('commandHistory');\n      this.setStatus('Command history cleared', 'info');\n    }\n\n    isNearBottom(container) {\n      return container.scrollHeight - container.scrollTop <= container.clientHeight + uiNearTheBottomThreshold;\n    }\n\n    scrollToBottom(container) {\n      requestAnimationFrame(() => {\n        container.scrollTop = container.scrollHeight;\n      });\n    }\n\n    addReceivedDataEntryUI(receivedDataEntry) {\n      let newReceivedDataEntries = [];\n      let updateLastReceivedDataEntry = false;\n      if (this.receivedData.length <= 0) {\n        newReceivedDataEntries.push(receivedDataEntry);\n      } else {\n        let lastReceivedDataEntry = this.receivedData[this.receivedData.length - 1];\n        // Check if the last entry is terminated\n        if (lastReceivedDataEntry.terminated) {\n          newReceivedDataEntries.push(receivedDataEntry);\n        } else {\n          if (!lastReceivedDataEntry.terminated) {\n            updateLastReceivedDataEntry = true;\n            this.receivedData.pop();\n            receivedDataEntry.text = lastReceivedDataEntry.text + receivedDataEntry.text;\n          }\n          // split the text into lines\n          let lines = receivedDataEntry.text.split(/\\r?\\n/);\n          // check if the last line is terminated by checking if it ends with an empty string\n          let lastLineTerminated = lines[lines.length - 1] === '';\n          if (lastLineTerminated) {\n            lines.pop(); // remove the last empty line\n          }\n\n          // create new entries for each line\n          for (let i = 0; i < lines.length; i++) {\n            let line = lines[i];\n            let entry = new ReceivedDataEntry(line);\n            if (i === lines.length - 1) {\n              entry.terminated = lastLineTerminated;\n            } else {\n              entry.terminated = true;\n            }\n            newReceivedDataEntries.push(entry);\n          }\n          // if the last line is terminated, modify the last entry\n          if (lastLineTerminated) {\n            newReceivedDataEntries[newReceivedDataEntries.length - 1].terminated = true;\n          } else {\n            newReceivedDataEntries[newReceivedDataEntries.length - 1].terminated = false;\n          }\n        }\n      }\n\n      this.receivedData.push(...newReceivedDataEntries);\n\n      if (updateLastReceivedDataEntry) {\n        // update the rendering of the last entry\n        let lastReceivedDataEntryBtn = uiReceivedDataScrollbox.lastElementChild;\n        lastReceivedDataEntryBtn.querySelector('.received-data-entry-text').textContent = newReceivedDataEntries[0].text;\n        lastReceivedDataEntryBtn.querySelector('.received-data-entry-time').textContent = new Date(newReceivedDataEntries[0].time).toLocaleString();\n        newReceivedDataEntries.shift();\n      }\n\n      // render the new entries\n      let documentFragment = document.createDocumentFragment();\n      for (const entry of newReceivedDataEntries) {\n        let receivedDataEntryBtn = document.createElement('div');\n        receivedDataEntryBtn.className = 'received-data-entry';\n        receivedDataEntryBtn.innerHTML = `\n          <span class=\"received-data-entry-time\">${escapeHtml(new Date(entry.time).toLocaleString())}</span>\n          <span class=\"received-data-entry-text\">${escapeHtml(entry.text)}</span>\n        `;\n        documentFragment.appendChild(receivedDataEntryBtn);\n      }\n      uiReceivedDataScrollbox.appendChild(documentFragment);\n\n      // Limit the received data length\n      while (this.receivedData.length > maxReceivedDataLength) {\n        this.receivedData.shift();\n        uiReceivedDataScrollbox.removeChild(uiReceivedDataScrollbox.firstElementChild);\n      }\n    }\n\n    appendNewReceivedData(receivedDataEntry) {\n      const wasNearBottom = this.isNearBottom(uiReceivedDataScrollbox);\n\n      this.addReceivedDataEntryUI(receivedDataEntry);\n\n      // Save the received data to localStorage\n      localStorage.setItem('receivedData', JSON.stringify(this.receivedData));\n\n      // Scroll to the new entry if near the bottom\n      if (wasNearBottom) {\n        this.scrollToBottom(uiReceivedDataScrollbox);\n      }\n    }\n\n    clearReceivedData() {\n      this.receivedData = [];\n      uiReceivedDataScrollbox.textContent = '';\n      localStorage.removeItem('receivedData');\n      this.setStatus('Received data cleared', 'info');\n    }\n\n    setStatus(msg, level = 'info') {\n      console.error(msg);\n      uiStatusSpan.textContent = msg;\n      uiStatusSpan.className = 'status status-' + level;\n    }\n\n    /// force_connected is used to instantly change the UI to the connected state while the device is still connecting\n    /// Otherwise we would have to wait for the connection to be established.\n    /// This can take until the device sends the first data packet.\n    updateUIConnectionState(force_connected = false) {\n      if (force_connected || (this.currentPort && this.currentPort.isConnected)) {\n        uiConnectWebUsbSerialBtn.style.display = 'none';\n        uiConnectSerialBtn.style.display = 'none';\n        uiDisconnectBtn.style.display = 'block';\n        uiCommandLineInput.disabled = false;\n\n        if (this.currentPort instanceof SerialPort) {\n          uiDisconnectBtn.textContent = 'Disconnect from WebSerial';\n        } else if (this.currentPort instanceof WebUsbSerialPort) {\n          uiDisconnectBtn.textContent = 'Disconnect from WebUSB';\n        } else {\n          uiDisconnectBtn.textContent = 'Disconnect';\n        }\n      } else {\n        if (serial.isWebUsbSupported()) {\n          uiConnectWebUsbSerialBtn.style.display = 'block';\n        }\n        if (serial.isWebSerialSupported()) {\n          uiConnectSerialBtn.style.display = 'block';\n        }\n        if (!serial.isWebUsbSupported() && !serial.isWebSerialSupported()) {\n          this.setStatus('Your browser does not support WebUSB or WebSerial', 'error');\n        }\n        uiDisconnectBtn.style.display = 'none';\n        uiCommandLineInput.disabled = true;\n        uiCommandLineInput.value = '';\n        uiCommandLineInput.blur();\n      }\n    }\n\n    async disconnectPort() {\n      this.stopAutoReconnect();\n\n      if (!this.currentPort) {\n        this.updateUIConnectionState();\n        return;\n      };\n\n      try {\n        await this.currentPort.disconnect();\n        this.setStatus('Disconnected', 'info');\n      }\n      catch (error) {\n        this.setStatus(`Disconnect error: ${error.message}`, 'error');\n      }\n\n      this.updateUIConnectionState();\n    }\n\n    async onReceive(dataView) {\n      this.updateUIConnectionState();\n\n      let text = this.textDecoder.decode(dataView);\n      let receivedDataEntry = new ReceivedDataEntry(text);\n      this.appendNewReceivedData(receivedDataEntry);\n    }\n\n    async onReceiveError(error) {\n      this.setStatus(`Read error: ${error.message}`, 'error');\n      await this.disconnectPort();\n      // Start auto reconnect on error if enabled\n      this.tryAutoReconnect();\n    }\n\n    async connectSerialPort() {\n      if (!serial.isWebSerialSupported()) {\n        this.setStatus('Serial not supported on this browser', 'error');\n        return;\n      }\n      try {\n        this.setStatus('Requesting device...', 'info');\n        this.currentPort = await serial.requestSerialPort();\n        this.updateUIConnectionState(true);\n        this.currentPort.onReceiveError = error => this.onReceiveError(error);\n        this.currentPort.onReceive = dataView => this.onReceive(dataView);\n        await this.currentPort.connect();\n        this.setStatus('Connected', 'info');\n      } catch (error) {\n        this.setStatus(`Connection failed: ${error.message}`, 'error');\n        if (this.currentPort) {\n          await this.currentPort.forgetDevice();\n          this.currentPort = null;\n        }\n      } finally {\n        this.updateUIConnectionState();\n      }\n    }\n\n    async connectWebUsbSerialPort(initial = false) {\n      if (!serial.isWebUsbSupported()) {\n        this.setStatus('WebUSB not supported on this browser', 'error');\n        return;\n      }\n      try {\n        let first_time_connection = false;\n        let grantedDevices = await serial.getWebUsbSerialPorts();\n        if (initial) {\n          if (!uiAutoReconnectCheckbox.checked || grantedDevices.length === 0) {\n            return false;\n          }\n\n          // Connect to the device that was saved to localStorage otherwise use the first one\n          const savedPortInfo = JSON.parse(localStorage.getItem('webUSBSerialPort'));\n          if (savedPortInfo) {\n            for (const device of grantedDevices) {\n              if (device._device.vendorId === savedPortInfo.vendorId && device._device.productId === savedPortInfo.productId) {\n                this.currentPort = device;\n                break;\n              }\n            }\n          }\n          if (!this.currentPort) {\n            this.currentPort = grantedDevices[0];\n          }\n\n          this.setStatus('Connecting to first device...', 'info');\n        } else {\n          // Prompt the user to select a device\n          this.setStatus('Requesting device...', 'info');\n          this.currentPort = await serial.requestWebUsbSerialPort();\n          first_time_connection = true;\n        }\n\n        this.currentPort.onReceiveError = error => this.onReceiveError(error);\n        this.currentPort.onReceive = dataView => this.onReceive(dataView);\n\n        try {\n          this.updateUIConnectionState(true);\n          await this.currentPort.connect();\n\n          // save the port to localStorage\n          const portInfo = {\n            vendorId: this.currentPort._device.vendorId,\n            productId: this.currentPort._device.productId,\n          }\n          localStorage.setItem('webUSBSerialPort', JSON.stringify(portInfo));\n\n          this.setStatus('Connected', 'info');\n          uiCommandLineInput.focus();\n        } catch (error) {\n          if (first_time_connection) {\n            // Forget the device if a first time connection fails\n            await this.currentPort.forgetDevice();\n            this.currentPort = null;\n          }\n          throw error;\n        } finally {\n          this.updateUIConnectionState();\n        }\n\n        this.updateUIConnectionState();\n      } catch (error) {\n        this.setStatus(`Connection failed: ${error.message}`, 'error');\n      }\n    }\n\n    async reconnectPort() {\n      if (this.currentPort) {\n        this.setStatus('Reconnecting...', 'info');\n        try {\n          await this.currentPort.connect();\n          this.setStatus('Reconnected', 'info');\n        } catch (error) {\n          this.setStatus(`Reconnect failed: ${error.message}`, 'error');\n        } finally {\n          this.updateUIConnectionState();\n        }\n      }\n      this.updateUIConnectionState();\n    }\n\n    async forgetPort() {\n      this.stopAutoReconnect();\n      if (this.currentPort) {\n        await this.currentPort.forgetDevice();\n        this.currentPort = null;\n        this.setStatus('Device forgotten', 'info');\n      } else {\n        this.setStatus('No device to forget', 'error');\n      }\n      this.updateUIConnectionState();\n    }\n\n    async forgetAllPorts() {\n      this.stopAutoReconnect();\n      await this.forgetPort();\n      if (serial.isWebUsbSupported()) {\n        let ports = await serial.getWebUsbSerialPorts();\n        for (const p of ports) {\n          await p.forgetDevice();\n        }\n      }\n      this.updateUIConnectionState();\n    }\n\n    setNewlineMode() {\n      localStorage.setItem('newlineMode', uiNewlineModeSelect.value);\n    }\n\n    autoReconnectChanged() {\n      if (uiAutoReconnectCheckbox.checked) {\n        this.setStatus('Auto-reconnect enabled', 'info');\n        this.tryAutoReconnect();\n      } else {\n        this.setStatus('Auto-reconnect disabled', 'info');\n        this.stopAutoReconnect();\n      }\n      localStorage.setItem('autoReconnect', uiAutoReconnectCheckbox.checked);\n    }\n\n    stopAutoReconnect() {\n      if (this.reconnectTimeoutId !== null) {\n        clearTimeout(this.reconnectTimeoutId);\n        this.reconnectTimeoutId = null;\n        this.setStatus('Auto-reconnect stopped.', 'info');\n      }\n    }\n\n    async autoReconnectTimeout() {\n        this.reconnectTimeoutId = null;\n        if (!uiAutoReconnectCheckbox.checked) {\n          this.setStatus('Auto-reconnect stopped.', 'info');\n          return;\n        }\n        if (this.currentPort && !this.currentPort.isConnected) {\n          try {\n            await this.currentPort.connect();\n            this.setStatus('Reconnected successfully', 'info');\n          } catch (error) {\n            this.setStatus(`Reconnect failed: ${error.message}`, 'error');\n            // Try again after a delay\n            this.tryAutoReconnect();\n          } finally {\n            this.updateUIConnectionState();\n          }\n        }\n    }\n\n    tryAutoReconnect() {\n      this.updateUIConnectionState();\n      if (!uiAutoReconnectCheckbox.checked) return;\n      if (this.reconnectTimeoutId !== null) return; // already trying\n      this.setStatus('Attempting to auto-reconnect...', 'info');\n      this.reconnectTimeoutId = setTimeout(async () => {\n        await this.autoReconnectTimeout();\n      }, 1000);\n    }\n\n    async handleCommandLineInput(e) {\n      // Instant mode: send key immediately including special keys like Backspace, arrows, enter, etc.\n      if (this.sendMode === 'instant') {\n        e.preventDefault();\n\n        // Ignore only pure modifier keys without text representation\n        if (e.key.length === 1 ||\n          e.key === 'Enter' ||\n          e.key === 'Backspace' ||\n          e.key === 'Tab' ||\n          e.key === 'Escape' ||\n          e.key === 'Delete' ) {\n\n          let sendText = '';\n          switch (e.key) {\n            case 'Enter':\n              switch (uiNewlineModeSelect.value) {\n                case 'CR': sendText = '\\r'; break;\n                case 'CRLF': sendText = '\\r\\n'; break;\n                default: sendText = '\\n'; break;\n              }\n              break;\n            case 'Backspace':\n              // Usually no straightforward char to send for Backspace,\n              // but often ASCII DEL '\\x7F' or '\\b' (0x08) is sent.\n              sendText = '\\x08'; // backspace\n              break;\n            case 'Tab':\n              sendText = '\\t';\n              break;\n            case 'Escape':\n              // Ignore or send ESC control char if needed\n              sendText = '\\x1B';\n              break;\n            case 'Delete':\n              sendText = '\\x7F'; // DEL char\n              break;\n            default:\n              sendText = e.key;\n          }\n          try {\n            await this.currentPort.send(this.textEncoder.encode(sendText));\n          } catch (error) {\n            this.setStatus(`Send error: ${error.message}`, 'error');\n            this.tryAutoReconnect();\n          }\n        }\n\n        return;\n      }\n\n      // Command mode: handle up/down arrow keys for history\n      if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n        e.preventDefault();\n        if (this.commandHistory.length === 0) return;\n        if (e.key === 'ArrowUp') {\n          if (this.uiCommandHistoryIndex === -1) this.uiCommandHistoryIndex = this.commandHistory.length - 1;\n          else if (this.uiCommandHistoryIndex > 0) this.uiCommandHistoryIndex--;\n        } else if (e.key === 'ArrowDown') {\n          if (this.uiCommandHistoryIndex !== -1) this.uiCommandHistoryIndex++;\n          if (this.uiCommandHistoryIndex >= this.commandHistory.length) this.uiCommandHistoryIndex = -1;\n        }\n        uiCommandLineInput.value = this.uiCommandHistoryIndex === -1 ? '' : this.commandHistory[this.uiCommandHistoryIndex].text;\n        return;\n      }\n\n      if (e.key !== 'Enter' || !this.currentPort.isConnected) return;\n      e.preventDefault();\n      const text = uiCommandLineInput.value;\n      if (!text) return;\n\n      // Convert to Uint8Array with newline based on config\n      let sendText = text;\n      switch (uiNewlineModeSelect.value) {\n        case 'CR':\n          sendText += '\\r';\n          break;\n        case 'CRLF':\n          sendText += '\\r\\n';\n          break;\n        case 'ANY':\n          sendText += '\\n';\n          break;\n      }\n      const data = this.textEncoder.encode(sendText);\n\n      try {\n        await this.currentPort.send(data);\n        this.uiCommandHistoryIndex = -1;\n        let history_cmd_text = sendText.replace(/[\\r\\n]+$/, '');\n        let history_entry = new CommandHistoryEntry(history_cmd_text);\n        this.appendNewCommandToHistory(history_entry);\n        uiCommandLineInput.value = '';\n      } catch (error) {\n        this.setStatus(`Send error: ${error.message}`, 'error');\n        this.tryAutoReconnect();\n      }\n    }\n\n    toggleSendMode() {\n      if (this.sendMode === 'instant') {\n        this.setSendMode('command');\n      } else {\n        this.setSendMode('instant');\n      }\n    }\n\n    setSendMode(mode) {\n      this.sendMode = mode;\n      if (mode === 'instant') {\n        uiSendModeBtn.classList.remove('send-mode-command');\n        uiSendModeBtn.classList.add('send-mode-instant');\n        uiSendModeBtn.textContent = 'Instant mode';\n      } else {\n        uiSendModeBtn.classList.remove('send-mode-instant');\n        uiSendModeBtn.classList.add('send-mode-command');\n        uiSendModeBtn.textContent = 'Command mode';\n      }\n      localStorage.setItem('sendMode', this.sendMode);\n    }\n\n    copyOutput() {\n      let text = '';\n      for (const entry of this.receivedData) {\n        text += entry.text;\n        if (entry.terminated) {\n          text += '\\n';\n        }\n      }\n\n      if (text) {\n        navigator.clipboard.writeText(text).then(() => {\n          this.setStatus('Output copied to clipboard', 'info');\n        }, () => {\n          this.setStatus('Failed to copy output', 'error');\n        });\n      } else {\n        this.setStatus('No output to copy', 'error');\n      }\n    }\n\n    downloadOutputCsv() {\n      // save <iso_date_time>,<received_line>\n      let csvContent = 'data:text/csv;charset=utf-8,';\n      for (const entry of this.receivedData) {\n        let sanitizedText = entry.text.replace(/\"/g, '\"\"').replace(/[\\r\\n]+$/, '');\n        let line = new Date(entry.time).toISOString() + ',\"' + sanitizedText + '\"';\n        csvContent += line + '\\n';\n      }\n\n      const encodedUri = encodeURI(csvContent);\n      const link = document.createElement('a');\n      link.setAttribute('href', encodedUri);\n      const filename = new Date().toISOString().replace(/:/g, '-') + '_tinyusb_received_serial_data.csv';\n      link.setAttribute('download', filename);\n      document.body.appendChild(link);\n      link.click();\n      document.body.removeChild(link);\n    }\n\n    async resetAll() {\n      await this.forgetAllPorts();\n\n      // Clear localStorage\n      localStorage.clear();\n\n      // reload the page\n      window.location.reload();\n    }\n  }\n\n  const app = new Application();\n})()\n"
  },
  {
    "path": "examples/device/webusb_serial/website/divider.js",
    "content": "(async () => {\n\n  const uiResizer = document.getElementById('resizer');\n  const uiLeftColumn = uiResizer.previousElementSibling;\n  const uiRightColumn = uiResizer.nextElementSibling;\n  const uiParent = uiResizer.parentElement;\n\n  let isResizing = false;\n  let abortSignal = null;\n\n  function onMouseMove(e) {\n    // we resize the columns by applying felx: <ratio> to the columns\n\n    // compute the percentage the mouse is in the parent\n    const percentage = (e.clientX - uiParent.offsetLeft) / uiParent.clientWidth;\n    // clamp the percentage between 0.1 and 0.9\n    const clampedPercentage = Math.max(0.1, Math.min(0.9, percentage));\n    // set the flex property of the columns\n    uiLeftColumn.style.flex = `${clampedPercentage}`;\n    uiRightColumn.style.flex = `${1 - clampedPercentage}`;\n  }\n\n  function onMouseUp(e) {\n    // restore user selection\n    document.body.style.userSelect = '';\n\n    // remove the mousemove and mouseup events\n    if (abortSignal) {\n      abortSignal.abort();\n      abortSignal = null;\n    }\n  }\n\n  uiResizer.addEventListener('mousedown', e => {\n    e.preventDefault();\n    isResizing = true;\n\n    // prevent text selection\n    document.body.style.userSelect = 'none';\n\n    // register the mousemove and mouseup events\n    abortSignal = new AbortController();\n    document.addEventListener('mousemove', onMouseMove, { signal: abortSignal.signal });\n    document.addEventListener('mouseup', onMouseUp, { signal: abortSignal.signal });\n  });\n\n})();\n"
  },
  {
    "path": "examples/device/webusb_serial/website/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n  <title>TinyUSB WebUSB Serial</title>\n  <link rel=\"stylesheet\" href=\"style.css\" />\n  <script defer src=\"serial.js\"></script>\n  <script defer src=\"application.js\"></script>\n  <script defer src=\"divider.js\"></script>\n</head>\n\n<body>\n  <header class=\"header\">\n    <h1 class=\"app-title\">TinyUSB - WebUSB Serial</h1>\n    <button id=\"theme-toggle\" class=\"btn btn-theme\">Theme: Auto</button>\n    <a class=\"github-link\" href=\"https://github.com/hathach/tinyusb/tree/master/examples/device/webusb_serial/website\"\n      target=\"_blank\">\n      Find my source on GitHub\n    </a>\n  </header>\n  <main>\n    <section class=\"controls-section\">\n      <button id=\"connect_webusb_serial_btn\" class=\"controls btn good\">Connect WebUSB</button>\n      <button id=\"connect_serial_btn\" class=\"controls btn good\">Connect Serial</button>\n      <button id=\"disconnect_btn\" class=\"controls btn danger\">Disconnect</button>\n      <label for=\"newline_mode_select\" class=\"controls\">\n        Command newline mode:\n        <select id=\"newline_mode_select\">\n          <option value=\"CR\">Only \\r</option>\n          <option value=\"CRLF\">\\r\\n</option>\n          <option value=\"ANY\" selected>\\r, \\n or \\r\\n</option>\n        </select>\n      </label>\n      <label for=\"auto_reconnect_checkbox\" class=\"controls\">\n        <input type=\"checkbox\" id=\"auto_reconnect_checkbox\" />\n        Auto Reconnect WebUSB\n      </label>\n      <button id=\"forget_device_btn\" class=\"controls btn danger\">Forget Device</button>\n      <button id=\"forget_all_devices_btn\" class=\"controls btn danger\">Forget All Devices</button>\n      <button id=\"reset_all_btn\" class=\"controls btn danger\">Reset All</button>\n      <button id=\"copy_output_btn\" class=\"controls btn good\">Copy Output</button>\n      <button id=\"download_csv_output_btn\" class=\"controls btn good\">Download CSV</button>\n    </section>\n    <section class=\"status-section\">\n      <span id=\"status_span\" class=\"status\">\n        Click \"Connect\" to start\n      </span>\n    </section>\n    <div class=\"io-container\">\n      <section class=\"column\">\n        <div class=\"heading-with-controls\">\n          <h2>Command History</h2>\n          <button id=\"clear_command_history_btn\" class=\"controls btn danger\">Clear History</button>\n        </div>\n        <div class=\"scrollbox-wrapper\">\n          <div id=\"command_history_scrollbox\" class=\"scrollbox monospaced\"></div>\n        </div>\n        <div class=\"send-container\">\n          <input id=\"command_line_input\" class=\"input\" placeholder=\"Start typing...\" autocomplete=\"off\" disabled />\n          <button id=\"send_mode_btn\" class=\"btn send-mode-command\">Command Mode</button>\n        </div>\n      </section>\n      <div class=\"resizer\" id=\"resizer\"></div>\n      <section class=\"column\">\n        <div class=\"heading-with-controls\">\n          <h2>Received Data</h2>\n          <button id=\"clear_received_data_btn\" class=\"controls btn danger\">Clear Received</button>\n        </div>\n        <div class=\"scrollbox-wrapper\">\n          <div id=\"received_data_scrollbox\" class=\"scrollbox monospaced\"></div>\n        </div>\n      </section>\n    </div>\n  </main>\n</body>\n\n</html>\n"
  },
  {
    "path": "examples/device/webusb_serial/website/serial.js",
    "content": "'use strict';\n\n/// Web Serial API Implementation\n/// https://developer.mozilla.org/en-US/docs/Web/API/SerialPort\nclass SerialPort {\n  constructor(port) {\n    this._port = port;\n    this._readLoopPromise = null;\n    this._reader = null;\n    this._writer = null;\n    this._initialized = false;\n    this._keepReading = true;\n    this.isConnected = false;\n  }\n\n  /// Connect and start reading loop\n  async connect(options = { baudRate: 9600 }) {\n    if (this._initialized) {\n      try {\n        await this.disconnect();\n      } catch (error) {\n        console.error('Error disconnecting previous port:', error);\n      }\n\n      if (this._readLoopPromise) {\n        try {\n          await this._readLoopPromise;\n        } catch (error) {\n          console.error('Error in read loop:', error);\n        }\n      }\n      this._readLoopPromise = null;\n    }\n    this._initialized = true;\n\n    this.isConnected = true;\n    this._keepReading = true;\n\n    try {\n      await this._port.open(options);\n    } catch (error) {\n      this.isConnected = false;\n      throw error;\n    }\n\n    this._readLoopPromise = this._readLoop();\n  }\n\n  /// Internal continuous read loop\n  async _readLoop() {\n    try {\n      while (this._port.readable && this._keepReading) {\n        this._reader = this._port.readable.getReader();\n        try {\n          while (true) {\n            const { value, done } = await this._reader.read();\n            if (done) {\n              // |reader| has been canceled.\n              break;\n            }\n            if (this.onReceive) {\n              this.onReceive(value);\n            }\n          }\n        } catch (error) {\n          if (this.onReceiveError) this.onReceiveError(error);\n        } finally {\n          this._reader.releaseLock();\n        }\n      }\n    } finally {\n      this.isConnected = false;\n      await this._port.close();\n    }\n  }\n\n  /// Stop reading and release port\n  async disconnect() {\n    this._keepReading = false;\n\n    if (this._reader) {\n      try {\n        await this._reader.cancel();\n      } catch (error) {\n        console.error('Error cancelling reader:', error);\n      }\n      this._reader.releaseLock();\n    }\n\n    if (this._writer) {\n      try {\n        await this._writer.abort();\n      } catch (error) {\n        console.error('Error closing writer:', error);\n      }\n      this._writer.releaseLock();\n    }\n\n    try {\n      await this._port.close();\n    } catch (error) {\n      console.error('Error closing port:', error);\n    }\n\n    if (this._readLoopPromise) {\n      try {\n        await this._readLoopPromise;\n      } catch (error) {\n        console.error('Error in read loop:', error);\n      }\n    }\n  }\n\n  /// Send data to port\n  send(data) {\n    if (!this._port.writable) {\n      throw new Error('Port is not writable');\n    }\n    this._writer = this._port.writable.getWriter();\n    if (!this._writer) {\n      throw new Error('Failed to get writer from port');\n    }\n    try {\n      return this._writer.write(data);\n    } finally {\n      this._writer.releaseLock();\n    }\n  }\n\n  async forgetDevice() {}\n}\n\n/// WebUSB Implementation\nclass WebUsbSerialPort {\n  constructor(device) {\n    this._device = device;\n    this._interfaceNumber = 0;\n    this._endpointIn = 0;\n    this._endpointOut = 0;\n    this.isConnected = false;\n    this._readLoopPromise = null;\n    this._initialized = false;\n    this._keepReading = true;\n\n    this._vendorId = device.vendorId;\n    this._productId = device.productId;\n  }\n\n  _isSameWebUsbSerialPort(webUsbSerialPort) {\n    return this._vendorId === webUsbSerialPort._vendorId && this._productId === webUsbSerialPort._productId;\n  }\n\n  /// Connect and start reading loop\n  async connect() {\n    if (this._initialized) {\n      try {\n        await this.disconnect();\n      } catch (error) {\n        console.error('Error disconnecting previous device:', error);\n      }\n\n      const webUsbSerialPorts = await serial.getWebUsbSerialPorts();\n      const webUsbSerialPort = webUsbSerialPorts.find(serialPort => this._isSameWebUsbSerialPort(serialPort));\n      this._device = webUsbSerialPort ? webUsbSerialPort._device : this._device;\n    }\n    this._initialized = true;\n\n    this.isConnected = true;\n    this._keepReading = true;\n    try {\n      await this._device.open();\n\n      if (!this._device.configuration) {\n        await this._device.selectConfiguration(1);\n      }\n\n      // Find interface with vendor-specific class (0xFF) and endpoints\n      for (const iface of this._device.configuration.interfaces) {\n        for (const alternate of iface.alternates) {\n          if (alternate.interfaceClass === 0xff) {\n            this._interfaceNumber = iface.interfaceNumber;\n            for (const endpoint of alternate.endpoints) {\n              if (endpoint.direction === 'out') this._endpointOut = endpoint.endpointNumber;\n              else if (endpoint.direction === 'in') this._endpointIn = endpoint.endpointNumber;\n            }\n          }\n        }\n      }\n\n      if (this._interfaceNumber === undefined) {\n        throw new Error('No suitable interface found.');\n      }\n\n      await this._device.claimInterface(this._interfaceNumber);\n      await this._device.selectAlternateInterface(this._interfaceNumber, 0);\n\n      // Set device to ENABLE (0x22 = SET_CONTROL_LINE_STATE, value 0x01 = activate)\n      await this._device.controlTransferOut({\n        requestType: 'class',\n        recipient: 'interface',\n        request: 0x22,\n        value: 0x01,\n        index: this._interfaceNumber,\n      });\n    } catch (error) {\n      this.isConnected = false;\n      throw error;\n    }\n\n    this._readLoopPromise = this._readLoop();\n  }\n\n  /// Internal continuous read loop\n  async _readLoop() {\n    try {\n      while (this._keepReading && this.isConnected) {\n        try {\n          const result = await this._device.transferIn(this._endpointIn, 16384);\n          if (result.data && this.onReceive) {\n            this.onReceive(result.data);\n          }\n        } catch (error) {\n          this.isConnected = false;\n          if (this.onReceiveError) {\n            this.onReceiveError(error);\n          }\n        }\n      }\n    } finally {\n      this.isConnected = false;\n      await this._device.close();\n    }\n  }\n\n  /// Stop reading and release device\n  async disconnect() {\n    this._keepReading = false;\n\n    try {\n      await this._device.controlTransferOut({\n        requestType: 'class',\n        recipient: 'interface',\n        request: 0x22,\n        value: 0x00,\n        index: this._interfaceNumber,\n      });\n    } catch (error) {\n      console.error('Error sending control transfer:', error);\n    }\n\n    await this._device.releaseInterface(this._interfaceNumber);\n\n    if (this._readLoopPromise) {\n      try {\n        await this._readLoopPromise;\n      } catch (error) {\n        console.error('Error in read loop:', error);\n      }\n    }\n  }\n\n  /// Send data to device\n  send(data) {\n    return this._device.transferOut(this._endpointOut, data);\n  }\n\n  async forgetDevice() {\n    await this.disconnect();\n    await this._device.forget();\n  }\n}\n\n// Utility Functions\nconst serial = {\n  isWebSerialSupported: () => 'serial' in navigator,\n  isWebUsbSupported: () => 'usb' in navigator,\n\n  async getSerialPorts() {\n    if (!this.isWebSerialSupported()) return [];\n    const ports = await navigator.serial.getPorts();\n    return ports.map(port => new SerialPort(port));\n  },\n\n  async getWebUsbSerialPorts() {\n    if (!this.isWebUsbSupported()) return [];\n    const devices = await navigator.usb.getDevices();\n    return devices.map(device => new WebUsbSerialPort(device));\n  },\n\n  async requestSerialPort() {\n    const port = await navigator.serial.requestPort();\n    return new SerialPort(port);\n  },\n\n  async requestWebUsbSerialPort() {\n    const filters = [\n      { vendorId: 0xcafe }, // TinyUSB\n      { vendorId: 0x239a }, // Adafruit\n      { vendorId: 0x2e8a }, // Raspberry Pi\n      { vendorId: 0x303a }, // Espressif\n      { vendorId: 0x2341 }, // Arduino\n    ];\n    const device = await navigator.usb.requestDevice({ filters });\n    return new WebUsbSerialPort(device);\n  }\n};\n"
  },
  {
    "path": "examples/device/webusb_serial/website/style.css",
    "content": "* {\n  box-sizing: border-box;\n  margin: 0;\n  padding: 0;\n}\n\n/* Reset default margins and make html, body full height */\nhtml,\nbody {\n  height: 100%;\n  font-family: sans-serif;\n  background: #f5f5f5;\n  color: #333;\n}\n\nbody {\n  display: flex;\n  flex-direction: column;\n  height: 100vh;\n}\n\n/* Header row styling */\n.header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 0.5em 1em;\n  gap: 1em;\n  flex-shrink: 0;\n}\n\nh1,\nh2 {\n  margin: 0;\n}\n\n.app-title {\n  flex-grow: 1;\n}\n\n.btn-theme {\n  background-color: #6b6b6b;\n  color: #fff;\n}\n\n.github-link {\n  font-weight: 600;\n}\n\n/* Main is flex column */\nmain {\n  display: flex;\n  flex-direction: column;\n  flex: 1;\n  width: 100%;\n}\n\n/* Controls top row in main*/\n.controls-section,\n.status-section {\n  padding: 1rem;\n  flex-shrink: 0;\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  gap: 0.5rem;\n}\n\n/* Container for the two columns */\n.io-container {\n  display: flex;\n  flex: 1;\n  /* fill remaining vertical space */\n  width: 100%;\n  overflow: hidden;\n}\n\n/* Both columns flex equally and full height */\n.column {\n  flex: 1;\n  padding: 1rem;\n  display: flex;\n  flex-direction: column;\n}\n\n.heading-with-controls {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  flex-wrap: wrap;\n}\n\n.command-history-entry {\n  all: unset;\n  display: flex;\n  flex-direction: row;\n  gap: 0.5rem;\n  background: none;\n  border: none;\n  border-bottom: 1px solid #ccc;\n  /* light gray line */\n  padding: 0.5rem 1rem;\n  margin: 0;\n  text-align: left;\n  cursor: pointer;\n}\n\n.command-history-entry:hover {\n  background-color: #f0f0f0;\n}\n\n.monospaced {\n  font-family: 'Courier New', Courier, monospace;\n  font-size: 1rem;\n  color: #333;\n}\n\n.scrollbox-wrapper {\n  position: relative;\n  padding: 0.5rem;\n  flex: 1;\n\n  display: block;\n  overflow: hidden;\n}\n\n.scrollbox {\n  position: absolute;\n  top: 0;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  overflow-y: auto;\n  overflow-x: auto;\n  margin-top: 0.5rem;\n  margin-bottom: 0.5rem;\n  background-color: #fff;\n  border-radius: 0.5rem;\n  white-space: nowrap;\n  display: flex;\n  flex-direction: column;\n  align-items: stretch;\n}\n\n.send-container {\n  display: flex;\n  flex-direction: row;\n  gap: 0.5rem;\n}\n\n.send-mode-command {\n  background-color: lightgray;\n  /* light-gray */\n}\n\n.send-mode-instant {\n  background-color: blue;\n}\n\n.btn {\n  padding: 0.5rem 1rem;\n  font-size: 1rem;\n  border: none;\n  border-radius: 0.3rem;\n  cursor: pointer;\n}\n\n.good {\n  background-color: #2ecc71;\n  /* green */\n  color: #fff;\n}\n\n.danger {\n  background-color: #e74c3c;\n  /* red */\n  color: #fff;\n}\n\n.input {\n  width: 100%;\n  padding: 12px 16px;\n  font-size: 1rem;\n  font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n  border: 2px solid #ddd;\n  border-radius: 8px;\n  background-color: #fafafa;\n  color: #333;\n  transition: border-color 0.3s ease, box-shadow 0.3s ease;\n  outline: none;\n  box-sizing: border-box;\n}\n\n.input::placeholder {\n  color: #aaa;\n  font-style: italic;\n}\n\n.input:focus {\n  border-color: #0078d7;\n  box-shadow: 0 0 6px rgba(0, 120, 215, 0.5);\n  background-color: #fff;\n}\n\n.resizer {\n  width: 5px;\n  background-color: #ccc;\n  cursor: col-resize;\n  height: 100%;\n}\n\n/*\n================================\nTogglable Dark Mode\n================================\n*/\n/* This class will be added to the body element by JavaScript */\nbody.dark-mode {\n  /* Invert base background and text colors */\n  background: #1e1e1e;\n  color: #d4d4d4;\n}\n\nbody.dark-mode input[type=\"checkbox\"] {\n  border-color: #888;\n  accent-color: #2e2e2e;\n  opacity: 0.8;\n}\n\nbody.dark-mode .btn-theme {\n  background-color: #b0b0b0;\n  color: #000;\n}\n\nbody.dark-mode .github-link {\n  color: #58a6ff;\n}\n\nbody.dark-mode .resizer {\n  background-color: #444;\n}\n\nbody.dark-mode .input {\n  background-color: #3c3c3c;\n  color: #f0f0f0;\n  border: 2px solid #555;\n}\n\nbody.dark-mode .input::placeholder {\n  color: #888;\n}\n\nbody.dark-mode .input:focus {\n  background-color: #2a2d2e;\n  border-color: #0078d7;\n}\n\nbody.dark-mode .scrollbox {\n  background-color: #252526;\n  scrollbar-color: #555 #2e2e2e;\n  border: 1px solid #444;\n}\n\nbody.dark-mode .monospaced {\n  color: #d4d4d4;\n}\n\nbody.dark-mode .command-history-entry {\n  border-bottom: 1px solid #444;\n}\n\nbody.dark-mode .command-history-entry:hover {\n  background-color: #3c3c3c;\n}\n\nbody.dark-mode .send-mode-command {\n  background-color: #555;\n  color: #f5f5f5;\n}\n\nbody.dark-mode select {\n  background-color: #3c3c3c;\n  color: #f0f0f0;\n  border: 2px solid #555;\n}\n\nbody.dark-mode select:focus {\n  background-color: #2a2d2e;\n  border-color: #0078d7;\n  outline: none;\n}\n\nbody.dark-mode option {\n  background-color: #3c3c3c;\n  color: #f0f0f0;\n}\n"
  },
  {
    "path": "examples/dual/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../hw/bsp/family_support.cmake)\n\nproject(tinyusb_dual_examples C CXX ASM)\nfamily_initialize_project(tinyusb_dual_examples ${CMAKE_CURRENT_LIST_DIR})\n\nif (FAMILY STREQUAL \"rp2040\" AND NOT TARGET tinyusb_pico_pio_usb)\n  message(\"Skipping dual host/device mode examples as Pico-PIO-USB is not available\")\nelse ()\n  # family_add_subdirectory will filter what to actually add based on selected FAMILY\n  set(EXAMPLE_LIST\n    host_hid_to_device_cdc\n    host_info_to_device_cdc\n    dynamic_switch\n    )\n\n  foreach (example ${EXAMPLE_LIST})\n    family_add_subdirectory(${example})\n  endforeach ()\nendif ()\n"
  },
  {
    "path": "examples/dual/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/dual/dynamic_switch/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(dynamic_switch C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_dual_usb_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/dual/dynamic_switch/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/dual/dynamic_switch/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\n# Include device and host stack\nSRC_C += \\\n\tsrc/class/cdc/cdc_device.c \\\n\tsrc/host/hub.c \\\n\tsrc/host/usbh.c\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/dual/dynamic_switch/README.md",
    "content": "# Dynamic Switch Example\n\nThis example demonstrates TinyUSB's dual-role capability by allowing runtime switching between USB device and host modes.\n\n## Features\n\n- **Button-triggered mode switching**: Press the board button to switch between device and host modes\n- **Device Mode**: Acts as a USB CDC (Virtual Serial Port) that echoes all received data\n- **Host Mode**: Enumerates connected USB devices and prints device information\n- **Dynamic switching**: Deinitializes the current stack and reinitializes in the new mode\n\n## Usage\n\n1. **Build and flash** the example to your board\n2. **Default behavior**: The board starts in **Device mode**\n3. **Device mode**:\n   - Connect the board to a PC\n   - Open a serial terminal (e.g., `screen /dev/ttyACM0` or PuTTY)\n   - Type characters - they will be echoed back to you\n4. **Switch to Host mode**:\n   - Press the board button\n   - Connect a USB device to the board\n   - The board will enumerate the device and print its descriptors to the debug console\n5. **Switch back to Device mode**: Press the button again\n\n## LED Patterns\n\nThe onboard LED indicates the USB connection status:\n\n- **Fast blink (250ms)**: Not mounted/connected\n- **Slow blink (1000ms)**: Successfully mounted/connected\n- **Very slow blink (2500ms)**: Suspended (device mode only)\n\n## Serial Output\n\nThe example prints status messages to the debug UART:\n\n```\n======================================\nTinyUSB Dynamic Switch Example\nPress button to switch between device and host modes\nStarting in DEVICE mode...\n======================================\n\n[DEVICE] Mounted\n\n--- Switching USB mode ---\nStopping DEVICE mode...\nStarting HOST mode...\nMode switch complete!\n\n[HOST] Device attached, address = 1\nDevice 1: ID 1234:5678 SN ABC123\nDevice Descriptor:\n  bLength             18\n  bDescriptorType     1\n  bcdUSB              0200\n  bDeviceClass        239\n  ...\n```\n"
  },
  {
    "path": "examples/dual/dynamic_switch/only.txt",
    "content": "family:espressif\nmcu:LPC43XX\nmcu:MIMXRT1XXX\nmcu:STM32C0\nmcu:STM32G0\nmcu:STM32H5\nmcu:STM32F2\nmcu:STM32F4\nmcu:STM32U5\nmcu:STM32F7\nmcu:STM32H7\nmcu:STM32H7RS\n"
  },
  {
    "path": "examples/dual/dynamic_switch/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\" \"usb_descriptors.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/dual/dynamic_switch/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* This example demonstrates dynamic switching between device and host modes:\n * - Press button to switch between device and host modes\n * - Device mode: CDC echo (echoes input back to output)\n * - Host mode: Prints connected device information\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  #ifdef ESP_PLATFORM\n    #define USBD_STACK_SIZE     4096\n    #define USBH_STACK_SIZE     4096\n  #else\n    // Increase stack size when debug log is enabled\n    #define USBD_STACK_SIZE    (3*configMINIMAL_STACK_SIZE/2) * (CFG_TUSB_DEBUG ? 2 : 1)\n    #define USBH_STACK_SIZE    (3*configMINIMAL_STACK_SIZE/2) * (CFG_TUSB_DEBUG ? 2 : 1)\n  #endif\n\n  #define CDC_STACK_SIZE      (configMINIMAL_STACK_SIZE * (CFG_TUSB_DEBUG ? 2 : 1))\n  #define BLINKY_STACK_SIZE   configMINIMAL_STACK_SIZE\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\n\n// English\n#define LANGUAGE_ID 0x0409\n\n/* Blink pattern\n * - 250 ms  : not mounted\n * - 1000 ms : mounted\n * - 2500 ms : suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n// static task for FreeRTOS\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t blinky_stack[BLINKY_STACK_SIZE];\nStaticTask_t blinky_taskdef;\n\nStackType_t usb_stack[USBD_STACK_SIZE > USBH_STACK_SIZE ? USBD_STACK_SIZE : USBH_STACK_SIZE];\nStaticTask_t usb_taskdef;\n\nStackType_t cdc_stack[CDC_STACK_SIZE];\nStaticTask_t cdc_taskdef;\n#endif\n#endif\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\nstatic tusb_role_t current_role = TUSB_ROLE_DEVICE;\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\nstatic void usb_task(void *param);\nvoid led_blinking_task(void *param);\nvoid cdc_task(void *params);\n#else\nvoid led_blinking_task(void);\nvoid cdc_task(void);\n#endif\nvoid usb_mode_switch(void);\nstatic void print_device_info(uint8_t daddr);\nstatic void print_utf16(uint16_t* temp_buf, size_t buf_len);\n\n// Declare buffer for USB transfer\nCFG_TUH_MEM_SECTION struct {\n  TUH_EPBUF_TYPE_DEF(tusb_desc_device_t, device);\n  TUH_EPBUF_DEF(serial, 64*sizeof(uint16_t));\n  TUH_EPBUF_DEF(buf, 128*sizeof(uint16_t));\n} desc;\n\n//--------------------------------------------------------------------+\n// Main\n//--------------------------------------------------------------------+\n\nint main(void) {\n  board_init();\n\n  printf(\"\\r\\n======================================\\r\\n\");\n  printf(\"TinyUSB Dynamic Switch Example\\r\\n\");\n  printf(\"Press button to switch between device and host modes\\r\\n\");\n  printf(\"Starting in DEVICE mode...\\r\\n\");\n  printf(\"======================================\\r\\n\\r\\n\");\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Create FreeRTOS tasks\n#if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);\n  xTaskCreateStatic(usb_task, \"usb\", USBD_STACK_SIZE > USBH_STACK_SIZE ? USBD_STACK_SIZE : USBH_STACK_SIZE,\n                    NULL, configMAX_PRIORITIES-1, usb_stack, &usb_taskdef);\n  xTaskCreateStatic(cdc_task, \"cdc\", CDC_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, cdc_stack, &cdc_taskdef);\n#else\n  xTaskCreate(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, NULL);\n  xTaskCreate(usb_task, \"usb\", USBD_STACK_SIZE > USBH_STACK_SIZE ? USBD_STACK_SIZE : USBH_STACK_SIZE,\n              NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(cdc_task, \"cdc\", CDC_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, NULL);\n#endif\n\n#ifndef ESP_PLATFORM\n  // only start scheduler for non-espressif mcu\n  vTaskStartScheduler();\n#endif\n\n#else\n  // Initialize in device mode by default\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_RHPORT, &dev_init);\n  current_role = TUSB_ROLE_DEVICE;\n\n  board_init_after_tusb();\n\n  while (1) {\n    // Check for button press to switch modes\n    static bool pending_switch = false;\n    if (board_button_read()) {\n      if (!pending_switch) {\n        pending_switch = true;\n        usb_mode_switch();\n      }\n    } else {\n      pending_switch = false;\n    }\n\n    // Process USB tasks based on current mode\n    if (current_role == TUSB_ROLE_DEVICE) {\n      tud_task();\n      cdc_task();\n    } else {\n      tuh_task();\n    }\n\n    led_blinking_task();\n  }\n#endif\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n// USB Task for FreeRTOS\n// This top level thread processes all usb events and mode switching\nstatic void usb_task(void *param) {\n  (void) param;\n\n  // init device stack on configured roothub port\n  // This should be called after scheduler/kernel is started.\n  // Otherwise it could cause kernel issue since USB IRQ handler does use RTOS queue API.\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_RHPORT, &dev_init);\n  current_role = TUSB_ROLE_DEVICE;\n\n  board_init_after_tusb();\n\n  // RTOS forever loop\n  while (1) {\n    // Check for button press to switch modes\n    static bool pending_switch = false;\n    if (board_button_read()) {\n      if (!pending_switch) {\n        pending_switch = true;\n        usb_mode_switch();\n      }\n    } else {\n      pending_switch = false;\n    }\n\n    // Process USB tasks based on current mode\n    // Use _ext version to allow return and read button state\n    if (current_role == TUSB_ROLE_DEVICE) {\n      tud_task_ext(10, false);\n    } else {\n      tuh_task_ext(10, false);\n    }\n  }\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Mode Switching\n//--------------------------------------------------------------------+\n\nvoid usb_mode_switch(void) {\n  printf(\"\\r\\n--- Switching USB mode ---\\r\\n\");\n\n  // Deinitialize current mode\n  if (current_role == TUSB_ROLE_DEVICE) {\n    printf(\"Stopping DEVICE mode...\\r\\n\");\n    tusb_deinit(BOARD_RHPORT);\n  } else {\n    printf(\"Stopping HOST mode...\\r\\n\");\n    tusb_deinit(BOARD_RHPORT);\n  }\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  vTaskDelay(pdMS_TO_TICKS(100)); // Small delay for clean transition\n#else\n  tusb_time_delay_ms_api(100); // Small delay for clean transition\n#endif  // Switch to the other mode\n  if (current_role == TUSB_ROLE_DEVICE) {\n    printf(\"Starting HOST mode...\\r\\n\");\n    tusb_rhport_init_t host_init = {\n      .role = TUSB_ROLE_HOST,\n      .speed = TUSB_SPEED_AUTO\n    };\n    tusb_init(BOARD_RHPORT, &host_init);\n    current_role = TUSB_ROLE_HOST;\n  } else {\n    printf(\"Starting DEVICE mode...\\r\\n\");\n    tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO\n    };\n    tusb_init(BOARD_RHPORT, &dev_init);\n    current_role = TUSB_ROLE_DEVICE;\n  }\n\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n  printf(\"Mode switch complete!\\r\\n\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Device Mode: CDC Task\n//--------------------------------------------------------------------+\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\nvoid cdc_task(void *params) {\n  (void) params;\n\n  // RTOS forever loop\n  while (1) {\n    // Only process CDC when in device mode\n    if (current_role == TUSB_ROLE_DEVICE) {\n      // Connected and there are data available\n      while (tud_cdc_available()) {\n        uint8_t buf[64];\n\n        // Read data\n        uint32_t count = tud_cdc_read(buf, sizeof(buf));\n\n        // Echo back\n        tud_cdc_write(buf, count);\n\n        // Add newline for carriage return\n        for (uint32_t i = 0; i < count; i++) {\n          if (buf[i] == '\\r') {\n            tud_cdc_write_char('\\n');\n            break;\n          }\n        }\n      }\n\n      tud_cdc_write_flush();\n    }\n\n    vTaskDelay(pdMS_TO_TICKS(10));\n  }\n}\n#else\nvoid cdc_task(void) {\n  // Connected and there are data available\n  if (tud_cdc_available()) {\n    uint8_t buf[64];\n\n    // Read data\n    uint32_t count = tud_cdc_read(buf, sizeof(buf));\n\n    // Echo back\n    for (uint32_t i = 0; i < count; i++) {\n      tud_cdc_write_char(buf[i]);\n\n      if (buf[i] == '\\r') {\n        tud_cdc_write_char('\\n');\n      }\n    }\n\n    tud_cdc_write_flush();\n  }\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Device Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  printf(\"[DEVICE] Mounted\\r\\n\");\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  printf(\"[DEVICE] Unmounted\\r\\n\");\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  printf(\"[DEVICE] Suspended\\r\\n\");\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  printf(\"[DEVICE] Resumed\\r\\n\");\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// Host Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted (configured)\nvoid tuh_mount_cb(uint8_t daddr) {\n  printf(\"[HOST] Device attached, address = %d\\r\\n\", daddr);\n  blink_interval_ms = BLINK_MOUNTED;\n  print_device_info(daddr);\n}\n\n// Invoked when device is unmounted (unplugged)\nvoid tuh_umount_cb(uint8_t daddr) {\n  printf(\"[HOST] Device removed, address = %d\\r\\n\", daddr);\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n//--------------------------------------------------------------------+\n// Host Device Info\n//--------------------------------------------------------------------+\n\nstatic void print_device_info(uint8_t daddr) {\n  // Get Device Descriptor\n  uint8_t xfer_result = tuh_descriptor_get_device_sync(daddr, &desc.device, 18);\n  if (XFER_RESULT_SUCCESS != xfer_result) {\n    printf(\"Failed to get device descriptor\\r\\n\");\n    return;\n  }\n\n  printf(\"Device %u: ID %04x:%04x SN \", daddr, desc.device.idVendor, desc.device.idProduct);\n\n  xfer_result = XFER_RESULT_FAILED;\n  if (desc.device.iSerialNumber != 0) {\n    xfer_result = tuh_descriptor_get_serial_string_sync(daddr, LANGUAGE_ID, desc.serial, sizeof(desc.serial));\n  }\n  if (XFER_RESULT_SUCCESS != xfer_result) {\n    uint16_t* serial = (uint16_t*)(uintptr_t) desc.serial;\n    serial[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * 3 + 2));\n    serial[1] = 'n';\n    serial[2] = '/';\n    serial[3] = 'a';\n    serial[4] = 0;\n  }\n  print_utf16((uint16_t*)(uintptr_t) desc.serial, sizeof(desc.serial)/2);\n  printf(\"\\r\\n\");\n\n  printf(\"Device Descriptor:\\r\\n\");\n  printf(\"  bLength             %u\\r\\n\", desc.device.bLength);\n  printf(\"  bDescriptorType     %u\\r\\n\", desc.device.bDescriptorType);\n  printf(\"  bcdUSB              %04x\\r\\n\", desc.device.bcdUSB);\n  printf(\"  bDeviceClass        %u\\r\\n\", desc.device.bDeviceClass);\n  printf(\"  bDeviceSubClass     %u\\r\\n\", desc.device.bDeviceSubClass);\n  printf(\"  bDeviceProtocol     %u\\r\\n\", desc.device.bDeviceProtocol);\n  printf(\"  bMaxPacketSize0     %u\\r\\n\", desc.device.bMaxPacketSize0);\n  printf(\"  idVendor            0x%04x\\r\\n\", desc.device.idVendor);\n  printf(\"  idProduct           0x%04x\\r\\n\", desc.device.idProduct);\n  printf(\"  bcdDevice           %04x\\r\\n\", desc.device.bcdDevice);\n\n  // Get Manufacturer string\n  if (desc.device.iManufacturer) {\n    if (XFER_RESULT_SUCCESS == tuh_descriptor_get_manufacturer_string_sync(daddr, LANGUAGE_ID, desc.buf, sizeof(desc.buf))) {\n      printf(\"  iManufacturer       %u     \", desc.device.iManufacturer);\n      print_utf16((uint16_t*)(uintptr_t) desc.buf, sizeof(desc.buf)/2);\n      printf(\"\\r\\n\");\n    }\n  }\n\n  // Get Product string\n  if (desc.device.iProduct) {\n    if (XFER_RESULT_SUCCESS == tuh_descriptor_get_product_string_sync(daddr, LANGUAGE_ID, desc.buf, sizeof(desc.buf))) {\n      printf(\"  iProduct            %u     \", desc.device.iProduct);\n      print_utf16((uint16_t*)(uintptr_t) desc.buf, sizeof(desc.buf)/2);\n      printf(\"\\r\\n\");\n    }\n  }\n\n  // Get Serial string\n  if (desc.device.iSerialNumber) {\n    printf(\"  iSerialNumber       %u     \", desc.device.iSerialNumber);\n    print_utf16((uint16_t*)(uintptr_t) desc.serial, sizeof(desc.serial)/2);\n    printf(\"\\r\\n\");\n  } else {\n    printf(\"  iSerialNumber       0\\r\\n\");\n  }\n\n  printf(\"  bNumConfigurations  %u\\r\\n\", desc.device.bNumConfigurations);\n  printf(\"\\r\\n\");\n}\n\nstatic void print_utf16(uint16_t* temp_buf, size_t buf_len) {\n  if (temp_buf[0] == 0 || (temp_buf[0] >> 8) != TUSB_DESC_STRING) {\n    printf(\"(invalid)\");\n    return;\n  }\n\n  size_t chr_count = (temp_buf[0] & 0xff) / 2 - 1;\n  if (chr_count > buf_len - 1) {\n    chr_count = buf_len - 1;\n  }\n\n  for (size_t i = 0; i < chr_count; i++) {\n    uint16_t ch = temp_buf[1 + i];\n    if (ch <= 0x7F) {\n      putchar((char) ch);\n    } else {\n      // TODO support UTF16 to UTF8 conversion\n      putchar('?');\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\nvoid led_blinking_task(void *param) {\n  (void) param;\n  static bool led_state = false;\n\n  // RTOS forever loop\n  while (1) {\n    board_led_write(led_state);\n    led_state = 1 - led_state; // toggle\n    vTaskDelay(pdMS_TO_TICKS(blink_interval_ms));\n  }\n}\n#else\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return; // not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n#endif\n"
  },
  {
    "path": "examples/dual/dynamic_switch/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef _TUSB_CONFIG_H_\n#define _TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used can be defined by board.mk, default to port 0\n#ifndef BOARD_RHPORT\n  #if defined(BOARD_TUD_RHPORT)\n    #define BOARD_RHPORT BOARD_TUD_RHPORT\n  #else\n    #define BOARD_RHPORT 0\n    #define BOARD_TUD_RHPORT 0\n  #endif\n#endif\n\n#if defined(BOARD_TUH_RHPORT)\n  #if BOARD_TUH_RHPORT != BOARD_RHPORT\n    #undef BOARD_TUH_RHPORT\n    #define BOARD_TUH_RHPORT BOARD_RHPORT\n  #endif\n#else\n  #define BOARD_TUH_RHPORT BOARD_RHPORT\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_MAX_SPEED\n  #if defined(BOARD_TUD_MAX_SPEED)\n    #define BOARD_MAX_SPEED BOARD_TUD_MAX_SPEED\n  #else\n    #define BOARD_MAX_SPEED OPT_MODE_DEFAULT_SPEED\n  #endif\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG 0\n#endif\n\n// Enable Device and Host stacks (dual role)\n#define CFG_TUD_ENABLED 1\n#define CFG_TUH_ENABLED 1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED BOARD_MAX_SPEED\n#define CFG_TUH_MAX_SPEED BOARD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUD_MEM_SECTION\n#define CFG_TUD_MEM_SECTION\n#endif\n\n#ifndef CFG_TUD_MEM_ALIGN\n#define CFG_TUD_MEM_ALIGN __attribute__((aligned(4)))\n#endif\n\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION CFG_TUD_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN CFG_TUD_MEM_ALIGN\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE 64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC 1\n#define CFG_TUD_MSC 0\n#define CFG_TUD_HID 0\n#define CFG_TUD_MIDI 0\n#define CFG_TUD_VENDOR 0\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n//--------------------------------------------------------------------\n// HOST CONFIGURATION\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#define CFG_TUH_HUB 1\n// max device support (excluding hub device)\n#define CFG_TUH_DEVICE_MAX (CFG_TUH_HUB ? 4 : 1) // hub typically has 4 ports\n\n#define CFG_TUH_CDC 0\n#define CFG_TUH_HID 0\n#define CFG_TUH_MSC 0\n#define CFG_TUH_VENDOR 0\n\n// max endpoint pair supported by each device\n#define CFG_TUH_ENDPOINT_MAX 16\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/dual/dynamic_switch/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]     AUDIO | MIDI | HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n) ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                 PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4))\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n  .bLength            = sizeof(tusb_desc_device_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE,\n  .bcdUSB             = USB_BCD,\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n  .idVendor           = USB_VID,\n  .idProduct          = USB_PID,\n  .bcdDevice          = 0x0100,\n\n  .iManufacturer      = 0x01,\n  .iProduct           = 0x02,\n  .iSerialNumber      = 0x03,\n\n  .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  return (uint8_t const *) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum {\n  ITF_NUM_CDC = 0,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_TOTAL\n};\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n#elif defined(TUD_ENDPOINT_ONE_DIRECTION_ONLY)\n  // MCUs that don't support a same endpoint number with different direction IN and OUT defined in tusb_mcu.h\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n\n#else\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n#endif\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN)\n\nstatic uint8_t const desc_fs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\nstatic uint8_t const desc_hs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512),\n};\n#endif\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nstatic char const *string_desc_arr[] = {\n  (const char[]) { 0x09, 0x04 }, // 0: is supported language is English (0x0409)\n  \"TinyUSB\",                     // 1: Manufacturer\n  \"TinyUSB Device\",              // 2: Product\n  NULL,                          // 3: Serials, will use unique ID if possible\n  \"TinyUSB CDC\",                 // 4: CDC Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) { return NULL; }\n\n      const char *str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) { chr_count = max_count; }\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/dual/host_hid_to_device_cdc/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(host_hid_to_device_cdc C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_dual_usb_example(${PROJECT_NAME} noos)\n\n# due to warnings from Pico-PIO-USB\nif (FAMILY STREQUAL rp2040)\n  target_compile_options(${PROJECT_NAME} PUBLIC\n    -Wno-error=shadow\n    -Wno-error=cast-align\n    -Wno-error=cast-qual\n    -Wno-error=redundant-decls\n    -Wno-error=sign-conversion\n    -Wno-error=conversion\n    -Wno-error=sign-compare\n    -Wno-error=unused-function\n    )\nendif ()\n"
  },
  {
    "path": "examples/dual/host_hid_to_device_cdc/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/dual/host_hid_to_device_cdc/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\nCFLAGS_GCC += -Wno-error=cast-align -Wno-error=null-dereference\n\nSRC_C += \\\n\tsrc/class/hid/hid_host.c \\\n\tsrc/host/hub.c \\\n\tsrc/host/usbh.c\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/dual/host_hid_to_device_cdc/only.txt",
    "content": "board:mimxrt1060_evk\nboard:mimxrt1064_evk\nboard:mcb1800\nmcu:CH32V20X\nmcu:RP2040\nmcu:ra6m5\nmcu:MAX3421\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32H7\n"
  },
  {
    "path": "examples/dual/host_hid_to_device_cdc/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n// This example runs both host and device concurrently. The USB host receive\n// reports from HID device and print it out over USB Device CDC interface.\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n// uncomment if you are using colemak layout\n// #define KEYBOARD_COLEMAK\n\n#ifdef KEYBOARD_COLEMAK\nconst uint8_t colemak[128] = {\n  0  ,  0,  0,  0,  0,  0,  0, 22,\n  9  , 23,  7,  0, 24, 17,  8, 12,\n  0  , 14, 28, 51,  0, 19, 21, 10,\n  15 ,  0,  0,  0, 13,  0,  0,  0,\n  0  ,  0,  0,  0,  0,  0,  0,  0,\n  0  ,  0,  0,  0,  0,  0,  0,  0,\n  0  ,  0,  0, 18,  0,  0,  0,  0,\n  0  ,  0,  0,  0,  0,  0,  0,  0,\n  0  ,  0,  0,  0,  0,  0,  0,  0,\n  0  ,  0,  0,  0,  0,  0,  0,  0\n};\n#endif\n\nstatic uint8_t const keycode2ascii[128][2] = {HID_KEYCODE_TO_ASCII};\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  printf(\"TinyUSB Host HID <-> Device CDC Example\\r\\n\");\n\n  // init device and host stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  tusb_rhport_init_t host_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUH_RHPORT, &host_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    tud_task(); // tinyusb device task\n    tuh_task(); // tinyusb host task\n    led_blinking_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device CDC\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\n// Invoked when CDC interface received data from host\nvoid tud_cdc_rx_cb(uint8_t itf) {\n  (void) itf;\n\n  char buf[64];\n  uint32_t count = tud_cdc_read(buf, sizeof(buf));\n\n  // TODO control LED on keyboard of host stack\n  (void) count;\n}\n\n//--------------------------------------------------------------------+\n// Host HID\n//--------------------------------------------------------------------+\n\n// Invoked when device with hid interface is mounted\n// Report descriptor is also available for use. tuh_hid_parse_report_descriptor()\n// can be used to parse common/simple enough descriptor.\n// Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped\n// therefore report_desc = NULL, desc_len = 0\nvoid tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len) {\n  (void) desc_report;\n  (void) desc_len;\n\n  // Interface protocol (hid_interface_protocol_enum_t)\n  const char* protocol_str[] = {\"None\", \"Keyboard\", \"Mouse\"};\n  uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);\n\n  uint16_t vid, pid;\n  tuh_vid_pid_get(dev_addr, &vid, &pid);\n\n  char tempbuf[256];\n  int count = sprintf(\n      tempbuf, \"[%04x:%04x][%u] HID Interface%u, Protocol = %s\\r\\n\", vid, pid, dev_addr, instance,\n      protocol_str[itf_protocol]);\n\n  tud_cdc_write(tempbuf, (uint32_t) count);\n  tud_cdc_write_flush();\n\n  // Receive report from boot keyboard & mouse only\n  // tuh_hid_report_received_cb() will be invoked when report is available\n  if (itf_protocol == HID_ITF_PROTOCOL_KEYBOARD || itf_protocol == HID_ITF_PROTOCOL_MOUSE) {\n    if (!tuh_hid_receive_report(dev_addr, instance)) {\n      tud_cdc_write_str(\"Error: cannot request report\\r\\n\");\n    }\n  }\n}\n\n// Invoked when device with hid interface is un-mounted\nvoid tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) {\n  char tempbuf[256];\n  int count = sprintf(tempbuf, \"[%u] HID Interface%u is unmounted\\r\\n\", dev_addr, instance);\n  tud_cdc_write(tempbuf, (uint32_t) count);\n  tud_cdc_write_flush();\n}\n\n// look up new key in previous keys\nstatic inline bool find_key_in_report(hid_keyboard_report_t const* report, uint8_t keycode) {\n  for (uint8_t i = 0; i < 6; i++) {\n    if (report->keycode[i] == keycode) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n\n// convert hid keycode to ascii and print via usb device CDC (ignore non-printable)\nstatic void process_kbd_report(uint8_t dev_addr, hid_keyboard_report_t const* report) {\n  (void) dev_addr;\n  static hid_keyboard_report_t prev_report = {0, 0, {0}}; // previous report to check key released\n  bool flush = false;\n\n  for (uint8_t i = 0; i < 6; i++) {\n    uint8_t keycode = report->keycode[i];\n    if (keycode) {\n      if (find_key_in_report(&prev_report, keycode)) {\n        // exist in previous report means the current key is holding\n      } else {\n        // not existed in previous report means the current key is pressed\n\n        // remap the key code for Colemak layout\n        #ifdef KEYBOARD_COLEMAK\n        uint8_t colemak_key_code = colemak[keycode];\n        if (colemak_key_code != 0) keycode = colemak_key_code;\n        #endif\n\n        bool const is_shift = report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);\n        uint8_t ch = keycode2ascii[keycode][is_shift ? 1 : 0];\n\n        if (ch) {\n          if (ch == '\\n') tud_cdc_write(\"\\r\", 1);\n          tud_cdc_write(&ch, 1);\n          flush = true;\n        }\n      }\n    }\n    // TODO example skips key released\n  }\n\n  if (flush) {\n    tud_cdc_write_flush();\n  }\n\n  prev_report = *report;\n}\n\n// send mouse report to usb device CDC\nstatic void process_mouse_report(uint8_t dev_addr, hid_mouse_report_t const* report) {\n  //------------- button state  -------------//\n  //uint8_t button_changed_mask = report->buttons ^ prev_report.buttons;\n  char l = report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-';\n  char m = report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-';\n  char r = report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-';\n\n  char tempbuf[32];\n  int count = sprintf(tempbuf, \"[%u] %c%c%c %d %d %d\\r\\n\", dev_addr, l, m, r, report->x, report->y, report->wheel);\n\n  tud_cdc_write(tempbuf, (uint32_t) count);\n  tud_cdc_write_flush();\n}\n\n// Invoked when received report from device via interrupt endpoint\nvoid tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len) {\n  (void) len;\n  uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);\n\n  switch (itf_protocol) {\n    case HID_ITF_PROTOCOL_KEYBOARD:\n      process_kbd_report(dev_addr, (hid_keyboard_report_t const*) report);\n      break;\n\n    case HID_ITF_PROTOCOL_MOUSE:\n      process_mouse_report(dev_addr, (hid_mouse_report_t const*) report);\n      break;\n\n    default:\n      break;\n  }\n\n  // continue to request to receive report\n  if (!tuh_hid_receive_report(dev_addr, instance)) {\n    tud_cdc_write_str(\"Error: cannot request report\\r\\n\");\n  }\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) return; // not enough time\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/dual/host_hid_to_device_cdc/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n// RHPort number used for host can be defined by board.mk, default to port 1\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      1\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack, Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_ENABLED       1\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n// Enable Host stack, Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_ENABLED       1\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n// Use pico-pio-usb as host controller for raspberry rp2040\n#define CFG_TUH_RPI_PIO_USB   1\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUD_MEM_SECTION\n#define CFG_TUD_MEM_SECTION\n#endif\n\n#ifndef CFG_TUD_MEM_ALIGN\n#define CFG_TUD_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC              1\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n//--------------------------------------------------------------------\n// HOST CONFIGURATION\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN           __attribute__ ((aligned(4)))\n#endif\n\n#define CFG_TUH_HUB                 1\n// max device support (excluding hub device)\n#define CFG_TUH_DEVICE_MAX          (CFG_TUH_HUB ? 4 : 1) // hub typically has 4 ports\n\n#define CFG_TUH_HID                 (3*CFG_TUH_DEVICE_MAX)\n#define CFG_TUH_HID_EPIN_BUFSIZE    64\n#define CFG_TUH_HID_EPOUT_BUFSIZE   64\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/dual/host_hid_to_device_cdc/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n\n    // Use Interface Association Descriptor (IAD) for CDC\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const* tud_descriptor_device_cb(void) {\n  return (uint8_t const*) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum {\n  ITF_NUM_CDC = 0,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_TOTAL\n};\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n#elif CFG_TUSB_MCU == OPT_MCU_SAMG || CFG_TUSB_MCU == OPT_MCU_SAMX7X\n  // SAMG & SAME70 don't support a same endpoint number with different direction IN and OUT\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 doesn't support a same endpoint number with different direction IN and OUT\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_CDC_NOTIF   0x83\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x81\n\n#elif CFG_TUSB_MCU == OPT_MCU_FT90X || CFG_TUSB_MCU == OPT_MCU_FT93X\n// FT9XX doesn't support a same endpoint number with different direction IN and OUT\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n\n#else\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n#endif\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN)\n\n// full speed configuration\nstatic uint8_t const desc_fs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\n\n// high speed configuration\nstatic uint8_t const desc_hs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512),\n};\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = USB_BCD,\n\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const*) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const* tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ?  desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nchar const* string_desc_arr[] = {\n    (const char[]) {0x09, 0x04}, // 0: is supported language is English (0x0409)\n    \"TinyUSB\",                     // 1: Manufacturer\n    \"TinyUSB Device\",              // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"TinyUSB CDC\",                 // 4: CDC Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) return NULL;\n\n      const char* str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/dual/host_info_to_device_cdc/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(host_info_to_device_cdc C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_dual_usb_example(${PROJECT_NAME} ${RTOS})\n\n# due to warnings from Pico-PIO-USB\nif (FAMILY STREQUAL rp2040)\n  target_compile_options(${PROJECT_NAME} PUBLIC\n    -Wno-error=shadow\n    -Wno-error=cast-align\n    -Wno-error=cast-qual\n    -Wno-error=redundant-decls\n    -Wno-error=sign-conversion\n    -Wno-error=conversion\n    -Wno-error=sign-compare\n    -Wno-error=unused-function\n    )\nendif ()\n"
  },
  {
    "path": "examples/dual/host_info_to_device_cdc/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/dual/host_info_to_device_cdc/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += $(wildcard src/*.c)\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\nCFLAGS_GCC += -Wno-error=cast-align -Wno-error=null-dereference\n\nSRC_C += \\\n\tsrc/host/hub.c \\\n\tsrc/host/usbh.c\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/dual/host_info_to_device_cdc/only.txt",
    "content": "board:mimxrt1060_evk\nboard:mimxrt1064_evk\nboard:mcb1800\nmcu:CH32V20X\nmcu:RP2040\nmcu:ra6m5\nmcu:MAX3421\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32H7\nmcu:ESP32P4\n"
  },
  {
    "path": "examples/dual/host_info_to_device_cdc/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\" \"usb_descriptors.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/dual/host_info_to_device_cdc/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* Host example will get device descriptors of attached devices and print it out via device cdc as follows:\n *    Device 1: ID 046d:c52f SN 11223344\n      Device Descriptor:\n        bLength             18\n        bDescriptorType     1\n        bcdUSB              0200\n        bDeviceClass        0\n        bDeviceSubClass     0\n        bDeviceProtocol     0\n        bMaxPacketSize0     8\n        idVendor            0x046d\n        idProduct           0xc52f\n        bcdDevice           2200\n        iManufacturer       1     Logitech\n        iProduct            2     USB Receiver\n        iSerialNumber       0\n        bNumConfigurations  1\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n// Language ID: English\n#define LANGUAGE_ID 0x0409\n\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\nstatic bool               is_printable[CFG_TUH_DEVICE_MAX + 1] = {0};\nstatic tusb_desc_device_t descriptor_device[CFG_TUH_DEVICE_MAX+1];\n\nstatic void print_utf16(uint16_t *temp_buf, size_t buf_len);\nstatic void print_device_info(uint8_t daddr, const tusb_desc_device_t* desc_device);\n\nstatic void led_blinking_task(void);\nstatic void cdc_task(void);\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\nstatic void freertos_init(void);\n#endif\n\n#define cdc_printf(...)                                           \\\n  do {                                                            \\\n    char _tempbuf[256];                                           \\\n    char* _bufptr = _tempbuf;                                     \\\n    uint32_t count = (uint32_t) sprintf(_tempbuf, __VA_ARGS__);   \\\n    while (count > 0) {                                           \\\n        uint32_t wr_count = tud_cdc_write(_bufptr, count);        \\\n        count -= wr_count;                                        \\\n        _bufptr += wr_count;                                      \\\n        if (count > 0){                                           \\\n          tud_task();                                             \\\n          tud_cdc_write_flush();                                  \\\n        }                                                         \\\n    }                                                             \\\n  } while(0)\n\n\nstatic void usb_device_init(void) {\n  // init device and host stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n  board_init_after_tusb();\n}\n\nstatic void usb_host_init(void) {\n  // init host stack on configured roothub port\n  tusb_rhport_init_t host_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUH_RHPORT, &host_init);\n  board_init_after_tusb();\n}\n\n//--------------------------------------------------------------------+\n// Main\n//--------------------------------------------------------------------+\nstatic void main_task(void* param) {\n  (void) param;\n\n  while (1) {\n    cdc_task();\n    led_blinking_task();\n\n    // preempted RTOS run device/host stack in its own task\n#if CFG_TUSB_OS == OPT_OS_NONE || CFG_TUSB_OS == OPT_OS_PICO\n    tud_task(); // tinyusb device task\n    tuh_task(); // tinyusb host task\n#endif\n  }\n}\n\nint main(void) {\n  board_init();\n\n#if CFG_TUSB_OS == OPT_OS_NONE || CFG_TUSB_OS == OPT_OS_PICO\n  printf(\"TinyUSB Host Information -> Device CDC Example\\r\\n\");\n\n  usb_device_init();\n  usb_host_init();\n\n  main_task(NULL);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  freertos_init(); // create RTOS tasks for device, host stack and main_task()\n#else\n  #error RTOS not supported\n#endif\n\n  return 0;\n}\n\n#if CFG_TUSB_OS != OPT_OS_NONE && CFG_TUSB_OS != OPT_OS_PICO\n// USB Device Driver task for RTOS\nstatic void usb_device_task(void *param) {\n  (void) param;\n  usb_device_init();\n  while (1) {\n    // put this thread to waiting state until there is new events\n    tud_task();\n  }\n}\n\nstatic void usb_host_task(void *param) {\n  (void) param;\n  usb_host_init();\n  while (1) {\n    // put this thread to waiting state until there is new events\n    tuh_task();\n  }\n}\n#endif\n\n\n//--------------------------------------------------------------------+\n// Device CDC\n//--------------------------------------------------------------------+\n\n// Invoked when device is mounted\nvoid tud_mount_cb(void) {\n  blink_interval_ms = BLINK_MOUNTED;\n}\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n}\n\n// Invoked when usb bus is suspended\n// remote_wakeup_en : if host allow us  to perform remote wakeup\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n  blink_interval_ms = BLINK_SUSPENDED;\n}\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void) {\n  blink_interval_ms = tud_mounted() ? BLINK_MOUNTED : BLINK_NOT_MOUNTED;\n}\n\nvoid cdc_task(void) {\n  static uint32_t connected_ms = 0;\n\n  if (!tud_cdc_connected()) {\n    connected_ms = tusb_time_millis_api();\n    return;\n  }\n\n  // delay a bit otherwise we can outpace host's terminal. Linux will set LineState (DTR) then Line Coding.\n  // If we send data before Linux's terminal set Line Coding, it can be ignored --> missing data with hardware test loop\n  if (tusb_time_millis_api() - connected_ms < 100) {\n    return; // wait for stable connection\n  }\n\n  for (uint8_t daddr = 1; daddr <= CFG_TUH_DEVICE_MAX; daddr++) {\n    if (tuh_mounted(daddr)) {\n      if (is_printable[daddr]) {\n        is_printable[daddr] = false;\n        print_device_info(daddr, &descriptor_device[daddr]);\n        tud_cdc_write_flush();\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Host Get device information\n//--------------------------------------------------------------------+\nstatic void print_device_info(uint8_t daddr, const tusb_desc_device_t* desc_device) {\n  // Get String descriptor using Sync API\n  uint16_t serial[64];\n  uint16_t buf[128];\n  (void) buf;\n\n  cdc_printf(\"Device %u: ID %04x:%04x SN \", daddr, desc_device->idVendor, desc_device->idProduct);\n  uint8_t xfer_result = tuh_descriptor_get_serial_string_sync(daddr, LANGUAGE_ID, serial, sizeof(serial));\n  if (XFER_RESULT_SUCCESS != xfer_result) {\n    serial[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * 1 + 2));\n    serial[1] = '0';\n    serial[2] = 0;\n  }\n  print_utf16(serial, TU_ARRAY_SIZE(serial));\n  cdc_printf(\"\\r\\n\");\n\n  cdc_printf(\"Device Descriptor:\\r\\n\");\n  cdc_printf(\"  bLength             %u\\r\\n\"     , desc_device->bLength);\n  cdc_printf(\"  bDescriptorType     %u\\r\\n\"     , desc_device->bDescriptorType);\n  cdc_printf(\"  bcdUSB              %04x\\r\\n\"   , desc_device->bcdUSB);\n  cdc_printf(\"  bDeviceClass        %u\\r\\n\"     , desc_device->bDeviceClass);\n  cdc_printf(\"  bDeviceSubClass     %u\\r\\n\"     , desc_device->bDeviceSubClass);\n  cdc_printf(\"  bDeviceProtocol     %u\\r\\n\"     , desc_device->bDeviceProtocol);\n  cdc_printf(\"  bMaxPacketSize0     %u\\r\\n\"     , desc_device->bMaxPacketSize0);\n  cdc_printf(\"  idVendor            0x%04x\\r\\n\" , desc_device->idVendor);\n  cdc_printf(\"  idProduct           0x%04x\\r\\n\" , desc_device->idProduct);\n  cdc_printf(\"  bcdDevice           %04x\\r\\n\"   , desc_device->bcdDevice);\n\n  cdc_printf(\"  iManufacturer       %u     \"     , desc_device->iManufacturer);\n  xfer_result = tuh_descriptor_get_manufacturer_string_sync(daddr, LANGUAGE_ID, buf, sizeof(buf));\n  if (XFER_RESULT_SUCCESS == xfer_result) {\n    print_utf16(buf, TU_ARRAY_SIZE(buf));\n  }\n  cdc_printf(\"\\r\\n\");\n\n  cdc_printf(\"  iProduct            %u     \"     , desc_device->iProduct);\n  xfer_result = tuh_descriptor_get_product_string_sync(daddr, LANGUAGE_ID, buf, sizeof(buf));\n  if (XFER_RESULT_SUCCESS == xfer_result) {\n    print_utf16(buf, TU_ARRAY_SIZE(buf));\n  }\n  cdc_printf(\"\\r\\n\");\n\n  cdc_printf(\"  iSerialNumber       %u     \"     , desc_device->iSerialNumber);\n  cdc_printf(\"%s \\r\\n\", (char*)serial); // serial is already to UTF-8\n  cdc_printf(\"  bNumConfigurations  %u\\r\\n\"     , desc_device->bNumConfigurations);\n}\n\nvoid tuh_enum_descriptor_device_cb(uint8_t daddr, tusb_desc_device_t const* desc_device) {\n  (void) daddr;\n  descriptor_device[daddr] = *desc_device; // save device descriptor\n}\n\nvoid tuh_mount_cb(uint8_t daddr) {\n  cdc_printf(\"mounted device %u\\r\\n\", daddr);\n  tud_cdc_write_flush();\n  is_printable[daddr] = true;\n}\n\nvoid tuh_umount_cb(uint8_t daddr) {\n  cdc_printf(\"unmounted device %u\\r\\n\", daddr);\n  tud_cdc_write_flush();\n  is_printable[daddr] = false;\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n    return;// not enough time\n  }\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n\n//--------------------------------------------------------------------+\n// String Descriptor Helper\n//--------------------------------------------------------------------+\nstatic void _convert_utf16le_to_utf8(const uint16_t *utf16, size_t utf16_len, uint8_t *utf8, size_t utf8_len) {\n  // TODO: Check for runover.\n  (void)utf8_len;\n  // Get the UTF-16 length out of the data itself.\n\n  for (size_t i = 0; i < utf16_len; i++) {\n    uint16_t chr = utf16[i];\n    if (chr < 0x80) {\n      *utf8++ = chr & 0xffu;\n    } else if (chr < 0x800) {\n      *utf8++ = (uint8_t)(0xC0 | (chr >> 6 & 0x1F));\n      *utf8++ = (uint8_t)(0x80 | (chr >> 0 & 0x3F));\n    } else {\n      // TODO: Verify surrogate.\n      *utf8++ = (uint8_t)(0xE0 | (chr >> 12 & 0x0F));\n      *utf8++ = (uint8_t)(0x80 | (chr >> 6 & 0x3F));\n      *utf8++ = (uint8_t)(0x80 | (chr >> 0 & 0x3F));\n    }\n    // TODO: Handle UTF-16 code points that take two entries.\n  }\n}\n\n// Count how many bytes a utf-16-le encoded string will take in utf-8.\nstatic int _count_utf8_bytes(const uint16_t *buf, size_t len) {\n  size_t total_bytes = 0;\n  for (size_t i = 0; i < len; i++) {\n    uint16_t chr = buf[i];\n    if (chr < 0x80) {\n      total_bytes += 1;\n    } else if (chr < 0x800) {\n      total_bytes += 2;\n    } else {\n      total_bytes += 3;\n    }\n    // TODO: Handle UTF-16 code points that take two entries.\n  }\n  return (int) total_bytes;\n}\n\nstatic void print_utf16(uint16_t *temp_buf, size_t buf_len) {\n  if ((temp_buf[0] & 0xff) == 0) {\n    return;// empty\n  }\n  size_t utf16_len = ((temp_buf[0] & 0xff) - 2) / sizeof(uint16_t);\n  size_t utf8_len = (size_t) _count_utf8_bytes(temp_buf + 1, utf16_len);\n  _convert_utf16le_to_utf8(temp_buf + 1, utf16_len, (uint8_t *) temp_buf, sizeof(uint16_t) * buf_len);\n  ((uint8_t*) temp_buf)[utf8_len] = '\\0';\n\n  cdc_printf(\"%s\", (char*) temp_buf);\n}\n\n//--------------------------------------------------------------------+\n// FreeRTOS\n//--------------------------------------------------------------------+\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n\n#ifdef ESP_PLATFORM\n  #define USBD_STACK_SIZE     4096\n  #define USBH_STACK_SIZE     4096\n  void app_main(void) {\n    main();\n  }\n#else\n  // Increase stack size when debug log is enabled\n  #define USBD_STACK_SIZE    (configMINIMAL_STACK_SIZE * (CFG_TUSB_DEBUG ? 4 : 2))\n  #define USBH_STACK_SIZE    (configMINIMAL_STACK_SIZE * (CFG_TUSB_DEBUG ? 4 : 2))\n#endif\n\n#define MAIN_STACK_SIZE    (configMINIMAL_STACK_SIZE*4)\n\n// static task\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t main_stack[MAIN_STACK_SIZE];\nStaticTask_t main_taskdef;\n\nStackType_t  usb_device_stack[USBD_STACK_SIZE];\nStaticTask_t usb_device_taskdef;\n\nStackType_t  usb_host_stack[USBH_STACK_SIZE];\nStaticTask_t usb_host_taskdef;\n#endif\n\nvoid freertos_init(void) {\n  #if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_device_stack, &usb_device_taskdef);\n  xTaskCreateStatic(usb_host_task, \"usbh\", USBH_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_host_stack, &usb_host_taskdef);\n  xTaskCreateStatic(main_task, \"main\", MAIN_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, main_stack, &main_taskdef);\n  #else\n  xTaskCreate(usb_device_task, \"usbd\", USBD_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(usb_host_task, \"usbh\", USBH_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n  xTaskCreate(main_task, \"main\", MAIN_STACK_SIZE, NULL, configMAX_PRIORITIES - 2, NULL);\n  #endif\n\n  // only start scheduler for non-espressif mcu\n  #ifndef ESP_PLATFORM\n  vTaskStartScheduler();\n  #endif\n}\n\n#endif\n"
  },
  {
    "path": "examples/dual/host_info_to_device_cdc/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n// RHPort number used for host can be defined by board.mk, default to port 1\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      1\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack, Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_ENABLED       1\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n// Enable Host stack, Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_ENABLED       1\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n// Use pico-pio-usb as host controller for raspberry rp2040\n#define CFG_TUH_RPI_PIO_USB   1\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUD_MEM_SECTION\n#define CFG_TUD_MEM_SECTION\n#endif\n\n#ifndef CFG_TUD_MEM_ALIGN\n#define CFG_TUD_MEM_ALIGN        __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC              1\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 256)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n//--------------------------------------------------------------------\n// HOST CONFIGURATION\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN           __attribute__ ((aligned(4)))\n#endif\n\n#define CFG_TUH_HUB                 1\n// max device support (excluding hub device)\n#define CFG_TUH_DEVICE_MAX          (CFG_TUH_HUB ? 4 : 1) // hub typically has 4 ports\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/dual/host_info_to_device_cdc/src/usb_descriptors.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save device driver after the first plug.\n * Same VID/PID with different interface e.g MSC (first), then CDC (later) will possibly cause system error on PC.\n *\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n)  ((CFG_TUD_##itf) ? (1 << (n)) : 0)\n#define USB_PID           (0x4000 | PID_MAP(CDC, 0) | PID_MAP(MSC, 1) | PID_MAP(HID, 2) | \\\n                           PID_MAP(MIDI, 3) | PID_MAP(VENDOR, 4) )\n\n#define USB_VID   0xCafe\n#define USB_BCD   0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\nstatic tusb_desc_device_t const desc_device = {\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = USB_BCD,\n\n    // Use Interface Association Descriptor (IAD) for CDC\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = USB_VID,\n    .idProduct          = USB_PID,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const* tud_descriptor_device_cb(void) {\n  return (uint8_t const*) &desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum {\n  ITF_NUM_CDC = 0,\n  ITF_NUM_CDC_DATA,\n  ITF_NUM_TOTAL\n};\n\n#if CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX\n  // LPC 17xx and 40xx endpoint type (bulk/interrupt/iso) are fixed by its number\n  // 0 control, 1 In, 2 Bulk, 3 Iso, 4 In, 5 Bulk etc ...\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n#elif CFG_TUSB_MCU == OPT_MCU_SAMG || CFG_TUSB_MCU == OPT_MCU_SAMX7X\n  // SAMG & SAME70 don't support a same endpoint number with different direction IN and OUT\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n\n#elif CFG_TUSB_MCU == OPT_MCU_CXD56\n  // CXD56 doesn't support a same endpoint number with different direction IN and OUT\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  // CXD56 USB driver has fixed endpoint type (bulk/interrupt/iso) and direction (IN/OUT) by its number\n  // 0 control (IN/OUT), 1 Bulk (IN), 2 Bulk (OUT), 3 In (IN), 4 Bulk (IN), 5 Bulk (OUT), 6 In (IN)\n  #define EPNUM_CDC_NOTIF   0x83\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x81\n\n#elif CFG_TUSB_MCU == OPT_MCU_FT90X || CFG_TUSB_MCU == OPT_MCU_FT93X\n// FT9XX doesn't support a same endpoint number with different direction IN and OUT\n  //    e.g EP1 OUT & EP1 IN cannot exist together\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x83\n\n#else\n  #define EPNUM_CDC_NOTIF   0x81\n  #define EPNUM_CDC_OUT     0x02\n  #define EPNUM_CDC_IN      0x82\n\n#endif\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN)\n\n// full speed configuration\nstatic uint8_t const desc_fs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and other_speed_configuration\n\n// high speed configuration\nstatic uint8_t const desc_hs_configuration[] = {\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n  // Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n  TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT, EPNUM_CDC_IN, 512),\n};\n\n// other speed configuration\nstatic uint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change configuration based on speed\nstatic tusb_desc_device_qualifier_t const desc_device_qualifier = {\n  .bLength            = sizeof(tusb_desc_device_qualifier_t),\n  .bDescriptorType    = TUSB_DESC_DEVICE_QUALIFIER,\n  .bcdUSB             = USB_BCD,\n\n  .bDeviceClass       = TUSB_CLASS_MISC,\n  .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n  .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n  .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n  .bNumConfigurations = 0x01,\n  .bReserved          = 0x00\n};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const*) &desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const* tud_descriptor_configuration_cb(uint8_t index) {\n  (void) index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ?  desc_hs_configuration : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// String Descriptor Index\nenum {\n  STRID_LANGID = 0,\n  STRID_MANUFACTURER,\n  STRID_PRODUCT,\n  STRID_SERIAL,\n};\n\n// array of pointer to string descriptors\nchar const* string_desc_arr[] = {\n    (const char[]) {0x09, 0x04}, // 0: is supported language is English (0x0409)\n    \"TinyUSB\",                     // 1: Manufacturer\n    \"TinyUSB Device\",              // 2: Product\n    NULL,                          // 3: Serials will use unique ID if possible\n    \"TinyUSB CDC\",                 // 4: CDC Interface\n};\n\nstatic uint16_t _desc_str[32 + 1];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n  size_t chr_count;\n\n  switch (index) {\n    case STRID_LANGID:\n      memcpy(&_desc_str[1], string_desc_arr[0], 2);\n      chr_count = 1;\n      break;\n\n    case STRID_SERIAL:\n      chr_count = board_usb_get_serial(_desc_str + 1, 32);\n      break;\n\n    default:\n      // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n      // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n      if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0]))) return NULL;\n\n      const char* str = string_desc_arr[index];\n\n      // Cap at max char\n      chr_count = strlen(str);\n      size_t const max_count = sizeof(_desc_str) / sizeof(_desc_str[0]) - 1; // -1 for string type\n      if (chr_count > max_count) chr_count = max_count;\n\n      // Convert ASCII string into UTF-16\n      for (size_t i = 0; i < chr_count; i++) {\n        _desc_str[1 + i] = str[i];\n      }\n      break;\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t) ((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "examples/host/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../hw/bsp/family_support.cmake)\n\nproject(tinyusb_host_examples C CXX ASM)\nfamily_initialize_project(tinyusb_host_examples ${CMAKE_CURRENT_LIST_DIR})\n\n# family_add_subdirectory will filter what to actually add based on selected FAMILY\nset(EXAMPLE_LIST\n  bare_api\n  cdc_msc_hid\n  cdc_msc_hid_freertos\n  device_info\n  hid_controller\n  midi_rx\n  msc_file_explorer\n  )\n\nforeach (example ${EXAMPLE_LIST})\n  family_add_subdirectory(${example})\nendforeach ()\n"
  },
  {
    "path": "examples/host/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/host/bare_api/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(bare_api C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_host_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/host/bare_api/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/host/bare_api/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n\tsrc/main.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/host/bare_api/only.txt",
    "content": "family:hpmicro\nfamily:samd21\nfamily:samd5x_e5x\nmcu:CH32V20X\nmcu:KINETIS_KL\nmcu:LPC175X_6X\nmcu:LPC177X_8X\nmcu:LPC18XX\nmcu:LPC40XX\nmcu:LPC43XX\nmcu:LPC54\nmcu:LPC55\nmcu:MAX3421\nmcu:MIMXRT10XX\nmcu:MIMXRT11XX\nmcu:MIMXRT1XXX\nmcu:MSP432E4\nmcu:RAXXX\nmcu:RP2040\nmcu:RW61X\nmcu:RX65X\nmcu:STM32C0\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32G0\nmcu:STM32H5\nmcu:STM32H7\nmcu:STM32H7RS\nmcu:STM32N6\nmcu:STM32U3\nmcu:STM32U5\n"
  },
  {
    "path": "examples/host/bare_api/skip.txt",
    "content": "board:lpcxpresso54114\n"
  },
  {
    "path": "examples/host/bare_api/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"class/hid/hid.h\"\n\n// English\n#define LANGUAGE_ID 0x0409\n#define BUF_COUNT   4\n\n\nCFG_TUH_MEM_SECTION tusb_desc_device_t desc_device;\n\nCFG_TUH_MEM_SECTION uint8_t buf_pool[BUF_COUNT][64];\nuint8_t buf_owner[BUF_COUNT] = { 0 }; // device address that owns buffer\n\nCFG_TUH_MEM_SECTION uint16_t temp_buf[128]; // temp buffer for string descriptor\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void);\n\nstatic void print_utf16(uint16_t *temp_buf, size_t buf_len);\nvoid print_device_descriptor(tuh_xfer_t* xfer);\nvoid parse_config_descriptor(uint8_t dev_addr, tusb_desc_configuration_t const* desc_cfg);\n\nuint8_t* get_hid_buf(uint8_t daddr);\nvoid free_hid_buf(uint8_t daddr);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  printf(\"TinyUSB Bare API Example\\r\\n\");\n\n  // init host stack on configured roothub port\n  tusb_rhport_init_t host_init = {\n      .role = TUSB_ROLE_HOST,\n      .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUH_RHPORT, &host_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    // tinyusb host task\n    tuh_task();\n    led_blinking_task();\n  }\n}\n\n/*------------- TinyUSB Callbacks -------------*/\n\n// Invoked when device is mounted (configured)\nvoid tuh_mount_cb(uint8_t daddr) {\n  printf(\"Device attached, address = %d\\r\\n\", daddr);\n\n  // Get Device Descriptor\n  // TODO: invoking control transfer now has issue with mounting hub with multiple devices attached, fix later\n  tuh_descriptor_get_device(daddr, &desc_device, 18, print_device_descriptor, 0);\n}\n\n/// Invoked when device is unmounted (bus reset/unplugged)\nvoid tuh_umount_cb(uint8_t daddr) {\n  printf(\"Device removed, address = %d\\r\\n\", daddr);\n  free_hid_buf(daddr);\n}\n\n//--------------------------------------------------------------------+\n// Device Descriptor\n//--------------------------------------------------------------------+\nvoid print_device_descriptor(tuh_xfer_t *xfer) {\n  if (XFER_RESULT_SUCCESS != xfer->result) {\n    printf(\"Failed to get device descriptor\\r\\n\");\n    return;\n  }\n\n  uint8_t const daddr = xfer->daddr;\n\n  printf(\"Device %u: ID %04x:%04x\\r\\n\", daddr, desc_device.idVendor, desc_device.idProduct);\n  printf(\"Device Descriptor:\\r\\n\");\n  printf(\"  bLength             %u\\r\\n\"     , desc_device.bLength);\n  printf(\"  bDescriptorType     %u\\r\\n\"     , desc_device.bDescriptorType);\n  printf(\"  bcdUSB              %04x\\r\\n\"   , desc_device.bcdUSB);\n  printf(\"  bDeviceClass        %u\\r\\n\"     , desc_device.bDeviceClass);\n  printf(\"  bDeviceSubClass     %u\\r\\n\"     , desc_device.bDeviceSubClass);\n  printf(\"  bDeviceProtocol     %u\\r\\n\"     , desc_device.bDeviceProtocol);\n  printf(\"  bMaxPacketSize0     %u\\r\\n\"     , desc_device.bMaxPacketSize0);\n  printf(\"  idVendor            0x%04x\\r\\n\" , desc_device.idVendor);\n  printf(\"  idProduct           0x%04x\\r\\n\" , desc_device.idProduct);\n  printf(\"  bcdDevice           %04x\\r\\n\"   , desc_device.bcdDevice);\n\n  // Get String descriptor using Sync API\n  printf(\"  iManufacturer       %u     \", desc_device.iManufacturer);\n  if (XFER_RESULT_SUCCESS == tuh_descriptor_get_manufacturer_string_sync(daddr, LANGUAGE_ID, temp_buf, sizeof(temp_buf))) {\n    print_utf16(temp_buf, TU_ARRAY_SIZE(temp_buf));\n  }\n  printf(\"\\r\\n\");\n\n  printf(\"  iProduct            %u     \", desc_device.iProduct);\n  if (XFER_RESULT_SUCCESS == tuh_descriptor_get_product_string_sync(daddr, LANGUAGE_ID, temp_buf, sizeof(temp_buf))) {\n    print_utf16(temp_buf, TU_ARRAY_SIZE(temp_buf));\n  }\n  printf(\"\\r\\n\");\n\n  printf(\"  iSerialNumber       %u     \", desc_device.iSerialNumber);\n  if (XFER_RESULT_SUCCESS == tuh_descriptor_get_serial_string_sync(daddr, LANGUAGE_ID, temp_buf, sizeof(temp_buf))) {\n    print_utf16(temp_buf, TU_ARRAY_SIZE(temp_buf));\n  }\n  printf(\"\\r\\n\");\n\n  printf(\"  bNumConfigurations  %u\\r\\n\", desc_device.bNumConfigurations);\n\n  // Get configuration descriptor with sync API\n  if (XFER_RESULT_SUCCESS == tuh_descriptor_get_configuration_sync(daddr, 0, temp_buf, sizeof(temp_buf))) {\n    parse_config_descriptor(daddr, (tusb_desc_configuration_t *) temp_buf);\n  }\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\n// count total length of an interface\nuint16_t count_interface_total_len(tusb_desc_interface_t const* desc_itf, uint8_t itf_count, uint16_t max_len);\n\nvoid open_hid_interface(uint8_t daddr, tusb_desc_interface_t const *desc_itf, uint16_t max_len);\n\n// simple configuration parser to open and listen to HID Endpoint IN\nvoid parse_config_descriptor(uint8_t dev_addr, tusb_desc_configuration_t const *desc_cfg) {\n  uint8_t const *desc_end = ((uint8_t const *) desc_cfg) + tu_le16toh(desc_cfg->wTotalLength);\n  uint8_t const *p_desc = tu_desc_next(desc_cfg);\n\n  // parse each interfaces\n  while (p_desc < desc_end) {\n    uint8_t assoc_itf_count = 1;\n\n    // Class will always starts with Interface Association (if any) and then Interface descriptor\n    if (TUSB_DESC_INTERFACE_ASSOCIATION == tu_desc_type(p_desc)) {\n      tusb_desc_interface_assoc_t const *desc_iad = (tusb_desc_interface_assoc_t const *) p_desc;\n      assoc_itf_count = desc_iad->bInterfaceCount;\n\n      p_desc = tu_desc_next(p_desc);// next to Interface\n    }\n\n    // must be interface from now\n    if (TUSB_DESC_INTERFACE != tu_desc_type(p_desc)) { return; }\n    tusb_desc_interface_t const *desc_itf = (tusb_desc_interface_t const *) p_desc;\n\n    uint16_t const drv_len = count_interface_total_len(desc_itf, assoc_itf_count, (uint16_t) (desc_end - p_desc));\n\n    // probably corrupted descriptor\n    if (drv_len < sizeof(tusb_desc_interface_t)) { return; }\n\n    // only open and listen to HID endpoint IN\n    if (desc_itf->bInterfaceClass == TUSB_CLASS_HID) {\n      open_hid_interface(dev_addr, desc_itf, drv_len);\n    }\n\n    // next Interface or IAD descriptor\n    p_desc += drv_len;\n  }\n}\n\nuint16_t count_interface_total_len(tusb_desc_interface_t const *desc_itf, uint8_t itf_count, uint16_t max_len) {\n  uint8_t const *p_desc = (uint8_t const *) desc_itf;\n  uint16_t len = 0;\n\n  while (itf_count--) {\n    // Next on interface desc\n    len += tu_desc_len(desc_itf);\n    p_desc = tu_desc_next(p_desc);\n\n    while (len < max_len) {\n      // return on IAD regardless of itf count\n      if (tu_desc_type(p_desc) == TUSB_DESC_INTERFACE_ASSOCIATION) { return len; }\n\n      if ((tu_desc_type(p_desc) == TUSB_DESC_INTERFACE) &&\n          ((tusb_desc_interface_t const *) p_desc)->bAlternateSetting == 0) {\n        break;\n      }\n\n      len += tu_desc_len(p_desc);\n      p_desc = tu_desc_next(p_desc);\n    }\n  }\n\n  return len;\n}\n\n//--------------------------------------------------------------------+\n// HID Interface\n//--------------------------------------------------------------------+\n\nvoid hid_report_received(tuh_xfer_t* xfer);\n\nvoid open_hid_interface(uint8_t daddr, tusb_desc_interface_t const *desc_itf, uint16_t max_len) {\n  // len = interface + hid + n*endpoints\n  uint16_t const drv_len = (uint16_t) (sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) +\n                                       desc_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t));\n\n  // corrupted descriptor\n  if (max_len < drv_len) { return; }\n\n  uint8_t const *p_desc = (uint8_t const *) desc_itf;\n\n  // HID descriptor\n  p_desc = tu_desc_next(p_desc);\n  tusb_hid_descriptor_hid_t const *desc_hid = (tusb_hid_descriptor_hid_t const *) p_desc;\n  if (HID_DESC_TYPE_HID != desc_hid->bDescriptorType) { return; }\n\n  // Endpoint descriptor\n  p_desc = tu_desc_next(p_desc);\n  tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) p_desc;\n\n  for (int i = 0; i < desc_itf->bNumEndpoints; i++) {\n    if (TUSB_DESC_ENDPOINT != desc_ep->bDescriptorType) { return; }\n\n    if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN) {\n      if (!tuh_edpt_open(daddr, desc_ep)) {\n        return; // skip if failed to open endpoint\n      }\n\n      uint8_t *buf = get_hid_buf(daddr);\n      if (!buf) {\n        return;// out of memory\n      }\n\n      tuh_xfer_t xfer = {\n          .daddr = daddr,\n          .ep_addr = desc_ep->bEndpointAddress,\n          .buflen = 64,\n          .buffer = buf,\n          .complete_cb = hid_report_received,\n          .user_data = (uintptr_t) buf,// since buffer is not available in callback, use user data to store the buffer\n      };\n\n      // submit transfer for this EP\n      tuh_edpt_xfer(&xfer);\n\n      printf(\"Listen to [dev %u: ep %02x]\\r\\n\", daddr, desc_ep->bEndpointAddress);\n    }\n\n    p_desc = tu_desc_next(p_desc);\n    desc_ep = (tusb_desc_endpoint_t const *) p_desc;\n  }\n}\n\nvoid hid_report_received(tuh_xfer_t *xfer) {\n  // Note: not all field in xfer is available for use (i.e filled by tinyusb stack) in callback to save sram\n  // For instance, xfer->buffer is NULL. We have used user_data to store buffer when submitted callback\n  uint8_t *buf = (uint8_t *) xfer->user_data;\n\n  if (xfer->result == XFER_RESULT_SUCCESS) {\n    printf(\"[dev %u: ep %02x] HID Report:\", xfer->daddr, xfer->ep_addr);\n    for (uint32_t i = 0; i < xfer->actual_len; i++) {\n      if (i % 16 == 0) {\n        printf(\"\\r\\n  \");\n      }\n      printf(\"%02X \", buf[i]);\n    }\n    printf(\"\\r\\n\");\n  }\n\n  // continue to submit transfer, with updated buffer\n  // other field remain the same\n  xfer->buflen = 64;\n  xfer->buffer = buf;\n\n  tuh_edpt_xfer(xfer);\n}\n\n//--------------------------------------------------------------------+\n// Buffer helper\n//--------------------------------------------------------------------+\n\n// get an buffer from pool\nuint8_t *get_hid_buf(uint8_t daddr) {\n  for (size_t i = 0; i < BUF_COUNT; i++) {\n    if (buf_owner[i] == 0) {\n      buf_owner[i] = daddr;\n      return buf_pool[i];\n    }\n  }\n\n  // out of memory, increase BUF_COUNT\n  return NULL;\n}\n\n// free all buffer owned by device\nvoid free_hid_buf(uint8_t daddr) {\n  for (size_t i = 0; i < BUF_COUNT; i++) {\n    if (buf_owner[i] == daddr) buf_owner[i] = 0;\n  }\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  const uint32_t interval_ms = 1000;\n  static uint32_t start_ms = 0;\n\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < interval_ms) {\n    return; // not enough time\n  }\n  start_ms += interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;// toggle\n}\n\n//--------------------------------------------------------------------+\n// String Descriptor Helper\n//--------------------------------------------------------------------+\nstatic void _convert_utf16le_to_utf8(const uint16_t *utf16, size_t utf16_len, uint8_t *utf8, size_t utf8_len) {\n  // TODO: Check for runover.\n  (void) utf8_len;\n  // Get the UTF-16 length out of the data itself.\n\n  for (size_t i = 0; i < utf16_len; i++) {\n    uint16_t chr = utf16[i];\n    if (chr < 0x80) {\n      *utf8++ = chr & 0xffu;\n    } else if (chr < 0x800) {\n      *utf8++ = (uint8_t) (0xC0 | (chr >> 6 & 0x1F));\n      *utf8++ = (uint8_t) (0x80 | (chr >> 0 & 0x3F));\n    } else {\n      // TODO: Verify surrogate.\n      *utf8++ = (uint8_t) (0xE0 | (chr >> 12 & 0x0F));\n      *utf8++ = (uint8_t) (0x80 | (chr >> 6 & 0x3F));\n      *utf8++ = (uint8_t) (0x80 | (chr >> 0 & 0x3F));\n    }\n    // TODO: Handle UTF-16 code points that take two entries.\n  }\n}\n\n// Count how many bytes a utf-16-le encoded string will take in utf-8.\nstatic int _count_utf8_bytes(const uint16_t *buf, size_t len) {\n  size_t total_bytes = 0;\n  for (size_t i = 0; i < len; i++) {\n    uint16_t chr = buf[i];\n    if (chr < 0x80) {\n      total_bytes += 1;\n    } else if (chr < 0x800) {\n      total_bytes += 2;\n    } else {\n      total_bytes += 3;\n    }\n    // TODO: Handle UTF-16 code points that take two entries.\n  }\n  return (int) total_bytes;\n}\n\nstatic void print_utf16(uint16_t *buf, size_t buf_len) {\n  if ((buf[0] & 0xff) == 0) return;// empty\n  size_t utf16_len = ((buf[0] & 0xff) - 2) / sizeof(uint16_t);\n  size_t utf8_len = (size_t) _count_utf8_bytes(buf + 1, utf16_len);\n  _convert_utf16le_to_utf8(buf + 1, utf16_len, (uint8_t *) buf, sizeof(uint16_t) * buf_len);\n  ((uint8_t *) buf)[utf8_len] = '\\0';\n\n  printf(\"%s\", (char *) buf);\n}\n"
  },
  {
    "path": "examples/host/bare_api/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN     __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// Host Configuration\n//--------------------------------------------------------------------\n\n// Enable Host stack\n#define CFG_TUH_ENABLED       1\n\n// #define CFG_TUH_MAX3421       1 // use max3421 as host controller\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n  // #define CFG_TUH_RPI_PIO_USB   1 // use pio-usb as host controller\n\n  // host roothub port is 1 if using either pio-usb or max3421\n  #if (defined(CFG_TUH_RPI_PIO_USB) && CFG_TUH_RPI_PIO_USB) || (defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421)\n    #define BOARD_TUH_RHPORT      1\n  #endif\n#endif\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n//------------------------- Board Specific --------------------------\n\n// RHPort number used for host can be defined by board.mk, default to port 0\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Driver Configuration\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n// only hub class is enabled\n#define CFG_TUH_HUB                 1\n\n// max device support (excluding hub device)\n// 1 hub typically has 4 ports\n#define CFG_TUH_DEVICE_MAX          (3*CFG_TUH_HUB + 1)\n\n// Max endpoint per device\n#define CFG_TUH_ENDPOINT_MAX        8\n\n// Enable tuh_edpt_xfer() API\n#define CFG_TUH_API_EDPT_XFER       1\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(cdc_msc_hid C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/cdc_app.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/hid_app.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_app.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_host_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE = \\\n  src/cdc_app.c \\\n  src/hid_app.c \\\n  src/main.c \\\n  src/msc_app.c \\\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/only.txt",
    "content": "family:hpmicro\nfamily:samd21\nfamily:samd5x_e5x\nmcu:CH32V20X\nmcu:KINETIS_KL\nmcu:LPC175X_6X\nmcu:LPC177X_8X\nmcu:LPC18XX\nmcu:LPC40XX\nmcu:LPC43XX\nmcu:LPC54\nmcu:LPC55\nmcu:MAX3421\nmcu:MIMXRT10XX\nmcu:MIMXRT11XX\nmcu:MIMXRT1XXX\nmcu:MSP432E4\nmcu:RAXXX\nmcu:RP2040\nmcu:RW61X\nmcu:RX65X\nmcu:STM32C0\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32G0\nmcu:STM32H5\nmcu:STM32H7\nmcu:STM32H7RS\nmcu:STM32N6\nmcu:STM32U3\nmcu:STM32U5\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/skip.txt",
    "content": "board:lpcxpresso54114\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/src/app.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_TINYUSB_EXAMPLES_APP_H\n#define TUSB_TINYUSB_EXAMPLES_APP_H\n\n#include <stdio.h>\n\nvoid cdc_app_task(void);\nvoid hid_app_task(void);\n\n#endif\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/src/cdc_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb.h\"\n#include \"bsp/board_api.h\"\n#include \"app.h\"\n\nstatic size_t get_console_inputs(uint8_t* buf, size_t bufsize) {\n  size_t count = 0;\n  while (count < bufsize) {\n    int ch = board_getchar();\n    if (ch <= 0) { break; }\n    buf[count] = (uint8_t) ch;\n    count++;\n  }\n\n  return count;\n}\n\nvoid cdc_app_task(void) {\n  uint8_t buf[64 + 1]; // +1 for extra null character\n  uint32_t const bufsize = sizeof(buf) - 1;\n\n  uint32_t count = get_console_inputs(buf, bufsize);\n  buf[count] = 0;\n\n  // loop over all mounted interfaces\n  for (uint8_t idx = 0; idx < CFG_TUH_CDC; idx++) {\n    if (tuh_cdc_mounted(idx)) {\n      // console --> cdc interfaces\n      if (count > 0) {\n        tuh_cdc_write(idx, buf, count);\n        tuh_cdc_write_flush(idx);\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when received new data\nvoid tuh_cdc_rx_cb(uint8_t idx) {\n  uint8_t buf[64 + 1]; // +1 for extra null character\n  uint32_t const bufsize = sizeof(buf) - 1;\n\n  // forward cdc interfaces -> console\n  const uint32_t count = tuh_cdc_read(idx, buf, bufsize);\n  if (count) {\n    buf[count] = 0;\n    printf(\"%s\", (char*) buf);\n\n    #ifndef __ICCARM__     // TODO IAR doesn't support stream control ?\n    fflush(stdout);// flush right away, else nanolib will wait for newline\n    #endif\n  }\n}\n\n// Invoked when a device with CDC interface is mounted\n// idx is index of cdc interface in the internal pool.\nvoid tuh_cdc_mount_cb(uint8_t idx) {\n  tuh_itf_info_t itf_info = {0};\n  tuh_cdc_itf_get_info(idx, &itf_info);\n\n  printf(\"CDC Interface is mounted: address = %u, itf_num = %u\\r\\n\", itf_info.daddr,\n         itf_info.desc.bInterfaceNumber);\n\n#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM\n  // If CFG_TUH_CDC_LINE_CODING_ON_ENUM is defined, line coding will be set by tinyusb stack\n  // while eneumerating new cdc device\n  cdc_line_coding_t line_coding = {0};\n  if (tuh_cdc_get_line_coding_local(idx, &line_coding)) {\n    printf(\"  Baudrate: %\" PRIu32 \", Stop Bits : %u\\r\\n\", line_coding.bit_rate, line_coding.stop_bits);\n    printf(\"  Parity  : %u, Data Width: %u\\r\\n\", line_coding.parity, line_coding.data_bits);\n  }\n#else\n  // Set Line Coding upon mounted\n  cdc_line_coding_t new_line_coding = { 115200, CDC_LINE_CODING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 };\n  tuh_cdc_set_line_coding(idx, &new_line_coding, NULL, 0);\n#endif\n}\n\n// Invoked when a device with CDC interface is unmounted\nvoid tuh_cdc_umount_cb(uint8_t idx) {\n  tuh_itf_info_t itf_info = {0};\n  tuh_cdc_itf_get_info(idx, &itf_info);\n\n  printf(\"CDC Interface is unmounted: address = %u, itf_num = %u\\r\\n\", itf_info.daddr,\n         itf_info.desc.bInterfaceNumber);\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/src/hid_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"app.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n#define MAX_REPORT 4\n\nstatic uint8_t const keycode2ascii[128][2] = {HID_KEYCODE_TO_ASCII};\n\n// Each HID instance can has multiple reports\nstatic struct {\n  uint8_t report_count;\n  tuh_hid_report_info_t report_info[MAX_REPORT];\n} hid_info[CFG_TUH_HID];\n\nstatic void process_kbd_report(hid_keyboard_report_t const *report);\nstatic void process_mouse_report(hid_mouse_report_t const *report);\nstatic void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len);\n\nvoid hid_app_task(void) {\n  // nothing to do\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device with hid interface is mounted\n// Report descriptor is also available for use. tuh_hid_parse_report_descriptor()\n// can be used to parse common/simple enough descriptor.\n// Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped\n// therefore report_desc = NULL, desc_len = 0\nvoid tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *desc_report, uint16_t desc_len) {\n  printf(\"HID device address = %d, instance = %d is mounted\\r\\n\", dev_addr, instance);\n\n  // Interface protocol (hid_interface_protocol_enum_t)\n  const char *protocol_str[] = {\"None\", \"Keyboard\", \"Mouse\"};\n  uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);\n\n  printf(\"HID Interface Protocol = %s\\r\\n\", protocol_str[itf_protocol]);\n\n  // By default, host stack will use boot protocol on supported interface.\n  // Therefore for this simple example, we only need to parse generic report descriptor (with built-in parser)\n  if (itf_protocol == HID_ITF_PROTOCOL_NONE) {\n    hid_info[instance].report_count = tuh_hid_parse_report_descriptor(hid_info[instance].report_info, MAX_REPORT, desc_report, desc_len);\n    printf(\"HID has %u reports \\r\\n\", hid_info[instance].report_count);\n  }\n\n  // request to receive report\n  // tuh_hid_report_received_cb() will be invoked when report is available\n  if (!tuh_hid_receive_report(dev_addr, instance)) {\n    printf(\"Error: cannot request to receive report\\r\\n\");\n  }\n}\n\n// Invoked when device with hid interface is un-mounted\nvoid tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) {\n  printf(\"HID device address = %d, instance = %d is unmounted\\r\\n\", dev_addr, instance);\n}\n\n// Invoked when received report from device via interrupt endpoint\nvoid tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) {\n  uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);\n\n  switch (itf_protocol) {\n    case HID_ITF_PROTOCOL_KEYBOARD:\n      TU_LOG2(\"HID receive boot keyboard report\\r\\n\");\n      process_kbd_report((hid_keyboard_report_t const *) report);\n      break;\n\n    case HID_ITF_PROTOCOL_MOUSE:\n      TU_LOG2(\"HID receive boot mouse report\\r\\n\");\n      process_mouse_report((hid_mouse_report_t const *) report);\n      break;\n\n    default:\n      // Generic report requires matching ReportID and contents with previous parsed report info\n      process_generic_report(dev_addr, instance, report, len);\n      break;\n  }\n\n  // continue to request to receive report\n  if (!tuh_hid_receive_report(dev_addr, instance)) {\n    printf(\"Error: cannot request to receive report\\r\\n\");\n  }\n}\n\n//--------------------------------------------------------------------+\n// Keyboard\n//--------------------------------------------------------------------+\n\n// look up new key in previous keys\nstatic inline bool find_key_in_report(hid_keyboard_report_t const *report, uint8_t keycode) {\n  for (uint8_t i = 0; i < 6; i++) {\n    if (report->keycode[i] == keycode) {\n      return true;\n    }\n  }\n  return false;\n}\n\nstatic void process_kbd_report(hid_keyboard_report_t const *report) {\n  static hid_keyboard_report_t prev_report = {0, 0, {0}};// previous report to check key released\n\n  //------------- example code ignore control (non-printable) key affects -------------//\n  for (uint8_t i = 0; i < 6; i++) {\n    if (report->keycode[i]) {\n      if (find_key_in_report(&prev_report, report->keycode[i])) {\n        // exist in previous report means the current key is holding\n      } else {\n        // not existed in previous report means the current key is pressed\n        bool const is_shift = report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);\n        uint8_t ch = keycode2ascii[report->keycode[i]][is_shift ? 1 : 0];\n        putchar(ch);\n        if (ch == '\\r') {\n          putchar('\\n');\n        }\n\n        #ifndef __ICCARM__     // TODO IAR doesn't support stream control ?\n        fflush(stdout);// flush right away, else nanolib will wait for newline\n        #endif\n      }\n    }\n    // TODO example skips key released\n  }\n\n  prev_report = *report;\n}\n\n//--------------------------------------------------------------------+\n// Mouse\n//--------------------------------------------------------------------+\n\nstatic void cursor_movement(int8_t x, int8_t y, int8_t wheel) {\n  printf(\"(%d %d %d)\\r\\n\", x, y, wheel);\n}\n\nstatic void process_mouse_report(hid_mouse_report_t const *report) {\n  static hid_mouse_report_t prev_report = {0};\n\n  // button state\n  uint8_t button_changed_mask = report->buttons ^ prev_report.buttons;\n  if (button_changed_mask & report->buttons) {\n    printf(\" %c%c%c \",\n           report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-',\n           report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-',\n           report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-');\n  }\n\n  // cursor movement\n  cursor_movement(report->x, report->y, report->wheel);\n}\n\n//--------------------------------------------------------------------+\n// Generic Report\n//--------------------------------------------------------------------+\nstatic void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) {\n  (void) dev_addr;\n  (void) len;\n\n  uint8_t const rpt_count = hid_info[instance].report_count;\n  tuh_hid_report_info_t *rpt_info_arr = hid_info[instance].report_info;\n  tuh_hid_report_info_t *rpt_info = NULL;\n\n  if (rpt_count == 1 && rpt_info_arr[0].report_id == 0) {\n    // Simple report without report ID as 1st byte\n    rpt_info = &rpt_info_arr[0];\n  } else {\n    // Composite report, 1st byte is report ID, data starts from 2nd byte\n    uint8_t const rpt_id = report[0];\n\n    // Find report id in the array\n    for (uint8_t i = 0; i < rpt_count; i++) {\n      if (rpt_id == rpt_info_arr[i].report_id) {\n        rpt_info = &rpt_info_arr[i];\n        break;\n      }\n    }\n\n    report++;\n    len--;\n  }\n\n  if (!rpt_info) {\n    printf(\"Couldn't find report info !\\r\\n\");\n    return;\n  }\n\n  // For complete list of Usage Page & Usage checkout src/class/hid/hid.h. For examples:\n  // - Keyboard                     : Desktop, Keyboard\n  // - Mouse                        : Desktop, Mouse\n  // - Gamepad                      : Desktop, Gamepad\n  // - Consumer Control (Media Key) : Consumer, Consumer Control\n  // - System Control (Power key)   : Desktop, System Control\n  // - Generic (vendor)             : 0xFFxx, xx\n  if (rpt_info->usage_page == HID_USAGE_PAGE_DESKTOP) {\n    switch (rpt_info->usage) {\n      case HID_USAGE_DESKTOP_KEYBOARD:\n        TU_LOG2(\"HID receive keyboard report\\r\\n\");\n        // Assume keyboard follow boot report layout\n        process_kbd_report((hid_keyboard_report_t const *) report);\n        break;\n\n      case HID_USAGE_DESKTOP_MOUSE:\n        TU_LOG2(\"HID receive mouse report\\r\\n\");\n        // Assume mouse follow boot report layout\n        process_mouse_report((hid_mouse_report_t const *) report);\n        break;\n\n      default:\n        printf(\"report[%u] \", rpt_info->report_id);\n        for (uint8_t i = 0; i < len; i++) {\n          printf(\"%02X \", report[i]);\n        }\n        printf(\"\\r\\n\");\n        break;\n    }\n  }\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"app.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  printf(\"TinyUSB Host CDC MSC HID Example\\r\\n\");\n\n  // init host stack on configured roothub port\n  tusb_rhport_init_t host_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUH_RHPORT, &host_init);\n\n  board_init_after_tusb();\n\n#if CFG_TUH_ENABLED && CFG_TUH_MAX3421\n  // FeatherWing MAX3421E use MAX3421E's GPIO0 for VBUS enable\n  enum { IOPINS1_ADDR  = 20u << 3, /* 0xA0 */ };\n  tuh_max3421_reg_write(BOARD_TUH_RHPORT, IOPINS1_ADDR, 0x01, false);\n#endif\n\n  while (1) {\n    // tinyusb host task\n    tuh_task();\n\n    led_blinking_task();\n    cdc_app_task();\n    hid_app_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\nvoid tuh_mount_cb(uint8_t dev_addr) {\n  // application set-up\n  printf(\"A device with address %u is mounted\\r\\n\", dev_addr);\n}\n\nvoid tuh_umount_cb(uint8_t dev_addr) {\n  // application tear-down\n  printf(\"A device with address %u is unmounted \\r\\n\", dev_addr);\n}\n\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  const uint32_t interval_ms = 1000;\n  static uint32_t start_ms = 0;\n\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < interval_ms) {\n    return;// not enough time\n  }\n  start_ms += interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/src/msc_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\nstatic scsi_inquiry_resp_t inquiry_resp;\n\nstatic bool inquiry_complete_cb(uint8_t dev_addr, tuh_msc_complete_data_t const * cb_data) {\n  msc_cbw_t const* cbw = cb_data->cbw;\n  msc_csw_t const* csw = cb_data->csw;\n\n  if (csw->status != 0) {\n    printf(\"Inquiry failed\\r\\n\");\n    return false;\n  }\n\n  // Print out Vendor ID, Product ID and Rev\n  printf(\"%.8s %.16s rev %.4s\\r\\n\", inquiry_resp.vendor_id, inquiry_resp.product_id, inquiry_resp.product_rev);\n\n  // Get capacity of device\n  uint32_t const block_count = tuh_msc_get_block_count(dev_addr, cbw->lun);\n  uint32_t const block_size = tuh_msc_get_block_size(dev_addr, cbw->lun);\n\n  printf(\"Disk Size: %\" PRIu32 \" MB\\r\\n\", block_count / ((1024*1024)/block_size));\n  printf(\"Block Count = %\" PRIu32 \", Block Size: %\" PRIu32 \"\\r\\n\", block_count, block_size);\n\n  return true;\n}\n\n//------------- IMPLEMENTATION -------------//\nvoid tuh_msc_mount_cb(uint8_t dev_addr) {\n  printf(\"A MassStorage device is mounted\\r\\n\");\n\n  uint8_t const lun = 0;\n  tuh_msc_inquiry(dev_addr, lun, &inquiry_resp, inquiry_complete_cb, 0);\n}\n\nvoid tuh_msc_umount_cb(uint8_t dev_addr) {\n  (void) dev_addr;\n  printf(\"A MassStorage device is unmounted\\r\\n\");\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN     __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// Host Configuration\n//--------------------------------------------------------------------\n\n// Enable Host stack\n#define CFG_TUH_ENABLED       1\n\n// #define CFG_TUH_MAX3421       1 // use max3421 as host controller\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n  // #define CFG_TUH_RPI_PIO_USB   1 // use pio-usb as host controller\n\n  // host roothub port is 1 if using either pio-usb or max3421\n  #if (defined(CFG_TUH_RPI_PIO_USB) && CFG_TUH_RPI_PIO_USB) || (defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421)\n    #define BOARD_TUH_RHPORT      1\n  #endif\n#endif\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n//------------------------- Board Specific --------------------------\n\n// RHPort number used for host can be defined by board.mk, default to port 0\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Driver Configuration\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#define CFG_TUH_HUB                 1 // number of supported hubs\n#define CFG_TUH_CDC                 2 // number of supported CDC devices. also activates CDC ACM\n#define CFG_TUH_CDC_FTDI            1 // FTDI Serial.  FTDI is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_CDC_CP210X          1 // CP210x Serial. CP210X is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_CDC_CH34X           1 // CH340 or CH341 Serial. CH34X is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_CDC_PL2303          1 // PL2303 Serial. PL2303 is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_HID                 (3*CFG_TUH_DEVICE_MAX) // typical keyboard + mouse device can have 3-4 HID interfaces\n#define CFG_TUH_MSC                 1\n#define CFG_TUH_VENDOR              0\n\n// max device support (excluding hub device): 1 hub typically has 4 ports\n#define CFG_TUH_DEVICE_MAX          (3*CFG_TUH_HUB + 1)\n\n//------------- HID -------------//\n#define CFG_TUH_HID_EPIN_BUFSIZE    64\n#define CFG_TUH_HID_EPOUT_BUFSIZE   64\n\n//------------- CDC -------------//\n\n// Set Line Control state on enumeration/mounted:\n// DTR ( bit 0), RTS (bit 1)\n#define CFG_TUH_CDC_LINE_CONTROL_ON_ENUM    (CDC_CONTROL_LINE_STATE_DTR | CDC_CONTROL_LINE_STATE_RTS)\n\n// Set Line Coding on enumeration/mounted, value for cdc_line_coding_t\n// bit rate = 115200, 1 stop bit, no parity, 8 bit data width\n#define CFG_TUH_CDC_LINE_CODING_ON_ENUM   { 115200, CDC_LINE_CODING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 }\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(cdc_msc_hid_freertos C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/cdc_app.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/hid_app.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_app.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_host_example(${PROJECT_NAME} freertos)\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/Makefile",
    "content": "RTOS = freertos\ninclude ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE = \\\n  src/cdc_app.c \\\n  src/hid_app.c \\\n  src/main.c \\\n  src/msc_app.c \\\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/only.txt",
    "content": "family:espressif\nfamily:samd21\nfamily:samd5x_e5x\nmcu:LPC175X_6X\nmcu:LPC177X_8X\nmcu:LPC18XX\nmcu:LPC40XX\nmcu:LPC43XX\nmcu:LPC54\nmcu:LPC55\nmcu:MAX3421\nmcu:MIMXRT10XX\nmcu:MIMXRT11XX\nmcu:MIMXRT1XXX\nmcu:MSP432E4\nmcu:RW61X\nmcu:RX65X\nmcu:STM32C0\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32G0\nmcu:STM32H5\nmcu:STM32H7\nmcu:STM32H7RS\nmcu:STM32N6\nmcu:STM32U3\nmcu:STM32U5\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/skip.txt",
    "content": "mcu:CH32F20X\nmcu:RP2040\nboard:lpcxpresso54114\nmcu:FT90X\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"cdc_app.c\" \"hid_app.c\" \"main.c\" \"msc_app.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n\ntarget_compile_options(${COMPONENT_LIB} PRIVATE -Wno-error=format)\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/src/app.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_TINYUSB_EXAMPLES_APP_H\n#define TUSB_TINYUSB_EXAMPLES_APP_H\n\n#include <stdio.h>\n\nvoid cdc_app_init(void);\nvoid hid_app_init(void);\nvoid msc_app_init(void);\n\n#endif\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/src/cdc_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb.h\"\n#include \"bsp/board_api.h\"\n#include \"app.h\"\n\n#ifdef ESP_PLATFORM\n  #define CDC_STACK_SZIE      2048\n#else\n  #define CDC_STACK_SZIE     (3*configMINIMAL_STACK_SIZE/2)\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t  cdc_stack[CDC_STACK_SZIE];\nStaticTask_t cdc_taskdef;\n#endif\n\nstatic void cdc_app_task(void* param);\n\nvoid cdc_app_init(void) {\n  #if configSUPPORT_STATIC_ALLOCATION\n  (void) xTaskCreateStatic(cdc_app_task, \"cdc\", CDC_STACK_SZIE, NULL, configMAX_PRIORITIES-2, cdc_stack, &cdc_taskdef);\n  #else\n  (void) xTaskCreate(cdc_app_task, \"cdc\", CDC_STACK_SZIE, NULL, configMAX_PRIORITIES-2, NULL);\n  #endif\n}\n\n// helper\nstatic size_t get_console_inputs(uint8_t *buf, size_t bufsize) {\n  size_t count = 0;\n  while (count < bufsize) {\n    int ch = board_getchar();\n    if (ch <= 0) {\n      break;\n    }\n\n    buf[count] = (uint8_t) ch;\n    count++;\n  }\n\n  return count;\n}\n\nstatic void cdc_app_task(void* param) {\n  (void) param;\n\n  uint8_t buf[64 + 1]; // +1 for extra null character\n  uint32_t const bufsize = sizeof(buf) - 1;\n\n  while (1) {\n    uint32_t count = get_console_inputs(buf, bufsize);\n    buf[count] = 0;\n\n    if (count) {\n      // loop over all mounted interfaces\n      for (uint8_t idx = 0; idx < CFG_TUH_CDC; idx++) {\n        if (tuh_cdc_mounted(idx)) {\n          // console --> cdc interfaces\n          tuh_cdc_write(idx, buf, count);\n          tuh_cdc_write_flush(idx);\n        }\n      }\n    }\n\n    vTaskDelay(1);\n  }\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when received new data\nvoid tuh_cdc_rx_cb(uint8_t idx) {\n  uint8_t buf[64 + 1]; // +1 for extra null character\n  uint32_t const bufsize = sizeof(buf) - 1;\n\n  // forward cdc interfaces -> console\n  uint32_t count = tuh_cdc_read(idx, buf, bufsize);\n  buf[count] = 0;\n\n  printf(\"%s\", (char *) buf);\n}\n\nvoid tuh_cdc_mount_cb(uint8_t idx) {\n  tuh_itf_info_t itf_info = { 0 };\n  tuh_cdc_itf_get_info(idx, &itf_info);\n\n  printf(\"CDC Interface is mounted: address = %u, itf_num = %u\\r\\n\", itf_info.daddr, itf_info.desc.bInterfaceNumber);\n\n#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM\n  // CFG_TUH_CDC_LINE_CODING_ON_ENUM must be defined for line coding is set by tinyusb in enumeration\n  // otherwise you need to call tuh_cdc_set_line_coding() first\n  cdc_line_coding_t line_coding = { 0 };\n  if (tuh_cdc_get_local_line_coding(idx, &line_coding)) {\n    printf(\"  Baudrate: %\" PRIu32 \", Stop Bits : %u\\r\\n\", line_coding.bit_rate, line_coding.stop_bits);\n    printf(\"  Parity  : %u, Data Width: %u\\r\\n\", line_coding.parity, line_coding.data_bits);\n  }\n#endif\n}\n\nvoid tuh_cdc_umount_cb(uint8_t idx) {\n  tuh_itf_info_t itf_info = { 0 };\n  tuh_cdc_itf_get_info(idx, &itf_info);\n\n  printf(\"CDC Interface is unmounted: address = %u, itf_num = %u\\r\\n\", itf_info.daddr, itf_info.desc.bInterfaceNumber);\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/src/hid_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"app.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n// If your host terminal support ansi escape code such as TeraTerm\n// it can be use to simulate mouse cursor movement within terminal\n#define USE_ANSI_ESCAPE   0\n\n#define MAX_REPORT  4\n\nstatic uint8_t const keycode2ascii[128][2] = { HID_KEYCODE_TO_ASCII };\n\n// Each HID instance can has multiple reports\nstatic struct {\n  uint8_t report_count;\n  tuh_hid_report_info_t report_info[MAX_REPORT];\n} hid_info[CFG_TUH_HID];\n\nstatic void process_kbd_report(hid_keyboard_report_t const *report);\nstatic void process_mouse_report(hid_mouse_report_t const *report);\nstatic void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len);\n\nvoid hid_app_init(void) {\n  // nothing to do\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device with hid interface is mounted\n// Report descriptor is also available for use. tuh_hid_parse_report_descriptor()\n// can be used to parse common/simple enough descriptor.\n// Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped\n// therefore report_desc = NULL, desc_len = 0\nvoid tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *desc_report, uint16_t desc_len) {\n  printf(\"HID device address = %d, instance = %d is mounted\\r\\n\", dev_addr, instance);\n\n  // Interface protocol (hid_interface_protocol_enum_t)\n  const char *protocol_str[] = { \"None\", \"Keyboard\", \"Mouse\" };\n  uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);\n\n  printf(\"HID Interface Protocol = %s\\r\\n\", protocol_str[itf_protocol]);\n\n  // By default host stack will use activate boot protocol on supported interface.\n  // Therefore for this simple example, we only need to parse generic report descriptor (with built-in parser)\n  if (itf_protocol == HID_ITF_PROTOCOL_NONE) {\n    hid_info[instance].report_count = tuh_hid_parse_report_descriptor(hid_info[instance].report_info, MAX_REPORT,\n                                                                      desc_report, desc_len);\n    printf(\"HID has %u reports \\r\\n\", hid_info[instance].report_count);\n  }\n\n  // request to receive report\n  // tuh_hid_report_received_cb() will be invoked when report is available\n  if (!tuh_hid_receive_report(dev_addr, instance)) {\n    printf(\"Error: cannot request to receive report\\r\\n\");\n  }\n}\n\n// Invoked when device with hid interface is un-mounted\nvoid tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) {\n  printf(\"HID device address = %d, instance = %d is unmounted\\r\\n\", dev_addr, instance);\n}\n\n// Invoked when received report from device via interrupt endpoint\nvoid tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) {\n  uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);\n\n  switch (itf_protocol) {\n    case HID_ITF_PROTOCOL_KEYBOARD:\n      TU_LOG2(\"HID receive boot keyboard report\\r\\n\");\n      process_kbd_report((hid_keyboard_report_t const *) report);\n      break;\n\n    case HID_ITF_PROTOCOL_MOUSE:\n      TU_LOG2(\"HID receive boot mouse report\\r\\n\");\n      process_mouse_report((hid_mouse_report_t const *) report);\n      break;\n\n    default:\n      // Generic report requires matching ReportID and contents with previous parsed report info\n      process_generic_report(dev_addr, instance, report, len);\n      break;\n  }\n\n  // continue to request to receive report\n  if (!tuh_hid_receive_report(dev_addr, instance)) {\n    printf(\"Error: cannot request to receive report\\r\\n\");\n  }\n}\n\n//--------------------------------------------------------------------+\n// Keyboard\n//--------------------------------------------------------------------+\n\n// look up new key in previous keys\nstatic inline bool find_key_in_report(hid_keyboard_report_t const *report, uint8_t keycode) {\n  for (uint8_t i = 0; i < 6; i++) {\n    if (report->keycode[i] == keycode) return true;\n  }\n\n  return false;\n}\n\nstatic void process_kbd_report(hid_keyboard_report_t const *report) {\n  static hid_keyboard_report_t prev_report = { 0, 0, { 0 } }; // previous report to check key released\n\n  //------------- example code ignore control (non-printable) key affects -------------//\n  for (uint8_t i = 0; i < 6; i++) {\n    if (report->keycode[i]) {\n      if (find_key_in_report(&prev_report, report->keycode[i])) {\n        // exist in previous report means the current key is holding\n      } else {\n        // not existed in previous report means the current key is pressed\n        bool const is_shift = report->modifier & (KEYBOARD_MODIFIER_LEFTSHIFT | KEYBOARD_MODIFIER_RIGHTSHIFT);\n        uint8_t ch = keycode2ascii[report->keycode[i]][is_shift ? 1 : 0];\n        putchar(ch);\n        if (ch == '\\r') putchar('\\n'); // added new line for enter key\n\n        #ifndef __ICCARM__ // TODO IAR doesn't support stream control ?\n        fflush(stdout); // flush right away, else nanolib will wait for newline\n        #endif\n      }\n    }\n    // TODO example skips key released\n  }\n\n  prev_report = *report;\n}\n\n//--------------------------------------------------------------------+\n// Mouse\n//--------------------------------------------------------------------+\n\nstatic void cursor_movement(int8_t x, int8_t y, int8_t wheel) {\n#if USE_ANSI_ESCAPE\n  // Move X using ansi escape\n  if ( x < 0) {\n    printf(ANSI_CURSOR_BACKWARD(%d), (-x)); // move left\n  }else if ( x > 0) {\n    printf(ANSI_CURSOR_FORWARD(%d), x); // move right\n  }\n\n  // Move Y using ansi escape\n  if ( y < 0) {\n    printf(ANSI_CURSOR_UP(%d), (-y)); // move up\n  }else if ( y > 0) {\n    printf(ANSI_CURSOR_DOWN(%d), y); // move down\n  }\n\n  // Scroll using ansi escape\n  if (wheel < 0) {\n    printf(ANSI_SCROLL_UP(%d), (-wheel)); // scroll up\n  }else if (wheel > 0) {\n    printf(ANSI_SCROLL_DOWN(%d), wheel); // scroll down\n  }\n\n  printf(\"\\r\\n\");\n#else\n  printf(\"(%d %d %d)\\r\\n\", x, y, wheel);\n#endif\n}\n\nstatic void process_mouse_report(hid_mouse_report_t const *report) {\n  static hid_mouse_report_t prev_report = { 0 };\n\n  //------------- button state  -------------//\n  uint8_t button_changed_mask = report->buttons ^ prev_report.buttons;\n  if (button_changed_mask & report->buttons) {\n    printf(\" %c%c%c \",\n           report->buttons & MOUSE_BUTTON_LEFT ? 'L' : '-',\n           report->buttons & MOUSE_BUTTON_MIDDLE ? 'M' : '-',\n           report->buttons & MOUSE_BUTTON_RIGHT ? 'R' : '-');\n  }\n\n  //------------- cursor movement -------------//\n  cursor_movement(report->x, report->y, report->wheel);\n}\n\n//--------------------------------------------------------------------+\n// Generic Report\n//--------------------------------------------------------------------+\nstatic void process_generic_report(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) {\n  (void) dev_addr;\n  (void) len;\n\n  uint8_t const rpt_count = hid_info[instance].report_count;\n  tuh_hid_report_info_t *rpt_info_arr = hid_info[instance].report_info;\n  tuh_hid_report_info_t *rpt_info = NULL;\n\n  if (rpt_count == 1 && rpt_info_arr[0].report_id == 0) {\n    // Simple report without report ID as 1st byte\n    rpt_info = &rpt_info_arr[0];\n  } else {\n    // Composite report, 1st byte is report ID, data starts from 2nd byte\n    uint8_t const rpt_id = report[0];\n\n    // Find report id in the array\n    for (uint8_t i = 0; i < rpt_count; i++) {\n      if (rpt_id == rpt_info_arr[i].report_id) {\n        rpt_info = &rpt_info_arr[i];\n        break;\n      }\n    }\n\n    report++;\n    len--;\n  }\n\n  if (!rpt_info) {\n    printf(\"Couldn't find report info !\\r\\n\");\n    return;\n  }\n\n  // For complete list of Usage Page & Usage checkout src/class/hid/hid.h. For examples:\n  // - Keyboard                     : Desktop, Keyboard\n  // - Mouse                        : Desktop, Mouse\n  // - Gamepad                      : Desktop, Gamepad\n  // - Consumer Control (Media Key) : Consumer, Consumer Control\n  // - System Control (Power key)   : Desktop, System Control\n  // - Generic (vendor)             : 0xFFxx, xx\n  if (rpt_info->usage_page == HID_USAGE_PAGE_DESKTOP) {\n    switch (rpt_info->usage) {\n      case HID_USAGE_DESKTOP_KEYBOARD:\n        TU_LOG1(\"HID receive keyboard report\\r\\n\");\n        // Assume keyboard follow boot report layout\n        process_kbd_report((hid_keyboard_report_t const *) report);\n        break;\n\n      case HID_USAGE_DESKTOP_MOUSE:\n        TU_LOG1(\"HID receive mouse report\\r\\n\");\n        // Assume mouse follow boot report layout\n        process_mouse_report((hid_mouse_report_t const *) report);\n        break;\n\n      default:\n        break;\n    }\n  }\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"app.h\"\n\n#ifdef ESP_PLATFORM\n  #define USBH_STACK_SIZE     4096\n#else\n  // Increase stack size when debug log is enabled\n  #define USBH_STACK_SIZE    (configMINIMAL_STACK_SIZE * (CFG_TUSB_DEBUG ? 4 : 2))\n#endif\n\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\n/* Blink pattern\n * - 250 ms  : device not mounted\n * - 1000 ms : device mounted\n * - 2500 ms : device is suspended\n */\nenum  {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\n\n// static timer & task\n#if configSUPPORT_STATIC_ALLOCATION\nStaticTimer_t blinky_tmdef;\n\nStackType_t  usb_host_stack[USBH_STACK_SIZE];\nStaticTask_t usb_host_taskdef;\n#endif\n\nTimerHandle_t blinky_tm;\n\nstatic void led_blinky_cb(TimerHandle_t xTimer);\nstatic void usb_host_task(void* param);\n\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  printf(\"TinyUSB Host CDC MSC HID with FreeRTOS Example\\r\\n\");\n\n  // Create soft timer for blinky, task for tinyusb stack\n#if configSUPPORT_STATIC_ALLOCATION\n  blinky_tm = xTimerCreateStatic(NULL, pdMS_TO_TICKS(BLINK_MOUNTED), true, NULL, led_blinky_cb, &blinky_tmdef);\n  xTaskCreateStatic(usb_host_task, \"usbh\", USBH_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_host_stack, &usb_host_taskdef);\n#else\n  blinky_tm = xTimerCreate(NULL, pdMS_TO_TICKS(BLINK_NOT_MOUNTED), true, NULL, led_blinky_cb);\n  xTaskCreate(usb_host_task, \"usbd\", USBH_STACK_SIZE, NULL, configMAX_PRIORITIES-1, NULL);\n#endif\n\n  xTimerStart(blinky_tm, 0);\n\n  // only start scheduler for non-espressif mcu\n#ifndef ESP_PLATFORM\n  vTaskStartScheduler();\n#endif\n\n  return 0;\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n// USB Host task\n// This top level thread process all usb events and invoke callbacks\nstatic void usb_host_task(void *param) {\n  (void) param;\n\n  // init host stack on configured roothub port\n  tusb_rhport_init_t host_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUSB_SPEED_AUTO\n  };\n\n  if (!tusb_init(BOARD_TUH_RHPORT, &host_init)) {\n    printf(\"Failed to init USB Host Stack\\r\\n\");\n    vTaskSuspend(NULL);\n  }\n\n  board_init_after_tusb();\n\n#if CFG_TUH_ENABLED && CFG_TUH_MAX3421\n  // FeatherWing MAX3421E use MAX3421E's GPIO0 for VBUS enable\n  enum { IOPINS1_ADDR  = 20u << 3, /* 0xA0 */ };\n  tuh_max3421_reg_write(BOARD_TUH_RHPORT, IOPINS1_ADDR, 0x01, false);\n#endif\n\n  cdc_app_init();\n  hid_app_init();\n  msc_app_init();\n\n  // RTOS forever loop\n  while (1) {\n    // put this thread to waiting state until there is new events\n    tuh_task();\n\n    // following code only run if tuh_task() process at least 1 event\n  }\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\nvoid tuh_mount_cb(uint8_t dev_addr) {\n  // application set-up\n  printf(\"A device with address %d is mounted\\r\\n\", dev_addr);\n}\n\nvoid tuh_umount_cb(uint8_t dev_addr) {\n  // application tear-down\n  printf(\"A device with address %d is unmounted \\r\\n\", dev_addr);\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nstatic void led_blinky_cb(TimerHandle_t xTimer) {\n  (void) xTimer;\n  static bool led_state = false;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/src/msc_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n\n#include \"tusb.h\"\n#include \"app.h\"\n\n// define the buffer to be place in USB/DMA memory with correct alignment/cache line size\nCFG_TUH_MEM_SECTION static struct {\n  TUH_EPBUF_TYPE_DEF(scsi_inquiry_resp_t, inquiry);\n} scsi_resp;\n\nvoid msc_app_init(void) {\n  // nothing to do\n}\n\nstatic bool inquiry_complete_cb(uint8_t dev_addr, tuh_msc_complete_data_t const *cb_data) {\n  msc_cbw_t const *cbw = cb_data->cbw;\n  msc_csw_t const *csw = cb_data->csw;\n\n  if (csw->status != 0) {\n    printf(\"Inquiry failed\\r\\n\");\n    return false;\n  }\n\n  // Print out Vendor ID, Product ID and Rev\n  printf(\"%.8s %.16s rev %.4s\\r\\n\", scsi_resp.inquiry.vendor_id, scsi_resp.inquiry.product_id, scsi_resp.inquiry.product_rev);\n\n  // Get capacity of device\n  uint32_t const block_count = tuh_msc_get_block_count(dev_addr, cbw->lun);\n  uint32_t const block_size = tuh_msc_get_block_size(dev_addr, cbw->lun);\n\n  printf(\"Disk Size: %\" PRIu32 \" MB\\r\\n\", block_count / ((1024 * 1024) / block_size));\n  printf(\"Block Count = %\" PRIu32 \", Block Size: %\" PRIu32 \"\\r\\n\", block_count, block_size);\n\n  return true;\n}\n\n//------------- IMPLEMENTATION -------------//\nvoid tuh_msc_mount_cb(uint8_t dev_addr) {\n  printf(\"A MassStorage device is mounted\\r\\n\");\n\n  uint8_t const lun = 0;\n  tuh_msc_inquiry(dev_addr, lun, &scsi_resp.inquiry, inquiry_complete_cb, 0);\n}\n\nvoid tuh_msc_umount_cb(uint8_t dev_addr) {\n  (void) dev_addr;\n  printf(\"A MassStorage device is unmounted\\r\\n\");\n}\n"
  },
  {
    "path": "examples/host/cdc_msc_hid_freertos/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_FREERTOS\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN     __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// Host Configuration\n//--------------------------------------------------------------------\n\n// Enable Host stack\n#define CFG_TUH_ENABLED       1\n\n// #define CFG_TUH_MAX3421       1 // use max3421 as host controller\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n  // #define CFG_TUH_RPI_PIO_USB   1 // use pio-usb as host controller\n\n  // host roothub port is 1 if using either pio-usb or max3421\n  #if (defined(CFG_TUH_RPI_PIO_USB) && CFG_TUH_RPI_PIO_USB) || (defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421)\n    #define BOARD_TUH_RHPORT      1\n  #endif\n#endif\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n//------------------------- Board Specific --------------------------\n\n// RHPort number used for host can be defined by board.mk, default to port 0\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Driver Configuration\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#define CFG_TUH_HUB                 1 // number of supported hubs\n#define CFG_TUH_CDC                 1 // number of supported CDC devices. also activates CDC ACM\n#define CFG_TUH_CDC_FTDI            1 // FTDI Serial.  FTDI is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_CDC_CP210X          1 // CP210x Serial. CP210X is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_CDC_CH34X           1 // CH340 or CH341 Serial. CH34X is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_CDC_PL2303          1 // PL2303 Serial. PL2303 is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_HID                 (3*CFG_TUH_DEVICE_MAX) // typical keyboard + mouse device can have 3-4 HID interfaces\n#define CFG_TUH_MSC                 1\n#define CFG_TUH_VENDOR              0\n\n// max device support (excluding hub device): 1 hub typically has 4 ports\n#define CFG_TUH_DEVICE_MAX          (3*CFG_TUH_HUB + 1)\n\n//------------- HID -------------//\n#define CFG_TUH_HID_EPIN_BUFSIZE    64\n#define CFG_TUH_HID_EPOUT_BUFSIZE   64\n\n//------------- CDC -------------//\n\n// Set Line Control state on enumeration/mounted:\n// DTR ( bit 0), RTS (bit 1)\n#define CFG_TUH_CDC_LINE_CONTROL_ON_ENUM    (CDC_CONTROL_LINE_STATE_DTR | CDC_CONTROL_LINE_STATE_RTS)\n\n// Set Line Coding on enumeration/mounted, value for cdc_line_coding_t\n// bit rate = 115200, 1 stop bit, no parity, 8 bit data width\n#define CFG_TUH_CDC_LINE_CODING_ON_ENUM   { 115200, CDC_LINE_CODING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 }\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/host/device_info/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(device_info C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_host_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/host/device_info/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/host/device_info/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n\tsrc/main.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/host/device_info/only.txt",
    "content": "family:espressif\nfamily:hpmicro\nfamily:samd21\nfamily:samd5x_e5x\nmcu:CH32V20X\nmcu:KINETIS_KL\nmcu:LPC175X_6X\nmcu:LPC177X_8X\nmcu:LPC18XX\nmcu:LPC40XX\nmcu:LPC43XX\nmcu:LPC54\nmcu:LPC55\nmcu:MAX3421\nmcu:MIMXRT10XX\nmcu:MIMXRT11XX\nmcu:MIMXRT1XXX\nmcu:MSP432E4\nmcu:RAXXX\nmcu:RP2040\nmcu:RW61X\nmcu:RX65X\nmcu:STM32C0\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32G0\nmcu:STM32H5\nmcu:STM32H7\nmcu:STM32H7RS\nmcu:STM32N6\nmcu:STM32U3\nmcu:STM32U5\n"
  },
  {
    "path": "examples/host/device_info/skip.txt",
    "content": "board:lpcxpresso54114\n"
  },
  {
    "path": "examples/host/device_info/src/CMakeLists.txt",
    "content": "# This file is for ESP-IDF only\nidf_component_register(SRCS \"main.c\"\n                    INCLUDE_DIRS \".\"\n                    REQUIRES boards tinyusb_src)\n"
  },
  {
    "path": "examples/host/device_info/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* Host example will get device descriptors of attached devices and print it out via uart/rtt (logger) as follows:\n *    Device 1: ID 046d:c52f SN 11223344\n      Device Descriptor:\n        bLength             18\n        bDescriptorType     1\n        bcdUSB              0200\n        bDeviceClass        0\n        bDeviceSubClass     0\n        bDeviceProtocol     0\n        bMaxPacketSize0     8\n        idVendor            0x046d\n        idProduct           0xc52f\n        bcdDevice           2200\n        iManufacturer       1     Logitech\n        iProduct            2     USB Receiver\n        iSerialNumber       0\n        bNumConfigurations  1\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n// English\n#define LANGUAGE_ID 0x0409\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\nenum {\n  BLINK_NOT_MOUNTED = 250,\n  BLINK_MOUNTED = 1000,\n  BLINK_SUSPENDED = 2500,\n};\nstatic uint32_t blink_interval_ms = BLINK_NOT_MOUNTED;\n\n// Declare for buffer for usb transfer, may need to be in USB/DMA section and\n// multiple of dcache line size if dcache is enabled (for some ports).\nCFG_TUH_MEM_SECTION struct {\n  TUH_EPBUF_TYPE_DEF(tusb_desc_device_t, device);\n  TUH_EPBUF_DEF(serial, 64*sizeof(uint16_t));\n  TUH_EPBUF_DEF(buf, 128*sizeof(uint16_t));\n} desc;\n\nvoid led_blinking_task(void* param);\nstatic void print_utf16(uint16_t* temp_buf, size_t buf_len);\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\nvoid init_freertos_task(void);\n#endif\n\n//--------------------------------------------------------------------\n// Main\n//--------------------------------------------------------------------\nstatic void init_tinyusb(void) {\n  // init host stack on configured roothub port\n  tusb_rhport_init_t host_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUH_RHPORT, &host_init);\n\n  board_init_after_tusb();\n}\n\nint main(void) {\n  board_init();\n  printf(\"TinyUSB Device Info Example\\r\\n\");\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  init_freertos_task();\n#else\n  board_delay(100); // wait for uart to be ready\n  init_tinyusb();\n  while (1) {\n    tuh_task();     // tinyusb host task\n    led_blinking_task(NULL);\n  }\n#endif\n}\n\n/*------------- TinyUSB Callbacks -------------*/\n\n// Invoked when device is mounted (configured)\nvoid tuh_mount_cb(uint8_t daddr) {\n  blink_interval_ms = BLINK_MOUNTED;\n\n  // Get Device Descriptor\n  uint8_t xfer_result = tuh_descriptor_get_device_sync(daddr, &desc.device, 18);\n  if (XFER_RESULT_SUCCESS != xfer_result) {\n    printf(\"Failed to get device descriptor\\r\\n\");\n    return;\n  }\n\n  printf(\"Device %u: ID %04x:%04x SN \", daddr, desc.device.idVendor, desc.device.idProduct);\n\n  xfer_result = XFER_RESULT_FAILED;\n  if (desc.device.iSerialNumber != 0) {\n    xfer_result = tuh_descriptor_get_serial_string_sync(daddr, LANGUAGE_ID, desc.serial, sizeof(desc.serial));\n  }\n  if (XFER_RESULT_SUCCESS != xfer_result) {\n    uint16_t* serial = (uint16_t*)(uintptr_t) desc.serial;\n\n    serial[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * 1 + 2));\n    serial[1] = '0'; // simply 0\n    serial[2] = 0;\n  }\n  print_utf16((uint16_t*)(uintptr_t) desc.serial, sizeof(desc.serial)/2);\n  printf(\"\\r\\n\");\n\n  printf(\"Device Descriptor:\\r\\n\");\n  printf(\"  bLength             %u\\r\\n\", desc.device.bLength);\n  printf(\"  bDescriptorType     %u\\r\\n\", desc.device.bDescriptorType);\n  printf(\"  bcdUSB              %04x\\r\\n\", desc.device.bcdUSB);\n  printf(\"  bDeviceClass        %u\\r\\n\", desc.device.bDeviceClass);\n  printf(\"  bDeviceSubClass     %u\\r\\n\", desc.device.bDeviceSubClass);\n  printf(\"  bDeviceProtocol     %u\\r\\n\", desc.device.bDeviceProtocol);\n  printf(\"  bMaxPacketSize0     %u\\r\\n\", desc.device.bMaxPacketSize0);\n  printf(\"  idVendor            0x%04x\\r\\n\", desc.device.idVendor);\n  printf(\"  idProduct           0x%04x\\r\\n\", desc.device.idProduct);\n  printf(\"  bcdDevice           %04x\\r\\n\", desc.device.bcdDevice);\n\n  // Get String descriptor using Sync API\n\n  printf(\"  iManufacturer       %u     \", desc.device.iManufacturer);\n  if (desc.device.iManufacturer != 0) {\n    xfer_result = tuh_descriptor_get_manufacturer_string_sync(daddr, LANGUAGE_ID, desc.buf, sizeof(desc.buf));\n    if (XFER_RESULT_SUCCESS == xfer_result) {\n      print_utf16((uint16_t*)(uintptr_t) desc.buf, sizeof(desc.buf)/2);\n    }\n  }\n  printf(\"\\r\\n\");\n\n  printf(\"  iProduct            %u     \", desc.device.iProduct);\n  if (desc.device.iProduct != 0) {\n    xfer_result = tuh_descriptor_get_product_string_sync(daddr, LANGUAGE_ID, desc.buf, sizeof(desc.buf));\n    if (XFER_RESULT_SUCCESS == xfer_result) {\n      print_utf16((uint16_t*)(uintptr_t) desc.buf, sizeof(desc.buf)/2);\n    }\n  }\n  printf(\"\\r\\n\");\n\n  printf(\"  iSerialNumber       %u     \", desc.device.iSerialNumber);\n  printf(\"%s\\r\\n\", (char*)desc.serial); // serial is already to UTF-8\n  printf(\"  bNumConfigurations  %u\\r\\n\", desc.device.bNumConfigurations);\n}\n\n// Invoked when device is unmounted (bus reset/unplugged)\nvoid tuh_umount_cb(uint8_t daddr) {\n  blink_interval_ms = BLINK_NOT_MOUNTED;\n  printf(\"Device removed, address = %d\\r\\n\", daddr);\n}\n\n//--------------------------------------------------------------------+\n// String Descriptor Helper\n//--------------------------------------------------------------------+\n\nstatic void _convert_utf16le_to_utf8(const uint16_t* utf16, size_t utf16_len, uint8_t* utf8, size_t utf8_len) {\n  // TODO: Check for runover.\n  (void) utf8_len;\n  // Get the UTF-16 length out of the data itself.\n\n  for (size_t i = 0; i < utf16_len; i++) {\n    uint16_t chr = utf16[i];\n    if (chr < 0x80) {\n      *utf8++ = chr & 0xffu;\n    } else if (chr < 0x800) {\n      *utf8++ = (uint8_t) (0xC0 | (chr >> 6 & 0x1F));\n      *utf8++ = (uint8_t) (0x80 | (chr >> 0 & 0x3F));\n    } else {\n      // TODO: Verify surrogate.\n      *utf8++ = (uint8_t) (0xE0 | (chr >> 12 & 0x0F));\n      *utf8++ = (uint8_t) (0x80 | (chr >> 6 & 0x3F));\n      *utf8++ = (uint8_t) (0x80 | (chr >> 0 & 0x3F));\n    }\n    // TODO: Handle UTF-16 code points that take two entries.\n  }\n}\n\n// Count how many bytes a utf-16-le encoded string will take in utf-8.\nstatic int _count_utf8_bytes(const uint16_t* buf, size_t len) {\n  size_t total_bytes = 0;\n  for (size_t i = 0; i < len; i++) {\n    uint16_t chr = buf[i];\n    if (chr < 0x80) {\n      total_bytes += 1;\n    } else if (chr < 0x800) {\n      total_bytes += 2;\n    } else {\n      total_bytes += 3;\n    }\n    // TODO: Handle UTF-16 code points that take two entries.\n  }\n  return (int) total_bytes;\n}\n\nstatic void print_utf16(uint16_t* temp_buf, size_t buf_len) {\n  if ((temp_buf[0] & 0xff) == 0) return;  // empty\n  size_t utf16_len = ((temp_buf[0] & 0xff) - 2) / sizeof(uint16_t);\n  size_t utf8_len = (size_t) _count_utf8_bytes(temp_buf + 1, utf16_len);\n  _convert_utf16le_to_utf8(temp_buf + 1, utf16_len, (uint8_t*) temp_buf, sizeof(uint16_t) * buf_len);\n  ((uint8_t*) temp_buf)[utf8_len] = '\\0';\n\n  printf(\"%s\", (char*) temp_buf);\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void* param) {\n  (void) param;\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  while (1) {\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n    vTaskDelay(blink_interval_ms / portTICK_PERIOD_MS);\n#else\n    if (tusb_time_millis_api() - start_ms < blink_interval_ms) {\n      return; // not enough time\n    }\n#endif\n\n    start_ms += blink_interval_ms;\n    board_led_write(led_state);\n    led_state = 1 - led_state; // toggle\n  }\n}\n\n//--------------------------------------------------------------------+\n// FreeRTOS\n//--------------------------------------------------------------------+\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n\n#define BLINKY_STACK_SIZE   configMINIMAL_STACK_SIZE\n\n#ifdef ESP_PLATFORM\n  #define USB_STACK_SIZE     4096\n#else\n  // Increase stack size when debug log is enabled\n  #define USB_STACK_SIZE    (3*configMINIMAL_STACK_SIZE/2) * (CFG_TUSB_DEBUG ? 2 : 1)\n#endif\n\n\n// static task\n#if configSUPPORT_STATIC_ALLOCATION\nStackType_t blinky_stack[BLINKY_STACK_SIZE];\nStaticTask_t blinky_taskdef;\n\nStackType_t  usb_stack[USB_STACK_SIZE];\nStaticTask_t usb_taskdef;\n#endif\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\nvoid usb_host_task(void *param) {\n  (void) param;\n  board_delay(100); // wait for uart to be ready\n  init_tinyusb();\n  while (1) {\n    tuh_task();\n  }\n}\n\nvoid init_freertos_task(void) {\n#if configSUPPORT_STATIC_ALLOCATION\n  xTaskCreateStatic(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, blinky_stack, &blinky_taskdef);\n  xTaskCreateStatic(usb_host_task, \"usbh\", USB_STACK_SIZE, NULL, configMAX_PRIORITIES-1, usb_stack, &usb_taskdef);\n#else\n  xTaskCreate(led_blinking_task, \"blinky\", BLINKY_STACK_SIZE, NULL, 1, NULL);\n  xTaskCreate(usb_host_task, \"usbh\", USB_STACK_SIZE, NULL, configMAX_PRIORITIES - 1, NULL);\n#endif\n\n  // only start scheduler for non-espressif mcu\n#ifndef ESP_PLATFORM\n  vTaskStartScheduler();\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "examples/host/device_info/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN     __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// Host Configuration\n//--------------------------------------------------------------------\n\n// Enable Host stack\n#define CFG_TUH_ENABLED       1\n\n// #define CFG_TUH_MAX3421       1 // use max3421 as host controller\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n  // #define CFG_TUH_RPI_PIO_USB   1 // use pio-usb as host controller\n\n  // host roothub port is 1 if using either pio-usb or max3421\n  #if (defined(CFG_TUH_RPI_PIO_USB) && CFG_TUH_RPI_PIO_USB) || (defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421)\n    #define BOARD_TUH_RHPORT      1\n  #endif\n#endif\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n//------------------------- Board Specific --------------------------\n\n// RHPort number used for host can be defined by board.mk, default to port 0\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Driver Configuration\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n// only hub class is enabled\n#define CFG_TUH_HUB                 1\n\n// max device support (excluding hub device): 1 hub typically has 4 ports\n#define CFG_TUH_DEVICE_MAX          (3*CFG_TUH_HUB + 1)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/host/hid_controller/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(hid_controller C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/hid_app.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_host_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/host/hid_controller/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/host/hid_controller/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n\tsrc/hid_app.c \\\n\tsrc/main.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/host/hid_controller/only.txt",
    "content": "family:hpmicro\nfamily:samd21\nfamily:samd5x_e5x\nmcu:CH32V20X\nmcu:KINETIS_KL\nmcu:LPC175X_6X\nmcu:LPC177X_8X\nmcu:LPC18XX\nmcu:LPC40XX\nmcu:LPC43XX\nmcu:LPC54\nmcu:LPC55\nmcu:MAX3421\nmcu:MIMXRT10XX\nmcu:MIMXRT11XX\nmcu:MIMXRT1XXX\nmcu:MSP432E4\nmcu:RAXXX\nmcu:RP2040\nmcu:RW61X\nmcu:RX65X\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32G0\nmcu:STM32H5\nmcu:STM32H7\nmcu:STM32H7RS\nmcu:STM32N6\nmcu:STM32U3\nmcu:STM32U5\n"
  },
  {
    "path": "examples/host/hid_controller/skip.txt",
    "content": "board:lpcxpresso54114\n"
  },
  {
    "path": "examples/host/hid_controller/src/app.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_TINYUSB_EXAMPLES_APP_H\n#define TUSB_TINYUSB_EXAMPLES_APP_H\n\n#include <stdio.h>\n\nvoid hid_app_task(void);\n\n#endif\n"
  },
  {
    "path": "examples/host/hid_controller/src/hid_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"app.h\"\n\n/* From https://www.kernel.org/doc/html/latest/input/gamepad.html\n          ____________________________              __\n         / [__ZL__]          [__ZR__] \\               |\n        / [__ TL __]        [__ TR __] \\              | Front Triggers\n     __/________________________________\\__         __|\n    /                                  _   \\          |\n   /      /\\           __             (N)   \\         |\n  /       ||      __  |MO|  __     _       _ \\        | Main Pad\n |    <===DP===> |SE|      |ST|   (W) -|- (E) |       |\n  \\       ||    ___          ___       _     /        |\n  /\\      \\/   /   \\        /   \\     (S)   /\\      __|\n /  \\________ | LS  | ____ |  RS | ________/  \\       |\n|         /  \\ \\___/ /    \\ \\___/ /  \\         |      | Control Sticks\n|        /    \\_____/      \\_____/    \\        |    __|\n|       /                              \\       |\n \\_____/                                \\_____/\n\n     |________|______|    |______|___________|\n       D-Pad    Left       Right   Action Pad\n               Stick       Stick\n\n                 |_____________|\n                    Menu Pad\n\n  Most gamepads have the following features:\n  - Action-Pad 4 buttons in diamonds-shape (on the right side) NORTH, SOUTH, WEST and EAST.\n  - D-Pad (Direction-pad) 4 buttons (on the left side) that point up, down, left and right.\n  - Menu-Pad Different constellations, but most-times 2 buttons: SELECT - START.\n  - Analog-Sticks provide freely moveable sticks to control directions, Analog-sticks may also\n  provide a digital button if you press them.\n  - Triggers are located on the upper-side of the pad in vertical direction. The upper buttons\n  are normally named Left- and Right-Triggers, the lower buttons Z-Left and Z-Right.\n  - Rumble Many devices provide force-feedback features. But are mostly just simple rumble motors.\n */\n\n// Sony DS4 report layout detail https://www.psdevwiki.com/ps4/DS4-USB\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t x, y, z, rz; // joystick\n\n  struct {\n    uint8_t dpad     : 4; // (hat format, 0x08 is released, 0=N, 1=NE, 2=E, 3=SE, 4=S, 5=SW, 6=W, 7=NW)\n    uint8_t square   : 1; // west\n    uint8_t cross    : 1; // south\n    uint8_t circle   : 1; // east\n    uint8_t triangle : 1; // north\n  };\n\n  struct {\n    uint8_t l1     : 1;\n    uint8_t r1     : 1;\n    uint8_t l2     : 1;\n    uint8_t r2     : 1;\n    uint8_t share  : 1;\n    uint8_t option : 1;\n    uint8_t l3     : 1;\n    uint8_t r3     : 1;\n  };\n\n  struct {\n    uint8_t ps      : 1; // playstation button\n    uint8_t tpad    : 1; // track pad click\n    uint8_t counter : 6; // +1 each report\n  };\n\n  uint8_t l2_trigger; // 0 released, 0xff fully pressed\n  uint8_t r2_trigger; // as above\n\n  //  uint16_t timestamp;\n  //  uint8_t  battery;\n  //\n  //  int16_t gyro[3];  // x, y, z;\n  //  int16_t accel[3]; // x, y, z\n\n  // there is still lots more info\n\n} sony_ds4_report_t;\n\ntypedef struct TU_ATTR_PACKED {\n  // First 16 bits set what data is pertinent in this structure (1 = set; 0 = not set)\n  uint8_t set_rumble : 1;\n  uint8_t set_led : 1;\n  uint8_t set_led_blink : 1;\n  uint8_t set_ext_write : 1;\n  uint8_t set_left_volume : 1;\n  uint8_t set_right_volume : 1;\n  uint8_t set_mic_volume : 1;\n  uint8_t set_speaker_volume : 1;\n  uint8_t set_flags2;\n\n  uint8_t reserved;\n\n  uint8_t motor_right;\n  uint8_t motor_left;\n\n  uint8_t lightbar_red;\n  uint8_t lightbar_green;\n  uint8_t lightbar_blue;\n  uint8_t lightbar_blink_on;\n  uint8_t lightbar_blink_off;\n\n  uint8_t ext_data[8];\n\n  uint8_t volume_left;\n  uint8_t volume_right;\n  uint8_t volume_mic;\n  uint8_t volume_speaker;\n\n  uint8_t other[9];\n} sony_ds4_output_report_t;\n\nstatic bool ds4_mounted = false;\nstatic uint8_t ds4_dev_addr = 0;\nstatic uint8_t ds4_instance = 0;\nstatic uint8_t motor_left = 0;\nstatic uint8_t motor_right = 0;\n\n// check if device is Sony DualShock 4\nstatic inline bool is_sony_ds4(uint8_t dev_addr)\n{\n  uint16_t vid, pid;\n  tuh_vid_pid_get(dev_addr, &vid, &pid);\n\n  return ( (vid == 0x054c && (pid == 0x09cc || pid == 0x05c4)) // Sony DualShock4\n           || (vid == 0x0f0d && pid == 0x005e)                 // Hori FC4\n           || (vid == 0x0f0d && pid == 0x00ee)                 // Hori PS4 Mini (PS4-099U)\n           || (vid == 0x1f4f && pid == 0x1002)                 // ASW GG xrd controller\n         );\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\nvoid hid_app_task(void)\n{\n  if (ds4_mounted)\n  {\n    const uint32_t interval_ms = 200;\n    static uint32_t start_ms = 0;\n\n    uint32_t current_time_ms = tusb_time_millis_api();\n    if ( current_time_ms - start_ms >= interval_ms)\n    {\n      start_ms = current_time_ms;\n\n      sony_ds4_output_report_t output_report = {0};\n      output_report.set_rumble = 1;\n      output_report.motor_left = motor_left;\n      output_report.motor_right = motor_right;\n      tuh_hid_send_report(ds4_dev_addr, ds4_instance, 5, &output_report, sizeof(output_report));\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device with hid interface is mounted\n// Report descriptor is also available for use. tuh_hid_parse_report_descriptor()\n// can be used to parse common/simple enough descriptor.\n// Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped\n// therefore report_desc = NULL, desc_len = 0\nvoid tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len)\n{\n  (void)desc_report;\n  (void)desc_len;\n  uint16_t vid, pid;\n  tuh_vid_pid_get(dev_addr, &vid, &pid);\n\n  printf(\"HID device address = %d, instance = %d is mounted\\r\\n\", dev_addr, instance);\n  printf(\"VID = %04x, PID = %04x\\r\\n\", vid, pid);\n\n  // Sony DualShock 4 [CUH-ZCT2x]\n  if ( is_sony_ds4(dev_addr) )\n  {\n    if (!ds4_mounted)\n    {\n      ds4_dev_addr = dev_addr;\n      ds4_instance = instance;\n      motor_left = 0;\n      motor_right = 0;\n      ds4_mounted = true;\n    }\n    // request to receive report\n    // tuh_hid_report_received_cb() will be invoked when report is available\n    if ( !tuh_hid_receive_report(dev_addr, instance) )\n    {\n      printf(\"Error: cannot request to receive report\\r\\n\");\n    }\n  }\n}\n\n// Invoked when device with hid interface is un-mounted\nvoid tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance)\n{\n  printf(\"HID device address = %d, instance = %d is unmounted\\r\\n\", dev_addr, instance);\n  if (ds4_mounted && ds4_dev_addr == dev_addr && ds4_instance == instance)\n  {\n    ds4_mounted = false;\n  }\n}\n\n// check if different than 2\nstatic inline bool diff_than_2(uint8_t x, uint8_t y) {\n  return (x - y > 2) || (y - x > 2);\n}\n\n// check if 2 reports are different enough\nstatic bool diff_report(sony_ds4_report_t const* rpt1, sony_ds4_report_t const* rpt2) {\n  bool result;\n\n  // x, y, z, rz must different than 2 to be counted\n  result = diff_than_2(rpt1->x, rpt2->x) || diff_than_2(rpt1->y , rpt2->y ) ||\n           diff_than_2(rpt1->z, rpt2->z) || diff_than_2(rpt1->rz, rpt2->rz);\n\n  // check the rest with mem compare\n  result |= memcmp(&rpt1->rz + 1, &rpt2->rz + 1, sizeof(sony_ds4_report_t)-6);\n\n  return result;\n}\n\nstatic void process_sony_ds4(uint8_t const* report, uint16_t len)\n{\n  (void)len;\n  const char* dpad_str[] = { \"N\", \"NE\", \"E\", \"SE\", \"S\", \"SW\", \"W\", \"NW\", \"none\" };\n\n  // previous report used to compare for changes\n  static sony_ds4_report_t prev_report = { 0 };\n\n  uint8_t const report_id = report[0];\n  report++;\n  len--;\n\n  // all buttons state is stored in ID 1\n  if (report_id == 1)\n  {\n    sony_ds4_report_t ds4_report;\n    memcpy(&ds4_report, report, sizeof(ds4_report));\n\n    // counter is +1, assign to make it easier to compare 2 report\n    prev_report.counter = ds4_report.counter;\n\n    // only print if changes since it is polled ~ 5ms\n    // Since count+1 after each report and  x, y, z, rz fluctuate within 1 or 2\n    // We need more than memcmp to check if report is different enough\n    if ( diff_report(&prev_report, &ds4_report) )\n    {\n      printf(\"(x, y, z, rz) = (%u, %u, %u, %u)\\r\\n\", ds4_report.x, ds4_report.y, ds4_report.z, ds4_report.rz);\n      printf(\"DPad = %s \", dpad_str[ds4_report.dpad]);\n\n      if (ds4_report.square   ) printf(\"Square \");\n      if (ds4_report.cross    ) printf(\"Cross \");\n      if (ds4_report.circle   ) printf(\"Circle \");\n      if (ds4_report.triangle ) printf(\"Triangle \");\n\n      if (ds4_report.l1       ) printf(\"L1 \");\n      if (ds4_report.r1       ) printf(\"R1 \");\n      if (ds4_report.l2       ) printf(\"L2 \");\n      if (ds4_report.r2       ) printf(\"R2 \");\n\n      if (ds4_report.share    ) printf(\"Share \");\n      if (ds4_report.option   ) printf(\"Option \");\n      if (ds4_report.l3       ) printf(\"L3 \");\n      if (ds4_report.r3       ) printf(\"R3 \");\n\n      if (ds4_report.ps       ) printf(\"PS \");\n      if (ds4_report.tpad     ) printf(\"TPad \");\n\n      printf(\"\\r\\n\");\n    }\n\n    // The left and right triggers control the intensity of the left and right rumble motors\n    motor_left = ds4_report.l2_trigger;\n    motor_right = ds4_report.r2_trigger;\n\n    prev_report = ds4_report;\n  }\n}\n\n// Invoked when received report from device via interrupt endpoint\nvoid tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) {\n  if (is_sony_ds4(dev_addr)) {\n    process_sony_ds4(report, len);\n  }\n\n  // continue to request to receive report\n  if (!tuh_hid_receive_report(dev_addr, instance)) {\n    printf(\"Error: cannot request to receive report\\r\\n\");\n  }\n}\n"
  },
  {
    "path": "examples/host/hid_controller/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* This example current worked and tested with following controller\n * - Sony DualShock 4 [CUH-ZCT2x] VID = 0x054c, PID = 0x09cc\n */\n\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n#include \"app.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  printf(\"TinyUSB Host HID Controller Example\\r\\n\");\n  printf(\"Note: Events only displayed for explicit supported controllers\\r\\n\");\n\n  // init host stack on configured roothub port\n  tusb_rhport_init_t host_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUH_RHPORT, &host_init);\n\n  board_init_after_tusb();\n\n  while (1) {\n    // tinyusb host task\n    tuh_task();\n    led_blinking_task();\n    hid_app_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  const uint32_t interval_ms = 1000;\n  static uint32_t start_ms = 0;\n\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if ( tusb_time_millis_api() - start_ms < interval_ms) return; // not enough time\n  start_ms += interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/host/hid_controller/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN     __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// Host Configuration\n//--------------------------------------------------------------------\n\n// Enable Host stack\n#define CFG_TUH_ENABLED       1\n\n// #define CFG_TUH_MAX3421       1 // use max3421 as host controller\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n  // #define CFG_TUH_RPI_PIO_USB   1 // use pio-usb as host controller\n\n  // host roothub port is 1 if using either pio-usb or max3421\n  #if (defined(CFG_TUH_RPI_PIO_USB) && CFG_TUH_RPI_PIO_USB) || (defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421)\n    #define BOARD_TUH_RHPORT      1\n  #endif\n#endif\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n//------------------------- Board Specific --------------------------\n\n// RHPort number used for host can be defined by board.mk, default to port 0\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Driver Configuration\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#define CFG_TUH_HUB                 0\n#define CFG_TUH_CDC                 0\n#define CFG_TUH_HID                 (3*CFG_TUH_DEVICE_MAX) // typical keyboard + mouse device can have 3-4 HID interfaces\n#define CFG_TUH_MSC                 0\n#define CFG_TUH_VENDOR              0\n\n// max device support (excluding hub device): 1 hub typically has 4 ports\n#define CFG_TUH_DEVICE_MAX          (3*CFG_TUH_HUB + 1)\n\n//------------- HID -------------//\n\n#define CFG_TUH_HID_EP_BUFSIZE      64\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/host/midi_rx/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(midi_rx C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_host_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/host/midi_rx/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/host/midi_rx/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n\tsrc/main.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/host/midi_rx/only.txt",
    "content": "family:hpmicro\nfamily:samd21\nfamily:samd5x_e5x\nmcu:CH32V20X\nmcu:ESP32P4\nmcu:ESP32S2\nmcu:ESP32S3\nmcu:KINETIS_KL\nmcu:LPC175X_6X\nmcu:LPC177X_8X\nmcu:LPC18XX\nmcu:LPC40XX\nmcu:LPC43XX\nmcu:LPC54\nmcu:LPC55\nmcu:MAX3421\nmcu:MIMXRT10XX\nmcu:MIMXRT11XX\nmcu:MIMXRT1XXX\nmcu:MSP432E4\nmcu:RAXXX\nmcu:RP2040\nmcu:RW61X\nmcu:RX65X\nmcu:STM32C0\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32G0\nmcu:STM32H5\nmcu:STM32H7\nmcu:STM32H7RS\nmcu:STM32N6\nmcu:STM32U3\nmcu:STM32U5\n"
  },
  {
    "path": "examples/host/midi_rx/skip.txt",
    "content": "board:lpcxpresso54114\n"
  },
  {
    "path": "examples/host/midi_rx/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// STATIC GLOBALS DECLARATION\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void);\nvoid midi_host_rx_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  printf(\"TinyUSB Host MIDI Example\\r\\n\");\n\n  // init host stack on configured roothub port\n  tusb_rhport_init_t host_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUH_RHPORT, &host_init);\n\n  while (1) {\n    tuh_task();\n    led_blinking_task();\n    midi_host_rx_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  const uint32_t interval_ms = 1000;\n  static uint32_t start_ms = 0;\n\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < interval_ms) return;// not enough time\n  start_ms += interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state;// toggle\n}\n\n//--------------------------------------------------------------------+\n// MIDI host receive task\n//--------------------------------------------------------------------+\nvoid midi_host_rx_task(void) {\n  // nothing to do, we just print out received data in callback\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when device with MIDI interface is mounted.\nvoid tuh_midi_mount_cb(uint8_t idx, const tuh_midi_mount_cb_t* mount_cb_data) {\n  printf(\"MIDI Interface Index = %u, Address = %u, Number of RX cables = %u, Number of TX cables = %u\\r\\n\",\n          idx, mount_cb_data->daddr, mount_cb_data->rx_cable_count, mount_cb_data->tx_cable_count);\n}\n\n// Invoked when device with hid interface is un-mounted\nvoid tuh_midi_umount_cb(uint8_t idx) {\n  printf(\"MIDI Interface Index = %u is unmounted\\r\\n\", idx);\n}\n\nvoid tuh_midi_rx_cb(uint8_t idx, uint32_t xferred_bytes) {\n  if (xferred_bytes == 0) {\n    return;\n  }\n\n  uint8_t buffer[48];\n  uint8_t cable_num = 0;\n  uint32_t bytes_read = tuh_midi_stream_read(idx, &cable_num, buffer, sizeof(buffer));\n\n  printf(\"Cable %u rx: \", cable_num);\n  for (uint32_t i = 0; i < bytes_read; i++) {\n    printf(\"%02X \", buffer[i]);\n  }\n  printf(\"\\r\\n\");\n}\n\nvoid tuh_midi_tx_cb(uint8_t idx, uint32_t xferred_bytes) {\n  (void) idx;\n  (void) xferred_bytes;\n}\n"
  },
  {
    "path": "examples/host/midi_rx/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n// Espressif IDF requires \"freertos/\" prefix in include path\n#ifdef ESP_PLATFORM\n#define CFG_TUSB_OS_INC_PATH  freertos/\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN     __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// Host Configuration\n//--------------------------------------------------------------------\n\n// Enable Host stack\n#define CFG_TUH_ENABLED       1\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n  // #define CFG_TUH_RPI_PIO_USB   1 // use pio-usb as host controller\n  // #define CFG_TUH_MAX3421       1 // use max3421 as host controller\n\n  // host roothub port is 1 if using either pio-usb or max3421\n  #if (defined(CFG_TUH_RPI_PIO_USB) && CFG_TUH_RPI_PIO_USB) || (defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421)\n    #define BOARD_TUH_RHPORT      1\n  #endif\n#endif\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n//------------------------- Board Specific --------------------------\n\n// RHPort number used for host can be defined by board.mk, default to port 0\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Driver Configuration\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#define CFG_TUH_HUB                 1\n// max device support (excluding hub device): 1 hub typically has 4 ports\n#define CFG_TUH_DEVICE_MAX          (3*CFG_TUH_HUB + 1)\n#define CFG_TUH_MIDI                CFG_TUH_DEVICE_MAX\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "examples/host/msc_file_explorer/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(msc_file_explorer C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_app.c\n  ${TOP}/lib/fatfs/source/ff.c\n  ${TOP}/lib/fatfs/source/ffsystem.c\n  ${TOP}/lib/fatfs/source/ffunicode.c\n  )\n\n# Suppress warnings on fatfs\nif (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n  set_source_files_properties(${TOP}/lib/fatfs/source/ff.c PROPERTIES\n    COMPILE_FLAGS \"-Wno-conversion -Wno-cast-qual\"\n    )\nendif ()\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  ${TOP}/lib/fatfs/source\n  ${TOP}/lib/embedded-cli\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_host_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/host/msc_file_explorer/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/host/msc_file_explorer/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nFATFS_PATH = lib/fatfs/source\n\nINC += \\\n\tsrc \\\n\t$(TOP)/$(FATFS_PATH) \\\n\t$(TOP)/lib/embedded-cli \\\n\n# Example source\nEXAMPLE_SOURCE = \\\n  src/main.c \\\n  src/msc_app.c \\\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\n# FatFS source\nSRC_C += \\\n  $(FATFS_PATH)/ff.c \\\n  $(FATFS_PATH)/ffsystem.c \\\n  $(FATFS_PATH)/ffunicode.c \\\n\n# suppress warning caused by fatfs\nCFLAGS_GCC += -Wno-error=cast-qual\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/host/msc_file_explorer/only.txt",
    "content": "family:hpmicro\nfamily:samd21\nfamily:samd5x_e5x\nmcu:CH32V20X\nmcu:KINETIS_KL\nmcu:LPC175X_6X\nmcu:LPC177X_8X\nmcu:LPC18XX\nmcu:LPC40XX\nmcu:LPC43XX\nmcu:LPC54\nmcu:LPC55\nmcu:MAX3421\nmcu:MIMXRT10XX\nmcu:MIMXRT11XX\nmcu:MIMXRT1XXX\nmcu:MSP432E4\nmcu:RAXXX\nmcu:RP2040\nmcu:RW61X\nmcu:RX65X\nmcu:STM32C0\nmcu:STM32F4\nmcu:STM32F7\nmcu:STM32G0\nmcu:STM32H5\nmcu:STM32H7\nmcu:STM32H7RS\nmcu:STM32N6\nmcu:STM32U3\nmcu:STM32U5\n"
  },
  {
    "path": "examples/host/msc_file_explorer/skip.txt",
    "content": "board:lpcxpresso54114\n"
  },
  {
    "path": "examples/host/msc_file_explorer/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* Example to show how to navigate mass storage device with built-in command line.\n * Type help for list of supported commands and syntax (mostly linux commands)\n\n > help\n * help\n        Print list of commands\n * cat\n        Usage: cat [FILE]...\n        Concatenate FILE(s) to standard output..\n * cd\n        Usage: cd [DIR]...\n        Change the current directory to DIR.\n * cp\n        Usage: cp SOURCE DEST\n        Copy SOURCE to DEST.\n * ls\n        Usage: ls [DIR]...\n        List information about the FILEs (the current directory by default).\n * pwd\n        Usage: pwd\n        Print the name of the current working directory.\n * mkdir\n        Usage: mkdir DIR...\n        Create the DIRECTORY(ies), if they do not already exist..\n * mv\n        Usage: mv SOURCE DEST...\n        Rename SOURCE to DEST.\n * rm\n        Usage: rm [FILE]...\n        Remove (unlink) the FILE(s).\n */\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n#include \"msc_app.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void);\n\n/*------------- MAIN -------------*/\nint main(void) {\n  board_init();\n\n  printf(\"TinyUSB Host MassStorage Explorer Example\\r\\n\");\n\n  // init host stack on configured roothub port\n  tusb_rhport_init_t host_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUH_RHPORT, &host_init);\n\n  board_init_after_tusb();\n\n  msc_app_init();\n\n  while (1) {\n    // tinyusb host task\n    tuh_task();\n\n    msc_app_task();\n    led_blinking_task();\n  }\n}\n\n//--------------------------------------------------------------------+\n// TinyUSB Callbacks\n//--------------------------------------------------------------------+\n\nvoid tuh_mount_cb(uint8_t dev_addr) {\n  (void) dev_addr;\n}\n\nvoid tuh_umount_cb(uint8_t dev_addr) {\n  (void) dev_addr;\n}\n\n//--------------------------------------------------------------------+\n// Blinking Task\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void) {\n  const uint32_t interval_ms = 1000;\n  static uint32_t start_ms = 0;\n\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if (tusb_time_millis_api() - start_ms < interval_ms) return; // not enough time\n  start_ms += interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/host/msc_file_explorer/src/msc_app.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <ctype.h>\n#include \"tusb.h\"\n#include \"bsp/board_api.h\"\n\n#include \"ff.h\"\n#include \"diskio.h\"\n\n// lib/embedded-cli\n#define EMBEDDED_CLI_IMPL\n#include \"embedded_cli.h\"\n\n#include \"msc_app.h\"\n\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n//------------- embedded-cli -------------//\n#define CLI_BUFFER_SIZE     512\n#define CLI_RX_BUFFER_SIZE  16\n#define CLI_CMD_BUFFER_SIZE 64\n#define CLI_HISTORY_SIZE    32\n#define CLI_BINDING_COUNT   8\n\nstatic EmbeddedCli *_cli;\nstatic CLI_UINT     cli_buffer[BYTES_TO_CLI_UINTS(CLI_BUFFER_SIZE)];\n\n//------------- Elm Chan FatFS -------------//\nstatic CFG_TUH_MEM_SECTION FATFS fatfs[CFG_TUH_DEVICE_MAX]; // for simplicity only support 1 LUN per device\nstatic volatile bool              _disk_busy[CFG_TUH_DEVICE_MAX];\n\nstatic CFG_TUH_MEM_SECTION FIL     file1, file2;\nstatic CFG_TUH_MEM_SECTION uint8_t rw_buf[512];\n\n// define the buffer to be place in USB/DMA memory with correct alignment/cache line size\nCFG_TUH_MEM_SECTION static struct {\n  TUH_EPBUF_TYPE_DEF(scsi_inquiry_resp_t, inquiry);\n} scsi_resp;\n\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nbool cli_init(void);\n\nbool msc_app_init(void) {\n  for (size_t i = 0; i < CFG_TUH_DEVICE_MAX; i++) {\n    _disk_busy[i] = false;\n  }\n\n// disable stdout buffered for echoing typing command\n#ifndef __ICCARM__ // TODO IAR doesn't support stream control ?\n  setbuf(stdout, NULL);\n#endif\n\n  cli_init();\n\n  return true;\n}\n\nvoid msc_app_task(void) {\n  if (!_cli) {\n    return;\n  }\n\n  int ch = board_getchar();\n  if (ch > 0) {\n    while (ch > 0) {\n      embeddedCliReceiveChar(_cli, (char)ch);\n      ch = board_getchar();\n    }\n    embeddedCliProcess(_cli);\n  }\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nstatic bool inquiry_complete_cb(uint8_t dev_addr, const tuh_msc_complete_data_t *cb_data) {\n  const msc_cbw_t *cbw = cb_data->cbw;\n  const msc_csw_t *csw = cb_data->csw;\n\n  if (csw->status != 0) {\n    printf(\"Inquiry failed\\r\\n\");\n    return false;\n  }\n\n  // Print out Vendor ID, Product ID and Rev\n  printf(\"%.8s %.16s rev %.4s\\r\\n\", scsi_resp.inquiry.vendor_id, scsi_resp.inquiry.product_id,\n         scsi_resp.inquiry.product_rev);\n\n  // Get capacity of device\n  const uint32_t block_count = tuh_msc_get_block_count(dev_addr, cbw->lun);\n  const uint32_t block_size  = tuh_msc_get_block_size(dev_addr, cbw->lun);\n\n  printf(\"Disk Size: %\" PRIu32 \" MB\\r\\n\", block_count / ((1024 * 1024) / block_size));\n  // printf(\"Block Count = %lu, Block Size: %lu\\r\\n\", block_count, block_size);\n\n  // For simplicity: we only mount 1 LUN per device\n  const uint8_t drive_num     = dev_addr - 1;\n  char          drive_path[3] = \"0:\";\n  drive_path[0] += drive_num;\n\n  if (f_mount(&fatfs[drive_num], drive_path, 1) != FR_OK) {\n    printf(\"mount failed\\r\\n\");\n    return true;\n  }\n\n  // change to newly mounted drive\n  f_chdrive(drive_path);\n  FRESULT rc = f_chdir(\"/\");\n  if (rc != FR_OK) {\n    printf(\"chdir failed: %d\\r\\n\", rc);\n  }\n\n  // print the drive label\n  //  char label[34];\n  //  if ( FR_OK == f_getlabel(drive_path, label, NULL) )\n  //  {\n  //    puts(label);\n  //  }\n\n  return true;\n}\n\n//------------- IMPLEMENTATION -------------//\nvoid tuh_msc_mount_cb(uint8_t dev_addr) {\n  printf(\"A MassStorage device (addr = %u) is mounted\\r\\n\", dev_addr);\n\n  const uint8_t lun = 0;\n  tuh_msc_inquiry(dev_addr, lun, &scsi_resp.inquiry, inquiry_complete_cb, 0);\n}\n\nvoid tuh_msc_umount_cb(uint8_t dev_addr) {\n  printf(\"A MassStorage device is unmounted\\r\\n\");\n\n  const uint8_t drive_num     = dev_addr - 1;\n  char          drive_path[3] = \"0:\";\n  drive_path[0] += drive_num;\n\n  f_unmount(drive_path);\n\n  //  if ( phy_disk == f_get_current_drive() )\n  //  { // active drive is unplugged --> change to other drive\n  //    for(uint8_t i=0; i<CFG_TUH_DEVICE_MAX; i++)\n  //    {\n  //      if ( disk_is_ready(i) )\n  //      {\n  //        f_chdrive(i);\n  //        cli_init(); // refractor, rename\n  //      }\n  //    }\n  //  }\n}\n\n//--------------------------------------------------------------------+\n// DiskIO\n//--------------------------------------------------------------------+\n\nstatic void wait_for_disk_io(BYTE pdrv) {\n  while (_disk_busy[pdrv]) {\n    tuh_task();\n  }\n}\n\nstatic bool disk_io_complete(uint8_t dev_addr, const tuh_msc_complete_data_t *cb_data) {\n  (void)dev_addr;\n  (void)cb_data;\n  _disk_busy[dev_addr - 1] = false;\n  return true;\n}\n\nDSTATUS disk_status(BYTE pdrv /* Physical drive nmuber to identify the drive */\n) {\n  uint8_t dev_addr = pdrv + 1;\n  return tuh_msc_mounted(dev_addr) ? 0 : STA_NODISK;\n}\n\nDSTATUS disk_initialize(BYTE pdrv /* Physical drive nmuber to identify the drive */\n) {\n  (void)pdrv;\n  return 0;                       // nothing to do\n}\n\nDRESULT disk_read(BYTE  pdrv,     /* Physical drive nmuber to identify the drive */\n                  BYTE *buff,     /* Data buffer to store read data */\n                  LBA_t sector,   /* Start sector in LBA */\n                  UINT  count     /* Number of sectors to read */\n) {\n  const uint8_t dev_addr = pdrv + 1;\n  const uint8_t lun      = 0;\n\n  _disk_busy[pdrv] = true;\n  tuh_msc_read10(dev_addr, lun, buff, sector, (uint16_t)count, disk_io_complete, 0);\n  wait_for_disk_io(pdrv);\n\n  return RES_OK;\n}\n\n#if FF_FS_READONLY == 0\n\nDRESULT disk_write(BYTE        pdrv,   /* Physical drive nmuber to identify the drive */\n                   const BYTE *buff,   /* Data to be written */\n                   LBA_t       sector, /* Start sector in LBA */\n                   UINT        count   /* Number of sectors to write */\n) {\n  const uint8_t dev_addr = pdrv + 1;\n  const uint8_t lun      = 0;\n\n  _disk_busy[pdrv] = true;\n  tuh_msc_write10(dev_addr, lun, buff, sector, (uint16_t)count, disk_io_complete, 0);\n  wait_for_disk_io(pdrv);\n\n  return RES_OK;\n}\n\n#endif\n\nDRESULT disk_ioctl(BYTE  pdrv, /* Physical drive nmuber (0..) */\n                   BYTE  cmd,  /* Control code */\n                   void *buff  /* Buffer to send/receive control data */\n) {\n  const uint8_t dev_addr = pdrv + 1;\n  const uint8_t lun      = 0;\n  switch (cmd) {\n    case CTRL_SYNC:\n      // nothing to do since we do blocking\n      return RES_OK;\n\n    case GET_SECTOR_COUNT:\n      *((DWORD *)buff) = (WORD)tuh_msc_get_block_count(dev_addr, lun);\n      return RES_OK;\n\n    case GET_SECTOR_SIZE:\n      *((WORD *)buff) = (WORD)tuh_msc_get_block_size(dev_addr, lun);\n      return RES_OK;\n\n    case GET_BLOCK_SIZE:\n      *((DWORD *)buff) = 1; // erase block size in units of sector size\n      return RES_OK;\n\n    default:\n      return RES_PARERR;\n  }\n}\n\n//--------------------------------------------------------------------+\n// CLI Commands\n//--------------------------------------------------------------------+\n\nvoid cli_cmd_cat(EmbeddedCli *cli, char *args, void *context);\nvoid cli_cmd_cd(EmbeddedCli *cli, char *args, void *context);\nvoid cli_cmd_cp(EmbeddedCli *cli, char *args, void *context);\nvoid cli_cmd_ls(EmbeddedCli *cli, char *args, void *context);\nvoid cli_cmd_pwd(EmbeddedCli *cli, char *args, void *context);\nvoid cli_cmd_mkdir(EmbeddedCli *cli, char *args, void *context);\nvoid cli_cmd_mv(EmbeddedCli *cli, char *args, void *context);\nvoid cli_cmd_rm(EmbeddedCli *cli, char *args, void *context);\n\nstatic void cli_write_char(EmbeddedCli *cli, char c) {\n  (void)cli;\n  putchar((int)c);\n}\n\nbool cli_init(void) {\n  EmbeddedCliConfig *config = embeddedCliDefaultConfig();\n  config->cliBuffer         = cli_buffer;\n  config->cliBufferSize     = CLI_BUFFER_SIZE;\n  config->rxBufferSize      = CLI_RX_BUFFER_SIZE;\n  config->cmdBufferSize     = CLI_CMD_BUFFER_SIZE;\n  config->historyBufferSize = CLI_HISTORY_SIZE;\n  config->maxBindingCount   = CLI_BINDING_COUNT;\n\n  TU_ASSERT(embeddedCliRequiredSize(config) <= CLI_BUFFER_SIZE);\n\n  _cli = embeddedCliNew(config);\n  TU_ASSERT(_cli != NULL);\n\n  _cli->writeChar = cli_write_char;\n\n  embeddedCliAddBinding(_cli,\n                        (CliCommandBinding){\"cat\", \"Usage: cat [FILE]...\\r\\n\\tConcatenate FILE(s) to standard output..\",\n                                            true, NULL, cli_cmd_cat});\n\n  embeddedCliAddBinding(_cli, (CliCommandBinding){\"cd\", \"Usage: cd [DIR]...\\r\\n\\tChange the current directory to DIR.\",\n                                                  true, NULL, cli_cmd_cd});\n\n  embeddedCliAddBinding(_cli, (CliCommandBinding){\"cp\", \"Usage: cp SOURCE DEST\\r\\n\\tCopy SOURCE to DEST.\", true, NULL,\n                                                  cli_cmd_cp});\n\n  embeddedCliAddBinding(_cli, (CliCommandBinding){\"ls\",\n                                                  \"Usage: ls [DIR]...\\r\\n\\tList information about the FILEs (the \"\n                                                  \"current directory by default).\",\n                                                  true, NULL, cli_cmd_ls});\n\n  embeddedCliAddBinding(_cli,\n                        (CliCommandBinding){\"pwd\", \"Usage: pwd\\r\\n\\tPrint the name of the current working directory.\",\n                                            true, NULL, cli_cmd_pwd});\n\n  embeddedCliAddBinding(_cli, (CliCommandBinding){\"mkdir\",\n                                                  \"Usage: mkdir DIR...\\r\\n\\tCreate the DIRECTORY(ies), if they do not \"\n                                                  \"already exist..\",\n                                                  true, NULL, cli_cmd_mkdir});\n\n  embeddedCliAddBinding(_cli, (CliCommandBinding){\"mv\", \"Usage: mv SOURCE DEST...\\r\\n\\tRename SOURCE to DEST.\", true,\n                                                  NULL, cli_cmd_mv});\n\n  embeddedCliAddBinding(_cli, (CliCommandBinding){\"rm\", \"Usage: rm [FILE]...\\r\\n\\tRemove (unlink) the FILE(s).\", true,\n                                                  NULL, cli_cmd_rm});\n\n  return true;\n}\n\nvoid cli_cmd_cat(EmbeddedCli *cli, char *args, void *context) {\n  (void)cli;\n  (void)context;\n\n  uint16_t argc = embeddedCliGetTokenCount(args);\n\n  // need at least 1 argument\n  if (argc == 0) {\n    printf(\"invalid arguments\\r\\n\");\n    return;\n  }\n\n  for (uint16_t i = 0; i < argc; i++) {\n    FIL        *fi    = &file1;\n    const char *fpath = embeddedCliGetToken(args, i + 1); // token count from 1\n\n    if (FR_OK != f_open(fi, fpath, FA_READ)) {\n      printf(\"%s: No such file or directory\\r\\n\", fpath);\n    } else {\n      UINT count = 0;\n      while ((FR_OK == f_read(fi, rw_buf, sizeof(rw_buf), &count)) && (count > 0)) {\n        for (UINT c = 0; c < count; c++) {\n          const uint8_t ch = rw_buf[c];\n          if (isprint(ch) || iscntrl(ch)) {\n            putchar(ch);\n          } else {\n            putchar('.');\n          }\n        }\n      }\n    }\n\n    f_close(fi);\n  }\n}\n\nvoid cli_cmd_cd(EmbeddedCli *cli, char *args, void *context) {\n  (void)cli;\n  (void)context;\n\n  uint16_t argc = embeddedCliGetTokenCount(args);\n\n  // only support 1 argument\n  if (argc != 1) {\n    printf(\"invalid arguments\\r\\n\");\n    return;\n  }\n\n  // default is current directory\n  const char *dpath = args;\n\n  if (FR_OK != f_chdir(dpath)) {\n    printf(\"%s: No such file or directory\\r\\n\", dpath);\n    return;\n  }\n}\n\nvoid cli_cmd_cp(EmbeddedCli *cli, char *args, void *context) {\n  (void)cli;\n  (void)context;\n\n  uint16_t argc = embeddedCliGetTokenCount(args);\n  if (argc != 2) {\n    printf(\"invalid arguments\\r\\n\");\n    return;\n  }\n\n  // default is current directory\n  const char *src = embeddedCliGetToken(args, 1);\n  const char *dst = embeddedCliGetToken(args, 2);\n\n  FIL *f_src = &file1;\n  FIL *f_dst = &file2;\n\n  if (FR_OK != f_open(f_src, src, FA_READ)) {\n    printf(\"cannot stat '%s': No such file or directory\\r\\n\", src);\n    return;\n  }\n\n  if (FR_OK != f_open(f_dst, dst, FA_WRITE | FA_CREATE_ALWAYS)) {\n    printf(\"cannot create '%s'\\r\\n\", dst);\n    return;\n  } else {\n    UINT rd_count = 0;\n    while ((FR_OK == f_read(f_src, rw_buf, sizeof(rw_buf), &rd_count)) && (rd_count > 0)) {\n      UINT wr_count = 0;\n\n      if (FR_OK != f_write(f_dst, rw_buf, rd_count, &wr_count)) {\n        printf(\"cannot write to '%s'\\r\\n\", dst);\n        break;\n      }\n    }\n  }\n\n  f_close(f_src);\n  f_close(f_dst);\n}\n\nvoid cli_cmd_ls(EmbeddedCli *cli, char *args, void *context) {\n  (void)cli;\n  (void)context;\n\n  uint16_t argc = embeddedCliGetTokenCount(args);\n\n  // only support 1 argument\n  if (argc > 1) {\n    printf(\"invalid arguments\\r\\n\");\n    return;\n  }\n\n  // default is current directory\n  const char *dpath = \".\";\n  if (argc) {\n    dpath = args;\n  }\n\n  DIR dir;\n  if (FR_OK != f_opendir(&dir, dpath)) {\n    printf(\"cannot access '%s': No such file or directory\\r\\n\", dpath);\n    return;\n  }\n\n  FILINFO fno;\n  while ((f_readdir(&dir, &fno) == FR_OK) && (fno.fname[0] != 0)) {\n    if (fno.fname[0] != '.') // ignore . and .. entry\n    {\n      if (fno.fattrib & AM_DIR) {\n        // directory\n        printf(\"/%s\\r\\n\", fno.fname);\n      } else {\n        printf(\"%-40s\", fno.fname);\n        if (fno.fsize < 1024) {\n          printf(\"%\" PRIu32 \" B\\r\\n\", fno.fsize);\n        } else {\n          printf(\"%\" PRIu32 \" KB\\r\\n\", fno.fsize / 1024);\n        }\n      }\n    }\n  }\n\n  f_closedir(&dir);\n}\n\nvoid cli_cmd_pwd(EmbeddedCli *cli, char *args, void *context) {\n  (void)cli;\n  (void)context;\n  uint16_t argc = embeddedCliGetTokenCount(args);\n\n  if (argc != 0) {\n    printf(\"invalid arguments\\r\\n\");\n    return;\n  }\n\n  char path[256];\n  if (FR_OK != f_getcwd(path, sizeof(path))) {\n    printf(\"cannot get current working directory\\r\\n\");\n  }\n\n  puts(path);\n}\n\nvoid cli_cmd_mkdir(EmbeddedCli *cli, char *args, void *context) {\n  (void)cli;\n  (void)context;\n\n  uint16_t argc = embeddedCliGetTokenCount(args);\n\n  // only support 1 argument\n  if (argc != 1) {\n    printf(\"invalid arguments\\r\\n\");\n    return;\n  }\n\n  // default is current directory\n  const char *dpath = args;\n\n  if (FR_OK != f_mkdir(dpath)) {\n    printf(\"%s: cannot create this directory\\r\\n\", dpath);\n    return;\n  }\n}\n\nvoid cli_cmd_mv(EmbeddedCli *cli, char *args, void *context) {\n  (void)cli;\n  (void)context;\n\n  uint16_t argc = embeddedCliGetTokenCount(args);\n  if (argc != 2) {\n    printf(\"invalid arguments\\r\\n\");\n    return;\n  }\n\n  // default is current directory\n  const char *src = embeddedCliGetToken(args, 1);\n  const char *dst = embeddedCliGetToken(args, 2);\n\n  if (FR_OK != f_rename(src, dst)) {\n    printf(\"cannot mv %s to %s\\r\\n\", src, dst);\n    return;\n  }\n}\n\nvoid cli_cmd_rm(EmbeddedCli *cli, char *args, void *context) {\n  (void)cli;\n  (void)context;\n\n  uint16_t argc = embeddedCliGetTokenCount(args);\n\n  // need at least 1 argument\n  if (argc == 0) {\n    printf(\"invalid arguments\\r\\n\");\n    return;\n  }\n\n  for (uint16_t i = 0; i < argc; i++) {\n    const char *fpath = embeddedCliGetToken(args, i + 1); // token count from 1\n\n    if (FR_OK != f_unlink(fpath)) {\n      printf(\"cannot remove '%s': No such file or directory\\r\\n\", fpath);\n    }\n  }\n}\n"
  },
  {
    "path": "examples/host/msc_file_explorer/src/msc_app.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef MSC_APP_H\n#define MSC_APP_H\n\n#include <stdbool.h>\n#include <stdio.h>\n\nbool msc_app_init(void);\nvoid msc_app_task(void);\n\n\n#endif\n"
  },
  {
    "path": "examples/host/msc_file_explorer/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUH_MEM_SECTION\n#define CFG_TUH_MEM_SECTION\n#endif\n\n#ifndef CFG_TUH_MEM_ALIGN\n#define CFG_TUH_MEM_ALIGN     __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// Host Configuration\n//--------------------------------------------------------------------\n\n// Enable Host stack\n#define CFG_TUH_ENABLED       1\n\n// #define CFG_TUH_MAX3421       1 // use max3421 as host controller\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n  // #define CFG_TUH_RPI_PIO_USB   1 // use pio-usb as host controller\n\n  // host roothub port is 1 if using either pio-usb or max3421\n  #if (defined(CFG_TUH_RPI_PIO_USB) && CFG_TUH_RPI_PIO_USB) || (defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421)\n    #define BOARD_TUH_RHPORT      1\n  #endif\n#endif\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_MAX_SPEED     BOARD_TUH_MAX_SPEED\n\n//------------------------- Board Specific --------------------------\n\n// RHPort number used for host can be defined by board.mk, default to port 0\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Driver Configuration\n//--------------------------------------------------------------------\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#define CFG_TUH_HUB                 1 // number of supported hubs\n#define CFG_TUH_MSC                 1\n#define CFG_TUH_CDC                 0\n#define CFG_TUH_HID                 0 // typical keyboard + mouse device can have 3-4 HID interfaces\n#define CFG_TUH_VENDOR              0\n\n// max device support (excluding hub device): 1 hub typically has 4 ports\n#define CFG_TUH_DEVICE_MAX          (3*CFG_TUH_HUB + 1)\n\n//------------- MSC -------------//\n#define CFG_TUH_MSC_MAXLUN    4 // typical for most card reader\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/typec/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../hw/bsp/family_support.cmake)\n\nproject(tinyusb_host_examples C CXX ASM)\nfamily_initialize_project(tinyusb_host_examples ${CMAKE_CURRENT_LIST_DIR})\n\n# family_add_subdirectory will filter what to actually add based on selected FAMILY\nfamily_add_subdirectory(power_delivery)\n"
  },
  {
    "path": "examples/typec/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/typec/power_delivery/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(power_delivery C CXX ASM)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\n# Espressif has its own cmake build system\nif(FAMILY STREQUAL \"espressif\")\n  return()\nendif()\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "examples/typec/power_delivery/CMakePresets.json",
    "content": "{\n  \"version\": 6,\n  \"include\": [\n    \"../../../hw/bsp/BoardPresets.json\"\n  ]\n}\n"
  },
  {
    "path": "examples/typec/power_delivery/Makefile",
    "content": "include ../../../hw/bsp/family_support.mk\n\nINC += \\\n  src \\\n\n\n# Example source\nEXAMPLE_SOURCE += \\\n  src/main.c\n\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(EXAMPLE_SOURCE))\n\ninclude ../../../hw/bsp/family_rules.mk\n"
  },
  {
    "path": "examples/typec/power_delivery/only.txt",
    "content": "mcu:STM32G4\n"
  },
  {
    "path": "examples/typec/power_delivery/src/main.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"bsp/board_api.h\"\n#include \"tusb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPES\n//--------------------------------------------------------------------+\n\n// Voltage and current for selecting PDO\n// DANGEROUS: Please make sure your board can withstand the voltage and current\n// defined here. Otherwise, you may damage your board, smoke can come out\n#define VOLTAGE_MAX_MV       5000 // maximum voltage in mV\n#define CURRENT_MAX_MA       500  // maximum current in mA\n#define CURRENT_OPERATING_MA 100  // operating current in mA\n\n/* Blink pattern\n * - 250 ms  : button is not pressed\n * - 1000 ms : button is pressed (and hold)\n */\nenum  {\n  BLINK_PRESSED = 250,\n  BLINK_UNPRESSED = 1000\n};\n\nstatic uint32_t blink_interval_ms = BLINK_UNPRESSED;\n\nvoid led_blinking_task(void);\n\n#define HELLO_STR   \"Hello from TinyUSB\\r\\n\"\n\nint main(void)\n{\n  board_init();\n  board_led_write(true);\n\n  tuc_init(0, TUSB_TYPEC_PORT_SNK);\n\n  while (1) {\n    led_blinking_task();\n\n    // tinyusb typec task\n    tuc_task();\n  }\n}\n\n#ifdef ESP_PLATFORM\nvoid app_main(void) {\n  main();\n}\n#endif\n\n//--------------------------------------------------------------------+\n// TypeC PD callbacks\n//--------------------------------------------------------------------+\n\nbool tuc_pd_data_received_cb(uint8_t rhport, pd_header_t const* header, uint8_t const* dobj, uint8_t const* p_end) {\n  switch (header->msg_type) {\n    case PD_DATA_SOURCE_CAP: {\n      printf(\"PD Source Capabilities\\r\\n\");\n      // Examine source capability and select a suitable PDO (starting from 1 with safe5v)\n      uint8_t selected_pos = 1;\n\n      for(size_t i=0; i<header->n_data_obj; i++) {\n        TU_VERIFY(dobj < p_end);\n        uint32_t const pdo = tu_le32toh(tu_unaligned_read32(dobj));\n\n        switch ((pdo >> 30) & 0x03ul) {\n          case PD_PDO_TYPE_FIXED: {\n            pd_pdo_fixed_t const* fixed = (pd_pdo_fixed_t const*) &pdo;\n            uint32_t const voltage_mv = fixed->voltage_50mv*50;\n            uint32_t const current_ma = fixed->current_max_10ma*10;\n            printf(\"[Fixed] %\"PRIu32\" mV %\"PRIu32\" mA\\r\\n\", voltage_mv, current_ma);\n\n            if (voltage_mv <= VOLTAGE_MAX_MV && current_ma >= CURRENT_MAX_MA) {\n              // Found a suitable PDO\n              selected_pos = i+1;\n            }\n\n            break;\n          }\n\n          case PD_PDO_TYPE_BATTERY:\n            break;\n\n          case PD_PDO_TYPE_VARIABLE:\n            break;\n\n          case PD_PDO_TYPE_APDO:\n            break;\n        }\n\n        dobj += 4;\n      }\n\n      //------------- Response with selected PDO -------------//\n      // Be careful and make sure your board can withstand the selected PDO\n      // voltage other than safe5v e.g 12v or 20v\n\n      printf(\"Selected PDO %u\\r\\n\", selected_pos);\n\n      // Send request with selected PDO position as response to Source Cap\n      pd_rdo_fixed_variable_t rdo = {\n          .current_extremum_10ma = 50, // max 500mA\n          .current_operate_10ma = 30, // 300mA\n          .reserved = 0,\n          .epr_mode_capable = 0,\n          .unchunked_ext_msg_support = 0,\n          .no_usb_suspend = 0,\n          .usb_comm_capable = 1,\n          .capability_mismatch = 0,\n          .give_back_flag = 0, // exteremum is max\n          .object_position = selected_pos,\n      };\n      tuc_msg_request(rhport, &rdo);\n\n      break;\n    }\n\n    default: break;\n  }\n\n  return true;\n}\n\nbool tuc_pd_control_received_cb(uint8_t rhport, pd_header_t const* header) {\n  (void) rhport;\n  switch (header->msg_type) {\n    case PD_CTRL_ACCEPT:\n      printf(\"PD Request Accepted\\r\\n\");\n      // preparing for power transition\n      break;\n\n    case PD_CTRL_REJECT:\n      printf(\"PD Request Rejected\\r\\n\");\n      // try to negotiate further power\n      break;\n\n    case PD_CTRL_PS_READY:\n      printf(\"PD Power Ready\\r\\n\");\n      // Source is ready to supply power\n      break;\n\n    default:\n      break;\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// BLINKING TASK\n//--------------------------------------------------------------------+\nvoid led_blinking_task(void)\n{\n  static uint32_t start_ms = 0;\n  static bool led_state = false;\n\n  // Blink every interval ms\n  if ( tusb_time_millis_api() - start_ms < blink_interval_ms) return; // not enough time\n  start_ms += blink_interval_ms;\n\n  board_led_write(led_state);\n  led_state = 1 - led_state; // toggle\n}\n"
  },
  {
    "path": "examples/typec/power_delivery/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n  #error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n  #define CFG_TUSB_OS               OPT_OS_NONE\n#endif\n\n#define CFG_TUD_ENABLED   0\n#define CFG_TUH_ENABLED   0\n\n// Enable TYPEC stack\n#define CFG_TUC_ENABLED   1\n\n\n// special example that doesn't enable device or host stack\n// This can cause some TinyUSB API missing, this define hack to allow us to fill those API\n// to pass the compilation process\n#if CFG_TUD_ENABLED == 0\n#define tud_int_handler(x)\n#endif\n\n\n// CFG_TUSB_DEBUG is defined by compiler in DEBUG build\n// #define CFG_TUSB_DEBUG           0\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          __attribute__ ((aligned(4)))\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "examples/west.yml",
    "content": "manifest:\n  remotes:\n    - name: zephyrproject-rtos\n      url-base: https://github.com/zephyrproject-rtos\n  projects:\n    - name: zephyr\n      remote: zephyrproject-rtos\n      revision: main\n      path: zephyr\n      import: true\n  self:\n    path: .\n"
  },
  {
    "path": "hw/bsp/BoardPresets.json",
    "content": "{\n  \"version\": 6,\n  \"configurePresets\": [\n    {\n      \"name\": \"default\",\n      \"hidden\": true,\n      \"description\": \"Configure preset for the ${presetName} board\",\n      \"generator\": \"Ninja Multi-Config\",\n      \"binaryDir\": \"${sourceDir}/build/${presetName}\",\n      \"cacheVariables\": {\n        \"CMAKE_DEFAULT_BUILD_TYPE\": \"RelWithDebInfo\",\n        \"BOARD\": \"${presetName}\"\n      }\n    },\n    {\n      \"name\": \"default single config\",\n      \"hidden\": true,\n      \"description\": \"Configure preset for the ${presetName} board\",\n      \"generator\": \"Ninja\",\n      \"binaryDir\": \"${sourceDir}/build/${presetName}\",\n      \"cacheVariables\": {\n        \"BOARD\": \"${presetName}\"\n      }\n    },\n    {\n      \"name\": \"adafruit_clue\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"adafruit_feather_rp2040_usb_host\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"adafruit_fruit_jam\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"adafruit_metro_rp2350\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"apard32690\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"arduino_nano33_ble\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at32f403a_weact_blackpill\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f402\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f403a\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f405\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f407\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f413\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f415\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f423\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f425\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f435\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f437\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f455\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f456\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"at_start_f457\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"atsamd21_xpro\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"atsaml21_xpro\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"b_g474e_dpow1\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"b_u585i_iot2a\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ch32v103r_r1_1v0\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ch32v203c_r0_1v0\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ch32v203g_r0_1v0\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ch32v307v_r1_1v0\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"circuitplayground_bluefruit\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"circuitplayground_express\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"curiosity_nano\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"cynthion_d11\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"cynthion_d21\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"d5035_01\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"da14695_dk_usb\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"da1469x_dk_pro\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"daisyseed\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"double_m33_express\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ea4088_quickstart\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ea4357\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ek_tm4c123gxl\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ek_tm4c1294xl\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"f1c100s\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"feather_m0_express\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"feather_m4_express\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"feather_nrf52840_express\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"feather_nrf52840_sense\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"feather_rp2040_max3421\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"feather_stm32f405\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"fomu\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"frdm_k32l2a4s\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"frdm_k32l2b\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"frdm_k64f\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"frdm_kl25z\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"frdm_mcxa153\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"frdm_mcxa156\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"frdm_mcxn947\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"frdm_rw612\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"hpm6750evk2\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"itsybitsy_m0\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"itsybitsy_m4\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"itsybitsy_nrf52840\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"kuiic\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso11u37\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso11u68\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso1347\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso1549\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso1769\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso18s37\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso43s67\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso51u68\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso54114\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso54608\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso54628\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso55s28\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"lpcxpresso55s69\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"max32650evkit\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"max32650fthr\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"max32651evkit\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"max32666evkit\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"max32666fthr\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"max32690evkit\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"max78002evkit\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mbed1768\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mcb1800\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mcu_link\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mcxn947brk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"metro_m0_express\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"metro_m4_express\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"metro_m7_1011\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mimxrt1010_evk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mimxrt1015_evk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mimxrt1020_evk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mimxrt1024_evk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mimxrt1050_evkb\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mimxrt1060_evk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mimxrt1064_evk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mimxrt1170_evkb\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mm32f327x_mb39\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"mm32f327x_pitaya_lite\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"msp_exp430f5529lp\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"msp_exp432e401y\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nanoch32v203\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nanoch32v305\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nrf52833dk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nrf52840dk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nrf52840dongle\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nrf5340dk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nrf54h20dk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nutiny_nuc126v\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc120\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc121\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc125\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc505\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"pico_sdk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"portenta_c33\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"pybadge\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"pyboardv11\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"pyportal\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"qtpy\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ra2a1_ek\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ra4m1_ek\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ra4m3_ek\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ra6m1_ek\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ra6m5_ek\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"ra8m1_ek\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"raspberry_pi_pico\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"raspberry_pi_pico2\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"raspberry_pi_pico_w\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"raspberrypi_cm4\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"raspberrypi_zero\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"raspberrypi_zero2\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"samd11_xplained\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"same54_xplained\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"same70_qmtech\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"same70_xplained\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"samg55_xplained\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"saml22_feather\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"seeeduino_xiao\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"sensorwatch_m0\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"sipeed_longan_nano\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"sltb009a\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"sparkfun_samd21_mini_usb\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"spresense\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stlinkv3mini\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32c071nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f070rbnucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f072disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f072eval\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f103_bluepill\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f103_mini_2\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f103ze_iar\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f207nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f303disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f401blackpill\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f407blackvet\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f407disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f411blackpill\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f411disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f412disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f412nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f439nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f723disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f746disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f746nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f767nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32f769disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32g0b1nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32g474nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32g491nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h503nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h563nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h573i_dk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h723nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h743eval\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h743nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h745disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h747disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h750_weact\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h750bdk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32h7s3nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32l052dap52\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32l0538disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32l412nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32l476disco\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32l496nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32l4p5nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32l4r5nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32n6570dk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32n657nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32u083cdk\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32u545nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32u575eval\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32u575nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32u5a5nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32wb55nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"stm32wba_nucleo\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"teensy_35\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"teensy_40\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"teensy_41\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"trinket_m0\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"uno_r4\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"waveshare_openh743i\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"xmc4500_relax\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"xmc4700_relax\",\n      \"inherits\": \"default\"\n    },\n    {\n      \"name\": \"adafruit_feather_esp32_v2\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"adafruit_feather_esp32c6\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"adafruit_feather_esp32s2\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"adafruit_feather_esp32s3\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"adafruit_magtag_29gray\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"adafruit_metro_esp32s2\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_addax_1\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_c3_devkitc\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_c6_devkitc\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_kaluga_1\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_p4_function_ev\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_s2_devkitc\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_s3_devkitc\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_s3_devkitm\",\n      \"inherits\": \"default single config\"\n    },\n    {\n      \"name\": \"espressif_saola_1\",\n      \"inherits\": \"default single config\"\n    }\n  ],\n  \"buildPresets\": [\n    {\n      \"name\": \"adafruit_clue\",\n      \"description\": \"Build preset for the adafruit_clue board\",\n      \"configurePreset\": \"adafruit_clue\"\n    },\n    {\n      \"name\": \"adafruit_feather_esp32_v2\",\n      \"description\": \"Build preset for the adafruit_feather_esp32_v2 board\",\n      \"configurePreset\": \"adafruit_feather_esp32_v2\"\n    },\n    {\n      \"name\": \"adafruit_feather_esp32c6\",\n      \"description\": \"Build preset for the adafruit_feather_esp32c6 board\",\n      \"configurePreset\": \"adafruit_feather_esp32c6\"\n    },\n    {\n      \"name\": \"adafruit_feather_esp32s2\",\n      \"description\": \"Build preset for the adafruit_feather_esp32s2 board\",\n      \"configurePreset\": \"adafruit_feather_esp32s2\"\n    },\n    {\n      \"name\": \"adafruit_feather_esp32s3\",\n      \"description\": \"Build preset for the adafruit_feather_esp32s3 board\",\n      \"configurePreset\": \"adafruit_feather_esp32s3\"\n    },\n    {\n      \"name\": \"adafruit_feather_rp2040_usb_host\",\n      \"description\": \"Build preset for the adafruit_feather_rp2040_usb_host board\",\n      \"configurePreset\": \"adafruit_feather_rp2040_usb_host\"\n    },\n    {\n      \"name\": \"adafruit_fruit_jam\",\n      \"description\": \"Build preset for the adafruit_fruit_jam board\",\n      \"configurePreset\": \"adafruit_fruit_jam\"\n    },\n    {\n      \"name\": \"adafruit_magtag_29gray\",\n      \"description\": \"Build preset for the adafruit_magtag_29gray board\",\n      \"configurePreset\": \"adafruit_magtag_29gray\"\n    },\n    {\n      \"name\": \"adafruit_metro_esp32s2\",\n      \"description\": \"Build preset for the adafruit_metro_esp32s2 board\",\n      \"configurePreset\": \"adafruit_metro_esp32s2\"\n    },\n    {\n      \"name\": \"adafruit_metro_rp2350\",\n      \"description\": \"Build preset for the adafruit_metro_rp2350 board\",\n      \"configurePreset\": \"adafruit_metro_rp2350\"\n    },\n    {\n      \"name\": \"apard32690\",\n      \"description\": \"Build preset for the apard32690 board\",\n      \"configurePreset\": \"apard32690\"\n    },\n    {\n      \"name\": \"arduino_nano33_ble\",\n      \"description\": \"Build preset for the arduino_nano33_ble board\",\n      \"configurePreset\": \"arduino_nano33_ble\"\n    },\n    {\n      \"name\": \"at32f403a_weact_blackpill\",\n      \"description\": \"Build preset for the at32f403a_weact_blackpill board\",\n      \"configurePreset\": \"at32f403a_weact_blackpill\"\n    },\n    {\n      \"name\": \"at_start_f402\",\n      \"description\": \"Build preset for the at_start_f402 board\",\n      \"configurePreset\": \"at_start_f402\"\n    },\n    {\n      \"name\": \"at_start_f403a\",\n      \"description\": \"Build preset for the at_start_f403a board\",\n      \"configurePreset\": \"at_start_f403a\"\n    },\n    {\n      \"name\": \"at_start_f405\",\n      \"description\": \"Build preset for the at_start_f405 board\",\n      \"configurePreset\": \"at_start_f405\"\n    },\n    {\n      \"name\": \"at_start_f407\",\n      \"description\": \"Build preset for the at_start_f407 board\",\n      \"configurePreset\": \"at_start_f407\"\n    },\n    {\n      \"name\": \"at_start_f413\",\n      \"description\": \"Build preset for the at_start_f413 board\",\n      \"configurePreset\": \"at_start_f413\"\n    },\n    {\n      \"name\": \"at_start_f415\",\n      \"description\": \"Build preset for the at_start_f415 board\",\n      \"configurePreset\": \"at_start_f415\"\n    },\n    {\n      \"name\": \"at_start_f423\",\n      \"description\": \"Build preset for the at_start_f423 board\",\n      \"configurePreset\": \"at_start_f423\"\n    },\n    {\n      \"name\": \"at_start_f425\",\n      \"description\": \"Build preset for the at_start_f425 board\",\n      \"configurePreset\": \"at_start_f425\"\n    },\n    {\n      \"name\": \"at_start_f435\",\n      \"description\": \"Build preset for the at_start_f435 board\",\n      \"configurePreset\": \"at_start_f435\"\n    },\n    {\n      \"name\": \"at_start_f437\",\n      \"description\": \"Build preset for the at_start_f437 board\",\n      \"configurePreset\": \"at_start_f437\"\n    },\n    {\n      \"name\": \"at_start_f455\",\n      \"description\": \"Build preset for the at_start_f455 board\",\n      \"configurePreset\": \"at_start_f455\"\n    },\n    {\n      \"name\": \"at_start_f456\",\n      \"description\": \"Build preset for the at_start_f456 board\",\n      \"configurePreset\": \"at_start_f456\"\n    },\n    {\n      \"name\": \"at_start_f457\",\n      \"description\": \"Build preset for the at_start_f457 board\",\n      \"configurePreset\": \"at_start_f457\"\n    },\n    {\n      \"name\": \"atsamd21_xpro\",\n      \"description\": \"Build preset for the atsamd21_xpro board\",\n      \"configurePreset\": \"atsamd21_xpro\"\n    },\n    {\n      \"name\": \"atsaml21_xpro\",\n      \"description\": \"Build preset for the atsaml21_xpro board\",\n      \"configurePreset\": \"atsaml21_xpro\"\n    },\n    {\n      \"name\": \"b_g474e_dpow1\",\n      \"description\": \"Build preset for the b_g474e_dpow1 board\",\n      \"configurePreset\": \"b_g474e_dpow1\"\n    },\n    {\n      \"name\": \"b_u585i_iot2a\",\n      \"description\": \"Build preset for the b_u585i_iot2a board\",\n      \"configurePreset\": \"b_u585i_iot2a\"\n    },\n    {\n      \"name\": \"ch32v103r_r1_1v0\",\n      \"description\": \"Build preset for the ch32v103r_r1_1v0 board\",\n      \"configurePreset\": \"ch32v103r_r1_1v0\"\n    },\n    {\n      \"name\": \"ch32v203c_r0_1v0\",\n      \"description\": \"Build preset for the ch32v203c_r0_1v0 board\",\n      \"configurePreset\": \"ch32v203c_r0_1v0\"\n    },\n    {\n      \"name\": \"ch32v203g_r0_1v0\",\n      \"description\": \"Build preset for the ch32v203g_r0_1v0 board\",\n      \"configurePreset\": \"ch32v203g_r0_1v0\"\n    },\n    {\n      \"name\": \"ch32v307v_r1_1v0\",\n      \"description\": \"Build preset for the ch32v307v_r1_1v0 board\",\n      \"configurePreset\": \"ch32v307v_r1_1v0\"\n    },\n    {\n      \"name\": \"circuitplayground_bluefruit\",\n      \"description\": \"Build preset for the circuitplayground_bluefruit board\",\n      \"configurePreset\": \"circuitplayground_bluefruit\"\n    },\n    {\n      \"name\": \"circuitplayground_express\",\n      \"description\": \"Build preset for the circuitplayground_express board\",\n      \"configurePreset\": \"circuitplayground_express\"\n    },\n    {\n      \"name\": \"curiosity_nano\",\n      \"description\": \"Build preset for the curiosity_nano board\",\n      \"configurePreset\": \"curiosity_nano\"\n    },\n    {\n      \"name\": \"cynthion_d11\",\n      \"description\": \"Build preset for the cynthion_d11 board\",\n      \"configurePreset\": \"cynthion_d11\"\n    },\n    {\n      \"name\": \"cynthion_d21\",\n      \"description\": \"Build preset for the cynthion_d21 board\",\n      \"configurePreset\": \"cynthion_d21\"\n    },\n    {\n      \"name\": \"d5035_01\",\n      \"description\": \"Build preset for the d5035_01 board\",\n      \"configurePreset\": \"d5035_01\"\n    },\n    {\n      \"name\": \"da14695_dk_usb\",\n      \"description\": \"Build preset for the da14695_dk_usb board\",\n      \"configurePreset\": \"da14695_dk_usb\"\n    },\n    {\n      \"name\": \"da1469x_dk_pro\",\n      \"description\": \"Build preset for the da1469x_dk_pro board\",\n      \"configurePreset\": \"da1469x_dk_pro\"\n    },\n    {\n      \"name\": \"daisyseed\",\n      \"description\": \"Build preset for the daisyseed board\",\n      \"configurePreset\": \"daisyseed\"\n    },\n    {\n      \"name\": \"double_m33_express\",\n      \"description\": \"Build preset for the double_m33_express board\",\n      \"configurePreset\": \"double_m33_express\"\n    },\n    {\n      \"name\": \"ea4088_quickstart\",\n      \"description\": \"Build preset for the ea4088_quickstart board\",\n      \"configurePreset\": \"ea4088_quickstart\"\n    },\n    {\n      \"name\": \"ea4357\",\n      \"description\": \"Build preset for the ea4357 board\",\n      \"configurePreset\": \"ea4357\"\n    },\n    {\n      \"name\": \"ek_tm4c123gxl\",\n      \"description\": \"Build preset for the ek_tm4c123gxl board\",\n      \"configurePreset\": \"ek_tm4c123gxl\"\n    },\n    {\n      \"name\": \"ek_tm4c1294xl\",\n      \"description\": \"Build preset for the ek_tm4c1294xl board\",\n      \"configurePreset\": \"ek_tm4c1294xl\"\n    },\n    {\n      \"name\": \"espressif_addax_1\",\n      \"description\": \"Build preset for the espressif_addax_1 board\",\n      \"configurePreset\": \"espressif_addax_1\"\n    },\n    {\n      \"name\": \"espressif_c3_devkitc\",\n      \"description\": \"Build preset for the espressif_c3_devkitc board\",\n      \"configurePreset\": \"espressif_c3_devkitc\"\n    },\n    {\n      \"name\": \"espressif_c6_devkitc\",\n      \"description\": \"Build preset for the espressif_c6_devkitc board\",\n      \"configurePreset\": \"espressif_c6_devkitc\"\n    },\n    {\n      \"name\": \"espressif_kaluga_1\",\n      \"description\": \"Build preset for the espressif_kaluga_1 board\",\n      \"configurePreset\": \"espressif_kaluga_1\"\n    },\n    {\n      \"name\": \"espressif_p4_function_ev\",\n      \"description\": \"Build preset for the espressif_p4_function_ev board\",\n      \"configurePreset\": \"espressif_p4_function_ev\"\n    },\n    {\n      \"name\": \"espressif_s2_devkitc\",\n      \"description\": \"Build preset for the espressif_s2_devkitc board\",\n      \"configurePreset\": \"espressif_s2_devkitc\"\n    },\n    {\n      \"name\": \"espressif_s3_devkitc\",\n      \"description\": \"Build preset for the espressif_s3_devkitc board\",\n      \"configurePreset\": \"espressif_s3_devkitc\"\n    },\n    {\n      \"name\": \"espressif_s3_devkitm\",\n      \"description\": \"Build preset for the espressif_s3_devkitm board\",\n      \"configurePreset\": \"espressif_s3_devkitm\"\n    },\n    {\n      \"name\": \"espressif_saola_1\",\n      \"description\": \"Build preset for the espressif_saola_1 board\",\n      \"configurePreset\": \"espressif_saola_1\"\n    },\n    {\n      \"name\": \"f1c100s\",\n      \"description\": \"Build preset for the f1c100s board\",\n      \"configurePreset\": \"f1c100s\"\n    },\n    {\n      \"name\": \"feather_m0_express\",\n      \"description\": \"Build preset for the feather_m0_express board\",\n      \"configurePreset\": \"feather_m0_express\"\n    },\n    {\n      \"name\": \"feather_m4_express\",\n      \"description\": \"Build preset for the feather_m4_express board\",\n      \"configurePreset\": \"feather_m4_express\"\n    },\n    {\n      \"name\": \"feather_nrf52840_express\",\n      \"description\": \"Build preset for the feather_nrf52840_express board\",\n      \"configurePreset\": \"feather_nrf52840_express\"\n    },\n    {\n      \"name\": \"feather_nrf52840_sense\",\n      \"description\": \"Build preset for the feather_nrf52840_sense board\",\n      \"configurePreset\": \"feather_nrf52840_sense\"\n    },\n    {\n      \"name\": \"feather_rp2040_max3421\",\n      \"description\": \"Build preset for the feather_rp2040_max3421 board\",\n      \"configurePreset\": \"feather_rp2040_max3421\"\n    },\n    {\n      \"name\": \"feather_stm32f405\",\n      \"description\": \"Build preset for the feather_stm32f405 board\",\n      \"configurePreset\": \"feather_stm32f405\"\n    },\n    {\n      \"name\": \"fomu\",\n      \"description\": \"Build preset for the fomu board\",\n      \"configurePreset\": \"fomu\"\n    },\n    {\n      \"name\": \"frdm_k32l2a4s\",\n      \"description\": \"Build preset for the frdm_k32l2a4s board\",\n      \"configurePreset\": \"frdm_k32l2a4s\"\n    },\n    {\n      \"name\": \"frdm_k32l2b\",\n      \"description\": \"Build preset for the frdm_k32l2b board\",\n      \"configurePreset\": \"frdm_k32l2b\"\n    },\n    {\n      \"name\": \"frdm_k64f\",\n      \"description\": \"Build preset for the frdm_k64f board\",\n      \"configurePreset\": \"frdm_k64f\"\n    },\n    {\n      \"name\": \"frdm_kl25z\",\n      \"description\": \"Build preset for the frdm_kl25z board\",\n      \"configurePreset\": \"frdm_kl25z\"\n    },\n    {\n      \"name\": \"frdm_mcxa153\",\n      \"description\": \"Build preset for the frdm_mcxa153 board\",\n      \"configurePreset\": \"frdm_mcxa153\"\n    },\n    {\n      \"name\": \"frdm_mcxa156\",\n      \"description\": \"Build preset for the frdm_mcxa156 board\",\n      \"configurePreset\": \"frdm_mcxa156\"\n    },\n    {\n      \"name\": \"frdm_mcxn947\",\n      \"description\": \"Build preset for the frdm_mcxn947 board\",\n      \"configurePreset\": \"frdm_mcxn947\"\n    },\n    {\n      \"name\": \"frdm_rw612\",\n      \"description\": \"Build preset for the frdm_rw612 board\",\n      \"configurePreset\": \"frdm_rw612\"\n    },\n    {\n      \"name\": \"hpm6750evk2\",\n      \"description\": \"Build preset for the hpm6750evk2 board\",\n      \"configurePreset\": \"hpm6750evk2\"\n    },\n    {\n      \"name\": \"itsybitsy_m0\",\n      \"description\": \"Build preset for the itsybitsy_m0 board\",\n      \"configurePreset\": \"itsybitsy_m0\"\n    },\n    {\n      \"name\": \"itsybitsy_m4\",\n      \"description\": \"Build preset for the itsybitsy_m4 board\",\n      \"configurePreset\": \"itsybitsy_m4\"\n    },\n    {\n      \"name\": \"itsybitsy_nrf52840\",\n      \"description\": \"Build preset for the itsybitsy_nrf52840 board\",\n      \"configurePreset\": \"itsybitsy_nrf52840\"\n    },\n    {\n      \"name\": \"kuiic\",\n      \"description\": \"Build preset for the kuiic board\",\n      \"configurePreset\": \"kuiic\"\n    },\n    {\n      \"name\": \"lpcxpresso11u37\",\n      \"description\": \"Build preset for the lpcxpresso11u37 board\",\n      \"configurePreset\": \"lpcxpresso11u37\"\n    },\n    {\n      \"name\": \"lpcxpresso11u68\",\n      \"description\": \"Build preset for the lpcxpresso11u68 board\",\n      \"configurePreset\": \"lpcxpresso11u68\"\n    },\n    {\n      \"name\": \"lpcxpresso1347\",\n      \"description\": \"Build preset for the lpcxpresso1347 board\",\n      \"configurePreset\": \"lpcxpresso1347\"\n    },\n    {\n      \"name\": \"lpcxpresso1549\",\n      \"description\": \"Build preset for the lpcxpresso1549 board\",\n      \"configurePreset\": \"lpcxpresso1549\"\n    },\n    {\n      \"name\": \"lpcxpresso1769\",\n      \"description\": \"Build preset for the lpcxpresso1769 board\",\n      \"configurePreset\": \"lpcxpresso1769\"\n    },\n    {\n      \"name\": \"lpcxpresso18s37\",\n      \"description\": \"Build preset for the lpcxpresso18s37 board\",\n      \"configurePreset\": \"lpcxpresso18s37\"\n    },\n    {\n      \"name\": \"lpcxpresso43s67\",\n      \"description\": \"Build preset for the lpcxpresso43s67 board\",\n      \"configurePreset\": \"lpcxpresso43s67\"\n    },\n    {\n      \"name\": \"lpcxpresso51u68\",\n      \"description\": \"Build preset for the lpcxpresso51u68 board\",\n      \"configurePreset\": \"lpcxpresso51u68\"\n    },\n    {\n      \"name\": \"lpcxpresso54114\",\n      \"description\": \"Build preset for the lpcxpresso54114 board\",\n      \"configurePreset\": \"lpcxpresso54114\"\n    },\n    {\n      \"name\": \"lpcxpresso54608\",\n      \"description\": \"Build preset for the lpcxpresso54608 board\",\n      \"configurePreset\": \"lpcxpresso54608\"\n    },\n    {\n      \"name\": \"lpcxpresso54628\",\n      \"description\": \"Build preset for the lpcxpresso54628 board\",\n      \"configurePreset\": \"lpcxpresso54628\"\n    },\n    {\n      \"name\": \"lpcxpresso55s28\",\n      \"description\": \"Build preset for the lpcxpresso55s28 board\",\n      \"configurePreset\": \"lpcxpresso55s28\"\n    },\n    {\n      \"name\": \"lpcxpresso55s69\",\n      \"description\": \"Build preset for the lpcxpresso55s69 board\",\n      \"configurePreset\": \"lpcxpresso55s69\"\n    },\n    {\n      \"name\": \"max32650evkit\",\n      \"description\": \"Build preset for the max32650evkit board\",\n      \"configurePreset\": \"max32650evkit\"\n    },\n    {\n      \"name\": \"max32650fthr\",\n      \"description\": \"Build preset for the max32650fthr board\",\n      \"configurePreset\": \"max32650fthr\"\n    },\n    {\n      \"name\": \"max32651evkit\",\n      \"description\": \"Build preset for the max32651evkit board\",\n      \"configurePreset\": \"max32651evkit\"\n    },\n    {\n      \"name\": \"max32666evkit\",\n      \"description\": \"Build preset for the max32666evkit board\",\n      \"configurePreset\": \"max32666evkit\"\n    },\n    {\n      \"name\": \"max32666fthr\",\n      \"description\": \"Build preset for the max32666fthr board\",\n      \"configurePreset\": \"max32666fthr\"\n    },\n    {\n      \"name\": \"max32690evkit\",\n      \"description\": \"Build preset for the max32690evkit board\",\n      \"configurePreset\": \"max32690evkit\"\n    },\n    {\n      \"name\": \"max78002evkit\",\n      \"description\": \"Build preset for the max78002evkit board\",\n      \"configurePreset\": \"max78002evkit\"\n    },\n    {\n      \"name\": \"mbed1768\",\n      \"description\": \"Build preset for the mbed1768 board\",\n      \"configurePreset\": \"mbed1768\"\n    },\n    {\n      \"name\": \"mcb1800\",\n      \"description\": \"Build preset for the mcb1800 board\",\n      \"configurePreset\": \"mcb1800\"\n    },\n    {\n      \"name\": \"mcu_link\",\n      \"description\": \"Build preset for the mcu_link board\",\n      \"configurePreset\": \"mcu_link\"\n    },\n    {\n      \"name\": \"mcxn947brk\",\n      \"description\": \"Build preset for the mcxn947brk board\",\n      \"configurePreset\": \"mcxn947brk\"\n    },\n    {\n      \"name\": \"metro_m0_express\",\n      \"description\": \"Build preset for the metro_m0_express board\",\n      \"configurePreset\": \"metro_m0_express\"\n    },\n    {\n      \"name\": \"metro_m4_express\",\n      \"description\": \"Build preset for the metro_m4_express board\",\n      \"configurePreset\": \"metro_m4_express\"\n    },\n    {\n      \"name\": \"metro_m7_1011\",\n      \"description\": \"Build preset for the metro_m7_1011 board\",\n      \"configurePreset\": \"metro_m7_1011\"\n    },\n    {\n      \"name\": \"mimxrt1010_evk\",\n      \"description\": \"Build preset for the mimxrt1010_evk board\",\n      \"configurePreset\": \"mimxrt1010_evk\"\n    },\n    {\n      \"name\": \"mimxrt1015_evk\",\n      \"description\": \"Build preset for the mimxrt1015_evk board\",\n      \"configurePreset\": \"mimxrt1015_evk\"\n    },\n    {\n      \"name\": \"mimxrt1020_evk\",\n      \"description\": \"Build preset for the mimxrt1020_evk board\",\n      \"configurePreset\": \"mimxrt1020_evk\"\n    },\n    {\n      \"name\": \"mimxrt1024_evk\",\n      \"description\": \"Build preset for the mimxrt1024_evk board\",\n      \"configurePreset\": \"mimxrt1024_evk\"\n    },\n    {\n      \"name\": \"mimxrt1050_evkb\",\n      \"description\": \"Build preset for the mimxrt1050_evkb board\",\n      \"configurePreset\": \"mimxrt1050_evkb\"\n    },\n    {\n      \"name\": \"mimxrt1060_evk\",\n      \"description\": \"Build preset for the mimxrt1060_evk board\",\n      \"configurePreset\": \"mimxrt1060_evk\"\n    },\n    {\n      \"name\": \"mimxrt1064_evk\",\n      \"description\": \"Build preset for the mimxrt1064_evk board\",\n      \"configurePreset\": \"mimxrt1064_evk\"\n    },\n    {\n      \"name\": \"mimxrt1170_evkb\",\n      \"description\": \"Build preset for the mimxrt1170_evkb board\",\n      \"configurePreset\": \"mimxrt1170_evkb\"\n    },\n    {\n      \"name\": \"mm32f327x_mb39\",\n      \"description\": \"Build preset for the mm32f327x_mb39 board\",\n      \"configurePreset\": \"mm32f327x_mb39\"\n    },\n    {\n      \"name\": \"mm32f327x_pitaya_lite\",\n      \"description\": \"Build preset for the mm32f327x_pitaya_lite board\",\n      \"configurePreset\": \"mm32f327x_pitaya_lite\"\n    },\n    {\n      \"name\": \"msp_exp430f5529lp\",\n      \"description\": \"Build preset for the msp_exp430f5529lp board\",\n      \"configurePreset\": \"msp_exp430f5529lp\"\n    },\n    {\n      \"name\": \"msp_exp432e401y\",\n      \"description\": \"Build preset for the msp_exp432e401y board\",\n      \"configurePreset\": \"msp_exp432e401y\"\n    },\n    {\n      \"name\": \"nanoch32v203\",\n      \"description\": \"Build preset for the nanoch32v203 board\",\n      \"configurePreset\": \"nanoch32v203\"\n    },\n    {\n      \"name\": \"nanoch32v305\",\n      \"description\": \"Build preset for the nanoch32v305 board\",\n      \"configurePreset\": \"nanoch32v305\"\n    },\n    {\n      \"name\": \"nrf52833dk\",\n      \"description\": \"Build preset for the nrf52833dk board\",\n      \"configurePreset\": \"nrf52833dk\"\n    },\n    {\n      \"name\": \"nrf52840dk\",\n      \"description\": \"Build preset for the nrf52840dk board\",\n      \"configurePreset\": \"nrf52840dk\"\n    },\n    {\n      \"name\": \"nrf52840dongle\",\n      \"description\": \"Build preset for the nrf52840dongle board\",\n      \"configurePreset\": \"nrf52840dongle\"\n    },\n    {\n      \"name\": \"nrf5340dk\",\n      \"description\": \"Build preset for the nrf5340dk board\",\n      \"configurePreset\": \"nrf5340dk\"\n    },\n    {\n      \"name\": \"nrf54h20dk\",\n      \"description\": \"Build preset for the nrf54h20dk board\",\n      \"configurePreset\": \"nrf54h20dk\"\n    },\n    {\n      \"name\": \"nutiny_nuc126v\",\n      \"description\": \"Build preset for the nutiny_nuc126v board\",\n      \"configurePreset\": \"nutiny_nuc126v\"\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc120\",\n      \"description\": \"Build preset for the nutiny_sdk_nuc120 board\",\n      \"configurePreset\": \"nutiny_sdk_nuc120\"\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc121\",\n      \"description\": \"Build preset for the nutiny_sdk_nuc121 board\",\n      \"configurePreset\": \"nutiny_sdk_nuc121\"\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc125\",\n      \"description\": \"Build preset for the nutiny_sdk_nuc125 board\",\n      \"configurePreset\": \"nutiny_sdk_nuc125\"\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc505\",\n      \"description\": \"Build preset for the nutiny_sdk_nuc505 board\",\n      \"configurePreset\": \"nutiny_sdk_nuc505\"\n    },\n    {\n      \"name\": \"pico_sdk\",\n      \"description\": \"Build preset for the pico_sdk board\",\n      \"configurePreset\": \"pico_sdk\"\n    },\n    {\n      \"name\": \"portenta_c33\",\n      \"description\": \"Build preset for the portenta_c33 board\",\n      \"configurePreset\": \"portenta_c33\"\n    },\n    {\n      \"name\": \"pybadge\",\n      \"description\": \"Build preset for the pybadge board\",\n      \"configurePreset\": \"pybadge\"\n    },\n    {\n      \"name\": \"pyboardv11\",\n      \"description\": \"Build preset for the pyboardv11 board\",\n      \"configurePreset\": \"pyboardv11\"\n    },\n    {\n      \"name\": \"pyportal\",\n      \"description\": \"Build preset for the pyportal board\",\n      \"configurePreset\": \"pyportal\"\n    },\n    {\n      \"name\": \"qtpy\",\n      \"description\": \"Build preset for the qtpy board\",\n      \"configurePreset\": \"qtpy\"\n    },\n    {\n      \"name\": \"ra2a1_ek\",\n      \"description\": \"Build preset for the ra2a1_ek board\",\n      \"configurePreset\": \"ra2a1_ek\"\n    },\n    {\n      \"name\": \"ra4m1_ek\",\n      \"description\": \"Build preset for the ra4m1_ek board\",\n      \"configurePreset\": \"ra4m1_ek\"\n    },\n    {\n      \"name\": \"ra4m3_ek\",\n      \"description\": \"Build preset for the ra4m3_ek board\",\n      \"configurePreset\": \"ra4m3_ek\"\n    },\n    {\n      \"name\": \"ra6m1_ek\",\n      \"description\": \"Build preset for the ra6m1_ek board\",\n      \"configurePreset\": \"ra6m1_ek\"\n    },\n    {\n      \"name\": \"ra6m5_ek\",\n      \"description\": \"Build preset for the ra6m5_ek board\",\n      \"configurePreset\": \"ra6m5_ek\"\n    },\n    {\n      \"name\": \"ra8m1_ek\",\n      \"description\": \"Build preset for the ra8m1_ek board\",\n      \"configurePreset\": \"ra8m1_ek\"\n    },\n    {\n      \"name\": \"raspberry_pi_pico\",\n      \"description\": \"Build preset for the raspberry_pi_pico board\",\n      \"configurePreset\": \"raspberry_pi_pico\"\n    },\n    {\n      \"name\": \"raspberry_pi_pico2\",\n      \"description\": \"Build preset for the raspberry_pi_pico2 board\",\n      \"configurePreset\": \"raspberry_pi_pico2\"\n    },\n    {\n      \"name\": \"raspberry_pi_pico_w\",\n      \"description\": \"Build preset for the raspberry_pi_pico_w board\",\n      \"configurePreset\": \"raspberry_pi_pico_w\"\n    },\n    {\n      \"name\": \"raspberrypi_cm4\",\n      \"description\": \"Build preset for the raspberrypi_cm4 board\",\n      \"configurePreset\": \"raspberrypi_cm4\"\n    },\n    {\n      \"name\": \"raspberrypi_zero\",\n      \"description\": \"Build preset for the raspberrypi_zero board\",\n      \"configurePreset\": \"raspberrypi_zero\"\n    },\n    {\n      \"name\": \"raspberrypi_zero2\",\n      \"description\": \"Build preset for the raspberrypi_zero2 board\",\n      \"configurePreset\": \"raspberrypi_zero2\"\n    },\n    {\n      \"name\": \"samd11_xplained\",\n      \"description\": \"Build preset for the samd11_xplained board\",\n      \"configurePreset\": \"samd11_xplained\"\n    },\n    {\n      \"name\": \"same54_xplained\",\n      \"description\": \"Build preset for the same54_xplained board\",\n      \"configurePreset\": \"same54_xplained\"\n    },\n    {\n      \"name\": \"same70_qmtech\",\n      \"description\": \"Build preset for the same70_qmtech board\",\n      \"configurePreset\": \"same70_qmtech\"\n    },\n    {\n      \"name\": \"same70_xplained\",\n      \"description\": \"Build preset for the same70_xplained board\",\n      \"configurePreset\": \"same70_xplained\"\n    },\n    {\n      \"name\": \"samg55_xplained\",\n      \"description\": \"Build preset for the samg55_xplained board\",\n      \"configurePreset\": \"samg55_xplained\"\n    },\n    {\n      \"name\": \"saml22_feather\",\n      \"description\": \"Build preset for the saml22_feather board\",\n      \"configurePreset\": \"saml22_feather\"\n    },\n    {\n      \"name\": \"seeeduino_xiao\",\n      \"description\": \"Build preset for the seeeduino_xiao board\",\n      \"configurePreset\": \"seeeduino_xiao\"\n    },\n    {\n      \"name\": \"sensorwatch_m0\",\n      \"description\": \"Build preset for the sensorwatch_m0 board\",\n      \"configurePreset\": \"sensorwatch_m0\"\n    },\n    {\n      \"name\": \"sipeed_longan_nano\",\n      \"description\": \"Build preset for the sipeed_longan_nano board\",\n      \"configurePreset\": \"sipeed_longan_nano\"\n    },\n    {\n      \"name\": \"sltb009a\",\n      \"description\": \"Build preset for the sltb009a board\",\n      \"configurePreset\": \"sltb009a\"\n    },\n    {\n      \"name\": \"sparkfun_samd21_mini_usb\",\n      \"description\": \"Build preset for the sparkfun_samd21_mini_usb board\",\n      \"configurePreset\": \"sparkfun_samd21_mini_usb\"\n    },\n    {\n      \"name\": \"spresense\",\n      \"description\": \"Build preset for the spresense board\",\n      \"configurePreset\": \"spresense\"\n    },\n    {\n      \"name\": \"stlinkv3mini\",\n      \"description\": \"Build preset for the stlinkv3mini board\",\n      \"configurePreset\": \"stlinkv3mini\"\n    },\n    {\n      \"name\": \"stm32c071nucleo\",\n      \"description\": \"Build preset for the stm32c071nucleo board\",\n      \"configurePreset\": \"stm32c071nucleo\"\n    },\n    {\n      \"name\": \"stm32f070rbnucleo\",\n      \"description\": \"Build preset for the stm32f070rbnucleo board\",\n      \"configurePreset\": \"stm32f070rbnucleo\"\n    },\n    {\n      \"name\": \"stm32f072disco\",\n      \"description\": \"Build preset for the stm32f072disco board\",\n      \"configurePreset\": \"stm32f072disco\"\n    },\n    {\n      \"name\": \"stm32f072eval\",\n      \"description\": \"Build preset for the stm32f072eval board\",\n      \"configurePreset\": \"stm32f072eval\"\n    },\n    {\n      \"name\": \"stm32f103_bluepill\",\n      \"description\": \"Build preset for the stm32f103_bluepill board\",\n      \"configurePreset\": \"stm32f103_bluepill\"\n    },\n    {\n      \"name\": \"stm32f103_mini_2\",\n      \"description\": \"Build preset for the stm32f103_mini_2 board\",\n      \"configurePreset\": \"stm32f103_mini_2\"\n    },\n    {\n      \"name\": \"stm32f103ze_iar\",\n      \"description\": \"Build preset for the stm32f103ze_iar board\",\n      \"configurePreset\": \"stm32f103ze_iar\"\n    },\n    {\n      \"name\": \"stm32f207nucleo\",\n      \"description\": \"Build preset for the stm32f207nucleo board\",\n      \"configurePreset\": \"stm32f207nucleo\"\n    },\n    {\n      \"name\": \"stm32f303disco\",\n      \"description\": \"Build preset for the stm32f303disco board\",\n      \"configurePreset\": \"stm32f303disco\"\n    },\n    {\n      \"name\": \"stm32f401blackpill\",\n      \"description\": \"Build preset for the stm32f401blackpill board\",\n      \"configurePreset\": \"stm32f401blackpill\"\n    },\n    {\n      \"name\": \"stm32f407blackvet\",\n      \"description\": \"Build preset for the stm32f407blackvet board\",\n      \"configurePreset\": \"stm32f407blackvet\"\n    },\n    {\n      \"name\": \"stm32f407disco\",\n      \"description\": \"Build preset for the stm32f407disco board\",\n      \"configurePreset\": \"stm32f407disco\"\n    },\n    {\n      \"name\": \"stm32f411blackpill\",\n      \"description\": \"Build preset for the stm32f411blackpill board\",\n      \"configurePreset\": \"stm32f411blackpill\"\n    },\n    {\n      \"name\": \"stm32f411disco\",\n      \"description\": \"Build preset for the stm32f411disco board\",\n      \"configurePreset\": \"stm32f411disco\"\n    },\n    {\n      \"name\": \"stm32f412disco\",\n      \"description\": \"Build preset for the stm32f412disco board\",\n      \"configurePreset\": \"stm32f412disco\"\n    },\n    {\n      \"name\": \"stm32f412nucleo\",\n      \"description\": \"Build preset for the stm32f412nucleo board\",\n      \"configurePreset\": \"stm32f412nucleo\"\n    },\n    {\n      \"name\": \"stm32f439nucleo\",\n      \"description\": \"Build preset for the stm32f439nucleo board\",\n      \"configurePreset\": \"stm32f439nucleo\"\n    },\n    {\n      \"name\": \"stm32f723disco\",\n      \"description\": \"Build preset for the stm32f723disco board\",\n      \"configurePreset\": \"stm32f723disco\"\n    },\n    {\n      \"name\": \"stm32f746disco\",\n      \"description\": \"Build preset for the stm32f746disco board\",\n      \"configurePreset\": \"stm32f746disco\"\n    },\n    {\n      \"name\": \"stm32f746nucleo\",\n      \"description\": \"Build preset for the stm32f746nucleo board\",\n      \"configurePreset\": \"stm32f746nucleo\"\n    },\n    {\n      \"name\": \"stm32f767nucleo\",\n      \"description\": \"Build preset for the stm32f767nucleo board\",\n      \"configurePreset\": \"stm32f767nucleo\"\n    },\n    {\n      \"name\": \"stm32f769disco\",\n      \"description\": \"Build preset for the stm32f769disco board\",\n      \"configurePreset\": \"stm32f769disco\"\n    },\n    {\n      \"name\": \"stm32g0b1nucleo\",\n      \"description\": \"Build preset for the stm32g0b1nucleo board\",\n      \"configurePreset\": \"stm32g0b1nucleo\"\n    },\n    {\n      \"name\": \"stm32g474nucleo\",\n      \"description\": \"Build preset for the stm32g474nucleo board\",\n      \"configurePreset\": \"stm32g474nucleo\"\n    },\n    {\n      \"name\": \"stm32g491nucleo\",\n      \"description\": \"Build preset for the stm32g491nucleo board\",\n      \"configurePreset\": \"stm32g491nucleo\"\n    },\n    {\n      \"name\": \"stm32h503nucleo\",\n      \"description\": \"Build preset for the stm32h503nucleo board\",\n      \"configurePreset\": \"stm32h503nucleo\"\n    },\n    {\n      \"name\": \"stm32h563nucleo\",\n      \"description\": \"Build preset for the stm32h563nucleo board\",\n      \"configurePreset\": \"stm32h563nucleo\"\n    },\n    {\n      \"name\": \"stm32h573i_dk\",\n      \"description\": \"Build preset for the stm32h573i_dk board\",\n      \"configurePreset\": \"stm32h573i_dk\"\n    },\n    {\n      \"name\": \"stm32h723nucleo\",\n      \"description\": \"Build preset for the stm32h723nucleo board\",\n      \"configurePreset\": \"stm32h723nucleo\"\n    },\n    {\n      \"name\": \"stm32h743eval\",\n      \"description\": \"Build preset for the stm32h743eval board\",\n      \"configurePreset\": \"stm32h743eval\"\n    },\n    {\n      \"name\": \"stm32h743nucleo\",\n      \"description\": \"Build preset for the stm32h743nucleo board\",\n      \"configurePreset\": \"stm32h743nucleo\"\n    },\n    {\n      \"name\": \"stm32h745disco\",\n      \"description\": \"Build preset for the stm32h745disco board\",\n      \"configurePreset\": \"stm32h745disco\"\n    },\n    {\n      \"name\": \"stm32h747disco\",\n      \"description\": \"Build preset for the stm32h747disco board\",\n      \"configurePreset\": \"stm32h747disco\"\n    },\n    {\n      \"name\": \"stm32h750_weact\",\n      \"description\": \"Build preset for the stm32h750_weact board\",\n      \"configurePreset\": \"stm32h750_weact\"\n    },\n    {\n      \"name\": \"stm32h750bdk\",\n      \"description\": \"Build preset for the stm32h750bdk board\",\n      \"configurePreset\": \"stm32h750bdk\"\n    },\n    {\n      \"name\": \"stm32h7s3nucleo\",\n      \"description\": \"Build preset for the stm32h7s3nucleo board\",\n      \"configurePreset\": \"stm32h7s3nucleo\"\n    },\n    {\n      \"name\": \"stm32l052dap52\",\n      \"description\": \"Build preset for the stm32l052dap52 board\",\n      \"configurePreset\": \"stm32l052dap52\"\n    },\n    {\n      \"name\": \"stm32l0538disco\",\n      \"description\": \"Build preset for the stm32l0538disco board\",\n      \"configurePreset\": \"stm32l0538disco\"\n    },\n    {\n      \"name\": \"stm32l412nucleo\",\n      \"description\": \"Build preset for the stm32l412nucleo board\",\n      \"configurePreset\": \"stm32l412nucleo\"\n    },\n    {\n      \"name\": \"stm32l476disco\",\n      \"description\": \"Build preset for the stm32l476disco board\",\n      \"configurePreset\": \"stm32l476disco\"\n    },\n    {\n      \"name\": \"stm32l496nucleo\",\n      \"description\": \"Build preset for the stm32l496nucleo board\",\n      \"configurePreset\": \"stm32l496nucleo\"\n    },\n    {\n      \"name\": \"stm32l4p5nucleo\",\n      \"description\": \"Build preset for the stm32l4p5nucleo board\",\n      \"configurePreset\": \"stm32l4p5nucleo\"\n    },\n    {\n      \"name\": \"stm32l4r5nucleo\",\n      \"description\": \"Build preset for the stm32l4r5nucleo board\",\n      \"configurePreset\": \"stm32l4r5nucleo\"\n    },\n    {\n      \"name\": \"stm32n6570dk\",\n      \"description\": \"Build preset for the stm32n6570dk board\",\n      \"configurePreset\": \"stm32n6570dk\"\n    },\n    {\n      \"name\": \"stm32n657nucleo\",\n      \"description\": \"Build preset for the stm32n657nucleo board\",\n      \"configurePreset\": \"stm32n657nucleo\"\n    },\n    {\n      \"name\": \"stm32u083cdk\",\n      \"description\": \"Build preset for the stm32u083cdk board\",\n      \"configurePreset\": \"stm32u083cdk\"\n    },\n    {\n      \"name\": \"stm32u545nucleo\",\n      \"description\": \"Build preset for the stm32u545nucleo board\",\n      \"configurePreset\": \"stm32u545nucleo\"\n    },\n    {\n      \"name\": \"stm32u575eval\",\n      \"description\": \"Build preset for the stm32u575eval board\",\n      \"configurePreset\": \"stm32u575eval\"\n    },\n    {\n      \"name\": \"stm32u575nucleo\",\n      \"description\": \"Build preset for the stm32u575nucleo board\",\n      \"configurePreset\": \"stm32u575nucleo\"\n    },\n    {\n      \"name\": \"stm32u5a5nucleo\",\n      \"description\": \"Build preset for the stm32u5a5nucleo board\",\n      \"configurePreset\": \"stm32u5a5nucleo\"\n    },\n    {\n      \"name\": \"stm32wb55nucleo\",\n      \"description\": \"Build preset for the stm32wb55nucleo board\",\n      \"configurePreset\": \"stm32wb55nucleo\"\n    },\n    {\n      \"name\": \"stm32wba_nucleo\",\n      \"description\": \"Build preset for the stm32wba_nucleo board\",\n      \"configurePreset\": \"stm32wba_nucleo\"\n    },\n    {\n      \"name\": \"teensy_35\",\n      \"description\": \"Build preset for the teensy_35 board\",\n      \"configurePreset\": \"teensy_35\"\n    },\n    {\n      \"name\": \"teensy_40\",\n      \"description\": \"Build preset for the teensy_40 board\",\n      \"configurePreset\": \"teensy_40\"\n    },\n    {\n      \"name\": \"teensy_41\",\n      \"description\": \"Build preset for the teensy_41 board\",\n      \"configurePreset\": \"teensy_41\"\n    },\n    {\n      \"name\": \"trinket_m0\",\n      \"description\": \"Build preset for the trinket_m0 board\",\n      \"configurePreset\": \"trinket_m0\"\n    },\n    {\n      \"name\": \"uno_r4\",\n      \"description\": \"Build preset for the uno_r4 board\",\n      \"configurePreset\": \"uno_r4\"\n    },\n    {\n      \"name\": \"waveshare_openh743i\",\n      \"description\": \"Build preset for the waveshare_openh743i board\",\n      \"configurePreset\": \"waveshare_openh743i\"\n    },\n    {\n      \"name\": \"xmc4500_relax\",\n      \"description\": \"Build preset for the xmc4500_relax board\",\n      \"configurePreset\": \"xmc4500_relax\"\n    },\n    {\n      \"name\": \"xmc4700_relax\",\n      \"description\": \"Build preset for the xmc4700_relax board\",\n      \"configurePreset\": \"xmc4700_relax\"\n    }\n  ],\n  \"workflowPresets\": [\n    {\n      \"name\": \"adafruit_clue\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_clue\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_clue\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_feather_esp32_v2\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_feather_esp32_v2\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_feather_esp32_v2\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_feather_esp32c6\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_feather_esp32c6\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_feather_esp32c6\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_feather_esp32s2\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_feather_esp32s2\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_feather_esp32s2\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_feather_esp32s3\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_feather_esp32s3\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_feather_esp32s3\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_feather_rp2040_usb_host\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_feather_rp2040_usb_host\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_feather_rp2040_usb_host\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_fruit_jam\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_fruit_jam\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_fruit_jam\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_magtag_29gray\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_magtag_29gray\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_magtag_29gray\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_metro_esp32s2\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_metro_esp32s2\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_metro_esp32s2\"\n        }\n      ]\n    },\n    {\n      \"name\": \"adafruit_metro_rp2350\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"adafruit_metro_rp2350\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"adafruit_metro_rp2350\"\n        }\n      ]\n    },\n    {\n      \"name\": \"apard32690\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"apard32690\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"apard32690\"\n        }\n      ]\n    },\n    {\n      \"name\": \"arduino_nano33_ble\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"arduino_nano33_ble\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"arduino_nano33_ble\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at32f403a_weact_blackpill\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at32f403a_weact_blackpill\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at32f403a_weact_blackpill\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f402\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f402\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f402\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f403a\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f403a\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f403a\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f405\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f405\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f405\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f407\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f407\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f407\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f413\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f413\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f413\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f415\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f415\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f415\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f423\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f423\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f423\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f425\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f425\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f425\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f435\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f435\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f435\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f437\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f437\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f437\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f455\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f455\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f455\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f456\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f456\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f456\"\n        }\n      ]\n    },\n    {\n      \"name\": \"at_start_f457\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"at_start_f457\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"at_start_f457\"\n        }\n      ]\n    },\n    {\n      \"name\": \"atsamd21_xpro\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"atsamd21_xpro\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"atsamd21_xpro\"\n        }\n      ]\n    },\n    {\n      \"name\": \"atsaml21_xpro\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"atsaml21_xpro\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"atsaml21_xpro\"\n        }\n      ]\n    },\n    {\n      \"name\": \"b_g474e_dpow1\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"b_g474e_dpow1\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"b_g474e_dpow1\"\n        }\n      ]\n    },\n    {\n      \"name\": \"b_u585i_iot2a\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"b_u585i_iot2a\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"b_u585i_iot2a\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ch32v103r_r1_1v0\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ch32v103r_r1_1v0\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ch32v103r_r1_1v0\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ch32v203c_r0_1v0\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ch32v203c_r0_1v0\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ch32v203c_r0_1v0\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ch32v203g_r0_1v0\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ch32v203g_r0_1v0\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ch32v203g_r0_1v0\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ch32v307v_r1_1v0\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ch32v307v_r1_1v0\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ch32v307v_r1_1v0\"\n        }\n      ]\n    },\n    {\n      \"name\": \"circuitplayground_bluefruit\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"circuitplayground_bluefruit\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"circuitplayground_bluefruit\"\n        }\n      ]\n    },\n    {\n      \"name\": \"circuitplayground_express\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"circuitplayground_express\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"circuitplayground_express\"\n        }\n      ]\n    },\n    {\n      \"name\": \"curiosity_nano\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"curiosity_nano\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"curiosity_nano\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cynthion_d11\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"cynthion_d11\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"cynthion_d11\"\n        }\n      ]\n    },\n    {\n      \"name\": \"cynthion_d21\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"cynthion_d21\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"cynthion_d21\"\n        }\n      ]\n    },\n    {\n      \"name\": \"d5035_01\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"d5035_01\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"d5035_01\"\n        }\n      ]\n    },\n    {\n      \"name\": \"da14695_dk_usb\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"da14695_dk_usb\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"da14695_dk_usb\"\n        }\n      ]\n    },\n    {\n      \"name\": \"da1469x_dk_pro\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"da1469x_dk_pro\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"da1469x_dk_pro\"\n        }\n      ]\n    },\n    {\n      \"name\": \"daisyseed\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"daisyseed\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"daisyseed\"\n        }\n      ]\n    },\n    {\n      \"name\": \"double_m33_express\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"double_m33_express\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"double_m33_express\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ea4088_quickstart\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ea4088_quickstart\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ea4088_quickstart\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ea4357\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ea4357\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ea4357\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ek_tm4c123gxl\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ek_tm4c123gxl\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ek_tm4c123gxl\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ek_tm4c1294xl\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ek_tm4c1294xl\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ek_tm4c1294xl\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_addax_1\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_addax_1\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_addax_1\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_c3_devkitc\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_c3_devkitc\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_c3_devkitc\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_c6_devkitc\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_c6_devkitc\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_c6_devkitc\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_kaluga_1\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_kaluga_1\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_kaluga_1\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_p4_function_ev\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_p4_function_ev\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_p4_function_ev\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_s2_devkitc\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_s2_devkitc\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_s2_devkitc\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_s3_devkitc\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_s3_devkitc\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_s3_devkitc\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_s3_devkitm\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_s3_devkitm\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_s3_devkitm\"\n        }\n      ]\n    },\n    {\n      \"name\": \"espressif_saola_1\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"espressif_saola_1\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"espressif_saola_1\"\n        }\n      ]\n    },\n    {\n      \"name\": \"f1c100s\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"f1c100s\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"f1c100s\"\n        }\n      ]\n    },\n    {\n      \"name\": \"feather_m0_express\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"feather_m0_express\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"feather_m0_express\"\n        }\n      ]\n    },\n    {\n      \"name\": \"feather_m4_express\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"feather_m4_express\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"feather_m4_express\"\n        }\n      ]\n    },\n    {\n      \"name\": \"feather_nrf52840_express\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"feather_nrf52840_express\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"feather_nrf52840_express\"\n        }\n      ]\n    },\n    {\n      \"name\": \"feather_nrf52840_sense\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"feather_nrf52840_sense\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"feather_nrf52840_sense\"\n        }\n      ]\n    },\n    {\n      \"name\": \"feather_rp2040_max3421\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"feather_rp2040_max3421\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"feather_rp2040_max3421\"\n        }\n      ]\n    },\n    {\n      \"name\": \"feather_stm32f405\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"feather_stm32f405\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"feather_stm32f405\"\n        }\n      ]\n    },\n    {\n      \"name\": \"fomu\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"fomu\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"fomu\"\n        }\n      ]\n    },\n    {\n      \"name\": \"frdm_k32l2a4s\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"frdm_k32l2a4s\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"frdm_k32l2a4s\"\n        }\n      ]\n    },\n    {\n      \"name\": \"frdm_k32l2b\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"frdm_k32l2b\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"frdm_k32l2b\"\n        }\n      ]\n    },\n    {\n      \"name\": \"frdm_k64f\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"frdm_k64f\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"frdm_k64f\"\n        }\n      ]\n    },\n    {\n      \"name\": \"frdm_kl25z\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"frdm_kl25z\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"frdm_kl25z\"\n        }\n      ]\n    },\n    {\n      \"name\": \"frdm_mcxa153\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"frdm_mcxa153\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"frdm_mcxa153\"\n        }\n      ]\n    },\n    {\n      \"name\": \"frdm_mcxa156\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"frdm_mcxa156\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"frdm_mcxa156\"\n        }\n      ]\n    },\n    {\n      \"name\": \"frdm_mcxn947\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"frdm_mcxn947\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"frdm_mcxn947\"\n        }\n      ]\n    },\n    {\n      \"name\": \"frdm_rw612\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"frdm_rw612\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"frdm_rw612\"\n        }\n      ]\n    },\n    {\n      \"name\": \"hpm6750evk2\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"hpm6750evk2\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"hpm6750evk2\"\n        }\n      ]\n    },\n    {\n      \"name\": \"itsybitsy_m0\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"itsybitsy_m0\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"itsybitsy_m0\"\n        }\n      ]\n    },\n    {\n      \"name\": \"itsybitsy_m4\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"itsybitsy_m4\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"itsybitsy_m4\"\n        }\n      ]\n    },\n    {\n      \"name\": \"itsybitsy_nrf52840\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"itsybitsy_nrf52840\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"itsybitsy_nrf52840\"\n        }\n      ]\n    },\n    {\n      \"name\": \"kuiic\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"kuiic\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"kuiic\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso11u37\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso11u37\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso11u37\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso11u68\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso11u68\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso11u68\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso1347\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso1347\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso1347\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso1549\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso1549\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso1549\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso1769\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso1769\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso1769\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso18s37\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso18s37\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso18s37\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso43s67\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso43s67\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso43s67\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso51u68\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso51u68\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso51u68\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso54114\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso54114\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso54114\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso54608\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso54608\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso54608\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso54628\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso54628\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso54628\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso55s28\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso55s28\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso55s28\"\n        }\n      ]\n    },\n    {\n      \"name\": \"lpcxpresso55s69\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"lpcxpresso55s69\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"lpcxpresso55s69\"\n        }\n      ]\n    },\n    {\n      \"name\": \"max32650evkit\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"max32650evkit\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"max32650evkit\"\n        }\n      ]\n    },\n    {\n      \"name\": \"max32650fthr\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"max32650fthr\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"max32650fthr\"\n        }\n      ]\n    },\n    {\n      \"name\": \"max32651evkit\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"max32651evkit\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"max32651evkit\"\n        }\n      ]\n    },\n    {\n      \"name\": \"max32666evkit\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"max32666evkit\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"max32666evkit\"\n        }\n      ]\n    },\n    {\n      \"name\": \"max32666fthr\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"max32666fthr\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"max32666fthr\"\n        }\n      ]\n    },\n    {\n      \"name\": \"max32690evkit\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"max32690evkit\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"max32690evkit\"\n        }\n      ]\n    },\n    {\n      \"name\": \"max78002evkit\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"max78002evkit\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"max78002evkit\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mbed1768\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mbed1768\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mbed1768\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mcb1800\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mcb1800\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mcb1800\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mcu_link\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mcu_link\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mcu_link\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mcxn947brk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mcxn947brk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mcxn947brk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"metro_m0_express\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"metro_m0_express\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"metro_m0_express\"\n        }\n      ]\n    },\n    {\n      \"name\": \"metro_m4_express\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"metro_m4_express\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"metro_m4_express\"\n        }\n      ]\n    },\n    {\n      \"name\": \"metro_m7_1011\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"metro_m7_1011\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"metro_m7_1011\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mimxrt1010_evk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mimxrt1010_evk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mimxrt1010_evk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mimxrt1015_evk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mimxrt1015_evk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mimxrt1015_evk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mimxrt1020_evk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mimxrt1020_evk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mimxrt1020_evk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mimxrt1024_evk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mimxrt1024_evk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mimxrt1024_evk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mimxrt1050_evkb\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mimxrt1050_evkb\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mimxrt1050_evkb\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mimxrt1060_evk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mimxrt1060_evk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mimxrt1060_evk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mimxrt1064_evk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mimxrt1064_evk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mimxrt1064_evk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mimxrt1170_evkb\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mimxrt1170_evkb\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mimxrt1170_evkb\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mm32f327x_mb39\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mm32f327x_mb39\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mm32f327x_mb39\"\n        }\n      ]\n    },\n    {\n      \"name\": \"mm32f327x_pitaya_lite\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"mm32f327x_pitaya_lite\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"mm32f327x_pitaya_lite\"\n        }\n      ]\n    },\n    {\n      \"name\": \"msp_exp430f5529lp\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"msp_exp430f5529lp\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"msp_exp430f5529lp\"\n        }\n      ]\n    },\n    {\n      \"name\": \"msp_exp432e401y\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"msp_exp432e401y\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"msp_exp432e401y\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nanoch32v203\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nanoch32v203\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nanoch32v203\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nanoch32v305\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nanoch32v305\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nanoch32v305\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nrf52833dk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nrf52833dk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nrf52833dk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nrf52840dk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nrf52840dk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nrf52840dk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nrf52840dongle\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nrf52840dongle\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nrf52840dongle\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nrf5340dk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nrf5340dk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nrf5340dk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nrf54h20dk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nrf54h20dk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nrf54h20dk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nutiny_nuc126v\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nutiny_nuc126v\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nutiny_nuc126v\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc120\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nutiny_sdk_nuc120\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nutiny_sdk_nuc120\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc121\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nutiny_sdk_nuc121\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nutiny_sdk_nuc121\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc125\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nutiny_sdk_nuc125\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nutiny_sdk_nuc125\"\n        }\n      ]\n    },\n    {\n      \"name\": \"nutiny_sdk_nuc505\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"nutiny_sdk_nuc505\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"nutiny_sdk_nuc505\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pico_sdk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"pico_sdk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"pico_sdk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"portenta_c33\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"portenta_c33\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"portenta_c33\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pybadge\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"pybadge\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"pybadge\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pyboardv11\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"pyboardv11\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"pyboardv11\"\n        }\n      ]\n    },\n    {\n      \"name\": \"pyportal\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"pyportal\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"pyportal\"\n        }\n      ]\n    },\n    {\n      \"name\": \"qtpy\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"qtpy\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"qtpy\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ra2a1_ek\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ra2a1_ek\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ra2a1_ek\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ra4m1_ek\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ra4m1_ek\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ra4m1_ek\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ra4m3_ek\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ra4m3_ek\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ra4m3_ek\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ra6m1_ek\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ra6m1_ek\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ra6m1_ek\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ra6m5_ek\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ra6m5_ek\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ra6m5_ek\"\n        }\n      ]\n    },\n    {\n      \"name\": \"ra8m1_ek\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"ra8m1_ek\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"ra8m1_ek\"\n        }\n      ]\n    },\n    {\n      \"name\": \"raspberry_pi_pico\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"raspberry_pi_pico\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"raspberry_pi_pico\"\n        }\n      ]\n    },\n    {\n      \"name\": \"raspberry_pi_pico2\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"raspberry_pi_pico2\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"raspberry_pi_pico2\"\n        }\n      ]\n    },\n    {\n      \"name\": \"raspberry_pi_pico_w\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"raspberry_pi_pico_w\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"raspberry_pi_pico_w\"\n        }\n      ]\n    },\n    {\n      \"name\": \"raspberrypi_cm4\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"raspberrypi_cm4\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"raspberrypi_cm4\"\n        }\n      ]\n    },\n    {\n      \"name\": \"raspberrypi_zero\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"raspberrypi_zero\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"raspberrypi_zero\"\n        }\n      ]\n    },\n    {\n      \"name\": \"raspberrypi_zero2\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"raspberrypi_zero2\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"raspberrypi_zero2\"\n        }\n      ]\n    },\n    {\n      \"name\": \"samd11_xplained\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"samd11_xplained\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"samd11_xplained\"\n        }\n      ]\n    },\n    {\n      \"name\": \"same54_xplained\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"same54_xplained\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"same54_xplained\"\n        }\n      ]\n    },\n    {\n      \"name\": \"same70_qmtech\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"same70_qmtech\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"same70_qmtech\"\n        }\n      ]\n    },\n    {\n      \"name\": \"same70_xplained\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"same70_xplained\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"same70_xplained\"\n        }\n      ]\n    },\n    {\n      \"name\": \"samg55_xplained\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"samg55_xplained\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"samg55_xplained\"\n        }\n      ]\n    },\n    {\n      \"name\": \"saml22_feather\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"saml22_feather\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"saml22_feather\"\n        }\n      ]\n    },\n    {\n      \"name\": \"seeeduino_xiao\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"seeeduino_xiao\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"seeeduino_xiao\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sensorwatch_m0\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"sensorwatch_m0\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"sensorwatch_m0\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sipeed_longan_nano\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"sipeed_longan_nano\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"sipeed_longan_nano\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sltb009a\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"sltb009a\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"sltb009a\"\n        }\n      ]\n    },\n    {\n      \"name\": \"sparkfun_samd21_mini_usb\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"sparkfun_samd21_mini_usb\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"sparkfun_samd21_mini_usb\"\n        }\n      ]\n    },\n    {\n      \"name\": \"spresense\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"spresense\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"spresense\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stlinkv3mini\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stlinkv3mini\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stlinkv3mini\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32c071nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32c071nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32c071nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f070rbnucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f070rbnucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f070rbnucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f072disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f072disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f072disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f072eval\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f072eval\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f072eval\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f103_bluepill\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f103_bluepill\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f103_bluepill\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f103_mini_2\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f103_mini_2\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f103_mini_2\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f103ze_iar\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f103ze_iar\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f103ze_iar\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f207nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f207nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f207nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f303disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f303disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f303disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f401blackpill\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f401blackpill\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f401blackpill\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f407blackvet\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f407blackvet\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f407blackvet\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f407disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f407disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f407disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f411blackpill\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f411blackpill\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f411blackpill\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f411disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f411disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f411disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f412disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f412disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f412disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f412nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f412nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f412nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f439nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f439nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f439nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f723disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f723disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f723disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f746disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f746disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f746disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f746nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f746nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f746nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f767nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f767nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f767nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32f769disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32f769disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32f769disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32g0b1nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32g0b1nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32g0b1nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32g474nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32g474nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32g474nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32g491nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32g491nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32g491nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h503nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h503nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h503nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h563nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h563nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h563nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h573i_dk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h573i_dk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h573i_dk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h723nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h723nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h723nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h743eval\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h743eval\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h743eval\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h743nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h743nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h743nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h745disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h745disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h745disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h747disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h747disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h747disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h750_weact\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h750_weact\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h750_weact\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h750bdk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h750bdk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h750bdk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32h7s3nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32h7s3nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32h7s3nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32l052dap52\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32l052dap52\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32l052dap52\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32l0538disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32l0538disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32l0538disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32l412nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32l412nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32l412nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32l476disco\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32l476disco\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32l476disco\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32l496nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32l496nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32l496nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32l4p5nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32l4p5nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32l4p5nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32l4r5nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32l4r5nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32l4r5nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32n6570dk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32n6570dk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32n6570dk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32n657nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32n657nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32n657nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32u083cdk\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32u083cdk\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32u083cdk\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32u545nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32u545nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32u545nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32u575eval\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32u575eval\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32u575eval\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32u575nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32u575nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32u575nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32u5a5nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32u5a5nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32u5a5nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32wb55nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32wb55nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32wb55nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"stm32wba_nucleo\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"stm32wba_nucleo\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"stm32wba_nucleo\"\n        }\n      ]\n    },\n    {\n      \"name\": \"teensy_35\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"teensy_35\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"teensy_35\"\n        }\n      ]\n    },\n    {\n      \"name\": \"teensy_40\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"teensy_40\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"teensy_40\"\n        }\n      ]\n    },\n    {\n      \"name\": \"teensy_41\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"teensy_41\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"teensy_41\"\n        }\n      ]\n    },\n    {\n      \"name\": \"trinket_m0\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"trinket_m0\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"trinket_m0\"\n        }\n      ]\n    },\n    {\n      \"name\": \"uno_r4\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"uno_r4\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"uno_r4\"\n        }\n      ]\n    },\n    {\n      \"name\": \"waveshare_openh743i\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"waveshare_openh743i\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"waveshare_openh743i\"\n        }\n      ]\n    },\n    {\n      \"name\": \"xmc4500_relax\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"xmc4500_relax\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"xmc4500_relax\"\n        }\n      ]\n    },\n    {\n      \"name\": \"xmc4700_relax\",\n      \"steps\": [\n        {\n          \"type\": \"configure\",\n          \"name\": \"xmc4700_relax\"\n        },\n        {\n          \"type\": \"build\",\n          \"name\": \"xmc4700_relax\"\n        }\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "hw/bsp/ansi_escape.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/** \\ingroup group_board\n *  \\defgroup group_ansi_esc ANSI Escape Code\n *  @{ */\n\n#ifndef TUSB_ANSI_ESC_CODE_H_\n#define TUSB_ANSI_ESC_CODE_H_\n\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define CSI_CODE(seq)   \"\\33[\" seq\n#define CSI_SGR(x)      CSI_CODE(#x) \"m\"\n\n//------------- Cursor movement -------------//\n/** \\defgroup group_ansi_cursor Cursor Movement\n *  @{ */\n#define ANSI_CURSOR_UP(n)        CSI_CODE(#n \"A\")          ///< Move cursor up\n#define ANSI_CURSOR_DOWN(n)      CSI_CODE(#n \"B\")          ///< Move cursor down\n#define ANSI_CURSOR_FORWARD(n)   CSI_CODE(#n \"C\")          ///< Move cursor forward\n#define ANSI_CURSOR_BACKWARD(n)  CSI_CODE(#n \"D\")          ///< Move cursor backward\n#define ANSI_CURSOR_LINE_DOWN(n) CSI_CODE(#n \"E\")          ///< Move cursor to the beginning of the line (n) down\n#define ANSI_CURSOR_LINE_UP(n)   CSI_CODE(#n \"F\")          ///< Move cursor to the beginning of the line (n) up\n#define ANSI_CURSOR_POSITION(n, m) CSI_CODE(#n \";\" #m \"H\") ///< Move cursor to position (n, m)\n/** @} */\n\n//------------- Screen -------------//\n/** \\defgroup group_ansi_screen Screen Control\n *  @{ */\n#define ANSI_ERASE_SCREEN(n)     CSI_CODE(#n \"J\") ///< Erase the screen\n#define ANSI_ERASE_LINE(n)       CSI_CODE(#n \"K\") ///< Erase the line (n)\n#define ANSI_SCROLL_UP(n)        CSI_CODE(#n \"S\") ///< Scroll the whole page up (n) lines\n#define ANSI_SCROLL_DOWN(n)      CSI_CODE(#n \"T\") ///< Scroll the whole page down (n) lines\n/** @} */\n\n//------------- Text Color -------------//\n/** \\defgroup group_ansi_text Text Color\n *  @{ */\n#define ANSI_TEXT_BLACK          CSI_SGR(30)\n#define ANSI_TEXT_RED            CSI_SGR(31)\n#define ANSI_TEXT_GREEN          CSI_SGR(32)\n#define ANSI_TEXT_YELLOW         CSI_SGR(33)\n#define ANSI_TEXT_BLUE           CSI_SGR(34)\n#define ANSI_TEXT_MAGENTA        CSI_SGR(35)\n#define ANSI_TEXT_CYAN           CSI_SGR(36)\n#define ANSI_TEXT_WHITE          CSI_SGR(37)\n#define ANSI_TEXT_DEFAULT        CSI_SGR(39)\n/** @} */\n\n//------------- Background Color -------------//\n/** \\defgroup group_ansi_background Background Color\n *  @{ */\n#define ANSI_BG_BLACK            CSI_SGR(40)\n#define ANSI_BG_RED              CSI_SGR(41)\n#define ANSI_BG_GREEN            CSI_SGR(42)\n#define ANSI_BG_YELLOW           CSI_SGR(43)\n#define ANSI_BG_BLUE             CSI_SGR(44)\n#define ANSI_BG_MAGENTA          CSI_SGR(45)\n#define ANSI_BG_CYAN             CSI_SGR(46)\n#define ANSI_BG_WHITE            CSI_SGR(47)\n#define ANSI_BG_DEFAULT          CSI_SGR(49)\n/** @} */\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_ANSI_ESC_CODE_H_ */\n\n/** @} */\n"
  },
  {
    "path": "hw/bsp/at32f402_405/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// Include MCU header\n  #include \"at32f402_405.h\"\n\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        1\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/at32f402_405/at32f402_405_clock.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f402_405_clock.c\n  * @brief    system clock config program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f402_405_clock.h\"\n\n/**\n  * @brief  system clock config program\n  * @note   the system clock is configured as follow:\n  *         system clock (sclk)   = (hext * pll_ns)/(pll_ms * pll_fp)\n  *         system clock source   = pll (hext)\n  *         - hext                = HEXT_VALUE\n  *         - sclk                = 216000000\n  *         - ahbdiv              = 1\n  *         - ahbclk              = 216000000\n  *         - apb2div             = 1\n  *         - apb2clk             = 216000000\n  *         - apb1div             = 2\n  *         - apb1clk             = 108000000\n  *         - pll_ns              = 72\n  *         - pll_ms              = 1\n  *         - pll_fr              = 4\n  *         - flash_wtcyc         = 6 cycle\n  * @param  none\n  * @retval none\n  */\nvoid system_clock_config(void)\n{\n  /* reset crm */\n  crm_reset();\n\n  /* config flash psr register */\n  flash_psr_set(FLASH_WAIT_CYCLE_6);\n\n  /* enable pwc periph clock */\n  crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);\n\n  /* set power ldo output voltage to 1.3v */\n  pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V3);\n\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);\n\n  /* wait till hext is ready */\n  while(crm_hext_stable_wait() == ERROR)\n  {\n  }\n\n  /* if pll parameter has changed, please use the AT32_New_Clock_Configuration tool for new configuration. */\n  crm_pll_config(CRM_PLL_SOURCE_HEXT, 72, 1, CRM_PLL_FP_4);\n\n  /* config pllu div */\n  crm_pllu_div_set(CRM_PLL_FU_18);\n\n  /* enable pll */\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);\n\n  /* wait till pll is ready */\n  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)\n  {\n  }\n\n  /* config ahbclk */\n  crm_ahb_div_set(CRM_AHB_DIV_1);\n\n  /* config apb2clk, the maximum frequency of APB2 clock is 216 MHz */\n  crm_apb2_div_set(CRM_APB2_DIV_1);\n\n  /* config apb1clk, the maximum frequency of APB1 clock is 120 MHz */\n  crm_apb1_div_set(CRM_APB1_DIV_2);\n\n  /* enable auto step mode */\n  crm_auto_step_mode_enable(TRUE);\n\n  /* select pll as system clock source */\n  crm_sysclk_switch(CRM_SCLK_PLL);\n\n  /* wait till pll is used as system clock source */\n  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)\n  {\n  }\n\n  /* disable auto step mode */\n  crm_auto_step_mode_enable(FALSE);\n\n  /* update system_core_clock global variable */\n  system_core_clock_update();\n\n#ifdef AT32F405xx\n  /*\n    AT32405 OTGHS PHY not initialized, resulting in high power consumption\n    Solutions:\n    1. If OTGHS is not used, call the \"reduce_power_consumption\" function to reduce power consumption.\n       PLL or HEXT should be enabled when calling this function.\n       Example: reduce_power_consumption();\n\n    2. If OTGHS is required, initialize OTGHS to reduce power consumption, without the need to call this function.\n\n       for more detailed information. please refer to the faq document FAQ0148.\n  */\n#endif\n\n#ifdef AT32F402xx\n  /* reduce power consumption */\n  reduce_power_consumption();\n#endif\n}\n"
  },
  {
    "path": "hw/bsp/at32f402_405/at32f402_405_clock.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f402_405_clock.h\n  * @brief    header file of clock program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F402_405_CLOCK_H\n#define __AT32F402_405_CLOCK_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f402_405.h\"\n\n/* exported functions ------------------------------------------------------- */\nvoid system_clock_config(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f402_405/at32f402_405_conf.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f402_405_conf.h\n  * @brief    at32f402_405 config header file\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F402_405_CONF_H\n#define __AT32F402_405_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n  * @brief in the following line adjust the value of high speed external crystal (hext)\n  * used in your application\n  *\n  * tip: to avoid modifying this file each time you need to use different hext, you\n  *      can define the hext value in your toolchain compiler preprocessor.\n  *\n  */\n#if !defined  HEXT_VALUE\n#define HEXT_VALUE                       ((uint32_t)12000000) /*!< value of the high speed external crystal in hz */\n#endif\n\n/**\n  * @brief in the following line adjust the high speed external crystal (hext) startup\n  * timeout value\n  */\n#define HEXT_STARTUP_TIMEOUT             ((uint16_t)0x3000)  /*!< time out for hext start up */\n#define HICK_VALUE                       ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */\n#define LEXT_VALUE                       ((uint32_t)32768)   /*!< value of the low speed external clock in hz */\n\n#define SystemCoreClock                  system_core_clock\n\n/* module define -------------------------------------------------------------*/\n#define ACC_MODULE_ENABLED\n#define ADC_MODULE_ENABLED\n#define CAN_MODULE_ENABLED\n#define CRC_MODULE_ENABLED\n#define CRM_MODULE_ENABLED\n#define DEBUG_MODULE_ENABLED\n#define DMA_MODULE_ENABLED\n#define ERTC_MODULE_ENABLED\n#define EXINT_MODULE_ENABLED\n#define FLASH_MODULE_ENABLED\n#define GPIO_MODULE_ENABLED\n#define I2C_MODULE_ENABLED\n#define MISC_MODULE_ENABLED\n#define PWC_MODULE_ENABLED\n#define QSPI_MODULE_ENABLED\n#define SCFG_MODULE_ENABLED\n#define SPI_MODULE_ENABLED\n#define TMR_MODULE_ENABLED\n#define USART_MODULE_ENABLED\n#define USB_MODULE_ENABLED\n#define WDT_MODULE_ENABLED\n#define WWDT_MODULE_ENABLED\n\n/* includes ------------------------------------------------------------------*/\n#ifdef ACC_MODULE_ENABLED\n#include \"at32f402_405_acc.h\"\n#endif\n#ifdef ADC_MODULE_ENABLED\n#include \"at32f402_405_adc.h\"\n#endif\n#ifdef CAN_MODULE_ENABLED\n#include \"at32f402_405_can.h\"\n#endif\n#ifdef CRC_MODULE_ENABLED\n#include \"at32f402_405_crc.h\"\n#endif\n#ifdef CRM_MODULE_ENABLED\n#include \"at32f402_405_crm.h\"\n#endif\n#ifdef DEBUG_MODULE_ENABLED\n#include \"at32f402_405_debug.h\"\n#endif\n#ifdef DMA_MODULE_ENABLED\n#include \"at32f402_405_dma.h\"\n#endif\n#ifdef ERTC_MODULE_ENABLED\n#include \"at32f402_405_ertc.h\"\n#endif\n#ifdef EXINT_MODULE_ENABLED\n#include \"at32f402_405_exint.h\"\n#endif\n#ifdef FLASH_MODULE_ENABLED\n#include \"at32f402_405_flash.h\"\n#endif\n#ifdef GPIO_MODULE_ENABLED\n#include \"at32f402_405_gpio.h\"\n#endif\n#ifdef I2C_MODULE_ENABLED\n#include \"at32f402_405_i2c.h\"\n#endif\n#ifdef MISC_MODULE_ENABLED\n#include \"at32f402_405_misc.h\"\n#endif\n#ifdef PWC_MODULE_ENABLED\n#include \"at32f402_405_pwc.h\"\n#endif\n#ifdef QSPI_MODULE_ENABLED\n#include \"at32f402_405_qspi.h\"\n#endif\n#ifdef SCFG_MODULE_ENABLED\n#include \"at32f402_405_scfg.h\"\n#endif\n#ifdef SPI_MODULE_ENABLED\n#include \"at32f402_405_spi.h\"\n#endif\n#ifdef TMR_MODULE_ENABLED\n#include \"at32f402_405_tmr.h\"\n#endif\n#ifdef USART_MODULE_ENABLED\n#include \"at32f402_405_usart.h\"\n#endif\n#ifdef USB_MODULE_ENABLED\n#include \"at32f402_405_usb.h\"\n#endif\n#ifdef WDT_MODULE_ENABLED\n#include \"at32f402_405_wdt.h\"\n#endif\n#ifdef WWDT_MODULE_ENABLED\n#include \"at32f402_405_wwdt.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f402_405/at32f402_405_int.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f402_405_int.c\n  * @brief    main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f402_405_int.h\"\n\n/** @addtogroup AT32F405_periph_examples\n  * @{\n  */\n\n/** @addtogroup 405_USB_device_msc\n  * @{\n  */\n\n/**\n  * @brief  this function handles nmi exception.\n  * @param  none\n  * @retval none\n  */\nvoid NMI_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles hard fault exception.\n  * @param  none\n  * @retval none\n  */\n// void HardFault_Handler(void)\n// {\n//   /* go to infinite loop when hard fault exception occurs */\n//   while(1)\n//   {\n//   }\n// }\n\n/**\n  * @brief  this function handles memory manage exception.\n  * @param  none\n  * @retval none\n  */\nvoid MemManage_Handler(void)\n{\n  /* go to infinite loop when memory manage exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles bus fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid BusFault_Handler(void)\n{\n  /* go to infinite loop when bus fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles usage fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid UsageFault_Handler(void)\n{\n  /* go to infinite loop when usage fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles svcall exception.\n  * @param  none\n  * @retval none\n  */\n// void SVC_Handler(void)\n// {\n// }\n\n/**\n  * @brief  this function handles debug monitor exception.\n  * @param  none\n  * @retval none\n  */\nvoid DebugMon_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles pendsv_handler exception.\n  * @param  none\n  * @retval none\n  */\n// void PendSV_Handler(void)\n// {\n// }\n\n/**\n  * @brief  this function handles systick handler.\n  * @param  none\n  * @retval none\n  */\n// void SysTick_Handler(void)\n// {\n// }\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f402_405/at32f402_405_int.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f402_405_int.h\n  * @brief    header file of main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F402_405_INT_H\n#define __AT32F402_405_INT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f402_405.h\"\n\n/* exported types ------------------------------------------------------------*/\n/* exported constants --------------------------------------------------------*/\n/* exported macro ------------------------------------------------------------*/\n/* exported functions ------------------------------------------------------- */\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid SVC_Handler(void);\nvoid DebugMon_Handler(void);\nvoid PendSV_Handler(void);\nvoid SysTick_Handler(void);\n\nvoid OTGFS1_IRQHandler(void);\nvoid OTGHS_IRQHandler(void);\nvoid OTGFS1_WKUP_IRQHandler(void);\nvoid OTGHS_WKUP_IRQHandler(void);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f402_405/boards/at_start_f402/board.cmake",
    "content": "set(MCU_VARIANT AT32F402RCT7)\nset(MCU_LINKER_NAME AT32F402xC)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f402_405/boards/at_start_f402/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F402\n   url: https://www.arterychip.com/en/product/AT32F402.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define USB_VBUS_IGNORE\n//#define USB_SOF_OUTPUT_ENABLE\n\n// LED\n#define LED_PORT              GPIOF\n#define LED_PIN               GPIO_PINS_4\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOF_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n//USART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_7\n\n//Vbus\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n    *(int*)(0x40040038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f402_405/boards/at_start_f402/board.mk",
    "content": "MCU_VARIANT = AT32F402RCT7\nMCU_LINKER_NAME = AT32F402xC\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f402_405/boards/at_start_f405/board.cmake",
    "content": "set(MCU_VARIANT AT32F405RCT7)\nset(MCU_LINKER_NAME AT32F405xC)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f402_405/boards/at_start_f405/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F405\n   url: https://www.arterychip.com/en/product/AT32F405.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define USB_VBUS_IGNORE\n//#define USB_SOF_OUTPUT_ENABLE\n\n// LED\n#define LED_PORT              GPIOF\n#define LED_PIN               GPIO_PINS_4\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOF_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n//USART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_7\n\n//Vbus\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n    *(int*)(0x40040038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f402_405/boards/at_start_f405/board.mk",
    "content": "MCU_VARIANT = AT32F405RCT7\nMCU_LINKER_NAME = AT32F405xC\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nRHPORT_SPEED = OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f402_405/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Artery\n*/\n\n#include \"at32f402_405_clock.h\"\n#include \"at32f402_405_int.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\nvoid uart_print_init(uint32_t baudrate);\nvoid usb_clock48m_select(usb_clk48_s clk_s);\nvoid led_and_botton_init(void);\nvoid usb_gpio_config(void);\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTGFS1_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\nvoid OTGHS_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\nvoid OTGFS1_WKUP_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\nvoid OTGHS_WKUP_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\nvoid board_init(void)\n{\n  /* config nvic priority group */\n  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);\n\n  /* config system clock */\n  system_clock_config();\n\n  /* config usb io*/\n  //usb_gpio_config();\n\n  /* enable usb clock */\n  crm_periph_clock_enable(CRM_OTGFS1_PERIPH_CLOCK, TRUE);\n  crm_periph_clock_enable(CRM_OTGHS_PERIPH_CLOCK, TRUE);\n\n  /* select usb 48m clcok source */\n  usb_clock48m_select(USB_CLK_HEXT);\n\n  /* vbus ignore */\n  board_vbus_sense_init();\n\n  #if CFG_TUSB_OS == OPT_OS_NONE\n    /* configure systick */\n    SysTick_Config(system_core_clock / 1000);\n    NVIC_SetPriority(OTGHS_IRQn, 0);\n    NVIC_SetPriority(OTGFS1_IRQn, 0);\n  #elif CFG_TUSB_OS == OPT_OS_FREERTOS\n    // Explicitly disable systick to prevent its ISR from running before scheduler start\n    SysTick->CTRL &= ~1U;\n    // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n    NVIC_SetPriority(OTGHS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n    NVIC_SetPriority(OTGFS1_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #endif\n\n  /* config led and key */\n  led_and_botton_init();\n\n  /* config usart to printf */\n  uart_print_init(115200);\n  // printf(\"usart printf config success!\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\nvoid led_and_botton_init(void)\n{\n  /* LED */\n  gpio_init_type gpio_led_init_struct;\n  /* enable the led clock */\n  LED_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_led_init_struct);\n  /* configure the led gpio */\n  gpio_led_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_led_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;\n  gpio_led_init_struct.gpio_mode = GPIO_MODE_OUTPUT;\n  gpio_led_init_struct.gpio_pins = LED_PIN | GPIO_PINS_5 | GPIO_PINS_6;\n  gpio_led_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(LED_PORT, &gpio_led_init_struct);\n  gpio_bits_set(LED_PORT, GPIO_PINS_5);\n  gpio_bits_set(LED_PORT, GPIO_PINS_6);\n  /* Button */\n  gpio_init_type gpio_button_init_struct;\n  /* enable the button clock */\n  BUTTON_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_button_init_struct);\n  /* configure the button gpio */\n  gpio_button_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_button_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_button_init_struct.gpio_mode = GPIO_MODE_INPUT;\n  gpio_button_init_struct.gpio_pins = BUTTON_PIN;\n  gpio_button_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_init(BUTTON_PORT, &gpio_button_init_struct);\n}\n\n/**\n  * @brief  usb 48M clock select\n  * @param  clk_s:USB_CLK_HICK, USB_CLK_HEXT\n  * @retval none\n  */\nvoid usb_clock48m_select(usb_clk48_s clk_s)\n{\n  if(clk_s == USB_CLK_HICK)\n  {\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);\n    /* enable the acc calibration ready interrupt */\n    crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);\n    /* update the c1\\c2\\c3 value */\n    acc_write_c1(7980);\n    acc_write_c2(8000);\n    acc_write_c3(8020);\n    /* open acc calibration */\n    acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);\n  }\n  else\n  {\n    crm_pllu_output_set(TRUE);\n    /* wait till pll is ready */\n    while(crm_flag_get(CRM_PLLU_STABLE_FLAG) != SET){}\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_PLLU);\n  }\n}\n\nvoid usb_gpio_config(void)\n{\n  /* When the USB clock is enabled, the hardware will automatically\n  configure the pins; but other special pins that need to be used,\n  such as the pins used to detect VBUS or the pins that output the\n  SOF signal, still need to be configured separately, and these pins\n  are usually not required */\n}\n\n/**\n  * @brief  initialize uart\n  * @param  baudrate: uart baudrate\n  * @retval none\n  */\nvoid uart_print_init(uint32_t baudrate)\n{\n  gpio_init_type gpio_init_struct;\n  /* enable the uart and gpio clock */\n  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);\n  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  /* configure the uart tx pin */\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);\n  gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);\n  /* configure uart param */\n  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);\n  usart_transmitter_enable(PRINT_UART, TRUE);\n  usart_enable(PRINT_UART, TRUE);\n}\n\n// Get characters from UART. Return number of read bytes\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n// Send characters to UART. Return number of sent bytes\nint board_uart_write(void const *buf, int len)\n{\n  #if CFG_TUSB_OS == OPT_OS_NONE\n    int txsize = len;\n    u16 timeout = 0xffff;\n    while (txsize--)\n    {\n      while(usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET)\n      {\n        timeout--;\n        if(timeout == 0)\n        {\n          return 0;\n        }\n      }\n      PRINT_UART->dt = (*((uint8_t const *)buf) & 0x01FF);\n      buf++;\n    }\n    return len;\n  #else\n    (void) buf;\n    (void) len;\n    return 0;\n  #endif\n}\n\nvoid board_led_write(bool state)\n{\n  gpio_bits_write(LED_PORT, LED_PIN, state ^ (!LED_STATE_ON));\n}\n\nuint32_t board_button_read(void)\n{\n  return gpio_input_data_bit_read(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len)\n{\n  (void) max_len;\n  volatile uint32_t * at32_uuid = ((volatile uint32_t*)0x1FFFF7E8);\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = at32_uuid[0];\n  id32[1] = at32_uuid[1];\n  id32[2] = at32_uuid[2];\n\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  volatile uint32_t system_ticks = 0;\n  void SysTick_Handler(void)\n  {\n    system_ticks++;\n  }\n  uint32_t tusb_time_millis_api(void)\n  {\n    return system_ticks;\n  }\n  void SVC_Handler(void)\n  {\n  }\n  void PendSV_Handler(void)\n  {\n  }\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n\n#ifdef  USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line)\n{\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/at32f402_405/family.cmake",
    "content": "include_guard()\n\nset(AT32_FAMILY at32f402_405)\nset(AT32_SDK_LIB ${TOP}/hw/mcu/artery/${AT32_FAMILY}/libraries)\n\nstring(TOUPPER ${AT32_FAMILY} AT32_FAMILY_UPPER)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS ${AT32_FAMILY_UPPER} CACHE INTERNAL \"\")\n\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif ()\n\nif (NOT DEFINED RHPORT_SPEED)\n  set(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_FULL_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_gpio.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_misc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_usart.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_acc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_crm.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${AT32_SDK_LIB}/cmsis/cm4/core_support\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support\n    ${AT32_SDK_LIB}/drivers/inc\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${AT32_FAMILY_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_clock.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_int.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f402_405/family.mk",
    "content": "AT32_FAMILY = at32f402_405\nAT32_SDK_LIB = hw/mcu/artery/${AT32_FAMILY}/libraries\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4\n\nCFLAGS_GCC += \\\n  -flto\n\nRHPORT_SPEED ?= OPT_MODE_FULL_SPEED OPT_MODE_FULL_SPEED\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 0\n\nifndef RHPORT_DEVICE_SPEED\nifeq ($(RHPORT_DEVICE), 0)\n  RHPORT_DEVICE_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_DEVICE_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\nifndef RHPORT_HOST_SPEED\nifeq ($(RHPORT_HOST), 0)\n  RHPORT_HOST_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_HOST_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\nCFLAGS += \\\n    -DCFG_TUSB_MCU=OPT_MCU_AT32F402_405 \\\n\t-DBOARD_TUD_RHPORT=${RHPORT_DEVICE} \\\n\t-DBOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED} \\\n\t-DBOARD_TUH_RHPORT=${RHPORT_HOST} \\\n\t-DBOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED} \\\n\nLDFLAGS_GCC += \\\n\t-flto --specs=nosys.specs -nostdlib -nostartfiles\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_gpio.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_misc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_usart.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_crm.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_acc.c \\\n\t$(AT32_SDK_LIB)/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(AT32_SDK_LIB)/drivers/inc \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/core_support \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/device_support\n\nSRC_S_GCC += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s\nSRC_S_IAR += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s\n\nLD_FILE_GCC ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld\nLD_FILE_IAR ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM4F\n\nflash: flash-atlink\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// Include MCU header\n  #include \"at32f403a_407.h\"\n\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        1\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/at32f403a_407_clock.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f403a_407_clock.c\n  * @brief    system clock config program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f403a_407_clock.h\"\n\n/**\n  * @brief  system clock config program\n  * @note   the system clock is configured as follow:\n  *         - system clock        = hick8m / 2 * pll_mult\n  *         - system clock source = pll (hick)\n  *         - hick                = 8000000 / 2\n  *         - sclk                = 240000000\n  *         - ahbdiv              = 1\n  *         - ahbclk              = 240000000\n  *         - apb2div             = 2\n  *         - apb2clk             = 120000000\n  *         - apb1div             = 2\n  *         - apb1clk             = 120000000\n  *         - pll_mult            = 60\n  *         - pll_range           = GT72MHZ (greater than 72 mhz)\n  * @param  none\n  * @retval none\n  */\nvoid system_clock_config(void)\n{\n  /* reset crm */\n  crm_reset();\n\n  /* config pll clock resource */\n  crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_60, CRM_PLL_OUTPUT_RANGE_GT72MHZ);\n\n  /* enable pll */\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);\n\n  /* wait till pll is ready */\n  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)\n  {\n  }\n\n  /* config ahbclk */\n  crm_ahb_div_set(CRM_AHB_DIV_1);\n\n  /* config apb2clk, the maximum frequency of APB1/APB2 clock is 120 MHz */\n  crm_apb2_div_set(CRM_APB2_DIV_2);\n\n  /* config apb1clk, the maximum frequency of APB1/APB2 clock is 120 MHz  */\n  crm_apb1_div_set(CRM_APB1_DIV_2);\n\n  /* enable auto step mode */\n  crm_auto_step_mode_enable(TRUE);\n\n  /* select pll as system clock source */\n  crm_sysclk_switch(CRM_SCLK_PLL);\n\n  /* wait till pll is used as system clock source */\n  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)\n  {\n  }\n\n  /* disable auto step mode */\n  crm_auto_step_mode_enable(FALSE);\n\n  /* update system_core_clock global variable */\n  system_core_clock_update();\n}\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/at32f403a_407_clock.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f403a_407_clock.h\n  * @brief    header file of clock program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F403A_407_CLOCK_H\n#define __AT32F403A_407_CLOCK_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f403a_407.h\"\n\n/* exported functions ------------------------------------------------------- */\nvoid system_clock_config(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __AT32F403A_407_CLOCK_H */\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/at32f403a_407_conf.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f403a_407_conf.h\n  * @brief    at32f403a_407 config header file\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F403A_407_CONF_H\n#define __AT32F403A_407_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/**\n  * @brief in the following line adjust the value of high speed external crystal (hext)\n  * used in your application\n  *\n  * tip: to avoid modifying this file each time you need to use different hext, you\n  *      can define the hext value in your toolchain compiler preprocessor.\n  *\n  */\n#if !defined  HEXT_VALUE\n#define HEXT_VALUE               ((uint32_t)8000000) /*!< value of the high speed external crystal in hz */\n#endif\n\n/**\n  * @brief in the following line adjust the high speed external crystal (hext) startup\n  * timeout value\n  */\n#define HEXT_STARTUP_TIMEOUT     ((uint16_t)0x3000) /*!< time out for hext start up */\n#define HICK_VALUE               ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */\n\n/* module define -------------------------------------------------------------*/\n#define CRM_MODULE_ENABLED\n#define TMR_MODULE_ENABLED\n#define RTC_MODULE_ENABLED\n#define BPR_MODULE_ENABLED\n#define GPIO_MODULE_ENABLED\n#define I2C_MODULE_ENABLED\n#define USART_MODULE_ENABLED\n#define PWC_MODULE_ENABLED\n#define CAN_MODULE_ENABLED\n#define ADC_MODULE_ENABLED\n#define DAC_MODULE_ENABLED\n#define SPI_MODULE_ENABLED\n#define DMA_MODULE_ENABLED\n#define DEBUG_MODULE_ENABLED\n#define FLASH_MODULE_ENABLED\n#define CRC_MODULE_ENABLED\n#define WWDT_MODULE_ENABLED\n#define WDT_MODULE_ENABLED\n#define EXINT_MODULE_ENABLED\n#define SDIO_MODULE_ENABLED\n#define XMC_MODULE_ENABLED\n#define USB_MODULE_ENABLED\n#define ACC_MODULE_ENABLED\n#define MISC_MODULE_ENABLED\n#define EMAC_MODULE_ENABLED\n\n/* includes ------------------------------------------------------------------*/\n#ifdef CRM_MODULE_ENABLED\n#include \"at32f403a_407_crm.h\"\n#endif\n#ifdef TMR_MODULE_ENABLED\n#include \"at32f403a_407_tmr.h\"\n#endif\n#ifdef RTC_MODULE_ENABLED\n#include \"at32f403a_407_rtc.h\"\n#endif\n#ifdef BPR_MODULE_ENABLED\n#include \"at32f403a_407_bpr.h\"\n#endif\n#ifdef GPIO_MODULE_ENABLED\n#include \"at32f403a_407_gpio.h\"\n#endif\n#ifdef I2C_MODULE_ENABLED\n#include \"at32f403a_407_i2c.h\"\n#endif\n#ifdef USART_MODULE_ENABLED\n#include \"at32f403a_407_usart.h\"\n#endif\n#ifdef PWC_MODULE_ENABLED\n#include \"at32f403a_407_pwc.h\"\n#endif\n#ifdef CAN_MODULE_ENABLED\n#include \"at32f403a_407_can.h\"\n#endif\n#ifdef ADC_MODULE_ENABLED\n#include \"at32f403a_407_adc.h\"\n#endif\n#ifdef DAC_MODULE_ENABLED\n#include \"at32f403a_407_dac.h\"\n#endif\n#ifdef SPI_MODULE_ENABLED\n#include \"at32f403a_407_spi.h\"\n#endif\n#ifdef DMA_MODULE_ENABLED\n#include \"at32f403a_407_dma.h\"\n#endif\n#ifdef DEBUG_MODULE_ENABLED\n#include \"at32f403a_407_debug.h\"\n#endif\n#ifdef FLASH_MODULE_ENABLED\n#include \"at32f403a_407_flash.h\"\n#endif\n#ifdef CRC_MODULE_ENABLED\n#include \"at32f403a_407_crc.h\"\n#endif\n#ifdef WWDT_MODULE_ENABLED\n#include \"at32f403a_407_wwdt.h\"\n#endif\n#ifdef WDT_MODULE_ENABLED\n#include \"at32f403a_407_wdt.h\"\n#endif\n#ifdef EXINT_MODULE_ENABLED\n#include \"at32f403a_407_exint.h\"\n#endif\n#ifdef SDIO_MODULE_ENABLED\n#include \"at32f403a_407_sdio.h\"\n#endif\n#ifdef XMC_MODULE_ENABLED\n#include \"at32f403a_407_xmc.h\"\n#endif\n#ifdef ACC_MODULE_ENABLED\n#include \"at32f403a_407_acc.h\"\n#endif\n#ifdef MISC_MODULE_ENABLED\n#include \"at32f403a_407_misc.h\"\n#endif\n#ifdef USB_MODULE_ENABLED\n#include \"at32f403a_407_usb.h\"\n#endif\n#ifdef EMAC_MODULE_ENABLED\n#include \"at32f403a_407_emac.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/at32f403a_407_int.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f403a_407_int.c\n  * @brief    main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f403a_407_int.h\"\n\n/** @addtogroup UTILITIES_examples\n  * @{\n  */\n\n/** @addtogroup USB_IAP_bootloader\n  * @{\n  */\n\n/**\n  * @brief  this function handles nmi exception.\n  * @param  none\n  * @retval none\n  */\nvoid NMI_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles memory manage exception.\n  * @param  none\n  * @retval none\n  */\nvoid MemManage_Handler(void)\n{\n  /* go to infinite loop when memory manage exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles bus fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid BusFault_Handler(void)\n{\n  /* go to infinite loop when bus fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles usage fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid UsageFault_Handler(void)\n{\n  /* go to infinite loop when usage fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles svcall exception.\n  * @param  none\n  * @retval none\n  */\n//void SVC_Handler(void)\n//{\n//}\n\n/**\n  * @brief  this function handles debug monitor exception.\n  * @param  none\n  * @retval none\n  */\nvoid DebugMon_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles pendsv_handler exception.\n  * @param  none\n  * @retval none\n  */\n//void PendSV_Handler(void)\n//{\n//}\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/at32f403a_407_int.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f403a_407_int.h\n  * @brief    header file of main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F403A_407_INT_H\n#define __AT32F403A_407_INT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f403a_407.h\"\n\n/* exported types ------------------------------------------------------------*/\n/* exported constants --------------------------------------------------------*/\n/* exported macro ------------------------------------------------------------*/\n/* exported functions ------------------------------------------------------- */\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid SVC_Handler(void);\nvoid DebugMon_Handler(void);\nvoid PendSV_Handler(void);\nvoid SysTick_Handler(void);\n\nvoid USBFS_H_CAN1_TX_IRQHandler(void);\nvoid USBFS_L_CAN1_RX0_IRQHandler(void);\nvoid USBFS_MAPH_IRQHandler(void);\nvoid USBFS_MAPL_IRQHandler(void);\nvoid USBFSWakeUp_IRQHandler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at32f403a_weact_blackpill/board.cmake",
    "content": "set(MCU_VARIANT AT32F403ACGU7)\nset(MCU_LINKER_NAME AT32F403AxG)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at32f403a_weact_blackpill/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: WeAct BlackPill AT32F403ACGU7\n   url: https://github.com/WeActStudio/WeActStudio.BlackPill\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOC\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_PULL           GPIO_PULL_UP\n#define BUTTON_STATE_ACTIVE   0\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// UART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at32f403a_weact_blackpill/board.mk",
    "content": "MCU_VARIANT = AT32F403ACGU7\nMCU_LINKER_NAME = AT32F403AxG\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at_start_f403a/board.cmake",
    "content": "set(MCU_VARIANT AT32F403AVGT7)\nset(MCU_LINKER_NAME AT32F403AxG)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at_start_f403a/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F403a\n   url: https://www.arterychip.com/en/product/AT32F403.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE)\n\n// #define LED_PORT              GPIOA\n// #define LED_PIN               GPIO_PINS_1\n// #define LED_STATE_ON          0 // Active Low\n// #define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_PULL           GPIO_PULL_DOWN\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// UART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at_start_f403a/board.mk",
    "content": "MCU_VARIANT = AT32F403AVGT7\nMCU_LINKER_NAME = AT32F403AxG\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at_start_f407/board.cmake",
    "content": "set(MCU_VARIANT AT32F407VGT7)\nset(MCU_LINKER_NAME AT32F407xG)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at_start_f407/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F407\n   url: https://www.arterychip.com/en/product/AT32F407.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE)\n\n// #define LED_PORT              GPIOA\n// #define LED_PIN               GPIO_PINS_1\n// #define LED_STATE_ON          0 // Active Low\n// #define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// UART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/boards/at_start_f407/board.mk",
    "content": "MCU_VARIANT = AT32F407VGT7\nMCU_LINKER_NAME = AT32F407xG\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Artery\n*/\n\n#include \"at32f403a_407_clock.h\"\n#include \"at32f403a_407_int.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\nvoid usb_clock48m_select(usb_clk48_s clk_s);\nvoid uart_print_init(uint32_t baudrate);\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USBFS_H_CAN1_TX_IRQHandler(void) {\n  tud_int_handler(0);\n}\nvoid USBFS_L_CAN1_RX0_IRQHandler(void) {\n  tud_int_handler(0);\n}\nvoid USBFS_MAPH_IRQHandler(void) {\n  tud_int_handler(0);\n}\nvoid USBFS_MAPL_IRQHandler(void) {\n  tud_int_handler(0);\n}\nvoid USBFSWakeUp_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid board_init(void) {\n  system_clock_config();\n\n  /* config nvic priority group */\n  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);\n\n  /* select usb 48m clcok source */\n  usb_clock48m_select(USB_CLK_HICK);\n\n  /* configure systick */\n  systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);\n\n  /* enable usb clock */\n  crm_periph_clock_enable(CRM_USB_PERIPH_CLOCK, TRUE);\n\n  SysTick_Config(SystemCoreClock / 1000);\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USBFS_H_CAN1_TX_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBFS_L_CAN1_RX0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBFSWakeUp_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  /* LED */\n  gpio_init_type gpio_led_init_struct;\n  /* enable the led clock */\n  LED_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_led_init_struct);\n  /* configure the led gpio */\n  gpio_led_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_led_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_led_init_struct.gpio_mode = GPIO_MODE_OUTPUT;\n  gpio_led_init_struct.gpio_pins = LED_PIN;\n  gpio_led_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(LED_PORT, &gpio_led_init_struct);\n\n  /* Button */\n  gpio_init_type gpio_button_init_struct;\n  /* enable the button clock */\n  BUTTON_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_button_init_struct);\n  /* configure the button gpio */\n  gpio_button_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_button_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_button_init_struct.gpio_mode = GPIO_MODE_INPUT;\n  gpio_button_init_struct.gpio_pins = BUTTON_PIN;\n  gpio_button_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_init(BUTTON_PORT, &gpio_button_init_struct);\n\n  uart_print_init(115200);\n  printf(\"usart printf config success!\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n/**\n  * @brief  usb 48M clock select\n  * @param  clk_s:USB_CLK_HICK, USB_CLK_HEXT\n  * @retval none\n  */\nvoid usb_clock48m_select(usb_clk48_s clk_s) {\n  if (clk_s == USB_CLK_HICK) {\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);\n\n    /* enable the acc calibration ready interrupt */\n    crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);\n\n    /* update the c1\\c2\\c3 value */\n    acc_write_c1(7980);\n    acc_write_c2(8000);\n    acc_write_c3(8020);\n\n    /* open acc calibration */\n    acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);\n  } else {\n    switch (system_core_clock) {\n      /* 48MHz */\n      case 48000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_1);\n        break;\n\n      /* 72MHz */\n      case 72000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_1_5);\n        break;\n\n      /* 96MHz */\n      case 96000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_2);\n        break;\n\n      /* 120MHz */\n      case 120000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_2_5);\n        break;\n\n      /* 144MHz */\n      case 144000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_3);\n        break;\n\n      /* 168MHz */\n      case 168000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_3_5);\n        break;\n\n      /* 192MHz */\n      case 192000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_4);\n        break;\n\n      default:\n        break;\n    }\n  }\n}\n\nvoid uart_print_init(uint32_t baudrate) {\n  gpio_init_type gpio_init_struct;\n  /* enable the uart and gpio clock */\n  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);\n  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  /* configure the uart tx pin */\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);\n  /* configure uart param */\n  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);\n  usart_transmitter_enable(PRINT_UART, TRUE);\n  usart_enable(PRINT_UART, TRUE);\n}\n\nvoid board_led_write(bool state) {\n  gpio_bits_write(LED_PORT, LED_PIN, state ^ (!LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return gpio_input_data_bit_read(BUTTON_PORT, BUTTON_PIN) == BUTTON_STATE_ACTIVE;\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *at32_uuid = ((volatile uint32_t *) 0x1FFFF7E8);\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = at32_uuid[0];\n  id32[1] = at32_uuid[1];\n  id32[2] = at32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#if CFG_TUSB_OS == OPT_OS_NONE\n  int txsize = len;\n  u16 timeout = 0xffff;\n  while (txsize--) {\n    while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {\n      timeout--;\n      if (timeout == 0) {\n        return 0;\n      }\n    }\n    PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);\n    buf++;\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\nvoid SVC_Handler(void) {\n}\n\nvoid PendSV_Handler(void) {\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n\n#ifdef USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/family.cmake",
    "content": "include_guard()\n\nset(AT32_FAMILY at32f403a_407)\nset(AT32_SDK_LIB ${TOP}/hw/mcu/artery/${AT32_FAMILY}/libraries)\n\nstring(TOUPPER ${AT32_FAMILY} AT32_FAMILY_UPPER)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS ${AT32_FAMILY_UPPER} CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_gpio.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_misc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_usart.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_acc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_crm.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${AT32_SDK_LIB}/cmsis/cm4/core_support\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support\n    ${AT32_SDK_LIB}/drivers/inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${AT32_FAMILY_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_clock.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_int.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f403a_407/family.mk",
    "content": "AT32_FAMILY = at32f403a_407\nAT32_SDK_LIB = hw/mcu/artery/${AT32_FAMILY}/libraries\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4\n\nCFLAGS_GCC += \\\n  -flto\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_AT32F403A_407\n\nLDFLAGS_GCC += \\\n\t-flto --specs=nosys.specs -nostdlib -nostartfiles\n\nSRC_C += \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_gpio.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_misc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_usart.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_acc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_crm.c \\\n\t$(AT32_SDK_LIB)/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(AT32_SDK_LIB)/drivers/inc \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/core_support \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/device_support\n\nSRC_S_GCC += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s\nSRC_S_IAR += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s\n\nLD_FILE_GCC ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld\nLD_FILE_IAR ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM4F\n\nflash: flash-atlink\n"
  },
  {
    "path": "hw/bsp/at32f413/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// Include MCU header\n  #include \"at32f413.h\"\n\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        1\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/at32f413/at32f413_clock.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f413_clock.c\n  * @brief    system clock config program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f413_clock.h\"\n\n/**\n  * @brief  system clock config program\n  * @note   the system clock is configured as follow:\n  *         system clock (sclk)   = hext / 2 * pll_mult\n  *         system clock source   = pll (hext)\n  *         - hext                = HEXT_VALUE\n  *         - sclk                = 192000000\n  *         - ahbdiv              = 1\n  *         - ahbclk              = 192000000\n  *         - apb2div             = 2\n  *         - apb2clk             = 96000000\n  *         - apb1div             = 2\n  *         - apb1clk             = 96000000\n  *         - pll_mult            = 48\n  *         - pll_range           = GT72MHZ (greater than 72 mhz)\n  * @param  none\n  * @retval none\n  */\nvoid system_clock_config(void)\n{\n  /* reset crm */\n  crm_reset();\n\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);\n\n   /* wait till hext is ready */\n  while(crm_hext_stable_wait() == ERROR)\n  {\n  }\n\n  /* config pll clock resource */\n  crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_48, CRM_PLL_OUTPUT_RANGE_GT72MHZ);\n\n  /* enable pll */\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);\n\n  /* wait till pll is ready */\n  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)\n  {\n  }\n\n  /* config ahbclk */\n  crm_ahb_div_set(CRM_AHB_DIV_1);\n\n  /* config apb2clk, the maximum frequency of APB1/APB2 clock is 100 MHz  */\n  crm_apb2_div_set(CRM_APB2_DIV_2);\n\n  /* config apb1clk, the maximum frequency of APB1/APB2 clock is 100 MHz  */\n  crm_apb1_div_set(CRM_APB1_DIV_2);\n\n  /* enable auto step mode */\n  crm_auto_step_mode_enable(TRUE);\n\n  /* select pll as system clock source */\n  crm_sysclk_switch(CRM_SCLK_PLL);\n\n  /* wait till pll is used as system clock source */\n  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)\n  {\n  }\n\n  /* disable auto step mode */\n  crm_auto_step_mode_enable(FALSE);\n\n  /* update system_core_clock global variable */\n  system_core_clock_update();\n}\n"
  },
  {
    "path": "hw/bsp/at32f413/at32f413_clock.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f413_clock.h\n  * @brief    header file of clock program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F413_CLOCK_H\n#define __AT32F413_CLOCK_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f413.h\"\n\n/* exported functions ------------------------------------------------------- */\nvoid system_clock_config(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __AT32F413_CLOCK_H */\n"
  },
  {
    "path": "hw/bsp/at32f413/at32f413_conf.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f413_conf.h\n  * @brief    at32f413 config header file\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F413_CONF_H\n#define __AT32F413_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n  * @brief in the following line adjust the value of high speed external crystal (hext)\n  * used in your application\n  *\n  * tip: to avoid modifying this file each time you need to use different hext, you\n  *      can define the hext value in your toolchain compiler preprocessor.\n  *\n  */\n#if !defined  HEXT_VALUE\n#define HEXT_VALUE               ((uint32_t)8000000) /*!< value of the high speed external crystal in hz */\n#endif\n\n/**\n  * @brief in the following line adjust the high speed external crystal (hext) startup\n  * timeout value\n  */\n#define HEXT_STARTUP_TIMEOUT             ((uint16_t)0x3000)  /*!< time out for hext start up */\n#define HICK_VALUE                       ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */\n#define LEXT_VALUE                       ((uint32_t)32768)   /*!< value of the low speed external clock in hz */\n\n/* module define -------------------------------------------------------------*/\n#define CRM_MODULE_ENABLED\n#define TMR_MODULE_ENABLED\n#define RTC_MODULE_ENABLED\n#define BPR_MODULE_ENABLED\n#define GPIO_MODULE_ENABLED\n#define I2C_MODULE_ENABLED\n#define USART_MODULE_ENABLED\n#define PWC_MODULE_ENABLED\n#define CAN_MODULE_ENABLED\n#define ADC_MODULE_ENABLED\n#define SPI_MODULE_ENABLED\n#define DMA_MODULE_ENABLED\n#define DEBUG_MODULE_ENABLED\n#define FLASH_MODULE_ENABLED\n#define CRC_MODULE_ENABLED\n#define WWDT_MODULE_ENABLED\n#define WDT_MODULE_ENABLED\n#define EXINT_MODULE_ENABLED\n#define SDIO_MODULE_ENABLED\n#define USB_MODULE_ENABLED\n#define ACC_MODULE_ENABLED\n#define MISC_MODULE_ENABLED\n\n/* includes ------------------------------------------------------------------*/\n#ifdef CRM_MODULE_ENABLED\n#include \"at32f413_crm.h\"\n#endif\n#ifdef TMR_MODULE_ENABLED\n#include \"at32f413_tmr.h\"\n#endif\n#ifdef RTC_MODULE_ENABLED\n#include \"at32f413_rtc.h\"\n#endif\n#ifdef BPR_MODULE_ENABLED\n#include \"at32f413_bpr.h\"\n#endif\n#ifdef GPIO_MODULE_ENABLED\n#include \"at32f413_gpio.h\"\n#endif\n#ifdef I2C_MODULE_ENABLED\n#include \"at32f413_i2c.h\"\n#endif\n#ifdef USART_MODULE_ENABLED\n#include \"at32f413_usart.h\"\n#endif\n#ifdef PWC_MODULE_ENABLED\n#include \"at32f413_pwc.h\"\n#endif\n#ifdef CAN_MODULE_ENABLED\n#include \"at32f413_can.h\"\n#endif\n#ifdef ADC_MODULE_ENABLED\n#include \"at32f413_adc.h\"\n#endif\n#ifdef SPI_MODULE_ENABLED\n#include \"at32f413_spi.h\"\n#endif\n#ifdef DMA_MODULE_ENABLED\n#include \"at32f413_dma.h\"\n#endif\n#ifdef DEBUG_MODULE_ENABLED\n#include \"at32f413_debug.h\"\n#endif\n#ifdef FLASH_MODULE_ENABLED\n#include \"at32f413_flash.h\"\n#endif\n#ifdef CRC_MODULE_ENABLED\n#include \"at32f413_crc.h\"\n#endif\n#ifdef WWDT_MODULE_ENABLED\n#include \"at32f413_wwdt.h\"\n#endif\n#ifdef WDT_MODULE_ENABLED\n#include \"at32f413_wdt.h\"\n#endif\n#ifdef EXINT_MODULE_ENABLED\n#include \"at32f413_exint.h\"\n#endif\n#ifdef SDIO_MODULE_ENABLED\n#include \"at32f413_sdio.h\"\n#endif\n#ifdef ACC_MODULE_ENABLED\n#include \"at32f413_acc.h\"\n#endif\n#ifdef MISC_MODULE_ENABLED\n#include \"at32f413_misc.h\"\n#endif\n#ifdef USB_MODULE_ENABLED\n#include \"at32f413_usb.h\"\n#endif\n\n/**\n  * @}\n  */\n\n  /**\n  * @}\n  */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f413/at32f413_int.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f413_int.c\n  * @brief    main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f413_int.h\"\n\n/** @addtogroup AT32F413_periph_examples\n  * @{\n  */\n\n/** @addtogroup 413_USB_device_msc\n  * @{\n  */\n\n/**\n  * @brief  this function handles nmi exception.\n  * @param  none\n  * @retval none\n  */\nvoid NMI_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles hard fault exception.\n  * @param  none\n  * @retval none\n  */\n// void HardFault_Handler(void)\n// {\n//   /* go to infinite loop when hard fault exception occurs */\n//   while(1)\n//   {\n//   }\n// }\n\n/**\n  * @brief  this function handles memory manage exception.\n  * @param  none\n  * @retval none\n  */\nvoid MemManage_Handler(void)\n{\n  /* go to infinite loop when memory manage exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles bus fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid BusFault_Handler(void)\n{\n  /* go to infinite loop when bus fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles usage fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid UsageFault_Handler(void)\n{\n  /* go to infinite loop when usage fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles svcall exception.\n  * @param  none\n  * @retval none\n  */\n// void SVC_Handler(void)\n// {\n// }\n\n/**\n  * @brief  this function handles debug monitor exception.\n  * @param  none\n  * @retval none\n  */\nvoid DebugMon_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles pendsv_handler exception.\n  * @param  none\n  * @retval none\n  */\n// void PendSV_Handler(void)\n// {\n// }\n\n/**\n  * @brief  this function handles systick handler.\n  * @param  none\n  * @retval none\n  */\n// void SysTick_Handler(void)\n// {\n// }\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f413/at32f413_int.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f413_int.h\n  * @brief    header file of main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F413_INT_H\n#define __AT32F413_INT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f413.h\"\n\n/* exported types ------------------------------------------------------------*/\n/* exported constants --------------------------------------------------------*/\n/* exported macro ------------------------------------------------------------*/\n/* exported functions ------------------------------------------------------- */\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid SVC_Handler(void);\nvoid DebugMon_Handler(void);\nvoid PendSV_Handler(void);\nvoid SysTick_Handler(void);\n\nvoid USBFS_H_CAN1_TX_IRQHandler(void);\nvoid USBFS_L_CAN1_RX0_IRQHandler(void);\nvoid USBFS_MAPH_IRQHandler(void);\nvoid USBFS_MAPL_IRQHandler(void);\nvoid USBFSWakeUp_IRQHandler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f413/boards/at_start_f413/board.cmake",
    "content": "set(MCU_VARIANT AT32F413RCT7)\nset(MCU_LINKER_NAME AT32F413xC)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f413/boards/at_start_f413/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F413\n   url: https://www.arterychip.com/en/product/AT32F413.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOC\n#define LED_PIN               GPIO_PINS_2\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// UART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n\nstatic inline void board_vbus_sense_init(void)\n{\n\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f413/boards/at_start_f413/board.mk",
    "content": "MCU_VARIANT = AT32F413RCT7\nMCU_LINKER_NAME = AT32F413xC\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT} \\\n  -DCFG_EXAMPLE_VIDEO_READONLY\n"
  },
  {
    "path": "hw/bsp/at32f413/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Artery\n*/\n\n#include \"at32f413_clock.h\"\n#include \"at32f413_int.h\"\n#include \"board.h\"\n#include \"bsp/board_api.h\"\n\nvoid usb_clock48m_select(usb_clk48_s clk_s);\nvoid uart_print_init(uint32_t baudrate);\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USBFS_H_CAN1_TX_IRQHandler(void) {\n  tud_int_handler(0);\n}\nvoid USBFS_L_CAN1_RX0_IRQHandler(void) {\n  tud_int_handler(0);\n}\nvoid USBFS_MAPH_IRQHandler(void) {\n  tud_int_handler(0);\n}\nvoid USBFS_MAPL_IRQHandler(void) {\n  tud_int_handler(0);\n}\nvoid USBFSWakeUp_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid board_init(void) {\n  system_clock_config();\n\n  /* config nvic priority group */\n  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);\n\n  /* select usb 48m clcok source */\n  usb_clock48m_select(USB_CLK_HICK);\n\n  /* configure systick */\n  systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);\n\n  /* enable usb clock */\n  crm_periph_clock_enable(CRM_USB_PERIPH_CLOCK, TRUE);\n\n  SysTick_Config(SystemCoreClock / 1000);\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USBFS_H_CAN1_TX_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBFS_L_CAN1_RX0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBFSWakeUp_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  /* LED */\n  gpio_init_type gpio_led_init_struct;\n  /* enable the led clock */\n  LED_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_led_init_struct);\n  /* configure the led gpio */\n  gpio_led_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_led_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_led_init_struct.gpio_mode = GPIO_MODE_OUTPUT;\n  gpio_led_init_struct.gpio_pins = LED_PIN;\n  gpio_led_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(LED_PORT, &gpio_led_init_struct);\n\n  /* Button */\n  gpio_init_type gpio_button_init_struct;\n  /* enable the button clock */\n  BUTTON_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_button_init_struct);\n  /* configure the button gpio */\n  gpio_button_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_button_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_button_init_struct.gpio_mode = GPIO_MODE_INPUT;\n  gpio_button_init_struct.gpio_pins = BUTTON_PIN;\n  gpio_button_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_init(BUTTON_PORT, &gpio_button_init_struct);\n\n  uart_print_init(115200);\n  printf(\"usart printf config success!\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n/**\n  * @brief  usb 48M clock select\n  * @param  clk_s:USB_CLK_HICK, USB_CLK_HEXT\n  * @retval none\n  */\nvoid usb_clock48m_select(usb_clk48_s clk_s) {\n  if (clk_s == USB_CLK_HICK) {\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);\n\n    /* enable the acc calibration ready interrupt */\n    crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);\n\n    /* update the c1\\c2\\c3 value */\n    acc_write_c1(7980);\n    acc_write_c2(8000);\n    acc_write_c3(8020);\n\n    /* open acc calibration */\n    acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);\n  } else {\n    switch (system_core_clock) {\n      /* 48MHz */\n      case 48000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_1);\n        break;\n\n      /* 72MHz */\n      case 72000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_1_5);\n        break;\n\n      /* 96MHz */\n      case 96000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_2);\n        break;\n\n      /* 120MHz */\n      case 120000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_2_5);\n        break;\n\n      /* 144MHz */\n      case 144000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_3);\n        break;\n\n      /* 168MHz */\n      case 168000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_3_5);\n        break;\n\n      /* 192MHz */\n      case 192000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_4);\n        break;\n\n      default:\n        break;\n    }\n  }\n}\n\nvoid uart_print_init(uint32_t baudrate) {\n  gpio_init_type gpio_init_struct;\n  /* enable the uart and gpio clock */\n  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);\n  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  /* configure the uart tx pin */\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);\n  /* configure uart param */\n  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);\n  usart_transmitter_enable(PRINT_UART, TRUE);\n  usart_enable(PRINT_UART, TRUE);\n}\n\nvoid board_led_write(bool state) {\n  gpio_bits_write(LED_PORT, LED_PIN, state ^ (!LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return gpio_input_data_bit_read(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *at32_uuid = ((volatile uint32_t *) 0x1FFFF7E8);\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = at32_uuid[0];\n  id32[1] = at32_uuid[1];\n  id32[2] = at32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#if CFG_TUSB_OS == OPT_OS_NONE\n  int txsize = len;\n  u16 timeout = 0xffff;\n  while (txsize--) {\n    while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {\n      timeout--;\n      if (timeout == 0) {\n        return 0;\n      }\n    }\n    PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);\n    buf++;\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\nvoid SVC_Handler(void) {\n}\n\nvoid PendSV_Handler(void) {\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n\n#ifdef USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/at32f413/family.cmake",
    "content": "include_guard()\n\nset(AT32_FAMILY at32f413)\nset(AT32_SDK_LIB ${TOP}/hw/mcu/artery/${AT32_FAMILY}/libraries)\n\nstring(TOUPPER ${AT32_FAMILY} AT32_FAMILY_UPPER)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS ${AT32_FAMILY_UPPER} CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_gpio.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_misc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_usart.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_acc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_crm.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${AT32_SDK_LIB}/cmsis/cm4/core_support\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support\n    ${AT32_SDK_LIB}/drivers/inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${AT32_FAMILY_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_clock.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_int.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f413/family.mk",
    "content": "AT32_FAMILY = at32f413\nAT32_SDK_LIB = hw/mcu/artery/${AT32_FAMILY}/libraries\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4\n\nCFLAGS_GCC += \\\n  -flto\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_AT32F413\n\nLDFLAGS_GCC += \\\n\t-flto --specs=nosys.specs -nostdlib -nostartfiles\n\nSRC_C += \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_gpio.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_misc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_usart.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_acc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_crm.c \\\n\t$(AT32_SDK_LIB)/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(AT32_SDK_LIB)/drivers/inc \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/core_support \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/device_support\n\nSRC_S_GCC += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s\nSRC_S_IAR += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s\n\nLD_FILE_GCC ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld\nLD_FILE_IAR ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM4F\n\nflash: flash-atlink\n"
  },
  {
    "path": "hw/bsp/at32f415/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// Include MCU header\n  #include \"at32f415.h\"\n\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        1\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/at32f415/at32f415_clock.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f415_clock.c\n  * @brief    system clock config program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f415_clock.h\"\n\n/**\n  * @brief  system clock config program\n  * @note   the system clock is configured as follow:\n  *         system clock (sclk)   = hick8m / 2 * pll_mult\n  *         system clock source   = pll (hick)\n  *         - hick                = HICK_VALUE\n  *         - sclk                = 144000000\n  *         - ahbdiv              = 1\n  *         - ahbclk              = 144000000\n  *         - apb2div             = 2\n  *         - apb2clk             = 72000000\n  *         - apb1div             = 2\n  *         - apb1clk             = 72000000\n  *         - pll_mult            = 36\n  *         - flash_wtcyc         = 4 cycle\n  * @param  none\n  * @retval none\n  */\nvoid system_clock_config(void)\n{\n  /* config flash psr register */\n  flash_psr_set(FLASH_WAIT_CYCLE_4);\n\n  /* reset crm */\n  crm_reset();\n\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE);\n\n  /* config pll clock resource */\n  crm_pll_config(CRM_PLL_SOURCE_HICK, CRM_PLL_MULT_36);\n\n  /* enable pll */\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);\n\n  /* wait till pll is ready */\n  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)\n  {\n  }\n\n  /* config ahbclk */\n  crm_ahb_div_set(CRM_AHB_DIV_1);\n\n  /* config apb2clk, the maximum frequency of APB1/APB2 clock is 75 MHz  */\n  crm_apb2_div_set(CRM_APB2_DIV_2);\n\n  /* config apb1clk, the maximum frequency of APB1/APB2 clock is 75 MHz  */\n  crm_apb1_div_set(CRM_APB1_DIV_2);\n\n  /* enable auto step mode */\n  crm_auto_step_mode_enable(TRUE);\n\n  /* select pll as system clock source */\n  crm_sysclk_switch(CRM_SCLK_PLL);\n\n  /* wait till pll is used as system clock source */\n  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)\n  {\n  }\n\n  /* disable auto step mode */\n  crm_auto_step_mode_enable(FALSE);\n\n  /* update system_core_clock global variable */\n  system_core_clock_update();\n}\n"
  },
  {
    "path": "hw/bsp/at32f415/at32f415_clock.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f415_clock.h\n  * @brief    header file of clock program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F415_CLOCK_H\n#define __AT32F415_CLOCK_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f415.h\"\n\n/* exported functions ------------------------------------------------------- */\nvoid system_clock_config(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __AT32F415_CLOCK_H */\n"
  },
  {
    "path": "hw/bsp/at32f415/at32f415_conf.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f415_conf.h\n  * @brief    at32f415 config header file\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F415_CONF_H\n#define __AT32F415_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n  * @brief in the following line adjust the value of high speed external crystal (hext)\n  * used in your application\n  * tip: to avoid modifying this file each time you need to use different hext, you\n  *      can define the hext value in your toolchain compiler preprocessor.\n  */\n#if !defined  HEXT_VALUE\n#define HEXT_VALUE               ((uint32_t)8000000) /*!< value of the high speed external crystal in hz */\n#endif\n\n/**\n  * @brief in the following line adjust the high speed external crystal (hext) startup\n  * timeout value\n  */\n#define HEXT_STARTUP_TIMEOUT             ((uint16_t)0x3000)  /*!< time out for hext start up */\n#define HICK_VALUE                       ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */\n#define LEXT_VALUE                       ((uint32_t)32768)   /*!< value of the low speed external clock in hz */\n\n/* module define -------------------------------------------------------------*/\n#define CRM_MODULE_ENABLED\n#define CMP_MODULE_ENABLED\n#define TMR_MODULE_ENABLED\n#define ERTC_MODULE_ENABLED\n#define GPIO_MODULE_ENABLED\n#define I2C_MODULE_ENABLED\n#define USART_MODULE_ENABLED\n#define PWC_MODULE_ENABLED\n#define CAN_MODULE_ENABLED\n#define ADC_MODULE_ENABLED\n#define SPI_MODULE_ENABLED\n#define DMA_MODULE_ENABLED\n#define DEBUG_MODULE_ENABLED\n#define FLASH_MODULE_ENABLED\n#define CRC_MODULE_ENABLED\n#define WWDT_MODULE_ENABLED\n#define WDT_MODULE_ENABLED\n#define EXINT_MODULE_ENABLED\n#define SDIO_MODULE_ENABLED\n#define USB_MODULE_ENABLED\n#define MISC_MODULE_ENABLED\n\n/* includes ------------------------------------------------------------------*/\n#ifdef CRM_MODULE_ENABLED\n#include \"at32f415_crm.h\"\n#endif\n#ifdef CMP_MODULE_ENABLED\n#include \"at32f415_cmp.h\"\n#endif\n#ifdef TMR_MODULE_ENABLED\n#include \"at32f415_tmr.h\"\n#endif\n#ifdef ERTC_MODULE_ENABLED\n#include \"at32f415_ertc.h\"\n#endif\n#ifdef GPIO_MODULE_ENABLED\n#include \"at32f415_gpio.h\"\n#endif\n#ifdef I2C_MODULE_ENABLED\n#include \"at32f415_i2c.h\"\n#endif\n#ifdef USART_MODULE_ENABLED\n#include \"at32f415_usart.h\"\n#endif\n#ifdef PWC_MODULE_ENABLED\n#include \"at32f415_pwc.h\"\n#endif\n#ifdef CAN_MODULE_ENABLED\n#include \"at32f415_can.h\"\n#endif\n#ifdef ADC_MODULE_ENABLED\n#include \"at32f415_adc.h\"\n#endif\n#ifdef SPI_MODULE_ENABLED\n#include \"at32f415_spi.h\"\n#endif\n#ifdef DMA_MODULE_ENABLED\n#include \"at32f415_dma.h\"\n#endif\n#ifdef DEBUG_MODULE_ENABLED\n#include \"at32f415_debug.h\"\n#endif\n#ifdef FLASH_MODULE_ENABLED\n#include \"at32f415_flash.h\"\n#endif\n#ifdef CRC_MODULE_ENABLED\n#include \"at32f415_crc.h\"\n#endif\n#ifdef WWDT_MODULE_ENABLED\n#include \"at32f415_wwdt.h\"\n#endif\n#ifdef WDT_MODULE_ENABLED\n#include \"at32f415_wdt.h\"\n#endif\n#ifdef EXINT_MODULE_ENABLED\n#include \"at32f415_exint.h\"\n#endif\n#ifdef SDIO_MODULE_ENABLED\n#include \"at32f415_sdio.h\"\n#endif\n#ifdef MISC_MODULE_ENABLED\n#include \"at32f415_misc.h\"\n#endif\n#ifdef USB_MODULE_ENABLED\n#include \"at32f415_usb.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __AT32F415_CONF_H */\n"
  },
  {
    "path": "hw/bsp/at32f415/at32f415_int.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f415_int.c\n  * @brief    main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f415_int.h\"\n\n/** @addtogroup AT32F415_periph_examples\n  * @{\n  */\n\n/** @addtogroup 415_CRC_calculation\n  * @{\n  */\n\n/**\n  * @brief  this function handles nmi exception.\n  * @param  none\n  * @retval none\n  */\nvoid NMI_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles memory manage exception.\n  * @param  none\n  * @retval none\n  */\nvoid MemManage_Handler(void)\n{\n  /* go to infinite loop when memory manage exception occurs */\n\n  while(1)\n  {\n  }\n\n}\n\n/**\n  * @brief  this function handles bus fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid BusFault_Handler(void)\n{\n  /* go to infinite loop when bus fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles usage fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid UsageFault_Handler(void)\n{\n  /* go to infinite loop when usage fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles svcall exception.\n  * @param  none\n  * @retval none\n  */\n//void SVC_Handler(void)\n//{\n//}\n\n/**\n  * @brief  this function handles debug monitor exception.\n  * @param  none\n  * @retval none\n  */\nvoid DebugMon_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles pendsv_handler exception.\n  * @param  none\n  * @retval none\n  */\n//void PendSV_Handler(void)\n//{\n//}\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f415/at32f415_int.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f415_int.h\n  * @brief    header file of main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F415_INT_H\n#define __AT32F415_INT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f415.h\"\n\n/* exported types ------------------------------------------------------------*/\n/* exported constants --------------------------------------------------------*/\n/* exported macro ------------------------------------------------------------*/\n/* exported functions ------------------------------------------------------- */\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid SVC_Handler(void);\nvoid DebugMon_Handler(void);\nvoid PendSV_Handler(void);\nvoid SysTick_Handler(void);\n\nvoid OTGFS1_IRQHandler(void);\nvoid OTGFS1_WKUP_IRQHandler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f415/boards/at_start_f415/board.cmake",
    "content": "set(MCU_VARIANT AT32F415RCT7)\nset(MCU_LINKER_NAME AT32F415xC)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    ${MCU_VARIANT}\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f415/boards/at_start_f415/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F415\n   url: https://www.arterychip.com/en/product/AT32F415.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define USB_VBUS_IGNORE\n\n// LED\n#define LED_PORT              GPIOC\n#define LED_PIN               GPIO_PINS_2\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// Usart\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n\n//USB\n#define USB_ID                           0\n#define OTG_CLOCK                        CRM_OTGFS1_PERIPH_CLOCK\n#define OTG_IRQ                          OTGFS1_IRQn\n#define OTG_IRQ_HANDLER                  OTGFS1_IRQHandler\n#define OTG_WKUP_IRQ                     OTGFS1_WKUP_IRQn\n#define OTG_WKUP_HANDLER                 OTGFS1_WKUP_IRQHandler\n#define OTG_WKUP_EXINT_LINE              EXINT_LINE_18\n#define OTG_PIN_GPIO                     GPIOA\n#define OTG_PIN_GPIO_CLOCK               CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_VBUS                     GPIO_PINS_9\n#define OTG_PIN_ID                       GPIO_PINS_10\n#define OTG_PIN_SOF_GPIO                 GPIOA\n#define OTG_PIN_SOF_GPIO_CLOCK           CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_SOF                      GPIO_PINS_8\n\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f415/boards/at_start_f415/board.mk",
    "content": "MCU_VARIANT = AT32F415RCT7\nMCU_LINKER_NAME = AT32F415xC\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT} \\\n  -DCFG_EXAMPLE_VIDEO_READONLY\n"
  },
  {
    "path": "hw/bsp/at32f415/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Artery\n*/\n\n#include \"at32f415_clock.h\"\n#include \"at32f415_int.h\"\n#include \"board.h\"\n#include \"bsp/board_api.h\"\n\nvoid uart_print_init(uint32_t baudrate);\nvoid usb_clock48m_select(usb_clk48_s clk_s);\nvoid led_and_button_init(void);\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTGFS1_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\nvoid OTGFS1_WKUP_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid board_init(void) {\n  /* config nvic priority group */\n  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);\n\n  /* config system clock */\n  system_clock_config();\n\n  /* enable usb clock */\n  crm_periph_clock_enable(OTG_CLOCK, TRUE);\n\n  /* select usb 48m clcok source */\n  usb_clock48m_select(USB_CLK_HEXT);\n\n  /* vbus ignore */\n  board_vbus_sense_init();\n\n  /* configure systick */\n  systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);\n  SysTick_Config(SystemCoreClock / 1000);\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTG_IRQ, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n/* otgfs use vbus pin */\n#ifndef USB_VBUS_IGNORE\n  gpio_init_type gpio_init_struct;\n  crm_periph_clock_enable(OTG_PIN_GPIO_CLOCK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = OTG_PIN_VBUS;\n  gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_pin_mux_config(OTG_PIN_GPIO, OTG_PIN_VBUS_SOURCE, OTG_PIN_MUX);\n  gpio_init(OTG_PIN_GPIO, &gpio_init_struct);\n#endif\n\n  /* config led and key */\n  led_and_button_init();\n\n  /* config usart printf */\n  uart_print_init(115200);\n  printf(\"usart printf config success!\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n/**\n  * @brief  usb 48M clock select\n  * @param  clk_s:USB_CLK_HICK, USB_CLK_HEXT\n  * @retval none\n  */\nvoid usb_clock48m_select(usb_clk48_s clk_s) {\n  (void) clk_s;\n  switch (system_core_clock) {\n    /* 48MHz */\n    case 48000000:\n      crm_usb_clock_div_set(CRM_USB_DIV_1);\n      break;\n\n    /* 72MHz */\n    case 72000000:\n      crm_usb_clock_div_set(CRM_USB_DIV_1_5);\n      break;\n\n    /* 96MHz */\n    case 96000000:\n      crm_usb_clock_div_set(CRM_USB_DIV_2);\n      break;\n\n    /* 120MHz */\n    case 120000000:\n      crm_usb_clock_div_set(CRM_USB_DIV_2_5);\n      break;\n\n    /* 144MHz */\n    case 144000000:\n      crm_usb_clock_div_set(CRM_USB_DIV_3);\n      break;\n\n    default:\n      break;\n  }\n}\n\nvoid led_and_button_init(void) {\n  /* LED */\n  gpio_init_type gpio_led_init_struct;\n  /* enable the led clock */\n  LED_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_led_init_struct);\n  /* configure the led gpio */\n  gpio_led_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_led_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_led_init_struct.gpio_mode = GPIO_MODE_OUTPUT;\n  gpio_led_init_struct.gpio_pins = LED_PIN;\n  gpio_led_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(LED_PORT, &gpio_led_init_struct);\n  /* Button */\n  gpio_init_type gpio_button_init_struct;\n  /* enable the button clock */\n  BUTTON_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_button_init_struct);\n  /* configure the button gpio */\n  gpio_button_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_button_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_button_init_struct.gpio_mode = GPIO_MODE_INPUT;\n  gpio_button_init_struct.gpio_pins = BUTTON_PIN;\n  gpio_button_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_init(BUTTON_PORT, &gpio_button_init_struct);\n}\n\n/**\n  * @brief  initialize uart\n  * @param  baudrate: uart baudrate\n  * @retval none\n  */\nvoid uart_print_init(uint32_t baudrate) {\n  gpio_init_type gpio_init_struct;\n  /* enable the uart and gpio clock */\n  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);\n  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  /* configure the uart tx pin */\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);\n  /* configure uart param */\n  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);\n  usart_transmitter_enable(PRINT_UART, TRUE);\n  usart_enable(PRINT_UART, TRUE);\n}\n\n// Get characters from UART. Return number of read bytes\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n// Send characters to UART. Return number of sent bytes\nint board_uart_write(void const *buf, int len) {\n#if CFG_TUSB_OS == OPT_OS_NONE\n  int txsize = len;\n  u16 timeout = 0xffff;\n  while (txsize--) {\n    while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {\n      timeout--;\n      if (timeout == 0) {\n        return 0;\n      }\n    }\n    PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);\n    buf++;\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\nvoid board_led_write(bool state) {\n  gpio_bits_write(LED_PORT, LED_PIN, state ^ (!LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return gpio_input_data_bit_read(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *at32_uuid = ((volatile uint32_t *) 0x1FFFF7E8);\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = at32_uuid[0];\n  id32[1] = at32_uuid[1];\n  id32[2] = at32_uuid[2];\n\n  return len;\n}\n\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\nvoid SVC_Handler(void) {\n}\n\nvoid PendSV_Handler(void) {\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n\n#ifdef USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/at32f415/family.cmake",
    "content": "include_guard()\n\nset(AT32_FAMILY at32f415)\nset(AT32_SDK_LIB ${TOP}/hw/mcu/artery/${AT32_FAMILY}/libraries)\n\nstring(TOUPPER ${AT32_FAMILY} AT32_FAMILY_UPPER)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4-nofpu CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS ${AT32_FAMILY_UPPER} CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_gpio.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_misc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_usart.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_crm.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${AT32_SDK_LIB}/cmsis/cm4/core_support\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support\n    ${AT32_SDK_LIB}/drivers/inc\n    )\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${AT32_FAMILY_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_clock.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_int.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f415/family.mk",
    "content": "AT32_FAMILY = at32f415\nAT32_SDK_LIB = hw/mcu/artery/${AT32_FAMILY}/libraries\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4-nofpu\n\nCFLAGS_GCC += \\\n  -flto\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_AT32F415 \\\n\nLDFLAGS_GCC += \\\n\t-flto --specs=nosys.specs -nostdlib -nostartfiles\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_gpio.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_misc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_usart.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_crm.c \\\n\t$(AT32_SDK_LIB)/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(AT32_SDK_LIB)/drivers/inc \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/core_support \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/device_support\n\nSRC_S_GCC += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s\nSRC_S_IAR += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s\n\nLD_FILE_GCC ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld\nLD_FILE_IAR ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf\n\nflash: flash-atlink\n"
  },
  {
    "path": "hw/bsp/at32f423/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// Include MCU header\n  #include \"at32f423.h\"\n\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        1\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/at32f423/at32f423_clock.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f423_clock.c\n  * @brief    system clock config program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f423_clock.h\"\n\n/**\n  * @brief  system clock config program\n  * @note   the system clock is configured as follow:\n  *         system clock (sclk)   = (hext * pll_ns)/(pll_ms * pll_fr) / 2\n  *         system clock source   = pll (hext)\n  *         - hext                = HEXT_VALUE\n  *         - sclk                = 144000000\n  *         - ahbdiv              = 1\n  *         - ahbclk              = 144000000\n  *         - apb2div             = 1\n  *         - apb2clk             = 144000000\n  *         - apb1div             = 2\n  *         - apb1clk             = 72000000\n  *         - pll_ns              = 72\n  *         - pll_ms              = 1\n  *         - pll_fr              = 1\n  * @param  none\n  * @retval none\n  */\nvoid system_clock_config(void)\n{\n  /* reset crm */\n  crm_reset();\n\n  /* config flash psr register */\n  flash_psr_set(FLASH_WAIT_CYCLE_4);\n\n  /* enable pwc periph clock */\n  crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);\n\n  /* ensure system clock to highest, set power ldo output voltage to 1.3v */\n  pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V3);\n\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);\n\n  /* wait till hext is ready */\n  while(crm_hext_stable_wait() == ERROR)\n  {\n  }\n\n  /* config pll clock resource\n  common frequency config list: pll source selected  hick or hext(8mhz)\n  _____________________________________________________________________________\n  |        |         |         |         |         |         |        |        |\n  | sysclk |   150   |   144   |   120   |   108   |   96    |   72   |   36   |\n  |________|_________|_________|_________|_________|_________|_________________|\n  |        |         |         |         |         |         |        |        |\n  |pll_ns  |   75    |   72    |   120   |   108   |   96    |   72   |   72   |\n  |        |         |         |         |         |         |        |        |\n  |pll_ms  |   1     |   1     |   1     |   1     |   1     |   1    |   1    |\n  |        |         |         |         |         |         |        |        |\n  |pll_fr  |   FR_2  |   FR_2  |   FR_4  |   FR_4  |   FR_4  |   FR_4 |   FR_8 |\n  |________|_________|_________|_________|_________|_________|________|________|\n\n  if pll clock source selects hext with other frequency values, or configure pll to other\n  frequency values, please use the at32 new clock  configuration tool for configuration. */\n  crm_pll_config(CRM_PLL_SOURCE_HEXT, 72, 1, CRM_PLL_FR_2);\n\n  /* enable pll */\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);\n\n  /* wait till pll is ready */\n  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)\n  {\n  }\n\n  /* config ahbclk */\n  crm_ahb_div_set(CRM_AHB_DIV_1);\n\n  /* config apb2clk, the maximum frequency of APB2 clock is 150 MHz  */\n  crm_apb2_div_set(CRM_APB2_DIV_1);\n\n  /* config apb1clk, the maximum frequency of APB1 clock is 120 MHz  */\n  crm_apb1_div_set(CRM_APB1_DIV_2);\n\n  /* enable auto step mode */\n  crm_auto_step_mode_enable(TRUE);\n\n  /* select pll as system clock source */\n  crm_sysclk_switch(CRM_SCLK_PLL);\n\n  /* wait till pll is used as system clock source */\n  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)\n  {\n  }\n\n  /* disable auto step mode */\n  crm_auto_step_mode_enable(FALSE);\n\n  /* update system_core_clock global variable */\n  system_core_clock_update();\n}\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f423/at32f423_clock.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f423_clock.h\n  * @brief    header file of clock program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F423_CLOCK_H\n#define __AT32F423_CLOCK_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f423.h\"\n\n/* exported functions ------------------------------------------------------- */\nvoid system_clock_config(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f423/at32f423_conf.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f423_conf.h\n  * @brief    at32f423 config header file\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F423_CONF_H\n#define __AT32F423_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n  * @brief in the following line adjust the value of high speed external crystal (hext)\n  * used in your application\n  *\n  * tip: to avoid modifying this file each time you need to use different hext, you\n  *      can define the hext value in your toolchain compiler preprocessor.\n  *\n  */\n#if !defined  HEXT_VALUE\n#define HEXT_VALUE                       ((uint32_t)8000000) /*!< value of the high speed external crystal in hz */\n#endif\n\n/**\n  * @brief in the following line adjust the high speed external crystal (hext) startup\n  * timeout value\n  */\n#define HEXT_STARTUP_TIMEOUT             ((uint16_t)0x3000)  /*!< time out for hext start up */\n#define HICK_VALUE                       ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */\n#define LEXT_VALUE                       ((uint32_t)32768)   /*!< value of the low speed external clock in hz */\n\n/* module define -------------------------------------------------------------*/\n#define CRM_MODULE_ENABLED\n#define TMR_MODULE_ENABLED\n#define ERTC_MODULE_ENABLED\n#define GPIO_MODULE_ENABLED\n#define I2C_MODULE_ENABLED\n#define USART_MODULE_ENABLED\n#define PWC_MODULE_ENABLED\n#define CAN_MODULE_ENABLED\n#define ADC_MODULE_ENABLED\n#define DAC_MODULE_ENABLED\n#define SPI_MODULE_ENABLED\n#define DMA_MODULE_ENABLED\n#define DEBUG_MODULE_ENABLED\n#define FLASH_MODULE_ENABLED\n#define CRC_MODULE_ENABLED\n#define WWDT_MODULE_ENABLED\n#define WDT_MODULE_ENABLED\n#define EXINT_MODULE_ENABLED\n#define XMC_MODULE_ENABLED\n#define USB_MODULE_ENABLED\n#define ACC_MODULE_ENABLED\n#define MISC_MODULE_ENABLED\n#define SCFG_MODULE_ENABLED\n\n/* includes ------------------------------------------------------------------*/\n#ifdef CRM_MODULE_ENABLED\n#include \"at32f423_crm.h\"\n#endif\n#ifdef TMR_MODULE_ENABLED\n#include \"at32f423_tmr.h\"\n#endif\n#ifdef ERTC_MODULE_ENABLED\n#include \"at32f423_ertc.h\"\n#endif\n#ifdef GPIO_MODULE_ENABLED\n#include \"at32f423_gpio.h\"\n#endif\n#ifdef I2C_MODULE_ENABLED\n#include \"at32f423_i2c.h\"\n#endif\n#ifdef USART_MODULE_ENABLED\n#include \"at32f423_usart.h\"\n#endif\n#ifdef PWC_MODULE_ENABLED\n#include \"at32f423_pwc.h\"\n#endif\n#ifdef CAN_MODULE_ENABLED\n#include \"at32f423_can.h\"\n#endif\n#ifdef ADC_MODULE_ENABLED\n#include \"at32f423_adc.h\"\n#endif\n#ifdef DAC_MODULE_ENABLED\n#include \"at32f423_dac.h\"\n#endif\n#ifdef SPI_MODULE_ENABLED\n#include \"at32f423_spi.h\"\n#endif\n#ifdef DMA_MODULE_ENABLED\n#include \"at32f423_dma.h\"\n#endif\n#ifdef DEBUG_MODULE_ENABLED\n#include \"at32f423_debug.h\"\n#endif\n#ifdef FLASH_MODULE_ENABLED\n#include \"at32f423_flash.h\"\n#endif\n#ifdef CRC_MODULE_ENABLED\n#include \"at32f423_crc.h\"\n#endif\n#ifdef WWDT_MODULE_ENABLED\n#include \"at32f423_wwdt.h\"\n#endif\n#ifdef WDT_MODULE_ENABLED\n#include \"at32f423_wdt.h\"\n#endif\n#ifdef EXINT_MODULE_ENABLED\n#include \"at32f423_exint.h\"\n#endif\n#ifdef XMC_MODULE_ENABLED\n#include \"at32f423_xmc.h\"\n#endif\n#ifdef ACC_MODULE_ENABLED\n#include \"at32f423_acc.h\"\n#endif\n#ifdef MISC_MODULE_ENABLED\n#include \"at32f423_misc.h\"\n#endif\n#ifdef SCFG_MODULE_ENABLED\n#include \"at32f423_scfg.h\"\n#endif\n#ifdef USB_MODULE_ENABLED\n#include \"at32f423_usb.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f423/at32f423_int.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f423_int.c\n  * @brief    main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f423_int.h\"\n\n/** @addtogroup AT32F423_periph_examples\n  * @{\n  */\n\n/** @addtogroup 423_USB_device_msc\n  * @{\n  */\n\n/**\n  * @brief  this function handles nmi exception.\n  * @param  none\n  * @retval none\n  */\nvoid NMI_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles hard fault exception.\n  * @param  none\n  * @retval none\n  */\n//void HardFault_Handler(void)\n//{\n  /* go to infinite loop when hard fault exception occurs */\n  //while(1)\n  //{\n  //}\n//}\n\n/**\n  * @brief  this function handles memory manage exception.\n  * @param  none\n  * @retval none\n  */\nvoid MemManage_Handler(void)\n{\n  /* go to infinite loop when memory manage exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles bus fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid BusFault_Handler(void)\n{\n  /* go to infinite loop when bus fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles usage fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid UsageFault_Handler(void)\n{\n  /* go to infinite loop when usage fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles svcall exception.\n  * @param  none\n  * @retval none\n  */\n//void SVC_Handler(void)\n//{\n//}\n\n/**\n  * @brief  this function handles debug monitor exception.\n  * @param  none\n  * @retval none\n  */\nvoid DebugMon_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles pendsv_handler exception.\n  * @param  none\n  * @retval none\n  */\n//void PendSV_Handler(void)\n//{\n//}\n\n/**\n  * @brief  this function handles systick handler.\n  * @param  none\n  * @retval none\n  */\n//void SysTick_Handler(void)\n//{\n//}\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f423/at32f423_int.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f423_int.h\n  * @brief    header file of main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F423_INT_H\n#define __AT32F423_INT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f423.h\"\n\n/* exported types ------------------------------------------------------------*/\n/* exported constants --------------------------------------------------------*/\n/* exported macro ------------------------------------------------------------*/\n/* exported functions ------------------------------------------------------- */\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid SVC_Handler(void);\nvoid DebugMon_Handler(void);\nvoid PendSV_Handler(void);\nvoid SysTick_Handler(void);\n\nvoid OTGFS1_IRQHandler(void);\nvoid OTGFS1_WKUP_IRQHandler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f423/boards/at_start_f423/board.cmake",
    "content": "set(MCU_VARIANT AT32F423VCT7)\nset(MCU_LINKER_NAME AT32F423xC)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f423/boards/at_start_f423/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F423\n   url: https://www.arterychip.com/en/product/AT32F423.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define USB_VBUS_IGNORE\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// UART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_7\n\n//USB\n#define USB_ID                           0\n#define OTG_CLOCK                        CRM_OTGFS1_PERIPH_CLOCK\n#define OTG_IRQ                          OTGFS1_IRQn\n#define OTG_IRQ_HANDLER                  OTGFS1_IRQHandler\n#define OTG_WKUP_IRQ                     OTGFS1_WKUP_IRQn\n#define OTG_WKUP_HANDLER                 OTGFS1_WKUP_IRQHandler\n#define OTG_WKUP_EXINT_LINE              EXINT_LINE_18\n#define OTG_PIN_GPIO                     GPIOA\n#define OTG_PIN_GPIO_CLOCK               CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_DP                       GPIO_PINS_12\n#define OTG_PIN_DP_SOURCE                GPIO_PINS_SOURCE12\n#define OTG_PIN_DM                       GPIO_PINS_11\n#define OTG_PIN_DM_SOURCE                GPIO_PINS_SOURCE11\n#define OTG_PIN_VBUS                     GPIO_PINS_9\n#define OTG_PIN_VBUS_SOURCE              GPIO_PINS_SOURCE9\n#define OTG_PIN_ID                       GPIO_PINS_10\n#define OTG_PIN_ID_SOURCE                GPIO_PINS_SOURCE10\n#define OTG_PIN_SOF_GPIO                 GPIOA\n#define OTG_PIN_SOF_GPIO_CLOCK           CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_SOF                      GPIO_PINS_8\n#define OTG_PIN_SOF_SOURCE               GPIO_PINS_SOURCE8\n#define OTG_PIN_MUX                      GPIO_MUX_10\n\n//Vbus\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f423/boards/at_start_f423/board.mk",
    "content": "MCU_VARIANT = AT32F423VCT7\nMCU_LINKER_NAME = AT32F423xC\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f423/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Artery\n*/\n\n#include \"at32f423_clock.h\"\n#include \"at32f423_int.h\"\n#include \"board.h\"\n#include \"bsp/board_api.h\"\n\nvoid usb_clock48m_select(usb_clk48_s clk_s);\nvoid led_and_button_init(void);\nvoid uart_print_init(uint32_t baudrate);\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTGFS1_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\nvoid OTGFS1_WKUP_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid board_init(void) {\n  /* config nvic priority group */\n  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);\n\n  /* config system clock */\n  system_clock_config();\n\n  /* enable usb clock */\n  crm_periph_clock_enable(OTG_CLOCK, TRUE);\n\n  /* select usb 48m clcok source */\n  usb_clock48m_select(USB_CLK_HEXT);\n\n  /* vbus ignore */\n  board_vbus_sense_init();\n\n  /* configure systick */\n  systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);\n  SysTick_Config(SystemCoreClock / 1000);\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTG_IRQ, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n/* otgfs use vbus pin */\n#ifndef USB_VBUS_IGNORE\n  gpio_init_type gpio_init_struct;\n  crm_periph_clock_enable(OTG_PIN_GPIO_CLOCK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = OTG_PIN_VBUS;\n  gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_pin_mux_config(OTG_PIN_GPIO, OTG_PIN_VBUS_SOURCE, OTG_PIN_MUX);\n  gpio_init(OTG_PIN_GPIO, &gpio_init_struct);\n#endif\n\n  /* config led and key */\n  led_and_button_init();\n\n  /* config usart printf */\n  uart_print_init(115200);\n  printf(\"usart printf config success!\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n/**\n  * @brief  usb 48M clock select\n  * @param  clk_s:USB_CLK_HICK, USB_CLK_HEXT\n  * @retval none\n  */\nvoid usb_clock48m_select(usb_clk48_s clk_s) {\n  if (clk_s == USB_CLK_HICK) {\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);\n\n    /* enable the acc calibration ready interrupt */\n    crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);\n\n    /* update the c1\\c2\\c3 value */\n    acc_write_c1(7980);\n    acc_write_c2(8000);\n    acc_write_c3(8020);\n\n    /* open acc calibration */\n    acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);\n  } else {\n    switch (system_core_clock) {\n      /* 48MHz */\n      case 48000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_2);\n        break;\n\n      /* 72MHz */\n      case 72000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_3);\n        break;\n\n      /* 96MHz */\n      case 96000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_4);\n        break;\n\n      /* 120MHz */\n      case 120000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_5);\n        break;\n\n      /* 144MHz */\n      case 144000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_6);\n        break;\n\n      default:\n        break;\n    }\n  }\n}\nvoid uart_print_init(uint32_t baudrate) {\n  gpio_init_type gpio_init_struct;\n  /* enable the uart and gpio clock */\n  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);\n  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  /* configure the uart tx pin */\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);\n  gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);\n  /* configure uart param */\n  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);\n  usart_transmitter_enable(PRINT_UART, TRUE);\n  usart_enable(PRINT_UART, TRUE);\n}\n\nvoid led_and_button_init(void) {\n  /* LED */\n  gpio_init_type gpio_led_init_struct;\n  /* enable the led clock */\n  LED_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_led_init_struct);\n  /* configure the led gpio */\n  gpio_led_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_led_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_led_init_struct.gpio_mode = GPIO_MODE_OUTPUT;\n  gpio_led_init_struct.gpio_pins = LED_PIN;\n  gpio_led_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(LED_PORT, &gpio_led_init_struct);\n  /* Button */\n  gpio_init_type gpio_button_init_struct;\n  /* enable the button clock */\n  BUTTON_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_button_init_struct);\n  /* configure the button gpio */\n  gpio_button_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_button_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_button_init_struct.gpio_mode = GPIO_MODE_INPUT;\n  gpio_button_init_struct.gpio_pins = BUTTON_PIN;\n  gpio_button_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_init(BUTTON_PORT, &gpio_button_init_struct);\n}\n\nvoid board_led_write(bool state) {\n  gpio_bits_write(LED_PORT, LED_PIN, state ^ (!LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return gpio_input_data_bit_read(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *at32_uuid = ((volatile uint32_t *) 0x1FFFF7E8);\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = at32_uuid[0];\n  id32[1] = at32_uuid[1];\n  id32[2] = at32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#if CFG_TUSB_OS == OPT_OS_NONE\n  int txsize = len;\n  u16 timeout = 0xffff;\n  while (txsize--) {\n    while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {\n      timeout--;\n      if (timeout == 0) {\n        return 0;\n      }\n    }\n    PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);\n    buf++;\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\nvoid SVC_Handler(void) {\n}\n\nvoid PendSV_Handler(void) {\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n\n#ifdef USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/at32f423/family.cmake",
    "content": "include_guard()\n\nset(AT32_FAMILY at32f423)\nset(AT32_SDK_LIB ${TOP}/hw/mcu/artery/${AT32_FAMILY}/libraries)\n\nstring(TOUPPER ${AT32_FAMILY} AT32_FAMILY_UPPER)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS ${AT32_FAMILY_UPPER} CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_gpio.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_misc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_usart.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_acc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_crm.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${AT32_SDK_LIB}/cmsis/cm4/core_support\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support\n    ${AT32_SDK_LIB}/drivers/inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${AT32_FAMILY_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_clock.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_int.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f423/family.mk",
    "content": "AT32_FAMILY = at32f423\nAT32_SDK_LIB = hw/mcu/artery/${AT32_FAMILY}/libraries\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4\n\nCFLAGS_GCC += \\\n  -flto\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_AT32F423 \\\n\nLDFLAGS_GCC += \\\n\t-flto --specs=nosys.specs -nostdlib -nostartfiles\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_gpio.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_misc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_usart.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_crm.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_acc.c \\\n\t$(AT32_SDK_LIB)/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(AT32_SDK_LIB)/drivers/inc \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/core_support \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/device_support\n\nSRC_S_GCC += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s\nSRC_S_IAR += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s\n\nLD_FILE_GCC ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld\nLD_FILE_IAR ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf\n\nflash: flash-atlink\n"
  },
  {
    "path": "hw/bsp/at32f425/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// Include MCU header\n  #include \"at32f425.h\"\n\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        1\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/at32f425/at32f425_clock.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f425_clock.c\n  * @brief    system clock config program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f425_clock.h\"\n\n/**\n  * @brief  system clock config program\n  * @note   the system clock is configured as follow:\n  *         system clock (sclk)   = hext * pll_mult\n  *         system clock source   = pll (hext)\n  *         - hext                = HEXT_VALUE\n  *         - sclk                = 96000000\n  *         - ahbdiv              = 1\n  *         - ahbclk              = 96000000\n  *         - apb2div             = 1\n  *         - apb2clk             = 96000000\n  *         - apb1div             = 1\n  *         - apb1clk             = 96000000\n  *         - pll_mult            = 12\n  *         - flash_wtcyc         = 2 cycle\n  * @param  none\n  * @retval none\n  */\nvoid system_clock_config(void)\n{\n  /* reset crm */\n  crm_reset();\n\n  /* config flash psr register */\n  flash_psr_set(FLASH_WAIT_CYCLE_2);\n\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);\n\n  /* wait till hext is ready */\n  while(crm_hext_stable_wait() == ERROR)\n  {\n  }\n\n  /* config pll clock resource */\n  crm_pll_config(CRM_PLL_SOURCE_HEXT, CRM_PLL_MULT_12);\n\n  /* enable pll */\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);\n\n  /* wait till pll is ready */\n  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)\n  {\n  }\n\n  /* config ahbclk */\n  crm_ahb_div_set(CRM_AHB_DIV_1);\n\n  /* config apb2clk, the maximum frequency of APB1/APB2 clock is 96 MHz  */\n  crm_apb2_div_set(CRM_APB2_DIV_1);\n\n  /* config apb1clk, the maximum frequency of APB1/APB2 clock is 96 MHz  */\n  crm_apb1_div_set(CRM_APB1_DIV_1);\n\n  /* select pll as system clock source */\n  crm_sysclk_switch(CRM_SCLK_PLL);\n\n  /* wait till pll is used as system clock source */\n  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)\n  {\n  }\n\n  /* update system_core_clock global variable */\n  system_core_clock_update();\n}\n"
  },
  {
    "path": "hw/bsp/at32f425/at32f425_clock.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f425_clock.h\n  * @brief    header file of clock program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F425_CLOCK_H\n#define __AT32F425_CLOCK_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f425.h\"\n\n/* exported functions ------------------------------------------------------- */\nvoid system_clock_config(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f425/at32f425_conf.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f425_conf.h\n  * @brief    at32f425 config header file\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F425_CONF_H\n#define __AT32F425_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n  * @brief in the following line adjust the value of high speed external crystal (hext)\n  * used in your application\n  *\n  * tip: to avoid modifying this file each time you need to use different hext, you\n  *      can define the hext value in your toolchain compiler preprocessor.\n  *\n  */\n#if !defined  HEXT_VALUE\n#define HEXT_VALUE               ((uint32_t)8000000) /*!< value of the high speed external crystal in hz */\n#endif\n\n/**\n  * @brief in the following line adjust the high speed external crystal (hext) startup\n  * timeout value\n  */\n#define HEXT_STARTUP_TIMEOUT             ((uint16_t)0x3000)  /*!< time out for hext start up */\n#define HICK_VALUE                       ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */\n#define LEXT_VALUE                       ((uint32_t)32768)   /*!< value of the low speed external clock in hz */\n\n/* module define -------------------------------------------------------------*/\n#define ACC_MODULE_ENABLED\n#define CRM_MODULE_ENABLED\n#define TMR_MODULE_ENABLED\n#define ERTC_MODULE_ENABLED\n#define GPIO_MODULE_ENABLED\n#define I2C_MODULE_ENABLED\n#define CAN_MODULE_ENABLED\n#define USB_MODULE_ENABLED\n#define USART_MODULE_ENABLED\n#define PWC_MODULE_ENABLED\n#define ADC_MODULE_ENABLED\n#define SPI_MODULE_ENABLED\n#define DMA_MODULE_ENABLED\n#define DEBUG_MODULE_ENABLED\n#define FLASH_MODULE_ENABLED\n#define CRC_MODULE_ENABLED\n#define WWDT_MODULE_ENABLED\n#define WDT_MODULE_ENABLED\n#define EXINT_MODULE_ENABLED\n#define MISC_MODULE_ENABLED\n#define SCFG_MODULE_ENABLED\n\n/* includes ------------------------------------------------------------------*/\n#ifdef ACC_MODULE_ENABLED\n#include \"at32f425_acc.h\"\n#endif\n#ifdef CRM_MODULE_ENABLED\n#include \"at32f425_crm.h\"\n#endif\n#ifdef CAN_MODULE_ENABLED\n#include \"at32f425_can.h\"\n#endif\n#ifdef USB_MODULE_ENABLED\n#include \"at32f425_usb.h\"\n#endif\n#ifdef TMR_MODULE_ENABLED\n#include \"at32f425_tmr.h\"\n#endif\n#ifdef ERTC_MODULE_ENABLED\n#include \"at32f425_ertc.h\"\n#endif\n#ifdef GPIO_MODULE_ENABLED\n#include \"at32f425_gpio.h\"\n#endif\n#ifdef I2C_MODULE_ENABLED\n#include \"at32f425_i2c.h\"\n#endif\n#ifdef USART_MODULE_ENABLED\n#include \"at32f425_usart.h\"\n#endif\n#ifdef PWC_MODULE_ENABLED\n#include \"at32f425_pwc.h\"\n#endif\n#ifdef ADC_MODULE_ENABLED\n#include \"at32f425_adc.h\"\n#endif\n#ifdef SPI_MODULE_ENABLED\n#include \"at32f425_spi.h\"\n#endif\n#ifdef DMA_MODULE_ENABLED\n#include \"at32f425_dma.h\"\n#endif\n#ifdef DEBUG_MODULE_ENABLED\n#include \"at32f425_debug.h\"\n#endif\n#ifdef FLASH_MODULE_ENABLED\n#include \"at32f425_flash.h\"\n#endif\n#ifdef CRC_MODULE_ENABLED\n#include \"at32f425_crc.h\"\n#endif\n#ifdef WWDT_MODULE_ENABLED\n#include \"at32f425_wwdt.h\"\n#endif\n#ifdef WDT_MODULE_ENABLED\n#include \"at32f425_wdt.h\"\n#endif\n#ifdef EXINT_MODULE_ENABLED\n#include \"at32f425_exint.h\"\n#endif\n#ifdef MISC_MODULE_ENABLED\n#include \"at32f425_misc.h\"\n#endif\n#ifdef SCFG_MODULE_ENABLED\n#include \"at32f425_scfg.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f425/at32f425_int.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f425_int.c\n  * @brief    main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f425_int.h\"\n\n/** @addtogroup AT32F425_periph_examples\n  * @{\n  */\n\n/** @addtogroup 425_USB_device_msc\n  * @{\n  */\n\n/**\n  * @brief  this function handles nmi exception.\n  * @param  none\n  * @retval none\n  */\nvoid NMI_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles hard fault exception.\n  * @param  none\n  * @retval none\n  */\n// void HardFault_Handler(void)\n// {\n//   /* go to infinite loop when hard fault exception occurs */\n//   while(1)\n//   {\n//   }\n// }\n\n/**\n  * @brief  this function handles memory manage exception.\n  * @param  none\n  * @retval none\n  */\nvoid MemManage_Handler(void)\n{\n  /* go to infinite loop when memory manage exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles bus fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid BusFault_Handler(void)\n{\n  /* go to infinite loop when bus fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles usage fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid UsageFault_Handler(void)\n{\n  /* go to infinite loop when usage fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles svcall exception.\n  * @param  none\n  * @retval none\n  */\n// void SVC_Handler(void)\n// {\n// }\n\n/**\n  * @brief  this function handles debug monitor exception.\n  * @param  none\n  * @retval none\n  */\nvoid DebugMon_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles pendsv_handler exception.\n  * @param  none\n  * @retval none\n  */\n// void PendSV_Handler(void)\n// {\n// }\n\n/**\n  * @brief  this function handles systick handler.\n  * @param  none\n  * @retval none\n  */\n// void SysTick_Handler(void)\n// {\n// }\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f425/at32f425_int.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f425_int.h\n  * @brief    header file of main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F425_INT_H\n#define __AT32F425_INT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f425.h\"\n\n/* exported types ------------------------------------------------------------*/\n/* exported constants --------------------------------------------------------*/\n/* exported macro ------------------------------------------------------------*/\n/* exported functions ------------------------------------------------------- */\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid SVC_Handler(void);\nvoid DebugMon_Handler(void);\nvoid PendSV_Handler(void);\nvoid SysTick_Handler(void);\n\nvoid OTGFS1_IRQHandler(void);\nvoid OTGFS1_WKUP_IRQHandler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f425/boards/at_start_f425/board.cmake",
    "content": "set(MCU_VARIANT AT32F425R8T7)\nset(MCU_LINKER_NAME AT32F425x8)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    ${MCU_VARIANT}\n    CFG_EXAMPLE_VIDEO_READONLY\n    CFG_EXAMPLE_MSC_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f425/boards/at_start_f425/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F425\n   url: https://www.arterychip.com/en/product/AT32F425.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define USB_VBUS_IGNORE\n\n// LED\n#define LED_PORT              GPIOC\n#define LED_PIN               GPIO_PINS_2\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOC_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// Usart\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_1\n\n//USB\n#define USB_ID                           0\n#define OTG_CLOCK                        CRM_OTGFS1_PERIPH_CLOCK\n#define OTG_IRQ                          OTGFS1_IRQn\n#define OTG_IRQ_HANDLER                  OTGFS1_IRQHandler\n#define OTG_WKUP_IRQ                     OTGFS1_WKUP_IRQn\n#define OTG_WKUP_HANDLER                 OTGFS1_WKUP_IRQHandler\n#define OTG_WKUP_EXINT_LINE              EXINT_LINE_18\n#define OTG_PIN_GPIO                     GPIOA\n#define OTG_PIN_GPIO_CLOCK               CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_DP                       GPIO_PINS_12\n#define OTG_PIN_DP_SOURCE                GPIO_PINS_SOURCE12\n#define OTG_PIN_DM                       GPIO_PINS_11\n#define OTG_PIN_DM_SOURCE                GPIO_PINS_SOURCE11\n#define OTG_PIN_VBUS                     GPIO_PINS_9\n#define OTG_PIN_VBUS_SOURCE              GPIO_PINS_SOURCE9\n#define OTG_PIN_ID                       GPIO_PINS_10\n#define OTG_PIN_ID_SOURCE                GPIO_PINS_SOURCE10\n#define OTG_PIN_SOF_GPIO                 GPIOA\n#define OTG_PIN_SOF_GPIO_CLOCK           CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_SOF                      GPIO_PINS_8\n#define OTG_PIN_SOF_SOURCE               GPIO_PINS_SOURCE8\n#define OTG_PIN_MUX                      GPIO_MUX_3\n\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f425/boards/at_start_f425/board.mk",
    "content": "MCU_VARIANT = AT32F425R8T7\nMCU_LINKER_NAME = AT32F425x8\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT} \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -DCFG_EXAMPLE_MSC_READONLY\n"
  },
  {
    "path": "hw/bsp/at32f425/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Artery\n*/\n\n#include \"at32f425_clock.h\"\n#include \"at32f425_int.h\"\n#include \"board.h\"\n#include \"bsp/board_api.h\"\n\nvoid uart_print_init(uint32_t baudrate);\nvoid usb_clock48m_select(usb_clk48_s clk_s);\nvoid led_and_button_init(void);\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTGFS1_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\nvoid OTGFS1_WKUP_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid board_init(void) {\n  /* config nvic priority group */\n  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);\n\n  /* config system clock */\n  system_clock_config();\n\n  /* enable usb clock */\n  crm_periph_clock_enable(OTG_CLOCK, TRUE);\n\n  /* select usb 48m clcok source */\n  usb_clock48m_select(USB_CLK_HEXT);\n\n  /* vbus ignore */\n  board_vbus_sense_init();\n\n  /* configure systick */\n  systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);\n  SysTick_Config(SystemCoreClock / 1000);\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTG_IRQ, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n/* otgfs use vbus pin */\n#ifndef USB_VBUS_IGNORE\n  gpio_init_type gpio_init_struct;\n  crm_periph_clock_enable(OTG_PIN_GPIO_CLOCK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = OTG_PIN_VBUS;\n  gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_pin_mux_config(OTG_PIN_GPIO, OTG_PIN_VBUS_SOURCE, OTG_PIN_MUX);\n  gpio_init(OTG_PIN_GPIO, &gpio_init_struct);\n#endif\n\n  /* config led and key */\n  led_and_button_init();\n\n  /* config usart printf */\n  uart_print_init(115200);\n  printf(\"usart printf config success!\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n/**\n  * @brief  usb 48M clock select\n  * @param  clk_s:USB_CLK_HICK, USB_CLK_HEXT\n  * @retval none\n  */\nvoid usb_clock48m_select(usb_clk48_s clk_s) {\n  if (clk_s == USB_CLK_HICK) {\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);\n\n    /* enable the acc calibration ready interrupt */\n    crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);\n\n    /* update the c1\\c2\\c3 value */\n    acc_write_c1(7980);\n    acc_write_c2(8000);\n    acc_write_c3(8020);\n\n    /* open acc calibration */\n    acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);\n  } else {\n    /* usb divider reset */\n    crm_usb_div_reset();\n\n    switch (system_core_clock) {\n      /* 48MHz */\n      case 48000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_1);\n        break;\n\n      /* 72MHz */\n      case 72000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_1_5);\n        break;\n\n      /* 96MHz */\n      case 96000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_2);\n        break;\n\n      default:\n        break;\n    }\n  }\n}\n\nvoid led_and_button_init(void) {\n  /* LED */\n  gpio_init_type gpio_led_init_struct;\n  /* enable the led clock */\n  LED_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_led_init_struct);\n  /* configure the led gpio */\n  gpio_led_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_led_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_led_init_struct.gpio_mode = GPIO_MODE_OUTPUT;\n  gpio_led_init_struct.gpio_pins = LED_PIN;\n  gpio_led_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(LED_PORT, &gpio_led_init_struct);\n  /* Button */\n  gpio_init_type gpio_button_init_struct;\n  /* enable the button clock */\n  BUTTON_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_button_init_struct);\n  /* configure the button gpio */\n  gpio_button_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_button_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_button_init_struct.gpio_mode = GPIO_MODE_INPUT;\n  gpio_button_init_struct.gpio_pins = BUTTON_PIN;\n  gpio_button_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_init(BUTTON_PORT, &gpio_button_init_struct);\n}\n\n/**\n  * @brief  initialize uart\n  * @param  baudrate: uart baudrate\n  * @retval none\n  */\nvoid uart_print_init(uint32_t baudrate) {\n  gpio_init_type gpio_init_struct;\n  /* enable the uart and gpio clock */\n  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);\n  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  /* configure the uart tx pin */\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);\n  gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);\n  /* configure uart param */\n  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);\n  usart_transmitter_enable(PRINT_UART, TRUE);\n  usart_enable(PRINT_UART, TRUE);\n}\n\n// Get characters from UART. Return number of read bytes\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n// Send characters to UART. Return number of sent bytes\nint board_uart_write(void const *buf, int len) {\n#if CFG_TUSB_OS == OPT_OS_NONE\n  int txsize = len;\n  u16 timeout = 0xffff;\n  while (txsize--) {\n    while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {\n      timeout--;\n      if (timeout == 0) {\n        return 0;\n      }\n    }\n    PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);\n    buf++;\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\nvoid board_led_write(bool state) {\n  gpio_bits_write(LED_PORT, LED_PIN, state ^ (!LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return gpio_input_data_bit_read(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *at32_uuid = ((volatile uint32_t *) 0x1FFFF7E8);\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = at32_uuid[0];\n  id32[1] = at32_uuid[1];\n  id32[2] = at32_uuid[2];\n\n  return len;\n}\n\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\nvoid SVC_Handler(void) {\n}\n\nvoid PendSV_Handler(void) {\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n\n#ifdef USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/at32f425/family.cmake",
    "content": "include_guard()\n\nset(AT32_FAMILY at32f425)\nset(AT32_SDK_LIB ${TOP}/hw/mcu/artery/${AT32_FAMILY}/libraries)\n\nstring(TOUPPER ${AT32_FAMILY} AT32_FAMILY_UPPER)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4-nofpu CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS ${AT32_FAMILY_UPPER} CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_gpio.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_misc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_usart.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_crm.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${AT32_SDK_LIB}/cmsis/cm4/core_support\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support\n    ${AT32_SDK_LIB}/drivers/inc\n    )\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${AT32_FAMILY_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_clock.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_int.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f425/family.mk",
    "content": "AT32_FAMILY = at32f425\nAT32_SDK_LIB = hw/mcu/artery/${AT32_FAMILY}/libraries\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4-nofpu\n\nCFLAGS_GCC += \\\n  -flto\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_AT32F425 \\\n\nLDFLAGS_GCC += \\\n\t-flto --specs=nosys.specs -nostdlib -nostartfiles\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_gpio.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_misc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_usart.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_crm.c \\\n\t$(AT32_SDK_LIB)/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(AT32_SDK_LIB)/drivers/inc \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/core_support \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/device_support\n\nSRC_S_GCC += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s\nSRC_S_IAR += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s\n\nLD_FILE_GCC ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld\nLD_FILE_IAR ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf\n\nflash: flash-atlink\n"
  },
  {
    "path": "hw/bsp/at32f435_437/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// Include MCU header\n  #include \"at32f435_437.h\"\n\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        1\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/at32f435_437/at32f435_437_clock.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f435_437_clock.c\n  * @brief    system clock config program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f435_437_clock.h\"\n\n/**\n  * @brief  system clock config program\n  * @note   the system clock is configured as follow:\n  *         system clock (sclk)   = (hext * pll_ns)/(pll_ms * pll_fr)\n  *         system clock source   = pll (hext)\n  *         - hext                = HEXT_VALUE\n  *         - sclk                = 288000000\n  *         - ahbdiv              = 1\n  *         - ahbclk              = 288000000\n  *         - apb2div             = 2\n  *         - apb2clk             = 144000000\n  *         - apb1div             = 2\n  *         - apb1clk             = 144000000\n  *         - pll_ns              = 144\n  *         - pll_ms              = 1\n  *         - pll_fr              = 4\n  * @param  none\n  * @retval none\n  */\nvoid system_clock_config(void)\n{\n  /* reset crm */\n  crm_reset();\n\n  /* enable pwc periph clock */\n  crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);\n\n  /* config ldo voltage */\n  pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V3);\n\n  /* set the flash clock divider */\n  flash_clock_divider_set(FLASH_CLOCK_DIV_3);\n\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);\n\n  /* wait till hext is ready */\n  while(crm_hext_stable_wait() == ERROR)\n  {\n  }\n\n  /* config pll clock resource\n  common frequency config list: pll source selected  hick or hext(8mhz)\n  _________________________________________________________________________________________________\n  |        |         |         |         |         |         |         |         |        |        |\n  |pll(mhz)|   288   |   252   |   216   |   192   |   180   |   144   |   108   |   72   |   36   |\n  |________|_________|_________|_________|_________|_________|_________|_________|_________________|\n  |        |         |         |         |         |         |         |         |        |        |\n  |pll_ns  |   144   |   126   |   108   |   96    |   90    |   72    |   108   |   72   |   72   |\n  |        |         |         |         |         |         |         |         |        |        |\n  |pll_ms  |   1     |   1     |   1     |   1     |   1     |   1     |   1     |   1    |   1    |\n  |        |         |         |         |         |         |         |         |        |        |\n  |pll_fr  |   FR_4  |   FR_4  |   FR_4  |   FR_4  |   FR_4  |   FR_4  |   FR_8  |   FR_8 |   FR_16|\n  |________|_________|_________|_________|_________|_________|_________|_________|________|________|\n\n  if pll clock source selects hext with other frequency values, or configure pll to other\n  frequency values, please use the at32 new clock  configuration tool for configuration.  */\n  crm_pll_config(CRM_PLL_SOURCE_HEXT, 144, 1, CRM_PLL_FR_4);\n\n  /* enable pll */\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);\n\n  /* wait till pll is ready */\n  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)\n  {\n  }\n\n  /* config ahbclk */\n  crm_ahb_div_set(CRM_AHB_DIV_1);\n\n  /* config apb2clk, the maximum frequency of APB1/APB2 clock is 144 MHz  */\n  crm_apb2_div_set(CRM_APB2_DIV_2);\n\n  /* config apb1clk, the maximum frequency of APB1/APB2 clock is 144 MHz  */\n  crm_apb1_div_set(CRM_APB1_DIV_2);\n\n  /* enable auto step mode */\n  crm_auto_step_mode_enable(TRUE);\n\n  /* select pll as system clock source */\n  crm_sysclk_switch(CRM_SCLK_PLL);\n\n  /* wait till pll is used as system clock source */\n  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)\n  {\n  }\n\n  /* disable auto step mode */\n  crm_auto_step_mode_enable(FALSE);\n\n  /* update system_core_clock global variable */\n  system_core_clock_update();\n}\n"
  },
  {
    "path": "hw/bsp/at32f435_437/at32f435_437_clock.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f435_437_clock.h\n  * @brief    header file of clock program\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F435_437_CLOCK_H\n#define __AT32F435_437_CLOCK_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f435_437.h\"\n\n/* exported functions ------------------------------------------------------- */\nvoid system_clock_config(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f435_437/at32f435_437_conf.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f435_437_conf.h\n  * @brief    at32f435_437 config header file\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F435_437_CONF_H\n#define __AT32F435_437_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n  * @brief in the following line adjust the value of high speed external crystal (hext)\n  * used in your application\n  *\n  * tip: to avoid modifying this file each time you need to use different hext, you\n  *      can define the hext value in your toolchain compiler preprocessor.\n  *\n  */\n#if !defined  HEXT_VALUE\n#define HEXT_VALUE                       ((uint32_t)8000000) /*!< value of the high speed external crystal in hz */\n#endif\n\n/**\n  * @brief in the following line adjust the high speed external crystal (hext) startup\n  * timeout value\n  */\n#define HEXT_STARTUP_TIMEOUT             ((uint16_t)0x3000)  /*!< time out for hext start up */\n#define HICK_VALUE                       ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */\n#define LEXT_VALUE                       ((uint32_t)32768)   /*!< value of the low speed external clock in hz */\n\n/* module define -------------------------------------------------------------*/\n#define CRM_MODULE_ENABLED\n#define TMR_MODULE_ENABLED\n#define ERTC_MODULE_ENABLED\n#define GPIO_MODULE_ENABLED\n#define I2C_MODULE_ENABLED\n#define USART_MODULE_ENABLED\n#define PWC_MODULE_ENABLED\n#define CAN_MODULE_ENABLED\n#define ADC_MODULE_ENABLED\n#define DAC_MODULE_ENABLED\n#define SPI_MODULE_ENABLED\n#define EDMA_MODULE_ENABLED\n#define DMA_MODULE_ENABLED\n#define DEBUG_MODULE_ENABLED\n#define FLASH_MODULE_ENABLED\n#define CRC_MODULE_ENABLED\n#define WWDT_MODULE_ENABLED\n#define WDT_MODULE_ENABLED\n#define EXINT_MODULE_ENABLED\n#define SDIO_MODULE_ENABLED\n#define XMC_MODULE_ENABLED\n#define USB_MODULE_ENABLED\n#define ACC_MODULE_ENABLED\n#define MISC_MODULE_ENABLED\n#define QSPI_MODULE_ENABLED\n#define DVP_MODULE_ENABLED\n#define SCFG_MODULE_ENABLED\n#define EMAC_MODULE_ENABLED\n\n/* includes ------------------------------------------------------------------*/\n#ifdef CRM_MODULE_ENABLED\n#include \"at32f435_437_crm.h\"\n#endif\n#ifdef TMR_MODULE_ENABLED\n#include \"at32f435_437_tmr.h\"\n#endif\n#ifdef ERTC_MODULE_ENABLED\n#include \"at32f435_437_ertc.h\"\n#endif\n#ifdef GPIO_MODULE_ENABLED\n#include \"at32f435_437_gpio.h\"\n#endif\n#ifdef I2C_MODULE_ENABLED\n#include \"at32f435_437_i2c.h\"\n#endif\n#ifdef USART_MODULE_ENABLED\n#include \"at32f435_437_usart.h\"\n#endif\n#ifdef PWC_MODULE_ENABLED\n#include \"at32f435_437_pwc.h\"\n#endif\n#ifdef CAN_MODULE_ENABLED\n#include \"at32f435_437_can.h\"\n#endif\n#ifdef ADC_MODULE_ENABLED\n#include \"at32f435_437_adc.h\"\n#endif\n#ifdef DAC_MODULE_ENABLED\n#include \"at32f435_437_dac.h\"\n#endif\n#ifdef SPI_MODULE_ENABLED\n#include \"at32f435_437_spi.h\"\n#endif\n#ifdef DMA_MODULE_ENABLED\n#include \"at32f435_437_dma.h\"\n#endif\n#ifdef DEBUG_MODULE_ENABLED\n#include \"at32f435_437_debug.h\"\n#endif\n#ifdef FLASH_MODULE_ENABLED\n#include \"at32f435_437_flash.h\"\n#endif\n#ifdef CRC_MODULE_ENABLED\n#include \"at32f435_437_crc.h\"\n#endif\n#ifdef WWDT_MODULE_ENABLED\n#include \"at32f435_437_wwdt.h\"\n#endif\n#ifdef WDT_MODULE_ENABLED\n#include \"at32f435_437_wdt.h\"\n#endif\n#ifdef EXINT_MODULE_ENABLED\n#include \"at32f435_437_exint.h\"\n#endif\n#ifdef SDIO_MODULE_ENABLED\n#include \"at32f435_437_sdio.h\"\n#endif\n#ifdef XMC_MODULE_ENABLED\n#include \"at32f435_437_xmc.h\"\n#endif\n#ifdef ACC_MODULE_ENABLED\n#include \"at32f435_437_acc.h\"\n#endif\n#ifdef MISC_MODULE_ENABLED\n#include \"at32f435_437_misc.h\"\n#endif\n#ifdef EDMA_MODULE_ENABLED\n#include \"at32f435_437_edma.h\"\n#endif\n#ifdef QSPI_MODULE_ENABLED\n#include \"at32f435_437_qspi.h\"\n#endif\n#ifdef SCFG_MODULE_ENABLED\n#include \"at32f435_437_scfg.h\"\n#endif\n#ifdef EMAC_MODULE_ENABLED\n#include \"at32f435_437_emac.h\"\n#endif\n#ifdef DVP_MODULE_ENABLED\n#include \"at32f435_437_dvp.h\"\n#endif\n#ifdef USB_MODULE_ENABLED\n#include \"at32f435_437_usb.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f435_437/at32f435_437_int.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f435_437_int.c\n  * @brief    main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f435_437_int.h\"\n\n/** @addtogroup AT32F437_periph_examples\n  * @{\n  */\n\n/** @addtogroup 437_USB_device_msc\n  * @{\n  */\n\n/**\n  * @brief  this function handles nmi exception.\n  * @param  none\n  * @retval none\n  */\nvoid NMI_Handler(void)\n{\n}\n\n\n/**\n  * @brief  this function handles memory manage exception.\n  * @param  none\n  * @retval none\n  */\nvoid MemManage_Handler(void)\n{\n  /* go to infinite loop when memory manage exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles bus fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid BusFault_Handler(void)\n{\n  /* go to infinite loop when bus fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles usage fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid UsageFault_Handler(void)\n{\n  /* go to infinite loop when usage fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles svcall exception.\n  * @param  none\n  * @retval none\n  */\n//void SVC_Handler(void)\n//{\n//}\n\n/**\n  * @brief  this function handles debug monitor exception.\n  * @param  none\n  * @retval none\n  */\nvoid DebugMon_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles pendsv_handler exception.\n  * @param  none\n  * @retval none\n  */\n//void PendSV_Handler(void)\n//{\n//}\n\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f435_437/at32f435_437_int.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f435_437_int.h\n  * @brief    header file of main interrupt service routines.\n  **************************************************************************\n  *                       Copyright notice & Disclaimer\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F435_437_INT_H\n#define __AT32F435_437_INT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f435_437.h\"\n\n/* exported types ------------------------------------------------------------*/\n/* exported constants --------------------------------------------------------*/\n/* exported macro ------------------------------------------------------------*/\n/* exported functions ------------------------------------------------------- */\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid SVC_Handler(void);\nvoid DebugMon_Handler(void);\nvoid PendSV_Handler(void);\nvoid SysTick_Handler(void);\n\nvoid OTGFS1_IRQHandler(void);\nvoid OTGFS2_IRQHandler(void);\nvoid OTGFS1_WKUP_IRQHandler(void);\nvoid OTGFS2_WKUP_IRQHandler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f435_437/boards/at_start_f435/board.cmake",
    "content": "set(MCU_VARIANT AT32F435ZMT7)\nset(MCU_LINKER_NAME AT32F435xM)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f435_437/boards/at_start_f435/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F435\n   url: https://www.arterychip.com/en/product/AT32F435.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//#define USB_VBUS_IGNORE\n//#define USB_SOF_OUTPUT_ENABLE\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// USART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_7\n\n// VBUS\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n    *(int*)(0x40040038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f435_437/boards/at_start_f435/board.mk",
    "content": "MCU_VARIANT = AT32F435ZMT7\nMCU_LINKER_NAME = AT32F435xM\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f435_437/boards/at_start_f437/board.cmake",
    "content": "set(MCU_VARIANT AT32F437ZMT7)\nset(MCU_LINKER_NAME AT32F437xM)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f435_437/boards/at_start_f437/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F437\n   url: https://www.arterychip.com/en/product/AT32F437.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//#define USB_VBUS_IGNORE\n//#define USB_SOF_OUTPUT_ENABLE\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// USART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_7\n\n// VBUS\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n    *(int*)(0x40040038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f435_437/boards/at_start_f437/board.mk",
    "content": "MCU_VARIANT = AT32F437ZMT7\nMCU_LINKER_NAME = AT32F437xM\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f435_437/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Artery\n*/\n\n#include \"at32f435_437_clock.h\"\n#include \"at32f435_437_int.h\"\n#include \"board.h\"\n#include \"bsp/board_api.h\"\n\nvoid usb_gpio_config(void);\nvoid uart_print_init(uint32_t baudrate);\nvoid usb_clock48m_select(usb_clk48_s clk_s);\nvoid led_and_botton_init(void);\nint inHandlerMode(void);\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTGFS1_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\nvoid OTGFS2_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\nvoid OTGFS1_WKUP_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\nvoid OTGFS2_WKUP_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\nvoid board_init(void) {\n  /* config nvic priority group */\n  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);\n\n  /* config system clock to 288Mhz */\n  system_clock_config();\n\n  /* config usb io */\n  usb_gpio_config();\n\n  /* enable usb clock */\n  crm_periph_clock_enable(CRM_OTGFS1_PERIPH_CLOCK, TRUE);\n  crm_periph_clock_enable(CRM_OTGFS2_PERIPH_CLOCK, TRUE);\n\n  /* select usb 48m clcok source */\n  usb_clock48m_select(USB_CLK_HEXT);\n\n  /* vbus ignore */\n  board_vbus_sense_init();\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTGFS1_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(OTGFS2_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#else\n  SysTick_Config(SystemCoreClock / 1000);\n  NVIC_SetPriority(OTGFS1_IRQn, 0);\n  NVIC_SetPriority(OTGFS2_IRQn, 0);\n#endif\n\n  /* config led and key */\n  led_and_botton_init();\n\n  /* config usart printf */\n  uart_print_init(115200);\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n/**\n  * @brief  usb 48M clock select\n  * @param  clk_s:USB_CLK_HICK, USB_CLK_HEXT\n  * @retval none\n  */\nvoid usb_clock48m_select(usb_clk48_s clk_s) {\n  if (clk_s == USB_CLK_HICK) {\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);\n\n    /* enable the acc calibration ready interrupt */\n    crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);\n\n    /* update the c1\\c2\\c3 value */\n    acc_write_c1(7980);\n    acc_write_c2(8000);\n    acc_write_c3(8020);\n#ifdef BOARD_TUD_RHPORT\n  #if BOARD_TUD_RHPORT == 0\n    acc_sof_select(ACC_SOF_OTG1);\n  #else\n    acc_sof_select(ACC_SOF_OTG2);\n  #endif\n#endif\n    /* open acc calibration */\n    acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);\n  } else {\n    switch (system_core_clock) {\n      /* 48MHz */\n      case 48000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_1);\n        break;\n\n      /* 72MHz */\n      case 72000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_1_5);\n        break;\n\n      /* 96MHz */\n      case 96000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_2);\n        break;\n\n      /* 120MHz */\n      case 120000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_2_5);\n        break;\n\n      /* 144MHz */\n      case 144000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_3);\n        break;\n\n      /* 168MHz */\n      case 168000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_3_5);\n        break;\n\n      /* 192MHz */\n      case 192000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_4);\n        break;\n\n      /* 216MHz */\n      case 216000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_4_5);\n        break;\n\n      /* 240MHz */\n      case 240000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_5);\n        break;\n\n      /* 264MHz */\n      case 264000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_5_5);\n        break;\n\n      /* 288MHz */\n      case 288000000:\n        crm_usb_clock_div_set(CRM_USB_DIV_6);\n        break;\n\n      default:\n        break;\n    }\n  }\n}\n\nvoid led_and_botton_init(void) {\n  /* LED */\n  gpio_init_type gpio_led_init_struct;\n  /* enable the led clock */\n  LED_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_led_init_struct);\n  /* configure the led gpio */\n  gpio_led_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_led_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_led_init_struct.gpio_mode = GPIO_MODE_OUTPUT;\n  gpio_led_init_struct.gpio_pins = LED_PIN;\n  gpio_led_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(LED_PORT, &gpio_led_init_struct);\n  gpio_bits_set(LED_PORT, LED_PIN);\n  gpio_bits_set(LED_PORT, GPIO_PINS_14);\n  gpio_bits_set(LED_PORT, GPIO_PINS_15);\n  /* Button */\n  gpio_init_type gpio_button_init_struct;\n  /* enable the button clock */\n  BUTTON_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_button_init_struct);\n  /* configure the button gpio */\n  gpio_button_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_button_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_button_init_struct.gpio_mode = GPIO_MODE_INPUT;\n  gpio_button_init_struct.gpio_pins = BUTTON_PIN;\n  gpio_button_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_init(BUTTON_PORT, &gpio_button_init_struct);\n}\n\n/**\n  * @brief  initialize uart\n  * @param  baudrate: uart baudrate\n  * @retval none\n  */\nvoid uart_print_init(uint32_t baudrate) {\n  gpio_init_type gpio_init_struct;\n  /* enable the uart and gpio clock */\n  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);\n  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  /* configure the uart tx pin */\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);\n  gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);\n  /* configure uart param */\n  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);\n  usart_transmitter_enable(PRINT_UART, TRUE);\n  usart_enable(PRINT_UART, TRUE);\n}\n\n// Get characters from UART. Return number of read bytes\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n// Send characters to UART. Return number of sent bytes\nint board_uart_write(void const *buf, int len) {\n#if CFG_TUSB_OS == OPT_OS_NONE\n  int txsize = len;\n  u16 timeout = 0xffff;\n  while (txsize--) {\n    while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {\n      timeout--;\n      if (timeout == 0) {\n        return 0;\n      }\n    }\n    PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);\n    buf++;\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\nint inHandlerMode(void) {\n  return __get_IPSR();\n}\n\nvoid usb_gpio_config(void) {\n  gpio_init_type gpio_init_struct;\n  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);\n  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  /* dp and dm */\n  gpio_init_struct.gpio_pins = GPIO_PINS_11 | GPIO_PINS_12;\n  gpio_init(GPIOA, &gpio_init_struct);\n  gpio_init_struct.gpio_pins = GPIO_PINS_14 | GPIO_PINS_15;\n  gpio_init(GPIOB, &gpio_init_struct);\n  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE11, GPIO_MUX_10);\n  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE12, GPIO_MUX_10);\n  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE14, GPIO_MUX_12);\n  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE15, GPIO_MUX_12);\n}\n\nvoid board_led_write(bool state) {\n  gpio_bits_write(LED_PORT, LED_PIN, state ^ (!LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return gpio_input_data_bit_read(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *at32_uuid = ((volatile uint32_t *) 0x1FFFF7E8);\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = at32_uuid[0];\n  id32[1] = at32_uuid[1];\n  id32[2] = at32_uuid[2];\n\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\nvoid SVC_Handler(void) {\n}\nvoid PendSV_Handler(void) {\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n\n#ifdef USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/at32f435_437/family.cmake",
    "content": "include_guard()\n\nset(AT32_FAMILY at32f435_437)\nset(AT32_SDK_LIB ${TOP}/hw/mcu/artery/${AT32_FAMILY}/libraries)\n\nstring(TOUPPER ${AT32_FAMILY} AT32_FAMILY_UPPER)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS ${AT32_FAMILY_UPPER} CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_gpio.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_misc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_usart.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_acc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_crm.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_exint.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${AT32_SDK_LIB}/cmsis/cm4/core_support\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support\n    ${AT32_SDK_LIB}/drivers/inc\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_RHPORT=1\n    BOARD_TUH_RHPORT=0\n    BOARD_TUD_MAX_SPEED=OPT_MODE_FULL_SPEED\n    BOARD_TUH_MAX_SPEED=OPT_MODE_FULL_SPEED\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${AT32_FAMILY_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_clock.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_int.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f435_437/family.mk",
    "content": "AT32_FAMILY = at32f435_437\nAT32_SDK_LIB = hw/mcu/artery/${AT32_FAMILY}/libraries\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4\n\nCFLAGS_GCC += \\\n  -flto\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_AT32F435_437 \\\n\t-DBOARD_TUD_RHPORT=1 \\\n\t-DBOARD_TUH_RHPORT=0 \\\n\t-DBOARD_TUD_MAX_SPEED=OPT_MODE_FULL_SPEED \\\n\t-DBOARD_TUH_MAX_SPEED=OPT_MODE_FULL_SPEED \\\n\nLDFLAGS_GCC += \\\n\t-flto --specs=nosys.specs -nostdlib -nostartfiles\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_gpio.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_misc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_usart.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_crm.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_acc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_exint.c \\\n\t$(AT32_SDK_LIB)/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(AT32_SDK_LIB)/drivers/inc \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/core_support \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/device_support\n\nSRC_S_GCC += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s\nSRC_S_IAR += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s\n\nLD_FILE_GCC ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld\nLD_FILE_IAR ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf\n\nflash: flash-atlink\n"
  },
  {
    "path": "hw/bsp/at32f45x/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// Include MCU header\n  #include \"at32f45x.h\"\n#endif\n\n/* Cortex-M4 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        1\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      system_core_clock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/at32f45x/at32f45x_clock.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f45x_clock.c\n  * @brief    system clock config program\n  **************************************************************************\n  *\n  * Copyright (c) 2025, Artery Technology, All rights reserved.\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f45x_clock.h\"\n\n/**\n  * @brief  system clock config program\n  * @note   the system clock is configured as follow:\n  *         - system clock        = (hext * pll_ns)/(pll_ms * pll_fp)\n  *         - system clock source = pll (hext)\n  *         - hext                = 8000000\n  *         - sclk                = 192000000\n  *         - ahbdiv              = 1\n  *         - ahbclk              = 192000000\n  *         - apb2div             = 1\n  *         - apb2clk             = 192000000\n  *         - apb1div             = 1\n  *         - apb1clk             = 192000000\n  *         - pll_ns              = 96\n  *         - pll_ms              = 1\n  *         - pll_fp              = 4\n  * @param  none\n  * @retval none\n  */\nvoid system_clock_config(void)\n{\n  /* reset crm */\n  crm_reset();\n\n  /* set the flash clock divider */\n  flash_psr_set(FLASH_WAIT_CYCLE_5);\n\n  /* enable pwc periph clock */\n  crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);\n\n  /* config ldo voltage */\n  pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V3);\n\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_HEXT, TRUE);\n\n  /* wait till hext is ready */\n  while(crm_hext_stable_wait() == ERROR)\n  {\n  }\n\n  /* config pll clock resource */\n  crm_pll_config(CRM_PLL_SOURCE_HEXT, 96, 1, CRM_PLL_FP_4);\n\n  /* config pllu divider */\n  crm_pllu_div_set(CRM_PLL_FU_16);\n\n  /* pllu enable  */\n  crm_pllu_output_set(TRUE);\n\n  /* enable pll */\n  crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);\n\n  /* wait till pll is ready */\n  while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)\n  {\n  }\n\n  /* config ahbclk */\n  crm_ahb_div_set(CRM_AHB_DIV_1);\n\n  /* config apb3clk, the maximum frequency of APB3 clock is 90 MHz */\n  crm_apb3_div_set(CRM_APB3_DIV_4);\n\n  /* config apb2clk, the maximum frequency of APB2 clock is 192 MHz */\n  crm_apb2_div_set(CRM_APB2_DIV_1);\n\n  /* config apb1clk, the maximum frequency of APB1 clock is 192 MHz */\n  crm_apb1_div_set(CRM_APB1_DIV_1);\n\n  /* enable auto step mode */\n  crm_auto_step_mode_enable(TRUE);\n\n  /* select pll as system clock source */\n  crm_sysclk_switch(CRM_SCLK_PLL);\n\n  /* wait till pll is used as system clock source */\n  while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)\n  {\n  }\n\n  /* disable auto step mode */\n  crm_auto_step_mode_enable(FALSE);\n\n  /* update system_core_clock global variable */\n  system_core_clock_update();\n}\n"
  },
  {
    "path": "hw/bsp/at32f45x/at32f45x_clock.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f45x_clock.h\n  * @brief    header file of clock program\n  **************************************************************************\n  *\n  * Copyright (c) 2025, Artery Technology, All rights reserved.\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F45x_CLOCK_H\n#define __AT32F45x_CLOCK_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f45x.h\"\n\n/* exported functions ------------------------------------------------------- */\nvoid system_clock_config(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f45x/at32f45x_conf.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f45x_conf.h\n  * @brief    at32f45x config header file\n  **************************************************************************\n  *\n  * Copyright (c) 2025, Artery Technology, All rights reserved.\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F45x_CONF_H\n#define __AT32F45x_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n  * @brief in the following line adjust the value of high speed external crystal (hext)\n  * used in your application\n  *\n  * tip: to avoid modifying this file each time you need to use different hext, you\n  *      can define the hext value in your toolchain compiler preprocessor.\n  *\n  */\n#if !defined  HEXT_VALUE\n#define HEXT_VALUE                       ((uint32_t)8000000) /*!< value of the high speed external crystal in hz */\n#endif\n\n/**\n  * @brief in the following line adjust the high speed external crystal (hext) startup\n  * timeout value\n  */\n#define HEXT_STARTUP_TIMEOUT             ((uint16_t)0x3000)  /*!< time out for hext start up */\n#define HICK_VALUE                       ((uint32_t)8000000) /*!< value of the high speed internal clock in hz */\n#define LEXT_VALUE                       ((uint32_t)32768)   /*!< value of the low speed external clock in hz */\n\n/* module define -------------------------------------------------------------*/\n#define ACC_MODULE_ENABLED\n#define ADC_MODULE_ENABLED\n#define AES_MODULE_ENABLED\n#define CAN_MODULE_ENABLED\n#define CRC_MODULE_ENABLED\n#define CRM_MODULE_ENABLED\n#define DAC_MODULE_ENABLED\n#define DEBUG_MODULE_ENABLED\n#define DMA_MODULE_ENABLED\n#define EMAC_MODULE_ENABLED\n#define ERTC_MODULE_ENABLED\n#define EXINT_MODULE_ENABLED\n#define FLASH_MODULE_ENABLED\n#define GPIO_MODULE_ENABLED\n#define I2C_MODULE_ENABLED\n#define MISC_MODULE_ENABLED\n#define PWC_MODULE_ENABLED\n#define QSPI_MODULE_ENABLED\n#define SCFG_MODULE_ENABLED\n#define SDIO_MODULE_ENABLED\n#define SPI_MODULE_ENABLED\n#define TMR_MODULE_ENABLED\n#define TRNG_MODULE_ENABLED\n#define USART_MODULE_ENABLED\n#define USB_MODULE_ENABLED\n#define WWDT_MODULE_ENABLED\n#define WDT_MODULE_ENABLED\n#define XMC_MODULE_ENABLED\n\n/* includes ------------------------------------------------------------------*/\n#ifdef ACC_MODULE_ENABLED\n#include \"at32f45x_acc.h\"\n#endif\n#ifdef ADC_MODULE_ENABLED\n#include \"at32f45x_adc.h\"\n#endif\n#ifdef AES_MODULE_ENABLED\n#include \"at32f45x_aes.h\"\n#endif\n#ifdef CAN_MODULE_ENABLED\n#include \"at32f45x_can.h\"\n#endif\n#ifdef CRC_MODULE_ENABLED\n#include \"at32f45x_crc.h\"\n#endif\n#ifdef CRM_MODULE_ENABLED\n#include \"at32f45x_crm.h\"\n#endif\n#ifdef DAC_MODULE_ENABLED\n#include \"at32f45x_dac.h\"\n#endif\n#ifdef DEBUG_MODULE_ENABLED\n#include \"at32f45x_debug.h\"\n#endif\n#ifdef DMA_MODULE_ENABLED\n#include \"at32f45x_dma.h\"\n#endif\n#ifdef EMAC_MODULE_ENABLED\n#include \"at32f45x_emac.h\"\n#endif\n#ifdef ERTC_MODULE_ENABLED\n#include \"at32f45x_ertc.h\"\n#endif\n#ifdef EXINT_MODULE_ENABLED\n#include \"at32f45x_exint.h\"\n#endif\n#ifdef FLASH_MODULE_ENABLED\n#include \"at32f45x_flash.h\"\n#endif\n#ifdef GPIO_MODULE_ENABLED\n#include \"at32f45x_gpio.h\"\n#endif\n#ifdef I2C_MODULE_ENABLED\n#include \"at32f45x_i2c.h\"\n#endif\n#ifdef MISC_MODULE_ENABLED\n#include \"at32f45x_misc.h\"\n#endif\n#ifdef PWC_MODULE_ENABLED\n#include \"at32f45x_pwc.h\"\n#endif\n#ifdef QSPI_MODULE_ENABLED\n#include \"at32f45x_qspi.h\"\n#endif\n#ifdef SCFG_MODULE_ENABLED\n#include \"at32f45x_scfg.h\"\n#endif\n#ifdef SDIO_MODULE_ENABLED\n#include \"at32f45x_sdio.h\"\n#endif\n#ifdef SPI_MODULE_ENABLED\n#include \"at32f45x_spi.h\"\n#endif\n#ifdef TMR_MODULE_ENABLED\n#include \"at32f45x_tmr.h\"\n#endif\n#ifdef TRNG_MODULE_ENABLED\n#include \"at32f45x_trng.h\"\n#endif\n#ifdef USART_MODULE_ENABLED\n#include \"at32f45x_usart.h\"\n#endif\n#ifdef USB_MODULE_ENABLED\n#include \"at32f45x_usb.h\"\n#endif\n#ifdef WDT_MODULE_ENABLED\n#include \"at32f45x_wdt.h\"\n#endif\n#ifdef WWDT_MODULE_ENABLED\n#include \"at32f45x_wwdt.h\"\n#endif\n#ifdef XMC_MODULE_ENABLED\n#include \"at32f45x_xmc.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f45x/at32f45x_int.c",
    "content": "/**\n  **************************************************************************\n  * @file     at32f45x_int.c\n  * @brief    main interrupt service routines.\n  **************************************************************************\n  *\n  * Copyright (c) 2025, Artery Technology, All rights reserved.\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f45x_int.h\"\n\n/** @addtogroup AT32F45X_BSP\n  * @{\n  */\n\n/** @addtogroup AT32F45X_USB_Device_Keyboard\n  * @{\n  */\n\n/**\n  * @brief  this function handles nmi exception.\n  * @param  none\n  * @retval none\n  */\nvoid NMI_Handler(void)\n{\n}\n\n/**\n  * @brief  this function handles memory manage exception.\n  * @param  none\n  * @retval none\n  */\nvoid MemManage_Handler(void)\n{\n  /* go to infinite loop when memory manage exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles bus fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid BusFault_Handler(void)\n{\n  /* go to infinite loop when bus fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles usage fault exception.\n  * @param  none\n  * @retval none\n  */\nvoid UsageFault_Handler(void)\n{\n  /* go to infinite loop when usage fault exception occurs */\n  while(1)\n  {\n  }\n}\n\n/**\n  * @brief  this function handles debug monitor exception.\n  * @param  none\n  * @retval none\n  */\nvoid DebugMon_Handler(void)\n{\n}\n\n/**\n  * @}\n  */\n\n/**\n  * @}\n  */\n"
  },
  {
    "path": "hw/bsp/at32f45x/at32f45x_int.h",
    "content": "/**\n  **************************************************************************\n  * @file     at32f45x_int.h\n  * @brief    header file of main interrupt service routines.\n  **************************************************************************\n  *\n  * Copyright (c) 2025, Artery Technology, All rights reserved.\n  *\n  * The software Board Support Package (BSP) that is made available to\n  * download from Artery official website is the copyrighted work of Artery.\n  * Artery authorizes customers to use, copy, and distribute the BSP\n  * software and its related documentation for the purpose of design and\n  * development in conjunction with Artery microcontrollers. Use of the\n  * software is governed by this copyright notice and the following disclaimer.\n  *\n  * THIS SOFTWARE IS PROVIDED ON \"AS IS\" BASIS WITHOUT WARRANTIES,\n  * GUARANTEES OR REPRESENTATIONS OF ANY KIND. ARTERY EXPRESSLY DISCLAIMS,\n  * TO THE FULLEST EXTENT PERMITTED BY LAW, ALL EXPRESS, IMPLIED OR\n  * STATUTORY OR OTHER WARRANTIES, GUARANTEES OR REPRESENTATIONS,\n  * INCLUDING BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,\n  * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.\n  *\n  **************************************************************************\n  */\n\n/* define to prevent recursive inclusion -------------------------------------*/\n#ifndef __AT32F45x_INT_H\n#define __AT32F45x_INT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* includes ------------------------------------------------------------------*/\n#include \"at32f45x.h\"\n\n/* exported types ------------------------------------------------------------*/\n/* exported constants --------------------------------------------------------*/\n/* exported macro ------------------------------------------------------------*/\n/* exported functions ------------------------------------------------------- */\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid SVC_Handler(void);\nvoid DebugMon_Handler(void);\nvoid PendSV_Handler(void);\nvoid SysTick_Handler(void);\n\nvoid OTGFS1_IRQHandler(void);\nvoid OTGFS1_WKUP_IRQHandler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f455/board.cmake",
    "content": "set(MCU_VARIANT AT32F455ZET7)\nset(MCU_LINKER_NAME AT32F455xE)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f455/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F455\n   url: https://www.arterychip.com/en/product/AT32F455.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define USB_VBUS_IGNORE\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// UART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_7\n\n//USB\n#define USB_ID                           0\n#define OTG_CLOCK                        CRM_OTGFS1_PERIPH_CLOCK\n#define OTG_IRQ                          OTGFS1_IRQn\n#define OTG_IRQ_HANDLER                  OTGFS1_IRQHandler\n#define OTG_WKUP_IRQ                     OTGFS1_WKUP_IRQn\n#define OTG_WKUP_HANDLER                 OTGFS1_WKUP_IRQHandler\n#define OTG_WKUP_EXINT_LINE              EXINT_LINE_18\n#define OTG_PIN_GPIO                     GPIOA\n#define OTG_PIN_GPIO_CLOCK               CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_DP                       GPIO_PINS_12\n#define OTG_PIN_DP_SOURCE                GPIO_PINS_SOURCE12\n#define OTG_PIN_DM                       GPIO_PINS_11\n#define OTG_PIN_DM_SOURCE                GPIO_PINS_SOURCE11\n#define OTG_PIN_VBUS                     GPIO_PINS_9\n#define OTG_PIN_VBUS_SOURCE              GPIO_PINS_SOURCE9\n#define OTG_PIN_ID                       GPIO_PINS_10\n#define OTG_PIN_ID_SOURCE                GPIO_PINS_SOURCE10\n#define OTG_PIN_SOF_GPIO                 GPIOA\n#define OTG_PIN_SOF_GPIO_CLOCK           CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_SOF                      GPIO_PINS_8\n#define OTG_PIN_SOF_SOURCE               GPIO_PINS_SOURCE8\n#define OTG_PIN_MUX                      GPIO_MUX_10\n\n//Vbus\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f455/board.mk",
    "content": "MCU_VARIANT = AT32F455ZET7\nMCU_LINKER_NAME = AT32F455xE\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f456/board.cmake",
    "content": "set(MCU_VARIANT AT32F456ZET7)\nset(MCU_LINKER_NAME AT32F456xE)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f456/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F456\n   url: https://www.arterychip.com/en/product/AT32F456.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define USB_VBUS_IGNORE\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// UART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_7\n\n//USB\n#define USB_ID                           0\n#define OTG_CLOCK                        CRM_OTGFS1_PERIPH_CLOCK\n#define OTG_IRQ                          OTGFS1_IRQn\n#define OTG_IRQ_HANDLER                  OTGFS1_IRQHandler\n#define OTG_WKUP_IRQ                     OTGFS1_WKUP_IRQn\n#define OTG_WKUP_HANDLER                 OTGFS1_WKUP_IRQHandler\n#define OTG_WKUP_EXINT_LINE              EXINT_LINE_18\n#define OTG_PIN_GPIO                     GPIOA\n#define OTG_PIN_GPIO_CLOCK               CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_DP                       GPIO_PINS_12\n#define OTG_PIN_DP_SOURCE                GPIO_PINS_SOURCE12\n#define OTG_PIN_DM                       GPIO_PINS_11\n#define OTG_PIN_DM_SOURCE                GPIO_PINS_SOURCE11\n#define OTG_PIN_VBUS                     GPIO_PINS_9\n#define OTG_PIN_VBUS_SOURCE              GPIO_PINS_SOURCE9\n#define OTG_PIN_ID                       GPIO_PINS_10\n#define OTG_PIN_ID_SOURCE                GPIO_PINS_SOURCE10\n#define OTG_PIN_SOF_GPIO                 GPIOA\n#define OTG_PIN_SOF_GPIO_CLOCK           CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_SOF                      GPIO_PINS_8\n#define OTG_PIN_SOF_SOURCE               GPIO_PINS_SOURCE8\n#define OTG_PIN_MUX                      GPIO_MUX_10\n\n//Vbus\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f456/board.mk",
    "content": "MCU_VARIANT = AT32F456ZET7\nMCU_LINKER_NAME = AT32F456xE\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f457/board.cmake",
    "content": "set(MCU_VARIANT AT32F457ZET7)\nset(MCU_LINKER_NAME AT32F457xE)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC ${MCU_VARIANT})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f457/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: AT-START-F457\n   url: https://www.arterychip.com/en/product/AT32F457.jsp\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define USB_VBUS_IGNORE\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PINS_13\n#define LED_STATE_ON          0 // Active Low\n#define LED_GPIO_CLK_EN()     crm_periph_clock_enable(CRM_GPIOD_PERIPH_CLOCK, TRUE)\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PINS_0\n#define BUTTON_STATE_ACTIVE   1\n#define BUTTON_GPIO_CLK_EN()  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE)\n\n// UART\n#define PRINT_UART                       USART1\n#define PRINT_UART_CRM_CLK               CRM_USART1_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN                GPIO_PINS_9\n#define PRINT_UART_TX_GPIO               GPIOA\n#define PRINT_UART_TX_GPIO_CRM_CLK       CRM_GPIOA_PERIPH_CLOCK\n#define PRINT_UART_TX_PIN_SOURCE         GPIO_PINS_SOURCE9\n#define PRINT_UART_TX_PIN_MUX_NUM        GPIO_MUX_7\n\n//USB\n#define USB_ID                           0\n#define OTG_CLOCK                        CRM_OTGFS1_PERIPH_CLOCK\n#define OTG_IRQ                          OTGFS1_IRQn\n#define OTG_IRQ_HANDLER                  OTGFS1_IRQHandler\n#define OTG_WKUP_IRQ                     OTGFS1_WKUP_IRQn\n#define OTG_WKUP_HANDLER                 OTGFS1_WKUP_IRQHandler\n#define OTG_WKUP_EXINT_LINE              EXINT_LINE_18\n#define OTG_PIN_GPIO                     GPIOA\n#define OTG_PIN_GPIO_CLOCK               CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_DP                       GPIO_PINS_12\n#define OTG_PIN_DP_SOURCE                GPIO_PINS_SOURCE12\n#define OTG_PIN_DM                       GPIO_PINS_11\n#define OTG_PIN_DM_SOURCE                GPIO_PINS_SOURCE11\n#define OTG_PIN_VBUS                     GPIO_PINS_9\n#define OTG_PIN_VBUS_SOURCE              GPIO_PINS_SOURCE9\n#define OTG_PIN_ID                       GPIO_PINS_10\n#define OTG_PIN_ID_SOURCE                GPIO_PINS_SOURCE10\n#define OTG_PIN_SOF_GPIO                 GPIOA\n#define OTG_PIN_SOF_GPIO_CLOCK           CRM_GPIOA_PERIPH_CLOCK\n#define OTG_PIN_SOF                      GPIO_PINS_8\n#define OTG_PIN_SOF_SOURCE               GPIO_PINS_SOURCE8\n#define OTG_PIN_MUX                      GPIO_MUX_10\n\n//Vbus\nstatic inline void board_vbus_sense_init(void)\n{\n    *(int*)(0x50000038) |= (1<<21);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/at32f45x/boards/at_start_f457/board.mk",
    "content": "MCU_VARIANT = AT32F457ZET7\nMCU_LINKER_NAME = AT32F457xE\n\nJLINK_DEVICE = ${MCU_VARIANT}\n\nCFLAGS += \\\n  -D${MCU_VARIANT}\n"
  },
  {
    "path": "hw/bsp/at32f45x/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Artery\n*/\n\n#include \"at32f45x_clock.h\"\n#include \"at32f45x_int.h\"\n#include \"board.h\"\n#include \"bsp/board_api.h\"\n\nvoid usb_clock48m_select(usb_clk48_s clk_s);\nvoid led_and_button_init(void);\nvoid uart_print_init(uint32_t baudrate);\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTGFS1_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\nvoid OTGFS1_WKUP_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid board_init(void) {\n  /* config nvic priority group */\n  nvic_priority_group_config(NVIC_PRIORITY_GROUP_4);\n\n  /* config system clock */\n  system_clock_config();\n\n  /* enable usb clock */\n  crm_periph_clock_enable(OTG_CLOCK, TRUE);\n\n  /* select usb 48m clcok source */\n  usb_clock48m_select(USB_CLK_HEXT);\n\n  /* vbus ignore */\n  board_vbus_sense_init();\n\n  /* configure systick */\n  systick_clock_source_config(SYSTICK_CLOCK_SOURCE_AHBCLK_NODIV);\n  SysTick_Config(system_core_clock / 1000);\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTG_IRQ, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n/* otgfs use vbus pin */\n#ifndef USB_VBUS_IGNORE\n  gpio_init_type gpio_init_struct;\n  crm_periph_clock_enable(OTG_PIN_GPIO_CLOCK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = OTG_PIN_VBUS;\n  gpio_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_pin_mux_config(OTG_PIN_GPIO, OTG_PIN_VBUS_SOURCE, OTG_PIN_MUX);\n  gpio_init(OTG_PIN_GPIO, &gpio_init_struct);\n#endif\n\n  /* config led and key */\n  led_and_button_init();\n\n  /* config usart printf */\n  uart_print_init(115200);\n  printf(\"usart printf config success!\\r\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n/**\n  * @brief  usb 48M clock select\n  * @param  clk_s:USB_CLK_HICK, USB_CLK_HEXT\n  * @retval none\n  */\nvoid usb_clock48m_select(usb_clk48_s clk_s)\n{\n  if(clk_s == USB_CLK_HICK)\n  {\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_HICK);\n\n    /* enable the acc calibration ready interrupt */\n    crm_periph_clock_enable(CRM_ACC_PERIPH_CLOCK, TRUE);\n\n    /* update the c1\\c2\\c3 value */\n    acc_write_c1(7980);\n    acc_write_c2(8000);\n    acc_write_c3(8020);\n\n    /* open acc calibration */\n    acc_calibration_mode_enable(ACC_CAL_HICKTRIM, TRUE);\n  }\n  else\n  {\n    crm_usb_clock_source_select(CRM_USB_CLOCK_SOURCE_PLLU);\n  }\n}\n\nvoid uart_print_init(uint32_t baudrate) {\n  gpio_init_type gpio_init_struct;\n  /* enable the uart and gpio clock */\n  crm_periph_clock_enable(PRINT_UART_CRM_CLK, TRUE);\n  crm_periph_clock_enable(PRINT_UART_TX_GPIO_CRM_CLK, TRUE);\n  gpio_default_para_init(&gpio_init_struct);\n  /* configure the uart tx pin */\n  gpio_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_init_struct.gpio_mode = GPIO_MODE_MUX;\n  gpio_init_struct.gpio_pins = PRINT_UART_TX_PIN;\n  gpio_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(PRINT_UART_TX_GPIO, &gpio_init_struct);\n  gpio_pin_mux_config(PRINT_UART_TX_GPIO, PRINT_UART_TX_PIN_SOURCE, PRINT_UART_TX_PIN_MUX_NUM);\n  /* configure uart param */\n  usart_init(PRINT_UART, baudrate, USART_DATA_8BITS, USART_STOP_1_BIT);\n  usart_transmitter_enable(PRINT_UART, TRUE);\n  usart_enable(PRINT_UART, TRUE);\n}\n\nvoid led_and_button_init(void) {\n  /* LED */\n  gpio_init_type gpio_led_init_struct;\n  /* enable the led clock */\n  LED_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_led_init_struct);\n  /* configure the led gpio */\n  gpio_led_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_led_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_led_init_struct.gpio_mode = GPIO_MODE_OUTPUT;\n  gpio_led_init_struct.gpio_pins = LED_PIN;\n  gpio_led_init_struct.gpio_pull = GPIO_PULL_NONE;\n  gpio_init(LED_PORT, &gpio_led_init_struct);\n  /* Button */\n  gpio_init_type gpio_button_init_struct;\n  /* enable the button clock */\n  BUTTON_GPIO_CLK_EN();\n  /* set default parameter */\n  gpio_default_para_init(&gpio_button_init_struct);\n  /* configure the button gpio */\n  gpio_button_init_struct.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;\n  gpio_button_init_struct.gpio_out_type = GPIO_OUTPUT_PUSH_PULL;\n  gpio_button_init_struct.gpio_mode = GPIO_MODE_INPUT;\n  gpio_button_init_struct.gpio_pins = BUTTON_PIN;\n  gpio_button_init_struct.gpio_pull = GPIO_PULL_DOWN;\n  gpio_init(BUTTON_PORT, &gpio_button_init_struct);\n}\n\nvoid board_led_write(bool state) {\n  gpio_bits_write(LED_PORT, LED_PIN, state ^ (!LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return gpio_input_data_bit_read(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *at32_uuid = ((volatile uint32_t *) 0x1FFFF7E8);\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = at32_uuid[0];\n  id32[1] = at32_uuid[1];\n  id32[2] = at32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#if CFG_TUSB_OS == OPT_OS_NONE\n  int txsize = len;\n  uint16_t timeout = 0xffff;\n  while (txsize--) {\n    while (usart_flag_get(PRINT_UART, USART_TDBE_FLAG) == RESET) {\n      timeout--;\n      if (timeout == 0) {\n        return 0;\n      }\n    }\n    PRINT_UART->dt = (*((uint8_t const *) buf) & 0x01FF);\n    buf++;\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\nvoid SVC_Handler(void) {\n}\n\nvoid PendSV_Handler(void) {\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n\n#ifdef USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     e.g.: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/at32f45x/family.cmake",
    "content": "include_guard()\n\nset(AT32_FAMILY at32f45x)\nset(AT32_SDK_LIB ${TOP}/hw/mcu/artery/${AT32_FAMILY}/libraries)\n\nstring(TOUPPER ${AT32_FAMILY} AT32_FAMILY_UPPER)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS ${AT32_FAMILY_UPPER} CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_gpio.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_misc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_usart.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_acc.c\n    ${AT32_SDK_LIB}/drivers/src/${AT32_FAMILY}_crm.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${AT32_SDK_LIB}/cmsis/cm4/core_support\n    ${AT32_SDK_LIB}/cmsis/cm4/device_support\n    ${AT32_SDK_LIB}/drivers/inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${AT32_FAMILY_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_clock.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${AT32_FAMILY}_int.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/at32f45x/family.mk",
    "content": "AT32_FAMILY = at32f45x\nAT32_SDK_LIB = hw/mcu/artery/${AT32_FAMILY}/libraries\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4\n\nCFLAGS_GCC += \\\n  -flto\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_AT32F45X \\\n\nLDFLAGS_GCC += \\\n\t-flto --specs=nosys.specs -nostdlib -nostartfiles\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_gpio.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_misc.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_usart.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_crm.c \\\n\t$(AT32_SDK_LIB)/drivers/src/${AT32_FAMILY}_acc.c \\\n\t$(AT32_SDK_LIB)/cmsis/cm4/device_support/system_${AT32_FAMILY}.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(AT32_SDK_LIB)/drivers/inc \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/core_support \\\n\t$(TOP)/$(AT32_SDK_LIB)/cmsis/cm4/device_support\n\nSRC_S_GCC += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/startup_${AT32_FAMILY}.s\nSRC_S_IAR += ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/startup_${AT32_FAMILY}.s\n\nLD_FILE_GCC ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/gcc/linker/${MCU_LINKER_NAME}_FLASH.ld\nLD_FILE_IAR ?= ${AT32_SDK_LIB}/cmsis/cm4/device_support/startup/iar/linker/${MCU_LINKER_NAME}.icf\n\nflash: flash-atlink\n"
  },
  {
    "path": "hw/bsp/board.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"board_api.h\"\n\n//--------------------------------------------------------------------+\n// newlib read()/write() retarget\n//--------------------------------------------------------------------+\n#ifdef __ICCARM__\n  #define sys_write   __write\n  #define sys_read    __read\n#elif defined(__MSP430__) || defined(__RX__) || TU_CHECK_MCU(OPT_MCU_NUC120, OPT_MCU_NUC121, OPT_MCU_NUC126, OPT_MCU_NUC505)\n  #define sys_write   write\n  #define sys_read    read\n#else\n  #define sys_write   _write\n  #define sys_read    _read\n#endif\n\nint sys_write(int fhdl, const char *buf, size_t count) TU_ATTR_USED;\nint sys_read(int fhdl, char *buf, size_t count) TU_ATTR_USED;\n\n#if defined(LOGGER_RTT)\n// Logging with RTT\n\n// If using SES IDE, use the Syscalls/SEGGER_RTT_Syscalls_SES.c instead\n#if !(defined __SES_ARM) && !(defined __SES_RISCV) && !(defined __CROSSWORKS_ARM)\n#include \"SEGGER_RTT.h\"\n\nint sys_write(int fhdl, const char *buf, size_t count) {\n  (void) fhdl;\n  return (int) SEGGER_RTT_Write(0, buf, (int) count);\n}\n\nint sys_read(int fhdl, char *buf, size_t count) {\n  (void) fhdl;\n  int rd = (int) SEGGER_RTT_Read(0, buf, count);\n  return (rd > 0) ? rd : -1;\n}\n#endif\n\n#elif defined(LOGGER_SWO)\n\n#define ITM_BASE 0xE0000000\n#define ITM_STIM0 (*((volatile uint8_t*)(ITM_BASE + 0)))\n#define ITM_TER *((volatile uint32_t*)(ITM_BASE + 0xE00))\n#define ITM_TCR *((volatile uint32_t*)(ITM_BASE + 0xE80))\n\n#define ITM_TCR_ITMENA (1 << 0)\n\n// Logging with SWO for ARM Cortex-M\nint sys_write (int fhdl, const char *buf, size_t count) {\n  (void) fhdl;\n  uint8_t const* buf8 = (uint8_t const*) buf;\n\n  if ((ITM_TCR & ITM_TCR_ITMENA) && (ITM_TER & 1ul)) {\n    for(size_t i=0; i < count; i++) {\n      while (!(ITM_STIM0 & 1ul)) {\n        asm(\"nop\");\n      }\n      ITM_STIM0 = buf8[i];\n    }\n  }\n\n  return (int) count;\n}\n\nint sys_read (int fhdl, char *buf, size_t count) {\n  (void) fhdl;\n  (void) buf;\n  (void) count;\n  return 0;\n}\n\n#else\n\n// Default logging with on-board UART\nint sys_write (int fhdl, const char *buf, size_t count) {\n  (void) fhdl;\n  return board_uart_write(buf, (int) count);\n}\n\nint sys_read (int fhdl, char *buf, size_t count) {\n  (void) fhdl;\n  int rd = board_uart_read((uint8_t*) buf, (int) count);\n  return (rd > 0) ? rd : -1;\n}\n\n#endif\n\n// Clang use picolibc\n#if defined(__clang__)\nstatic int cl_putc(char c, FILE *f) {\n  (void) f;\n  return sys_write(0, &c, 1);\n}\n\nstatic int cl_getc(FILE* f) {\n  (void) f;\n  char c;\n  return sys_read(0, &c, 1) > 0 ? c : -1;\n}\n\nstatic FILE __stdio = FDEV_SETUP_STREAM(cl_putc, cl_getc, NULL, _FDEV_SETUP_RW);\nFILE *const stdin = &__stdio;\n__strong_reference(stdin, stdout);\n__strong_reference(stdin, stderr);\n#endif\n\n//--------------------------------------------------------------------+\n// Weak board API (to be optionally implemented by board)\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK size_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  // fixed serial string is 01234567889ABCDEF\n  uint32_t* uid32 = (uint32_t*) (uintptr_t)id;\n  uid32[0] = 0x67452301u;\n  uid32[1] = 0xEFCDAB89u;\n  return 8;\n}\n\nTU_ATTR_WEAK void board_init_after_tusb(void) {\n  // nothing to do\n}\n\nTU_ATTR_WEAK void board_reset_to_bootloader(void) {\n  // not implemented\n}\n\n//--------------------------------------------------------------------+\n// Board API\n//--------------------------------------------------------------------+\nint board_getchar(void) {\n  char c;\n  return (sys_read(0, &c, 1) > 0) ? (int) c : (-1);\n}\n\nvoid board_putchar(int c) {\n  (void) sys_write(0, (const char*)&c, 1);\n}\n\n//--------------------------------------------------------------------\n// FreeRTOS hooks\n//--------------------------------------------------------------------\n#if CFG_TUSB_OS == OPT_OS_FREERTOS && !defined(ESP_PLATFORM)\n\n#include \"FreeRTOS.h\"\n#include \"task.h\"\n\nvoid vApplicationMallocFailedHook(void); // missing prototype\nvoid vApplicationMallocFailedHook(void) {\n  taskDISABLE_INTERRUPTS();\n  TU_ASSERT(false, );\n}\n\nvoid vApplicationStackOverflowHook(xTaskHandle pxTask, char *pcTaskName) {\n  (void) pxTask;\n  (void) pcTaskName;\n\n  taskDISABLE_INTERRUPTS();\n  TU_ASSERT(false, );\n}\n\n/* configSUPPORT_STATIC_ALLOCATION is set to 1, so the application must provide an\n * implementation of vApplicationGetIdleTaskMemory() to provide the memory that is\n * used by the Idle task. */\nvoid vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize) {\n  /* If the buffers to be provided to the Idle task are declared inside this\n   * function then they must be declared static - otherwise they will be allocated on\n   * the stack and so not exists after this function exits. */\n  static StaticTask_t xIdleTaskTCB;\n  static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];\n\n  /* Pass out a pointer to the StaticTask_t structure in which the Idle task's\n    state will be stored. */\n  *ppxIdleTaskTCBBuffer = &xIdleTaskTCB;\n\n  /* Pass out the array that will be used as the Idle task's stack. */\n  *ppxIdleTaskStackBuffer = uxIdleTaskStack;\n\n  /* Pass out the size of the array pointed to by *ppxIdleTaskStackBuffer.\n    Note that, as the array is necessarily of type StackType_t,\n    configMINIMAL_STACK_SIZE is specified in words, not bytes. */\n  *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;\n}\n\n/* configSUPPORT_STATIC_ALLOCATION and configUSE_TIMERS are both set to 1, so the\n * application must provide an implementation of vApplicationGetTimerTaskMemory()\n * to provide the memory that is used by the Timer service task. */\nvoid vApplicationGetTimerTaskMemory( StaticTask_t **ppxTimerTaskTCBBuffer, StackType_t **ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize ) {\n  /* If the buffers to be provided to the Timer task are declared inside this\n   * function then they must be declared static - otherwise they will be allocated on\n   * the stack and so not exists after this function exits. */\n  static StaticTask_t xTimerTaskTCB;\n  static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];\n\n  /* Pass out a pointer to the StaticTask_t structure in which the Timer\n    task's state will be stored. */\n  *ppxTimerTaskTCBBuffer = &xTimerTaskTCB;\n\n  /* Pass out the array that will be used as the Timer task's stack. */\n  *ppxTimerTaskStackBuffer = uxTimerTaskStack;\n\n  /* Pass out the size of the array pointed to by *ppxTimerTaskStackBuffer.\n    Note that, as the array is necessarily of type StackType_t,\n    configTIMER_TASK_STACK_DEPTH is specified in words, not bytes. */\n  *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;\n}\n\n#if CFG_TUSB_MCU == OPT_MCU_RX63X || CFG_TUSB_MCU == OPT_MCU_RX65X\nvoid vApplicationSetupTimerInterrupt(void);\n\n#include \"iodefine.h\"\nvoid vApplicationSetupTimerInterrupt(void) {\n  /* Enable CMT0 */\n  unsigned short oldPRCR = SYSTEM.PRCR.WORD;\n  SYSTEM.PRCR.WORD = (0xA5u<<8) | TU_BIT(1);\n  MSTP(CMT0)       = 0;\n  SYSTEM.PRCR.WORD = (0xA5u<<8) | oldPRCR;\n\n  CMT0.CMCNT      = 0;\n  CMT0.CMCOR      = (unsigned short)(((configPERIPHERAL_CLOCK_HZ/configTICK_RATE_HZ)-1)/128);\n  CMT0.CMCR.WORD  = TU_BIT(6) | 2;\n  IR(CMT0, CMI0)  = 0;\n  IPR(CMT0, CMI0) = configKERNEL_INTERRUPT_PRIORITY;\n  IEN(CMT0, CMI0) = 1;\n  CMT.CMSTR0.BIT.STR0 = 1;\n}\n#endif\n\n#endif\n\n//--------------------------------------------------------------------\n// ThreadX hooks for ARM Cortex-M\n//--------------------------------------------------------------------\n#if CFG_TUSB_OS == OPT_OS_THREADX && defined(__ARM_ARCH)\n\n#include \"tx_api.h\"\n#include \"tx_initialize.h\"\n\n// Newlib linker symbol: end of statically allocated RAM (start of heap)\nextern ULONG _end;\n\n// CMSIS standard variable for system clock frequency\nextern uint32_t SystemCoreClock;\n\n// Cortex-M SysTick registers (fixed addresses on all Cortex-M)\n#define _TX_SYST_CSR    (*((volatile uint32_t *)0xE000E010U))\n#define _TX_SYST_RVR    (*((volatile uint32_t *)0xE000E014U))\n#define _TX_SYST_CVR    (*((volatile uint32_t *)0xE000E018U))\n// SCB->SHP[10] = PendSV priority, [11] = SysTick priority (byte access at SCB base + 0xD22)\n#define _TX_SCB_SHPR3   (*((volatile uint32_t *)0xE000ED20U))\n\nVOID _tx_initialize_low_level(VOID) {\n  // Set the first available memory address for tx_application_define\n  _tx_initialize_unused_memory = (VOID *)(&_end);\n\n  // Configure SysTick for ThreadX tick rate: enable with processor clock + interrupt\n  _TX_SYST_RVR = (SystemCoreClock / TX_TIMER_TICKS_PER_SECOND) - 1u;\n  _TX_SYST_CVR = 0u;\n  _TX_SYST_CSR = 0x07u; // CLKSOURCE=1, TICKINT=1, ENABLE=1\n\n  // SHPR3 bits[31:24] = SysTick priority, bits[23:16] = PendSV priority\n  // PendSV must be lowest priority (0xFF). SysTick must be higher than PendSV (0x40)\n  // so SysTick can preempt the PendSV scheduler idle loop (__tx_ts_wait) to tick the timer.\n  _TX_SCB_SHPR3 = (_TX_SCB_SHPR3 & 0x0000FFFFU) | 0x40FF0000U;\n}\n\n// Weak callback for board-specific SysTick work (e.g. HAL_IncTick on STM32)\nvoid osal_threadx_tick_cb(void);\nTU_ATTR_WEAK void osal_threadx_tick_cb(void) { }\n\n// SysTick drives the ThreadX timer tick\nextern void _tx_timer_interrupt(void);\nvoid SysTick_Handler(void);\nvoid SysTick_Handler(void) {\n  osal_threadx_tick_cb();\n  _tx_timer_interrupt();\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/board_api.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef BOARD_API_H_\n#define BOARD_API_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdint.h>\n#include <inttypes.h>\n#include <stdbool.h>\n#include <string.h>\n#include <stdio.h>\n\n#include \"tusb.h\"\n\n#if CFG_TUSB_OS == OPT_OS_ZEPHYR\n  #include <zephyr/kernel.h>\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  #ifdef ESP_PLATFORM\n    // ESP-IDF need \"freertos/\" prefix in include path.\n    // CFG_TUSB_OS_INC_PATH should be defined accordingly.\n    #include \"freertos/FreeRTOS.h\"\n    #include \"freertos/semphr.h\"\n    #include \"freertos/queue.h\"\n    #include \"freertos/task.h\"\n    #include \"freertos/timers.h\"\n  #else\n    #include \"FreeRTOS.h\"\n    #include \"semphr.h\"\n    #include \"queue.h\"\n    #include \"task.h\"\n    #include \"timers.h\"\n  #endif\n#endif\n\n// Define the default baudrate\n#ifndef CFG_BOARD_UART_BAUDRATE\n#define CFG_BOARD_UART_BAUDRATE 115200   ///< Default baud rate\n#endif\n\n//--------------------------------------------------------------------+\n// Board Porting API\n// For simplicity, only one LED and one Button are used\n//--------------------------------------------------------------------+\n\n// Initialize on-board peripherals : led, button, uart and USB\nvoid board_init(void);\n\n// Init board after tinyusb is initialized\nvoid board_init_after_tusb(void);\n\n// Jump to bootloader\nvoid board_reset_to_bootloader(void);\n\n// Turn LED on or off\nvoid board_led_write(bool state);\n\n// Control led pattern using phase duration in ms.\n// For each phase, LED is toggle then repeated, board_led_task() is required to be called\n//void board_led_pattern(uint32_t const phase_ms[], uint8_t count);\n\n// Get the current state of button\n// a '1' means active (pressed), a '0' means inactive.\nuint32_t board_button_read(void);\n\n// Get board unique ID for USB serial number. Return number of bytes. Note max_len is typically 16\nsize_t board_get_unique_id(uint8_t id[], size_t max_len);\n\n// Get characters from UART. Return number of read bytes\nint board_uart_read(uint8_t *buf, int len);\n\n// Send characters to UART. Return number of sent bytes\nint board_uart_write(void const *buf, int len);\n\n//--------------------------------------------------------------------+\n// Helper functions\n//--------------------------------------------------------------------+\nstatic inline void board_led_on(void) {\n  board_led_write(true);\n}\n\nstatic inline void board_led_off(void) {\n  board_led_write(false);\n}\n\n// Get USB Serial number string from unique ID if available. Return number of character.\n// Input is string descriptor from index 1 (index 0 is type + len)\nstatic inline size_t board_usb_get_serial(uint16_t desc_str1[], size_t max_chars) {\n  uint8_t uid[16] TU_ATTR_ALIGNED(4);\n  size_t uid_len;\n\n  // TODO work with make, but not working with esp32s3 cmake\n  uid_len = board_get_unique_id(uid, sizeof(uid));\n\n  if ( uid_len > max_chars / 2u ) {\n    uid_len = max_chars / 2u;\n  }\n\n  for ( size_t i = 0; i < uid_len; i++ ) {\n    for ( size_t j = 0; j < 2; j++ ) {\n      const unsigned char nibble_to_hex[16] = {\n          '0', '1', '2', '3', '4', '5', '6', '7',\n          '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'\n      };\n      const uint8_t nibble = (uint8_t) ((uid[i] >> (j * 4u)) & 0xfu);\n      desc_str1[i * 2 + (1 - j)] = nibble_to_hex[nibble]; // UTF-16-LE\n    }\n  }\n\n  return 2 * uid_len;\n}\n\n// TODO remove\nstatic inline void board_delay(uint32_t ms) {\n  uint32_t start_ms = tusb_time_millis_api();\n  while ( tusb_time_millis_api() - start_ms < ms ) {\n    // take chance to run usb background\n    #if CFG_TUD_ENABLED\n    tud_task();\n    #endif\n\n    #if CFG_TUH_ENABLED\n    tuh_task();\n    #endif\n  }\n}\n\n// stdio getchar() is blocking, this is non-blocking version\nint board_getchar(void);\nvoid board_putchar(int c);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/broadcom_32bit/boards/raspberrypi_zero/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU arm1176jzf-s CACHE INTERNAL \"System Processor\")\n#set(SUFFIX \"\")\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    BCM_VERSION=2835\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/broadcom_32bit/boards/raspberrypi_zero/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Raspberry Pi Zero\n   url: https://www.raspberrypi.org/products/raspberry-pi-zero/\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/broadcom_32bit/boards/raspberrypi_zero/board.mk",
    "content": "CPU_CORE = arm1176jzf-s\nCFLAGS += -DBCM_VERSION=2835 \\\n          -DCFG_TUSB_MCU=OPT_MCU_BCM2835\n\nSUFFIX =\n"
  },
  {
    "path": "hw/bsp/broadcom_32bit/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Raspberry Pi\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\n#include \"broadcom/cpu.h\"\n#include \"broadcom/gpio.h\"\n#include \"broadcom/interrupts.h\"\n#include \"broadcom/mmu.h\"\n#include \"broadcom/caches.h\"\n#include \"broadcom/vcmailbox.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n// LED\n#define LED_PIN               18\n#define LED_STATE_ON          1\n\n// UART TX\n#define UART_TX_PIN           14\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\nvoid board_init(void) {\n  setup_mmu_flat_map();\n  init_caches();\n\n  // LED\n  gpio_set_function(LED_PIN, GPIO_FUNCTION_OUTPUT);\n  gpio_set_pull(LED_PIN, BP_PULL_NONE);\n  board_led_write(true);\n\n  // Uart\n  COMPLETE_MEMORY_READS;\n  AUX->ENABLES_b.UART_1 = true;\n\n  UART1->IER = 0;\n  UART1->CNTL = 0;\n  UART1->LCR_b.DATA_SIZE = UART1_LCR_DATA_SIZE_MODE_8BIT;\n  UART1->MCR = 0;\n  UART1->IER = 0;\n\n  uint32_t source_clock = vcmailbox_get_clock_rate_measured(VCMAILBOX_CLOCK_CORE);\n  UART1->BAUD = ((source_clock / (115200 * 8)) - 1);\n  UART1->CNTL |= UART1_CNTL_TX_ENABLE_Msk;\n  COMPLETE_MEMORY_READS;\n\n  gpio_set_function(UART_TX_PIN, GPIO_FUNCTION_ALT5);\n\n  // Turn on USB peripheral.\n  vcmailbox_set_power_state(VCMAILBOX_DEVICE_USB_HCD, true);\n\n  // Timer 1/1024 second tick\n  SYSTMR->CS_b.M1 = 1;\n  SYSTMR->C1 = SYSTMR->CLO + 977;\n  BP_EnableIRQ(TIMER_1_IRQn);\n\n  BP_SetPriority(USB_IRQn, 0x00);\n  BP_ClearPendingIRQ(USB_IRQn);\n  BP_EnableIRQ(USB_IRQn);\n  BP_EnableIRQs();\n}\n\nvoid board_led_write(bool state) {\n  gpio_set_value(LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  for (int i = 0; i < len; i++) {\n    const char* cbuf = buf;\n    while (!UART1->STAT_b.TX_READY) {}\n    if (cbuf[i] == '\\n') {\n      UART1->IO = '\\r';\n      while (!UART1->STAT_b.TX_READY) {}\n    }\n    UART1->IO = cbuf[i];\n  }\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid TIMER_1_IRQHandler(void) {\n  system_ticks++;\n  SYSTMR->C1 += 977;\n  SYSTMR->CS_b.M1 = 1;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  // asm(\"bkpt\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/broadcom_32bit/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/broadcom)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS BCM2835 CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${SDK_DIR}/broadcom/link.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/broadcom/boot.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/broadcom/gen/interrupt_handlers.c\n    ${SDK_DIR}/broadcom/gpio.c\n    ${SDK_DIR}/broadcom/interrupts.c\n    ${SDK_DIR}/broadcom/mmu.c\n    ${SDK_DIR}/broadcom/caches.c\n    ${SDK_DIR}/broadcom/vcmailbox.c\n    )\n  target_compile_options(${BOARD_TARGET} PUBLIC\n    -O0\n    -ffreestanding\n    -mgeneral-regs-only\n    -fno-exceptions\n    -std=c17\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_BCM2835)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      \"LINKER:--entry=_start\"\n      --specs=nosys.specs\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      \"LINKER:--entry=_start\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/broadcom_32bit/family.mk",
    "content": "MCU_DIR = hw/mcu/broadcom\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n\t-Wall \\\n\t-O0 \\\n\t-ffreestanding \\\n\t-nostdlib \\\n\t-nostartfiles \\\n\t-mgeneral-regs-only \\\n\t-fno-exceptions \\\n\t-std=c17\n\nCROSS_COMPILE = arm-none-eabi-\n\n# mcu driver cause following warnings\nCFLAGS_GCC += -Wno-error=cast-qual -Wno-error=redundant-decls\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(MCU_DIR)/broadcom/gen/interrupt_handlers.c \\\n\t$(MCU_DIR)/broadcom/gpio.c \\\n\t$(MCU_DIR)/broadcom/interrupts.c \\\n\t$(MCU_DIR)/broadcom/mmu.c \\\n\t$(MCU_DIR)/broadcom/caches.c \\\n\t$(MCU_DIR)/broadcom/vcmailbox.c\n\nLD_FILE = $(MCU_DIR)/broadcom/link$(SUFFIX).ld\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(MCU_DIR)\n\nSRC_S += $(MCU_DIR)/broadcom/boot$(SUFFIX).s\n\n$(BUILD)/kernel$(SUFFIX).img: $(BUILD)/$(PROJECT).elf\n\t$(OBJCOPY) -O binary $^ $@\n\n# Copy to kernel to netboot drive or SD card\n# Change destinaation to fit your need\nflash: $(BUILD)/kernel$(SUFFIX).img\n\t@$(CP) $< /home/$(USER)/Documents/code/pi_tinyusb/boot_cpy\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/boards/raspberrypi_cm4/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-a72 CACHE INTERNAL \"System Processor\")\nset(BCM_VERSION 2711)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/boards/raspberrypi_cm4/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Raspberry CM4\n   url: https://www.raspberrypi.org/products/compute-module-4\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/boards/raspberrypi_cm4/board.mk",
    "content": "CPU_CORE = cortex-a72\nCFLAGS += -DBCM_VERSION=2711 \\\n          -DCFG_TUSB_MCU=OPT_MCU_BCM2711\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/boards/raspberrypi_zero2/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-a53 CACHE INTERNAL \"System Processor\")\nset(BCM_VERSION 2837)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/boards/raspberrypi_zero2/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Raspberry Zero2\n   url: https://www.raspberrypi.org/products/raspberry-pi-zero-2-w\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/boards/raspberrypi_zero2/board.mk",
    "content": "CPU_CORE = cortex-a53\nCFLAGS += -DBCM_VERSION=2837 \\\n          -DCFG_TUSB_MCU=OPT_MCU_BCM2837\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Raspberry Pi\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\n#include \"broadcom/cpu.h\"\n#include \"broadcom/gpio.h\"\n#include \"broadcom/interrupts.h\"\n#include \"broadcom/mmu.h\"\n#include \"broadcom/caches.h\"\n#include \"broadcom/vcmailbox.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n// LED\n#define LED_PIN               18\n#define LED_STATE_ON          1\n\n// UART TX\n#define UART_TX_PIN           14\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\nvoid board_init(void) {\n  setup_mmu_flat_map();\n  init_caches();\n\n  // LED\n  gpio_set_function(LED_PIN, GPIO_FUNCTION_OUTPUT);\n  gpio_set_pull(LED_PIN, BP_PULL_NONE);\n  board_led_write(true);\n\n  // Uart\n  COMPLETE_MEMORY_READS;\n  AUX->ENABLES_b.UART_1 = true;\n\n  UART1->IER = 0;\n  UART1->CNTL = 0;\n  UART1->LCR_b.DATA_SIZE = UART1_LCR_DATA_SIZE_MODE_8BIT;\n  UART1->MCR = 0;\n  UART1->IER = 0;\n\n  uint32_t source_clock = vcmailbox_get_clock_rate_measured(VCMAILBOX_CLOCK_CORE);\n  UART1->BAUD = ((source_clock / (115200 * 8)) - 1);\n  UART1->CNTL |= UART1_CNTL_TX_ENABLE_Msk;\n  COMPLETE_MEMORY_READS;\n\n  gpio_set_function(UART_TX_PIN, GPIO_FUNCTION_ALT5);\n\n  // Turn on USB peripheral.\n  vcmailbox_set_power_state(VCMAILBOX_DEVICE_USB_HCD, true);\n\n  // Timer 1/1024 second tick\n  SYSTMR->CS_b.M1 = 1;\n  SYSTMR->C1 = SYSTMR->CLO + 977;\n  BP_EnableIRQ(TIMER_1_IRQn);\n\n  BP_SetPriority(USB_IRQn, 0x00);\n  BP_ClearPendingIRQ(USB_IRQn);\n  BP_EnableIRQ(USB_IRQn);\n  BP_EnableIRQs();\n}\n\nvoid board_led_write(bool state) {\n  gpio_set_value(LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  for (int i = 0; i < len; i++) {\n    const char* cbuf = buf;\n    while (!UART1->STAT_b.TX_READY) {}\n    if (cbuf[i] == '\\n') {\n      UART1->IO = '\\r';\n      while (!UART1->STAT_b.TX_READY) {}\n    }\n    UART1->IO = cbuf[i];\n  }\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid TIMER_1_IRQHandler(void) {\n  system_ticks++;\n  SYSTMR->C1 += 977;\n  SYSTMR->CS_b.M1 = 1;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  // asm(\"bkpt\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/broadcom)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/aarch64_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS BCM2711 BCM2835 CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${SDK_DIR}/broadcom/link8.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/broadcom/boot8.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/broadcom/gen/interrupt_handlers.c\n    ${SDK_DIR}/broadcom/gpio.c\n    ${SDK_DIR}/broadcom/interrupts.c\n    ${SDK_DIR}/broadcom/mmu.c\n    ${SDK_DIR}/broadcom/caches.c\n    ${SDK_DIR}/broadcom/vcmailbox.c\n    )\n  target_compile_options(${BOARD_TARGET} PUBLIC\n    -O0\n    -ffreestanding\n    -mgeneral-regs-only\n    -fno-exceptions\n    -std=c17\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BCM_VERSION=${BCM_VERSION}\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}\n    ${CMSIS_5}/CMSIS/Core_A/Include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_BCM${BCM_VERSION})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      \"LINKER:--entry=_start\"\n      --specs=nosys.specs\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      \"LINKER:--entry=_start\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/broadcom_64bit/family.mk",
    "content": "MCU_DIR = hw/mcu/broadcom\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n\t-Wall \\\n\t-O0 \\\n\t-ffreestanding \\\n\t-nostdlib \\\n\t-nostartfiles \\\n\t--specs=nosys.specs \\\n\t-mgeneral-regs-only \\\n\t-std=c17\n\nCROSS_COMPILE = aarch64-none-elf-\n\n# mcu driver cause following warnings\nCFLAGS_GCC += -Wno-error=cast-qual -Wno-error=redundant-decls\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(MCU_DIR)/broadcom/gen/interrupt_handlers.c \\\n\t$(MCU_DIR)/broadcom/gpio.c \\\n\t$(MCU_DIR)/broadcom/interrupts.c \\\n\t$(MCU_DIR)/broadcom/mmu.c \\\n\t$(MCU_DIR)/broadcom/caches.c \\\n\t$(MCU_DIR)/broadcom/vcmailbox.c\n\nLD_FILE = $(MCU_DIR)/broadcom/link8.ld\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(MCU_DIR) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core_A/Include\n\nSRC_S += $(MCU_DIR)/broadcom/boot8.s\n\n$(BUILD)/kernel8.img: $(BUILD)/$(PROJECT).elf\n\t$(OBJCOPY) -O binary $^ $@\n\n# Copy to kernel to netboot drive or SD card\n# Change destinaation to fit your need\nflash: $(BUILD)/kernel8.img\n\t@$(CP) $< /home/$(USER)/Documents/code/pi_tinyusb/boot_cpy\n"
  },
  {
    "path": "hw/bsp/ch32f20x/boards/ch32f205r-r0/board.cmake",
    "content": "set(MCU_VARIANT D8C)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CH32F20x_D8C\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32f20x/boards/ch32f205r-r0/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023, Denis Krasutski\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* metadata:\n   name: CH32F205r-r0\n   url: https://github.com/openwch/ch32f20x\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED: need to wire pin LED1 to PC0 in the P1 header\n#define LED_PORT              GPIOC\n#define LED_PIN               GPIO_Pin_1\n#define LED_STATE_ON          0\n#define LED_CLOCK_EN()        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)\n\n// Button: need to wire pin KEY to PC1 in the P1 header\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_Pin_0\n#define BUTTON_STATE_ACTIVE   0\n#define BUTTON_CLOCK_EN()     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)\n\n// UART\n#define UART_DEV              USART2\n#define UART_DEV_IRQn         USART2_IRQn\n#define UART_DEV_IRQHandler   USART2_IRQHandler\n#define UART_DEV_GPIO_PORT    GPIOA\n#define UART_DEV_TX_PIN       GPIO_Pin_2\n#define UART_DEV_CLK_EN()     do {                                                      \\\n                                RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);   \\\n                                RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  \\\n                              } while(0)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32f20x/boards/ch32f205r-r0/board.mk",
    "content": "LD_FILE = $(FAMILY_PATH)/ch32f205.ld\n\nSRC_S += \\\n\t$(FAMILY_PATH)/startup_gcc_ch32f20x_d8c.s\n\nCFLAGS += \\\n\t-DCH32F20x_D8C\n"
  },
  {
    "path": "hw/bsp/ch32f20x/ch32f205.ld",
    "content": "ENTRY(Reset_Handler)\n\n_Min_Heap_Size = 0x200;\n_Min_Stack_Size = 0x400;\n\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 128K\n  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 32K\n}\nSECTIONS\n{\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector))\n    . = ALIGN(4);\n  } >FLASH\n\n  .text :\n  {\n    . = ALIGN(4);\n    _stext = .;\n    *(.text)\n    *(.text*)\n    *(.glue_7)\n    *(.glue_7t)\n    *(.eh_frame)\n    KEEP (*(.init))\n    KEEP (*(.fini))\n    . = ALIGN(4);\n    _etext = .;\n  } >FLASH\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)\n    *(.rodata*)\n    . = ALIGN(4);\n  } >FLASH\n  .ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n  _sidata = LOADADDR(.data);\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;\n    *(.data)\n    *(.data*)\n    . = ALIGN(4);\n    _edata = .;\n  } >RAM AT> FLASH\n  . = ALIGN(4);\n  .bss :\n  {\n    _sbss = .;\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n    . = ALIGN(4);\n    _ebss = .;\n    __bss_end__ = _ebss;\n  } >RAM\n  ._user_heap_stack :\n  {\n    . = ALIGN(4);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    __HeapStart = .;\n    . = . + _Min_Heap_Size;\n    __HeapEnd = .;\n    __StackLimit = .;\n    . = . + _Min_Stack_Size;\n    __StackTop = .;\n    . = ALIGN(4);\n  } >RAM\n_estack = __StackTop;\n_sstack = __StackLimit;\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/ch32f20x/ch32f20x_conf.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : ch32f20x_conf.h\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2021/08/08\n * Description        : Library configuration file.\n *********************************************************************************\n * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n * Attention: This software (modified or not) and binary are used for\n * microcontroller manufactured by Nanjing Qinheng Microelectronics.\n *******************************************************************************/\n#ifndef __CH32F20x_CONF_H\n#define __CH32F20x_CONF_H\n\n#include \"ch32f20x_adc.h\"\n#include \"ch32f20x_bkp.h\"\n#include \"ch32f20x_can.h\"\n#include \"ch32f20x_crc.h\"\n#include \"ch32f20x_dac.h\"\n#include \"ch32f20x_dbgmcu.h\"\n#include \"ch32f20x_dma.h\"\n#include \"ch32f20x_exti.h\"\n#include \"ch32f20x_flash.h\"\n#include \"ch32f20x_fsmc.h\"\n#include \"ch32f20x_gpio.h\"\n#include \"ch32f20x_i2c.h\"\n#include \"ch32f20x_iwdg.h\"\n#include \"ch32f20x_pwr.h\"\n#include \"ch32f20x_rcc.h\"\n#include \"ch32f20x_rtc.h\"\n#include \"ch32f20x_sdio.h\"\n#include \"ch32f20x_spi.h\"\n#include \"ch32f20x_tim.h\"\n#include \"ch32f20x_usart.h\"\n#include \"ch32f20x_wwdg.h\"\n#include \"ch32f20x_it.h\"\n#include \"ch32f20x_misc.h\"\n\n#endif /* __CH32F20x_CONF_H */\n"
  },
  {
    "path": "hw/bsp/ch32f20x/ch32f20x_it.c",
    "content": "#include \"ch32f20x_it.h\"\n\n#include \"ch32f20x.h\"\n\n/* -------------------------------------------------------------------------- */\n\nvoid NMI_Handler(void) {\n\n}\n\n/* -------------------------------------------------------------------------- */\n\nvoid MemManage_Handler(void) {\n\n}\n\n/* -------------------------------------------------------------------------- */\n\nvoid BusFault_Handler(void) {\n\n}\n\n/* -------------------------------------------------------------------------- */\n\nvoid UsageFault_Handler(void) {\n\n}\n\n/* -------------------------------------------------------------------------- */\n\nvoid DebugMon_Handler(void) {\n\n}\n\n/* -------------------------------------------------------------------------- */\n"
  },
  {
    "path": "hw/bsp/ch32f20x/ch32f20x_it.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : ch32f20x_it.h\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2021/08/08\n * Description        : This file contains the headers of the interrupt handlers.\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#ifndef __CH32F20xIT_H\n#define __CH32F20xIT_H\n\n#include \"ch32f20x.h\"\n\nvoid NMI_Handler(void);\nvoid HardFault_Handler(void);\nvoid MemManage_Handler(void);\nvoid BusFault_Handler(void);\nvoid UsageFault_Handler(void);\nvoid DebugMon_Handler(void);\n\nvoid USBHS_IRQHandler(void);\nvoid SysTick_Handler(void);\n\n#endif /* __CH32F20xIT_H */\n"
  },
  {
    "path": "hw/bsp/ch32f20x/core_cm3.h",
    "content": "/* There is core_cm3.h wrapper just to avoid warnings from CMSIS headers */\n/* if you want use original file add to make file:\n    INC += \\\n        $(TOP)/$(CH32F20X_SDK_SRC)/CMSIS\n*/\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n\n#include <../../CMSIS/core_cm3.h>\n\n#pragma GCC diagnostic pop\n"
  },
  {
    "path": "hw/bsp/ch32f20x/debug_uart.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Denis Krasutski\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#include <ch32f20x.h>\n\n#include \"board.h\"\n#include \"debug_uart.h\"\n\n#define UART_RINGBUFFER_SIZE_TX 64\n#define UART_RINGBUFFER_MASK_TX (UART_RINGBUFFER_SIZE_TX-1)\n\nstatic char tx_buf[UART_RINGBUFFER_SIZE_TX];\nstatic unsigned int tx_produce = 0;\nstatic volatile unsigned int tx_consume = 0;\n\nvoid UART_DEV_IRQHandler(void)\n{\n  if(USART_GetITStatus(UART_DEV, USART_IT_TC) != RESET) {\n    USART_ClearITPendingBit(UART_DEV, USART_IT_TC);\n\n    if(tx_consume != tx_produce) {\n      USART_SendData(UART_DEV, tx_buf[tx_consume]);\n      tx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;\n    }\n  }\n}\n\nvoid uart_write(char c)\n{\n  unsigned int tx_produce_next = (tx_produce + 1) & UART_RINGBUFFER_MASK_TX;\n\n  NVIC_DisableIRQ(UART_DEV_IRQn);\n  if((tx_consume != tx_produce) || (USART_GetFlagStatus(UART_DEV, USART_FLAG_TXE) == RESET)) {\n    tx_buf[tx_produce] = c;\n    tx_produce = tx_produce_next;\n  } else {\n    USART_SendData(UART_DEV, c);\n  }\n  NVIC_EnableIRQ(UART_DEV_IRQn);\n}\n\nvoid uart_sync(void)\n{\n  while(tx_consume != tx_produce) {\n    //Waiting for transfer complete\n  }\n}\n\nvoid usart_printf_init(uint32_t baudrate)\n{\n  tx_produce = 0;\n  tx_consume = 0;\n\n  UART_DEV_CLK_EN();\n\n  GPIO_InitTypeDef gpio_config = {\n    .GPIO_Pin = UART_DEV_TX_PIN,\n    .GPIO_Speed = GPIO_Speed_50MHz,\n    .GPIO_Mode = GPIO_Mode_AF_PP,\n  };\n  GPIO_Init(UART_DEV_GPIO_PORT, &gpio_config);\n\n  USART_InitTypeDef uart_config = {\n    .USART_BaudRate = baudrate,\n    .USART_WordLength = USART_WordLength_8b,\n    .USART_StopBits = USART_StopBits_1,\n    .USART_Parity = USART_Parity_No,\n    .USART_HardwareFlowControl = USART_HardwareFlowControl_None,\n    .USART_Mode = USART_Mode_Tx,\n  };\n\n  USART_Init(UART_DEV, &uart_config);\n  USART_ITConfig(UART_DEV, USART_IT_TC, ENABLE);\n  USART_Cmd(UART_DEV, ENABLE);\n\n  NVIC_InitTypeDef nvic_config = {\n    .NVIC_IRQChannel = UART_DEV_IRQn,\n    .NVIC_IRQChannelPreemptionPriority = 1,\n    .NVIC_IRQChannelSubPriority = 3,\n    .NVIC_IRQChannelCmd = ENABLE,\n  };\n  NVIC_Init(&nvic_config);\n}\n"
  },
  {
    "path": "hw/bsp/ch32f20x/debug_uart.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Denis Krasutski\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include <stdint.h>\n\nvoid uart_write(char c);\nvoid uart_sync(void);\nvoid usart_printf_init(uint32_t baudrate);\n"
  },
  {
    "path": "hw/bsp/ch32f20x/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Denis Krasutski\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: WCH\n*/\n\n#include \"stdio.h\"\n#include \"debug_uart.h\"\n\n#include \"ch32f20x.h\"\n#include \"ch32f20x_it.h\"\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\nvoid USBHS_IRQHandler(void)\n{\n  tud_int_handler(0);\n}\n\nvoid board_init(void) {\n\n  /* Disable interrupts during init */\n  __disable_irq();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(SystemCoreClock / 1000);\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USBHS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n\tusart_printf_init(115200);\n\n  // USB HS Clock config\n  RCC_USBCLK48MConfig(RCC_USBCLK48MCLKSource_USBPHY);\n  RCC_USBHSPLLCLKConfig(RCC_HSBHSPLLCLKSource_HSE);\n  RCC_USBHSConfig(RCC_USBPLL_Div2);\n  RCC_USBHSPLLCKREFCLKConfig(RCC_USBHSPLLCKREFCLK_4M);\n  RCC_USBHSPHYPLLALIVEcmd(ENABLE);\n  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_USBHS, ENABLE);\n\n  // LED\n  LED_CLOCK_EN();\n  GPIO_InitTypeDef led_pin_config = {\n    .GPIO_Pin = LED_PIN,\n    .GPIO_Mode = GPIO_Mode_Out_OD,\n    .GPIO_Speed = GPIO_Speed_50MHz,\n  };\n  GPIO_Init(LED_PORT, &led_pin_config);\n\n  // Button\n  BUTTON_CLOCK_EN();\n  GPIO_InitTypeDef button_pin_config = {\n    .GPIO_Pin = BUTTON_PIN,\n    .GPIO_Mode = GPIO_Mode_IPU,\n    .GPIO_Speed = GPIO_Speed_50MHz,\n  };\n  GPIO_Init(BUTTON_PORT, &button_pin_config);\n\n  /* Enable interrupts globally */\n  __enable_irq();\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void)\n{\n  __asm(\"BKPT #0\\n\");\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  GPIO_WriteBit(LED_PORT, LED_PIN, state);\n}\n\nuint32_t board_button_read(void)\n{\n  return BUTTON_STATE_ACTIVE == GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t *buf, int len)\n{\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len)\n{\n  int txsize = len;\n  while ( txsize-- )\n  {\n    uart_write(*(uint8_t const*) buf);\n    buf++;\n  }\n  return len;\n}\n"
  },
  {
    "path": "hw/bsp/ch32f20x/family.cmake",
    "content": "include_guard()\n\nset(CH32_FAMILY ch32f20x)\nset(SDK_DIR ${TOP}/hw/mcu/wch/${CH32_FAMILY})\nset(SDK_SRC_DIR ${SDK_DIR}/EVT/EXAM/SRC)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS CH32F20X CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\n  set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/ch32f205.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\nif (NOT DEFINED STARTUP_FILE_GNU)\n  set(STARTUP_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/startup_gcc_ch32f20x_d8c.s)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_SRC_DIR}/StdPeriphDriver/src/${CH32_FAMILY}_gpio.c\n    ${SDK_SRC_DIR}/StdPeriphDriver/src/${CH32_FAMILY}_misc.c\n    ${SDK_SRC_DIR}/StdPeriphDriver/src/${CH32_FAMILY}_rcc.c\n    ${SDK_SRC_DIR}/StdPeriphDriver/src/${CH32_FAMILY}_usart.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/system_${CH32_FAMILY}.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/debug_uart.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_SRC_DIR}/StdPeriphDriver/inc\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_CH32F20X)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/wch/dcd_ch32_usbhs.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32f20x/family.mk",
    "content": "# Submodules\nCH32F20X_SDK = hw/mcu/wch/ch32f20x\n\n# WCH-SDK paths\nCH32F20X_SDK_SRC = $(CH32F20X_SDK)/EVT/EXAM/SRC\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m3\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_CH32F20X \\\n\t-DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n\nSRC_C += \\\n\tsrc/portable/wch/dcd_ch32_usbhs.c \\\n\t$(CH32F20X_SDK_SRC)/StdPeriphDriver/src/ch32f20x_gpio.c \\\n\t$(CH32F20X_SDK_SRC)/StdPeriphDriver/src/ch32f20x_misc.c \\\n\t$(CH32F20X_SDK_SRC)/StdPeriphDriver/src/ch32f20x_rcc.c \\\n\t$(CH32F20X_SDK_SRC)/StdPeriphDriver/src/ch32f20x_usart.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(CH32F20X_SDK_SRC)/StdPeriphDriver/inc\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM3\n\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/ch32f20x/startup_gcc_ch32f20x_d8c.s",
    "content": "/**\n  ******************************************************************************\n  * @file      startup_gcc_ch32f20x_d8c.s\n  * @author    Denis Krasutski\n  * @brief     CH32F205 Devices vector table\n  *            This module performs:\n  *                - Set the initial SP\n  *                - Set the initial PC == Reset_Handler,\n  *                - Set the vector table entries with the exceptions ISR address\n  *                - Branches to main in the C library (which eventually\n  *                  calls main()).\n  *            After Reset the Cortex-M3 processor is in Thread mode,\n  *            priority is Privileged, and the Stack is set to Main.\n  ******************************************************************************\n  */\n\n.syntax unified\n.cpu cortex-m3\n.thumb\n.global  g_pfnVectors\n.global  Default_Handler\n\n/* start address for the initialization values of the .data section. defined in linker script */\n.word  _sidata\n/* start address for the .data section. defined in linker script */\n.word  _sdata\n/* end address for the .data section. defined in linker script */\n.word  _edata\n/* start address for the .bss section. defined in linker script */\n.word  _sbss\n/* end address for the .bss section. defined in linker script */\n.word  _ebss\n\n.section  .text.Reset_Handler\n.weak  Reset_Handler\n.type  Reset_Handler, %function\nReset_Handler:\n  /* set stack pointer */\n  ldr   sp, =_estack\n  /* Call the clock system initialization function.*/\n  bl  SystemInit\n  /* Copy the data segment initializers from flash to SRAM */\n  ldr r0, =_sdata\n  ldr r1, =_edata\n  ldr r2, =_sidata\n  movs r3, #0\n  b LoopCopyDataInit\nCopyDataInit:\n  ldr r4, [r2, r3]\n  str r4, [r0, r3]\n  adds r3, r3, #4\nLoopCopyDataInit:\n  adds r4, r0, r3\n  cmp r4, r1\n  bcc CopyDataInit\n\n  /* Zero fill the bss segment. */\n  ldr r2, =_sbss\n  ldr r4, =_ebss\n  movs r3, #0\n  b LoopFillZerobss\nFillZerobss:\n  str  r3, [r2]\n  adds r2, r2, #4\nLoopFillZerobss:\n  cmp r2, r4\n  bcc FillZerobss\n  /* Call static constructors */\n  bl __libc_init_array\n  /* Call the application's entry point.*/\n  bl  main\n  bx  lr\n  .size  Reset_Handler, .-Reset_Handler\n\n.section  .text.Default_Handler,\"ax\",%progbits\nDefault_Handler:\nInfinite_Loop:\n  b  Infinite_Loop\n  .size  Default_Handler, .-Default_Handler\n\n/******************************************************************************\n*\n* The minimal vector table for a Cortex M3. Note that the proper constructs\n* must be placed on this to ensure that it ends up at physical address\n* 0x0000.0000.\n*\n*******************************************************************************/\n  .section  .isr_vector,\"a\",%progbits\n  .type  g_pfnVectors, %object\n  .size  g_pfnVectors, .-g_pfnVectors\n\ng_pfnVectors:\n  .word  _estack\n  .word  Reset_Handler\n  .word  NMI_Handler\n  .word  HardFault_Handler\n  .word  MemManage_Handler\n  .word  BusFault_Handler\n  .word  UsageFault_Handler\n  .word  0\n  .word  0\n  .word  0\n  .word  0\n  .word  SVC_Handler\n  .word  DebugMon_Handler\n  .word  0\n  .word  PendSV_Handler\n  .word  SysTick_Handler\n\n/*******************************************************************************\n External Interrupts\n*******************************************************************************/\n.word     WWDG_IRQHandler\n.word     PVD_IRQHandler\n.word     TAMPER_IRQHandler\n.word     RTC_IRQHandler\n.word     FLASH_IRQHandler\n.word     RCC_IRQHandler\n.word     EXTI0_IRQHandler\n.word     EXTI1_IRQHandler\n.word     EXTI2_IRQHandler\n.word     EXTI3_IRQHandler\n.word     EXTI4_IRQHandler\n.word     DMA1_Channel1_IRQHandler\n.word     DMA1_Channel2_IRQHandler\n.word     DMA1_Channel3_IRQHandler\n.word     DMA1_Channel4_IRQHandler\n.word     DMA1_Channel5_IRQHandler\n.word     DMA1_Channel6_IRQHandler\n.word     DMA1_Channel7_IRQHandler\n.word     ADC1_2_IRQHandler\n.word     USB_HP_CAN1_TX_IRQHandler\n.word     USB_LP_CAN1_RX0_IRQHandler\n.word     CAN1_RX1_IRQHandler\n.word     CAN1_SCE_IRQHandler\n.word     EXTI9_5_IRQHandler\n.word     TIM1_BRK_IRQHandler\n.word     TIM1_UP_IRQHandler\n.word     TIM1_TRG_COM_IRQHandler\n.word     TIM1_CC_IRQHandler\n.word     TIM2_IRQHandler\n.word     TIM3_IRQHandler\n.word     TIM4_IRQHandler\n.word     I2C1_EV_IRQHandler\n.word     I2C1_ER_IRQHandler\n.word     I2C2_EV_IRQHandler\n.word     I2C2_ER_IRQHandler\n.word     SPI1_IRQHandler\n.word     SPI2_IRQHandler\n.word     USART1_IRQHandler\n.word     USART2_IRQHandler\n.word     USART3_IRQHandler\n.word     EXTI15_10_IRQHandler\n.word     RTCAlarm_IRQHandler\n.word     0\n.word     TIM8_BRK_IRQHandler\n.word     TIM8_UP_IRQHandler\n.word     TIM8_TRG_COM_IRQHandler\n.word     TIM8_CC_IRQHandler\n.word     RNG_IRQHandler\n.word     FSMC_IRQHandler\n.word     SDIO_IRQHandler\n.word     TIM5_IRQHandler\n.word     SPI3_IRQHandler\n.word     UART4_IRQHandler\n.word     UART5_IRQHandler\n.word     TIM6_IRQHandler\n.word     TIM7_IRQHandler\n.word     DMA2_Channel1_IRQHandler\n.word     DMA2_Channel2_IRQHandler\n.word     DMA2_Channel3_IRQHandler\n.word     DMA2_Channel4_IRQHandler\n.word     DMA2_Channel5_IRQHandler\n.word     ETH_IRQHandler\n.word     ETH_WKUP_IRQHandler\n.word     CAN2_TX_IRQHandler\n.word     CAN2_RX0_IRQHandler\n.word     CAN2_RX1_IRQHandler\n.word     CAN2_SCE_IRQHandler\n.word     OTG_FS_IRQHandler\n.word     USBHSWakeup_IRQHandler\n.word     USBHS_IRQHandler\n.word     DVP_IRQHandler\n.word     UART6_IRQHandler\n.word     UART7_IRQHandler\n.word     UART8_IRQHandler\n.word     TIM9_BRK_IRQHandler\n.word     TIM9_UP_IRQHandler\n.word     TIM9_TRG_COM_IRQHandler\n.word     TIM9_CC_IRQHandler\n.word     TIM10_BRK_IRQHandler\n.word     TIM10_UP_IRQHandler\n.word     TIM10_TRG_COM_IRQHandler\n.word     TIM10_CC_IRQHandler\n.word     DMA2_Channel6_IRQHandler\n.word     DMA2_Channel7_IRQHandler\n.word     DMA2_Channel8_IRQHandler\n.word     DMA2_Channel9_IRQHandler\n.word     DMA2_Channel10_IRQHandler\n.word     DMA2_Channel11_IRQHandler\n\n/*******************************************************************************\n*\n* Provide weak aliases\n*\n*******************************************************************************/\n.weak NMI_Handler\n.thumb_set NMI_Handler,Default_Handler\n\n.weak HardFault_Handler\n.thumb_set HardFault_Handler,Default_Handler\n\n.weak MemManage_Handler\n.thumb_set MemManage_Handler,Default_Handler\n\n.weak BusFault_Handler\n.thumb_set BusFault_Handler,Default_Handler\n\n.weak UsageFault_Handler\n.thumb_set UsageFault_Handler,Default_Handler\n\n.weak SVC_Handler\n.thumb_set SVC_Handler,Default_Handler\n\n.weak DebugMon_Handler\n.thumb_set DebugMon_Handler,Default_Handler\n\n.weak PendSV_Handler\n.thumb_set PendSV_Handler,Default_Handler\n\n.weak SysTick_Handler\n.thumb_set SysTick_Handler,Default_Handler\n\n.weak WWDG_IRQHandler\n.thumb_set WWDG_IRQHandler,Default_Handler\n\n.weak PVD_IRQHandler\n.thumb_set PVD_IRQHandler,Default_Handler\n\n.weak TAMPER_IRQHandler\n.thumb_set TAMPER_IRQHandler,Default_Handler\n\n.weak RTC_IRQHandler\n.thumb_set RTC_IRQHandler,Default_Handler\n\n.weak FLASH_IRQHandler\n.thumb_set FLASH_IRQHandler,Default_Handler\n\n.weak RCC_IRQHandler\n.thumb_set RCC_IRQHandler,Default_Handler\n\n.weak EXTI0_IRQHandler\n.thumb_set EXTI0_IRQHandler,Default_Handler\n\n.weak EXTI1_IRQHandler\n.thumb_set EXTI1_IRQHandler,Default_Handler\n\n.weak EXTI2_IRQHandler\n.thumb_set EXTI2_IRQHandler,Default_Handler\n\n.weak EXTI3_IRQHandler\n.thumb_set EXTI3_IRQHandler,Default_Handler\n\n.weak EXTI4_IRQHandler\n.thumb_set EXTI4_IRQHandler,Default_Handler\n\n.weak DMA1_Channel1_IRQHandler\n.thumb_set DMA1_Channel1_IRQHandler,Default_Handler\n\n.weak DMA1_Channel2_IRQHandler\n.thumb_set DMA1_Channel2_IRQHandler,Default_Handler\n\n.weak DMA1_Channel3_IRQHandler\n.thumb_set DMA1_Channel3_IRQHandler,Default_Handler\n\n.weak DMA1_Channel4_IRQHandler\n.thumb_set DMA1_Channel4_IRQHandler,Default_Handler\n\n.weak DMA1_Channel5_IRQHandler\n.thumb_set DMA1_Channel5_IRQHandler,Default_Handler\n\n.weak DMA1_Channel6_IRQHandler\n.thumb_set DMA1_Channel6_IRQHandler,Default_Handler\n\n.weak DMA1_Channel7_IRQHandler\n.thumb_set DMA1_Channel7_IRQHandler,Default_Handler\n\n.weak ADC1_2_IRQHandler\n.thumb_set ADC1_2_IRQHandler,Default_Handler\n\n.weak USB_HP_CAN1_TX_IRQHandler\n.thumb_set USB_HP_CAN1_TX_IRQHandler,Default_Handler\n\n.weak USB_LP_CAN1_RX0_IRQHandler\n.thumb_set USB_LP_CAN1_RX0_IRQHandler,Default_Handler\n\n.weak CAN1_RX1_IRQHandler\n.thumb_set CAN1_RX1_IRQHandler,Default_Handler\n\n.weak CAN1_SCE_IRQHandler\n.thumb_set CAN1_SCE_IRQHandler,Default_Handler\n\n.weak EXTI9_5_IRQHandler\n.thumb_set EXTI9_5_IRQHandler,Default_Handler\n\n.weak TIM1_BRK_IRQHandler\n.thumb_set TIM1_BRK_IRQHandler,Default_Handler\n\n.weak TIM1_UP_IRQHandler\n.thumb_set TIM1_UP_IRQHandler,Default_Handler\n\n.weak TIM1_TRG_COM_IRQHandler\n.thumb_set TIM1_TRG_COM_IRQHandler,Default_Handler\n\n.weak TIM1_CC_IRQHandler\n.thumb_set TIM1_CC_IRQHandler,Default_Handler\n\n.weak TIM2_IRQHandler\n.thumb_set TIM2_IRQHandler,Default_Handler\n\n.weak TIM3_IRQHandler\n.thumb_set TIM3_IRQHandler,Default_Handler\n\n.weak TIM4_IRQHandler\n.thumb_set TIM4_IRQHandler,Default_Handler\n\n.weak I2C1_EV_IRQHandler\n.thumb_set I2C1_EV_IRQHandler,Default_Handler\n\n.weak I2C1_ER_IRQHandler\n.thumb_set I2C1_ER_IRQHandler,Default_Handler\n\n.weak I2C2_EV_IRQHandler\n.thumb_set I2C2_EV_IRQHandler,Default_Handler\n\n.weak I2C2_ER_IRQHandler\n.thumb_set I2C2_ER_IRQHandler,Default_Handler\n\n.weak SPI1_IRQHandler\n.thumb_set SPI1_IRQHandler,Default_Handler\n\n.weak SPI2_IRQHandler\n.thumb_set SPI2_IRQHandler,Default_Handler\n\n.weak USART1_IRQHandler\n.thumb_set USART1_IRQHandler,Default_Handler\n\n.weak USART2_IRQHandler\n.thumb_set USART2_IRQHandler,Default_Handler\n\n.weak USART3_IRQHandler\n.thumb_set USART3_IRQHandler,Default_Handler\n\n.weak EXTI15_10_IRQHandler\n.thumb_set EXTI15_10_IRQHandler,Default_Handler\n\n.weak RTCAlarm_IRQHandler\n.thumb_set RTCAlarm_IRQHandler,Default_Handler\n\n.weak TIM8_BRK_IRQHandler\n.thumb_set TIM8_BRK_IRQHandler,Default_Handler\n\n.weak TIM8_UP_IRQHandler\n.thumb_set TIM8_UP_IRQHandler,Default_Handler\n\n.weak TIM8_TRG_COM_IRQHandler\n.thumb_set TIM8_TRG_COM_IRQHandler,Default_Handler\n\n.weak TIM8_CC_IRQHandler\n.thumb_set TIM8_CC_IRQHandler,Default_Handler\n\n.weak RNG_IRQHandler\n.thumb_set RNG_IRQHandler,Default_Handler\n\n.weak FSMC_IRQHandler\n.thumb_set FSMC_IRQHandler,Default_Handler\n\n.weak SDIO_IRQHandler\n.thumb_set SDIO_IRQHandler,Default_Handler\n\n.weak TIM5_IRQHandler\n.thumb_set TIM5_IRQHandler,Default_Handler\n\n.weak SPI3_IRQHandler\n.thumb_set SPI3_IRQHandler,Default_Handler\n\n.weak UART4_IRQHandler\n.thumb_set UART4_IRQHandler,Default_Handler\n\n.weak UART5_IRQHandler\n.thumb_set UART5_IRQHandler,Default_Handler\n\n.weak TIM6_IRQHandler\n.thumb_set TIM6_IRQHandler,Default_Handler\n\n.weak TIM7_IRQHandler\n.thumb_set TIM7_IRQHandler,Default_Handler\n\n.weak DMA2_Channel1_IRQHandler\n.thumb_set DMA2_Channel1_IRQHandler,Default_Handler\n\n.weak DMA2_Channel2_IRQHandler\n.thumb_set DMA2_Channel2_IRQHandler,Default_Handler\n\n.weak DMA2_Channel3_IRQHandler\n.thumb_set DMA2_Channel3_IRQHandler,Default_Handler\n\n.weak DMA2_Channel4_IRQHandler\n.thumb_set DMA2_Channel4_IRQHandler,Default_Handler\n\n.weak DMA2_Channel5_IRQHandler\n.thumb_set DMA2_Channel5_IRQHandler,Default_Handler\n\n.weak ETH_IRQHandler\n.thumb_set ETH_IRQHandler,Default_Handler\n\n.weak ETH_WKUP_IRQHandler\n.thumb_set ETH_WKUP_IRQHandler,Default_Handler\n\n.weak CAN2_TX_IRQHandler\n.thumb_set CAN2_TX_IRQHandler,Default_Handler\n\n.weak CAN2_RX0_IRQHandler\n.thumb_set CAN2_RX0_IRQHandler,Default_Handler\n\n.weak CAN2_RX1_IRQHandler\n.thumb_set CAN2_RX1_IRQHandler,Default_Handler\n\n.weak CAN2_SCE_IRQHandler\n.thumb_set CAN2_SCE_IRQHandler,Default_Handler\n\n.weak OTG_FS_IRQHandler\n.thumb_set OTG_FS_IRQHandler,Default_Handler\n\n.weak USBHSWakeup_IRQHandler\n.thumb_set USBHSWakeup_IRQHandler,Default_Handler\n\n.weak USBHS_IRQHandler\n.thumb_set USBHS_IRQHandler,Default_Handler\n\n.weak DVP_IRQHandler\n.thumb_set DVP_IRQHandler,Default_Handler\n\n.weak UART6_IRQHandler\n.thumb_set UART6_IRQHandler,Default_Handler\n\n.weak UART7_IRQHandler\n.thumb_set UART7_IRQHandler,Default_Handler\n\n.weak UART8_IRQHandler\n.thumb_set UART8_IRQHandler,Default_Handler\n\n.weak TIM9_BRK_IRQHandler\n.thumb_set TIM9_BRK_IRQHandler,Default_Handler\n\n.weak TIM9_UP_IRQHandler\n.thumb_set TIM9_UP_IRQHandler,Default_Handler\n\n.weak TIM9_TRG_COM_IRQHandler\n.thumb_set TIM9_TRG_COM_IRQHandler,Default_Handler\n\n.weak TIM9_CC_IRQHandler\n.thumb_set TIM9_CC_IRQHandler,Default_Handler\n\n.weak TIM10_BRK_IRQHandler\n.thumb_set TIM10_BRK_IRQHandler,Default_Handler\n\n.weak TIM10_UP_IRQHandler\n.thumb_set TIM10_UP_IRQHandler,Default_Handler\n\n.weak TIM10_TRG_COM_IRQHandler\n.thumb_set TIM10_TRG_COM_IRQHandler,Default_Handler\n\n.weak TIM10_CC_IRQHandler\n.thumb_set TIM10_CC_IRQHandler,Default_Handler\n\n.weak DMA2_Channel6_IRQHandler\n.thumb_set DMA2_Channel6_IRQHandler,Default_Handler\n\n.weak DMA2_Channel7_IRQHandler\n.thumb_set DMA2_Channel7_IRQHandler,Default_Handler\n\n.weak DMA2_Channel8_IRQHandler\n.thumb_set DMA2_Channel8_IRQHandler,Default_Handler\n\n.weak DMA2_Channel9_IRQHandler\n.thumb_set DMA2_Channel9_IRQHandler,Default_Handler\n\n.weak DMA2_Channel10_IRQHandler\n.thumb_set DMA2_Channel10_IRQHandler,Default_Handler\n\n.weak DMA2_Channel11_IRQHandler\n.thumb_set DMA2_Channel11_IRQHandler,Default_Handler\n"
  },
  {
    "path": "hw/bsp/ch32f20x/system_ch32f20x.c",
    "content": "/********************************** (C) COPYRIGHT *******************************\n* File Name          : system_ch32f20x.c\n* Author             : WCH\n* Version            : V1.0.0\n* Date               : 2021/08/08\n* Description        : CH32F20x Device Peripheral Access Layer System Source File.\n*                      For CH32F208 HSE = 32Mhz\n*                      For others   HSE = 8Mhz\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#include \"ch32f20x.h\"\n\n/*\n* Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after\n* reset the HSI is used as SYSCLK source).\n* If none of the define below is enabled, the HSI is used as System clock source.\n*/\n\n//#define SYSCLK_FREQ_HSE    HSE_VALUE\n//#define SYSCLK_FREQ_48MHz_HSE  48000000\n//#define SYSCLK_FREQ_56MHz_HSE  56000000\n//#define SYSCLK_FREQ_72MHz_HSE  72000000\n#define SYSCLK_FREQ_96MHz_HSE  96000000\n//#define SYSCLK_FREQ_120MHz_HSE  120000000\n//#define SYSCLK_FREQ_144MHz_HSE  144000000\n//#define SYSCLK_FREQ_HSI    HSI_VALUE\n//#define SYSCLK_FREQ_48MHz_HSI  48000000\n//#define SYSCLK_FREQ_56MHz_HSI  56000000\n//#define SYSCLK_FREQ_72MHz_HSI  72000000\n//#define SYSCLK_FREQ_96MHz_HSI  96000000\n//#define SYSCLK_FREQ_120MHz_HSI  120000000\n//#define SYSCLK_FREQ_144MHz_HSI  144000000\n\n\n/* Uncomment the following line if you need to relocate your vector Table in Internal SRAM */\n/* #define VECT_TAB_SRAM */\n\n/* Vector Table base offset field This value must be a multiple of 0x200 */\n#define VECT_TAB_OFFSET  0x0\n\n/* Clock Definitions */\n#ifdef SYSCLK_FREQ_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;              /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_48MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_56MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_72MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_96MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_96MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_120MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_120MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_144MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_144MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_48MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_56MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_72MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_96MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_96MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_120MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_120MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_144MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_144MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#else\nuint32_t SystemCoreClock         = HSI_VALUE;                    /* System Clock Frequency (Core Clock) */\n\n#endif\n\n__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};\n\n/* system_private_function_proto_types */\nstatic void SetSysClock( void );\n\n#ifdef SYSCLK_FREQ_HSE\nstatic void SetSysClockToHSE( void );\n#elif defined SYSCLK_FREQ_48MHz_HSE\nstatic void SetSysClockTo48_HSE( void );\n#elif defined SYSCLK_FREQ_56MHz_HSE\nstatic void SetSysClockTo56_HSE( void );\n#elif defined SYSCLK_FREQ_72MHz_HSE\nstatic void SetSysClockTo72_HSE( void );\n#elif defined SYSCLK_FREQ_96MHz_HSE\nstatic void SetSysClockTo96_HSE( void );\n#elif defined SYSCLK_FREQ_120MHz_HSE\nstatic void SetSysClockTo120_HSE( void );\n#elif defined SYSCLK_FREQ_144MHz_HSE\nstatic void SetSysClockTo144_HSE( void );\n#elif defined SYSCLK_FREQ_48MHz_HSI\nstatic void SetSysClockTo48_HSI( void );\n#elif defined SYSCLK_FREQ_56MHz_HSI\nstatic void SetSysClockTo56_HSI( void );\n#elif defined SYSCLK_FREQ_72MHz_HSI\nstatic void SetSysClockTo72_HSI( void );\n#elif defined SYSCLK_FREQ_96MHz_HSI\nstatic void SetSysClockTo96_HSI( void );\n#elif defined SYSCLK_FREQ_120MHz_HSI\nstatic void SetSysClockTo120_HSI( void );\n#elif defined SYSCLK_FREQ_144MHz_HSI\nstatic void SetSysClockTo144_HSI( void );\n\n#endif\n\n\n/*********************************************************************\n * @fn      SystemInit\n *\n * @brief   Setup the microcontroller system Initialize the Embedded Flash Interface,\n *        the PLL and update the SystemCoreClock variable.\n *\n * @return  none\n */\nvoid SystemInit( void )\n{\n    RCC->CTLR |= ( uint32_t )0x00000001;\n\n#ifdef CH32F20x_D8C\n    RCC->CFGR0 &= ( uint32_t )0xF8FF0000;\n#else\n    RCC->CFGR0 &= ( uint32_t )0xF0FF0000;\n#endif\n\n    RCC->CTLR &= ( uint32_t )0xFEF6FFFF;\n    RCC->CTLR &= ( uint32_t )0xFFFBFFFF;\n    RCC->CFGR0 &= ( uint32_t )0xFF80FFFF;\n#ifdef CH32F20x_D8C\n    RCC->CTLR &= ( uint32_t )0xEBFFFFFF;\n    RCC->INTR = 0x00FF0000;\n    RCC->CFGR2 = 0x00000000;\n#else\n    RCC->INTR = 0x009F0000;\n#endif\n\n    SetSysClock();\n\n#ifdef VECT_TAB_SRAM\n    SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM. */\n#else\n    SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH. */\n#endif\n}\n\n/*********************************************************************\n * @fn      SystemCoreClockUpdate\n *\n * @brief   Update SystemCoreClock variable according to Clock Register Values.\n *\n * @return  none\n */\nvoid SystemCoreClockUpdate( void )\n{\n    uint32_t tmp = 0, pllmull = 0, pllsource = 0;\n\t  uint8_t Pll_6_5 = 0;\n\n#if defined (CH32F20x_D8C)\n   \tuint8_t Pll2mull = 0;\n\n#endif\n\n    tmp = RCC->CFGR0 & RCC_SWS;\n\n    switch( tmp )\n    {\n        case 0x00:\n            SystemCoreClock = HSI_VALUE;\n            break;\n        case 0x04:\n            SystemCoreClock = HSE_VALUE;\n            break;\n        case 0x08:\n            pllmull = RCC->CFGR0 & RCC_PLLMULL;\n            pllsource = RCC->CFGR0 & RCC_PLLSRC;\n            pllmull = ( pllmull >> 18 ) + 2;\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n            if( pllmull == 17 )\n            {\n                pllmull = 18;\n            }\n#else\n            if( pllmull == 2 )\n            {\n                pllmull = 18;\n            }\n            if( pllmull == 15 )\n            {\n                pllmull = 13;  /* *6.5 */\n                Pll_6_5 = 1;\n            }\n            if( pllmull == 16 )\n            {\n                pllmull = 15;\n            }\n            if( pllmull == 17 )\n            {\n                pllmull = 16;\n            }\n#endif\n\n            if( pllsource == 0x00 )\n            {\n\t\t\t\t\t\t\t\tif(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE) SystemCoreClock = HSI_VALUE * pllmull;\n\t\t\t\t\t\t\t\telse SystemCoreClock = (HSI_VALUE >> 1) * pllmull;\n            }\n            else\n            {\n#if defined (CH32F20x_D8C)\n\t          if(RCC->CFGR2 & (1<<16)){ /* PLL2 */\n              SystemCoreClock = HSE_VALUE/(((RCC->CFGR2 & 0xF0)>>4) + 1);  /* PREDIV2 */\n\n              Pll2mull = (uint8_t)((RCC->CFGR2 & 0xF00)>>8);\n\n              if(Pll2mull == 0) SystemCoreClock = (SystemCoreClock * 5)>>1;\n              else if(Pll2mull == 1) SystemCoreClock = (SystemCoreClock * 25)>>1;\n              else if(Pll2mull == 15) SystemCoreClock = SystemCoreClock * 20;\n              else  SystemCoreClock = SystemCoreClock * (Pll2mull + 2);\n\n              SystemCoreClock = SystemCoreClock/((RCC->CFGR2 & 0xF) + 1);  /* PREDIV1 */\n          }\n          else{/* HSE */\n              SystemCoreClock = HSE_VALUE/((RCC->CFGR2 & 0xF) + 1);  /* PREDIV1 */\n          }\n\n          SystemCoreClock = SystemCoreClock * pllmull;\n#else\n\n#if defined (CH32F20x_D8W)\n\t\t\t\t\t\t\t\tif((RCC->CFGR0 & (3<<22)) == (3<<22))\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tSystemCoreClock = ((HSE_VALUE>>1)) * pllmull;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n#endif\n                if( ( RCC->CFGR0 & RCC_PLLXTPRE ) != ( uint32_t )RESET )\n                {\n#ifdef CH32F20x_D8W\n                    SystemCoreClock = ( ( HSE_VALUE >> 2 ) >> 1 ) * pllmull;\n#else\n                    SystemCoreClock = ( HSE_VALUE >> 1 ) * pllmull;\n#endif\n                }\n                else\n                {\n#ifdef CH32F20x_D8W\n                    SystemCoreClock = ( HSE_VALUE >> 2 ) * pllmull;\n#else\n                    SystemCoreClock = HSE_VALUE * pllmull;\n#endif\n\n                }\n#endif\n            }\n\n            if( Pll_6_5 == 1 ) SystemCoreClock = ( SystemCoreClock / 2 );\n\n            break;\n        default:\n            SystemCoreClock = HSI_VALUE;\n            break;\n    }\n\n    tmp = AHBPrescTable[( ( RCC->CFGR0 & RCC_HPRE ) >> 4 )];\n    SystemCoreClock >>= tmp;\n}\n\n\n\n/*********************************************************************\n * @fn      SetSysClock\n *\n * @brief   Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClock( void )\n{\n#ifdef SYSCLK_FREQ_HSE\n    SetSysClockToHSE();\n#elif defined SYSCLK_FREQ_48MHz_HSE\n    SetSysClockTo48_HSE();\n#elif defined SYSCLK_FREQ_56MHz_HSE\n    SetSysClockTo56_HSE();\n#elif defined SYSCLK_FREQ_72MHz_HSE\n    SetSysClockTo72_HSE();\n#elif defined SYSCLK_FREQ_96MHz_HSE\n    SetSysClockTo96_HSE();\n#elif defined SYSCLK_FREQ_120MHz_HSE\n    SetSysClockTo120_HSE();\n#elif defined SYSCLK_FREQ_144MHz_HSE\n    SetSysClockTo144_HSE();\n#elif defined SYSCLK_FREQ_48MHz_HSI\n    SetSysClockTo48_HSI();\n#elif defined SYSCLK_FREQ_56MHz_HSI\n    SetSysClockTo56_HSI();\n#elif defined SYSCLK_FREQ_72MHz_HSI\n    SetSysClockTo72_HSI();\n#elif defined SYSCLK_FREQ_96MHz_HSI\n    SetSysClockTo96_HSI();\n#elif defined SYSCLK_FREQ_120MHz_HSI\n    SetSysClockTo120_HSI();\n#elif defined SYSCLK_FREQ_144MHz_HSI\n    SetSysClockTo144_HSI();\n\n#endif\n\n    /* If none of the define above is enabled, the HSI is used as System clock\n     * source (default after reset)\n    */\n}\n\n\n#ifdef SYSCLK_FREQ_HSE\n\n/*********************************************************************\n * @fn      SetSysClockToHSE\n *\n * @brief   Sets HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockToHSE( void )\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n\n    RCC->CTLR |= ( ( uint32_t )RCC_HSEON );\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    }\n    while( ( HSEStatus == 0 ) && ( StartUpCounter != HSE_STARTUP_TIMEOUT ) );\n\n    if( ( RCC->CTLR & RCC_HSERDY ) != RESET )\n    {\n        HSEStatus = ( uint32_t )0x01;\n    }\n    else\n    {\n        HSEStatus = ( uint32_t )0x00;\n    }\n\n    if( HSEStatus == ( uint32_t )0x01 )\n    {\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV1;\n\n         /* Select HSE as system clock source\n          *   CH32F20x_D6 (HSE=8Mhz)\n          *   CH32F20x_D8 (HSE=8Mhz)\n          *   CH32F20x_D8W (HSE=32Mhz)\n          */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n        RCC->CFGR0 |= ( uint32_t )RCC_SW_HSE;\n\n        /* Wait till HSE is used as system clock source */\n        while( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x04 )\n        {\n        }\n    }\n    else\n    {\n        /* If HSE fails to start-up, the application will have wrong clock\n        * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n#elif defined SYSCLK_FREQ_48MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo48_HSE\n *\n * @brief   Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo48_HSE( void )\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n\n    RCC->CTLR |= ( ( uint32_t )RCC_HSEON );\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    }\n    while( ( HSEStatus == 0 ) && ( StartUpCounter != HSE_STARTUP_TIMEOUT ) );\n\n    if( ( RCC->CTLR & RCC_HSERDY ) != RESET )\n    {\n        HSEStatus = ( uint32_t )0x01;\n    }\n    else\n    {\n        HSEStatus = ( uint32_t )0x00;\n    }\n\n    if( HSEStatus == ( uint32_t )0x01 )\n    {\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n        /*  CH32F20x_D6-PLL configuration: PLLCLK = HSE * 6 = 48 MHz (HSE=8Mhz)\n         *  CH32F20x_D8-PLL configuration: PLLCLK = HSE * 6 = 48 MHz (HSE=8Mhz)\n         *  CH32F20x_D8W-PLL configuration: PLLCLK = HSE/4 * 6 = 48 MHz(HSE=32Mhz)\n         */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6 );\n#else\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6_EXTEN );\n#endif\n\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n        {\n        }\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n        RCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n        * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n#elif defined SYSCLK_FREQ_56MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo56_HSE\n *\n * @brief   Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo56_HSE( void )\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ( ( uint32_t )RCC_HSEON );\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    }\n    while( ( HSEStatus == 0 ) && ( StartUpCounter != HSE_STARTUP_TIMEOUT ) );\n\n    if( ( RCC->CTLR & RCC_HSERDY ) != RESET )\n    {\n        HSEStatus = ( uint32_t )0x01;\n    }\n    else\n    {\n        HSEStatus = ( uint32_t )0x00;\n    }\n\n    if( HSEStatus == ( uint32_t )0x01 )\n    {\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n        /*  CH32F20x_D6-PLL configuration: PLLCLK = HSE * 7 = 56 MHz (HSE=8Mhz)\n         *  CH32F20x_D8-PLL configuration: PLLCLK = HSE * 7 = 56 MHz (HSE=8Mhz)\n         *  CH32F20x_D8W-PLL configuration: PLLCLK = HSE/4 * 7 = 56 MHz(HSE=32Mhz)\n         */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7 );\n#else\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7_EXTEN );\n#endif\n\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n        {\n        }\n\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n        RCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n        * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n#elif defined SYSCLK_FREQ_72MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo72_HSE\n *\n * @brief   Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo72_HSE( void )\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ( ( uint32_t )RCC_HSEON );\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    }\n    while( ( HSEStatus == 0 ) && ( StartUpCounter != HSE_STARTUP_TIMEOUT ) );\n\n    if( ( RCC->CTLR & RCC_HSERDY ) != RESET )\n    {\n        HSEStatus = ( uint32_t )0x01;\n    }\n    else\n    {\n        HSEStatus = ( uint32_t )0x00;\n    }\n\n    if( HSEStatus == ( uint32_t )0x01 )\n    {\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n         /*  CH32F20x_D6-PLL configuration: PLLCLK = HSE * 9 = 72 MHz (HSE=8Mhz)\n          *  CH32F20x_D8-PLL configuration: PLLCLK = HSE * 9 = 72 MHz (HSE=8Mhz)\n          *  CH32F20x_D8W-PLL configuration: PLLCLK = HSE/4 * 9 = 72 MHz(HSE=32Mhz)\n          */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE |\n                                    RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9 );\n#else\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9_EXTEN );\n#endif\n\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n        {\n        }\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n        RCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n        * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n\n#elif defined SYSCLK_FREQ_96MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo96_HSE\n *\n * @brief   Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo96_HSE( void )\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ( ( uint32_t )RCC_HSEON );\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    }\n    while( ( HSEStatus == 0 ) && ( StartUpCounter != HSE_STARTUP_TIMEOUT ) );\n\n    if( ( RCC->CTLR & RCC_HSERDY ) != RESET )\n    {\n        HSEStatus = ( uint32_t )0x01;\n    }\n    else\n    {\n        HSEStatus = ( uint32_t )0x00;\n    }\n\n    if( HSEStatus == ( uint32_t )0x01 )\n    {\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n        /*  CH32F20x_D6-PLL configuration: PLLCLK = HSE * 12 = 96 MHz (HSE=8Mhz)\n         *  CH32F20x_D8-PLL configuration: PLLCLK = HSE * 12 = 96 MHz (HSE=8Mhz)\n         *  CH32F20x_D8W-PLL configuration: PLLCLK = HSE/4 * 12 = 96 MHz(HSE=32Mhz)\n         */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE |\n                                    RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12 );\n#else\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12_EXTEN );\n#endif\n\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n        {\n        }\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n        RCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n        * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n\n#elif defined SYSCLK_FREQ_120MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo120_HSE\n *\n * @brief   Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo120_HSE(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n#if defined (CH32F20x_D8W)\n\t\tRCC->CFGR0 |= (uint32_t)(3<<22);\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV2;\n#else\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n#endif\n\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n     /*  CH32F20x_D6-PLL configuration: PLLCLK = HSE * 15 = 120 MHz (HSE=8Mhz)\n      *  CH32F20x_D8-PLL configuration: PLLCLK = HSE * 15 = 120 MHz (HSE=8Mhz)\n      *  CH32F20x_D8W-PLL configuration: PLLCLK = HSE/2 * 15 = 240 MHz(HSE=32Mhz)\n      */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15);\n#else\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15_EXTEN);\n#endif\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n\n\n#elif defined SYSCLK_FREQ_144MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo144_HSE\n *\n * @brief   Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo144_HSE( void )\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ( ( uint32_t )RCC_HSEON );\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    }\n    while( ( HSEStatus == 0 ) && ( StartUpCounter != HSE_STARTUP_TIMEOUT ) );\n\n    if( ( RCC->CTLR & RCC_HSERDY ) != RESET )\n    {\n        HSEStatus = ( uint32_t )0x01;\n    }\n    else\n    {\n        HSEStatus = ( uint32_t )0x00;\n    }\n\n    if( HSEStatus == ( uint32_t )0x01 )\n    {\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n        /*  CH32F20x_D6-PLL configuration: PLLCLK = HSE * 18 = 144 MHz (HSE=8Mhz)\n         *  CH32F20x_D8-PLL configuration: PLLCLK = HSE * 18 = 144 MHz (HSE=8Mhz)\n         *  CH32F20x_D8W-PLL configuration: PLLCLK = HSE/4 * 18 = 144 MHz(HSE=32Mhz)\n         */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE |\n                                    RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18 );\n#else\n        RCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18_EXTEN );\n#endif\n\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n        {\n        }\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n        RCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n        * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n#elif defined SYSCLK_FREQ_48MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo48_HSI\n *\n * @brief   Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo48_HSI( void )\n{\n\t\tEXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n\t\t/* HCLK = SYSCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n\t\t/* PCLK2 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n\t\t/* PCLK1 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n\t\t/*  PLL configuration: PLLCLK = HSI * 6 = 48 MHz */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6 );\n#else\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6_EXTEN );\n#endif\n\n\t\t/* Enable PLL */\n\t\tRCC->CTLR |= RCC_PLLON;\n\t\t/* Wait till PLL is ready */\n\t\twhile( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n\t\t{\n\t\t}\n\t\t/* Select PLL as system clock source */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n\t\t/* Wait till PLL is used as system clock source */\n\t\twhile( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n\t\t{\n\t\t}\n}\n\n#elif defined SYSCLK_FREQ_56MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo56_HSI\n *\n * @brief   Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo56_HSI( void )\n{\n\t\tEXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n\t\t/* HCLK = SYSCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n\t\t/* PCLK2 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n\t\t/* PCLK1 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n\t\t/*  PLL configuration: PLLCLK = HSI * 7 = 56 MHz */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7 );\n#else\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7_EXTEN );\n#endif\n\n\t\t/* Enable PLL */\n\t\tRCC->CTLR |= RCC_PLLON;\n\t\t/* Wait till PLL is ready */\n\t\twhile( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n\t\t{\n\t\t}\n\t\t/* Select PLL as system clock source */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n\t\t/* Wait till PLL is used as system clock source */\n\t\twhile( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n\t\t{\n\t\t}\n}\n\n#elif defined SYSCLK_FREQ_72MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo72_HSI\n *\n * @brief   Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo72_HSI( void )\n{\n\t\tEXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n\t\t/* HCLK = SYSCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n\t\t/* PCLK2 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n\t\t/* PCLK1 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n\t\t/*  PLL configuration: PLLCLK = HSI * 9 = 72 MHz */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9 );\n#else\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9_EXTEN );\n#endif\n\n\t\t/* Enable PLL */\n\t\tRCC->CTLR |= RCC_PLLON;\n\t\t/* Wait till PLL is ready */\n\t\twhile( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n\t\t{\n\t\t}\n\t\t/* Select PLL as system clock source */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n\t\t/* Wait till PLL is used as system clock source */\n\t\twhile( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n\t\t{\n\t\t}\n}\n\n\n#elif defined SYSCLK_FREQ_96MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo96_HSI\n *\n * @brief   Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo96_HSI( void )\n{\n\t\tEXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n\t\t/* HCLK = SYSCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n\t\t/* PCLK2 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n\t\t/* PCLK1 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n\t\t/*  PLL configuration: PLLCLK = HSI * 12 = 96 MHz */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12 );\n#else\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12_EXTEN );\n#endif\n\n\t\t/* Enable PLL */\n\t\tRCC->CTLR |= RCC_PLLON;\n\t\t/* Wait till PLL is ready */\n\t\twhile( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n\t\t{\n\t\t}\n\t\t/* Select PLL as system clock source */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n\t\t/* Wait till PLL is used as system clock source */\n\t\twhile( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n\t\t{\n\t\t}\n}\n\n\n#elif defined SYSCLK_FREQ_120MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo120_HSI\n *\n * @brief   Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo120_HSI(void)\n{\n\t\tEXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 15 = 120 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL15 );\n#else\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL15_EXTEN );\n#endif\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n\n#elif defined SYSCLK_FREQ_144MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo144_HSI\n *\n * @brief   Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo144_HSI( void )\n{\n\t\tEXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n\t\t/* HCLK = SYSCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_HPRE_DIV1;\n\t\t/* PCLK2 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE2_DIV1;\n\t\t/* PCLK1 = HCLK */\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_PPRE1_DIV2;\n\n\t\t/*  PLL configuration: PLLCLK = HSI * 18 = 144 MHz */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL ) );\n\n#if defined (CH32F20x_D6) || defined (CH32F20x_D8) || defined (CH32F20x_D8W)\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL18 );\n#else\n\t\tRCC->CFGR0 |= ( uint32_t )( RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL18_EXTEN );\n#endif\n\n\t\t/* Enable PLL */\n\t\tRCC->CTLR |= RCC_PLLON;\n\t\t/* Wait till PLL is ready */\n\t\twhile( ( RCC->CTLR & RCC_PLLRDY ) == 0 )\n\t\t{\n\t\t}\n\t\t/* Select PLL as system clock source */\n\t\tRCC->CFGR0 &= ( uint32_t )( ( uint32_t )~( RCC_SW ) );\n\t\tRCC->CFGR0 |= ( uint32_t )RCC_SW_PLL;\n\t\t/* Wait till PLL is used as system clock source */\n\t\twhile( ( RCC->CFGR0 & ( uint32_t )RCC_SWS ) != ( uint32_t )0x08 )\n\t\t{\n\t\t}\n}\n\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32f20x/system_ch32f20x.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n* File Name          : system_ch32f20x.h\n* Author             : WCH\n* Version            : V1.0.0\n* Date               : 2021/08/08\n* Description        : CH32F20x Device Peripheral Access Layer System Header File.\n*******************************************************************************/\n#ifndef __SYSTEM_CH32F20x_H\n#define __SYSTEM_CH32F20x_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\nextern uint32_t SystemCoreClock;          /* System Clock Frequency (Core Clock) */\n\n/* System_Exported_Functions */\nextern void SystemInit(void);\nextern void SystemCoreClockUpdate(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*__CH32F20x_SYSTEM_H */\n"
  },
  {
    "path": "hw/bsp/ch32v10x/boards/ch32v103r_r1_1v0/board.cmake",
    "content": "set(LD_FLASH_SIZE 64K)\nset(LD_RAM_SIZE 20K)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CFG_EXAMPLE_MSC_DUAL_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v10x/boards/ch32v103r_r1_1v0/board.h",
    "content": "/* metadata:\n   name: CH32V103R-R1-1v1\n   url: https://github.com/openwch/ch32v103/tree/main/SCHPCB/CH32V103R-R1-1v1\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_PORT       GPIOA\n#define LED_PIN        GPIO_Pin_10\n#define LED_STATE_ON   0\n\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_Pin_1\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v10x/boards/ch32v103r_r1_1v0/board.mk",
    "content": "CFLAGS += -DCFG_EXAMPLE_MSC_DUAL_READONLY\n\nLDFLAGS += \\\n  -Wl,--defsym=__FLASH_SIZE=64K \\\n  -Wl,--defsym=__RAM_SIZE=20K \\\n"
  },
  {
    "path": "hw/bsp/ch32v10x/ch32v10x_conf.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : ch32v10x_conf.h\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2020/04/30\n * Description        : Library configuration file.\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#ifndef __CH32V10x_CONF_H\n#define __CH32V10x_CONF_H\n\n#include \"ch32v10x_adc.h\"\n#include \"ch32v10x_bkp.h\"\n#include \"ch32v10x_crc.h\"\n#include \"ch32v10x_dbgmcu.h\"\n#include \"ch32v10x_dma.h\"\n#include \"ch32v10x_exti.h\"\n#include \"ch32v10x_flash.h\"\n#include \"ch32v10x_gpio.h\"\n#include \"ch32v10x_i2c.h\"\n#include \"ch32v10x_iwdg.h\"\n#include \"ch32v10x_pwr.h\"\n#include \"ch32v10x_rcc.h\"\n#include \"ch32v10x_rtc.h\"\n#include \"ch32v10x_spi.h\"\n#include \"ch32v10x_tim.h\"\n#include \"ch32v10x_usart.h\"\n#include \"ch32v10x_wwdg.h\"\n#include \"ch32v10x_usb.h\"\n#include \"ch32v10x_usb_host.h\"\n#include \"ch32v10x_it.h\"\n#include \"ch32v10x_misc.h\"\n\n#endif /* __CH32V10x_CONF_H */\n"
  },
  {
    "path": "hw/bsp/ch32v10x/ch32v10x_it.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : ch32v10x_it.h\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2022/08/20\n * Description        : This file contains the headers of the interrupt handlers.\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#ifndef __CH32V10x_IT_H\n#define __CH32V10x_IT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"ch32v10x.h\"\n\nvoid USBHD_IRQHandler(void);\nvoid USBWakeUp_IRQHandler(void);\nvoid SysTick_Handler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CH32V10x_IT_H */\n"
  },
  {
    "path": "hw/bsp/ch32v10x/family.c",
    "content": "/* metadata:\n   manufacturer: WCH\n*/\n\n#include <stdio.h>\n\n// https://github.com/openwch/ch32v307/pull/90\n// https://github.com/openwch/ch32v20x/pull/12\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#endif\n\n#include \"ch32v10x.h\"\n#include \"ch32v10x_it.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n__attribute__((interrupt)) __attribute__((used))\nvoid USBHD_IRQHandler(void) {\n  #if CFG_TUD_WCH_USBIP_USBFS\n  tud_int_handler(0);\n  #endif\n}\n\n__attribute__((interrupt)) __attribute__((used))\nvoid USBWakeUp_IRQHandler(void) {\n  #if CFG_TUD_WCH_USBIP_USBFS\n  tud_int_handler(0);\n  #endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\n__attribute__((interrupt)) __attribute__((used))\nvoid SysTick_Handler(void) {\n  SysTick->CNTL0 = SysTick->CNTL1 = SysTick->CNTL2 = SysTick->CNTL3 = 0;\n  SysTick->CNTH0 = SysTick->CNTH1 = SysTick->CNTH2 = SysTick->CNTH3 = 0;\n  system_ticks++;\n}\n\nstatic uint32_t SysTick_Config(uint32_t ticks) {\n  NVIC_EnableIRQ(SysTicK_IRQn);\n  SysTick->CTLR = 0;\n  SysTick->CNTL0 = SysTick->CNTL1 = SysTick->CNTL2 = SysTick->CNTL3 = 0;\n  SysTick->CNTH0 = SysTick->CNTH1 = SysTick->CNTH2 = SysTick->CNTH3 = 0;\n\n  SysTick->CMPLR0 = (u8)(ticks & 0xFF);\n  SysTick->CMPLR1 = (u8)(ticks >> 8);\n  SysTick->CMPLR2 = (u8)(ticks >> 16);\n  SysTick->CMPLR3 = (u8)(ticks >> 24);\n\n  SysTick->CMPHR0 = SysTick->CMPHR1 = SysTick->CMPHR2 =   SysTick->CMPHR3 = 0;\n  SysTick->CTLR = 1;\n  return 0;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid board_init(void) {\n  __disable_irq();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(SystemCoreClock / 1000);\n#endif\n\n  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);\n\n  EXTEN->EXTEN_CTR |= EXTEN_USBFS_IO_EN;\n  uint8_t usb_div;\n  switch (SystemCoreClock) {\n    case 48000000: usb_div = RCC_USBCLKSource_PLLCLK_Div1; break;\n    case 72000000: usb_div = RCC_USBCLKSource_PLLCLK_1Div5; break;\n    default: TU_ASSERT(0,); break;\n  }\n  RCC_USBCLKConfig(usb_div);\n  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_USBFS, ENABLE);\n\n  #ifdef LED_PIN\n  GPIO_InitTypeDef led_init = {\n      .GPIO_Pin = LED_PIN,\n      .GPIO_Mode = GPIO_Mode_Out_OD,\n      .GPIO_Speed = GPIO_Speed_50MHz,\n  };\n  GPIO_Init(LED_PORT, &led_init);\n  #endif\n\n  #ifdef BUTTON_PIN\n  GPIO_InitTypeDef button_init = {\n      .GPIO_Pin = BUTTON_PIN,\n      .GPIO_Mode = GPIO_Mode_IPU,\n      .GPIO_Speed = GPIO_Speed_50MHz,\n  };\n  GPIO_Init(BUTTON_PORT, &button_init);\n  #endif\n\n  // UART TX is PA9\n  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);\n  GPIO_InitTypeDef usart_init = {\n    .GPIO_Pin = GPIO_Pin_9,\n    .GPIO_Speed = GPIO_Speed_50MHz,\n    .GPIO_Mode = GPIO_Mode_AF_PP,\n  };\n  GPIO_Init(GPIOA, &usart_init);\n\n  USART_InitTypeDef usart = {\n    .USART_BaudRate = 115200,\n    .USART_WordLength = USART_WordLength_8b,\n    .USART_StopBits = USART_StopBits_1,\n    .USART_Parity = USART_Parity_No,\n    .USART_Mode = USART_Mode_Tx,\n    .USART_HardwareFlowControl = USART_HardwareFlowControl_None,\n  };\n  USART_Init(USART1, &usart);\n  USART_Cmd(USART1, ENABLE);\n\n  __enable_irq();\n\n  board_led_write(true);\n}\n\nvoid board_led_write(bool state) {\n  GPIO_WriteBit(LED_PORT, LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  const char *bufc = (const char *) buf;\n  for (int i = 0; i < len; i++) {\n    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);\n    USART_SendData(USART1, *bufc++);\n  }\n\n  return len;\n}\n"
  },
  {
    "path": "hw/bsp/ch32v10x/family.cmake",
    "content": "include_guard()\n\n#set(UF2_FAMILY_ID 0x699b62ec)\nset(CH32_FAMILY ch32v10x)\nset(SDK_DIR ${TOP}/hw/mcu/wch/ch32v103)\nset(SDK_SRC_DIR ${SDK_DIR}/EVT/EXAM/SRC)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS CH32V103 CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f ${CMAKE_CURRENT_LIST_DIR}/wch-riscv.cfg\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/${CH32_FAMILY}.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED STARTUP_FILE_GNU)\nset(STARTUP_FILE_GNU ${SDK_SRC_DIR}/Startup/startup_${CH32_FAMILY}.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_SRC_DIR}/Core/core_riscv.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_gpio.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_misc.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_rcc.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_usart.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/system_${CH32_FAMILY}.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_SRC_DIR}/Core\n    ${SDK_SRC_DIR}/Peripheral/inc\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    )\n\n  update_board(${BOARD_TARGET})\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_compile_options(${BOARD_TARGET} PUBLIC -mcmodel=medany)\n  endif()\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_CH32V103)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/wch/dcd_ch32_usbfs.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -Wl,--defsym=__FLASH_SIZE=${LD_FLASH_SIZE}\n      -Wl,--defsym=__RAM_SIZE=${LD_RAM_SIZE}\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    message(FATAL_ERROR \"Clang is not supported\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_openocd_wch(${TARGET})\n  #family_flash_uf2(${TARGET} ${UF2_FAMILY_ID})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v10x/family.mk",
    "content": "# https://www.embecosm.com/resources/tool-chain-downloads/#riscv-stable\n#CROSS_COMPILE ?= riscv32-unknown-elf-\n\n# Toolchain from https://nucleisys.com/download.php\n#CROSS_COMPILE ?= riscv-nuclei-elf-\n\n# Toolchain from https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack\nCROSS_COMPILE ?= riscv-none-elf-\n\nCH32_FAMILY = ch32v10x\nSDK_DIR = hw/mcu/wch/ch32v103\nSDK_SRC_DIR = $(SDK_DIR)/EVT/EXAM/SRC\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= rv32imac-ilp32\n\n# Port0 use FSDev, Port1 use USBFS\nPORT ?= 0\n\nCFLAGS += \\\n\t-mcmodel=medany \\\n\t-ffat-lto-objects \\\n\t-flto \\\n\t-DCFG_TUSB_MCU=OPT_MCU_CH32V103\n\n# https://github.com/openwch/ch32v20x/pull/12\nCFLAGS += -Wno-error=strict-prototypes\n\nLDFLAGS_GCC += \\\n\t-nostdlib -nostartfiles \\\n\t--specs=nosys.specs --specs=nano.specs \\\n\nLD_FILE = $(FAMILY_PATH)/linker/${CH32_FAMILY}.ld\n\nSRC_C += \\\n\tsrc/portable/wch/dcd_ch32_usbfs.c \\\n\t$(SDK_SRC_DIR)/Core/core_riscv.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_gpio.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_misc.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_rcc.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_usart.c \\\n\nSRC_S += $(SDK_SRC_DIR)/Startup/startup_${CH32_FAMILY}.S\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(SDK_SRC_DIR)/Core \\\n\t$(TOP)/$(SDK_SRC_DIR)/Peripheral/inc \\\n\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RISC-V\n\nOPENOCD_WCH_OPTION=-f $(TOP)/$(FAMILY_PATH)/wch-riscv.cfg\nflash: flash-openocd-wch\n"
  },
  {
    "path": "hw/bsp/ch32v10x/linker/ch32v10x.ld",
    "content": "/* Define default values if not already defined */\n__FLASH_SIZE = DEFINED(__flash_size) ? __flash_size : 64K;\n__RAM_SIZE = DEFINED(__ram_size) ? __ram_size : 20K;\n\nMEMORY\n{\n\tFLASH (rx) : ORIGIN = 0x00000000, LENGTH = __FLASH_SIZE\n\tRAM (xrw) : ORIGIN = 0x20000000, LENGTH = __RAM_SIZE\n}\n\nENTRY( _start )\n\n__stack_size = 2048;\n\nPROVIDE( _stack_size = __stack_size );\n\nSECTIONS\n{\n\t.init :\n\t{\n\t\t_sinit = .;\n\t\t. = ALIGN(4);\n\t\tKEEP(*(SORT_NONE(.init)))\n\t\t. = ALIGN(4);\n\t\t_einit = .;\n\t} >FLASH AT>FLASH\n\n  .vector :\n  {\n      *(.vector);\n\t  . = ALIGN(64);\n  } >FLASH AT>FLASH\n\n\t.text :\n\t{\n\t\t. = ALIGN(4);\n\t\t*(.text)\n\t\t*(.text.*)\n\t\t*(.rodata)\n\t\t*(.rodata*)\n\t\t*(.gnu.linkonce.t.*)\n\t\t. = ALIGN(4);\n\t} >FLASH AT>FLASH\n\n\t.fini :\n\t{\n\t\tKEEP(*(SORT_NONE(.fini)))\n\t\t. = ALIGN(4);\n\t} >FLASH AT>FLASH\n\n\tPROVIDE( _etext = . );\n\tPROVIDE( _eitcm = . );\n\n\t.preinit_array  :\n\t{\n\t  PROVIDE_HIDDEN (__preinit_array_start = .);\n\t  KEEP (*(.preinit_array))\n\t  PROVIDE_HIDDEN (__preinit_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.init_array     :\n\t{\n\t  PROVIDE_HIDDEN (__init_array_start = .);\n\t  KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))\n\t  KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))\n\t  PROVIDE_HIDDEN (__init_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.fini_array     :\n\t{\n\t  PROVIDE_HIDDEN (__fini_array_start = .);\n\t  KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))\n\t  KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))\n\t  PROVIDE_HIDDEN (__fini_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.ctors          :\n\t{\n\t  /* gcc uses crtbegin.o to find the start of\n\t     the constructors, so we make sure it is\n\t     first.  Because this is a wildcard, it\n\t     doesn't matter if the user does not\n\t     actually link against crtbegin.o; the\n\t     linker won't look for a file to match a\n\t     wildcard.  The wildcard also means that it\n\t     doesn't matter which directory crtbegin.o\n\t     is in.  */\n\t  KEEP (*crtbegin.o(.ctors))\n\t  KEEP (*crtbegin?.o(.ctors))\n\t  /* We don't want to include the .ctor section from\n\t     the crtend.o file until after the sorted ctors.\n\t     The .ctor section from the crtend file contains the\n\t     end of ctors marker and it must be last */\n\t  KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))\n\t  KEEP (*(SORT(.ctors.*)))\n\t  KEEP (*(.ctors))\n\t} >FLASH AT>FLASH\n\n\t.dtors          :\n\t{\n\t  KEEP (*crtbegin.o(.dtors))\n\t  KEEP (*crtbegin?.o(.dtors))\n\t  KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))\n\t  KEEP (*(SORT(.dtors.*)))\n\t  KEEP (*(.dtors))\n\t} >FLASH AT>FLASH\n\n\t.dalign :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE(_data_vma = .);\n\t} >RAM AT>FLASH\n\n\t.dlalign :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE(_data_lma = .);\n\t} >FLASH AT>FLASH\n\n\t.data :\n\t{\n    \t*(.gnu.linkonce.r.*)\n    \t*(.data .data.*)\n    \t*(.gnu.linkonce.d.*)\n\t\t. = ALIGN(8);\n    \tPROVIDE( __global_pointer$ = . + 0x800 );\n    \t*(.sdata .sdata.*)\n\t\t*(.sdata2.*)\n    \t*(.gnu.linkonce.s.*)\n    \t. = ALIGN(8);\n    \t*(.srodata.cst16)\n    \t*(.srodata.cst8)\n    \t*(.srodata.cst4)\n    \t*(.srodata.cst2)\n    \t*(.srodata .srodata.*)\n    \t. = ALIGN(4);\n\t\tPROVIDE( _edata = .);\n\t} >RAM AT>FLASH\n\n\t.bss :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE( _sbss = .);\n  \t    *(.sbss*)\n        *(.gnu.linkonce.sb.*)\n\t\t*(.bss*)\n     \t*(.gnu.linkonce.b.*)\n\t\t*(COMMON*)\n\t\t. = ALIGN(4);\n\t\tPROVIDE( _ebss = .);\n\t} >RAM AT>FLASH\n\n\tPROVIDE( _end = _ebss);\n\tPROVIDE( end = . );\n\n    .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :\n    {\n        PROVIDE( _heap_end = . );\n        . = ALIGN(4);\n        PROVIDE(_susrstack = . );\n        . = . + __stack_size;\n        PROVIDE( _eusrstack = .);\n    } >RAM\n\n}\n"
  },
  {
    "path": "hw/bsp/ch32v10x/system_ch32v10x.c",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : system_ch32v10x.c\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2020/04/30\n * Description        : CH32V10x Device Peripheral Access Layer System Source File.\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#include \"ch32v10x.h\"\n\n/*\n * Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after\n * reset the HSI is used as SYSCLK source).\n * If none of the define below is enabled, the HSI is used as System clock source.\n */\n//#define SYSCLK_FREQ_HSE    HSE_VALUE\n//#define SYSCLK_FREQ_48MHz_HSE  48000000\n//#define SYSCLK_FREQ_56MHz_HSE  56000000\n#define SYSCLK_FREQ_72MHz_HSE  72000000\n//#define SYSCLK_FREQ_HSI    HSI_VALUE\n//#define SYSCLK_FREQ_48MHz_HSI  48000000\n//#define SYSCLK_FREQ_56MHz_HSI  56000000\n//#define SYSCLK_FREQ_72MHz_HSI  72000000\n\n/* Clock Definitions */\n#ifdef SYSCLK_FREQ_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;              /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_48MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_56MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_72MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_48MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_56MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_72MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#else\nuint32_t SystemCoreClock         = HSI_VALUE;                    /* System Clock Frequency (Core Clock) */\n\n#endif\n\n__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};\n\n/* ch32v10x_system_private_function_proto_types */\nstatic void SetSysClock(void);\n\n#ifdef SYSCLK_FREQ_HSE\nstatic void SetSysClockToHSE( void );\n#elif defined SYSCLK_FREQ_48MHz_HSE\nstatic void SetSysClockTo48_HSE( void );\n#elif defined SYSCLK_FREQ_56MHz_HSE\nstatic void SetSysClockTo56_HSE( void );\n#elif defined SYSCLK_FREQ_72MHz_HSE\nstatic void SetSysClockTo72_HSE( void );\n#elif defined SYSCLK_FREQ_48MHz_HSI\nstatic void SetSysClockTo48_HSI( void );\n#elif defined SYSCLK_FREQ_56MHz_HSI\nstatic void SetSysClockTo56_HSI( void );\n#elif defined SYSCLK_FREQ_72MHz_HSI\nstatic void SetSysClockTo72_HSI( void );\n\n#endif\n\n/*********************************************************************\n * @fn      SystemInit\n *\n * @brief   Setup the microcontroller system Initialize the Embedded Flash Interface,\n *        the PLL and update the SystemCoreClock variable.\n *\n * @return  none\n */\nvoid SystemInit(void)\n{\n    RCC->CTLR |= (uint32_t)0x00000001;\n    RCC->CFGR0 &= (uint32_t)0xF8FF0000;\n    RCC->CTLR &= (uint32_t)0xFEF6FFFF;\n    RCC->CTLR &= (uint32_t)0xFFFBFFFF;\n    RCC->CFGR0 &= (uint32_t)0xFF80FFFF;\n    RCC->INTR = 0x009F0000;\n    SetSysClock();\n}\n\n/*********************************************************************\n * @fn      SystemCoreClockUpdate\n *\n * @brief   Update SystemCoreClock variable according to Clock Register Values.\n *\n * @return  none\n */\nvoid SystemCoreClockUpdate(void)\n{\n    uint32_t tmp = 0, pllmull = 0, pllsource = 0;\n\n    tmp = RCC->CFGR0 & RCC_SWS;\n\n    switch(tmp)\n    {\n        case 0x00:\n            SystemCoreClock = HSI_VALUE;\n            break;\n        case 0x04:\n            SystemCoreClock = HSE_VALUE;\n            break;\n        case 0x08:\n            pllmull = RCC->CFGR0 & RCC_PLLMULL;\n            pllsource = RCC->CFGR0 & RCC_PLLSRC;\n            pllmull = (pllmull >> 18) + 2;\n            if(pllsource == 0x00)\n            {\n                if( EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE )\n                {\n                    SystemCoreClock = ( HSI_VALUE ) * pllmull;\n                }\n                else\n                {\n                    SystemCoreClock = ( HSI_VALUE >> 1 ) * pllmull;\n                }\n            }\n            else\n            {\n                if((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET)\n                {\n                    SystemCoreClock = (HSE_VALUE >> 1) * pllmull;\n                }\n                else\n                {\n                    SystemCoreClock = HSE_VALUE * pllmull;\n                }\n            }\n            break;\n        default:\n            SystemCoreClock = HSI_VALUE;\n            break;\n    }\n\n    tmp = AHBPrescTable[((RCC->CFGR0 & RCC_HPRE) >> 4)];\n    SystemCoreClock >>= tmp;\n}\n\n/*********************************************************************\n * @fn      SetSysClock\n *\n * @brief   Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClock(void)\n{\n    //GPIO_IPD_Unused();\n#ifdef SYSCLK_FREQ_HSE\n    SetSysClockToHSE();\n#elif defined SYSCLK_FREQ_48MHz_HSE\n    SetSysClockTo48_HSE();\n#elif defined SYSCLK_FREQ_56MHz_HSE\n    SetSysClockTo56_HSE();\n#elif defined SYSCLK_FREQ_72MHz_HSE\n    SetSysClockTo72_HSE();\n#elif defined SYSCLK_FREQ_48MHz_HSI\n    SetSysClockTo48_HSI();\n#elif defined SYSCLK_FREQ_56MHz_HSI\n    SetSysClockTo56_HSI();\n#elif defined SYSCLK_FREQ_72MHz_HSI\n    SetSysClockTo72_HSI();\n\n#endif\n\n    /* If none of the define above is enabled, the HSI is used as System clock\n     * source (default after reset)\n     */\n}\n\n#ifdef SYSCLK_FREQ_HSE\n\n/*********************************************************************\n * @fn      SetSysClockToHSE\n *\n * @brief   Sets HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockToHSE(void)\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n    if((RCC->CTLR & RCC_HSERDY) != RESET)\n    {\n        HSEStatus = (uint32_t)0x01;\n    }\n    else\n    {\n        HSEStatus = (uint32_t)0x00;\n    }\n\n    if(HSEStatus == (uint32_t)0x01)\n    {\n        FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;\n        /* Flash 0 wait state */\n        FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);\n        FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_0;\n\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;\n\n        /* Select HSE as system clock source */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n        RCC->CFGR0 |= (uint32_t)RCC_SW_HSE;\n\n        /* Wait till HSE is used as system clock source */\n        while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x04)\n        {\n        }\n    }\n    else\n    {\n        /* If HSE fails to start-up, the application will have wrong clock\n         * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n\n#elif defined SYSCLK_FREQ_48MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo48_HSE\n *\n * @brief   Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo48_HSE(void)\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ((uint32_t)RCC_HSEON);\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n    if((RCC->CTLR & RCC_HSERDY) != RESET)\n    {\n        HSEStatus = (uint32_t)0x01;\n    }\n    else\n    {\n        HSEStatus = (uint32_t)0x00;\n    }\n\n    if(HSEStatus == (uint32_t)0x01)\n    {\n        /* Enable Prefetch Buffer */\n        FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;\n\n        /* Flash 1 wait state */\n        FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);\n        FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_1;\n\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n        /*  PLL configuration: PLLCLK = HSE * 6 = 48 MHz */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLMULL6);\n\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while((RCC->CTLR & RCC_PLLRDY) == 0)\n        {\n        }\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n        RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n         * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n#elif defined SYSCLK_FREQ_56MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo56_HSE\n *\n * @brief   Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo56_HSE(void)\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n    if((RCC->CTLR & RCC_HSERDY) != RESET)\n    {\n        HSEStatus = (uint32_t)0x01;\n    }\n    else\n    {\n        HSEStatus = (uint32_t)0x00;\n    }\n\n    if(HSEStatus == (uint32_t)0x01)\n    {\n        /* Enable Prefetch Buffer */\n        FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;\n\n        /* Flash 2 wait state */\n        FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);\n        FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;\n\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n        /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLMULL7);\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while((RCC->CTLR & RCC_PLLRDY) == 0)\n        {\n        }\n\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n        RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n         * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n#elif defined SYSCLK_FREQ_72MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo72_HSE\n *\n * @brief   Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo72_HSE(void)\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n    if((RCC->CTLR & RCC_HSERDY) != RESET)\n    {\n        HSEStatus = (uint32_t)0x01;\n    }\n    else\n    {\n        HSEStatus = (uint32_t)0x00;\n    }\n\n    if(HSEStatus == (uint32_t)0x01)\n    {\n        /* Enable Prefetch Buffer */\n        FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;\n\n        /* Flash 2 wait state */\n        FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);\n        FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_2;\n\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n        /*  PLL configuration: PLLCLK = HSE * 9 = 72 MHz */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                              RCC_PLLMULL));\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLMULL9);\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while((RCC->CTLR & RCC_PLLRDY) == 0)\n        {\n        }\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n        RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n         * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n\n#elif defined SYSCLK_FREQ_48MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo48_HSI\n *\n * @brief   Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo48_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* Enable Prefetch Buffer */\n    FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;\n\n    /* Flash 1 wait state */\n    FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);\n    FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_1;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 6 = 48 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n#elif defined SYSCLK_FREQ_56MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo56_HSI\n *\n * @brief   Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo56_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* Enable Prefetch Buffer */\n    FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;\n\n    /* Flash 1 wait state */\n    FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);\n    FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_1;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 7 = 56 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n#elif defined SYSCLK_FREQ_72MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo72_HSI\n *\n * @brief   Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo72_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* Enable Prefetch Buffer */\n    FLASH->ACTLR |= FLASH_ACTLR_PRFTBE;\n\n    /* Flash 1 wait state */\n    FLASH->ACTLR &= (uint32_t)((uint32_t)~FLASH_ACTLR_LATENCY);\n    FLASH->ACTLR |= (uint32_t)FLASH_ACTLR_LATENCY_1;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 9 = 72 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v10x/system_ch32v10x.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : system_ch32v10x.h\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2020/04/30\n * Description        : CH32V10x Device Peripheral Access Layer System Header File.\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#ifndef __SYSTEM_CH32V10x_H\n#define __SYSTEM_CH32V10x_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nextern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */\n\n/* System_Exported_Functions */\nextern void SystemInit(void);\nextern void SystemCoreClockUpdate(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*__CH32V10x_SYSTEM_H */\n"
  },
  {
    "path": "hw/bsp/ch32v10x/wch-riscv.cfg",
    "content": "adapter driver wlinke\nadapter speed 6000\ntransport select sdi\n\nwlink_set_address 0x00000000\nset _CHIPNAME wch_riscv\nsdi newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x00001\n\nset _TARGETNAME $_CHIPNAME.cpu\n\ntarget create $_TARGETNAME.0 wch_riscv -chain-position $_TARGETNAME\n$_TARGETNAME.0 configure  -work-area-phys 0x20000000 -work-area-size 10000 -work-area-backup 1\nset _FLASHNAME $_CHIPNAME.flash\n\nflash bank $_FLASHNAME wch_riscv 0x00000000 0 0 0 $_TARGETNAME.0\n\necho \"Ready for Remote Connections\"\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/ch32v203c_r0_1v0/board.cmake",
    "content": "set(MCU_VARIANT D6)\n\n# 64KB zero-wait, 224KB total flash\n#set(LD_FLASH_SIZE 64K)\nset(LD_FLASH_SIZE 224K)\nset(LD_RAM_SIZE 20K)\n\n# set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/${CH32_FAMILY}_tinyuf2.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    SYSCLK_FREQ_144MHz_HSE=144000000\n    CFG_EXAMPLE_MSC_DUAL_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/ch32v203c_r0_1v0/board.h",
    "content": "/* metadata:\n   name: CH32V203C-R0-1v0\n   url: https://github.com/openwch/ch32v20x/tree/main/SCHPCB/CH32V203C-R0\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_PORT       GPIOA\n#define LED_PIN        GPIO_Pin_0\n#define LED_STATE_ON   0\n#define LED_CLOCK_EN() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)\n#define LED_MODE       GPIO_Mode_Out_OD\n\n#define UART_DEV        USART1\n#define UART_CLOCK_EN() RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE)\n#define UART_TX_PIN     GPIO_Pin_9\n#define UART_RX_PIN     GPIO_Pin_10\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/ch32v203c_r0_1v0/board.mk",
    "content": "MCU_VARIANT = D6\n\nCFLAGS += \\\n  -DSYSCLK_FREQ_144MHz_HSE=144000000 \\\n  -DCH32_FLASH_ENHANCE_READ_MODE=1 \\\n  -DCFG_EXAMPLE_MSC_DUAL_READONLY \\\n\n# 64KB zero-wait, 224KB total flash\nLDFLAGS += \\\n  -Wl,--defsym=__FLASH_SIZE=224K \\\n  -Wl,--defsym=__RAM_SIZE=20K \\\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/ch32v203g_r0_1v0/board.cmake",
    "content": "set(MCU_VARIANT D6)\n\n# 32KB zero-wait, 224KB total flash\n#set(LD_FLASH_SIZE 32K)\nset(LD_FLASH_SIZE 224K)\nset(LD_RAM_SIZE 10K)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    SYSCLK_FREQ_144MHz_HSI=144000000\n    CFG_EXAMPLE_MSC_DUAL_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/ch32v203g_r0_1v0/board.h",
    "content": "/* metadata:\n   name: CH32V203G-R0-1v0\n   url: https://github.com/openwch/ch32v20x/tree/main/SCHPCB/CH32V203C-R0\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_PORT       GPIOA\n#define LED_PIN        GPIO_Pin_0\n#define LED_STATE_ON   0\n#define LED_CLOCK_EN() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)\n#define LED_MODE       GPIO_Mode_Out_OD\n\n#define UART_DEV        USART2\n#define UART_CLOCK_EN() RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE)\n#define UART_TX_PIN     GPIO_Pin_2\n#define UART_RX_PIN     GPIO_Pin_3\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/ch32v203g_r0_1v0/board.mk",
    "content": "MCU_VARIANT = D6\n\nCFLAGS += \\\n  -DSYSCLK_FREQ_144MHz_HSI=144000000 \\\n  -DCH32_FLASH_ENHANCE_READ_MODE=1 \\\n  -DCFG_EXAMPLE_MSC_DUAL_READONLY \\\n\n# 32KB zero-wait, 224KB total flash\nLDFLAGS += \\\n  -Wl,--defsym=__FLASH_SIZE=224K \\\n  -Wl,--defsym=__RAM_SIZE=10K \\\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/nanoch32v203/board.cmake",
    "content": "set(MCU_VARIANT D6)\n\n# 64KB zero-wait, 224KB total flash\nset(LD_FLASH_SIZE 64K)\n#set(LD_FLASH_SIZE 224K)\nset(LD_RAM_SIZE 20K)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    SYSCLK_FREQ_144MHz_HSE=144000000\n    CFG_EXAMPLE_MSC_DUAL_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/nanoch32v203/board.h",
    "content": "/* metadata:\n   name: nanoCH32V203\n   url: https://github.com/wuxx/nanoCH32V203\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_PORT       GPIOA\n#define LED_PIN        GPIO_Pin_15\n#define LED_STATE_ON   0\n#define LED_CLOCK_EN() RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)\n#define LED_MODE       GPIO_Mode_Out_OD\n\n#define UART_DEV        USART1\n#define UART_CLOCK_EN() RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE)\n#define UART_TX_PIN     GPIO_Pin_9\n#define UART_RX_PIN     GPIO_Pin_10\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v20x/boards/nanoch32v203/board.mk",
    "content": "MCU_VARIANT = D6\n\nCFLAGS += \\\n  -DSYSCLK_FREQ_144MHz_HSE=144000000 \\\n\t-DCH32_FLASH_ENHANCE_READ_MODE=1 \\\n  -DCFG_EXAMPLE_MSC_DUAL_READONLY \\\n\n# 64KB zero-wait , 224KB total flash\nLDFLAGS += \\\n  -Wl,--defsym=__FLASH_SIZE=224K \\\n  -Wl,--defsym=__RAM_SIZE=20K \\\n"
  },
  {
    "path": "hw/bsp/ch32v20x/ch32v20x_conf.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : ch32v20x_conf.h\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2021/06/06\n * Description        : Library configuration file.\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#ifndef __CH32V20x_CONF_H\n#define __CH32V20x_CONF_H\n\n#include \"ch32v20x_adc.h\"\n#include \"ch32v20x_bkp.h\"\n#include \"ch32v20x_can.h\"\n#include \"ch32v20x_crc.h\"\n#include \"ch32v20x_dbgmcu.h\"\n#include \"ch32v20x_dma.h\"\n#include \"ch32v20x_exti.h\"\n#include \"ch32v20x_flash.h\"\n#include \"ch32v20x_gpio.h\"\n#include \"ch32v20x_i2c.h\"\n#include \"ch32v20x_iwdg.h\"\n#include \"ch32v20x_pwr.h\"\n#include \"ch32v20x_rcc.h\"\n#include \"ch32v20x_rtc.h\"\n#include \"ch32v20x_spi.h\"\n#include \"ch32v20x_tim.h\"\n#include \"ch32v20x_usart.h\"\n#include \"ch32v20x_wwdg.h\"\n#include \"ch32v20x_it.h\"\n#include \"ch32v20x_misc.h\"\n\n#endif /* __CH32V20x_CONF_H */\n"
  },
  {
    "path": "hw/bsp/ch32v20x/ch32v20x_it.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : ch32v20x_it.h\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2021/06/06\n * Description        : This file contains the headers of the interrupt handlers.\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#ifndef __CH32V20x_IT_H\n#define __CH32V20x_IT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"ch32v20x.h\"\n\nvoid USB_LP_CAN1_RX0_IRQHandler(void);\nvoid USB_HP_CAN1_TX_IRQHandler(void);\nvoid USBWakeUp_IRQHandler(void);\nvoid USBHD_IRQHandler(void);\nvoid USBHDWakeUp_IRQHandler(void);\nvoid SysTick_Handler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CH32V20x_IT_H */\n"
  },
  {
    "path": "hw/bsp/ch32v20x/family.c",
    "content": "/* metadata:\nmanufacturer: WCH\n*/\n\n#include <stdio.h>\n\n// https://github.com/openwch/ch32v307/pull/90\n// https://github.com/openwch/ch32v20x/pull/12\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#endif\n\n#include \"ch32v20x.h\"\n#include \"ch32v20x_it.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n/* CH32v203 depending on variants can support 2 USB IPs: FSDEV (port0) and USBFS (port1).\n * By default, we use FSDEV, but you can explicitly select by define:\n * - CFG_TUD_WCH_USBIP_FSDEV\n * - CFG_TUD_WCH_USBIP_USBFS\n */\n\n// Port0: USBD (fsdev)\n__attribute__((interrupt)) __attribute__((used)) void USB_LP_CAN1_RX0_IRQHandler(void) {\n  #if CFG_TUD_WCH_USBIP_FSDEV\n  tud_int_handler(0);\n  #endif\n}\n\n__attribute__((interrupt)) __attribute__((used)) void USB_HP_CAN1_TX_IRQHandler(void) {\n  #if CFG_TUD_WCH_USBIP_FSDEV\n  tud_int_handler(0);\n  #endif\n\n}\n\n__attribute__((interrupt)) __attribute__((used)) void USBWakeUp_IRQHandler(void) {\n  #if CFG_TUD_WCH_USBIP_FSDEV\n  tud_int_handler(0);\n  #endif\n}\n\n// Port1: USBFS\n__attribute__((interrupt)) __attribute__((used)) void USBHD_IRQHandler(void) {\n  #if CFG_TUD_ENABLED && CFG_TUD_WCH_USBIP_USBFS\n  tud_int_handler(1);\n  #endif\n\n  #if CFG_TUH_ENABLED\n  tuh_int_handler(1);\n  #endif\n}\n\n__attribute__((interrupt)) __attribute__((used)) void USBHDWakeUp_IRQHandler(void) {\n  #if CFG_TUD_WCH_USBIP_USBFS\n  tud_int_handler(0);\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// Board API\n//--------------------------------------------------------------------+\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\n__attribute__((interrupt)) void SysTick_Handler(void) {\n  SysTick->SR = 0;\n  system_ticks++;\n}\n\nstatic uint32_t SysTick_Config(uint32_t ticks) {\n  NVIC_EnableIRQ(SysTicK_IRQn);\n  SysTick->CTLR = 0;\n  SysTick->SR = 0;\n  SysTick->CNT = 0;\n  SysTick->CMP = ticks - 1;\n  SysTick->CTLR = 0xF;\n  return 0;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid board_init(void) {\n  __disable_irq();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(SystemCoreClock / 1000);\n#endif\n\n  LED_CLOCK_EN();\n\n  GPIO_InitTypeDef GPIO_InitStructure = {\n    .GPIO_Pin = LED_PIN,\n    .GPIO_Mode = LED_MODE,\n    .GPIO_Speed = GPIO_Speed_10MHz,\n  };\n  GPIO_Init(LED_PORT, &GPIO_InitStructure);\n\n#ifdef UART_DEV\n  UART_CLOCK_EN();\n  GPIO_InitTypeDef usart_init = {\n    .GPIO_Pin = UART_TX_PIN | UART_RX_PIN,\n    .GPIO_Speed = GPIO_Speed_50MHz,\n    .GPIO_Mode = GPIO_Mode_AF_PP,\n  };\n  GPIO_Init(GPIOA, &usart_init);\n\n  USART_InitTypeDef usart = {\n    .USART_BaudRate = 115200,\n    .USART_WordLength = USART_WordLength_8b,\n    .USART_StopBits = USART_StopBits_1,\n    .USART_Parity = USART_Parity_No,\n    .USART_Mode = USART_Mode_Tx | USART_Mode_Rx,\n    .USART_HardwareFlowControl = USART_HardwareFlowControl_None,\n  };\n  USART_Init(UART_DEV, &usart);\n  USART_Cmd(UART_DEV, ENABLE);\n#endif\n\n  // USB init\n  uint8_t usb_div;\n  switch (SystemCoreClock) {\n    case 48000000: usb_div = RCC_USBCLKSource_PLLCLK_Div1; break;\n    case 96000000: usb_div = RCC_USBCLKSource_PLLCLK_Div2; break;\n    case 144000000: usb_div = RCC_USBCLKSource_PLLCLK_Div3; break;\n    default: TU_ASSERT(0,); break;\n  }\n  RCC_USBCLKConfig(usb_div);\n  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE);  // FSDEV\n  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_OTG_FS, ENABLE); // USB FS\n\n  __enable_irq();\n}\n\nvoid board_reset_to_bootloader(void) {\n//   board_led_write(true);\n//\n//   __disable_irq();\n//\n// #if CFG_TUD_ENABLED\n//   tud_deinit(0);\n//   RCC_APB1PeriphResetCmd(RCC_APB1Periph_USB, ENABLE);\n//   RCC_APB1PeriphResetCmd(RCC_APB1Periph_USB, DISABLE);\n// #endif\n//\n//   SysTick->CTLR = 0;\n//   for (int i = WWDG_IRQn; i< DMA1_Channel8_IRQn; i++) {\n//     NVIC_DisableIRQ(i);\n//   }\n//\n//   __enable_irq();\n//\n//   // define function pointer to BOOT ROM address\n//   void (*bootloader_entry)(void) = (void (*)(void))0x1FFF8000;\n//\n//   bootloader_entry();\n//\n//   board_led_write(false);\n\n  // while(1) { }\n}\n\nvoid board_led_write(bool state) {\n  GPIO_WriteBit(LED_PORT, LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return false;\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t* ch32_uuid = ((volatile uint32_t*) 0x1FFFF7E8UL);\n  uint32_t* serial_32 = (uint32_t*) (uintptr_t) id;\n  serial_32[0] = ch32_uuid[0];\n  serial_32[1] = ch32_uuid[1];\n  serial_32[2] = ch32_uuid[2];\n\n  return 12;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n#ifdef UART_DEV\n  int count;\n  for (count = 0; count < len; count++) {\n    if (USART_GetFlagStatus(UART_DEV, USART_FLAG_RXNE) == RESET) {\n      break;\n    }\n    buf[count] = USART_ReceiveData(UART_DEV);\n  }\n  return count;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  const char *bufc = (const char *) buf;\n  for (int i = 0; i < len; i++) {\n    while (USART_GetFlagStatus(UART_DEV, USART_FLAG_TC) == RESET);\n    USART_SendData(UART_DEV, *bufc++);\n  }\n#else\n  (void) buf; (void) len;\n#endif\n\n  return len;\n}\n"
  },
  {
    "path": "hw/bsp/ch32v20x/family.cmake",
    "content": "include_guard()\n\nset(UF2_FAMILY_ID 0x699b62ec)\nset(CH32_FAMILY ch32v20x)\nset(SDK_DIR ${TOP}/hw/mcu/wch/${CH32_FAMILY})\nset(SDK_SRC_DIR ${SDK_DIR}/EVT/EXAM/SRC)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS CH32V20X CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f ${CMAKE_CURRENT_LIST_DIR}/wch-riscv.cfg\")\n\n# Port0 use FSDev, Port1 use USBFS\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif ()\n\n# only port1 support host mode\nset(RHPORT_HOST 1)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/${CH32_FAMILY}.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED STARTUP_FILE_GNU)\nset(STARTUP_FILE_GNU ${SDK_SRC_DIR}/Startup/startup_${CH32_FAMILY}_${MCU_VARIANT}.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_SRC_DIR}/Core/core_riscv.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_flash.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_gpio.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_misc.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_rcc.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_usart.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/system_${CH32_FAMILY}.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_SRC_DIR}/Core\n    ${SDK_SRC_DIR}/Peripheral/inc\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CH32V20x_${MCU_VARIANT}\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    )\n\n  if (RHPORT_DEVICE EQUAL 0)\n    target_compile_definitions(${BOARD_TARGET} PUBLIC CFG_TUD_WCH_USBIP_FSDEV=1)\n  elseif (RHPORT_DEVICE EQUAL 1)\n    target_compile_definitions(${BOARD_TARGET} PUBLIC CFG_TUH_WCH_USBIP_USBFS=1)\n  else()\n    message(FATAL_ERROR \"Invalid RHPORT_DEVICE ${RHPORT_DEVICE}\")\n  endif()\n\n  update_board(${BOARD_TARGET})\n\n  if (LD_FLASH_SIZE STREQUAL 224K)\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      CH32_FLASH_ENHANCE_READ_MODE=1\n      )\n  endif()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_compile_options(${TARGET} PUBLIC -mcmodel=medany)\n  endif()\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_CH32V20X)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/wch/dcd_ch32_usbfs.c\n    ${TOP}/src/portable/wch/hcd_ch32_usbfs.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      -Wl,--defsym=__FLASH_SIZE=${LD_FLASH_SIZE}\n      -Wl,--defsym=__RAM_SIZE=${LD_RAM_SIZE}\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    message(FATAL_ERROR \"Clang is not supported\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_openocd_wch(${TARGET})\n  family_flash_wlink_rs(${TARGET})\n  #family_flash_uf2(${TARGET} ${UF2_FAMILY_ID})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v20x/family.mk",
    "content": "# https://www.embecosm.com/resources/tool-chain-downloads/#riscv-stable\n#CROSS_COMPILE ?= riscv32-unknown-elf-\n\n# Toolchain from https://nucleisys.com/download.php\n#CROSS_COMPILE ?= riscv-nuclei-elf-\n\n# Toolchain from https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack\nCROSS_COMPILE ?= riscv-none-elf-\n\nCH32_FAMILY = ch32v20x\nSDK_DIR = hw/mcu/wch/ch32v20x\nSDK_SRC_DIR = $(SDK_DIR)/EVT/EXAM/SRC\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= rv32imac-ilp32\n\n# Port0 use FSDev, Port1 use USBFS\nPORT ?= 0\n\nCFLAGS += \\\n\t-mcmodel=medany \\\n\t-ffat-lto-objects \\\n\t-flto \\\n\t-DCH32V20x_${MCU_VARIANT} \\\n\t-DCFG_TUSB_MCU=OPT_MCU_CH32V20X\n\n# https://github.com/openwch/ch32v20x/pull/12\nCFLAGS += -Wno-error=strict-prototypes\n\nifeq ($(PORT),0)\n  $(info \"Using FSDEV driver\")\n  CFLAGS += -DCFG_TUD_WCH_USBIP_FSDEV=1\n  $(info \"Using USBFS Host driver\")\n  CFLAGS += -DCFG_TUH_WCH_USBIP_USBFS=1\nelse\n  $(info \"Using USBFS driver\")\n  CFLAGS += -DCFG_TUD_WCH_USBIP_USBFS=1\nendif\n\nLDFLAGS_GCC += \\\n\t-nostdlib -nostartfiles \\\n\t--specs=nosys.specs --specs=nano.specs \\\n\nLD_FILE = $(FAMILY_PATH)/linker/${CH32_FAMILY}.ld\n\nSRC_C += \\\n\tsrc/portable/wch/dcd_ch32_usbfs.c \\\n\tsrc/portable/wch/hcd_ch32_usbfs.c \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\t$(SDK_SRC_DIR)/Core/core_riscv.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_gpio.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_misc.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_rcc.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_usart.c \\\n\nSRC_S += $(SDK_SRC_DIR)/Startup/startup_${CH32_FAMILY}_${MCU_VARIANT}.S\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(SDK_SRC_DIR)/Core \\\n\t$(TOP)/$(SDK_SRC_DIR)/Peripheral/inc \\\n\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RISC-V\n\nOPENOCD_WCH_OPTION=-f $(TOP)/$(FAMILY_PATH)/wch-riscv.cfg\nflash: flash-wlink-rs\n#flash: flash-openocd-wch\n"
  },
  {
    "path": "hw/bsp/ch32v20x/linker/ch32v20x.ld",
    "content": "/* Define default values if not already defined */\n__flash_size = DEFINED(__FLASH_SIZE) ? __FLASH_SIZE : 64K;\n__ram_size = DEFINED(__RAM_SIZE) ? __RAM_SIZE : 20K;\n__stack_size = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 2048;\n\nMEMORY\n{\n\tFLASH (rx) : ORIGIN = 0x00000000, LENGTH = __flash_size\n\tRAM (xrw) : ORIGIN = 0x20000000, LENGTH = __ram_size\n}\n\nENTRY( _start )\n\nPROVIDE( _stack_size = __stack_size );\n\nSECTIONS\n{\n\t.init :\n\t{\n\t\t_sinit = .;\n\t\t. = ALIGN(4);\n\t\tKEEP(*(SORT_NONE(.init)))\n\t\t. = ALIGN(4);\n\t\t_einit = .;\n\t} >FLASH AT>FLASH\n\n  .vector :\n  {\n      *(.vector);\n\t  . = ALIGN(64);\n  } >FLASH AT>FLASH\n\n\t.text :\n\t{\n\t\t. = ALIGN(4);\n\t\t*(.text)\n\t\t*(.text.*)\n\t\t*(.rodata)\n\t\t*(.rodata*)\n\t\t*(.gnu.linkonce.t.*)\n\t\t. = ALIGN(4);\n\t} >FLASH AT>FLASH\n\n\t.fini :\n\t{\n\t\tKEEP(*(SORT_NONE(.fini)))\n\t\t. = ALIGN(4);\n\t} >FLASH AT>FLASH\n\n\tPROVIDE( _etext = . );\n\tPROVIDE( _eitcm = . );\n\n\t.preinit_array  :\n\t{\n\t  PROVIDE_HIDDEN (__preinit_array_start = .);\n\t  KEEP (*(.preinit_array))\n\t  PROVIDE_HIDDEN (__preinit_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.init_array     :\n\t{\n\t  PROVIDE_HIDDEN (__init_array_start = .);\n\t  KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))\n\t  KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))\n\t  PROVIDE_HIDDEN (__init_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.fini_array     :\n\t{\n\t  PROVIDE_HIDDEN (__fini_array_start = .);\n\t  KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))\n\t  KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))\n\t  PROVIDE_HIDDEN (__fini_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.ctors          :\n\t{\n\t  /* gcc uses crtbegin.o to find the start of\n\t     the constructors, so we make sure it is\n\t     first.  Because this is a wildcard, it\n\t     doesn't matter if the user does not\n\t     actually link against crtbegin.o; the\n\t     linker won't look for a file to match a\n\t     wildcard.  The wildcard also means that it\n\t     doesn't matter which directory crtbegin.o\n\t     is in.  */\n\t  KEEP (*crtbegin.o(.ctors))\n\t  KEEP (*crtbegin?.o(.ctors))\n\t  /* We don't want to include the .ctor section from\n\t     the crtend.o file until after the sorted ctors.\n\t     The .ctor section from the crtend file contains the\n\t     end of ctors marker and it must be last */\n\t  KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))\n\t  KEEP (*(SORT(.ctors.*)))\n\t  KEEP (*(.ctors))\n\t} >FLASH AT>FLASH\n\n\t.dtors          :\n\t{\n\t  KEEP (*crtbegin.o(.dtors))\n\t  KEEP (*crtbegin?.o(.dtors))\n\t  KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))\n\t  KEEP (*(SORT(.dtors.*)))\n\t  KEEP (*(.dtors))\n\t} >FLASH AT>FLASH\n\n\t.dalign :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE(_data_vma = .);\n\t} >RAM AT>FLASH\n\n\t.dlalign :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE(_data_lma = .);\n\t} >FLASH AT>FLASH\n\n\t.data :\n\t{\n    \t*(.gnu.linkonce.r.*)\n    \t*(.data .data.*)\n    \t*(.gnu.linkonce.d.*)\n\t\t. = ALIGN(8);\n    \tPROVIDE( __global_pointer$ = . + 0x800 );\n    \t*(.sdata .sdata.*)\n\t\t*(.sdata2.*)\n    \t*(.gnu.linkonce.s.*)\n    \t. = ALIGN(8);\n    \t*(.srodata.cst16)\n    \t*(.srodata.cst8)\n    \t*(.srodata.cst4)\n    \t*(.srodata.cst2)\n    \t*(.srodata .srodata.*)\n    \t. = ALIGN(4);\n\t\tPROVIDE( _edata = .);\n\t} >RAM AT>FLASH\n\n\t.bss :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE( _sbss = .);\n  \t    *(.sbss*)\n        *(.gnu.linkonce.sb.*)\n\t\t*(.bss*)\n     \t*(.gnu.linkonce.b.*)\n\t\t*(COMMON*)\n\t\t. = ALIGN(4);\n\t\tPROVIDE( _ebss = .);\n\t} >RAM AT>FLASH\n\n\tPROVIDE( _end = _ebss);\n\tPROVIDE( end = . );\n\n    .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :\n    {\n        PROVIDE( _heap_end = . );\n        . = ALIGN(4);\n        PROVIDE(_susrstack = . );\n        . = . + __stack_size;\n        PROVIDE( _eusrstack = .);\n    } >RAM\n\n}\n"
  },
  {
    "path": "hw/bsp/ch32v20x/system_ch32v20x.c",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : system_ch32v20x.c\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2021/06/06\n * Description        : CH32V20x Device Peripheral Access Layer System Source File.\n *                      For HSE = 32Mhz (CH32V208x/CH32V203RBT6)\n *                      For HSE = 8Mhz (other CH32V203x)\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#include \"ch32v20x.h\"\n\n/*\n* Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after\n* reset the HSI is used as SYSCLK source).\n* If none of the define below is enabled, the HSI is used as System clock source.\n*/\n//#define SYSCLK_FREQ_HSE    HSE_VALUE\n// #define SYSCLK_FREQ_48MHz_HSE  48000000\n//#define SYSCLK_FREQ_56MHz_HSE  56000000\n// #define SYSCLK_FREQ_72MHz_HSE  72000000\n// #define SYSCLK_FREQ_96MHz_HSE  96000000\n//#define SYSCLK_FREQ_120MHz_HSE  120000000\n//#define SYSCLK_FREQ_144MHz_HSE  144000000\n//#define SYSCLK_FREQ_HSI    HSI_VALUE\n//#define SYSCLK_FREQ_48MHz_HSI  48000000\n//#define SYSCLK_FREQ_56MHz_HSI  56000000\n//#define SYSCLK_FREQ_72MHz_HSI  72000000\n//#define SYSCLK_FREQ_96MHz_HSI  96000000\n//#define SYSCLK_FREQ_120MHz_HSI  120000000\n//#define SYSCLK_FREQ_144MHz_HSI  144000000\n\n/* Clock Definitions */\n#ifdef SYSCLK_FREQ_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;              /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_48MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_56MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_72MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_96MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_96MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_120MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_120MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_144MHz_HSE\nuint32_t SystemCoreClock         = SYSCLK_FREQ_144MHz_HSE;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_48MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_56MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_72MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_96MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_96MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_120MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_120MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_144MHz_HSI\nuint32_t SystemCoreClock         = SYSCLK_FREQ_144MHz_HSI;        /* System Clock Frequency (Core Clock) */\n#else\nuint32_t SystemCoreClock         = HSI_VALUE;                    /* System Clock Frequency (Core Clock) */\n\n#endif\n\n__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};\n\n/* system_private_function_proto_types */\nstatic void SetSysClock(void);\n\n#ifdef SYSCLK_FREQ_HSE\nstatic void SetSysClockToHSE( void );\n#elif defined SYSCLK_FREQ_48MHz_HSE\nstatic void SetSysClockTo48_HSE( void );\n#elif defined SYSCLK_FREQ_56MHz_HSE\nstatic void SetSysClockTo56_HSE( void );\n#elif defined SYSCLK_FREQ_72MHz_HSE\nstatic void SetSysClockTo72_HSE( void );\n#elif defined SYSCLK_FREQ_96MHz_HSE\nstatic void SetSysClockTo96_HSE( void );\n#elif defined SYSCLK_FREQ_120MHz_HSE\nstatic void SetSysClockTo120_HSE( void );\n#elif defined SYSCLK_FREQ_144MHz_HSE\nstatic void SetSysClockTo144_HSE( void );\n#elif defined SYSCLK_FREQ_48MHz_HSI\nstatic void SetSysClockTo48_HSI( void );\n#elif defined SYSCLK_FREQ_56MHz_HSI\nstatic void SetSysClockTo56_HSI( void );\n#elif defined SYSCLK_FREQ_72MHz_HSI\nstatic void SetSysClockTo72_HSI( void );\n#elif defined SYSCLK_FREQ_96MHz_HSI\nstatic void SetSysClockTo96_HSI( void );\n#elif defined SYSCLK_FREQ_120MHz_HSI\nstatic void SetSysClockTo120_HSI( void );\n#elif defined SYSCLK_FREQ_144MHz_HSI\nstatic void SetSysClockTo144_HSI( void );\n\n#endif\n\n/*********************************************************************\n * @fn      SystemInit\n *\n * @brief   Setup the microcontroller system Initialize the Embedded Flash Interface,\n *        the PLL and update the SystemCoreClock variable.\n *\n * @return  none\n */\nvoid SystemInit (void)\n{\n  // Enable Flash enhance read mode for full 224KB\n#if defined(CH32_FLASH_ENHANCE_READ_MODE) && CH32_FLASH_ENHANCE_READ_MODE == 1\n  FLASH->KEYR = 0x45670123; // FLASH_Unlock_Fast();\n  FLASH->KEYR = 0xCDEF89AB;\n\n  FLASH->CTLR |= (1 << 24); // Enhanced Read Mode\n\n  FLASH->CTLR |= (1 << 15); // FLASH_Lock_Fast();\n#endif\n\n  RCC->CTLR |= (uint32_t)0x00000001;\n  RCC->CFGR0 &= (uint32_t)0xF8FF0000;\n  RCC->CTLR &= (uint32_t)0xFEF6FFFF;\n  RCC->CTLR &= (uint32_t)0xFFFBFFFF;\n  RCC->CFGR0 &= (uint32_t)0xFF80FFFF;\n  RCC->INTR = 0x009F0000;\n  SetSysClock();\n}\n\n/*********************************************************************\n * @fn      SystemCoreClockUpdate\n *\n * @brief   Update SystemCoreClock variable according to Clock Register Values.\n *\n * @return  none\n */\nvoid SystemCoreClockUpdate (void)\n{\n  uint32_t tmp = 0, pllmull = 0, pllsource = 0, Pll_6_5 = 0;\n\n  tmp = RCC->CFGR0 & RCC_SWS;\n\n  switch (tmp)\n  {\n    case 0x00:\n      SystemCoreClock = HSI_VALUE;\n      break;\n    case 0x04:\n      SystemCoreClock = HSE_VALUE;\n      break;\n    case 0x08:\n      pllmull = RCC->CFGR0 & RCC_PLLMULL;\n      pllsource = RCC->CFGR0 & RCC_PLLSRC;\n      pllmull = ( pllmull >> 18) + 2;\n\n      if(pllmull == 17) pllmull = 18;\n\n      if (pllsource == 0x00)\n      {\n          if(EXTEN->EXTEN_CTR & EXTEN_PLL_HSI_PRE){\n              SystemCoreClock = HSI_VALUE * pllmull;\n          }\n          else{\n              SystemCoreClock = (HSI_VALUE >> 1) * pllmull;\n          }\n      }\n      else\n      {\n#if defined (CH32V20x_D8W)\n        if((RCC->CFGR0 & (3<<22)) == (3<<22))\n        {\n          SystemCoreClock = ((HSE_VALUE>>1)) * pllmull;\n        }\n        else\n#endif\n        if ((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET)\n        {\n#if defined (CH32V20x_D8) || defined (CH32V20x_D8W)\n          SystemCoreClock = ((HSE_VALUE>>2) >> 1) * pllmull;\n#else\n          SystemCoreClock = (HSE_VALUE >> 1) * pllmull;\n#endif\n        }\n        else\n        {\n#if defined (CH32V20x_D8) || defined (CH32V20x_D8W)\n            SystemCoreClock = (HSE_VALUE>>2) * pllmull;\n#else\n          SystemCoreClock = HSE_VALUE * pllmull;\n#endif\n        }\n      }\n\n      if(Pll_6_5 == 1) SystemCoreClock = (SystemCoreClock / 2);\n\n      break;\n    default:\n      SystemCoreClock = HSI_VALUE;\n      break;\n  }\n\n  tmp = AHBPrescTable[((RCC->CFGR0 & RCC_HPRE) >> 4)];\n  SystemCoreClock >>= tmp;\n}\n\n/*********************************************************************\n * @fn      SetSysClock\n *\n * @brief   Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClock(void)\n{\n#ifdef SYSCLK_FREQ_HSE\n    SetSysClockToHSE();\n#elif defined SYSCLK_FREQ_48MHz_HSE\n    SetSysClockTo48_HSE();\n#elif defined SYSCLK_FREQ_56MHz_HSE\n    SetSysClockTo56_HSE();\n#elif defined SYSCLK_FREQ_72MHz_HSE\n    SetSysClockTo72_HSE();\n#elif defined SYSCLK_FREQ_96MHz_HSE\n    SetSysClockTo96_HSE();\n#elif defined SYSCLK_FREQ_120MHz_HSE\n    SetSysClockTo120_HSE();\n#elif defined SYSCLK_FREQ_144MHz_HSE\n    SetSysClockTo144_HSE();\n#elif defined SYSCLK_FREQ_48MHz_HSI\n    SetSysClockTo48_HSI();\n#elif defined SYSCLK_FREQ_56MHz_HSI\n    SetSysClockTo56_HSI();\n#elif defined SYSCLK_FREQ_72MHz_HSI\n    SetSysClockTo72_HSI();\n#elif defined SYSCLK_FREQ_96MHz_HSI\n    SetSysClockTo96_HSI();\n#elif defined SYSCLK_FREQ_120MHz_HSI\n    SetSysClockTo120_HSI();\n#elif defined SYSCLK_FREQ_144MHz_HSI\n    SetSysClockTo144_HSI();\n\n#endif\n\n /* If none of the define above is enabled, the HSI is used as System clock\n  * source (default after reset)\n\t*/\n}\n\n#ifdef SYSCLK_FREQ_HSE\n\n/*********************************************************************\n * @fn      SetSysClockToHSE\n *\n * @brief   Sets HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockToHSE(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;\n\n    /* Select HSE as system clock source\n     *  CH32V20x_D6 (HSE=8MHZ)\n     *  CH32V20x_D8 (HSE=32MHZ)\n     *  CH32V20x_D8W (HSE=32MHZ)\n     */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_HSE;\n\n    /* Wait till HSE is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x04)\n    {\n    }\n  }\n  else\n  {\n\t\t/* If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n\t\t */\n  }\n}\n\n#elif defined SYSCLK_FREQ_48MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo48_HSE\n *\n * @brief   Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo48_HSE(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  CH32V20x_D6-PLL configuration: PLLCLK = HSE * 6 = 48 MHz (HSE=8MHZ)\n     *  CH32V20x_D8-PLL configuration: PLLCLK = HSE/4 * 6 = 48 MHz (HSE=32MHZ)\n     *  CH32V20x_D8W-PLL configuration: PLLCLK = HSE/4 * 6 = 48 MHz (HSE=32MHZ)\n     */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n     RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n\t\t/*\n\t\t * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n\t\t */\n  }\n}\n\n#elif defined SYSCLK_FREQ_56MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo56_HSE\n *\n * @brief   Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo56_HSE(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  CH32V20x_D6-PLL configuration: PLLCLK = HSE * 7 = 56 MHz (HSE=8MHZ)\n     *  CH32V20x_D8-PLL configuration: PLLCLK = HSE/4 * 7 = 56 MHz (HSE=32MHZ)\n     *  CH32V20x_D8W-PLL configuration: PLLCLK = HSE/4 * 7 = 56 MHz (HSE=32MHZ)\n     */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n\t\t/*\n\t\t * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n\t\t */\n  }\n}\n\n#elif defined SYSCLK_FREQ_72MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo72_HSE\n *\n * @brief   Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo72_HSE(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  CH32V20x_D6-PLL configuration: PLLCLK = HSE * 9 = 72 MHz (HSE=8MHZ)\n     *  CH32V20x_D8-PLL configuration: PLLCLK = HSE/4 * 9 = 72 MHz (HSE=32MHZ)\n     *  CH32V20x_D8W-PLL configuration: PLLCLK = HSE/4 * 9 = 72 MHz (HSE=32MHZ)\n     */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n\t\t/*\n\t\t * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n\t\t */\n  }\n}\n\n#elif defined SYSCLK_FREQ_96MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo96_HSE\n *\n * @brief   Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo96_HSE(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  CH32V20x_D6-PLL configuration: PLLCLK = HSE * 12 = 96 MHz (HSE=8MHZ)\n     *  CH32V20x_D8-PLL configuration: PLLCLK = HSE/4 * 12 = 96 MHz (HSE=32MHZ)\n     *  CH32V20x_D8W-PLL configuration: PLLCLK = HSE/4 * 12 = 96 MHz (HSE=32MHZ)\n     */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n#elif defined SYSCLK_FREQ_120MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo120_HSE\n *\n * @brief   Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo120_HSE(void)\n{\n    __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n    RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n    /* Wait till HSE is ready and if Time out is reached exit */\n    do\n    {\n        HSEStatus = RCC->CTLR & RCC_HSERDY;\n        StartUpCounter++;\n    } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n    if((RCC->CTLR & RCC_HSERDY) != RESET)\n    {\n        HSEStatus = (uint32_t)0x01;\n    }\n    else\n    {\n        HSEStatus = (uint32_t)0x00;\n    }\n\n    if(HSEStatus == (uint32_t)0x01)\n    {\n#if defined (CH32V20x_D8W)\n        RCC->CFGR0 |= (uint32_t)(3<<22);\n        /* HCLK = SYSCLK/2 */\n        RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV2;\n#else\n        /* HCLK = SYSCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n#endif\n        /* PCLK2 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n        /* PCLK1 = HCLK */\n        RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n        /*  CH32V20x_D6-PLL configuration: PLLCLK = HSE * 15 = 120 MHz (HSE=8MHZ)\n         *  CH32V20x_D8-PLL configuration: PLLCLK = HSE/4 * 15 = 120 MHz (HSE=32MHZ)\n         *  CH32V20x_D8W-PLL configuration: PLLCLK = HSE/2 * 15 = 240 MHz (HSE=32MHZ)\n         */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                              RCC_PLLMULL));\n\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15);\n\n        /* Enable PLL */\n        RCC->CTLR |= RCC_PLLON;\n        /* Wait till PLL is ready */\n        while((RCC->CTLR & RCC_PLLRDY) == 0)\n        {\n        }\n        /* Select PLL as system clock source */\n        RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n        RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n        /* Wait till PLL is used as system clock source */\n        while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n        {\n        }\n    }\n    else\n    {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n         * configuration. User can add here some code to deal with this error\n         */\n    }\n}\n#elif defined SYSCLK_FREQ_144MHz_HSE\n\n/*********************************************************************\n * @fn      SetSysClockTo144_HSE\n *\n * @brief   Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo144_HSE(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  CH32V20x_D6-PLL configuration: PLLCLK = HSE * 18 = 144 MHz (HSE=8MHZ)\n     *  CH32V20x_D8-PLL configuration: PLLCLK = HSE/4 * 18 = 144 MHz (HSE=32MHZ)\n     *  CH32V20x_D8W-PLL configuration: PLLCLK = HSE/4 * 18 = 144 MHz (HSE=32MHZ)\n     */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n#elif defined SYSCLK_FREQ_48MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo48_HSI\n *\n * @brief   Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo48_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 6 = 48 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n     RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL6);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n#elif defined SYSCLK_FREQ_56MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo56_HSI\n *\n * @brief   Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo56_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 7 = 48 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n     RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL7);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n#elif defined SYSCLK_FREQ_72MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo72_HSI\n *\n * @brief   Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo72_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 9 = 72 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n     RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL9);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n#elif defined SYSCLK_FREQ_96MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo96_HSI\n *\n * @brief   Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo96_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 12 = 96 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n     RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL12);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n#elif defined SYSCLK_FREQ_120MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo120_HSI\n *\n * @brief   Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo120_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 15 = 120 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                          RCC_PLLMULL));\n\n    RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL15);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t) ~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n#elif defined SYSCLK_FREQ_144MHz_HSI\n\n/*********************************************************************\n * @fn      SetSysClockTo144_HSI\n *\n * @brief   Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo144_HSI(void)\n{\n    EXTEN->EXTEN_CTR |= EXTEN_PLL_HSI_PRE;\n\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSI * 18 = 144 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n     RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSI_Div2 | RCC_PLLMULL18);\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v20x/system_ch32v20x.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n * File Name          : system_ch32v20x.h\n * Author             : WCH\n * Version            : V1.0.0\n * Date               : 2021/06/06\n * Description        : CH32V20x Device Peripheral Access Layer System Header File.\n*********************************************************************************\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* Attention: This software (modified or not) and binary are used for\n* microcontroller manufactured by Nanjing Qinheng Microelectronics.\n*******************************************************************************/\n#ifndef __SYSTEM_ch32v20x_H\n#define __SYSTEM_ch32v20x_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\nextern uint32_t SystemCoreClock;          /* System Clock Frequency (Core Clock) */\n\n/* System_Exported_Functions */\nextern void SystemInit(void);\nextern void SystemCoreClockUpdate(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*__CH32V20x_SYSTEM_H */\n"
  },
  {
    "path": "hw/bsp/ch32v20x/wch-riscv.cfg",
    "content": "adapter driver wlinke\nadapter speed 6000\ntransport select sdi\n\nwlink_set_address 0x00000000\nset _CHIPNAME wch_riscv\nsdi newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x00001\n\nset _TARGETNAME $_CHIPNAME.cpu\n\ntarget create $_TARGETNAME.0 wch_riscv -chain-position $_TARGETNAME\n$_TARGETNAME.0 configure  -work-area-phys 0x20000000 -work-area-size 10000 -work-area-backup 1\nset _FLASHNAME $_CHIPNAME.flash\n\nflash bank $_FLASHNAME wch_riscv 0x00000000 0 0 0 $_TARGETNAME.0\n\necho \"Ready for Remote Connections\"\n"
  },
  {
    "path": "hw/bsp/ch32v30x/boards/ch32v307v_r1_1v0/board.cmake",
    "content": "set(LD_FLASH_SIZE 256K)\nset(LD_RAM_SIZE 64K)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v30x/boards/ch32v307v_r1_1v0/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org) for Adafruit Industries\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* metadata:\n   name: CH32V307V-R1-1v0\n   url: https://github.com/openwch/ch32v307/tree/main/SCHPCB/CH32V307V-R1-1v0\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED: need to wire pin LED1 to PC0 in the J3 header\n#define LED_PORT              GPIOC\n#define LED_PIN               GPIO_Pin_0\n#define LED_STATE_ON          0\n#define LED_CLOCK_EN()        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE)\n\n// Button: need to wire pin KEY to PC1 in the J3 header\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_Pin_1\n#define BUTTON_STATE_ACTIVE   0\n#define BUTTON_CLOCK_EN()     do { } while(0) // same as LED clock, no need to do anything\n\n// TODO UART port\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v30x/boards/ch32v307v_r1_1v0/board.mk",
    "content": "LDFLAGS += \\\n  -Wl,--defsym=__FLASH_SIZE=256K \\\n  -Wl,--defsym=__RAM_SIZE=64K \\\n"
  },
  {
    "path": "hw/bsp/ch32v30x/boards/nanoch32v305/board.cmake",
    "content": "set(LD_FLASH_SIZE 128K)\nset(LD_RAM_SIZE 32K)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v30x/boards/nanoch32v305/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org) for Adafruit Industries\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* metadata:\n   name: nanoCH32V305\n   url: https://github.com/wuxx/nanoCH32V305\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_Pin_3\n#define LED_STATE_ON          0\n#define LED_CLOCK_EN()        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)\n\n// TODO UART port\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v30x/boards/nanoch32v305/board.mk",
    "content": "LDFLAGS += \\\n  -Wl,--defsym=__FLASH_SIZE=128K \\\n  -Wl,--defsym=__RAM_SIZE=32K \\\n"
  },
  {
    "path": "hw/bsp/ch32v30x/ch32v30x_conf.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n* File Name          : ch32v30x_conf.h\n* Author             : WCH\n* Version            : V1.0.0\n* Date               : 2021/06/06\n* Description        : Library configuration file.\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* SPDX-License-Identifier: Apache-2.0\n*******************************************************************************/\n#ifndef __CH32V30x_CONF_H\n#define __CH32V30x_CONF_H\n\n#include \"ch32v30x_adc.h\"\n#include \"ch32v30x_bkp.h\"\n#include \"ch32v30x_can.h\"\n#include \"ch32v30x_crc.h\"\n#include \"ch32v30x_dac.h\"\n#include \"ch32v30x_dbgmcu.h\"\n#include \"ch32v30x_dma.h\"\n#include \"ch32v30x_exti.h\"\n#include \"ch32v30x_flash.h\"\n#include \"ch32v30x_fsmc.h\"\n#include \"ch32v30x_gpio.h\"\n#include \"ch32v30x_i2c.h\"\n#include \"ch32v30x_iwdg.h\"\n#include \"ch32v30x_pwr.h\"\n#include \"ch32v30x_rcc.h\"\n#include \"ch32v30x_rtc.h\"\n#include \"ch32v30x_sdio.h\"\n#include \"ch32v30x_spi.h\"\n#include \"ch32v30x_tim.h\"\n#include \"ch32v30x_usart.h\"\n#include \"ch32v30x_wwdg.h\"\n#include \"ch32v30x_it.h\"\n#include \"ch32v30x_misc.h\"\n\n\n#endif /* __CH32V30x_CONF_H */\n"
  },
  {
    "path": "hw/bsp/ch32v30x/ch32v30x_it.c",
    "content": "/********************************** (C) COPYRIGHT *******************************\n* File Name          : ch32v30x_it.c\n* Author             : WCH\n* Version            : V1.0.0\n* Date               : 2021/06/06\n* Description        : Main Interrupt Service Routines.\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* SPDX-License-Identifier: Apache-2.0\n*******************************************************************************/\n#include \"ch32v30x_it.h\"\n\nvoid NMI_Handler(void) __attribute__((naked));\nvoid HardFault_Handler(void) __attribute__((naked));\n\n/*********************************************************************\n * @fn      NMI_Handler\n *\n * @brief   This function handles NMI exception.\n *\n * @return  none\n */\nvoid NMI_Handle(void){\n      __asm volatile (\"call NMI_Handler_impl; mret\");\n}\n\n__attribute__((used)) void NMI_Handler_impl(void)\n{\n\n}\n\n/*********************************************************************\n * @fn      HardFault_Handler\n *\n * @brief   This function handles Hard Fault exception.\n *\n * @return  none\n */\nvoid HardFault_Handler(void){\n      __asm volatile (\"call HardFault_Handler_impl; mret\");\n}\n\n__attribute__((used)) void HardFault_Handler_impl(void)\n{\n  while (1)\n  {\n  }\n}\n"
  },
  {
    "path": "hw/bsp/ch32v30x/ch32v30x_it.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n* File Name          : ch32v30x_it.h\n* Author             : WCH\n* Version            : V1.0.0\n* Date               : 2021/06/06\n* Description        : This file contains the headers of the interrupt handlers.\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* SPDX-License-Identifier: Apache-2.0\n*******************************************************************************/\n#ifndef __CH32V30x_IT_H\n#define __CH32V30x_IT_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"ch32v30x.h\"\n\nvoid USBHS_IRQHandler(void);\nvoid OTG_FS_IRQHandler(void);\nvoid SysTick_Handler(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n\n#endif /* __CH32V30x_IT_H */\n"
  },
  {
    "path": "hw/bsp/ch32v30x/debug_uart.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Greg Davill\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"debug_uart.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#endif\n\n#include <ch32v30x.h>\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#define UART_RINGBUFFER_SIZE_TX 128\n#define UART_RINGBUFFER_MASK_TX (UART_RINGBUFFER_SIZE_TX-1)\n\nstatic char tx_buf[UART_RINGBUFFER_SIZE_TX];\nstatic unsigned int tx_produce;\nstatic volatile unsigned int tx_consume;\n\nvoid USART1_IRQHandler(void) __attribute__((naked));\nvoid USART1_IRQHandler(void) {\n      __asm volatile (\"call USART1_IRQHandler_impl; mret\");\n}\n\nvoid USART1_IRQHandler_impl(void) __attribute__((used)) ;\nvoid USART1_IRQHandler_impl(void)\n{\n\tif(USART_GetITStatus(USART1, USART_IT_TC) != RESET)\n    {\n        USART_ClearITPendingBit(USART1, USART_IT_TC);\n\n\t\tif(tx_consume != tx_produce) {\n\t\t\tUSART_SendData(USART1, tx_buf[tx_consume]);\n\t\t\ttx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;\n\t\t}\n    }\n\n}\n\nvoid uart_write(char c)\n{\n\tunsigned int tx_produce_next = (tx_produce + 1) & UART_RINGBUFFER_MASK_TX;\n\n    NVIC_DisableIRQ(USART1_IRQn);\n    if((tx_consume != tx_produce) || (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET)) {\n\t\ttx_buf[tx_produce] = c;\n\t\ttx_produce = tx_produce_next;\n\t} else {\n\t\tUSART_SendData(USART1, c);\n\t}\n    NVIC_EnableIRQ(USART1_IRQn);\n}\n\n\nvoid uart_sync(void)\n{\n\twhile(tx_consume != tx_produce);\n}\n\n\nvoid usart_printf_init(uint32_t baudrate)\n{\n  GPIO_InitTypeDef GPIO_InitStructure;\n  USART_InitTypeDef USART_InitStructure;\n\n  tx_produce = 0;\n  tx_consume = 0;\n\n  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);\n\n  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;\n  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\n  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;\n  GPIO_Init(GPIOA, &GPIO_InitStructure);\n\n  USART_InitStructure.USART_BaudRate = baudrate;\n  USART_InitStructure.USART_WordLength = USART_WordLength_8b;\n  USART_InitStructure.USART_StopBits = USART_StopBits_1;\n  USART_InitStructure.USART_Parity = USART_Parity_No;\n  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;\n  USART_InitStructure.USART_Mode = USART_Mode_Tx;\n\n  USART_Init(USART1, &USART_InitStructure);\n  USART_ITConfig(USART1, USART_IT_TC, ENABLE);\n  USART_Cmd(USART1, ENABLE);\n\n  NVIC_InitTypeDef NVIC_InitStructure = { 0 };\n  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;\n  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;\n  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;\n  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;\n  NVIC_Init(&NVIC_InitStructure);\n}\n"
  },
  {
    "path": "hw/bsp/ch32v30x/debug_uart.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Greg Davill\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include <stdint.h>\n\nvoid uart_write(char c);\nvoid uart_sync(void);\nvoid usart_printf_init(uint32_t baudrate);\n"
  },
  {
    "path": "hw/bsp/ch32v30x/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Greg Davill\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: WCH\n*/\n\n#include \"stdio.h\"\n\n// https://github.com/openwch/ch32v307/pull/90\n// https://github.com/openwch/ch32v20x/pull/12\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#endif\n\n#include \"debug_uart.h\"\n#include \"ch32v30x.h\"\n#include \"ch32v30x_it.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\n// TODO maybe having FS as port0, HS as port1\n\n__attribute__((interrupt)) void USBHS_IRQHandler(void) {\n  #if CFG_TUD_WCH_USBIP_USBHS\n  tud_int_handler(0);\n  #endif\n}\n\n__attribute__((interrupt)) void OTG_FS_IRQHandler(void) {\n  #if CFG_TUD_WCH_USBIP_USBFS\n  tud_int_handler(0);\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\nstatic uint32_t SysTick_Config(uint32_t ticks) {\n  NVIC_EnableIRQ(SysTicK_IRQn);\n  SysTick->CTLR = 0;\n  SysTick->SR = 0;\n  SysTick->CNT = 0;\n  SysTick->CMP = ticks - 1;\n  SysTick->CTLR = 0xF;\n  return 0;\n}\n\nvoid board_init(void) {\n\n  /* Disable interrupts during init */\n  __disable_irq();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(SystemCoreClock / 1000);\n#endif\n\n  usart_printf_init(CFG_BOARD_UART_BAUDRATE);\n\n#ifdef CH32V30x_D8C\n  // v305/v307: Highspeed USB\n  RCC_USBCLK48MConfig(RCC_USBCLK48MCLKSource_USBPHY);\n  RCC_USBHSPLLCLKConfig(RCC_HSBHSPLLCLKSource_HSE);\n  RCC_USBHSConfig(RCC_USBPLL_Div2);\n  RCC_USBHSPLLCKREFCLKConfig(RCC_USBHSPLLCKREFCLK_4M);\n  RCC_USBHSPHYPLLALIVEcmd(ENABLE);\n  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_USBHS, ENABLE);\n#endif\n\n  // Fullspeed USB\n  uint8_t otg_div;\n  switch (SystemCoreClock) {\n    case 48000000:  otg_div = RCC_OTGFSCLKSource_PLLCLK_Div1; break;\n    case 96000000:  otg_div = RCC_OTGFSCLKSource_PLLCLK_Div2; break;\n    case 144000000: otg_div = RCC_OTGFSCLKSource_PLLCLK_Div3; break;\n    default: TU_ASSERT(0,); break;\n  }\n  RCC_OTGFSCLKConfig(otg_div);\n  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_OTG_FS, ENABLE);\n\n  GPIO_InitTypeDef GPIO_InitStructure = {0};\n\n  // LED\n  LED_CLOCK_EN();\n  GPIO_InitStructure.GPIO_Pin = LED_PIN;\n  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;\n  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\n  GPIO_Init(LED_PORT, &GPIO_InitStructure);\n\n  // Button\n#ifdef BUTTON_PORT\n  BUTTON_CLOCK_EN();\n  GPIO_InitStructure.GPIO_Pin = BUTTON_PIN;\n  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;\n  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\n  GPIO_Init(BUTTON_PORT, &GPIO_InitStructure);\n#endif\n  /* Enable interrupts globally */\n  __enable_irq();\n\n  board_delay(2);\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\n__attribute__((interrupt)) void SysTick_Handler(void) {\n  SysTick->SR = 0;\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_WriteBit(LED_PORT, LED_PIN, state);\n}\n\nuint32_t board_button_read(void) {\n#ifdef BUTTON_PORT\n  return BUTTON_STATE_ACTIVE == GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN);\n#else\n  return false;\n#endif\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  int txsize = len;\n  const char* bufc = (const char*) buf;\n  while (txsize--) {\n    uart_write(*bufc++);\n  }\n  uart_sync();\n  return len;\n}\n\n#ifdef USE_FULL_ASSERT\n/**\n * @brief  Reports the name of the source file and the source line number\n *         where the assert_param error has occurred.\n * @param  file: pointer to the source file name\n * @param  line: assert_param error line source number\n * @retval None\n */\nvoid assert_failed(char* file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line\n     number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line)\n   */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/ch32v30x/family.cmake",
    "content": "include_guard()\n\nset(CH32_FAMILY ch32v30x)\nset(SDK_DIR ${TOP}/hw/mcu/wch/ch32v307)\nset(SDK_SRC_DIR ${SDK_DIR}/EVT/EXAM/SRC)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS CH32V307 CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f ${CMAKE_CURRENT_LIST_DIR}/wch-riscv.cfg\")\n\n# default to highspeed, used to select USBFS / USBHS driver\nif (NOT DEFINED SPEED)\n  set(SPEED high)\nendif()\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/ch32v30x.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED STARTUP_FILE_GNU)\nset(STARTUP_FILE_GNU ${SDK_SRC_DIR}/Startup/startup_${CH32_FAMILY}_D8C.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_SRC_DIR}/Core/core_riscv.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_gpio.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_misc.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_rcc.c\n    ${SDK_SRC_DIR}/Peripheral/src/${CH32_FAMILY}_usart.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${CH32_FAMILY}_it.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/system_${CH32_FAMILY}.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_SRC_DIR}/Core\n    ${SDK_SRC_DIR}/Peripheral/inc\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    )\n  if (SPEED STREQUAL high)\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      CFG_TUD_WCH_USBIP_USBHS=1\n#      BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n      )\n  else ()\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      CFG_TUD_WCH_USBIP_USBFS=1\n      )\n  endif ()\n\n  update_board(${BOARD_TARGET})\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${BOARD_TARGET} PUBLIC\n      -msmall-data-limit=8\n      -mno-save-restore\n      -fmessage-length=0\n      -fsigned-char\n      )\n  endif ()\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_CH32V307)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/debug_uart.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/wch/dcd_ch32_usbhs.c\n    ${TOP}/src/portable/wch/dcd_ch32_usbfs.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      -Wl,--defsym=__FLASH_SIZE=${LD_FLASH_SIZE}\n      -Wl,--defsym=__RAM_SIZE=${LD_RAM_SIZE}\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    message(FATAL_ERROR \"Clang is not supported\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_openocd_wch(${TARGET})\n  family_flash_wlink_rs(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ch32v30x/family.mk",
    "content": "# https://www.embecosm.com/resources/tool-chain-downloads/#riscv-stable\n#CROSS_COMPILE ?= riscv32-unknown-elf-\n\n# Toolchain from https://nucleisys.com/download.php\n#CROSS_COMPILE ?= riscv-nuclei-elf-\n\n# Toolchain from https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack\nCROSS_COMPILE ?= riscv-none-elf-\n\nCH32_FAMILY = ch32v30x\nSDK_DIR = hw/mcu/wch/ch32v307\nSDK_SRC_DIR = $(SDK_DIR)/EVT/EXAM/SRC\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= rv32imac-ilp32\n\n# default to use high speed port, unless specified in board.mk or command line\nSPEED ?= high\n\nCFLAGS += \\\n\t-flto \\\n\t-msmall-data-limit=8 \\\n\t-mno-save-restore \\\n\t-fmessage-length=0 \\\n\t-fsigned-char \\\n\t-DCFG_TUSB_MCU=OPT_MCU_CH32V307 \\\n\n# https://github.com/openwch/ch32v307/pull/90\nCFLAGS += -Wno-error=strict-prototypes\n\nifeq ($(SPEED),high)\n  $(info \"Using USBHS driver for HighSpeed mode\")\n  CFLAGS += -DCFG_TUD_WCH_USBIP_USBHS=1\nelse\n  $(info \"Using USBFS driver for FullSpeed mode\")\n  CFLAGS += -DCFG_TUD_WCH_USBIP_USBFS=1\nendif\n\nLDFLAGS_GCC += \\\n\t-nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs \\\n\nSRC_C += \\\n\tsrc/portable/wch/dcd_ch32_usbhs.c \\\n\tsrc/portable/wch/dcd_ch32_usbfs.c \\\n\t$(SDK_SRC_DIR)/Core/core_riscv.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_gpio.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_misc.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_rcc.c \\\n\t$(SDK_SRC_DIR)/Peripheral/src/${CH32_FAMILY}_usart.c\n\nSRC_S += \\\n\t$(SDK_SRC_DIR)/Startup/startup_${CH32_FAMILY}_D8C.S\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(SDK_SRC_DIR)/Core \\\n\t$(TOP)/$(SDK_SRC_DIR)/Peripheral/inc\n\nLD_FILE ?= $(FAMILY_PATH)/linker/ch32v30x.ld\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RISC-V\n\nOPENOCD_WCH_OPTION=-f $(TOP)/$(FAMILY_PATH)/wch-riscv.cfg\nflash: flash-openocd-wch\n"
  },
  {
    "path": "hw/bsp/ch32v30x/linker/ch32v30x.ld",
    "content": "/* Define default values if not already defined */\n__flash_size = DEFINED(__FLASH_SIZE) ? __FLASH_SIZE : 128K;\n__ram_size = DEFINED(__RAM_SIZE) ? __RAM_SIZE : 32K;\n__stack_size = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 2048;\n\nMEMORY\n{\n\tFLASH (rx) : ORIGIN = 0x00000000, LENGTH = __flash_size\n\tRAM (xrw) : ORIGIN = 0x20000000, LENGTH = __ram_size\n}\n\nENTRY( _start )\n\nPROVIDE( _stack_size = __stack_size );\n\nSECTIONS\n{\n\t.init :\n\t{\n\t\t_sinit = .;\n\t\t. = ALIGN(4);\n\t\tKEEP(*(SORT_NONE(.init)))\n\t\t. = ALIGN(4);\n\t\t_einit = .;\n\t} >FLASH AT>FLASH\n\n  .vector :\n  {\n      *(.vector);\n\t  . = ALIGN(64);\n  } >FLASH AT>FLASH\n\n\t.text :\n\t{\n\t\t. = ALIGN(4);\n\t\t*(.text)\n\t\t*(.text.*)\n\t\t*(.rodata)\n\t\t*(.rodata*)\n\t\t*(.glue_7)\n\t\t*(.glue_7t)\n\t\t*(.gnu.linkonce.t.*)\n\t\t. = ALIGN(4);\n\t} >FLASH AT>FLASH\n\n\t.fini :\n\t{\n\t\tKEEP(*(SORT_NONE(.fini)))\n\t\t. = ALIGN(4);\n\t} >FLASH AT>FLASH\n\n\tPROVIDE( _etext = . );\n\tPROVIDE( _eitcm = . );\n\n\t.preinit_array  :\n\t{\n\t  PROVIDE_HIDDEN (__preinit_array_start = .);\n\t  KEEP (*(.preinit_array))\n\t  PROVIDE_HIDDEN (__preinit_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.init_array     :\n\t{\n\t  PROVIDE_HIDDEN (__init_array_start = .);\n\t  KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))\n\t  KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))\n\t  PROVIDE_HIDDEN (__init_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.fini_array     :\n\t{\n\t  PROVIDE_HIDDEN (__fini_array_start = .);\n\t  KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))\n\t  KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))\n\t  PROVIDE_HIDDEN (__fini_array_end = .);\n\t} >FLASH AT>FLASH\n\n\t.ctors          :\n\t{\n\t  /* gcc uses crtbegin.o to find the start of\n\t     the constructors, so we make sure it is\n\t     first.  Because this is a wildcard, it\n\t     doesn't matter if the user does not\n\t     actually link against crtbegin.o; the\n\t     linker won't look for a file to match a\n\t     wildcard.  The wildcard also means that it\n\t     doesn't matter which directory crtbegin.o\n\t     is in.  */\n\t  KEEP (*crtbegin.o(.ctors))\n\t  KEEP (*crtbegin?.o(.ctors))\n\t  /* We don't want to include the .ctor section from\n\t     the crtend.o file until after the sorted ctors.\n\t     The .ctor section from the crtend file contains the\n\t     end of ctors marker and it must be last */\n\t  KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))\n\t  KEEP (*(SORT(.ctors.*)))\n\t  KEEP (*(.ctors))\n\t} >FLASH AT>FLASH\n\n\t.dtors          :\n\t{\n\t  KEEP (*crtbegin.o(.dtors))\n\t  KEEP (*crtbegin?.o(.dtors))\n\t  KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))\n\t  KEEP (*(SORT(.dtors.*)))\n\t  KEEP (*(.dtors))\n\t} >FLASH AT>FLASH\n\n\t.dalign :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE(_data_vma = .);\n\t} >RAM AT>FLASH\n\n\t.dlalign :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE(_data_lma = .);\n\t} >FLASH AT>FLASH\n\n\t.data :\n\t{\n    \t*(.gnu.linkonce.r.*)\n    \t*(.data .data.*)\n    \t*(.gnu.linkonce.d.*)\n\t\t. = ALIGN(8);\n    \tPROVIDE( __global_pointer$ = . + 0x800 );\n    \t*(.sdata .sdata.*)\n\t\t*(.sdata2.*)\n    \t*(.gnu.linkonce.s.*)\n    \t. = ALIGN(8);\n    \t*(.srodata.cst16)\n    \t*(.srodata.cst8)\n    \t*(.srodata.cst4)\n    \t*(.srodata.cst2)\n    \t*(.srodata .srodata.*)\n    \t. = ALIGN(4);\n\t\tPROVIDE( _edata = .);\n\t} >RAM AT>FLASH\n\n\t.bss :\n\t{\n\t\t. = ALIGN(4);\n\t\tPROVIDE( _sbss = .);\n  \t    *(.sbss*)\n        *(.gnu.linkonce.sb.*)\n\t\t*(.bss*)\n     \t*(.gnu.linkonce.b.*)\n\t\t*(COMMON*)\n\t\t. = ALIGN(4);\n\t\tPROVIDE( _ebss = .);\n\t} >RAM AT>FLASH\n\n\tPROVIDE( _end = _ebss);\n\tPROVIDE( end = . );\n\n    .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :\n    {\n        PROVIDE( _heap_end = . );\n        . = ALIGN(4);\n        PROVIDE(_susrstack = . );\n        . = . + __stack_size;\n        PROVIDE( _eusrstack = .);\n        __freertos_irq_stack_top = .;\n    } >RAM\n\n}\n"
  },
  {
    "path": "hw/bsp/ch32v30x/system_ch32v30x.c",
    "content": "/********************************** (C) COPYRIGHT *******************************\n* File Name          : system_ch32v30x.c\n* Author             : WCH\n* Version            : V1.0.0\n* Date               : 2021/06/06\n* Description        : CH32V30x Device Peripheral Access Layer System Source File.\n*                      For HSE = 8Mhz\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* SPDX-License-Identifier: Apache-2.0\n*********************************************************************************/\n#include \"ch32v30x.h\"\n\n/*\n* Uncomment the line corresponding to the desired System clock (SYSCLK) frequency (after\n* reset the HSI is used as SYSCLK source).\n* If none of the define below is enabled, the HSI is used as System clock source.\n*/\n// #define SYSCLK_FREQ_HSE    HSE_VALUE\n/* #define SYSCLK_FREQ_24MHz  24000000  */\n//#define SYSCLK_FREQ_48MHz  48000000\n/* #define SYSCLK_FREQ_56MHz  56000000  */\n//#define SYSCLK_FREQ_72MHz  72000000\n//#define SYSCLK_FREQ_96MHz  96000000\n//#define SYSCLK_FREQ_120MHz  120000000\n#define SYSCLK_FREQ_144MHz  144000000\n\n/* Clock Definitions */\n#ifdef SYSCLK_FREQ_HSE\n  uint32_t SystemCoreClock         = SYSCLK_FREQ_HSE;          /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_24MHz\n  uint32_t SystemCoreClock         = SYSCLK_FREQ_24MHz;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_48MHz\n  uint32_t SystemCoreClock         = SYSCLK_FREQ_48MHz;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_56MHz\n  uint32_t SystemCoreClock         = SYSCLK_FREQ_56MHz;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_72MHz\n  uint32_t SystemCoreClock         = SYSCLK_FREQ_72MHz;        /* System Clock Frequency (Core Clock) */\n\n#elif defined SYSCLK_FREQ_96MHz\n  uint32_t SystemCoreClock         = SYSCLK_FREQ_96MHz;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_120MHz\n  uint32_t SystemCoreClock         = SYSCLK_FREQ_120MHz;        /* System Clock Frequency (Core Clock) */\n#elif defined SYSCLK_FREQ_144MHz\n  uint32_t SystemCoreClock         = SYSCLK_FREQ_144MHz;        /* System Clock Frequency (Core Clock) */\n\n#else /* HSI Selected as System Clock source */\n  uint32_t SystemCoreClock         = HSI_VALUE;                /* System Clock Frequency (Core Clock) */\n#endif\n\n__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};\n\n\n/* system_private_function_proto_types */\nstatic void SetSysClock(void);\n\n#ifdef SYSCLK_FREQ_HSE\n  static void SetSysClockToHSE(void);\n#elif defined SYSCLK_FREQ_24MHz\n  static void SetSysClockTo24(void);\n#elif defined SYSCLK_FREQ_48MHz\n  static void SetSysClockTo48(void);\n#elif defined SYSCLK_FREQ_56MHz\n  static void SetSysClockTo56(void);\n#elif defined SYSCLK_FREQ_72MHz\n  static void SetSysClockTo72(void);\n\n#elif defined SYSCLK_FREQ_96MHz\n  static void SetSysClockTo96(void);\n#elif defined SYSCLK_FREQ_120MHz\n  static void SetSysClockTo120(void);\n#elif defined SYSCLK_FREQ_144MHz\n  static void SetSysClockTo144(void);\n\n#endif\n\n\n/*********************************************************************\n * @fn      SystemInit\n *\n * @brief   Setup the microcontroller system Initialize the Embedded Flash Interface,\n *        the PLL and update the SystemCoreClock variable.\n *\n * @return  none\n */\nvoid SystemInit (void)\n{\n  RCC->CTLR |= (uint32_t)0x00000001;\n\n#ifdef CH32V30x_D8C\n  RCC->CFGR0 &= (uint32_t)0xF8FF0000;\n#else\n  RCC->CFGR0 &= (uint32_t)0xF0FF0000;\n#endif\n\n  RCC->CTLR &= (uint32_t)0xFEF6FFFF;\n  RCC->CTLR &= (uint32_t)0xFFFBFFFF;\n  RCC->CFGR0 &= (uint32_t)0xFF80FFFF;\n\n#ifdef CH32V30x_D8C\n  RCC->CTLR &= (uint32_t)0xEBFFFFFF;\n  RCC->INTR = 0x00FF0000;\n  RCC->CFGR2 = 0x00000000;\n#else\n  RCC->INTR = 0x009F0000;\n#endif\n  SetSysClock();\n}\n\n/*********************************************************************\n * @fn      SystemCoreClockUpdate\n *\n * @brief   Update SystemCoreClock variable according to Clock Register Values.\n *\n * @return  none\n */\nvoid SystemCoreClockUpdate (void)\n{\n  uint32_t tmp = 0, pllmull = 0, pllsource = 0, Pll_6_5 = 0;\n\n  tmp = RCC->CFGR0 & RCC_SWS;\n\n  switch (tmp)\n  {\n    case 0x00:\n      SystemCoreClock = HSI_VALUE;\n      break;\n    case 0x04:\n      SystemCoreClock = HSE_VALUE;\n      break;\n    case 0x08:\n      pllmull = RCC->CFGR0 & RCC_PLLMULL;\n      pllsource = RCC->CFGR0 & RCC_PLLSRC;\n      pllmull = ( pllmull >> 18) + 2;\n\n#ifdef CH32V30x_D8\n          if(pllmull == 17) pllmull = 18;\n#else\n          if(pllmull == 2) pllmull = 18;\n          if(pllmull == 15){\n              pllmull = 13;  /* *6.5 */\n              Pll_6_5 = 1;\n          }\n          if(pllmull == 16) pllmull = 15;\n          if(pllmull == 17) pllmull = 16;\n#endif\n\n      if (pllsource == 0x00)\n      {\n        SystemCoreClock = (HSI_VALUE >> 1) * pllmull;\n      }\n      else\n      {\n        if ((RCC->CFGR0 & RCC_PLLXTPRE) != (uint32_t)RESET)\n        {\n          SystemCoreClock = (HSE_VALUE >> 1) * pllmull;\n        }\n        else\n        {\n          SystemCoreClock = HSE_VALUE * pllmull;\n        }\n      }\n\n      if(Pll_6_5 == 1) SystemCoreClock = (SystemCoreClock / 2);\n\n      break;\n    default:\n      SystemCoreClock = HSI_VALUE;\n      break;\n  }\n\n  tmp = AHBPrescTable[((RCC->CFGR0 & RCC_HPRE) >> 4)];\n  SystemCoreClock >>= tmp;\n}\n\n/*********************************************************************\n * @fn      SetSysClock\n *\n * @brief   Configures the System clock frequency, HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClock(void)\n{\n#ifdef SYSCLK_FREQ_HSE\n  SetSysClockToHSE();\n#elif defined SYSCLK_FREQ_24MHz\n  SetSysClockTo24();\n#elif defined SYSCLK_FREQ_48MHz\n  SetSysClockTo48();\n#elif defined SYSCLK_FREQ_56MHz\n  SetSysClockTo56();\n#elif defined SYSCLK_FREQ_72MHz\n  SetSysClockTo72();\n#elif defined SYSCLK_FREQ_96MHz\n  SetSysClockTo96();\n#elif defined SYSCLK_FREQ_120MHz\n  SetSysClockTo120();\n#elif defined SYSCLK_FREQ_144MHz\n  SetSysClockTo144();\n\n#endif\n\n /* If none of the define above is enabled, the HSI is used as System clock\n  * source (default after reset)\n    */\n}\n\n\n#ifdef SYSCLK_FREQ_HSE\n\n/*********************************************************************\n * @fn      SetSysClockToHSE\n *\n * @brief   Sets HSE as System clock source and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockToHSE(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;\n\n    /* Select HSE as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_HSE;\n\n    /* Wait till HSE is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x04)\n    {\n    }\n  }\n  else\n  {\n        /* If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n#elif defined SYSCLK_FREQ_24MHz\n\n/*********************************************************************\n * @fn      SetSysClockTo24\n *\n * @brief   Sets System clock frequency to 24MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo24(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV1;\n\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n#ifdef CH32V30x_D8\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL3);\n#else\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL3_EXTEN);\n#endif\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /* If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n#elif defined SYSCLK_FREQ_48MHz\n\n/*********************************************************************\n * @fn      SetSysClockTo48\n *\n * @brief   Sets System clock frequency to 48MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo48(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSE * 6 = 48 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n#ifdef CH32V30x_D8\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6);\n#else\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL6_EXTEN);\n#endif\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n#elif defined SYSCLK_FREQ_56MHz\n\n/*********************************************************************\n * @fn      SetSysClockTo56\n *\n * @brief   Sets System clock frequency to 56MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo56(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /* PLL configuration: PLLCLK = HSE * 7 = 56 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE | RCC_PLLMULL));\n\n#ifdef CH32V30x_D8\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7);\n#else\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL7_EXTEN);\n#endif\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n#elif defined SYSCLK_FREQ_72MHz\n\n/*********************************************************************\n * @fn      SetSysClockTo72\n *\n * @brief   Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo72(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /* PLL configuration: PLLCLK = HSE * 9 = 72 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n#ifdef CH32V30x_D8\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9);\n#else\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL9_EXTEN);\n#endif\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n\n#elif defined SYSCLK_FREQ_96MHz\n\n/*********************************************************************\n * @fn      SetSysClockTo96\n *\n * @brief   Sets System clock frequency to 96MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo96(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSE * 12 = 96 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n#ifdef CH32V30x_D8\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12);\n#else\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL12_EXTEN);\n#endif\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n\n#elif defined SYSCLK_FREQ_120MHz\n\n/*********************************************************************\n * @fn      SetSysClockTo120\n *\n * @brief   Sets System clock frequency to 120MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo120(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSE * 15 = 120 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n#ifdef CH32V30x_D8\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15);\n#else\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL15_EXTEN);\n#endif\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n\n#elif defined SYSCLK_FREQ_144MHz\n\n/*********************************************************************\n * @fn      SetSysClockTo144\n *\n * @brief   Sets System clock frequency to 144MHz and configure HCLK, PCLK2 and PCLK1 prescalers.\n *\n * @return  none\n */\nstatic void SetSysClockTo144(void)\n{\n  __IO uint32_t StartUpCounter = 0, HSEStatus = 0;\n\n  RCC->CTLR |= ((uint32_t)RCC_HSEON);\n\n  /* Wait till HSE is ready and if Time out is reached exit */\n  do\n  {\n    HSEStatus = RCC->CTLR & RCC_HSERDY;\n    StartUpCounter++;\n  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));\n\n  if ((RCC->CTLR & RCC_HSERDY) != RESET)\n  {\n    HSEStatus = (uint32_t)0x01;\n  }\n  else\n  {\n    HSEStatus = (uint32_t)0x00;\n  }\n\n  if (HSEStatus == (uint32_t)0x01)\n  {\n    /* HCLK = SYSCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_HPRE_DIV1;\n    /* PCLK2 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE2_DIV1;\n    /* PCLK1 = HCLK */\n    RCC->CFGR0 |= (uint32_t)RCC_PPRE1_DIV2;\n\n    /*  PLL configuration: PLLCLK = HSE * 18 = 144 MHz */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_PLLSRC | RCC_PLLXTPRE |\n                                        RCC_PLLMULL));\n\n#ifdef CH32V30x_D8\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18);\n#else\n        RCC->CFGR0 |= (uint32_t)(RCC_PLLSRC_HSE | RCC_PLLXTPRE_HSE | RCC_PLLMULL18_EXTEN);\n#endif\n\n    /* Enable PLL */\n    RCC->CTLR |= RCC_PLLON;\n    /* Wait till PLL is ready */\n    while((RCC->CTLR & RCC_PLLRDY) == 0)\n    {\n    }\n    /* Select PLL as system clock source */\n    RCC->CFGR0 &= (uint32_t)((uint32_t)~(RCC_SW));\n    RCC->CFGR0 |= (uint32_t)RCC_SW_PLL;\n    /* Wait till PLL is used as system clock source */\n    while ((RCC->CFGR0 & (uint32_t)RCC_SWS) != (uint32_t)0x08)\n    {\n    }\n  }\n  else\n  {\n        /*\n         * If HSE fails to start-up, the application will have wrong clock\n     * configuration. User can add here some code to deal with this error\n         */\n  }\n}\n\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ch32v30x/system_ch32v30x.h",
    "content": "/********************************** (C) COPYRIGHT *******************************\n* File Name          : system_ch32v30x.h\n* Author             : WCH\n* Version            : V1.0.0\n* Date               : 2021/06/06\n* Description        : CH32V30x Device Peripheral Access Layer System Header File.\n* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.\n* SPDX-License-Identifier: Apache-2.0\n*******************************************************************************/\n#ifndef __SYSTEM_CH32V30x_H\n#define __SYSTEM_CH32V30x_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\nextern uint32_t SystemCoreClock;          /* System Clock Frequency (Core Clock) */\n\n/* System_Exported_Functions */\nextern void SystemInit(void);\nextern void SystemCoreClockUpdate(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*__CH32V30x_SYSTEM_H */\n"
  },
  {
    "path": "hw/bsp/ch32v30x/wch-riscv.cfg",
    "content": "adapter driver wlinke\nadapter speed 6000\ntransport select sdi\n\nwlink_set_address 0x00000000\nset _CHIPNAME wch_riscv\nsdi newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x00001\n\nset _TARGETNAME $_CHIPNAME.cpu\n\ntarget create $_TARGETNAME.0 wch_riscv -chain-position $_TARGETNAME\n$_TARGETNAME.0 configure  -work-area-phys 0x20000000 -work-area-size 10000 -work-area-backup 1\nset _FLASHNAME $_CHIPNAME.flash\n\nflash bank $_FLASHNAME wch_riscv 0x00000000 0 0 0 $_TARGETNAME.0\n\necho \"Ready for Remote Connections\"\n"
  },
  {
    "path": "hw/bsp/cxd56/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"nuttx/config.h\"\n#endif\n\n/* Cortex-M4F port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*8*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n// CXD56 (Cortex-M4F) has 3 priority bits\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/cxd56/boards/spresense/board.cmake",
    "content": "set(SERIAL /dev/ttyUSB0 CACHE STRING \"Serial port for flashing\")\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/cxd56/boards/spresense/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright 2019 Sony Semiconductor Solutions Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include <arch/chip/pin.h>\n\n#define LED_PIN         PIN_I2S1_BCK\n#define BUTTON_PIN      PIN_HIF_IRQ_OUT\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/cxd56/boards/spresense/board.mk",
    "content": "# Spresense board configuration\nSERIAL ?= /dev/ttyUSB0\n\n# flash\nflash: $(BUILD)/$(PROJECT).spk\n\t@echo FLASH $<\n\t@$(PYTHON) $(TOP)/hw/mcu/sony/cxd56/tools/flash_writer.py -s -c $(SERIAL) -d -b 115200 -n $<\n"
  },
  {
    "path": "hw/bsp/cxd56/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright 2019 Sony Semiconductor Solutions Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include <sys/boardctl.h>\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n\n#include <nuttx/arch.h>\n#include <arch/board/board.h>\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n// Initialize on-board peripherals : led, button, uart and USB\nvoid board_init(void)\n{\n  boardctl(BOARDIOC_INIT, 0);\n\n  board_gpio_write(PIN_I2S1_BCK, -1);\n  board_gpio_config(PIN_I2S1_BCK, 0, false, true, PIN_FLOAT);\n\n  board_gpio_write(PIN_HIF_IRQ_OUT, -1);\n  board_gpio_config(PIN_HIF_IRQ_OUT, 0, true, true, PIN_FLOAT);\n};\n\nvoid board_late_initialize(void) {\n\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\n// Turn LED on or off\nvoid board_led_write(bool state)\n{\n  board_gpio_write(LED_PIN, state);\n}\n\n// Get the current state of button\n// a '1' means active (pressed), a '0' means inactive.\nuint32_t board_button_read(void)\n{\n  if (board_gpio_read(BUTTON_PIN))\n  {\n    return 0;\n  }\n\n  return 1;\n}\n\n// Get characters from UART\nint board_uart_read(uint8_t *buf, int len)\n{\n  int r = read(0, buf, len);\n\n  return r;\n}\n\n// Send characters to UART\nint board_uart_write(void const *buf, int len)\n{\n  int r = write(1, buf, len);\n\n  return r;\n}\n\n// Get current milliseconds\nuint32_t tusb_time_millis_api(void)\n{\n  struct timespec tp;\n\n    /* Wait until RTC is available */\n    while (g_rtc_enabled == false);\n\n    if (clock_gettime(CLOCK_MONOTONIC, &tp))\n    {\n        return 0;\n    }\n\n    return (((uint64_t)tp.tv_sec) * 1000 + tp.tv_nsec / 1000000);\n}\n"
  },
  {
    "path": "hw/bsp/cxd56/family.cmake",
    "content": "include_guard()\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(SDK_DIR ${TOP}/hw/mcu/sony/cxd56/spresense-exported-sdk)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS CXD56 CACHE INTERNAL \"\")\n\n# Detect platform for mkspk tool\nif(CMAKE_HOST_SYSTEM_NAME STREQUAL \"Darwin\")\n  set(MKSPK ${TOP}/hw/mcu/sony/cxd56/mkspk/mkspk)\nelseif(CMAKE_HOST_SYSTEM_NAME STREQUAL \"Linux\")\n  set(MKSPK ${TOP}/hw/mcu/sony/cxd56/mkspk/mkspk)\nelse()\n  set(MKSPK ${TOP}/hw/mcu/sony/cxd56/mkspk/mkspk.exe)\nendif()\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_GNU ${SDK_DIR}/nuttx/scripts/ramconfig.ld)\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\n#------------------------------------\n# BOARD Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  # Spresense uses NuttX libraries\n  add_library(${BOARD_TARGET} INTERFACE)\n\n  target_include_directories(${BOARD_TARGET} INTERFACE\n    ${SDK_DIR}/nuttx/include\n    ${SDK_DIR}/nuttx/arch\n    ${SDK_DIR}/nuttx/arch/chip\n    ${SDK_DIR}/nuttx/arch/os\n    ${SDK_DIR}/sdk/include\n  )\n\n  target_compile_definitions(${BOARD_TARGET} INTERFACE\n    CONFIG_HAVE_DOUBLE\n    main=spresense_main\n  )\n\n  target_compile_options(${BOARD_TARGET} INTERFACE\n    -pipe\n    -std=gnu11\n    -fno-builtin\n    -fno-strength-reduce\n    -fomit-frame-pointer\n    -Wno-error=undef\n    -Wno-error=cast-align\n    -Wno-error=unused-parameter\n    -Wno-error=shadow\n    -Wno-error=redundant-decls\n  )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_CXD56)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/sony/cxd56/dcd_cxd56.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  target_link_libraries(${TARGET} PUBLIC\n    ${SDK_DIR}/nuttx/libs/libapps.a\n    ${SDK_DIR}/nuttx/libs/libnuttx.a\n    gcc  # Compiler runtime support for FP operations like __aeabi_dmul\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -Xlinker --entry=__start\n      -nostartfiles\n      -nodefaultlibs\n      -Wl,--gc-sections\n      -u spresense_main\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      -Xlinker --entry=__start\n      -nostartfiles\n      -nodefaultlibs\n      -u spresense_main\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Build mkspk tool\n  add_custom_command(OUTPUT ${MKSPK}\n    COMMAND $(MAKE) -C ${TOP}/hw/mcu/sony/cxd56/mkspk\n    COMMENT \"Building mkspk tool\"\n  )\n\n  # Create .spk file\n  add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.spk\n    COMMAND ${MKSPK} -c 2 $<TARGET_FILE:${TARGET}> nuttx ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}.spk\n    DEPENDS ${TARGET} ${MKSPK}\n    COMMENT \"Creating ${TARGET}.spk\"\n  )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/cxd56/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\n\n# Platforms are: Linux, Darwin, MSYS, CYGWIN\nPLATFORM := $(firstword $(subst _, ,$(shell uname -s 2>/dev/null)))\n\nifeq ($(PLATFORM),Darwin)\n  # macOS\n  MKSPK = $(TOP)/hw/mcu/sony/cxd56/mkspk/mkspk\nelse ifeq ($(PLATFORM),Linux)\n  # Linux\n  MKSPK = $(TOP)/hw/mcu/sony/cxd56/mkspk/mkspk\nelse\n  # Cygwin/MSYS2\n  MKSPK = $(TOP)/hw/mcu/sony/cxd56/mkspk/mkspk.exe\nendif\n\nCFLAGS += \\\n\t-DCONFIG_HAVE_DOUBLE \\\n\t-Dmain=spresense_main \\\n\t-pipe \\\n\t-std=gnu11 \\\n\t-fno-strength-reduce \\\n\t-fomit-frame-pointer \\\n\t-Wno-error=undef \\\n\t-Wno-error=cast-align \\\n\t-Wno-error=unused-parameter \\\n\t-DCFG_TUSB_MCU=OPT_MCU_CXD56 \\\n\nCPU_CORE ?= cortex-m4\n\n# suppress following warnings from mcu driver\n# lwip/src/core/raw.c:334:43: error: declaration of 'recv' shadows a global declaration\nCFLAGS += -Wno-error=shadow  -Wno-error=redundant-decls\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\nSPRESENSE_SDK = $(TOP)/hw/mcu/sony/cxd56/spresense-exported-sdk\n\nSRC_C += src/portable/sony/cxd56/dcd_cxd56.c\n\nINC += \\\n\t$(SPRESENSE_SDK)/nuttx/include \\\n\t$(SPRESENSE_SDK)/nuttx/arch \\\n\t$(SPRESENSE_SDK)/nuttx/arch/chip \\\n\t$(SPRESENSE_SDK)/nuttx/arch/os \\\n\t$(SPRESENSE_SDK)/sdk/include \\\n\t$(TOP)/$(BOARD_PATH)\n\nLIBS += \\\n\t$(SPRESENSE_SDK)/nuttx/libs/libapps.a \\\n\t$(SPRESENSE_SDK)/nuttx/libs/libnuttx.a \\\n\nLD_FILE = hw/mcu/sony/cxd56/spresense-exported-sdk/nuttx/scripts/ramconfig.ld\n\nLDFLAGS += \\\n\t-Xlinker --entry=__start \\\n\t-nostartfiles \\\n\t-nodefaultlibs \\\n\t-Wl,--gc-sections \\\n\t-u spresense_main\n\n$(MKSPK): $(BUILD)/$(PROJECT).elf\n\t$(MAKE) -C $(TOP)/hw/mcu/sony/cxd56/mkspk\n\n$(BUILD)/$(PROJECT).spk: $(MKSPK)\n\t@echo CREATE $@\n\t@$(MKSPK) -c 2 $(BUILD)/$(PROJECT).elf nuttx $@\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM4F\n"
  },
  {
    "path": "hw/bsp/da1469x/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"DA1469xAB.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n#define configRUN_FREERTOS_SECURE_ONLY          1\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/da1469x/boards/da14695_dk_usb/board.cmake",
    "content": "set(JLINK_DEVICE DA14695)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/da1469x/boards/da14695_dk_usb/board.h",
    "content": "/* metadata:\n   name: DA14695-00HQDEVKT-U\n   url: https://www.renesas.com/en/products/wireless-connectivity/bluetooth-low-energy/da14695-00hqdevkt-u-smartbond-da14695-bluetooth-low-energy-52-usb-development-kit\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n#define LED_PIN         33 // P1.1\n#define LED_STATE_ON    1\n\n#define BUTTON_PIN      6\n#define BUTTON_STATE_ACTIVE 1\n\n#endif\n"
  },
  {
    "path": "hw/bsp/da1469x/boards/da14695_dk_usb/board.mk",
    "content": "JLINK_DEVICE = DA14695\n"
  },
  {
    "path": "hw/bsp/da1469x/boards/da14695_dk_usb/syscfg/syscfg.h",
    "content": "/**\n * This file was generated by Apache newt version: 1.9.0-dev\n */\n\n#ifndef H_MYNEWT_SYSCFG_\n#define H_MYNEWT_SYSCFG_\n\n/**\n * This macro exists to ensure code includes this header when needed.  If code\n * checks the existence of a setting directly via ifdef without including this\n * header, the setting macro will silently evaluate to 0.  In contrast, an\n * attempt to use these macros without including this header will result in a\n * compiler error.\n */\n#define MYNEWT_VAL(_name)                       MYNEWT_VAL_ ## _name\n#define MYNEWT_VAL_CHOICE(_name, _val)          MYNEWT_VAL_ ## _name ## __ ## _val\n\n#ifndef MYNEWT_VAL_RAM_RESIDENT\n#define MYNEWT_VAL_RAM_RESIDENT (0)\n#endif\n\n#ifndef MYNEWT_VAL_MCU_GPIO_MAX_IRQ\n#define MYNEWT_VAL_MCU_GPIO_MAX_IRQ (4)\n#endif\n\n#ifndef MYNEWT_VAL_MCU_GPIO_RETAINABLE_NUM\n#define MYNEWT_VAL_MCU_GPIO_RETAINABLE_NUM (-1)\n#endif\n\n#ifndef MYNEWT_VAL_MCU_CLOCK_XTAL32M_SETTLE_TIME_US\n#define MYNEWT_VAL_MCU_CLOCK_XTAL32M_SETTLE_TIME_US (2000)\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/da1469x/boards/da1469x_dk_pro/board.cmake",
    "content": "set(JLINK_DEVICE DA14699)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/da1469x/boards/da1469x_dk_pro/board.h",
    "content": "/* metadata:\n   name: DA1469x Development Kit Pro\n   url: https://lpccs-docs.renesas.com/um-b-090-da1469x_getting_started/DA1469x_The_hardware/DA1469x_The_hardware.html\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n#define LED_PIN         33\n#define LED_STATE_ON    1\n\n#define BUTTON_PIN      6\n#define BUTTON_STATE_ACTIVE 0\n\n#define NEED_VBUS_MONITOR\n\n#endif\n"
  },
  {
    "path": "hw/bsp/da1469x/boards/da1469x_dk_pro/board.mk",
    "content": "# For flash-jlink target\nJLINK_DEVICE = DA14699\n"
  },
  {
    "path": "hw/bsp/da1469x/boards/da1469x_dk_pro/syscfg/syscfg.h",
    "content": "/**\n * This file was generated by Apache newt version: 1.9.0-dev\n */\n\n#ifndef H_MYNEWT_SYSCFG_\n#define H_MYNEWT_SYSCFG_\n\n/**\n * This macro exists to ensure code includes this header when needed.  If code\n * checks the existence of a setting directly via ifdef without including this\n * header, the setting macro will silently evaluate to 0.  In contrast, an\n * attempt to use these macros without including this header will result in a\n * compiler error.\n */\n#define MYNEWT_VAL(_name)                       MYNEWT_VAL_ ## _name\n#define MYNEWT_VAL_CHOICE(_name, _val)          MYNEWT_VAL_ ## _name ## __ ## _val\n\n#ifndef MYNEWT_VAL_RAM_RESIDENT\n#define MYNEWT_VAL_RAM_RESIDENT (0)\n#endif\n\n#ifndef MYNEWT_VAL_MCU_GPIO_MAX_IRQ\n#define MYNEWT_VAL_MCU_GPIO_MAX_IRQ (4)\n#endif\n\n#ifndef MYNEWT_VAL_MCU_GPIO_RETAINABLE_NUM\n#define MYNEWT_VAL_MCU_GPIO_RETAINABLE_NUM (-1)\n#endif\n\n#ifndef MYNEWT_VAL_MCU_CLOCK_XTAL32M_SETTLE_TIME_US\n#define MYNEWT_VAL_MCU_CLOCK_XTAL32M_SETTLE_TIME_US (2000)\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/da1469x/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Renesas\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include <hal/hal_gpio.h>\n#include <mcu/mcu.h>\n\n#define LED_STATE_OFF   (1-LED_STATE_ON)\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n// DA146xx driver function that must be called whenever VBUS changes.\nextern void tusb_vbus_changed(bool present);\n\n#if defined(NEED_VBUS_MONITOR) && CFG_TUD_ENABLED\n// VBUS change interrupt handler\nvoid VBUS_IRQHandler(void) {\n  bool present = (CRG_TOP->ANA_STATUS_REG & CRG_TOP_ANA_STATUS_REG_VBUS_AVAILABLE_Msk) != 0;\n  // Clear VBUS interrupt\n  CRG_TOP->VBUS_IRQ_CLEAR_REG = 1;\n\n  tusb_vbus_changed(present);\n}\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\nvoid UnhandledIRQ(void) {\n  CRG_TOP->SYS_CTRL_REG = 0x80;\n  __BKPT(1);\n  while (1);\n}\n\nvoid board_init(void) {\n  // LED\n  hal_gpio_init_out(LED_PIN, LED_STATE_ON);\n\n  hal_gpio_init_out(1, 0);\n  hal_gpio_init_out(2, 0);\n  hal_gpio_init_out(3, 0);\n  hal_gpio_init_out(4, 0);\n  hal_gpio_init_out(5, 0);\n\n  // Button\n  hal_gpio_init_in(BUTTON_PIN, BUTTON_STATE_ACTIVE ? HAL_GPIO_PULL_DOWN : HAL_GPIO_PULL_UP);\n\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#if CFG_TUD_ENABLED\n  #ifdef NEED_VBUS_MONITOR\n  // Setup interrupt for both connect and disconnect\n  CRG_TOP->VBUS_IRQ_MASK_REG = CRG_TOP_VBUS_IRQ_MASK_REG_VBUS_IRQ_EN_FALL_Msk |\n                               CRG_TOP_VBUS_IRQ_MASK_REG_VBUS_IRQ_EN_RISE_Msk;\n  NVIC_SetPriority(VBUS_IRQn, 2);\n  // Trigger interrupt at the start to inform driver about VBUS state at start\n  // otherwise it could go unnoticed.\n  NVIC_SetPendingIRQ(VBUS_IRQn);\n  NVIC_EnableIRQ(VBUS_IRQn);\n  #else\n  // This board is USB powered there is no need to monitor VBUS line.  Notify driver that VBUS is present.\n  tusb_vbus_changed(true);\n  #endif\n\n  /* Setup USB IRQ */\n  NVIC_SetPriority(USB_IRQn, 2);\n  NVIC_EnableIRQ(USB_IRQn);\n\n  /* Use PLL96 / 2 clock not HCLK */\n  CRG_TOP->CLK_CTRL_REG &= ~CRG_TOP_CLK_CTRL_REG_USB_CLK_SRC_Msk;\n\n  mcu_gpio_set_pin_function(14, MCU_GPIO_MODE_INPUT, MCU_GPIO_FUNC_USB);\n  mcu_gpio_set_pin_function(15, MCU_GPIO_MODE_INPUT, MCU_GPIO_FUNC_USB);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  hal_gpio_write(LED_PIN, state ? LED_STATE_ON : LED_STATE_OFF);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == hal_gpio_read(BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  (void) buf;\n  (void) len;\n\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/da1469x/family.cmake",
    "content": "include_guard()\n\nset(MCU_DIR ${TOP}/hw/mcu/dialog/da1469x)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(CMAKE_SYSTEM_CPU cortex-m33-nodsp CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\nset(FAMILY_MCUS DA1469X CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/da1469x.ld)\nendif ()\nif (NOT DEFINED STARTUP_FILE_${CMAKE_C_COMPILER_ID})\nset(STARTUP_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/gcc_startup_da1469x.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nendif ()\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${MCU_DIR}/src/system_da1469x.c\n    ${MCU_DIR}/src/da1469x_clock.c\n    ${MCU_DIR}/src/hal_gpio.c\n    )\n  target_compile_options(${BOARD_TARGET} PUBLIC -mthumb-interwork)\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CORE_M33\n    CFG_TUD_ENDPOINT0_SIZE=8\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    ${MCU_DIR}/include\n    ${MCU_DIR}/SDK_10.0.8.105/sdk/bsp/include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_flash_jlink_dialog TARGET)\n  set(JLINKEXE JLinkExe)\n  set(JLINK_IF swd)\n\n  # mkimage from sdk\n  set(MKIMAGE $ENV{HOME}/code/tinyusb-mcu-driver/dialog/SDK_10.0.8.105/binaries/mkimage)\n\n  file(GENERATE OUTPUT $<TARGET_FILE_DIR:${TARGET}>/version.h\n    CONTENT \"#define SW_VERSION \\\"v_1.0.0.1\\\"\n#define SW_VERSION_DATE \\\"2024-07-17 17:55\\\"\"\n    )\n\n  file(GENERATE OUTPUT $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.jlink\n    CONTENT \"r\nhalt\nloadfile $<TARGET_FILE_DIR:${TARGET}>/${TARGET}-image.bin 0x16000000\nr\ngo\nexit\"\n  )\n\n  add_custom_target(${TARGET}-image\n    DEPENDS ${TARGET}\n    COMMAND ${MKIMAGE} da1469x $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin $<TARGET_FILE_DIR:${TARGET}>/version.h $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin.img\n    COMMAND cp ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/product_header.dump $<TARGET_FILE_DIR:${TARGET}>/${TARGET}-image.bin\n    COMMAND cat $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin.img >> $<TARGET_FILE_DIR:${TARGET}>/${TARGET}-image.bin\n    )\n  add_custom_target(${TARGET}-jlink\n    DEPENDS ${TARGET}-image\n    COMMAND ${JLINKEXE} -device ${JLINK_DEVICE} -if ${JLINK_IF} -JTAGConf -1,-1 -speed auto -CommandFile $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.jlink\n    )\nendfunction()\n\n\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_DA1469X)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/dialog/da146xx/dcd_da146xx.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink_dialog(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/da1469x/family.mk",
    "content": "MCU_DIR = hw/mcu/dialog/da1469x\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n  -flto \\\n  -mthumb \\\n  -mthumb-interwork \\\n  -mabi=aapcs \\\n  -mcpu=cortex-m33+nodsp \\\n  -mfloat-abi=hard \\\n  -mfpu=fpv5-sp-d16 \\\n  -DCORE_M33 \\\n  -DCFG_TUSB_MCU=OPT_MCU_DA1469X \\\n  -DCFG_TUD_ENDPOINT0_SIZE=8\\\n\nLDFLAGS_GCC += \\\n  -nostdlib \\\n  --specs=nosys.specs --specs=nano.specs\n\n# All source paths should be relative to the top level.\nLD_FILE = $(FAMILY_PATH)/linker/da1469x.ld\n\n# While this is for da1469x chip, there is chance that da1468x chip family will also work\nSRC_C += \\\n\tsrc/portable/dialog/da146xx/dcd_da146xx.c \\\n\t${MCU_DIR}/src/system_da1469x.c \\\n\t${MCU_DIR}/src/da1469x_clock.c \\\n\t${MCU_DIR}/src/hal_gpio.c \\\n\nSRC_S += $(FAMILY_PATH)/gcc_startup_da1469x.S\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/${MCU_DIR}/include \\\n\t$(TOP)/${MCU_DIR}/SDK_10.0.8.105/sdk/bsp/include\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM33_NTZ/non_secure\n\n# flash using jlink but with some twists\nflash: flash-dialog\n\n# SDK_BINARY_PATH is the path to the SDK binary files\nSDK_BINARY_PATH = $(HOME)/code/tinyusb-mcu-driver/dialog/SDK_10.0.8.105/binaries\nMKIMAGE = $(SDK_BINARY_PATH)/mkimage\n\n$(BUILD)/$(PROJECT)-image.bin: $(BUILD)/$(PROJECT).bin\n\t@echo '#define SW_VERSION \"v_1.0.0.1\"' >$(BUILD)/version.h\n\t@echo '#define SW_VERSION_DATE \"'`date +\"%Y-%m-%d %H:%M\"`'\"' >> $(BUILD)/version.h\n\t$(MKIMAGE) da1469x $^ $(BUILD)/version.h $^.img\n\tcp $(TOP)/$(FAMILY_PATH)/product_header.dump $(BUILD)/$(PROJECT)-image.bin\n\tcat $^.img >> $(BUILD)/$(PROJECT)-image.bin\n\nflash-dialog: $(BUILD)/$(PROJECT)-image.bin\n\t@echo r > $(BUILD)/$(BOARD).jlink\n\t@echo halt >> $(BUILD)/$(BOARD).jlink\n\t@echo loadfile $^ 0x16000000 >> $(BUILD)/$(BOARD).jlink\n\t@echo r >> $(BUILD)/$(BOARD).jlink\n\t@echo go >> $(BUILD)/$(BOARD).jlink\n\t@echo exit >> $(BUILD)/$(BOARD).jlink\n\t$(JLINKEXE) -device $(JLINK_DEVICE) -if $(JLINK_IF) -JTAGConf -1,-1 -speed auto -CommandFile $(BUILD)/$(BOARD).jlink\n"
  },
  {
    "path": "hw/bsp/da1469x/gcc_startup_da1469x.S",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n #include \"syscfg/syscfg.h\"\n\n    .syntax unified\n    .arch   armv7-m\n\n    .section .stack\n    .align  3\n#ifdef __STACK_SIZE\n    .equ    Stack_Size, __STACK_SIZE\n#else\n    .equ    Stack_Size, 0xC00\n#endif\n    .equ    SYS_CTRL_REG,       0x50000024\n    .equ    CACHE_FLASH_REG,    0x100C0040\n    .equ    RESET_STAT_REG,     0x500000BC\n\n    .globl  __StackTop\n    .globl  __StackLimit\n__StackLimit:\n    .space  Stack_Size\n    .size   __StackLimit, . - __StackLimit\n__StackTop:\n    .size   __StackTop, . - __StackTop\n\n    .section .heap\n    .align  3\n#ifdef __HEAP_SIZE\n    .equ    Heap_Size, __HEAP_SIZE\n#else\n    .equ    Heap_Size, 0\n#endif\n    .globl  __HeapBase\n    .globl  __HeapLimit\n__HeapBase:\n    .if     Heap_Size\n    .space  Heap_Size\n    .endif\n    .size   __HeapBase, . - __HeapBase\n__HeapLimit:\n    .size   __HeapLimit, . - __HeapLimit\n\n    .section .isr_vector\n    .align 2\n    .globl  __isr_vector\n__isr_vector:\n    .long   __StackTop\n    .long   Reset_Handler\n    /* Cortex-M33 interrupts */\n    .long   NMI_Handler\n    .long   HardFault_Handler\n    .long   MemoryManagement_Handler\n    .long   BusFault_Handler\n    .long   UsageFault_Handler\n    .long   SecureFault_Handler\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .long   SVC_Handler\n    .long   DebugMonitor_Handler\n    .long   0                       /* Reserved */\n    .long   PendSV_Handler\n    .long   SysTick_Handler\n    /* DA1469x interrupts */\n    .long   SENSOR_NODE_IRQHandler\n    .long   DMA_IRQHandler\n    .long   CHARGER_STATE_IRQHandler\n    .long   CHARGER_ERROR_IRQHandler\n    .long   CMAC2SYS_IRQHandler\n    .long   UART_IRQHandler\n    .long   UART2_IRQHandler\n    .long   UART3_IRQHandler\n    .long   I2C_IRQHandler\n    .long   I2C2_IRQHandler\n    .long   SPI_IRQHandler\n    .long   SPI2_IRQHandler\n    .long   PCM_IRQHandler\n    .long   SRC_IN_IRQHandler\n    .long   SRC_OUT_IRQHandler\n    .long   USB_IRQHandler\n    .long   TIMER_IRQHandler\n    .long   TIMER2_IRQHandler\n    .long   RTC_IRQHandler\n    .long   KEY_WKUP_GPIO_IRQHandler\n    .long   PDC_IRQHandler\n    .long   VBUS_IRQHandler\n    .long   MRM_IRQHandler\n    .long   MOTOR_CONTROLLER_IRQHandler\n    .long   TRNG_IRQHandler\n    .long   DCDC_IRQHandler\n    .long   XTAL32M_RDY_IRQHandler\n    .long   ADC_IRQHandler\n    .long   ADC2_IRQHandler\n    .long   CRYPTO_IRQHandler\n    .long   CAPTIMER1_IRQHandler\n    .long   RFDIAG_IRQHandler\n    .long   LCD_CONTROLLER_IRQHandler\n    .long   PLL_LOCK_IRQHandler\n    .long   TIMER3_IRQHandler\n    .long   TIMER4_IRQHandler\n    .long   LRA_IRQHandler\n    .long   RTC_EVENT_IRQHandler\n    .long   GPIO_P0_IRQHandler\n    .long   GPIO_P1_IRQHandler\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .long   0                       /* Reserved */\n    .size   __isr_vector, . - __isr_vector\n\n    .text\n    .thumb\n    .thumb_func\n    .align 2\n    .globl Reset_Handler\n    .type  Reset_Handler, %function\nReset_Handler:\n /* Make sure interrupt vector is remapped at 0x0 */\n    ldr     r1, =SYS_CTRL_REG\n    ldrh    r2, [r1, #0]\n    orrs    r2, r2, #8\n    strh    r2, [r1, #0]\n\n#if !MYNEWT_VAL(RAM_RESIDENT)\n/*\n * Flash is remapped at 0x0 with an offset, i.e. 0x0 does not correspond to\n * 0x16000000 but to start of an image on flash. This is calculated from product\n * header by 1st state bootloader and configured in CACHE_FLASH_REG. We need to\n * retrieve proper offset value for calculations later.\n */\n    ldr     r1, =CACHE_FLASH_REG\n    ldr     r4, [r1, #0]\n    mov     r2, r4\n    mov     r3, #0xFFFF\n    bic     r4, r4, r3      /* CACHE_FLASH_REG[FLASH_REGION_BASE] */\n    mov     r3, #0xFFF0\n    and     r2, r2, r3      /* CACHE_FLASH_REG[FLASH_REGION_OFFSET] */\n    lsr     r2, r2, #2\n    orr     r4, r4, r2\n\n/* Copy ISR vector from flash to RAM */\n    ldr     r1, =__isr_vector_start     /* src ptr */\n    ldr     r2, =__isr_vector_end       /* src end */\n    ldr     r3, =__intvect_start__      /* dst ptr */\n/* Make sure we copy from QSPIC address range, not from remapped range */\n    cmp     r1, r4\n    itt     lt\n    addlt   r1, r1, r4\n    addlt   r2, r2, r4\n.loop_isr_copy:\n    cmp     r1, r2\n    ittt    lt\n    ldrlt   r0, [r1], #4\n    strlt   r0, [r3], #4\n    blt     .loop_isr_copy\n\n/* Copy QSPI code from flash to RAM */\n    ldr     r1, =__text_ram_addr        /* src ptr */\n    ldr     r2, =__text_ram_start__     /* ptr */\n    ldr     r3, =__text_ram_end__       /* dst end */\n.loop_code_text_ram_copy:\n    cmp     r2, r3\n    ittt    lt\n    ldrlt   r0, [r1], #4\n    strlt   r0, [r2], #4\n    blt     .loop_code_text_ram_copy\n\n/* Copy data from flash to RAM */\n    ldr     r1, =__etext                /* src ptr */\n    ldr     r2, =__data_start__         /* dst ptr */\n    ldr     r3, =__data_end__           /* dst end */\n.loop_data_copy:\n    cmp     r2, r3\n    ittt    lt\n    ldrlt   r0, [r1], #4\n    strlt   r0, [r2], #4\n    blt     .loop_data_copy\n#endif\n\n/* Clear BSS */\n    movs    r0, 0\n    ldr     r1, =__bss_start__\n    ldr     r2, =__bss_end__\n.loop_bss_clear:\n    cmp     r1, r2\n    itt     lt\n    strlt   r0, [r1], #4\n    blt     .loop_bss_clear\n\n    ldr     r0, =__HeapBase\n    ldr     r1, =__HeapLimit\n/* Call static constructors */\n    bl __libc_init_array\n\n    bl      SystemInit\n    bl      main\n\n    .pool\n    .size   Reset_Handler, . - Reset_Handler\n\n/* Default interrupt handler */\n    .type   Default_Handler, %function\nDefault_Handler:\n    ldr     r1, =SYS_CTRL_REG\n    ldrh    r2, [r1, #0]\n    orrs    r2, r2, #0x80   /* DEBUGGER_ENABLE */\n    strh    r2, [r1, #0]\n    b       .\n\n    .size   Default_Handler, . - Default_Handler\n\n/* Default handlers for all interrupts */\n    .macro  IRQ handler\n    .weak   \\handler\n    .set    \\handler, Default_Handler\n    .endm\n\n    /* Cortex-M33 interrupts */\n    IRQ  NMI_Handler\n    IRQ  HardFault_Handler\n    IRQ  MemoryManagement_Handler\n    IRQ  BusFault_Handler\n    IRQ  UsageFault_Handler\n    IRQ  SecureFault_Handler\n    IRQ  SVC_Handler\n    IRQ  DebugMonitor_Handler\n    IRQ  PendSV_Handler\n    IRQ  SysTick_Handler\n    /* DA1469x interrupts */\n    IRQ  SENSOR_NODE_IRQHandler\n    IRQ  DMA_IRQHandler\n    IRQ  CHARGER_STATE_IRQHandler\n    IRQ  CHARGER_ERROR_IRQHandler\n    IRQ  CMAC2SYS_IRQHandler\n    IRQ  UART_IRQHandler\n    IRQ  UART2_IRQHandler\n    IRQ  UART3_IRQHandler\n    IRQ  I2C_IRQHandler\n    IRQ  I2C2_IRQHandler\n    IRQ  SPI_IRQHandler\n    IRQ  SPI2_IRQHandler\n    IRQ  PCM_IRQHandler\n    IRQ  SRC_IN_IRQHandler\n    IRQ  SRC_OUT_IRQHandler\n    IRQ  USB_IRQHandler\n    IRQ  TIMER_IRQHandler\n    IRQ  TIMER2_IRQHandler\n    IRQ  RTC_IRQHandler\n    IRQ  KEY_WKUP_GPIO_IRQHandler\n    IRQ  PDC_IRQHandler\n    IRQ  VBUS_IRQHandler\n    IRQ  MRM_IRQHandler\n    IRQ  MOTOR_CONTROLLER_IRQHandler\n    IRQ  TRNG_IRQHandler\n    IRQ  DCDC_IRQHandler\n    IRQ  XTAL32M_RDY_IRQHandler\n    IRQ  ADC_IRQHandler\n    IRQ  ADC2_IRQHandler\n    IRQ  CRYPTO_IRQHandler\n    IRQ  CAPTIMER1_IRQHandler\n    IRQ  RFDIAG_IRQHandler\n    IRQ  LCD_CONTROLLER_IRQHandler\n    IRQ  PLL_LOCK_IRQHandler\n    IRQ  TIMER3_IRQHandler\n    IRQ  TIMER4_IRQHandler\n    IRQ  LRA_IRQHandler\n    IRQ  RTC_EVENT_IRQHandler\n    IRQ  GPIO_P0_IRQHandler\n    IRQ  GPIO_P1_IRQHandler\n    IRQ  RESERVED40_IRQHandler\n    IRQ  RESERVED41_IRQHandler\n    IRQ  RESERVED42_IRQHandler\n    IRQ  RESERVED43_IRQHandler\n    IRQ  RESERVED44_IRQHandler\n    IRQ  RESERVED45_IRQHandler\n    IRQ  RESERVED46_IRQHandler\n    IRQ  RESERVED47_IRQHandler\n\n.end\n"
  },
  {
    "path": "hw/bsp/da1469x/linker/da1469x.ld",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\nMEMORY\n{\n    /*\n     * Flash is remapped at 0x0 by 1st stage bootloader, but this is done with\n     * an offset derived from image header thus it is safer to use remapped\n     * address space at 0x0 instead of QSPI_M address space at 0x16000000.\n     * Bootloader partition is 32K, but 9K is currently reserved for product\n     * header (8K) and image header (1K).\n     * First 512 bytes of SYSRAM are remapped at 0x0 and used as ISR vector\n     * (there's no need to reallocate ISR vector) and thus cannot be used by\n     * application.\n     */\n\n    FLASH (r)  : ORIGIN = (0x00000000), LENGTH = (1024 * 1024)\n    RAM (rw)   : ORIGIN = (0x20000000), LENGTH = (512 * 1024)\n}\n\nOUTPUT_FORMAT (\"elf32-littlearm\", \"elf32-bigarm\", \"elf32-littlearm\")\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be defined in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapBase\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __bssnz_start__\n *   __bssnz_end__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    __text = .;\n\n    .text :\n    {\n        __isr_vector_start = .;\n        KEEP(*(.isr_vector))\n        /* ISR vector shall have exactly 512 bytes */\n        . = __isr_vector_start + 0x200;\n        __isr_vector_end = .;\n\n        *(.text)\n        *(.text.*)\n\n        *(.libcmac.rom)\n\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n\n        *(.eh_frame*)\n        . = ALIGN(4);\n    } > FLASH\n\n    .ARM.extab :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        . = ALIGN(4);\n    } > FLASH\n\n    __exidx_start = .;\n    .ARM :\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        . = ALIGN(4);\n    } > FLASH\n    __exidx_end = .;\n\n    .intvect :\n    {\n        . = ALIGN(4);\n        __intvect_start__ = .;\n        . = . + (__isr_vector_end - __isr_vector_start);\n        . = ALIGN(4);\n    } > RAM\n\n    .sleep_state (NOLOAD) :\n    {\n        . = ALIGN(4);\n        *(sleep_state)\n    } > RAM\n\n    /* This section will be zeroed by RTT package init */\n    .rtt (NOLOAD):\n    {\n        . = ALIGN(4);\n        *(.rtt)\n        . = ALIGN(4);\n    } > RAM\n\n    __text_ram_addr = LOADADDR(.text_ram);\n\n    .text_ram :\n    {\n        . = ALIGN(4);\n        __text_ram_start__ = .;\n        *(.text_ram*)\n        . = ALIGN(4);\n        __text_ram_end__ = .;\n    } > RAM AT > FLASH\n\n    __etext = LOADADDR(.data);\n\n    .data :\n    {\n        __data_start__ = .;\n        *(vtable)\n        *(.data*)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        *(.preinit_array)\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        *(SORT(.init_array.*))\n        *(.init_array)\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        *(SORT(.fini_array.*))\n        *(.fini_array)\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        *(.jcr)\n        . = ALIGN(4);\n        /* All data end */\n        __data_end__ = .;\n    } > RAM AT > FLASH\n\n    .bssnz :\n    {\n        . = ALIGN(4);\n        __bssnz_start__ = .;\n        *(.bss.core.nz*)\n        . = ALIGN(4);\n        __bssnz_end__ = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .cmac (NOLOAD) :\n    {\n        . = ALIGN(0x400);\n        *(.libcmac.ram)\n    } > RAM\n\n    /* Heap starts after BSS */\n    . = ALIGN(8);\n    __HeapBase = .;\n\n    /* .stack_dummy section doesn't contains any symbols. It is only\n     * used for linker to calculate size of stack sections, and assign\n     * values to stack symbols later */\n    .stack_dummy (COPY):\n    {\n        *(.stack*)\n    } > RAM\n\n    _ram_start = ORIGIN(RAM);\n\n    /* Set stack top to end of RAM, and stack limit move down by\n     * size of stack_dummy section */\n    __StackTop = ORIGIN(RAM) + LENGTH(RAM);\n    __StackLimit = __StackTop - SIZEOF(.stack_dummy);\n    PROVIDE(__stack = __StackTop);\n\n    /* Top of head is the bottom of the stack */\n    __HeapLimit = __StackLimit;\n    end = __HeapLimit;\n\n    /* Check if data + heap + stack exceeds RAM limit */\n    ASSERT(__HeapBase <= __HeapLimit, \"region RAM overflowed with stack\")\n\n    /* Check that intvect is at the beginning of RAM */\n    ASSERT(__intvect_start__ == ORIGIN(RAM), \"intvect is not at beginning of RAM\")\n}\n"
  },
  {
    "path": "hw/bsp/efm32/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"em_device.h\"\n#endif\n\n/* Cortex-M4F port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*8*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n// EFM32GG12B has 3 priority bits\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/efm32/boards/sltb009a/board.cmake",
    "content": "set(EFM32_FAMILY efm32gg12b)\nset(EFM32_MCU EFM32GG12B810F1024GM64)\nset(JLINK_DEVICE ${EFM32_MCU})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/efm32/boards/sltb009a/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Rafael Silva (@perigoso)\n * Copyright (c) 2021 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              0     // A\n#define LED_PIN_R             12    // 12\n#define LED_PIN_B             13    // 13\n#define LED_PIN_G             14    // 14\n#define LED_STATE_ON          0     // active-low\n\n#define BUTTON_PORT           3     // D\n#define BUTTON_PIN            5     // 5\n#define BUTTON_STATE_ACTIVE   0     // active-low\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/efm32/boards/sltb009a/board.mk",
    "content": "EFM32_FAMILY = efm32gg12b\nEFM32_MCU = EFM32GG12B810F1024GM64\nJLINK_DEVICE = $(EFM32_MCU)\n\nCFLAGS += \\\n  -D$(EFM32_MCU) \\\n\n# For flash-jlink target\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/efm32/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Rafael Silva (@perigoso)\n * Copyright (c) 2021 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n#include \"em_device.h\"\n\n/*--------------------------------------------------------------------*/\n/* MACRO TYPEDEF CONSTANT ENUM                                        */\n/*--------------------------------------------------------------------*/\n\n/*--------------------------------------------------------------------*/\n/* Forward USB interrupt events to TinyUSB IRQ Handler                */\n/*--------------------------------------------------------------------*/\n\nvoid USB_IRQHandler(void)\n{\n  tud_int_handler(0);\n}\n\n/*--------------------------------------------------------------------*/\n/* Fault Handlers                                                     */\n/*--------------------------------------------------------------------*/\n\nvoid HardFault_Handler(void)\n{\n  asm(\"bkpt\");\n}\n\nvoid MemManage_Handler(void)\n{\n  asm(\"bkpt\");\n}\n\nvoid BusFault_Handler(void)\n{\n  asm(\"bkpt\");\n}\n\nvoid UsageFault_Handler(void)\n{\n  asm(\"bkpt\");\n}\n\n/*--------------------------------------------------------------------*/\n/* Startup                                                            */\n/*--------------------------------------------------------------------*/\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void)\n{\n\n}\n\n/*--------------------------------------------------------------------*/\n/* Initing Funcs                                                      */\n/*--------------------------------------------------------------------*/\n\nstatic void emu_init(uint8_t immediate_switch)\n{\n  EMU->PWRCTRL = (immediate_switch ? EMU_PWRCTRL_IMMEDIATEPWRSWITCH : 0) | EMU_PWRCTRL_REGPWRSEL_DVDD | EMU_PWRCTRL_ANASW_AVDD;\n}\n\nstatic void emu_reg_init(float target_voltage)\n{\n    if(target_voltage < 2300.f || target_voltage >= 3800.f)\n        return;\n\n    uint8_t level = ((target_voltage - 2300.f) / 100.f);\n\n    EMU->R5VCTRL = EMU_R5VCTRL_INPUTMODE_AUTO;\n\n    EMU->R5VOUTLEVEL = level; /* Reg output to 3.3V*/\n}\n\nstatic void emu_dcdc_init(float target_voltage, float max_ln_current, float max_lp_current, float max_reverse_current)\n{\n    if(target_voltage < 1800.f || target_voltage >= 3000.f)\n        return;\n\n    if(max_ln_current <= 0.f || max_ln_current > 200.f)\n        return;\n\n    if(max_lp_current <= 0.f || max_lp_current > 10000.f)\n        return;\n\n    if(max_reverse_current < 0.f || max_reverse_current > 160.f)\n        return;\n\n    // Low Power & Low Noise current limit\n    uint8_t lp_bias = 0;\n\n    if(max_lp_current < 75.f)\n        lp_bias = 0;\n    else if(max_lp_current < 500.f)\n        lp_bias = 1;\n    else if(max_lp_current < 2500.f)\n        lp_bias = 2;\n    else\n        lp_bias = 3;\n\n    EMU->DCDCMISCCTRL = (EMU->DCDCMISCCTRL & ~_EMU_DCDCMISCCTRL_LPCMPBIASEM234H_MASK) | ((uint32_t)lp_bias << _EMU_DCDCMISCCTRL_LPCMPBIASEM234H_SHIFT);\n    EMU->DCDCMISCCTRL |= EMU_DCDCMISCCTRL_LNFORCECCM; // Force CCM to prevent reverse current\n    EMU->DCDCLPCTRL |= EMU_DCDCLPCTRL_LPVREFDUTYEN; // Enable duty cycling of the bias for LP mode\n    EMU->DCDCLNFREQCTRL = (EMU->DCDCLNFREQCTRL & ~_EMU_DCDCLNFREQCTRL_RCOBAND_MASK) | 4; // Set RCO Band to 7MHz\n\n    uint8_t fet_count = 0;\n\n    if(max_ln_current < 20.f)\n        fet_count = 4;\n    else if(max_ln_current >= 20.f && max_ln_current < 40.f)\n        fet_count = 8;\n    else\n        fet_count = 16;\n\n    EMU->DCDCMISCCTRL = (EMU->DCDCMISCCTRL & ~_EMU_DCDCMISCCTRL_NFETCNT_MASK) | ((uint32_t)(fet_count - 1) << _EMU_DCDCMISCCTRL_NFETCNT_SHIFT);\n    EMU->DCDCMISCCTRL = (EMU->DCDCMISCCTRL & ~_EMU_DCDCMISCCTRL_PFETCNT_MASK) | ((uint32_t)(fet_count - 1) << _EMU_DCDCMISCCTRL_PFETCNT_SHIFT);\n\n    uint8_t ln_current_limit = (((max_ln_current + 40.f) * 1.5f) / (5.f * fet_count)) - 1;\n    uint8_t lp_current_limit = 1; // Recommended value\n\n    EMU->DCDCMISCCTRL = (EMU->DCDCMISCCTRL & ~(_EMU_DCDCMISCCTRL_LNCLIMILIMSEL_MASK | _EMU_DCDCMISCCTRL_LPCLIMILIMSEL_MASK)) | ((uint32_t)ln_current_limit << _EMU_DCDCMISCCTRL_LNCLIMILIMSEL_SHIFT) | ((uint32_t)lp_current_limit << _EMU_DCDCMISCCTRL_LPCLIMILIMSEL_SHIFT);\n\n    uint8_t z_det_limit = ((max_reverse_current + 40.f) * 1.5f) / (2.5f * fet_count);\n\n    EMU->DCDCZDETCTRL = (EMU->DCDCZDETCTRL & ~_EMU_DCDCZDETCTRL_ZDETILIMSEL_MASK) | ((uint32_t)z_det_limit << _EMU_DCDCZDETCTRL_ZDETILIMSEL_SHIFT);\n\n    EMU->DCDCCLIMCTRL |= EMU_DCDCCLIMCTRL_BYPLIMEN; // Enable bypass current limiter to prevent overcurrent when switching modes\n\n    // Output Voltage\n    if(target_voltage > 1800.f)\n    {\n        float max_vout = 3000.f;\n        float min_vout = 1800.f;\n        float diff_vout = max_vout - min_vout;\n\n        uint8_t ln_vref_high = (DEVINFO->DCDCLNVCTRL0 & _DEVINFO_DCDCLNVCTRL0_3V0LNATT1_MASK) >> _DEVINFO_DCDCLNVCTRL0_3V0LNATT1_SHIFT;\n        uint8_t ln_vref_low = (DEVINFO->DCDCLNVCTRL0 & _DEVINFO_DCDCLNVCTRL0_1V8LNATT1_MASK) >> _DEVINFO_DCDCLNVCTRL0_1V8LNATT1_SHIFT;\n\n        uint8_t ln_vref = ((target_voltage - min_vout) * (float)(ln_vref_high - ln_vref_low)) / diff_vout;\n        ln_vref += ln_vref_low;\n\n        EMU->DCDCLNVCTRL = (ln_vref << _EMU_DCDCLNVCTRL_LNVREF_SHIFT) | EMU_DCDCLNVCTRL_LNATT;\n\n        uint8_t lp_vref_low = 0;\n        uint8_t lp_vref_high = 0;\n\n        switch(lp_bias)\n        {\n            case 0:\n            {\n                lp_vref_high = (DEVINFO->DCDCLPVCTRL2 & _DEVINFO_DCDCLPVCTRL2_3V0LPATT1LPCMPBIAS0_MASK) >> _DEVINFO_DCDCLPVCTRL2_3V0LPATT1LPCMPBIAS0_SHIFT;\n                lp_vref_low = (DEVINFO->DCDCLPVCTRL2 & _DEVINFO_DCDCLPVCTRL2_1V8LPATT1LPCMPBIAS0_MASK) >> _DEVINFO_DCDCLPVCTRL2_1V8LPATT1LPCMPBIAS0_SHIFT;\n            }\n            break;\n            case 1:\n            {\n                lp_vref_high = (DEVINFO->DCDCLPVCTRL2 & _DEVINFO_DCDCLPVCTRL2_3V0LPATT1LPCMPBIAS1_MASK) >> _DEVINFO_DCDCLPVCTRL2_3V0LPATT1LPCMPBIAS1_SHIFT;\n                lp_vref_low = (DEVINFO->DCDCLPVCTRL2 & _DEVINFO_DCDCLPVCTRL2_1V8LPATT1LPCMPBIAS1_MASK) >> _DEVINFO_DCDCLPVCTRL2_1V8LPATT1LPCMPBIAS1_SHIFT;\n            }\n            break;\n            case 2:\n            {\n                lp_vref_high = (DEVINFO->DCDCLPVCTRL3 & _DEVINFO_DCDCLPVCTRL3_3V0LPATT1LPCMPBIAS2_MASK) >> _DEVINFO_DCDCLPVCTRL3_3V0LPATT1LPCMPBIAS2_SHIFT;\n                lp_vref_low = (DEVINFO->DCDCLPVCTRL3 & _DEVINFO_DCDCLPVCTRL3_1V8LPATT1LPCMPBIAS2_MASK) >> _DEVINFO_DCDCLPVCTRL3_1V8LPATT1LPCMPBIAS2_SHIFT;\n            }\n            break;\n            case 3:\n            {\n                lp_vref_high = (DEVINFO->DCDCLPVCTRL3 & _DEVINFO_DCDCLPVCTRL3_3V0LPATT1LPCMPBIAS3_MASK) >> _DEVINFO_DCDCLPVCTRL3_3V0LPATT1LPCMPBIAS3_SHIFT;\n                lp_vref_low = (DEVINFO->DCDCLPVCTRL3 & _DEVINFO_DCDCLPVCTRL3_1V8LPATT1LPCMPBIAS3_MASK) >> _DEVINFO_DCDCLPVCTRL3_1V8LPATT1LPCMPBIAS3_SHIFT;\n            }\n            break;\n        }\n\n        uint8_t lp_vref = ((target_voltage - min_vout) * (float)(lp_vref_high - lp_vref_low)) / diff_vout;\n        lp_vref += lp_vref_low;\n\n        EMU->DCDCLPVCTRL = (lp_vref << _EMU_DCDCLPVCTRL_LPVREF_SHIFT) | EMU_DCDCLPVCTRL_LPATT;\n    }\n    else\n    {\n        float max_vout = 1800.f;\n        float min_vout = 1200.f;\n        float diff_vout = max_vout - min_vout;\n\n        uint8_t ln_vref_high = (DEVINFO->DCDCLNVCTRL0 & _DEVINFO_DCDCLNVCTRL0_1V8LNATT0_MASK) >> _DEVINFO_DCDCLNVCTRL0_1V8LNATT0_SHIFT;\n        uint8_t ln_vref_low = (DEVINFO->DCDCLNVCTRL0 & _DEVINFO_DCDCLNVCTRL0_1V2LNATT0_MASK) >> _DEVINFO_DCDCLNVCTRL0_1V2LNATT0_SHIFT;\n\n        uint8_t ln_vref = ((target_voltage - min_vout) * (float)(ln_vref_high - ln_vref_low)) / diff_vout;\n        ln_vref += ln_vref_low;\n\n        EMU->DCDCLNVCTRL = ln_vref << _EMU_DCDCLNVCTRL_LNVREF_SHIFT;\n\n        uint8_t lp_vref_low = 0;\n        uint8_t lp_vref_high = 0;\n\n        switch(lp_bias)\n        {\n            case 0:\n            {\n                lp_vref_high = (DEVINFO->DCDCLPVCTRL0 & _DEVINFO_DCDCLPVCTRL2_3V0LPATT1LPCMPBIAS0_MASK) >> _DEVINFO_DCDCLPVCTRL2_3V0LPATT1LPCMPBIAS0_SHIFT;\n                lp_vref_low = (DEVINFO->DCDCLPVCTRL0 & _DEVINFO_DCDCLPVCTRL2_1V8LPATT1LPCMPBIAS0_MASK) >> _DEVINFO_DCDCLPVCTRL2_1V8LPATT1LPCMPBIAS0_SHIFT;\n            }\n            break;\n            case 1:\n            {\n                lp_vref_high = (DEVINFO->DCDCLPVCTRL0 & _DEVINFO_DCDCLPVCTRL2_3V0LPATT1LPCMPBIAS1_MASK) >> _DEVINFO_DCDCLPVCTRL2_3V0LPATT1LPCMPBIAS1_SHIFT;\n                lp_vref_low = (DEVINFO->DCDCLPVCTRL0 & _DEVINFO_DCDCLPVCTRL2_1V8LPATT1LPCMPBIAS1_MASK) >> _DEVINFO_DCDCLPVCTRL2_1V8LPATT1LPCMPBIAS1_SHIFT;\n            }\n            break;\n            case 2:\n            {\n                lp_vref_high = (DEVINFO->DCDCLPVCTRL1 & _DEVINFO_DCDCLPVCTRL3_3V0LPATT1LPCMPBIAS2_MASK) >> _DEVINFO_DCDCLPVCTRL3_3V0LPATT1LPCMPBIAS2_SHIFT;\n                lp_vref_low = (DEVINFO->DCDCLPVCTRL1 & _DEVINFO_DCDCLPVCTRL3_1V8LPATT1LPCMPBIAS2_MASK) >> _DEVINFO_DCDCLPVCTRL3_1V8LPATT1LPCMPBIAS2_SHIFT;\n            }\n            break;\n            case 3:\n            {\n                lp_vref_high = (DEVINFO->DCDCLPVCTRL1 & _DEVINFO_DCDCLPVCTRL3_3V0LPATT1LPCMPBIAS3_MASK) >> _DEVINFO_DCDCLPVCTRL3_3V0LPATT1LPCMPBIAS3_SHIFT;\n                lp_vref_low = (DEVINFO->DCDCLPVCTRL1 & _DEVINFO_DCDCLPVCTRL3_1V8LPATT1LPCMPBIAS3_MASK) >> _DEVINFO_DCDCLPVCTRL3_1V8LPATT1LPCMPBIAS3_SHIFT;\n            }\n            break;\n        }\n\n        uint8_t lp_vref = ((target_voltage - min_vout) * (float)(lp_vref_high - lp_vref_low)) / diff_vout;\n        lp_vref += lp_vref_low;\n\n        EMU->DCDCLPVCTRL = lp_vref << _EMU_DCDCLPVCTRL_LPVREF_SHIFT;\n    }\n\n    EMU->DCDCLPCTRL = (EMU->DCDCLPCTRL & ~_EMU_DCDCLPCTRL_LPCMPHYSSELEM234H_MASK) | (((DEVINFO->DCDCLPCMPHYSSEL1 & (((uint32_t)0xFF) << (lp_bias * 8))) >> (lp_bias * 8)) << _EMU_DCDCLPCTRL_LPCMPHYSSELEM234H_SHIFT);\n\n    while(EMU->DCDCSYNC & EMU_DCDCSYNC_DCDCCTRLBUSY); // Wait for configuration to write\n\n    // Calibration\n    //EMU->DCDCLNCOMPCTRL = 0x57204077; // Compensation for 1uF DCDC capacitor\n    EMU->DCDCLNCOMPCTRL = 0xB7102137; // Compensation for 4.7uF DCDC capacitor\n\n    // Enable DCDC converter\n    EMU->DCDCCTRL = EMU_DCDCCTRL_DCDCMODEEM4_EM4LOWPOWER | EMU_DCDCCTRL_DCDCMODEEM23_EM23LOWPOWER | EMU_DCDCCTRL_DCDCMODE_LOWNOISE;\n\n    // Switch digital domain to DVDD\n    EMU->PWRCTRL = EMU_PWRCTRL_REGPWRSEL_DVDD | EMU_PWRCTRL_ANASW_AVDD;\n}\n\nstatic void cmu_hfxo_startup_calib(uint16_t ib_trim, uint16_t c_tune)\n{\n  if(CMU->STATUS & CMU_STATUS_HFXOENS)\n      return;\n\n  CMU->HFXOSTARTUPCTRL = (CMU->HFXOSTARTUPCTRL & ~(_CMU_HFXOSTARTUPCTRL_CTUNE_MASK | _CMU_HFXOSTARTUPCTRL_IBTRIMXOCORE_MASK)) | (((uint32_t)c_tune << _CMU_HFXOSTARTUPCTRL_CTUNE_SHIFT) & _CMU_HFXOSTARTUPCTRL_CTUNE_MASK) | (((uint32_t)ib_trim << _CMU_HFXOSTARTUPCTRL_IBTRIMXOCORE_SHIFT) & _CMU_HFXOSTARTUPCTRL_IBTRIMXOCORE_MASK);\n}\n\nstatic void cmu_hfxo_steady_calib(uint16_t ib_trim, uint16_t c_tune)\n{\n  if(CMU->STATUS & CMU_STATUS_HFXOENS)\n      return;\n\n  CMU->HFXOSTEADYSTATECTRL = (CMU->HFXOSTEADYSTATECTRL & ~(_CMU_HFXOSTEADYSTATECTRL_CTUNE_MASK | _CMU_HFXOSTEADYSTATECTRL_IBTRIMXOCORE_MASK)) | (((uint32_t)c_tune << _CMU_HFXOSTEADYSTATECTRL_CTUNE_SHIFT) & _CMU_HFXOSTEADYSTATECTRL_CTUNE_MASK) | (((uint32_t)ib_trim << _CMU_HFXOSTEADYSTATECTRL_IBTRIMXOCORE_SHIFT) & _CMU_HFXOSTEADYSTATECTRL_IBTRIMXOCORE_MASK);\n}\n\nstatic void cmu_hfrco_calib(uint32_t calibration)\n{\n    if(CMU->STATUS & CMU_STATUS_DPLLENS)\n        return;\n\n    while(CMU->SYNCBUSY & CMU_SYNCBUSY_HFRCOBSY);\n\n    CMU->HFRCOCTRL = calibration;\n\n    while(CMU->SYNCBUSY & CMU_SYNCBUSY_HFRCOBSY);\n}\n\nstatic void cmu_ushfrco_calib(uint8_t enable, uint32_t calibration)\n{\n    if(CMU->USBCRCTRL & CMU_USBCRCTRL_USBCREN)\n        return;\n\n    if(!enable)\n    {\n        CMU->OSCENCMD = CMU_OSCENCMD_USHFRCODIS;\n        while(CMU->STATUS & CMU_STATUS_USHFRCOENS);\n\n        return;\n    }\n\n    while(CMU->SYNCBUSY & CMU_SYNCBUSY_USHFRCOBSY);\n\n    CMU->USHFRCOCTRL = calibration | CMU_USHFRCOCTRL_FINETUNINGEN;\n\n    while(CMU->SYNCBUSY & CMU_SYNCBUSY_USHFRCOBSY);\n\n    if(enable && !(CMU->STATUS & CMU_STATUS_USHFRCOENS))\n    {\n        CMU->OSCENCMD = CMU_OSCENCMD_USHFRCOEN;\n\n        while(!(CMU->STATUS & CMU_STATUS_USHFRCORDY));\n    }\n}\n\nstatic void cmu_auxhfrco_calib(uint8_t enable, uint32_t calibration)\n{\n    if(!enable)\n    {\n        CMU->OSCENCMD = CMU_OSCENCMD_AUXHFRCODIS;\n        while(CMU->STATUS & CMU_STATUS_AUXHFRCOENS);\n\n        return;\n    }\n\n    while(CMU->SYNCBUSY & CMU_SYNCBUSY_AUXHFRCOBSY);\n\n    CMU->AUXHFRCOCTRL = calibration;\n\n    while(CMU->SYNCBUSY & CMU_SYNCBUSY_AUXHFRCOBSY);\n\n    if(enable && !(CMU->STATUS & CMU_STATUS_AUXHFRCOENS))\n    {\n        CMU->OSCENCMD = CMU_OSCENCMD_AUXHFRCOEN;\n\n        while(!(CMU->STATUS & CMU_STATUS_AUXHFRCORDY));\n    }\n}\n\n\nstatic void cmu_init(void)\n{\n    // Change SDIO clock to HFXO if HFRCO selected and disable it\n    CMU->SDIOCTRL = CMU_SDIOCTRL_SDIOCLKDIS | CMU_SDIOCTRL_SDIOCLKSEL_HFXO;\n    while(CMU->STATUS & CMU_STATUS_SDIOCLKENS);\n\n    // Change QSPI clock to HFXO if HFRCO selected and disable it\n    CMU->QSPICTRL = CMU_QSPICTRL_QSPI0CLKDIS | CMU_QSPICTRL_QSPI0CLKSEL_HFXO;\n    while(CMU->STATUS & CMU_STATUS_QSPI0CLKENS);\n\n    // Disable DPLL if enabled\n    if(CMU->STATUS & CMU_STATUS_DPLLENS)\n    {\n        CMU->OSCENCMD = CMU_OSCENCMD_DPLLDIS;\n        while(CMU->STATUS & CMU_STATUS_DPLLENS);\n    }\n\n    // Disable HFXO if enabled\n    if(CMU->STATUS & CMU_STATUS_HFXOENS)\n    {\n        CMU->OSCENCMD = CMU_OSCENCMD_HFXODIS;\n        while(CMU->STATUS & CMU_STATUS_HFXOENS);\n    }\n\n    // Setup HFXO\n    CMU->HFXOCTRL = CMU_HFXOCTRL_PEAKDETMODE_AUTOCMD | CMU_HFXOCTRL_MODE_XTAL;\n    CMU->HFXOCTRL1 = CMU_HFXOCTRL1_PEAKDETTHR_DEFAULT;\n    CMU->HFXOSTEADYSTATECTRL |= CMU_HFXOSTEADYSTATECTRL_PEAKMONEN;\n    CMU->HFXOTIMEOUTCTRL = (7 << _CMU_HFXOTIMEOUTCTRL_PEAKDETTIMEOUT_SHIFT) | (8 << _CMU_HFXOTIMEOUTCTRL_STEADYTIMEOUT_SHIFT) | (12 << _CMU_HFXOTIMEOUTCTRL_STARTUPTIMEOUT_SHIFT);\n\n    // Enable HFXO and wait for it to be ready\n    CMU->OSCENCMD = CMU_OSCENCMD_HFXOEN;\n    while(!(CMU->STATUS & CMU_STATUS_HFXORDY));\n\n    // Switch main clock to HFXO and wait for it to be selected\n    CMU->HFCLKSEL = CMU_HFCLKSEL_HF_HFXO;\n    while((CMU->HFCLKSTATUS & _CMU_HFCLKSTATUS_SELECTED_MASK) != CMU_HFCLKSTATUS_SELECTED_HFXO);\n\n    // Calibrate HFRCO for 72MHz and enable tuning by PLL\n    cmu_hfrco_calib((DEVINFO->HFRCOCAL16) | CMU_HFRCOCTRL_FINETUNINGEN);\n\n    // Setup the PLL\n    CMU->DPLLCTRL = CMU_DPLLCTRL_REFSEL_HFXO | CMU_DPLLCTRL_AUTORECOVER | CMU_DPLLCTRL_EDGESEL_RISE | CMU_DPLLCTRL_MODE_FREQLL;\n    // 72MHz = 50MHz (HFXO) * 1.44 (144/100)\n    CMU->DPLLCTRL1 = (143 << _CMU_DPLLCTRL1_N_SHIFT) | (99 << _CMU_DPLLCTRL1_M_SHIFT); // fHFRCO = fHFXO * (N + 1) / (M + 1)\n\n    // Enable the DPLL and wait for it to be ready\n    CMU->OSCENCMD = CMU_OSCENCMD_DPLLEN;\n    while(!(CMU->STATUS & CMU_STATUS_DPLLRDY));\n\n    // Config peripherals for the new frequency (freq > 32MHz)\n    CMU->CTRL |= CMU_CTRL_WSHFLE;\n\n    // Set prescalers\n    CMU->HFPRESC = CMU_HFPRESC_HFCLKLEPRESC_DIV2 | CMU_HFPRESC_PRESC_NODIVISION;\n    CMU->HFBUSPRESC = 1 << _CMU_HFBUSPRESC_PRESC_SHIFT;\n    CMU->HFCOREPRESC = 0 << _CMU_HFCOREPRESC_PRESC_SHIFT;\n    CMU->HFPERPRESC = 1 << _CMU_HFPERPRESC_PRESC_SHIFT;\n    CMU->HFEXPPRESC = 0 << _CMU_HFEXPPRESC_PRESC_SHIFT;\n    CMU->HFPERPRESCB = 0 << _CMU_HFPERPRESCB_PRESC_SHIFT;\n    CMU->HFPERPRESCC = 1 << _CMU_HFPERPRESCC_PRESC_SHIFT;\n\n    // Enable clock to peripherals\n    CMU->CTRL |= CMU_CTRL_HFPERCLKEN;\n\n    // Switch main clock to HFRCO and wait for it to be selected\n    CMU->HFCLKSEL = CMU_HFCLKSEL_HF_HFRCO;\n    while((CMU->HFCLKSTATUS & _CMU_HFCLKSTATUS_SELECTED_MASK) != CMU_HFCLKSTATUS_SELECTED_HFRCO);\n\n    // LFA Clock\n    CMU->LFACLKSEL = CMU_LFACLKSEL_LFA_LFRCO;\n\n    // LFB Clock\n    CMU->LFBCLKSEL = CMU_LFBCLKSEL_LFB_LFRCO;\n\n    // LFC Clock\n    CMU->LFCCLKSEL = CMU_LFCCLKSEL_LFC_LFRCO;\n\n    // LFE Clock\n    CMU->LFECLKSEL = CMU_LFECLKSEL_LFE_ULFRCO;\n}\n\nstatic void systick_init(void)\n{\n    SysTick->LOAD = (72000000 / 1000) - 1;\n    SysTick->VAL = 0;\n    SysTick->CTRL = SysTick_CTRL_TICKINT_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;\n\n    SCB->SHP[11] = 7 << (8 - __NVIC_PRIO_BITS); // Set priority 3,1 (min)\n}\n\nstatic void gpio_init(void)\n{\n    CMU->HFBUSCLKEN0 |= CMU_HFBUSCLKEN0_GPIO;\n\n    // NC - Not Connected (not available in mcu package)\n    // NR - Not routed (no routing to pin on pcb, floating)\n    // NU - Not used (not currently in use)\n\n    // Port A\n    GPIO->P[0].CTRL   = GPIO_P_CTRL_DRIVESTRENGTHALT_STRONG | (6 << _GPIO_P_CTRL_SLEWRATEALT_SHIFT)\n                      | GPIO_P_CTRL_DRIVESTRENGTH_STRONG | (6 << _GPIO_P_CTRL_SLEWRATE_SHIFT);\n    GPIO->P[0].MODEL  = GPIO_P_MODEL_MODE0_DISABLED          // NU\n                      | GPIO_P_MODEL_MODE1_DISABLED          // NU\n                      | GPIO_P_MODEL_MODE2_DISABLED          // NU\n                      | GPIO_P_MODEL_MODE3_DISABLED          // NU\n                      | GPIO_P_MODEL_MODE4_DISABLED          // NU\n                      | GPIO_P_MODEL_MODE5_DISABLED          // NU\n                      | GPIO_P_MODEL_MODE6_DISABLED          // NU\n                      | GPIO_P_MODEL_MODE7_DISABLED;         // NC\n    GPIO->P[0].MODEH  = GPIO_P_MODEH_MODE8_DISABLED          // GPIO - MIC_ENABLE\n                      | GPIO_P_MODEH_MODE9_DISABLED          // NC\n                      | GPIO_P_MODEH_MODE10_DISABLED         // NC\n                      | GPIO_P_MODEH_MODE11_DISABLED         // NC\n                      | GPIO_P_MODEH_MODE12_WIREDAND         // LED0R\n                      | GPIO_P_MODEH_MODE13_WIREDAND         // LED0B\n                      | GPIO_P_MODEH_MODE14_WIREDAND         // LED0G\n                      | GPIO_P_MODEH_MODE15_DISABLED;        // NU\n    GPIO->P[0].DOUT   = 0x7000; // Leds off By default\n    GPIO->P[0].OVTDIS = 0;\n\n    // Port B\n    GPIO->P[1].CTRL   = GPIO_P_CTRL_DRIVESTRENGTHALT_STRONG | (6 << _GPIO_P_CTRL_SLEWRATEALT_SHIFT)\n                      | GPIO_P_CTRL_DRIVESTRENGTH_STRONG | (6 << _GPIO_P_CTRL_SLEWRATE_SHIFT);\n    GPIO->P[1].MODEL  = GPIO_P_MODEL_MODE0_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE1_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE2_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE3_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE4_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE5_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE6_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE7_DISABLED;                // MAIN_LFXTAL_P\n    GPIO->P[1].MODEH  = GPIO_P_MODEH_MODE8_DISABLED                 // MAIN_LFXTAL_N\n                      | GPIO_P_MODEH_MODE9_DISABLED                 // NC\n                      | GPIO_P_MODEH_MODE10_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE11_DISABLED                // PDM_DAT0 - MIC_DATA\n                      | GPIO_P_MODEH_MODE12_DISABLED                // PDM_CLK - MIC_CLOCK\n                      | GPIO_P_MODEH_MODE13_DISABLED                // MAIN_HFXTAL_P\n                      | GPIO_P_MODEH_MODE14_DISABLED                // MAIN_HFXTAL_N\n                      | GPIO_P_MODEH_MODE15_DISABLED;               // NC\n    GPIO->P[1].DOUT   = 0;\n    GPIO->P[1].OVTDIS = 0;\n\n    // Port C\n    GPIO->P[2].CTRL   = GPIO_P_CTRL_DRIVESTRENGTHALT_STRONG | (6 << _GPIO_P_CTRL_SLEWRATEALT_SHIFT)\n                      | GPIO_P_CTRL_DRIVESTRENGTH_STRONG | (7 << _GPIO_P_CTRL_SLEWRATE_SHIFT);\n    GPIO->P[2].MODEL  = GPIO_P_MODEL_MODE0_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE1_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE2_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE3_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE4_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE5_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE6_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE7_DISABLED;                // NC\n    GPIO->P[2].MODEH  = GPIO_P_MODEH_MODE8_DISABLED                 // NC\n                      | GPIO_P_MODEH_MODE9_DISABLED                 // NC\n                      | GPIO_P_MODEH_MODE10_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE11_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE12_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE13_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE14_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE15_DISABLED;               // NC\n    GPIO->P[2].DOUT   = 0;\n    GPIO->P[2].OVTDIS = 0;\n\n    // Port D\n    GPIO->P[3].CTRL   = GPIO_P_CTRL_DRIVESTRENGTHALT_STRONG | (6 << _GPIO_P_CTRL_SLEWRATEALT_SHIFT)\n                      | GPIO_P_CTRL_DRIVESTRENGTH_STRONG | (6 << _GPIO_P_CTRL_SLEWRATE_SHIFT);\n    GPIO->P[3].MODEL  = GPIO_P_MODEL_MODE0_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE1_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE2_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE3_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE4_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE5_INPUT                    // GPIO - BTN0\n                      | GPIO_P_MODEL_MODE6_WIREDAND                 // LED1R\n                      | GPIO_P_MODEL_MODE7_DISABLED;                // NU\n    GPIO->P[3].MODEH  = GPIO_P_MODEH_MODE8_INPUT                    // GPIO - BTN1\n                      | GPIO_P_MODEH_MODE9_DISABLED                 // NC\n                      | GPIO_P_MODEH_MODE10_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE11_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE12_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE13_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE14_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE15_DISABLED;               // NC\n    GPIO->P[3].DOUT   = 0;\n    GPIO->P[3].OVTDIS = 0;\n\n    // Port E\n    GPIO->P[4].CTRL   = GPIO_P_CTRL_DRIVESTRENGTHALT_STRONG | (6 << _GPIO_P_CTRL_SLEWRATEALT_SHIFT)\n                      | GPIO_P_CTRL_DRIVESTRENGTH_STRONG | (6 << _GPIO_P_CTRL_SLEWRATE_SHIFT);\n    GPIO->P[4].MODEL  = GPIO_P_MODEL_MODE0_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE1_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE2_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE3_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE4_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE5_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE6_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE7_DISABLED;                // NU\n    GPIO->P[4].MODEH  = GPIO_P_MODEH_MODE8_DISABLED                 // NU\n                      | GPIO_P_MODEH_MODE9_DISABLED                 // NU\n                      | GPIO_P_MODEH_MODE10_DISABLED                // NU\n                      | GPIO_P_MODEH_MODE11_DISABLED                // NU\n                      | GPIO_P_MODEH_MODE12_WIREDAND                // LED1B\n                      | GPIO_P_MODEH_MODE13_DISABLED                // NU\n                      | GPIO_P_MODEH_MODE14_DISABLED                // NU\n                      | GPIO_P_MODEH_MODE15_DISABLED;               // NU\n    GPIO->P[4].DOUT   = 0;\n    GPIO->P[4].OVTDIS = 0;\n\n    // Port F\n    GPIO->P[5].CTRL   = GPIO_P_CTRL_DRIVESTRENGTHALT_STRONG | (6 << _GPIO_P_CTRL_SLEWRATEALT_SHIFT)\n                      | GPIO_P_CTRL_DRIVESTRENGTH_STRONG | (6 << _GPIO_P_CTRL_SLEWRATE_SHIFT);\n    GPIO->P[5].MODEL  = GPIO_P_MODEL_MODE0_PUSHPULL                 // SWCLK\n                      | GPIO_P_MODEL_MODE1_PUSHPULL                 // SWDIO\n                      | GPIO_P_MODEL_MODE2_PUSHPULL                 // SWO\n                      | GPIO_P_MODEL_MODE3_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE4_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE5_DISABLED                 // NU\n                      | GPIO_P_MODEL_MODE6_DISABLED                 // NC\n                      | GPIO_P_MODEL_MODE7_DISABLED;                // NC\n    GPIO->P[5].MODEH  = GPIO_P_MODEH_MODE8_DISABLED                 // NC\n                      | GPIO_P_MODEH_MODE9_DISABLED                 // NC\n                      | GPIO_P_MODEH_MODE10_DISABLED                // USB N\n                      | GPIO_P_MODEH_MODE11_DISABLED                // USB P\n                      | GPIO_P_MODEH_MODE12_WIREDAND                // LED1G\n                      | GPIO_P_MODEH_MODE13_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE14_DISABLED                // NC\n                      | GPIO_P_MODEH_MODE15_DISABLED;               // NC\n    GPIO->P[5].DOUT   = 0;\n\n    GPIO->P[5].OVTDIS = 0;\n\n    // Debugger Route\n    GPIO->ROUTEPEN &= ~(GPIO_ROUTEPEN_TDIPEN | GPIO_ROUTEPEN_TDOPEN);   // Disable JTAG\n    GPIO->ROUTEPEN |= GPIO_ROUTEPEN_SWVPEN;                             // Enable SWO\n    GPIO->ROUTELOC0 = GPIO_ROUTELOC0_SWVLOC_LOC0;                       // SWO on PF2\n\n    // External interrupts\n    GPIO->EXTIPSELL = GPIO_EXTIPSELL_EXTIPSEL0_PORTE            // NU\n                    | GPIO_EXTIPSELL_EXTIPSEL1_PORTB            // NU\n                    | GPIO_EXTIPSELL_EXTIPSEL2_PORTB            // NU\n                    | GPIO_EXTIPSELL_EXTIPSEL3_PORTB            // NU\n                    | GPIO_EXTIPSELL_EXTIPSEL4_PORTA            // NU\n                    | GPIO_EXTIPSELL_EXTIPSEL5_PORTA            // NU\n                    | GPIO_EXTIPSELL_EXTIPSEL6_PORTC            // NU\n                    | GPIO_EXTIPSELL_EXTIPSEL7_PORTC;           // NU\n    GPIO->EXTIPSELH = GPIO_EXTIPSELH_EXTIPSEL8_PORTA            // NU\n                    | GPIO_EXTIPSELH_EXTIPSEL9_PORTE            // NU\n                    | GPIO_EXTIPSELH_EXTIPSEL10_PORTF           // NU\n                    | GPIO_EXTIPSELH_EXTIPSEL11_PORTA           // NU\n                    | GPIO_EXTIPSELH_EXTIPSEL12_PORTA           // NU\n                    | GPIO_EXTIPSELH_EXTIPSEL13_PORTE           // NU\n                    | GPIO_EXTIPSELH_EXTIPSEL14_PORTF           // NU\n                    | GPIO_EXTIPSELH_EXTIPSEL15_PORTA;          // NU\n\n    GPIO->EXTIPINSELL = GPIO_EXTIPINSELL_EXTIPINSEL0_PIN3       // NU\n                      | GPIO_EXTIPINSELL_EXTIPINSEL1_PIN1       // NU\n                      | GPIO_EXTIPINSELL_EXTIPINSEL2_PIN2       // NU\n                      | GPIO_EXTIPINSELL_EXTIPINSEL3_PIN3       // NU\n                      | GPIO_EXTIPINSELL_EXTIPINSEL4_PIN6       // NU\n                      | GPIO_EXTIPINSELL_EXTIPINSEL5_PIN7       // NU\n                      | GPIO_EXTIPINSELL_EXTIPINSEL6_PIN4       // NU\n                      | GPIO_EXTIPINSELL_EXTIPINSEL7_PIN7;      // NU\n    GPIO->EXTIPINSELH = GPIO_EXTIPINSELH_EXTIPINSEL8_PIN8       // NU\n                      | GPIO_EXTIPINSELH_EXTIPINSEL9_PIN9       // NU\n                      | GPIO_EXTIPINSELH_EXTIPINSEL10_PIN11     // NU\n                      | GPIO_EXTIPINSELH_EXTIPINSEL11_PIN8      // NU\n                      | GPIO_EXTIPINSELH_EXTIPINSEL12_PIN13     // NU\n                      | GPIO_EXTIPINSELH_EXTIPINSEL13_PIN15     // NU\n                      | GPIO_EXTIPINSELH_EXTIPINSEL14_PIN12     // NU\n                      | GPIO_EXTIPINSELH_EXTIPINSEL15_PIN12;    // NU\n\n}\n\n/*--------------------------------------------------------------------*/\n/* Board Init                                                         */\n/*--------------------------------------------------------------------*/\n\nvoid board_init(void)\n{\n\n  emu_dcdc_init(1800.f, 50.f, 100.f, 0.f); // Init DC-DC converter (1.8 V, 50 mA active, 100 uA sleep, 0 mA reverse limit)\n  emu_init(0);\n  emu_reg_init(3300.f); // set output regulator to 3.3V\n\n  cmu_hfxo_startup_calib(0x200, 0x145); // Config HFXO Startup for 1280 uA, 36 pF (18 pF + 2 pF CLOAD)\n  cmu_hfxo_steady_calib(0x009, 0x145); // Config HFXO Steady for 12 uA, 36 pF (18 pF + 2 pF CLOAD)\n\n  cmu_init(); // Init Clock Management Unit\n\n  cmu_ushfrco_calib(1, DEVINFO->USHFRCOCAL13); // Enable and calibrate USHFRCO for 48 MHz\n  cmu_auxhfrco_calib(1, DEVINFO->AUXHFRCOCAL11); // Enable and calibrate AUXHFRCO for 32 MHz\n\n  CMU->USBCRCTRL = CMU_USBCRCTRL_USBCREN; // enable USB clock recovery\n  CMU->USBCTRL = CMU_USBCTRL_USBCLKSEL_USHFRCO | CMU_USBCTRL_USBCLKEN;  // select USHFRCO as USB Phy clock source and enable it\n\n  CMU->HFBUSCLKEN0 |= CMU_HFBUSCLKEN0_USB;  // enable USB peripheral clock\n\n  systick_init(); // Init system tick\n\n  gpio_init(); // Init IOs\n\n}\n\n/*--------------------------------------------------------------------*/\n/* Board porting API                                                  */\n/*--------------------------------------------------------------------*/\n\nvoid board_led_write(bool state)\n{\n  // Combine red and blue for pink Because it looks good :)\n  GPIO->P[LED_PORT].DOUT = (GPIO->P[LED_PORT].DOUT & ~((1 << LED_PIN_R) | (1 << LED_PIN_B))) | (state << LED_PIN_R) | (state << LED_PIN_B);\n}\n\nuint32_t board_button_read(void)\n{\n  return !!(GPIO->P[BUTTON_PORT].DIN & (1 << BUTTON_PIN));\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  Reports the name of the source file and the source line number\n  *         where the assert_param error has occurred.\n  * @param  file: pointer to the source file name\n  * @param  line: assert_param error line source number\n  * @retval None\n  */\nvoid assert_failed(char *file, uint32_t line)\n{\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/efm32/family.cmake",
    "content": "include_guard()\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# EFM32_FAMILY should be set by board.cmake (e.g. efm32gg12b)\nstring(TOUPPER ${EFM32_FAMILY} EFM32_FAMILY_UPPER)\nset(SILABS_CMSIS ${TOP}/hw/mcu/silabs/cmsis-dfp-${EFM32_FAMILY}/Device/SiliconLabs/${EFM32_FAMILY_UPPER})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS EFM32GG CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_GNU ${SILABS_CMSIS}/Source/GCC/${EFM32_FAMILY}.ld)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SILABS_CMSIS}/Source/GCC/startup_${EFM32_FAMILY}.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SILABS_CMSIS}/Source/system_${EFM32_FAMILY}.c\n    )\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${SILABS_CMSIS}/Include\n    )\n\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __STARTUP_CLEAR_BSS\n    __START=main\n    ${EFM32_MCU}\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_EFM32GG)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/efm32/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n  -flto \\\n  -mthumb \\\n  -mcpu=cortex-m4 \\\n  -mfloat-abi=hard \\\n  -mfpu=fpv4-sp-d16 \\\n  -nostdlib -nostartfiles \\\n  -D__STARTUP_CLEAR_BSS \\\n  -D__START=main \\\n  -DCFG_TUSB_MCU=OPT_MCU_EFM32GG\n\nCPU_CORE ?= cortex-m4\n\n# EFM32_FAMILY should be set by board.mk (e.g. efm32gg12b)\nSILABS_CMSIS = hw/mcu/silabs/cmsis-dfp-$(EFM32_FAMILY)/Device/SiliconLabs/$(shell echo $(EFM32_FAMILY) | tr a-z A-Z)\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\n# All source paths should be relative to the top level.\nLD_FILE = $(SILABS_CMSIS)/Source/GCC/$(EFM32_FAMILY).ld\n\nSRC_C += \\\n  $(SILABS_CMSIS)/Source/system_$(EFM32_FAMILY).c \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\nSRC_S += \\\n  $(SILABS_CMSIS)/Source/GCC/startup_$(EFM32_FAMILY).S\n\nINC += \\\n  $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n  $(TOP)/$(SILABS_CMSIS)/Include \\\n  $(TOP)/$(BOARD_PATH)\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM4F\n"
  },
  {
    "path": "hw/bsp/espressif/boards/CMakeLists.txt",
    "content": "set(hw_dir \"${CMAKE_CURRENT_LIST_DIR}/../../../\")\n\nidf_component_register(SRCS family.c\n                    INCLUDE_DIRS \".\" ${BOARD} ${hw_dir}\n                    PRIV_REQUIRES driver usb\n                    REQUIRES led_strip src tinyusb_src)\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_feather_esp32_v2/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32\")\nset(MAX3421_HOST 1)\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_feather_esp32_v2/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather ESP32 v2\n   url: https://www.adafruit.com/product/5400\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          0\n#define NEOPIXEL_POWER_PIN    2\n#define NEOPIXEL_POWER_STATE  1\n\n#define BUTTON_PIN            38\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST SPI3_HOST\n#define MAX3421_SCK_PIN  5\n#define MAX3421_MOSI_PIN 19\n#define MAX3421_MISO_PIN 21\n#define MAX3421_CS_PIN   33\n#define MAX3421_INTR_PIN 15\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_feather_esp32c6/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32c6\")\nset(MAX3421_HOST 1)\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_feather_esp32c6/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather EPS32-C6\n   url: https://www.adafruit.com/product/5933\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          15\n\n#define BUTTON_PIN            9\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST SPI2_HOST\n#define MAX3421_SCK_PIN  21\n#define MAX3421_MOSI_PIN 22\n#define MAX3421_MISO_PIN 23\n#define MAX3421_CS_PIN   8\n#define MAX3421_INTR_PIN 7\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_feather_esp32s2/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s2\")\nset(MAX3421_HOST 1)\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_feather_esp32s2/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather ESP32S2\n   url: https://www.adafruit.com/product/5000\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          33\n#define NEOPIXEL_POWER_PIN    21\n#define NEOPIXEL_POWER_STATE  1\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST SPI2_HOST\n#define MAX3421_SCK_PIN  36\n#define MAX3421_MOSI_PIN 35\n#define MAX3421_MISO_PIN 37\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 9\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_feather_esp32s3/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s3\")\nset(MAX3421_HOST 1)\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_feather_esp32s3/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather ESP32S3\n   url: https://www.adafruit.com/product/5323\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          33\n#define NEOPIXEL_POWER_PIN    21\n#define NEOPIXEL_POWER_STATE  1\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST SPI2_HOST\n#define MAX3421_SCK_PIN  36\n#define MAX3421_MOSI_PIN 35\n#define MAX3421_MISO_PIN 37\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 9\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_magtag_29gray/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s2\")\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_magtag_29gray/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit MagTag 2.9\" Grayscale\n   url: https://www.adafruit.com/product/4800\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          1\n#define NEOPIXEL_POWER_PIN    21\n#define NEOPIXEL_POWER_STATE  0\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_metro_esp32s2/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s2\")\nset(MAX3421_HOST 1)\n"
  },
  {
    "path": "hw/bsp/espressif/boards/adafruit_metro_esp32s2/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Metro ESP32-S2\n   url: https://www.adafruit.com/product/4775\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          45\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST SPI2_HOST\n#define MAX3421_SCK_PIN  36\n#define MAX3421_MOSI_PIN 35\n#define MAX3421_MISO_PIN 37\n#define MAX3421_CS_PIN   15\n#define MAX3421_INTR_PIN 14\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_addax_1/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s3\")\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_addax_1/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif Addax-1\n   url: n/a\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Note: On the production version (v1.1) WS2812 is connected to GPIO 47\n#define NEOPIXEL_PIN          47\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_c3_devkitc/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32c3\")\nset(MAX3421_HOST 1)\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_c3_devkitc/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif C3 DevKitC\n   url: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c3/esp32-c3-devkitc-02/index.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          8\n\n#define BUTTON_PIN            9\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST SPI2_HOST\n#define MAX3421_SCK_PIN  4\n#define MAX3421_MOSI_PIN 6\n#define MAX3421_MISO_PIN 5\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 7\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_c6_devkitc/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32c6\")\nset(MAX3421_HOST 1)\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_c6_devkitc/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif C6 DevKitC\n   url: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c6/esp32-c6-devkitc-1/index.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          8\n\n#define BUTTON_PIN            9\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST SPI2_HOST\n#define MAX3421_SCK_PIN  4\n#define MAX3421_MOSI_PIN 6\n#define MAX3421_MISO_PIN 5\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 7\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_kaluga_1/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s2\")\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_kaluga_1/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif Kaluga 1\n   url: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s2/esp32-s2-kaluga-1/index.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Note: need to insert jumper next to WS2812 pixel\n#define NEOPIXEL_PIN          45\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST  SPI2_HOST\n#define MAX3421_SCK_PIN  36\n#define MAX3421_MOSI_PIN 35\n#define MAX3421_MISO_PIN 37\n#define MAX3421_CS_PIN   15\n#define MAX3421_INTR_PIN 14\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_p4_function_ev/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32p4\")\nlist(APPEND SDKCONFIG_DEFAULTS \"${CMAKE_CURRENT_LIST_DIR}/sdkconfig.defaults\")\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_p4_function_ev/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif P4 Function EV\n   url: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32p4/esp32-p4-function-ev-board/index.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// #define NEOPIXEL_PIN          48\n\n#define BUTTON_PIN            35\n#define BUTTON_STATE_ACTIVE   0\n\n// For CI hardware test, to test both device and host on the same HS port with help of TS3USB30\n// https://www.adafruit.com/product/5871\n#define HIL_TS3USB30_MODE_PIN    47\n#define HIL_TS3USB30_MODE_DEVICE 1\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_p4_function_ev/sdkconfig.defaults",
    "content": "CONFIG_ESP32P4_SELECTS_REV_LESS_V3=y\nCONFIG_ESP32P4_REV_MIN_1=y\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_s2_devkitc/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s2\")\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_s2_devkitc/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif S2 DevKitC\n   url: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s2/esp32-s2-devkitc-1/index.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          18\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST  SPI2_HOST\n#define MAX3421_SCK_PIN  36\n#define MAX3421_MOSI_PIN 35\n#define MAX3421_MISO_PIN 37\n#define MAX3421_CS_PIN   15\n#define MAX3421_INTR_PIN 14\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_s3_devkitc/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s3\")\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_s3_devkitc/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif S3 DevKitC\n   url: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp32-s3-devkitc-1/index.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          38\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST  SPI2_HOST\n#define MAX3421_SCK_PIN  39\n#define MAX3421_MOSI_PIN 42\n#define MAX3421_MISO_PIN 21\n#define MAX3421_CS_PIN   15\n#define MAX3421_INTR_PIN 14\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_s3_devkitm/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s3\")\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_s3_devkitm/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif S3 DevKitM\n   url: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s3/esp32-s3-devkitm-1/index.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define NEOPIXEL_PIN          48\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n// SPI for USB host shield\n#define MAX3421_SPI_HOST  SPI2_HOST\n#define MAX3421_SCK_PIN  39\n#define MAX3421_MOSI_PIN 42\n#define MAX3421_MISO_PIN 21\n#define MAX3421_CS_PIN   15\n#define MAX3421_INTR_PIN 14\n\n// For CI hardware test, to test both device and host on the same HS port with help of TS3USB30\n// https://www.adafruit.com/product/5871\n#define HIL_TS3USB30_MODE_PIN    47\n#define HIL_TS3USB30_MODE_DEVICE 1\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_saola_1/board.cmake",
    "content": "# Apply board specific content here\nset(IDF_TARGET \"esp32s2\")\n"
  },
  {
    "path": "hw/bsp/espressif/boards/espressif_saola_1/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Espresif S2 Saola 1\n   url: https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32s2/esp32-s2-saola-1/index.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Note: On the production version (v1.2) WS2812 is connected to GPIO 18,\n// however earlier revision v1.1 WS2812 is connected to GPIO 17\n#define NEOPIXEL_PIN          18\n\n#define BUTTON_PIN            0\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/espressif/boards/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Espressif\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n#include \"esp_rom_gpio.h\"\n#include \"esp_mac.h\"\n#include \"hal/gpio_ll.h\"\n\n#include \"driver/gpio.h\"\n#include \"driver/uart.h\"\n#include \"esp_private/periph_ctrl.h\"\n\n#ifdef NEOPIXEL_PIN\n#include \"led_strip.h\"\nstatic led_strip_handle_t led_strip;\n#endif\n\n#if CFG_TUH_ENABLED && CFG_TUH_MAX3421\n#include \"driver/spi_master.h\"\nstatic void max3421_init(void);\n#endif\n\n#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4, OPT_MCU_ESP32P4)\nstatic bool usb_init(uint8_t rhport, bool is_host);\n#endif\n\n//--------------------------------------------------------------------+\n// Implementation\n//--------------------------------------------------------------------+\n\n// Initialize on-board peripherals : led, button, uart and USB\nvoid board_init(void) {\n#ifdef NEOPIXEL_PIN\n  #ifdef NEOPIXEL_POWER_PIN\n  gpio_reset_pin(NEOPIXEL_POWER_PIN);\n  gpio_set_direction(NEOPIXEL_POWER_PIN, GPIO_MODE_OUTPUT);\n  gpio_set_level(NEOPIXEL_POWER_PIN, NEOPIXEL_POWER_STATE);\n  #endif\n\n  // WS2812 Neopixel driver with RMT peripheral\n  led_strip_rmt_config_t rmt_config = {\n      .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption\n      .resolution_hz = 10 * 1000 * 1000,  // RMT counter clock frequency, default = 10 Mhz\n      .flags.with_dma = false,        // DMA feature is available on ESP target like ESP32-S3\n  };\n\n  led_strip_config_t strip_config = {\n      .strip_gpio_num = NEOPIXEL_PIN,           // The GPIO that connected to the LED strip's data line\n      .max_leds = 1,                            // The number of LEDs in the strip,\n      .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip\n      .led_model = LED_MODEL_WS2812,            // LED strip model\n      .flags.invert_out = false,                // whether to invert the output signal\n  };\n\n  ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));\n  led_strip_clear(led_strip); // off\n#endif\n\n  // Button\n  esp_rom_gpio_pad_select_gpio(BUTTON_PIN);\n  gpio_set_direction(BUTTON_PIN, GPIO_MODE_INPUT);\n  gpio_set_pull_mode(BUTTON_PIN, BUTTON_STATE_ACTIVE ? GPIO_PULLDOWN_ONLY : GPIO_PULLUP_ONLY);\n\n#if CONFIG_USB_OTG_SUPPORTED\n  #if CFG_TUD_ENABLED\n  usb_init(BOARD_TUD_RHPORT, false);\n  #endif\n\n  #if CFG_TUH_ENABLED\n  usb_init(BOARD_TUH_RHPORT, true);\n  #endif\n#endif\n\n#ifdef HIL_TS3USB30_MODE_PIN\n  gpio_reset_pin(HIL_TS3USB30_MODE_PIN);\n  gpio_set_direction(HIL_TS3USB30_MODE_PIN, GPIO_MODE_OUTPUT);\n  gpio_set_level(HIL_TS3USB30_MODE_PIN, CFG_TUD_ENABLED ? HIL_TS3USB30_MODE_DEVICE : (1-HIL_TS3USB30_MODE_DEVICE));\n#endif\n\n#if CFG_TUH_ENABLED && CFG_TUH_MAX3421\n  max3421_init();\n#endif\n}\n\n#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4)\n\n#endif\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  // use factory default MAC as serial ID\n  esp_efuse_mac_get_default(id);\n  return 6;\n}\n\nvoid board_led_write(bool state) {\n#ifdef NEOPIXEL_PIN\n  led_strip_set_pixel(led_strip, 0, state ? 0x08 : 0x00, 0x00, 0x00);\n  led_strip_refresh(led_strip);\n#endif\n}\n\n// Get the current state of button\n// a '1' means active (pressed), a '0' means inactive.\nuint32_t board_button_read(void) {\n  return gpio_get_level(BUTTON_PIN) == BUTTON_STATE_ACTIVE;\n}\n\n// Get characters from UART\nint board_uart_read(uint8_t* buf, int len) {\n  for (int i=0; i<len; i++) {\n    int c = getchar();\n    if (c == EOF) {\n      return i;\n    }\n    buf[i] = (uint8_t) c;\n  }\n  return len;\n}\n\n// Send characters to UART\nint board_uart_write(void const* buf, int len) {\n  for (int i = 0; i < len; i++) {\n    putchar(((char*) buf)[i]);\n  }\n  return len;\n}\n\nint board_getchar(void) {\n  return getchar();\n}\n\nvoid board_putchar(int c) {\n  putchar(c);\n}\n\nvoid board_init_after_tusb(void) {\n  // nothing to do\n}\n\nvoid board_reset_to_bootloader(void) {\n  // not implemented\n}\n\n//--------------------------------------------------------------------\n// PHY Init\n//--------------------------------------------------------------------\n\n#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4, OPT_MCU_ESP32P4)\n#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)\n\n#include \"esp_private/usb_phy.h\"\n\nstatic usb_phy_handle_t phy_hdl;\n\nbool usb_init(uint8_t rhport, bool is_host) {\n  (void) rhport;\n  // Configure USB PHY\n  usb_phy_config_t phy_conf = {\n    .controller = USB_PHY_CTRL_OTG,\n#if defined(CONFIG_SOC_USB_UTMI_PHY_NUM) && CONFIG_SOC_USB_UTMI_PHY_NUM > 0\n    .target = USB_PHY_TARGET_UTMI,\n#else\n    .target = USB_PHY_TARGET_INT,\n#endif\n\n    // maybe we can use USB_OTG_MODE_DEFAULT and switch using dwc2 driver\n    .otg_mode = is_host ? USB_OTG_MODE_HOST : USB_OTG_MODE_DEVICE,\n    // https://github.com/hathach/tinyusb/issues/2943#issuecomment-2601888322\n    // Set speed to undefined (auto-detect) to avoid timinng/racing issue with S3 with host such as macOS\n    .otg_speed = USB_PHY_SPEED_UNDEFINED,\n  };\n\n  esp_err_t const err = usb_new_phy(&phy_conf, &phy_hdl);\n  if (err != ESP_OK) {\n    printf(\"usb_new_phy failed: %s\\r\\n\", esp_err_to_name(err));\n    phy_hdl = NULL;\n    return false;\n  }\n\n  return true;\n}\n\n#else\n\n#include \"esp_private/usb_phy.h\"\n#include \"hal/usb_hal.h\"\n#include \"soc/usb_periph.h\"\n\nstatic void configure_pins(usb_hal_context_t* usb) {\n  /* usb_periph_iopins currently configures USB_OTG as USB Device.\n   * Introduce additional parameters in usb_hal_context_t when adding support\n   * for USB Host. */\n  for (const usb_iopin_dsc_t* iopin = usb_periph_iopins; iopin->pin != -1; ++iopin) {\n    if ((usb->use_external_phy) || (iopin->ext_phy_only == 0)) {\n      esp_rom_gpio_pad_select_gpio(iopin->pin);\n      if (iopin->is_output) {\n        esp_rom_gpio_connect_out_signal(iopin->pin, iopin->func, false, false);\n      } else {\n        esp_rom_gpio_connect_in_signal(iopin->pin, iopin->func, false);\n        if ((iopin->pin != GPIO_MATRIX_CONST_ZERO_INPUT) && (iopin->pin != GPIO_MATRIX_CONST_ONE_INPUT)) {\n          gpio_ll_input_enable(&GPIO, iopin->pin);\n        }\n      }\n      esp_rom_gpio_pad_unhold(iopin->pin);\n    }\n  }\n\n  if (!usb->use_external_phy) {\n    gpio_set_drive_capability(USBPHY_DM_NUM, GPIO_DRIVE_CAP_3);\n    gpio_set_drive_capability(USBPHY_DP_NUM, GPIO_DRIVE_CAP_3);\n  }\n}\n\nbool usb_init(void) {\n  // USB Controller Hal init\n  periph_module_reset(PERIPH_USB_MODULE);\n  periph_module_enable(PERIPH_USB_MODULE);\n\n  usb_hal_context_t hal = {\n    .use_external_phy = false // use built-in PHY\n  };\n\n  usb_hal_init(&hal);\n  configure_pins(&hal);\n\n  return true;\n}\n\n#endif\n#endif\n\n//--------------------------------------------------------------------+\n// API: SPI transfer with MAX3421E, must be implemented by application\n//--------------------------------------------------------------------+\n#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\n\nstatic spi_device_handle_t max3421_spi;\nSemaphoreHandle_t max3421_intr_sem;\n\nstatic void IRAM_ATTR max3421_isr_handler(void* arg) {\n  (void) arg; // arg is gpio num\n\n  BaseType_t xHigherPriorityTaskWoken = pdFALSE;\n  xSemaphoreGiveFromISR(max3421_intr_sem, &xHigherPriorityTaskWoken);\n  if (xHigherPriorityTaskWoken) {\n    portYIELD_FROM_ISR();\n  }\n}\n\nstatic void max3421_intr_task(void* param) {\n  (void) param;\n\n  while (1) {\n    xSemaphoreTake(max3421_intr_sem, portMAX_DELAY);\n    tuh_int_handler(BOARD_TUH_RHPORT, false);\n  }\n}\n\nstatic void max3421_init(void) {\n  // CS pin\n  gpio_set_direction(MAX3421_CS_PIN, GPIO_MODE_OUTPUT);\n  gpio_set_level(MAX3421_CS_PIN, 1);\n\n  // SPI\n  spi_bus_config_t buscfg = {\n      .miso_io_num = MAX3421_MISO_PIN,\n      .mosi_io_num = MAX3421_MOSI_PIN,\n      .sclk_io_num = MAX3421_SCK_PIN,\n      .quadwp_io_num = -1,\n      .quadhd_io_num = -1,\n      .data4_io_num = -1,\n      .data5_io_num = -1,\n      .data6_io_num = -1,\n      .data7_io_num = -1,\n      .max_transfer_sz = 1024\n  };\n  ESP_ERROR_CHECK(spi_bus_initialize(MAX3421_SPI_HOST, &buscfg, SPI_DMA_CH_AUTO));\n\n  spi_device_interface_config_t max3421_cfg = {\n      .mode = 0,\n      .clock_speed_hz = 20000000, // S2/S3 can work with 26 Mhz, but esp32 seems only work up to 20 Mhz\n      .spics_io_num = -1, // manual control CS\n      .queue_size = 1\n  };\n  ESP_ERROR_CHECK(spi_bus_add_device(MAX3421_SPI_HOST, &max3421_cfg, &max3421_spi));\n\n  // Interrupt pin\n  max3421_intr_sem = xSemaphoreCreateBinary();\n  xTaskCreate(max3421_intr_task, \"max3421 intr\", 2048, NULL, configMAX_PRIORITIES - 2, NULL);\n\n  gpio_set_direction(MAX3421_INTR_PIN, GPIO_MODE_INPUT);\n  gpio_set_intr_type(MAX3421_INTR_PIN, GPIO_INTR_NEGEDGE);\n\n  gpio_install_isr_service(0);\n  gpio_isr_handler_add(MAX3421_INTR_PIN, max3421_isr_handler, NULL);\n}\n\nvoid tuh_max3421_int_api(uint8_t rhport, bool enabled) {\n  (void) rhport;\n  if (enabled) {\n    gpio_intr_enable(MAX3421_INTR_PIN);\n  } else {\n    gpio_intr_disable(MAX3421_INTR_PIN);\n  }\n}\n\nvoid tuh_max3421_spi_cs_api(uint8_t rhport, bool active) {\n  (void) rhport;\n  gpio_set_level(MAX3421_CS_PIN, active ? 0 : 1);\n}\n\nbool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const* tx_buf, uint8_t* rx_buf, size_t xfer_bytes) {\n  (void) rhport;\n\n  if (tx_buf == NULL) {\n    // fifo read, transmit rx_buf as dummy\n    tx_buf = rx_buf;\n  }\n\n  // length in bits\n  size_t const len_bits = xfer_bytes << 3;\n\n  spi_transaction_t xact = {\n      .length = len_bits,\n      .rxlength = rx_buf ? len_bits : 0,\n      .tx_buffer = tx_buf,\n      .rx_buffer = rx_buf\n  };\n\n  ESP_ERROR_CHECK(spi_device_transmit(max3421_spi, &xact));\n  return true;\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/CHANGELOG.md",
    "content": "## 2.5.0\n\n- Enabled support for IDF4.4 and above\n  - with RMT backend only\n- Added API `led_strip_set_pixel_hsv`\n\n## 2.4.0\n\n- Support configurable SPI mode to control leds\n  - recommend enabling DMA when using SPI mode\n\n## 2.3.0\n\n- Support configurable RMT channel size by setting `mem_block_symbols`\n\n## 2.2.0\n\n- Support for 4 components RGBW leds (SK6812):\n  - in led_strip_config_t new fields\n      led_pixel_format, controlling byte format (LED_PIXEL_FORMAT_GRB, LED_PIXEL_FORMAT_GRBW)\n      led_model, used to configure bit timing (LED_MODEL_WS2812, LED_MODEL_SK6812)\n  - new API led_strip_set_pixel_rgbw\n  - new interface type set_pixel_rgbw\n\n## 2.1.0\n\n- Support DMA feature, which offloads the CPU by a lot when it comes to drive a bunch of LEDs\n- Support various RMT clock sources\n- Acquire and release the power management lock before and after each refresh\n- New driver flag: `invert_out` which can invert the led control signal by hardware\n\n## 2.0.0\n\n- Reimplemented the driver using the new RMT driver (`driver/rmt_tx.h`)\n\n## 1.0.0\n\n- Initial driver version, based on the legacy RMT driver (`driver/rmt.h`)\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/CMakeLists.txt",
    "content": "include($ENV{IDF_PATH}/tools/cmake/version.cmake)\n\nset(srcs \"src/led_strip_api.c\")\n\nif(\"${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}\" VERSION_GREATER_EQUAL \"5.0\")\n    if(CONFIG_SOC_RMT_SUPPORTED)\n        list(APPEND srcs \"src/led_strip_rmt_dev.c\" \"src/led_strip_rmt_encoder.c\")\n    endif()\nelse()\n    list(APPEND srcs \"src/led_strip_rmt_dev_idf4.c\")\nendif()\n\n# the SPI backend driver relies on something that was added in IDF 5.1\nif(\"${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}\" VERSION_GREATER_EQUAL \"5.1\")\n    if(CONFIG_SOC_GPSPI_SUPPORTED)\n        list(APPEND srcs \"src/led_strip_spi_dev.c\")\n    endif()\nendif()\n\nidf_component_register(SRCS ${srcs}\n                       INCLUDE_DIRS \"include\" \"interface\"\n                       REQUIRES \"driver\")\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/README.md",
    "content": "# LED Strip Driver\n\n[![Component Registry](https://components.espressif.com/components/espressif/led_strip/badge.svg)](https://components.espressif.com/components/espressif/led_strip)\n\nThis driver is designed for addressable LEDs like [WS2812](http://www.world-semi.com/Certifications/WS2812B.html), where each LED is controlled by a single data line.\n\n## Backend Controllers\n\n### The [RMT](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/rmt.html) Peripheral\n\nThis is the most economical way to drive the LEDs because it only consumes one RMT channel, leaving other channels free to use. However, the memory usage increases dramatically with the number of LEDs. If the RMT hardware can't be assist by DMA, the driver will going into interrupt very frequently, thus result in a high CPU usage. What's worse, if the RMT interrupt is delayed or not serviced in time (e.g. if Wi-Fi interrupt happens on the same CPU core), the RMT transaction will be corrupted and the LEDs will display incorrect colors. If you want to use RMT to drive a large number of LEDs, you'd better to enable the DMA feature if possible [^1].\n\n#### Allocate LED Strip Object with RMT Backend\n\n```c\n#define BLINK_GPIO 0\n\nled_strip_handle_t led_strip;\n\n/* LED strip initialization with the GPIO and pixels number*/\nled_strip_config_t strip_config = {\n    .strip_gpio_num = BLINK_GPIO, // The GPIO that connected to the LED strip's data line\n    .max_leds = 1, // The number of LEDs in the strip,\n    .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip\n    .led_model = LED_MODEL_WS2812, // LED strip model\n    .flags.invert_out = false, // whether to invert the output signal (useful when your hardware has a level inverter)\n};\n\nled_strip_rmt_config_t rmt_config = {\n#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)\n    .rmt_channel = 0,\n#else\n    .clk_src = RMT_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption\n    .resolution_hz = 10 * 1000 * 1000, // 10MHz\n    .flags.with_dma = false, // whether to enable the DMA feature\n#endif\n};\nESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));\n```\n\nYou can create multiple LED strip objects with different GPIOs and pixel numbers. The backend driver will automatically allocate the RMT channel for you if there is more available.\n\n### The [SPI](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/spi_master.html) Peripheral\n\nSPI peripheral can also be used to generate the timing required by the LED strip. However this backend is not as economical as the RMT one, because it will take up the whole **bus**, unlike the RMT just takes one **channel**. You **CAN'T** connect other devices to the same SPI bus if it's been used by the led_strip, because the led_strip doesn't have the concept of \"Chip Select\".\n\nPlease note, the SPI backend has a dependency of **ESP-IDF >= 5.1**\n\n#### Allocate LED Strip Object with SPI Backend\n\n```c\n#define BLINK_GPIO 0\n\nled_strip_handle_t led_strip;\n\n/* LED strip initialization with the GPIO and pixels number*/\nled_strip_config_t strip_config = {\n    .strip_gpio_num = BLINK_GPIO, // The GPIO that connected to the LED strip's data line\n    .max_leds = 1, // The number of LEDs in the strip,\n    .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip\n    .led_model = LED_MODEL_WS2812, // LED strip model\n    .flags.invert_out = false, // whether to invert the output signal (useful when your hardware has a level inverter)\n};\n\nled_strip_spi_config_t spi_config = {\n    .clk_src = SPI_CLK_SRC_DEFAULT, // different clock source can lead to different power consumption\n    .flags.with_dma = true, // Using DMA can improve performance and help drive more LEDs\n    .spi_bus = SPI2_HOST,   // SPI bus ID\n};\nESP_ERROR_CHECK(led_strip_new_spi_device(&strip_config, &spi_config, &led_strip));\n```\n\nThe number of LED strip objects can be created depends on how many free SPI buses are free to use in your project.\n\n## FAQ\n\n* Which led_strip backend should I choose?\n  * It depends on your application requirement and target chip's ability.\n\n    ```mermaid\n    flowchart LR\n    A{Is RMT supported?}\n    A --> |No| B[SPI backend]\n    B --> C{Does the led strip has \\n a larger number of LEDs?}\n    C --> |No| D[Don't have to enable the DMA of the backend]\n    C --> |Yes| E[Enable the DMA of the backend]\n    A --> |Yes| F{Does the led strip has \\n a larger number of LEDs?}\n    F --> |Yes| G{Does RMT support DMA?}\n    G --> |Yes| E\n    G --> |No| B\n    F --> |No| H[RMT backend] --> D\n    ```\n\n* How to set the brightness of the LED strip?\n  * You can tune the brightness by scaling the value of each R-G-B element with a **same** factor. But pay attention to the overflow of the value.\n\n[^1]: The RMT DMA feature is not available on all ESP chips. Please check the data sheet before using it.\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/api.md",
    "content": "# API Reference\n\n## Header files\n\n- [include/led_strip.h](#file-includeled_striph)\n- [include/led_strip_rmt.h](#file-includeled_strip_rmth)\n- [include/led_strip_spi.h](#file-includeled_strip_spih)\n- [include/led_strip_types.h](#file-includeled_strip_typesh)\n- [interface/led_strip_interface.h](#file-interfaceled_strip_interfaceh)\n\n## File include/led_strip.h\n\n## Functions\n\n| Type | Name |\n| ---: | :--- |\n|  esp\\_err\\_t | [**led\\_strip\\_clear**](#function-led_strip_clear) ([**led\\_strip\\_handle\\_t**](#struct-led_strip_t) strip) <br>_Clear LED strip (turn off all LEDs)_ |\n|  esp\\_err\\_t | [**led\\_strip\\_del**](#function-led_strip_del) ([**led\\_strip\\_handle\\_t**](#struct-led_strip_t) strip) <br>_Free LED strip resources._ |\n|  esp\\_err\\_t | [**led\\_strip\\_refresh**](#function-led_strip_refresh) ([**led\\_strip\\_handle\\_t**](#struct-led_strip_t) strip) <br>_Refresh memory colors to LEDs._ |\n|  esp\\_err\\_t | [**led\\_strip\\_set\\_pixel**](#function-led_strip_set_pixel) ([**led\\_strip\\_handle\\_t**](#struct-led_strip_t) strip, uint32\\_t index, uint32\\_t red, uint32\\_t green, uint32\\_t blue) <br>_Set RGB for a specific pixel._ |\n|  esp\\_err\\_t | [**led\\_strip\\_set\\_pixel\\_hsv**](#function-led_strip_set_pixel_hsv) ([**led\\_strip\\_handle\\_t**](#struct-led_strip_t) strip, uint32\\_t index, uint16\\_t hue, uint8\\_t saturation, uint8\\_t value) <br>_Set HSV for a specific pixel._ |\n|  esp\\_err\\_t | [**led\\_strip\\_set\\_pixel\\_rgbw**](#function-led_strip_set_pixel_rgbw) ([**led\\_strip\\_handle\\_t**](#struct-led_strip_t) strip, uint32\\_t index, uint32\\_t red, uint32\\_t green, uint32\\_t blue, uint32\\_t white) <br>_Set RGBW for a specific pixel._ |\n\n## Functions Documentation\n\n### function `led_strip_clear`\n\n_Clear LED strip (turn off all LEDs)_\n\n```c\nesp_err_t led_strip_clear (\n    led_strip_handle_t strip\n)\n```\n\n**Parameters:**\n\n- `strip` LED strip\n\n**Returns:**\n\n- ESP\\_OK: Clear LEDs successfully\n- ESP\\_FAIL: Clear LEDs failed because some other error occurred\n\n### function `led_strip_del`\n\n_Free LED strip resources._\n\n```c\nesp_err_t led_strip_del (\n    led_strip_handle_t strip\n)\n```\n\n**Parameters:**\n\n- `strip` LED strip\n\n**Returns:**\n\n- ESP\\_OK: Free resources successfully\n- ESP\\_FAIL: Free resources failed because error occurred\n\n### function `led_strip_refresh`\n\n_Refresh memory colors to LEDs._\n\n```c\nesp_err_t led_strip_refresh (\n    led_strip_handle_t strip\n)\n```\n\n**Parameters:**\n\n- `strip` LED strip\n\n**Returns:**\n\n- ESP\\_OK: Refresh successfully\n- ESP\\_FAIL: Refresh failed because some other error occurred\n\n**Note:**\n\n: After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip.\n\n### function `led_strip_set_pixel`\n\n_Set RGB for a specific pixel._\n\n```c\nesp_err_t led_strip_set_pixel (\n    led_strip_handle_t strip,\n    uint32_t index,\n    uint32_t red,\n    uint32_t green,\n    uint32_t blue\n)\n```\n\n**Parameters:**\n\n- `strip` LED strip\n- `index` index of pixel to set\n- `red` red part of color\n- `green` green part of color\n- `blue` blue part of color\n\n**Returns:**\n\n- ESP\\_OK: Set RGB for a specific pixel successfully\n- ESP\\_ERR\\_INVALID\\_ARG: Set RGB for a specific pixel failed because of invalid parameters\n- ESP\\_FAIL: Set RGB for a specific pixel failed because other error occurred\n\n### function `led_strip_set_pixel_hsv`\n\n_Set HSV for a specific pixel._\n\n```c\nesp_err_t led_strip_set_pixel_hsv (\n    led_strip_handle_t strip,\n    uint32_t index,\n    uint16_t hue,\n    uint8_t saturation,\n    uint8_t value\n)\n```\n\n**Parameters:**\n\n- `strip` LED strip\n- `index` index of pixel to set\n- `hue` hue part of color (0 - 360)\n- `saturation` saturation part of color (0 - 255)\n- `value` value part of color (0 - 255)\n\n**Returns:**\n\n- ESP\\_OK: Set HSV color for a specific pixel successfully\n- ESP\\_ERR\\_INVALID\\_ARG: Set HSV color for a specific pixel failed because of an invalid argument\n- ESP\\_FAIL: Set HSV color for a specific pixel failed because other error occurred\n\n### function `led_strip_set_pixel_rgbw`\n\n_Set RGBW for a specific pixel._\n\n```c\nesp_err_t led_strip_set_pixel_rgbw (\n    led_strip_handle_t strip,\n    uint32_t index,\n    uint32_t red,\n    uint32_t green,\n    uint32_t blue,\n    uint32_t white\n)\n```\n\n**Note:**\n\nOnly call this function if your led strip does have the white component (e.g. SK6812-RGBW)\n\n**Note:**\n\nAlso see `led_strip_set_pixel` if you only want to specify the RGB part of the color and bypass the white component\n\n**Parameters:**\n\n- `strip` LED strip\n- `index` index of pixel to set\n- `red` red part of color\n- `green` green part of color\n- `blue` blue part of color\n- `white` separate white component\n\n**Returns:**\n\n- ESP\\_OK: Set RGBW color for a specific pixel successfully\n- ESP\\_ERR\\_INVALID\\_ARG: Set RGBW color for a specific pixel failed because of an invalid argument\n- ESP\\_FAIL: Set RGBW color for a specific pixel failed because other error occurred\n\n## File include/led_strip_rmt.h\n\n## Structures and Types\n\n| Type | Name |\n| ---: | :--- |\n| struct | [**led\\_strip\\_rmt\\_config\\_t**](#struct-led_strip_rmt_config_t) <br>_LED Strip RMT specific configuration._ |\n\n## Functions\n\n| Type | Name |\n| ---: | :--- |\n|  esp\\_err\\_t | [**led\\_strip\\_new\\_rmt\\_device**](#function-led_strip_new_rmt_device) (const [**led\\_strip\\_config\\_t**](#struct-led_strip_config_t) \\*led\\_config, const [**led\\_strip\\_rmt\\_config\\_t**](#struct-led_strip_rmt_config_t) \\*rmt\\_config, [**led\\_strip\\_handle\\_t**](#struct-led_strip_t) \\*ret\\_strip) <br>_Create LED strip based on RMT TX channel._ |\n\n## Structures and Types Documentation\n\n### struct `led_strip_rmt_config_t`\n\n_LED Strip RMT specific configuration._\n\nVariables:\n\n- rmt\\_clock\\_source\\_t clk_src  <br>RMT clock source\n\n- struct [**led\\_strip\\_rmt\\_config\\_t**](#struct-led_strip_rmt_config_t) flags  <br>Extra driver flags\n\n- size\\_t mem_block_symbols  <br>How many RMT symbols can one RMT channel hold at one time. Set to 0 will fallback to use the default size.\n\n- uint32\\_t resolution_hz  <br>RMT tick resolution, if set to zero, a default resolution (10MHz) will be applied\n\n- uint32\\_t with_dma  <br>Use DMA to transmit data\n\n## Functions Documentation\n\n### function `led_strip_new_rmt_device`\n\n_Create LED strip based on RMT TX channel._\n\n```c\nesp_err_t led_strip_new_rmt_device (\n    const led_strip_config_t *led_config,\n    const led_strip_rmt_config_t *rmt_config,\n    led_strip_handle_t *ret_strip\n)\n```\n\n**Parameters:**\n\n- `led_config` LED strip configuration\n- `rmt_config` RMT specific configuration\n- `ret_strip` Returned LED strip handle\n\n**Returns:**\n\n- ESP\\_OK: create LED strip handle successfully\n- ESP\\_ERR\\_INVALID\\_ARG: create LED strip handle failed because of invalid argument\n- ESP\\_ERR\\_NO\\_MEM: create LED strip handle failed because of out of memory\n- ESP\\_FAIL: create LED strip handle failed because some other error\n\n## File include/led_strip_spi.h\n\n## Structures and Types\n\n| Type | Name |\n| ---: | :--- |\n| struct | [**led\\_strip\\_spi\\_config\\_t**](#struct-led_strip_spi_config_t) <br>_LED Strip SPI specific configuration._ |\n\n## Functions\n\n| Type | Name |\n| ---: | :--- |\n|  esp\\_err\\_t | [**led\\_strip\\_new\\_spi\\_device**](#function-led_strip_new_spi_device) (const [**led\\_strip\\_config\\_t**](#struct-led_strip_config_t) \\*led\\_config, const [**led\\_strip\\_spi\\_config\\_t**](#struct-led_strip_spi_config_t) \\*spi\\_config, [**led\\_strip\\_handle\\_t**](#struct-led_strip_t) \\*ret\\_strip) <br>_Create LED strip based on SPI MOSI channel._ |\n\n## Structures and Types Documentation\n\n### struct `led_strip_spi_config_t`\n\n_LED Strip SPI specific configuration._\n\nVariables:\n\n- spi\\_clock\\_source\\_t clk_src  <br>SPI clock source\n\n- struct [**led\\_strip\\_spi\\_config\\_t**](#struct-led_strip_spi_config_t) flags  <br>Extra driver flags\n\n- spi\\_host\\_device\\_t spi_bus  <br>SPI bus ID. Which buses are available depends on the specific chip\n\n- uint32\\_t with_dma  <br>Use DMA to transmit data\n\n## Functions Documentation\n\n### function `led_strip_new_spi_device`\n\n_Create LED strip based on SPI MOSI channel._\n\n```c\nesp_err_t led_strip_new_spi_device (\n    const led_strip_config_t *led_config,\n    const led_strip_spi_config_t *spi_config,\n    led_strip_handle_t *ret_strip\n)\n```\n\n**Note:**\n\nAlthough only the MOSI line is used for generating the signal, the whole SPI bus can't be used for other purposes.\n\n**Parameters:**\n\n- `led_config` LED strip configuration\n- `spi_config` SPI specific configuration\n- `ret_strip` Returned LED strip handle\n\n**Returns:**\n\n- ESP\\_OK: create LED strip handle successfully\n- ESP\\_ERR\\_INVALID\\_ARG: create LED strip handle failed because of invalid argument\n- ESP\\_ERR\\_NOT\\_SUPPORTED: create LED strip handle failed because of unsupported configuration\n- ESP\\_ERR\\_NO\\_MEM: create LED strip handle failed because of out of memory\n- ESP\\_FAIL: create LED strip handle failed because some other error\n\n## File include/led_strip_types.h\n\n## Structures and Types\n\n| Type | Name |\n| ---: | :--- |\n| enum  | [**led\\_model\\_t**](#enum-led_model_t)  <br>_LED strip model._ |\n| enum  | [**led\\_pixel\\_format\\_t**](#enum-led_pixel_format_t)  <br>_LED strip pixel format._ |\n| struct | [**led\\_strip\\_config\\_t**](#struct-led_strip_config_t) <br>_LED Strip Configuration._ |\n| typedef struct [**led\\_strip\\_t**](#struct-led_strip_t) \\* | [**led\\_strip\\_handle\\_t**](#typedef-led_strip_handle_t)  <br>_LED strip handle._ |\n\n## Structures and Types Documentation\n\n### enum `led_model_t`\n\n_LED strip model._\n\n```c\nenum led_model_t {\n    LED_MODEL_WS2812,\n    LED_MODEL_SK6812,\n    LED_MODEL_INVALID\n};\n```\n\n**Note:**\n\nDifferent led model may have different timing parameters, so we need to distinguish them.\n\n### enum `led_pixel_format_t`\n\n_LED strip pixel format._\n\n```c\nenum led_pixel_format_t {\n    LED_PIXEL_FORMAT_GRB,\n    LED_PIXEL_FORMAT_GRBW,\n    LED_PIXEL_FORMAT_INVALID\n};\n```\n\n### struct `led_strip_config_t`\n\n_LED Strip Configuration._\n\nVariables:\n\n- struct [**led\\_strip\\_config\\_t**](#struct-led_strip_config_t) flags  <br>Extra driver flags\n\n- uint32\\_t invert_out  <br>Invert output signal\n\n- led\\_model\\_t led_model  <br>LED model\n\n- led\\_pixel\\_format\\_t led_pixel_format  <br>LED pixel format\n\n- uint32\\_t max_leds  <br>Maximum LEDs in a single strip\n\n- int strip_gpio_num  <br>GPIO number that used by LED strip\n\n### typedef `led_strip_handle_t`\n\n_LED strip handle._\n\n```c\ntypedef struct led_strip_t* led_strip_handle_t;\n```\n\n## File interface/led_strip_interface.h\n\n## Structures and Types\n\n| Type | Name |\n| ---: | :--- |\n| struct | [**led\\_strip\\_t**](#struct-led_strip_t) <br>_LED strip interface definition._ |\n| typedef struct [**led\\_strip\\_t**](#struct-led_strip_t) | [**led\\_strip\\_t**](#typedef-led_strip_t)  <br> |\n\n## Structures and Types Documentation\n\n### struct `led_strip_t`\n\n_LED strip interface definition._\n\nVariables:\n\n- esp\\_err\\_t(\\* clear  <br>_Clear LED strip (turn off all LEDs)_<br>**Parameters:**\n\n- `strip` LED strip\n- `timeout_ms` timeout value for clearing task\n\n**Returns:**\n\n- ESP\\_OK: Clear LEDs successfully\n- ESP\\_FAIL: Clear LEDs failed because some other error occurred\n\n- esp\\_err\\_t(\\* del  <br>_Free LED strip resources._<br>**Parameters:**\n\n- `strip` LED strip\n\n**Returns:**\n\n- ESP\\_OK: Free resources successfully\n- ESP\\_FAIL: Free resources failed because error occurred\n\n- esp\\_err\\_t(\\* refresh  <br>_Refresh memory colors to LEDs._<br>**Parameters:**\n\n- `strip` LED strip\n- `timeout_ms` timeout value for refreshing task\n\n**Returns:**\n\n- ESP\\_OK: Refresh successfully\n- ESP\\_FAIL: Refresh failed because some other error occurred\n\n**Note:**\n\n: After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip.\n\n- esp\\_err\\_t(\\* set_pixel  <br>_Set RGB for a specific pixel._<br>**Parameters:**\n\n- `strip` LED strip\n- `index` index of pixel to set\n- `red` red part of color\n- `green` green part of color\n- `blue` blue part of color\n\n**Returns:**\n\n- ESP\\_OK: Set RGB for a specific pixel successfully\n- ESP\\_ERR\\_INVALID\\_ARG: Set RGB for a specific pixel failed because of invalid parameters\n- ESP\\_FAIL: Set RGB for a specific pixel failed because other error occurred\n\n- esp\\_err\\_t(\\* set_pixel_rgbw  <br>_Set RGBW for a specific pixel. Similar to_ `set_pixel`_but also set the white component._<br>**Parameters:**\n\n- `strip` LED strip\n- `index` index of pixel to set\n- `red` red part of color\n- `green` green part of color\n- `blue` blue part of color\n- `white` separate white component\n\n**Returns:**\n\n- ESP\\_OK: Set RGBW color for a specific pixel successfully\n- ESP\\_ERR\\_INVALID\\_ARG: Set RGBW color for a specific pixel failed because of an invalid argument\n- ESP\\_FAIL: Set RGBW color for a specific pixel failed because other error occurred\n\n### typedef `led_strip_t`\n\n```c\ntypedef struct led_strip_t led_strip_t;\n```\n\nType of LED strip\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/examples/led_strip_rmt_ws2812/CMakeLists.txt",
    "content": "# For more information about build system see\n# https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html\n# The following five 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.16)\n\nset(IDF_TARGET \"esp32s3\")\ninclude($ENV{IDF_PATH}/tools/cmake/project.cmake)\nproject(led_strip_rmt_ws2812)\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/examples/led_strip_rmt_ws2812/README.md",
    "content": "# LED Strip Example (RMT backend + WS2812)\n\nThis example demonstrates how to blink the WS2812 LED using the [led_strip](https://components.espressif.com/component/espressif/led_strip) component.\n\n## How to Use Example\n\n### Hardware Required\n\n* A development board with Espressif SoC\n* A USB cable for Power supply and programming\n* WS2812 LED strip\n\n### Configure the Example\n\nBefore project configuration and build, be sure to set the correct chip target using `idf.py set-target <chip_name>`. Then assign the proper GPIO in the [source file](main/led_strip_rmt_ws2812_main.c). If your led strip has multiple LEDs, don't forget update the number.\n\n### Build and Flash\n\nRun `idf.py -p PORT build flash monitor` to build, flash and monitor the project.\n\n(To exit the serial monitor, type ``Ctrl-]``.)\n\nSee the [Getting Started Guide](https://docs.espressif.com/projects/esp-idf/en/latest/get-started/index.html) for full steps to configure and use ESP-IDF to build projects.\n\n## Example Output\n\n```text\nI (299) gpio: GPIO[8]| InputEn: 0| OutputEn: 1| OpenDrain: 0| Pullup: 1| Pulldown: 0| Intr:0\nI (309) example: Created LED strip object with RMT backend\nI (309) example: Start blinking LED strip\n```\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/examples/led_strip_rmt_ws2812/main/CMakeLists.txt",
    "content": "idf_component_register(SRCS \"led_strip_rmt_ws2812_main.c\"\n                       INCLUDE_DIRS \".\")\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/examples/led_strip_rmt_ws2812/main/idf_component.yml",
    "content": "## IDF Component Manager Manifest File\ndependencies:\n  espressif/led_strip:\n    version: '^2'\n    override_path: '../../../'\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/examples/led_strip_rmt_ws2812/main/led_strip_rmt_ws2812_main.c",
    "content": "/*\n * SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Unlicense OR CC0-1.0\n */\n#include <stdio.h>\n#include \"freertos/FreeRTOS.h\"\n#include \"freertos/task.h\"\n#include \"led_strip.h\"\n#include \"esp_log.h\"\n#include \"esp_err.h\"\n\n// GPIO assignment\n#define LED_STRIP_BLINK_GPIO  48\n// Numbers of the LED in the strip\n#define LED_STRIP_LED_NUMBERS 1\n// 10MHz resolution, 1 tick = 0.1us (led strip needs a high resolution)\n#define LED_STRIP_RMT_RES_HZ  (10 * 1000 * 1000)\n\nstatic const char *TAG = \"example\";\n\nled_strip_handle_t configure_led(void)\n{\n    // LED strip general initialization, according to your led board design\n    led_strip_config_t strip_config = {\n        .strip_gpio_num = LED_STRIP_BLINK_GPIO,   // The GPIO that connected to the LED strip's data line\n        .max_leds = LED_STRIP_LED_NUMBERS,        // The number of LEDs in the strip,\n        .led_pixel_format = LED_PIXEL_FORMAT_GRB, // Pixel format of your LED strip\n        .led_model = LED_MODEL_WS2812,            // LED strip model\n        .flags.invert_out = false,                // whether to invert the output signal\n    };\n\n    // LED strip backend configuration: RMT\n    led_strip_rmt_config_t rmt_config = {\n#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)\n        .rmt_channel = 0,\n#else\n        .clk_src = RMT_CLK_SRC_DEFAULT,        // different clock source can lead to different power consumption\n        .resolution_hz = LED_STRIP_RMT_RES_HZ, // RMT counter clock frequency\n        .flags.with_dma = false,               // DMA feature is available on ESP target like ESP32-S3\n#endif\n    };\n\n    // LED Strip object handle\n    led_strip_handle_t led_strip;\n    ESP_ERROR_CHECK(led_strip_new_rmt_device(&strip_config, &rmt_config, &led_strip));\n    ESP_LOGI(TAG, \"Created LED strip object with RMT backend\");\n    return led_strip;\n}\n\nvoid app_main(void)\n{\n    led_strip_handle_t led_strip = configure_led();\n    bool led_on_off = false;\n\n    ESP_LOGI(TAG, \"Start blinking LED strip\");\n    while (1) {\n        if (led_on_off) {\n            /* Set the LED pixel using RGB from 0 (0%) to 255 (100%) for each color */\n            for (int i = 0; i < LED_STRIP_LED_NUMBERS; i++) {\n                ESP_ERROR_CHECK(led_strip_set_pixel(led_strip, i, 5, 5, 5));\n            }\n            /* Refresh the strip to send data */\n            ESP_ERROR_CHECK(led_strip_refresh(led_strip));\n            ESP_LOGI(TAG, \"LED ON!\");\n        } else {\n            /* Set all LED off to clear all pixels */\n            ESP_ERROR_CHECK(led_strip_clear(led_strip));\n            ESP_LOGI(TAG, \"LED OFF!\");\n        }\n\n        led_on_off = !led_on_off;\n        vTaskDelay(pdMS_TO_TICKS(500));\n    }\n}\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/idf_component.yml",
    "content": "version: \"2.5.2\"\ndescription: Driver for Addressable LED Strip (WS2812, etc)\nurl: https://github.com/espressif/idf-extra-components/tree/master/led_strip\ndependencies:\n  idf: \">=4.4\"\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/include/led_strip.h",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#pragma once\n\n#include <stdint.h>\n#include \"esp_err.h\"\n#include \"led_strip_rmt.h\"\n#include \"esp_idf_version.h\"\n\n#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 1, 0)\n#include \"led_strip_spi.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @brief Set RGB for a specific pixel\n *\n * @param strip: LED strip\n * @param index: index of pixel to set\n * @param red: red part of color\n * @param green: green part of color\n * @param blue: blue part of color\n *\n * @return\n *      - ESP_OK: Set RGB for a specific pixel successfully\n *      - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters\n *      - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred\n */\nesp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue);\n\n/**\n * @brief Set RGBW for a specific pixel\n *\n * @note Only call this function if your led strip does have the white component (e.g. SK6812-RGBW)\n * @note Also see `led_strip_set_pixel` if you only want to specify the RGB part of the color and bypass the white component\n *\n * @param strip: LED strip\n * @param index: index of pixel to set\n * @param red: red part of color\n * @param green: green part of color\n * @param blue: blue part of color\n * @param white: separate white component\n *\n * @return\n *      - ESP_OK: Set RGBW color for a specific pixel successfully\n *      - ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument\n *      - ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred\n */\nesp_err_t led_strip_set_pixel_rgbw(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white);\n\n/**\n * @brief Set HSV for a specific pixel\n *\n * @param strip: LED strip\n * @param index: index of pixel to set\n * @param hue: hue part of color (0 - 360)\n * @param saturation: saturation part of color (0 - 255)\n * @param value: value part of color (0 - 255)\n *\n * @return\n *      - ESP_OK: Set HSV color for a specific pixel successfully\n *      - ESP_ERR_INVALID_ARG: Set HSV color for a specific pixel failed because of an invalid argument\n *      - ESP_FAIL: Set HSV color for a specific pixel failed because other error occurred\n */\nesp_err_t led_strip_set_pixel_hsv(led_strip_handle_t strip, uint32_t index, uint16_t hue, uint8_t saturation, uint8_t value);\n\n/**\n * @brief Refresh memory colors to LEDs\n *\n * @param strip: LED strip\n *\n * @return\n *      - ESP_OK: Refresh successfully\n *      - ESP_FAIL: Refresh failed because some other error occurred\n *\n * @note:\n *      After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip.\n */\nesp_err_t led_strip_refresh(led_strip_handle_t strip);\n\n/**\n * @brief Clear LED strip (turn off all LEDs)\n *\n * @param strip: LED strip\n *\n * @return\n *      - ESP_OK: Clear LEDs successfully\n *      - ESP_FAIL: Clear LEDs failed because some other error occurred\n */\nesp_err_t led_strip_clear(led_strip_handle_t strip);\n\n/**\n * @brief Free LED strip resources\n *\n * @param strip: LED strip\n *\n * @return\n *      - ESP_OK: Free resources successfully\n *      - ESP_FAIL: Free resources failed because error occurred\n */\nesp_err_t led_strip_del(led_strip_handle_t strip);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/include/led_strip_rmt.h",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#pragma once\n\n#include <stdint.h>\n#include \"esp_err.h\"\n#include \"led_strip_types.h\"\n#include \"esp_idf_version.h\"\n\n#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)\n#include \"driver/rmt_types.h\"\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @brief LED Strip RMT specific configuration\n */\ntypedef struct {\n#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5, 0, 0)\n    uint8_t rmt_channel;        /*!< Specify the channel number, the legacy RMT driver doesn't support channel allocator */\n#else // new driver supports specify the clock source and clock resolution\n    rmt_clock_source_t clk_src; /*!< RMT clock source */\n    uint32_t resolution_hz;     /*!< RMT tick resolution, if set to zero, a default resolution (10MHz) will be applied */\n#endif\n    size_t mem_block_symbols;   /*!< How many RMT symbols can one RMT channel hold at one time. Set to 0 will fallback to use the default size. */\n    struct {\n        uint32_t with_dma: 1;   /*!< Use DMA to transmit data */\n    } flags;                    /*!< Extra driver flags */\n} led_strip_rmt_config_t;\n\n/**\n * @brief Create LED strip based on RMT TX channel\n *\n * @param led_config LED strip configuration\n * @param rmt_config RMT specific configuration\n * @param ret_strip Returned LED strip handle\n * @return\n *      - ESP_OK: create LED strip handle successfully\n *      - ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument\n *      - ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory\n *      - ESP_FAIL: create LED strip handle failed because some other error\n */\nesp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/include/led_strip_spi.h",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#pragma once\n\n#include <stdint.h>\n#include \"esp_err.h\"\n#include \"driver/spi_master.h\"\n#include \"led_strip_types.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @brief LED Strip SPI specific configuration\n */\ntypedef struct {\n    spi_clock_source_t clk_src; /*!< SPI clock source */\n    spi_host_device_t spi_bus;  /*!< SPI bus ID. Which buses are available depends on the specific chip */\n    struct {\n        uint32_t with_dma: 1;   /*!< Use DMA to transmit data */\n    } flags;                    /*!< Extra driver flags */\n} led_strip_spi_config_t;\n\n/**\n * @brief Create LED strip based on SPI MOSI channel\n * @note Although only the MOSI line is used for generating the signal, the whole SPI bus can't be used for other purposes.\n *\n * @param led_config LED strip configuration\n * @param spi_config SPI specific configuration\n * @param ret_strip Returned LED strip handle\n * @return\n *      - ESP_OK: create LED strip handle successfully\n *      - ESP_ERR_INVALID_ARG: create LED strip handle failed because of invalid argument\n *      - ESP_ERR_NOT_SUPPORTED: create LED strip handle failed because of unsupported configuration\n *      - ESP_ERR_NO_MEM: create LED strip handle failed because of out of memory\n *      - ESP_FAIL: create LED strip handle failed because some other error\n */\nesp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/include/led_strip_types.h",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#pragma once\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @brief LED strip pixel format\n */\ntypedef enum {\n    LED_PIXEL_FORMAT_GRB,    /*!< Pixel format: GRB */\n    LED_PIXEL_FORMAT_GRBW,   /*!< Pixel format: GRBW */\n    LED_PIXEL_FORMAT_INVALID /*!< Invalid pixel format */\n} led_pixel_format_t;\n\n/**\n * @brief LED strip model\n * @note Different led model may have different timing parameters, so we need to distinguish them.\n */\ntypedef enum {\n    LED_MODEL_WS2812, /*!< LED strip model: WS2812 */\n    LED_MODEL_SK6812, /*!< LED strip model: SK6812 */\n    LED_MODEL_INVALID /*!< Invalid LED strip model */\n} led_model_t;\n\n/**\n * @brief LED strip handle\n */\ntypedef struct led_strip_t *led_strip_handle_t;\n\n/**\n * @brief LED Strip Configuration\n */\ntypedef struct {\n    int strip_gpio_num;      /*!< GPIO number that used by LED strip */\n    uint32_t max_leds;       /*!< Maximum LEDs in a single strip */\n    led_pixel_format_t led_pixel_format; /*!< LED pixel format */\n    led_model_t led_model;   /*!< LED model */\n\n    struct {\n        uint32_t invert_out: 1; /*!< Invert output signal */\n    } flags;                    /*!< Extra driver flags */\n} led_strip_config_t;\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/interface/led_strip_interface.h",
    "content": "/*\n * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#pragma once\n\n#include <stdint.h>\n#include \"esp_err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef struct led_strip_t led_strip_t; /*!< Type of LED strip */\n\n/**\n * @brief LED strip interface definition\n */\nstruct led_strip_t {\n    /**\n     * @brief Set RGB for a specific pixel\n     *\n     * @param strip: LED strip\n     * @param index: index of pixel to set\n     * @param red: red part of color\n     * @param green: green part of color\n     * @param blue: blue part of color\n     *\n     * @return\n     *      - ESP_OK: Set RGB for a specific pixel successfully\n     *      - ESP_ERR_INVALID_ARG: Set RGB for a specific pixel failed because of invalid parameters\n     *      - ESP_FAIL: Set RGB for a specific pixel failed because other error occurred\n     */\n    esp_err_t (*set_pixel)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue);\n\n    /**\n     * @brief Set RGBW for a specific pixel. Similar to `set_pixel` but also set the white component\n     *\n     * @param strip: LED strip\n     * @param index: index of pixel to set\n     * @param red: red part of color\n     * @param green: green part of color\n     * @param blue: blue part of color\n     * @param white: separate white component\n     *\n     * @return\n     *      - ESP_OK: Set RGBW color for a specific pixel successfully\n     *      - ESP_ERR_INVALID_ARG: Set RGBW color for a specific pixel failed because of an invalid argument\n     *      - ESP_FAIL: Set RGBW color for a specific pixel failed because other error occurred\n     */\n    esp_err_t (*set_pixel_rgbw)(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white);\n\n    /**\n     * @brief Refresh memory colors to LEDs\n     *\n     * @param strip: LED strip\n     * @param timeout_ms: timeout value for refreshing task\n     *\n     * @return\n     *      - ESP_OK: Refresh successfully\n     *      - ESP_FAIL: Refresh failed because some other error occurred\n     *\n     * @note:\n     *      After updating the LED colors in the memory, a following invocation of this API is needed to flush colors to strip.\n     */\n    esp_err_t (*refresh)(led_strip_t *strip);\n\n    /**\n     * @brief Clear LED strip (turn off all LEDs)\n     *\n     * @param strip: LED strip\n     * @param timeout_ms: timeout value for clearing task\n     *\n     * @return\n     *      - ESP_OK: Clear LEDs successfully\n     *      - ESP_FAIL: Clear LEDs failed because some other error occurred\n     */\n    esp_err_t (*clear)(led_strip_t *strip);\n\n    /**\n     * @brief Free LED strip resources\n     *\n     * @param strip: LED strip\n     *\n     * @return\n     *      - ESP_OK: Free resources successfully\n     *      - ESP_FAIL: Free resources failed because error occurred\n     */\n    esp_err_t (*del)(led_strip_t *strip);\n};\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/src/led_strip_api.c",
    "content": "/*\n * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#include \"esp_log.h\"\n#include \"esp_check.h\"\n#include \"led_strip.h\"\n#include \"led_strip_interface.h\"\n\nstatic const char *TAG = \"led_strip\";\n\nesp_err_t led_strip_set_pixel(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue)\n{\n    ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, \"invalid argument\");\n    return strip->set_pixel(strip, index, red, green, blue);\n}\n\nesp_err_t led_strip_set_pixel_hsv(led_strip_handle_t strip, uint32_t index, uint16_t hue, uint8_t saturation, uint8_t value)\n{\n    ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, \"invalid argument\");\n\n    uint32_t red = 0;\n    uint32_t green = 0;\n    uint32_t blue = 0;\n\n    uint32_t rgb_max = value;\n    uint32_t rgb_min = rgb_max * (255 - saturation) / 255.0f;\n\n    uint32_t i = hue / 60;\n    uint32_t diff = hue % 60;\n\n    // RGB adjustment amount by hue\n    uint32_t rgb_adj = (rgb_max - rgb_min) * diff / 60;\n\n    switch (i) {\n    case 0:\n        red = rgb_max;\n        green = rgb_min + rgb_adj;\n        blue = rgb_min;\n        break;\n    case 1:\n        red = rgb_max - rgb_adj;\n        green = rgb_max;\n        blue = rgb_min;\n        break;\n    case 2:\n        red = rgb_min;\n        green = rgb_max;\n        blue = rgb_min + rgb_adj;\n        break;\n    case 3:\n        red = rgb_min;\n        green = rgb_max - rgb_adj;\n        blue = rgb_max;\n        break;\n    case 4:\n        red = rgb_min + rgb_adj;\n        green = rgb_min;\n        blue = rgb_max;\n        break;\n    default:\n        red = rgb_max;\n        green = rgb_min;\n        blue = rgb_max - rgb_adj;\n        break;\n    }\n\n    return strip->set_pixel(strip, index, red, green, blue);\n}\n\nesp_err_t led_strip_set_pixel_rgbw(led_strip_handle_t strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white)\n{\n    ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, \"invalid argument\");\n    return strip->set_pixel_rgbw(strip, index, red, green, blue, white);\n}\n\nesp_err_t led_strip_refresh(led_strip_handle_t strip)\n{\n    ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, \"invalid argument\");\n    return strip->refresh(strip);\n}\n\nesp_err_t led_strip_clear(led_strip_handle_t strip)\n{\n    ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, \"invalid argument\");\n    return strip->clear(strip);\n}\n\nesp_err_t led_strip_del(led_strip_handle_t strip)\n{\n    ESP_RETURN_ON_FALSE(strip, ESP_ERR_INVALID_ARG, TAG, \"invalid argument\");\n    return strip->del(strip);\n}\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/src/led_strip_rmt_dev.c",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#include <stdlib.h>\n#include <string.h>\n#include <sys/cdefs.h>\n#include \"esp_log.h\"\n#include \"esp_check.h\"\n#include \"driver/rmt_tx.h\"\n#include \"led_strip.h\"\n#include \"led_strip_interface.h\"\n#include \"led_strip_rmt_encoder.h\"\n\n#define LED_STRIP_RMT_DEFAULT_RESOLUTION 10000000 // 10MHz resolution\n#define LED_STRIP_RMT_DEFAULT_TRANS_QUEUE_SIZE 4\n// the memory size of each RMT channel, in words (4 bytes)\n#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2\n#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 64\n#else\n#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 48\n#endif\n\nstatic const char *TAG = \"led_strip_rmt\";\n\ntypedef struct {\n    led_strip_t base;\n    rmt_channel_handle_t rmt_chan;\n    rmt_encoder_handle_t strip_encoder;\n    uint32_t strip_len;\n    uint8_t bytes_per_pixel;\n    uint8_t pixel_buf[];\n} led_strip_rmt_obj;\n\nstatic esp_err_t led_strip_rmt_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, \"index out of maximum number of LEDs\");\n    uint32_t start = index * rmt_strip->bytes_per_pixel;\n    // In thr order of GRB, as LED strip like WS2812 sends out pixels in this order\n    rmt_strip->pixel_buf[start + 0] = green & 0xFF;\n    rmt_strip->pixel_buf[start + 1] = red & 0xFF;\n    rmt_strip->pixel_buf[start + 2] = blue & 0xFF;\n    if (rmt_strip->bytes_per_pixel > 3) {\n        rmt_strip->pixel_buf[start + 3] = 0;\n    }\n    return ESP_OK;\n}\n\nstatic esp_err_t led_strip_rmt_set_pixel_rgbw(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, \"index out of maximum number of LEDs\");\n    ESP_RETURN_ON_FALSE(rmt_strip->bytes_per_pixel == 4, ESP_ERR_INVALID_ARG, TAG, \"wrong LED pixel format, expected 4 bytes per pixel\");\n    uint8_t *buf_start = rmt_strip->pixel_buf + index * 4;\n    // SK6812 component order is GRBW\n    *buf_start = green & 0xFF;\n    *++buf_start = red & 0xFF;\n    *++buf_start = blue & 0xFF;\n    *++buf_start = white & 0xFF;\n    return ESP_OK;\n}\n\nstatic esp_err_t led_strip_rmt_refresh(led_strip_t *strip)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    rmt_transmit_config_t tx_conf = {\n        .loop_count = 0,\n    };\n\n    ESP_RETURN_ON_ERROR(rmt_enable(rmt_strip->rmt_chan), TAG, \"enable RMT channel failed\");\n    ESP_RETURN_ON_ERROR(rmt_transmit(rmt_strip->rmt_chan, rmt_strip->strip_encoder, rmt_strip->pixel_buf,\n                                     rmt_strip->strip_len * rmt_strip->bytes_per_pixel, &tx_conf), TAG, \"transmit pixels by RMT failed\");\n    ESP_RETURN_ON_ERROR(rmt_tx_wait_all_done(rmt_strip->rmt_chan, -1), TAG, \"flush RMT channel failed\");\n    ESP_RETURN_ON_ERROR(rmt_disable(rmt_strip->rmt_chan), TAG, \"disable RMT channel failed\");\n    return ESP_OK;\n}\n\nstatic esp_err_t led_strip_rmt_clear(led_strip_t *strip)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    // Write zero to turn off all leds\n    memset(rmt_strip->pixel_buf, 0, rmt_strip->strip_len * rmt_strip->bytes_per_pixel);\n    return led_strip_rmt_refresh(strip);\n}\n\nstatic esp_err_t led_strip_rmt_del(led_strip_t *strip)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    ESP_RETURN_ON_ERROR(rmt_del_channel(rmt_strip->rmt_chan), TAG, \"delete RMT channel failed\");\n    ESP_RETURN_ON_ERROR(rmt_del_encoder(rmt_strip->strip_encoder), TAG, \"delete strip encoder failed\");\n    free(rmt_strip);\n    return ESP_OK;\n}\n\nesp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *rmt_config, led_strip_handle_t *ret_strip)\n{\n    led_strip_rmt_obj *rmt_strip = NULL;\n    esp_err_t ret = ESP_OK;\n    ESP_GOTO_ON_FALSE(led_config && rmt_config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, \"invalid argument\");\n    ESP_GOTO_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, err, TAG, \"invalid led_pixel_format\");\n    uint8_t bytes_per_pixel = 3;\n    if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) {\n        bytes_per_pixel = 4;\n    } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) {\n        bytes_per_pixel = 3;\n    } else {\n        assert(false);\n    }\n    rmt_strip = calloc(1, sizeof(led_strip_rmt_obj) + led_config->max_leds * bytes_per_pixel);\n    ESP_GOTO_ON_FALSE(rmt_strip, ESP_ERR_NO_MEM, err, TAG, \"no mem for rmt strip\");\n    uint32_t resolution = rmt_config->resolution_hz ? rmt_config->resolution_hz : LED_STRIP_RMT_DEFAULT_RESOLUTION;\n\n    // for backward compatibility, if the user does not set the clk_src, use the default value\n    rmt_clock_source_t clk_src = RMT_CLK_SRC_DEFAULT;\n    if (rmt_config->clk_src) {\n        clk_src = rmt_config->clk_src;\n    }\n    size_t mem_block_symbols = LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS;\n    // override the default value if the user sets it\n    if (rmt_config->mem_block_symbols) {\n        mem_block_symbols = rmt_config->mem_block_symbols;\n    }\n    rmt_tx_channel_config_t rmt_chan_config = {\n        .clk_src = clk_src,\n        .gpio_num = led_config->strip_gpio_num,\n        .mem_block_symbols = mem_block_symbols,\n        .resolution_hz = resolution,\n        .trans_queue_depth = LED_STRIP_RMT_DEFAULT_TRANS_QUEUE_SIZE,\n        .flags.with_dma = rmt_config->flags.with_dma,\n        .flags.invert_out = led_config->flags.invert_out,\n    };\n    ESP_GOTO_ON_ERROR(rmt_new_tx_channel(&rmt_chan_config, &rmt_strip->rmt_chan), err, TAG, \"create RMT TX channel failed\");\n\n    led_strip_encoder_config_t strip_encoder_conf = {\n        .resolution = resolution,\n        .led_model = led_config->led_model\n    };\n    ESP_GOTO_ON_ERROR(rmt_new_led_strip_encoder(&strip_encoder_conf, &rmt_strip->strip_encoder), err, TAG, \"create LED strip encoder failed\");\n\n\n    rmt_strip->bytes_per_pixel = bytes_per_pixel;\n    rmt_strip->strip_len = led_config->max_leds;\n    rmt_strip->base.set_pixel = led_strip_rmt_set_pixel;\n    rmt_strip->base.set_pixel_rgbw = led_strip_rmt_set_pixel_rgbw;\n    rmt_strip->base.refresh = led_strip_rmt_refresh;\n    rmt_strip->base.clear = led_strip_rmt_clear;\n    rmt_strip->base.del = led_strip_rmt_del;\n\n    *ret_strip = &rmt_strip->base;\n    return ESP_OK;\nerr:\n    if (rmt_strip) {\n        if (rmt_strip->rmt_chan) {\n            rmt_del_channel(rmt_strip->rmt_chan);\n        }\n        if (rmt_strip->strip_encoder) {\n            rmt_del_encoder(rmt_strip->strip_encoder);\n        }\n        free(rmt_strip);\n    }\n    return ret;\n}\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/src/led_strip_rmt_dev_idf4.c",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#include <stdlib.h>\n#include <string.h>\n#include <sys/cdefs.h>\n#include \"esp_log.h\"\n#include \"esp_check.h\"\n#include \"driver/rmt.h\"\n#include \"led_strip.h\"\n#include \"led_strip_interface.h\"\n\nstatic const char *TAG = \"led_strip_rmt\";\n\n#define WS2812_T0H_NS   (300)\n#define WS2812_T0L_NS   (900)\n#define WS2812_T1H_NS   (900)\n#define WS2812_T1L_NS   (300)\n\n#define SK6812_T0H_NS   (300)\n#define SK6812_T0L_NS   (900)\n#define SK6812_T1H_NS   (600)\n#define SK6812_T1L_NS   (600)\n\n#define LED_STRIP_RESET_MS (10)\n\n// the memory size of each RMT channel, in words (4 bytes)\n#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2\n#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 64\n#else\n#define LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS 48\n#endif\n\nstatic uint32_t led_t0h_ticks = 0;\nstatic uint32_t led_t1h_ticks = 0;\nstatic uint32_t led_t0l_ticks = 0;\nstatic uint32_t led_t1l_ticks = 0;\n\ntypedef struct {\n    led_strip_t base;\n    rmt_channel_t rmt_channel;\n    uint32_t strip_len;\n    uint8_t bytes_per_pixel;\n    uint8_t buffer[0];\n} led_strip_rmt_obj;\n\nstatic void IRAM_ATTR ws2812_rmt_adapter(const void *src, rmt_item32_t *dest, size_t src_size,\n        size_t wanted_num, size_t *translated_size, size_t *item_num)\n{\n    if (src == NULL || dest == NULL) {\n        *translated_size = 0;\n        *item_num = 0;\n        return;\n    }\n    const rmt_item32_t bit0 = {{{ led_t0h_ticks, 1, led_t0l_ticks, 0 }}}; //Logical 0\n    const rmt_item32_t bit1 = {{{ led_t1h_ticks, 1, led_t1l_ticks, 0 }}}; //Logical 1\n    size_t size = 0;\n    size_t num = 0;\n    uint8_t *psrc = (uint8_t *)src;\n    rmt_item32_t *pdest = dest;\n    while (size < src_size && num < wanted_num) {\n        for (int i = 0; i < 8; i++) {\n            // MSB first\n            if (*psrc & (1 << (7 - i))) {\n                pdest->val =  bit1.val;\n            } else {\n                pdest->val =  bit0.val;\n            }\n            num++;\n            pdest++;\n        }\n        size++;\n        psrc++;\n    }\n    *translated_size = size;\n    *item_num = num;\n}\n\nstatic esp_err_t led_strip_rmt_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    ESP_RETURN_ON_FALSE(index < rmt_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, \"index out of the maximum number of leds\");\n    uint32_t start = index * rmt_strip->bytes_per_pixel;\n    // In thr order of GRB\n    rmt_strip->buffer[start + 0] = green & 0xFF;\n    rmt_strip->buffer[start + 1] = red & 0xFF;\n    rmt_strip->buffer[start + 2] = blue & 0xFF;\n    if (rmt_strip->bytes_per_pixel > 3) {\n        rmt_strip->buffer[start + 3] = 0;\n    }\n    return ESP_OK;\n}\n\nstatic esp_err_t led_strip_rmt_refresh(led_strip_t *strip)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    ESP_RETURN_ON_ERROR(rmt_write_sample(rmt_strip->rmt_channel, rmt_strip->buffer, rmt_strip->strip_len * rmt_strip->bytes_per_pixel, true), TAG,\n                        \"transmit RMT samples failed\");\n    vTaskDelay(pdMS_TO_TICKS(LED_STRIP_RESET_MS));\n    return ESP_OK;\n}\n\nstatic esp_err_t led_strip_rmt_clear(led_strip_t *strip)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    // Write zero to turn off all LEDs\n    memset(rmt_strip->buffer, 0, rmt_strip->strip_len * rmt_strip->bytes_per_pixel);\n    return led_strip_rmt_refresh(strip);\n}\n\nstatic esp_err_t led_strip_rmt_del(led_strip_t *strip)\n{\n    led_strip_rmt_obj *rmt_strip = __containerof(strip, led_strip_rmt_obj, base);\n    ESP_RETURN_ON_ERROR(rmt_driver_uninstall(rmt_strip->rmt_channel), TAG, \"uninstall RMT driver failed\");\n    free(rmt_strip);\n    return ESP_OK;\n}\n\nesp_err_t led_strip_new_rmt_device(const led_strip_config_t *led_config, const led_strip_rmt_config_t *dev_config, led_strip_handle_t *ret_strip)\n{\n    led_strip_rmt_obj *rmt_strip = NULL;\n    esp_err_t ret = ESP_OK;\n    ESP_RETURN_ON_FALSE(led_config && dev_config && ret_strip, ESP_ERR_INVALID_ARG, TAG, \"invalid argument\");\n    ESP_RETURN_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, TAG, \"invalid led_pixel_format\");\n    ESP_RETURN_ON_FALSE(dev_config->flags.with_dma == 0, ESP_ERR_NOT_SUPPORTED, TAG, \"DMA is not supported\");\n\n    uint8_t bytes_per_pixel = 3;\n    if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) {\n        bytes_per_pixel = 4;\n    } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) {\n        bytes_per_pixel = 3;\n    } else {\n        assert(false);\n    }\n\n    // allocate memory for led_strip object\n    rmt_strip = calloc(1, sizeof(led_strip_rmt_obj) + led_config->max_leds * bytes_per_pixel);\n    ESP_RETURN_ON_FALSE(rmt_strip, ESP_ERR_NO_MEM, TAG, \"request memory for les_strip failed\");\n\n    // install RMT channel driver\n    rmt_config_t config = RMT_DEFAULT_CONFIG_TX(led_config->strip_gpio_num, dev_config->rmt_channel);\n    // set the minimal clock division because the LED strip needs a high clock resolution\n    config.clk_div = 2;\n\n    uint8_t mem_block_num = 2;\n    // override the default value if the user specify the mem block size\n    if (dev_config->mem_block_symbols) {\n        mem_block_num = (dev_config->mem_block_symbols + LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS / 2) / LED_STRIP_RMT_DEFAULT_MEM_BLOCK_SYMBOLS;\n    }\n    config.mem_block_num = mem_block_num;\n\n    ESP_GOTO_ON_ERROR(rmt_config(&config), err, TAG, \"RMT config failed\");\n    ESP_GOTO_ON_ERROR(rmt_driver_install(config.channel, 0, 0), err, TAG, \"RMT install failed\");\n\n    uint32_t counter_clk_hz = 0;\n    rmt_get_counter_clock((rmt_channel_t)dev_config->rmt_channel, &counter_clk_hz);\n    // ns -> ticks\n    float ratio = (float)counter_clk_hz / 1e9;\n    if (led_config->led_model == LED_MODEL_WS2812) {\n        led_t0h_ticks = (uint32_t)(ratio * WS2812_T0H_NS);\n        led_t0l_ticks = (uint32_t)(ratio * WS2812_T0L_NS);\n        led_t1h_ticks = (uint32_t)(ratio * WS2812_T1H_NS);\n        led_t1l_ticks = (uint32_t)(ratio * WS2812_T1L_NS);\n    } else if (led_config->led_model == LED_MODEL_SK6812) {\n        led_t0h_ticks = (uint32_t)(ratio * SK6812_T0H_NS);\n        led_t0l_ticks = (uint32_t)(ratio * SK6812_T0L_NS);\n        led_t1h_ticks = (uint32_t)(ratio * SK6812_T1H_NS);\n        led_t1l_ticks = (uint32_t)(ratio * SK6812_T1L_NS);\n    } else {\n        assert(false);\n    }\n\n    // adapter to translates the LES strip date frame into RMT symbols\n    rmt_translator_init((rmt_channel_t)dev_config->rmt_channel, ws2812_rmt_adapter);\n\n    rmt_strip->bytes_per_pixel = bytes_per_pixel;\n    rmt_strip->rmt_channel = (rmt_channel_t)dev_config->rmt_channel;\n    rmt_strip->strip_len = led_config->max_leds;\n    rmt_strip->base.set_pixel = led_strip_rmt_set_pixel;\n    rmt_strip->base.refresh = led_strip_rmt_refresh;\n    rmt_strip->base.clear = led_strip_rmt_clear;\n    rmt_strip->base.del = led_strip_rmt_del;\n\n    *ret_strip = &rmt_strip->base;\n    return ESP_OK;\n\nerr:\n    if (rmt_strip) {\n        free(rmt_strip);\n    }\n    return ret;\n}\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/src/led_strip_rmt_encoder.c",
    "content": "/*\n * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#include \"esp_check.h\"\n#include \"led_strip_rmt_encoder.h\"\n\nstatic const char *TAG = \"led_rmt_encoder\";\n\ntypedef struct {\n    rmt_encoder_t base;\n    rmt_encoder_t *bytes_encoder;\n    rmt_encoder_t *copy_encoder;\n    int state;\n    rmt_symbol_word_t reset_code;\n} rmt_led_strip_encoder_t;\n\nstatic size_t rmt_encode_led_strip(rmt_encoder_t *encoder, rmt_channel_handle_t channel, const void *primary_data, size_t data_size, rmt_encode_state_t *ret_state)\n{\n    rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);\n    rmt_encoder_handle_t bytes_encoder = led_encoder->bytes_encoder;\n    rmt_encoder_handle_t copy_encoder = led_encoder->copy_encoder;\n    rmt_encode_state_t session_state = 0;\n    rmt_encode_state_t state = 0;\n    size_t encoded_symbols = 0;\n    switch (led_encoder->state) {\n    case 0: // send RGB data\n        encoded_symbols += bytes_encoder->encode(bytes_encoder, channel, primary_data, data_size, &session_state);\n        if (session_state & RMT_ENCODING_COMPLETE) {\n            led_encoder->state = 1; // switch to next state when current encoding session finished\n        }\n        if (session_state & RMT_ENCODING_MEM_FULL) {\n            state |= RMT_ENCODING_MEM_FULL;\n            goto out; // yield if there's no free space for encoding artifacts\n        }\n    // fall-through\n    case 1: // send reset code\n        encoded_symbols += copy_encoder->encode(copy_encoder, channel, &led_encoder->reset_code,\n                                                sizeof(led_encoder->reset_code), &session_state);\n        if (session_state & RMT_ENCODING_COMPLETE) {\n            led_encoder->state = 0; // back to the initial encoding session\n            state |= RMT_ENCODING_COMPLETE;\n        }\n        if (session_state & RMT_ENCODING_MEM_FULL) {\n            state |= RMT_ENCODING_MEM_FULL;\n            goto out; // yield if there's no free space for encoding artifacts\n        }\n    }\nout:\n    *ret_state = state;\n    return encoded_symbols;\n}\n\nstatic esp_err_t rmt_del_led_strip_encoder(rmt_encoder_t *encoder)\n{\n    rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);\n    rmt_del_encoder(led_encoder->bytes_encoder);\n    rmt_del_encoder(led_encoder->copy_encoder);\n    free(led_encoder);\n    return ESP_OK;\n}\n\nstatic esp_err_t rmt_led_strip_encoder_reset(rmt_encoder_t *encoder)\n{\n    rmt_led_strip_encoder_t *led_encoder = __containerof(encoder, rmt_led_strip_encoder_t, base);\n    rmt_encoder_reset(led_encoder->bytes_encoder);\n    rmt_encoder_reset(led_encoder->copy_encoder);\n    led_encoder->state = 0;\n    return ESP_OK;\n}\n\nesp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder)\n{\n    esp_err_t ret = ESP_OK;\n    rmt_led_strip_encoder_t *led_encoder = NULL;\n    ESP_GOTO_ON_FALSE(config && ret_encoder, ESP_ERR_INVALID_ARG, err, TAG, \"invalid argument\");\n    ESP_GOTO_ON_FALSE(config->led_model < LED_MODEL_INVALID, ESP_ERR_INVALID_ARG, err, TAG, \"invalid led model\");\n    led_encoder = calloc(1, sizeof(rmt_led_strip_encoder_t));\n    ESP_GOTO_ON_FALSE(led_encoder, ESP_ERR_NO_MEM, err, TAG, \"no mem for led strip encoder\");\n    led_encoder->base.encode = rmt_encode_led_strip;\n    led_encoder->base.del = rmt_del_led_strip_encoder;\n    led_encoder->base.reset = rmt_led_strip_encoder_reset;\n    rmt_bytes_encoder_config_t bytes_encoder_config;\n    if (config->led_model == LED_MODEL_SK6812) {\n        bytes_encoder_config = (rmt_bytes_encoder_config_t) {\n            .bit0 = {\n                .level0 = 1,\n                .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us\n                .level1 = 0,\n                .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us\n            },\n            .bit1 = {\n                .level0 = 1,\n                .duration0 = 0.6 * config->resolution / 1000000, // T1H=0.6us\n                .level1 = 0,\n                .duration1 = 0.6 * config->resolution / 1000000, // T1L=0.6us\n            },\n            .flags.msb_first = 1 // SK6812 transfer bit order: G7...G0R7...R0B7...B0(W7...W0)\n        };\n    } else if (config->led_model == LED_MODEL_WS2812) {\n        // different led strip might have its own timing requirements, following parameter is for WS2812\n        bytes_encoder_config = (rmt_bytes_encoder_config_t) {\n            .bit0 = {\n                .level0 = 1,\n                .duration0 = 0.3 * config->resolution / 1000000, // T0H=0.3us\n                .level1 = 0,\n                .duration1 = 0.9 * config->resolution / 1000000, // T0L=0.9us\n            },\n            .bit1 = {\n                .level0 = 1,\n                .duration0 = 0.9 * config->resolution / 1000000, // T1H=0.9us\n                .level1 = 0,\n                .duration1 = 0.3 * config->resolution / 1000000, // T1L=0.3us\n            },\n            .flags.msb_first = 1 // WS2812 transfer bit order: G7...G0R7...R0B7...B0\n        };\n    } else {\n        assert(false);\n    }\n    ESP_GOTO_ON_ERROR(rmt_new_bytes_encoder(&bytes_encoder_config, &led_encoder->bytes_encoder), err, TAG, \"create bytes encoder failed\");\n    rmt_copy_encoder_config_t copy_encoder_config = {};\n    ESP_GOTO_ON_ERROR(rmt_new_copy_encoder(&copy_encoder_config, &led_encoder->copy_encoder), err, TAG, \"create copy encoder failed\");\n\n    uint32_t reset_ticks = config->resolution / 1000000 * 50 / 2; // reset code duration defaults to 50us\n    led_encoder->reset_code = (rmt_symbol_word_t) {\n        .level0 = 0,\n        .duration0 = reset_ticks,\n        .level1 = 0,\n        .duration1 = reset_ticks,\n    };\n    *ret_encoder = &led_encoder->base;\n    return ESP_OK;\nerr:\n    if (led_encoder) {\n        if (led_encoder->bytes_encoder) {\n            rmt_del_encoder(led_encoder->bytes_encoder);\n        }\n        if (led_encoder->copy_encoder) {\n            rmt_del_encoder(led_encoder->copy_encoder);\n        }\n        free(led_encoder);\n    }\n    return ret;\n}\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/src/led_strip_rmt_encoder.h",
    "content": "/*\n * SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#pragma once\n\n#include <stdint.h>\n#include \"driver/rmt_encoder.h\"\n#include \"led_strip_types.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @brief Type of led strip encoder configuration\n */\ntypedef struct {\n    uint32_t resolution;   /*!< Encoder resolution, in Hz */\n    led_model_t led_model; /*!< LED model */\n} led_strip_encoder_config_t;\n\n/**\n * @brief Create RMT encoder for encoding LED strip pixels into RMT symbols\n *\n * @param[in] config Encoder configuration\n * @param[out] ret_encoder Returned encoder handle\n * @return\n *      - ESP_ERR_INVALID_ARG for any invalid arguments\n *      - ESP_ERR_NO_MEM out of memory when creating led strip encoder\n *      - ESP_OK if creating encoder successfully\n */\nesp_err_t rmt_new_led_strip_encoder(const led_strip_encoder_config_t *config, rmt_encoder_handle_t *ret_encoder);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/espressif/components/led_strip/src/led_strip_spi_dev.c",
    "content": "/*\n * SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD\n *\n * SPDX-License-Identifier: Apache-2.0\n */\n#include <stdlib.h>\n#include <string.h>\n#include <sys/cdefs.h>\n#include \"esp_log.h\"\n#include \"esp_check.h\"\n#include \"esp_rom_gpio.h\"\n#include \"soc/spi_periph.h\"\n#include \"led_strip.h\"\n#include \"led_strip_interface.h\"\n#include \"hal/spi_hal.h\"\n\n#define LED_STRIP_SPI_DEFAULT_RESOLUTION (2.5 * 1000 * 1000) // 2.5MHz resolution\n#define LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE 4\n\n#define SPI_BYTES_PER_COLOR_BYTE 3\n#define SPI_BITS_PER_COLOR_BYTE (SPI_BYTES_PER_COLOR_BYTE * 8)\n\nstatic const char *TAG = \"led_strip_spi\";\n\ntypedef struct {\n    led_strip_t base;\n    spi_host_device_t spi_host;\n    spi_device_handle_t spi_device;\n    uint32_t strip_len;\n    uint8_t bytes_per_pixel;\n    uint8_t pixel_buf[];\n} led_strip_spi_obj;\n\n// please make sure to zero-initialize the buf before calling this function\nstatic void __led_strip_spi_bit(uint8_t data, uint8_t *buf)\n{\n    // Each color of 1 bit is represented by 3 bits of SPI, low_level:100 ,high_level:110\n    // So a color byte occupies 3 bytes of SPI.\n    *(buf + 2) |= data & BIT(0) ? BIT(2) | BIT(1) : BIT(2);\n    *(buf + 2) |= data & BIT(1) ? BIT(5) | BIT(4) : BIT(5);\n    *(buf + 2) |= data & BIT(2) ? BIT(7) : 0x00;\n    *(buf + 1) |= BIT(0);\n    *(buf + 1) |= data & BIT(3) ? BIT(3) | BIT(2) : BIT(3);\n    *(buf + 1) |= data & BIT(4) ? BIT(6) | BIT(5) : BIT(6);\n    *(buf + 0) |= data & BIT(5) ? BIT(1) | BIT(0) : BIT(1);\n    *(buf + 0) |= data & BIT(6) ? BIT(4) | BIT(3) : BIT(4);\n    *(buf + 0) |= data & BIT(7) ? BIT(7) | BIT(6) : BIT(7);\n}\n\nstatic esp_err_t led_strip_spi_set_pixel(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue)\n{\n    led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base);\n    ESP_RETURN_ON_FALSE(index < spi_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, \"index out of maximum number of LEDs\");\n    // LED_PIXEL_FORMAT_GRB takes 72bits(9bytes)\n    uint32_t start = index * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE;\n    memset(spi_strip->pixel_buf + start, 0, spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE);\n    __led_strip_spi_bit(green, &spi_strip->pixel_buf[start]);\n    __led_strip_spi_bit(red, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE]);\n    __led_strip_spi_bit(blue, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 2]);\n    if (spi_strip->bytes_per_pixel > 3) {\n        __led_strip_spi_bit(0, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 3]);\n    }\n    return ESP_OK;\n}\n\nstatic esp_err_t led_strip_spi_set_pixel_rgbw(led_strip_t *strip, uint32_t index, uint32_t red, uint32_t green, uint32_t blue, uint32_t white)\n{\n    led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base);\n    ESP_RETURN_ON_FALSE(index < spi_strip->strip_len, ESP_ERR_INVALID_ARG, TAG, \"index out of maximum number of LEDs\");\n    ESP_RETURN_ON_FALSE(spi_strip->bytes_per_pixel == 4, ESP_ERR_INVALID_ARG, TAG, \"wrong LED pixel format, expected 4 bytes per pixel\");\n    // LED_PIXEL_FORMAT_GRBW takes 96bits(12bytes)\n    uint32_t start = index * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE;\n    // SK6812 component order is GRBW\n    memset(spi_strip->pixel_buf + start, 0, spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE);\n    __led_strip_spi_bit(green, &spi_strip->pixel_buf[start]);\n    __led_strip_spi_bit(red, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE]);\n    __led_strip_spi_bit(blue, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 2]);\n    __led_strip_spi_bit(white, &spi_strip->pixel_buf[start + SPI_BYTES_PER_COLOR_BYTE * 3]);\n\n    return ESP_OK;\n}\n\nstatic esp_err_t led_strip_spi_refresh(led_strip_t *strip)\n{\n    led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base);\n    spi_transaction_t tx_conf;\n    memset(&tx_conf, 0, sizeof(tx_conf));\n\n    tx_conf.length = spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BITS_PER_COLOR_BYTE;\n    tx_conf.tx_buffer = spi_strip->pixel_buf;\n    tx_conf.rx_buffer = NULL;\n    ESP_RETURN_ON_ERROR(spi_device_transmit(spi_strip->spi_device, &tx_conf), TAG, \"transmit pixels by SPI failed\");\n\n    return ESP_OK;\n}\n\nstatic esp_err_t led_strip_spi_clear(led_strip_t *strip)\n{\n    led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base);\n    //Write zero to turn off all leds\n    memset(spi_strip->pixel_buf, 0, spi_strip->strip_len * spi_strip->bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE);\n    uint8_t *buf = spi_strip->pixel_buf;\n    for (int index = 0; index < spi_strip->strip_len * spi_strip->bytes_per_pixel; index++) {\n        __led_strip_spi_bit(0, buf);\n        buf += SPI_BYTES_PER_COLOR_BYTE;\n    }\n\n    return led_strip_spi_refresh(strip);\n}\n\nstatic esp_err_t led_strip_spi_del(led_strip_t *strip)\n{\n    led_strip_spi_obj *spi_strip = __containerof(strip, led_strip_spi_obj, base);\n\n    ESP_RETURN_ON_ERROR(spi_bus_remove_device(spi_strip->spi_device), TAG, \"delete spi device failed\");\n    ESP_RETURN_ON_ERROR(spi_bus_free(spi_strip->spi_host), TAG, \"free spi bus failed\");\n\n    free(spi_strip);\n    return ESP_OK;\n}\n\nesp_err_t led_strip_new_spi_device(const led_strip_config_t *led_config, const led_strip_spi_config_t *spi_config, led_strip_handle_t *ret_strip)\n{\n    led_strip_spi_obj *spi_strip = NULL;\n    esp_err_t ret = ESP_OK;\n    ESP_GOTO_ON_FALSE(led_config && spi_config && ret_strip, ESP_ERR_INVALID_ARG, err, TAG, \"invalid argument\");\n    ESP_GOTO_ON_FALSE(led_config->led_pixel_format < LED_PIXEL_FORMAT_INVALID, ESP_ERR_INVALID_ARG, err, TAG, \"invalid led_pixel_format\");\n    uint8_t bytes_per_pixel = 3;\n    if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRBW) {\n        bytes_per_pixel = 4;\n    } else if (led_config->led_pixel_format == LED_PIXEL_FORMAT_GRB) {\n        bytes_per_pixel = 3;\n    } else {\n        assert(false);\n    }\n    uint32_t mem_caps = MALLOC_CAP_DEFAULT;\n    if (spi_config->flags.with_dma) {\n        // DMA buffer must be placed in internal SRAM\n        mem_caps |= MALLOC_CAP_INTERNAL | MALLOC_CAP_DMA;\n    }\n    spi_strip = heap_caps_calloc(1, sizeof(led_strip_spi_obj) + led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE, mem_caps);\n\n    ESP_GOTO_ON_FALSE(spi_strip, ESP_ERR_NO_MEM, err, TAG, \"no mem for spi strip\");\n\n    spi_strip->spi_host = spi_config->spi_bus;\n    // for backward compatibility, if the user does not set the clk_src, use the default value\n    spi_clock_source_t clk_src = SPI_CLK_SRC_DEFAULT;\n    if (spi_config->clk_src) {\n        clk_src = spi_config->clk_src;\n    }\n\n    spi_bus_config_t spi_bus_cfg = {\n        .mosi_io_num = led_config->strip_gpio_num,\n        //Only use MOSI to generate the signal, set -1 when other pins are not used.\n        .miso_io_num = -1,\n        .sclk_io_num = -1,\n        .quadwp_io_num = -1,\n        .quadhd_io_num = -1,\n        .max_transfer_sz = led_config->max_leds * bytes_per_pixel * SPI_BYTES_PER_COLOR_BYTE,\n    };\n    ESP_GOTO_ON_ERROR(spi_bus_initialize(spi_strip->spi_host, &spi_bus_cfg, spi_config->flags.with_dma ? SPI_DMA_CH_AUTO : SPI_DMA_DISABLED), err, TAG, \"create SPI bus failed\");\n\n    if (led_config->flags.invert_out == true) {\n        esp_rom_gpio_connect_out_signal(led_config->strip_gpio_num, spi_periph_signal[spi_strip->spi_host].spid_out, true, false);\n    }\n\n    spi_device_interface_config_t spi_dev_cfg = {\n        .clock_source = clk_src,\n        .command_bits = 0,\n        .address_bits = 0,\n        .dummy_bits = 0,\n        .clock_speed_hz = LED_STRIP_SPI_DEFAULT_RESOLUTION,\n        .mode = 0,\n        //set -1 when CS is not used\n        .spics_io_num = -1,\n        .queue_size = LED_STRIP_SPI_DEFAULT_TRANS_QUEUE_SIZE,\n    };\n\n    ESP_GOTO_ON_ERROR(spi_bus_add_device(spi_strip->spi_host, &spi_dev_cfg, &spi_strip->spi_device), err, TAG, \"Failed to add spi device\");\n\n    int clock_resolution_khz = 0;\n    spi_device_get_actual_freq(spi_strip->spi_device, &clock_resolution_khz);\n    // TODO: ideally we should decide the SPI_BYTES_PER_COLOR_BYTE by the real clock resolution\n    // But now, let's fixed the resolution, the downside is, we don't support a clock source whose frequency is not multiple of LED_STRIP_SPI_DEFAULT_RESOLUTION\n    ESP_GOTO_ON_FALSE(clock_resolution_khz == LED_STRIP_SPI_DEFAULT_RESOLUTION / 1000, ESP_ERR_NOT_SUPPORTED, err,\n                      TAG, \"unsupported clock resolution:%dKHz\", clock_resolution_khz);\n\n    spi_strip->bytes_per_pixel = bytes_per_pixel;\n    spi_strip->strip_len = led_config->max_leds;\n    spi_strip->base.set_pixel = led_strip_spi_set_pixel;\n    spi_strip->base.set_pixel_rgbw = led_strip_spi_set_pixel_rgbw;\n    spi_strip->base.refresh = led_strip_spi_refresh;\n    spi_strip->base.clear = led_strip_spi_clear;\n    spi_strip->base.del = led_strip_spi_del;\n\n    *ret_strip = &spi_strip->base;\n    return ESP_OK;\nerr:\n    if (spi_strip) {\n        if (spi_strip->spi_device) {\n            spi_bus_remove_device(spi_strip->spi_device);\n        }\n        if (spi_strip->spi_host) {\n            spi_bus_free(spi_strip->spi_host);\n        }\n        free(spi_strip);\n    }\n    return ret;\n}\n"
  },
  {
    "path": "hw/bsp/espressif/components/tinyusb_src/CMakeLists.txt",
    "content": "idf_build_get_property(target IDF_TARGET)\ninclude(CMakePrintHelpers)\n\nset(tusb_src ${CMAKE_CURRENT_LIST_DIR}/../../../../../src)\nget_filename_component(tusb_src ${tusb_src} ABSOLUTE)\ninclude(${tusb_src}/CMakeLists.txt)\n\nstring(TOUPPER OPT_MCU_${target} tusb_mcu)\nset(compile_definitions\n  CFG_TUSB_MCU=${tusb_mcu}\n  CFG_TUSB_OS=OPT_OS_FREERTOS\n  BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n  BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n  BOARD_TUH_RHPORT=${RHPORT_HOST}\n  BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n  )\n\nif (target STREQUAL esp32p4)\n  # P4 change alignment to 64 (DCache line size) for possible DMA configuration\n  list(APPEND compile_definitions\n    CFG_TUD_MEM_ALIGN=__attribute__\\(\\(aligned\\(64\\)\\)\\)\n    CFG_TUH_MEM_ALIGN=__attribute__\\(\\(aligned\\(64\\)\\)\\)\n    )\nendif ()\n\ntinyusb_sources_get(srcs)\nlist(APPEND srcs\n  ${tusb_src}/portable/synopsys/dwc2/dcd_dwc2.c\n  ${tusb_src}/portable/synopsys/dwc2/hcd_dwc2.c\n  ${tusb_src}/portable/synopsys/dwc2/dwc2_common.c\n  )\n\n# use max3421 as host controller\nif (MAX3421_HOST STREQUAL \"1\")\n  list(APPEND srcs ${tusb_src}/portable/analog/max3421/hcd_max3421.c)\n  list(APPEND compile_definitions CFG_TUH_MAX3421=1)\nendif ()\n\nif (DEFINED LOG)\n  list(APPEND compile_definitions CFG_TUSB_DEBUG=${LOG})\n  if (LOG STREQUAL \"4\")\n    # no inline for debug level 4\n    list(APPEND compile_definitions TU_ATTR_ALWAYS_INLINE=)\n  endif ()\nendif()\n\nif(DEFINED CFLAGS_CLI)\n  separate_arguments(CFLAGS_CLI)\n  list(APPEND compile_definitions ${CFLAGS_CLI})\nendif()\n\nidf_component_register(SRCS ${srcs}\n  INCLUDE_DIRS ${tusb_src}\n  REQUIRES src\n  PRIV_REQUIRES esp_mm\n  )\n\ntarget_compile_definitions(${COMPONENT_LIB} PUBLIC ${compile_definitions})\n"
  },
  {
    "path": "hw/bsp/espressif/family.cmake",
    "content": "# Apply board specific content i.e IDF_TARGET must be set before project.cmake is included\ninclude(\"${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake\")\nstring(TOUPPER ${IDF_TARGET} FAMILY_MCUS)\n\n# Device port default to Port1 for P4 (highspeed), Port0 for others (fullspeed)\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\nif (NOT DEFINED RHPORT_DEVICE)\n  if (IDF_TARGET STREQUAL \"esp32p4\")\n    set(RHPORT_DEVICE 1)\n  else ()\n    set(RHPORT_DEVICE 0)\n  endif ()\nendif()\n\nif (NOT DEFINED RHPORT_HOST)\n  if (IDF_TARGET STREQUAL \"esp32p4\")\n    set(RHPORT_HOST 1)\n  else ()\n    set(RHPORT_HOST 0)\n  endif ()\nendif()\n\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\n# Add example src and bsp directories\nset(EXTRA_COMPONENT_DIRS \"src\" \"${CMAKE_CURRENT_LIST_DIR}/boards\" \"${CMAKE_CURRENT_LIST_DIR}/components\")\nset(SDKCONFIG ${CMAKE_BINARY_DIR}/sdkconfig)\n\ninclude($ENV{IDF_PATH}/tools/cmake/project.cmake)\n"
  },
  {
    "path": "hw/bsp/f1c100s/README.md",
    "content": "# BSP support for F1Cx00s boards\n\nThis folder contains necessary file and scripts to run TinyUSB examples on F1Cx00s boards.\n\nCurrently tested on:\n\n- Lichee Pi Nano (F1C100s)\n- [Widora Tiny200 v2 (also called MangoPi-R3c)](https://mangopi.org/tiny200)\n\n## Flashing\n\nThere are two options to put your code into the MCU: `flash` and `exec`. Both modes require you to install [xfel](https://github.com/xboot/xfel) tool to your PATH. You must enter FEL mode before any operation can be done. To enter FEL mode, press BOOT button, then press RESET once, and release BOOT button. You will find VID/PID=1f3a:efe8 on your PC.\n\nExec: `make BOARD=f1c100s exec` will just upload the image to the DDR ram and execute it. It will not touch anything in the SPI flash.\n\nFlash: `make BOARD=f1c100s flash` will write the image to SPI flash, and then reset the chip to execute it.\n\n## TODO\n\n* Add F1C100s to `#if CFG_TUSB_MCU == OPT_MCU_LPC43XX || CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_MIMXRT1XXX` high speed MCU check in examples (maybe we should extract the logic?)\n"
  },
  {
    "path": "hw/bsp/f1c100s/boards/f1c100s/board.cmake",
    "content": "function(update_board TARGET)\n  # nothing to do\nendfunction()\n"
  },
  {
    "path": "hw/bsp/f1c100s/boards/f1c100s/board.h",
    "content": "/* metadata:\n   name: Lctech Pi F1C200s\n   url: https://linux-sunxi.org/Lctech_Pi_F1C200s\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n// Nothing valuable here\n\n#endif\n"
  },
  {
    "path": "hw/bsp/f1c100s/boards/f1c100s/board.mk",
    "content": "# nothing to do\n"
  },
  {
    "path": "hw/bsp/f1c100s/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Sunxi\n*/\n\n#include <stdint.h>\n#include <malloc.h>\n#include <irqflags.h>\n#include <f1c100s-irq.h>\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\nextern void sys_uart_putc(char c);\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nstatic void timer_init(void);\n\nvoid board_init(void) {\n  arch_local_irq_disable();\n  do_init_mem_pool();\n  f1c100s_intc_init();\n  timer_init();\n  printf(\"Timer INIT done\\n\");\n  arch_local_irq_enable();\n}\n\n// No LED, no button\nvoid board_led_write(bool state) {\n  (void) state;\n}\n\nuint32_t board_button_read(void) {\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  int txsize = len;\n  while (txsize--) {\n    sys_uart_putc(*(uint8_t const*) buf);\n    buf++;\n  }\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\nstatic void timer_handler(void) {\n  volatile uint32_t* temp_addr = (uint32_t*) (0x01C20C00 + 0x04);\n\n  /* clear timer */\n  *temp_addr |= 0x01;\n\n  system_ticks++;\n}\n\nstatic void timer_init(void) {\n  uint32_t temp;\n  volatile uint32_t* temp_addr;\n\n  /* reload value */\n  temp = 12000000 / 1000;\n  temp_addr = (uint32_t*) (0x01C20C00 + 0x14);\n  *temp_addr = temp;\n\n  /* continuous | /2 | 24Mhz |  reload*/\n  temp = (0x00 << 7) | (0x01 << 4) | (0x01 << 2) | (0x00 << 1);\n  temp_addr = (uint32_t*) (0x01C20C00 + 0x10);\n  *temp_addr &= 0xffffff00;\n  *temp_addr |= temp;\n\n  /* open timer irq */\n  temp = 0x01 << 0;\n  temp_addr = (uint32_t*) (0x01C20C00);\n  *temp_addr |= temp;\n\n  /* set init value */\n  temp_addr = (uint32_t*) (0x01C20C00 + 0x18);\n  *temp_addr = 0;\n\n  /* begin run timer */\n  temp = 0x01 << 0;\n  temp_addr = (uint32_t*) (0x01C20C00 + 0x10);\n  *temp_addr |= temp;\n\n  f1c100s_intc_set_isr(F1C100S_IRQ_TIMER0, timer_handler);\n  f1c100s_intc_enable_irq(F1C100S_IRQ_TIMER0);\n}\n\n#else\nstatic void timer_init(void) { }\n#endif\n"
  },
  {
    "path": "hw/bsp/f1c100s/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/allwinner/f1c100s)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU arm926ej-s CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS F1C100S CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${SDK_DIR}/f1c100s.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED STARTUP_FILE_GNU)\nset(STARTUP_FILE_GNU ${SDK_DIR}/machine/start.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/lib/malloc.c\n    ${SDK_DIR}/lib/printf.c\n    ${SDK_DIR}/lib/memcpy.S\n    ${SDK_DIR}/lib/memset.S\n    ${SDK_DIR}/machine/sys-uart.c\n    ${SDK_DIR}/machine/exception.c\n    ${SDK_DIR}/machine/sys-clock.c\n    ${SDK_DIR}/machine/sys-copyself.c\n    ${SDK_DIR}/machine/sys-dram.c\n    ${SDK_DIR}/machine/sys-mmu.c\n    ${SDK_DIR}/machine/sys-spi-flash.c\n    ${SDK_DIR}/machine/f1c100s-intc.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __ARM32_ARCH__=5\n    __ARM926EJS__\n    )\n  target_compile_options(${BOARD_TARGET} PUBLIC\n    -ffreestanding\n    -std=gnu99\n    -mno-thumb-interwork\n    -Wno-float-equal\n    -Wno-unused-parameter\n    -Wno-error=array-bounds\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_F1C100S)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/sunxi/dcd_sunxi_musb.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_libraries(${TARGET} PUBLIC\n      gcc\n      )\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      \"LINKER:--defsym=__bss_end__=__bss_end\"\n      \"LINKER:--defsym=__bss_start__=__bss_start\"\n      \"LINKER:--defsym=end=__bss_end\"\n      --specs=nosys.specs --specs=nano.specs\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/f1c100s/family.mk",
    "content": "SDK_DIR = hw/mcu/allwinner/f1c100s\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= arm926ej-s\n\n#CFLAGS += \\\n#  -march=armv5te \\\n#  -mtune=arm926ej-s \\\n#  -mfloat-abi=soft \\\n#  -marm \\\n\nCFLAGS += \\\n  -ffreestanding \\\n  -std=gnu99 \\\n  -mno-thumb-interwork \\\n  -D__ARM32_ARCH__=5 \\\n  -D__ARM926EJS__ \\\n  -Wno-float-equal \\\n  -Wno-unused-parameter \\\n  -DCFG_TUSB_MCU=OPT_MCU_F1C100S \\\n  -Wno-error=array-bounds \\\n\nLD_FILE = ${SDK_DIR}/f1c100s.ld\n\n# TODO may skip nanolib\nLDFLAGS += \\\n  -nostdlib -lgcc \\\n  --specs=nosys.specs --specs=nano.specs \\\n\nSRC_C += \\\n\tsrc/portable/sunxi/dcd_sunxi_musb.c \\\n\t${SDK_DIR}/machine/sys-uart.c \\\n\t${SDK_DIR}/machine/exception.c \\\n\t${SDK_DIR}/machine/sys-clock.c \\\n\t${SDK_DIR}/machine/sys-copyself.c \\\n\t${SDK_DIR}/machine/sys-dram.c \\\n\t${SDK_DIR}/machine/sys-mmu.c \\\n\t${SDK_DIR}/machine/sys-spi-flash.c \\\n\t${SDK_DIR}/machine/f1c100s-intc.c \\\n\t${SDK_DIR}/lib/malloc.c \\\n\t${SDK_DIR}/lib/printf.c\n\nSRC_S += \\\n  ${SDK_DIR}/machine/start.S \\\n\t${SDK_DIR}/lib/memcpy.S \\\n\t${SDK_DIR}/lib/memset.S\n\nINC += \\\n\t$(TOP)/${SDK_DIR}/include \\\n\t$(TOP)/$(BOARD_PATH)\n\n# flash target using xfel\nflash: flash-xfel\n\nexec: $(BUILD)/$(PROJECT).bin\n\txfel ddr\n\txfel write 0x80000000 $<\n\txfel exec 0x80000000\n"
  },
  {
    "path": "hw/bsp/family_rules.mk",
    "content": "# ---------------------------------------\n# Common make rules for all examples\n# ---------------------------------------\n\n# Set all as default goal\n.DEFAULT_GOAL := all\n\n# ---------------- GNU Make Start -----------------------\n# ESP32-Sx and RP2040 has its own CMake build system\nifeq (,$(findstring $(FAMILY),espressif rp2040))\n\n# ---------------------------------------\n# Rules\n# ---------------------------------------\n\nall: $(BUILD)/$(PROJECT).bin $(BUILD)/$(PROJECT).hex size\n\nuf2: $(BUILD)/$(PROJECT).uf2\n\n# We set vpath to point to the top of the tree so that the source files\n# can be located. By following this scheme, it allows a single build rule\n# to be used to compile all .c files.\nvpath %.c . $(TOP)\nvpath %.s . $(TOP)\nvpath %.S . $(TOP)\n\ninclude ${TOP}/examples/build_system/make/toolchain/$(TOOLCHAIN)_rules.mk\n\n# ---------------------------------------\n# Compiler Flags\n# ---------------------------------------\n\nCFLAGS += $(addprefix -I,$(INC))\n\n# Verbose mode\nifeq (\"$(V)\",\"1\")\n$(info CFLAGS  $(CFLAGS) ) $(info )\n$(info LDFLAGS $(LDFLAGS)) $(info )\n$(info ASFLAGS $(ASFLAGS)) $(info )\nendif\n\n\nOBJ_DIRS = $(sort $(dir $(OBJ)))\n$(OBJ): | $(OBJ_DIRS)\n$(OBJ_DIRS):\nifeq ($(CMDEXE),1)\n\t-@$(MKDIR) $(subst /,\\,$@)\nelse\n\t@$(MKDIR) -p $@\nendif\n\n# UF2 generation, iMXRT need to strip to text only before conversion\nifneq ($(FAMILY),imxrt)\n$(BUILD)/$(PROJECT).uf2: $(BUILD)/$(PROJECT).hex\n\t@echo CREATE $@\n\t$(PYTHON) $(TOP)/tools/uf2/utils/uf2conv.py -f $(UF2_FAMILY_ID) -c -o $@ $^\nendif\n\ncopy-artifact: $(BUILD)/$(PROJECT).bin $(BUILD)/$(PROJECT).hex $(BUILD)/$(PROJECT).uf2\n\nendif\n# ---------------- GNU Make End -----------------------\n\n.PHONY: clean\nclean:\nifeq ($(CMDEXE),1)\n\trd /S /Q $(subst /,\\,$(BUILD))\nelse\n\t$(RM) -rf $(BUILD)\nendif\n\n# get depenecies\n.PHONY: get-deps\nget-deps:\n\t$(PYTHON) $(TOP)/tools/get_deps.py ${FAMILY}\n\n.PHONY: size\nsize: $(BUILD)/$(PROJECT).elf\n\t-@echo ''\n\t@$(SIZE) $<\n\t-@echo ''\n\n# linkermap must be install previously at https://github.com/hathach/linkermap\nlinkermap: $(BUILD)/$(PROJECT).elf\n\t@linkermap -v $<.map\n\n# ---------------------------------------\n# Flash Targets\n# ---------------------------------------\n\n# --------------- Jlink -----------------\nifeq ($(OS),Windows_NT)\n  JLINKEXE = JLink.exe\nelse\n  JLINKEXE = JLinkExe\nendif\n\n# Jlink Interface\nJLINK_IF ?= swd\n\n# Jlink script\n$(BUILD)/$(BOARD).jlink: $(BUILD)/$(PROJECT).hex\n\t@echo halt > $@\n\t@echo loadfile $^ >> $@\n\t@echo r >> $@\n\t@echo go >> $@\n\t@echo exit >> $@\n\n# Flash using jlink\nflash-jlink: $(BUILD)/$(BOARD).jlink\n\t$(JLINKEXE) -device $(JLINK_DEVICE) -if $(JLINK_IF) -JTAGConf -1,-1 -speed auto -CommandFile $<\n\n# --------------- stm32 cube programmer -----------------\n# Flash STM32 MCU using stlink with STM32 Cube Programmer CLI\nflash-stlink: $(BUILD)/$(PROJECT).elf\n\tSTM32_Programmer_CLI --connect port=swd --write $< --go\n\n# --------------- xfel -----------------\n$(BUILD)/$(PROJECT)-sunxi.bin: $(BUILD)/$(PROJECT).bin\n\t$(PYTHON) $(TOP)/tools/mksunxi.py $< $@\n\nflash-xfel: $(BUILD)/$(PROJECT)-sunxi.bin\n\txfel spinor write 0 $<\n\txfel reset\n\n# --------------- pyocd -----------------\nPYOCD_OPTION ?=\nflash-pyocd: $(BUILD)/$(PROJECT).hex\n\tpyocd flash -t $(PYOCD_TARGET) $(PYOCD_OPTION) $<\n\t#pyocd reset -t $(PYOCD_TARGET)\n\n# --------------- openocd -----------------\nOPENOCD_OPTION ?=\nflash-openocd: $(BUILD)/$(PROJECT).elf\n\topenocd $(OPENOCD_OPTION) -c \"program $< verify reset exit\"\n\n# --------------- openocd-wch -----------------\n# wch-linke is not supported yet in official openOCD yet. We need to either use\n# 1. download openocd as part of mounriver studio http://www.mounriver.com/download or\n# 2. compiled from https://github.com/hathach/riscv-openocd-wch or\n#    https://github.com/dragonlock2/miscboards/blob/main/wch/SDK/riscv-openocd.tar.xz\n#    with  ./configure --disable-werror --enable-wlinke --enable-ch347=no\nOPENOCD_WCH ?= /home/${USER}/app/riscv-openocd-wch/src/openocd\nOPENOCD_WCH_OPTION ?=\nflash-openocd-wch: $(BUILD)/$(PROJECT).elf\n\t$(OPENOCD_WCH) $(OPENOCD_WCH_OPTION) -c init -c halt -c \"flash write_image $<\" -c reset -c exit\n\n# --------------- wlink-rs -----------------\n# flash with https://github.com/ch32-rs/wlink\nWLINK_RS ?= wlink\nflash-wlink-rs: $(BUILD)/$(PROJECT).elf\n\t$(WLINK_RS) flash $<\n\n# --------------- dfu-util -----------------\nDFU_UTIL_OPTION ?= -a 0\nflash-dfu-util: $(BUILD)/$(PROJECT).bin\n\tdfu-util -R $(DFU_UTIL_OPTION) -D $<\n\n# --------------- Black Magic -----------------\n# This symlink is created by https://github.com/blacksphere/blackmagic/blob/master/driver/99-blackmagic.rules\nBMP ?= /dev/ttyBmpGdb\n\nflash-bmp: $(BUILD)/$(PROJECT).elf\n\t$(GDB) --batch -ex 'target extended-remote $(BMP)' -ex 'monitor swdp_scan' -ex 'attach 1' -ex load  $<\n\ndebug-bmp: $(BUILD)/$(PROJECT).elf\n\t$(GDB) -ex 'target extended-remote $(BMP)' -ex 'monitor swdp_scan' -ex 'attach 1' $<\n\n# --------------- TI Uniflash -----------------\nDSLITE ?= dslite.sh\nflash-uniflash: $(BUILD)/$(PROJECT).hex\n\t${DSLITE} ${UNIFLASH_OPTION} -f $<\n\n# Print out the value of a make variable.\n# https://stackoverflow.com/questions/16467718/how-to-print-out-a-variable-in-makefile\nprint-%:\n\t@echo $* = $($*)\n"
  },
  {
    "path": "hw/bsp/family_support.cmake",
    "content": "include_guard(GLOBAL)\n\ninclude(CMakePrintHelpers)\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n#set(CMAKE_C_STANDARD 11)\n\n# TOP is path to root directory\nset(TOP \"${CMAKE_CURRENT_LIST_DIR}/../..\")\nget_filename_component(TOP ${TOP} ABSOLUTE)\n\nset(UF2CONV_PY ${TOP}/tools/uf2/utils/uf2conv.py)\nset(LINKERMAP_PY ${TOP}/tools/linkermap/linkermap.py)\nset(METRICS_PY ${TOP}/tools/metrics.py)\n\nfunction(family_resolve_board BOARD_NAME BOARD_PATH_OUT)\n  if (\"${BOARD_NAME}\" STREQUAL \"\")\n    message(FATAL_ERROR \"You must set BOARD (e.g. metro_m4_express, raspberry_pi_pico). Use -DBOARD=xxx on the cmake command line.\")\n  endif()\n\n  file(GLOB _board_paths\n    LIST_DIRECTORIES true\n    RELATIVE ${TOP}/hw/bsp\n    ${TOP}/hw/bsp/*/boards/*\n    )\n\n  set(_hint_names \"\")\n  foreach(_board_path ${_board_paths})\n    get_filename_component(_board_name ${_board_path} NAME)\n    if (_board_name STREQUAL \"${BOARD_NAME}\")\n      set(${BOARD_PATH_OUT} ${_board_path} PARENT_SCOPE)\n      return()\n    endif()\n    string(FIND \"${_board_name}\" \"${BOARD_NAME}\" _pos)\n    if (_pos EQUAL 0)\n      list(APPEND _hint_names ${_board_name})\n    endif()\n  endforeach()\n\n  if (_hint_names)\n    list(REMOVE_DUPLICATES _hint_names)\n    list(SORT _hint_names)\n    list(JOIN _hint_names \", \" _hint_str)\n    message(FATAL_ERROR \"BOARD '${BOARD_NAME}' not found. Boards with the same prefix:\\n${_hint_str}\")\n  else()\n    message(FATAL_ERROR \"BOARD '${BOARD_NAME}' not found under hw/bsp/*/boards\")\n  endif()\nendfunction()\n\n#-------------------------------------------------------------\n# Toolchain\n# Can be changed via -DTOOLCHAIN=gcc|iar or -DCMAKE_C_COMPILER= or ENV{CC}=\n#-------------------------------------------------------------\nfunction(detect_compiler COMPILER_PATH RESULT)\n  string(FIND ${COMPILER_PATH} \"iccarm\" IS_IAR)\n  string(FIND ${COMPILER_PATH} \"clang\" IS_CLANG)\n  string(FIND ${COMPILER_PATH} \"gcc\" IS_GCC)\n\n  if (NOT IS_IAR EQUAL -1)\n    set(${RESULT} iar PARENT_SCOPE)\n  elseif (NOT IS_CLANG EQUAL -1)\n    set(${RESULT} clang PARENT_SCOPE)\n  elseif (NOT IS_GCC EQUAL -1)\n    set(${RESULT} gcc PARENT_SCOPE)\n  endif ()\nendfunction()\n\n# Detect toolchain based on CMAKE_C_COMPILER or ENV{CC}\nif (DEFINED CMAKE_C_COMPILER)\n  detect_compiler(${CMAKE_C_COMPILER} TOOLCHAIN)\nelseif (DEFINED ENV{CC})\n  detect_compiler($ENV{CC} TOOLCHAIN)\nendif ()\n\nif (NOT DEFINED TOOLCHAIN)\n  set(TOOLCHAIN gcc)\nendif ()\n\nset(WARN_FLAGS_GNU\n  -Wall\n  -Wextra\n  -Werror\n  -Wfatal-errors\n  -Wdouble-promotion\n  -Wstrict-prototypes\n  -Wstrict-overflow\n  -Werror-implicit-function-declaration\n  -Wfloat-equal\n  -Wundef\n  -Wshadow\n  -Wwrite-strings\n  -Wsign-compare\n  -Wmissing-format-attribute\n  -Wunreachable-code\n  -Wcast-align\n  -Wcast-function-type\n  -Wcast-qual\n  -Wnull-dereference\n  -Wuninitialized\n  -Wunused\n  -Wunused-function\n  -Wreturn-type\n  -Wredundant-decls\n  -Wmissing-prototypes\n#  -Wconversion\n  )\nset(WARN_FLAGS_Clang ${WARN_FLAGS_GNU})\n\nset(WARN_FLAGS_IAR\n  --warnings_are_errors\n  --diag_suppress=Pa089\n  --diag_suppress=Pe236\n  )\n\n# Optimization\nif (NOT DEFINED CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL \"\")\n  set(CMAKE_BUILD_TYPE MinSizeRel CACHE STRING \"Build type\" FORCE)\nendif ()\n\n#-------------------------------------------------------------\n# FAMILY and BOARD\n#-------------------------------------------------------------\nif (NOT DEFINED FAMILY)\n  family_resolve_board(\"${BOARD}\" BOARD_PATH)\n\n  string(REPLACE \"/\" \";\" BOARD_PATH ${BOARD_PATH})\n  list(GET BOARD_PATH 0 FAMILY)\n  set(FAMILY ${FAMILY} CACHE STRING \"Board family\")\nendif ()\n\nif (NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/${FAMILY}/family.cmake)\n  message(FATAL_ERROR \"Family '${FAMILY}' is not known/supported\")\nendif()\n\nif (NOT FAMILY STREQUAL rp2040)\n  # enable LTO if supported skip rp2040\n  include(CheckIPOSupported)\n  check_ipo_supported(RESULT IPO_SUPPORTED)\n  cmake_print_variables(IPO_SUPPORTED)\n  if (IPO_SUPPORTED)\n    set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)\n  endif()\nendif()\n\nif (NOT NO_WARN_RWX_SEGMENTS_SUPPORTED)\n  set(NO_WARN_RWX_SEGMENTS_SUPPORTED 1)\nendif()\n\n#----------------------------------\n# RTOS\n#----------------------------------\nif (NOT DEFINED RTOS)\n  set(RTOS noos CACHE STRING \"RTOS\")\nendif ()\n\nif (RTOS STREQUAL zephyr)\n  set(BOARD_ROOT ${TOP}/hw/bsp/${FAMILY})\n  set(ZEPHYR_BOARD_ALIASES ${CMAKE_CURRENT_LIST_DIR}/zephyr_board_aliases.cmake)\n  find_package(Zephyr REQUIRED HINTS ${TOP}/zephyr)\n  list(REMOVE_ITEM WARN_FLAGS_GNU\n    -Wredundant-decls\n    -Wundef\n    -Wcast-align\n    )\nendif ()\n\n#-------------------------------------------------------------\n# Functions\n#-------------------------------------------------------------\n\n# Filter example based on only.txt and skip.txt\nfunction(family_filter RESULT DIR)\n  get_filename_component(DIR ${DIR} ABSOLUTE BASE_DIR ${CMAKE_CURRENT_SOURCE_DIR})\n\n  if (EXISTS \"${DIR}/skip.txt\")\n    file(STRINGS \"${DIR}/skip.txt\" SKIPS_LINES)\n    foreach(MCU IN LISTS FAMILY_MCUS)\n      # For each line in only.txt\n      foreach(_line ${SKIPS_LINES})\n        # If mcu:xxx exists for this mcu then skip\n        if (${_line} STREQUAL \"mcu:${MCU}\" OR ${_line} STREQUAL \"board:${BOARD}\" OR ${_line} STREQUAL \"family:${FAMILY}\")\n          set(${RESULT} 0 PARENT_SCOPE)\n          return()\n        endif()\n      endforeach()\n    endforeach()\n  endif ()\n\n  if (EXISTS \"${DIR}/only.txt\")\n    file(STRINGS \"${DIR}/only.txt\" ONLYS_LINES)\n    foreach(MCU IN LISTS FAMILY_MCUS)\n      # For each line in only.txt\n      foreach(_line ${ONLYS_LINES})\n        # If mcu:xxx exists for this mcu or board:xxx then include\n        if (${_line} STREQUAL \"mcu:${MCU}\" OR ${_line} STREQUAL \"board:${BOARD}\" OR ${_line} STREQUAL \"family:${FAMILY}\")\n          set(${RESULT} 1 PARENT_SCOPE)\n          return()\n        endif()\n      endforeach()\n    endforeach()\n\n    # Didn't find it in only file so don't build\n    set(${RESULT} 0 PARENT_SCOPE)\n  else()\n    # only.txt not exist so build\n    set(${RESULT} 1 PARENT_SCOPE)\n  endif()\nendfunction()\n\nfunction(family_add_subdirectory DIR)\n  family_filter(SHOULD_ADD \"${DIR}\")\n  if (SHOULD_ADD)\n    add_subdirectory(${DIR})\n  endif()\nendfunction()\n\nfunction(family_initialize_project PROJECT DIR)\n  # set output suffix to .elf (skip espressif and rp2040)\n  if(NOT FAMILY STREQUAL \"espressif\" AND NOT FAMILY STREQUAL \"rp2040\")\n    set(CMAKE_EXECUTABLE_SUFFIX .elf PARENT_SCOPE)\n  endif()\n\n  family_filter(ALLOWED \"${DIR}\")\n  if (NOT ALLOWED)\n    get_filename_component(SHORT_NAME ${DIR} NAME)\n    message(FATAL_ERROR \"${SHORT_NAME} is not supported on FAMILY=${FAMILY}\")\n  endif()\nendfunction()\n\n# Add bloaty (https://github.com/google/bloaty/) target, required compile with -g (debug)\nfunction(family_add_bloaty TARGET)\n  find_program(BLOATY_EXE bloaty)\n  if (BLOATY_EXE STREQUAL BLOATY_EXE-NOTFOUND)\n    return()\n  endif ()\n\n  set(OPTION \"--domain=vm -d compileunits,sections,symbols\")\n  if (DEFINED BLOATY_OPTION)\n    string(APPEND OPTION \" ${BLOATY_OPTION}\")\n  endif ()\n  separate_arguments(OPTION_LIST UNIX_COMMAND ${OPTION})\n\n  add_custom_target(${TARGET}-bloaty\n    DEPENDS ${TARGET}\n    COMMAND ${BLOATY_EXE} ${OPTION_LIST} $<TARGET_FILE:${TARGET}>\n    VERBATIM)\n\n  set_property(TARGET ${TARGET}-bloaty PROPERTY FOLDER ${TARGET}-group)\n  # post build\n  #  add_custom_command(TARGET ${TARGET} POST_BUILD\n  #    COMMAND ${BLOATY_EXE} --csv ${OPTION_LIST} $<TARGET_FILE:${TARGET}> > ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_bloaty.csv\n  #    VERBATIM\n  #    )\nendfunction()\n\n# Add linkermap target (https://github.com/hathach/linkermap)\nfunction(family_add_linkermap TARGET)\n  set(OPTION \"-j\")\n  if (DEFINED LINKERMAP_OPTION)\n    string(APPEND OPTION \" ${LINKERMAP_OPTION}\")\n  endif ()\n  separate_arguments(OPTION_LIST UNIX_COMMAND ${OPTION})\n\n  add_custom_target(${TARGET}-linkermap\n    COMMAND python ${LINKERMAP_PY} ${OPTION_LIST} $<TARGET_FILE:${TARGET}>.map\n    VERBATIM\n    )\n\n  set_property(TARGET ${TARGET}-linkermap PROPERTY FOLDER ${TARGET}-group)\n\n  # post build\n  add_custom_command(TARGET ${TARGET} POST_BUILD\n    COMMAND python ${LINKERMAP_PY} ${OPTION_LIST} $<TARGET_FILE:${TARGET}>.map\n    VERBATIM)\nendfunction()\n\n# Add membrowse target (installed with pip install membrowse)\nfunction(family_add_membrowse TARGET)\n  find_program(MEMBROWSE_EXE membrowse)\n  if (MEMBROWSE_EXE STREQUAL MEMBROWSE_EXE-NOTFOUND)\n    # force anyway, bash login shell will find it from pip install path\n    set(MEMBROWSE_EXE membrowse)\n  endif ()\n\n  set(OPTION \"\")\n  if (DEFINED MEMBROWSE_OPTION)\n    string(APPEND OPTION \" ${MEMBROWSE_OPTION}\")\n  endif ()\n\n  # For Ninja generator, extract all linker scripts from Ninja commands (with INCLUDE) and pass them to membrowse.\n  if (CMAKE_GENERATOR MATCHES \"Ninja\")\n    set(TARGET_ELF_PATH \"$<TARGET_FILE_DIR:${TARGET}>/$<TARGET_FILE_NAME:${TARGET}>\")\n    set(MEMBROWSE_LD_SCRIPTS_CMD\n      \"ld_scripts=\\\"$(${CMAKE_MAKE_PROGRAM} -C ${CMAKE_BINARY_DIR} -t commands ${TARGET} | grep -oP '(?:-Wl,--script=|-T\\\\s*)\\\\K[A-Za-z0-9_./-]+\\\\.ld' | xargs)\\\"; \\\nall_ld_scripts=\\\"\\\"; \\\npending_ld_scripts=\\\"$ld_scripts\\\"; \\\nwhile [ -n \\\"$pending_ld_scripts\\\" ]; do \\\n  next_pending=\\\"\\\"; \\\n  for script in $pending_ld_scripts; do \\\n    case \\\" $all_ld_scripts \\\" in *\\\" $script \\\"*) continue ;; esac; \\\n    all_ld_scripts=\\\"$all_ld_scripts $script\\\"; \\\n    script_dir=$(dirname \\\"$script\\\"); \\\n    include_scripts=$(grep -hoP '^\\\\s*INCLUDE\\\\s+[<\\\"]?\\\\K[^\\\">[:space:]]+\\\\.ld' \\\"$script\\\" 2>/dev/null | xargs); \\\n    for include_script in $include_scripts; do \\\n      resolved_script=\\\"\\\"; \\\n      if [ -f \\\"$include_script\\\" ]; then \\\n        resolved_script=\\\"$include_script\\\"; \\\n      elif [ -f \\\"$script_dir/$include_script\\\" ]; then \\\n        resolved_script=\\\"$script_dir/$include_script\\\"; \\\n      fi; \\\n      if [ -n \\\"$resolved_script\\\" ]; then \\\n        case \\\" $all_ld_scripts $next_pending \\\" in *\\\" $resolved_script \\\"*) ;; *) next_pending=\\\"$next_pending $resolved_script\\\" ;; esac; \\\n      fi; \\\n    done; \\\n  done; \\\n  pending_ld_scripts=\\\"$(echo \\\"$next_pending\\\" | xargs)\\\"; \\\ndone; \\\nld_scripts=\\\"$(echo \\\"$all_ld_scripts\\\" | xargs)\\\"\")\n    set(MEMBROWSE_LD_DEFS_CMD\n      \"ld_symbols=\\\"$(${CMAKE_MAKE_PROGRAM} -C ${CMAKE_BINARY_DIR} -t commands ${TARGET} | grep -oP '(?<=--defsym[=,])[^[:space:]]+' | xargs)\\\"; \\\nld_defs=\\\"\\\"; \\\nfor symbol in $ld_symbols; do \\\n  ld_defs=\\\"$ld_defs --def $symbol\\\"; \\\ndone; \\\nld_defs=\\\"$(echo \\\"$ld_defs\\\" | xargs)\\\"\")\n    set(MEMBROWSE_PREPARE_CMD\n      \"if [ -f \\\"${TARGET_ELF_PATH}\\\" ]; then \\\n  ${MEMBROWSE_LD_SCRIPTS_CMD}; \\\n  ${MEMBROWSE_LD_DEFS_CMD}; \\\n  if [ \\\"$MEMBROWSE_UPLOAD\\\" = \\\"1\\\" ]; then \\\n    MEMBROWSE_CMD=\\\"${MEMBROWSE_EXE} report ${OPTION} \\\\\\\"${TARGET_ELF_PATH}\\\\\\\" \\\\\\\"$ld_scripts\\\\\\\" $ld_defs --upload --github --target-name ${BOARD}/${TARGET} --api-key $ENV{MEMBROWSE_API_KEY}\\\"; \\\n  else \\\n    MEMBROWSE_CMD=\\\"${MEMBROWSE_EXE} report ${OPTION} \\\\\\\"${TARGET_ELF_PATH}\\\\\\\" \\\\\\\"$ld_scripts\\\\\\\" $ld_defs\\\"; \\\n  fi; \\\nelse \\\n  if [ \\\"$MEMBROWSE_UPLOAD\\\" = \\\"1\\\" ]; then \\\n    MEMBROWSE_CMD=\\\"${MEMBROWSE_EXE} report ${OPTION} --identical --upload --github --target-name ${BOARD}/${TARGET} --api-key $ENV{MEMBROWSE_API_KEY}\\\"; \\\n  else \\\n    MEMBROWSE_CMD=\\\"${MEMBROWSE_EXE} report ${OPTION} --identical\\\"; \\\n  fi; \\\nfi; \\\necho \\\"$MEMBROWSE_CMD\\\"\")\n\n    add_custom_target(${TARGET}-membrowse\n      DEPENDS ${TARGET}\n      COMMAND ${CMAKE_COMMAND} -E env MEMBROWSE_UPLOAD=0 bash -lc \"${MEMBROWSE_PREPARE_CMD}; eval \\\"$MEMBROWSE_CMD\\\"\"\n      VERBATIM\n      )\n    set_property(TARGET ${TARGET}-membrowse PROPERTY FOLDER ${TARGET}-group)\n\n    add_custom_target(${TARGET}-membrowse-upload\n      COMMAND ${CMAKE_COMMAND} -E env MEMBROWSE_UPLOAD=1 bash -lc \"${MEMBROWSE_PREPARE_CMD}; eval \\\"$MEMBROWSE_CMD\\\"\"\n      VERBATIM\n      )\n\n    if (NOT TARGET examples-membrowse-upload)\n      add_custom_target(examples-membrowse-upload)\n    endif ()\n    add_dependencies(examples-membrowse-upload ${TARGET}-membrowse-upload)\n\n    set_property(TARGET ${TARGET}-membrowse-upload PROPERTY FOLDER ${TARGET}-group)\n  endif ()\nendfunction()\n\n\n#-------------------------------------------------------------\n# Common Target Configure\n# Most families use these settings except rp2040 and espressif\n#-------------------------------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  # empty function, should be redefined in FAMILY/family.cmake\nendfunction()\n\n# Add RTOS to example\nfunction(family_add_rtos TARGET RTOS)\n  if (RTOS STREQUAL \"freertos\")\n    if (NOT TARGET freertos_config)\n      add_library(freertos_config INTERFACE)\n      target_include_directories(freertos_config INTERFACE ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/${FAMILY}/FreeRTOSConfig)\n      # add board definition to freertos_config mostly for SystemCoreClock\n      target_link_libraries(freertos_config INTERFACE board_${BOARD})\n    endif()\n\n    if (NOT TARGET freertos_kernel)\n      add_subdirectory(${TOP}/lib/FreeRTOS-Kernel ${CMAKE_BINARY_DIR}/lib/freertos_kernel)\n    endif ()\n\n    target_link_libraries(${TARGET} PUBLIC freertos_kernel)\n    target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_OS=OPT_OS_FREERTOS)\n  elseif (RTOS STREQUAL \"threadx\")\n    if (NOT TARGET threadx)\n      # Derive THREADX_ARCH from CMAKE_SYSTEM_CPU if not explicitly set\n      if (NOT DEFINED THREADX_ARCH)\n        string(REPLACE \"-\" \"_\" THREADX_ARCH ${CMAKE_SYSTEM_CPU})\n      endif ()\n      # Derive THREADX_TOOLCHAIN from TOOLCHAIN if not explicitly set\n      if (NOT DEFINED THREADX_TOOLCHAIN)\n        if (TOOLCHAIN STREQUAL \"iar\")\n          set(THREADX_TOOLCHAIN \"iar\")\n        elseif (TOOLCHAIN STREQUAL \"clang\")\n          set(THREADX_TOOLCHAIN \"ac6\")\n        else ()\n          set(THREADX_TOOLCHAIN \"gnu\")\n        endif ()\n      endif ()\n      add_subdirectory(${TOP}/lib/threadx ${CMAKE_BINARY_DIR}/lib/threadx)\n    endif ()\n    target_link_libraries(${TARGET} PUBLIC threadx)\n    target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_OS=OPT_OS_THREADX)\n  elseif (RTOS STREQUAL \"zephyr\")\n    target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_OS=OPT_OS_ZEPHYR)\n    target_include_directories(${TARGET} PUBLIC ${ZEPHYR_BASE}/include)\n  endif ()\nendfunction()\n\n# Add common configuration to example\nfunction(family_configure_common TARGET RTOS)\n  # Add board target\n  set(BOARD_TARGET board_${BOARD})\n  if (NOT RTOS STREQUAL zephyr)\n    if (NOT TARGET ${BOARD_TARGET})\n      family_add_board(${BOARD_TARGET})\n      set_target_properties(${BOARD_TARGET} PROPERTIES\n        ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib\n        SKIP_LINTING ON # need cmake 4.2\n        )\n      if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n        set_target_properties(${BOARD_TARGET} PROPERTIES COMPILE_OPTIONS -w)\n      endif ()\n    endif ()\n    target_link_libraries(${TARGET} PUBLIC ${BOARD_TARGET})\n  endif ()\n\n  family_add_rtos(${TARGET} ${RTOS})\n\n  # Add BOARD_${BOARD} define\n  string(TOUPPER ${BOARD} BOARD_UPPER)\n  string(REPLACE \"-\" \"_\" BOARD_UPPER ${BOARD_UPPER})\n  target_compile_definitions(${TARGET} PUBLIC\n    BOARD_${BOARD_UPPER}\n  )\n\n  # compile define from command line\n  if(DEFINED CFLAGS_CLI)\n    separate_arguments(CFLAGS_CLI)\n    target_compile_options(${TARGET} PUBLIC ${CFLAGS_CLI})\n  endif()\n\n  # ETM Trace option\n  if (TRACE_ETM STREQUAL \"1\")\n    target_compile_definitions(${TARGET} PUBLIC TRACE_ETM)\n  endif ()\n\n  # LOGGER option\n  if (DEFINED LOGGER)\n    string(TOUPPER ${LOGGER} LOGGER)\n    target_compile_definitions(${TARGET} PUBLIC LOGGER_${LOGGER})\n    # Add segger rtt to example\n    if(LOGGER STREQUAL \"RTT\")\n      target_sources(${TARGET} PUBLIC ${TOP}/lib/SEGGER_RTT/RTT/SEGGER_RTT.c)\n      target_include_directories(${TARGET}  PUBLIC ${TOP}/lib/SEGGER_RTT/RTT)\n#      target_compile_definitions(${TARGET}  PUBLIC SEGGER_RTT_MODE_DEFAULT=SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL)\n      set_source_files_properties(${TOP}/lib/SEGGER_RTT/RTT/SEGGER_RTT.c PROPERTIES SKIP_LINTING ON)\n    endif ()\n  else ()\n    target_compile_definitions(${TARGET} PUBLIC LOGGER_UART)\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_compile_options(${TARGET} PRIVATE ${WARN_FLAGS_${CMAKE_C_COMPILER_ID}})\n    target_link_options(${TARGET} PUBLIC \"LINKER:-Map=$<TARGET_FILE:${TARGET}>.map\")\n    if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0\n      AND NO_WARN_RWX_SEGMENTS_SUPPORTED AND (NOT RTOS STREQUAL zephyr))\n      target_link_options(${TARGET} PUBLIC \"LINKER:--no-warn-rwx-segments\")\n    endif ()\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_compile_options(${TARGET} PRIVATE $<$<OR:$<COMPILE_LANGUAGE:C>,$<COMPILE_LANGUAGE:CXX>>:${WARN_FLAGS_IAR}>)\n    target_link_options(${TARGET} PUBLIC \"LINKER:--map=$<TARGET_FILE:${TARGET}>.map\")\n\n    if (IAR_CSTAT)\n      # link time analysis with C-STAT\n      add_custom_command(TARGET ${TARGET} POST_BUILD\n        COMMAND ${CMAKE_C_ICSTAT}\n        --db=${CMAKE_BINARY_DIR}/cstat.db\n        link_analyze -- ${CMAKE_LINKER} $<TARGET_OBJECTS:${TARGET}>\n        COMMAND_EXPAND_LISTS\n        )\n      # generate C-STAT report\n      add_custom_command(TARGET ${TARGET} POST_BUILD\n        COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/cstat_report\n        COMMAND ireport --db=${CMAKE_BINARY_DIR}/cstat.db --full --project ${TARGET} --output ${CMAKE_CURRENT_BINARY_DIR}/cstat_report/index.html\n        )\n    endif ()\n  endif ()\n\n  if (NOT RTOS STREQUAL zephyr)\n    # Analyze size with bloaty and linkermap\n    family_add_bloaty(${TARGET})\n    family_add_linkermap(${TARGET})\n    family_add_membrowse(${TARGET})\n  endif ()\n\n  # run size after build\n#  find_program(SIZE_EXE ${CMAKE_SIZE})\n#  if(NOT ${SIZE_EXE} STREQUAL SIZE_EXE-NOTFOUND)\n#    add_custom_command(TARGET ${TARGET} POST_BUILD\n#      COMMAND ${SIZE_EXE} $<TARGET_FILE:${TARGET}>\n#      )\n#  endif ()\nendfunction()\n\n# Add tinyusb to target\nfunction(family_add_tinyusb TARGET OPT_MCU)\n  # tinyusb's CMakeLists.txt\n  include(${TOP}/src/CMakeLists.txt)\n\n  # Add TinyUSB sources, include and common define\n  tinyusb_target_add(${TARGET})\n  target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_MCU=${OPT_MCU})\n  if (DEFINED LOG)\n    target_compile_definitions(${TARGET} PUBLIC CFG_TUSB_DEBUG=${LOG})\n    if (LOG STREQUAL \"4\") # no inline for debug level 4\n      target_compile_definitions(${TARGET} PUBLIC TU_ATTR_ALWAYS_INLINE=)\n    endif ()\n  endif()\n\n  # use max3421 as host controller\n  if (MAX3421_HOST STREQUAL \"1\")\n    target_compile_definitions(${TARGET} PUBLIC CFG_TUH_MAX3421=1)\n    target_sources(${TARGET} PUBLIC\n      ${TOP}/src/portable/analog/max3421/hcd_max3421.c\n      )\n  endif ()\nendfunction()\n\n# Add bin/hex output\nfunction(family_add_bin_hex TARGET)\n  if (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    add_custom_command(TARGET ${TARGET} POST_BUILD\n      COMMAND ${CMAKE_OBJCOPY} --bin $<TARGET_FILE:${TARGET}> $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin\n      COMMAND ${CMAKE_OBJCOPY} --ihex $<TARGET_FILE:${TARGET}> $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex\n      VERBATIM)\n  else()\n    add_custom_command(TARGET ${TARGET} POST_BUILD\n      COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${TARGET}> $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin\n      COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${TARGET}> $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex\n      VERBATIM)\n  endif()\nendfunction()\n\n# Add uf2 output\nfunction(family_add_uf2 TARGET FAMILY_ID)\n  set(BIN_FILE $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex)\n  add_custom_command(TARGET ${TARGET} POST_BUILD\n    COMMAND python ${UF2CONV_PY} -f ${FAMILY_ID} -c -o $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.uf2 ${BIN_FILE}\n    VERBATIM)\nendfunction()\n\n#-------------------------------------------------------\n# Example Target Configure (Default rule)\n# These function can be redefined in FAMILY/family.cmake\n#--------------------------------------------------------\n\nfunction(family_configure_example TARGET RTOS)\n  # empty function, should be redefined in FAMILY/family.cmake\nendfunction()\n\n# Configure device example with RTOS\nfunction(family_configure_device_example TARGET RTOS)\n  family_configure_example(${TARGET} ${RTOS})\nendfunction()\n\n# Configure host example with RTOS\nfunction(family_configure_host_example TARGET RTOS)\n  family_configure_example(${TARGET} ${RTOS})\nendfunction()\n\n# Configure host + device example with RTOS\nfunction(family_configure_dual_usb_example TARGET RTOS)\n  family_configure_example(${TARGET} ${RTOS})\nendfunction()\n\nfunction(family_example_missing_dependency TARGET DEPENDENCY)\n  message(WARNING \"${DEPENDENCY} submodule needed by ${TARGET} not found, please run 'python tools/get_deps.py ${DEPENDENCY}' to fetch it\")\nendfunction()\n\n#----------------------------------\n# Flashing target\n#----------------------------------\n\n# Add flash jlink target\nfunction(family_flash_jlink TARGET)\n  if (NOT DEFINED JLINKEXE)\n    if(CMAKE_HOST_WIN32)\n      set(JLINKEXE JLink.exe)\n    else()\n      set(JLINKEXE JLinkExe)\n    endif()\n  endif ()\n\n  if (NOT DEFINED JLINK_IF)\n    set(JLINK_IF swd)\n  endif ()\n\n  if (NOT DEFINED JLINK_OPTION)\n    set(JLINK_OPTION \"\")\n  endif ()\n  separate_arguments(OPTION_LIST UNIX_COMMAND ${JLINK_OPTION})\n\n  if (RTOS STREQUAL zephyr)\n    set(BINARY_TARGET zephyr_final)\n    set(NAME_TARGET ${CMAKE_PROJECT_NAME})\n  else ()\n    set(BINARY_TARGET ${TARGET})\n    set(NAME_TARGET ${TARGET})\n  endif ()\n\n  file(GENERATE\n    OUTPUT $<TARGET_FILE_DIR:${BINARY_TARGET}>/${BINARY_TARGET}.jlink\n    CONTENT \"halt\nloadfile $<TARGET_FILE:${BINARY_TARGET}>\nr\ngo\nexit\"\n    )\n\n  add_custom_target(${NAME_TARGET}-jlink\n    DEPENDS ${BINARY_TARGET}\n    COMMAND ${JLINKEXE} -device ${JLINK_DEVICE} ${OPTION_LIST} -if ${JLINK_IF} -JTAGConf -1,-1 -speed auto -CommandFile $<TARGET_FILE_DIR:${BINARY_TARGET}>/${BINARY_TARGET}.jlink\n    VERBATIM\n    )\n\n  set_property(TARGET ${NAME_TARGET}-jlink PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\n# Add flash stlink target\nfunction(family_flash_stlink TARGET)\n  if (NOT DEFINED STM32_PROGRAMMER_CLI)\n    set(STM32_PROGRAMMER_CLI STM32_Programmer_CLI)\n  endif ()\n\n  add_custom_target(${TARGET}-stlink\n    DEPENDS ${TARGET}\n    COMMAND ${STM32_PROGRAMMER_CLI} --connect port=swd --write $<TARGET_FILE:${TARGET}> --go\n    )\n\n  set_property(TARGET ${TARGET}-stlink PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\n# Add flash st-flash target\nfunction(family_flash_stflash TARGET)\n  if (NOT DEFINED ST_FLASH)\n    set(ST_FLASH st-flash)\n  endif ()\n\n  add_custom_target(${TARGET}-stflash\n    DEPENDS ${TARGET}\n    COMMAND ${ST_FLASH} write $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin 0x8000000\n    )\n\n  set_property(TARGET ${TARGET}-stflash PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\n# Add flash openocd target\nfunction(family_flash_openocd TARGET)\n  if (NOT DEFINED OPENOCD)\n    set(OPENOCD openocd)\n  endif ()\n\n  if (NOT DEFINED OPENOCD_OPTION2)\n    set(OPENOCD_OPTION2 \"\")\n  endif ()\n\n  if (DEFINED OPENOCD_SERIAL)\n    set(OPENOCD_OPTION \"-c \\\"adapter serial ${OPENOCD_SERIAL}\\\" ${OPENOCD_OPTION}\")\n  endif ()\n\n  separate_arguments(OPTION_LIST UNIX_COMMAND ${OPENOCD_OPTION})\n  separate_arguments(OPTION_LIST2 UNIX_COMMAND ${OPENOCD_OPTION2})\n\n  # note skip verify since it has issue with rp2040\n  add_custom_target(${TARGET}-openocd\n    DEPENDS ${TARGET}\n    COMMAND ${OPENOCD} -c \"tcl_port disabled; gdb_port disabled\" ${OPTION_LIST} -c \"init; halt; program $<TARGET_FILE:${TARGET}>\" -c reset ${OPTION_LIST2} -c exit\n    VERBATIM\n    )\n\n  set_property(TARGET ${TARGET}-openocd PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\n# Add flash openocd-wch target\n# compiled from https://github.com/hathach/riscv-openocd-wch or https://github.com/dragonlock2/miscboards/blob/main/wch/SDK/riscv-openocd.tar.xz\nfunction(family_flash_openocd_wch TARGET)\n  if (NOT DEFINED OPENOCD)\n    set(OPENOCD $ENV{HOME}/app/riscv-openocd-wch/src/openocd)\n  endif ()\n\n  family_flash_openocd(${TARGET})\nendfunction()\n\n\n# Add flash openocd adi (Analog Devices) target\n# included with msdk or compiled from release branch of https://github.com/analogdevicesinc/openocd\nfunction(family_flash_openocd_adi TARGET)\n  if (DEFINED MAXIM_PATH)\n    # use openocd from msdk with MAXIM_PATH cmake variable first if the user specified it\n    set(OPENOCD ${MAXIM_PATH}/Tools/OpenOCD/openocd)\n    set(OPENOCD_OPTION2 \"-s ${MAXIM_PATH}/Tools/OpenOCD/scripts\")\n  elseif (DEFINED ENV{MAXIM_PATH})\n    # use openocd from msdk with MAXIM_PATH environment variable. Normalize\n    # since msdk can be Windows (MinGW) or Linux\n    file(TO_CMAKE_PATH \"$ENV{MAXIM_PATH}\" MAXIM_PATH_NORM)\n    set(OPENOCD ${MAXIM_PATH_NORM}/Tools/OpenOCD/openocd)\n    set(OPENOCD_OPTION2 \"-s ${MAXIM_PATH_NORM}/Tools/OpenOCD/scripts\")\n  else()\n    # compiled from source\n    if (NOT DEFINED OPENOCD_ADI_PATH)\n      set(OPENOCD_ADI_PATH $ENV{HOME}/app/openocd_adi)\n    endif ()\n    set(OPENOCD ${OPENOCD_ADI_PATH}/src/openocd)\n    set(OPENOCD_OPTION2 \"-s ${OPENOCD_ADI_PATH}/tcl\")\n  endif ()\n\n  family_flash_openocd(${TARGET})\nendfunction()\n\n# Add flash openocd-nuvoton target\n# compiled from https://github.com/OpenNuvoton/OpenOCD-Nuvoton\nfunction(family_flash_openocd_nuvoton TARGET)\n  if (NOT DEFINED OPENOCD)\n    set(OPENOCD $ENV{HOME}/app/OpenOCD-Nuvoton/src/openocd)\n    set(OPENOCD_OPTION2 \"-s $ENV{HOME}/app/OpenOCD-Nuvoton/tcl\")\n  endif ()\n\n  family_flash_openocd(${TARGET})\nendfunction()\n\n\n# Add flash with https://github.com/ch32-rs/wlink\nfunction(family_flash_wlink_rs TARGET)\n  if (NOT DEFINED WLINK_RS)\n    set(WLINK_RS wlink)\n  endif ()\n\n  add_custom_target(${TARGET}-wlink-rs\n    DEPENDS ${TARGET}\n    COMMAND ${WLINK_RS} flash $<TARGET_FILE:${TARGET}>\n    )\n\n  set_property(TARGET ${TARGET}-wlink-rs PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\n# Add flash pycod target\nfunction(family_flash_pyocd TARGET)\n  if (NOT DEFINED PYOC)\n    set(PYOCD pyocd)\n  endif ()\n\n  add_custom_target(${TARGET}-pyocd\n    DEPENDS ${TARGET}\n    COMMAND ${PYOCD} flash -t ${PYOCD_TARGET} $<TARGET_FILE:${TARGET}>\n    )\n\n  set_property(TARGET ${TARGET}-pyocd PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\n# Flash with UF2\nfunction(family_flash_uf2 TARGET FAMILY_ID)\n  add_custom_target(${TARGET}-uf2\n    DEPENDS ${TARGET}\n    COMMAND python ${UF2CONV_PY} -f ${FAMILY_ID} --deploy $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.uf2\n    )\n  set_property(TARGET ${TARGET}-uf2 PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\n# Add flash teensy_cli target\nfunction(family_flash_teensy TARGET)\n  if (NOT DEFINED TEENSY_CLI)\n    set(TEENSY_CLI teensy_loader_cli)\n  endif ()\n\n  add_custom_target(${TARGET}-teensy\n    DEPENDS ${TARGET}\n    COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${TARGET}> $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex\n    COMMAND ${TEENSY_CLI} --mcu=${TEENSY_MCU} -w -s $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex\n    )\n\n  set_property(TARGET ${TARGET}-teensy PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\n# Add flash using NXP's LinkServer (redserver)\n# https://www.nxp.com/design/software/development-software/mcuxpresso-software-and-tools-/linkserver-for-microcontrollers:LINKERSERVER\nfunction(family_flash_nxplink TARGET)\n  if (NOT DEFINED LINKSERVER)\n    set(LINKSERVER LinkServer)\n  endif ()\n\n  # LinkServer has a bug that can only execute with full path otherwise it throws:\n  # realpath error: No such file or directory\n  execute_process(COMMAND which ${LINKSERVER} OUTPUT_VARIABLE LINKSERVER_PATH OUTPUT_STRIP_TRAILING_WHITESPACE)\n\n  add_custom_target(${TARGET}-nxplink\n    DEPENDS ${TARGET}\n    COMMAND ${LINKSERVER_PATH} flash ${NXPLINK_DEVICE} load $<TARGET_FILE:${TARGET}>\n    )\n\n  set_property(TARGET ${TARGET}-nxplink PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\nfunction(family_flash_dfu_util TARGET OPTION)\n  if (NOT DEFINED DFU_UTIL)\n    set(DFU_UTIL dfu-util)\n  endif ()\n\n  add_custom_target(${TARGET}-dfu-util\n    DEPENDS ${TARGET}\n    COMMAND ${DFU_UTIL} -R -d ${DFU_UTIL_VID_PID} -a 0 -D $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin\n    VERBATIM\n    )\n\n  set_property(TARGET ${TARGET}-dfu-util PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\nfunction(family_flash_msp430flasher TARGET)\n  if (NOT DEFINED MSP430Flasher)\n    set(MSP430FLASHER MSP430Flasher)\n  endif ()\n\n  # set LD_LIBRARY_PATH to find libmsp430.so (directory containing MSP430Flasher)\n  find_program(MSP430FLASHER_PATH MSP430Flasher)\n  get_filename_component(MSP430FLASHER_PARENT_DIR \"${MSP430FLASHER_PATH}\" DIRECTORY)\n  add_custom_target(${TARGET}-msp430flasher\n    DEPENDS ${TARGET}\n    COMMAND ${CMAKE_COMMAND} -E env LD_LIBRARY_PATH=${MSP430FLASHER_PARENT_DIR}\n            ${MSP430FLASHER} -w $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex -z [VCC]\n    )\n\n  set_property(TARGET ${TARGET}-msp430flasher PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\nfunction(family_flash_rfp TARGET)\n  if (NOT DEFINED RFP_CLI)\n    set(RFP_CLI rfp-cli)\n  endif ()\n\n  add_custom_target(${TARGET}-rfp\n    DEPENDS ${TARGET}\n    COMMAND ${CMAKE_OBJCOPY} -O srec -I elf32-rx-be-ns $<TARGET_FILE:${TARGET}> $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.mot\n    COMMAND ${RFP_CLI} -device ${RFP_DEVICE} -tool ${RFP_TOOL} -if fine\n      -fo id FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n      -auth id FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\n      -auto $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.mot\n    VERBATIM\n    )\n\n  set_property(TARGET ${TARGET}-rfp PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n\nfunction(family_flash_uniflash TARGET)\n  if (NOT DEFINED DSLITE)\n    set(DSLITE dslite.sh)\n  endif ()\n\n  separate_arguments(OPTION_LIST UNIX_COMMAND ${UNIFLASH_OPTION})\n\n  add_custom_target(${TARGET}-uniflash\n    DEPENDS ${TARGET}\n    COMMAND ${DSLITE} ${UNIFLASH_OPTION} -f $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex\n    VERBATIM\n    )\n\n  set_property(TARGET ${TARGET}-uniflash PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n# Add flash ft9xx target need to remove kernal's ftdi_sio and bind D2XX drivers\n# sudo rmmod ftdi_sio && for i in 0 1 2 3; do sudo sh -c \"echo 3-3.4:1.$i > /sys/bus/usb/drivers/ftdi_sio/unbind\" 2>/dev/null; done\nfunction(family_flash_ft9xx TARGET)\n  if (NOT DEFINED FT9XXPROG)\n    set(FT9XXPROG FT9xxProg)\n  endif ()\n\n  add_custom_target(${TARGET}-ft9xx\n    DEPENDS ${TARGET}\n    COMMAND ${FT9XXPROG} -f $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin\n    )\n\n  set_property(TARGET ${TARGET}-ft9xx PROPERTY FOLDER ${TARGET}-group)\nendfunction()\n\n#----------------------------------\n# Family specific\n#----------------------------------\n\n# family specific: can override above functions\ninclude(${CMAKE_CURRENT_LIST_DIR}/${FAMILY}/family.cmake)\n\nif (NOT FAMILY_MCUS)\n  set(FAMILY_MCUS ${FAMILY})\nendif()\n\n# if use max3421 as host controller, expand FAMILY_MCUS to include max3421\nif (MAX3421_HOST STREQUAL \"1\")\n  set(FAMILY_MCUS ${FAMILY_MCUS} MAX3421)\nendif ()\n\n# save it in case of re-inclusion\nset(FAMILY_MCUS ${FAMILY_MCUS} CACHE INTERNAL \"\")\n"
  },
  {
    "path": "hw/bsp/family_support.mk",
    "content": "# ---------------------------------------\n# Common make definition for all examples\n# ---------------------------------------\n\n# upper helper function\nto_upper = $(subst a,A,$(subst b,B,$(subst c,C,$(subst d,D,$(subst e,E,$(subst f,F,$(subst g,G,$(subst h,H,$(subst i,I,$(subst j,J,$(subst k,K,$(subst l,L,$(subst m,M,$(subst n,N,$(subst o,O,$(subst p,P,$(subst q,Q,$(subst r,R,$(subst s,S,$(subst t,T,$(subst u,U,$(subst v,V,$(subst w,W,$(subst x,X,$(subst y,Y,$(subst z,Z,$(subst -,_,$(1))))))))))))))))))))))))))))\n\n#-------------------------------------------------------------\n# Toolchain\n# Can be changed via TOOLCHAIN=gcc|iar or CC=arm-none-eabi-gcc|iccarm|clang\n#-------------------------------------------------------------\nifneq (,$(findstring clang,$(CC)))\n  TOOLCHAIN = clang\nelse ifneq (,$(findstring iccarm,$(CC)))\n  TOOLCHAIN = iar\nelse ifneq (,$(findstring gcc,$(CC)))\n  TOOLCHAIN = gcc\nendif\n\n# Default to GCC\nifndef TOOLCHAIN\n  TOOLCHAIN = gcc\nendif\n\n#-------------- TOP and EXAMPLE_PATH ------------\n\n# Set TOP to be the path to get from the current directory (where make was invoked) to the top of the tree.\n# $(lastword $(MAKEFILE_LIST)) returns the name of this makefile relative to where make was invoked.\nTHIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))\n\n# Set TOP to an absolute path\nTOP = $(abspath $(subst family_support.mk,../..,$(THIS_MAKEFILE)))\n\n# Set EXAMPLE_PATH to the relative path from TOP to the current directory, ie examples/device/cdc_msc\nEXAMPLE_PATH = $(subst $(TOP)/,,$(abspath .))\n\n#-------------- Linux/Windows ------------\n# Detect whether shell style is windows or not\n# https://stackoverflow.com/questions/714100/os-detecting-makefile/52062069#52062069\nifeq '$(findstring ;,$(PATH))' ';'\n# PATH contains semicolon - so we're definitely on Windows.\nCMDEXE := 1\n\n# makefile shell commands should use syntax for DOS CMD, not unix sh\n# Force DOS command shell on Windows.\nSHELL := cmd.exe\nendif\n\nifeq ($(CMDEXE),1)\n  CP = copy\n  RM = del\n  MKDIR = mkdir\n  PYTHON = python\nelse\n  CP = cp\n  RM = rm\n  MKDIR = mkdir\n  PYTHON = python3\nendif\n\n# Build directory\nBUILD := _build/$(BOARD)\n\nPROJECT := $(notdir $(CURDIR))\n\n#-------------------------------------------------------------\n# Family and Board\n#-------------------------------------------------------------\nBOARD_PATH := $(subst $(TOP)/,,$(wildcard $(TOP)/hw/bsp/*/boards/$(BOARD)))\nFAMILY := $(word 3, $(subst /, ,$(BOARD_PATH)))\nFAMILY_PATH = hw/bsp/$(FAMILY)\n\nifeq ($(BOARD_PATH),)\n  $(info You must provide a BOARD parameter with 'BOARD=')\n  $(error Invalid BOARD specified)\nendif\n\n# Include Family and Board specific defs\ninclude $(TOP)/$(FAMILY_PATH)/family.mk\nSRC_C += $(subst $(TOP)/,,$(wildcard $(TOP)/$(FAMILY_PATH)/*.c))\n\n#-------------------------------------------------------------\n# Source files and compiler flags\n#-------------------------------------------------------------\n# tinyusb makefile\ninclude $(TOP)/src/tinyusb.mk\nSRC_C += $(TINYUSB_SRC_C)\n\n# Include all source C in family & board folder\nSRC_C += hw/bsp/board.c\nSRC_C += $(subst $(TOP)/,,$(wildcard $(TOP)/$(BOARD_PATH)/*.c))\n\nINC += \\\n  $(TOP)/$(FAMILY_PATH) \\\n  $(TOP)/src \\\n  $(TOP)/hw \\\n\nBOARD_UPPER = $(call to_upper,$(BOARD))\nCFLAGS += -DBOARD_$(BOARD_UPPER)\n\nifdef CFLAGS_CLI\n\tCFLAGS += $(CFLAGS_CLI)\nendif\n\n# use max3421 as host controller\nifeq (${MAX3421_HOST},1)\n  SRC_C += src/portable/analog/max3421/hcd_max3421.c\n  CFLAGS += -DCFG_TUH_MAX3421=1\nendif\n\n# Log level is mapped to TUSB DEBUG option\nifneq ($(LOG),)\n  CFLAGS += -DCFG_TUSB_DEBUG=$(LOG)\nendif\n\n# Logger: default is uart, can be set to rtt or swo\nifeq ($(LOGGER),rtt)\n  CFLAGS += -DLOGGER_RTT\n  #CFLAGS += -DSEGGER_RTT_MODE_DEFAULT=SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL\n  INC   += $(TOP)/lib/SEGGER_RTT/RTT\n  SRC_C += lib/SEGGER_RTT/RTT/SEGGER_RTT.c\nendif\nifeq ($(LOGGER),swo)\n  CFLAGS += -DLOGGER_SWO\nelse\n  CFLAGS += -DLOGGER_UART\nendif\n\n# CPU specific flags\nifdef CPU_CORE\n  include ${TOP}/examples/build_system/make/cpu/$(CPU_CORE).mk\nendif\n\n# toolchain specific - select based on CPU architecture\nifdef CPU_CORE\n  ifneq (,$(filter cortex% arm%,$(CPU_CORE)))\n    # ARM/Cortex architecture\n    include ${TOP}/examples/build_system/make/toolchain/arm_$(TOOLCHAIN).mk\n  else ifneq (,$(filter rv%,$(CPU_CORE)))\n    # RISC-V architecture\n    include ${TOP}/examples/build_system/make/toolchain/riscv_$(TOOLCHAIN).mk\n  else\n    $(error Unsupported CPU_CORE architecture: $(CPU_CORE). Must start with cortex, arm, or rv)\n  endif\nelse\n  # Default to ARM if CPU_CORE not specified\n  include ${TOP}/examples/build_system/make/toolchain/arm_$(TOOLCHAIN).mk\nendif\n\n#---------------------- FreeRTOS -----------------------\nFREERTOS_SRC = lib/FreeRTOS-Kernel\nFREERTOS_PORTABLE_PATH = $(FREERTOS_SRC)/portable/$(if $(findstring iar,$(TOOLCHAIN)),IAR,GCC)\n\nifeq ($(RTOS),freertos)\n\tSRC_C += \\\n\t\t$(FREERTOS_SRC)/list.c \\\n\t\t$(FREERTOS_SRC)/queue.c \\\n\t\t$(FREERTOS_SRC)/tasks.c \\\n\t\t$(FREERTOS_SRC)/timers.c \\\n\t\t$(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.c))\n\n\tSRC_S += $(subst $(TOP)/,,$(wildcard $(TOP)/$(FREERTOS_PORTABLE_SRC)/*.s))\n\tINC += \\\n\t\t$(TOP)/hw/bsp/$(FAMILY)/FreeRTOSConfig \\\n\t\t$(TOP)/$(FREERTOS_SRC)/include \\\n\t\t$(TOP)/$(FREERTOS_PORTABLE_SRC)\n\n\tCFLAGS += -DCFG_TUSB_OS=OPT_OS_FREERTOS\n\n\t# Suppress FreeRTOSConfig.h warnings\n\tCFLAGS_GCC += -Wno-error=redundant-decls\n\n\t# Suppress FreeRTOS source warnings\n\tCFLAGS_GCC += -Wno-error=cast-qual\n\n\t# FreeRTOS (lto + Os) linker issue\n\tLDFLAGS_GCC += -Wl,--undefined=vTaskSwitchContext\nendif\n\n#---------------- Helper ----------------\ncheck_defined = \\\n    $(strip $(foreach 1,$1, \\\n    $(call __check_defined,$1,$(strip $(value 2)))))\n__check_defined = \\\n    $(if $(value $1),, \\\n    $(error Undefined make flag: $1$(if $2, ($2))))\n"
  },
  {
    "path": "hw/bsp/fomu/boards/fomu/board.cmake",
    "content": "function(update_board TARGET)\n#  target_compile_definitions(${TARGET} PUBLIC\n#    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/fomu/boards/fomu/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: fomu\n   url: https://tomu.im/fomu.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Place holder only\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/fomu/boards/fomu/board.mk",
    "content": "# place holder\n"
  },
  {
    "path": "hw/bsp/fomu/crt0-vexriscv.S",
    "content": ".global main\n.global isr\n\n.section .text.start\n.global _start\n\n_start:\n  j crt_init\n\n.section .text\n.global  trap_entry\ntrap_entry:\n  sw x1,  - 1*4(sp)\n  sw x5,  - 2*4(sp)\n  sw x6,  - 3*4(sp)\n  sw x7,  - 4*4(sp)\n  sw x10, - 5*4(sp)\n  sw x11, - 6*4(sp)\n  sw x12, - 7*4(sp)\n  sw x13, - 8*4(sp)\n  sw x14, - 9*4(sp)\n  sw x15, -10*4(sp)\n  sw x16, -11*4(sp)\n  sw x17, -12*4(sp)\n  sw x28, -13*4(sp)\n  sw x29, -14*4(sp)\n  sw x30, -15*4(sp)\n  sw x31, -16*4(sp)\n  addi sp,sp,-16*4\n  call isr\n  lw x1 , 15*4(sp)\n  lw x5,  14*4(sp)\n  lw x6,  13*4(sp)\n  lw x7,  12*4(sp)\n  lw x10, 11*4(sp)\n  lw x11, 10*4(sp)\n  lw x12,  9*4(sp)\n  lw x13,  8*4(sp)\n  lw x14,  7*4(sp)\n  lw x15,  6*4(sp)\n  lw x16,  5*4(sp)\n  lw x17,  4*4(sp)\n  lw x28,  3*4(sp)\n  lw x29,  2*4(sp)\n  lw x30,  1*4(sp)\n  lw x31,  0*4(sp)\n  addi sp,sp,16*4\n  mret\n\n.text\ncrt_init:\n  la sp, _estack - 4\n  la a0, trap_entry\n  csrw mtvec, a0\n\nbss_init:\n  la a0, _sbss\n  la a1, _ebss + 4\nbss_loop:\n  beq a0,a1,bss_done\n  sw zero,0(a0)\n  add a0,a0,4\n  j bss_loop\nbss_done:\n\n  /* Load DATA */\n  la t0, _etext\n  la t1, _srelocate\n  la t2, _erelocate + 4\n3:\n  lw t3, 0(t0)\n  sw t3, 0(t1)\n  /* _edata is aligned to 4 bytes. Use word-xfers. */\n  addi t0, t0, 4\n  addi t1, t1, 4\n  bltu t1, t2, 3b\n\n  li a0, 0x880  //880 enable timer + external interrupt sources (until mstatus.MIE is set, they will never trigger an interrupt)\n  csrw mie,a0\n\n  call main\ninfinite_loop:\n  j infinite_loop\n"
  },
  {
    "path": "hw/bsp/fomu/dfu.py",
    "content": "#!/usr/bin/env python3\n\n# Written by Antonio Galea - 2010/11/18\n# Updated for DFU 1.1 by Sean Cross - 2020/03/31\n# Distributed under Gnu LGPL 3.0\n# see http://www.gnu.org/licenses/lgpl-3.0.txt\n\nimport sys,struct,zlib,os\nfrom optparse import OptionParser\n\nDEFAULT_DEVICE=\"0x1209:0x5bf0\"\n\ndef named(tuple,names):\n  return dict(zip(names.split(),tuple))\ndef consume(fmt,data,names):\n  n = struct.calcsize(fmt)\n  return named(struct.unpack(fmt,data[:n]),names),data[n:]\ndef cstring(string):\n  return string.split('\\0',1)[0]\ndef compute_crc(data):\n  return 0xFFFFFFFF & -zlib.crc32(data) -1\n\ndef parse(file,dump_images=False):\n  print ('File: \"%s\"' % file)\n  data = open(file,'rb').read()\n  crc = compute_crc(data[:-4])\n  data = data[len(data)-16:]\n  suffix = named(struct.unpack('<4H3sBI',data[:16]),'device product vendor dfu ufd len crc')\n  print ('usb: %(vendor)04x:%(product)04x, device: 0x%(device)04x, dfu: 0x%(dfu)04x, %(ufd)s, %(len)d, 0x%(crc)08x' % suffix)\n  if crc != suffix['crc']:\n    print (\"CRC ERROR: computed crc32 is 0x%08x\" % crc)\n  data = data[16:]\n  if data:\n    print (\"PARSE ERROR\")\n\ndef build(file,data,device=DEFAULT_DEVICE):\n  # Parse the VID and PID from the `device` argument\n  v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))\n\n  # Generate the DFU suffix, consisting of these fields:\n  #  Field name     | Length  |  Description\n  # ================+=========+================================\n  #  bcdDevice      |    2    | The release number of this firmware (0xffff - don't care)\n  #  idProduct      |    2    | PID of this device\n  #  idVendor       |    2    | VID of this device\n  #  bcdDFU         |    2    | Version of this DFU spec (0x01 0x00)\n  #  ucDfuSignature |    3    | The characters 'DFU', printed in reverse order\n  #  bLength        |    1    | The length of this suffix (16 bytes)\n  #  dwCRC          |    4    | A CRC32 of the data, including this suffix\n  data += struct.pack('<4H3sB',0xffff,d,v,0x0100,b'UFD',16)\n  crc   = compute_crc(data)\n  # Append the CRC32 of the entire block\n  data += struct.pack('<I',crc)\n  open(file,'wb').write(data)\n\nif __name__==\"__main__\":\n  usage = \"\"\"\n%prog [-d|--dump] infile.dfu\n%prog {-b|--build} file.bin [{-D|--device}=vendor:device] outfile.dfu\"\"\"\n  parser = OptionParser(usage=usage)\n  parser.add_option(\"-b\", \"--build\", action=\"store\", dest=\"binfile\",\n    help=\"build a DFU file from given BINFILE\", metavar=\"BINFILE\")\n  parser.add_option(\"-D\", \"--device\", action=\"store\", dest=\"device\",\n    help=\"build for DEVICE, defaults to %s\" % DEFAULT_DEVICE, metavar=\"DEVICE\")\n  parser.add_option(\"-d\", \"--dump\", action=\"store_true\", dest=\"dump_images\",\n    default=False, help=\"dump contained images to current directory\")\n  (options, args) = parser.parse_args()\n\n  if options.binfile and len(args)==1:\n    binfile = options.binfile\n    if not os.path.isfile(binfile):\n      print (\"Unreadable file '%s'.\" % binfile)\n      sys.exit(1)\n    target = open(binfile,'rb').read()\n    outfile = args[0]\n    device = DEFAULT_DEVICE\n    # If a device is specified, parse the pair into a VID:PID pair\n    # in order to validate them.\n    if options.device:\n      device=options.device\n    try:\n      v,d=map(lambda x: int(x,0) & 0xFFFF, device.split(':',1))\n    except:\n      print (\"Invalid device '%s'.\" % device)\n      sys.exit(1)\n    build(outfile,target,device)\n  elif len(args)==1:\n    infile = args[0]\n    if not os.path.isfile(infile):\n      print (\"Unreadable file '%s'.\" % infile)\n      sys.exit(1)\n    parse(infile, dump_images=options.dump_images)\n  else:\n    parser.print_help()\n    sys.exit(1)\n"
  },
  {
    "path": "hw/bsp/fomu/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Tomu\n*/\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"csr.h\"\n#include \"irq.h\"\n\n#include \"bsp/board_api.h\"\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\nvoid fomu_error(uint32_t line)\n{\n  (void)line;\n  TU_BREAKPOINT();\n}\n\nvolatile uint32_t system_ticks = 0;\nstatic void timer_init(void)\n{\n\tint t;\n\n\ttimer0_en_write(0);\n\tt = CONFIG_CLOCK_FREQUENCY / 1000; // 1000 kHz tick\n\ttimer0_reload_write(t);\n\ttimer0_load_write(t);\n\ttimer0_en_write(1);\n  timer0_ev_enable_write(1);\n  timer0_ev_pending_write(1);\n\tirq_setmask(irq_getmask() | (1 << TIMER0_INTERRUPT));\n}\n\nvoid isr(void)\n{\n  unsigned int irqs;\n\n  irqs = irq_pending() & irq_getmask();\n\n#if CFG_TUD_ENABLED\n  if (irqs & (1 << USB_INTERRUPT)) {\n    tud_int_handler(0);\n  }\n#endif\n  if (irqs & (1 << TIMER0_INTERRUPT)) {\n    system_ticks++;\n    timer0_ev_pending_write(1);\n  }\n}\n\nvoid board_init(void)\n{\n  irq_setmask(0);\n  irq_setie(1);\n  timer_init();\n  return;\n}\n\nvoid board_led_write(bool state)\n{\n  rgb_ctrl_write(0xff);\n  rgb_raw_write(state);\n}\n\nuint32_t board_button_read(void)\n{\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  int32_t offset = 0;\n  uint8_t const* buf8 = (uint8_t const*) buf;\n  for (offset = 0; offset < len; offset++)\n  {\n    if (!(messible_status_read() & CSR_MESSIBLE_STATUS_FULL_OFFSET))\n    {\n      messible_in_write(buf8[offset]);\n    }\n  }\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/fomu/family.cmake",
    "content": "include_guard()\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU rv32i-ilp32 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS VALENTYUSB_EPTRI CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/fomu.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED STARTUP_FILE_GNU)\nset(STARTUP_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/crt0-vexriscv.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} INTERFACE)\n  target_include_directories(${BOARD_TARGET} INTERFACE\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_VALENTYUSB_EPTRI)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/valentyusb/eptri/dcd_eptri.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    message(FATAL_ERROR \"Clang is not supported\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/fomu/family.mk",
    "content": "# Toolchain from https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack\nCROSS_COMPILE = riscv-none-elf-\n\nCPU_CORE ?= rv32i-ilp32\n\nCFLAGS += \\\n  -flto \\\n  -DCFG_TUSB_MCU=OPT_MCU_VALENTYUSB_EPTRI\n\nLDFLAGS_GCC += \\\n  -nostdlib \\\n  --specs=nosys.specs --specs=nano.specs \\\n\n# All source paths should be relative to the top level.\nLD_FILE = $(FAMILY_PATH)/fomu.ld\n\nSRC_C += src/portable/valentyusb/eptri/dcd_eptri.c\n\nSRC_S += $(FAMILY_PATH)/crt0-vexriscv.S\n\nINC += \\\n\t$(TOP)/$(FAMILY_PATH)/include\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RISC-V\n\n# flash using dfu-util\n$(BUILD)/$(PROJECT).dfu: $(BUILD)/$(PROJECT).bin\n\t@echo \"Create $@\"\n\tpython $(TOP)/$(FAMILY_PATH)/dfu.py -b $^ -D 0x1209:0x5bf0 $@\n\nflash: $(BUILD)/$(PROJECT).dfu\n\tdfu-util -D $^\n"
  },
  {
    "path": "hw/bsp/fomu/fomu.ld",
    "content": "OUTPUT_FORMAT(\"elf32-littleriscv\")\nENTRY(_start)\n\n__DYNAMIC = 0;\n\nMEMORY {\n\tcsr : ORIGIN = 0x60000000, LENGTH = 0x01000000\n\tvexriscv_debug : ORIGIN = 0xf00f0000, LENGTH = 0x00000100\n\tram : ORIGIN = 0x10000000, LENGTH = 0x00020000\n\trom : ORIGIN = 0x20040000, LENGTH = 0x00200000 - 0x40000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _ftext = .;\n\t\t*(.text.start)\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n    } > rom\n\n    . = ALIGN(4);\n    _etext = .;            /* End of text section */\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(.sbss .sbss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/fomu/include/csr.h",
    "content": "//--------------------------------------------------------------------------------\n// Auto-generated by Migen (f4fcd10) & LiteX (1425a68d) on 2019-11-12 19:41:49\n//--------------------------------------------------------------------------------\n#ifndef __GENERATED_CSR_H\n#define __GENERATED_CSR_H\n#include <stdint.h>\n#ifdef CSR_ACCESSORS_DEFINED\nextern void csr_writeb(uint8_t value, unsigned long addr);\nextern uint8_t csr_readb(unsigned long addr);\nextern void csr_writew(uint16_t value, unsigned long addr);\nextern uint16_t csr_readw(unsigned long addr);\nextern void csr_writel(uint32_t value, unsigned long addr);\nextern uint32_t csr_readl(unsigned long addr);\n#else /* ! CSR_ACCESSORS_DEFINED */\n#include <hw/common.h>\n#endif /* ! CSR_ACCESSORS_DEFINED */\n\n/* ctrl */\n#define CSR_CTRL_BASE 0xe0000000L\n#define CSR_CTRL_RESET_ADDR 0xe0000000L\n#define CSR_CTRL_RESET_SIZE 1\nstatic inline unsigned char ctrl_reset_read(void) {\n\tunsigned char r = csr_readl(0xe0000000L);\n\treturn r;\n}\nstatic inline void ctrl_reset_write(unsigned char value) {\n\tcsr_writel(value, 0xe0000000L);\n}\n#define CSR_CTRL_SCRATCH_ADDR 0xe0000004L\n#define CSR_CTRL_SCRATCH_SIZE 4\nstatic inline unsigned int ctrl_scratch_read(void) {\n\tunsigned int r = csr_readl(0xe0000004L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0000008L);\n\tr <<= 8;\n\tr |= csr_readl(0xe000000cL);\n\tr <<= 8;\n\tr |= csr_readl(0xe0000010L);\n\treturn r;\n}\nstatic inline void ctrl_scratch_write(unsigned int value) {\n\tcsr_writel(value >> 24, 0xe0000004L);\n\tcsr_writel(value >> 16, 0xe0000008L);\n\tcsr_writel(value >> 8, 0xe000000cL);\n\tcsr_writel(value, 0xe0000010L);\n}\n#define CSR_CTRL_BUS_ERRORS_ADDR 0xe0000014L\n#define CSR_CTRL_BUS_ERRORS_SIZE 4\nstatic inline unsigned int ctrl_bus_errors_read(void) {\n\tunsigned int r = csr_readl(0xe0000014L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0000018L);\n\tr <<= 8;\n\tr |= csr_readl(0xe000001cL);\n\tr <<= 8;\n\tr |= csr_readl(0xe0000020L);\n\treturn r;\n}\n\n/* messible */\n#define CSR_MESSIBLE_BASE 0xe0008000L\n#define CSR_MESSIBLE_IN_ADDR 0xe0008000L\n#define CSR_MESSIBLE_IN_SIZE 1\nstatic inline unsigned char messible_in_read(void) {\n\tunsigned char r = csr_readl(0xe0008000L);\n\treturn r;\n}\nstatic inline void messible_in_write(unsigned char value) {\n\tcsr_writel(value, 0xe0008000L);\n}\n#define CSR_MESSIBLE_OUT_ADDR 0xe0008004L\n#define CSR_MESSIBLE_OUT_SIZE 1\nstatic inline unsigned char messible_out_read(void) {\n\tunsigned char r = csr_readl(0xe0008004L);\n\treturn r;\n}\n#define CSR_MESSIBLE_STATUS_ADDR 0xe0008008L\n#define CSR_MESSIBLE_STATUS_SIZE 1\nstatic inline unsigned char messible_status_read(void) {\n\tunsigned char r = csr_readl(0xe0008008L);\n\treturn r;\n}\n#define CSR_MESSIBLE_STATUS_FULL_OFFSET 0\n#define CSR_MESSIBLE_STATUS_FULL_SIZE 1\n#define CSR_MESSIBLE_STATUS_HAVE_OFFSET 1\n#define CSR_MESSIBLE_STATUS_HAVE_SIZE 1\n\n/* picorvspi */\n#define CSR_PICORVSPI_BASE 0xe0005000L\n#define CSR_PICORVSPI_CFG1_ADDR 0xe0005000L\n#define CSR_PICORVSPI_CFG1_SIZE 1\nstatic inline unsigned char picorvspi_cfg1_read(void) {\n\tunsigned char r = csr_readl(0xe0005000L);\n\treturn r;\n}\nstatic inline void picorvspi_cfg1_write(unsigned char value) {\n\tcsr_writel(value, 0xe0005000L);\n}\n#define CSR_PICORVSPI_CFG1_BB_OUT_OFFSET 0\n#define CSR_PICORVSPI_CFG1_BB_OUT_SIZE 4\n#define CSR_PICORVSPI_CFG1_BB_CLK_OFFSET 4\n#define CSR_PICORVSPI_CFG1_BB_CLK_SIZE 1\n#define CSR_PICORVSPI_CFG1_BB_CS_OFFSET 5\n#define CSR_PICORVSPI_CFG1_BB_CS_SIZE 1\n#define CSR_PICORVSPI_CFG2_ADDR 0xe0005004L\n#define CSR_PICORVSPI_CFG2_SIZE 1\nstatic inline unsigned char picorvspi_cfg2_read(void) {\n\tunsigned char r = csr_readl(0xe0005004L);\n\treturn r;\n}\nstatic inline void picorvspi_cfg2_write(unsigned char value) {\n\tcsr_writel(value, 0xe0005004L);\n}\n#define CSR_PICORVSPI_CFG2_BB_OE_OFFSET 0\n#define CSR_PICORVSPI_CFG2_BB_OE_SIZE 4\n#define CSR_PICORVSPI_CFG3_ADDR 0xe0005008L\n#define CSR_PICORVSPI_CFG3_SIZE 1\nstatic inline unsigned char picorvspi_cfg3_read(void) {\n\tunsigned char r = csr_readl(0xe0005008L);\n\treturn r;\n}\nstatic inline void picorvspi_cfg3_write(unsigned char value) {\n\tcsr_writel(value, 0xe0005008L);\n}\n#define CSR_PICORVSPI_CFG3_RLAT_OFFSET 0\n#define CSR_PICORVSPI_CFG3_RLAT_SIZE 4\n#define CSR_PICORVSPI_CFG3_CRM_OFFSET 4\n#define CSR_PICORVSPI_CFG3_CRM_SIZE 1\n#define CSR_PICORVSPI_CFG3_QSPI_OFFSET 5\n#define CSR_PICORVSPI_CFG3_QSPI_SIZE 1\n#define CSR_PICORVSPI_CFG3_DDR_OFFSET 6\n#define CSR_PICORVSPI_CFG3_DDR_SIZE 1\n#define CSR_PICORVSPI_CFG4_ADDR 0xe000500cL\n#define CSR_PICORVSPI_CFG4_SIZE 1\nstatic inline unsigned char picorvspi_cfg4_read(void) {\n\tunsigned char r = csr_readl(0xe000500cL);\n\treturn r;\n}\nstatic inline void picorvspi_cfg4_write(unsigned char value) {\n\tcsr_writel(value, 0xe000500cL);\n}\n#define CSR_PICORVSPI_CFG4_MEMIO_OFFSET 7\n#define CSR_PICORVSPI_CFG4_MEMIO_SIZE 1\n#define CSR_PICORVSPI_STAT1_ADDR 0xe0005010L\n#define CSR_PICORVSPI_STAT1_SIZE 1\nstatic inline unsigned char picorvspi_stat1_read(void) {\n\tunsigned char r = csr_readl(0xe0005010L);\n\treturn r;\n}\n#define CSR_PICORVSPI_STAT1_BB_IN_OFFSET 0\n#define CSR_PICORVSPI_STAT1_BB_IN_SIZE 4\n#define CSR_PICORVSPI_STAT2_ADDR 0xe0005014L\n#define CSR_PICORVSPI_STAT2_SIZE 1\nstatic inline unsigned char picorvspi_stat2_read(void) {\n\tunsigned char r = csr_readl(0xe0005014L);\n\treturn r;\n}\n#define CSR_PICORVSPI_STAT3_ADDR 0xe0005018L\n#define CSR_PICORVSPI_STAT3_SIZE 1\nstatic inline unsigned char picorvspi_stat3_read(void) {\n\tunsigned char r = csr_readl(0xe0005018L);\n\treturn r;\n}\n#define CSR_PICORVSPI_STAT4_ADDR 0xe000501cL\n#define CSR_PICORVSPI_STAT4_SIZE 1\nstatic inline unsigned char picorvspi_stat4_read(void) {\n\tunsigned char r = csr_readl(0xe000501cL);\n\treturn r;\n}\n\n/* reboot */\n#define CSR_REBOOT_BASE 0xe0006000L\n#define CSR_REBOOT_CTRL_ADDR 0xe0006000L\n#define CSR_REBOOT_CTRL_SIZE 1\nstatic inline unsigned char reboot_ctrl_read(void) {\n\tunsigned char r = csr_readl(0xe0006000L);\n\treturn r;\n}\nstatic inline void reboot_ctrl_write(unsigned char value) {\n\tcsr_writel(value, 0xe0006000L);\n}\n#define CSR_REBOOT_CTRL_IMAGE_OFFSET 0\n#define CSR_REBOOT_CTRL_IMAGE_SIZE 2\n#define CSR_REBOOT_CTRL_KEY_OFFSET 2\n#define CSR_REBOOT_CTRL_KEY_SIZE 6\n#define CSR_REBOOT_ADDR_ADDR 0xe0006004L\n#define CSR_REBOOT_ADDR_SIZE 4\nstatic inline unsigned int reboot_addr_read(void) {\n\tunsigned int r = csr_readl(0xe0006004L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0006008L);\n\tr <<= 8;\n\tr |= csr_readl(0xe000600cL);\n\tr <<= 8;\n\tr |= csr_readl(0xe0006010L);\n\treturn r;\n}\nstatic inline void reboot_addr_write(unsigned int value) {\n\tcsr_writel(value >> 24, 0xe0006004L);\n\tcsr_writel(value >> 16, 0xe0006008L);\n\tcsr_writel(value >> 8, 0xe000600cL);\n\tcsr_writel(value, 0xe0006010L);\n}\n\n/* rgb */\n#define CSR_RGB_BASE 0xe0006800L\n#define CSR_RGB_DAT_ADDR 0xe0006800L\n#define CSR_RGB_DAT_SIZE 1\nstatic inline unsigned char rgb_dat_read(void) {\n\tunsigned char r = csr_readl(0xe0006800L);\n\treturn r;\n}\nstatic inline void rgb_dat_write(unsigned char value) {\n\tcsr_writel(value, 0xe0006800L);\n}\n#define CSR_RGB_ADDR_ADDR 0xe0006804L\n#define CSR_RGB_ADDR_SIZE 1\nstatic inline unsigned char rgb_addr_read(void) {\n\tunsigned char r = csr_readl(0xe0006804L);\n\treturn r;\n}\nstatic inline void rgb_addr_write(unsigned char value) {\n\tcsr_writel(value, 0xe0006804L);\n}\n#define CSR_RGB_CTRL_ADDR 0xe0006808L\n#define CSR_RGB_CTRL_SIZE 1\nstatic inline unsigned char rgb_ctrl_read(void) {\n\tunsigned char r = csr_readl(0xe0006808L);\n\treturn r;\n}\nstatic inline void rgb_ctrl_write(unsigned char value) {\n\tcsr_writel(value, 0xe0006808L);\n}\n#define CSR_RGB_CTRL_EXE_OFFSET 0\n#define CSR_RGB_CTRL_EXE_SIZE 1\n#define CSR_RGB_CTRL_CURREN_OFFSET 1\n#define CSR_RGB_CTRL_CURREN_SIZE 1\n#define CSR_RGB_CTRL_RGBLEDEN_OFFSET 2\n#define CSR_RGB_CTRL_RGBLEDEN_SIZE 1\n#define CSR_RGB_CTRL_RRAW_OFFSET 3\n#define CSR_RGB_CTRL_RRAW_SIZE 1\n#define CSR_RGB_CTRL_GRAW_OFFSET 4\n#define CSR_RGB_CTRL_GRAW_SIZE 1\n#define CSR_RGB_CTRL_BRAW_OFFSET 5\n#define CSR_RGB_CTRL_BRAW_SIZE 1\n#define CSR_RGB_RAW_ADDR 0xe000680cL\n#define CSR_RGB_RAW_SIZE 1\nstatic inline unsigned char rgb_raw_read(void) {\n\tunsigned char r = csr_readl(0xe000680cL);\n\treturn r;\n}\nstatic inline void rgb_raw_write(unsigned char value) {\n\tcsr_writel(value, 0xe000680cL);\n}\n#define CSR_RGB_RAW_R_OFFSET 0\n#define CSR_RGB_RAW_R_SIZE 1\n#define CSR_RGB_RAW_G_OFFSET 1\n#define CSR_RGB_RAW_G_SIZE 1\n#define CSR_RGB_RAW_B_OFFSET 2\n#define CSR_RGB_RAW_B_SIZE 1\n\n/* timer0 */\n#define CSR_TIMER0_BASE 0xe0002800L\n#define CSR_TIMER0_LOAD_ADDR 0xe0002800L\n#define CSR_TIMER0_LOAD_SIZE 4\nstatic inline unsigned int timer0_load_read(void) {\n\tunsigned int r = csr_readl(0xe0002800L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0002804L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0002808L);\n\tr <<= 8;\n\tr |= csr_readl(0xe000280cL);\n\treturn r;\n}\nstatic inline void timer0_load_write(unsigned int value) {\n\tcsr_writel(value >> 24, 0xe0002800L);\n\tcsr_writel(value >> 16, 0xe0002804L);\n\tcsr_writel(value >> 8, 0xe0002808L);\n\tcsr_writel(value, 0xe000280cL);\n}\n#define CSR_TIMER0_RELOAD_ADDR 0xe0002810L\n#define CSR_TIMER0_RELOAD_SIZE 4\nstatic inline unsigned int timer0_reload_read(void) {\n\tunsigned int r = csr_readl(0xe0002810L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0002814L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0002818L);\n\tr <<= 8;\n\tr |= csr_readl(0xe000281cL);\n\treturn r;\n}\nstatic inline void timer0_reload_write(unsigned int value) {\n\tcsr_writel(value >> 24, 0xe0002810L);\n\tcsr_writel(value >> 16, 0xe0002814L);\n\tcsr_writel(value >> 8, 0xe0002818L);\n\tcsr_writel(value, 0xe000281cL);\n}\n#define CSR_TIMER0_EN_ADDR 0xe0002820L\n#define CSR_TIMER0_EN_SIZE 1\nstatic inline unsigned char timer0_en_read(void) {\n\tunsigned char r = csr_readl(0xe0002820L);\n\treturn r;\n}\nstatic inline void timer0_en_write(unsigned char value) {\n\tcsr_writel(value, 0xe0002820L);\n}\n#define CSR_TIMER0_UPDATE_VALUE_ADDR 0xe0002824L\n#define CSR_TIMER0_UPDATE_VALUE_SIZE 1\nstatic inline unsigned char timer0_update_value_read(void) {\n\tunsigned char r = csr_readl(0xe0002824L);\n\treturn r;\n}\nstatic inline void timer0_update_value_write(unsigned char value) {\n\tcsr_writel(value, 0xe0002824L);\n}\n#define CSR_TIMER0_VALUE_ADDR 0xe0002828L\n#define CSR_TIMER0_VALUE_SIZE 4\nstatic inline unsigned int timer0_value_read(void) {\n\tunsigned int r = csr_readl(0xe0002828L);\n\tr <<= 8;\n\tr |= csr_readl(0xe000282cL);\n\tr <<= 8;\n\tr |= csr_readl(0xe0002830L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0002834L);\n\treturn r;\n}\n#define CSR_TIMER0_EV_STATUS_ADDR 0xe0002838L\n#define CSR_TIMER0_EV_STATUS_SIZE 1\nstatic inline unsigned char timer0_ev_status_read(void) {\n\tunsigned char r = csr_readl(0xe0002838L);\n\treturn r;\n}\nstatic inline void timer0_ev_status_write(unsigned char value) {\n\tcsr_writel(value, 0xe0002838L);\n}\n#define CSR_TIMER0_EV_PENDING_ADDR 0xe000283cL\n#define CSR_TIMER0_EV_PENDING_SIZE 1\nstatic inline unsigned char timer0_ev_pending_read(void) {\n\tunsigned char r = csr_readl(0xe000283cL);\n\treturn r;\n}\nstatic inline void timer0_ev_pending_write(unsigned char value) {\n\tcsr_writel(value, 0xe000283cL);\n}\n#define CSR_TIMER0_EV_ENABLE_ADDR 0xe0002840L\n#define CSR_TIMER0_EV_ENABLE_SIZE 1\nstatic inline unsigned char timer0_ev_enable_read(void) {\n\tunsigned char r = csr_readl(0xe0002840L);\n\treturn r;\n}\nstatic inline void timer0_ev_enable_write(unsigned char value) {\n\tcsr_writel(value, 0xe0002840L);\n}\n\n/* touch */\n#define CSR_TOUCH_BASE 0xe0005800L\n#define CSR_TOUCH_O_ADDR 0xe0005800L\n#define CSR_TOUCH_O_SIZE 1\nstatic inline unsigned char touch_o_read(void) {\n\tunsigned char r = csr_readl(0xe0005800L);\n\treturn r;\n}\nstatic inline void touch_o_write(unsigned char value) {\n\tcsr_writel(value, 0xe0005800L);\n}\n#define CSR_TOUCH_O_O_OFFSET 0\n#define CSR_TOUCH_O_O_SIZE 4\n#define CSR_TOUCH_OE_ADDR 0xe0005804L\n#define CSR_TOUCH_OE_SIZE 1\nstatic inline unsigned char touch_oe_read(void) {\n\tunsigned char r = csr_readl(0xe0005804L);\n\treturn r;\n}\nstatic inline void touch_oe_write(unsigned char value) {\n\tcsr_writel(value, 0xe0005804L);\n}\n#define CSR_TOUCH_OE_OE_OFFSET 0\n#define CSR_TOUCH_OE_OE_SIZE 4\n#define CSR_TOUCH_I_ADDR 0xe0005808L\n#define CSR_TOUCH_I_SIZE 1\nstatic inline unsigned char touch_i_read(void) {\n\tunsigned char r = csr_readl(0xe0005808L);\n\treturn r;\n}\n#define CSR_TOUCH_I_I_OFFSET 0\n#define CSR_TOUCH_I_I_SIZE 4\n\n/* usb */\n#define CSR_USB_BASE 0xe0004800L\n#define CSR_USB_PULLUP_OUT_ADDR 0xe0004800L\n#define CSR_USB_PULLUP_OUT_SIZE 1\nstatic inline unsigned char usb_pullup_out_read(void) {\n\tunsigned char r = csr_readl(0xe0004800L);\n\treturn r;\n}\nstatic inline void usb_pullup_out_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004800L);\n}\n#define CSR_USB_ADDRESS_ADDR 0xe0004804L\n#define CSR_USB_ADDRESS_SIZE 1\nstatic inline unsigned char usb_address_read(void) {\n\tunsigned char r = csr_readl(0xe0004804L);\n\treturn r;\n}\nstatic inline void usb_address_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004804L);\n}\n#define CSR_USB_ADDRESS_ADDR_OFFSET 0\n#define CSR_USB_ADDRESS_ADDR_SIZE 7\n#define CSR_USB_NEXT_EV_ADDR 0xe0004808L\n#define CSR_USB_NEXT_EV_SIZE 1\nstatic inline unsigned char usb_next_ev_read(void) {\n\tunsigned char r = csr_readl(0xe0004808L);\n\treturn r;\n}\n#define CSR_USB_NEXT_EV_IN_OFFSET 0\n#define CSR_USB_NEXT_EV_IN_SIZE 1\n#define CSR_USB_NEXT_EV_OUT_OFFSET 1\n#define CSR_USB_NEXT_EV_OUT_SIZE 1\n#define CSR_USB_NEXT_EV_SETUP_OFFSET 2\n#define CSR_USB_NEXT_EV_SETUP_SIZE 1\n#define CSR_USB_NEXT_EV_RESET_OFFSET 3\n#define CSR_USB_NEXT_EV_RESET_SIZE 1\n#define CSR_USB_SETUP_DATA_ADDR 0xe000480cL\n#define CSR_USB_SETUP_DATA_SIZE 1\nstatic inline unsigned char usb_setup_data_read(void) {\n\tunsigned char r = csr_readl(0xe000480cL);\n\treturn r;\n}\n#define CSR_USB_SETUP_DATA_DATA_OFFSET 0\n#define CSR_USB_SETUP_DATA_DATA_SIZE 8\n#define CSR_USB_SETUP_CTRL_ADDR 0xe0004810L\n#define CSR_USB_SETUP_CTRL_SIZE 1\nstatic inline unsigned char usb_setup_ctrl_read(void) {\n\tunsigned char r = csr_readl(0xe0004810L);\n\treturn r;\n}\nstatic inline void usb_setup_ctrl_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004810L);\n}\n#define CSR_USB_SETUP_CTRL_RESET_OFFSET 5\n#define CSR_USB_SETUP_CTRL_RESET_SIZE 1\n#define CSR_USB_SETUP_STATUS_ADDR 0xe0004814L\n#define CSR_USB_SETUP_STATUS_SIZE 1\nstatic inline unsigned char usb_setup_status_read(void) {\n\tunsigned char r = csr_readl(0xe0004814L);\n\treturn r;\n}\n#define CSR_USB_SETUP_STATUS_EPNO_OFFSET 0\n#define CSR_USB_SETUP_STATUS_EPNO_SIZE 4\n#define CSR_USB_SETUP_STATUS_HAVE_OFFSET 4\n#define CSR_USB_SETUP_STATUS_HAVE_SIZE 1\n#define CSR_USB_SETUP_STATUS_PEND_OFFSET 5\n#define CSR_USB_SETUP_STATUS_PEND_SIZE 1\n#define CSR_USB_SETUP_STATUS_IS_IN_OFFSET 6\n#define CSR_USB_SETUP_STATUS_IS_IN_SIZE 1\n#define CSR_USB_SETUP_STATUS_DATA_OFFSET 7\n#define CSR_USB_SETUP_STATUS_DATA_SIZE 1\n#define CSR_USB_SETUP_EV_STATUS_ADDR 0xe0004818L\n#define CSR_USB_SETUP_EV_STATUS_SIZE 1\nstatic inline unsigned char usb_setup_ev_status_read(void) {\n\tunsigned char r = csr_readl(0xe0004818L);\n\treturn r;\n}\nstatic inline void usb_setup_ev_status_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004818L);\n}\n#define CSR_USB_SETUP_EV_PENDING_ADDR 0xe000481cL\n#define CSR_USB_SETUP_EV_PENDING_SIZE 1\nstatic inline unsigned char usb_setup_ev_pending_read(void) {\n\tunsigned char r = csr_readl(0xe000481cL);\n\treturn r;\n}\nstatic inline void usb_setup_ev_pending_write(unsigned char value) {\n\tcsr_writel(value, 0xe000481cL);\n}\n#define CSR_USB_SETUP_EV_ENABLE_ADDR 0xe0004820L\n#define CSR_USB_SETUP_EV_ENABLE_SIZE 1\nstatic inline unsigned char usb_setup_ev_enable_read(void) {\n\tunsigned char r = csr_readl(0xe0004820L);\n\treturn r;\n}\nstatic inline void usb_setup_ev_enable_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004820L);\n}\n#define CSR_USB_IN_DATA_ADDR 0xe0004824L\n#define CSR_USB_IN_DATA_SIZE 1\nstatic inline unsigned char usb_in_data_read(void) {\n\tunsigned char r = csr_readl(0xe0004824L);\n\treturn r;\n}\nstatic inline void usb_in_data_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004824L);\n}\n#define CSR_USB_IN_DATA_DATA_OFFSET 0\n#define CSR_USB_IN_DATA_DATA_SIZE 8\n#define CSR_USB_IN_CTRL_ADDR 0xe0004828L\n#define CSR_USB_IN_CTRL_SIZE 1\nstatic inline unsigned char usb_in_ctrl_read(void) {\n\tunsigned char r = csr_readl(0xe0004828L);\n\treturn r;\n}\nstatic inline void usb_in_ctrl_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004828L);\n}\n#define CSR_USB_IN_CTRL_EPNO_OFFSET 0\n#define CSR_USB_IN_CTRL_EPNO_SIZE 4\n#define CSR_USB_IN_CTRL_RESET_OFFSET 5\n#define CSR_USB_IN_CTRL_RESET_SIZE 1\n#define CSR_USB_IN_CTRL_STALL_OFFSET 6\n#define CSR_USB_IN_CTRL_STALL_SIZE 1\n#define CSR_USB_IN_STATUS_ADDR 0xe000482cL\n#define CSR_USB_IN_STATUS_SIZE 1\nstatic inline unsigned char usb_in_status_read(void) {\n\tunsigned char r = csr_readl(0xe000482cL);\n\treturn r;\n}\n#define CSR_USB_IN_STATUS_IDLE_OFFSET 0\n#define CSR_USB_IN_STATUS_IDLE_SIZE 1\n#define CSR_USB_IN_STATUS_HAVE_OFFSET 4\n#define CSR_USB_IN_STATUS_HAVE_SIZE 1\n#define CSR_USB_IN_STATUS_PEND_OFFSET 5\n#define CSR_USB_IN_STATUS_PEND_SIZE 1\n#define CSR_USB_IN_EV_STATUS_ADDR 0xe0004830L\n#define CSR_USB_IN_EV_STATUS_SIZE 1\nstatic inline unsigned char usb_in_ev_status_read(void) {\n\tunsigned char r = csr_readl(0xe0004830L);\n\treturn r;\n}\nstatic inline void usb_in_ev_status_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004830L);\n}\n#define CSR_USB_IN_EV_PENDING_ADDR 0xe0004834L\n#define CSR_USB_IN_EV_PENDING_SIZE 1\nstatic inline unsigned char usb_in_ev_pending_read(void) {\n\tunsigned char r = csr_readl(0xe0004834L);\n\treturn r;\n}\nstatic inline void usb_in_ev_pending_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004834L);\n}\n#define CSR_USB_IN_EV_ENABLE_ADDR 0xe0004838L\n#define CSR_USB_IN_EV_ENABLE_SIZE 1\nstatic inline unsigned char usb_in_ev_enable_read(void) {\n\tunsigned char r = csr_readl(0xe0004838L);\n\treturn r;\n}\nstatic inline void usb_in_ev_enable_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004838L);\n}\n#define CSR_USB_OUT_DATA_ADDR 0xe000483cL\n#define CSR_USB_OUT_DATA_SIZE 1\nstatic inline unsigned char usb_out_data_read(void) {\n\tunsigned char r = csr_readl(0xe000483cL);\n\treturn r;\n}\n#define CSR_USB_OUT_DATA_DATA_OFFSET 0\n#define CSR_USB_OUT_DATA_DATA_SIZE 8\n#define CSR_USB_OUT_CTRL_ADDR 0xe0004840L\n#define CSR_USB_OUT_CTRL_SIZE 1\nstatic inline unsigned char usb_out_ctrl_read(void) {\n\tunsigned char r = csr_readl(0xe0004840L);\n\treturn r;\n}\nstatic inline void usb_out_ctrl_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004840L);\n}\n#define CSR_USB_OUT_CTRL_EPNO_OFFSET 0\n#define CSR_USB_OUT_CTRL_EPNO_SIZE 4\n#define CSR_USB_OUT_CTRL_ENABLE_OFFSET 4\n#define CSR_USB_OUT_CTRL_ENABLE_SIZE 1\n#define CSR_USB_OUT_CTRL_RESET_OFFSET 5\n#define CSR_USB_OUT_CTRL_RESET_SIZE 1\n#define CSR_USB_OUT_CTRL_STALL_OFFSET 6\n#define CSR_USB_OUT_CTRL_STALL_SIZE 1\n#define CSR_USB_OUT_STATUS_ADDR 0xe0004844L\n#define CSR_USB_OUT_STATUS_SIZE 1\nstatic inline unsigned char usb_out_status_read(void) {\n\tunsigned char r = csr_readl(0xe0004844L);\n\treturn r;\n}\n#define CSR_USB_OUT_STATUS_EPNO_OFFSET 0\n#define CSR_USB_OUT_STATUS_EPNO_SIZE 4\n#define CSR_USB_OUT_STATUS_HAVE_OFFSET 4\n#define CSR_USB_OUT_STATUS_HAVE_SIZE 1\n#define CSR_USB_OUT_STATUS_PEND_OFFSET 5\n#define CSR_USB_OUT_STATUS_PEND_SIZE 1\n#define CSR_USB_OUT_EV_STATUS_ADDR 0xe0004848L\n#define CSR_USB_OUT_EV_STATUS_SIZE 1\nstatic inline unsigned char usb_out_ev_status_read(void) {\n\tunsigned char r = csr_readl(0xe0004848L);\n\treturn r;\n}\nstatic inline void usb_out_ev_status_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004848L);\n}\n#define CSR_USB_OUT_EV_PENDING_ADDR 0xe000484cL\n#define CSR_USB_OUT_EV_PENDING_SIZE 1\nstatic inline unsigned char usb_out_ev_pending_read(void) {\n\tunsigned char r = csr_readl(0xe000484cL);\n\treturn r;\n}\nstatic inline void usb_out_ev_pending_write(unsigned char value) {\n\tcsr_writel(value, 0xe000484cL);\n}\n#define CSR_USB_OUT_EV_ENABLE_ADDR 0xe0004850L\n#define CSR_USB_OUT_EV_ENABLE_SIZE 1\nstatic inline unsigned char usb_out_ev_enable_read(void) {\n\tunsigned char r = csr_readl(0xe0004850L);\n\treturn r;\n}\nstatic inline void usb_out_ev_enable_write(unsigned char value) {\n\tcsr_writel(value, 0xe0004850L);\n}\n#define CSR_USB_OUT_ENABLE_STATUS_ADDR 0xe0004854L\n#define CSR_USB_OUT_ENABLE_STATUS_SIZE 1\nstatic inline unsigned char usb_out_enable_status_read(void) {\n\tunsigned char r = csr_readl(0xe0004854L);\n\treturn r;\n}\n#define CSR_USB_OUT_STALL_STATUS_ADDR 0xe0004858L\n#define CSR_USB_OUT_STALL_STATUS_SIZE 1\nstatic inline unsigned char usb_out_stall_status_read(void) {\n\tunsigned char r = csr_readl(0xe0004858L);\n\treturn r;\n}\n\n/* version */\n#define CSR_VERSION_BASE 0xe0007000L\n#define CSR_VERSION_MAJOR_ADDR 0xe0007000L\n#define CSR_VERSION_MAJOR_SIZE 1\nstatic inline unsigned char version_major_read(void) {\n\tunsigned char r = csr_readl(0xe0007000L);\n\treturn r;\n}\n#define CSR_VERSION_MINOR_ADDR 0xe0007004L\n#define CSR_VERSION_MINOR_SIZE 1\nstatic inline unsigned char version_minor_read(void) {\n\tunsigned char r = csr_readl(0xe0007004L);\n\treturn r;\n}\n#define CSR_VERSION_REVISION_ADDR 0xe0007008L\n#define CSR_VERSION_REVISION_SIZE 1\nstatic inline unsigned char version_revision_read(void) {\n\tunsigned char r = csr_readl(0xe0007008L);\n\treturn r;\n}\n#define CSR_VERSION_GITREV_ADDR 0xe000700cL\n#define CSR_VERSION_GITREV_SIZE 4\nstatic inline unsigned int version_gitrev_read(void) {\n\tunsigned int r = csr_readl(0xe000700cL);\n\tr <<= 8;\n\tr |= csr_readl(0xe0007010L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0007014L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0007018L);\n\treturn r;\n}\n#define CSR_VERSION_GITEXTRA_ADDR 0xe000701cL\n#define CSR_VERSION_GITEXTRA_SIZE 2\nstatic inline unsigned short int version_gitextra_read(void) {\n\tunsigned short int r = csr_readl(0xe000701cL);\n\tr <<= 8;\n\tr |= csr_readl(0xe0007020L);\n\treturn r;\n}\n#define CSR_VERSION_DIRTY_ADDR 0xe0007024L\n#define CSR_VERSION_DIRTY_SIZE 1\nstatic inline unsigned char version_dirty_read(void) {\n\tunsigned char r = csr_readl(0xe0007024L);\n\treturn r;\n}\n#define CSR_VERSION_DIRTY_DIRTY_OFFSET 0\n#define CSR_VERSION_DIRTY_DIRTY_SIZE 1\n#define CSR_VERSION_MODEL_ADDR 0xe0007028L\n#define CSR_VERSION_MODEL_SIZE 1\nstatic inline unsigned char version_model_read(void) {\n\tunsigned char r = csr_readl(0xe0007028L);\n\treturn r;\n}\n#define CSR_VERSION_MODEL_MODEL_OFFSET 0\n#define CSR_VERSION_MODEL_MODEL_SIZE 8\n#define CSR_VERSION_SEED_ADDR 0xe000702cL\n#define CSR_VERSION_SEED_SIZE 4\nstatic inline unsigned int version_seed_read(void) {\n\tunsigned int r = csr_readl(0xe000702cL);\n\tr <<= 8;\n\tr |= csr_readl(0xe0007030L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0007034L);\n\tr <<= 8;\n\tr |= csr_readl(0xe0007038L);\n\treturn r;\n}\n\n/* constants */\n#define TIMER0_INTERRUPT 2\nstatic inline int timer0_interrupt_read(void) {\n\treturn 2;\n}\n#define USB_INTERRUPT 3\nstatic inline int usb_interrupt_read(void) {\n\treturn 3;\n}\n#define CONFIG_BITSTREAM_SYNC_HEADER1 2123999870\nstatic inline int config_bitstream_sync_header1_read(void) {\n\treturn 2123999870;\n}\n#define CONFIG_BITSTREAM_SYNC_HEADER2 2125109630\nstatic inline int config_bitstream_sync_header2_read(void) {\n\treturn 2125109630;\n}\n#define CONFIG_CLOCK_FREQUENCY 12000000\nstatic inline int config_clock_frequency_read(void) {\n\treturn 12000000;\n}\n#define CONFIG_CPU_RESET_ADDR 0\nstatic inline int config_cpu_reset_addr_read(void) {\n\treturn 0;\n}\n#define CONFIG_CPU_TYPE \"VEXRISCV\"\nstatic inline const char * config_cpu_type_read(void) {\n\treturn \"VEXRISCV\";\n}\n#define CONFIG_CPU_TYPE_VEXRISCV 1\nstatic inline int config_cpu_type_vexriscv_read(void) {\n\treturn 1;\n}\n#define CONFIG_CPU_VARIANT \"MIN\"\nstatic inline const char * config_cpu_variant_read(void) {\n\treturn \"MIN\";\n}\n#define CONFIG_CPU_VARIANT_MIN 1\nstatic inline int config_cpu_variant_min_read(void) {\n\treturn 1;\n}\n#define CONFIG_CSR_ALIGNMENT 32\nstatic inline int config_csr_alignment_read(void) {\n\treturn 32;\n}\n#define CONFIG_CSR_DATA_WIDTH 8\nstatic inline int config_csr_data_width_read(void) {\n\treturn 8;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/fomu/include/hw/common.h",
    "content": "#ifndef _HW_COMMON_H_\n#define _HW_COMMON_H_\n#include <stdint.h>\nstatic inline void csr_writeb(uint8_t value, uint32_t addr)\n{\n\t*((volatile uint8_t *)addr) = value;\n}\n\nstatic inline uint8_t csr_readb(uint32_t addr)\n{\n\treturn *(volatile uint8_t *)addr;\n}\n\nstatic inline void csr_writew(uint16_t value, uint32_t addr)\n{\n\t*((volatile uint16_t *)addr) = value;\n}\n\nstatic inline uint16_t csr_readw(uint32_t addr)\n{\n\treturn *(volatile uint16_t *)addr;\n}\n\nstatic inline void csr_writel(uint32_t value, uint32_t addr)\n{\n\t*((volatile uint32_t *)addr) = value;\n}\n\nstatic inline uint32_t csr_readl(uint32_t addr)\n{\n\treturn *(volatile uint32_t *)addr;\n}\n#endif /* _HW_COMMON_H_ */\n"
  },
  {
    "path": "hw/bsp/fomu/include/irq.h",
    "content": "#ifndef __IRQ_H\n#define __IRQ_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n#define CSR_MSTATUS_MIE 0x8\n\n#define CSR_IRQ_MASK 0xBC0\n#define CSR_IRQ_PENDING 0xFC0\n\n#define CSR_DCACHE_INFO 0xCC0\n\n#define csrr(reg) ({ unsigned long __tmp; \\\n  asm volatile (\"csrr %0, \" #reg : \"=r\"(__tmp)); \\\n  __tmp; })\n\n#define csrw(reg, val) ({ \\\n  if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \\\n\tasm volatile (\"csrw \" #reg \", %0\" :: \"i\"(val)); \\\n  else \\\n\tasm volatile (\"csrw \" #reg \", %0\" :: \"r\"(val)); })\n\n#define csrs(reg, bit) ({ \\\n  if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \\\n\tasm volatile (\"csrrs x0, \" #reg \", %0\" :: \"i\"(bit)); \\\n  else \\\n\tasm volatile (\"csrrs x0, \" #reg \", %0\" :: \"r\"(bit)); })\n\n#define csrc(reg, bit) ({ \\\n  if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \\\n\tasm volatile (\"csrrc x0, \" #reg \", %0\" :: \"i\"(bit)); \\\n  else \\\n\tasm volatile (\"csrrc x0, \" #reg \", %0\" :: \"r\"(bit)); })\n\nstatic inline unsigned int irq_getie(void)\n{\n\treturn (csrr(mstatus) & CSR_MSTATUS_MIE) != 0;\n}\n\nstatic inline void irq_setie(unsigned int ie)\n{\n\tif(ie) csrs(mstatus,CSR_MSTATUS_MIE); else csrc(mstatus,CSR_MSTATUS_MIE);\n}\n\nstatic inline unsigned int irq_getmask(void)\n{\n\tunsigned int mask;\n\tasm volatile (\"csrr %0, %1\" : \"=r\"(mask) : \"i\"(CSR_IRQ_MASK));\n\treturn mask;\n}\n\nstatic inline void irq_setmask(unsigned int mask)\n{\n\tasm volatile (\"csrw %0, %1\" :: \"i\"(CSR_IRQ_MASK), \"r\"(mask));\n}\n\nstatic inline unsigned int irq_pending(void)\n{\n\tunsigned int pending;\n\tasm volatile (\"csrr %0, %1\" : \"=r\"(pending) : \"i\"(CSR_IRQ_PENDING));\n\treturn pending;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __IRQ_H */\n"
  },
  {
    "path": "hw/bsp/fomu/output_format.ld",
    "content": "OUTPUT_FORMAT(\"elf32-littleriscv\")\n"
  },
  {
    "path": "hw/bsp/fomu/regions.ld",
    "content": "MEMORY {\n\tcsr : ORIGIN = 0x60000000, LENGTH = 0x01000000\n\tvexriscv_debug : ORIGIN = 0xf00f0000, LENGTH = 0x00000100\n\tsram : ORIGIN = 0x10000000, LENGTH = 0x00020000\n\trom : ORIGIN = 0x00000000, LENGTH = 0x00002000\n}\n"
  },
  {
    "path": "hw/bsp/ft9xx/boards/mm900evxb/board.cmake",
    "content": "function(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __FT900__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ft9xx/boards/mm900evxb/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright 2021 Bridgetek Pte Ltd\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MM900EVxB\n   url: https://brtchip.com/product/mm900ev1b\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n// Note: This definition file covers all MM900EV1B, MM900EV2B, MM900EV3B,\n// MM900EV-Lite boards.\n// Each of these boards has an FT900 device.\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART to use on this board.\n#ifndef BOARD_UART\n#define BOARD_UART UART0\n#endif\n\n// UART is on connector CN1.\n#ifndef BOARD_GPIO_UART0_TX\n#define BOARD_GPIO_UART0_TX 48 // Pin 4 of CN1.\n#endif\n#ifndef BOARD_GPIO_UART0_RX\n#define BOARD_GPIO_UART0_RX 49 // Pin 6 of CN1.\n#endif\n\n// LED is connected to pins 17 (signal) and 15 (GND) of CN1.\n#ifndef BOARD_GPIO_LED\n#define BOARD_GPIO_LED 35\n#endif\n#ifndef BOARD_GPIO_LED_STATE_ON\n#define BOARD_GPIO_LED_STATE_ON 1\n#endif\n// Button is connected to pins 13 (signal) and 15 (GND) of CN1.\n#ifndef BOARD_GPIO_BUTTON\n#define BOARD_GPIO_BUTTON 56\n#endif\n// Button is pulled up and grounded for active.\n#ifndef BOARD_GPIO_BUTTON_STATE_ACTIVE\n#define BOARD_GPIO_BUTTON_STATE_ACTIVE 0\n#endif\n\n// Enable the Remote Wakeup signalling.\n// Remote wakeup is wired to pin 40 of CN1.\n#ifndef BOARD_GPIO_REMOTE_WAKEUP\n#define BOARD_GPIO_REMOTE_WAKEUP 18\n#endif\n\n// USB VBus signal is connected directly to the FT900.\n#ifndef BOARD_USBD_VBUS_DTC_PIN\n#define BOARD_USBD_VBUS_DTC_PIN 3\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ft9xx/boards/mm900evxb/board.mk",
    "content": "CFLAGS += -D__FT900__\n"
  },
  {
    "path": "hw/bsp/ft9xx/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright 2021 Bridgetek Pte Ltd\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Bridgetek\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n#include <ft900.h>\n#include <registers/ft900_registers.h>\n\n#if CFG_TUD_ENABLED\nint8_t board_ft9xx_vbus(void); // Board specific implementation of VBUS detection for USB device.\nextern void ft9xx_usbd_pm_ISR(uint16_t pmcfg); // Interrupt handler for USB device power management\n#endif\n\n#ifdef BOARD_GPIO_REMOTE_WAKEUP\nvoid gpio_ISR(void);\n#endif\nvoid timer_ISR(void);\nvolatile unsigned int timer_ms = 0;\nvoid board_pm_ISR(void);\n\n#define WELCOME_MSG \"\\x1B[2J\\x1B[H\" \\\n                    \"MM900EVxB board\\r\\n\"\n\n// Initialize on-board peripherals : led, button, uart and USB\nvoid board_init(void)\n{\n\tsys_reset_all();\n\n    // Enable the UART Device.\n    sys_enable(sys_device_uart0);\n    // Set BOARD_UART GPIO function pins for TXD and RXD.\n#ifdef BOARD_GPIO_UART_TX\n    gpio_function(BOARD_GPIO_UART_TX, pad_uart0_txd); /* UART0 TXD */\n#endif\n#ifdef BOARD_GPIO_UART_RX\n    gpio_function(BOARD_GPIO_UART_RX, pad_uart0_rxd); /* UART0 RXD */\n#endif\n    uart_open(BOARD_UART,                             /* Device */\n              1,                                 /* Prescaler = 1 */\n              UART_DIVIDER_19200_BAUD,           /* Divider = 1302 */\n              uart_data_bits_8,                  /* No. Data Bits */\n              uart_parity_none,                  /* Parity */\n              uart_stop_bits_1);                 /* No. Stop Bits */\n\t// Print out a welcome message.\n    // Use sizeof to avoid pulling in strlen unnecessarily.\n    board_uart_write(WELCOME_MSG, sizeof(WELCOME_MSG));\n\n#ifdef BOARD_GPIO_LED\n    gpio_function(BOARD_GPIO_LED, pad_func_0);\n    gpio_idrive(BOARD_GPIO_LED, pad_drive_12mA);\n    gpio_dir(BOARD_GPIO_LED, pad_dir_output);\n#endif\n\n#ifdef BOARD_GPIO_BUTTON\n    gpio_function(BOARD_GPIO_BUTTON, pad_func_0);\n    // Pull up if active low. Down if active high.\n    gpio_pull(BOARD_GPIO_BUTTON, (BOARD_GPIO_BUTTON_STATE_ACTIVE == 0)?pad_pull_pullup:pad_pull_pulldown);\n    gpio_dir(BOARD_GPIO_BUTTON, pad_dir_input);\n#endif\n\n\tsys_enable(sys_device_timer_wdt);\n\t/* Timer A = 1ms */\n\ttimer_prescaler(timer_select_a, 1000);\n\ttimer_init(timer_select_a, 100, timer_direction_down, timer_prescaler_select_on, timer_mode_continuous);\n\ttimer_enable_interrupt(timer_select_a);\n\ttimer_start(timer_select_a);\n\tinterrupt_attach(interrupt_timers, (int8_t)interrupt_timers, timer_ISR);\n\n    // Setup VBUS detect GPIO. If the device is connected then this\n    // will set the MASK_SYS_PMCFG_DEV_DETECT_EN bit in PMCFG.\n    gpio_interrupt_disable(BOARD_USBD_VBUS_DTC_PIN);\n    gpio_function(BOARD_USBD_VBUS_DTC_PIN, pad_vbus_dtc);\n    gpio_pull(BOARD_USBD_VBUS_DTC_PIN, pad_pull_pulldown);\n    gpio_dir(BOARD_USBD_VBUS_DTC_PIN, pad_dir_input);\n\n    interrupt_attach(interrupt_0, (int8_t)interrupt_0, board_pm_ISR);\n\n#ifdef BOARD_GPIO_REMOTE_WAKEUP\n    // Configuring GPIO pin to wakeup.\n    // Set up the wakeup pin.\n    gpio_dir(BOARD_GPIO_REMOTE_WAKEUP, pad_dir_input);\n    gpio_pull(BOARD_GPIO_REMOTE_WAKEUP, pad_pull_pullup);\n\n    // Attach an interrupt handler.\n    interrupt_attach(interrupt_gpio, (uint8_t)interrupt_gpio, gpio_ISR);\n    gpio_interrupt_enable(BOARD_GPIO_REMOTE_WAKEUP, gpio_int_edge_falling);\n#endif\n\n\tuart_disable_interrupt(BOARD_UART, uart_interrupt_tx);\n\tuart_disable_interrupt(BOARD_UART, uart_interrupt_rx);\n\n    // Enable all peripheral interrupts.\n    interrupt_enable_globally();\n\n    TU_LOG1(\"MM900EV1B board setup complete\\r\\n\");\n};\n\nvoid timer_ISR(void)\n{\n    if (timer_is_interrupted(timer_select_a))\n    {\n        timer_ms++;\n    }\n}\n\n#ifdef BOARD_GPIO_REMOTE_WAKEUP\nvoid gpio_ISR(void)\n{\n    if (gpio_is_interrupted(BOARD_GPIO_REMOTE_WAKEUP))\n    {\n    }\n}\n#endif\n\n/* Power management ISR */\nvoid board_pm_ISR(void)\n{\n    uint16_t pmcfg = SYS->PMCFG_H;\n\n#if defined(__FT930__)\n    if (pmcfg & MASK_SYS_PMCFG_SLAVE_PERI_IRQ_PEND)\n    {\n        // Clear d2xx hw engine wakeup.\n        SYS->PMCFG_H = MASK_SYS_PMCFG_SLAVE_PERI_IRQ_PEND;\n    }\n#endif\n    if (pmcfg & MASK_SYS_PMCFG_PM_GPIO_IRQ_PEND)\n    {\n        // Clear GPIO wakeup pending.\n        SYS->PMCFG_H = MASK_SYS_PMCFG_PM_GPIO_IRQ_PEND;\n    }\n\n#if defined(__FT900__)\n    // USB device power management interrupts.\n    if (pmcfg & (MASK_SYS_PMCFG_DEV_CONN_DEV |\n              MASK_SYS_PMCFG_DEV_DIS_DEV |\n              MASK_SYS_PMCFG_HOST_RST_DEV |\n              MASK_SYS_PMCFG_HOST_RESUME_DEV)\n    )\n    {\n#if CFG_TUD_ENABLED\n        ft9xx_usbd_pm_ISR(pmcfg);\n#endif\n    }\n#endif\n}\n\n#if CFG_TUD_ENABLED\nint8_t board_ft9xx_vbus(void)\n{\n\treturn gpio_read(BOARD_USBD_VBUS_DTC_PIN);\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\n// Turn LED on or off\nvoid board_led_write(bool state)\n{\n#ifdef BOARD_GPIO_LED\n    gpio_write(BOARD_GPIO_LED, (state == 0)?(BOARD_GPIO_LED_STATE_ON?0:1):BOARD_GPIO_LED_STATE_ON);\n#endif\n}\n\n// Get the current state of button\n// a '1' means active (pressed), a '0' means inactive.\nuint32_t board_button_read(void)\n{\n    uint32_t state = 0;\n#ifdef BOARD_GPIO_BUTTON\n    state = (gpio_read(BOARD_GPIO_BUTTON) == BOARD_GPIO_BUTTON_STATE_ACTIVE)?1:0;\n#endif\n    return state;\n}\n\n// Get characters from UART\nint board_uart_read(uint8_t *buf, int len)\n{\n    int r = 0;\n\n#ifdef BOARD_UART\n    if (uart_rx_has_data(BOARD_UART))\n    {\n        r = uart_readn(BOARD_UART, (uint8_t *)buf, len);\n    }\n#endif\n\n    return r;\n}\n\n// Send characters to UART\nint board_uart_write(void const *buf, int len)\n{\n    int r = 0;\n\n#ifdef BOARD_UART\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\" // uart_writen does not have const for buffer parameter.\n    r = uart_writen(BOARD_UART, (uint8_t *)((const void *)buf), len);\n#pragma GCC diagnostic pop\n#endif\n\n    return r;\n}\n\n// Get current milliseconds\nuint32_t tusb_time_millis_api(void)\n{\n    uint32_t safe_ms;\n\n    CRITICAL_SECTION_BEGIN\n    safe_ms = timer_ms;\n    CRITICAL_SECTION_END\n\n    return safe_ms;\n}\n\n// Restart the program\n// Called in the event of a watchdog timeout\nvoid chip_reboot(void)\n{\n    // SOFT reset\n    __asm__(\"call 0\");\n #if 0\n    // HARD reset\n    // Initiates data transfer from Flash Memory to Data Memory (DBG_CMDF2D3)\n    // followed by a system reboot\n \tdbg_memory_copy(0xfe, 0, 0, 255);\n#endif\n}\n"
  },
  {
    "path": "hw/bsp/ft9xx/family.cmake",
    "content": "include_guard()\n\nset(FT9XX_SDK ${TOP}/hw/mcu/bridgetek/ft9xx/ft90x-sdk/Source)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU ft32 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/ft32_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS FT90X CACHE INTERNAL \"\")\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${FT9XX_SDK}/src/sys.c\n    ${FT9XX_SDK}/src/interrupt.c\n    ${FT9XX_SDK}/src/delay.c\n    ${FT9XX_SDK}/src/timers.c\n    ${FT9XX_SDK}/src/uart_simple.c\n    ${FT9XX_SDK}/src/gpio.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${FT9XX_SDK}/include\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n    )\n  target_compile_options(${BOARD_TARGET} PUBLIC\n    -fmessage-length=0\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_FT90X)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/bridgetek/ft9xx/dcd_ft9xx.c\n    ${FT9XX_SDK}/src/bootstrap.c\n    )\n  set_source_files_properties(${FT9XX_SDK}/src/bootstrap.c PROPERTIES\n    COMPILE_OPTIONS \"-w\")\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n  target_compile_options(${TARGET} PUBLIC\n    -Wno-error=shadow\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${TOP}/hw/mcu/bridgetek/ft9xx/scripts/ldscript.ld\"\n      \"LINKER:--entry=_start\"\n      )\n  endif ()\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_ft9xx(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ft9xx/family.mk",
    "content": "# GCC prefix for FT90X compile tools.\nCROSS_COMPILE = ft32-elf-\nSKIP_NANOLIB = 1\n\n# Set to use FT90X prebuilt libraries.\nFT9XX_PREBUILT_LIBS = 0\nifeq ($(FT9XX_PREBUILT_LIBS),1)\n# If the FT90X toolchain is installed on Windows systems then the SDK\n# include files and prebuilt libraries are at: %FT90X_TOOLCHAIN%/hardware\nFT9XX_SDK = $(FT90X_TOOLCHAIN)/hardware\nINC += \"$(FT9XX_SDK)/include\"\nelse\n# The submodule BRTSG-FOSS/ft90x-sdk contains header files and source\n# code for the Bridgetek SDK. This can be used instead of the prebuilt\n# library.\n# The SDK can be used to load specific files from the Bridgetek SDK.\nFT9XX_SDK = hw/mcu/bridgetek/ft9xx/ft90x-sdk/Source\nINC += \"$(TOP)/$(FT9XX_SDK)/include\"\nendif\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\n# Add include files which are within the TinyUSB directory structure.\nINC += \\\n\t$(TOP)/$(BOARD_PATH)\n\n# Add required C Compiler flags for FT9XX.\nCFLAGS += \\\n\t-fvar-tracking \\\n\t-fvar-tracking-assignments \\\n\t-fmessage-length=0 \\\n\t-ffunction-sections \\\n\t-DCFG_TUSB_MCU=OPT_MCU_FT90X\n\n# Maximum USB device speed supported by the board\nCFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n\n# lwip/src/core/raw.c:334:43: error: declaration of 'recv' shadows a global declaration\nCFLAGS += -Wno-error=shadow\n\n# Set Linker flags.\nLD_FILE = hw/mcu/bridgetek/ft9xx/scripts/ldscript.ld\nLDFLAGS += $(addprefix -L,$(LDINC)) \\\n\t-Xlinker --entry=_start \\\n\t-Wl,-lc\n\n# Additional Source files for FT90X.\nSRC_C += src/portable/bridgetek/ft9xx/dcd_ft9xx.c\n\n# Linker library.\nifneq ($(FT9XX_PREBUILT_LIBS),1)\n# Optionally add in files from the Bridgetek SDK instead of the prebuilt\n# library. These are the minimum required.\nSRC_C += $(FT9XX_SDK)/src/bootstrap.c\nSRC_C += $(FT9XX_SDK)/src/sys.c\nSRC_C += $(FT9XX_SDK)/src/interrupt.c\nSRC_C += $(FT9XX_SDK)/src/delay.c\nSRC_C += $(FT9XX_SDK)/src/timers.c\nSRC_C += $(FT9XX_SDK)/src/uart_simple.c\nSRC_C += $(FT9XX_SDK)/src/gpio.c\nelse\n# Or if using the prebuilt libraries add them.\nLDFLAGS += -L\"$(FT9XX_SDK)/lib\"\nLIBS += -lft900\nendif\n\n# Not required crt0 file for FT90X. Use compiler built-in file.\n#SRC_S += hw/mcu/bridgetek/ft9xx/scripts/crt0.S\n\n# Flash using FT9xxProg, need to remove kernal's ftdi_sio and bind D2XX drivers\n# sudo rmmod ftdi_sio && for i in 0 1 2 3; do sudo sh -c \"echo 3-3.4:1.$i > /sys/bus/usb/drivers/ftdi_sio/unbind\" 2>/dev/null; done\nFT9XXPROG ?= FT9xxProg\nflash: flash-ft9xx\nflash-ft9xx: $(BUILD)/$(PROJECT).bin\n\t$(FT9XXPROG) -f $<\n"
  },
  {
    "path": "hw/bsp/gd32vf103/boards/sipeed_longan_nano/board.cmake",
    "content": "set(JLINK_DEVICE gd32vf103cbt6)\n\nset(SDK_BSP_DIR ${SOC_DIR}/Board/gd32vf103c_longan_nano)\nset(LD_FILE_GNU ${SDK_BSP_DIR}/Source/GCC/gcc_gd32vf103xb_flashxip.ld)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${SDK_BSP_DIR}/Source/gd32vf103c_longan_nano.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${SDK_BSP_DIR}/Include\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/gd32vf103/boards/sipeed_longan_nano/board.h",
    "content": "/* metadata:\n   name: Sipeed Longan Nano\n   url: https://longan.sipeed.com/en/\n*/\n\n#ifndef _NUCLEI_SDK_HAL_H\n#define _NUCLEI_SDK_HAL_H\n\n#include \"gd32vf103c_longan_nano.h\"\n\n// 4 bits for interrupt level, 0 for priority.\n// level 0 = lowest priority, level 15 = highest priority.\n#define __ECLIC_INTCTLBITS  4\n\n#define __SYSTEM_CLOCK      72000000\n#define HXTAL_VALUE         ((uint32_t)8000000)\n\n#define SOC_DEBUG_UART      GD32_COM0\n\n#define DBG_KEY_UNLOCK      0x4B5A6978\n#define DBG_CMD_RESET       0x1\n#define DBG_KEY             REG32(DBG + 0x0C)\n#define DBG_CMD             REG32(DBG + 0x08)\n\n#endif\n"
  },
  {
    "path": "hw/bsp/gd32vf103/boards/sipeed_longan_nano/board.mk",
    "content": "LONGAN_NANO_SDK_BSP = $(GD32VF103_SDK_SOC)/Board/gd32vf103c_longan_nano\nLINKER_SCRIPTS = $(LONGAN_NANO_SDK_BSP)/Source/GCC\n\n# All source paths should be relative to the top level.\nLD_FILE = $(LINKER_SCRIPTS)/gcc_gd32vf103xb_flashxip.ld # Longan Nano 128k ROM 32k RAM\n#LD_FILE = $(LINKER_SCRIPTS)/gcc_gd32vf103x8_flashxip.ld # Longan Nano Lite 64k ROM 20k RAM\n\nSRC_C += $(LONGAN_NANO_SDK_BSP)/Source/gd32vf103c_longan_nano.c\nINC += $(TOP)/$(LONGAN_NANO_SDK_BSP)/Include\n\n# Longan Nano 128k ROM 32k RAM\nJLINK_DEVICE = gd32vf103cbt6\n"
  },
  {
    "path": "hw/bsp/gd32vf103/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: GigaDevice\n*/\n\n#include \"drv_usb_hw.h\"\n#include \"drv_usb_dev.h\"\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\nvoid USBFS_IRQHandler(void) { tud_int_handler(0); }\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n#define USB_NO_VBUS_PIN\n\n// According to GD32VF103 user manual clock tree:\n// Systick clock = AHB clock / 4.\n#define TIMER_TICKS         ((SystemCoreClock / 4) / 1000)\n\n#define BUTTON_PORT         GPIOA\n#define BUTTON_PIN          GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE 1\n\n#define UART_DEV            SOC_DEBUG_UART\n\n#define LED_PIN             LED_R\n\nvoid board_init(void) {\n  /* Disable interrupts during init */\n  __disable_irq();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(TIMER_TICKS);\n#endif\n\n  rcu_periph_clock_enable(RCU_GPIOA);\n  rcu_periph_clock_enable(RCU_GPIOB);\n  rcu_periph_clock_enable(RCU_GPIOC);\n  rcu_periph_clock_enable(RCU_GPIOD);\n  rcu_periph_clock_enable(RCU_AF);\n\n#ifdef BUTTON_PIN\n  gpio_init(BUTTON_PORT, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, BUTTON_PIN);\n#endif\n\n#ifdef LED_PIN\n  gd_led_init(LED_PIN);\n#endif\n\n#if defined(UART_DEV)\n  gd_com_init(UART_DEV);\n#endif\n\n  /* USB D+ and D- pins don't need to be configured. */\n  /* Configure VBUS Pin */\n#ifndef USB_NO_VBUS_PIN\n  gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_9);\n#endif\n\n  /* This for ID line debug */\n  // gpio_init(GPIOA, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_10);\n\n  /* Enable USB OTG clock */\n  usb_rcu_config();\n\n  /* Reset USB OTG peripheral */\n  rcu_periph_reset_enable(RCU_USBFSRST);\n  rcu_periph_reset_disable(RCU_USBFSRST);\n\n  /* Configure USBFS IRQ */\n  ECLIC_Register_IRQ(USBFS_IRQn, ECLIC_NON_VECTOR_INTERRUPT,\n                     ECLIC_POSTIVE_EDGE_TRIGGER, 3, 0, NULL);\n\n  /* Retrieve otg core registers */\n  usb_gr* otg_core_regs = (usb_gr*)(USBFS_REG_BASE + USB_REG_OFFSET_CORE);\n\n#ifdef USB_NO_VBUS_PIN\n  /* Disable VBUS sense*/\n  otg_core_regs->GCCFG |= GCCFG_VBUSIG | GCCFG_PWRON | GCCFG_VBUSBCEN;\n#else\n  /* Enable VBUS sense via pin PA9 */\n  otg_core_regs->GCCFG |= GCCFG_VBUSIG | GCCFG_PWRON | GCCFG_VBUSBCEN;\n  otg_core_regs->GCCFG &= ~GCCFG_VBUSIG;\n#endif\n\n  /* Enable interrupts globally */\n  __enable_irq();\n}\n\nvoid gd32vf103_reset(void) {\n  /* The MTIMER unit of the GD32VF103 doesn't have the MSFRST\n   * register to generate a software reset request.\n   * BUT instead two undocumented registers in the debug peripheral\n   * that allow issuing a software reset.\n   * https://github.com/esmil/gd32vf103inator/blob/master/include/gd32vf103/dbg.h\n   */\n  DBG_KEY = DBG_KEY_UNLOCK;\n  DBG_CMD = DBG_CMD_RESET;\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  state ? gd_led_on(LED_PIN) : gd_led_off(LED_PIN);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == gpio_input_bit_get(BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n#if defined(UART_DEV)\n  int rxsize = len;\n  while (rxsize--) {\n    *(uint8_t*)buf = usart_read(UART_DEV);\n    buf++;\n  }\n  return len;\n#else\n  (void)buf;\n  (void)len;\n  return 0;\n#endif\n}\n\nint board_uart_write(void const* buf, int len) {\n#if defined(UART_DEV)\n  int txsize = len;\n  while (txsize--) {\n    usart_write(UART_DEV, *(uint8_t const*)buf);\n    buf++;\n  }\n  return len;\n#else\n  (void)buf;\n  (void)len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid eclic_mtip_handler(void) {\n  system_ticks++;\n  SysTick_Reload(TIMER_TICKS);\n}\nuint32_t tusb_time_millis_api(void) { return system_ticks; }\n#endif\n\n#ifdef USE_FULL_ASSERT\n/**\n * @brief  Reports the name of the source file and the source line number\n *         where the assert_param error has occurred.\n * @param  file: pointer to the source file name\n * @param  line: assert_param error line source number\n * @retval None\n */\nvoid assert_failed(char* file, uint32_t line) {\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line\n     number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line)\n   */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n"
  },
  {
    "path": "hw/bsp/gd32vf103/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/gd/nuclei-sdk)\nset(SOC_DIR ${SDK_DIR}/SoC/gd32vf103)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS GD32VF103 CACHE INTERNAL \"\")\n\nset(JLINK_IF jtag)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nmessage(FATAL_ERROR \"LD_FILE_GNU is not defined\")\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED STARTUP_FILE_GNU)\nset(STARTUP_FILE_GNU\n${SOC_DIR}/Common/Source/GCC/startup_gd32vf103.S\n${SOC_DIR}/Common/Source/GCC/intexc_gd32vf103.S\n)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/system_gd32vf103.c\n    ${SOC_DIR}/Common/Source/Drivers/gd32vf103_rcu.c\n    ${SOC_DIR}/Common/Source/Drivers/gd32vf103_gpio.c\n    ${SOC_DIR}/Common/Source/Drivers/Usb/gd32vf103_usb_hw.c\n    ${SOC_DIR}/Common/Source/Drivers/gd32vf103_usart.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/NMSIS/Core/Include\n    ${SOC_DIR}/Common/Include\n    ${SOC_DIR}/Common/Include/Usb\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    DOWNLOAD_MODE=DOWNLOAD_MODE_FLASHXIP\n    )\n\n  update_board(${BOARD_TARGET})\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${BOARD_TARGET} PUBLIC\n      -mcmodel=medlow\n      -mstrict-align\n      )\n  endif ()\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_GD32VF103)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${SOC_DIR}/Common/Source/Stubs/sbrk.c\n    ${SOC_DIR}/Common/Source/Stubs/close.c\n    ${SOC_DIR}/Common/Source/Stubs/isatty.c\n    ${SOC_DIR}/Common/Source/Stubs/fstat.c\n    ${SOC_DIR}/Common/Source/Stubs/lseek.c\n    ${SOC_DIR}/Common/Source/Stubs/read.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    message(FATAL_ERROR \"Clang is not supported\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(\n      ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n      ${SOC_DIR}/Common/Source/Stubs/sbrk.c\n      ${SOC_DIR}/Common/Source/Stubs/close.c\n      ${SOC_DIR}/Common/Source/Stubs/isatty.c\n      ${SOC_DIR}/Common/Source/Stubs/fstat.c\n      ${SOC_DIR}/Common/Source/Stubs/lseek.c\n      ${SOC_DIR}/Common/Source/Stubs/read.c\n      PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\"\n    )\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/gd32vf103/family.mk",
    "content": "# https://www.embecosm.com/resources/tool-chain-downloads/#riscv-stable\n#CROSS_COMPILE ?= riscv32-unknown-elf-\n\n# Toolchain from https://nucleisys.com/download.php\n#CROSS_COMPILE ?= riscv-nuclei-elf-\n\n# Toolchain from https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack\nCROSS_COMPILE ?= riscv-none-elf-\n\n# Submodules\nNUCLEI_SDK = hw/mcu/gd/nuclei-sdk\n\n# Nuclei-SDK paths\nGD32VF103_SDK_SOC = $(NUCLEI_SDK)/SoC/gd32vf103\nGD32VF103_SDK_DRIVER = $(GD32VF103_SDK_SOC)/Common/Source/Drivers\nLIBC_STUBS = $(GD32VF103_SDK_SOC)/Common/Source/Stubs\nSTARTUP_ASM = $(GD32VF103_SDK_SOC)/Common/Source/GCC\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= rv32imac-ilp32\n\nCFLAGS += \\\n\t-mcmodel=medlow \\\n\t-mstrict-align \\\n\t-nostdlib -nostartfiles \\\n\t-DCFG_TUSB_MCU=OPT_MCU_GD32VF103 \\\n\t-DDOWNLOAD_MODE=DOWNLOAD_MODE_FLASHXIP\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(GD32VF103_SDK_DRIVER)/gd32vf103_gpio.c \\\n\t$(GD32VF103_SDK_DRIVER)/gd32vf103_rcu.c \\\n\t$(GD32VF103_SDK_DRIVER)/gd32vf103_usart.c \\\n\t$(GD32VF103_SDK_DRIVER)/Usb/gd32vf103_usb_hw.c \\\n\t$(LIBC_STUBS)/sbrk.c \\\n\t$(LIBC_STUBS)/close.c \\\n\t$(LIBC_STUBS)/isatty.c \\\n\t$(LIBC_STUBS)/fstat.c \\\n\t$(LIBC_STUBS)/lseek.c \\\n\t$(LIBC_STUBS)/read.c\n\nSRC_S += \\\n\t$(STARTUP_ASM)/startup_gd32vf103.S \\\n\t$(STARTUP_ASM)/intexc_gd32vf103.S\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(NUCLEI_SDK)/NMSIS/Core/Include \\\n\t$(TOP)/$(GD32VF103_SDK_SOC)/Common/Include \\\n\t$(TOP)/$(GD32VF103_SDK_SOC)/Common/Include/Usb\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RISC-V\n\n# For flash-jlink target\nJLINK_IF = jtag\n\n# flash target ROM bootloader\nflash: $(BUILD)/$(PROJECT).bin\n\tdfu-util -R -a 0 --dfuse-address 0x08000000 -D $<\n"
  },
  {
    "path": "hw/bsp/gd32vf103/system_gd32vf103.c",
    "content": "/*!\n \\file    system_gd32vf103.h\n\\brief   RISC-V Device Peripheral Access Layer Source File for\n          GD32VF103 Device Series\n\n*/\n\n/*\n    Copyright (c) 2020, GigaDevice Semiconductor Inc.\n\n    Redistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n    1. Redistributions of source code must retain the above copyright notice, this\n       list of conditions and the following disclaimer.\n    2. 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    3. Neither the name of the copyright holder nor the names of its contributors\n       may be used to endorse or promote products derived from this software without\n       specific prior written permission.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\nINDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\nWHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\nARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\nOF SUCH DAMAGE.\n*/\n\n/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */\n#include \"board.h\"\n\n/* system frequency define */\n#define __IRC8M           (IRC8M_VALUE)            /* internal 8 MHz RC oscillator frequency */\n#define __HXTAL           (HXTAL_VALUE)            /* high speed crystal oscillator frequency */\n#define __SYS_OSC_CLK     (__IRC8M)                /* main oscillator frequency */\n#define __SYSTEM_CLOCK_HXTAL                    (HXTAL_VALUE)\n\n#if !defined(__SYSTEM_CLOCK)\n#define __SYSTEM_CLOCK 72000000\n#endif\n\n#if __SYSTEM_CLOCK == 48000000\n  #define __SYSTEM_CLOCK_48M_PLL_HXTAL            (uint32_t)(48000000)\n  uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL;\n  static void system_clock_48m_hxtal(void);\n\n#elif __SYSTEM_CLOCK == 72000000\n  #define __SYSTEM_CLOCK_72M_PLL_HXTAL            (uint32_t)(72000000)\n  uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL;\n  static void system_clock_72m_hxtal(void);\n\n#elif __SYSTEM_CLOCK == 96000000\n  #define __SYSTEM_CLOCK_96M_PLL_HXTAL            (uint32_t)(96000000)\n  uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL;\n  static void system_clock_96m_hxtal(void);\n\n#else\n#error No valid system clock configuration set!\n#endif\n\n/* configure the system clock */\nstatic void system_clock_config(void);\n\n/*!\n    \\brief      configure the system clock\n    \\param[in]  none\n    \\param[out] none\n    \\retval     none\n*/\nstatic void system_clock_config(void)\n{\n#if defined (__SYSTEM_CLOCK_48M_PLL_HXTAL)\n    system_clock_48m_hxtal();\n#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL)\n    system_clock_72m_hxtal();\n#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL)\n    system_clock_96m_hxtal();\n#endif /* __SYSTEM_CLOCK_HXTAL */\n}\n\n/*!\n    \\brief      setup the microcontroller system, initialize the system\n    \\param[in]  none\n    \\param[out] none\n    \\retval     none\n*/\nvoid SystemInit(void)\n{\n    /* reset the RCC clock configuration to the default reset state */\n    /* enable IRC8M */\n    RCU_CTL |= RCU_CTL_IRC8MEN;\n\n    /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */\n    RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC |\n                  RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL);\n\n    /* reset HXTALEN, CKMEN, PLLEN bits */\n    RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN);\n\n    /* Reset HXTALBPS bit */\n    RCU_CTL &= ~(RCU_CTL_HXTALBPS);\n\n    /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */\n\n    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF |\n                  RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4);\n    RCU_CFG1 = 0x00000000U;\n\n    /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */\n    RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN);\n    /* disable all interrupts */\n    RCU_INT = 0x00FF0000U;\n\n    /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */\n    system_clock_config();\n}\n\n/*!\n    \\brief      update the SystemCoreClock with current core clock retrieved from cpu registers\n    \\param[in]  none\n    \\param[out] none\n    \\retval     none\n*/\nvoid SystemCoreClockUpdate(void)\n{\n    uint32_t scss;\n    uint32_t pllsel, predv0sel, pllmf, ck_src;\n    uint32_t predv0, predv1, pll1mf;\n\n    scss = GET_BITS(RCU_CFG0, 2, 3);\n\n    switch (scss)\n    {\n        /* IRC8M is selected as CK_SYS */\n        case SEL_IRC8M:\n            SystemCoreClock = IRC8M_VALUE;\n            break;\n\n        /* HXTAL is selected as CK_SYS */\n        case SEL_HXTAL:\n            SystemCoreClock = HXTAL_VALUE;\n            break;\n\n        /* PLL is selected as CK_SYS */\n        case SEL_PLL:\n            /* PLL clock source selection, HXTAL or IRC8M/2 */\n            pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL);\n\n\n            if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){\n                /* PLL clock source is IRC8M/2 */\n                ck_src = IRC8M_VALUE / 2U;\n            }else{\n                /* PLL clock source is HXTAL */\n                ck_src = HXTAL_VALUE;\n\n                predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL);\n\n                /* source clock use PLL1 */\n                if(RCU_PREDV0SRC_CKPLL1 == predv0sel){\n                    predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U;\n                    pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U;\n                    if(17U == pll1mf){\n                        pll1mf = 20U;\n                    }\n                    ck_src = (ck_src / predv1) * pll1mf;\n                }\n                predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U;\n                ck_src /= predv0;\n            }\n\n            /* PLL multiplication factor */\n            pllmf = GET_BITS(RCU_CFG0, 18, 21);\n\n            if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){\n                pllmf |= 0x10U;\n            }\n\n            if(pllmf >= 15U){\n                pllmf += 1U;\n            }else{\n                pllmf += 2U;\n            }\n\n            SystemCoreClock = ck_src * pllmf;\n\n            if(15U == pllmf){\n                /* PLL source clock multiply by 6.5 */\n                SystemCoreClock = ck_src * 6U + ck_src / 2U;\n            }\n\n            break;\n\n        /* IRC8M is selected as CK_SYS */\n        default:\n            SystemCoreClock = IRC8M_VALUE;\n            break;\n    }\n}\n\n#if defined (__SYSTEM_CLOCK_48M_PLL_HXTAL)\n/*!\n    \\brief      configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source\n    \\param[in]  none\n    \\param[out] none\n    \\retval     none\n*/\nstatic void system_clock_48m_hxtal(void)\n{\n    uint32_t timeout = 0U;\n    uint32_t stab_flag = 0U;\n\n    /* enable HXTAL */\n    RCU_CTL |= RCU_CTL_HXTALEN;\n\n    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */\n    do{\n        timeout++;\n        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);\n    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));\n\n    /* if fail */\n    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){\n        while(1){\n        }\n    }\n\n    /* HXTAL is stable */\n    /* AHB = SYSCLK */\n    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;\n    /* APB2 = AHB/1 */\n    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;\n    /* APB1 = AHB/2 */\n    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;\n\n    /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */\n    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);\n    RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12);\n\n    if(HXTAL_VALUE==25000000){\n\n        /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */\n        RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);\n        RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);\n\n        /* enable PLL1 */\n        RCU_CTL |= RCU_CTL_PLL1EN;\n        /* wait till PLL1 is ready */\n        while((RCU_CTL & RCU_CTL_PLL1STB) == 0){\n        }\n\n    }else if(HXTAL_VALUE==8000000){\n        RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0);\n        RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 );\n    }\n\n\n\n    /* enable PLL */\n    RCU_CTL |= RCU_CTL_PLLEN;\n\n    /* wait until PLL is stable */\n    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){\n    }\n\n    /* select PLL as system clock */\n    RCU_CFG0 &= ~RCU_CFG0_SCS;\n    RCU_CFG0 |= RCU_CKSYSSRC_PLL;\n\n    /* wait until PLL is selected as system clock */\n    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){\n    }\n}\n\n#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL)\n/*!\n    \\brief      configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source\n    \\param[in]  none\n    \\param[out] none\n    \\retval     none\n*/\nstatic void system_clock_72m_hxtal(void)\n{\n    uint32_t timeout = 0U;\n    uint32_t stab_flag = 0U;\n\n    /* enable HXTAL */\n    RCU_CTL |= RCU_CTL_HXTALEN;\n\n    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */\n    do{\n        timeout++;\n        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);\n    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));\n\n    /* if fail */\n    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){\n        while(1){\n        }\n    }\n\n    /* HXTAL is stable */\n    /* AHB = SYSCLK */\n    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;\n    /* APB2 = AHB/1 */\n    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;\n    /* APB1 = AHB/2 */\n    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;\n\n    /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */\n    RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);\n    RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18);\n\n\n    if(HXTAL_VALUE==25000000){\n\n        /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */\n        RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);\n        RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);\n\n        /* enable PLL1 */\n        RCU_CTL |= RCU_CTL_PLL1EN;\n        /* wait till PLL1 is ready */\n        while((RCU_CTL & RCU_CTL_PLL1STB) == 0){\n        }\n\n    }else if(HXTAL_VALUE==8000000){\n        RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0);\n        RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 );\n    }\n\n    /* enable PLL */\n    RCU_CTL |= RCU_CTL_PLLEN;\n\n    /* wait until PLL is stable */\n    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){\n    }\n\n    /* select PLL as system clock */\n    RCU_CFG0 &= ~RCU_CFG0_SCS;\n    RCU_CFG0 |= RCU_CKSYSSRC_PLL;\n\n    /* wait until PLL is selected as system clock */\n    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){\n    }\n}\n\n#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL)\n/*!\n    \\brief      configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source\n    \\param[in]  none\n    \\param[out] none\n    \\retval     none\n*/\nstatic void system_clock_96m_hxtal(void)\n{\n    uint32_t timeout = 0U;\n    uint32_t stab_flag = 0U;\n\n    /* enable HXTAL */\n    RCU_CTL |= RCU_CTL_HXTALEN;\n\n    /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */\n    do{\n        timeout++;\n        stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB);\n    }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout));\n\n    /* if fail */\n    if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){\n        while(1){\n        }\n    }\n\n    /* HXTAL is stable */\n    /* AHB = SYSCLK */\n    RCU_CFG0 |= RCU_AHB_CKSYS_DIV1;\n    /* APB2 = AHB/1 */\n    RCU_CFG0 |= RCU_APB2_CKAHB_DIV1;\n    /* APB1 = AHB/2 */\n    RCU_CFG0 |= RCU_APB1_CKAHB_DIV2;\n\n    if(HXTAL_VALUE==25000000){\n\n        /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */\n        RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);\n        RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24);\n\n        /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */\n        RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0);\n        RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10);\n        /* enable PLL1 */\n        RCU_CTL |= RCU_CTL_PLL1EN;\n        /* wait till PLL1 is ready */\n        while((RCU_CTL & RCU_CTL_PLL1STB) == 0){\n        }\n\n    }else if(HXTAL_VALUE==8000000){\n        /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */\n        RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4);\n        RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24);\n\n        RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0);\n        RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 );\n    }\n\n    /* enable PLL */\n    RCU_CTL |= RCU_CTL_PLLEN;\n\n    /* wait until PLL is stable */\n    while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){\n    }\n\n    /* select PLL as system clock */\n    RCU_CFG0 &= ~RCU_CFG0_SCS;\n    RCU_CFG0 |= RCU_CKSYSSRC_PLL;\n\n    /* wait until PLL is selected as system clock */\n    while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){\n    }\n}\n\n#endif\n\n/**\n * \\defgroup  NMSIS_Core_IntExcNMI_Handling   Interrupt and Exception and NMI Handling\n * \\brief Functions for interrupt, exception and nmi handle available in system_<device>.c.\n * \\details\n * Nuclei provide a template for interrupt, exception and NMI handling. Silicon Vendor could adapat according\n * to their requirement. Silicon vendor could implement interface for different exception code and\n * replace current implementation.\n *\n * @{\n */\n/** \\brief Max exception handler number, don't include the NMI(0xFFF) one */\n#define MAX_SYSTEM_EXCEPTION_NUM        12\n/**\n * \\brief      Store the exception handlers for each exception ID\n * \\note\n * - This SystemExceptionHandlers are used to store all the handlers for all\n * the exception codes Nuclei N/NX core provided.\n * - Exception code 0 - 11, totally 12 exceptions are mapped to SystemExceptionHandlers[0:11]\n * - Exception for NMI is also re-routed to exception handling(exception code 0xFFF) in startup code configuration, the handler itself is mapped to SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM]\n */\nstatic unsigned long SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM + 1];\n\n/**\n * \\brief      Exception Handler Function Typedef\n * \\note\n * This typedef is only used internal in this system_gd32vf103.c file.\n * It is used to do type conversion for registered exception handler before calling it.\n */\ntypedef void (*EXC_HANDLER)(unsigned long mcause, unsigned long sp);\n\n/**\n * \\brief      System Default Exception Handler\n * \\details\n * This function provided a default exception and NMI handling code for all exception ids.\n * By default, It will just print some information for debug, Vendor can customize it according to its requirements.\n */\nstatic void system_default_exception_handler(unsigned long mcause, unsigned long sp)\n{\n    /* TODO: Uncomment this if you have implement printf function */\n    /*printf(\"MCAUSE: 0x%lx\\r\\n\", mcause);\n    printf(\"MEPC  : 0x%lx\\r\\n\", __RV_CSR_READ(CSR_MEPC));\n    printf(\"MTVAL : 0x%lx\\r\\n\", __RV_CSR_READ(CSR_MBADADDR));*/\n    while (1);\n}\n\n/**\n * \\brief      Initialize all the default core exception handlers\n * \\details\n * The core exception handler for each exception id will be initialized to \\ref system_default_exception_handler.\n * \\note\n * Called in \\ref _init function, used to initialize default exception handlers for all exception IDs\n */\nstatic void Exception_Init(void)\n{\n    for (int i = 0; i < MAX_SYSTEM_EXCEPTION_NUM + 1; i++) {\n        SystemExceptionHandlers[i] = (unsigned long)system_default_exception_handler;\n    }\n}\n\n/**\n * \\brief       Register an exception handler for exception code EXCn\n * \\details\n * * For EXCn < \\ref MAX_SYSTEM_EXCEPTION_NUM, it will be registered into SystemExceptionHandlers[EXCn-1].\n * * For EXCn == NMI_EXCn, it will be registered into SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM].\n * \\param   EXCn    See \\ref EXCn_Type\n * \\param   exc_handler     The exception handler for this exception code EXCn\n */\nvoid Exception_Register_EXC(uint32_t EXCn, unsigned long exc_handler)\n{\n    if ((EXCn < MAX_SYSTEM_EXCEPTION_NUM) && (EXCn != 0)) {\n        SystemExceptionHandlers[EXCn] = exc_handler;\n    } else if (EXCn == NMI_EXCn) {\n        SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM] = exc_handler;\n    }\n}\n\n/**\n * \\brief       Get current exception handler for exception code EXCn\n * \\details\n * * For EXCn < \\ref MAX_SYSTEM_EXCEPTION_NUM, it will return SystemExceptionHandlers[EXCn-1].\n * * For EXCn == NMI_EXCn, it will return SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM].\n * \\param   EXCn    See \\ref EXCn_Type\n * \\return  Current exception handler for exception code EXCn, if not found, return 0.\n */\nunsigned long Exception_Get_EXC(uint32_t EXCn)\n{\n    if ((EXCn < MAX_SYSTEM_EXCEPTION_NUM) && (EXCn != 0)) {\n        return SystemExceptionHandlers[EXCn];\n    } else if (EXCn == NMI_EXCn) {\n        return SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM];\n    } else {\n        return 0;\n    }\n}\n\n/**\n * \\brief      Common NMI and Exception handler entry\n * \\details\n * This function provided a command entry for NMI and exception. Silicon Vendor could modify\n * this template implementation according to requirement.\n * \\remarks\n * - RISCV provided common entry for all types of exception. This is proposed code template\n *   for exception entry function, Silicon Vendor could modify the implementation.\n * - For the core_exception_handler template, we provided exception register function \\ref Exception_Register_EXC\n *   which can help developer to register your exception handler for specific exception number.\n */\nuint32_t core_exception_handler(unsigned long mcause, unsigned long sp)\n{\n    uint32_t EXCn = (uint32_t)(mcause & 0X00000fff);\n    EXC_HANDLER exc_handler;\n\n    if ((EXCn < MAX_SYSTEM_EXCEPTION_NUM) && (EXCn > 0)) {\n        exc_handler = (EXC_HANDLER)SystemExceptionHandlers[EXCn];\n    } else if (EXCn == NMI_EXCn) {\n        exc_handler = (EXC_HANDLER)SystemExceptionHandlers[MAX_SYSTEM_EXCEPTION_NUM];\n    } else {\n        exc_handler = (EXC_HANDLER)system_default_exception_handler;\n    }\n    if (exc_handler != NULL) {\n        exc_handler(mcause, sp);\n    }\n    return 0;\n}\n/** @} */ /* End of Doxygen Group NMSIS_Core_ExceptionAndNMI */\n\n/**\n * \\brief initialize eclic config\n * \\details\n * Eclic need initialize after boot up, Vendor could also change the initialization\n * configuration.\n */\nvoid ECLIC_Init(void)\n{\n    /* TODO: Add your own initialization code here. This function will be called by main */\n    ECLIC_SetMth(0);\n    ECLIC_SetCfgNlbits(__ECLIC_INTCTLBITS);\n}\n\n/**\n * \\brief  Initialize a specific IRQ and register the handler\n * \\details\n * This function set vector mode, trigger mode and polarity, interrupt level and priority,\n * assign handler for specific IRQn.\n * \\param [in]  IRQn        NMI interrupt handler address\n * \\param [in]  shv         \\ref ECLIC_NON_VECTOR_INTERRUPT means non-vector mode, and \\ref ECLIC_VECTOR_INTERRUPT is vector mode\n * \\param [in]  trig_mode   see \\ref ECLIC_TRIGGER_Type\n * \\param [in]  lvl         interrupt level\n * \\param [in]  priority    interrupt priority\n * \\param [in]  handler     interrupt handler, if NULL, handler will not be installed\n * \\return       -1 means invalid input parameter. 0 means successful.\n * \\remarks\n * - This function use to configure specific eclic interrupt and register its interrupt handler and enable its interrupt.\n * - If the vector table is placed in read-only section(FLASHXIP mode), handler could not be installed\n */\nint32_t ECLIC_Register_IRQ(IRQn_Type IRQn, uint8_t shv, ECLIC_TRIGGER_Type trig_mode, uint8_t lvl, uint8_t priority, void* handler)\n{\n    if ((IRQn > SOC_INT_MAX) || (shv > ECLIC_VECTOR_INTERRUPT) \\\n        || (trig_mode > ECLIC_NEGTIVE_EDGE_TRIGGER)) {\n        return -1;\n    }\n\n    /* set interrupt vector mode */\n    ECLIC_SetShvIRQ(IRQn, shv);\n    /* set interrupt trigger mode and polarity */\n    ECLIC_SetTrigIRQ(IRQn, trig_mode);\n    /* set interrupt level */\n    ECLIC_SetLevelIRQ(IRQn, lvl);\n    /* set interrupt priority */\n    ECLIC_SetPriorityIRQ(IRQn, priority);\n    if (handler != NULL) {\n        /* set interrupt handler entry to vector table */\n        ECLIC_SetVector(IRQn, (rv_csr_t)handler);\n    }\n    /* enable interrupt */\n    ECLIC_EnableIRQ(IRQn);\n    return 0;\n}\n/** @} */ /* End of Doxygen Group NMSIS_Core_ExceptionAndNMI */\n\n/**\n * \\brief early init function before main\n * \\details\n * This function is executed right before main function.\n * For RISC-V gnu toolchain, _init function might not be called\n * by __libc_init_array function, so we defined a new function\n * to do initialization\n */\nvoid _premain_init(void)\n{\n    /* Initialize exception default handlers */\n    Exception_Init();\n    /* ECLIC initialization, mainly MTH and NLBIT */\n    ECLIC_Init();\n}\n\n/**\n * \\brief finish function after main\n * \\param [in]  status     status code return from main\n * \\details\n * This function is executed right after main function.\n * For RISC-V gnu toolchain, _fini function might not be called\n * by __libc_fini_array function, so we defined a new function\n * to do initialization\n */\nvoid _postmain_fini(int status)\n{\n    /* TODO: Add your own finishing code here, called after main */\n}\n\n/**\n * \\brief _init function called in __libc_init_array()\n * \\details\n * This `__libc_init_array()` function is called during startup code,\n * user need to implement this function, otherwise when link it will\n * error init.c:(.text.__libc_init_array+0x26): undefined reference to `_init'\n * \\note\n * Please use \\ref _premain_init function now\n */\nvoid _init(void)\n{\n    /* Don't put any code here, please use _premain_init now */\n}\n\n/**\n * \\brief _fini function called in __libc_fini_array()\n * \\details\n * This `__libc_fini_array()` function is called when exit main.\n * user need to implement this function, otherwise when link it will\n * error fini.c:(.text.__libc_fini_array+0x28): undefined reference to `_fini'\n * \\note\n * Please use \\ref _postmain_fini function now\n */\nvoid _fini(void)\n{\n    /* Don't put any code here, please use _postmain_fini now */\n}\n\n/** @} */ /* End of Doxygen Group NMSIS_Core_SystemAndClock */\n"
  },
  {
    "path": "hw/bsp/hpmicro/boards/hpm6750evk2/board.c",
    "content": "/*\n * Copyright (c) 2025 HPMicro\n * SPDX-License-Identifier: BSD-3-Clause\n *\n */\n\n#include \"board.h\"\n#include \"pinmux.h\"\n#include \"hpm_pmp_drv.h\"\n#include \"hpm_pllctl_drv.h\"\n#include \"hpm_clock_drv.h\"\n#include \"hpm_sysctl_drv.h\"\n#include \"hpm_pcfg_drv.h\"\n#include \"hpm_uart_drv.h\"\n#include \"hpm_gpio_drv.h\"\n\n/**\n * @brief FLASH configuration option definitions:\n * option[0]:\n *    [31:16] 0xfcf9 - FLASH configuration option tag\n *    [15:4]  0 - Reserved\n *    [3:0]   option words (exclude option[0])\n * option[1]:\n *    [31:28] Flash probe type\n *      0 - SFDP SDR / 1 - SFDP DDR\n *      2 - 1-4-4 Read (0xEB, 24-bit address) / 3 - 1-2-2 Read(0xBB, 24-bit address)\n *      4 - HyperFLASH 1.8V / 5 - HyperFLASH 3V\n *      6 - OctaBus DDR (SPI -> OPI DDR)\n *      8 - Xccela DDR (SPI -> OPI DDR)\n *      10 - EcoXiP DDR (SPI -> OPI DDR)\n *    [27:24] Command Pads after Power-on Reset\n *      0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI\n *    [23:20] Command Pads after Configuring FLASH\n *      0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI\n *    [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)\n *      0 - Not needed\n *      1 - QE bit is at bit 6 in Status Register 1\n *      2 - QE bit is at bit1 in Status Register 2\n *      3 - QE bit is at bit7 in Status Register 2\n *      4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31\n *    [15:8] Dummy cycles\n *      0 - Auto-probed / detected / default value\n *      Others - User specified value, for DDR read, the dummy cycles should be 2 * cycles on FLASH datasheet\n *    [7:4] Misc.\n *      0 - Not used\n *      1 - SPI mode\n *      2 - Internal loopback\n *      3 - External DQS\n *    [3:0] Frequency option\n *      1 - 30MHz / 2 - 50MHz / 3 - 66MHz / 4 - 80MHz / 5 - 100MHz / 6 - 120MHz / 7 - 133MHz / 8 - 166MHz\n *\n * option[2] (Effective only if the bit[3:0] in option[0] > 1)\n *    [31:20]  Reserved\n *    [19:16] IO voltage\n *      0 - 3V / 1 - 1.8V\n *    [15:12] Pin group\n *      0 - 1st group / 1 - 2nd group\n *    [11:8] Connection selection\n *      0 - CA_CS0 / 1 - CB_CS0 / 2 - CA_CS0 + CB_CS0 (Two FLASH connected to CA and CB respectively)\n *    [7:0] Drive Strength\n *      0 - Default value\n * option[3] (Effective only if the bit[3:0] in option[0] > 2, required only for the QSPI NOR FLASH that not supports\n *              JESD216)\n *    [31:16] reserved\n *    [15:12] Sector Erase Command Option, not required here\n *    [11:8]  Sector Size Option, not required here\n *    [7:0] Flash Size Option\n *      0 - 4MB / 1 - 8MB / 2 - 16MB\n */\n#if defined(FLASH_XIP) && FLASH_XIP\n__attribute__ ((section(\".nor_cfg_option\"), used)) const uint32_t option[4] = {0xfcf90002, 0x00000007, 0xE, 0x0};\n#endif\n\n#if defined(FLASH_UF2) && FLASH_UF2\nATTR_PLACE_AT(\".uf2_signature\") __attribute__((used)) const uint32_t uf2_signature = BOARD_UF2_SIGNATURE;\n#endif\n\n\n/* static function declarations */\nstatic void board_turnoff_rgb_led(void);\nstatic void init_uart_pins(UART_Type *ptr);\nstatic uint32_t board_init_uart_clock(UART_Type *ptr);\nstatic void init_gpio_pins(void);\nstatic void init_usb_pins(USB_Type *ptr);\n\n/* extern function definitions */\nvoid board_init_clock(void)\n{\n    uint32_t cpu0_freq = clock_get_frequency(clock_cpu0);\n    if (cpu0_freq == PLLCTL_SOC_PLL_REFCLK_FREQ) {\n        /* Configure the External OSC ramp-up time: ~9ms */\n        pllctl_xtal_set_rampup_time(HPM_PLLCTL, 32UL * 1000UL * 9U);\n\n        /* Select clock setting preset1 */\n        sysctl_clock_set_preset(HPM_SYSCTL, sysctl_preset_1);\n    }\n\n    /* Add clocks to group 0 */\n    clock_add_to_group(clock_cpu0, 0);\n    clock_add_to_group(clock_mchtmr0, 0);\n    clock_add_to_group(clock_axi0, 0);\n    clock_add_to_group(clock_axi1, 0);\n    clock_add_to_group(clock_axi2, 0);\n    clock_add_to_group(clock_ahb, 0);\n    clock_add_to_group(clock_xdma, 0);\n    clock_add_to_group(clock_hdma, 0);\n    clock_add_to_group(clock_xpi0, 0);\n    clock_add_to_group(clock_xpi1, 0);\n    clock_add_to_group(clock_ram0, 0);\n    clock_add_to_group(clock_ram1, 0);\n    clock_add_to_group(clock_lmm0, 0);\n    clock_add_to_group(clock_lmm1, 0);\n    clock_add_to_group(clock_gpio, 0);\n    clock_add_to_group(clock_mot0, 0);\n    clock_add_to_group(clock_mot1, 0);\n    clock_add_to_group(clock_mot2, 0);\n    clock_add_to_group(clock_mot3, 0);\n    clock_add_to_group(clock_synt, 0);\n    clock_add_to_group(clock_ptpc, 0);\n    /* Connect Group0 to CPU0 */\n    clock_connect_group_to_cpu(0, 0);\n\n    /* Add clocks to Group1 */\n    clock_add_to_group(clock_cpu1, 1);\n    clock_add_to_group(clock_mchtmr1, 1);\n    /* Connect Group1 to CPU1 */\n    clock_connect_group_to_cpu(1, 1);\n\n    /* Bump up DCDC voltage to 1275mv */\n    pcfg_dcdc_set_voltage(HPM_PCFG, 1275);\n    pcfg_dcdc_switch_to_dcm_mode(HPM_PCFG);\n\n    if (status_success != pllctl_init_int_pll_with_freq(HPM_PLLCTL, 0, BOARD_CPU_FREQ)) {\n        printf(\"Failed to set pll0_clk0 to %ldHz\\n\", BOARD_CPU_FREQ);\n        while (1) {\n        }\n    }\n\n    clock_set_source_divider(clock_cpu0, clk_src_pll0_clk0, 1);\n    clock_set_source_divider(clock_cpu1, clk_src_pll0_clk0, 1);\n    clock_update_core_clock();\n\n    clock_set_source_divider(clock_ahb, clk_src_pll1_clk1, 2); /*200m hz*/\n    clock_set_source_divider(clock_mchtmr0, clk_src_osc24m, 1);\n    clock_set_source_divider(clock_mchtmr1, clk_src_osc24m, 1);\n}\n\nvoid board_init_pmp(void)\n{\n    uint32_t start_addr;\n    uint32_t end_addr;\n    uint32_t length;\n    pmp_entry_t pmp_entry[16] = {0};\n    uint8_t index = 0;\n\n    /* Init noncachable memory */\n    extern uint32_t __noncacheable_start__[];\n    extern uint32_t __noncacheable_end__[];\n    start_addr = (uint32_t) __noncacheable_start__;\n    end_addr = (uint32_t) __noncacheable_end__;\n    length = end_addr - start_addr;\n    if (length > 0) {\n        /* Ensure the address and the length are power of 2 aligned */\n        assert((length & (length - 1U)) == 0U);\n        assert((start_addr & (length - 1U)) == 0U);\n        pmp_entry[index].pmp_addr = PMP_NAPOT_ADDR(start_addr, length);\n        pmp_entry[index].pmp_cfg.val = PMP_CFG(READ_EN, WRITE_EN, EXECUTE_EN, ADDR_MATCH_NAPOT, REG_UNLOCK);\n        pmp_entry[index].pma_addr = PMA_NAPOT_ADDR(start_addr, length);\n        pmp_entry[index].pma_cfg.val = PMA_CFG(ADDR_MATCH_NAPOT, MEM_TYPE_MEM_NON_CACHE_BUF, AMO_EN);\n        index++;\n    }\n\n    /* Init share memory */\n    extern uint32_t __share_mem_start__[];\n    extern uint32_t __share_mem_end__[];\n    start_addr = (uint32_t)__share_mem_start__;\n    end_addr = (uint32_t)__share_mem_end__;\n    length = end_addr - start_addr;\n    if (length > 0) {\n        /* Ensure the address and the length are power of 2 aligned */\n        assert((length & (length - 1U)) == 0U);\n        assert((start_addr & (length - 1U)) == 0U);\n        pmp_entry[index].pmp_addr = PMP_NAPOT_ADDR(start_addr, length);\n        pmp_entry[index].pmp_cfg.val = PMP_CFG(READ_EN, WRITE_EN, EXECUTE_EN, ADDR_MATCH_NAPOT, REG_UNLOCK);\n        pmp_entry[index].pma_addr = PMA_NAPOT_ADDR(start_addr, length);\n        pmp_entry[index].pma_cfg.val = PMA_CFG(ADDR_MATCH_NAPOT, MEM_TYPE_MEM_NON_CACHE_BUF, AMO_EN);\n        index++;\n    }\n\n    pmp_config(&pmp_entry[0], index);\n}\n\nvoid board_init_console(void)\n{\n    uart_config_t config = {0};\n    uint32_t freq;\n\n    /* uart needs to configure pin function before enabling clock, otherwise the level change of\n    uart rx pin when configuring pin function will cause a wrong data to be received.\n    And a uart rx dma request will be generated by default uart fifo dma trigger level. */\n    init_uart_pins((UART_Type *) BOARD_CONSOLE_UART_BASE);\n\n    freq = board_init_uart_clock((UART_Type *)BOARD_CONSOLE_UART_BASE);\n\n    uart_default_config((UART_Type *)BOARD_CONSOLE_UART_BASE, &config);\n    config.src_freq_in_hz = freq;\n    config.baudrate = BOARD_CONSOLE_UART_BAUDRATE;\n    uart_init((UART_Type *)BOARD_CONSOLE_UART_BASE, &config);\n}\n\nvoid board_init_gpio_pins(void)\n{\n    init_gpio_pins();\n}\n\nvoid board_init_led_pins(void)\n{\n    board_turnoff_rgb_led();\n    init_led_pins_as_gpio();\n    gpio_set_pin_output_with_initial(BOARD_R_GPIO_CTRL, BOARD_R_GPIO_INDEX, BOARD_R_GPIO_PIN, BOARD_LED_OFF_LEVEL);\n    gpio_set_pin_output_with_initial(BOARD_G_GPIO_CTRL, BOARD_G_GPIO_INDEX, BOARD_G_GPIO_PIN, BOARD_LED_OFF_LEVEL);\n    gpio_set_pin_output_with_initial(BOARD_B_GPIO_CTRL, BOARD_B_GPIO_INDEX, BOARD_B_GPIO_PIN, BOARD_LED_OFF_LEVEL);\n}\n\nvoid board_init_usb(USB_Type *ptr)\n{\n    clock_name_t usb_clk = (ptr == HPM_USB0) ? clock_usb0 : clock_usb1;\n\n    init_usb_pins(ptr);\n    clock_add_to_group(usb_clk, 0);\n}\n\n/* static function definitions */\nstatic void board_turnoff_rgb_led(void)\n{\n    uint32_t pad_ctl = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(BOARD_LED_OFF_LEVEL);\n    HPM_IOC->PAD[IOC_PAD_PB11].FUNC_CTL = IOC_PB11_FUNC_CTL_GPIO_B_11;\n    HPM_IOC->PAD[IOC_PAD_PB12].FUNC_CTL = IOC_PB12_FUNC_CTL_GPIO_B_12;\n    HPM_IOC->PAD[IOC_PAD_PB13].FUNC_CTL = IOC_PB13_FUNC_CTL_GPIO_B_13;\n\n    HPM_IOC->PAD[IOC_PAD_PB11].PAD_CTL = pad_ctl;\n    HPM_IOC->PAD[IOC_PAD_PB12].PAD_CTL = pad_ctl;\n    HPM_IOC->PAD[IOC_PAD_PB13].PAD_CTL = pad_ctl;\n}\n\nstatic void init_uart_pins(UART_Type *ptr)\n{\n    if (ptr == HPM_UART0) {\n        init_uart0_pins();\n    } else if (ptr == HPM_UART2) {\n        init_uart2_pins();\n    } else if (ptr == HPM_UART13) {\n        init_uart13_pins();\n    } else if (ptr == HPM_PUART) {\n        init_puart_pins();\n    }\n}\n\nstatic uint32_t board_init_uart_clock(UART_Type *ptr)\n{\n    uint32_t freq = 0U;\n    if (ptr == HPM_UART0) {\n        clock_add_to_group(clock_uart0, 0);\n        freq = clock_get_frequency(clock_uart0);\n    } else if (ptr == HPM_UART6) {\n        clock_add_to_group(clock_uart6, 0);\n        freq = clock_get_frequency(clock_uart6);\n    } else if (ptr == HPM_UART13) {\n        clock_add_to_group(clock_uart13, 0);\n        freq = clock_get_frequency(clock_uart13);\n    } else if (ptr == HPM_UART14) {\n        clock_add_to_group(clock_uart14, 0);\n        freq = clock_get_frequency(clock_uart14);\n    } else {\n        /* Not supported */\n    }\n    return freq;\n}\n\nstatic void init_gpio_pins(void)\n{\n    init_gpio_pins_with_pull_up();\n#ifdef USING_GPIO0_FOR_GPIOZ\n    init_gpio_pins_using_gpio0();\n#endif\n}\n\nstatic void init_usb_pins(USB_Type *ptr)\n{\n    if (ptr == HPM_USB0) {\n        init_usb0_pins();\n    } else if (ptr == HPM_USB1) {\n        init_usb1_pins();\n    }\n}\n"
  },
  {
    "path": "hw/bsp/hpmicro/boards/hpm6750evk2/board.cmake",
    "content": "set(MCU_VARIANT HPM6750xVMx)\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nset(JLINK_IF jtag)\n\nset(HPM_SOC ${SDK_DIR}/soc/HPM6700/HPM6750)\nset(HPM_IP_REGS ${SDK_DIR}/soc/HPM6700/ip)\n\nset(BOARD_FLASH_SIZE 16M)\nset(BOARD_STACK_SIZE 16K)\nset(BOARD_HEAP_SIZE 16K)\n\nset(HPM_PLLCTL_DRV_FILE hpm_pllctl_drv.c)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    BOARD_TUD_RHPORT=0\n    BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n    BOARD_TUH_RHPORT=1\n    BOARD_TUH_MAX_SPEED=OPT_MODE_HIGH_SPEED\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/hpmicro/boards/hpm6750evk2/board.h",
    "content": "/*\n * Copyright (c) 2021-2025 HPMicro\n *\n * SPDX-License-Identifier: BSD-3-Clause\n *\n */\n\n/* metadata:\n   name: HPM6750EVK2\n   url: https://hpm-sdk.readthedocs.io/en/v1.6.0/boards/hpm6750evk2/README_en.html\n*/\n\n#ifndef _HPM_BOARD_H\n#define _HPM_BOARD_H\n\n#include <stdio.h>\n#include \"hpm_common.h\"\n#include \"hpm_soc.h\"\n#include \"hpm_soc_feature.h\"\n#include \"pinmux.h\"\n\n#define BOARD_NAME          \"hpm6750evk2\"\n\n#ifndef BOARD_RUNNING_CORE\n#define BOARD_RUNNING_CORE HPM_CORE0\n#endif\n\n#define BOARD_CPU_FREQ (816000000UL)\n\n/* console section */\n#if BOARD_RUNNING_CORE == HPM_CORE0\n    #define BOARD_CONSOLE_UART_BASE       HPM_UART0\n    #define BOARD_CONSOLE_UART_CLK_NAME   clock_uart0\n    #define BOARD_CONSOLE_UART_IRQ        IRQn_UART0\n    #define BOARD_CONSOLE_UART_TX_DMA_REQ HPM_DMA_SRC_UART0_TX\n    #define BOARD_CONSOLE_UART_RX_DMA_REQ HPM_DMA_SRC_UART0_RX\n#else\n    #define BOARD_CONSOLE_UART_BASE       HPM_UART13\n    #define BOARD_CONSOLE_UART_CLK_NAME   clock_uart13\n    #define BOARD_CONSOLE_UART_IRQ        IRQn_UART13\n    #define BOARD_CONSOLE_UART_TX_DMA_REQ HPM_DMA_SRC_UART13_TX\n    #define BOARD_CONSOLE_UART_RX_DMA_REQ HPM_DMA_SRC_UART13_RX\n#endif\n\n#define BOARD_CONSOLE_UART_BAUDRATE (115200UL)\n\n/* sdram section */\n#define BOARD_SDRAM_ADDRESS          (0x40000000UL)\n#define BOARD_SDRAM_SIZE             (32 * SIZE_1MB)\n#define BOARD_SDRAM_CS               FEMC_SDRAM_CS0\n#define BOARD_SDRAM_PORT_SIZE        FEMC_SDRAM_PORT_SIZE_32_BITS\n#define BOARD_SDRAM_COLUMN_ADDR_BITS FEMC_SDRAM_COLUMN_ADDR_9_BITS\n#define BOARD_SDRAM_REFRESH_COUNT    (8192UL)\n#define BOARD_SDRAM_REFRESH_IN_MS    (64UL)\n\n#define BOARD_FLASH_BASE_ADDRESS (0x80000000UL)\n#define BOARD_FLASH_SIZE         (16 << 20)\n\n/* gpio section */\n#define BOARD_R_GPIO_CTRL  HPM_GPIO0\n#define BOARD_R_GPIO_INDEX GPIO_DI_GPIOB\n#define BOARD_R_GPIO_PIN   11\n#define BOARD_G_GPIO_CTRL  HPM_GPIO0\n#define BOARD_G_GPIO_INDEX GPIO_DI_GPIOB\n#define BOARD_G_GPIO_PIN   12\n#define BOARD_B_GPIO_CTRL  HPM_GPIO0\n#define BOARD_B_GPIO_INDEX GPIO_DI_GPIOB\n#define BOARD_B_GPIO_PIN   13\n\n#define BOARD_LED_GPIO_CTRL HPM_GPIO0\n\n#define BOARD_LED_GPIO_INDEX GPIO_DI_GPIOB\n#define BOARD_LED_GPIO_PIN   12\n#define BOARD_LED_OFF_LEVEL  0\n#define BOARD_LED_ON_LEVEL   1\n\n#define BOARD_LED_TOGGLE_RGB 1\n\n#define BOARD_APP_GPIO_INDEX GPIO_DI_GPIOZ\n#define BOARD_APP_GPIO_PIN   2\n#define BOARD_BUTTON_PRESSED_VALUE 0\n\n#define USING_GPIO0_FOR_GPIOZ\n#ifndef USING_GPIO0_FOR_GPIOZ\n#define BOARD_APP_GPIO_CTRL HPM_BGPIO\n#define BOARD_APP_GPIO_IRQ  IRQn_BGPIO\n#else\n#define BOARD_APP_GPIO_CTRL HPM_GPIO0\n#define BOARD_APP_GPIO_IRQ  IRQn_GPIO0_Z\n#endif\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus */\n\n\nvoid board_init_clock(void);\nvoid board_init_pmp(void);\nvoid board_init_console(void);\nvoid board_init_gpio_pins(void);\nvoid board_init_led_pins(void);\nvoid board_init_usb(USB_Type *ptr);\nvoid board_print_banner(void);\nvoid board_print_clock_freq(void);\n\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus */\n#endif /* _HPM_BOARD_H */\n"
  },
  {
    "path": "hw/bsp/hpmicro/boards/hpm6750evk2/board.mk",
    "content": "MCU_VARIANT = HPM6750xVMx\nJLINK_DEVICE = ${MCU_VARIANT}\n\nJLINK_IF = jtag\n\nHPM_SOC = $(SDK_DIR)/soc/HPM6700/HPM6750\nHPM_IP_REGS = $(SDK_DIR)/soc/HPM6700/ip\n\nBOARD_FLASH_SIZE = 16M\nBOARD_STACK_SIZE = 16K\nBOARD_HEAP_SIZE = 16K\n\nBOARD_TUD_RHPORT = 0\nBOARD_TUH_RHPORT = 1\n\nHPM_PLLCTL_DRV_FILE = hpm_pllctl_drv.c\n"
  },
  {
    "path": "hw/bsp/hpmicro/boards/hpm6750evk2/pinmux.c",
    "content": "\n/*\n * Copyright (c) 2025 HPMicro\n *\n * SPDX-License-Identifier: BSD-3-Clause\n *\n *\n * Automatically generated by HPM Pinmux Tool\n *\n *\n * Note:\n * PY and PZ IOs: if any SOC pin function needs to be routed to these IOs,\n * besides of IOC, PIOC/BIOC needs to be configured SOC_GPIO_X_xx, so that\n * expected SoC function can be enabled on these IOs.\n */\n\n#include \"pinmux.h\"\n#include \"board.h\"\n#include \"hpm_trgm_drv.h\"\n\n\n/* PY port IO needs to configure PIOC as well */\nvoid init_uart0_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PY07].FUNC_CTL = IOC_PY07_FUNC_CTL_UART0_RXD;\n    HPM_PIOC->PAD[IOC_PAD_PY07].FUNC_CTL = PIOC_PY07_FUNC_CTL_SOC_PY_07;\n\n    HPM_IOC->PAD[IOC_PAD_PY06].FUNC_CTL = IOC_PY06_FUNC_CTL_UART0_TXD;\n    HPM_PIOC->PAD[IOC_PAD_PY06].FUNC_CTL = PIOC_PY06_FUNC_CTL_SOC_PY_06;\n}\n\nvoid init_uart2_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE16].FUNC_CTL = IOC_PE16_FUNC_CTL_UART2_TXD;\n\n    HPM_IOC->PAD[IOC_PAD_PE21].FUNC_CTL = IOC_PE21_FUNC_CTL_UART2_RXD;\n}\n\n/* PZ port IO needs to configure BIOC as well */\nvoid init_uart13_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PZ08].FUNC_CTL = IOC_PZ08_FUNC_CTL_UART13_RXD;\n    HPM_BIOC->PAD[IOC_PAD_PZ08].FUNC_CTL = BIOC_PZ08_FUNC_CTL_SOC_PZ_08;\n\n    HPM_IOC->PAD[IOC_PAD_PZ09].FUNC_CTL = IOC_PZ09_FUNC_CTL_UART13_TXD;\n    HPM_BIOC->PAD[IOC_PAD_PZ09].FUNC_CTL = BIOC_PZ09_FUNC_CTL_SOC_PZ_09;\n}\n\nvoid init_puart_pins(void)\n{\n    HPM_PIOC->PAD[IOC_PAD_PY06].FUNC_CTL = PIOC_PY06_FUNC_CTL_PUART_TXD;\n\n    HPM_PIOC->PAD[IOC_PAD_PY07].FUNC_CTL = PIOC_PY07_FUNC_CTL_PUART_RXD;\n}\n\n/*\n * PZ port IO needs to configure BIOC as well.\n * PZ08 and PZ09 need pull up.\n * Errata: E00029：IOC PAD_CTL register write restrictions.\n * When the PE bit is 1, bit [3] must be set to 1,\n * and DS can only be selected as 0b001 (low drive strength) or 0b110 (high drive strength).\n */\nvoid init_uart13_pins_as_gpio(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PZ08].FUNC_CTL = IOC_PZ08_FUNC_CTL_GPIO_Z_08;\n    HPM_BIOC->PAD[IOC_PAD_PZ08].FUNC_CTL = BIOC_PZ08_FUNC_CTL_SOC_PZ_08;\n    HPM_IOC->PAD[IOC_PAD_PZ08].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    HPM_IOC->PAD[IOC_PAD_PZ09].FUNC_CTL = IOC_PZ09_FUNC_CTL_GPIO_Z_09;\n    HPM_BIOC->PAD[IOC_PAD_PZ09].FUNC_CTL = BIOC_PZ09_FUNC_CTL_SOC_PZ_09;\n}\n\nvoid init_lcd0_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PB03].FUNC_CTL = IOC_PB03_FUNC_CTL_DIS0_R_0;\n\n    HPM_IOC->PAD[IOC_PAD_PB04].FUNC_CTL = IOC_PB04_FUNC_CTL_DIS0_R_1;\n\n    HPM_IOC->PAD[IOC_PAD_PB00].FUNC_CTL = IOC_PB00_FUNC_CTL_DIS0_R_2;\n\n    HPM_IOC->PAD[IOC_PAD_PA31].FUNC_CTL = IOC_PA31_FUNC_CTL_DIS0_R_3;\n\n    HPM_IOC->PAD[IOC_PAD_PA26].FUNC_CTL = IOC_PA26_FUNC_CTL_DIS0_R_4;\n\n    HPM_IOC->PAD[IOC_PAD_PA21].FUNC_CTL = IOC_PA21_FUNC_CTL_DIS0_R_5;\n\n    HPM_IOC->PAD[IOC_PAD_PA27].FUNC_CTL = IOC_PA27_FUNC_CTL_DIS0_R_6;\n\n    HPM_IOC->PAD[IOC_PAD_PA28].FUNC_CTL = IOC_PA28_FUNC_CTL_DIS0_R_7;\n\n    HPM_IOC->PAD[IOC_PAD_PB06].FUNC_CTL = IOC_PB06_FUNC_CTL_DIS0_G_0;\n\n    HPM_IOC->PAD[IOC_PAD_PB01].FUNC_CTL = IOC_PB01_FUNC_CTL_DIS0_G_1;\n\n    HPM_IOC->PAD[IOC_PAD_PA22].FUNC_CTL = IOC_PA22_FUNC_CTL_DIS0_G_2;\n\n    HPM_IOC->PAD[IOC_PAD_PA23].FUNC_CTL = IOC_PA23_FUNC_CTL_DIS0_G_3;\n\n    HPM_IOC->PAD[IOC_PAD_PA29].FUNC_CTL = IOC_PA29_FUNC_CTL_DIS0_G_4;\n\n    HPM_IOC->PAD[IOC_PAD_PA24].FUNC_CTL = IOC_PA24_FUNC_CTL_DIS0_G_5;\n\n    HPM_IOC->PAD[IOC_PAD_PA30].FUNC_CTL = IOC_PA30_FUNC_CTL_DIS0_G_6;\n\n    HPM_IOC->PAD[IOC_PAD_PA25].FUNC_CTL = IOC_PA25_FUNC_CTL_DIS0_G_7;\n\n    HPM_IOC->PAD[IOC_PAD_PB05].FUNC_CTL = IOC_PB05_FUNC_CTL_DIS0_B_0;\n\n    HPM_IOC->PAD[IOC_PAD_PB07].FUNC_CTL = IOC_PB07_FUNC_CTL_DIS0_B_1;\n\n    HPM_IOC->PAD[IOC_PAD_PB02].FUNC_CTL = IOC_PB02_FUNC_CTL_DIS0_B_2;\n\n    HPM_IOC->PAD[IOC_PAD_PA16].FUNC_CTL = IOC_PA16_FUNC_CTL_DIS0_B_3;\n\n    HPM_IOC->PAD[IOC_PAD_PA12].FUNC_CTL = IOC_PA12_FUNC_CTL_DIS0_B_4;\n\n    HPM_IOC->PAD[IOC_PAD_PA17].FUNC_CTL = IOC_PA17_FUNC_CTL_DIS0_B_5;\n\n    HPM_IOC->PAD[IOC_PAD_PA13].FUNC_CTL = IOC_PA13_FUNC_CTL_DIS0_B_6;\n\n    HPM_IOC->PAD[IOC_PAD_PA18].FUNC_CTL = IOC_PA18_FUNC_CTL_DIS0_B_7;\n\n    HPM_IOC->PAD[IOC_PAD_PA20].FUNC_CTL = IOC_PA20_FUNC_CTL_DIS0_CLK;\n\n    HPM_IOC->PAD[IOC_PAD_PA15].FUNC_CTL = IOC_PA15_FUNC_CTL_DIS0_EN;\n\n    HPM_IOC->PAD[IOC_PAD_PA19].FUNC_CTL = IOC_PA19_FUNC_CTL_DIS0_HSYNC;\n\n    HPM_IOC->PAD[IOC_PAD_PA14].FUNC_CTL = IOC_PA14_FUNC_CTL_DIS0_VSYNC;\n\n    /* PWM */\n    HPM_IOC->PAD[IOC_PAD_PB10].FUNC_CTL = IOC_PB10_FUNC_CTL_GPIO_B_10;\n\n    /* RST */\n    HPM_IOC->PAD[IOC_PAD_PB16].FUNC_CTL = IOC_PB16_FUNC_CTL_GPIO_B_16;\n\n    HPM_IOC->PAD[IOC_PAD_PZ00].FUNC_CTL = IOC_PZ00_FUNC_CTL_GPIO_Z_00;\n    HPM_BIOC->PAD[IOC_PAD_PZ00].FUNC_CTL = BIOC_PZ00_FUNC_CTL_SOC_PZ_00;\n    HPM_IOC->PAD[IOC_PAD_PZ00].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\n/*\n * Errata: E00029：IOC PAD_CTL register write restrictions.\n * When the PE bit is 1, bit [3] must be set to 1,\n * and DS can only be selected as 0b001 (low drive strength) or 0b110 (high drive strength).\n */\nvoid init_cap_pins(void)\n{\n    /* CAP_INT */\n    HPM_IOC->PAD[IOC_PAD_PB08].FUNC_CTL = IOC_PB08_FUNC_CTL_GPIO_B_08;\n    HPM_IOC->PAD[IOC_PAD_PB08].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(1);\n\n    /* CAP_RST */\n    HPM_IOC->PAD[IOC_PAD_PB09].FUNC_CTL = IOC_PB09_FUNC_CTL_GPIO_B_09;\n    HPM_IOC->PAD[IOC_PAD_PB09].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(1);\n}\n\n/* PZ port IO needs to configure BIOC as well */\nvoid init_i2c0_pins_as_gpio(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PZ11].FUNC_CTL = IOC_PZ11_FUNC_CTL_GPIO_Z_11;\n    HPM_BIOC->PAD[IOC_PAD_PZ11].FUNC_CTL = BIOC_PZ11_FUNC_CTL_SOC_PZ_11;\n\n    HPM_IOC->PAD[IOC_PAD_PZ10].FUNC_CTL = IOC_PZ10_FUNC_CTL_GPIO_Z_10;\n    HPM_BIOC->PAD[IOC_PAD_PZ10].FUNC_CTL = BIOC_PZ10_FUNC_CTL_SOC_PZ_10;\n}\n\n/* PZ port IO needs to configure BIOC as well */\nvoid init_i2c0_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PZ11].FUNC_CTL = IOC_PZ11_FUNC_CTL_I2C0_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_BIOC->PAD[IOC_PAD_PZ11].FUNC_CTL = BIOC_PZ11_FUNC_CTL_SOC_PZ_11;\n    HPM_IOC->PAD[IOC_PAD_PZ11].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1);\n\n    HPM_IOC->PAD[IOC_PAD_PZ10].FUNC_CTL = IOC_PZ10_FUNC_CTL_I2C0_SDA | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_BIOC->PAD[IOC_PAD_PZ10].FUNC_CTL = BIOC_PZ10_FUNC_CTL_SOC_PZ_10;\n    HPM_IOC->PAD[IOC_PAD_PZ10].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1);\n}\n\nvoid init_femc_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PC01].FUNC_CTL = IOC_PC01_FUNC_CTL_FEMC_DQ_16;\n\n    HPM_IOC->PAD[IOC_PAD_PC00].FUNC_CTL = IOC_PC00_FUNC_CTL_FEMC_DQ_17;\n\n    HPM_IOC->PAD[IOC_PAD_PB31].FUNC_CTL = IOC_PB31_FUNC_CTL_FEMC_DQ_18;\n\n    HPM_IOC->PAD[IOC_PAD_PB30].FUNC_CTL = IOC_PB30_FUNC_CTL_FEMC_DQ_30;\n\n    HPM_IOC->PAD[IOC_PAD_PB29].FUNC_CTL = IOC_PB29_FUNC_CTL_FEMC_DQ_31;\n\n    HPM_IOC->PAD[IOC_PAD_PB28].FUNC_CTL = IOC_PB28_FUNC_CTL_FEMC_DQ_19;\n\n    HPM_IOC->PAD[IOC_PAD_PB27].FUNC_CTL = IOC_PB27_FUNC_CTL_FEMC_DQ_20;\n\n    HPM_IOC->PAD[IOC_PAD_PB26].FUNC_CTL = IOC_PB26_FUNC_CTL_FEMC_DQ_21;\n\n    HPM_IOC->PAD[IOC_PAD_PB25].FUNC_CTL = IOC_PB25_FUNC_CTL_FEMC_DQ_28;\n\n    HPM_IOC->PAD[IOC_PAD_PB24].FUNC_CTL = IOC_PB24_FUNC_CTL_FEMC_DQ_29;\n\n    HPM_IOC->PAD[IOC_PAD_PB23].FUNC_CTL = IOC_PB23_FUNC_CTL_FEMC_DQ_22;\n\n    HPM_IOC->PAD[IOC_PAD_PB22].FUNC_CTL = IOC_PB22_FUNC_CTL_FEMC_DQ_26;\n\n    HPM_IOC->PAD[IOC_PAD_PB21].FUNC_CTL = IOC_PB21_FUNC_CTL_FEMC_DQ_27;\n\n    HPM_IOC->PAD[IOC_PAD_PB20].FUNC_CTL = IOC_PB20_FUNC_CTL_FEMC_DQ_23;\n\n    HPM_IOC->PAD[IOC_PAD_PB19].FUNC_CTL = IOC_PB19_FUNC_CTL_FEMC_DQ_24;\n\n    HPM_IOC->PAD[IOC_PAD_PB18].FUNC_CTL = IOC_PB18_FUNC_CTL_FEMC_DQ_25;\n\n    HPM_IOC->PAD[IOC_PAD_PD13].FUNC_CTL = IOC_PD13_FUNC_CTL_FEMC_DQ_14;\n\n    HPM_IOC->PAD[IOC_PAD_PD12].FUNC_CTL = IOC_PD12_FUNC_CTL_FEMC_DQ_15;\n\n    HPM_IOC->PAD[IOC_PAD_PD10].FUNC_CTL = IOC_PD10_FUNC_CTL_FEMC_DQ_12;\n\n    HPM_IOC->PAD[IOC_PAD_PD09].FUNC_CTL = IOC_PD09_FUNC_CTL_FEMC_DQ_13;\n\n    HPM_IOC->PAD[IOC_PAD_PD08].FUNC_CTL = IOC_PD08_FUNC_CTL_FEMC_DQ_00;\n\n    HPM_IOC->PAD[IOC_PAD_PD07].FUNC_CTL = IOC_PD07_FUNC_CTL_FEMC_DQ_10;\n\n    HPM_IOC->PAD[IOC_PAD_PD06].FUNC_CTL = IOC_PD06_FUNC_CTL_FEMC_DQ_11;\n\n    HPM_IOC->PAD[IOC_PAD_PD05].FUNC_CTL = IOC_PD05_FUNC_CTL_FEMC_DQ_01;\n\n    HPM_IOC->PAD[IOC_PAD_PD04].FUNC_CTL = IOC_PD04_FUNC_CTL_FEMC_DQ_08;\n\n    HPM_IOC->PAD[IOC_PAD_PD03].FUNC_CTL = IOC_PD03_FUNC_CTL_FEMC_DQ_09;\n\n    HPM_IOC->PAD[IOC_PAD_PD02].FUNC_CTL = IOC_PD02_FUNC_CTL_FEMC_DQ_04;\n\n    HPM_IOC->PAD[IOC_PAD_PD01].FUNC_CTL = IOC_PD01_FUNC_CTL_FEMC_DQ_03;\n\n    HPM_IOC->PAD[IOC_PAD_PD00].FUNC_CTL = IOC_PD00_FUNC_CTL_FEMC_DQ_02;\n\n    HPM_IOC->PAD[IOC_PAD_PC29].FUNC_CTL = IOC_PC29_FUNC_CTL_FEMC_DQ_07;\n\n    HPM_IOC->PAD[IOC_PAD_PC28].FUNC_CTL = IOC_PC28_FUNC_CTL_FEMC_DQ_06;\n\n    HPM_IOC->PAD[IOC_PAD_PC27].FUNC_CTL = IOC_PC27_FUNC_CTL_FEMC_DQ_05;\n\n    /* SRAM #WE */\n    HPM_IOC->PAD[IOC_PAD_PC21].FUNC_CTL = IOC_PC21_FUNC_CTL_FEMC_A_11;\n\n    HPM_IOC->PAD[IOC_PAD_PC17].FUNC_CTL = IOC_PC17_FUNC_CTL_FEMC_A_09;\n\n    HPM_IOC->PAD[IOC_PAD_PC15].FUNC_CTL = IOC_PC15_FUNC_CTL_FEMC_A_10;\n\n    HPM_IOC->PAD[IOC_PAD_PC12].FUNC_CTL = IOC_PC12_FUNC_CTL_FEMC_A_08;\n\n    HPM_IOC->PAD[IOC_PAD_PC11].FUNC_CTL = IOC_PC11_FUNC_CTL_FEMC_A_07;\n\n    HPM_IOC->PAD[IOC_PAD_PC10].FUNC_CTL = IOC_PC10_FUNC_CTL_FEMC_A_06;\n\n    HPM_IOC->PAD[IOC_PAD_PC09].FUNC_CTL = IOC_PC09_FUNC_CTL_FEMC_A_01;\n\n    HPM_IOC->PAD[IOC_PAD_PC08].FUNC_CTL = IOC_PC08_FUNC_CTL_FEMC_A_00;\n\n    HPM_IOC->PAD[IOC_PAD_PC07].FUNC_CTL = IOC_PC07_FUNC_CTL_FEMC_A_05;\n\n    HPM_IOC->PAD[IOC_PAD_PC06].FUNC_CTL = IOC_PC06_FUNC_CTL_FEMC_A_04;\n\n    HPM_IOC->PAD[IOC_PAD_PC05].FUNC_CTL = IOC_PC05_FUNC_CTL_FEMC_A_03;\n\n    HPM_IOC->PAD[IOC_PAD_PC04].FUNC_CTL = IOC_PC04_FUNC_CTL_FEMC_A_02;\n\n    /* SRAM #ADV */\n    HPM_IOC->PAD[IOC_PAD_PC14].FUNC_CTL = IOC_PC14_FUNC_CTL_FEMC_BA1;\n\n    HPM_IOC->PAD[IOC_PAD_PC13].FUNC_CTL = IOC_PC13_FUNC_CTL_FEMC_BA0;\n\n    HPM_IOC->PAD[IOC_PAD_PC16].FUNC_CTL = IOC_PC16_FUNC_CTL_FEMC_DQS | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n\n    HPM_IOC->PAD[IOC_PAD_PC26].FUNC_CTL = IOC_PC26_FUNC_CTL_FEMC_CLK;\n\n    HPM_IOC->PAD[IOC_PAD_PC25].FUNC_CTL = IOC_PC25_FUNC_CTL_FEMC_CKE;\n\n    HPM_IOC->PAD[IOC_PAD_PC19].FUNC_CTL = IOC_PC19_FUNC_CTL_FEMC_CS_0;\n\n    HPM_IOC->PAD[IOC_PAD_PC18].FUNC_CTL = IOC_PC18_FUNC_CTL_FEMC_RAS;\n\n    HPM_IOC->PAD[IOC_PAD_PC23].FUNC_CTL = IOC_PC23_FUNC_CTL_FEMC_CAS;\n\n    HPM_IOC->PAD[IOC_PAD_PC24].FUNC_CTL = IOC_PC24_FUNC_CTL_FEMC_WE;\n\n    /* SRAM #LB */\n    HPM_IOC->PAD[IOC_PAD_PC30].FUNC_CTL = IOC_PC30_FUNC_CTL_FEMC_DM_0;\n\n    /* SRAM #UB */\n    HPM_IOC->PAD[IOC_PAD_PC31].FUNC_CTL = IOC_PC31_FUNC_CTL_FEMC_DM_1;\n\n    HPM_IOC->PAD[IOC_PAD_PC02].FUNC_CTL = IOC_PC02_FUNC_CTL_FEMC_DM_2;\n\n    HPM_IOC->PAD[IOC_PAD_PC03].FUNC_CTL = IOC_PC03_FUNC_CTL_FEMC_DM_3;\n\n    /* SRAM #CE */\n    HPM_IOC->PAD[IOC_PAD_PC20].FUNC_CTL = IOC_PC20_FUNC_CTL_FEMC_CS_1;\n\n    /* SRAM #OE */\n    HPM_IOC->PAD[IOC_PAD_PC22].FUNC_CTL = IOC_PC22_FUNC_CTL_FEMC_A_12;\n}\n\n/*\n * Errata: E00029：IOC PAD_CTL register write restrictions.\n * When the PE bit is 1, bit [3] must be set to 1,\n * and DS can only be selected as 0b001 (low drive strength) or 0b110 (high drive strength).\n */\nvoid init_gpio_pins_with_pull_up(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PB12].FUNC_CTL = IOC_PB12_FUNC_CTL_GPIO_B_12;\n    HPM_IOC->PAD[IOC_PAD_PB12].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_PS_SET(0);\n}\n\n/*\n * PZ port IO needs to configure BIOC as well.\n * Errata: E00029：IOC PAD_CTL register write restrictions.\n * When the PE bit is 1, bit [3] must be set to 1,\n * and DS can only be selected as 0b001 (low drive strength) or 0b110 (high drive strength).\n */\nvoid init_gpio_pins_using_gpio0(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PZ02].FUNC_CTL = IOC_PZ02_FUNC_CTL_GPIO_Z_02;\n    HPM_BIOC->PAD[IOC_PAD_PZ02].FUNC_CTL = BIOC_PZ02_FUNC_CTL_SOC_PZ_02;\n    HPM_IOC->PAD[IOC_PAD_PZ02].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\n/*\n * Errata: E00029：IOC PAD_CTL register write restrictions.\n * When the PE bit is 1, bit [3] must be set to 1,\n * and DS can only be selected as 0b001 (low drive strength) or 0b110 (high drive strength).\n */\nvoid init_spi2_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE31].FUNC_CTL = IOC_PE31_FUNC_CTL_SPI2_CSN;\n    HPM_IOC->PAD[IOC_PAD_PE31].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    HPM_IOC->PAD[IOC_PAD_PE30].FUNC_CTL = IOC_PE30_FUNC_CTL_SPI2_MOSI;\n    HPM_IOC->PAD[IOC_PAD_PE30].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08;\n\n    HPM_IOC->PAD[IOC_PAD_PE27].FUNC_CTL = IOC_PE27_FUNC_CTL_SPI2_SCLK | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_IOC->PAD[IOC_PAD_PE27].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08;\n\n    HPM_IOC->PAD[IOC_PAD_PE28].FUNC_CTL = IOC_PE28_FUNC_CTL_SPI2_MISO;\n    HPM_IOC->PAD[IOC_PAD_PE28].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08;\n}\n\n/*\n * Errata: E00029：IOC PAD_CTL register write restrictions.\n * When the PE bit is 1, bit [3] must be set to 1,\n * and DS can only be selected as 0b001 (low drive strength) or 0b110 (high drive strength).\n */\nvoid init_spi2_pins_with_gpio_as_cs(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE27].FUNC_CTL = IOC_PE27_FUNC_CTL_SPI2_SCLK | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_IOC->PAD[IOC_PAD_PE27].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08;\n\n    HPM_IOC->PAD[IOC_PAD_PE28].FUNC_CTL = IOC_PE28_FUNC_CTL_SPI2_MISO;\n    HPM_IOC->PAD[IOC_PAD_PE28].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08;\n\n    HPM_IOC->PAD[IOC_PAD_PE30].FUNC_CTL = IOC_PE30_FUNC_CTL_SPI2_MOSI;\n    HPM_IOC->PAD[IOC_PAD_PE30].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08;\n\n    HPM_IOC->PAD[IOC_PAD_PE31].FUNC_CTL = IOC_PE31_FUNC_CTL_GPIO_E_31;\n    HPM_IOC->PAD[IOC_PAD_PE31].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\nvoid init_gptmr3_pins(void)\n{\n    /* TMR3 compare 1 */\n    HPM_IOC->PAD[IOC_PAD_PE24].FUNC_CTL = IOC_PE24_FUNC_CTL_GPTMR3_COMP_1;\n}\n\nvoid init_gptmr4_pins(void)\n{\n    /* TMR4 capture 1 */\n    HPM_IOC->PAD[IOC_PAD_PE25].FUNC_CTL = IOC_PE25_FUNC_CTL_GPTMR4_CAPT_1;\n}\n\nvoid init_gptmr5_pins(void)\n{\n    /* TMR5 compare 2 */\n    HPM_IOC->PAD[IOC_PAD_PD24].FUNC_CTL = IOC_PD24_FUNC_CTL_TRGM2_P_10;\n\n    /* TMR5 compare 3 */\n    HPM_IOC->PAD[IOC_PAD_PD23].FUNC_CTL = IOC_PD23_FUNC_CTL_TRGM2_P_11;\n\n    trgm_output_t trgm2_io_config0 = {0};\n    trgm2_io_config0.invert = 0;\n    trgm2_io_config0.type = trgm_output_same_as_input;\n    trgm2_io_config0.input = HPM_TRGM2_INPUT_SRC_GPTMR5_OUT2;\n    trgm_output_config(HPM_TRGM2, HPM_TRGM2_OUTPUT_SRC_TRGM2_P10, &trgm2_io_config0);\n\n    trgm_enable_io_output(HPM_TRGM2, 1 << 10);\n\n    trgm_output_t trgm2_io_config1 = {0};\n    trgm2_io_config1.invert = 0;\n    trgm2_io_config1.type = trgm_output_same_as_input;\n    trgm2_io_config1.input = HPM_TRGM2_INPUT_SRC_GPTMR5_OUT3;\n    trgm_output_config(HPM_TRGM2, HPM_TRGM2_OUTPUT_SRC_TRGM2_P11, &trgm2_io_config1);\n\n    trgm_enable_io_output(HPM_TRGM2, 1 << 11);\n}\n\nvoid init_hall_trgm_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PD16].FUNC_CTL = IOC_PD16_FUNC_CTL_TRGM2_P_06;\n\n    HPM_IOC->PAD[IOC_PAD_PD20].FUNC_CTL = IOC_PD20_FUNC_CTL_TRGM2_P_07;\n\n    HPM_IOC->PAD[IOC_PAD_PD25].FUNC_CTL = IOC_PD25_FUNC_CTL_TRGM2_P_08;\n}\n\nvoid init_qei_trgm_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PD19].FUNC_CTL = IOC_PD19_FUNC_CTL_TRGM2_P_09;\n\n    HPM_IOC->PAD[IOC_PAD_PD24].FUNC_CTL = IOC_PD24_FUNC_CTL_TRGM2_P_10;\n}\n\nvoid init_i2s0_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PF02].FUNC_CTL = IOC_PF02_FUNC_CTL_I2S0_RXD_2;\n\n    HPM_IOC->PAD[IOC_PAD_PF03].FUNC_CTL = IOC_PF03_FUNC_CTL_I2S0_MCLK;\n\n    HPM_IOC->PAD[IOC_PAD_PF04].FUNC_CTL = IOC_PF04_FUNC_CTL_I2S0_TXD_2;\n\n    HPM_IOC->PAD[IOC_PAD_PF06].FUNC_CTL = IOC_PF06_FUNC_CTL_I2S0_BCLK;\n\n    HPM_IOC->PAD[IOC_PAD_PF09].FUNC_CTL = IOC_PF09_FUNC_CTL_I2S0_FCLK;\n}\n\n/* PY port IO needs to configure PIOC */\nvoid init_dao_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PY08].FUNC_CTL = IOC_PY08_FUNC_CTL_DAOR_P;\n    HPM_PIOC->PAD[IOC_PAD_PY08].FUNC_CTL = PIOC_PY08_FUNC_CTL_SOC_PY_08;\n\n    HPM_IOC->PAD[IOC_PAD_PY09].FUNC_CTL = IOC_PY09_FUNC_CTL_DAOR_N;\n    HPM_PIOC->PAD[IOC_PAD_PY09].FUNC_CTL = PIOC_PY09_FUNC_CTL_SOC_PY_09;\n}\n\n/* PY port IO needs to configure PIOC */\nvoid init_pdm_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PY10].FUNC_CTL = IOC_PY10_FUNC_CTL_PDM0_CLK;\n    HPM_PIOC->PAD[IOC_PAD_PY10].FUNC_CTL = PIOC_PY10_FUNC_CTL_SOC_PY_10;\n\n    HPM_IOC->PAD[IOC_PAD_PY11].FUNC_CTL = IOC_PY11_FUNC_CTL_PDM0_D_0;\n    HPM_PIOC->PAD[IOC_PAD_PY11].FUNC_CTL = PIOC_PY11_FUNC_CTL_SOC_PY_11;\n}\n\nvoid init_vad_pins(void)\n{\n    HPM_PIOC->PAD[IOC_PAD_PY10].FUNC_CTL = PIOC_PY10_FUNC_CTL_VAD_CLK;\n\n    HPM_PIOC->PAD[IOC_PAD_PY11].FUNC_CTL = PIOC_PY11_FUNC_CTL_VAD_DAT;\n}\n\nvoid init_cam_pins(void)\n{\n    /* configure rst pin function, PY port IO needs to configure PIOC */\n    HPM_IOC->PAD[IOC_PAD_PY05].FUNC_CTL = IOC_PY05_FUNC_CTL_GPIO_Y_05;\n    HPM_PIOC->PAD[IOC_PAD_PY05].FUNC_CTL = PIOC_PY05_FUNC_CTL_SOC_PY_05;\n\n    HPM_IOC->PAD[IOC_PAD_PA07].FUNC_CTL = IOC_PA07_FUNC_CTL_CAM0_D_2;\n\n    HPM_IOC->PAD[IOC_PAD_PA03].FUNC_CTL = IOC_PA03_FUNC_CTL_CAM0_D_3;\n\n    HPM_IOC->PAD[IOC_PAD_PA08].FUNC_CTL = IOC_PA08_FUNC_CTL_CAM0_D_4;\n\n    HPM_IOC->PAD[IOC_PAD_PA09].FUNC_CTL = IOC_PA09_FUNC_CTL_CAM0_D_5;\n\n    HPM_IOC->PAD[IOC_PAD_PA00].FUNC_CTL = IOC_PA00_FUNC_CTL_CAM0_D_6;\n\n    HPM_IOC->PAD[IOC_PAD_PA04].FUNC_CTL = IOC_PA04_FUNC_CTL_CAM0_D_7;\n\n    HPM_IOC->PAD[IOC_PAD_PA01].FUNC_CTL = IOC_PA01_FUNC_CTL_CAM0_D_8;\n\n    HPM_IOC->PAD[IOC_PAD_PA02].FUNC_CTL = IOC_PA02_FUNC_CTL_CAM0_D_9;\n\n    HPM_IOC->PAD[IOC_PAD_PA10].FUNC_CTL = IOC_PA10_FUNC_CTL_CAM0_XCLK;\n\n    HPM_IOC->PAD[IOC_PAD_PA05].FUNC_CTL = IOC_PA05_FUNC_CTL_CAM0_HSYNC;\n\n    HPM_IOC->PAD[IOC_PAD_PA06].FUNC_CTL = IOC_PA06_FUNC_CTL_CAM0_VSYNC;\n\n    HPM_IOC->PAD[IOC_PAD_PA11].FUNC_CTL = IOC_PA11_FUNC_CTL_CAM0_PIXCLK;\n}\n\nvoid init_butn_pins(void)\n{\n    HPM_BIOC->PAD[IOC_PAD_PZ02].FUNC_CTL = BIOC_PZ02_FUNC_CTL_PBUTN;\n\n    HPM_BIOC->PAD[IOC_PAD_PZ03].FUNC_CTL = BIOC_PZ03_FUNC_CTL_WBUTN;\n\n    HPM_BIOC->PAD[IOC_PAD_PZ04].FUNC_CTL = BIOC_PZ04_FUNC_CTL_PLED;\n\n    HPM_BIOC->PAD[IOC_PAD_PZ05].FUNC_CTL = BIOC_PZ05_FUNC_CTL_WLED;\n}\n\nvoid init_acmp_pins(void)\n{\n    /* configure to ACMP_COMP_1(ALT16) function */\n    HPM_IOC->PAD[IOC_PAD_PE25].FUNC_CTL = IOC_PE25_FUNC_CTL_ACMP_COMP_1;\n\n    /* configure to CMP1_INP7 function */\n    HPM_IOC->PAD[IOC_PAD_PE23].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;\n\n    /* configure to CMP1_INN6 function */\n    HPM_IOC->PAD[IOC_PAD_PE21].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;\n}\n\nvoid init_enet0_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PF00].FUNC_CTL = IOC_PF00_FUNC_CTL_GPIO_F_00;\n\n    HPM_IOC->PAD[IOC_PAD_PE23].FUNC_CTL = IOC_PE23_FUNC_CTL_ETH0_MDIO;\n\n    HPM_IOC->PAD[IOC_PAD_PE22].FUNC_CTL = IOC_PE22_FUNC_CTL_ETH0_MDC;\n\n    HPM_IOC->PAD[IOC_PAD_PD31].FUNC_CTL = IOC_PD31_FUNC_CTL_ETH0_RXD_0;\n\n    HPM_IOC->PAD[IOC_PAD_PE04].FUNC_CTL = IOC_PE04_FUNC_CTL_ETH0_RXD_1;\n\n    HPM_IOC->PAD[IOC_PAD_PE02].FUNC_CTL = IOC_PE02_FUNC_CTL_ETH0_RXD_2;\n\n    HPM_IOC->PAD[IOC_PAD_PE07].FUNC_CTL = IOC_PE07_FUNC_CTL_ETH0_RXD_3;\n\n    HPM_IOC->PAD[IOC_PAD_PE03].FUNC_CTL = IOC_PE03_FUNC_CTL_ETH0_RXCK;\n\n    HPM_IOC->PAD[IOC_PAD_PD30].FUNC_CTL = IOC_PD30_FUNC_CTL_ETH0_RXDV;\n\n    HPM_IOC->PAD[IOC_PAD_PE06].FUNC_CTL = IOC_PE06_FUNC_CTL_ETH0_TXD_0;\n\n    HPM_IOC->PAD[IOC_PAD_PD29].FUNC_CTL = IOC_PD29_FUNC_CTL_ETH0_TXD_1;\n\n    HPM_IOC->PAD[IOC_PAD_PD28].FUNC_CTL = IOC_PD28_FUNC_CTL_ETH0_TXD_2;\n\n    HPM_IOC->PAD[IOC_PAD_PE05].FUNC_CTL = IOC_PE05_FUNC_CTL_ETH0_TXD_3;\n\n    HPM_IOC->PAD[IOC_PAD_PE01].FUNC_CTL = IOC_PE01_FUNC_CTL_ETH0_TXCK;\n\n    HPM_IOC->PAD[IOC_PAD_PE00].FUNC_CTL = IOC_PE00_FUNC_CTL_ETH0_TXEN;\n}\n\nvoid init_enet1_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE26].FUNC_CTL = IOC_PE26_FUNC_CTL_GPIO_E_26;\n\n    HPM_IOC->PAD[IOC_PAD_PD11].FUNC_CTL = IOC_PD11_FUNC_CTL_ETH1_MDC;\n\n    HPM_IOC->PAD[IOC_PAD_PD14].FUNC_CTL = IOC_PD14_FUNC_CTL_ETH1_MDIO;\n\n    HPM_IOC->PAD[IOC_PAD_PE20].FUNC_CTL = IOC_PE20_FUNC_CTL_ETH1_RXD_0;\n\n    HPM_IOC->PAD[IOC_PAD_PE18].FUNC_CTL = IOC_PE18_FUNC_CTL_ETH1_RXD_1;\n\n    HPM_IOC->PAD[IOC_PAD_PE15].FUNC_CTL = IOC_PE15_FUNC_CTL_ETH1_RXDV;\n\n    HPM_IOC->PAD[IOC_PAD_PE19].FUNC_CTL = IOC_PE19_FUNC_CTL_ETH1_TXD_0;\n\n    HPM_IOC->PAD[IOC_PAD_PE17].FUNC_CTL = IOC_PE17_FUNC_CTL_ETH1_TXD_1;\n\n    HPM_IOC->PAD[IOC_PAD_PE14].FUNC_CTL = IOC_PE14_FUNC_CTL_ETH1_TXEN;\n\n    HPM_IOC->PAD[IOC_PAD_PE16].FUNC_CTL = IOC_PE16_FUNC_CTL_ETH1_REFCLK | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n}\n\nvoid init_pwm2_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PD28].FUNC_CTL = IOC_PD28_FUNC_CTL_PWM2_P_5;\n\n    HPM_IOC->PAD[IOC_PAD_PD29].FUNC_CTL = IOC_PD29_FUNC_CTL_PWM2_P_4;\n\n    HPM_IOC->PAD[IOC_PAD_PD30].FUNC_CTL = IOC_PD30_FUNC_CTL_PWM2_P_1;\n\n    HPM_IOC->PAD[IOC_PAD_PD31].FUNC_CTL = IOC_PD31_FUNC_CTL_PWM2_P_0;\n\n    HPM_IOC->PAD[IOC_PAD_PE03].FUNC_CTL = IOC_PE03_FUNC_CTL_PWM2_P_3;\n\n    HPM_IOC->PAD[IOC_PAD_PE04].FUNC_CTL = IOC_PE04_FUNC_CTL_PWM2_P_2;\n}\n\nvoid init_pwm3_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE17].FUNC_CTL = IOC_PE17_FUNC_CTL_PWM3_P_6;\n\n    HPM_IOC->PAD[IOC_PAD_PE18].FUNC_CTL = IOC_PE18_FUNC_CTL_PWM3_P_7;\n}\n\nvoid init_adc12_pins(void)\n{\n    /* ADC0.VIN11 */\n    HPM_IOC->PAD[IOC_PAD_PE25].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;\n}\n\nvoid init_adc16_pins(void)\n{\n    /* ADC3.INA2 */\n    HPM_IOC->PAD[IOC_PAD_PE29].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;\n}\n\nvoid init_adc_bldc_pins(void)\n{\n    /* ADC0.VINP7 */\n    HPM_IOC->PAD[IOC_PAD_PE21].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;\n\n    /* ADC1.VINP10 */\n    HPM_IOC->PAD[IOC_PAD_PE24].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;\n\n    /* ADC2.VINP11 */\n    HPM_IOC->PAD[IOC_PAD_PE25].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;\n}\n\nvoid init_usb0_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PF10].FUNC_CTL = IOC_PF10_FUNC_CTL_USB0_ID;\n\n    HPM_IOC->PAD[IOC_PAD_PF08].FUNC_CTL = IOC_PF08_FUNC_CTL_USB0_OC;\n}\n\nvoid init_usb1_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PF07].FUNC_CTL = IOC_PF07_FUNC_CTL_USB1_ID;\n\n    HPM_IOC->PAD[IOC_PAD_PF05].FUNC_CTL = IOC_PF05_FUNC_CTL_USB1_OC;\n}\n\nvoid init_can0_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PB15].FUNC_CTL = IOC_PB15_FUNC_CTL_CAN0_TXD;\n\n    HPM_IOC->PAD[IOC_PAD_PB17].FUNC_CTL = IOC_PB17_FUNC_CTL_CAN0_RXD;\n}\n\nvoid init_mcan0_transceiver_phy_pin(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PB14].FUNC_CTL = IOC_PB14_FUNC_CTL_GPIO_B_14;\n}\n\nvoid init_sdxc1_cmd_pin_enable_1v8_enable_opendrain(void)\n{\n    /* SDXC1.CMD */\n    HPM_IOC->PAD[IOC_PAD_PD21].FUNC_CTL = IOC_PD21_FUNC_CTL_SDC1_CMD | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_IOC->PAD[IOC_PAD_PD21].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_OD_SET(1);\n}\n\nvoid init_sdxc1_cmd_pin_enable_1v8_disable_opendrain(void)\n{\n    /* SDXC1.CMD */\n    HPM_IOC->PAD[IOC_PAD_PD21].FUNC_CTL = IOC_PD21_FUNC_CTL_SDC1_CMD | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_IOC->PAD[IOC_PAD_PD21].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_OD_SET(0);\n}\n\nvoid init_sdxc1_cmd_pin_disable_1v8_enable_opendrain(void)\n{\n    /* SDXC1.CMD */\n    HPM_IOC->PAD[IOC_PAD_PD21].FUNC_CTL = IOC_PD21_FUNC_CTL_SDC1_CMD | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_IOC->PAD[IOC_PAD_PD21].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_OD_SET(1);\n}\n\nvoid init_sdxc1_cmd_pin_disable_1v8_disable_opendrain(void)\n{\n    /* SDXC1.CMD */\n    HPM_IOC->PAD[IOC_PAD_PD21].FUNC_CTL = IOC_PD21_FUNC_CTL_SDC1_CMD | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_IOC->PAD[IOC_PAD_PD21].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_OD_SET(0);\n}\n\nvoid init_sdxc1_cd_pin(void)\n{\n    /* SDXC1.CDN */\n    HPM_IOC->PAD[IOC_PAD_PD15].FUNC_CTL = IOC_PD15_FUNC_CTL_GPIO_D_15;\n    HPM_IOC->PAD[IOC_PAD_PD15].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\nvoid init_sdxc1_clk_data_pins_enable_1v8(void)\n{\n    /* SDXC1.CLK */\n    HPM_IOC->PAD[IOC_PAD_PD22].FUNC_CTL = IOC_PD22_FUNC_CTL_SDC1_CLK;\n    HPM_IOC->PAD[IOC_PAD_PD22].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.DATA0 */\n    HPM_IOC->PAD[IOC_PAD_PD18].FUNC_CTL = IOC_PD18_FUNC_CTL_SDC1_DATA_0;\n    HPM_IOC->PAD[IOC_PAD_PD18].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\nvoid init_sdxc1_clk_data_pins_disable_1v8(void)\n{\n    /* SDXC1.CLK */\n    HPM_IOC->PAD[IOC_PAD_PD22].FUNC_CTL = IOC_PD22_FUNC_CTL_SDC1_CLK;\n    HPM_IOC->PAD[IOC_PAD_PD22].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.DATA0 */\n    HPM_IOC->PAD[IOC_PAD_PD18].FUNC_CTL = IOC_PD18_FUNC_CTL_SDC1_DATA_0;\n    HPM_IOC->PAD[IOC_PAD_PD18].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\nvoid init_sdxc1_clk_data_pins_width4_enable_1v8(void)\n{\n    /* SDXC1.DATA1 */\n    HPM_IOC->PAD[IOC_PAD_PD17].FUNC_CTL = IOC_PD17_FUNC_CTL_SDC1_DATA_1;\n    HPM_IOC->PAD[IOC_PAD_PD17].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.DATA2 */\n    HPM_IOC->PAD[IOC_PAD_PD27].FUNC_CTL = IOC_PD27_FUNC_CTL_SDC1_DATA_2;\n    HPM_IOC->PAD[IOC_PAD_PD27].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.DATA3 */\n    HPM_IOC->PAD[IOC_PAD_PD26].FUNC_CTL = IOC_PD26_FUNC_CTL_SDC1_DATA_3;\n    HPM_IOC->PAD[IOC_PAD_PD26].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.CLK */\n    HPM_IOC->PAD[IOC_PAD_PD22].FUNC_CTL = IOC_PD22_FUNC_CTL_SDC1_CLK;\n    HPM_IOC->PAD[IOC_PAD_PD22].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.DATA0 */\n    HPM_IOC->PAD[IOC_PAD_PD18].FUNC_CTL = IOC_PD18_FUNC_CTL_SDC1_DATA_0;\n    HPM_IOC->PAD[IOC_PAD_PD18].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\nvoid init_sdxc1_clk_data_pins_width4_disable_1v8(void)\n{\n    /* SDXC1.DATA1 */\n    HPM_IOC->PAD[IOC_PAD_PD17].FUNC_CTL = IOC_PD17_FUNC_CTL_SDC1_DATA_1;\n    HPM_IOC->PAD[IOC_PAD_PD17].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.DATA2 */\n    HPM_IOC->PAD[IOC_PAD_PD27].FUNC_CTL = IOC_PD27_FUNC_CTL_SDC1_DATA_2;\n    HPM_IOC->PAD[IOC_PAD_PD27].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.DATA3 */\n    HPM_IOC->PAD[IOC_PAD_PD26].FUNC_CTL = IOC_PD26_FUNC_CTL_SDC1_DATA_3;\n    HPM_IOC->PAD[IOC_PAD_PD26].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.CLK */\n    HPM_IOC->PAD[IOC_PAD_PD22].FUNC_CTL = IOC_PD22_FUNC_CTL_SDC1_CLK;\n    HPM_IOC->PAD[IOC_PAD_PD22].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n\n    /* SDXC1.DATA0 */\n    HPM_IOC->PAD[IOC_PAD_PD18].FUNC_CTL = IOC_PD18_FUNC_CTL_SDC1_DATA_0;\n    HPM_IOC->PAD[IOC_PAD_PD18].PAD_CTL = IOC_PAD_PAD_CTL_MS_SET(0) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_DS_SET(6) | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\nvoid init_sdxc1_pwr_pin(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PC20].FUNC_CTL = IOC_PC20_FUNC_CTL_GPIO_C_20;\n    HPM_IOC->PAD[IOC_PAD_PC20].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\nvoid init_clk_obs_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PB02].FUNC_CTL = IOC_PB02_FUNC_CTL_SYSCTL_CLK_OBS_0;\n}\n\nvoid init_rgb_pwm_pins(void)\n{\n    /* Red */\n    HPM_IOC->PAD[IOC_PAD_PB11].FUNC_CTL = IOC_PB11_FUNC_CTL_TRGM1_P_01;\n\n    /* Green */\n    HPM_IOC->PAD[IOC_PAD_PB12].FUNC_CTL = IOC_PB12_FUNC_CTL_TRGM0_P_06;\n\n    /* BLUE */\n    HPM_IOC->PAD[IOC_PAD_PB13].FUNC_CTL = IOC_PB13_FUNC_CTL_TRGM1_P_03;\n}\n\nvoid init_led_pins_as_gpio(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PB11].FUNC_CTL = IOC_PB11_FUNC_CTL_GPIO_B_11;\n\n    HPM_IOC->PAD[IOC_PAD_PB12].FUNC_CTL = IOC_PB12_FUNC_CTL_GPIO_B_12;\n\n    HPM_IOC->PAD[IOC_PAD_PB13].FUNC_CTL = IOC_PB13_FUNC_CTL_GPIO_B_13;\n}\n\nvoid init_enet_pps_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PF05].FUNC_CTL = IOC_PF05_FUNC_CTL_ETH0_EVTO_0;\n}\n\nvoid init_enet_pps_capture_pins(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE25].FUNC_CTL = IOC_PE25_FUNC_CTL_ETH0_EVTI_1;\n}\n\nvoid init_tamper_pins(void)\n{\n    HPM_BIOC->PAD[IOC_PAD_PZ08].FUNC_CTL = BIOC_PZ08_FUNC_CTL_TAMP_08 | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n\n    HPM_BIOC->PAD[IOC_PAD_PZ09].FUNC_CTL = BIOC_PZ09_FUNC_CTL_TAMP_09;\n\n    HPM_BIOC->PAD[IOC_PAD_PZ10].FUNC_CTL = BIOC_PZ10_FUNC_CTL_TAMP_10;\n}\n\n/* for uart_rx_line_status case, need to a gpio pin to sent break signal */\nvoid init_uart_break_signal_pin(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE31].FUNC_CTL = IOC_PE31_FUNC_CTL_GPIO_E_31;\n    HPM_IOC->PAD[IOC_PAD_PE31].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | 0x08 | IOC_PAD_PAD_CTL_PS_SET(1);\n}\n\nvoid init_gptmr3_channel_pin_as_output(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE24].FUNC_CTL = IOC_PE24_FUNC_CTL_GPTMR3_COMP_1;\n}\n\nvoid init_gptmr4_channel_pin_as_capture(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE25].FUNC_CTL = IOC_PE25_FUNC_CTL_GPTMR4_CAPT_1;\n}\n\nvoid init_gptmr5_channel2_pin_as_output(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PD24].FUNC_CTL = IOC_PD24_FUNC_CTL_TRGM2_P_10;\n\n    trgm_output_t trgm2_io_config0 = {0};\n    trgm2_io_config0.invert = 0;\n    trgm2_io_config0.type = trgm_output_same_as_input;\n    trgm2_io_config0.input = HPM_TRGM2_INPUT_SRC_GPTMR5_OUT2;\n    trgm_output_config(HPM_TRGM2, HPM_TRGM2_OUTPUT_SRC_TRGM2_P10, &trgm2_io_config0);\n\n    trgm_enable_io_output(HPM_TRGM2, 1 << 10);\n}\n\nvoid init_gptmr5_channel3_pin_as_output(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PD23].FUNC_CTL = IOC_PD23_FUNC_CTL_TRGM2_P_11;\n\n    trgm_output_t trgm2_io_config0 = {0};\n    trgm2_io_config0.invert = 0;\n    trgm2_io_config0.type = trgm_output_same_as_input;\n    trgm2_io_config0.input = HPM_TRGM2_INPUT_SRC_GPTMR5_OUT3;\n    trgm_output_config(HPM_TRGM2, HPM_TRGM2_OUTPUT_SRC_TRGM2_P11, &trgm2_io_config0);\n\n    trgm_enable_io_output(HPM_TRGM2, 1 << 11);\n}\n\nvoid init_clk_ref_pin(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE24].FUNC_CTL = IOC_PE24_FUNC_CTL_SOC_REF1;\n}\n\nvoid init_brownout_indicate_pin(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PE30].FUNC_CTL = IOC_PE30_FUNC_CTL_GPIO_E_30;\n}\n\nvoid board_init_i2c_eeprom_pin(void)\n{\n    HPM_IOC->PAD[IOC_PAD_PZ11].FUNC_CTL = IOC_PZ11_FUNC_CTL_I2C0_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_BIOC->PAD[IOC_PAD_PZ11].FUNC_CTL = BIOC_PZ11_FUNC_CTL_SOC_PZ_11;\n    HPM_IOC->PAD[IOC_PAD_PZ11].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1);\n\n    HPM_IOC->PAD[IOC_PAD_PZ10].FUNC_CTL = IOC_PZ10_FUNC_CTL_I2C0_SDA | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;\n    HPM_BIOC->PAD[IOC_PAD_PZ10].FUNC_CTL = BIOC_PZ10_FUNC_CTL_SOC_PZ_10;\n    HPM_IOC->PAD[IOC_PAD_PZ10].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1);\n}\n"
  },
  {
    "path": "hw/bsp/hpmicro/boards/hpm6750evk2/pinmux.h",
    "content": "\n/*\n * Copyright (c) 2025 HPMicro\n *\n * SPDX-License-Identifier: BSD-3-Clause\n *\n *\n * Automatically generated by HPM Pinmux Tool\n *\n *\n * Note:\n * PY and PZ IOs: if any SOC pin function needs to be routed to these IOs,\n * besides of IOC, PIOC/BIOC needs to be configured SOC_GPIO_X_xx, so that\n * expected SoC function can be enabled on these IOs.\n */\n\n#ifndef HPM_PINMUX_H\n#define HPM_PINMUX_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nvoid init_uart0_pins(void);\nvoid init_uart2_pins(void);\nvoid init_uart13_pins(void);\nvoid init_puart_pins(void);\nvoid init_uart13_pins_as_gpio(void);\nvoid init_lcd0_pins(void);\nvoid init_cap_pins(void);\nvoid init_i2c0_pins_as_gpio(void);\nvoid init_i2c0_pins(void);\nvoid init_femc_pins(void);\nvoid init_gpio_pins_with_pull_up(void);\nvoid init_gpio_pins_using_gpio0(void);\nvoid init_spi2_pins(void);\nvoid init_spi2_pins_with_gpio_as_cs(void);\nvoid init_gptmr3_pins(void);\nvoid init_gptmr4_pins(void);\nvoid init_gptmr5_pins(void);\nvoid init_hall_trgm_pins(void);\nvoid init_qei_trgm_pins(void);\nvoid init_i2s0_pins(void);\nvoid init_dao_pins(void);\nvoid init_pdm_pins(void);\nvoid init_vad_pins(void);\nvoid init_cam_pins(void);\nvoid init_butn_pins(void);\nvoid init_acmp_pins(void);\nvoid init_enet0_pins(void);\nvoid init_enet1_pins(void);\nvoid init_pwm2_pins(void);\nvoid init_pwm3_pins(void);\nvoid init_adc12_pins(void);\nvoid init_adc16_pins(void);\nvoid init_adc_bldc_pins(void);\nvoid init_usb0_pins(void);\nvoid init_usb1_pins(void);\nvoid init_can0_pins(void);\nvoid init_mcan0_transceiver_phy_pin(void);\nvoid init_sdxc1_cmd_pin_enable_1v8_enable_opendrain(void);\nvoid init_sdxc1_cmd_pin_enable_1v8_disable_opendrain(void);\nvoid init_sdxc1_cmd_pin_disable_1v8_enable_opendrain(void);\nvoid init_sdxc1_cmd_pin_disable_1v8_disable_opendrain(void);\nvoid init_sdxc1_cd_pin(void);\nvoid init_sdxc1_clk_data_pins_enable_1v8(void);\nvoid init_sdxc1_clk_data_pins_disable_1v8(void);\nvoid init_sdxc1_clk_data_pins_width4_enable_1v8(void);\nvoid init_sdxc1_clk_data_pins_width4_disable_1v8(void);\nvoid init_sdxc1_pwr_pin(void);\nvoid init_clk_obs_pins(void);\nvoid init_rgb_pwm_pins(void);\nvoid init_led_pins_as_gpio(void);\nvoid init_enet_pps_pins(void);\nvoid init_enet_pps_capture_pins(void);\nvoid init_tamper_pins(void);\nvoid init_uart_break_signal_pin(void);\nvoid init_gptmr3_channel_pin_as_output(void);\nvoid init_gptmr4_channel_pin_as_capture(void);\nvoid init_gptmr5_channel2_pin_as_output(void);\nvoid init_gptmr5_channel3_pin_as_output(void);\nvoid init_clk_ref_pin(void);\nvoid init_brownout_indicate_pin(void);\nvoid board_init_i2c_eeprom_pin(void);\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* HPM_PINMUX_H */\n"
  },
  {
    "path": "hw/bsp/hpmicro/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: HPMicro\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include \"hpm_clock_drv.h\"\n#include \"hpm_uart_drv.h\"\n#include \"hpm_gpio_drv.h\"\n#include \"hpm_romapi.h\"\n\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\n// Initialize on-board peripherals : led, button, uart and USB\nvoid board_init(void) {\n  board_init_clock();\n  board_init_pmp();\n\n  board_init_usb(HPM_USB0);\n#ifdef HPM_USB1\n  board_init_usb(HPM_USB1);\n#endif\n\n  board_init_console();\n  board_init_gpio_pins();\n  board_init_led_pins();\n}\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n//--------------------------------------------------------------------+\nSDK_DECLARE_EXT_ISR_M(IRQn_USB0, isr_usb0)\nvoid isr_usb0(void) {\n  tusb_int_handler(0, true);\n}\n\n#ifdef HPM_USB1_BASE\nSDK_DECLARE_EXT_ISR_M(IRQn_USB1, isr_usb1)\nvoid isr_usb1(void) {\n  tusb_int_handler(1, true);\n}\n#endif\n\nvoid board_led_write(bool state) {\n  if (state) {\n    gpio_write_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN, BOARD_LED_ON_LEVEL);\n  } else {\n    gpio_write_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN, BOARD_LED_OFF_LEVEL);\n  }\n}\n\nuint32_t board_button_read(void) {\n  return (gpio_read_pin(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN) == BOARD_BUTTON_PRESSED_VALUE) ? 1 : 0;\n}\n\n// Get characters from UART. Return number of read bytes\nint board_uart_read(uint8_t *buf, int len) {\n  int        count = 0;\n  hpm_stat_t status;\n\n  while (count < len) {\n    status = uart_try_receive_byte((UART_Type *)BOARD_CONSOLE_UART_BASE, (uint8_t *)&buf[count]);\n    if (status == status_success) {\n      count++;\n    } else {\n      break;\n    }\n  }\n\n  return count;\n}\n\n// Send characters to UART. Return number of sent bytes\nint board_uart_write(void const *buf, int len) {\n  uart_send_data((UART_Type *)BOARD_CONSOLE_UART_BASE, (uint8_t const *)buf, len);\n\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n// Get current milliseconds, must be implemented when no RTOS is used\nuint32_t tusb_time_millis_api(void) {\n  return (hpm_csr_get_core_cycle() / clock_get_core_clock_ticks_per_ms());\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/hpmicro/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/hpmicro/hpm_sdk)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nif (NOT DEFINED CMAKE_SYSTEM_CPU)\n  set(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL \"System Processor\")\nendif ()\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS HPMICRO CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${HPM_SOC}/toolchains/gcc/flash_xip.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\nset(STARTUP_FILE_GNU ${HPM_SOC}/toolchains/gcc/start.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/pinmux.c\n    ${HPM_SOC}/boot/hpm_bootheader.c\n    ${HPM_SOC}/toolchains/gcc/initfini.c\n    ${HPM_SOC}/toolchains/reset.c\n    ${HPM_SOC}/toolchains/trap.c\n    ${HPM_SOC}/system.c\n    ${HPM_SOC}/hpm_sysctl_drv.c\n    ${HPM_SOC}/hpm_clock_drv.c\n    ${HPM_SOC}/hpm_otp_drv.c\n    ${SDK_DIR}/arch/riscv/l1c/hpm_l1c_drv.c\n    ${SDK_DIR}/drivers/src/hpm_gpio_drv.c\n    ${SDK_DIR}/drivers/src/hpm_uart_drv.c\n    ${SDK_DIR}/drivers/src/hpm_usb_drv.c\n    ${SDK_DIR}/drivers/src/hpm_pcfg_drv.c\n    ${SDK_DIR}/drivers/src/hpm_pmp_drv.c\n    ${SDK_DIR}/drivers/src/${HPM_PLLCTL_DRV_FILE}\n    )\n\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    FLASH_XIP\n    [=[CFG_TUD_MEM_SECTION=__attribute__((section(\".noncacheable.non_init\")))]=]\n    [=[CFG_TUH_MEM_SECTION=__attribute__((section(\".noncacheable.non_init\")))]=]\n    )\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board\n    ${HPM_SOC}\n    ${HPM_IP_REGS}\n    ${HPM_SOC}/boot\n    ${HPM_SOC}/toolchains\n    ${HPM_SOC}/toolchains/gcc\n    ${SDK_DIR}/arch\n    ${SDK_DIR}/arch/riscv/intc\n    ${SDK_DIR}/arch/riscv/l1c\n    ${SDK_DIR}/drivers/inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_HPM)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${SDK_DIR}/utils/hpm_sbrk.c\n    ${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c\n    ${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c\n    ${TOP}/src/portable/ehci/ehci.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    ${TOP}/src/portable/chipidea/ci_hs\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      -Wl,--defsym,_flash_size=${BOARD_FLASH_SIZE}\n      -Wl,--defsym,_stack_size=${BOARD_STACK_SIZE}\n      -Wl,--defsym,_heap_size=${BOARD_HEAP_SIZE}\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -Wl,--defsym,_flash_size=${BOARD_FLASH_SIZE}\n      -Wl,--defsym,_stack_size=${BOARD_STACK_SIZE}\n      -Wl,--defsym,_heap_size=${BOARD_HEAP_SIZE}\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(\n      ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n      ${SDK_DIR}/utils/hpm_sbrk.c\n      PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes -Wno-cast-align -Wno-discarded-qualifiers\"\n    )\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/hpmicro/family.mk",
    "content": "SDK_DIR = hw/mcu/hpmicro/hpm_sdk\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= rv32imac-ilp32\n\n# All source paths should be relative to the top level.\nLD_FILE = $(HPM_SOC)/toolchains/gcc/flash_xip.ld\n\nCFLAGS += \\\n  -DFLASH_XIP \\\n  -DCFG_TUSB_MCU=OPT_MCU_HPM \\\n  -DCFG_TUD_MEM_SECTION='__attribute__((section(\".noncacheable.non_init\")))' \\\n  -DCFG_TUH_MEM_SECTION='__attribute__((section(\".noncacheable.non_init\")))'\n\nifdef BOARD_TUD_RHPORT\nCFLAGS += -DBOARD_TUD_RHPORT=$(BOARD_TUD_RHPORT)\nCFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\nendif\n\nifdef BOARD_TUH_RHPORT\nCFLAGS += -DBOARD_TUH_RHPORT=$(BOARD_TUH_RHPORT)\nCFLAGS += -DBOARD_TUH_MAX_SPEED=OPT_MODE_HIGH_SPEED\nendif\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=cast-align -Wno-error=double-promotion -Wno-error=discarded-qualifiers \\\n          -Wno-error=undef -Wno-error=unused-parameter -Wno-error=redundant-decls\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\nLDFLAGS += -Wl,--defsym,_flash_size=$(BOARD_FLASH_SIZE)\nLDFLAGS += -Wl,--defsym,_stack_size=$(BOARD_STACK_SIZE)\nLDFLAGS += -Wl,--defsym,_heap_size=$(BOARD_HEAP_SIZE)\n\nSRC_C += \\\n\tsrc/portable/chipidea/ci_hs/dcd_ci_hs.c \\\n\tsrc/portable/chipidea/ci_hs/hcd_ci_hs.c \\\n\tsrc/portable/ehci/ehci.c \\\n\t${BOARD_PATH}/board.c \\\n\t${BOARD_PATH}/pinmux.c \\\n\t$(HPM_SOC)/boot/hpm_bootheader.c \\\n\t$(HPM_SOC)/toolchains/gcc/initfini.c \\\n\t$(HPM_SOC)/toolchains/reset.c \\\n\t$(HPM_SOC)/toolchains/trap.c \\\n\t$(HPM_SOC)/system.c \\\n\t$(HPM_SOC)/hpm_sysctl_drv.c \\\n\t$(HPM_SOC)/hpm_clock_drv.c \\\n\t$(HPM_SOC)/hpm_otp_drv.c \\\n\t$(SDK_DIR)/arch/riscv/l1c/hpm_l1c_drv.c \\\n\t$(SDK_DIR)/utils/hpm_sbrk.c \\\n\t$(SDK_DIR)/drivers/src/hpm_gpio_drv.c \\\n\t$(SDK_DIR)/drivers/src/hpm_uart_drv.c \\\n\t$(SDK_DIR)/drivers/src/hpm_usb_drv.c \\\n\t$(SDK_DIR)/drivers/src/hpm_pcfg_drv.c \\\n\t$(SDK_DIR)/drivers/src/hpm_pmp_drv.c \\\n\t$(SDK_DIR)/drivers/src/$(HPM_PLLCTL_DRV_FILE) \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/src/portable/chipidea/ci_hs \\\n\t$(TOP)/$(HPM_SOC) \\\n\t$(TOP)/$(HPM_IP_REGS) \\\n\t$(TOP)/$(HPM_SOC)/boot \\\n\t$(TOP)/$(HPM_SOC)/toolchains \\\n\t$(TOP)/$(HPM_SOC)/toolchains/gcc \\\n\t$(TOP)/$(SDK_DIR)/arch \\\n\t$(TOP)/$(SDK_DIR)/arch/riscv/intc \\\n\t$(TOP)/$(SDK_DIR)/arch/riscv/l1c \\\n\t$(TOP)/$(SDK_DIR)/drivers/inc \\\n\nSRC_S += $(HPM_SOC)/toolchains/gcc/start.S\n"
  },
  {
    "path": "hw/bsp/imxrt/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*8*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v12.0\nprocessor: MIMXRT1011xxxxx\npackage_id: MIMXRT1011DAE5A\nmcu_data: ksdk2_0\nprocessor_version: 14.0.0\nboard: MIMXRT1010-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: ADC_ALT_CLK.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: CORE_CLK_ROOT.outFreq, value: 500 MHz}\n- {id: ENET_500M_REF_CLK.outFreq, value: 500 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 125 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 62.5 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY_CLK.outFreq, value: 480 MHz}\nsettings:\n- {id: CCM.ADC_ACLK_PODF.scale, value: '12', locked: true}\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.FLEXSPI_PODF.scale, value: '4', locked: true}\n- {id: CCM.IPG_PODF.scale, value: '4'}\n- {id: CCM.LPSPI_PODF.scale, value: '5'}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.PRE_PERIPH_CLK_SEL.sel, value: CCM_ANALOG.ENET_500M_REF_CLK}\n- {id: CCM.SAI1_CLK_SEL.sel, value: CCM_ANALOG.PLL3_PFD2_CLK}\n- {id: CCM.SAI3_CLK_SEL.sel, value: CCM_ANALOG.PLL3_PFD2_CLK}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM_ANALOG.PLL2.denom, value: '1'}\n- {id: CCM_ANALOG.PLL2.num, value: '0'}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD2_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD2_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL2_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '22', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL3_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL6_BYPASS.sel, value: CCM_ANALOG.PLL6}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN =\n    {\n        .enableClkOutput500M = true,              /* Enable the PLL providing the ENET 500MHz reference clock */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting the VDD_SOC to 1.25V. It is necessary to config CORE to 500Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x12);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Init Enet PLL. */\n    CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 3);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 0);\n    CLOCK_SetMux(kCLOCK_FlexspiSrcMux, 0);\n#endif\n    /* Disable ADC_ACLK_EN clock gate. */\n    CCM->CSCMR2 &= ~CCM_CSCMR2_ADC_ACLK_EN_MASK;\n    /* Set ADC_ACLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_AdcDiv, 11);\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 22);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 18);\n#endif\n    /* Set periph clock source to use the USB1 PLL output (PLL3_SW_CLK) temporarily. */\n    /* Set Pll3 SW clock source to use the USB1 PLL output. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* Set safe value of the AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 1);\n    /* Set periph clock2 clock source to use the PLL3_SW_CLK. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set peripheral clock source (glitchless mux) to select the temporary core clock. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 18);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 18);\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             500000000U  /*!< Core clock frequency: 500000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_ADC_ALT_CLK                40000000UL     /* Clock consumers of ADC_ALT_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL        /* Clock consumers of CKIL_SYNC_CLK_ROOT output : CSU, EWM, GPT1, GPT2, KPP, PIT, RTWDOG, SNVS, SPDIF, TEMPMON, USB, WDOG1, WDOG2 */\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL            /* Clock consumers of CLKO1_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL            /* Clock consumers of CLKO2_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL      /* Clock consumers of CLK_1M output : EWM, RTWDOG */\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL     /* Clock consumers of CLK_24M output : GPT1, GPT2 */\n#define BOARD_BOOTCLOCKRUN_CORE_CLK_ROOT              500000000UL    /* Clock consumers of CORE_CLK_ROOT output : ARM, FLEXSPI */\n#define BOARD_BOOTCLOCKRUN_ENET_500M_REF_CLK          500000000UL    /* Clock consumers of ENET_500M_REF_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL     /* Clock consumers of FLEXIO1_CLK_ROOT output : FLEXIO1 */\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           132000000UL    /* Clock consumers of FLEXSPI_CLK_ROOT output : FLEXSPI */\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      62500000UL     /* Clock consumers of GPT1_ipg_clk_highfreq output : GPT1 */\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      62500000UL     /* Clock consumers of GPT2_ipg_clk_highfreq output : GPT2 */\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               125000000UL    /* Clock consumers of IPG_CLK_ROOT output : ADC1, ADC_ETC, AIPSTZ1, AIPSTZ2, AOI, ARM, CCM, CSU, DCDC, DCP, DMA0, DMAMUX, EWM, FLEXIO1, FLEXRAM, FLEXSPI, GPC, GPIO1, GPIO2, GPIO5, IOMUXC, KPP, LPI2C1, LPI2C2, LPSPI1, LPSPI2, LPUART1, LPUART2, LPUART3, LPUART4, OCOTP, PWM1, RTWDOG, SAI1, SAI3, SNVS, SPDIF, SRC, TEMPMON, TRNG, USB, WDOG1, WDOG2, XBARA */\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL     /* Clock consumers of LPI2C_CLK_ROOT output : LPI2C1, LPI2C2 */\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL    /* Clock consumers of LPSPI_CLK_ROOT output : LPSPI1, LPSPI2 */\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL     /* Clock consumers of MQS_MCLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            62500000UL     /* Clock consumers of PERCLK_CLK_ROOT output : GPT1, GPT2, PIT */\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL     /* Clock consumers of SAI1_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL     /* Clock consumers of SAI1_MCLK1 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL     /* Clock consumers of SAI1_MCLK2 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL     /* Clock consumers of SAI1_MCLK3 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL     /* Clock consumers of SAI3_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL     /* Clock consumers of SAI3_MCLK1 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL            /* Clock consumers of SAI3_MCLK2 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL     /* Clock consumers of SAI3_MCLK3 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL     /* Clock consumers of SPDIF0_CLK_ROOT output : SPDIF */\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL            /* Clock consumers of SPDIF0_EXTCLK_OUT output : SPDIF */\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL    /* Clock consumers of TRACE_CLK_ROOT output : ARM */\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL     /* Clock consumers of UART_CLK_ROOT output : LPUART1, LPUART2, LPUART3, LPUART4 */\n#define BOARD_BOOTCLOCKRUN_USBPHY_CLK                 480000000UL    /* Clock consumers of USBPHY_CLK output : TEMPMON, USB */\n\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Enet PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v14.0\nprocessor: MIMXRT1011xxxxx\npackage_id: MIMXRT1011DAE5A\nmcu_data: ksdk2_0\nprocessor_version: 14.0.0\nboard: MIMXRT1010-EVK\nexternal_user_signals: {}\npin_labels:\n- {pin_num: '1', pin_signal: GPIO_11, label: GPIO_11, identifier: GPIO_11}\n- {pin_num: '10', pin_signal: GPIO_03, label: 'SAI1_RXD0/U10[16]', identifier: LED;USER_LED}\n- {pin_num: '4', pin_signal: GPIO_08, label: 'SAI1_MCLK/U10[11]', identifier: USER_BUTTON}\npower_domains: {NVCC_GPIO: '3.3'}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '3', peripheral: LPUART1, signal: RXD, pin_signal: GPIO_09}\n  - {pin_num: '2', peripheral: LPUART1, signal: TXD, pin_signal: GPIO_10}\n  - {pin_num: '10', peripheral: GPIO1, signal: 'gpiomux_io, 03', pin_signal: GPIO_03, identifier: USER_LED, direction: OUTPUT}\n  - {pin_num: '4', peripheral: GPIO1, signal: 'gpiomux_io, 08', pin_signal: GPIO_08, direction: INPUT, pull_keeper_select: Pull, pull_up_down_config: Pull_Up_100K_Ohm}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  /* GPIO configuration of USER_LED on GPIO_03 (pin 10) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_03 (pin 10) */\n  GPIO_PinInit(GPIO1, 3U, &USER_LED_config);\n\n  /* GPIO configuration of USER_BUTTON on GPIO_08 (pin 4) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_08 (pin 4) */\n  GPIO_PinInit(GPIO1, 8U, &USER_BUTTON_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_03_GPIOMUX_IO03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_08_GPIOMUX_IO08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_09_LPUART1_RXD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_10_LPUART1_TXD, 0U);\n  IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &\n    (~(BOARD_INITPINS_IOMUXC_GPR_GPR26_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR26_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_08_GPIOMUX_IO08, 0xB0A0U);\n}\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define BOARD_INITPINS_IOMUXC_GPR_GPR26_GPIO_SEL_MASK 0x08U /*!< Select GPIO1 or GPIO2: affected bits mask */\n\n/* GPIO_09 (number 3), LPUART1_RXD/J56[2] */\n/* Routed pin properties */\n#define BOARD_INITPINS_UART1_RXD_PERIPHERAL                              LPUART1   /*!< Peripheral name */\n#define BOARD_INITPINS_UART1_RXD_SIGNAL                                      RXD   /*!< Signal name */\n\n/* GPIO_10 (number 2), LPUART1_TXD/J56[4] */\n/* Routed pin properties */\n#define BOARD_INITPINS_UART1_TXD_PERIPHERAL                              LPUART1   /*!< Peripheral name */\n#define BOARD_INITPINS_UART1_TXD_SIGNAL                                      TXD   /*!< Signal name */\n\n/* GPIO_03 (number 10), SAI1_RXD0/U10[16] */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO1   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                gpiomux_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                       3U   /*!< Signal channel */\n\n/* GPIO_08 (number 4), SAI1_MCLK/U10[11] */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO1   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                             gpiomux_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    8U   /*!< Signal channel */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/board.cmake",
    "content": "set(MCU_FAMILY RT1010)\nset(MCU_VARIANT MIMXRT1011)\n\nset(JLINK_DEVICE MIMXRT1011xxx5A)\nset(PYOCD_TARGET mimxrt1010)\nset(NXPLINK_DEVICE MIMXRT1011xxxxx:EVK-MIMXRT1010)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkmimxrt1010_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1011DAE5A\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Metro M7 1011\n   url: https://www.adafruit.com/product/5600\n*/\n\n#ifndef BOARD_M7_1011_H_\n#define BOARD_M7_1011_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE     (8*1024*1024)\n\n// LED: IOMUXC_GPIO_03_GPIOMUX_IO03\n#define LED_PORT            BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN             BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON        1\n\n// D8 as button: GPIO8\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_PERIPHERAL\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_CHANNEL\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: IOMUXC_GPIO_09_LPUART1_RXD, IOMUXC_GPIO_10_LPUART1_TXD\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1011DAE5A -DCFG_EXAMPLE_VIDEO_READONLY\nMCU_FAMILY = RT1010\nMCU_VARIANT = MIMXRT1011\n\n# LD file with uf2\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1011xxx5A\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1010\n\n# flash using pyocd\nflash: flash-uf2\nflash-uf2: $(BUILD)/$(PROJECT).uf2\n\t@echo copying $<\n\t@$(CP) $< /media/$(USER)/METROM7BOOT\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/evkmimxrt1010_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2019 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkmimxrt1010_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\")))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            .sflashPadType    = kSerialFlash_4Pads,\n            .serialClkFreq    = kFlexSpiSerialClk_100MHz,\n            .sflashA1Size     = 16u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 24),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 64u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/evkmimxrt1010_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2019 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__\n#define __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_120MHz = 7,\n    kFlexSpiSerialClk_133MHz = 8,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/metro_m7_1011.ld",
    "content": "/*\n** ###################################################################\n**     Processors:          MIMXRT1011CAE4A\n**                          MIMXRT1011DAE5A\n**\n**     Compiler:            GNU C Compiler\n**     Reference manual:    IMXRT1010RM Rev.0, 09/2019\n**     Version:             rev. 1.0, 2019-08-01\n**     Build:               b210709\n**\n**     Abstract:\n**         Linker file for the GNU C Compiler\n**\n**     Copyright 2016 Freescale Semiconductor, Inc.\n**     Copyright 2016-2021 NXP\n**     All rights reserved.\n**\n**     SPDX-License-Identifier: BSD-3-Clause\n**\n**     http:                 www.nxp.com\n**     mail:                 support@nxp.com\n**\n** ###################################################################\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\nHEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;\nVECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x00000400 : 0;\n\n/* Specify the memory areas */\nMEMORY\n{\n  m_flash_config        (RX)  : ORIGIN = 0x60000400, LENGTH = 0x00000C00\n  m_ivt                 (RX)  : ORIGIN = 0x60001000, LENGTH = 0x00001000\n\n  m_interrupts          (RX)  : ORIGIN = 0x6000C000, LENGTH = 0x00000400\n  m_text                (RX)  : ORIGIN = 0x6000C400, LENGTH = (8*1024*1024 - 0xC400)\n  m_qacode              (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00008000\n  m_data                (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00008000\n  m_data2               (RW)  : ORIGIN = 0x20200000, LENGTH = 0x00010000\n}\n\n/* Define output sections */\nSECTIONS\n{\n  __NCACHE_REGION_START = ORIGIN(m_data2);\n  __NCACHE_REGION_SIZE  = 0;\n\n  .flash_config :\n  {\n    . = ALIGN(4);\n    __FLASH_BASE = .;\n    KEEP(* (.boot_hdr.conf))     /* flash config section */\n    . = ALIGN(4);\n  } > m_flash_config\n\n  ivt_begin = ORIGIN(m_flash_config) + LENGTH(m_flash_config);\n\n  .ivt : AT(ivt_begin)\n  {\n    . = ALIGN(4);\n    KEEP(* (.boot_hdr.ivt))           /* ivt section */\n    KEEP(* (.boot_hdr.boot_data))     /* boot section */\n    KEEP(* (.boot_hdr.dcd_data))      /* dcd section */\n    . = ALIGN(4);\n  } > m_ivt\n\n  /* The startup code goes first into internal RAM */\n  .interrupts :\n  {\n    __VECTOR_TABLE = .;\n    __Vectors = .;\n    . = ALIGN(4);\n    KEEP(*(.isr_vector))     /* Startup code */\n    . = ALIGN(4);\n  } > m_interrupts\n\n  /* The program code and other data goes into internal RAM */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)                 /* .text sections (code) */\n    *(.text*)                /* .text* sections (code) */\n    *(.rodata)               /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)              /* .rodata* sections (constants, strings, etc.) */\n    *(.glue_7)               /* glue arm to thumb code */\n    *(.glue_7t)              /* glue thumb to arm code */\n    *(.eh_frame)\n    KEEP (*(.init))\n    KEEP (*(.fini))\n    . = ALIGN(4);\n  } > m_text\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } > m_text\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } > m_text\n\n .ctors :\n  {\n    __CTOR_LIST__ = .;\n    /* gcc uses crtbegin.o to find the start of\n       the constructors, so we make sure it is\n       first.  Because this is a wildcard, it\n       doesn't matter if the user does not\n       actually link against crtbegin.o; the\n       linker won't look for a file to match a\n       wildcard.  The wildcard also means that it\n       doesn't matter which directory crtbegin.o\n       is in.  */\n    KEEP (*crtbegin.o(.ctors))\n    KEEP (*crtbegin?.o(.ctors))\n    /* We don't want to include the .ctor section from\n       from the crtend.o file until after the sorted ctors.\n       The .ctor section from the crtend file contains the\n       end of ctors marker and it must be last */\n    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))\n    KEEP (*(SORT(.ctors.*)))\n    KEEP (*(.ctors))\n    __CTOR_END__ = .;\n  } > m_text\n\n  .dtors :\n  {\n    __DTOR_LIST__ = .;\n    KEEP (*crtbegin.o(.dtors))\n    KEEP (*crtbegin?.o(.dtors))\n    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))\n    KEEP (*(SORT(.dtors.*)))\n    KEEP (*(.dtors))\n    __DTOR_END__ = .;\n  } > m_text\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } > m_text\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } > m_text\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } > m_text\n\n  __etext = .;    /* define a global symbol at end of code */\n  __DATA_ROM = .; /* Symbol is used by startup for data initialization */\n\n  .interrupts_ram :\n  {\n    . = ALIGN(4);\n    __VECTOR_RAM__ = .;\n    __interrupts_ram_start__ = .; /* Create a global symbol at data start */\n    *(.m_interrupts_ram)     /* This is a user defined section */\n    . += VECTOR_RAM_SIZE;\n    . = ALIGN(4);\n    __interrupts_ram_end__ = .; /* Define a global symbol at data end */\n  } > m_data\n\n  __VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts);\n  __RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0;\n\n  .data : AT(__DATA_ROM)\n  {\n    . = ALIGN(4);\n    __DATA_RAM = .;\n    __data_start__ = .;      /* create a global symbol at data start */\n    *(m_usb_dma_init_data)\n    *(.data)                 /* .data sections */\n    *(.data*)                /* .data* sections */\n    *(DataQuickAccess)       /* quick access data section */\n    KEEP(*(.jcr*))\n    . = ALIGN(4);\n    __data_end__ = .;        /* define a global symbol at data end */\n  } > m_data\n\n  __ram_function_flash_start = __DATA_ROM + (__data_end__ - __data_start__); /* Symbol is used by startup for TCM data initialization */\n\n  .ram_function : AT(__ram_function_flash_start)\n  {\n    . = ALIGN(32);\n    __ram_function_start__ = .;\n    *(CodeQuickAccess)\n    . = ALIGN(128);\n    __ram_function_end__ = .;\n  } > m_qacode\n\n  __NDATA_ROM = __ram_function_flash_start + (__ram_function_end__ - __ram_function_start__);\n  .ncache.init : AT(__NDATA_ROM)\n  {\n    __noncachedata_start__ = .;   /* create a global symbol at ncache data start */\n    *(NonCacheable.init)\n    . = ALIGN(4);\n    __noncachedata_init_end__ = .;   /* create a global symbol at initialized ncache data end */\n  } > m_data\n  . = __noncachedata_init_end__;\n  .ncache :\n  {\n    *(NonCacheable)\n    . = ALIGN(4);\n    __noncachedata_end__ = .;     /* define a global symbol at ncache data end */\n  } > m_data\n\n  __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);\n  text_end = ORIGIN(m_text) + LENGTH(m_text);\n  ASSERT(__DATA_END <= text_end, \"region m_text overflowed with text and data\")\n\n  /* Uninitialized data section */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    . = ALIGN(4);\n    __START_BSS = .;\n    __bss_start__ = .;\n    *(m_usb_dma_noninit_data)\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n    . = ALIGN(4);\n    __bss_end__ = .;\n    __END_BSS = .;\n  } > m_data\n\n  .heap :\n  {\n    . = ALIGN(8);\n    __end__ = .;\n    PROVIDE(end = .);\n    __HeapBase = .;\n    . += HEAP_SIZE;\n    __HeapLimit = .;\n    __heap_limit = .; /* Add for _sbrk */\n  } > m_data\n\n  .stack :\n  {\n    . = ALIGN(8);\n    . += STACK_SIZE;\n  } > m_data\n\n  /* Initializes stack on the end of block */\n  __StackTop   = ORIGIN(m_data) + LENGTH(m_data);\n  __StackLimit = __StackTop - STACK_SIZE;\n  PROVIDE(__stack = __StackTop);\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n\n  ASSERT(__StackLimit >= __HeapLimit, \"region m_data overflowed with stack and heap\")\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/metro_m7_1011.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1010-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_14 http://mcuxpresso.nxp.com/XSD/mex_configuration_14.xsd\" uuid=\"f341eb24-9521-4127-8932-81692aeb76df\" version=\"14\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_14\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1011xxxxx</processor>\n      <package>MIMXRT1011DAE5A</package>\n      <board>MIMXRT1010-EVK</board>\n      <board_revision>A</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>true</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"14.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>14.0.0</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"1\" pin_signal=\"GPIO_11\" label=\"GPIO_11\" identifier=\"GPIO_11\"/>\n               <pin_label pin_num=\"10\" pin_signal=\"GPIO_03\" label=\"SAI1_RXD0/U10[16]\" identifier=\"LED;USER_LED\"/>\n               <pin_label pin_num=\"4\" pin_signal=\"GPIO_08\" label=\"SAI1_MCLK/U10[11]\" identifier=\"USER_BUTTON\"/>\n            </pin_labels>\n            <external_user_signals>\n               <routingDetailsColumns/>\n               <properties/>\n            </external_user_signals>\n            <power_domains>\n               <power_domain name=\"NVCC_GPIO\" value=\"3.3\"/>\n            </power_domains>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO1\" description=\"Peripheral GPIO1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"RXD\" pin_num=\"3\" pin_signal=\"GPIO_09\"/>\n                  <pin peripheral=\"LPUART1\" signal=\"TXD\" pin_num=\"2\" pin_signal=\"GPIO_10\"/>\n                  <pin peripheral=\"GPIO1\" signal=\"gpiomux_io, 03\" pin_num=\"10\" pin_signal=\"GPIO_03\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"USER_LED\"/>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpiomux_io, 08\" pin_num=\"4\" pin_signal=\"GPIO_08\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"12.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>14.0.0</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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"ADC_ALT_CLK.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CORE_CLK_ROOT.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_500M_REF_CLK.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"125 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.ADC_ACLK_PODF.scale\" value=\"12\" locked=\"true\"/>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.IPG_PODF.scale\" value=\"4\" locked=\"false\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"false\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.PRE_PERIPH_CLK_SEL.sel\" value=\"CCM_ANALOG.ENET_500M_REF_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.SAI1_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.SAI3_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"22\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL6_BYPASS.sel\" value=\"CCM_ANALOG.PLL6\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"2.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"5e519eed-bd94-4950-84de-0f29de85bcea\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"COMBO_SENSOR\" uuid=\"2342e373-ea2e-4bed-8aa4-bd33509155f6\" type=\"lpi2c\" type_id=\"lpi2c_6b71962515c3208facfccd030afebc98\" mode=\"master\" peripheral=\"LPI2C1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"main\" quick_selection=\"qs_interrupt\">\n                        <setting name=\"clockSource\" value=\"Lpi2cClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"BOARD_BootClockRUN\"/>\n                     </config_set>\n                     <config_set name=\"interrupt_vector\"/>\n                     <config_set name=\"master\" quick_selection=\"qs_master_transfer\">\n                        <setting name=\"mode\" value=\"transfer\"/>\n                        <struct name=\"config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"enableDoze\" value=\"true\"/>\n                           <setting name=\"debugEnable\" value=\"false\"/>\n                           <setting name=\"ignoreAck\" value=\"false\"/>\n                           <setting name=\"pinConfig\" value=\"kLPI2C_2PinOpenDrain\"/>\n                           <setting name=\"baudRate_Hz\" value=\"100000\"/>\n                           <setting name=\"busIdleTimeout_ns\" value=\"0\"/>\n                           <setting name=\"pinLowTimeout_ns\" value=\"0\"/>\n                           <setting name=\"sdaGlitchFilterWidth_ns\" value=\"0\"/>\n                           <setting name=\"sclGlitchFilterWidth_ns\" value=\"0\"/>\n                           <struct name=\"hostRequest\">\n                              <setting name=\"enable\" value=\"false\"/>\n                              <setting name=\"source\" value=\"kLPI2C_HostRequestExternalPin\"/>\n                              <setting name=\"polarity\" value=\"kLPI2C_HostRequestPinActiveHigh\"/>\n                           </struct>\n                           <set name=\"edmaRequestSources\">\n                              <selected/>\n                           </set>\n                        </struct>\n                        <struct name=\"transfer\">\n                           <setting name=\"blocking\" value=\"false\"/>\n                           <setting name=\"enable_custom_handle\" value=\"false\"/>\n                           <struct name=\"callback\">\n                              <setting name=\"name\" value=\"\"/>\n                              <setting name=\"userData\" value=\"\"/>\n                           </struct>\n                           <set name=\"flags\">\n                              <selected/>\n                           </set>\n                           <setting name=\"slaveAddress\" value=\"0\"/>\n                           <setting name=\"direction\" value=\"kLPI2C_Write\"/>\n                           <setting name=\"subaddress\" value=\"0\"/>\n                           <setting name=\"subaddressSize\" value=\"1\"/>\n                           <setting name=\"blocking_buffer\" value=\"false\"/>\n                           <setting name=\"enable_custom_buffer\" value=\"false\"/>\n                           <setting name=\"dataSize\" value=\"1\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"0d9274fe-8f49-48a8-8e6a-8c3ac009384d\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"USER_BUTTON\" uuid=\"6c9e57cc-d98c-4f6d-bf94-3920a8fd474e\" type=\"igpio\" type_id=\"igpio_b1c1fa279aa7069dca167502b8589cb7\" mode=\"GPIO\" peripheral=\"GPIO2\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_gpio\">\n                        <setting name=\"enable_irq_comb_0_15\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_0_15\">\n                           <setting name=\"IRQn\" value=\"GPIO2_Combined_0_15_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"USER_LED\" uuid=\"0f7a142d-ad6c-4e47-a2a3-015e90afa37b\" type=\"igpio\" type_id=\"igpio_b1c1fa279aa7069dca167502b8589cb7\" mode=\"GPIO\" peripheral=\"GPIO1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_gpio\">\n                        <setting name=\"enable_irq_comb_0_15\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_0_15\">\n                           <setting name=\"IRQn\" value=\"GPIO1_Combined_0_15_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"enable_irq_comb_16_31\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_16_31\">\n                           <setting name=\"IRQn\" value=\"GPIO1_Combined_16_31_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"2a54e709-5718-4b89-8b7b-71cefb418658\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"991327ca-3ad0-49d1-aff3-37b7734338db\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"3e46e698-099c-4180-92f5-2af1abbb93a5\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"27e43a4b-bddb-4db2-8f6b-3f6a73008a27\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"c946fe99-5d76-4cca-8be0-dea3c7861b68\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"c18a4299-93be-44e8-b563-3985b3e264c5\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"6149366a-a07f-40a7-8909-00ba459085a7\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"15cc4d18-2002-44a4-b7e7-f681a046f26c\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/metro_m7_1011/ozone/metro_m7_1011.jdebug",
    "content": "\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n  Project.SetTraceSource (\"Trace Pins\");\n  Project.SetTraceTiming (50, 50, 50, 50);\n  Project.SetDevice (\"MIMXRT1011xxx4A\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"20 MHz\");\n  Project.AddSvdFile (\"$(InstallDir)/Config/CPU/Cortex-M7F.svd\");\n  Project.AddSvdFile (\"$(InstallDir)/Config/Peripherals/ARMv7M.svd\");\n  Project.AddSvdFile (\"./MIMXRT1011.svd\");\n\n\n  // timing delay for trace pins in pico seconds, default is 2 nano seconds\n\n\tFile.Open (\"../../../../../../examples/cmake-build-metro-m7-1011-sd/device/cdc_msc/cdc_msc.elf\");\n}\n\n/*********************************************************************\n*\n*      TargetReset\n*\n* Function description\n*   Replaces the default target device reset routine. Optional.\n*\n* Notes\n*   This example demonstrates the usage when\n*   debugging a RAM program on a Cortex-M target device\n*\n**********************************************************************\n*/\n//void TargetReset (void) {\n//\n//  unsigned int SP;\n//  unsigned int PC;\n//  unsigned int VectorTableAddr;\n//\n//  Exec.Reset();\n//\n//  VectorTableAddr = Elf.GetBaseAddr();\n//\n//  if (VectorTableAddr != 0xFFFFFFFF) {\n//\n//    Util.Log(\"Resetting Program.\");\n//\n//    SP = Target.ReadU32(VectorTableAddr);\n//    Target.SetReg(\"SP\", SP);\n//\n//    PC = Target.ReadU32(VectorTableAddr + 4);\n//    Target.SetReg(\"PC\", PC);\n//  }\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetReset\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetReset (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetReset\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetReset (void) {\n}\n\n/*********************************************************************\n*\n*       DebugStart\n*\n* Function description\n*   Replaces the default debug session startup routine. Optional.\n*\n**********************************************************************\n*/\n//void DebugStart (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetConnect\n*\n* Function description\n*   Replaces the default target IF connection routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n\nvoid BeforeTargetConnect (void) {\n  //\n  // Trace pin init is done by J-Link script file as J-Link script files are IDE independent\n  //\n  //Project.SetJLinkScript(\"./ST_STM32H743_Traceconfig.pex\");\n}\n\n/*********************************************************************\n*\n*       AfterTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetDownload\n*\n* Function description\n*   Replaces the default program download routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*      AfterTargetDownload\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetDownload (void) {\n\n}\n\n/*********************************************************************\n*\n*       BeforeTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetHalt\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetHalt (void) {\n//}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v11.0\nprocessor: MIMXRT1011xxxxx\npackage_id: MIMXRT1011DAE5A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1010-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: ADC_ALT_CLK.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: CORE_CLK_ROOT.outFreq, value: 500 MHz}\n- {id: ENET_500M_REF_CLK.outFreq, value: 500 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 125 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 62.5 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY_CLK.outFreq, value: 480 MHz}\nsettings:\n- {id: CCM.ADC_ACLK_PODF.scale, value: '12', locked: true}\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.FLEXSPI_PODF.scale, value: '4', locked: true}\n- {id: CCM.IPG_PODF.scale, value: '4'}\n- {id: CCM.LPSPI_PODF.scale, value: '5'}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.PRE_PERIPH_CLK_SEL.sel, value: CCM_ANALOG.ENET_500M_REF_CLK}\n- {id: CCM.SAI1_CLK_SEL.sel, value: CCM_ANALOG.PLL3_PFD2_CLK}\n- {id: CCM.SAI3_CLK_SEL.sel, value: CCM_ANALOG.PLL3_PFD2_CLK}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM_ANALOG.PLL2.denom, value: '1'}\n- {id: CCM_ANALOG.PLL2.num, value: '0'}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD2_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD2_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL2_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '22', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL3_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL6_BYPASS.sel, value: CCM_ANALOG.PLL6}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN =\n    {\n        .enableClkOutput500M = true,              /* Enable the PLL providing the ENET 500MHz reference clock */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting the VDD_SOC to 1.25V. It is necessary to config CORE to 500Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x12);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Init Enet PLL. */\n    CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 3);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 0);\n    CLOCK_SetMux(kCLOCK_FlexspiSrcMux, 0);\n#endif\n    /* Disable ADC_ACLK_EN clock gate. */\n    CCM->CSCMR2 &= ~CCM_CSCMR2_ADC_ACLK_EN_MASK;\n    /* Set ADC_ACLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_AdcDiv, 11);\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 22);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 18);\n#endif\n    /* Set periph clock source to use the USB1 PLL output (PLL3_SW_CLK) temporarily. */\n    /* Set Pll3 SW clock source to use the USB1 PLL output. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* Set safe value of the AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 1);\n    /* Set periph clock2 clock source to use the PLL3_SW_CLK. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set peripheral clock source (glitchless mux) to select the temporary core clock. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 18);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 18);\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             500000000U  /*!< Core clock frequency: 500000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_ADC_ALT_CLK                40000000UL\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL\n#define BOARD_BOOTCLOCKRUN_CORE_CLK_ROOT              500000000UL\n#define BOARD_BOOTCLOCKRUN_ENET_500M_REF_CLK          500000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           132000000UL\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      62500000UL\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      62500000UL\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               125000000UL\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            62500000UL\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY_CLK                 480000000UL\n\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Enet PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v13.1\nprocessor: MIMXRT1011xxxxx\npackage_id: MIMXRT1011DAE5A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1010-EVK\nexternal_user_signals: {}\npin_labels:\n- {pin_num: '1', pin_signal: GPIO_11, label: GPIO_11, identifier: LED;USERLED;USER_LED}\npower_domains: {NVCC_GPIO: '3.3'}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '70', peripheral: GPIO2, signal: 'gpio_io, 05', pin_signal: GPIO_SD_05, direction: INPUT, pull_keeper_select: Pull, pull_up_down_config: Pull_Up_47K_Ohm}\n  - {pin_num: '1', peripheral: GPIO1, signal: 'gpiomux_io, 11', pin_signal: GPIO_11, identifier: USER_LED, direction: OUTPUT}\n  - {pin_num: '3', peripheral: LPUART1, signal: RXD, pin_signal: GPIO_09}\n  - {pin_num: '2', peripheral: LPUART1, signal: TXD, pin_signal: GPIO_10}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  /* GPIO configuration of USER_LED on GPIO_11 (pin 1) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_11 (pin 1) */\n  GPIO_PinInit(GPIO1, 11U, &USER_LED_config);\n\n  /* GPIO configuration of USER_BUTTON on GPIO_SD_05 (pin 70) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_SD_05 (pin 70) */\n  GPIO_PinInit(GPIO2, 5U, &USER_BUTTON_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_09_LPUART1_RXD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_10_LPUART1_TXD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_11_GPIOMUX_IO11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_05_GPIO2_IO05, 0U);\n  IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &\n    (~(BOARD_INITPINS_IOMUXC_GPR_GPR26_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR26_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_05_GPIO2_IO05, 0x70A0U);\n}\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define BOARD_INITPINS_IOMUXC_GPR_GPR26_GPIO_SEL_MASK 0x0820U /*!< Select GPIO1 or GPIO2: affected bits mask */\n\n/* GPIO_SD_05 (number 70), USER_BUTTON */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO2   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    5U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   5U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 5U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        5U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_BUTTON_PIN_MASK                           (1U << 5U)   /*!< PORT pin mask */\n\n/* GPIO_11 (number 1), GPIO_11 */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO1   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                gpiomux_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                      11U   /*!< Signal channel */\n\n/* GPIO_09 (number 3), LPUART1_RXD/J56[2] */\n/* Routed pin properties */\n#define BOARD_INITPINS_UART1_RXD_PERIPHERAL                              LPUART1   /*!< Peripheral name */\n#define BOARD_INITPINS_UART1_RXD_SIGNAL                                      RXD   /*!< Signal name */\n\n/* GPIO_10 (number 2), LPUART1_TXD/J56[4] */\n/* Routed pin properties */\n#define BOARD_INITPINS_UART1_TXD_PERIPHERAL                              LPUART1   /*!< Peripheral name */\n#define BOARD_INITPINS_UART1_TXD_SIGNAL                                      TXD   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake",
    "content": "set(MCU_FAMILY RT1010)\nset(MCU_VARIANT MIMXRT1011)\n\nset(JLINK_DEVICE MIMXRT1011xxx5A)\nset(PYOCD_TARGET mimxrt1010)\nset(NXPLINK_DEVICE MIMXRT1011xxxxx:EVK-MIMXRT1010)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkmimxrt1010_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1011DAE5A\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: i.MX RT1010 Evaluation Kit\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/i-mx-evaluation-and-development-boards/i-mx-rt1010-evaluation-kit:MIMXRT1010-EVK\n*/\n\n#ifndef BOARD_MIMXRT1010_EVK_H_\n#define BOARD_MIMXRT1010_EVK_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (0x1000000U)\n\n// LED: IOMUXC_GPIO_11_GPIOMUX_IO11\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// SW8 button: IOMUXC_GPIO_SD_05_GPIO2_IO05\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_GPIO\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_GPIO_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: IOMUXC_GPIO_09_LPUART1_RXD, IOMUXC_GPIO_10_LPUART1_TXD\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1011DAE5A -DCFG_EXAMPLE_VIDEO_READONLY\nMCU_FAMILY = RT1010\nMCU_VARIANT = MIMXRT1011\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1011xxx5A\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1010\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/evkmimxrt1010_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2019 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkmimxrt1010_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\")))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            .sflashPadType    = kSerialFlash_4Pads,\n            .serialClkFreq    = kFlexSpiSerialClk_100MHz,\n            .sflashA1Size     = 16u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 256u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/evkmimxrt1010_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2019 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__\n#define __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_120MHz = 7,\n    kFlexSpiSerialClk_133MHz = 8,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1011_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1010_evk/mimxrt1010_evk.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1010-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13 http://mcuxpresso.nxp.com/XSD/mex_configuration_13.xsd\" uuid=\"f341eb24-9521-4127-8932-81692aeb76df\" version=\"13\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1011xxxxx</processor>\n      <package>MIMXRT1011DAE5A</package>\n      <board>MIMXRT1010-EVK</board>\n      <board_revision>A</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>true</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"13.1\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>13.0.2</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"1\" pin_signal=\"GPIO_11\" label=\"GPIO_11\" identifier=\"LED;USERLED;USER_LED\"/>\n            </pin_labels>\n            <external_user_signals>\n               <properties/>\n            </external_user_signals>\n            <power_domains>\n               <power_domain name=\"NVCC_GPIO\" value=\"3.3\"/>\n            </power_domains>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO2\" description=\"Peripheral GPIO2 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 05\" pin_num=\"70\" pin_signal=\"GPIO_SD_05\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_47K_Ohm\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpiomux_io, 11\" pin_num=\"1\" pin_signal=\"GPIO_11\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"USER_LED\"/>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART1\" signal=\"RXD\" pin_num=\"3\" pin_signal=\"GPIO_09\"/>\n                  <pin peripheral=\"LPUART1\" signal=\"TXD\" pin_num=\"2\" pin_signal=\"GPIO_10\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"11.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>13.0.2</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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"ADC_ALT_CLK.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CORE_CLK_ROOT.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_500M_REF_CLK.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"125 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.ADC_ACLK_PODF.scale\" value=\"12\" locked=\"true\"/>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.IPG_PODF.scale\" value=\"4\" locked=\"false\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"false\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.PRE_PERIPH_CLK_SEL.sel\" value=\"CCM_ANALOG.ENET_500M_REF_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.SAI1_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.SAI3_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"22\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL6_BYPASS.sel\" value=\"CCM_ANALOG.PLL6\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"2.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"5e519eed-bd94-4950-84de-0f29de85bcea\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"COMBO_SENSOR\" uuid=\"2342e373-ea2e-4bed-8aa4-bd33509155f6\" type=\"lpi2c\" type_id=\"lpi2c_6b71962515c3208facfccd030afebc98\" mode=\"master\" peripheral=\"LPI2C1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"main\" quick_selection=\"qs_interrupt\">\n                        <setting name=\"clockSource\" value=\"Lpi2cClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"BOARD_BootClockRUN\"/>\n                     </config_set>\n                     <config_set name=\"interrupt_vector\"/>\n                     <config_set name=\"master\" quick_selection=\"qs_master_transfer\">\n                        <setting name=\"mode\" value=\"transfer\"/>\n                        <struct name=\"config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"enableDoze\" value=\"true\"/>\n                           <setting name=\"debugEnable\" value=\"false\"/>\n                           <setting name=\"ignoreAck\" value=\"false\"/>\n                           <setting name=\"pinConfig\" value=\"kLPI2C_2PinOpenDrain\"/>\n                           <setting name=\"baudRate_Hz\" value=\"100000\"/>\n                           <setting name=\"busIdleTimeout_ns\" value=\"0\"/>\n                           <setting name=\"pinLowTimeout_ns\" value=\"0\"/>\n                           <setting name=\"sdaGlitchFilterWidth_ns\" value=\"0\"/>\n                           <setting name=\"sclGlitchFilterWidth_ns\" value=\"0\"/>\n                           <struct name=\"hostRequest\">\n                              <setting name=\"enable\" value=\"false\"/>\n                              <setting name=\"source\" value=\"kLPI2C_HostRequestExternalPin\"/>\n                              <setting name=\"polarity\" value=\"kLPI2C_HostRequestPinActiveHigh\"/>\n                           </struct>\n                           <set name=\"edmaRequestSources\">\n                              <selected/>\n                           </set>\n                        </struct>\n                        <struct name=\"transfer\">\n                           <setting name=\"blocking\" value=\"false\"/>\n                           <setting name=\"enable_custom_handle\" value=\"false\"/>\n                           <struct name=\"callback\">\n                              <setting name=\"name\" value=\"\"/>\n                              <setting name=\"userData\" value=\"\"/>\n                           </struct>\n                           <set name=\"flags\">\n                              <selected/>\n                           </set>\n                           <setting name=\"slaveAddress\" value=\"0\"/>\n                           <setting name=\"direction\" value=\"kLPI2C_Write\"/>\n                           <setting name=\"subaddress\" value=\"0\"/>\n                           <setting name=\"subaddressSize\" value=\"1\"/>\n                           <setting name=\"blocking_buffer\" value=\"false\"/>\n                           <setting name=\"enable_custom_buffer\" value=\"false\"/>\n                           <setting name=\"dataSize\" value=\"1\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"0d9274fe-8f49-48a8-8e6a-8c3ac009384d\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"USER_BUTTON\" uuid=\"6c9e57cc-d98c-4f6d-bf94-3920a8fd474e\" type=\"igpio\" type_id=\"igpio_b1c1fa279aa7069dca167502b8589cb7\" mode=\"GPIO\" peripheral=\"GPIO2\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_gpio\">\n                        <setting name=\"enable_irq_comb_0_15\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_0_15\">\n                           <setting name=\"IRQn\" value=\"GPIO2_Combined_0_15_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"USER_LED\" uuid=\"0f7a142d-ad6c-4e47-a2a3-015e90afa37b\" type=\"igpio\" type_id=\"igpio_b1c1fa279aa7069dca167502b8589cb7\" mode=\"GPIO\" peripheral=\"GPIO1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_gpio\">\n                        <setting name=\"enable_irq_comb_0_15\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_0_15\">\n                           <setting name=\"IRQn\" value=\"GPIO1_Combined_0_15_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"enable_irq_comb_16_31\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_16_31\">\n                           <setting name=\"IRQn\" value=\"GPIO1_Combined_16_31_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"2a54e709-5718-4b89-8b7b-71cefb418658\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"991327ca-3ad0-49d1-aff3-37b7734338db\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"3e46e698-099c-4180-92f5-2af1abbb93a5\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"27e43a4b-bddb-4db2-8f6b-3f6a73008a27\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"c946fe99-5d76-4cca-8be0-dea3c7861b68\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"c18a4299-93be-44e8-b563-3985b3e264c5\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"6149366a-a07f-40a7-8909-00ba459085a7\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"15cc4d18-2002-44a4-b7e7-f681a046f26c\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v15.0\nprocessor: MIMXRT1015xxxxx\npackage_id: MIMXRT1015DAF5A\nmcu_data: ksdk2_0\nprocessor_version: 24.12.10\nboard: MIMXRT1015-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: AHB_CLK_ROOT.outFreq, value: 500 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: ENET_500M_REF_CLK.outFreq, value: 500 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 2160/11 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 125 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 62.5 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 352/3 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY1_CLK.outFreq, value: 480 MHz}\nsettings:\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.ARM_PODF.scale, value: '1', locked: true}\n- {id: CCM.CLKO2_SEL.sel, value: CCM.LPI2C_CLK_ROOT}\n- {id: CCM.FLEXSPI_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.IPG_PODF.scale, value: '4'}\n- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.PRE_PERIPH_CLK_SEL.sel, value: CCM.ARM_PODF}\n- {id: CCM.SEMC_PODF.scale, value: '2'}\n- {id: CCM.TRACE_PODF.scale, value: '3', locked: true}\n- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD2_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD2_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL2_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '22', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL3_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL4.denom, value: '50'}\n- {id: CCM_ANALOG.PLL4.div, value: '47'}\n- {id: CCM_ANALOG.PLL6_BYPASS.sel, value: CCM_ANALOG.PLL6}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN =\n    {\n        .enableClkOutput500M = true,              /* Enable the PLL providing the ENET 500MHz reference clock */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */\n    /* Setting the VDD_SOC to 1.25V. It is necessary to config AHB to 500Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x12);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    CLOCK_DisableClock(kCLOCK_Xbar2);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Set ARM_PODF. */\n    CLOCK_SetDiv(kCLOCK_ArmDiv, 0);\n    /* Set PERIPH_CLK2_PODF. */\n    CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* Set SEMC_PODF. */\n    CLOCK_SetDiv(kCLOCK_SemcDiv, 1);\n    /* Set Semc alt clock source. */\n    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);\n    /* Set Semc clock source. */\n    CLOCK_SetMux(kCLOCK_SemcMux, 0);\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 1);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 3);\n#endif\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 2);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 2);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai2);\n    /* Set SAI2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);\n    /* Set SAI2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai2Div, 1);\n    /* Set Sai2 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai2Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* Set Pll3 sw clock source. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 18);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 18);\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 22);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 18);\n#endif\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Init Enet PLL. */\n    CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(6);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             500000000U  /*!< Core clock frequency: 500000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT               500000000UL    /* Clock consumers of AHB_CLK_ROOT output : AIPSTZ1, AIPSTZ2, AIPSTZ3, AIPSTZ4, ARM, FLEXSPI */\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL        /* Clock consumers of CKIL_SYNC_CLK_ROOT output : CSU, EWM, GPT1, GPT2, KPP, PIT, RTWDOG, SNVS, SPDIF, TEMPMON, USB, WDOG1, WDOG2 */\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL            /* Clock consumers of CLKO1_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL            /* Clock consumers of CLKO2_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL      /* Clock consumers of CLK_1M output : EWM, RTWDOG */\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL     /* Clock consumers of CLK_24M output : GPT1, GPT2 */\n#define BOARD_BOOTCLOCKRUN_ENET_500M_REF_CLK          500000000UL    /* Clock consumers of ENET_500M_REF_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL     /* Clock consumers of FLEXIO1_CLK_ROOT output : FLEXIO1 */\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           196363636UL    /* Clock consumers of FLEXSPI_CLK_ROOT output : FLEXSPI */\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      62500000UL     /* Clock consumers of GPT1_ipg_clk_highfreq output : GPT1 */\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      62500000UL     /* Clock consumers of GPT2_ipg_clk_highfreq output : GPT2 */\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               125000000UL    /* Clock consumers of IPG_CLK_ROOT output : ADC1, ADC_ETC, AOI, ARM, BEE, CCM, CSU, DCDC, DCP, DMA0, DMAMUX, ENC1, EWM, FLEXIO1, FLEXRAM, FLEXSPI, GPC, GPIO1, GPIO2, GPIO3, GPIO5, IOMUXC, KPP, LPI2C1, LPI2C2, LPSPI1, LPSPI2, LPUART1, LPUART2, LPUART3, LPUART4, NVIC, OCOTP, PWM1, RTWDOG, SAI1, SAI2, SAI3, SNVS, SPDIF, SRC, TEMPMON, TMR1, TRNG, USB, WDOG1, WDOG2, XBARA, XBARB */\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL     /* Clock consumers of LPI2C_CLK_ROOT output : LPI2C1, LPI2C2 */\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL    /* Clock consumers of LPSPI_CLK_ROOT output : LPSPI1, LPSPI2 */\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL     /* Clock consumers of MQS_MCLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            62500000UL     /* Clock consumers of PERCLK_CLK_ROOT output : GPT1, GPT2, PIT */\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL     /* Clock consumers of SAI1_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL     /* Clock consumers of SAI1_MCLK1 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL     /* Clock consumers of SAI1_MCLK2 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL     /* Clock consumers of SAI1_MCLK3 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              63529411UL     /* Clock consumers of SAI2_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 63529411UL     /* Clock consumers of SAI2_MCLK1 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL            /* Clock consumers of SAI2_MCLK2 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 30000000UL     /* Clock consumers of SAI2_MCLK3 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL     /* Clock consumers of SAI3_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL     /* Clock consumers of SAI3_MCLK1 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL            /* Clock consumers of SAI3_MCLK2 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL     /* Clock consumers of SAI3_MCLK3 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL     /* Clock consumers of SPDIF0_CLK_ROOT output : SPDIF */\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL            /* Clock consumers of SPDIF0_EXTCLK_OUT output : SPDIF */\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             117333333UL    /* Clock consumers of TRACE_CLK_ROOT output : ARM */\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL     /* Clock consumers of UART_CLK_ROOT output : LPUART1, LPUART2, LPUART3, LPUART4 */\n#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK                480000000UL    /* Clock consumers of USBPHY1_CLK output : TEMPMON, USB */\n\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Enet PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: MIMXRT1015xxxxx\npackage_id: MIMXRT1015DAF5A\nmcu_data: ksdk2_0\nprocessor_version: 24.12.10\nboard: MIMXRT1015-EVK\nexternal_user_signals: {}\npin_labels:\n- {pin_num: '21', pin_signal: GPIO_SD_B1_01, label: GPIO SD_B1_01, identifier: USER_LED}\npower_domains: {NVCC_GPIO: '3.3'}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '1', peripheral: GPIO2, signal: 'gpio_io, 09', pin_signal: GPIO_EMC_09, direction: INPUT, pull_keeper_select: Pull, pull_up_down_config: Pull_Up_47K_Ohm}\n  - {pin_num: '21', peripheral: GPIO3, signal: 'gpio_io, 21', pin_signal: GPIO_SD_B1_01, direction: OUTPUT}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  /* GPIO configuration of USER_BUTTON on GPIO_EMC_09 (pin 1) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_EMC_09 (pin 1) */\n  GPIO_PinInit(GPIO2, 9U, &USER_BUTTON_config);\n\n  /* GPIO configuration of USER_LED on GPIO_SD_B1_01 (pin 21) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_SD_B1_01 (pin 21) */\n  GPIO_PinInit(GPIO3, 21U, &USER_LED_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_GPIO2_IO09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_01_GPIO3_IO21, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_EMC_09_GPIO2_IO09, 0x70B0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitQSPIPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '12', peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07}\n  - {pin_num: '11', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08}\n  - {pin_num: '9', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_10}\n  - {pin_num: '10', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_09}\n  - {pin_num: '13', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_06}\n  - {pin_num: '8', peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_11}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitQSPIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitQSPIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPI_A_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPI_A_SCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPI_A_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPI_A_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPI_A_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPI_A_SS0_B, 0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '68', peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_07, slew_rate: Slow}\n  - {pin_num: '72', peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_06, slew_rate: Slow}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_06_LPUART1_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_07_LPUART1_RX, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_06_LPUART1_TX, 0x10B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_07_LPUART1_RX, 0x10B0U);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/* GPIO_EMC_09 (number 1), USER_BUTTON/SW4 */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO2   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    9U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   9U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 9U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        9U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_BUTTON_PIN_MASK                           (1U << 9U)   /*!< PORT pin mask */\n\n/* GPIO_SD_B1_01 (number 21), GPIO SD_B1_01 */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO3   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                   gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                      21U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO3   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_INIT_GPIO_VALUE                               0U   /*!< GPIO output initial state */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN                                     21U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN_MASK                        (1U << 21U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_LED_PORT                                       GPIO3   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_PIN                                          21U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_LED_PIN_MASK                             (1U << 21U)   /*!< PORT pin mask */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/* GPIO_SD_B1_07 (number 12), FlexSPI_CLK_A/U13[6] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_SIGNAL                     FLEXSPI_A_SCLK   /*!< Signal name */\n\n/* GPIO_SD_B1_08 (number 11), FlexSPI_D0_A/U13[5] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_SIGNAL                   FLEXSPI_A_DATA0   /*!< Signal name */\n\n/* GPIO_SD_B1_10 (number 9), FlexSPI_D1_A/U13[2] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_SIGNAL                   FLEXSPI_A_DATA1   /*!< Signal name */\n\n/* GPIO_SD_B1_09 (number 10), FlexSPI_D2_A/U13[3] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_SIGNAL                   FLEXSPI_A_DATA2   /*!< Signal name */\n\n/* GPIO_SD_B1_06 (number 13), FlexSPI_D3_A/U13[7] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_SIGNAL                   FLEXSPI_A_DATA3   /*!< Signal name */\n\n/* GPIO_SD_B1_11 (number 8), FlexSPI_SS0/U13[1] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_SIGNAL                    FLEXSPI_A_SS0_B   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitQSPIPins(void);\n\n/* GPIO_AD_B0_07 (number 68), LPUART1_RXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_SIGNAL                             RX   /*!< Signal name */\n\n/* GPIO_AD_B0_06 (number 72), LPUART1_TXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_SIGNAL                             TX   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/board.cmake",
    "content": "set(MCU_FAMILY RT1015)\nset(MCU_VARIANT MIMXRT1015)\n\nset(JLINK_DEVICE MIMXRT1015DAF5A)\nset(PYOCD_TARGET mimxrt1015)\nset(NXPLINK_DEVICE MIMXRT1015xxxxx:EVK-MIMXRT1015)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkmimxrt1015_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1015DAF5A\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: i.MX RT1015 Evaluation Kit\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/MIMXRT1015-EVK\n*/\n\n#ifndef BOARD_MIMXRT1015_EVK_H_\n#define BOARD_MIMXRT1015_EVK_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (0x1000000U)\n\n// LED\n#define LED_PINMUX            IOMUXC_GPIO_SD_B1_01_GPIO3_IO21\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// SW8 button\n#define BUTTON_PINMUX         IOMUXC_GPIO_EMC_09_GPIO2_IO09\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_GPIO\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_GPIO_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n#define UART_RX_PINMUX        IOMUXC_GPIO_AD_B0_07_LPUART1_RX\n#define UART_TX_PINMUX        IOMUXC_GPIO_AD_B0_06_LPUART1_TX\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1015DAF5A -DCFG_EXAMPLE_VIDEO_READONLY\nMCU_FAMILY = RT1015\nMCU_VARIANT = MIMXRT1015\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1015DAF5A\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1015\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/evkmimxrt1015_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2018-2019 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkmimxrt1015_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\")))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            .sflashPadType    = kSerialFlash_4Pads,\n            .serialClkFreq    = kFlexSpiSerialClk_100MHz,\n            .sflashA1Size     = 16u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 256u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/evkmimxrt1015_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2018-2019 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKMIMXRT1015_FLEXSPI_NOR_CONFIG__\n#define __EVKMIMXRT1015_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_133MHz = 7,\n    kFlexSpiSerialClk_166MHz = 8,\n    kFlexSpiSerialClk_200MHz = 9,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1015_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1015_evk/mimxrt1015_evk.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1015-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_17 http://mcuxpresso.nxp.com/XSD/mex_configuration_17.xsd\" uuid=\"4be4468a-3124-4ac9-9d4f-05d5f8ad6399\" version=\"17\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_17\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1015xxxxx</processor>\n      <package>MIMXRT1015DAF5A</package>\n      <board>MIMXRT1015-EVK</board>\n      <board_revision>B</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></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=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>24.12.10</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"21\" pin_signal=\"GPIO_SD_B1_01\" label=\"GPIO SD_B1_01\" identifier=\"USER_LED\"/>\n            </pin_labels>\n            <external_user_signals>\n               <properties/>\n            </external_user_signals>\n            <power_domains>\n               <power_domain name=\"NVCC_GPIO\" value=\"3.3\"/>\n            </power_domains>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO2\" description=\"Peripheral GPIO2 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 09\" pin_num=\"1\" pin_signal=\"GPIO_EMC_09\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_47K_Ohm\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO3\" signal=\"gpio_io, 21\" pin_num=\"21\" pin_signal=\"GPIO_SD_B1_01\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitQSPIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXSPI\" description=\"Peripheral FLEXSPI signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SCLK\" pin_num=\"12\" pin_signal=\"GPIO_SD_B1_07\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA0\" pin_num=\"11\" pin_signal=\"GPIO_SD_B1_08\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA1\" pin_num=\"9\" pin_signal=\"GPIO_SD_B1_10\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA2\" pin_num=\"10\" pin_signal=\"GPIO_SD_B1_09\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA3\" pin_num=\"13\" pin_signal=\"GPIO_SD_B1_06\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SS0_B\" pin_num=\"8\" pin_signal=\"GPIO_SD_B1_11\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"RX\" pin_num=\"68\" pin_signal=\"GPIO_AD_B0_07\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART1\" signal=\"TX\" pin_num=\"72\" pin_signal=\"GPIO_AD_B0_06\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"15.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"AHB_CLK_ROOT.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_500M_REF_CLK.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"2160/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"125 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"352/3 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY1_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.ARM_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.CLKO2_SEL.sel\" value=\"CCM.LPI2C_CLK_ROOT\" locked=\"false\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.IPG_PODF.scale\" value=\"4\" locked=\"false\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.PRE_PERIPH_CLK_SEL.sel\" value=\"CCM.ARM_PODF\" locked=\"false\"/>\n                  <setting id=\"CCM.SEMC_PODF.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_PODF.scale\" value=\"3\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"22\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.denom\" value=\"50\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.div\" value=\"47\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL6_BYPASS.sel\" value=\"CCM_ANALOG.PLL6\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>N/A</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"57fc488c-a9f7-4a03-8ab3-5d2a3fd16a50\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"DEBUG_UART\" uuid=\"600d7aee-5a2d-4373-9763-ce007b981c15\" type=\"lpuart\" type_id=\"lpuart_bebe3e12b6ec22bbd14199038f2bf459\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"COMBO_SENSOR\" uuid=\"96f9e552-25e5-434a-9454-5cf9e614733d\" type=\"lpi2c\" type_id=\"lpi2c_db68d4f4f06a22e25ab51fe9bd6db4d2\" mode=\"master\" peripheral=\"LPI2C1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"main\" quick_selection=\"qs_interrupt\">\n                        <setting name=\"clockSource\" value=\"Lpi2cClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LPI2C1_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"master\" quick_selection=\"qs_master_transfer\">\n                        <setting name=\"mode\" value=\"transfer\"/>\n                        <struct name=\"config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"enableDoze\" value=\"true\"/>\n                           <setting name=\"debugEnable\" value=\"false\"/>\n                           <setting name=\"ignoreAck\" value=\"false\"/>\n                           <setting name=\"pinConfig\" value=\"kLPI2C_2PinOpenDrain\"/>\n                           <setting name=\"baudRate_Hz\" value=\"100000\"/>\n                           <setting name=\"busIdleTimeout_ns\" value=\"0\"/>\n                           <setting name=\"pinLowTimeout_ns\" value=\"0\"/>\n                           <setting name=\"sdaGlitchFilterWidth_ns\" value=\"0\"/>\n                           <setting name=\"sclGlitchFilterWidth_ns\" value=\"0\"/>\n                           <struct name=\"hostRequest\">\n                              <setting name=\"enable\" value=\"false\"/>\n                              <setting name=\"source\" value=\"kLPI2C_HostRequestExternalPin\"/>\n                              <setting name=\"polarity\" value=\"kLPI2C_HostRequestPinActiveHigh\"/>\n                           </struct>\n                           <set name=\"edmaRequestSources\">\n                              <selected/>\n                           </set>\n                        </struct>\n                        <struct name=\"transfer\">\n                           <setting name=\"blocking\" value=\"false\"/>\n                           <setting name=\"enable_custom_handle\" value=\"false\"/>\n                           <struct name=\"callback\">\n                              <setting name=\"name\" value=\"\"/>\n                              <setting name=\"userData\" value=\"\"/>\n                           </struct>\n                           <set name=\"flags\">\n                              <selected/>\n                           </set>\n                           <setting name=\"slaveAddress\" value=\"0\"/>\n                           <setting name=\"direction\" value=\"kLPI2C_Write\"/>\n                           <setting name=\"subaddress\" value=\"0\"/>\n                           <setting name=\"subaddressSize\" value=\"1\"/>\n                           <setting name=\"blocking_buffer\" value=\"false\"/>\n                           <setting name=\"enable_custom_buffer\" value=\"false\"/>\n                           <setting name=\"dataSize\" value=\"1\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"USER_LED\" uuid=\"5592aac0-ced9-4284-88a8-bbeb5083a92f\" type=\"igpio\" type_id=\"igpio_b1c1fa279aa7069dca167502b8589cb7\" mode=\"GPIO\" peripheral=\"GPIO3\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_gpio\">\n                        <setting name=\"enable_irq_comb_0_15\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_0_15\">\n                           <setting name=\"IRQn\" value=\"GPIO3_Combined_0_15_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"enable_irq_comb_16_31\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_16_31\">\n                           <setting name=\"IRQn\" value=\"GPIO3_Combined_16_31_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"USER_BUTTON\" uuid=\"e7774953-3606-41b8-8b72-6e09025369e0\" type=\"igpio\" type_id=\"igpio_b1c1fa279aa7069dca167502b8589cb7\" mode=\"GPIO\" peripheral=\"GPIO2\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_gpio\">\n                        <setting name=\"enable_irq_comb_0_15\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_0_15\">\n                           <setting name=\"IRQn\" value=\"GPIO2_Combined_0_15_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"enable_irq_comb_16_31\" value=\"false\"/>\n                        <struct name=\"gpio_interrupt_comb_16_31\">\n                           <setting name=\"IRQn\" value=\"GPIO2_Combined_16_31_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"0329fbca-00e5-4ec4-9f79-3cb65a7b267a\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"59cf1b09-8396-4bf9-bed6-03d5457c292f\" type_id=\"system_54b53072540eeeb8f8e9343e71f28176\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"7d589e9f-7522-408c-b7c8-42770920766f\" type_id=\"msg_6e2baaf3b97dbeef01c0043275f9a0e7\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"e9da5e16-1f55-49be-87ec-af8cfd4a4105\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"9dc7a034-9408-4852-9990-a713693635ee\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"28ec81a8-d7ea-4363-9330-20b877c481f6\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"774dd0a0-63ed-4846-b9d7-dfd082d810e3\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"77cd333e-4adc-4c6e-8b18-bbe349d78182\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>N/A</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v11.0\nprocessor: MIMXRT1021xxxxx\npackage_id: MIMXRT1021DAG5A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1020-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: AHB_CLK_ROOT.outFreq, value: 500 MHz}\n- {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: ENET_500M_REF_CLK.outFreq, value: 500 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 125 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 62.5 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SEMC_CLK_ROOT.outFreq, value: 62.5 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY1_CLK.outFreq, value: 480 MHz}\n- {id: USDHC1_CLK_ROOT.outFreq, value: 176 MHz}\n- {id: USDHC2_CLK_ROOT.outFreq, value: 176 MHz}\nsettings:\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.ARM_PODF.scale, value: '1', locked: true}\n- {id: CCM.FLEXSPI_PODF.scale, value: '4', locked: true}\n- {id: CCM.FLEXSPI_SEL.sel, value: CCM_ANALOG.PLL2_PFD2_CLK}\n- {id: CCM.IPG_PODF.scale, value: '4'}\n- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.PRE_PERIPH_CLK_SEL.sel, value: CCM.ARM_PODF}\n- {id: CCM.SEMC_PODF.scale, value: '8'}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM.TRACE_PODF.scale, value: '4', locked: true}\n- {id: CCM.USDHC1_PODF.scale, value: '3', locked: true}\n- {id: CCM.USDHC2_PODF.scale, value: '3', locked: true}\n- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD2_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD2_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL2_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '22', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL3_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL4.denom, value: '50'}\n- {id: CCM_ANALOG.PLL4.div, value: '47'}\n- {id: CCM_ANALOG.PLL6_BYPASS.sel, value: CCM_ANALOG.PLL6}\n- {id: CCM_ANALOG_PLL_ENET_ENABLE_CFG, value: Disabled}\n- {id: CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_CFG, value: Disabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN =\n    {\n        .enableClkOutput = false,                 /* Disable the PLL providing the ENET 125MHz reference clock */\n        .enableClkOutput500M = true,              /* Enable the PLL providing the ENET 500MHz reference clock */\n        .enableClkOutput25M = false,              /* Disable the PLL providing the ENET 25MHz reference clock */\n        .loopDivider = 1,                         /* Set frequency of ethernet reference clock to 50 MHz */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */\n    /* Setting the VDD_SOC to 1.25V. It is necessary to config AHB to 500Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x12);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Adc2);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    CLOCK_DisableClock(kCLOCK_Xbar2);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Set ARM_PODF. */\n    CLOCK_SetDiv(kCLOCK_ArmDiv, 0);\n    /* Set PERIPH_CLK2_PODF. */\n    CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* Disable USDHC1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc1);\n    /* Set USDHC1_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc1Div, 2);\n    /* Set Usdhc1 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);\n    /* Disable USDHC2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc2);\n    /* Set USDHC2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc2Div, 2);\n    /* Set Usdhc2 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n    /* Disable Semc clock gate. */\n    CLOCK_DisableClock(kCLOCK_Semc);\n    /* Set SEMC_PODF. */\n    CLOCK_SetDiv(kCLOCK_SemcDiv, 7);\n    /* Set Semc alt clock source. */\n    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);\n    /* Set Semc clock source. */\n    CLOCK_SetMux(kCLOCK_SemcMux, 0);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 3);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 2);\n#endif\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    CLOCK_DisableClock(kCLOCK_Lpspi3);\n    CLOCK_DisableClock(kCLOCK_Lpspi4);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai2);\n    /* Set SAI2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);\n    /* Set SAI2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai2Div, 1);\n    /* Set Sai2 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai2Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    CLOCK_DisableClock(kCLOCK_Lpi2c3);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable CAN clock gate. */\n    CLOCK_DisableClock(kCLOCK_Can1);\n    CLOCK_DisableClock(kCLOCK_Can2);\n    CLOCK_DisableClock(kCLOCK_Can1S);\n    CLOCK_DisableClock(kCLOCK_Can2S);\n    /* Set CAN_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_CanDiv, 1);\n    /* Set Can clock source. */\n    CLOCK_SetMux(kCLOCK_CanMux, 2);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    CLOCK_DisableClock(kCLOCK_Lpuart5);\n    CLOCK_DisableClock(kCLOCK_Lpuart6);\n    CLOCK_DisableClock(kCLOCK_Lpuart7);\n    CLOCK_DisableClock(kCLOCK_Lpuart8);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* Set Pll3 sw clock source. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n    #warning \"SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged.\"\n#endif\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 18);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 18);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 22);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 18);\n#endif\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Init Enet PLL. */\n    CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(3);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set ENET Ref clock source. */\n#if defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK)\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK;\n#elif defined(IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK)\n    /* Backward compatibility for original bitfield name */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK;\n#else\n#error \"Neither IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK nor IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK is defined.\"\n#endif /* defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) */\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             500000000U  /*!< Core clock frequency: 500000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT               500000000UL\n#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT               40000000UL\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL\n#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK              0UL\n#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK           0UL\n#define BOARD_BOOTCLOCKRUN_ENET_500M_REF_CLK          500000000UL\n#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK                0UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           132000000UL\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      62500000UL\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      62500000UL\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               125000000UL\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            62500000UL\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT              62500000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT            176000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT            176000000UL\n\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Enet PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v13.1\nprocessor: MIMXRT1021xxxxx\npackage_id: MIMXRT1021DAG5A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1020-EVK\nexternal_user_signals: {}\npin_labels:\n- {pin_num: '52', pin_signal: WAKEUP, label: USER_BUTTON, identifier: USER_BUTTON}\n- {pin_num: '106', pin_signal: GPIO_AD_B0_05, label: 'JTAG_nTRST/J16[3]/USER_LED/J17[5]', identifier: USER_LED}\npower_domains: {NVCC_GPIO: '3.3'}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '52', peripheral: GPIO5, signal: 'gpio_io, 00', pin_signal: WAKEUP, direction: INPUT}\n  - {pin_num: '106', peripheral: GPIO1, signal: 'gpio_io, 05', pin_signal: GPIO_AD_B0_05, direction: OUTPUT, pull_keeper_select: Keeper}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n  CLOCK_EnableClock(kCLOCK_IomuxcSnvs);\n\n  /* GPIO configuration of USER_LED on GPIO_AD_B0_05 (pin 106) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_AD_B0_05 (pin 106) */\n  GPIO_PinInit(GPIO1, 5U, &USER_LED_config);\n\n  /* GPIO configuration of USER_BUTTON on WAKEUP (pin 52) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on WAKEUP (pin 52) */\n  GPIO_PinInit(GPIO5, 0U, &USER_BUTTON_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_05_GPIO1_IO05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_SNVS_WAKEUP_GPIO5_IO00, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_05_GPIO1_IO05, 0x50A0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '101', peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_07}\n  - {pin_num: '105', peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_06}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_06_LPUART1_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_07_LPUART1_RX, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSDRAMPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '142', peripheral: SEMC, signal: 'ADDR, 00', pin_signal: GPIO_EMC_16}\n  - {pin_num: '141', peripheral: SEMC, signal: 'ADDR, 01', pin_signal: GPIO_EMC_17}\n  - {pin_num: '140', peripheral: SEMC, signal: 'ADDR, 02', pin_signal: GPIO_EMC_18}\n  - {pin_num: '139', peripheral: SEMC, signal: 'ADDR, 03', pin_signal: GPIO_EMC_19}\n  - {pin_num: '138', peripheral: SEMC, signal: 'ADDR, 04', pin_signal: GPIO_EMC_20}\n  - {pin_num: '136', peripheral: SEMC, signal: 'ADDR, 06', pin_signal: GPIO_EMC_22}\n  - {pin_num: '137', peripheral: SEMC, signal: 'ADDR, 05', pin_signal: GPIO_EMC_21}\n  - {pin_num: '133', peripheral: SEMC, signal: 'ADDR, 07', pin_signal: GPIO_EMC_23}\n  - {pin_num: '132', peripheral: SEMC, signal: 'ADDR, 08', pin_signal: GPIO_EMC_24}\n  - {pin_num: '131', peripheral: SEMC, signal: 'ADDR, 09', pin_signal: GPIO_EMC_25}\n  - {pin_num: '143', peripheral: SEMC, signal: 'ADDR, 10', pin_signal: GPIO_EMC_15}\n  - {pin_num: '130', peripheral: SEMC, signal: 'ADDR, 11', pin_signal: GPIO_EMC_26}\n  - {pin_num: '129', peripheral: SEMC, signal: 'ADDR, 12', pin_signal: GPIO_EMC_27}\n  - {pin_num: '2', peripheral: SEMC, signal: 'BA, 0', pin_signal: GPIO_EMC_13}\n  - {pin_num: '1', peripheral: SEMC, signal: 'BA, 1', pin_signal: GPIO_EMC_14}\n  - {pin_num: '7', peripheral: SEMC, signal: semc_cas, pin_signal: GPIO_EMC_10}\n  - {pin_num: '127', peripheral: SEMC, signal: semc_cke, pin_signal: GPIO_EMC_29}\n  - {pin_num: '126', peripheral: SEMC, signal: semc_clk, pin_signal: GPIO_EMC_30}\n  - {pin_num: '3', peripheral: SEMC, signal: 'CS, 0', pin_signal: GPIO_EMC_12}\n  - {pin_num: '8', peripheral: SEMC, signal: semc_we, pin_signal: GPIO_EMC_09}\n  - {pin_num: '4', peripheral: SEMC, signal: semc_ras, pin_signal: GPIO_EMC_11}\n  - {pin_num: '128', peripheral: SEMC, signal: semc_dqs, pin_signal: GPIO_EMC_28}\n  - {pin_num: '125', peripheral: SEMC, signal: 'DM, 1', pin_signal: GPIO_EMC_31}\n  - {pin_num: '9', peripheral: SEMC, signal: 'DM, 0', pin_signal: GPIO_EMC_08}\n  - {pin_num: '117', peripheral: SEMC, signal: 'DATA, 15', pin_signal: GPIO_EMC_39}\n  - {pin_num: '118', peripheral: SEMC, signal: 'DATA, 14', pin_signal: GPIO_EMC_38}\n  - {pin_num: '119', peripheral: SEMC, signal: 'DATA, 13', pin_signal: GPIO_EMC_37}\n  - {pin_num: '120', peripheral: SEMC, signal: 'DATA, 12', pin_signal: GPIO_EMC_36}\n  - {pin_num: '122', peripheral: SEMC, signal: 'DATA, 10', pin_signal: GPIO_EMC_34}\n  - {pin_num: '121', peripheral: SEMC, signal: 'DATA, 11', pin_signal: GPIO_EMC_35}\n  - {pin_num: '123', peripheral: SEMC, signal: 'DATA, 09', pin_signal: GPIO_EMC_33}\n  - {pin_num: '124', peripheral: SEMC, signal: 'DATA, 08', pin_signal: GPIO_EMC_32}\n  - {pin_num: '10', peripheral: SEMC, signal: 'DATA, 07', pin_signal: GPIO_EMC_07}\n  - {pin_num: '12', peripheral: SEMC, signal: 'DATA, 06', pin_signal: GPIO_EMC_06}\n  - {pin_num: '13', peripheral: SEMC, signal: 'DATA, 05', pin_signal: GPIO_EMC_05}\n  - {pin_num: '14', peripheral: SEMC, signal: 'DATA, 04', pin_signal: GPIO_EMC_04}\n  - {pin_num: '15', peripheral: SEMC, signal: 'DATA, 03', pin_signal: GPIO_EMC_03}\n  - {pin_num: '16', peripheral: SEMC, signal: 'DATA, 02', pin_signal: GPIO_EMC_02}\n  - {pin_num: '17', peripheral: SEMC, signal: 'DATA, 01', pin_signal: GPIO_EMC_01}\n  - {pin_num: '18', peripheral: SEMC, signal: 'DATA, 00', pin_signal: GPIO_EMC_00}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSDRAMPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitSDRAMPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_08_SEMC_DM00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_SEMC_WE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_10_SEMC_CAS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_11_SEMC_RAS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_12_SEMC_CS0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_13_SEMC_BA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_14_SEMC_BA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_15_SEMC_ADDR10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_16_SEMC_ADDR00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_17_SEMC_ADDR01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_18_SEMC_ADDR02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_19_SEMC_ADDR03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_20_SEMC_ADDR04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_21_SEMC_ADDR05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_22_SEMC_ADDR06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_23_SEMC_ADDR07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_24_SEMC_ADDR08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_25_SEMC_ADDR09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_26_SEMC_ADDR11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_27_SEMC_ADDR12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_28_SEMC_DQS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_29_SEMC_CKE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DM01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DATA10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DATA11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DATA12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DATA13, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_38_SEMC_DATA14, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_39_SEMC_DATA15, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitCANPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '32', peripheral: CAN1, signal: RX, pin_signal: GPIO_SD_B1_01}\n  - {pin_num: '33', peripheral: CAN1, signal: TX, pin_signal: GPIO_SD_B1_00}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitCANPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitCANPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_00_FLEXCAN1_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_01_FLEXCAN1_RX, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitENETPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '97', peripheral: ENET, signal: enet_rx_en, pin_signal: GPIO_AD_B0_11}\n  - {pin_num: '84', peripheral: GPIO1, signal: 'gpio_io, 22', pin_signal: GPIO_AD_B1_06}\n  - {pin_num: '107', peripheral: GPIO1, signal: 'gpio_io, 04', pin_signal: GPIO_AD_B0_04}\n  - {pin_num: '100', peripheral: ENET, signal: enet_tx_clk, pin_signal: GPIO_AD_B0_08}\n  - {pin_num: '95', peripheral: ENET, signal: enet_tx_en, pin_signal: GPIO_AD_B0_13}\n  - {pin_num: '93', peripheral: ENET, signal: 'enet_tx_data, 1', pin_signal: GPIO_AD_B0_15}\n  - {pin_num: '94', peripheral: ENET, signal: 'enet_tx_data, 0', pin_signal: GPIO_AD_B0_14}\n  - {pin_num: '96', peripheral: ENET, signal: enet_rx_er, pin_signal: GPIO_AD_B0_12}\n  - {pin_num: '99', peripheral: ENET, signal: 'enet_rx_data, 1', pin_signal: GPIO_AD_B0_09}\n  - {pin_num: '98', peripheral: ENET, signal: 'enet_rx_data, 0', pin_signal: GPIO_AD_B0_10}\n  - {pin_num: '116', peripheral: ENET, signal: enet_mdio, pin_signal: GPIO_EMC_40}\n  - {pin_num: '115', peripheral: ENET, signal: enet_mdc, pin_signal: GPIO_EMC_41}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitENETPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitENETPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_04_GPIO1_IO04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_08_ENET_TX_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_ENET_RDATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_10_ENET_RDATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_11_ENET_RX_EN, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_ENET_RX_ER, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_ENET_TX_EN, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_14_ENET_TDATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_15_ENET_TDATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_06_GPIO1_IO22, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_40_ENET_MDIO, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_41_ENET_MDC, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSDHCPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '45', peripheral: USDHC1, signal: usdhc_clk, pin_signal: GPIO_SD_B0_03}\n  - {pin_num: '46', peripheral: USDHC1, signal: usdhc_cmd, pin_signal: GPIO_SD_B0_02}\n  - {pin_num: '43', peripheral: USDHC1, signal: 'usdhc_data, 0', pin_signal: GPIO_SD_B0_04}\n  - {pin_num: '42', peripheral: USDHC1, signal: 'usdhc_data, 1', pin_signal: GPIO_SD_B0_05}\n  - {pin_num: '48', peripheral: USDHC1, signal: 'usdhc_data, 2', pin_signal: GPIO_SD_B0_00}\n  - {pin_num: '47', peripheral: USDHC1, signal: 'usdhc_data, 3', pin_signal: GPIO_SD_B0_01}\n  - {pin_num: '41', peripheral: GPIO3, signal: 'gpio_io, 19', pin_signal: GPIO_SD_B0_06}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSDHCPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitUSDHCPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_00_USDHC1_DATA2, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_01_USDHC1_DATA3, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_02_USDHC1_CMD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_03_USDHC1_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_06_GPIO3_IO19, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitQSPIPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '24', peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07}\n  - {pin_num: '23', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08}\n  - {pin_num: '21', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_10}\n  - {pin_num: '22', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_09}\n  - {pin_num: '25', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_06}\n  - {pin_num: '19', peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_11}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitQSPIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitQSPIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPI_A_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPI_A_SCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPI_A_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPI_A_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPI_A_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPI_A_SS0_B, 0U);\n}\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/* WAKEUP (number 52), USER_BUTTON */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO5   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    0U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO5   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   0U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 0U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO5   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        0U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_BUTTON_PIN_MASK                           (1U << 0U)   /*!< PORT pin mask */\n\n/* GPIO_AD_B0_05 (number 106), JTAG_nTRST/J16[3]/USER_LED/J17[5] */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO1   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                   gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                       5U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN                                      5U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN_MASK                         (1U << 5U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_LED_PORT                                       GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_PIN                                           5U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_LED_PIN_MASK                              (1U << 5U)   /*!< PORT pin mask */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/* GPIO_AD_B0_07 (number 101), UART1_RXD/J17[4] */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_SIGNAL                             RX   /*!< Signal name */\n\n/* GPIO_AD_B0_06 (number 105), UART1_TXD/J17[6] */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_SIGNAL                             TX   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n/* GPIO_EMC_16 (number 142), SEMC_A0/U14[23]/BOOT_MODE[0] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A0_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A0_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A0_CHANNEL                                   0U   /*!< Signal channel */\n\n/* GPIO_EMC_17 (number 141), SEMC_A1/U14[24]/BOOT_MODE[1] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A1_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A1_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A1_CHANNEL                                   1U   /*!< Signal channel */\n\n/* GPIO_EMC_18 (number 140), SEMC_A2/U14[25]/BT_CFG[0] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A2_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A2_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A2_CHANNEL                                   2U   /*!< Signal channel */\n\n/* GPIO_EMC_19 (number 139), SEMC_A3/U14[26]/BT_CFG[1] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A3_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A3_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A3_CHANNEL                                   3U   /*!< Signal channel */\n\n/* GPIO_EMC_20 (number 138), SEMC_A4/U14[29]/BT_CFG[2] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A4_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A4_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A4_CHANNEL                                   4U   /*!< Signal channel */\n\n/* GPIO_EMC_22 (number 136), SEMC_A6/U14[31]/BT_CFG[4] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A6_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A6_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A6_CHANNEL                                   6U   /*!< Signal channel */\n\n/* GPIO_EMC_21 (number 137), SEMC_A5/U14[30]/BT_CFG[3] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A5_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A5_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A5_CHANNEL                                   5U   /*!< Signal channel */\n\n/* GPIO_EMC_23 (number 133), SEMC_A7/U14[32]/BT_CFG[5] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A7_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A7_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A7_CHANNEL                                   7U   /*!< Signal channel */\n\n/* GPIO_EMC_24 (number 132), SEMC_A8/U14[33]/BT_CFG[6] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A8_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A8_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A8_CHANNEL                                   8U   /*!< Signal channel */\n\n/* GPIO_EMC_25 (number 131), SEMC_A9/U14[34]/BT_CFG[7] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A9_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A9_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A9_CHANNEL                                   9U   /*!< Signal channel */\n\n/* GPIO_EMC_15 (number 143), SEMC_A10/U14[22] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A10_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A10_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A10_CHANNEL                                 10U   /*!< Signal channel */\n\n/* GPIO_EMC_26 (number 130), SEMC_A11/U14[35]/BT_CFG[8] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A11_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A11_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A11_CHANNEL                                 11U   /*!< Signal channel */\n\n/* GPIO_EMC_27 (number 129), SEMC_A12/U14[36]/BT_CFG[9] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A12_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A12_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A12_CHANNEL                                 12U   /*!< Signal channel */\n\n/* GPIO_EMC_13 (number 2), SEMC_BA0/U14[20] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_SIGNAL                                   BA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_14 (number 1), SEMC_BA1/U14[21] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_SIGNAL                                   BA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_EMC_10 (number 7), SEMC_CAS/U14[17] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_SIGNAL                             semc_cas   /*!< Signal name */\n\n/* GPIO_EMC_29 (number 127), SEMC_CKE/U14[37] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_SIGNAL                             semc_cke   /*!< Signal name */\n\n/* GPIO_EMC_30 (number 126), SEMC_CLK/U14[38] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_SIGNAL                             semc_clk   /*!< Signal name */\n\n/* GPIO_EMC_12 (number 3), SEMC_CS0/U14[19] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_SIGNAL                                   CS   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_09 (number 8), SEMC_WE/U14[16] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_WE_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_WE_SIGNAL                               semc_we   /*!< Signal name */\n\n/* GPIO_EMC_11 (number 4), SEMC_RAS/U14[18] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_SIGNAL                             semc_ras   /*!< Signal name */\n\n/* GPIO_EMC_28 (number 128), SEMC_DQS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DQS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DQS_SIGNAL                             semc_dqs   /*!< Signal name */\n\n/* GPIO_EMC_31 (number 125), SEMC_DM1/U14[39] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_SIGNAL                                   DM   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_EMC_08 (number 9), SEMC_DM0/U14[15] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_SIGNAL                                   DM   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_39 (number 117), SEMC_D15/U14[53] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D15_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D15_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D15_CHANNEL                                 15U   /*!< Signal channel */\n\n/* GPIO_EMC_38 (number 118), SEMC_D14/U14[51] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D14_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D14_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D14_CHANNEL                                 14U   /*!< Signal channel */\n\n/* GPIO_EMC_37 (number 119), SEMC_D13/U14[50] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D13_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D13_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D13_CHANNEL                                 13U   /*!< Signal channel */\n\n/* GPIO_EMC_36 (number 120), SEMC_D12/U14[48] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D12_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D12_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D12_CHANNEL                                 12U   /*!< Signal channel */\n\n/* GPIO_EMC_34 (number 122), SEMC_D10/U14[45] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D10_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D10_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D10_CHANNEL                                 10U   /*!< Signal channel */\n\n/* GPIO_EMC_35 (number 121), SEMC_D11/U14[47] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D11_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D11_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D11_CHANNEL                                 11U   /*!< Signal channel */\n\n/* GPIO_EMC_33 (number 123), SEMC_D9/U14[44] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D9_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D9_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D9_CHANNEL                                   9U   /*!< Signal channel */\n\n/* GPIO_EMC_32 (number 124), SEMC_D8/U14[42] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D8_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D8_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D8_CHANNEL                                   8U   /*!< Signal channel */\n\n/* GPIO_EMC_07 (number 10), SEMC_D7/U14[13] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D7_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D7_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D7_CHANNEL                                   7U   /*!< Signal channel */\n\n/* GPIO_EMC_06 (number 12), SEMC_D6/U14[11] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D6_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D6_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D6_CHANNEL                                   6U   /*!< Signal channel */\n\n/* GPIO_EMC_05 (number 13), SEMC_D5/U14[10] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D5_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D5_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D5_CHANNEL                                   5U   /*!< Signal channel */\n\n/* GPIO_EMC_04 (number 14), SEMC_D4/U14[8] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D4_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D4_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D4_CHANNEL                                   4U   /*!< Signal channel */\n\n/* GPIO_EMC_03 (number 15), SEMC_D3/U14[7] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D3_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D3_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D3_CHANNEL                                   3U   /*!< Signal channel */\n\n/* GPIO_EMC_02 (number 16), SEMC_D2/U14[5] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D2_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D2_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D2_CHANNEL                                   2U   /*!< Signal channel */\n\n/* GPIO_EMC_01 (number 17), SEMC_D1/U14[4] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D1_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D1_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D1_CHANNEL                                   1U   /*!< Signal channel */\n\n/* GPIO_EMC_00 (number 18), SEMC_D0/U14[2] */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D0_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D0_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D0_CHANNEL                                   0U   /*!< Signal channel */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSDRAMPins(void);\n\n/* GPIO_SD_B1_01 (number 32), CAN1_RX/U9[4] */\n/* Routed pin properties */\n#define BOARD_INITCANPINS_CAN1_RX_PERIPHERAL                                CAN1   /*!< Peripheral name */\n#define BOARD_INITCANPINS_CAN1_RX_SIGNAL                                      RX   /*!< Signal name */\n\n/* GPIO_SD_B1_00 (number 33), CAN1_TX/U9[1] */\n/* Routed pin properties */\n#define BOARD_INITCANPINS_CAN1_TX_PERIPHERAL                                CAN1   /*!< Peripheral name */\n#define BOARD_INITCANPINS_CAN1_TX_SIGNAL                                      TX   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitCANPins(void);\n\n/* GPIO_AD_B0_11 (number 97), ENET_CRS_DV/U11[18]/J19[3] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_CRS_DV_PERIPHERAL                           ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_CRS_DV_SIGNAL                         enet_rx_en   /*!< Signal name */\n\n/* GPIO_AD_B1_06 (number 84), ENET_INT/U11[21]/J17[8] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_INT_PERIPHERAL                             GPIO1   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_INT_SIGNAL                               gpio_io   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_INT_CHANNEL                                  22U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITENETPINS_ENET_INT_GPIO                                   GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITENETPINS_ENET_INT_GPIO_PIN                                 22U   /*!< GPIO pin number */\n#define BOARD_INITENETPINS_ENET_INT_GPIO_PIN_MASK                    (1U << 22U)   /*!< GPIO pin mask */\n#define BOARD_INITENETPINS_ENET_INT_PORT                                   GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITENETPINS_ENET_INT_PIN                                      22U   /*!< PORT pin number */\n#define BOARD_INITENETPINS_ENET_INT_PIN_MASK                         (1U << 22U)   /*!< PORT pin mask */\n\n/* GPIO_AD_B0_04 (number 107), JTAG_TDO/J16[13]/ENET_RST/U11[32] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RST_PERIPHERAL                             GPIO1   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RST_SIGNAL                               gpio_io   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RST_CHANNEL                                   4U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITENETPINS_ENET_RST_GPIO                                   GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITENETPINS_ENET_RST_GPIO_PIN                                  4U   /*!< GPIO pin number */\n#define BOARD_INITENETPINS_ENET_RST_GPIO_PIN_MASK                     (1U << 4U)   /*!< GPIO pin mask */\n#define BOARD_INITENETPINS_ENET_RST_PORT                                   GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITENETPINS_ENET_RST_PIN                                       4U   /*!< PORT pin number */\n#define BOARD_INITENETPINS_ENET_RST_PIN_MASK                          (1U << 4U)   /*!< PORT pin mask */\n\n/* GPIO_AD_B0_08 (number 100), ENET_TX_CLK/U11[9] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TX_CLK_PERIPHERAL                           ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TX_CLK_SIGNAL                        enet_tx_clk   /*!< Signal name */\n\n/* GPIO_AD_B0_13 (number 95), ENET_TXEN/U11[23]/J19[5] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXEN_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXEN_SIGNAL                           enet_tx_en   /*!< Signal name */\n\n/* GPIO_AD_B0_15 (number 93), ENET_TXD1/U11[25]/J19[2] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXD1_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXD1_SIGNAL                         enet_tx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_TXD1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_AD_B0_14 (number 94), ENET_TXD0/U11[24]/J17[7] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXD0_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXD0_SIGNAL                         enet_tx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_TXD0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_AD_B0_12 (number 96), ENET_RXER/U11[20]/J19[4] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXER_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXER_SIGNAL                           enet_rx_er   /*!< Signal name */\n\n/* GPIO_AD_B0_09 (number 99), ENET_RXD1/U11[15]/J17[3] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXD1_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXD1_SIGNAL                         enet_rx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RXD1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_AD_B0_10 (number 98), ENET_RXD0/U11[16]/J19[6] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXD0_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXD0_SIGNAL                         enet_rx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RXD0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_40 (number 116), ENET_MDIO/U11[11] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_MDIO_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_MDIO_SIGNAL                            enet_mdio   /*!< Signal name */\n\n/* GPIO_EMC_41 (number 115), ENET_MDC/U11[12] */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_MDC_PERIPHERAL                              ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_MDC_SIGNAL                              enet_mdc   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitENETPins(void);\n\n/* GPIO_SD_B0_03 (number 45), SD1_CLK/J15[5] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CLK_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CLK_SIGNAL                             usdhc_clk   /*!< Signal name */\n\n/* GPIO_SD_B0_02 (number 46), SD1_CMD/J15[3] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CMD_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CMD_SIGNAL                             usdhc_cmd   /*!< Signal name */\n\n/* GPIO_SD_B0_04 (number 43), SD1_D0/J15[7] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D0_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D0_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_SD_B0_05 (number 42), SD1_D1/J15[8] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D1_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D1_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_SD_B0_00 (number 48), SD1_D2/J15[1] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D2_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D2_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_SD_B0_01 (number 47), SD1_D3/J15[2] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D3_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D3_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_SD_B0_06 (number 41), SD_CD_SW/J15[9] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_PERIPHERAL                            GPIO3   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_SIGNAL                              gpio_io   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_CHANNEL                                 19U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_GPIO                                  GPIO3   /*!< GPIO peripheral base pointer */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_GPIO_PIN                                19U   /*!< GPIO pin number */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_GPIO_PIN_MASK                   (1U << 19U)   /*!< GPIO pin mask */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_PORT                                  GPIO3   /*!< PORT peripheral base pointer */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_PIN                                     19U   /*!< PORT pin number */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_PIN_MASK                        (1U << 19U)   /*!< PORT pin mask */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSDHCPins(void);\n\n/* GPIO_SD_B1_07 (number 24), FlexSPI_CLK/U13[6] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_SIGNAL                     FLEXSPI_A_SCLK   /*!< Signal name */\n\n/* GPIO_SD_B1_08 (number 23), FlexSPI_D0_A/U13[5] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_SIGNAL                   FLEXSPI_A_DATA0   /*!< Signal name */\n\n/* GPIO_SD_B1_10 (number 21), FlexSPI_D1_A/U13[2] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_SIGNAL                   FLEXSPI_A_DATA1   /*!< Signal name */\n\n/* GPIO_SD_B1_09 (number 22), FlexSPI_D2_A/U13[3] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_SIGNAL                   FLEXSPI_A_DATA2   /*!< Signal name */\n\n/* GPIO_SD_B1_06 (number 25), FlexSPI_D3_A/U13[7] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_SIGNAL                   FLEXSPI_A_DATA3   /*!< Signal name */\n\n/* GPIO_SD_B1_11 (number 19), FlexSPI_SS0/U13[1] */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_SIGNAL                    FLEXSPI_A_SS0_B   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitQSPIPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/board.cmake",
    "content": "set(MCU_FAMILY RT1020)\nset(MCU_VARIANT MIMXRT1021)\n\nset(JLINK_DEVICE MIMXRT1021xxx5A)\nset(PYOCD_TARGET mimxrt1020)\nset(NXPLINK_DEVICE MIMXRT1021xxxxx:EVK-MIMXRT1020)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkmimxrt1020_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1021DAG5A\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: i.MX RT1020 Evaluation Kit\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/MIMXRT1020-EVK\n*/\n\n#ifndef BOARD_MIMXRT1020_EVK_H_\n#define BOARD_MIMXRT1020_EVK_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (0x800000U)\n\n// LED: IOMUXC_GPIO_AD_B0_05_GPIO1_IO05\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// SW8 button: IOMUXC_SNVS_WAKEUP_GPIO5_IO00\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_GPIO\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_GPIO_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: IOMUXC_GPIO_AD_B0_07_LPUART1_RX, IOMUXC_GPIO_AD_B0_06_LPUART1_TX\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1021DAG5A\nMCU_FAMILY = RT1020\nMCU_VARIANT = MIMXRT1021\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1021xxx5A\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1020\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/evkmimxrt1020_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkmimxrt1020_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\")))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock\n            .sflashPadType = kSerialFlash_4Pads,\n            .serialClkFreq = kFlexSpiSerialClk_100MHz,\n            .sflashA1Size  = 8u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 256u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/evkmimxrt1020_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__\n#define __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_133MHz = 7,\n    kFlexSpiSerialClk_166MHz = 8,\n    kFlexSpiSerialClk_200MHz = 9,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1020_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1020_evk/mimxrt1020_evk.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1020-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13 http://mcuxpresso.nxp.com/XSD/mex_configuration_13.xsd\" uuid=\"a558cc6e-82c2-41f9-9f55-0348efc7896f\" version=\"13\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1021xxxxx</processor>\n      <package>MIMXRT1021DAG5A</package>\n      <board>MIMXRT1020-EVK</board>\n      <board_revision>A3</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>false</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"13.1\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>13.0.2</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"52\" pin_signal=\"WAKEUP\" label=\"USER_BUTTON\" identifier=\"USER_BUTTON\"/>\n               <pin_label pin_num=\"106\" pin_signal=\"GPIO_AD_B0_05\" label=\"JTAG_nTRST/J16[3]/USER_LED/J17[5]\" identifier=\"USER_LED\"/>\n            </pin_labels>\n            <external_user_signals>\n               <properties/>\n            </external_user_signals>\n            <power_domains>\n               <power_domain name=\"NVCC_GPIO\" value=\"3.3\"/>\n            </power_domains>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO5\" description=\"Peripheral GPIO5 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO5\" signal=\"gpio_io, 00\" pin_num=\"52\" pin_signal=\"WAKEUP\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 05\" pin_num=\"106\" pin_signal=\"GPIO_AD_B0_05\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"RX\" pin_num=\"101\" pin_signal=\"GPIO_AD_B0_07\"/>\n                  <pin peripheral=\"LPUART1\" signal=\"TX\" pin_num=\"105\" pin_signal=\"GPIO_AD_B0_06\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSDRAMPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SEMC\" description=\"Peripheral SEMC is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 00\" pin_num=\"142\" pin_signal=\"GPIO_EMC_16\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 01\" pin_num=\"141\" pin_signal=\"GPIO_EMC_17\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 02\" pin_num=\"140\" pin_signal=\"GPIO_EMC_18\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 03\" pin_num=\"139\" pin_signal=\"GPIO_EMC_19\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 04\" pin_num=\"138\" pin_signal=\"GPIO_EMC_20\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 06\" pin_num=\"136\" pin_signal=\"GPIO_EMC_22\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 05\" pin_num=\"137\" pin_signal=\"GPIO_EMC_21\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 07\" pin_num=\"133\" pin_signal=\"GPIO_EMC_23\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 08\" pin_num=\"132\" pin_signal=\"GPIO_EMC_24\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 09\" pin_num=\"131\" pin_signal=\"GPIO_EMC_25\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 10\" pin_num=\"143\" pin_signal=\"GPIO_EMC_15\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 11\" pin_num=\"130\" pin_signal=\"GPIO_EMC_26\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 12\" pin_num=\"129\" pin_signal=\"GPIO_EMC_27\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 0\" pin_num=\"2\" pin_signal=\"GPIO_EMC_13\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 1\" pin_num=\"1\" pin_signal=\"GPIO_EMC_14\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cas\" pin_num=\"7\" pin_signal=\"GPIO_EMC_10\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cke\" pin_num=\"127\" pin_signal=\"GPIO_EMC_29\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_clk\" pin_num=\"126\" pin_signal=\"GPIO_EMC_30\"/>\n                  <pin peripheral=\"SEMC\" signal=\"CS, 0\" pin_num=\"3\" pin_signal=\"GPIO_EMC_12\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_we\" pin_num=\"8\" pin_signal=\"GPIO_EMC_09\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_ras\" pin_num=\"4\" pin_signal=\"GPIO_EMC_11\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_dqs\" pin_num=\"128\" pin_signal=\"GPIO_EMC_28\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 1\" pin_num=\"125\" pin_signal=\"GPIO_EMC_31\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 0\" pin_num=\"9\" pin_signal=\"GPIO_EMC_08\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 15\" pin_num=\"117\" pin_signal=\"GPIO_EMC_39\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 14\" pin_num=\"118\" pin_signal=\"GPIO_EMC_38\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 13\" pin_num=\"119\" pin_signal=\"GPIO_EMC_37\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 12\" pin_num=\"120\" pin_signal=\"GPIO_EMC_36\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 10\" pin_num=\"122\" pin_signal=\"GPIO_EMC_34\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 11\" pin_num=\"121\" pin_signal=\"GPIO_EMC_35\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 09\" pin_num=\"123\" pin_signal=\"GPIO_EMC_33\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 08\" pin_num=\"124\" pin_signal=\"GPIO_EMC_32\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 07\" pin_num=\"10\" pin_signal=\"GPIO_EMC_07\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 06\" pin_num=\"12\" pin_signal=\"GPIO_EMC_06\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 05\" pin_num=\"13\" pin_signal=\"GPIO_EMC_05\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 04\" pin_num=\"14\" pin_signal=\"GPIO_EMC_04\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 03\" pin_num=\"15\" pin_signal=\"GPIO_EMC_03\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 02\" pin_num=\"16\" pin_signal=\"GPIO_EMC_02\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 01\" pin_num=\"17\" pin_signal=\"GPIO_EMC_01\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 00\" pin_num=\"18\" pin_signal=\"GPIO_EMC_00\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitCANPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"CAN1\" description=\"Peripheral CAN1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"CAN1\" signal=\"RX\" pin_num=\"32\" pin_signal=\"GPIO_SD_B1_01\"/>\n                  <pin peripheral=\"CAN1\" signal=\"TX\" pin_num=\"33\" pin_signal=\"GPIO_SD_B1_00\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitENETPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"ENET\" description=\"Peripheral ENET is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_en\" pin_num=\"97\" pin_signal=\"GPIO_AD_B0_11\"/>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 22\" pin_num=\"84\" pin_signal=\"GPIO_AD_B1_06\"/>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 04\" pin_num=\"107\" pin_signal=\"GPIO_AD_B0_04\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_clk\" pin_num=\"100\" pin_signal=\"GPIO_AD_B0_08\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_en\" pin_num=\"95\" pin_signal=\"GPIO_AD_B0_13\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 1\" pin_num=\"93\" pin_signal=\"GPIO_AD_B0_15\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 0\" pin_num=\"94\" pin_signal=\"GPIO_AD_B0_14\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_er\" pin_num=\"96\" pin_signal=\"GPIO_AD_B0_12\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 1\" pin_num=\"99\" pin_signal=\"GPIO_AD_B0_09\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 0\" pin_num=\"98\" pin_signal=\"GPIO_AD_B0_10\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdio\" pin_num=\"116\" pin_signal=\"GPIO_EMC_40\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdc\" pin_num=\"115\" pin_signal=\"GPIO_EMC_41\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSDHCPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USDHC1\" description=\"Peripheral USDHC1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_clk\" pin_num=\"45\" pin_signal=\"GPIO_SD_B0_03\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_cmd\" pin_num=\"46\" pin_signal=\"GPIO_SD_B0_02\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 0\" pin_num=\"43\" pin_signal=\"GPIO_SD_B0_04\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 1\" pin_num=\"42\" pin_signal=\"GPIO_SD_B0_05\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 2\" pin_num=\"48\" pin_signal=\"GPIO_SD_B0_00\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 3\" pin_num=\"47\" pin_signal=\"GPIO_SD_B0_01\"/>\n                  <pin peripheral=\"GPIO3\" signal=\"gpio_io, 19\" pin_num=\"41\" pin_signal=\"GPIO_SD_B0_06\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitQSPIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXSPI\" description=\"Peripheral FLEXSPI is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SCLK\" pin_num=\"24\" pin_signal=\"GPIO_SD_B1_07\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA0\" pin_num=\"23\" pin_signal=\"GPIO_SD_B1_08\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA1\" pin_num=\"21\" pin_signal=\"GPIO_SD_B1_10\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA2\" pin_num=\"22\" pin_signal=\"GPIO_SD_B1_09\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA3\" pin_num=\"25\" pin_signal=\"GPIO_SD_B1_06\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SS0_B\" pin_num=\"19\" pin_signal=\"GPIO_SD_B1_11\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"11.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>13.0.2</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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"AHB_CLK_ROOT.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN_CLK_ROOT.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_500M_REF_CLK.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"125 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SEMC_CLK_ROOT.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY1_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC1_CLK_ROOT.outFreq\" value=\"176 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC2_CLK_ROOT.outFreq\" value=\"176 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.ARM_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_SEL.sel\" value=\"CCM_ANALOG.PLL2_PFD2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.IPG_PODF.scale\" value=\"4\" locked=\"false\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.PRE_PERIPH_CLK_SEL.sel\" value=\"CCM.ARM_PODF\" locked=\"false\"/>\n                  <setting id=\"CCM.SEMC_PODF.scale\" value=\"8\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.USDHC1_PODF.scale\" value=\"3\" locked=\"true\"/>\n                  <setting id=\"CCM.USDHC2_PODF.scale\" value=\"3\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"22\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.denom\" value=\"50\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.div\" value=\"47\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL6_BYPASS.sel\" value=\"CCM_ANALOG.PLL6\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_ENABLE_CFG\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_CFG\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/dcd.c\" update_enabled=\"true\"/>\n            <file path=\"board/dcd.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <dcdx_profile>\n            <processor_version>13.0.2</processor_version>\n            <output_format>c_array</output_format>\n         </dcdx_profile>\n         <dcdx_configurations>\n            <dcdx_configuration name=\"Device_configuration\">\n               <description></description>\n               <options/>\n               <command_groups/>\n            </dcdx_configuration>\n         </dcdx_configurations>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"6d394465-bc9b-47f2-9a1f-3ca61f76d27b\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"CAN\" uuid=\"d0b30ebd-b05e-42b2-8e94-40b1625c2dba\" type=\"flexcan\" type_id=\"flexcan_10d80efac19b25dcd240244aae88dca0\" mode=\"interrupts\" peripheral=\"CAN1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"interruptsCfg\">\n                        <setting name=\"messageBufferIrqs\" value=\"0\"/>\n                        <setting name=\"messageBufferIrqs2\" value=\"0\"/>\n                        <set name=\"interruptsEnable\">\n                           <selected/>\n                        </set>\n                        <setting name=\"enable_irq\" value=\"false\"/>\n                        <struct name=\"interrupt_shared\">\n                           <setting name=\"IRQn\" value=\"CAN1_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"fsl_flexcan\" quick_selection=\"default\">\n                        <struct name=\"can_config\">\n                           <setting name=\"clockSource\" value=\"kFLEXCAN_ClkSrcOsc\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"wakeupSrc\" value=\"kFLEXCAN_WakeupSrcUnfiltered\"/>\n                           <setting name=\"baudRate\" value=\"1000000\"/>\n                           <setting name=\"maxMbNum\" value=\"16\"/>\n                           <setting name=\"enableLoopBack\" value=\"false\"/>\n                           <setting name=\"enableTimerSync\" value=\"true\"/>\n                           <setting name=\"enableSelfWakeup\" value=\"false\"/>\n                           <setting name=\"enableIndividMask\" value=\"false\"/>\n                           <struct name=\"timingConfig\">\n                              <setting name=\"propSeg\" value=\"2\"/>\n                              <setting name=\"phaseSeg1\" value=\"4\"/>\n                              <setting name=\"phaseSeg2\" value=\"3\"/>\n                              <setting name=\"rJumpwidth\" value=\"2\"/>\n                              <struct name=\"bitTime\"/>\n                           </struct>\n                        </struct>\n                        <setting name=\"enableRxFIFO\" value=\"false\"/>\n                        <struct name=\"rxFIFO\">\n                           <setting name=\"idFilterTable\" value=\"\"/>\n                           <setting name=\"idFilterNum\" value=\"num0\"/>\n                           <setting name=\"idFilterType\" value=\"kFLEXCAN_RxFifoFilterTypeA\"/>\n                           <setting name=\"priority\" value=\"kFLEXCAN_RxFifoPrioLow\"/>\n                        </struct>\n                        <array name=\"channels\">\n                           <struct name=\"0\">\n                              <setting name=\"mbID\" value=\"0\"/>\n                              <setting name=\"mbType\" value=\"mbRx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                           <struct name=\"1\">\n                              <setting name=\"mbID\" value=\"1\"/>\n                              <setting name=\"mbType\" value=\"mbTx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                        </array>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"27a94726-61ef-42ac-b517-d1eda3853dfe\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"BOARD_BootClockRUN\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"e2a4cccd-cb23-4714-8c90-022fcf6146e8\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"bd191d83-2cb2-40ed-a718-47b39d772006\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"d097438f-179b-43e0-b37c-aee31212cebd\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"d84400f7-fd84-4466-908a-04abca190ef6\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"4f0123a9-0338-4076-b275-b49951642704\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"18150193-6d2b-469f-88e5-4908669bf3e5\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"602159e8-d65b-45d3-b63b-cd33be549134\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"eb963b89-5367-4d86-8885-82b4b8cff735\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n      <common name=\"common\" version=\"1.0\" enabled=\"true\" update_project_code=\"true\">\n         <core name=\"core0\" role=\"primary\" project_name=\"Project\"/>\n      </common>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v11.0\nprocessor: MIMXRT1024xxxxx\npackage_id: MIMXRT1024DAG5A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1024-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: AHB_CLK_ROOT.outFreq, value: 500 MHz}\n- {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: ENET_500M_REF_CLK.outFreq, value: 500 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 62.5 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 125 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 62.5 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SEMC_CLK_ROOT.outFreq, value: 62.5 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY1_CLK.outFreq, value: 480 MHz}\n- {id: USDHC1_CLK_ROOT.outFreq, value: 176 MHz}\n- {id: USDHC2_CLK_ROOT.outFreq, value: 176 MHz}\nsettings:\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.ARM_PODF.scale, value: '1', locked: true}\n- {id: CCM.FLEXSPI_PODF.scale, value: '4', locked: true}\n- {id: CCM.FLEXSPI_SEL.sel, value: CCM_ANALOG.PLL2_PFD2_CLK}\n- {id: CCM.IPG_PODF.scale, value: '4'}\n- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.PRE_PERIPH_CLK_SEL.sel, value: CCM.ARM_PODF}\n- {id: CCM.SEMC_PODF.scale, value: '8'}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM.TRACE_PODF.scale, value: '4', locked: true}\n- {id: CCM.USDHC1_PODF.scale, value: '3', locked: true}\n- {id: CCM.USDHC2_PODF.scale, value: '3', locked: true}\n- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD2_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD2_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL2_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL2_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '22', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL3_PFD3_DIV.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD3_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL4.denom, value: '50'}\n- {id: CCM_ANALOG.PLL4.div, value: '47'}\n- {id: CCM_ANALOG.PLL6_BYPASS.sel, value: CCM_ANALOG.PLL6}\n- {id: CCM_ANALOG_PLL_ENET_ENABLE_CFG, value: Disabled}\n- {id: CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_CFG, value: Disabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN =\n    {\n        .enableClkOutput = false,                 /* Disable the PLL providing the ENET 125MHz reference clock */\n        .enableClkOutput500M = true,              /* Enable the PLL providing the ENET 500MHz reference clock */\n        .enableClkOutput25M = false,              /* Disable the PLL providing the ENET 25MHz reference clock */\n        .loopDivider = 1,                         /* Set frequency of ethernet reference clock to 50 MHz */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */\n    /* Setting the VDD_SOC to 1.25V. It is necessary to config AHB to 500Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x12);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Adc2);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    CLOCK_DisableClock(kCLOCK_Xbar2);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Set ARM_PODF. */\n    CLOCK_SetDiv(kCLOCK_ArmDiv, 0);\n    /* Set PERIPH_CLK2_PODF. */\n    CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* Disable USDHC1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc1);\n    /* Set USDHC1_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc1Div, 2);\n    /* Set Usdhc1 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);\n    /* Disable USDHC2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc2);\n    /* Set USDHC2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc2Div, 2);\n    /* Set Usdhc2 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n    /* Disable Semc clock gate. */\n    CLOCK_DisableClock(kCLOCK_Semc);\n    /* Set SEMC_PODF. */\n    CLOCK_SetDiv(kCLOCK_SemcDiv, 7);\n    /* Set Semc alt clock source. */\n    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);\n    /* Set Semc clock source. */\n    CLOCK_SetMux(kCLOCK_SemcMux, 0);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 3);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 2);\n#endif\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    CLOCK_DisableClock(kCLOCK_Lpspi3);\n    CLOCK_DisableClock(kCLOCK_Lpspi4);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai2);\n    /* Set SAI2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);\n    /* Set SAI2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai2Div, 1);\n    /* Set Sai2 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai2Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    CLOCK_DisableClock(kCLOCK_Lpi2c3);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable CAN clock gate. */\n    CLOCK_DisableClock(kCLOCK_Can1);\n    CLOCK_DisableClock(kCLOCK_Can2);\n    CLOCK_DisableClock(kCLOCK_Can1S);\n    CLOCK_DisableClock(kCLOCK_Can2S);\n    /* Set CAN_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_CanDiv, 1);\n    /* Set Can clock source. */\n    CLOCK_SetMux(kCLOCK_CanMux, 2);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    CLOCK_DisableClock(kCLOCK_Lpuart5);\n    CLOCK_DisableClock(kCLOCK_Lpuart6);\n    CLOCK_DisableClock(kCLOCK_Lpuart7);\n    CLOCK_DisableClock(kCLOCK_Lpuart8);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* Set Pll3 sw clock source. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n    #warning \"SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged.\"\n#endif\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 18);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 18);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 22);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 18);\n#endif\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Init Enet PLL. */\n    CLOCK_InitEnetPll(&enetPllConfig_BOARD_BootClockRUN);\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(3);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set ENET Ref clock source. */\n#if defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK)\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK;\n#elif defined(IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK)\n    /* Backward compatibility for original bitfield name */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK;\n#else\n#error \"Neither IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK nor IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK is defined.\"\n#endif /* defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) */\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             500000000U  /*!< Core clock frequency: 500000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT               500000000UL\n#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT               40000000UL\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL\n#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK              0UL\n#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK           0UL\n#define BOARD_BOOTCLOCKRUN_ENET_500M_REF_CLK          500000000UL\n#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK                0UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           132000000UL\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      62500000UL\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      62500000UL\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               125000000UL\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            62500000UL\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT              62500000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT            176000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT            176000000UL\n\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Enet PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_enet_pll_config_t enetPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v13.1\nprocessor: MIMXRT1024xxxxx\npackage_id: MIMXRT1024DAG5A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1024-EVK\npin_labels:\n- {pin_num: '52', pin_signal: WAKEUP, label: USER_BUTTON, identifier: USER_BUTTON}\n- {pin_num: '82', pin_signal: GPIO_AD_B1_08, label: 'UART_TX/USER_LED/J17[4]', identifier: USER_LED}\npower_domains: {NVCC_GPIO: '3.3'}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n\n/* GPIO_AD_B1_00~GPIO_AD_B1_05 can only be configured as flexspi function. Note that it can't be modified here */\n    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_00_FLEXSPI_A_DATA03,1U);\n    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_01_FLEXSPI_A_SCLK,1U);\n    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_02_FLEXSPI_A_DATA00,1U);\n    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_03_FLEXSPI_A_DATA02,1U);\n    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_04_FLEXSPI_A_DATA01,1U);\n    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_05_FLEXSPI_A_SS0_B,1U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '52', peripheral: GPIO5, signal: 'gpio_io, 00', pin_signal: WAKEUP, direction: INPUT}\n  - {pin_num: '82', peripheral: GPIO1, signal: 'gpio_io, 24', pin_signal: GPIO_AD_B1_08, direction: OUTPUT}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03U */\n  CLOCK_EnableClock(kCLOCK_IomuxcSnvs);       /* iomuxc_snvs clock (iomuxc_snvs_clk_enable): 0x03U */\n\n  /* GPIO configuration of USER_LED on GPIO_AD_B1_08 (pin 82) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_AD_B1_08 (pin 82) */\n  GPIO_PinInit(GPIO1, 24U, &USER_LED_config);\n\n  /* GPIO configuration of USER_BUTTON on WAKEUP (pin 52) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on WAKEUP (pin 52) */\n  GPIO_PinInit(GPIO5, 0U, &USER_BUTTON_config);\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B1_08_GPIO1_IO24,        /* GPIO_AD_B1_08 is configured as GPIO1_IO24 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_SNVS_WAKEUP_GPIO5_IO00,          /* WAKEUP is configured as GPIO5_IO00 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '101', peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_07}\n  - {pin_num: '105', peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_06}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03U */\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_06_LPUART1_TX,        /* GPIO_AD_B0_06 is configured as LPUART1_TX */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_07_LPUART1_RX,        /* GPIO_AD_B0_07 is configured as LPUART1_RX */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSDRAMPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '142', peripheral: SEMC, signal: 'ADDR, 00', pin_signal: GPIO_EMC_16}\n  - {pin_num: '141', peripheral: SEMC, signal: 'ADDR, 01', pin_signal: GPIO_EMC_17}\n  - {pin_num: '140', peripheral: SEMC, signal: 'ADDR, 02', pin_signal: GPIO_EMC_18}\n  - {pin_num: '139', peripheral: SEMC, signal: 'ADDR, 03', pin_signal: GPIO_EMC_19}\n  - {pin_num: '138', peripheral: SEMC, signal: 'ADDR, 04', pin_signal: GPIO_EMC_20}\n  - {pin_num: '136', peripheral: SEMC, signal: 'ADDR, 06', pin_signal: GPIO_EMC_22}\n  - {pin_num: '137', peripheral: SEMC, signal: 'ADDR, 05', pin_signal: GPIO_EMC_21}\n  - {pin_num: '133', peripheral: SEMC, signal: 'ADDR, 07', pin_signal: GPIO_EMC_23}\n  - {pin_num: '132', peripheral: SEMC, signal: 'ADDR, 08', pin_signal: GPIO_EMC_24}\n  - {pin_num: '131', peripheral: SEMC, signal: 'ADDR, 09', pin_signal: GPIO_EMC_25}\n  - {pin_num: '143', peripheral: SEMC, signal: 'ADDR, 10', pin_signal: GPIO_EMC_15}\n  - {pin_num: '130', peripheral: SEMC, signal: 'ADDR, 11', pin_signal: GPIO_EMC_26}\n  - {pin_num: '129', peripheral: SEMC, signal: 'ADDR, 12', pin_signal: GPIO_EMC_27}\n  - {pin_num: '2', peripheral: SEMC, signal: 'BA, 0', pin_signal: GPIO_EMC_13}\n  - {pin_num: '1', peripheral: SEMC, signal: 'BA, 1', pin_signal: GPIO_EMC_14}\n  - {pin_num: '7', peripheral: SEMC, signal: semc_cas, pin_signal: GPIO_EMC_10}\n  - {pin_num: '127', peripheral: SEMC, signal: semc_cke, pin_signal: GPIO_EMC_29}\n  - {pin_num: '126', peripheral: SEMC, signal: semc_clk, pin_signal: GPIO_EMC_30}\n  - {pin_num: '3', peripheral: SEMC, signal: 'CS, 0', pin_signal: GPIO_EMC_12}\n  - {pin_num: '8', peripheral: SEMC, signal: semc_we, pin_signal: GPIO_EMC_09}\n  - {pin_num: '4', peripheral: SEMC, signal: semc_ras, pin_signal: GPIO_EMC_11}\n  - {pin_num: '128', peripheral: SEMC, signal: semc_dqs, pin_signal: GPIO_EMC_28}\n  - {pin_num: '125', peripheral: SEMC, signal: 'DM, 1', pin_signal: GPIO_EMC_31}\n  - {pin_num: '9', peripheral: SEMC, signal: 'DM, 0', pin_signal: GPIO_EMC_08}\n  - {pin_num: '117', peripheral: SEMC, signal: 'DATA, 15', pin_signal: GPIO_EMC_39}\n  - {pin_num: '118', peripheral: SEMC, signal: 'DATA, 14', pin_signal: GPIO_EMC_38}\n  - {pin_num: '119', peripheral: SEMC, signal: 'DATA, 13', pin_signal: GPIO_EMC_37}\n  - {pin_num: '120', peripheral: SEMC, signal: 'DATA, 12', pin_signal: GPIO_EMC_36}\n  - {pin_num: '122', peripheral: SEMC, signal: 'DATA, 10', pin_signal: GPIO_EMC_34}\n  - {pin_num: '121', peripheral: SEMC, signal: 'DATA, 11', pin_signal: GPIO_EMC_35}\n  - {pin_num: '123', peripheral: SEMC, signal: 'DATA, 09', pin_signal: GPIO_EMC_33}\n  - {pin_num: '124', peripheral: SEMC, signal: 'DATA, 08', pin_signal: GPIO_EMC_32}\n  - {pin_num: '10', peripheral: SEMC, signal: 'DATA, 07', pin_signal: GPIO_EMC_07}\n  - {pin_num: '12', peripheral: SEMC, signal: 'DATA, 06', pin_signal: GPIO_EMC_06}\n  - {pin_num: '13', peripheral: SEMC, signal: 'DATA, 05', pin_signal: GPIO_EMC_05}\n  - {pin_num: '14', peripheral: SEMC, signal: 'DATA, 04', pin_signal: GPIO_EMC_04}\n  - {pin_num: '15', peripheral: SEMC, signal: 'DATA, 03', pin_signal: GPIO_EMC_03}\n  - {pin_num: '16', peripheral: SEMC, signal: 'DATA, 02', pin_signal: GPIO_EMC_02}\n  - {pin_num: '17', peripheral: SEMC, signal: 'DATA, 01', pin_signal: GPIO_EMC_01}\n  - {pin_num: '18', peripheral: SEMC, signal: 'DATA, 00', pin_signal: GPIO_EMC_00}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSDRAMPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitSDRAMPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03U */\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_00_SEMC_DATA00,         /* GPIO_EMC_00 is configured as SEMC_DATA00 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_01_SEMC_DATA01,         /* GPIO_EMC_01 is configured as SEMC_DATA01 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_02_SEMC_DATA02,         /* GPIO_EMC_02 is configured as SEMC_DATA02 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_03_SEMC_DATA03,         /* GPIO_EMC_03 is configured as SEMC_DATA03 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_04_SEMC_DATA04,         /* GPIO_EMC_04 is configured as SEMC_DATA04 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_05_SEMC_DATA05,         /* GPIO_EMC_05 is configured as SEMC_DATA05 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_06_SEMC_DATA06,         /* GPIO_EMC_06 is configured as SEMC_DATA06 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_07_SEMC_DATA07,         /* GPIO_EMC_07 is configured as SEMC_DATA07 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_08_SEMC_DM00,           /* GPIO_EMC_08 is configured as SEMC_DM00 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_09_SEMC_WE,             /* GPIO_EMC_09 is configured as SEMC_WE */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_10_SEMC_CAS,            /* GPIO_EMC_10 is configured as SEMC_CAS */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_11_SEMC_RAS,            /* GPIO_EMC_11 is configured as SEMC_RAS */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_12_SEMC_CS0,            /* GPIO_EMC_12 is configured as SEMC_CS0 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_13_SEMC_BA0,            /* GPIO_EMC_13 is configured as SEMC_BA0 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_14_SEMC_BA1,            /* GPIO_EMC_14 is configured as SEMC_BA1 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_15_SEMC_ADDR10,         /* GPIO_EMC_15 is configured as SEMC_ADDR10 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_16_SEMC_ADDR00,         /* GPIO_EMC_16 is configured as SEMC_ADDR00 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_17_SEMC_ADDR01,         /* GPIO_EMC_17 is configured as SEMC_ADDR01 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_18_SEMC_ADDR02,         /* GPIO_EMC_18 is configured as SEMC_ADDR02 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_19_SEMC_ADDR03,         /* GPIO_EMC_19 is configured as SEMC_ADDR03 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_20_SEMC_ADDR04,         /* GPIO_EMC_20 is configured as SEMC_ADDR04 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_21_SEMC_ADDR05,         /* GPIO_EMC_21 is configured as SEMC_ADDR05 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_22_SEMC_ADDR06,         /* GPIO_EMC_22 is configured as SEMC_ADDR06 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_23_SEMC_ADDR07,         /* GPIO_EMC_23 is configured as SEMC_ADDR07 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_24_SEMC_ADDR08,         /* GPIO_EMC_24 is configured as SEMC_ADDR08 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_25_SEMC_ADDR09,         /* GPIO_EMC_25 is configured as SEMC_ADDR09 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_26_SEMC_ADDR11,         /* GPIO_EMC_26 is configured as SEMC_ADDR11 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_27_SEMC_ADDR12,         /* GPIO_EMC_27 is configured as SEMC_ADDR12 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_28_SEMC_DQS,            /* GPIO_EMC_28 is configured as SEMC_DQS */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_29_SEMC_CKE,            /* GPIO_EMC_29 is configured as SEMC_CKE */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_30_SEMC_CLK,            /* GPIO_EMC_30 is configured as SEMC_CLK */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_31_SEMC_DM01,           /* GPIO_EMC_31 is configured as SEMC_DM01 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_32_SEMC_DATA08,         /* GPIO_EMC_32 is configured as SEMC_DATA08 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_33_SEMC_DATA09,         /* GPIO_EMC_33 is configured as SEMC_DATA09 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_34_SEMC_DATA10,         /* GPIO_EMC_34 is configured as SEMC_DATA10 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_35_SEMC_DATA11,         /* GPIO_EMC_35 is configured as SEMC_DATA11 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_36_SEMC_DATA12,         /* GPIO_EMC_36 is configured as SEMC_DATA12 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_37_SEMC_DATA13,         /* GPIO_EMC_37 is configured as SEMC_DATA13 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_38_SEMC_DATA14,         /* GPIO_EMC_38 is configured as SEMC_DATA14 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_39_SEMC_DATA15,         /* GPIO_EMC_39 is configured as SEMC_DATA15 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitCANPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '32', peripheral: CAN1, signal: RX, pin_signal: GPIO_SD_B1_01}\n  - {pin_num: '33', peripheral: CAN1, signal: TX, pin_signal: GPIO_SD_B1_00}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitCANPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitCANPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03U */\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B1_00_FLEXCAN1_TX,       /* GPIO_SD_B1_00 is configured as FLEXCAN1_TX */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B1_01_FLEXCAN1_RX,       /* GPIO_SD_B1_01 is configured as FLEXCAN1_RX */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitENETPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '97', peripheral: ENET, signal: enet_rx_en, pin_signal: GPIO_AD_B0_11}\n  - {pin_num: '84', peripheral: GPIO1, signal: 'gpio_io, 22', pin_signal: GPIO_AD_B1_06}\n  - {pin_num: '107', peripheral: GPIO1, signal: 'gpio_io, 04', pin_signal: GPIO_AD_B0_04}\n  - {pin_num: '100', peripheral: ENET, signal: enet_tx_clk, pin_signal: GPIO_AD_B0_08}\n  - {pin_num: '95', peripheral: ENET, signal: enet_tx_en, pin_signal: GPIO_AD_B0_13}\n  - {pin_num: '93', peripheral: ENET, signal: 'enet_tx_data, 1', pin_signal: GPIO_AD_B0_15}\n  - {pin_num: '94', peripheral: ENET, signal: 'enet_tx_data, 0', pin_signal: GPIO_AD_B0_14}\n  - {pin_num: '96', peripheral: ENET, signal: enet_rx_er, pin_signal: GPIO_AD_B0_12}\n  - {pin_num: '99', peripheral: ENET, signal: 'enet_rx_data, 1', pin_signal: GPIO_AD_B0_09}\n  - {pin_num: '98', peripheral: ENET, signal: 'enet_rx_data, 0', pin_signal: GPIO_AD_B0_10}\n  - {pin_num: '116', peripheral: ENET, signal: enet_mdio, pin_signal: GPIO_EMC_40}\n  - {pin_num: '115', peripheral: ENET, signal: enet_mdc, pin_signal: GPIO_EMC_41}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitENETPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitENETPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03U */\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_04_GPIO1_IO04,        /* GPIO_AD_B0_04 is configured as GPIO1_IO04 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_08_ENET_TX_CLK,       /* GPIO_AD_B0_08 is configured as ENET_TX_CLK */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_09_ENET_RDATA01,      /* GPIO_AD_B0_09 is configured as ENET_RDATA01 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_10_ENET_RDATA00,      /* GPIO_AD_B0_10 is configured as ENET_RDATA00 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_11_ENET_RX_EN,        /* GPIO_AD_B0_11 is configured as ENET_RX_EN */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_12_ENET_RX_ER,        /* GPIO_AD_B0_12 is configured as ENET_RX_ER */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_13_ENET_TX_EN,        /* GPIO_AD_B0_13 is configured as ENET_TX_EN */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_14_ENET_TDATA00,      /* GPIO_AD_B0_14 is configured as ENET_TDATA00 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B0_15_ENET_TDATA01,      /* GPIO_AD_B0_15 is configured as ENET_TDATA01 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_B1_06_GPIO1_IO22,        /* GPIO_AD_B1_06 is configured as GPIO1_IO22 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_40_ENET_MDIO,           /* GPIO_EMC_40 is configured as ENET_MDIO */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_EMC_41_ENET_MDC,            /* GPIO_EMC_41 is configured as ENET_MDC */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSDHCPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '45', peripheral: USDHC1, signal: usdhc_clk, pin_signal: GPIO_SD_B0_03}\n  - {pin_num: '46', peripheral: USDHC1, signal: usdhc_cmd, pin_signal: GPIO_SD_B0_02}\n  - {pin_num: '43', peripheral: USDHC1, signal: 'usdhc_data, 0', pin_signal: GPIO_SD_B0_04}\n  - {pin_num: '42', peripheral: USDHC1, signal: 'usdhc_data, 1', pin_signal: GPIO_SD_B0_05}\n  - {pin_num: '48', peripheral: USDHC1, signal: 'usdhc_data, 2', pin_signal: GPIO_SD_B0_00}\n  - {pin_num: '47', peripheral: USDHC1, signal: 'usdhc_data, 3', pin_signal: GPIO_SD_B0_01}\n  - {pin_num: '41', peripheral: GPIO3, signal: 'gpio_io, 19', pin_signal: GPIO_SD_B0_06}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSDHCPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitUSDHCPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03U */\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B0_00_USDHC1_DATA2,      /* GPIO_SD_B0_00 is configured as USDHC1_DATA2 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B0_01_USDHC1_DATA3,      /* GPIO_SD_B0_01 is configured as USDHC1_DATA3 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B0_02_USDHC1_CMD,        /* GPIO_SD_B0_02 is configured as USDHC1_CMD */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B0_03_USDHC1_CLK,        /* GPIO_SD_B0_03 is configured as USDHC1_CLK */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B0_04_USDHC1_DATA0,      /* GPIO_SD_B0_04 is configured as USDHC1_DATA0 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B0_05_USDHC1_DATA1,      /* GPIO_SD_B0_05 is configured as USDHC1_DATA1 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B0_06_GPIO3_IO19,        /* GPIO_SD_B0_06 is configured as GPIO3_IO19 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitQSPIPins:\n- options: {coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '24', peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07}\n  - {pin_num: '23', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08}\n  - {pin_num: '21', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_10}\n  - {pin_num: '22', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_09}\n  - {pin_num: '25', peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_06}\n  - {pin_num: '19', peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_11}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitQSPIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitQSPIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03U */\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B1_06_FLEXSPI_A_DATA03,  /* GPIO_SD_B1_06 is configured as FLEXSPI_A_DATA03 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B1_07_FLEXSPI_A_SCLK,    /* GPIO_SD_B1_07 is configured as FLEXSPI_A_SCLK */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B1_08_FLEXSPI_A_DATA00,  /* GPIO_SD_B1_08 is configured as FLEXSPI_A_DATA00 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B1_09_FLEXSPI_A_DATA02,  /* GPIO_SD_B1_09 is configured as FLEXSPI_A_DATA02 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B1_10_FLEXSPI_A_DATA01,  /* GPIO_SD_B1_10 is configured as FLEXSPI_A_DATA01 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_SD_B1_11_FLEXSPI_A_SS0_B,   /* GPIO_SD_B1_11 is configured as FLEXSPI_A_SS0_B */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n}\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/* Define the flexspi macro. Note that it can't be modified here */\n#define IOMUXC_GPIO_AD_B1_00_FLEXSPI_A_DATA03 0x401F80FCU, 0x1U, 0x401F8374U, 0x1U, 0x401F8270U\n#define IOMUXC_GPIO_AD_B1_01_FLEXSPI_A_SCLK 0x401F8100U, 0x1U, 0x401F8378U, 0x1U, 0x401F8274U\n#define IOMUXC_GPIO_AD_B1_02_FLEXSPI_A_DATA00 0x401F8104U, 0x1U, 0x401F8368U, 0x1U, 0x401F8278U\n#define IOMUXC_GPIO_AD_B1_03_FLEXSPI_A_DATA02 0x401F8108U, 0x1U, 0x401F8370U, 0x1U, 0x401F827CU\n#define IOMUXC_GPIO_AD_B1_04_FLEXSPI_A_DATA01 0x401F810CU, 0x1U, 0x401F836CU, 0x1U, 0x401F8280U\n#define IOMUXC_GPIO_AD_B1_05_FLEXSPI_A_SS0_B 0x401F8110U, 0x1U, 0, 0, 0x401F8284U\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/* WAKEUP (number 52), USER_BUTTON */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO5   /*!< GPIO device name: GPIO5 */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO5   /*!< PORT device name: GPIO5 */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        0U   /*!< GPIO5 pin index: 0 */\n\n/* GPIO_AD_B1_08 (number 82), UART_TX/USER_LED/J17[4] */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO1   /*!< GPIO device name: GPIO1 */\n#define BOARD_INITPINS_USER_LED_PORT                                       GPIO1   /*!< PORT device name: GPIO1 */\n#define BOARD_INITPINS_USER_LED_PIN                                          24U   /*!< GPIO1 pin index: 24 */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/* GPIO_AD_B0_07 (number 101), UART1_RXD/J17[8] */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_PERIPHERAL                    LPUART1   /*!< Device name: LPUART1 */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_SIGNAL                             RX   /*!< LPUART1 signal: RX */\n\n/* GPIO_AD_B0_06 (number 105), UART1_TXD/J17[12] */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_PERIPHERAL                    LPUART1   /*!< Device name: LPUART1 */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_SIGNAL                             TX   /*!< LPUART1 signal: TX */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n/* GPIO_EMC_16 (number 142), SEMC_A0/U14[23]/BOOT_MODE[0] */\n#define BOARD_INITSDRAMPINS_SEMC_A0_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A0_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A0_CHANNEL                                   0U   /*!< SEMC ADDR channel: 00 */\n\n/* GPIO_EMC_17 (number 141), SEMC_A1/U14[24]/BOOT_MODE[1] */\n#define BOARD_INITSDRAMPINS_SEMC_A1_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A1_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A1_CHANNEL                                   1U   /*!< SEMC ADDR channel: 01 */\n\n/* GPIO_EMC_18 (number 140), SEMC_A2/U14[25]/BT_CFG[0] */\n#define BOARD_INITSDRAMPINS_SEMC_A2_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A2_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A2_CHANNEL                                   2U   /*!< SEMC ADDR channel: 02 */\n\n/* GPIO_EMC_19 (number 139), SEMC_A3/U14[26]/BT_CFG[1] */\n#define BOARD_INITSDRAMPINS_SEMC_A3_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A3_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A3_CHANNEL                                   3U   /*!< SEMC ADDR channel: 03 */\n\n/* GPIO_EMC_20 (number 138), SEMC_A4/U14[29]/BT_CFG[2] */\n#define BOARD_INITSDRAMPINS_SEMC_A4_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A4_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A4_CHANNEL                                   4U   /*!< SEMC ADDR channel: 04 */\n\n/* GPIO_EMC_22 (number 136), SEMC_A6/U14[31]/BT_CFG[4] */\n#define BOARD_INITSDRAMPINS_SEMC_A6_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A6_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A6_CHANNEL                                   6U   /*!< SEMC ADDR channel: 06 */\n\n/* GPIO_EMC_21 (number 137), SEMC_A5/U14[30]/BT_CFG[3] */\n#define BOARD_INITSDRAMPINS_SEMC_A5_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A5_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A5_CHANNEL                                   5U   /*!< SEMC ADDR channel: 05 */\n\n/* GPIO_EMC_23 (number 133), SEMC_A7/U14[32]/BT_CFG[5] */\n#define BOARD_INITSDRAMPINS_SEMC_A7_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A7_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A7_CHANNEL                                   7U   /*!< SEMC ADDR channel: 07 */\n\n/* GPIO_EMC_24 (number 132), SEMC_A8/U14[33]/BT_CFG[6] */\n#define BOARD_INITSDRAMPINS_SEMC_A8_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A8_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A8_CHANNEL                                   8U   /*!< SEMC ADDR channel: 08 */\n\n/* GPIO_EMC_25 (number 131), SEMC_A9/U14[34]/BT_CFG[7] */\n#define BOARD_INITSDRAMPINS_SEMC_A9_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A9_SIGNAL                                  ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A9_CHANNEL                                   9U   /*!< SEMC ADDR channel: 09 */\n\n/* GPIO_EMC_15 (number 143), SEMC_A10/U14[22] */\n#define BOARD_INITSDRAMPINS_SEMC_A10_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A10_SIGNAL                                 ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A10_CHANNEL                                 10U   /*!< SEMC ADDR channel: 10 */\n\n/* GPIO_EMC_26 (number 130), SEMC_A11/U14[35]/BT_CFG[8] */\n#define BOARD_INITSDRAMPINS_SEMC_A11_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A11_SIGNAL                                 ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A11_CHANNEL                                 11U   /*!< SEMC ADDR channel: 11 */\n\n/* GPIO_EMC_27 (number 129), SEMC_A12/U14[36]/BT_CFG[9] */\n#define BOARD_INITSDRAMPINS_SEMC_A12_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_A12_SIGNAL                                 ADDR   /*!< SEMC signal: ADDR */\n#define BOARD_INITSDRAMPINS_SEMC_A12_CHANNEL                                 12U   /*!< SEMC ADDR channel: 12 */\n\n/* GPIO_EMC_13 (number 2), SEMC_BA0/U14[20] */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_SIGNAL                                   BA   /*!< SEMC signal: BA */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_CHANNEL                                  0U   /*!< SEMC BA channel: 0 */\n\n/* GPIO_EMC_14 (number 1), SEMC_BA1/U14[21] */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_SIGNAL                                   BA   /*!< SEMC signal: BA */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_CHANNEL                                  1U   /*!< SEMC BA channel: 1 */\n\n/* GPIO_EMC_10 (number 7), SEMC_CAS/U14[17] */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_SIGNAL                             semc_cas   /*!< SEMC signal: semc_cas */\n\n/* GPIO_EMC_29 (number 127), SEMC_CKE/U14[37] */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_SIGNAL                             semc_cke   /*!< SEMC signal: semc_cke */\n\n/* GPIO_EMC_30 (number 126), SEMC_CLK/U14[38] */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_SIGNAL                             semc_clk   /*!< SEMC signal: semc_clk */\n\n/* GPIO_EMC_12 (number 3), SEMC_CS0/U14[19] */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_SIGNAL                                   CS   /*!< SEMC signal: CS */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_CHANNEL                                  0U   /*!< SEMC CS channel: 0 */\n\n/* GPIO_EMC_09 (number 8), SEMC_WE/U14[16] */\n#define BOARD_INITSDRAMPINS_SEMC_WE_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_WE_SIGNAL                               semc_we   /*!< SEMC signal: semc_we */\n\n/* GPIO_EMC_11 (number 4), SEMC_RAS/U14[18] */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_SIGNAL                             semc_ras   /*!< SEMC signal: semc_ras */\n\n/* GPIO_EMC_28 (number 128), SAI3_MCLK */\n#define BOARD_INITSDRAMPINS_SEMC_DQS_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_DQS_SIGNAL                             semc_dqs   /*!< SEMC signal: semc_dqs */\n\n/* GPIO_EMC_31 (number 125), SEMC_DM1/U14[39] */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_SIGNAL                                   DM   /*!< SEMC signal: DM */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_CHANNEL                                  1U   /*!< SEMC DM channel: 1 */\n\n/* GPIO_EMC_08 (number 9), SEMC_DM0/U14[15] */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_SIGNAL                                   DM   /*!< SEMC signal: DM */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_CHANNEL                                  0U   /*!< SEMC DM channel: 0 */\n\n/* GPIO_EMC_39 (number 117), SEMC_D15/U14[53] */\n#define BOARD_INITSDRAMPINS_SEMC_D15_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D15_SIGNAL                                 DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D15_CHANNEL                                 15U   /*!< SEMC DATA channel: 15 */\n\n/* GPIO_EMC_38 (number 118), SEMC_D14/U14[51] */\n#define BOARD_INITSDRAMPINS_SEMC_D14_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D14_SIGNAL                                 DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D14_CHANNEL                                 14U   /*!< SEMC DATA channel: 14 */\n\n/* GPIO_EMC_37 (number 119), SEMC_D13/U14[50] */\n#define BOARD_INITSDRAMPINS_SEMC_D13_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D13_SIGNAL                                 DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D13_CHANNEL                                 13U   /*!< SEMC DATA channel: 13 */\n\n/* GPIO_EMC_36 (number 120), SEMC_D12/U14[48] */\n#define BOARD_INITSDRAMPINS_SEMC_D12_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D12_SIGNAL                                 DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D12_CHANNEL                                 12U   /*!< SEMC DATA channel: 12 */\n\n/* GPIO_EMC_34 (number 122), SEMC_D10/U14[45] */\n#define BOARD_INITSDRAMPINS_SEMC_D10_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D10_SIGNAL                                 DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D10_CHANNEL                                 10U   /*!< SEMC DATA channel: 10 */\n\n/* GPIO_EMC_35 (number 121), SEMC_D11/U14[47] */\n#define BOARD_INITSDRAMPINS_SEMC_D11_PERIPHERAL                             SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D11_SIGNAL                                 DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D11_CHANNEL                                 11U   /*!< SEMC DATA channel: 11 */\n\n/* GPIO_EMC_33 (number 123), SEMC_D9/U14[44] */\n#define BOARD_INITSDRAMPINS_SEMC_D9_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D9_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D9_CHANNEL                                   9U   /*!< SEMC DATA channel: 09 */\n\n/* GPIO_EMC_32 (number 124), SEMC_D8/U14[42] */\n#define BOARD_INITSDRAMPINS_SEMC_D8_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D8_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D8_CHANNEL                                   8U   /*!< SEMC DATA channel: 08 */\n\n/* GPIO_EMC_07 (number 10), SEMC_D7/U14[13] */\n#define BOARD_INITSDRAMPINS_SEMC_D7_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D7_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D7_CHANNEL                                   7U   /*!< SEMC DATA channel: 07 */\n\n/* GPIO_EMC_06 (number 12), SEMC_D6/U14[11] */\n#define BOARD_INITSDRAMPINS_SEMC_D6_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D6_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D6_CHANNEL                                   6U   /*!< SEMC DATA channel: 06 */\n\n/* GPIO_EMC_05 (number 13), SEMC_D5/U14[10] */\n#define BOARD_INITSDRAMPINS_SEMC_D5_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D5_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D5_CHANNEL                                   5U   /*!< SEMC DATA channel: 05 */\n\n/* GPIO_EMC_04 (number 14), SEMC_D4/U14[8] */\n#define BOARD_INITSDRAMPINS_SEMC_D4_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D4_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D4_CHANNEL                                   4U   /*!< SEMC DATA channel: 04 */\n\n/* GPIO_EMC_03 (number 15), SEMC_D3/U14[7] */\n#define BOARD_INITSDRAMPINS_SEMC_D3_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D3_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D3_CHANNEL                                   3U   /*!< SEMC DATA channel: 03 */\n\n/* GPIO_EMC_02 (number 16), SEMC_D2/U14[5] */\n#define BOARD_INITSDRAMPINS_SEMC_D2_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D2_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D2_CHANNEL                                   2U   /*!< SEMC DATA channel: 02 */\n\n/* GPIO_EMC_01 (number 17), SEMC_D1/U14[4] */\n#define BOARD_INITSDRAMPINS_SEMC_D1_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D1_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D1_CHANNEL                                   1U   /*!< SEMC DATA channel: 01 */\n\n/* GPIO_EMC_00 (number 18), SEMC_D0/U14[2] */\n#define BOARD_INITSDRAMPINS_SEMC_D0_PERIPHERAL                              SEMC   /*!< Device name: SEMC */\n#define BOARD_INITSDRAMPINS_SEMC_D0_SIGNAL                                  DATA   /*!< SEMC signal: DATA */\n#define BOARD_INITSDRAMPINS_SEMC_D0_CHANNEL                                   0U   /*!< SEMC DATA channel: 00 */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSDRAMPins(void);\n\n/* GPIO_SD_B1_01 (number 32), CAN1_RX/U9[4] */\n#define BOARD_INITCANPINS_CAN1_RX_PERIPHERAL                                CAN1   /*!< Device name: CAN1 */\n#define BOARD_INITCANPINS_CAN1_RX_SIGNAL                                      RX   /*!< CAN1 signal: RX */\n\n/* GPIO_SD_B1_00 (number 33), CAN1_TX/U9[1] */\n#define BOARD_INITCANPINS_CAN1_TX_PERIPHERAL                                CAN1   /*!< Device name: CAN1 */\n#define BOARD_INITCANPINS_CAN1_TX_SIGNAL                                      TX   /*!< CAN1 signal: TX */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitCANPins(void);\n\n/* GPIO_AD_B0_11 (number 97), ENET_CRS_DV/U11[18]/J19[6] */\n#define BOARD_INITENETPINS_ENET_CRS_DV_PERIPHERAL                           ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_CRS_DV_SIGNAL                         enet_rx_en   /*!< ENET signal: enet_rx_en */\n\n/* GPIO_AD_B1_06 (number 84), ENET_INT/U11[21]/J17[16] */\n#define BOARD_INITENETPINS_ENET_INT_GPIO                                   GPIO1   /*!< GPIO device name: GPIO1 */\n#define BOARD_INITENETPINS_ENET_INT_PORT                                   GPIO1   /*!< PORT device name: GPIO1 */\n#define BOARD_INITENETPINS_ENET_INT_PIN                                      22U   /*!< GPIO1 pin index: 22 */\n\n/* GPIO_AD_B0_04 (number 107), JTAG_TDO/ENET_RST/U11[32] */\n#define BOARD_INITENETPINS_ENET_RST_GPIO                                   GPIO1   /*!< GPIO device name: GPIO1 */\n#define BOARD_INITENETPINS_ENET_RST_PORT                                   GPIO1   /*!< PORT device name: GPIO1 */\n#define BOARD_INITENETPINS_ENET_RST_PIN                                       4U   /*!< GPIO1 pin index: 4 */\n\n/* GPIO_AD_B0_08 (number 100), ENET_TX_REF_CLK/U11[9] */\n#define BOARD_INITENETPINS_ENET_TX_CLK_PERIPHERAL                           ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_TX_CLK_SIGNAL                        enet_tx_clk   /*!< ENET signal: enet_tx_clk */\n\n/* GPIO_AD_B0_13 (number 95), ENET_TXEN/U11[23]/J19[10] */\n#define BOARD_INITENETPINS_ENET_TXEN_PERIPHERAL                             ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_TXEN_SIGNAL                           enet_tx_en   /*!< ENET signal: enet_tx_en */\n\n/* GPIO_AD_B0_15 (number 93), ENET_TXD1/U11[25]/J19[4] */\n#define BOARD_INITENETPINS_ENET_TXD1_PERIPHERAL                             ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_TXD1_SIGNAL                         enet_tx_data   /*!< ENET signal: enet_tx_data */\n#define BOARD_INITENETPINS_ENET_TXD1_CHANNEL                                  1U   /*!< ENET enet_tx_data channel: 1 */\n\n/* GPIO_AD_B0_14 (number 94), ENET_TXD0/U11[24]/J17[14] */\n#define BOARD_INITENETPINS_ENET_TXD0_PERIPHERAL                             ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_TXD0_SIGNAL                         enet_tx_data   /*!< ENET signal: enet_tx_data */\n#define BOARD_INITENETPINS_ENET_TXD0_CHANNEL                                  0U   /*!< ENET enet_tx_data channel: 0 */\n\n/* GPIO_AD_B0_12 (number 96), ENET_RXER/U11[20]/J19[8] */\n#define BOARD_INITENETPINS_ENET_RXER_PERIPHERAL                             ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_RXER_SIGNAL                           enet_rx_er   /*!< ENET signal: enet_rx_er */\n\n/* GPIO_AD_B0_09 (number 99), ENET_RXD1/U11[15]/J17[6] */\n#define BOARD_INITENETPINS_ENET_RXD1_PERIPHERAL                             ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_RXD1_SIGNAL                         enet_rx_data   /*!< ENET signal: enet_rx_data */\n#define BOARD_INITENETPINS_ENET_RXD1_CHANNEL                                  1U   /*!< ENET enet_rx_data channel: 1 */\n\n/* GPIO_AD_B0_10 (number 98), ENET_RXD0/U11[16]/J19[12] */\n#define BOARD_INITENETPINS_ENET_RXD0_PERIPHERAL                             ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_RXD0_SIGNAL                         enet_rx_data   /*!< ENET signal: enet_rx_data */\n#define BOARD_INITENETPINS_ENET_RXD0_CHANNEL                                  0U   /*!< ENET enet_rx_data channel: 0 */\n\n/* GPIO_EMC_40 (number 116), ENET_MDIO/U11[11] */\n#define BOARD_INITENETPINS_ENET_MDIO_PERIPHERAL                             ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_MDIO_SIGNAL                            enet_mdio   /*!< ENET signal: enet_mdio */\n\n/* GPIO_EMC_41 (number 115), ENET_MDC/U11[12] */\n#define BOARD_INITENETPINS_ENET_MDC_PERIPHERAL                              ENET   /*!< Device name: ENET */\n#define BOARD_INITENETPINS_ENET_MDC_SIGNAL                              enet_mdc   /*!< ENET signal: enet_mdc */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitENETPins(void);\n\n/* GPIO_SD_B0_03 (number 45), SD1_CLK/J15[5] */\n#define BOARD_INITUSDHCPINS_SD1_CLK_PERIPHERAL                            USDHC1   /*!< Device name: USDHC1 */\n#define BOARD_INITUSDHCPINS_SD1_CLK_SIGNAL                             usdhc_clk   /*!< USDHC1 signal: usdhc_clk */\n\n/* GPIO_SD_B0_02 (number 46), SD1_CMD/J15[3] */\n#define BOARD_INITUSDHCPINS_SD1_CMD_PERIPHERAL                            USDHC1   /*!< Device name: USDHC1 */\n#define BOARD_INITUSDHCPINS_SD1_CMD_SIGNAL                             usdhc_cmd   /*!< USDHC1 signal: usdhc_cmd */\n\n/* GPIO_SD_B0_04 (number 43), SD1_D0/J15[7] */\n#define BOARD_INITUSDHCPINS_SD1_D0_PERIPHERAL                             USDHC1   /*!< Device name: USDHC1 */\n#define BOARD_INITUSDHCPINS_SD1_D0_SIGNAL                             usdhc_data   /*!< USDHC1 signal: usdhc_data */\n#define BOARD_INITUSDHCPINS_SD1_D0_CHANNEL                                    0U   /*!< USDHC1 usdhc_data channel: 0 */\n\n/* GPIO_SD_B0_05 (number 42), SD1_D1/J15[8] */\n#define BOARD_INITUSDHCPINS_SD1_D1_PERIPHERAL                             USDHC1   /*!< Device name: USDHC1 */\n#define BOARD_INITUSDHCPINS_SD1_D1_SIGNAL                             usdhc_data   /*!< USDHC1 signal: usdhc_data */\n#define BOARD_INITUSDHCPINS_SD1_D1_CHANNEL                                    1U   /*!< USDHC1 usdhc_data channel: 1 */\n\n/* GPIO_SD_B0_00 (number 48), SD1_D2/J15[1] */\n#define BOARD_INITUSDHCPINS_SD1_D2_PERIPHERAL                             USDHC1   /*!< Device name: USDHC1 */\n#define BOARD_INITUSDHCPINS_SD1_D2_SIGNAL                             usdhc_data   /*!< USDHC1 signal: usdhc_data */\n#define BOARD_INITUSDHCPINS_SD1_D2_CHANNEL                                    2U   /*!< USDHC1 usdhc_data channel: 2 */\n\n/* GPIO_SD_B0_01 (number 47), SD1_D3/J15[2] */\n#define BOARD_INITUSDHCPINS_SD1_D3_PERIPHERAL                             USDHC1   /*!< Device name: USDHC1 */\n#define BOARD_INITUSDHCPINS_SD1_D3_SIGNAL                             usdhc_data   /*!< USDHC1 signal: usdhc_data */\n#define BOARD_INITUSDHCPINS_SD1_D3_CHANNEL                                    3U   /*!< USDHC1 usdhc_data channel: 3 */\n\n/* GPIO_SD_B0_06 (number 41), SD_CD_SW/J15[9] */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_GPIO                                  GPIO3   /*!< GPIO device name: GPIO3 */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_PORT                                  GPIO3   /*!< PORT device name: GPIO3 */\n#define BOARD_INITUSDHCPINS_SD_CD_SW_PIN                                     19U   /*!< GPIO3 pin index: 19 */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSDHCPins(void);\n\n/* GPIO_SD_B1_07 (number 24), SAI3_TX_SYNC */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_PERIPHERAL                        FLEXSPI   /*!< Device name: FLEXSPI */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_SIGNAL                     FLEXSPI_A_SCLK   /*!< FLEXSPI signal: FLEXSPI_A_SCLK */\n\n/* GPIO_SD_B1_08 (number 23), SAI3_TXD */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_PERIPHERAL                       FLEXSPI   /*!< Device name: FLEXSPI */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_SIGNAL                   FLEXSPI_A_DATA0   /*!< FLEXSPI signal: FLEXSPI_A_DATA0 */\n\n/* GPIO_SD_B1_10 (number 21), SD_PWREN */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_PERIPHERAL                       FLEXSPI   /*!< Device name: FLEXSPI */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_SIGNAL                   FLEXSPI_A_DATA1   /*!< FLEXSPI signal: FLEXSPI_A_DATA1 */\n\n/* GPIO_SD_B1_09 (number 22), AUD_INT */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_PERIPHERAL                       FLEXSPI   /*!< Device name: FLEXSPI */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_SIGNAL                   FLEXSPI_A_DATA2   /*!< FLEXSPI signal: FLEXSPI_A_DATA2 */\n\n/* GPIO_SD_B1_06 (number 25), SAI3_TX_BCLK */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_PERIPHERAL                       FLEXSPI   /*!< Device name: FLEXSPI */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_SIGNAL                   FLEXSPI_A_DATA3   /*!< FLEXSPI signal: FLEXSPI_A_DATA3 */\n\n/* GPIO_SD_B1_11 (number 19), SAI3_RXD */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_PERIPHERAL                        FLEXSPI   /*!< Device name: FLEXSPI */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_SIGNAL                    FLEXSPI_A_SS0_B   /*!< FLEXSPI signal: FLEXSPI_A_SS0_B */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitQSPIPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/board.cmake",
    "content": "set(MCU_FAMILY RT1020)\nset(MCU_VARIANT MIMXRT1024)\n\nset(JLINK_DEVICE MIMXRT1024xxx5A)\nset(PYOCD_TARGET mimxrt1024)\nset(NXPLINK_DEVICE MIMXRT1024xxxxx:MIMXRT1024-EVK)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkmimxrt1024_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1024DAG5A\n    CFG_EXAMPLE_VIDEO_READONLY\n    #-Wno-error=array-bounds\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: i.MX RT1024 Evaluation Kit\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/i-mx-evaluation-and-development-boards/i-mx-rt1024-evaluation-kit:MIMXRT1024-EVK\n*/\n\n#ifndef BOARD_MIMXRT1024_EVK_H_\n#define BOARD_MIMXRT1024_EVK_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n// RT1020-EVK #define BOARD_FLASH_SIZE (0x800000U)\n#define BOARD_FLASH_SIZE (0x400000U) // builtin flash of RT1024\n\n// LED: IOMUXC_GPIO_AD_B1_08_GPIO1_IO24\n#define LED_PORT              BOARD_INITPINS_USER_LED_GPIO\n#define LED_PIN               BOARD_INITPINS_USER_LED_PIN\n#define LED_STATE_ON          1\n\n// SW8 button: IOMUXC_SNVS_WAKEUP_GPIO5_IO00\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_GPIO\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: IOMUXC_GPIO_AD_B0_07_LPUART1_RX, IOMUXC_GPIO_AD_B0_06_LPUART1_TX\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1024DAG5A\nMCU_FAMILY = RT1020\nMCU_VARIANT = MIMXRT1024\n\n# warnings caused by mcu driver\nCFLAGS += -Wno-error=array-bounds\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1024xxx5A\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1024\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/evkmimxrt1024_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2020 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkmimxrt1024_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\"), used))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackInternally,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            .sflashPadType    = kSerialFlash_4Pads,\n            .serialClkFreq    = kFlexSpiSerialClk_60MHz,\n            .sflashA1Size     = 4u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 64u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/evkmimxrt1024_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2020 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKMIMXRT1024_FLEXSPI_NOR_CONFIG__\n#define __EVKMIMXRT1024_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.1. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 1))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG     (0x42464346UL) // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE    (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ        0\n#define CMD_INDEX_READSTATUS  1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE       4\n\n#define CMD_LUT_SEQ_IDX_READ        0\n#define CMD_LUT_SEQ_IDX_READSTATUS  1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE       9\n\n#define CMD_SDR        0x01\n#define CMD_DDR        0x21\n#define RADDR_SDR      0x02\n#define RADDR_DDR      0x22\n#define CADDR_SDR      0x03\n#define CADDR_DDR      0x23\n#define MODE1_SDR      0x04\n#define MODE1_DDR      0x24\n#define MODE2_SDR      0x05\n#define MODE2_DDR      0x25\n#define MODE4_SDR      0x06\n#define MODE4_DDR      0x26\n#define MODE8_SDR      0x07\n#define MODE8_DDR      0x27\n#define WRITE_SDR      0x08\n#define WRITE_DDR      0x28\n#define READ_SDR       0x09\n#define READ_DDR       0x29\n#define LEARN_SDR      0x0A\n#define LEARN_DDR      0x2A\n#define DATSZ_SDR      0x0B\n#define DATSZ_DDR      0x2B\n#define DUMMY_SDR      0x0C\n#define DUMMY_DDR      0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS      0x1F\n#define STOP           0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_133MHz = 7,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ        CMD_INDEX_READ        //!< 0\n#define NOR_CMD_INDEX_READSTATUS  CMD_INDEX_READSTATUS  //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE   5                     //!< 5\n#define NOR_CMD_INDEX_DUMMY       6                     //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK  7                     //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK  8 //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1024_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1024_evk/mimxrt1024_evk.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1024-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13 http://mcuxpresso.nxp.com/XSD/mex_configuration_13.xsd\" uuid=\"a558cc6e-82c2-41f9-9f55-0348efc7896f\" version=\"13\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1024xxxxx</processor>\n      <package>MIMXRT1024DAG5A</package>\n      <board>MIMXRT1024-EVK</board>\n      <board_revision>B1</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>false</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"13.1\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>13.0.2</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"52\" pin_signal=\"WAKEUP\" label=\"USER_BUTTON\" identifier=\"USER_BUTTON\"/>\n               <pin_label pin_num=\"82\" pin_signal=\"GPIO_AD_B1_08\" label=\"UART_TX/USER_LED/J17[4]\" identifier=\"USER_LED\"/>\n            </pin_labels>\n            <power_domains>\n               <power_domain name=\"NVCC_GPIO\" value=\"3.3\"/>\n            </power_domains>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO5\" description=\"Peripheral GPIO5 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO5\" signal=\"gpio_io, 00\" pin_num=\"52\" pin_signal=\"WAKEUP\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 24\" pin_num=\"82\" pin_signal=\"GPIO_AD_B1_08\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"RX\" pin_num=\"101\" pin_signal=\"GPIO_AD_B0_07\"/>\n                  <pin peripheral=\"LPUART1\" signal=\"TX\" pin_num=\"105\" pin_signal=\"GPIO_AD_B0_06\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSDRAMPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SEMC\" description=\"Peripheral SEMC is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 00\" pin_num=\"142\" pin_signal=\"GPIO_EMC_16\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 01\" pin_num=\"141\" pin_signal=\"GPIO_EMC_17\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 02\" pin_num=\"140\" pin_signal=\"GPIO_EMC_18\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 03\" pin_num=\"139\" pin_signal=\"GPIO_EMC_19\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 04\" pin_num=\"138\" pin_signal=\"GPIO_EMC_20\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 06\" pin_num=\"136\" pin_signal=\"GPIO_EMC_22\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 05\" pin_num=\"137\" pin_signal=\"GPIO_EMC_21\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 07\" pin_num=\"133\" pin_signal=\"GPIO_EMC_23\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 08\" pin_num=\"132\" pin_signal=\"GPIO_EMC_24\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 09\" pin_num=\"131\" pin_signal=\"GPIO_EMC_25\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 10\" pin_num=\"143\" pin_signal=\"GPIO_EMC_15\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 11\" pin_num=\"130\" pin_signal=\"GPIO_EMC_26\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 12\" pin_num=\"129\" pin_signal=\"GPIO_EMC_27\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 0\" pin_num=\"2\" pin_signal=\"GPIO_EMC_13\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 1\" pin_num=\"1\" pin_signal=\"GPIO_EMC_14\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cas\" pin_num=\"7\" pin_signal=\"GPIO_EMC_10\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cke\" pin_num=\"127\" pin_signal=\"GPIO_EMC_29\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_clk\" pin_num=\"126\" pin_signal=\"GPIO_EMC_30\"/>\n                  <pin peripheral=\"SEMC\" signal=\"CS, 0\" pin_num=\"3\" pin_signal=\"GPIO_EMC_12\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_we\" pin_num=\"8\" pin_signal=\"GPIO_EMC_09\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_ras\" pin_num=\"4\" pin_signal=\"GPIO_EMC_11\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_dqs\" pin_num=\"128\" pin_signal=\"GPIO_EMC_28\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 1\" pin_num=\"125\" pin_signal=\"GPIO_EMC_31\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 0\" pin_num=\"9\" pin_signal=\"GPIO_EMC_08\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 15\" pin_num=\"117\" pin_signal=\"GPIO_EMC_39\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 14\" pin_num=\"118\" pin_signal=\"GPIO_EMC_38\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 13\" pin_num=\"119\" pin_signal=\"GPIO_EMC_37\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 12\" pin_num=\"120\" pin_signal=\"GPIO_EMC_36\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 10\" pin_num=\"122\" pin_signal=\"GPIO_EMC_34\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 11\" pin_num=\"121\" pin_signal=\"GPIO_EMC_35\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 09\" pin_num=\"123\" pin_signal=\"GPIO_EMC_33\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 08\" pin_num=\"124\" pin_signal=\"GPIO_EMC_32\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 07\" pin_num=\"10\" pin_signal=\"GPIO_EMC_07\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 06\" pin_num=\"12\" pin_signal=\"GPIO_EMC_06\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 05\" pin_num=\"13\" pin_signal=\"GPIO_EMC_05\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 04\" pin_num=\"14\" pin_signal=\"GPIO_EMC_04\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 03\" pin_num=\"15\" pin_signal=\"GPIO_EMC_03\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 02\" pin_num=\"16\" pin_signal=\"GPIO_EMC_02\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 01\" pin_num=\"17\" pin_signal=\"GPIO_EMC_01\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 00\" pin_num=\"18\" pin_signal=\"GPIO_EMC_00\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitCANPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"CAN1\" description=\"Peripheral CAN1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"CAN1\" signal=\"RX\" pin_num=\"32\" pin_signal=\"GPIO_SD_B1_01\"/>\n                  <pin peripheral=\"CAN1\" signal=\"TX\" pin_num=\"33\" pin_signal=\"GPIO_SD_B1_00\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitENETPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"ENET\" description=\"Peripheral ENET is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_en\" pin_num=\"97\" pin_signal=\"GPIO_AD_B0_11\"/>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 22\" pin_num=\"84\" pin_signal=\"GPIO_AD_B1_06\"/>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 04\" pin_num=\"107\" pin_signal=\"GPIO_AD_B0_04\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_clk\" pin_num=\"100\" pin_signal=\"GPIO_AD_B0_08\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_en\" pin_num=\"95\" pin_signal=\"GPIO_AD_B0_13\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 1\" pin_num=\"93\" pin_signal=\"GPIO_AD_B0_15\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 0\" pin_num=\"94\" pin_signal=\"GPIO_AD_B0_14\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_er\" pin_num=\"96\" pin_signal=\"GPIO_AD_B0_12\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 1\" pin_num=\"99\" pin_signal=\"GPIO_AD_B0_09\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 0\" pin_num=\"98\" pin_signal=\"GPIO_AD_B0_10\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdio\" pin_num=\"116\" pin_signal=\"GPIO_EMC_40\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdc\" pin_num=\"115\" pin_signal=\"GPIO_EMC_41\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSDHCPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USDHC1\" description=\"Peripheral USDHC1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_clk\" pin_num=\"45\" pin_signal=\"GPIO_SD_B0_03\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_cmd\" pin_num=\"46\" pin_signal=\"GPIO_SD_B0_02\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 0\" pin_num=\"43\" pin_signal=\"GPIO_SD_B0_04\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 1\" pin_num=\"42\" pin_signal=\"GPIO_SD_B0_05\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 2\" pin_num=\"48\" pin_signal=\"GPIO_SD_B0_00\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 3\" pin_num=\"47\" pin_signal=\"GPIO_SD_B0_01\"/>\n                  <pin peripheral=\"GPIO3\" signal=\"gpio_io, 19\" pin_num=\"41\" pin_signal=\"GPIO_SD_B0_06\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitQSPIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXSPI\" description=\"Peripheral FLEXSPI is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SCLK\" pin_num=\"24\" pin_signal=\"GPIO_SD_B1_07\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA0\" pin_num=\"23\" pin_signal=\"GPIO_SD_B1_08\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA1\" pin_num=\"21\" pin_signal=\"GPIO_SD_B1_10\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA2\" pin_num=\"22\" pin_signal=\"GPIO_SD_B1_09\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA3\" pin_num=\"25\" pin_signal=\"GPIO_SD_B1_06\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SS0_B\" pin_num=\"19\" pin_signal=\"GPIO_SD_B1_11\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"11.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>13.0.2</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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"AHB_CLK_ROOT.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN_CLK_ROOT.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_500M_REF_CLK.outFreq\" value=\"500 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"125 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SEMC_CLK_ROOT.outFreq\" value=\"62.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY1_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC1_CLK_ROOT.outFreq\" value=\"176 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC2_CLK_ROOT.outFreq\" value=\"176 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.ARM_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_SEL.sel\" value=\"CCM_ANALOG.PLL2_PFD2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.IPG_PODF.scale\" value=\"4\" locked=\"false\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.PRE_PERIPH_CLK_SEL.sel\" value=\"CCM.ARM_PODF\" locked=\"false\"/>\n                  <setting id=\"CCM.SEMC_PODF.scale\" value=\"8\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.USDHC1_PODF.scale\" value=\"3\" locked=\"true\"/>\n                  <setting id=\"CCM.USDHC2_PODF.scale\" value=\"3\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"22\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_DIV.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.denom\" value=\"50\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.div\" value=\"47\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL6_BYPASS.sel\" value=\"CCM_ANALOG.PLL6\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_ENABLE_CFG\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_CFG\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>13.0.2</processor_version>\n            <output_format>c_array</output_format>\n         </dcdx_profile>\n         <dcdx_configurations>\n            <dcdx_configuration name=\"Device_configuration\">\n               <description></description>\n               <options/>\n               <command_groups/>\n            </dcdx_configuration>\n         </dcdx_configurations>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"6d394465-bc9b-47f2-9a1f-3ca61f76d27b\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"NVIC\" uuid=\"096e7e36-6917-481a-a4c5-06822cfc2da4\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"5dc935cc-5865-4d50-bac9-89ad440a12ee\" type_id=\"system_54b53072540eeeb8f8e9343e71f28176\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"c2fe99b8-bf9b-437f-9446-a35000b06679\" type_id=\"msg_6e2baaf3b97dbeef01c0043275f9a0e7\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"eca93ea1-cadf-4247-bfdc-08769ef8ed12\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"fdf82c69-a73f-4f32-9699-457260453bc6\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"af80d7a8-d163-4a6f-839d-0ce2b15abffd\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"dca6ee55-a78d-4884-99bd-4f821b552213\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"4c34638b-b184-4e9d-8a81-5f3a1287180a\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>N/A</processor_version>\n         </tee_profile>\n      </tee>\n      <common name=\"common\" version=\"1.0\" enabled=\"true\" update_project_code=\"true\">\n         <core name=\"core0\" role=\"primary\" project_name=\"Project\"/>\n      </common>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v11.0\nprocessor: MIMXRT1052xxxxB\npackage_id: MIMXRT1052DVL6B\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: IMXRT1050-EVKB\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: AHB_CLK_ROOT.outFreq, value: 600 MHz}\n- {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: CSI_CLK_ROOT.outFreq, value: 12 MHz}\n- {id: ENET_125M_CLK.outFreq, value: 2.4 MHz}\n- {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXIO2_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 160 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 150 MHz}\n- {id: LCDIF_CLK_ROOT.outFreq, value: 67.5 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: LVDS1_CLK.outFreq, value: 1.2 GHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: PLL7_MAIN_CLK.outFreq, value: 480 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SEMC_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY1_CLK.outFreq, value: 480 MHz}\n- {id: USBPHY2_CLK.outFreq, value: 480 MHz}\n- {id: USDHC1_CLK_ROOT.outFreq, value: 198 MHz}\n- {id: USDHC2_CLK_ROOT.outFreq, value: 198 MHz}\nsettings:\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.ARM_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI_PODF.scale, value: '3', locked: true}\n- {id: CCM.FLEXSPI_SEL.sel, value: CCM.PLL3_SW_CLK_SEL}\n- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.SEMC_PODF.scale, value: '8'}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM_ANALOG.PLL1_BYPASS.sel, value: CCM_ANALOG.PLL1}\n- {id: CCM_ANALOG.PLL1_PREDIV.scale, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL1_VDIV.scale, value: '50', locked: true}\n- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '33', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL4.denom, value: '50'}\n- {id: CCM_ANALOG.PLL4.div, value: '47'}\n- {id: CCM_ANALOG.PLL5.denom, value: '1'}\n- {id: CCM_ANALOG.PLL5.div, value: '40'}\n- {id: CCM_ANALOG.PLL5.num, value: '0'}\n- {id: CCM_ANALOG.PLL5_BYPASS.sel, value: CCM_ANALOG.PLL5_POST_DIV}\n- {id: CCM_ANALOG.PLL5_POST_DIV.scale, value: '2'}\n- {id: CCM_ANALOG.PLL7_BYPASS.sel, value: CCM_ANALOG.PLL7}\n- {id: CCM_ANALOG.VIDEO_DIV.scale, value: '4'}\n- {id: CCM_ANALOG_PLL_ENET_POWERDOWN_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG, value: 'No'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 100,                       /* PLL loop divider, Fout = Fin * 50 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 40,                        /* PLL loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .postDivider = 8,                         /* Divider after PLL */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */\n    /* Setting the VDD_SOC to 1.275V. It is necessary to config AHB to 600Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x13);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Adc2);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    CLOCK_DisableClock(kCLOCK_Xbar2);\n    CLOCK_DisableClock(kCLOCK_Xbar3);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Set ARM_PODF. */\n    CLOCK_SetDiv(kCLOCK_ArmDiv, 1);\n    /* Set PERIPH_CLK2_PODF. */\n    CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* Disable USDHC1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc1);\n    /* Set USDHC1_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1);\n    /* Set Usdhc1 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);\n    /* Disable USDHC2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc2);\n    /* Set USDHC2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1);\n    /* Set Usdhc2 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n    /* Disable Semc clock gate. */\n    CLOCK_DisableClock(kCLOCK_Semc);\n    /* Set SEMC_PODF. */\n    CLOCK_SetDiv(kCLOCK_SemcDiv, 7);\n    /* Set Semc alt clock source. */\n    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);\n    /* Set Semc clock source. */\n    CLOCK_SetMux(kCLOCK_SemcMux, 0);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 2);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 1);\n#endif\n    /* Disable CSI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Csi);\n    /* Set CSI_PODF. */\n    CLOCK_SetDiv(kCLOCK_CsiDiv, 1);\n    /* Set Csi clock source. */\n    CLOCK_SetMux(kCLOCK_CsiMux, 0);\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    CLOCK_DisableClock(kCLOCK_Lpspi3);\n    CLOCK_DisableClock(kCLOCK_Lpspi4);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai2);\n    /* Set SAI2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);\n    /* Set SAI2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai2Div, 1);\n    /* Set Sai2 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai2Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    CLOCK_DisableClock(kCLOCK_Lpi2c3);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable CAN clock gate. */\n    CLOCK_DisableClock(kCLOCK_Can1);\n    CLOCK_DisableClock(kCLOCK_Can2);\n    CLOCK_DisableClock(kCLOCK_Can1S);\n    CLOCK_DisableClock(kCLOCK_Can2S);\n    /* Set CAN_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_CanDiv, 1);\n    /* Set Can clock source. */\n    CLOCK_SetMux(kCLOCK_CanMux, 2);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    CLOCK_DisableClock(kCLOCK_Lpuart5);\n    CLOCK_DisableClock(kCLOCK_Lpuart6);\n    CLOCK_DisableClock(kCLOCK_Lpuart7);\n    CLOCK_DisableClock(kCLOCK_Lpuart8);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable LCDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_LcdPixel);\n    /* Set LCDIF_PRED. */\n    CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1);\n    /* Set LCDIF_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_LcdifDiv, 3);\n    /* Set Lcdif pre clock source. */\n    CLOCK_SetMux(kCLOCK_LcdifPreMux, 5);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* Disable Flexio2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio2);\n    /* Set FLEXIO2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1);\n    /* Set FLEXIO2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio2Div, 7);\n    /* Set Flexio2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio2Mux, 3);\n    /* Set Pll3 sw clock source. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* Init ARM PLL. */\n    CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n    #warning \"SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged.\"\n#endif\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 24);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 16);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 33);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 19);\n#endif\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Init Video PLL. */\n    uint32_t pllVideo;\n    /* Disable Video PLL output before initial Video PLL. */\n    CCM_ANALOG->PLL_VIDEO &= ~CCM_ANALOG_PLL_VIDEO_ENABLE_MASK;\n    /* Bypass PLL first */\n    CCM_ANALOG->PLL_VIDEO = (CCM_ANALOG->PLL_VIDEO & (~CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_MASK)) |\n                            CCM_ANALOG_PLL_VIDEO_BYPASS_MASK | CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC(0);\n    CCM_ANALOG->PLL_VIDEO_NUM = CCM_ANALOG_PLL_VIDEO_NUM_A(0);\n    CCM_ANALOG->PLL_VIDEO_DENOM = CCM_ANALOG_PLL_VIDEO_DENOM_B(1);\n    pllVideo = (CCM_ANALOG->PLL_VIDEO & (~(CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK | CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK))) |\n               CCM_ANALOG_PLL_VIDEO_ENABLE_MASK |CCM_ANALOG_PLL_VIDEO_DIV_SELECT(40);\n    pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1);\n    CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(3);\n    CCM_ANALOG->PLL_VIDEO = pllVideo;\n    while ((CCM_ANALOG->PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_LOCK_MASK) == 0)\n    {\n    }\n    /* Disable bypass for Video PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllVideo, 0);\n    /* DeInit Enet PLL. */\n    CLOCK_DeinitEnetPll();\n    /* Bypass Enet PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1);\n    /* Set Enet output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_DIV_SELECT(1);\n    /* Enable Enet output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENABLE_MASK;\n    /* Enable Enet25M output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK;\n    /* Init Usb2 PLL. */\n    CLOCK_InitUsb2Pll(&usb2PllConfig_BOARD_BootClockRUN);\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Set lvds1 clock source. */\n    CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set ENET Ref clock source. */\n#if defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK)\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK;\n#elif defined(IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK)\n    /* Backward compatibility for original bitfield name */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK;\n#else\n#error \"Neither IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK nor IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK is defined.\"\n#endif /* defined(IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK) */\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             600000000U  /*!< Core clock frequency: 600000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT               600000000UL\n#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT               40000000UL\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL\n#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT               12000000UL\n#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK              2400000UL\n#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK           1200000UL\n#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK                0UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           160000000UL\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      75000000UL\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      75000000UL\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               150000000UL\n#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT             67500000UL\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL\n#define BOARD_BOOTCLOCKRUN_LVDS1_CLK                  1200000000UL\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            75000000UL\n#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK              480000000UL\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT              75000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT            198000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT            198000000UL\n\n/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Usb2 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Video PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v13.1\nprocessor: MIMXRT1052xxxxB\npackage_id: MIMXRT1052DVL6B\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: IMXRT1050-EVKB\npin_labels:\n- {pin_num: F14, pin_signal: GPIO_AD_B0_09, label: 'JTAG_TDI/J21[5]/ENET_RST/J22[5]', identifier: USER_LED}\n- {pin_num: L6, pin_signal: WAKEUP, label: SD_PWREN, identifier: USER_BUTTON}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: F14, peripheral: GPIO1, signal: 'gpio_io, 09', pin_signal: GPIO_AD_B0_09, direction: OUTPUT, pull_keeper_select: Keeper}\n  - {pin_num: L6, peripheral: GPIO5, signal: 'gpio_io, 00', pin_signal: WAKEUP, direction: INPUT, pull_up_down_config: Pull_Up_100K_Ohm}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n  CLOCK_EnableClock(kCLOCK_IomuxcSnvs);\n\n  /* GPIO configuration of USER_LED on GPIO_AD_B0_09 (pin F14) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_AD_B0_09 (pin F14) */\n  GPIO_PinInit(GPIO1, 9U, &USER_LED_config);\n\n  /* GPIO configuration of USER_BUTTON on WAKEUP (pin L6) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on WAKEUP (pin L6) */\n  GPIO_PinInit(GPIO5, 0U, &USER_BUTTON_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_SNVS_WAKEUP_GPIO5_IO00, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0x50A0U);\n  IOMUXC_SetPinConfig(IOMUXC_SNVS_WAKEUP_GPIO5_IO00, 0x01B0A0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: K14, peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_12, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: L14, peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_13, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TXD, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RXD, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TXD, 0x10B0U);\n#else\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0x10B0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RXD, 0x10B0U);\n#else\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0x10B0U);\n#endif\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSDRAMPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: C2, peripheral: SEMC, signal: 'ADDR, 00', pin_signal: GPIO_EMC_09}\n  - {pin_num: G1, peripheral: SEMC, signal: 'ADDR, 01', pin_signal: GPIO_EMC_10}\n  - {pin_num: G3, peripheral: SEMC, signal: 'ADDR, 02', pin_signal: GPIO_EMC_11}\n  - {pin_num: H1, peripheral: SEMC, signal: 'ADDR, 03', pin_signal: GPIO_EMC_12}\n  - {pin_num: A6, peripheral: SEMC, signal: 'ADDR, 04', pin_signal: GPIO_EMC_13}\n  - {pin_num: B6, peripheral: SEMC, signal: 'ADDR, 05', pin_signal: GPIO_EMC_14}\n  - {pin_num: B1, peripheral: SEMC, signal: 'ADDR, 06', pin_signal: GPIO_EMC_15}\n  - {pin_num: A5, peripheral: SEMC, signal: 'ADDR, 07', pin_signal: GPIO_EMC_16}\n  - {pin_num: A4, peripheral: SEMC, signal: 'ADDR, 08', pin_signal: GPIO_EMC_17}\n  - {pin_num: B2, peripheral: SEMC, signal: 'ADDR, 09', pin_signal: GPIO_EMC_18}\n  - {pin_num: G2, peripheral: SEMC, signal: 'ADDR, 10', pin_signal: GPIO_EMC_23}\n  - {pin_num: B4, peripheral: SEMC, signal: 'ADDR, 11', pin_signal: GPIO_EMC_19}\n  - {pin_num: A3, peripheral: SEMC, signal: 'ADDR, 12', pin_signal: GPIO_EMC_20}\n  - {pin_num: C1, peripheral: SEMC, signal: 'BA, 0', pin_signal: GPIO_EMC_21}\n  - {pin_num: F1, peripheral: SEMC, signal: 'BA, 1', pin_signal: GPIO_EMC_22}\n  - {pin_num: D3, peripheral: SEMC, signal: semc_cas, pin_signal: GPIO_EMC_24}\n  - {pin_num: A2, peripheral: SEMC, signal: semc_cke, pin_signal: GPIO_EMC_27}\n  - {pin_num: B3, peripheral: SEMC, signal: semc_clk, pin_signal: GPIO_EMC_26}\n  - {pin_num: E3, peripheral: SEMC, signal: 'DATA, 00', pin_signal: GPIO_EMC_00}\n  - {pin_num: F3, peripheral: SEMC, signal: 'DATA, 01', pin_signal: GPIO_EMC_01}\n  - {pin_num: F4, peripheral: SEMC, signal: 'DATA, 02', pin_signal: GPIO_EMC_02}\n  - {pin_num: G4, peripheral: SEMC, signal: 'DATA, 03', pin_signal: GPIO_EMC_03}\n  - {pin_num: F2, peripheral: SEMC, signal: 'DATA, 04', pin_signal: GPIO_EMC_04}\n  - {pin_num: G5, peripheral: SEMC, signal: 'DATA, 05', pin_signal: GPIO_EMC_05}\n  - {pin_num: H5, peripheral: SEMC, signal: 'DATA, 06', pin_signal: GPIO_EMC_06}\n  - {pin_num: H4, peripheral: SEMC, signal: 'DATA, 07', pin_signal: GPIO_EMC_07}\n  - {pin_num: C6, peripheral: SEMC, signal: 'DATA, 08', pin_signal: GPIO_EMC_30}\n  - {pin_num: C5, peripheral: SEMC, signal: 'DATA, 09', pin_signal: GPIO_EMC_31}\n  - {pin_num: D5, peripheral: SEMC, signal: 'DATA, 10', pin_signal: GPIO_EMC_32}\n  - {pin_num: C4, peripheral: SEMC, signal: 'DATA, 11', pin_signal: GPIO_EMC_33}\n  - {pin_num: D4, peripheral: SEMC, signal: 'DATA, 12', pin_signal: GPIO_EMC_34}\n  - {pin_num: E5, peripheral: SEMC, signal: 'DATA, 13', pin_signal: GPIO_EMC_35}\n  - {pin_num: C3, peripheral: SEMC, signal: 'DATA, 14', pin_signal: GPIO_EMC_36}\n  - {pin_num: E4, peripheral: SEMC, signal: 'DATA, 15', pin_signal: GPIO_EMC_37}\n  - {pin_num: H3, peripheral: SEMC, signal: 'DM, 0', pin_signal: GPIO_EMC_08}\n  - {pin_num: D6, peripheral: SEMC, signal: 'DM, 1', pin_signal: GPIO_EMC_38}\n  - {pin_num: D2, peripheral: SEMC, signal: semc_ras, pin_signal: GPIO_EMC_25}\n  - {pin_num: D1, peripheral: SEMC, signal: semc_we, pin_signal: GPIO_EMC_28}\n  - {pin_num: C7, peripheral: SEMC, signal: 'CSX, 0', pin_signal: GPIO_EMC_41}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSDRAMPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitSDRAMPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DA00, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DA01, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DA02, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DA03, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DA04, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DATA04, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DA05, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DATA05, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DA06, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DATA06, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DA07, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DATA07, 0U);\n#endif\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_08_SEMC_DM00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_SEMC_ADDR00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_10_SEMC_ADDR01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_11_SEMC_ADDR02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_12_SEMC_ADDR03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_13_SEMC_ADDR04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_14_SEMC_ADDR05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_15_SEMC_ADDR06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_16_SEMC_ADDR07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_17_SEMC_ADDR08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_18_SEMC_ADDR09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_19_SEMC_ADDR11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_20_SEMC_ADDR12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_21_SEMC_BA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_22_SEMC_BA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_23_SEMC_ADDR10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_24_SEMC_CAS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_25_SEMC_RAS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_26_SEMC_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_27_SEMC_CKE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_28_SEMC_WE, 0U);\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DA08, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DATA08, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DA09, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DATA09, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DA10, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DATA10, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DA11, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DATA11, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DA12, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DATA12, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DA13, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DATA13, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DA14, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DATA14, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DA15, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DATA15, 0U);\n#endif\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_38_SEMC_DM01, 0U);\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_41_SEMC_CSX0, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_41_SEMC_CSX00, 0U);\n#endif\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitCSIPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: H13, peripheral: CSI, signal: 'csi_data, 09', pin_signal: GPIO_AD_B1_08}\n  - {pin_num: M13, peripheral: CSI, signal: 'csi_data, 08', pin_signal: GPIO_AD_B1_09}\n  - {pin_num: L13, peripheral: CSI, signal: 'csi_data, 07', pin_signal: GPIO_AD_B1_10}\n  - {pin_num: J13, peripheral: CSI, signal: 'csi_data, 06', pin_signal: GPIO_AD_B1_11}\n  - {pin_num: H12, peripheral: CSI, signal: 'csi_data, 05', pin_signal: GPIO_AD_B1_12}\n  - {pin_num: H11, peripheral: CSI, signal: 'csi_data, 04', pin_signal: GPIO_AD_B1_13}\n  - {pin_num: J14, peripheral: CSI, signal: 'csi_data, 02', pin_signal: GPIO_AD_B1_15}\n  - {pin_num: G12, peripheral: CSI, signal: 'csi_data, 03', pin_signal: GPIO_AD_B1_14}\n  - {pin_num: L12, peripheral: CSI, signal: csi_pixclk, pin_signal: GPIO_AD_B1_04}\n  - {pin_num: K12, peripheral: CSI, signal: csi_mclk, pin_signal: GPIO_AD_B1_05}\n  - {pin_num: J12, peripheral: CSI, signal: csi_vsync, pin_signal: GPIO_AD_B1_06}\n  - {pin_num: K10, peripheral: CSI, signal: csi_hsync, pin_signal: GPIO_AD_B1_07}\n  - {pin_num: J11, peripheral: LPI2C1, signal: SCL, pin_signal: GPIO_AD_B1_00, identifier: CSI_I2C_SCL, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Up_22K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Enable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: K11, peripheral: LPI2C1, signal: SDA, pin_signal: GPIO_AD_B1_01, identifier: CSI_I2C_SDA, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Up_22K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Enable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: F11, peripheral: GPIO1, signal: 'gpio_io, 04', pin_signal: GPIO_AD_B0_04}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitCSIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitCSIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_04_GPIO1_IO04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_04_CSI_PIXCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_05_CSI_MCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_06_CSI_VSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_07_CSI_HSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_08_CSI_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_09_CSI_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_10_CSI_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_11_CSI_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_12_CSI_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_13_CSI_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_14_CSI_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_15_CSI_DATA02, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 0xD8B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA, 0xD8B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLCDPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: C8, peripheral: LCDIF, signal: 'lcdif_data, 00', pin_signal: GPIO_B0_04, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B8, peripheral: LCDIF, signal: 'lcdif_data, 01', pin_signal: GPIO_B0_05, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A8, peripheral: LCDIF, signal: 'lcdif_data, 02', pin_signal: GPIO_B0_06, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D7, peripheral: LCDIF, signal: lcdif_clk, pin_signal: GPIO_B0_00, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A9, peripheral: LCDIF, signal: 'lcdif_data, 03', pin_signal: GPIO_B0_07, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B9, peripheral: LCDIF, signal: 'lcdif_data, 04', pin_signal: GPIO_B0_08, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C9, peripheral: LCDIF, signal: 'lcdif_data, 05', pin_signal: GPIO_B0_09, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D9, peripheral: LCDIF, signal: 'lcdif_data, 06', pin_signal: GPIO_B0_10, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A10, peripheral: LCDIF, signal: 'lcdif_data, 07', pin_signal: GPIO_B0_11, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C10, peripheral: LCDIF, signal: 'lcdif_data, 08', pin_signal: GPIO_B0_12, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D10, peripheral: LCDIF, signal: 'lcdif_data, 09', pin_signal: GPIO_B0_13, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E10, peripheral: LCDIF, signal: 'lcdif_data, 10', pin_signal: GPIO_B0_14, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E11, peripheral: LCDIF, signal: 'lcdif_data, 11', pin_signal: GPIO_B0_15, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A11, peripheral: LCDIF, signal: 'lcdif_data, 12', pin_signal: GPIO_B1_00, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B11, peripheral: LCDIF, signal: 'lcdif_data, 13', pin_signal: GPIO_B1_01, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C11, peripheral: LCDIF, signal: 'lcdif_data, 14', pin_signal: GPIO_B1_02, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D11, peripheral: LCDIF, signal: 'lcdif_data, 15', pin_signal: GPIO_B1_03, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E7, peripheral: LCDIF, signal: lcdif_enable, pin_signal: GPIO_B0_01, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E8, peripheral: LCDIF, signal: lcdif_hsync, pin_signal: GPIO_B0_02, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D8, peripheral: LCDIF, signal: lcdif_vsync, pin_signal: GPIO_B0_03, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B14, peripheral: GPIO2, signal: 'gpio_io, 31', pin_signal: GPIO_B1_15, slew_rate: Slow}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLCDPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitLCDPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_00_LCD_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_04_LCD_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_05_LCD_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_06_LCD_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_07_LCD_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_08_LCD_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_09_LCD_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_10_LCD_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_11_LCD_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_12_LCD_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_13_LCD_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_14_LCD_DATA10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_15_LCD_DATA11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_00_LCD_DATA12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_01_LCD_DATA13, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_02_LCD_DATA14, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_03_LCD_DATA15, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_15_GPIO2_IO31, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_00_LCD_CLK, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_04_LCD_DATA00, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_05_LCD_DATA01, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_06_LCD_DATA02, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_07_LCD_DATA03, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_08_LCD_DATA04, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_09_LCD_DATA05, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_10_LCD_DATA06, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_11_LCD_DATA07, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_12_LCD_DATA08, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_13_LCD_DATA09, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_14_LCD_DATA10, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_15_LCD_DATA11, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_00_LCD_DATA12, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_01_LCD_DATA13, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_02_LCD_DATA14, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_03_LCD_DATA15, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_15_GPIO2_IO31, 0x10B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitCANPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: H14, peripheral: CAN2, signal: TX, pin_signal: GPIO_AD_B0_14}\n  - {pin_num: L10, peripheral: CAN2, signal: RX, pin_signal: GPIO_AD_B0_15}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitCANPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitCANPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_14_FLEXCAN2_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_15_FLEXCAN2_RX, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitENETPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: A7, peripheral: ENET, signal: enet_mdc, pin_signal: GPIO_EMC_40}\n  - {pin_num: C7, peripheral: ENET, signal: enet_mdio, pin_signal: GPIO_EMC_41}\n  - {pin_num: B13, peripheral: ENET, signal: enet_ref_clk, pin_signal: GPIO_B1_10}\n  - {pin_num: E12, peripheral: ENET, signal: 'enet_rx_data, 0', pin_signal: GPIO_B1_04}\n  - {pin_num: D12, peripheral: ENET, signal: 'enet_rx_data, 1', pin_signal: GPIO_B1_05}\n  - {pin_num: C12, peripheral: ENET, signal: enet_rx_en, pin_signal: GPIO_B1_06}\n  - {pin_num: C13, peripheral: ENET, signal: enet_rx_er, pin_signal: GPIO_B1_11}\n  - {pin_num: B12, peripheral: ENET, signal: 'enet_tx_data, 0', pin_signal: GPIO_B1_07}\n  - {pin_num: A12, peripheral: ENET, signal: 'enet_tx_data, 1', pin_signal: GPIO_B1_08}\n  - {pin_num: A13, peripheral: ENET, signal: enet_tx_en, pin_signal: GPIO_B1_09}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitENETPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitENETPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_04_ENET_RX_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_05_ENET_RX_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_06_ENET_RX_EN, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_07_ENET_TX_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_08_ENET_TX_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_09_ENET_TX_EN, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_10_ENET_REF_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_11_ENET_RX_ER, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_40_ENET_MDC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_41_ENET_MDIO, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSDHCPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: J2, peripheral: USDHC1, signal: 'usdhc_data, 3', pin_signal: GPIO_SD_B0_05}\n  - {pin_num: H2, peripheral: USDHC1, signal: 'usdhc_data, 2', pin_signal: GPIO_SD_B0_04}\n  - {pin_num: K1, peripheral: USDHC1, signal: 'usdhc_data, 1', pin_signal: GPIO_SD_B0_03}\n  - {pin_num: J1, peripheral: USDHC1, signal: 'usdhc_data, 0', pin_signal: GPIO_SD_B0_02}\n  - {pin_num: J4, peripheral: USDHC1, signal: usdhc_cmd, pin_signal: GPIO_SD_B0_00}\n  - {pin_num: J3, peripheral: USDHC1, signal: usdhc_clk, pin_signal: GPIO_SD_B0_01}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSDHCPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitUSDHCPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitHyperFlashPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: L4, peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07}\n  - {pin_num: P4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_10}\n  - {pin_num: P3, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08}\n  - {pin_num: N4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_09}\n  - {pin_num: L5, peripheral: FLEXSPI, signal: FLEXSPI_B_DATA3, pin_signal: GPIO_SD_B1_00}\n  - {pin_num: M5, peripheral: FLEXSPI, signal: FLEXSPI_B_DATA2, pin_signal: GPIO_SD_B1_01}\n  - {pin_num: M3, peripheral: FLEXSPI, signal: FLEXSPI_B_DATA1, pin_signal: GPIO_SD_B1_02}\n  - {pin_num: M4, peripheral: FLEXSPI, signal: FLEXSPI_B_DATA0, pin_signal: GPIO_SD_B1_03}\n  - {pin_num: P2, peripheral: FLEXSPI, signal: FLEXSPI_B_SCLK, pin_signal: GPIO_SD_B1_04}\n  - {pin_num: L3, peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_06}\n  - {pin_num: P5, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_11}\n  - {pin_num: N3, peripheral: FLEXSPI, signal: FLEXSPI_A_DQS, pin_signal: GPIO_SD_B1_05}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitHyperFlashPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitHyperFlashPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_00_FLEXSPI_B_DATA3, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_00_FLEXSPIB_DATA03, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_01_FLEXSPI_B_DATA2, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_01_FLEXSPIB_DATA02, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_02_FLEXSPI_B_DATA1, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_02_FLEXSPIB_DATA01, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_03_FLEXSPI_B_DATA0, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_03_FLEXSPIB_DATA00, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_04_FLEXSPI_B_SCLK, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_04_FLEXSPIB_SCLK, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_05_FLEXSPI_A_DQS, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_05_FLEXSPIA_DQS, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPI_A_SS0_B, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPI_A_SCLK, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPI_A_DATA00, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPI_A_DATA1, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPI_A_DATA2, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02, 0U);\n#endif\n#if FSL_IOMUXC_DRIVER_VERSION >= MAKE_VERSION(2, 0, 3)\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPI_A_DATA3, 0U);\n#else\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03, 0U);\n#endif\n}\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/* GPIO_AD_B0_09 (coord F14), JTAG_TDI/J21[5]/ENET_RST/J22[5] */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO1   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                   gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                       9U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN                                      9U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN_MASK                         (1U << 9U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_LED_PORT                                       GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_PIN                                           9U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_LED_PIN_MASK                              (1U << 9U)   /*!< PORT pin mask */\n\n/* WAKEUP (coord L6), SD_PWREN */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO5   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    0U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO5   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   0U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 0U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO5   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        0U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_BUTTON_PIN_MASK                           (1U << 0U)   /*!< PORT pin mask */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/* GPIO_AD_B0_12 (coord K14), UART1_TXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_SIGNAL                             TX   /*!< Signal name */\n\n/* GPIO_AD_B0_13 (coord L14), UART1_RXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_SIGNAL                             RX   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n/* GPIO_EMC_09 (coord C2), SEMC_A0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A0_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A0_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A0_CHANNEL                                   0U   /*!< Signal channel */\n\n/* GPIO_EMC_10 (coord G1), SEMC_A1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A1_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A1_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A1_CHANNEL                                   1U   /*!< Signal channel */\n\n/* GPIO_EMC_11 (coord G3), SEMC_A2 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A2_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A2_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A2_CHANNEL                                   2U   /*!< Signal channel */\n\n/* GPIO_EMC_12 (coord H1), SEMC_A3 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A3_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A3_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A3_CHANNEL                                   3U   /*!< Signal channel */\n\n/* GPIO_EMC_13 (coord A6), SEMC_A4 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A4_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A4_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A4_CHANNEL                                   4U   /*!< Signal channel */\n\n/* GPIO_EMC_14 (coord B6), SEMC_A5 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A5_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A5_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A5_CHANNEL                                   5U   /*!< Signal channel */\n\n/* GPIO_EMC_15 (coord B1), SEMC_A6 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A6_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A6_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A6_CHANNEL                                   6U   /*!< Signal channel */\n\n/* GPIO_EMC_16 (coord A5), SEMC_A7 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A7_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A7_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A7_CHANNEL                                   7U   /*!< Signal channel */\n\n/* GPIO_EMC_17 (coord A4), SEMC_A8 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A8_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A8_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A8_CHANNEL                                   8U   /*!< Signal channel */\n\n/* GPIO_EMC_18 (coord B2), SEMC_A9 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A9_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A9_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A9_CHANNEL                                   9U   /*!< Signal channel */\n\n/* GPIO_EMC_23 (coord G2), SEMC_A10 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A10_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A10_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A10_CHANNEL                                 10U   /*!< Signal channel */\n\n/* GPIO_EMC_19 (coord B4), SEMC_A11 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A11_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A11_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A11_CHANNEL                                 11U   /*!< Signal channel */\n\n/* GPIO_EMC_20 (coord A3), SEMC_A12 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A12_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A12_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A12_CHANNEL                                 12U   /*!< Signal channel */\n\n/* GPIO_EMC_21 (coord C1), SEMC_BA0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_SIGNAL                                   BA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_22 (coord F1), SEMC_BA1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_SIGNAL                                   BA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_EMC_24 (coord D3), SEMC_CAS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_SIGNAL                             semc_cas   /*!< Signal name */\n\n/* GPIO_EMC_27 (coord A2), SEMC_CKE */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_SIGNAL                             semc_cke   /*!< Signal name */\n\n/* GPIO_EMC_26 (coord B3), SEMC_CLK */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_SIGNAL                             semc_clk   /*!< Signal name */\n\n/* GPIO_EMC_00 (coord E3), SEMC_D0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D0_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D0_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D0_CHANNEL                                   0U   /*!< Signal channel */\n\n/* GPIO_EMC_01 (coord F3), SEMC_D1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D1_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D1_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D1_CHANNEL                                   1U   /*!< Signal channel */\n\n/* GPIO_EMC_02 (coord F4), SEMC_D2 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D2_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D2_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D2_CHANNEL                                   2U   /*!< Signal channel */\n\n/* GPIO_EMC_03 (coord G4), SEMC_D3 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D3_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D3_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D3_CHANNEL                                   3U   /*!< Signal channel */\n\n/* GPIO_EMC_04 (coord F2), SEMC_D4 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D4_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D4_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D4_CHANNEL                                   4U   /*!< Signal channel */\n\n/* GPIO_EMC_05 (coord G5), SEMC_D5 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D5_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D5_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D5_CHANNEL                                   5U   /*!< Signal channel */\n\n/* GPIO_EMC_06 (coord H5), SEMC_D6 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D6_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D6_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D6_CHANNEL                                   6U   /*!< Signal channel */\n\n/* GPIO_EMC_07 (coord H4), SEMC_D7 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D7_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D7_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D7_CHANNEL                                   7U   /*!< Signal channel */\n\n/* GPIO_EMC_30 (coord C6), SEMC_D8 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D8_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D8_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D8_CHANNEL                                   8U   /*!< Signal channel */\n\n/* GPIO_EMC_31 (coord C5), SEMC_D9 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D9_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D9_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D9_CHANNEL                                   9U   /*!< Signal channel */\n\n/* GPIO_EMC_32 (coord D5), SEMC_D10 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D10_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D10_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D10_CHANNEL                                 10U   /*!< Signal channel */\n\n/* GPIO_EMC_33 (coord C4), SEMC_D11 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D11_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D11_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D11_CHANNEL                                 11U   /*!< Signal channel */\n\n/* GPIO_EMC_34 (coord D4), SEMC_D12 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D12_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D12_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D12_CHANNEL                                 12U   /*!< Signal channel */\n\n/* GPIO_EMC_35 (coord E5), SEMC_D13 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D13_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D13_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D13_CHANNEL                                 13U   /*!< Signal channel */\n\n/* GPIO_EMC_36 (coord C3), SEMC_D14 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D14_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D14_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D14_CHANNEL                                 14U   /*!< Signal channel */\n\n/* GPIO_EMC_37 (coord E4), SEMC_D15 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D15_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D15_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D15_CHANNEL                                 15U   /*!< Signal channel */\n\n/* GPIO_EMC_08 (coord H3), SEMC_DM0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_SIGNAL                                   DM   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_38 (coord D6), SEMC_DM1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_SIGNAL                                   DM   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_EMC_25 (coord D2), SEMC_RAS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_SIGNAL                             semc_ras   /*!< Signal name */\n\n/* GPIO_EMC_28 (coord D1), SEMC_WE */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_WE_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_WE_SIGNAL                               semc_we   /*!< Signal name */\n\n/* GPIO_EMC_41 (coord C7), ENET_MDIO */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_ENET_MDIO_PERIPHERAL                            SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_ENET_MDIO_SIGNAL                                 CSX   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_ENET_MDIO_CHANNEL                                 0U   /*!< Signal channel */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSDRAMPins(void);\n\n/* GPIO_AD_B1_08 (coord H13), AUD_INT/CSI_D9//J35[13]/J22[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D9_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D9_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D9_CHANNEL                                      9U   /*!< Signal channel */\n\n/* GPIO_AD_B1_09 (coord M13), SAI1_MCLK/CSI_D8/J35[11] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D8_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D8_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D8_CHANNEL                                      8U   /*!< Signal channel */\n\n/* GPIO_AD_B1_10 (coord L13), SAI1_RX_SYNC/CSI_D7/J35[9]/J23[1] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D7_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D7_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D7_CHANNEL                                      7U   /*!< Signal channel */\n\n/* GPIO_AD_B1_11 (coord J13), SAI1_RX_BCLK/CSI_D6/J35[7]/J23[2] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D6_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D6_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D6_CHANNEL                                      6U   /*!< Signal channel */\n\n/* GPIO_AD_B1_12 (coord H12), SAI1_RXD/CSI_D5/J35[5]/U13[16] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D5_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D5_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D5_CHANNEL                                      5U   /*!< Signal channel */\n\n/* GPIO_AD_B1_13 (coord H11), SAI1_TXD/CSI_D4/J35[3]/U13[14] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D4_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D4_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D4_CHANNEL                                      4U   /*!< Signal channel */\n\n/* GPIO_AD_B1_15 (coord J14), SAI1_TX_SYNC/CSI_D2/J35[6]/U13[13] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D2_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D2_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D2_CHANNEL                                      2U   /*!< Signal channel */\n\n/* GPIO_AD_B1_14 (coord G12), SAI1_TX_BCLK/CSI_D3/J35[4]/U13[12] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D3_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D3_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D3_CHANNEL                                      3U   /*!< Signal channel */\n\n/* GPIO_AD_B1_04 (coord L12), CSI_PIXCLK/J35[8]/J23[3] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_PIXCLK_PERIPHERAL                              CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_PIXCLK_SIGNAL                           csi_pixclk   /*!< Signal name */\n\n/* GPIO_AD_B1_05 (coord K12), CSI_MCLK/J35[12]/J23[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_MCLK_PERIPHERAL                                CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_MCLK_SIGNAL                               csi_mclk   /*!< Signal name */\n\n/* GPIO_AD_B1_06 (coord J12), CSI_VSYNC/J35[18]/J22[2]/UART_TX */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_VSYNC_PERIPHERAL                               CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_VSYNC_SIGNAL                             csi_vsync   /*!< Signal name */\n\n/* GPIO_AD_B1_07 (coord K10), CSI_HSYNC/J35[16]/J22[1]/UART_RX */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_HSYNC_PERIPHERAL                               CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_HSYNC_SIGNAL                             csi_hsync   /*!< Signal name */\n\n/* GPIO_AD_B1_00 (coord J11), I2C1_SCL/CSI_I2C_SCL/J35[20]/J23[6]/U13[17]/U32[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_I2C_SCL_PERIPHERAL                          LPI2C1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_I2C_SCL_SIGNAL                                 SCL   /*!< Signal name */\n\n/* GPIO_AD_B1_01 (coord K11), I2C1_SDA/CSI_I2C_SDA/J35[22]/J23[5]/U13[18]/U32[6] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_I2C_SDA_PERIPHERAL                          LPI2C1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_I2C_SDA_SIGNAL                                 SDA   /*!< Signal name */\n\n/* GPIO_AD_B0_04 (coord F11), CSI_PWDN/J35[17]/BOOT_MODE[0] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_PWDN_PERIPHERAL                              GPIO1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_PWDN_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_PWDN_CHANNEL                                    4U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO                                    GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO_PIN                                   4U   /*!< GPIO pin number */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO_PIN_MASK                      (1U << 4U)   /*!< GPIO pin mask */\n#define BOARD_INITCSIPINS_CSI_PWDN_PORT                                    GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITCSIPINS_CSI_PWDN_PIN                                        4U   /*!< PORT pin number */\n#define BOARD_INITCSIPINS_CSI_PWDN_PIN_MASK                           (1U << 4U)   /*!< PORT pin mask */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitCSIPins(void);\n\n/* GPIO_B0_04 (coord C8), LCDIF_D0/BT_CFG[0] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D0_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D0_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_B0_05 (coord B8), LCDIF_D1/BT_CFG[1] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D1_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D1_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_B0_06 (coord A8), LCDIF_D2/BT_CFG[2] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D2_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D2_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_B0_00 (coord D7), LCDIF_CLK */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_CLK_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_CLK_SIGNAL                             lcdif_clk   /*!< Signal name */\n\n/* GPIO_B0_07 (coord A9), LCDIF_D3/BT_CFG[3] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D3_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D3_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_B0_08 (coord B9), LCDIF_D4/BT_CFG[4] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D4_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D4_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D4_CHANNEL                                    4U   /*!< Signal channel */\n\n/* GPIO_B0_09 (coord C9), LCDIF_D5/BT_CFG[5] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D5_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D5_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D5_CHANNEL                                    5U   /*!< Signal channel */\n\n/* GPIO_B0_10 (coord D9), LCDIF_D6/BT_CFG[6] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D6_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D6_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D6_CHANNEL                                    6U   /*!< Signal channel */\n\n/* GPIO_B0_11 (coord A10), LCDIF_D7/BT_CFG[7] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D7_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D7_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D7_CHANNEL                                    7U   /*!< Signal channel */\n\n/* GPIO_B0_12 (coord C10), LCDIF_D8/BT_CFG[8] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D8_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D8_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D8_CHANNEL                                    8U   /*!< Signal channel */\n\n/* GPIO_B0_13 (coord D10), LCDIF_D9/BT_CFG[9] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D9_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D9_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D9_CHANNEL                                    9U   /*!< Signal channel */\n\n/* GPIO_B0_14 (coord E10), LCDIF_D10/BT_CFG[10] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D10_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D10_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D10_CHANNEL                                  10U   /*!< Signal channel */\n\n/* GPIO_B0_15 (coord E11), LCDIF_D11/BT_CFG[11] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D11_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D11_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D11_CHANNEL                                  11U   /*!< Signal channel */\n\n/* GPIO_B1_00 (coord A11), LCDIF_D12 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D12_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D12_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D12_CHANNEL                                  12U   /*!< Signal channel */\n\n/* GPIO_B1_01 (coord B11), LCDIF_D13 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D13_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D13_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D13_CHANNEL                                  13U   /*!< Signal channel */\n\n/* GPIO_B1_02 (coord C11), LCDIF_D14 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D14_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D14_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D14_CHANNEL                                  14U   /*!< Signal channel */\n\n/* GPIO_B1_03 (coord D11), LCDIF_D15 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D15_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D15_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D15_CHANNEL                                  15U   /*!< Signal channel */\n\n/* GPIO_B0_01 (coord E7), LCDIF_ENABLE */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_ENABLE_PERIPHERAL                          LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_ENABLE_SIGNAL                       lcdif_enable   /*!< Signal name */\n\n/* GPIO_B0_02 (coord E8), LCDIF_HSYNC */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_HSYNC_PERIPHERAL                           LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_HSYNC_SIGNAL                         lcdif_hsync   /*!< Signal name */\n\n/* GPIO_B0_03 (coord D8), LCDIF_VSYNC */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_VSYNC_PERIPHERAL                           LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_VSYNC_SIGNAL                         lcdif_vsync   /*!< Signal name */\n\n/* GPIO_B1_15 (coord B14), USB_HOST_PWR/BACKLIGHT_CTL */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PERIPHERAL                         GPIO2   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_SIGNAL                           gpio_io   /*!< Signal name */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_CHANNEL                              31U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO                               GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO_PIN                             31U   /*!< GPIO pin number */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO_PIN_MASK                (1U << 31U)   /*!< GPIO pin mask */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PORT                               GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PIN                                  31U   /*!< PORT pin number */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PIN_MASK                     (1U << 31U)   /*!< PORT pin mask */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLCDPins(void);\n\n/* GPIO_AD_B0_14 (coord H14), CAN2_TX/U12[1] */\n/* Routed pin properties */\n#define BOARD_INITCANPINS_CAN2_TX_PERIPHERAL                                CAN2   /*!< Peripheral name */\n#define BOARD_INITCANPINS_CAN2_TX_SIGNAL                                      TX   /*!< Signal name */\n\n/* GPIO_AD_B0_15 (coord L10), CAN2_RX/U12[4] */\n/* Routed pin properties */\n#define BOARD_INITCANPINS_CAN2_RX_PERIPHERAL                                CAN2   /*!< Peripheral name */\n#define BOARD_INITCANPINS_CAN2_RX_SIGNAL                                      RX   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitCANPins(void);\n\n/* GPIO_EMC_40 (coord A7), ENET_MDC */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_MDC_PERIPHERAL                              ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_MDC_SIGNAL                              enet_mdc   /*!< Signal name */\n\n/* GPIO_EMC_41 (coord C7), ENET_MDIO */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_MDIO_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_MDIO_SIGNAL                            enet_mdio   /*!< Signal name */\n\n/* GPIO_B1_10 (coord B13), ENET_TX_CLK */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TX_CLK_PERIPHERAL                           ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TX_CLK_SIGNAL                       enet_ref_clk   /*!< Signal name */\n\n/* GPIO_B1_04 (coord E12), ENET_RXD0 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXD0_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXD0_SIGNAL                         enet_rx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RXD0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_B1_05 (coord D12), ENET_RXD1 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXD1_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXD1_SIGNAL                         enet_rx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RXD1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_B1_06 (coord C12), ENET_CRS_DV */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_CRS_DV_PERIPHERAL                           ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_CRS_DV_SIGNAL                         enet_rx_en   /*!< Signal name */\n\n/* GPIO_B1_11 (coord C13), ENET_RXER */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXER_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXER_SIGNAL                           enet_rx_er   /*!< Signal name */\n\n/* GPIO_B1_07 (coord B12), ENET_TXD0 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXD0_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXD0_SIGNAL                         enet_tx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_TXD0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_B1_08 (coord A12), ENET_TXD1 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXD1_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXD1_SIGNAL                         enet_tx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_TXD1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_B1_09 (coord A13), ENET_TXEN */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXEN_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXEN_SIGNAL                           enet_tx_en   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitENETPins(void);\n\n/* GPIO_SD_B0_05 (coord J2), SD1_D3 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D3_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D3_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_SD_B0_04 (coord H2), SD1_D2 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D2_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D2_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_SD_B0_03 (coord K1), SD1_D1/J24[5]/SPI_MISO */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D1_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D1_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_SD_B0_02 (coord J1), SD1_D0/J24[4]/SPI_MOSI/PWM */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D0_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D0_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_SD_B0_00 (coord J4), SD1_CMD/J24[6] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CMD_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CMD_SIGNAL                             usdhc_cmd   /*!< Signal name */\n\n/* GPIO_SD_B0_01 (coord J3), SD1_CLK/J24[3] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CLK_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CLK_SIGNAL                             usdhc_clk   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSDHCPins(void);\n\n/* GPIO_SD_B1_07 (coord L4), FlexSPI_CLK */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_CLK_PERIPHERAL                  FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_CLK_SIGNAL               FLEXSPI_A_SCLK   /*!< Signal name */\n\n/* GPIO_SD_B1_10 (coord P4), FlexSPI_D2_A */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D2_A_PERIPHERAL                 FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D2_A_SIGNAL             FLEXSPI_A_DATA2   /*!< Signal name */\n\n/* GPIO_SD_B1_08 (coord P3), FlexSPI_D0_A */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D0_A_PERIPHERAL                 FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D0_A_SIGNAL             FLEXSPI_A_DATA0   /*!< Signal name */\n\n/* GPIO_SD_B1_09 (coord N4), FlexSPI_D1_A */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D1_A_PERIPHERAL                 FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D1_A_SIGNAL             FLEXSPI_A_DATA1   /*!< Signal name */\n\n/* GPIO_SD_B1_00 (coord L5), FlexSPI_D3_B */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D3_B_PERIPHERAL                 FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D3_B_SIGNAL             FLEXSPI_B_DATA3   /*!< Signal name */\n\n/* GPIO_SD_B1_01 (coord M5), FlexSPI_D2_B */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D2_B_PERIPHERAL                 FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D2_B_SIGNAL             FLEXSPI_B_DATA2   /*!< Signal name */\n\n/* GPIO_SD_B1_02 (coord M3), FlexSPI_D1_B */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D1_B_PERIPHERAL                 FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D1_B_SIGNAL             FLEXSPI_B_DATA1   /*!< Signal name */\n\n/* GPIO_SD_B1_03 (coord M4), FlexSPI_D0_B */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D0_B_PERIPHERAL                 FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D0_B_SIGNAL             FLEXSPI_B_DATA0   /*!< Signal name */\n\n/* GPIO_SD_B1_04 (coord P2), FlexSPI_CLK_B */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_CLK_B_PERIPHERAL                FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_CLK_B_SIGNAL             FLEXSPI_B_SCLK   /*!< Signal name */\n\n/* GPIO_SD_B1_06 (coord L3), FlexSPI_SS0 */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_SS0_PERIPHERAL                  FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_SS0_SIGNAL              FLEXSPI_A_SS0_B   /*!< Signal name */\n\n/* GPIO_SD_B1_11 (coord P5), FlexSPI_D3_A */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D3_A_PERIPHERAL                 FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_D3_A_SIGNAL             FLEXSPI_A_DATA3   /*!< Signal name */\n\n/* GPIO_SD_B1_05 (coord N3), FlexSPI_DQS */\n/* Routed pin properties */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_DQS_PERIPHERAL                  FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITHYPERFLASHPINS_FlexSPI_DQS_SIGNAL                FLEXSPI_A_DQS   /*!< Signal name */\n\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitHyperFlashPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/board.cmake",
    "content": "set(MCU_FAMILY RT1050)\nset(MCU_VARIANT MIMXRT1052)\n\nset(JLINK_DEVICE MIMXRT1052xxxxB)\nset(PYOCD_TARGET mimxrt1050)\nset(NXPLINK_DEVICE MIMXRT1052xxxxB:EVK-MIMXRT1050)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkbimxrt1050_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1052DVL6B\n    BOARD_TUD_RHPORT=0\n    BOARD_TUH_RHPORT=1\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: i.MX RT1050 Evaluation Kit revB\n   url: https://www.nxp.com/part/IMXRT1050-EVKB\n*/\n\n#ifndef BOARD_MIMXRT1050_EVKB_H_\n#define BOARD_MIMXRT1050_EVKB_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (0x4000000U)\n\n// LED: IOMUXC_GPIO_AD_B0_09_GPIO1_IO09\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// SW8 button: IOMUXC_SNVS_WAKEUP_GPIO5_IO00\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_PERIPHERAL\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_CHANNEL\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: IOMUXC_GPIO_AD_B0_13_LPUART1_RXD, IOMUXC_GPIO_AD_B0_12_LPUART1_TXD\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1052DVL6B\nMCU_FAMILY = RT1050\nMCU_VARIANT = MIMXRT1052\n\nJLINK_DEVICE = MIMXRT1052xxxxB\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1050\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/evkbimxrt1050_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2017 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkbimxrt1050_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\")))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t hyperflash_config = {\n    .memConfig =\n        {\n            .tag                = FLEXSPI_CFG_BLK_TAG,\n            .version            = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc   = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,\n            .csHoldTime         = 3u,\n            .csSetupTime        = 3u,\n            .columnAddressWidth = 3u,\n            // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock\n            .controllerMiscOption =\n                (1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |\n                (1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),\n            .sflashPadType = kSerialFlash_8Pads,\n            .serialClkFreq = kFlexSpiSerialClk_133MHz,\n            .sflashA1Size  = 64u * 1024u * 1024u,\n            .dataValidTime = {16u, 16u},\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, 0xA0, RADDR_DDR, FLEXSPI_8PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(CADDR_DDR, FLEXSPI_8PAD, 0x10, DUMMY_DDR, FLEXSPI_8PAD, 0x06),\n                    FLEXSPI_LUT_SEQ(READ_DDR, FLEXSPI_8PAD, 0x04, STOP, FLEXSPI_1PAD, 0x0),\n                },\n        },\n    .pageSize           = 512u,\n    .sectorSize         = 256u * 1024u,\n    .blockSize          = 256u * 1024u,\n    .isUniformBlockSize = true,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/evkbimxrt1050_flexspi_nor_config.h",
    "content": "/*\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\n * Copyright 2016-2017 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKBIMXRT1050_FLEXSPI_NOR_CONFIG__\n#define __EVKBIMXRT1050_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_133MHz = 7,\n    kFlexSpiSerialClk_166MHz = 8,\n    kFlexSpiSerialClk_200MHz = 9,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKBIMXRT1050_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1050_evkb/mimxrt1050_evkb.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"IMXRT1050-EVKB\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13 http://mcuxpresso.nxp.com/XSD/mex_configuration_13.xsd\" uuid=\"789fd1d3-821c-40a6-b04d-44ccc5a5d158\" version=\"13\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1052xxxxB</processor>\n      <package>MIMXRT1052DVL6B</package>\n      <board>IMXRT1050-EVKB</board>\n      <board_revision>A</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>false</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"13.1\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>13.0.2</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"F14\" pin_signal=\"GPIO_AD_B0_09\" label=\"JTAG_TDI/J21[5]/ENET_RST/J22[5]\" identifier=\"USER_LED\"/>\n               <pin_label pin_num=\"L6\" pin_signal=\"WAKEUP\" label=\"SD_PWREN\" identifier=\"USER_BUTTON\"/>\n            </pin_labels>\n            <power_domains/>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO5\" description=\"Peripheral GPIO5 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 09\" pin_num=\"F14\" pin_signal=\"GPIO_AD_B0_09\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO5\" signal=\"gpio_io, 00\" pin_num=\"L6\" pin_signal=\"WAKEUP\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"TX\" pin_num=\"K14\" pin_signal=\"GPIO_AD_B0_12\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART1\" signal=\"RX\" pin_num=\"L14\" pin_signal=\"GPIO_AD_B0_13\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSDRAMPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SEMC\" description=\"Peripheral SEMC is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 00\" pin_num=\"C2\" pin_signal=\"GPIO_EMC_09\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 01\" pin_num=\"G1\" pin_signal=\"GPIO_EMC_10\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 02\" pin_num=\"G3\" pin_signal=\"GPIO_EMC_11\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 03\" pin_num=\"H1\" pin_signal=\"GPIO_EMC_12\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 04\" pin_num=\"A6\" pin_signal=\"GPIO_EMC_13\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 05\" pin_num=\"B6\" pin_signal=\"GPIO_EMC_14\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 06\" pin_num=\"B1\" pin_signal=\"GPIO_EMC_15\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 07\" pin_num=\"A5\" pin_signal=\"GPIO_EMC_16\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 08\" pin_num=\"A4\" pin_signal=\"GPIO_EMC_17\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 09\" pin_num=\"B2\" pin_signal=\"GPIO_EMC_18\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 10\" pin_num=\"G2\" pin_signal=\"GPIO_EMC_23\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 11\" pin_num=\"B4\" pin_signal=\"GPIO_EMC_19\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 12\" pin_num=\"A3\" pin_signal=\"GPIO_EMC_20\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 0\" pin_num=\"C1\" pin_signal=\"GPIO_EMC_21\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 1\" pin_num=\"F1\" pin_signal=\"GPIO_EMC_22\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cas\" pin_num=\"D3\" pin_signal=\"GPIO_EMC_24\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cke\" pin_num=\"A2\" pin_signal=\"GPIO_EMC_27\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_clk\" pin_num=\"B3\" pin_signal=\"GPIO_EMC_26\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 00\" pin_num=\"E3\" pin_signal=\"GPIO_EMC_00\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 01\" pin_num=\"F3\" pin_signal=\"GPIO_EMC_01\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 02\" pin_num=\"F4\" pin_signal=\"GPIO_EMC_02\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 03\" pin_num=\"G4\" pin_signal=\"GPIO_EMC_03\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 04\" pin_num=\"F2\" pin_signal=\"GPIO_EMC_04\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 05\" pin_num=\"G5\" pin_signal=\"GPIO_EMC_05\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 06\" pin_num=\"H5\" pin_signal=\"GPIO_EMC_06\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 07\" pin_num=\"H4\" pin_signal=\"GPIO_EMC_07\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 08\" pin_num=\"C6\" pin_signal=\"GPIO_EMC_30\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 09\" pin_num=\"C5\" pin_signal=\"GPIO_EMC_31\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 10\" pin_num=\"D5\" pin_signal=\"GPIO_EMC_32\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 11\" pin_num=\"C4\" pin_signal=\"GPIO_EMC_33\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 12\" pin_num=\"D4\" pin_signal=\"GPIO_EMC_34\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 13\" pin_num=\"E5\" pin_signal=\"GPIO_EMC_35\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 14\" pin_num=\"C3\" pin_signal=\"GPIO_EMC_36\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 15\" pin_num=\"E4\" pin_signal=\"GPIO_EMC_37\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 0\" pin_num=\"H3\" pin_signal=\"GPIO_EMC_08\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 1\" pin_num=\"D6\" pin_signal=\"GPIO_EMC_38\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_ras\" pin_num=\"D2\" pin_signal=\"GPIO_EMC_25\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_we\" pin_num=\"D1\" pin_signal=\"GPIO_EMC_28\"/>\n                  <pin peripheral=\"SEMC\" signal=\"CSX, 0\" pin_num=\"C7\" pin_signal=\"GPIO_EMC_41\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitCSIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"CSI\" description=\"Peripheral CSI is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPI2C1\" description=\"Peripheral LPI2C1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 09\" pin_num=\"H13\" pin_signal=\"GPIO_AD_B1_08\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 08\" pin_num=\"M13\" pin_signal=\"GPIO_AD_B1_09\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 07\" pin_num=\"L13\" pin_signal=\"GPIO_AD_B1_10\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 06\" pin_num=\"J13\" pin_signal=\"GPIO_AD_B1_11\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 05\" pin_num=\"H12\" pin_signal=\"GPIO_AD_B1_12\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 04\" pin_num=\"H11\" pin_signal=\"GPIO_AD_B1_13\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 02\" pin_num=\"J14\" pin_signal=\"GPIO_AD_B1_15\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 03\" pin_num=\"G12\" pin_signal=\"GPIO_AD_B1_14\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_pixclk\" pin_num=\"L12\" pin_signal=\"GPIO_AD_B1_04\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_mclk\" pin_num=\"K12\" pin_signal=\"GPIO_AD_B1_05\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_vsync\" pin_num=\"J12\" pin_signal=\"GPIO_AD_B1_06\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_hsync\" pin_num=\"K10\" pin_signal=\"GPIO_AD_B1_07\"/>\n                  <pin peripheral=\"LPI2C1\" signal=\"SCL\" pin_num=\"J11\" pin_signal=\"GPIO_AD_B1_00\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"CSI_I2C_SCL\"/>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_22K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Enable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPI2C1\" signal=\"SDA\" pin_num=\"K11\" pin_signal=\"GPIO_AD_B1_01\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"CSI_I2C_SDA\"/>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_22K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Enable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 04\" pin_num=\"F11\" pin_signal=\"GPIO_AD_B0_04\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLCDPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LCDIF\" description=\"Peripheral LCDIF is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 00\" pin_num=\"C8\" pin_signal=\"GPIO_B0_04\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 01\" pin_num=\"B8\" pin_signal=\"GPIO_B0_05\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 02\" pin_num=\"A8\" pin_signal=\"GPIO_B0_06\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_clk\" pin_num=\"D7\" pin_signal=\"GPIO_B0_00\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 03\" pin_num=\"A9\" pin_signal=\"GPIO_B0_07\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 04\" pin_num=\"B9\" pin_signal=\"GPIO_B0_08\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 05\" pin_num=\"C9\" pin_signal=\"GPIO_B0_09\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 06\" pin_num=\"D9\" pin_signal=\"GPIO_B0_10\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 07\" pin_num=\"A10\" pin_signal=\"GPIO_B0_11\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 08\" pin_num=\"C10\" pin_signal=\"GPIO_B0_12\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 09\" pin_num=\"D10\" pin_signal=\"GPIO_B0_13\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 10\" pin_num=\"E10\" pin_signal=\"GPIO_B0_14\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 11\" pin_num=\"E11\" pin_signal=\"GPIO_B0_15\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 12\" pin_num=\"A11\" pin_signal=\"GPIO_B1_00\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 13\" pin_num=\"B11\" pin_signal=\"GPIO_B1_01\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 14\" pin_num=\"C11\" pin_signal=\"GPIO_B1_02\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 15\" pin_num=\"D11\" pin_signal=\"GPIO_B1_03\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_enable\" pin_num=\"E7\" pin_signal=\"GPIO_B0_01\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_hsync\" pin_num=\"E8\" pin_signal=\"GPIO_B0_02\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_vsync\" pin_num=\"D8\" pin_signal=\"GPIO_B0_03\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 31\" pin_num=\"B14\" pin_signal=\"GPIO_B1_15\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitCANPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"CAN2\" description=\"Peripheral CAN2 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"CAN2\" signal=\"TX\" pin_num=\"H14\" pin_signal=\"GPIO_AD_B0_14\"/>\n                  <pin peripheral=\"CAN2\" signal=\"RX\" pin_num=\"L10\" pin_signal=\"GPIO_AD_B0_15\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitENETPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"ENET\" description=\"Peripheral ENET is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdc\" pin_num=\"A7\" pin_signal=\"GPIO_EMC_40\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdio\" pin_num=\"C7\" pin_signal=\"GPIO_EMC_41\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_ref_clk\" pin_num=\"B13\" pin_signal=\"GPIO_B1_10\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 0\" pin_num=\"E12\" pin_signal=\"GPIO_B1_04\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 1\" pin_num=\"D12\" pin_signal=\"GPIO_B1_05\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_en\" pin_num=\"C12\" pin_signal=\"GPIO_B1_06\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_er\" pin_num=\"C13\" pin_signal=\"GPIO_B1_11\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 0\" pin_num=\"B12\" pin_signal=\"GPIO_B1_07\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 1\" pin_num=\"A12\" pin_signal=\"GPIO_B1_08\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_en\" pin_num=\"A13\" pin_signal=\"GPIO_B1_09\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSDHCPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USDHC1\" description=\"Peripheral USDHC1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 3\" pin_num=\"J2\" pin_signal=\"GPIO_SD_B0_05\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 2\" pin_num=\"H2\" pin_signal=\"GPIO_SD_B0_04\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 1\" pin_num=\"K1\" pin_signal=\"GPIO_SD_B0_03\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 0\" pin_num=\"J1\" pin_signal=\"GPIO_SD_B0_02\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_cmd\" pin_num=\"J4\" pin_signal=\"GPIO_SD_B0_00\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_clk\" pin_num=\"J3\" pin_signal=\"GPIO_SD_B0_01\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitHyperFlashPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXSPI\" description=\"Peripheral FLEXSPI is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitHyperFlashPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitHyperFlashPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitHyperFlashPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SCLK\" pin_num=\"L4\" pin_signal=\"GPIO_SD_B1_07\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA2\" pin_num=\"P4\" pin_signal=\"GPIO_SD_B1_10\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA0\" pin_num=\"P3\" pin_signal=\"GPIO_SD_B1_08\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA1\" pin_num=\"N4\" pin_signal=\"GPIO_SD_B1_09\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_B_DATA3\" pin_num=\"L5\" pin_signal=\"GPIO_SD_B1_00\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_B_DATA2\" pin_num=\"M5\" pin_signal=\"GPIO_SD_B1_01\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_B_DATA1\" pin_num=\"M3\" pin_signal=\"GPIO_SD_B1_02\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_B_DATA0\" pin_num=\"M4\" pin_signal=\"GPIO_SD_B1_03\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_B_SCLK\" pin_num=\"P2\" pin_signal=\"GPIO_SD_B1_04\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SS0_B\" pin_num=\"L3\" pin_signal=\"GPIO_SD_B1_06\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA3\" pin_num=\"P5\" pin_signal=\"GPIO_SD_B1_11\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DQS\" pin_num=\"N3\" pin_signal=\"GPIO_SD_B1_05\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"11.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>13.0.2</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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"AHB_CLK_ROOT.outFreq\" value=\"600 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN_CLK_ROOT.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI_CLK_ROOT.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_125M_CLK.outFreq\" value=\"2.4 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_25M_REF_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO2_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"160 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"150 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LCDIF_CLK_ROOT.outFreq\" value=\"67.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LVDS1_CLK.outFreq\" value=\"1.2 GHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PLL7_MAIN_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SEMC_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY1_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY2_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC1_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC2_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.ARM_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"3\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_SEL.sel\" value=\"CCM.PLL3_SW_CLK_SEL\" locked=\"false\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.SEMC_PODF.scale\" value=\"8\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_BYPASS.sel\" value=\"CCM_ANALOG.PLL1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_PREDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_VDIV.scale\" value=\"50\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"33\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.denom\" value=\"50\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.div\" value=\"47\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.denom\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.div\" value=\"40\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.num\" value=\"0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_BYPASS.sel\" value=\"CCM_ANALOG.PLL5_POST_DIV\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_POST_DIV.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL7_BYPASS.sel\" value=\"CCM_ANALOG.PLL7\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.VIDEO_DIV.scale\" value=\"4\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_POWERDOWN_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG\" value=\"No\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"a7525270-2da6-4556-8d91-4ab9d0edc0e2\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"CAN\" uuid=\"cb1fcaec-81fe-4d3e-a079-a7d2819d6075\" type=\"flexcan\" type_id=\"flexcan_10d80efac19b25dcd240244aae88dca0\" mode=\"interrupts\" peripheral=\"CAN2\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"interruptsCfg\">\n                        <setting name=\"messageBufferIrqs\" value=\"0\"/>\n                        <setting name=\"messageBufferIrqs2\" value=\"0\"/>\n                        <set name=\"interruptsEnable\">\n                           <selected/>\n                        </set>\n                        <setting name=\"enable_irq\" value=\"false\"/>\n                        <struct name=\"interrupt_shared\">\n                           <setting name=\"IRQn\" value=\"CAN2_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"fsl_flexcan\" quick_selection=\"default\">\n                        <struct name=\"can_config\">\n                           <setting name=\"clockSource\" value=\"kFLEXCAN_ClkSrcOsc\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"wakeupSrc\" value=\"kFLEXCAN_WakeupSrcUnfiltered\"/>\n                           <setting name=\"baudRate\" value=\"1000000\"/>\n                           <setting name=\"maxMbNum\" value=\"16\"/>\n                           <setting name=\"enableLoopBack\" value=\"false\"/>\n                           <setting name=\"enableTimerSync\" value=\"true\"/>\n                           <setting name=\"enableSelfWakeup\" value=\"false\"/>\n                           <setting name=\"enableIndividMask\" value=\"false\"/>\n                           <struct name=\"timingConfig\">\n                              <setting name=\"propSeg\" value=\"2\"/>\n                              <setting name=\"phaseSeg1\" value=\"4\"/>\n                              <setting name=\"phaseSeg2\" value=\"3\"/>\n                              <setting name=\"rJumpwidth\" value=\"2\"/>\n                              <struct name=\"bitTime\"/>\n                           </struct>\n                        </struct>\n                        <setting name=\"enableRxFIFO\" value=\"false\"/>\n                        <struct name=\"rxFIFO\">\n                           <setting name=\"idFilterTable\" value=\"\"/>\n                           <setting name=\"idFilterNum\" value=\"num0\"/>\n                           <setting name=\"idFilterType\" value=\"kFLEXCAN_RxFifoFilterTypeA\"/>\n                           <setting name=\"priority\" value=\"kFLEXCAN_RxFifoPrioLow\"/>\n                        </struct>\n                        <array name=\"channels\">\n                           <struct name=\"0\">\n                              <setting name=\"mbID\" value=\"0\"/>\n                              <setting name=\"mbType\" value=\"mbRx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                           <struct name=\"1\">\n                              <setting name=\"mbID\" value=\"1\"/>\n                              <setting name=\"mbType\" value=\"mbTx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                        </array>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI\" uuid=\"da865a46-3511-4001-8bb0-5249c52b0e4d\" type=\"csi\" type_id=\"csi_b2cf1faba8074e676ac4be93ec552c5a\" mode=\"interrupt\" peripheral=\"CSI\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_csi\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"clockConfig\">\n                           <setting name=\"clockSource\" value=\"BusInterfaceClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"masterClockSource\" value=\"CsiClock\"/>\n                           <setting name=\"masterClockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        </struct>\n                        <struct name=\"config\">\n                           <setting name=\"format\" value=\"RGB565\"/>\n                           <setting name=\"i_width\" value=\"320\"/>\n                           <setting name=\"i_height\" value=\"240\"/>\n                           <setting name=\"dataBus\" value=\"kCSI_DataBus8Bit\"/>\n                           <setting name=\"workMode\" value=\"kCSI_GatedClockMode\"/>\n                           <setting name=\"useExtVsync\" value=\"true\"/>\n                           <set name=\"polarityFlags\">\n                              <selected/>\n                           </set>\n                           <struct name=\"buffers_config\">\n                              <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                              <setting name=\"bufCount\" value=\"4\"/>\n                              <setting name=\"bufferAlign\" value=\"64\"/>\n                           </struct>\n                        </struct>\n                        <struct name=\"interruptsCfg\">\n                           <setting name=\"isInterruptEnabled\" value=\"false\"/>\n                           <set name=\"interruptSources\">\n                              <selected/>\n                           </set>\n                           <struct name=\"interrupt\">\n                              <setting name=\"IRQn\" value=\"CSI_IRQn\"/>\n                              <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                              <setting name=\"enable_priority\" value=\"false\"/>\n                              <setting name=\"priority\" value=\"0\"/>\n                              <setting name=\"enable_custom_name\" value=\"false\"/>\n                           </struct>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI_LPI2C\" uuid=\"47051ef3-2c25-4648-8f79-4ae87cd12674\" type=\"lpi2c\" type_id=\"lpi2c_db68d4f4f06a22e25ab51fe9bd6db4d2\" mode=\"master\" peripheral=\"LPI2C1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"main\" quick_selection=\"qs_interrupt\">\n                        <setting name=\"clockSource\" value=\"Lpi2cClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LPI2C1_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"master\" quick_selection=\"qs_master_transfer\">\n                        <setting name=\"mode\" value=\"transfer\"/>\n                        <struct name=\"config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"enableDoze\" value=\"true\"/>\n                           <setting name=\"debugEnable\" value=\"false\"/>\n                           <setting name=\"ignoreAck\" value=\"false\"/>\n                           <setting name=\"pinConfig\" value=\"kLPI2C_2PinOpenDrain\"/>\n                           <setting name=\"baudRate_Hz\" value=\"100000\"/>\n                           <setting name=\"busIdleTimeout_ns\" value=\"0\"/>\n                           <setting name=\"pinLowTimeout_ns\" value=\"0\"/>\n                           <setting name=\"sdaGlitchFilterWidth_ns\" value=\"0\"/>\n                           <setting name=\"sclGlitchFilterWidth_ns\" value=\"0\"/>\n                           <struct name=\"hostRequest\">\n                              <setting name=\"enable\" value=\"false\"/>\n                              <setting name=\"source\" value=\"kLPI2C_HostRequestExternalPin\"/>\n                              <setting name=\"polarity\" value=\"kLPI2C_HostRequestPinActiveHigh\"/>\n                           </struct>\n                           <set name=\"edmaRequestSources\">\n                              <selected/>\n                           </set>\n                        </struct>\n                        <struct name=\"transfer\">\n                           <setting name=\"blocking\" value=\"false\"/>\n                           <setting name=\"enable_custom_handle\" value=\"false\"/>\n                           <struct name=\"callback\">\n                              <setting name=\"name\" value=\"\"/>\n                              <setting name=\"userData\" value=\"\"/>\n                           </struct>\n                           <set name=\"flags\">\n                              <selected/>\n                           </set>\n                           <setting name=\"slaveAddress\" value=\"0\"/>\n                           <setting name=\"direction\" value=\"kLPI2C_Write\"/>\n                           <setting name=\"subaddress\" value=\"0\"/>\n                           <setting name=\"subaddressSize\" value=\"1\"/>\n                           <setting name=\"blocking_buffer\" value=\"false\"/>\n                           <setting name=\"enable_custom_buffer\" value=\"false\"/>\n                           <setting name=\"dataSize\" value=\"1\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"64741c26-6183-46d0-8bfe-02a92aa90e05\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"BOARD_BootClockRUN\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LCD\" uuid=\"8bf370a5-e797-45e8-b8c4-629c84c62843\" type=\"elcdif\" type_id=\"elcdif_1c39bcb43ed1a24bc8980672c7378576\" mode=\"rgbMode\" peripheral=\"LCDIF\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_elcdif\">\n                        <struct name=\"config\">\n                           <setting name=\"panelWidthInt\" value=\"480\"/>\n                           <setting name=\"panelHeightInt\" value=\"272\"/>\n                           <setting name=\"hsw\" value=\"41\"/>\n                           <setting name=\"hfp\" value=\"4\"/>\n                           <setting name=\"hbp\" value=\"8\"/>\n                           <setting name=\"vsw\" value=\"10\"/>\n                           <setting name=\"vfp\" value=\"4\"/>\n                           <setting name=\"vbp\" value=\"2\"/>\n                           <setting name=\"frameRate\" value=\"60 Hz\"/>\n                           <setting name=\"clockSource\" value=\"LcdIfClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <struct name=\"polarityFlags_st\">\n                              <setting name=\"vSyncActive\" value=\"kELCDIF_VsyncActiveLow\"/>\n                              <setting name=\"hSyncActive\" value=\"kELCDIF_HsyncActiveLow\"/>\n                              <setting name=\"dataEnableActive\" value=\"kELCDIF_DataEnableActiveLow\"/>\n                              <setting name=\"driveDataClkEdge\" value=\"kELCDIF_DriveDataOnFallingClkEdge\"/>\n                           </struct>\n                           <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                           <setting name=\"bufferAlign\" value=\"64\"/>\n                           <setting name=\"pixelFormat\" value=\"kELCDIF_PixelFormatRGB565\"/>\n                           <setting name=\"dataBus\" value=\"kELCDIF_DataBus16Bit\"/>\n                           <setting name=\"enablePxpHandShake\" value=\"false\"/>\n                           <setting name=\"start\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"isInterruptEnabled\" value=\"true\"/>\n                        <set name=\"elcdifInterruptSources\">\n                           <selected>\n                              <id>kELCDIF_CurFrameDoneInterruptEnable</id>\n                           </selected>\n                        </set>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LCDIF_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"687e3f12-1330-4ff9-8138-6aaf372d3e22\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"17c5d0d5-726a-40f6-a434-b121e9798a55\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"4a40b9b1-b64b-41b7-8ba7-728cda5039cd\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"c8d21d99-3f5e-47f2-aba7-0588ad4c2132\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"dfa0bda9-5863-49b3-9482-3ee85a2b93f0\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"3358d4d0-14d8-4ca7-9c13-378a0dc7f9a2\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"65c68c04-c4f4-4fbc-8c15-452d53d79fe6\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"99f59d06-c3df-407a-856a-22072ef95a98\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n      <common name=\"common\" version=\"1.0\" enabled=\"true\" update_project_code=\"true\">\n         <core name=\"core0\" role=\"primary\" project_name=\"Project\"/>\n      </common>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v11.0\nprocessor: MIMXRT1062xxxxA\npackage_id: MIMXRT1062DVL6A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1060-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: AHB_CLK_ROOT.outFreq, value: 600 MHz}\n- {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: CSI_CLK_ROOT.outFreq, value: 12 MHz}\n- {id: ENET2_125M_CLK.outFreq, value: 1.2 MHz}\n- {id: ENET_125M_CLK.outFreq, value: 2.4 MHz}\n- {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXIO2_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI2_CLK_ROOT.outFreq, value: 1440/11 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 1440/11 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 150 MHz}\n- {id: LCDIF_CLK_ROOT.outFreq, value: 67.5 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: LVDS1_CLK.outFreq, value: 1.2 GHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: PLL7_MAIN_CLK.outFreq, value: 480 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SEMC_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY1_CLK.outFreq, value: 480 MHz}\n- {id: USBPHY2_CLK.outFreq, value: 480 MHz}\n- {id: USDHC1_CLK_ROOT.outFreq, value: 198 MHz}\n- {id: USDHC2_CLK_ROOT.outFreq, value: 198 MHz}\nsettings:\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.ARM_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI2_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI2_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.FLEXSPI_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.LCDIF_PODF.scale, value: '4', locked: true}\n- {id: CCM.LCDIF_PRED.scale, value: '2', locked: true}\n- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.SEMC_PODF.scale, value: '8'}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM.TRACE_PODF.scale, value: '4', locked: true}\n- {id: CCM_ANALOG.PLL1_BYPASS.sel, value: CCM_ANALOG.PLL1}\n- {id: CCM_ANALOG.PLL1_PREDIV.scale, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL1_VDIV.scale, value: '50', locked: true}\n- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '33', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL4.denom, value: '50'}\n- {id: CCM_ANALOG.PLL4.div, value: '47'}\n- {id: CCM_ANALOG.PLL5.denom, value: '1'}\n- {id: CCM_ANALOG.PLL5.div, value: '31', locked: true}\n- {id: CCM_ANALOG.PLL5.num, value: '0'}\n- {id: CCM_ANALOG.PLL5_BYPASS.sel, value: CCM_ANALOG.PLL5_POST_DIV}\n- {id: CCM_ANALOG.PLL5_POST_DIV.scale, value: '2', locked: true}\n- {id: CCM_ANALOG.PLL7_BYPASS.sel, value: CCM_ANALOG.PLL7}\n- {id: CCM_ANALOG.VIDEO_DIV.scale, value: '4', locked: true}\n- {id: CCM_ANALOG_PLL_ENET_POWERDOWN_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG, value: 'No'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 100,                       /* PLL loop divider, Fout = Fin * 50 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 31,                        /* PLL loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .postDivider = 8,                         /* Divider after PLL */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */\n    /* Setting the VDD_SOC to 1.275V. It is necessary to config AHB to 600Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x13);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Adc2);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    CLOCK_DisableClock(kCLOCK_Xbar2);\n    CLOCK_DisableClock(kCLOCK_Xbar3);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Set ARM_PODF. */\n    CLOCK_SetDiv(kCLOCK_ArmDiv, 1);\n    /* Set PERIPH_CLK2_PODF. */\n    CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* Disable USDHC1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc1);\n    /* Set USDHC1_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1);\n    /* Set Usdhc1 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);\n    /* Disable USDHC2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc2);\n    /* Set USDHC2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1);\n    /* Set Usdhc2 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n    /* Disable Semc clock gate. */\n    CLOCK_DisableClock(kCLOCK_Semc);\n    /* Set SEMC_PODF. */\n    CLOCK_SetDiv(kCLOCK_SemcDiv, 7);\n    /* Set Semc alt clock source. */\n    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);\n    /* Set Semc clock source. */\n    CLOCK_SetMux(kCLOCK_SemcMux, 0);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 1);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 3);\n#endif\n    /* Disable Flexspi2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi2);\n    /* Set FLEXSPI2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexspi2Div, 1);\n    /* Set Flexspi2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1);\n    /* Disable CSI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Csi);\n    /* Set CSI_PODF. */\n    CLOCK_SetDiv(kCLOCK_CsiDiv, 1);\n    /* Set Csi clock source. */\n    CLOCK_SetMux(kCLOCK_CsiMux, 0);\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    CLOCK_DisableClock(kCLOCK_Lpspi3);\n    CLOCK_DisableClock(kCLOCK_Lpspi4);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai2);\n    /* Set SAI2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);\n    /* Set SAI2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai2Div, 1);\n    /* Set Sai2 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai2Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    CLOCK_DisableClock(kCLOCK_Lpi2c3);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable CAN clock gate. */\n    CLOCK_DisableClock(kCLOCK_Can1);\n    CLOCK_DisableClock(kCLOCK_Can2);\n    CLOCK_DisableClock(kCLOCK_Can3);\n    CLOCK_DisableClock(kCLOCK_Can1S);\n    CLOCK_DisableClock(kCLOCK_Can2S);\n    CLOCK_DisableClock(kCLOCK_Can3S);\n    /* Set CAN_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_CanDiv, 1);\n    /* Set Can clock source. */\n    CLOCK_SetMux(kCLOCK_CanMux, 2);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    CLOCK_DisableClock(kCLOCK_Lpuart5);\n    CLOCK_DisableClock(kCLOCK_Lpuart6);\n    CLOCK_DisableClock(kCLOCK_Lpuart7);\n    CLOCK_DisableClock(kCLOCK_Lpuart8);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable LCDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_LcdPixel);\n    /* Set LCDIF_PRED. */\n    CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1);\n    /* Set LCDIF_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_LcdifDiv, 3);\n    /* Set Lcdif pre clock source. */\n    CLOCK_SetMux(kCLOCK_LcdifPreMux, 5);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* Disable Flexio2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio2);\n    /* Set FLEXIO2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1);\n    /* Set FLEXIO2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio2Div, 7);\n    /* Set Flexio2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio2Mux, 3);\n    /* Set Pll3 sw clock source. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* Init ARM PLL. */\n    CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n    #warning \"SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged.\"\n#endif\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 24);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 16);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 33);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 19);\n#endif\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Init Video PLL. */\n    uint32_t pllVideo;\n    /* Disable Video PLL output before initial Video PLL. */\n    CCM_ANALOG->PLL_VIDEO &= ~CCM_ANALOG_PLL_VIDEO_ENABLE_MASK;\n    /* Bypass PLL first */\n    CCM_ANALOG->PLL_VIDEO = (CCM_ANALOG->PLL_VIDEO & (~CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_MASK)) |\n                            CCM_ANALOG_PLL_VIDEO_BYPASS_MASK | CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC(0);\n    CCM_ANALOG->PLL_VIDEO_NUM = CCM_ANALOG_PLL_VIDEO_NUM_A(0);\n    CCM_ANALOG->PLL_VIDEO_DENOM = CCM_ANALOG_PLL_VIDEO_DENOM_B(1);\n    pllVideo = (CCM_ANALOG->PLL_VIDEO & (~(CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK | CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK))) |\n               CCM_ANALOG_PLL_VIDEO_ENABLE_MASK |CCM_ANALOG_PLL_VIDEO_DIV_SELECT(31);\n    pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1);\n    CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(3);\n    CCM_ANALOG->PLL_VIDEO = pllVideo;\n    while ((CCM_ANALOG->PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_LOCK_MASK) == 0)\n    {\n    }\n    /* Disable bypass for Video PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllVideo, 0);\n    /* DeInit Enet PLL. */\n    CLOCK_DeinitEnetPll();\n    /* Bypass Enet PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1);\n    /* Set Enet output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_DIV_SELECT(1);\n    /* Enable Enet output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENABLE_MASK;\n    /* Set Enet2 output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT(0);\n    /* Enable Enet2 output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET2_REF_EN_MASK;\n    /* Enable Enet25M output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK;\n    /* Init Usb2 PLL. */\n    CLOCK_InitUsb2Pll(&usb2PllConfig_BOARD_BootClockRUN);\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Set lvds1 clock source. */\n    CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set ENET Ref clock source. */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK;\n    /* Set ENET2 Ref clock source. */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET2_TX_CLK_DIR_MASK;\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             600000000U  /*!< Core clock frequency: 600000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT               600000000UL\n#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT               40000000UL\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL\n#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT               12000000UL\n#define BOARD_BOOTCLOCKRUN_ENET2_125M_CLK             1200000UL\n#define BOARD_BOOTCLOCKRUN_ENET2_REF_CLK              0UL\n#define BOARD_BOOTCLOCKRUN_ENET2_TX_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK              2400000UL\n#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK           1200000UL\n#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK                0UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT          130909090UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           130909090UL\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      75000000UL\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      75000000UL\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               150000000UL\n#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT             67500000UL\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL\n#define BOARD_BOOTCLOCKRUN_LVDS1_CLK                  1200000000UL\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            75000000UL\n#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK              480000000UL\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT              75000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT            198000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT            198000000UL\n\n/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Usb2 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Video PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v13.1\nprocessor: MIMXRT1062xxxxA\npackage_id: MIMXRT1062DVL6A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1060-EVK\npin_labels:\n- {pin_num: F14, pin_signal: GPIO_AD_B0_09, label: 'JTAG_TDI/J21[5]/ENET_RST/J22[5]', identifier: USER_LED}\n- {pin_num: L6, pin_signal: WAKEUP, label: SD_PWREN, identifier: USER_BUTTON}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: F14, peripheral: GPIO1, signal: 'gpio_io, 09', pin_signal: GPIO_AD_B0_09, direction: OUTPUT, pull_keeper_select: Keeper}\n  - {pin_num: L6, peripheral: GPIO5, signal: 'gpio_io, 00', pin_signal: WAKEUP, direction: INPUT}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n  CLOCK_EnableClock(kCLOCK_IomuxcSnvs);\n\n  /* GPIO configuration of USER_LED on GPIO_AD_B0_09 (pin F14) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_AD_B0_09 (pin F14) */\n  GPIO_PinInit(GPIO1, 9U, &USER_LED_config);\n\n  /* GPIO configuration of USER_BUTTON on WAKEUP (pin L6) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on WAKEUP (pin L6) */\n  GPIO_PinInit(GPIO5, 0U, &USER_BUTTON_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0U);\n  IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &\n    (~(BOARD_INITPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinMux(IOMUXC_SNVS_WAKEUP_GPIO5_IO00, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0x50A0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: K14, peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_12, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: L14, peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_13, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0x10B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0x10B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSDRAMPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: C2, peripheral: SEMC, signal: 'ADDR, 00', pin_signal: GPIO_EMC_09}\n  - {pin_num: G1, peripheral: SEMC, signal: 'ADDR, 01', pin_signal: GPIO_EMC_10}\n  - {pin_num: G3, peripheral: SEMC, signal: 'ADDR, 02', pin_signal: GPIO_EMC_11}\n  - {pin_num: H1, peripheral: SEMC, signal: 'ADDR, 03', pin_signal: GPIO_EMC_12}\n  - {pin_num: A6, peripheral: SEMC, signal: 'ADDR, 04', pin_signal: GPIO_EMC_13}\n  - {pin_num: B6, peripheral: SEMC, signal: 'ADDR, 05', pin_signal: GPIO_EMC_14}\n  - {pin_num: B1, peripheral: SEMC, signal: 'ADDR, 06', pin_signal: GPIO_EMC_15}\n  - {pin_num: A5, peripheral: SEMC, signal: 'ADDR, 07', pin_signal: GPIO_EMC_16}\n  - {pin_num: A4, peripheral: SEMC, signal: 'ADDR, 08', pin_signal: GPIO_EMC_17}\n  - {pin_num: B2, peripheral: SEMC, signal: 'ADDR, 09', pin_signal: GPIO_EMC_18}\n  - {pin_num: G2, peripheral: SEMC, signal: 'ADDR, 10', pin_signal: GPIO_EMC_23}\n  - {pin_num: B4, peripheral: SEMC, signal: 'ADDR, 11', pin_signal: GPIO_EMC_19}\n  - {pin_num: A3, peripheral: SEMC, signal: 'ADDR, 12', pin_signal: GPIO_EMC_20}\n  - {pin_num: C1, peripheral: SEMC, signal: 'BA, 0', pin_signal: GPIO_EMC_21}\n  - {pin_num: F1, peripheral: SEMC, signal: 'BA, 1', pin_signal: GPIO_EMC_22}\n  - {pin_num: D3, peripheral: SEMC, signal: semc_cas, pin_signal: GPIO_EMC_24}\n  - {pin_num: A2, peripheral: SEMC, signal: semc_cke, pin_signal: GPIO_EMC_27}\n  - {pin_num: B3, peripheral: SEMC, signal: semc_clk, pin_signal: GPIO_EMC_26}\n  - {pin_num: E3, peripheral: SEMC, signal: 'DATA, 00', pin_signal: GPIO_EMC_00}\n  - {pin_num: F3, peripheral: SEMC, signal: 'DATA, 01', pin_signal: GPIO_EMC_01}\n  - {pin_num: F4, peripheral: SEMC, signal: 'DATA, 02', pin_signal: GPIO_EMC_02}\n  - {pin_num: G4, peripheral: SEMC, signal: 'DATA, 03', pin_signal: GPIO_EMC_03}\n  - {pin_num: F2, peripheral: SEMC, signal: 'DATA, 04', pin_signal: GPIO_EMC_04}\n  - {pin_num: G5, peripheral: SEMC, signal: 'DATA, 05', pin_signal: GPIO_EMC_05}\n  - {pin_num: H5, peripheral: SEMC, signal: 'DATA, 06', pin_signal: GPIO_EMC_06}\n  - {pin_num: H4, peripheral: SEMC, signal: 'DATA, 07', pin_signal: GPIO_EMC_07}\n  - {pin_num: C6, peripheral: SEMC, signal: 'DATA, 08', pin_signal: GPIO_EMC_30}\n  - {pin_num: C5, peripheral: SEMC, signal: 'DATA, 09', pin_signal: GPIO_EMC_31}\n  - {pin_num: D5, peripheral: SEMC, signal: 'DATA, 10', pin_signal: GPIO_EMC_32}\n  - {pin_num: C4, peripheral: SEMC, signal: 'DATA, 11', pin_signal: GPIO_EMC_33}\n  - {pin_num: D4, peripheral: SEMC, signal: 'DATA, 12', pin_signal: GPIO_EMC_34}\n  - {pin_num: E5, peripheral: SEMC, signal: 'DATA, 13', pin_signal: GPIO_EMC_35}\n  - {pin_num: C3, peripheral: SEMC, signal: 'DATA, 14', pin_signal: GPIO_EMC_36}\n  - {pin_num: E4, peripheral: SEMC, signal: 'DATA, 15', pin_signal: GPIO_EMC_37}\n  - {pin_num: H3, peripheral: SEMC, signal: 'DM, 0', pin_signal: GPIO_EMC_08}\n  - {pin_num: D6, peripheral: SEMC, signal: 'DM, 1', pin_signal: GPIO_EMC_38}\n  - {pin_num: D2, peripheral: SEMC, signal: semc_ras, pin_signal: GPIO_EMC_25}\n  - {pin_num: D1, peripheral: SEMC, signal: semc_we, pin_signal: GPIO_EMC_28}\n  - {pin_num: E1, peripheral: SEMC, signal: 'CS, 0', pin_signal: GPIO_EMC_29}\n  - {pin_num: B7, peripheral: SEMC, signal: semc_dqs, pin_signal: GPIO_EMC_39}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSDRAMPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitSDRAMPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_08_SEMC_DM00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_SEMC_ADDR00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_10_SEMC_ADDR01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_11_SEMC_ADDR02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_12_SEMC_ADDR03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_13_SEMC_ADDR04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_14_SEMC_ADDR05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_15_SEMC_ADDR06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_16_SEMC_ADDR07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_17_SEMC_ADDR08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_18_SEMC_ADDR09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_19_SEMC_ADDR11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_20_SEMC_ADDR12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_21_SEMC_BA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_22_SEMC_BA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_23_SEMC_ADDR10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_24_SEMC_CAS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_25_SEMC_RAS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_26_SEMC_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_27_SEMC_CKE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_28_SEMC_WE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_29_SEMC_CS0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DATA10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DATA11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DATA12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DATA13, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DATA14, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DATA15, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_38_SEMC_DM01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_39_SEMC_DQS, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitCSIPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: H13, peripheral: CSI, signal: 'csi_data, 09', pin_signal: GPIO_AD_B1_08}\n  - {pin_num: M13, peripheral: CSI, signal: 'csi_data, 08', pin_signal: GPIO_AD_B1_09}\n  - {pin_num: L13, peripheral: CSI, signal: 'csi_data, 07', pin_signal: GPIO_AD_B1_10}\n  - {pin_num: J13, peripheral: CSI, signal: 'csi_data, 06', pin_signal: GPIO_AD_B1_11}\n  - {pin_num: H12, peripheral: CSI, signal: 'csi_data, 05', pin_signal: GPIO_AD_B1_12}\n  - {pin_num: H11, peripheral: CSI, signal: 'csi_data, 04', pin_signal: GPIO_AD_B1_13}\n  - {pin_num: J14, peripheral: CSI, signal: 'csi_data, 02', pin_signal: GPIO_AD_B1_15}\n  - {pin_num: G12, peripheral: CSI, signal: 'csi_data, 03', pin_signal: GPIO_AD_B1_14}\n  - {pin_num: L12, peripheral: CSI, signal: csi_pixclk, pin_signal: GPIO_AD_B1_04}\n  - {pin_num: K12, peripheral: CSI, signal: csi_mclk, pin_signal: GPIO_AD_B1_05}\n  - {pin_num: J12, peripheral: CSI, signal: csi_vsync, pin_signal: GPIO_AD_B1_06}\n  - {pin_num: K10, peripheral: CSI, signal: csi_hsync, pin_signal: GPIO_AD_B1_07}\n  - {pin_num: J11, peripheral: LPI2C1, signal: SCL, pin_signal: GPIO_AD_B1_00, identifier: CSI_I2C_SCL, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Up_22K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Enable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: K11, peripheral: LPI2C1, signal: SDA, pin_signal: GPIO_AD_B1_01, identifier: CSI_I2C_SDA, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Up_22K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Enable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: F11, peripheral: GPIO1, signal: 'gpio_io, 04', pin_signal: GPIO_AD_B0_04}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitCSIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitCSIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_04_GPIO1_IO04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_04_CSI_PIXCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_05_CSI_MCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_06_CSI_VSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_07_CSI_HSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_08_CSI_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_09_CSI_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_10_CSI_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_11_CSI_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_12_CSI_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_13_CSI_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_14_CSI_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_15_CSI_DATA02, 0U);\n  IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &\n    (~(BOARD_INITCSIPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 0xD8B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA, 0xD8B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLCDPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: C8, peripheral: LCDIF, signal: 'lcdif_data, 00', pin_signal: GPIO_B0_04, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B8, peripheral: LCDIF, signal: 'lcdif_data, 01', pin_signal: GPIO_B0_05, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A8, peripheral: LCDIF, signal: 'lcdif_data, 02', pin_signal: GPIO_B0_06, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D7, peripheral: LCDIF, signal: lcdif_clk, pin_signal: GPIO_B0_00, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A9, peripheral: LCDIF, signal: 'lcdif_data, 03', pin_signal: GPIO_B0_07, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B9, peripheral: LCDIF, signal: 'lcdif_data, 04', pin_signal: GPIO_B0_08, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C9, peripheral: LCDIF, signal: 'lcdif_data, 05', pin_signal: GPIO_B0_09, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D9, peripheral: LCDIF, signal: 'lcdif_data, 06', pin_signal: GPIO_B0_10, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A10, peripheral: LCDIF, signal: 'lcdif_data, 07', pin_signal: GPIO_B0_11, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C10, peripheral: LCDIF, signal: 'lcdif_data, 08', pin_signal: GPIO_B0_12, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D10, peripheral: LCDIF, signal: 'lcdif_data, 09', pin_signal: GPIO_B0_13, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E10, peripheral: LCDIF, signal: 'lcdif_data, 10', pin_signal: GPIO_B0_14, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E11, peripheral: LCDIF, signal: 'lcdif_data, 11', pin_signal: GPIO_B0_15, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A11, peripheral: LCDIF, signal: 'lcdif_data, 12', pin_signal: GPIO_B1_00, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B11, peripheral: LCDIF, signal: 'lcdif_data, 13', pin_signal: GPIO_B1_01, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C11, peripheral: LCDIF, signal: 'lcdif_data, 14', pin_signal: GPIO_B1_02, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D11, peripheral: LCDIF, signal: 'lcdif_data, 15', pin_signal: GPIO_B1_03, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E7, peripheral: LCDIF, signal: lcdif_enable, pin_signal: GPIO_B0_01, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E8, peripheral: LCDIF, signal: lcdif_hsync, pin_signal: GPIO_B0_02, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D8, peripheral: LCDIF, signal: lcdif_vsync, pin_signal: GPIO_B0_03, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B14, peripheral: GPIO2, signal: 'gpio_io, 31', pin_signal: GPIO_B1_15, slew_rate: Slow}\n  - {pin_num: M11, peripheral: GPIO1, signal: 'gpio_io, 02', pin_signal: GPIO_AD_B0_02}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLCDPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitLCDPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_02_GPIO1_IO02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_00_LCD_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_04_LCD_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_05_LCD_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_06_LCD_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_07_LCD_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_08_LCD_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_09_LCD_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_10_LCD_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_11_LCD_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_12_LCD_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_13_LCD_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_14_LCD_DATA10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_15_LCD_DATA11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_00_LCD_DATA12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_01_LCD_DATA13, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_02_LCD_DATA14, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_03_LCD_DATA15, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_15_GPIO2_IO31, 0U);\n  IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &\n    (~(BOARD_INITLCDPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL(0x00U)\n    );\n  IOMUXC_GPR->GPR27 = ((IOMUXC_GPR->GPR27 &\n    (~(BOARD_INITLCDPINS_IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_00_LCD_CLK, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_04_LCD_DATA00, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_05_LCD_DATA01, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_06_LCD_DATA02, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_07_LCD_DATA03, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_08_LCD_DATA04, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_09_LCD_DATA05, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_10_LCD_DATA06, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_11_LCD_DATA07, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_12_LCD_DATA08, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_13_LCD_DATA09, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_14_LCD_DATA10, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_15_LCD_DATA11, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_00_LCD_DATA12, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_01_LCD_DATA13, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_02_LCD_DATA14, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_03_LCD_DATA15, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_15_GPIO2_IO31, 0x10B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitCANPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: H14, peripheral: CAN2, signal: TX, pin_signal: GPIO_AD_B0_14}\n  - {pin_num: L10, peripheral: CAN2, signal: RX, pin_signal: GPIO_AD_B0_15}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitCANPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitCANPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_14_FLEXCAN2_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_15_FLEXCAN2_RX, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitENETPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: A7, peripheral: ENET, signal: enet_mdc, pin_signal: GPIO_EMC_40}\n  - {pin_num: C7, peripheral: ENET, signal: enet_mdio, pin_signal: GPIO_EMC_41}\n  - {pin_num: B13, peripheral: ENET, signal: enet_ref_clk, pin_signal: GPIO_B1_10}\n  - {pin_num: E12, peripheral: ENET, signal: 'enet_rx_data, 0', pin_signal: GPIO_B1_04}\n  - {pin_num: D12, peripheral: ENET, signal: 'enet_rx_data, 1', pin_signal: GPIO_B1_05}\n  - {pin_num: C12, peripheral: ENET, signal: enet_rx_en, pin_signal: GPIO_B1_06}\n  - {pin_num: C13, peripheral: ENET, signal: enet_rx_er, pin_signal: GPIO_B1_11}\n  - {pin_num: B12, peripheral: ENET, signal: 'enet_tx_data, 0', pin_signal: GPIO_B1_07}\n  - {pin_num: A12, peripheral: ENET, signal: 'enet_tx_data, 1', pin_signal: GPIO_B1_08}\n  - {pin_num: A13, peripheral: ENET, signal: enet_tx_en, pin_signal: GPIO_B1_09}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitENETPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitENETPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_04_ENET_RX_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_05_ENET_RX_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_06_ENET_RX_EN, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_07_ENET_TX_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_08_ENET_TX_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_09_ENET_TX_EN, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_10_ENET_REF_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_11_ENET_RX_ER, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_40_ENET_MDC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_41_ENET_MDIO, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSDHCPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: J2, peripheral: USDHC1, signal: 'usdhc_data, 3', pin_signal: GPIO_SD_B0_05}\n  - {pin_num: H2, peripheral: USDHC1, signal: 'usdhc_data, 2', pin_signal: GPIO_SD_B0_04}\n  - {pin_num: K1, peripheral: USDHC1, signal: 'usdhc_data, 1', pin_signal: GPIO_SD_B0_03}\n  - {pin_num: J1, peripheral: USDHC1, signal: 'usdhc_data, 0', pin_signal: GPIO_SD_B0_02}\n  - {pin_num: J4, peripheral: USDHC1, signal: usdhc_cmd, pin_signal: GPIO_SD_B0_00}\n  - {pin_num: J3, peripheral: USDHC1, signal: usdhc_clk, pin_signal: GPIO_SD_B0_01}\n  - {pin_num: C14, peripheral: USDHC1, signal: usdhc_vselect, pin_signal: GPIO_B1_14}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSDHCPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitUSDHCPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_14_USDHC1_VSELECT, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitQSPIPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: P3, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08}\n  - {pin_num: N4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_09}\n  - {pin_num: P4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_10}\n  - {pin_num: P5, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_11}\n  - {pin_num: L4, peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07}\n  - {pin_num: L3, peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_06}\n  - {pin_num: N3, peripheral: FLEXSPI, signal: FLEXSPI_A_DQS, pin_signal: GPIO_SD_B1_05}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitQSPIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitQSPIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_05_FLEXSPIA_DQS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03, 0U);\n}\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define BOARD_INITPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK 0x0200U /*!< GPIO1 and GPIO6 share same IO MUX function, GPIO_MUX1 selects one GPIO function: affected bits mask */\n\n/* GPIO_AD_B0_09 (coord F14), JTAG_TDI/J21[5]/ENET_RST/J22[5] */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO1   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                   gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                       9U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN                                      9U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN_MASK                         (1U << 9U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_LED_PORT                                       GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_PIN                                           9U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_LED_PIN_MASK                              (1U << 9U)   /*!< PORT pin mask */\n\n/* WAKEUP (coord L6), SD_PWREN */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO5   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    0U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO5   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   0U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 0U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO5   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        0U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_BUTTON_PIN_MASK                           (1U << 0U)   /*!< PORT pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/* GPIO_AD_B0_12 (coord K14), UART1_TXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_SIGNAL                             TX   /*!< Signal name */\n\n/* GPIO_AD_B0_13 (coord L14), UART1_RXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_SIGNAL                             RX   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n/* GPIO_EMC_09 (coord C2), SEMC_A0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A0_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A0_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A0_CHANNEL                                   0U   /*!< Signal channel */\n\n/* GPIO_EMC_10 (coord G1), SEMC_A1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A1_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A1_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A1_CHANNEL                                   1U   /*!< Signal channel */\n\n/* GPIO_EMC_11 (coord G3), SEMC_A2 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A2_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A2_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A2_CHANNEL                                   2U   /*!< Signal channel */\n\n/* GPIO_EMC_12 (coord H1), SEMC_A3 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A3_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A3_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A3_CHANNEL                                   3U   /*!< Signal channel */\n\n/* GPIO_EMC_13 (coord A6), SEMC_A4 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A4_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A4_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A4_CHANNEL                                   4U   /*!< Signal channel */\n\n/* GPIO_EMC_14 (coord B6), SEMC_A5 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A5_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A5_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A5_CHANNEL                                   5U   /*!< Signal channel */\n\n/* GPIO_EMC_15 (coord B1), SEMC_A6 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A6_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A6_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A6_CHANNEL                                   6U   /*!< Signal channel */\n\n/* GPIO_EMC_16 (coord A5), SEMC_A7 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A7_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A7_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A7_CHANNEL                                   7U   /*!< Signal channel */\n\n/* GPIO_EMC_17 (coord A4), SEMC_A8 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A8_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A8_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A8_CHANNEL                                   8U   /*!< Signal channel */\n\n/* GPIO_EMC_18 (coord B2), SEMC_A9 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A9_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A9_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A9_CHANNEL                                   9U   /*!< Signal channel */\n\n/* GPIO_EMC_23 (coord G2), SEMC_A10 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A10_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A10_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A10_CHANNEL                                 10U   /*!< Signal channel */\n\n/* GPIO_EMC_19 (coord B4), SEMC_A11 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A11_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A11_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A11_CHANNEL                                 11U   /*!< Signal channel */\n\n/* GPIO_EMC_20 (coord A3), SEMC_A12 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A12_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A12_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A12_CHANNEL                                 12U   /*!< Signal channel */\n\n/* GPIO_EMC_21 (coord C1), SEMC_BA0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_SIGNAL                                   BA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_22 (coord F1), SEMC_BA1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_SIGNAL                                   BA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_EMC_24 (coord D3), SEMC_CAS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_SIGNAL                             semc_cas   /*!< Signal name */\n\n/* GPIO_EMC_27 (coord A2), SEMC_CKE */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_SIGNAL                             semc_cke   /*!< Signal name */\n\n/* GPIO_EMC_26 (coord B3), SEMC_CLK */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_SIGNAL                             semc_clk   /*!< Signal name */\n\n/* GPIO_EMC_00 (coord E3), SEMC_D0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D0_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D0_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D0_CHANNEL                                   0U   /*!< Signal channel */\n\n/* GPIO_EMC_01 (coord F3), SEMC_D1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D1_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D1_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D1_CHANNEL                                   1U   /*!< Signal channel */\n\n/* GPIO_EMC_02 (coord F4), SEMC_D2 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D2_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D2_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D2_CHANNEL                                   2U   /*!< Signal channel */\n\n/* GPIO_EMC_03 (coord G4), SEMC_D3 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D3_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D3_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D3_CHANNEL                                   3U   /*!< Signal channel */\n\n/* GPIO_EMC_04 (coord F2), SEMC_D4 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D4_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D4_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D4_CHANNEL                                   4U   /*!< Signal channel */\n\n/* GPIO_EMC_05 (coord G5), SEMC_D5 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D5_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D5_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D5_CHANNEL                                   5U   /*!< Signal channel */\n\n/* GPIO_EMC_06 (coord H5), SEMC_D6 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D6_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D6_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D6_CHANNEL                                   6U   /*!< Signal channel */\n\n/* GPIO_EMC_07 (coord H4), SEMC_D7 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D7_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D7_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D7_CHANNEL                                   7U   /*!< Signal channel */\n\n/* GPIO_EMC_30 (coord C6), SEMC_D8 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D8_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D8_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D8_CHANNEL                                   8U   /*!< Signal channel */\n\n/* GPIO_EMC_31 (coord C5), SEMC_D9 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D9_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D9_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D9_CHANNEL                                   9U   /*!< Signal channel */\n\n/* GPIO_EMC_32 (coord D5), SEMC_D10 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D10_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D10_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D10_CHANNEL                                 10U   /*!< Signal channel */\n\n/* GPIO_EMC_33 (coord C4), SEMC_D11 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D11_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D11_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D11_CHANNEL                                 11U   /*!< Signal channel */\n\n/* GPIO_EMC_34 (coord D4), SEMC_D12 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D12_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D12_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D12_CHANNEL                                 12U   /*!< Signal channel */\n\n/* GPIO_EMC_35 (coord E5), SEMC_D13 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D13_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D13_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D13_CHANNEL                                 13U   /*!< Signal channel */\n\n/* GPIO_EMC_36 (coord C3), SEMC_D14 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D14_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D14_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D14_CHANNEL                                 14U   /*!< Signal channel */\n\n/* GPIO_EMC_37 (coord E4), SEMC_D15 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D15_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D15_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D15_CHANNEL                                 15U   /*!< Signal channel */\n\n/* GPIO_EMC_08 (coord H3), SEMC_DM0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_SIGNAL                                   DM   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_38 (coord D6), SEMC_DM1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_SIGNAL                                   DM   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_EMC_25 (coord D2), SEMC_RAS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_SIGNAL                             semc_ras   /*!< Signal name */\n\n/* GPIO_EMC_28 (coord D1), SEMC_WE */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_WE_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_WE_SIGNAL                               semc_we   /*!< Signal name */\n\n/* GPIO_EMC_29 (coord E1), SEMC_CS0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_SIGNAL                                   CS   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_39 (coord B7), SEMC_DQS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DQS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DQS_SIGNAL                             semc_dqs   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSDRAMPins(void);\n\n#define BOARD_INITCSIPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK 0x10U /*!< GPIO1 and GPIO6 share same IO MUX function, GPIO_MUX1 selects one GPIO function: affected bits mask */\n\n/* GPIO_AD_B1_08 (coord H13), AUD_INT/CSI_D9//J35[13]/J22[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D9_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D9_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D9_CHANNEL                                      9U   /*!< Signal channel */\n\n/* GPIO_AD_B1_09 (coord M13), SAI1_MCLK/CSI_D8/J35[11] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D8_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D8_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D8_CHANNEL                                      8U   /*!< Signal channel */\n\n/* GPIO_AD_B1_10 (coord L13), SAI1_RX_SYNC/CSI_D7/J35[9]/J23[1] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D7_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D7_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D7_CHANNEL                                      7U   /*!< Signal channel */\n\n/* GPIO_AD_B1_11 (coord J13), SAI1_RX_BCLK/CSI_D6/J35[7]/J23[2] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D6_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D6_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D6_CHANNEL                                      6U   /*!< Signal channel */\n\n/* GPIO_AD_B1_12 (coord H12), SAI1_RXD/CSI_D5/J35[5]/U13[16] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D5_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D5_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D5_CHANNEL                                      5U   /*!< Signal channel */\n\n/* GPIO_AD_B1_13 (coord H11), SAI1_TXD/CSI_D4/J35[3]/U13[14] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D4_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D4_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D4_CHANNEL                                      4U   /*!< Signal channel */\n\n/* GPIO_AD_B1_15 (coord J14), SAI1_TX_SYNC/CSI_D2/J35[6]/U13[13] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D2_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D2_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D2_CHANNEL                                      2U   /*!< Signal channel */\n\n/* GPIO_AD_B1_14 (coord G12), SAI1_TX_BCLK/CSI_D3/J35[4]/U13[12] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D3_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D3_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D3_CHANNEL                                      3U   /*!< Signal channel */\n\n/* GPIO_AD_B1_04 (coord L12), CSI_PIXCLK/J35[8]/J23[3] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_PIXCLK_PERIPHERAL                              CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_PIXCLK_SIGNAL                           csi_pixclk   /*!< Signal name */\n\n/* GPIO_AD_B1_05 (coord K12), CSI_MCLK/J35[12]/J23[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_MCLK_PERIPHERAL                                CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_MCLK_SIGNAL                               csi_mclk   /*!< Signal name */\n\n/* GPIO_AD_B1_06 (coord J12), CSI_VSYNC/J35[18]/J22[2]/UART_TX */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_VSYNC_PERIPHERAL                               CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_VSYNC_SIGNAL                             csi_vsync   /*!< Signal name */\n\n/* GPIO_AD_B1_07 (coord K10), CSI_HSYNC/J35[16]/J22[1]/UART_RX */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_HSYNC_PERIPHERAL                               CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_HSYNC_SIGNAL                             csi_hsync   /*!< Signal name */\n\n/* GPIO_AD_B1_00 (coord J11), I2C1_SCL/CSI_I2C_SCL/J35[20]/J23[6]/U13[17]/U32[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_I2C_SCL_PERIPHERAL                          LPI2C1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_I2C_SCL_SIGNAL                                 SCL   /*!< Signal name */\n\n/* GPIO_AD_B1_01 (coord K11), I2C1_SDA/CSI_I2C_SDA/J35[22]/J23[5]/U13[18]/U32[6] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_I2C_SDA_PERIPHERAL                          LPI2C1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_I2C_SDA_SIGNAL                                 SDA   /*!< Signal name */\n\n/* GPIO_AD_B0_04 (coord F11), CSI_PWDN/J35[17]/BOOT_MODE[0] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_PWDN_PERIPHERAL                              GPIO1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_PWDN_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_PWDN_CHANNEL                                    4U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO                                    GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO_PIN                                   4U   /*!< GPIO pin number */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO_PIN_MASK                      (1U << 4U)   /*!< GPIO pin mask */\n#define BOARD_INITCSIPINS_CSI_PWDN_PORT                                    GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITCSIPINS_CSI_PWDN_PIN                                        4U   /*!< PORT pin number */\n#define BOARD_INITCSIPINS_CSI_PWDN_PIN_MASK                           (1U << 4U)   /*!< PORT pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitCSIPins(void);\n\n#define BOARD_INITLCDPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK 0x04U /*!< GPIO1 and GPIO6 share same IO MUX function, GPIO_MUX1 selects one GPIO function: affected bits mask */\n#define BOARD_INITLCDPINS_IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL_MASK 0x80000000U /*!< GPIO2 and GPIO7 share same IO MUX function, GPIO_MUX2 selects one GPIO function: affected bits mask */\n\n/* GPIO_B0_04 (coord C8), LCDIF_D0/BT_CFG[0] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D0_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D0_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_B0_05 (coord B8), LCDIF_D1/BT_CFG[1] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D1_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D1_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_B0_06 (coord A8), LCDIF_D2/BT_CFG[2] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D2_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D2_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_B0_00 (coord D7), LCDIF_CLK */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_CLK_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_CLK_SIGNAL                             lcdif_clk   /*!< Signal name */\n\n/* GPIO_B0_07 (coord A9), LCDIF_D3/BT_CFG[3] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D3_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D3_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_B0_08 (coord B9), LCDIF_D4/BT_CFG[4] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D4_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D4_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D4_CHANNEL                                    4U   /*!< Signal channel */\n\n/* GPIO_B0_09 (coord C9), LCDIF_D5/BT_CFG[5] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D5_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D5_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D5_CHANNEL                                    5U   /*!< Signal channel */\n\n/* GPIO_B0_10 (coord D9), LCDIF_D6/BT_CFG[6] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D6_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D6_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D6_CHANNEL                                    6U   /*!< Signal channel */\n\n/* GPIO_B0_11 (coord A10), LCDIF_D7/BT_CFG[7] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D7_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D7_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D7_CHANNEL                                    7U   /*!< Signal channel */\n\n/* GPIO_B0_12 (coord C10), LCDIF_D8/BT_CFG[8] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D8_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D8_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D8_CHANNEL                                    8U   /*!< Signal channel */\n\n/* GPIO_B0_13 (coord D10), LCDIF_D9/BT_CFG[9] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D9_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D9_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D9_CHANNEL                                    9U   /*!< Signal channel */\n\n/* GPIO_B0_14 (coord E10), LCDIF_D10/BT_CFG[10] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D10_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D10_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D10_CHANNEL                                  10U   /*!< Signal channel */\n\n/* GPIO_B0_15 (coord E11), LCDIF_D11/BT_CFG[11] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D11_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D11_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D11_CHANNEL                                  11U   /*!< Signal channel */\n\n/* GPIO_B1_00 (coord A11), LCDIF_D12 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D12_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D12_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D12_CHANNEL                                  12U   /*!< Signal channel */\n\n/* GPIO_B1_01 (coord B11), LCDIF_D13 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D13_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D13_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D13_CHANNEL                                  13U   /*!< Signal channel */\n\n/* GPIO_B1_02 (coord C11), LCDIF_D14 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D14_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D14_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D14_CHANNEL                                  14U   /*!< Signal channel */\n\n/* GPIO_B1_03 (coord D11), LCDIF_D15 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D15_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D15_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D15_CHANNEL                                  15U   /*!< Signal channel */\n\n/* GPIO_B0_01 (coord E7), LCDIF_ENABLE */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_ENABLE_PERIPHERAL                          LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_ENABLE_SIGNAL                       lcdif_enable   /*!< Signal name */\n\n/* GPIO_B0_02 (coord E8), LCDIF_HSYNC */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_HSYNC_PERIPHERAL                           LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_HSYNC_SIGNAL                         lcdif_hsync   /*!< Signal name */\n\n/* GPIO_B0_03 (coord D8), LCDIF_VSYNC */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_VSYNC_PERIPHERAL                           LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_VSYNC_SIGNAL                         lcdif_vsync   /*!< Signal name */\n\n/* GPIO_B1_15 (coord B14), USB_HOST_PWR/BACKLIGHT_CTL */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PERIPHERAL                         GPIO2   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_SIGNAL                           gpio_io   /*!< Signal name */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_CHANNEL                              31U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO                               GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO_PIN                             31U   /*!< GPIO pin number */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO_PIN_MASK                (1U << 31U)   /*!< GPIO pin mask */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PORT                               GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PIN                                  31U   /*!< PORT pin number */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PIN_MASK                     (1U << 31U)   /*!< PORT pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLCDPins(void);\n\n/* GPIO_AD_B0_14 (coord H14), CAN2_TX/U12[1] */\n/* Routed pin properties */\n#define BOARD_INITCANPINS_CAN2_TX_PERIPHERAL                                CAN2   /*!< Peripheral name */\n#define BOARD_INITCANPINS_CAN2_TX_SIGNAL                                      TX   /*!< Signal name */\n\n/* GPIO_AD_B0_15 (coord L10), CAN2_RX/U12[4] */\n/* Routed pin properties */\n#define BOARD_INITCANPINS_CAN2_RX_PERIPHERAL                                CAN2   /*!< Peripheral name */\n#define BOARD_INITCANPINS_CAN2_RX_SIGNAL                                      RX   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitCANPins(void);\n\n/* GPIO_EMC_40 (coord A7), ENET_MDC */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_MDC_PERIPHERAL                              ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_MDC_SIGNAL                              enet_mdc   /*!< Signal name */\n\n/* GPIO_EMC_41 (coord C7), ENET_MDIO */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_MDIO_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_MDIO_SIGNAL                            enet_mdio   /*!< Signal name */\n\n/* GPIO_B1_10 (coord B13), ENET_TX_CLK */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TX_CLK_PERIPHERAL                           ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TX_CLK_SIGNAL                       enet_ref_clk   /*!< Signal name */\n\n/* GPIO_B1_04 (coord E12), ENET_RXD0 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXD0_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXD0_SIGNAL                         enet_rx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RXD0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_B1_05 (coord D12), ENET_RXD1 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXD1_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXD1_SIGNAL                         enet_rx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RXD1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_B1_06 (coord C12), ENET_CRS_DV */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_CRS_DV_PERIPHERAL                           ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_CRS_DV_SIGNAL                         enet_rx_en   /*!< Signal name */\n\n/* GPIO_B1_11 (coord C13), ENET_RXER */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXER_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXER_SIGNAL                           enet_rx_er   /*!< Signal name */\n\n/* GPIO_B1_07 (coord B12), ENET_TXD0 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXD0_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXD0_SIGNAL                         enet_tx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_TXD0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_B1_08 (coord A12), ENET_TXD1 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXD1_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXD1_SIGNAL                         enet_tx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_TXD1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_B1_09 (coord A13), ENET_TXEN */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXEN_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXEN_SIGNAL                           enet_tx_en   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitENETPins(void);\n\n/* GPIO_SD_B0_05 (coord J2), SD1_D3 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D3_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D3_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_SD_B0_04 (coord H2), SD1_D2 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D2_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D2_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_SD_B0_03 (coord K1), SD1_D1/J24[5]/SPI_MISO */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D1_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D1_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_SD_B0_02 (coord J1), SD1_D0/J24[4]/SPI_MOSI/PWM */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D0_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D0_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_SD_B0_00 (coord J4), SD1_CMD/J24[6] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CMD_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CMD_SIGNAL                             usdhc_cmd   /*!< Signal name */\n\n/* GPIO_SD_B0_01 (coord J3), SD1_CLK/J24[3] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CLK_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CLK_SIGNAL                             usdhc_clk   /*!< Signal name */\n\n/* GPIO_B1_14 (coord C14), SD0_VSELECT */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD0_VSELECT_PERIPHERAL                        USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD0_VSELECT_SIGNAL                     usdhc_vselect   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSDHCPins(void);\n\n/* GPIO_SD_B1_08 (coord P3), FlexSPI_D0_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_SIGNAL                   FLEXSPI_A_DATA0   /*!< Signal name */\n\n/* GPIO_SD_B1_09 (coord N4), FlexSPI_D1_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_SIGNAL                   FLEXSPI_A_DATA1   /*!< Signal name */\n\n/* GPIO_SD_B1_10 (coord P4), FlexSPI_D2_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_SIGNAL                   FLEXSPI_A_DATA2   /*!< Signal name */\n\n/* GPIO_SD_B1_11 (coord P5), FlexSPI_D3_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_SIGNAL                   FLEXSPI_A_DATA3   /*!< Signal name */\n\n/* GPIO_SD_B1_07 (coord L4), FlexSPI_CLK */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_SIGNAL                     FLEXSPI_A_SCLK   /*!< Signal name */\n\n/* GPIO_SD_B1_06 (coord L3), FlexSPI_SS0 */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_SIGNAL                    FLEXSPI_A_SS0_B   /*!< Signal name */\n\n/* GPIO_SD_B1_05 (coord N3), FlexSPI_DQS */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_DQS_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_DQS_SIGNAL                      FLEXSPI_A_DQS   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitQSPIPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/board.cmake",
    "content": "set(MCU_FAMILY RT1060)\nset(MCU_VARIANT MIMXRT1062)\n\nset(JLINK_DEVICE MIMXRT1062xxx6A)\n#set(JLINK_OPTION \"-USB 000726129165\")\nset(PYOCD_TARGET mimxrt1060)\nset(NXPLINK_DEVICE MIMXRT1062xxxxA:EVK-MIMXRT1060)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkmimxrt1060_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1062DVL6A\n    BOARD_TUD_RHPORT=0\n    BOARD_TUH_RHPORT=1\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: i.MX RT1060 Evaluation Kit revB\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/MIMXRT1060-EVKB\n*/\n\n#ifndef BOARD_MIMXRT1060_EVKB_H_\n#define BOARD_MIMXRT1060_EVKB_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (0x800000U)\n\n// LED: IOMUXC_GPIO_AD_B0_09_GPIO1_IO09\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// SW8 button: IOMUXC_SNVS_WAKEUP_GPIO5_IO00\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_PERIPHERAL\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_CHANNEL\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: IOMUXC_GPIO_AD_B0_13_LPUART1_RX, IOMUXC_GPIO_AD_B0_12_LPUART1_TX\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1062DVL6A\nMCU_FAMILY = RT1060\nMCU_VARIANT = MIMXRT1062\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1062xxx6A\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1060\n\nBOARD_TUD_RHPORT = 0\nBOARD_TUH_RHPORT = 1\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/evkmimxrt1060_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkmimxrt1060_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\")))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock\n            .sflashPadType = kSerialFlash_4Pads,\n            .serialClkFreq = kFlexSpiSerialClk_100MHz,\n            .sflashA1Size  = 8u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 256u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/evkmimxrt1060_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__\n#define __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_120MHz = 7,\n    kFlexSpiSerialClk_133MHz = 8,\n    kFlexSpiSerialClk_166MHz = 9,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1060_evk/mimxrt1060_evk.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1060-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13 http://mcuxpresso.nxp.com/XSD/mex_configuration_13.xsd\" uuid=\"2174caba-38fe-48d5-8f89-42a23354d23b\" version=\"13\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1062xxxxA</processor>\n      <package>MIMXRT1062DVL6A</package>\n      <board>MIMXRT1060-EVK</board>\n      <board_revision>A2</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>false</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"13.1\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>13.0.2</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"F14\" pin_signal=\"GPIO_AD_B0_09\" label=\"JTAG_TDI/J21[5]/ENET_RST/J22[5]\" identifier=\"USER_LED\"/>\n               <pin_label pin_num=\"L6\" pin_signal=\"WAKEUP\" label=\"SD_PWREN\" identifier=\"USER_BUTTON\"/>\n            </pin_labels>\n            <power_domains/>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO5\" description=\"Peripheral GPIO5 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 09\" pin_num=\"F14\" pin_signal=\"GPIO_AD_B0_09\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO5\" signal=\"gpio_io, 00\" pin_num=\"L6\" pin_signal=\"WAKEUP\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"TX\" pin_num=\"K14\" pin_signal=\"GPIO_AD_B0_12\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART1\" signal=\"RX\" pin_num=\"L14\" pin_signal=\"GPIO_AD_B0_13\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSDRAMPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SEMC\" description=\"Peripheral SEMC is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 00\" pin_num=\"C2\" pin_signal=\"GPIO_EMC_09\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 01\" pin_num=\"G1\" pin_signal=\"GPIO_EMC_10\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 02\" pin_num=\"G3\" pin_signal=\"GPIO_EMC_11\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 03\" pin_num=\"H1\" pin_signal=\"GPIO_EMC_12\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 04\" pin_num=\"A6\" pin_signal=\"GPIO_EMC_13\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 05\" pin_num=\"B6\" pin_signal=\"GPIO_EMC_14\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 06\" pin_num=\"B1\" pin_signal=\"GPIO_EMC_15\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 07\" pin_num=\"A5\" pin_signal=\"GPIO_EMC_16\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 08\" pin_num=\"A4\" pin_signal=\"GPIO_EMC_17\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 09\" pin_num=\"B2\" pin_signal=\"GPIO_EMC_18\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 10\" pin_num=\"G2\" pin_signal=\"GPIO_EMC_23\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 11\" pin_num=\"B4\" pin_signal=\"GPIO_EMC_19\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 12\" pin_num=\"A3\" pin_signal=\"GPIO_EMC_20\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 0\" pin_num=\"C1\" pin_signal=\"GPIO_EMC_21\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 1\" pin_num=\"F1\" pin_signal=\"GPIO_EMC_22\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cas\" pin_num=\"D3\" pin_signal=\"GPIO_EMC_24\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cke\" pin_num=\"A2\" pin_signal=\"GPIO_EMC_27\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_clk\" pin_num=\"B3\" pin_signal=\"GPIO_EMC_26\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 00\" pin_num=\"E3\" pin_signal=\"GPIO_EMC_00\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 01\" pin_num=\"F3\" pin_signal=\"GPIO_EMC_01\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 02\" pin_num=\"F4\" pin_signal=\"GPIO_EMC_02\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 03\" pin_num=\"G4\" pin_signal=\"GPIO_EMC_03\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 04\" pin_num=\"F2\" pin_signal=\"GPIO_EMC_04\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 05\" pin_num=\"G5\" pin_signal=\"GPIO_EMC_05\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 06\" pin_num=\"H5\" pin_signal=\"GPIO_EMC_06\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 07\" pin_num=\"H4\" pin_signal=\"GPIO_EMC_07\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 08\" pin_num=\"C6\" pin_signal=\"GPIO_EMC_30\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 09\" pin_num=\"C5\" pin_signal=\"GPIO_EMC_31\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 10\" pin_num=\"D5\" pin_signal=\"GPIO_EMC_32\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 11\" pin_num=\"C4\" pin_signal=\"GPIO_EMC_33\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 12\" pin_num=\"D4\" pin_signal=\"GPIO_EMC_34\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 13\" pin_num=\"E5\" pin_signal=\"GPIO_EMC_35\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 14\" pin_num=\"C3\" pin_signal=\"GPIO_EMC_36\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 15\" pin_num=\"E4\" pin_signal=\"GPIO_EMC_37\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 0\" pin_num=\"H3\" pin_signal=\"GPIO_EMC_08\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 1\" pin_num=\"D6\" pin_signal=\"GPIO_EMC_38\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_ras\" pin_num=\"D2\" pin_signal=\"GPIO_EMC_25\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_we\" pin_num=\"D1\" pin_signal=\"GPIO_EMC_28\"/>\n                  <pin peripheral=\"SEMC\" signal=\"CS, 0\" pin_num=\"E1\" pin_signal=\"GPIO_EMC_29\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_dqs\" pin_num=\"B7\" pin_signal=\"GPIO_EMC_39\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitCSIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"CSI\" description=\"Peripheral CSI is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPI2C1\" description=\"Peripheral LPI2C1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 09\" pin_num=\"H13\" pin_signal=\"GPIO_AD_B1_08\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 08\" pin_num=\"M13\" pin_signal=\"GPIO_AD_B1_09\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 07\" pin_num=\"L13\" pin_signal=\"GPIO_AD_B1_10\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 06\" pin_num=\"J13\" pin_signal=\"GPIO_AD_B1_11\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 05\" pin_num=\"H12\" pin_signal=\"GPIO_AD_B1_12\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 04\" pin_num=\"H11\" pin_signal=\"GPIO_AD_B1_13\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 02\" pin_num=\"J14\" pin_signal=\"GPIO_AD_B1_15\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 03\" pin_num=\"G12\" pin_signal=\"GPIO_AD_B1_14\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_pixclk\" pin_num=\"L12\" pin_signal=\"GPIO_AD_B1_04\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_mclk\" pin_num=\"K12\" pin_signal=\"GPIO_AD_B1_05\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_vsync\" pin_num=\"J12\" pin_signal=\"GPIO_AD_B1_06\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_hsync\" pin_num=\"K10\" pin_signal=\"GPIO_AD_B1_07\"/>\n                  <pin peripheral=\"LPI2C1\" signal=\"SCL\" pin_num=\"J11\" pin_signal=\"GPIO_AD_B1_00\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"CSI_I2C_SCL\"/>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_22K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Enable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPI2C1\" signal=\"SDA\" pin_num=\"K11\" pin_signal=\"GPIO_AD_B1_01\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"CSI_I2C_SDA\"/>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_22K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Enable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 04\" pin_num=\"F11\" pin_signal=\"GPIO_AD_B0_04\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLCDPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LCDIF\" description=\"Peripheral LCDIF is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 00\" pin_num=\"C8\" pin_signal=\"GPIO_B0_04\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 01\" pin_num=\"B8\" pin_signal=\"GPIO_B0_05\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 02\" pin_num=\"A8\" pin_signal=\"GPIO_B0_06\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_clk\" pin_num=\"D7\" pin_signal=\"GPIO_B0_00\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 03\" pin_num=\"A9\" pin_signal=\"GPIO_B0_07\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 04\" pin_num=\"B9\" pin_signal=\"GPIO_B0_08\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 05\" pin_num=\"C9\" pin_signal=\"GPIO_B0_09\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 06\" pin_num=\"D9\" pin_signal=\"GPIO_B0_10\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 07\" pin_num=\"A10\" pin_signal=\"GPIO_B0_11\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 08\" pin_num=\"C10\" pin_signal=\"GPIO_B0_12\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 09\" pin_num=\"D10\" pin_signal=\"GPIO_B0_13\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 10\" pin_num=\"E10\" pin_signal=\"GPIO_B0_14\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 11\" pin_num=\"E11\" pin_signal=\"GPIO_B0_15\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 12\" pin_num=\"A11\" pin_signal=\"GPIO_B1_00\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 13\" pin_num=\"B11\" pin_signal=\"GPIO_B1_01\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 14\" pin_num=\"C11\" pin_signal=\"GPIO_B1_02\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 15\" pin_num=\"D11\" pin_signal=\"GPIO_B1_03\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_enable\" pin_num=\"E7\" pin_signal=\"GPIO_B0_01\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_hsync\" pin_num=\"E8\" pin_signal=\"GPIO_B0_02\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_vsync\" pin_num=\"D8\" pin_signal=\"GPIO_B0_03\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 31\" pin_num=\"B14\" pin_signal=\"GPIO_B1_15\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 02\" pin_num=\"M11\" pin_signal=\"GPIO_AD_B0_02\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitCANPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"CAN2\" description=\"Peripheral CAN2 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"CAN2\" signal=\"TX\" pin_num=\"H14\" pin_signal=\"GPIO_AD_B0_14\"/>\n                  <pin peripheral=\"CAN2\" signal=\"RX\" pin_num=\"L10\" pin_signal=\"GPIO_AD_B0_15\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitENETPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"ENET\" description=\"Peripheral ENET is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdc\" pin_num=\"A7\" pin_signal=\"GPIO_EMC_40\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdio\" pin_num=\"C7\" pin_signal=\"GPIO_EMC_41\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_ref_clk\" pin_num=\"B13\" pin_signal=\"GPIO_B1_10\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 0\" pin_num=\"E12\" pin_signal=\"GPIO_B1_04\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 1\" pin_num=\"D12\" pin_signal=\"GPIO_B1_05\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_en\" pin_num=\"C12\" pin_signal=\"GPIO_B1_06\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_er\" pin_num=\"C13\" pin_signal=\"GPIO_B1_11\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 0\" pin_num=\"B12\" pin_signal=\"GPIO_B1_07\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 1\" pin_num=\"A12\" pin_signal=\"GPIO_B1_08\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_en\" pin_num=\"A13\" pin_signal=\"GPIO_B1_09\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSDHCPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USDHC1\" description=\"Peripheral USDHC1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 3\" pin_num=\"J2\" pin_signal=\"GPIO_SD_B0_05\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 2\" pin_num=\"H2\" pin_signal=\"GPIO_SD_B0_04\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 1\" pin_num=\"K1\" pin_signal=\"GPIO_SD_B0_03\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 0\" pin_num=\"J1\" pin_signal=\"GPIO_SD_B0_02\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_cmd\" pin_num=\"J4\" pin_signal=\"GPIO_SD_B0_00\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_clk\" pin_num=\"J3\" pin_signal=\"GPIO_SD_B0_01\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_vselect\" pin_num=\"C14\" pin_signal=\"GPIO_B1_14\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitQSPIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXSPI\" description=\"Peripheral FLEXSPI is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA0\" pin_num=\"P3\" pin_signal=\"GPIO_SD_B1_08\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA1\" pin_num=\"N4\" pin_signal=\"GPIO_SD_B1_09\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA2\" pin_num=\"P4\" pin_signal=\"GPIO_SD_B1_10\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA3\" pin_num=\"P5\" pin_signal=\"GPIO_SD_B1_11\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SCLK\" pin_num=\"L4\" pin_signal=\"GPIO_SD_B1_07\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SS0_B\" pin_num=\"L3\" pin_signal=\"GPIO_SD_B1_06\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DQS\" pin_num=\"N3\" pin_signal=\"GPIO_SD_B1_05\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"11.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>13.0.2</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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"AHB_CLK_ROOT.outFreq\" value=\"600 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN_CLK_ROOT.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI_CLK_ROOT.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET2_125M_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_125M_CLK.outFreq\" value=\"2.4 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_25M_REF_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO2_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI2_CLK_ROOT.outFreq\" value=\"1440/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"1440/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"150 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LCDIF_CLK_ROOT.outFreq\" value=\"67.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LVDS1_CLK.outFreq\" value=\"1.2 GHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PLL7_MAIN_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SEMC_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY1_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY2_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC1_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC2_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.ARM_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI2_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI2_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.LCDIF_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.LCDIF_PRED.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.SEMC_PODF.scale\" value=\"8\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_BYPASS.sel\" value=\"CCM_ANALOG.PLL1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_PREDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_VDIV.scale\" value=\"50\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"33\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.denom\" value=\"50\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.div\" value=\"47\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.denom\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.div\" value=\"31\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.num\" value=\"0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_BYPASS.sel\" value=\"CCM_ANALOG.PLL5_POST_DIV\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_POST_DIV.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL7_BYPASS.sel\" value=\"CCM_ANALOG.PLL7\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.VIDEO_DIV.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_POWERDOWN_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG\" value=\"No\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"96c1cec6-3bd3-47a2-8301-f38e4b0dd25f\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"CAN\" uuid=\"eb0900eb-d552-4097-9dcf-a07e592a887f\" type=\"flexcan\" type_id=\"flexcan_ba45456ec815807245205237e2bf425b\" mode=\"interrupts\" peripheral=\"CAN2\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"interruptsCfg\">\n                        <setting name=\"messageBufferIrqs\" value=\"0\"/>\n                        <setting name=\"messageBufferIrqs2\" value=\"0\"/>\n                        <set name=\"interruptsEnable\">\n                           <selected/>\n                        </set>\n                        <setting name=\"enable_irq\" value=\"false\"/>\n                        <struct name=\"interrupt_shared\">\n                           <setting name=\"IRQn\" value=\"CAN2_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"fsl_flexcan\" quick_selection=\"default\">\n                        <struct name=\"can_config\">\n                           <setting name=\"clockSource\" value=\"kFLEXCAN_ClkSrcOsc\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate\" value=\"1000000\"/>\n                           <setting name=\"maxMbNum\" value=\"16\"/>\n                           <setting name=\"enableLoopBack\" value=\"false\"/>\n                           <setting name=\"enableSelfWakeup\" value=\"false\"/>\n                           <setting name=\"enableIndividMask\" value=\"false\"/>\n                           <struct name=\"timingConfig\">\n                              <setting name=\"propSeg\" value=\"2\"/>\n                              <setting name=\"phaseSeg1\" value=\"4\"/>\n                              <setting name=\"phaseSeg2\" value=\"3\"/>\n                              <setting name=\"rJumpwidth\" value=\"2\"/>\n                              <struct name=\"bitTime\"/>\n                           </struct>\n                        </struct>\n                        <setting name=\"enableRxFIFO\" value=\"false\"/>\n                        <struct name=\"rxFIFO\">\n                           <setting name=\"idFilterTable\" value=\"\"/>\n                           <setting name=\"idFilterNum\" value=\"num0\"/>\n                           <setting name=\"idFilterType\" value=\"kFLEXCAN_RxFifoFilterTypeA\"/>\n                           <setting name=\"priority\" value=\"kFLEXCAN_RxFifoPrioLow\"/>\n                        </struct>\n                        <array name=\"channels\">\n                           <struct name=\"0\">\n                              <setting name=\"mbID\" value=\"0\"/>\n                              <setting name=\"mbType\" value=\"mbRx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                           <struct name=\"1\">\n                              <setting name=\"mbID\" value=\"1\"/>\n                              <setting name=\"mbType\" value=\"mbTx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                        </array>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI\" uuid=\"f67d9a64-c26d-4421-9805-a062b24146f2\" type=\"csi\" type_id=\"csi_3739ec1355c7b915be929f3b7e35095b\" mode=\"interrupt\" peripheral=\"CSI\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_csi\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"clockConfig\">\n                           <setting name=\"clockSource\" value=\"BusInterfaceClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"masterClockSource\" value=\"CsiClock\"/>\n                           <setting name=\"masterClockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        </struct>\n                        <struct name=\"config\">\n                           <setting name=\"format\" value=\"RGB565\"/>\n                           <setting name=\"i_width\" value=\"320\"/>\n                           <setting name=\"i_height\" value=\"240\"/>\n                           <setting name=\"dataBus\" value=\"kCSI_DataBus8Bit\"/>\n                           <setting name=\"workMode\" value=\"kCSI_GatedClockMode\"/>\n                           <setting name=\"useExtVsync\" value=\"true\"/>\n                           <set name=\"polarityFlags\">\n                              <selected/>\n                           </set>\n                           <struct name=\"buffers_config\">\n                              <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                              <setting name=\"bufCount\" value=\"4\"/>\n                              <setting name=\"bufferAlign\" value=\"64\"/>\n                           </struct>\n                        </struct>\n                        <struct name=\"interruptsCfg\">\n                           <setting name=\"isInterruptEnabled\" value=\"false\"/>\n                           <set name=\"interruptSources\">\n                              <selected/>\n                           </set>\n                           <struct name=\"interrupt\">\n                              <setting name=\"IRQn\" value=\"CSI_IRQn\"/>\n                              <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                              <setting name=\"enable_priority\" value=\"false\"/>\n                              <setting name=\"priority\" value=\"0\"/>\n                              <setting name=\"enable_custom_name\" value=\"false\"/>\n                           </struct>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI_LPI2C\" uuid=\"f2c6cd0a-751c-4424-9248-a4d98da47de7\" type=\"lpi2c\" type_id=\"lpi2c_db68d4f4f06a22e25ab51fe9bd6db4d2\" mode=\"master\" peripheral=\"LPI2C1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"main\" quick_selection=\"qs_interrupt\">\n                        <setting name=\"clockSource\" value=\"Lpi2cClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LPI2C1_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"master\" quick_selection=\"qs_master_transfer\">\n                        <setting name=\"mode\" value=\"transfer\"/>\n                        <struct name=\"config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"enableDoze\" value=\"true\"/>\n                           <setting name=\"debugEnable\" value=\"false\"/>\n                           <setting name=\"ignoreAck\" value=\"false\"/>\n                           <setting name=\"pinConfig\" value=\"kLPI2C_2PinOpenDrain\"/>\n                           <setting name=\"baudRate_Hz\" value=\"100000\"/>\n                           <setting name=\"busIdleTimeout_ns\" value=\"0\"/>\n                           <setting name=\"pinLowTimeout_ns\" value=\"0\"/>\n                           <setting name=\"sdaGlitchFilterWidth_ns\" value=\"0\"/>\n                           <setting name=\"sclGlitchFilterWidth_ns\" value=\"0\"/>\n                           <struct name=\"hostRequest\">\n                              <setting name=\"enable\" value=\"false\"/>\n                              <setting name=\"source\" value=\"kLPI2C_HostRequestExternalPin\"/>\n                              <setting name=\"polarity\" value=\"kLPI2C_HostRequestPinActiveHigh\"/>\n                           </struct>\n                           <set name=\"edmaRequestSources\">\n                              <selected/>\n                           </set>\n                        </struct>\n                        <struct name=\"transfer\">\n                           <setting name=\"blocking\" value=\"false\"/>\n                           <setting name=\"enable_custom_handle\" value=\"false\"/>\n                           <struct name=\"callback\">\n                              <setting name=\"name\" value=\"\"/>\n                              <setting name=\"userData\" value=\"\"/>\n                           </struct>\n                           <set name=\"flags\">\n                              <selected/>\n                           </set>\n                           <setting name=\"slaveAddress\" value=\"0\"/>\n                           <setting name=\"direction\" value=\"kLPI2C_Write\"/>\n                           <setting name=\"subaddress\" value=\"0\"/>\n                           <setting name=\"subaddressSize\" value=\"1\"/>\n                           <setting name=\"blocking_buffer\" value=\"false\"/>\n                           <setting name=\"enable_custom_buffer\" value=\"false\"/>\n                           <setting name=\"dataSize\" value=\"1\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"01f250e2-83d7-4b7b-a98d-772d1c3bdb42\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"BOARD_BootClockRUN\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LCD\" uuid=\"90a0c31d-6042-4687-af0f-0892536bc1ba\" type=\"elcdif\" type_id=\"elcdif_1c39bcb43ed1a24bc8980672c7378576\" mode=\"rgbMode\" peripheral=\"LCDIF\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_elcdif\">\n                        <struct name=\"config\">\n                           <setting name=\"panelWidthInt\" value=\"480\"/>\n                           <setting name=\"panelHeightInt\" value=\"272\"/>\n                           <setting name=\"hsw\" value=\"41\"/>\n                           <setting name=\"hfp\" value=\"4\"/>\n                           <setting name=\"hbp\" value=\"8\"/>\n                           <setting name=\"vsw\" value=\"10\"/>\n                           <setting name=\"vfp\" value=\"4\"/>\n                           <setting name=\"vbp\" value=\"3\"/>\n                           <setting name=\"frameRate\" value=\"60 Hz\"/>\n                           <setting name=\"clockSource\" value=\"LcdIfClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <struct name=\"polarityFlags_st\">\n                              <setting name=\"vSyncActive\" value=\"kELCDIF_VsyncActiveLow\"/>\n                              <setting name=\"hSyncActive\" value=\"kELCDIF_HsyncActiveLow\"/>\n                              <setting name=\"dataEnableActive\" value=\"kELCDIF_DataEnableActiveLow\"/>\n                              <setting name=\"driveDataClkEdge\" value=\"kELCDIF_DriveDataOnFallingClkEdge\"/>\n                           </struct>\n                           <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                           <setting name=\"bufferAlign\" value=\"64\"/>\n                           <setting name=\"pixelFormat\" value=\"kELCDIF_PixelFormatRGB565\"/>\n                           <setting name=\"dataBus\" value=\"kELCDIF_DataBus16Bit\"/>\n                           <setting name=\"enablePxpHandShake\" value=\"false\"/>\n                           <setting name=\"start\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"isInterruptEnabled\" value=\"true\"/>\n                        <set name=\"elcdifInterruptSources\">\n                           <selected>\n                              <id>kELCDIF_CurFrameDoneInterruptEnable</id>\n                           </selected>\n                        </set>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LCDIF_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"b31fa225-2a52-486b-9c5c-33a184a2c716\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"aa3cc953-557b-4557-b7fe-6fedc31acf98\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"8b3f852e-ee1e-45e9-abff-0ff722f1d65d\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"539d282e-5136-4289-9058-9a46b221ca45\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"6e4c02c4-0524-4905-91b5-01d2e2502186\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"c6d8fd36-2bbd-44c6-a160-54e7e12d0807\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"7d3626d3-4536-4838-a35d-3b8cf5a2bd71\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"738ea8df-6176-4e52-b4c7-b88aa9c17d13\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v15.0\nprocessor: MIMXRT1064xxxxA\npackage_id: MIMXRT1064DVL6A\nmcu_data: ksdk2_0\nprocessor_version: 24.12.10\nboard: MIMXRT1064-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: AHB_CLK_ROOT.outFreq, value: 600 MHz}\n- {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: CSI_CLK_ROOT.outFreq, value: 12 MHz}\n- {id: ENET2_125M_CLK.outFreq, value: 1.2 MHz}\n- {id: ENET_125M_CLK.outFreq, value: 2.4 MHz}\n- {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXIO2_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI2_CLK_ROOT.outFreq, value: 1440/11 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 1440/11 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 150 MHz}\n- {id: LCDIF_CLK_ROOT.outFreq, value: 67.5 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: LVDS1_CLK.outFreq, value: 1.2 GHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: PLL7_MAIN_CLK.outFreq, value: 480 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SEMC_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY1_CLK.outFreq, value: 480 MHz}\n- {id: USBPHY2_CLK.outFreq, value: 480 MHz}\n- {id: USDHC1_CLK_ROOT.outFreq, value: 198 MHz}\n- {id: USDHC2_CLK_ROOT.outFreq, value: 198 MHz}\nsettings:\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.ARM_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI2_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI2_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.FLEXSPI_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.LCDIF_PODF.scale, value: '4', locked: true}\n- {id: CCM.LCDIF_PRED.scale, value: '2', locked: true}\n- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.SEMC_PODF.scale, value: '8'}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM.TRACE_PODF.scale, value: '4', locked: true}\n- {id: CCM_ANALOG.PLL1_BYPASS.sel, value: CCM_ANALOG.PLL1}\n- {id: CCM_ANALOG.PLL1_PREDIV.scale, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL1_VDIV.scale, value: '50', locked: true}\n- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '33', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD1_DIV.scale, value: '16', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL4.denom, value: '50'}\n- {id: CCM_ANALOG.PLL4.div, value: '47'}\n- {id: CCM_ANALOG.PLL5.denom, value: '1'}\n- {id: CCM_ANALOG.PLL5.div, value: '31', locked: true}\n- {id: CCM_ANALOG.PLL5.num, value: '0'}\n- {id: CCM_ANALOG.PLL5_BYPASS.sel, value: CCM_ANALOG.PLL5_POST_DIV}\n- {id: CCM_ANALOG.PLL5_POST_DIV.scale, value: '2', locked: true}\n- {id: CCM_ANALOG.PLL7_BYPASS.sel, value: CCM_ANALOG.PLL7}\n- {id: CCM_ANALOG.VIDEO_DIV.scale, value: '4', locked: true}\n- {id: CCM_ANALOG_PLL_ENET_POWERDOWN_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG, value: 'No'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 100,                       /* PLL loop divider, Fout = Fin * 50 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 31,                        /* PLL loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .postDivider = 8,                         /* Divider after PLL */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */\n    /* Setting the VDD_SOC to 1.275V. It is necessary to config AHB to 600Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x13);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Adc2);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    CLOCK_DisableClock(kCLOCK_Xbar2);\n    CLOCK_DisableClock(kCLOCK_Xbar3);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Set ARM_PODF. */\n    CLOCK_SetDiv(kCLOCK_ArmDiv, 1);\n    /* Set PERIPH_CLK2_PODF. */\n    CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* Disable USDHC1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc1);\n    /* Set USDHC1_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1);\n    /* Set Usdhc1 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);\n    /* Disable USDHC2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc2);\n    /* Set USDHC2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1);\n    /* Set Usdhc2 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n    /* Disable Semc clock gate. */\n    CLOCK_DisableClock(kCLOCK_Semc);\n    /* Set SEMC_PODF. */\n    CLOCK_SetDiv(kCLOCK_SemcDiv, 7);\n    /* Set Semc alt clock source. */\n    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);\n    /* Set Semc clock source. */\n    CLOCK_SetMux(kCLOCK_SemcMux, 0);\n#endif\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 1);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 3);\n    /* In SDK projects, external flash (configured by FLEXSPI2) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI2 clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI2, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi2);\n    /* Set FLEXSPI2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexspi2Div, 1);\n    /* Set Flexspi2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1);\n#endif\n    /* Disable CSI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Csi);\n    /* Set CSI_PODF. */\n    CLOCK_SetDiv(kCLOCK_CsiDiv, 1);\n    /* Set Csi clock source. */\n    CLOCK_SetMux(kCLOCK_CsiMux, 0);\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    CLOCK_DisableClock(kCLOCK_Lpspi3);\n    CLOCK_DisableClock(kCLOCK_Lpspi4);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai2);\n    /* Set SAI2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);\n    /* Set SAI2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai2Div, 1);\n    /* Set Sai2 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai2Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    CLOCK_DisableClock(kCLOCK_Lpi2c3);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable CAN clock gate. */\n    CLOCK_DisableClock(kCLOCK_Can1);\n    CLOCK_DisableClock(kCLOCK_Can2);\n    CLOCK_DisableClock(kCLOCK_Can3);\n    CLOCK_DisableClock(kCLOCK_Can1S);\n    CLOCK_DisableClock(kCLOCK_Can2S);\n    CLOCK_DisableClock(kCLOCK_Can3S);\n    /* Set CAN_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_CanDiv, 1);\n    /* Set Can clock source. */\n    CLOCK_SetMux(kCLOCK_CanMux, 2);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    CLOCK_DisableClock(kCLOCK_Lpuart5);\n    CLOCK_DisableClock(kCLOCK_Lpuart6);\n    CLOCK_DisableClock(kCLOCK_Lpuart7);\n    CLOCK_DisableClock(kCLOCK_Lpuart8);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable LCDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_LcdPixel);\n    /* Set LCDIF_PRED. */\n    CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1);\n    /* Set LCDIF_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_LcdifDiv, 3);\n    /* Set Lcdif pre clock source. */\n    CLOCK_SetMux(kCLOCK_LcdifPreMux, 5);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* Disable Flexio2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio2);\n    /* Set FLEXIO2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1);\n    /* Set FLEXIO2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio2Div, 7);\n    /* Set Flexio2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio2Mux, 3);\n    /* Set Pll3 sw clock source. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* Init ARM PLL. */\n    CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n    #warning \"SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged.\"\n#endif\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 24);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 16);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI2) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI2 clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI2, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 33);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 19);\n#endif\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Init Video PLL. */\n    uint32_t pllVideo;\n    /* Disable Video PLL output before initial Video PLL. */\n    CCM_ANALOG->PLL_VIDEO &= ~CCM_ANALOG_PLL_VIDEO_ENABLE_MASK;\n    /* Bypass PLL first */\n    CCM_ANALOG->PLL_VIDEO = (CCM_ANALOG->PLL_VIDEO & (~CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_MASK)) |\n                            CCM_ANALOG_PLL_VIDEO_BYPASS_MASK | CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC(0);\n    CCM_ANALOG->PLL_VIDEO_NUM = CCM_ANALOG_PLL_VIDEO_NUM_A(0);\n    CCM_ANALOG->PLL_VIDEO_DENOM = CCM_ANALOG_PLL_VIDEO_DENOM_B(1);\n    pllVideo = (CCM_ANALOG->PLL_VIDEO & (~(CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK | CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK))) |\n               CCM_ANALOG_PLL_VIDEO_ENABLE_MASK |CCM_ANALOG_PLL_VIDEO_DIV_SELECT(31);\n    pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1);\n    CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(3);\n    CCM_ANALOG->PLL_VIDEO = pllVideo;\n    while ((CCM_ANALOG->PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_LOCK_MASK) == 0)\n    {\n    }\n    /* Disable bypass for Video PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllVideo, 0);\n    /* DeInit Enet PLL. */\n    CLOCK_DeinitEnetPll();\n    /* Bypass Enet PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1);\n    /* Set Enet output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_DIV_SELECT(1);\n    /* Enable Enet output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENABLE_MASK;\n    /* Set Enet2 output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT(0);\n    /* Enable Enet2 output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET2_REF_EN_MASK;\n    /* Enable Enet25M output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK;\n    /* Init Usb2 PLL. */\n    CLOCK_InitUsb2Pll(&usb2PllConfig_BOARD_BootClockRUN);\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Set lvds1 clock source. */\n    CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set ENET Ref clock source. */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK;\n    /* Set ENET2 Ref clock source. */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET2_TX_CLK_DIR_MASK;\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             600000000U  /*!< Core clock frequency: 600000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT               600000000UL    /* Clock consumers of AHB_CLK_ROOT output : AIPSTZ1, AIPSTZ2, AIPSTZ3, AIPSTZ4, ARM, FLEXIO3, FLEXSPI, FLEXSPI2, GPIO6, GPIO7, GPIO8, GPIO9 */\n#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT               40000000UL     /* Clock consumers of CAN_CLK_ROOT output : CAN1, CAN2, CAN3 */\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL        /* Clock consumers of CKIL_SYNC_CLK_ROOT output : CSU, EWM, GPT1, GPT2, KPP, PIT, RTWDOG, SNVS, SPDIF, TEMPMON, TSC, USB1, USB2, WDOG1, WDOG2 */\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL            /* Clock consumers of CLKO1_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL            /* Clock consumers of CLKO2_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL      /* Clock consumers of CLK_1M output : EWM, RTWDOG */\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL     /* Clock consumers of CLK_24M output : GPT1, GPT2 */\n#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT               12000000UL     /* Clock consumers of CSI_CLK_ROOT output : CSI */\n#define BOARD_BOOTCLOCKRUN_ENET2_125M_CLK             1200000UL      /* Clock consumers of ENET2_125M_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_ENET2_REF_CLK              0UL            /* Clock consumers of ENET2_REF_CLK output : ENET2 */\n#define BOARD_BOOTCLOCKRUN_ENET2_TX_CLK               0UL            /* Clock consumers of ENET2_TX_CLK output : ENET2 */\n#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK              2400000UL      /* Clock consumers of ENET_125M_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK           1200000UL      /* Clock consumers of ENET_25M_REF_CLK output : ENET, ENET2 */\n#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK               0UL            /* Clock consumers of ENET_REF_CLK output : ENET */\n#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK                0UL            /* Clock consumers of ENET_TX_CLK output : ENET */\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL     /* Clock consumers of FLEXIO1_CLK_ROOT output : FLEXIO1 */\n#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT           30000000UL     /* Clock consumers of FLEXIO2_CLK_ROOT output : FLEXIO2, FLEXIO3 */\n#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT          130909090UL    /* Clock consumers of FLEXSPI2_CLK_ROOT output : FLEXSPI2 */\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           130909090UL    /* Clock consumers of FLEXSPI_CLK_ROOT output : FLEXSPI */\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      75000000UL     /* Clock consumers of GPT1_ipg_clk_highfreq output : GPT1 */\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      75000000UL     /* Clock consumers of GPT2_ipg_clk_highfreq output : GPT2 */\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               150000000UL    /* Clock consumers of IPG_CLK_ROOT output : ADC1, ADC2, ADC_ETC, AOI1, AOI2, ARM, BEE, CAN1, CAN2, CAN3, CCM, CMP1, CMP2, CMP3, CMP4, CSI, CSU, DCDC, DCP, DMA0, DMAMUX, ENC1, ENC2, ENC3, ENC4, ENET, ENET2, EWM, FLEXIO1, FLEXIO2, FLEXIO3, FLEXRAM, FLEXSPI, FLEXSPI2, GPC, GPIO1, GPIO10, GPIO2, GPIO3, GPIO4, GPIO5, IOMUXC, KPP, LCDIF, LPI2C1, LPI2C2, LPI2C3, LPI2C4, LPSPI1, LPSPI2, LPSPI3, LPSPI4, LPUART1, LPUART2, LPUART3, LPUART4, LPUART5, LPUART6, LPUART7, LPUART8, NVIC, OCOTP, PMU, PWM1, PWM2, PWM3, PWM4, PXP, ROMC, RTWDOG, SAI1, SAI2, SAI3, SNVS, SPDIF, SRC, TEMPMON, TMR1, TMR2, TMR3, TMR4, TRNG, TSC, USB1, USB2, USDHC1, USDHC2, WDOG1, WDOG2, XBARA1, XBARB2, XBARB3 */\n#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT             67500000UL     /* Clock consumers of LCDIF_CLK_ROOT output : LCDIF */\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL     /* Clock consumers of LPI2C_CLK_ROOT output : LPI2C1, LPI2C2, LPI2C3, LPI2C4 */\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL    /* Clock consumers of LPSPI_CLK_ROOT output : LPSPI1, LPSPI2, LPSPI3, LPSPI4 */\n#define BOARD_BOOTCLOCKRUN_LVDS1_CLK                  1200000000UL   /* Clock consumers of LVDS1_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL     /* Clock consumers of MQS_MCLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            75000000UL     /* Clock consumers of PERCLK_CLK_ROOT output : GPT1, GPT2, PIT */\n#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK              480000000UL    /* Clock consumers of PLL7_MAIN_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL     /* Clock consumers of SAI1_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL     /* Clock consumers of SAI1_MCLK1 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL     /* Clock consumers of SAI1_MCLK2 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL     /* Clock consumers of SAI1_MCLK3 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              63529411UL     /* Clock consumers of SAI2_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 63529411UL     /* Clock consumers of SAI2_MCLK1 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL            /* Clock consumers of SAI2_MCLK2 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 30000000UL     /* Clock consumers of SAI2_MCLK3 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL     /* Clock consumers of SAI3_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL     /* Clock consumers of SAI3_MCLK1 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL            /* Clock consumers of SAI3_MCLK2 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL     /* Clock consumers of SAI3_MCLK3 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT              75000000UL     /* Clock consumers of SEMC_CLK_ROOT output : SEMC */\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL     /* Clock consumers of SPDIF0_CLK_ROOT output : SPDIF */\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL            /* Clock consumers of SPDIF0_EXTCLK_OUT output : SPDIF */\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL    /* Clock consumers of TRACE_CLK_ROOT output : ARM */\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL     /* Clock consumers of UART_CLK_ROOT output : LPUART1, LPUART2, LPUART3, LPUART4, LPUART5, LPUART6, LPUART7, LPUART8 */\n#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK                480000000UL    /* Clock consumers of USBPHY1_CLK output : TEMPMON, USB1 */\n#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK                480000000UL    /* Clock consumers of USBPHY2_CLK output : USB2 */\n#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT            198000000UL    /* Clock consumers of USDHC1_CLK_ROOT output : USDHC1 */\n#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT            198000000UL    /* Clock consumers of USDHC2_CLK_ROOT output : USDHC2 */\n\n/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Usb2 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Video PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: MIMXRT1064xxxxA\npackage_id: MIMXRT1064DVL6A\nmcu_data: ksdk2_0\nprocessor_version: 24.12.10\nboard: MIMXRT1064-EVK\npin_labels:\n- {pin_num: F14, pin_signal: GPIO_AD_B0_09, label: 'JTAG_TDI/J21[5]/ENET_RST/J22[5]', identifier: USER_LED}\n- {pin_num: L6, pin_signal: WAKEUP, label: SD_PWREN, identifier: USER_BUTTON}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: F14, peripheral: GPIO1, signal: 'gpio_io, 09', pin_signal: GPIO_AD_B0_09, direction: OUTPUT, pull_keeper_select: Keeper}\n  - {pin_num: L6, peripheral: GPIO5, signal: 'gpio_io, 00', pin_signal: WAKEUP, direction: INPUT}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n  CLOCK_EnableClock(kCLOCK_IomuxcSnvs);\n\n  /* GPIO configuration of USER_LED on GPIO_AD_B0_09 (pin F14) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_AD_B0_09 (pin F14) */\n  GPIO_PinInit(GPIO1, 9U, &USER_LED_config);\n\n  /* GPIO configuration of USER_BUTTON on WAKEUP (pin L6) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on WAKEUP (pin L6) */\n  GPIO_PinInit(GPIO5, 0U, &USER_BUTTON_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0U);\n  IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &\n    (~(BOARD_INITPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinMux(IOMUXC_SNVS_WAKEUP_GPIO5_IO00, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0x50A0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: K14, peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_12, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: L14, peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_13, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0x10B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0x10B0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSDRAMPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: C2, peripheral: SEMC, signal: 'ADDR, 00', pin_signal: GPIO_EMC_09}\n  - {pin_num: G1, peripheral: SEMC, signal: 'ADDR, 01', pin_signal: GPIO_EMC_10}\n  - {pin_num: G3, peripheral: SEMC, signal: 'ADDR, 02', pin_signal: GPIO_EMC_11}\n  - {pin_num: H1, peripheral: SEMC, signal: 'ADDR, 03', pin_signal: GPIO_EMC_12}\n  - {pin_num: A6, peripheral: SEMC, signal: 'ADDR, 04', pin_signal: GPIO_EMC_13}\n  - {pin_num: B6, peripheral: SEMC, signal: 'ADDR, 05', pin_signal: GPIO_EMC_14}\n  - {pin_num: B1, peripheral: SEMC, signal: 'ADDR, 06', pin_signal: GPIO_EMC_15}\n  - {pin_num: A5, peripheral: SEMC, signal: 'ADDR, 07', pin_signal: GPIO_EMC_16}\n  - {pin_num: A4, peripheral: SEMC, signal: 'ADDR, 08', pin_signal: GPIO_EMC_17}\n  - {pin_num: B2, peripheral: SEMC, signal: 'ADDR, 09', pin_signal: GPIO_EMC_18}\n  - {pin_num: G2, peripheral: SEMC, signal: 'ADDR, 10', pin_signal: GPIO_EMC_23}\n  - {pin_num: B4, peripheral: SEMC, signal: 'ADDR, 11', pin_signal: GPIO_EMC_19}\n  - {pin_num: A3, peripheral: SEMC, signal: 'ADDR, 12', pin_signal: GPIO_EMC_20}\n  - {pin_num: C1, peripheral: SEMC, signal: 'BA, 0', pin_signal: GPIO_EMC_21}\n  - {pin_num: F1, peripheral: SEMC, signal: 'BA, 1', pin_signal: GPIO_EMC_22}\n  - {pin_num: D3, peripheral: SEMC, signal: semc_cas, pin_signal: GPIO_EMC_24}\n  - {pin_num: A2, peripheral: SEMC, signal: semc_cke, pin_signal: GPIO_EMC_27}\n  - {pin_num: B3, peripheral: SEMC, signal: semc_clk, pin_signal: GPIO_EMC_26}\n  - {pin_num: E3, peripheral: SEMC, signal: 'DATA, 00', pin_signal: GPIO_EMC_00}\n  - {pin_num: F3, peripheral: SEMC, signal: 'DATA, 01', pin_signal: GPIO_EMC_01}\n  - {pin_num: F4, peripheral: SEMC, signal: 'DATA, 02', pin_signal: GPIO_EMC_02}\n  - {pin_num: G4, peripheral: SEMC, signal: 'DATA, 03', pin_signal: GPIO_EMC_03}\n  - {pin_num: F2, peripheral: SEMC, signal: 'DATA, 04', pin_signal: GPIO_EMC_04}\n  - {pin_num: G5, peripheral: SEMC, signal: 'DATA, 05', pin_signal: GPIO_EMC_05}\n  - {pin_num: H5, peripheral: SEMC, signal: 'DATA, 06', pin_signal: GPIO_EMC_06}\n  - {pin_num: H4, peripheral: SEMC, signal: 'DATA, 07', pin_signal: GPIO_EMC_07}\n  - {pin_num: C6, peripheral: SEMC, signal: 'DATA, 08', pin_signal: GPIO_EMC_30}\n  - {pin_num: C5, peripheral: SEMC, signal: 'DATA, 09', pin_signal: GPIO_EMC_31}\n  - {pin_num: D5, peripheral: SEMC, signal: 'DATA, 10', pin_signal: GPIO_EMC_32}\n  - {pin_num: C4, peripheral: SEMC, signal: 'DATA, 11', pin_signal: GPIO_EMC_33}\n  - {pin_num: D4, peripheral: SEMC, signal: 'DATA, 12', pin_signal: GPIO_EMC_34}\n  - {pin_num: E5, peripheral: SEMC, signal: 'DATA, 13', pin_signal: GPIO_EMC_35}\n  - {pin_num: C3, peripheral: SEMC, signal: 'DATA, 14', pin_signal: GPIO_EMC_36}\n  - {pin_num: E4, peripheral: SEMC, signal: 'DATA, 15', pin_signal: GPIO_EMC_37}\n  - {pin_num: H3, peripheral: SEMC, signal: 'DM, 0', pin_signal: GPIO_EMC_08}\n  - {pin_num: D6, peripheral: SEMC, signal: 'DM, 1', pin_signal: GPIO_EMC_38}\n  - {pin_num: D2, peripheral: SEMC, signal: semc_ras, pin_signal: GPIO_EMC_25}\n  - {pin_num: D1, peripheral: SEMC, signal: semc_we, pin_signal: GPIO_EMC_28}\n  - {pin_num: E1, peripheral: SEMC, signal: 'CS, 0', pin_signal: GPIO_EMC_29}\n  - {pin_num: B7, peripheral: SEMC, signal: semc_dqs, pin_signal: GPIO_EMC_39}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSDRAMPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitSDRAMPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_00_SEMC_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_01_SEMC_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_02_SEMC_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_03_SEMC_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_04_SEMC_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_05_SEMC_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_06_SEMC_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_07_SEMC_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_08_SEMC_DM00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_09_SEMC_ADDR00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_10_SEMC_ADDR01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_11_SEMC_ADDR02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_12_SEMC_ADDR03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_13_SEMC_ADDR04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_14_SEMC_ADDR05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_15_SEMC_ADDR06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_16_SEMC_ADDR07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_17_SEMC_ADDR08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_18_SEMC_ADDR09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_19_SEMC_ADDR11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_20_SEMC_ADDR12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_21_SEMC_BA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_22_SEMC_BA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_23_SEMC_ADDR10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_24_SEMC_CAS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_25_SEMC_RAS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_26_SEMC_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_27_SEMC_CKE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_28_SEMC_WE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_29_SEMC_CS0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_30_SEMC_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_31_SEMC_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_32_SEMC_DATA10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_33_SEMC_DATA11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_34_SEMC_DATA12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_35_SEMC_DATA13, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_36_SEMC_DATA14, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_37_SEMC_DATA15, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_38_SEMC_DM01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_39_SEMC_DQS, 0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitCSIPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: H13, peripheral: CSI, signal: 'csi_data, 09', pin_signal: GPIO_AD_B1_08}\n  - {pin_num: M13, peripheral: CSI, signal: 'csi_data, 08', pin_signal: GPIO_AD_B1_09}\n  - {pin_num: L13, peripheral: CSI, signal: 'csi_data, 07', pin_signal: GPIO_AD_B1_10}\n  - {pin_num: J13, peripheral: CSI, signal: 'csi_data, 06', pin_signal: GPIO_AD_B1_11}\n  - {pin_num: H12, peripheral: CSI, signal: 'csi_data, 05', pin_signal: GPIO_AD_B1_12}\n  - {pin_num: H11, peripheral: CSI, signal: 'csi_data, 04', pin_signal: GPIO_AD_B1_13}\n  - {pin_num: J14, peripheral: CSI, signal: 'csi_data, 02', pin_signal: GPIO_AD_B1_15}\n  - {pin_num: G12, peripheral: CSI, signal: 'csi_data, 03', pin_signal: GPIO_AD_B1_14}\n  - {pin_num: L12, peripheral: CSI, signal: csi_pixclk, pin_signal: GPIO_AD_B1_04}\n  - {pin_num: K12, peripheral: CSI, signal: csi_mclk, pin_signal: GPIO_AD_B1_05}\n  - {pin_num: J12, peripheral: CSI, signal: csi_vsync, pin_signal: GPIO_AD_B1_06}\n  - {pin_num: K10, peripheral: CSI, signal: csi_hsync, pin_signal: GPIO_AD_B1_07}\n  - {pin_num: J11, peripheral: LPI2C1, signal: SCL, pin_signal: GPIO_AD_B1_00, identifier: CSI_I2C_SCL, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Up_22K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Enable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: K11, peripheral: LPI2C1, signal: SDA, pin_signal: GPIO_AD_B1_01, identifier: CSI_I2C_SDA, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Up_22K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Enable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: F11, peripheral: GPIO1, signal: 'gpio_io, 04', pin_signal: GPIO_AD_B0_04}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitCSIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitCSIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_04_GPIO1_IO04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_04_CSI_PIXCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_05_CSI_MCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_06_CSI_VSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_07_CSI_HSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_08_CSI_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_09_CSI_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_10_CSI_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_11_CSI_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_12_CSI_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_13_CSI_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_14_CSI_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_15_CSI_DATA02, 0U);\n  IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &\n    (~(BOARD_INITCSIPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 0xD8B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA, 0xD8B0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLCDPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: C8, peripheral: LCDIF, signal: 'lcdif_data, 00', pin_signal: GPIO_B0_04, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B8, peripheral: LCDIF, signal: 'lcdif_data, 01', pin_signal: GPIO_B0_05, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A8, peripheral: LCDIF, signal: 'lcdif_data, 02', pin_signal: GPIO_B0_06, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D7, peripheral: LCDIF, signal: lcdif_clk, pin_signal: GPIO_B0_00, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A9, peripheral: LCDIF, signal: 'lcdif_data, 03', pin_signal: GPIO_B0_07, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B9, peripheral: LCDIF, signal: 'lcdif_data, 04', pin_signal: GPIO_B0_08, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C9, peripheral: LCDIF, signal: 'lcdif_data, 05', pin_signal: GPIO_B0_09, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D9, peripheral: LCDIF, signal: 'lcdif_data, 06', pin_signal: GPIO_B0_10, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A10, peripheral: LCDIF, signal: 'lcdif_data, 07', pin_signal: GPIO_B0_11, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C10, peripheral: LCDIF, signal: 'lcdif_data, 08', pin_signal: GPIO_B0_12, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D10, peripheral: LCDIF, signal: 'lcdif_data, 09', pin_signal: GPIO_B0_13, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E10, peripheral: LCDIF, signal: 'lcdif_data, 10', pin_signal: GPIO_B0_14, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E11, peripheral: LCDIF, signal: 'lcdif_data, 11', pin_signal: GPIO_B0_15, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: A11, peripheral: LCDIF, signal: 'lcdif_data, 12', pin_signal: GPIO_B1_00, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B11, peripheral: LCDIF, signal: 'lcdif_data, 13', pin_signal: GPIO_B1_01, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: C11, peripheral: LCDIF, signal: 'lcdif_data, 14', pin_signal: GPIO_B1_02, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D11, peripheral: LCDIF, signal: 'lcdif_data, 15', pin_signal: GPIO_B1_03, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E7, peripheral: LCDIF, signal: lcdif_enable, pin_signal: GPIO_B0_01, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: E8, peripheral: LCDIF, signal: lcdif_hsync, pin_signal: GPIO_B0_02, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: D8, peripheral: LCDIF, signal: lcdif_vsync, pin_signal: GPIO_B0_03, hysteresis_enable: Enable, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n  - {pin_num: B14, peripheral: GPIO2, signal: 'gpio_io, 31', pin_signal: GPIO_B1_15, slew_rate: Slow}\n  - {pin_num: M11, peripheral: GPIO1, signal: 'gpio_io, 02', pin_signal: GPIO_AD_B0_02}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLCDPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitLCDPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_02_GPIO1_IO02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_00_LCD_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_04_LCD_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_05_LCD_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_06_LCD_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_07_LCD_DATA03, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_08_LCD_DATA04, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_09_LCD_DATA05, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_10_LCD_DATA06, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_11_LCD_DATA07, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_12_LCD_DATA08, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_13_LCD_DATA09, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_14_LCD_DATA10, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_15_LCD_DATA11, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_00_LCD_DATA12, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_01_LCD_DATA13, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_02_LCD_DATA14, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_03_LCD_DATA15, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_15_GPIO2_IO31, 0U);\n  IOMUXC_GPR->GPR26 = ((IOMUXC_GPR->GPR26 &\n    (~(BOARD_INITLCDPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL(0x00U)\n    );\n  IOMUXC_GPR->GPR27 = ((IOMUXC_GPR->GPR27 &\n    (~(BOARD_INITLCDPINS_IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_00_LCD_CLK, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_01_LCD_ENABLE, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_02_LCD_HSYNC, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_03_LCD_VSYNC, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_04_LCD_DATA00, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_05_LCD_DATA01, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_06_LCD_DATA02, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_07_LCD_DATA03, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_08_LCD_DATA04, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_09_LCD_DATA05, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_10_LCD_DATA06, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_11_LCD_DATA07, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_12_LCD_DATA08, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_13_LCD_DATA09, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_14_LCD_DATA10, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_15_LCD_DATA11, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_00_LCD_DATA12, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_01_LCD_DATA13, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_02_LCD_DATA14, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_03_LCD_DATA15, 0x01B0B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_15_GPIO2_IO31, 0x10B0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitCANPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: H14, peripheral: CAN2, signal: TX, pin_signal: GPIO_AD_B0_14}\n  - {pin_num: L10, peripheral: CAN2, signal: RX, pin_signal: GPIO_AD_B0_15}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitCANPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitCANPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_14_FLEXCAN2_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_15_FLEXCAN2_RX, 0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitENETPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: A7, peripheral: ENET, signal: enet_mdc, pin_signal: GPIO_EMC_40}\n  - {pin_num: C7, peripheral: ENET, signal: enet_mdio, pin_signal: GPIO_EMC_41}\n  - {pin_num: B13, peripheral: ENET, signal: enet_ref_clk, pin_signal: GPIO_B1_10}\n  - {pin_num: E12, peripheral: ENET, signal: 'enet_rx_data, 0', pin_signal: GPIO_B1_04}\n  - {pin_num: D12, peripheral: ENET, signal: 'enet_rx_data, 1', pin_signal: GPIO_B1_05}\n  - {pin_num: C12, peripheral: ENET, signal: enet_rx_en, pin_signal: GPIO_B1_06}\n  - {pin_num: C13, peripheral: ENET, signal: enet_rx_er, pin_signal: GPIO_B1_11}\n  - {pin_num: B12, peripheral: ENET, signal: 'enet_tx_data, 0', pin_signal: GPIO_B1_07}\n  - {pin_num: A12, peripheral: ENET, signal: 'enet_tx_data, 1', pin_signal: GPIO_B1_08}\n  - {pin_num: A13, peripheral: ENET, signal: enet_tx_en, pin_signal: GPIO_B1_09}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitENETPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitENETPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_04_ENET_RX_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_05_ENET_RX_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_06_ENET_RX_EN, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_07_ENET_TX_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_08_ENET_TX_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_09_ENET_TX_EN, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_10_ENET_REF_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_11_ENET_RX_ER, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_40_ENET_MDC, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_EMC_41_ENET_MDIO, 0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSDHCPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: J2, peripheral: USDHC1, signal: 'usdhc_data, 3', pin_signal: GPIO_SD_B0_05}\n  - {pin_num: H2, peripheral: USDHC1, signal: 'usdhc_data, 2', pin_signal: GPIO_SD_B0_04}\n  - {pin_num: K1, peripheral: USDHC1, signal: 'usdhc_data, 1', pin_signal: GPIO_SD_B0_03}\n  - {pin_num: J1, peripheral: USDHC1, signal: 'usdhc_data, 0', pin_signal: GPIO_SD_B0_02}\n  - {pin_num: J4, peripheral: USDHC1, signal: usdhc_cmd, pin_signal: GPIO_SD_B0_00}\n  - {pin_num: J3, peripheral: USDHC1, signal: usdhc_clk, pin_signal: GPIO_SD_B0_01}\n  - {pin_num: C14, peripheral: USDHC1, signal: usdhc_vselect, pin_signal: GPIO_B1_14}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSDHCPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitUSDHCPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_14_USDHC1_VSELECT, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, 0U);\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitQSPIPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: P3, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08}\n  - {pin_num: N4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_09}\n  - {pin_num: P4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_10}\n  - {pin_num: P5, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_11}\n  - {pin_num: L4, peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07}\n  - {pin_num: L3, peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_06}\n  - {pin_num: N3, peripheral: FLEXSPI, signal: FLEXSPI_A_DQS, pin_signal: GPIO_SD_B1_05}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitQSPIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitQSPIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_05_FLEXSPIA_DQS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03, 0U);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define BOARD_INITPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK 0x0200U /*!< GPIO1 and GPIO6 share same IO MUX function, GPIO_MUX1 selects one GPIO function: affected bits mask */\n\n/* GPIO_AD_B0_09 (coord F14), JTAG_TDI/J21[5]/ENET_RST/J22[5] */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO1   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                   gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                       9U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_INIT_GPIO_VALUE                               0U   /*!< GPIO output initial state */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN                                      9U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN_MASK                         (1U << 9U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_LED_PORT                                       GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_PIN                                           9U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_LED_PIN_MASK                              (1U << 9U)   /*!< PORT pin mask */\n\n/* WAKEUP (coord L6), SD_PWREN */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO5   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    0U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO5   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   0U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 0U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO5   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        0U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_BUTTON_PIN_MASK                           (1U << 0U)   /*!< PORT pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/* GPIO_AD_B0_12 (coord K14), UART1_TXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_SIGNAL                             TX   /*!< Signal name */\n\n/* GPIO_AD_B0_13 (coord L14), UART1_RXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_SIGNAL                             RX   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n/* GPIO_EMC_09 (coord C2), SEMC_A0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A0_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A0_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A0_CHANNEL                                   0U   /*!< Signal channel */\n\n/* GPIO_EMC_10 (coord G1), SEMC_A1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A1_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A1_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A1_CHANNEL                                   1U   /*!< Signal channel */\n\n/* GPIO_EMC_11 (coord G3), SEMC_A2 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A2_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A2_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A2_CHANNEL                                   2U   /*!< Signal channel */\n\n/* GPIO_EMC_12 (coord H1), SEMC_A3 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A3_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A3_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A3_CHANNEL                                   3U   /*!< Signal channel */\n\n/* GPIO_EMC_13 (coord A6), SEMC_A4 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A4_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A4_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A4_CHANNEL                                   4U   /*!< Signal channel */\n\n/* GPIO_EMC_14 (coord B6), SEMC_A5 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A5_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A5_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A5_CHANNEL                                   5U   /*!< Signal channel */\n\n/* GPIO_EMC_15 (coord B1), SEMC_A6 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A6_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A6_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A6_CHANNEL                                   6U   /*!< Signal channel */\n\n/* GPIO_EMC_16 (coord A5), SEMC_A7 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A7_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A7_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A7_CHANNEL                                   7U   /*!< Signal channel */\n\n/* GPIO_EMC_17 (coord A4), SEMC_A8 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A8_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A8_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A8_CHANNEL                                   8U   /*!< Signal channel */\n\n/* GPIO_EMC_18 (coord B2), SEMC_A9 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A9_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A9_SIGNAL                                  ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A9_CHANNEL                                   9U   /*!< Signal channel */\n\n/* GPIO_EMC_23 (coord G2), SEMC_A10 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A10_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A10_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A10_CHANNEL                                 10U   /*!< Signal channel */\n\n/* GPIO_EMC_19 (coord B4), SEMC_A11 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A11_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A11_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A11_CHANNEL                                 11U   /*!< Signal channel */\n\n/* GPIO_EMC_20 (coord A3), SEMC_A12 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_A12_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_A12_SIGNAL                                 ADDR   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_A12_CHANNEL                                 12U   /*!< Signal channel */\n\n/* GPIO_EMC_21 (coord C1), SEMC_BA0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_SIGNAL                                   BA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_BA0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_22 (coord F1), SEMC_BA1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_SIGNAL                                   BA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_BA1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_EMC_24 (coord D3), SEMC_CAS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CAS_SIGNAL                             semc_cas   /*!< Signal name */\n\n/* GPIO_EMC_27 (coord A2), SEMC_CKE */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CKE_SIGNAL                             semc_cke   /*!< Signal name */\n\n/* GPIO_EMC_26 (coord B3), SEMC_CLK */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CLK_SIGNAL                             semc_clk   /*!< Signal name */\n\n/* GPIO_EMC_00 (coord E3), SEMC_D0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D0_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D0_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D0_CHANNEL                                   0U   /*!< Signal channel */\n\n/* GPIO_EMC_01 (coord F3), SEMC_D1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D1_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D1_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D1_CHANNEL                                   1U   /*!< Signal channel */\n\n/* GPIO_EMC_02 (coord F4), SEMC_D2 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D2_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D2_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D2_CHANNEL                                   2U   /*!< Signal channel */\n\n/* GPIO_EMC_03 (coord G4), SEMC_D3 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D3_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D3_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D3_CHANNEL                                   3U   /*!< Signal channel */\n\n/* GPIO_EMC_04 (coord F2), SEMC_D4 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D4_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D4_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D4_CHANNEL                                   4U   /*!< Signal channel */\n\n/* GPIO_EMC_05 (coord G5), SEMC_D5 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D5_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D5_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D5_CHANNEL                                   5U   /*!< Signal channel */\n\n/* GPIO_EMC_06 (coord H5), SEMC_D6 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D6_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D6_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D6_CHANNEL                                   6U   /*!< Signal channel */\n\n/* GPIO_EMC_07 (coord H4), SEMC_D7 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D7_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D7_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D7_CHANNEL                                   7U   /*!< Signal channel */\n\n/* GPIO_EMC_30 (coord C6), SEMC_D8 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D8_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D8_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D8_CHANNEL                                   8U   /*!< Signal channel */\n\n/* GPIO_EMC_31 (coord C5), SEMC_D9 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D9_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D9_SIGNAL                                  DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D9_CHANNEL                                   9U   /*!< Signal channel */\n\n/* GPIO_EMC_32 (coord D5), SEMC_D10 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D10_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D10_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D10_CHANNEL                                 10U   /*!< Signal channel */\n\n/* GPIO_EMC_33 (coord C4), SEMC_D11 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D11_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D11_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D11_CHANNEL                                 11U   /*!< Signal channel */\n\n/* GPIO_EMC_34 (coord D4), SEMC_D12 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D12_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D12_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D12_CHANNEL                                 12U   /*!< Signal channel */\n\n/* GPIO_EMC_35 (coord E5), SEMC_D13 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D13_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D13_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D13_CHANNEL                                 13U   /*!< Signal channel */\n\n/* GPIO_EMC_36 (coord C3), SEMC_D14 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D14_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D14_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D14_CHANNEL                                 14U   /*!< Signal channel */\n\n/* GPIO_EMC_37 (coord E4), SEMC_D15 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_D15_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_D15_SIGNAL                                 DATA   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_D15_CHANNEL                                 15U   /*!< Signal channel */\n\n/* GPIO_EMC_08 (coord H3), SEMC_DM0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_SIGNAL                                   DM   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_DM0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_38 (coord D6), SEMC_DM1 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_SIGNAL                                   DM   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_DM1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_EMC_25 (coord D2), SEMC_RAS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_RAS_SIGNAL                             semc_ras   /*!< Signal name */\n\n/* GPIO_EMC_28 (coord D1), SEMC_WE */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_WE_PERIPHERAL                              SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_WE_SIGNAL                               semc_we   /*!< Signal name */\n\n/* GPIO_EMC_29 (coord E1), SEMC_CS0 */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_SIGNAL                                   CS   /*!< Signal name */\n#define BOARD_INITSDRAMPINS_SEMC_CS0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_EMC_39 (coord B7), SEMC_DQS */\n/* Routed pin properties */\n#define BOARD_INITSDRAMPINS_SEMC_DQS_PERIPHERAL                             SEMC   /*!< Peripheral name */\n#define BOARD_INITSDRAMPINS_SEMC_DQS_SIGNAL                             semc_dqs   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSDRAMPins(void);\n\n#define BOARD_INITCSIPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK 0x10U /*!< GPIO1 and GPIO6 share same IO MUX function, GPIO_MUX1 selects one GPIO function: affected bits mask */\n\n/* GPIO_AD_B1_08 (coord H13), AUD_INT/CSI_D9//J35[13]/J22[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D9_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D9_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D9_CHANNEL                                      9U   /*!< Signal channel */\n\n/* GPIO_AD_B1_09 (coord M13), SAI1_MCLK/CSI_D8/J35[11] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D8_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D8_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D8_CHANNEL                                      8U   /*!< Signal channel */\n\n/* GPIO_AD_B1_10 (coord L13), SAI1_RX_SYNC/CSI_D7/J35[9]/J23[1] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D7_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D7_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D7_CHANNEL                                      7U   /*!< Signal channel */\n\n/* GPIO_AD_B1_11 (coord J13), SAI1_RX_BCLK/CSI_D6/J35[7]/J23[2] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D6_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D6_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D6_CHANNEL                                      6U   /*!< Signal channel */\n\n/* GPIO_AD_B1_12 (coord H12), SAI1_RXD/CSI_D5/J35[5]/U13[16] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D5_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D5_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D5_CHANNEL                                      5U   /*!< Signal channel */\n\n/* GPIO_AD_B1_13 (coord H11), SAI1_TXD/CSI_D4/J35[3]/U13[14] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D4_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D4_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D4_CHANNEL                                      4U   /*!< Signal channel */\n\n/* GPIO_AD_B1_15 (coord J14), SAI1_TX_SYNC/CSI_D2/J35[6]/U13[13] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D2_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D2_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D2_CHANNEL                                      2U   /*!< Signal channel */\n\n/* GPIO_AD_B1_14 (coord G12), SAI1_TX_BCLK/CSI_D3/J35[4]/U13[12] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_D3_PERIPHERAL                                  CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_D3_SIGNAL                                 csi_data   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_D3_CHANNEL                                      3U   /*!< Signal channel */\n\n/* GPIO_AD_B1_04 (coord L12), CSI_PIXCLK/J35[8]/J23[3] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_PIXCLK_PERIPHERAL                              CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_PIXCLK_SIGNAL                           csi_pixclk   /*!< Signal name */\n\n/* GPIO_AD_B1_05 (coord K12), CSI_MCLK/J35[12]/J23[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_MCLK_PERIPHERAL                                CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_MCLK_SIGNAL                               csi_mclk   /*!< Signal name */\n\n/* GPIO_AD_B1_06 (coord J12), CSI_VSYNC/J35[18]/J22[2]/UART_TX */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_VSYNC_PERIPHERAL                               CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_VSYNC_SIGNAL                             csi_vsync   /*!< Signal name */\n\n/* GPIO_AD_B1_07 (coord K10), CSI_HSYNC/J35[16]/J22[1]/UART_RX */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_HSYNC_PERIPHERAL                               CSI   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_HSYNC_SIGNAL                             csi_hsync   /*!< Signal name */\n\n/* GPIO_AD_B1_00 (coord J11), I2C1_SCL/CSI_I2C_SCL/J35[20]/J23[6]/U13[17]/U32[4] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_I2C_SCL_PERIPHERAL                          LPI2C1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_I2C_SCL_SIGNAL                                 SCL   /*!< Signal name */\n\n/* GPIO_AD_B1_01 (coord K11), I2C1_SDA/CSI_I2C_SDA/J35[22]/J23[5]/U13[18]/U32[6] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_I2C_SDA_PERIPHERAL                          LPI2C1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_I2C_SDA_SIGNAL                                 SDA   /*!< Signal name */\n\n/* GPIO_AD_B0_04 (coord F11), CSI_PWDN/J35[17]/BOOT_MODE[0] */\n/* Routed pin properties */\n#define BOARD_INITCSIPINS_CSI_PWDN_PERIPHERAL                              GPIO1   /*!< Peripheral name */\n#define BOARD_INITCSIPINS_CSI_PWDN_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITCSIPINS_CSI_PWDN_CHANNEL                                    4U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO                                    GPIO1   /*!< GPIO peripheral base pointer */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO_PIN                                   4U   /*!< GPIO pin number */\n#define BOARD_INITCSIPINS_CSI_PWDN_GPIO_PIN_MASK                      (1U << 4U)   /*!< GPIO pin mask */\n#define BOARD_INITCSIPINS_CSI_PWDN_PORT                                    GPIO1   /*!< PORT peripheral base pointer */\n#define BOARD_INITCSIPINS_CSI_PWDN_PIN                                        4U   /*!< PORT pin number */\n#define BOARD_INITCSIPINS_CSI_PWDN_PIN_MASK                           (1U << 4U)   /*!< PORT pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitCSIPins(void);\n\n#define BOARD_INITLCDPINS_IOMUXC_GPR_GPR26_GPIO_MUX1_GPIO_SEL_MASK 0x04U /*!< GPIO1 and GPIO6 share same IO MUX function, GPIO_MUX1 selects one GPIO function: affected bits mask */\n#define BOARD_INITLCDPINS_IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL_MASK 0x80000000U /*!< GPIO2 and GPIO7 share same IO MUX function, GPIO_MUX2 selects one GPIO function: affected bits mask */\n\n/* GPIO_B0_04 (coord C8), LCDIF_D0/BT_CFG[0] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D0_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D0_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_B0_05 (coord B8), LCDIF_D1/BT_CFG[1] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D1_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D1_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_B0_06 (coord A8), LCDIF_D2/BT_CFG[2] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D2_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D2_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_B0_00 (coord D7), LCDIF_CLK */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_CLK_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_CLK_SIGNAL                             lcdif_clk   /*!< Signal name */\n\n/* GPIO_B0_07 (coord A9), LCDIF_D3/BT_CFG[3] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D3_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D3_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_B0_08 (coord B9), LCDIF_D4/BT_CFG[4] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D4_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D4_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D4_CHANNEL                                    4U   /*!< Signal channel */\n\n/* GPIO_B0_09 (coord C9), LCDIF_D5/BT_CFG[5] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D5_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D5_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D5_CHANNEL                                    5U   /*!< Signal channel */\n\n/* GPIO_B0_10 (coord D9), LCDIF_D6/BT_CFG[6] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D6_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D6_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D6_CHANNEL                                    6U   /*!< Signal channel */\n\n/* GPIO_B0_11 (coord A10), LCDIF_D7/BT_CFG[7] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D7_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D7_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D7_CHANNEL                                    7U   /*!< Signal channel */\n\n/* GPIO_B0_12 (coord C10), LCDIF_D8/BT_CFG[8] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D8_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D8_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D8_CHANNEL                                    8U   /*!< Signal channel */\n\n/* GPIO_B0_13 (coord D10), LCDIF_D9/BT_CFG[9] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D9_PERIPHERAL                              LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D9_SIGNAL                             lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D9_CHANNEL                                    9U   /*!< Signal channel */\n\n/* GPIO_B0_14 (coord E10), LCDIF_D10/BT_CFG[10] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D10_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D10_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D10_CHANNEL                                  10U   /*!< Signal channel */\n\n/* GPIO_B0_15 (coord E11), LCDIF_D11/BT_CFG[11] */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D11_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D11_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D11_CHANNEL                                  11U   /*!< Signal channel */\n\n/* GPIO_B1_00 (coord A11), LCDIF_D12 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D12_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D12_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D12_CHANNEL                                  12U   /*!< Signal channel */\n\n/* GPIO_B1_01 (coord B11), LCDIF_D13 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D13_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D13_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D13_CHANNEL                                  13U   /*!< Signal channel */\n\n/* GPIO_B1_02 (coord C11), LCDIF_D14 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D14_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D14_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D14_CHANNEL                                  14U   /*!< Signal channel */\n\n/* GPIO_B1_03 (coord D11), LCDIF_D15 */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_D15_PERIPHERAL                             LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_D15_SIGNAL                            lcdif_data   /*!< Signal name */\n#define BOARD_INITLCDPINS_LCDIF_D15_CHANNEL                                  15U   /*!< Signal channel */\n\n/* GPIO_B0_01 (coord E7), LCDIF_ENABLE */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_ENABLE_PERIPHERAL                          LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_ENABLE_SIGNAL                       lcdif_enable   /*!< Signal name */\n\n/* GPIO_B0_02 (coord E8), LCDIF_HSYNC */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_HSYNC_PERIPHERAL                           LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_HSYNC_SIGNAL                         lcdif_hsync   /*!< Signal name */\n\n/* GPIO_B0_03 (coord D8), LCDIF_VSYNC */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_LCDIF_VSYNC_PERIPHERAL                           LCDIF   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_LCDIF_VSYNC_SIGNAL                         lcdif_vsync   /*!< Signal name */\n\n/* GPIO_B1_15 (coord B14), USB_HOST_PWR/BACKLIGHT_CTL */\n/* Routed pin properties */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PERIPHERAL                         GPIO2   /*!< Peripheral name */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_SIGNAL                           gpio_io   /*!< Signal name */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_CHANNEL                              31U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO                               GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO_PIN                             31U   /*!< GPIO pin number */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_GPIO_PIN_MASK                (1U << 31U)   /*!< GPIO pin mask */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PORT                               GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PIN                                  31U   /*!< PORT pin number */\n#define BOARD_INITLCDPINS_BACKLIGHT_CTL_PIN_MASK                     (1U << 31U)   /*!< PORT pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLCDPins(void);\n\n/* GPIO_AD_B0_14 (coord H14), CAN2_TX/U12[1] */\n/* Routed pin properties */\n#define BOARD_INITCANPINS_CAN2_TX_PERIPHERAL                                CAN2   /*!< Peripheral name */\n#define BOARD_INITCANPINS_CAN2_TX_SIGNAL                                      TX   /*!< Signal name */\n\n/* GPIO_AD_B0_15 (coord L10), CAN2_RX/U12[4] */\n/* Routed pin properties */\n#define BOARD_INITCANPINS_CAN2_RX_PERIPHERAL                                CAN2   /*!< Peripheral name */\n#define BOARD_INITCANPINS_CAN2_RX_SIGNAL                                      RX   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitCANPins(void);\n\n/* GPIO_EMC_40 (coord A7), ENET_MDC */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_MDC_PERIPHERAL                              ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_MDC_SIGNAL                              enet_mdc   /*!< Signal name */\n\n/* GPIO_EMC_41 (coord C7), ENET_MDIO */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_MDIO_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_MDIO_SIGNAL                            enet_mdio   /*!< Signal name */\n\n/* GPIO_B1_10 (coord B13), ENET_TX_CLK */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TX_CLK_PERIPHERAL                           ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TX_CLK_SIGNAL                       enet_ref_clk   /*!< Signal name */\n\n/* GPIO_B1_04 (coord E12), ENET_RXD0 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXD0_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXD0_SIGNAL                         enet_rx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RXD0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_B1_05 (coord D12), ENET_RXD1 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXD1_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXD1_SIGNAL                         enet_rx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_RXD1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_B1_06 (coord C12), ENET_CRS_DV */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_CRS_DV_PERIPHERAL                           ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_CRS_DV_SIGNAL                         enet_rx_en   /*!< Signal name */\n\n/* GPIO_B1_11 (coord C13), ENET_RXER */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_RXER_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_RXER_SIGNAL                           enet_rx_er   /*!< Signal name */\n\n/* GPIO_B1_07 (coord B12), ENET_TXD0 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXD0_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXD0_SIGNAL                         enet_tx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_TXD0_CHANNEL                                  0U   /*!< Signal channel */\n\n/* GPIO_B1_08 (coord A12), ENET_TXD1 */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXD1_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXD1_SIGNAL                         enet_tx_data   /*!< Signal name */\n#define BOARD_INITENETPINS_ENET_TXD1_CHANNEL                                  1U   /*!< Signal channel */\n\n/* GPIO_B1_09 (coord A13), ENET_TXEN */\n/* Routed pin properties */\n#define BOARD_INITENETPINS_ENET_TXEN_PERIPHERAL                             ENET   /*!< Peripheral name */\n#define BOARD_INITENETPINS_ENET_TXEN_SIGNAL                           enet_tx_en   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitENETPins(void);\n\n/* GPIO_SD_B0_05 (coord J2), SD1_D3 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D3_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D3_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_SD_B0_04 (coord H2), SD1_D2 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D2_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D2_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_SD_B0_03 (coord K1), SD1_D1/J24[5]/SPI_MISO */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D1_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D1_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_SD_B0_02 (coord J1), SD1_D0/J24[4]/SPI_MOSI/PWM */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D0_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D0_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_SD_B0_00 (coord J4), SD1_CMD/J24[6] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CMD_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CMD_SIGNAL                             usdhc_cmd   /*!< Signal name */\n\n/* GPIO_SD_B0_01 (coord J3), SD1_CLK/J24[3] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CLK_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CLK_SIGNAL                             usdhc_clk   /*!< Signal name */\n\n/* GPIO_B1_14 (coord C14), SD0_VSELECT */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD0_VSELECT_PERIPHERAL                        USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD0_VSELECT_SIGNAL                     usdhc_vselect   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSDHCPins(void);\n\n/* GPIO_SD_B1_08 (coord P3), FlexSPI_D0_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_SIGNAL                   FLEXSPI_A_DATA0   /*!< Signal name */\n\n/* GPIO_SD_B1_09 (coord N4), FlexSPI_D1_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_SIGNAL                   FLEXSPI_A_DATA1   /*!< Signal name */\n\n/* GPIO_SD_B1_10 (coord P4), FlexSPI_D2_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_SIGNAL                   FLEXSPI_A_DATA2   /*!< Signal name */\n\n/* GPIO_SD_B1_11 (coord P5), FlexSPI_D3_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_SIGNAL                   FLEXSPI_A_DATA3   /*!< Signal name */\n\n/* GPIO_SD_B1_07 (coord L4), FlexSPI_CLK */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_SIGNAL                     FLEXSPI_A_SCLK   /*!< Signal name */\n\n/* GPIO_SD_B1_06 (coord L3), FlexSPI_SS0 */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_SIGNAL                    FLEXSPI_A_SS0_B   /*!< Signal name */\n\n/* GPIO_SD_B1_05 (coord N3), FlexSPI_DQS */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_DQS_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_DQS_SIGNAL                      FLEXSPI_A_DQS   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitQSPIPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/board.cmake",
    "content": "set(MCU_FAMILY RT1064)\nset(MCU_VARIANT MIMXRT1064)\n\nset(JLINK_DEVICE MIMXRT1064xxx6A)\nset(PYOCD_TARGET mimxrt1064)\nset(NXPLINK_DEVICE MIMXRT1064xxxxA:EVK-MIMXRT1064)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkmimxrt1064_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1064DVL6A\n    BOARD_TUD_RHPORT=0\n    BOARD_TUH_RHPORT=1\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: i.MX RT1064 Evaluation Kit\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/MIMXRT1064-EVK\n*/\n\n#ifndef BOARD_MIMXRT1064_EVKB_H_\n#define BOARD_MIMXRT1064_EVKB_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (0x400000U)\n\n// LED: IOMUXC_GPIO_AD_B0_09_GPIO1_IO09\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// SW8 button: IOMUXC_SNVS_WAKEUP_GPIO5_IO00\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_PERIPHERAL\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_CHANNEL\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: IOMUXC_GPIO_AD_B0_13_LPUART1_RX, IOMUXC_GPIO_AD_B0_12_LPUART1_TX\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1064DVL6A\nMCU_FAMILY = RT1064\nMCU_VARIANT = MIMXRT1064\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1064xxx6A\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1064\n\nBOARD_TUD_RHPORT = 0\nBOARD_TUH_RHPORT = 1\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/evkmimxrt1064_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkmimxrt1064_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\"), used))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock\n            .sflashPadType = kSerialFlash_4Pads,\n            .serialClkFreq = kFlexSpiSerialClk_100MHz,\n            .sflashA1Size  = 8u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 256u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/evkmimxrt1064_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__\n#define __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_120MHz = 7,\n    kFlexSpiSerialClk_133MHz = 8,\n    kFlexSpiSerialClk_166MHz = 9,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1064_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1064_evk/mimxrt1064_evk.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1064-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_17 http://mcuxpresso.nxp.com/XSD/mex_configuration_17.xsd\" uuid=\"d75e55f6-68ab-46ef-814b-b94593af7f06\" version=\"17\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_17\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1064xxxxA</processor>\n      <package>MIMXRT1064DVL6A</package>\n      <board>MIMXRT1064-EVK</board>\n      <board_revision>1</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></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=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>24.12.10</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"F14\" pin_signal=\"GPIO_AD_B0_09\" label=\"JTAG_TDI/J21[5]/ENET_RST/J22[5]\" identifier=\"USER_LED\"/>\n               <pin_label pin_num=\"L6\" pin_signal=\"WAKEUP\" label=\"SD_PWREN\" identifier=\"USER_BUTTON\"/>\n            </pin_labels>\n            <power_domains/>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO5\" description=\"Peripheral GPIO5 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 09\" pin_num=\"F14\" pin_signal=\"GPIO_AD_B0_09\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO5\" signal=\"gpio_io, 00\" pin_num=\"L6\" pin_signal=\"WAKEUP\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"TX\" pin_num=\"K14\" pin_signal=\"GPIO_AD_B0_12\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART1\" signal=\"RX\" pin_num=\"L14\" pin_signal=\"GPIO_AD_B0_13\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSDRAMPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SEMC\" description=\"Peripheral SEMC signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDRAMPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 00\" pin_num=\"C2\" pin_signal=\"GPIO_EMC_09\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 01\" pin_num=\"G1\" pin_signal=\"GPIO_EMC_10\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 02\" pin_num=\"G3\" pin_signal=\"GPIO_EMC_11\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 03\" pin_num=\"H1\" pin_signal=\"GPIO_EMC_12\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 04\" pin_num=\"A6\" pin_signal=\"GPIO_EMC_13\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 05\" pin_num=\"B6\" pin_signal=\"GPIO_EMC_14\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 06\" pin_num=\"B1\" pin_signal=\"GPIO_EMC_15\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 07\" pin_num=\"A5\" pin_signal=\"GPIO_EMC_16\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 08\" pin_num=\"A4\" pin_signal=\"GPIO_EMC_17\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 09\" pin_num=\"B2\" pin_signal=\"GPIO_EMC_18\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 10\" pin_num=\"G2\" pin_signal=\"GPIO_EMC_23\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 11\" pin_num=\"B4\" pin_signal=\"GPIO_EMC_19\"/>\n                  <pin peripheral=\"SEMC\" signal=\"ADDR, 12\" pin_num=\"A3\" pin_signal=\"GPIO_EMC_20\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 0\" pin_num=\"C1\" pin_signal=\"GPIO_EMC_21\"/>\n                  <pin peripheral=\"SEMC\" signal=\"BA, 1\" pin_num=\"F1\" pin_signal=\"GPIO_EMC_22\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cas\" pin_num=\"D3\" pin_signal=\"GPIO_EMC_24\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_cke\" pin_num=\"A2\" pin_signal=\"GPIO_EMC_27\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_clk\" pin_num=\"B3\" pin_signal=\"GPIO_EMC_26\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 00\" pin_num=\"E3\" pin_signal=\"GPIO_EMC_00\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 01\" pin_num=\"F3\" pin_signal=\"GPIO_EMC_01\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 02\" pin_num=\"F4\" pin_signal=\"GPIO_EMC_02\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 03\" pin_num=\"G4\" pin_signal=\"GPIO_EMC_03\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 04\" pin_num=\"F2\" pin_signal=\"GPIO_EMC_04\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 05\" pin_num=\"G5\" pin_signal=\"GPIO_EMC_05\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 06\" pin_num=\"H5\" pin_signal=\"GPIO_EMC_06\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 07\" pin_num=\"H4\" pin_signal=\"GPIO_EMC_07\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 08\" pin_num=\"C6\" pin_signal=\"GPIO_EMC_30\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 09\" pin_num=\"C5\" pin_signal=\"GPIO_EMC_31\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 10\" pin_num=\"D5\" pin_signal=\"GPIO_EMC_32\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 11\" pin_num=\"C4\" pin_signal=\"GPIO_EMC_33\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 12\" pin_num=\"D4\" pin_signal=\"GPIO_EMC_34\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 13\" pin_num=\"E5\" pin_signal=\"GPIO_EMC_35\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 14\" pin_num=\"C3\" pin_signal=\"GPIO_EMC_36\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DATA, 15\" pin_num=\"E4\" pin_signal=\"GPIO_EMC_37\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 0\" pin_num=\"H3\" pin_signal=\"GPIO_EMC_08\"/>\n                  <pin peripheral=\"SEMC\" signal=\"DM, 1\" pin_num=\"D6\" pin_signal=\"GPIO_EMC_38\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_ras\" pin_num=\"D2\" pin_signal=\"GPIO_EMC_25\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_we\" pin_num=\"D1\" pin_signal=\"GPIO_EMC_28\"/>\n                  <pin peripheral=\"SEMC\" signal=\"CS, 0\" pin_num=\"E1\" pin_signal=\"GPIO_EMC_29\"/>\n                  <pin peripheral=\"SEMC\" signal=\"semc_dqs\" pin_num=\"B7\" pin_signal=\"GPIO_EMC_39\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitCSIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"CSI\" description=\"Peripheral CSI signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPI2C1\" description=\"Peripheral LPI2C1 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCSIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 09\" pin_num=\"H13\" pin_signal=\"GPIO_AD_B1_08\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 08\" pin_num=\"M13\" pin_signal=\"GPIO_AD_B1_09\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 07\" pin_num=\"L13\" pin_signal=\"GPIO_AD_B1_10\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 06\" pin_num=\"J13\" pin_signal=\"GPIO_AD_B1_11\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 05\" pin_num=\"H12\" pin_signal=\"GPIO_AD_B1_12\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 04\" pin_num=\"H11\" pin_signal=\"GPIO_AD_B1_13\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 02\" pin_num=\"J14\" pin_signal=\"GPIO_AD_B1_15\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_data, 03\" pin_num=\"G12\" pin_signal=\"GPIO_AD_B1_14\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_pixclk\" pin_num=\"L12\" pin_signal=\"GPIO_AD_B1_04\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_mclk\" pin_num=\"K12\" pin_signal=\"GPIO_AD_B1_05\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_vsync\" pin_num=\"J12\" pin_signal=\"GPIO_AD_B1_06\"/>\n                  <pin peripheral=\"CSI\" signal=\"csi_hsync\" pin_num=\"K10\" pin_signal=\"GPIO_AD_B1_07\"/>\n                  <pin peripheral=\"LPI2C1\" signal=\"SCL\" pin_num=\"J11\" pin_signal=\"GPIO_AD_B1_00\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"CSI_I2C_SCL\"/>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_22K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Enable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPI2C1\" signal=\"SDA\" pin_num=\"K11\" pin_signal=\"GPIO_AD_B1_01\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"CSI_I2C_SDA\"/>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_22K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Enable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 04\" pin_num=\"F11\" pin_signal=\"GPIO_AD_B0_04\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLCDPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LCDIF\" description=\"Peripheral LCDIF signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLCDPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 00\" pin_num=\"C8\" pin_signal=\"GPIO_B0_04\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 01\" pin_num=\"B8\" pin_signal=\"GPIO_B0_05\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 02\" pin_num=\"A8\" pin_signal=\"GPIO_B0_06\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_clk\" pin_num=\"D7\" pin_signal=\"GPIO_B0_00\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 03\" pin_num=\"A9\" pin_signal=\"GPIO_B0_07\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 04\" pin_num=\"B9\" pin_signal=\"GPIO_B0_08\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 05\" pin_num=\"C9\" pin_signal=\"GPIO_B0_09\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 06\" pin_num=\"D9\" pin_signal=\"GPIO_B0_10\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 07\" pin_num=\"A10\" pin_signal=\"GPIO_B0_11\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 08\" pin_num=\"C10\" pin_signal=\"GPIO_B0_12\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 09\" pin_num=\"D10\" pin_signal=\"GPIO_B0_13\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 10\" pin_num=\"E10\" pin_signal=\"GPIO_B0_14\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 11\" pin_num=\"E11\" pin_signal=\"GPIO_B0_15\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 12\" pin_num=\"A11\" pin_signal=\"GPIO_B1_00\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 13\" pin_num=\"B11\" pin_signal=\"GPIO_B1_01\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 14\" pin_num=\"C11\" pin_signal=\"GPIO_B1_02\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_data, 15\" pin_num=\"D11\" pin_signal=\"GPIO_B1_03\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_enable\" pin_num=\"E7\" pin_signal=\"GPIO_B0_01\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_hsync\" pin_num=\"E8\" pin_signal=\"GPIO_B0_02\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LCDIF\" signal=\"lcdif_vsync\" pin_num=\"D8\" pin_signal=\"GPIO_B0_03\">\n                     <pin_features>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 31\" pin_num=\"B14\" pin_signal=\"GPIO_B1_15\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"gpio_io, 02\" pin_num=\"M11\" pin_signal=\"GPIO_AD_B0_02\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitCANPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"CAN2\" description=\"Peripheral CAN2 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitCANPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"CAN2\" signal=\"TX\" pin_num=\"H14\" pin_signal=\"GPIO_AD_B0_14\"/>\n                  <pin peripheral=\"CAN2\" signal=\"RX\" pin_num=\"L10\" pin_signal=\"GPIO_AD_B0_15\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitENETPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"ENET\" description=\"Peripheral ENET signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENETPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdc\" pin_num=\"A7\" pin_signal=\"GPIO_EMC_40\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_mdio\" pin_num=\"C7\" pin_signal=\"GPIO_EMC_41\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_ref_clk\" pin_num=\"B13\" pin_signal=\"GPIO_B1_10\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 0\" pin_num=\"E12\" pin_signal=\"GPIO_B1_04\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_data, 1\" pin_num=\"D12\" pin_signal=\"GPIO_B1_05\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_en\" pin_num=\"C12\" pin_signal=\"GPIO_B1_06\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_rx_er\" pin_num=\"C13\" pin_signal=\"GPIO_B1_11\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 0\" pin_num=\"B12\" pin_signal=\"GPIO_B1_07\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_data, 1\" pin_num=\"A12\" pin_signal=\"GPIO_B1_08\"/>\n                  <pin peripheral=\"ENET\" signal=\"enet_tx_en\" pin_num=\"A13\" pin_signal=\"GPIO_B1_09\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSDHCPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USDHC1\" description=\"Peripheral USDHC1 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 3\" pin_num=\"J2\" pin_signal=\"GPIO_SD_B0_05\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 2\" pin_num=\"H2\" pin_signal=\"GPIO_SD_B0_04\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 1\" pin_num=\"K1\" pin_signal=\"GPIO_SD_B0_03\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 0\" pin_num=\"J1\" pin_signal=\"GPIO_SD_B0_02\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_cmd\" pin_num=\"J4\" pin_signal=\"GPIO_SD_B0_00\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_clk\" pin_num=\"J3\" pin_signal=\"GPIO_SD_B0_01\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_vselect\" pin_num=\"C14\" pin_signal=\"GPIO_B1_14\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitQSPIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXSPI\" description=\"Peripheral FLEXSPI signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA0\" pin_num=\"P3\" pin_signal=\"GPIO_SD_B1_08\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA1\" pin_num=\"N4\" pin_signal=\"GPIO_SD_B1_09\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA2\" pin_num=\"P4\" pin_signal=\"GPIO_SD_B1_10\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA3\" pin_num=\"P5\" pin_signal=\"GPIO_SD_B1_11\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SCLK\" pin_num=\"L4\" pin_signal=\"GPIO_SD_B1_07\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SS0_B\" pin_num=\"L3\" pin_signal=\"GPIO_SD_B1_06\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DQS\" pin_num=\"N3\" pin_signal=\"GPIO_SD_B1_05\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"15.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"AHB_CLK_ROOT.outFreq\" value=\"600 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN_CLK_ROOT.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI_CLK_ROOT.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET2_125M_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_125M_CLK.outFreq\" value=\"2.4 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_25M_REF_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO2_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI2_CLK_ROOT.outFreq\" value=\"1440/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"1440/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"150 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LCDIF_CLK_ROOT.outFreq\" value=\"67.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LVDS1_CLK.outFreq\" value=\"1.2 GHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PLL7_MAIN_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SEMC_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY1_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY2_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC1_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC2_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.ARM_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI2_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI2_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.LCDIF_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.LCDIF_PRED.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.SEMC_PODF.scale\" value=\"8\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_BYPASS.sel\" value=\"CCM_ANALOG.PLL1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_PREDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_VDIV.scale\" value=\"50\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"33\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_DIV.scale\" value=\"16\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.denom\" value=\"50\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.div\" value=\"47\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.denom\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.div\" value=\"31\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.num\" value=\"0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_BYPASS.sel\" value=\"CCM_ANALOG.PLL5_POST_DIV\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_POST_DIV.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL7_BYPASS.sel\" value=\"CCM_ANALOG.PLL7\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.VIDEO_DIV.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_POWERDOWN_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG\" value=\"No\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"1c6563a6-c68b-40e5-8828-2853c99f95fa\" called_from_default_init=\"true\" id_prefix=\"BOARD_\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"CAN\" uuid=\"e311ffe2-a68e-4ccc-bab1-c97e2207c5f0\" type=\"flexcan\" type_id=\"flexcan_ba45456ec815807245205237e2bf425b\" mode=\"interrupts\" peripheral=\"CAN2\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"interruptsCfg\">\n                        <setting name=\"messageBufferIrqs\" value=\"0\"/>\n                        <setting name=\"messageBufferIrqs2\" value=\"0\"/>\n                        <set name=\"interruptsEnable\">\n                           <selected/>\n                        </set>\n                        <setting name=\"enable_irq\" value=\"false\"/>\n                        <struct name=\"interrupt_shared\">\n                           <setting name=\"IRQn\" value=\"CAN2_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"fsl_flexcan\" quick_selection=\"default\">\n                        <struct name=\"can_config\">\n                           <setting name=\"clockSource\" value=\"kFLEXCAN_ClkSrcOsc\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate\" value=\"1000000\"/>\n                           <setting name=\"maxMbNum\" value=\"16\"/>\n                           <setting name=\"enableLoopBack\" value=\"false\"/>\n                           <setting name=\"enableSelfWakeup\" value=\"false\"/>\n                           <setting name=\"enableIndividMask\" value=\"false\"/>\n                           <struct name=\"timingConfig\">\n                              <setting name=\"propSeg\" value=\"2\"/>\n                              <setting name=\"phaseSeg1\" value=\"4\"/>\n                              <setting name=\"phaseSeg2\" value=\"3\"/>\n                              <setting name=\"rJumpwidth\" value=\"2\"/>\n                              <struct name=\"bitTime\"/>\n                           </struct>\n                        </struct>\n                        <setting name=\"enableRxFIFO\" value=\"false\"/>\n                        <struct name=\"rxFIFO\">\n                           <setting name=\"idFilterTable\" value=\"\"/>\n                           <setting name=\"idFilterNum\" value=\"num0\"/>\n                           <setting name=\"idFilterType\" value=\"kFLEXCAN_RxFifoFilterTypeA\"/>\n                           <setting name=\"priority\" value=\"kFLEXCAN_RxFifoPrioLow\"/>\n                        </struct>\n                        <array name=\"channels\">\n                           <struct name=\"0\">\n                              <setting name=\"mbID\" value=\"0\"/>\n                              <setting name=\"mbType\" value=\"mbRx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                           <struct name=\"1\">\n                              <setting name=\"mbID\" value=\"1\"/>\n                              <setting name=\"mbType\" value=\"mbTx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                        </array>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI_LPI2C\" uuid=\"7b69310c-fa35-4379-ac89-358df9280646\" type=\"lpi2c\" type_id=\"lpi2c_db68d4f4f06a22e25ab51fe9bd6db4d2\" mode=\"master\" peripheral=\"LPI2C1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"main\" quick_selection=\"qs_interrupt\">\n                        <setting name=\"clockSource\" value=\"Lpi2cClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LPI2C1_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"master\" quick_selection=\"qs_master_transfer\">\n                        <setting name=\"mode\" value=\"transfer\"/>\n                        <struct name=\"config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"enableDoze\" value=\"true\"/>\n                           <setting name=\"debugEnable\" value=\"false\"/>\n                           <setting name=\"ignoreAck\" value=\"false\"/>\n                           <setting name=\"pinConfig\" value=\"kLPI2C_2PinOpenDrain\"/>\n                           <setting name=\"baudRate_Hz\" value=\"100000\"/>\n                           <setting name=\"busIdleTimeout_ns\" value=\"0\"/>\n                           <setting name=\"pinLowTimeout_ns\" value=\"0\"/>\n                           <setting name=\"sdaGlitchFilterWidth_ns\" value=\"0\"/>\n                           <setting name=\"sclGlitchFilterWidth_ns\" value=\"0\"/>\n                           <struct name=\"hostRequest\">\n                              <setting name=\"enable\" value=\"false\"/>\n                              <setting name=\"source\" value=\"kLPI2C_HostRequestExternalPin\"/>\n                              <setting name=\"polarity\" value=\"kLPI2C_HostRequestPinActiveHigh\"/>\n                           </struct>\n                           <set name=\"edmaRequestSources\">\n                              <selected/>\n                           </set>\n                        </struct>\n                        <struct name=\"transfer\">\n                           <setting name=\"blocking\" value=\"false\"/>\n                           <setting name=\"enable_custom_handle\" value=\"false\"/>\n                           <struct name=\"callback\">\n                              <setting name=\"name\" value=\"\"/>\n                              <setting name=\"userData\" value=\"\"/>\n                           </struct>\n                           <set name=\"flags\">\n                              <selected/>\n                           </set>\n                           <setting name=\"slaveAddress\" value=\"0\"/>\n                           <setting name=\"direction\" value=\"kLPI2C_Write\"/>\n                           <setting name=\"subaddress\" value=\"0\"/>\n                           <setting name=\"subaddressSize\" value=\"1\"/>\n                           <setting name=\"blocking_buffer\" value=\"false\"/>\n                           <setting name=\"enable_custom_buffer\" value=\"false\"/>\n                           <setting name=\"dataSize\" value=\"1\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI_RGB565\" uuid=\"ae342c96-df71-41a3-8419-3cccf201c91e\" type=\"csi\" type_id=\"csi_20660d007fd9c28a0b6ec615663d2939\" mode=\"interrupt\" peripheral=\"CSI\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_csi\">\n                        <struct name=\"clockConfig\">\n                           <setting name=\"clockSource\" value=\"BusInterfaceClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"BOARD_BootClockRUN\"/>\n                           <setting name=\"masterClockSource\" value=\"CsiClock\"/>\n                           <setting name=\"masterClockSourceFreq\" value=\"BOARD_BootClockRUN\"/>\n                        </struct>\n                        <struct name=\"config\">\n                           <setting name=\"format\" value=\"RGB565\"/>\n                           <setting name=\"i_width\" value=\"320\"/>\n                           <setting name=\"i_height\" value=\"240\"/>\n                           <setting name=\"dataBus\" value=\"kCSI_DataBus8Bit\"/>\n                           <setting name=\"workMode\" value=\"kCSI_GatedClockMode\"/>\n                           <setting name=\"useExtVsync\" value=\"true\"/>\n                           <set name=\"polarityFlags\">\n                              <selected>\n                                 <id>kCSI_HsyncActiveHigh</id>\n                                 <id>kCSI_VsyncActiveLow</id>\n                              </selected>\n                           </set>\n                           <struct name=\"buffers_config\">\n                              <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                              <setting name=\"bufCount\" value=\"4\"/>\n                              <setting name=\"bufferAlign\" value=\"64\"/>\n                           </struct>\n                        </struct>\n                        <struct name=\"interruptsCfg\">\n                           <set name=\"interruptSources\">\n                              <selected/>\n                           </set>\n                           <setting name=\"isInterruptEnabled\" value=\"false\"/>\n                           <struct name=\"interrupt\">\n                              <setting name=\"IRQn\" value=\"CSI_IRQn\"/>\n                              <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                              <setting name=\"enable_priority\" value=\"false\"/>\n                              <setting name=\"priority\" value=\"0\"/>\n                              <setting name=\"enable_custom_name\" value=\"false\"/>\n                           </struct>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"81411659-def5-4dbf-839a-d5e5f32dec0b\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LCD_RGB565\" uuid=\"8c491814-4517-44d9-95de-844144e0c6b5\" type=\"elcdif\" type_id=\"elcdif_1c39bcb43ed1a24bc8980672c7378576\" mode=\"rgbMode\" peripheral=\"LCDIF\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_elcdif\">\n                        <struct name=\"config\">\n                           <setting name=\"panelWidthInt\" value=\"480\"/>\n                           <setting name=\"panelHeightInt\" value=\"272\"/>\n                           <setting name=\"hsw\" value=\"41\"/>\n                           <setting name=\"hfp\" value=\"4\"/>\n                           <setting name=\"hbp\" value=\"8\"/>\n                           <setting name=\"vsw\" value=\"10\"/>\n                           <setting name=\"vfp\" value=\"4\"/>\n                           <setting name=\"vbp\" value=\"2\"/>\n                           <setting name=\"frameRate\" value=\"60 Hz\"/>\n                           <setting name=\"clockSource\" value=\"LcdIfClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <struct name=\"polarityFlags_st\">\n                              <setting name=\"vSyncActive\" value=\"kELCDIF_VsyncActiveLow\"/>\n                              <setting name=\"hSyncActive\" value=\"kELCDIF_HsyncActiveLow\"/>\n                              <setting name=\"dataEnableActive\" value=\"kELCDIF_DataEnableActiveLow\"/>\n                              <setting name=\"driveDataClkEdge\" value=\"kELCDIF_DriveDataOnFallingClkEdge\"/>\n                           </struct>\n                           <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                           <setting name=\"bufferAlign\" value=\"64\"/>\n                           <setting name=\"pixelFormat\" value=\"kELCDIF_PixelFormatRGB565\"/>\n                           <setting name=\"dataBus\" value=\"kELCDIF_DataBus16Bit\"/>\n                           <setting name=\"enablePxpHandShake\" value=\"false\"/>\n                           <setting name=\"start\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"isInterruptEnabled\" value=\"true\"/>\n                        <set name=\"elcdifInterruptSources\">\n                           <selected>\n                              <id>kELCDIF_CurFrameDoneInterruptEnable</id>\n                           </selected>\n                        </set>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LCDIF_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"352dfcca-72ab-4214-bb68-9c1a927c4922\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"fe5e46a0-17b8-41e8-9cbc-ffb6f1cf78c1\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"f79f6878-69b5-4063-9007-0b8e509f7274\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"7ce8b24b-29e6-4b69-86e5-bdfd641cef44\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"ef6a8ae2-3961-4a05-a37f-d42a6a4d8a56\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"00a2a52b-0c40-4dbf-a6d0-5257cfc384e0\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"f30f7e21-6805-4236-9ab3-ff06a6013fa1\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"ea574324-8cc3-4da3-bdfc-2bdba0dfc3df\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetRootClock() to configure corresponding module clock source and divider.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v15.0\nprocessor: MIMXRT1176xxxxx\npackage_id: MIMXRT1176DVMAA\nmcu_data: ksdk2_0\nprocessor_version: 24.12.10\nboard: MIMXRT1170-EVKB\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_dcdc.h\"\n#include \"fsl_pmu.h\"\n#include \"fsl_clock.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n/* This function should not run from SDRAM since it will change SEMC configuration. */\nAT_QUICKACCESS_SECTION_CODE(void UpdateSemcClock(void));\nvoid UpdateSemcClock(void)\n{\n    /* Enable self-refresh mode and update semc clock root to 200MHz. */\n    SEMC->IPCMD = 0xA55A000D;\n    while ((SEMC->INTR & 0x3) == 0)\n        ;\n    SEMC->INTR                                = 0x3;\n    SEMC->DCCR                                = 0x0B;\n    /*\n    * Currently we are using SEMC parameter which fit both 166MHz and 200MHz, only\n    * need to change the SEMC clock root here. If customer is using their own DCD and\n    * want to switch from 166MHz to 200MHz, extra SEMC configuration might need to be\n    * adjusted here to fine tune the SDRAM performance\n    */\n    CCM->CLOCK_ROOT[kCLOCK_Root_Semc].CONTROL = 0x602;\n}\n#endif\n#endif\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: ACMP_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ADC1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ADC2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ARM_PLL_CLK.outFreq, value: 996 MHz}\n- {id: ASRC_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: AXI_CLK_ROOT.outFreq, value: 996 MHz}\n- {id: BUS_CLK_ROOT.outFreq, value: 240 MHz}\n- {id: BUS_LPSR_CLK_ROOT.outFreq, value: 160 MHz}\n- {id: CAN1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CAN2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CAN3_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CCM_CLKO1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CCM_CLKO2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CSI2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CSI2_ESC_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CSI2_UI_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CSI_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CSSYS_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: CSTRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: ELCDIF_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: EMV1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: EMV2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ENET1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ENET2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ENET_1G_TX_CLK.outFreq, value: 24 MHz}\n- {id: ENET_25M_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ENET_QOS_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ENET_TIMER1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ENET_TIMER2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: ENET_TIMER3_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: FLEXIO2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: FLEXSPI1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: FLEXSPI2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: GC355_CLK_ROOT.outFreq, value: 492.0000125 MHz}\n- {id: GPT1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 24 MHz}\n- {id: GPT2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 24 MHz}\n- {id: GPT3_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: GPT3_ipg_clk_highfreq.outFreq, value: 24 MHz}\n- {id: GPT4_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: GPT4_ipg_clk_highfreq.outFreq, value: 24 MHz}\n- {id: GPT5_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: GPT5_ipg_clk_highfreq.outFreq, value: 24 MHz}\n- {id: GPT6_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: GPT6_ipg_clk_highfreq.outFreq, value: 24 MHz}\n- {id: LCDIFV2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPI2C1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPI2C2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPI2C3_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPI2C4_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPI2C5_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPI2C6_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPSPI1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPSPI2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPSPI3_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPSPI4_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPSPI5_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPSPI6_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART10_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART11_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART12_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART3_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART4_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART5_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART6_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART7_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART8_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: LPUART9_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: M4_CLK_ROOT.outFreq, value: 4320/11 MHz}\n- {id: M4_SYSTICK_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: M7_CLK_ROOT.outFreq, value: 996 MHz}\n- {id: M7_SYSTICK_CLK_ROOT.outFreq, value: 100 kHz}\n- {id: MIC_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: MIPI_DSI_TX_CLK_ESC_ROOT.outFreq, value: 24 MHz}\n- {id: MIPI_ESC_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: MIPI_REF_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: MQS_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: MQS_MCLK.outFreq, value: 24 MHz}\n- {id: OSC_24M.outFreq, value: 24 MHz}\n- {id: OSC_32K.outFreq, value: 32.768 kHz}\n- {id: OSC_RC_16M.outFreq, value: 16 MHz}\n- {id: OSC_RC_400M.outFreq, value: 400 MHz}\n- {id: OSC_RC_48M.outFreq, value: 48 MHz}\n- {id: OSC_RC_48M_DIV2.outFreq, value: 24 MHz}\n- {id: PLL_VIDEO_CLK.outFreq, value: 984.000025 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 24 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 24 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 24 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 24 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 24 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 24 MHz}\n- {id: SAI4_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: SAI4_MCLK1.outFreq, value: 24 MHz}\n- {id: SEMC_CLK_ROOT.outFreq, value: 198 MHz}\n- {id: SPDIF_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: SYS_PLL2_CLK.outFreq, value: 528 MHz}\n- {id: SYS_PLL2_PFD0_CLK.outFreq, value: 352 MHz}\n- {id: SYS_PLL2_PFD1_CLK.outFreq, value: 594 MHz}\n- {id: SYS_PLL2_PFD2_CLK.outFreq, value: 396 MHz}\n- {id: SYS_PLL2_PFD3_CLK.outFreq, value: 297 MHz}\n- {id: SYS_PLL3_CLK.outFreq, value: 480 MHz}\n- {id: SYS_PLL3_DIV2_CLK.outFreq, value: 240 MHz}\n- {id: SYS_PLL3_PFD0_CLK.outFreq, value: 8640/13 MHz}\n- {id: SYS_PLL3_PFD1_CLK.outFreq, value: 8640/17 MHz}\n- {id: SYS_PLL3_PFD2_CLK.outFreq, value: 270 MHz}\n- {id: SYS_PLL3_PFD3_CLK.outFreq, value: 4320/11 MHz}\n- {id: USDHC1_CLK_ROOT.outFreq, value: 24 MHz}\n- {id: USDHC2_CLK_ROOT.outFreq, value: 24 MHz}\nsettings:\n- {id: CoreBusClockRootsInitializationConfig, value: selectedCore}\n- {id: SOCDomainVoltage, value: OD}\n- {id: ANADIG_OSC_OSC_24M_CTRL_LP_EN_CFG, value: Low}\n- {id: ANADIG_OSC_OSC_24M_CTRL_OSC_EN_CFG, value: Enabled}\n- {id: ANADIG_PLL.PLL_AUDIO_BYPASS.sel, value: ANADIG_OSC.OSC_24M}\n- {id: ANADIG_PLL.PLL_VIDEO.denom, value: '960000'}\n- {id: ANADIG_PLL.PLL_VIDEO.div, value: '41'}\n- {id: ANADIG_PLL.PLL_VIDEO.num, value: '1'}\n- {id: ANADIG_PLL.SYS_PLL1_BYPASS.sel, value: ANADIG_OSC.OSC_24M}\n- {id: ANADIG_PLL.SYS_PLL2.denom, value: '268435455'}\n- {id: ANADIG_PLL.SYS_PLL2.div, value: '22'}\n- {id: ANADIG_PLL.SYS_PLL2.num, value: '0'}\n- {id: ANADIG_PLL.SYS_PLL2_SS_DIV.scale, value: '268435455'}\n- {id: ANADIG_PLL.SYS_PLL3_PFD3_DIV.scale, value: '22', locked: true}\n- {id: ANADIG_PLL.SYS_PLL3_PFD3_MUL.scale, value: '18', locked: true}\n- {id: ANADIG_PLL_ARM_PLL_CTRL_POWERUP_CFG, value: Enabled}\n- {id: ANADIG_PLL_PLL_AUDIO_CTRL_GATE_CFG, value: Disabled}\n- {id: ANADIG_PLL_PLL_VIDEO_CTRL0_POWERUP_CFG, value: Enabled}\n- {id: ANADIG_PLL_SYS_PLL1_CTRL0_POWERUP_CFG, value: Disabled}\n- {id: ANADIG_PLL_SYS_PLL1_CTRL_GATE_CFG, value: Disabled}\n- {id: ANADIG_PLL_SYS_PLL2_CTRL_POWERUP_CFG, value: Enabled}\n- {id: ANADIG_PLL_SYS_PLL3_CTRL_POWERUP_CFG, value: Enabled}\n- {id: ANADIG_PLL_SYS_PLL3_CTRL_SYS_PLL3_DIV2_CFG, value: Enabled}\n- {id: CCM.CLOCK_ROOT0.MUX.sel, value: ANADIG_PLL.ARM_PLL_CLK}\n- {id: CCM.CLOCK_ROOT1.MUX.sel, value: ANADIG_PLL.SYS_PLL3_PFD3_CLK}\n- {id: CCM.CLOCK_ROOT2.DIV.scale, value: '2'}\n- {id: CCM.CLOCK_ROOT2.MUX.sel, value: ANADIG_PLL.SYS_PLL3_CLK}\n- {id: CCM.CLOCK_ROOT25.DIV.scale, value: '22'}\n- {id: CCM.CLOCK_ROOT25.MUX.sel, value: ANADIG_PLL.SYS_PLL2_CLK}\n- {id: CCM.CLOCK_ROOT26.DIV.scale, value: '22'}\n- {id: CCM.CLOCK_ROOT26.MUX.sel, value: ANADIG_PLL.SYS_PLL2_CLK}\n- {id: CCM.CLOCK_ROOT3.DIV.scale, value: '3'}\n- {id: CCM.CLOCK_ROOT3.MUX.sel, value: ANADIG_PLL.SYS_PLL3_CLK}\n- {id: CCM.CLOCK_ROOT4.DIV.scale, value: '3'}\n- {id: CCM.CLOCK_ROOT4.MUX.sel, value: ANADIG_PLL.SYS_PLL2_PFD1_CLK}\n- {id: CCM.CLOCK_ROOT6.DIV.scale, value: '4'}\n- {id: CCM.CLOCK_ROOT6.MUX.sel, value: ANADIG_PLL.SYS_PLL2_CLK}\n- {id: CCM.CLOCK_ROOT68.DIV.scale, value: '2'}\n- {id: CCM.CLOCK_ROOT68.MUX.sel, value: ANADIG_PLL.PLL_VIDEO_CLK}\n- {id: CCM.CLOCK_ROOT8.DIV.scale, value: '240'}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\n\n#ifndef SKIP_POWER_ADJUSTMENT\n#if __CORTEX_M == 7\n#define BYPASS_LDO_LPSR 1\n#define SKIP_LDO_ADJUSTMENT 1\n#elif __CORTEX_M == 4\n#define SKIP_DCDC_ADJUSTMENT 1\n#define SKIP_FBB_ENABLE 1\n#endif\n#endif\n\nconst clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =\n    {\n        .postDivider = kCLOCK_PllPostDiv2,        /* Post divider, 0 - DIV by 2, 1 - DIV by 4, 2 - DIV by 8, 3 - DIV by 1 */\n        .loopDivider = 166,                       /* PLL Loop divider, Fout = Fin * ( loopDivider / ( 2 * postDivider ) ) */\n    };\n\nconst clock_sys_pll2_config_t sysPll2Config_BOARD_BootClockRUN =\n    {\n        .mfd = 268435455,                         /* Denominator of spread spectrum */\n        .ss = NULL,                               /* Spread spectrum parameter */\n        .ssEnable = false,                        /* Enable spread spectrum or not */\n    };\n\nconst clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 41,                        /* PLL Loop divider, valid range for DIV_SELECT divider value: 27 ~ 54. */\n        .postDivider = 0,                         /* Divider after PLL, should only be 1, 2, 4, 8, 16, 32 */\n        .numerator = 1,                           /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .denominator = 960000,                    /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .ss = NULL,                               /* Spread spectrum parameter */\n        .ssEnable = false,                        /* Enable spread spectrum or not */\n    };\n\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    clock_root_config_t rootCfg = {0};\n\n#if !defined(SKIP_DCDC_CONFIGURATION) || (!SKIP_DCDC_CONFIGURATION)\n    /* Set DCDC to DCM mode to improve the efficiency for light loading in run mode and transient performance with a big loading step. */\n    DCDC_BootIntoDCM(DCDC);\n\n#if !defined(SKIP_DCDC_ADJUSTMENT) || (!SKIP_DCDC_ADJUSTMENT)\n    if((OCOTP->FUSEN[16].FUSE == 0x57AC5969U) && ((OCOTP->FUSEN[17].FUSE & 0xFFU) == 0x0BU))\n    {\n        DCDC_SetVDD1P0BuckModeTargetVoltage(DCDC, kDCDC_1P0BuckTarget1P15V);\n    }\n    else\n    {\n        /* Set 1.125V for production samples to align with data sheet requirement */\n        DCDC_SetVDD1P0BuckModeTargetVoltage(DCDC, kDCDC_1P0BuckTarget1P125V);\n    }\n#endif /* SKIP_DCDC_ADJUSTMENT */\n#endif /* SKIP_DCDC_CONFIGURATION */\n\n#if !defined(SKIP_FBB_ENABLE) || (!SKIP_FBB_ENABLE)\n    /* Check if FBB need to be enabled in OverDrive(OD) mode */\n    if(((OCOTP->FUSEN[7].FUSE & 0x10U) >> 4U) != 1)\n    {\n        PMU_EnableBodyBias(ANADIG_PMU, kPMU_FBB_CM7, true);\n    }\n    else\n    {\n        PMU_EnableBodyBias(ANADIG_PMU, kPMU_FBB_CM7, false);\n    }\n#endif\n\n#if defined(BYPASS_LDO_LPSR) && BYPASS_LDO_LPSR\n    PMU_StaticEnableLpsrAnaLdoBypassMode(ANADIG_LDO_SNVS, true);\n    PMU_StaticEnableLpsrDigLdoBypassMode(ANADIG_LDO_SNVS, true);\n#endif\n\n#if !defined(SKIP_LDO_ADJUSTMENT) || (!SKIP_LDO_ADJUSTMENT)\n    pmu_static_lpsr_ana_ldo_config_t lpsrAnaConfig;\n    pmu_static_lpsr_dig_config_t lpsrDigConfig;\n\n    if((ANADIG_LDO_SNVS->PMU_LDO_LPSR_ANA & ANADIG_LDO_SNVS_PMU_LDO_LPSR_ANA_BYPASS_MODE_EN_MASK) == 0UL)\n    {\n        PMU_StaticGetLpsrAnaLdoDefaultConfig(&lpsrAnaConfig);\n        PMU_StaticLpsrAnaLdoInit(ANADIG_LDO_SNVS, &lpsrAnaConfig);\n    }\n\n    if((ANADIG_LDO_SNVS->PMU_LDO_LPSR_DIG & ANADIG_LDO_SNVS_PMU_LDO_LPSR_DIG_BYPASS_MODE_MASK) == 0UL)\n    {\n        PMU_StaticGetLpsrDigLdoDefaultConfig(&lpsrDigConfig);\n        lpsrDigConfig.targetVoltage = kPMU_LpsrDigTargetStableVoltage1P117V;\n        PMU_StaticLpsrDigLdoInit(ANADIG_LDO_SNVS, &lpsrDigConfig);\n    }\n#endif\n\n    /* Config CLK_1M */\n    CLOCK_OSC_Set1MHzOutputBehavior(kCLOCK_1MHzOutEnableFreeRunning1Mhz);\n\n    /* Init OSC RC 16M */\n    ANADIG_OSC->OSC_16M_CTRL |= ANADIG_OSC_OSC_16M_CTRL_EN_IRC4M16M_MASK;\n\n    /* Init OSC RC 400M */\n    CLOCK_OSC_EnableOscRc400M();\n\n    /* Init OSC RC 48M */\n    CLOCK_OSC_EnableOsc48M(true);\n    CLOCK_OSC_EnableOsc48MDiv2(true);\n\n    /* Config OSC 24M */\n    ANADIG_OSC->OSC_24M_CTRL |= ANADIG_OSC_OSC_24M_CTRL_OSC_EN(1) | ANADIG_OSC_OSC_24M_CTRL_BYPASS_EN(0) | ANADIG_OSC_OSC_24M_CTRL_BYPASS_CLK(0) | ANADIG_OSC_OSC_24M_CTRL_LP_EN(1) | ANADIG_OSC_OSC_24M_CTRL_OSC_24M_GATE(0);\n    /* Wait for 24M OSC to be stable. */\n    while (ANADIG_OSC_OSC_24M_CTRL_OSC_24M_STABLE_MASK !=\n            (ANADIG_OSC->OSC_24M_CTRL & ANADIG_OSC_OSC_24M_CTRL_OSC_24M_STABLE_MASK))\n    {\n    }\n\n    /* Switch core M7 clock root to OscRC48MDiv2 first */\n#if __CORTEX_M == 7\n    rootCfg.mux = kCLOCK_M7_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_M7, &rootCfg);\n#endif\n\n    /* Switch core M7 systick clock root to OscRC48MDiv2 first */\n#if __CORTEX_M == 7\n    rootCfg.mux = kCLOCK_M7_SYSTICK_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_M7_Systick, &rootCfg);\n#endif\n\n    /* Switch core M4 clock root to OscRC48MDiv2 first */\n#if __CORTEX_M == 4\n    rootCfg.mux = kCLOCK_M4_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_M4, &rootCfg);\n#endif\n\n    /* Switch the Bus_Lpsr clock root to OscRC48MDiv2 first */\n#if __CORTEX_M == 4\n    rootCfg.mux = kCLOCK_BUS_LPSR_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Bus_Lpsr, &rootCfg);\n#endif\n\n    /*\n    * if DCD is used, please make sure the clock source of SEMC is not changed in the following PLL/PFD configuration code.\n    */\n    /* Init Arm Pll. */\n    CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN);\n\n    /* Bypass Sys Pll1. */\n    CLOCK_SetPllBypass(kCLOCK_PllSys1, true);\n\n    /* DeInit Sys Pll1. */\n    CLOCK_DeinitSysPll1();\n\n    /* Init Sys Pll2. */\n    CLOCK_InitSysPll2(&sysPll2Config_BOARD_BootClockRUN);\n\n    /* Init System Pll2 pfd0. */\n    CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd0, 27);\n\n    /* Init System Pll2 pfd1. */\n    CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd1, 16);\n\n    /* Init System Pll2 pfd2. */\n    CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd2, 24);\n\n    /* Init System Pll2 pfd3. */\n    CLOCK_InitPfd(kCLOCK_PllSys2, kCLOCK_Pfd3, 32);\n\n    /* Init Sys Pll3. */\n    CLOCK_InitSysPll3();\n\n    /* Init System Pll3 pfd0. */\n    CLOCK_InitPfd(kCLOCK_PllSys3, kCLOCK_Pfd0, 13);\n\n    /* Init System Pll3 pfd1. */\n    CLOCK_InitPfd(kCLOCK_PllSys3, kCLOCK_Pfd1, 17);\n\n    /* Init System Pll3 pfd2. */\n    CLOCK_InitPfd(kCLOCK_PllSys3, kCLOCK_Pfd2, 32);\n\n    /* Init System Pll3 pfd3. */\n    CLOCK_InitPfd(kCLOCK_PllSys3, kCLOCK_Pfd3, 22);\n\n    /* Bypass Audio Pll. */\n    CLOCK_SetPllBypass(kCLOCK_PllAudio, true);\n\n    /* DeInit Audio Pll. */\n    CLOCK_DeinitAudioPll();\n\n    /* Init Video Pll. */\n    CLOCK_InitVideoPll(&videoPllConfig_BOARD_BootClockRUN);\n\n    /* Module clock root configurations. */\n    /* Configure M7 using ARM_PLL_CLK */\n#if __CORTEX_M == 7\n    rootCfg.mux = kCLOCK_M7_ClockRoot_MuxArmPllOut;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_M7, &rootCfg);\n#endif\n\n    /* Configure M4 using SYS_PLL3_PFD3_CLK */\n#if __CORTEX_M == 4\n    rootCfg.mux = kCLOCK_M4_ClockRoot_MuxSysPll3Pfd3;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_M4, &rootCfg);\n#endif\n\n    /* Configure BUS using SYS_PLL3_CLK */\n    rootCfg.mux = kCLOCK_BUS_ClockRoot_MuxSysPll3Out;\n    rootCfg.div = 2;\n    CLOCK_SetRootClock(kCLOCK_Root_Bus, &rootCfg);\n\n    /* Configure BUS_LPSR using SYS_PLL3_CLK */\n    rootCfg.mux = kCLOCK_BUS_LPSR_ClockRoot_MuxSysPll3Out;\n    rootCfg.div = 3;\n    CLOCK_SetRootClock(kCLOCK_Root_Bus_Lpsr, &rootCfg);\n\n    /* Configure SEMC using SYS_PLL2_PFD1_CLK */\n#ifndef SKIP_SEMC_INIT\n    rootCfg.mux = kCLOCK_SEMC_ClockRoot_MuxSysPll2Pfd1;\n    rootCfg.div = 3;\n    CLOCK_SetRootClock(kCLOCK_Root_Semc, &rootCfg);\n#endif\n\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n    UpdateSemcClock();\n#endif\n#endif\n\n    /* Configure CSSYS using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CSSYS_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Cssys, &rootCfg);\n\n    /* Configure CSTRACE using SYS_PLL2_CLK */\n    rootCfg.mux = kCLOCK_CSTRACE_ClockRoot_MuxSysPll2Out;\n    rootCfg.div = 4;\n    CLOCK_SetRootClock(kCLOCK_Root_Cstrace, &rootCfg);\n\n    /* Configure M4_SYSTICK using OSC_RC_48M_DIV2 */\n#if __CORTEX_M == 4\n    rootCfg.mux = kCLOCK_M4_SYSTICK_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_M4_Systick, &rootCfg);\n#endif\n\n    /* Configure M7_SYSTICK using OSC_RC_48M_DIV2 */\n#if __CORTEX_M == 7\n    rootCfg.mux = kCLOCK_M7_SYSTICK_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 240;\n    CLOCK_SetRootClock(kCLOCK_Root_M7_Systick, &rootCfg);\n#endif\n\n    /* Configure ADC1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ADC1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Adc1, &rootCfg);\n\n    /* Configure ADC2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ADC2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Adc2, &rootCfg);\n\n    /* Configure ACMP using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ACMP_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Acmp, &rootCfg);\n\n    /* Configure FLEXIO1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_FLEXIO1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Flexio1, &rootCfg);\n\n    /* Configure FLEXIO2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_FLEXIO2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Flexio2, &rootCfg);\n\n    /* Configure GPT1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_GPT1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Gpt1, &rootCfg);\n\n    /* Configure GPT2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_GPT2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Gpt2, &rootCfg);\n\n    /* Configure GPT3 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_GPT3_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Gpt3, &rootCfg);\n\n    /* Configure GPT4 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_GPT4_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Gpt4, &rootCfg);\n\n    /* Configure GPT5 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_GPT5_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Gpt5, &rootCfg);\n\n    /* Configure GPT6 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_GPT6_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Gpt6, &rootCfg);\n\n    /* Configure FLEXSPI1 using OSC_RC_48M_DIV2 */\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1) || defined(FLEXSPI_IN_USE))\n    rootCfg.mux = kCLOCK_FLEXSPI1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Flexspi1, &rootCfg);\n#endif\n\n    /* Configure FLEXSPI2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_FLEXSPI2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Flexspi2, &rootCfg);\n\n    /* Configure CAN1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CAN1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Can1, &rootCfg);\n\n    /* Configure CAN2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CAN2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Can2, &rootCfg);\n\n    /* Configure CAN3 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CAN3_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Can3, &rootCfg);\n\n    /* Configure LPUART1 using SYS_PLL2_CLK */\n    rootCfg.mux = kCLOCK_LPUART1_ClockRoot_MuxSysPll2Out;\n    rootCfg.div = 22;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart1, &rootCfg);\n\n    /* Configure LPUART2 using SYS_PLL2_CLK */\n    rootCfg.mux = kCLOCK_LPUART2_ClockRoot_MuxSysPll2Out;\n    rootCfg.div = 22;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart2, &rootCfg);\n\n    /* Configure LPUART3 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART3_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart3, &rootCfg);\n\n    /* Configure LPUART4 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART4_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart4, &rootCfg);\n\n    /* Configure LPUART5 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART5_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart5, &rootCfg);\n\n    /* Configure LPUART6 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART6_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart6, &rootCfg);\n\n    /* Configure LPUART7 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART7_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart7, &rootCfg);\n\n    /* Configure LPUART8 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART8_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart8, &rootCfg);\n\n    /* Configure LPUART9 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART9_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart9, &rootCfg);\n\n    /* Configure LPUART10 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART10_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart10, &rootCfg);\n\n    /* Configure LPUART11 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART11_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart11, &rootCfg);\n\n    /* Configure LPUART12 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPUART12_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpuart12, &rootCfg);\n\n    /* Configure LPI2C1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPI2C1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpi2c1, &rootCfg);\n\n    /* Configure LPI2C2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPI2C2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpi2c2, &rootCfg);\n\n    /* Configure LPI2C3 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPI2C3_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpi2c3, &rootCfg);\n\n    /* Configure LPI2C4 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPI2C4_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpi2c4, &rootCfg);\n\n    /* Configure LPI2C5 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPI2C5_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpi2c5, &rootCfg);\n\n    /* Configure LPI2C6 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPI2C6_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpi2c6, &rootCfg);\n\n    /* Configure LPSPI1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPSPI1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpspi1, &rootCfg);\n\n    /* Configure LPSPI2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPSPI2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpspi2, &rootCfg);\n\n    /* Configure LPSPI3 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPSPI3_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpspi3, &rootCfg);\n\n    /* Configure LPSPI4 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPSPI4_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpspi4, &rootCfg);\n\n    /* Configure LPSPI5 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPSPI5_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpspi5, &rootCfg);\n\n    /* Configure LPSPI6 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LPSPI6_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lpspi6, &rootCfg);\n\n    /* Configure EMV1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_EMV1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Emv1, &rootCfg);\n\n    /* Configure EMV2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_EMV2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Emv2, &rootCfg);\n\n    /* Configure ENET1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ENET1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Enet1, &rootCfg);\n\n    /* Configure ENET2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ENET2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Enet2, &rootCfg);\n\n    /* Configure ENET_QOS using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ENET_QOS_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Enet_Qos, &rootCfg);\n\n    /* Configure ENET_25M using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ENET_25M_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Enet_25m, &rootCfg);\n\n    /* Configure ENET_TIMER1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ENET_TIMER1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Enet_Timer1, &rootCfg);\n\n    /* Configure ENET_TIMER2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ENET_TIMER2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Enet_Timer2, &rootCfg);\n\n    /* Configure ENET_TIMER3 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ENET_TIMER3_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Enet_Timer3, &rootCfg);\n\n    /* Configure USDHC1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_USDHC1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Usdhc1, &rootCfg);\n\n    /* Configure USDHC2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_USDHC2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Usdhc2, &rootCfg);\n\n    /* Configure ASRC using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_ASRC_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Asrc, &rootCfg);\n\n    /* Configure MQS using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_MQS_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Mqs, &rootCfg);\n\n    /* Configure MIC using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_MIC_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Mic, &rootCfg);\n\n    /* Configure SPDIF using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_SPDIF_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Spdif, &rootCfg);\n\n    /* Configure SAI1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_SAI1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Sai1, &rootCfg);\n\n    /* Configure SAI2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_SAI2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Sai2, &rootCfg);\n\n    /* Configure SAI3 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_SAI3_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Sai3, &rootCfg);\n\n    /* Configure SAI4 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_SAI4_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Sai4, &rootCfg);\n\n    /* Configure GC355 using PLL_VIDEO_CLK */\n    rootCfg.mux = kCLOCK_GC355_ClockRoot_MuxVideoPllOut;\n    rootCfg.div = 2;\n    CLOCK_SetRootClock(kCLOCK_Root_Gc355, &rootCfg);\n\n    /* Configure LCDIF using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LCDIF_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lcdif, &rootCfg);\n\n    /* Configure LCDIFV2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_LCDIFV2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Lcdifv2, &rootCfg);\n\n    /* Configure MIPI_REF using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_MIPI_REF_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Mipi_Ref, &rootCfg);\n\n    /* Configure MIPI_ESC using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_MIPI_ESC_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Mipi_Esc, &rootCfg);\n\n    /* Configure CSI2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CSI2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Csi2, &rootCfg);\n\n    /* Configure CSI2_ESC using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CSI2_ESC_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Csi2_Esc, &rootCfg);\n\n    /* Configure CSI2_UI using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CSI2_UI_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Csi2_Ui, &rootCfg);\n\n    /* Configure CSI using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CSI_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Csi, &rootCfg);\n\n    /* Configure CKO1 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CKO1_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Cko1, &rootCfg);\n\n    /* Configure CKO2 using OSC_RC_48M_DIV2 */\n    rootCfg.mux = kCLOCK_CKO2_ClockRoot_MuxOscRc48MDiv2;\n    rootCfg.div = 1;\n    CLOCK_SetRootClock(kCLOCK_Root_Cko2, &rootCfg);\n\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 3);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set ENET Ref clock source. */\n    IOMUXC_GPR->GPR4 &= ~IOMUXC_GPR_GPR4_ENET_REF_CLK_DIR_MASK;\n    /* Set ENET_1G Tx clock source. */\n    IOMUXC_GPR->GPR5 = ((IOMUXC_GPR->GPR5 & ~IOMUXC_GPR_GPR5_ENET1G_TX_CLK_SEL_MASK) | IOMUXC_GPR_GPR5_ENET1G_RGMII_EN_MASK);\n    /* Set ENET_1G Ref clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_ENET1G_REF_CLK_DIR_MASK;\n    /* Set ENET_QOS Tx clock source. */\n    IOMUXC_GPR->GPR6 &= ~IOMUXC_GPR_GPR6_ENET_QOS_RGMII_EN_MASK;\n    /* Set ENET_QOS Ref clock source. */\n    IOMUXC_GPR->GPR6 &= ~IOMUXC_GPR_GPR6_ENET_QOS_REF_CLK_DIR_MASK;\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR22 &= ~IOMUXC_GPR_GPR22_REF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR23 &= ~IOMUXC_GPR_GPR23_REF_1M_CLK_GPT2_MASK;\n    /* Set GPT3 High frequency reference clock source. */\n    IOMUXC_GPR->GPR24 &= ~IOMUXC_GPR_GPR24_REF_1M_CLK_GPT3_MASK;\n    /* Set GPT4 High frequency reference clock source. */\n    IOMUXC_GPR->GPR25 &= ~IOMUXC_GPR_GPR25_REF_1M_CLK_GPT4_MASK;\n    /* Set GPT5 High frequency reference clock source. */\n    IOMUXC_GPR->GPR26 &= ~IOMUXC_GPR_GPR26_REF_1M_CLK_GPT5_MASK;\n    /* Set GPT6 High frequency reference clock source. */\n    IOMUXC_GPR->GPR27 &= ~IOMUXC_GPR_GPR27_REF_1M_CLK_GPT6_MASK;\n\n#if __CORTEX_M == 7\n    SystemCoreClock = CLOCK_GetRootClockFreq(kCLOCK_Root_M7);\n#else\n    SystemCoreClock = CLOCK_GetRootClockFreq(kCLOCK_Root_M4);\n#endif\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n#define BOARD_XTAL0_CLK_HZ 24000000U /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ 32768U  /*!< Board xtal32k frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if __CORTEX_M == 7\n    #define BOARD_BOOTCLOCKRUN_CORE_CLOCK 996000000UL /*!< CM7 Core clock frequency: 996000000Hz */\n#else\n    #define BOARD_BOOTCLOCKRUN_CORE_CLOCK 392727272UL /*!< CM4 Core clock frequency: 392727272Hz */\n#endif\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_ACMP_CLK_ROOT              24000000UL     /* Clock consumers of ACMP_CLK_ROOT output : CMP1, CMP2, CMP3, CMP4 */\n#define BOARD_BOOTCLOCKRUN_ADC1_CLK_ROOT              24000000UL     /* Clock consumers of ADC1_CLK_ROOT output : LPADC1 */\n#define BOARD_BOOTCLOCKRUN_ADC2_CLK_ROOT              24000000UL     /* Clock consumers of ADC2_CLK_ROOT output : LPADC2 */\n#define BOARD_BOOTCLOCKRUN_ARM_PLL_CLK                996000000UL    /* Clock consumers of ARM_PLL_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_ASRC_CLK_ROOT              24000000UL     /* Clock consumers of ASRC_CLK_ROOT output : ASRC */\n#define BOARD_BOOTCLOCKRUN_AXI_CLK_ROOT               996000000UL    /* Clock consumers of AXI_CLK_ROOT output : FLEXRAM */\n#define BOARD_BOOTCLOCKRUN_BUS_CLK_ROOT               240000000UL    /* Clock consumers of BUS_CLK_ROOT output : ADC_ETC, AOI1, AOI2, CAAM, CAN1, CAN2, CM7_GPIO2, CM7_GPIO3, CMP1, CMP2, CMP3, CMP4, CSI, DAC, DMA0, DMAMUX0, DSI_HOST, EMVSIM1, EMVSIM2, ENC1, ENC2, ENC3, ENC4, ENET, ENET_1G, ENET_QOS, EWM, FLEXIO1, FLEXIO2, FLEXSPI1, FLEXSPI2, GPIO1, GPIO2, GPIO3, GPIO4, GPIO5, GPIO6, IEE_APC, IEE__IEE_RT1170, IOMUXC, IOMUXC_GPR, KPP, LCDIF, LCDIFV2, LPADC1, LPADC2, LPI2C1, LPI2C2, LPI2C3, LPI2C4, LPSPI1, LPSPI2, LPSPI3, LPSPI4, LPUART1, LPUART10, LPUART2, LPUART3, LPUART4, LPUART5, LPUART6, LPUART7, LPUART8, LPUART9, MECC1, MECC2, MIPI_CSI2RX, PIT1, PWM1, PWM2, PWM3, PWM4, PXP, RTWDOG3, SAI1, SAI2, SAI3, SPDIF, TMR1, TMR2, TMR3, TMR4, USBPHY1, USBPHY2, USB_OTG1, USB_OTG2, USDHC1, USDHC2, WDOG1, WDOG2, XBARA1, XBARB2, XBARB3, XECC_FLEXSPI1, XECC_FLEXSPI2, XECC_SEMC, XRDC2_D0, XRDC2_D1 */\n#define BOARD_BOOTCLOCKRUN_BUS_LPSR_CLK_ROOT          160000000UL    /* Clock consumers of BUS_LPSR_CLK_ROOT output : CAN3, GPIO10, GPIO11, GPIO12, GPIO7, GPIO8, GPIO9, IOMUXC_LPSR, LPI2C5, LPI2C6, LPSPI5, LPSPI6, LPUART11, LPUART12, MUA, MUB, PDM, PIT2, RDC, RTWDOG4, SAI4, SNVS, XRDC2_D0, XRDC2_D1 */\n#define BOARD_BOOTCLOCKRUN_CAN1_CLK_ROOT              24000000UL     /* Clock consumers of CAN1_CLK_ROOT output : CAN1 */\n#define BOARD_BOOTCLOCKRUN_CAN2_CLK_ROOT              24000000UL     /* Clock consumers of CAN2_CLK_ROOT output : CAN2 */\n#define BOARD_BOOTCLOCKRUN_CAN3_CLK_ROOT              24000000UL     /* Clock consumers of CAN3_CLK_ROOT output : CAN3 */\n#define BOARD_BOOTCLOCKRUN_CCM_CLKO1_CLK_ROOT         24000000UL     /* Clock consumers of CCM_CLKO1_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_CCM_CLKO2_CLK_ROOT         24000000UL     /* Clock consumers of CCM_CLKO2_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL      /* Clock consumers of CLK_1M output : EWM, RTWDOG3, RTWDOG4 */\n#define BOARD_BOOTCLOCKRUN_CSI2_CLK_ROOT              24000000UL     /* Clock consumers of CSI2_CLK_ROOT output : MIPI_CSI2RX */\n#define BOARD_BOOTCLOCKRUN_CSI2_ESC_CLK_ROOT          24000000UL     /* Clock consumers of CSI2_ESC_CLK_ROOT output : MIPI_CSI2RX */\n#define BOARD_BOOTCLOCKRUN_CSI2_UI_CLK_ROOT           24000000UL     /* Clock consumers of CSI2_UI_CLK_ROOT output : MIPI_CSI2RX */\n#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT               24000000UL     /* Clock consumers of CSI_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_CSSYS_CLK_ROOT             24000000UL     /* Clock consumers of CSSYS_CLK_ROOT output : ARM */\n#define BOARD_BOOTCLOCKRUN_CSTRACE_CLK_ROOT           132000000UL    /* Clock consumers of CSTRACE_CLK_ROOT output : ARM */\n#define BOARD_BOOTCLOCKRUN_ELCDIF_CLK_ROOT            24000000UL     /* Clock consumers of ELCDIF_CLK_ROOT output : LCDIF */\n#define BOARD_BOOTCLOCKRUN_EMV1_CLK_ROOT              24000000UL     /* Clock consumers of EMV1_CLK_ROOT output : EMVSIM1 */\n#define BOARD_BOOTCLOCKRUN_EMV2_CLK_ROOT              24000000UL     /* Clock consumers of EMV2_CLK_ROOT output : EMVSIM2 */\n#define BOARD_BOOTCLOCKRUN_ENET1_CLK_ROOT             24000000UL     /* Clock consumers of ENET1_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_ENET2_CLK_ROOT             24000000UL     /* Clock consumers of ENET2_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_ENET_1G_REF_CLK            0UL            /* Clock consumers of ENET_1G_REF_CLK output : ENET_1G */\n#define BOARD_BOOTCLOCKRUN_ENET_1G_TX_CLK             24000000UL     /* Clock consumers of ENET_1G_TX_CLK output : ENET_1G */\n#define BOARD_BOOTCLOCKRUN_ENET_25M_CLK_ROOT          24000000UL     /* Clock consumers of ENET_25M_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_ENET_QOS_CLK_ROOT          24000000UL     /* Clock consumers of ENET_QOS_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_ENET_QOS_REF_CLK           0UL            /* Clock consumers of ENET_QOS_REF_CLK output : ENET_QOS */\n#define BOARD_BOOTCLOCKRUN_ENET_QOS_TX_CLK            0UL            /* Clock consumers of ENET_QOS_TX_CLK output : ENET_QOS */\n#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK               0UL            /* Clock consumers of ENET_REF_CLK output : ENET */\n#define BOARD_BOOTCLOCKRUN_ENET_TIMER1_CLK_ROOT       24000000UL     /* Clock consumers of ENET_TIMER1_CLK_ROOT output : ENET */\n#define BOARD_BOOTCLOCKRUN_ENET_TIMER2_CLK_ROOT       24000000UL     /* Clock consumers of ENET_TIMER2_CLK_ROOT output : ENET_1G */\n#define BOARD_BOOTCLOCKRUN_ENET_TIMER3_CLK_ROOT       24000000UL     /* Clock consumers of ENET_TIMER3_CLK_ROOT output : ENET_QOS */\n#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK                0UL            /* Clock consumers of ENET_TX_CLK output : ENET */\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           24000000UL     /* Clock consumers of FLEXIO1_CLK_ROOT output : FLEXIO1 */\n#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT           24000000UL     /* Clock consumers of FLEXIO2_CLK_ROOT output : FLEXIO2 */\n#define BOARD_BOOTCLOCKRUN_FLEXSPI1_CLK_ROOT          24000000UL     /* Clock consumers of FLEXSPI1_CLK_ROOT output : FLEXSPI1 */\n#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT          24000000UL     /* Clock consumers of FLEXSPI2_CLK_ROOT output : FLEXSPI2 */\n#define BOARD_BOOTCLOCKRUN_GC355_CLK_ROOT             492000012UL    /* Clock consumers of GC355_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_GPT1_CLK_ROOT              24000000UL     /* Clock consumers of GPT1_CLK_ROOT output : GPT1 */\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      24000000UL     /* Clock consumers of GPT1_ipg_clk_highfreq output : N/A */\n#define BOARD_BOOTCLOCKRUN_GPT2_CLK_ROOT              24000000UL     /* Clock consumers of GPT2_CLK_ROOT output : GPT2 */\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      24000000UL     /* Clock consumers of GPT2_ipg_clk_highfreq output : N/A */\n#define BOARD_BOOTCLOCKRUN_GPT3_CLK_ROOT              24000000UL     /* Clock consumers of GPT3_CLK_ROOT output : GPT3 */\n#define BOARD_BOOTCLOCKRUN_GPT3_IPG_CLK_HIGHFREQ      24000000UL     /* Clock consumers of GPT3_ipg_clk_highfreq output : N/A */\n#define BOARD_BOOTCLOCKRUN_GPT4_CLK_ROOT              24000000UL     /* Clock consumers of GPT4_CLK_ROOT output : GPT4 */\n#define BOARD_BOOTCLOCKRUN_GPT4_IPG_CLK_HIGHFREQ      24000000UL     /* Clock consumers of GPT4_ipg_clk_highfreq output : N/A */\n#define BOARD_BOOTCLOCKRUN_GPT5_CLK_ROOT              24000000UL     /* Clock consumers of GPT5_CLK_ROOT output : GPT5 */\n#define BOARD_BOOTCLOCKRUN_GPT5_IPG_CLK_HIGHFREQ      24000000UL     /* Clock consumers of GPT5_ipg_clk_highfreq output : N/A */\n#define BOARD_BOOTCLOCKRUN_GPT6_CLK_ROOT              24000000UL     /* Clock consumers of GPT6_CLK_ROOT output : GPT6 */\n#define BOARD_BOOTCLOCKRUN_GPT6_IPG_CLK_HIGHFREQ      24000000UL     /* Clock consumers of GPT6_ipg_clk_highfreq output : N/A */\n#define BOARD_BOOTCLOCKRUN_LCDIFV2_CLK_ROOT           24000000UL     /* Clock consumers of LCDIFV2_CLK_ROOT output : LCDIFV2 */\n#define BOARD_BOOTCLOCKRUN_LPI2C1_CLK_ROOT            24000000UL     /* Clock consumers of LPI2C1_CLK_ROOT output : LPI2C1 */\n#define BOARD_BOOTCLOCKRUN_LPI2C2_CLK_ROOT            24000000UL     /* Clock consumers of LPI2C2_CLK_ROOT output : LPI2C2 */\n#define BOARD_BOOTCLOCKRUN_LPI2C3_CLK_ROOT            24000000UL     /* Clock consumers of LPI2C3_CLK_ROOT output : LPI2C3 */\n#define BOARD_BOOTCLOCKRUN_LPI2C4_CLK_ROOT            24000000UL     /* Clock consumers of LPI2C4_CLK_ROOT output : LPI2C4 */\n#define BOARD_BOOTCLOCKRUN_LPI2C5_CLK_ROOT            24000000UL     /* Clock consumers of LPI2C5_CLK_ROOT output : LPI2C5 */\n#define BOARD_BOOTCLOCKRUN_LPI2C6_CLK_ROOT            24000000UL     /* Clock consumers of LPI2C6_CLK_ROOT output : LPI2C6 */\n#define BOARD_BOOTCLOCKRUN_LPSPI1_CLK_ROOT            24000000UL     /* Clock consumers of LPSPI1_CLK_ROOT output : LPSPI1 */\n#define BOARD_BOOTCLOCKRUN_LPSPI2_CLK_ROOT            24000000UL     /* Clock consumers of LPSPI2_CLK_ROOT output : LPSPI2 */\n#define BOARD_BOOTCLOCKRUN_LPSPI3_CLK_ROOT            24000000UL     /* Clock consumers of LPSPI3_CLK_ROOT output : LPSPI3 */\n#define BOARD_BOOTCLOCKRUN_LPSPI4_CLK_ROOT            24000000UL     /* Clock consumers of LPSPI4_CLK_ROOT output : LPSPI4 */\n#define BOARD_BOOTCLOCKRUN_LPSPI5_CLK_ROOT            24000000UL     /* Clock consumers of LPSPI5_CLK_ROOT output : LPSPI5 */\n#define BOARD_BOOTCLOCKRUN_LPSPI6_CLK_ROOT            24000000UL     /* Clock consumers of LPSPI6_CLK_ROOT output : LPSPI6 */\n#define BOARD_BOOTCLOCKRUN_LPUART10_CLK_ROOT          24000000UL     /* Clock consumers of LPUART10_CLK_ROOT output : LPUART10 */\n#define BOARD_BOOTCLOCKRUN_LPUART11_CLK_ROOT          24000000UL     /* Clock consumers of LPUART11_CLK_ROOT output : LPUART11 */\n#define BOARD_BOOTCLOCKRUN_LPUART12_CLK_ROOT          24000000UL     /* Clock consumers of LPUART12_CLK_ROOT output : LPUART12 */\n#define BOARD_BOOTCLOCKRUN_LPUART1_CLK_ROOT           24000000UL     /* Clock consumers of LPUART1_CLK_ROOT output : LPUART1 */\n#define BOARD_BOOTCLOCKRUN_LPUART2_CLK_ROOT           24000000UL     /* Clock consumers of LPUART2_CLK_ROOT output : LPUART2 */\n#define BOARD_BOOTCLOCKRUN_LPUART3_CLK_ROOT           24000000UL     /* Clock consumers of LPUART3_CLK_ROOT output : LPUART3 */\n#define BOARD_BOOTCLOCKRUN_LPUART4_CLK_ROOT           24000000UL     /* Clock consumers of LPUART4_CLK_ROOT output : LPUART4 */\n#define BOARD_BOOTCLOCKRUN_LPUART5_CLK_ROOT           24000000UL     /* Clock consumers of LPUART5_CLK_ROOT output : LPUART5 */\n#define BOARD_BOOTCLOCKRUN_LPUART6_CLK_ROOT           24000000UL     /* Clock consumers of LPUART6_CLK_ROOT output : LPUART6 */\n#define BOARD_BOOTCLOCKRUN_LPUART7_CLK_ROOT           24000000UL     /* Clock consumers of LPUART7_CLK_ROOT output : LPUART7 */\n#define BOARD_BOOTCLOCKRUN_LPUART8_CLK_ROOT           24000000UL     /* Clock consumers of LPUART8_CLK_ROOT output : LPUART8 */\n#define BOARD_BOOTCLOCKRUN_LPUART9_CLK_ROOT           24000000UL     /* Clock consumers of LPUART9_CLK_ROOT output : LPUART9 */\n#define BOARD_BOOTCLOCKRUN_M4_CLK_ROOT                392727272UL    /* Clock consumers of M4_CLK_ROOT output : ARM, DMA1, DMAMUX1, SSARC_HP, SSARC_LP, XRDC2_D0, XRDC2_D1 */\n#define BOARD_BOOTCLOCKRUN_M4_SYSTICK_CLK_ROOT        24000000UL     /* Clock consumers of M4_SYSTICK_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_M7_CLK_ROOT                996000000UL    /* Clock consumers of M7_CLK_ROOT output : ARM */\n#define BOARD_BOOTCLOCKRUN_M7_SYSTICK_CLK_ROOT        100000UL       /* Clock consumers of M7_SYSTICK_CLK_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_MIC_CLK_ROOT               24000000UL     /* Clock consumers of MIC_CLK_ROOT output : ASRC, PDM, SPDIF */\n#define BOARD_BOOTCLOCKRUN_MIPI_DSI_TX_CLK_ESC_ROOT   24000000UL     /* Clock consumers of MIPI_DSI_TX_CLK_ESC_ROOT output : N/A */\n#define BOARD_BOOTCLOCKRUN_MIPI_ESC_CLK_ROOT          24000000UL     /* Clock consumers of MIPI_ESC_CLK_ROOT output : DSI_HOST */\n#define BOARD_BOOTCLOCKRUN_MIPI_REF_CLK_ROOT          24000000UL     /* Clock consumers of MIPI_REF_CLK_ROOT output : DSI_HOST */\n#define BOARD_BOOTCLOCKRUN_MQS_CLK_ROOT               24000000UL     /* Clock consumers of MQS_CLK_ROOT output : ASRC */\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   24000000UL     /* Clock consumers of MQS_MCLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_OSC_24M                    24000000UL     /* Clock consumers of OSC_24M output : SPDIF, TMPSNS, USBPHY1, USBPHY2 */\n#define BOARD_BOOTCLOCKRUN_OSC_32K                    32768UL        /* Clock consumers of OSC_32K output : GPIO13, RTWDOG3, RTWDOG4 */\n#define BOARD_BOOTCLOCKRUN_OSC_RC_16M                 16000000UL     /* Clock consumers of OSC_RC_16M output : CCM, DCDC, EWM, GPT1, GPT2, GPT3, GPT4, GPT5, GPT6, SSARC_LP */\n#define BOARD_BOOTCLOCKRUN_OSC_RC_400M                400000000UL    /* Clock consumers of OSC_RC_400M output : N/A */\n#define BOARD_BOOTCLOCKRUN_OSC_RC_48M                 48000000UL     /* Clock consumers of OSC_RC_48M output : N/A */\n#define BOARD_BOOTCLOCKRUN_OSC_RC_48M_DIV2            24000000UL     /* Clock consumers of OSC_RC_48M_DIV2 output : N/A */\n#define BOARD_BOOTCLOCKRUN_PLL_AUDIO_CLK              0UL            /* Clock consumers of PLL_AUDIO_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_PLL_AUDIO_SS_MODULATION    0UL            /* Clock consumers of PLL_AUDIO_SS_MODULATION output : N/A */\n#define BOARD_BOOTCLOCKRUN_PLL_AUDIO_SS_RANGE         0UL            /* Clock consumers of PLL_AUDIO_SS_RANGE output : N/A */\n#define BOARD_BOOTCLOCKRUN_PLL_VIDEO_CLK              984000025UL    /* Clock consumers of PLL_VIDEO_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_PLL_VIDEO_SS_MODULATION    0UL            /* Clock consumers of PLL_VIDEO_SS_MODULATION output : N/A */\n#define BOARD_BOOTCLOCKRUN_PLL_VIDEO_SS_RANGE         0UL            /* Clock consumers of PLL_VIDEO_SS_RANGE output : N/A */\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              24000000UL     /* Clock consumers of SAI1_CLK_ROOT output : SPDIF */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 24000000UL     /* Clock consumers of SAI1_MCLK1 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 0UL            /* Clock consumers of SAI1_MCLK2 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 24000000UL     /* Clock consumers of SAI1_MCLK3 output : SAI1 */\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              24000000UL     /* Clock consumers of SAI2_CLK_ROOT output : ASRC */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 24000000UL     /* Clock consumers of SAI2_MCLK1 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL            /* Clock consumers of SAI2_MCLK2 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 24000000UL     /* Clock consumers of SAI2_MCLK3 output : SAI2 */\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              24000000UL     /* Clock consumers of SAI3_CLK_ROOT output : ASRC, SPDIF */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 24000000UL     /* Clock consumers of SAI3_MCLK1 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL            /* Clock consumers of SAI3_MCLK2 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 24000000UL     /* Clock consumers of SAI3_MCLK3 output : SAI3 */\n#define BOARD_BOOTCLOCKRUN_SAI4_CLK_ROOT              24000000UL     /* Clock consumers of SAI4_CLK_ROOT output : ASRC, SPDIF */\n#define BOARD_BOOTCLOCKRUN_SAI4_MCLK1                 24000000UL     /* Clock consumers of SAI4_MCLK1 output : SAI4 */\n#define BOARD_BOOTCLOCKRUN_SAI4_MCLK2                 0UL            /* Clock consumers of SAI4_MCLK2 output : SAI4 */\n#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT              198000000UL    /* Clock consumers of SEMC_CLK_ROOT output : SEMC, XECC_FLEXSPI1, XECC_FLEXSPI2, XECC_SEMC, XRDC2_D0, XRDC2_D1 */\n#define BOARD_BOOTCLOCKRUN_SPDIF_CLK_ROOT             24000000UL     /* Clock consumers of SPDIF_CLK_ROOT output : SPDIF */\n#define BOARD_BOOTCLOCKRUN_SPDIF_EXTCLK_OUT           0UL            /* Clock consumers of SPDIF_EXTCLK_OUT output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL1_CLK               0UL            /* Clock consumers of SYS_PLL1_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL1_DIV2_CLK          0UL            /* Clock consumers of SYS_PLL1_DIV2_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL1_DIV5_CLK          0UL            /* Clock consumers of SYS_PLL1_DIV5_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL1_SS_MODULATION     0UL            /* Clock consumers of SYS_PLL1_SS_MODULATION output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL1_SS_RANGE          0UL            /* Clock consumers of SYS_PLL1_SS_RANGE output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL2_CLK               528000000UL    /* Clock consumers of SYS_PLL2_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL2_PFD0_CLK          352000000UL    /* Clock consumers of SYS_PLL2_PFD0_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL2_PFD1_CLK          594000000UL    /* Clock consumers of SYS_PLL2_PFD1_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL2_PFD2_CLK          396000000UL    /* Clock consumers of SYS_PLL2_PFD2_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL2_PFD3_CLK          297000000UL    /* Clock consumers of SYS_PLL2_PFD3_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL2_SS_MODULATION     0UL            /* Clock consumers of SYS_PLL2_SS_MODULATION output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL2_SS_RANGE          0UL            /* Clock consumers of SYS_PLL2_SS_RANGE output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL3_CLK               480000000UL    /* Clock consumers of SYS_PLL3_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL3_DIV2_CLK          240000000UL    /* Clock consumers of SYS_PLL3_DIV2_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL3_PFD0_CLK          664615384UL    /* Clock consumers of SYS_PLL3_PFD0_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL3_PFD1_CLK          508235294UL    /* Clock consumers of SYS_PLL3_PFD1_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL3_PFD2_CLK          270000000UL    /* Clock consumers of SYS_PLL3_PFD2_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYS_PLL3_PFD3_CLK          392727272UL    /* Clock consumers of SYS_PLL3_PFD3_CLK output : N/A */\n#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT            24000000UL     /* Clock consumers of USDHC1_CLK_ROOT output : USDHC1 */\n#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT            24000000UL     /* Clock consumers of USDHC2_CLK_ROOT output : USDHC2 */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: MIMXRT1176xxxxx\npackage_id: MIMXRT1176DVMAA\nmcu_data: ksdk2_0\nprocessor_version: 24.12.10\nboard: MIMXRT1170-EVKB\nexternal_user_signals: {}\npin_labels:\n- {pin_num: M13, pin_signal: GPIO_AD_04, label: 'SIM1_PD/J44[C8]/USER_LED_CTL1/J9[8]/J25[7]', identifier: SIM1_PD;LED;USER_LED}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: cm7, enableClock: 'true'}\n- pin_list:\n  - {pin_num: M13, peripheral: GPIO9, signal: 'gpio_io, 03', pin_signal: GPIO_AD_04, identifier: USER_LED, direction: OUTPUT, pull_up_down_config: Pull_Down, pull_keeper_select: Keeper}\n  - {pin_num: T8, peripheral: GPIO13, signal: 'gpio_io, 00', pin_signal: WAKEUP, direction: INPUT, pull_up_down_config: Pull_Up}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins, assigned for the Cortex-M7F core.\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* LPCG on: LPCG is ON. */\n\n  /* GPIO configuration of USER_LED on GPIO_AD_04 (pin M13) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_AD_04 (pin M13) */\n  GPIO_PinInit(GPIO9, 3U, &USER_LED_config);\n\n  /* GPIO configuration of USER_BUTTON on WAKEUP_DIG (pin T8) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on WAKEUP_DIG (pin T8) */\n  GPIO_PinInit(GPIO13, 0U, &USER_BUTTON_config);\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_04_GPIO9_IO03,           /* GPIO_AD_04 is configured as GPIO9_IO03 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_WAKEUP_DIG_GPIO13_IO00,          /* WAKEUP_DIG is configured as GPIO13_IO00 */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinConfig(\n      IOMUXC_GPIO_AD_04_GPIO9_IO03,           /* GPIO_AD_04 PAD functional properties : */\n      0x02U);                                 /* Slew Rate Field: Slow Slew Rate\n                                                 Drive Strength Field: high drive strength\n                                                 Pull / Keep Select Field: Pull Disable\n                                                 Pull Up / Down Config. Field: Weak pull down\n                                                 Open Drain Field: Disabled\n                                                 Domain write protection: Both cores are allowed\n                                                 Domain write protection lock: Neither of DWP bits is locked */\n  IOMUXC_SetPinConfig(\n      IOMUXC_WAKEUP_DIG_GPIO13_IO00,          /* WAKEUP_DIG PAD functional properties : */\n      0x0EU);                                 /* Pull / Keep Select Field: Pull Enable\n                                                 Pull Up / Down Config. Field: Weak pull up\n                                                 Open Drain SNVS Field: Disabled\n                                                 Domain write protection: Both cores are allowed\n                                                 Domain write protection lock: Neither of DWP bits is locked */\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: cm7, enableClock: 'true'}\n- pin_list:\n  - {pin_num: L13, peripheral: LPUART1, signal: TXD, pin_signal: GPIO_AD_24, pull_keeper_select: Keeper, slew_rate: Slow}\n  - {pin_num: M15, peripheral: LPUART1, signal: RXD, pin_signal: GPIO_AD_25, pull_keeper_select: Keeper, slew_rate: Slow}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins, assigned for the Cortex-M7F core.\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* LPCG on: LPCG is ON. */\n\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_24_LPUART1_TXD,          /* GPIO_AD_24 is configured as LPUART1_TXD */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinMux(\n      IOMUXC_GPIO_AD_25_LPUART1_RXD,          /* GPIO_AD_25 is configured as LPUART1_RXD */\n      0U);                                    /* Software Input On Field: Input Path is determined by functionality */\n  IOMUXC_SetPinConfig(\n      IOMUXC_GPIO_AD_24_LPUART1_TXD,          /* GPIO_AD_24 PAD functional properties : */\n      0x02U);                                 /* Slew Rate Field: Slow Slew Rate\n                                                 Drive Strength Field: high drive strength\n                                                 Pull / Keep Select Field: Pull Disable\n                                                 Pull Up / Down Config. Field: Weak pull down\n                                                 Open Drain Field: Disabled\n                                                 Domain write protection: Both cores are allowed\n                                                 Domain write protection lock: Neither of DWP bits is locked */\n  IOMUXC_SetPinConfig(\n      IOMUXC_GPIO_AD_25_LPUART1_RXD,          /* GPIO_AD_25 PAD functional properties : */\n      0x02U);                                 /* Slew Rate Field: Slow Slew Rate\n                                                 Drive Strength Field: high drive strength\n                                                 Pull / Keep Select Field: Pull Disable\n                                                 Pull Up / Down Config. Field: Weak pull down\n                                                 Open Drain Field: Disabled\n                                                 Domain write protection: Both cores are allowed\n                                                 Domain write protection lock: Neither of DWP bits is locked */\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/* GPIO_AD_04 (coord M13), SIM1_PD/J44[C8]/USER_LED_CTL1/J9[8]/J25[7] */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO9   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                   gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                       3U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO9   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_INIT_GPIO_VALUE                               0U   /*!< GPIO output initial state */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN                                      3U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN_MASK                         (1U << 3U)   /*!< GPIO pin mask */\n\n/* WAKEUP (coord T8), USER_BUTTON/SW7 */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                             GPIO13   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    0U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                   GPIO13   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   0U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 0U)   /*!< GPIO pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);                    /* Function assigned for the Cortex-M7F */\n\n/* GPIO_AD_24 (coord L13), LPUART1_TXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_LPUART1_TXD_PERIPHERAL                  LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_LPUART1_TXD_SIGNAL                          TXD   /*!< Signal name */\n\n/* GPIO_AD_25 (coord M15), LPUART1_RXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_LPUART1_RXD_PERIPHERAL                  LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_LPUART1_RXD_SIGNAL                          RXD   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);          /* Function assigned for the Cortex-M7F */\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/board.cmake",
    "content": "set(MCU_FAMILY RT1170)\nset(MCU_VARIANT MIMXRT1176)\n\nif (M4 STREQUAL \"1\")\n  set(MCU_CORE _cm4)\n  set(JLINK_CORE _M4)\n  set(LD_FILE_GNU ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/gcc/${MCU_VARIANT}xxxxx${MCU_CORE}_ram.ld)\n  set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nelse ()\n  set(MCU_CORE _cm7)\n  set(JLINK_CORE _M7)\nendif()\n\nset(JLINK_DEVICE MIMXRT1176xxxA${JLINK_CORE})\nset(PYOCD_TARGET mimxrt1170${MCU_CORE})\nset(NXPLINK_DEVICE MIMXRT1176xxxxx:MIMXRT1170-EVK)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/evkbmimxrt1170_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1176DVMAA${MCU_CORE}\n    BOARD_TUD_RHPORT=0\n    BOARD_TUH_RHPORT=1\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: i.MX RT1070 Evaluation Kit\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/i-mx-evaluation-and-development-boards/i-mx-rt1170-evaluation-kit:MIMXRT1170-EVKB\n*/\n\n#ifndef BOARD_MIMXRT1170_EVKB_H_\n#define BOARD_MIMXRT1170_EVKB_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (0x1000000U)\n\n// LED: IOMUXC_GPIO_AD_04_GPIO9_IO03\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// SW8 button: IOMUXC_WAKEUP_DIG_GPIO13_IO00\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_PERIPHERAL\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_CHANNEL\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: IOMUXC_GPIO_AD_B0_13_LPUART1_RX, IOMUXC_GPIO_AD_B0_12_LPUART1_TX\n#define UART_PORT             LPUART1\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_LPUART10_CLK_ROOT\n\n//--------------------------------------------------------------------\n// MPU configuration\n//--------------------------------------------------------------------\n#if __CORTEX_M == 7\nstatic inline void BOARD_ConfigMPU(void) {\n  #if defined(__CC_ARM) || defined(__ARMCC_VERSION)\n  extern uint32_t Image$$RW_m_ncache$$Base[];\n  /* RW_m_ncache_unused is a auxiliary region which is used to get the whole size of noncache section */\n  extern uint32_t Image$$RW_m_ncache_unused$$Base[];\n  extern uint32_t Image$$RW_m_ncache_unused$$ZI$$Limit[];\n  uint32_t nonCacheStart = (uint32_t) Image$$RW_m_ncache$$Base;\n  uint32_t size = ((uint32_t) Image$$RW_m_ncache_unused$$Base == nonCacheStart) ? 0 : ((uint32_t) Image$$RW_m_ncache_unused$$ZI$$Limit - nonCacheStart);\n  #elif defined(__MCUXPRESSO)\n    #if defined(__USE_SHMEM)\n  extern uint32_t __base_rpmsg_sh_mem;\n  extern uint32_t __top_rpmsg_sh_mem;\n  uint32_t nonCacheStart = (uint32_t) (&__base_rpmsg_sh_mem);\n  uint32_t size = (uint32_t) (&__top_rpmsg_sh_mem) - nonCacheStart;\n    #else\n  extern uint32_t __base_NCACHE_REGION;\n  extern uint32_t __top_NCACHE_REGION;\n  uint32_t nonCacheStart = (uint32_t) (&__base_NCACHE_REGION);\n  uint32_t size = (uint32_t) (&__top_NCACHE_REGION) - nonCacheStart;\n    #endif\n  #elif defined(__ICCARM__) || defined(__GNUC__)\n  extern uint32_t __NCACHE_REGION_START[];\n  extern uint32_t __NCACHE_REGION_SIZE[];\n  uint32_t nonCacheStart = (uint32_t) __NCACHE_REGION_START;\n  uint32_t size = (uint32_t) __NCACHE_REGION_SIZE;\n  #endif\n  volatile uint32_t i = 0;\n\n  #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT\n  /* Disable I cache and D cache */\n  if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR)) {\n    SCB_DisableICache();\n  }\n  #endif\n  #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT\n  if (SCB_CCR_DC_Msk == (SCB_CCR_DC_Msk & SCB->CCR)) {\n    SCB_DisableDCache();\n  }\n  #endif\n\n  /* Disable MPU */\n  ARM_MPU_Disable();\n\n  /* MPU configure:\n     * Use ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable,\n     * SubRegionDisable, Size)\n     * API in mpu_armv7.h.\n     * param DisableExec       Instruction access (XN) disable bit,0=instruction fetches enabled, 1=instruction fetches\n     * disabled.\n     * param AccessPermission  Data access permissions, allows you to configure read/write access for User and\n     * Privileged mode.\n     *      Use MACROS defined in mpu_armv7.h:\n     * ARM_MPU_AP_NONE/ARM_MPU_AP_PRIV/ARM_MPU_AP_URO/ARM_MPU_AP_FULL/ARM_MPU_AP_PRO/ARM_MPU_AP_RO\n     * Combine TypeExtField/IsShareable/IsCacheable/IsBufferable to configure MPU memory access attributes.\n     *  TypeExtField  IsShareable  IsCacheable  IsBufferable   Memory Attribute    Shareability        Cache\n     *     0             x           0           0             Strongly Ordered    shareable\n     *     0             x           0           1              Device             shareable\n     *     0             0           1           0              Normal             not shareable   Outer and inner write\n     * through no write allocate\n     *     0             0           1           1              Normal             not shareable   Outer and inner write\n     * back no write allocate\n     *     0             1           1           0              Normal             shareable       Outer and inner write\n     * through no write allocate\n     *     0             1           1           1              Normal             shareable       Outer and inner write\n     * back no write allocate\n     *     1             0           0           0              Normal             not shareable   outer and inner\n     * noncache\n     *     1             1           0           0              Normal             shareable       outer and inner\n     * noncache\n     *     1             0           1           1              Normal             not shareable   outer and inner write\n     * back write/read acllocate\n     *     1             1           1           1              Normal             shareable       outer and inner write\n     * back write/read acllocate\n     *     2             x           0           0              Device              not shareable\n     *  Above are normal use settings, if your want to see more details or want to config different inner/outer cache\n     * policy.\n     *  please refer to Table 4-55 /4-56 in arm cortex-M7 generic user guide <dui0646b_cortex_m7_dgug.pdf>\n     * param SubRegionDisable  Sub-region disable field. 0=sub-region is enabled, 1=sub-region is disabled.\n     * param Size              Region size of the region to be configured. use ARM_MPU_REGION_SIZE_xxx MACRO in\n     * mpu_armv7.h.\n     */\n\n  /*\n     * Add default region to deny access to whole address space to workaround speculative prefetch.\n     * Refer to Arm errata 1013783-B for more details.\n     *\n     */\n  /* Region 0 setting: Instruction access disabled, No data access permission. */\n  MPU->RBAR = ARM_MPU_RBAR(0, 0x00000000U);\n  MPU->RASR = ARM_MPU_RASR(1, ARM_MPU_AP_NONE, 0, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_4GB);\n\n  /* Region 1 setting: Memory with Device type, not shareable, non-cacheable. */\n  MPU->RBAR = ARM_MPU_RBAR(1, 0x80000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);\n\n  /* Region 2 setting: Memory with Device type, not shareable,  non-cacheable. */\n  MPU->RBAR = ARM_MPU_RBAR(2, 0x60000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_512MB);\n\n  /* Region 3 setting: Memory with Device type, not shareable, non-cacheable. */\n  MPU->RBAR = ARM_MPU_RBAR(3, 0x00000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1GB);\n\n  /* Region 4 setting: Memory with Normal type, not shareable, outer/inner write back */\n  MPU->RBAR = ARM_MPU_RBAR(4, 0x00000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);\n\n  /* Region 5 setting: Memory with Normal type, not shareable, outer/inner write back */\n  MPU->RBAR = ARM_MPU_RBAR(5, 0x20000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);\n\n  #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH\n  /* Region 6 setting: Memory with Normal type, not shareable, write through */\n  MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_1MB);\n\n  /* Region 7 setting: Memory with Normal type, not shareable, write through */\n  MPU->RBAR = ARM_MPU_RBAR(7, 0x20300000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_512KB);\n  #else\n  /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write back */\n  MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_1MB);\n\n  /* Region 7 setting: Memory with Normal type, not shareable, outer/inner write back */\n  MPU->RBAR = ARM_MPU_RBAR(7, 0x20300000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_512KB);\n  #endif\n\n  #if defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1)\n  /* Region 8 setting: Memory with Normal type, not shareable, outer/inner write back. */\n  MPU->RBAR = ARM_MPU_RBAR(8, 0x30000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_RO, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_16MB);\n  #endif\n\n  #ifdef USE_SDRAM\n    #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH\n  /* Region 9 setting: Memory with Normal type, not shareable, write through */\n  MPU->RBAR = ARM_MPU_RBAR(9, 0x80000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_64MB);\n    #else\n  /* Region 9 setting: Memory with Normal type, not shareable, outer/inner write back */\n  MPU->RBAR = ARM_MPU_RBAR(9, 0x80000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_64MB);\n    #endif\n  #endif\n\n  while ((size >> i) > 0x1U) {\n    i++;\n  }\n\n  if (i != 0) {\n    /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */\n    assert(!(nonCacheStart % size));\n    assert(size == (uint32_t) (1 << i));\n    assert(i >= 5);\n\n    /* Region 10 setting: Memory with Normal type, not shareable, non-cacheable */\n    MPU->RBAR = ARM_MPU_RBAR(10, nonCacheStart);\n    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 1, 0, 0, 0, 0, i - 1);\n  }\n\n  /* Region 11 setting: Memory with Device type, not shareable, non-cacheable */\n  MPU->RBAR = ARM_MPU_RBAR(11, 0x40000000);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_16MB);\n\n  /* Region 12 setting: Memory with Device type, not shareable, non-cacheable */\n  MPU->RBAR = ARM_MPU_RBAR(12, 0x41000000);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);\n\n  /* Region 13 setting: Memory with Device type, not shareable, non-cacheable */\n  MPU->RBAR = ARM_MPU_RBAR(13, 0x41400000);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB);\n\n  /* Region 14 setting: Memory with Device type, not shareable, non-cacheable */\n  MPU->RBAR = ARM_MPU_RBAR(14, 0x41800000);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_2MB);\n\n  /* Region 15 setting: Memory with Device type, not shareable, non-cacheable */\n  MPU->RBAR = ARM_MPU_RBAR(15, 0x42000000);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, ARM_MPU_REGION_SIZE_1MB);\n\n  /* Enable MPU */\n  ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);\n\n  /* Enable I cache and D cache */\n  #if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT\n  SCB_EnableDCache();\n  #endif\n  #if defined(__ICACHE_PRESENT) && __ICACHE_PRESENT\n  SCB_EnableICache();\n  #endif\n}\n\n#elif __CORTEX_M == 4\n\nstatic void BOARD_ConfigMPU(void) {\n  #if defined(__CC_ARM) || defined(__ARMCC_VERSION)\n  extern uint32_t Image$$RW_m_ncache$$Base[];\n  /* RW_m_ncache_unused is a auxiliary region which is used to get the whole size of noncache section */\n  extern uint32_t Image$$RW_m_ncache_unused$$Base[];\n  extern uint32_t Image$$RW_m_ncache_unused$$ZI$$Limit[];\n  uint32_t nonCacheStart = (uint32_t) Image$$RW_m_ncache$$Base;\n  uint32_t nonCacheSize = ((uint32_t) Image$$RW_m_ncache_unused$$Base == nonCacheStart) ? 0 : ((uint32_t) Image$$RW_m_ncache_unused$$ZI$$Limit - nonCacheStart);\n  #elif defined(__MCUXPRESSO)\n  extern uint32_t __base_NCACHE_REGION;\n  extern uint32_t __top_NCACHE_REGION;\n  uint32_t nonCacheStart = (uint32_t) (&__base_NCACHE_REGION);\n  uint32_t nonCacheSize = (uint32_t) (&__top_NCACHE_REGION) - nonCacheStart;\n  #elif defined(__ICCARM__) || defined(__GNUC__)\n  extern uint32_t __NCACHE_REGION_START[];\n  extern uint32_t __NCACHE_REGION_SIZE[];\n  uint32_t nonCacheStart = (uint32_t) __NCACHE_REGION_START;\n  uint32_t nonCacheSize = (uint32_t) __NCACHE_REGION_SIZE;\n  #endif\n  #if defined(__USE_SHMEM)\n    #if defined(__CC_ARM) || defined(__ARMCC_VERSION)\n  extern uint32_t Image$$RPMSG_SH_MEM$$Base[];\n  /* RPMSG_SH_MEM_unused is a auxiliary region which is used to get the whole size of RPMSG_SH_MEM section */\n  extern uint32_t Image$$RPMSG_SH_MEM_unused$$Base[];\n  extern uint32_t Image$$RPMSG_SH_MEM_unused$$ZI$$Limit[];\n  uint32_t rpmsgShmemStart = (uint32_t) Image$$RPMSG_SH_MEM$$Base;\n  uint32_t rpmsgShmemSize = (uint32_t) Image$$RPMSG_SH_MEM_unused$$ZI$$Limit - rpmsgShmemStart;\n    #elif defined(__MCUXPRESSO)\n  extern uint32_t __base_rpmsg_sh_mem;\n  extern uint32_t __top_rpmsg_sh_mem;\n  uint32_t rpmsgShmemStart = (uint32_t) (&__base_rpmsg_sh_mem);\n  uint32_t rpmsgShmemSize = (uint32_t) (&__top_rpmsg_sh_mem) - rpmsgShmemStart;\n    #elif defined(__ICCARM__) || defined(__GNUC__)\n  extern uint32_t __RPMSG_SH_MEM_START[];\n  extern uint32_t __RPMSG_SH_MEM_SIZE[];\n  uint32_t rpmsgShmemStart = (uint32_t) __RPMSG_SH_MEM_START;\n  uint32_t rpmsgShmemSize = (uint32_t) __RPMSG_SH_MEM_SIZE;\n    #endif\n  #endif\n  uint32_t i = 0;\n\n  /* Only config non-cacheable region on system bus */\n  assert(nonCacheStart >= 0x20000000);\n\n  /* Disable code bus cache */\n  if (LMEM_PCCCR_ENCACHE_MASK == (LMEM_PCCCR_ENCACHE_MASK & LMEM->PCCCR)) {\n    /* Enable the processor code bus to push all modified lines. */\n    LMEM->PCCCR |= LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK | LMEM_PCCCR_GO_MASK;\n    /* Wait until the cache command completes. */\n    while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {\n    }\n    /* As a precaution clear the bits to avoid inadvertently re-running this command. */\n    LMEM->PCCCR &= ~(LMEM_PCCCR_PUSHW0_MASK | LMEM_PCCCR_PUSHW1_MASK);\n    /* Now disable the cache. */\n    LMEM->PCCCR &= ~LMEM_PCCCR_ENCACHE_MASK;\n  }\n\n  /* Disable system bus cache */\n  if (LMEM_PSCCR_ENCACHE_MASK == (LMEM_PSCCR_ENCACHE_MASK & LMEM->PSCCR)) {\n    /* Enable the processor system bus to push all modified lines. */\n    LMEM->PSCCR |= LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK | LMEM_PSCCR_GO_MASK;\n    /* Wait until the cache command completes. */\n    while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {\n    }\n    /* As a precaution clear the bits to avoid inadvertently re-running this command. */\n    LMEM->PSCCR &= ~(LMEM_PSCCR_PUSHW0_MASK | LMEM_PSCCR_PUSHW1_MASK);\n    /* Now disable the cache. */\n    LMEM->PSCCR &= ~LMEM_PSCCR_ENCACHE_MASK;\n  }\n\n  /* Disable MPU */\n  ARM_MPU_Disable();\n\n  #if defined(CACHE_MODE_WRITE_THROUGH) && CACHE_MODE_WRITE_THROUGH\n  /* Region 0 setting: Memory with Normal type, not shareable, write through */\n  MPU->RBAR = ARM_MPU_RBAR(0, 0x20200000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_1MB);\n\n  /* Region 1 setting: Memory with Normal type, not shareable, write through */\n  MPU->RBAR = ARM_MPU_RBAR(1, 0x20300000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_512KB);\n\n  /* Region 2 setting: Memory with Normal type, not shareable, write through */\n  MPU->RBAR = ARM_MPU_RBAR(2, 0x80000000U);\n  MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 0, 0, ARM_MPU_REGION_SIZE_64MB);\n\n  while ((nonCacheSize >> i) > 0x1U) {\n    i++;\n  }\n\n  if (i != 0) {\n    /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */\n    assert(!(nonCacheStart % nonCacheSize));\n    assert(nonCacheSize == (uint32_t) (1 << i));\n    assert(i >= 5);\n\n    /* Region 3 setting: Memory with device type, not shareable, non-cacheable */\n    MPU->RBAR = ARM_MPU_RBAR(3, nonCacheStart);\n    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, i - 1);\n  }\n\n    #if defined(__USE_SHMEM)\n  i = 0;\n\n  while ((rpmsgShmemSize >> i) > 0x1U) {\n    i++;\n  }\n\n  if (i != 0) {\n    /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */\n    assert(!(rpmsgShmemStart % rpmsgShmemSize));\n    assert(rpmsgShmemSize == (uint32_t) (1 << i));\n    assert(i >= 5);\n\n    /* Region 4 setting: Memory with device type, not shareable, non-cacheable */\n    MPU->RBAR = ARM_MPU_RBAR(4, rpmsgShmemStart);\n    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, i - 1);\n  }\n    #endif\n  #else\n  while ((nonCacheSize >> i) > 0x1U) {\n    i++;\n  }\n\n  if (i != 0) {\n    /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */\n    assert(!(nonCacheStart % nonCacheSize));\n    assert(nonCacheSize == (uint32_t) (1 << i));\n    assert(i >= 5);\n\n    /* Region 0 setting: Memory with device type, not shareable, non-cacheable */\n    MPU->RBAR = ARM_MPU_RBAR(0, nonCacheStart);\n    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, i - 1);\n  }\n\n    #if defined(__USE_SHMEM)\n  i = 0;\n\n  while ((rpmsgShmemSize >> i) > 0x1U) {\n    i++;\n  }\n\n  if (i != 0) {\n    /* The MPU region size should be 2^N, 5<=N<=32, region base should be multiples of size. */\n    assert(!(rpmsgShmemStart % rpmsgShmemSize));\n    assert(rpmsgShmemSize == (uint32_t) (1 << i));\n    assert(i >= 5);\n\n    /* Region 1 setting: Memory with device type, not shareable, non-cacheable */\n    MPU->RBAR = ARM_MPU_RBAR(1, rpmsgShmemStart);\n    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 2, 0, 0, 0, 0, i - 1);\n  }\n    #endif\n  #endif\n\n  /* Enable MPU */\n  ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);\n\n  /* Enables the processor system bus to invalidate all lines in both ways.\n    and Initiate the processor system bus cache command. */\n  LMEM->PSCCR |= LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK | LMEM_PSCCR_GO_MASK;\n  /* Wait until the cache command completes */\n  while ((LMEM->PSCCR & LMEM_PSCCR_GO_MASK) != 0U) {\n  }\n  /* As a precaution clear the bits to avoid inadvertently re-running this command. */\n  LMEM->PSCCR &= ~(LMEM_PSCCR_INVW0_MASK | LMEM_PSCCR_INVW1_MASK);\n  /* Now enable the system bus cache. */\n  LMEM->PSCCR |= LMEM_PSCCR_ENCACHE_MASK;\n\n  /* Enables the processor code bus to invalidate all lines in both ways.\n    and Initiate the processor code bus code cache command. */\n  LMEM->PCCCR |= LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK | LMEM_PCCCR_GO_MASK;\n  /* Wait until the cache command completes. */\n  while ((LMEM->PCCCR & LMEM_PCCCR_GO_MASK) != 0U) {\n  }\n  /* As a precaution clear the bits to avoid inadvertently re-running this command. */\n  LMEM->PCCCR &= ~(LMEM_PCCCR_INVW0_MASK | LMEM_PCCCR_INVW1_MASK);\n  /* Now enable the code bus cache. */\n  LMEM->PCCCR |= LMEM_PCCCR_ENCACHE_MASK;\n}\n#endif\n\n\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/board.mk",
    "content": "MCU_FAMILY = RT1170\nMCU_VARIANT = MIMXRT1176\n\nifeq ($(M4), 1)\n  MCU_CORE = _cm4\n  JLINK_CORE = _M4\n  CPU_CORE = cortex-m4\n  LD_FILE ?= $(MCU_DIR)/gcc/$(MCU_VARIANT)xxxxx${MCU_CORE}_ram.ld\nelse\n  MCU_CORE = _cm7\n  JLINK_CORE = _M7\nendif\n\nCFLAGS += -DCPU_MIMXRT1176DVMAA$(MCU_CORE)\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1176xxxA$(JLINK_CORE)\n\n# For flash-pyocd target\nPYOCD_TARGET = mimxrt1170$(MCU_CORE)\n\nBOARD_TUD_RHPORT = 0\nBOARD_TUH_RHPORT = 1\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/evkbmimxrt1170_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2018-2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"evkbmimxrt1170_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\"), used))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock\n            .controllerMiscOption = 0x10,\n            .deviceType           = kFlexSpiDeviceType_SerialNOR,\n            .sflashPadType        = kSerialFlash_4Pads,\n            .serialClkFreq        = kFlexSpiSerialClk_133MHz,\n            .sflashA1Size         = 64u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    [0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEC, RADDR_SDR, FLEXSPI_4PAD, 0x20),\n                    [1] = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n\n                    // Read Status LUTs\n                    [4 * 1 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),\n\n                    // Write Enable LUTs\n                    [4 * 3 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, FLEXSPI_1PAD, 0x0),\n\n                    // Erase Sector LUTs\n                    [4 * 5 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x21, RADDR_SDR, FLEXSPI_1PAD, 0x20),\n\n                    // Erase Block LUTs\n                    [4 * 8 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xD8, RADDR_SDR, FLEXSPI_1PAD, 0x18),\n\n                    // Pape Program LUTs\n                    [4 * 9 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x12, RADDR_SDR, FLEXSPI_1PAD, 0x20),\n                    [4 * 9 + 1] = FLEXSPI_LUT_SEQ(WRITE_SDR, FLEXSPI_1PAD, 0x04, STOP, FLEXSPI_1PAD, 0x0),\n\n                    // Erase Chip LUTs\n                    [4 * 11 + 0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x60, STOP, FLEXSPI_1PAD, 0x0),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .ipcmdSerialClkFreq = 0x1,\n    .blockSize          = 64u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/evkbmimxrt1170_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2018-2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __EVKMIMXRT1170_FLEXSPI_NOR_CONFIG__\n#define __EVKMIMXRT1170_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.1. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 1))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG     (0x42464346UL) // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE    (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ        0\n#define CMD_INDEX_READSTATUS  1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE       4\n\n#define CMD_LUT_SEQ_IDX_READ        0\n#define CMD_LUT_SEQ_IDX_READSTATUS  1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE       9\n\n#define CMD_SDR        0x01\n#define CMD_DDR        0x21\n#define RADDR_SDR      0x02\n#define RADDR_DDR      0x22\n#define CADDR_SDR      0x03\n#define CADDR_DDR      0x23\n#define MODE1_SDR      0x04\n#define MODE1_DDR      0x24\n#define MODE2_SDR      0x05\n#define MODE2_DDR      0x25\n#define MODE4_SDR      0x06\n#define MODE4_DDR      0x26\n#define MODE8_SDR      0x07\n#define MODE8_DDR      0x27\n#define WRITE_SDR      0x08\n#define WRITE_DDR      0x28\n#define READ_SDR       0x09\n#define READ_DDR       0x29\n#define LEARN_SDR      0x0A\n#define LEARN_DDR      0x2A\n#define DATSZ_SDR      0x0B\n#define DATSZ_DDR      0x2B\n#define DUMMY_SDR      0x0C\n#define DUMMY_DDR      0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS      0x1F\n#define STOP           0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_80MHz  = 4,\n    kFlexSpiSerialClk_100MHz = 5,\n    kFlexSpiSerialClk_120MHz = 6,\n    kFlexSpiSerialClk_133MHz = 7,\n    kFlexSpiSerialClk_166MHz = 8,\n    kFlexSpiSerialClk_200MHz = 9,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ        CMD_INDEX_READ        //!< 0\n#define NOR_CMD_INDEX_READSTATUS  CMD_INDEX_READSTATUS  //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE   5                     //!< 5\n#define NOR_CMD_INDEX_DUMMY       6                     //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK  7                     //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK  8 //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t isDataOrderSwapped;     //!< The data order is swapped in OPI DDR mode\n    uint8_t reserved0;              //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t FlashStateCtx;         //!< Flash State Context after being configured\n    uint32_t reserve2[10];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1170_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/mimxrt1170_evkb/mimxrt1170_evkb.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1176xxxxx\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_17 http://mcuxpresso.nxp.com/XSD/mex_configuration_17.xsd\" uuid=\"060646c1-2247-47a8-b52d-03c1968b4426\" version=\"17\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_17\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1176xxxxx</processor>\n      <package>MIMXRT1176DVMAA</package>\n      <board>MIMXRT1170-EVKB</board>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"cm7\">\n         <core name=\"Cortex-M4F\" id=\"cm4\" description=\"\"/>\n         <core name=\"Cortex-M7F\" id=\"cm7\" description=\"\"/>\n      </cores>\n      <description>Configuration imported from evkbmimxrt1170_dev_cdc_vcom_lite_bm_cm7</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=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>24.12.10</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"M13\" pin_signal=\"GPIO_AD_04\" label=\"SIM1_PD/J44[C8]/USER_LED_CTL1/J9[8]/J25[7]\" identifier=\"SIM1_PD;LED;USER_LED\"/>\n            </pin_labels>\n            <external_user_signals>\n               <properties/>\n            </external_user_signals>\n            <power_domains/>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm7</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO9\" signal=\"gpio_io, 03\" pin_num=\"M13\" pin_signal=\"GPIO_AD_04\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"USER_LED\"/>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO13\" signal=\"gpio_io, 00\" pin_num=\"T8\" pin_signal=\"WAKEUP\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm7</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"TXD\" pin_num=\"L13\" pin_signal=\"GPIO_AD_24\">\n                     <pin_features>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART1\" signal=\"RXD\" pin_num=\"M15\" pin_signal=\"GPIO_AD_25\">\n                     <pin_features>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"15.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\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=\"ANADIG.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: ANADIG.xtali, Clocks tool id: ANADIG_OSC.XTALI) 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=\"ANADIG.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: ANADIG.xtali, Clocks tool id: ANADIG_OSC.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"ANADIG.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: ANADIG.xtalo, Clocks tool id: ANADIG_OSC.XTALO) 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=\"ANADIG.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: ANADIG.xtalo, Clocks tool id: ANADIG_OSC.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"ANADIG.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: ANADIG.rtc_xtali, Clocks tool id: ANADIG_OSC.RTC_XTALI) 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=\"ANADIG.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: ANADIG.rtc_xtali, Clocks tool id: ANADIG_OSC.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"ANADIG.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: ANADIG.rtc_xtalo, Clocks tool id: ANADIG_OSC.RTC_XTALO) 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=\"ANADIG.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: ANADIG.rtc_xtalo, Clocks tool id: ANADIG_OSC.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"cm4\">\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=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm4\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.dcdc_soc\" description=\"Clocks initialization requires the DCDC_SOC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm4\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.dcdc_soc\" description=\"Clocks initialization requires the DCDC_SOC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.pmu_1\" description=\"Clocks initialization requires the PMU_1 Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm4\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.pmu_1\" description=\"Clocks initialization requires the PMU_1 Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm7\">\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=\"cm4\">\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=\"cm7\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources/>\n               <clock_outputs>\n                  <clock_output id=\"ACMP_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ADC1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ADC2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ARM_PLL_CLK.outFreq\" value=\"996 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ASRC_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"AXI_CLK_ROOT.outFreq\" value=\"996 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"BUS_CLK_ROOT.outFreq\" value=\"240 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"BUS_LPSR_CLK_ROOT.outFreq\" value=\"160 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN3_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CCM_CLKO1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CCM_CLKO2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI2_ESC_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI2_UI_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSSYS_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSTRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ELCDIF_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"EMV1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"EMV2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_1G_TX_CLK.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_25M_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_QOS_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_TIMER1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_TIMER2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_TIMER3_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GC355_CLK_ROOT.outFreq\" value=\"492.0000125 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT3_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT3_ipg_clk_highfreq.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT4_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT4_ipg_clk_highfreq.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT5_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT5_ipg_clk_highfreq.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT6_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT6_ipg_clk_highfreq.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LCDIFV2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C3_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C4_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C5_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C6_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI3_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI4_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI5_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI6_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART10_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART11_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART12_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART3_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART4_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART5_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART6_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART7_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART8_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPUART9_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"M4_CLK_ROOT.outFreq\" value=\"4320/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"M4_SYSTICK_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"M7_CLK_ROOT.outFreq\" value=\"996 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"M7_SYSTICK_CLK_ROOT.outFreq\" value=\"100 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MIC_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MIPI_DSI_TX_CLK_ESC_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MIPI_ESC_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MIPI_REF_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"OSC_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"OSC_32K.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"OSC_RC_16M.outFreq\" value=\"16 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"OSC_RC_400M.outFreq\" value=\"400 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"OSC_RC_48M.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"OSC_RC_48M_DIV2.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PLL_VIDEO_CLK.outFreq\" value=\"984.000025 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI4_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI4_MCLK1.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SEMC_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL2_CLK.outFreq\" value=\"528 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL2_PFD0_CLK.outFreq\" value=\"352 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL2_PFD1_CLK.outFreq\" value=\"594 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL2_PFD2_CLK.outFreq\" value=\"396 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL2_PFD3_CLK.outFreq\" value=\"297 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL3_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL3_DIV2_CLK.outFreq\" value=\"240 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL3_PFD0_CLK.outFreq\" value=\"8640/13 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL3_PFD1_CLK.outFreq\" value=\"8640/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL3_PFD2_CLK.outFreq\" value=\"270 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYS_PLL3_PFD3_CLK.outFreq\" value=\"4320/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC1_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC2_CLK_ROOT.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CoreBusClockRootsInitializationConfig\" value=\"selectedCore\" locked=\"false\"/>\n                  <setting id=\"SOCDomainVoltage\" value=\"OD\" locked=\"false\"/>\n                  <setting id=\"ANADIG_OSC_OSC_24M_CTRL_LP_EN_CFG\" value=\"Low\" locked=\"false\"/>\n                  <setting id=\"ANADIG_OSC_OSC_24M_CTRL_OSC_EN_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.PLL_AUDIO_BYPASS.sel\" value=\"ANADIG_OSC.OSC_24M\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.PLL_VIDEO.denom\" value=\"960000\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.PLL_VIDEO.div\" value=\"41\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.PLL_VIDEO.num\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.SYS_PLL1_BYPASS.sel\" value=\"ANADIG_OSC.OSC_24M\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.SYS_PLL2.denom\" value=\"268435455\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.SYS_PLL2.div\" value=\"22\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.SYS_PLL2.num\" value=\"0\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.SYS_PLL2_SS_DIV.scale\" value=\"268435455\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL.SYS_PLL3_PFD3_DIV.scale\" value=\"22\" locked=\"true\"/>\n                  <setting id=\"ANADIG_PLL.SYS_PLL3_PFD3_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"ANADIG_PLL_ARM_PLL_CTRL_POWERUP_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL_PLL_AUDIO_CTRL_GATE_CFG\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL_PLL_VIDEO_CTRL0_POWERUP_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL_SYS_PLL1_CTRL0_POWERUP_CFG\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL_SYS_PLL1_CTRL_GATE_CFG\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL_SYS_PLL2_CTRL_POWERUP_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL_SYS_PLL3_CTRL_POWERUP_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ANADIG_PLL_SYS_PLL3_CTRL_SYS_PLL3_DIV2_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT0.MUX.sel\" value=\"ANADIG_PLL.ARM_PLL_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT1.MUX.sel\" value=\"ANADIG_PLL.SYS_PLL3_PFD3_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT2.DIV.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT2.MUX.sel\" value=\"ANADIG_PLL.SYS_PLL3_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT25.DIV.scale\" value=\"22\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT25.MUX.sel\" value=\"ANADIG_PLL.SYS_PLL2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT26.DIV.scale\" value=\"22\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT26.MUX.sel\" value=\"ANADIG_PLL.SYS_PLL2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT3.DIV.scale\" value=\"3\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT3.MUX.sel\" value=\"ANADIG_PLL.SYS_PLL3_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT4.DIV.scale\" value=\"3\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT4.MUX.sel\" value=\"ANADIG_PLL.SYS_PLL2_PFD1_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT6.DIV.scale\" value=\"4\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT6.MUX.sel\" value=\"ANADIG_PLL.SYS_PLL2_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT68.DIV.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT68.MUX.sel\" value=\"ANADIG_PLL.PLL_VIDEO_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.CLOCK_ROOT8.DIV.scale\" value=\"240\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>13.0.2</processor_version>\n            <output_format>c_array</output_format>\n         </dcdx_profile>\n         <dcdx_configurations>\n            <dcdx_configuration name=\"Device_configuration\">\n               <description></description>\n               <options/>\n               <command_groups>\n                  <command_group name=\"Imported Commands\" enabled=\"true\">\n                     <commands>\n                        <command type=\"write_value\" address=\"CCM_CLOCK_ROOT4_CONTROL\" value=\"0x703\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_00\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_01\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_02\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_03\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_04\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_05\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_06\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_07\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_08\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_09\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_10\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_11\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_12\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_13\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_14\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_15\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_16\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_17\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_18\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_19\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_20\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_21\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_22\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_23\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_24\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_25\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_26\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_27\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_28\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_29\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_30\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_31\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_32\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_33\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_34\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_35\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_36\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_37\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_38\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B1_39\" value=\"0x10\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_00\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_01\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_02\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_03\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_04\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_05\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_06\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_07\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_08\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_09\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_10\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_11\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_12\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_13\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_14\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_15\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_16\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_B2_17\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_00\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_01\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_02\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_03\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_04\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_05\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_06\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_07\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_08\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_09\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_10\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_11\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_12\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_13\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_14\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_15\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_16\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_17\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_18\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_19\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_20\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_21\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_22\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_23\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_24\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_25\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_26\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_27\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_28\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_29\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_30\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_31\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_32\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_33\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_34\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_35\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_36\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_37\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_38\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B1_39\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_00\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_01\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_02\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_03\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_04\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_05\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_06\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_07\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_08\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_09\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_10\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_11\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_12\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_13\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_14\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_15\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_16\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_B2_17\" value=\"0x08\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_MCR\" value=\"0x10000004\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_BMCR0\" value=\"0x81\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_BMCR1\" value=\"0x81\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_BR0\" value=\"0x8000001D\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_SDRAMCR0\" value=\"0xF32\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_SDRAMCR1\" value=\"0x772A22\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_SDRAMCR2\" value=\"0x10A0D\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_SDRAMCR3\" value=\"0x21210408\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_IPCR0\" value=\"0x80000000\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_IPCR1\" value=\"0x02\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_IPCR2\" value=\"0x00\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_IPCMD\" value=\"0xA55A000F\" value_width=\"4\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"write_value\" address=\"SEMC_INTR\" value=\"0x03\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_IPCMD\" value=\"0xA55A000C\" value_width=\"4\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"write_value\" address=\"SEMC_INTR\" value=\"0x03\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_IPCMD\" value=\"0xA55A000C\" value_width=\"4\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"write_value\" address=\"SEMC_INTR\" value=\"0x03\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_IPTXDAT\" value=\"0x33\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_IPCMD\" value=\"0xA55A000A\" value_width=\"4\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"nop\"/>\n                        <command type=\"write_value\" address=\"SEMC_INTR\" value=\"0x03\" value_width=\"4\"/>\n                        <command type=\"write_value\" address=\"SEMC_SDRAMCR3\" value=\"0x21210409\" value_width=\"4\"/>\n                     </commands>\n                  </command_group>\n               </command_groups>\n            </dcdx_configuration>\n         </dcdx_configurations>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <dependencies>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpuart\" description=\"LPUART Driver not found in the toolchain/IDE project. Project will not compile!\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data type=\"Boolean\">true</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpuart\" description=\"Unsupported version of the LPUART Driver in the toolchain/IDE project. Required: ${required_value}, actual: ${actual_value}. Project might not compile correctly.\" problem_level=\"1\" source=\"Peripherals\">\n               <feature name=\"version\" evaluation=\"equivalent\">\n                  <data type=\"Version\">2.5.1</data>\n               </feature>\n            </dependency>\n         </dependencies>\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"5580249f-8696-4d01-87fa-efd84baaea95\" called_from_default_init=\"true\" id_prefix=\"\" core=\"cm7\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"ClockOutput\" resourceId=\"LPUART1_CLK_ROOT\" description=\"LPUART1 clock root is inactive.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"frequency\" evaluation=\"greaterThan\">\n                        <data type=\"Frequency\" unit=\"Hz\">0</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"LPUART1.uart_tx\" description=\"Signal TX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"LPUART1.uart_rx\" description=\"Signal RX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <instances>\n                  <instance name=\"NVIC\" uuid=\"27e59fb2-3864-4b83-bf0e-a683a8582c73\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LPUART1\" uuid=\"78f9b1b2-5105-4480-a25a-29d8172b6270\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"cd2726b0-9595-440c-9375-bb6a010a1d55\" type_id=\"system_54b53072540eeeb8f8e9343e71f28176\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"2491c39d-c21a-45f3-a984-57be0f6a77b5\" type_id=\"msg_6e2baaf3b97dbeef01c0043275f9a0e7\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"fefc514e-ed7f-48ad-a874-de332dd5eb13\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"1dc54607-ada6-4731-ad75-479a19616c00\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"88660053-1bc1-49b8-884c-a12532e98a7a\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"9d37100d-c1fb-4f7e-b235-a952c5b03275\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"ad9ccf5d-6535-4f75-bb23-abb7e6fcc950\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>N/A</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v11.0\nprocessor: MIMXRT1062xxxxA\npackage_id: MIMXRT1062DVL6A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1060-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: AHB_CLK_ROOT.outFreq, value: 600 MHz}\n- {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: CSI_CLK_ROOT.outFreq, value: 12 MHz}\n- {id: ENET2_125M_CLK.outFreq, value: 1.2 MHz}\n- {id: ENET_125M_CLK.outFreq, value: 2.4 MHz}\n- {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXIO2_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI2_CLK_ROOT.outFreq, value: 1440/11 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 1440/11 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 150 MHz}\n- {id: LCDIF_CLK_ROOT.outFreq, value: 67.5 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: LVDS1_CLK.outFreq, value: 1.2 GHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: PLL7_MAIN_CLK.outFreq, value: 480 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SEMC_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY1_CLK.outFreq, value: 480 MHz}\n- {id: USBPHY2_CLK.outFreq, value: 480 MHz}\n- {id: USDHC1_CLK_ROOT.outFreq, value: 198 MHz}\n- {id: USDHC2_CLK_ROOT.outFreq, value: 198 MHz}\nsettings:\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.ARM_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI2_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI2_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.FLEXSPI_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.LCDIF_PODF.scale, value: '4', locked: true}\n- {id: CCM.LCDIF_PRED.scale, value: '2', locked: true}\n- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.SEMC_PODF.scale, value: '8'}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM.TRACE_PODF.scale, value: '4', locked: true}\n- {id: CCM_ANALOG.PLL1_BYPASS.sel, value: CCM_ANALOG.PLL1}\n- {id: CCM_ANALOG.PLL1_PREDIV.scale, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL1_VDIV.scale, value: '50', locked: true}\n- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '33', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL4.denom, value: '50'}\n- {id: CCM_ANALOG.PLL4.div, value: '47'}\n- {id: CCM_ANALOG.PLL5.denom, value: '1'}\n- {id: CCM_ANALOG.PLL5.div, value: '31', locked: true}\n- {id: CCM_ANALOG.PLL5.num, value: '0'}\n- {id: CCM_ANALOG.PLL5_BYPASS.sel, value: CCM_ANALOG.PLL5_POST_DIV}\n- {id: CCM_ANALOG.PLL5_POST_DIV.scale, value: '2', locked: true}\n- {id: CCM_ANALOG.PLL7_BYPASS.sel, value: CCM_ANALOG.PLL7}\n- {id: CCM_ANALOG.VIDEO_DIV.scale, value: '4', locked: true}\n- {id: CCM_ANALOG_PLL_ENET_POWERDOWN_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG, value: 'No'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 100,                       /* PLL loop divider, Fout = Fin * 50 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 31,                        /* PLL loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .postDivider = 8,                         /* Divider after PLL */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */\n    /* Setting the VDD_SOC to 1.275V. It is necessary to config AHB to 600Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x13);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Adc2);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    CLOCK_DisableClock(kCLOCK_Xbar2);\n    CLOCK_DisableClock(kCLOCK_Xbar3);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Set ARM_PODF. */\n    CLOCK_SetDiv(kCLOCK_ArmDiv, 1);\n    /* Set PERIPH_CLK2_PODF. */\n    CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* Disable USDHC1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc1);\n    /* Set USDHC1_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1);\n    /* Set Usdhc1 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);\n    /* Disable USDHC2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc2);\n    /* Set USDHC2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1);\n    /* Set Usdhc2 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n    /* Disable Semc clock gate. */\n    CLOCK_DisableClock(kCLOCK_Semc);\n    /* Set SEMC_PODF. */\n    CLOCK_SetDiv(kCLOCK_SemcDiv, 7);\n    /* Set Semc alt clock source. */\n    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);\n    /* Set Semc clock source. */\n    CLOCK_SetMux(kCLOCK_SemcMux, 0);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 1);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 3);\n#endif\n    /* Disable Flexspi2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi2);\n    /* Set FLEXSPI2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexspi2Div, 1);\n    /* Set Flexspi2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1);\n    /* Disable CSI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Csi);\n    /* Set CSI_PODF. */\n    CLOCK_SetDiv(kCLOCK_CsiDiv, 1);\n    /* Set Csi clock source. */\n    CLOCK_SetMux(kCLOCK_CsiMux, 0);\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    CLOCK_DisableClock(kCLOCK_Lpspi3);\n    CLOCK_DisableClock(kCLOCK_Lpspi4);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai2);\n    /* Set SAI2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);\n    /* Set SAI2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai2Div, 1);\n    /* Set Sai2 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai2Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    CLOCK_DisableClock(kCLOCK_Lpi2c3);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable CAN clock gate. */\n    CLOCK_DisableClock(kCLOCK_Can1);\n    CLOCK_DisableClock(kCLOCK_Can2);\n    CLOCK_DisableClock(kCLOCK_Can3);\n    CLOCK_DisableClock(kCLOCK_Can1S);\n    CLOCK_DisableClock(kCLOCK_Can2S);\n    CLOCK_DisableClock(kCLOCK_Can3S);\n    /* Set CAN_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_CanDiv, 1);\n    /* Set Can clock source. */\n    CLOCK_SetMux(kCLOCK_CanMux, 2);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    CLOCK_DisableClock(kCLOCK_Lpuart5);\n    CLOCK_DisableClock(kCLOCK_Lpuart6);\n    CLOCK_DisableClock(kCLOCK_Lpuart7);\n    CLOCK_DisableClock(kCLOCK_Lpuart8);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable LCDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_LcdPixel);\n    /* Set LCDIF_PRED. */\n    CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1);\n    /* Set LCDIF_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_LcdifDiv, 3);\n    /* Set Lcdif pre clock source. */\n    CLOCK_SetMux(kCLOCK_LcdifPreMux, 5);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* Disable Flexio2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio2);\n    /* Set FLEXIO2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1);\n    /* Set FLEXIO2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio2Div, 7);\n    /* Set Flexio2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio2Mux, 3);\n    /* Set Pll3 sw clock source. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* Init ARM PLL. */\n    CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n    #warning \"SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged.\"\n#endif\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 24);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 16);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 33);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 19);\n#endif\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Init Video PLL. */\n    uint32_t pllVideo;\n    /* Disable Video PLL output before initial Video PLL. */\n    CCM_ANALOG->PLL_VIDEO &= ~CCM_ANALOG_PLL_VIDEO_ENABLE_MASK;\n    /* Bypass PLL first */\n    CCM_ANALOG->PLL_VIDEO = (CCM_ANALOG->PLL_VIDEO & (~CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_MASK)) |\n                            CCM_ANALOG_PLL_VIDEO_BYPASS_MASK | CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC(0);\n    CCM_ANALOG->PLL_VIDEO_NUM = CCM_ANALOG_PLL_VIDEO_NUM_A(0);\n    CCM_ANALOG->PLL_VIDEO_DENOM = CCM_ANALOG_PLL_VIDEO_DENOM_B(1);\n    pllVideo = (CCM_ANALOG->PLL_VIDEO & (~(CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK | CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK))) |\n               CCM_ANALOG_PLL_VIDEO_ENABLE_MASK |CCM_ANALOG_PLL_VIDEO_DIV_SELECT(31);\n    pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1);\n    CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(3);\n    CCM_ANALOG->PLL_VIDEO = pllVideo;\n    while ((CCM_ANALOG->PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_LOCK_MASK) == 0)\n    {\n    }\n    /* Disable bypass for Video PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllVideo, 0);\n    /* DeInit Enet PLL. */\n    CLOCK_DeinitEnetPll();\n    /* Bypass Enet PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1);\n    /* Set Enet output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_DIV_SELECT(1);\n    /* Enable Enet output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENABLE_MASK;\n    /* Set Enet2 output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT(0);\n    /* Enable Enet2 output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET2_REF_EN_MASK;\n    /* Enable Enet25M output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK;\n    /* Init Usb2 PLL. */\n    CLOCK_InitUsb2Pll(&usb2PllConfig_BOARD_BootClockRUN);\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Set lvds1 clock source. */\n    CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set ENET Ref clock source. */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK;\n    /* Set ENET2 Ref clock source. */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET2_TX_CLK_DIR_MASK;\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             600000000U  /*!< Core clock frequency: 600000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT               600000000UL\n#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT               40000000UL\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL\n#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT               12000000UL\n#define BOARD_BOOTCLOCKRUN_ENET2_125M_CLK             1200000UL\n#define BOARD_BOOTCLOCKRUN_ENET2_REF_CLK              0UL\n#define BOARD_BOOTCLOCKRUN_ENET2_TX_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK              2400000UL\n#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK           1200000UL\n#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK                0UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT          130909090UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           130909090UL\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      75000000UL\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      75000000UL\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               150000000UL\n#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT             67500000UL\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL\n#define BOARD_BOOTCLOCKRUN_LVDS1_CLK                  1200000000UL\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            75000000UL\n#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK              480000000UL\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT              75000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT            198000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT            198000000UL\n\n/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Usb2 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Video PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v13.1\nprocessor: MIMXRT1062xxxxA\npackage_id: MIMXRT1062DVL6A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1060-EVK\npin_labels:\n- {pin_num: E7, pin_signal: GPIO_B0_01, label: LCDIF_ENABLE, identifier: USER_BUTTON}\n- {pin_num: D8, pin_signal: GPIO_B0_03, label: LCDIF_VSYNC, identifier: USER_LED}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: D8, peripheral: GPIO2, signal: 'gpio_io, 03', pin_signal: GPIO_B0_03, direction: OUTPUT}\n  - {pin_num: E7, peripheral: GPIO2, signal: 'gpio_io, 01', pin_signal: GPIO_B0_01, direction: INPUT, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  /* GPIO configuration of USER_BUTTON on GPIO_B0_01 (pin E7) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_B0_01 (pin E7) */\n  GPIO_PinInit(GPIO2, 1U, &USER_BUTTON_config);\n\n  /* GPIO configuration of USER_LED on GPIO_B0_03 (pin D8) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_B0_03 (pin D8) */\n  GPIO_PinInit(GPIO2, 3U, &USER_LED_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_01_GPIO2_IO01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_03_GPIO2_IO03, 0U);\n  IOMUXC_GPR->GPR27 = ((IOMUXC_GPR->GPR27 &\n    (~(BOARD_INITPINS_IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_01_GPIO2_IO01, 0xB0B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: K14, peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_12, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: L14, peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_13, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0x10B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0x10B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSDHCPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: J2, peripheral: USDHC1, signal: 'usdhc_data, 3', pin_signal: GPIO_SD_B0_05}\n  - {pin_num: H2, peripheral: USDHC1, signal: 'usdhc_data, 2', pin_signal: GPIO_SD_B0_04}\n  - {pin_num: K1, peripheral: USDHC1, signal: 'usdhc_data, 1', pin_signal: GPIO_SD_B0_03}\n  - {pin_num: J1, peripheral: USDHC1, signal: 'usdhc_data, 0', pin_signal: GPIO_SD_B0_02}\n  - {pin_num: J4, peripheral: USDHC1, signal: usdhc_cmd, pin_signal: GPIO_SD_B0_00}\n  - {pin_num: J3, peripheral: USDHC1, signal: usdhc_clk, pin_signal: GPIO_SD_B0_01}\n  - {pin_num: C14, peripheral: USDHC1, signal: usdhc_vselect, pin_signal: GPIO_B1_14}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSDHCPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitUSDHCPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_14_USDHC1_VSELECT, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitQSPIPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: P3, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08}\n  - {pin_num: N4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_09}\n  - {pin_num: P4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_10}\n  - {pin_num: P5, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_11}\n  - {pin_num: L4, peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07}\n  - {pin_num: L3, peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_06}\n  - {pin_num: N3, peripheral: FLEXSPI, signal: FLEXSPI_A_DQS, pin_signal: GPIO_SD_B1_05}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitQSPIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitQSPIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_05_FLEXSPIA_DQS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03, 0U);\n}\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define BOARD_INITPINS_IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL_MASK 0x0AU /*!< GPIO2 and GPIO7 share same IO MUX function, GPIO_MUX2 selects one GPIO function: affected bits mask */\n\n/* GPIO_B0_03 (coord D8), LCDIF_VSYNC */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO2   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                   gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                       3U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN                                      3U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN_MASK                         (1U << 3U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_LED_PORT                                       GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_PIN                                           3U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_LED_PIN_MASK                              (1U << 3U)   /*!< PORT pin mask */\n\n/* GPIO_B0_01 (coord E7), LCDIF_ENABLE */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO2   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    1U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   1U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 1U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        1U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_BUTTON_PIN_MASK                           (1U << 1U)   /*!< PORT pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/* GPIO_AD_B0_12 (coord K14), UART1_TXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_SIGNAL                             TX   /*!< Signal name */\n\n/* GPIO_AD_B0_13 (coord L14), UART1_RXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_SIGNAL                             RX   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n/* GPIO_SD_B0_05 (coord J2), SD1_D3 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D3_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D3_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_SD_B0_04 (coord H2), SD1_D2 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D2_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D2_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_SD_B0_03 (coord K1), SD1_D1/J24[5]/SPI_MISO */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D1_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D1_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_SD_B0_02 (coord J1), SD1_D0/J24[4]/SPI_MOSI/PWM */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D0_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D0_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_SD_B0_00 (coord J4), SD1_CMD/J24[6] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CMD_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CMD_SIGNAL                             usdhc_cmd   /*!< Signal name */\n\n/* GPIO_SD_B0_01 (coord J3), SD1_CLK/J24[3] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CLK_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CLK_SIGNAL                             usdhc_clk   /*!< Signal name */\n\n/* GPIO_B1_14 (coord C14), SD0_VSELECT */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD0_VSELECT_PERIPHERAL                        USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD0_VSELECT_SIGNAL                     usdhc_vselect   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSDHCPins(void);\n\n/* GPIO_SD_B1_08 (coord P3), FlexSPI_D0_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_SIGNAL                   FLEXSPI_A_DATA0   /*!< Signal name */\n\n/* GPIO_SD_B1_09 (coord N4), FlexSPI_D1_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_SIGNAL                   FLEXSPI_A_DATA1   /*!< Signal name */\n\n/* GPIO_SD_B1_10 (coord P4), FlexSPI_D2_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_SIGNAL                   FLEXSPI_A_DATA2   /*!< Signal name */\n\n/* GPIO_SD_B1_11 (coord P5), FlexSPI_D3_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_SIGNAL                   FLEXSPI_A_DATA3   /*!< Signal name */\n\n/* GPIO_SD_B1_07 (coord L4), FlexSPI_CLK */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_SIGNAL                     FLEXSPI_A_SCLK   /*!< Signal name */\n\n/* GPIO_SD_B1_06 (coord L3), FlexSPI_SS0 */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_SIGNAL                    FLEXSPI_A_SS0_B   /*!< Signal name */\n\n/* GPIO_SD_B1_05 (coord N3), FlexSPI_DQS */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_DQS_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_DQS_SIGNAL                      FLEXSPI_A_DQS   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitQSPIPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/board.cmake",
    "content": "set(MCU_FAMILY RT1060)\nset(MCU_VARIANT MIMXRT1062)\n\nset(JLINK_DEVICE MIMXRT1062xxx6A)\nset(PYOCD_TARGET mimxrt1060)\nset(NXPLINK_DEVICE MIMXRT1062xxxxA:EVK-MIMXRT1060)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/teensy40_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1062DVL6A\n    BOARD_TUD_RHPORT=0\n    BOARD_TUH_RHPORT=1\n    )\nendfunction()\n\n# flash by using teensy_loader_cli https://github.com/PaulStoffregen/teensy_loader_cli\n# Make sure it is in your PATH\n# flash: $(BUILD)/$(PROJECT).hex\n# teensy_loader_cli --mcu=imxrt1062 -v -w $<\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Teensy 4.0\n   url: https://www.pjrc.com/store/teensy40.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (2 * 1024 * 1024)\n\n// LED D13: IOMUXC_GPIO_B0_03_GPIO2_IO03\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// no button D12: IOMUXC_GPIO_B0_01_GPIO2_IO01\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_PERIPHERAL\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_CHANNEL\n#define BUTTON_STATE_ACTIVE   0\n\n// UART D0, D1: IOMUXC_GPIO_AD_B0_03_LPUART6_RX, IOMUXC_GPIO_AD_B0_02_LPUART6_TX\n#define UART_PORT             LPUART6\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1062DVL6A\nMCU_FAMILY = RT1060\nMCU_VARIANT = MIMXRT1062\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1062xxx6A\n\n# flash by using teensy_loader_cli https://github.com/PaulStoffregen/teensy_loader_cli\n# Make sure it is in your PATH\nflash: $(BUILD)/$(PROJECT).hex\n\tteensy_loader_cli --mcu=imxrt1062 -v -w $<\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/teensy40.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1060-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13 http://mcuxpresso.nxp.com/XSD/mex_configuration_13.xsd\" uuid=\"2174caba-38fe-48d5-8f89-42a23354d23b\" version=\"13\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1062xxxxA</processor>\n      <package>MIMXRT1062DVL6A</package>\n      <board>MIMXRT1060-EVK</board>\n      <board_revision>A2</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>false</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"13.1\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>13.0.2</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"E7\" pin_signal=\"GPIO_B0_01\" label=\"LCDIF_ENABLE\" identifier=\"USER_BUTTON\"/>\n               <pin_label pin_num=\"D8\" pin_signal=\"GPIO_B0_03\" label=\"LCDIF_VSYNC\" identifier=\"USER_LED\"/>\n            </pin_labels>\n            <power_domains/>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO2\" description=\"Peripheral GPIO2 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 03\" pin_num=\"D8\" pin_signal=\"GPIO_B0_03\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 01\" pin_num=\"E7\" pin_signal=\"GPIO_B0_01\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"TX\" pin_num=\"K14\" pin_signal=\"GPIO_AD_B0_12\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART1\" signal=\"RX\" pin_num=\"L14\" pin_signal=\"GPIO_AD_B0_13\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSDHCPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USDHC1\" description=\"Peripheral USDHC1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 3\" pin_num=\"J2\" pin_signal=\"GPIO_SD_B0_05\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 2\" pin_num=\"H2\" pin_signal=\"GPIO_SD_B0_04\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 1\" pin_num=\"K1\" pin_signal=\"GPIO_SD_B0_03\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 0\" pin_num=\"J1\" pin_signal=\"GPIO_SD_B0_02\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_cmd\" pin_num=\"J4\" pin_signal=\"GPIO_SD_B0_00\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_clk\" pin_num=\"J3\" pin_signal=\"GPIO_SD_B0_01\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_vselect\" pin_num=\"C14\" pin_signal=\"GPIO_B1_14\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitQSPIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXSPI\" description=\"Peripheral FLEXSPI is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA0\" pin_num=\"P3\" pin_signal=\"GPIO_SD_B1_08\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA1\" pin_num=\"N4\" pin_signal=\"GPIO_SD_B1_09\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA2\" pin_num=\"P4\" pin_signal=\"GPIO_SD_B1_10\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA3\" pin_num=\"P5\" pin_signal=\"GPIO_SD_B1_11\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SCLK\" pin_num=\"L4\" pin_signal=\"GPIO_SD_B1_07\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SS0_B\" pin_num=\"L3\" pin_signal=\"GPIO_SD_B1_06\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DQS\" pin_num=\"N3\" pin_signal=\"GPIO_SD_B1_05\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"11.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>13.0.2</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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"AHB_CLK_ROOT.outFreq\" value=\"600 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN_CLK_ROOT.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI_CLK_ROOT.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET2_125M_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_125M_CLK.outFreq\" value=\"2.4 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_25M_REF_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO2_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI2_CLK_ROOT.outFreq\" value=\"1440/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"1440/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"150 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LCDIF_CLK_ROOT.outFreq\" value=\"67.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LVDS1_CLK.outFreq\" value=\"1.2 GHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PLL7_MAIN_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SEMC_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY1_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY2_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC1_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC2_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.ARM_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI2_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI2_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.LCDIF_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.LCDIF_PRED.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.SEMC_PODF.scale\" value=\"8\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_BYPASS.sel\" value=\"CCM_ANALOG.PLL1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_PREDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_VDIV.scale\" value=\"50\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"33\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.denom\" value=\"50\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.div\" value=\"47\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.denom\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.div\" value=\"31\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.num\" value=\"0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_BYPASS.sel\" value=\"CCM_ANALOG.PLL5_POST_DIV\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_POST_DIV.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL7_BYPASS.sel\" value=\"CCM_ANALOG.PLL7\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.VIDEO_DIV.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_POWERDOWN_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG\" value=\"No\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"96c1cec6-3bd3-47a2-8301-f38e4b0dd25f\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"CAN\" uuid=\"eb0900eb-d552-4097-9dcf-a07e592a887f\" type=\"flexcan\" type_id=\"flexcan_ba45456ec815807245205237e2bf425b\" mode=\"interrupts\" peripheral=\"CAN2\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"interruptsCfg\">\n                        <setting name=\"messageBufferIrqs\" value=\"0\"/>\n                        <setting name=\"messageBufferIrqs2\" value=\"0\"/>\n                        <set name=\"interruptsEnable\">\n                           <selected/>\n                        </set>\n                        <setting name=\"enable_irq\" value=\"false\"/>\n                        <struct name=\"interrupt_shared\">\n                           <setting name=\"IRQn\" value=\"CAN2_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"fsl_flexcan\" quick_selection=\"default\">\n                        <struct name=\"can_config\">\n                           <setting name=\"clockSource\" value=\"kFLEXCAN_ClkSrcOsc\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate\" value=\"1000000\"/>\n                           <setting name=\"maxMbNum\" value=\"16\"/>\n                           <setting name=\"enableLoopBack\" value=\"false\"/>\n                           <setting name=\"enableSelfWakeup\" value=\"false\"/>\n                           <setting name=\"enableIndividMask\" value=\"false\"/>\n                           <struct name=\"timingConfig\">\n                              <setting name=\"propSeg\" value=\"2\"/>\n                              <setting name=\"phaseSeg1\" value=\"4\"/>\n                              <setting name=\"phaseSeg2\" value=\"3\"/>\n                              <setting name=\"rJumpwidth\" value=\"2\"/>\n                              <struct name=\"bitTime\"/>\n                           </struct>\n                        </struct>\n                        <setting name=\"enableRxFIFO\" value=\"false\"/>\n                        <struct name=\"rxFIFO\">\n                           <setting name=\"idFilterTable\" value=\"\"/>\n                           <setting name=\"idFilterNum\" value=\"num0\"/>\n                           <setting name=\"idFilterType\" value=\"kFLEXCAN_RxFifoFilterTypeA\"/>\n                           <setting name=\"priority\" value=\"kFLEXCAN_RxFifoPrioLow\"/>\n                        </struct>\n                        <array name=\"channels\">\n                           <struct name=\"0\">\n                              <setting name=\"mbID\" value=\"0\"/>\n                              <setting name=\"mbType\" value=\"mbRx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                           <struct name=\"1\">\n                              <setting name=\"mbID\" value=\"1\"/>\n                              <setting name=\"mbType\" value=\"mbTx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                        </array>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI\" uuid=\"f67d9a64-c26d-4421-9805-a062b24146f2\" type=\"csi\" type_id=\"csi_3739ec1355c7b915be929f3b7e35095b\" mode=\"interrupt\" peripheral=\"CSI\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_csi\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"clockConfig\">\n                           <setting name=\"clockSource\" value=\"BusInterfaceClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"masterClockSource\" value=\"CsiClock\"/>\n                           <setting name=\"masterClockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        </struct>\n                        <struct name=\"config\">\n                           <setting name=\"format\" value=\"RGB565\"/>\n                           <setting name=\"i_width\" value=\"320\"/>\n                           <setting name=\"i_height\" value=\"240\"/>\n                           <setting name=\"dataBus\" value=\"kCSI_DataBus8Bit\"/>\n                           <setting name=\"workMode\" value=\"kCSI_GatedClockMode\"/>\n                           <setting name=\"useExtVsync\" value=\"true\"/>\n                           <set name=\"polarityFlags\">\n                              <selected/>\n                           </set>\n                           <struct name=\"buffers_config\">\n                              <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                              <setting name=\"bufCount\" value=\"4\"/>\n                              <setting name=\"bufferAlign\" value=\"64\"/>\n                           </struct>\n                        </struct>\n                        <struct name=\"interruptsCfg\">\n                           <setting name=\"isInterruptEnabled\" value=\"false\"/>\n                           <set name=\"interruptSources\">\n                              <selected/>\n                           </set>\n                           <struct name=\"interrupt\">\n                              <setting name=\"IRQn\" value=\"CSI_IRQn\"/>\n                              <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                              <setting name=\"enable_priority\" value=\"false\"/>\n                              <setting name=\"priority\" value=\"0\"/>\n                              <setting name=\"enable_custom_name\" value=\"false\"/>\n                           </struct>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI_LPI2C\" uuid=\"f2c6cd0a-751c-4424-9248-a4d98da47de7\" type=\"lpi2c\" type_id=\"lpi2c_db68d4f4f06a22e25ab51fe9bd6db4d2\" mode=\"master\" peripheral=\"LPI2C1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"main\" quick_selection=\"qs_interrupt\">\n                        <setting name=\"clockSource\" value=\"Lpi2cClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LPI2C1_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"master\" quick_selection=\"qs_master_transfer\">\n                        <setting name=\"mode\" value=\"transfer\"/>\n                        <struct name=\"config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"enableDoze\" value=\"true\"/>\n                           <setting name=\"debugEnable\" value=\"false\"/>\n                           <setting name=\"ignoreAck\" value=\"false\"/>\n                           <setting name=\"pinConfig\" value=\"kLPI2C_2PinOpenDrain\"/>\n                           <setting name=\"baudRate_Hz\" value=\"100000\"/>\n                           <setting name=\"busIdleTimeout_ns\" value=\"0\"/>\n                           <setting name=\"pinLowTimeout_ns\" value=\"0\"/>\n                           <setting name=\"sdaGlitchFilterWidth_ns\" value=\"0\"/>\n                           <setting name=\"sclGlitchFilterWidth_ns\" value=\"0\"/>\n                           <struct name=\"hostRequest\">\n                              <setting name=\"enable\" value=\"false\"/>\n                              <setting name=\"source\" value=\"kLPI2C_HostRequestExternalPin\"/>\n                              <setting name=\"polarity\" value=\"kLPI2C_HostRequestPinActiveHigh\"/>\n                           </struct>\n                           <set name=\"edmaRequestSources\">\n                              <selected/>\n                           </set>\n                        </struct>\n                        <struct name=\"transfer\">\n                           <setting name=\"blocking\" value=\"false\"/>\n                           <setting name=\"enable_custom_handle\" value=\"false\"/>\n                           <struct name=\"callback\">\n                              <setting name=\"name\" value=\"\"/>\n                              <setting name=\"userData\" value=\"\"/>\n                           </struct>\n                           <set name=\"flags\">\n                              <selected/>\n                           </set>\n                           <setting name=\"slaveAddress\" value=\"0\"/>\n                           <setting name=\"direction\" value=\"kLPI2C_Write\"/>\n                           <setting name=\"subaddress\" value=\"0\"/>\n                           <setting name=\"subaddressSize\" value=\"1\"/>\n                           <setting name=\"blocking_buffer\" value=\"false\"/>\n                           <setting name=\"enable_custom_buffer\" value=\"false\"/>\n                           <setting name=\"dataSize\" value=\"1\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"01f250e2-83d7-4b7b-a98d-772d1c3bdb42\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"BOARD_BootClockRUN\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LCD\" uuid=\"90a0c31d-6042-4687-af0f-0892536bc1ba\" type=\"elcdif\" type_id=\"elcdif_1c39bcb43ed1a24bc8980672c7378576\" mode=\"rgbMode\" peripheral=\"LCDIF\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_elcdif\">\n                        <struct name=\"config\">\n                           <setting name=\"panelWidthInt\" value=\"480\"/>\n                           <setting name=\"panelHeightInt\" value=\"272\"/>\n                           <setting name=\"hsw\" value=\"41\"/>\n                           <setting name=\"hfp\" value=\"4\"/>\n                           <setting name=\"hbp\" value=\"8\"/>\n                           <setting name=\"vsw\" value=\"10\"/>\n                           <setting name=\"vfp\" value=\"4\"/>\n                           <setting name=\"vbp\" value=\"3\"/>\n                           <setting name=\"frameRate\" value=\"60 Hz\"/>\n                           <setting name=\"clockSource\" value=\"LcdIfClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <struct name=\"polarityFlags_st\">\n                              <setting name=\"vSyncActive\" value=\"kELCDIF_VsyncActiveLow\"/>\n                              <setting name=\"hSyncActive\" value=\"kELCDIF_HsyncActiveLow\"/>\n                              <setting name=\"dataEnableActive\" value=\"kELCDIF_DataEnableActiveLow\"/>\n                              <setting name=\"driveDataClkEdge\" value=\"kELCDIF_DriveDataOnFallingClkEdge\"/>\n                           </struct>\n                           <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                           <setting name=\"bufferAlign\" value=\"64\"/>\n                           <setting name=\"pixelFormat\" value=\"kELCDIF_PixelFormatRGB565\"/>\n                           <setting name=\"dataBus\" value=\"kELCDIF_DataBus16Bit\"/>\n                           <setting name=\"enablePxpHandShake\" value=\"false\"/>\n                           <setting name=\"start\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"isInterruptEnabled\" value=\"true\"/>\n                        <set name=\"elcdifInterruptSources\">\n                           <selected>\n                              <id>kELCDIF_CurFrameDoneInterruptEnable</id>\n                           </selected>\n                        </set>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LCDIF_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"b31fa225-2a52-486b-9c5c-33a184a2c716\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"aa3cc953-557b-4557-b7fe-6fedc31acf98\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"8b3f852e-ee1e-45e9-abff-0ff722f1d65d\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"539d282e-5136-4289-9058-9a46b221ca45\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"6e4c02c4-0524-4905-91b5-01d2e2502186\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"c6d8fd36-2bbd-44c6-a160-54e7e12d0807\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"7d3626d3-4536-4838-a35d-3b8cf5a2bd71\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"738ea8df-6176-4e52-b4c7-b88aa9c17d13\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/teensy40_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"teensy40_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\")))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock\n            .sflashPadType = kSerialFlash_4Pads,\n            .serialClkFreq = kFlexSpiSerialClk_100MHz,\n            .sflashA1Size  = 2u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 256u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_40/teensy40_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __TEENSY40_FLEXSPI_NOR_CONFIG__\n#define __TEENSY40_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_120MHz = 7,\n    kFlexSpiSerialClk_133MHz = 8,\n    kFlexSpiSerialClk_166MHz = 9,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/board/clock_config.c",
    "content": "/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.\n *\n * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.\n *\n * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.\n *\n * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.\n *\n * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.\n *\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v11.0\nprocessor: MIMXRT1062xxxxA\npackage_id: MIMXRT1062DVL6A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1060-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n#include \"clock_config.h\"\n#include \"fsl_iomuxc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: AHB_CLK_ROOT.outFreq, value: 600 MHz}\n- {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}\n- {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}\n- {id: CLK_1M.outFreq, value: 1 MHz}\n- {id: CLK_24M.outFreq, value: 24 MHz}\n- {id: CSI_CLK_ROOT.outFreq, value: 12 MHz}\n- {id: ENET2_125M_CLK.outFreq, value: 1.2 MHz}\n- {id: ENET_125M_CLK.outFreq, value: 2.4 MHz}\n- {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz}\n- {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXIO2_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: FLEXSPI2_CLK_ROOT.outFreq, value: 1440/11 MHz}\n- {id: FLEXSPI_CLK_ROOT.outFreq, value: 1440/11 MHz}\n- {id: GPT1_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: GPT2_ipg_clk_highfreq.outFreq, value: 75 MHz}\n- {id: IPG_CLK_ROOT.outFreq, value: 150 MHz}\n- {id: LCDIF_CLK_ROOT.outFreq, value: 67.5 MHz}\n- {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}\n- {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}\n- {id: LVDS1_CLK.outFreq, value: 1.2 GHz}\n- {id: MQS_MCLK.outFreq, value: 1080/17 MHz}\n- {id: PERCLK_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: PLL7_MAIN_CLK.outFreq, value: 480 MHz}\n- {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK2.outFreq, value: 1080/17 MHz}\n- {id: SAI1_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI2_MCLK3.outFreq, value: 30 MHz}\n- {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK1.outFreq, value: 1080/17 MHz}\n- {id: SAI3_MCLK3.outFreq, value: 30 MHz}\n- {id: SEMC_CLK_ROOT.outFreq, value: 75 MHz}\n- {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}\n- {id: TRACE_CLK_ROOT.outFreq, value: 132 MHz}\n- {id: UART_CLK_ROOT.outFreq, value: 80 MHz}\n- {id: USBPHY1_CLK.outFreq, value: 480 MHz}\n- {id: USBPHY2_CLK.outFreq, value: 480 MHz}\n- {id: USDHC1_CLK_ROOT.outFreq, value: 198 MHz}\n- {id: USDHC2_CLK_ROOT.outFreq, value: 198 MHz}\nsettings:\n- {id: CCM.AHB_PODF.scale, value: '1', locked: true}\n- {id: CCM.ARM_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI2_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI2_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.FLEXSPI_PODF.scale, value: '2', locked: true}\n- {id: CCM.FLEXSPI_SEL.sel, value: CCM_ANALOG.PLL3_PFD0_CLK}\n- {id: CCM.LCDIF_PODF.scale, value: '4', locked: true}\n- {id: CCM.LCDIF_PRED.scale, value: '2', locked: true}\n- {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}\n- {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}\n- {id: CCM.SEMC_PODF.scale, value: '8'}\n- {id: CCM.TRACE_CLK_SEL.sel, value: CCM_ANALOG.PLL2_MAIN_CLK}\n- {id: CCM.TRACE_PODF.scale, value: '4', locked: true}\n- {id: CCM_ANALOG.PLL1_BYPASS.sel, value: CCM_ANALOG.PLL1}\n- {id: CCM_ANALOG.PLL1_PREDIV.scale, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL1_VDIV.scale, value: '50', locked: true}\n- {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}\n- {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}\n- {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}\n- {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}\n- {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}\n- {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}\n- {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}\n- {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}\n- {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}\n- {id: CCM_ANALOG.PLL3_PFD0_DIV.scale, value: '33', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD0_MUL.scale, value: '18', locked: true}\n- {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}\n- {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}\n- {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}\n- {id: CCM_ANALOG.PLL4.denom, value: '50'}\n- {id: CCM_ANALOG.PLL4.div, value: '47'}\n- {id: CCM_ANALOG.PLL5.denom, value: '1'}\n- {id: CCM_ANALOG.PLL5.div, value: '31', locked: true}\n- {id: CCM_ANALOG.PLL5.num, value: '0'}\n- {id: CCM_ANALOG.PLL5_BYPASS.sel, value: CCM_ANALOG.PLL5_POST_DIV}\n- {id: CCM_ANALOG.PLL5_POST_DIV.scale, value: '2', locked: true}\n- {id: CCM_ANALOG.PLL7_BYPASS.sel, value: CCM_ANALOG.PLL7}\n- {id: CCM_ANALOG.VIDEO_DIV.scale, value: '4', locked: true}\n- {id: CCM_ANALOG_PLL_ENET_POWERDOWN_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG, value: Enabled}\n- {id: CCM_ANALOG_PLL_USB2_POWER_CFG, value: 'Yes'}\n- {id: CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG, value: 'No'}\nsources:\n- {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 100,                       /* PLL loop divider, Fout = Fin * 50 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 1,                         /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 0,                         /* PLL loop divider, Fout = Fin * 20 */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\nconst clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN =\n    {\n        .loopDivider = 31,                        /* PLL loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .postDivider = 8,                         /* Divider after PLL */\n        .numerator = 0,                           /* 30 bit numerator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .denominator = 1,                         /* 30 bit denominator of fractional loop divider, Fout = Fin * ( loopDivider + numerator / denominator ) */\n        .src = 0,                                 /* Bypass clock source, 0 - OSC 24M, 1 - CLK1_P and CLK1_N */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Init RTC OSC clock frequency. */\n    CLOCK_SetRtcXtalFreq(32768U);\n    /* Enable 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 |= XTALOSC24M_OSC_CONFIG2_ENABLE_1M_MASK;\n    /* Use free 1MHz clock output. */\n    XTALOSC24M->OSC_CONFIG2 &= ~XTALOSC24M_OSC_CONFIG2_MUX_1M_MASK;\n    /* Set XTAL 24MHz clock frequency. */\n    CLOCK_SetXtalFreq(24000000U);\n    /* Enable XTAL 24MHz clock source. */\n    CLOCK_InitExternalClk(0);\n    /* Enable internal RC. */\n    CLOCK_InitRcOsc24M();\n    /* Switch clock source to external OSC. */\n    CLOCK_SwitchOsc(kCLOCK_XtalOsc);\n    /* Set Oscillator ready counter value. */\n    CCM->CCR = (CCM->CCR & (~CCM_CCR_OSCNT_MASK)) | CCM_CCR_OSCNT(127);\n    /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 1); /* Set PERIPH_CLK2 MUX to OSC */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 1);     /* Set PERIPH_CLK MUX to PERIPH_CLK2 */\n    /* Setting the VDD_SOC to 1.275V. It is necessary to config AHB to 600Mhz. */\n    DCDC->REG3 = (DCDC->REG3 & (~DCDC_REG3_TRG_MASK)) | DCDC_REG3_TRG(0x13);\n    /* Waiting for DCDC_STS_DC_OK bit is asserted */\n    while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC->REG0))\n    {\n    }\n    /* Set AHB_PODF. */\n    CLOCK_SetDiv(kCLOCK_AhbDiv, 0);\n    /* Disable IPG clock gate. */\n    CLOCK_DisableClock(kCLOCK_Adc1);\n    CLOCK_DisableClock(kCLOCK_Adc2);\n    CLOCK_DisableClock(kCLOCK_Xbar1);\n    CLOCK_DisableClock(kCLOCK_Xbar2);\n    CLOCK_DisableClock(kCLOCK_Xbar3);\n    /* Set IPG_PODF. */\n    CLOCK_SetDiv(kCLOCK_IpgDiv, 3);\n    /* Set ARM_PODF. */\n    CLOCK_SetDiv(kCLOCK_ArmDiv, 1);\n    /* Set PERIPH_CLK2_PODF. */\n    CLOCK_SetDiv(kCLOCK_PeriphClk2Div, 0);\n    /* Disable PERCLK clock gate. */\n    CLOCK_DisableClock(kCLOCK_Gpt1);\n    CLOCK_DisableClock(kCLOCK_Gpt1S);\n    CLOCK_DisableClock(kCLOCK_Gpt2);\n    CLOCK_DisableClock(kCLOCK_Gpt2S);\n    CLOCK_DisableClock(kCLOCK_Pit);\n    /* Set PERCLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_PerclkDiv, 1);\n    /* Disable USDHC1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc1);\n    /* Set USDHC1_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc1Div, 1);\n    /* Set Usdhc1 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc1Mux, 0);\n    /* Disable USDHC2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Usdhc2);\n    /* Set USDHC2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Usdhc2Div, 1);\n    /* Set Usdhc2 clock source. */\n    CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n    /* Disable Semc clock gate. */\n    CLOCK_DisableClock(kCLOCK_Semc);\n    /* Set SEMC_PODF. */\n    CLOCK_SetDiv(kCLOCK_SemcDiv, 7);\n    /* Set Semc alt clock source. */\n    CLOCK_SetMux(kCLOCK_SemcAltMux, 0);\n    /* Set Semc clock source. */\n    CLOCK_SetMux(kCLOCK_SemcMux, 0);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Disable Flexspi clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi);\n    /* Set FLEXSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_FlexspiDiv, 1);\n    /* Set Flexspi clock source. */\n    CLOCK_SetMux(kCLOCK_FlexspiMux, 3);\n#endif\n    /* Disable Flexspi2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_FlexSpi2);\n    /* Set FLEXSPI2_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexspi2Div, 1);\n    /* Set Flexspi2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexspi2Mux, 1);\n    /* Disable CSI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Csi);\n    /* Set CSI_PODF. */\n    CLOCK_SetDiv(kCLOCK_CsiDiv, 1);\n    /* Set Csi clock source. */\n    CLOCK_SetMux(kCLOCK_CsiMux, 0);\n    /* Disable LPSPI clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpspi1);\n    CLOCK_DisableClock(kCLOCK_Lpspi2);\n    CLOCK_DisableClock(kCLOCK_Lpspi3);\n    CLOCK_DisableClock(kCLOCK_Lpspi4);\n    /* Set LPSPI_PODF. */\n    CLOCK_SetDiv(kCLOCK_LpspiDiv, 4);\n    /* Set Lpspi clock source. */\n    CLOCK_SetMux(kCLOCK_LpspiMux, 2);\n    /* Disable TRACE clock gate. */\n    CLOCK_DisableClock(kCLOCK_Trace);\n    /* Set TRACE_PODF. */\n    CLOCK_SetDiv(kCLOCK_TraceDiv, 3);\n    /* Set Trace clock source. */\n    CLOCK_SetMux(kCLOCK_TraceMux, 0);\n    /* Disable SAI1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai1);\n    /* Set SAI1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai1PreDiv, 3);\n    /* Set SAI1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai1Div, 1);\n    /* Set Sai1 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai1Mux, 0);\n    /* Disable SAI2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai2);\n    /* Set SAI2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai2PreDiv, 3);\n    /* Set SAI2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai2Div, 1);\n    /* Set Sai2 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai2Mux, 0);\n    /* Disable SAI3 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Sai3);\n    /* Set SAI3_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Sai3PreDiv, 3);\n    /* Set SAI3_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Sai3Div, 1);\n    /* Set Sai3 clock source. */\n    CLOCK_SetMux(kCLOCK_Sai3Mux, 0);\n    /* Disable Lpi2c clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpi2c1);\n    CLOCK_DisableClock(kCLOCK_Lpi2c2);\n    CLOCK_DisableClock(kCLOCK_Lpi2c3);\n    /* Set LPI2C_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Lpi2cDiv, 0);\n    /* Set Lpi2c clock source. */\n    CLOCK_SetMux(kCLOCK_Lpi2cMux, 0);\n    /* Disable CAN clock gate. */\n    CLOCK_DisableClock(kCLOCK_Can1);\n    CLOCK_DisableClock(kCLOCK_Can2);\n    CLOCK_DisableClock(kCLOCK_Can3);\n    CLOCK_DisableClock(kCLOCK_Can1S);\n    CLOCK_DisableClock(kCLOCK_Can2S);\n    CLOCK_DisableClock(kCLOCK_Can3S);\n    /* Set CAN_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_CanDiv, 1);\n    /* Set Can clock source. */\n    CLOCK_SetMux(kCLOCK_CanMux, 2);\n    /* Disable UART clock gate. */\n    CLOCK_DisableClock(kCLOCK_Lpuart1);\n    CLOCK_DisableClock(kCLOCK_Lpuart2);\n    CLOCK_DisableClock(kCLOCK_Lpuart3);\n    CLOCK_DisableClock(kCLOCK_Lpuart4);\n    CLOCK_DisableClock(kCLOCK_Lpuart5);\n    CLOCK_DisableClock(kCLOCK_Lpuart6);\n    CLOCK_DisableClock(kCLOCK_Lpuart7);\n    CLOCK_DisableClock(kCLOCK_Lpuart8);\n    /* Set UART_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_UartDiv, 0);\n    /* Set Uart clock source. */\n    CLOCK_SetMux(kCLOCK_UartMux, 0);\n    /* Disable LCDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_LcdPixel);\n    /* Set LCDIF_PRED. */\n    CLOCK_SetDiv(kCLOCK_LcdifPreDiv, 1);\n    /* Set LCDIF_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_LcdifDiv, 3);\n    /* Set Lcdif pre clock source. */\n    CLOCK_SetMux(kCLOCK_LcdifPreMux, 5);\n    /* Disable SPDIF clock gate. */\n    CLOCK_DisableClock(kCLOCK_Spdif);\n    /* Set SPDIF0_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Spdif0PreDiv, 1);\n    /* Set SPDIF0_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Spdif0Div, 7);\n    /* Set Spdif clock source. */\n    CLOCK_SetMux(kCLOCK_SpdifMux, 3);\n    /* Disable Flexio1 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio1);\n    /* Set FLEXIO1_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio1PreDiv, 1);\n    /* Set FLEXIO1_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio1Div, 7);\n    /* Set Flexio1 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio1Mux, 3);\n    /* Disable Flexio2 clock gate. */\n    CLOCK_DisableClock(kCLOCK_Flexio2);\n    /* Set FLEXIO2_CLK_PRED. */\n    CLOCK_SetDiv(kCLOCK_Flexio2PreDiv, 1);\n    /* Set FLEXIO2_CLK_PODF. */\n    CLOCK_SetDiv(kCLOCK_Flexio2Div, 7);\n    /* Set Flexio2 clock source. */\n    CLOCK_SetMux(kCLOCK_Flexio2Mux, 3);\n    /* Set Pll3 sw clock source. */\n    CLOCK_SetMux(kCLOCK_Pll3SwMux, 0);\n    /* Init ARM PLL. */\n    CLOCK_InitArmPll(&armPllConfig_BOARD_BootClockRUN);\n    /* In SDK projects, SDRAM (configured by SEMC) will be initialized in either debug script or dcd.\n     * With this macro SKIP_SYSCLK_INIT, system pll (selected to be SEMC source clock in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for SEMC, user may want to avoid changing that clock as well.*/\n#ifndef SKIP_SYSCLK_INIT\n#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)\n    #warning \"SKIP_SYSCLK_INIT should be defined to keep system pll (selected to be SEMC source clock in SDK projects) unchanged.\"\n#endif\n    /* Init System PLL. */\n    CLOCK_InitSysPll(&sysPllConfig_BOARD_BootClockRUN);\n    /* Init System pfd0. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd0, 27);\n    /* Init System pfd1. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd1, 16);\n    /* Init System pfd2. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd2, 24);\n    /* Init System pfd3. */\n    CLOCK_InitSysPfd(kCLOCK_Pfd3, 16);\n#endif\n    /* In SDK projects, external flash (configured by FLEXSPI) will be initialized by dcd.\n     * With this macro XIP_EXTERNAL_FLASH, usb1 pll (selected to be FLEXSPI clock source in SDK projects) will be left unchanged.\n     * Note: If another clock source is selected for FLEXSPI, user may want to avoid changing that clock as well.*/\n#if !(defined(XIP_EXTERNAL_FLASH) && (XIP_EXTERNAL_FLASH == 1))\n    /* Init Usb1 PLL. */\n    CLOCK_InitUsb1Pll(&usb1PllConfig_BOARD_BootClockRUN);\n    /* Init Usb1 pfd0. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd0, 33);\n    /* Init Usb1 pfd1. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd1, 16);\n    /* Init Usb1 pfd2. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd2, 17);\n    /* Init Usb1 pfd3. */\n    CLOCK_InitUsb1Pfd(kCLOCK_Pfd3, 19);\n#endif\n    /* DeInit Audio PLL. */\n    CLOCK_DeinitAudioPll();\n    /* Bypass Audio PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllAudio, 1);\n    /* Set divider for Audio PLL. */\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_LSB_MASK;\n    CCM_ANALOG->MISC2 &= ~CCM_ANALOG_MISC2_AUDIO_DIV_MSB_MASK;\n    /* Enable Audio PLL output. */\n    CCM_ANALOG->PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK;\n    /* Init Video PLL. */\n    uint32_t pllVideo;\n    /* Disable Video PLL output before initial Video PLL. */\n    CCM_ANALOG->PLL_VIDEO &= ~CCM_ANALOG_PLL_VIDEO_ENABLE_MASK;\n    /* Bypass PLL first */\n    CCM_ANALOG->PLL_VIDEO = (CCM_ANALOG->PLL_VIDEO & (~CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC_MASK)) |\n                            CCM_ANALOG_PLL_VIDEO_BYPASS_MASK | CCM_ANALOG_PLL_VIDEO_BYPASS_CLK_SRC(0);\n    CCM_ANALOG->PLL_VIDEO_NUM = CCM_ANALOG_PLL_VIDEO_NUM_A(0);\n    CCM_ANALOG->PLL_VIDEO_DENOM = CCM_ANALOG_PLL_VIDEO_DENOM_B(1);\n    pllVideo = (CCM_ANALOG->PLL_VIDEO & (~(CCM_ANALOG_PLL_VIDEO_DIV_SELECT_MASK | CCM_ANALOG_PLL_VIDEO_POWERDOWN_MASK))) |\n               CCM_ANALOG_PLL_VIDEO_ENABLE_MASK |CCM_ANALOG_PLL_VIDEO_DIV_SELECT(31);\n    pllVideo |= CCM_ANALOG_PLL_VIDEO_POST_DIV_SELECT(1);\n    CCM_ANALOG->MISC2 = (CCM_ANALOG->MISC2 & (~CCM_ANALOG_MISC2_VIDEO_DIV_MASK)) | CCM_ANALOG_MISC2_VIDEO_DIV(3);\n    CCM_ANALOG->PLL_VIDEO = pllVideo;\n    while ((CCM_ANALOG->PLL_VIDEO & CCM_ANALOG_PLL_VIDEO_LOCK_MASK) == 0)\n    {\n    }\n    /* Disable bypass for Video PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllVideo, 0);\n    /* DeInit Enet PLL. */\n    CLOCK_DeinitEnetPll();\n    /* Bypass Enet PLL. */\n    CLOCK_SetPllBypass(CCM_ANALOG, kCLOCK_PllEnet, 1);\n    /* Set Enet output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_DIV_SELECT(1);\n    /* Enable Enet output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENABLE_MASK;\n    /* Set Enet2 output divider. */\n    CCM_ANALOG->PLL_ENET = (CCM_ANALOG->PLL_ENET & (~CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT_MASK)) | CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT(0);\n    /* Enable Enet2 output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET2_REF_EN_MASK;\n    /* Enable Enet25M output. */\n    CCM_ANALOG->PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK;\n    /* Init Usb2 PLL. */\n    CLOCK_InitUsb2Pll(&usb2PllConfig_BOARD_BootClockRUN);\n    /* Set preperiph clock source. */\n    CLOCK_SetMux(kCLOCK_PrePeriphMux, 3);\n    /* Set periph clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphMux, 0);\n    /* Set periph clock2 clock source. */\n    CLOCK_SetMux(kCLOCK_PeriphClk2Mux, 0);\n    /* Set per clock source. */\n    CLOCK_SetMux(kCLOCK_PerclkMux, 0);\n    /* Set lvds1 clock source. */\n    CCM_ANALOG->MISC1 = (CCM_ANALOG->MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK)) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL(0);\n    /* Set clock out1 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_DIV_MASK)) | CCM_CCOSR_CLKO1_DIV(0);\n    /* Set clock out1 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO1_SEL_MASK)) | CCM_CCOSR_CLKO1_SEL(1);\n    /* Set clock out2 divider. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_DIV_MASK)) | CCM_CCOSR_CLKO2_DIV(0);\n    /* Set clock out2 source. */\n    CCM->CCOSR = (CCM->CCOSR & (~CCM_CCOSR_CLKO2_SEL_MASK)) | CCM_CCOSR_CLKO2_SEL(18);\n    /* Set clock out1 drives clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLK_OUT_SEL_MASK;\n    /* Disable clock out1. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO1_EN_MASK;\n    /* Disable clock out2. */\n    CCM->CCOSR &= ~CCM_CCOSR_CLKO2_EN_MASK;\n    /* Set SAI1 MCLK1 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk1Sel, 0);\n    /* Set SAI1 MCLK2 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk2Sel, 0);\n    /* Set SAI1 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI1MClk3Sel, 0);\n    /* Set SAI2 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI2MClk3Sel, 0);\n    /* Set SAI3 MCLK3 clock source. */\n    IOMUXC_SetSaiMClkClockSource(IOMUXC_GPR, kIOMUXC_GPR_SAI3MClk3Sel, 0);\n    /* Set MQS configuration. */\n    IOMUXC_MQSConfig(IOMUXC_GPR,kIOMUXC_MqsPwmOverSampleRate32, 0);\n    /* Set ENET Ref clock source. */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR_MASK;\n    /* Set ENET2 Ref clock source. */\n    IOMUXC_GPR->GPR1 &= ~IOMUXC_GPR_GPR1_ENET2_TX_CLK_DIR_MASK;\n    /* Set GPT1 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT1_MASK;\n    /* Set GPT2 High frequency reference clock source. */\n    IOMUXC_GPR->GPR5 &= ~IOMUXC_GPR_GPR5_VREF_1M_CLK_GPT2_MASK;\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/board/clock_config.h",
    "content": "#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal0 frequency in Hz */\n\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32k frequency in Hz */\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             600000000U  /*!< Core clock frequency: 600000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AHB_CLK_ROOT               600000000UL\n#define BOARD_BOOTCLOCKRUN_CAN_CLK_ROOT               40000000UL\n#define BOARD_BOOTCLOCKRUN_CKIL_SYNC_CLK_ROOT         32768UL\n#define BOARD_BOOTCLOCKRUN_CLKO1_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLKO2_CLK                  0UL\n#define BOARD_BOOTCLOCKRUN_CLK_1M                     1000000UL\n#define BOARD_BOOTCLOCKRUN_CLK_24M                    24000000UL\n#define BOARD_BOOTCLOCKRUN_CSI_CLK_ROOT               12000000UL\n#define BOARD_BOOTCLOCKRUN_ENET2_125M_CLK             1200000UL\n#define BOARD_BOOTCLOCKRUN_ENET2_REF_CLK              0UL\n#define BOARD_BOOTCLOCKRUN_ENET2_TX_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_125M_CLK              2400000UL\n#define BOARD_BOOTCLOCKRUN_ENET_25M_REF_CLK           1200000UL\n#define BOARD_BOOTCLOCKRUN_ENET_REF_CLK               0UL\n#define BOARD_BOOTCLOCKRUN_ENET_TX_CLK                0UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO1_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXIO2_CLK_ROOT           30000000UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI2_CLK_ROOT          130909090UL\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_CLK_ROOT           130909090UL\n#define BOARD_BOOTCLOCKRUN_GPT1_IPG_CLK_HIGHFREQ      75000000UL\n#define BOARD_BOOTCLOCKRUN_GPT2_IPG_CLK_HIGHFREQ      75000000UL\n#define BOARD_BOOTCLOCKRUN_IPG_CLK_ROOT               150000000UL\n#define BOARD_BOOTCLOCKRUN_LCDIF_CLK_ROOT             67500000UL\n#define BOARD_BOOTCLOCKRUN_LPI2C_CLK_ROOT             60000000UL\n#define BOARD_BOOTCLOCKRUN_LPSPI_CLK_ROOT             105600000UL\n#define BOARD_BOOTCLOCKRUN_LVDS1_CLK                  1200000000UL\n#define BOARD_BOOTCLOCKRUN_MQS_MCLK                   63529411UL\n#define BOARD_BOOTCLOCKRUN_PERCLK_CLK_ROOT            75000000UL\n#define BOARD_BOOTCLOCKRUN_PLL7_MAIN_CLK              480000000UL\n#define BOARD_BOOTCLOCKRUN_SAI1_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK2                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI1_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI2_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI2_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SAI3_CLK_ROOT              63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK1                 63529411UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK2                 0UL\n#define BOARD_BOOTCLOCKRUN_SAI3_MCLK3                 30000000UL\n#define BOARD_BOOTCLOCKRUN_SEMC_CLK_ROOT              75000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_CLK_ROOT            30000000UL\n#define BOARD_BOOTCLOCKRUN_SPDIF0_EXTCLK_OUT          0UL\n#define BOARD_BOOTCLOCKRUN_TRACE_CLK_ROOT             132000000UL\n#define BOARD_BOOTCLOCKRUN_UART_CLK_ROOT              80000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY1_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USBPHY2_CLK                480000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC1_CLK_ROOT            198000000UL\n#define BOARD_BOOTCLOCKRUN_USDHC2_CLK_ROOT            198000000UL\n\n/*! @brief Arm PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN;\n/*! @brief Usb1 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN;\n/*! @brief Usb2 PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_usb_pll_config_t usb2PllConfig_BOARD_BootClockRUN;\n/*! @brief Sys PLL for BOARD_BootClockRUN configuration.\n */\nextern const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN;\n/*! @brief Video PLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_video_pll_config_t videoPllConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v13.1\nprocessor: MIMXRT1062xxxxA\npackage_id: MIMXRT1062DVL6A\nmcu_data: ksdk2_0\nprocessor_version: 13.0.2\nboard: MIMXRT1060-EVK\npin_labels:\n- {pin_num: E7, pin_signal: GPIO_B0_01, label: LCDIF_ENABLE, identifier: USER_BUTTON}\n- {pin_num: D8, pin_signal: GPIO_B0_03, label: LCDIF_VSYNC, identifier: USER_LED}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n#include \"fsl_common.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void) {\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n}\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: D8, peripheral: GPIO2, signal: 'gpio_io, 03', pin_signal: GPIO_B0_03, direction: OUTPUT}\n  - {pin_num: E7, peripheral: GPIO2, signal: 'gpio_io, 01', pin_signal: GPIO_B0_01, direction: INPUT, pull_up_down_config: Pull_Up_100K_Ohm, pull_keeper_select: Pull}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  /* GPIO configuration of USER_BUTTON on GPIO_B0_01 (pin E7) */\n  gpio_pin_config_t USER_BUTTON_config = {\n      .direction = kGPIO_DigitalInput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_B0_01 (pin E7) */\n  GPIO_PinInit(GPIO2, 1U, &USER_BUTTON_config);\n\n  /* GPIO configuration of USER_LED on GPIO_B0_03 (pin D8) */\n  gpio_pin_config_t USER_LED_config = {\n      .direction = kGPIO_DigitalOutput,\n      .outputLogic = 0U,\n      .interruptMode = kGPIO_NoIntmode\n  };\n  /* Initialize GPIO functionality on GPIO_B0_03 (pin D8) */\n  GPIO_PinInit(GPIO2, 3U, &USER_LED_config);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_01_GPIO2_IO01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B0_03_GPIO2_IO03, 0U);\n  IOMUXC_GPR->GPR27 = ((IOMUXC_GPR->GPR27 &\n    (~(BOARD_INITPINS_IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL_MASK)))\n      | IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL(0x00U)\n    );\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_B0_01_GPIO2_IO01, 0xB0B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: K14, peripheral: LPUART1, signal: TX, pin_signal: GPIO_AD_B0_12, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n  - {pin_num: L14, peripheral: LPUART1, signal: RX, pin_signal: GPIO_AD_B0_13, software_input_on: Disable, hysteresis_enable: Disable, pull_up_down_config: Pull_Down_100K_Ohm,\n    pull_keeper_select: Keeper, pull_keeper_enable: Enable, open_drain: Disable, speed: MHZ_100, drive_strength: R0_6, slew_rate: Slow}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_12_LPUART1_TX, 0x10B0U);\n  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_13_LPUART1_RX, 0x10B0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSDHCPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: J2, peripheral: USDHC1, signal: 'usdhc_data, 3', pin_signal: GPIO_SD_B0_05}\n  - {pin_num: H2, peripheral: USDHC1, signal: 'usdhc_data, 2', pin_signal: GPIO_SD_B0_04}\n  - {pin_num: K1, peripheral: USDHC1, signal: 'usdhc_data, 1', pin_signal: GPIO_SD_B0_03}\n  - {pin_num: J1, peripheral: USDHC1, signal: 'usdhc_data, 0', pin_signal: GPIO_SD_B0_02}\n  - {pin_num: J4, peripheral: USDHC1, signal: usdhc_cmd, pin_signal: GPIO_SD_B0_00}\n  - {pin_num: J3, peripheral: USDHC1, signal: usdhc_clk, pin_signal: GPIO_SD_B0_01}\n  - {pin_num: C14, peripheral: USDHC1, signal: usdhc_vselect, pin_signal: GPIO_B1_14}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSDHCPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitUSDHCPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_B1_14_USDHC1_VSELECT, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, 0U);\n}\n\n\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitQSPIPins:\n- options: {callFromInitBoot: 'false', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: P3, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA0, pin_signal: GPIO_SD_B1_08}\n  - {pin_num: N4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA1, pin_signal: GPIO_SD_B1_09}\n  - {pin_num: P4, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA2, pin_signal: GPIO_SD_B1_10}\n  - {pin_num: P5, peripheral: FLEXSPI, signal: FLEXSPI_A_DATA3, pin_signal: GPIO_SD_B1_11}\n  - {pin_num: L4, peripheral: FLEXSPI, signal: FLEXSPI_A_SCLK, pin_signal: GPIO_SD_B1_07}\n  - {pin_num: L3, peripheral: FLEXSPI, signal: FLEXSPI_A_SS0_B, pin_signal: GPIO_SD_B1_06}\n  - {pin_num: N3, peripheral: FLEXSPI, signal: FLEXSPI_A_DQS, pin_signal: GPIO_SD_B1_05}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitQSPIPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitQSPIPins(void) {\n  CLOCK_EnableClock(kCLOCK_Iomuxc);\n\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_05_FLEXSPIA_DQS, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_FLEXSPIA_SS0_B, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_FLEXSPIA_SCLK, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_FLEXSPIA_DATA00, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_FLEXSPIA_DATA01, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_10_FLEXSPIA_DATA02, 0U);\n  IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_11_FLEXSPIA_DATA03, 0U);\n}\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n  kPIN_MUX_DirectionInput = 0U,         /* Input direction */\n  kPIN_MUX_DirectionOutput = 1U,        /* Output direction */\n  kPIN_MUX_DirectionInputOrOutput = 2U  /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define BOARD_INITPINS_IOMUXC_GPR_GPR27_GPIO_MUX2_GPIO_SEL_MASK 0x0AU /*!< GPIO2 and GPIO7 share same IO MUX function, GPIO_MUX2 selects one GPIO function: affected bits mask */\n\n/* GPIO_B0_03 (coord D8), LCDIF_VSYNC */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_LED_PERIPHERAL                                 GPIO2   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_LED_SIGNAL                                   gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_LED_CHANNEL                                       3U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_LED_GPIO                                       GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN                                      3U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_LED_GPIO_PIN_MASK                         (1U << 3U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_LED_PORT                                       GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_LED_PIN                                           3U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_LED_PIN_MASK                              (1U << 3U)   /*!< PORT pin mask */\n\n/* GPIO_B0_01 (coord E7), LCDIF_ENABLE */\n/* Routed pin properties */\n#define BOARD_INITPINS_USER_BUTTON_PERIPHERAL                              GPIO2   /*!< Peripheral name */\n#define BOARD_INITPINS_USER_BUTTON_SIGNAL                                gpio_io   /*!< Signal name */\n#define BOARD_INITPINS_USER_BUTTON_CHANNEL                                    1U   /*!< Signal channel */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITPINS_USER_BUTTON_GPIO                                    GPIO2   /*!< GPIO peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN                                   1U   /*!< GPIO pin number */\n#define BOARD_INITPINS_USER_BUTTON_GPIO_PIN_MASK                      (1U << 1U)   /*!< GPIO pin mask */\n#define BOARD_INITPINS_USER_BUTTON_PORT                                    GPIO2   /*!< PORT peripheral base pointer */\n#define BOARD_INITPINS_USER_BUTTON_PIN                                        1U   /*!< PORT pin number */\n#define BOARD_INITPINS_USER_BUTTON_PIN_MASK                           (1U << 1U)   /*!< PORT pin mask */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/* GPIO_AD_B0_12 (coord K14), UART1_TXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_TXD_SIGNAL                             TX   /*!< Signal name */\n\n/* GPIO_AD_B0_13 (coord L14), UART1_RXD */\n/* Routed pin properties */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_PERIPHERAL                    LPUART1   /*!< Peripheral name */\n#define BOARD_INITDEBUG_UARTPINS_UART1_RXD_SIGNAL                             RX   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n/* GPIO_SD_B0_05 (coord J2), SD1_D3 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D3_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D3_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D3_CHANNEL                                    3U   /*!< Signal channel */\n\n/* GPIO_SD_B0_04 (coord H2), SD1_D2 */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D2_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D2_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D2_CHANNEL                                    2U   /*!< Signal channel */\n\n/* GPIO_SD_B0_03 (coord K1), SD1_D1/J24[5]/SPI_MISO */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D1_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D1_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D1_CHANNEL                                    1U   /*!< Signal channel */\n\n/* GPIO_SD_B0_02 (coord J1), SD1_D0/J24[4]/SPI_MOSI/PWM */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_D0_PERIPHERAL                             USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_D0_SIGNAL                             usdhc_data   /*!< Signal name */\n#define BOARD_INITUSDHCPINS_SD1_D0_CHANNEL                                    0U   /*!< Signal channel */\n\n/* GPIO_SD_B0_00 (coord J4), SD1_CMD/J24[6] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CMD_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CMD_SIGNAL                             usdhc_cmd   /*!< Signal name */\n\n/* GPIO_SD_B0_01 (coord J3), SD1_CLK/J24[3] */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD1_CLK_PERIPHERAL                            USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD1_CLK_SIGNAL                             usdhc_clk   /*!< Signal name */\n\n/* GPIO_B1_14 (coord C14), SD0_VSELECT */\n/* Routed pin properties */\n#define BOARD_INITUSDHCPINS_SD0_VSELECT_PERIPHERAL                        USDHC1   /*!< Peripheral name */\n#define BOARD_INITUSDHCPINS_SD0_VSELECT_SIGNAL                     usdhc_vselect   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSDHCPins(void);\n\n/* GPIO_SD_B1_08 (coord P3), FlexSPI_D0_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D0_A_SIGNAL                   FLEXSPI_A_DATA0   /*!< Signal name */\n\n/* GPIO_SD_B1_09 (coord N4), FlexSPI_D1_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D1_A_SIGNAL                   FLEXSPI_A_DATA1   /*!< Signal name */\n\n/* GPIO_SD_B1_10 (coord P4), FlexSPI_D2_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D2_A_SIGNAL                   FLEXSPI_A_DATA2   /*!< Signal name */\n\n/* GPIO_SD_B1_11 (coord P5), FlexSPI_D3_A */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_PERIPHERAL                       FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_D3_A_SIGNAL                   FLEXSPI_A_DATA3   /*!< Signal name */\n\n/* GPIO_SD_B1_07 (coord L4), FlexSPI_CLK */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_CLK_SIGNAL                     FLEXSPI_A_SCLK   /*!< Signal name */\n\n/* GPIO_SD_B1_06 (coord L3), FlexSPI_SS0 */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_SS0_SIGNAL                    FLEXSPI_A_SS0_B   /*!< Signal name */\n\n/* GPIO_SD_B1_05 (coord N3), FlexSPI_DQS */\n/* Routed pin properties */\n#define BOARD_INITQSPIPINS_FlexSPI_DQS_PERIPHERAL                        FLEXSPI   /*!< Peripheral name */\n#define BOARD_INITQSPIPINS_FlexSPI_DQS_SIGNAL                      FLEXSPI_A_DQS   /*!< Signal name */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitQSPIPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/board.cmake",
    "content": "set(MCU_FAMILY RT1060)\nset(MCU_VARIANT MIMXRT1062)\n\nset(JLINK_DEVICE MIMXRT1062xxx6A)\nset(PYOCD_TARGET mimxrt1060)\nset(NXPLINK_DEVICE MIMXRT1062xxxxA:EVK-MIMXRT1060)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/teensy41_flexspi_nor_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MIMXRT1062DVL6A\n    BOARD_TUD_RHPORT=0\n    BOARD_TUH_RHPORT=1\n    )\nendfunction()\n\n# flash by using teensy_loader_cli https://github.com/PaulStoffregen/teensy_loader_cli\n# Make sure it is in your PATH\n# flash: $(BUILD)/$(PROJECT).hex\n# teensy_loader_cli --mcu=imxrt1062 -v -w $<\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Teensy 4.1\n   url: https://www.pjrc.com/store/teensy41.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n// required since iMXRT MCUX-SDK include this file for board size\n#define BOARD_FLASH_SIZE (8 * 1024 * 1024)\n\n// LED D13: IOMUXC_GPIO_B0_03_GPIO2_IO03\n#define LED_PORT              BOARD_INITPINS_USER_LED_PERIPHERAL\n#define LED_PIN               BOARD_INITPINS_USER_LED_CHANNEL\n#define LED_STATE_ON          0\n\n// no button D12: IOMUXC_GPIO_B0_01_GPIO2_IO01\n#define BUTTON_PORT           BOARD_INITPINS_USER_BUTTON_PERIPHERAL\n#define BUTTON_PIN            BOARD_INITPINS_USER_BUTTON_CHANNEL\n#define BUTTON_STATE_ACTIVE   0\n\n// UART D0, D1: IOMUXC_GPIO_AD_B0_03_LPUART6_RX, IOMUXC_GPIO_AD_B0_02_LPUART6_TX\n#define UART_PORT             LPUART6\n#define UART_CLK_ROOT         BOARD_BOOTCLOCKRUN_UART_CLK_ROOT\n\nstatic inline void BOARD_ConfigMPU(void) {\n}\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/board.mk",
    "content": "CFLAGS += -DCPU_MIMXRT1062DVL6A\nMCU_FAMILY = RT1060\nMCU_VARIANT = MIMXRT1062\n\n# For flash-jlink target\nJLINK_DEVICE = MIMXRT1062xxx6A\n\n# flash by using teensy_loader_cli https://github.com/PaulStoffregen/teensy_loader_cli\n# Make sure it is in your PATH\nflash: $(BUILD)/$(PROJECT).hex\n\tteensy_loader_cli --mcu=imxrt1062 -v -w $<\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/teensy41.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MIMXRT1060-EVK\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13 http://mcuxpresso.nxp.com/XSD/mex_configuration_13.xsd\" uuid=\"2174caba-38fe-48d5-8f89-42a23354d23b\" version=\"13\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MIMXRT1062xxxxA</processor>\n      <package>MIMXRT1062DVL6A</package>\n      <board>MIMXRT1060-EVK</board>\n      <board_revision>A2</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M7F\" id=\"core0\" description=\"M7 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>false</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"13.1\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>13.0.2</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"E7\" pin_signal=\"GPIO_B0_01\" label=\"LCDIF_ENABLE\" identifier=\"USER_BUTTON\"/>\n               <pin_label pin_num=\"D8\" pin_signal=\"GPIO_B0_03\" label=\"LCDIF_VSYNC\" identifier=\"USER_LED\"/>\n            </pin_labels>\n            <power_domains/>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"GPIO2\" description=\"Peripheral GPIO2 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.igpio\" description=\"Pins initialization requires the IGPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 03\" pin_num=\"D8\" pin_signal=\"GPIO_B0_03\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO2\" signal=\"gpio_io, 01\" pin_num=\"E7\" pin_signal=\"GPIO_B0_01\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Up_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Pull\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART1\" description=\"Peripheral LPUART1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART1\" signal=\"TX\" pin_num=\"K14\" pin_signal=\"GPIO_AD_B0_12\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART1\" signal=\"RX\" pin_num=\"L14\" pin_signal=\"GPIO_AD_B0_13\">\n                     <pin_features>\n                        <pin_feature name=\"software_input_on\" value=\"Disable\"/>\n                        <pin_feature name=\"hysteresis_enable\" value=\"Disable\"/>\n                        <pin_feature name=\"pull_up_down_config\" value=\"Pull_Down_100K_Ohm\"/>\n                        <pin_feature name=\"pull_keeper_select\" value=\"Keeper\"/>\n                        <pin_feature name=\"pull_keeper_enable\" value=\"Enable\"/>\n                        <pin_feature name=\"open_drain\" value=\"Disable\"/>\n                        <pin_feature name=\"speed\" value=\"MHZ_100\"/>\n                        <pin_feature name=\"drive_strength\" value=\"R0_6\"/>\n                        <pin_feature name=\"slew_rate\" value=\"Slow\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSDHCPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USDHC1\" description=\"Peripheral USDHC1 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSDHCPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 3\" pin_num=\"J2\" pin_signal=\"GPIO_SD_B0_05\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 2\" pin_num=\"H2\" pin_signal=\"GPIO_SD_B0_04\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 1\" pin_num=\"K1\" pin_signal=\"GPIO_SD_B0_03\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_data, 0\" pin_num=\"J1\" pin_signal=\"GPIO_SD_B0_02\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_cmd\" pin_num=\"J4\" pin_signal=\"GPIO_SD_B0_00\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_clk\" pin_num=\"J3\" pin_signal=\"GPIO_SD_B0_01\"/>\n                  <pin peripheral=\"USDHC1\" signal=\"usdhc_vselect\" pin_num=\"C14\" pin_signal=\"GPIO_B1_14\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitQSPIPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXSPI\" description=\"Peripheral FLEXSPI is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Pins initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitQSPIPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA0\" pin_num=\"P3\" pin_signal=\"GPIO_SD_B1_08\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA1\" pin_num=\"N4\" pin_signal=\"GPIO_SD_B1_09\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA2\" pin_num=\"P4\" pin_signal=\"GPIO_SD_B1_10\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DATA3\" pin_num=\"P5\" pin_signal=\"GPIO_SD_B1_11\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SCLK\" pin_num=\"L4\" pin_signal=\"GPIO_SD_B1_07\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_SS0_B\" pin_num=\"L3\" pin_signal=\"GPIO_SD_B1_06\"/>\n                  <pin peripheral=\"FLEXSPI\" signal=\"FLEXSPI_A_DQS\" pin_num=\"N3\" pin_signal=\"GPIO_SD_B1_05\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"11.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>13.0.2</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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtali\" description=\"&apos;RTC_XTALI&apos; (Pins tool id: XTALOSC24M.rtc_xtali, Clocks tool id: XTALOSC24M.RTC_XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.rtc_xtalo\" description=\"&apos;RTC_XTALO&apos; (Pins tool id: XTALOSC24M.rtc_xtalo, Clocks tool id: XTALOSC24M.RTC_XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtali\" description=\"&apos;XTALI&apos; (Pins tool id: XTALOSC24M.xtali, Clocks tool id: XTALOSC24M.XTALI) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) 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=\"PinSignal\" resourceId=\"XTALOSC24M.xtalo\" description=\"&apos;XTALO&apos; (Pins tool id: XTALOSC24M.xtalo, Clocks tool id: XTALOSC24M.XTALO) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.iomuxc\" description=\"Clocks initialization requires the IOMUXC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"XTALOSC24M.RTC_OSC.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"AHB_CLK_ROOT.outFreq\" value=\"600 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CAN_CLK_ROOT.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CKIL_SYNC_CLK_ROOT.outFreq\" value=\"32.768 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_1M.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_24M.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CSI_CLK_ROOT.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET2_125M_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_125M_CLK.outFreq\" value=\"2.4 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ENET_25M_REF_CLK.outFreq\" value=\"1.2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO1_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXIO2_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI2_CLK_ROOT.outFreq\" value=\"1440/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FLEXSPI_CLK_ROOT.outFreq\" value=\"1440/11 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT1_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"GPT2_ipg_clk_highfreq.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"IPG_CLK_ROOT.outFreq\" value=\"150 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LCDIF_CLK_ROOT.outFreq\" value=\"67.5 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPI2C_CLK_ROOT.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPSPI_CLK_ROOT.outFreq\" value=\"105.6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LVDS1_CLK.outFreq\" value=\"1.2 GHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MQS_MCLK.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PERCLK_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PLL7_MAIN_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK2.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI1_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI2_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_CLK_ROOT.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK1.outFreq\" value=\"1080/17 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SAI3_MCLK3.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SEMC_CLK_ROOT.outFreq\" value=\"75 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SPDIF0_CLK_ROOT.outFreq\" value=\"30 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_CLK_ROOT.outFreq\" value=\"132 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UART_CLK_ROOT.outFreq\" value=\"80 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY1_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USBPHY2_CLK.outFreq\" value=\"480 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC1_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USDHC2_CLK_ROOT.outFreq\" value=\"198 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CCM.AHB_PODF.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM.ARM_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI2_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI2_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.FLEXSPI_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.FLEXSPI_SEL.sel\" value=\"CCM_ANALOG.PLL3_PFD0_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.LCDIF_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM.LCDIF_PRED.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.LPSPI_PODF.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CCM.PERCLK_PODF.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM.SEMC_PODF.scale\" value=\"8\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_CLK_SEL.sel\" value=\"CCM_ANALOG.PLL2_MAIN_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM.TRACE_PODF.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_BYPASS.sel\" value=\"CCM_ANALOG.PLL1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_PREDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL1_VDIV.scale\" value=\"50\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.denom\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2.num\" value=\"0\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_OUT_CLK\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL2_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL2_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_DIV.scale\" value=\"33\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD0_MUL.scale\" value=\"18\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD1_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD2_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD2\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL3_PFD3_BYPASS.sel\" value=\"CCM_ANALOG.PLL3_PFD3\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.denom\" value=\"50\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL4.div\" value=\"47\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.denom\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.div\" value=\"31\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL5.num\" value=\"0\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_BYPASS.sel\" value=\"CCM_ANALOG.PLL5_POST_DIV\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.PLL5_POST_DIV.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG.PLL7_BYPASS.sel\" value=\"CCM_ANALOG.PLL7\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG.VIDEO_DIV.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"CCM_ANALOG_PLL_ENET_POWERDOWN_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB1_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_EN_USB_CLKS_OUT_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_USB2_POWER_CFG\" value=\"Yes\" locked=\"false\"/>\n                  <setting id=\"CCM_ANALOG_PLL_VIDEO_POWERDOWN_CFG\" value=\"No\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.2</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"96c1cec6-3bd3-47a2-8301-f38e4b0dd25f\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"CAN\" uuid=\"eb0900eb-d552-4097-9dcf-a07e592a887f\" type=\"flexcan\" type_id=\"flexcan_ba45456ec815807245205237e2bf425b\" mode=\"interrupts\" peripheral=\"CAN2\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"interruptsCfg\">\n                        <setting name=\"messageBufferIrqs\" value=\"0\"/>\n                        <setting name=\"messageBufferIrqs2\" value=\"0\"/>\n                        <set name=\"interruptsEnable\">\n                           <selected/>\n                        </set>\n                        <setting name=\"enable_irq\" value=\"false\"/>\n                        <struct name=\"interrupt_shared\">\n                           <setting name=\"IRQn\" value=\"CAN2_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"fsl_flexcan\" quick_selection=\"default\">\n                        <struct name=\"can_config\">\n                           <setting name=\"clockSource\" value=\"kFLEXCAN_ClkSrcOsc\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate\" value=\"1000000\"/>\n                           <setting name=\"maxMbNum\" value=\"16\"/>\n                           <setting name=\"enableLoopBack\" value=\"false\"/>\n                           <setting name=\"enableSelfWakeup\" value=\"false\"/>\n                           <setting name=\"enableIndividMask\" value=\"false\"/>\n                           <struct name=\"timingConfig\">\n                              <setting name=\"propSeg\" value=\"2\"/>\n                              <setting name=\"phaseSeg1\" value=\"4\"/>\n                              <setting name=\"phaseSeg2\" value=\"3\"/>\n                              <setting name=\"rJumpwidth\" value=\"2\"/>\n                              <struct name=\"bitTime\"/>\n                           </struct>\n                        </struct>\n                        <setting name=\"enableRxFIFO\" value=\"false\"/>\n                        <struct name=\"rxFIFO\">\n                           <setting name=\"idFilterTable\" value=\"\"/>\n                           <setting name=\"idFilterNum\" value=\"num0\"/>\n                           <setting name=\"idFilterType\" value=\"kFLEXCAN_RxFifoFilterTypeA\"/>\n                           <setting name=\"priority\" value=\"kFLEXCAN_RxFifoPrioLow\"/>\n                        </struct>\n                        <array name=\"channels\">\n                           <struct name=\"0\">\n                              <setting name=\"mbID\" value=\"0\"/>\n                              <setting name=\"mbType\" value=\"mbRx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                           <struct name=\"1\">\n                              <setting name=\"mbID\" value=\"1\"/>\n                              <setting name=\"mbType\" value=\"mbTx\"/>\n                              <struct name=\"rxMb\">\n                                 <setting name=\"id\" value=\"0\"/>\n                                 <setting name=\"format\" value=\"kFLEXCAN_FrameFormatStandard\"/>\n                                 <setting name=\"type\" value=\"kFLEXCAN_FrameTypeData\"/>\n                              </struct>\n                           </struct>\n                        </array>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI\" uuid=\"f67d9a64-c26d-4421-9805-a062b24146f2\" type=\"csi\" type_id=\"csi_3739ec1355c7b915be929f3b7e35095b\" mode=\"interrupt\" peripheral=\"CSI\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_csi\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"clockConfig\">\n                           <setting name=\"clockSource\" value=\"BusInterfaceClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"masterClockSource\" value=\"CsiClock\"/>\n                           <setting name=\"masterClockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        </struct>\n                        <struct name=\"config\">\n                           <setting name=\"format\" value=\"RGB565\"/>\n                           <setting name=\"i_width\" value=\"320\"/>\n                           <setting name=\"i_height\" value=\"240\"/>\n                           <setting name=\"dataBus\" value=\"kCSI_DataBus8Bit\"/>\n                           <setting name=\"workMode\" value=\"kCSI_GatedClockMode\"/>\n                           <setting name=\"useExtVsync\" value=\"true\"/>\n                           <set name=\"polarityFlags\">\n                              <selected/>\n                           </set>\n                           <struct name=\"buffers_config\">\n                              <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                              <setting name=\"bufCount\" value=\"4\"/>\n                              <setting name=\"bufferAlign\" value=\"64\"/>\n                           </struct>\n                        </struct>\n                        <struct name=\"interruptsCfg\">\n                           <setting name=\"isInterruptEnabled\" value=\"false\"/>\n                           <set name=\"interruptSources\">\n                              <selected/>\n                           </set>\n                           <struct name=\"interrupt\">\n                              <setting name=\"IRQn\" value=\"CSI_IRQn\"/>\n                              <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                              <setting name=\"enable_priority\" value=\"false\"/>\n                              <setting name=\"priority\" value=\"0\"/>\n                              <setting name=\"enable_custom_name\" value=\"false\"/>\n                           </struct>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"CSI_LPI2C\" uuid=\"f2c6cd0a-751c-4424-9248-a4d98da47de7\" type=\"lpi2c\" type_id=\"lpi2c_db68d4f4f06a22e25ab51fe9bd6db4d2\" mode=\"master\" peripheral=\"LPI2C1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"main\" quick_selection=\"qs_interrupt\">\n                        <setting name=\"clockSource\" value=\"Lpi2cClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LPI2C1_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                     <config_set name=\"master\" quick_selection=\"qs_master_transfer\">\n                        <setting name=\"mode\" value=\"transfer\"/>\n                        <struct name=\"config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"enableDoze\" value=\"true\"/>\n                           <setting name=\"debugEnable\" value=\"false\"/>\n                           <setting name=\"ignoreAck\" value=\"false\"/>\n                           <setting name=\"pinConfig\" value=\"kLPI2C_2PinOpenDrain\"/>\n                           <setting name=\"baudRate_Hz\" value=\"100000\"/>\n                           <setting name=\"busIdleTimeout_ns\" value=\"0\"/>\n                           <setting name=\"pinLowTimeout_ns\" value=\"0\"/>\n                           <setting name=\"sdaGlitchFilterWidth_ns\" value=\"0\"/>\n                           <setting name=\"sclGlitchFilterWidth_ns\" value=\"0\"/>\n                           <struct name=\"hostRequest\">\n                              <setting name=\"enable\" value=\"false\"/>\n                              <setting name=\"source\" value=\"kLPI2C_HostRequestExternalPin\"/>\n                              <setting name=\"polarity\" value=\"kLPI2C_HostRequestPinActiveHigh\"/>\n                           </struct>\n                           <set name=\"edmaRequestSources\">\n                              <selected/>\n                           </set>\n                        </struct>\n                        <struct name=\"transfer\">\n                           <setting name=\"blocking\" value=\"false\"/>\n                           <setting name=\"enable_custom_handle\" value=\"false\"/>\n                           <struct name=\"callback\">\n                              <setting name=\"name\" value=\"\"/>\n                              <setting name=\"userData\" value=\"\"/>\n                           </struct>\n                           <set name=\"flags\">\n                              <selected/>\n                           </set>\n                           <setting name=\"slaveAddress\" value=\"0\"/>\n                           <setting name=\"direction\" value=\"kLPI2C_Write\"/>\n                           <setting name=\"subaddress\" value=\"0\"/>\n                           <setting name=\"subaddressSize\" value=\"1\"/>\n                           <setting name=\"blocking_buffer\" value=\"false\"/>\n                           <setting name=\"enable_custom_buffer\" value=\"false\"/>\n                           <setting name=\"dataSize\" value=\"1\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"01f250e2-83d7-4b7b-a98d-772d1c3bdb42\" type=\"lpuart\" type_id=\"lpuart_bf01db7d964092f3cf860852cba17f7e\" mode=\"polling\" peripheral=\"LPUART1\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpuartConfig_t\">\n                        <struct name=\"lpuartConfig\">\n                           <setting name=\"clockSource\" value=\"LpuartClock\"/>\n                           <setting name=\"lpuartSrcClkFreq\" value=\"BOARD_BootClockRUN\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kLPUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kLPUART_EightDataBits\"/>\n                           <setting name=\"isMsb\" value=\"false\"/>\n                           <setting name=\"stopBitCount\" value=\"kLPUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"enableRxRTS\" value=\"false\"/>\n                           <setting name=\"enableTxCTS\" value=\"false\"/>\n                           <setting name=\"txCtsSource\" value=\"kLPUART_CtsSourcePin\"/>\n                           <setting name=\"txCtsConfig\" value=\"kLPUART_CtsSampleAtStart\"/>\n                           <setting name=\"rxIdleType\" value=\"kLPUART_IdleTypeStartBit\"/>\n                           <setting name=\"rxIdleConfig\" value=\"kLPUART_IdleCharacter1\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LCD\" uuid=\"90a0c31d-6042-4687-af0f-0892536bc1ba\" type=\"elcdif\" type_id=\"elcdif_1c39bcb43ed1a24bc8980672c7378576\" mode=\"rgbMode\" peripheral=\"LCDIF\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_elcdif\">\n                        <struct name=\"config\">\n                           <setting name=\"panelWidthInt\" value=\"480\"/>\n                           <setting name=\"panelHeightInt\" value=\"272\"/>\n                           <setting name=\"hsw\" value=\"41\"/>\n                           <setting name=\"hfp\" value=\"4\"/>\n                           <setting name=\"hbp\" value=\"8\"/>\n                           <setting name=\"vsw\" value=\"10\"/>\n                           <setting name=\"vfp\" value=\"4\"/>\n                           <setting name=\"vbp\" value=\"3\"/>\n                           <setting name=\"frameRate\" value=\"60 Hz\"/>\n                           <setting name=\"clockSource\" value=\"LcdIfClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <struct name=\"polarityFlags_st\">\n                              <setting name=\"vSyncActive\" value=\"kELCDIF_VsyncActiveLow\"/>\n                              <setting name=\"hSyncActive\" value=\"kELCDIF_HsyncActiveLow\"/>\n                              <setting name=\"dataEnableActive\" value=\"kELCDIF_DataEnableActiveLow\"/>\n                              <setting name=\"driveDataClkEdge\" value=\"kELCDIF_DriveDataOnFallingClkEdge\"/>\n                           </struct>\n                           <setting name=\"bufferName\" value=\"defaultBuffer\"/>\n                           <setting name=\"bufferAlign\" value=\"64\"/>\n                           <setting name=\"pixelFormat\" value=\"kELCDIF_PixelFormatRGB565\"/>\n                           <setting name=\"dataBus\" value=\"kELCDIF_DataBus16Bit\"/>\n                           <setting name=\"enablePxpHandShake\" value=\"false\"/>\n                           <setting name=\"start\" value=\"false\"/>\n                        </struct>\n                        <setting name=\"isInterruptEnabled\" value=\"true\"/>\n                        <set name=\"elcdifInterruptSources\">\n                           <selected>\n                              <id>kELCDIF_CurFrameDoneInterruptEnable</id>\n                           </selected>\n                        </set>\n                        <struct name=\"interrupt\">\n                           <setting name=\"IRQn\" value=\"LCDIF_IRQn\"/>\n                           <setting name=\"enable_interrrupt\" value=\"enabled\"/>\n                           <setting name=\"enable_priority\" value=\"false\"/>\n                           <setting name=\"priority\" value=\"0\"/>\n                           <setting name=\"enable_custom_name\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"b31fa225-2a52-486b-9c5c-33a184a2c716\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"aa3cc953-557b-4557-b7fe-6fedc31acf98\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"8b3f852e-ee1e-45e9-abff-0ff722f1d65d\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"539d282e-5136-4289-9058-9a46b221ca45\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"6e4c02c4-0524-4905-91b5-01d2e2502186\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"c6d8fd36-2bbd-44c6-a160-54e7e12d0807\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"7d3626d3-4536-4838-a35d-3b8cf5a2bd71\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"738ea8df-6176-4e52-b4c7-b88aa9c17d13\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/teensy41_flexspi_nor_config.c",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"teensy41_flexspi_nor_config.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.xip_board\"\n#endif\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)\n__attribute__((section(\".boot_hdr.conf\")))\n#elif defined(__ICCARM__)\n#pragma location = \".boot_hdr.conf\"\n#endif\n\nconst flexspi_nor_config_t qspiflash_config = {\n    .memConfig =\n        {\n            .tag              = FLEXSPI_CFG_BLK_TAG,\n            .version          = FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackFromDqsPad,\n            .csHoldTime       = 3u,\n            .csSetupTime      = 3u,\n            // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock\n            .sflashPadType = kSerialFlash_4Pads,\n            .serialClkFreq = kFlexSpiSerialClk_100MHz,\n            .sflashA1Size  = 8u * 1024u * 1024u,\n            .lookupTable =\n                {\n                    // Read LUTs\n                    FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),\n                    FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),\n                },\n        },\n    .pageSize           = 256u,\n    .sectorSize         = 4u * 1024u,\n    .blockSize          = 256u * 1024u,\n    .isUniformBlockSize = false,\n};\n#endif /* XIP_BOOT_HEADER_ENABLE */\n"
  },
  {
    "path": "hw/bsp/imxrt/boards/teensy_41/teensy41_flexspi_nor_config.h",
    "content": "/*\n * Copyright 2018 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef __TEENSY40_FLEXSPI_NOR_CONFIG__\n#define __TEENSY40_FLEXSPI_NOR_CONFIG__\n\n#include <stdint.h>\n#include <stdbool.h>\n#include \"fsl_common.h\"\n\n/*! @name Driver version */\n/*@{*/\n/*! @brief XIP_BOARD driver version 2.0.0. */\n#define FSL_XIP_BOARD_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\n/*@}*/\n\n/* FLEXSPI memory config block related definitions */\n#define FLEXSPI_CFG_BLK_TAG (0x42464346UL)     // ascii \"FCFB\" Big Endian\n#define FLEXSPI_CFG_BLK_VERSION (0x56010400UL) // V1.4.0\n#define FLEXSPI_CFG_BLK_SIZE (512)\n\n/* FLEXSPI Feature related definitions */\n#define FLEXSPI_FEATURE_HAS_PARALLEL_MODE 1\n\n/* Lookup table related definitions */\n#define CMD_INDEX_READ 0\n#define CMD_INDEX_READSTATUS 1\n#define CMD_INDEX_WRITEENABLE 2\n#define CMD_INDEX_WRITE 4\n\n#define CMD_LUT_SEQ_IDX_READ 0\n#define CMD_LUT_SEQ_IDX_READSTATUS 1\n#define CMD_LUT_SEQ_IDX_WRITEENABLE 3\n#define CMD_LUT_SEQ_IDX_WRITE 9\n\n#define CMD_SDR 0x01\n#define CMD_DDR 0x21\n#define RADDR_SDR 0x02\n#define RADDR_DDR 0x22\n#define CADDR_SDR 0x03\n#define CADDR_DDR 0x23\n#define MODE1_SDR 0x04\n#define MODE1_DDR 0x24\n#define MODE2_SDR 0x05\n#define MODE2_DDR 0x25\n#define MODE4_SDR 0x06\n#define MODE4_DDR 0x26\n#define MODE8_SDR 0x07\n#define MODE8_DDR 0x27\n#define WRITE_SDR 0x08\n#define WRITE_DDR 0x28\n#define READ_SDR 0x09\n#define READ_DDR 0x29\n#define LEARN_SDR 0x0A\n#define LEARN_DDR 0x2A\n#define DATSZ_SDR 0x0B\n#define DATSZ_DDR 0x2B\n#define DUMMY_SDR 0x0C\n#define DUMMY_DDR 0x2C\n#define DUMMY_RWDS_SDR 0x0D\n#define DUMMY_RWDS_DDR 0x2D\n#define JMP_ON_CS 0x1F\n#define STOP 0\n\n#define FLEXSPI_1PAD 0\n#define FLEXSPI_2PAD 1\n#define FLEXSPI_4PAD 2\n#define FLEXSPI_8PAD 3\n\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\n\n//!@brief Definitions for FlexSPI Serial Clock Frequency\ntypedef enum _FlexSpiSerialClockFreq\n{\n    kFlexSpiSerialClk_30MHz  = 1,\n    kFlexSpiSerialClk_50MHz  = 2,\n    kFlexSpiSerialClk_60MHz  = 3,\n    kFlexSpiSerialClk_75MHz  = 4,\n    kFlexSpiSerialClk_80MHz  = 5,\n    kFlexSpiSerialClk_100MHz = 6,\n    kFlexSpiSerialClk_120MHz = 7,\n    kFlexSpiSerialClk_133MHz = 8,\n    kFlexSpiSerialClk_166MHz = 9,\n} flexspi_serial_clk_freq_t;\n\n//!@brief FlexSPI clock configuration type\nenum\n{\n    kFlexSpiClk_SDR, //!< Clock configure for SDR mode\n    kFlexSpiClk_DDR, //!< Clock configurat for DDR mode\n};\n\n//!@brief FlexSPI Read Sample Clock Source definition\ntypedef enum _FlashReadSampleClkSource\n{\n    kFlexSPIReadSampleClk_LoopbackInternally      = 0,\n    kFlexSPIReadSampleClk_LoopbackFromDqsPad      = 1,\n    kFlexSPIReadSampleClk_LoopbackFromSckPad      = 2,\n    kFlexSPIReadSampleClk_ExternalInputFromDqsPad = 3,\n} flexspi_read_sample_clk_t;\n\n//!@brief Misc feature bit definitions\nenum\n{\n    kFlexSpiMiscOffset_DiffClkEnable            = 0, //!< Bit for Differential clock enable\n    kFlexSpiMiscOffset_Ck2Enable                = 1, //!< Bit for CK2 enable\n    kFlexSpiMiscOffset_ParallelEnable           = 2, //!< Bit for Parallel mode enable\n    kFlexSpiMiscOffset_WordAddressableEnable    = 3, //!< Bit for Word Addressable enable\n    kFlexSpiMiscOffset_SafeConfigFreqEnable     = 4, //!< Bit for Safe Configuration Frequency enable\n    kFlexSpiMiscOffset_PadSettingOverrideEnable = 5, //!< Bit for Pad setting override enable\n    kFlexSpiMiscOffset_DdrModeEnable            = 6, //!< Bit for DDR clock confiuration indication.\n};\n\n//!@brief Flash Type Definition\nenum\n{\n    kFlexSpiDeviceType_SerialNOR    = 1,    //!< Flash devices are Serial NOR\n    kFlexSpiDeviceType_SerialNAND   = 2,    //!< Flash devices are Serial NAND\n    kFlexSpiDeviceType_SerialRAM    = 3,    //!< Flash devices are Serial RAM/HyperFLASH\n    kFlexSpiDeviceType_MCP_NOR_NAND = 0x12, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial NAND\n    kFlexSpiDeviceType_MCP_NOR_RAM  = 0x13, //!< Flash device is MCP device, A1 is Serial NOR, A2 is Serial RAMs\n};\n\n//!@brief Flash Pad Definitions\nenum\n{\n    kSerialFlash_1Pad  = 1,\n    kSerialFlash_2Pads = 2,\n    kSerialFlash_4Pads = 4,\n    kSerialFlash_8Pads = 8,\n};\n\n//!@brief FlexSPI LUT Sequence structure\ntypedef struct _lut_sequence\n{\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\n    uint16_t reserved;\n} flexspi_lut_seq_t;\n\n//!@brief Flash Configuration Command Type\nenum\n{\n    kDeviceConfigCmdType_Generic,    //!< Generic command, for example: configure dummy cycles, drive strength, etc\n    kDeviceConfigCmdType_QuadEnable, //!< Quad Enable command\n    kDeviceConfigCmdType_Spi2Xpi,    //!< Switch from SPI to DPI/QPI/OPI mode\n    kDeviceConfigCmdType_Xpi2Spi,    //!< Switch from DPI/QPI/OPI to SPI mode\n    kDeviceConfigCmdType_Spi2NoCmd,  //!< Switch to 0-4-4/0-8-8 mode\n    kDeviceConfigCmdType_Reset,      //!< Reset device command\n};\n\n//!@brief FlexSPI Memory Configuration Block\ntypedef struct _FlexSPIConfig\n{\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\n    //! Serial NAND, need to refer to datasheet\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\n    //! Generic configuration, etc.\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\n    //! DPI/QPI/OPI switch or reset command\n    flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\n    //! sequence number, [31:16] Reserved\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\n    flexspi_lut_seq_t\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\n    //! details\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequency, device specific definitions, See System Boot\n    //! Chapter for more details\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\n    uint32_t reserved3[2];           //!< [0x048-0x04f] Reserved for future use\n    uint32_t sflashA1Size;           //!< [0x050-0x053] Size of Flash connected to A1\n    uint32_t sflashA2Size;           //!< [0x054-0x057] Size of Flash connected to A2\n    uint32_t sflashB1Size;           //!< [0x058-0x05b] Size of Flash connected to B1\n    uint32_t sflashB2Size;           //!< [0x05c-0x05f] Size of Flash connected to B2\n    uint32_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\n    uint32_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\n    uint32_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\n    uint32_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\n    uint32_t timeoutInMs;            //!< [0x070-0x073] Timeout threshold for read status command\n    uint32_t commandInterval;        //!< [0x074-0x077] CS deselect interval between two commands\n    uint16_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B, in terms of 0.1ns\n    uint16_t busyOffset;       //!< [0x07c-0x07d] Busy offset, valid value: 0-31\n    uint16_t busyBitPolarity;  //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\n    //! busy flag is 0 when flash device is busy\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\n    flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\n    uint32_t reserved4[4];              //!< [0x1b0-0x1bf] Reserved for future use\n} flexspi_mem_config_t;\n\n/*  */\n#define NOR_CMD_INDEX_READ CMD_INDEX_READ               //!< 0\n#define NOR_CMD_INDEX_READSTATUS CMD_INDEX_READSTATUS   //!< 1\n#define NOR_CMD_INDEX_WRITEENABLE CMD_INDEX_WRITEENABLE //!< 2\n#define NOR_CMD_INDEX_ERASESECTOR 3                     //!< 3\n#define NOR_CMD_INDEX_PAGEPROGRAM CMD_INDEX_WRITE       //!< 4\n#define NOR_CMD_INDEX_CHIPERASE 5                       //!< 5\n#define NOR_CMD_INDEX_DUMMY 6                           //!< 6\n#define NOR_CMD_INDEX_ERASEBLOCK 7                      //!< 7\n\n#define NOR_CMD_LUT_SEQ_IDX_READ CMD_LUT_SEQ_IDX_READ //!< 0  READ LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS \\\n    CMD_LUT_SEQ_IDX_READSTATUS //!< 1  Read Status LUT sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUS_XPI \\\n    2 //!< 2  Read status DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE \\\n    CMD_LUT_SEQ_IDX_WRITEENABLE //!< 3  Write Enable sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE_XPI \\\n    4 //!< 4  Write Enable DPI/QPI/OPI sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR 5 //!< 5  Erase Sector sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_ERASEBLOCK 8  //!< 8 Erase Block sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM \\\n    CMD_LUT_SEQ_IDX_WRITE                //!< 9  Program sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_CHIPERASE 11 //!< 11 Chip Erase sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_READ_SFDP 13 //!< 13 Read SFDP sequence in lookupTable id stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_RESTORE_NOCMD \\\n    14 //!< 14 Restore 0-4-4/0-8-8 mode sequence id in lookupTable stored in config block\n#define NOR_CMD_LUT_SEQ_IDX_EXIT_NOCMD \\\n    15 //!< 15 Exit 0-4-4/0-8-8 mode sequence id in lookupTable stored in config blobk\n\n/*\n *  Serial NOR configuration block\n */\ntypedef struct _flexspi_nor_config\n{\n    flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\n    uint32_t pageSize;              //!< Page size of Serial NOR\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\n    uint8_t reserved0[2];           //!< Reserved for future use\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP command execution\n    uint32_t blockSize;             //!< Block size\n    uint32_t reserve2[11];          //!< Reserved for future use\n} flexspi_nor_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* __EVKMIMXRT1060_FLEXSPI_NOR_CONFIG__ */\n"
  },
  {
    "path": "hw/bsp/imxrt/debug.jlinkscript",
    "content": "int SetupTarget(void) {\n  JLINK_ExecCommand(\"SetRTTSearchRanges 0x20000000 0x40000\");\n\n  return 0;\n}\n"
  },
  {
    "path": "hw/bsp/imxrt/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board/clock_config.h\"\n#include \"board/pin_mux.h\"\n#include \"board.h\"\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n\n#include \"fsl_clock.h\"\n#include \"fsl_device_registers.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_iomuxc.h\"\n#include \"fsl_lpuart.h\"\n#include \"fsl_ocotp.h\"\n\n#ifdef __GNUC__\n  #pragma GCC diagnostic pop\n#endif\n\n/* --- Note about USB buffer RAM ---\n  For M7 core it's recommended to put USB buffer in DTCM for better performance (flexspi_nor linker default)\n  Otherwise you have to put the buffer in a non-cacheable section by configurate MPU manually or using BOARD_ConfigMPU():\n  - Define CFG_TUSB_MEM_SECTION=__attribute__((section(\"NonCacheable\")))\n  - (IAR only) Change __NCACHE_REGION_SIZE in linker script to cover the size of non-cacheable section, multiple of 2^N\n\n  For secondary M4 core, the USB controller doesn't support transfer from DTCM so OCRAM must be used:\n  - __NCACHE_REGION_SIZE is defined by the linker script by default\n  - Define CFG_TUSB_MEM_SECTION=__attribute__((section(\"NonCacheable\")))\n*/\n\n// needed by fsl_flexspi_nor_boot\nTU_ATTR_USED const uint8_t dcd_data[] = {0x00};\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n// unify naming convention\n#if !defined(USBPHY1) && defined(USBPHY)\n  #define USBPHY1 USBPHY\n#endif\n\nstatic void init_usb_phy(uint8_t usb_id) {\n  USBPHY_Type *usb_phy;\n\n  if (usb_id == 0) {\n    usb_phy = USBPHY1;\n    CLOCK_EnableUsbhs0PhyPllClock(kCLOCK_Usbphy480M, BOARD_XTAL0_CLK_HZ);\n    CLOCK_EnableUsbhs0Clock(kCLOCK_Usb480M, BOARD_XTAL0_CLK_HZ);\n  }\n#ifdef USBPHY2\n  else if (usb_id == 1) {\n    usb_phy = USBPHY2;\n    CLOCK_EnableUsbhs1PhyPllClock(kCLOCK_Usbphy480M, BOARD_XTAL0_CLK_HZ);\n    CLOCK_EnableUsbhs1Clock(kCLOCK_Usb480M, BOARD_XTAL0_CLK_HZ);\n  }\n#endif\n  else {\n    return;\n  }\n\n  // Enable PHY support for Low speed device + LS via FS Hub\n  usb_phy->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL2_MASK | USBPHY_CTRL_SET_ENUTMILEVEL3_MASK;\n\n  // Enable all power for normal operation\n  // TODO may not be needed since it is called within CLOCK_EnableUsbhs0PhyPllClock()\n  usb_phy->PWD = 0;\n\n  // TX Timing\n  uint32_t phytx = usb_phy->TX;\n  phytx &= ~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK);\n  phytx |= USBPHY_TX_D_CAL(0x0C) | USBPHY_TX_TXCAL45DP(0x06) | USBPHY_TX_TXCAL45DM(0x06);\n  usb_phy->TX = phytx;\n}\n\nvoid board_init(void) {\n// make sure the dcache is on.\n#if defined(__DCACHE_PRESENT) && __DCACHE_PRESENT\n  if (SCB_CCR_DC_Msk != (SCB_CCR_DC_Msk & SCB->CCR)) {\n    SCB_EnableDCache();\n  }\n#endif\n\n  BOARD_InitBootPins();\n  BOARD_BootClockRUN();\n  SystemCoreClockUpdate();\n\n  BOARD_ConfigMPU(); // defined in board.h\n\n#ifdef TRACE_ETM\n  //CLOCK_EnableClock(kCLOCK_Trace);\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_OTG1_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #ifdef USBPHY2\n  NVIC_SetPriority(USB_OTG2_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #endif\n#endif\n\n  board_led_write(true);\n\n  // UART\n  lpuart_config_t uart_config;\n  LPUART_GetDefaultConfig(&uart_config);\n  uart_config.baudRate_Bps = CFG_BOARD_UART_BAUDRATE;\n  uart_config.enableTx = true;\n  uart_config.enableRx = true;\n\n  if (kStatus_Success != LPUART_Init(UART_PORT, &uart_config, UART_CLK_ROOT)) {\n    // failed to init uart, probably baudrate is not supported\n    // TU_BREAKPOINT();\n  }\n\n  //------------- USB -------------//\n  // Note: RT105x RT106x and later have dual USB controllers.\n  init_usb_phy(0);// USB0\n#ifdef USBPHY2\n  init_usb_phy(1);// USB1\n#endif\n}\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n//--------------------------------------------------------------------+\nvoid USB_OTG1_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid USB_OTG2_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinWrite(LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == GPIO_PinRead(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n\n#if FSL_FEATURE_OCOTP_HAS_TIMING_CTRL\n  OCOTP_Init(OCOTP, CLOCK_GetFreq(kCLOCK_IpgClk));\n#else\n  OCOTP_Init(OCOTP, 0u);\n#endif\n\n  // Reads shadow registers 0x01 - 0x04 (Configuration and Manufacturing Info)\n  // into 8 bit wide destination, avoiding punning.\n  for (int i = 0; i < 4; ++i) {\n    uint32_t wr = OCOTP_ReadFuseShadowRegister(OCOTP, i + 1);\n    for (int j = 0; j < 4; j++) {\n      id[i * 4 + j] = wr & 0xff;\n      wr >>= 8;\n    }\n  }\n  OCOTP_Deinit(OCOTP);\n\n  return 16;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  int count = 0;\n\n  while (count < len) {\n    uint8_t const rx_count = LPUART_GetRxFifoCount(UART_PORT);\n    if (!rx_count) {\n      // clear all error flag if any\n      uint32_t status_flags = LPUART_GetStatusFlags(UART_PORT);\n      status_flags &= (kLPUART_RxOverrunFlag | kLPUART_ParityErrorFlag | kLPUART_FramingErrorFlag |\n                       kLPUART_NoiseErrorFlag);\n      LPUART_ClearStatusFlags(UART_PORT, status_flags);\n      break;\n    }\n\n    for (int i = 0; i < rx_count; i++) {\n      buf[count] = LPUART_ReadByte(UART_PORT);\n      count++;\n    }\n  }\n\n  return count;\n}\n\nint board_uart_write(void const *buf, int len) {\n  LPUART_WriteBlocking(UART_PORT, (uint8_t const *) buf, len);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\n#ifdef __clang__\nvoid _exit(int __status) {\n  (void) __status;\n  while (1) {}\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/imxrt/family.cmake",
    "content": "include_guard()\n\nset(MCUX_CORE ${TOP}/hw/mcu/nxp/mcuxsdk-core)\nset(MCUX_DEVICES ${TOP}/hw/mcu/nxp/mcux-devices-rt)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_6)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\nset(MCU_VARIANT_WITH_CORE ${MCU_VARIANT}${MCU_CORE})\n\n# toolchain set up\nif (NOT DEFINED CMAKE_SYSTEM_CPU)\n  set(CMAKE_SYSTEM_CPU cortex-m7 CACHE INTERNAL \"System Processor\")\nendif ()\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS MIMXRT1XXX CACHE INTERNAL \"\")\n\n# XIP boot files: some devices reference RT1052's xip (see each device's xip/CMakeLists.txt)\nif (MCU_FAMILY STREQUAL \"RT1064\")\n  set(XIP_DIR ${MCUX_DEVICES}/RT1064/MIMXRT1064/xip)\nelseif (MCU_FAMILY STREQUAL \"RT1170\")\n  set(XIP_DIR ${MCUX_DEVICES}/RT1170/MIMXRT1176/xip)\nelse()\n  # RT1010, RT1015, RT1020, RT1050, RT1060 all use RT1052's xip\n  set(XIP_DIR ${MCUX_DEVICES}/RT1050/MIMXRT1052/xip)\nendif()\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/gcc/${MCU_VARIANT}xxxxx${MCU_CORE}_flexspi_nor.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED LD_FILE_IAR)\nset(LD_FILE_IAR ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/iar/${MCU_VARIANT}xxxxx${MCU_CORE}_flexspi_nor.icf)\nendif ()\n\nset(STARTUP_FILE_GNU ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT_WITH_CORE}.S)\nset(STARTUP_FILE_IAR ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/iar/startup_${MCU_VARIANT_WITH_CORE}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board/clock_config.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board/pin_mux.c\n    # mcuxsdk-core drivers\n    ${MCUX_CORE}/drivers/common/fsl_common.c\n    ${MCUX_CORE}/drivers/common/fsl_common_arm.c\n    ${MCUX_CORE}/drivers/igpio/fsl_gpio.c\n    ${MCUX_CORE}/drivers/lpspi/fsl_lpspi.c\n    ${MCUX_CORE}/drivers/lpuart/fsl_lpuart.c\n    ${MCUX_CORE}/drivers/ocotp/fsl_ocotp.c\n    # device specific\n    ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/system_${MCU_VARIANT_WITH_CORE}.c\n    ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/drivers/fsl_clock.c\n    )\n\n  # Additional drivers in subdirectories (RT1170 power/anatop_ai)\n  if (MCU_FAMILY STREQUAL \"RT1170\")\n    target_sources(${BOARD_TARGET} PRIVATE\n      ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/drivers/power/fsl_dcdc.c\n      ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/drivers/power/fsl_pmu.c\n      ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/drivers/anatop_ai/fsl_anatop_ai.c\n      )\n  endif()\n\n  if (NOT M4 STREQUAL \"1\")\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      XIP_EXTERNAL_FLASH=1\n      XIP_BOOT_HEADER_ENABLE=1\n      )\n  endif ()\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    # device specific\n    ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}\n    ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/drivers\n    ${MCUX_DEVICES}/${MCU_FAMILY}/periph\n    # mcuxsdk-core drivers\n    ${MCUX_CORE}/drivers/common\n    ${MCUX_CORE}/drivers/igpio\n    ${MCUX_CORE}/drivers/lpspi\n    ${MCUX_CORE}/drivers/lpuart\n    ${MCUX_CORE}/drivers/ocotp\n    )\n\n  # Include power/anatop_ai driver directories if they exist\n  foreach(SUBDIR power anatop_ai)\n    if(EXISTS ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/drivers/${SUBDIR})\n      target_include_directories(${BOARD_TARGET} PUBLIC\n        ${MCUX_DEVICES}/${MCU_FAMILY}/${MCU_VARIANT}/drivers/${SUBDIR}\n        )\n    endif()\n  endforeach()\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_MIMXRT1XXX)\n\n  target_sources(${TARGET} PRIVATE\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c\n    ${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c\n    ${TOP}/src/portable/ehci/ehci.c\n    ${XIP_DIR}/fsl_flexspi_nor_boot.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    ${XIP_DIR}\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    __START=main # required with -nostartfiles\n    __STARTUP_CLEAR_BSS\n    [=[CFG_TUSB_MEM_SECTION=__attribute__((section(\"NonCacheable\")))]=]\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PRIVATE \"LINKER:--script=${LD_FILE_GNU}\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PRIVATE \"LINKER:--config=${LD_FILE_IAR}\")\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\n  #family_flash_pyocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/imxrt/family.mk",
    "content": "UF2_FAMILY_ID = 0x4fb2d5bd\nMCUX_CORE = hw/mcu/nxp/mcuxsdk-core\nMCUX_DEVICES = hw/mcu/nxp/mcux-devices-rt\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m7\nMCU_VARIANT_WITH_CORE = ${MCU_VARIANT}${MCU_CORE}\nMCU_DIR = $(MCUX_DEVICES)/$(MCU_FAMILY)/$(MCU_VARIANT)\n\n# XIP boot files: some devices reference RT1052's xip (see each device's xip/CMakeLists.txt)\nifeq ($(MCU_FAMILY),RT1064)\n  XIP_DIR = $(MCUX_DEVICES)/RT1064/MIMXRT1064/xip\nelse ifeq ($(MCU_FAMILY),RT1170)\n  XIP_DIR = $(MCUX_DEVICES)/RT1170/MIMXRT1176/xip\nelse\n  # RT1010, RT1015, RT1020, RT1050, RT1060 all use RT1052's xip\n  XIP_DIR = $(MCUX_DEVICES)/RT1050/MIMXRT1052/xip\nendif\n\nCFLAGS += \\\n\t-D__START=main \\\n  -D__STARTUP_CLEAR_BSS \\\n  -DCFG_TUSB_MCU=OPT_MCU_MIMXRT1XXX \\\n  -DCFG_TUSB_MEM_SECTION='__attribute__((section(\"NonCacheable\")))' \\\n\nifneq ($(M4), 1)\nCFLAGS += \\\n  -DXIP_EXTERNAL_FLASH=1 \\\n  -DXIP_BOOT_HEADER_ENABLE=1\nendif\n\nifdef BOARD_TUD_RHPORT\nCFLAGS += -DBOARD_TUD_RHPORT=$(BOARD_TUD_RHPORT)\nendif\n\nifdef BOARD_TUH_RHPORT\nCFLAGS += -DBOARD_TUH_RHPORT=$(BOARD_TUH_RHPORT)\nendif\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=implicit-fallthrough -Wno-error=redundant-decls\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# All source paths should be relative to the top level.\nLD_FILE ?= $(MCU_DIR)/gcc/$(MCU_VARIANT)xxxxx${MCU_CORE}_flexspi_nor.ld\n\n# TODO for net_lwip_webserver example, but may not needed !!\nLDFLAGS += \\\n\t-Wl,--defsym,__stack_size__=0x800 \\\n\nSRC_C += \\\n\tsrc/portable/chipidea/ci_hs/dcd_ci_hs.c \\\n\tsrc/portable/chipidea/ci_hs/hcd_ci_hs.c \\\n\tsrc/portable/ehci/ehci.c \\\n\t${BOARD_PATH}/board/clock_config.c \\\n\t${BOARD_PATH}/board/pin_mux.c \\\n\t$(MCU_DIR)/system_$(MCU_VARIANT_WITH_CORE).c \\\n\t$(XIP_DIR)/fsl_flexspi_nor_boot.c \\\n\t$(MCU_DIR)/drivers/fsl_clock.c \\\n\t$(MCUX_CORE)/drivers/common/fsl_common.c \\\n\t$(MCUX_CORE)/drivers/common/fsl_common_arm.c \\\n\t$(MCUX_CORE)/drivers/igpio/fsl_gpio.c \\\n\t$(MCUX_CORE)/drivers/lpuart/fsl_lpuart.c \\\n\t$(MCUX_CORE)/drivers/ocotp/fsl_ocotp.c \\\n\n# Optional drivers: RT1170 power/anatop_ai subdirectories\nifneq (,$(wildcard ${TOP}/${MCU_DIR}/drivers/power/fsl_dcdc.c))\nSRC_C += \\\n  ${MCU_DIR}/drivers/power/fsl_dcdc.c \\\n  ${MCU_DIR}/drivers/power/fsl_pmu.c \\\n  ${MCU_DIR}/drivers/anatop_ai/fsl_anatop_ai.c\nINC += \\\n  $(TOP)/$(MCU_DIR)/drivers/power \\\n  $(TOP)/$(MCU_DIR)/drivers/anatop_ai\nendif\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_6/CMSIS/Core/Include \\\n\t$(TOP)/$(MCU_DIR) \\\n\t$(TOP)/$(MCU_DIR)/drivers \\\n\t$(TOP)/$(MCUX_DEVICES)/$(MCU_FAMILY)/periph \\\n\t$(TOP)/$(MCUX_CORE)/drivers/common \\\n\t$(TOP)/$(MCUX_CORE)/drivers/igpio \\\n\t$(TOP)/$(MCUX_CORE)/drivers/lpuart \\\n\t$(TOP)/$(MCUX_CORE)/drivers/ocotp \\\n\t$(TOP)/$(XIP_DIR) \\\n\nSRC_S += $(MCU_DIR)/gcc/startup_$(MCU_VARIANT_WITH_CORE).S\n\n# UF2 generation, iMXRT need to strip to text only before conversion\nAPPLICATION_ADDR = 0x6000C000\n$(BUILD)/$(PROJECT).uf2: $(BUILD)/$(PROJECT).elf\n\t@echo CREATE $@\n\t@$(OBJCOPY) -O binary -R .flash_config -R .ivt $^ $(BUILD)/$(PROJECT)-textonly.bin\n\t$(PYTHON) $(TOP)/tools/uf2/utils/uf2conv.py -f $(UF2_FAMILY_ID) -b $(APPLICATION_ADDR) -c -o $@ $(BUILD)/$(PROJECT)-textonly.bin\n"
  },
  {
    "path": "hw/bsp/kinetis_k/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               2\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* Define to trap errors during development. */\n// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7\n#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__)\n  #define configASSERT(_exp) \\\n    do {\\\n      if ( !(_exp) ) { \\\n        volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \\\n        if ( (*ARM_CM_DHCSR) & 1UL ) {  /* Only halt mcu if debugger is attached */ \\\n          taskDISABLE_INTERRUPTS(); \\\n           __asm(\"BKPT #0\\n\"); \\\n        }\\\n      }\\\n    } while(0)\n#endif\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/frdm_k64f/board/clock_config.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to setup clock using clock driver functions:\n *\n * 1. CLOCK_SetSimSafeDivs, to make sure core clock, bus clock, flexbus clock\n *    and flash clock are in allowed range during clock mode switch.\n *\n * 2. Call CLOCK_Osc0Init to setup OSC clock, if it is used in target mode.\n *\n * 3. Set MCG configuration, MCG includes three parts: FLL clock, PLL clock and\n *    internal reference clock(MCGIRCLK). Follow the steps to setup:\n *\n *    1). Call CLOCK_BootToXxxMode to set MCG to target mode.\n *\n *    2). If target mode is FBI/BLPI/PBI mode, the MCGIRCLK has been configured\n *        correctly. For other modes, need to call CLOCK_SetInternalRefClkConfig\n *        explicitly to setup MCGIRCLK.\n *\n *    3). Don't need to configure FLL explicitly, because if target mode is FLL\n *        mode, then FLL has been configured by the function CLOCK_BootToXxxMode,\n *        if the target mode is not FLL mode, the FLL is disabled.\n *\n *    4). If target mode is PEE/PBE/PEI/PBI mode, then the related PLL has been\n *        setup by CLOCK_BootToXxxMode. In FBE/FBI/FEE/FBE mode, the PLL could\n *        be enabled independently, call CLOCK_EnablePll0 explicitly in this case.\n *\n * 4. Call CLOCK_SetSimConfig to set the clock configuration in SIM.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v12.0\nprocessor: MK64FN1M0xxx12\npackage_id: MK64FN1M0VLL12\nmcu_data: ksdk2_0\nprocessor_version: 14.0.0\nboard: FRDM-K64F\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_smc.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define MCG_IRCLK_DISABLE                                 0U  /*!< MCGIRCLK disabled */\n#define MCG_PLL_DISABLE                                   0U  /*!< MCGPLLCLK disabled */\n#define OSC_CAP0P                                         0U  /*!< Oscillator 0pF capacitor load */\n#define OSC_ER_CLK_DISABLE                                0U  /*!< Disable external reference clock */\n#define SIM_CLKOUT_SEL_FLEXBUS_CLK                        0U  /*!< CLKOUT pin clock select: FlexBus clock */\n#define SIM_ENET_1588T_CLK_SEL_OSCERCLK_CLK               2U  /*!< SDHC clock select: OSCERCLK clock */\n#define SIM_ENET_RMII_CLK_SEL_EXTAL_CLK                   0U  /*!< SDHC clock select: Core/system clock */\n#define SIM_OSC32KSEL_RTC32KCLK_CLK                       2U  /*!< OSC32KSEL select: RTC32KCLK clock (32.768kHz) */\n#define SIM_PLLFLLSEL_IRC48MCLK_CLK                       3U  /*!< PLLFLL select: IRC48MCLK clock */\n#define SIM_PLLFLLSEL_MCGPLLCLK_CLK                       1U  /*!< PLLFLL select: MCGPLLCLK clock */\n#define SIM_SDHC_CLK_SEL_OSCERCLK_CLK                     2U  /*!< SDHC clock select: OSCERCLK clock */\n#define SIM_TRACE_CLK_SEL_CORE_SYSTEM_CLK                 1U  /*!< Trace clock select: Core/system clock */\n#define SIM_USB_CLK_120000000HZ                   120000000U  /*!< Input SIM frequency for USB: 120000000Hz */\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n/*FUNCTION**********************************************************************\n *\n * Function Name : CLOCK_CONFIG_SetFllExtRefDiv\n * Description   : Configure FLL external reference divider (FRDIV).\n * Param frdiv   : The value to set FRDIV.\n *\n *END**************************************************************************/\nstatic void CLOCK_CONFIG_SetFllExtRefDiv(uint8_t frdiv)\n{\n    MCG->C1 = ((MCG->C1 & ~MCG_C1_FRDIV_MASK) | MCG_C1_FRDIV(frdiv));\n}\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\noutputs:\n- {id: Bus_clock.outFreq, value: 60 MHz}\n- {id: CLKOUT.outFreq, value: 40 MHz}\n- {id: Core_clock.outFreq, value: 120 MHz, locked: true, accuracy: '0.001'}\n- {id: ENET1588TSCLK.outFreq, value: 50 MHz}\n- {id: Flash_clock.outFreq, value: 24 MHz}\n- {id: FlexBus_clock.outFreq, value: 40 MHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: MCGFFCLK.outFreq, value: 1.5625 MHz}\n- {id: MCGIRCLK.outFreq, value: 2 MHz}\n- {id: OSCERCLK.outFreq, value: 50 MHz}\n- {id: PLLFLLCLK.outFreq, value: 120 MHz}\n- {id: RMIICLK.outFreq, value: 50 MHz}\n- {id: SDHCCLK.outFreq, value: 50 MHz}\n- {id: System_clock.outFreq, value: 120 MHz}\n- {id: TRACECLKIN.outFreq, value: 120 MHz}\n- {id: USB48MCLK.outFreq, value: 48 MHz}\nsettings:\n- {id: MCGMode, value: PEE}\n- {id: CLKOUTConfig, value: 'yes'}\n- {id: ENETTimeSrcConfig, value: 'yes'}\n- {id: MCG.FRDIV.scale, value: '32'}\n- {id: MCG.IRCS.sel, value: MCG.FCRDIV}\n- {id: MCG.IREFS.sel, value: MCG.FRDIV}\n- {id: MCG.PLLS.sel, value: MCG.PLL}\n- {id: MCG.PRDIV.scale, value: '15'}\n- {id: MCG.VDIV.scale, value: '36'}\n- {id: MCG_C1_IRCLKEN_CFG, value: Enabled}\n- {id: MCG_C2_RANGE0_CFG, value: Very_high}\n- {id: MCG_C2_RANGE0_FRDIV_CFG, value: Very_high}\n- {id: OSC_CR_ERCLKEN_CFG, value: Enabled}\n- {id: RMIISrcConfig, value: 'yes'}\n- {id: RTCCLKOUTConfig, value: 'yes'}\n- {id: RTC_CR_OSCE_CFG, value: Enabled}\n- {id: RTC_CR_OSC_CAP_LOAD_CFG, value: SC10PF}\n- {id: SDHCClkConfig, value: 'yes'}\n- {id: SIM.OSC32KSEL.sel, value: RTC.RTC32KCLK}\n- {id: SIM.OUTDIV2.scale, value: '2'}\n- {id: SIM.OUTDIV3.scale, value: '3'}\n- {id: SIM.OUTDIV4.scale, value: '5'}\n- {id: SIM.PLLFLLSEL.sel, value: MCG.MCGPLLCLK}\n- {id: SIM.RTCCLKOUTSEL.sel, value: RTC.RTC32KCLK}\n- {id: SIM.SDHCSRCSEL.sel, value: OSC.OSCERCLK}\n- {id: SIM.TIMESRCSEL.sel, value: OSC.OSCERCLK}\n- {id: SIM.USBDIV.scale, value: '5'}\n- {id: SIM.USBFRAC.scale, value: '2'}\n- {id: SIM.USBSRCSEL.sel, value: SIM.USBDIV}\n- {id: TraceClkConfig, value: 'yes'}\n- {id: USBClkConfig, value: 'yes'}\nsources:\n- {id: OSC.OSC.outFreq, value: 50 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst mcg_config_t mcgConfig_BOARD_BootClockRUN =\n    {\n        .mcgMode = kMCG_ModePEE,                  /* PEE - PLL Engaged External */\n        .irclkEnableMode = kMCG_IrclkEnable,      /* MCGIRCLK enabled, MCGIRCLK disabled in STOP mode */\n        .ircs = kMCG_IrcFast,                     /* Fast internal reference clock selected */\n        .fcrdiv = 0x1U,                           /* Fast IRC divider: divided by 2 */\n        .frdiv = 0x0U,                            /* FLL reference clock divider: divided by 32 */\n        .drs = kMCG_DrsLow,                       /* Low frequency range */\n        .dmx32 = kMCG_Dmx32Default,               /* DCO has a default range of 25% */\n        .oscsel = kMCG_OscselOsc,                 /* Selects System Oscillator (OSCCLK) */\n        .pll0Config =\n            {\n                .enableMode = MCG_PLL_DISABLE,    /* MCGPLLCLK disabled */\n                .prdiv = 0xeU,                    /* PLL Reference divider: divided by 15 */\n                .vdiv = 0xcU,                     /* VCO divider: multiplied by 36 */\n            },\n    };\nconst sim_clock_config_t simConfig_BOARD_BootClockRUN =\n    {\n        .pllFllSel = SIM_PLLFLLSEL_MCGPLLCLK_CLK, /* PLLFLL select: MCGPLLCLK clock */\n        .er32kSrc = SIM_OSC32KSEL_RTC32KCLK_CLK,  /* OSC32KSEL select: RTC32KCLK clock (32.768kHz) */\n        .clkdiv1 = 0x1240000U,                    /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV2: /2, OUTDIV3: /3, OUTDIV4: /5 */\n    };\nconst osc_config_t oscConfig_BOARD_BootClockRUN =\n    {\n        .freq = 50000000U,                        /* Oscillator frequency: 50000000Hz */\n        .capLoad = (OSC_CAP0P),                   /* Oscillator capacity load: 0pF */\n        .workMode = kOSC_ModeExt,                 /* Use external clock */\n        .oscerConfig =\n            {\n                .enableMode = kOSC_ErClkEnable,   /* Enable external reference clock, disable external reference clock in STOP mode */\n            }\n    };\n\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Set the system clock dividers in SIM to safe value. */\n    CLOCK_SetSimSafeDivs();\n    /* Initializes OSC0 according to board configuration. */\n    CLOCK_InitOsc0(&oscConfig_BOARD_BootClockRUN);\n    CLOCK_SetXtal0Freq(oscConfig_BOARD_BootClockRUN.freq);\n    /* Configure the Internal Reference clock (MCGIRCLK). */\n    CLOCK_SetInternalRefClkConfig(mcgConfig_BOARD_BootClockRUN.irclkEnableMode,\n                                  mcgConfig_BOARD_BootClockRUN.ircs,\n                                  mcgConfig_BOARD_BootClockRUN.fcrdiv);\n    /* Configure FLL external reference divider (FRDIV). */\n    CLOCK_CONFIG_SetFllExtRefDiv(mcgConfig_BOARD_BootClockRUN.frdiv);\n    /* Set MCG to PEE mode. */\n    CLOCK_BootToPeeMode(mcgConfig_BOARD_BootClockRUN.oscsel,\n                        kMCG_PllClkSelPll0,\n                        &mcgConfig_BOARD_BootClockRUN.pll0Config);\n    /* Set the clock configuration in SIM module. */\n    CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN);\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n    /* Enable USB FS clock. */\n    CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcPll0, SIM_USB_CLK_120000000HZ);\n    /* Set enet timestamp clock source. */\n    CLOCK_SetEnetTime0Clock(SIM_ENET_1588T_CLK_SEL_OSCERCLK_CLK);\n    /* Set RMII clock source. */\n    CLOCK_SetRmii0Clock(SIM_ENET_RMII_CLK_SEL_EXTAL_CLK);\n    /* Set SDHC clock source. */\n    CLOCK_SetSdhc0Clock(SIM_SDHC_CLK_SEL_OSCERCLK_CLK);\n    /* Set CLKOUT source. */\n    CLOCK_SetClkOutClock(SIM_CLKOUT_SEL_FLEXBUS_CLK);\n    /* Set debug trace clock source. */\n    CLOCK_SetTraceClock(SIM_TRACE_CLK_SEL_CORE_SYSTEM_CLK);\n}\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockVLPR ***********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockVLPR\noutputs:\n- {id: Bus_clock.outFreq, value: 4 MHz}\n- {id: Core_clock.outFreq, value: 4 MHz, locked: true, accuracy: '0.001'}\n- {id: Flash_clock.outFreq, value: 800 kHz}\n- {id: FlexBus_clock.outFreq, value: 4 MHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: System_clock.outFreq, value: 4 MHz}\nsettings:\n- {id: MCGMode, value: BLPI}\n- {id: powerMode, value: VLPR}\n- {id: MCG.CLKS.sel, value: MCG.IRCS}\n- {id: MCG.FCRDIV.scale, value: '1'}\n- {id: MCG.FRDIV.scale, value: '32'}\n- {id: MCG.IRCS.sel, value: MCG.FCRDIV}\n- {id: MCG_C2_RANGE0_CFG, value: Very_high}\n- {id: MCG_C2_RANGE0_FRDIV_CFG, value: Very_high}\n- {id: RTC_CR_OSCE_CFG, value: Enabled}\n- {id: RTC_CR_OSC_CAP_LOAD_CFG, value: SC10PF}\n- {id: SIM.OSC32KSEL.sel, value: RTC.RTC32KCLK}\n- {id: SIM.OUTDIV3.scale, value: '1'}\n- {id: SIM.OUTDIV4.scale, value: '5'}\n- {id: SIM.PLLFLLSEL.sel, value: IRC48M.IRC48MCLK}\n- {id: SIM.RTCCLKOUTSEL.sel, value: RTC.RTC32KCLK}\nsources:\n- {id: OSC.OSC.outFreq, value: 50 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockVLPR configuration\n ******************************************************************************/\nconst mcg_config_t mcgConfig_BOARD_BootClockVLPR =\n    {\n        .mcgMode = kMCG_ModeBLPI,                 /* BLPI - Bypassed Low Power Internal */\n        .irclkEnableMode = MCG_IRCLK_DISABLE,     /* MCGIRCLK disabled */\n        .ircs = kMCG_IrcFast,                     /* Fast internal reference clock selected */\n        .fcrdiv = 0x0U,                           /* Fast IRC divider: divided by 1 */\n        .frdiv = 0x0U,                            /* FLL reference clock divider: divided by 32 */\n        .drs = kMCG_DrsLow,                       /* Low frequency range */\n        .dmx32 = kMCG_Dmx32Default,               /* DCO has a default range of 25% */\n        .oscsel = kMCG_OscselOsc,                 /* Selects System Oscillator (OSCCLK) */\n        .pll0Config =\n            {\n                .enableMode = MCG_PLL_DISABLE,    /* MCGPLLCLK disabled */\n                .prdiv = 0x0U,                    /* PLL Reference divider: divided by 1 */\n                .vdiv = 0x0U,                     /* VCO divider: multiplied by 24 */\n            },\n    };\nconst sim_clock_config_t simConfig_BOARD_BootClockVLPR =\n    {\n        .pllFllSel = SIM_PLLFLLSEL_IRC48MCLK_CLK, /* PLLFLL select: IRC48MCLK clock */\n        .er32kSrc = SIM_OSC32KSEL_RTC32KCLK_CLK,  /* OSC32KSEL select: RTC32KCLK clock (32.768kHz) */\n        .clkdiv1 = 0x40000U,                      /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV2: /1, OUTDIV3: /1, OUTDIV4: /5 */\n    };\nconst osc_config_t oscConfig_BOARD_BootClockVLPR =\n    {\n        .freq = 0U,                               /* Oscillator frequency: 0Hz */\n        .capLoad = (OSC_CAP0P),                   /* Oscillator capacity load: 0pF */\n        .workMode = kOSC_ModeExt,                 /* Use external clock */\n        .oscerConfig =\n            {\n                .enableMode = OSC_ER_CLK_DISABLE, /* Disable external reference clock */\n            }\n    };\n\n/*******************************************************************************\n * Code for BOARD_BootClockVLPR configuration\n ******************************************************************************/\nvoid BOARD_BootClockVLPR(void)\n{\n    /* Set the system clock dividers in SIM to safe value. */\n    CLOCK_SetSimSafeDivs();\n    /* Set MCG to BLPI mode. */\n    CLOCK_BootToBlpiMode(mcgConfig_BOARD_BootClockVLPR.fcrdiv,\n                         mcgConfig_BOARD_BootClockVLPR.ircs,\n                         mcgConfig_BOARD_BootClockVLPR.irclkEnableMode);\n    /* Set the clock configuration in SIM module. */\n    CLOCK_SetSimConfig(&simConfig_BOARD_BootClockVLPR);\n    /* Set VLPR power mode. */\n    SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll);\n#if (defined(FSL_FEATURE_SMC_HAS_LPWUI) && FSL_FEATURE_SMC_HAS_LPWUI)\n    SMC_SetPowerModeVlpr(SMC, false);\n#else\n    SMC_SetPowerModeVlpr(SMC);\n#endif\n    while (SMC_GetPowerModeState(SMC) != kSMC_PowerStateVlpr)\n    {\n    }\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKVLPR_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/frdm_k64f/board/clock_config.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         50000000U  /*!< Board xtal0 frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             120000000U  /*!< Core clock frequency: 120000000Hz */\n\n/*! @brief MCG set for BOARD_BootClockRUN configuration.\n */\nextern const mcg_config_t mcgConfig_BOARD_BootClockRUN;\n/*! @brief SIM module set for BOARD_BootClockRUN configuration.\n */\nextern const sim_clock_config_t simConfig_BOARD_BootClockRUN;\n/*! @brief OSC set for BOARD_BootClockRUN configuration.\n */\nextern const osc_config_t oscConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockVLPR ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockVLPR configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKVLPR_CORE_CLOCK              4000000U  /*!< Core clock frequency: 4000000Hz */\n\n/*! @brief MCG set for BOARD_BootClockVLPR configuration.\n */\nextern const mcg_config_t mcgConfig_BOARD_BootClockVLPR;\n/*! @brief SIM module set for BOARD_BootClockVLPR configuration.\n */\nextern const sim_clock_config_t simConfig_BOARD_BootClockVLPR;\n/*! @brief OSC set for BOARD_BootClockVLPR configuration.\n */\nextern const osc_config_t oscConfig_BOARD_BootClockVLPR;\n\n/*******************************************************************************\n * API for BOARD_BootClockVLPR configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockVLPR(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/frdm_k64f/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v14.0\nprocessor: MK64FN1M0xxx12\npackage_id: MK64FN1M0VLL12\nmcu_data: ksdk2_0\nprocessor_version: 14.0.0\nboard: FRDM-K64F\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_port.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitButtons();\n    BOARD_InitLEDs();\n    BOARD_InitDEBUG_UART();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'false', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void)\n{\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitButtons:\n- options: {callFromInitBoot: 'true', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '78', peripheral: GPIOC, signal: 'GPIO, 6', pin_signal: CMP0_IN0/PTC6/LLWU_P10/SPI0_SOUT/PDB0_EXTRG/I2S0_RX_BCLK/FB_AD9/I2S0_MCLK, identifier: SW2,\n    direction: INPUT, slew_rate: fast, open_drain: disable, drive_strength: low, pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '38', peripheral: GPIOA, signal: 'GPIO, 4', pin_signal: PTA4/LLWU_P3/FTM0_CH1/NMI_b/EZP_CS_b, direction: INPUT, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitButtons\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitButtons(void)\n{\n    /* Port A Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortA);\n    /* Port C Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortC);\n\n    gpio_pin_config_t SW3_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PTA4 (pin 38)  */\n    GPIO_PinInit(BOARD_SW3_GPIO, BOARD_SW3_PIN, &SW3_config);\n\n    gpio_pin_config_t SW2_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PTC6 (pin 78)  */\n    GPIO_PinInit(BOARD_SW2_GPIO, BOARD_SW2_PIN, &SW2_config);\n\n    const port_pin_config_t SW3 = {/* Internal pull-up/down resistor is disabled */\n                                   kPORT_PullDisable,\n                                   /* Fast slew rate is configured */\n                                   kPORT_FastSlewRate,\n                                   /* Passive filter is disabled */\n                                   kPORT_PassiveFilterDisable,\n                                   /* Open drain is disabled */\n                                   kPORT_OpenDrainDisable,\n                                   /* Low drive strength is configured */\n                                   kPORT_LowDriveStrength,\n                                   /* Pin is configured as PTA4 */\n                                   kPORT_MuxAsGpio,\n                                   /* Pin Control Register fields [15:0] are not locked */\n                                   kPORT_UnlockRegister};\n    /* PORTA4 (pin 38) is configured as PTA4 */\n    PORT_SetPinConfig(BOARD_SW3_PORT, BOARD_SW3_PIN, &SW3);\n\n    const port_pin_config_t SW2 = {/* Internal pull-up resistor is enabled */\n                                   kPORT_PullUp,\n                                   /* Fast slew rate is configured */\n                                   kPORT_FastSlewRate,\n                                   /* Passive filter is disabled */\n                                   kPORT_PassiveFilterDisable,\n                                   /* Open drain is disabled */\n                                   kPORT_OpenDrainDisable,\n                                   /* Low drive strength is configured */\n                                   kPORT_LowDriveStrength,\n                                   /* Pin is configured as PTC6 */\n                                   kPORT_MuxAsGpio,\n                                   /* Pin Control Register fields [15:0] are not locked */\n                                   kPORT_UnlockRegister};\n    /* PORTC6 (pin 78) is configured as PTC6 */\n    PORT_SetPinConfig(BOARD_SW2_PORT, BOARD_SW2_PIN, &SW2);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLEDs:\n- options: {callFromInitBoot: 'true', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '67', peripheral: GPIOB, signal: 'GPIO, 21', pin_signal: PTB21/SPI2_SCK/FB_AD30/CMP1_OUT, direction: OUTPUT, gpio_init_state: 'true', slew_rate: slow,\n    open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '68', peripheral: GPIOB, signal: 'GPIO, 22', pin_signal: PTB22/SPI2_SOUT/FB_AD29/CMP2_OUT, direction: OUTPUT, gpio_init_state: 'true', slew_rate: slow,\n    open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '33', peripheral: GPIOE, signal: 'GPIO, 26', pin_signal: PTE26/ENET_1588_CLKIN/UART4_CTS_b/RTC_CLKOUT/USB_CLKIN, direction: OUTPUT, gpio_init_state: 'true',\n    slew_rate: slow, open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLEDs\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitLEDs(void)\n{\n    /* Port B Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortB);\n    /* Port E Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortE);\n\n    gpio_pin_config_t LED_BLUE_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PTB21 (pin 67)  */\n    GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_PIN, &LED_BLUE_config);\n\n    gpio_pin_config_t LED_RED_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PTB22 (pin 68)  */\n    GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_PIN, &LED_RED_config);\n\n    gpio_pin_config_t LED_GREEN_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PTE26 (pin 33)  */\n    GPIO_PinInit(BOARD_LED_GREEN_GPIO, BOARD_LED_GREEN_PIN, &LED_GREEN_config);\n\n    const port_pin_config_t LED_BLUE = {/* Internal pull-up/down resistor is disabled */\n                                        kPORT_PullDisable,\n                                        /* Slow slew rate is configured */\n                                        kPORT_SlowSlewRate,\n                                        /* Passive filter is disabled */\n                                        kPORT_PassiveFilterDisable,\n                                        /* Open drain is disabled */\n                                        kPORT_OpenDrainDisable,\n                                        /* Low drive strength is configured */\n                                        kPORT_LowDriveStrength,\n                                        /* Pin is configured as PTB21 */\n                                        kPORT_MuxAsGpio,\n                                        /* Pin Control Register fields [15:0] are not locked */\n                                        kPORT_UnlockRegister};\n    /* PORTB21 (pin 67) is configured as PTB21 */\n    PORT_SetPinConfig(BOARD_LED_BLUE_PORT, BOARD_LED_BLUE_PIN, &LED_BLUE);\n\n    const port_pin_config_t LED_RED = {/* Internal pull-up/down resistor is disabled */\n                                       kPORT_PullDisable,\n                                       /* Slow slew rate is configured */\n                                       kPORT_SlowSlewRate,\n                                       /* Passive filter is disabled */\n                                       kPORT_PassiveFilterDisable,\n                                       /* Open drain is disabled */\n                                       kPORT_OpenDrainDisable,\n                                       /* Low drive strength is configured */\n                                       kPORT_LowDriveStrength,\n                                       /* Pin is configured as PTB22 */\n                                       kPORT_MuxAsGpio,\n                                       /* Pin Control Register fields [15:0] are not locked */\n                                       kPORT_UnlockRegister};\n    /* PORTB22 (pin 68) is configured as PTB22 */\n    PORT_SetPinConfig(BOARD_LED_RED_PORT, BOARD_LED_RED_PIN, &LED_RED);\n\n    const port_pin_config_t LED_GREEN = {/* Internal pull-up/down resistor is disabled */\n                                         kPORT_PullDisable,\n                                         /* Slow slew rate is configured */\n                                         kPORT_SlowSlewRate,\n                                         /* Passive filter is disabled */\n                                         kPORT_PassiveFilterDisable,\n                                         /* Open drain is disabled */\n                                         kPORT_OpenDrainDisable,\n                                         /* Low drive strength is configured */\n                                         kPORT_LowDriveStrength,\n                                         /* Pin is configured as PTE26 */\n                                         kPORT_MuxAsGpio,\n                                         /* Pin Control Register fields [15:0] are not locked */\n                                         kPORT_UnlockRegister};\n    /* PORTE26 (pin 33) is configured as PTE26 */\n    PORT_SetPinConfig(BOARD_LED_GREEN_PORT, BOARD_LED_GREEN_PIN, &LED_GREEN);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UART:\n- options: {callFromInitBoot: 'true', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '63', peripheral: UART0, signal: TX, pin_signal: PTB17/SPI1_SIN/UART0_TX/FTM_CLKIN1/FB_AD16/EWM_OUT_b, direction: OUTPUT, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '62', peripheral: UART0, signal: RX, pin_signal: PTB16/SPI1_SOUT/UART0_RX/FTM_CLKIN0/FB_AD17/EWM_IN, slew_rate: fast, open_drain: disable, drive_strength: low,\n    pull_select: down, pull_enable: disable, passive_filter: disable}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UART\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UART(void)\n{\n    /* Port B Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortB);\n\n    const port_pin_config_t DEBUG_UART_RX = {/* Internal pull-up/down resistor is disabled */\n                                             kPORT_PullDisable,\n                                             /* Fast slew rate is configured */\n                                             kPORT_FastSlewRate,\n                                             /* Passive filter is disabled */\n                                             kPORT_PassiveFilterDisable,\n                                             /* Open drain is disabled */\n                                             kPORT_OpenDrainDisable,\n                                             /* Low drive strength is configured */\n                                             kPORT_LowDriveStrength,\n                                             /* Pin is configured as UART0_RX */\n                                             kPORT_MuxAlt3,\n                                             /* Pin Control Register fields [15:0] are not locked */\n                                             kPORT_UnlockRegister};\n    /* PORTB16 (pin 62) is configured as UART0_RX */\n    PORT_SetPinConfig(BOARD_DEBUG_UART_RX_PORT, BOARD_DEBUG_UART_RX_PIN, &DEBUG_UART_RX);\n\n    const port_pin_config_t DEBUG_UART_TX = {/* Internal pull-up/down resistor is disabled */\n                                             kPORT_PullDisable,\n                                             /* Fast slew rate is configured */\n                                             kPORT_FastSlewRate,\n                                             /* Passive filter is disabled */\n                                             kPORT_PassiveFilterDisable,\n                                             /* Open drain is disabled */\n                                             kPORT_OpenDrainDisable,\n                                             /* Low drive strength is configured */\n                                             kPORT_LowDriveStrength,\n                                             /* Pin is configured as UART0_TX */\n                                             kPORT_MuxAlt3,\n                                             /* Pin Control Register fields [15:0] are not locked */\n                                             kPORT_UnlockRegister};\n    /* PORTB17 (pin 63) is configured as UART0_TX */\n    PORT_SetPinConfig(BOARD_DEBUG_UART_TX_PORT, BOARD_DEBUG_UART_TX_PIN, &DEBUG_UART_TX);\n\n    SIM->SOPT5 = ((SIM->SOPT5 &\n                   /* Mask bits to zero which are setting */\n                   (~(SIM_SOPT5_UART0TXSRC_MASK)))\n\n                  /* UART 0 transmit data source select: UART0_TX pin. */\n                  | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitOSC:\n- options: {callFromInitBoot: 'false', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '50', peripheral: OSC, signal: EXTAL0, pin_signal: EXTAL0/PTA18/FTM0_FLT2/FTM_CLKIN0, identifier: EXTAL0, slew_rate: no_init, open_drain: no_init, drive_strength: no_init,\n    pull_select: no_init, pull_enable: no_init, passive_filter: no_init}\n  - {pin_num: '29', peripheral: RTC, signal: EXTAL32, pin_signal: EXTAL32}\n  - {pin_num: '28', peripheral: RTC, signal: XTAL32, pin_signal: XTAL32}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitOSC\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitOSC(void)\n{\n    /* Port A Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortA);\n\n    /* PORTA18 (pin 50) is configured as EXTAL0 */\n    PORT_SetPinMux(BOARD_EXTAL0_PORT, BOARD_EXTAL0_PIN, kPORT_PinDisabledOrAnalog);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitACCEL:\n- options: {callFromInitBoot: 'false', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '32', peripheral: I2C0, signal: SDA, pin_signal: ADC0_SE18/PTE25/UART4_RX/I2C0_SDA/EWM_IN, slew_rate: fast, open_drain: enable, drive_strength: low,\n    pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '31', peripheral: I2C0, signal: SCL, pin_signal: ADC0_SE17/PTE24/UART4_TX/I2C0_SCL/EWM_OUT_b, slew_rate: fast, open_drain: enable, drive_strength: low,\n    pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '78', peripheral: GPIOC, signal: 'GPIO, 6', pin_signal: CMP0_IN0/PTC6/LLWU_P10/SPI0_SOUT/PDB0_EXTRG/I2S0_RX_BCLK/FB_AD9/I2S0_MCLK, identifier: ACCEL_INT1,\n    direction: INPUT, slew_rate: fast, open_drain: enable, drive_strength: low, pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '85', peripheral: GPIOC, signal: 'GPIO, 13', pin_signal: PTC13/UART4_CTS_b/FB_AD26, direction: INPUT, slew_rate: fast, open_drain: enable, drive_strength: low,\n    pull_select: up, pull_enable: enable, passive_filter: disable}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitACCEL\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitACCEL(void)\n{\n    /* Port C Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortC);\n    /* Port E Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortE);\n\n    gpio_pin_config_t ACCEL_INT1_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PTC6 (pin 78)  */\n    GPIO_PinInit(BOARD_ACCEL_INT1_GPIO, BOARD_ACCEL_INT1_PIN, &ACCEL_INT1_config);\n\n    gpio_pin_config_t ACCEL_INT2_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PTC13 (pin 85)  */\n    GPIO_PinInit(BOARD_ACCEL_INT2_GPIO, BOARD_ACCEL_INT2_PIN, &ACCEL_INT2_config);\n\n    const port_pin_config_t ACCEL_INT2 = {/* Internal pull-up resistor is enabled */\n                                          kPORT_PullUp,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is enabled */\n                                          kPORT_OpenDrainEnable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as PTC13 */\n                                          kPORT_MuxAsGpio,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTC13 (pin 85) is configured as PTC13 */\n    PORT_SetPinConfig(BOARD_ACCEL_INT2_PORT, BOARD_ACCEL_INT2_PIN, &ACCEL_INT2);\n\n    const port_pin_config_t ACCEL_INT1 = {/* Internal pull-up resistor is enabled */\n                                          kPORT_PullUp,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is enabled */\n                                          kPORT_OpenDrainEnable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as PTC6 */\n                                          kPORT_MuxAsGpio,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTC6 (pin 78) is configured as PTC6 */\n    PORT_SetPinConfig(BOARD_ACCEL_INT1_PORT, BOARD_ACCEL_INT1_PIN, &ACCEL_INT1);\n\n    const port_pin_config_t ACCEL_SCL = {/* Internal pull-up resistor is enabled */\n                                         kPORT_PullUp,\n                                         /* Fast slew rate is configured */\n                                         kPORT_FastSlewRate,\n                                         /* Passive filter is disabled */\n                                         kPORT_PassiveFilterDisable,\n                                         /* Open drain is enabled */\n                                         kPORT_OpenDrainEnable,\n                                         /* Low drive strength is configured */\n                                         kPORT_LowDriveStrength,\n                                         /* Pin is configured as I2C0_SCL */\n                                         kPORT_MuxAlt5,\n                                         /* Pin Control Register fields [15:0] are not locked */\n                                         kPORT_UnlockRegister};\n    /* PORTE24 (pin 31) is configured as I2C0_SCL */\n    PORT_SetPinConfig(BOARD_ACCEL_SCL_PORT, BOARD_ACCEL_SCL_PIN, &ACCEL_SCL);\n\n    const port_pin_config_t ACCEL_SDA = {/* Internal pull-up resistor is enabled */\n                                         kPORT_PullUp,\n                                         /* Fast slew rate is configured */\n                                         kPORT_FastSlewRate,\n                                         /* Passive filter is disabled */\n                                         kPORT_PassiveFilterDisable,\n                                         /* Open drain is enabled */\n                                         kPORT_OpenDrainEnable,\n                                         /* Low drive strength is configured */\n                                         kPORT_LowDriveStrength,\n                                         /* Pin is configured as I2C0_SDA */\n                                         kPORT_MuxAlt5,\n                                         /* Pin Control Register fields [15:0] are not locked */\n                                         kPORT_UnlockRegister};\n    /* PORTE25 (pin 32) is configured as I2C0_SDA */\n    PORT_SetPinConfig(BOARD_ACCEL_SDA_PORT, BOARD_ACCEL_SDA_PIN, &ACCEL_SDA);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitENET:\n- options: {callFromInitBoot: 'false', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '54', peripheral: ENET, signal: RMII_MDC, pin_signal: ADC0_SE9/ADC1_SE9/PTB1/I2C0_SDA/FTM1_CH1/RMII0_MDC/MII0_MDC/FTM1_QD_PHB, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '53', peripheral: ENET, signal: RMII_MDIO, pin_signal: ADC0_SE8/ADC1_SE8/PTB0/LLWU_P5/I2C0_SCL/FTM1_CH0/RMII0_MDIO/MII0_MDIO/FTM1_QD_PHA, slew_rate: fast,\n    open_drain: enable, drive_strength: low, pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '43', peripheral: ENET, signal: RMII_RXD0, pin_signal: CMP2_IN1/PTA13/LLWU_P4/CAN0_RX/FTM1_CH1/RMII0_RXD0/MII0_RXD0/I2C2_SDA/I2S0_TX_FS/FTM1_QD_PHB,\n    slew_rate: fast, open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '42', peripheral: ENET, signal: RMII_RXD1, pin_signal: CMP2_IN0/PTA12/CAN0_TX/FTM1_CH0/RMII0_RXD1/MII0_RXD1/I2C2_SCL/I2S0_TXD0/FTM1_QD_PHA, slew_rate: fast,\n    open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '39', peripheral: ENET, signal: RMII_RXER, pin_signal: PTA5/USB_CLKIN/FTM0_CH2/RMII0_RXER/MII0_RXER/CMP2_OUT/I2S0_TX_BCLK/JTAG_TRST_b, slew_rate: fast,\n    open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '46', peripheral: ENET, signal: RMII_TXD0, pin_signal: PTA16/SPI0_SOUT/UART0_CTS_b/UART0_COL_b/RMII0_TXD0/MII0_TXD0/I2S0_RX_FS/I2S0_RXD1, slew_rate: fast,\n    open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '47', peripheral: ENET, signal: RMII_TXD1, pin_signal: ADC1_SE17/PTA17/SPI0_SIN/UART0_RTS_b/RMII0_TXD1/MII0_TXD1/I2S0_MCLK, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '45', peripheral: ENET, signal: RMII_TXEN, pin_signal: PTA15/SPI0_SCK/UART0_RX/RMII0_TXEN/MII0_TXEN/I2S0_RXD0, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '44', peripheral: ENET, signal: RMII_CRS_DV, pin_signal: PTA14/SPI0_PCS0/UART0_TX/RMII0_CRS_DV/MII0_RXDV/I2C2_SCL/I2S0_RX_BCLK/I2S0_TXD1, slew_rate: fast,\n    open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n  - {pin_num: '50', peripheral: ENET, signal: RMII_CLKIN, pin_signal: EXTAL0/PTA18/FTM0_FLT2/FTM_CLKIN0, identifier: RMII_RXCLK, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitENET\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitENET(void)\n{\n    /* Port A Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortA);\n    /* Port B Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortB);\n\n    const port_pin_config_t RMII0_RXD1 = {/* Internal pull-up/down resistor is disabled */\n                                          kPORT_PullDisable,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is disabled */\n                                          kPORT_OpenDrainDisable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as RMII0_RXD1 */\n                                          kPORT_MuxAlt4,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTA12 (pin 42) is configured as RMII0_RXD1 */\n    PORT_SetPinConfig(BOARD_RMII0_RXD1_PORT, BOARD_RMII0_RXD1_PIN, &RMII0_RXD1);\n\n    const port_pin_config_t RMII0_RXD0 = {/* Internal pull-up/down resistor is disabled */\n                                          kPORT_PullDisable,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is disabled */\n                                          kPORT_OpenDrainDisable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as RMII0_RXD0 */\n                                          kPORT_MuxAlt4,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTA13 (pin 43) is configured as RMII0_RXD0 */\n    PORT_SetPinConfig(BOARD_RMII0_RXD0_PORT, BOARD_RMII0_RXD0_PIN, &RMII0_RXD0);\n\n    const port_pin_config_t RMII0_CRS_DV = {/* Internal pull-up/down resistor is disabled */\n                                            kPORT_PullDisable,\n                                            /* Fast slew rate is configured */\n                                            kPORT_FastSlewRate,\n                                            /* Passive filter is disabled */\n                                            kPORT_PassiveFilterDisable,\n                                            /* Open drain is disabled */\n                                            kPORT_OpenDrainDisable,\n                                            /* Low drive strength is configured */\n                                            kPORT_LowDriveStrength,\n                                            /* Pin is configured as RMII0_CRS_DV */\n                                            kPORT_MuxAlt4,\n                                            /* Pin Control Register fields [15:0] are not locked */\n                                            kPORT_UnlockRegister};\n    /* PORTA14 (pin 44) is configured as RMII0_CRS_DV */\n    PORT_SetPinConfig(BOARD_RMII0_CRS_DV_PORT, BOARD_RMII0_CRS_DV_PIN, &RMII0_CRS_DV);\n\n    const port_pin_config_t RMII0_TXEN = {/* Internal pull-up/down resistor is disabled */\n                                          kPORT_PullDisable,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is disabled */\n                                          kPORT_OpenDrainDisable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as RMII0_TXEN */\n                                          kPORT_MuxAlt4,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTA15 (pin 45) is configured as RMII0_TXEN */\n    PORT_SetPinConfig(BOARD_RMII0_TXEN_PORT, BOARD_RMII0_TXEN_PIN, &RMII0_TXEN);\n\n    const port_pin_config_t RMII0_TXD0 = {/* Internal pull-up/down resistor is disabled */\n                                          kPORT_PullDisable,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is disabled */\n                                          kPORT_OpenDrainDisable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as RMII0_TXD0 */\n                                          kPORT_MuxAlt4,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTA16 (pin 46) is configured as RMII0_TXD0 */\n    PORT_SetPinConfig(BOARD_RMII0_TXD0_PORT, BOARD_RMII0_TXD0_PIN, &RMII0_TXD0);\n\n    const port_pin_config_t RMII0_TXD1 = {/* Internal pull-up/down resistor is disabled */\n                                          kPORT_PullDisable,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is disabled */\n                                          kPORT_OpenDrainDisable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as RMII0_TXD1 */\n                                          kPORT_MuxAlt4,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTA17 (pin 47) is configured as RMII0_TXD1 */\n    PORT_SetPinConfig(BOARD_RMII0_TXD1_PORT, BOARD_RMII0_TXD1_PIN, &RMII0_TXD1);\n\n    const port_pin_config_t RMII_RXCLK = {/* Internal pull-up/down resistor is disabled */\n                                          kPORT_PullDisable,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is disabled */\n                                          kPORT_OpenDrainDisable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as EXTAL0 */\n                                          kPORT_PinDisabledOrAnalog,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTA18 (pin 50) is configured as EXTAL0 */\n    PORT_SetPinConfig(BOARD_RMII_RXCLK_PORT, BOARD_RMII_RXCLK_PIN, &RMII_RXCLK);\n\n    const port_pin_config_t RMII0_RXER = {/* Internal pull-up/down resistor is disabled */\n                                          kPORT_PullDisable,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is disabled */\n                                          kPORT_OpenDrainDisable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as RMII0_RXER */\n                                          kPORT_MuxAlt4,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTA5 (pin 39) is configured as RMII0_RXER */\n    PORT_SetPinConfig(BOARD_RMII0_RXER_PORT, BOARD_RMII0_RXER_PIN, &RMII0_RXER);\n\n    const port_pin_config_t RMII0_MDIO = {/* Internal pull-up resistor is enabled */\n                                          kPORT_PullUp,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is enabled */\n                                          kPORT_OpenDrainEnable,\n                                          /* Low drive strength is configured */\n                                          kPORT_LowDriveStrength,\n                                          /* Pin is configured as RMII0_MDIO */\n                                          kPORT_MuxAlt4,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTB0 (pin 53) is configured as RMII0_MDIO */\n    PORT_SetPinConfig(BOARD_RMII0_MDIO_PORT, BOARD_RMII0_MDIO_PIN, &RMII0_MDIO);\n\n    const port_pin_config_t RMII0_MDC = {/* Internal pull-up/down resistor is disabled */\n                                         kPORT_PullDisable,\n                                         /* Fast slew rate is configured */\n                                         kPORT_FastSlewRate,\n                                         /* Passive filter is disabled */\n                                         kPORT_PassiveFilterDisable,\n                                         /* Open drain is disabled */\n                                         kPORT_OpenDrainDisable,\n                                         /* Low drive strength is configured */\n                                         kPORT_LowDriveStrength,\n                                         /* Pin is configured as RMII0_MDC */\n                                         kPORT_MuxAlt4,\n                                         /* Pin Control Register fields [15:0] are not locked */\n                                         kPORT_UnlockRegister};\n    /* PORTB1 (pin 54) is configured as RMII0_MDC */\n    PORT_SetPinConfig(BOARD_RMII0_MDC_PORT, BOARD_RMII0_MDC_PIN, &RMII0_MDC);\n\n    SIM->SOPT2 = ((SIM->SOPT2 &\n                   /* Mask bits to zero which are setting */\n                   (~(SIM_SOPT2_RMIISRC_MASK)))\n\n                  /* RMII clock source select: EXTAL clock. */\n                  | SIM_SOPT2_RMIISRC(SOPT2_RMIISRC_EXTAL));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSDHC:\n- options: {callFromInitBoot: 'false', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '1', peripheral: SDHC, signal: 'DATA, 1', pin_signal: ADC1_SE4a/PTE0/SPI1_PCS1/UART1_TX/SDHC0_D1/TRACE_CLKOUT/I2C1_SDA/RTC_CLKOUT, slew_rate: fast,\n    open_drain: disable, drive_strength: high, pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '2', peripheral: SDHC, signal: 'DATA, 0', pin_signal: ADC1_SE5a/PTE1/LLWU_P0/SPI1_SOUT/UART1_RX/SDHC0_D0/TRACE_D3/I2C1_SCL/SPI1_SIN, slew_rate: fast,\n    open_drain: disable, drive_strength: high, pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '3', peripheral: SDHC, signal: DCLK, pin_signal: ADC0_DP2/ADC1_SE6a/PTE2/LLWU_P1/SPI1_SCK/UART1_CTS_b/SDHC0_DCLK/TRACE_D2, slew_rate: fast, open_drain: disable,\n    drive_strength: high, pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '4', peripheral: SDHC, signal: CMD, pin_signal: ADC0_DM2/ADC1_SE7a/PTE3/SPI1_SIN/UART1_RTS_b/SDHC0_CMD/TRACE_D1/SPI1_SOUT, slew_rate: fast, open_drain: disable,\n    drive_strength: high, pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '5', peripheral: SDHC, signal: 'DATA, 3', pin_signal: PTE4/LLWU_P2/SPI1_PCS0/UART3_TX/SDHC0_D3/TRACE_D0, slew_rate: fast, open_drain: disable, drive_strength: high,\n    pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '6', peripheral: SDHC, signal: 'DATA, 2', pin_signal: PTE5/SPI1_PCS2/UART3_RX/SDHC0_D2/FTM3_CH0, slew_rate: fast, open_drain: disable, drive_strength: high,\n    pull_select: up, pull_enable: enable, passive_filter: disable}\n  - {pin_num: '7', peripheral: GPIOE, signal: 'GPIO, 6', pin_signal: PTE6/SPI1_PCS3/UART3_CTS_b/I2S0_MCLK/FTM3_CH1/USB_SOF_OUT, direction: INPUT, slew_rate: slow,\n    open_drain: disable, drive_strength: low, pull_select: down, pull_enable: enable, passive_filter: disable}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSDHC\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitSDHC(void)\n{\n    /* Port E Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortE);\n\n    gpio_pin_config_t SDHC_CD_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PTE6 (pin 7)  */\n    GPIO_PinInit(BOARD_SDHC_CD_GPIO, BOARD_SDHC_CD_PIN, &SDHC_CD_config);\n\n    const port_pin_config_t SDHC0_D1 = {/* Internal pull-up resistor is enabled */\n                                        kPORT_PullUp,\n                                        /* Fast slew rate is configured */\n                                        kPORT_FastSlewRate,\n                                        /* Passive filter is disabled */\n                                        kPORT_PassiveFilterDisable,\n                                        /* Open drain is disabled */\n                                        kPORT_OpenDrainDisable,\n                                        /* High drive strength is configured */\n                                        kPORT_HighDriveStrength,\n                                        /* Pin is configured as SDHC0_D1 */\n                                        kPORT_MuxAlt4,\n                                        /* Pin Control Register fields [15:0] are not locked */\n                                        kPORT_UnlockRegister};\n    /* PORTE0 (pin 1) is configured as SDHC0_D1 */\n    PORT_SetPinConfig(BOARD_SDHC0_D1_PORT, BOARD_SDHC0_D1_PIN, &SDHC0_D1);\n\n    const port_pin_config_t SDHC0_D0 = {/* Internal pull-up resistor is enabled */\n                                        kPORT_PullUp,\n                                        /* Fast slew rate is configured */\n                                        kPORT_FastSlewRate,\n                                        /* Passive filter is disabled */\n                                        kPORT_PassiveFilterDisable,\n                                        /* Open drain is disabled */\n                                        kPORT_OpenDrainDisable,\n                                        /* High drive strength is configured */\n                                        kPORT_HighDriveStrength,\n                                        /* Pin is configured as SDHC0_D0 */\n                                        kPORT_MuxAlt4,\n                                        /* Pin Control Register fields [15:0] are not locked */\n                                        kPORT_UnlockRegister};\n    /* PORTE1 (pin 2) is configured as SDHC0_D0 */\n    PORT_SetPinConfig(BOARD_SDHC0_D0_PORT, BOARD_SDHC0_D0_PIN, &SDHC0_D0);\n\n    const port_pin_config_t SDHC0_DCLK = {/* Internal pull-up resistor is enabled */\n                                          kPORT_PullUp,\n                                          /* Fast slew rate is configured */\n                                          kPORT_FastSlewRate,\n                                          /* Passive filter is disabled */\n                                          kPORT_PassiveFilterDisable,\n                                          /* Open drain is disabled */\n                                          kPORT_OpenDrainDisable,\n                                          /* High drive strength is configured */\n                                          kPORT_HighDriveStrength,\n                                          /* Pin is configured as SDHC0_DCLK */\n                                          kPORT_MuxAlt4,\n                                          /* Pin Control Register fields [15:0] are not locked */\n                                          kPORT_UnlockRegister};\n    /* PORTE2 (pin 3) is configured as SDHC0_DCLK */\n    PORT_SetPinConfig(BOARD_SDHC0_DCLK_PORT, BOARD_SDHC0_DCLK_PIN, &SDHC0_DCLK);\n\n    const port_pin_config_t SDHC0_CMD = {/* Internal pull-up resistor is enabled */\n                                         kPORT_PullUp,\n                                         /* Fast slew rate is configured */\n                                         kPORT_FastSlewRate,\n                                         /* Passive filter is disabled */\n                                         kPORT_PassiveFilterDisable,\n                                         /* Open drain is disabled */\n                                         kPORT_OpenDrainDisable,\n                                         /* High drive strength is configured */\n                                         kPORT_HighDriveStrength,\n                                         /* Pin is configured as SDHC0_CMD */\n                                         kPORT_MuxAlt4,\n                                         /* Pin Control Register fields [15:0] are not locked */\n                                         kPORT_UnlockRegister};\n    /* PORTE3 (pin 4) is configured as SDHC0_CMD */\n    PORT_SetPinConfig(BOARD_SDHC0_CMD_PORT, BOARD_SDHC0_CMD_PIN, &SDHC0_CMD);\n\n    const port_pin_config_t SDHC0_D3 = {/* Internal pull-up resistor is enabled */\n                                        kPORT_PullUp,\n                                        /* Fast slew rate is configured */\n                                        kPORT_FastSlewRate,\n                                        /* Passive filter is disabled */\n                                        kPORT_PassiveFilterDisable,\n                                        /* Open drain is disabled */\n                                        kPORT_OpenDrainDisable,\n                                        /* High drive strength is configured */\n                                        kPORT_HighDriveStrength,\n                                        /* Pin is configured as SDHC0_D3 */\n                                        kPORT_MuxAlt4,\n                                        /* Pin Control Register fields [15:0] are not locked */\n                                        kPORT_UnlockRegister};\n    /* PORTE4 (pin 5) is configured as SDHC0_D3 */\n    PORT_SetPinConfig(BOARD_SDHC0_D3_PORT, BOARD_SDHC0_D3_PIN, &SDHC0_D3);\n\n    const port_pin_config_t SDHC0_D2 = {/* Internal pull-up resistor is enabled */\n                                        kPORT_PullUp,\n                                        /* Fast slew rate is configured */\n                                        kPORT_FastSlewRate,\n                                        /* Passive filter is disabled */\n                                        kPORT_PassiveFilterDisable,\n                                        /* Open drain is disabled */\n                                        kPORT_OpenDrainDisable,\n                                        /* High drive strength is configured */\n                                        kPORT_HighDriveStrength,\n                                        /* Pin is configured as SDHC0_D2 */\n                                        kPORT_MuxAlt4,\n                                        /* Pin Control Register fields [15:0] are not locked */\n                                        kPORT_UnlockRegister};\n    /* PORTE5 (pin 6) is configured as SDHC0_D2 */\n    PORT_SetPinConfig(BOARD_SDHC0_D2_PORT, BOARD_SDHC0_D2_PIN, &SDHC0_D2);\n\n    const port_pin_config_t SDHC_CD = {/* Internal pull-down resistor is enabled */\n                                       kPORT_PullDown,\n                                       /* Slow slew rate is configured */\n                                       kPORT_SlowSlewRate,\n                                       /* Passive filter is disabled */\n                                       kPORT_PassiveFilterDisable,\n                                       /* Open drain is disabled */\n                                       kPORT_OpenDrainDisable,\n                                       /* Low drive strength is configured */\n                                       kPORT_LowDriveStrength,\n                                       /* Pin is configured as PTE6 */\n                                       kPORT_MuxAsGpio,\n                                       /* Pin Control Register fields [15:0] are not locked */\n                                       kPORT_UnlockRegister};\n    /* PORTE6 (pin 7) is configured as PTE6 */\n    PORT_SetPinConfig(BOARD_SDHC_CD_PORT, BOARD_SDHC_CD_PIN, &SDHC_CD);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSB:\n- options: {callFromInitBoot: 'false', prefix: BOARD_, coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '10', peripheral: USB0, signal: DP, pin_signal: USB0_DP}\n  - {pin_num: '11', peripheral: USB0, signal: DM, pin_signal: USB0_DM}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSB\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitUSB(void)\n{\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/frdm_k64f/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n\n/*! @brief Direction type  */\ntypedef enum _pin_mux_direction\n{\n    kPIN_MUX_DirectionInput = 0U,        /* Input direction */\n    kPIN_MUX_DirectionOutput = 1U,       /* Output direction */\n    kPIN_MUX_DirectionInputOrOutput = 2U /* Input or output direction */\n} pin_mux_direction_t;\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n/*! @name PORTC6 (number 78), U8[11]/SW2\n  @{ */\n/* Routed pin properties */\n#define BOARD_SW2_PERIPHERAL GPIOC                  /*!<@brief Peripheral name */\n#define BOARD_SW2_SIGNAL GPIO                       /*!<@brief Signal name */\n#define BOARD_SW2_CHANNEL 6                         /*!<@brief Signal channel */\n#define BOARD_SW2_PIN_NAME PTC6                     /*!<@brief Routed pin name */\n#define BOARD_SW2_LABEL \"U8[11]/SW2\"                /*!<@brief Label */\n#define BOARD_SW2_NAME \"SW2\"                        /*!<@brief Identifier */\n#define BOARD_SW2_DIRECTION kPIN_MUX_DirectionInput /*!<@brief Direction */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_SW2_GPIO GPIOC                        /*!<@brief GPIO peripheral base pointer */\n#define BOARD_SW2_GPIO_PIN 6U                       /*!<@brief GPIO pin number */\n#define BOARD_SW2_GPIO_PIN_MASK (1U << 6U)          /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SW2_PORT PORTC                        /*!<@brief PORT peripheral base pointer */\n#define BOARD_SW2_PIN 6U                            /*!<@brief PORT pin number */\n#define BOARD_SW2_PIN_MASK (1U << 6U)               /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*! @name PORTA4 (number 38), SW3\n  @{ */\n/* Routed pin properties */\n#define BOARD_SW3_PERIPHERAL GPIOA                  /*!<@brief Peripheral name */\n#define BOARD_SW3_SIGNAL GPIO                       /*!<@brief Signal name */\n#define BOARD_SW3_CHANNEL 4                         /*!<@brief Signal channel */\n#define BOARD_SW3_PIN_NAME PTA4                     /*!<@brief Routed pin name */\n#define BOARD_SW3_LABEL \"SW3\"                       /*!<@brief Label */\n#define BOARD_SW3_NAME \"SW3\"                        /*!<@brief Identifier */\n#define BOARD_SW3_DIRECTION kPIN_MUX_DirectionInput /*!<@brief Direction */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_SW3_GPIO GPIOA                        /*!<@brief GPIO peripheral base pointer */\n#define BOARD_SW3_GPIO_PIN 4U                       /*!<@brief GPIO pin number */\n#define BOARD_SW3_GPIO_PIN_MASK (1U << 4U)          /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SW3_PORT PORTA                        /*!<@brief PORT peripheral base pointer */\n#define BOARD_SW3_PIN 4U                            /*!<@brief PORT pin number */\n#define BOARD_SW3_PIN_MASK (1U << 4U)               /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitButtons(void);\n\n/*! @name PORTB21 (number 67), D12[3]/LEDRGB_BLUE\n  @{ */\n/* Routed pin properties */\n#define BOARD_LED_BLUE_PERIPHERAL GPIOB                   /*!<@brief Peripheral name */\n#define BOARD_LED_BLUE_SIGNAL GPIO                        /*!<@brief Signal name */\n#define BOARD_LED_BLUE_CHANNEL 21                         /*!<@brief Signal channel */\n#define BOARD_LED_BLUE_PIN_NAME PTB21                     /*!<@brief Routed pin name */\n#define BOARD_LED_BLUE_LABEL \"D12[3]/LEDRGB_BLUE\"         /*!<@brief Label */\n#define BOARD_LED_BLUE_NAME \"LED_BLUE\"                    /*!<@brief Identifier */\n#define BOARD_LED_BLUE_DIRECTION kPIN_MUX_DirectionOutput /*!<@brief Direction */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_LED_BLUE_GPIO GPIOB                         /*!<@brief GPIO peripheral base pointer */\n#define BOARD_LED_BLUE_GPIO_PIN 21U                       /*!<@brief GPIO pin number */\n#define BOARD_LED_BLUE_GPIO_PIN_MASK (1U << 21U)          /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_LED_BLUE_PORT PORTB                         /*!<@brief PORT peripheral base pointer */\n#define BOARD_LED_BLUE_PIN 21U                            /*!<@brief PORT pin number */\n#define BOARD_LED_BLUE_PIN_MASK (1U << 21U)               /*!<@brief PORT pin mask */\n                                                          /* @} */\n\n/*! @name PORTB22 (number 68), D12[1]/LEDRGB_RED\n  @{ */\n/* Routed pin properties */\n#define BOARD_LED_RED_PERIPHERAL GPIOB                   /*!<@brief Peripheral name */\n#define BOARD_LED_RED_SIGNAL GPIO                        /*!<@brief Signal name */\n#define BOARD_LED_RED_CHANNEL 22                         /*!<@brief Signal channel */\n#define BOARD_LED_RED_PIN_NAME PTB22                     /*!<@brief Routed pin name */\n#define BOARD_LED_RED_LABEL \"D12[1]/LEDRGB_RED\"          /*!<@brief Label */\n#define BOARD_LED_RED_NAME \"LED_RED\"                     /*!<@brief Identifier */\n#define BOARD_LED_RED_DIRECTION kPIN_MUX_DirectionOutput /*!<@brief Direction */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_LED_RED_GPIO GPIOB                         /*!<@brief GPIO peripheral base pointer */\n#define BOARD_LED_RED_GPIO_PIN 22U                       /*!<@brief GPIO pin number */\n#define BOARD_LED_RED_GPIO_PIN_MASK (1U << 22U)          /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_LED_RED_PORT PORTB                         /*!<@brief PORT peripheral base pointer */\n#define BOARD_LED_RED_PIN 22U                            /*!<@brief PORT pin number */\n#define BOARD_LED_RED_PIN_MASK (1U << 22U)               /*!<@brief PORT pin mask */\n                                                         /* @} */\n\n/*! @name PORTE26 (number 33), J2[1]/D12[4]/LEDRGB_GREEN\n  @{ */\n/* Routed pin properties */\n#define BOARD_LED_GREEN_PERIPHERAL GPIOE                   /*!<@brief Peripheral name */\n#define BOARD_LED_GREEN_SIGNAL GPIO                        /*!<@brief Signal name */\n#define BOARD_LED_GREEN_CHANNEL 26                         /*!<@brief Signal channel */\n#define BOARD_LED_GREEN_PIN_NAME PTE26                     /*!<@brief Routed pin name */\n#define BOARD_LED_GREEN_LABEL \"J2[1]/D12[4]/LEDRGB_GREEN\"  /*!<@brief Label */\n#define BOARD_LED_GREEN_NAME \"LED_GREEN\"                   /*!<@brief Identifier */\n#define BOARD_LED_GREEN_DIRECTION kPIN_MUX_DirectionOutput /*!<@brief Direction */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_LED_GREEN_GPIO GPIOE                         /*!<@brief GPIO peripheral base pointer */\n#define BOARD_LED_GREEN_GPIO_PIN 26U                       /*!<@brief GPIO pin number */\n#define BOARD_LED_GREEN_GPIO_PIN_MASK (1U << 26U)          /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_LED_GREEN_PORT PORTE                         /*!<@brief PORT peripheral base pointer */\n#define BOARD_LED_GREEN_PIN 26U                            /*!<@brief PORT pin number */\n#define BOARD_LED_GREEN_PIN_MASK (1U << 26U)               /*!<@brief PORT pin mask */\n                                                           /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLEDs(void);\n\n#define SOPT5_UART0TXSRC_UART_TX 0x00u /*!<@brief UART 0 transmit data source select: UART0_TX pin */\n\n/*! @name PORTB17 (number 63), U10[1]/UART0_TX\n  @{ */\n/* Routed pin properties */\n#define BOARD_DEBUG_UART_TX_PERIPHERAL UART0                   /*!<@brief Peripheral name */\n#define BOARD_DEBUG_UART_TX_SIGNAL TX                          /*!<@brief Signal name */\n#define BOARD_DEBUG_UART_TX_PIN_NAME UART0_TX                  /*!<@brief Routed pin name */\n#define BOARD_DEBUG_UART_TX_LABEL \"U10[1]/UART0_TX\"            /*!<@brief Label */\n#define BOARD_DEBUG_UART_TX_NAME \"DEBUG_UART_TX\"               /*!<@brief Identifier */\n#define BOARD_DEBUG_UART_TX_DIRECTION kPIN_MUX_DirectionOutput /*!<@brief Direction */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_DEBUG_UART_TX_PORT PORTB                         /*!<@brief PORT peripheral base pointer */\n#define BOARD_DEBUG_UART_TX_PIN 17U                            /*!<@brief PORT pin number */\n#define BOARD_DEBUG_UART_TX_PIN_MASK (1U << 17U)               /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PORTB16 (number 62), U7[4]/UART0_RX\n  @{ */\n/* Routed pin properties */\n#define BOARD_DEBUG_UART_RX_PERIPHERAL UART0          /*!<@brief Peripheral name */\n#define BOARD_DEBUG_UART_RX_SIGNAL RX                 /*!<@brief Signal name */\n#define BOARD_DEBUG_UART_RX_PIN_NAME UART0_RX         /*!<@brief Routed pin name */\n#define BOARD_DEBUG_UART_RX_LABEL \"U7[4]/UART0_RX\"    /*!<@brief Label */\n#define BOARD_DEBUG_UART_RX_NAME \"DEBUG_UART_RX\"      /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_DEBUG_UART_RX_PORT PORTB                /*!<@brief PORT peripheral base pointer */\n#define BOARD_DEBUG_UART_RX_PIN 16U                   /*!<@brief PORT pin number */\n#define BOARD_DEBUG_UART_RX_PIN_MASK (1U << 16U)      /*!<@brief PORT pin mask */\n                                                      /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UART(void);\n\n/*! @name PORTA18 (number 50), U13[16]/RMII_RXCLK\n  @{ */\n/* Routed pin properties */\n#define BOARD_EXTAL0_PERIPHERAL OSC             /*!<@brief Peripheral name */\n#define BOARD_EXTAL0_SIGNAL EXTAL0              /*!<@brief Signal name */\n#define BOARD_EXTAL0_PIN_NAME EXTAL0            /*!<@brief Routed pin name */\n#define BOARD_EXTAL0_LABEL \"U13[16]/RMII_RXCLK\" /*!<@brief Label */\n#define BOARD_EXTAL0_NAME \"EXTAL0\"              /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_EXTAL0_PORT PORTA                 /*!<@brief PORT peripheral base pointer */\n#define BOARD_EXTAL0_PIN 18U                    /*!<@brief PORT pin number */\n#define BOARD_EXTAL0_PIN_MASK (1U << 18U)       /*!<@brief PORT pin mask */\n                                                /* @} */\n\n/*! @name EXTAL32 (number 29), Y3[2]/EXTAL32_RTC\n  @{ */\n/* Routed pin properties */\n#define BOARD_ETAL32K_PERIPHERAL RTC            /*!<@brief Peripheral name */\n#define BOARD_ETAL32K_SIGNAL EXTAL32            /*!<@brief Signal name */\n#define BOARD_ETAL32K_PIN_NAME EXTAL32          /*!<@brief Routed pin name */\n#define BOARD_ETAL32K_LABEL \"Y3[2]/EXTAL32_RTC\" /*!<@brief Label */\n#define BOARD_ETAL32K_NAME \"ETAL32K\"            /*!<@brief Identifier */\n                                                /* @} */\n\n/*! @name XTAL32 (number 28), Y3[1]/XTAL32_RTC\n  @{ */\n/* Routed pin properties */\n#define BOARD_XTAL32K_PERIPHERAL RTC           /*!<@brief Peripheral name */\n#define BOARD_XTAL32K_SIGNAL XTAL32            /*!<@brief Signal name */\n#define BOARD_XTAL32K_PIN_NAME XTAL32          /*!<@brief Routed pin name */\n#define BOARD_XTAL32K_LABEL \"Y3[1]/XTAL32_RTC\" /*!<@brief Label */\n#define BOARD_XTAL32K_NAME \"XTAL32K\"           /*!<@brief Identifier */\n                                               /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitOSC(void);\n\n/*! @name PORTE25 (number 32), J2[18]/U8[6]/I2C0_SDA\n  @{ */\n/* Routed pin properties */\n#define BOARD_ACCEL_SDA_PERIPHERAL I2C0               /*!<@brief Peripheral name */\n#define BOARD_ACCEL_SDA_SIGNAL SDA                    /*!<@brief Signal name */\n#define BOARD_ACCEL_SDA_PIN_NAME I2C0_SDA             /*!<@brief Routed pin name */\n#define BOARD_ACCEL_SDA_LABEL \"J2[18]/U8[6]/I2C0_SDA\" /*!<@brief Label */\n#define BOARD_ACCEL_SDA_NAME \"ACCEL_SDA\"              /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_ACCEL_SDA_PORT PORTE                    /*!<@brief PORT peripheral base pointer */\n#define BOARD_ACCEL_SDA_PIN 25U                       /*!<@brief PORT pin number */\n#define BOARD_ACCEL_SDA_PIN_MASK (1U << 25U)          /*!<@brief PORT pin mask */\n                                                      /* @} */\n\n/*! @name PORTE24 (number 31), J2[20]/U8[4]/I2C0_SCL\n  @{ */\n/* Routed pin properties */\n#define BOARD_ACCEL_SCL_PERIPHERAL I2C0               /*!<@brief Peripheral name */\n#define BOARD_ACCEL_SCL_SIGNAL SCL                    /*!<@brief Signal name */\n#define BOARD_ACCEL_SCL_PIN_NAME I2C0_SCL             /*!<@brief Routed pin name */\n#define BOARD_ACCEL_SCL_LABEL \"J2[20]/U8[4]/I2C0_SCL\" /*!<@brief Label */\n#define BOARD_ACCEL_SCL_NAME \"ACCEL_SCL\"              /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_ACCEL_SCL_PORT PORTE                    /*!<@brief PORT peripheral base pointer */\n#define BOARD_ACCEL_SCL_PIN 24U                       /*!<@brief PORT pin number */\n#define BOARD_ACCEL_SCL_PIN_MASK (1U << 24U)          /*!<@brief PORT pin mask */\n                                                      /* @} */\n\n/*! @name PORTC6 (number 78), U8[11]/SW2\n  @{ */\n/* Routed pin properties */\n#define BOARD_ACCEL_INT1_PERIPHERAL GPIOC                  /*!<@brief Peripheral name */\n#define BOARD_ACCEL_INT1_SIGNAL GPIO                       /*!<@brief Signal name */\n#define BOARD_ACCEL_INT1_CHANNEL 6                         /*!<@brief Signal channel */\n#define BOARD_ACCEL_INT1_PIN_NAME PTC6                     /*!<@brief Routed pin name */\n#define BOARD_ACCEL_INT1_LABEL \"U8[11]/SW2\"                /*!<@brief Label */\n#define BOARD_ACCEL_INT1_NAME \"ACCEL_INT1\"                 /*!<@brief Identifier */\n#define BOARD_ACCEL_INT1_DIRECTION kPIN_MUX_DirectionInput /*!<@brief Direction */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_ACCEL_INT1_GPIO GPIOC                        /*!<@brief GPIO peripheral base pointer */\n#define BOARD_ACCEL_INT1_GPIO_PIN 6U                       /*!<@brief GPIO pin number */\n#define BOARD_ACCEL_INT1_GPIO_PIN_MASK (1U << 6U)          /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_ACCEL_INT1_PORT PORTC                        /*!<@brief PORT peripheral base pointer */\n#define BOARD_ACCEL_INT1_PIN 6U                            /*!<@brief PORT pin number */\n#define BOARD_ACCEL_INT1_PIN_MASK (1U << 6U)               /*!<@brief PORT pin mask */\n                                                           /* @} */\n\n/*! @name PORTC13 (number 85), U8[9]\n  @{ */\n/* Routed pin properties */\n#define BOARD_ACCEL_INT2_PERIPHERAL GPIOC                  /*!<@brief Peripheral name */\n#define BOARD_ACCEL_INT2_SIGNAL GPIO                       /*!<@brief Signal name */\n#define BOARD_ACCEL_INT2_CHANNEL 13                        /*!<@brief Signal channel */\n#define BOARD_ACCEL_INT2_PIN_NAME PTC13                    /*!<@brief Routed pin name */\n#define BOARD_ACCEL_INT2_LABEL \"U8[9]\"                     /*!<@brief Label */\n#define BOARD_ACCEL_INT2_NAME \"ACCEL_INT2\"                 /*!<@brief Identifier */\n#define BOARD_ACCEL_INT2_DIRECTION kPIN_MUX_DirectionInput /*!<@brief Direction */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_ACCEL_INT2_GPIO GPIOC                        /*!<@brief GPIO peripheral base pointer */\n#define BOARD_ACCEL_INT2_GPIO_PIN 13U                      /*!<@brief GPIO pin number */\n#define BOARD_ACCEL_INT2_GPIO_PIN_MASK (1U << 13U)         /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_ACCEL_INT2_PORT PORTC                        /*!<@brief PORT peripheral base pointer */\n#define BOARD_ACCEL_INT2_PIN 13U                           /*!<@brief PORT pin number */\n#define BOARD_ACCEL_INT2_PIN_MASK (1U << 13U)              /*!<@brief PORT pin mask */\n                                                           /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitACCEL(void);\n\n#define SOPT2_RMIISRC_EXTAL 0x00u /*!<@brief RMII clock source select: EXTAL clock */\n\n/*! @name PORTB1 (number 54), U13[11]/RMII0_MDC\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_MDC_PERIPHERAL ENET           /*!<@brief Peripheral name */\n#define BOARD_RMII0_MDC_SIGNAL RMII_MDC           /*!<@brief Signal name */\n#define BOARD_RMII0_MDC_PIN_NAME RMII0_MDC        /*!<@brief Routed pin name */\n#define BOARD_RMII0_MDC_LABEL \"U13[11]/RMII0_MDC\" /*!<@brief Label */\n#define BOARD_RMII0_MDC_NAME \"RMII0_MDC\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_MDC_PORT PORTB                /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_MDC_PIN 1U                    /*!<@brief PORT pin number */\n#define BOARD_RMII0_MDC_PIN_MASK (1U << 1U)       /*!<@brief PORT pin mask */\n                                                  /* @} */\n\n/*! @name PORTB0 (number 53), U13[10]/RMII0_MDIO\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_MDIO_PERIPHERAL ENET            /*!<@brief Peripheral name */\n#define BOARD_RMII0_MDIO_SIGNAL RMII_MDIO           /*!<@brief Signal name */\n#define BOARD_RMII0_MDIO_PIN_NAME RMII0_MDIO        /*!<@brief Routed pin name */\n#define BOARD_RMII0_MDIO_LABEL \"U13[10]/RMII0_MDIO\" /*!<@brief Label */\n#define BOARD_RMII0_MDIO_NAME \"RMII0_MDIO\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_MDIO_PORT PORTB                 /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_MDIO_PIN 0U                     /*!<@brief PORT pin number */\n#define BOARD_RMII0_MDIO_PIN_MASK (1U << 0U)        /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*! @name PORTA13 (number 43), U13[13]/RMII0_RXD_0\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_RXD0_PERIPHERAL ENET             /*!<@brief Peripheral name */\n#define BOARD_RMII0_RXD0_SIGNAL RMII_RXD0            /*!<@brief Signal name */\n#define BOARD_RMII0_RXD0_PIN_NAME RMII0_RXD0         /*!<@brief Routed pin name */\n#define BOARD_RMII0_RXD0_LABEL \"U13[13]/RMII0_RXD_0\" /*!<@brief Label */\n#define BOARD_RMII0_RXD0_NAME \"RMII0_RXD0\"           /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_RXD0_PORT PORTA                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_RXD0_PIN 13U                     /*!<@brief PORT pin number */\n#define BOARD_RMII0_RXD0_PIN_MASK (1U << 13U)        /*!<@brief PORT pin mask */\n                                                     /* @} */\n\n/*! @name PORTA12 (number 42), U13[12]/RMII0_RXD_1\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_RXD1_PERIPHERAL ENET             /*!<@brief Peripheral name */\n#define BOARD_RMII0_RXD1_SIGNAL RMII_RXD1            /*!<@brief Signal name */\n#define BOARD_RMII0_RXD1_PIN_NAME RMII0_RXD1         /*!<@brief Routed pin name */\n#define BOARD_RMII0_RXD1_LABEL \"U13[12]/RMII0_RXD_1\" /*!<@brief Label */\n#define BOARD_RMII0_RXD1_NAME \"RMII0_RXD1\"           /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_RXD1_PORT PORTA                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_RXD1_PIN 12U                     /*!<@brief PORT pin number */\n#define BOARD_RMII0_RXD1_PIN_MASK (1U << 12U)        /*!<@brief PORT pin mask */\n                                                     /* @} */\n\n/*! @name PORTA5 (number 39), U13[17]/RMII0_RXER\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_RXER_PERIPHERAL ENET            /*!<@brief Peripheral name */\n#define BOARD_RMII0_RXER_SIGNAL RMII_RXER           /*!<@brief Signal name */\n#define BOARD_RMII0_RXER_PIN_NAME RMII0_RXER        /*!<@brief Routed pin name */\n#define BOARD_RMII0_RXER_LABEL \"U13[17]/RMII0_RXER\" /*!<@brief Label */\n#define BOARD_RMII0_RXER_NAME \"RMII0_RXER\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_RXER_PORT PORTA                 /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_RXER_PIN 5U                     /*!<@brief PORT pin number */\n#define BOARD_RMII0_RXER_PIN_MASK (1U << 5U)        /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*! @name PORTA16 (number 46), U13[20]/RMII0_TXD0\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_TXD0_PERIPHERAL ENET            /*!<@brief Peripheral name */\n#define BOARD_RMII0_TXD0_SIGNAL RMII_TXD0           /*!<@brief Signal name */\n#define BOARD_RMII0_TXD0_PIN_NAME RMII0_TXD0        /*!<@brief Routed pin name */\n#define BOARD_RMII0_TXD0_LABEL \"U13[20]/RMII0_TXD0\" /*!<@brief Label */\n#define BOARD_RMII0_TXD0_NAME \"RMII0_TXD0\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_TXD0_PORT PORTA                 /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_TXD0_PIN 16U                    /*!<@brief PORT pin number */\n#define BOARD_RMII0_TXD0_PIN_MASK (1U << 16U)       /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*! @name PORTA17 (number 47), U13[21]/RMII0_TXD1\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_TXD1_PERIPHERAL ENET            /*!<@brief Peripheral name */\n#define BOARD_RMII0_TXD1_SIGNAL RMII_TXD1           /*!<@brief Signal name */\n#define BOARD_RMII0_TXD1_PIN_NAME RMII0_TXD1        /*!<@brief Routed pin name */\n#define BOARD_RMII0_TXD1_LABEL \"U13[21]/RMII0_TXD1\" /*!<@brief Label */\n#define BOARD_RMII0_TXD1_NAME \"RMII0_TXD1\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_TXD1_PORT PORTA                 /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_TXD1_PIN 17U                    /*!<@brief PORT pin number */\n#define BOARD_RMII0_TXD1_PIN_MASK (1U << 17U)       /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*! @name PORTA15 (number 45), U13[19]/RMII0_TXEN\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_TXEN_PERIPHERAL ENET            /*!<@brief Peripheral name */\n#define BOARD_RMII0_TXEN_SIGNAL RMII_TXEN           /*!<@brief Signal name */\n#define BOARD_RMII0_TXEN_PIN_NAME RMII0_TXEN        /*!<@brief Routed pin name */\n#define BOARD_RMII0_TXEN_LABEL \"U13[19]/RMII0_TXEN\" /*!<@brief Label */\n#define BOARD_RMII0_TXEN_NAME \"RMII0_TXEN\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_TXEN_PORT PORTA                 /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_TXEN_PIN 15U                    /*!<@brief PORT pin number */\n#define BOARD_RMII0_TXEN_PIN_MASK (1U << 15U)       /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*! @name PORTA14 (number 44), U13[15]/RMII0_CRS_DV\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII0_CRS_DV_PERIPHERAL ENET              /*!<@brief Peripheral name */\n#define BOARD_RMII0_CRS_DV_SIGNAL RMII_CRS_DV           /*!<@brief Signal name */\n#define BOARD_RMII0_CRS_DV_PIN_NAME RMII0_CRS_DV        /*!<@brief Routed pin name */\n#define BOARD_RMII0_CRS_DV_LABEL \"U13[15]/RMII0_CRS_DV\" /*!<@brief Label */\n#define BOARD_RMII0_CRS_DV_NAME \"RMII0_CRS_DV\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII0_CRS_DV_PORT PORTA                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII0_CRS_DV_PIN 14U                      /*!<@brief PORT pin number */\n#define BOARD_RMII0_CRS_DV_PIN_MASK (1U << 14U)         /*!<@brief PORT pin mask */\n                                                        /* @} */\n\n/*! @name PORTA18 (number 50), U13[16]/RMII_RXCLK\n  @{ */\n/* Routed pin properties */\n#define BOARD_RMII_RXCLK_PERIPHERAL ENET            /*!<@brief Peripheral name */\n#define BOARD_RMII_RXCLK_SIGNAL RMII_CLKIN          /*!<@brief Signal name */\n#define BOARD_RMII_RXCLK_PIN_NAME EXTAL0            /*!<@brief Routed pin name */\n#define BOARD_RMII_RXCLK_LABEL \"U13[16]/RMII_RXCLK\" /*!<@brief Label */\n#define BOARD_RMII_RXCLK_NAME \"RMII_RXCLK\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_RMII_RXCLK_PORT PORTA                 /*!<@brief PORT peripheral base pointer */\n#define BOARD_RMII_RXCLK_PIN 18U                    /*!<@brief PORT pin number */\n#define BOARD_RMII_RXCLK_PIN_MASK (1U << 18U)       /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitENET(void);\n\n/*! @name PORTE0 (number 1), J15[P8]/SDHC0_D1\n  @{ */\n/* Routed pin properties */\n#define BOARD_SDHC0_D1_PERIPHERAL SDHC          /*!<@brief Peripheral name */\n#define BOARD_SDHC0_D1_SIGNAL DATA              /*!<@brief Signal name */\n#define BOARD_SDHC0_D1_CHANNEL 1                /*!<@brief Signal channel */\n#define BOARD_SDHC0_D1_PIN_NAME SDHC0_D1        /*!<@brief Routed pin name */\n#define BOARD_SDHC0_D1_LABEL \"J15[P8]/SDHC0_D1\" /*!<@brief Label */\n#define BOARD_SDHC0_D1_NAME \"SDHC0_D1\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SDHC0_D1_PORT PORTE               /*!<@brief PORT peripheral base pointer */\n#define BOARD_SDHC0_D1_PIN 0U                   /*!<@brief PORT pin number */\n#define BOARD_SDHC0_D1_PIN_MASK (1U << 0U)      /*!<@brief PORT pin mask */\n                                                /* @} */\n\n/*! @name PORTE1 (number 2), J15[P7]/SDHC0_D0\n  @{ */\n/* Routed pin properties */\n#define BOARD_SDHC0_D0_PERIPHERAL SDHC          /*!<@brief Peripheral name */\n#define BOARD_SDHC0_D0_SIGNAL DATA              /*!<@brief Signal name */\n#define BOARD_SDHC0_D0_CHANNEL 0                /*!<@brief Signal channel */\n#define BOARD_SDHC0_D0_PIN_NAME SDHC0_D0        /*!<@brief Routed pin name */\n#define BOARD_SDHC0_D0_LABEL \"J15[P7]/SDHC0_D0\" /*!<@brief Label */\n#define BOARD_SDHC0_D0_NAME \"SDHC0_D0\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SDHC0_D0_PORT PORTE               /*!<@brief PORT peripheral base pointer */\n#define BOARD_SDHC0_D0_PIN 1U                   /*!<@brief PORT pin number */\n#define BOARD_SDHC0_D0_PIN_MASK (1U << 1U)      /*!<@brief PORT pin mask */\n                                                /* @} */\n\n/*! @name PORTE2 (number 3), J15[P5]/SDHC0_DCLK\n  @{ */\n/* Routed pin properties */\n#define BOARD_SDHC0_DCLK_PERIPHERAL SDHC            /*!<@brief Peripheral name */\n#define BOARD_SDHC0_DCLK_SIGNAL DCLK                /*!<@brief Signal name */\n#define BOARD_SDHC0_DCLK_PIN_NAME SDHC0_DCLK        /*!<@brief Routed pin name */\n#define BOARD_SDHC0_DCLK_LABEL \"J15[P5]/SDHC0_DCLK\" /*!<@brief Label */\n#define BOARD_SDHC0_DCLK_NAME \"SDHC0_DCLK\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SDHC0_DCLK_PORT PORTE                 /*!<@brief PORT peripheral base pointer */\n#define BOARD_SDHC0_DCLK_PIN 2U                     /*!<@brief PORT pin number */\n#define BOARD_SDHC0_DCLK_PIN_MASK (1U << 2U)        /*!<@brief PORT pin mask */\n                                                    /* @} */\n\n/*! @name PORTE3 (number 4), J15[P3]/SDHC0_CMD\n  @{ */\n/* Routed pin properties */\n#define BOARD_SDHC0_CMD_PERIPHERAL SDHC           /*!<@brief Peripheral name */\n#define BOARD_SDHC0_CMD_SIGNAL CMD                /*!<@brief Signal name */\n#define BOARD_SDHC0_CMD_PIN_NAME SDHC0_CMD        /*!<@brief Routed pin name */\n#define BOARD_SDHC0_CMD_LABEL \"J15[P3]/SDHC0_CMD\" /*!<@brief Label */\n#define BOARD_SDHC0_CMD_NAME \"SDHC0_CMD\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SDHC0_CMD_PORT PORTE                /*!<@brief PORT peripheral base pointer */\n#define BOARD_SDHC0_CMD_PIN 3U                    /*!<@brief PORT pin number */\n#define BOARD_SDHC0_CMD_PIN_MASK (1U << 3U)       /*!<@brief PORT pin mask */\n                                                  /* @} */\n\n/*! @name PORTE4 (number 5), J15[P2]/SDHC0_D3\n  @{ */\n/* Routed pin properties */\n#define BOARD_SDHC0_D3_PERIPHERAL SDHC          /*!<@brief Peripheral name */\n#define BOARD_SDHC0_D3_SIGNAL DATA              /*!<@brief Signal name */\n#define BOARD_SDHC0_D3_CHANNEL 3                /*!<@brief Signal channel */\n#define BOARD_SDHC0_D3_PIN_NAME SDHC0_D3        /*!<@brief Routed pin name */\n#define BOARD_SDHC0_D3_LABEL \"J15[P2]/SDHC0_D3\" /*!<@brief Label */\n#define BOARD_SDHC0_D3_NAME \"SDHC0_D3\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SDHC0_D3_PORT PORTE               /*!<@brief PORT peripheral base pointer */\n#define BOARD_SDHC0_D3_PIN 4U                   /*!<@brief PORT pin number */\n#define BOARD_SDHC0_D3_PIN_MASK (1U << 4U)      /*!<@brief PORT pin mask */\n                                                /* @} */\n\n/*! @name PORTE5 (number 6), J15[P1]/SDHC0_D2\n  @{ */\n/* Routed pin properties */\n#define BOARD_SDHC0_D2_PERIPHERAL SDHC          /*!<@brief Peripheral name */\n#define BOARD_SDHC0_D2_SIGNAL DATA              /*!<@brief Signal name */\n#define BOARD_SDHC0_D2_CHANNEL 2                /*!<@brief Signal channel */\n#define BOARD_SDHC0_D2_PIN_NAME SDHC0_D2        /*!<@brief Routed pin name */\n#define BOARD_SDHC0_D2_LABEL \"J15[P1]/SDHC0_D2\" /*!<@brief Label */\n#define BOARD_SDHC0_D2_NAME \"SDHC0_D2\"          /*!<@brief Identifier */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SDHC0_D2_PORT PORTE               /*!<@brief PORT peripheral base pointer */\n#define BOARD_SDHC0_D2_PIN 5U                   /*!<@brief PORT pin number */\n#define BOARD_SDHC0_D2_PIN_MASK (1U << 5U)      /*!<@brief PORT pin mask */\n                                                /* @} */\n\n/*! @name PORTE6 (number 7), J15[G1]/SD_CARD_DETECT\n  @{ */\n/* Routed pin properties */\n#define BOARD_SDHC_CD_PERIPHERAL GPIOE                  /*!<@brief Peripheral name */\n#define BOARD_SDHC_CD_SIGNAL GPIO                       /*!<@brief Signal name */\n#define BOARD_SDHC_CD_CHANNEL 6                         /*!<@brief Signal channel */\n#define BOARD_SDHC_CD_PIN_NAME PTE6                     /*!<@brief Routed pin name */\n#define BOARD_SDHC_CD_LABEL \"J15[G1]/SD_CARD_DETECT\"    /*!<@brief Label */\n#define BOARD_SDHC_CD_NAME \"SDHC_CD\"                    /*!<@brief Identifier */\n#define BOARD_SDHC_CD_DIRECTION kPIN_MUX_DirectionInput /*!<@brief Direction */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_SDHC_CD_GPIO GPIOE                        /*!<@brief GPIO peripheral base pointer */\n#define BOARD_SDHC_CD_GPIO_PIN 6U                       /*!<@brief GPIO pin number */\n#define BOARD_SDHC_CD_GPIO_PIN_MASK (1U << 6U)          /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_SDHC_CD_PORT PORTE                        /*!<@brief PORT peripheral base pointer */\n#define BOARD_SDHC_CD_PIN 6U                            /*!<@brief PORT pin number */\n#define BOARD_SDHC_CD_PIN_MASK (1U << 6U)               /*!<@brief PORT pin mask */\n                                                        /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSDHC(void);\n\n/*! @name USB0_DP (number 10), J22[3]/K64_MICRO_USB_DP\n  @{ */\n/* Routed pin properties */\n#define BOARD_USB_DP_PERIPHERAL USB0                 /*!<@brief Peripheral name */\n#define BOARD_USB_DP_SIGNAL DP                       /*!<@brief Signal name */\n#define BOARD_USB_DP_PIN_NAME USB0_DP                /*!<@brief Routed pin name */\n#define BOARD_USB_DP_LABEL \"J22[3]/K64_MICRO_USB_DP\" /*!<@brief Label */\n#define BOARD_USB_DP_NAME \"USB_DP\"                   /*!<@brief Identifier */\n                                                     /* @} */\n\n/*! @name USB0_DM (number 11), J22[2]/K64_MICRO_USB_DN\n  @{ */\n/* Routed pin properties */\n#define BOARD_USB_DM_PERIPHERAL USB0                 /*!<@brief Peripheral name */\n#define BOARD_USB_DM_SIGNAL DM                       /*!<@brief Signal name */\n#define BOARD_USB_DM_PIN_NAME USB0_DM                /*!<@brief Routed pin name */\n#define BOARD_USB_DM_LABEL \"J22[2]/K64_MICRO_USB_DN\" /*!<@brief Label */\n#define BOARD_USB_DM_NAME \"USB_DM\"                   /*!<@brief Identifier */\n                                                     /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSB(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/frdm_k64f/board.cmake",
    "content": "set(MCU_VARIANT MK64F12)\n\nset(JLINK_DEVICE MK64FN1M0xxx12)\nset(PYOCD_TARGET k64f)\n\nset(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/MK64FN1M0xxx12_flash.ld)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/board/pin_mux.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/board/clock_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MK64FN1M0VMD12\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/frdm_k64f/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* metadata:\n   name: Freedom K64F\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/general-purpose-mcus/freedom-development-platform-for-kinetis-k64-k63-and-k24-mcus:FRDM-K64F\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n// LED\n#define LED_PORT              BOARD_LED_RED_GPIO\n#define LED_PIN               BOARD_LED_RED_GPIO_PIN\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           BOARD_SW2_GPIO\n#define BUTTON_PIN            BOARD_SW2_GPIO_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              UART0\n#define UART_CLOCK            CLOCK_GetFreq(UART0_CLK_SRC)\n\n#endif\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/frdm_k64f/board.mk",
    "content": "MCU_VARIANT = MK64F12\n\nCFLAGS += \\\n  -DCPU_MK64FN1M0VMD12 \\\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=format -Wno-error=redundant-decls\n\nSRC_C += \\\n\t$(BOARD_PATH)/board/clock_config.c \\\n\t$(BOARD_PATH)/board/pin_mux.c \\\n\nLD_FILE = ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/MK64FN1M0xxx12_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = MK64FN1M0xxx12\n\n# For flash-pyocd target\nPYOCD_TARGET = k64f\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/frdm_k64f/frdm_k64f.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"FRDM-K64F\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_14 http://mcuxpresso.nxp.com/XSD/mex_configuration_14.xsd\" uuid=\"c7cfbd44-6838-4477-a52a-4900c4871511\" version=\"14\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_14\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MK64FN1M0xxx12</processor>\n      <package>MK64FN1M0VLL12</package>\n      <board>FRDM-K64F</board>\n      <board_revision>E1</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M4F\" id=\"core0\" description=\"M4 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>true</validate_boot_init_only>\n      <generate_extended_information>true</generate_extended_information>\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=\"14.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>14.0.0</processor_version>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins/>\n            </function>\n            <function name=\"BOARD_InitButtons\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitButtons\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitButtons\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.gpio\" description=\"Pins initialization requires the GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitButtons\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIOC\" signal=\"GPIO, 6\" pin_num=\"78\" pin_signal=\"CMP0_IN0/PTC6/LLWU_P10/SPI0_SOUT/PDB0_EXTRG/I2S0_RX_BCLK/FB_AD9/I2S0_MCLK\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"SW2\"/>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIOA\" signal=\"GPIO, 4\" pin_num=\"38\" pin_signal=\"PTA4/LLWU_P3/FTM0_CH1/NMI_b/EZP_CS_b\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLEDs\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDs\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDs\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.gpio\" description=\"Pins initialization requires the GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDs\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIOB\" signal=\"GPIO, 21\" pin_num=\"67\" pin_signal=\"PTB21/SPI2_SCK/FB_AD30/CMP1_OUT\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"slew_rate\" value=\"slow\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIOB\" signal=\"GPIO, 22\" pin_num=\"68\" pin_signal=\"PTB22/SPI2_SOUT/FB_AD29/CMP2_OUT\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"slew_rate\" value=\"slow\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIOE\" signal=\"GPIO, 26\" pin_num=\"33\" pin_signal=\"PTE26/ENET_1588_CLKIN/UART4_CTS_b/RTC_CLKOUT/USB_CLKIN\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"slew_rate\" value=\"slow\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitDEBUG_UART\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"UART0\" description=\"Peripheral UART0 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UART\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UART\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UART\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"UART0\" signal=\"TX\" pin_num=\"63\" pin_signal=\"PTB17/SPI1_SIN/UART0_TX/FTM_CLKIN1/FB_AD16/EWM_OUT_b\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"UART0\" signal=\"RX\" pin_num=\"62\" pin_signal=\"PTB16/SPI1_SOUT/UART0_RX/FTM_CLKIN0/FB_AD17/EWM_IN\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitOSC\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"OSC\" description=\"Peripheral OSC is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitOSC\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"RTC\" description=\"Peripheral RTC is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitOSC\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitOSC\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitOSC\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"OSC\" signal=\"EXTAL0\" pin_num=\"50\" pin_signal=\"EXTAL0/PTA18/FTM0_FLT2/FTM_CLKIN0\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"EXTAL0\"/>\n                        <pin_feature name=\"slew_rate\" value=\"no_init\"/>\n                        <pin_feature name=\"open_drain\" value=\"no_init\"/>\n                        <pin_feature name=\"drive_strength\" value=\"no_init\"/>\n                        <pin_feature name=\"pull_select\" value=\"no_init\"/>\n                        <pin_feature name=\"pull_enable\" value=\"no_init\"/>\n                        <pin_feature name=\"passive_filter\" value=\"no_init\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"RTC\" signal=\"EXTAL32\" pin_num=\"29\" pin_signal=\"EXTAL32\"/>\n                  <pin peripheral=\"RTC\" signal=\"XTAL32\" pin_num=\"28\" pin_signal=\"XTAL32\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitACCEL\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"I2C0\" description=\"Peripheral I2C0 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitACCEL\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCEL\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCEL\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.gpio\" description=\"Pins initialization requires the GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCEL\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"I2C0\" signal=\"SDA\" pin_num=\"32\" pin_signal=\"ADC0_SE18/PTE25/UART4_RX/I2C0_SDA/EWM_IN\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"enable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"I2C0\" signal=\"SCL\" pin_num=\"31\" pin_signal=\"ADC0_SE17/PTE24/UART4_TX/I2C0_SCL/EWM_OUT_b\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"enable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIOC\" signal=\"GPIO, 6\" pin_num=\"78\" pin_signal=\"CMP0_IN0/PTC6/LLWU_P10/SPI0_SOUT/PDB0_EXTRG/I2S0_RX_BCLK/FB_AD9/I2S0_MCLK\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"ACCEL_INT1\"/>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"enable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIOC\" signal=\"GPIO, 13\" pin_num=\"85\" pin_signal=\"PTC13/UART4_CTS_b/FB_AD26\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"enable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitENET\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"ENET\" description=\"Peripheral ENET is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitENET\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENET\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitENET\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"ENET\" signal=\"RMII_MDC\" pin_num=\"54\" pin_signal=\"ADC0_SE9/ADC1_SE9/PTB1/I2C0_SDA/FTM1_CH1/RMII0_MDC/MII0_MDC/FTM1_QD_PHB\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_MDIO\" pin_num=\"53\" pin_signal=\"ADC0_SE8/ADC1_SE8/PTB0/LLWU_P5/I2C0_SCL/FTM1_CH0/RMII0_MDIO/MII0_MDIO/FTM1_QD_PHA\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"enable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_RXD0\" pin_num=\"43\" pin_signal=\"CMP2_IN1/PTA13/LLWU_P4/CAN0_RX/FTM1_CH1/RMII0_RXD0/MII0_RXD0/I2C2_SDA/I2S0_TX_FS/FTM1_QD_PHB\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_RXD1\" pin_num=\"42\" pin_signal=\"CMP2_IN0/PTA12/CAN0_TX/FTM1_CH0/RMII0_RXD1/MII0_RXD1/I2C2_SCL/I2S0_TXD0/FTM1_QD_PHA\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_RXER\" pin_num=\"39\" pin_signal=\"PTA5/USB_CLKIN/FTM0_CH2/RMII0_RXER/MII0_RXER/CMP2_OUT/I2S0_TX_BCLK/JTAG_TRST_b\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_TXD0\" pin_num=\"46\" pin_signal=\"PTA16/SPI0_SOUT/UART0_CTS_b/UART0_COL_b/RMII0_TXD0/MII0_TXD0/I2S0_RX_FS/I2S0_RXD1\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_TXD1\" pin_num=\"47\" pin_signal=\"ADC1_SE17/PTA17/SPI0_SIN/UART0_RTS_b/RMII0_TXD1/MII0_TXD1/I2S0_MCLK\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_TXEN\" pin_num=\"45\" pin_signal=\"PTA15/SPI0_SCK/UART0_RX/RMII0_TXEN/MII0_TXEN/I2S0_RXD0\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_CRS_DV\" pin_num=\"44\" pin_signal=\"PTA14/SPI0_PCS0/UART0_TX/RMII0_CRS_DV/MII0_RXDV/I2C2_SCL/I2S0_RX_BCLK/I2S0_TXD1\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"ENET\" signal=\"RMII_CLKIN\" pin_num=\"50\" pin_signal=\"EXTAL0/PTA18/FTM0_FLT2/FTM_CLKIN0\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"RMII_RXCLK\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSDHC\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SDHC\" description=\"Peripheral SDHC is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitSDHC\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDHC\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDHC\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.gpio\" description=\"Pins initialization requires the GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSDHC\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SDHC\" signal=\"DATA, 1\" pin_num=\"1\" pin_signal=\"ADC1_SE4a/PTE0/SPI1_PCS1/UART1_TX/SDHC0_D1/TRACE_CLKOUT/I2C1_SDA/RTC_CLKOUT\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SDHC\" signal=\"DATA, 0\" pin_num=\"2\" pin_signal=\"ADC1_SE5a/PTE1/LLWU_P0/SPI1_SOUT/UART1_RX/SDHC0_D0/TRACE_D3/I2C1_SCL/SPI1_SIN\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SDHC\" signal=\"DCLK\" pin_num=\"3\" pin_signal=\"ADC0_DP2/ADC1_SE6a/PTE2/LLWU_P1/SPI1_SCK/UART1_CTS_b/SDHC0_DCLK/TRACE_D2\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SDHC\" signal=\"CMD\" pin_num=\"4\" pin_signal=\"ADC0_DM2/ADC1_SE7a/PTE3/SPI1_SIN/UART1_RTS_b/SDHC0_CMD/TRACE_D1/SPI1_SOUT\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SDHC\" signal=\"DATA, 3\" pin_num=\"5\" pin_signal=\"PTE4/LLWU_P2/SPI1_PCS0/UART3_TX/SDHC0_D3/TRACE_D0\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SDHC\" signal=\"DATA, 2\" pin_num=\"6\" pin_signal=\"PTE5/SPI1_PCS2/UART3_RX/SDHC0_D2/FTM3_CH0\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIOE\" signal=\"GPIO, 6\" pin_num=\"7\" pin_signal=\"PTE6/SPI1_PCS3/UART3_CTS_b/I2S0_MCLK/FTM3_CH1/USB_SOF_OUT\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"slew_rate\" value=\"slow\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSB\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <prefix>BOARD_</prefix>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USB0\" description=\"Peripheral USB0 is not initialized\" problem_level=\"1\" source=\"Pins:BOARD_InitUSB\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSB\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USB0\" signal=\"DP\" pin_num=\"10\" pin_signal=\"USB0_DP\"/>\n                  <pin peripheral=\"USB0\" signal=\"DM\" pin_num=\"11\" pin_signal=\"USB0_DM\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"12.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>14.0.0</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=\"PinSignal\" resourceId=\"OSC.EXTAL0\" description=\"&apos;EXTAL0&apos; (Pins tool id: OSC.EXTAL0, Clocks tool id: OSC.EXTAL0) 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=\"PinSignal\" resourceId=\"OSC.EXTAL0\" description=\"&apos;EXTAL0&apos; (Pins tool id: OSC.EXTAL0, Clocks tool id: OSC.EXTAL0) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"OSC.OSC.outFreq\" value=\"50 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"Bus_clock.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLKOUT.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Core_clock.outFreq\" value=\"120 MHz\" locked=\"true\" accuracy=\"0.001\"/>\n                  <clock_output id=\"ENET1588TSCLK.outFreq\" value=\"50 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Flash_clock.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FlexBus_clock.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPO_clock.outFreq\" value=\"1 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MCGFFCLK.outFreq\" value=\"1.5625 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MCGIRCLK.outFreq\" value=\"2 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"OSCERCLK.outFreq\" value=\"50 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PLLFLLCLK.outFreq\" value=\"120 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"RMIICLK.outFreq\" value=\"50 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SDHCCLK.outFreq\" value=\"50 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"120 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACECLKIN.outFreq\" value=\"120 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB48MCLK.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"MCGMode\" value=\"PEE\" locked=\"false\"/>\n                  <setting id=\"CLKOUTConfig\" value=\"yes\" locked=\"false\"/>\n                  <setting id=\"ENETTimeSrcConfig\" value=\"yes\" locked=\"false\"/>\n                  <setting id=\"MCG.FRDIV.scale\" value=\"32\" locked=\"false\"/>\n                  <setting id=\"MCG.IRCS.sel\" value=\"MCG.FCRDIV\" locked=\"false\"/>\n                  <setting id=\"MCG.IREFS.sel\" value=\"MCG.FRDIV\" locked=\"false\"/>\n                  <setting id=\"MCG.PLLS.sel\" value=\"MCG.PLL\" locked=\"false\"/>\n                  <setting id=\"MCG.PRDIV.scale\" value=\"15\" locked=\"false\"/>\n                  <setting id=\"MCG.VDIV.scale\" value=\"36\" locked=\"false\"/>\n                  <setting id=\"MCG_C1_IRCLKEN_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"MCG_C2_RANGE0_CFG\" value=\"Very_high\" locked=\"false\"/>\n                  <setting id=\"MCG_C2_RANGE0_FRDIV_CFG\" value=\"Very_high\" locked=\"false\"/>\n                  <setting id=\"OSC_CR_ERCLKEN_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"RMIISrcConfig\" value=\"yes\" locked=\"false\"/>\n                  <setting id=\"RTCCLKOUTConfig\" value=\"yes\" locked=\"false\"/>\n                  <setting id=\"RTC_CR_OSCE_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"RTC_CR_OSC_CAP_LOAD_CFG\" value=\"SC10PF\" locked=\"false\"/>\n                  <setting id=\"SDHCClkConfig\" value=\"yes\" locked=\"false\"/>\n                  <setting id=\"SIM.OSC32KSEL.sel\" value=\"RTC.RTC32KCLK\" locked=\"false\"/>\n                  <setting id=\"SIM.OUTDIV2.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SIM.OUTDIV3.scale\" value=\"3\" locked=\"false\"/>\n                  <setting id=\"SIM.OUTDIV4.scale\" value=\"5\" locked=\"false\"/>\n                  <setting id=\"SIM.PLLFLLSEL.sel\" value=\"MCG.MCGPLLCLK\" locked=\"false\"/>\n                  <setting id=\"SIM.RTCCLKOUTSEL.sel\" value=\"RTC.RTC32KCLK\" locked=\"false\"/>\n                  <setting id=\"SIM.SDHCSRCSEL.sel\" value=\"OSC.OSCERCLK\" locked=\"false\"/>\n                  <setting id=\"SIM.TIMESRCSEL.sel\" value=\"OSC.OSCERCLK\" locked=\"false\"/>\n                  <setting id=\"SIM.USBDIV.scale\" value=\"5\" locked=\"false\"/>\n                  <setting id=\"SIM.USBFRAC.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SIM.USBSRCSEL.sel\" value=\"SIM.USBDIV\" locked=\"false\"/>\n                  <setting id=\"TraceClkConfig\" value=\"yes\" locked=\"false\"/>\n                  <setting id=\"USBClkConfig\" value=\"yes\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockVLPR\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockVLPR\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.smc\" description=\"Clocks initialization requires the SMC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockVLPR\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"OSC.OSC.outFreq\" value=\"50 MHz\" locked=\"false\" enabled=\"false\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"Bus_clock.outFreq\" value=\"4 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Core_clock.outFreq\" value=\"4 MHz\" locked=\"true\" accuracy=\"0.001\"/>\n                  <clock_output id=\"Flash_clock.outFreq\" value=\"800 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FlexBus_clock.outFreq\" value=\"4 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPO_clock.outFreq\" value=\"1 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"4 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"MCGMode\" value=\"BLPI\" locked=\"false\"/>\n                  <setting id=\"powerMode\" value=\"VLPR\" locked=\"false\"/>\n                  <setting id=\"MCG.CLKS.sel\" value=\"MCG.IRCS\" locked=\"false\"/>\n                  <setting id=\"MCG.FCRDIV.scale\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"MCG.FRDIV.scale\" value=\"32\" locked=\"false\"/>\n                  <setting id=\"MCG.IRCS.sel\" value=\"MCG.FCRDIV\" locked=\"false\"/>\n                  <setting id=\"MCG_C2_RANGE0_CFG\" value=\"Very_high\" locked=\"false\"/>\n                  <setting id=\"MCG_C2_RANGE0_FRDIV_CFG\" value=\"Very_high\" locked=\"false\"/>\n                  <setting id=\"RTC_CR_OSCE_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"RTC_CR_OSC_CAP_LOAD_CFG\" value=\"SC10PF\" locked=\"false\"/>\n                  <setting id=\"SIM.OSC32KSEL.sel\" value=\"RTC.RTC32KCLK\" locked=\"false\"/>\n                  <setting id=\"SIM.OUTDIV3.scale\" value=\"1\" locked=\"false\"/>\n                  <setting id=\"SIM.OUTDIV4.scale\" value=\"5\" locked=\"false\"/>\n                  <setting id=\"SIM.PLLFLLSEL.sel\" value=\"IRC48M.IRC48MCLK\" locked=\"false\"/>\n                  <setting id=\"SIM.RTCCLKOUTSEL.sel\" value=\"RTC.RTC32KCLK\" 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=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"13.0\" enabled=\"true\" update_project_code=\"true\">\n         <dependencies>\n            <dependency resourceType=\"SWComponent\" resourceId=\"middleware.usb.common_header\" description=\"USB Common Header is not found in the toolchain/IDE project. The project will not compile!\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data type=\"Boolean\">true</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"SWComponent\" resourceId=\"middleware.usb.common_header\" description=\"An unsupported version of the USB Common Header in the toolchain/IDE project. Required: ${required_value}, actual: ${actual_value}. The project might not compile correctly.\" problem_level=\"1\" source=\"Peripherals\">\n               <feature name=\"version\" evaluation=\"compatible\">\n                  <data type=\"Version\">2.8.0</data>\n               </feature>\n            </dependency>\n         </dependencies>\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n            <file path=\"source/generated/usb_device_composite.c\" update_enabled=\"true\"/>\n            <file path=\"source/generated/usb_device_composite.h\" update_enabled=\"true\"/>\n            <file path=\"source/generated/usb_device_config.h\" update_enabled=\"true\"/>\n            <file path=\"source/generated/usb_device_descriptor.c\" update_enabled=\"true\"/>\n            <file path=\"source/generated/usb_device_descriptor.h\" update_enabled=\"true\"/>\n            <file path=\"source/usb_device_interface_0_cic_vcom.c\" update_enabled=\"true\"/>\n            <file path=\"source/usb_device_interface_0_cic_vcom.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>14.0.0</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"a9140131-7ed9-4909-a4a4-202bd81c6834\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.sysmpu\" description=\"The sysmpu driver is missing in the project  (required for the System MPU initialization).\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"enabled\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"middleware.usb.device_controller_khci\" description=\"&quot;USB Device KHCI Controller Driver(FS)&quot; component is missing in the project.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"enabled\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"&quot;Common&quot; driver is missing in the project.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"enabled\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"ClockOutput\" resourceId=\"USB48MCLK\" description=\"USB Function Clock (USB48MCLK) is inactive and USB module will not work.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"frequency\" evaluation=\"greaterThan\">\n                        <data type=\"Frequency\" unit=\"Hz\">0</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"middleware.usb.device.cdc.external\" description=\"&quot;USB device CDC&quot; driver is missing in the project.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"enabled\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"middleware.usb.device.cdc.external\" description=\"&quot;USB device CDC&quot; driver is missing in the project.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"enabled\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <instances>\n                  <instance name=\"NVIC\" uuid=\"e1a88231-4d9e-46a3-b134-d2c743110640\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n                  <instance name=\"UART0\" uuid=\"7ecfeff3-a6de-43d3-9c43-9dfdbc237b35\" type=\"uart\" type_id=\"uart_9b45c456566d03f79ecfe90751c10bb4\" mode=\"polling\" peripheral=\"UART0\" enabled=\"false\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"uartConfig_t\" quick_selection=\"QuickSelection1\">\n                        <struct name=\"uartConfig\">\n                           <setting name=\"clockSource\" value=\"BusInterfaceClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"GetFreq\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"parityMode\" value=\"kUART_ParityDisabled\"/>\n                           <setting name=\"dataBitsCount\" value=\"kUART_EightDataBits\"/>\n                           <setting name=\"stopBitCount\" value=\"kUART_OneStopBit\"/>\n                           <setting name=\"enableMatchAddress1\" value=\"false\"/>\n                           <setting name=\"matchAddress1\" value=\"0\"/>\n                           <setting name=\"enableMatchAddress2\" value=\"false\"/>\n                           <setting name=\"matchAddress2\" value=\"0\"/>\n                           <setting name=\"txFifoWatermark\" value=\"0\"/>\n                           <setting name=\"rxFifoWatermark\" value=\"1\"/>\n                           <setting name=\"idleType\" value=\"kUART_IdleTypeStartBit\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"SYSMPU\" uuid=\"1d744f82-13f4-414f-bfaa-2f30bd3d54e1\" type=\"mpu_utility\" type_id=\"mpu_utility_bc3ea1f6add76edb6050f698d423d163\" mode=\"SYSMPU\" peripheral=\"SYSMPU\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"sysmpu_init\">\n                        <setting name=\"mpuInit\" value=\"disabled\"/>\n                     </config_set>\n                  </instance>\n                  <instance name=\"USB0\" uuid=\"cc0eb411-8fed-4548-b79c-9a8340cc02fd\" type=\"usb\" type_id=\"usb_cbf31fb9a3cef21890d93e737c3d2690\" mode=\"device\" peripheral=\"USB0\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"deviceSetting\" quick_selection=\"QS_DEVICE_CDC_VCOM\">\n                        <setting name=\"vendor_id\" value=\"0x1FC9\"/>\n                        <setting name=\"product_id\" value=\"0x0094\"/>\n                        <setting name=\"manufacturer_string\" value=\"NXP\"/>\n                        <setting name=\"product_string\" value=\"VCOM\"/>\n                        <setting name=\"self_powered\" value=\"true\"/>\n                        <setting name=\"suspend_resume\" value=\"false\"/>\n                        <setting name=\"max_power\" value=\"100\"/>\n                        <array name=\"interfaces\">\n                           <struct name=\"0\">\n                              <setting name=\"interface_class\" value=\"kClassCic\"/>\n                              <struct name=\"setting_cic\" quick_selection=\"QS_INTERFACE_CIC_VCOM\">\n                                 <setting name=\"interface_name\" value=\"CIC VCOM\"/>\n                                 <setting name=\"subclass\" value=\"kSubclassAcm\"/>\n                                 <setting name=\"protocol\" value=\"kProtocolNone\"/>\n                                 <setting name=\"implementation\" value=\"kImplementationCicVcom\"/>\n                                 <array name=\"endpoints_settings\">\n                                    <struct name=\"0\">\n                                       <setting name=\"setting_name\" value=\"Default\"/>\n                                       <array name=\"endpoints\">\n                                          <struct name=\"0\">\n                                             <setting name=\"direction\" value=\"kIn\"/>\n                                             <setting name=\"transfer_type\" value=\"kInterrupt\"/>\n                                             <setting name=\"synchronization\" value=\"kNoSynchronization\"/>\n                                             <setting name=\"usage\" value=\"kData\"/>\n                                             <setting name=\"max_packet_size_fs\" value=\"k16\"/>\n                                             <setting name=\"polling_interval_fs\" value=\"8\"/>\n                                             <setting name=\"bRefresh\" value=\"0\"/>\n                                             <setting name=\"bSynchAddress\" value=\"NoSynchronization\"/>\n                                          </struct>\n                                       </array>\n                                    </struct>\n                                 </array>\n                                 <setting name=\"data_interface_count\" value=\"1\"/>\n                              </struct>\n                           </struct>\n                           <struct name=\"1\">\n                              <setting name=\"interface_class\" value=\"kClassDic\"/>\n                              <struct name=\"setting_dic\" quick_selection=\"QS_INTERFACE_DIC_VCOM\">\n                                 <setting name=\"interface_name\" value=\"DIC VCOM\"/>\n                                 <setting name=\"subclass\" value=\"kSubclassNone\"/>\n                                 <setting name=\"protocol\" value=\"kProtocolNone\"/>\n                                 <setting name=\"implementation\" value=\"kImplementationDicVcom\"/>\n                                 <array name=\"endpoints_settings\">\n                                    <struct name=\"0\">\n                                       <setting name=\"setting_name\" value=\"Default\"/>\n                                       <array name=\"endpoints\">\n                                          <struct name=\"0\">\n                                             <setting name=\"direction\" value=\"kIn\"/>\n                                             <setting name=\"transfer_type\" value=\"kBulk\"/>\n                                             <setting name=\"synchronization\" value=\"kNoSynchronization\"/>\n                                             <setting name=\"usage\" value=\"kData\"/>\n                                             <setting name=\"max_packet_size_fs\" value=\"k64\"/>\n                                             <setting name=\"polling_interval_fs\" value=\"0\"/>\n                                             <setting name=\"bRefresh\" value=\"0\"/>\n                                             <setting name=\"bSynchAddress\" value=\"NoSynchronization\"/>\n                                          </struct>\n                                          <struct name=\"1\">\n                                             <setting name=\"direction\" value=\"kOut\"/>\n                                             <setting name=\"transfer_type\" value=\"kBulk\"/>\n                                             <setting name=\"synchronization\" value=\"kNoSynchronization\"/>\n                                             <setting name=\"usage\" value=\"kData\"/>\n                                             <setting name=\"max_packet_size_fs\" value=\"k64\"/>\n                                             <setting name=\"polling_interval_fs\" value=\"0\"/>\n                                             <setting name=\"bRefresh\" value=\"0\"/>\n                                             <setting name=\"bSynchAddress\" value=\"NoSynchronization\"/>\n                                          </struct>\n                                       </array>\n                                    </struct>\n                                 </array>\n                              </struct>\n                           </struct>\n                        </array>\n                     </config_set>\n                     <config_set name=\"commonSettings\">\n                        <struct name=\"mpu_init\">\n                           <setting name=\"mpu_init_component\" value=\"SYSMPU\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"f2b23d9d-334e-403a-a940-5a1f8e4a6e3f\" type_id=\"system_54b53072540eeeb8f8e9343e71f28176\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"314839b2-20bd-4633-a78b-b9a907d37e75\" type_id=\"msg_6e2baaf3b97dbeef01c0043275f9a0e7\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"91630462-4f6c-4ce1-bc31-8525c25dfb6a\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"3460120c-749d-46df-afa7-f8b75491d155\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"340e8605-0f8c-44e7-893f-099e6aba3723\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"dfb70626-d825-437a-bfe0-cd0bfc23485b\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"8c54bd92-b658-48de-8726-47edbf90bf20\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"5.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n         </tee_profile>\n      </tee>\n      <common name=\"common\" version=\"1.0\" enabled=\"true\" update_project_code=\"true\">\n         <core name=\"core0\" role=\"primary\" project_name=\"Project\"/>\n      </common>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/teensy_35/board/clock_config.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to setup clock using clock driver functions:\n *\n * 1. CLOCK_SetSimSafeDivs, to make sure core clock, bus clock, flexbus clock\n *    and flash clock are in allowed range during clock mode switch.\n *\n * 2. Call CLOCK_Osc0Init to setup OSC clock, if it is used in target mode.\n *\n * 3. Set MCG configuration, MCG includes three parts: FLL clock, PLL clock and\n *    internal reference clock(MCGIRCLK). Follow the steps to setup:\n *\n *    1). Call CLOCK_BootToXxxMode to set MCG to target mode.\n *\n *    2). If target mode is FBI/BLPI/PBI mode, the MCGIRCLK has been configured\n *        correctly. For other modes, need to call CLOCK_SetInternalRefClkConfig\n *        explicitly to setup MCGIRCLK.\n *\n *    3). Don't need to configure FLL explicitly, because if target mode is FLL\n *        mode, then FLL has been configured by the function CLOCK_BootToXxxMode,\n *        if the target mode is not FLL mode, the FLL is disabled.\n *\n *    4). If target mode is PEE/PBE/PEI/PBI mode, then the related PLL has been\n *        setup by CLOCK_BootToXxxMode. In FBE/FBI/FEE/FBE mode, the PLL could\n *        be enabled independently, call CLOCK_EnablePll0 explicitly in this case.\n *\n * 4. Call CLOCK_SetSimConfig to set the clock configuration in SIM.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v11.0\nprocessor: MK64FX512xxx12\npackage_id: MK64FX512VLQ12\nmcu_data: ksdk2_0\nprocessor_version: 13.0.1\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define MCG_IRCLK_DISABLE                                 0U  /*!< MCGIRCLK disabled */\n#define OSC_CAP0P                                         0U  /*!< Oscillator 0pF capacitor load */\n#define OSC_ER_CLK_DISABLE                                0U  /*!< Disable external reference clock */\n#define SIM_OSC32KSEL_OSC32KCLK_CLK                       0U  /*!< OSC32KSEL select: OSC32KCLK clock */\n#define SIM_PLLFLLSEL_MCGPLLCLK_CLK                       1U  /*!< PLLFLL select: MCGPLLCLK clock */\n#define SIM_USB_CLK_120000000HZ                   120000000U  /*!< Input SIM frequency for USB: 120000000Hz */\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n/*FUNCTION**********************************************************************\n *\n * Function Name : CLOCK_CONFIG_SetFllExtRefDiv\n * Description   : Configure FLL external reference divider (FRDIV).\n * Param frdiv   : The value to set FRDIV.\n *\n *END**************************************************************************/\nstatic void CLOCK_CONFIG_SetFllExtRefDiv(uint8_t frdiv)\n{\n    MCG->C1 = ((MCG->C1 & ~MCG_C1_FRDIV_MASK) | MCG_C1_FRDIV(frdiv));\n}\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: Bus_clock.outFreq, value: 60 MHz}\n- {id: Core_clock.outFreq, value: 120 MHz}\n- {id: Flash_clock.outFreq, value: 24 MHz}\n- {id: FlexBus_clock.outFreq, value: 40 MHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: MCGFFCLK.outFreq, value: 500 kHz}\n- {id: PLLFLLCLK.outFreq, value: 120 MHz}\n- {id: System_clock.outFreq, value: 120 MHz}\n- {id: USB48MCLK.outFreq, value: 48 MHz}\nsettings:\n- {id: MCGMode, value: PEE}\n- {id: MCG.FRDIV.scale, value: '32'}\n- {id: MCG.IREFS.sel, value: MCG.FRDIV}\n- {id: MCG.PLLS.sel, value: MCG.PLL}\n- {id: MCG.PRDIV.scale, value: '4'}\n- {id: MCG.VDIV.scale, value: '30'}\n- {id: MCG_C2_RANGE0_CFG, value: Very_high}\n- {id: MCG_C2_RANGE0_FRDIV_CFG, value: Very_high}\n- {id: MCG_C5_PLLCLKEN0_CFG, value: Enabled}\n- {id: RTC_CR_CLKO_CFG, value: Disabled}\n- {id: RTC_CR_OSC_CAP_LOAD_CFG, value: SC10PF}\n- {id: SIM.OUTDIV2.scale, value: '2'}\n- {id: SIM.OUTDIV3.scale, value: '3'}\n- {id: SIM.OUTDIV4.scale, value: '5'}\n- {id: SIM.PLLFLLSEL.sel, value: MCG.MCGPLLCLK}\n- {id: SIM.USBDIV.scale, value: '5'}\n- {id: SIM.USBFRAC.scale, value: '2'}\n- {id: SIM.USBSRCSEL.sel, value: SIM.USBDIV}\n- {id: USBClkConfig, value: 'yes'}\nsources:\n- {id: OSC.OSC.outFreq, value: 16 MHz, enabled: true}\n- {id: RTC.RTC32kHz.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst mcg_config_t mcgConfig_BOARD_BootClockRUN =\n    {\n        .mcgMode = kMCG_ModePEE,                  /* PEE - PLL Engaged External */\n        .irclkEnableMode = MCG_IRCLK_DISABLE,     /* MCGIRCLK disabled */\n        .ircs = kMCG_IrcSlow,                     /* Slow internal reference clock selected */\n        .fcrdiv = 0x1U,                           /* Fast IRC divider: divided by 2 */\n        .frdiv = 0x0U,                            /* FLL reference clock divider: divided by 32 */\n        .drs = kMCG_DrsLow,                       /* Low frequency range */\n        .dmx32 = kMCG_Dmx32Default,               /* DCO has a default range of 25% */\n        .oscsel = kMCG_OscselOsc,                 /* Selects System Oscillator (OSCCLK) */\n        .pll0Config =\n            {\n                .enableMode = kMCG_PllEnableIndependent,/* MCGPLLCLK enabled independent of MCG clock mode, MCGPLLCLK disabled in STOP mode */\n                .prdiv = 0x3U,                    /* PLL Reference divider: divided by 4 */\n                .vdiv = 0x6U,                     /* VCO divider: multiplied by 30 */\n            },\n    };\nconst sim_clock_config_t simConfig_BOARD_BootClockRUN =\n    {\n        .pllFllSel = SIM_PLLFLLSEL_MCGPLLCLK_CLK, /* PLLFLL select: MCGPLLCLK clock */\n        .er32kSrc = SIM_OSC32KSEL_OSC32KCLK_CLK,  /* OSC32KSEL select: OSC32KCLK clock */\n        .clkdiv1 = 0x1240000U,                    /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV2: /2, OUTDIV3: /3, OUTDIV4: /5 */\n    };\nconst osc_config_t oscConfig_BOARD_BootClockRUN =\n    {\n        .freq = 16000000U,                        /* Oscillator frequency: 16000000Hz */\n        .capLoad = (OSC_CAP0P),                   /* Oscillator capacity load: 0pF */\n        .workMode = kOSC_ModeExt,                 /* Use external clock */\n        .oscerConfig =\n            {\n                .enableMode = OSC_ER_CLK_DISABLE, /* Disable external reference clock */\n            }\n    };\n\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Set the system clock dividers in SIM to safe value. */\n    CLOCK_SetSimSafeDivs();\n    /* Initializes OSC0 according to board configuration. */\n    CLOCK_InitOsc0(&oscConfig_BOARD_BootClockRUN);\n    CLOCK_SetXtal0Freq(oscConfig_BOARD_BootClockRUN.freq);\n    /* Configure FLL external reference divider (FRDIV). */\n    CLOCK_CONFIG_SetFllExtRefDiv(mcgConfig_BOARD_BootClockRUN.frdiv);\n    /* Set MCG to PEE mode. */\n    CLOCK_BootToPeeMode(mcgConfig_BOARD_BootClockRUN.oscsel,\n                        kMCG_PllClkSelPll0,\n                        &mcgConfig_BOARD_BootClockRUN.pll0Config);\n    /* Set the clock configuration in SIM module. */\n    CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN);\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n    /* Enable USB FS clock. */\n    CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcPll0, SIM_USB_CLK_120000000HZ);\n}\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/teensy_35/board/clock_config.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         16000000U  /*!< Board xtal0 frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK             120000000U  /*!< Core clock frequency: 120000000Hz */\n\n/*! @brief MCG set for BOARD_BootClockRUN configuration.\n */\nextern const mcg_config_t mcgConfig_BOARD_BootClockRUN;\n/*! @brief SIM module set for BOARD_BootClockRUN configuration.\n */\nextern const sim_clock_config_t simConfig_BOARD_BootClockRUN;\n/*! @brief OSC set for BOARD_BootClockRUN configuration.\n */\nextern const osc_config_t oscConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/teensy_35/board/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v13.1\nprocessor: MK64FX512xxx12\npackage_id: MK64FX512VLQ12\nmcu_data: ksdk2_0\nprocessor_version: 13.0.1\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_port.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitPins();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '110', peripheral: GPIOC, signal: 'GPIO, 5', pin_signal: PTC5/LLWU_P9/SPI0_SCK/LPTMR0_ALT2/I2S0_RXD0/FB_AD10/CMP0_OUT/FTM0_CH2}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void)\n{\n    /* Port C Clock Gate Control: Clock enabled */\n    CLOCK_EnableClock(kCLOCK_PortC);\n\n    /* PORTC5 (pin 110) is configured as PTC5 */\n    PORT_SetPinMux(PORTC, 5U, kPORT_MuxAsGpio);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/teensy_35/board/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/teensy_35/board.cmake",
    "content": "set(MCU_VARIANT MK64F12)\n\nset(JLINK_DEVICE MK64FX512xxx12)\nset(TEENSY_MCU TEENSY35)\n\nset(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/MK64FX512xxx12_flash.ld)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/board/pin_mux.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/board/clock_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MK64FX512VMD12\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/teensy_35/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* metadata:\n   name: Teensy 3.5\n   url: https://www.pjrc.com/store/teensy35.html\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n// LED\n#define LED_PORT              GPIOC\n#define LED_PIN               5\n#define LED_STATE_ON          1\n\n// Button\n\n// UART\n//#define UART_PORT             UART0\n//#define UART_PIN_CLOCK        kCLOCK_PortA\n//#define UART_PIN_PORT         PORTA\n//#define UART_PIN_RX           1u\n//#define UART_PIN_TX           2u\n//#define UART_PIN_FUNCTION     kPORT_MuxAlt2\n//#define SOPT5_UART0RXSRC_UART_RX      0x00u   /*!< UART0 receive data source select: UART0_RX pin */\n//#define SOPT5_UART0TXSRC_UART_TX      0x00u   /*!< UART0 transmit data source select: UART0_TX pin */\n\n#endif\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/teensy_35/board.mk",
    "content": "MCU_VARIANT = MK64F12\n\nCFLAGS += \\\n  -DCPU_MK64FX512VMD12 \\\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=format -Wno-error=redundant-decls\n\nSRC_C += \\\n\t$(BOARD_PATH)/board/clock_config.c \\\n\t$(BOARD_PATH)/board/pin_mux.c \\\n\nLD_FILE = ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/MK64FX512xxx12_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = MK64FX512xxx12\n\n# For flash-pyocd target\nPYOCD_TARGET = k64f\n\n# flash by using teensy_loader_cli https://github.com/PaulStoffregen/teensy_loader_cli\nflash: $(BUILD)/$(PROJECT).hex\n\tteensy_loader_cli --mcu=TEENSY35 -v -w $<\n"
  },
  {
    "path": "hw/bsp/kinetis_k/boards/teensy_35/teensy_35.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"MK64FX512xxx12\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13 http://mcuxpresso.nxp.com/XSD/mex_configuration_13.xsd\" uuid=\"9011274c-fba8-40d5-b5c6-83fae0667023\" version=\"13\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_13\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MK64FX512xxx12</processor>\n      <package>MK64FX512VLQ12</package>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"core0\">\n         <core name=\"Cortex-M4F\" id=\"core0\" description=\"M4 core\"/>\n      </cores>\n      <description></description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>true</validate_boot_init_only>\n      <generate_extended_information>false</generate_extended_information>\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=\"13.1\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>13.0.1</processor_version>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIOC\" signal=\"GPIO, 5\" pin_num=\"110\" pin_signal=\"PTC5/LLWU_P9/SPI0_SCK/LPTMR0_ALT2/I2S0_RXD0/FB_AD10/CMP0_OUT/FTM0_CH2\"/>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"11.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>13.0.1</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=\"PinSignal\" resourceId=\"OSC.EXTAL0\" description=\"&apos;EXTAL0&apos; (Pins tool id: OSC.EXTAL0, Clocks tool id: OSC.EXTAL0) 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=\"PinSignal\" resourceId=\"OSC.EXTAL0\" description=\"&apos;EXTAL0&apos; (Pins tool id: OSC.EXTAL0, Clocks tool id: OSC.EXTAL0) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</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=\"core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"OSC.OSC.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n                  <clock_source id=\"RTC.RTC32kHz.outFreq\" value=\"32.768 kHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"Bus_clock.outFreq\" value=\"60 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Core_clock.outFreq\" value=\"120 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Flash_clock.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FlexBus_clock.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"LPO_clock.outFreq\" value=\"1 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MCGFFCLK.outFreq\" value=\"500 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"PLLFLLCLK.outFreq\" value=\"120 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"120 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB48MCLK.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"MCGMode\" value=\"PEE\" locked=\"false\"/>\n                  <setting id=\"MCG.FRDIV.scale\" value=\"32\" locked=\"false\"/>\n                  <setting id=\"MCG.IREFS.sel\" value=\"MCG.FRDIV\" locked=\"false\"/>\n                  <setting id=\"MCG.PLLS.sel\" value=\"MCG.PLL\" locked=\"false\"/>\n                  <setting id=\"MCG.PRDIV.scale\" value=\"4\" locked=\"false\"/>\n                  <setting id=\"MCG.VDIV.scale\" value=\"30\" locked=\"false\"/>\n                  <setting id=\"MCG_C2_RANGE0_CFG\" value=\"Very_high\" locked=\"false\"/>\n                  <setting id=\"MCG_C2_RANGE0_FRDIV_CFG\" value=\"Very_high\" locked=\"false\"/>\n                  <setting id=\"MCG_C5_PLLCLKEN0_CFG\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"RTC_CR_CLKO_CFG\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"RTC_CR_OSC_CAP_LOAD_CFG\" value=\"SC10PF\" locked=\"false\"/>\n                  <setting id=\"SIM.OUTDIV2.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SIM.OUTDIV3.scale\" value=\"3\" locked=\"false\"/>\n                  <setting id=\"SIM.OUTDIV4.scale\" value=\"5\" locked=\"false\"/>\n                  <setting id=\"SIM.PLLFLLSEL.sel\" value=\"MCG.MCGPLLCLK\" locked=\"false\"/>\n                  <setting id=\"SIM.USBDIV.scale\" value=\"5\" locked=\"false\"/>\n                  <setting id=\"SIM.USBFRAC.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SIM.USBSRCSEL.sel\" value=\"SIM.USBDIV\" locked=\"false\"/>\n                  <setting id=\"USBClkConfig\" value=\"yes\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>N/A</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"12.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <peripherals_profile>\n            <processor_version>13.0.1</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"7465f6d1-08aa-48d8-91d5-05023b3186dd\" called_from_default_init=\"true\" id_prefix=\"\" core=\"core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"NVIC\" uuid=\"84184268-649a-4026-9585-21289f314135\" type=\"nvic\" type_id=\"nvic_57b5eef3774cc60acaede6f5b8bddc67\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"069bcce2-44e2-4d92-af51-398354938128\" type_id=\"system_54b53072540eeeb8f8e9343e71f28176\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"53b11db5-341e-452e-9e8e-d62a780aca7b\" type_id=\"msg_6e2baaf3b97dbeef01c0043275f9a0e7\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"038e164b-8b7a-4d53-8d64-b52445aa6477\" type_id=\"gpio_adapter_common_57579b9ac814fe26bf95df0a384c36b6\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"e2176f5e-bfae-44bf-9ae7-5253becdddfa\" type_id=\"generic_uart_8cae00565451cf2346eb1b8c624e73a6\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"a8335235-50ea-4aca-a006-aa73fcd95f74\" type_id=\"generic_can_1bfdd78b1af214566c1f23cf6a582d80\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"dd55e60e-66c0-4980-808e-fe1c012d40fc\" type_id=\"uart_cmsis_common_9cb8e302497aa696fdbb5a4fd622c2a8\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"1a0aebd1-595c-442c-9741-c377be3f6029\" type_id=\"generic_enet_74db5c914f0ddbe47d86af40cb77a619\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>N/A</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/kinetis_k/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n * Copyright (c) 2020, Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include \"fsl_device_registers.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_port.h\"\n#include \"fsl_clock.h\"\n#include \"fsl_uart.h\"\n#include \"fsl_sysmpu.h\"\n\n#include \"board/clock_config.h\"\n#include \"board/pin_mux.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void) {\n#if CFG_TUH_ENABLED\n  tuh_int_handler(0);\n#endif\n#if CFG_TUD_ENABLED\n  tud_int_handler(0);\n#endif\n}\n\nvoid board_init(void) {\n  BOARD_InitBootPins();\n  BOARD_BootClockRUN();\n  SystemCoreClockUpdate();\n  SYSMPU_Enable(SYSMPU, 0);\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  // LED\n  gpio_pin_config_t led_config = { kGPIO_DigitalOutput, 0 };\n  GPIO_PinInit(LED_PORT, LED_PIN, &led_config);\n  board_led_write(false);\n\n#if defined(BUTTON_PORT) && defined(BUTTON_PIN)\n  gpio_pin_config_t button_config = { kGPIO_DigitalInput, 0 };\n  GPIO_PinInit(BUTTON_PORT, BUTTON_PIN, &button_config);\n#endif\n\n#ifdef UART_DEV\n  const uart_config_t uart_config = {\n      .baudRate_Bps = 115200UL,\n      .parityMode = kUART_ParityDisabled,\n      .stopBitCount = kUART_OneStopBit,\n      .txFifoWatermark = 0U,\n      .rxFifoWatermark = 1U,\n      .idleType = kUART_IdleTypeStartBit,\n      .enableTx = true,\n      .enableRx = true\n  };\n  UART_Init(UART_DEV, &uart_config, UART_CLOCK);\n#endif\n\n  // USB\n  // USB clock is configured in BOARD_BootClockRUN()\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinWrite(LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n#if defined(BUTTON_PORT) && defined(BUTTON_PIN)\n  return BUTTON_STATE_ACTIVE == GPIO_PinRead(BUTTON_PORT, BUTTON_PIN);\n#else\n  return 0;\n#endif\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n#ifdef UART_DEV\n  // Read blocking will block until there is data\n//  UART_ReadBlocking(UART_DEV, buf, len);\n//  return len;\n  return 0;\n#else\n  return 0;\n#endif\n}\n\nint board_uart_write(void const *buf, int len) {\n  (void) buf;\n  (void) len;\n\n#ifdef UART_DEV\n  UART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);\n  return len;\n#else\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\n\n#ifndef __ICCARM__\n// Implement _start() since we use linker flag '-nostartfiles'.\n// Requires defined __STARTUP_CLEAR_BSS,\nextern int main(void);\nTU_ATTR_UNUSED void _start(void) {\n  // called by startup code\n  main();\n  while (1) {}\n}\n\n#ifdef __clang__\nvoid\t_exit (int __status) {\n  (void) __status;\n  while (1) {}\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/kinetis_k/family.cmake",
    "content": "include_guard()\n\nif (NOT BOARD)\n  message(FATAL_ERROR \"BOARD not specified\")\nendif ()\n\nset(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-sdk)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS KINETIS_K CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/drivers/gpio/fsl_gpio.c\n    ${SDK_DIR}/drivers/uart/fsl_uart.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_clock.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/system_${MCU_VARIANT}.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __STARTUP_CLEAR_BSS\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    ${SDK_DIR}/devices/${MCU_VARIANT}\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers\n    ${SDK_DIR}/drivers/common\n    ${SDK_DIR}/drivers/gpio\n    ${SDK_DIR}/drivers/port\n    ${SDK_DIR}/drivers/smc\n    ${SDK_DIR}/drivers/sysmpu\n    ${SDK_DIR}/drivers/uart\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_K)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/chipidea/ci_fs/dcd_ci_fs.c\n    ${TOP}/src/portable/nxp/khci/hcd_khci.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  family_flash_teensy(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_k/family.mk",
    "content": "SDK_DIR = hw/mcu/nxp/mcux-sdk\n\nMCU_DIR = $(SDK_DIR)/devices/${MCU_VARIANT}\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nCFLAGS += \\\n  -D__STARTUP_CLEAR_BSS \\\n  -DCFG_TUSB_MCU=OPT_MCU_KINETIS_K \\\n\nLDFLAGS += \\\n  -Wl,--defsym,__stack_size__=0x400 \\\n  -Wl,--defsym,__heap_size__=0\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs \\\n\nSRC_C += \\\n\tsrc/portable/nxp/khci/dcd_khci.c \\\n\tsrc/portable/nxp/khci/hcd_khci.c \\\n\t$(MCU_DIR)/system_${MCU_VARIANT}.c \\\n\t$(MCU_DIR)/drivers/fsl_clock.c \\\n\t$(SDK_DIR)/drivers/gpio/fsl_gpio.c \\\n\t$(SDK_DIR)/drivers/uart/fsl_uart.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(MCU_DIR) \\\n\t$(TOP)/$(MCU_DIR)/drivers \\\n\t$(TOP)/$(SDK_DIR)/drivers/common \\\n\t$(TOP)/$(SDK_DIR)/drivers/gpio \\\n\t$(TOP)/$(SDK_DIR)/drivers/port \\\n\t$(TOP)/$(SDK_DIR)/drivers/smc \\\n\t$(TOP)/$(SDK_DIR)/drivers/sysmpu \\\n\t$(TOP)/$(SDK_DIR)/drivers/uart \\\n\nSRC_S += ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               2\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* Define to trap errors during development. */\n// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7\n#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__)\n  #define configASSERT(_exp) \\\n    do {\\\n      if ( !(_exp) ) { \\\n        volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \\\n        if ( (*ARM_CM_DHCSR) & 1UL ) {  /* Only halt mcu if debugger is attached */ \\\n          taskDISABLE_INTERRUPTS(); \\\n           __asm(\"BKPT #0\\n\"); \\\n        }\\\n      }\\\n    } while(0)\n#else\n  #define configASSERT( x )\n#endif\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.cmake",
    "content": "set(MCU_VARIANT K32L2A41A)\nset(MCU_CORE ${MCU_VARIANT})\n\nset(JLINK_DEVICE K32L2A41xxxxA)\nset(PYOCD_TARGET K32L2A)\n\nset(LD_FILE_GNU ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/gcc/K32L2A41xxxxA_flash.ld)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_K32L2A41VLH1A\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${MCUX_DEVICES}/K32L/periph1\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Freedom K32L2A4S\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-K32L2A4S\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"fsl_device_registers.h\"\n\n#define USB_CLOCK_SOURCE kCLOCK_IpSrcFircAsync\n\n// LED\n// The Red   LED is on PTE29.\n// The Green LED is on PTC4.\n// The Blue  LED is on PTE31.\n#define LED_PIN_CLOCK         kCLOCK_PortC\n#define LED_GPIO              GPIOC\n#define LED_PORT              PORTC\n#define LED_PIN               4\n#define LED_STATE_ON          0\n\n// SW3 button1\n#define BUTTON_PIN_CLOCK      kCLOCK_PortE\n#define BUTTON_GPIO           GPIOE\n#define BUTTON_PORT           PORTE\n#define BUTTON_PIN            4\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_PORT             LPUART0\n#define UART_PIN_CLOCK        kCLOCK_PortB\n#define UART_PIN_GPIO         GPIOB\n#define UART_PIN_PORT         PORTB\n#define UART_PIN_RX           16u\n#define UART_PIN_TX           17u\n#define UART_CLOCK_SOURCE_HZ  CLOCK_GetFreq(kCLOCK_ScgFircClk)\n\nstatic inline void BOARD_InitBootPins(void) {\n  /*\n    Enable LPUART0 clock and configure port pins.\n    FIR clock is being used so the USB examples work.\n  */\n  PCC_LPUART0 = 0U;                          /* Clock must be off to set PCS */\n  PCC_LPUART0 = PCC_CLKCFG_PCS(\n      3U);        /* Select the clock. 1:OSCCLK/Bus Clock, 2:Slow IRC, 3: Fast IRC, 6: System PLL */\n  PCC_LPUART0 |= PCC_CLKCFG_CGC(1U);        /* Enable LPUART */\n\n  /* PORTB16 (pin 62) is configured as LPUART0_RX */\n  gpio_pin_config_t const lpuart_config_rx = {kGPIO_DigitalInput, 0};\n  GPIO_PinInit(UART_PIN_GPIO, UART_PIN_RX, &lpuart_config_rx);\n  const port_pin_config_t UART_CFG = {\n      kPORT_PullUp,\n      kPORT_FastSlewRate,\n      kPORT_PassiveFilterDisable,\n      kPORT_OpenDrainDisable,\n      kPORT_LowDriveStrength,\n      kPORT_MuxAsGpio,\n      kPORT_UnlockRegister\n  };\n  PORT_SetPinConfig(UART_PIN_PORT, UART_PIN_RX, &UART_CFG);\n  PORT_SetPinMux(UART_PIN_PORT, UART_PIN_RX, kPORT_MuxAlt3);\n\n  /* PORTB17 (pin 63) is configured as LPUART0_TX */\n  gpio_pin_config_t const lpuart_config_tx = {kGPIO_DigitalOutput, 0};\n  GPIO_PinInit(UART_PIN_GPIO, UART_PIN_TX, &lpuart_config_tx);\n  PORT_SetPinMux(UART_PIN_PORT, UART_PIN_TX, kPORT_MuxAlt3);\n}\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.mk",
    "content": "MCU_VARIANT = K32L2A41A\n\nCFLAGS += -DCPU_K32L2A41VLH1A\n\n# mcu driver cause following warnings\nCFLAGS_GCC += -Wno-error=unused-parameter -Wno-error=redundant-decls -Wno-error=cast-qual\n\n# All source paths should be relative to the top level.\nLD_FILE = $(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/gcc/K32L2A41xxxxA_flash.ld\n\nINC += \\\n\t$(TOP)/$(MCUX_DEVICES)/K32L/periph1\n\nSRC_C += \\\n\t$(BOARD_PATH)/clock_config.c\n\n# For flash-jlink target\nJLINK_DEVICE = K32L2A41xxxxA\n\n# For flash-pyocd target\nPYOCD_TARGET = K32L2A\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/clock_config.c",
    "content": "/*\n * Copyright 2019 ,2021 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to setup clock using clock driver functions:\n *\n * 1. Call CLOCK_InitXXX() to configure corresponding SCG clock source.\n *    Note: The clock could not be set when it is being used as system clock.\n *    In default out of reset, the CPU is clocked from FIRC(IRC48M),\n *    so before setting FIRC, change to use another available clock source.\n *\n * 2. Call CLOCK_SetXtal0Freq() to set XTAL0 frequency based on board settings.\n *\n * 3. Call CLOCK_SetXxxModeSysClkConfig() to set SCG mode for Xxx run mode.\n *    Wait until the system clock source is changed to target source.\n *\n * 4. If power mode change is needed, call SMC_SetPowerModeProtection() to allow\n *    corresponding power mode and SMC_SetPowerModeXxx() to change to Xxx mode.\n *    Supported run mode and clock restrictions could be found in Reference Manual.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v7.0\nprocessor: K32L2A41xxxxA\npackage_id: K32L2A41VLL1A\nmcu_data: ksdk2_0\nprocessor_version: 9.0.0\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_smc.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define SCG_CLKOUTCNFG_SIRC                               2U  /*!< SCG CLKOUT clock select: Slow IRC */\n#define SCG_SOSC_DISABLE                                  0U  /*!< System OSC disabled */\n#define SCG_SPLL_DISABLE                                  0U  /*!< System PLL disabled */\n#define SCG_SYS_OSC_CAP_0P                                0U  /*!< Oscillator 0pF capacitor load */\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n/* System clock frequency. */\n//extern uint32_t SystemCoreClock;\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n/*FUNCTION**********************************************************************\n *\n * Function Name : CLOCK_CONFIG_SetScgOutSel\n * Description   : Set the SCG clock out select (CLKOUTSEL).\n * Param setting : The selected clock source.\n *\n *END**************************************************************************/\nstatic void CLOCK_CONFIG_SetScgOutSel(uint8_t setting)\n{\n     SCG->CLKOUTCNFG = SCG_CLKOUTCNFG_CLKOUTSEL(setting);\n}\n\n/*FUNCTION**********************************************************************\n *\n * Function Name : CLOCK_CONFIG_FircSafeConfig\n * Description   : This function is used to safely configure FIRC clock.\n *                 In default out of reset, the CPU is clocked from FIRC(IRC48M).\n *                 Before setting FIRC, change to use SIRC as system clock,\n *                 then configure FIRC. After FIRC is set, change back to use FIRC\n *                 in case SIRC need to be configured.\n * Param fircConfig  : FIRC configuration.\n *\n *END**************************************************************************/\nstatic void CLOCK_CONFIG_FircSafeConfig(const scg_firc_config_t *fircConfig)\n{\n    scg_sys_clk_config_t curConfig;\n    const scg_sirc_config_t scgSircConfig = {.enableMode = kSCG_SircEnable,\n                                             .div1 = kSCG_AsyncClkDisable,\n                                             .div3 = kSCG_AsyncClkDivBy2,\n                                             .range = kSCG_SircRangeHigh};\n    scg_sys_clk_config_t sysClkSafeConfigSource = {\n         .divSlow = kSCG_SysClkDivBy4, /* Slow clock divider */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n         .reserved1 = 0,\n         .reserved2 = 0,\n         .reserved3 = 0,\n#endif\n         .divCore = kSCG_SysClkDivBy1, /* Core clock divider */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n         .reserved4 = 0,\n#endif\n         .src = kSCG_SysClkSrcSirc,    /* System clock source */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n         .reserved5 = 0,\n#endif\n    };\n    /* Init Sirc. */\n    CLOCK_InitSirc(&scgSircConfig);\n    /* Change to use SIRC as system clock source to prepare to change FIRCCFG register. */\n    CLOCK_SetRunModeSysClkConfig(&sysClkSafeConfigSource);\n    /* Wait for clock source switch finished. */\n    do\n    {\n         CLOCK_GetCurSysClkConfig(&curConfig);\n    } while (curConfig.src != sysClkSafeConfigSource.src);\n\n    /* Init Firc. */\n    CLOCK_InitFirc(fircConfig);\n    /* Change back to use FIRC as system clock source in order to configure SIRC if needed. */\n    sysClkSafeConfigSource.src = kSCG_SysClkSrcFirc;\n    CLOCK_SetRunModeSysClkConfig(&sysClkSafeConfigSource);\n    /* Wait for clock source switch finished. */\n    do\n    {\n         CLOCK_GetCurSysClkConfig(&curConfig);\n    } while (curConfig.src != sysClkSafeConfigSource.src);\n}\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: Core_clock.outFreq, value: 48 MHz}\n- {id: FIRCDIV1_CLK.outFreq, value: 48 MHz}\n- {id: FIRCDIV3_CLK.outFreq, value: 48 MHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: OSC32KCLK.outFreq, value: 32.768 kHz}\n- {id: SIRCDIV3_CLK.outFreq, value: 4 MHz}\n- {id: SIRC_CLK.outFreq, value: 8 MHz}\n- {id: SOSCDIV3_CLK.outFreq, value: 32.768 kHz}\n- {id: SOSCER_CLK.outFreq, value: 32.768 kHz}\n- {id: SOSC_CLK.outFreq, value: 32.768 kHz}\n- {id: Slow_clock.outFreq, value: 24 MHz}\n- {id: System_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: SCG.FIRCDIV1.scale, value: '1', locked: true}\n- {id: SCG.FIRCDIV3.scale, value: '1', locked: true}\n- {id: SCG.SIRCDIV3.scale, value: '2', locked: true}\n- {id: SCG.SOSCDIV3.scale, value: '1', locked: true}\n- {id: SCG_SOSCCFG_OSC_MODE_CFG, value: ModeOscLowPower}\n- {id: SCG_SOSCCSR_SOSCEN_CFG, value: Enabled}\n- {id: SCG_SOSCCSR_SOSCERCLKEN_CFG, value: Enabled}\nsources:\n- {id: SCG.SOSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockRUN =\n    {\n        .divSlow = kSCG_SysClkDivBy2,             /* Slow Clock Divider: divided by 2 */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved1 = 0,\n        .reserved2 = 0,\n        .reserved3 = 0,\n#endif\n        .divCore = kSCG_SysClkDivBy1,             /* Core Clock Divider: divided by 1 */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved4 = 0,\n#endif\n        .src = kSCG_SysClkSrcFirc,                /* Fast IRC is selected as System Clock Source */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved5 = 0,\n#endif\n    };\nconst scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockRUN =\n    {\n        .freq = 32768U,                           /* System Oscillator frequency: 32768Hz */\n        .enableMode = kSCG_SysOscEnable | kSCG_SysOscEnableErClk,/* Enable System OSC clock, Enable OSCERCLK */\n        .monitorMode = kSCG_SysOscMonitorDisable, /* Monitor disabled */\n        .div1 = kSCG_AsyncClkDisable,             /* System OSC Clock Divider 1: Clock output is disabled */\n        .div3 = kSCG_AsyncClkDivBy1,              /* System OSC Clock Divider 3: divided by 1 */\n        .capLoad = SCG_SYS_OSC_CAP_0P,            /* Oscillator capacity load: 0pF */\n        .workMode = kSCG_SysOscModeOscLowPower,   /* Oscillator low power */\n    };\nconst scg_sirc_config_t g_scgSircConfig_BOARD_BootClockRUN =\n    {\n        .enableMode = kSCG_SircEnable | kSCG_SircEnableInLowPower,/* Enable SIRC clock, Enable SIRC in low power mode */\n        .div1 = kSCG_AsyncClkDisable,             /* Slow IRC Clock Divider 1: Clock output is disabled */\n        .div3 = kSCG_AsyncClkDivBy2,              /* Slow IRC Clock Divider 3: divided by 2 */\n        .range = kSCG_SircRangeHigh,              /* Slow IRC high range clock (8 MHz) */\n    };\nconst scg_firc_config_t g_scgFircConfig_BOARD_BootClockRUN =\n    {\n        .enableMode = kSCG_FircEnable,            /* Enable FIRC clock */\n        .div1 = kSCG_AsyncClkDivBy1,              /* Fast IRC Clock Divider 1: divided by 1 */\n        .div3 = kSCG_AsyncClkDivBy1,              /* Fast IRC Clock Divider 3: divided by 1 */\n        .range = kSCG_FircRange48M,               /* Fast IRC is trimmed to 48MHz */\n        .trimConfig = NULL,                       /* Fast IRC Trim disabled */\n    };\nconst scg_spll_config_t g_scgSysPllConfig_BOARD_BootClockRUN =\n    {\n        .enableMode = SCG_SPLL_DISABLE,           /* System PLL disabled */\n        .monitorMode = kSCG_SysPllMonitorDisable, /* Monitor disabled */\n        .div1 = kSCG_AsyncClkDisable,             /* System PLL Clock Divider 1: Clock output is disabled */\n        .div3 = kSCG_AsyncClkDisable,             /* System PLL Clock Divider 3: Clock output is disabled */\n        .src = kSCG_SysPllSrcSysOsc,              /* System PLL clock source is System OSC */\n        .prediv = 0,                              /* Divided by 1 */\n        .mult = 0,                                /* Multiply Factor is 16 */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    scg_sys_clk_config_t curConfig;\n\n    /* Init SOSC according to board configuration. */\n    CLOCK_InitSysOsc(&g_scgSysOscConfig_BOARD_BootClockRUN);\n    /* Set the XTAL0 frequency based on board settings. */\n    CLOCK_SetXtal0Freq(g_scgSysOscConfig_BOARD_BootClockRUN.freq);\n    /* Init FIRC. */\n    CLOCK_CONFIG_FircSafeConfig(&g_scgFircConfig_BOARD_BootClockRUN);\n    /* Init SIRC. */\n    CLOCK_InitSirc(&g_scgSircConfig_BOARD_BootClockRUN);\n    /* Set SCG to FIRC mode. */\n    CLOCK_SetRunModeSysClkConfig(&g_sysClkConfig_BOARD_BootClockRUN);\n    /* Wait for clock source switch finished. */\n    do\n    {\n         CLOCK_GetCurSysClkConfig(&curConfig);\n    } while (curConfig.src != g_sysClkConfig_BOARD_BootClockRUN.src);\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockHSRUN **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockHSRUN\noutputs:\n- {id: CLKOUT.outFreq, value: 8 MHz}\n- {id: Core_clock.outFreq, value: 96 MHz, locked: true, accuracy: '0.001'}\n- {id: FIRCDIV1_CLK.outFreq, value: 48 MHz}\n- {id: FIRCDIV3_CLK.outFreq, value: 48 MHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: OSC32KCLK.outFreq, value: 32.768 kHz}\n- {id: PLLDIV1_CLK.outFreq, value: 96 MHz}\n- {id: PLLDIV3_CLK.outFreq, value: 96 MHz}\n- {id: SIRCDIV1_CLK.outFreq, value: 8 MHz}\n- {id: SIRCDIV3_CLK.outFreq, value: 8 MHz}\n- {id: SIRC_CLK.outFreq, value: 8 MHz}\n- {id: SOSCDIV1_CLK.outFreq, value: 32.768 kHz}\n- {id: SOSCDIV3_CLK.outFreq, value: 32.768 kHz}\n- {id: SOSCER_CLK.outFreq, value: 32.768 kHz}\n- {id: SOSC_CLK.outFreq, value: 32.768 kHz}\n- {id: Slow_clock.outFreq, value: 24 MHz, locked: true, accuracy: '0.001'}\n- {id: System_clock.outFreq, value: 96 MHz}\nsettings:\n- {id: SCGMode, value: SPLL}\n- {id: powerMode, value: HSRUN}\n- {id: CLKOUTConfig, value: 'yes'}\n- {id: SCG.DIVSLOW.scale, value: '4'}\n- {id: SCG.FIRCDIV1.scale, value: '1', locked: true}\n- {id: SCG.FIRCDIV3.scale, value: '1', locked: true}\n- {id: SCG.PREDIV.scale, value: '4'}\n- {id: SCG.SCSSEL.sel, value: SCG.SPLL_DIV2_CLK}\n- {id: SCG.SIRCDIV1.scale, value: '1', locked: true}\n- {id: SCG.SIRCDIV3.scale, value: '1', locked: true}\n- {id: SCG.SOSCDIV1.scale, value: '1', locked: true}\n- {id: SCG.SOSCDIV3.scale, value: '1', locked: true}\n- {id: SCG.SPLLDIV1.scale, value: '1', locked: true}\n- {id: SCG.SPLLDIV3.scale, value: '1', locked: true}\n- {id: SCG.SPLLSRCSEL.sel, value: SCG.FIRC}\n- {id: SCG_SOSCCFG_OSC_MODE_CFG, value: ModeOscLowPower}\n- {id: SCG_SOSCCSR_SOSCEN_CFG, value: Enabled}\n- {id: SCG_SOSCCSR_SOSCERCLKEN_CFG, value: Enabled}\n- {id: SCG_SPLLCSR_SPLLEN_CFG, value: Enabled}\nsources:\n- {id: SCG.SOSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockHSRUN configuration\n ******************************************************************************/\nconst scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockHSRUN =\n    {\n        .divSlow = kSCG_SysClkDivBy4,             /* Slow Clock Divider: divided by 4 */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved1 = 0,\n        .reserved2 = 0,\n        .reserved3 = 0,\n#endif\n        .divCore = kSCG_SysClkDivBy1,             /* Core Clock Divider: divided by 1 */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved4 = 0,\n#endif\n        .src = kSCG_SysClkSrcSysPll,              /* System PLL is selected as System Clock Source */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved5 = 0,\n#endif\n    };\nconst scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockHSRUN =\n    {\n        .freq = 32768U,                           /* System Oscillator frequency: 32768Hz */\n        .enableMode = kSCG_SysOscEnable | kSCG_SysOscEnableErClk,/* Enable System OSC clock, Enable OSCERCLK */\n        .monitorMode = kSCG_SysOscMonitorDisable, /* Monitor disabled */\n        .div1 = kSCG_AsyncClkDivBy1,              /* System OSC Clock Divider 1: divided by 1 */\n        .div3 = kSCG_AsyncClkDivBy1,              /* System OSC Clock Divider 3: divided by 1 */\n        .capLoad = SCG_SYS_OSC_CAP_0P,            /* Oscillator capacity load: 0pF */\n        .workMode = kSCG_SysOscModeOscLowPower,   /* Oscillator low power */\n    };\nconst scg_sirc_config_t g_scgSircConfig_BOARD_BootClockHSRUN =\n    {\n        .enableMode = kSCG_SircEnable | kSCG_SircEnableInLowPower,/* Enable SIRC clock, Enable SIRC in low power mode */\n        .div1 = kSCG_AsyncClkDivBy1,              /* Slow IRC Clock Divider 1: divided by 1 */\n        .div3 = kSCG_AsyncClkDivBy1,              /* Slow IRC Clock Divider 3: divided by 1 */\n        .range = kSCG_SircRangeHigh,              /* Slow IRC high range clock (8 MHz) */\n    };\nconst scg_firc_config_t g_scgFircConfig_BOARD_BootClockHSRUN =\n    {\n        .enableMode = kSCG_FircEnable,            /* Enable FIRC clock */\n        .div1 = kSCG_AsyncClkDivBy1,              /* Fast IRC Clock Divider 1: divided by 1 */\n        .div3 = kSCG_AsyncClkDivBy1,              /* Fast IRC Clock Divider 3: divided by 1 */\n        .range = kSCG_FircRange48M,               /* Fast IRC is trimmed to 48MHz */\n        .trimConfig = NULL,                       /* Fast IRC Trim disabled */\n    };\nconst scg_spll_config_t g_scgSysPllConfig_BOARD_BootClockHSRUN =\n    {\n        .enableMode = kSCG_SysPllEnable,          /* Enable SPLL clock */\n        .monitorMode = kSCG_SysPllMonitorDisable, /* Monitor disabled */\n        .div1 = kSCG_AsyncClkDivBy1,              /* System PLL Clock Divider 1: divided by 1 */\n        .div3 = kSCG_AsyncClkDivBy1,              /* System PLL Clock Divider 3: divided by 1 */\n        .src = kSCG_SysPllSrcFirc,                /* System PLL clock source is Fast IRC */\n        .prediv = 3,                              /* Divided by 4 */\n        .mult = 0,                                /* Multiply Factor is 16 */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockHSRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockHSRUN(void)\n{\n    scg_sys_clk_config_t curConfig;\n\n    /* Init SOSC according to board configuration. */\n    CLOCK_InitSysOsc(&g_scgSysOscConfig_BOARD_BootClockHSRUN);\n    /* Set the XTAL0 frequency based on board settings. */\n    CLOCK_SetXtal0Freq(g_scgSysOscConfig_BOARD_BootClockHSRUN.freq);\n    /* Init FIRC. */\n    CLOCK_CONFIG_FircSafeConfig(&g_scgFircConfig_BOARD_BootClockHSRUN);\n    /* Init SIRC. */\n    CLOCK_InitSirc(&g_scgSircConfig_BOARD_BootClockHSRUN);\n    /* Init SysPll. */\n    CLOCK_InitSysPll(&g_scgSysPllConfig_BOARD_BootClockHSRUN);\n    /* Set HSRUN power mode. */\n    SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll);\n    SMC_SetPowerModeHsrun(SMC);\n    while (SMC_GetPowerModeState(SMC) != kSMC_PowerStateHsrun)\n    {\n    }\n\n    /* Set SCG to SPLL mode. */\n    CLOCK_SetHsrunModeSysClkConfig(&g_sysClkConfig_BOARD_BootClockHSRUN);\n    /* Wait for clock source switch finished. */\n    do\n    {\n         CLOCK_GetCurSysClkConfig(&curConfig);\n    } while (curConfig.src != g_sysClkConfig_BOARD_BootClockHSRUN.src);\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKHSRUN_CORE_CLOCK;\n    /* Set SCG CLKOUT selection. */\n    CLOCK_CONFIG_SetScgOutSel(SCG_CLKOUTCNFG_SIRC);\n}\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockVLPR ***********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockVLPR\noutputs:\n- {id: Core_clock.outFreq, value: 8 MHz, locked: true, accuracy: '0.001'}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: SIRC_CLK.outFreq, value: 8 MHz}\n- {id: Slow_clock.outFreq, value: 1 MHz, locked: true, accuracy: '0.001'}\n- {id: System_clock.outFreq, value: 8 MHz}\nsettings:\n- {id: SCGMode, value: SIRC}\n- {id: powerMode, value: VLPR}\n- {id: SCG.DIVSLOW.scale, value: '8'}\n- {id: SCG.SCSSEL.sel, value: SCG.SIRC}\n- {id: SCG_FIRCCSR_FIRCLPEN_CFG, value: Enabled}\nsources:\n- {id: SCG.SOSC.outFreq, value: 32.768 kHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockVLPR configuration\n ******************************************************************************/\nconst scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockVLPR =\n    {\n        .divSlow = kSCG_SysClkDivBy8,             /* Slow Clock Divider: divided by 8 */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved1 = 0,\n        .reserved2 = 0,\n        .reserved3 = 0,\n#endif\n        .divCore = kSCG_SysClkDivBy1,             /* Core Clock Divider: divided by 1 */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved4 = 0,\n#endif\n        .src = kSCG_SysClkSrcSirc,                /* Slow IRC is selected as System Clock Source */\n#if FSL_CLOCK_DRIVER_VERSION < MAKE_VERSION(2, 1, 1)\n        .reserved5 = 0,\n#endif\n    };\nconst scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockVLPR =\n    {\n        .freq = 0U,                               /* System Oscillator frequency: 0Hz */\n        .enableMode = SCG_SOSC_DISABLE,           /* System OSC disabled */\n        .monitorMode = kSCG_SysOscMonitorDisable, /* Monitor disabled */\n        .div1 = kSCG_AsyncClkDisable,             /* System OSC Clock Divider 1: Clock output is disabled */\n        .div3 = kSCG_AsyncClkDisable,             /* System OSC Clock Divider 3: Clock output is disabled */\n        .capLoad = SCG_SYS_OSC_CAP_0P,            /* Oscillator capacity load: 0pF */\n        .workMode = kSCG_SysOscModeExt,           /* Use external clock */\n    };\nconst scg_sirc_config_t g_scgSircConfig_BOARD_BootClockVLPR =\n    {\n        .enableMode = kSCG_SircEnable | kSCG_SircEnableInLowPower,/* Enable SIRC clock, Enable SIRC in low power mode */\n        .div1 = kSCG_AsyncClkDisable,             /* Slow IRC Clock Divider 1: Clock output is disabled */\n        .div3 = kSCG_AsyncClkDisable,             /* Slow IRC Clock Divider 3: Clock output is disabled */\n        .range = kSCG_SircRangeHigh,              /* Slow IRC high range clock (8 MHz) */\n    };\nconst scg_firc_config_t g_scgFircConfig_BOARD_BootClockVLPR =\n    {\n        .enableMode = kSCG_FircEnable | kSCG_FircEnableInLowPower,/* Enable FIRC clock, Enable FIRC in low power mode */\n        .div1 = kSCG_AsyncClkDisable,             /* Fast IRC Clock Divider 1: Clock output is disabled */\n        .div3 = kSCG_AsyncClkDisable,             /* Fast IRC Clock Divider 3: Clock output is disabled */\n        .range = kSCG_FircRange48M,               /* Fast IRC is trimmed to 48MHz */\n        .trimConfig = NULL,                       /* Fast IRC Trim disabled */\n    };\nconst scg_spll_config_t g_scgSysPllConfig_BOARD_BootClockVLPR =\n    {\n        .enableMode = SCG_SPLL_DISABLE,           /* System PLL disabled */\n        .monitorMode = kSCG_SysPllMonitorDisable, /* Monitor disabled */\n        .div1 = kSCG_AsyncClkDisable,             /* System PLL Clock Divider 1: Clock output is disabled */\n        .div3 = kSCG_AsyncClkDisable,             /* System PLL Clock Divider 3: Clock output is disabled */\n        .src = kSCG_SysPllSrcSysOsc,              /* System PLL clock source is System OSC */\n        .prediv = 0,                              /* Divided by 1 */\n        .mult = 0,                                /* Multiply Factor is 16 */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockVLPR configuration\n ******************************************************************************/\nvoid BOARD_BootClockVLPR(void)\n{\n    /* Init FIRC. */\n    CLOCK_CONFIG_FircSafeConfig(&g_scgFircConfig_BOARD_BootClockVLPR);\n    /* Init SIRC. */\n    CLOCK_InitSirc(&g_scgSircConfig_BOARD_BootClockVLPR);\n    /* Allow SMC all power modes. */\n    SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll);\n    /* Set VLPR power mode. */\n    SMC_SetPowerModeVlpr(SMC);\n    while (SMC_GetPowerModeState(SMC) != kSMC_PowerStateVlpr)\n    {\n    }\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKVLPR_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/clock_config.h",
    "content": "/*\n * Copyright 2019 ,2021 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                            32768U  /*!< Board xtal0 frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK              48000000U  /*!< Core clock frequency: 48000000Hz */\n\n/*! @brief SCG set for BOARD_BootClockRUN configuration.\n */\nextern const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockRUN;\n/*! @brief System OSC set for BOARD_BootClockRUN configuration.\n */\nextern const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockRUN;\n/*! @brief SIRC set for BOARD_BootClockRUN configuration.\n */\nextern const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockRUN;\n/*! @brief FIRC set for BOARD_BootClockRUN configuration.\n */\nextern const scg_firc_config_t g_scgFircConfigBOARD_BootClockRUN;\nextern const scg_spll_config_t g_scgSysPllConfigBOARD_BootClockRUN;\n/*! @brief Low Power FLL set for BOARD_BootClockRUN configuration.\n */\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockHSRUN **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockHSRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKHSRUN_CORE_CLOCK            96000000U  /*!< Core clock frequency: 96000000Hz */\n\n/*! @brief SCG set for BOARD_BootClockHSRUN configuration.\n */\nextern const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockHSRUN;\n/*! @brief System OSC set for BOARD_BootClockHSRUN configuration.\n */\nextern const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockHSRUN;\n/*! @brief SIRC set for BOARD_BootClockHSRUN configuration.\n */\nextern const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockHSRUN;\n/*! @brief FIRC set for BOARD_BootClockHSRUN configuration.\n */\nextern const scg_firc_config_t g_scgFircConfigBOARD_BootClockHSRUN;\nextern const scg_spll_config_t g_scgSysPllConfigBOARD_BootClockHSRUN;\n/*! @brief Low Power FLL set for BOARD_BootClockHSRUN configuration.\n */\n\n/*******************************************************************************\n * API for BOARD_BootClockHSRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockHSRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockVLPR ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockVLPR configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKVLPR_CORE_CLOCK              8000000U  /*!< Core clock frequency: 8000000Hz */\n\n/*! @brief SCG set for BOARD_BootClockVLPR configuration.\n */\nextern const scg_sys_clk_config_t g_sysClkConfig_BOARD_BootClockVLPR;\n/*! @brief System OSC set for BOARD_BootClockVLPR configuration.\n */\nextern const scg_sosc_config_t g_scgSysOscConfig_BOARD_BootClockVLPR;\n/*! @brief SIRC set for BOARD_BootClockVLPR configuration.\n */\nextern const scg_sirc_config_t g_scgSircConfig_BOARD_BootClockVLPR;\n/*! @brief FIRC set for BOARD_BootClockVLPR configuration.\n */\nextern const scg_firc_config_t g_scgFircConfigBOARD_BootClockVLPR;\nextern const scg_spll_config_t g_scgSysPllConfigBOARD_BootClockVLPR;\n/*! @brief Low Power FLL set for BOARD_BootClockVLPR configuration.\n */\n\n/*******************************************************************************\n * API for BOARD_BootClockVLPR configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockVLPR(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.cmake",
    "content": "set(MCU_VARIANT K32L2B31A)\nset(MCU_CORE ${MCU_VARIANT})\n\nset(JLINK_DEVICE K32L2B31xxxxA)\nset(PYOCD_TARGET K32L2B)\n\nset(LD_FILE_GNU ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/gcc/K32L2B31xxxxA_flash.ld)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_K32L2B31VLH0A\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${MCUX_DEVICES}/K32L/periph2\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Freedom K32L2B3\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/general-purpose-mcus/nxp-freedom-development-platform-for-k32-l2b-mcus:FRDM-K32L2B3\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"fsl_device_registers.h\"\n\n#define USB_CLOCK_SOURCE kCLOCK_UsbSrcIrc48M\n\n// LED\n#define LED_PIN_CLOCK         kCLOCK_PortD\n#define LED_GPIO              GPIOD\n#define LED_PORT              PORTD\n#define LED_PIN               5\n#define LED_STATE_ON          0\n\n// SW3 button1\n#define BUTTON_PIN_CLOCK      kCLOCK_PortC\n#define BUTTON_GPIO           GPIOC\n#define BUTTON_PORT           PORTC\n#define BUTTON_PIN            3\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_PORT             LPUART0\n#define UART_PIN_CLOCK        kCLOCK_PortA\n#define UART_PIN_PORT         PORTA\n#define UART_PIN_RX           1u\n#define UART_PIN_TX           2u\n#define SOPT5_LPUART0RXSRC_LPUART_RX 0x00u /*!<@brief LPUART0 Receive Data Source Select: LPUART_RX pin */\n#define SOPT5_LPUART0TXSRC_LPUART_TX 0x00u /*!<@brief LPUART0 Transmit Data Source Select: LPUART0_TX pin */\n#define UART_CLOCK_SOURCE_HZ  CLOCK_GetFreq(kCLOCK_McgIrc48MClk)\n\nstatic inline void BOARD_InitBootPins(void) {\n  /* PORTA1 (pin 23) is configured as LPUART0_RX */\n  PORT_SetPinMux(PORTA, 1U, kPORT_MuxAlt2);\n  /* PORTA2 (pin 24) is configured as LPUART0_TX */\n  PORT_SetPinMux(PORTA, 2U, kPORT_MuxAlt2);\n\n  SIM->SOPT5 = ((SIM->SOPT5 &\n                 /* Mask bits to zero which are setting */\n                 (~(SIM_SOPT5_LPUART0TXSRC_MASK | SIM_SOPT5_LPUART0RXSRC_MASK)))\n                /* LPUART0 Transmit Data Source Select: LPUART0_TX pin. */\n                | SIM_SOPT5_LPUART0TXSRC(SOPT5_LPUART0TXSRC_LPUART_TX)\n                /* LPUART0 Receive Data Source Select: LPUART_RX pin. */\n                | SIM_SOPT5_LPUART0RXSRC(SOPT5_LPUART0RXSRC_LPUART_RX));\n\n  BOARD_BootClockRUN();\n  SystemCoreClockUpdate();\n  CLOCK_SetLpuart0Clock(1);\n}\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.mk",
    "content": "MCU_VARIANT = K32L2B31A\n\nCFLAGS += -DCPU_K32L2B31VLH0A\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=redundant-decls\n\n# All source paths should be relative to the top level.\nLD_FILE = $(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/gcc/K32L2B31xxxxA_flash.ld\n\nINC += \\\n\t$(TOP)/$(MCUX_DEVICES)/K32L/periph2\n\nSRC_C += \\\n\t$(BOARD_PATH)/clock_config.c\n\n# For flash-jlink target\nJLINK_DEVICE = K32L2B31xxxxA\n\n# For flash-pyocd target\nPYOCD_TARGET = K32L2B\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2b/clock_config.c",
    "content": "/*\n * Copyright 2019 ,2021 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to setup clock using clock driver functions:\n *\n * 1. CLOCK_SetSimSafeDivs, to make sure core clock, bus clock, flexbus clock\n *    and flash clock are in allowed range during clock mode switch.\n *\n * 2. Call CLOCK_Osc0Init to setup OSC clock, if it is used in target mode.\n *\n * 3. Call CLOCK_SetMcgliteConfig to set MCG_Lite configuration.\n *\n * 4. Call CLOCK_SetSimConfig to set the clock configuration in SIM.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v7.0\nprocessor: K32L2B31xxxxA\npackage_id: K32L2B31VLH0A\nmcu_data: ksdk2_0\nprocessor_version: 9.0.0\nboard: FRDM-K32L2B\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_smc.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define OSC_CAP0P                                         0U  /*!< Oscillator 0pF capacitor load */\n#define OSC_ER_CLK_DISABLE                                0U  /*!< Disable external reference clock */\n#define SIM_OSC32KSEL_OSC32KCLK_CLK                       0U  /*!< OSC32KSEL select: OSC32KCLK clock */\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n/* System clock frequency. */\n//extern uint32_t SystemCoreClock;\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: Bus_clock.outFreq, value: 24 MHz}\n- {id: Core_clock.outFreq, value: 48 MHz}\n- {id: Flash_clock.outFreq, value: 24 MHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: MCGIRCLK.outFreq, value: 8 MHz}\n- {id: MCGPCLK.outFreq, value: 48 MHz}\n- {id: System_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: MCGMode, value: HIRC}\n- {id: MCG.CLKS.sel, value: MCG.HIRC}\n- {id: MCG_C2_OSC_MODE_CFG, value: ModeOscLowPower}\n- {id: MCG_C2_RANGE0_CFG, value: Very_high}\n- {id: MCG_MC_HIRCEN_CFG, value: Enabled}\n- {id: OSC0_CR_ERCLKEN_CFG, value: Enabled}\n- {id: OSC_CR_ERCLKEN_CFG, value: Enabled}\n- {id: SIM.CLKOUTSEL.sel, value: MCG.MCGPCLK}\n- {id: SIM.COPCLKSEL.sel, value: OSC.OSCERCLK}\n- {id: SIM.FLEXIOSRCSEL.sel, value: MCG.MCGPCLK}\n- {id: SIM.LPUART0SRCSEL.sel, value: MCG.MCGPCLK}\n- {id: SIM.LPUART1SRCSEL.sel, value: MCG.MCGPCLK}\n- {id: SIM.RTCCLKOUTSEL.sel, value: OSC.OSCERCLK}\n- {id: SIM.TPMSRCSEL.sel, value: MCG.MCGPCLK}\n- {id: SIM.USBSRCSEL.sel, value: MCG.MCGPCLK}\nsources:\n- {id: MCG.HIRC.outFreq, value: 48 MHz}\n- {id: OSC.OSC.outFreq, value: 32 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst mcglite_config_t mcgliteConfig_BOARD_BootClockRUN =\n    {\n        .outSrc = kMCGLITE_ClkSrcHirc,            /* MCGOUTCLK source is HIRC */\n        .irclkEnableMode = kMCGLITE_IrclkEnable,  /* MCGIRCLK enabled, MCGIRCLK disabled in STOP mode */\n        .ircs = kMCGLITE_Lirc8M,                  /* Slow internal reference (LIRC) 8 MHz clock selected */\n        .fcrdiv = kMCGLITE_LircDivBy1,            /* Low-frequency Internal Reference Clock Divider: divided by 1 */\n        .lircDiv2 = kMCGLITE_LircDivBy1,          /* Second Low-frequency Internal Reference Clock Divider: divided by 1 */\n        .hircEnableInNotHircMode = true,          /* HIRC source is enabled */\n    };\nconst sim_clock_config_t simConfig_BOARD_BootClockRUN =\n    {\n        .er32kSrc = SIM_OSC32KSEL_OSC32KCLK_CLK,  /* OSC32KSEL select: OSC32KCLK clock */\n        .clkdiv1 = 0x10000U,                      /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV4: /2 */\n    };\nconst osc_config_t oscConfig_BOARD_BootClockRUN =\n    {\n        .freq = 0U,                               /* Oscillator frequency: 0Hz */\n        .capLoad = (OSC_CAP0P),                   /* Oscillator capacity load: 0pF */\n        .workMode = kOSC_ModeOscLowPower,         /* Oscillator low power */\n        .oscerConfig =\n            {\n                .enableMode = kOSC_ErClkEnable,   /* Enable external reference clock, disable external reference clock in STOP mode */\n            }\n    };\n\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Set the system clock dividers in SIM to safe value. */\n    CLOCK_SetSimSafeDivs();\n    /* Set MCG to HIRC mode. */\n    CLOCK_SetMcgliteConfig(&mcgliteConfig_BOARD_BootClockRUN);\n    /* Set the clock configuration in SIM module. */\n    CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN);\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockVLPR ***********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockVLPR\noutputs:\n- {id: Bus_clock.outFreq, value: 1 MHz}\n- {id: Core_clock.outFreq, value: 2 MHz}\n- {id: Flash_clock.outFreq, value: 1 MHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: MCGIRCLK.outFreq, value: 2 MHz}\n- {id: System_clock.outFreq, value: 2 MHz}\nsettings:\n- {id: MCGMode, value: LIRC2M}\n- {id: powerMode, value: VLPR}\n- {id: MCG_C2_OSC_MODE_CFG, value: ModeOscLowPower}\n- {id: RTCCLKOUTConfig, value: 'yes'}\n- {id: SIM.OUTDIV4.scale, value: '2', locked: true}\n- {id: SIM.RTCCLKOUTSEL.sel, value: OSC.OSCERCLK}\nsources:\n- {id: MCG.LIRC.outFreq, value: 2 MHz}\n- {id: OSC.OSC.outFreq, value: 32.768 kHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockVLPR configuration\n ******************************************************************************/\nconst mcglite_config_t mcgliteConfig_BOARD_BootClockVLPR =\n    {\n        .outSrc = kMCGLITE_ClkSrcLirc,            /* MCGOUTCLK source is LIRC */\n        .irclkEnableMode = kMCGLITE_IrclkEnable,  /* MCGIRCLK enabled, MCGIRCLK disabled in STOP mode */\n        .ircs = kMCGLITE_Lirc2M,                  /* Slow internal reference (LIRC) 2 MHz clock selected */\n        .fcrdiv = kMCGLITE_LircDivBy1,            /* Low-frequency Internal Reference Clock Divider: divided by 1 */\n        .lircDiv2 = kMCGLITE_LircDivBy1,          /* Second Low-frequency Internal Reference Clock Divider: divided by 1 */\n        .hircEnableInNotHircMode = false,         /* HIRC source is not enabled */\n    };\nconst sim_clock_config_t simConfig_BOARD_BootClockVLPR =\n    {\n        .er32kSrc = SIM_OSC32KSEL_OSC32KCLK_CLK,  /* OSC32KSEL select: OSC32KCLK clock */\n        .clkdiv1 = 0x10000U,                      /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV4: /2 */\n    };\nconst osc_config_t oscConfig_BOARD_BootClockVLPR =\n    {\n        .freq = 0U,                               /* Oscillator frequency: 0Hz */\n        .capLoad = (OSC_CAP0P),                   /* Oscillator capacity load: 0pF */\n        .workMode = kOSC_ModeOscLowPower,         /* Oscillator low power */\n        .oscerConfig =\n            {\n                .enableMode = OSC_ER_CLK_DISABLE, /* Disable external reference clock */\n            }\n    };\n\n/*******************************************************************************\n * Code for BOARD_BootClockVLPR configuration\n ******************************************************************************/\nvoid BOARD_BootClockVLPR(void)\n{\n    /* Set the system clock dividers in SIM to safe value. */\n    CLOCK_SetSimSafeDivs();\n    /* Set MCG to LIRC2M mode. */\n    CLOCK_SetMcgliteConfig(&mcgliteConfig_BOARD_BootClockVLPR);\n    /* Set the clock configuration in SIM module. */\n    CLOCK_SetSimConfig(&simConfig_BOARD_BootClockVLPR);\n    /* Set VLPR power mode. */\n    SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll);\n#if (defined(FSL_FEATURE_SMC_HAS_LPWUI) && FSL_FEATURE_SMC_HAS_LPWUI)\n    SMC_SetPowerModeVlpr(SMC, false);\n#else\n    SMC_SetPowerModeVlpr(SMC);\n#endif\n    while (SMC_GetPowerModeState(SMC) != kSMC_PowerStateVlpr)\n    {\n    }\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKVLPR_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/frdm_k32l2b/clock_config.h",
    "content": "/*\n * Copyright 2019 ,2021 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK              48000000U  /*!< Core clock frequency: 48000000Hz */\n\n/*! @brief MCG lite set for BOARD_BootClockRUN configuration.\n */\nextern const mcglite_config_t mcgliteConfig_BOARD_BootClockRUN;\n/*! @brief SIM module set for BOARD_BootClockRUN configuration.\n */\nextern const sim_clock_config_t simConfig_BOARD_BootClockRUN;\n/*! @brief OSC set for BOARD_BootClockRUN configuration.\n */\nextern const osc_config_t oscConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockVLPR ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockVLPR configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKVLPR_CORE_CLOCK              2000000U  /*!< Core clock frequency: 2000000Hz */\n\n/*! @brief MCG lite set for BOARD_BootClockVLPR configuration.\n */\nextern const mcglite_config_t mcgliteConfig_BOARD_BootClockVLPR;\n/*! @brief SIM module set for BOARD_BootClockVLPR configuration.\n */\nextern const sim_clock_config_t simConfig_BOARD_BootClockVLPR;\n/*! @brief OSC set for BOARD_BootClockVLPR configuration.\n */\nextern const osc_config_t oscConfig_BOARD_BootClockVLPR;\n\n/*******************************************************************************\n * API for BOARD_BootClockVLPR configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockVLPR(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/kuiic/board.cmake",
    "content": "set(MCU_VARIANT K32L2B31A)\nset(MCU_CORE ${MCU_VARIANT})\n\nset(JLINK_DEVICE K32L2B31xxxxA)\nset(PYOCD_TARGET K32L2B)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/kuiic.ld)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_K32L2B31VLH0A\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${MCUX_DEVICES}/K32L/periph2\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/kuiic/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Kuiic\n   url: https://github.com/nxf58843/kuiic\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"fsl_device_registers.h\"\n\n#define USB_CLOCK_SOURCE kCLOCK_UsbSrcIrc48M\n\n// LED\n#define LED_PIN_CLOCK         kCLOCK_PortA\n#define LED_GPIO              GPIOA\n#define LED_PORT              PORTA\n#define LED_PIN               2\n#define LED_STATE_ON          1\n\n// UART\n#define UART_PORT             LPUART1\n#define UART_PIN_RX           3u\n#define UART_PIN_TX           0u\n\n#define UART_CLOCK_SOURCE_HZ  CLOCK_GetFreq(kCLOCK_McgIrc48MClk)\n\nstatic inline void BOARD_InitBootPins(void) {\n  /* PORTC3 is configured as LPUART0_RX */\n  PORT_SetPinMux(PORTC, 3U, kPORT_MuxAlt3);\n  /* PORTA2 (pin 24) is configured as LPUART0_TX */\n  PORT_SetPinMux(PORTE, 0U, kPORT_MuxAlt3);\n\n  SIM->SOPT5 = ((SIM->SOPT5 &\n                 /* Mask bits to zero which are setting */\n                 (~(SIM_SOPT5_LPUART1TXSRC_MASK | SIM_SOPT5_LPUART1RXSRC_MASK)))\n                /* LPUART0 Transmit Data Source Select: LPUART0_TX pin. */\n                | SIM_SOPT5_LPUART1TXSRC(SOPT5_LPUART1TXSRC_LPUART_TX)\n                /* LPUART0 Receive Data Source Select: LPUART_RX pin. */\n                | SIM_SOPT5_LPUART1RXSRC(SOPT5_LPUART1RXSRC_LPUART_RX));\n  CLOCK_SetLpuart1Clock(1);\n}\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/kuiic/board.mk",
    "content": "MCU_VARIANT = K32L2B31A\n\nCFLAGS += -DCPU_K32L2B31VLH0A\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=redundant-decls\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/kuiic.ld\n\nINC += \\\n\t$(TOP)/$(MCUX_DEVICES)/K32L/periph2\n\nSRC_C += \\\n\t$(BOARD_PATH)/clock_config.c\n\n# For flash-jlink target\nJLINK_DEVICE = K32L2B31xxxxA\n\n# For flash-pyocd target\nPYOCD_TARGET = K32L2B\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/kuiic/clock_config.c",
    "content": "#include \"clock_config.h\"\n#include \"fsl_clock.h\"\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n/* System clock frequency. */\n// extern uint32_t SystemCoreClock;\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst mcglite_config_t mcgliteConfig_BOARD_BootClockRUN = {\n    .outSrc          = kMCGLITE_ClkSrcHirc,  /* MCGOUTCLK source is HIRC */\n    .irclkEnableMode = kMCGLITE_IrclkEnable, /* MCGIRCLK enabled, MCGIRCLK disabled in STOP mode */\n    .ircs            = kMCGLITE_Lirc8M,      /* Slow internal reference (LIRC) 8 MHz clock selected */\n    .fcrdiv          = kMCGLITE_LircDivBy1,  /* Low-frequency Internal Reference Clock Divider: divided by 1 */\n    .lircDiv2        = kMCGLITE_LircDivBy1,  /* Second Low-frequency Internal Reference Clock Divider: divided by 1 */\n    .hircEnableInNotHircMode = true,         /* HIRC source is enabled */\n};\nconst sim_clock_config_t simConfig_BOARD_BootClockRUN = {\n    .er32kSrc = SIM_OSC32KSEL_LPO_CLK,       /* OSC32KSEL select: LPO clock */\n    .clkdiv1  = 0x10000U,                    /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV4: /2 */\n};\n\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n  /* Set the system clock dividers in SIM to safe value. */\n  CLOCK_SetSimSafeDivs();\n  /* Set MCG to HIRC mode. */\n  CLOCK_SetMcgliteConfig(&mcgliteConfig_BOARD_BootClockRUN);\n  /* Set the clock configuration in SIM module. */\n  CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN);\n  /* Set SystemCoreClock variable. */\n  SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/kuiic/clock_config.h",
    "content": "#ifndef CLOCK_CONFIG_H\n#define CLOCK_CONFIG_H\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define SIM_OSC32KSEL_LPO_CLK         3U        /*!< OSC32KSEL select: LPO clock */\n#define SOPT5_LPUART1RXSRC_LPUART_RX  0x00u     /*!<@brief LPUART1 Receive Data Source Select: LPUART_RX pin */\n#define SOPT5_LPUART1TXSRC_LPUART_TX  0x00u     /*!<@brief LPUART1 Transmit Data Source Select: LPUART_TX pin */\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK 48000000U /*!< Core clock frequency: 48000000Hz */\n\nvoid BOARD_BootClockRUN(void);\n\n#endif\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/boards/kuiic/kuiic.ld",
    "content": "/*\n** ###################################################################\n**     Processors:          K32L2B31VFM0A\n**                          K32L2B31VFT0A\n**                          K32L2B31VLH0A\n**                          K32L2B31VMP0A\n**\n**     Compiler:            GNU C Compiler\n**     Reference manual:    K32L2B3xRM, Rev.0, July 2019\n**     Version:             rev. 1.0, 2019-07-30\n**     Build:               b190930\n**\n**     Abstract:\n**         Linker file for the GNU C Compiler\n**\n**     Copyright 2016 Freescale Semiconductor, Inc.\n**     Copyright 2016-2019 NXP\n**     All rights reserved.\n**\n**     SPDX-License-Identifier: BSD-3-Clause\n**\n**     http:                 www.nxp.com\n**     mail:                 support@nxp.com\n**\n** ###################################################################\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\nHEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;\n\n/* Specify the memory areas */\nMEMORY\n{\n  m_interrupts          (RX)  : ORIGIN = 0x00008000, LENGTH = 0x00000200\n  m_flash_config        (RX)  : ORIGIN = 0x00008400, LENGTH = 0x00000010\n  m_text                (RX)  : ORIGIN = 0x00008410, LENGTH = 0x00037BF0\n  m_data                (RW)  : ORIGIN = 0x1FFFE000, LENGTH = 0x00008000\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into internal flash */\n  .interrupts :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector))     /* Startup code */\n    . = ALIGN(4);\n  } > m_interrupts\n\n  .flash_config :\n  {\n    . = ALIGN(4);\n    KEEP(*(.FlashConfig))    /* Flash Configuration Field (FCF) */\n    . = ALIGN(4);\n  } > m_flash_config\n\n  /* The program code and other data goes into internal flash */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)                 /* .text sections (code) */\n    *(.text*)                /* .text* sections (code) */\n    *(.rodata)               /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)              /* .rodata* sections (constants, strings, etc.) */\n    *(.glue_7)               /* glue arm to thumb code */\n    *(.glue_7t)              /* glue thumb to arm code */\n    *(.eh_frame)\n    KEEP (*(.init))\n    KEEP (*(.fini))\n    . = ALIGN(4);\n  } > m_text\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } > m_text\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } > m_text\n\n .ctors :\n  {\n    __CTOR_LIST__ = .;\n    /* gcc uses crtbegin.o to find the start of\n       the constructors, so we make sure it is\n       first.  Because this is a wildcard, it\n       doesn't matter if the user does not\n       actually link against crtbegin.o; the\n       linker won't look for a file to match a\n       wildcard.  The wildcard also means that it\n       doesn't matter which directory crtbegin.o\n       is in.  */\n    KEEP (*crtbegin.o(.ctors))\n    KEEP (*crtbegin?.o(.ctors))\n    /* We don't want to include the .ctor section from\n       from the crtend.o file until after the sorted ctors.\n       The .ctor section from the crtend file contains the\n       end of ctors marker and it must be last */\n    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))\n    KEEP (*(SORT(.ctors.*)))\n    KEEP (*(.ctors))\n    __CTOR_END__ = .;\n  } > m_text\n\n  .dtors :\n  {\n    __DTOR_LIST__ = .;\n    KEEP (*crtbegin.o(.dtors))\n    KEEP (*crtbegin?.o(.dtors))\n    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))\n    KEEP (*(SORT(.dtors.*)))\n    KEEP (*(.dtors))\n    __DTOR_END__ = .;\n  } > m_text\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } > m_text\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } > m_text\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } > m_text\n\n  __etext = .;    /* define a global symbol at end of code */\n  __DATA_ROM = .; /* Symbol is used by startup for data initialization */\n\n  /* reserve MTB memory at the beginning of m_data */\n  .mtb : /* MTB buffer address as defined by the hardware */\n  {\n    . = ALIGN(8);\n    _mtb_start = .;\n    KEEP(*(.mtb_buf)) /* need to KEEP Micro Trace Buffer as not referenced by application */\n    . = ALIGN(8);\n    _mtb_end = .;\n  } > m_data\n\n  .data : AT(__DATA_ROM)\n  {\n    . = ALIGN(4);\n    __DATA_RAM = .;\n    __data_start__ = .;      /* create a global symbol at data start */\n    *(.data)                 /* .data sections */\n    *(.data*)                /* .data* sections */\n    KEEP(*(.jcr*))\n    . = ALIGN(4);\n    __data_end__ = .;        /* define a global symbol at data end */\n  } > m_data\n\n  __DATA_END = __DATA_ROM + (__data_end__ - __data_start__);\n  text_end = ORIGIN(m_text) + LENGTH(m_text);\n  ASSERT(__DATA_END <= text_end, \"region m_text overflowed with text and data\")\n\n  /* Uninitialized data section */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    . = ALIGN(4);\n    __START_BSS = .;\n    __bss_start__ = .;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n    . = ALIGN(4);\n    __bss_end__ = .;\n    __END_BSS = .;\n  } > m_data\n\n  .heap :\n  {\n    . = ALIGN(8);\n    __end__ = .;\n    PROVIDE(end = .);\n    __HeapBase = .;\n    . += HEAP_SIZE;\n    __HeapLimit = .;\n    __heap_limit = .; /* Add for _sbrk */\n  } > m_data\n\n  .stack :\n  {\n    . = ALIGN(8);\n    . += STACK_SIZE;\n  } > m_data\n\n  /* Initializes stack on the end of block */\n  __StackTop   = ORIGIN(m_data) + LENGTH(m_data);\n  __StackLimit = __StackTop - STACK_SIZE;\n  PROVIDE(__stack = __StackTop);\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n\n  ASSERT(__StackLimit >= __HeapLimit, \"region m_data overflowed with stack and heap\")\n}\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n * Copyright (c) 2020, Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"fsl_gpio.h\"\n#include \"fsl_port.h\"\n#include \"fsl_clock.h\"\n#include \"fsl_lpuart.h\"\n\n#include \"clock_config.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid board_init(void) {\n  /* Enable port clocks for GPIO pins */\n  CLOCK_EnableClock(kCLOCK_PortA);\n  CLOCK_EnableClock(kCLOCK_PortB);\n  CLOCK_EnableClock(kCLOCK_PortC);\n  CLOCK_EnableClock(kCLOCK_PortD);\n  CLOCK_EnableClock(kCLOCK_PortE);\n\n  BOARD_InitBootPins();\n  BOARD_BootClockRUN();\n  SystemCoreClockUpdate();\n\n  gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0};\n  GPIO_PinInit(LED_GPIO, LED_PIN, &led_config);\n  PORT_SetPinMux(LED_PORT, LED_PIN, kPORT_MuxAsGpio);\n\n#ifdef BUTTON_PIN\n  gpio_pin_config_t button_config = {kGPIO_DigitalInput, 0};\n  GPIO_PinInit(BUTTON_GPIO, BUTTON_PIN, &button_config);\n  const port_pin_config_t BUTTON_CFG = {\n      kPORT_PullUp,\n      kPORT_FastSlewRate,\n      kPORT_PassiveFilterDisable,\n#if defined(FSL_FEATURE_PORT_HAS_OPEN_DRAIN) && FSL_FEATURE_PORT_HAS_OPEN_DRAIN\n      kPORT_OpenDrainDisable,\n#endif\n      kPORT_LowDriveStrength,\n      kPORT_MuxAsGpio,\n#if defined(FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK) && FSL_FEATURE_PORT_HAS_PIN_CONTROL_LOCK\n      kPORT_UnlockRegister\n#endif\n  };\n  PORT_SetPinConfig(BUTTON_PORT, BUTTON_PIN, &BUTTON_CFG);\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  lpuart_config_t uart_config;\n  LPUART_GetDefaultConfig(&uart_config);\n  uart_config.baudRate_Bps = CFG_BOARD_UART_BAUDRATE;\n  uart_config.enableTx = true;\n  uart_config.enableRx = true;\n  LPUART_Init(UART_PORT, &uart_config, UART_CLOCK_SOURCE_HZ);\n\n  // USB\n  CLOCK_EnableUsbfs0Clock(USB_CLOCK_SOURCE, 48000000U);\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinWrite(LED_GPIO, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n#ifdef BUTTON_PIN\n  return BUTTON_STATE_ACTIVE == GPIO_PinRead(BUTTON_GPIO, BUTTON_PIN);\n#else\n  return 0;\n#endif\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n#if 0 /*\n\tUse this version if want the LED to blink during BOARD=board_test,\n\twithout having to hit a key.\n      */\n  if( 0U != (kLPUART_RxDataRegFullFlag & LPUART_GetStatusFlags( UART_PORT )) )\n    {\n      LPUART_ReadBlocking(UART_PORT, buf, len);\n      return len;\n    }\n\n  return( 0 );\n#else /* Wait for 'len' characters to come in */\n\n  LPUART_ReadBlocking(UART_PORT, buf, len);\n  return len;\n\n#endif\n}\n\nint board_uart_write(void const* buf, int len) {\n  LPUART_WriteBlocking(UART_PORT, (uint8_t const*) buf, len);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\n#ifndef __ICCARM__\n// Implement _start() since we use linker flag '-nostartfiles'.\n// Requires defined __STARTUP_CLEAR_BSS,\nextern int main(void);\n\nTU_ATTR_UNUSED void _start(void) {\n  // called by startup code\n  main();\n  while (1) {}\n}\n\n#ifdef __clang__\nvoid\t_exit (int __status) {\n  (void) __status;\n  while (1) {}\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/family.cmake",
    "content": "include_guard()\n\nset(MCUX_CORE ${TOP}/hw/mcu/nxp/mcuxsdk-core)\nset(MCUX_DEVICES ${TOP}/hw/mcu/nxp/mcux-devices-kinetis)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_6)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS KINETIS_K32L CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\n  set(LD_FILE_GNU ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/gcc/${MCU_CORE}_flash.ld)\nendif ()\nif (NOT DEFINED STARTUP_FILE_GNU)\n  set(STARTUP_FILE_GNU ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S)\nendif ()\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    # driver\n    ${MCUX_CORE}/drivers/gpio/fsl_gpio.c\n    ${MCUX_CORE}/drivers/common/fsl_common_arm.c\n    ${MCUX_CORE}/drivers/lpuart/fsl_lpuart.c\n    # mcu\n    ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/system_${MCU_VARIANT}.c\n    ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/drivers/fsl_clock.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __STARTUP_CLEAR_BSS\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    ${MCUX_CORE}/drivers/common\n    ${MCUX_CORE}/drivers/gpio\n    ${MCUX_CORE}/drivers/lpuart\n    ${MCUX_CORE}/drivers/port\n    ${MCUX_CORE}/drivers/smc\n    ${MCUX_DEVICES}/K32L/${MCU_VARIANT}\n    ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/drivers\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_K32L)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nxp/khci/dcd_khci.c\n    ${TOP}/src/portable/nxp/khci/hcd_khci.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      -nostartfiles\n      )\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_flash_jlink(${TARGET})\n  family_add_bin_hex(${TARGET})\n  family_flash_teensy(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_k32l/family.mk",
    "content": "UF2_FAMILY_ID = 0x7f83e793\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\nMCUX_CORE = hw/mcu/nxp/mcuxsdk-core\nMCUX_DEVICES = hw/mcu/nxp/mcux-devices-kinetis\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_KINETIS_K32L\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  -specs=nosys.specs -specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/nxp/khci/dcd_khci.c \\\n\tsrc/portable/nxp/khci/hcd_khci.c \\\n\t$(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/system_$(MCU_VARIANT).c \\\n\t$(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/drivers/fsl_clock.c \\\n\t$(MCUX_CORE)/drivers/gpio/fsl_gpio.c \\\n\t$(MCUX_CORE)/drivers/lpuart/fsl_lpuart.c \\\n\t$(MCUX_CORE)/drivers/common/fsl_common_arm.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_6/CMSIS/Core/Include \\\n\t$(TOP)/$(MCUX_DEVICES)/K32L/$(MCU_VARIANT) \\\n\t$(TOP)/$(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/drivers \\\n\t$(TOP)/$(MCUX_CORE)/drivers/common \\\n\t$(TOP)/$(MCUX_CORE)/drivers/gpio \\\n\t$(TOP)/$(MCUX_CORE)/drivers/lpuart \\\n\t$(TOP)/$(MCUX_CORE)/drivers/port \\\n\t$(TOP)/$(MCUX_CORE)/drivers/smc\n\nSRC_S += $(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/gcc/startup_$(MCU_VARIANT).S\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/boards/frdm_kl25z/board.cmake",
    "content": "set(MCU_VARIANT MKL25Z4)\n\nset(JLINK_DEVICE MKL25Z128xxx4)\nset(PYOCD_TARGET mkl25zl128)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../gcc/MKL25Z128xxx4_flash.ld)\nset(STARTUP_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../gcc/startup_MKL25Z4.S)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MKL25Z128VLK4\n    CFG_EXAMPLE_MSC_READONLY\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/boards/frdm_kl25z/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* metadata:\n   name: fomu\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/general-purpose-mcus/freedom-development-platform-for-kinetis-kl14-kl15-kl24-kl25-mcus:FRDM-KL25Z\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n// LED\n#define LED_PINMUX            IOMUXC_GPIO_AD_B0_09_GPIO1_IO09\n#define LED_PORT              GPIOB\n#define LED_PIN_CLOCK         kCLOCK_PortB\n#define LED_PIN_PORT          PORTB\n#define LED_PIN               19U\n#define LED_PIN_FUNCTION      kPORT_MuxAsGpio\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN_CLOCK      kCLOCK_PortC\n#define BUTTON_PIN_PORT       PORTC\n#define BUTTON_PIN            9U\n#define BUTTON_PIN_FUNCTION   kPORT_MuxAsGpio\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_PORT             UART0\n#define UART_PIN_CLOCK        kCLOCK_PortA\n#define UART_PIN_PORT         PORTA\n#define UART_PIN_RX           1u\n#define UART_PIN_TX           2u\n#define UART_PIN_FUNCTION     kPORT_MuxAlt2\n#define SOPT5_UART0RXSRC_UART_RX      0x00u   /*!< UART0 receive data source select: UART0_RX pin */\n#define SOPT5_UART0TXSRC_UART_TX      0x00u   /*!< UART0 transmit data source select: UART0_TX pin */\n\n#endif\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/boards/frdm_kl25z/board.mk",
    "content": "MCU = MKL25Z4\n\nCFLAGS += \\\n  -DCPU_MKL25Z128VLK4 \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -DCFG_EXAMPLE_MSC_READONLY\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=format -Wno-error=redundant-decls\n\nSRC_C += \\\n\t$(BOARD_PATH)/clock_config.c \\\n\n# All source paths should be relative to the top level.\nLD_FILE = $(FAMILY_PATH)/gcc/MKL25Z128xxx4_flash.ld\n\nSRC_S += $(FAMILY_PATH)/gcc/startup_$(MCU).S\n\n# For flash-jlink target\nJLINK_DEVICE = MKL25Z128xxx4\n\n# For flash-pyocd target\nPYOCD_TARGET = mkl25zl128\n\n# flash using pyocd\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/boards/frdm_kl25z/clock_config.c",
    "content": "/*\n * Copyright (c) 2015, Freescale Semiconductor, Inc.\n * Copyright 2016-2017 NXP\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * o Redistributions of source code must retain the above copyright notice, this list\n *   of conditions and the following disclaimer.\n *\n * o Redistributions in binary form must reproduce the above copyright notice, this\n *   list of conditions and the following disclaimer in the documentation and/or\n *   other materials provided with the distribution.\n *\n * o Neither the name of the copyright holder nor the names of its\n *   contributors may be used to endorse or promote products derived from this\n *   software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * How to setup clock using clock driver functions:\n *\n * 1. CLOCK_SetSimSafeDivs, to make sure core clock, bus clock, flexbus clock\n *    and flash clock are in allowed range during clock mode switch.\n *\n * 2. Call CLOCK_Osc0Init to setup OSC clock, if it is used in target mode.\n *\n * 3. Set MCG configuration, MCG includes three parts: FLL clock, PLL clock and\n *    internal reference clock(MCGIRCLK). Follow the steps to setup:\n *\n *    1). Call CLOCK_BootToXxxMode to set MCG to target mode.\n *\n *    2). If target mode is FBI/BLPI/PBI mode, the MCGIRCLK has been configured\n *        correctly. For other modes, need to call CLOCK_SetInternalRefClkConfig\n *        explicitly to setup MCGIRCLK.\n *\n *    3). Don't need to configure FLL explicitly, because if target mode is FLL\n *        mode, then FLL has been configured by the function CLOCK_BootToXxxMode,\n *        if the target mode is not FLL mode, the FLL is disabled.\n *\n *    4). If target mode is PEE/PBE/PEI/PBI mode, then the related PLL has been\n *        setup by CLOCK_BootToXxxMode. In FBE/FBI/FEE/FBE mode, the PLL could\n *        be enabled independently, call CLOCK_EnablePll0 explicitly in this case.\n *\n * 4. Call CLOCK_SetSimConfig to set the clock configuration in SIM.\n */\n\n/* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL *****************************\n!!ClocksProfile\nproduct: Clocks v1.0\nprocessor: MKL25Z128xxx4\npackage_id: MKL25Z128VLK4\nmcu_data: ksdk2_0\nprocessor_version: 1.1.0\nboard: FRDM-KL25Z\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/\n\n#include \"fsl_smc.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define MCG_PLL_DISABLE                                   0U  /*!< MCGPLLCLK disabled */\n#define OSC_CAP0P                                         0U  /*!< Oscillator 0pF capacitor load */\n#define OSC_ER_CLK_DISABLE                                0U  /*!< Disable external reference clock */\n#define SIM_OSC32KSEL_LPO_CLK                             3U  /*!< OSC32KSEL select: LPO clock */\n#define SIM_PLLFLLSEL_MCGFLLCLK_CLK                       0U  /*!< PLLFLL select: MCGFLLCLK clock */\n#define SIM_PLLFLLSEL_MCGPLLCLK_CLK                       1U  /*!< PLLFLL select: MCGPLLCLK clock */\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n/* System clock frequency. */\n//extern uint32_t SystemCoreClock;\n\n/*******************************************************************************\n * Code\n******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*FUNCTION**********************************************************************\n *\n * Function Name : CLOCK_CONFIG_SetFllExtRefDiv\n * Description   : Configure FLL external reference divider (FRDIV).\n * Param frdiv   : The value to set FRDIV.\n *\n *END**************************************************************************/\nstatic void CLOCK_CONFIG_SetFllExtRefDiv(uint8_t frdiv)\n{\n    MCG->C1 = ((MCG->C1 & ~MCG_C1_FRDIV_MASK) | MCG_C1_FRDIV(frdiv));\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL *****************************\n!!Configuration\nname: BOARD_BootClockRUN\noutputs:\n- {id: Bus_clock.outFreq, value: 24 MHz}\n- {id: Core_clock.outFreq, value: 48 MHz, locked: true, accuracy: '0.001'}\n- {id: ERCLK32K.outFreq, value: 1 kHz}\n- {id: Flash_clock.outFreq, value: 24 MHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: MCGIRCLK.outFreq, value: 32.768 kHz}\n- {id: OSCERCLK.outFreq, value: 8 MHz}\n- {id: PLLFLLCLK.outFreq, value: 48 MHz}\n- {id: System_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: MCGMode, value: PEE}\n- {id: MCG.FCRDIV.scale, value: '1', locked: true}\n- {id: MCG.FRDIV.scale, value: '32'}\n- {id: MCG.IREFS.sel, value: MCG.FRDIV}\n- {id: MCG.PLLS.sel, value: MCG.PLL}\n- {id: MCG.PRDIV.scale, value: '2', locked: true}\n- {id: MCG.VDIV.scale, value: '24', locked: true}\n- {id: MCG_C1_IRCLKEN_CFG, value: Enabled}\n- {id: MCG_C2_OSC_MODE_CFG, value: ModeOscLowPower}\n- {id: MCG_C2_RANGE0_CFG, value: High}\n- {id: MCG_C2_RANGE0_FRDIV_CFG, value: High}\n- {id: OSC0_CR_ERCLKEN_CFG, value: Enabled}\n- {id: OSC_CR_ERCLKEN_CFG, value: Enabled}\n- {id: SIM.CLKOUTSEL.sel, value: SIM.OUTDIV4}\n- {id: SIM.OSC32KSEL.sel, value: PMC.LPOCLK}\n- {id: SIM.OUTDIV1.scale, value: '2'}\n- {id: SIM.PLLFLLSEL.sel, value: SIM.MCGPLLCLK_DIV2}\n- {id: SIM.TPMSRCSEL.sel, value: SIM.PLLFLLSEL}\n- {id: SIM.UART0SRCSEL.sel, value: SIM.PLLFLLSEL}\n- {id: SIM.USBSRCSEL.sel, value: SIM.PLLFLLSEL}\nsources:\n- {id: OSC.OSC.outFreq, value: 8 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst mcg_config_t mcgConfig_BOARD_BootClockRUN =\n    {\n        .mcgMode = kMCG_ModePEE,                  /* PEE - PLL Engaged External */\n        .irclkEnableMode = kMCG_IrclkEnable,      /* MCGIRCLK enabled, MCGIRCLK disabled in STOP mode */\n        .ircs = kMCG_IrcSlow,                     /* Slow internal reference clock selected */\n        .fcrdiv = 0x0U,                           /* Fast IRC divider: divided by 1 */\n        .frdiv = 0x0U,                            /* FLL reference clock divider: divided by 32 */\n        .drs = kMCG_DrsLow,                       /* Low frequency range */\n        .dmx32 = kMCG_Dmx32Default,               /* DCO has a default range of 25% */\n        .pll0Config =\n            {\n                .enableMode = MCG_PLL_DISABLE,    /* MCGPLLCLK disabled */\n                .prdiv = 0x1U,                    /* PLL Reference divider: divided by 2 */\n                .vdiv = 0x0U,                     /* VCO divider: multiplied by 24 */\n            },\n    };\nconst sim_clock_config_t simConfig_BOARD_BootClockRUN =\n    {\n        .pllFllSel = SIM_PLLFLLSEL_MCGPLLCLK_CLK, /* PLLFLL select: MCGPLLCLK clock */\n        .er32kSrc = SIM_OSC32KSEL_LPO_CLK,        /* OSC32KSEL select: LPO clock */\n        .clkdiv1 = 0x10010000U,                   /* SIM_CLKDIV1 - OUTDIV1: /2, OUTDIV4: /2 */\n    };\nconst osc_config_t oscConfig_BOARD_BootClockRUN =\n    {\n        .freq = 8000000U,                         /* Oscillator frequency: 8000000Hz */\n        .capLoad = (OSC_CAP0P),                   /* Oscillator capacity load: 0pF */\n        .workMode = kOSC_ModeOscLowPower,         /* Oscillator low power */\n        .oscerConfig =\n            {\n                .enableMode = kOSC_ErClkEnable,   /* Enable external reference clock, disable external reference clock in STOP mode */\n            }\n    };\n\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Set the system clock dividers in SIM to safe value. */\n    CLOCK_SetSimSafeDivs();\n    /* Initializes OSC0 according to board configuration. */\n    CLOCK_InitOsc0(&oscConfig_BOARD_BootClockRUN);\n    CLOCK_SetXtal0Freq(oscConfig_BOARD_BootClockRUN.freq);\n    /* Configure FLL external reference divider (FRDIV). */\n    CLOCK_CONFIG_SetFllExtRefDiv(mcgConfig_BOARD_BootClockRUN.frdiv);\n    /* Set MCG to PEE mode. */\n    CLOCK_BootToPeeMode(kMCG_OscselOsc,\n                        kMCG_PllClkSelPll0,\n                        &mcgConfig_BOARD_BootClockRUN.pll0Config);\n    /* Configure the Internal Reference clock (MCGIRCLK). */\n    CLOCK_SetInternalRefClkConfig(mcgConfig_BOARD_BootClockRUN.irclkEnableMode,\n                                  mcgConfig_BOARD_BootClockRUN.ircs,\n                                  mcgConfig_BOARD_BootClockRUN.fcrdiv);\n    /* Set the clock configuration in SIM module. */\n    CLOCK_SetSimConfig(&simConfig_BOARD_BootClockRUN);\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockVLPR ***********************\n ******************************************************************************/\n/* TEXT BELOW IS USED AS SETTING FOR THE CLOCKS TOOL *****************************\n!!Configuration\nname: BOARD_BootClockVLPR\noutputs:\n- {id: Bus_clock.outFreq, value: 800 kHz}\n- {id: Core_clock.outFreq, value: 4 MHz}\n- {id: ERCLK32K.outFreq, value: 1 kHz}\n- {id: Flash_clock.outFreq, value: 800 kHz}\n- {id: LPO_clock.outFreq, value: 1 kHz}\n- {id: MCGIRCLK.outFreq, value: 4 MHz}\n- {id: System_clock.outFreq, value: 4 MHz}\nsettings:\n- {id: MCGMode, value: BLPI}\n- {id: powerMode, value: VLPR}\n- {id: MCG.CLKS.sel, value: MCG.IRCS}\n- {id: MCG.FCRDIV.scale, value: '1', locked: true}\n- {id: MCG.FRDIV.scale, value: '32'}\n- {id: MCG.IRCS.sel, value: MCG.FCRDIV}\n- {id: MCG_C1_IRCLKEN_CFG, value: Enabled}\n- {id: MCG_C2_OSC_MODE_CFG, value: ModeOscLowPower}\n- {id: MCG_C2_RANGE0_CFG, value: High}\n- {id: MCG_C2_RANGE0_FRDIV_CFG, value: High}\n- {id: SIM.OSC32KSEL.sel, value: PMC.LPOCLK}\n- {id: SIM.OUTDIV4.scale, value: '5'}\nsources:\n- {id: OSC.OSC.outFreq, value: 8 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE CLOCKS TOOL **/\n\n/*******************************************************************************\n * Variables for BOARD_BootClockVLPR configuration\n ******************************************************************************/\nconst mcg_config_t mcgConfig_BOARD_BootClockVLPR =\n    {\n        .mcgMode = kMCG_ModeBLPI,                 /* BLPI - Bypassed Low Power Internal */\n        .irclkEnableMode = kMCG_IrclkEnable,      /* MCGIRCLK enabled, MCGIRCLK disabled in STOP mode */\n        .ircs = kMCG_IrcFast,                     /* Fast internal reference clock selected */\n        .fcrdiv = 0x0U,                           /* Fast IRC divider: divided by 1 */\n        .frdiv = 0x0U,                            /* FLL reference clock divider: divided by 32 */\n        .drs = kMCG_DrsLow,                       /* Low frequency range */\n        .dmx32 = kMCG_Dmx32Default,               /* DCO has a default range of 25% */\n        .pll0Config =\n            {\n                .enableMode = MCG_PLL_DISABLE,    /* MCGPLLCLK disabled */\n                .prdiv = 0x0U,                    /* PLL Reference divider: divided by 1 */\n                .vdiv = 0x0U,                     /* VCO divider: multiplied by 24 */\n            },\n    };\nconst sim_clock_config_t simConfig_BOARD_BootClockVLPR =\n    {\n        .pllFllSel = SIM_PLLFLLSEL_MCGFLLCLK_CLK, /* PLLFLL select: MCGFLLCLK clock */\n        .er32kSrc = SIM_OSC32KSEL_LPO_CLK,        /* OSC32KSEL select: LPO clock */\n        .clkdiv1 = 0x40000U,                      /* SIM_CLKDIV1 - OUTDIV1: /1, OUTDIV4: /5 */\n    };\nconst osc_config_t oscConfig_BOARD_BootClockVLPR =\n    {\n        .freq = 0U,                               /* Oscillator frequency: 0Hz */\n        .capLoad = (OSC_CAP0P),                   /* Oscillator capacity load: 0pF */\n        .workMode = kOSC_ModeOscLowPower,         /* Oscillator low power */\n        .oscerConfig =\n            {\n                .enableMode = OSC_ER_CLK_DISABLE, /* Disable external reference clock */\n            }\n    };\n\n/*******************************************************************************\n * Code for BOARD_BootClockVLPR configuration\n ******************************************************************************/\nvoid BOARD_BootClockVLPR(void)\n{\n    /* Set the system clock dividers in SIM to safe value. */\n    CLOCK_SetSimSafeDivs();\n    /* Set MCG to BLPI mode. */\n    CLOCK_BootToBlpiMode(mcgConfig_BOARD_BootClockVLPR.fcrdiv,\n                         mcgConfig_BOARD_BootClockVLPR.ircs,\n                         mcgConfig_BOARD_BootClockVLPR.irclkEnableMode);\n    /* Set the clock configuration in SIM module. */\n    CLOCK_SetSimConfig(&simConfig_BOARD_BootClockVLPR);\n    /* Set VLPR power mode. */\n    SMC_SetPowerModeProtection(SMC, kSMC_AllowPowerModeAll);\n#if (defined(FSL_FEATURE_SMC_HAS_LPWUI) && FSL_FEATURE_SMC_HAS_LPWUI)\n    SMC_SetPowerModeVlpr(SMC, false);\n#else\n    SMC_SetPowerModeVlpr(SMC);\n#endif\n    while (SMC_GetPowerModeState(SMC) != kSMC_PowerStateVlpr)\n    {\n    }\n    /* Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKVLPR_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/boards/frdm_kl25z/clock_config.h",
    "content": "/*\n * Copyright (c) 2015, Freescale Semiconductor, Inc.\n * Copyright 2016-2017 NXP\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * o Redistributions of source code must retain the above copyright notice, this list\n *   of conditions and the following disclaimer.\n *\n * o Redistributions in binary form must reproduce the above copyright notice, this\n *   list of conditions and the following disclaimer in the documentation and/or\n *   other materials provided with the distribution.\n *\n * o Neither the name of the copyright holder nor the names of its\n *   contributors may be used to endorse or promote products derived from this\n *   software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#define BOARD_XTAL0_CLK_HZ                          8000000U  /*!< Board xtal0 frequency in Hz */\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKRUN_CORE_CLOCK              48000000U  /*!< Core clock frequency: 48000000Hz */\n\n/*! @brief MCG set for BOARD_BootClockRUN configuration.\n */\nextern const mcg_config_t mcgConfig_BOARD_BootClockRUN;\n/*! @brief SIM module set for BOARD_BootClockRUN configuration.\n */\nextern const sim_clock_config_t simConfig_BOARD_BootClockRUN;\n/*! @brief OSC set for BOARD_BootClockRUN configuration.\n */\nextern const osc_config_t oscConfig_BOARD_BootClockRUN;\n\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************* Configuration BOARD_BootClockVLPR ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockVLPR configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKVLPR_CORE_CLOCK              4000000U  /*!< Core clock frequency: 4000000Hz */\n\n/*! @brief MCG set for BOARD_BootClockVLPR configuration.\n */\nextern const mcg_config_t mcgConfig_BOARD_BootClockVLPR;\n/*! @brief SIM module set for BOARD_BootClockVLPR configuration.\n */\nextern const sim_clock_config_t simConfig_BOARD_BootClockVLPR;\n/*! @brief OSC set for BOARD_BootClockVLPR configuration.\n */\nextern const osc_config_t oscConfig_BOARD_BootClockVLPR;\n\n/*******************************************************************************\n * API for BOARD_BootClockVLPR configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockVLPR(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n * Copyright (c) 2020, Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include \"fsl_device_registers.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_port.h\"\n#include \"fsl_clock.h\"\n#include \"fsl_lpsci.h\"\n\n#include \"clock_config.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void)\n{\n#if CFG_TUH_ENABLED\n  tuh_int_handler(0, true);\n#endif\n#if CFG_TUD_ENABLED\n  tud_int_handler(0);\n#endif\n}\n\nvoid board_init(void)\n{\n  BOARD_BootClockRUN();\n  SystemCoreClockUpdate();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  // LED\n  CLOCK_EnableClock(LED_PIN_CLOCK);\n  PORT_SetPinMux(LED_PIN_PORT, LED_PIN, LED_PIN_FUNCTION);\n  gpio_pin_config_t led_config = { kGPIO_DigitalOutput, 0 };\n  GPIO_PinInit(LED_PORT, LED_PIN, &led_config);\n  board_led_write(false);\n\n#if defined(BUTTON_PORT) && defined(BUTTON_PIN)\n  // Button\n  CLOCK_EnableClock(BUTTON_PIN_CLOCK);\n  port_pin_config_t button_port = {\n    .pullSelect = kPORT_PullUp,\n    .mux = BUTTON_PIN_FUNCTION,\n  };\n  PORT_SetPinConfig(BUTTON_PIN_PORT, BUTTON_PIN, &button_port);\n  gpio_pin_config_t button_config = { kGPIO_DigitalInput, 0 };\n  GPIO_PinInit(BUTTON_PORT, BUTTON_PIN, &button_config);\n#endif\n\n  // UART\n  CLOCK_EnableClock(UART_PIN_CLOCK);\n  PORT_SetPinMux(UART_PIN_PORT, UART_PIN_RX, UART_PIN_FUNCTION);\n  PORT_SetPinMux(UART_PIN_PORT, UART_PIN_TX, UART_PIN_FUNCTION);\n  SIM->SOPT5 = ((SIM->SOPT5 &\n    (~(SIM_SOPT5_UART0TXSRC_MASK | SIM_SOPT5_UART0RXSRC_MASK)))\n      | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)\n      | SIM_SOPT5_UART0RXSRC(SOPT5_UART0RXSRC_UART_RX)\n    );\n\n  lpsci_config_t uart_config;\n  CLOCK_SetLpsci0Clock(1);\n  LPSCI_GetDefaultConfig(&uart_config);\n  uart_config.baudRate_Bps = CFG_BOARD_UART_BAUDRATE;\n  uart_config.enableTx = true;\n  uart_config.enableRx = true;\n  LPSCI_Init(UART_PORT, &uart_config, CLOCK_GetPllFllSelClkFreq());\n\n  // USB\n  CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcPll0, CLOCK_GetFreq(kCLOCK_PllFllSelClk));\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  GPIO_PinWrite(LED_PORT, LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON));\n}\n\nuint32_t board_button_read(void)\n{\n#if defined(BUTTON_PORT) && defined(BUTTON_PIN)\n  return BUTTON_STATE_ACTIVE == GPIO_PinRead(BUTTON_PORT, BUTTON_PIN);\n#endif\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  LPSCI_ReadBlocking(UART_PORT, buf, len);\n  return len;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  LPSCI_WriteBlocking(UART_PORT, (uint8_t const*) buf, len);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n\n\n#ifndef __ICCARM__\n// Implement _start() since we use linker flag '-nostartfiles'.\n// Requires defined __STARTUP_CLEAR_BSS,\nextern int main(void);\nTU_ATTR_UNUSED void _start(void) {\n  // called by startup code\n  main();\n  while (1) {}\n}\n\n#ifdef __clang__\nvoid\t_exit (int __status) {\n  (void) __status;\n  while (1) {}\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/family.cmake",
    "content": "include_guard()\n\nif (NOT BOARD)\n  message(FATAL_ERROR \"BOARD not specified\")\nendif ()\n\nset(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-sdk)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS KINETIS_KL CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/drivers/gpio/fsl_gpio.c\n    ${SDK_DIR}/drivers/lpsci/fsl_lpsci.c\n    ${SDK_DIR}/drivers/uart/fsl_uart.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_clock.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/system_${MCU_VARIANT}.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __STARTUP_CLEAR_BSS\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    ${SDK_DIR}/devices/${MCU_VARIANT}\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers\n    ${SDK_DIR}/drivers/common\n    ${SDK_DIR}/drivers/gpio\n    ${SDK_DIR}/drivers/lpsci\n    ${SDK_DIR}/drivers/port\n    ${SDK_DIR}/drivers/smc\n    ${SDK_DIR}/drivers/uart\n    )\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_KINETIS_KL)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/chipidea/ci_fs/dcd_ci_fs.c\n    ${TOP}/src/portable/nxp/khci/hcd_khci.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/family.mk",
    "content": "SDK_DIR = hw/mcu/nxp/mcux-sdk\n\nMCU_DIR = $(SDK_DIR)/devices/$(MCU)\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\n\nCFLAGS += \\\n  -D__STARTUP_CLEAR_BSS \\\n  -DCFG_TUSB_MCU=OPT_MCU_KINETIS_KL \\\n\nLDFLAGS += \\\n  -Wl,--defsym,__stack_size__=0x400 \\\n  -Wl,--defsym,__heap_size__=0\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  -specs=nosys.specs -specs=nano.specs \\\n\nSRC_C += \\\n\tsrc/portable/nxp/khci/dcd_khci.c \\\n\tsrc/portable/nxp/khci/hcd_khci.c \\\n\t$(MCU_DIR)/system_$(MCU).c \\\n\t$(MCU_DIR)/drivers/fsl_clock.c \\\n\t$(SDK_DIR)/drivers/gpio/fsl_gpio.c \\\n\t$(SDK_DIR)/drivers/lpsci/fsl_lpsci.c \\\n\t$(SDK_DIR)/drivers/uart/fsl_uart.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(MCU_DIR) \\\n\t$(TOP)/$(MCU_DIR)/drivers \\\n\t$(TOP)/$(SDK_DIR)/drivers/common \\\n\t$(TOP)/$(SDK_DIR)/drivers/gpio \\\n\t$(TOP)/$(SDK_DIR)/drivers/lpsci \\\n\t$(TOP)/$(SDK_DIR)/drivers/port \\\n\t$(TOP)/$(SDK_DIR)/drivers/smc \\\n\t$(TOP)/$(SDK_DIR)/drivers/uart \\\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/gcc/MKL25Z128xxx4_flash.ld",
    "content": "/*\n** ###################################################################\n**     Processors:          MKL25Z128VFM4\n**                          MKL25Z128VFT4\n**                          MKL25Z128VLH4\n**                          MKL25Z128VLK4\n**\n**     Compiler:            GNU C Compiler\n**     Reference manual:    KL25P80M48SF0RM, Rev.3, Sep 2012\n**     Version:             rev. 2.5, 2015-02-19\n**     Build:               b170214\n**\n**     Abstract:\n**         Linker file for the GNU C Compiler\n**\n**     Copyright 2016 Freescale Semiconductor, Inc.\n**     Copyright 2016-2017 NXP\n**     Redistribution and use in source and binary forms, with or without modification,\n**     are permitted provided that the following conditions are met:\n**\n**     o Redistributions of source code must retain the above copyright notice, this list\n**       of conditions and the following disclaimer.\n**\n**     o Redistributions in binary form must reproduce the above copyright notice, this\n**       list of conditions and the following disclaimer in the documentation and/or\n**       other materials provided with the distribution.\n**\n**     o Neither the name of the copyright holder nor the names of its\n**       contributors may be used to endorse or promote products derived from this\n**       software without specific prior written permission.\n**\n**     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n**     ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n**     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n**     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\n**     ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n**     (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n**     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n**     ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n**     (INCLUDING 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**     http:                 www.nxp.com\n**     mail:                 support@nxp.com\n**\n** ###################################################################\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\nHEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;\nM_VECTOR_RAM_SIZE = DEFINED(__ram_vector_table__) ? 0x0200 : 0x0;\n\n/* Specify the memory areas */\nMEMORY\n{\n  m_interrupts          (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00000200\n  m_flash_config        (RX)  : ORIGIN = 0x00000400, LENGTH = 0x00000010\n  m_text                (RX)  : ORIGIN = 0x00000410, LENGTH = 0x0001FBF0\n  m_data                (RW)  : ORIGIN = 0x1FFFF000, LENGTH = 0x00004000\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into internal flash */\n  .interrupts :\n  {\n    __VECTOR_TABLE = .;\n    . = ALIGN(4);\n    KEEP(*(.isr_vector))     /* Startup code */\n    . = ALIGN(4);\n  } > m_interrupts\n\n  .flash_config :\n  {\n    . = ALIGN(4);\n    KEEP(*(.FlashConfig))    /* Flash Configuration Field (FCF) */\n    . = ALIGN(4);\n  } > m_flash_config\n\n  /* The program code and other data goes into internal flash */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)                 /* .text sections (code) */\n    *(.text*)                /* .text* sections (code) */\n    *(.rodata)               /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)              /* .rodata* sections (constants, strings, etc.) */\n    *(.glue_7)               /* glue arm to thumb code */\n    *(.glue_7t)              /* glue thumb to arm code */\n    *(.eh_frame)\n    KEEP (*(.init))\n    KEEP (*(.fini))\n    . = ALIGN(4);\n  } > m_text\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } > m_text\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } > m_text\n\n .ctors :\n  {\n    __CTOR_LIST__ = .;\n    /* gcc uses crtbegin.o to find the start of\n       the constructors, so we make sure it is\n       first.  Because this is a wildcard, it\n       doesn't matter if the user does not\n       actually link against crtbegin.o; the\n       linker won't look for a file to match a\n       wildcard.  The wildcard also means that it\n       doesn't matter which directory crtbegin.o\n       is in.  */\n    KEEP (*crtbegin.o(.ctors))\n    KEEP (*crtbegin?.o(.ctors))\n    /* We don't want to include the .ctor section from\n       from the crtend.o file until after the sorted ctors.\n       The .ctor section from the crtend file contains the\n       end of ctors marker and it must be last */\n    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))\n    KEEP (*(SORT(.ctors.*)))\n    KEEP (*(.ctors))\n    __CTOR_END__ = .;\n  } > m_text\n\n  .dtors :\n  {\n    __DTOR_LIST__ = .;\n    KEEP (*crtbegin.o(.dtors))\n    KEEP (*crtbegin?.o(.dtors))\n    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))\n    KEEP (*(SORT(.dtors.*)))\n    KEEP (*(.dtors))\n    __DTOR_END__ = .;\n  } > m_text\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } > m_text\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } > m_text\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } > m_text\n\n  __etext = .;    /* define a global symbol at end of code */\n  __DATA_ROM = .; /* Symbol is used by startup for data initialization */\n\n  /* reserve MTB memory at the beginning of m_data */\n  .mtb : /* MTB buffer address as defined by the hardware */\n  {\n    . = ALIGN(8);\n    _mtb_start = .;\n    KEEP(*(.mtb_buf)) /* need to KEEP Micro Trace Buffer as not referenced by application */\n    . = ALIGN(8);\n    _mtb_end = .;\n  } > m_data\n\n  .interrupts_ram :\n  {\n    . = ALIGN(4);\n    __VECTOR_RAM__ = .;\n    __interrupts_ram_start__ = .; /* Create a global symbol at data start */\n    *(.m_interrupts_ram)     /* This is a user defined section */\n    . += M_VECTOR_RAM_SIZE;\n    . = ALIGN(4);\n    __interrupts_ram_end__ = .; /* Define a global symbol at data end */\n  } > m_data\n\n  __VECTOR_RAM = DEFINED(__ram_vector_table__) ? __VECTOR_RAM__ : ORIGIN(m_interrupts);\n  __RAM_VECTOR_TABLE_SIZE_BYTES = DEFINED(__ram_vector_table__) ? (__interrupts_ram_end__ - __interrupts_ram_start__) : 0x0;\n\n  .data : AT(__DATA_ROM)\n  {\n    . = ALIGN(4);\n    __DATA_RAM = .;\n    __data_start__ = .;      /* create a global symbol at data start */\n    *(.data)                 /* .data sections */\n    *(.data*)                /* .data* sections */\n    KEEP(*(.jcr*))\n    . = ALIGN(4);\n    __data_end__ = .;        /* define a global symbol at data end */\n  } > m_data\n\n  __DATA_END = __DATA_ROM + (__data_end__ - __data_start__);\n  text_end = ORIGIN(m_text) + LENGTH(m_text);\n  ASSERT(__DATA_END <= text_end, \"region m_text overflowed with text and data\")\n\n  /* Uninitialized data section */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    . = ALIGN(4);\n    __START_BSS = .;\n    __bss_start__ = .;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n    . = ALIGN(4);\n    __bss_end__ = .;\n    __END_BSS = .;\n  } > m_data\n\n  .heap :\n  {\n    . = ALIGN(8);\n    __end__ = .;\n    PROVIDE(end = .);\n    __HeapBase = .;\n    . += HEAP_SIZE;\n    __HeapLimit = .;\n    __heap_limit = .; /* Add for _sbrk */\n  } > m_data\n\n  .stack :\n  {\n    . = ALIGN(8);\n    . += STACK_SIZE;\n  } > m_data\n\n  /* Initializes stack on the end of block */\n  __StackTop   = ORIGIN(m_data) + LENGTH(m_data);\n  __StackLimit = __StackTop - STACK_SIZE;\n  PROVIDE(__stack = __StackTop);\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n\n  ASSERT(__StackLimit >= __HeapLimit, \"region m_data overflowed with stack and heap\")\n}\n"
  },
  {
    "path": "hw/bsp/kinetis_kl/gcc/startup_MKL25Z4.S",
    "content": "/* ---------------------------------------------------------------------------------------*/\n/*  @file:    startup_MKL25Z4.s                                                           */\n/*  @purpose: CMSIS Cortex-M0P Core Device Startup File                                   */\n/*            MKL25Z4                                                                     */\n/*  @version: 2.5                                                                         */\n/*  @date:    2015-2-19                                                                   */\n/*  @build:   b170112                                                                     */\n/* ---------------------------------------------------------------------------------------*/\n/*                                                                                        */\n/* Copyright (c) 1997 - 2016, Freescale Semiconductor, Inc.                               */\n/* Copyright 2016 - 2017 NXP                                                              */\n/* Redistribution and use in source and binary forms, with or without modification,       */\n/* are permitted provided that the following conditions are met:                          */\n/*                                                                                        */\n/* o Redistributions of source code must retain the above copyright notice, this list     */\n/*   of conditions and the following disclaimer.                                          */\n/*                                                                                        */\n/* o Redistributions in binary form must reproduce the above copyright notice, this       */\n/*   list of conditions and the following disclaimer in the documentation and/or          */\n/*   other materials provided with the distribution.                                      */\n/*                                                                                        */\n/* o Neither the name of the copyright holder nor the names of its                        */\n/*   contributors may be used to endorse or promote products derived from this            */\n/*   software without specific prior written permission.                                  */\n/*                                                                                        */\n/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND        */\n/* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED          */\n/* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE                 */\n/* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR       */\n/* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES         */\n/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;           */\n/* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON         */\n/* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT                */\n/* (INCLUDING 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/* Version: GCC for ARM Embedded Processors                                  */\n/*****************************************************************************/\n    .syntax unified\n    .arch armv6-m\n\n    .section .isr_vector, \"a\"\n    .align 2\n    .globl __isr_vector\n__isr_vector:\n    .long   __StackTop                                      /* Top of Stack */\n    .long   Reset_Handler                                   /* Reset Handler */\n    .long   NMI_Handler                                     /* NMI Handler*/\n    .long   HardFault_Handler                               /* Hard Fault Handler*/\n    .long   0                                               /* Reserved*/\n    .long   0                                               /* Reserved*/\n    .long   0                                               /* Reserved*/\n    .long   0                                               /* Reserved*/\n    .long   0                                               /* Reserved*/\n    .long   0                                               /* Reserved*/\n    .long   0                                               /* Reserved*/\n    .long   SVC_Handler                                     /* SVCall Handler*/\n    .long   0                                               /* Reserved*/\n    .long   0                                               /* Reserved*/\n    .long   PendSV_Handler                                  /* PendSV Handler*/\n    .long   SysTick_Handler                                 /* SysTick Handler*/\n\n                                                            /* External Interrupts*/\n    .long   DMA0_IRQHandler                                 /* DMA channel 0 transfer complete*/\n    .long   DMA1_IRQHandler                                 /* DMA channel 1 transfer complete*/\n    .long   DMA2_IRQHandler                                 /* DMA channel 2 transfer complete*/\n    .long   DMA3_IRQHandler                                 /* DMA channel 3 transfer complete*/\n    .long   Reserved20_IRQHandler                           /* Reserved interrupt*/\n    .long   FTFA_IRQHandler                                 /* Command complete and read collision*/\n    .long   LVD_LVW_IRQHandler                              /* Low-voltage detect, low-voltage warning*/\n    .long   LLWU_IRQHandler                                 /* Low leakage wakeup Unit*/\n    .long   I2C0_IRQHandler                                 /* I2C0 interrupt*/\n    .long   I2C1_IRQHandler                                 /* I2C1 interrupt*/\n    .long   SPI0_IRQHandler                                 /* SPI0 single interrupt vector for all sources*/\n    .long   SPI1_IRQHandler                                 /* SPI1 single interrupt vector for all sources*/\n    .long   UART0_IRQHandler                                /* UART0 status and error*/\n    .long   UART1_IRQHandler                                /* UART1 status and error*/\n    .long   UART2_IRQHandler                                /* UART2 status and error*/\n    .long   ADC0_IRQHandler                                 /* ADC0 interrupt*/\n    .long   CMP0_IRQHandler                                 /* CMP0 interrupt*/\n    .long   TPM0_IRQHandler                                 /* TPM0 single interrupt vector for all sources*/\n    .long   TPM1_IRQHandler                                 /* TPM1 single interrupt vector for all sources*/\n    .long   TPM2_IRQHandler                                 /* TPM2 single interrupt vector for all sources*/\n    .long   RTC_IRQHandler                                  /* RTC alarm*/\n    .long   RTC_Seconds_IRQHandler                          /* RTC seconds*/\n    .long   PIT_IRQHandler                                  /* PIT interrupt*/\n    .long   Reserved39_IRQHandler                           /* Reserved interrupt*/\n    .long   USB0_IRQHandler                                 /* USB0 interrupt*/\n    .long   DAC0_IRQHandler                                 /* DAC0 interrupt*/\n    .long   TSI0_IRQHandler                                 /* TSI0 interrupt*/\n    .long   MCG_IRQHandler                                  /* MCG interrupt*/\n    .long   LPTMR0_IRQHandler                               /* LPTMR0 interrupt*/\n    .long   Reserved45_IRQHandler                           /* Reserved interrupt*/\n    .long   PORTA_IRQHandler                                /* PORTA Pin detect*/\n    .long   PORTD_IRQHandler                                /* PORTD Pin detect*/\n\n    .size    __isr_vector, . - __isr_vector\n\n/* Flash Configuration */\n    .section .FlashConfig, \"a\"\n    .long 0xFFFFFFFF\n    .long 0xFFFFFFFF\n    .long 0xFFFFFFFF\n    .long 0xFFFFFFFE\n\n    .text\n    .thumb\n\n/* Reset Handler */\n\n    .thumb_func\n    .align 2\n    .globl   Reset_Handler\n    .weak    Reset_Handler\n    .type    Reset_Handler, %function\nReset_Handler:\n    cpsid   i               /* Mask interrupts */\n    .equ    VTOR, 0xE000ED08\n    ldr     r0, =VTOR\n    ldr     r1, =__isr_vector\n    str     r1, [r0]\n    ldr     r2, [r1]\n    msr     msp, r2\n#ifndef __NO_SYSTEM_INIT\n    ldr   r0,=SystemInit\n    blx   r0\n#endif\n/*     Loop to copy data from read only memory to RAM. The ranges\n *      of copy from/to are specified by following symbols evaluated in\n *      linker script.\n *      __etext: End of code section, i.e., begin of data sections to copy from.\n *      __data_start__/__data_end__: RAM address range that data should be\n *      copied to. Both must be aligned to 4 bytes boundary.  */\n\n    ldr    r1, =__etext\n    ldr    r2, =__data_start__\n    ldr    r3, =__data_end__\n\n    subs    r3, r2\n    ble     .LC0\n\n.LC1:\n    subs    r3, 4\n    ldr    r0, [r1,r3]\n    str    r0, [r2,r3]\n    bgt    .LC1\n.LC0:\n\n#ifdef __STARTUP_CLEAR_BSS\n/*     This part of work usually is done in C library startup code. Otherwise,\n *     define this macro to enable it in this startup.\n *\n *     Loop to zero out BSS section, which uses following symbols\n *     in linker script:\n *      __bss_start__: start of BSS section. Must align to 4\n *      __bss_end__: end of BSS section. Must align to 4\n */\n    ldr r1, =__bss_start__\n    ldr r2, =__bss_end__\n\n    subs    r2, r1\n    ble .LC3\n\n    movs    r0, 0\n.LC2:\n    str r0, [r1, r2]\n    subs    r2, 4\n    bge .LC2\n.LC3:\n#endif\n    cpsie   i               /* Unmask interrupts */\n#ifndef __START\n#define __START _start\n#endif\n#ifndef __ATOLLIC__\n    ldr   r0,=__START\n    blx   r0\n#else\n    ldr   r0,=__libc_init_array\n    blx   r0\n    ldr   r0,=main\n    bx    r0\n#endif\n    .pool\n    .size Reset_Handler, . - Reset_Handler\n\n    .align  1\n    .thumb_func\n    .weak DefaultISR\n    .type DefaultISR, %function\nDefaultISR:\n    ldr r0, =DefaultISR\n    bx r0\n    .size DefaultISR, . - DefaultISR\n\n    .align 1\n    .thumb_func\n    .weak NMI_Handler\n    .type NMI_Handler, %function\nNMI_Handler:\n    ldr   r0,=NMI_Handler\n    bx    r0\n    .size NMI_Handler, . - NMI_Handler\n\n    .align 1\n    .thumb_func\n    .weak HardFault_Handler\n    .type HardFault_Handler, %function\nHardFault_Handler:\n    ldr   r0,=HardFault_Handler\n    bx    r0\n    .size HardFault_Handler, . - HardFault_Handler\n\n    .align 1\n    .thumb_func\n    .weak SVC_Handler\n    .type SVC_Handler, %function\nSVC_Handler:\n    ldr   r0,=SVC_Handler\n    bx    r0\n    .size SVC_Handler, . - SVC_Handler\n\n    .align 1\n    .thumb_func\n    .weak PendSV_Handler\n    .type PendSV_Handler, %function\nPendSV_Handler:\n    ldr   r0,=PendSV_Handler\n    bx    r0\n    .size PendSV_Handler, . - PendSV_Handler\n\n    .align 1\n    .thumb_func\n    .weak SysTick_Handler\n    .type SysTick_Handler, %function\nSysTick_Handler:\n    ldr   r0,=SysTick_Handler\n    bx    r0\n    .size SysTick_Handler, . - SysTick_Handler\n\n    .align 1\n    .thumb_func\n    .weak DMA0_IRQHandler\n    .type DMA0_IRQHandler, %function\nDMA0_IRQHandler:\n    ldr   r0,=DMA0_DriverIRQHandler\n    bx    r0\n    .size DMA0_IRQHandler, . - DMA0_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak DMA1_IRQHandler\n    .type DMA1_IRQHandler, %function\nDMA1_IRQHandler:\n    ldr   r0,=DMA1_DriverIRQHandler\n    bx    r0\n    .size DMA1_IRQHandler, . - DMA1_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak DMA2_IRQHandler\n    .type DMA2_IRQHandler, %function\nDMA2_IRQHandler:\n    ldr   r0,=DMA2_DriverIRQHandler\n    bx    r0\n    .size DMA2_IRQHandler, . - DMA2_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak DMA3_IRQHandler\n    .type DMA3_IRQHandler, %function\nDMA3_IRQHandler:\n    ldr   r0,=DMA3_DriverIRQHandler\n    bx    r0\n    .size DMA3_IRQHandler, . - DMA3_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak I2C0_IRQHandler\n    .type I2C0_IRQHandler, %function\nI2C0_IRQHandler:\n    ldr   r0,=I2C0_DriverIRQHandler\n    bx    r0\n    .size I2C0_IRQHandler, . - I2C0_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak I2C1_IRQHandler\n    .type I2C1_IRQHandler, %function\nI2C1_IRQHandler:\n    ldr   r0,=I2C1_DriverIRQHandler\n    bx    r0\n    .size I2C1_IRQHandler, . - I2C1_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak SPI0_IRQHandler\n    .type SPI0_IRQHandler, %function\nSPI0_IRQHandler:\n    ldr   r0,=SPI0_DriverIRQHandler\n    bx    r0\n    .size SPI0_IRQHandler, . - SPI0_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak SPI1_IRQHandler\n    .type SPI1_IRQHandler, %function\nSPI1_IRQHandler:\n    ldr   r0,=SPI1_DriverIRQHandler\n    bx    r0\n    .size SPI1_IRQHandler, . - SPI1_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak UART0_IRQHandler\n    .type UART0_IRQHandler, %function\nUART0_IRQHandler:\n    ldr   r0,=UART0_DriverIRQHandler\n    bx    r0\n    .size UART0_IRQHandler, . - UART0_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak UART1_IRQHandler\n    .type UART1_IRQHandler, %function\nUART1_IRQHandler:\n    ldr   r0,=UART1_DriverIRQHandler\n    bx    r0\n    .size UART1_IRQHandler, . - UART1_IRQHandler\n\n    .align 1\n    .thumb_func\n    .weak UART2_IRQHandler\n    .type UART2_IRQHandler, %function\nUART2_IRQHandler:\n    ldr   r0,=UART2_DriverIRQHandler\n    bx    r0\n    .size UART2_IRQHandler, . - UART2_IRQHandler\n\n\n/*    Macro to define default handlers. Default handler\n *    will be weak symbol and just dead loops. They can be\n *    overwritten by other handlers */\n    .macro def_irq_handler  handler_name\n    .weak \\handler_name\n    .set  \\handler_name, DefaultISR\n    .endm\n\n/* Exception Handlers */\n    def_irq_handler    DMA0_DriverIRQHandler\n    def_irq_handler    DMA1_DriverIRQHandler\n    def_irq_handler    DMA2_DriverIRQHandler\n    def_irq_handler    DMA3_DriverIRQHandler\n    def_irq_handler    Reserved20_IRQHandler\n    def_irq_handler    FTFA_IRQHandler\n    def_irq_handler    LVD_LVW_IRQHandler\n    def_irq_handler    LLWU_IRQHandler\n    def_irq_handler    I2C0_DriverIRQHandler\n    def_irq_handler    I2C1_DriverIRQHandler\n    def_irq_handler    SPI0_DriverIRQHandler\n    def_irq_handler    SPI1_DriverIRQHandler\n    def_irq_handler    UART0_DriverIRQHandler\n    def_irq_handler    UART1_DriverIRQHandler\n    def_irq_handler    UART2_DriverIRQHandler\n    def_irq_handler    ADC0_IRQHandler\n    def_irq_handler    CMP0_IRQHandler\n    def_irq_handler    TPM0_IRQHandler\n    def_irq_handler    TPM1_IRQHandler\n    def_irq_handler    TPM2_IRQHandler\n    def_irq_handler    RTC_IRQHandler\n    def_irq_handler    RTC_Seconds_IRQHandler\n    def_irq_handler    PIT_IRQHandler\n    def_irq_handler    Reserved39_IRQHandler\n    def_irq_handler    USB0_IRQHandler\n    def_irq_handler    DAC0_IRQHandler\n    def_irq_handler    TSI0_IRQHandler\n    def_irq_handler    MCG_IRQHandler\n    def_irq_handler    LPTMR0_IRQHandler\n    def_irq_handler    Reserved45_IRQHandler\n    def_irq_handler    PORTA_IRQHandler\n    def_irq_handler    PORTD_IRQHandler\n\n    .end\n"
  },
  {
    "path": "hw/bsp/lpc11/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #ifdef __GNUC__\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wunused-parameter\"\n  #endif\n\n  #include \"chip.h\"\n\n  #ifdef __GNUC__\n    #pragma GCC diagnostic pop\n  #endif\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               2\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* Define to trap errors during development. */\n// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7\n#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__)\n  #define configASSERT(_exp) \\\n    do {\\\n      if ( !(_exp) ) { \\\n        volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \\\n        if ( (*ARM_CM_DHCSR) & 1UL ) {  /* Only halt mcu if debugger is attached */ \\\n          taskDISABLE_INTERRUPTS(); \\\n           __asm(\"BKPT #0\\n\"); \\\n        }\\\n      }\\\n    } while(0)\n#else\n  #define configASSERT( x )\n#endif\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/lpc11/boards/lpcxpresso11u37/board.cmake",
    "content": "set(LPC_FAMILY 11xx)\nset(JLINK_DEVICE LPC11U37/401)\nset(PYOCD_TARGET lpc11u37)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc11u37.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CFG_EXAMPLE_MSC_READONLY\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\n  target_sources(${TARGET} PRIVATE\n    ${SDK_DIR}/src/gpio_${LPC_FAMILY}_1.c\n    ${SDK_DIR}/src/sysctl_${LPC_FAMILY}.c\n    )\n  target_compile_options(${TARGET} PRIVATE\n    -Wno-error=unused-parameter\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc11/boards/lpcxpresso11u37/board.h",
    "content": "/* metadata:\n   name: LPCXpresso11U37\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/OM13074\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n#define LED_PORT              1\n#define LED_PIN               24\n#define LED_STATE_ON          0\n\n// Wake up Switch\n#define BUTTON_PORT           0\n#define BUTTON_PIN            16\n#define BUTTON_STATE_ACTIVE   0\n\n/* System oscillator rate and RTC oscillator rate */\nconst uint32_t OscRateIn = 12000000;\nconst uint32_t ExtRateIn = 0;\n\n/* Pin muxing table, only items that need changing from their default pin\n   state are in this table. Not every pin is mapped. */\n/* IOCON pin definitions for pin muxing */\ntypedef struct {\n  uint32_t port : 8;\t\t\t/* Pin port */\n  uint32_t pin : 8;\t\t\t/* Pin number */\n  uint32_t modefunc : 16;\t\t/* Function and mode */\n} PINMUX_GRP_T;\n\nstatic const PINMUX_GRP_T pinmuxing[] = {\n    {0,  3, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // USB VBUS\n    {0,  6, (IOCON_FUNC1 | IOCON_MODE_INACT)},\t\t/* PIO0_6 used for USB_CONNECT */\n\n    {0, 18, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // UART0 RX\n    {0, 19, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // UART0 TX\n};\n\n/* Setup system clocking */\nstatic inline void Chip_SetupXtalClocking(void) {\n  volatile int i;\n\n  /* Powerup main oscillator */\n  Chip_SYSCTL_PowerUp(SYSCTL_POWERDOWN_SYSOSC_PD);\n\n  /* Wait 200us for OSC to be stablized, no status\n     indication, dummy wait. */\n  for (i = 0; i < 0x100; i++) {}\n\n  /* Set system PLL input to main oscillator */\n  Chip_Clock_SetSystemPLLSource(SYSCTL_PLLCLKSRC_MAINOSC);\n\n  /* Power down PLL to change the PLL divider ratio */\n  Chip_SYSCTL_PowerDown(SYSCTL_POWERDOWN_SYSPLL_PD);\n\n  /* Setup PLL for main oscillator rate (FCLKIN = 12MHz) * 4 = 48MHz\n     MSEL = 3 (this is pre-decremented), PSEL = 1 (for P = 2)\n     FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 4 = 48MHz\n     FCCO = FCLKOUT * 2 * P = 48MHz * 2 * 2 = 192MHz (within FCCO range) */\n  Chip_Clock_SetupSystemPLL(3, 1);\n\n  /* Powerup system PLL */\n  Chip_SYSCTL_PowerUp(SYSCTL_POWERDOWN_SYSPLL_PD);\n\n  /* Wait for PLL to lock */\n  while (!Chip_Clock_IsSystemPLLLocked()) {}\n\n  /* Set system clock divider to 1 */\n  Chip_Clock_SetSysClockDiv(1);\n\n  /* Setup FLASH access to 3 clocks */\n  Chip_FMC_SetFLASHAccess(FLASHTIM_50MHZ_CPU);\n\n  /* Set main clock source to the system PLL. This will drive 48MHz\n     for the main clock and 48MHz for the system clock */\n  Chip_Clock_SetMainClockSource(SYSCTL_MAINCLKSRC_PLLOUT);\n\n  /* Set USB PLL input to main oscillator */\n  Chip_Clock_SetUSBPLLSource(SYSCTL_PLLCLKSRC_MAINOSC);\n  /* Setup USB PLL  (FCLKIN = 12MHz) * 4 = 48MHz\n     MSEL = 3 (this is pre-decremented), PSEL = 1 (for P = 2)\n     FCLKOUT = FCLKIN * (MSEL + 1) = 12MHz * 4 = 48MHz\n     FCCO = FCLKOUT * 2 * P = 48MHz * 2 * 2 = 192MHz (within FCCO range) */\n  Chip_Clock_SetupUSBPLL(3, 1);\n\n  /* Powerup USB PLL */\n  Chip_SYSCTL_PowerUp(SYSCTL_POWERDOWN_USBPLL_PD);\n\n  /* Wait for PLL to lock */\n  while (!Chip_Clock_IsUSBPLLLocked()) {}\n}\n\nstatic inline void Chip_USB_Init(void) {\n  /* enable USB main clock */\n  Chip_Clock_SetUSBClockSource(SYSCTL_USBCLKSRC_PLLOUT, 1);\n  /* Enable AHB clock to the USB block and USB RAM. */\n  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_USB);\n  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_USBRAM);\n  /* power UP USB Phy */\n  Chip_SYSCTL_PowerUp(SYSCTL_POWERDOWN_USBPAD_PD);\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc11/boards/lpcxpresso11u37/board.mk",
    "content": "MCU = 11uxx\nMCU_DRV = 11xx\n\nCFLAGS += \\\n  -DCORE_M0 \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -DCFG_TUSB_MEM_SECTION='__attribute__((section(\".data.$$RAM2\")))'\n\n# mcu driver cause following warnings\nCFLAGS += \\\n\t-Wno-error=strict-prototypes \\\n\t-Wno-error=unused-parameter \\\n\t-Wno-error=redundant-decls\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/lpc11u37.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC11U37/401\nPYOCD_TARGET = lpc11u37\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc11/boards/lpcxpresso11u37/lpc11u37.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * Copyright (c) 2008-2013 Code Red Technologies Ltd,\n * Copyright 2015, 2018-2019 NXP\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC11U37/401\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v11.0.0 [Build 2516] [2019-06-05] on Sep 6, 2019 12:16:06 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlash128 (rx) : ORIGIN = 0x0, LENGTH = 0x20000 /* 128K bytes (alias Flash) */\n  RamLoc8 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x2000 /* 8K bytes (alias RAM) */\n  RamUsb2 (rwx) : ORIGIN = 0x20004000, LENGTH = 0x800 /* 2K bytes (alias RAM2) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlash128 = 0x0  ; /* MFlash128 */\n  __base_Flash = 0x0 ; /* Flash */\n  __top_MFlash128 = 0x0 + 0x20000 ; /* 128K bytes */\n  __top_Flash = 0x0 + 0x20000 ; /* 128K bytes */\n  __base_RamLoc8 = 0x10000000  ; /* RamLoc8 */\n  __base_RAM = 0x10000000 ; /* RAM */\n  __top_RamLoc8 = 0x10000000 + 0x2000 ; /* 8K bytes */\n  __top_RAM = 0x10000000 + 0x2000 ; /* 8K bytes */\n  __base_RamUsb2 = 0x20004000  ; /* RamUsb2 */\n  __base_RAM2 = 0x20004000 ; /* RAM2 */\n  __top_RamUsb2 = 0x20004000 + 0x800 ; /* 2K bytes */\n  __top_RAM2 = 0x20004000 + 0x800 ; /* 2K bytes */\n\n\nENTRY(ResetISR)\n\nSECTIONS\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlash128\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlash128\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    } > MFlash128\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlash128\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* DATA section for RamUsb2 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamUsb2)\n        *(.data.$RAM2)\n        *(.data.$RamUsb2)\n        *(.data.$RAM2.*)\n        *(.data.$RamUsb2.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > RamUsb2 AT>MFlash128\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED (NOLOAD) :\n    {\n        . = ALIGN(4) ;\n        KEEP(*(.bss.$RESERVED*))\n       . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > RamLoc8\n\n    /* Main DATA section (RamLoc8) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > RamLoc8 AT>MFlash128\n\n    /* BSS section for RamUsb2 */\n    .bss_RAM2 :\n    {\n       . = ALIGN(4) ;\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2)\n       *(.bss.$RamUsb2)\n       *(.bss.$RAM2.*)\n       *(.bss.$RamUsb2.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > RamUsb2\n\n    /* MAIN BSS SECTION */\n    .bss :\n    {\n        . = ALIGN(4) ;\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        PROVIDE(end = .);\n    } > RamLoc8\n\n    /* NOINIT section for RamUsb2 */\n    .noinit_RAM2 (NOLOAD) :\n    {\n       . = ALIGN(4) ;\n       *(.noinit.$RAM2)\n       *(.noinit.$RamUsb2)\n       *(.noinit.$RAM2.*)\n       *(.noinit.$RamUsb2.*)\n       . = ALIGN(4) ;\n    } > RamUsb2\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD):\n    {\n         . = ALIGN(4) ;\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > RamLoc8\n    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc8 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    PROVIDE(__valid_user_code_checksum = 0 -\n                                         (_vStackTop\n                                         + (ResetISR + 1)\n                                         + (( DEFINED(NMI_Handler) ? NMI_Handler : M0_NMI_Handler ) + 1)\n                                         + (( DEFINED(HardFault_Handler) ? HardFault_Handler : M0_HardFault_Handler ) + 1)\n                                         )\n           );\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}\n"
  },
  {
    "path": "hw/bsp/lpc11/boards/lpcxpresso11u68/board.cmake",
    "content": "set(LPC_FAMILY 11u6x)\nset(JLINK_DEVICE LPC11U68)\nset(PYOCD_TARGET LPC11U68)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc11u68.ld)\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PRIVATE\n    ${SDK_DIR}/src/gpio_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/syscon_${LPC_FAMILY}.c\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc11/boards/lpcxpresso11u68/board.h",
    "content": "/* metadata:\n  name: LPCXpresso11U68\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/OM13058\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n#define LED_PORT              2\n#define LED_PIN               17\n#define LED_STATE_ON          0\n\n// Wake up Switch\n#define BUTTON_PORT           0\n#define BUTTON_PIN            16\n#define BUTTON_STATE_ACTIVE   0\n\n/* System oscillator rate and RTC oscillator rate */\nconst uint32_t OscRateIn = 12000000;\nconst uint32_t RTCOscRateIn = 32768;\n\n/* Pin muxing table, only items that need changing from their default pin\n   state are in this table. Not every pin is mapped. */\nstatic const PINMUX_GRP_T pinmuxing[] = {\n    {0, 3,  (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // USB VBUS\n    {0, 18, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // UART0 RX\n    {0, 19, (IOCON_FUNC1 | IOCON_MODE_INACT | IOCON_DIGMODE_EN)}, // UART0 TX\n    {2, 0,  (IOCON_FUNC1 | IOCON_MODE_INACT)}, // XTALIN\n    {2, 1,  (IOCON_FUNC1 | IOCON_MODE_INACT)}, // XTALOUT\n};\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc11/boards/lpcxpresso11u68/board.mk",
    "content": "MCU = 11u6x\nMCU_DRV = 11u6x\n\nCFLAGS += \\\n  -DCORE_M0PLUS \\\n  -D__VTOR_PRESENT=0 \\\n  -DCFG_TUSB_MEM_SECTION='__attribute__((section(\".data.$$RAM3\")))' \\\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/lpc11u68.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC11U68\nPYOCD_TARGET = lpc11u68\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc11/boards/lpcxpresso11u68/lpc11u68.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * (c) Code Red Technologies Ltd, 2008-2013\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC11U68\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v10.2.1 [Build 795] [2018-07-25] on May 14, 2019 4:55:54 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlash256 (rx) : ORIGIN = 0x0, LENGTH = 0x40000 /* 256K bytes (alias Flash) */\n  Ram0_32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */\n  Ram1_2 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x800 /* 2K bytes (alias RAM2) */\n  Ram2USB_2 (rwx) : ORIGIN = 0x20004000, LENGTH = 0x800 /* 2K bytes (alias RAM3) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlash256 = 0x0  ; /* MFlash256 */\n  __base_Flash = 0x0 ; /* Flash */\n  __top_MFlash256 = 0x0 + 0x40000 ; /* 256K bytes */\n  __top_Flash = 0x0 + 0x40000 ; /* 256K bytes */\n  __base_Ram0_32 = 0x10000000  ; /* Ram0_32 */\n  __base_RAM = 0x10000000 ; /* RAM */\n  __top_Ram0_32 = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __base_Ram1_2 = 0x20000000  ; /* Ram1_2 */\n  __base_RAM2 = 0x20000000 ; /* RAM2 */\n  __top_Ram1_2 = 0x20000000 + 0x800 ; /* 2K bytes */\n  __top_RAM2 = 0x20000000 + 0x800 ; /* 2K bytes */\n  __base_Ram2USB_2 = 0x20004000  ; /* Ram2USB_2 */\n  __base_RAM3 = 0x20004000 ; /* RAM3 */\n  __top_Ram2USB_2 = 0x20004000 + 0x800 ; /* 2K bytes */\n  __top_RAM3 = 0x20004000 + 0x800 ; /* 2K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlash256\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlash256\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    } > MFlash256\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlash256\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* possible MTB section for Ram1_2 */\n    .mtb_buffer_RAM2 (NOLOAD) :\n    {\n        KEEP(*(.mtb.$RAM2*))\n        KEEP(*(.mtb.$Ram1_2*))\n    } > Ram1_2\n\n    /* DATA section for Ram1_2 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$Ram1_2)\n        *(.data.$RAM2*)\n        *(.data.$Ram1_2*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > Ram1_2 AT>MFlash256\n    /* possible MTB section for Ram2USB_2 */\n    .mtb_buffer_RAM3 (NOLOAD) :\n    {\n        KEEP(*(.mtb.$RAM3*))\n        KEEP(*(.mtb.$Ram2USB_2*))\n    } > Ram2USB_2\n\n    /* DATA section for Ram2USB_2 */\n\n    .data_RAM3 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM3 = .) ;\n        *(.ramfunc.$RAM3)\n        *(.ramfunc.$Ram2USB_2)\n        *(.data.$RAM3*)\n        *(.data.$Ram2USB_2*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM3 = .) ;\n     } > Ram2USB_2 AT>MFlash256\n    /* MAIN DATA SECTION */\n        /* Default MTB section */\n        .mtb_buffer_default (NOLOAD) :\n        {\n           KEEP(*(.mtb*))\n        } > Ram0_32\n    .uninit_RESERVED : ALIGN(4)\n    {\n        KEEP(*(.bss.$RESERVED*))\n        . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > Ram0_32\n\n    /* Main DATA section (Ram0_32) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > Ram0_32 AT>MFlash256\n\n    /* BSS section for Ram1_2 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2*)\n       *(.bss.$Ram1_2*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > Ram1_2\n\n    /* BSS section for Ram2USB_2 */\n    .bss_RAM3 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM3 = .) ;\n       *(.bss.$RAM3*)\n       *(.bss.$Ram2USB_2*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM3 = .) ;\n    } > Ram2USB_2\n\n    /* MAIN BSS SECTION */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        PROVIDE(end = .);\n    } > Ram0_32\n\n    /* NOINIT section for Ram1_2 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM2*)\n       *(.noinit.$Ram1_2*)\n       . = ALIGN(4) ;\n    } > Ram1_2\n\n    /* NOINIT section for Ram2USB_2 */\n    .noinit_RAM3 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM3*)\n       *(.noinit.$Ram2USB_2*)\n       . = ALIGN(4) ;\n    } > Ram2USB_2\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > Ram0_32\n    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_Ram0_32 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    PROVIDE(__valid_user_code_checksum = 0 -\n                                         (_vStackTop\n                                         + (ResetISR + 1)\n                                         + (( DEFINED(NMI_Handler) ? NMI_Handler : M0_NMI_Handler ) + 1)\n                                         + (( DEFINED(HardFault_Handler) ? HardFault_Handler : M0_HardFault_Handler ) + 1)\n                                         )\n           );\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}\n"
  },
  {
    "path": "hw/bsp/lpc11/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#ifdef __GNUC__\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n\n#include \"chip.h\"\n\n#ifdef __GNUC__\n  #pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\nextern void USB_IRQHandler(void);\nextern void SysTick_Handler(void);\nvoid SystemInit(void);\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n// Invoked by startup code\nvoid SystemInit(void) {\n  /* Enable IOCON clock */\n  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON);\n  for (uint32_t i = 0; i < (sizeof(pinmuxing) / sizeof(PINMUX_GRP_T)); i++) {\n    Chip_IOCON_PinMuxSet(LPC_IOCON, pinmuxing[i].port, pinmuxing[i].pin, pinmuxing[i].modefunc);\n  }\n  Chip_SetupXtalClocking();\n}\n\nvoid board_init(void) {\n  SystemCoreClockUpdate();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  Chip_GPIO_Init(LPC_GPIO);\n\n  // LED\n  Chip_GPIO_SetPinDIROutput(LPC_GPIO, LED_PORT, LED_PIN);\n\n  // Button\n  Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);\n\n  // USB: Setup PLL clock, and power\n  Chip_USB_Init();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  if ( max_len < 16 ) return 0;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  id32[0] = Chip_IAP_ReadUID();\n  return 4;\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc11/family.cmake",
    "content": "include_guard()\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\nif (LPC_FAMILY STREQUAL 11xx)\n  set(SDK_DIR ${TOP}/hw/mcu/nxp/lpcopen/lpc11uxx/lpc_chip_11uxx)\nelse()\n  set(SDK_DIR ${TOP}/hw/mcu/nxp/lpcopen/lpc${LPC_FAMILY}/lpc_chip_${LPC_FAMILY})\nendif()\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC11UXX CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\n# only need to be built ONCE for all examples\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/../gcc/cr_startup_lpc${LPC_FAMILY}.c\n    ${SDK_DIR}/src/chip_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/clock_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/iap.c\n    ${SDK_DIR}/src/iocon_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/sysinit_${LPC_FAMILY}.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __USE_LPCOPEN\n    __VTOR_PRESENT=0\n    CORE_M0\n    CORE_M0PLUS\n    CFG_TUSB_MEM_ALIGN=TU_ATTR_ALIGNED\\(64\\)\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/inc\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\n\n  set_target_properties(${BOARD_TARGET} PROPERTIES COMPILE_FLAGS \"-Wno-incompatible-pointer-types\")\nendfunction()\n\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC11UXX)\n\n  #---------- Port Specific ----------\n  # These files are built for each example since it depends on example's tusb_config.h\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    # family, hw, board\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${TARGET} PUBLIC\n      -nostdlib\n      -Wno-error=incompatible-pointer-types\n      )\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc11/family.mk",
    "content": "MCU_DIR = hw/mcu/nxp/lpcopen/lpc$(MCU)/lpc_chip_$(MCU)\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\n\nCFLAGS += \\\n  -flto \\\n  -nostdlib \\\n  -D__USE_LPCOPEN \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC11UXX \\\n  -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))'\n\n# mcu driver cause following warnings\nCFLAGS += \\\n  -Wno-error=incompatible-pointer-types \\\n\nLDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c \\\n\t$(MCU_DIR)/../gcc/cr_startup_lpc$(MCU_DRV).c \\\n\t$(MCU_DIR)/src/chip_$(MCU_DRV).c \\\n\t$(MCU_DIR)/src/clock_$(MCU_DRV).c \\\n\t$(MCU_DIR)/src/iap.c \\\n\t$(MCU_DIR)/src/iocon_$(MCU_DRV).c \\\n\t$(MCU_DIR)/src/sysinit_$(MCU_DRV).c\n\nifeq ($(MCU),11u6x)\nSRC_C += \\\n\t$(MCU_DIR)/src/gpio_$(MCU_DRV).c \\\n\t$(MCU_DIR)/src/syscon_$(MCU_DRV).c \\\n\nelse\n\nSRC_C += \\\n\t$(MCU_DIR)/src/gpio_$(MCU_DRV)_1.c \\\n\t$(MCU_DIR)/src/sysctl_$(MCU_DRV).c\nendif\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(MCU_DIR)/inc \\\n\n# For flash-jlink target\nJLINK_DEVICE = LPC11U68\n"
  },
  {
    "path": "hw/bsp/lpc13/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #ifdef __GNUC__\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wunused-parameter\"\n  #endif\n\n  #include \"chip.h\"\n\n  #ifdef __GNUC__\n    #pragma GCC diagnostic pop\n  #endif\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               2\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* Define to trap errors during development. */\n// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7\n#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__)\n  #define configASSERT(_exp) \\\n    do {\\\n      if ( !(_exp) ) { \\\n        volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \\\n        if ( (*ARM_CM_DHCSR) & 1UL ) {  /* Only halt mcu if debugger is attached */ \\\n          taskDISABLE_INTERRUPTS(); \\\n           __asm(\"BKPT #0\\n\"); \\\n        }\\\n      }\\\n    } while(0)\n#else\n  #define configASSERT( x )\n#endif\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/lpc13/boards/lpcxpresso1347/board.cmake",
    "content": "set(JLINK_DEVICE LPC1347)\nset(PYOCD_TARGET LPC1347)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc1347.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CFG_EXAMPLE_MSC_READONLY\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc13/boards/lpcxpresso1347/board.h",
    "content": "/* metadata:\n   name: LPCXpresso1347\n   url: https://www.nxp.com/products/no-longer-manufactured/lpcxpresso-board-for-lpc1347:OM13045\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#define LED_PORT      0\n#define LED_PIN       7\n\n// Joytick Down if connected to LPCXpresso Base board\n#define BUTTON_PORT   1\n#define BUTTON_PIN    20\n\n//static const struct {\n//  uint8_t port;\n//  uint8_t pin;\n//} buttons[] =\n//{\n//    {1, 22 }, // Joystick up\n//    {1, 20 }, // Joystick down\n//    {1, 23 }, // Joystick left\n//    {1, 21 }, // Joystick right\n//    {1, 19 }, // Joystick press\n//    {0, 1  }, // SW3\n//};\n\n/* System oscillator rate and RTC oscillator rate */\nconst uint32_t OscRateIn = 12000000;\nconst uint32_t ExtRateIn = 0;\n\n/* Pin muxing table, only items that need changing from their default pin\n   state are in this table. */\nstatic const PINMUX_GRP_T pinmuxing[] = {\n    {0, 1,  (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)},  /* PIO0_1 used for CLKOUT */\n    {0, 2,  (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_PULLUP)},  /* PIO0_2 used for SSEL */\n    {0, 3,  (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)},  /* PIO0_3 used for USB_VBUS */\n    {0, 6,  (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)},  /* PIO0_6 used for USB_CONNECT */\n    {0, 8,  (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)},  /* PIO0_8 used for MISO0 */\n    {0, 9,  (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)},  /* PIO0_9 used for MOSI0 */\n    {0, 11, (IOCON_FUNC2 | IOCON_ADMODE_EN | IOCON_FILT_DIS)},  /* PIO0_11 used for AD0 */\n    {0, 18, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)},  /* PIO0_18 used for RXD */\n    {0, 19, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)},  /* PIO0_19 used for TXD */\n    {1, 29, (IOCON_FUNC1 | IOCON_RESERVED_BIT_7 | IOCON_MODE_INACT)},  /* PIO1_29 used for SCK0 */\n};\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc13/boards/lpcxpresso1347/board.mk",
    "content": "CFLAGS += \\\n  -DCFG_TUSB_MEM_SECTION='__attribute__((section(\".data.$$RAM2\")))'\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/lpc1347.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC1347\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc13/boards/lpcxpresso1347/lpc1347.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * (c) Code Red Technologies Ltd, 2008-2013\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC1347\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v10.2.1 [Build 795] [2018-07-25] on May 14, 2019 6:01:58 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlash64 (rx) : ORIGIN = 0x0, LENGTH = 0x10000 /* 64K bytes (alias Flash) */\n  RamLoc8 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x2000 /* 8K bytes (alias RAM) */\n  RamUsb2 (rwx) : ORIGIN = 0x20004000, LENGTH = 0x800 /* 2K bytes (alias RAM2) */\n  RamPeriph2 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x800 /* 2K bytes (alias RAM3) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlash64 = 0x0  ; /* MFlash64 */\n  __base_Flash = 0x0 ; /* Flash */\n  __top_MFlash64 = 0x0 + 0x10000 ; /* 64K bytes */\n  __top_Flash = 0x0 + 0x10000 ; /* 64K bytes */\n  __base_RamLoc8 = 0x10000000  ; /* RamLoc8 */\n  __base_RAM = 0x10000000 ; /* RAM */\n  __top_RamLoc8 = 0x10000000 + 0x2000 ; /* 8K bytes */\n  __top_RAM = 0x10000000 + 0x2000 ; /* 8K bytes */\n  __base_RamUsb2 = 0x20004000  ; /* RamUsb2 */\n  __base_RAM2 = 0x20004000 ; /* RAM2 */\n  __top_RamUsb2 = 0x20004000 + 0x800 ; /* 2K bytes */\n  __top_RAM2 = 0x20004000 + 0x800 ; /* 2K bytes */\n  __base_RamPeriph2 = 0x20000000  ; /* RamPeriph2 */\n  __base_RAM3 = 0x20000000 ; /* RAM3 */\n  __top_RamPeriph2 = 0x20000000 + 0x800 ; /* 2K bytes */\n  __top_RAM3 = 0x20000000 + 0x800 ; /* 2K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlash64\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlash64\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    } > MFlash64\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlash64\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* DATA section for RamUsb2 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamUsb2)\n        *(.data.$RAM2*)\n        *(.data.$RamUsb2*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > RamUsb2 AT>MFlash64\n    /* DATA section for RamPeriph2 */\n\n    .data_RAM3 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM3 = .) ;\n        *(.ramfunc.$RAM3)\n        *(.ramfunc.$RamPeriph2)\n        *(.data.$RAM3*)\n        *(.data.$RamPeriph2*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM3 = .) ;\n     } > RamPeriph2 AT>MFlash64\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED : ALIGN(4)\n    {\n        KEEP(*(.bss.$RESERVED*))\n        . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > RamLoc8\n\n    /* Main DATA section (RamLoc8) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > RamLoc8 AT>MFlash64\n\n    /* BSS section for RamUsb2 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2*)\n       *(.bss.$RamUsb2*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > RamUsb2\n\n    /* BSS section for RamPeriph2 */\n    .bss_RAM3 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM3 = .) ;\n       *(.bss.$RAM3*)\n       *(.bss.$RamPeriph2*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM3 = .) ;\n    } > RamPeriph2\n\n    /* MAIN BSS SECTION */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        PROVIDE(end = .);\n    } > RamLoc8\n\n    /* NOINIT section for RamUsb2 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM2*)\n       *(.noinit.$RamUsb2*)\n       . = ALIGN(4) ;\n    } > RamUsb2\n\n    /* NOINIT section for RamPeriph2 */\n    .noinit_RAM3 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM3*)\n       *(.noinit.$RamPeriph2*)\n       . = ALIGN(4) ;\n    } > RamPeriph2\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > RamLoc8\n    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc8 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    PROVIDE(__valid_user_code_checksum = 0 -\n                                         (_vStackTop\n                                         + (ResetISR + 1)\n                                         + (NMI_Handler + 1)\n                                         + (HardFault_Handler + 1)\n                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)   /* MemManage_Handler may not be defined */\n                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)     /* BusFault_Handler may not be defined */\n                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined */\n                                         ) );\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}\n"
  },
  {
    "path": "hw/bsp/lpc13/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"chip.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n// Invoked by startup code\nvoid SystemInit(void) {\n  /* Enable IOCON clock */\n  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON);\n  Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));\n  Chip_SetupXtalClocking();\n}\n\nvoid board_init(void) {\n  SystemCoreClockUpdate();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  Chip_GPIO_Init(LPC_GPIO_PORT);\n\n  // LED\n  Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, LED_PORT, LED_PIN);\n\n  // Button\n  Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, BUTTON_PORT, BUTTON_PIN);\n\n  // USB: Setup PLL clock, and power\n  Chip_USB_Init();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid board_led_write(bool state) {\n  Chip_GPIO_SetPinState(LPC_GPIO_PORT, LED_PORT, LED_PIN, state);\n}\n\nuint32_t board_button_read(void) {\n  // active low\n  return Chip_GPIO_GetPinState(LPC_GPIO_PORT, BUTTON_PORT, BUTTON_PIN) ? 0 : 1;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n"
  },
  {
    "path": "hw/bsp/lpc13/family.cmake",
    "content": "include_guard()\n\nset(LPC_FAMILY 13xx)\nset(SDK_DIR ${TOP}/hw/mcu/nxp/lpcopen/lpc${LPC_FAMILY}/lpc_chip_${LPC_FAMILY})\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC13XX CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\n# only need to be built ONCE for all examples\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/../gcc/cr_startup_lpc${LPC_FAMILY}.c\n    ${SDK_DIR}/src/chip_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/clock_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/gpio_${LPC_FAMILY}_1.c\n    ${SDK_DIR}/src/iocon_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/sysctl_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/sysinit_${LPC_FAMILY}.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __USE_LPCOPEN\n    __VTOR_PRESENT=0\n    CORE_M3\n    CFG_TUSB_MEM_ALIGN=TU_ATTR_ALIGNED\\(64\\)\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/inc\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${BOARD_TARGET} PUBLIC -nostdlib)\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\nendfunction()\n\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC13XX)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n\n  target_include_directories(${TARGET} PUBLIC\n    # family, hw, board\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc13/family.mk",
    "content": "MCU_DIR = hw/mcu/nxp/lpcopen/lpc13xx/lpc_chip_13xx\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m3\n\nCFLAGS += \\\n  -flto \\\n  -nostdlib \\\n  -DCORE_M3 \\\n  -D__USE_LPCOPEN \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC13XX \\\n  -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))'\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\n# startup.c and lpc_types.h cause following errors\nCFLAGS += -Wno-error=strict-prototypes -Wno-error=redundant-decls\n\n# caused by freeRTOS port !!\nCFLAGS += -Wno-error=maybe-uninitialized\n\nSRC_C += \\\n\tsrc/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c \\\n\t$(MCU_DIR)/../gcc/cr_startup_lpc13xx.c \\\n\t$(MCU_DIR)/src/chip_13xx.c \\\n\t$(MCU_DIR)/src/clock_13xx.c \\\n\t$(MCU_DIR)/src/gpio_13xx_1.c \\\n\t$(MCU_DIR)/src/iocon_13xx.c \\\n\t$(MCU_DIR)/src/sysctl_13xx.c \\\n\t$(MCU_DIR)/src/sysinit_13xx.c\n\nINC += \\\n  $(TOP)/$(BOARD_PATH) \\\n  $(TOP)/$(MCU_DIR)/inc\n"
  },
  {
    "path": "hw/bsp/lpc15/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #ifdef __GNUC__\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wunused-parameter\"\n  #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n  #endif\n\n  #include \"chip.h\"\n\n  #ifdef __GNUC__\n  #pragma GCC diagnostic pop\n  #endif\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               2\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* Define to trap errors during development. */\n// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7\n#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__)\n  #define configASSERT(_exp) \\\n    do {\\\n      if ( !(_exp) ) { \\\n        volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \\\n        if ( (*ARM_CM_DHCSR) & 1UL ) {  /* Only halt mcu if debugger is attached */ \\\n          taskDISABLE_INTERRUPTS(); \\\n           __asm(\"BKPT #0\\n\"); \\\n        }\\\n      }\\\n    } while(0)\n#else\n  #define configASSERT( x )\n#endif\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/lpc15/boards/lpcxpresso1549/board.cmake",
    "content": "set(JLINK_DEVICE lpc1549)\nset(PYOCD_TARGET lpc1549)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc1549.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CFG_EXAMPLE_MSC_READONLY\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc15/boards/lpcxpresso1549/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso1549\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/OM13056\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// XTAL\n#define XTAL_OscRateIn      12000000\n#define XTAL_RTCOscRateIn   32768\n\n// LED\n#define LED_PORT            0\n#define LED_PIN             25\n\n// Wake Switch\n#define BUTTON_PORT         0\n#define BUTTON_PIN          17\n\n#define UART_PORT           LPC_USART0\n\nstatic inline void board_lpc15_pinmux_swm_init(void)\n{\n  // Pinmux\n  const PINMUX_GRP_T pinmuxing[] =\n  {\n    {0, 25, (IOCON_MODE_INACT    | IOCON_DIGMODE_EN)}, // PIO0_25-BREAK_CTRL-RED (low enable)\n    {0, 13, (IOCON_MODE_INACT    | IOCON_DIGMODE_EN)}, // PIO0_13-ISP_RX\n    {0, 18, (IOCON_MODE_INACT    | IOCON_DIGMODE_EN)}, // PIO0_18-ISP_TX\n    {1, 11, (IOCON_MODE_PULLDOWN | IOCON_DIGMODE_EN)}, // PIO1_11-ISP_1 (VBUS)\n  };\n\n  // Pin Mux\n  Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));\n\n  // SWIM\n  Chip_SWM_MovablePortPinAssign(SWM_USB_VBUS_I , 1, 11);\n  Chip_SWM_MovablePortPinAssign(SWM_UART0_RXD_I, 0, 13);\n  Chip_SWM_MovablePortPinAssign(SWM_UART0_TXD_O, 0, 18);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc15/boards/lpcxpresso1549/board.mk",
    "content": "CFLAGS += -DCFG_EXAMPLE_VIDEO_READONLY\nLD_FILE = $(BOARD_PATH)/lpc1549.ld\n\nJLINK_DEVICE = LPC1549\n\n# flash using pyocd\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc15/boards/lpcxpresso1549/lpc1549.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * Copyright (c) 2008-2013 Code Red Technologies Ltd,\n * Copyright 2015, 2018-2019 NXP\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC1549\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v11.0.0 [Build 2516] [2019-06-05] on Oct 3, 2019 2:55:18 PM\n */\n\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlash256 (rx) : ORIGIN = 0x0, LENGTH = 0x40000 /* 256K bytes (alias Flash) */\n  Ram0_16 (rwx) : ORIGIN = 0x2000000, LENGTH = 0x4000 /* 16K bytes (alias RAM) */\n  Ram1_16 (rwx) : ORIGIN = 0x2004000, LENGTH = 0x4000 /* 16K bytes (alias RAM2) */\n  Ram2_4 (rwx) : ORIGIN = 0x2008000, LENGTH = 0x1000 /* 4K bytes (alias RAM3) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlash256 = 0x0  ; /* MFlash256 */\n  __base_Flash = 0x0 ; /* Flash */\n  __top_MFlash256 = 0x0 + 0x40000 ; /* 256K bytes */\n  __top_Flash = 0x0 + 0x40000 ; /* 256K bytes */\n  __base_Ram0_16 = 0x2000000  ; /* Ram0_16 */\n  __base_RAM = 0x2000000 ; /* RAM */\n  __top_Ram0_16 = 0x2000000 + 0x4000 ; /* 16K bytes */\n  __top_RAM = 0x2000000 + 0x4000 ; /* 16K bytes */\n  __base_Ram1_16 = 0x2004000  ; /* Ram1_16 */\n  __base_RAM2 = 0x2004000 ; /* RAM2 */\n  __top_Ram1_16 = 0x2004000 + 0x4000 ; /* 16K bytes */\n  __top_RAM2 = 0x2004000 + 0x4000 ; /* 16K bytes */\n  __base_Ram2_4 = 0x2008000  ; /* Ram2_4 */\n  __base_RAM3 = 0x2008000 ; /* RAM3 */\n  __top_Ram2_4 = 0x2008000 + 0x1000 ; /* 4K bytes */\n  __top_RAM3 = 0x2008000 + 0x1000 ; /* 4K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlash256\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlash256\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    } > MFlash256\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlash256\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* DATA section for Ram1_16 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$Ram1_16)\n        *(.data.$RAM2)\n        *(.data.$Ram1_16)\n        *(.data.$RAM2.*)\n        *(.data.$Ram1_16.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > Ram1_16 AT>MFlash256\n    /* DATA section for Ram2_4 */\n\n    .data_RAM3 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM3 = .) ;\n        *(.ramfunc.$RAM3)\n        *(.ramfunc.$Ram2_4)\n        *(.data.$RAM3)\n        *(.data.$Ram2_4)\n        *(.data.$RAM3.*)\n        *(.data.$Ram2_4.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM3 = .) ;\n     } > Ram2_4 AT>MFlash256\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED (NOLOAD) :\n    {\n        . = ALIGN(4) ;\n        KEEP(*(.bss.$RESERVED*))\n       . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > Ram0_16\n\n    /* Main DATA section (Ram0_16) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > Ram0_16 AT>MFlash256\n\n    /* BSS section for Ram1_16 */\n    .bss_RAM2 :\n    {\n       . = ALIGN(4) ;\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2)\n       *(.bss.$Ram1_16)\n       *(.bss.$RAM2.*)\n       *(.bss.$Ram1_16.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > Ram1_16\n\n    /* BSS section for Ram2_4 */\n    .bss_RAM3 :\n    {\n       . = ALIGN(4) ;\n       PROVIDE(__start_bss_RAM3 = .) ;\n       *(.bss.$RAM3)\n       *(.bss.$Ram2_4)\n       *(.bss.$RAM3.*)\n       *(.bss.$Ram2_4.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM3 = .) ;\n    } > Ram2_4\n\n    /* MAIN BSS SECTION */\n    .bss :\n    {\n        . = ALIGN(4) ;\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        PROVIDE(end = .);\n    } > Ram0_16\n\n    /* NOINIT section for Ram1_16 */\n    .noinit_RAM2 (NOLOAD) :\n    {\n       . = ALIGN(4) ;\n       *(.noinit.$RAM2)\n       *(.noinit.$Ram1_16)\n       *(.noinit.$RAM2.*)\n       *(.noinit.$Ram1_16.*)\n       . = ALIGN(4) ;\n    } > Ram1_16\n\n    /* NOINIT section for Ram2_4 */\n    .noinit_RAM3 (NOLOAD) :\n    {\n       . = ALIGN(4) ;\n       *(.noinit.$RAM3)\n       *(.noinit.$Ram2_4)\n       *(.noinit.$RAM3.*)\n       *(.noinit.$Ram2_4.*)\n       . = ALIGN(4) ;\n    } > Ram2_4\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD):\n    {\n         . = ALIGN(4) ;\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > Ram0_16\n    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_Ram0_16 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    PROVIDE(__valid_user_code_checksum = 0 -\n                                         (_vStackTop\n                                         + (ResetISR + 1)\n                                         + (NMI_Handler + 1)\n                                         + (HardFault_Handler + 1)\n                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)   /* MemManage_Handler may not be defined */\n                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)     /* BusFault_Handler may not be defined */\n                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined */\n                                         ) );\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}\n"
  },
  {
    "path": "hw/bsp/lpc15/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#ifdef __GNUC__\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n  #pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n\n#include \"chip.h\"\n\n#ifdef __GNUC__\n  #pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void)\n{\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n/* System oscillator rate and RTC oscillator rate */\nconst uint32_t OscRateIn = XTAL_OscRateIn;\nconst uint32_t RTCOscRateIn = XTAL_RTCOscRateIn;\n\n// Invoked by startup code\nvoid SystemInit(void)\n{\n  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SRAM1);\n  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SRAM2);\n  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_IOCON);\n  Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_SWM);\n  Chip_SYSCTL_PeriphReset(RESET_IOCON);\n\n  board_lpc15_pinmux_swm_init();\n\n  Chip_SetupXtalClocking();\n}\n\nvoid board_init(void)\n{\n  SystemCoreClockUpdate();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  Chip_GPIO_Init(LPC_GPIO);\n\n  // LED\n  Chip_GPIO_SetPinDIROutput(LPC_GPIO, LED_PORT, LED_PIN);\n\n  // Button\n  Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);\n\n\t// UART\n\tChip_Clock_SetUARTBaseClockRate(Chip_Clock_GetMainClockRate(), false);\n\tChip_UART_Init(UART_PORT);\n\tChip_UART_ConfigData(UART_PORT, UART_CFG_DATALEN_8 | UART_CFG_PARITY_NONE | UART_CFG_STOPLEN_1);\n\tChip_UART_SetBaud(UART_PORT, CFG_BOARD_UART_BAUDRATE);\n\tChip_UART_Enable(UART_PORT);\n\tChip_UART_TXEnable(UART_PORT);\n\n  // USB: Setup PLL clock, and power\n  Chip_USB_Init();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state);\n}\n\nuint32_t board_button_read(void)\n{\n  // active low\n  return Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN) ? 0 : 1;\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  return Chip_UART_SendBlocking(UART_PORT, buf, len);\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler (void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc15/family.cmake",
    "content": "include_guard()\n\nset(LPC_FAMILY 15xx)\nset(SDK_DIR ${TOP}/hw/mcu/nxp/lpcopen/lpc${LPC_FAMILY}/lpc_chip_${LPC_FAMILY})\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC15XX CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\n# only need to be built ONCE for all examples\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/../gcc/cr_startup_lpc${LPC_FAMILY}.c\n    ${SDK_DIR}/src/chip_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/clock_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/gpio_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/iocon_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/swm_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/sysctl_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/sysinit_${LPC_FAMILY}.c\n    ${SDK_DIR}/src/uart_${LPC_FAMILY}.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __USE_LPCOPEN\n    #__VTOR_PRESENT=0\n    CORE_M3\n    CFG_TUSB_MEM_ALIGN=TU_ATTR_ALIGNED\\(64\\)\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/inc\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${BOARD_TARGET} PUBLIC -nostdlib)\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\nendfunction()\n\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC15XX)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n\n  target_include_directories(${TARGET} PUBLIC\n    # family, hw, board\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc15/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m3\n\nCFLAGS += \\\n  -flto \\\n  -nostdlib \\\n  -DCORE_M3 \\\n  -D__USE_LPCOPEN \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC15XX \\\n  -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))'\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\n# mcu driver cause following warnings\nCFLAGS_GCC += -Wno-error=strict-prototypes -Wno-error=unused-parameter -Wno-error=unused-variable -Wno-error=cast-qual\n\nMCU_DIR = hw/mcu/nxp/lpcopen/lpc15xx/lpc_chip_15xx\n\nSRC_C += \\\n\tsrc/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c \\\n\t$(MCU_DIR)/../gcc/cr_startup_lpc15xx.c \\\n\t$(MCU_DIR)/src/chip_15xx.c \\\n\t$(MCU_DIR)/src/clock_15xx.c \\\n\t$(MCU_DIR)/src/gpio_15xx.c \\\n\t$(MCU_DIR)/src/iocon_15xx.c \\\n\t$(MCU_DIR)/src/swm_15xx.c \\\n\t$(MCU_DIR)/src/sysctl_15xx.c \\\n\t$(MCU_DIR)/src/sysinit_15xx.c \\\n\t$(MCU_DIR)/src/uart_15xx.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(MCU_DIR)/inc\n"
  },
  {
    "path": "hw/bsp/lpc17/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"chip.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc17/boards/lpcxpresso1769/board.cmake",
    "content": "set(MCU_VARIANT LPC1769)\n\nset(JLINK_DEVICE LPC1769)\nset(PYOCD_TARGET LPC1769)\nset(NXPLINK_DEVICE LPC1769:LPC1769)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc1769.ld)\n\nfunction(update_board TARGET)\n  # nothing to do\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc17/boards/lpcxpresso1769/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso1769\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/OM13000\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              0\n#define LED_PIN               22\n#define LED_STATE_ON          1\n\n// JOYSTICK_DOWN if using LPCXpresso Base Board\n#define BUTTON_PORT           0\n#define BUTTON_PIN            15\n#define BUTTON_STATE_ACTIVE   0\n\n#define BOARD_UART_PORT   LPC_UART3\n\n/* System oscillator rate and RTC oscillator rate */\nconst uint32_t OscRateIn = 12000000;\nconst uint32_t RTCOscRateIn = 32768;\n\n// Pin muxing configuration\nstatic const PINMUX_GRP_T pinmuxing[] = {\n    {0, 0,                    IOCON_MODE_INACT | IOCON_FUNC2},  /* TXD3 */\n    {0, 1,                    IOCON_MODE_INACT | IOCON_FUNC2},  /* RXD3 */\n    {LED_PORT,    LED_PIN,    IOCON_MODE_INACT | IOCON_FUNC0},  /* Led 0 */\n\n    /* Joystick buttons. */\n//  {2, 3,  IOCON_MODE_INACT | IOCON_FUNC0},\t/* JOYSTICK_UP */\n    {BUTTON_PORT, BUTTON_PIN, IOCON_FUNC0 | IOCON_MODE_PULLUP},  /* JOYSTICK_DOWN */\n//  {2, 4,  IOCON_MODE_INACT | IOCON_FUNC0},\t/* JOYSTICK_LEFT */\n//  {0, 16, IOCON_MODE_INACT | IOCON_FUNC0},\t/* JOYSTICK_RIGHT */\n//  {0, 17, IOCON_MODE_INACT | IOCON_FUNC0},\t/* JOYSTICK_PRESS */\n};\n\nstatic const PINMUX_GRP_T pin_usb_mux[] = {\n    {0, 29, IOCON_MODE_INACT | IOCON_FUNC1}, // D+\n    {0, 30, IOCON_MODE_INACT | IOCON_FUNC1}, // D-\n    {2, 9,  IOCON_MODE_INACT | IOCON_FUNC1}, // Soft Connect\n\n    {1, 19, IOCON_MODE_INACT | IOCON_FUNC2}, // USB_PPWR (Host mode)\n\n    // VBUS is not connected on this board, so leave the pin at default setting.\n    /// Chip_IOCON_PinMux(LPC_IOCON, 1, 30, IOCON_MODE_INACT, IOCON_FUNC2);  // USB VBUS\n};\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc17/boards/lpcxpresso1769/board.mk",
    "content": "# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/lpc1769.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC1769\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc17/boards/lpcxpresso1769/lpc1769.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * (c) Code Red Technologies Ltd, 2008-2013\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC1769\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v10.2.1 [Build 795] [2018-07-25] on May 14, 2019 6:39:29 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlash512 (rx) : ORIGIN = 0x0, LENGTH = 0x80000 /* 512K bytes (alias Flash) */\n  RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */\n  RamAHB32 (rwx) : ORIGIN = 0x2007c000, LENGTH = 0x8000 /* 32K bytes (alias RAM2) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlash512 = 0x0  ; /* MFlash512 */\n  __base_Flash = 0x0 ; /* Flash */\n  __top_MFlash512 = 0x0 + 0x80000 ; /* 512K bytes */\n  __top_Flash = 0x0 + 0x80000 ; /* 512K bytes */\n  __base_RamLoc32 = 0x10000000  ; /* RamLoc32 */\n  __base_RAM = 0x10000000 ; /* RAM */\n  __top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __base_RamAHB32 = 0x2007c000  ; /* RamAHB32 */\n  __base_RAM2 = 0x2007c000 ; /* RAM2 */\n  __top_RamAHB32 = 0x2007c000 + 0x8000 ; /* 32K bytes */\n  __top_RAM2 = 0x2007c000 + 0x8000 ; /* 32K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlash512\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlash512\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    } > MFlash512\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlash512\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* DATA section for RamAHB32 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamAHB32)\n        *(.data.$RAM2*)\n        *(.data.$RamAHB32*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > RamAHB32 AT>MFlash512\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED : ALIGN(4)\n    {\n        KEEP(*(.bss.$RESERVED*))\n        . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > RamLoc32\n\n    /* Main DATA section (RamLoc32) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > RamLoc32 AT>MFlash512\n\n    /* BSS section for RamAHB32 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2*)\n       *(.bss.$RamAHB32*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > RamAHB32\n\n    /* MAIN BSS SECTION */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n/*        PROVIDE(end = .);*/\n    } > RamLoc32\n\n    /* NOINIT section for RamAHB32 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM2*)\n       *(.noinit.$RamAHB32*)\n       . = ALIGN(4) ;\n    } > RamAHB32\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > RamLoc32\n\n    /* hathach add heap section for clang */\n    .heap (NOLOAD): {\n        __heap_start = .;\n        __HeapBase = .;\n        __heap_base = .;\n        __end = .;\n        PROVIDE(end = .);\n        PROVIDE(_end = .);\n        PROVIDE(__end__ = .);\n        KEEP(*(.heap*))\n        __HeapLimit = .;\n        __heap_limit = .;\n        __heap_end = .;\n    } > RamLoc32\n\n/*    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);*/\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    /* This cause issue with clang linker, so it is disabled */\n    /* MemManage_Handler, BusFault_Handler, UsageFault_Handler may not be defined */\n    PROVIDE(__valid_user_code_checksum = 0 -\n                                         (_vStackTop\n                                         + (ResetISR + 1)\n                                         + (NMI_Handler + 1)\n                                         + (HardFault_Handler + 1)\n                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)\n                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)\n                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1)\n                                         ) );\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}\n"
  },
  {
    "path": "hw/bsp/lpc17/boards/mbed1768/board.cmake",
    "content": "set(MCU_VARIANT LPC1768)\n\nset(JLINK_DEVICE LPC1768)\nset(PYOCD_TARGET LPC1768)\nset(NXPLINK_DEVICE LPC1768:LPC1768)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc1768.ld)\n\nfunction(update_board TARGET)\n  # nothing to do\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc17/boards/mbed1768/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: mbed 1768\n   url: https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-arm-cortex-m3/arm-mbed-lpc1768-board:OM11043\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              1\n#define LED_PIN               18\n#define LED_STATE_ON          1\n\n// JOYSTICK_DOWN if using LPCXpresso Base Board\n#define BUTTON_PORT           0\n#define BUTTON_PIN            15\n#define BUTTON_STATE_ACTIVE   0\n\n#define BOARD_UART_PORT   LPC_UART3\n\n/* System oscillator rate and RTC oscillator rate */\nconst uint32_t OscRateIn = 10000000;\nconst uint32_t RTCOscRateIn = 32768;\n\n// Pin muxing configuration\nstatic const PINMUX_GRP_T pinmuxing[] = {\n    {LED_PORT,  LED_PIN,  IOCON_MODE_INACT | IOCON_FUNC0},\n    {BUTTON_PORT, BUTTON_PIN, IOCON_FUNC0 | IOCON_MODE_PULLUP},\n};\n\nstatic const PINMUX_GRP_T pin_usb_mux[] = {\n    {0, 29, IOCON_MODE_INACT | IOCON_FUNC1}, // D+\n    {0, 30, IOCON_MODE_INACT | IOCON_FUNC1}, // D-\n    {2, 9,  IOCON_MODE_INACT | IOCON_FUNC1}, // Soft Connect\n\n    {1, 19, IOCON_MODE_INACT | IOCON_FUNC2}, // USB_PPWR (Host mode)\n    {1, 22, IOCON_MODE_INACT | IOCON_FUNC2}, // USB_PWRD\n\n    // VBUS is not connected on this board, so leave the pin at default setting.\n    // Chip_IOCON_PinMux(LPC_IOCON, 1, 30, IOCON_MODE_INACT, IOCON_FUNC2);  // USB VBUS\n};\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc17/boards/mbed1768/board.mk",
    "content": "# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/lpc1768.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC1768\nPYOCD_TARGET = lpc1768\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc17/boards/mbed1768/lpc1768.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * (c) Code Red Technologies Ltd, 2008-2013\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC1769\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v10.2.1 [Build 795] [2018-07-25] on May 14, 2019 6:39:29 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlash512 (rx) : ORIGIN = 0x0, LENGTH = 0x80000 /* 512K bytes (alias Flash) */\n  RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */\n  RamAHB32 (rwx) : ORIGIN = 0x2007c000, LENGTH = 0x8000 /* 32K bytes (alias RAM2) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlash512 = 0x0  ; /* MFlash512 */\n  __base_Flash = 0x0 ; /* Flash */\n  __top_MFlash512 = 0x0 + 0x80000 ; /* 512K bytes */\n  __top_Flash = 0x0 + 0x80000 ; /* 512K bytes */\n  __base_RamLoc32 = 0x10000000  ; /* RamLoc32 */\n  __base_RAM = 0x10000000 ; /* RAM */\n  __top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __base_RamAHB32 = 0x2007c000  ; /* RamAHB32 */\n  __base_RAM2 = 0x2007c000 ; /* RAM2 */\n  __top_RamAHB32 = 0x2007c000 + 0x8000 ; /* 32K bytes */\n  __top_RAM2 = 0x2007c000 + 0x8000 ; /* 32K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlash512\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlash512\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    } > MFlash512\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlash512\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* DATA section for RamAHB32 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamAHB32)\n        *(.data.$RAM2*)\n        *(.data.$RamAHB32*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > RamAHB32 AT>MFlash512\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED : ALIGN(4)\n    {\n        KEEP(*(.bss.$RESERVED*))\n        . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > RamLoc32\n\n    /* Main DATA section (RamLoc32) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > RamLoc32 AT>MFlash512\n\n    /* BSS section for RamAHB32 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2*)\n       *(.bss.$RamAHB32*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > RamAHB32\n\n    /* MAIN BSS SECTION */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n/*        PROVIDE(end = .);*/\n    } > RamLoc32\n\n    /* NOINIT section for RamAHB32 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM2*)\n       *(.noinit.$RamAHB32*)\n       . = ALIGN(4) ;\n    } > RamAHB32\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > RamLoc32\n\n    /* hathach add heap section for clang */\n    .heap (NOLOAD): {\n        __heap_start = .;\n        __HeapBase = .;\n        __heap_base = .;\n        __end = .;\n        PROVIDE(end = .);\n        PROVIDE(_end = .);\n        PROVIDE(__end__ = .);\n        KEEP(*(.heap*))\n        __HeapLimit = .;\n        __heap_limit = .;\n        __heap_end = .;\n    } > RamLoc32\n\n/*    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);*/\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    /* This cause issue with clang linker, so it is disabled */\n    /* MemManage_Handler, BusFault_Handler, UsageFault_Handler may not be defined */\n    PROVIDE(__valid_user_code_checksum = 0 -\n                                         (_vStackTop\n                                         + (ResetISR + 1)\n                                         + (NMI_Handler + 1)\n                                         + (HardFault_Handler + 1)\n                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)\n                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)\n                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1)\n                                         ) );\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}\n"
  },
  {
    "path": "hw/bsp/lpc17/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"chip.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n// Invoked by startup code\nvoid SystemInit(void) {\n#ifdef __USE_LPCOPEN\n  extern void (* const g_pfnVectors[])(void);\n  unsigned int* pSCB_VTOR = (unsigned int*) 0xE000ED08;\n  *pSCB_VTOR = (unsigned int) g_pfnVectors;\n#endif\n\n  Chip_IOCON_Init(LPC_IOCON);\n  Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));\n  Chip_SetupXtalClocking();\n\n  Chip_SYSCTL_SetFLASHAccess(FLASHTIM_100MHZ_CPU);\n}\n\nvoid board_init(void) {\n  SystemCoreClockUpdate();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  Chip_GPIO_Init(LPC_GPIO);\n  Chip_GPIO_SetPinDIROutput(LPC_GPIO, LED_PORT, LED_PIN);\n  Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);\n\n#if 0\n  //------------- UART -------------//\n  PINSEL_CFG_Type PinCfg =\n  {\n      .Portnum   = 0,\n      .Pinnum    = 0, // TXD is P0.0\n      .Funcnum   = 2,\n      .OpenDrain = 0,\n      .Pinmode   = 0\n  };\n  PINSEL_ConfigPin(&PinCfg);\n\n  PinCfg.Portnum = 0;\n  PinCfg.Pinnum  = 1; // RXD is P0.1\n  PINSEL_ConfigPin(&PinCfg);\n\n  UART_CFG_Type UARTConfigStruct;\n  UART_ConfigStructInit(&UARTConfigStruct);\n  UARTConfigStruct.Baud_rate = CFG_BOARD_UART_BAUDRATE;\n\n  UART_Init(BOARD_UART_PORT, &UARTConfigStruct);\n  UART_TxCmd(BOARD_UART_PORT, ENABLE); // Enable UART Transmit\n#endif\n\n  //------------- USB -------------//\n  Chip_IOCON_SetPinMuxing(LPC_IOCON, pin_usb_mux, sizeof(pin_usb_mux) / sizeof(PINMUX_GRP_T));\n  Chip_USB_Init();\n\n  enum {\n    USBCLK_DEVCIE = 0x12,     // AHB + Device\n    USBCLK_HOST = 0x19,     // AHB + Host + OTG\n//    0x1B // Host + Device + OTG + AHB\n  };\n\n#if CFG_TUD_ENABLED\n  uint32_t const clk_en = USBCLK_DEVCIE;\n#else\n  uint32_t const clk_en = USBCLK_HOST;\n#endif\n\n  LPC_USB->OTGClkCtrl = clk_en;\n  while ((LPC_USB->OTGClkSt & clk_en) != clk_en) {}\n\n#if CFG_TUH_ENABLED\n  // set portfunc to host !!!\n  LPC_USB->StCtrl = 0x3; // should be 1\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\nvoid board_led_write(bool state) {\n  Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n//  return UART_ReceiveByte(BOARD_UART_PORT);\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n//  UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  #if CFG_TUD_ENABLED\n  tud_int_handler(0);\n  #endif\n\n  #if CFG_TUH_ENABLED\n  tuh_int_handler(0, true);\n  #endif\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc17/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/nxp/lpcopen/lpc175x_6x/lpc_chip_175x_6x)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC175X_6X CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\n# only need to be built ONCE for all examples\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/../gcc/cr_startup_lpc175x_6x.c\n    ${SDK_DIR}/src/chip_17xx_40xx.c\n    ${SDK_DIR}/src/clock_17xx_40xx.c\n    ${SDK_DIR}/src/gpio_17xx_40xx.c\n    ${SDK_DIR}/src/iocon_17xx_40xx.c\n    ${SDK_DIR}/src/sysctl_17xx_40xx.c\n    ${SDK_DIR}/src/sysinit_17xx_40xx.c\n    ${SDK_DIR}/src/uart_17xx_40xx.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __USE_LPCOPEN\n    CORE_M3\n    RTC_EV_SUPPORT=0\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/inc\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${BOARD_TARGET} PUBLIC -nostdlib)\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\nendfunction()\n\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC175X_6X)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nxp/lpc17_40/dcd_lpc17_40.c\n    ${TOP}/src/portable/ohci/ohci.c\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n\n  target_include_directories(${TARGET} PUBLIC\n    # family, hw, board\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc17/family.mk",
    "content": "MCU_DIR = hw/mcu/nxp/lpcopen/lpc175x_6x/lpc_chip_175x_6x\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m3\n\nCFLAGS += \\\n  -flto \\\n  -nostdlib \\\n  -DCORE_M3 \\\n  -D__USE_LPCOPEN \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC175X_6X \\\n  -DRTC_EV_SUPPORT=0\n\n# lpc_types.h cause following errors\nCFLAGS_GCC += -Wno-error=strict-prototypes -Wno-error=cast-qual\n\n# caused by freeRTOS port !!\nCFLAGS += -Wno-error=maybe-uninitialized\n\nLDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/nxp/lpc17_40/dcd_lpc17_40.c \\\n\tsrc/portable/ohci/ohci.c \\\n\t$(MCU_DIR)/../gcc/cr_startup_lpc175x_6x.c \\\n\t$(MCU_DIR)/src/chip_17xx_40xx.c \\\n\t$(MCU_DIR)/src/clock_17xx_40xx.c \\\n\t$(MCU_DIR)/src/gpio_17xx_40xx.c \\\n\t$(MCU_DIR)/src/iocon_17xx_40xx.c \\\n\t$(MCU_DIR)/src/sysctl_17xx_40xx.c \\\n\t$(MCU_DIR)/src/sysinit_17xx_40xx.c \\\n\t$(MCU_DIR)/src/uart_17xx_40xx.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(MCU_DIR)/inc \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n"
  },
  {
    "path": "hw/bsp/lpc18/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"chip.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/lpcxpresso18s37/board.cmake",
    "content": "set(MCU_VARIANT LPC18S37)\n\nset(JLINK_DEVICE LPC18S37)\nset(PYOCD_TARGET LPC18S37)\nset(NXPLINK_DEVICE LPC18S37:LPCXPRESSO18S37)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc1837.ld)\n\nfunction(update_board TARGET)\n  # nothing to do\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/lpcxpresso18s37/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso18s37\n   url: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso18s37-development-board:OM13076\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n// Note: For USB Host demo, install JP4\n// WARNING: don't install JP4 when running as device\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED Red\n#define LED_PORT      3\n#define LED_PIN       7\n\n// ISP Button\n#define BUTTON_PORT   0\n#define BUTTON_PIN    7\n\n#define UART_DEV      LPC_USART0\n\nstatic inline void board_lpc18_pinmux(void)\n{\n  const PINMUX_GRP_T pinmuxing[] =\n  {\n    // LEDs\n    { 0x6, 9 , SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0 },\n    { 0x6, 11, SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0 },\n\n    // Button\n    { 0x2, 7, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC0 },\n\n    // UART\n    { 0x06, 4, SCU_MODE_PULLDOWN | SCU_MODE_FUNC2 },\n    { 0x02, 1, SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC1 },\n\n    // USB0\n    //{ 0x6, 3, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC1 },\t\t                // P6_3 USB0_PWR_EN, USB0 VBus function\n\n    // USB1\n    //{ 0x9, 5, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC2 },\t\t\t              // P9_5 USB1_VBUS_EN, USB1 VBus function\n    //{ 0x2, 5, SCU_MODE_INACT  | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2 }, // P2_5 USB1_VBUS, MUST CONFIGURE THIS SIGNAL FOR USB1 NORMAL OPERATION\n    {0x2, 5, SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC4 },\n  };\n\n  Chip_SCU_SetPinMuxing(pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/lpcxpresso18s37/board.mk",
    "content": "LD_FILE = $(BOARD_PATH)/lpc1837.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC18S37\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/lpcxpresso18s37/lpc1837.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * Copyright (c) 2008-2013 Code Red Technologies Ltd,\n * Copyright 2015, 2018-2019 NXP\n * (c) NXP Semiconductors 2013-2021\n * Generated linker script file for LPC1837\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v11.2.0 [Build 4120] [2020-07-09] on Mar 3, 2021 4:22:49 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlashA512 (rx) : ORIGIN = 0x1a000000, LENGTH = 0x80000 /* 512K bytes (alias Flash) */\n  MFlashB512 (rx) : ORIGIN = 0x1b000000, LENGTH = 0x80000 /* 512K bytes (alias Flash2) */\n  RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */\n  RamLoc40 (rwx) : ORIGIN = 0x10080000, LENGTH = 0xa000 /* 40K bytes (alias RAM2) */\n  RamAHB32 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000 /* 32K bytes (alias RAM3) */\n  RamAHB16 (rwx) : ORIGIN = 0x20008000, LENGTH = 0x4000 /* 16K bytes (alias RAM4) */\n  RamAHB_ETB16 (rwx) : ORIGIN = 0x2000c000, LENGTH = 0x4000 /* 16K bytes (alias RAM5) */\n}\n\n/* Define a symbol for the top of each memory region */\n__base_MFlashA512 = 0x1a000000  ; /* MFlashA512 */\n__base_Flash = 0x1a000000 ; /* Flash */\n__top_MFlashA512 = 0x1a000000 + 0x80000 ; /* 512K bytes */\n__top_Flash = 0x1a000000 + 0x80000 ; /* 512K bytes */\n__base_MFlashB512 = 0x1b000000  ; /* MFlashB512 */\n__base_Flash2 = 0x1b000000 ; /* Flash2 */\n__top_MFlashB512 = 0x1b000000 + 0x80000 ; /* 512K bytes */\n__top_Flash2 = 0x1b000000 + 0x80000 ; /* 512K bytes */\n__base_RamLoc32 = 0x10000000  ; /* RamLoc32 */\n__base_RAM = 0x10000000 ; /* RAM */\n__top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */\n__top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */\n__base_RamLoc40 = 0x10080000  ; /* RamLoc40 */\n__base_RAM2 = 0x10080000 ; /* RAM2 */\n__top_RamLoc40 = 0x10080000 + 0xa000 ; /* 40K bytes */\n__top_RAM2 = 0x10080000 + 0xa000 ; /* 40K bytes */\n__base_RamAHB32 = 0x20000000  ; /* RamAHB32 */\n__base_RAM3 = 0x20000000 ; /* RAM3 */\n__top_RamAHB32 = 0x20000000 + 0x8000 ; /* 32K bytes */\n__top_RAM3 = 0x20000000 + 0x8000 ; /* 32K bytes */\n__base_RamAHB16 = 0x20008000  ; /* RamAHB16 */\n__base_RAM4 = 0x20008000 ; /* RAM4 */\n__top_RamAHB16 = 0x20008000 + 0x4000 ; /* 16K bytes */\n__top_RAM4 = 0x20008000 + 0x4000 ; /* 16K bytes */\n__base_RamAHB_ETB16 = 0x2000c000  ; /* RamAHB_ETB16 */\n__base_RAM5 = 0x2000c000 ; /* RAM5 */\n__top_RamAHB_ETB16 = 0x2000c000 + 0x4000 ; /* 16K bytes */\n__top_RAM5 = 0x2000c000 + 0x4000 ; /* 16K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\n{\n     .text_Flash2 : ALIGN(4)\n    {\n       FILL(0xff)\n        *(.text_Flash2) /* for compatibility with previous releases */\n        *(.text_MFlashB512) /* for compatibility with previous releases */\n        *(.text.$Flash2)\n        *(.text.$MFlashB512)\n        *(.text_Flash2.*) /* for compatibility with previous releases */\n        *(.text_MFlashB512.*) /* for compatibility with previous releases */\n        *(.text.$Flash2.*)\n        *(.text.$MFlashB512.*)\n        *(.rodata.$Flash2)\n        *(.rodata.$MFlashB512)\n        *(.rodata.$Flash2.*)\n        *(.rodata.$MFlashB512.*)            } > MFlashB512\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlashA512\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlashA512\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    } > MFlashA512\n\n    .ARM.exidx : ALIGN(4)\n    {\n        __exidx_start = .;\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        __exidx_end = .;\n    } > MFlashA512\n\n    _etext = .;\n\n    /* DATA section for RamLoc40 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        PROVIDE(__start_data_RamLoc40 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamLoc40)\n        *(.data.$RAM2)\n        *(.data.$RamLoc40)\n        *(.data.$RAM2.*)\n        *(.data.$RamLoc40.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n        PROVIDE(__end_data_RamLoc40 = .) ;\n     } > RamLoc40 AT>MFlashA512\n\n    /* DATA section for RamAHB32 */\n\n    .data_RAM3 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM3 = .) ;\n        PROVIDE(__start_data_RamAHB32 = .) ;\n        *(.ramfunc.$RAM3)\n        *(.ramfunc.$RamAHB32)\n        *(.data.$RAM3)\n        *(.data.$RamAHB32)\n        *(.data.$RAM3.*)\n        *(.data.$RamAHB32.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM3 = .) ;\n        PROVIDE(__end_data_RamAHB32 = .) ;\n     } > RamAHB32 AT>MFlashA512\n\n    /* DATA section for RamAHB16 */\n\n    .data_RAM4 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM4 = .) ;\n        PROVIDE(__start_data_RamAHB16 = .) ;\n        *(.ramfunc.$RAM4)\n        *(.ramfunc.$RamAHB16)\n        *(.data.$RAM4)\n        *(.data.$RamAHB16)\n        *(.data.$RAM4.*)\n        *(.data.$RamAHB16.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM4 = .) ;\n        PROVIDE(__end_data_RamAHB16 = .) ;\n     } > RamAHB16 AT>MFlashA512\n\n    /* DATA section for RamAHB_ETB16 */\n\n    .data_RAM5 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM5 = .) ;\n        PROVIDE(__start_data_RamAHB_ETB16 = .) ;\n        *(.ramfunc.$RAM5)\n        *(.ramfunc.$RamAHB_ETB16)\n        *(.data.$RAM5)\n        *(.data.$RamAHB_ETB16)\n        *(.data.$RAM5.*)\n        *(.data.$RamAHB_ETB16.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM5 = .) ;\n        PROVIDE(__end_data_RamAHB_ETB16 = .) ;\n     } > RamAHB_ETB16 AT>MFlashA512\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    } > RamLoc32 AT> RamLoc32\n\n    /* Main DATA section (RamLoc32) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       PROVIDE(__start_data_RAM = .) ;\n       PROVIDE(__start_data_RamLoc32 = .) ;\n       *(vtable)\n       *(.ramfunc*)\n       KEEP(*(CodeQuickAccess))\n       KEEP(*(DataQuickAccess))\n       *(RamFunction)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n       PROVIDE(__end_data_RAM = .) ;\n       PROVIDE(__end_data_RamLoc32 = .) ;\n    } > RamLoc32 AT>MFlashA512\n\n    /* BSS section for RamLoc40 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       PROVIDE(__start_bss_RamLoc40 = .) ;\n       *(.bss.$RAM2)\n       *(.bss.$RamLoc40)\n       *(.bss.$RAM2.*)\n       *(.bss.$RamLoc40.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n       PROVIDE(__end_bss_RamLoc40 = .) ;\n    } > RamLoc40 AT> RamLoc40\n\n    /* BSS section for RamAHB32 */\n    .bss_RAM3 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM3 = .) ;\n       PROVIDE(__start_bss_RamAHB32 = .) ;\n       *(.bss.$RAM3)\n       *(.bss.$RamAHB32)\n       *(.bss.$RAM3.*)\n       *(.bss.$RamAHB32.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM3 = .) ;\n       PROVIDE(__end_bss_RamAHB32 = .) ;\n    } > RamAHB32 AT> RamAHB32\n\n    /* BSS section for RamAHB16 */\n    .bss_RAM4 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM4 = .) ;\n       PROVIDE(__start_bss_RamAHB16 = .) ;\n       *(.bss.$RAM4)\n       *(.bss.$RamAHB16)\n       *(.bss.$RAM4.*)\n       *(.bss.$RamAHB16.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM4 = .) ;\n       PROVIDE(__end_bss_RamAHB16 = .) ;\n    } > RamAHB16 AT> RamAHB16\n\n    /* BSS section for RamAHB_ETB16 */\n    .bss_RAM5 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM5 = .) ;\n       PROVIDE(__start_bss_RamAHB_ETB16 = .) ;\n       *(.bss.$RAM5)\n       *(.bss.$RamAHB_ETB16)\n       *(.bss.$RAM5.*)\n       *(.bss.$RamAHB_ETB16.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM5 = .) ;\n       PROVIDE(__end_bss_RamAHB_ETB16 = .) ;\n    } > RamAHB_ETB16 AT> RamAHB_ETB16\n\n    /* MAIN BSS SECTION: EDIT change to RamLoc40 */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        PROVIDE(__start_bss_RAM = .) ;\n        PROVIDE(__start_bss_RamLoc32 = .) ;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        PROVIDE(__end_bss_RAM = .) ;\n        PROVIDE(__end_bss_RamLoc32 = .) ;\n/*        PROVIDE(end = .);*/\n    } > RamLoc40 AT> RamLoc40 /* > RamLoc32 AT> RamLoc32 */\n\n    /* hathach add heap section for clang */\n    .heap (NOLOAD): {\n        __heap_start = .;\n        __HeapBase = .;\n        __heap_base = .;\n        __end = .;\n        PROVIDE(end = .);\n        PROVIDE(_end = .);\n        PROVIDE(__end__ = .);\n        KEEP(*(.heap*))\n        __HeapLimit = .;\n        __heap_limit = .;\n        __heap_end = .;\n    } > RamLoc40\n\n    /* NOINIT section for RamLoc40 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM2 = .) ;\n       PROVIDE(__start_noinit_RamLoc40 = .) ;\n       *(.noinit.$RAM2)\n       *(.noinit.$RamLoc40)\n       *(.noinit.$RAM2.*)\n       *(.noinit.$RamLoc40.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM2 = .) ;\n       PROVIDE(__end_noinit_RamLoc40 = .) ;\n    } > RamLoc40 AT> RamLoc40\n\n    /* NOINIT section for RamAHB32 */\n    .noinit_RAM3 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM3 = .) ;\n       PROVIDE(__start_noinit_RamAHB32 = .) ;\n       *(.noinit.$RAM3)\n       *(.noinit.$RamAHB32)\n       *(.noinit.$RAM3.*)\n       *(.noinit.$RamAHB32.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM3 = .) ;\n       PROVIDE(__end_noinit_RamAHB32 = .) ;\n    } > RamAHB32 AT> RamAHB32\n\n    /* NOINIT section for RamAHB16 */\n    .noinit_RAM4 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM4 = .) ;\n       PROVIDE(__start_noinit_RamAHB16 = .) ;\n       *(.noinit.$RAM4)\n       *(.noinit.$RamAHB16)\n       *(.noinit.$RAM4.*)\n       *(.noinit.$RamAHB16.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM4 = .) ;\n       PROVIDE(__end_noinit_RamAHB16 = .) ;\n    } > RamAHB16 AT> RamAHB16\n\n    /* NOINIT section for RamAHB_ETB16 */\n    .noinit_RAM5 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM5 = .) ;\n       PROVIDE(__start_noinit_RamAHB_ETB16 = .) ;\n       *(.noinit.$RAM5)\n       *(.noinit.$RamAHB_ETB16)\n       *(.noinit.$RAM5.*)\n       *(.noinit.$RamAHB_ETB16.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM5 = .) ;\n       PROVIDE(__end_noinit_RamAHB_ETB16 = .) ;\n    } > RamAHB_ETB16 AT> RamAHB_ETB16\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        PROVIDE(__start_noinit_RAM = .) ;\n        PROVIDE(__start_noinit_RamLoc32 = .) ;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n       PROVIDE(__end_noinit_RAM = .) ;\n       PROVIDE(__end_noinit_RamLoc32 = .) ;\n    } > RamLoc32 AT> RamLoc32\n/*    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);*/\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    /* This cause issue with clang linker, so it is disabled */\n    /* MemManage_Handler, BusFault_Handler, UsageFault_Handler may not be defined */\n/*    PROVIDE(__valid_user_code_checksum = 0 -*/\n/*                                         (_vStackTop*/\n/*                                         + (ResetISR + 1)*/\n/*                                         + (NMI_Handler + 1)*/\n/*                                         + (HardFault_Handler + 1)*/\n/*                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)*/\n/*                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)*/\n/*                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1)*/\n/*                                         ) );*/\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}\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/mcb1800/board.cmake",
    "content": "set(MCU_VARIANT LPC1857)\n\nset(JLINK_DEVICE LPC1857)\nset(PYOCD_TARGET LPC1857)\nset(NXPLINK_DEVICE LPC1857:MCB1857)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc1857.ld)\n\nfunction(update_board TARGET)\n  # nothing to do\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/mcb1800/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Keil MCB1800\n   url: https://www.keil.com/arm/mcb1800/\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// PD_10\n#define LED_PORT      6\n#define LED_PIN       24\n\n// P4_0\n#define BUTTON_PORT   2\n#define BUTTON_PIN    0\n\n#define UART_DEV      LPC_USART3\n\nstatic inline void board_lpc18_pinmux(void) {\n  const PINMUX_GRP_T pinmuxing[] = {\n    // ETM Trace\n    #ifdef TRACE_ETM\n    { 0xF, 4, SCU_MODE_FUNC2 | SCU_MODE_HIGHSPEEDSLEW_EN },\n    { 0xF, 5, SCU_MODE_FUNC3 | SCU_MODE_HIGHSPEEDSLEW_EN },\n    { 0xF, 6, SCU_MODE_FUNC3 | SCU_MODE_HIGHSPEEDSLEW_EN },\n    { 0xF, 7, SCU_MODE_FUNC3 | SCU_MODE_HIGHSPEEDSLEW_EN },\n    { 0xF, 8, SCU_MODE_FUNC3 | SCU_MODE_HIGHSPEEDSLEW_EN },\n    #endif\n\n    // LEDs\n    { 0xD, 10, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4) },\n    { 0xD, 11, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4 | SCU_MODE_PULLDOWN) },\n    { 0xD, 12, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4 | SCU_MODE_PULLDOWN) },\n    { 0xD, 13, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4 | SCU_MODE_PULLDOWN) },\n    { 0xD, 14, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC4 | SCU_MODE_PULLDOWN) },\n    { 0x9,  0, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC0 | SCU_MODE_PULLDOWN) },\n    { 0x9,  1, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC0 | SCU_MODE_PULLDOWN) },\n    { 0x9,  2, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC0 | SCU_MODE_PULLDOWN) },\n\n    // Button\n    { 0x4, 0, (SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC0 | SCU_MODE_PULLUP) },\n\n    // UART\n    { 2, 3, SCU_MODE_PULLDOWN | SCU_MODE_FUNC2 },\n    { 2, 4, SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2 },\n\n    // USB0\n    { 0x6, 3, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC1 },\t\t                // P6_3 USB0_PWR_EN, USB0 VBus function\n    { 0x9, 5, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC2 },\t\t\t              // P9_5 USB1_VBUS_EN, USB1 VBus function\n    { 0x2, 5, SCU_MODE_INACT  | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2 }, // P2_5 USB1_VBUS, MUST CONFIGURE THIS SIGNAL FOR USB1 NORMAL OPERATION\n  };\n\n  Chip_SCU_SetPinMuxing(pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));\n\n  /* Pin clock mux values, re-used structure, value in first index is meaningless */\n  const PINMUX_GRP_T pinclockmuxing[] = {\n    { 0, 0,  (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)},\n    { 0, 1,  (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)},\n    { 0, 2,  (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)},\n    { 0, 3,  (SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0)},\n  };\n\n  /* Clock pins only, group field not used */\n  for (uint32_t i = 0; i < (sizeof(pinclockmuxing) / sizeof(pinclockmuxing[0])); i++) {\n    Chip_SCU_ClockPinMuxSet(pinclockmuxing[i].pinnum, pinclockmuxing[i].modefunc);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/mcb1800/board.mk",
    "content": "LD_FILE = $(BOARD_PATH)/lpc1857.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC1857\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/mcb1800/lpc1857.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * (c) Code Red Technologies Ltd, 2008-2013\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC1857\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v10.2.1 [Build 795] [2018-07-25] on May 15, 2019 1:01:52 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlashA512 (rx) : ORIGIN = 0x1a000000, LENGTH = 0x80000 /* 512K bytes (alias Flash) */\n  MFlashB512 (rx) : ORIGIN = 0x1b000000, LENGTH = 0x80000 /* 512K bytes (alias Flash2) */\n  RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */\n  RamLoc40 (rwx) : ORIGIN = 0x10080000, LENGTH = 0xa000 /* 40K bytes (alias RAM2) */\n  RamAHB32 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000 /* 32K bytes (alias RAM3) */\n  RamAHB16 (rwx) : ORIGIN = 0x20008000, LENGTH = 0x4000 /* 16K bytes (alias RAM4) */\n  RamAHB_ETB16 (rwx) : ORIGIN = 0x2000c000, LENGTH = 0x4000 /* 16K bytes (alias RAM5) */\n}\n\n/* Define a symbol for the top of each memory region */\n__base_MFlashA512 = 0x1a000000  ; /* MFlashA512 */\n__base_Flash = 0x1a000000 ; /* Flash */\n__top_MFlashA512 = 0x1a000000 + 0x80000 ; /* 512K bytes */\n__top_Flash = 0x1a000000 + 0x80000 ; /* 512K bytes */\n__base_MFlashB512 = 0x1b000000  ; /* MFlashB512 */\n__base_Flash2 = 0x1b000000 ; /* Flash2 */\n__top_MFlashB512 = 0x1b000000 + 0x80000 ; /* 512K bytes */\n__top_Flash2 = 0x1b000000 + 0x80000 ; /* 512K bytes */\n__base_RamLoc32 = 0x10000000  ; /* RamLoc32 */\n__base_RAM = 0x10000000 ; /* RAM */\n__top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */\n__top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */\n__base_RamLoc40 = 0x10080000  ; /* RamLoc40 */\n__base_RAM2 = 0x10080000 ; /* RAM2 */\n__top_RamLoc40 = 0x10080000 + 0xa000 ; /* 40K bytes */\n__top_RAM2 = 0x10080000 + 0xa000 ; /* 40K bytes */\n__base_RamAHB32 = 0x20000000  ; /* RamAHB32 */\n__base_RAM3 = 0x20000000 ; /* RAM3 */\n__top_RamAHB32 = 0x20000000 + 0x8000 ; /* 32K bytes */\n__top_RAM3 = 0x20000000 + 0x8000 ; /* 32K bytes */\n__base_RamAHB16 = 0x20008000  ; /* RamAHB16 */\n__base_RAM4 = 0x20008000 ; /* RAM4 */\n__top_RamAHB16 = 0x20008000 + 0x4000 ; /* 16K bytes */\n__top_RAM4 = 0x20008000 + 0x4000 ; /* 16K bytes */\n__base_RamAHB_ETB16 = 0x2000c000  ; /* RamAHB_ETB16 */\n__base_RAM5 = 0x2000c000 ; /* RAM5 */\n__top_RamAHB_ETB16 = 0x2000c000 + 0x4000 ; /* 16K bytes */\n__top_RAM5 = 0x2000c000 + 0x4000 ; /* 16K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\n{\n    .text_Flash2 : ALIGN(4)\n    {\n       FILL(0xff)\n        *(.text_Flash2*) /* for compatibility with previous releases */\n        *(.text_MFlashB512*) /* for compatibility with previous releases */\n        *(.text.$Flash2*)\n        *(.text.$MFlashB512*)\n        *(.rodata.$Flash2*)\n        *(.rodata.$MFlashB512*)\n    } > MFlashB512\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlashA512\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlashA512\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    } > MFlashA512\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlashA512\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* DATA section for RamLoc40 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamLoc40)\n        *(.data.$RAM2*)\n        *(.data.$RamLoc40*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > RamLoc40 AT>MFlashA512\n    /* DATA section for RamAHB32 */\n\n    .data_RAM3 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM3 = .) ;\n        *(.ramfunc.$RAM3)\n        *(.ramfunc.$RamAHB32)\n        *(.data.$RAM3*)\n        *(.data.$RamAHB32*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM3 = .) ;\n     } > RamAHB32 AT>MFlashA512\n    /* DATA section for RamAHB16 */\n\n    .data_RAM4 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM4 = .) ;\n        *(.ramfunc.$RAM4)\n        *(.ramfunc.$RamAHB16)\n        *(.data.$RAM4*)\n        *(.data.$RamAHB16*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM4 = .) ;\n     } > RamAHB16 AT>MFlashA512\n    /* DATA section for RamAHB_ETB16 */\n\n    .data_RAM5 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM5 = .) ;\n        *(.ramfunc.$RAM5)\n        *(.ramfunc.$RamAHB_ETB16)\n        *(.data.$RAM5*)\n        *(.data.$RamAHB_ETB16*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM5 = .) ;\n     } > RamAHB_ETB16 AT>MFlashA512\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED : ALIGN(4)\n    {\n        KEEP(*(.bss.$RESERVED*))\n        . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > RamLoc32\n\n    /* Main DATA section (RamLoc32) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > RamLoc32 AT>MFlashA512\n\n    /* BSS section for RamLoc40 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2*)\n       *(.bss.$RamLoc40*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > RamLoc40\n\n    /* BSS section for RamAHB32 */\n    .bss_RAM3 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM3 = .) ;\n       *(.bss.$RAM3*)\n       *(.bss.$RamAHB32*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM3 = .) ;\n    } > RamAHB32\n\n    /* BSS section for RamAHB16 */\n    .bss_RAM4 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM4 = .) ;\n       *(.bss.$RAM4*)\n       *(.bss.$RamAHB16*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM4 = .) ;\n    } > RamAHB16\n\n    /* BSS section for RamAHB_ETB16 */\n    .bss_RAM5 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM5 = .) ;\n       *(.bss.$RAM5*)\n       *(.bss.$RamAHB_ETB16*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM5 = .) ;\n    } > RamAHB_ETB16\n\n    /* MAIN BSS SECTION: EDIT change to RamLoc40 */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        /* PROVIDE(end = .); */\n    } > RamLoc40 /* RamLoc32 */\n\n    /* NOINIT section for RamLoc40 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM2*)\n       *(.noinit.$RamLoc40*)\n       . = ALIGN(4) ;\n    } > RamLoc40\n\n    /* hathach add heap section for clang */\n    .heap (NOLOAD): {\n        __heap_start = .;\n        __HeapBase = .;\n        __heap_base = .;\n        __end = .;\n        PROVIDE(end = .);\n        PROVIDE(_end = .);\n        PROVIDE(__end__ = .);\n        KEEP(*(.heap*))\n        __HeapLimit = .;\n        __heap_limit = .;\n        __heap_end = .;\n    } > RamLoc40\n\n    /* NOINIT section for RamAHB32 */\n    .noinit_RAM3 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM3*)\n       *(.noinit.$RamAHB32*)\n       . = ALIGN(4) ;\n    } > RamAHB32\n\n    /* NOINIT section for RamAHB16 */\n    .noinit_RAM4 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM4*)\n       *(.noinit.$RamAHB16*)\n       . = ALIGN(4) ;\n    } > RamAHB16\n\n    /* NOINIT section for RamAHB_ETB16 */\n    .noinit_RAM5 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM5*)\n       *(.noinit.$RamAHB_ETB16*)\n       . = ALIGN(4) ;\n    } > RamAHB_ETB16\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > RamLoc32\n/*    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);*/\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    /* This cause issue with clang linker, so it is disabled */\n    /* MemManage_Handler, BusFault_Handler, UsageFault_Handler may not be defined */\n/*    PROVIDE(__valid_user_code_checksum = 0 -*/\n/*                                         (_vStackTop*/\n/*                                         + (ResetISR + 1)*/\n/*                                         + (NMI_Handler + 1)*/\n/*                                         + (HardFault_Handler + 1)*/\n/*                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)*/\n/*                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)*/\n/*                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1)*/\n/*                                         ) );*/\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}\n"
  },
  {
    "path": "hw/bsp/lpc18/boards/mcb1800/ozone/lpc1857.jdebug",
    "content": "\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n  Project.AddSvdFile (\"Cortex-M3.svd\");\n  Project.AddSvdFile (\"../../../../../../../cmsis-svd/data/NXP/LPC18xx.svd\");\n\n  Project.SetDevice (\"LPC1857\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"50 MHz\");\n\n  Project.SetTraceSource (\"Trace Pins\");\n  Project.SetTracePortWidth (4);\n\n  //File.Open (\"../../../../../../examples/cmake-build-mcb1800/device/cdc_msc/cdc_msc.elf\");\n  File.Open (\"../../../../../../examples/cmake-build-mcb1800/host/cdc_msc_hid/cdc_msc_hid.elf\");\n}\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n**********************************************************************\n*/\nvoid BeforeTargetConnect (void) {\n  //\n  // Trace pin init is done by J-Link script file as J-Link script files are IDE independent\n  //\n  // Project.SetJLinkScript(\"./NXP_LPC1857JET256_TraceExample.pex\");\n}\n"
  },
  {
    "path": "hw/bsp/lpc18/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"chip.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\nextern void USB0_IRQHandler(void);\nextern void USB1_IRQHandler(void);\nextern void SysTick_Handler(void);\nvoid SystemInit(void);\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid USB1_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n/* System configuration variables used by chip driver */\nconst uint32_t OscRateIn = 12000000;\nconst uint32_t ExtRateIn = 0;\n\n// Invoked by startup code\nvoid SystemInit(void) {\n#ifdef __USE_LPCOPEN\n  extern void (*const g_pfnVectors[])(void);\n  unsigned int *pSCB_VTOR = (unsigned int *) 0xE000ED08;\n  *pSCB_VTOR = (unsigned int) g_pfnVectors;\n#endif\n\n  board_lpc18_pinmux();\n\n#ifdef TRACE_ETM\n  // Trace clock is limited to 60MHz, limit CPU clock to 120MHz\n  Chip_SetupCoreClock(CLKIN_CRYSTAL, 120000000UL, true);\n#else\n  // CPU clock max to 180 Mhz\n  Chip_SetupCoreClock(CLKIN_CRYSTAL, MAX_CLOCK_FREQ, true);\n#endif\n\n}\n\nvoid board_init(void) {\n  SystemCoreClockUpdate();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USB1_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  Chip_GPIO_Init(LPC_GPIO_PORT);\n\n  // LED\n  Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, LED_PORT, LED_PIN);\n\n  // Button\n  Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, BUTTON_PORT, BUTTON_PIN);\n\n  //------------- UART -------------//\n  Chip_UART_Init(UART_DEV);\n  Chip_UART_SetBaud(UART_DEV, CFG_BOARD_UART_BAUDRATE);\n  Chip_UART_ConfigData(UART_DEV, UART_LCR_WLEN8 | UART_LCR_SBS_1BIT | UART_LCR_PARITY_DIS);\n  Chip_UART_TXEnable(UART_DEV);\n\n  //------------- USB -------------//\n  Chip_USB0_Init();\n  Chip_USB1_Init();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  Chip_GPIO_SetPinState(LPC_GPIO_PORT, LED_PORT, LED_PIN, state);\n}\n\nuint32_t board_button_read(void) {\n  // active low\n  return Chip_GPIO_GetPinState(LPC_GPIO_PORT, BUTTON_PORT, BUTTON_PIN) ? 0 : 1;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  return Chip_UART_Read(UART_DEV, buf, len);\n}\n\nint board_uart_write(void const *buf, int len) {\n  uint8_t const *buf8 = (uint8_t const *) buf;\n  for (int i = 0; i < len; i++) {\n    while ((Chip_UART_ReadLineStatus(UART_DEV) & UART_LSR_THRE) == 0) {}\n    Chip_UART_SendByte(UART_DEV, buf8[i]);\n  }\n\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc18/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/nxp/lpcopen/lpc18xx/lpc_chip_18xx)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC18XX CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\n# only need to be built ONCE for all examples\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/../gcc/cr_startup_lpc18xx.c\n    ${SDK_DIR}/src/chip_18xx_43xx.c\n    ${SDK_DIR}/src/clock_18xx_43xx.c\n    ${SDK_DIR}/src/gpio_18xx_43xx.c\n    ${SDK_DIR}/src/sysinit_18xx_43xx.c\n    ${SDK_DIR}/src/uart_18xx_43xx.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __USE_LPCOPEN\n    CORE_M3\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/inc\n    ${SDK_DIR}/inc/config_18xx\n    ${CMSIS_5}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${BOARD_TARGET} PUBLIC -nostdlib)\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\nendfunction()\n\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC18XX)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c\n    ${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c\n    ${TOP}/src/portable/ehci/ehci.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    # family, hw, board\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc18/family.mk",
    "content": "MCU_DIR = hw/mcu/nxp/lpcopen/lpc18xx/lpc_chip_18xx\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m3\n\nCFLAGS += \\\n  -flto \\\n  -nostdlib \\\n  -DCORE_M3 \\\n  -D__USE_LPCOPEN \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC18XX\n\n# mcu driver cause following warnings\nCFLAGS_GCC += -Wno-error=unused-parameter -Wno-error=cast-qual\n\nLDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/chipidea/ci_hs/dcd_ci_hs.c \\\n\tsrc/portable/chipidea/ci_hs/hcd_ci_hs.c \\\n\tsrc/portable/ehci/ehci.c \\\n\t$(MCU_DIR)/../gcc/cr_startup_lpc18xx.c \\\n\t$(MCU_DIR)/src/chip_18xx_43xx.c \\\n\t$(MCU_DIR)/src/clock_18xx_43xx.c \\\n\t$(MCU_DIR)/src/gpio_18xx_43xx.c \\\n\t$(MCU_DIR)/src/sysinit_18xx_43xx.c \\\n\t$(MCU_DIR)/src/uart_18xx_43xx.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(MCU_DIR)/inc \\\n\t$(TOP)/$(MCU_DIR)/inc/config_18xx \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n"
  },
  {
    "path": "hw/bsp/lpc40/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"chip.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       5\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc40/boards/ea4088_quickstart/board.cmake",
    "content": "set(JLINK_DEVICE LPC4088)\nset(PYOCD_TARGET LPC4088)\nset(NXPLINK_DEVICE LPC4088:LPC4088)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc4088.ld)\n\nfunction(update_board TARGET)\n  # nothing to do\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc40/boards/ea4088_quickstart/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Embedded Artists LPC4088 QuickStart Board\n   url: https://www.embeddedartists.com/products/lpc4088-quickstart-board/\n*/\n\n#ifndef EA4088QS__BOARD_H\n#define EA4088QS__BOARD_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_PORT      2\n#define LED_PIN       19\n\n#define BUTTON_PORT   2\n#define BUTTON_PIN    10\n#define BUTTON_ACTIV_STATE 0\n\n/* System oscillator rate and RTC oscillator rate */\nconst uint32_t OscRateIn = 12000000;\nconst uint32_t RTCOscRateIn = 32768;\n\n/* Pin muxing configuration */\nstatic const PINMUX_GRP_T pinmuxing[] = {\n    // LED\n    { 2, 19, (IOCON_FUNC0 | IOCON_MODE_INACT) },\n\n    // Button\n    { 2, 10, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_MODE_PULLUP) },\n\n    // USB1 as Host\n    { 0, 29, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // D+1\n    { 0, 30, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // D-1\n    { 1, 18, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // UP LED1\n    { 1, 19, (IOCON_FUNC2 | IOCON_MODE_INACT) }, // PPWR1\n//  {2, 14, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // VBUS1\n//  {2, 15, (IOCON_FUNC2 | IOCON_MODE_INACT)}, // OVRCR1\n\n    // USB2 as Device\n    { 0, 31, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // D+2\n    { 0, 13, (IOCON_FUNC1 | IOCON_MODE_INACT) }, // UP LED\n    { 0, 14, (IOCON_FUNC3 | IOCON_MODE_INACT) }, // CONNECT2\n\n    /* VBUS is not connected on this board, so leave the pin at default setting. */\n    /*Chip_IOCON_PinMux(LPC_IOCON, 1, 30, IOCON_MODE_INACT, IOCON_FUNC2);*/ /* USB VBUS */\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc40/boards/ea4088_quickstart/board.mk",
    "content": "\nLD_FILE = $(BOARD_PATH)/lpc4088.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC4088\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc40/boards/ea4088_quickstart/lpc4088.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * (c) Code Red Technologies Ltd, 2008-2013\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC4088\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v10.2.1 [Build 795] [2018-07-25] on May 15, 2019 5:16:07 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlash512 (rx) : ORIGIN = 0x0, LENGTH = 0x80000 /* 512K bytes (alias Flash) */\n  RamLoc64 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x10000 /* 64K bytes (alias RAM) */\n  RamPeriph32 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000 /* 32K bytes (alias RAM2) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlash512 = 0x0  ; /* MFlash512 */\n  __base_Flash = 0x0 ; /* Flash */\n  __top_MFlash512 = 0x0 + 0x80000 ; /* 512K bytes */\n  __top_Flash = 0x0 + 0x80000 ; /* 512K bytes */\n  __base_RamLoc64 = 0x10000000  ; /* RamLoc64 */\n  __base_RAM = 0x10000000 ; /* RAM */\n  __top_RamLoc64 = 0x10000000 + 0x10000 ; /* 64K bytes */\n  __top_RAM = 0x10000000 + 0x10000 ; /* 64K bytes */\n  __base_RamPeriph32 = 0x20000000  ; /* RamPeriph32 */\n  __base_RAM2 = 0x20000000 ; /* RAM2 */\n  __top_RamPeriph32 = 0x20000000 + 0x8000 ; /* 32K bytes */\n  __top_RAM2 = 0x20000000 + 0x8000 ; /* 32K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlash512\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlash512\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    } > MFlash512\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlash512\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* DATA section for RamPeriph32 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamPeriph32)\n        *(.data.$RAM2*)\n        *(.data.$RamPeriph32*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > RamPeriph32 AT>MFlash512\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED : ALIGN(4)\n    {\n        KEEP(*(.bss.$RESERVED*))\n        . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > RamLoc64\n\n    /* Main DATA section (RamLoc64) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > RamLoc64 AT>MFlash512\n\n    /* BSS section for RamPeriph32 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2*)\n       *(.bss.$RamPeriph32*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > RamPeriph32\n\n    /* MAIN BSS SECTION */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n/*        PROVIDE(end = .);*/\n    } > RamLoc64\n\n    /* NOINIT section for RamPeriph32 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM2*)\n       *(.noinit.$RamPeriph32*)\n       . = ALIGN(4) ;\n    } > RamPeriph32\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > RamLoc64\n\n    /* hathach add heap section for clang */\n    .heap (NOLOAD): {\n        __heap_start = .;\n        __HeapBase = .;\n        __heap_base = .;\n        __end = .;\n        PROVIDE(end = .);\n        PROVIDE(_end = .);\n        PROVIDE(__end__ = .);\n        KEEP(*(.heap*))\n        __HeapLimit = .;\n        __heap_limit = .;\n        __heap_end = .;\n    } > RamLoc64\n\n/*    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);*/\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc64 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    PROVIDE(__valid_user_code_checksum = 0 -\n                                         (_vStackTop\n                                         + (ResetISR + 1)\n                                         + (NMI_Handler + 1)\n                                         + (HardFault_Handler + 1)\n                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)   /* MemManage_Handler may not be defined */\n                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)     /* BusFault_Handler may not be defined */\n                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1) /* UsageFault_Handler may not be defined */\n                                         ) );\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}\n"
  },
  {
    "path": "hw/bsp/lpc40/boards/ea4088_quickstart/ozone/ea4088_quickstart.jdebug",
    "content": "\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n  Edit.SysVar (VAR_POWER_SAMPLING_SPEED, FREQ_100_KHZ);\n  Project.AddSvdFile (\"$(InstallDir)/Config/CPU/Cortex-M4F.svd\");\n  Project.AddSvdFile (\"../../../../../../../cmsis-svd/data/NXP/LPC408x_7x_v0.7.svd\");\n\n  Project.SetDevice (\"LPC4088\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"50 MHz\");\n  Project.SetTraceSource (\"Trace Pins\");\n  Project.SetTracePortWidth (4);\n\n  // User settings\n  File.Open (\"../../../../../../examples/device/cdc_msc/cmake-build-ea4088-quickstart/cdc_msc.elf\");\n}\n\n/*********************************************************************\n*\n*      TargetReset\n*\n* Function description\n*   Replaces the default target device reset routine. Optional.\n*\n* Notes\n*   This example demonstrates the usage when\n*   debugging a RAM program on a Cortex-M target device\n*\n**********************************************************************\n*/\n//void TargetReset (void) {\n//\n//  unsigned int SP;\n//  unsigned int PC;\n//  unsigned int VectorTableAddr;\n//\n//  Exec.Reset();\n//\n//  VectorTableAddr = Elf.GetBaseAddr();\n//\n//  if (VectorTableAddr != 0xFFFFFFFF) {\n//\n//    Util.Log(\"Resetting Program.\");\n//\n//    SP = Target.ReadU32(VectorTableAddr);\n//    Target.SetReg(\"SP\", SP);\n//\n//    PC = Target.ReadU32(VectorTableAddr + 4);\n//    Target.SetReg(\"PC\", PC);\n//  }\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetReset\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetReset (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetReset\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetReset (void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n\n  if (VectorTableAddr == 0xFFFFFFFF) {\n    Util.Log(\"Project file error: failed to get program base\");\n  } else {\n    SP = Target.ReadU32(VectorTableAddr);\n    Target.SetReg(\"SP\", SP);\n\n    PC = Target.ReadU32(VectorTableAddr + 4);\n    Target.SetReg(\"PC\", PC);\n  }\n}\n\n/*********************************************************************\n*\n*       DebugStart\n*\n* Function description\n*   Replaces the default debug session startup routine. Optional.\n*\n**********************************************************************\n*/\n//void DebugStart (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetConnect\n*\n* Function description\n*   Replaces the default target IF connection routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\nvoid BeforeTargetConnect (void) {\n}\n\n/*********************************************************************\n*\n*       AfterTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetDownload\n*\n* Function description\n*   Replaces the default program download routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*      AfterTargetDownload\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetDownload (void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n\n  if (VectorTableAddr == 0xFFFFFFFF) {\n    Util.Log(\"Project file error: failed to get program base\");\n  } else {\n    SP = Target.ReadU32(VectorTableAddr);\n    Target.SetReg(\"SP\", SP);\n\n    PC = Target.ReadU32(VectorTableAddr + 4);\n    Target.SetReg(\"PC\", PC);\n  }\n}\n\n/*********************************************************************\n*\n*       BeforeTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetHalt\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetHalt (void) {\n//}\n"
  },
  {
    "path": "hw/bsp/lpc40/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"chip.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  #if CFG_TUD_ENABLED\n  tud_int_handler(0);\n  #endif\n\n  #if CFG_TUH_ENABLED\n  tuh_int_handler(0, true);\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n// Invoked by startup code\nvoid SystemInit(void) {\n#ifdef __USE_LPCOPEN\n  extern void (*const g_pfnVectors[])(void);\n  unsigned int *pSCB_VTOR = (unsigned int *) 0xE000ED08;\n  *pSCB_VTOR = (unsigned int) g_pfnVectors;\n\n  #if __FPU_USED == 1\n  fpuInit();\n  #endif\n#endif // __USE_LPCOPEN\n\n  Chip_IOCON_Init(LPC_IOCON);\n  Chip_IOCON_SetPinMuxing(LPC_IOCON, pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));\n\n#ifdef TRACE_ETM\n  const PINMUX_GRP_T trace_pinmux[] = {\n      {2, 2, IOCON_FUNC5 | IOCON_FASTSLEW_EN },\n      {2, 3, IOCON_FUNC5 | IOCON_FASTSLEW_EN },\n      {2, 4, IOCON_FUNC5 | IOCON_FASTSLEW_EN },\n      {2, 5, IOCON_FUNC5 | IOCON_FASTSLEW_EN },\n      {2, 6, IOCON_FUNC5 | IOCON_FASTSLEW_EN },\n  };\n  Chip_IOCON_SetPinMuxing(LPC_IOCON, trace_pinmux, sizeof(trace_pinmux) / sizeof(PINMUX_GRP_T));\n#endif\n\n  /* CPU clock source starts with IRC */\n  /* Enable PBOOST for CPU clock over 100MHz */\n  Chip_SYSCTL_EnableBoost();\n\n  Chip_SetupXtalClocking();\n}\n\nvoid board_init(void) {\n  SystemCoreClockUpdate();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  Chip_GPIO_Init(LPC_GPIO);\n\n  // LED\n  Chip_GPIO_SetPinDIROutput(LPC_GPIO, LED_PORT, LED_PIN);\n\n  // Button\n  Chip_GPIO_SetPinDIRInput(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);\n\n  // UART\n\n  //------------- USB -------------//\n\n  // Port1 as Host, Port2: Device\n  Chip_USB_Init();\n\n  enum {\n    USBCLK_DEVCIE = 0x12, // AHB + Device\n    USBCLK_HOST = 0x19,  // AHB + OTG + Host\n    USBCLK_ALL = 0x1B    // Host + Device + OTG + AHB\n  };\n\n  LPC_USB->OTGClkCtrl = USBCLK_ALL;\n  while ( (LPC_USB->OTGClkSt & USBCLK_ALL) != USBCLK_ALL ) {}\n\n  // set portfunc: USB1 = host, USB2 = device\n  LPC_USB->StCtrl = 0x3;\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  Chip_GPIO_SetPinState(LPC_GPIO, LED_PORT, LED_PIN, state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_ACTIV_STATE == Chip_GPIO_GetPinState(LPC_GPIO, BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  //return UART_ReceiveByte(BOARD_UART_PORT);\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  //UART_Send(BOARD_UART_PORT, &c, 1, BLOCKING);\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc40/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/nxp/lpcopen/lpc40xx/lpc_chip_40xx)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC40XX CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\n# only need to be built ONCE for all examples\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/../gcc/cr_startup_lpc40xx.c\n    ${SDK_DIR}/src/chip_17xx_40xx.c\n    ${SDK_DIR}/src/clock_17xx_40xx.c\n    ${SDK_DIR}/src/fpu_init.c\n    ${SDK_DIR}/src/gpio_17xx_40xx.c\n    ${SDK_DIR}/src/iocon_17xx_40xx.c\n    ${SDK_DIR}/src/sysctl_17xx_40xx.c\n    ${SDK_DIR}/src/sysinit_17xx_40xx.c\n    ${SDK_DIR}/src/uart_17xx_40xx.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __USE_LPCOPEN\n    CORE_M4\n    CFG_TUSB_MEM_SECTION=__attribute__\\(\\(section\\(\\\".data.$RAM2\\\"\\)\\)\\)\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/inc\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${BOARD_TARGET} PUBLIC -nostdlib)\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${BOARD_TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\nendfunction()\n\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC40XX)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nxp/lpc17_40/dcd_lpc17_40.c\n    ${TOP}/src/portable/ohci/ohci.c\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n\n  target_include_directories(${TARGET} PUBLIC\n    # family, hw, board\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc40/family.mk",
    "content": "MCU_DIR = hw/mcu/nxp/lpcopen/lpc40xx/lpc_chip_40xx\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nCFLAGS += \\\n  -flto \\\n  -nostdlib \\\n  -DCORE_M4 \\\n  -D__USE_LPCOPEN \\\n  -DCFG_TUSB_MEM_SECTION='__attribute__((section(\".data.$$RAM2\")))' \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC40XX\n\n# mcu driver cause following warnings\nCFLAGS_GCC += -Wno-error=strict-prototypes -Wno-error=unused-parameter -Wno-error=cast-qual\n\nLDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs\n\n# All source paths should be relative to the top level.\nSRC_C += \\\n\tsrc/portable/nxp/lpc17_40/dcd_lpc17_40.c \\\n\tsrc/portable/ohci/ohci.c \\\n\t$(MCU_DIR)/../gcc/cr_startup_lpc40xx.c \\\n\t$(MCU_DIR)/src/chip_17xx_40xx.c \\\n\t$(MCU_DIR)/src/clock_17xx_40xx.c \\\n\t$(MCU_DIR)/src/fpu_init.c \\\n\t$(MCU_DIR)/src/gpio_17xx_40xx.c \\\n\t$(MCU_DIR)/src/iocon_17xx_40xx.c \\\n\t$(MCU_DIR)/src/sysctl_17xx_40xx.c \\\n\t$(MCU_DIR)/src/sysinit_17xx_40xx.c \\\n\t$(MCU_DIR)/src/uart_17xx_40xx.c \\\n\nINC += \\\n\t$(TOP)/$(MCU_DIR)/inc \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(BOARD_PATH)\n"
  },
  {
    "path": "hw/bsp/lpc43/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"chip.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/ea4357/board.cmake",
    "content": "set(MCU_VARIANT LPC4357)\n\nset(JLINK_DEVICE LPC4357_M4)\nset(PYOCD_TARGET LPC4357)\nset(NXPLINK_DEVICE LPC4357:LPC4357)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc4357.ld)\n\nfunction(update_board TARGET)\n  # EA4357 use I2C GPIO expander for LED\n  target_sources(${TARGET} PRIVATE\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/pca9532.c\n    ${SDK_DIR}/src/i2c_18xx_43xx.c\n    ${SDK_DIR}/src/i2cm_18xx_43xx.c\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/ea4357/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Embedded Artists LPC4357 Development Kit\n   url: https://www.embeddedartists.com/products/lpc4357-developers-kit/\n*/\n\n#ifndef _BOARD_EA4357_H\n#define _BOARD_EA4357_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"pca9532.h\"\n\n// P9_1 joystick down\n#define BUTTON_PORT     4\n#define BUTTON_PIN      13\n#define BUTTON_STATE_ACTIVE   0\n\n#define UART_DEV        LPC_USART0\n#define UART_PORT       0x0f\n#define UART_PIN_TX     10\n#define UART_PIN_RX     11\n\n//static const struct {\n//  uint8_t mux_port;\n//  uint8_t mux_pin;\n//\n//  uint8_t gpio_port;\n//  uint8_t gpio_pin;\n//}buttons[] =\n//{\n//    {0x0a, 3, 4, 10 }, // Joystick up\n//    {0x09, 1, 4, 13 }, // Joystick down\n//    {0x0a, 2, 4, 9  }, // Joystick left\n//    {0x09, 0, 4, 12 }, // Joystick right\n//    {0x0a, 1, 4, 8  }, // Joystick press\n//    {0x02, 7, 0, 7  }, // SW6\n//};\n\nstatic const PINMUX_GRP_T pinmuxing[] = {\n    // Button ( Joystick down )\n    { 0x9, 1, SCU_MODE_INBUFF_EN | SCU_MODE_INACT | SCU_MODE_FUNC0 | SCU_MODE_PULLUP },\n\n    // UART\n    { UART_PORT, UART_PIN_TX, SCU_MODE_PULLDOWN | SCU_MODE_FUNC1 },\n    { UART_PORT, UART_PIN_RX, SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC1 },\n\n    // USB\n};\n\n/* Pin clock mux values, re-used structure, value in first index is meaningless */\n//static const PINMUX_GRP_T pinclockmuxing[] = {\n//    { 0, 0, SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0 },\n//    { 0, 1, SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0 },\n//    { 0, 2, SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0 },\n//    { 0, 3, SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_HIGHSPEEDSLEW_EN | SCU_MODE_FUNC0 },\n//};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/ea4357/board.mk",
    "content": "# EA4357 use I2C GPIO expander for LED\nSRC_C += \\\n  ${BOARD_PATH}/pca9532.c \\\n\t${SDK_DIR}/src/i2c_18xx_43xx.c \\\n\t${SDK_DIR}/src/i2cm_18xx_43xx.c \\\n\nLD_FILE = ${BOARD_PATH}/lpc4357.ld\n\nJLINK_DEVICE = LPC4357_M4\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/ea4357/lpc4357.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * (c) Code Red Technologies Ltd, 2008-2013\n * (c) NXP Semiconductors 2013-2019\n * Generated linker script file for LPC4357\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.23\n * MCUXpresso IDE v10.2.1 [Build 795] [2018-07-25] on May 15, 2019 5:48:43 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlashA512 (rx) : ORIGIN = 0x1a000000, LENGTH = 0x80000 /* 512K bytes (alias Flash) */\n  MFlashB512 (rx) : ORIGIN = 0x1b000000, LENGTH = 0x80000 /* 512K bytes (alias Flash2) */\n  RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */\n  RamLoc40 (rwx) : ORIGIN = 0x10080000, LENGTH = 0xa000 /* 40K bytes (alias RAM2) */\n  RamAHB32 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000 /* 32K bytes (alias RAM3) */\n  RamAHB16 (rwx) : ORIGIN = 0x20008000, LENGTH = 0x4000 /* 16K bytes (alias RAM4) */\n  RamAHB_ETB16 (rwx) : ORIGIN = 0x2000c000, LENGTH = 0x4000 /* 16K bytes (alias RAM5) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlashA512 = 0x1a000000  ; /* MFlashA512 */\n  __base_Flash = 0x1a000000 ; /* Flash */\n  __top_MFlashA512 = 0x1a000000 + 0x80000 ; /* 512K bytes */\n  __top_Flash = 0x1a000000 + 0x80000 ; /* 512K bytes */\n  __base_MFlashB512 = 0x1b000000  ; /* MFlashB512 */\n  __base_Flash2 = 0x1b000000 ; /* Flash2 */\n  __top_MFlashB512 = 0x1b000000 + 0x80000 ; /* 512K bytes */\n  __top_Flash2 = 0x1b000000 + 0x80000 ; /* 512K bytes */\n  __base_RamLoc32 = 0x10000000  ; /* RamLoc32 */\n  __base_RAM = 0x10000000 ; /* RAM */\n  __top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __base_RamLoc40 = 0x10080000  ; /* RamLoc40 */\n  __base_RAM2 = 0x10080000 ; /* RAM2 */\n  __top_RamLoc40 = 0x10080000 + 0xa000 ; /* 40K bytes */\n  __top_RAM2 = 0x10080000 + 0xa000 ; /* 40K bytes */\n  __base_RamAHB32 = 0x20000000  ; /* RamAHB32 */\n  __base_RAM3 = 0x20000000 ; /* RAM3 */\n  __top_RamAHB32 = 0x20000000 + 0x8000 ; /* 32K bytes */\n  __top_RAM3 = 0x20000000 + 0x8000 ; /* 32K bytes */\n  __base_RamAHB16 = 0x20008000  ; /* RamAHB16 */\n  __base_RAM4 = 0x20008000 ; /* RAM4 */\n  __top_RamAHB16 = 0x20008000 + 0x4000 ; /* 16K bytes */\n  __top_RAM4 = 0x20008000 + 0x4000 ; /* 16K bytes */\n  __base_RamAHB_ETB16 = 0x2000c000  ; /* RamAHB_ETB16 */\n  __base_RAM5 = 0x2000c000 ; /* RAM5 */\n  __top_RamAHB_ETB16 = 0x2000c000 + 0x4000 ; /* 16K bytes */\n  __top_RAM5 = 0x2000c000 + 0x4000 ; /* 16K bytes */\n\n\nENTRY(ResetISR)\n\nSECTIONS\n{\n    .text_Flash2 : ALIGN(4)\n    {\n       FILL(0xff)\n        *(.text_Flash2*) /* for compatibility with previous releases */\n        *(.text_MFlashB512*) /* for compatibility with previous releases */\n        *(.text.$Flash2*)\n        *(.text.$MFlashB512*)\n        *(.rodata.$Flash2*)\n        *(.rodata.$MFlashB512*)\n    } > MFlashB512\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n    } > MFlashA512\n\n    .text : ALIGN(4)\n    {\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlashA512\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    } > MFlashA512\n\n    __exidx_start = .;\n\n    .ARM.exidx : ALIGN(4)\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > MFlashA512\n    __exidx_end = .;\n\n    _etext = .;\n\n    /* DATA section for RamLoc40 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamLoc40)\n        *(.data.$RAM2*)\n        *(.data.$RamLoc40*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n     } > RamLoc40 AT>MFlashA512\n    /* DATA section for RamAHB32 */\n\n    .data_RAM3 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM3 = .) ;\n        *(.ramfunc.$RAM3)\n        *(.ramfunc.$RamAHB32)\n        *(.data.$RAM3*)\n        *(.data.$RamAHB32*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM3 = .) ;\n     } > RamAHB32 AT>MFlashA512\n    /* DATA section for RamAHB16 */\n\n    .data_RAM4 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM4 = .) ;\n        *(.ramfunc.$RAM4)\n        *(.ramfunc.$RamAHB16)\n        *(.data.$RAM4*)\n        *(.data.$RamAHB16*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM4 = .) ;\n     } > RamAHB16 AT>MFlashA512\n    /* DATA section for RamAHB_ETB16 */\n\n    .data_RAM5 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM5 = .) ;\n        *(.ramfunc.$RAM5)\n        *(.ramfunc.$RamAHB_ETB16)\n        *(.data.$RAM5*)\n        *(.data.$RamAHB_ETB16*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM5 = .) ;\n     } > RamAHB_ETB16 AT>MFlashA512\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED : ALIGN(4)\n    {\n        KEEP(*(.bss.$RESERVED*))\n        . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > RamLoc32\n\n    /* Main DATA section (RamLoc32) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       *(vtable)\n       *(.ramfunc*)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n    } > RamLoc32 AT>MFlashA512\n\n    /* BSS section for RamLoc40 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       *(.bss.$RAM2*)\n       *(.bss.$RamLoc40*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n    } > RamLoc40\n\n    /* BSS section for RamAHB32 */\n    .bss_RAM3 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM3 = .) ;\n       *(.bss.$RAM3*)\n       *(.bss.$RamAHB32*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM3 = .) ;\n    } > RamAHB32\n\n    /* BSS section for RamAHB16 */\n    .bss_RAM4 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM4 = .) ;\n       *(.bss.$RAM4*)\n       *(.bss.$RamAHB16*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM4 = .) ;\n    } > RamAHB16\n\n    /* BSS section for RamAHB_ETB16 */\n    .bss_RAM5 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM5 = .) ;\n       *(.bss.$RAM5*)\n       *(.bss.$RamAHB_ETB16*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM5 = .) ;\n    } > RamAHB_ETB16\n\n    /* MAIN BSS SECTION: EDIT change to RamLoc40 */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        /* PROVIDE(end = .); */\n    } > RamLoc40 /* RamLoc32 */\n\n    /* NOINIT section for RamLoc40 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM2*)\n       *(.noinit.$RamLoc40*)\n       . = ALIGN(4) ;\n    } > RamLoc40\n\n    /* hathach add heap section for clang */\n    .heap (NOLOAD): {\n        __heap_start = .;\n        __HeapBase = .;\n        __heap_base = .;\n        __end = .;\n        PROVIDE(end = .);\n        PROVIDE(_end = .);\n        PROVIDE(__end__ = .);\n        KEEP(*(.heap*))\n        __HeapLimit = .;\n        __heap_limit = .;\n        __heap_end = .;\n    } > RamLoc40\n\n    /* NOINIT section for RamAHB32 */\n    .noinit_RAM3 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM3*)\n       *(.noinit.$RamAHB32*)\n       . = ALIGN(4) ;\n    } > RamAHB32\n\n    /* NOINIT section for RamAHB16 */\n    .noinit_RAM4 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM4*)\n       *(.noinit.$RamAHB16*)\n       . = ALIGN(4) ;\n    } > RamAHB16\n\n    /* NOINIT section for RamAHB_ETB16 */\n    .noinit_RAM5 (NOLOAD) : ALIGN(4)\n    {\n       *(.noinit.$RAM5*)\n       *(.noinit.$RamAHB_ETB16*)\n       . = ALIGN(4) ;\n    } > RamAHB_ETB16\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n    } > RamLoc32\n/*    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);*/\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    /* This cause issue with clang linker, so it is disabled */\n    /* MemManage_Handler, BusFault_Handler, UsageFault_Hander may not be defined */\n/*    PROVIDE(__valid_user_code_checksum = 0 -*/\n/*                                         (_vStackTop*/\n/*                                         + (ResetISR + 1)*/\n/*                                         + (NMI_Handler + 1)*/\n/*                                         + (HardFault_Handler + 1)*/\n/*                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)*/\n/*                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)*/\n/*                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1)*/\n/*                                         ) );*/\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}\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/ea4357/pca9532.c",
    "content": "/*****************************************************************************\n *\n *   Copyright(C) 2011, Embedded Artists AB\n *   All rights reserved.\n *\n ******************************************************************************\n * Software that is described herein is for illustrative purposes only\n * which provides customers with programming information regarding the\n * products. This software is supplied \"AS IS\" without any warranties.\n * Embedded Artists AB assumes no responsibility or liability for the\n * use of the software, conveys no license or title under any patent,\n * copyright, or mask work right to the product. Embedded Artists AB\n * reserves the right to make changes in the software without\n * notification. Embedded Artists AB also make no representation or\n * warranty that such application will be suitable for the specified\n * use without further testing or modification.\n *****************************************************************************/\n\n/*\n * NOTE: I2C must have been initialized before calling any functions in this\n * file.\n */\n\n/******************************************************************************\n * Includes\n *****************************************************************************/\n\n//#include \"board.h\"\n#include \"chip.h\"\n\n#include \"pca9532.h\"\n\n/******************************************************************************\n * Defines and typedefs\n *****************************************************************************/\n\n#define I2C_PORT (LPC_I2C0)\n\n#define LS_MODE_ON     0x01\n#define LS_MODE_BLINK0 0x02\n#define LS_MODE_BLINK1 0x03\n\n/******************************************************************************\n * External global variables\n *****************************************************************************/\n\n\n/******************************************************************************\n * Local variables\n *****************************************************************************/\n\nstatic uint16_t blink0Shadow = 0;\nstatic uint16_t blink1Shadow = 0;\nstatic uint16_t ledStateShadow = 0;\n\n/******************************************************************************\n * Local Functions\n *****************************************************************************/\n\nstatic Status I2CWrite(uint32_t addr, uint8_t* buf, uint32_t len)\n{\n\tI2CM_XFER_T i2cData;\n\n\ti2cData.slaveAddr = addr;\n\ti2cData.options = 0;\n\ti2cData.status = 0;\n\ti2cData.txBuff = buf;\n\ti2cData.txSz = len;\n\ti2cData.rxBuff = NULL;\n\ti2cData.rxSz = 0;\n\n\tif (Chip_I2CM_XferBlocking(LPC_I2C0, &i2cData) == 0) {\n\t\treturn ERROR;\n\t}\n\treturn SUCCESS;\n}\n\nstatic Status I2CRead(uint32_t addr, uint8_t* buf, uint32_t len)\n{\n\tI2CM_XFER_T i2cData;\n\n\ti2cData.slaveAddr = addr;\n\ti2cData.options = 0;\n\ti2cData.status = 0;\n\ti2cData.txBuff = NULL;\n\ti2cData.txSz = 0;\n\ti2cData.rxBuff = buf;\n\ti2cData.rxSz = len;\n\n\tif (Chip_I2CM_XferBlocking(LPC_I2C0, &i2cData) == 0) {\n\t\treturn ERROR;\n\t}\n\treturn SUCCESS;\n}\n\nstatic void setLsStates(uint16_t states, uint8_t* ls, uint8_t mode)\n{\n#define IS_LED_SET(bit, x) ( ( ((x) & (bit)) != 0 ) ? 1 : 0 )\n\n    int i = 0;\n\n    for (i = 0; i < 4; i++) {\n\n        ls[i] |= ( (IS_LED_SET(0x0001, states)*mode << 0)\n                | (IS_LED_SET(0x0002, states)*mode << 2)\n                | (IS_LED_SET(0x0004, states)*mode << 4)\n                | (IS_LED_SET(0x0008, states)*mode << 6) );\n\n        states >>= 4;\n    }\n}\n\nstatic void setLeds(void)\n{\n    uint8_t buf[5];\n    uint8_t ls[4] = {0,0,0,0};\n    uint16_t states = ledStateShadow;\n\n    /* LEDs in On/Off state */\n    setLsStates(states, ls, LS_MODE_ON);\n\n    /* set the LEDs that should blink */\n    setLsStates(blink0Shadow, ls, LS_MODE_BLINK0);\n    setLsStates(blink1Shadow, ls, LS_MODE_BLINK1);\n\n\n    buf[0] = PCA9532_LS0 | PCA9532_AUTO_INC;\n    buf[1] = ls[0];\n    buf[2] = ls[1];\n    buf[3] = ls[2];\n    buf[4] = ls[3];\n    I2CWrite(PCA9532_I2C_ADDR, buf, 5);\n}\n\n/******************************************************************************\n * Public Functions\n *****************************************************************************/\n\n/******************************************************************************\n *\n * Description:\n *    Initialize the PCA9532 Device\n *\n *****************************************************************************/\nvoid pca9532_init (void)\n{\n    /* nothing to initialize */\n}\n\n/******************************************************************************\n *\n * Description:\n *    Get the LED states\n *\n * Params:\n *    [in]  shadow  - TRUE if the states should be retrieved from the shadow\n *                    variables. The shadow variable are updated when any\n *                    of setLeds, setBlink0Leds and/or setBlink1Leds are\n *                    called.\n *\n *                    FALSE if the state should be retrieved from the PCA9532\n *                    device. A blinkin LED may be reported as on or off\n *                    depending on the state when calling the function.\n *\n * Returns:\n *      A mask where a 1 indicates that a LED is on (or blinking).\n *\n *****************************************************************************/\nuint16_t pca9532_getLedState (uint32_t shadow)\n{\n    uint8_t buf[2];\n    uint16_t ret = 0;\n\n    if (shadow) {\n        /* a blink LED is reported as on*/\n        ret = (ledStateShadow | blink0Shadow | blink1Shadow);\n    }\n    else {\n\n        /*\n         * A blinking LED may be reported as on or off depending on\n         * its state when reading the Input register.\n         */\n\n        buf[0] = PCA9532_INPUT0;\n        I2CWrite(PCA9532_I2C_ADDR, buf, 1);\n\n        I2CRead(PCA9532_I2C_ADDR, buf, 1);\n        ret = buf[0];\n\n\n        buf[0] = PCA9532_INPUT1;\n        I2CWrite(PCA9532_I2C_ADDR, buf, 1);\n\n        I2CRead(PCA9532_I2C_ADDR, buf, 1);\n        ret |= (buf[0] << 8);\n\n\n        /* invert since LEDs are active low */\n        ret = ((~ret) & 0xFFFF);\n    }\n\n    return (ret & ~PCA9532_NOT_USED);\n}\n\n\n/******************************************************************************\n *\n * Description:\n *    Set LED states (on or off).\n *\n * Params:\n *    [in]  ledOnMask  - The LEDs that should be turned on. This mask has\n *                       priority over ledOffMask\n *    [in]  ledOffMask - The LEDs that should be turned off.\n *\n *****************************************************************************/\nvoid pca9532_setLeds (uint16_t ledOnMask, uint16_t ledOffMask)\n{\n    /* turn off leds */\n    ledStateShadow &= (~(ledOffMask) & 0xffff);\n\n    /* ledOnMask has priority over ledOffMask */\n    ledStateShadow |= ledOnMask;\n\n    /* turn off blinking */\n    blink0Shadow &= (~(ledOffMask) & 0xffff);\n    blink1Shadow &= (~(ledOffMask) & 0xffff);\n\n    setLeds();\n}\n\n/******************************************************************************\n *\n * Description:\n *    Set the blink period for PWM0. Valid values are 0 - 255 where 0\n *    means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz.\n *\n * Params:\n *    [in]  period  - the period for pwm0\n *\n *****************************************************************************/\nvoid pca9532_setBlink0Period(uint8_t period)\n{\n    uint8_t buf[2];\n\n    buf[0] = PCA9532_PSC0;\n    buf[1] = period;\n    I2CWrite(PCA9532_I2C_ADDR, buf, 2);\n}\n\n/******************************************************************************\n *\n * Description:\n *    Set the duty cycle for PWM0. Valid values are 0 - 100. 25 means the LED\n *    is on 25% of the period.\n *\n * Params:\n *    [in]  duty  - duty cycle\n *\n *****************************************************************************/\nvoid pca9532_setBlink0Duty(uint8_t duty)\n{\n    uint8_t buf[2];\n    uint32_t tmp = duty;\n    if (tmp > 100) {\n        tmp = 100;\n    }\n\n    tmp = (256 * tmp)/100;\n\n    buf[0] = PCA9532_PWM0;\n    buf[1] = tmp;\n    I2CWrite(PCA9532_I2C_ADDR, buf, 2);\n}\n\n/******************************************************************************\n *\n * Description:\n *    Set the LEDs that should blink with rate and duty cycle from PWM0.\n *    Blinking is turned off with pca9532_setLeds.\n *\n * Params:\n *    [in]  ledMask  - LEDs that should blink.\n *\n *****************************************************************************/\nvoid pca9532_setBlink0Leds(uint16_t ledMask)\n{\n    blink0Shadow |= ledMask;\n    setLeds();\n}\n\n/******************************************************************************\n *\n * Description:\n *    Set the blink period for PWM1. Valid values are 0 - 255 where 0\n *    means 152 Hz and 255 means 0.59 Hz. A value of 151 means 1 Hz.\n *\n * Params:\n *    [in]  period  - The period for PWM1\n *\n *****************************************************************************/\nvoid pca9532_setBlink1Period(uint8_t period)\n{\n    uint8_t buf[2];\n\n    buf[0] = PCA9532_PSC1;\n    buf[1] = period;\n    I2CWrite(PCA9532_I2C_ADDR, buf, 2);\n}\n\n/******************************************************************************\n *\n * Description:\n *    Set the duty cycle for PWM1. Valid values are 0 - 100. 25 means the LED\n *    is on 25% of the period.\n *\n * Params:\n *    [in]  duty  - duty cycle.\n *\n *****************************************************************************/\nvoid pca9532_setBlink1Duty(uint8_t duty)\n{\n    uint8_t buf[2];\n\n    uint32_t tmp = duty;\n    if (tmp > 100) {\n        tmp = 100;\n    }\n\n    tmp = (256 * tmp)/100;\n\n    buf[0] = PCA9532_PWM1;\n    buf[1] = tmp;\n    I2CWrite(PCA9532_I2C_ADDR, buf, 2);\n}\n\n/******************************************************************************\n *\n * Description:\n *    Set the LEDs that should blink with rate and duty cycle from PWM1.\n *    Blinking is turned off with pca9532_setLeds.\n *\n * Params:\n *    [in]  ledMask  - LEDs that should blink.\n *\n *****************************************************************************/\nvoid pca9532_setBlink1Leds(uint16_t ledMask)\n{\n    blink1Shadow |= ledMask;\n    setLeds();\n}\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/ea4357/pca9532.h",
    "content": "/*****************************************************************************\n *\n *   Copyright(C) 2011, Embedded Artists AB\n *   All rights reserved.\n *\n ******************************************************************************\n * Software that is described herein is for illustrative purposes only\n * which provides customers with programming information regarding the\n * products. This software is supplied \"AS IS\" without any warranties.\n * Embedded Artists AB assumes no responsibility or liability for the\n * use of the software, conveys no license or title under any patent,\n * copyright, or mask work right to the product. Embedded Artists AB\n * reserves the right to make changes in the software without\n * notification. Embedded Artists AB also make no representation or\n * warranty that such application will be suitable for the specified\n * use without further testing or modification.\n *****************************************************************************/\n#ifndef __PCA9532C_H\n#define __PCA9532C_H\n\n\n#define PCA9532_I2C_ADDR    (0xC0>>1)\n\n#define PCA9532_INPUT0 0x00\n#define PCA9532_INPUT1 0x01\n#define PCA9532_PSC0   0x02\n#define PCA9532_PWM0   0x03\n#define PCA9532_PSC1   0x04\n#define PCA9532_PWM1   0x05\n#define PCA9532_LS0    0x06\n#define PCA9532_LS1    0x07\n#define PCA9532_LS2    0x08\n#define PCA9532_LS3    0x09\n\n#define PCA9532_AUTO_INC 0x10\n\n\n/*\n * The Keys on the base board are mapped to LED0 -> LED3 on\n * the PCA9532.\n */\n\n#define KEY1 0x0001\n#define KEY2 0x0002\n#define KEY3 0x0004\n#define KEY4 0x0008\n\n#define KEY_MASK 0x000F\n\n/*\n * MMC Card Detect and MMC Write Protect are mapped to LED4\n * and LED5 on the PCA9532. Please note that WP is active low.\n */\n\n#define MMC_CD 0x0010\n#define MMC_WP 0x0020\n\n#define MMC_MASK  0x30\n\n/* NOTE: LED6 and LED7 on PCA9532 are not connected to anything */\n#define PCA9532_NOT_USED 0xC0\n\n/*\n * Below are the LED constants to use when enabling/disabling a LED.\n * The LED names are the names printed on the base board and not\n * the names from the PCA9532 device. base_LED1 -> LED8 on PCA9532,\n * base_LED2 -> LED9, and so on.\n */\n\n#define LED1 0x0100\n#define LED2 0x0200\n#define LED3 0x0400\n#define LED4 0x0800\n#define LED5 0x1000\n#define LED6 0x2000\n#define LED7 0x4000\n#define LED8 0x8000\n\n#define LED_MASK 0xFF00\n\nvoid pca9532_init (void);\nuint16_t pca9532_getLedState (uint32_t shadow);\nvoid pca9532_setLeds (uint16_t ledOnMask, uint16_t ledOffMask);\nvoid pca9532_setBlink0Period(uint8_t period);\nvoid pca9532_setBlink0Duty(uint8_t duty);\nvoid pca9532_setBlink0Leds(uint16_t ledMask);\nvoid pca9532_setBlink1Period(uint8_t period);\nvoid pca9532_setBlink1Duty(uint8_t duty);\nvoid pca9532_setBlink1Leds(uint16_t ledMask);\n\n#endif /* end __PCA9532C_H */\n/****************************************************************************\n**                            End Of File\n*****************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/lpcxpresso43s67/board.cmake",
    "content": "set(MCU_VARIANT LPC43S67_M4)\n\nset(JLINK_DEVICE LPC43S67_M4)\nset(PYOCD_TARGET LPC43S67)\nset(NXPLINK_DEVICE LPC43S67:LPCXPRESSO43S67)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/lpc4367.ld)\n\nfunction(update_board TARGET)\n  # nothing to do\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/lpcxpresso43s67/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso43S67\n   url: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso43s67-development-board:OM13084\n*/\n\n#ifndef _BOARD_LPCXPRESSO43S67_H_\n#define _BOARD_LPCXPRESSO43S67_H_\n\n// Note: For USB Host demo, install JP4\n// WARNING: don't install JP4 when running as device\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED Red\n#define LED_PORT      3\n#define LED_PIN       7\n#define LED_STATE_ON  0\n\n// ISP Button (SW2)\n#define BUTTON_PORT   0\n#define BUTTON_PIN    7\n#define BUTTON_STATE_ACTIVE   0\n\n#define UART_DEV      LPC_USART0\n\nstatic const PINMUX_GRP_T pinmuxing[] = {\n    // LEDs P6_11 as GPIO3[7]\n    { 0x6, 11, SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC0 },\n\n    // Button P2_7 as GPIO0[7]\n    { 0x2, 7, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC0 },\n\n    // UART\n    { 0x06, 4, SCU_MODE_PULLDOWN | SCU_MODE_FUNC2 },\n    { 0x02, 1, SCU_MODE_INACT | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC1 },\n\n    // USB0\n    //{ 0x6, 3, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC1 },\t\t                // P6_3 USB0_PWR_EN, USB0 VBus function\n\n    // USB 1\n    //{ 0x9, 5, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC2 },\t\t\t              // P9_5 USB1_VBUS_EN, USB1 VBus function\n    //{ 0x2, 5, SCU_MODE_INACT  | SCU_MODE_INBUFF_EN | SCU_MODE_ZIF_DIS | SCU_MODE_FUNC2 }, // P2_5 USB1_VBUS, MUST CONFIGURE THIS SIGNAL FOR USB1 NORMAL OPERATION\n    {0x2, 5, SCU_MODE_INBUFF_EN | SCU_MODE_PULLUP | SCU_MODE_FUNC4 },\n};\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/lpcxpresso43s67/board.mk",
    "content": "LD_FILE = $(BOARD_PATH)/lpc4367.ld\n\n# For flash-jlink target\nJLINK_DEVICE = LPC43S67_M4\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc43/boards/lpcxpresso43s67/lpc4367.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * Copyright (c) 2008-2013 Code Red Technologies Ltd,\n * Copyright 2015, 2018-2019 NXP\n * (c) NXP Semiconductors 2013-2023\n * Generated linker script file for LPC4337\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.30\n * MCUXpresso IDE v11.7.1 [Build 9221] [2023-03-28] on Aug 14, 2023, 3:36:29 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  MFlashA512 (rx) : ORIGIN = 0x1a000000, LENGTH = 0x80000 /* 512K bytes (alias Flash) */\n  MFlashB512 (rx) : ORIGIN = 0x1b000000, LENGTH = 0x80000 /* 512K bytes (alias Flash2) */\n  RamLoc32 (rwx) : ORIGIN = 0x10000000, LENGTH = 0x8000 /* 32K bytes (alias RAM) */\n  RamLoc40 (rwx) : ORIGIN = 0x10080000, LENGTH = 0xa000 /* 40K bytes (alias RAM2) */\n  RamAHB32 (rwx) : ORIGIN = 0x20000000, LENGTH = 0x8000 /* 32K bytes (alias RAM3) */\n  RamAHB16 (rwx) : ORIGIN = 0x20008000, LENGTH = 0x4000 /* 16K bytes (alias RAM4) */\n  RamAHB_ETB16 (rwx) : ORIGIN = 0x2000c000, LENGTH = 0x4000 /* 16K bytes (alias RAM5) */\n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_MFlashA512 = 0x1a000000  ; /* MFlashA512 */\n  __base_Flash = 0x1a000000 ; /* Flash */\n  __top_MFlashA512 = 0x1a000000 + 0x80000 ; /* 512K bytes */\n  __top_Flash = 0x1a000000 + 0x80000 ; /* 512K bytes */\n  __base_MFlashB512 = 0x1b000000  ; /* MFlashB512 */\n  __base_Flash2 = 0x1b000000 ; /* Flash2 */\n  __top_MFlashB512 = 0x1b000000 + 0x80000 ; /* 512K bytes */\n  __top_Flash2 = 0x1b000000 + 0x80000 ; /* 512K bytes */\n  __base_RamLoc32 = 0x10000000  ; /* RamLoc32 */\n  __base_RAM = 0x10000000 ; /* RAM */\n  __top_RamLoc32 = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __top_RAM = 0x10000000 + 0x8000 ; /* 32K bytes */\n  __base_RamLoc40 = 0x10080000  ; /* RamLoc40 */\n  __base_RAM2 = 0x10080000 ; /* RAM2 */\n  __top_RamLoc40 = 0x10080000 + 0xa000 ; /* 40K bytes */\n  __top_RAM2 = 0x10080000 + 0xa000 ; /* 40K bytes */\n  __base_RamAHB32 = 0x20000000  ; /* RamAHB32 */\n  __base_RAM3 = 0x20000000 ; /* RAM3 */\n  __top_RamAHB32 = 0x20000000 + 0x8000 ; /* 32K bytes */\n  __top_RAM3 = 0x20000000 + 0x8000 ; /* 32K bytes */\n  __base_RamAHB16 = 0x20008000  ; /* RamAHB16 */\n  __base_RAM4 = 0x20008000 ; /* RAM4 */\n  __top_RamAHB16 = 0x20008000 + 0x4000 ; /* 16K bytes */\n  __top_RAM4 = 0x20008000 + 0x4000 ; /* 16K bytes */\n  __base_RamAHB_ETB16 = 0x2000c000  ; /* RamAHB_ETB16 */\n  __base_RAM5 = 0x2000c000 ; /* RAM5 */\n  __top_RamAHB_ETB16 = 0x2000c000 + 0x4000 ; /* 16K bytes */\n  __top_RAM5 = 0x2000c000 + 0x4000 ; /* 16K bytes */\n\nENTRY(ResetISR)\n\nSECTIONS\n{\n     .text_Flash2 : ALIGN(4)\n    {\n       FILL(0xff)\n        *(.text_Flash2) /* for compatibility with previous releases */\n        *(.text_MFlashB512) /* for compatibility with previous releases */\n        *(.text.$Flash2)\n        *(.text.$MFlashB512)\n        *(.text_Flash2.*) /* for compatibility with previous releases */\n        *(.text_MFlashB512.*) /* for compatibility with previous releases */\n        *(.text.$Flash2.*)\n        *(.text.$MFlashB512.*)\n        *(.rodata.$Flash2)\n        *(.rodata.$MFlashB512)\n        *(.rodata.$Flash2.*)\n        *(.rodata.$MFlashB512.*)            } > MFlashB512\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        __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        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n       *(.text*)\n       *(.rodata .rodata.* .constdata .constdata.*)\n       . = ALIGN(4);\n    } > MFlashA512\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    } > MFlashA512\n\n    .ARM.exidx : ALIGN(4)\n    {\n        __exidx_start = .;\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        __exidx_end = .;\n    } > MFlashA512\n\n    _etext = .;\n\n    /* DATA section for RamLoc40 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        PROVIDE(__start_data_RamLoc40 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$RamLoc40)\n        *(.data.$RAM2)\n        *(.data.$RamLoc40)\n        *(.data.$RAM2.*)\n        *(.data.$RamLoc40.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n        PROVIDE(__end_data_RamLoc40 = .) ;\n     } > RamLoc40 AT>MFlashA512\n\n    /* DATA section for RamAHB32 */\n\n    .data_RAM3 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM3 = .) ;\n        PROVIDE(__start_data_RamAHB32 = .) ;\n        *(.ramfunc.$RAM3)\n        *(.ramfunc.$RamAHB32)\n        *(.data.$RAM3)\n        *(.data.$RamAHB32)\n        *(.data.$RAM3.*)\n        *(.data.$RamAHB32.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM3 = .) ;\n        PROVIDE(__end_data_RamAHB32 = .) ;\n     } > RamAHB32 AT>MFlashA512\n\n    /* DATA section for RamAHB16 */\n\n    .data_RAM4 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM4 = .) ;\n        PROVIDE(__start_data_RamAHB16 = .) ;\n        *(.ramfunc.$RAM4)\n        *(.ramfunc.$RamAHB16)\n        *(.data.$RAM4)\n        *(.data.$RamAHB16)\n        *(.data.$RAM4.*)\n        *(.data.$RamAHB16.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM4 = .) ;\n        PROVIDE(__end_data_RamAHB16 = .) ;\n     } > RamAHB16 AT>MFlashA512\n\n    /* DATA section for RamAHB_ETB16 */\n\n    .data_RAM5 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM5 = .) ;\n        PROVIDE(__start_data_RamAHB_ETB16 = .) ;\n        *(.ramfunc.$RAM5)\n        *(.ramfunc.$RamAHB_ETB16)\n        *(.data.$RAM5)\n        *(.data.$RamAHB_ETB16)\n        *(.data.$RAM5.*)\n        *(.data.$RamAHB_ETB16.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM5 = .) ;\n        PROVIDE(__end_data_RamAHB_ETB16 = .) ;\n     } > RamAHB_ETB16 AT>MFlashA512\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    } > RamLoc32 AT> RamLoc32\n\n    /* Main DATA section (RamLoc32) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       PROVIDE(__start_data_RAM = .) ;\n       PROVIDE(__start_data_RamLoc32 = .) ;\n       *(vtable)\n       *(.ramfunc*)\n       KEEP(*(CodeQuickAccess))\n       KEEP(*(DataQuickAccess))\n       *(RamFunction)\n       *(.data*)\n       . = ALIGN(4) ;\n       _edata = . ;\n       PROVIDE(__end_data_RAM = .) ;\n       PROVIDE(__end_data_RamLoc32 = .) ;\n    } > RamLoc32 AT>MFlashA512\n\n    /* BSS section for RamLoc40 */\n    .bss_RAM2 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       PROVIDE(__start_bss_RamLoc40 = .) ;\n       *(.bss.$RAM2)\n       *(.bss.$RamLoc40)\n       *(.bss.$RAM2.*)\n       *(.bss.$RamLoc40.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n       PROVIDE(__end_bss_RamLoc40 = .) ;\n    } > RamLoc40 AT> RamLoc40\n\n    /* BSS section for RamAHB32 */\n    .bss_RAM3 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM3 = .) ;\n       PROVIDE(__start_bss_RamAHB32 = .) ;\n       *(.bss.$RAM3)\n       *(.bss.$RamAHB32)\n       *(.bss.$RAM3.*)\n       *(.bss.$RamAHB32.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM3 = .) ;\n       PROVIDE(__end_bss_RamAHB32 = .) ;\n    } > RamAHB32 AT> RamAHB32\n\n    /* BSS section for RamAHB16 */\n    .bss_RAM4 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM4 = .) ;\n       PROVIDE(__start_bss_RamAHB16 = .) ;\n       *(.bss.$RAM4)\n       *(.bss.$RamAHB16)\n       *(.bss.$RAM4.*)\n       *(.bss.$RamAHB16.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM4 = .) ;\n       PROVIDE(__end_bss_RamAHB16 = .) ;\n    } > RamAHB16 AT> RamAHB16\n\n    /* BSS section for RamAHB_ETB16 */\n    .bss_RAM5 : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM5 = .) ;\n       PROVIDE(__start_bss_RamAHB_ETB16 = .) ;\n       *(.bss.$RAM5)\n       *(.bss.$RamAHB_ETB16)\n       *(.bss.$RAM5.*)\n       *(.bss.$RamAHB_ETB16.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM5 = .) ;\n       PROVIDE(__end_bss_RamAHB_ETB16 = .) ;\n    } > RamAHB_ETB16 AT> RamAHB_ETB16\n\n    /* MAIN BSS SECTION: EDIT change to RamLoc40 */\n    .bss : ALIGN(4)\n    {\n        _bss = .;\n        PROVIDE(__start_bss_RAM = .) ;\n        PROVIDE(__start_bss_RamLoc32 = .) ;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        PROVIDE(__end_bss_RAM = .) ;\n        PROVIDE(__end_bss_RamLoc32 = .) ;\n/*        PROVIDE(end = .);*/\n    } > RamLoc40 AT> RamLoc40 /* > RamLoc32 AT> RamLoc32 */\n\n    /* hathach add heap section for clang */\n    .heap (NOLOAD): {\n        __heap_start = .;\n        __HeapBase = .;\n        __heap_base = .;\n        __end = .;\n        PROVIDE(end = .);\n        PROVIDE(_end = .);\n        PROVIDE(__end__ = .);\n        KEEP(*(.heap*))\n        __HeapLimit = .;\n        __heap_limit = .;\n        __heap_end = .;\n    } > RamLoc40\n\n    /* NOINIT section for RamLoc40 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM2 = .) ;\n       PROVIDE(__start_noinit_RamLoc40 = .) ;\n       *(.noinit.$RAM2)\n       *(.noinit.$RamLoc40)\n       *(.noinit.$RAM2.*)\n       *(.noinit.$RamLoc40.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM2 = .) ;\n       PROVIDE(__end_noinit_RamLoc40 = .) ;\n    } > RamLoc40 AT> RamLoc40\n\n    /* NOINIT section for RamAHB32 */\n    .noinit_RAM3 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM3 = .) ;\n       PROVIDE(__start_noinit_RamAHB32 = .) ;\n       *(.noinit.$RAM3)\n       *(.noinit.$RamAHB32)\n       *(.noinit.$RAM3.*)\n       *(.noinit.$RamAHB32.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM3 = .) ;\n       PROVIDE(__end_noinit_RamAHB32 = .) ;\n    } > RamAHB32 AT> RamAHB32\n\n    /* NOINIT section for RamAHB16 */\n    .noinit_RAM4 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM4 = .) ;\n       PROVIDE(__start_noinit_RamAHB16 = .) ;\n       *(.noinit.$RAM4)\n       *(.noinit.$RamAHB16)\n       *(.noinit.$RAM4.*)\n       *(.noinit.$RamAHB16.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM4 = .) ;\n       PROVIDE(__end_noinit_RamAHB16 = .) ;\n    } > RamAHB16 AT> RamAHB16\n\n    /* NOINIT section for RamAHB_ETB16 */\n    .noinit_RAM5 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM5 = .) ;\n       PROVIDE(__start_noinit_RamAHB_ETB16 = .) ;\n       *(.noinit.$RAM5)\n       *(.noinit.$RamAHB_ETB16)\n       *(.noinit.$RAM5.*)\n       *(.noinit.$RamAHB_ETB16.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM5 = .) ;\n       PROVIDE(__end_noinit_RamAHB_ETB16 = .) ;\n    } > RamAHB_ETB16 AT> RamAHB_ETB16\n\n    /* DEFAULT NOINIT SECTION */\n    .noinit (NOLOAD): ALIGN(4)\n    {\n        _noinit = .;\n        PROVIDE(__start_noinit_RAM = .) ;\n        PROVIDE(__start_noinit_RamLoc32 = .) ;\n        *(.noinit*)\n         . = ALIGN(4) ;\n        _end_noinit = .;\n       PROVIDE(__end_noinit_RAM = .) ;\n       PROVIDE(__end_noinit_RamLoc32 = .) ;\n    } > RamLoc32 AT> RamLoc32\n\n/*    PROVIDE(_pvHeapStart = DEFINED(__user_heap_base) ? __user_heap_base : .);*/\n\n    PROVIDE(_vStackTop = DEFINED(__user_stack_top) ? __user_stack_top : __top_RamLoc32 - 0);\n\n    /* ## Create checksum value (used in startup) ## */\n    /* This cause issue with clang linker, so it is disabled */\n    /* MemManage_Handler, BusFault_Handler, UsageFault_Hander may not be defined */\n/*    PROVIDE(__valid_user_code_checksum = 0 -*/\n/*                                         (_vStackTop*/\n/*                                         + (ResetISR + 1)*/\n/*                                         + (NMI_Handler + 1)*/\n/*                                         + (HardFault_Handler + 1)*/\n/*                                         + (( DEFINED(MemManage_Handler) ? MemManage_Handler : 0 ) + 1)*/\n/*                                         + (( DEFINED(BusFault_Handler) ? BusFault_Handler : 0 ) + 1)*/\n/*                                         + (( DEFINED(UsageFault_Handler) ? UsageFault_Handler : 0 ) + 1)*/\n/*                                         ) );*/\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}\n"
  },
  {
    "path": "hw/bsp/lpc43/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n\n#include \"chip.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n/* System configuration variables used by chip driver */\nconst uint32_t OscRateIn = 12000000;\nconst uint32_t ExtRateIn = 0;\n\nextern void USB0_IRQHandler(void);\nextern void USB1_IRQHandler(void);\nextern void SysTick_Handler(void);\nvoid SystemInit(void);\n\n/*------------------------------------------------------------------*/\n/* BOARD API\n *------------------------------------------------------------------*/\n\n// Invoked by startup code\nvoid SystemInit(void)\n{\n#ifdef __USE_LPCOPEN\n  unsigned int *pSCB_VTOR = (unsigned int *) 0xE000ED08;\n\n#ifdef __ICCARM__\n  extern void *__vector_table;\n  *pSCB_VTOR = (unsigned int) &__vector_table;\n\n#elif defined(__ARMCC_VERSION)\n  extern void *__Vectors;\n\t*pSCB_VTOR = (unsigned int) &__Vectors;\n\n#else // other compoiler using cr_startup_lpc43xx.c\n\textern void (* const g_pfnVectors[])(void);\n\t*pSCB_VTOR = (unsigned int) g_pfnVectors;\n#endif\n\n#if __FPU_USED == 1\n\tfpuInit();\n#endif\n\n#endif\n\n  /* Setup system level pin muxing */\n  Chip_SCU_SetPinMuxing(pinmuxing, sizeof(pinmuxing) / sizeof(PINMUX_GRP_T));\n\n//  /* Clock pins only, group field not used */\n//  for ( int i = 0; i < (int) (sizeof(pinclockmuxing) / sizeof(pinclockmuxing[0])); i++ ) {\n//    Chip_SCU_ClockPinMuxSet(pinclockmuxing[i].pinnum, pinclockmuxing[i].modefunc);\n//  }\n\n  Chip_SetupXtalClocking();\n}\n\nvoid board_init(void)\n{\n  SystemCoreClockUpdate();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  Chip_GPIO_Init(LPC_GPIO_PORT);\n\n#ifdef __PCA9532C_H\n  // LED via pca9532 I2C\n  Chip_SCU_I2C0PinConfig(I2C0_STANDARD_FAST_MODE);\n  Chip_I2C_Init(I2C0);\n  Chip_I2C_SetClockRate(I2C0, 100000);\n  Chip_I2C_SetMasterEventHandler(I2C0, Chip_I2C_EventHandlerPolling);\n  pca9532_init();\n#else\n  Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, LED_PORT, LED_PIN);\n#endif\n\n  // Button\n  Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, BUTTON_PORT, BUTTON_PIN);\n\n  //------------- UART -------------//\n\tChip_UART_Init(UART_DEV);\n\tChip_UART_SetBaud(UART_DEV, CFG_BOARD_UART_BAUDRATE);\n\tChip_UART_ConfigData(UART_DEV, UART_LCR_WLEN8 | UART_LCR_SBS_1BIT | UART_LCR_PARITY_DIS);\n\tChip_UART_TXEnable(UART_DEV);\n\n  //------------- USB -------------//\n  enum {\n    USBMODE_DEVICE = 2,\n    USBMODE_HOST   = 3\n  };\n\n  enum {\n    USBMODE_VBUS_LOW  = 0,\n    USBMODE_VBUS_HIGH = 1\n  };\n\n  /* From EA4357 user manual\n   *\n   * USB0 Device operation:\n   * - Insert jumpers in position 1-2 in JP17/JP18/JP19.\n   * - GPIO28 controls USB connect functionality\n   * - LED32 lights when the USB Device is connected. SJ4 has pads 1-2 shorted by default.\n   * - LED33 is controlled by GPIO27 and signals USB-up state. GPIO54 is used for VBUS\n   * sensing.\n   *\n   * USB0 Host operation:\n   * - insert jumpers in position 2-3 in JP17/JP18/JP19.\n   * - USB Host power is controlled via distribution switch U20 (found in schematic page 11).\n   * - Signal GPIO26 is active low and enables +5V on VBUS2.\n   * - LED35 light whenever +5V is present on VBUS2.\n   * - GPIO55 is connected to status feedback from the distribution switch.\n   * - GPIO54 is used for VBUS sensing. 15Kohm pull-down resistors are always active\n   *\n   * Note:\n   * - Insert jumpers in position 2-3 in JP17/JP18/JP19\n   * - Insert jumpers in JP31 (OTG)\n   */\n  Chip_USB0_Init();\n\n  /* From EA4357 user manual\n   *\n   * For USB1 Device:\n   * - a 1.5Kohm pull-up resistor is needed on the USB DP data signal. There are two methods to create this.\n   * JP15 is inserted and the pull-up resistor is always enabled. Alternatively, the pull-up resistor is activated\n   * inside the USB OTG chip (U31), and this has to be done via the I2C interface of GPIO52/GPIO53. In the latter case,\n   * JP15 shall not be inserted.\n   * - J19 is the connector to use when USB Device is used. Normally it should be a USB-B connector for\n   * creating a USB Device interface, but the mini-AB connector can also be used in this case. The status\n   * of VBUS can be read via U31.\n   * - JP16 shall not be inserted.\n   *\n   * For USB1 Host:\n   * - 15Kohm pull-down resistors are needed on the USB data signals. These are activated inside the USB OTG chip (U31),\n   * and this has to be done via the I2C interface of GPIO52/GPIO53.\n   * - J20 is the connector to use when USB Host is used. In order to provide +5V to the external USB\n   * device connected to this connector (J20), channel A of U20 must be enabled. It is enabled by default\n   * since SJ5 is normally connected between pin 1-2.\n   * - LED34 lights green when +5V is available on J20.\n   * - JP15 shall not be inserted. JP16 has no effect\n   */\n  Chip_USB1_Init();\n\n#ifdef _BOARD_EA4357_H\n  // USB0 Vbus Power: P2_3 on EA4357 channel B U20 GPIO26 active low (base board)\n  Chip_SCU_PinMuxSet(2, 3, SCU_MODE_PULLUP | SCU_MODE_INBUFF_EN | SCU_MODE_FUNC7);\n#endif\n\n  #if defined(BOARD_TUD_RHPORT) &&  BOARD_TUD_RHPORT == 0\n    // P9_5 (GPIO5[18]) (GPIO28 on oem base) as USB connect, active low.\n    Chip_SCU_PinMuxSet(9, 5, SCU_MODE_PULLDOWN | SCU_MODE_FUNC4);\n    Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 5, 18);\n  #endif\n\n  // USB1 Power: EA4357 channel A U20 is enabled by SJ5 connected to pad 1-2, no more action required\n  // TODO Remove R170, R171, solder a pair of 15K to USB1 D+/D- to test with USB1 Host\n}\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid USB1_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  #ifdef __PCA9532C_H\n  if ( state ) {\n    pca9532_setLeds(LED1, 0);\n  } else {\n    pca9532_setLeds(0, LED1);\n  }\n  #else\n  Chip_GPIO_SetPinState(LPC_GPIO_PORT, LED_PORT, LED_PIN, state ? LED_STATE_ON : !LED_STATE_ON);\n  #endif\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == Chip_GPIO_GetPinState(LPC_GPIO_PORT, BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  if ( max_len < 16 ) return 0;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  Chip_IAP_ReadUID(id32);\n  return 16;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  return Chip_UART_Read(UART_DEV, buf, len);\n}\n\nint board_uart_write(void const *buf, int len) {\n  uint8_t const *buf8 = (uint8_t const *) buf;\n  for ( int i = 0; i < len; i++ ) {\n    while ( (Chip_UART_ReadLineStatus(UART_DEV) & UART_LSR_THRE) == 0 ) {}\n    Chip_UART_SendByte(UART_DEV, buf8[i]);\n  }\n\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc43/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/nxp/lpcopen/lpc43xx/lpc_chip_43xx)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC43XX CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${SDK_DIR}/../gcc/cr_startup_lpc43xx.c)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${SDK_DIR}/../iar/iar_startup_lpc18xx43xx.s)\nset(LD_FILE_IAR ${SDK_DIR}/../iar/linker/lpc18xx_43xx_ldscript_iflash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/src/chip_18xx_43xx.c\n    ${SDK_DIR}/src/clock_18xx_43xx.c\n    ${SDK_DIR}/src/fpu_init.c\n    ${SDK_DIR}/src/gpio_18xx_43xx.c\n    ${SDK_DIR}/src/iap_18xx_43xx.c\n    ${SDK_DIR}/src/sysinit_18xx_43xx.c\n    ${SDK_DIR}/src/uart_18xx_43xx.c\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __USE_LPCOPEN\n    CORE_M4\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/inc\n    ${SDK_DIR}/inc/config_43xx\n    ${CMSIS_5}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\n\n  # warning by LPCOpen\n  if (TOOLCHAIN STREQUAL \"gcc\" OR TOOLCHAIN STREQUAL \"clang\")\n    set_target_properties(${BOARD_TARGET} PROPERTIES COMPILE_FLAGS -Wno-error=incompatible-pointer-types)\n  endif ()\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC43XX)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c\n    ${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c\n    ${TOP}/src/portable/ehci/ehci.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc43/family.mk",
    "content": "SDK_DIR = hw/mcu/nxp/lpcopen/lpc43xx/lpc_chip_43xx\n\ninclude ${TOP}/${BOARD_PATH}/board.mk\nCPU_CORE ?= cortex-m4\n\nCFLAGS += \\\n  -DCORE_M4 \\\n  -D__USE_LPCOPEN \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC43XX\n\n# mcu driver cause following warnings\nCFLAGS_GCC += \\\n  -flto \\\n  -nostdlib \\\n  -Wno-error=unused-parameter \\\n  -Wno-error=cast-qual \\\n  -Wno-error=incompatible-pointer-types \\\n\nLDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/chipidea/ci_hs/dcd_ci_hs.c \\\n\tsrc/portable/chipidea/ci_hs/hcd_ci_hs.c \\\n\tsrc/portable/ehci/ehci.c \\\n\t${SDK_DIR}/../gcc/cr_startup_lpc43xx.c \\\n\t${SDK_DIR}/src/chip_18xx_43xx.c \\\n\t${SDK_DIR}/src/clock_18xx_43xx.c \\\n\t${SDK_DIR}/src/fpu_init.c \\\n\t${SDK_DIR}/src/gpio_18xx_43xx.c \\\n\t${SDK_DIR}/src/iap_18xx_43xx.c \\\n\t${SDK_DIR}/src/sysinit_18xx_43xx.c \\\n\t${SDK_DIR}/src/uart_18xx_43xx.c \\\n\nINC += \\\n  $(TOP)/$(BOARD_PATH) \\\n\t${TOP}/${SDK_DIR}/inc \\\n\t${TOP}/${SDK_DIR}/inc/config_43xx \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n"
  },
  {
    "path": "hw/bsp/lpc51/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               2\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* Define to trap errors during development. */\n// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7\n#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8_1M_MAIN__) || \\\n    defined(__ARM7M__) || defined (__ARM7EM__) || defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)\n  #define configASSERT(_exp) \\\n    do {\\\n      if ( !(_exp) ) { \\\n        volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \\\n        if ( (*ARM_CM_DHCSR) & 1UL ) {  /* Only halt mcu if debugger is attached */ \\\n          taskDISABLE_INTERRUPTS(); \\\n           __asm(\"BKPT #0\\n\"); \\\n        }\\\n      }\\\n    } while(0)\n#endif\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/lpc51/boards/lpcxpresso51u68/board.cmake",
    "content": "set(MCU_VARIANT LPC51U68)\n\nset(JLINK_DEVICE LPC51U68)\nset(PYOCD_TARGET LPC51U68)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_LPC51U68JBD64\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc51/boards/lpcxpresso51u68/board.h",
    "content": "/* metadata:\n   name: LPCXpresso51u68\n   url: https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpcxpresso51u68-for-the-lpc51u68-mcus:OM40005\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#define LED_PORT      0\n#define LED_PIN       29\n#define LED_STATE_ON  0\n\n// WAKE button\n#define BUTTON_PORT   0\n#define BUTTON_PIN    24\n\n// IOCON pin mux\n#define IOCON_PIO_DIGITAL_EN          0x80u   /*!< Enables digital function */\n#define IOCON_PIO_FUNC1               0x01u   /*!< Selects pin function 1 */\n#define IOCON_PIO_FUNC7               0x07u   /*!< Selects pin function 7 */\n#define IOCON_PIO_INPFILT_OFF       0x0100u   /*!< Input filter disabled */\n#define IOCON_PIO_INV_DI              0x00u   /*!< Input function is not inverted */\n#define IOCON_PIO_MODE_INACT          0x00u   /*!< No addition pin function */\n#define IOCON_PIO_OPENDRAIN_DI        0x00u   /*!< Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD       0x00u   /*!< Standard mode, output slew rate control is enabled */\n\n/****************************************************************\nname: BOARD_BootClockFROHF96M\noutputs:\n- {id: SYSTICK_clock.outFreq, value: 96 MHz}\n- {id: System_clock.outFreq, value: 96 MHz}\nsettings:\n- {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf}\nsources:\n- {id: SYSCON.fro_hf.outFreq, value: 96 MHz}\n******************************************************************/\nstatic inline void BootClockFROHF96M(void) {\n  /*!< Set up the clock sources */\n  /*!< Set up FRO */\n  POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on  */\n  CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without\n                                             accidentally being below the voltage for current speed */\n  POWER_SetVoltageForFreq(96000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n  CLOCK_SetFLASHAccessCyclesForFreq(96000000U); /*!< Set FLASH wait states for core */\n\n  CLOCK_SetupFROClocking(96000000U); /*!< Set up high frequency FRO output to selected frequency */\n\n  /*!< Set up dividers */\n  CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);     /*!< Set AHBCLKDIV divider to value 1 */\n  CLOCK_SetClkDiv(kCLOCK_DivSystickClk, 0U, true);  /*!< Reset SYSTICKCLKDIV divider counter and halt it */\n  CLOCK_SetClkDiv(kCLOCK_DivSystickClk, 1U, false); /*!< Set SYSTICKCLKDIV divider to value 1 */\n\n  /*!< Set up clock selectors - Attach clocks to the peripheries */\n  CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */\n  /*!< Set SystemCoreClock variable. */\n  SystemCoreClock = 96000000U;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc51/boards/lpcxpresso51u68/board.mk",
    "content": "MCU_VARIANT = LPC51U68\n\nCFLAGS += \\\n  -DCPU_LPC51U68JBD64 \\\n  -DCFG_TUSB_MEM_SECTION='__attribute__((section(\".data\")))'\n\nJLINK_DEVICE = LPC51U68\nPYOCD_TARGET = LPC51U68\n\n# flash using pyocd (51u68 is not supported yet)\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc51/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"fsl_device_registers.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_power.h\"\n#include \"fsl_iocon.h\"\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid board_init(void) {\n  // Enable IOCON clock\n  CLOCK_EnableClock(kCLOCK_Iocon);\n\n  // Enable GPIO0 clock\n  CLOCK_EnableClock(kCLOCK_Gpio0);\n\n  // Init 96 MHz clock\n  BootClockFROHF96M();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  GPIO_PortInit(GPIO, LED_PORT);\n  GPIO_PortInit(GPIO, BUTTON_PORT);\n\n  // LED\n  gpio_pin_config_t const led_config = {kGPIO_DigitalOutput, 0};\n  GPIO_PinInit(GPIO, LED_PORT, LED_PIN, &led_config);\n  board_led_write(true);\n\n  // Button\n  gpio_pin_config_t const button_config = {kGPIO_DigitalInput, 0};\n  GPIO_PinInit(GPIO, BUTTON_PORT, BUTTON_PIN, &button_config);\n\n  // USB\n  const uint32_t port1_pin6_config = (\n      IOCON_PIO_FUNC7       | /* Pin is configured as USB0_VBUS */\n      IOCON_PIO_MODE_INACT  | /* No addition pin function */\n      IOCON_PIO_INV_DI      | /* Input function is not inverted */\n      IOCON_PIO_DIGITAL_EN  | /* Enables digital function */\n      IOCON_PIO_INPFILT_OFF | /* Input filter disabled */\n      IOCON_PIO_OPENDRAIN_DI  /* Open drain is disabled */\n  );\n  IOCON_PinMuxSet(IOCON, 1, 6, port1_pin6_config); /* PORT1 PIN6 (coords: 26) is configured as USB0_VBUS */\n\n  POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*Turn on USB Phy */\n  CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcFro, CLOCK_GetFreq(kCLOCK_FroHf)); /* enable USB IP clock */\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinWrite(GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  // active low\n  return 1 - GPIO_PinRead(GPIO, BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\n#ifndef __ICCARM__\n// Implement _start() since we use linker flag '-nostartfiles'.\n// Requires defined __STARTUP_CLEAR_BSS,\nextern int main(void);\n\nTU_ATTR_UNUSED void _start(void) {\n  // called by startup code\n  main();\n  while (1) {}\n}\n\n#ifdef __clang__\nvoid\t_exit (int __status) {\n  (void) __status;\n  while (1) {}\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc51/family.cmake",
    "content": "include_guard()\n\nset(MCUX_DIR ${TOP}/hw/mcu/nxp/mcuxsdk-core)\nset(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-devices-lpc)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_6)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC51 CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\n  set(LD_FILE_GNU ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/gcc/${MCU_VARIANT}_flash.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\nif (NOT DEFINED STARTUP_FILE_GNU)\n  set(STARTUP_FILE_GNU ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\nif (NOT DEFINED LD_FILE_IAR)\n  set(LD_FILE_IAR ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/iar/${MCU_VARIANT}_flash.icf)\nendif ()\n\nif (NOT DEFINED STARTUP_FILE_IAR)\n  set(STARTUP_FILE_IAR ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/iar/startup_${MCU_VARIANT}.s)\nendif ()\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    # driver\n    ${MCUX_DIR}/drivers/lpc_gpio/fsl_gpio.c\n    ${MCUX_DIR}/drivers/flexcomm/fsl_flexcomm.c\n    ${MCUX_DIR}/drivers/flexcomm/usart/fsl_usart.c\n    # mcu\n    ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/system_${MCU_VARIANT}.c\n    ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/drivers/fsl_clock.c\n    ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/drivers/fsl_power.c\n    ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/drivers/fsl_reset.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${TOP}/lib/sct_neopixel\n    # driver\n    ${MCUX_DIR}/drivers/common\n    ${MCUX_DIR}/drivers/common\n    ${MCUX_DIR}/drivers/flexcomm\n    ${MCUX_DIR}/drivers/flexcomm/usart\n    ${MCUX_DIR}/drivers/lpc_iocon\n    ${MCUX_DIR}/drivers/lpc_gpio\n    # mcu\n    ${SDK_DIR}/LPC51U68/${MCU_VARIANT}\n    ${SDK_DIR}/LPC51U68/${MCU_VARIANT}/drivers\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    ${SDK_DIR}/LPC51U68/periph\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CFG_TUSB_MEM_ALIGN=TU_ATTR_ALIGNED\\(64\\)\n    __STARTUP_CLEAR_BSS\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC51)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\n  #family_flash_pyocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc51/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\nMCUX_DIR = /hw/mcu/nxp/mcuxsdk-core\nSDK_DIR = /hw/mcu/nxp/mcux-devices-lpc\n\nCFLAGS += \\\n  -flto \\\n  -D__STARTUP_CLEAR_BSS \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC51UXX \\\n  -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))'\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs \\\n\n# All source paths should be relative to the top level.\nLD_FILE = $(SDK_DIR)/LPC51U68/$(MCU_VARIANT)/gcc/$(MCU_VARIANT)_flash.ld\n\nSRC_C += \\\n\tsrc/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c \\\n\t$(TOP)/$(SDK_DIR)/LPC51U68/$(MCU_VARIANT)/system_$(MCU_VARIANT).c \\\n\t$(TOP)/$(SDK_DIR)/LPC51U68/$(MCU_VARIANT)/drivers/fsl_clock.c \\\n\t$(TOP)/$(SDK_DIR)/LPC51U68/$(MCU_VARIANT)/drivers/fsl_power.c \\\n\t$(TOP)/$(SDK_DIR)/LPC51U68/$(MCU_VARIANT)/drivers/fsl_reset.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpc_gpio/fsl_gpio.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/flexcomm/fsl_flexcomm.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/flexcomm/usart/fsl_usart.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_6/CMSIS/Core/Include \\\n\t$(TOP)/$(SDK_DIR)/LPC51U68/$(MCU_VARIANT) \\\n\t$(TOP)/$(SDK_DIR)/LPC51U68/$(MCU_VARIANT)/drivers \\\n\t$(TOP)/$(SDK_DIR)/LPC51U68/periph \\\n\t$(TOP)/$(MCUX_DIR)/drivers/common \\\n\t$(TOP)/$(MCUX_DIR)/drivers/flexcomm \\\n\t$(TOP)/$(MCUX_DIR)/drivers/flexcomm/usart \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpc_iocon \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpc_gpio\n\nSRC_S += $(TOP)$(SDK_DIR)/LPC51U68/$(MCU_VARIANT)/gcc/startup_$(MCU_VARIANT).S\n"
  },
  {
    "path": "hw/bsp/lpc54/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54114/board.cmake",
    "content": "set(MCU_VARIANT LPC54114)\nset(MCU_CORE LPC54114_cm4)\n\nset(JLINK_DEVICE LPC54114J256_M4)\nset(PYOCD_TARGET LPC54114)\n\nset(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/LPC54114J256_cm4_flash.ld)\n\n# Only Port 0 Full-Speed\nset(RHPORT_DEVICE 0)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_LPC54114J256BD64_cm4\n    )\n  target_link_libraries(${TARGET} PUBLIC\n    ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/libpower_cm4_hardabi.a\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54114/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso54114\n   url: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso54114-board:OM13089\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// IOCON pin mux\n#define IOCON_PIO_DIGITAL_EN     0x80u   // Enables digital function\n#define IOCON_PIO_FUNC0          0x00u\n#define IOCON_PIO_FUNC1          0x01u   // Selects pin function 1\n#define IOCON_PIO_FUNC7          0x07u   // Selects pin function 7\n#define IOCON_PIO_INPFILT_OFF    0x0100u // Input filter disabled\n#define IOCON_PIO_INV_DI         0x00u   // Input function is not inverted\n#define IOCON_PIO_MODE_INACT     0x00u   // No addition pin function\n#define IOCON_PIO_MODE_PULLUP    0x10u\n#define IOCON_PIO_OPENDRAIN_DI   0x00u   // Open drain is disabled\n#define IOCON_PIO_SLEW_STANDARD  0x00u   // Standard mode, output slew rate control is enabled\n\n// LED\n#define LED_PORT              0\n#define LED_PIN               29\n#define LED_STATE_ON          0\n\n// WAKE button\n#define BUTTON_PORT           0\n#define BUTTON_PIN            24\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART0\n#define UART_RX_PINMUX        0, 0, IOCON_PIO_DIG_FUNC1_EN\n#define UART_TX_PINMUX        0, 1, IOCON_PIO_DIG_FUNC1_EN\n\n// USB0 VBUS\n#define USB0_VBUS_PINMUX      1, 6, IOCON_PIO_DIG_FUNC7_EN\n\n// XTAL\n//#define XTAL0_CLK_HZ          (16 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54114/board.mk",
    "content": "MCU_VARIANT = LPC54114\nMCU_CORE = LPC54114_cm4\n\nCFLAGS += -DCPU_LPC54114J256BD64_cm4\nLD_FILE = $(MCU_DIR)/gcc/LPC54114J256_cm4_flash.ld\n\nLIBS += $(TOP)/$(MCU_DIR)/gcc/libpower_cm4_hardabi.a\n\nJLINK_DEVICE = LPC54114J256_M4\nPYOCD_TARGET = LPC54114\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54608/board.cmake",
    "content": "set(MCU_VARIANT LPC54608)\nset(MCU_CORE LPC54608)\n\nset(JLINK_DEVICE LPC54608J512)\nset(PYOCD_TARGET LPC54608)\nset(NXPLINK_DEVICE LPC54608:LPCXpresso54608)\n\nset(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/LPC54608J512_flash.ld)\n\n# Device port default to PORT1 Highspeed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_LPC54608J512ET180\n    )\n  target_link_libraries(${TARGET} PUBLIC\n    ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/libpower_hardabi.a\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54608/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso54608\n   url: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-development-board-for-lpc5460x-mcus:OM13092\n*/\n\n#ifndef BOARD_LPCXPRESSO54608_H_\n#define BOARD_LPCXPRESSO54608_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// IOCON pin mux\n#define IOCON_PIO_DIGITAL_EN     0x0100u   // Enables digital function\n#define IOCON_PIO_FUNC0          0x00u\n#define IOCON_PIO_FUNC1          0x01u   // Selects pin function 1\n#define IOCON_PIO_FUNC7          0x07u   // Selects pin function 7\n#define IOCON_PIO_INPFILT_OFF    0x0200u // Input filter disabled\n#define IOCON_PIO_INV_DI         0x00u   // Input function is not inverted\n#define IOCON_PIO_MODE_INACT     0x00u   // No addition pin function\n#define IOCON_PIO_MODE_PULLUP    0x10u\n#define IOCON_PIO_OPENDRAIN_DI   0x00u   // Open drain is disabled\n#define IOCON_PIO_SLEW_STANDARD  0x00u   // Standard mode, output slew rate control is enabled\n\n// LED\n#define LED_PORT              2\n#define LED_PIN               2\n#define LED_STATE_ON          0\n\n// WAKE button\n#define BUTTON_PORT           1\n#define BUTTON_PIN            1\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART0\n#define UART_RX_PINMUX        0, 29, IOCON_PIO_DIG_FUNC1_EN\n#define UART_TX_PINMUX        0, 30, IOCON_PIO_DIG_FUNC1_EN\n\n// USB0 VBUS\n#define USB0_VBUS_PINMUX      0, 22, IOCON_PIO_DIG_FUNC7_EN\n\n// Power switch\n#define USBFS_POWER_PORT      4\n#define USBFS_POWER_PIN       7\n#define USBFS_POWER_STATE_ON  0\n\n#define USBHS_POWER_PORT      4\n#define USBHS_POWER_PIN       9\n#define USBHS_POWER_STATE_ON  0\n\n// XTAL\n//#define XTAL0_CLK_HZ          (16 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54608/board.mk",
    "content": "MCU_VARIANT = LPC54608\nMCU_CORE = LPC54608\n\nPORT ?= 1\n\nCFLAGS += -DCPU_LPC54608J512ET180\nCFLAGS += -Wno-error=double-promotion\n\nLD_FILE = $(MCU_DIR)/gcc/LPC54608J512_flash.ld\n\nLIBS += $(TOP)/$(MCU_DIR)/gcc/libpower_hardabi.a\n\nJLINK_DEVICE = LPC54608J512\nPYOCD_TARGET = LPC54608\n\n#flash: flash-pyocd\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54628/board.cmake",
    "content": "set(MCU_VARIANT LPC54628)\nset(MCU_CORE LPC54628)\n\nset(JLINK_DEVICE LPC54628J512)\nset(PYOCD_TARGET LPC54628)\nset(NXPLINK_DEVICE LPC54628:LPCXpresso54628)\n\nset(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/LPC54628J512_flash.ld)\n\n# Device port default to PORT1 Highspeed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_LPC54628J512ET180\n    )\n  target_link_libraries(${TARGET} PUBLIC\n    ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/libpower_hardabi.a\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54628/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso54628\n   url: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso54628-development-board:OM13098\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// IOCON pin mux\n#define IOCON_PIO_DIGITAL_EN     0x0100u   // Enables digital function\n#define IOCON_PIO_FUNC0          0x00u\n#define IOCON_PIO_FUNC1          0x01u   // Selects pin function 1\n#define IOCON_PIO_FUNC7          0x07u   // Selects pin function 7\n#define IOCON_PIO_INPFILT_OFF    0x0200u // Input filter disabled\n#define IOCON_PIO_INV_DI         0x00u   // Input function is not inverted\n#define IOCON_PIO_MODE_INACT     0x00u   // No addition pin function\n#define IOCON_PIO_MODE_PULLUP    0x10u\n#define IOCON_PIO_OPENDRAIN_DI   0x00u   // Open drain is disabled\n#define IOCON_PIO_SLEW_STANDARD  0x00u   // Standard mode, output slew rate control is enabled\n\n// LED\n#define LED_PORT              2\n#define LED_PIN               2\n#define LED_STATE_ON          0\n\n// WAKE button\n#define BUTTON_PORT           1\n#define BUTTON_PIN            1\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART0\n#define UART_RX_PINMUX        0, 29, IOCON_PIO_DIG_FUNC1_EN\n#define UART_TX_PINMUX        0, 30, IOCON_PIO_DIG_FUNC1_EN\n\n// USB0 VBUS\n#define USB0_VBUS_PINMUX      0, 22, IOCON_PIO_DIG_FUNC7_EN\n\n// XTAL\n//#define XTAL0_CLK_HZ          (16 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc54/boards/lpcxpresso54628/board.mk",
    "content": "MCU_VARIANT = LPC54628\nMCU_CORE = LPC54628\n\nPORT ?= 1\n\nCFLAGS += -DCPU_LPC54628J512ET180\nCFLAGS += -Wno-error=double-promotion\n\nLD_FILE = $(MCU_DIR)/gcc/LPC54628J512_flash.ld\n\nLIBS += $(TOP)/$(MCU_DIR)/gcc/libpower_hardabi.a\n\nJLINK_DEVICE = LPC54628J512\nPYOCD_TARGET = LPC54628\n\n#flash: flash-pyocd\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/lpc54/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"fsl_device_registers.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_power.h\"\n#include \"fsl_iocon.h\"\n#include \"fsl_usart.h\"\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n// Digital pin function n enabled\n#define IOCON_PIO_DIG_FUNC0_EN   (IOCON_PIO_DIGITAL_EN | IOCON_PIO_INPFILT_OFF | IOCON_PIO_FUNC0)\n#define IOCON_PIO_DIG_FUNC1_EN   (IOCON_PIO_DIGITAL_EN | IOCON_PIO_INPFILT_OFF | IOCON_PIO_FUNC1)\n#define IOCON_PIO_DIG_FUNC4_EN   (IOCON_PIO_DIGITAL_EN | IOCON_PIO_INPFILT_OFF | IOCON_PIO_FUNC4)\n#define IOCON_PIO_DIG_FUNC7_EN   (IOCON_PIO_DIGITAL_EN | IOCON_PIO_INPFILT_OFF | IOCON_PIO_FUNC7)\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid USB1_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n/****************************************************************\nname: BOARD_BootClockFROHF96M\noutputs:\n- {id: SYSTICK_clock.outFreq, value: 96 MHz}\n- {id: System_clock.outFreq, value: 96 MHz}\nsettings:\n- {id: SYSCON.MAINCLKSELA.sel, value: SYSCON.fro_hf}\nsources:\n- {id: SYSCON.fro_hf.outFreq, value: 96 MHz}\n******************************************************************/\nvoid BootClockFROHF96M(void) {\n  /*!< Set up the clock sources */\n  /*!< Set up FRO */\n  POWER_DisablePD(kPDRUNCFG_PD_FRO_EN); /*!< Ensure FRO is on  */\n  CLOCK_AttachClk(kFRO12M_to_MAIN_CLK); /*!< Switch to FRO 12MHz first to ensure we can change voltage without\n                                             accidentally being below the voltage for current speed */\n  POWER_SetVoltageForFreq(96000000U); /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n  CLOCK_SetFLASHAccessCyclesForFreq(96000000U); /*!< Set FLASH wait states for core */\n\n  CLOCK_SetupFROClocking(96000000U); /*!< Set up high frequency FRO output to selected frequency */\n\n  /*!< Set up dividers */\n  CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);     /*!< Set AHBCLKDIV divider to value 1 */\n\n  /*!< Set up clock selectors - Attach clocks to the peripheries */\n  CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK); /*!< Switch MAIN_CLK to FRO_HF */\n\n  /*!< Set SystemCoreClock variable. */\n  SystemCoreClock = 96000000U;\n}\n\nvoid board_init(void) {\n  // Enable IOCON clock\n  CLOCK_EnableClock(kCLOCK_Iocon);\n\n  // Init 96 MHz clock\n  BootClockFROHF96M();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  // Init all GPIO ports 54114 only has 2 ports.\n  GPIO_PortInit(GPIO, LED_PORT);\n  GPIO_PortInit(GPIO, BUTTON_PORT);\n\n  // LED\n  IOCON_PinMuxSet(IOCON, LED_PORT, LED_PIN, IOCON_PIO_DIG_FUNC0_EN);\n  gpio_pin_config_t const led_config = { kGPIO_DigitalOutput, 0};\n  GPIO_PinInit(GPIO, LED_PORT, LED_PIN, &led_config);\n\n  board_led_write(0);\n\n  // Button\n  IOCON_PinMuxSet(IOCON, BUTTON_PORT, BUTTON_PIN, IOCON_PIO_DIG_FUNC0_EN | IOCON_PIO_MODE_PULLUP);\n  gpio_pin_config_t const button_config = { kGPIO_DigitalInput, 0};\n  GPIO_PinInit(GPIO, BUTTON_PORT, BUTTON_PIN, &button_config);\n\n#ifdef UART_DEV\n  // UART\n  IOCON_PinMuxSet(IOCON, UART_RX_PINMUX);\n  IOCON_PinMuxSet(IOCON, UART_TX_PINMUX);\n\n  // Enable UART when debug log is on\n  CLOCK_AttachClk(kFRO12M_to_FLEXCOMM0);\n  usart_config_t uart_config;\n  USART_GetDefaultConfig(&uart_config);\n  uart_config.baudRate_Bps = CFG_BOARD_UART_BAUDRATE;\n  uart_config.enableTx     = true;\n  uart_config.enableRx     = true;\n  USART_Init(UART_DEV, &uart_config, 12000000);\n#endif\n\n#if defined(FSL_FEATURE_SOC_USBHSD_COUNT) && FSL_FEATURE_SOC_USBHSD_COUNT\n  // LPC546xx and LPC540xx has OTG 1 FS + 1 HS rhports\n  #if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 0)\n    /* PORT0 PIN22 configured as USB0_VBUS */\n    IOCON_PinMuxSet(IOCON, USB0_VBUS_PINMUX);\n\n    // Port0 is Full Speed\n    POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); /*< Turn on USB Phy */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 1, false);\n    CLOCK_AttachClk(kFRO_HF_to_USB0_CLK);\n\n    if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0) {\n      /*According to reference manual, device mode setting has to be set by access usb host register */\n      CLOCK_EnableClock(kCLOCK_Usbhsl0); /* enable usb0 host clock */\n      USBFSH->PORTMODE |= USBFSH_PORTMODE_DEV_ENABLE_MASK;\n      CLOCK_DisableClock(kCLOCK_Usbhsl0); /* disable usb0 host clock */\n\n      CLOCK_EnableUsbfs0DeviceClock(kCLOCK_UsbSrcFro, CLOCK_GetFroHfFreq());\n    } else {\n    #ifdef USBFS_POWER_PORT\n      /* Configure USB0 Power Switch Pin */\n      IOCON_PinMuxSet(IOCON, USBFS_POWER_PORT, USBFS_POWER_PIN, IOCON_PIO_DIG_FUNC0_EN);\n\n      gpio_pin_config_t const power_pin_config = {kGPIO_DigitalOutput, USBFS_POWER_STATE_ON};\n      GPIO_PinInit(GPIO, USBFS_POWER_PORT, USBFS_POWER_PIN, &power_pin_config);\n    #endif\n      CLOCK_EnableUsbfs0HostClock(kCLOCK_UsbSrcFro, CLOCK_GetFroHfFreq());\n      USBFSH->PORTMODE &= ~USBFSH_PORTMODE_DEV_ENABLE_MASK;\n    }\n  #endif\n\n #if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 1)\n  // Port1 is High Speed\n\n  /* Turn on USB1 Phy */\n  POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY);\n\n  /* reset the IP to make sure it's in reset state. */\n  RESET_PeripheralReset(kUSB1H_RST_SHIFT_RSTn);\n  RESET_PeripheralReset(kUSB1D_RST_SHIFT_RSTn);\n  RESET_PeripheralReset(kUSB1RAM_RST_SHIFT_RSTn);\n\n  if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1) {\n    /* According to reference manual, device mode setting has to be set by access usb host register */\n    CLOCK_EnableClock(kCLOCK_Usbh1); // enable usb0 host clock\n\n    USBHSH->PORTMODE = USBHSH_PORTMODE_SW_PDCOM_MASK; // Put PHY powerdown under software control\n    USBHSH->PORTMODE |= USBHSH_PORTMODE_DEV_ENABLE_MASK;\n\n    CLOCK_DisableClock(kCLOCK_Usbh1); // disable usb0 host clock\n    /* enable USB Device clock */\n    CLOCK_EnableUsbhs0DeviceClock(kCLOCK_UsbSrcUsbPll, 0U);\n  } else {\n  #ifdef USBHS_POWER_PORT\n    /* Configure USB1 Power Switch Pin */\n    IOCON_PinMuxSet(IOCON, USBHS_POWER_PORT, USBHS_POWER_PIN, IOCON_PIO_DIG_FUNC0_EN);\n\n    gpio_pin_config_t const power_pin_config = {kGPIO_DigitalOutput, USBHS_POWER_STATE_ON};\n    GPIO_PinInit(GPIO, USBHS_POWER_PORT, USBHS_POWER_PIN, &power_pin_config);\n  #endif\n    CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUsbPll, 0U);\n  }\n  #endif\n#else\n  IOCON_PinMuxSet(IOCON, USB0_VBUS_PINMUX);\n  // LPC5411x series only has full speed device\n  POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY); // Turn on USB Phy\n  CLOCK_EnableUsbfs0Clock(kCLOCK_UsbSrcFro, CLOCK_GetFreq(kCLOCK_FroHf)); /* enable USB IP clock */\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinWrite(GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  // active low\n  return BUTTON_STATE_ACTIVE == GPIO_PinRead(GPIO, BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  USART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\n\n#ifndef __ICCARM__\n// Implement _start() since we use linker flag '-nostartfiles'.\n// Requires defined __STARTUP_CLEAR_BSS,\nextern int main(void);\nTU_ATTR_UNUSED void _start(void) {\n  // called by startup code\n  main();\n  while (1) {}\n}\n\n#ifdef __clang__\nvoid\t_exit (int __status) {\n  (void) __status;\n  while (1) {}\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc54/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-sdk)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC54 CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\n\n# default device port to USB1 highspeed, host to USB0 fullspeed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 1)\nendif ()\n\n# port 0 is fullspeed, port 1 is highspeed\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\ncmake_print_variables(RHPORT_DEVICE RHPORT_DEVICE_SPEED RHPORT_HOST RHPORT_HOST_SPEED)\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/${MCU_CORE}_flash.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\nif (NOT DEFINED STARTUP_FILE_GNU)\nset(STARTUP_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/startup_${MCU_CORE}.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\nif (NOT DEFINED LD_FILE_IAR)\n  set(LD_FILE_IAR ${CMAKE_CURRENT_LIST_DIR}/iar/${MCU_CORE}_flash.icf)\nendif ()\n\nif (NOT DEFINED STARTUP_FILE_IAR)\n  set(STARTUP_FILE_IAR ${CMAKE_CURRENT_LIST_DIR}/iar/startup_${MCU_CORE}.s)\nendif ()\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    # driver\n    ${SDK_DIR}/drivers/lpc_gpio/fsl_gpio.c\n    ${SDK_DIR}/drivers/common/fsl_common_arm.c\n    ${SDK_DIR}/drivers/flexcomm/fsl_flexcomm.c\n    ${SDK_DIR}/drivers/flexcomm/usart/fsl_usart.c\n    # mcu\n    ${SDK_DIR}/devices/${MCU_VARIANT}/system_${MCU_CORE}.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_clock.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_power.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_reset.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${TOP}/lib/sct_neopixel\n    # driver\n    ${SDK_DIR}/drivers/common\n    ${SDK_DIR}/drivers/flexcomm\n    ${SDK_DIR}/drivers/flexcomm/usart\n    ${SDK_DIR}/drivers/lpc_iocon\n    ${SDK_DIR}/drivers/lpc_gpio\n    ${SDK_DIR}/drivers/lpuart\n    ${SDK_DIR}/drivers/sctimer\n    # mcu\n    ${SDK_DIR}/devices/${MCU_VARIANT}\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CFG_TUSB_MEM_ALIGN=TU_ATTR_ALIGNED\\(64\\)\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    __STARTUP_CLEAR_BSS\n    )\n\n # Port 0 is Fullspeed, Port 1 is Highspeed. Port1 controller can only access USB_SRAM\n  if (RHPORT_DEVICE EQUAL 1)\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      [=[CFG_TUD_MEM_SECTION=__attribute__((section(\"m_usb_global\")))]=]\n      )\n  endif ()\n  if (RHPORT_HOST EQUAL 1)\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      [=[CFG_TUH_MEM_SECTION=__attribute__((section(\"m_usb_global\")))]=]\n      CFG_TUH_USBIP_IP3516=1\n      )\n  endif ()\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC54)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (RHPORT_HOST EQUAL 0)\n    target_sources(${TARGET} PUBLIC\n      ${TOP}/src/portable/ohci/ohci.c\n      )\n  elseif (RHPORT_HOST EQUAL 1)\n    target_sources(${TARGET} PUBLIC\n      ${TOP}/src/portable/nxp/lpc_ip3516/hcd_lpc_ip3516.c\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      -nostartfiles\n      \"LINKER:--defsym=__stack_size__=0x1000\"\n      \"LINKER:--defsym=__heap_size__=0\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      \"LINKER:--config_def=__stack_size__=0x1000\"\n      \"LINKER:--config_def=__heap_size__=0\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\n  #family_flash_pyocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc54/family.mk",
    "content": "SDK_DIR = hw/mcu/nxp/mcux-sdk\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\nMCU_DIR = $(SDK_DIR)/devices/$(MCU_VARIANT)\n\nCFLAGS += \\\n  -flto \\\n  -D__STARTUP_CLEAR_BSS \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC54XXX \\\n  -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' \\\n\nifeq ($(PORT), 1)\n  $(info \"PORT1 High Speed\")\n  CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n  CFLAGS += -DBOARD_TUD_RHPORT=1\n  # LPC55 Highspeed Port1 can only write to USB_SRAM region\n  CFLAGS += -DCFG_TUSB_MEM_SECTION='__attribute__((section(\"m_usb_global\")))'\nelse\n  $(info \"PORT0 Full Speed\")\nendif\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c \\\n\t$(MCU_DIR)/system_$(MCU_CORE).c \\\n\t$(MCU_DIR)/drivers/fsl_clock.c \\\n\t$(MCU_DIR)/drivers/fsl_power.c \\\n\t$(MCU_DIR)/drivers/fsl_reset.c \\\n\t$(SDK_DIR)/drivers/lpc_gpio/fsl_gpio.c \\\n\t$(SDK_DIR)/drivers/flexcomm/fsl_flexcomm.c \\\n\t$(SDK_DIR)/drivers/flexcomm/usart/fsl_usart.c \\\n\t$(SDK_DIR)/drivers/common/fsl_common_arm.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(MCU_DIR) \\\n\t$(TOP)/$(MCU_DIR)/drivers \\\n\t$(TOP)/$(SDK_DIR)/drivers/common \\\n\t$(TOP)/$(SDK_DIR)/drivers/flexcomm \\\n\t$(TOP)/$(SDK_DIR)/drivers/flexcomm/usart \\\n\t$(TOP)/$(SDK_DIR)/drivers/lpc_iocon \\\n\t$(TOP)/$(SDK_DIR)/drivers/lpc_gpio\n\nSRC_S += $(MCU_DIR)/gcc/startup_$(MCU_CORE).S\n"
  },
  {
    "path": "hw/bsp/lpc54/iar/LPC54608_flash.icf",
    "content": "/*\n** ###################################################################\n**     Processors:          LPC54608J512BD208\n**                          LPC54608J512ET180\n**\n**     Compiler:            IAR ANSI C/C++ Compiler for ARM\n**     Reference manual:    LPC546xx User manual Rev.1.9  5 June 2017\n**     Version:             rev. 1.2, 2017-06-08\n**     Build:               b241125\n**\n**     Abstract:\n**         Linker file for the IAR ANSI C/C++ Compiler for ARM\n**\n**     Copyright 2016 Freescale Semiconductor, Inc.\n**     Copyright 2016-2024 NXP\n**     SPDX-License-Identifier: BSD-3-Clause\n**\n**     http:                 www.nxp.com\n**     mail:                 support@nxp.com\n**\n** ###################################################################\n*/\n\ndefine symbol m_interrupts_start       = 0x00000000;\ndefine symbol m_interrupts_end         = 0x000003FF;\n\ndefine symbol m_text_start             = 0x00000400;\ndefine symbol m_text_end               = 0x0007FFFF;\n\ndefine symbol m_data_start             = 0x20000000;\ndefine symbol m_data_end               = 0x20027FFF;\n\ndefine symbol m_usb_sram_start         = 0x40100000;\ndefine symbol m_usb_sram_end           = 0x40101FFF;\n\n/* USB BDT size */\ndefine symbol usb_bdt_size             = 0x0;\n/* Sizes */\nif (isdefinedsymbol(__stack_size__)) {\n  define symbol __size_cstack__        = __stack_size__;\n} else {\n  define symbol __size_cstack__        = 0x0400;\n}\n\nif (isdefinedsymbol(__heap_size__)) {\n  define symbol __size_heap__          = __heap_size__;\n} else {\n  define symbol __size_heap__          = 0x0400;\n}\n\n\ndefine memory mem with size = 4G;\ndefine region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]\n                          | mem:[from m_text_start to m_text_end];\ndefine region DATA_region = mem:[from m_data_start to m_data_end-__size_cstack__];\ndefine region CSTACK_region = mem:[from m_data_end-__size_cstack__+1 to m_data_end];\n\ndefine block CSTACK    with alignment = 8, size = __size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __size_heap__     { };\ndefine block RW        { readwrite };\ndefine block ZI        { zi };\n\n/* regions for USB */\ndefine region USB_BDT_region = mem:[from m_usb_sram_start to m_usb_sram_start + usb_bdt_size - 1];\ndefine region USB_SRAM_region = mem:[from m_usb_sram_start + usb_bdt_size to m_usb_sram_end];\nplace in USB_BDT_region                     { section m_usb_bdt };\nplace in USB_SRAM_region                    { section m_usb_global };\n\ninitialize by copy { readwrite, section .textrw };\n\nif (isdefinedsymbol(__USE_DLIB_PERTHREAD))\n{\n  /* Required in a multi-threaded application */\n  initialize by copy with packing = none { section __DLIB_PERTHREAD };\n}\n\ndo not initialize  { section .noinit, section m_usb_bdt, section m_usb_global };\n\nplace at address mem: m_interrupts_start    { readonly section .intvec };\nplace in TEXT_region                        { readonly };\nplace in DATA_region                        { block RW };\nplace in DATA_region                        { block ZI };\nplace in DATA_region                        { last block HEAP };\nplace in CSTACK_region                      { block CSTACK };\n"
  },
  {
    "path": "hw/bsp/lpc54/iar/LPC54628_flash.icf",
    "content": "/*\n** ###################################################################\n**     Processor:           LPC54628J512ET180\n**     Compiler:            IAR ANSI C/C++ Compiler for ARM\n**     Reference manual:    LPC546xx User manual Rev.1.9  5 June 2017\n**     Version:             rev. 1.2, 2017-06-08\n**     Build:               b241125\n**\n**     Abstract:\n**         Linker file for the IAR ANSI C/C++ Compiler for ARM\n**\n**     Copyright 2016 Freescale Semiconductor, Inc.\n**     Copyright 2016-2024 NXP\n**     SPDX-License-Identifier: BSD-3-Clause\n**\n**     http:                 www.nxp.com\n**     mail:                 support@nxp.com\n**\n** ###################################################################\n*/\n\ndefine symbol m_interrupts_start       = 0x00000000;\ndefine symbol m_interrupts_end         = 0x000003FF;\n\ndefine symbol m_text_start             = 0x00000400;\ndefine symbol m_text_end               = 0x0007FFFF;\n\ndefine symbol m_data_start             = 0x20000000;\ndefine symbol m_data_end               = 0x20027FFF;\n\ndefine symbol m_usb_sram_start         = 0x40100000;\ndefine symbol m_usb_sram_end           = 0x40101FFF;\n\n/* USB BDT size */\ndefine symbol usb_bdt_size             = 0x0;\n/* Sizes */\nif (isdefinedsymbol(__stack_size__)) {\n  define symbol __size_cstack__        = __stack_size__;\n} else {\n  define symbol __size_cstack__        = 0x0400;\n}\n\nif (isdefinedsymbol(__heap_size__)) {\n  define symbol __size_heap__          = __heap_size__;\n} else {\n  define symbol __size_heap__          = 0x0400;\n}\n\n\ndefine memory mem with size = 4G;\ndefine region TEXT_region = mem:[from m_interrupts_start to m_interrupts_end]\n                          | mem:[from m_text_start to m_text_end];\ndefine region DATA_region = mem:[from m_data_start to m_data_end-__size_cstack__];\ndefine region CSTACK_region = mem:[from m_data_end-__size_cstack__+1 to m_data_end];\n\ndefine block CSTACK    with alignment = 8, size = __size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __size_heap__     { };\ndefine block RW        { readwrite };\ndefine block ZI        { zi };\n\n/* regions for USB */\ndefine region USB_BDT_region = mem:[from m_usb_sram_start to m_usb_sram_start + usb_bdt_size - 1];\ndefine region USB_SRAM_region = mem:[from m_usb_sram_start + usb_bdt_size to m_usb_sram_end];\nplace in USB_BDT_region                     { section m_usb_bdt };\nplace in USB_SRAM_region                    { section m_usb_global };\n\ninitialize by copy { readwrite, section .textrw };\n\nif (isdefinedsymbol(__USE_DLIB_PERTHREAD))\n{\n  /* Required in a multi-threaded application */\n  initialize by copy with packing = none { section __DLIB_PERTHREAD };\n}\n\ndo not initialize  { section .noinit, section m_usb_bdt, section m_usb_global };\n\nplace at address mem: m_interrupts_start    { readonly section .intvec };\nplace in TEXT_region                        { readonly };\nplace in DATA_region                        { block RW };\nplace in DATA_region                        { block ZI };\nplace in DATA_region                        { last block HEAP };\nplace in CSTACK_region                      { block CSTACK };\n"
  },
  {
    "path": "hw/bsp/lpc54/iar/startup_LPC54608.s",
    "content": "; -------------------------------------------------------------------------\n;  @file:    startup_LPC54608.s\n;  @purpose: CMSIS Cortex-M4 Core Device Startup File\n;            LPC54608\n;  @version: 2.0\n;  @date:    2024-10-29\n;  @build:   b250521\n; -------------------------------------------------------------------------\n;\n; Copyright 1997-2016 Freescale Semiconductor, Inc.\n; Copyright 2016-2025 NXP\n; SPDX-License-Identifier: BSD-3-Clause\n;\n; The modules in this file are included in the libraries, and may be replaced\n; by any user-defined modules that define the PUBLIC symbol _program_start or\n; a user defined start symbol.\n; To override the cstartup defined in the library, simply add your modified\n; version to the workbench project.\n;\n; The vector table is normally located at address 0.\n; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.\n; The name \"__vector_table\" has special meaning for C-SPY:\n; it is where the SP start value is found, and the NVIC vector\n; table register (VTOR) is initialized to this address if != 0.\n;\n; Cortex-M version\n;\n\n        MODULE  ?cstartup\n\n        ;; Forward declaration of sections.\n        SECTION CSTACK:DATA:NOROOT(3)\n\n        SECTION .intvec:CODE:NOROOT(2)\n\n        EXTERN  __iar_program_start\n        EXTERN  SystemInit\n        PUBLIC  __vector_table\n        PUBLIC  __vector_table_0x1c\n        PUBLIC  __Vectors\n        PUBLIC  __Vectors_End\n        PUBLIC  __Vectors_Size\n\n        DATA\n\n__iar_init$$done:              ; The vector table is not needed\n                      ; until after copy initialization is done\n\n__vector_table\n        DCD     sfe(CSTACK)\n        DCD     Reset_Handler\n\n        DCD     NMI_Handler                                   ;NMI Handler\n        DCD     HardFault_Handler                             ;Hard Fault Handler\n        DCD     MemManage_Handler                             ;MPU Fault Handler\n        DCD     BusFault_Handler                              ;Bus Fault Handler\n        DCD     UsageFault_Handler                            ;Usage Fault Handler\n__vector_table_0x1c\n        DCD     0                                             ;Reserved\n        DCD     0xFFFFFFFF                                    ;ECRP\n        DCD     0                                             ;Reserved\n        DCD     0                                             ;Reserved\n        DCD     SVC_Handler                                   ;SVCall Handler\n        DCD     DebugMon_Handler                              ;Debug Monitor Handler\n        DCD     0                                             ;Reserved\n        DCD     PendSV_Handler                                ;PendSV Handler\n        DCD     SysTick_Handler                               ;SysTick Handler\n\n                                                              ;External Interrupts\n        DCD     WDT_BOD_IRQHandler                            ;Windowed watchdog timer, Brownout detect\n        DCD     DMA0_IRQHandler                               ;DMA controller\n        DCD     GINT0_IRQHandler                              ;GPIO group 0\n        DCD     GINT1_IRQHandler                              ;GPIO group 1\n        DCD     PIN_INT0_IRQHandler                           ;Pin interrupt 0 or pattern match engine slice 0\n        DCD     PIN_INT1_IRQHandler                           ;Pin interrupt 1or pattern match engine slice 1\n        DCD     PIN_INT2_IRQHandler                           ;Pin interrupt 2 or pattern match engine slice 2\n        DCD     PIN_INT3_IRQHandler                           ;Pin interrupt 3 or pattern match engine slice 3\n        DCD     UTICK0_IRQHandler                             ;Micro-tick Timer\n        DCD     MRT0_IRQHandler                               ;Multi-rate timer\n        DCD     CTIMER0_IRQHandler                            ;Standard counter/timer CTIMER0\n        DCD     CTIMER1_IRQHandler                            ;Standard counter/timer CTIMER1\n        DCD     SCT0_IRQHandler                               ;SCTimer/PWM\n        DCD     CTIMER3_IRQHandler                            ;Standard counter/timer CTIMER3\n        DCD     FLEXCOMM0_IRQHandler                          ;Flexcomm Interface 0 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM1_IRQHandler                          ;Flexcomm Interface 1 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM2_IRQHandler                          ;Flexcomm Interface 2 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM3_IRQHandler                          ;Flexcomm Interface 3 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM4_IRQHandler                          ;Flexcomm Interface 4 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM5_IRQHandler                          ;Flexcomm Interface 5 (USART, SPI, I2C,, FLEXCOMM)\n        DCD     FLEXCOMM6_IRQHandler                          ;Flexcomm Interface 6 (USART, SPI, I2C, I2S,, FLEXCOMM)\n        DCD     FLEXCOMM7_IRQHandler                          ;Flexcomm Interface 7 (USART, SPI, I2C, I2S,, FLEXCOMM)\n        DCD     ADC0_SEQA_IRQHandler                          ;ADC0 sequence A completion.\n        DCD     ADC0_SEQB_IRQHandler                          ;ADC0 sequence B completion.\n        DCD     ADC0_THCMP_IRQHandler                         ;ADC0 threshold compare and error.\n        DCD     DMIC0_IRQHandler                              ;Digital microphone and DMIC subsystem\n        DCD     HWVAD0_IRQHandler                             ;Hardware Voice Activity Detector\n        DCD     USB0_NEEDCLK_IRQHandler                       ;USB Activity Wake-up Interrupt\n        DCD     USB0_IRQHandler                               ;USB device\n        DCD     RTC_IRQHandler                                ;RTC alarm and wake-up interrupts\n        DCD     Reserved46_IRQHandler                         ;Reserved interrupt\n        DCD     Reserved47_IRQHandler                         ;Reserved interrupt\n        DCD     PIN_INT4_IRQHandler                           ;Pin interrupt 4 or pattern match engine slice 4 int\n        DCD     PIN_INT5_IRQHandler                           ;Pin interrupt 5 or pattern match engine slice 5 int\n        DCD     PIN_INT6_IRQHandler                           ;Pin interrupt 6 or pattern match engine slice 6 int\n        DCD     PIN_INT7_IRQHandler                           ;Pin interrupt 7 or pattern match engine slice 7 int\n        DCD     CTIMER2_IRQHandler                            ;Standard counter/timer CTIMER2\n        DCD     CTIMER4_IRQHandler                            ;Standard counter/timer CTIMER4\n        DCD     RIT_IRQHandler                                ;Repetitive Interrupt Timer\n        DCD     SPIFI0_IRQHandler                             ;SPI flash interface\n        DCD     FLEXCOMM8_IRQHandler                          ;Flexcomm Interface 8 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM9_IRQHandler                          ;Flexcomm Interface 9 (USART, SPI, I2C, FLEXCOMM)\n        DCD     SDIO_IRQHandler                               ;SD/MMC\n        DCD     CAN0_IRQ0_IRQHandler                          ;CAN0 interrupt0\n        DCD     CAN0_IRQ1_IRQHandler                          ;CAN0 interrupt1\n        DCD     CAN1_IRQ0_IRQHandler                          ;CAN1 interrupt0\n        DCD     CAN1_IRQ1_IRQHandler                          ;CAN1 interrupt1\n        DCD     USB1_IRQHandler                               ;USB1 interrupt\n        DCD     USB1_NEEDCLK_IRQHandler                       ;USB1 activity\n        DCD     ETHERNET_IRQHandler                           ;Ethernet\n        DCD     ETHERNET_PMT_IRQHandler                       ;Ethernet power management interrupt\n        DCD     ETHERNET_MACLP_IRQHandler                     ;Ethernet MAC interrupt\n        DCD     EEPROM_IRQHandler                             ;EEPROM interrupt\n        DCD     LCD_IRQHandler                                ;LCD interrupt\n        DCD     SHA_IRQHandler                                ;SHA interrupt\n        DCD     SMARTCARD0_IRQHandler                         ;Smart card 0 interrupt\n        DCD     SMARTCARD1_IRQHandler                         ;Smart card 1 interrupt\n__Vectors_End\n\n__Vectors       EQU   __vector_table\n__Vectors_Size  EQU   __Vectors_End - __Vectors\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; Default interrupt handlers.\n;;\n        THUMB\n\n        PUBWEAK Reset_Handler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nReset_Handler\n        MOVS    r0,#56\n        LDR     r1, =0x40000220\n        STR     r0, [r1]           ;Enable SRAM clock used by Stack\n        LDR     R0, =SystemInit\n        BLX     R0\n        LDR     R0, =__iar_program_start\n        BX      R0\n\n        PUBWEAK NMI_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nNMI_Handler\n        B .\n\n        PUBWEAK HardFault_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nHardFault_Handler\n        B .\n\n        PUBWEAK MemManage_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nMemManage_Handler\n        B .\n\n        PUBWEAK BusFault_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nBusFault_Handler\n        B .\n\n        PUBWEAK UsageFault_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nUsageFault_Handler\n        B .\n\n        PUBWEAK SVC_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nSVC_Handler\n        B .\n\n        PUBWEAK DebugMon_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nDebugMon_Handler\n        B .\n\n        PUBWEAK PendSV_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nPendSV_Handler\n        B .\n\n        PUBWEAK SysTick_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nSysTick_Handler\n        B .\n\n        PUBWEAK WDT_BOD_IRQHandler\n        PUBWEAK WDT_BOD_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nWDT_BOD_IRQHandler\n        LDR     R0, =WDT_BOD_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK DMA0_IRQHandler\n        PUBWEAK DMA0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nDMA0_IRQHandler\n        LDR     R0, =DMA0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK GINT0_IRQHandler\n        PUBWEAK GINT0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nGINT0_IRQHandler\n        LDR     R0, =GINT0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK GINT1_IRQHandler\n        PUBWEAK GINT1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nGINT1_IRQHandler\n        LDR     R0, =GINT1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT0_IRQHandler\n        PUBWEAK PIN_INT0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT0_IRQHandler\n        LDR     R0, =PIN_INT0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT1_IRQHandler\n        PUBWEAK PIN_INT1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT1_IRQHandler\n        LDR     R0, =PIN_INT1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT2_IRQHandler\n        PUBWEAK PIN_INT2_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT2_IRQHandler\n        LDR     R0, =PIN_INT2_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT3_IRQHandler\n        PUBWEAK PIN_INT3_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT3_IRQHandler\n        LDR     R0, =PIN_INT3_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK UTICK0_IRQHandler\n        PUBWEAK UTICK0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUTICK0_IRQHandler\n        LDR     R0, =UTICK0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK MRT0_IRQHandler\n        PUBWEAK MRT0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nMRT0_IRQHandler\n        LDR     R0, =MRT0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER0_IRQHandler\n        PUBWEAK CTIMER0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER0_IRQHandler\n        LDR     R0, =CTIMER0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER1_IRQHandler\n        PUBWEAK CTIMER1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER1_IRQHandler\n        LDR     R0, =CTIMER1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SCT0_IRQHandler\n        PUBWEAK SCT0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSCT0_IRQHandler\n        LDR     R0, =SCT0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER3_IRQHandler\n        PUBWEAK CTIMER3_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER3_IRQHandler\n        LDR     R0, =CTIMER3_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM0_IRQHandler\n        PUBWEAK FLEXCOMM0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM0_IRQHandler\n        LDR     R0, =FLEXCOMM0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM1_IRQHandler\n        PUBWEAK FLEXCOMM1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM1_IRQHandler\n        LDR     R0, =FLEXCOMM1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM2_IRQHandler\n        PUBWEAK FLEXCOMM2_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM2_IRQHandler\n        LDR     R0, =FLEXCOMM2_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM3_IRQHandler\n        PUBWEAK FLEXCOMM3_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM3_IRQHandler\n        LDR     R0, =FLEXCOMM3_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM4_IRQHandler\n        PUBWEAK FLEXCOMM4_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM4_IRQHandler\n        LDR     R0, =FLEXCOMM4_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM5_IRQHandler\n        PUBWEAK FLEXCOMM5_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM5_IRQHandler\n        LDR     R0, =FLEXCOMM5_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM6_IRQHandler\n        PUBWEAK FLEXCOMM6_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM6_IRQHandler\n        LDR     R0, =FLEXCOMM6_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM7_IRQHandler\n        PUBWEAK FLEXCOMM7_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM7_IRQHandler\n        LDR     R0, =FLEXCOMM7_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ADC0_SEQA_IRQHandler\n        PUBWEAK ADC0_SEQA_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nADC0_SEQA_IRQHandler\n        LDR     R0, =ADC0_SEQA_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ADC0_SEQB_IRQHandler\n        PUBWEAK ADC0_SEQB_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nADC0_SEQB_IRQHandler\n        LDR     R0, =ADC0_SEQB_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ADC0_THCMP_IRQHandler\n        PUBWEAK ADC0_THCMP_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nADC0_THCMP_IRQHandler\n        LDR     R0, =ADC0_THCMP_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK DMIC0_IRQHandler\n        PUBWEAK DMIC0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nDMIC0_IRQHandler\n        LDR     R0, =DMIC0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK HWVAD0_IRQHandler\n        PUBWEAK HWVAD0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nHWVAD0_IRQHandler\n        LDR     R0, =HWVAD0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK USB0_NEEDCLK_IRQHandler\n        PUBWEAK USB0_NEEDCLK_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUSB0_NEEDCLK_IRQHandler\n        LDR     R0, =USB0_NEEDCLK_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK USB0_IRQHandler\n        PUBWEAK USB0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUSB0_IRQHandler\n        LDR     R0, =USB0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK RTC_IRQHandler\n        PUBWEAK RTC_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nRTC_IRQHandler\n        LDR     R0, =RTC_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK Reserved46_IRQHandler\n        PUBWEAK Reserved46_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nReserved46_IRQHandler\n        LDR     R0, =Reserved46_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK Reserved47_IRQHandler\n        PUBWEAK Reserved47_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nReserved47_IRQHandler\n        LDR     R0, =Reserved47_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT4_IRQHandler\n        PUBWEAK PIN_INT4_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT4_IRQHandler\n        LDR     R0, =PIN_INT4_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT5_IRQHandler\n        PUBWEAK PIN_INT5_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT5_IRQHandler\n        LDR     R0, =PIN_INT5_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT6_IRQHandler\n        PUBWEAK PIN_INT6_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT6_IRQHandler\n        LDR     R0, =PIN_INT6_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT7_IRQHandler\n        PUBWEAK PIN_INT7_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT7_IRQHandler\n        LDR     R0, =PIN_INT7_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER2_IRQHandler\n        PUBWEAK CTIMER2_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER2_IRQHandler\n        LDR     R0, =CTIMER2_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER4_IRQHandler\n        PUBWEAK CTIMER4_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER4_IRQHandler\n        LDR     R0, =CTIMER4_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK RIT_IRQHandler\n        PUBWEAK RIT_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nRIT_IRQHandler\n        LDR     R0, =RIT_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SPIFI0_IRQHandler\n        PUBWEAK SPIFI0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSPIFI0_IRQHandler\n        LDR     R0, =SPIFI0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM8_IRQHandler\n        PUBWEAK FLEXCOMM8_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM8_IRQHandler\n        LDR     R0, =FLEXCOMM8_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM9_IRQHandler\n        PUBWEAK FLEXCOMM9_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM9_IRQHandler\n        LDR     R0, =FLEXCOMM9_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SDIO_IRQHandler\n        PUBWEAK SDIO_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSDIO_IRQHandler\n        LDR     R0, =SDIO_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CAN0_IRQ0_IRQHandler\n        PUBWEAK CAN0_IRQ0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCAN0_IRQ0_IRQHandler\n        LDR     R0, =CAN0_IRQ0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CAN0_IRQ1_IRQHandler\n        PUBWEAK CAN0_IRQ1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCAN0_IRQ1_IRQHandler\n        LDR     R0, =CAN0_IRQ1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CAN1_IRQ0_IRQHandler\n        PUBWEAK CAN1_IRQ0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCAN1_IRQ0_IRQHandler\n        LDR     R0, =CAN1_IRQ0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CAN1_IRQ1_IRQHandler\n        PUBWEAK CAN1_IRQ1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCAN1_IRQ1_IRQHandler\n        LDR     R0, =CAN1_IRQ1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK USB1_IRQHandler\n        PUBWEAK USB1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUSB1_IRQHandler\n        LDR     R0, =USB1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK USB1_NEEDCLK_IRQHandler\n        PUBWEAK USB1_NEEDCLK_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUSB1_NEEDCLK_IRQHandler\n        LDR     R0, =USB1_NEEDCLK_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ETHERNET_IRQHandler\n        PUBWEAK ETHERNET_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nETHERNET_IRQHandler\n        LDR     R0, =ETHERNET_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ETHERNET_PMT_IRQHandler\n        PUBWEAK ETHERNET_PMT_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nETHERNET_PMT_IRQHandler\n        LDR     R0, =ETHERNET_PMT_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ETHERNET_MACLP_IRQHandler\n        PUBWEAK ETHERNET_MACLP_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nETHERNET_MACLP_IRQHandler\n        LDR     R0, =ETHERNET_MACLP_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK EEPROM_IRQHandler\n        PUBWEAK EEPROM_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nEEPROM_IRQHandler\n        LDR     R0, =EEPROM_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK LCD_IRQHandler\n        PUBWEAK LCD_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nLCD_IRQHandler\n        LDR     R0, =LCD_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SHA_IRQHandler\n        PUBWEAK SHA_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSHA_IRQHandler\n        LDR     R0, =SHA_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SMARTCARD0_IRQHandler\n        PUBWEAK SMARTCARD0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSMARTCARD0_IRQHandler\n        LDR     R0, =SMARTCARD0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SMARTCARD1_IRQHandler\n        PUBWEAK SMARTCARD1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSMARTCARD1_IRQHandler\n        LDR     R0, =SMARTCARD1_DriverIRQHandler\n        BX      R0\n\nWDT_BOD_DriverIRQHandler\nDMA0_DriverIRQHandler\nGINT0_DriverIRQHandler\nGINT1_DriverIRQHandler\nPIN_INT0_DriverIRQHandler\nPIN_INT1_DriverIRQHandler\nPIN_INT2_DriverIRQHandler\nPIN_INT3_DriverIRQHandler\nUTICK0_DriverIRQHandler\nMRT0_DriverIRQHandler\nCTIMER0_DriverIRQHandler\nCTIMER1_DriverIRQHandler\nSCT0_DriverIRQHandler\nCTIMER3_DriverIRQHandler\nFLEXCOMM0_DriverIRQHandler\nFLEXCOMM1_DriverIRQHandler\nFLEXCOMM2_DriverIRQHandler\nFLEXCOMM3_DriverIRQHandler\nFLEXCOMM4_DriverIRQHandler\nFLEXCOMM5_DriverIRQHandler\nFLEXCOMM6_DriverIRQHandler\nFLEXCOMM7_DriverIRQHandler\nADC0_SEQA_DriverIRQHandler\nADC0_SEQB_DriverIRQHandler\nADC0_THCMP_DriverIRQHandler\nDMIC0_DriverIRQHandler\nHWVAD0_DriverIRQHandler\nUSB0_NEEDCLK_DriverIRQHandler\nUSB0_DriverIRQHandler\nRTC_DriverIRQHandler\nReserved46_DriverIRQHandler\nReserved47_DriverIRQHandler\nPIN_INT4_DriverIRQHandler\nPIN_INT5_DriverIRQHandler\nPIN_INT6_DriverIRQHandler\nPIN_INT7_DriverIRQHandler\nCTIMER2_DriverIRQHandler\nCTIMER4_DriverIRQHandler\nRIT_DriverIRQHandler\nSPIFI0_DriverIRQHandler\nFLEXCOMM8_DriverIRQHandler\nFLEXCOMM9_DriverIRQHandler\nSDIO_DriverIRQHandler\nCAN0_IRQ0_DriverIRQHandler\nCAN0_IRQ1_DriverIRQHandler\nCAN1_IRQ0_DriverIRQHandler\nCAN1_IRQ1_DriverIRQHandler\nUSB1_DriverIRQHandler\nUSB1_NEEDCLK_DriverIRQHandler\nETHERNET_DriverIRQHandler\nETHERNET_PMT_DriverIRQHandler\nETHERNET_MACLP_DriverIRQHandler\nEEPROM_DriverIRQHandler\nLCD_DriverIRQHandler\nSHA_DriverIRQHandler\nSMARTCARD0_DriverIRQHandler\nSMARTCARD1_DriverIRQHandler\nDefaultISR\n        B .\n\n        END\n"
  },
  {
    "path": "hw/bsp/lpc54/iar/startup_LPC54628.s",
    "content": "; -------------------------------------------------------------------------\n;  @file:    startup_LPC54628.s\n;  @purpose: CMSIS Cortex-M4 Core Device Startup File\n;            LPC54628\n;  @version: 2.0\n;  @date:    2024-10-29\n;  @build:   b250521\n; -------------------------------------------------------------------------\n;\n; Copyright 1997-2016 Freescale Semiconductor, Inc.\n; Copyright 2016-2025 NXP\n; SPDX-License-Identifier: BSD-3-Clause\n;\n; The modules in this file are included in the libraries, and may be replaced\n; by any user-defined modules that define the PUBLIC symbol _program_start or\n; a user defined start symbol.\n; To override the cstartup defined in the library, simply add your modified\n; version to the workbench project.\n;\n; The vector table is normally located at address 0.\n; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.\n; The name \"__vector_table\" has special meaning for C-SPY:\n; it is where the SP start value is found, and the NVIC vector\n; table register (VTOR) is initialized to this address if != 0.\n;\n; Cortex-M version\n;\n\n        MODULE  ?cstartup\n\n        ;; Forward declaration of sections.\n        SECTION CSTACK:DATA:NOROOT(3)\n\n        SECTION .intvec:CODE:NOROOT(2)\n\n        EXTERN  __iar_program_start\n        EXTERN  SystemInit\n        PUBLIC  __vector_table\n        PUBLIC  __vector_table_0x1c\n        PUBLIC  __Vectors\n        PUBLIC  __Vectors_End\n        PUBLIC  __Vectors_Size\n\n        DATA\n\n__iar_init$$done:              ; The vector table is not needed\n                      ; until after copy initialization is done\n\n__vector_table\n        DCD     sfe(CSTACK)\n        DCD     Reset_Handler\n\n        DCD     NMI_Handler                                   ;NMI Handler\n        DCD     HardFault_Handler                             ;Hard Fault Handler\n        DCD     MemManage_Handler                             ;MPU Fault Handler\n        DCD     BusFault_Handler                              ;Bus Fault Handler\n        DCD     UsageFault_Handler                            ;Usage Fault Handler\n__vector_table_0x1c\n        DCD     0                                             ;Reserved\n        DCD     0xFFFFFFFF                                    ;ECRP\n        DCD     0                                             ;Reserved\n        DCD     0                                             ;Reserved\n        DCD     SVC_Handler                                   ;SVCall Handler\n        DCD     DebugMon_Handler                              ;Debug Monitor Handler\n        DCD     0                                             ;Reserved\n        DCD     PendSV_Handler                                ;PendSV Handler\n        DCD     SysTick_Handler                               ;SysTick Handler\n\n                                                              ;External Interrupts\n        DCD     WDT_BOD_IRQHandler                            ;Windowed watchdog timer, Brownout detect\n        DCD     DMA0_IRQHandler                               ;DMA controller\n        DCD     GINT0_IRQHandler                              ;GPIO group 0\n        DCD     GINT1_IRQHandler                              ;GPIO group 1\n        DCD     PIN_INT0_IRQHandler                           ;Pin interrupt 0 or pattern match engine slice 0\n        DCD     PIN_INT1_IRQHandler                           ;Pin interrupt 1or pattern match engine slice 1\n        DCD     PIN_INT2_IRQHandler                           ;Pin interrupt 2 or pattern match engine slice 2\n        DCD     PIN_INT3_IRQHandler                           ;Pin interrupt 3 or pattern match engine slice 3\n        DCD     UTICK0_IRQHandler                             ;Micro-tick Timer\n        DCD     MRT0_IRQHandler                               ;Multi-rate timer\n        DCD     CTIMER0_IRQHandler                            ;Standard counter/timer CTIMER0\n        DCD     CTIMER1_IRQHandler                            ;Standard counter/timer CTIMER1\n        DCD     SCT0_IRQHandler                               ;SCTimer/PWM\n        DCD     CTIMER3_IRQHandler                            ;Standard counter/timer CTIMER3\n        DCD     FLEXCOMM0_IRQHandler                          ;Flexcomm Interface 0 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM1_IRQHandler                          ;Flexcomm Interface 1 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM2_IRQHandler                          ;Flexcomm Interface 2 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM3_IRQHandler                          ;Flexcomm Interface 3 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM4_IRQHandler                          ;Flexcomm Interface 4 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM5_IRQHandler                          ;Flexcomm Interface 5 (USART, SPI, I2C,, FLEXCOMM)\n        DCD     FLEXCOMM6_IRQHandler                          ;Flexcomm Interface 6 (USART, SPI, I2C, I2S,, FLEXCOMM)\n        DCD     FLEXCOMM7_IRQHandler                          ;Flexcomm Interface 7 (USART, SPI, I2C, I2S,, FLEXCOMM)\n        DCD     ADC0_SEQA_IRQHandler                          ;ADC0 sequence A completion.\n        DCD     ADC0_SEQB_IRQHandler                          ;ADC0 sequence B completion.\n        DCD     ADC0_THCMP_IRQHandler                         ;ADC0 threshold compare and error.\n        DCD     DMIC0_IRQHandler                              ;Digital microphone and DMIC subsystem\n        DCD     HWVAD0_IRQHandler                             ;Hardware Voice Activity Detector\n        DCD     USB0_NEEDCLK_IRQHandler                       ;USB Activity Wake-up Interrupt\n        DCD     USB0_IRQHandler                               ;USB device\n        DCD     RTC_IRQHandler                                ;RTC alarm and wake-up interrupts\n        DCD     Reserved46_IRQHandler                         ;Reserved interrupt\n        DCD     Reserved47_IRQHandler                         ;Reserved interrupt\n        DCD     PIN_INT4_IRQHandler                           ;Pin interrupt 4 or pattern match engine slice 4 int\n        DCD     PIN_INT5_IRQHandler                           ;Pin interrupt 5 or pattern match engine slice 5 int\n        DCD     PIN_INT6_IRQHandler                           ;Pin interrupt 6 or pattern match engine slice 6 int\n        DCD     PIN_INT7_IRQHandler                           ;Pin interrupt 7 or pattern match engine slice 7 int\n        DCD     CTIMER2_IRQHandler                            ;Standard counter/timer CTIMER2\n        DCD     CTIMER4_IRQHandler                            ;Standard counter/timer CTIMER4\n        DCD     RIT_IRQHandler                                ;Repetitive Interrupt Timer\n        DCD     SPIFI0_IRQHandler                             ;SPI flash interface\n        DCD     FLEXCOMM8_IRQHandler                          ;Flexcomm Interface 8 (USART, SPI, I2C, FLEXCOMM)\n        DCD     FLEXCOMM9_IRQHandler                          ;Flexcomm Interface 9 (USART, SPI, I2C, FLEXCOMM)\n        DCD     SDIO_IRQHandler                               ;SD/MMC\n        DCD     CAN0_IRQ0_IRQHandler                          ;CAN0 interrupt0\n        DCD     CAN0_IRQ1_IRQHandler                          ;CAN0 interrupt1\n        DCD     CAN1_IRQ0_IRQHandler                          ;CAN1 interrupt0\n        DCD     CAN1_IRQ1_IRQHandler                          ;CAN1 interrupt1\n        DCD     USB1_IRQHandler                               ;USB1 interrupt\n        DCD     USB1_NEEDCLK_IRQHandler                       ;USB1 activity\n        DCD     ETHERNET_IRQHandler                           ;Ethernet\n        DCD     ETHERNET_PMT_IRQHandler                       ;Ethernet power management interrupt\n        DCD     ETHERNET_MACLP_IRQHandler                     ;Ethernet MAC interrupt\n        DCD     EEPROM_IRQHandler                             ;EEPROM interrupt\n        DCD     LCD_IRQHandler                                ;LCD interrupt\n        DCD     SHA_IRQHandler                                ;SHA interrupt\n        DCD     SMARTCARD0_IRQHandler                         ;Smart card 0 interrupt\n        DCD     SMARTCARD1_IRQHandler                         ;Smart card 1 interrupt\n__Vectors_End\n\n__Vectors       EQU   __vector_table\n__Vectors_Size  EQU   __Vectors_End - __Vectors\n\n\n;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n;;\n;; Default interrupt handlers.\n;;\n        THUMB\n\n        PUBWEAK Reset_Handler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nReset_Handler\n        MOVS    r0,#56\n        LDR     r1, =0x40000220\n        STR     r0, [r1]           ;Enable SRAM clock used by Stack\n        LDR     R0, =SystemInit\n        BLX     R0\n        LDR     R0, =__iar_program_start\n        BX      R0\n\n        PUBWEAK NMI_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nNMI_Handler\n        B .\n\n        PUBWEAK HardFault_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nHardFault_Handler\n        B .\n\n        PUBWEAK MemManage_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nMemManage_Handler\n        B .\n\n        PUBWEAK BusFault_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nBusFault_Handler\n        B .\n\n        PUBWEAK UsageFault_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nUsageFault_Handler\n        B .\n\n        PUBWEAK SVC_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nSVC_Handler\n        B .\n\n        PUBWEAK DebugMon_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nDebugMon_Handler\n        B .\n\n        PUBWEAK PendSV_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nPendSV_Handler\n        B .\n\n        PUBWEAK SysTick_Handler\n        SECTION .text:CODE:REORDER:NOROOT(1)\nSysTick_Handler\n        B .\n\n        PUBWEAK WDT_BOD_IRQHandler\n        PUBWEAK WDT_BOD_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nWDT_BOD_IRQHandler\n        LDR     R0, =WDT_BOD_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK DMA0_IRQHandler\n        PUBWEAK DMA0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nDMA0_IRQHandler\n        LDR     R0, =DMA0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK GINT0_IRQHandler\n        PUBWEAK GINT0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nGINT0_IRQHandler\n        LDR     R0, =GINT0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK GINT1_IRQHandler\n        PUBWEAK GINT1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nGINT1_IRQHandler\n        LDR     R0, =GINT1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT0_IRQHandler\n        PUBWEAK PIN_INT0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT0_IRQHandler\n        LDR     R0, =PIN_INT0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT1_IRQHandler\n        PUBWEAK PIN_INT1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT1_IRQHandler\n        LDR     R0, =PIN_INT1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT2_IRQHandler\n        PUBWEAK PIN_INT2_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT2_IRQHandler\n        LDR     R0, =PIN_INT2_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT3_IRQHandler\n        PUBWEAK PIN_INT3_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT3_IRQHandler\n        LDR     R0, =PIN_INT3_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK UTICK0_IRQHandler\n        PUBWEAK UTICK0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUTICK0_IRQHandler\n        LDR     R0, =UTICK0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK MRT0_IRQHandler\n        PUBWEAK MRT0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nMRT0_IRQHandler\n        LDR     R0, =MRT0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER0_IRQHandler\n        PUBWEAK CTIMER0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER0_IRQHandler\n        LDR     R0, =CTIMER0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER1_IRQHandler\n        PUBWEAK CTIMER1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER1_IRQHandler\n        LDR     R0, =CTIMER1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SCT0_IRQHandler\n        PUBWEAK SCT0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSCT0_IRQHandler\n        LDR     R0, =SCT0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER3_IRQHandler\n        PUBWEAK CTIMER3_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER3_IRQHandler\n        LDR     R0, =CTIMER3_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM0_IRQHandler\n        PUBWEAK FLEXCOMM0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM0_IRQHandler\n        LDR     R0, =FLEXCOMM0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM1_IRQHandler\n        PUBWEAK FLEXCOMM1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM1_IRQHandler\n        LDR     R0, =FLEXCOMM1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM2_IRQHandler\n        PUBWEAK FLEXCOMM2_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM2_IRQHandler\n        LDR     R0, =FLEXCOMM2_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM3_IRQHandler\n        PUBWEAK FLEXCOMM3_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM3_IRQHandler\n        LDR     R0, =FLEXCOMM3_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM4_IRQHandler\n        PUBWEAK FLEXCOMM4_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM4_IRQHandler\n        LDR     R0, =FLEXCOMM4_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM5_IRQHandler\n        PUBWEAK FLEXCOMM5_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM5_IRQHandler\n        LDR     R0, =FLEXCOMM5_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM6_IRQHandler\n        PUBWEAK FLEXCOMM6_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM6_IRQHandler\n        LDR     R0, =FLEXCOMM6_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM7_IRQHandler\n        PUBWEAK FLEXCOMM7_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM7_IRQHandler\n        LDR     R0, =FLEXCOMM7_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ADC0_SEQA_IRQHandler\n        PUBWEAK ADC0_SEQA_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nADC0_SEQA_IRQHandler\n        LDR     R0, =ADC0_SEQA_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ADC0_SEQB_IRQHandler\n        PUBWEAK ADC0_SEQB_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nADC0_SEQB_IRQHandler\n        LDR     R0, =ADC0_SEQB_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ADC0_THCMP_IRQHandler\n        PUBWEAK ADC0_THCMP_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nADC0_THCMP_IRQHandler\n        LDR     R0, =ADC0_THCMP_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK DMIC0_IRQHandler\n        PUBWEAK DMIC0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nDMIC0_IRQHandler\n        LDR     R0, =DMIC0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK HWVAD0_IRQHandler\n        PUBWEAK HWVAD0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nHWVAD0_IRQHandler\n        LDR     R0, =HWVAD0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK USB0_NEEDCLK_IRQHandler\n        PUBWEAK USB0_NEEDCLK_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUSB0_NEEDCLK_IRQHandler\n        LDR     R0, =USB0_NEEDCLK_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK USB0_IRQHandler\n        PUBWEAK USB0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUSB0_IRQHandler\n        LDR     R0, =USB0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK RTC_IRQHandler\n        PUBWEAK RTC_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nRTC_IRQHandler\n        LDR     R0, =RTC_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK Reserved46_IRQHandler\n        PUBWEAK Reserved46_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nReserved46_IRQHandler\n        LDR     R0, =Reserved46_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK Reserved47_IRQHandler\n        PUBWEAK Reserved47_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nReserved47_IRQHandler\n        LDR     R0, =Reserved47_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT4_IRQHandler\n        PUBWEAK PIN_INT4_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT4_IRQHandler\n        LDR     R0, =PIN_INT4_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT5_IRQHandler\n        PUBWEAK PIN_INT5_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT5_IRQHandler\n        LDR     R0, =PIN_INT5_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT6_IRQHandler\n        PUBWEAK PIN_INT6_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT6_IRQHandler\n        LDR     R0, =PIN_INT6_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK PIN_INT7_IRQHandler\n        PUBWEAK PIN_INT7_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nPIN_INT7_IRQHandler\n        LDR     R0, =PIN_INT7_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER2_IRQHandler\n        PUBWEAK CTIMER2_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER2_IRQHandler\n        LDR     R0, =CTIMER2_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CTIMER4_IRQHandler\n        PUBWEAK CTIMER4_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCTIMER4_IRQHandler\n        LDR     R0, =CTIMER4_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK RIT_IRQHandler\n        PUBWEAK RIT_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nRIT_IRQHandler\n        LDR     R0, =RIT_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SPIFI0_IRQHandler\n        PUBWEAK SPIFI0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSPIFI0_IRQHandler\n        LDR     R0, =SPIFI0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM8_IRQHandler\n        PUBWEAK FLEXCOMM8_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM8_IRQHandler\n        LDR     R0, =FLEXCOMM8_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK FLEXCOMM9_IRQHandler\n        PUBWEAK FLEXCOMM9_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nFLEXCOMM9_IRQHandler\n        LDR     R0, =FLEXCOMM9_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SDIO_IRQHandler\n        PUBWEAK SDIO_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSDIO_IRQHandler\n        LDR     R0, =SDIO_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CAN0_IRQ0_IRQHandler\n        PUBWEAK CAN0_IRQ0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCAN0_IRQ0_IRQHandler\n        LDR     R0, =CAN0_IRQ0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CAN0_IRQ1_IRQHandler\n        PUBWEAK CAN0_IRQ1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCAN0_IRQ1_IRQHandler\n        LDR     R0, =CAN0_IRQ1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CAN1_IRQ0_IRQHandler\n        PUBWEAK CAN1_IRQ0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCAN1_IRQ0_IRQHandler\n        LDR     R0, =CAN1_IRQ0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK CAN1_IRQ1_IRQHandler\n        PUBWEAK CAN1_IRQ1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nCAN1_IRQ1_IRQHandler\n        LDR     R0, =CAN1_IRQ1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK USB1_IRQHandler\n        PUBWEAK USB1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUSB1_IRQHandler\n        LDR     R0, =USB1_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK USB1_NEEDCLK_IRQHandler\n        PUBWEAK USB1_NEEDCLK_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nUSB1_NEEDCLK_IRQHandler\n        LDR     R0, =USB1_NEEDCLK_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ETHERNET_IRQHandler\n        PUBWEAK ETHERNET_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nETHERNET_IRQHandler\n        LDR     R0, =ETHERNET_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ETHERNET_PMT_IRQHandler\n        PUBWEAK ETHERNET_PMT_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nETHERNET_PMT_IRQHandler\n        LDR     R0, =ETHERNET_PMT_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK ETHERNET_MACLP_IRQHandler\n        PUBWEAK ETHERNET_MACLP_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nETHERNET_MACLP_IRQHandler\n        LDR     R0, =ETHERNET_MACLP_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK EEPROM_IRQHandler\n        PUBWEAK EEPROM_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nEEPROM_IRQHandler\n        LDR     R0, =EEPROM_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK LCD_IRQHandler\n        PUBWEAK LCD_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nLCD_IRQHandler\n        LDR     R0, =LCD_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SHA_IRQHandler\n        PUBWEAK SHA_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSHA_IRQHandler\n        LDR     R0, =SHA_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SMARTCARD0_IRQHandler\n        PUBWEAK SMARTCARD0_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSMARTCARD0_IRQHandler\n        LDR     R0, =SMARTCARD0_DriverIRQHandler\n        BX      R0\n\n        PUBWEAK SMARTCARD1_IRQHandler\n        PUBWEAK SMARTCARD1_DriverIRQHandler\n        SECTION .text:CODE:REORDER:NOROOT(2)\nSMARTCARD1_IRQHandler\n        LDR     R0, =SMARTCARD1_DriverIRQHandler\n        BX      R0\n\nWDT_BOD_DriverIRQHandler\nDMA0_DriverIRQHandler\nGINT0_DriverIRQHandler\nGINT1_DriverIRQHandler\nPIN_INT0_DriverIRQHandler\nPIN_INT1_DriverIRQHandler\nPIN_INT2_DriverIRQHandler\nPIN_INT3_DriverIRQHandler\nUTICK0_DriverIRQHandler\nMRT0_DriverIRQHandler\nCTIMER0_DriverIRQHandler\nCTIMER1_DriverIRQHandler\nSCT0_DriverIRQHandler\nCTIMER3_DriverIRQHandler\nFLEXCOMM0_DriverIRQHandler\nFLEXCOMM1_DriverIRQHandler\nFLEXCOMM2_DriverIRQHandler\nFLEXCOMM3_DriverIRQHandler\nFLEXCOMM4_DriverIRQHandler\nFLEXCOMM5_DriverIRQHandler\nFLEXCOMM6_DriverIRQHandler\nFLEXCOMM7_DriverIRQHandler\nADC0_SEQA_DriverIRQHandler\nADC0_SEQB_DriverIRQHandler\nADC0_THCMP_DriverIRQHandler\nDMIC0_DriverIRQHandler\nHWVAD0_DriverIRQHandler\nUSB0_NEEDCLK_DriverIRQHandler\nUSB0_DriverIRQHandler\nRTC_DriverIRQHandler\nReserved46_DriverIRQHandler\nReserved47_DriverIRQHandler\nPIN_INT4_DriverIRQHandler\nPIN_INT5_DriverIRQHandler\nPIN_INT6_DriverIRQHandler\nPIN_INT7_DriverIRQHandler\nCTIMER2_DriverIRQHandler\nCTIMER4_DriverIRQHandler\nRIT_DriverIRQHandler\nSPIFI0_DriverIRQHandler\nFLEXCOMM8_DriverIRQHandler\nFLEXCOMM9_DriverIRQHandler\nSDIO_DriverIRQHandler\nCAN0_IRQ0_DriverIRQHandler\nCAN0_IRQ1_DriverIRQHandler\nCAN1_IRQ0_DriverIRQHandler\nCAN1_IRQ1_DriverIRQHandler\nUSB1_DriverIRQHandler\nUSB1_NEEDCLK_DriverIRQHandler\nETHERNET_DriverIRQHandler\nETHERNET_PMT_DriverIRQHandler\nETHERNET_MACLP_DriverIRQHandler\nEEPROM_DriverIRQHandler\nLCD_DriverIRQHandler\nSHA_DriverIRQHandler\nSMARTCARD0_DriverIRQHandler\nSMARTCARD1_DriverIRQHandler\nDefaultISR\n        B .\n\n        END\n"
  },
  {
    "path": "hw/bsp/lpc55/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n#define configRUN_FREERTOS_SECURE_ONLY          1\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/LPC55S69_cm33_core0_uf2.ld",
    "content": "/*\n** ###################################################################\n**     Processors:          LPC55S69JBD100_cm33_core0\n**                          LPC55S69JBD64_cm33_core0\n**                          LPC55S69JEV98_cm33_core0\n**\n**     Compiler:            GNU C Compiler\n**     Reference manual:    LPC55S6x/LPC55S2x/LPC552x User manual(UM11126) Rev.1.3  16 May 2019\n**     Version:             rev. 1.1, 2019-05-16\n**     Build:               b191008\n**\n**     Abstract:\n**         Linker file for the GNU C Compiler\n**\n**     Copyright 2016 Freescale Semiconductor, Inc.\n**     Copyright 2016-2019 NXP\n**     All rights reserved.\n**\n**     SPDX-License-Identifier: BSD-3-Clause\n**\n**     http:                 www.nxp.com\n**     mail:                 support@nxp.com\n**\n** ###################################################################\n*/\n\n\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\nHEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0800;\nRPMSG_SHMEM_SIZE = DEFINED(__use_shmem__) ? 0x1800 : 0;\n\n/* Specify the memory areas */\nMEMORY\n{\n  m_interrupts          (RX)  : ORIGIN = 0x00010000, LENGTH = 0x00000200\n  m_text                (RX)  : ORIGIN = 0x00010200, LENGTH = 0x0007FE00\n  m_core1_image         (RX)  : ORIGIN = 0x00090000, LENGTH = 0x00008000\n  m_data                (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00033000 - RPMSG_SHMEM_SIZE\n  rpmsg_sh_mem          (RW)  : ORIGIN = 0x20033000 - RPMSG_SHMEM_SIZE, LENGTH = RPMSG_SHMEM_SIZE\n  m_usb_sram            (RW)  : ORIGIN = 0x40100000, LENGTH = 0x00004000\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* section for storing the secondary core image */\n  .m0code :\n  {\n     . = ALIGN(4) ;\n    KEEP (*(.m0code))\n     *(.m0code*)\n     . = ALIGN(4) ;\n  } > m_core1_image\n\n  /* NOINIT section for rpmsg_sh_mem */\n  .noinit_rpmsg_sh_mem (NOLOAD) : ALIGN(4)\n  {\n     __RPMSG_SH_MEM_START__ = .;\n     *(.noinit.$rpmsg_sh_mem*)\n     . = ALIGN(4) ;\n     __RPMSG_SH_MEM_END__ = .;\n  } > rpmsg_sh_mem\n\n  /* The startup code goes first into internal flash */\n  .interrupts :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector))     /* Startup code */\n    . = ALIGN(4);\n  } > m_interrupts\n\n  /* The program code and other data goes into internal flash */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)                 /* .text sections (code) */\n    *(.text*)                /* .text* sections (code) */\n    *(.rodata)               /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)              /* .rodata* sections (constants, strings, etc.) */\n    *(.glue_7)               /* glue arm to thumb code */\n    *(.glue_7t)              /* glue thumb to arm code */\n    *(.eh_frame)\n    KEEP (*(.init))\n    KEEP (*(.fini))\n    . = ALIGN(4);\n  } > m_text\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } > m_text\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } > m_text\n\n .ctors :\n  {\n    __CTOR_LIST__ = .;\n    /* gcc uses crtbegin.o to find the start of\n       the constructors, so we make sure it is\n       first.  Because this is a wildcard, it\n       doesn't matter if the user does not\n       actually link against crtbegin.o; the\n       linker won't look for a file to match a\n       wildcard.  The wildcard also means that it\n       doesn't matter which directory crtbegin.o\n       is in.  */\n    KEEP (*crtbegin.o(.ctors))\n    KEEP (*crtbegin?.o(.ctors))\n    /* We don't want to include the .ctor section from\n       from the crtend.o file until after the sorted ctors.\n       The .ctor section from the crtend file contains the\n       end of ctors marker and it must be last */\n    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))\n    KEEP (*(SORT(.ctors.*)))\n    KEEP (*(.ctors))\n    __CTOR_END__ = .;\n  } > m_text\n\n  .dtors :\n  {\n    __DTOR_LIST__ = .;\n    KEEP (*crtbegin.o(.dtors))\n    KEEP (*crtbegin?.o(.dtors))\n    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))\n    KEEP (*(SORT(.dtors.*)))\n    KEEP (*(.dtors))\n    __DTOR_END__ = .;\n  } > m_text\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } > m_text\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } > m_text\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } > m_text\n\n  __etext = .;    /* define a global symbol at end of code */\n  __DATA_ROM = .; /* Symbol is used by startup for data initialization */\n\n  .data : AT(__DATA_ROM)\n  {\n    . = ALIGN(4);\n    __DATA_RAM = .;\n    __data_start__ = .;      /* create a global symbol at data start */\n    *(.ramfunc*)             /* for functions in ram */\n    *(.data)                 /* .data sections */\n    *(.data*)                /* .data* sections */\n    KEEP(*(.jcr*))\n    . = ALIGN(4);\n    __data_end__ = .;        /* define a global symbol at data end */\n  } > m_data\n\n  __DATA_END = __DATA_ROM + (__data_end__ - __data_start__);\n  text_end = ORIGIN(m_text) + LENGTH(m_text);\n  ASSERT(__DATA_END <= text_end, \"region m_text overflowed with text and data\")\n\n  /* Uninitialized data section */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    . = ALIGN(4);\n    __START_BSS = .;\n    __bss_start__ = .;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n    . = ALIGN(4);\n    __bss_end__ = .;\n    __END_BSS = .;\n  } > m_data\n\n  .heap :\n  {\n    . = ALIGN(8);\n    __end__ = .;\n    PROVIDE(end = .);\n    __HeapBase = .;\n    . += HEAP_SIZE;\n    __HeapLimit = .;\n    __heap_limit = .; /* Add for _sbrk */\n  } > m_data\n\n  .stack :\n  {\n    . = ALIGN(8);\n    . += STACK_SIZE;\n  } > m_data\n\n  m_usb_bdt (NOLOAD) :\n  {\n    . = ALIGN(512);\n    *(m_usb_bdt)\n  } > m_usb_sram\n\n  m_usb_global (NOLOAD) :\n  {\n    *(m_usb_global)\n  } > m_usb_sram\n\n  /* Initializes stack on the end of block */\n  __StackTop   = ORIGIN(m_data) + LENGTH(m_data);\n  __StackLimit = __StackTop - STACK_SIZE;\n  PROVIDE(__stack = __StackTop);\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n\n  ASSERT(__StackLimit >= __HeapLimit, \"region m_data overflowed with stack and heap\")\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board/clock_config.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to set up clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up wait states of the flash.\n *\n * 3. Set up all dividers.\n *\n * 4. Set up all selectors to provide selected clocks.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v18.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_power.h\"\n#include \"fsl_clock.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockPLL150M();\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO12M\noutputs:\n- {id: System_clock.outFreq, value: 12 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO12M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    POWER_SetVoltageForFreq(12000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(12000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO12M */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF96M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFROHF96M\noutputs:\n- {id: System_clock.outFreq, value: 96 MHz}\nsettings:\n- {id: ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG, value: Enable}\n- {id: SYSCON.MAINCLKSELA.sel, value: ANACTRL.fro_hf_clk}\nsources:\n- {id: ANACTRL.fro_hf.outFreq, value: 96 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFROHF96M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    CLOCK_SetupFROClocking(96000000U);                   /* Enable FRO HF(96MHz) output */\n\n    POWER_SetVoltageForFreq(96000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(96000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO_HF */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL100M\noutputs:\n- {id: System_clock.outFreq, value: 100 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: ENABLE_CLKIN_ENA, value: Enabled}\n- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}\n- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL0_BYPASS}\n- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL0M_MULT.scale, value: '100', locked: true}\n- {id: SYSCON.PLL0N_DIV.scale, value: '4', locked: true}\n- {id: SYSCON.PLL0_PDEC.scale, value: '4', locked: true}\nsources:\n- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL100M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    /*!< Configure XTAL32M */\n    POWER_DisablePD(kPDRUNCFG_PD_XTAL32M);                        /* Ensure XTAL32M is powered */\n    POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M);                       /* Ensure XTAL32M is powered */\n    CLOCK_SetupExtClocking(16000000U);                            /* Enable clk_in clock */\n    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;       /* Enable clk_in from XTAL32M clock  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;    /* Enable clk_in to system  */\n\n    POWER_SetVoltageForFreq(100000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(100000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up PLL */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL0);                    /*!< Switch PLL0CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0);                  /* Ensure PLL is on  */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(26U),\n        .pllndec = SYSCON_PLL0NDEC_NDIV(4U),\n        .pllpdec = SYSCON_PLL0PDEC_PDIV(2U),\n        .pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(100U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},\n        .pllRate = 100000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL0_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL0 */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL100M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL150M\ncalled_from_default_init: true\noutputs:\n- {id: FXCOM0_clock.outFreq, value: 48 MHz}\n- {id: System_clock.outFreq, value: 144 MHz}\n- {id: USB0_clock.outFreq, value: 48 MHz}\n- {id: USB1_PHY_clock.outFreq, value: 16 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: PLL1_Mode, value: Normal}\n- {id: ENABLE_CLKIN_ENA, value: Enabled}\n- {id: ENABLE_PLL_USB_OUT, value: Enabled}\n- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}\n- {id: SYSCON.FCCLKSEL0.sel, value: SYSCON.PLL0DIV}\n- {id: SYSCON.FRGCTRL0_DIV.scale, value: '400'}\n- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL1_BYPASS}\n- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL0DIV.scale, value: '2'}\n- {id: SYSCON.PLL0M_MULT.scale, value: '150', locked: true}\n- {id: SYSCON.PLL0N_DIV.scale, value: '8', locked: true}\n- {id: SYSCON.PLL0_PDEC.scale, value: '2', locked: true}\n- {id: SYSCON.PLL1CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL1M_MULT.scale, value: '18'}\n- {id: SYSCON.PLL1_PDEC.scale, value: '2'}\n- {id: SYSCON.USB0CLKDIV.scale, value: '3'}\n- {id: SYSCON.USB0CLKSEL.sel, value: SYSCON.MAINCLKSELB}\nsources:\n- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL150M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    /*!< Configure XTAL32M */\n    POWER_DisablePD(kPDRUNCFG_PD_XTAL32M);                        /* Ensure XTAL32M is powered */\n    POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M);                       /* Ensure XTAL32M is powered */\n    CLOCK_SetupExtClocking(16000000U);                            /* Enable clk_in clock */\n    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;       /* Enable clk_in from XTAL32M clock  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;    /* Enable clk_in to system  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_PLL_USB_OUT_MASK;       /* Enable clk_in to HS USB  */\n\n    POWER_SetVoltageForFreq(144000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(144000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up PLL */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL0);                    /*!< Switch PLL0CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0);                  /* Ensure PLL is on  */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(31U),\n        .pllndec = SYSCON_PLL0NDEC_NDIV(8U),\n        .pllpdec = SYSCON_PLL0PDEC_PDIV(1U),\n        .pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(150U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},\n        .pllRate = 150000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n\n    /*!< Set up PLL1 */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL1);                    /*!< Switch PLL1CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL1);                  /* Ensure PLL is on  */\n    const pll_setup_t pll1Setup = {\n        .pllctrl = SYSCON_PLL1CTRL_CLKEN_MASK | SYSCON_PLL1CTRL_SELI(11U) | SYSCON_PLL1CTRL_SELP(5U),\n        .pllndec = SYSCON_PLL1NDEC_NDIV(1U),\n        .pllpdec = SYSCON_PLL1PDEC_PDIV(1U),\n        .pllmdec = SYSCON_PLL1MDEC_MDIV(18U),\n        .pllRate = 144000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL1Freq(&pll1Setup);                        /*!< Configure PLL1 to the desired values */\n\n    /*!< Set up dividers */\n    #if FSL_CLOCK_DRIVER_VERSION >= MAKE_VERSION(2, 3, 4)\n      CLOCK_SetClkDiv(kCLOCK_DivFlexFrg0, 144U, false);         /*!< Set DIV to value 0xFF and MULT to value 144U in related FLEXFRGCTRL register */\n    #else\n      CLOCK_SetClkDiv(kCLOCK_DivFlexFrg0, 37120U, false);         /*!< Set DIV to value 0xFF and MULT to value 144U in related FLEXFRGCTRL register */\n    #endif\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 0U, true);               /*!< Reset USB0CLKDIV divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 3U, false);         /*!< Set USB0CLKDIV divider to value 3 */\n    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 0U, true);               /*!< Reset PLL0DIV divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 2U, false);         /*!< Set PLL0DIV divider to value 2 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL1_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL1 */\n    CLOCK_AttachClk(kMAIN_CLK_to_USB0_CLK);                 /*!< Switch USB0_CLK to MAIN_CLK */\n    CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM0);                 /*!< Switch FLEXCOMM0 to PLL0_DIV */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;\n#endif\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board/clock_config.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         16000000U  /*!< Board xtal frequency in Hz */\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32K frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK           12000000U  /*!< Core clock frequency: 12000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO12M_ASYNCADC_CLOCK          0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO12M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER3_CLOCK           0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER4_CLOCK           0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM0_CLOCK            0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM1_CLOCK            0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM2_CLOCK            0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM3_CLOCK            0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM4_CLOCK            0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM5_CLOCK            0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM6_CLOCK            0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM7_CLOCK            0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKFRO12M_HSLSPI_CLOCK            0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKFRO12M_MCLK_CLOCK              0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_OSC32KHZ_CLOCK          0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFRO12M_OSTIMER32KHZ_CLOCK      0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKFRO12M_PLUCLKIN_CLOCK          0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_PLU_GLITCH_12MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_PLU_GLITCH_1MHZ_CLOCK   0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_RTC1HZ_CLOCK            0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_RTC1KHZ_CLOCK           0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SCT_CLOCK               0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKFRO12M_SDIO_CLOCK              0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKFRO12M_SYSTICK0_CLOCK          0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SYSTICK1_CLOCK          0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SYSTEM_CLOCK            12000000UL     /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKFRO12M_TRACE_CLOCK             0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO12M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKFRO12M_USB1_PHY_CLOCK          0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFRO12M_UTICK_CLOCK             0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO12M_WDT_CLOCK               0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO12M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF96M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK         96000000U  /*!< Core clock frequency: 96000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFROHF96M_ASYNCADC_CLOCK        0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFROHF96M_CLKOUT_CLOCK          0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER0_CLOCK         0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER1_CLOCK         0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER2_CLOCK         0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER3_CLOCK         0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER4_CLOCK         0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM0_CLOCK          0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM1_CLOCK          0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM2_CLOCK          0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM3_CLOCK          0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM4_CLOCK          0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM5_CLOCK          0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM6_CLOCK          0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM7_CLOCK          0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKFROHF96M_HSLSPI_CLOCK          0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKFROHF96M_MCLK_CLOCK            0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_OSC32KHZ_CLOCK        0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFROHF96M_OSTIMER32KHZ_CLOCK    0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKFROHF96M_PLUCLKIN_CLOCK        0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_PLU_GLITCH_12MHZ_CLOCK 0UL           /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_PLU_GLITCH_1MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_RTC1HZ_CLOCK          0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_RTC1KHZ_CLOCK         0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SCT_CLOCK             0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKFROHF96M_SDIO_CLOCK            0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTICK0_CLOCK        0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTICK1_CLOCK        0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTEM_CLOCK          96000000UL     /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKFROHF96M_TRACE_CLOCK           0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFROHF96M_USB0_CLOCK            0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKFROHF96M_USB1_PHY_CLOCK        0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFROHF96M_UTICK_CLOCK           0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFROHF96M_WDT_CLOCK             0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFROHF96M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL100M_CORE_CLOCK         100000000U  /*!< Core clock frequency: 100000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKPLL100M_ASYNCADC_CLOCK         0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKPLL100M_CLKOUT_CLOCK           0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER0_CLOCK          0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER1_CLOCK          0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER2_CLOCK          0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER3_CLOCK          0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER4_CLOCK          0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM0_CLOCK           0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM1_CLOCK           0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM2_CLOCK           0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM3_CLOCK           0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM4_CLOCK           0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM5_CLOCK           0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM6_CLOCK           0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM7_CLOCK           0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKPLL100M_HSLSPI_CLOCK           0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKPLL100M_MCLK_CLOCK             0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_OSC32KHZ_CLOCK         0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL100M_OSTIMER32KHZ_CLOCK     0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKPLL100M_PLUCLKIN_CLOCK         0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_PLU_GLITCH_12MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_PLU_GLITCH_1MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_RTC1HZ_CLOCK           0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_RTC1KHZ_CLOCK          0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SCT_CLOCK              0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKPLL100M_SDIO_CLOCK             0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKPLL100M_SYSTICK0_CLOCK         0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SYSTICK1_CLOCK         0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SYSTEM_CLOCK           100000000UL    /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKPLL100M_TRACE_CLOCK            0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKPLL100M_USB0_CLOCK             0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKPLL100M_USB1_PHY_CLOCK         0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL100M_UTICK_CLOCK            0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKPLL100M_WDT_CLOCK              0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL100M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL150M_CORE_CLOCK         144000000U  /*!< Core clock frequency: 144000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKPLL150M_ASYNCADC_CLOCK         0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKPLL150M_CLKOUT_CLOCK           0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER0_CLOCK          0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER1_CLOCK          0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER2_CLOCK          0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER3_CLOCK          0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER4_CLOCK          0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM0_CLOCK           48000000UL     /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM1_CLOCK           0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM2_CLOCK           0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM3_CLOCK           0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM4_CLOCK           0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM5_CLOCK           0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM6_CLOCK           0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM7_CLOCK           0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKPLL150M_HSLSPI_CLOCK           0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKPLL150M_MCLK_CLOCK             0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_OSC32KHZ_CLOCK         0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL150M_OSTIMER32KHZ_CLOCK     0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKPLL150M_PLUCLKIN_CLOCK         0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_PLU_GLITCH_12MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_PLU_GLITCH_1MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_RTC1HZ_CLOCK           0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_RTC1KHZ_CLOCK          0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SCT_CLOCK              0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKPLL150M_SDIO_CLOCK             0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKPLL150M_SYSTICK0_CLOCK         0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SYSTICK1_CLOCK         0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SYSTEM_CLOCK           144000000UL    /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKPLL150M_TRACE_CLOCK            0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKPLL150M_USB0_CLOCK             48000000UL     /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKPLL150M_USB1_PHY_CLOCK         16000000UL     /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL150M_UTICK_CLOCK            0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKPLL150M_WDT_CLOCK              0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL150M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board/peripherals.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Peripherals v15.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\nfunctionalGroups:\n- name: BOARD_InitPeripherals_cm33_core0\n  UUID: 61d0725d-b300-49cb-9c66-b5edfbf8ffc1\n  called_from_default_init: true\n  selectedCore: cm33_core0\n- name: BOARD_InitPeripherals_cm33_core1\n  UUID: e2041cd4-ebb6-45a5-807f-e0c2dc047d48\n  selectedCore: cm33_core1\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'system'\n- type_id: 'system'\n- global_system_definitions:\n  - user_definitions: ''\n  - user_includes: ''\n  - global_init: ''\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'uart_cmsis_common'\n- type_id: 'uart_cmsis_common'\n- global_USART_CMSIS_common:\n  - quick_selection: 'default'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'gpio_adapter_common'\n- type_id: 'gpio_adapter_common'\n- global_gpio_adapter_common:\n  - quick_selection: 'default'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/***********************************************************************************************************************\n * Included files\n **********************************************************************************************************************/\n#include \"peripherals.h\"\n\n/***********************************************************************************************************************\n * BOARD_InitPeripherals_cm33_core0 functional group\n **********************************************************************************************************************/\n/***********************************************************************************************************************\n * DEBUG_UART initialization code\n **********************************************************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ninstance:\n- name: 'DEBUG_UART'\n- type: 'flexcomm_usart'\n- mode: 'polling'\n- custom_name_enabled: 'true'\n- type_id: 'flexcomm_usart_2.2.0'\n- functional_group: 'BOARD_InitPeripherals_cm33_core0'\n- peripheral: 'FLEXCOMM0'\n- config_sets:\n  - usartConfig_t:\n    - usartConfig:\n      - clockSource: 'FXCOMFunctionClock'\n      - clockSourceFreq: 'ClocksTool_DefaultInit'\n      - baudRate_Bps: '115200'\n      - syncMode: 'kUSART_SyncModeDisabled'\n      - parityMode: 'kUSART_ParityDisabled'\n      - stopBitCount: 'kUSART_OneStopBit'\n      - bitCountPerChar: 'kUSART_8BitsPerChar'\n      - loopback: 'false'\n      - txWatermark: 'kUSART_TxFifo0'\n      - rxWatermark: 'kUSART_RxFifo1'\n      - enableRx: 'true'\n      - enableTx: 'true'\n      - clockPolarity: 'kUSART_RxSampleOnFallingEdge'\n      - enableContinuousSCLK: 'false'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\nconst usart_config_t DEBUG_UART_config = {\n  .baudRate_Bps = 115200UL,\n  .syncMode = kUSART_SyncModeDisabled,\n  .parityMode = kUSART_ParityDisabled,\n  .stopBitCount = kUSART_OneStopBit,\n  .bitCountPerChar = kUSART_8BitsPerChar,\n  .loopback = false,\n  .txWatermark = kUSART_TxFifo0,\n  .rxWatermark = kUSART_RxFifo1,\n  .enableRx = true,\n  .enableTx = true,\n  .enableMode32k = false,\n  .clockPolarity = kUSART_RxSampleOnFallingEdge,\n  .enableContinuousSCLK = false\n};\n\nstatic void DEBUG_UART_init(void) {\n  /* Reset FLEXCOMM device */\n  RESET_PeripheralReset(kFC0_RST_SHIFT_RSTn);\n  USART_Init(DEBUG_UART_PERIPHERAL, &DEBUG_UART_config, DEBUG_UART_CLOCK_SOURCE);\n}\n\n/***********************************************************************************************************************\n * NVIC initialization code\n **********************************************************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ninstance:\n- name: 'NVIC'\n- type: 'nvic'\n- mode: 'general'\n- custom_name_enabled: 'false'\n- type_id: 'nvic'\n- functional_group: 'BOARD_InitPeripherals_cm33_core0'\n- peripheral: 'NVIC'\n- config_sets:\n  - nvic:\n    - interrupt_table: []\n    - interrupts: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/* Empty initialization function (commented out)\nstatic void NVIC_init(void) {\n} */\n\n/***********************************************************************************************************************\n * Initialization functions\n **********************************************************************************************************************/\nvoid BOARD_InitPeripherals_cm33_core0(void)\n{\n  /* Initialize components */\n  DEBUG_UART_init();\n}\n\n/***********************************************************************************************************************\n * BOARD_InitBootPeripherals function\n **********************************************************************************************************************/\nvoid BOARD_InitBootPeripherals(void)\n{\n  BOARD_InitPeripherals_cm33_core0();\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board/peripherals.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PERIPHERALS_H_\n#define _PERIPHERALS_H_\n\n/***********************************************************************************************************************\n * Included files\n **********************************************************************************************************************/\n#include \"fsl_common.h\"\n#include \"fsl_reset.h\"\n#include \"fsl_usart.h\"\n#include \"fsl_clock.h\"\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus */\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n/* Definitions for BOARD_InitPeripherals_cm33_core0 functional group */\n/* Definition of peripheral ID */\n#define DEBUG_UART_PERIPHERAL ((USART_Type *)FLEXCOMM0)\n/* Definition of the clock source frequency */\n#define DEBUG_UART_CLOCK_SOURCE 48000000UL\n\n/***********************************************************************************************************************\n * Global variables\n **********************************************************************************************************************/\nextern const usart_config_t DEBUG_UART_config;\n\n/***********************************************************************************************************************\n * Initialization functions\n **********************************************************************************************************************/\n\nvoid BOARD_InitPeripherals_cm33_core0(void);\n\n/***********************************************************************************************************************\n * BOARD_InitBootPeripherals function\n **********************************************************************************************************************/\nvoid BOARD_InitBootPeripherals(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif /* _PERIPHERALS_H_ */\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board/pin_mux.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\npin_labels:\n- {pin_num: '7', pin_signal: PIO0_1/FC3_CTS_SDA_SSEL0/CT_INP0/SCT_GPI1/SD1_CLK/CMP0_OUT/SECURE_GPIO0_1, label: 'P18[2]/SD1_CLK', identifier: LED}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_iocon.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitDEBUG_UARTPins();\n    BOARD_InitUSBPins();\n    BOARD_InitLEDsPins();\n    BOARD_InitBUTTONsPins();\n    BOARD_InitPins_Core0();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '92', peripheral: FLEXCOMM0, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '94', peripheral: FLEXCOMM0, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30, mode: inactive,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitDEBUG_UARTPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t DEBUG_UART_RX = (/* Pin is configured as FC0_RXD_SDA_MOSI_DATA */\n                                    IOCON_PIO_FUNC1 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN29 (coords: 92) is configured as FC0_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN, DEBUG_UART_RX);\n\n    const uint32_t DEBUG_UART_TX = (/* Pin is configured as FC0_TXD_SCL_MISO_WS */\n                                    IOCON_PIO_FUNC1 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN30 (coords: 94) is configured as FC0_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN, DEBUG_UART_TX);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSWD_DEBUGPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '13', peripheral: SWD, signal: SWCLK, pin_signal: PIO0_11/FC6_RXD_SDA_MOSI_DATA/CTIMER2_MAT2/FREQME_GPIO_CLK_A/SWCLK/SECURE_GPIO0_11/ADC0_9, mode: pullDown,\n    slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '12', peripheral: SWD, signal: SWDIO, pin_signal: PIO0_12/FC3_TXD_SCL_MISO_WS/SD1_BACKEND_PWR/FREQME_GPIO_CLK_B/SCT_GPI7/SD0_POW_EN/SWDIO/FC6_TXD_SCL_MISO_WS/SECURE_GPIO0_12/ADC0_10,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '21', peripheral: SWD, signal: SWO, pin_signal: PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1, identifier: DEBUG_SWD_SWO,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled, asw: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSWD_DEBUGPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitSWD_DEBUGPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t DEBUG_SWD_SWO = (/* Pin is configured as SWO */\n                                    IOCON_PIO_FUNC6 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI |\n                                    /* Analog switch is open (disabled) */\n                                    IOCON_PIO_ASW_DI);\n    /* PORT0 PIN10 (coords: 21) is configured as SWO */\n    IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN, DEBUG_SWD_SWO);\n\n    if (Chip_GetVersion()==1)\n    {\n        const uint32_t DEBUG_SWD_SWDCLK = (/* Pin is configured as SWCLK */\n                                           IOCON_PIO_FUNC6 |\n                                           /* Selects pull-down function */\n                                           IOCON_PIO_MODE_PULLDOWN |\n                                           /* Standard mode, output slew rate control is enabled */\n                                           IOCON_PIO_SLEW_STANDARD |\n                                           /* Input function is not inverted */\n                                           IOCON_PIO_INV_DI |\n                                           /* Enables digital function */\n                                           IOCON_PIO_DIGITAL_EN |\n                                           /* Open drain is disabled */\n                                           IOCON_PIO_OPENDRAIN_DI |\n                                           /* Analog switch is closed (enabled) */\n                                           IOCON_PIO_ASW_EN);\n        /* PORT0 PIN11 (coords: 13) is configured as SWCLK */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN, DEBUG_SWD_SWDCLK);\n    }\n    else\n    {\n        const uint32_t DEBUG_SWD_SWDCLK = (/* Pin is configured as SWCLK */\n                                           IOCON_PIO_FUNC6 |\n                                           /* Selects pull-down function */\n                                           IOCON_PIO_MODE_PULLDOWN |\n                                           /* Standard mode, output slew rate control is enabled */\n                                           IOCON_PIO_SLEW_STANDARD |\n                                           /* Input function is not inverted */\n                                           IOCON_PIO_INV_DI |\n                                           /* Enables digital function */\n                                           IOCON_PIO_DIGITAL_EN |\n                                           /* Open drain is disabled */\n                                           IOCON_PIO_OPENDRAIN_DI |\n                                           /* Analog switch is closed (enabled), only for A0 version */\n                                           IOCON_PIO_ASW_DIS_EN);\n        /* PORT0 PIN11 (coords: 13) is configured as SWCLK */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN, DEBUG_SWD_SWDCLK);\n    }\n\n    if (Chip_GetVersion()==1)\n    {\n        const uint32_t DEBUG_SWD_SWDIO = (/* Pin is configured as SWDIO */\n                                          IOCON_PIO_FUNC6 |\n                                          /* Selects pull-up function */\n                                          IOCON_PIO_MODE_PULLUP |\n                                          /* Standard mode, output slew rate control is enabled */\n                                          IOCON_PIO_SLEW_STANDARD |\n                                          /* Input function is not inverted */\n                                          IOCON_PIO_INV_DI |\n                                          /* Enables digital function */\n                                          IOCON_PIO_DIGITAL_EN |\n                                          /* Open drain is disabled */\n                                          IOCON_PIO_OPENDRAIN_DI |\n                                          /* Analog switch is closed (enabled) */\n                                          IOCON_PIO_ASW_EN);\n        /* PORT0 PIN12 (coords: 12) is configured as SWDIO */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN, DEBUG_SWD_SWDIO);\n    }\n    else\n    {\n        const uint32_t DEBUG_SWD_SWDIO = (/* Pin is configured as SWDIO */\n                                          IOCON_PIO_FUNC6 |\n                                          /* Selects pull-up function */\n                                          IOCON_PIO_MODE_PULLUP |\n                                          /* Standard mode, output slew rate control is enabled */\n                                          IOCON_PIO_SLEW_STANDARD |\n                                          /* Input function is not inverted */\n                                          IOCON_PIO_INV_DI |\n                                          /* Enables digital function */\n                                          IOCON_PIO_DIGITAL_EN |\n                                          /* Open drain is disabled */\n                                          IOCON_PIO_OPENDRAIN_DI |\n                                          /* Analog switch is closed (enabled), only for A0 version */\n                                          IOCON_PIO_ASW_DIS_EN);\n        /* PORT0 PIN12 (coords: 12) is configured as SWDIO */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN, DEBUG_SWD_SWDIO);\n    }\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSBPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '97', peripheral: USBFSH, signal: USB_DP, pin_signal: USB0_DP}\n  - {pin_num: '98', peripheral: USBFSH, signal: USB_DM, pin_signal: USB0_DM}\n  - {pin_num: '78', peripheral: USBFSH, signal: USB_VBUS, pin_signal: PIO0_22/FC6_TXD_SCL_MISO_WS/UTICK_CAP1/CT_INP15/SCT0_OUT3/USB0_VBUS/SD1_D0/PLU_OUT7/SECURE_GPIO0_22,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '35', peripheral: USBHSH, signal: USB_DM, pin_signal: USB1_DM}\n  - {pin_num: '34', peripheral: USBHSH, signal: USB_DP, pin_signal: USB1_DP}\n  - {pin_num: '36', peripheral: USBHSH, signal: USB_VBUS, pin_signal: USB1_VBUS}\n  - {pin_num: '65', peripheral: USBHSH, signal: USB_OVERCURRENTN, pin_signal: PIO1_30/FC7_TXD_SCL_MISO_WS/SD0_D7/SCT_GPI7/USB1_OVERCURRENTN/USB1_LEDN/PLU_IN1, mode: pullUp}\n  - {pin_num: '66', peripheral: USBFSH, signal: USB_OVERCURRENTN, pin_signal: PIO0_28/FC0_SCK/SD1_CMD/CT_INP11/SCT0_OUT7/USB0_OVERCURRENTN/PLU_OUT1/SECURE_GPIO0_28,\n    mode: pullUp}\n  - {pin_num: '67', peripheral: USBFSH, signal: USB_PORTPWRN, pin_signal: PIO1_12/FC6_SCK/CTIMER1_MAT1/USB0_PORTPWRN/HS_SPI_SSEL2, mode: pullUp}\n  - {pin_num: '80', peripheral: USBHSH, signal: USB_PORTPWRN, pin_signal: PIO1_29/FC7_RXD_SDA_MOSI_DATA/SD0_D6/SCT_GPI6/USB1_PORTPWRN/USB1_FRAME/PLU_IN2, mode: pullUp}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSBPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitUSBPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t USB0_VBUS = (/* Pin is configured as USB0_VBUS */\n                                IOCON_PIO_FUNC7 |\n                                /* No addition pin function */\n                                IOCON_PIO_MODE_INACT |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN22 (coords: 78) is configured as USB0_VBUS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITUSBPINS_USB0_VBUS_PORT, BOARD_INITUSBPINS_USB0_VBUS_PIN, USB0_VBUS);\n\n    IOCON->PIO[0][28] = ((IOCON->PIO[0][28] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT028 (pin 66) is configured as USB0_OVERCURRENTN. */\n                         | IOCON_PIO_FUNC(PIO0_28_FUNC_ALT7)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO0_28_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO0_28_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][12] = ((IOCON->PIO[1][12] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT112 (pin 67) is configured as USB0_PORTPWRN. */\n                         | IOCON_PIO_FUNC(PIO1_12_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_12_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_12_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][29] = ((IOCON->PIO[1][29] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT129 (pin 80) is configured as USB1_PORTPWRN. */\n                         | IOCON_PIO_FUNC(PIO1_29_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_29_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_29_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][30] = ((IOCON->PIO[1][30] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT130 (pin 65) is configured as USB1_OVERCURRENTN. */\n                         | IOCON_PIO_FUNC(PIO1_30_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_30_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_30_DIGIMODE_DIGITAL));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLEDsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '7', peripheral: GPIO, signal: 'PIO0, 1', pin_signal: PIO0_1/FC3_CTS_SDA_SSEL0/CT_INP0/SCT_GPI1/SD1_CLK/CMP0_OUT/SECURE_GPIO0_1, direction: OUTPUT}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLEDsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitLEDsPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO0 module */\n    CLOCK_EnableClock(kCLOCK_Gpio0);\n\n    gpio_pin_config_t LED_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO0_1 (pin 7)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_GPIO, BOARD_INITLEDSPINS_LED_PORT, BOARD_INITLEDSPINS_LED_PIN, &LED_config);\n\n    IOCON->PIO[0][1] = ((IOCON->PIO[0][1] &\n                         /* Mask bits to zero which are setting */\n                         (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                        /* Selects pin function.\n                         * : PORT01 (pin 7) is configured as PIO0_1. */\n                        | IOCON_PIO_FUNC(PIO0_1_FUNC_ALT0)\n\n                        /* Select Digital mode.\n                         * : Enable Digital mode.\n                         * Digital input is enabled. */\n                        | IOCON_PIO_DIGIMODE(PIO0_1_DIGIMODE_DIGITAL));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitBUTTONsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '88', peripheral: GPIO, signal: 'PIO0, 5', pin_signal: PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5, direction: INPUT,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '32', peripheral: SYSCON, signal: RESET, pin_signal: RESETN}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBUTTONsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitBUTTONsPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO0 module */\n    CLOCK_EnableClock(kCLOCK_Gpio0);\n\n    gpio_pin_config_t S1_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO0_5 (pin 88)  */\n    GPIO_PinInit(BOARD_INITBUTTONSPINS_S1_GPIO, BOARD_INITBUTTONSPINS_S1_PORT, BOARD_INITBUTTONSPINS_S1_PIN, &S1_config);\n\n    const uint32_t S1 = (/* Pin is configured as PIO0_5 */\n                         IOCON_PIO_FUNC0 |\n                         /* Selects pull-up function */\n                         IOCON_PIO_MODE_PULLUP |\n                         /* Standard mode, output slew rate control is enabled */\n                         IOCON_PIO_SLEW_STANDARD |\n                         /* Input function is not inverted */\n                         IOCON_PIO_INV_DI |\n                         /* Enables digital function */\n                         IOCON_PIO_DIGITAL_EN |\n                         /* Open drain is disabled */\n                         IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN5 (coords: 88) is configured as PIO0_5 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITBUTTONSPINS_S1_PORT, BOARD_INITBUTTONSPINS_S1_PIN, S1);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins_Core0:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins_Core0\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitPins_Core0(void)\n{\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitI2SPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '4', peripheral: FLEXCOMM4, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '30', peripheral: FLEXCOMM4, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3, mode: pullUp,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '91', peripheral: SYSCON, signal: MCLK, pin_signal: PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0, mode: inactive, slew_rate: standard, invert: disabled,\n    open_drain: disabled}\n  - {pin_num: '76', peripheral: FLEXCOMM7, signal: SCK, pin_signal: PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '74', peripheral: FLEXCOMM7, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '90', peripheral: FLEXCOMM7, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '21', peripheral: FLEXCOMM6, signal: SCK, pin_signal: PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1,\n    identifier: FC6_I2S_CLK, mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '2', peripheral: FLEXCOMM6, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '87', peripheral: FLEXCOMM6, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitI2SPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitI2SPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t FC6_I2S_CLK = (/* Pin is configured as FC6_SCK */\n                                  IOCON_PIO_FUNC1 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI |\n                                  /* Analog switch is closed (enabled) */\n                                  IOCON_PIO_ASW_EN);\n    /* PORT0 PIN10 (coords: 21) is configured as FC6_SCK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_CLK_PORT, BOARD_INITI2SPINS_FC6_I2S_CLK_PIN, FC6_I2S_CLK);\n\n    const uint32_t FC7_I2S_WS = (/* Pin is configured as FC7_TXD_SCL_MISO_WS */\n                                 IOCON_PIO_FUNC7 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN19 (coords: 90) is configured as FC7_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_WS_PORT, BOARD_INITI2SPINS_FC7_I2S_WS_PIN, FC7_I2S_WS);\n\n    const uint32_t FC7_I2S_TX = (/* Pin is configured as FC7_RXD_SDA_MOSI_DATA */\n                                 IOCON_PIO_FUNC7 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN20 (coords: 74) is configured as FC7_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_TX_PORT, BOARD_INITI2SPINS_FC7_I2S_TX_PIN, FC7_I2S_TX);\n\n    const uint32_t FC7_I2S_SCK = (/* Pin is configured as FC7_SCK */\n                                  IOCON_PIO_FUNC7 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN21 (coords: 76) is configured as FC7_SCK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_SCK_PORT, BOARD_INITI2SPINS_FC7_I2S_SCK_PIN, FC7_I2S_SCK);\n\n    const uint32_t FC6_I2S_RX = (/* Pin is configured as FC6_RXD_SDA_MOSI_DATA */\n                                 IOCON_PIO_FUNC2 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN13 (coords: 2) is configured as FC6_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_RX_PORT, BOARD_INITI2SPINS_FC6_I2S_RX_PIN, FC6_I2S_RX);\n\n    const uint32_t FC6_I2S_WS = (/* Pin is configured as FC6_TXD_SCL_MISO_WS */\n                                 IOCON_PIO_FUNC2 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN16 (coords: 87) is configured as FC6_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_WS_PORT, BOARD_INITI2SPINS_FC6_I2S_WS_PIN, FC6_I2S_WS);\n\n    const uint32_t FC4_I2C_SCL = (/* Pin is configured as FC4_TXD_SCL_MISO_WS */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN20 (coords: 4) is configured as FC4_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC4_I2C_SCL_PORT, BOARD_INITI2SPINS_FC4_I2C_SCL_PIN, FC4_I2C_SCL);\n\n    const uint32_t FC4_I2C_SDA = (/* Pin is configured as FC4_RXD_SDA_MOSI_DATA */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC4_I2C_SDA_PORT, BOARD_INITI2SPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA);\n\n    const uint32_t MCLK = (/* Pin is configured as MCLK */\n                           IOCON_PIO_FUNC1 |\n                           /* No addition pin function */\n                           IOCON_PIO_MODE_INACT |\n                           /* Standard mode, output slew rate control is enabled */\n                           IOCON_PIO_SLEW_STANDARD |\n                           /* Input function is not inverted */\n                           IOCON_PIO_INV_DI |\n                           /* Enables digital function */\n                           IOCON_PIO_DIGITAL_EN |\n                           /* Open drain is disabled */\n                           IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN31 (coords: 91) is configured as MCLK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_MCLK_PORT, BOARD_INITI2SPINS_MCLK_PIN, MCLK);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitACCELPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '30', peripheral: FLEXCOMM4, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3, mode: pullUp,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '4', peripheral: FLEXCOMM4, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '58', peripheral: GPIO, signal: 'PIO1, 19', pin_signal: PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF, direction: INPUT, mode: inactive,\n    slew_rate: standard, invert: disabled, open_drain: disabled, asw: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitACCELPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitACCELPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t ACCL_INTR_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_19 (pin 58)  */\n    GPIO_PinInit(BOARD_INITACCELPINS_ACCL_INTR_GPIO, BOARD_INITACCELPINS_ACCL_INTR_PORT, BOARD_INITACCELPINS_ACCL_INTR_PIN, &ACCL_INTR_config);\n\n    const uint32_t ACCL_INTR = (/* Pin is configured as PIO1_19 */\n                                IOCON_PIO_FUNC0 |\n                                /* No addition pin function */\n                                IOCON_PIO_MODE_INACT |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI |\n                                /* Analog switch is open (disabled) */\n                                IOCON_PIO_ASW_DI);\n    /* PORT1 PIN19 (coords: 58) is configured as PIO1_19 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_ACCL_INTR_PORT, BOARD_INITACCELPINS_ACCL_INTR_PIN, ACCL_INTR);\n\n    const uint32_t FC4_I2C_SCL = (/* Pin is configured as FC4_TXD_SCL_MISO_WS */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN20 (coords: 4) is configured as FC4_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SCL_PORT, BOARD_INITACCELPINS_FC4_I2C_SCL_PIN, FC4_I2C_SCL);\n\n    const uint32_t FC4_I2C_SDA = (/* Pin is configured as FC4_RXD_SDA_MOSI_DATA */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SDA_PORT, BOARD_INITACCELPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board/pin_mux.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC1 0x01u         /*!<@brief Selects pin function 1 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_29 (number 92), P8[2]/U6[13]/FC0_USART_RXD\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN 29U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN_MASK (1U << 29U)\n/* @} */\n\n/*! @name PIO0_30 (number 94), P8[3]/U6[12]/FC0_USART_TXD\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN 30U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN_MASK (1U << 30U)\n/* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DI 0x00u        /*!<@brief Analog switch is open (disabled) */\n#define IOCON_PIO_ASW_DIS_EN 0x00u    /*!<@brief Analog switch is closed (enabled), only for A0 version */\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC6 0x06u         /*!<@brief Selects pin function 6 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLDOWN 0x10u /*!<@brief Selects pull-down function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_11 (number 13), U14[4]/SWDCLK_TRGT\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN 11U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN_MASK (1U << 11U)\n/* @} */\n\n/*! @name PIO0_12 (number 12), U15[4]/D7/P7[2]/IF_SWDIO\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN 12U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN_MASK (1U << 12U)\n/* @} */\n\n/*! @name PIO0_10 (number 21), U14[12]/SWO_TRGT\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN 10U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN_MASK (1U << 10U)\n/* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSWD_DEBUGPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Enables digital function */\n#define IOCON_PIO_DIGITAL_EN 0x0100u\n/*!\n * @brief Selects pin function 7 */\n#define IOCON_PIO_FUNC7 0x07u\n/*!\n * @brief Input function is not inverted */\n#define IOCON_PIO_INV_DI 0x00u\n/*!\n * @brief No addition pin function */\n#define IOCON_PIO_MODE_INACT 0x00u\n/*!\n * @brief Open drain is disabled */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u\n/*!\n * @brief Standard mode, output slew rate control is enabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO0_28_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 7. */\n#define PIO0_28_FUNC_ALT7 0x07u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO0_28_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_12_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_12_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_12_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_29_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_29_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_29_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_30_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_30_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_30_MODE_PULL_UP 0x02u\n\n/*! @name PIO0_22 (number 78), P10[1]/USB0_VBUS\n  @{ */\n#define BOARD_INITUSBPINS_USB0_VBUS_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITUSBPINS_USB0_VBUS_PIN 22U                   /*!<@brief PORT pin number */\n#define BOARD_INITUSBPINS_USB0_VBUS_PIN_MASK (1U << 22U)      /*!<@brief PORT pin mask */\n                                                              /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSBPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define PIO0_1_DIGIMODE_DIGITAL 0x01u /*!<@brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO0_1_FUNC_ALT0 0x00u        /*!<@brief Selects pin function.: Alternative connection 0. */\n\n/*! @name PIO0_1 (number 7), P18[2]/SD1_CLK\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_INIT_GPIO_VALUE 0U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_GPIO_PIN_MASK (1U << 1U) /*!<@brief GPIO pin mask */\n#define BOARD_INITLEDSPINS_LED_PORT 0U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_PIN 1U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_PIN_MASK (1U << 1U)      /*!<@brief PORT pin mask */\n                                                        /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLEDsPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_5 (number 88), S1/J10[1]/U3[12]/P17[8]/P7[7]/U11[4]/P0_5-ISP1\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_S1_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S1_GPIO_PIN_MASK (1U << 5U) /*!<@brief GPIO pin mask */\n#define BOARD_INITBUTTONSPINS_S1_PORT 0U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S1_PIN 5U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_S1_PIN_MASK (1U << 5U)      /*!<@brief PORT pin mask */\n                                                          /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitBUTTONsPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins_Core0(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC1 0x01u         /*!<@brief Selects pin function 1 */\n#define IOCON_PIO_FUNC2 0x02u         /*!<@brief Selects pin function 2 */\n#define IOCON_PIO_FUNC5 0x05u         /*!<@brief Selects pin function 5 */\n#define IOCON_PIO_FUNC7 0x07u         /*!<@brief Selects pin function 7 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_20 (number 4), P17[1]/P24[5]/FC4_I2C_SCL_ARD\n  @{ */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_21 (number 30), P17[3]/P24[6]/FC4_I2C_SDA_ARD\n  @{ */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_31 (number 91), P19[7]/P19[8]/PLU_IN0/GPIO\n  @{ */\n#define BOARD_INITI2SPINS_MCLK_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_MCLK_PIN 31U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_MCLK_PIN_MASK (1U << 31U)      /*!<@brief PORT pin mask */\n                                                         /* @} */\n\n/*! @name PIO0_21 (number 76), P17[14]/FC7_I2S_SCK\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO0_20 (number 74), P17[10]/FC7_I2S_TX\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO0_19 (number 90), P17[12]/FC7_I2S_WS\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PIN 19U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PIN_MASK (1U << 19U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO0_10 (number 21), U14[12]/SWO_TRGT\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PIN 10U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PIN_MASK (1U << 10U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_13 (number 2), P17[20]/FC6_I2S_RX\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PIN 13U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PIN_MASK (1U << 13U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO1_16 (number 87), P18[17]/SD1_PWR_EN\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PIN 16U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PIN_MASK (1U << 16U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitI2SPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DI 0x00u        /*!<@brief Analog switch is open (disabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_FUNC5 0x05u         /*!<@brief Selects pin function 5 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_21 (number 30), P17[3]/P24[6]/FC4_I2C_SDA_ARD\n  @{ */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name PIO1_20 (number 4), P17[1]/P24[5]/FC4_I2C_SCL_ARD\n  @{ */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name PIO1_19 (number 58), U7[3]/P18[14]/PLU_OUT1/GPIO\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITACCELPINS_ACCL_INTR_GPIO GPIO                 /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITACCELPINS_ACCL_INTR_GPIO_PIN_MASK (1U << 19U) /*!<@brief GPIO pin mask */\n#define BOARD_INITACCELPINS_ACCL_INTR_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_ACCL_INTR_PIN 19U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_ACCL_INTR_PIN_MASK (1U << 19U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitACCELPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board.cmake",
    "content": "set(MCU_VARIANT LPC55S69)\nset(MCU_CORE LPC55S69_cm33_core0)\n\nset(JLINK_DEVICE LPC55S69)\nset(PYOCD_TARGET LPC55S69)\nset(NXPLINK_DEVICE LPC55S69:LPCXpresso55S69)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/LPC55S69_cm33_core0_uf2.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_LPC55S69JBD100_cm33_core0\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Double M33 Express\n   url: https://www.crowdsupply.com/steiert-solutions/double-m33-express\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              BOARD_INITLEDSPINS_LED_PORT\n#define LED_PIN               BOARD_INITLEDSPINS_LED_PIN\n#define LED_STATE_ON          1\n\n// WAKE button\n#define BUTTON_PORT           BOARD_INITBUTTONSPINS_S1_PORT\n#define BUTTON_PIN            BOARD_INITBUTTONSPINS_S1_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART0\n\n// XTAL\n#define XTAL0_CLK_HZ          (16 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/board.mk",
    "content": "MCU_VARIANT = LPC55S69\nMCU_CORE = LPC55S69_cm33_core0\nRHPORT_DEVICE ?= 1\n\nCFLAGS += -DCPU_LPC55S69JBD100_cm33_core0\nLD_FILE = $(BOARD_PATH)/LPC55S69_cm33_core0_uf2.ld\n\nSRC_C += \\\n\t$(TOP)/$(BOARD_PATH)/board/clock_config.c \\\n\t$(TOP)/$(BOARD_PATH)/board/pin_mux.c \\\n\t$(TOP)/$(BOARD_PATH)/board/peripherals.c\n\nINC += $(TOP)/$(BOARD_PATH)/board\n\nJLINK_DEVICE = LPC55S69\nPYOCD_TARGET = LPC55S69\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/double_m33_express/double_m33_express.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"LPCXpresso55S69\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19 http://mcuxpresso.nxp.com/XSD/mex_configuration_19.xsd\" uuid=\"acf73d26-2bf9-4855-b3be-26068672d98a\" version=\"19\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>LPC55S69</processor>\n      <package>LPC55S69JBD100</package>\n      <board>LPCXpresso55S69</board>\n      <board_revision>A2</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"cm33_core0\">\n         <core name=\"Cortex-M33 (Core #0)\" id=\"cm33_core0\" description=\"\"/>\n         <core name=\"Cortex-M33 (Core #1)\" id=\"cm33_core1\" description=\"\"/>\n      </cores>\n      <description></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      <custom_copyright>\n         <text>/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n</text>\n         <enabled>true</enabled>\n      </custom_copyright>\n      <update_include_paths>true</update_include_paths>\n      <enable_parallel_routing>true</enable_parallel_routing>\n      <generate_registers_defines>false</generate_registers_defines>\n   </preferences>\n   <tools>\n      <pins name=\"Pins\" version=\"17.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>25.09.10</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"7\" pin_signal=\"PIO0_1/FC3_CTS_SDA_SSEL0/CT_INP0/SCT_GPI1/SD1_CLK/CMP0_OUT/SECURE_GPIO0_1\" label=\"P18[2]/SD1_CLK\" identifier=\"LED\"/>\n            </pin_labels>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM0\" description=\"Peripheral FLEXCOMM0 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM0\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"92\" pin_signal=\"PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM0\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"94\" pin_signal=\"PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSWD_DEBUGPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SWD\" description=\"Peripheral SWD signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SWD\" signal=\"SWCLK\" pin_num=\"13\" pin_signal=\"PIO0_11/FC6_RXD_SDA_MOSI_DATA/CTIMER2_MAT2/FREQME_GPIO_CLK_A/SWCLK/SECURE_GPIO0_11/ADC0_9\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullDown\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWDIO\" pin_num=\"12\" pin_signal=\"PIO0_12/FC3_TXD_SCL_MISO_WS/SD1_BACKEND_PWR/FREQME_GPIO_CLK_B/SCT_GPI7/SD0_POW_EN/SWDIO/FC6_TXD_SCL_MISO_WS/SECURE_GPIO0_12/ADC0_10\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWO\" pin_num=\"21\" pin_signal=\"PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"DEBUG_SWD_SWO\"/>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSBPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USBFSH\" description=\"Peripheral USBFSH signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USBHSH\" description=\"Peripheral USBHSH signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_DP\" pin_num=\"97\" pin_signal=\"USB0_DP\"/>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_DM\" pin_num=\"98\" pin_signal=\"USB0_DM\"/>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_VBUS\" pin_num=\"78\" pin_signal=\"PIO0_22/FC6_TXD_SCL_MISO_WS/UTICK_CAP1/CT_INP15/SCT0_OUT3/USB0_VBUS/SD1_D0/PLU_OUT7/SECURE_GPIO0_22\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_DM\" pin_num=\"35\" pin_signal=\"USB1_DM\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_DP\" pin_num=\"34\" pin_signal=\"USB1_DP\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_VBUS\" pin_num=\"36\" pin_signal=\"USB1_VBUS\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_OVERCURRENTN\" pin_num=\"65\" pin_signal=\"PIO1_30/FC7_TXD_SCL_MISO_WS/SD0_D7/SCT_GPI7/USB1_OVERCURRENTN/USB1_LEDN/PLU_IN1\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_OVERCURRENTN\" pin_num=\"66\" pin_signal=\"PIO0_28/FC0_SCK/SD1_CMD/CT_INP11/SCT0_OUT7/USB0_OVERCURRENTN/PLU_OUT1/SECURE_GPIO0_28\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_PORTPWRN\" pin_num=\"67\" pin_signal=\"PIO1_12/FC6_SCK/CTIMER1_MAT1/USB0_PORTPWRN/HS_SPI_SSEL2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_PORTPWRN\" pin_num=\"80\" pin_signal=\"PIO1_29/FC7_RXD_SDA_MOSI_DATA/SD0_D6/SCT_GPI6/USB1_PORTPWRN/USB1_FRAME/PLU_IN2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLEDsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO\" signal=\"PIO0, 1\" pin_num=\"7\" pin_signal=\"PIO0_1/FC3_CTS_SDA_SSEL0/CT_INP0/SCT_GPI1/SD1_CLK/CMP0_OUT/SECURE_GPIO0_1\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitBUTTONsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SYSCON\" description=\"Peripheral SYSCON signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO\" signal=\"PIO0, 5\" pin_num=\"88\" pin_signal=\"PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SYSCON\" signal=\"RESET\" pin_num=\"32\" pin_signal=\"RESETN\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitPins_Core0\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins_Core0\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins/>\n            </function>\n            <function name=\"BOARD_InitPins_Core1\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core1</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins_Core1\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins/>\n            </function>\n            <function name=\"BOARD_InitI2SPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM4\" description=\"Peripheral FLEXCOMM4 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SYSCON\" description=\"Peripheral SYSCON signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM7\" description=\"Peripheral FLEXCOMM7 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM6\" description=\"Peripheral FLEXCOMM6 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SYSCON\" signal=\"MCLK\" pin_num=\"91\" pin_signal=\"PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"SCK\" pin_num=\"76\" pin_signal=\"PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"74\" pin_signal=\"PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"90\" pin_signal=\"PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"SCK\" pin_num=\"21\" pin_signal=\"PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"FC6_I2S_CLK\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"2\" pin_signal=\"PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"87\" pin_signal=\"PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitACCELPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM4\" description=\"Peripheral FLEXCOMM4 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 19\" pin_num=\"58\" pin_signal=\"PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"18.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>25.09.10</processor_version>\n         </clocks_profile>\n         <clock_configurations>\n            <clock_configuration name=\"BOARD_BootClockFRO12M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources/>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings/>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockFROHF96M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"ANACTRL.fro_hf.outFreq\" value=\"96 MHz\" locked=\"false\" enabled=\"false\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG\" value=\"Enable\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELA.sel\" value=\"ANACTRL.fro_hf_clk\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockPLL100M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SYSCON.XTAL32M.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"100 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL0_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"ENABLE_CLKIN_ENA\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_SYSTEM_CLK_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELB.sel\" value=\"SYSCON.PLL0_BYPASS\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0M_MULT.scale\" value=\"100\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0N_DIV.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0_PDEC.scale\" value=\"4\" locked=\"true\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockPLL150M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SYSCON.XTAL32M.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"FXCOM0_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"144 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB0_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB1_PHY_clock.outFreq\" value=\"16 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL0_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"PLL1_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"ENABLE_CLKIN_ENA\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_PLL_USB_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_SYSTEM_CLK_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"SYSCON.FCCLKSEL0.sel\" value=\"SYSCON.PLL0DIV\" locked=\"false\"/>\n                  <setting id=\"SYSCON.FRGCTRL0_DIV.scale\" value=\"400\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELB.sel\" value=\"SYSCON.PLL1_BYPASS\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0DIV.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0M_MULT.scale\" value=\"150\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0N_DIV.scale\" value=\"8\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0_PDEC.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL1CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL1M_MULT.scale\" value=\"18\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL1_PDEC.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SYSCON.USB0CLKDIV.scale\" value=\"3\" locked=\"false\"/>\n                  <setting id=\"SYSCON.USB0CLKSEL.sel\" value=\"SYSCON.MAINCLKSELB\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"2.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"15.0\" enabled=\"true\" update_project_code=\"true\">\n         <dependencies>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.flexcomm_usart\" description=\"FLEXCOMM USART Driver is not found in the toolchain/IDE project. The project will not compile!\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data type=\"Boolean\">true</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.flexcomm_usart\" description=\"An unsupported version of the FLEXCOMM USART Driver in the toolchain/IDE project. Required: ${required_value}, actual: ${actual_value}. The project might not compile correctly.\" problem_level=\"1\" source=\"Peripherals\">\n               <feature name=\"version\" evaluation=\"equivalent\">\n                  <data type=\"Version\">2.2.0</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"Tool\" resourceId=\"Clocks\" description=\"The Clocks tool is required by the Peripherals tool, but it is disabled.\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data>true</data>\n               </feature>\n            </dependency>\n         </dependencies>\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>25.09.10</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals_cm33_core0\" uuid=\"61d0725d-b300-49cb-9c66-b5edfbf8ffc1\" called_from_default_init=\"true\" id_prefix=\"\" core=\"cm33_core0\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"ClockOutput\" resourceId=\"FXCOM0_clock\" description=\"FXCOM0 clock is inactive.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"frequency\" evaluation=\"greaterThan\">\n                        <data type=\"Frequency\" unit=\"Hz\">0</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"FLEXCOMM0.usart_rxd\" description=\"Signal RX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"FLEXCOMM0.usart_txd\" description=\"Signal TX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <instances>\n                  <instance name=\"ACCEL\" uuid=\"b999c56a-0d01-4089-9311-9224db5272f4\" type=\"flexcomm_i2c\" type_id=\"flexcomm_i2c_2.3.0\" mode=\"I2C_Polling\" peripheral=\"FLEXCOMM4\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_i2c\" quick_selection=\"QS_I2C_Master\">\n                        <setting name=\"i2c_mode\" value=\"kI2C_Master\"/>\n                        <setting name=\"clockSource\" value=\"FXCOMFunctionClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"i2c_master_config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"baudRate_Bps\" value=\"100000\"/>\n                           <setting name=\"enableTimeout\" value=\"false\"/>\n                           <setting name=\"timeout_Ms\" value=\"35\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"9fb0504c-6159-43e2-98bb-51d75f06133a\" type=\"flexcomm_usart\" type_id=\"flexcomm_usart_2.2.0\" mode=\"polling\" peripheral=\"FLEXCOMM0\" enabled=\"true\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"usartConfig_t\">\n                        <struct name=\"usartConfig\">\n                           <setting name=\"clockSource\" value=\"FXCOMFunctionClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"syncMode\" value=\"kUSART_SyncModeDisabled\"/>\n                           <setting name=\"parityMode\" value=\"kUSART_ParityDisabled\"/>\n                           <setting name=\"stopBitCount\" value=\"kUSART_OneStopBit\"/>\n                           <setting name=\"bitCountPerChar\" value=\"kUSART_8BitsPerChar\"/>\n                           <setting name=\"loopback\" value=\"false\"/>\n                           <setting name=\"txWatermark\" value=\"kUSART_TxFifo0\"/>\n                           <setting name=\"rxWatermark\" value=\"kUSART_RxFifo1\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"clockPolarity\" value=\"kUSART_RxSampleOnFallingEdge\"/>\n                           <setting name=\"enableContinuousSCLK\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LEDS\" uuid=\"f5ad3a56-404b-44cb-8abc-7b25b5551d33\" type=\"lpc_gpio\" type_id=\"lpc_gpio_2.1.1\" mode=\"GPIO\" peripheral=\"GPIO\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpc_gpio\"/>\n                  </instance>\n                  <instance name=\"SW\" uuid=\"d57ddfca-dc72-486c-a145-c7a2ab1e1a66\" type=\"lpc_gpio\" type_id=\"lpc_gpio_2.1.1\" mode=\"GPIO\" peripheral=\"GPIO\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpc_gpio\"/>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"56761ad9-9b77-4074-917d-de0fde10cd48\" type=\"nvic\" type_id=\"nvic\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n            <functional_group name=\"BOARD_InitPeripherals_cm33_core1\" uuid=\"e2041cd4-ebb6-45a5-807f-e0c2dc047d48\" called_from_default_init=\"false\" id_prefix=\"\" core=\"cm33_core1\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"NVIC_2\" uuid=\"db546092-4c45-40af-938a-8cc58edd1c4f\" type=\"nvic\" type_id=\"nvic\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"905d2747-654a-47d9-91f9-81a5c6f9c407\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n                  <setting name=\"global_init\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"64cbcd7c-424d-4baf-9681-a60878969fb6\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"b9b018dd-ef4e-41f6-b456-f91b855cb391\" type_id=\"generic_can\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"bafa6375-9184-4272-8102-06ea086041d7\" type_id=\"uart_cmsis_common\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"1710dc7f-381f-4b37-8f78-0fd2f923b3ac\" type_id=\"generic_uart\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"c7fc4395-b141-4b13-a326-4145e765b2b7\" type_id=\"generic_enet\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"b6ee89c2-4c58-4181-94dc-af13d8ae8ea5\" type_id=\"gpio_adapter_common\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"10.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n            <tool_options>\n               <option id=\"_output_type_\" value=\"c_code\"/>\n               <option id=\"_legacy_source_names_\" value=\"yes\"/>\n            </tool_options>\n         </tee_profile>\n         <functional_group name=\"BOARD_InitTrustZone\" called_from_default_init=\"true\" id_prefix=\"\" prefix_user_defined=\"true\">\n            <description></description>\n            <options/>\n            <ahb>\n               <relative_region start=\"0\" size=\"655360\" security=\"s_priv\" memory=\"PROGRAM_FLASH\"/>\n               <relative_region start=\"0\" size=\"131072\" security=\"s_priv\" memory=\"BootROM\"/>\n               <relative_region start=\"0\" size=\"32768\" security=\"s_priv\" memory=\"SRAMX\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM0\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM1\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM2\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM3\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"SRAM4\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"AHBperipherals_port10_ahb_secure_ctrl_area\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"USB_RAM\"/>\n               <masters>\n                  <master id=\"HASH\" security=\"ns_user\"/>\n                  <master id=\"MCM33C\" security=\"ns_user\"/>\n                  <master id=\"MCM33S\" security=\"ns_user\"/>\n                  <master id=\"PQ\" security=\"ns_user\"/>\n                  <master id=\"SDIO\" security=\"ns_user\"/>\n                  <master id=\"SDMA0\" security=\"ns_user\"/>\n                  <master id=\"SDMA1\" security=\"ns_user\"/>\n                  <master id=\"USBFSD\" security=\"ns_user\"/>\n                  <master id=\"USBFSH\" security=\"ns_user\"/>\n               </masters>\n               <peripherals>\n                  <peripheral id=\"ADC0\" security=\"s_priv\"/>\n                  <peripheral id=\"AHB_SECURE_CTRL\" security=\"s_priv\"/>\n                  <peripheral id=\"ANACTRL\" security=\"s_priv\"/>\n                  <peripheral id=\"CASPER\" security=\"s_priv\"/>\n                  <peripheral id=\"CRC_ENGINE\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER0\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER1\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER2\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER3\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER4\" security=\"s_priv\"/>\n                  <peripheral id=\"DBGMAILBOX\" security=\"s_priv\"/>\n                  <peripheral id=\"DMA0\" security=\"s_priv\"/>\n                  <peripheral id=\"DMA1\" security=\"s_priv\"/>\n                  <peripheral id=\"FLASH\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM0\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM1\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM2\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM3\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM4\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM5\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM6\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM7\" security=\"s_priv\"/>\n                  <peripheral id=\"GINT0\" security=\"s_priv\"/>\n                  <peripheral id=\"GINT1\" security=\"s_priv\"/>\n                  <peripheral id=\"GPIO\" security=\"s_priv\"/>\n                  <peripheral id=\"HASHCRYPT\" security=\"s_priv\"/>\n                  <peripheral id=\"INPUTMUX\" security=\"s_priv\"/>\n                  <peripheral id=\"IOCON\" security=\"s_priv\"/>\n                  <peripheral id=\"MAILBOX\" security=\"s_priv\"/>\n                  <peripheral id=\"MRT0\" security=\"s_priv\"/>\n                  <peripheral id=\"OSTIMER\" security=\"s_priv\"/>\n                  <peripheral id=\"PINT\" security=\"s_priv\"/>\n                  <peripheral id=\"PLU\" security=\"s_priv\"/>\n                  <peripheral id=\"PMC\" security=\"s_priv\"/>\n                  <peripheral id=\"POWERQUAD\" security=\"s_priv\"/>\n                  <peripheral id=\"PRINCE\" security=\"s_priv\"/>\n                  <peripheral id=\"PUF\" security=\"s_priv\"/>\n                  <peripheral id=\"RNG\" security=\"s_priv\"/>\n                  <peripheral id=\"RTC\" security=\"s_priv\"/>\n                  <peripheral id=\"SCT0\" security=\"s_priv\"/>\n                  <peripheral id=\"SDIF\" security=\"s_priv\"/>\n                  <peripheral id=\"SECGPIO\" security=\"s_priv\"/>\n                  <peripheral id=\"SECPINT\" security=\"s_priv\"/>\n                  <peripheral id=\"SPI8\" security=\"s_priv\"/>\n                  <peripheral id=\"SYSCON\" security=\"s_priv\"/>\n                  <peripheral id=\"SYSCTL\" security=\"s_priv\"/>\n                  <peripheral id=\"USB0\" security=\"s_priv\"/>\n                  <peripheral id=\"USBFSH\" security=\"s_priv\"/>\n                  <peripheral id=\"USBHSD\" security=\"s_priv\"/>\n                  <peripheral id=\"USBHSH\" security=\"s_priv\"/>\n                  <peripheral id=\"USBPHY\" security=\"s_priv\"/>\n                  <peripheral id=\"UTICK0\" security=\"s_priv\"/>\n                  <peripheral id=\"WWDT\" security=\"s_priv\"/>\n               </peripherals>\n               <interrupts>\n                  <masking>\n                     <interrupt id=\"acmp_capt_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"adc_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"casper_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer2_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer3_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer4_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm2_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm3_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm4_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm5_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm6_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm7_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"global_irq0\" masked=\"Masked\"/>\n                     <interrupt id=\"global_irq1\" masked=\"Masked\"/>\n                     <interrupt id=\"lspi_hs_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"mailbox_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"mrt_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"os_event_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int4\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int5\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int6\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int7\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq0\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq1\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq2\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq3\" masked=\"Masked\"/>\n                     <interrupt id=\"plu_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"pq_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"qddkey_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"rtc_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sct_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdio_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdma0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdma1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_hypervisor_call_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_int0\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_int1\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_vio_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sha_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sys_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb0_needclk_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_needclk_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_utmi_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"utick_irq\" masked=\"Masked\"/>\n                  </masking>\n                  <security>\n                     <interrupt id=\"acmp_capt_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"adc_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"casper_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer2_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer3_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer4_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm2_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm3_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm4_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm5_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm6_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm7_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"global_irq0\" secure=\"Secure\"/>\n                     <interrupt id=\"global_irq1\" secure=\"Secure\"/>\n                     <interrupt id=\"lspi_hs_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"mailbox_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"mrt_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"os_event_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int4\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int5\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int6\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int7\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq0\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq1\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq2\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq3\" secure=\"Secure\"/>\n                     <interrupt id=\"plu_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"pq_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"qddkey_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"rtc_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sct_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdio_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdma0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdma1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_hypervisor_call_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_int0\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_int1\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_vio_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sha_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sys_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb0_needclk_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_needclk_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_utmi_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"utick_irq\" secure=\"Secure\"/>\n                  </security>\n               </interrupts>\n               <ports>\n                  <port id=\"pio0\">\n                     <pin_mask id=\"0\" masked=\"Masked\"/>\n                     <pin_mask id=\"1\" masked=\"Masked\"/>\n                     <pin_mask id=\"10\" masked=\"Masked\"/>\n                     <pin_mask id=\"11\" masked=\"Masked\"/>\n                     <pin_mask id=\"12\" masked=\"Masked\"/>\n                     <pin_mask id=\"13\" masked=\"Masked\"/>\n                     <pin_mask id=\"14\" masked=\"Masked\"/>\n                     <pin_mask id=\"15\" masked=\"Masked\"/>\n                     <pin_mask id=\"16\" masked=\"Masked\"/>\n                     <pin_mask id=\"17\" masked=\"Masked\"/>\n                     <pin_mask id=\"18\" masked=\"Masked\"/>\n                     <pin_mask id=\"19\" masked=\"Masked\"/>\n                     <pin_mask id=\"2\" masked=\"Masked\"/>\n                     <pin_mask id=\"20\" masked=\"Masked\"/>\n                     <pin_mask id=\"21\" masked=\"Masked\"/>\n                     <pin_mask id=\"22\" masked=\"Masked\"/>\n                     <pin_mask id=\"23\" masked=\"Masked\"/>\n                     <pin_mask id=\"24\" masked=\"Masked\"/>\n                     <pin_mask id=\"25\" masked=\"Masked\"/>\n                     <pin_mask id=\"26\" masked=\"Masked\"/>\n                     <pin_mask id=\"27\" masked=\"Masked\"/>\n                     <pin_mask id=\"28\" masked=\"Masked\"/>\n                     <pin_mask id=\"29\" masked=\"Masked\"/>\n                     <pin_mask id=\"3\" masked=\"Masked\"/>\n                     <pin_mask id=\"30\" masked=\"Masked\"/>\n                     <pin_mask id=\"31\" masked=\"Masked\"/>\n                     <pin_mask id=\"4\" masked=\"Masked\"/>\n                     <pin_mask id=\"5\" masked=\"Masked\"/>\n                     <pin_mask id=\"6\" masked=\"Masked\"/>\n                     <pin_mask id=\"7\" masked=\"Masked\"/>\n                     <pin_mask id=\"8\" masked=\"Masked\"/>\n                     <pin_mask id=\"9\" masked=\"Masked\"/>\n                  </port>\n                  <port id=\"pio1\">\n                     <pin_mask id=\"0\" masked=\"Masked\"/>\n                     <pin_mask id=\"1\" masked=\"Masked\"/>\n                     <pin_mask id=\"10\" masked=\"Masked\"/>\n                     <pin_mask id=\"11\" masked=\"Masked\"/>\n                     <pin_mask id=\"12\" masked=\"Masked\"/>\n                     <pin_mask id=\"13\" masked=\"Masked\"/>\n                     <pin_mask id=\"14\" masked=\"Masked\"/>\n                     <pin_mask id=\"15\" masked=\"Masked\"/>\n                     <pin_mask id=\"16\" masked=\"Masked\"/>\n                     <pin_mask id=\"17\" masked=\"Masked\"/>\n                     <pin_mask id=\"18\" masked=\"Masked\"/>\n                     <pin_mask id=\"19\" masked=\"Masked\"/>\n                     <pin_mask id=\"2\" masked=\"Masked\"/>\n                     <pin_mask id=\"20\" masked=\"Masked\"/>\n                     <pin_mask id=\"21\" masked=\"Masked\"/>\n                     <pin_mask id=\"22\" masked=\"Masked\"/>\n                     <pin_mask id=\"23\" masked=\"Masked\"/>\n                     <pin_mask id=\"24\" masked=\"Masked\"/>\n                     <pin_mask id=\"25\" masked=\"Masked\"/>\n                     <pin_mask id=\"26\" masked=\"Masked\"/>\n                     <pin_mask id=\"27\" masked=\"Masked\"/>\n                     <pin_mask id=\"28\" masked=\"Masked\"/>\n                     <pin_mask id=\"29\" masked=\"Masked\"/>\n                     <pin_mask id=\"3\" masked=\"Masked\"/>\n                     <pin_mask id=\"30\" masked=\"Masked\"/>\n                     <pin_mask id=\"31\" masked=\"Masked\"/>\n                     <pin_mask id=\"4\" masked=\"Masked\"/>\n                     <pin_mask id=\"5\" masked=\"Masked\"/>\n                     <pin_mask id=\"6\" masked=\"Masked\"/>\n                     <pin_mask id=\"7\" masked=\"Masked\"/>\n                     <pin_mask id=\"8\" masked=\"Masked\"/>\n                     <pin_mask id=\"9\" masked=\"Masked\"/>\n                  </port>\n               </ports>\n            </ahb>\n            <saus>\n               <sau enabled=\"true\" all_non_secure=\"false\" generate_code_for_disabled_regions=\"false\">\n                  <region start=\"0\" size=\"268435456\" security=\"ns\" enabled=\"true\" index=\"0\"/>\n                  <region start=\"536870912\" size=\"3221225472\" security=\"ns\" enabled=\"true\" index=\"1\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"2\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"3\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"4\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"5\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"6\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"7\"/>\n               </sau>\n            </saus>\n            <global_options>\n               <option id=\"AIRCR_PRIS\" value=\"no\"/>\n               <option id=\"AIRCR_BFHFNMINS\" value=\"no\"/>\n               <option id=\"AIRCR_SYSRESETREQS\" value=\"no\"/>\n               <option id=\"SCR_SLEEPDEEPS\" value=\"no\"/>\n               <option id=\"SHCSR_SECUREFAULTENA\" value=\"no\"/>\n               <option id=\"CPACR_CP0\" value=\"3\"/>\n               <option id=\"CPACR_CP1\" value=\"3\"/>\n               <option id=\"CPACR_CP2\" value=\"0\"/>\n               <option id=\"CPACR_CP3\" value=\"0\"/>\n               <option id=\"CPACR_CP4\" value=\"0\"/>\n               <option id=\"CPACR_CP5\" value=\"0\"/>\n               <option id=\"CPACR_CP6\" value=\"0\"/>\n               <option id=\"CPACR_CP7\" value=\"0\"/>\n               <option id=\"CPACR_CP10\" value=\"3\"/>\n               <option id=\"CPACR_CP11\" value=\"3\"/>\n               <option id=\"NSACR_CP0\" value=\"yes\"/>\n               <option id=\"NSACR_CP1\" value=\"yes\"/>\n               <option id=\"NSACR_CP2\" value=\"no\"/>\n               <option id=\"NSACR_CP3\" value=\"no\"/>\n               <option id=\"NSACR_CP4\" value=\"no\"/>\n               <option id=\"NSACR_CP5\" value=\"no\"/>\n               <option id=\"NSACR_CP6\" value=\"no\"/>\n               <option id=\"NSACR_CP7\" value=\"no\"/>\n               <option id=\"NSACR_CP10\" value=\"yes\"/>\n               <option id=\"NSACR_CP11\" value=\"yes\"/>\n               <option id=\"CPPWR_SU0\" value=\"no\"/>\n               <option id=\"CPPWR_SUS0\" value=\"no\"/>\n               <option id=\"CPPWR_SU1\" value=\"no\"/>\n               <option id=\"CPPWR_SUS1\" value=\"no\"/>\n               <option id=\"CPPWR_SU2\" value=\"no\"/>\n               <option id=\"CPPWR_SUS2\" value=\"no\"/>\n               <option id=\"CPPWR_SU3\" value=\"no\"/>\n               <option id=\"CPPWR_SUS3\" value=\"no\"/>\n               <option id=\"CPPWR_SU4\" value=\"no\"/>\n               <option id=\"CPPWR_SUS4\" value=\"no\"/>\n               <option id=\"CPPWR_SU5\" value=\"no\"/>\n               <option id=\"CPPWR_SUS5\" value=\"no\"/>\n               <option id=\"CPPWR_SU6\" value=\"no\"/>\n               <option id=\"CPPWR_SUS6\" value=\"no\"/>\n               <option id=\"CPPWR_SU7\" value=\"no\"/>\n               <option id=\"CPPWR_SUS7\" value=\"no\"/>\n               <option id=\"CPPWR_SU10\" value=\"no\"/>\n               <option id=\"CPPWR_SUS10\" value=\"no\"/>\n               <option id=\"CPPWR_SU11\" value=\"no\"/>\n               <option id=\"CPPWR_SUS11\" value=\"no\"/>\n               <option id=\"SEC_GPIO_MASK0_LOCK\" value=\"no\"/>\n               <option id=\"SEC_GPIO_MASK1_LOCK\" value=\"no\"/>\n               <option id=\"SEC_CPU1_INT_MASK0_LOCK\" value=\"no\"/>\n               <option id=\"SEC_CPU1_INT_MASK1_LOCK\" value=\"no\"/>\n               <option id=\"MASTER_SEC_LEVEL_LOCK\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_NS_VTOR\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_NS_MPU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_S_VTAIRCR\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_S_MPU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_SAU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_REG_LOCK\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_NS_VTOR\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_NS_MPU\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_REG_LOCK\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_SECURE_CHECKING\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_SIMPLE_MASTER_STRICT_MODE\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_SMART_MASTER_STRICT_MODE\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_IDAU_ALL_NS\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_WRITE_LOCK\" value=\"yes\"/>\n            </global_options>\n            <mpus>\n               <mpu enabled=\"false\" priv_default_map=\"false\" handler_enabled=\"false\" id=\"s\" generate_code_for_disabled_regions=\"false\">\n                  <attributes>\n                     <group index=\"0\" id=\"Code\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"1\" id=\"RAM\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"2\" id=\"Peripheral\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"3\" id=\"3\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"4\" id=\"4\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"5\" id=\"5\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"6\" id=\"6\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"7\" id=\"7\" memory_type=\"device\" device=\"nGnRE\"/>\n                  </attributes>\n                  <regions>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"0\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"1\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"2\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"3\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"4\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"5\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"6\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"7\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                  </regions>\n               </mpu>\n               <mpu enabled=\"false\" priv_default_map=\"false\" handler_enabled=\"false\" id=\"ns\" generate_code_for_disabled_regions=\"false\">\n                  <attributes>\n                     <group index=\"0\" id=\"Code\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"1\" id=\"RAM\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"2\" id=\"Peripheral\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"3\" id=\"3\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"4\" id=\"4\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"5\" id=\"5\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"6\" id=\"6\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"7\" id=\"7\" memory_type=\"device\" device=\"nGnRE\"/>\n                  </attributes>\n                  <regions>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"0\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"1\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"2\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"3\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"4\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"5\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"6\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"7\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                  </regions>\n               </mpu>\n            </mpus>\n         </functional_group>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/LPCXpresso55S28.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"LPCXpresso55S28\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19 http://mcuxpresso.nxp.com/XSD/mex_configuration_19.xsd\" uuid=\"485a5299-e2fe-41ab-bc43-80d8d2a4ae02\" version=\"19\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>LPC55S28</processor>\n      <package>LPC55S28JBD100</package>\n      <board>LPCXpresso55S28</board>\n      <board_revision>A2</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"cm33_core0\">\n         <core name=\"Cortex-M33 (Core #0)\" id=\"cm33_core0\" description=\"\"/>\n      </cores>\n      <description></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      <custom_copyright>\n         <text>/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n</text>\n         <enabled>true</enabled>\n      </custom_copyright>\n      <update_include_paths>true</update_include_paths>\n      <enable_parallel_routing>true</enable_parallel_routing>\n      <generate_registers_defines>false</generate_registers_defines>\n   </preferences>\n   <tools>\n      <pins name=\"Pins\" version=\"17.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>25.09.10</processor_version>\n            <external_user_signals>\n               <properties/>\n            </external_user_signals>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM0\" description=\"Peripheral FLEXCOMM0 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM0\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"92\" pin_signal=\"PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM0\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"94\" pin_signal=\"PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSWD_DEBUGPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SWD\" description=\"Peripheral SWD signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SWD\" signal=\"SWCLK\" pin_num=\"13\" pin_signal=\"PIO0_11/FC6_RXD_SDA_MOSI_DATA/CTIMER2_MAT2/FREQME_GPIO_CLK_A/SWCLK/SECURE_GPIO0_11/ADC0_9\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullDown\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWDIO\" pin_num=\"12\" pin_signal=\"PIO0_12/FC3_TXD_SCL_MISO_WS/SD1_BACKEND_PWR/FREQME_GPIO_CLK_B/SCT_GPI7/SD0_POW_EN/SWDIO/FC6_TXD_SCL_MISO_WS/SECURE_GPIO0_12/ADC0_10\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWO\" pin_num=\"21\" pin_signal=\"PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"DEBUG_SWD_SWO\"/>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSBPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USBFSH\" description=\"Peripheral USBFSH signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USBHSH\" description=\"Peripheral USBHSH signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_DP\" pin_num=\"97\" pin_signal=\"USB0_DP\"/>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_DM\" pin_num=\"98\" pin_signal=\"USB0_DM\"/>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_VBUS\" pin_num=\"78\" pin_signal=\"PIO0_22/FC6_TXD_SCL_MISO_WS/UTICK_CAP1/CT_INP15/SCT0_OUT3/USB0_VBUS/SD1_D0/PLU_OUT7/SECURE_GPIO0_22\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_DM\" pin_num=\"35\" pin_signal=\"USB1_DM\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_DP\" pin_num=\"34\" pin_signal=\"USB1_DP\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_VBUS\" pin_num=\"36\" pin_signal=\"USB1_VBUS\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_PORTPWRN\" pin_num=\"80\" pin_signal=\"PIO1_29/FC7_RXD_SDA_MOSI_DATA/SD0_D6/SCT_GPI6/USB1_PORTPWRN/USB1_FRAME/PLU_IN2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_PORTPWRN\" pin_num=\"67\" pin_signal=\"PIO1_12/FC6_SCK/CTIMER1_MAT1/USB0_PORTPWRN/HS_SPI_SSEL2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_OVERCURRENTN\" pin_num=\"66\" pin_signal=\"PIO0_28/FC0_SCK/SD1_CMD/CT_INP11/SCT0_OUT7/USB0_OVERCURRENTN/PLU_OUT1/SECURE_GPIO0_28\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_OVERCURRENTN\" pin_num=\"65\" pin_signal=\"PIO1_30/FC7_TXD_SCL_MISO_WS/SD0_D7/SCT_GPI7/USB1_OVERCURRENTN/USB1_LEDN/PLU_IN1\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLEDsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 4\" pin_num=\"1\" pin_signal=\"PIO1_4/FC0_SCK/SD0_D0/CTIMER2_MAT1/SCT0_OUT0/FREQME_GPIO_CLK_A\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 6\" pin_num=\"5\" pin_signal=\"PIO1_6/FC0_TXD_SCL_MISO_WS/SD0_D3/CTIMER2_MAT1/SCT_GPI3\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 7\" pin_num=\"9\" pin_signal=\"PIO1_7/FC0_RTS_SCL_SSEL1/SD0_D1/CTIMER2_MAT2/SCT_GPI4\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitBUTTONsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SYSCON\" description=\"Peripheral SYSCON signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO\" signal=\"PIO0, 5\" pin_num=\"88\" pin_signal=\"PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 18\" pin_num=\"64\" pin_signal=\"PIO1_18/SD1_POW_EN/SCT0_OUT5/PLU_OUT0\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 9\" pin_num=\"10\" pin_signal=\"PIO1_9/FC1_SCK/CT_INP4/SCT0_OUT2/FC4_CTS_SDA_SSEL0/ADC0_12\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SYSCON\" signal=\"RESET\" pin_num=\"32\" pin_signal=\"RESETN\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitPins_Core0\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins_Core0\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins/>\n            </function>\n            <function name=\"BOARD_InitI2SPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM4\" description=\"Peripheral FLEXCOMM4 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SYSCON\" description=\"Peripheral SYSCON signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM7\" description=\"Peripheral FLEXCOMM7 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM6\" description=\"Peripheral FLEXCOMM6 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SYSCON\" signal=\"MCLK\" pin_num=\"91\" pin_signal=\"PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"SCK\" pin_num=\"76\" pin_signal=\"PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"74\" pin_signal=\"PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"90\" pin_signal=\"PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"SCK\" pin_num=\"21\" pin_signal=\"PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"FC6_I2S_CLK\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"2\" pin_signal=\"PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"87\" pin_signal=\"PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitACCELPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM4\" description=\"Peripheral FLEXCOMM4 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 19\" pin_num=\"58\" pin_signal=\"PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"18.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>25.09.10</processor_version>\n         </clocks_profile>\n         <clock_configurations>\n            <clock_configuration name=\"BOARD_BootClockFRO12M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources/>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL1_Mode\" value=\"Normal\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockFROHF96M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"ANACTRL.fro_hf.outFreq\" value=\"96 MHz\" locked=\"false\" enabled=\"false\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG\" value=\"Enable\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELA.sel\" value=\"ANACTRL.fro_hf_clk\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockPLL100M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SYSCON.XTAL32M.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"100 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL0_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"ENABLE_CLKIN_ENA\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_SYSTEM_CLK_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELB.sel\" value=\"SYSCON.PLL0_BYPASS\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0M_MULT.scale\" value=\"100\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0N_DIV.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0_PDEC.scale\" value=\"4\" locked=\"true\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockPLL150M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SYSCON.XTAL32M.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"FXCOM0_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"SYSTICK0_clock.outFreq\" value=\"144 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"144 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB0_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB1_PHY_clock.outFreq\" value=\"16 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL0_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"PLL1_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"ENABLE_CLKIN_ENA\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_PLL_USB_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_SYSTEM_CLK_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"SYSCON.FCCLKSEL0.sel\" value=\"SYSCON.PLL0DIV\" locked=\"false\"/>\n                  <setting id=\"SYSCON.FRGCTRL0_DIV.scale\" value=\"400\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELB.sel\" value=\"SYSCON.PLL1_BYPASS\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0DIV.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0M_MULT.scale\" value=\"150\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0N_DIV.scale\" value=\"8\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0_PDEC.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL1CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL1M_MULT.scale\" value=\"18\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL1_PDEC.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SYSCON.SYSTICKCLKSEL0.sel\" value=\"SYSCON.SYSTICKCLKDIV0\" locked=\"false\"/>\n                  <setting id=\"SYSCON.USB0CLKDIV.scale\" value=\"3\" locked=\"false\"/>\n                  <setting id=\"SYSCON.USB0CLKSEL.sel\" value=\"SYSCON.MAINCLKSELB\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"2.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\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=\"true\" update_project_code=\"true\">\n         <dependencies>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.flexcomm_usart\" description=\"FLEXCOMM USART Driver is not found in the toolchain/IDE project. The project will not compile!\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data type=\"Boolean\">true</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.flexcomm_usart\" description=\"An unsupported version of the FLEXCOMM USART Driver in the toolchain/IDE project. Required: ${required_value}, actual: ${actual_value}. The project might not compile correctly.\" problem_level=\"1\" source=\"Peripherals\">\n               <feature name=\"version\" evaluation=\"equivalent\">\n                  <data type=\"Version\">2.2.0</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"Tool\" resourceId=\"Clocks\" description=\"The Clocks tool is required by the Peripherals tool, but it is disabled.\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data>true</data>\n               </feature>\n            </dependency>\n         </dependencies>\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>25.09.10</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"61d0725d-b300-49cb-9c66-b5edfbf8ffc1\" called_from_default_init=\"true\" id_prefix=\"\" core=\"cm33_core0\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"ClockOutput\" resourceId=\"FXCOM0_clock\" description=\"FXCOM0 clock is inactive.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"frequency\" evaluation=\"greaterThan\">\n                        <data type=\"Frequency\" unit=\"Hz\">0</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"FLEXCOMM0.usart_rxd\" description=\"Signal RX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"FLEXCOMM0.usart_txd\" description=\"Signal TX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <instances>\n                  <instance name=\"DEBUG_UART\" uuid=\"30367b6e-4b43-4345-bc10-e4052723fa66\" type=\"flexcomm_usart\" type_id=\"flexcomm_usart_2.2.0\" mode=\"polling\" peripheral=\"FLEXCOMM0\" enabled=\"true\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"usartConfig_t\">\n                        <struct name=\"usartConfig\">\n                           <setting name=\"clockSource\" value=\"FXCOMFunctionClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"syncMode\" value=\"kUSART_SyncModeDisabled\"/>\n                           <setting name=\"parityMode\" value=\"kUSART_ParityDisabled\"/>\n                           <setting name=\"stopBitCount\" value=\"kUSART_OneStopBit\"/>\n                           <setting name=\"bitCountPerChar\" value=\"kUSART_8BitsPerChar\"/>\n                           <setting name=\"loopback\" value=\"false\"/>\n                           <setting name=\"txWatermark\" value=\"kUSART_TxFifo0\"/>\n                           <setting name=\"rxWatermark\" value=\"kUSART_RxFifo1\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"clockPolarity\" value=\"kUSART_RxSampleOnFallingEdge\"/>\n                           <setting name=\"enableContinuousSCLK\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"ACCEL\" uuid=\"796441cb-6cbf-48af-8003-54caaeb9a132\" type=\"flexcomm_i2c\" type_id=\"flexcomm_i2c_2.0.1\" mode=\"I2C_Polling\" peripheral=\"FLEXCOMM4\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_i2c\" quick_selection=\"QS_I2C_Master\">\n                        <setting name=\"i2c_mode\" value=\"kI2C_Master\"/>\n                        <setting name=\"clockSource\" value=\"FXCOMFunctionClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"i2c_master_config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"baudRate_Bps\" value=\"100000\"/>\n                           <setting name=\"enableTimeout\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"SW\" uuid=\"723cdb07-2d95-4daf-94b4-1dfaf0ce6c04\" type=\"lpc_gpio\" type_id=\"lpc_gpio_2.1.1\" mode=\"GPIO\" peripheral=\"GPIO\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpc_gpio\"/>\n                  </instance>\n                  <instance name=\"LEDS\" uuid=\"7ec70f15-5deb-44fa-b8cf-2d12230a37ac\" type=\"lpc_gpio\" type_id=\"lpc_gpio_2.1.1\" mode=\"GPIO\" peripheral=\"GPIO\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpc_gpio\"/>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"d00e8bd3-19f3-445c-9444-103d6461e0d1\" type=\"nvic\" type_id=\"nvic\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"4e239a4c-f368-4554-b66e-d1af6e8b1f5d\" type_id=\"system_54b53072540eeeb8f8e9343e71f28176\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n                  <setting name=\"global_init\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"7bbbd3b5-f7c2-4cb2-8b95-c037fdaf8e02\" type_id=\"msg_6e2baaf3b97dbeef01c0043275f9a0e7\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"1560ea56-1bfb-4123-a192-daeeed8f2a1d\" type_id=\"generic_can\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"4305ffdd-d7f2-418a-b81b-8a042e7e4c75\" type_id=\"uart_cmsis_common\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"fe22d2c9-7984-4e79-a7b1-8d26fad750be\" type_id=\"generic_uart\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"f5a27f2d-a41b-4143-ad53-b9ee09903619\" type_id=\"generic_enet\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"03fd1bc8-0fd6-4b47-a53c-1c40e2aa781e\" type_id=\"gpio_adapter_common\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"10.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>N/A</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board/clock_config.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to set up clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up wait states of the flash.\n *\n * 3. Set up all dividers.\n *\n * 4. Set up all selectors to provide selected clocks.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v18.0\nprocessor: LPC55S28\npackage_id: LPC55S28JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S28\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_power.h\"\n#include \"fsl_clock.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockPLL150M();\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO12M\noutputs:\n- {id: System_clock.outFreq, value: 12 MHz}\nsettings:\n- {id: PLL1_Mode, value: Normal}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO12M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    POWER_SetVoltageForFreq(12000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(12000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO12M */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF96M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFROHF96M\noutputs:\n- {id: System_clock.outFreq, value: 96 MHz}\nsettings:\n- {id: ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG, value: Enable}\n- {id: SYSCON.MAINCLKSELA.sel, value: ANACTRL.fro_hf_clk}\nsources:\n- {id: ANACTRL.fro_hf.outFreq, value: 96 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFROHF96M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    CLOCK_SetupFROClocking(96000000U);                   /* Enable FRO HF(96MHz) output */\n\n    POWER_SetVoltageForFreq(96000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(96000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO_HF */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL100M\noutputs:\n- {id: System_clock.outFreq, value: 100 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: ENABLE_CLKIN_ENA, value: Enabled}\n- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}\n- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL0_BYPASS}\n- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL0M_MULT.scale, value: '100', locked: true}\n- {id: SYSCON.PLL0N_DIV.scale, value: '4', locked: true}\n- {id: SYSCON.PLL0_PDEC.scale, value: '4', locked: true}\nsources:\n- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL100M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    /*!< Configure XTAL32M */\n    POWER_DisablePD(kPDRUNCFG_PD_XTAL32M);                        /* Ensure XTAL32M is powered */\n    POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M);                       /* Ensure XTAL32M is powered */\n    CLOCK_SetupExtClocking(16000000U);                            /* Enable clk_in clock */\n    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;       /* Enable clk_in from XTAL32M clock  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;    /* Enable clk_in to system  */\n\n    POWER_SetVoltageForFreq(100000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(100000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up PLL */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL0);                    /*!< Switch PLL0CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0);                  /* Ensure PLL is on  */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(26U),\n        .pllndec = SYSCON_PLL0NDEC_NDIV(4U),\n        .pllpdec = SYSCON_PLL0PDEC_PDIV(2U),\n        .pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(100U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},\n        .pllRate = 100000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL0_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL0 */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL100M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL150M\ncalled_from_default_init: true\noutputs:\n- {id: FXCOM0_clock.outFreq, value: 48 MHz}\n- {id: SYSTICK0_clock.outFreq, value: 144 MHz}\n- {id: System_clock.outFreq, value: 144 MHz}\n- {id: USB0_clock.outFreq, value: 48 MHz}\n- {id: USB1_PHY_clock.outFreq, value: 16 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: PLL1_Mode, value: Normal}\n- {id: ENABLE_CLKIN_ENA, value: Enabled}\n- {id: ENABLE_PLL_USB_OUT, value: Enabled}\n- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}\n- {id: SYSCON.FCCLKSEL0.sel, value: SYSCON.PLL0DIV}\n- {id: SYSCON.FRGCTRL0_DIV.scale, value: '400'}\n- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL1_BYPASS}\n- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL0DIV.scale, value: '2'}\n- {id: SYSCON.PLL0M_MULT.scale, value: '150', locked: true}\n- {id: SYSCON.PLL0N_DIV.scale, value: '8', locked: true}\n- {id: SYSCON.PLL0_PDEC.scale, value: '2', locked: true}\n- {id: SYSCON.PLL1CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL1M_MULT.scale, value: '18'}\n- {id: SYSCON.PLL1_PDEC.scale, value: '2'}\n- {id: SYSCON.SYSTICKCLKSEL0.sel, value: SYSCON.SYSTICKCLKDIV0}\n- {id: SYSCON.USB0CLKDIV.scale, value: '3'}\n- {id: SYSCON.USB0CLKSEL.sel, value: SYSCON.MAINCLKSELB}\nsources:\n- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL150M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    /*!< Configure XTAL32M */\n    POWER_DisablePD(kPDRUNCFG_PD_XTAL32M);                        /* Ensure XTAL32M is powered */\n    POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M);                       /* Ensure XTAL32M is powered */\n    CLOCK_SetupExtClocking(16000000U);                            /* Enable clk_in clock */\n    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;       /* Enable clk_in from XTAL32M clock  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;    /* Enable clk_in to system  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_PLL_USB_OUT_MASK;       /* Enable clk_in to HS USB  */\n\n    POWER_SetVoltageForFreq(144000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(144000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up PLL */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL0);                    /*!< Switch PLL0CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0);                  /* Ensure PLL is on  */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(31U),\n        .pllndec = SYSCON_PLL0NDEC_NDIV(8U),\n        .pllpdec = SYSCON_PLL0PDEC_PDIV(1U),\n        .pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(150U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},\n        .pllRate = 150000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n\n    /*!< Set up PLL1 */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL1);                    /*!< Switch PLL1CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL1);                  /* Ensure PLL is on  */\n    const pll_setup_t pll1Setup = {\n        .pllctrl = SYSCON_PLL1CTRL_CLKEN_MASK | SYSCON_PLL1CTRL_SELI(11U) | SYSCON_PLL1CTRL_SELP(5U),\n        .pllndec = SYSCON_PLL1NDEC_NDIV(1U),\n        .pllpdec = SYSCON_PLL1PDEC_PDIV(1U),\n        .pllmdec = SYSCON_PLL1MDEC_MDIV(18U),\n        .pllRate = 144000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL1Freq(&pll1Setup);                        /*!< Configure PLL1 to the desired values */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivSystickClk0, 0U, true);               /*!< Reset SYSTICKCLKDIV0 divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivSystickClk0, 1U, false);              /*!< Set SYSTICKCLKDIV0 divider to value 1 */\n    #if FSL_CLOCK_DRIVER_VERSION >= MAKE_VERSION(2, 3, 4)\n      CLOCK_SetClkDiv(kCLOCK_DivFlexFrg0, 144U, false);         /*!< Set DIV to value 0xFF and MULT to value 144U in related FLEXFRGCTRL register */\n    #else\n      CLOCK_SetClkDiv(kCLOCK_DivFlexFrg0, 37120U, false);         /*!< Set DIV to value 0xFF and MULT to value 144U in related FLEXFRGCTRL register */\n    #endif\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 0U, true);               /*!< Reset USB0CLKDIV divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 3U, false);         /*!< Set USB0CLKDIV divider to value 3 */\n    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 0U, true);               /*!< Reset PLL0DIV divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 2U, false);         /*!< Set PLL0DIV divider to value 2 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL1_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL1 */\n    CLOCK_AttachClk(kMAIN_CLK_to_USB0_CLK);                 /*!< Switch USB0_CLK to MAIN_CLK */\n    CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM0);                 /*!< Switch FLEXCOMM0 to PLL0_DIV */\n    CLOCK_AttachClk(kSYSTICK_DIV0_to_SYSTICK0);                 /*!< Switch SYSTICK0 to SYSTICK_DIV0 */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;\n#endif\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board/clock_config.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         16000000U  /*!< Board xtal frequency in Hz */\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32K frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK           12000000U  /*!< Core clock frequency: 12000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO12M_ASYNCADC_CLOCK          0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO12M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER3_CLOCK           0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER4_CLOCK           0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM0_CLOCK            0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM1_CLOCK            0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM2_CLOCK            0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM3_CLOCK            0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM4_CLOCK            0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM5_CLOCK            0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM6_CLOCK            0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM7_CLOCK            0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKFRO12M_HSLSPI_CLOCK            0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKFRO12M_MCLK_CLOCK              0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_OSC32KHZ_CLOCK          0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFRO12M_OSTIMER32KHZ_CLOCK      0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKFRO12M_PLUCLKIN_CLOCK          0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_PLU_GLITCH_12MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_PLU_GLITCH_1MHZ_CLOCK   0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_RTC1HZ_CLOCK            0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_RTC1KHZ_CLOCK           0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SCT_CLOCK               0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKFRO12M_SDIO_CLOCK              0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKFRO12M_SYSTICK0_CLOCK          0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SYSTEM_CLOCK            12000000UL     /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKFRO12M_TRACE_CLOCK             0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO12M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKFRO12M_USB1_PHY_CLOCK          0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFRO12M_UTICK_CLOCK             0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO12M_WDT_CLOCK               0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO12M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF96M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK         96000000U  /*!< Core clock frequency: 96000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFROHF96M_ASYNCADC_CLOCK        0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFROHF96M_CLKOUT_CLOCK          0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER0_CLOCK         0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER1_CLOCK         0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER2_CLOCK         0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER3_CLOCK         0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER4_CLOCK         0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM0_CLOCK          0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM1_CLOCK          0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM2_CLOCK          0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM3_CLOCK          0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM4_CLOCK          0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM5_CLOCK          0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM6_CLOCK          0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM7_CLOCK          0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKFROHF96M_HSLSPI_CLOCK          0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKFROHF96M_MCLK_CLOCK            0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_OSC32KHZ_CLOCK        0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFROHF96M_OSTIMER32KHZ_CLOCK    0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKFROHF96M_PLUCLKIN_CLOCK        0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_PLU_GLITCH_12MHZ_CLOCK 0UL           /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_PLU_GLITCH_1MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_RTC1HZ_CLOCK          0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_RTC1KHZ_CLOCK         0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SCT_CLOCK             0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKFROHF96M_SDIO_CLOCK            0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTICK0_CLOCK        0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTEM_CLOCK          96000000UL     /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKFROHF96M_TRACE_CLOCK           0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFROHF96M_USB0_CLOCK            0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKFROHF96M_USB1_PHY_CLOCK        0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFROHF96M_UTICK_CLOCK           0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFROHF96M_WDT_CLOCK             0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFROHF96M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL100M_CORE_CLOCK         100000000U  /*!< Core clock frequency: 100000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKPLL100M_ASYNCADC_CLOCK         0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKPLL100M_CLKOUT_CLOCK           0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER0_CLOCK          0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER1_CLOCK          0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER2_CLOCK          0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER3_CLOCK          0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER4_CLOCK          0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM0_CLOCK           0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM1_CLOCK           0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM2_CLOCK           0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM3_CLOCK           0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM4_CLOCK           0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM5_CLOCK           0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM6_CLOCK           0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM7_CLOCK           0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKPLL100M_HSLSPI_CLOCK           0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKPLL100M_MCLK_CLOCK             0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_OSC32KHZ_CLOCK         0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL100M_OSTIMER32KHZ_CLOCK     0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKPLL100M_PLUCLKIN_CLOCK         0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_PLU_GLITCH_12MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_PLU_GLITCH_1MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_RTC1HZ_CLOCK           0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_RTC1KHZ_CLOCK          0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SCT_CLOCK              0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKPLL100M_SDIO_CLOCK             0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKPLL100M_SYSTICK0_CLOCK         0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SYSTEM_CLOCK           100000000UL    /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKPLL100M_TRACE_CLOCK            0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKPLL100M_USB0_CLOCK             0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKPLL100M_USB1_PHY_CLOCK         0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL100M_UTICK_CLOCK            0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKPLL100M_WDT_CLOCK              0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL100M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL150M_CORE_CLOCK         144000000U  /*!< Core clock frequency: 144000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKPLL150M_ASYNCADC_CLOCK         0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKPLL150M_CLKOUT_CLOCK           0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER0_CLOCK          0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER1_CLOCK          0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER2_CLOCK          0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER3_CLOCK          0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER4_CLOCK          0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM0_CLOCK           48000000UL     /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM1_CLOCK           0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM2_CLOCK           0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM3_CLOCK           0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM4_CLOCK           0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM5_CLOCK           0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM6_CLOCK           0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM7_CLOCK           0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKPLL150M_HSLSPI_CLOCK           0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKPLL150M_MCLK_CLOCK             0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_OSC32KHZ_CLOCK         0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL150M_OSTIMER32KHZ_CLOCK     0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKPLL150M_PLUCLKIN_CLOCK         0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_PLU_GLITCH_12MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_PLU_GLITCH_1MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_RTC1HZ_CLOCK           0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_RTC1KHZ_CLOCK          0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SCT_CLOCK              0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKPLL150M_SDIO_CLOCK             0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKPLL150M_SYSTICK0_CLOCK         144000000UL    /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SYSTEM_CLOCK           144000000UL    /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKPLL150M_TRACE_CLOCK            0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKPLL150M_USB0_CLOCK             48000000UL     /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKPLL150M_USB1_PHY_CLOCK         16000000UL     /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL150M_UTICK_CLOCK            0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKPLL150M_WDT_CLOCK              0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL150M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board/peripherals.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Peripherals v15.0\nprocessor: LPC55S28\npackage_id: LPC55S28JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S28\nfunctionalGroups:\n- name: BOARD_InitPeripherals\n  UUID: 61d0725d-b300-49cb-9c66-b5edfbf8ffc1\n  called_from_default_init: true\n  selectedCore: cm33_core0\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'system'\n- type_id: 'system_54b53072540eeeb8f8e9343e71f28176'\n- global_system_definitions:\n  - user_definitions: ''\n  - user_includes: ''\n  - global_init: ''\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'uart_cmsis_common'\n- type_id: 'uart_cmsis_common'\n- global_USART_CMSIS_common:\n  - quick_selection: 'default'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'gpio_adapter_common'\n- type_id: 'gpio_adapter_common'\n- global_gpio_adapter_common:\n  - quick_selection: 'default'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/***********************************************************************************************************************\n * Included files\n **********************************************************************************************************************/\n#include \"peripherals.h\"\n\n/***********************************************************************************************************************\n * BOARD_InitPeripherals functional group\n **********************************************************************************************************************/\n/***********************************************************************************************************************\n * DEBUG_UART initialization code\n **********************************************************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ninstance:\n- name: 'DEBUG_UART'\n- type: 'flexcomm_usart'\n- mode: 'polling'\n- custom_name_enabled: 'true'\n- type_id: 'flexcomm_usart_2.2.0'\n- functional_group: 'BOARD_InitPeripherals'\n- peripheral: 'FLEXCOMM0'\n- config_sets:\n  - usartConfig_t:\n    - usartConfig:\n      - clockSource: 'FXCOMFunctionClock'\n      - clockSourceFreq: 'ClocksTool_DefaultInit'\n      - baudRate_Bps: '115200'\n      - syncMode: 'kUSART_SyncModeDisabled'\n      - parityMode: 'kUSART_ParityDisabled'\n      - stopBitCount: 'kUSART_OneStopBit'\n      - bitCountPerChar: 'kUSART_8BitsPerChar'\n      - loopback: 'false'\n      - txWatermark: 'kUSART_TxFifo0'\n      - rxWatermark: 'kUSART_RxFifo1'\n      - enableRx: 'true'\n      - enableTx: 'true'\n      - clockPolarity: 'kUSART_RxSampleOnFallingEdge'\n      - enableContinuousSCLK: 'false'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\nconst usart_config_t DEBUG_UART_config = {\n  .baudRate_Bps = 115200UL,\n  .syncMode = kUSART_SyncModeDisabled,\n  .parityMode = kUSART_ParityDisabled,\n  .stopBitCount = kUSART_OneStopBit,\n  .bitCountPerChar = kUSART_8BitsPerChar,\n  .loopback = false,\n  .txWatermark = kUSART_TxFifo0,\n  .rxWatermark = kUSART_RxFifo1,\n  .enableRx = true,\n  .enableTx = true,\n  .enableMode32k = false,\n  .clockPolarity = kUSART_RxSampleOnFallingEdge,\n  .enableContinuousSCLK = false\n};\n\nstatic void DEBUG_UART_init(void) {\n  /* Reset FLEXCOMM device */\n  RESET_PeripheralReset(kFC0_RST_SHIFT_RSTn);\n  USART_Init(DEBUG_UART_PERIPHERAL, &DEBUG_UART_config, DEBUG_UART_CLOCK_SOURCE);\n}\n\n/***********************************************************************************************************************\n * NVIC initialization code\n **********************************************************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ninstance:\n- name: 'NVIC'\n- type: 'nvic'\n- mode: 'general'\n- custom_name_enabled: 'false'\n- type_id: 'nvic'\n- functional_group: 'BOARD_InitPeripherals'\n- peripheral: 'NVIC'\n- config_sets:\n  - nvic:\n    - interrupt_table: []\n    - interrupts: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/* Empty initialization function (commented out)\nstatic void NVIC_init(void) {\n} */\n\n/***********************************************************************************************************************\n * Initialization functions\n **********************************************************************************************************************/\nvoid BOARD_InitPeripherals(void)\n{\n  /* Initialize components */\n  DEBUG_UART_init();\n}\n\n/***********************************************************************************************************************\n * BOARD_InitBootPeripherals function\n **********************************************************************************************************************/\nvoid BOARD_InitBootPeripherals(void)\n{\n  BOARD_InitPeripherals();\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board/peripherals.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PERIPHERALS_H_\n#define _PERIPHERALS_H_\n\n/***********************************************************************************************************************\n * Included files\n **********************************************************************************************************************/\n#include \"fsl_common.h\"\n#include \"fsl_reset.h\"\n#include \"fsl_usart.h\"\n#include \"fsl_clock.h\"\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus */\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n/* Definitions for BOARD_InitPeripherals functional group */\n/* Definition of peripheral ID */\n#define DEBUG_UART_PERIPHERAL ((USART_Type *)FLEXCOMM0)\n/* Definition of the clock source frequency */\n#define DEBUG_UART_CLOCK_SOURCE 48000000UL\n\n/***********************************************************************************************************************\n * Global variables\n **********************************************************************************************************************/\nextern const usart_config_t DEBUG_UART_config;\n\n/***********************************************************************************************************************\n * Initialization functions\n **********************************************************************************************************************/\n\nvoid BOARD_InitPeripherals(void);\n\n/***********************************************************************************************************************\n * BOARD_InitBootPeripherals function\n **********************************************************************************************************************/\nvoid BOARD_InitBootPeripherals(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif /* _PERIPHERALS_H_ */\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board/pin_mux.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: LPC55S28\npackage_id: LPC55S28JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S28\nexternal_user_signals: {}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_iocon.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitDEBUG_UARTPins();\n    BOARD_InitUSBPins();\n    BOARD_InitLEDsPins();\n    BOARD_InitBUTTONsPins();\n    BOARD_InitPins_Core0();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '92', peripheral: FLEXCOMM0, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '94', peripheral: FLEXCOMM0, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30, mode: inactive,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitDEBUG_UARTPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t DEBUG_UART_RX = (/* Pin is configured as FC0_RXD_SDA_MOSI_DATA */\n                                    IOCON_PIO_FUNC1 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN29 (coords: 92) is configured as FC0_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN, DEBUG_UART_RX);\n\n    const uint32_t DEBUG_UART_TX = (/* Pin is configured as FC0_TXD_SCL_MISO_WS */\n                                    IOCON_PIO_FUNC1 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN30 (coords: 94) is configured as FC0_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN, DEBUG_UART_TX);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSWD_DEBUGPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '13', peripheral: SWD, signal: SWCLK, pin_signal: PIO0_11/FC6_RXD_SDA_MOSI_DATA/CTIMER2_MAT2/FREQME_GPIO_CLK_A/SWCLK/SECURE_GPIO0_11/ADC0_9, mode: pullDown,\n    slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '12', peripheral: SWD, signal: SWDIO, pin_signal: PIO0_12/FC3_TXD_SCL_MISO_WS/SD1_BACKEND_PWR/FREQME_GPIO_CLK_B/SCT_GPI7/SD0_POW_EN/SWDIO/FC6_TXD_SCL_MISO_WS/SECURE_GPIO0_12/ADC0_10,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '21', peripheral: SWD, signal: SWO, pin_signal: PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1, identifier: DEBUG_SWD_SWO,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled, asw: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSWD_DEBUGPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitSWD_DEBUGPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t DEBUG_SWD_SWO = (/* Pin is configured as SWO */\n                                    IOCON_PIO_FUNC6 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI |\n                                    /* Analog switch is open (disabled) */\n                                    IOCON_PIO_ASW_DI);\n    /* PORT0 PIN10 (coords: 21) is configured as SWO */\n    IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN, DEBUG_SWD_SWO);\n\n    const uint32_t DEBUG_SWD_SWDCLK = (/* Pin is configured as SWCLK */\n                                       IOCON_PIO_FUNC6 |\n                                       /* Selects pull-down function */\n                                       IOCON_PIO_MODE_PULLDOWN |\n                                       /* Standard mode, output slew rate control is enabled */\n                                       IOCON_PIO_SLEW_STANDARD |\n                                       /* Input function is not inverted */\n                                       IOCON_PIO_INV_DI |\n                                       /* Enables digital function */\n                                       IOCON_PIO_DIGITAL_EN |\n                                       /* Open drain is disabled */\n                                       IOCON_PIO_OPENDRAIN_DI |\n                                       /* Analog switch is closed (enabled) */\n                                       IOCON_PIO_ASW_EN);\n    /* PORT0 PIN11 (coords: 13) is configured as SWCLK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN, DEBUG_SWD_SWDCLK);\n\n    const uint32_t DEBUG_SWD_SWDIO = (/* Pin is configured as SWDIO */\n                                      IOCON_PIO_FUNC6 |\n                                      /* Selects pull-up function */\n                                      IOCON_PIO_MODE_PULLUP |\n                                      /* Standard mode, output slew rate control is enabled */\n                                      IOCON_PIO_SLEW_STANDARD |\n                                      /* Input function is not inverted */\n                                      IOCON_PIO_INV_DI |\n                                      /* Enables digital function */\n                                      IOCON_PIO_DIGITAL_EN |\n                                      /* Open drain is disabled */\n                                      IOCON_PIO_OPENDRAIN_DI |\n                                      /* Analog switch is closed (enabled) */\n                                      IOCON_PIO_ASW_EN);\n    /* PORT0 PIN12 (coords: 12) is configured as SWDIO */\n    IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN, DEBUG_SWD_SWDIO);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSBPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '97', peripheral: USBFSH, signal: USB_DP, pin_signal: USB0_DP}\n  - {pin_num: '98', peripheral: USBFSH, signal: USB_DM, pin_signal: USB0_DM}\n  - {pin_num: '78', peripheral: USBFSH, signal: USB_VBUS, pin_signal: PIO0_22/FC6_TXD_SCL_MISO_WS/UTICK_CAP1/CT_INP15/SCT0_OUT3/USB0_VBUS/SD1_D0/PLU_OUT7/SECURE_GPIO0_22,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '35', peripheral: USBHSH, signal: USB_DM, pin_signal: USB1_DM}\n  - {pin_num: '34', peripheral: USBHSH, signal: USB_DP, pin_signal: USB1_DP}\n  - {pin_num: '36', peripheral: USBHSH, signal: USB_VBUS, pin_signal: USB1_VBUS}\n  - {pin_num: '80', peripheral: USBHSH, signal: USB_PORTPWRN, pin_signal: PIO1_29/FC7_RXD_SDA_MOSI_DATA/SD0_D6/SCT_GPI6/USB1_PORTPWRN/USB1_FRAME/PLU_IN2, mode: pullUp}\n  - {pin_num: '67', peripheral: USBFSH, signal: USB_PORTPWRN, pin_signal: PIO1_12/FC6_SCK/CTIMER1_MAT1/USB0_PORTPWRN/HS_SPI_SSEL2, mode: pullUp}\n  - {pin_num: '66', peripheral: USBFSH, signal: USB_OVERCURRENTN, pin_signal: PIO0_28/FC0_SCK/SD1_CMD/CT_INP11/SCT0_OUT7/USB0_OVERCURRENTN/PLU_OUT1/SECURE_GPIO0_28,\n    mode: pullUp}\n  - {pin_num: '65', peripheral: USBHSH, signal: USB_OVERCURRENTN, pin_signal: PIO1_30/FC7_TXD_SCL_MISO_WS/SD0_D7/SCT_GPI7/USB1_OVERCURRENTN/USB1_LEDN/PLU_IN1, mode: pullUp}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSBPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitUSBPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t USB0_VBUS = (/* Pin is configured as USB0_VBUS */\n                                IOCON_PIO_FUNC7 |\n                                /* No addition pin function */\n                                IOCON_PIO_MODE_INACT |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN22 (coords: 78) is configured as USB0_VBUS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITUSBPINS_USB0_VBUS_PORT, BOARD_INITUSBPINS_USB0_VBUS_PIN, USB0_VBUS);\n\n    IOCON->PIO[0][28] = ((IOCON->PIO[0][28] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT028 (pin 66) is configured as USB0_OVERCURRENTN. */\n                         | IOCON_PIO_FUNC(PIO0_28_FUNC_ALT7)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO0_28_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO0_28_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][12] = ((IOCON->PIO[1][12] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT112 (pin 67) is configured as USB0_PORTPWRN. */\n                         | IOCON_PIO_FUNC(PIO1_12_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_12_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_12_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][29] = ((IOCON->PIO[1][29] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT129 (pin 80) is configured as USB1_PORTPWRN. */\n                         | IOCON_PIO_FUNC(PIO1_29_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_29_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_29_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][30] = ((IOCON->PIO[1][30] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT130 (pin 65) is configured as USB1_OVERCURRENTN. */\n                         | IOCON_PIO_FUNC(PIO1_30_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_30_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_30_DIGIMODE_DIGITAL));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLEDsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '1', peripheral: GPIO, signal: 'PIO1, 4', pin_signal: PIO1_4/FC0_SCK/SD0_D0/CTIMER2_MAT1/SCT0_OUT0/FREQME_GPIO_CLK_A, direction: OUTPUT, gpio_init_state: 'true',\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '5', peripheral: GPIO, signal: 'PIO1, 6', pin_signal: PIO1_6/FC0_TXD_SCL_MISO_WS/SD0_D3/CTIMER2_MAT1/SCT_GPI3, direction: OUTPUT, gpio_init_state: 'true',\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '9', peripheral: GPIO, signal: 'PIO1, 7', pin_signal: PIO1_7/FC0_RTS_SCL_SSEL1/SD0_D1/CTIMER2_MAT2/SCT_GPI4, direction: OUTPUT, gpio_init_state: 'true',\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLEDsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitLEDsPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t LED_BLUE_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO1_4 (pin 1)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_BLUE_GPIO, BOARD_INITLEDSPINS_LED_BLUE_PORT, BOARD_INITLEDSPINS_LED_BLUE_PIN, &LED_BLUE_config);\n\n    gpio_pin_config_t LED_RED_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO1_6 (pin 5)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_RED_GPIO, BOARD_INITLEDSPINS_LED_RED_PORT, BOARD_INITLEDSPINS_LED_RED_PIN, &LED_RED_config);\n\n    gpio_pin_config_t LED_GREEN_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO1_7 (pin 9)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_GREEN_GPIO, BOARD_INITLEDSPINS_LED_GREEN_PORT, BOARD_INITLEDSPINS_LED_GREEN_PIN, &LED_GREEN_config);\n\n    const uint32_t LED_BLUE = (/* Pin is configured as PIO1_4 */\n                               IOCON_PIO_FUNC0 |\n                               /* Selects pull-up function */\n                               IOCON_PIO_MODE_PULLUP |\n                               /* Standard mode, output slew rate control is enabled */\n                               IOCON_PIO_SLEW_STANDARD |\n                               /* Input function is not inverted */\n                               IOCON_PIO_INV_DI |\n                               /* Enables digital function */\n                               IOCON_PIO_DIGITAL_EN |\n                               /* Open drain is disabled */\n                               IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN4 (coords: 1) is configured as PIO1_4 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITLEDSPINS_LED_BLUE_PORT, BOARD_INITLEDSPINS_LED_BLUE_PIN, LED_BLUE);\n\n    const uint32_t LED_RED = (/* Pin is configured as PIO1_6 */\n                              IOCON_PIO_FUNC0 |\n                              /* Selects pull-up function */\n                              IOCON_PIO_MODE_PULLUP |\n                              /* Standard mode, output slew rate control is enabled */\n                              IOCON_PIO_SLEW_STANDARD |\n                              /* Input function is not inverted */\n                              IOCON_PIO_INV_DI |\n                              /* Enables digital function */\n                              IOCON_PIO_DIGITAL_EN |\n                              /* Open drain is disabled */\n                              IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN6 (coords: 5) is configured as PIO1_6 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITLEDSPINS_LED_RED_PORT, BOARD_INITLEDSPINS_LED_RED_PIN, LED_RED);\n\n    const uint32_t LED_GREEN = (/* Pin is configured as PIO1_7 */\n                                IOCON_PIO_FUNC0 |\n                                /* Selects pull-up function */\n                                IOCON_PIO_MODE_PULLUP |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN7 (coords: 9) is configured as PIO1_7 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITLEDSPINS_LED_GREEN_PORT, BOARD_INITLEDSPINS_LED_GREEN_PIN, LED_GREEN);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitBUTTONsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '88', peripheral: GPIO, signal: 'PIO0, 5', pin_signal: PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5, direction: INPUT,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '64', peripheral: GPIO, signal: 'PIO1, 18', pin_signal: PIO1_18/SD1_POW_EN/SCT0_OUT5/PLU_OUT0, direction: INPUT, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '10', peripheral: GPIO, signal: 'PIO1, 9', pin_signal: PIO1_9/FC1_SCK/CT_INP4/SCT0_OUT2/FC4_CTS_SDA_SSEL0/ADC0_12, direction: INPUT, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '32', peripheral: SYSCON, signal: RESET, pin_signal: RESETN}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBUTTONsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitBUTTONsPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO0 module */\n    CLOCK_EnableClock(kCLOCK_Gpio0);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t S1_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO0_5 (pin 88)  */\n    GPIO_PinInit(BOARD_INITBUTTONSPINS_S1_GPIO, BOARD_INITBUTTONSPINS_S1_PORT, BOARD_INITBUTTONSPINS_S1_PIN, &S1_config);\n\n    gpio_pin_config_t S3_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_9 (pin 10)  */\n    GPIO_PinInit(BOARD_INITBUTTONSPINS_S3_GPIO, BOARD_INITBUTTONSPINS_S3_PORT, BOARD_INITBUTTONSPINS_S3_PIN, &S3_config);\n\n    gpio_pin_config_t S2_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_18 (pin 64)  */\n    GPIO_PinInit(BOARD_INITBUTTONSPINS_S2_GPIO, BOARD_INITBUTTONSPINS_S2_PORT, BOARD_INITBUTTONSPINS_S2_PIN, &S2_config);\n\n    const uint32_t S1 = (/* Pin is configured as PIO0_5 */\n                         IOCON_PIO_FUNC0 |\n                         /* Selects pull-up function */\n                         IOCON_PIO_MODE_PULLUP |\n                         /* Standard mode, output slew rate control is enabled */\n                         IOCON_PIO_SLEW_STANDARD |\n                         /* Input function is not inverted */\n                         IOCON_PIO_INV_DI |\n                         /* Enables digital function */\n                         IOCON_PIO_DIGITAL_EN |\n                         /* Open drain is disabled */\n                         IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN5 (coords: 88) is configured as PIO0_5 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITBUTTONSPINS_S1_PORT, BOARD_INITBUTTONSPINS_S1_PIN, S1);\n\n    const uint32_t S2 = (/* Pin is configured as PIO1_18 */\n                         IOCON_PIO_FUNC0 |\n                         /* Selects pull-up function */\n                         IOCON_PIO_MODE_PULLUP |\n                         /* Standard mode, output slew rate control is enabled */\n                         IOCON_PIO_SLEW_STANDARD |\n                         /* Input function is not inverted */\n                         IOCON_PIO_INV_DI |\n                         /* Enables digital function */\n                         IOCON_PIO_DIGITAL_EN |\n                         /* Open drain is disabled */\n                         IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN18 (coords: 64) is configured as PIO1_18 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITBUTTONSPINS_S2_PORT, BOARD_INITBUTTONSPINS_S2_PIN, S2);\n\n    const uint32_t S3 = (/* Pin is configured as PIO1_9 */\n                         IOCON_PIO_FUNC0 |\n                         /* Selects pull-up function */\n                         IOCON_PIO_MODE_PULLUP |\n                         /* Standard mode, output slew rate control is enabled */\n                         IOCON_PIO_SLEW_STANDARD |\n                         /* Input function is not inverted */\n                         IOCON_PIO_INV_DI |\n                         /* Enables digital function */\n                         IOCON_PIO_DIGITAL_EN |\n                         /* Open drain is disabled */\n                         IOCON_PIO_OPENDRAIN_DI |\n                         /* Analog switch is closed (enabled) */\n                         IOCON_PIO_ASW_EN);\n    /* PORT1 PIN9 (coords: 10) is configured as PIO1_9 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITBUTTONSPINS_S3_PORT, BOARD_INITBUTTONSPINS_S3_PIN, S3);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins_Core0:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins_Core0\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitPins_Core0(void)\n{\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitI2SPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '4', peripheral: FLEXCOMM4, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '30', peripheral: FLEXCOMM4, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3, mode: pullUp,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '91', peripheral: SYSCON, signal: MCLK, pin_signal: PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0, mode: inactive, slew_rate: standard, invert: disabled,\n    open_drain: disabled}\n  - {pin_num: '76', peripheral: FLEXCOMM7, signal: SCK, pin_signal: PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '74', peripheral: FLEXCOMM7, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '90', peripheral: FLEXCOMM7, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '21', peripheral: FLEXCOMM6, signal: SCK, pin_signal: PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1,\n    identifier: FC6_I2S_CLK, mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '2', peripheral: FLEXCOMM6, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '87', peripheral: FLEXCOMM6, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitI2SPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitI2SPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t FC6_I2S_CLK = (/* Pin is configured as FC6_SCK */\n                                  IOCON_PIO_FUNC1 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI |\n                                  /* Analog switch is closed (enabled) */\n                                  IOCON_PIO_ASW_EN);\n    /* PORT0 PIN10 (coords: 21) is configured as FC6_SCK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_CLK_PORT, BOARD_INITI2SPINS_FC6_I2S_CLK_PIN, FC6_I2S_CLK);\n\n    const uint32_t FC7_I2S_WS = (/* Pin is configured as FC7_TXD_SCL_MISO_WS */\n                                 IOCON_PIO_FUNC7 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN19 (coords: 90) is configured as FC7_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_WS_PORT, BOARD_INITI2SPINS_FC7_I2S_WS_PIN, FC7_I2S_WS);\n\n    const uint32_t FC7_I2S_TX = (/* Pin is configured as FC7_RXD_SDA_MOSI_DATA */\n                                 IOCON_PIO_FUNC7 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN20 (coords: 74) is configured as FC7_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_TX_PORT, BOARD_INITI2SPINS_FC7_I2S_TX_PIN, FC7_I2S_TX);\n\n    const uint32_t FC7_I2S_SCK = (/* Pin is configured as FC7_SCK */\n                                  IOCON_PIO_FUNC7 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN21 (coords: 76) is configured as FC7_SCK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_SCK_PORT, BOARD_INITI2SPINS_FC7_I2S_SCK_PIN, FC7_I2S_SCK);\n\n    const uint32_t FC6_I2S_RX = (/* Pin is configured as FC6_RXD_SDA_MOSI_DATA */\n                                 IOCON_PIO_FUNC2 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN13 (coords: 2) is configured as FC6_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_RX_PORT, BOARD_INITI2SPINS_FC6_I2S_RX_PIN, FC6_I2S_RX);\n\n    const uint32_t FC6_I2S_WS = (/* Pin is configured as FC6_TXD_SCL_MISO_WS */\n                                 IOCON_PIO_FUNC2 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN16 (coords: 87) is configured as FC6_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_WS_PORT, BOARD_INITI2SPINS_FC6_I2S_WS_PIN, FC6_I2S_WS);\n\n    const uint32_t FC4_I2C_SCL = (/* Pin is configured as FC4_TXD_SCL_MISO_WS */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN20 (coords: 4) is configured as FC4_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC4_I2C_SCL_PORT, BOARD_INITI2SPINS_FC4_I2C_SCL_PIN, FC4_I2C_SCL);\n\n    const uint32_t FC4_I2C_SDA = (/* Pin is configured as FC4_RXD_SDA_MOSI_DATA */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC4_I2C_SDA_PORT, BOARD_INITI2SPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA);\n\n    const uint32_t MCLK = (/* Pin is configured as MCLK */\n                           IOCON_PIO_FUNC1 |\n                           /* No addition pin function */\n                           IOCON_PIO_MODE_INACT |\n                           /* Standard mode, output slew rate control is enabled */\n                           IOCON_PIO_SLEW_STANDARD |\n                           /* Input function is not inverted */\n                           IOCON_PIO_INV_DI |\n                           /* Enables digital function */\n                           IOCON_PIO_DIGITAL_EN |\n                           /* Open drain is disabled */\n                           IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN31 (coords: 91) is configured as MCLK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_MCLK_PORT, BOARD_INITI2SPINS_MCLK_PIN, MCLK);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitACCELPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '30', peripheral: FLEXCOMM4, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3, mode: pullUp,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '4', peripheral: FLEXCOMM4, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '58', peripheral: GPIO, signal: 'PIO1, 19', pin_signal: PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF, direction: INPUT, mode: inactive,\n    slew_rate: standard, invert: disabled, open_drain: disabled, asw: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitACCELPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitACCELPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t ACCL_INTR_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_19 (pin 58)  */\n    GPIO_PinInit(BOARD_INITACCELPINS_ACCL_INTR_GPIO, BOARD_INITACCELPINS_ACCL_INTR_PORT, BOARD_INITACCELPINS_ACCL_INTR_PIN, &ACCL_INTR_config);\n\n    const uint32_t ACCL_INTR = (/* Pin is configured as PIO1_19 */\n                                IOCON_PIO_FUNC0 |\n                                /* No addition pin function */\n                                IOCON_PIO_MODE_INACT |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI |\n                                /* Analog switch is open (disabled) */\n                                IOCON_PIO_ASW_DI);\n    /* PORT1 PIN19 (coords: 58) is configured as PIO1_19 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_ACCL_INTR_PORT, BOARD_INITACCELPINS_ACCL_INTR_PIN, ACCL_INTR);\n\n    const uint32_t FC4_I2C_SCL = (/* Pin is configured as FC4_TXD_SCL_MISO_WS */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN20 (coords: 4) is configured as FC4_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SCL_PORT, BOARD_INITACCELPINS_FC4_I2C_SCL_PIN, FC4_I2C_SCL);\n\n    const uint32_t FC4_I2C_SDA = (/* Pin is configured as FC4_RXD_SDA_MOSI_DATA */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SDA_PORT, BOARD_INITACCELPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board/pin_mux.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC1 0x01u         /*!<@brief Selects pin function 1 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_29 (number 92), P8[2]/U6[13]/FC0_USART_RXD\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN 29U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN_MASK (1U << 29U)\n/* @} */\n\n/*! @name PIO0_30 (number 94), P8[3]/U6[12]/FC0_USART_TXD\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN 30U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN_MASK (1U << 30U)\n/* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DI 0x00u        /*!<@brief Analog switch is open (disabled) */\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC6 0x06u         /*!<@brief Selects pin function 6 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLDOWN 0x10u /*!<@brief Selects pull-down function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_11 (number 13), U14[4]/SWDCLK_TRGT\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN 11U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN_MASK (1U << 11U)\n/* @} */\n\n/*! @name PIO0_12 (number 12), U15[4]/D7/P7[2]/IF_SWDIO\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN 12U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN_MASK (1U << 12U)\n/* @} */\n\n/*! @name PIO0_10 (number 21), U14[12]/SWO_TRGT\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN 10U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN_MASK (1U << 10U)\n/* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSWD_DEBUGPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Enables digital function */\n#define IOCON_PIO_DIGITAL_EN 0x0100u\n/*!\n * @brief Selects pin function 7 */\n#define IOCON_PIO_FUNC7 0x07u\n/*!\n * @brief Input function is not inverted */\n#define IOCON_PIO_INV_DI 0x00u\n/*!\n * @brief No addition pin function */\n#define IOCON_PIO_MODE_INACT 0x00u\n/*!\n * @brief Open drain is disabled */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u\n/*!\n * @brief Standard mode, output slew rate control is enabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO0_28_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 7. */\n#define PIO0_28_FUNC_ALT7 0x07u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO0_28_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_12_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_12_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_12_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_29_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_29_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_29_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_30_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_30_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_30_MODE_PULL_UP 0x02u\n\n/*! @name PIO0_22 (number 78), P10[1]/USB0_VBUS\n  @{ */\n#define BOARD_INITUSBPINS_USB0_VBUS_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITUSBPINS_USB0_VBUS_PIN 22U                   /*!<@brief PORT pin number */\n#define BOARD_INITUSBPINS_USB0_VBUS_PIN_MASK (1U << 22U)      /*!<@brief PORT pin mask */\n                                                              /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSBPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_4 (number 1), R78/P18[5]/LEDR/PWM_ARD\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_BLUE_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_BLUE_INIT_GPIO_VALUE 1U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_BLUE_GPIO_PIN_MASK (1U << 4U) /*!<@brief GPIO pin mask */\n#define BOARD_INITLEDSPINS_LED_BLUE_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_BLUE_PIN 4U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_BLUE_PIN_MASK (1U << 4U)      /*!<@brief PORT pin mask */\n                                                             /* @} */\n\n/*! @name PIO1_6 (number 5), R80/P18[9]/LEDB/PWM_ARD\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_RED_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_RED_INIT_GPIO_VALUE 1U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_RED_GPIO_PIN_MASK (1U << 6U) /*!<@brief GPIO pin mask */\n#define BOARD_INITLEDSPINS_LED_RED_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_RED_PIN 6U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_RED_PIN_MASK (1U << 6U)      /*!<@brief PORT pin mask */\n                                                            /* @} */\n\n/*! @name PIO1_7 (number 9), R79/P18[7]/LEDG/PWM_ARD\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_GREEN_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_GREEN_INIT_GPIO_VALUE 1U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_GREEN_GPIO_PIN_MASK (1U << 7U) /*!<@brief GPIO pin mask */\n#define BOARD_INITLEDSPINS_LED_GREEN_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_GREEN_PIN 7U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_GREEN_PIN_MASK (1U << 7U)      /*!<@brief PORT pin mask */\n                                                              /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLEDsPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_5 (number 88), S1/J10[1]/U3[12]/P17[8]/P7[7]/U11[4]/P0_5-ISP1\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_S1_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S1_GPIO_PIN_MASK (1U << 5U) /*!<@brief GPIO pin mask */\n#define BOARD_INITBUTTONSPINS_S1_PORT 0U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S1_PIN 5U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_S1_PIN_MASK (1U << 5U)      /*!<@brief PORT pin mask */\n                                                          /* @} */\n\n/*! @name PIO1_18 (number 64), S2/P18[16]/P24[2]/WAKE/GPIO\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_S2_GPIO GPIO                 /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S2_GPIO_PIN_MASK (1U << 18U) /*!<@brief GPIO pin mask */\n#define BOARD_INITBUTTONSPINS_S2_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S2_PIN 18U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_S2_PIN_MASK (1U << 18U)      /*!<@brief PORT pin mask */\n                                                           /* @} */\n\n/*! @name PIO1_9 (number 10), S3/P18[1]/PIO1_9_GPIO_ARD\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_S3_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S3_GPIO_PIN_MASK (1U << 9U) /*!<@brief GPIO pin mask */\n#define BOARD_INITBUTTONSPINS_S3_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S3_PIN 9U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_S3_PIN_MASK (1U << 9U)      /*!<@brief PORT pin mask */\n                                                          /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitBUTTONsPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins_Core0(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC1 0x01u         /*!<@brief Selects pin function 1 */\n#define IOCON_PIO_FUNC2 0x02u         /*!<@brief Selects pin function 2 */\n#define IOCON_PIO_FUNC5 0x05u         /*!<@brief Selects pin function 5 */\n#define IOCON_PIO_FUNC7 0x07u         /*!<@brief Selects pin function 7 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_20 (number 4), P17[1]/P24[5]/FC4_I2C_SCL_ARD\n  @{ */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_21 (number 30), P17[3]/P24[6]/FC4_I2C_SDA_ARD\n  @{ */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_31 (number 91), P19[7]/P19[8]/PLU_IN0/GPIO\n  @{ */\n#define BOARD_INITI2SPINS_MCLK_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_MCLK_PIN 31U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_MCLK_PIN_MASK (1U << 31U)      /*!<@brief PORT pin mask */\n                                                         /* @} */\n\n/*! @name PIO0_21 (number 76), P17[14]/FC7_I2S_SCK\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO0_20 (number 74), P17[10]/FC7_I2S_TX\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO0_19 (number 90), P17[12]/FC7_I2S_WS\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PIN 19U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PIN_MASK (1U << 19U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO0_10 (number 21), U14[12]/SWO_TRGT\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PIN 10U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PIN_MASK (1U << 10U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_13 (number 2), P17[20]/FC6_I2S_RX\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PIN 13U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PIN_MASK (1U << 13U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO1_16 (number 87), P18[17]/SD1_PWR_EN\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PIN 16U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PIN_MASK (1U << 16U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitI2SPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DI 0x00u        /*!<@brief Analog switch is open (disabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_FUNC5 0x05u         /*!<@brief Selects pin function 5 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_21 (number 30), P17[3]/P24[6]/FC4_I2C_SDA_ARD\n  @{ */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name PIO1_20 (number 4), P17[1]/P24[5]/FC4_I2C_SCL_ARD\n  @{ */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name PIO1_19 (number 58), U7[3]/P18[14]/PLU_OUT1/GPIO\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITACCELPINS_ACCL_INTR_GPIO GPIO                 /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITACCELPINS_ACCL_INTR_GPIO_PIN_MASK (1U << 19U) /*!<@brief GPIO pin mask */\n#define BOARD_INITACCELPINS_ACCL_INTR_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_ACCL_INTR_PIN 19U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_ACCL_INTR_PIN_MASK (1U << 19U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitACCELPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board.cmake",
    "content": "set(MCU_VARIANT LPC55S28)\nset(MCU_CORE LPC55S28)\nset(MCU_DRIVER_VARIANT LPC55S69)\n\nset(JLINK_DEVICE LPC55S28)\nset(JLINK_OPTION \"-USB 000727031389\")\n\nset(PYOCD_TARGET LPC55S28)\nset(NXPLINK_DEVICE LPC55S28:LPCXpresso55S28)\n\n# device fullspeed, host highspeed\nset(RHPORT_DEVICE 0)\nset(RHPORT_HOST 1)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_LPC55S28JBD100\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso55s28\n   url: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso55s28-development-board:LPC55S28-EVK\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED: use red LED from generated pin_mux\n#define LED_PORT              BOARD_INITLEDSPINS_LED_RED_PORT\n#define LED_PIN               BOARD_INITLEDSPINS_LED_RED_PIN\n#define LED_STATE_ON          0\n\n// WAKE button: use S2 from generated pin_mux\n#define BUTTON_PORT           BOARD_INITBUTTONSPINS_S2_PORT\n#define BUTTON_PIN            BOARD_INITBUTTONSPINS_S2_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART0\n\n// XTAL\n#define XTAL0_CLK_HZ          (16 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s28/board.mk",
    "content": "MCU_VARIANT = LPC55S28\nMCU_CORE = LPC55S28\nMCU_DRIVER_VARIANT = LPC55S69\n\n# device fullspeed, host highspeed\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 1\n\nCFLAGS += -DCPU_LPC55S28JBD100\n\nSRC_C += \\\n\t$(TOP)/$(BOARD_PATH)/board/clock_config.c \\\n\t$(TOP)/$(BOARD_PATH)/board/pin_mux.c \\\n\t$(TOP)/$(BOARD_PATH)/board/peripherals.c\n\nINC += $(TOP)/$(BOARD_PATH)/board\n\nJLINK_DEVICE = LPC55S28\nPYOCD_TARGET = LPC55S28\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/LPCXpresso55S69.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"LPCXpresso55S69\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19 http://mcuxpresso.nxp.com/XSD/mex_configuration_19.xsd\" uuid=\"acf73d26-2bf9-4855-b3be-26068672d98a\" version=\"19\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>LPC55S69</processor>\n      <package>LPC55S69JBD100</package>\n      <board>LPCXpresso55S69</board>\n      <board_revision>A2</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"cm33_core0\">\n         <core name=\"Cortex-M33 (Core #0)\" id=\"cm33_core0\" description=\"\"/>\n         <core name=\"Cortex-M33 (Core #1)\" id=\"cm33_core1\" description=\"\"/>\n      </cores>\n      <description></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      <custom_copyright>\n         <text>/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n</text>\n         <enabled>true</enabled>\n      </custom_copyright>\n      <update_include_paths>true</update_include_paths>\n      <enable_parallel_routing>true</enable_parallel_routing>\n      <generate_registers_defines>false</generate_registers_defines>\n   </preferences>\n   <tools>\n      <pins name=\"Pins\" version=\"17.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>25.09.10</processor_version>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM0\" description=\"Peripheral FLEXCOMM0 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM0\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"92\" pin_signal=\"PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM0\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"94\" pin_signal=\"PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSWD_DEBUGPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SWD\" description=\"Peripheral SWD signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SWD\" signal=\"SWCLK\" pin_num=\"13\" pin_signal=\"PIO0_11/FC6_RXD_SDA_MOSI_DATA/CTIMER2_MAT2/FREQME_GPIO_CLK_A/SWCLK/SECURE_GPIO0_11/ADC0_9\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullDown\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWDIO\" pin_num=\"12\" pin_signal=\"PIO0_12/FC3_TXD_SCL_MISO_WS/SD1_BACKEND_PWR/FREQME_GPIO_CLK_B/SCT_GPI7/SD0_POW_EN/SWDIO/FC6_TXD_SCL_MISO_WS/SECURE_GPIO0_12/ADC0_10\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWO\" pin_num=\"21\" pin_signal=\"PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"DEBUG_SWD_SWO\"/>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSBPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USBFSH\" description=\"Peripheral USBFSH signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USBHSH\" description=\"Peripheral USBHSH signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_DP\" pin_num=\"97\" pin_signal=\"USB0_DP\"/>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_DM\" pin_num=\"98\" pin_signal=\"USB0_DM\"/>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_VBUS\" pin_num=\"78\" pin_signal=\"PIO0_22/FC6_TXD_SCL_MISO_WS/UTICK_CAP1/CT_INP15/SCT0_OUT3/USB0_VBUS/SD1_D0/PLU_OUT7/SECURE_GPIO0_22\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_DM\" pin_num=\"35\" pin_signal=\"USB1_DM\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_DP\" pin_num=\"34\" pin_signal=\"USB1_DP\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_VBUS\" pin_num=\"36\" pin_signal=\"USB1_VBUS\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_OVERCURRENTN\" pin_num=\"65\" pin_signal=\"PIO1_30/FC7_TXD_SCL_MISO_WS/SD0_D7/SCT_GPI7/USB1_OVERCURRENTN/USB1_LEDN/PLU_IN1\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_OVERCURRENTN\" pin_num=\"66\" pin_signal=\"PIO0_28/FC0_SCK/SD1_CMD/CT_INP11/SCT0_OUT7/USB0_OVERCURRENTN/PLU_OUT1/SECURE_GPIO0_28\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_PORTPWRN\" pin_num=\"67\" pin_signal=\"PIO1_12/FC6_SCK/CTIMER1_MAT1/USB0_PORTPWRN/HS_SPI_SSEL2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_PORTPWRN\" pin_num=\"80\" pin_signal=\"PIO1_29/FC7_RXD_SDA_MOSI_DATA/SD0_D6/SCT_GPI6/USB1_PORTPWRN/USB1_FRAME/PLU_IN2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLEDsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 4\" pin_num=\"1\" pin_signal=\"PIO1_4/FC0_SCK/SD0_D0/CTIMER2_MAT1/SCT0_OUT0/FREQME_GPIO_CLK_A\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 6\" pin_num=\"5\" pin_signal=\"PIO1_6/FC0_TXD_SCL_MISO_WS/SD0_D3/CTIMER2_MAT1/SCT_GPI3\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 7\" pin_num=\"9\" pin_signal=\"PIO1_7/FC0_RTS_SCL_SSEL1/SD0_D1/CTIMER2_MAT2/SCT_GPI4\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitBUTTONsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SYSCON\" description=\"Peripheral SYSCON signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO\" signal=\"PIO0, 5\" pin_num=\"88\" pin_signal=\"PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 18\" pin_num=\"64\" pin_signal=\"PIO1_18/SD1_POW_EN/SCT0_OUT5/PLU_OUT0\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 9\" pin_num=\"10\" pin_signal=\"PIO1_9/FC1_SCK/CT_INP4/SCT0_OUT2/FC4_CTS_SDA_SSEL0/ADC0_12\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SYSCON\" signal=\"RESET\" pin_num=\"32\" pin_signal=\"RESETN\"/>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitPins_Core0\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins_Core0\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins/>\n            </function>\n            <function name=\"BOARD_InitPins_Core1\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core1</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins_Core1\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins/>\n            </function>\n            <function name=\"BOARD_InitI2SPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM4\" description=\"Peripheral FLEXCOMM4 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SYSCON\" description=\"Peripheral SYSCON signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM7\" description=\"Peripheral FLEXCOMM7 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM6\" description=\"Peripheral FLEXCOMM6 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SYSCON\" signal=\"MCLK\" pin_num=\"91\" pin_signal=\"PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"SCK\" pin_num=\"76\" pin_signal=\"PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"74\" pin_signal=\"PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"90\" pin_signal=\"PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"SCK\" pin_num=\"21\" pin_signal=\"PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"FC6_I2S_CLK\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"2\" pin_signal=\"PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"87\" pin_signal=\"PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitACCELPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM4\" description=\"Peripheral FLEXCOMM4 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 19\" pin_num=\"58\" pin_signal=\"PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"18.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>25.09.10</processor_version>\n         </clocks_profile>\n         <clock_configurations>\n            <clock_configuration name=\"BOARD_BootClockFRO12M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources/>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings/>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockFROHF96M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"ANACTRL.fro_hf.outFreq\" value=\"96 MHz\" locked=\"false\" enabled=\"false\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG\" value=\"Enable\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELA.sel\" value=\"ANACTRL.fro_hf_clk\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockPLL100M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SYSCON.XTAL32M.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"100 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL0_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"ENABLE_CLKIN_ENA\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_SYSTEM_CLK_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELB.sel\" value=\"SYSCON.PLL0_BYPASS\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0M_MULT.scale\" value=\"100\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0N_DIV.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0_PDEC.scale\" value=\"4\" locked=\"true\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockPLL150M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SYSCON.XTAL32M.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"FXCOM0_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"144 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB0_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB1_PHY_clock.outFreq\" value=\"16 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL0_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"PLL1_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"ENABLE_CLKIN_ENA\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_PLL_USB_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_SYSTEM_CLK_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"SYSCON.FCCLKSEL0.sel\" value=\"SYSCON.PLL0DIV\" locked=\"false\"/>\n                  <setting id=\"SYSCON.FRGCTRL0_DIV.scale\" value=\"400\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELB.sel\" value=\"SYSCON.PLL1_BYPASS\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0DIV.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0M_MULT.scale\" value=\"150\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0N_DIV.scale\" value=\"8\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0_PDEC.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL1CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL1M_MULT.scale\" value=\"18\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL1_PDEC.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SYSCON.USB0CLKDIV.scale\" value=\"3\" locked=\"false\"/>\n                  <setting id=\"SYSCON.USB0CLKSEL.sel\" value=\"SYSCON.MAINCLKSELB\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"2.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"15.0\" enabled=\"true\" update_project_code=\"true\">\n         <dependencies>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.flexcomm_usart\" description=\"FLEXCOMM USART Driver is not found in the toolchain/IDE project. The project will not compile!\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data type=\"Boolean\">true</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.flexcomm_usart\" description=\"An unsupported version of the FLEXCOMM USART Driver in the toolchain/IDE project. Required: ${required_value}, actual: ${actual_value}. The project might not compile correctly.\" problem_level=\"1\" source=\"Peripherals\">\n               <feature name=\"version\" evaluation=\"equivalent\">\n                  <data type=\"Version\">2.2.0</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"Tool\" resourceId=\"Clocks\" description=\"The Clocks tool is required by the Peripherals tool, but it is disabled.\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data>true</data>\n               </feature>\n            </dependency>\n         </dependencies>\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>25.09.10</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals_cm33_core0\" uuid=\"61d0725d-b300-49cb-9c66-b5edfbf8ffc1\" called_from_default_init=\"true\" id_prefix=\"\" core=\"cm33_core0\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"ClockOutput\" resourceId=\"FXCOM0_clock\" description=\"FXCOM0 clock is inactive.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"frequency\" evaluation=\"greaterThan\">\n                        <data type=\"Frequency\" unit=\"Hz\">0</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"FLEXCOMM0.usart_rxd\" description=\"Signal RX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"FLEXCOMM0.usart_txd\" description=\"Signal TX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <instances>\n                  <instance name=\"ACCEL\" uuid=\"b999c56a-0d01-4089-9311-9224db5272f4\" type=\"flexcomm_i2c\" type_id=\"flexcomm_i2c_2.3.0\" mode=\"I2C_Polling\" peripheral=\"FLEXCOMM4\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_i2c\" quick_selection=\"QS_I2C_Master\">\n                        <setting name=\"i2c_mode\" value=\"kI2C_Master\"/>\n                        <setting name=\"clockSource\" value=\"FXCOMFunctionClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"i2c_master_config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"baudRate_Bps\" value=\"100000\"/>\n                           <setting name=\"enableTimeout\" value=\"false\"/>\n                           <setting name=\"timeout_Ms\" value=\"35\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"9fb0504c-6159-43e2-98bb-51d75f06133a\" type=\"flexcomm_usart\" type_id=\"flexcomm_usart_2.2.0\" mode=\"polling\" peripheral=\"FLEXCOMM0\" enabled=\"true\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"usartConfig_t\">\n                        <struct name=\"usartConfig\">\n                           <setting name=\"clockSource\" value=\"FXCOMFunctionClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"syncMode\" value=\"kUSART_SyncModeDisabled\"/>\n                           <setting name=\"parityMode\" value=\"kUSART_ParityDisabled\"/>\n                           <setting name=\"stopBitCount\" value=\"kUSART_OneStopBit\"/>\n                           <setting name=\"bitCountPerChar\" value=\"kUSART_8BitsPerChar\"/>\n                           <setting name=\"loopback\" value=\"false\"/>\n                           <setting name=\"txWatermark\" value=\"kUSART_TxFifo0\"/>\n                           <setting name=\"rxWatermark\" value=\"kUSART_RxFifo1\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"clockPolarity\" value=\"kUSART_RxSampleOnFallingEdge\"/>\n                           <setting name=\"enableContinuousSCLK\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LEDS\" uuid=\"f5ad3a56-404b-44cb-8abc-7b25b5551d33\" type=\"lpc_gpio\" type_id=\"lpc_gpio_2.1.1\" mode=\"GPIO\" peripheral=\"GPIO\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpc_gpio\"/>\n                  </instance>\n                  <instance name=\"SW\" uuid=\"d57ddfca-dc72-486c-a145-c7a2ab1e1a66\" type=\"lpc_gpio\" type_id=\"lpc_gpio_2.1.1\" mode=\"GPIO\" peripheral=\"GPIO\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpc_gpio\"/>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"56761ad9-9b77-4074-917d-de0fde10cd48\" type=\"nvic\" type_id=\"nvic\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n            <functional_group name=\"BOARD_InitPeripherals_cm33_core1\" uuid=\"e2041cd4-ebb6-45a5-807f-e0c2dc047d48\" called_from_default_init=\"false\" id_prefix=\"\" core=\"cm33_core1\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"NVIC_2\" uuid=\"db546092-4c45-40af-938a-8cc58edd1c4f\" type=\"nvic\" type_id=\"nvic\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"905d2747-654a-47d9-91f9-81a5c6f9c407\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n                  <setting name=\"global_init\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"64cbcd7c-424d-4baf-9681-a60878969fb6\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"b9b018dd-ef4e-41f6-b456-f91b855cb391\" type_id=\"generic_can\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"bafa6375-9184-4272-8102-06ea086041d7\" type_id=\"uart_cmsis_common\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"1710dc7f-381f-4b37-8f78-0fd2f923b3ac\" type_id=\"generic_uart\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"c7fc4395-b141-4b13-a326-4145e765b2b7\" type_id=\"generic_enet\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"b6ee89c2-4c58-4181-94dc-af13d8ae8ea5\" type_id=\"gpio_adapter_common\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"10.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n            <tool_options>\n               <option id=\"_output_type_\" value=\"c_code\"/>\n               <option id=\"_legacy_source_names_\" value=\"yes\"/>\n            </tool_options>\n         </tee_profile>\n         <functional_group name=\"BOARD_InitTrustZone\" called_from_default_init=\"true\" id_prefix=\"\" prefix_user_defined=\"true\">\n            <description></description>\n            <options/>\n            <ahb>\n               <relative_region start=\"0\" size=\"655360\" security=\"s_priv\" memory=\"PROGRAM_FLASH\"/>\n               <relative_region start=\"0\" size=\"131072\" security=\"s_priv\" memory=\"BootROM\"/>\n               <relative_region start=\"0\" size=\"32768\" security=\"s_priv\" memory=\"SRAMX\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM0\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM1\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM2\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM3\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"SRAM4\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"AHBperipherals_port10_ahb_secure_ctrl_area\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"USB_RAM\"/>\n               <masters>\n                  <master id=\"HASH\" security=\"ns_user\"/>\n                  <master id=\"MCM33C\" security=\"ns_user\"/>\n                  <master id=\"MCM33S\" security=\"ns_user\"/>\n                  <master id=\"PQ\" security=\"ns_user\"/>\n                  <master id=\"SDIO\" security=\"ns_user\"/>\n                  <master id=\"SDMA0\" security=\"ns_user\"/>\n                  <master id=\"SDMA1\" security=\"ns_user\"/>\n                  <master id=\"USBFSD\" security=\"ns_user\"/>\n                  <master id=\"USBFSH\" security=\"ns_user\"/>\n               </masters>\n               <peripherals>\n                  <peripheral id=\"ADC0\" security=\"s_priv\"/>\n                  <peripheral id=\"AHB_SECURE_CTRL\" security=\"s_priv\"/>\n                  <peripheral id=\"ANACTRL\" security=\"s_priv\"/>\n                  <peripheral id=\"CASPER\" security=\"s_priv\"/>\n                  <peripheral id=\"CRC_ENGINE\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER0\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER1\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER2\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER3\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER4\" security=\"s_priv\"/>\n                  <peripheral id=\"DBGMAILBOX\" security=\"s_priv\"/>\n                  <peripheral id=\"DMA0\" security=\"s_priv\"/>\n                  <peripheral id=\"DMA1\" security=\"s_priv\"/>\n                  <peripheral id=\"FLASH\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM0\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM1\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM2\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM3\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM4\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM5\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM6\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM7\" security=\"s_priv\"/>\n                  <peripheral id=\"GINT0\" security=\"s_priv\"/>\n                  <peripheral id=\"GINT1\" security=\"s_priv\"/>\n                  <peripheral id=\"GPIO\" security=\"s_priv\"/>\n                  <peripheral id=\"HASHCRYPT\" security=\"s_priv\"/>\n                  <peripheral id=\"INPUTMUX\" security=\"s_priv\"/>\n                  <peripheral id=\"IOCON\" security=\"s_priv\"/>\n                  <peripheral id=\"MAILBOX\" security=\"s_priv\"/>\n                  <peripheral id=\"MRT0\" security=\"s_priv\"/>\n                  <peripheral id=\"OSTIMER\" security=\"s_priv\"/>\n                  <peripheral id=\"PINT\" security=\"s_priv\"/>\n                  <peripheral id=\"PLU\" security=\"s_priv\"/>\n                  <peripheral id=\"PMC\" security=\"s_priv\"/>\n                  <peripheral id=\"POWERQUAD\" security=\"s_priv\"/>\n                  <peripheral id=\"PRINCE\" security=\"s_priv\"/>\n                  <peripheral id=\"PUF\" security=\"s_priv\"/>\n                  <peripheral id=\"RNG\" security=\"s_priv\"/>\n                  <peripheral id=\"RTC\" security=\"s_priv\"/>\n                  <peripheral id=\"SCT0\" security=\"s_priv\"/>\n                  <peripheral id=\"SDIF\" security=\"s_priv\"/>\n                  <peripheral id=\"SECGPIO\" security=\"s_priv\"/>\n                  <peripheral id=\"SECPINT\" security=\"s_priv\"/>\n                  <peripheral id=\"SPI8\" security=\"s_priv\"/>\n                  <peripheral id=\"SYSCON\" security=\"s_priv\"/>\n                  <peripheral id=\"SYSCTL\" security=\"s_priv\"/>\n                  <peripheral id=\"USB0\" security=\"s_priv\"/>\n                  <peripheral id=\"USBFSH\" security=\"s_priv\"/>\n                  <peripheral id=\"USBHSD\" security=\"s_priv\"/>\n                  <peripheral id=\"USBHSH\" security=\"s_priv\"/>\n                  <peripheral id=\"USBPHY\" security=\"s_priv\"/>\n                  <peripheral id=\"UTICK0\" security=\"s_priv\"/>\n                  <peripheral id=\"WWDT\" security=\"s_priv\"/>\n               </peripherals>\n               <interrupts>\n                  <masking>\n                     <interrupt id=\"acmp_capt_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"adc_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"casper_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer2_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer3_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer4_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm2_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm3_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm4_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm5_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm6_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm7_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"global_irq0\" masked=\"Masked\"/>\n                     <interrupt id=\"global_irq1\" masked=\"Masked\"/>\n                     <interrupt id=\"lspi_hs_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"mailbox_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"mrt_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"os_event_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int4\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int5\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int6\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int7\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq0\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq1\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq2\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq3\" masked=\"Masked\"/>\n                     <interrupt id=\"plu_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"pq_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"qddkey_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"rtc_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sct_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdio_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdma0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdma1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_hypervisor_call_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_int0\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_int1\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_vio_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sha_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sys_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb0_needclk_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_needclk_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_utmi_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"utick_irq\" masked=\"Masked\"/>\n                  </masking>\n                  <security>\n                     <interrupt id=\"acmp_capt_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"adc_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"casper_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer2_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer3_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer4_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm2_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm3_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm4_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm5_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm6_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm7_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"global_irq0\" secure=\"Secure\"/>\n                     <interrupt id=\"global_irq1\" secure=\"Secure\"/>\n                     <interrupt id=\"lspi_hs_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"mailbox_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"mrt_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"os_event_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int4\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int5\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int6\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int7\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq0\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq1\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq2\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq3\" secure=\"Secure\"/>\n                     <interrupt id=\"plu_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"pq_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"qddkey_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"rtc_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sct_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdio_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdma0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdma1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_hypervisor_call_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_int0\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_int1\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_vio_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sha_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sys_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb0_needclk_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_needclk_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_utmi_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"utick_irq\" secure=\"Secure\"/>\n                  </security>\n               </interrupts>\n               <ports>\n                  <port id=\"pio0\">\n                     <pin_mask id=\"0\" masked=\"Masked\"/>\n                     <pin_mask id=\"1\" masked=\"Masked\"/>\n                     <pin_mask id=\"10\" masked=\"Masked\"/>\n                     <pin_mask id=\"11\" masked=\"Masked\"/>\n                     <pin_mask id=\"12\" masked=\"Masked\"/>\n                     <pin_mask id=\"13\" masked=\"Masked\"/>\n                     <pin_mask id=\"14\" masked=\"Masked\"/>\n                     <pin_mask id=\"15\" masked=\"Masked\"/>\n                     <pin_mask id=\"16\" masked=\"Masked\"/>\n                     <pin_mask id=\"17\" masked=\"Masked\"/>\n                     <pin_mask id=\"18\" masked=\"Masked\"/>\n                     <pin_mask id=\"19\" masked=\"Masked\"/>\n                     <pin_mask id=\"2\" masked=\"Masked\"/>\n                     <pin_mask id=\"20\" masked=\"Masked\"/>\n                     <pin_mask id=\"21\" masked=\"Masked\"/>\n                     <pin_mask id=\"22\" masked=\"Masked\"/>\n                     <pin_mask id=\"23\" masked=\"Masked\"/>\n                     <pin_mask id=\"24\" masked=\"Masked\"/>\n                     <pin_mask id=\"25\" masked=\"Masked\"/>\n                     <pin_mask id=\"26\" masked=\"Masked\"/>\n                     <pin_mask id=\"27\" masked=\"Masked\"/>\n                     <pin_mask id=\"28\" masked=\"Masked\"/>\n                     <pin_mask id=\"29\" masked=\"Masked\"/>\n                     <pin_mask id=\"3\" masked=\"Masked\"/>\n                     <pin_mask id=\"30\" masked=\"Masked\"/>\n                     <pin_mask id=\"31\" masked=\"Masked\"/>\n                     <pin_mask id=\"4\" masked=\"Masked\"/>\n                     <pin_mask id=\"5\" masked=\"Masked\"/>\n                     <pin_mask id=\"6\" masked=\"Masked\"/>\n                     <pin_mask id=\"7\" masked=\"Masked\"/>\n                     <pin_mask id=\"8\" masked=\"Masked\"/>\n                     <pin_mask id=\"9\" masked=\"Masked\"/>\n                  </port>\n                  <port id=\"pio1\">\n                     <pin_mask id=\"0\" masked=\"Masked\"/>\n                     <pin_mask id=\"1\" masked=\"Masked\"/>\n                     <pin_mask id=\"10\" masked=\"Masked\"/>\n                     <pin_mask id=\"11\" masked=\"Masked\"/>\n                     <pin_mask id=\"12\" masked=\"Masked\"/>\n                     <pin_mask id=\"13\" masked=\"Masked\"/>\n                     <pin_mask id=\"14\" masked=\"Masked\"/>\n                     <pin_mask id=\"15\" masked=\"Masked\"/>\n                     <pin_mask id=\"16\" masked=\"Masked\"/>\n                     <pin_mask id=\"17\" masked=\"Masked\"/>\n                     <pin_mask id=\"18\" masked=\"Masked\"/>\n                     <pin_mask id=\"19\" masked=\"Masked\"/>\n                     <pin_mask id=\"2\" masked=\"Masked\"/>\n                     <pin_mask id=\"20\" masked=\"Masked\"/>\n                     <pin_mask id=\"21\" masked=\"Masked\"/>\n                     <pin_mask id=\"22\" masked=\"Masked\"/>\n                     <pin_mask id=\"23\" masked=\"Masked\"/>\n                     <pin_mask id=\"24\" masked=\"Masked\"/>\n                     <pin_mask id=\"25\" masked=\"Masked\"/>\n                     <pin_mask id=\"26\" masked=\"Masked\"/>\n                     <pin_mask id=\"27\" masked=\"Masked\"/>\n                     <pin_mask id=\"28\" masked=\"Masked\"/>\n                     <pin_mask id=\"29\" masked=\"Masked\"/>\n                     <pin_mask id=\"3\" masked=\"Masked\"/>\n                     <pin_mask id=\"30\" masked=\"Masked\"/>\n                     <pin_mask id=\"31\" masked=\"Masked\"/>\n                     <pin_mask id=\"4\" masked=\"Masked\"/>\n                     <pin_mask id=\"5\" masked=\"Masked\"/>\n                     <pin_mask id=\"6\" masked=\"Masked\"/>\n                     <pin_mask id=\"7\" masked=\"Masked\"/>\n                     <pin_mask id=\"8\" masked=\"Masked\"/>\n                     <pin_mask id=\"9\" masked=\"Masked\"/>\n                  </port>\n               </ports>\n            </ahb>\n            <saus>\n               <sau enabled=\"true\" all_non_secure=\"false\" generate_code_for_disabled_regions=\"false\">\n                  <region start=\"0\" size=\"268435456\" security=\"ns\" enabled=\"true\" index=\"0\"/>\n                  <region start=\"536870912\" size=\"3221225472\" security=\"ns\" enabled=\"true\" index=\"1\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"2\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"3\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"4\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"5\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"6\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"7\"/>\n               </sau>\n            </saus>\n            <global_options>\n               <option id=\"AIRCR_PRIS\" value=\"no\"/>\n               <option id=\"AIRCR_BFHFNMINS\" value=\"no\"/>\n               <option id=\"AIRCR_SYSRESETREQS\" value=\"no\"/>\n               <option id=\"SCR_SLEEPDEEPS\" value=\"no\"/>\n               <option id=\"SHCSR_SECUREFAULTENA\" value=\"no\"/>\n               <option id=\"CPACR_CP0\" value=\"3\"/>\n               <option id=\"CPACR_CP1\" value=\"3\"/>\n               <option id=\"CPACR_CP2\" value=\"0\"/>\n               <option id=\"CPACR_CP3\" value=\"0\"/>\n               <option id=\"CPACR_CP4\" value=\"0\"/>\n               <option id=\"CPACR_CP5\" value=\"0\"/>\n               <option id=\"CPACR_CP6\" value=\"0\"/>\n               <option id=\"CPACR_CP7\" value=\"0\"/>\n               <option id=\"CPACR_CP10\" value=\"3\"/>\n               <option id=\"CPACR_CP11\" value=\"3\"/>\n               <option id=\"NSACR_CP0\" value=\"yes\"/>\n               <option id=\"NSACR_CP1\" value=\"yes\"/>\n               <option id=\"NSACR_CP2\" value=\"no\"/>\n               <option id=\"NSACR_CP3\" value=\"no\"/>\n               <option id=\"NSACR_CP4\" value=\"no\"/>\n               <option id=\"NSACR_CP5\" value=\"no\"/>\n               <option id=\"NSACR_CP6\" value=\"no\"/>\n               <option id=\"NSACR_CP7\" value=\"no\"/>\n               <option id=\"NSACR_CP10\" value=\"yes\"/>\n               <option id=\"NSACR_CP11\" value=\"yes\"/>\n               <option id=\"CPPWR_SU0\" value=\"no\"/>\n               <option id=\"CPPWR_SUS0\" value=\"no\"/>\n               <option id=\"CPPWR_SU1\" value=\"no\"/>\n               <option id=\"CPPWR_SUS1\" value=\"no\"/>\n               <option id=\"CPPWR_SU2\" value=\"no\"/>\n               <option id=\"CPPWR_SUS2\" value=\"no\"/>\n               <option id=\"CPPWR_SU3\" value=\"no\"/>\n               <option id=\"CPPWR_SUS3\" value=\"no\"/>\n               <option id=\"CPPWR_SU4\" value=\"no\"/>\n               <option id=\"CPPWR_SUS4\" value=\"no\"/>\n               <option id=\"CPPWR_SU5\" value=\"no\"/>\n               <option id=\"CPPWR_SUS5\" value=\"no\"/>\n               <option id=\"CPPWR_SU6\" value=\"no\"/>\n               <option id=\"CPPWR_SUS6\" value=\"no\"/>\n               <option id=\"CPPWR_SU7\" value=\"no\"/>\n               <option id=\"CPPWR_SUS7\" value=\"no\"/>\n               <option id=\"CPPWR_SU10\" value=\"no\"/>\n               <option id=\"CPPWR_SUS10\" value=\"no\"/>\n               <option id=\"CPPWR_SU11\" value=\"no\"/>\n               <option id=\"CPPWR_SUS11\" value=\"no\"/>\n               <option id=\"SEC_GPIO_MASK0_LOCK\" value=\"no\"/>\n               <option id=\"SEC_GPIO_MASK1_LOCK\" value=\"no\"/>\n               <option id=\"SEC_CPU1_INT_MASK0_LOCK\" value=\"no\"/>\n               <option id=\"SEC_CPU1_INT_MASK1_LOCK\" value=\"no\"/>\n               <option id=\"MASTER_SEC_LEVEL_LOCK\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_NS_VTOR\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_NS_MPU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_S_VTAIRCR\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_S_MPU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_SAU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_REG_LOCK\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_NS_VTOR\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_NS_MPU\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_REG_LOCK\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_SECURE_CHECKING\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_SIMPLE_MASTER_STRICT_MODE\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_SMART_MASTER_STRICT_MODE\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_IDAU_ALL_NS\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_WRITE_LOCK\" value=\"yes\"/>\n            </global_options>\n            <mpus>\n               <mpu enabled=\"false\" priv_default_map=\"false\" handler_enabled=\"false\" id=\"s\" generate_code_for_disabled_regions=\"false\">\n                  <attributes>\n                     <group index=\"0\" id=\"Code\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"1\" id=\"RAM\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"2\" id=\"Peripheral\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"3\" id=\"3\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"4\" id=\"4\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"5\" id=\"5\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"6\" id=\"6\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"7\" id=\"7\" memory_type=\"device\" device=\"nGnRE\"/>\n                  </attributes>\n                  <regions>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"0\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"1\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"2\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"3\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"4\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"5\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"6\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"7\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                  </regions>\n               </mpu>\n               <mpu enabled=\"false\" priv_default_map=\"false\" handler_enabled=\"false\" id=\"ns\" generate_code_for_disabled_regions=\"false\">\n                  <attributes>\n                     <group index=\"0\" id=\"Code\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"1\" id=\"RAM\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"2\" id=\"Peripheral\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"3\" id=\"3\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"4\" id=\"4\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"5\" id=\"5\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"6\" id=\"6\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"7\" id=\"7\" memory_type=\"device\" device=\"nGnRE\"/>\n                  </attributes>\n                  <regions>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"0\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"1\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"2\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"3\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"4\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"5\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"6\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"7\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                  </regions>\n               </mpu>\n            </mpus>\n         </functional_group>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board/clock_config.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to set up clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up wait states of the flash.\n *\n * 3. Set up all dividers.\n *\n * 4. Set up all selectors to provide selected clocks.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v18.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_power.h\"\n#include \"fsl_clock.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockPLL150M();\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO12M\noutputs:\n- {id: System_clock.outFreq, value: 12 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO12M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    POWER_SetVoltageForFreq(12000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(12000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO12M */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF96M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFROHF96M\noutputs:\n- {id: System_clock.outFreq, value: 96 MHz}\nsettings:\n- {id: ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG, value: Enable}\n- {id: SYSCON.MAINCLKSELA.sel, value: ANACTRL.fro_hf_clk}\nsources:\n- {id: ANACTRL.fro_hf.outFreq, value: 96 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFROHF96M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    CLOCK_SetupFROClocking(96000000U);                   /* Enable FRO HF(96MHz) output */\n\n    POWER_SetVoltageForFreq(96000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(96000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO_HF */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL100M\noutputs:\n- {id: System_clock.outFreq, value: 100 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: ENABLE_CLKIN_ENA, value: Enabled}\n- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}\n- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL0_BYPASS}\n- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL0M_MULT.scale, value: '100', locked: true}\n- {id: SYSCON.PLL0N_DIV.scale, value: '4', locked: true}\n- {id: SYSCON.PLL0_PDEC.scale, value: '4', locked: true}\nsources:\n- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL100M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    /*!< Configure XTAL32M */\n    POWER_DisablePD(kPDRUNCFG_PD_XTAL32M);                        /* Ensure XTAL32M is powered */\n    POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M);                       /* Ensure XTAL32M is powered */\n    CLOCK_SetupExtClocking(16000000U);                            /* Enable clk_in clock */\n    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;       /* Enable clk_in from XTAL32M clock  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;    /* Enable clk_in to system  */\n\n    POWER_SetVoltageForFreq(100000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(100000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up PLL */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL0);                    /*!< Switch PLL0CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0);                  /* Ensure PLL is on  */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(26U),\n        .pllndec = SYSCON_PLL0NDEC_NDIV(4U),\n        .pllpdec = SYSCON_PLL0PDEC_PDIV(2U),\n        .pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(100U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},\n        .pllRate = 100000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL0_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL0 */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL100M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL150M\ncalled_from_default_init: true\noutputs:\n- {id: FXCOM0_clock.outFreq, value: 48 MHz}\n- {id: System_clock.outFreq, value: 144 MHz}\n- {id: USB0_clock.outFreq, value: 48 MHz}\n- {id: USB1_PHY_clock.outFreq, value: 16 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: PLL1_Mode, value: Normal}\n- {id: ENABLE_CLKIN_ENA, value: Enabled}\n- {id: ENABLE_PLL_USB_OUT, value: Enabled}\n- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}\n- {id: SYSCON.FCCLKSEL0.sel, value: SYSCON.PLL0DIV}\n- {id: SYSCON.FRGCTRL0_DIV.scale, value: '400'}\n- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL1_BYPASS}\n- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL0DIV.scale, value: '2'}\n- {id: SYSCON.PLL0M_MULT.scale, value: '150', locked: true}\n- {id: SYSCON.PLL0N_DIV.scale, value: '8', locked: true}\n- {id: SYSCON.PLL0_PDEC.scale, value: '2', locked: true}\n- {id: SYSCON.PLL1CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL1M_MULT.scale, value: '18'}\n- {id: SYSCON.PLL1_PDEC.scale, value: '2'}\n- {id: SYSCON.USB0CLKDIV.scale, value: '3'}\n- {id: SYSCON.USB0CLKSEL.sel, value: SYSCON.MAINCLKSELB}\nsources:\n- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL150M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    /*!< Configure XTAL32M */\n    POWER_DisablePD(kPDRUNCFG_PD_XTAL32M);                        /* Ensure XTAL32M is powered */\n    POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M);                       /* Ensure XTAL32M is powered */\n    CLOCK_SetupExtClocking(16000000U);                            /* Enable clk_in clock */\n    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;       /* Enable clk_in from XTAL32M clock  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;    /* Enable clk_in to system  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_PLL_USB_OUT_MASK;       /* Enable clk_in to HS USB  */\n\n    POWER_SetVoltageForFreq(144000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(144000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up PLL */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL0);                    /*!< Switch PLL0CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0);                  /* Ensure PLL is on  */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(31U),\n        .pllndec = SYSCON_PLL0NDEC_NDIV(8U),\n        .pllpdec = SYSCON_PLL0PDEC_PDIV(1U),\n        .pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(150U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},\n        .pllRate = 150000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n\n    /*!< Set up PLL1 */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL1);                    /*!< Switch PLL1CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL1);                  /* Ensure PLL is on  */\n    const pll_setup_t pll1Setup = {\n        .pllctrl = SYSCON_PLL1CTRL_CLKEN_MASK | SYSCON_PLL1CTRL_SELI(11U) | SYSCON_PLL1CTRL_SELP(5U),\n        .pllndec = SYSCON_PLL1NDEC_NDIV(1U),\n        .pllpdec = SYSCON_PLL1PDEC_PDIV(1U),\n        .pllmdec = SYSCON_PLL1MDEC_MDIV(18U),\n        .pllRate = 144000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL1Freq(&pll1Setup);                        /*!< Configure PLL1 to the desired values */\n\n    /*!< Set up dividers */\n    #if FSL_CLOCK_DRIVER_VERSION >= MAKE_VERSION(2, 3, 4)\n      CLOCK_SetClkDiv(kCLOCK_DivFlexFrg0, 144U, false);         /*!< Set DIV to value 0xFF and MULT to value 144U in related FLEXFRGCTRL register */\n    #else\n      CLOCK_SetClkDiv(kCLOCK_DivFlexFrg0, 37120U, false);         /*!< Set DIV to value 0xFF and MULT to value 144U in related FLEXFRGCTRL register */\n    #endif\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 0U, true);               /*!< Reset USB0CLKDIV divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 3U, false);         /*!< Set USB0CLKDIV divider to value 3 */\n    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 0U, true);               /*!< Reset PLL0DIV divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 2U, false);         /*!< Set PLL0DIV divider to value 2 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL1_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL1 */\n    CLOCK_AttachClk(kMAIN_CLK_to_USB0_CLK);                 /*!< Switch USB0_CLK to MAIN_CLK */\n    CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM0);                 /*!< Switch FLEXCOMM0 to PLL0_DIV */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;\n#endif\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board/clock_config.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         16000000U  /*!< Board xtal frequency in Hz */\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32K frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK           12000000U  /*!< Core clock frequency: 12000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO12M_ASYNCADC_CLOCK          0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO12M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER3_CLOCK           0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER4_CLOCK           0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM0_CLOCK            0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM1_CLOCK            0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM2_CLOCK            0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM3_CLOCK            0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM4_CLOCK            0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM5_CLOCK            0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM6_CLOCK            0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM7_CLOCK            0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKFRO12M_HSLSPI_CLOCK            0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKFRO12M_MCLK_CLOCK              0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_OSC32KHZ_CLOCK          0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFRO12M_OSTIMER32KHZ_CLOCK      0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKFRO12M_PLUCLKIN_CLOCK          0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_PLU_GLITCH_12MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_PLU_GLITCH_1MHZ_CLOCK   0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_RTC1HZ_CLOCK            0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_RTC1KHZ_CLOCK           0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SCT_CLOCK               0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKFRO12M_SDIO_CLOCK              0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKFRO12M_SYSTICK0_CLOCK          0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SYSTICK1_CLOCK          0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SYSTEM_CLOCK            12000000UL     /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKFRO12M_TRACE_CLOCK             0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO12M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKFRO12M_USB1_PHY_CLOCK          0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFRO12M_UTICK_CLOCK             0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO12M_WDT_CLOCK               0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO12M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF96M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK         96000000U  /*!< Core clock frequency: 96000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFROHF96M_ASYNCADC_CLOCK        0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFROHF96M_CLKOUT_CLOCK          0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER0_CLOCK         0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER1_CLOCK         0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER2_CLOCK         0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER3_CLOCK         0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER4_CLOCK         0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM0_CLOCK          0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM1_CLOCK          0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM2_CLOCK          0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM3_CLOCK          0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM4_CLOCK          0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM5_CLOCK          0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM6_CLOCK          0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM7_CLOCK          0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKFROHF96M_HSLSPI_CLOCK          0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKFROHF96M_MCLK_CLOCK            0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_OSC32KHZ_CLOCK        0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFROHF96M_OSTIMER32KHZ_CLOCK    0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKFROHF96M_PLUCLKIN_CLOCK        0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_PLU_GLITCH_12MHZ_CLOCK 0UL           /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_PLU_GLITCH_1MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_RTC1HZ_CLOCK          0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_RTC1KHZ_CLOCK         0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SCT_CLOCK             0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKFROHF96M_SDIO_CLOCK            0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTICK0_CLOCK        0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTICK1_CLOCK        0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTEM_CLOCK          96000000UL     /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKFROHF96M_TRACE_CLOCK           0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFROHF96M_USB0_CLOCK            0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKFROHF96M_USB1_PHY_CLOCK        0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFROHF96M_UTICK_CLOCK           0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFROHF96M_WDT_CLOCK             0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFROHF96M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL100M_CORE_CLOCK         100000000U  /*!< Core clock frequency: 100000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKPLL100M_ASYNCADC_CLOCK         0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKPLL100M_CLKOUT_CLOCK           0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER0_CLOCK          0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER1_CLOCK          0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER2_CLOCK          0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER3_CLOCK          0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER4_CLOCK          0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM0_CLOCK           0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM1_CLOCK           0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM2_CLOCK           0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM3_CLOCK           0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM4_CLOCK           0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM5_CLOCK           0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM6_CLOCK           0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM7_CLOCK           0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKPLL100M_HSLSPI_CLOCK           0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKPLL100M_MCLK_CLOCK             0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_OSC32KHZ_CLOCK         0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL100M_OSTIMER32KHZ_CLOCK     0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKPLL100M_PLUCLKIN_CLOCK         0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_PLU_GLITCH_12MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_PLU_GLITCH_1MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_RTC1HZ_CLOCK           0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_RTC1KHZ_CLOCK          0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SCT_CLOCK              0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKPLL100M_SDIO_CLOCK             0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKPLL100M_SYSTICK0_CLOCK         0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SYSTICK1_CLOCK         0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SYSTEM_CLOCK           100000000UL    /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKPLL100M_TRACE_CLOCK            0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKPLL100M_USB0_CLOCK             0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKPLL100M_USB1_PHY_CLOCK         0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL100M_UTICK_CLOCK            0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKPLL100M_WDT_CLOCK              0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL100M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL150M_CORE_CLOCK         144000000U  /*!< Core clock frequency: 144000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKPLL150M_ASYNCADC_CLOCK         0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKPLL150M_CLKOUT_CLOCK           0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER0_CLOCK          0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER1_CLOCK          0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER2_CLOCK          0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER3_CLOCK          0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER4_CLOCK          0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM0_CLOCK           48000000UL     /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM1_CLOCK           0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM2_CLOCK           0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM3_CLOCK           0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM4_CLOCK           0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM5_CLOCK           0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM6_CLOCK           0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM7_CLOCK           0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKPLL150M_HSLSPI_CLOCK           0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKPLL150M_MCLK_CLOCK             0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_OSC32KHZ_CLOCK         0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL150M_OSTIMER32KHZ_CLOCK     0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKPLL150M_PLUCLKIN_CLOCK         0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_PLU_GLITCH_12MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_PLU_GLITCH_1MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_RTC1HZ_CLOCK           0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_RTC1KHZ_CLOCK          0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SCT_CLOCK              0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKPLL150M_SDIO_CLOCK             0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKPLL150M_SYSTICK0_CLOCK         0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SYSTICK1_CLOCK         0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SYSTEM_CLOCK           144000000UL    /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKPLL150M_TRACE_CLOCK            0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKPLL150M_USB0_CLOCK             48000000UL     /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKPLL150M_USB1_PHY_CLOCK         16000000UL     /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL150M_UTICK_CLOCK            0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKPLL150M_WDT_CLOCK              0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL150M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board/peripherals.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Peripherals v15.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\nfunctionalGroups:\n- name: BOARD_InitPeripherals_cm33_core0\n  UUID: 61d0725d-b300-49cb-9c66-b5edfbf8ffc1\n  called_from_default_init: true\n  selectedCore: cm33_core0\n- name: BOARD_InitPeripherals_cm33_core1\n  UUID: e2041cd4-ebb6-45a5-807f-e0c2dc047d48\n  selectedCore: cm33_core1\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'system'\n- type_id: 'system'\n- global_system_definitions:\n  - user_definitions: ''\n  - user_includes: ''\n  - global_init: ''\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'uart_cmsis_common'\n- type_id: 'uart_cmsis_common'\n- global_USART_CMSIS_common:\n  - quick_selection: 'default'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'gpio_adapter_common'\n- type_id: 'gpio_adapter_common'\n- global_gpio_adapter_common:\n  - quick_selection: 'default'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/***********************************************************************************************************************\n * Included files\n **********************************************************************************************************************/\n#include \"peripherals.h\"\n\n/***********************************************************************************************************************\n * BOARD_InitPeripherals_cm33_core0 functional group\n **********************************************************************************************************************/\n/***********************************************************************************************************************\n * DEBUG_UART initialization code\n **********************************************************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ninstance:\n- name: 'DEBUG_UART'\n- type: 'flexcomm_usart'\n- mode: 'polling'\n- custom_name_enabled: 'true'\n- type_id: 'flexcomm_usart_2.2.0'\n- functional_group: 'BOARD_InitPeripherals_cm33_core0'\n- peripheral: 'FLEXCOMM0'\n- config_sets:\n  - usartConfig_t:\n    - usartConfig:\n      - clockSource: 'FXCOMFunctionClock'\n      - clockSourceFreq: 'ClocksTool_DefaultInit'\n      - baudRate_Bps: '115200'\n      - syncMode: 'kUSART_SyncModeDisabled'\n      - parityMode: 'kUSART_ParityDisabled'\n      - stopBitCount: 'kUSART_OneStopBit'\n      - bitCountPerChar: 'kUSART_8BitsPerChar'\n      - loopback: 'false'\n      - txWatermark: 'kUSART_TxFifo0'\n      - rxWatermark: 'kUSART_RxFifo1'\n      - enableRx: 'true'\n      - enableTx: 'true'\n      - clockPolarity: 'kUSART_RxSampleOnFallingEdge'\n      - enableContinuousSCLK: 'false'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\nconst usart_config_t DEBUG_UART_config = {\n  .baudRate_Bps = 115200UL,\n  .syncMode = kUSART_SyncModeDisabled,\n  .parityMode = kUSART_ParityDisabled,\n  .stopBitCount = kUSART_OneStopBit,\n  .bitCountPerChar = kUSART_8BitsPerChar,\n  .loopback = false,\n  .txWatermark = kUSART_TxFifo0,\n  .rxWatermark = kUSART_RxFifo1,\n  .enableRx = true,\n  .enableTx = true,\n  .enableMode32k = false,\n  .clockPolarity = kUSART_RxSampleOnFallingEdge,\n  .enableContinuousSCLK = false\n};\n\nstatic void DEBUG_UART_init(void) {\n  /* Reset FLEXCOMM device */\n  RESET_PeripheralReset(kFC0_RST_SHIFT_RSTn);\n  USART_Init(DEBUG_UART_PERIPHERAL, &DEBUG_UART_config, DEBUG_UART_CLOCK_SOURCE);\n}\n\n/***********************************************************************************************************************\n * NVIC initialization code\n **********************************************************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ninstance:\n- name: 'NVIC'\n- type: 'nvic'\n- mode: 'general'\n- custom_name_enabled: 'false'\n- type_id: 'nvic'\n- functional_group: 'BOARD_InitPeripherals_cm33_core0'\n- peripheral: 'NVIC'\n- config_sets:\n  - nvic:\n    - interrupt_table: []\n    - interrupts: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/* Empty initialization function (commented out)\nstatic void NVIC_init(void) {\n} */\n\n/***********************************************************************************************************************\n * Initialization functions\n **********************************************************************************************************************/\nvoid BOARD_InitPeripherals_cm33_core0(void)\n{\n  /* Initialize components */\n  DEBUG_UART_init();\n}\n\n/***********************************************************************************************************************\n * BOARD_InitBootPeripherals function\n **********************************************************************************************************************/\nvoid BOARD_InitBootPeripherals(void)\n{\n  BOARD_InitPeripherals_cm33_core0();\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board/peripherals.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PERIPHERALS_H_\n#define _PERIPHERALS_H_\n\n/***********************************************************************************************************************\n * Included files\n **********************************************************************************************************************/\n#include \"fsl_common.h\"\n#include \"fsl_reset.h\"\n#include \"fsl_usart.h\"\n#include \"fsl_clock.h\"\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus */\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n/* Definitions for BOARD_InitPeripherals_cm33_core0 functional group */\n/* Definition of peripheral ID */\n#define DEBUG_UART_PERIPHERAL ((USART_Type *)FLEXCOMM0)\n/* Definition of the clock source frequency */\n#define DEBUG_UART_CLOCK_SOURCE 48000000UL\n\n/***********************************************************************************************************************\n * Global variables\n **********************************************************************************************************************/\nextern const usart_config_t DEBUG_UART_config;\n\n/***********************************************************************************************************************\n * Initialization functions\n **********************************************************************************************************************/\n\nvoid BOARD_InitPeripherals_cm33_core0(void);\n\n/***********************************************************************************************************************\n * BOARD_InitBootPeripherals function\n **********************************************************************************************************************/\nvoid BOARD_InitBootPeripherals(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif /* _PERIPHERALS_H_ */\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board/pin_mux.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_iocon.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitDEBUG_UARTPins();\n    BOARD_InitUSBPins();\n    BOARD_InitLEDsPins();\n    BOARD_InitBUTTONsPins();\n    BOARD_InitPins_Core0();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '92', peripheral: FLEXCOMM0, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '94', peripheral: FLEXCOMM0, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30, mode: inactive,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitDEBUG_UARTPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t DEBUG_UART_RX = (/* Pin is configured as FC0_RXD_SDA_MOSI_DATA */\n                                    IOCON_PIO_FUNC1 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN29 (coords: 92) is configured as FC0_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN, DEBUG_UART_RX);\n\n    const uint32_t DEBUG_UART_TX = (/* Pin is configured as FC0_TXD_SCL_MISO_WS */\n                                    IOCON_PIO_FUNC1 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN30 (coords: 94) is configured as FC0_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN, DEBUG_UART_TX);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSWD_DEBUGPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '13', peripheral: SWD, signal: SWCLK, pin_signal: PIO0_11/FC6_RXD_SDA_MOSI_DATA/CTIMER2_MAT2/FREQME_GPIO_CLK_A/SWCLK/SECURE_GPIO0_11/ADC0_9, mode: pullDown,\n    slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '12', peripheral: SWD, signal: SWDIO, pin_signal: PIO0_12/FC3_TXD_SCL_MISO_WS/SD1_BACKEND_PWR/FREQME_GPIO_CLK_B/SCT_GPI7/SD0_POW_EN/SWDIO/FC6_TXD_SCL_MISO_WS/SECURE_GPIO0_12/ADC0_10,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '21', peripheral: SWD, signal: SWO, pin_signal: PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1, identifier: DEBUG_SWD_SWO,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled, asw: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSWD_DEBUGPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitSWD_DEBUGPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t DEBUG_SWD_SWO = (/* Pin is configured as SWO */\n                                    IOCON_PIO_FUNC6 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI |\n                                    /* Analog switch is open (disabled) */\n                                    IOCON_PIO_ASW_DI);\n    /* PORT0 PIN10 (coords: 21) is configured as SWO */\n    IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN, DEBUG_SWD_SWO);\n\n    if (Chip_GetVersion()==1)\n    {\n        const uint32_t DEBUG_SWD_SWDCLK = (/* Pin is configured as SWCLK */\n                                           IOCON_PIO_FUNC6 |\n                                           /* Selects pull-down function */\n                                           IOCON_PIO_MODE_PULLDOWN |\n                                           /* Standard mode, output slew rate control is enabled */\n                                           IOCON_PIO_SLEW_STANDARD |\n                                           /* Input function is not inverted */\n                                           IOCON_PIO_INV_DI |\n                                           /* Enables digital function */\n                                           IOCON_PIO_DIGITAL_EN |\n                                           /* Open drain is disabled */\n                                           IOCON_PIO_OPENDRAIN_DI |\n                                           /* Analog switch is closed (enabled) */\n                                           IOCON_PIO_ASW_EN);\n        /* PORT0 PIN11 (coords: 13) is configured as SWCLK */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN, DEBUG_SWD_SWDCLK);\n    }\n    else\n    {\n        const uint32_t DEBUG_SWD_SWDCLK = (/* Pin is configured as SWCLK */\n                                           IOCON_PIO_FUNC6 |\n                                           /* Selects pull-down function */\n                                           IOCON_PIO_MODE_PULLDOWN |\n                                           /* Standard mode, output slew rate control is enabled */\n                                           IOCON_PIO_SLEW_STANDARD |\n                                           /* Input function is not inverted */\n                                           IOCON_PIO_INV_DI |\n                                           /* Enables digital function */\n                                           IOCON_PIO_DIGITAL_EN |\n                                           /* Open drain is disabled */\n                                           IOCON_PIO_OPENDRAIN_DI |\n                                           /* Analog switch is closed (enabled), only for A0 version */\n                                           IOCON_PIO_ASW_DIS_EN);\n        /* PORT0 PIN11 (coords: 13) is configured as SWCLK */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN, DEBUG_SWD_SWDCLK);\n    }\n\n    if (Chip_GetVersion()==1)\n    {\n        const uint32_t DEBUG_SWD_SWDIO = (/* Pin is configured as SWDIO */\n                                          IOCON_PIO_FUNC6 |\n                                          /* Selects pull-up function */\n                                          IOCON_PIO_MODE_PULLUP |\n                                          /* Standard mode, output slew rate control is enabled */\n                                          IOCON_PIO_SLEW_STANDARD |\n                                          /* Input function is not inverted */\n                                          IOCON_PIO_INV_DI |\n                                          /* Enables digital function */\n                                          IOCON_PIO_DIGITAL_EN |\n                                          /* Open drain is disabled */\n                                          IOCON_PIO_OPENDRAIN_DI |\n                                          /* Analog switch is closed (enabled) */\n                                          IOCON_PIO_ASW_EN);\n        /* PORT0 PIN12 (coords: 12) is configured as SWDIO */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN, DEBUG_SWD_SWDIO);\n    }\n    else\n    {\n        const uint32_t DEBUG_SWD_SWDIO = (/* Pin is configured as SWDIO */\n                                          IOCON_PIO_FUNC6 |\n                                          /* Selects pull-up function */\n                                          IOCON_PIO_MODE_PULLUP |\n                                          /* Standard mode, output slew rate control is enabled */\n                                          IOCON_PIO_SLEW_STANDARD |\n                                          /* Input function is not inverted */\n                                          IOCON_PIO_INV_DI |\n                                          /* Enables digital function */\n                                          IOCON_PIO_DIGITAL_EN |\n                                          /* Open drain is disabled */\n                                          IOCON_PIO_OPENDRAIN_DI |\n                                          /* Analog switch is closed (enabled), only for A0 version */\n                                          IOCON_PIO_ASW_DIS_EN);\n        /* PORT0 PIN12 (coords: 12) is configured as SWDIO */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN, DEBUG_SWD_SWDIO);\n    }\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSBPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '97', peripheral: USBFSH, signal: USB_DP, pin_signal: USB0_DP}\n  - {pin_num: '98', peripheral: USBFSH, signal: USB_DM, pin_signal: USB0_DM}\n  - {pin_num: '78', peripheral: USBFSH, signal: USB_VBUS, pin_signal: PIO0_22/FC6_TXD_SCL_MISO_WS/UTICK_CAP1/CT_INP15/SCT0_OUT3/USB0_VBUS/SD1_D0/PLU_OUT7/SECURE_GPIO0_22,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '35', peripheral: USBHSH, signal: USB_DM, pin_signal: USB1_DM}\n  - {pin_num: '34', peripheral: USBHSH, signal: USB_DP, pin_signal: USB1_DP}\n  - {pin_num: '36', peripheral: USBHSH, signal: USB_VBUS, pin_signal: USB1_VBUS}\n  - {pin_num: '65', peripheral: USBHSH, signal: USB_OVERCURRENTN, pin_signal: PIO1_30/FC7_TXD_SCL_MISO_WS/SD0_D7/SCT_GPI7/USB1_OVERCURRENTN/USB1_LEDN/PLU_IN1, mode: pullUp}\n  - {pin_num: '66', peripheral: USBFSH, signal: USB_OVERCURRENTN, pin_signal: PIO0_28/FC0_SCK/SD1_CMD/CT_INP11/SCT0_OUT7/USB0_OVERCURRENTN/PLU_OUT1/SECURE_GPIO0_28,\n    mode: pullUp}\n  - {pin_num: '67', peripheral: USBFSH, signal: USB_PORTPWRN, pin_signal: PIO1_12/FC6_SCK/CTIMER1_MAT1/USB0_PORTPWRN/HS_SPI_SSEL2, mode: pullUp}\n  - {pin_num: '80', peripheral: USBHSH, signal: USB_PORTPWRN, pin_signal: PIO1_29/FC7_RXD_SDA_MOSI_DATA/SD0_D6/SCT_GPI6/USB1_PORTPWRN/USB1_FRAME/PLU_IN2, mode: pullUp}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSBPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitUSBPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t USB0_VBUS = (/* Pin is configured as USB0_VBUS */\n                                IOCON_PIO_FUNC7 |\n                                /* No addition pin function */\n                                IOCON_PIO_MODE_INACT |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN22 (coords: 78) is configured as USB0_VBUS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITUSBPINS_USB0_VBUS_PORT, BOARD_INITUSBPINS_USB0_VBUS_PIN, USB0_VBUS);\n\n    IOCON->PIO[0][28] = ((IOCON->PIO[0][28] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT028 (pin 66) is configured as USB0_OVERCURRENTN. */\n                         | IOCON_PIO_FUNC(PIO0_28_FUNC_ALT7)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO0_28_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO0_28_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][12] = ((IOCON->PIO[1][12] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT112 (pin 67) is configured as USB0_PORTPWRN. */\n                         | IOCON_PIO_FUNC(PIO1_12_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_12_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_12_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][29] = ((IOCON->PIO[1][29] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT129 (pin 80) is configured as USB1_PORTPWRN. */\n                         | IOCON_PIO_FUNC(PIO1_29_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_29_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_29_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][30] = ((IOCON->PIO[1][30] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT130 (pin 65) is configured as USB1_OVERCURRENTN. */\n                         | IOCON_PIO_FUNC(PIO1_30_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_30_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_30_DIGIMODE_DIGITAL));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLEDsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '1', peripheral: GPIO, signal: 'PIO1, 4', pin_signal: PIO1_4/FC0_SCK/SD0_D0/CTIMER2_MAT1/SCT0_OUT0/FREQME_GPIO_CLK_A, direction: OUTPUT, gpio_init_state: 'true',\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '5', peripheral: GPIO, signal: 'PIO1, 6', pin_signal: PIO1_6/FC0_TXD_SCL_MISO_WS/SD0_D3/CTIMER2_MAT1/SCT_GPI3, direction: OUTPUT, gpio_init_state: 'true',\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '9', peripheral: GPIO, signal: 'PIO1, 7', pin_signal: PIO1_7/FC0_RTS_SCL_SSEL1/SD0_D1/CTIMER2_MAT2/SCT_GPI4, direction: OUTPUT, gpio_init_state: 'true',\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLEDsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitLEDsPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t LED_BLUE_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO1_4 (pin 1)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_BLUE_GPIO, BOARD_INITLEDSPINS_LED_BLUE_PORT, BOARD_INITLEDSPINS_LED_BLUE_PIN, &LED_BLUE_config);\n\n    gpio_pin_config_t LED_RED_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO1_6 (pin 5)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_RED_GPIO, BOARD_INITLEDSPINS_LED_RED_PORT, BOARD_INITLEDSPINS_LED_RED_PIN, &LED_RED_config);\n\n    gpio_pin_config_t LED_GREEN_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO1_7 (pin 9)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_GREEN_GPIO, BOARD_INITLEDSPINS_LED_GREEN_PORT, BOARD_INITLEDSPINS_LED_GREEN_PIN, &LED_GREEN_config);\n\n    const uint32_t LED_BLUE = (/* Pin is configured as PIO1_4 */\n                               IOCON_PIO_FUNC0 |\n                               /* Selects pull-up function */\n                               IOCON_PIO_MODE_PULLUP |\n                               /* Standard mode, output slew rate control is enabled */\n                               IOCON_PIO_SLEW_STANDARD |\n                               /* Input function is not inverted */\n                               IOCON_PIO_INV_DI |\n                               /* Enables digital function */\n                               IOCON_PIO_DIGITAL_EN |\n                               /* Open drain is disabled */\n                               IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN4 (coords: 1) is configured as PIO1_4 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITLEDSPINS_LED_BLUE_PORT, BOARD_INITLEDSPINS_LED_BLUE_PIN, LED_BLUE);\n\n    const uint32_t LED_RED = (/* Pin is configured as PIO1_6 */\n                              IOCON_PIO_FUNC0 |\n                              /* Selects pull-up function */\n                              IOCON_PIO_MODE_PULLUP |\n                              /* Standard mode, output slew rate control is enabled */\n                              IOCON_PIO_SLEW_STANDARD |\n                              /* Input function is not inverted */\n                              IOCON_PIO_INV_DI |\n                              /* Enables digital function */\n                              IOCON_PIO_DIGITAL_EN |\n                              /* Open drain is disabled */\n                              IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN6 (coords: 5) is configured as PIO1_6 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITLEDSPINS_LED_RED_PORT, BOARD_INITLEDSPINS_LED_RED_PIN, LED_RED);\n\n    const uint32_t LED_GREEN = (/* Pin is configured as PIO1_7 */\n                                IOCON_PIO_FUNC0 |\n                                /* Selects pull-up function */\n                                IOCON_PIO_MODE_PULLUP |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN7 (coords: 9) is configured as PIO1_7 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITLEDSPINS_LED_GREEN_PORT, BOARD_INITLEDSPINS_LED_GREEN_PIN, LED_GREEN);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitBUTTONsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '88', peripheral: GPIO, signal: 'PIO0, 5', pin_signal: PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5, direction: INPUT,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '64', peripheral: GPIO, signal: 'PIO1, 18', pin_signal: PIO1_18/SD1_POW_EN/SCT0_OUT5/PLU_OUT0, direction: INPUT, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '10', peripheral: GPIO, signal: 'PIO1, 9', pin_signal: PIO1_9/FC1_SCK/CT_INP4/SCT0_OUT2/FC4_CTS_SDA_SSEL0/ADC0_12, direction: INPUT, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '32', peripheral: SYSCON, signal: RESET, pin_signal: RESETN}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBUTTONsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitBUTTONsPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO0 module */\n    CLOCK_EnableClock(kCLOCK_Gpio0);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t S1_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO0_5 (pin 88)  */\n    GPIO_PinInit(BOARD_INITBUTTONSPINS_S1_GPIO, BOARD_INITBUTTONSPINS_S1_PORT, BOARD_INITBUTTONSPINS_S1_PIN, &S1_config);\n\n    gpio_pin_config_t S3_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_9 (pin 10)  */\n    GPIO_PinInit(BOARD_INITBUTTONSPINS_S3_GPIO, BOARD_INITBUTTONSPINS_S3_PORT, BOARD_INITBUTTONSPINS_S3_PIN, &S3_config);\n\n    gpio_pin_config_t S2_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_18 (pin 64)  */\n    GPIO_PinInit(BOARD_INITBUTTONSPINS_S2_GPIO, BOARD_INITBUTTONSPINS_S2_PORT, BOARD_INITBUTTONSPINS_S2_PIN, &S2_config);\n\n    const uint32_t S1 = (/* Pin is configured as PIO0_5 */\n                         IOCON_PIO_FUNC0 |\n                         /* Selects pull-up function */\n                         IOCON_PIO_MODE_PULLUP |\n                         /* Standard mode, output slew rate control is enabled */\n                         IOCON_PIO_SLEW_STANDARD |\n                         /* Input function is not inverted */\n                         IOCON_PIO_INV_DI |\n                         /* Enables digital function */\n                         IOCON_PIO_DIGITAL_EN |\n                         /* Open drain is disabled */\n                         IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN5 (coords: 88) is configured as PIO0_5 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITBUTTONSPINS_S1_PORT, BOARD_INITBUTTONSPINS_S1_PIN, S1);\n\n    const uint32_t S2 = (/* Pin is configured as PIO1_18 */\n                         IOCON_PIO_FUNC0 |\n                         /* Selects pull-up function */\n                         IOCON_PIO_MODE_PULLUP |\n                         /* Standard mode, output slew rate control is enabled */\n                         IOCON_PIO_SLEW_STANDARD |\n                         /* Input function is not inverted */\n                         IOCON_PIO_INV_DI |\n                         /* Enables digital function */\n                         IOCON_PIO_DIGITAL_EN |\n                         /* Open drain is disabled */\n                         IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN18 (coords: 64) is configured as PIO1_18 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITBUTTONSPINS_S2_PORT, BOARD_INITBUTTONSPINS_S2_PIN, S2);\n\n    if (Chip_GetVersion()==1)\n    {\n        const uint32_t S3 = (/* Pin is configured as PIO1_9 */\n                             IOCON_PIO_FUNC0 |\n                             /* Selects pull-up function */\n                             IOCON_PIO_MODE_PULLUP |\n                             /* Standard mode, output slew rate control is enabled */\n                             IOCON_PIO_SLEW_STANDARD |\n                             /* Input function is not inverted */\n                             IOCON_PIO_INV_DI |\n                             /* Enables digital function */\n                             IOCON_PIO_DIGITAL_EN |\n                             /* Open drain is disabled */\n                             IOCON_PIO_OPENDRAIN_DI |\n                             /* Analog switch is closed (enabled) */\n                             IOCON_PIO_ASW_EN);\n        /* PORT1 PIN9 (coords: 10) is configured as PIO1_9 */\n        IOCON_PinMuxSet(IOCON, BOARD_INITBUTTONSPINS_S3_PORT, BOARD_INITBUTTONSPINS_S3_PIN, S3);\n    }\n    else\n    {\n        const uint32_t S3 = (/* Pin is configured as PIO1_9 */\n                             IOCON_PIO_FUNC0 |\n                             /* Selects pull-up function */\n                             IOCON_PIO_MODE_PULLUP |\n                             /* Standard mode, output slew rate control is enabled */\n                             IOCON_PIO_SLEW_STANDARD |\n                             /* Input function is not inverted */\n                             IOCON_PIO_INV_DI |\n                             /* Enables digital function */\n                             IOCON_PIO_DIGITAL_EN |\n                             /* Open drain is disabled */\n                             IOCON_PIO_OPENDRAIN_DI |\n                             /* Analog switch is closed (enabled), only for A0 version */\n                             IOCON_PIO_ASW_DIS_EN);\n        /* PORT1 PIN9 (coords: 10) is configured as PIO1_9 */\n        IOCON_PinMuxSet(IOCON, BOARD_INITBUTTONSPINS_S3_PORT, BOARD_INITBUTTONSPINS_S3_PIN, S3);\n    }\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins_Core0:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins_Core0\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitPins_Core0(void)\n{\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitI2SPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '4', peripheral: FLEXCOMM4, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '30', peripheral: FLEXCOMM4, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3, mode: pullUp,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '91', peripheral: SYSCON, signal: MCLK, pin_signal: PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0, mode: inactive, slew_rate: standard, invert: disabled,\n    open_drain: disabled}\n  - {pin_num: '76', peripheral: FLEXCOMM7, signal: SCK, pin_signal: PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '74', peripheral: FLEXCOMM7, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '90', peripheral: FLEXCOMM7, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '21', peripheral: FLEXCOMM6, signal: SCK, pin_signal: PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1,\n    identifier: FC6_I2S_CLK, mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '2', peripheral: FLEXCOMM6, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '87', peripheral: FLEXCOMM6, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitI2SPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitI2SPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t FC6_I2S_CLK = (/* Pin is configured as FC6_SCK */\n                                  IOCON_PIO_FUNC1 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI |\n                                  /* Analog switch is closed (enabled) */\n                                  IOCON_PIO_ASW_EN);\n    /* PORT0 PIN10 (coords: 21) is configured as FC6_SCK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_CLK_PORT, BOARD_INITI2SPINS_FC6_I2S_CLK_PIN, FC6_I2S_CLK);\n\n    const uint32_t FC7_I2S_WS = (/* Pin is configured as FC7_TXD_SCL_MISO_WS */\n                                 IOCON_PIO_FUNC7 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN19 (coords: 90) is configured as FC7_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_WS_PORT, BOARD_INITI2SPINS_FC7_I2S_WS_PIN, FC7_I2S_WS);\n\n    const uint32_t FC7_I2S_TX = (/* Pin is configured as FC7_RXD_SDA_MOSI_DATA */\n                                 IOCON_PIO_FUNC7 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN20 (coords: 74) is configured as FC7_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_TX_PORT, BOARD_INITI2SPINS_FC7_I2S_TX_PIN, FC7_I2S_TX);\n\n    const uint32_t FC7_I2S_SCK = (/* Pin is configured as FC7_SCK */\n                                  IOCON_PIO_FUNC7 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN21 (coords: 76) is configured as FC7_SCK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_SCK_PORT, BOARD_INITI2SPINS_FC7_I2S_SCK_PIN, FC7_I2S_SCK);\n\n    const uint32_t FC6_I2S_RX = (/* Pin is configured as FC6_RXD_SDA_MOSI_DATA */\n                                 IOCON_PIO_FUNC2 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN13 (coords: 2) is configured as FC6_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_RX_PORT, BOARD_INITI2SPINS_FC6_I2S_RX_PIN, FC6_I2S_RX);\n\n    const uint32_t FC6_I2S_WS = (/* Pin is configured as FC6_TXD_SCL_MISO_WS */\n                                 IOCON_PIO_FUNC2 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN16 (coords: 87) is configured as FC6_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_WS_PORT, BOARD_INITI2SPINS_FC6_I2S_WS_PIN, FC6_I2S_WS);\n\n    const uint32_t FC4_I2C_SCL = (/* Pin is configured as FC4_TXD_SCL_MISO_WS */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN20 (coords: 4) is configured as FC4_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC4_I2C_SCL_PORT, BOARD_INITI2SPINS_FC4_I2C_SCL_PIN, FC4_I2C_SCL);\n\n    const uint32_t FC4_I2C_SDA = (/* Pin is configured as FC4_RXD_SDA_MOSI_DATA */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC4_I2C_SDA_PORT, BOARD_INITI2SPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA);\n\n    const uint32_t MCLK = (/* Pin is configured as MCLK */\n                           IOCON_PIO_FUNC1 |\n                           /* No addition pin function */\n                           IOCON_PIO_MODE_INACT |\n                           /* Standard mode, output slew rate control is enabled */\n                           IOCON_PIO_SLEW_STANDARD |\n                           /* Input function is not inverted */\n                           IOCON_PIO_INV_DI |\n                           /* Enables digital function */\n                           IOCON_PIO_DIGITAL_EN |\n                           /* Open drain is disabled */\n                           IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN31 (coords: 91) is configured as MCLK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_MCLK_PORT, BOARD_INITI2SPINS_MCLK_PIN, MCLK);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitACCELPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '30', peripheral: FLEXCOMM4, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3, mode: pullUp,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '4', peripheral: FLEXCOMM4, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '58', peripheral: GPIO, signal: 'PIO1, 19', pin_signal: PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF, direction: INPUT, mode: inactive,\n    slew_rate: standard, invert: disabled, open_drain: disabled, asw: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitACCELPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitACCELPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t ACCL_INTR_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_19 (pin 58)  */\n    GPIO_PinInit(BOARD_INITACCELPINS_ACCL_INTR_GPIO, BOARD_INITACCELPINS_ACCL_INTR_PORT, BOARD_INITACCELPINS_ACCL_INTR_PIN, &ACCL_INTR_config);\n\n    const uint32_t ACCL_INTR = (/* Pin is configured as PIO1_19 */\n                                IOCON_PIO_FUNC0 |\n                                /* No addition pin function */\n                                IOCON_PIO_MODE_INACT |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI |\n                                /* Analog switch is open (disabled) */\n                                IOCON_PIO_ASW_DI);\n    /* PORT1 PIN19 (coords: 58) is configured as PIO1_19 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_ACCL_INTR_PORT, BOARD_INITACCELPINS_ACCL_INTR_PIN, ACCL_INTR);\n\n    const uint32_t FC4_I2C_SCL = (/* Pin is configured as FC4_TXD_SCL_MISO_WS */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN20 (coords: 4) is configured as FC4_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SCL_PORT, BOARD_INITACCELPINS_FC4_I2C_SCL_PIN, FC4_I2C_SCL);\n\n    const uint32_t FC4_I2C_SDA = (/* Pin is configured as FC4_RXD_SDA_MOSI_DATA */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SDA_PORT, BOARD_INITACCELPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board/pin_mux.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC1 0x01u         /*!<@brief Selects pin function 1 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_29 (number 92), P8[2]/U6[13]/FC0_USART_RXD\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN 29U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN_MASK (1U << 29U)\n/* @} */\n\n/*! @name PIO0_30 (number 94), P8[3]/U6[12]/FC0_USART_TXD\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN 30U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN_MASK (1U << 30U)\n/* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DI 0x00u        /*!<@brief Analog switch is open (disabled) */\n#define IOCON_PIO_ASW_DIS_EN 0x00u    /*!<@brief Analog switch is closed (enabled), only for A0 version */\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC6 0x06u         /*!<@brief Selects pin function 6 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLDOWN 0x10u /*!<@brief Selects pull-down function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_11 (number 13), U14[4]/SWDCLK_TRGT\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN 11U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN_MASK (1U << 11U)\n/* @} */\n\n/*! @name PIO0_12 (number 12), U15[4]/D7/P7[2]/IF_SWDIO\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN 12U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN_MASK (1U << 12U)\n/* @} */\n\n/*! @name PIO0_10 (number 21), U14[12]/SWO_TRGT\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN 10U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN_MASK (1U << 10U)\n/* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSWD_DEBUGPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Enables digital function */\n#define IOCON_PIO_DIGITAL_EN 0x0100u\n/*!\n * @brief Selects pin function 7 */\n#define IOCON_PIO_FUNC7 0x07u\n/*!\n * @brief Input function is not inverted */\n#define IOCON_PIO_INV_DI 0x00u\n/*!\n * @brief No addition pin function */\n#define IOCON_PIO_MODE_INACT 0x00u\n/*!\n * @brief Open drain is disabled */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u\n/*!\n * @brief Standard mode, output slew rate control is enabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO0_28_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 7. */\n#define PIO0_28_FUNC_ALT7 0x07u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO0_28_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_12_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_12_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_12_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_29_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_29_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_29_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_30_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_30_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_30_MODE_PULL_UP 0x02u\n\n/*! @name PIO0_22 (number 78), P10[1]/USB0_VBUS\n  @{ */\n#define BOARD_INITUSBPINS_USB0_VBUS_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITUSBPINS_USB0_VBUS_PIN 22U                   /*!<@brief PORT pin number */\n#define BOARD_INITUSBPINS_USB0_VBUS_PIN_MASK (1U << 22U)      /*!<@brief PORT pin mask */\n                                                              /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSBPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_4 (number 1), R78/P18[5]/LEDR/PWM_ARD\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_BLUE_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_BLUE_INIT_GPIO_VALUE 1U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_BLUE_GPIO_PIN_MASK (1U << 4U) /*!<@brief GPIO pin mask */\n#define BOARD_INITLEDSPINS_LED_BLUE_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_BLUE_PIN 4U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_BLUE_PIN_MASK (1U << 4U)      /*!<@brief PORT pin mask */\n                                                             /* @} */\n\n/*! @name PIO1_6 (number 5), R80/P18[9]/LEDB/PWM_ARD\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_RED_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_RED_INIT_GPIO_VALUE 1U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_RED_GPIO_PIN_MASK (1U << 6U) /*!<@brief GPIO pin mask */\n#define BOARD_INITLEDSPINS_LED_RED_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_RED_PIN 6U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_RED_PIN_MASK (1U << 6U)      /*!<@brief PORT pin mask */\n                                                            /* @} */\n\n/*! @name PIO1_7 (number 9), R79/P18[7]/LEDG/PWM_ARD\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_GREEN_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_GREEN_INIT_GPIO_VALUE 1U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_GREEN_GPIO_PIN_MASK (1U << 7U) /*!<@brief GPIO pin mask */\n#define BOARD_INITLEDSPINS_LED_GREEN_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_GREEN_PIN 7U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_GREEN_PIN_MASK (1U << 7U)      /*!<@brief PORT pin mask */\n                                                              /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLEDsPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DIS_EN 0x00u    /*!<@brief Analog switch is closed (enabled), only for A0 version */\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_5 (number 88), S1/J10[1]/U3[12]/P17[8]/P7[7]/U11[4]/P0_5-ISP1\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_S1_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S1_GPIO_PIN_MASK (1U << 5U) /*!<@brief GPIO pin mask */\n#define BOARD_INITBUTTONSPINS_S1_PORT 0U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S1_PIN 5U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_S1_PIN_MASK (1U << 5U)      /*!<@brief PORT pin mask */\n                                                          /* @} */\n\n/*! @name PIO1_18 (number 64), S2/P18[16]/P24[2]/WAKE/GPIO\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_S2_GPIO GPIO                 /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S2_GPIO_PIN_MASK (1U << 18U) /*!<@brief GPIO pin mask */\n#define BOARD_INITBUTTONSPINS_S2_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S2_PIN 18U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_S2_PIN_MASK (1U << 18U)      /*!<@brief PORT pin mask */\n                                                           /* @} */\n\n/*! @name PIO1_9 (number 10), S3/P18[1]/PIO1_9_GPIO_ARD\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_S3_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S3_GPIO_PIN_MASK (1U << 9U) /*!<@brief GPIO pin mask */\n#define BOARD_INITBUTTONSPINS_S3_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_S3_PIN 9U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_S3_PIN_MASK (1U << 9U)      /*!<@brief PORT pin mask */\n                                                          /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitBUTTONsPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins_Core0(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC1 0x01u         /*!<@brief Selects pin function 1 */\n#define IOCON_PIO_FUNC2 0x02u         /*!<@brief Selects pin function 2 */\n#define IOCON_PIO_FUNC5 0x05u         /*!<@brief Selects pin function 5 */\n#define IOCON_PIO_FUNC7 0x07u         /*!<@brief Selects pin function 7 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_20 (number 4), P17[1]/P24[5]/FC4_I2C_SCL_ARD\n  @{ */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_21 (number 30), P17[3]/P24[6]/FC4_I2C_SDA_ARD\n  @{ */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_31 (number 91), P19[7]/P19[8]/PLU_IN0/GPIO\n  @{ */\n#define BOARD_INITI2SPINS_MCLK_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_MCLK_PIN 31U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_MCLK_PIN_MASK (1U << 31U)      /*!<@brief PORT pin mask */\n                                                         /* @} */\n\n/*! @name PIO0_21 (number 76), P17[14]/FC7_I2S_SCK\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO0_20 (number 74), P17[10]/FC7_I2S_TX\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO0_19 (number 90), P17[12]/FC7_I2S_WS\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PIN 19U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PIN_MASK (1U << 19U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO0_10 (number 21), U14[12]/SWO_TRGT\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PIN 10U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PIN_MASK (1U << 10U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_13 (number 2), P17[20]/FC6_I2S_RX\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PIN 13U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PIN_MASK (1U << 13U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO1_16 (number 87), P18[17]/SD1_PWR_EN\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PIN 16U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PIN_MASK (1U << 16U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitI2SPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DI 0x00u        /*!<@brief Analog switch is open (disabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_FUNC5 0x05u         /*!<@brief Selects pin function 5 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_21 (number 30), P17[3]/P24[6]/FC4_I2C_SDA_ARD\n  @{ */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name PIO1_20 (number 4), P17[1]/P24[5]/FC4_I2C_SCL_ARD\n  @{ */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name PIO1_19 (number 58), U7[3]/P18[14]/PLU_OUT1/GPIO\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITACCELPINS_ACCL_INTR_GPIO GPIO                 /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITACCELPINS_ACCL_INTR_GPIO_PIN_MASK (1U << 19U) /*!<@brief GPIO pin mask */\n#define BOARD_INITACCELPINS_ACCL_INTR_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_ACCL_INTR_PIN 19U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_ACCL_INTR_PIN_MASK (1U << 19U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitACCELPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake",
    "content": "set(MCU_VARIANT LPC55S69)\nset(MCU_CORE LPC55S69_cm33_core0)\n\nset(JLINK_DEVICE LPC55S69_M33_0)\nset(JLINK_OPTION \"-USB 000727648789\")\n\nset(PYOCD_TARGET LPC55S69)\nset(NXPLINK_DEVICE LPC55S69:LPCXpresso55S69)\n\n# device highspeed, host fullspeed\nset(RHPORT_DEVICE 1)\nset(RHPORT_HOST 0)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_LPC55S69JBD100_cm33_core0\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: LPCXpresso55s69\n   url: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/lpcxpresso-boards/lpcxpresso55s69-development-board:LPC55S69-EVK\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED: use red LED from generated pin_mux\n#define LED_PORT              BOARD_INITLEDSPINS_LED_RED_PORT\n#define LED_PIN               BOARD_INITLEDSPINS_LED_RED_PIN\n#define LED_STATE_ON          0\n\n// WAKE button: use S2 from generated pin_mux\n#define BUTTON_PORT           BOARD_INITBUTTONSPINS_S2_PORT\n#define BUTTON_PIN            BOARD_INITBUTTONSPINS_S2_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART0\n\n// XTAL\n#define XTAL0_CLK_HZ          (16 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/lpcxpresso55s69/board.mk",
    "content": "MCU_VARIANT = LPC55S69\nMCU_CORE = LPC55S69_cm33_core0\n\n# device highspeed, host fullspeed\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nCFLAGS += -DCPU_LPC55S69JBD100_cm33_core0\n\nSRC_C += \\\n\t$(TOP)/$(BOARD_PATH)/board/clock_config.c \\\n\t$(TOP)/$(BOARD_PATH)/board/pin_mux.c \\\n\t$(TOP)/$(BOARD_PATH)/board/peripherals.c\n\nINC += $(TOP)/$(BOARD_PATH)/board\n\nJLINK_DEVICE = LPC55S69\nPYOCD_TARGET = LPC55S69\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board/clock_config.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to set up clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up wait states of the flash.\n *\n * 3. Set up all dividers.\n *\n * 4. Set up all selectors to provide selected clocks.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v18.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_power.h\"\n#include \"fsl_clock.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockPLL150M();\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO12M\noutputs:\n- {id: System_clock.outFreq, value: 12 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO12M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    POWER_SetVoltageForFreq(12000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(12000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO12M */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF96M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFROHF96M\noutputs:\n- {id: System_clock.outFreq, value: 96 MHz}\nsettings:\n- {id: ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG, value: Enable}\n- {id: SYSCON.MAINCLKSELA.sel, value: ANACTRL.fro_hf_clk}\nsources:\n- {id: ANACTRL.fro_hf.outFreq, value: 96 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFROHF96M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    CLOCK_SetupFROClocking(96000000U);                   /* Enable FRO HF(96MHz) output */\n\n    POWER_SetVoltageForFreq(96000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(96000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO_HF */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL100M\noutputs:\n- {id: System_clock.outFreq, value: 100 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: ENABLE_CLKIN_ENA, value: Enabled}\n- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}\n- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL0_BYPASS}\n- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL0M_MULT.scale, value: '100', locked: true}\n- {id: SYSCON.PLL0N_DIV.scale, value: '4', locked: true}\n- {id: SYSCON.PLL0_PDEC.scale, value: '4', locked: true}\nsources:\n- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL100M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    /*!< Configure XTAL32M */\n    POWER_DisablePD(kPDRUNCFG_PD_XTAL32M);                        /* Ensure XTAL32M is powered */\n    POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M);                       /* Ensure XTAL32M is powered */\n    CLOCK_SetupExtClocking(16000000U);                            /* Enable clk_in clock */\n    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;       /* Enable clk_in from XTAL32M clock  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;    /* Enable clk_in to system  */\n\n    POWER_SetVoltageForFreq(100000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(100000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up PLL */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL0);                    /*!< Switch PLL0CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0);                  /* Ensure PLL is on  */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(26U),\n        .pllndec = SYSCON_PLL0NDEC_NDIV(4U),\n        .pllpdec = SYSCON_PLL0PDEC_PDIV(2U),\n        .pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(100U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},\n        .pllRate = 100000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL0_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL0 */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL100M_CORE_CLOCK;\n#endif\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL150M\ncalled_from_default_init: true\noutputs:\n- {id: FXCOM0_clock.outFreq, value: 48 MHz}\n- {id: System_clock.outFreq, value: 144 MHz}\n- {id: USB0_clock.outFreq, value: 48 MHz}\n- {id: USB1_PHY_clock.outFreq, value: 16 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: PLL1_Mode, value: Normal}\n- {id: ENABLE_CLKIN_ENA, value: Enabled}\n- {id: ENABLE_PLL_USB_OUT, value: Enabled}\n- {id: ENABLE_SYSTEM_CLK_OUT, value: Enabled}\n- {id: SYSCON.FCCLKSEL0.sel, value: SYSCON.PLL0DIV}\n- {id: SYSCON.FRGCTRL0_DIV.scale, value: '400'}\n- {id: SYSCON.MAINCLKSELB.sel, value: SYSCON.PLL1_BYPASS}\n- {id: SYSCON.PLL0CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL0DIV.scale, value: '2'}\n- {id: SYSCON.PLL0M_MULT.scale, value: '150', locked: true}\n- {id: SYSCON.PLL0N_DIV.scale, value: '8', locked: true}\n- {id: SYSCON.PLL0_PDEC.scale, value: '2', locked: true}\n- {id: SYSCON.PLL1CLKSEL.sel, value: SYSCON.CLK_IN_EN}\n- {id: SYSCON.PLL1M_MULT.scale, value: '18'}\n- {id: SYSCON.PLL1_PDEC.scale, value: '2'}\n- {id: SYSCON.USB0CLKDIV.scale, value: '3'}\n- {id: SYSCON.USB0CLKSEL.sel, value: SYSCON.MAINCLKSELB}\nsources:\n- {id: SYSCON.XTAL32M.outFreq, value: 16 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL150M(void)\n{\n#ifndef SDK_SECONDARY_CORE\n    /*!< Set up the clock sources */\n    /*!< Configure FRO192M */\n    POWER_DisablePD(kPDRUNCFG_PD_FRO192M);               /*!< Ensure FRO is on  */\n    CLOCK_SetupFROClocking(12000000U);                   /*!< Set up FRO to the 12 MHz, just for sure */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                /*!< Switch to FRO 12MHz first to ensure we can change the clock setting */\n\n    /*!< Configure XTAL32M */\n    POWER_DisablePD(kPDRUNCFG_PD_XTAL32M);                        /* Ensure XTAL32M is powered */\n    POWER_DisablePD(kPDRUNCFG_PD_LDOXO32M);                       /* Ensure XTAL32M is powered */\n    CLOCK_SetupExtClocking(16000000U);                            /* Enable clk_in clock */\n    SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK;       /* Enable clk_in from XTAL32M clock  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_SYSTEM_CLK_OUT_MASK;    /* Enable clk_in to system  */\n    ANACTRL->XO32M_CTRL |= ANACTRL_XO32M_CTRL_ENABLE_PLL_USB_OUT_MASK;       /* Enable clk_in to HS USB  */\n\n    POWER_SetVoltageForFreq(144000000U);                  /*!< Set voltage for the one of the fastest clock outputs: System clock output */\n    CLOCK_SetFLASHAccessCyclesForFreq(144000000U);          /*!< Set FLASH wait states for core */\n\n    /*!< Set up PLL */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL0);                    /*!< Switch PLL0CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0);                  /* Ensure PLL is on  */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL0_SSCG);\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SYSCON_PLL0CTRL_CLKEN_MASK | SYSCON_PLL0CTRL_SELI(53U) | SYSCON_PLL0CTRL_SELP(31U),\n        .pllndec = SYSCON_PLL0NDEC_NDIV(8U),\n        .pllpdec = SYSCON_PLL0PDEC_PDIV(1U),\n        .pllsscg = {0x0U,(SYSCON_PLL0SSCG1_MDIV_EXT(150U) | SYSCON_PLL0SSCG1_SEL_EXT_MASK)},\n        .pllRate = 150000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n\n    /*!< Set up PLL1 */\n    CLOCK_AttachClk(kEXT_CLK_to_PLL1);                    /*!< Switch PLL1CLKSEL to EXT_CLK */\n    POWER_DisablePD(kPDRUNCFG_PD_PLL1);                  /* Ensure PLL is on  */\n    const pll_setup_t pll1Setup = {\n        .pllctrl = SYSCON_PLL1CTRL_CLKEN_MASK | SYSCON_PLL1CTRL_SELI(11U) | SYSCON_PLL1CTRL_SELP(5U),\n        .pllndec = SYSCON_PLL1NDEC_NDIV(1U),\n        .pllpdec = SYSCON_PLL1PDEC_PDIV(1U),\n        .pllmdec = SYSCON_PLL1MDEC_MDIV(18U),\n        .pllRate = 144000000U,\n        .flags =  PLL_SETUPFLAG_WAITLOCK\n    };\n    CLOCK_SetPLL1Freq(&pll1Setup);                        /*!< Configure PLL1 to the desired values */\n\n    /*!< Set up dividers */\n    #if FSL_CLOCK_DRIVER_VERSION >= MAKE_VERSION(2, 3, 4)\n      CLOCK_SetClkDiv(kCLOCK_DivFlexFrg0, 144U, false);         /*!< Set DIV to value 0xFF and MULT to value 144U in related FLEXFRGCTRL register */\n    #else\n      CLOCK_SetClkDiv(kCLOCK_DivFlexFrg0, 37120U, false);         /*!< Set DIV to value 0xFF and MULT to value 144U in related FLEXFRGCTRL register */\n    #endif\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U, false);         /*!< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 0U, true);               /*!< Reset USB0CLKDIV divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 3U, false);         /*!< Set USB0CLKDIV divider to value 3 */\n    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 0U, true);               /*!< Reset PLL0DIV divider counter and halt it */\n    CLOCK_SetClkDiv(kCLOCK_DivPll0Clk, 2U, false);         /*!< Set PLL0DIV divider to value 2 */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL1_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL1 */\n    CLOCK_AttachClk(kMAIN_CLK_to_USB0_CLK);                 /*!< Switch USB0_CLK to MAIN_CLK */\n    CLOCK_AttachClk(kPLL0_DIV_to_FLEXCOMM0);                 /*!< Switch FLEXCOMM0 to PLL0_DIV */\n\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;\n#endif\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board/clock_config.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         16000000U  /*!< Board xtal frequency in Hz */\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32K frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK           12000000U  /*!< Core clock frequency: 12000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO12M_ASYNCADC_CLOCK          0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO12M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER3_CLOCK           0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER4_CLOCK           0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM0_CLOCK            0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM1_CLOCK            0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM2_CLOCK            0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM3_CLOCK            0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM4_CLOCK            0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM5_CLOCK            0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM6_CLOCK            0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKFRO12M_FXCOM7_CLOCK            0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKFRO12M_HSLSPI_CLOCK            0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKFRO12M_MCLK_CLOCK              0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_OSC32KHZ_CLOCK          0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFRO12M_OSTIMER32KHZ_CLOCK      0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKFRO12M_PLUCLKIN_CLOCK          0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_PLU_GLITCH_12MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_PLU_GLITCH_1MHZ_CLOCK   0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFRO12M_RTC1HZ_CLOCK            0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_RTC1KHZ_CLOCK           0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SCT_CLOCK               0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKFRO12M_SDIO_CLOCK              0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKFRO12M_SYSTICK0_CLOCK          0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SYSTICK1_CLOCK          0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SYSTEM_CLOCK            12000000UL     /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKFRO12M_TRACE_CLOCK             0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO12M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKFRO12M_USB1_PHY_CLOCK          0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFRO12M_UTICK_CLOCK             0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO12M_WDT_CLOCK               0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO12M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF96M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFROHF96M_CORE_CLOCK         96000000U  /*!< Core clock frequency: 96000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFROHF96M_ASYNCADC_CLOCK        0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFROHF96M_CLKOUT_CLOCK          0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER0_CLOCK         0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER1_CLOCK         0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER2_CLOCK         0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER3_CLOCK         0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKFROHF96M_CTIMER4_CLOCK         0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM0_CLOCK          0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM1_CLOCK          0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM2_CLOCK          0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM3_CLOCK          0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM4_CLOCK          0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM5_CLOCK          0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM6_CLOCK          0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKFROHF96M_FXCOM7_CLOCK          0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKFROHF96M_HSLSPI_CLOCK          0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKFROHF96M_MCLK_CLOCK            0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_OSC32KHZ_CLOCK        0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFROHF96M_OSTIMER32KHZ_CLOCK    0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKFROHF96M_PLUCLKIN_CLOCK        0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_PLU_GLITCH_12MHZ_CLOCK 0UL           /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_PLU_GLITCH_1MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKFROHF96M_RTC1HZ_CLOCK          0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_RTC1KHZ_CLOCK         0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SCT_CLOCK             0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKFROHF96M_SDIO_CLOCK            0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTICK0_CLOCK        0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTICK1_CLOCK        0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKFROHF96M_SYSTEM_CLOCK          96000000UL     /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKFROHF96M_TRACE_CLOCK           0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFROHF96M_USB0_CLOCK            0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKFROHF96M_USB1_PHY_CLOCK        0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKFROHF96M_UTICK_CLOCK           0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFROHF96M_WDT_CLOCK             0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockFROHF96M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFROHF96M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL100M_CORE_CLOCK         100000000U  /*!< Core clock frequency: 100000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKPLL100M_ASYNCADC_CLOCK         0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKPLL100M_CLKOUT_CLOCK           0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER0_CLOCK          0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER1_CLOCK          0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER2_CLOCK          0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER3_CLOCK          0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKPLL100M_CTIMER4_CLOCK          0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM0_CLOCK           0UL            /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM1_CLOCK           0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM2_CLOCK           0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM3_CLOCK           0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM4_CLOCK           0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM5_CLOCK           0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM6_CLOCK           0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKPLL100M_FXCOM7_CLOCK           0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKPLL100M_HSLSPI_CLOCK           0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKPLL100M_MCLK_CLOCK             0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_OSC32KHZ_CLOCK         0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL100M_OSTIMER32KHZ_CLOCK     0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKPLL100M_PLUCLKIN_CLOCK         0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_PLU_GLITCH_12MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_PLU_GLITCH_1MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL100M_RTC1HZ_CLOCK           0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_RTC1KHZ_CLOCK          0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SCT_CLOCK              0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKPLL100M_SDIO_CLOCK             0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKPLL100M_SYSTICK0_CLOCK         0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SYSTICK1_CLOCK         0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL100M_SYSTEM_CLOCK           100000000UL    /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKPLL100M_TRACE_CLOCK            0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKPLL100M_USB0_CLOCK             0UL            /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKPLL100M_USB1_PHY_CLOCK         0UL            /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL100M_UTICK_CLOCK            0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKPLL100M_WDT_CLOCK              0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL100M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL150M_CORE_CLOCK         144000000U  /*!< Core clock frequency: 144000000Hz */\n\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKPLL150M_ASYNCADC_CLOCK         0UL            /* Clock consumers of ASYNCADC_clock output : ADC0 */\n#define BOARD_BOOTCLOCKPLL150M_CLKOUT_CLOCK           0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER0_CLOCK          0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER1_CLOCK          0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER2_CLOCK          0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER3_CLOCK          0UL            /* Clock consumers of CTIMER3_clock output : CTIMER3 */\n#define BOARD_BOOTCLOCKPLL150M_CTIMER4_CLOCK          0UL            /* Clock consumers of CTIMER4_clock output : CTIMER4 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM0_CLOCK           48000000UL     /* Clock consumers of FXCOM0_clock output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM1_CLOCK           0UL            /* Clock consumers of FXCOM1_clock output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM2_CLOCK           0UL            /* Clock consumers of FXCOM2_clock output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM3_CLOCK           0UL            /* Clock consumers of FXCOM3_clock output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM4_CLOCK           0UL            /* Clock consumers of FXCOM4_clock output : FLEXCOMM4 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM5_CLOCK           0UL            /* Clock consumers of FXCOM5_clock output : FLEXCOMM5 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM6_CLOCK           0UL            /* Clock consumers of FXCOM6_clock output : FLEXCOMM6 */\n#define BOARD_BOOTCLOCKPLL150M_FXCOM7_CLOCK           0UL            /* Clock consumers of FXCOM7_clock output : FLEXCOMM7 */\n#define BOARD_BOOTCLOCKPLL150M_HSLSPI_CLOCK           0UL            /* Clock consumers of HSLSPI_clock output : FLEXCOMM8 */\n#define BOARD_BOOTCLOCKPLL150M_MCLK_CLOCK             0UL            /* Clock consumers of MCLK_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_OSC32KHZ_CLOCK         0UL            /* Clock consumers of OSC32KHZ_clock output : FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL150M_OSTIMER32KHZ_CLOCK     0UL            /* Clock consumers of OSTIMER32KHZ_clock output : OSTIMER */\n#define BOARD_BOOTCLOCKPLL150M_PLUCLKIN_CLOCK         0UL            /* Clock consumers of PLUCLKIN_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_PLU_GLITCH_12MHZ_CLOCK 0UL            /* Clock consumers of PLU_GLITCH_12MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_PLU_GLITCH_1MHZ_CLOCK  0UL            /* Clock consumers of PLU_GLITCH_1MHz_clock output : PLU */\n#define BOARD_BOOTCLOCKPLL150M_RTC1HZ_CLOCK           0UL            /* Clock consumers of RTC1HZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_RTC1KHZ_CLOCK          0UL            /* Clock consumers of RTC1KHZ_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SCT_CLOCK              0UL            /* Clock consumers of SCT_clock output : SCT0 */\n#define BOARD_BOOTCLOCKPLL150M_SDIO_CLOCK             0UL            /* Clock consumers of SDIO_clock output : SDIF */\n#define BOARD_BOOTCLOCKPLL150M_SYSTICK0_CLOCK         0UL            /* Clock consumers of SYSTICK0_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SYSTICK1_CLOCK         0UL            /* Clock consumers of SYSTICK1_clock output : N/A */\n#define BOARD_BOOTCLOCKPLL150M_SYSTEM_CLOCK           144000000UL    /* Clock consumers of System_clock output : ADC0, ANACTRL, CASPER, CRC_ENGINE, CTIMER0, CTIMER1, CTIMER2, CTIMER3, CTIMER4, DMA0, DMA1, FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM4, FLEXCOMM5, FLEXCOMM6, FLEXCOMM7, FLEXCOMM8, GINT0, GINT1, GPIO, INPUTMUX, IOCON, MAILBOX, MRT0, OSTIMER, PINT, PLU, PUF, SCT0, SDIF, SECGPIO, SECPINT, SWD, SYSCTL, USB0, USBFSH, USBHSD, USBHSH, USBPHY, UTICK0, WWDT */\n#define BOARD_BOOTCLOCKPLL150M_TRACE_CLOCK            0UL            /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKPLL150M_USB0_CLOCK             48000000UL     /* Clock consumers of USB0_clock output : USB0, USBFSH */\n#define BOARD_BOOTCLOCKPLL150M_USB1_PHY_CLOCK         16000000UL     /* Clock consumers of USB1_PHY_clock output : USBHSD, USBHSH, USBPHY */\n#define BOARD_BOOTCLOCKPLL150M_UTICK_CLOCK            0UL            /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKPLL150M_WDT_CLOCK              0UL            /* Clock consumers of WDT_clock output : WWDT */\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL150M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board/peripherals.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Peripherals v15.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\nfunctionalGroups:\n- name: BOARD_InitPeripherals_cm33_core0\n  UUID: 61d0725d-b300-49cb-9c66-b5edfbf8ffc1\n  called_from_default_init: true\n  selectedCore: cm33_core0\n- name: BOARD_InitPeripherals_cm33_core1\n  UUID: e2041cd4-ebb6-45a5-807f-e0c2dc047d48\n  selectedCore: cm33_core1\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'system'\n- type_id: 'system'\n- global_system_definitions:\n  - user_definitions: ''\n  - user_includes: ''\n  - global_init: ''\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'uart_cmsis_common'\n- type_id: 'uart_cmsis_common'\n- global_USART_CMSIS_common:\n  - quick_selection: 'default'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ncomponent:\n- type: 'gpio_adapter_common'\n- type_id: 'gpio_adapter_common'\n- global_gpio_adapter_common:\n  - quick_selection: 'default'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/***********************************************************************************************************************\n * Included files\n **********************************************************************************************************************/\n#include \"peripherals.h\"\n\n/***********************************************************************************************************************\n * BOARD_InitPeripherals_cm33_core0 functional group\n **********************************************************************************************************************/\n/***********************************************************************************************************************\n * DEBUG_UART initialization code\n **********************************************************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ninstance:\n- name: 'DEBUG_UART'\n- type: 'flexcomm_usart'\n- mode: 'polling'\n- custom_name_enabled: 'true'\n- type_id: 'flexcomm_usart_2.2.0'\n- functional_group: 'BOARD_InitPeripherals_cm33_core0'\n- peripheral: 'FLEXCOMM0'\n- config_sets:\n  - usartConfig_t:\n    - usartConfig:\n      - clockSource: 'FXCOMFunctionClock'\n      - clockSourceFreq: 'ClocksTool_DefaultInit'\n      - baudRate_Bps: '115200'\n      - syncMode: 'kUSART_SyncModeDisabled'\n      - parityMode: 'kUSART_ParityDisabled'\n      - stopBitCount: 'kUSART_OneStopBit'\n      - bitCountPerChar: 'kUSART_8BitsPerChar'\n      - loopback: 'false'\n      - txWatermark: 'kUSART_TxFifo0'\n      - rxWatermark: 'kUSART_RxFifo1'\n      - enableRx: 'true'\n      - enableTx: 'true'\n      - clockPolarity: 'kUSART_RxSampleOnFallingEdge'\n      - enableContinuousSCLK: 'false'\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\nconst usart_config_t DEBUG_UART_config = {\n  .baudRate_Bps = 115200UL,\n  .syncMode = kUSART_SyncModeDisabled,\n  .parityMode = kUSART_ParityDisabled,\n  .stopBitCount = kUSART_OneStopBit,\n  .bitCountPerChar = kUSART_8BitsPerChar,\n  .loopback = false,\n  .txWatermark = kUSART_TxFifo0,\n  .rxWatermark = kUSART_RxFifo1,\n  .enableRx = true,\n  .enableTx = true,\n  .enableMode32k = false,\n  .clockPolarity = kUSART_RxSampleOnFallingEdge,\n  .enableContinuousSCLK = false\n};\n\nstatic void DEBUG_UART_init(void) {\n  /* Reset FLEXCOMM device */\n  RESET_PeripheralReset(kFC0_RST_SHIFT_RSTn);\n  USART_Init(DEBUG_UART_PERIPHERAL, &DEBUG_UART_config, DEBUG_UART_CLOCK_SOURCE);\n}\n\n/***********************************************************************************************************************\n * NVIC initialization code\n **********************************************************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\ninstance:\n- name: 'NVIC'\n- type: 'nvic'\n- mode: 'general'\n- custom_name_enabled: 'false'\n- type_id: 'nvic'\n- functional_group: 'BOARD_InitPeripherals_cm33_core0'\n- peripheral: 'NVIC'\n- config_sets:\n  - nvic:\n    - interrupt_table: []\n    - interrupts: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/* Empty initialization function (commented out)\nstatic void NVIC_init(void) {\n} */\n\n/***********************************************************************************************************************\n * Initialization functions\n **********************************************************************************************************************/\nvoid BOARD_InitPeripherals_cm33_core0(void)\n{\n  /* Initialize components */\n  DEBUG_UART_init();\n}\n\n/***********************************************************************************************************************\n * BOARD_InitBootPeripherals function\n **********************************************************************************************************************/\nvoid BOARD_InitBootPeripherals(void)\n{\n  BOARD_InitPeripherals_cm33_core0();\n}\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board/peripherals.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PERIPHERALS_H_\n#define _PERIPHERALS_H_\n\n/***********************************************************************************************************************\n * Included files\n **********************************************************************************************************************/\n#include \"fsl_common.h\"\n#include \"fsl_reset.h\"\n#include \"fsl_usart.h\"\n#include \"fsl_clock.h\"\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus */\n\n/***********************************************************************************************************************\n * Definitions\n **********************************************************************************************************************/\n/* Definitions for BOARD_InitPeripherals_cm33_core0 functional group */\n/* Definition of peripheral ID */\n#define DEBUG_UART_PERIPHERAL ((USART_Type *)FLEXCOMM0)\n/* Definition of the clock source frequency */\n#define DEBUG_UART_CLOCK_SOURCE 48000000UL\n\n/***********************************************************************************************************************\n * Global variables\n **********************************************************************************************************************/\nextern const usart_config_t DEBUG_UART_config;\n\n/***********************************************************************************************************************\n * Initialization functions\n **********************************************************************************************************************/\n\nvoid BOARD_InitPeripherals_cm33_core0(void);\n\n/***********************************************************************************************************************\n * BOARD_InitBootPeripherals function\n **********************************************************************************************************************/\nvoid BOARD_InitBootPeripherals(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif /* _PERIPHERALS_H_ */\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board/pin_mux.c",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: LPC55S69\npackage_id: LPC55S69JBD100\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: LPCXpresso55S69\nexpansion_headers:\n- id: lpc_style_arduino\n  name: LPCXpresso V3 (Arduino compatible)\n  connectors:\n  - id: C1\n    name: P16\n    pins:\n    - {id: 8, name: 3.3V, external_signal_types: power_supply_3.3V}\n    - {id: 10, name: RESET, pin_num: '32', pin_signal: RESETN}\n    - {id: 12, name: 3.3V, external_signal_types: power_supply_3.3V}\n    - {id: 14, name: 5V, external_signal_types: power_supply_5V}\n    - {id: 16, name: GND, external_signal_types: ground}\n    - {id: 18, name: GND, external_signal_types: ground}\n    - {id: 20, name: 5V, external_signal_types: power_supply_5V}\n  - id: C2\n    name: P17\n    pins:\n    - {id: 1, name: D15, pin_num: '4', pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2}\n    - {id: 3, name: D14, pin_num: '30', pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3}\n    - {id: 5, name: 3.3V, external_signal_types: power_supply_3.3V}\n    - {id: 6, pin_num: '93', pin_signal: PIO1_11/FC1_TXD_SCL_MISO_WS/CT_INP5/USB0_VBUS}\n    - {id: 7, name: GND, external_signal_types: ground}\n    - {id: 8, pin_num: '88', pin_signal: PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5}\n    - {id: 9, name: D13, pin_num: '61', pin_signal: PIO1_2/CTIMER0_MAT3/SCT_GPI6/HS_SPI_SCK/USB1_PORTPWRN/PLU_OUT5}\n    - {id: 10, pin_num: '74', pin_signal: PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS}\n    - {id: 11, name: D12, pin_num: '62', pin_signal: PIO1_3/SCT0_OUT4/HS_SPI_MISO/USB0_PORTPWRN/PLU_OUT6}\n    - {id: 12, pin_num: '90', pin_signal: PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19}\n    - {id: 13, name: D11, pin_num: '60', pin_signal: PIO0_26/FC2_RXD_SDA_MOSI_DATA/CLKOUT/CT_INP14/SCT0_OUT5/USB0_IDVALUE/FC0_SCK/HS_SPI_MOSI/SECURE_GPIO0_26}\n    - {id: 14, pin_num: '76', pin_signal: PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21}\n    - {id: 15, name: D10, pin_num: '59', pin_signal: PIO1_1/FC3_RXD_SDA_MOSI_DATA/CT_INP3/SCT_GPI5/HS_SPI_SSEL1/USB1_OVERCURRENTN/PLU_OUT4}\n    - {id: 16, pin_num: '85', pin_signal: PIO1_27/FC2_RTS_SCL_SSEL1/SD0_D4/CTIMER0_MAT3/CLKOUT/PLU_IN4}\n    - {id: 17, name: D9, pin_num: '31', pin_signal: PIO1_5/FC0_RXD_SDA_MOSI_DATA/SD0_D2/CTIMER2_MAT0/SCT_GPI0}\n    - {id: 18, pin_num: '73', pin_signal: PIO1_28/FC7_SCK/SD0_D5/CT_INP2/PLU_IN3}\n    - {id: 19, name: D8, pin_num: '24', pin_signal: PIO1_8/FC0_CTS_SDA_SSEL0/SD0_CLK/SCT0_OUT1/FC4_SSEL2/ADC0_4}\n    - {id: 20, pin_num: '2', pin_signal: PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N}\n  - id: C3\n    name: P18\n    pins:\n    - {id: 1, name: D7, pin_num: '10', pin_signal: PIO1_9/FC1_SCK/CT_INP4/SCT0_OUT2/FC4_CTS_SDA_SSEL0/ADC0_12}\n    - {id: 2, pin_num: '7', pin_signal: PIO0_1/FC3_CTS_SDA_SSEL0/CT_INP0/SCT_GPI1/SD1_CLK/CMP0_OUT/SECURE_GPIO0_1}\n    - {id: 3, name: D6, pin_num: '40', pin_signal: PIO1_10/FC1_RXD_SDA_MOSI_DATA/CTIMER1_MAT0/SCT0_OUT3}\n    - {id: 4, pin_num: '57', pin_signal: PIO1_14/UTICK_CAP2/CTIMER1_MAT2/FC5_CTS_SDA_SSEL0/USB0_LEDN/SD1_CMD/ACMP0_D}\n    - {id: 5, name: D5, pin_num: '1', pin_signal: PIO1_4/FC0_SCK/SD0_D0/CTIMER2_MAT1/SCT0_OUT0/FREQME_GPIO_CLK_A}\n    - {id: 6, pin_num: '77', pin_signal: PIO1_25/FC2_TXD_SCL_MISO_WS/SCT0_OUT2/SD1_D0/UTICK_CAP0/PLU_CLKIN}\n    - {id: 7, name: D4-LED_GREEN, pin_num: '9', pin_signal: PIO1_7/FC0_RTS_SCL_SSEL1/SD0_D1/CTIMER2_MAT2/SCT_GPI4}\n    - {id: 8, pin_num: '42', pin_signal: PIO1_23/FC2_SCK/SCT0_OUT0/SD1_D3/FC3_SSEL2/PLU_OUT5}\n    - {id: 10, pin_num: '3', pin_signal: PIO1_24/FC2_RXD_SDA_MOSI_DATA/SCT0_OUT1/SD1_D1/FC3_SSEL3/PLU_OUT6}\n    - {id: 11, name: D2, pin_num: '22', pin_signal: PIO0_15/FC6_CTS_SDA_SSEL0/UTICK_CAP2/CT_INP16/SCT0_OUT2/SD0_WR_PRT/SECURE_GPIO0_15/ADC0_2}\n    - {id: 12, pin_num: '82', pin_signal: PIO1_15/UTICK_CAP3/CT_INP7/FC5_RTS_SCL_SSEL1/FC4_RTS_SCL_SSEL1/SD1_D2}\n    - {id: 13, name: D1, pin_num: '27', pin_signal: PIO0_27/FC2_TXD_SCL_MISO_WS/CTIMER3_MAT2/SCT0_OUT6/FC7_RXD_SDA_MOSI_DATA/PLU_OUT0/SECURE_GPIO0_27}\n    - {id: 14, pin_num: '58', pin_signal: PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF}\n    - {id: 15, name: D0, pin_num: '3', pin_signal: PIO1_24/FC2_RXD_SDA_MOSI_DATA/SCT0_OUT1/SD1_D1/FC3_SSEL3/PLU_OUT6}\n    - {id: 16, pin_num: '64', pin_signal: PIO1_18/SD1_POW_EN/SCT0_OUT5/PLU_OUT0}\n    - {id: 17, pin_num: '87', pin_signal: PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD}\n    - {id: 18, pin_num: '68', pin_signal: PIO1_26/FC2_CTS_SDA_SSEL0/SCT0_OUT3/CT_INP3/UTICK_CAP1/HS_SPI_SSEL3/PLU_IN5}\n    - {id: 19, pin_num: '43', pin_signal: PIO1_17/FC6_RTS_SCL_SSEL1/SCT0_OUT4/SD1_CARD_INT_N/SD1_CARD_DET_N}\n    - {id: 20, pin_num: '56', pin_signal: PIO0_18/FC4_CTS_SDA_SSEL0/SD0_WR_PRT/CTIMER1_MAT0/SCT0_OUT1/PLU_IN3/SECURE_GPIO0_18/ACMP0_C}\n  - id: C4\n    name: P19\n    pins:\n    - {id: 2, name: A0, pin_num: '14', pin_signal: PIO0_16/FC4_TXD_SCL_MISO_WS/CLKOUT/CT_INP4/SECURE_GPIO0_16/ADC0_8}\n    - {id: 4, name: A1, pin_num: '20', pin_signal: PIO0_23/MCLK/CTIMER1_MAT2/CTIMER3_MAT3/SCT0_OUT4/FC0_CTS_SDA_SSEL0/SD1_D1/SECURE_GPIO0_23/ADC0_0}\n    - {id: 6, name: A2, pin_num: '54', pin_signal: PIO0_0/FC3_SCK/CTIMER0_MAT0/SCT_GPI0/SD1_CARD_INT_N/SECURE_GPIO0_0/ACMP0_A}\n    - {id: 7, pin_num: '91', pin_signal: PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0}\n    - {id: 8, name: A3, pin_num: '91', pin_signal: PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0}\n    - {id: 9, pin_num: '71', pin_signal: PIO0_13/FC1_CTS_SDA_SSEL0/UTICK_CAP0/CT_INP0/SCT_GPI0/FC1_RXD_SDA_MOSI_DATA/PLU_IN0/SECURE_GPIO0_13}\n    - {id: 10, name: A4, pin_num: '71', pin_signal: PIO0_13/FC1_CTS_SDA_SSEL0/UTICK_CAP0/CT_INP0/SCT_GPI0/FC1_RXD_SDA_MOSI_DATA/PLU_IN0/SECURE_GPIO0_13}\n    - {id: 11, pin_num: '72', pin_signal: PIO0_14/FC1_RTS_SCL_SSEL1/UTICK_CAP1/CT_INP1/SCT_GPI1/FC1_TXD_SCL_MISO_WS/PLU_IN1/SECURE_GPIO0_14}\n    - {id: 12, name: A5, pin_num: '72', pin_signal: PIO0_14/FC1_RTS_SCL_SSEL1/UTICK_CAP1/CT_INP1/SCT_GPI1/FC1_TXD_SCL_MISO_WS/PLU_IN1/SECURE_GPIO0_14}\npin_labels:\n- {pin_num: '7', pin_signal: PIO0_1/FC3_CTS_SDA_SSEL0/CT_INP0/SCT_GPI1/SD1_CLK/CMP0_OUT/SECURE_GPIO0_1, label: 'P18[2]/SD1_CLK', identifier: LED_RED}\n- {pin_num: '88', pin_signal: PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5, label: 'S1/J10[1]/U3[12]/P17[8]/P7[7]/U11[4]/P0_5-ISP1',\n  identifier: LED}\n- {pin_num: '11', pin_signal: PIO1_0/FC0_RTS_SCL_SSEL1/SD0_D3/CT_INP2/SCT_GPI4/PLU_OUT3/ADC0_11, label: 'U20[2]/SD0_D3', identifier: BUTTON}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_iocon.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitDEBUG_UARTPins();\n    BOARD_InitUSBPins();\n    BOARD_InitLEDsPins();\n    BOARD_InitBUTTONsPins();\n    BOARD_InitPins_Core0();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '92', peripheral: FLEXCOMM0, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '94', peripheral: FLEXCOMM0, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30, mode: inactive,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitDEBUG_UARTPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t DEBUG_UART_RX = (/* Pin is configured as FC0_RXD_SDA_MOSI_DATA */\n                                    IOCON_PIO_FUNC1 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN29 (coords: 92) is configured as FC0_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN, DEBUG_UART_RX);\n\n    const uint32_t DEBUG_UART_TX = (/* Pin is configured as FC0_TXD_SCL_MISO_WS */\n                                    IOCON_PIO_FUNC1 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN30 (coords: 94) is configured as FC0_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN, DEBUG_UART_TX);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSWD_DEBUGPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '13', peripheral: SWD, signal: SWCLK, pin_signal: PIO0_11/FC6_RXD_SDA_MOSI_DATA/CTIMER2_MAT2/FREQME_GPIO_CLK_A/SWCLK/SECURE_GPIO0_11/ADC0_9, mode: pullDown,\n    slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '12', peripheral: SWD, signal: SWDIO, pin_signal: PIO0_12/FC3_TXD_SCL_MISO_WS/SD1_BACKEND_PWR/FREQME_GPIO_CLK_B/SCT_GPI7/SD0_POW_EN/SWDIO/FC6_TXD_SCL_MISO_WS/SECURE_GPIO0_12/ADC0_10,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '21', peripheral: SWD, signal: SWO, pin_signal: PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1, identifier: DEBUG_SWD_SWO,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled, asw: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSWD_DEBUGPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitSWD_DEBUGPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t DEBUG_SWD_SWO = (/* Pin is configured as SWO */\n                                    IOCON_PIO_FUNC6 |\n                                    /* No addition pin function */\n                                    IOCON_PIO_MODE_INACT |\n                                    /* Standard mode, output slew rate control is enabled */\n                                    IOCON_PIO_SLEW_STANDARD |\n                                    /* Input function is not inverted */\n                                    IOCON_PIO_INV_DI |\n                                    /* Enables digital function */\n                                    IOCON_PIO_DIGITAL_EN |\n                                    /* Open drain is disabled */\n                                    IOCON_PIO_OPENDRAIN_DI |\n                                    /* Analog switch is open (disabled) */\n                                    IOCON_PIO_ASW_DI);\n    /* PORT0 PIN10 (coords: 21) is configured as SWO */\n    IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN, DEBUG_SWD_SWO);\n\n    if (Chip_GetVersion()==1)\n    {\n        const uint32_t DEBUG_SWD_SWDCLK = (/* Pin is configured as SWCLK */\n                                           IOCON_PIO_FUNC6 |\n                                           /* Selects pull-down function */\n                                           IOCON_PIO_MODE_PULLDOWN |\n                                           /* Standard mode, output slew rate control is enabled */\n                                           IOCON_PIO_SLEW_STANDARD |\n                                           /* Input function is not inverted */\n                                           IOCON_PIO_INV_DI |\n                                           /* Enables digital function */\n                                           IOCON_PIO_DIGITAL_EN |\n                                           /* Open drain is disabled */\n                                           IOCON_PIO_OPENDRAIN_DI |\n                                           /* Analog switch is closed (enabled) */\n                                           IOCON_PIO_ASW_EN);\n        /* PORT0 PIN11 (coords: 13) is configured as SWCLK */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN, DEBUG_SWD_SWDCLK);\n    }\n    else\n    {\n        const uint32_t DEBUG_SWD_SWDCLK = (/* Pin is configured as SWCLK */\n                                           IOCON_PIO_FUNC6 |\n                                           /* Selects pull-down function */\n                                           IOCON_PIO_MODE_PULLDOWN |\n                                           /* Standard mode, output slew rate control is enabled */\n                                           IOCON_PIO_SLEW_STANDARD |\n                                           /* Input function is not inverted */\n                                           IOCON_PIO_INV_DI |\n                                           /* Enables digital function */\n                                           IOCON_PIO_DIGITAL_EN |\n                                           /* Open drain is disabled */\n                                           IOCON_PIO_OPENDRAIN_DI |\n                                           /* Analog switch is closed (enabled), only for A0 version */\n                                           IOCON_PIO_ASW_DIS_EN);\n        /* PORT0 PIN11 (coords: 13) is configured as SWCLK */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN, DEBUG_SWD_SWDCLK);\n    }\n\n    if (Chip_GetVersion()==1)\n    {\n        const uint32_t DEBUG_SWD_SWDIO = (/* Pin is configured as SWDIO */\n                                          IOCON_PIO_FUNC6 |\n                                          /* Selects pull-up function */\n                                          IOCON_PIO_MODE_PULLUP |\n                                          /* Standard mode, output slew rate control is enabled */\n                                          IOCON_PIO_SLEW_STANDARD |\n                                          /* Input function is not inverted */\n                                          IOCON_PIO_INV_DI |\n                                          /* Enables digital function */\n                                          IOCON_PIO_DIGITAL_EN |\n                                          /* Open drain is disabled */\n                                          IOCON_PIO_OPENDRAIN_DI |\n                                          /* Analog switch is closed (enabled) */\n                                          IOCON_PIO_ASW_EN);\n        /* PORT0 PIN12 (coords: 12) is configured as SWDIO */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN, DEBUG_SWD_SWDIO);\n    }\n    else\n    {\n        const uint32_t DEBUG_SWD_SWDIO = (/* Pin is configured as SWDIO */\n                                          IOCON_PIO_FUNC6 |\n                                          /* Selects pull-up function */\n                                          IOCON_PIO_MODE_PULLUP |\n                                          /* Standard mode, output slew rate control is enabled */\n                                          IOCON_PIO_SLEW_STANDARD |\n                                          /* Input function is not inverted */\n                                          IOCON_PIO_INV_DI |\n                                          /* Enables digital function */\n                                          IOCON_PIO_DIGITAL_EN |\n                                          /* Open drain is disabled */\n                                          IOCON_PIO_OPENDRAIN_DI |\n                                          /* Analog switch is closed (enabled), only for A0 version */\n                                          IOCON_PIO_ASW_DIS_EN);\n        /* PORT0 PIN12 (coords: 12) is configured as SWDIO */\n        IOCON_PinMuxSet(IOCON, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN, DEBUG_SWD_SWDIO);\n    }\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitUSBPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '97', peripheral: USBFSH, signal: USB_DP, pin_signal: USB0_DP}\n  - {pin_num: '98', peripheral: USBFSH, signal: USB_DM, pin_signal: USB0_DM}\n  - {pin_num: '78', peripheral: USBFSH, signal: USB_VBUS, pin_signal: PIO0_22/FC6_TXD_SCL_MISO_WS/UTICK_CAP1/CT_INP15/SCT0_OUT3/USB0_VBUS/SD1_D0/PLU_OUT7/SECURE_GPIO0_22,\n    mode: inactive, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '35', peripheral: USBHSH, signal: USB_DM, pin_signal: USB1_DM}\n  - {pin_num: '34', peripheral: USBHSH, signal: USB_DP, pin_signal: USB1_DP}\n  - {pin_num: '36', peripheral: USBHSH, signal: USB_VBUS, pin_signal: USB1_VBUS}\n  - {pin_num: '65', peripheral: USBHSH, signal: USB_OVERCURRENTN, pin_signal: PIO1_30/FC7_TXD_SCL_MISO_WS/SD0_D7/SCT_GPI7/USB1_OVERCURRENTN/USB1_LEDN/PLU_IN1, mode: pullUp}\n  - {pin_num: '66', peripheral: USBFSH, signal: USB_OVERCURRENTN, pin_signal: PIO0_28/FC0_SCK/SD1_CMD/CT_INP11/SCT0_OUT7/USB0_OVERCURRENTN/PLU_OUT1/SECURE_GPIO0_28,\n    mode: pullUp}\n  - {pin_num: '67', peripheral: USBFSH, signal: USB_PORTPWRN, pin_signal: PIO1_12/FC6_SCK/CTIMER1_MAT1/USB0_PORTPWRN/HS_SPI_SSEL2, mode: pullUp}\n  - {pin_num: '80', peripheral: USBHSH, signal: USB_PORTPWRN, pin_signal: PIO1_29/FC7_RXD_SDA_MOSI_DATA/SD0_D6/SCT_GPI6/USB1_PORTPWRN/USB1_FRAME/PLU_IN2, mode: pullUp}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitUSBPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitUSBPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t USB0_VBUS = (/* Pin is configured as USB0_VBUS */\n                                IOCON_PIO_FUNC7 |\n                                /* No addition pin function */\n                                IOCON_PIO_MODE_INACT |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN22 (coords: 78) is configured as USB0_VBUS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITUSBPINS_USB0_VBUS_PORT, BOARD_INITUSBPINS_USB0_VBUS_PIN, USB0_VBUS);\n\n    IOCON->PIO[0][28] = ((IOCON->PIO[0][28] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT028 (pin 66) is configured as USB0_OVERCURRENTN. */\n                         | IOCON_PIO_FUNC(PIO0_28_FUNC_ALT7)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO0_28_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO0_28_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][12] = ((IOCON->PIO[1][12] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT112 (pin 67) is configured as USB0_PORTPWRN. */\n                         | IOCON_PIO_FUNC(PIO1_12_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_12_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_12_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][29] = ((IOCON->PIO[1][29] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT129 (pin 80) is configured as USB1_PORTPWRN. */\n                         | IOCON_PIO_FUNC(PIO1_29_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_29_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_29_DIGIMODE_DIGITAL));\n\n    IOCON->PIO[1][30] = ((IOCON->PIO[1][30] &\n                          /* Mask bits to zero which are setting */\n                          (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                         /* Selects pin function.\n                          * : PORT130 (pin 65) is configured as USB1_OVERCURRENTN. */\n                         | IOCON_PIO_FUNC(PIO1_30_FUNC_ALT4)\n\n                         /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                          * : Pull-up.\n                          * Pull-up resistor enabled. */\n                         | IOCON_PIO_MODE(PIO1_30_MODE_PULL_UP)\n\n                         /* Select Digital mode.\n                          * : Enable Digital mode.\n                          * Digital input is enabled. */\n                         | IOCON_PIO_DIGIMODE(PIO1_30_DIGIMODE_DIGITAL));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLEDsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '88', peripheral: GPIO, signal: 'PIO0, 5', pin_signal: PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5, direction: OUTPUT,\n    gpio_init_state: 'true', mode: pullUp}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLEDsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitLEDsPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO0 module */\n    CLOCK_EnableClock(kCLOCK_Gpio0);\n\n    gpio_pin_config_t LED_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO0_5 (pin 88)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_GPIO, BOARD_INITLEDSPINS_LED_PORT, BOARD_INITLEDSPINS_LED_PIN, &LED_config);\n\n    IOCON->PIO[0][5] = ((IOCON->PIO[0][5] &\n                         /* Mask bits to zero which are setting */\n                         (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                        /* Selects pin function.\n                         * : PORT05 (pin 88) is configured as PIO0_5. */\n                        | IOCON_PIO_FUNC(PIO0_5_FUNC_ALT0)\n\n                        /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                         * : Pull-up.\n                         * Pull-up resistor enabled. */\n                        | IOCON_PIO_MODE(PIO0_5_MODE_PULL_UP)\n\n                        /* Select Digital mode.\n                         * : Enable Digital mode.\n                         * Digital input is enabled. */\n                        | IOCON_PIO_DIGIMODE(PIO0_5_DIGIMODE_DIGITAL));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitBUTTONsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '32', peripheral: SYSCON, signal: RESET, pin_signal: RESETN}\n  - {pin_num: '11', peripheral: GPIO, signal: 'PIO1, 0', pin_signal: PIO1_0/FC0_RTS_SCL_SSEL1/SD0_D3/CT_INP2/SCT_GPI4/PLU_OUT3/ADC0_11, direction: INPUT, mode: pullUp}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBUTTONsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitBUTTONsPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t BUTTON_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_0 (pin 11)  */\n    GPIO_PinInit(BOARD_INITBUTTONSPINS_BUTTON_GPIO, BOARD_INITBUTTONSPINS_BUTTON_PORT, BOARD_INITBUTTONSPINS_BUTTON_PIN, &BUTTON_config);\n\n    if (Chip_GetVersion()==1)\n    {\n        IOCON->PIO[1][0] = ((IOCON->PIO[1][0] &\n                         /* Mask bits to zero which are setting */\n                         (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                        /* Selects pin function.\n                         * : PORT10 (pin 11) is configured as PIO1_0. */\n                        | IOCON_PIO_FUNC(PIO1_0_FUNC_ALT0)\n\n                        /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                         * : Pull-up.\n                         * Pull-up resistor enabled. */\n                        | IOCON_PIO_MODE(PIO1_0_MODE_PULL_UP)\n\n                        /* Select Digital mode.\n                         * : Enable Digital mode.\n                         * Digital input is enabled. */\n                        | IOCON_PIO_DIGIMODE(PIO1_0_DIGIMODE_DIGITAL));\n    }\n    else\n    {\n        IOCON->PIO[1][0] = ((IOCON->PIO[1][0] &\n                         /* Mask bits to zero which are setting */\n                         (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_MODE_MASK | IOCON_PIO_DIGIMODE_MASK)))\n\n                        /* Selects pin function.\n                         * : PORT10 (pin 11) is configured as PIO1_0. */\n                        | IOCON_PIO_FUNC(PIO1_0_FUNC_ALT0)\n\n                        /* Selects function mode (on-chip pull-up/pull-down resistor control).\n                         * : Pull-up.\n                         * Pull-up resistor enabled. */\n                        | IOCON_PIO_MODE(PIO1_0_MODE_PULL_UP)\n\n                        /* Select Digital mode.\n                         * : Enable Digital mode.\n                         * Digital input is enabled. */\n                        | IOCON_PIO_DIGIMODE(PIO1_0_DIGIMODE_DIGITAL));\n    }\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins_Core0:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list: []\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins_Core0\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitPins_Core0(void)\n{\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitI2SPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '4', peripheral: FLEXCOMM4, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '30', peripheral: FLEXCOMM4, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3, mode: pullUp,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '91', peripheral: SYSCON, signal: MCLK, pin_signal: PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0, mode: inactive, slew_rate: standard, invert: disabled,\n    open_drain: disabled}\n  - {pin_num: '76', peripheral: FLEXCOMM7, signal: SCK, pin_signal: PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '74', peripheral: FLEXCOMM7, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '90', peripheral: FLEXCOMM7, signal: TXD_SCL_MISO_WS, pin_signal: PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '21', peripheral: FLEXCOMM6, signal: SCK, pin_signal: PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1,\n    identifier: FC6_I2S_CLK, mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled, asw: enabled}\n  - {pin_num: '2', peripheral: FLEXCOMM6, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N,\n    mode: pullUp, slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '87', peripheral: FLEXCOMM6, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitI2SPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitI2SPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    const uint32_t FC6_I2S_CLK = (/* Pin is configured as FC6_SCK */\n                                  IOCON_PIO_FUNC1 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI |\n                                  /* Analog switch is closed (enabled) */\n                                  IOCON_PIO_ASW_EN);\n    /* PORT0 PIN10 (coords: 21) is configured as FC6_SCK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_CLK_PORT, BOARD_INITI2SPINS_FC6_I2S_CLK_PIN, FC6_I2S_CLK);\n\n    const uint32_t FC7_I2S_WS = (/* Pin is configured as FC7_TXD_SCL_MISO_WS */\n                                 IOCON_PIO_FUNC7 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN19 (coords: 90) is configured as FC7_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_WS_PORT, BOARD_INITI2SPINS_FC7_I2S_WS_PIN, FC7_I2S_WS);\n\n    const uint32_t FC7_I2S_TX = (/* Pin is configured as FC7_RXD_SDA_MOSI_DATA */\n                                 IOCON_PIO_FUNC7 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN20 (coords: 74) is configured as FC7_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_TX_PORT, BOARD_INITI2SPINS_FC7_I2S_TX_PIN, FC7_I2S_TX);\n\n    const uint32_t FC7_I2S_SCK = (/* Pin is configured as FC7_SCK */\n                                  IOCON_PIO_FUNC7 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT0 PIN21 (coords: 76) is configured as FC7_SCK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC7_I2S_SCK_PORT, BOARD_INITI2SPINS_FC7_I2S_SCK_PIN, FC7_I2S_SCK);\n\n    const uint32_t FC6_I2S_RX = (/* Pin is configured as FC6_RXD_SDA_MOSI_DATA */\n                                 IOCON_PIO_FUNC2 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN13 (coords: 2) is configured as FC6_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_RX_PORT, BOARD_INITI2SPINS_FC6_I2S_RX_PIN, FC6_I2S_RX);\n\n    const uint32_t FC6_I2S_WS = (/* Pin is configured as FC6_TXD_SCL_MISO_WS */\n                                 IOCON_PIO_FUNC2 |\n                                 /* Selects pull-up function */\n                                 IOCON_PIO_MODE_PULLUP |\n                                 /* Standard mode, output slew rate control is enabled */\n                                 IOCON_PIO_SLEW_STANDARD |\n                                 /* Input function is not inverted */\n                                 IOCON_PIO_INV_DI |\n                                 /* Enables digital function */\n                                 IOCON_PIO_DIGITAL_EN |\n                                 /* Open drain is disabled */\n                                 IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN16 (coords: 87) is configured as FC6_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC6_I2S_WS_PORT, BOARD_INITI2SPINS_FC6_I2S_WS_PIN, FC6_I2S_WS);\n\n    const uint32_t FC4_I2C_SCL = (/* Pin is configured as FC4_TXD_SCL_MISO_WS */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN20 (coords: 4) is configured as FC4_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC4_I2C_SCL_PORT, BOARD_INITI2SPINS_FC4_I2C_SCL_PIN, FC4_I2C_SCL);\n\n    const uint32_t FC4_I2C_SDA = (/* Pin is configured as FC4_RXD_SDA_MOSI_DATA */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_FC4_I2C_SDA_PORT, BOARD_INITI2SPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA);\n\n    const uint32_t MCLK = (/* Pin is configured as MCLK */\n                           IOCON_PIO_FUNC1 |\n                           /* No addition pin function */\n                           IOCON_PIO_MODE_INACT |\n                           /* Standard mode, output slew rate control is enabled */\n                           IOCON_PIO_SLEW_STANDARD |\n                           /* Input function is not inverted */\n                           IOCON_PIO_INV_DI |\n                           /* Enables digital function */\n                           IOCON_PIO_DIGITAL_EN |\n                           /* Open drain is disabled */\n                           IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN31 (coords: 91) is configured as MCLK */\n    IOCON_PinMuxSet(IOCON, BOARD_INITI2SPINS_MCLK_PORT, BOARD_INITI2SPINS_MCLK_PIN, MCLK);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitACCELPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '30', peripheral: FLEXCOMM4, signal: RXD_SDA_MOSI_DATA, pin_signal: PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3, mode: pullUp,\n    slew_rate: standard, invert: disabled, open_drain: disabled}\n  - {pin_num: '4', peripheral: FLEXCOMM4, signal: TXD_SCL_MISO_WS, pin_signal: PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2, mode: pullUp, slew_rate: standard,\n    invert: disabled, open_drain: disabled}\n  - {pin_num: '58', peripheral: GPIO, signal: 'PIO1, 19', pin_signal: PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF, direction: INPUT, mode: inactive,\n    slew_rate: standard, invert: disabled, open_drain: disabled, asw: disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitACCELPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 (Core #0) */\nvoid BOARD_InitACCELPins(void)\n{\n    /* Enables the clock for the I/O controller.: Enable Clock. */\n    CLOCK_EnableClock(kCLOCK_Iocon);\n\n    /* Enables the clock for the GPIO1 module */\n    CLOCK_EnableClock(kCLOCK_Gpio1);\n\n    gpio_pin_config_t ACCL_INTR_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO1_19 (pin 58)  */\n    GPIO_PinInit(BOARD_INITACCELPINS_ACCL_INTR_GPIO, BOARD_INITACCELPINS_ACCL_INTR_PORT, BOARD_INITACCELPINS_ACCL_INTR_PIN, &ACCL_INTR_config);\n\n    const uint32_t ACCL_INTR = (/* Pin is configured as PIO1_19 */\n                                IOCON_PIO_FUNC0 |\n                                /* No addition pin function */\n                                IOCON_PIO_MODE_INACT |\n                                /* Standard mode, output slew rate control is enabled */\n                                IOCON_PIO_SLEW_STANDARD |\n                                /* Input function is not inverted */\n                                IOCON_PIO_INV_DI |\n                                /* Enables digital function */\n                                IOCON_PIO_DIGITAL_EN |\n                                /* Open drain is disabled */\n                                IOCON_PIO_OPENDRAIN_DI |\n                                /* Analog switch is open (disabled) */\n                                IOCON_PIO_ASW_DI);\n    /* PORT1 PIN19 (coords: 58) is configured as PIO1_19 */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_ACCL_INTR_PORT, BOARD_INITACCELPINS_ACCL_INTR_PIN, ACCL_INTR);\n\n    const uint32_t FC4_I2C_SCL = (/* Pin is configured as FC4_TXD_SCL_MISO_WS */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN20 (coords: 4) is configured as FC4_TXD_SCL_MISO_WS */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SCL_PORT, BOARD_INITACCELPINS_FC4_I2C_SCL_PIN, FC4_I2C_SCL);\n\n    const uint32_t FC4_I2C_SDA = (/* Pin is configured as FC4_RXD_SDA_MOSI_DATA */\n                                  IOCON_PIO_FUNC5 |\n                                  /* Selects pull-up function */\n                                  IOCON_PIO_MODE_PULLUP |\n                                  /* Standard mode, output slew rate control is enabled */\n                                  IOCON_PIO_SLEW_STANDARD |\n                                  /* Input function is not inverted */\n                                  IOCON_PIO_INV_DI |\n                                  /* Enables digital function */\n                                  IOCON_PIO_DIGITAL_EN |\n                                  /* Open drain is disabled */\n                                  IOCON_PIO_OPENDRAIN_DI);\n    /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */\n    IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SDA_PORT, BOARD_INITACCELPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board/pin_mux.h",
    "content": "/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC1 0x01u         /*!<@brief Selects pin function 1 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_29 (number 92), P8[2]/U6[13]/FC0_USART_RXD\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN 29U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN_MASK (1U << 29U)\n/* @} */\n\n/*! @name PIO0_30 (number 94), P8[3]/U6[12]/FC0_USART_TXD\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN 30U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN_MASK (1U << 30U)\n/* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DI 0x00u        /*!<@brief Analog switch is open (disabled) */\n#define IOCON_PIO_ASW_DIS_EN 0x00u    /*!<@brief Analog switch is closed (enabled), only for A0 version */\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC6 0x06u         /*!<@brief Selects pin function 6 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLDOWN 0x10u /*!<@brief Selects pull-down function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO0_11 (number 13), U14[4]/SWDCLK_TRGT\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN 11U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN_MASK (1U << 11U)\n/* @} */\n\n/*! @name PIO0_12 (number 12), U15[4]/D7/P7[2]/IF_SWDIO\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN 12U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN_MASK (1U << 12U)\n/* @} */\n\n/*! @name PIO0_10 (number 21), U14[12]/SWO_TRGT\n  @{ */\n/*!\n * @brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PORT 0U\n/*!\n * @brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN 10U\n/*!\n * @brief PORT pin mask */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWO_PIN_MASK (1U << 10U)\n/* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSWD_DEBUGPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Enables digital function */\n#define IOCON_PIO_DIGITAL_EN 0x0100u\n/*!\n * @brief Selects pin function 7 */\n#define IOCON_PIO_FUNC7 0x07u\n/*!\n * @brief Input function is not inverted */\n#define IOCON_PIO_INV_DI 0x00u\n/*!\n * @brief No addition pin function */\n#define IOCON_PIO_MODE_INACT 0x00u\n/*!\n * @brief Open drain is disabled */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u\n/*!\n * @brief Standard mode, output slew rate control is enabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO0_28_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 7. */\n#define PIO0_28_FUNC_ALT7 0x07u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO0_28_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_12_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_12_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_12_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_29_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_29_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_29_MODE_PULL_UP 0x02u\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_30_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 4. */\n#define PIO1_30_FUNC_ALT4 0x04u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_30_MODE_PULL_UP 0x02u\n\n/*! @name PIO0_22 (number 78), P10[1]/USB0_VBUS\n  @{ */\n#define BOARD_INITUSBPINS_USB0_VBUS_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITUSBPINS_USB0_VBUS_PIN 22U                   /*!<@brief PORT pin number */\n#define BOARD_INITUSBPINS_USB0_VBUS_PIN_MASK (1U << 22U)      /*!<@brief PORT pin mask */\n                                                              /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitUSBPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO0_5_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 0. */\n#define PIO0_5_FUNC_ALT0 0x00u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO0_5_MODE_PULL_UP 0x02u\n\n/*! @name PIO0_5 (number 88), S1/J10[1]/U3[12]/P17[8]/P7[7]/U11[4]/P0_5-ISP1\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_INIT_GPIO_VALUE 1U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_GPIO_PIN_MASK (1U << 5U) /*!<@brief GPIO pin mask */\n#define BOARD_INITLEDSPINS_LED_PORT 0U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_PIN 5U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_PIN_MASK (1U << 5U)      /*!<@brief PORT pin mask */\n                                                        /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLEDsPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */\n#define PIO1_0_DIGIMODE_DIGITAL 0x01u\n/*!\n * @brief Selects pin function.: Alternative connection 0. */\n#define PIO1_0_FUNC_ALT0 0x00u\n/*!\n * @brief Selects function mode (on-chip pull-up/pull-down resistor control).: Pull-up. Pull-up resistor enabled. */\n#define PIO1_0_MODE_PULL_UP 0x02u\n\n/*! @name PIO1_0 (number 11), U20[2]/SD0_D3\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_BUTTON_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_BUTTON_GPIO_PIN_MASK (1U << 0U) /*!<@brief GPIO pin mask */\n#define BOARD_INITBUTTONSPINS_BUTTON_PORT 1U                  /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_BUTTON_PIN 0U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_BUTTON_PIN_MASK (1U << 0U)      /*!<@brief PORT pin mask */\n                                                              /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitBUTTONsPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins_Core0(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_EN 0x0400u      /*!<@brief Analog switch is closed (enabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC1 0x01u         /*!<@brief Selects pin function 1 */\n#define IOCON_PIO_FUNC2 0x02u         /*!<@brief Selects pin function 2 */\n#define IOCON_PIO_FUNC5 0x05u         /*!<@brief Selects pin function 5 */\n#define IOCON_PIO_FUNC7 0x07u         /*!<@brief Selects pin function 7 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_20 (number 4), P17[1]/P24[5]/FC4_I2C_SCL_ARD\n  @{ */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC4_I2C_SCL_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_21 (number 30), P17[3]/P24[6]/FC4_I2C_SDA_ARD\n  @{ */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC4_I2C_SDA_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_31 (number 91), P19[7]/P19[8]/PLU_IN0/GPIO\n  @{ */\n#define BOARD_INITI2SPINS_MCLK_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_MCLK_PIN 31U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_MCLK_PIN_MASK (1U << 31U)      /*!<@brief PORT pin mask */\n                                                         /* @} */\n\n/*! @name PIO0_21 (number 76), P17[14]/FC7_I2S_SCK\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_SCK_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO0_20 (number 74), P17[10]/FC7_I2S_TX\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_TX_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO0_19 (number 90), P17[12]/FC7_I2S_WS\n  @{ */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PIN 19U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC7_I2S_WS_PIN_MASK (1U << 19U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO0_10 (number 21), U14[12]/SWO_TRGT\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PORT 0U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PIN 10U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_CLK_PIN_MASK (1U << 10U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*! @name PIO1_13 (number 2), P17[20]/FC6_I2S_RX\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PIN 13U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_RX_PIN_MASK (1U << 13U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PIO1_16 (number 87), P18[17]/SD1_PWR_EN\n  @{ */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PIN 16U                   /*!<@brief PORT pin number */\n#define BOARD_INITI2SPINS_FC6_I2S_WS_PIN_MASK (1U << 16U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitI2SPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#define IOCON_PIO_ASW_DI 0x00u        /*!<@brief Analog switch is open (disabled) */\n#define IOCON_PIO_DIGITAL_EN 0x0100u  /*!<@brief Enables digital function */\n#define IOCON_PIO_FUNC0 0x00u         /*!<@brief Selects pin function 0 */\n#define IOCON_PIO_FUNC5 0x05u         /*!<@brief Selects pin function 5 */\n#define IOCON_PIO_INV_DI 0x00u        /*!<@brief Input function is not inverted */\n#define IOCON_PIO_MODE_INACT 0x00u    /*!<@brief No addition pin function */\n#define IOCON_PIO_MODE_PULLUP 0x20u   /*!<@brief Selects pull-up function */\n#define IOCON_PIO_OPENDRAIN_DI 0x00u  /*!<@brief Open drain is disabled */\n#define IOCON_PIO_SLEW_STANDARD 0x00u /*!<@brief Standard mode, output slew rate control is enabled */\n\n/*! @name PIO1_21 (number 30), P17[3]/P24[6]/FC4_I2C_SDA_ARD\n  @{ */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PIN 21U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_FC4_I2C_SDA_PIN_MASK (1U << 21U)      /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name PIO1_20 (number 4), P17[1]/P24[5]/FC4_I2C_SCL_ARD\n  @{ */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PIN 20U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_FC4_I2C_SCL_PIN_MASK (1U << 20U)      /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name PIO1_19 (number 58), U7[3]/P18[14]/PLU_OUT1/GPIO\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITACCELPINS_ACCL_INTR_GPIO GPIO                 /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITACCELPINS_ACCL_INTR_GPIO_PIN_MASK (1U << 19U) /*!<@brief GPIO pin mask */\n#define BOARD_INITACCELPINS_ACCL_INTR_PORT 1U                   /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITACCELPINS_ACCL_INTR_PIN 19U                   /*!<@brief PORT pin number */\n#define BOARD_INITACCELPINS_ACCL_INTR_PIN_MASK (1U << 19U)      /*!<@brief PORT pin mask */\n                                                                /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitACCELPins(void); /* Function assigned for the Cortex-M33 (Core #0) */\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board.cmake",
    "content": "set(MCU_VARIANT LPC55S69)\nset(MCU_CORE LPC55S69_cm33_core0)\n\nset(JLINK_DEVICE LPC55S69)\nset(PYOCD_TARGET LPC55S69)\nset(NXPLINK_DEVICE LPC55S69:LPCXpresso55S69)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_LPC55S69JBD64_cm33_core0\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MCU Link\n   url: https://www.nxp.com/design/design-center/software/development-software/mcuxpresso-software-and-tools-/mcu-link-debug-probe:MCU-LINK\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              BOARD_INITLEDSPINS_LED_PORT\n#define LED_PIN               BOARD_INITLEDSPINS_LED_PIN\n#define LED_STATE_ON          0\n\n// WAKE button (Dummy, use unused pin\n#define BUTTON_PORT           BOARD_INITBUTTONSPINS_BUTTON_PORT\n#define BUTTON_PIN            BOARD_INITBUTTONSPINS_BUTTON_PIN\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART0\n\n// XTAL\n#define XTAL0_CLK_HZ          (16 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/board.mk",
    "content": "MCU_VARIANT = LPC55S69\nMCU_CORE = LPC55S69_cm33_core0\nRHPORT_DEVICE ?= 1\n\nCFLAGS += -DCPU_LPC55S69JBD64_cm33_core0\n\nSRC_C += \\\n\t$(TOP)/$(BOARD_PATH)/board/clock_config.c \\\n\t$(TOP)/$(BOARD_PATH)/board/pin_mux.c \\\n\t$(TOP)/$(BOARD_PATH)/board/peripherals.c\n\nINC += $(TOP)/$(BOARD_PATH)/board\n\nJLINK_DEVICE = LPC55S69\nPYOCD_TARGET = LPC55S69\n\n# flash using pyocd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/lpc55/boards/mcu_link/mcu_link.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"LPCXpresso55S69\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19 http://mcuxpresso.nxp.com/XSD/mex_configuration_19.xsd\" uuid=\"acf73d26-2bf9-4855-b3be-26068672d98a\" version=\"19\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>LPC55S69</processor>\n      <package>LPC55S69JBD100</package>\n      <board>LPCXpresso55S69</board>\n      <board_revision>A2</board_revision>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"cm33_core0\">\n         <core name=\"Cortex-M33 (Core #0)\" id=\"cm33_core0\" description=\"\"/>\n         <core name=\"Cortex-M33 (Core #1)\" id=\"cm33_core1\" description=\"\"/>\n      </cores>\n      <description></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      <custom_copyright>\n         <text>/*\n * Copyright 2026 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n</text>\n         <enabled>true</enabled>\n      </custom_copyright>\n      <update_include_paths>true</update_include_paths>\n      <enable_parallel_routing>true</enable_parallel_routing>\n      <generate_registers_defines>false</generate_registers_defines>\n   </preferences>\n   <tools>\n      <pins name=\"Pins\" version=\"17.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>25.09.10</processor_version>\n            <pin_labels>\n               <pin_label pin_num=\"7\" pin_signal=\"PIO0_1/FC3_CTS_SDA_SSEL0/CT_INP0/SCT_GPI1/SD1_CLK/CMP0_OUT/SECURE_GPIO0_1\" label=\"P18[2]/SD1_CLK\" identifier=\"LED_RED\"/>\n               <pin_label pin_num=\"88\" pin_signal=\"PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5\" label=\"S1/J10[1]/U3[12]/P17[8]/P7[7]/U11[4]/P0_5-ISP1\" identifier=\"LED\"/>\n               <pin_label pin_num=\"11\" pin_signal=\"PIO1_0/FC0_RTS_SCL_SSEL1/SD0_D3/CT_INP2/SCT_GPI4/PLU_OUT3/ADC0_11\" label=\"U20[2]/SD0_D3\" identifier=\"BUTTON\"/>\n            </pin_labels>\n            <expansion_headers>\n               <expansion_header id=\"lpc_style_arduino\" name=\"LPCXpresso V3 (Arduino compatible)\">\n                  <connectors>\n                     <connector id=\"C1\" name=\"P16\">\n                        <pins>\n                           <pin id=\"8\" external_signal_types=\"power_supply_3.3V\" name=\"3.3V\"/>\n                           <pin id=\"10\" pin_num=\"32\" pin_signal=\"RESETN\" name=\"RESET\"/>\n                           <pin id=\"12\" external_signal_types=\"power_supply_3.3V\" name=\"3.3V\"/>\n                           <pin id=\"14\" external_signal_types=\"power_supply_5V\" name=\"5V\"/>\n                           <pin id=\"16\" external_signal_types=\"ground\" name=\"GND\"/>\n                           <pin id=\"18\" external_signal_types=\"ground\" name=\"GND\"/>\n                           <pin id=\"20\" external_signal_types=\"power_supply_5V\" name=\"5V\"/>\n                        </pins>\n                     </connector>\n                     <connector id=\"C2\" name=\"P17\">\n                        <pins>\n                           <pin id=\"1\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\" name=\"D15\"/>\n                           <pin id=\"3\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\" name=\"D14\"/>\n                           <pin id=\"5\" external_signal_types=\"power_supply_3.3V\" name=\"3.3V\"/>\n                           <pin id=\"6\" pin_num=\"93\" pin_signal=\"PIO1_11/FC1_TXD_SCL_MISO_WS/CT_INP5/USB0_VBUS\"/>\n                           <pin id=\"7\" external_signal_types=\"ground\" name=\"GND\"/>\n                           <pin id=\"8\" pin_num=\"88\" pin_signal=\"PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5\"/>\n                           <pin id=\"9\" pin_num=\"61\" pin_signal=\"PIO1_2/CTIMER0_MAT3/SCT_GPI6/HS_SPI_SCK/USB1_PORTPWRN/PLU_OUT5\" name=\"D13\"/>\n                           <pin id=\"10\" pin_num=\"74\" pin_signal=\"PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS\"/>\n                           <pin id=\"11\" pin_num=\"62\" pin_signal=\"PIO1_3/SCT0_OUT4/HS_SPI_MISO/USB0_PORTPWRN/PLU_OUT6\" name=\"D12\"/>\n                           <pin id=\"12\" pin_num=\"90\" pin_signal=\"PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19\"/>\n                           <pin id=\"13\" pin_num=\"60\" pin_signal=\"PIO0_26/FC2_RXD_SDA_MOSI_DATA/CLKOUT/CT_INP14/SCT0_OUT5/USB0_IDVALUE/FC0_SCK/HS_SPI_MOSI/SECURE_GPIO0_26\" name=\"D11\"/>\n                           <pin id=\"14\" pin_num=\"76\" pin_signal=\"PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21\"/>\n                           <pin id=\"15\" pin_num=\"59\" pin_signal=\"PIO1_1/FC3_RXD_SDA_MOSI_DATA/CT_INP3/SCT_GPI5/HS_SPI_SSEL1/USB1_OVERCURRENTN/PLU_OUT4\" name=\"D10\"/>\n                           <pin id=\"16\" pin_num=\"85\" pin_signal=\"PIO1_27/FC2_RTS_SCL_SSEL1/SD0_D4/CTIMER0_MAT3/CLKOUT/PLU_IN4\"/>\n                           <pin id=\"17\" pin_num=\"31\" pin_signal=\"PIO1_5/FC0_RXD_SDA_MOSI_DATA/SD0_D2/CTIMER2_MAT0/SCT_GPI0\" name=\"D9\"/>\n                           <pin id=\"18\" pin_num=\"73\" pin_signal=\"PIO1_28/FC7_SCK/SD0_D5/CT_INP2/PLU_IN3\"/>\n                           <pin id=\"19\" pin_num=\"24\" pin_signal=\"PIO1_8/FC0_CTS_SDA_SSEL0/SD0_CLK/SCT0_OUT1/FC4_SSEL2/ADC0_4\" name=\"D8\"/>\n                           <pin id=\"20\" pin_num=\"2\" pin_signal=\"PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N\"/>\n                        </pins>\n                     </connector>\n                     <connector id=\"C3\" name=\"P18\">\n                        <pins>\n                           <pin id=\"1\" pin_num=\"10\" pin_signal=\"PIO1_9/FC1_SCK/CT_INP4/SCT0_OUT2/FC4_CTS_SDA_SSEL0/ADC0_12\" name=\"D7\"/>\n                           <pin id=\"2\" pin_num=\"7\" pin_signal=\"PIO0_1/FC3_CTS_SDA_SSEL0/CT_INP0/SCT_GPI1/SD1_CLK/CMP0_OUT/SECURE_GPIO0_1\"/>\n                           <pin id=\"3\" pin_num=\"40\" pin_signal=\"PIO1_10/FC1_RXD_SDA_MOSI_DATA/CTIMER1_MAT0/SCT0_OUT3\" name=\"D6\"/>\n                           <pin id=\"4\" pin_num=\"57\" pin_signal=\"PIO1_14/UTICK_CAP2/CTIMER1_MAT2/FC5_CTS_SDA_SSEL0/USB0_LEDN/SD1_CMD/ACMP0_D\"/>\n                           <pin id=\"5\" pin_num=\"1\" pin_signal=\"PIO1_4/FC0_SCK/SD0_D0/CTIMER2_MAT1/SCT0_OUT0/FREQME_GPIO_CLK_A\" name=\"D5\"/>\n                           <pin id=\"6\" pin_num=\"77\" pin_signal=\"PIO1_25/FC2_TXD_SCL_MISO_WS/SCT0_OUT2/SD1_D0/UTICK_CAP0/PLU_CLKIN\"/>\n                           <pin id=\"7\" pin_num=\"9\" pin_signal=\"PIO1_7/FC0_RTS_SCL_SSEL1/SD0_D1/CTIMER2_MAT2/SCT_GPI4\" name=\"D4-LED_GREEN\"/>\n                           <pin id=\"8\" pin_num=\"42\" pin_signal=\"PIO1_23/FC2_SCK/SCT0_OUT0/SD1_D3/FC3_SSEL2/PLU_OUT5\"/>\n                           <pin id=\"10\" pin_num=\"3\" pin_signal=\"PIO1_24/FC2_RXD_SDA_MOSI_DATA/SCT0_OUT1/SD1_D1/FC3_SSEL3/PLU_OUT6\"/>\n                           <pin id=\"11\" pin_num=\"22\" pin_signal=\"PIO0_15/FC6_CTS_SDA_SSEL0/UTICK_CAP2/CT_INP16/SCT0_OUT2/SD0_WR_PRT/SECURE_GPIO0_15/ADC0_2\" name=\"D2\"/>\n                           <pin id=\"12\" pin_num=\"82\" pin_signal=\"PIO1_15/UTICK_CAP3/CT_INP7/FC5_RTS_SCL_SSEL1/FC4_RTS_SCL_SSEL1/SD1_D2\"/>\n                           <pin id=\"13\" pin_num=\"27\" pin_signal=\"PIO0_27/FC2_TXD_SCL_MISO_WS/CTIMER3_MAT2/SCT0_OUT6/FC7_RXD_SDA_MOSI_DATA/PLU_OUT0/SECURE_GPIO0_27\" name=\"D1\"/>\n                           <pin id=\"14\" pin_num=\"58\" pin_signal=\"PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF\"/>\n                           <pin id=\"15\" pin_num=\"3\" pin_signal=\"PIO1_24/FC2_RXD_SDA_MOSI_DATA/SCT0_OUT1/SD1_D1/FC3_SSEL3/PLU_OUT6\" name=\"D0\"/>\n                           <pin id=\"16\" pin_num=\"64\" pin_signal=\"PIO1_18/SD1_POW_EN/SCT0_OUT5/PLU_OUT0\"/>\n                           <pin id=\"17\" pin_num=\"87\" pin_signal=\"PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD\"/>\n                           <pin id=\"18\" pin_num=\"68\" pin_signal=\"PIO1_26/FC2_CTS_SDA_SSEL0/SCT0_OUT3/CT_INP3/UTICK_CAP1/HS_SPI_SSEL3/PLU_IN5\"/>\n                           <pin id=\"19\" pin_num=\"43\" pin_signal=\"PIO1_17/FC6_RTS_SCL_SSEL1/SCT0_OUT4/SD1_CARD_INT_N/SD1_CARD_DET_N\"/>\n                           <pin id=\"20\" pin_num=\"56\" pin_signal=\"PIO0_18/FC4_CTS_SDA_SSEL0/SD0_WR_PRT/CTIMER1_MAT0/SCT0_OUT1/PLU_IN3/SECURE_GPIO0_18/ACMP0_C\"/>\n                        </pins>\n                     </connector>\n                     <connector id=\"C4\" name=\"P19\">\n                        <pins>\n                           <pin id=\"2\" pin_num=\"14\" pin_signal=\"PIO0_16/FC4_TXD_SCL_MISO_WS/CLKOUT/CT_INP4/SECURE_GPIO0_16/ADC0_8\" name=\"A0\"/>\n                           <pin id=\"4\" pin_num=\"20\" pin_signal=\"PIO0_23/MCLK/CTIMER1_MAT2/CTIMER3_MAT3/SCT0_OUT4/FC0_CTS_SDA_SSEL0/SD1_D1/SECURE_GPIO0_23/ADC0_0\" name=\"A1\"/>\n                           <pin id=\"6\" pin_num=\"54\" pin_signal=\"PIO0_0/FC3_SCK/CTIMER0_MAT0/SCT_GPI0/SD1_CARD_INT_N/SECURE_GPIO0_0/ACMP0_A\" name=\"A2\"/>\n                           <pin id=\"7\" pin_num=\"91\" pin_signal=\"PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0\"/>\n                           <pin id=\"8\" pin_num=\"91\" pin_signal=\"PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0\" name=\"A3\"/>\n                           <pin id=\"9\" pin_num=\"71\" pin_signal=\"PIO0_13/FC1_CTS_SDA_SSEL0/UTICK_CAP0/CT_INP0/SCT_GPI0/FC1_RXD_SDA_MOSI_DATA/PLU_IN0/SECURE_GPIO0_13\"/>\n                           <pin id=\"10\" pin_num=\"71\" pin_signal=\"PIO0_13/FC1_CTS_SDA_SSEL0/UTICK_CAP0/CT_INP0/SCT_GPI0/FC1_RXD_SDA_MOSI_DATA/PLU_IN0/SECURE_GPIO0_13\" name=\"A4\"/>\n                           <pin id=\"11\" pin_num=\"72\" pin_signal=\"PIO0_14/FC1_RTS_SCL_SSEL1/UTICK_CAP1/CT_INP1/SCT_GPI1/FC1_TXD_SCL_MISO_WS/PLU_IN1/SECURE_GPIO0_14\"/>\n                           <pin id=\"12\" pin_num=\"72\" pin_signal=\"PIO0_14/FC1_RTS_SCL_SSEL1/UTICK_CAP1/CT_INP1/SCT_GPI1/FC1_TXD_SCL_MISO_WS/PLU_IN1/SECURE_GPIO0_14\" name=\"A5\"/>\n                        </pins>\n                     </connector>\n                  </connectors>\n               </expansion_header>\n            </expansion_headers>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM0\" description=\"Peripheral FLEXCOMM0 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM0\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"92\" pin_signal=\"PIO0_29/FC0_RXD_SDA_MOSI_DATA/SD1_D2/CTIMER2_MAT3/SCT0_OUT8/CMP0_OUT/PLU_OUT2/SECURE_GPIO0_29\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM0\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"94\" pin_signal=\"PIO0_30/FC0_TXD_SCL_MISO_WS/SD1_D3/CTIMER0_MAT0/SCT0_OUT9/SECURE_GPIO0_30\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSWD_DEBUGPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SWD\" description=\"Peripheral SWD signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SWD\" signal=\"SWCLK\" pin_num=\"13\" pin_signal=\"PIO0_11/FC6_RXD_SDA_MOSI_DATA/CTIMER2_MAT2/FREQME_GPIO_CLK_A/SWCLK/SECURE_GPIO0_11/ADC0_9\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullDown\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWDIO\" pin_num=\"12\" pin_signal=\"PIO0_12/FC3_TXD_SCL_MISO_WS/SD1_BACKEND_PWR/FREQME_GPIO_CLK_B/SCT_GPI7/SD0_POW_EN/SWDIO/FC6_TXD_SCL_MISO_WS/SECURE_GPIO0_12/ADC0_10\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWO\" pin_num=\"21\" pin_signal=\"PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"DEBUG_SWD_SWO\"/>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitUSBPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USBFSH\" description=\"Peripheral USBFSH signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"USBHSH\" description=\"Peripheral USBHSH signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitUSBPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_DP\" pin_num=\"97\" pin_signal=\"USB0_DP\"/>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_DM\" pin_num=\"98\" pin_signal=\"USB0_DM\"/>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_VBUS\" pin_num=\"78\" pin_signal=\"PIO0_22/FC6_TXD_SCL_MISO_WS/UTICK_CAP1/CT_INP15/SCT0_OUT3/USB0_VBUS/SD1_D0/PLU_OUT7/SECURE_GPIO0_22\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_DM\" pin_num=\"35\" pin_signal=\"USB1_DM\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_DP\" pin_num=\"34\" pin_signal=\"USB1_DP\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_VBUS\" pin_num=\"36\" pin_signal=\"USB1_VBUS\"/>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_OVERCURRENTN\" pin_num=\"65\" pin_signal=\"PIO1_30/FC7_TXD_SCL_MISO_WS/SD0_D7/SCT_GPI7/USB1_OVERCURRENTN/USB1_LEDN/PLU_IN1\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_OVERCURRENTN\" pin_num=\"66\" pin_signal=\"PIO0_28/FC0_SCK/SD1_CMD/CT_INP11/SCT0_OUT7/USB0_OVERCURRENTN/PLU_OUT1/SECURE_GPIO0_28\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBFSH\" signal=\"USB_PORTPWRN\" pin_num=\"67\" pin_signal=\"PIO1_12/FC6_SCK/CTIMER1_MAT1/USB0_PORTPWRN/HS_SPI_SSEL2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"USBHSH\" signal=\"USB_PORTPWRN\" pin_num=\"80\" pin_signal=\"PIO1_29/FC7_RXD_SDA_MOSI_DATA/SD0_D6/SCT_GPI6/USB1_PORTPWRN/USB1_FRAME/PLU_IN2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLEDsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO\" signal=\"PIO0, 5\" pin_num=\"88\" pin_signal=\"PIO0_5/FC4_RXD_SDA_MOSI_DATA/CTIMER3_MAT0/SCT_GPI5/FC3_RTS_SCL_SSEL1/MCLK/SECURE_GPIO0_5\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitBUTTONsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SYSCON\" description=\"Peripheral SYSCON signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SYSCON\" signal=\"RESET\" pin_num=\"32\" pin_signal=\"RESETN\"/>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 0\" pin_num=\"11\" pin_signal=\"PIO1_0/FC0_RTS_SCL_SSEL1/SD0_D3/CT_INP2/SCT_GPI4/PLU_OUT3/ADC0_11\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitPins_Core0\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins_Core0\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins/>\n            </function>\n            <function name=\"BOARD_InitPins_Core1\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core1</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitPins_Core1\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins/>\n            </function>\n            <function name=\"BOARD_InitI2SPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM4\" description=\"Peripheral FLEXCOMM4 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SYSCON\" description=\"Peripheral SYSCON signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM7\" description=\"Peripheral FLEXCOMM7 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM6\" description=\"Peripheral FLEXCOMM6 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitI2SPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SYSCON\" signal=\"MCLK\" pin_num=\"91\" pin_signal=\"PIO1_31/MCLK/SD1_CLK/CTIMER0_MAT2/SCT0_OUT6/PLU_IN0\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"SCK\" pin_num=\"76\" pin_signal=\"PIO0_21/FC3_RTS_SCL_SSEL1/UTICK_CAP3/CTIMER3_MAT3/SCT_GPI3/FC7_SCK/PLU_CLKIN/SECURE_GPIO0_21\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"74\" pin_signal=\"PIO0_20/FC3_CTS_SDA_SSEL0/CTIMER1_MAT1/CT_INP15/SCT_GPI2/FC7_RXD_SDA_MOSI_DATA/HS_SPI_SSEL0/PLU_IN5/SECURE_GPIO0_20/FC4_TXD_SCL_MISO_WS\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM7\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"90\" pin_signal=\"PIO0_19/FC4_RTS_SCL_SSEL1/UTICK_CAP0/CTIMER0_MAT2/SCT0_OUT2/FC7_TXD_SCL_MISO_WS/PLU_IN4/SECURE_GPIO0_19\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"SCK\" pin_num=\"21\" pin_signal=\"PIO0_10/FC6_SCK/CT_INP10/CTIMER2_MAT0/FC1_TXD_SCL_MISO_WS/SCT0_OUT2/SWO/SECURE_GPIO0_10/ADC0_1\">\n                     <pin_features>\n                        <pin_feature name=\"identifier\" value=\"FC6_I2S_CLK\"/>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"enabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"2\" pin_signal=\"PIO1_13/FC6_RXD_SDA_MOSI_DATA/CT_INP6/USB0_OVERCURRENTN/USB0_FRAME/SD0_CARD_DET_N\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM6\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"87\" pin_signal=\"PIO1_16/FC6_TXD_SCL_MISO_WS/CTIMER1_MAT3/SD0_CMD\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitACCELPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"FLEXCOMM4\" description=\"Peripheral FLEXCOMM4 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_gpio\" description=\"Pins initialization requires the LPC_GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.lpc_iocon\" description=\"Pins initialization requires the LPC_IOCON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitACCELPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"RXD_SDA_MOSI_DATA\" pin_num=\"30\" pin_signal=\"PIO1_21/FC7_CTS_SDA_SSEL0/CTIMER3_MAT2/FC4_RXD_SDA_MOSI_DATA/PLU_OUT3\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"FLEXCOMM4\" signal=\"TXD_SCL_MISO_WS\" pin_num=\"4\" pin_signal=\"PIO1_20/FC7_RTS_SCL_SSEL1/CT_INP14/FC4_TXD_SCL_MISO_WS/PLU_OUT2\">\n                     <pin_features>\n                        <pin_feature name=\"mode\" value=\"pullUp\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO\" signal=\"PIO1, 19\" pin_num=\"58\" pin_signal=\"PIO1_19/SCT0_OUT7/CTIMER3_MAT1/SCT_GPI7/FC4_SCK/PLU_OUT1/ACMPVREF\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"INPUT\"/>\n                        <pin_feature name=\"mode\" value=\"inactive\"/>\n                        <pin_feature name=\"slew_rate\" value=\"standard\"/>\n                        <pin_feature name=\"invert\" value=\"disabled\"/>\n                        <pin_feature name=\"open_drain\" value=\"disabled\"/>\n                        <pin_feature name=\"asw\" value=\"disabled\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"18.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>25.09.10</processor_version>\n         </clocks_profile>\n         <clock_configurations>\n            <clock_configuration name=\"BOARD_BootClockFRO12M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources/>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings/>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockFROHF96M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockFROHF96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"ANACTRL.fro_hf.outFreq\" value=\"96 MHz\" locked=\"false\" enabled=\"false\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"ANALOG_CONTROL_FRO192M_CTRL_ENDI_FRO_96M_CFG\" value=\"Enable\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELA.sel\" value=\"ANACTRL.fro_hf_clk\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockPLL100M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL100M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL100M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SYSCON.XTAL32M.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"System_clock.outFreq\" value=\"100 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL0_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"ENABLE_CLKIN_ENA\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_SYSTEM_CLK_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELB.sel\" value=\"SYSCON.PLL0_BYPASS\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0M_MULT.scale\" value=\"100\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0N_DIV.scale\" value=\"4\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0_PDEC.scale\" value=\"4\" locked=\"true\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockPLL150M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALIN\" description=\"&apos;XTALIN&apos; (Pins tool id: SYSCON.XTALIN, Clocks tool id: SYSCON.XTALIN) needs to have &apos;INPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>INPUT</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PinSignal\" resourceId=\"SYSCON.XTALOUT\" description=\"&apos;XTALOUT&apos; (Pins tool id: SYSCON.XTALOUT, Clocks tool id: SYSCON.XTALOUT) needs to have &apos;OUTPUT&apos; direction\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockPLL150M\">\n                     <feature name=\"direction\" evaluation=\"\">\n                        <data>OUTPUT</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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core1\">\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_BootClockPLL150M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SYSCON.XTAL32M.outFreq\" value=\"16 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"FXCOM0_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"144 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB0_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"USB1_PHY_clock.outFreq\" value=\"16 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"PLL0_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"PLL1_Mode\" value=\"Normal\" locked=\"false\"/>\n                  <setting id=\"ENABLE_CLKIN_ENA\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_PLL_USB_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"ENABLE_SYSTEM_CLK_OUT\" value=\"Enabled\" locked=\"false\"/>\n                  <setting id=\"SYSCON.FCCLKSEL0.sel\" value=\"SYSCON.PLL0DIV\" locked=\"false\"/>\n                  <setting id=\"SYSCON.FRGCTRL0_DIV.scale\" value=\"400\" locked=\"false\"/>\n                  <setting id=\"SYSCON.MAINCLKSELB.sel\" value=\"SYSCON.PLL1_BYPASS\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0DIV.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL0M_MULT.scale\" value=\"150\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0N_DIV.scale\" value=\"8\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL0_PDEC.scale\" value=\"2\" locked=\"true\"/>\n                  <setting id=\"SYSCON.PLL1CLKSEL.sel\" value=\"SYSCON.CLK_IN_EN\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL1M_MULT.scale\" value=\"18\" locked=\"false\"/>\n                  <setting id=\"SYSCON.PLL1_PDEC.scale\" value=\"2\" locked=\"false\"/>\n                  <setting id=\"SYSCON.USB0CLKDIV.scale\" value=\"3\" locked=\"false\"/>\n                  <setting id=\"SYSCON.USB0CLKSEL.sel\" value=\"SYSCON.MAINCLKSELB\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"2.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <dcdx_profile>\n            <processor_version>0.0.0</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"15.0\" enabled=\"true\" update_project_code=\"true\">\n         <dependencies>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.flexcomm_usart\" description=\"FLEXCOMM USART Driver is not found in the toolchain/IDE project. The project will not compile!\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data type=\"Boolean\">true</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.flexcomm_usart\" description=\"An unsupported version of the FLEXCOMM USART Driver in the toolchain/IDE project. Required: ${required_value}, actual: ${actual_value}. The project might not compile correctly.\" problem_level=\"1\" source=\"Peripherals\">\n               <feature name=\"version\" evaluation=\"equivalent\">\n                  <data type=\"Version\">2.2.0</data>\n               </feature>\n            </dependency>\n            <dependency resourceType=\"Tool\" resourceId=\"Clocks\" description=\"The Clocks tool is required by the Peripherals tool, but it is disabled.\" problem_level=\"2\" source=\"Peripherals\">\n               <feature name=\"enabled\" evaluation=\"equal\">\n                  <data>true</data>\n               </feature>\n            </dependency>\n         </dependencies>\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>25.09.10</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals_cm33_core0\" uuid=\"61d0725d-b300-49cb-9c66-b5edfbf8ffc1\" called_from_default_init=\"true\" id_prefix=\"\" core=\"cm33_core0\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"ClockOutput\" resourceId=\"FXCOM0_clock\" description=\"FXCOM0 clock is inactive.\" problem_level=\"2\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"frequency\" evaluation=\"greaterThan\">\n                        <data type=\"Frequency\" unit=\"Hz\">0</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"FLEXCOMM0.usart_rxd\" description=\"Signal RX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"FLEXCOMM0.usart_txd\" description=\"Signal TX is not routed.\" problem_level=\"1\" source=\"Peripherals:BOARD_InitPeripherals_cm33_core0\">\n                     <feature name=\"routed\" evaluation=\"equal\">\n                        <data type=\"Boolean\">true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <instances>\n                  <instance name=\"ACCEL\" uuid=\"b999c56a-0d01-4089-9311-9224db5272f4\" type=\"flexcomm_i2c\" type_id=\"flexcomm_i2c_2.3.0\" mode=\"I2C_Polling\" peripheral=\"FLEXCOMM4\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"fsl_i2c\" quick_selection=\"QS_I2C_Master\">\n                        <setting name=\"i2c_mode\" value=\"kI2C_Master\"/>\n                        <setting name=\"clockSource\" value=\"FXCOMFunctionClock\"/>\n                        <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                        <struct name=\"i2c_master_config\">\n                           <setting name=\"enableMaster\" value=\"true\"/>\n                           <setting name=\"baudRate_Bps\" value=\"100000\"/>\n                           <setting name=\"enableTimeout\" value=\"false\"/>\n                           <setting name=\"timeout_Ms\" value=\"35\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"DEBUG_UART\" uuid=\"9fb0504c-6159-43e2-98bb-51d75f06133a\" type=\"flexcomm_usart\" type_id=\"flexcomm_usart_2.2.0\" mode=\"polling\" peripheral=\"FLEXCOMM0\" enabled=\"true\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"usartConfig_t\">\n                        <struct name=\"usartConfig\">\n                           <setting name=\"clockSource\" value=\"FXCOMFunctionClock\"/>\n                           <setting name=\"clockSourceFreq\" value=\"ClocksTool_DefaultInit\"/>\n                           <setting name=\"baudRate_Bps\" value=\"115200\"/>\n                           <setting name=\"syncMode\" value=\"kUSART_SyncModeDisabled\"/>\n                           <setting name=\"parityMode\" value=\"kUSART_ParityDisabled\"/>\n                           <setting name=\"stopBitCount\" value=\"kUSART_OneStopBit\"/>\n                           <setting name=\"bitCountPerChar\" value=\"kUSART_8BitsPerChar\"/>\n                           <setting name=\"loopback\" value=\"false\"/>\n                           <setting name=\"txWatermark\" value=\"kUSART_TxFifo0\"/>\n                           <setting name=\"rxWatermark\" value=\"kUSART_RxFifo1\"/>\n                           <setting name=\"enableRx\" value=\"true\"/>\n                           <setting name=\"enableTx\" value=\"true\"/>\n                           <setting name=\"clockPolarity\" value=\"kUSART_RxSampleOnFallingEdge\"/>\n                           <setting name=\"enableContinuousSCLK\" value=\"false\"/>\n                        </struct>\n                     </config_set>\n                  </instance>\n                  <instance name=\"LEDS\" uuid=\"f5ad3a56-404b-44cb-8abc-7b25b5551d33\" type=\"lpc_gpio\" type_id=\"lpc_gpio_2.1.1\" mode=\"GPIO\" peripheral=\"GPIO\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpc_gpio\"/>\n                  </instance>\n                  <instance name=\"SW\" uuid=\"d57ddfca-dc72-486c-a145-c7a2ab1e1a66\" type=\"lpc_gpio\" type_id=\"lpc_gpio_2.1.1\" mode=\"GPIO\" peripheral=\"GPIO\" enabled=\"false\" comment=\"\" custom_name_enabled=\"true\" editing_lock=\"false\">\n                     <config_set name=\"lpc_gpio\"/>\n                  </instance>\n                  <instance name=\"NVIC\" uuid=\"56761ad9-9b77-4074-917d-de0fde10cd48\" type=\"nvic\" type_id=\"nvic\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n            <functional_group name=\"BOARD_InitPeripherals_cm33_core1\" uuid=\"e2041cd4-ebb6-45a5-807f-e0c2dc047d48\" called_from_default_init=\"false\" id_prefix=\"\" core=\"cm33_core1\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"NVIC_2\" uuid=\"db546092-4c45-40af-938a-8cc58edd1c4f\" type=\"nvic\" type_id=\"nvic\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"905d2747-654a-47d9-91f9-81a5c6f9c407\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n                  <setting name=\"global_init\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"64cbcd7c-424d-4baf-9681-a60878969fb6\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"b9b018dd-ef4e-41f6-b456-f91b855cb391\" type_id=\"generic_can\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"bafa6375-9184-4272-8102-06ea086041d7\" type_id=\"uart_cmsis_common\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"1710dc7f-381f-4b37-8f78-0fd2f923b3ac\" type_id=\"generic_uart\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"c7fc4395-b141-4b13-a326-4145e765b2b7\" type_id=\"generic_enet\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"b6ee89c2-4c58-4181-94dc-af13d8ae8ea5\" type_id=\"gpio_adapter_common\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"10.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>0.0.0</processor_version>\n            <tool_options>\n               <option id=\"_output_type_\" value=\"c_code\"/>\n               <option id=\"_legacy_source_names_\" value=\"yes\"/>\n            </tool_options>\n         </tee_profile>\n         <functional_group name=\"BOARD_InitTrustZone\" called_from_default_init=\"true\" id_prefix=\"\" prefix_user_defined=\"true\">\n            <description></description>\n            <options/>\n            <ahb>\n               <relative_region start=\"0\" size=\"655360\" security=\"s_priv\" memory=\"PROGRAM_FLASH\"/>\n               <relative_region start=\"0\" size=\"131072\" security=\"s_priv\" memory=\"BootROM\"/>\n               <relative_region start=\"0\" size=\"32768\" security=\"s_priv\" memory=\"SRAMX\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM0\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM1\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM2\"/>\n               <relative_region start=\"0\" size=\"65536\" security=\"s_priv\" memory=\"SRAM3\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"SRAM4\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"AHBperipherals_port10_ahb_secure_ctrl_area\"/>\n               <relative_region start=\"0\" size=\"16384\" security=\"s_priv\" memory=\"USB_RAM\"/>\n               <masters>\n                  <master id=\"HASH\" security=\"ns_user\"/>\n                  <master id=\"MCM33C\" security=\"ns_user\"/>\n                  <master id=\"MCM33S\" security=\"ns_user\"/>\n                  <master id=\"PQ\" security=\"ns_user\"/>\n                  <master id=\"SDIO\" security=\"ns_user\"/>\n                  <master id=\"SDMA0\" security=\"ns_user\"/>\n                  <master id=\"SDMA1\" security=\"ns_user\"/>\n                  <master id=\"USBFSD\" security=\"ns_user\"/>\n                  <master id=\"USBFSH\" security=\"ns_user\"/>\n               </masters>\n               <peripherals>\n                  <peripheral id=\"ADC0\" security=\"s_priv\"/>\n                  <peripheral id=\"AHB_SECURE_CTRL\" security=\"s_priv\"/>\n                  <peripheral id=\"ANACTRL\" security=\"s_priv\"/>\n                  <peripheral id=\"CASPER\" security=\"s_priv\"/>\n                  <peripheral id=\"CRC_ENGINE\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER0\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER1\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER2\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER3\" security=\"s_priv\"/>\n                  <peripheral id=\"CTIMER4\" security=\"s_priv\"/>\n                  <peripheral id=\"DBGMAILBOX\" security=\"s_priv\"/>\n                  <peripheral id=\"DMA0\" security=\"s_priv\"/>\n                  <peripheral id=\"DMA1\" security=\"s_priv\"/>\n                  <peripheral id=\"FLASH\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM0\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM1\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM2\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM3\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM4\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM5\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM6\" security=\"s_priv\"/>\n                  <peripheral id=\"FLEXCOMM7\" security=\"s_priv\"/>\n                  <peripheral id=\"GINT0\" security=\"s_priv\"/>\n                  <peripheral id=\"GINT1\" security=\"s_priv\"/>\n                  <peripheral id=\"GPIO\" security=\"s_priv\"/>\n                  <peripheral id=\"HASHCRYPT\" security=\"s_priv\"/>\n                  <peripheral id=\"INPUTMUX\" security=\"s_priv\"/>\n                  <peripheral id=\"IOCON\" security=\"s_priv\"/>\n                  <peripheral id=\"MAILBOX\" security=\"s_priv\"/>\n                  <peripheral id=\"MRT0\" security=\"s_priv\"/>\n                  <peripheral id=\"OSTIMER\" security=\"s_priv\"/>\n                  <peripheral id=\"PINT\" security=\"s_priv\"/>\n                  <peripheral id=\"PLU\" security=\"s_priv\"/>\n                  <peripheral id=\"PMC\" security=\"s_priv\"/>\n                  <peripheral id=\"POWERQUAD\" security=\"s_priv\"/>\n                  <peripheral id=\"PRINCE\" security=\"s_priv\"/>\n                  <peripheral id=\"PUF\" security=\"s_priv\"/>\n                  <peripheral id=\"RNG\" security=\"s_priv\"/>\n                  <peripheral id=\"RTC\" security=\"s_priv\"/>\n                  <peripheral id=\"SCT0\" security=\"s_priv\"/>\n                  <peripheral id=\"SDIF\" security=\"s_priv\"/>\n                  <peripheral id=\"SECGPIO\" security=\"s_priv\"/>\n                  <peripheral id=\"SECPINT\" security=\"s_priv\"/>\n                  <peripheral id=\"SPI8\" security=\"s_priv\"/>\n                  <peripheral id=\"SYSCON\" security=\"s_priv\"/>\n                  <peripheral id=\"SYSCTL\" security=\"s_priv\"/>\n                  <peripheral id=\"USB0\" security=\"s_priv\"/>\n                  <peripheral id=\"USBFSH\" security=\"s_priv\"/>\n                  <peripheral id=\"USBHSD\" security=\"s_priv\"/>\n                  <peripheral id=\"USBHSH\" security=\"s_priv\"/>\n                  <peripheral id=\"USBPHY\" security=\"s_priv\"/>\n                  <peripheral id=\"UTICK0\" security=\"s_priv\"/>\n                  <peripheral id=\"WWDT\" security=\"s_priv\"/>\n               </peripherals>\n               <interrupts>\n                  <masking>\n                     <interrupt id=\"acmp_capt_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"adc_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"casper_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer2_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer3_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"ctimer4_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm2_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm3_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm4_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm5_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm6_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"flexcomm7_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"global_irq0\" masked=\"Masked\"/>\n                     <interrupt id=\"global_irq1\" masked=\"Masked\"/>\n                     <interrupt id=\"lspi_hs_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"mailbox_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"mrt_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"os_event_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int4\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int5\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int6\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_int7\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq0\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq1\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq2\" masked=\"Masked\"/>\n                     <interrupt id=\"pin_irq3\" masked=\"Masked\"/>\n                     <interrupt id=\"plu_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"pq_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"qddkey_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"rtc_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sct_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdio_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdma0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sdma1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_hypervisor_call_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_int0\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_int1\" masked=\"Masked\"/>\n                     <interrupt id=\"sec_vio_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sha_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"sys_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb0_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb0_needclk_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_needclk_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"usb1_utmi_irq\" masked=\"Masked\"/>\n                     <interrupt id=\"utick_irq\" masked=\"Masked\"/>\n                  </masking>\n                  <security>\n                     <interrupt id=\"acmp_capt_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"adc_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"casper_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer2_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer3_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"ctimer4_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm2_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm3_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm4_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm5_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm6_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"flexcomm7_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"global_irq0\" secure=\"Secure\"/>\n                     <interrupt id=\"global_irq1\" secure=\"Secure\"/>\n                     <interrupt id=\"lspi_hs_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"mailbox_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"mrt_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"os_event_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int4\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int5\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int6\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_int7\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq0\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq1\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq2\" secure=\"Secure\"/>\n                     <interrupt id=\"pin_irq3\" secure=\"Secure\"/>\n                     <interrupt id=\"plu_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"pq_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"qddkey_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"rtc_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sct_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdio_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdma0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sdma1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_hypervisor_call_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_int0\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_int1\" secure=\"Secure\"/>\n                     <interrupt id=\"sec_vio_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sha_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"sys_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb0_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb0_needclk_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_needclk_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"usb1_utmi_irq\" secure=\"Secure\"/>\n                     <interrupt id=\"utick_irq\" secure=\"Secure\"/>\n                  </security>\n               </interrupts>\n               <ports>\n                  <port id=\"pio0\">\n                     <pin_mask id=\"0\" masked=\"Masked\"/>\n                     <pin_mask id=\"1\" masked=\"Masked\"/>\n                     <pin_mask id=\"10\" masked=\"Masked\"/>\n                     <pin_mask id=\"11\" masked=\"Masked\"/>\n                     <pin_mask id=\"12\" masked=\"Masked\"/>\n                     <pin_mask id=\"13\" masked=\"Masked\"/>\n                     <pin_mask id=\"14\" masked=\"Masked\"/>\n                     <pin_mask id=\"15\" masked=\"Masked\"/>\n                     <pin_mask id=\"16\" masked=\"Masked\"/>\n                     <pin_mask id=\"17\" masked=\"Masked\"/>\n                     <pin_mask id=\"18\" masked=\"Masked\"/>\n                     <pin_mask id=\"19\" masked=\"Masked\"/>\n                     <pin_mask id=\"2\" masked=\"Masked\"/>\n                     <pin_mask id=\"20\" masked=\"Masked\"/>\n                     <pin_mask id=\"21\" masked=\"Masked\"/>\n                     <pin_mask id=\"22\" masked=\"Masked\"/>\n                     <pin_mask id=\"23\" masked=\"Masked\"/>\n                     <pin_mask id=\"24\" masked=\"Masked\"/>\n                     <pin_mask id=\"25\" masked=\"Masked\"/>\n                     <pin_mask id=\"26\" masked=\"Masked\"/>\n                     <pin_mask id=\"27\" masked=\"Masked\"/>\n                     <pin_mask id=\"28\" masked=\"Masked\"/>\n                     <pin_mask id=\"29\" masked=\"Masked\"/>\n                     <pin_mask id=\"3\" masked=\"Masked\"/>\n                     <pin_mask id=\"30\" masked=\"Masked\"/>\n                     <pin_mask id=\"31\" masked=\"Masked\"/>\n                     <pin_mask id=\"4\" masked=\"Masked\"/>\n                     <pin_mask id=\"5\" masked=\"Masked\"/>\n                     <pin_mask id=\"6\" masked=\"Masked\"/>\n                     <pin_mask id=\"7\" masked=\"Masked\"/>\n                     <pin_mask id=\"8\" masked=\"Masked\"/>\n                     <pin_mask id=\"9\" masked=\"Masked\"/>\n                  </port>\n                  <port id=\"pio1\">\n                     <pin_mask id=\"0\" masked=\"Masked\"/>\n                     <pin_mask id=\"1\" masked=\"Masked\"/>\n                     <pin_mask id=\"10\" masked=\"Masked\"/>\n                     <pin_mask id=\"11\" masked=\"Masked\"/>\n                     <pin_mask id=\"12\" masked=\"Masked\"/>\n                     <pin_mask id=\"13\" masked=\"Masked\"/>\n                     <pin_mask id=\"14\" masked=\"Masked\"/>\n                     <pin_mask id=\"15\" masked=\"Masked\"/>\n                     <pin_mask id=\"16\" masked=\"Masked\"/>\n                     <pin_mask id=\"17\" masked=\"Masked\"/>\n                     <pin_mask id=\"18\" masked=\"Masked\"/>\n                     <pin_mask id=\"19\" masked=\"Masked\"/>\n                     <pin_mask id=\"2\" masked=\"Masked\"/>\n                     <pin_mask id=\"20\" masked=\"Masked\"/>\n                     <pin_mask id=\"21\" masked=\"Masked\"/>\n                     <pin_mask id=\"22\" masked=\"Masked\"/>\n                     <pin_mask id=\"23\" masked=\"Masked\"/>\n                     <pin_mask id=\"24\" masked=\"Masked\"/>\n                     <pin_mask id=\"25\" masked=\"Masked\"/>\n                     <pin_mask id=\"26\" masked=\"Masked\"/>\n                     <pin_mask id=\"27\" masked=\"Masked\"/>\n                     <pin_mask id=\"28\" masked=\"Masked\"/>\n                     <pin_mask id=\"29\" masked=\"Masked\"/>\n                     <pin_mask id=\"3\" masked=\"Masked\"/>\n                     <pin_mask id=\"30\" masked=\"Masked\"/>\n                     <pin_mask id=\"31\" masked=\"Masked\"/>\n                     <pin_mask id=\"4\" masked=\"Masked\"/>\n                     <pin_mask id=\"5\" masked=\"Masked\"/>\n                     <pin_mask id=\"6\" masked=\"Masked\"/>\n                     <pin_mask id=\"7\" masked=\"Masked\"/>\n                     <pin_mask id=\"8\" masked=\"Masked\"/>\n                     <pin_mask id=\"9\" masked=\"Masked\"/>\n                  </port>\n               </ports>\n            </ahb>\n            <saus>\n               <sau enabled=\"true\" all_non_secure=\"false\" generate_code_for_disabled_regions=\"false\">\n                  <region start=\"0\" size=\"268435456\" security=\"ns\" enabled=\"true\" index=\"0\"/>\n                  <region start=\"536870912\" size=\"3221225472\" security=\"ns\" enabled=\"true\" index=\"1\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"2\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"3\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"4\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"5\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"6\"/>\n                  <region start=\"0\" size=\"32\" security=\"ns\" enabled=\"false\" index=\"7\"/>\n               </sau>\n            </saus>\n            <global_options>\n               <option id=\"AIRCR_PRIS\" value=\"no\"/>\n               <option id=\"AIRCR_BFHFNMINS\" value=\"no\"/>\n               <option id=\"AIRCR_SYSRESETREQS\" value=\"no\"/>\n               <option id=\"SCR_SLEEPDEEPS\" value=\"no\"/>\n               <option id=\"SHCSR_SECUREFAULTENA\" value=\"no\"/>\n               <option id=\"CPACR_CP0\" value=\"3\"/>\n               <option id=\"CPACR_CP1\" value=\"3\"/>\n               <option id=\"CPACR_CP2\" value=\"0\"/>\n               <option id=\"CPACR_CP3\" value=\"0\"/>\n               <option id=\"CPACR_CP4\" value=\"0\"/>\n               <option id=\"CPACR_CP5\" value=\"0\"/>\n               <option id=\"CPACR_CP6\" value=\"0\"/>\n               <option id=\"CPACR_CP7\" value=\"0\"/>\n               <option id=\"CPACR_CP10\" value=\"3\"/>\n               <option id=\"CPACR_CP11\" value=\"3\"/>\n               <option id=\"NSACR_CP0\" value=\"yes\"/>\n               <option id=\"NSACR_CP1\" value=\"yes\"/>\n               <option id=\"NSACR_CP2\" value=\"no\"/>\n               <option id=\"NSACR_CP3\" value=\"no\"/>\n               <option id=\"NSACR_CP4\" value=\"no\"/>\n               <option id=\"NSACR_CP5\" value=\"no\"/>\n               <option id=\"NSACR_CP6\" value=\"no\"/>\n               <option id=\"NSACR_CP7\" value=\"no\"/>\n               <option id=\"NSACR_CP10\" value=\"yes\"/>\n               <option id=\"NSACR_CP11\" value=\"yes\"/>\n               <option id=\"CPPWR_SU0\" value=\"no\"/>\n               <option id=\"CPPWR_SUS0\" value=\"no\"/>\n               <option id=\"CPPWR_SU1\" value=\"no\"/>\n               <option id=\"CPPWR_SUS1\" value=\"no\"/>\n               <option id=\"CPPWR_SU2\" value=\"no\"/>\n               <option id=\"CPPWR_SUS2\" value=\"no\"/>\n               <option id=\"CPPWR_SU3\" value=\"no\"/>\n               <option id=\"CPPWR_SUS3\" value=\"no\"/>\n               <option id=\"CPPWR_SU4\" value=\"no\"/>\n               <option id=\"CPPWR_SUS4\" value=\"no\"/>\n               <option id=\"CPPWR_SU5\" value=\"no\"/>\n               <option id=\"CPPWR_SUS5\" value=\"no\"/>\n               <option id=\"CPPWR_SU6\" value=\"no\"/>\n               <option id=\"CPPWR_SUS6\" value=\"no\"/>\n               <option id=\"CPPWR_SU7\" value=\"no\"/>\n               <option id=\"CPPWR_SUS7\" value=\"no\"/>\n               <option id=\"CPPWR_SU10\" value=\"no\"/>\n               <option id=\"CPPWR_SUS10\" value=\"no\"/>\n               <option id=\"CPPWR_SU11\" value=\"no\"/>\n               <option id=\"CPPWR_SUS11\" value=\"no\"/>\n               <option id=\"SEC_GPIO_MASK0_LOCK\" value=\"no\"/>\n               <option id=\"SEC_GPIO_MASK1_LOCK\" value=\"no\"/>\n               <option id=\"SEC_CPU1_INT_MASK0_LOCK\" value=\"no\"/>\n               <option id=\"SEC_CPU1_INT_MASK1_LOCK\" value=\"no\"/>\n               <option id=\"MASTER_SEC_LEVEL_LOCK\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_NS_VTOR\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_NS_MPU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_S_VTAIRCR\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_S_MPU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_SAU\" value=\"no\"/>\n               <option id=\"CPU0_LOCK_REG_LOCK\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_NS_VTOR\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_NS_MPU\" value=\"no\"/>\n               <option id=\"CPU1_LOCK_REG_LOCK\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_SECURE_CHECKING\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK\" value=\"yes\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_SIMPLE_MASTER_STRICT_MODE\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_DISABLE_SMART_MASTER_STRICT_MODE\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_IDAU_ALL_NS\" value=\"no\"/>\n               <option id=\"AHB_MISC_CTRL_REG_WRITE_LOCK\" value=\"yes\"/>\n            </global_options>\n            <mpus>\n               <mpu enabled=\"false\" priv_default_map=\"false\" handler_enabled=\"false\" id=\"s\" generate_code_for_disabled_regions=\"false\">\n                  <attributes>\n                     <group index=\"0\" id=\"Code\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"1\" id=\"RAM\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"2\" id=\"Peripheral\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"3\" id=\"3\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"4\" id=\"4\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"5\" id=\"5\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"6\" id=\"6\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"7\" id=\"7\" memory_type=\"device\" device=\"nGnRE\"/>\n                  </attributes>\n                  <regions>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"0\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"1\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"2\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"3\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"4\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"5\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"6\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"7\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                  </regions>\n               </mpu>\n               <mpu enabled=\"false\" priv_default_map=\"false\" handler_enabled=\"false\" id=\"ns\" generate_code_for_disabled_regions=\"false\">\n                  <attributes>\n                     <group index=\"0\" id=\"Code\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"1\" id=\"RAM\" memory_type=\"normal\" device=\"nGnRE\"/>\n                     <group index=\"2\" id=\"Peripheral\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"3\" id=\"3\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"4\" id=\"4\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"5\" id=\"5\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"6\" id=\"6\" memory_type=\"device\" device=\"nGnRE\"/>\n                     <group index=\"7\" id=\"7\" memory_type=\"device\" device=\"nGnRE\"/>\n                  </attributes>\n                  <regions>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"0\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"1\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"2\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"3\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"4\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"5\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"6\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                     <region start=\"0\" size=\"32\" security=\"priv\" enabled=\"false\" index=\"7\" executable=\"false\" read_only=\"false\" attributes_index=\"0\"/>\n                  </regions>\n               </mpu>\n            </mpus>\n         </functional_group>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/lpc55/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include \"fsl_device_registers.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_power.h\"\n#include \"fsl_usart.h\"\n\n#include \"board/pin_mux.h\"\n#include \"board/clock_config.h\"\n#include \"board/peripherals.h\"\n\n#ifdef NEOPIXEL_PIN\n#include \"fsl_sctimer.h\"\n#include \"sct_neopixel.h\"\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid USB1_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\nvoid board_init(void) {\n  BOARD_InitBootPins();\n  BOARD_InitBootClocks();\n  BOARD_InitBootPeripherals();\n\n  board_led_write(0);\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n  NVIC_SetPriority(USB1_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n#if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 0)\n  // Port0 is Full Speed\n  NVIC_ClearPendingIRQ(USB0_IRQn);\n  NVIC_ClearPendingIRQ(USB0_NEEDCLK_IRQn);\n\n  /* Turn on USB0 Phy */\n  POWER_DisablePD(kPDRUNCFG_PD_USB0_PHY);\n\n  /* reset the IP to make sure it's in reset state. */\n  RESET_PeripheralReset(kUSB0D_RST_SHIFT_RSTn);\n  RESET_PeripheralReset(kUSB0HSL_RST_SHIFT_RSTn);\n  RESET_PeripheralReset(kUSB0HMR_RST_SHIFT_RSTn);\n\n  if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0) {\n    // Enable USB Clock Adjustments to trim the FRO for the full speed controller\n    ANACTRL->FRO192M_CTRL |= ANACTRL_FRO192M_CTRL_USBCLKADJ_MASK;\n    CLOCK_SetClkDiv(kCLOCK_DivUsb0Clk, 1, false);\n    CLOCK_AttachClk(kFRO_HF_to_USB0_CLK);\n\n    /*According to reference manual, device mode setting has to be set by access usb host register */\n    CLOCK_EnableClock(kCLOCK_Usbhsl0);  // enable usb0 host clock\n    USBFSH->PORTMODE |= USBFSH_PORTMODE_DEV_ENABLE_MASK;\n    CLOCK_DisableClock(kCLOCK_Usbhsl0); // disable usb0 host clock\n    /* enable USB Device clock */\n    CLOCK_EnableUsbfs0DeviceClock(kCLOCK_UsbfsSrcFro, CLOCK_GetFreq(kCLOCK_FroHf));\n  } else {\n    CLOCK_EnableUsbfs0HostClock(kCLOCK_UsbfsSrcPll1, 48000000U);\n    USBFSH->PORTMODE &= ~USBFSH_PORTMODE_DEV_ENABLE_MASK;\n  }\n#endif\n\n#if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 1)\n  // Port1 is High Speed\n\n  /* Turn on USB1 Phy */\n  POWER_DisablePD(kPDRUNCFG_PD_USB1_PHY);\n\n  /* reset the IP to make sure it's in reset state. */\n  RESET_PeripheralReset(kUSB1H_RST_SHIFT_RSTn);\n  RESET_PeripheralReset(kUSB1D_RST_SHIFT_RSTn);\n  RESET_PeripheralReset(kUSB1_RST_SHIFT_RSTn);\n  RESET_PeripheralReset(kUSB1RAM_RST_SHIFT_RSTn);\n\n  if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1) {\n    /* According to reference manual, device mode setting has to be set by access usb host register */\n    CLOCK_EnableClock(kCLOCK_Usbh1); // enable usb0 host clock\n\n    USBHSH->PORTMODE = USBHSH_PORTMODE_SW_PDCOM_MASK; // Put PHY powerdown under software control\n    USBHSH->PORTMODE |= USBHSH_PORTMODE_DEV_ENABLE_MASK;\n\n    CLOCK_DisableClock(kCLOCK_Usbh1); // disable usb0 host clock\n    /* enable USB Device clock */\n    CLOCK_EnableUsbhs0DeviceClock(kCLOCK_UsbSrcUnused, 0U);\n  } else {\n    CLOCK_EnableUsbhs0HostClock(kCLOCK_UsbSrcUnused, 0U);\n  }\n\n  CLOCK_EnableUsbhs0PhyPllClock(kCLOCK_UsbPhySrcExt, XTAL0_CLK_HZ);\n\n  // Enable PHY support for Low speed device + LS via FS Hub\n  USBPHY->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL2_MASK | USBPHY_CTRL_SET_ENUTMILEVEL3_MASK;\n\n  // Enable all power for normal operation\n  USBPHY->PWD = 0;\n\n  USBPHY->CTRL_SET = USBPHY_CTRL_SET_ENAUTOCLR_CLKGATE_MASK;\n  USBPHY->CTRL_SET = USBPHY_CTRL_SET_ENAUTOCLR_PHY_PWD_MASK;\n\n  // PHY Tx calibration\n  USBPHY->TX = ((USBPHY->TX & (~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK))) |\n               (USBPHY_TX_D_CAL(0x05U) | USBPHY_TX_TXCAL45DP(0x0AU) | USBPHY_TX_TXCAL45DM(0x0AU)));\n\n  ARM_MPU_SetMemAttr(0, 0x44); // Normal memory, non-cacheable (inner and outer)\n  ARM_MPU_SetRegion(0, ARM_MPU_RBAR(0x40100000, ARM_MPU_SH_NON, 0, 1, 1), ARM_MPU_RLAR(0x40104000, 0));\n  ARM_MPU_Enable(MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_HFNMIENA_Msk);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinWrite(GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  // active low\n  return BUTTON_STATE_ACTIVE == GPIO_PinRead(GPIO, BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  USART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\n\n#ifndef __ICCARM__\n// Implement _start() since we use linker flag '-nostartfiles'.\n// Requires defined __STARTUP_CLEAR_BSS,\nextern int main(void);\n\nTU_ATTR_UNUSED void _start(void) {\n  // called by startup code\n  main();\n  while (1) {}\n}\n\n#ifdef __clang__\nvoid\t_exit (int __status) {\n  (void) __status;\n  while (1) {}\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/lpc55/family.cmake",
    "content": "include_guard()\n\nset(MCUX_DIR ${TOP}/hw/mcu/nxp/mcuxsdk-core)\nset(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-devices-lpc/LPC5500)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_6)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS LPC55 CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\n\n# default device port to USB1 highspeed, host to USB0 fullspeed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif ()\n\n# port 0 is fullspeed, port 1 is highspeed\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\ncmake_print_variables(RHPORT_DEVICE RHPORT_DEVICE_SPEED RHPORT_HOST RHPORT_HOST_SPEED)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\n  set(LD_FILE_GNU ${SDK_DIR}/${MCU_VARIANT}/gcc/${MCU_CORE}_flash.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\nif (NOT DEFINED STARTUP_FILE_GNU)\n  set(STARTUP_FILE_GNU ${SDK_DIR}/${MCU_VARIANT}/gcc/startup_${MCU_CORE}.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\nif (NOT DEFINED LD_FILE_IAR)\n  set(LD_FILE_IAR ${SDK_DIR}/${MCU_VARIANT}/iar/${MCU_CORE}_flash.icf)\nendif ()\n\nif (NOT DEFINED STARTUP_FILE_IAR)\n  set(STARTUP_FILE_IAR ${SDK_DIR}/${MCU_VARIANT}/iar/startup_${MCU_CORE}.s)\nendif ()\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  # Some variants (e.g. LPC55S28) share drivers with another variant (e.g. LPC55S69)\n  if (NOT DEFINED MCU_DRIVER_VARIANT)\n    set(MCU_DRIVER_VARIANT ${MCU_VARIANT})\n  endif ()\n\n  add_library(${BOARD_TARGET} STATIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board/clock_config.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board/pin_mux.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/board/peripherals.c\n    # driver\n    ${MCUX_DIR}/drivers/lpc_gpio/fsl_gpio.c\n    ${MCUX_DIR}/drivers/common/fsl_common_arm.c\n    ${MCUX_DIR}/drivers/flexcomm/fsl_flexcomm.c\n    ${MCUX_DIR}/drivers/flexcomm/usart/fsl_usart.c\n    # mcu\n    ${SDK_DIR}/${MCU_VARIANT}/system_${MCU_CORE}.c\n    ${SDK_DIR}/${MCU_DRIVER_VARIANT}/drivers/fsl_clock.c\n    ${SDK_DIR}/${MCU_DRIVER_VARIANT}/drivers/fsl_power.c\n    ${SDK_DIR}/${MCU_DRIVER_VARIANT}/drivers/fsl_reset.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${TOP}/lib/sct_neopixel\n    # driver\n    ${MCUX_DIR}/drivers/common\n    ${MCUX_DIR}/drivers/flexcomm\n    ${MCUX_DIR}/drivers/flexcomm/usart\n    ${MCUX_DIR}/drivers/lpc_iocon\n    ${MCUX_DIR}/drivers/lpc_gpio\n    ${MCUX_DIR}/drivers/sctimer\n    # mcu\n    ${SDK_DIR}/${MCU_VARIANT}\n    ${SDK_DIR}/${MCU_DRIVER_VARIANT}/drivers\n    ${SDK_DIR}/periph\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CFG_TUSB_MEM_ALIGN=TU_ATTR_ALIGNED\\(64\\)\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    __STARTUP_CLEAR_BSS\n    )\n\n  # Port 0 is Fullspeed, Port 1 is Highspeed. Port1 controller can only access USB_SRAM\n  if (RHPORT_DEVICE EQUAL 1)\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      [=[CFG_TUD_MEM_SECTION=__attribute__((section(\"m_usb_global\")))]=]\n      )\n  endif ()\n  if (RHPORT_HOST EQUAL 1)\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      [=[CFG_TUH_MEM_SECTION=__attribute__((section(\"m_usb_global\")))]=]\n      CFG_TUH_USBIP_IP3516=1\n      )\n  endif ()\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_LPC55)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/lib/sct_neopixel/sct_neopixel.c\n    ${TOP}/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n\n  if (RHPORT_HOST EQUAL 0)\n    target_sources(${TARGET} PUBLIC\n      ${TOP}/src/portable/ohci/ohci.c\n      )\n  elseif (RHPORT_HOST EQUAL 1)\n    target_sources(${TARGET} PUBLIC\n      ${TOP}/src/portable/nxp/lpc_ip3516/hcd_lpc_ip3516.c\n      )\n  endif ()\n\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      -nostartfiles\n      \"LINKER:--defsym=__stack_size__=0x1000\"\n      \"LINKER:--defsym=__heap_size__=0\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      \"LINKER:--config_def=__stack_size__=0x1000\"\n      \"LINKER:--config_def=__heap_size__=0\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n      PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n    set_source_files_properties(${TOP}/lib/sct_neopixel/sct_neopixel.c\n      PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes -Wno-unused-parameter\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\n  #family_flash_pyocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/lpc55/family.mk",
    "content": "UF2_FAMILY_ID = 0x2abc77ec\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m33\nMCUX_DIR = hw/mcu/nxp/mcuxsdk-core\nSDK_DIR = hw/mcu/nxp/mcux-devices-lpc\n\n# Some variants (e.g. LPC55S28) share drivers with another variant (e.g. LPC55S69)\nMCU_DRIVER_VARIANT ?= $(MCU_VARIANT)\n\n# Default device port to USB1 highspeed, host to USB0 fullspeed\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nCFLAGS += \\\n  -flto \\\n  -D__STARTUP_CLEAR_BSS \\\n  -DCFG_TUSB_MCU=OPT_MCU_LPC55XX \\\n  -DCFG_TUSB_MEM_ALIGN='__attribute__((aligned(64)))' \\\n  -DBOARD_TUD_RHPORT=$(RHPORT_DEVICE) \\\n  -DBOARD_TUH_RHPORT=$(RHPORT_HOST) \\\n\n# port 0 is fullspeed, port 1 is highspeed\nifeq ($(RHPORT_DEVICE), 1)\n  CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n  # Port1 controller can only access USB_SRAM\n  CFLAGS += -DCFG_TUD_MEM_SECTION='__attribute__((section(\"m_usb_global\")))'\nelse\n  CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_FULL_SPEED\nendif\n\nifeq ($(RHPORT_HOST), 1)\n  CFLAGS += -DBOARD_TUH_MAX_SPEED=OPT_MODE_HIGH_SPEED\n  CFLAGS += -DCFG_TUH_MEM_SECTION='__attribute__((section(\"m_usb_global\")))'\n  CFLAGS += -DCFG_TUH_USBIP_IP3516=1\n\tSRC_C += $(TOP)/src/portable/nxp/lpc_ip3516/hcd_lpc_ip3516.c\nelse\n  CFLAGS += -DBOARD_TUH_MAX_SPEED=OPT_MODE_FULL_SPEED\nendif\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=float-equal\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs \\\n  -Wl,--defsym=__stack_size__=0x1000 \\\n  -Wl,--defsym=__heap_size__=0 \\\n\n# All source paths should be relative to the top level.\nLD_FILE ?= $(SDK_DIR)/LPC5500/$(MCU_VARIANT)/gcc/$(MCU_CORE)_flash.ld\n\nSRC_C += \\\n\t$(TOP)/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c \\\n\t$(TOP)/$(SDK_DIR)/LPC5500/$(MCU_VARIANT)/system_$(MCU_CORE).c \\\n\t$(TOP)/$(SDK_DIR)/LPC5500/$(MCU_DRIVER_VARIANT)/drivers/fsl_clock.c \\\n\t$(TOP)/$(SDK_DIR)/LPC5500/$(MCU_DRIVER_VARIANT)/drivers/fsl_power.c \\\n\t$(TOP)/$(SDK_DIR)/LPC5500/$(MCU_DRIVER_VARIANT)/drivers/fsl_reset.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpc_gpio/fsl_gpio.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/common/fsl_common_arm.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/flexcomm/fsl_flexcomm.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/flexcomm/usart/fsl_usart.c \\\n\t$(TOP)/lib/sct_neopixel/sct_neopixel.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/sct_neopixel \\\n\t$(TOP)/lib/CMSIS_6/CMSIS/Core/Include \\\n\t$(TOP)/$(SDK_DIR)/LPC5500/$(MCU_VARIANT) \\\n\t$(TOP)/$(SDK_DIR)/LPC5500/$(MCU_DRIVER_VARIANT)/drivers \\\n\t$(TOP)/$(SDK_DIR)/LPC5500/periph \\\n\t$(TOP)/$(MCUX_DIR)/drivers/common \\\n\t$(TOP)/$(MCUX_DIR)/drivers/flexcomm/usart \\\n\t$(TOP)/$(MCUX_DIR)/drivers/flexcomm/ \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpc_iocon \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpc_gpio \\\n\t$(TOP)/$(MCUX_DIR)/drivers/sctimer\n\nSRC_S += $(TOP)/$(SDK_DIR)/LPC5500/$(MCU_VARIANT)/gcc/startup_$(MCU_CORE).S\n"
  },
  {
    "path": "hw/bsp/maxim/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"mxc_device.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/maxim/README.md",
    "content": "# Analog Devices MAXIM\n\nThis BSP is for working with the Analog microcontrollers\n - [MAX32650](https://www.analog.com/en/products/max32650.html),\n - [MAX32651](https://www.analog.com/en/products/max32651.html)\n - [MAX32652](https://www.analog.com/en/products/max32652.html)\n - [MAX32665](https://www.analog.com/en/products/max32665.html)\n - [MAX32666](https://www.analog.com/en/products/max32666.html)\n - [MAX32690](https://www.analog.com/en/products/max32690.html)\n - [MAX78002](https://www.analog.com/en/products/max78002.html) AI microcontroller.\n\nThe following boards are supported:\n * [MAX32650EVKIT](https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32650-evkit.html)\n * [MAX32650FTHR](https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32650fthr.html)\n * [MAX32651EVKIT](https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32651-evkit.html) (Secure Bootloader)\n * [MAX32666EVKIT](https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32666evkit.html)\n * [MAX32666FTHR](https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32666fthr.html)\n * [MAX32690EVKIT](https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32690evkit.html)\n * [AD-APARD32690-SL](https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/ad-apard32690-sl.html)\n * [MAX78002EVKIT](https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max78002evkit.html)\n\nThis part family leverages the Maxim Microcontrollers SDK (MSDK) for the device\ninterfaces and hardware abstraction layers. This source code package is fetched\nas part of the get-deps script.\n\nThe microcontroller utilizes the standard GNU ARM toolchain.  If this toolchain\nis not already available on your build machine, it can be installed by using the\nbundled MSDK installation.  Details on downloading and installing can be found\nin the [User's Guide](https://analogdevicesinc.github.io/msdk//USERGUIDE/).\n\n## Flashing\n\nThe default flashing behavior in this BSP is to utilize JLink.  This can be done\nby running the `flash` or `flash-jlink` rule for Makefiles, or the\n`<target>-jlink` target for CMake.\n\nMost the Evaluation Kit and boards are shipped with a CMSIS-DAP\ncompatible debug probe. However, at the time of writing, the necessary flashing\nalgorithms for OpenOCD have not yet been incorporated into the OpenOCD master\nbranch.  To utilize the provided debug probes, please install the bundled MSDK\npackage which includes the appropriate OpenOCD modifications.   To leverage this\nOpenOCD instance, run the `flash-msdk` Makefile rule, or `<target>-openocd` CMake\ntarget.\n"
  },
  {
    "path": "hw/bsp/maxim/boards/apard32690/board.cmake",
    "content": "set(MAX_DEVICE max32690)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/boards/apard32690/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name:  APARD32690-SL\n   url: https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/ad-apard32690-sl.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"max32690.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_PORT        MXC_GPIO2\n#define LED_PIN         MXC_GPIO_PIN_1\n#define LED_VDDIO       MXC_GPIO_VSSEL_VDDIOH\n#define LED_STATE_ON    1\n\n// Button\n#define BUTTON_PORT         MXC_GPIO1\n#define BUTTON_PIN          MXC_GPIO_PIN_27\n#define BUTTON_PULL         MXC_GPIO_PAD_NONE\n#define BUTTON_STATE_ACTIVE 1\n\n// UART Enable for UART on ARM SWD Connector\n#define UART_NUM 0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/maxim/boards/apard32690/board.mk",
    "content": "MAX_DEVICE = max32690\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32650evkit/board.cmake",
    "content": "set(MAX_DEVICE max32650)\n\nfunction(update_board TARGET)\nendfunction()\n\nfunction(prepare_image TARGET_IN)\n  #No signing required\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32650evkit/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MAX32650 EVKIT\n   url: https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32650-evkit.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"max32650.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_PORT        MXC_GPIO2\n#define LED_PIN         MXC_GPIO_PIN_25\n#define LED_VDDIO       MXC_GPIO_VSSEL_VDDIOH\n#define LED_STATE_ON    0\n\n// Button\n#define BUTTON_PORT         MXC_GPIO2\n#define BUTTON_PIN          MXC_GPIO_PIN_28\n#define BUTTON_PULL         MXC_GPIO_PAD_WEAK_PULL_UP\n#define BUTTON_STATE_ACTIVE 0\n\n// UART Enable for EvKit's Integrated FTDI Adapter. Pin Mux handled by the HAL\n#define UART_NUM    0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32650evkit/board.mk",
    "content": "MAX_DEVICE = max32650\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32650fthr/board.cmake",
    "content": "set(MAX_DEVICE max32650)\n\nfunction(update_board TARGET)\nendfunction()\n\nfunction(prepare_image TARGET_IN)\n  #No signing required\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32650fthr/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MAX32650 Feather\n   url: https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32650fthr.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"max32650.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_PORT        MXC_GPIO1\n#define LED_PIN         MXC_GPIO_PIN_14\n#define LED_VDDIO       MXC_GPIO_VSSEL_VDDIO\n#define LED_STATE_ON    0\n\n// Button\n#define BUTTON_PORT         MXC_GPIO1\n#define BUTTON_PIN          MXC_GPIO_PIN_19\n#define BUTTON_PULL         MXC_GPIO_PAD_WEAK_PULL_UP\n#define BUTTON_STATE_ACTIVE 0\n\n// UART Enable for SWD UART Pins. Pin Mux handled by the HAL\n#define UART_NUM    0\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32650fthr/board.mk",
    "content": "MAX_DEVICE = max32650\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32651evkit/board.cmake",
    "content": "set(MAX_DEVICE max32650)\n\n# Use the secure linker file\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/max32651.ld)\n\nfunction(update_board TARGET)\n  # for the signed target, need to add the __SLA_FWK__ define\n  target_compile_definitions(${TARGET} PUBLIC\n    __SLA_FWK__\n    )\nendfunction()\n\nfunction(sign_image TARGET_IN)\n  #For the signed target, set up a POST_BUILD command to sign the elf file once created\n  if((WIN32) OR (MINGW) OR (MSYS))\n    set(SIGN_EXE \"sign_app.exe\")\n  else()\n    set(SIGN_EXE \"sign_app\")\n  endif()\n  set(MCU_PATH \"${TOP}/hw/mcu/analog/msdk/\")\n\n  # Custom POST_BUILD command\n  add_custom_command(\n    TARGET ${TARGET_IN} POST_BUILD\n    COMMAND ${CMAKE_OBJCOPY} $<TARGET_FILE:${TARGET_IN}>  -R .sig -O binary $<TARGET_FILE_DIR:${TARGET_IN}>/${TARGET_IN}.bin\n    COMMAND ${MCU_PATH}/Tools/SBT/bin/${SIGN_EXE} -c MAX32651 key_file=${MCU_PATH}/Tools/SBT/devices/MAX32651/keys/maximtestcrk.key\n            ca=$<TARGET_FILE_DIR:${TARGET_IN}>/${TARGET_IN}.bin sca=$<TARGET_FILE_DIR:${TARGET_IN}>/${TARGET_IN}.sbin\n    COMMAND ${CMAKE_OBJCOPY} $<TARGET_FILE:${TARGET_IN}> --update-section .sig=$<TARGET_FILE_DIR:${TARGET_IN}>/${TARGET_IN}.sig\n    VERBATIM\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32651evkit/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MAX32651 EVKIT\n   url: https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32651-evkit.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"max32650.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_PORT        MXC_GPIO2\n#define LED_PIN         MXC_GPIO_PIN_25\n#define LED_VDDIO       MXC_GPIO_VSSEL_VDDIOH\n#define LED_STATE_ON    0\n\n// Button\n#define BUTTON_PORT         MXC_GPIO2\n#define BUTTON_PIN          MXC_GPIO_PIN_28\n#define BUTTON_PULL         MXC_GPIO_PAD_WEAK_PULL_UP\n#define BUTTON_STATE_ACTIVE 0\n\n// UART Enable for EvKit's Integrated FTDI Adapter. Pin Mux handled by the HAL\n#define UART_NUM    0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32651evkit/board.mk",
    "content": "MAX_DEVICE = max32650\n\n# Use the secure linker file\nLD_FILE = $(FAMILY_PATH)/linker/max32651.ld\n\n# Let the family script know the build needs to be signed\nSIGNED_BUILD := 1\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32666evkit/board.cmake",
    "content": "set(MAX_DEVICE max32665)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32666evkit/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MAX32666 EVKIT\n   url: https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32666evkit.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"max32665.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_PORT        MXC_GPIO1\n#define LED_PIN         MXC_GPIO_PIN_14\n#define LED_VDDIO       MXC_GPIO_VSSEL_VDDIOH\n#define LED_STATE_ON    0\n\n// Button\n#define BUTTON_PORT         MXC_GPIO1\n#define BUTTON_PIN          MXC_GPIO_PIN_6\n#define BUTTON_PULL         MXC_GPIO_PAD_PULL_UP\n#define BUTTON_STATE_ACTIVE 0\n\n// UART Enable for EvKit's Integrated FTDI Adapter. Pin Mux handled by the HAL\n#define UART_NUM    1\n#define UART_MAP    MAP_A\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32666evkit/board.mk",
    "content": "MAX_DEVICE = max32665\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32666fthr/board.cmake",
    "content": "set(MAX_DEVICE max32665)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32666fthr/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MAX32666 Feather\n   url: https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32666fthr.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"max32665.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_PORT        MXC_GPIO0\n#define LED_PIN         MXC_GPIO_PIN_29\n#define LED_VDDIO       MXC_GPIO_VSSEL_VDDIOH\n#define LED_STATE_ON    0\n\n// Button\n#define BUTTON_PORT         MXC_GPIO1\n#define BUTTON_PIN          MXC_GPIO_PIN_10\n#define BUTTON_PULL         MXC_GPIO_PAD_PULL_UP\n#define BUTTON_STATE_ACTIVE 0\n\n// UART Enable for UART on SWD. Pin Mux handled by the HAL\n#define UART_NUM    1\n#define UART_MAP    MAP_B\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32666fthr/board.mk",
    "content": "MAX_DEVICE = max32665\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32690evkit/board.cmake",
    "content": "set(MAX_DEVICE max32690)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32690evkit/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MAX32690 EVKIT\n   url: https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max32690evkit.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"max32690.h\"\n\n// LED\n#define LED_PORT        MXC_GPIO0\n#define LED_PIN         MXC_GPIO_PIN_14\n#define LED_VDDIO       MXC_GPIO_VSSEL_VDDIOH\n#define LED_STATE_ON    0\n\n// Button\n#define BUTTON_PORT         MXC_GPIO4\n#define BUTTON_PIN          MXC_GPIO_PIN_0\n#define BUTTON_PULL         MXC_GPIO_PAD_PULL_UP\n#define BUTTON_STATE_ACTIVE 0\n\n// UART Enable for EvKit's Integrated FTDI Adapter. Pin Mux handled by the HAL\n#define UART_NUM 2\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max32690evkit/board.mk",
    "content": "MAX_DEVICE = max32690\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max78002evkit/board.cmake",
    "content": "set(MAX_DEVICE max78002)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max78002evkit/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MAX78002 EVKIT\n   url: https://www.analog.com/en/resources/evaluation-hardware-and-software/evaluation-boards-kits/max78002evkit.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"max78002.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_PORT        MXC_GPIO2\n#define LED_PIN         MXC_GPIO_PIN_4\n#define LED_VDDIO       MXC_GPIO_VSSEL_VDDIOH\n#define LED_STATE_ON    1\n\n// Button\n#define BUTTON_PORT         MXC_GPIO2\n#define BUTTON_PIN          MXC_GPIO_PIN_6\n#define BUTTON_PULL         MXC_GPIO_PAD_PULL_UP\n#define BUTTON_STATE_ACTIVE 0\n\n// UART Enable for EvKit's Integrated FTDI Adapter. Pin Mux handled by the HAL\n#define UART_NUM        0\n#define UART_PORT       MXC_GPIO0\n#define UART_VDDIO_BITS 0xF\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/maxim/boards/max78002evkit/board.mk",
    "content": "MAX_DEVICE = max78002\n"
  },
  {
    "path": "hw/bsp/maxim/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Analog Devices\n*/\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" // _mxc_crit_get_state()\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\n#include \"gpio.h\"\n#include \"mxc_sys.h\"\n#if __has_include(\"mcr_regs.h\")\n#include \"mcr_regs.h\"\n#endif\n#include \"mxc_device.h\"\n#include \"uart.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"board.h\"\n#include \"bsp/board_api.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\nmxc_uart_regs_t *ConsoleUart = MXC_UART_GET_UART(UART_NUM);\n\nvoid board_init(void) {\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n  mxc_gpio_cfg_t gpioConfig;\n\n  // LED\n  gpioConfig.drvstr = MXC_GPIO_DRVSTR_0;\n  gpioConfig.func = MXC_GPIO_FUNC_OUT;\n  gpioConfig.mask = LED_PIN;\n  gpioConfig.pad = MXC_GPIO_PAD_NONE;\n  gpioConfig.port = LED_PORT;\n  gpioConfig.vssel = LED_VDDIO;\n  MXC_GPIO_Config(&gpioConfig);\n  board_led_write(false);\n\n  // Button\n  gpioConfig.drvstr = MXC_GPIO_DRVSTR_0;\n  gpioConfig.func = MXC_GPIO_FUNC_IN;\n  gpioConfig.mask = BUTTON_PIN;\n  gpioConfig.pad = BUTTON_PULL;\n  gpioConfig.port = BUTTON_PORT;\n  gpioConfig.vssel = MXC_GPIO_VSSEL_VDDIO;\n  MXC_GPIO_Config(&gpioConfig);\n\n  // UART\n#if MAX_PERIPH_ID == 14\n  MXC_UART_Init(ConsoleUart, CFG_BOARD_UART_BAUDRATE, UART_MAP);\n#elif MAX_PERIPH_ID == 18 || MAX_PERIPH_ID == 87\n  MXC_UART_Init(ConsoleUart, CFG_BOARD_UART_BAUDRATE, MXC_UART_IBRO_CLK);\n  #if MAX_PERIPH_ID == 87\n  UART_PORT->vssel |= UART_VDDIO_BITS; // Set necessary bits to 3.3V\n  #endif\n#endif\n\n  //USB\n#if defined(MAX32650)\n  // Startup the HIRC96M clock if it's not on already\n  if (!(MXC_GCR->clk_ctrl & MXC_F_GCR_CLK_CTRL_HIRC96_EN)) {\n    MXC_GCR->clk_ctrl |= MXC_F_GCR_CLK_CTRL_HIRC96_EN;\n    MXC_SYS_Clock_Timeout(MXC_F_GCR_CLK_CTRL_HIRC96_RDY);\n  }\n  MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_USB);\n  MXC_SYS_Reset_Periph(MXC_SYS_RESET_USB);\n\n#elif defined(MAX32665) || defined(MAX32666)\n  // Startup the HIRC96M clock if it's not on already\n  if (!(MXC_GCR->clkcn & MXC_F_GCR_CLKCN_HIRC96M_EN)) {\n    MXC_GCR->clkcn |= MXC_F_GCR_CLKCN_HIRC96M_EN;\n  }\n  MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_USB);\n  MXC_SYS_Reset_Periph(MXC_SYS_RESET_USB);\n\n#elif defined(MAX32690)\n  MXC_SYS_ClockSourceEnable(MXC_SYS_CLOCK_IPO);\n  MXC_MCR->ldoctrl |= MXC_F_MCR_LDOCTRL_0P9EN;\n  MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_USB);\n  MXC_SYS_Reset_Periph(MXC_SYS_RESET0_USB);\n\n#  elif  defined(MAX78002)\n  MXC_MCR->ldoctrl |= MXC_F_MCR_LDOCTRL_0P9EN;\n  MXC_SYS_ClockEnable(MXC_SYS_PERIPH_CLOCK_USB);\n#else\n  #error \"Unsupported MAXIM MCU for board_dfu_init\"\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n#if LED_STATE_ON\n  state = !state;\n#endif\n  if (state) {\n    MXC_GPIO_OutClr(LED_PORT, LED_PIN);\n  } else {\n    MXC_GPIO_OutSet(LED_PORT, LED_PIN);\n  }\n}\n\nuint32_t board_button_read(void) {\n  uint32_t state = MXC_GPIO_InGet(BUTTON_PORT, BUTTON_PIN) ? 1 : 0;\n  return BUTTON_STATE_ACTIVE == state;\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n#if defined(MAX32650)\n  // USN is 13 bytes on this device\n  (void) max_len;\n  MXC_SYS_GetUSN(id, 13);\n  return 13;\n#else\n  uint8_t hw_id[MXC_SYS_USN_CHECKSUM_LEN]; //USN Buffer\n  MXC_SYS_GetUSN(hw_id, NULL); // 2nd parameter is optional checksum buffer\n\n  size_t act_len = TU_MIN(max_len, MXC_SYS_USN_LEN);\n  memcpy(id, hw_id, act_len);\n  return act_len;\n#endif\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  int uart_val;\n  int act_len = 0;\n\n  while (act_len < len) {\n    if ((uart_val = MXC_UART_ReadCharacterRaw(ConsoleUart)) == E_UNDERFLOW) {\n      break;\n    } else {\n      *buf++ = (uint8_t) uart_val;\n      act_len++;\n    }\n  }\n  return act_len;\n}\n\nint board_uart_write(void const *buf, int len) {\n  int act_len = 0;\n  const uint8_t *ch_ptr = (const uint8_t *) buf;\n  while (act_len < len) {\n    MXC_UART_WriteCharacter(ConsoleUart, *ch_ptr++);\n    act_len++;\n  }\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/maxim/family.cmake",
    "content": "include_guard()\n\n# stub: overridden by board.cmake if needed\nfunction(sign_image TARGET_IN)\nendfunction()\n\nset(MSDK_LIB ${TOP}/hw/mcu/analog/msdk/Libraries)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nstring(TOUPPER ${MAX_DEVICE} MAX_DEVICE_UPPER)\ncmake_print_variables(MAX_DEVICE MAX_DEVICE_UPPER)\n\nset(JLINK_DEVICE ${MAX_DEVICE})\nset(OPENOCD_OPTION \"-f interface/cmsis-dap.cfg -f target/${MAX_DEVICE}.cfg\")\n\nset(FAMILY_MCUS ${MAX_DEVICE_UPPER} CACHE INTERNAL \"\")\n\nif (${MAX_DEVICE} STREQUAL \"max32650\")\n  set(PERIPH_ID 10)\n  set(PERIPH_SUFFIX \"me\")\nelseif (${MAX_DEVICE} STREQUAL \"max32665\" OR ${MAX_DEVICE} STREQUAL \"max32666\")\n  set(PERIPH_ID 14)\n  set(PERIPH_SUFFIX \"me\")\nelseif (${MAX_DEVICE} STREQUAL \"max32690\")\n  set(PERIPH_ID 18)\n  set(PERIPH_SUFFIX \"me\")\nelseif (${MAX_DEVICE} STREQUAL \"max78002\")\n  set(PERIPH_ID 87)\n  set(PERIPH_SUFFIX \"ai\")\nelse()\n  message(FATAL_ERROR \"Unsupported MAX device: ${MAX_DEVICE}\")\nendif()\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${MSDK_LIB}/CMSIS/Device/Maxim/${MAX_DEVICE_UPPER}/Source/GCC/startup_${MAX_DEVICE}.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/${MAX_DEVICE}.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  # Common\n  add_library(${BOARD_TARGET} STATIC\n    ${MSDK_LIB}/CMSIS/Device/Maxim/${MAX_DEVICE_UPPER}/Source/heap.c\n    ${MSDK_LIB}/CMSIS/Device/Maxim/${MAX_DEVICE_UPPER}/Source/system_${MAX_DEVICE}.c\n    ${MSDK_LIB}/PeriphDrivers/Source/SYS/mxc_assert.c\n    ${MSDK_LIB}/PeriphDrivers/Source/SYS/mxc_delay.c\n    ${MSDK_LIB}/PeriphDrivers/Source/SYS/mxc_lock.c\n    ${MSDK_LIB}/PeriphDrivers/Source/SYS/nvic_table.c\n    ${MSDK_LIB}/PeriphDrivers/Source/SYS/pins_${PERIPH_SUFFIX}${PERIPH_ID}.c\n    ${MSDK_LIB}/PeriphDrivers/Source/SYS/sys_${PERIPH_SUFFIX}${PERIPH_ID}.c\n    ${MSDK_LIB}/PeriphDrivers/Source/FLC/flc_common.c\n    ${MSDK_LIB}/PeriphDrivers/Source/FLC/flc_${PERIPH_SUFFIX}${PERIPH_ID}.c\n    ${MSDK_LIB}/PeriphDrivers/Source/FLC/flc_reva.c\n    ${MSDK_LIB}/PeriphDrivers/Source/GPIO/gpio_common.c\n    ${MSDK_LIB}/PeriphDrivers/Source/GPIO/gpio_${PERIPH_SUFFIX}${PERIPH_ID}.c\n    ${MSDK_LIB}/PeriphDrivers/Source/GPIO/gpio_reva.c\n    ${MSDK_LIB}/PeriphDrivers/Source/ICC/icc_${PERIPH_SUFFIX}${PERIPH_ID}.c\n    ${MSDK_LIB}/PeriphDrivers/Source/ICC/icc_reva.c\n    ${MSDK_LIB}/PeriphDrivers/Source/UART/uart_common.c\n    ${MSDK_LIB}/PeriphDrivers/Source/UART/uart_${PERIPH_SUFFIX}${PERIPH_ID}.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${MSDK_LIB}/CMSIS/5.9.0/Core/Include\n    ${MSDK_LIB}/CMSIS/Device/Maxim/${MAX_DEVICE_UPPER}/Include\n    ${MSDK_LIB}/PeriphDrivers/Include/${MAX_DEVICE_UPPER}\n    ${MSDK_LIB}/PeriphDrivers/Source/SYS\n    ${MSDK_LIB}/PeriphDrivers/Source/GPIO\n    ${MSDK_LIB}/PeriphDrivers/Source/ICC\n    ${MSDK_LIB}/PeriphDrivers/Source/FLC\n    ${MSDK_LIB}/PeriphDrivers/Source/UART\n    )\n\n  # device specific\n  if (${MAX_DEVICE} STREQUAL \"max32650\" OR\n    ${MAX_DEVICE} STREQUAL \"max32665\" OR ${MAX_DEVICE} STREQUAL \"max32666\")\n    target_sources(${BOARD_TARGET} PRIVATE\n      ${MSDK_LIB}/PeriphDrivers/Source/ICC/icc_common.c\n      ${MSDK_LIB}/PeriphDrivers/Source/TPU/tpu_${PERIPH_SUFFIX}${PERIPH_ID}.c\n      ${MSDK_LIB}/PeriphDrivers/Source/TPU/tpu_reva.c\n      ${MSDK_LIB}/PeriphDrivers/Source/UART/uart_reva.c\n      )\n    target_include_directories(${BOARD_TARGET} PUBLIC\n      ${MSDK_LIB}/PeriphDrivers/Source/TPU\n      )\n  elseif (${MAX_DEVICE} STREQUAL \"max32690\")\n    target_sources(${BOARD_TARGET} PRIVATE\n      ${MSDK_LIB}/PeriphDrivers/Source/CTB/ctb_${PERIPH_SUFFIX}${PERIPH_ID}.c\n      ${MSDK_LIB}/PeriphDrivers/Source/CTB/ctb_reva.c\n      ${MSDK_LIB}/PeriphDrivers/Source/CTB/ctb_common.c\n      ${MSDK_LIB}/PeriphDrivers/Source/UART/uart_revb.c\n      )\n    target_include_directories(${BOARD_TARGET} PUBLIC\n      ${MSDK_LIB}/PeriphDrivers/Source/CTB\n      )\n  elseif (${MAX_DEVICE} STREQUAL \"max78002\")\n    target_sources(${BOARD_TARGET} PRIVATE\n      ${MSDK_LIB}/PeriphDrivers/Source/AES/aes_${PERIPH_SUFFIX}${PERIPH_ID}.c\n      ${MSDK_LIB}/PeriphDrivers/Source/AES/aes_revb.c\n      ${MSDK_LIB}/PeriphDrivers/Source/TRNG/trng_${PERIPH_SUFFIX}${PERIPH_ID}.c\n      ${MSDK_LIB}/PeriphDrivers/Source/TRNG/trng_revb.c\n      ${MSDK_LIB}/PeriphDrivers/Source/UART/uart_revb.c\n      )\n    target_include_directories(${BOARD_TARGET} PUBLIC\n      ${MSDK_LIB}/PeriphDrivers/Source/AES\n      ${MSDK_LIB}/PeriphDrivers/Source/TRNG\n      )\n  else()\n    message(FATAL_ERROR \"Unsupported MAX device: ${MAX_DEVICE}\")\n  endif()\n\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    TARGET=${MAX_DEVICE_UPPER}\n    TARGET_REV=0x4131\n    MXC_ASSERT_ENABLE\n    ${MAX_DEVICE_UPPER}\n    IAR_PRAGMAS=0\n    MAX_PERIPH_ID=${PERIPH_ID}\n    BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n    )\n  target_compile_options(${BOARD_TARGET} PRIVATE\n    -Wno-error=strict-prototypes\n  )\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${MAX_DEVICE_UPPER})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/mentor/musb/dcd_musb.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    # warnings caused by MSDK headers\n    target_compile_options(${TARGET} PRIVATE -Wno-error=strict-prototypes)\n    if (${MAX_DEVICE} STREQUAL \"max78002\")\n      target_compile_options(${TARGET} PRIVATE -Wno-error=redundant-decls)\n    endif ()\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n\n  sign_image(${TARGET}) # for secured device such as max32651\n  family_flash_openocd_adi(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/maxim/family.mk",
    "content": "MSDK_LIB = hw/mcu/analog/msdk/Libraries\n\n# Add any board specific make rules\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCPU_CORE ?= cortex-m4\nPORT ?= 0\nJLINK_DEVICE = ${MAX_DEVICE}\nMAX_DEVICE_UPPER = $(call to_upper,${MAX_DEVICE})\n\nifeq ($(MAX_DEVICE),max32650)\n  PERIPH_ID = 10\n  PERIPH_SUFFIX = me\nendif\n\nifneq ($(filter $(MAX_DEVICE),max32665 max32666),)\n  PERIPH_ID = 14\n  PERIPH_SUFFIX = me\nendif\n\nifeq ($(MAX_DEVICE),max32690)\n  PERIPH_ID = 18\n  PERIPH_SUFFIX = me\nendif\n\nifeq ($(MAX_DEVICE),max78002)\n  PERIPH_ID = 87\n  PERIPH_SUFFIX = ai\nendif\n\nifndef PERIPH_ID\n  $(error Unsupported MAX device: ${MAX_DEVICE})\nendif\n\n# Configure the flash rule. By default, use JLink.\nSIGNED_BUILD ?= 0\nDEFAULT_FLASH = flash-jlink\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DTARGET=${MAX_DEVICE_UPPER}\\\n  -DTARGET_REV=0x4131 \\\n\t-DMXC_ASSERT_ENABLE \\\n\t-D${MAX_DEVICE_UPPER} \\\n\t-DIAR_PRAGMAS=0 \\\n\t-DMAX_PERIPH_ID=${PERIPH_ID} \\\n  -DCFG_TUSB_MCU=OPT_MCU_${MAX_DEVICE_UPPER} \\\n  -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n\n# mcu driver cause following warnings\nCFLAGS += \\\n\t-Wno-error=old-style-declaration \\\n\t-Wno-error=redundant-decls \\\n  -Wno-error=strict-prototypes \\\n\t-Wno-error=unused-parameter \\\n\t-Wno-error=cast-align \\\n\t-Wno-error=cast-qual \\\n\t-Wno-error=sign-compare \\\n\t-Wno-error=enum-conversion \\\n\nLDFLAGS_GCC += -nostartfiles --specs=nosys.specs --specs=nano.specs\nLD_FILE_GCC ?= $(FAMILY_PATH)/linker/${MAX_DEVICE}.ld\n\n# If the applications needs to be signed (for the MAX32651), sign it first and\n# then need to use MSDK's OpenOCD to flash it\n# Also need to include the __SLA_FWK__ define to enable the signed header into\n# memory\nifeq ($(SIGNED_BUILD), 1)\n# Extra definitions to build for the secure part\nCFLAGS += -D__SLA_FWK__\nDEFAULT_FLASH := sign-build flash-msdk\nendif\n\n# -----------------\n# Sources & Include\n# -----------------\n\n# common\nSRC_C += \\\n\tsrc/portable/mentor/musb/dcd_musb.c \\\n\t${MSDK_LIB}/CMSIS/Device/Maxim/${MAX_DEVICE_UPPER}/Source/heap.c \\\n\t${MSDK_LIB}/CMSIS/Device/Maxim/${MAX_DEVICE_UPPER}/Source/system_${MAX_DEVICE}.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/SYS/mxc_assert.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/SYS/mxc_delay.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/SYS/mxc_lock.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/SYS/nvic_table.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/SYS/pins_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/SYS/sys_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/FLC/flc_common.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/FLC/flc_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/FLC/flc_reva.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/GPIO/gpio_common.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/GPIO/gpio_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/GPIO/gpio_reva.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/ICC/icc_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/ICC/icc_reva.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/UART/uart_common.c \\\n\t${MSDK_LIB}/PeriphDrivers/Source/UART/uart_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\nSRC_S_GCC += ${MSDK_LIB}/CMSIS/Device/Maxim/${MAX_DEVICE_UPPER}/Source/GCC/startup_${MAX_DEVICE}.S\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/${MSDK_LIB}/CMSIS/5.9.0/Core/Include \\\n\t$(TOP)/${MSDK_LIB}/CMSIS/Device/Maxim/${MAX_DEVICE_UPPER}/Include \\\n\t$(TOP)/${MSDK_LIB}/PeriphDrivers/Include/${MAX_DEVICE_UPPER} \\\n\t$(TOP)/${MSDK_LIB}/PeriphDrivers/Source/SYS \\\n\t$(TOP)/${MSDK_LIB}/PeriphDrivers/Source/GPIO \\\n\t$(TOP)/${MSDK_LIB}/PeriphDrivers/Source/ICC \\\n\t$(TOP)/${MSDK_LIB}/PeriphDrivers/Source/FLC \\\n\t$(TOP)/${MSDK_LIB}/PeriphDrivers/Source/UART \\\n\n# device specific\nifneq ($(filter $(MAX_DEVICE),max32650 max32665 max32666),)\n  SRC_C += \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/ICC/icc_common.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/TPU/tpu_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/TPU/tpu_reva.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/UART/uart_reva.c \\\n\n  INC += $(TOP)/${MSDK_LIB}/PeriphDrivers/Source/TPU\nendif\n\nifeq (${MAX_DEVICE},max32690)\n  SRC_C += \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/CTB/ctb_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/CTB/ctb_reva.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/CTB/ctb_common.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/UART/uart_revb.c \\\n\n  INC += ${TOP}/${MSDK_LIB}/PeriphDrivers/Source/CTB\nendif\n\nifeq (${MAX_DEVICE},max78002)\n  SRC_C += \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/AES/aes_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/AES/aes_revb.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/TRNG/trng_${PERIPH_SUFFIX}${PERIPH_ID}.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/TRNG/trng_revb.c \\\n\t\t${MSDK_LIB}/PeriphDrivers/Source/UART/uart_revb.c \\\n\n  INC += \\\n\t\t${TOP}/${MSDK_LIB}/PeriphDrivers/Source/AES \\\n\t\t${TOP}/${MSDK_LIB}/PeriphDrivers/Source/TRNG\nendif\n\n\n# The MAX32651EVKIT is pin for pin identical to the MAX32650EVKIT, however the\n# MAX32651 has a secure bootloader which requires the image to be signed before\n# loading into flash. All MAX32651EVKIT's have the same key for evaluation\n# purposes, so create a special flash rule to sign the binary and flash using\n# the MSDK.\nMCU_PATH = $(TOP)/hw/mcu/analog/msdk/\n# Assume no extension for sign utility\nSIGN_EXE = sign_app\nifeq ($(OS), Windows_NT)\n# Must use .exe extension on Windows, since the binaries\n# for Linux may live in the same place.\nSIGN_EXE := sign_app.exe\nelse\nUNAME = $(shell uname -s)\nifneq ($(findstring MSYS_NT,$(UNAME)),)\n# Must also use .exe extension for MSYS2\nSIGN_EXE := sign_app.exe\nendif\nendif\n\n# Rule to sign the build.  This will in-place modify the existing .elf file\n# an populate the .sig section with the signature value\nsign-build: $(BUILD)/$(PROJECT).elf\n\t$(OBJCOPY) $(BUILD)/$(PROJECT).elf -R .sig -O binary $(BUILD)/$(PROJECT).bin\n\t$(MCU_PATH)/Tools/SBT/bin/$(SIGN_EXE) -c MAX32651 \\\n\t\tkey_file=\"$(MCU_PATH)/Tools/SBT/devices/MAX32651/keys/maximtestcrk.key\" \\\n\t\tca=$(BUILD)/$(PROJECT).bin sca=$(BUILD)/$(PROJECT).sbin\n\t$(OBJCOPY) $(BUILD)/$(PROJECT).elf --update-section .sig=$(BUILD)/$(PROJECT).sig\n\n# Optional flash option when running within an installed MSDK to use OpenOCD\n# Mainline OpenOCD does not yet have the MAX32's flash algorithm integrated.\n# If the MSDK is installed, flash-msdk can be run to utilize the the modified\n# openocd with the algorithms\nMAXIM_PATH := $(subst \\,/,$(MAXIM_PATH))\nflash-msdk: $(BUILD)/$(PROJECT).elf\n\t$(MAXIM_PATH)/Tools/OpenOCD/openocd -s $(MAXIM_PATH)/Tools/OpenOCD/scripts \\\n\t\t-f interface/cmsis-dap.cfg -f target/max32650.cfg \\\n\t\t-c \"program $(BUILD)/$(PROJECT).elf verify; init; reset; exit\"\n\n# Configure the flash rule\nflash: $(DEFAULT_FLASH)\n"
  },
  {
    "path": "hw/bsp/maxim/linker/max32650.ld",
    "content": "MEMORY {\n    ROM (rx)   : ORIGIN = 0x00000000, LENGTH = 0x00010000 /* 64kB ROM */\n    FLASH (rx) : ORIGIN = 0x10000000, LENGTH = 0x00300000 /* 3MB flash */\n    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00100000 /* 1MB SRAM */\n}\n\nSECTIONS {\n    .text :\n    {\n        _text = .;\n        KEEP(*(.isr_vector))\n        *(.text*)    /* program code */\n        *(.rodata*)  /* read-only data: \"const\" */\n\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n         /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        /* C++ Exception handling */\n        KEEP(*(.eh_frame*))\n        _etext = .;\n    } > FLASH\n\n    .ARM.extab :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n    } > FLASH\n\n    /* it's used for C++ exception handling      */\n    /* we need to keep this to avoid overlapping */\n    .ARM.exidx :\n    {\n        __exidx_start = .;\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        __exidx_end = .;\n    } > FLASH\n\n    .data :\n    {\n        _data = ALIGN(., 4);\n        *(vtable)\n        *(.data*)           /*read-write initialized data: initialized global variable*/\n        *(.spix_config*)    /* SPIX configuration functions need to be run from SRAM */\n        *(.flashprog*)      /* Flash program */\n\n\n        /* These array sections are used by __libc_init_array to call static C++ constructors */\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        _edata = ALIGN(., 4);\n    } > SRAM AT>FLASH\n    __load_data = LOADADDR(.data);\n    .bss :\n    {\n        . = ALIGN(4);\n        _bss = .;\n        *(.bss*)     /*read-write zero initialized data: uninitialized global variable*/\n        *(COMMON)\n        _ebss = ALIGN(., 4);\n    } > SRAM\n\n    /* Set stack top to end of RAM, and stack limit move down by\n     * size of stack_dummy section */\n    __StackTop = ORIGIN(SRAM) + LENGTH(SRAM);\n    __StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\n    /* .stack_dummy section doesn't contains any symbols. It is only\n     * used for linker to calculate size of stack sections, and assign\n     * values to stack symbols later */\n    .stack_dummy (COPY):\n    {\n        *(.stack*)\n    } > SRAM\n\n    .heap (COPY):\n    {\n        . = ALIGN(4);\n        PROVIDE ( end = . );\n        PROVIDE ( _end = . );\n        *(.heap*)\n        __HeapLimit = ABSOLUTE(__StackLimit);\n    } > SRAM\n\n    PROVIDE(__stack = __StackTop);\n\n    /* Check if data + heap + stack exceeds RAM limit */\n    ASSERT(__StackLimit >= _ebss, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/maxim/linker/max32651.ld",
    "content": "MEMORY {\n    HEADER (rx): ORIGIN = 0x10000000, LENGTH = 0x200\n    FLASH (rx) : ORIGIN = 0x10000200, LENGTH = 0x002FFE00 /* 3MB flash */\n    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00100000 /* 1MB SRAM */\n}\n\n/* Added Oct 9, 2018 to go to correct reset vector. */\nENTRY(Reset_Handler)\nPROVIDE( _start_SWAP = (((Reset_Handler) >> 24) | (((Reset_Handler) & 0x00FF0000) >> 8) | (((Reset_Handler) & 0x0000FF00) << 8) | ((Reset_Handler) << 24)));\nPROVIDE_HIDDEN( _SLA_Size = _endimage - __end_header );\nPROVIDE( _SLA_Size_SWAP = (((_SLA_Size) >> 24) | (((_SLA_Size) & 0x00FF0000) >> 8) | (((_SLA_Size) & 0x0000FF00) << 8) | ((_SLA_Size) << 24)));\n\n/* Sections Definitions */\nSECTIONS {\n     .sb_sla_header : ALIGN(4)\n    {\n       FILL(0xFF)\n        KEEP(*(.sb_sla_header)) /* Header for ROM code */\n         __end_header = . ;\n        . = ALIGN(512);\n    } > HEADER\n\n    .text :\n    {\n        _text = .;\n        KEEP(*(.isr_vector))\n        *(.text*)    /* program code */\n        *(.rodata*)  /* read-only data: \"const\" */\n\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* C++ Exception handling */\n        KEEP(*(.eh_frame*))\n        _etext = .;\n    } > FLASH\n\n    /* it's used for C++ exception handling      */\n    /* we need to keep this to avoid overlapping */\n    .ARM.exidx :\n    {\n        __exidx_start = .;\n        *(.ARM.exidx*)\n        __exidx_end = .;\n    } > FLASH\n\n    .data :\n    {\n        _data = ALIGN(., 4);\n        *(.data*)           /*read-write initialized data: initialized global variable*/\n        *(.spix_config*)    /* SPIX configuration functions need to be run from SRAM */\n        *(.flashprog*)      /* Flash program */\n\n\n        /* These array sections are used by __libc_init_array to call static C++ constructors */\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        _edata = ALIGN(., 4);\n    } > SRAM AT>FLASH\n    __load_data = LOADADDR(.data);\n    _enddata = LOADADDR(.data)+SIZEOF(.data);\n\n    .sb_sla_trailer : AT(_enddata)\n    {\n        KEEP(*(.sb_sla_trailer))\n        /* Align image with 16 byte boundary to conform to flash encryption block size. */\n        FILL(0xDEADC0DE);\n        /* NOTE: The FILL and ALIGN will not work unless something is written to the section.  So, we use LONG. */\n        LONG(0xDEADC0DE);\n        . = ALIGN(16);\n    }  > FLASH\n    _endimage = LOADADDR(.sb_sla_trailer)+SIZEOF(.sb_sla_trailer);\n    .sig :\n    {\n        KEEP(*(.sig))\n        LONG(0xDEADBEEF);\n\n    }  > FLASH\n    .bss :\n    {\n        . = ALIGN(4);\n        _bss = .;\n        *(.bss*)     /*read-write zero initialized data: uninitialized global variable*/\n        *(COMMON)\n        _ebss = ALIGN(., 4);\n    } > SRAM\n\n    /* Set stack top to end of RAM, and stack limit move down by\n     * size of stack_dummy section */\n    __StackTop = ORIGIN(SRAM) + LENGTH(SRAM);\n    __StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\n    /* .stack_dummy section doesn't contains any symbols. It is only\n     * used for linker to calculate size of stack sections, and assign\n     * values to stack symbols later */\n    .stack_dummy (COPY):\n    {\n        *(.stack*)\n    } > SRAM\n\n    .heap (COPY):\n    {\n        . = ALIGN(4);\n        PROVIDE ( end = . );\n        PROVIDE ( _end = . );\n        *(.heap*)\n        __HeapLimit = ABSOLUTE(__StackLimit);\n    } > SRAM\n\n    PROVIDE(__stack = __StackTop);\n\n    /* Check if data + heap + stack exceeds RAM limit */\n    ASSERT(__StackLimit >= _ebss, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/maxim/linker/max32665.ld",
    "content": "/* SPID and SPIX Sections here are maximum possible sizes */\n/* If used, they should be adjusted for the external Flash/RAM size */\nMEMORY {\n\n    SPIX (rx)  : ORIGIN = 0x08000000,                           LENGTH = 0x08000000\n    FLASH (rx) : ORIGIN = 0x10000000,                           LENGTH = 0x00100000\n    SRAM (rwx)      : ORIGIN = 0x20000000,                      LENGTH = 0x0008C000\n    SPID (rw)       : ORIGIN = 0x80000000,                      LENGTH = 512M\n}\n\n/* Sections Definitions */\nSECTIONS {\n    .text :\n    {\n        _text = .;\n        KEEP(*(.isr_vector))\n        *(.text*)    /* program code */\n        *(.rodata*)  /* read-only data: \"const\" */\n\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        /* C++ Exception handling */\n        KEEP(*(.eh_frame*))\n        _etext = .;\n    } > FLASH\n\n    .ARM.extab :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n    } > FLASH\n\n    /* This section will keep the SPIX data until loaded into the external device */\n    /* Upon initialization of SPIX (user code needs to do this) */\n    .xip_section :\n    {\n        KEEP(*(.xip_section*))\n    } > SPIX AT>FLASH\n\n    __load_start_xip = LOADADDR(.xip_section);\n    __load_length_xip = SIZEOF(.xip_section);\n\n    /* it's used for C++ exception handling      */\n    /* we need to keep this to avoid overlapping */\n    .ARM.exidx :\n    {\n        __exidx_start = .;\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        __exidx_end = .;\n    } > FLASH\n\n    .data :\n    {\n        _data = ALIGN(., 4);\n        *(vtable)\n        *(.data*)           /*read-write initialized data: initialized global variable*/\n        *(.spix_config*)    /* SPIX configuration functions need to be run from SRAM */\n        *(.flashprog*)      /* Flash program */\n\n\n        /* These array sections are used by __libc_init_array to call static C++ constructors */\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        _edata = ALIGN(., 4);\n    } > SRAM AT>FLASH\n    __load_data = LOADADDR(.data);\n\n    .bss :\n    {\n        . = ALIGN(4);\n        _bss = .;\n        *(.bss*)     /*read-write zero initialized data: uninitialized global variable*/\n        *(COMMON)\n        _ebss = ALIGN(., 4);\n    } > SRAM\n\n    /* Setup the stack for Core 1, it will only be used if the user code\n     * includes a definition of Stack_Size_Core1, which defines the space\n     * reserved above the main core's stack for core 1's stack */\n\n    __StackTop_Core1 = ORIGIN(SRAM) + LENGTH(SRAM);\n    __StackLimit_Core1 = DEFINED(Stack_Size_Core1) ? __StackTop_Core1 - Stack_Size_Core1 : __StackTop_Core1;\n\n    /* Set stack top to end of RAM, and stack limit move down by Stack_Size.\n     * If core 1 is used, set the stack to the bottom of Core 1's stack region */\n\n    __StackTop = DEFINED(Stack_Size_Core1) ? __StackLimit_Core1 : ORIGIN(SRAM) + LENGTH(SRAM);\n    __StackLimit = __StackTop - Stack_Size;\n\n    .heap (COPY):\n    {\n        . = ALIGN(4);\n        PROVIDE ( end = . );\n        PROVIDE ( _end = . );\n        *(.heap*)\n        __HeapLimit = ABSOLUTE(__StackLimit);\n    } > SRAM\n\n    PROVIDE(__stack = __StackTop);\n\n    /* Check if data + heap + stack(s) exceeds RAM limit */\n    ASSERT(__StackLimit >= _ebss, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/maxim/linker/max32690.ld",
    "content": "MEMORY {\n    ROM        (rx) : ORIGIN = 0x00000000,    LENGTH = 0x00020000 /* 128kB ROM */\n    FLASH      (rx) : ORIGIN = 0x10000000,    LENGTH = 0x00340000\n    SRAM      (rwx) : ORIGIN = 0x20000000,    LENGTH = 0x00100000\n\n\t/*\n     * Note that CS0/CS1 address mappings may be reversed using MXC_HPC->mbr0 and ->mbr1\n     * The following mappings are selected for simplicity\n     */\n    HPB_CS0 (rwx)  : ORIGIN = 0x60000000, LENGTH = 0x10000000  /* External Hyperbus/Xccelabus chip select 0 */\n    HPB_CS1 (rwx)  : ORIGIN = 0x70000000, LENGTH = 0x10000000  /* External Hyperbus/Xccelabus chip select 1 */\n}\n\nSECTIONS {\n    .rom :\n    {\n        KEEP(*(.rom_vector))\n        *(.rom_handlers*)\n    } > ROM\n\n    .text :\n    {\n        _text = .;\n        KEEP(*(.isr_vector))\n        EXCLUDE_FILE (*riscv.o) *(.text*)    /* program code, exclude RISCV code */\n        *(.rodata*)  /* read-only data: \"const\" */\n\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        /* C++ Exception handling */\n        KEEP(*(.eh_frame*))\n        _etext = .;\n    } > FLASH\n\n    .ARM.extab :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n    } > FLASH\n\n    /* These sections allow code to be compiled/linked for HPB addresses, but reside in\n     * flash until copied by code to the external HPB flash device\n     */\n    .hpb_cs0_section :\n    {\n\t__hpb_cs0_start = ABSOLUTE(.);\n        KEEP(*(.hpb_cs0_section*))\n    } > HPB_CS0 AT>FLASH\n\n    __load_start_hpb_cs0 = LOADADDR(.hpb_cs0_section);\n    __load_length_hpb_cs0 = SIZEOF(.hpb_cs0_section);\n\n    .hpb_cs1_section :\n    {\n    \t__hpb_cs1_start = ABSOLUTE(.);\n        KEEP(*(.hpb_cs1_section*))\n    } > HPB_CS1 AT>FLASH\n\n    __load_start_hpb_cs1 = LOADADDR(.hpb_cs1_section);\n    __load_length_hpb_cs1 = SIZEOF(.hpb_cs1_section);\n\n    /* Binary import */\n    .bin_storage :\n    {\n       FILL(0xFF)\n      _bin_start_ = .;\n      KEEP(*(.bin_storage_img))\n      _bin_end_ = .;\n      . = ALIGN(4);\n    } > FLASH\n\n    /* it's used for C++ exception handling      */\n    /* we need to keep this to avoid overlapping */\n    .ARM.exidx :\n    {\n        __exidx_start = .;\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        __exidx_end = .;\n    } > FLASH\n\n    .data :\n    {\n        _data = ALIGN(., 4);\n        *(vtable)\n        *(.data*)           /*read-write initialized data: initialized global variable*/\n\n        /* These array sections are used by __libc_init_array to call static C++ constructors */\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        /* Run the flash programming functions from SRAM */\n        *(.flashprog)\n\n        _edata = ALIGN(., 4);\n    } > SRAM AT>FLASH\n    __load_data = LOADADDR(.data);\n\n    .bss :\n    {\n        . = ALIGN(4);\n        _bss = .;\n        *(.bss*)     /*read-write zero initialized data: uninitialized global variable*/\n        *(COMMON)\n        _ebss = ALIGN(., 4);\n    } > SRAM\n\n    /* Set stack top to end of RAM, and stack limit move down by\n     * size of stack_dummy section */\n    __StackTop = ORIGIN(SRAM) + LENGTH(SRAM);\n    __StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\n    /* .stack_dummy section doesn't contains any symbols. It is only\n     * used for linker to calculate size of stack sections, and assign\n     * values to stack symbols later */\n    .stack_dummy (COPY):\n    {\n        *(.stack*)\n    } > SRAM\n\n    .heap (COPY):\n    {\n        . = ALIGN(4);\n        PROVIDE ( end = . );\n        PROVIDE ( _end = . );\n        *(.heap*)\n        __HeapLimit = ABSOLUTE(__StackLimit);\n    } > SRAM\n\n    PROVIDE(__stack = __StackTop);\n\n    /* Check if data + heap + stack exceeds RAM limit */\n    ASSERT(__StackLimit >= _ebss, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/maxim/linker/max78002.ld",
    "content": "MEMORY {\n    ROM (rx)   : ORIGIN = 0x00000000, LENGTH = 0x00010000 /* 64 kB ROM */\n    FLASH (rx) : ORIGIN = 0x10000000, LENGTH = 0x00280000 /* 2.5 MB Flash */\n    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00060000 /* 384 kB SRAM */\n    /*CSI2 (rwx) : ORIGIN = 0x2001F000, LENGTH = 0x00001000 4096 B CSI2 Buffer */\n}\n\nSECTIONS {\n    .rom :\n    {\n        KEEP(*(.rom_vector))\n        *(.rom_handlers*)\n    } > ROM\n\n    .text :\n    {\n        _text = .;\n        KEEP(*(.isr_vector))\n        EXCLUDE_FILE (*riscv.o) *(.text*)    /* Program code (exclude RISCV code) */\n        *(.rodata*)  /* read-only data: \"const\" */\n\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n         /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        /* C++ Exception handling */\n        KEEP(*(.eh_frame*))\n        _etext = .;\n    } > FLASH\n\n    .ARM.extab :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n    } > FLASH\n\n    /* Binary import */\n    .bin_storage :\n    {\n       FILL(0xFF)\n      _bin_start_ = .;\n      KEEP(*(.bin_storage_img))\n      _bin_end_ = .;\n      . = ALIGN(4);\n    } > FLASH\n\n    .rom_code :\n    {\n        . = ALIGN(16);\n        _sran_code = .;\n        *(.rom_code_section)\n        _esran_code = .;\n    } > ROM\n\n    .flash_code :\n    {\n        . = ALIGN(16);\n        _sran_code = .;\n        *(.flash_code_section)\n        _esran_code = .;\n    } > FLASH\n\n    .sram_code :\n    {\n        . = ALIGN(16);\n        _sran_code = .;\n        *(.sram_code_section)\n        _esran_code = .;\n    } > SRAM\n\n    /* it's used for C++ exception handling      */\n    /* we need to keep this to avoid overlapping */\n    .ARM.exidx :\n    {\n        __exidx_start = .;\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        __exidx_end = .;\n    } > FLASH\n\n    .data :\n    {\n        _data = ALIGN(., 4);\n        _csi = . + 0x20000;\n        *(vtable)\n        *(.data*)           /*read-write initialized data: initialized global variable*/\n\n\n        /* These array sections are used by __libc_init_array to call static C++ constructors */\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        _edata = ALIGN(., 4);\n\n    } > SRAM AT>FLASH\n    __load_data = LOADADDR(.data);\n\n    .bss :\n    {\n        . = ALIGN(4);\n        _bss = .;\n        *(.bss*)     /*read-write zero initialized data: uninitialized global variable*/\n        *(COMMON)\n        _ebss = ALIGN(., 4);\n    } > SRAM\n\n    .shared :\n    {\n        . = ALIGN(4);\n        _shared = .;\n        *(.mailbox*)\n        . = ALIGN(4);\n        *(.shared*)     /*read-write zero initialized data: uninitialized global variable*/\n        _eshared = ALIGN(., 4);\n    } > SRAM\n    __shared_data = LOADADDR(.shared);\n\n    /* Set stack top to end of RAM, and stack limit move down by\n     * size of stack_dummy section */\n    __StackTop = ORIGIN(SRAM) + LENGTH(SRAM);\n    __StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\n    /* .stack_dummy section doesn't contains any symbols. It is only\n     * used for linker to calculate size of stack sections, and assign\n     * values to stack symbols later */\n    .stack_dummy (COPY):\n    {\n        *(.stack*)\n    } > SRAM\n\n    .heap (COPY):\n    {\n        . = ALIGN(4);\n        PROVIDE ( end = . );\n        PROVIDE ( _end = . );\n        *(.heap*)\n        __HeapLimit = ABSOLUTE(__StackLimit);\n    } > SRAM\n\n    PROVIDE(__stack = __StackTop);\n\n    /* Check if data + heap + stack exceeds RAM limit */\n    ASSERT(__StackLimit >= _ebss, \"region RAM overflowed with stack\")\n\n    /* Section used by RISCV loader projects.  See RISCV_LOAD documentation in the build system. */\n    .riscv_flash :\n    {\n        /* Align address to mod 256 with a small offset. This is required to match the flash page size.*/\n        . = ALIGN(256); /* ALIGN operatator is used here.  Note that (. & 0x1FFFFF00) was used in the past, but a strange bug was seen on Windows where the & did not behave as expected.*/\n        . += 0x100;\n        _riscv_boot = .;\n        KEEP(*riscv.o (.text*))\n    } > FLASH\n}\n"
  },
  {
    "path": "hw/bsp/mcx/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa153/board.cmake",
    "content": "set(MCU_VARIANT MCXA153)\nset(MCU_FAMILY MCXA)\nset(MCU_CORE MCXA153)\n\nset(JLINK_DEVICE MCXA153_M33)\nset(PYOCD_TARGET MCXA153)\nset(NXPLINK_DEVICE MCXA153:MCXA153)\n\nset(PORT 0)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MCXA153VLH\n    BOARD_TUD_RHPORT=0\n    BOARD_TUD_MAX_SPEED=OPT_MODE_FULL_SPEED\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\n  target_sources(${TARGET} PRIVATE\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/pin_mux.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${SDK_DIR}/${MCU_FAMILY}/periph\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa153/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Freedom MCXA153\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-MCXA153\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_GPIO              GPIO3\n#define LED_CLK               kCLOCK_GateGPIO3\n#define LED_PIN               12 //red\n#define LED_STATE_ON          0\n\n// ISP button\n#define BUTTON_GPIO           GPIO3\n#define BUTTON_CLK            kCLOCK_GateGPIO3\n#define BUTTON_PIN            29 //sw2\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              LPUART0\n\nstatic inline void board_uart_init_clock(void) {\n  /* attach 12 MHz clock to LPUART0 (debug console) */\n  CLOCK_SetClockDiv(kCLOCK_DivLPUART0, 1u);\n  CLOCK_AttachClk(kFRO12M_to_LPUART0);\n\n  RESET_PeripheralReset(kLPUART0_RST_SHIFT_RSTn);\n}\n\n// XTAL\n#define XTAL0_CLK_HZ          (24 * 1000 * 1000U)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa153/board.mk",
    "content": "MCU_VARIANT = MCXA153\nMCU_FAMILY = MCXA\nMCU_CORE = MCXA153\nPORT = 0\n\nCPU_CORE = cortex-m33-nodsp-nofp\nCFLAGS += \\\n\t-DCPU_MCXA153VLH \\\n\t-DCFG_TUSB_MCU=OPT_MCU_MCXA15 \\\n\t-DCFG_EXAMPLE_VIDEO_READONLY\n\nSRC_C += \\\n  ${BOARD_PATH}/clock_config.c \\\n  ${BOARD_PATH}/pin_mux.c\n\nINC += \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/periph\n\nJLINK_DEVICE = MCXA153\nPYOCD_TARGET = MCXA153\n\n# flash using pyocd\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa153/clock_config.c",
    "content": "/*\n * Copyright 2025 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to setup clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up wait states of the flash.\n *\n * 3. Set up all dividers.\n *\n * 4. Set up all selectors to provide selected clocks.\n *\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v18.0\nprocessor: MCXA153\npackage_id: MCXA153VLH\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: FRDM-MCXA153\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_clock.h\"\n#include \"clock_config.h\"\n#include \"fsl_spc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n/* System clock frequency. */\nextern uint32_t SystemCoreClock;\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockFRO96M();\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO12M\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CPU_clock.outFreq, value: 12 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: MAIN_clock.outFreq, value: 12 MHz}\n- {id: Slow_clock.outFreq, value: 3 MHz}\n- {id: System_clock.outFreq, value: 12 MHz}\n- {id: TRACE_clock.outFreq, value: 12 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\n- {id: WWDT0_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: SCGMode, value: SIRC}\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n- {id: SCG.SCSSEL.sel, value: SCG.SIRC}\n- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO12M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO12M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n\n    /*!< Set up system dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U);               /* !< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO12M */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO12M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kCPU_CLK_to_TRACE);                    /* !< Switch TRACE to CPU_CLK */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivTRACE, 1U);                /* !< Set TRACECLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivWWDT0, 1U);                /* !< Set WWDT0CLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\n}\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO24M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO24M\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CPU_clock.outFreq, value: 24 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_DIV_clock.outFreq, value: 48 MHz}\n- {id: FRO_HF_clock.outFreq, value: 48 MHz}\n- {id: MAIN_clock.outFreq, value: 48 MHz}\n- {id: Slow_clock.outFreq, value: 6 MHz}\n- {id: System_clock.outFreq, value: 24 MHz}\n- {id: TRACE_clock.outFreq, value: 24 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\n- {id: WWDT0_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n- {id: SYSCON.AHBCLKDIV.scale, value: '2'}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO24M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO24M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO24M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO24M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n\n    /*!< Set up system dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 2U);               /* !< Set AHBCLKDIV divider to value 2 */\n    CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U);           /* !< Set FROHFDIV divider to value 1 */\n\n    CLOCK_SetupFROHFClocking(48000000U);               /*!< Enable FRO HF(48MHz) output */\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO_HF */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO24M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kCPU_CLK_to_TRACE);                    /* !< Switch TRACE to CPU_CLK */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPSPI0);                /* !< Switch LPSPI0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPSPI1);                /* !< Switch LPSPI1 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPI2C0);                /* !< Switch LPI2C0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART0);               /* !< Switch LPUART0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART1);               /* !< Switch LPUART1 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART2);               /* !< Switch LPUART2 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPTMR0);                /* !< Switch LPTMR0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_I3C0FCLK);              /* !< Switch I3C0FCLK to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_CMP0);                  /* !< Switch CMP0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_CMP1);                  /* !< Switch CMP1 to FRO_HF_DIV */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivTRACE, 1U);                /* !< Set TRACECLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivWWDT0, 1U);                /* !< Set WWDT0CLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO24M_CORE_CLOCK;\n}\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO48M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO48M\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CPU_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_DIV_clock.outFreq, value: 48 MHz}\n- {id: FRO_HF_clock.outFreq, value: 48 MHz}\n- {id: MAIN_clock.outFreq, value: 48 MHz}\n- {id: Slow_clock.outFreq, value: 12 MHz}\n- {id: System_clock.outFreq, value: 48 MHz}\n- {id: TRACE_clock.outFreq, value: 48 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\n- {id: WWDT0_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO48M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO48M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO48M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO48M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n\n    /*!< Set up system dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U);               /* !< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U);           /* !< Set FROHFDIV divider to value 1 */\n\n    CLOCK_SetupFROHFClocking(48000000U);               /*!< Enable FRO HF(48MHz) output */\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO_HF */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO48M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kCPU_CLK_to_TRACE);                    /* !< Switch TRACE to CPU_CLK */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPSPI0);                /* !< Switch LPSPI0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPSPI1);                /* !< Switch LPSPI1 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPI2C0);                /* !< Switch LPI2C0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART0);               /* !< Switch LPUART0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART1);               /* !< Switch LPUART1 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART2);               /* !< Switch LPUART2 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPTMR0);                /* !< Switch LPTMR0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_I3C0FCLK);              /* !< Switch I3C0FCLK to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_CMP0);                  /* !< Switch CMP0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_CMP1);                  /* !< Switch CMP1 to FRO_HF_DIV */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivTRACE, 1U);                /* !< Set TRACECLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivWWDT0, 1U);                /* !< Set WWDT0CLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO48M_CORE_CLOCK;\n}\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO64M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO64M\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CPU_clock.outFreq, value: 64 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_DIV_clock.outFreq, value: 64 MHz}\n- {id: FRO_HF_clock.outFreq, value: 64 MHz}\n- {id: MAIN_clock.outFreq, value: 64 MHz}\n- {id: Slow_clock.outFreq, value: 16 MHz}\n- {id: System_clock.outFreq, value: 64 MHz}\n- {id: TRACE_clock.outFreq, value: 64 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\n- {id: WWDT0_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: VDD_CORE, value: voltage_1v1}\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FROHFDIV.scale, value: '1', locked: true}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n- {id: SYSCON.AHBCLKDIV.scale, value: '1', locked: true}\nsources:\n- {id: SCG.FIRC.outFreq, value: 64 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO64M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO64M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO64M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO64M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P1V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n\n    /*!< Set up system dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U);               /* !< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U);           /* !< Set FROHFDIV divider to value 1 */\n\n    CLOCK_SetupFROHFClocking(64000000U);               /*!< Enable FRO HF(64MHz) output */\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO_HF */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO64M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P1V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kCPU_CLK_to_TRACE);                    /* !< Switch TRACE to CPU_CLK */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPSPI0);                /* !< Switch LPSPI0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPSPI1);                /* !< Switch LPSPI1 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPI2C0);                /* !< Switch LPI2C0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART0);               /* !< Switch LPUART0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART1);               /* !< Switch LPUART1 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART2);               /* !< Switch LPUART2 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPTMR0);                /* !< Switch LPTMR0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_I3C0FCLK);              /* !< Switch I3C0FCLK to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_CMP0);                  /* !< Switch CMP0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_CMP1);                  /* !< Switch CMP1 to FRO_HF_DIV */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivTRACE, 1U);                /* !< Set TRACECLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivWWDT0, 1U);                /* !< Set WWDT0CLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO64M_CORE_CLOCK;\n}\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO96M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO96M\ncalled_from_default_init: true\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CPU_clock.outFreq, value: 96 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_DIV_clock.outFreq, value: 96 MHz}\n- {id: FRO_HF_clock.outFreq, value: 96 MHz}\n- {id: MAIN_clock.outFreq, value: 96 MHz}\n- {id: Slow_clock.outFreq, value: 24 MHz}\n- {id: System_clock.outFreq, value: 96 MHz}\n- {id: TRACE_clock.outFreq, value: 96 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\n- {id: WWDT0_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: VDD_CORE, value: voltage_1v1}\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\nsources:\n- {id: SCG.FIRC.outFreq, value: 96 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO96M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO96M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO96M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO96M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x2U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P1V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n\n    /*!< Set up system dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U);               /* !< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U);           /* !< Set FROHFDIV divider to value 1 */\n\n    CLOCK_SetupFROHFClocking(96000000U);               /*!< Enable FRO HF(96MHz) output */\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO_HF */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO96M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x2U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P1V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kCPU_CLK_to_TRACE);                    /* !< Switch TRACE to CPU_CLK */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPSPI0);                /* !< Switch LPSPI0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPSPI1);                /* !< Switch LPSPI1 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPI2C0);                /* !< Switch LPI2C0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART0);               /* !< Switch LPUART0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART1);               /* !< Switch LPUART1 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPUART2);               /* !< Switch LPUART2 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_LPTMR0);                /* !< Switch LPTMR0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_I3C0FCLK);              /* !< Switch I3C0FCLK to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_CMP0);                  /* !< Switch CMP0 to FRO_HF_DIV */\n    CLOCK_AttachClk(kFRO_HF_DIV_to_CMP1);                  /* !< Switch CMP1 to FRO_HF_DIV */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivTRACE, 1U);                /* !< Set TRACECLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivWWDT0, 1U);                /* !< Set WWDT0CLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO96M_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa153/clock_config.h",
    "content": "/*\n * Copyright 2025 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK           12000000U  /*!< Core clock frequency: 12000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO12M_ADC0_CLOCK              0UL            /* Clock consumers of ADC0_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO12M_CLK16K_0_CLOCK          0UL            /* Clock consumers of CLK16K_0_clock output : CMP0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO12M_CLK16K_1_CLOCK          0UL            /* Clock consumers of CLK16K_1_clock output : CMP1, LPTMR0, WAKETIMER0 */\n#define BOARD_BOOTCLOCKFRO12M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_CLK_1M_CLOCK            1000000UL      /* Clock consumers of CLK_1M_clock output : CMC */\n#define BOARD_BOOTCLOCKFRO12M_CLK_48M_CLOCK           0UL            /* Clock consumers of CLK_48M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_CLK_IN_CLOCK            0UL            /* Clock consumers of CLK_IN_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_CMP0FDIV_CLOCK          0UL            /* Clock consumers of CMP0FDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO12M_CMP0RRDIV_CLOCK         0UL            /* Clock consumers of CMP0RRDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO12M_CMP1FDIV_CLOCK          0UL            /* Clock consumers of CMP1FDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO12M_CMP1RRDIV_CLOCK         0UL            /* Clock consumers of CMP1RRDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO12M_CPU_CLOCK               12000000UL     /* Clock consumers of CPU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO12M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO12M_FREQME_REFERENCE_CLOCK  0UL            /* Clock consumers of FREQME_reference_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO12M_FREQME_TARGET_CLOCK     0UL            /* Clock consumers of FREQME_target_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO12M_FRO_12M_CLOCK           12000000UL     /* Clock consumers of FRO_12M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_FRO_HF_DIV_CLOCK        0UL            /* Clock consumers of FRO_HF_DIV_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_FRO_HF_CLOCK            0UL            /* Clock consumers of FRO_HF_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_I3C_FCLK_CLOCK          0UL            /* Clock consumers of I3C_FCLK_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO12M_I3C_SLOW_TC_CLOCK       0UL            /* Clock consumers of I3C_SLOW_TC_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO12M_I3C_SLOW_CLOCK          0UL            /* Clock consumers of I3C_SLOW_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO12M_LPI2C0_CLOCK            0UL            /* Clock consumers of LPI2C0_clock output : LPI2C0 */\n#define BOARD_BOOTCLOCKFRO12M_LPSPI0_CLOCK            0UL            /* Clock consumers of LPSPI0_clock output : LPSPI0 */\n#define BOARD_BOOTCLOCKFRO12M_LPSPI1_CLOCK            0UL            /* Clock consumers of LPSPI1_clock output : LPSPI1 */\n#define BOARD_BOOTCLOCKFRO12M_LPTMR0_CLOCK            0UL            /* Clock consumers of LPTMR0_clock output : LPTMR0 */\n#define BOARD_BOOTCLOCKFRO12M_LPUART0_CLOCK           0UL            /* Clock consumers of LPUART0_clock output : LPUART0 */\n#define BOARD_BOOTCLOCKFRO12M_LPUART1_CLOCK           0UL            /* Clock consumers of LPUART1_clock output : LPUART1 */\n#define BOARD_BOOTCLOCKFRO12M_LPUART2_CLOCK           0UL            /* Clock consumers of LPUART2_clock output : LPUART2 */\n#define BOARD_BOOTCLOCKFRO12M_MAIN_CLOCK              12000000UL     /* Clock consumers of MAIN_clock output : FLEXPWM0 */\n#define BOARD_BOOTCLOCKFRO12M_OSTIMER_CLOCK           0UL            /* Clock consumers of OSTIMER_clock output : OSTIMER0 */\n#define BOARD_BOOTCLOCKFRO12M_FIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.FIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.SIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_SLOW_CLOCK              3000000UL      /* Clock consumers of Slow_clock output : AOI0, CMC, CMP0, LPTMR0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO12M_SYSTEM_CLOCK            12000000UL     /* Clock consumers of System_clock output : ADC0, CMP1, CTIMER0, CTIMER1, CTIMER2, DMA0, FLEXPWM0, FREQME0, GPIO0, GPIO1, GPIO2, GPIO3, I3C0, INPUTMUX0, LPI2C0, LPSPI0, LPSPI1, LPUART0, LPUART1, LPUART2, OSTIMER0, PORT0, PORT1, PORT2, PORT3, QDC0, SWD, SysTick, USB0, UTICK0, WWDT0 */\n#define BOARD_BOOTCLOCKFRO12M_TRACE_CLOCK             12000000UL     /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO12M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0 */\n#define BOARD_BOOTCLOCKFRO12M_UTICK_CLOCK             1000000UL      /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO12M_WUU_CLOCK               0UL            /* Clock consumers of WUU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO12M_WWDT0_CLOCK             1000000UL      /* Clock consumers of WWDT0_clock output : WWDT0 */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO12M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO24M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO24M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO24M_CORE_CLOCK           24000000U  /*!< Core clock frequency: 24000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO24M_ADC0_CLOCK              0UL            /* Clock consumers of ADC0_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO24M_CLK16K_0_CLOCK          0UL            /* Clock consumers of CLK16K_0_clock output : CMP0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO24M_CLK16K_1_CLOCK          0UL            /* Clock consumers of CLK16K_1_clock output : CMP1, LPTMR0, WAKETIMER0 */\n#define BOARD_BOOTCLOCKFRO24M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_CLK_1M_CLOCK            1000000UL      /* Clock consumers of CLK_1M_clock output : CMC */\n#define BOARD_BOOTCLOCKFRO24M_CLK_48M_CLOCK           48000000UL     /* Clock consumers of CLK_48M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_CLK_IN_CLOCK            0UL            /* Clock consumers of CLK_IN_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_CMP0FDIV_CLOCK          0UL            /* Clock consumers of CMP0FDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO24M_CMP0RRDIV_CLOCK         0UL            /* Clock consumers of CMP0RRDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO24M_CMP1FDIV_CLOCK          0UL            /* Clock consumers of CMP1FDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO24M_CMP1RRDIV_CLOCK         0UL            /* Clock consumers of CMP1RRDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO24M_CPU_CLOCK               24000000UL     /* Clock consumers of CPU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO24M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO24M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO24M_FREQME_REFERENCE_CLOCK  0UL            /* Clock consumers of FREQME_reference_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO24M_FREQME_TARGET_CLOCK     0UL            /* Clock consumers of FREQME_target_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO24M_FRO_12M_CLOCK           12000000UL     /* Clock consumers of FRO_12M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_FRO_HF_DIV_CLOCK        48000000UL     /* Clock consumers of FRO_HF_DIV_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_FRO_HF_CLOCK            48000000UL     /* Clock consumers of FRO_HF_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_I3C_FCLK_CLOCK          0UL            /* Clock consumers of I3C_FCLK_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO24M_I3C_SLOW_TC_CLOCK       0UL            /* Clock consumers of I3C_SLOW_TC_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO24M_I3C_SLOW_CLOCK          0UL            /* Clock consumers of I3C_SLOW_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO24M_LPI2C0_CLOCK            0UL            /* Clock consumers of LPI2C0_clock output : LPI2C0 */\n#define BOARD_BOOTCLOCKFRO24M_LPSPI0_CLOCK            0UL            /* Clock consumers of LPSPI0_clock output : LPSPI0 */\n#define BOARD_BOOTCLOCKFRO24M_LPSPI1_CLOCK            0UL            /* Clock consumers of LPSPI1_clock output : LPSPI1 */\n#define BOARD_BOOTCLOCKFRO24M_LPTMR0_CLOCK            0UL            /* Clock consumers of LPTMR0_clock output : LPTMR0 */\n#define BOARD_BOOTCLOCKFRO24M_LPUART0_CLOCK           0UL            /* Clock consumers of LPUART0_clock output : LPUART0 */\n#define BOARD_BOOTCLOCKFRO24M_LPUART1_CLOCK           0UL            /* Clock consumers of LPUART1_clock output : LPUART1 */\n#define BOARD_BOOTCLOCKFRO24M_LPUART2_CLOCK           0UL            /* Clock consumers of LPUART2_clock output : LPUART2 */\n#define BOARD_BOOTCLOCKFRO24M_MAIN_CLOCK              48000000UL     /* Clock consumers of MAIN_clock output : FLEXPWM0 */\n#define BOARD_BOOTCLOCKFRO24M_OSTIMER_CLOCK           0UL            /* Clock consumers of OSTIMER_clock output : OSTIMER0 */\n#define BOARD_BOOTCLOCKFRO24M_FIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.FIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_SIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.SIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_SLOW_CLOCK              6000000UL      /* Clock consumers of Slow_clock output : AOI0, CMC, CMP0, LPTMR0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO24M_SYSTEM_CLOCK            24000000UL     /* Clock consumers of System_clock output : ADC0, CMP1, CTIMER0, CTIMER1, CTIMER2, DMA0, FLEXPWM0, FREQME0, GPIO0, GPIO1, GPIO2, GPIO3, I3C0, INPUTMUX0, LPI2C0, LPSPI0, LPSPI1, LPUART0, LPUART1, LPUART2, OSTIMER0, PORT0, PORT1, PORT2, PORT3, QDC0, SWD, SysTick, USB0, UTICK0, WWDT0 */\n#define BOARD_BOOTCLOCKFRO24M_TRACE_CLOCK             24000000UL     /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO24M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0 */\n#define BOARD_BOOTCLOCKFRO24M_UTICK_CLOCK             1000000UL      /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO24M_WUU_CLOCK               0UL            /* Clock consumers of WUU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO24M_WWDT0_CLOCK             1000000UL      /* Clock consumers of WWDT0_clock output : WWDT0 */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO24M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO24M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO48M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO48M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO48M_CORE_CLOCK           48000000U  /*!< Core clock frequency: 48000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO48M_ADC0_CLOCK              0UL            /* Clock consumers of ADC0_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO48M_CLK16K_0_CLOCK          0UL            /* Clock consumers of CLK16K_0_clock output : CMP0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO48M_CLK16K_1_CLOCK          0UL            /* Clock consumers of CLK16K_1_clock output : CMP1, LPTMR0, WAKETIMER0 */\n#define BOARD_BOOTCLOCKFRO48M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_CLK_1M_CLOCK            1000000UL      /* Clock consumers of CLK_1M_clock output : CMC */\n#define BOARD_BOOTCLOCKFRO48M_CLK_48M_CLOCK           48000000UL     /* Clock consumers of CLK_48M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_CLK_IN_CLOCK            0UL            /* Clock consumers of CLK_IN_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_CMP0FDIV_CLOCK          0UL            /* Clock consumers of CMP0FDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO48M_CMP0RRDIV_CLOCK         0UL            /* Clock consumers of CMP0RRDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO48M_CMP1FDIV_CLOCK          0UL            /* Clock consumers of CMP1FDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO48M_CMP1RRDIV_CLOCK         0UL            /* Clock consumers of CMP1RRDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO48M_CPU_CLOCK               48000000UL     /* Clock consumers of CPU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO48M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO48M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO48M_FREQME_REFERENCE_CLOCK  0UL            /* Clock consumers of FREQME_reference_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO48M_FREQME_TARGET_CLOCK     0UL            /* Clock consumers of FREQME_target_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO48M_FRO_12M_CLOCK           12000000UL     /* Clock consumers of FRO_12M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_FRO_HF_DIV_CLOCK        48000000UL     /* Clock consumers of FRO_HF_DIV_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_FRO_HF_CLOCK            48000000UL     /* Clock consumers of FRO_HF_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_I3C_FCLK_CLOCK          0UL            /* Clock consumers of I3C_FCLK_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO48M_I3C_SLOW_TC_CLOCK       0UL            /* Clock consumers of I3C_SLOW_TC_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO48M_I3C_SLOW_CLOCK          0UL            /* Clock consumers of I3C_SLOW_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO48M_LPI2C0_CLOCK            0UL            /* Clock consumers of LPI2C0_clock output : LPI2C0 */\n#define BOARD_BOOTCLOCKFRO48M_LPSPI0_CLOCK            0UL            /* Clock consumers of LPSPI0_clock output : LPSPI0 */\n#define BOARD_BOOTCLOCKFRO48M_LPSPI1_CLOCK            0UL            /* Clock consumers of LPSPI1_clock output : LPSPI1 */\n#define BOARD_BOOTCLOCKFRO48M_LPTMR0_CLOCK            0UL            /* Clock consumers of LPTMR0_clock output : LPTMR0 */\n#define BOARD_BOOTCLOCKFRO48M_LPUART0_CLOCK           0UL            /* Clock consumers of LPUART0_clock output : LPUART0 */\n#define BOARD_BOOTCLOCKFRO48M_LPUART1_CLOCK           0UL            /* Clock consumers of LPUART1_clock output : LPUART1 */\n#define BOARD_BOOTCLOCKFRO48M_LPUART2_CLOCK           0UL            /* Clock consumers of LPUART2_clock output : LPUART2 */\n#define BOARD_BOOTCLOCKFRO48M_MAIN_CLOCK              48000000UL     /* Clock consumers of MAIN_clock output : FLEXPWM0 */\n#define BOARD_BOOTCLOCKFRO48M_OSTIMER_CLOCK           0UL            /* Clock consumers of OSTIMER_clock output : OSTIMER0 */\n#define BOARD_BOOTCLOCKFRO48M_FIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.FIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_SIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.SIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_SLOW_CLOCK              12000000UL     /* Clock consumers of Slow_clock output : AOI0, CMC, CMP0, LPTMR0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO48M_SYSTEM_CLOCK            48000000UL     /* Clock consumers of System_clock output : ADC0, CMP1, CTIMER0, CTIMER1, CTIMER2, DMA0, FLEXPWM0, FREQME0, GPIO0, GPIO1, GPIO2, GPIO3, I3C0, INPUTMUX0, LPI2C0, LPSPI0, LPSPI1, LPUART0, LPUART1, LPUART2, OSTIMER0, PORT0, PORT1, PORT2, PORT3, QDC0, SWD, SysTick, USB0, UTICK0, WWDT0 */\n#define BOARD_BOOTCLOCKFRO48M_TRACE_CLOCK             48000000UL     /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO48M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0 */\n#define BOARD_BOOTCLOCKFRO48M_UTICK_CLOCK             1000000UL      /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO48M_WUU_CLOCK               0UL            /* Clock consumers of WUU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO48M_WWDT0_CLOCK             1000000UL      /* Clock consumers of WWDT0_clock output : WWDT0 */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO48M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO48M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO64M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO64M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO64M_CORE_CLOCK           64000000U  /*!< Core clock frequency: 64000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO64M_ADC0_CLOCK              0UL            /* Clock consumers of ADC0_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO64M_CLK16K_0_CLOCK          0UL            /* Clock consumers of CLK16K_0_clock output : CMP0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO64M_CLK16K_1_CLOCK          0UL            /* Clock consumers of CLK16K_1_clock output : CMP1, LPTMR0, WAKETIMER0 */\n#define BOARD_BOOTCLOCKFRO64M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_CLK_1M_CLOCK            1000000UL      /* Clock consumers of CLK_1M_clock output : CMC */\n#define BOARD_BOOTCLOCKFRO64M_CLK_48M_CLOCK           48000000UL     /* Clock consumers of CLK_48M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_CLK_IN_CLOCK            0UL            /* Clock consumers of CLK_IN_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_CMP0FDIV_CLOCK          0UL            /* Clock consumers of CMP0FDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO64M_CMP0RRDIV_CLOCK         0UL            /* Clock consumers of CMP0RRDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO64M_CMP1FDIV_CLOCK          0UL            /* Clock consumers of CMP1FDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO64M_CMP1RRDIV_CLOCK         0UL            /* Clock consumers of CMP1RRDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO64M_CPU_CLOCK               64000000UL     /* Clock consumers of CPU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO64M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO64M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO64M_FREQME_REFERENCE_CLOCK  0UL            /* Clock consumers of FREQME_reference_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO64M_FREQME_TARGET_CLOCK     0UL            /* Clock consumers of FREQME_target_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO64M_FRO_12M_CLOCK           12000000UL     /* Clock consumers of FRO_12M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_FRO_HF_DIV_CLOCK        64000000UL     /* Clock consumers of FRO_HF_DIV_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_FRO_HF_CLOCK            64000000UL     /* Clock consumers of FRO_HF_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_I3C_FCLK_CLOCK          0UL            /* Clock consumers of I3C_FCLK_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO64M_I3C_SLOW_TC_CLOCK       0UL            /* Clock consumers of I3C_SLOW_TC_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO64M_I3C_SLOW_CLOCK          0UL            /* Clock consumers of I3C_SLOW_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO64M_LPI2C0_CLOCK            0UL            /* Clock consumers of LPI2C0_clock output : LPI2C0 */\n#define BOARD_BOOTCLOCKFRO64M_LPSPI0_CLOCK            0UL            /* Clock consumers of LPSPI0_clock output : LPSPI0 */\n#define BOARD_BOOTCLOCKFRO64M_LPSPI1_CLOCK            0UL            /* Clock consumers of LPSPI1_clock output : LPSPI1 */\n#define BOARD_BOOTCLOCKFRO64M_LPTMR0_CLOCK            0UL            /* Clock consumers of LPTMR0_clock output : LPTMR0 */\n#define BOARD_BOOTCLOCKFRO64M_LPUART0_CLOCK           0UL            /* Clock consumers of LPUART0_clock output : LPUART0 */\n#define BOARD_BOOTCLOCKFRO64M_LPUART1_CLOCK           0UL            /* Clock consumers of LPUART1_clock output : LPUART1 */\n#define BOARD_BOOTCLOCKFRO64M_LPUART2_CLOCK           0UL            /* Clock consumers of LPUART2_clock output : LPUART2 */\n#define BOARD_BOOTCLOCKFRO64M_MAIN_CLOCK              64000000UL     /* Clock consumers of MAIN_clock output : FLEXPWM0 */\n#define BOARD_BOOTCLOCKFRO64M_OSTIMER_CLOCK           0UL            /* Clock consumers of OSTIMER_clock output : OSTIMER0 */\n#define BOARD_BOOTCLOCKFRO64M_FIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.FIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_SIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.SIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_SLOW_CLOCK              16000000UL     /* Clock consumers of Slow_clock output : AOI0, CMC, CMP0, LPTMR0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO64M_SYSTEM_CLOCK            64000000UL     /* Clock consumers of System_clock output : ADC0, CMP1, CTIMER0, CTIMER1, CTIMER2, DMA0, FLEXPWM0, FREQME0, GPIO0, GPIO1, GPIO2, GPIO3, I3C0, INPUTMUX0, LPI2C0, LPSPI0, LPSPI1, LPUART0, LPUART1, LPUART2, OSTIMER0, PORT0, PORT1, PORT2, PORT3, QDC0, SWD, SysTick, USB0, UTICK0, WWDT0 */\n#define BOARD_BOOTCLOCKFRO64M_TRACE_CLOCK             64000000UL     /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO64M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0 */\n#define BOARD_BOOTCLOCKFRO64M_UTICK_CLOCK             1000000UL      /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO64M_WUU_CLOCK               0UL            /* Clock consumers of WUU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO64M_WWDT0_CLOCK             1000000UL      /* Clock consumers of WWDT0_clock output : WWDT0 */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO64M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO64M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO96M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO96M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO96M_CORE_CLOCK           96000000U  /*!< Core clock frequency: 96000000Hz */\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKFRO96M_ADC0_CLOCK              0UL            /* Clock consumers of ADC0_clock output : ADC0 */\n#define BOARD_BOOTCLOCKFRO96M_CLK16K_0_CLOCK          0UL            /* Clock consumers of CLK16K_0_clock output : CMP0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO96M_CLK16K_1_CLOCK          0UL            /* Clock consumers of CLK16K_1_clock output : CMP1, LPTMR0, WAKETIMER0 */\n#define BOARD_BOOTCLOCKFRO96M_CLKOUT_CLOCK            0UL            /* Clock consumers of CLKOUT_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_CLK_1M_CLOCK            1000000UL      /* Clock consumers of CLK_1M_clock output : CMC */\n#define BOARD_BOOTCLOCKFRO96M_CLK_48M_CLOCK           48000000UL     /* Clock consumers of CLK_48M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_CLK_IN_CLOCK            0UL            /* Clock consumers of CLK_IN_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_CMP0FDIV_CLOCK          0UL            /* Clock consumers of CMP0FDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO96M_CMP0RRDIV_CLOCK         0UL            /* Clock consumers of CMP0RRDIV_clock output : CMP0 */\n#define BOARD_BOOTCLOCKFRO96M_CMP1FDIV_CLOCK          0UL            /* Clock consumers of CMP1FDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO96M_CMP1RRDIV_CLOCK         0UL            /* Clock consumers of CMP1RRDIV_clock output : CMP1 */\n#define BOARD_BOOTCLOCKFRO96M_CPU_CLOCK               96000000UL     /* Clock consumers of CPU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_CTIMER0_CLOCK           0UL            /* Clock consumers of CTIMER0_clock output : CTIMER0 */\n#define BOARD_BOOTCLOCKFRO96M_CTIMER1_CLOCK           0UL            /* Clock consumers of CTIMER1_clock output : CTIMER1 */\n#define BOARD_BOOTCLOCKFRO96M_CTIMER2_CLOCK           0UL            /* Clock consumers of CTIMER2_clock output : CTIMER2 */\n#define BOARD_BOOTCLOCKFRO96M_FREQME_REFERENCE_CLOCK  0UL            /* Clock consumers of FREQME_reference_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO96M_FREQME_TARGET_CLOCK     0UL            /* Clock consumers of FREQME_target_clock output : FREQME0 */\n#define BOARD_BOOTCLOCKFRO96M_FRO_12M_CLOCK           12000000UL     /* Clock consumers of FRO_12M_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_FRO_HF_DIV_CLOCK        96000000UL     /* Clock consumers of FRO_HF_DIV_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_FRO_HF_CLOCK            96000000UL     /* Clock consumers of FRO_HF_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_I3C_FCLK_CLOCK          0UL            /* Clock consumers of I3C_FCLK_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO96M_I3C_SLOW_TC_CLOCK       0UL            /* Clock consumers of I3C_SLOW_TC_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO96M_I3C_SLOW_CLOCK          0UL            /* Clock consumers of I3C_SLOW_clock output : I3C0 */\n#define BOARD_BOOTCLOCKFRO96M_LPI2C0_CLOCK            0UL            /* Clock consumers of LPI2C0_clock output : LPI2C0 */\n#define BOARD_BOOTCLOCKFRO96M_LPSPI0_CLOCK            0UL            /* Clock consumers of LPSPI0_clock output : LPSPI0 */\n#define BOARD_BOOTCLOCKFRO96M_LPSPI1_CLOCK            0UL            /* Clock consumers of LPSPI1_clock output : LPSPI1 */\n#define BOARD_BOOTCLOCKFRO96M_LPTMR0_CLOCK            0UL            /* Clock consumers of LPTMR0_clock output : LPTMR0 */\n#define BOARD_BOOTCLOCKFRO96M_LPUART0_CLOCK           0UL            /* Clock consumers of LPUART0_clock output : LPUART0 */\n#define BOARD_BOOTCLOCKFRO96M_LPUART1_CLOCK           0UL            /* Clock consumers of LPUART1_clock output : LPUART1 */\n#define BOARD_BOOTCLOCKFRO96M_LPUART2_CLOCK           0UL            /* Clock consumers of LPUART2_clock output : LPUART2 */\n#define BOARD_BOOTCLOCKFRO96M_MAIN_CLOCK              96000000UL     /* Clock consumers of MAIN_clock output : FLEXPWM0 */\n#define BOARD_BOOTCLOCKFRO96M_OSTIMER_CLOCK           0UL            /* Clock consumers of OSTIMER_clock output : OSTIMER0 */\n#define BOARD_BOOTCLOCKFRO96M_FIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.FIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_SIRC_TRIM_CLOCK         0UL            /* Clock consumers of SCG.SIRC_TRIM_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_SLOW_CLOCK              24000000UL     /* Clock consumers of Slow_clock output : AOI0, CMC, CMP0, LPTMR0, WAKETIMER0, WUU0 */\n#define BOARD_BOOTCLOCKFRO96M_SYSTEM_CLOCK            96000000UL     /* Clock consumers of System_clock output : ADC0, CMP1, CTIMER0, CTIMER1, CTIMER2, DMA0, FLEXPWM0, FREQME0, GPIO0, GPIO1, GPIO2, GPIO3, I3C0, INPUTMUX0, LPI2C0, LPSPI0, LPSPI1, LPUART0, LPUART1, LPUART2, OSTIMER0, PORT0, PORT1, PORT2, PORT3, QDC0, SWD, SysTick, USB0, UTICK0, WWDT0 */\n#define BOARD_BOOTCLOCKFRO96M_TRACE_CLOCK             96000000UL     /* Clock consumers of TRACE_clock output : SWD */\n#define BOARD_BOOTCLOCKFRO96M_USB0_CLOCK              0UL            /* Clock consumers of USB0_clock output : USB0 */\n#define BOARD_BOOTCLOCKFRO96M_UTICK_CLOCK             1000000UL      /* Clock consumers of UTICK_clock output : UTICK0 */\n#define BOARD_BOOTCLOCKFRO96M_WUU_CLOCK               0UL            /* Clock consumers of WUU_clock output : N/A */\n#define BOARD_BOOTCLOCKFRO96M_WWDT0_CLOCK             1000000UL      /* Clock consumers of WWDT0_clock output : WWDT0 */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO96M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO96M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa153/frdm_mcxa153.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"FRDM-MCXA153\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19 http://mcuxpresso.nxp.com/XSD/mex_configuration_19.xsd\" uuid=\"39087bef-8f98-40a9-aaf4-e556fb7a1ce1\" version=\"19\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_19\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>MCXA153</processor>\n      <package>MCXA153VLH</package>\n      <board>FRDM-MCXA153</board>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"cm33_core0\">\n         <core name=\"Cortex-M33\" id=\"cm33_core0\" description=\"M33 core\"/>\n      </cores>\n      <description></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      <custom_copyright>\n         <text>/*\n * Copyright 2025 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n</text>\n         <enabled>true</enabled>\n      </custom_copyright>\n      <update_include_paths>true</update_include_paths>\n      <enable_parallel_routing>true</enable_parallel_routing>\n      <generate_registers_defines>false</generate_registers_defines>\n   </preferences>\n   <tools>\n      <pins name=\"Pins\" version=\"17.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/pin_mux.c\" update_enabled=\"true\"/>\n            <file path=\"board/pin_mux.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <pins_profile>\n            <processor_version>25.09.10</processor_version>\n            <external_user_signals>\n               <properties/>\n            </external_user_signals>\n         </pins_profile>\n         <functions_list>\n            <function name=\"BOARD_InitDEBUG_UARTPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"LPUART0\" description=\"Peripheral LPUART0 signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitDEBUG_UARTPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"LPUART0\" signal=\"RX\" pin_num=\"51\" pin_signal=\"P0_2/TDO/SWO/LPUART0_RXD/LPSPI0_SCK/CT0_MAT0/UTICK_CAP0/I3C0_PUR\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"LPUART0\" signal=\"TX\" pin_num=\"52\" pin_signal=\"P0_3/TDI/LPUART0_TXD/LPSPI0_SDO/CT0_MAT1/UTICK_CAP1/CMP0_OUT/CMP1_IN1\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitSWD_DEBUGPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>false</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"Peripheral\" resourceId=\"SWD\" description=\"Peripheral SWD signals are routed in the Pins Tool, but the peripheral is not initialized in the Peripherals Tool.\" problem_level=\"1\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"initialized\" evaluation=\"equal\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitSWD_DEBUGPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"SWD\" signal=\"SWCLK\" pin_num=\"50\" pin_signal=\"P0_1/TCLK/SWCLK/LPUART0_CTS_B/LPSPI0_SDI/CT_INP1\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWDIO\" pin_num=\"49\" pin_signal=\"P0_0/TMS/SWDIO/LPUART0_RTS_B/LPSPI0_PCS0/CT_INP0\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"SWD\" signal=\"SWO\" pin_num=\"51\" pin_signal=\"P0_2/TDO/SWO/LPUART0_RXD/LPSPI0_SCK/CT0_MAT0/UTICK_CAP0/I3C0_PUR\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"high\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitLEDsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.gpio\" description=\"Pins initialization requires the GPIO Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitLEDsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO3\" signal=\"GPIO, 13\" pin_num=\"37\" pin_signal=\"P3_13/LPUART2_CTS_B/CT1_MAT3/PWM0_X1\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO3\" signal=\"GPIO, 12\" pin_num=\"38\" pin_signal=\"P3_12/LPUART2_RTS_B/CT1_MAT2/PWM0_X0\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO3\" signal=\"GPIO, 0\" pin_num=\"46\" pin_signal=\"P3_0/WUU0_IN22/TRIG_IN0/CT_INP16/PWM0_A0\">\n                     <pin_features>\n                        <pin_feature name=\"direction\" value=\"OUTPUT\"/>\n                        <pin_feature name=\"gpio_init_state\" value=\"true\"/>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"disable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n            <function name=\"BOARD_InitBUTTONsPins\">\n               <description>Configures pin routing and optionally pin electrical features.</description>\n               <options>\n                  <callFromInitBoot>true</callFromInitBoot>\n                  <coreID>cm33_core0</coreID>\n                  <enableClock>true</enableClock>\n               </options>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Pins initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.port\" description=\"Pins initialization requires the PORT Driver in the project.\" problem_level=\"2\" source=\"Pins:BOARD_InitBUTTONsPins\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <pins>\n                  <pin peripheral=\"GPIO1\" signal=\"GPIO, 7\" pin_num=\"1\" pin_signal=\"P1_7/WUU0_IN9/TRIG_OUT2/LPUART2_CTS_B/CT_INP7/ADC0_A23\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"down\"/>\n                        <pin_feature name=\"pull_enable\" value=\"disable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO1\" signal=\"GPIO, 29\" pin_num=\"8\" pin_signal=\"P1_29/RESET_B/SPC_LPREQ\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"enable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"passive_filter\" value=\"enable\"/>\n                        <pin_feature name=\"pull_value\" value=\"low\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n                  <pin peripheral=\"GPIO3\" signal=\"GPIO, 29\" pin_num=\"32\" pin_signal=\"P3_29/WUU0_IN27/ISPMODE_N/CT_INP3/ADC0_A14\">\n                     <pin_features>\n                        <pin_feature name=\"slew_rate\" value=\"fast\"/>\n                        <pin_feature name=\"open_drain\" value=\"disable\"/>\n                        <pin_feature name=\"drive_strength\" value=\"low\"/>\n                        <pin_feature name=\"pull_select\" value=\"up\"/>\n                        <pin_feature name=\"pull_enable\" value=\"enable\"/>\n                        <pin_feature name=\"input_buffer\" value=\"enable\"/>\n                        <pin_feature name=\"invert_input\" value=\"normal\"/>\n                     </pin_features>\n                  </pin>\n               </pins>\n            </function>\n         </functions_list>\n      </pins>\n      <clocks name=\"Clocks\" version=\"18.0\" enabled=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/clock_config.c\" update_enabled=\"true\"/>\n            <file path=\"board/clock_config.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <clocks_profile>\n            <processor_version>25.09.10</processor_version>\n         </clocks_profile>\n         <clock_configurations>\n            <clock_configuration name=\"BOARD_BootClockFRO12M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.mcx_spc\" description=\"Clocks initialization requires the MCX_SPC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO12M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources/>\n               <clock_outputs>\n                  <clock_output id=\"CLK_1M_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CPU_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_12M_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MAIN_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Slow_clock.outFreq\" value=\"3 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UTICK_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"WWDT0_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"SCGMode\" value=\"SIRC\" locked=\"false\"/>\n                  <setting id=\"MRCC.FREQMEREFCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.FREQMETARGETCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.OSTIMERCLKSEL.sel\" value=\"VBAT.CLK16K_1\" locked=\"false\"/>\n                  <setting id=\"SCG.SCSSEL.sel\" value=\"SCG.SIRC\" locked=\"false\"/>\n                  <setting id=\"SCG_FIRCCSR_FIRCEN_CFG\" value=\"Disabled\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockFRO24M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO24M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO24M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.mcx_spc\" description=\"Clocks initialization requires the MCX_SPC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO24M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources/>\n               <clock_outputs>\n                  <clock_output id=\"CLK_1M_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_48M_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CPU_clock.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_12M_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_HF_DIV_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_HF_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MAIN_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Slow_clock.outFreq\" value=\"6 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_clock.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UTICK_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"WWDT0_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"MRCC.FREQMEREFCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.FREQMETARGETCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.OSTIMERCLKSEL.sel\" value=\"VBAT.CLK16K_1\" locked=\"false\"/>\n                  <setting id=\"SYSCON.AHBCLKDIV.scale\" value=\"2\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockFRO48M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO48M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO48M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.mcx_spc\" description=\"Clocks initialization requires the MCX_SPC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO48M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources/>\n               <clock_outputs>\n                  <clock_output id=\"CLK_1M_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_48M_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CPU_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_12M_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_HF_DIV_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_HF_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MAIN_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Slow_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UTICK_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"WWDT0_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"MRCC.FREQMEREFCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.FREQMETARGETCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.OSTIMERCLKSEL.sel\" value=\"VBAT.CLK16K_1\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockFRO64M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO64M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO64M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.mcx_spc\" description=\"Clocks initialization requires the MCX_SPC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO64M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SCG.FIRC.outFreq\" value=\"64 MHz\" locked=\"false\" enabled=\"false\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"CLK_1M_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_48M_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CPU_clock.outFreq\" value=\"64 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_12M_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_HF_DIV_clock.outFreq\" value=\"64 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_HF_clock.outFreq\" value=\"64 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MAIN_clock.outFreq\" value=\"64 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Slow_clock.outFreq\" value=\"16 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"64 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_clock.outFreq\" value=\"64 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UTICK_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"WWDT0_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"VDD_CORE\" value=\"voltage_1v1\" locked=\"false\"/>\n                  <setting id=\"MRCC.FREQMEREFCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.FREQMETARGETCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.FROHFDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"MRCC.OSTIMERCLKSEL.sel\" value=\"VBAT.CLK16K_1\" locked=\"false\"/>\n                  <setting id=\"SYSCON.AHBCLKDIV.scale\" value=\"1\" locked=\"true\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockFRO96M\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\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_BootClockFRO96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.mcx_spc\" description=\"Clocks initialization requires the MCX_SPC Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockFRO96M\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33_core0\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"SCG.FIRC.outFreq\" value=\"96 MHz\" locked=\"false\" enabled=\"false\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"CLK_1M_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CLK_48M_clock.outFreq\" value=\"48 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"CPU_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_12M_clock.outFreq\" value=\"12 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_HF_DIV_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"FRO_HF_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"MAIN_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"Slow_clock.outFreq\" value=\"24 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"System_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"TRACE_clock.outFreq\" value=\"96 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"UTICK_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"WWDT0_clock.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"VDD_CORE\" value=\"voltage_1v1\" locked=\"false\"/>\n                  <setting id=\"MRCC.FREQMEREFCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.FREQMETARGETCLKSEL.sel\" value=\"MRCC.aoi0_out0\" locked=\"false\"/>\n                  <setting id=\"MRCC.OSTIMERCLKSEL.sel\" value=\"VBAT.CLK16K_1\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"3.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\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=\"true\" update_project_code=\"true\">\n         <generated_project_files>\n            <file path=\"board/peripherals.c\" update_enabled=\"true\"/>\n            <file path=\"board/peripherals.h\" update_enabled=\"true\"/>\n         </generated_project_files>\n         <peripherals_profile>\n            <processor_version>25.09.10</processor_version>\n         </peripherals_profile>\n         <functional_groups>\n            <functional_group name=\"BOARD_InitPeripherals\" uuid=\"e7964cfd-63b7-4756-a1af-71a53c49bda7\" called_from_default_init=\"true\" id_prefix=\"\" core=\"cm33_core0\">\n               <description></description>\n               <options/>\n               <dependencies/>\n               <instances>\n                  <instance name=\"NVIC\" uuid=\"6948572f-4bff-423f-8e78-3f0608580bb3\" type=\"nvic\" type_id=\"nvic\" mode=\"general\" peripheral=\"NVIC\" enabled=\"true\" comment=\"\" custom_name_enabled=\"false\" editing_lock=\"false\">\n                     <config_set name=\"nvic\">\n                        <array name=\"interrupt_table\"/>\n                        <array name=\"interrupts\"/>\n                     </config_set>\n                  </instance>\n               </instances>\n            </functional_group>\n         </functional_groups>\n         <components>\n            <component name=\"system\" uuid=\"3700167a-8497-4b9d-ad19-c395e5e33267\" type_id=\"system\">\n               <config_set_global name=\"global_system_definitions\">\n                  <setting name=\"user_definitions\" value=\"\"/>\n                  <setting name=\"user_includes\" value=\"\"/>\n                  <setting name=\"global_init\" value=\"\"/>\n               </config_set_global>\n            </component>\n            <component name=\"msg\" uuid=\"faf79cc1-e0a0-4bf8-a803-42cf14e2a60a\" type_id=\"msg\">\n               <config_set_global name=\"global_messages\"/>\n            </component>\n            <component name=\"generic_can\" uuid=\"f1cb80d2-97a1-4bdd-ab65-0d3d8493019c\" type_id=\"generic_can\">\n               <config_set_global name=\"global_can\"/>\n            </component>\n            <component name=\"uart_cmsis_common\" uuid=\"a17f12aa-b188-417b-a499-c22892686ae2\" type_id=\"uart_cmsis_common\">\n               <config_set_global name=\"global_USART_CMSIS_common\" quick_selection=\"default\"/>\n            </component>\n            <component name=\"generic_uart\" uuid=\"96c6481f-affb-44c4-9d6f-ebc972fcae38\" type_id=\"generic_uart\">\n               <config_set_global name=\"global_uart\"/>\n            </component>\n            <component name=\"generic_enet\" uuid=\"44df8b34-f20e-449a-8d2d-2cba12faf3f7\" type_id=\"generic_enet\">\n               <config_set_global name=\"global_enet\"/>\n            </component>\n            <component name=\"gpio_adapter_common\" uuid=\"2fe36bae-ef17-4655-9cf5-91cac6de7288\" type_id=\"gpio_adapter_common\">\n               <config_set_global name=\"global_gpio_adapter_common\" quick_selection=\"default\"/>\n            </component>\n         </components>\n      </periphs>\n      <tee name=\"TEE\" version=\"10.0\" enabled=\"false\" update_project_code=\"true\">\n         <generated_project_files/>\n         <tee_profile>\n            <processor_version>N/A</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa153/pin_mux.c",
    "content": "/*\n * Copyright 2025 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: MCXA153\npackage_id: MCXA153VLH\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: FRDM-MCXA153\nexternal_user_signals: {}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_port.h\"\n#include \"fsl_gpio.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitDEBUG_UARTPins();\n    BOARD_InitLEDsPins();\n    BOARD_InitBUTTONsPins();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '51', peripheral: LPUART0, signal: RX, pin_signal: P0_2/TDO/SWO/LPUART0_RXD/LPSPI0_SCK/CT0_MAT0/UTICK_CAP0/I3C0_PUR, slew_rate: fast, open_drain: disable,\n    drive_strength: high, pull_select: down, pull_enable: disable, input_buffer: enable, invert_input: normal}\n  - {pin_num: '52', peripheral: LPUART0, signal: TX, pin_signal: P0_3/TDI/LPUART0_TXD/LPSPI0_SDO/CT0_MAT1/UTICK_CAP1/CMP0_OUT/CMP1_IN1, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: up, pull_enable: enable, input_buffer: enable, invert_input: normal}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitDEBUG_UARTPins(void)\n{\n    /* Write to PORT0: Peripheral clock is enabled */\n    CLOCK_EnableClock(kCLOCK_GatePORT0);\n    /* LPUART0 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kLPUART0_RST_SHIFT_RSTn);\n    /* PORT0 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kPORT0_RST_SHIFT_RSTn);\n\n    const port_pin_config_t DEBUG_UART_RX = {/* Internal pull-up/down resistor is disabled */\n                                             .pullSelect = kPORT_PullDisable,\n                                             /* Low internal pull resistor value is selected. */\n                                             .pullValueSelect = kPORT_LowPullResistor,\n                                             /* Fast slew rate is configured */\n                                             .slewRate = kPORT_FastSlewRate,\n                                             /* Passive input filter is disabled */\n                                             .passiveFilterEnable = kPORT_PassiveFilterDisable,\n                                             /* Open drain output is disabled */\n                                             .openDrainEnable = kPORT_OpenDrainDisable,\n                                             /* High drive strength is configured */\n                                             .driveStrength = kPORT_HighDriveStrength,\n                                             /* Normal drive strength is configured */\n                                             .driveStrength1 = kPORT_NormalDriveStrength,\n                                             /* Pin is configured as LPUART0_RXD */\n                                             .mux = kPORT_MuxAlt2,\n                                             /* Digital input enabled */\n                                             .inputBuffer = kPORT_InputBufferEnable,\n                                             /* Digital input is not inverted */\n                                             .invertInput = kPORT_InputNormal,\n                                             /* Pin Control Register fields [15:0] are not locked */\n                                             .lockRegister = kPORT_UnlockRegister};\n    /* PORT0_2 (pin 51) is configured as LPUART0_RXD */\n    PORT_SetPinConfig(BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN, &DEBUG_UART_RX);\n\n    const port_pin_config_t DEBUG_UART_TX = {/* Internal pull-up resistor is enabled */\n                                             .pullSelect = kPORT_PullUp,\n                                             /* Low internal pull resistor value is selected. */\n                                             .pullValueSelect = kPORT_LowPullResistor,\n                                             /* Fast slew rate is configured */\n                                             .slewRate = kPORT_FastSlewRate,\n                                             /* Passive input filter is disabled */\n                                             .passiveFilterEnable = kPORT_PassiveFilterDisable,\n                                             /* Open drain output is disabled */\n                                             .openDrainEnable = kPORT_OpenDrainDisable,\n                                             /* Low drive strength is configured */\n                                             .driveStrength = kPORT_LowDriveStrength,\n                                             /* Normal drive strength is configured */\n                                             .driveStrength1 = kPORT_NormalDriveStrength,\n                                             /* Pin is configured as LPUART0_TXD */\n                                             .mux = kPORT_MuxAlt2,\n                                             /* Digital input enabled */\n                                             .inputBuffer = kPORT_InputBufferEnable,\n                                             /* Digital input is not inverted */\n                                             .invertInput = kPORT_InputNormal,\n                                             /* Pin Control Register fields [15:0] are not locked */\n                                             .lockRegister = kPORT_UnlockRegister};\n    /* PORT0_3 (pin 52) is configured as LPUART0_TXD */\n    PORT_SetPinConfig(BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT, BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN, &DEBUG_UART_TX);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSWD_DEBUGPins:\n- options: {callFromInitBoot: 'false', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '50', peripheral: SWD, signal: SWCLK, pin_signal: P0_1/TCLK/SWCLK/LPUART0_CTS_B/LPSPI0_SDI/CT_INP1, slew_rate: fast, open_drain: disable, drive_strength: low,\n    pull_select: down, pull_enable: enable, input_buffer: enable, invert_input: normal}\n  - {pin_num: '49', peripheral: SWD, signal: SWDIO, pin_signal: P0_0/TMS/SWDIO/LPUART0_RTS_B/LPSPI0_PCS0/CT_INP0, slew_rate: fast, open_drain: disable, drive_strength: high,\n    pull_select: up, pull_enable: enable, input_buffer: enable, invert_input: normal}\n  - {pin_num: '51', peripheral: SWD, signal: SWO, pin_signal: P0_2/TDO/SWO/LPUART0_RXD/LPSPI0_SCK/CT0_MAT0/UTICK_CAP0/I3C0_PUR, slew_rate: fast, open_drain: disable,\n    drive_strength: high, pull_select: down, pull_enable: disable, input_buffer: enable, invert_input: normal}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSWD_DEBUGPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitSWD_DEBUGPins(void)\n{\n    /* Write to PORT0: Peripheral clock is enabled */\n    CLOCK_EnableClock(kCLOCK_GatePORT0);\n    /* PORT0 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kPORT0_RST_SHIFT_RSTn);\n    /* LPUART0 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kLPUART0_RST_SHIFT_RSTn);\n\n    const port_pin_config_t DEBUG_SWD_SWDIO = {/* Internal pull-up resistor is enabled */\n                                               .pullSelect = kPORT_PullUp,\n                                               /* Low internal pull resistor value is selected. */\n                                               .pullValueSelect = kPORT_LowPullResistor,\n                                               /* Fast slew rate is configured */\n                                               .slewRate = kPORT_FastSlewRate,\n                                               /* Passive input filter is disabled */\n                                               .passiveFilterEnable = kPORT_PassiveFilterDisable,\n                                               /* Open drain output is disabled */\n                                               .openDrainEnable = kPORT_OpenDrainDisable,\n                                               /* High drive strength is configured */\n                                               .driveStrength = kPORT_HighDriveStrength,\n                                               /* Normal drive strength is configured */\n                                               .driveStrength1 = kPORT_NormalDriveStrength,\n                                               /* Pin is configured as SWDIO */\n                                               .mux = kPORT_MuxAlt1,\n                                               /* Digital input enabled */\n                                               .inputBuffer = kPORT_InputBufferEnable,\n                                               /* Digital input is not inverted */\n                                               .invertInput = kPORT_InputNormal,\n                                               /* Pin Control Register fields [15:0] are not locked */\n                                               .lockRegister = kPORT_UnlockRegister};\n    /* PORT0_0 (pin 49) is configured as SWDIO */\n    PORT_SetPinConfig(BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN, &DEBUG_SWD_SWDIO);\n\n    const port_pin_config_t DEBUG_SWD_SWDCLK = {/* Internal pull-down resistor is enabled */\n                                                .pullSelect = kPORT_PullDown,\n                                                /* Low internal pull resistor value is selected. */\n                                                .pullValueSelect = kPORT_LowPullResistor,\n                                                /* Fast slew rate is configured */\n                                                .slewRate = kPORT_FastSlewRate,\n                                                /* Passive input filter is disabled */\n                                                .passiveFilterEnable = kPORT_PassiveFilterDisable,\n                                                /* Open drain output is disabled */\n                                                .openDrainEnable = kPORT_OpenDrainDisable,\n                                                /* Low drive strength is configured */\n                                                .driveStrength = kPORT_LowDriveStrength,\n                                                /* Normal drive strength is configured */\n                                                .driveStrength1 = kPORT_NormalDriveStrength,\n                                                /* Pin is configured as SWCLK */\n                                                .mux = kPORT_MuxAlt1,\n                                                /* Digital input enabled */\n                                                .inputBuffer = kPORT_InputBufferEnable,\n                                                /* Digital input is not inverted */\n                                                .invertInput = kPORT_InputNormal,\n                                                /* Pin Control Register fields [15:0] are not locked */\n                                                .lockRegister = kPORT_UnlockRegister};\n    /* PORT0_1 (pin 50) is configured as SWCLK */\n    PORT_SetPinConfig(BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN, &DEBUG_SWD_SWDCLK);\n\n    const port_pin_config_t DEBUG_UART_RX = {/* Internal pull-up/down resistor is disabled */\n                                             .pullSelect = kPORT_PullDisable,\n                                             /* Low internal pull resistor value is selected. */\n                                             .pullValueSelect = kPORT_LowPullResistor,\n                                             /* Fast slew rate is configured */\n                                             .slewRate = kPORT_FastSlewRate,\n                                             /* Passive input filter is disabled */\n                                             .passiveFilterEnable = kPORT_PassiveFilterDisable,\n                                             /* Open drain output is disabled */\n                                             .openDrainEnable = kPORT_OpenDrainDisable,\n                                             /* High drive strength is configured */\n                                             .driveStrength = kPORT_HighDriveStrength,\n                                             /* Normal drive strength is configured */\n                                             .driveStrength1 = kPORT_NormalDriveStrength,\n                                             /* Pin is configured as SWO */\n                                             .mux = kPORT_MuxAlt1,\n                                             /* Digital input enabled */\n                                             .inputBuffer = kPORT_InputBufferEnable,\n                                             /* Digital input is not inverted */\n                                             .invertInput = kPORT_InputNormal,\n                                             /* Pin Control Register fields [15:0] are not locked */\n                                             .lockRegister = kPORT_UnlockRegister};\n    /* PORT0_2 (pin 51) is configured as SWO */\n    PORT_SetPinConfig(BOARD_INITSWD_DEBUGPINS_DEBUG_UART_RX_PORT, BOARD_INITSWD_DEBUGPINS_DEBUG_UART_RX_PIN, &DEBUG_UART_RX);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLEDsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '37', peripheral: GPIO3, signal: 'GPIO, 13', pin_signal: P3_13/LPUART2_CTS_B/CT1_MAT3/PWM0_X1, direction: OUTPUT, gpio_init_state: 'true', slew_rate: fast,\n    open_drain: disable, drive_strength: low, pull_select: up, pull_enable: disable, input_buffer: enable, invert_input: normal}\n  - {pin_num: '38', peripheral: GPIO3, signal: 'GPIO, 12', pin_signal: P3_12/LPUART2_RTS_B/CT1_MAT2/PWM0_X0, direction: OUTPUT, gpio_init_state: 'true', slew_rate: fast,\n    open_drain: disable, drive_strength: low, pull_select: up, pull_enable: disable, input_buffer: enable, invert_input: normal}\n  - {pin_num: '46', peripheral: GPIO3, signal: 'GPIO, 0', pin_signal: P3_0/WUU0_IN22/TRIG_IN0/CT_INP16/PWM0_A0, direction: OUTPUT, gpio_init_state: 'true', slew_rate: fast,\n    open_drain: disable, drive_strength: low, pull_select: up, pull_enable: disable, passive_filter: disable, input_buffer: enable, invert_input: normal}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLEDsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitLEDsPins(void)\n{\n    /* Write to GPIO3: Peripheral clock is enabled */\n    CLOCK_EnableClock(kCLOCK_GateGPIO3);\n    /* Write to PORT3: Peripheral clock is enabled */\n    CLOCK_EnableClock(kCLOCK_GatePORT3);\n    /* GPIO3 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kGPIO3_RST_SHIFT_RSTn);\n    /* PORT3 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kPORT3_RST_SHIFT_RSTn);\n\n    gpio_pin_config_t LED_BLUE_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO3_0 (pin 46)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_BLUE_GPIO, BOARD_INITLEDSPINS_LED_BLUE_PIN, &LED_BLUE_config);\n\n    gpio_pin_config_t LED_RED_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO3_12 (pin 38)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_RED_GPIO, BOARD_INITLEDSPINS_LED_RED_PIN, &LED_RED_config);\n\n    gpio_pin_config_t LED_GREEN_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO3_13 (pin 37)  */\n    GPIO_PinInit(BOARD_INITLEDSPINS_LED_GREEN_GPIO, BOARD_INITLEDSPINS_LED_GREEN_PIN, &LED_GREEN_config);\n\n    /* PORT3_0 (pin 46) is configured as P3_0 */\n    PORT_SetPinMux(BOARD_INITLEDSPINS_LED_BLUE_PORT, BOARD_INITLEDSPINS_LED_BLUE_PIN, kPORT_MuxAlt0);\n\n    PORT3->PCR[0] =\n        ((PORT3->PCR[0] &\n          /* Mask bits to zero which are setting */\n          (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_SRE_MASK | PORT_PCR_PFE_MASK | PORT_PCR_ODE_MASK | PORT_PCR_DSE_MASK | PORT_PCR_IBE_MASK | PORT_PCR_INV_MASK)))\n\n         /* Pull Select: Enables internal pullup resistor. */\n         | PORT_PCR_PS(PCR_PS_ps1)\n\n         /* Pull Enable: Disables. */\n         | PORT_PCR_PE(PCR_PE_pe0)\n\n         /* Slew Rate Enable: Fast. */\n         | PORT_PCR_SRE(PCR_SRE_sre0)\n\n         /* Passive Filter Enable: Disables. */\n         | PORT_PCR_PFE(PCR_PFE_pfe0)\n\n         /* Open Drain Enable: Disables. */\n         | PORT_PCR_ODE(PCR_ODE_ode0)\n\n         /* Drive Strength Enable: Low. */\n         | PORT_PCR_DSE(PCR_DSE_dse0)\n\n         /* Input Buffer Enable: Enables. */\n         | PORT_PCR_IBE(PCR_IBE_ibe1)\n\n         /* Invert Input: Does not invert. */\n         | PORT_PCR_INV(PCR_INV_inv0));\n\n    /* PORT3_12 (pin 38) is configured as P3_12 */\n    PORT_SetPinMux(BOARD_INITLEDSPINS_LED_RED_PORT, BOARD_INITLEDSPINS_LED_RED_PIN, kPORT_MuxAlt0);\n\n    PORT3->PCR[12] =\n        ((PORT3->PCR[12] &\n          /* Mask bits to zero which are setting */\n          (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_SRE_MASK | PORT_PCR_ODE_MASK | PORT_PCR_DSE_MASK | PORT_PCR_IBE_MASK | PORT_PCR_INV_MASK)))\n\n         /* Pull Select: Enables internal pullup resistor. */\n         | PORT_PCR_PS(PCR_PS_ps1)\n\n         /* Pull Enable: Disables. */\n         | PORT_PCR_PE(PCR_PE_pe0)\n\n         /* Slew Rate Enable: Fast. */\n         | PORT_PCR_SRE(PCR_SRE_sre0)\n\n         /* Open Drain Enable: Disables. */\n         | PORT_PCR_ODE(PCR_ODE_ode0)\n\n         /* Drive Strength Enable: Low. */\n         | PORT_PCR_DSE(PCR_DSE_dse0)\n\n         /* Input Buffer Enable: Enables. */\n         | PORT_PCR_IBE(PCR_IBE_ibe1)\n\n         /* Invert Input: Does not invert. */\n         | PORT_PCR_INV(PCR_INV_inv0));\n\n    /* PORT3_13 (pin 37) is configured as P3_13 */\n    PORT_SetPinMux(BOARD_INITLEDSPINS_LED_GREEN_PORT, BOARD_INITLEDSPINS_LED_GREEN_PIN, kPORT_MuxAlt0);\n\n    PORT3->PCR[13] =\n        ((PORT3->PCR[13] &\n          /* Mask bits to zero which are setting */\n          (~(PORT_PCR_PS_MASK | PORT_PCR_PE_MASK | PORT_PCR_SRE_MASK | PORT_PCR_ODE_MASK | PORT_PCR_DSE_MASK | PORT_PCR_IBE_MASK | PORT_PCR_INV_MASK)))\n\n         /* Pull Select: Enables internal pullup resistor. */\n         | PORT_PCR_PS(PCR_PS_ps1)\n\n         /* Pull Enable: Disables. */\n         | PORT_PCR_PE(PCR_PE_pe0)\n\n         /* Slew Rate Enable: Fast. */\n         | PORT_PCR_SRE(PCR_SRE_sre0)\n\n         /* Open Drain Enable: Disables. */\n         | PORT_PCR_ODE(PCR_ODE_ode0)\n\n         /* Drive Strength Enable: Low. */\n         | PORT_PCR_DSE(PCR_DSE_dse0)\n\n         /* Input Buffer Enable: Enables. */\n         | PORT_PCR_IBE(PCR_IBE_ibe1)\n\n         /* Invert Input: Does not invert. */\n         | PORT_PCR_INV(PCR_INV_inv0));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitBUTTONsPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '1', peripheral: GPIO1, signal: 'GPIO, 7', pin_signal: P1_7/WUU0_IN9/TRIG_OUT2/LPUART2_CTS_B/CT_INP7/ADC0_A23, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: down, pull_enable: disable, input_buffer: enable, invert_input: normal}\n  - {pin_num: '8', peripheral: GPIO1, signal: 'GPIO, 29', pin_signal: P1_29/RESET_B/SPC_LPREQ, slew_rate: fast, open_drain: enable, drive_strength: low, pull_select: up,\n    pull_enable: enable, passive_filter: enable, pull_value: low, input_buffer: enable, invert_input: normal}\n  - {pin_num: '32', peripheral: GPIO3, signal: 'GPIO, 29', pin_signal: P3_29/WUU0_IN27/ISPMODE_N/CT_INP3/ADC0_A14, slew_rate: fast, open_drain: disable, drive_strength: low,\n    pull_select: up, pull_enable: enable, input_buffer: enable, invert_input: normal}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBUTTONsPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBUTTONsPins(void)\n{\n    /* Write to PORT1: Peripheral clock is enabled */\n    CLOCK_EnableClock(kCLOCK_GatePORT1);\n    /* Write to PORT3: Peripheral clock is enabled */\n    CLOCK_EnableClock(kCLOCK_GatePORT3);\n    /* GPIO1 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kGPIO1_RST_SHIFT_RSTn);\n    /* PORT1 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kPORT1_RST_SHIFT_RSTn);\n    /* GPIO3 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kGPIO3_RST_SHIFT_RSTn);\n    /* PORT3 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kPORT3_RST_SHIFT_RSTn);\n\n    const port_pin_config_t SW1 = {/* Internal pull-up resistor is enabled */\n                                   .pullSelect = kPORT_PullUp,\n                                   /* Low internal pull resistor value is selected. */\n                                   .pullValueSelect = kPORT_LowPullResistor,\n                                   /* Fast slew rate is configured */\n                                   .slewRate = kPORT_FastSlewRate,\n                                   /* Passive input filter is enabled */\n                                   .passiveFilterEnable = kPORT_PassiveFilterEnable,\n                                   /* Open drain output is enabled */\n                                   .openDrainEnable = kPORT_OpenDrainEnable,\n                                   /* Low drive strength is configured */\n                                   .driveStrength = kPORT_LowDriveStrength,\n                                   /* Normal drive strength is configured */\n                                   .driveStrength1 = kPORT_NormalDriveStrength,\n                                   /* Pin is configured as P1_29 */\n                                   .mux = kPORT_MuxAlt0,\n                                   /* Digital input enabled */\n                                   .inputBuffer = kPORT_InputBufferEnable,\n                                   /* Digital input is not inverted */\n                                   .invertInput = kPORT_InputNormal,\n                                   /* Pin Control Register fields [15:0] are not locked */\n                                   .lockRegister = kPORT_UnlockRegister};\n    /* PORT1_29 (pin 8) is configured as P1_29 */\n    PORT_SetPinConfig(BOARD_INITBUTTONSPINS_SW1_PORT, BOARD_INITBUTTONSPINS_SW1_PIN, &SW1);\n\n    const port_pin_config_t SW3 = {/* Internal pull-up/down resistor is disabled */\n                                   .pullSelect = kPORT_PullDisable,\n                                   /* Low internal pull resistor value is selected. */\n                                   .pullValueSelect = kPORT_LowPullResistor,\n                                   /* Fast slew rate is configured */\n                                   .slewRate = kPORT_FastSlewRate,\n                                   /* Passive input filter is disabled */\n                                   .passiveFilterEnable = kPORT_PassiveFilterDisable,\n                                   /* Open drain output is disabled */\n                                   .openDrainEnable = kPORT_OpenDrainDisable,\n                                   /* Low drive strength is configured */\n                                   .driveStrength = kPORT_LowDriveStrength,\n                                   /* Normal drive strength is configured */\n                                   .driveStrength1 = kPORT_NormalDriveStrength,\n                                   /* Pin is configured as P1_7 */\n                                   .mux = kPORT_MuxAlt0,\n                                   /* Digital input enabled */\n                                   .inputBuffer = kPORT_InputBufferEnable,\n                                   /* Digital input is not inverted */\n                                   .invertInput = kPORT_InputNormal,\n                                   /* Pin Control Register fields [15:0] are not locked */\n                                   .lockRegister = kPORT_UnlockRegister};\n    /* PORT1_7 (pin 1) is configured as P1_7 */\n    PORT_SetPinConfig(BOARD_INITBUTTONSPINS_SW3_PORT, BOARD_INITBUTTONSPINS_SW3_PIN, &SW3);\n\n    const port_pin_config_t ISP = {/* Internal pull-up resistor is enabled */\n                                   .pullSelect = kPORT_PullUp,\n                                   /* Low internal pull resistor value is selected. */\n                                   .pullValueSelect = kPORT_LowPullResistor,\n                                   /* Fast slew rate is configured */\n                                   .slewRate = kPORT_FastSlewRate,\n                                   /* Passive input filter is disabled */\n                                   .passiveFilterEnable = kPORT_PassiveFilterDisable,\n                                   /* Open drain output is disabled */\n                                   .openDrainEnable = kPORT_OpenDrainDisable,\n                                   /* Low drive strength is configured */\n                                   .driveStrength = kPORT_LowDriveStrength,\n                                   /* Normal drive strength is configured */\n                                   .driveStrength1 = kPORT_NormalDriveStrength,\n                                   /* Pin is configured as P3_29 */\n                                   .mux = kPORT_MuxAlt0,\n                                   /* Digital input enabled */\n                                   .inputBuffer = kPORT_InputBufferEnable,\n                                   /* Digital input is not inverted */\n                                   .invertInput = kPORT_InputNormal,\n                                   /* Pin Control Register fields [15:0] are not locked */\n                                   .lockRegister = kPORT_UnlockRegister};\n    /* PORT3_29 (pin 32) is configured as P3_29 */\n    PORT_SetPinConfig(BOARD_INITBUTTONSPINS_ISP_PORT, BOARD_INITBUTTONSPINS_ISP_PIN, &ISP);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa153/pin_mux.h",
    "content": "/*\n * Copyright 2025 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/*! @name PORT0_2 (number 51), P0_2/SWO/J25[3]/J18[6]\n  @{ */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PORT PORT0               /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN 2U                   /*!<@brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_RX_PIN_MASK (1U << 2U)      /*!<@brief PORT pin mask */\n                                                                        /* @} */\n\n/*! @name PORT0_3 (number 52), P0_3/J25[1]/J18[8]\n  @{ */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PORT PORT0               /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN 3U                   /*!<@brief PORT pin number */\n#define BOARD_INITDEBUG_UARTPINS_DEBUG_UART_TX_PIN_MASK (1U << 3U)      /*!<@brief PORT pin mask */\n                                                                        /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void);\n\n/*! @name PORT0_1 (number 50), P0_1/SWCLK/JP10[2]/J18[4]\n  @{ */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PORT PORT0               /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN 1U                   /*!<@brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDCLK_PIN_MASK (1U << 1U)      /*!<@brief PORT pin mask */\n                                                                          /* @} */\n\n/*! @name PORT0_0 (number 49), P0_0/SWDIO/J18[2]\n  @{ */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PORT PORT0               /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN 0U                   /*!<@brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_SWD_SWDIO_PIN_MASK (1U << 0U)      /*!<@brief PORT pin mask */\n                                                                         /* @} */\n\n/*! @name PORT0_2 (number 51), P0_2/SWO/J25[3]/J18[6]\n  @{ */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_UART_RX_PORT PORT0               /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_UART_RX_PIN 2U                   /*!<@brief PORT pin number */\n#define BOARD_INITSWD_DEBUGPINS_DEBUG_UART_RX_PIN_MASK (1U << 2U)      /*!<@brief PORT pin mask */\n                                                                       /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSWD_DEBUGPins(void);\n\n#define PCR_DSE_dse0 0x00u /*!<@brief Drive Strength Enable: Low */\n#define PCR_IBE_ibe1 0x01u /*!<@brief Input Buffer Enable: Enables */\n#define PCR_INV_inv0 0x00u /*!<@brief Invert Input: Does not invert */\n#define PCR_ODE_ode0 0x00u /*!<@brief Open Drain Enable: Disables */\n#define PCR_PE_pe0 0x00u   /*!<@brief Pull Enable: Disables */\n#define PCR_PFE_pfe0 0x00u /*!<@brief Passive Filter Enable: Disables */\n#define PCR_PS_ps1 0x01u   /*!<@brief Pull Select: Enables internal pullup resistor */\n#define PCR_SRE_sre0 0x00u /*!<@brief Slew Rate Enable: Fast */\n\n/*! @name PORT3_13 (number 37), P3_13/J1[14]\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_GREEN_GPIO GPIO3                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_GREEN_INIT_GPIO_VALUE 1U        /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_GREEN_GPIO_PIN 13U              /*!<@brief GPIO pin number */\n#define BOARD_INITLEDSPINS_LED_GREEN_GPIO_PIN_MASK (1U << 13U) /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITLEDSPINS_LED_GREEN_PORT PORT3                /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_GREEN_PIN 13U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_GREEN_PIN_MASK (1U << 13U)      /*!<@brief PORT pin mask */\n                                                               /* @} */\n\n/*! @name PORT3_12 (number 38), P3_12/J1[12]/J5[1]\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_RED_GPIO GPIO3                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_RED_INIT_GPIO_VALUE 1U        /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_RED_GPIO_PIN 12U              /*!<@brief GPIO pin number */\n#define BOARD_INITLEDSPINS_LED_RED_GPIO_PIN_MASK (1U << 12U) /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITLEDSPINS_LED_RED_PORT PORT3                /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_RED_PIN 12U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_RED_PIN_MASK (1U << 12U)      /*!<@brief PORT pin mask */\n                                                             /* @} */\n\n/*! @name PORT3_0 (number 46), P3_0/J1[8]\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITLEDSPINS_LED_BLUE_GPIO GPIO3               /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_BLUE_INIT_GPIO_VALUE 1U       /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDSPINS_LED_BLUE_GPIO_PIN 0U              /*!<@brief GPIO pin number */\n#define BOARD_INITLEDSPINS_LED_BLUE_GPIO_PIN_MASK (1U << 0U) /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITLEDSPINS_LED_BLUE_PORT PORT3               /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITLEDSPINS_LED_BLUE_PIN 0U                   /*!<@brief PORT pin number */\n#define BOARD_INITLEDSPINS_LED_BLUE_PIN_MASK (1U << 0U)      /*!<@brief PORT pin mask */\n                                                             /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLEDsPins(void);\n\n/*! @name PORT1_7 (number 1), P1_7/J1[1]\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_SW3_GPIO GPIO1               /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_SW3_GPIO_PIN 7U              /*!<@brief GPIO pin number */\n#define BOARD_INITBUTTONSPINS_SW3_GPIO_PIN_MASK (1U << 7U) /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITBUTTONSPINS_SW3_PORT PORT1               /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_SW3_PIN 7U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_SW3_PIN_MASK (1U << 7U)      /*!<@brief PORT pin mask */\n                                                           /* @} */\n\n/*! @name PORT1_29 (number 8), P1_29/J3[6]/J18[10]\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_SW1_GPIO GPIO1                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_SW1_GPIO_PIN 29U              /*!<@brief GPIO pin number */\n#define BOARD_INITBUTTONSPINS_SW1_GPIO_PIN_MASK (1U << 29U) /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITBUTTONSPINS_SW1_PORT PORT1                /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_SW1_PIN 29U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_SW1_PIN_MASK (1U << 29U)      /*!<@brief PORT pin mask */\n                                                            /* @} */\n\n/*! @name PORT3_29 (number 32), P3_29/J18[7]/J4[11]\n  @{ */\n\n/* Symbols to be used with GPIO driver */\n#define BOARD_INITBUTTONSPINS_ISP_GPIO GPIO3                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_ISP_GPIO_PIN 29U              /*!<@brief GPIO pin number */\n#define BOARD_INITBUTTONSPINS_ISP_GPIO_PIN_MASK (1U << 29U) /*!<@brief GPIO pin mask */\n\n/* Symbols to be used with PORT driver */\n#define BOARD_INITBUTTONSPINS_ISP_PORT PORT3                /*!<@brief PORT peripheral base pointer */\n#define BOARD_INITBUTTONSPINS_ISP_PIN 29U                   /*!<@brief PORT pin number */\n#define BOARD_INITBUTTONSPINS_ISP_PIN_MASK (1U << 29U)      /*!<@brief PORT pin mask */\n                                                            /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitBUTTONsPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa156/board.cmake",
    "content": "set(MCU_VARIANT MCXA156)\nset(MCU_FAMILY MCXA)\nset(MCU_CORE MCXA156)\n\nset(JLINK_DEVICE MCXA156_M33)\nset(PYOCD_TARGET MCXA156)\nset(NXPLINK_DEVICE MCXA156:MCXA156)\n\nset(PORT 0)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MCXA156VLH\n    BOARD_TUD_RHPORT=0\n    BOARD_TUD_MAX_SPEED=OPT_MODE_FULL_SPEED\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/pin_mux.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${SDK_DIR}/${MCU_FAMILY}/periph1\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa156/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Freedom MCXA156\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-MCXA156\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// LED\n#define LED_GPIO              GPIO3\n#define LED_CLK               kCLOCK_GateGPIO3\n#define LED_PIN               12 // red\n#define LED_STATE_ON          0\n\n// ISP button\n#define BUTTON_GPIO           GPIO0\n#define BUTTON_CLK            kCLOCK_GateGPIO0\n#define BUTTON_PIN            6 //SW3\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              LPUART0\n\nstatic inline void board_uart_init_clock(void) {\n  /* attach 12 MHz clock to LPUART0 (debug console) */\n  CLOCK_SetClockDiv(kCLOCK_DivLPUART0, 1u);\n  CLOCK_AttachClk(kFRO12M_to_LPUART0);\n\n  RESET_PeripheralReset(kLPUART0_RST_SHIFT_RSTn);\n}\n\n// XTAL\n#define XTAL0_CLK_HZ          (24 * 1000 * 1000U)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa156/board.mk",
    "content": "MCU_VARIANT = MCXA156\nMCU_FAMILY = MCXA\nMCU_CORE = MCXA156\nPORT = 0\n\nCPU_CORE = cortex-m33-nodsp-nofp\nCFLAGS += \\\n\t-DCPU_MCXA156VLH \\\n\t-DCFG_TUSB_MCU=OPT_MCU_MCXA15 \\\n\nINC += \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/periph1\n\nJLINK_DEVICE = MCXA156\nPYOCD_TARGET = MCXA156\n\n# flash using pyocd\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa156/clock_config.c",
    "content": "/*\n * Copyright 2024 NXP\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to setup clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up wait states of the flash.\n *\n * 3. Set up all dividers.\n *\n * 4. Set up all selectors to provide selected clocks.\n *\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v13.0\nprocessor: MCXA156\npackage_id: MCXA156VLL\nmcu_data: ksdk2_0\nprocessor_version: 0.15.0\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_clock.h\"\n#include \"clock_config.h\"\n#include \"fsl_spc.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n/* System clock frequency. */\n//extern uint32_t SystemCoreClock;\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockFRO96M();\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO12M\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CPU_clock.outFreq, value: 12 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: MAIN_clock.outFreq, value: 12 MHz}\n- {id: Slow_clock.outFreq, value: 3 MHz}\n- {id: System_clock.outFreq, value: 12 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: SCGMode, value: SIRC}\n- {id: FRO_HF_PERIPHERALS_EN_CFG, value: Disabled}\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n- {id: SCG.SCSSEL.sel, value: SCG.SIRC}\n- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO12M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO12M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO12M */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO12M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U);               /* !< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\n}\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO24M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO24M\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CPU_clock.outFreq, value: 24 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_DIV_clock.outFreq, value: 48 MHz}\n- {id: FRO_HF_clock.outFreq, value: 48 MHz}\n- {id: MAIN_clock.outFreq, value: 48 MHz}\n- {id: Slow_clock.outFreq, value: 6 MHz}\n- {id: System_clock.outFreq, value: 24 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n- {id: SYSCON.AHBCLKDIV.scale, value: '2', locked: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO24M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO24M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO24M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO24M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n    CLOCK_SetupFROHFClocking(48000000U);               /*!< Enable FRO HF(48MHz) output */\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO_HF */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO24M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x0U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 2U);               /* !< Set AHBCLKDIV divider to value 2 */\n    CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U);           /* !< Set FROHFDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO24M_CORE_CLOCK;\n}\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO48M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO48M\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CPU_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_DIV_clock.outFreq, value: 48 MHz}\n- {id: FRO_HF_clock.outFreq, value: 48 MHz}\n- {id: MAIN_clock.outFreq, value: 48 MHz}\n- {id: Slow_clock.outFreq, value: 12 MHz}\n- {id: System_clock.outFreq, value: 48 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO48M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO48M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO48M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO48M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n    CLOCK_SetupFROHFClocking(48000000U);               /*!< Enable FRO HF(48MHz) output */\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO_HF */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO48M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P0V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_MidDriveVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U);               /* !< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U);           /* !< Set FROHFDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO48M_CORE_CLOCK;\n}\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO64M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO64M\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CPU_clock.outFreq, value: 64 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_DIV_clock.outFreq, value: 64 MHz}\n- {id: FRO_HF_clock.outFreq, value: 64 MHz}\n- {id: MAIN_clock.outFreq, value: 64 MHz}\n- {id: Slow_clock.outFreq, value: 16 MHz}\n- {id: System_clock.outFreq, value: 64 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: VDD_CORE, value: voltage_1v1}\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FROHFDIV.scale, value: '1', locked: true}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n- {id: SYSCON.AHBCLKDIV.scale, value: '1', locked: true}\nsources:\n- {id: SCG.FIRC.outFreq, value: 64 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO64M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO64M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO64M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO64M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P1V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n    CLOCK_SetupFROHFClocking(64000000U);               /*!< Enable FRO HF(64MHz) output */\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO_HF */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO64M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x1U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P1V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U);               /* !< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U);           /* !< Set FROHFDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO64M_CORE_CLOCK;\n}\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO96M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO96M\ncalled_from_default_init: true\noutputs:\n- {id: CLK_1M_clock.outFreq, value: 1 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CPU_clock.outFreq, value: 96 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_DIV_clock.outFreq, value: 96 MHz}\n- {id: FRO_HF_clock.outFreq, value: 96 MHz}\n- {id: MAIN_clock.outFreq, value: 96 MHz}\n- {id: Slow_clock.outFreq, value: 24 MHz}\n- {id: System_clock.outFreq, value: 96 MHz}\n- {id: UTICK_clock.outFreq, value: 1 MHz}\nsettings:\n- {id: VDD_CORE, value: voltage_1v1}\n- {id: CLKOUTDIV_HALT, value: Enable}\n- {id: MRCC.FREQMEREFCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FREQMETARGETCLKSEL.sel, value: MRCC.aoi0_out0}\n- {id: MRCC.FROHFDIV.scale, value: '1', locked: true}\n- {id: MRCC.OSTIMERCLKSEL.sel, value: VBAT.CLK16K_1}\n- {id: SYSCON.AHBCLKDIV.scale, value: '1', locked: true}\nsources:\n- {id: SCG.FIRC.outFreq, value: 96 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO96M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO96M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO96M(void)\n{\n    uint32_t coreFreq;\n    spc_active_mode_core_ldo_option_t ldoOption;\n    spc_sram_voltage_config_t sramOption;\n\n    /* Get the CPU Core frequency */\n    coreFreq = CLOCK_GetCoreSysClkFreq();\n\n    /* The flow of increasing voltage and frequency */\n    if (coreFreq <= BOARD_BOOTCLOCKFRO96M_CORE_CLOCK) {\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x2U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P1V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n    }\n\n    CLOCK_SetupFROHFClocking(96000000U);               /*!< Enable FRO HF(96MHz) output */\n\n    CLOCK_SetupFRO12MClocking();                /*!< Setup FRO12M clock */\n\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);       /* !< Switch MAIN_CLK to FRO_HF */\n\n    /* The flow of decreasing voltage and frequency */\n    if (coreFreq > BOARD_BOOTCLOCKFRO96M_CORE_CLOCK) {\n        /* Configure Flash to support different voltage level and frequency */\n        FMU0->FCTRL = (FMU0->FCTRL & ~((uint32_t)FMU_FCTRL_RWSC_MASK)) | (FMU_FCTRL_RWSC(0x2U));\n        /* Specifies the operating voltage for the SRAM's read/write timing margin */\n        sramOption.operateVoltage = kSPC_sramOperateAt1P1V;\n        sramOption.requestVoltageUpdate =  true;\n        (void)SPC_SetSRAMOperateVoltage(SPC0, &sramOption);\n        /* Set the LDO_CORE VDD regulator level */\n        ldoOption.CoreLDOVoltage = kSPC_CoreLDO_NormalVoltage;\n        ldoOption.CoreLDODriveStrength = kSPC_CoreLDO_NormalDriveStrength;\n        (void)SPC_SetActiveModeCoreLDORegulatorConfig(SPC0, &ldoOption);\n    }\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n\n    /*!< Set up dividers */\n    CLOCK_SetClockDiv(kCLOCK_DivAHBCLK, 1U);               /* !< Set AHBCLKDIV divider to value 1 */\n    CLOCK_SetClockDiv(kCLOCK_DivFRO_HF_DIV, 1U);           /* !< Set FROHFDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO96M_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa156/clock_config.h",
    "content": "/*\n * Copyright 2024 NXP\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK           12000000U  /*!< Core clock frequency: 12000000Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO12M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO24M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO24M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO24M_CORE_CLOCK           24000000U  /*!< Core clock frequency: 24000000Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO24M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO24M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO48M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO48M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO48M_CORE_CLOCK           48000000U  /*!< Core clock frequency: 48000000Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO48M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO48M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO64M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO64M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO64M_CORE_CLOCK           64000000U  /*!< Core clock frequency: 64000000Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO64M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO64M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO96M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO96M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO96M_CORE_CLOCK           96000000U  /*!< Core clock frequency: 96000000Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO96M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO96M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa156/pin_mux.c",
    "content": "/*\n * Copyright 2024 NXP\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v15.0\nprocessor: MCXA156\npackage_id: MCXA156VLL\nmcu_data: ksdk2_0\nprocessor_version: 0.15.0\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_port.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitPins();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: '78', peripheral: LPUART0, signal: RX, pin_signal: P0_2/TDO/SWO/LPUART0_RXD/LPSPI0_SCK/CT0_MAT0/UTICK_CAP0/FLEXIO0_D2, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: up, pull_enable: enable, input_buffer: enable, invert_input: normal}\n  - {pin_num: '79', peripheral: LPUART0, signal: TX, pin_signal: P0_3/TDI/LPUART0_TXD/LPSPI0_SDO/CT0_MAT1/UTICK_CAP1/FLEXIO0_D3/CMP0_OUT, slew_rate: fast, open_drain: disable,\n    drive_strength: low, pull_select: up, pull_enable: enable, input_buffer: enable, invert_input: normal}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void)\n{\n\n      RESET_PeripheralReset(kLPUART0_RST_SHIFT_RSTn);\n    CLOCK_SetClockDiv(kCLOCK_DivLPUART0, 1u);\n    CLOCK_AttachClk(kFRO12M_to_LPUART0);\n\n  /* GPIO3: Peripheral clock is enabled */\n  CLOCK_EnableClock(kCLOCK_GateGPIO3);\n  /* PORT3: Peripheral clock is enabled */\n  CLOCK_EnableClock(kCLOCK_GatePORT3);\n  /* GPIO3 peripheral is released from reset */\n  RESET_ReleasePeripheralReset(kGPIO3_RST_SHIFT_RSTn);\n  /* PORT3 peripheral is released from reset */\n  RESET_ReleasePeripheralReset(kPORT3_RST_SHIFT_RSTn);\n\n  /* GPIO3: Peripheral clock is enabled */\n  CLOCK_EnableClock(kCLOCK_GateGPIO0);\n  /* PORT3: Peripheral clock is enabled */\n  CLOCK_EnableClock(kCLOCK_GatePORT0);\n  /* GPIO3 peripheral is released from reset */\n  RESET_ReleasePeripheralReset(kGPIO0_RST_SHIFT_RSTn);\n  /* PORT3 peripheral is released from reset */\n  RESET_ReleasePeripheralReset(kPORT0_RST_SHIFT_RSTn);\n\n    /* PORT0: Peripheral clock is enabled */\n    CLOCK_EnableClock(kCLOCK_GatePORT0);\n    /* LPUART0 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kLPUART0_RST_SHIFT_RSTn);\n    /* PORT0 peripheral is released from reset */\n    RESET_ReleasePeripheralReset(kPORT0_RST_SHIFT_RSTn);\n\n    const port_pin_config_t port0_2_pin78_config = {/* Internal pull-up resistor is enabled */\n                                                    kPORT_PullUp,\n                                                    /* Low internal pull resistor value is selected. */\n                                                    kPORT_LowPullResistor,\n                                                    /* Fast slew rate is configured */\n                                                    kPORT_FastSlewRate,\n                                                    /* Passive input filter is disabled */\n                                                    kPORT_PassiveFilterDisable,\n                                                    /* Open drain output is disabled */\n                                                    kPORT_OpenDrainDisable,\n                                                    /* Low drive strength is configured */\n                                                    kPORT_LowDriveStrength,\n                                                    /* Normal drive strength is configured */\n                                                    kPORT_NormalDriveStrength,\n                                                    /* Pin is configured as LPUART0_RXD */\n                                                    kPORT_MuxAlt2,\n                                                    /* Digital input enabled */\n                                                    kPORT_InputBufferEnable,\n                                                    /* Digital input is not inverted */\n                                                    kPORT_InputNormal,\n                                                    /* Pin Control Register fields [15:0] are not locked */\n                                                    kPORT_UnlockRegister};\n    /* PORT0_2 (pin 78) is configured as LPUART0_RXD */\n    PORT_SetPinConfig(PORT0, 2U, &port0_2_pin78_config);\n\n    const port_pin_config_t port0_3_pin79_config = {/* Internal pull-up resistor is enabled */\n                                                    kPORT_PullUp,\n                                                    /* Low internal pull resistor value is selected. */\n                                                    kPORT_LowPullResistor,\n                                                    /* Fast slew rate is configured */\n                                                    kPORT_FastSlewRate,\n                                                    /* Passive input filter is disabled */\n                                                    kPORT_PassiveFilterDisable,\n                                                    /* Open drain output is disabled */\n                                                    kPORT_OpenDrainDisable,\n                                                    /* Low drive strength is configured */\n                                                    kPORT_LowDriveStrength,\n                                                    /* Normal drive strength is configured */\n                                                    kPORT_NormalDriveStrength,\n                                                    /* Pin is configured as LPUART0_TXD */\n                                                    kPORT_MuxAlt2,\n                                                    /* Digital input enabled */\n                                                    kPORT_InputBufferEnable,\n                                                    /* Digital input is not inverted */\n                                                    kPORT_InputNormal,\n                                                    /* Pin Control Register fields [15:0] are not locked */\n                                                    kPORT_UnlockRegister};\n    /* PORT0_3 (pin 79) is configured as LPUART0_TXD */\n    PORT_SetPinConfig(PORT0, 3U, &port0_3_pin79_config);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxa156/pin_mux.h",
    "content": "/*\n * Copyright 2024 NXP\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxn947/board.cmake",
    "content": "set(MCU_VARIANT MCXN947)\nset(MCU_FAMILY MCXN)\nset(MCU_CORE MCXN947_cm33_core0)\n\nset(JLINK_DEVICE MCXN947_M33_0)\nset(PYOCD_TARGET MCXN947)\nset(NXPLINK_DEVICE MCXN947:MCXN947)\n\nset(PORT 1)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MCXN947VDF_cm33_core0\n    BOARD_TUD_RHPORT=${PORT}\n    # port 0 is fullspeed, port 1 is highspeed\n    BOARD_TUD_MAX_SPEED=$<IF:${PORT},OPT_MODE_HIGH_SPEED,OPT_MODE_FULL_SPEED>\n    )\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/pin_mux.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${SDK_DIR}/${MCU_FAMILY}/periph\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxn947/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Freedom MCXN947\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-MCXN947\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_GPIO              GPIO0\n#define LED_CLK               kCLOCK_Gpio0\n#define LED_PIN               10 // red\n#define LED_STATE_ON          0\n\n// WAKE button (Dummy, use unused pin\n#define BUTTON_GPIO           GPIO0\n#define BUTTON_CLK            kCLOCK_Gpio0\n#define BUTTON_PIN            23\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV                   LPUART4\n#define LP_FLEXCOMM_INST           4\n\n#include \"fsl_lpflexcomm.h\"\n\nstatic inline void board_uart_init_clock(void) {\n\n  /* attach FRO 12M to FLEXCOMM4 */\n\n  LP_FLEXCOMM_Init(LP_FLEXCOMM_INST, LP_FLEXCOMM_PERIPH_LPUART);\n\n  CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);\n  CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4);\n  RESET_ClearPeripheralReset(kFC4_RST_SHIFT_RSTn);\n\n}\n\n// XTAL\n#define XTAL0_CLK_HZ          (24 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxn947/board.mk",
    "content": "MCU_VARIANT = MCXN947\nMCU_FAMILY = MCXN\nMCU_CORE = MCXN947_cm33_core0\nPORT ?= 1\n\nCPU_CORE = cortex-m33\nCFLAGS += \\\n\t-DCPU_MCXN947VDF_cm33_core0 \\\n\t-DCFG_TUSB_MCU=OPT_MCU_MCXN9 \\\n\nINC += \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/periph\n\nJLINK_DEVICE = MCXN947_M33_0\nPYOCD_TARGET = MCXN947\n\n# flash using pyocd\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxn947/clock_config.c",
    "content": "/*\n * Copyright 2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to setup clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up wait states of the flash.\n *\n * 3. Set up all dividers.\n *\n * 4. Set up all selectors to provide selected clocks.\n *\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v10.0\nprocessor: MCXN947\npackage_id: MCXN947VDF\nmcu_data: ksdk2_0\nprocessor_version: 0.12.3\nboard: MCX-N9XX-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"clock_config.h\"\n#include \"fsl_clock.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n/* System clock frequency. */\n// extern uint32_t SystemCoreClock;\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockPLL150M();\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO12M\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: MAIN_clock.outFreq, value: 12 MHz}\n- {id: Slow_clock.outFreq, value: 3 MHz}\n- {id: System_clock.outFreq, value: 12 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: SCGMode, value: SIRC}\n- {id: SCG.SCSSEL.sel, value: SCG.SIRC}\n- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO12M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO12M */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U);           /*!< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF48M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFROHF48M\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_clock.outFreq, value: 48 MHz}\n- {id: MAIN_clock.outFreq, value: 48 MHz}\n- {id: Slow_clock.outFreq, value: 12 MHz}\n- {id: System_clock.outFreq, value: 48 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: SYSCON.FLEXCAN0CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FLEXCAN1CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFROHF48M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFROHF48M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFROHF48M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    CLOCK_SetupFROHFClocking(48000000U);                /*!< Enable FRO HF(48MHz) output */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO_HF */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U);           /*!< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF144M ********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFROHF144M\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_clock.outFreq, value: 144 MHz}\n- {id: MAIN_clock.outFreq, value: 144 MHz}\n- {id: Slow_clock.outFreq, value: 18 MHz}\n- {id: System_clock.outFreq, value: 72 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: SYSCON.AHBCLKDIV.scale, value: '2', locked: true}\n- {id: SYSCON.FLEXCAN0CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FLEXCAN1CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\nsources:\n- {id: SCG.FIRC.outFreq, value: 144 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFROHF144M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFROHF144M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFROHF144M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    CLOCK_SetupFROHFClocking(144000000U);               /*!< Enable FRO HF(144MHz) output */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO_HF */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 2U);           /*!< Set AHBCLKDIV divider to value 2 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFROHF144M_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL150M\ncalled_from_default_init: true\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_clock.outFreq, value: 48 MHz}\n- {id: MAIN_clock.outFreq, value: 150 MHz}\n- {id: PLL0_CLK_clock.outFreq, value: 150 MHz}\n- {id: Slow_clock.outFreq, value: 37.5 MHz}\n- {id: System_clock.outFreq, value: 150 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: RunPowerMode, value: OD}\n- {id: SCGMode, value: PLL0}\n- {id: SCG.PLL0M_MULT.scale, value: '50', locked: true}\n- {id: SCG.PLL0SRCSEL.sel, value: SCG.FIRC_48M}\n- {id: SCG.PLL0_NDIV.scale, value: '8', locked: true}\n- {id: SCG.SCSSEL.sel, value: SCG.PLL0_CLK}\n- {id: SYSCON.FLEXCAN0CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FLEXCAN1CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL150M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    CLOCK_SetupFROHFClocking(48000000U);                /*!< Enable FRO HF(48MHz) output */\n\n    /*!< Set up PLL0 */\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SCG_APLLCTRL_SOURCE(1U) | SCG_APLLCTRL_SELI(27U) | SCG_APLLCTRL_SELP(13U),\n        .pllndiv = SCG_APLLNDIV_NDIV(8U),\n        .pllpdiv = SCG_APLLPDIV_PDIV(1U),\n        .pllmdiv = SCG_APLLMDIV_MDIV(50U),\n        .pllRate = 150000000U\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n    CLOCK_SetPll0MonitorMode(kSCG_Pll0MonitorDisable);    /* Pll0 Monitor is disabled */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL0_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL0 */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U);           /*!< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL100M\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CLK_IN_clock.outFreq, value: 24 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: MAIN_clock.outFreq, value: 100 MHz}\n- {id: PLL1_CLK_clock.outFreq, value: 100 MHz}\n- {id: Slow_clock.outFreq, value: 25 MHz}\n- {id: System_clock.outFreq, value: 100 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: PLL1_Mode, value: Normal}\n- {id: SCGMode, value: PLL1}\n- {id: SCG.PLL1M_MULT.scale, value: '100', locked: true}\n- {id: SCG.PLL1_NDIV.scale, value: '6', locked: true}\n- {id: SCG.PLL1_PDIV.scale, value: '4', locked: true}\n- {id: SCG.SCSSEL.sel, value: SCG.PLL1_CLK}\n- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled}\n- {id: SCG_SOSCCSR_SOSCEN_CFG, value: Enabled}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\nsources:\n- {id: SCG.SOSC.outFreq, value: 24 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL100M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    CLOCK_SetupExtClocking(24000000U);\n    CLOCK_SetSysOscMonitorMode(kSCG_SysOscMonitorDisable);    /* System OSC Clock Monitor is disabled */\n\n    /*!< Set up PLL1 */\n    const pll_setup_t pll1Setup = {\n        .pllctrl = SCG_SPLLCTRL_SOURCE(0U) | SCG_SPLLCTRL_SELI(53U) | SCG_SPLLCTRL_SELP(26U),\n        .pllndiv = SCG_SPLLNDIV_NDIV(6U),\n        .pllpdiv = SCG_SPLLPDIV_PDIV(2U),\n        .pllmdiv = SCG_SPLLMDIV_MDIV(100U),\n        .pllRate = 100000000U\n    };\n    CLOCK_SetPLL1Freq(&pll1Setup);                       /*!< Configure PLL1 to the desired values */\n    CLOCK_SetPll1MonitorMode(kSCG_Pll1MonitorDisable);    /* Pll1 Monitor is disabled */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL1_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL1 */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U);           /*!< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL100M_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxn947/clock_config.h",
    "content": "/*\n * Copyright 2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal frequency in Hz */\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32K frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK           12000000U  /*!< Core clock frequency: 12000000Hz */\n#define BOARD_BOOTCLOCKFRO12M_ROSC_CLOCK                  0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO12M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF48M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFROHF48M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK         48000000U  /*!< Core clock frequency: 48000000Hz */\n#define BOARD_BOOTCLOCKFROHF48M_ROSC_CLOCK                0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFROHF48M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFROHF48M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF144M ********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFROHF144M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFROHF144M_CORE_CLOCK       144000000U  /*!< Core clock frequency: 144000000Hz */\n#define BOARD_BOOTCLOCKFROHF144M_ROSC_CLOCK               0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFROHF144M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFROHF144M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL150M_CORE_CLOCK         150000000U  /*!< Core clock frequency: 150000000Hz */\n#define BOARD_BOOTCLOCKPLL150M_ROSC_CLOCK                 0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL150M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL100M_CORE_CLOCK         100000000U  /*!< Core clock frequency: 100000000Hz */\n#define BOARD_BOOTCLOCKPLL100M_ROSC_CLOCK                 0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL100M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxn947/pin_mux.c",
    "content": "/*\n * Copyright 2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v12.0\nprocessor: MCXN947\npackage_id: MCXN947VDF\nmcu_data: ksdk2_0\nprocessor_version: 0.12.3\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_port.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitPins();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: A1, peripheral: LPFlexcomm4, signal: LPFLEXCOMM_P0, pin_signal: PIO1_8/WUU0_IN10/LPTMR1_ALT3/TRACE_DATA0/FC4_P0/FC5_P4/CT_INP8/SCT0_OUT2/FLEXIO0_D16/PLU_OUT0/ENET0_TXD2/I3C1_SDA/TSI0_CH17/ADC1_A8,\n    slew_rate: fast, open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable, pull_value: low, input_buffer: enable,\n    invert_input: normal}\n  - {pin_num: B1, peripheral: LPFlexcomm4, signal: LPFLEXCOMM_P1, pin_signal: PIO1_9/TRACE_DATA1/FC4_P1/FC5_P5/CT_INP9/SCT0_OUT3/FLEXIO0_D17/PLU_OUT1/ENET0_TXD3/I3C1_SCL/TSI0_CH18/ADC1_A9,\n    slew_rate: fast, open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable, input_buffer: enable, invert_input: normal}\n -  {pin_num: B7, peripheral: GPIO0, signal: 'GPIO, 23', pin_signal: PIO0_23/WUU0_IN5/EWM0_OUT_b/FC1_P3/CT_INP3/FLEXIO0_D7/ADC0_A15/CMP2_IN2, direction: INPUT, slew_rate: fast,\n    open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, input_buffer: enable, invert_input: normal}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void)\n{\n  /* Enables the clock for PORT0: Enables clock */\n    CLOCK_EnableClock(kCLOCK_Port0);\n\n    /* Enables the clock for PORT1: Enables clock */\n    CLOCK_EnableClock(kCLOCK_Port1);\n\n\n    const port_pin_config_t port1_8_pinA1_config = {/* Internal pull-up/down resistor is disabled */\n                                                    kPORT_PullDisable,\n                                                    /* Low internal pull resistor value is selected. */\n                                                    kPORT_LowPullResistor,\n                                                    /* Fast slew rate is configured */\n                                                    kPORT_FastSlewRate,\n                                                    /* Passive input filter is disabled */\n                                                    kPORT_PassiveFilterDisable,\n                                                    /* Open drain output is disabled */\n                                                    kPORT_OpenDrainDisable,\n                                                    /* Low drive strength is configured */\n                                                    kPORT_LowDriveStrength,\n                                                    /* Pin is configured as FC4_P0 */\n                                                    kPORT_MuxAlt2,\n                                                    /* Digital input enabled */\n                                                    kPORT_InputBufferEnable,\n                                                    /* Digital input is not inverted */\n                                                    kPORT_InputNormal,\n                                                    /* Pin Control Register fields [15:0] are not locked */\n                                                    kPORT_UnlockRegister};\n    /* PORT1_8 (pin A1) is configured as FC4_P0 */\n    PORT_SetPinConfig(PORT1, 8U, &port1_8_pinA1_config);\n\n    const port_pin_config_t port1_9_pinB1_config = {/* Internal pull-up/down resistor is disabled */\n                                                    kPORT_PullDisable,\n                                                    /* Low internal pull resistor value is selected. */\n                                                    kPORT_LowPullResistor,\n                                                    /* Fast slew rate is configured */\n                                                    kPORT_FastSlewRate,\n                                                    /* Passive input filter is disabled */\n                                                    kPORT_PassiveFilterDisable,\n                                                    /* Open drain output is disabled */\n                                                    kPORT_OpenDrainDisable,\n                                                    /* Low drive strength is configured */\n                                                    kPORT_LowDriveStrength,\n                                                    /* Pin is configured as FC4_P1 */\n                                                    kPORT_MuxAlt2,\n                                                    /* Digital input enabled */\n                                                    kPORT_InputBufferEnable,\n                                                    /* Digital input is not inverted */\n                                                    kPORT_InputNormal,\n                                                    /* Pin Control Register fields [15:0] are not locked */\n                                                    kPORT_UnlockRegister};\n    /* PORT1_9 (pin B1) is configured as FC4_P1 */\n    PORT_SetPinConfig(PORT1, 9U, &port1_9_pinB1_config);\n\n    const port_pin_config_t SW2 = {/* Internal pull-up/down resistor is disabled */\n                                   kPORT_PullDisable,\n                                   /* Low internal pull resistor value is selected. */\n                                   kPORT_LowPullResistor,\n                                   /* Fast slew rate is configured */\n                                   kPORT_FastSlewRate,\n                                   /* Passive input filter is disabled */\n                                   kPORT_PassiveFilterDisable,\n                                   /* Open drain output is disabled */\n                                   kPORT_OpenDrainDisable,\n                                   /* Low drive strength is configured */\n                                   kPORT_LowDriveStrength,\n                                   /* Pin is configured as PIO0_23 */\n                                   kPORT_MuxAlt0,\n                                   /* Digital input enabled */\n                                   kPORT_InputBufferEnable,\n                                   /* Digital input is not inverted */\n                                   kPORT_InputNormal,\n                                   /* Pin Control Register fields [15:0] are not locked */\n                                   kPORT_UnlockRegister};\n    /* PORT0_23 (pin B7) is configured as PIO0_23 */\n    PORT_SetPinConfig(PORT0, 23U, &SW2);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/mcx/boards/frdm_mcxn947/pin_mux.h",
    "content": "/*\n * Copyright 2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/mcx/boards/mcxn947brk/board.cmake",
    "content": "set(MCU_VARIANT MCXN947)\nset(MCU_FAMILY MCXN)\nset(MCU_CORE MCXN947_cm33_core0)\n\nset(JLINK_DEVICE MCXN947_M33_0)\nset(PYOCD_TARGET MCXN947)\nset(NXPLINK_DEVICE MCXN947:MCXN947)\n\nset(PORT 1)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CPU_MCXN947VDF_cm33_core0\n    BOARD_TUD_RHPORT=${PORT}\n    # port 0 is fullspeed, port 1 is highspeed\n    BOARD_TUD_MAX_SPEED=$<IF:${PORT},OPT_MODE_HIGH_SPEED,OPT_MODE_FULL_SPEED>\n    )\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/pin_mux.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${SDK_DIR}/${MCU_FAMILY}/periph\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/mcx/boards/mcxn947brk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MCXN947 Breakout\n   url: n/a\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_GPIO              GPIO3\n#define LED_CLK               kCLOCK_Gpio3\n#define LED_PIN               4 // red\n#define LED_STATE_ON          0\n\n// WAKE button (Dummy, use unused pin\n#define BUTTON_GPIO           GPIO0\n#define BUTTON_CLK            kCLOCK_Gpio0\n#define BUTTON_PIN            6\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              LPUART4\n\nstatic inline void board_uart_init_clock(void) {\n  /* attach FRO 12M to FLEXCOMM4 */\n  CLOCK_SetClkDiv(kCLOCK_DivFlexcom4Clk, 1u);\n  CLOCK_AttachClk(kFRO12M_to_FLEXCOMM4);\n  RESET_ClearPeripheralReset(kFC4_RST_SHIFT_RSTn);\n}\n\n//#define UART_RX_PINMUX        0, 24, IOCON_PIO_DIG_FUNC1_EN\n//#define UART_TX_PINMUX        0, 25, IOCON_PIO_DIG_FUNC1_EN\n\n// XTAL\n#define XTAL0_CLK_HZ          (24 * 1000 * 1000U)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mcx/boards/mcxn947brk/board.mk",
    "content": "MCU_VARIANT = MCXN947\nMCU_FAMILY = MCXN\nMCU_CORE = MCXN947_cm33_core0\nPORT ?= 1\n\nCPU_CORE = cortex-m33\nCFLAGS += \\\n\t-DCPU_MCXN947VDF_cm33_core0 \\\n\t-DCFG_TUSB_MCU=OPT_MCU_MCXN9 \\\n\nINC += \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/periph\n\nJLINK_DEVICE = MCXN947_M33_0\nPYOCD_TARGET = MCXN947\n\n# flash using pyocd\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/mcx/boards/mcxn947brk/clock_config.c",
    "content": "/*\n * Copyright 2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to setup clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up wait states of the flash.\n *\n * 3. Set up all dividers.\n *\n * 4. Set up all selectors to provide selected clocks.\n *\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v10.0\nprocessor: MCXN947\npackage_id: MCXN947VDF\nmcu_data: ksdk2_0\nprocessor_version: 0.12.3\nboard: MCX-N9XX-EVK\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"clock_config.h\"\n#include \"fsl_clock.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n/* System clock frequency. */\n// extern uint32_t SystemCoreClock;\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockPLL150M();\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFRO12M\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: MAIN_clock.outFreq, value: 12 MHz}\n- {id: Slow_clock.outFreq, value: 3 MHz}\n- {id: System_clock.outFreq, value: 12 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: SCGMode, value: SIRC}\n- {id: SCG.SCSSEL.sel, value: SCG.SIRC}\n- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFRO12M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO12M_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO12M */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U);           /*!< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFRO12M_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF48M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFROHF48M\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_clock.outFreq, value: 48 MHz}\n- {id: MAIN_clock.outFreq, value: 48 MHz}\n- {id: Slow_clock.outFreq, value: 12 MHz}\n- {id: System_clock.outFreq, value: 48 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: SYSCON.FLEXCAN0CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FLEXCAN1CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFROHF48M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFROHF48M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFROHF48M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    CLOCK_SetupFROHFClocking(48000000U);                /*!< Enable FRO HF(48MHz) output */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO_HF */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U);           /*!< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF144M ********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockFROHF144M\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_clock.outFreq, value: 144 MHz}\n- {id: MAIN_clock.outFreq, value: 144 MHz}\n- {id: Slow_clock.outFreq, value: 18 MHz}\n- {id: System_clock.outFreq, value: 72 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: SYSCON.AHBCLKDIV.scale, value: '2', locked: true}\n- {id: SYSCON.FLEXCAN0CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FLEXCAN1CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\nsources:\n- {id: SCG.FIRC.outFreq, value: 144 MHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockFROHF144M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockFROHF144M configuration\n ******************************************************************************/\nvoid BOARD_BootClockFROHF144M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    CLOCK_SetupFROHFClocking(144000000U);               /*!< Enable FRO HF(144MHz) output */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kFRO_HF_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to FRO_HF */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 2U);           /*!< Set AHBCLKDIV divider to value 2 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKFROHF144M_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL150M\ncalled_from_default_init: true\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: FRO_HF_clock.outFreq, value: 48 MHz}\n- {id: MAIN_clock.outFreq, value: 150 MHz}\n- {id: PLL0_CLK_clock.outFreq, value: 150 MHz}\n- {id: Slow_clock.outFreq, value: 37.5 MHz}\n- {id: System_clock.outFreq, value: 150 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: PLL0_Mode, value: Normal}\n- {id: RunPowerMode, value: OD}\n- {id: SCGMode, value: PLL0}\n- {id: SCG.PLL0M_MULT.scale, value: '50', locked: true}\n- {id: SCG.PLL0SRCSEL.sel, value: SCG.FIRC_48M}\n- {id: SCG.PLL0_NDIV.scale, value: '8', locked: true}\n- {id: SCG.SCSSEL.sel, value: SCG.PLL0_CLK}\n- {id: SYSCON.FLEXCAN0CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FLEXCAN1CLKSEL.sel, value: NO_CLOCK}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL150M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    CLOCK_SetupFROHFClocking(48000000U);                /*!< Enable FRO HF(48MHz) output */\n\n    /*!< Set up PLL0 */\n    const pll_setup_t pll0Setup = {\n        .pllctrl = SCG_APLLCTRL_SOURCE(1U) | SCG_APLLCTRL_SELI(27U) | SCG_APLLCTRL_SELP(13U),\n        .pllndiv = SCG_APLLNDIV_NDIV(8U),\n        .pllpdiv = SCG_APLLPDIV_PDIV(1U),\n        .pllmdiv = SCG_APLLMDIV_MDIV(50U),\n        .pllRate = 150000000U\n    };\n    CLOCK_SetPLL0Freq(&pll0Setup);                       /*!< Configure PLL0 to the desired values */\n    CLOCK_SetPll0MonitorMode(kSCG_Pll0MonitorDisable);    /* Pll0 Monitor is disabled */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL0_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL0 */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U);           /*!< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL150M_CORE_CLOCK;\n}\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockPLL100M\noutputs:\n- {id: CLK_144M_clock.outFreq, value: 144 MHz}\n- {id: CLK_48M_clock.outFreq, value: 48 MHz}\n- {id: CLK_IN_clock.outFreq, value: 24 MHz}\n- {id: FRO_12M_clock.outFreq, value: 12 MHz}\n- {id: MAIN_clock.outFreq, value: 100 MHz}\n- {id: PLL1_CLK_clock.outFreq, value: 100 MHz}\n- {id: Slow_clock.outFreq, value: 25 MHz}\n- {id: System_clock.outFreq, value: 100 MHz}\n- {id: gdet_clock.outFreq, value: 48 MHz}\n- {id: trng_clock.outFreq, value: 48 MHz}\nsettings:\n- {id: PLL1_Mode, value: Normal}\n- {id: SCGMode, value: PLL1}\n- {id: SCG.PLL1M_MULT.scale, value: '100', locked: true}\n- {id: SCG.PLL1_NDIV.scale, value: '6', locked: true}\n- {id: SCG.PLL1_PDIV.scale, value: '4', locked: true}\n- {id: SCG.SCSSEL.sel, value: SCG.PLL1_CLK}\n- {id: SCG_FIRCCSR_FIRCEN_CFG, value: Disabled}\n- {id: SCG_SOSCCSR_SOSCEN_CFG, value: Enabled}\n- {id: SYSCON.FREQMEREFCLKSEL.sel, value: SYSCON.evtg_out0a}\n- {id: SYSCON.FREQMETARGETCLKSEL.sel, value: SYSCON.evtg_out0a}\nsources:\n- {id: SCG.SOSC.outFreq, value: 24 MHz, enabled: true}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n/*******************************************************************************\n * Code for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\nvoid BOARD_BootClockPLL100M(void)\n{\n    /*!< Enable SCG clock */\n    CLOCK_EnableClock(kCLOCK_Scg);\n\n    CLOCK_SetupExtClocking(24000000U);\n    CLOCK_SetSysOscMonitorMode(kSCG_SysOscMonitorDisable);    /* System OSC Clock Monitor is disabled */\n\n    /*!< Set up PLL1 */\n    const pll_setup_t pll1Setup = {\n        .pllctrl = SCG_SPLLCTRL_SOURCE(0U) | SCG_SPLLCTRL_SELI(53U) | SCG_SPLLCTRL_SELP(26U),\n        .pllndiv = SCG_SPLLNDIV_NDIV(6U),\n        .pllpdiv = SCG_SPLLPDIV_PDIV(2U),\n        .pllmdiv = SCG_SPLLMDIV_MDIV(100U),\n        .pllRate = 100000000U\n    };\n    CLOCK_SetPLL1Freq(&pll1Setup);                       /*!< Configure PLL1 to the desired values */\n    CLOCK_SetPll1MonitorMode(kSCG_Pll1MonitorDisable);    /* Pll1 Monitor is disabled */\n\n    /*!< Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kPLL1_to_MAIN_CLK);                 /*!< Switch MAIN_CLK to PLL1 */\n\n    /*!< Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAhbClk, 1U);           /*!< Set AHBCLKDIV divider to value 1 */\n\n    /* Set SystemCoreClock variable */\n    SystemCoreClock = BOARD_BOOTCLOCKPLL100M_CORE_CLOCK;\n}\n"
  },
  {
    "path": "hw/bsp/mcx/boards/mcxn947brk/clock_config.h",
    "content": "/*\n * Copyright 2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n#define BOARD_XTAL0_CLK_HZ                         24000000U  /*!< Board xtal frequency in Hz */\n#define BOARD_XTAL32K_CLK_HZ                          32768U  /*!< Board xtal32K frequency in Hz */\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockFRO12M **********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFRO12M_CORE_CLOCK           12000000U  /*!< Core clock frequency: 12000000Hz */\n#define BOARD_BOOTCLOCKFRO12M_ROSC_CLOCK                  0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFRO12M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFRO12M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF48M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFROHF48M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFROHF48M_CORE_CLOCK         48000000U  /*!< Core clock frequency: 48000000Hz */\n#define BOARD_BOOTCLOCKFROHF48M_ROSC_CLOCK                0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFROHF48M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFROHF48M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************* Configuration BOARD_BootClockFROHF144M ********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockFROHF144M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKFROHF144M_CORE_CLOCK       144000000U  /*!< Core clock frequency: 144000000Hz */\n#define BOARD_BOOTCLOCKFROHF144M_ROSC_CLOCK               0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockFROHF144M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockFROHF144M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL150M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL150M_CORE_CLOCK         150000000U  /*!< Core clock frequency: 150000000Hz */\n#define BOARD_BOOTCLOCKPLL150M_ROSC_CLOCK                 0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL150M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL150M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ******************** Configuration BOARD_BootClockPLL100M *********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#define BOARD_BOOTCLOCKPLL100M_CORE_CLOCK         100000000U  /*!< Core clock frequency: 100000000Hz */\n#define BOARD_BOOTCLOCKPLL100M_ROSC_CLOCK                 0U  /*!< ROSC clock frequency: 0Hz */\n\n\n/*******************************************************************************\n * API for BOARD_BootClockPLL100M configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockPLL100M(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/mcx/boards/mcxn947brk/pin_mux.c",
    "content": "/*\n * Copyright 2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v12.0\nprocessor: MCXN947\npackage_id: MCXN947VDF\nmcu_data: ksdk2_0\nprocessor_version: 0.12.3\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_port.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitPins();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'}\n- pin_list:\n  - {pin_num: A1, peripheral: LPFlexcomm4, signal: LPFLEXCOMM_P0, pin_signal: PIO1_8/WUU0_IN10/LPTMR1_ALT3/TRACE_DATA0/FC4_P0/FC5_P4/CT_INP8/SCT0_OUT2/FLEXIO0_D16/PLU_OUT0/ENET0_TXD2/I3C1_SDA/TSI0_CH17/ADC1_A8,\n    slew_rate: fast, open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable, pull_value: low, input_buffer: enable,\n    invert_input: normal}\n  - {pin_num: B1, peripheral: LPFlexcomm4, signal: LPFLEXCOMM_P1, pin_signal: PIO1_9/TRACE_DATA1/FC4_P1/FC5_P5/CT_INP9/SCT0_OUT3/FLEXIO0_D17/PLU_OUT1/ENET0_TXD3/I3C1_SCL/TSI0_CH18/ADC1_A9,\n    slew_rate: fast, open_drain: disable, drive_strength: low, pull_select: down, pull_enable: disable, passive_filter: disable, input_buffer: enable, invert_input: normal}\n  - {pin_num: F14, peripheral: GPIO3, signal: 'GPIO, 4', pin_signal: PIO3_4/FC7_P2/CT_INP18/PWM0_X2/FLEXIO0_D12/SIM1_CLK, slew_rate: fast, open_drain: disable, drive_strength: low,\n    pull_select: down, pull_enable: disable, input_buffer: enable, invert_input: normal}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitPins(void)\n{\n    /* Enables the clock for PORT1: Enables clock */\n    CLOCK_EnableClock(kCLOCK_Port1);\n    /* Enables the clock for PORT3: Enables clock */\n    CLOCK_EnableClock(kCLOCK_Port3);\n\n    const port_pin_config_t port1_8_pinA1_config = {/* Internal pull-up/down resistor is disabled */\n                                                    kPORT_PullDisable,\n                                                    /* Low internal pull resistor value is selected. */\n                                                    kPORT_LowPullResistor,\n                                                    /* Fast slew rate is configured */\n                                                    kPORT_FastSlewRate,\n                                                    /* Passive input filter is disabled */\n                                                    kPORT_PassiveFilterDisable,\n                                                    /* Open drain output is disabled */\n                                                    kPORT_OpenDrainDisable,\n                                                    /* Low drive strength is configured */\n                                                    kPORT_LowDriveStrength,\n                                                    /* Pin is configured as FC4_P0 */\n                                                    kPORT_MuxAlt2,\n                                                    /* Digital input enabled */\n                                                    kPORT_InputBufferEnable,\n                                                    /* Digital input is not inverted */\n                                                    kPORT_InputNormal,\n                                                    /* Pin Control Register fields [15:0] are not locked */\n                                                    kPORT_UnlockRegister};\n    /* PORT1_8 (pin A1) is configured as FC4_P0 */\n    PORT_SetPinConfig(PORT1, 8U, &port1_8_pinA1_config);\n\n    const port_pin_config_t port1_9_pinB1_config = {/* Internal pull-up/down resistor is disabled */\n                                                    kPORT_PullDisable,\n                                                    /* Low internal pull resistor value is selected. */\n                                                    kPORT_LowPullResistor,\n                                                    /* Fast slew rate is configured */\n                                                    kPORT_FastSlewRate,\n                                                    /* Passive input filter is disabled */\n                                                    kPORT_PassiveFilterDisable,\n                                                    /* Open drain output is disabled */\n                                                    kPORT_OpenDrainDisable,\n                                                    /* Low drive strength is configured */\n                                                    kPORT_LowDriveStrength,\n                                                    /* Pin is configured as FC4_P1 */\n                                                    kPORT_MuxAlt2,\n                                                    /* Digital input enabled */\n                                                    kPORT_InputBufferEnable,\n                                                    /* Digital input is not inverted */\n                                                    kPORT_InputNormal,\n                                                    /* Pin Control Register fields [15:0] are not locked */\n                                                    kPORT_UnlockRegister};\n    /* PORT1_9 (pin B1) is configured as FC4_P1 */\n    PORT_SetPinConfig(PORT1, 9U, &port1_9_pinB1_config);\n\n    const port_pin_config_t port3_4_pinF14_config = {/* Internal pull-up/down resistor is disabled */\n                                                     kPORT_PullDisable,\n                                                     /* Low internal pull resistor value is selected. */\n                                                     kPORT_LowPullResistor,\n                                                     /* Fast slew rate is configured */\n                                                     kPORT_FastSlewRate,\n                                                     /* Passive input filter is disabled */\n                                                     kPORT_PassiveFilterDisable,\n                                                     /* Open drain output is disabled */\n                                                     kPORT_OpenDrainDisable,\n                                                     /* Low drive strength is configured */\n                                                     kPORT_LowDriveStrength,\n                                                     /* Pin is configured as PIO3_4 */\n                                                     kPORT_MuxAlt0,\n                                                     /* Digital input enabled */\n                                                     kPORT_InputBufferEnable,\n                                                     /* Digital input is not inverted */\n                                                     kPORT_InputNormal,\n                                                     /* Pin Control Register fields [15:0] are not locked */\n                                                     kPORT_UnlockRegister};\n    /* PORT3_4 (pin F14) is configured as PIO3_4 */\n    PORT_SetPinConfig(PORT3, 4U, &port3_4_pinF14_config);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/mcx/boards/mcxn947brk/pin_mux.h",
    "content": "/*\n * Copyright 2022 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitPins(void);\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/mcx/debug.jlinkscript",
    "content": "int SetupTarget(void) {\n  JLINK_ExecCommand(\"SetRTTSearchRanges 0x20000000 0x40000\");\n\n  return 0;\n}\n"
  },
  {
    "path": "hw/bsp/mcx/drivers/spc/fsl_spc.c",
    "content": "/*\n * Copyright 2022-2024 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#include \"fsl_spc.h\"\n\n/* Component ID definition, used by tools. */\n#ifndef FSL_COMPONENT_ID\n#define FSL_COMPONENT_ID \"platform.drivers.mcx_spc\"\n#endif\n\n/*\n * $Coverage Justification Reference$\n *\n * $Justification spc_c_ref_1$\n * The SPC busy status flag is too short to get coverage data.\n */\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Prototypes\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n * Code\n ******************************************************************************/\n\n/*!\n * brief Gets selected power domain's requested low power mode.\n *\n * param base SPC peripheral base address.\n * param powerDomainId Power Domain Id, please refer to spc_power_domain_id_t.\n *\n * return The selected power domain's requested low power mode, please refer to spc_power_domain_low_power_mode_t.\n */\nspc_power_domain_low_power_mode_t SPC_GetPowerDomainLowPowerMode(SPC_Type *base, spc_power_domain_id_t powerDomainId)\n{\n    assert((uint8_t)powerDomainId < SPC_PD_STATUS_COUNT);\n\n    uint32_t val;\n\n    val = ((base->PD_STATUS[(uint8_t)powerDomainId] & SPC_PD_STATUS_LP_MODE_MASK) >> SPC_PD_STATUS_LP_MODE_SHIFT);\n    return (spc_power_domain_low_power_mode_t)val;\n}\n\n/*!\n * brief Gets Isolation status for each power domains.\n *\n * This function gets the status which indicates whether certain\n * peripheral and the IO pads are in a latched state as a result\n * of having been in POWERDOWN mode.\n *\n * param base SPC peripheral base address.\n * return Current isolation status for each power domains.\n */\nuint8_t SPC_GetPeriphIOIsolationStatus(SPC_Type *base)\n{\n    uint32_t reg;\n\n    reg = base->SC;\n    return (uint8_t)((reg & SPC_SC_ISO_CLR_MASK) >> SPC_SC_ISO_CLR_SHIFT);\n}\n\n/*!\n * brief Configs Low power request output pin.\n *\n * This function configs the low power request output pin\n *\n * param base SPC peripheral base address.\n * param config Pointer the spc_LowPower_Request_config_t structure.\n */\nvoid SPC_SetLowPowerRequestConfig(SPC_Type *base, const spc_lowpower_request_config_t *config)\n{\n    assert(config != NULL);\n\n    uint32_t reg;\n\n    reg = base->LPREQ_CFG;\n    reg &= ~(SPC_LPREQ_CFG_LPREQOE_MASK | SPC_LPREQ_CFG_LPREQPOL_MASK | SPC_LPREQ_CFG_LPREQOV_MASK);\n\n    if (config->enable)\n    {\n        reg |= SPC_LPREQ_CFG_LPREQOE_MASK | SPC_LPREQ_CFG_LPREQPOL((uint8_t)(config->polarity)) |\n               SPC_LPREQ_CFG_LPREQOV((uint8_t)(config->override));\n    }\n    else\n    {\n        reg &= ~SPC_LPREQ_CFG_LPREQOE_MASK;\n    }\n\n    base->LPREQ_CFG = reg;\n}\n\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n/*!\n * brief Configures VDD Core Glitch detector, including ripple counter selection, timeout value and so on.\n *\n * param base SPC peripheral base address.\n * param config Pointer to the structure in type of spc_vdd_core_glitch_detector_config_t.\n */\nvoid SPC_ConfigVddCoreGlitchDetector(SPC_Type *base, const spc_vdd_core_glitch_detector_config_t *config)\n{\n    assert(config != NULL);\n\n    uint32_t reg;\n\n    reg = (base->VDD_CORE_GLITCH_DETECT_SC) &\n          ~(SPC_VDD_CORE_GLITCH_DETECT_SC_CNT_SELECT_MASK | SPC_VDD_CORE_GLITCH_DETECT_SC_TIMEOUT_MASK |\n            SPC_VDD_CORE_GLITCH_DETECT_SC_RE_MASK | SPC_VDD_CORE_GLITCH_DETECT_SC_IE_MASK);\n\n    reg |= SPC_VDD_CORE_GLITCH_DETECT_SC_CNT_SELECT(config->rippleCounterSelect) |\n           SPC_VDD_CORE_GLITCH_DETECT_SC_TIMEOUT(config->resetTimeoutValue) |\n           SPC_VDD_CORE_GLITCH_DETECT_SC_RE(config->enableReset) |\n           SPC_VDD_CORE_GLITCH_DETECT_SC_IE(config->enableInterrupt);\n\n    base->VDD_CORE_GLITCH_DETECT_SC = reg;\n}\n#endif\n\n/*!\n * brief Set SRAM operate voltage.\n *\n * param base SPC peripheral base address.\n * param config The pointer to spc_sram_voltage_config_t, specifies the configuration of sram voltage.\n */\nvoid SPC_SetSRAMOperateVoltage(SPC_Type *base, const spc_sram_voltage_config_t *config)\n{\n    assert(config != NULL);\n\n    uint32_t reg = 0UL;\n\n    reg |= SPC_SRAMCTL_VSM(config->operateVoltage);\n\n    base->SRAMCTL = reg;\n\n    if (config->requestVoltageUpdate)\n    {\n        base->SRAMCTL |= SPC_SRAMCTL_REQ_MASK;\n        while ((base->SRAMCTL & SPC_SRAMCTL_ACK_MASK) == 0UL)\n        {\n            /* Wait until acknowledged */\n            ;\n        }\n        base->SRAMCTL &= ~SPC_SRAMCTL_REQ_MASK;\n    }\n}\n\n/*!\n * brief Configs Bandgap mode in Active mode.\n *\n * @note To disable bandgap in Active mode:\n *          1. Disable all LVD's and HVD's in active mode;\n *          2. Disable Glitch detect;\n *          3. Configure LDO's and DCDC to low drive strength in active mode;\n *          4. Invoke this function to disable bandgap in active mode;\n *      otherwise the error status will be reported.\n *\n * @note Some other system resources(such as PLL, CMP) require bandgap to be enabled, to disable bandgap please\n * take care of other system resources.\n *\n * param base SPC peripheral base address.\n * param mode The Bandgap mode be selected.\n *\n * retval kStatus_SPC_BandgapModeWrong The Bandgap can not be disabled in active mode.\n * retval kStatus_Success Config Bandgap mode in Active power mode successful.\n */\nstatus_t SPC_SetActiveModeBandgapModeConfig(SPC_Type *base, spc_bandgap_mode_t mode)\n{\n    uint32_t reg;\n    uint32_t state;\n\n    reg = base->ACTIVE_CFG;\n\n    if (mode == kSPC_BandgapDisabled)\n    {\n        state = SPC_GetActiveModeVoltageDetectStatus(base);\n\n        /* If any of the LVD/HVDs are kept enabled, bandgap mode must be enabled with buffer disabled. */\n        if (state != 0UL)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n\n        /* The bandgap mode must be enabled if any regulators' drive strength set as Normal. */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n        if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK) ==\n            SPC_ACTIVE_CFG_SYSLDO_VDD_DS(kSPC_SysLDO_NormalDriveStrength))\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n        if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_DCDC_VDD_DS_MASK) == SPC_ACTIVE_CFG_DCDC_VDD_DS(kSPC_DCDC_NormalVoltage))\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n        /* state of GLITCH_DETECT_DISABLE will be ignored if bandgap is disabled. */\n        if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK) == 0UL)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n#endif\n#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS\n        if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK) ==\n            SPC_ACTIVE_CFG_CORELDO_VDD_DS(kSPC_CoreLDO_NormalDriveStrength))\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n    }\n\n    reg &= ~SPC_ACTIVE_CFG_BGMODE_MASK;\n    reg |= SPC_ACTIVE_CFG_BGMODE(mode);\n\n    base->ACTIVE_CFG = reg;\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Configs Bandgap mode in Low Power mode.\n *\n * @note To disable Bandgap in Low-power mode:\n *          1. Disable all LVD's ad HVD's in low power mode;\n *          2. Disable Glitch detect in low power mode;\n *          3. Configure LDO's and DCDC to low drive strength in low power mode;\n *          4. Disable bandgap in low power mode;\n *      Otherwise, the error status will be reported.\n *\n * @note Some other system resources(such as PLL, CMP) require bandgap to be enabled, to disable bandgap please\n * take care of other system resources.\n *\n * param base SPC peripheral base address.\n * param mode The Bandgap mode be selected.\n *\n * retval kStatus_SPC_BandgapModeWrong The bandgap mode setting in Low Power mode is wrong.\n * retval kStatus_Success Config Bandgap mode in Low Power power mode successful.\n */\nstatus_t SPC_SetLowPowerModeBandgapmodeConfig(SPC_Type *base, spc_bandgap_mode_t mode)\n{\n    uint32_t reg;\n    uint32_t state;\n\n    reg = base->LP_CFG;\n\n    if (mode == kSPC_BandgapDisabled)\n    {\n        state = (uint32_t)SPC_GetLowPowerModeVoltageDetectStatus(base);\n\n        /* If any of the LVD/HVDs are kept enabled, bandgap mode must be enabled with buffer disabled. */\n        if (state != 0UL)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n        if ((base->LP_CFG & SPC_LP_CFG_DCDC_VDD_DS_MASK) == SPC_LP_CFG_DCDC_VDD_DS(kSPC_DCDC_NormalDriveStrength))\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n        if ((base->LP_CFG & SPC_LP_CFG_SYSLDO_VDD_DS_MASK) == SPC_LP_CFG_SYSLDO_VDD_DS(kSPC_SysLDO_NormalDriveStrength))\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n        if ((base->LP_CFG & SPC_LP_CFG_CORELDO_VDD_DS_MASK) ==\n            SPC_LP_CFG_CORELDO_VDD_DS(kSPC_CoreLDO_NormalDriveStrength))\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n        /* state of GLITCH_DETECT_DISABLE will be ignored if bandgap is disabled. */\n        if ((base->LP_CFG & SPC_LP_CFG_GLITCH_DETECT_DISABLE_MASK) == 0UL)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n#endif\n    }\n\n    reg &= ~SPC_LP_CFG_BGMODE_MASK;\n    reg |= SPC_LP_CFG_BGMODE(mode);\n    base->LP_CFG = reg;\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Configs CORE voltage detect options.\n *\n * This function configs CORE voltage detect options.\n * Note: Setting both the voltage detect interrupt and reset\n *       enable will cause interrupt to be generated on exit from reset.\n *       If those conditioned is not desired, interrupt/reset only one is enabled.\n *\n * param base       SPC peripheral base address.\n * param config     Pointer to spc_core_voltage_detect_config_t structure.\n */\nvoid SPC_SetCoreVoltageDetectConfig(SPC_Type *base, const spc_core_voltage_detect_config_t *config)\n{\n    assert(config != NULL);\n\n    uint32_t reg = 0UL;\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD)\n    reg |= (config->option.HVDInterruptEnable) ? SPC_VD_CORE_CFG_HVDIE(1U) : SPC_VD_CORE_CFG_HVDIE(0U);\n    reg |= (config->option.HVDResetEnable) ? SPC_VD_CORE_CFG_HVDRE(1U) : SPC_VD_CORE_CFG_HVDRE(0U);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */\n    reg |= (config->option.LVDInterruptEnable) ? SPC_VD_CORE_CFG_LVDIE(1U) : SPC_VD_CORE_CFG_LVDIE(0U);\n    reg |= (config->option.LVDResetEnable) ? SPC_VD_CORE_CFG_LVDRE(1U) : SPC_VD_CORE_CFG_LVDRE(0U);\n\n    base->VD_CORE_CFG = reg;\n}\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD)\n/*!\n * brief Enables the Core High Voltage Detector in Active mode.\n *\n * note If the CORE_LDO high voltage detect is enabled in Active mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable Core HVD.\n *          true    -   Enable Core High voltage detector in active mode.\n *          false   -   Disable Core High voltage detector in active mode.\n *\n * retval kStatus_Success Enable Core High Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeCoreHighVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->ACTIVE_CFG |= SPC_ACTIVE_CFG_CORE_HVDE_MASK;\n    }\n    else\n    {\n        base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORE_HVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Enables the Core High Voltage Detector in Low Power mode.\n *\n * note If the CORE_LDO high voltage detect is enabled in Low Power mode,\n * please note that the bandgap must be enabled and the drive strength of each regulator\n * must not set to low in low power mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable Core HVD.\n *          true    -   Enable Core High voltage detector in low power mode.\n *          false   -   Disable Core High voltage detector in low power mode.\n *\n * retval kStatus_Success Enable Core High Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeCoreHighVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_CORE_HVDE_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_CORE_HVDE_MASK;\n    }\n\n    return status;\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */\n\n/*!\n * brief Enables the Core VDD Low Voltage Detector in Active mode.\n *\n * note If the Core VDD high voltage detect is enabled in Active mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable Core LVD.\n *          true    -   Enable Core Low voltage detector in active mode.\n *          false   -   Disable Core Low voltage detector in active mode.\n *\n * retval kStatus_Success Enable Core Low Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeCoreLowVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->ACTIVE_CFG |= SPC_ACTIVE_CFG_CORE_LVDE_MASK;\n    }\n    else\n    {\n        base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORE_LVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Enables the Core Low Voltage Detector in Low Power mode.\n *\n * note If the Core VDD low voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Low Power mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable Core HVD.\n *          true    -   Enable Core Low voltage detector in low power mode.\n *          false   -   Disable Core Low voltage detector in low power mode.\n *\n * retval kStatus_Success Enable Core Low Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeCoreLowVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_CORE_LVDE_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_CORE_LVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Set system VDD Low-voltage level selection.\n *\n * This function selects the system VDD low-voltage level. Changing system VDD low-voltage level\n * must be done after disabling the System VDD low voltage reset and interrupt.\n *\n * @deprecated In latest RM, reserved for all devices, will removed in next release.\n *\n * param base SPC peripheral base address.\n * param level System VDD Low-Voltage level selection. See @ref spc_low_voltage_level_select_t for details.\n */\nvoid SPC_SetSystemVDDLowVoltageLevel(SPC_Type *base, spc_low_voltage_level_select_t level)\n{\n    (void)level;\n    (void)base;\n\n    /*\n    uint32_t reg;\n\n    reg = base->VD_SYS_CFG;\n\n    base->VD_SYS_CFG &= ~(SPC_VD_SYS_CFG_LVDRE_MASK | SPC_VD_SYS_CFG_LVDIE_MASK);\n    reg |= SPC_VD_SYS_CFG_LVSEL(level);\n\n    base->VD_SYS_CFG = reg; */\n}\n\n/*!\n * brief Configs SYS VDD voltage detect options.\n *\n * This function config SYS voltage detect options.\n * Note: Setting both the voltage detect interrupt and reset\n *       enable will cause interrupt to be generated on exit from reset.\n *       If those conditioned is not desired, interrupt/reset only one is enabled.\n *\n * param base       SPC peripheral base address.\n * param config     Pointer to spc_system_voltage_detect_config_t structure.\n */\nvoid SPC_SetSystemVoltageDetectConfig(SPC_Type *base, const spc_system_voltage_detect_config_t *config)\n{\n    assert(config != NULL);\n\n    uint32_t reg = 0UL;\n\n    reg |= (config->option.HVDInterruptEnable) ? SPC_VD_SYS_CFG_HVDIE(1U) : SPC_VD_SYS_CFG_HVDIE(0U);\n    reg |= (config->option.LVDInterruptEnable) ? SPC_VD_SYS_CFG_LVDIE(1U) : SPC_VD_SYS_CFG_LVDIE(0U);\n    reg |= (config->option.HVDResetEnable) ? SPC_VD_SYS_CFG_HVDRE(1U) : SPC_VD_SYS_CFG_HVDRE(0U);\n    reg |= (config->option.LVDResetEnable) ? SPC_VD_SYS_CFG_LVDRE(1U) : SPC_VD_SYS_CFG_LVDRE(0U);\n\n    base->VD_SYS_CFG = reg;\n\n    (void)(config->level);\n    /* SPC_SetSystemVDDLowVoltageLevel(base, config->level); */\n}\n\n/*!\n * brief Enables the System VDD High Voltage Detector in Active mode.\n *\n * note If the System_LDO high voltage detect is enabled in Active mode,\n * please note that the bandgap must be enabled and the drive strength of\n * each regulator must not set to low in Active mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable System HVD.\n *          true    -   Enable System High voltage detector in active mode.\n *          false   -   Disable System High voltage detector in active mode.\n *\n * retval kStatus_Success Enable System High Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeSystemHighVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->ACTIVE_CFG |= SPC_ACTIVE_CFG_SYS_HVDE_MASK;\n    }\n    else\n    {\n        base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_SYS_HVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Enables the System VDD Low Voltage Detector in Active mode.\n *\n * note If the System_LDO low voltage detect is enabled in Active mode,\n * please note that the bandgap must be enabled and the drive strength of each\n * regulator must not set to low in Active mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable System LVD.\n *          true    -   Enable System Low voltage detector in active mode.\n *          false   -   Disable System Low voltage detector in active mode.\n *\n * retval kStatus_Success Enable the System Low Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeSystemLowVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->ACTIVE_CFG |= SPC_ACTIVE_CFG_SYS_LVDE_MASK;\n    }\n    else\n    {\n        base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_SYS_LVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Enables the System VDD High Voltage Detector in Low Power mode.\n *\n * note If the System_LDO high voltage detect is enabled in low power mode,\n * please note that the bandgap must be enabled and the drive strength of each\n * regulator must not set to low in low power mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable System HVD.\n *          true    -   Enable System High voltage detector in low power mode.\n *          false   -   Disable System High voltage detector in low power mode.\n *\n * retval kStatus_Success Enable System High Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeSystemHighVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_SYS_HVDE_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_SYS_HVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Enables the System VDD Low Voltage Detector in Low Power mode.\n *\n * note If the System_LDO low voltage detect is enabled in Low Power mode,\n * please note that the bandgap must be enabled and the drive strength of each\n * regulator must not set to low in Low Power mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable System HVD.\n *          true    -   Enable System Low voltage detector in low power mode.\n *          false   -   Disable System Low voltage detector in low power mode.\n *\n * retval kStatus_Success Enable System Low Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeSystemLowVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_SYS_LVDE_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_SYS_LVDE_MASK;\n    }\n\n    return status;\n}\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD)\n/*!\n * brief Set IO VDD Low-Voltage level selection.\n *\n * This function selects the IO VDD Low-voltage level. Changing IO VDD low-voltage level\n * must be done after disabling the IO VDD low voltage reset and interrupt.\n *\n * param base SPC peripheral base address.\n * param level IO VDD Low-voltage level selection.\n */\nvoid SPC_SetIOVDDLowVoltageLevel(SPC_Type *base, spc_low_voltage_level_select_t level)\n{\n    uint32_t reg;\n\n    reg = base->VD_IO_CFG;\n\n    base->VD_IO_CFG &= ~(SPC_VD_IO_CFG_LVDRE_MASK | SPC_VD_IO_CFG_LVDIE_MASK | SPC_VD_IO_CFG_LVSEL_MASK);\n    reg |= SPC_VD_IO_CFG_LVSEL(level);\n\n    base->VD_IO_CFG = reg;\n}\n\n/*!\n * brief Configs IO VDD voltage detect options.\n *\n * This function config IO voltage detect options.\n * Note: Setting both the voltage detect interrupt and reset\n *       enable will cause interrupt to be generated on exit from reset.\n *       If those conditioned is not desired, interrupt/reset so only one is enabled.\n *\n * param base       SPC peripheral base address.\n * param config     Pointer to spc_IO_voltage_detect_config_t structure.\n */\nvoid SPC_SetIOVoltageDetectConfig(SPC_Type *base, const spc_io_voltage_detect_config_t *config)\n{\n    assert(config != NULL);\n\n    uint32_t reg = 0UL;\n\n    /* Set trip voltage level. */\n    SPC_SetIOVDDLowVoltageLevel(base, config->level);\n\n    reg = base->VD_IO_CFG;\n    reg &= ~(SPC_VD_IO_CFG_LVDRE_MASK | SPC_VD_IO_CFG_LVDIE_MASK | SPC_VD_IO_CFG_HVDRE_MASK | SPC_VD_IO_CFG_HVDIE_MASK);\n\n    reg |= (config->option.HVDInterruptEnable) ? SPC_VD_IO_CFG_HVDIE(1U) : SPC_VD_IO_CFG_HVDIE(0U);\n    reg |= (config->option.LVDInterruptEnable) ? SPC_VD_IO_CFG_LVDIE(1U) : SPC_VD_IO_CFG_LVDIE(0U);\n    reg |= (config->option.HVDResetEnable) ? SPC_VD_IO_CFG_HVDRE(1U) : SPC_VD_IO_CFG_HVDRE(0U);\n    reg |= (config->option.LVDResetEnable) ? SPC_VD_IO_CFG_LVDRE(1U) : SPC_VD_IO_CFG_LVDRE(0U);\n\n    base->VD_IO_CFG = reg;\n}\n\n/*!\n * brief Enables the IO VDD High Voltage Detector in Active mode.\n *\n * note If the IO high voltage detect is enabled in Active mode,\n * please note that the bandgap must be enabled and the drive strength\n * of each regulator must not set to low in Active mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable IO HVD.\n *          true    -   Enable IO High voltage detector in active mode.\n *          false   -   Disable IO High voltage detector in active mode.\n *\n * retval kStatus_Success Enable IO High Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeIOHighVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->ACTIVE_CFG |= SPC_ACTIVE_CFG_IO_HVDE_MASK;\n    }\n    else\n    {\n        base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_IO_HVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Enables the IO VDD Low Voltage Detector in Active mode.\n *\n * note If the IO low voltage detect is enabled in Active mode,\n * please note that the bandgap must be enabled and the drive strength\n * of each regulator must not set to low in Active mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable IO LVD.\n *          true    -   Enable IO Low voltage detector in active mode.\n *          false   -   Disable IO Low voltage detector in active mode.\n *\n * retval kStatus_Success Enable IO Low Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeIOLowVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->ACTIVE_CFG |= SPC_ACTIVE_CFG_IO_LVDE_MASK;\n    }\n    else\n    {\n        base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_IO_LVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Enables the IO VDD High Voltage Detector in Low Power mode.\n *\n * note If the IO high voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Low Power mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable IO HVD.\n *          true    -   Enable IO High voltage detector in low power mode.\n *          false   -   Disable IO High voltage detector in low power mode.\n *\n * retval kStatus_Success Enable IO High Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeIOHighVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_IO_HVDE_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_IO_HVDE_MASK;\n    }\n\n    return status;\n}\n\n/*!\n * brief Enables the IO VDD Low Voltage Detector in Low Power mode.\n *\n * note If the IO low voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Low Power mode.\n *\n * param base SPC peripheral base address.\n * param enable Enable/Disable IO HVD.\n *          true    -   Enable IO Low voltage detector in low power mode.\n *          false   -   Disable IO Low voltage detector in low power mode.\n *\n * retval kStatus_Success Enable IO Low Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeIOLowVoltageDetect(SPC_Type *base, bool enable)\n{\n    status_t status = kStatus_Success;\n\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_IO_LVDE_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_IO_LVDE_MASK;\n    }\n\n    return status;\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */\n\n/*!\n * brief Configs external voltage domains\n *\n * This function configs external voltage domains isolation.\n *\n * param base SPC peripheral base address.\n * param lowPowerIsoMask The mask of external domains isolate enable during low power mode.\n * param IsoMask The mask of external domains isolate.\n */\nvoid SPC_SetExternalVoltageDomainsConfig(SPC_Type *base, uint8_t lowPowerIsoMask, uint8_t IsoMask)\n{\n    uint32_t reg = 0UL;\n\n    reg |= SPC_EVD_CFG_REG_EVDISO(IsoMask) | SPC_EVD_CFG_REG_EVDLPISO(lowPowerIsoMask);\n    base->EVD_CFG = reg;\n}\n\n/*!\n * brief Configs Core LDO Regulator in Active mode.\n *\n * @note The bandgap must be enabled before invoking this function.\n * @note To set Core LDO as low drive strength, all HVDs/LVDs must be disabled previously.\n *\n * param base SPC peripheral base address.\n * param option Pointer to the spc_active_mode_Core_LDO_option_t structure.\n *\n * retval kStatus_Success Config Core LDO regulator in Active power mode successful.\n * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * retval kStatus_SPC_BandgapModeWrong Bandgap should be enabled before invoking this function.\n * retval kStatus_SPC_CORELDOLowDriveStrengthIgnore To set Core LDO as low drive strength,\n *                                                  all LVDs/HVDs must be disabled before invoking this function.\n */\nstatus_t SPC_SetActiveModeCoreLDORegulatorConfig(SPC_Type *base, const spc_active_mode_core_ldo_option_t *option)\n{\n    assert(option != NULL);\n\n    if ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n        return kStatus_SPC_Busy;\n    }\n\n    /* Check input parameters. */\n    /*  1. Bandgap must not be disabled. */\n    if (SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled)\n    {\n        return kStatus_SPC_BandgapModeWrong;\n    }\n\n    /*  2. To set to low drive strength, all LVDs/HVDs must be disabled previously. */\n    if ((SPC_GetActiveModeVoltageDetectStatus(base) != 0UL) &&\n        (option->CoreLDODriveStrength == kSPC_CoreLDO_LowDriveStrength))\n    {\n        return kStatus_SPC_CORELDOLowDriveStrengthIgnore;\n    }\n\n    if ((uint8_t)SPC_GetActiveModeCoreLDOVDDVoltageLevel(base) != (uint8_t)(option->CoreLDOVoltage))\n    {\n#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS\n        (void)SPC_SetActiveModeCoreLDORegulatorDriveStrength(base, kSPC_CoreLDO_NormalDriveStrength);\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n        (void)SPC_SetActiveModeCoreLDORegulatorVoltageLevel(base, option->CoreLDOVoltage);\n    }\n\n#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS\n    (void)SPC_SetActiveModeCoreLDORegulatorDriveStrength(base, option->CoreLDODriveStrength);\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Set Core LDO VDD Regulator Voltage level in Active mode.\n *\n * @note In active mode, the Core LDO voltage level should only be changed when the\n *  Core LDO is in normal drive strength.\n *\n * @note Update Core LDO voltage level will set Busy flag,\n *      this function return only when busy flag is cleared by hardware\n *\n * param base SPC peripheral base address.\n * param voltageLevel Specify the voltage level of CORE LDO Regulator in Active mode, please\n        refer to @ref spc_core_ldo_voltage_level_t.\n *\n * retval kStatus_SPC_CORELDOVoltageSetFail  Core LDO voltage level should only be\n *                                          changed when the CORE_LDO is in normal drive strength.\n * retval kStatus_Success Set Core LDO regulator voltage level in Active power mode successful.\n */\nstatus_t SPC_SetActiveModeCoreLDORegulatorVoltageLevel(SPC_Type *base, spc_core_ldo_voltage_level_t voltageLevel)\n{\n    if ((uint8_t)voltageLevel != (uint8_t)SPC_GetActiveModeCoreLDOVDDVoltageLevel(base))\n    {\n#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS)\n        if (SPC_GetActiveModeCoreLDODriveStrength(base) != kSPC_CoreLDO_NormalDriveStrength)\n        {\n            return kStatus_SPC_CORELDOVoltageSetFail;\n        }\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n\n        base->ACTIVE_CFG =\n            ((base->ACTIVE_CFG & ~SPC_ACTIVE_CFG_CORELDO_VDD_LVL_MASK) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(voltageLevel));\n\n        /*\n         * $Branch Coverage Justification$\n         * $ref spc_c_ref_1$.\n         */\n        while ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n        {\n        }\n    }\n    return kStatus_Success;\n}\n\n#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS\n/*!\n * brief Set Core LDO VDD Regulator Drive Strength in Active mode.\n *\n * param base SPC peripheral base address.\n * param driveStrength Specify the drive strength of CORE LDO Regulator in Active mode, please\n        refer to @ref spc_core_ldo_drive_strength_t.\n *\n * retval #kStatus_Success Set Core LDO regulator drive strength in Active power mode successful.\n * retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore If any voltage detect enabled,\n            core_ldo's drive strength can not set to low.\n * retval #kStatus_SPC_BandgapModeWrong The selected bandgap mode is not allowed.\n */\nstatus_t SPC_SetActiveModeCoreLDORegulatorDriveStrength(SPC_Type *base, spc_core_ldo_drive_strength_t driveStrength)\n{\n    if (driveStrength == kSPC_CoreLDO_LowDriveStrength)\n    {\n        /* If any voltage detect feature is enabled in Active mode, then CORE_LDO's drive strength must not set to low.\n         */\n        if (SPC_GetActiveModeVoltageDetectStatus(base) != 0UL)\n        {\n            return kStatus_SPC_CORELDOLowDriveStrengthIgnore;\n        }\n    }\n\n    if (driveStrength == kSPC_CoreLDO_NormalDriveStrength)\n    {\n        /* If specify normal drive strength, bandgap must not be disabled. */\n        if (SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n    }\n\n    base->ACTIVE_CFG =\n        ((base->ACTIVE_CFG & ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK) | SPC_ACTIVE_CFG_CORELDO_VDD_DS(driveStrength));\n\n    return kStatus_Success;\n}\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n\n/*!\n * brief Configs CORE LDO Regulator in low power mode\n *\n * This function configs CORE LDO Regulator in Low Power mode.\n * If CORE LDO VDD Drive Strength is set to Normal, the CORE LDO VDD regulator voltage\n * level in Active mode must be equal to the voltage level in Low power mode. And the Bandgap\n * must be programmed to select bandgap enabled.\n * Core VDD voltage levels for the Core LDO low power regulator can only be changed when the CORE\n * LDO Drive Strength is set as Normal.\n *\n * param base SPC peripheral base address.\n * param option Pointer to the spc_lowpower_mode_Core_LDO_option_t structure.\n * retval kStatus_Success Config Core LDO regulator in power mode successfully.\n * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * retval kStatus_SPC_CORELDOLowDriveStrengthIgnore HVDs/LVDs are not disabled before invoking this function.\n * retval kStatus_SPC_BandgapModeWrong The bandgap is not enabled before invoking this function.\n */\nstatus_t SPC_SetLowPowerModeCoreLDORegulatorConfig(SPC_Type *base, const spc_lowpower_mode_core_ldo_option_t *option)\n{\n    status_t status = kStatus_Success;\n\n    if ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n        /*\n         * $Line Coverage Justification$\n         * $ref spc_c_ref_1$.\n         */\n        return kStatus_SPC_Busy;\n    }\n\n    status = SPC_SetLowPowerModeCoreLDORegulatorDriveStrength(base, option->CoreLDODriveStrength);\n    if (status == kStatus_Success)\n    {\n        (void)SPC_SetLowPowerModeCoreLDORegulatorVoltageLevel(base, option->CoreLDOVoltage);\n    }\n\n    return status;\n}\n\n/*!\n * brief Set Core LDO VDD Regulator Voltage level in Low power mode.\n *\n * @note If Core LDO's drive strengths are same in active and low power mode, the Core LDO's voltage must be set to the\n * same value in active and low power mode. Application should take care of this limitation.\n *\n * @note Some devices require Core LDO and DCDC have the same voltage level even if Core LDO is off. Application should\n * take care of this limitation.\n *\n * param base SPC peripheral base address.\n * param voltageLevel Voltage level of CORE LDO Regulator in Low power mode, please\n        refer to @ref spc_core_ldo_voltage_level_t.\n *\n * retval #kStatus_SPC_Busy The SPC instance is busy to execute other operation.\n * retval #kStatus_Success Set Core LDO regulator voltage level in Low power mode successful.\n */\nstatus_t SPC_SetLowPowerModeCoreLDORegulatorVoltageLevel(SPC_Type *base, spc_core_ldo_voltage_level_t voltageLevel)\n{\n    if ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n        /*\n            * $Line Coverage Justification$\n            * $ref spc_c_ref_1$.\n            */\n        return kStatus_SPC_Busy;\n    }\n\n    base->LP_CFG = ((base->LP_CFG & ~SPC_LP_CFG_CORELDO_VDD_LVL_MASK) | SPC_LP_CFG_CORELDO_VDD_LVL(voltageLevel));\n\n    /*\n        * $Branch Coverage Justification$\n        * $ref spc_c_ref_1$.\n        */\n    while ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n    }\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Set Core LDO VDD Regulator Drive Strength in Low power mode.\n *\n * param base SPC peripheral base address.\n * param driveStrength Specify drive strength of CORE LDO in low power mode.\n *\n * retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Some voltage detect enabled, CORE LDO's drive strength can not set\n *           as low.\n * retval #kStatus_Success Set Core LDO regulator drive strength in Low power mode successful.\n * retval #kStatus_SPC_BandgapModeWrong Bandgap is disabled when attempt to set CORE LDO work as normal drive strength.\n */\nstatus_t SPC_SetLowPowerModeCoreLDORegulatorDriveStrength(SPC_Type *base, spc_core_ldo_drive_strength_t driveStrength)\n{\n    if (driveStrength == kSPC_CoreLDO_LowDriveStrength)\n    {\n        /* If any voltage detect feature is enabled in Low Power mode, then CORE_LDO's drive strength must not set to\n         * low.\n         */\n        if (SPC_GetLowPowerModeVoltageDetectStatus(base) != 0UL)\n        {\n            return kStatus_SPC_CORELDOLowDriveStrengthIgnore;\n        }\n    }\n    else\n    {\n        /* To specify normal drive strength, the bandgap must be enabled in low power mode. */\n        if (SPC_GetLowPowerModeBandgapMode(base) == kSPC_BandgapDisabled)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n    }\n\n    base->LP_CFG = ((base->LP_CFG & ~SPC_LP_CFG_CORELDO_VDD_DS_MASK) | SPC_LP_CFG_CORELDO_VDD_DS(driveStrength));\n\n    return kStatus_Success;\n}\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n/*!\n * brief Configs System LDO VDD Regulator in Active mode.\n *\n * This function configs System LDO VDD Regulator in Active mode.\n * If System LDO VDD Drive Strength is set to Normal, the Bandgap mode in Active mode must be programmed\n * to a value that enable the bandgap.\n * If any voltage detects are kept enabled, configuration to set System LDO VDD drive strength to low will\n * be ignored.\n * If select System LDO VDD Regulator voltage level to Over Drive Voltage, the Drive Strength of System LDO VDD\n * Regulator must be set to Normal otherwise the regulator Drive Strength will be forced to Normal.\n * If select System LDO VDD Regulator voltage level to Over Drive Voltage, the High voltage detect must be disabled.\n * Otherwise it will be fail to regulator to Over Drive Voltage.\n *\n * param base SPC peripheral base address.\n * param option Pointer to the spc_active_mode_Sys_LDO_option_t structure.\n * retval kStatus_Success Config System LDO regulator in Active power mode successful.\n * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * retval kStatus_SPC_BandgapModeWrong The bandgap is not enabled before invoking this function.\n * retval kStatus_SPC_SYSLDOOverDriveVoltageFail HVD of System VDD is not disable before setting to Over Drive voltage.\n * retval kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set System LDO VDD regulator's driver strength to Low will be\n * ignored.\n */\nstatus_t SPC_SetActiveModeSystemLDORegulatorConfig(SPC_Type *base, const spc_active_mode_sys_ldo_option_t *option)\n{\n    assert(option != NULL);\n\n    if ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n        /*\n         * $Line Coverage Justification$\n         * $ref spc_c_ref_1$.\n         */\n        return kStatus_SPC_Busy;\n    }\n\n    /* Check input parameters before setting registers. */\n    /*  1. To set to low DS, all LVDs/HVDs must be disabled previously. */\n    if ((SPC_GetActiveModeVoltageDetectStatus(base) != 0UL) &&\n        (option->SysLDODriveStrength == kSPC_SysLDO_LowDriveStrength))\n    {\n        return kStatus_SPC_SYSLDOLowDriveStrengthIgnore;\n    }\n    /* 2. If specify normal drive strength, bandgap must not be disabled. */\n    if ((SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled) &&\n        (option->SysLDODriveStrength == kSPC_SysLDO_NormalDriveStrength))\n    {\n        return kStatus_SPC_BandgapModeWrong;\n    }\n\n    /* 3. Must disable system LDO high voltage detector before specifying overdrive voltage. */\n    if ((option->SysLDOVoltage == kSPC_SysLDO_OverDriveVoltage) &&\n        ((SPC_GetActiveModeVoltageDetectStatus(base) & SPC_ACTIVE_CFG_SYS_HVDE_MASK) != 0UL))\n    {\n        return kStatus_SPC_SYSLDOOverDriveVoltageFail;\n    }\n\n    (void)SPC_SetActiveModeSystemLDORegulatorDriveStrength(base, option->SysLDODriveStrength);\n    (void)SPC_SetActiveModeSystemLDORegulatorVoltageLevel(base, option->SysLDOVoltage);\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Set System LDO Regulator voltage level in Active mode.\n *\n * @note The system LDO regulator can only operate at the overdrive voltage level for a limited amount of time for the\n * life of chip.\n *\n * param base SPC peripheral base address.\n * param voltageLevel Specify the voltage level of System LDO Regulator in Active mode.\n *\n * retval #kStatus_Success Set System LDO Regulator voltage level in Active mode successfully.\n * retval #kStatus_SPC_SYSLDOOverDriveVoltageFail Must disable system LDO high voltage detector before specifying\n * overdrive voltage.\n */\nstatus_t SPC_SetActiveModeSystemLDORegulatorVoltageLevel(SPC_Type *base, spc_sys_ldo_voltage_level_t voltageLevel)\n{\n    if (voltageLevel == kSPC_SysLDO_OverDriveVoltage)\n    {\n        /* Must disable system LDO high voltage detector before specifying overdrive voltage. */\n        if ((SPC_GetActiveModeVoltageDetectStatus(base) & SPC_ACTIVE_CFG_SYS_HVDE_MASK) != 0UL)\n        {\n            return kStatus_SPC_SYSLDOOverDriveVoltageFail;\n        }\n    }\n\n    base->ACTIVE_CFG =\n        (base->ACTIVE_CFG & ~SPC_ACTIVE_CFG_SYSLDO_VDD_LVL_MASK) | SPC_ACTIVE_CFG_SYSLDO_VDD_LVL(voltageLevel);\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Set System LDO Regulator Drive Strength in Active mode.\n *\n * param base SPC peripheral base address.\n * param driveStrength Specify the drive strength  of System LDO Regulator in Active mode.\n *\n * retval #kStatus_Success Set System LDO Regulator drive strength in Active mode successfully.\n * retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Attempt to specify low drive strength is ignored due to any\n            voltage detect feature is enabled in active mode.\n * retval #kStatus_SPC_BandgapModeWrong Bandgap mode in Active mode must be programmed to a value that enables\n            the bandgap if attempt to specify normal drive strength.\n */\nstatus_t SPC_SetActiveModeSystemLDORegulatorDriveStrength(SPC_Type *base, spc_sys_ldo_drive_strength_t driveStrength)\n{\n    if (driveStrength == kSPC_SysLDO_LowDriveStrength)\n    {\n        /* If enabled any LVDs or HVDs, SPC will ignore the attempt to specify low drive strength. */\n        if (SPC_GetActiveModeVoltageDetectStatus(base) != 0UL)\n        {\n            return kStatus_SPC_SYSLDOLowDriveStrengthIgnore;\n        }\n    }\n\n    if (driveStrength == kSPC_SysLDO_NormalDriveStrength)\n    {\n        /* If specify normal drive strength, bandgap must not be disabled. */\n        if (SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n    }\n\n    base->ACTIVE_CFG =\n        (base->ACTIVE_CFG & ~SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK) | SPC_ACTIVE_CFG_SYSLDO_VDD_DS(driveStrength);\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Configs System LDO regulator in low power modes.\n *\n * This function configs System LDO regulator in low power modes.\n * If System LDO VDD Regulator Drive strength is set to normal, bandgap mode in low power\n * mode must be programmed to a value that enables the Bandgap.\n * If any High voltage detectors or Low Voltage detectors are kept enabled, configuration\n * to set System LDO Regulator drive strength as Low will be ignored.\n *\n * param base SPC peripheral base address.\n * param option Pointer to spc_lowpower_mode_Sys_LDO_option_t structure.\n *\n * retval kStatus_Success Config System LDO regulator in Low Power Mode successfully.\n * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * retval kStatus_SPC_BandgapModeWrong The bandgap mode setting in Low Power Mode is wrong.\n * retval kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to low will be ignored.\n */\nstatus_t SPC_SetLowPowerModeSystemLDORegulatorConfig(SPC_Type *base, const spc_lowpower_mode_sys_ldo_option_t *option)\n{\n    status_t status;\n\n    if ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n        /*\n         * $Line Coverage Justification$\n         * $ref spc_c_ref_1$.\n         */\n        return kStatus_SPC_Busy;\n    }\n\n    status = SPC_SetLowPowerModeSystemLDORegulatorDriveStrength(base, option->SysLDODriveStrength);\n\n    return status;\n}\n\n/*!\n * brief Set System LDO Regulator drive strength in Low Power Mode.\n *\n * param base SPC peripheral base address.\n * param driveStrength Specify the drive strength of System LDO Regulator in Low Power Mode.\n *\n * retval #kStatus_Success Set System LDO Regulator drive strength in Low Power Mode successfully.\n * retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Attempt to specify low drive strength is ignored due to any\n            voltage detect feature is enabled in low power mode.\n * retval #kStatus_SPC_BandgapModeWrong Bandgap mode in low power mode must be programmed to a value that enables\n            the bandgap if attempt to specify normal drive strength.\n */\nstatus_t SPC_SetLowPowerModeSystemLDORegulatorDriveStrength(SPC_Type *base, spc_sys_ldo_drive_strength_t driveStrength)\n{\n    if (driveStrength == kSPC_SysLDO_LowDriveStrength)\n    {\n        /* If enabled any LVDs or HVDs, SPC will ignore the attempt to specify low drive strength. */\n        if (SPC_GetLowPowerModeVoltageDetectStatus(base) != 0UL)\n        {\n            return kStatus_SPC_SYSLDOLowDriveStrengthIgnore;\n        }\n    }\n    else\n    {\n        /* If specify normal drive strength, bandgap must not be disabled. */\n        if (SPC_GetLowPowerModeBandgapMode(base) == kSPC_BandgapDisabled)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n    }\n\n    base->LP_CFG = (base->LP_CFG & ~SPC_LP_CFG_SYSLDO_VDD_DS_MASK) | SPC_LP_CFG_SYSLDO_VDD_DS(driveStrength);\n\n    return kStatus_Success;\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n/*!\n * brief Configs DCDC VDD Regulator in Active mode.\n *\n * note When changing the DCDC output voltage level, take care to change the CORE LDO voltage level.\n *\n * param base SPC peripheral base address.\n * param option Pointer to the spc_active_mode_DCDC_option_t structure.\n *\n * retval kStatus_Success Config DCDC regulator in Active power mode successful.\n * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * retval kStatus_SPC_BandgapModeWrong The bandgap mode setting in Active mode is wrong.\n */\nstatus_t SPC_SetActiveModeDCDCRegulatorConfig(SPC_Type *base, const spc_active_mode_dcdc_option_t *option)\n{\n    assert(option != NULL);\n    status_t status = kStatus_Success;\n\n    if ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n        /*\n         * $Line Coverage Justification$\n         * $ref spc_c_ref_1$.\n         */\n        return kStatus_SPC_Busy;\n    }\n\n    status = SPC_SetActiveModeDCDCRegulatorDriveStrength(base, option->DCDCDriveStrength);\n\n    if (status == kStatus_Success)\n    {\n        SPC_SetActiveModeDCDCRegulatorVoltageLevel(base, option->DCDCVoltage);\n    }\n\n    /*\n     * $Branch Coverage Justification$\n     * $ref spc_c_ref_1$.\n     */\n    while ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n    }\n\n    return status;\n}\n\n/*!\n * brief Set DCDC VDD Regulator drive strength in Active mode.\n *\n * note To set DCDC drive strength as Normal, the bandgap must be enabled.\n *\n * param base SPC peripheral base address.\n * param driveStrength Specify the DCDC VDD regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t.\n *\n * retval #kStatus_Success Set DCDC VDD Regulator drive strength in Active mode successfully.\n * retval #kStatus_SPC_BandgapModeWrong Set DCDC VDD Regulator drive strength to Normal, the Bandgap must be enabled.\n */\nstatus_t SPC_SetActiveModeDCDCRegulatorDriveStrength(SPC_Type *base, spc_dcdc_drive_strength_t driveStrength)\n{\n    if (driveStrength == kSPC_DCDC_NormalDriveStrength)\n    {\n        /* If specify normal drive strength, bandgap must not be disabled. */\n        if (SPC_GetActiveModeBandgapMode(base) == kSPC_BandgapDisabled)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n    }\n\n    base->ACTIVE_CFG =\n        ((base->ACTIVE_CFG) & (~SPC_ACTIVE_CFG_DCDC_VDD_DS_MASK)) | SPC_ACTIVE_CFG_DCDC_VDD_DS(driveStrength);\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Configs DCDC VDD Regulator in Low power modes.\n *\n * If DCDC VDD Drive Strength is set to Normal, the Bandgap mode in Low Power mode must be programmed\n * to a value that enables the Bandgap.\n * In Deep Power Down mode, DCDC regulator is always turned off.\n *\n * param base SPC peripheral base address.\n * param option Pointer to the spc_lowpower_mode_DCDC_option_t structure.\n *\n * retval kStatus_Success Config DCDC regulator in low power mode successfully.\n * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * retval kStatus_SPC_BandgapModeWrong The bandgap should be enabled before invoking this function.\n */\nstatus_t SPC_SetLowPowerModeDCDCRegulatorConfig(SPC_Type *base, const spc_lowpower_mode_dcdc_option_t *option)\n{\n    if ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n        /*\n         * $Line Coverage Justification$\n         * $ref spc_c_ref_1$.\n         */\n        return kStatus_SPC_Busy;\n    }\n\n    /* Check input parameter before setting registers. */\n    if ((option->DCDCDriveStrength == kSPC_DCDC_NormalDriveStrength) &&\n        (SPC_GetLowPowerModeBandgapMode(base) == kSPC_BandgapDisabled))\n    {\n        return kStatus_SPC_BandgapModeWrong;\n    }\n\n    /*\n        1. Configure to desired voltage level.\n        2. Change to low drive strength.\n        3. Configure same voltage level in active mode.\n    */\n    SPC_SetLowPowerModeDCDCRegulatorVoltageLevel(base, option->DCDCVoltage);\n\n    /* Change to desired drive strength. */\n    if (option->DCDCDriveStrength != kSPC_DCDC_LowDriveStrength)\n    {\n        (void)SPC_SetLowPowerModeDCDCRegulatorDriveStrength(base, option->DCDCDriveStrength);\n    }\n\n    /*\n     * $Branch Coverage Justification$\n     * $ref spc_c_ref_1$.\n     */\n    while ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n    }\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Set DCDC VDD Regulator drive strength in Low power mode.\n *\n * param base SPC peripheral base address.\n * param driveStrength Specify the DCDC VDD Regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t.\n *\n * retval #kStatus_Success Set DCDC VDD Regulator drive strength in Low power mode successfully.\n * retval #kStatus_SPC_BandgapModeWrong Set DCDC VDD Regulator drive strength to Normal, the Bandgap must be enabled.\n */\nstatus_t SPC_SetLowPowerModeDCDCRegulatorDriveStrength(SPC_Type *base, spc_dcdc_drive_strength_t driveStrength)\n{\n    if (driveStrength == kSPC_DCDC_NormalDriveStrength)\n    {\n        /* If specify normal drive strength, bandgap must not be disabled. */\n        if (SPC_GetLowPowerModeBandgapMode(base) == kSPC_BandgapDisabled)\n        {\n            return kStatus_SPC_BandgapModeWrong;\n        }\n    }\n\n    base->LP_CFG = ((base->LP_CFG) & (~SPC_LP_CFG_DCDC_VDD_DS_MASK)) | SPC_LP_CFG_DCDC_VDD_DS(driveStrength);\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Config DCDC Burst options\n *\n * param base SPC peripheral base address.\n * param config Pointer to spc_DCDC_burst_config_t structure.\n */\nvoid SPC_SetDCDCBurstConfig(SPC_Type *base, spc_dcdc_burst_config_t *config)\n{\n    assert(config != NULL);\n    uint32_t reg;\n    reg = base->DCDC_CFG;\n    reg &= ~(SPC_DCDC_CFG_FREQ_CNTRL_MASK | SPC_DCDC_CFG_FREQ_CNTRL_ON_MASK);\n    reg |= SPC_DCDC_CFG_FREQ_CNTRL(config->freq);\n    reg |= config->stabilizeBurstFreq ? SPC_DCDC_CFG_FREQ_CNTRL_ON(1U) : SPC_DCDC_CFG_FREQ_CNTRL_ON(0U);\n    base->DCDC_CFG = reg;\n\n    /* Blocking until previous DCDC burst completed. */\n    while ((base->DCDC_BURST_CFG & SPC_DCDC_BURST_CFG_BURST_ACK_MASK) == 0UL)\n    {\n    }\n\n    if ((config->sofwareBurstRequest) || (config->externalBurstRequest))\n    {\n        /* Clear DCDC burst acknowledge flag. */\n        base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_BURST_ACK_MASK;\n    }\n    base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_EXT_BURST_EN(config->externalBurstRequest);\n\n    if (config->sofwareBurstRequest)\n    {\n        base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_BURST_REQ_MASK;\n    }\n}\n\n/*!\n * brief Set the count value of the reference clock.\n *\n * This function set the count value of the reference clock to control the frequency\n * of dcdc refresh when dcdc is configured in Pulse Refresh mode.\n *\n * param base SPC peripheral base address.\n * param count The count value, 16 bit width.\n */\nvoid SPC_SetDCDCRefreshCount(SPC_Type *base, uint16_t count)\n{\n    uint32_t reg;\n\n    reg = base->DCDC_BURST_CFG;\n    reg &= ~SPC_DCDC_BURST_CFG_PULSE_REFRESH_CNT_MASK;\n    reg |= SPC_DCDC_BURST_CFG_PULSE_REFRESH_CNT(count);\n\n    base->DCDC_BURST_CFG = reg;\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n/*!\n * brief Configs all settings of regulators in Active mode at a time.\n *\n * @note This function is used to overwrite all settings of regulators(including bandgap mode, regulators'\n * drive strength and voltage level) in active mode at a time.\n *\n * @note Enable/disable LVDs/HVDs before invoking this function.\n *\n * @note This function will check input parameters based on hardware restrictions before setting registers, if input\n * parameters do not satisfy hardware restrictions the specific error will be reported.\n *\n *\n * @note Some hardware restrictions not covered, application should be aware of this and follow this hardware\n * restrictions otherwise some unknown issue may occur:\n *        1. If Core LDO's drive strength are set to same value in both Active mode and low power mode,\n *          the voltage level should also set to same value.\n *        2. When switching Core LDO's drive strength from low to normal, ensure the LDO_CORE high voltage level is set\n *          to same level that was set prior to switching to the LDO_CORE drive strength. Otherwise, if the LVDs are\n *          enabled, an unexpected LVD can occur.\n *\n * @note If this function can not satisfy some tricky settings, please invoke other low-level functions.\n *\n * param base SPC peripheral base address.\n * param config Pointer to spc_active_mode_regulators_config_t structure.\n * retval kStatus_Success Config regulators in Active power mode successful.\n * retval kStatus_SPC_BandgapModeWrong The bandgap mode setting in Active mode is wrong.\n * retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * retval kStatus_SPC_CORELDOVoltageWrong The selected voltage level in active mode is not allowed.\n * retval kStatus_SPC_SYSLDOOverDriveVoltageFail Fail to regulator to Over Drive Voltage.\n * retval kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to Low will be ignored.\n * retval kStatus_SPC_DCDCLowDriveStrengthIgnore Set driver strength to Low will be ignored.\n */\nstatus_t SPC_SetActiveModeRegulatorsConfig(SPC_Type *base, const spc_active_mode_regulators_config_t *config)\n{\n    assert(config != NULL);\n\n    uint32_t activeModeVDValue = SPC_GetActiveModeVoltageDetectStatus(base);\n\n    /* Check input parameters */\n    /*  1. Bandgap should not be disabled if any of regulator in normal drive strength or\n            if any of LVDs/HVDs are enabled or if VDD CORE glitch detect are enabled. */\n    if ((config->bandgapMode == kSPC_BandgapDisabled) &&\n        ((activeModeVDValue != 0UL)\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n         || (SPC_CheckActiveModeVddCoreGlitchDetectEnabled(base) == true)\n#endif /* FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n         || (config->DCDCOption.DCDCDriveStrength == kSPC_DCDC_NormalDriveStrength)\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n         || (config->SysLDOOption.SysLDODriveStrength == kSPC_SysLDO_NormalDriveStrength)\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS)\n         || (config->CoreLDOOption.CoreLDODriveStrength == kSPC_CoreLDO_NormalDriveStrength)\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n             ))\n    {\n        return kStatus_SPC_BandgapModeWrong;\n    }\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n    /*  2. Must disable system LDO high voltage detector before specifying SysLDO to overdrive voltage  */\n    if (((activeModeVDValue & SPC_ACTIVE_CFG_SYS_HVDE_MASK) != 0UL) &&\n        (config->SysLDOOption.SysLDOVoltage == kSPC_SysLDO_OverDriveVoltage))\n    {\n        return kStatus_SPC_SYSLDOOverDriveVoltageFail;\n    }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n    /* 3. To set System LDO's drive strength to low, all LVDs and HVDs must be disabled. */\n    if ((activeModeVDValue != 0UL) && (config->SysLDOOption.SysLDODriveStrength == kSPC_SysLDO_LowDriveStrength))\n    {\n        return kStatus_SPC_SYSLDOLowDriveStrengthIgnore;\n    }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS)\n    /* 4. To set Core LDO's drive strength to low, all LVDs and HVDs must be disabled. */\n    if ((activeModeVDValue != 0UL) && (config->CoreLDOOption.CoreLDODriveStrength == kSPC_CoreLDO_LowDriveStrength))\n    {\n        return kStatus_SPC_CORELDOLowDriveStrengthIgnore;\n    }\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n    /* 5. Core LDO and DCDC should have same voltage level. */\n    if ((uint8_t)config->DCDCOption.DCDCVoltage != (uint8_t)config->CoreLDOOption.CoreLDOVoltage)\n    {\n        return kStatus_SPC_CORELDOVoltageWrong;\n    }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n    if ((base->SC & SPC_SC_BUSY_MASK) != 0UL)\n    {\n        return kStatus_SPC_Busy;\n    }\n\n    base->ACTIVE_CFG =\n        ((base->ACTIVE_CFG) & ~(SPC_ACTIVE_CFG_BGMODE_MASK)) | SPC_ACTIVE_CFG_BGMODE(config->bandgapMode);\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT)\n    SPC_EnableActiveModeCMPBandgapBuffer(base, config->lpBuff);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n    (void)SPC_SetActiveModeSystemLDORegulatorConfig(base, &config->SysLDOOption);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n    (void)SPC_SetActiveModeDCDCRegulatorConfig(base, &config->DCDCOption);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n    (void)SPC_SetActiveModeCoreLDORegulatorConfig(base, &config->CoreLDOOption);\n\n    return kStatus_Success;\n}\n\n/*!\n * brief Configs regulators in Low Power mode.\n *\n * This function provides the method to config all on-chip regulators in Low Power mode.\n *\n * param base SPC peripheral base address.\n * param config Pointer to spc_lowpower_mode_regulators_config_t structure.\n * retval #kStatus_Success Config regulators in Low power mode successful.\n * retval #kStatus_SPC_BandgapModeWrong The bandgap should not be disabled based on input settings.\n * retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Set driver strength to low will be ignored.\n * retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to low will be ignored.\n * retval #kStatus_SPC_CORELDOVoltageWrong Core LDO and System LDO do not have same voltage level.\n */\nstatus_t SPC_SetLowPowerModeRegulatorsConfig(SPC_Type *base, const spc_lowpower_mode_regulators_config_t *config)\n{\n    assert(config != NULL);\n    uint32_t lpModeVDValue = SPC_GetLowPowerModeVoltageDetectStatus(base);\n\n    /* Check input parameters */\n    /*  1. Bandgap should not be disabled if any of regulator in normal drive strength or\n            if any of LVDs/HVDs are enabled or if VDD CORE glitch detect are enabled. */\n    if ((config->bandgapMode == kSPC_BandgapDisabled) &&\n        ((lpModeVDValue != 0UL)\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n         || (SPC_CheckLowPowerModeVddCoreGlitchDetectEnabled(base) == true)\n#endif /* FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n         || (config->DCDCOption.DCDCDriveStrength == kSPC_DCDC_NormalDriveStrength)\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n         || (config->SysLDOOption.SysLDODriveStrength == kSPC_SysLDO_NormalDriveStrength)\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS)\n         || (config->CoreLDOOption.CoreLDODriveStrength == kSPC_CoreLDO_NormalDriveStrength)\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n             ))\n    {\n        return kStatus_SPC_BandgapModeWrong;\n    }\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n    /* 2. To set System LDO's drive strength to low, all LVDs and HVDs must be disabled. */\n    if ((lpModeVDValue != 0UL) && (config->SysLDOOption.SysLDODriveStrength == kSPC_SysLDO_LowDriveStrength))\n    {\n        return kStatus_SPC_SYSLDOLowDriveStrengthIgnore;\n    }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS)\n    /* 3. To set Core LDO's drive strength to low, all LVDs and HVDs must be disabled. */\n    if ((lpModeVDValue != 0UL) && (config->CoreLDOOption.CoreLDODriveStrength == kSPC_CoreLDO_LowDriveStrength))\n    {\n        return kStatus_SPC_CORELDOLowDriveStrengthIgnore;\n    }\n#endif /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n    /* 5. Core LDO and DCDC should have same voltage level. */\n    if ((uint8_t)config->DCDCOption.DCDCVoltage != (uint8_t)config->CoreLDOOption.CoreLDOVoltage)\n    {\n        return kStatus_SPC_CORELDOVoltageWrong;\n    }\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n    base->LP_CFG = ((base->LP_CFG) & ~(SPC_LP_CFG_BGMODE_MASK)) | SPC_LP_CFG_BGMODE(config->bandgapMode);\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT)\n    SPC_EnableLowPowerModeCMPBandgapBuffer(base, config->lpBuff);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT)\n    SPC_EnableLowPowerModeCoreVDDInternalVoltageScaling(base, config->CoreIVS);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT */\n    SPC_EnableLowPowerModeLowPowerIREF(base, config->lpIREF);\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n    (void)SPC_SetLowPowerModeSystemLDORegulatorConfig(base, &config->SysLDOOption);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n    (void)SPC_SetLowPowerModeDCDCRegulatorConfig(base, &config->DCDCOption);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n    (void)SPC_SetLowPowerModeCoreLDORegulatorConfig(base, &config->CoreLDOOption);\n\n    return kStatus_Success;\n}\n"
  },
  {
    "path": "hw/bsp/mcx/drivers/spc/fsl_spc.h",
    "content": "/*\n * Copyright 2022-2024 NXP\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef FSL_SPC_H_\n#define FSL_SPC_H_\n#include \"fsl_common.h\"\n\n/*!\n * @addtogroup mcx_spc\n * @{\n */\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*! @name Driver version */\n/*! @{ */\n/*! @brief SPC driver version 2.4.2. */\n#define FSL_SPC_DRIVER_VERSION (MAKE_VERSION(2, 4, 2))\n/*! @} */\n\n#define SPC_EVD_CFG_REG_EVDISO_SHIFT   0UL\n#define SPC_EVD_CFG_REG_EVDLPISO_SHIFT 8UL\n#define SPC_EVD_CFG_REG_EVDSTAT_SHIFT  16UL\n\n#define SPC_EVD_CFG_REG_EVDISO(x)   ((uint32_t)(x) << SPC_EVD_CFG_REG_EVDISO_SHIFT)\n#define SPC_EVD_CFG_REG_EVDLPISO(x) ((uint32_t)(x) << SPC_EVD_CFG_REG_EVDLPISO_SHIFT)\n#define SPC_EVD_CFG_REG_EVDSTAT(x)  ((uint32_t)(x) << SPC_EVD_CFG_REG_EVDSTAT_SHIFT)\n\n#if (defined(SPC_GLITCH_DETECT_SC_CNT_SELECT_MASK))\n#define VDD_CORE_GLITCH_DETECT_SC                             GLITCH_DETECT_SC\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG_MASK SPC_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG_MASK\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG      SPC_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_LOCK_MASK               SPC_GLITCH_DETECT_SC_LOCK_MASK\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_CNT_SELECT_MASK         SPC_GLITCH_DETECT_SC_CNT_SELECT_MASK\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_CNT_SELECT              SPC_GLITCH_DETECT_SC_CNT_SELECT\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_RE_MASK                 SPC_GLITCH_DETECT_SC_RE_MASK\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_RE                      SPC_GLITCH_DETECT_SC_RE\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_TIMEOUT_MASK            SPC_GLITCH_DETECT_SC_TIMEOUT_MASK\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_TIMEOUT                 SPC_GLITCH_DETECT_SC_TIMEOUT\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_IE_MASK                 SPC_GLITCH_DETECT_SC_IE_MASK\n#define SPC_VDD_CORE_GLITCH_DETECT_SC_IE                      SPC_GLITCH_DETECT_SC_IE\n#endif\n\n/*!\n * @brief SPC status enumeration.\n *\n * @note Some device(such as MCXA family) do not equip DCDC or System LDO, please refer to the reference manual\n * to check.\n */\nenum\n{\n    kStatus_SPC_Busy = MAKE_STATUS(kStatusGroup_SPC, 0U), /*!< The SPC instance is busy executing any\n                                                                type of power mode transition. */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n    kStatus_SPC_DCDCLowDriveStrengthIgnore = MAKE_STATUS(kStatusGroup_SPC, 1U), /*!< DCDC Low drive strength setting be\n                                                                                    ignored for LVD/HVD enabled. */\n    kStatus_SPC_DCDCPulseRefreshModeIgnore = MAKE_STATUS(kStatusGroup_SPC, 2U), /*!< DCDC Pulse Refresh Mode drive\n                                                                    strength setting be ignored for LVD/HVD enabled. */\n#endif                                                                          /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n    kStatus_SPC_SYSLDOOverDriveVoltageFail = MAKE_STATUS(kStatusGroup_SPC, 3U), /*!< SYS LDO regulate to Over drive\n                                                                    voltage failed for SYS LDO HVD must be disabled. */\n    kStatus_SPC_SYSLDOLowDriveStrengthIgnore = MAKE_STATUS(kStatusGroup_SPC, 4U),  /*!< SYS LDO Low driver strength\n                                                                        setting be ignored for LDO LVD/HVD enabled. */\n#endif                                                                             /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n    kStatus_SPC_CORELDOLowDriveStrengthIgnore = MAKE_STATUS(kStatusGroup_SPC, 5U), /*!< CORE LDO Low driver strength\n                                                                        setting be ignored for LDO LVD/HVD enabled. */\n    kStatus_SPC_CORELDOVoltageWrong   = MAKE_STATUS(kStatusGroup_SPC, 7U),         /*!< Core LDO voltage is wrong. */\n    kStatus_SPC_CORELDOVoltageSetFail = MAKE_STATUS(kStatusGroup_SPC, 8U),         /*!< Core LDO voltage set fail. */\n    kStatus_SPC_BandgapModeWrong      = MAKE_STATUS(kStatusGroup_SPC, 6U),         /*!< Selected Bandgap Mode wrong. */\n};\n\n/*!\n * @brief Voltage Detect Status Flags.\n */\nenum _spc_voltage_detect_flags\n{\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD)\n    kSPC_IOVDDHighVoltageDetectFlag = SPC_VD_STAT_IOVDD_HVDF_MASK,      /*!< IO VDD High-Voltage detect flag. */\n    kSPC_IOVDDLowVoltageDetectFlag  = SPC_VD_STAT_IOVDD_LVDF_MASK,      /*!< IO VDD Low-Voltage detect flag. */\n#endif                                                                  /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */\n    kSPC_SystemVDDHighVoltageDetectFlag = SPC_VD_STAT_SYSVDD_HVDF_MASK, /*!< System VDD High-Voltage detect flag. */\n    kSPC_SystemVDDLowVoltageDetectFlag  = SPC_VD_STAT_SYSVDD_LVDF_MASK, /*!< System VDD Low-Voltage detect flag. */\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD)\n    kSPC_CoreVDDHighVoltageDetectFlag = SPC_VD_STAT_COREVDD_HVDF_MASK,  /*!< Core VDD High-Voltage detect flag. */\n#endif                                                                  /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */\n    kSPC_CoreVDDLowVoltageDetectFlag = SPC_VD_STAT_COREVDD_LVDF_MASK,   /*!< Core VDD Low-Voltage detect flag. */\n};\n\n/*!\n * @brief SPC power domain isolation status.\n * @note Some devices(such as MCXA family) do not contain WAKE Power Domain, please refer to the reference manual to\n * check.\n */\nenum _spc_power_domains\n{\n    kSPC_MAINPowerDomainRetain = 1UL << 16U, /*!< Peripherals and IO pads retain in MAIN Power Domain. */\n    kSPC_WAKEPowerDomainRetain = 1UL << 17U, /*!< Peripherals and IO pads retain in WAKE Power Domain. */\n};\n\n/*!\n * @brief The enumeration of all analog module that can be controlled by SPC in active or low-power modes.\n * @anchor spc_analog_module_control\n */\nenum _spc_analog_module_control\n{\n    kSPC_controlVref       = 1UL << 0UL,  /*!< Enable/disable VREF in active or low-power modes. */\n    kSPC_controlUsb3vDet   = 1UL << 1UL,  /*!< Enable/disable USB3V_Det in active or low-power modes. */\n    kSPC_controlDac0       = 1UL << 4UL,  /*!< Enable/disable DAC0 in active or low-power modes. */\n    kSPC_controlDac1       = 1UL << 5UL,  /*!< Enable/disable DAC1 in active or low-power modes.  */\n    kSPC_controlDac2       = 1UL << 6UL,  /*!< Enable/disable DAC2 in active or low-power modes. */\n    kSPC_controlOpamp0     = 1UL << 8UL,  /*!< Enable/disable OPAMP0 in active or low-power modes. */\n    kSPC_controlOpamp1     = 1UL << 9UL,  /*!< Enable/disable OPAMP1 in active or low-power modes. */\n    kSPC_controlOpamp2     = 1UL << 10UL, /*!< Enable/disable OPAMP2 in active or low-power modes. */\n    kSPC_controlCmp0       = 1UL << 16UL, /*!< Enable/disable CMP0 in active or low-power modes. */\n    kSPC_controlCmp1       = 1UL << 17UL, /*!< Enable/disable CMP1 in active or low-power modes. */\n    kSPC_controlCmp2       = 1UL << 18UL, /*!< Enable/disable CMP2 in active or low-power modes. */\n    kSPC_controlCmp0Dac    = 1UL << 20UL, /*!< Enable/disable CMP0_DAC in active or low-power modes. */\n    kSPC_controlCmp1Dac    = 1UL << 21UL, /*!< Enable/disable CMP1_DAC in active or low-power modes. */\n    kSPC_controlCmp2Dac    = 1UL << 22UL, /*!< Enable/disable CMP2_DAC in active or low-power modes. */\n    kSPC_controlAllModules = 0x770773UL,  /*!< Enable/disable all modules in active or low-power modes. */\n};\n\n/*!\n * @brief The enumeration of spc power domain, the connected power domain is chip specific, please refer to chip's RM\n * for details.\n */\ntypedef enum _spc_power_domain_id\n{\n    kSPC_PowerDomain0 = 0U, /*!< Power domain0, the connected power domain is chip specific. */\n    kSPC_PowerDomain1 = 1U, /*!< Power domain1, the connected power domain is chip specific. */\n} spc_power_domain_id_t;\n\n/*!\n * @brief The enumeration of Power domain's low power mode.\n */\ntypedef enum _spc_power_domain_low_power_mode\n{\n    kSPC_SleepWithSYSClockRunning     = 0U, /*!< Power domain request SLEEP mode with SYS clock running. */\n    kSPC_DeepSleepWithSysClockOff     = 1U, /*!< Power domain request deep sleep mode with system clock off. */\n    kSPC_PowerDownWithSysClockOff     = 2U, /*!< Power domain request power down mode with system clock off. */\n    kSPC_DeepPowerDownWithSysClockOff = 4U, /*!< Power domain request deep power down mode with system clock off. */\n} spc_power_domain_low_power_mode_t;\n\n/*!\n * @brief SPC low power request output pin polarity.\n */\ntypedef enum _spc_lowPower_request_pin_polarity\n{\n    kSPC_HighTruePolarity = 0x0U, /*!< Control the High Polarity of the Low Power Request Pin. */\n    kSPC_LowTruePolarity  = 0x1U, /*!< Control the Low Polarity of the Low Power Request Pin. */\n} spc_lowpower_request_pin_polarity_t;\n\n/*!\n * @brief SPC low power request output override.\n */\ntypedef enum _spc_lowPower_request_output_override\n{\n    kSPC_LowPowerRequestNotForced  = 0x0U, /*!< Not Forced. */\n    kSPC_LowPowerRequestReserved   = 0x1U, /*!< Reserved. */\n    kSPC_LowPowerRequestForcedLow  = 0x2U, /*!< Forced Low (Ignore LowPower request output polarity setting.) */\n    kSPC_LowPowerRequestForcedHigh = 0x3U, /*!< Forced High (Ignore LowPower request output polarity setting.) */\n} spc_lowpower_request_output_override_t;\n\n/*!\n * @brief SPC Bandgap mode enumeration in Active mode or Low Power mode.\n */\ntypedef enum _spc_bandgap_mode\n{\n    kSPC_BandgapDisabled              = 0x0U, /*!< Bandgap disabled. */\n    kSPC_BandgapEnabledBufferDisabled = 0x1U, /*!< Bandgap enabled with Buffer disabled. */\n    kSPC_BandgapEnabledBufferEnabled  = 0x2U, /*!< Bandgap enabled with Buffer enabled. */\n    kSPC_BandgapReserved              = 0x3U, /*!< Reserved. */\n} spc_bandgap_mode_t;\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n/*!\n * @brief DCDC regulator voltage level enumeration in Active mode or Low Power Mode.\n *\n * @note #kSPC_DCDC_RetentionVoltage not supported for all power modes.\n */\ntypedef enum _spc_dcdc_voltage_level\n{\n    kSPC_DCDC_RetentionVoltage = 0x0U, /*!< DCDC_CORE Regulator regulate to retention\n                                           Voltage(Only supportedin low power modes) */\n    kSPC_DCDC_MidVoltage       = 0x1U, /*!< DCDC_CORE Regulator regulate to Mid Voltage(1.0V). */\n    kSPC_DCDC_NormalVoltage    = 0x2U, /*!< DCDC_CORE Regulator regulate to Normal Voltage(1.1V). */\n    kSPC_DCDC_OverdriveVoltage = 0x3U, /*!< DCDC_CORE Regulator regulate to Safe-Mode Voltage(1.2V). */\n} spc_dcdc_voltage_level_t;\n\n/*!\n * @brief DCDC regulator Drive Strength enumeration in Active mode or Low Power Mode.\n *\n * @note Different drive strength differ in these DCDC characteristics:\n *              Maximum load current\n *              Quiescent current\n *              Transient response.\n */\ntypedef enum _spc_dcdc_drive_strength\n{\n    kSPC_DCDC_PulseRefreshMode = 0x0U,    /*!< DCDC_CORE Regulator Drive Strength set to Pulse Refresh Mode,\n                                           * This enum member is only useful for Low Power Mode config, please\n                                           * note that pulse refresh mode is invalid in SLEEP mode.\n                                           */\n    kSPC_DCDC_LowDriveStrength    = 0x1U, /*!< DCDC_CORE regulator Drive Strength set to low. */\n    kSPC_DCDC_NormalDriveStrength = 0x2U, /*!< DCDC_CORE regulator Drive Strength set to Normal. */\n} spc_dcdc_drive_strength_t;\n#endif                                    /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n/*!\n * @brief SYS LDO regulator voltage level enumeration in Active mode.\n */\ntypedef enum _spc_sys_ldo_voltage_level\n{\n    kSPC_SysLDO_NormalVoltage    = 0x0U, /*!< SYS LDO VDD Regulator regulate to Normal Voltage(1.8V). */\n    kSPC_SysLDO_OverDriveVoltage = 0x1U, /*!< SYS LDO VDD Regulator regulate to Over Drive Voltage(2.5V). */\n} spc_sys_ldo_voltage_level_t;\n\n/*!\n * @brief SYS LDO regulator Drive Strength enumeration in Active mode or Low Power mode.\n */\ntypedef enum _spc_sys_ldo_drive_strength\n{\n    kSPC_SysLDO_LowDriveStrength    = 0x0U, /*!< SYS LDO VDD regulator Drive Strength set to low. */\n    kSPC_SysLDO_NormalDriveStrength = 0x1U, /*!< SYS LDO VDD regulator Drive Strength set to Normal. */\n} spc_sys_ldo_drive_strength_t;\n#endif                                      /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n/*!\n * @brief Core LDO regulator voltage level enumeration in Active mode or Low Power mode.\n */\ntypedef enum _spc_core_ldo_voltage_level\n{\n    kSPC_CoreLDO_UnderDriveVoltage = 0x0U, /*!< @deprecated, to align with description of latest RM, please use\n                                            #kSPC_Core_LDO_RetentionVoltage as instead. */\n    kSPC_Core_LDO_RetentionVoltage = 0x0U, /*!< Core LDO VDD regulator regulate to retention voltage, please note that\n                                           only useful in low power modes and not all devices support this options\n                                           please refer to devices' RM for details. */\n    kSPC_CoreLDO_MidDriveVoltage  = 0x1U,  /*!< Core LDO VDD regulator regulate to Mid Drive Voltage. */\n    kSPC_CoreLDO_NormalVoltage    = 0x2U,  /*!< Core LDO VDD regulator regulate to Normal Voltage. */\n    kSPC_CoreLDO_OverDriveVoltage = 0x3U,  /*!< Core LDO VDD regulator regulate to overdrive Voltage. */\n} spc_core_ldo_voltage_level_t;\n\n/*!\n * @brief CORE LDO VDD regulator Drive Strength enumeration in Low Power mode.\n */\ntypedef enum _spc_core_ldo_drive_strength\n{\n    kSPC_CoreLDO_LowDriveStrength    = 0x0U, /*!< Core LDO VDD regulator Drive Strength set to low. */\n    kSPC_CoreLDO_NormalDriveStrength = 0x1U, /*!< Core LDO VDD regulator Drive Strength set to Normal. */\n} spc_core_ldo_drive_strength_t;\n\n/*!\n * @brief IO VDD Low-Voltage Level Select.\n */\ntypedef enum _spc_low_voltage_level_select\n{\n    kSPC_LowVoltageNormalLevel = 0x0U, /*!< @deprecated, please use kSPC_LowVoltageHighRange as instead. */\n    kSPC_LowVoltageSafeLevel   = 0x1U, /*!< @deprecated, please use kSPC_LowVoltageLowRange as instead. */\n\n    kSPC_LowVoltageHighRange = 0x0U,   /*!< High range LVD threshold. */\n    kSPC_LowVoltageLowRange  = 0x1U,  /*!< Low range LVD threshold. */\n} spc_low_voltage_level_select_t;\n\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n/*!\n * @brief Used to select output of 4-bit ripple counter is used to monitor a glitch on VDD core.\n */\ntypedef enum _spc_vdd_core_glitch_ripple_counter_select\n{\n    kSPC_selectBit0Of4bitRippleCounter = 0x0U, /*!< Select bit-0 of 4-bit Ripple Counter\n                                                    to detect glitch on VDD Core. */\n    kSPC_selectBit1Of4bitRippleCounter = 0x1U, /*!< Select bit-1 of 4-bit Ripple Counter\n                                                    to detect glitch on VDD Core. */\n    kSPC_selectBit2Of4bitRippleCounter = 0x2U, /*!< Select bit-2 of 4-bit Ripple Counter\n                                                    to detect glitch on VDD Core. */\n    kSPC_selectBit3Of4bitRippleCounter = 0x3U, /*!< Select bit-3 of 4-bit Ripple Counter\n                                                    to detect glitch on VDD Core. */\n} spc_vdd_core_glitch_ripple_counter_select_t;\n#endif\n\n/*!\n * @brief The list of the operating voltage for the SRAM's read/write timing margin.\n */\ntypedef enum _spc_sram_operate_voltage\n{\n    kSPC_sramOperateAt1P0V = 0x1U, /*!< SRAM configured for 1.0V operation. */\n    kSPC_sramOperateAt1P1V = 0x2U, /*!< SRAM configured for 1.1V operation. */\n    kSPC_sramOperateAt1P2V = 0x3U, /*!< SRAM configured for 1.2V operation. */\n} spc_sram_operate_voltage_t;\n\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n/*!\n * @brief The configuration of VDD Core glitch detector.\n */\ntypedef struct _spc_vdd_core_glitch_detector_config\n{\n    spc_vdd_core_glitch_ripple_counter_select_t rippleCounterSelect; /*!< Used to set ripple counter. */\n    uint8_t resetTimeoutValue; /*!< The timeout value used to reset glitch detect/compare logic after an initial\n                              glitch is detected. */\n    bool enableReset;          /*!< Used to enable/disable POR/LVD reset that caused by CORE VDD glitch detect error. */\n    bool enableInterrupt;      /*!< Used to enable/disable hardware interrupt if CORE VDD glitch detect error. */\n} spc_vdd_core_glitch_detector_config_t;\n#endif\n\ntypedef struct _spc_sram_voltage_config\n{\n    spc_sram_operate_voltage_t operateVoltage; /*!< Specifies the operating voltage for the SRAM's\n                                                     read/write timing margin.  */\n    bool requestVoltageUpdate;                 /*!< Used to control whether request an SRAM trim value change. */\n} spc_sram_voltage_config_t;\n\n/*!\n * @brief Low Power Request output pin configuration.\n */\ntypedef struct _spc_lowpower_request_config\n{\n    bool enable;                                     /*!< Low Power Request Output enable. */\n    spc_lowpower_request_pin_polarity_t polarity;    /*!< Low Power Request Output pin polarity select. */\n    spc_lowpower_request_output_override_t override; /*!< Low Power Request Output Override. */\n} spc_lowpower_request_config_t;\n\n/*!\n * @brief Core LDO regulator options in Active mode.\n */\ntypedef struct _spc_active_mode_core_ldo_option\n{\n    spc_core_ldo_voltage_level_t CoreLDOVoltage; /*!< Core LDO Regulator Voltage Level selection in Active mode. */\n#if defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS\n    spc_core_ldo_drive_strength_t CoreLDODriveStrength; /*!< Core LDO Regulator Drive Strength\n                                                            selection in Active mode */\n#endif                                                  /* FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n} spc_active_mode_core_ldo_option_t;\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n/*!\n * @brief System LDO regulator options in Active mode.\n */\ntypedef struct _spc_active_mode_sys_ldo_option\n{\n    spc_sys_ldo_voltage_level_t SysLDOVoltage; /*!< System LDO Regulator Voltage Level selection in Active mode. */\n    spc_sys_ldo_drive_strength_t SysLDODriveStrength; /*!< System LDO Regulator Drive Strength\n                                                            selection in Active mode. */\n} spc_active_mode_sys_ldo_option_t;\n#endif                                                /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n/*!\n * @brief DCDC regulator options in Active mode.\n */\ntypedef struct _spc_active_mode_dcdc_option\n{\n    spc_dcdc_voltage_level_t DCDCVoltage;        /*!< DCDC Regulator Voltage Level selection in Active mode. */\n    spc_dcdc_drive_strength_t DCDCDriveStrength; /*!< DCDC_CORE Regulator Drive Strength selection in Active mode. */\n} spc_active_mode_dcdc_option_t;\n#endif                                           /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n/*!\n * @brief Core LDO regulator options in Low Power mode.\n */\ntypedef struct _spc_lowpower_mode_core_ldo_option\n{\n    spc_core_ldo_voltage_level_t CoreLDOVoltage; /*!< Core LDO Regulator Voltage Level selection in Low Power mode. */\n    spc_core_ldo_drive_strength_t CoreLDODriveStrength; /*!< Core LDO Regulator Drive Strength\n                                                            selection in Low Power mode */\n} spc_lowpower_mode_core_ldo_option_t;\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n/*!\n * @brief System LDO regulator options in Low Power mode.\n */\ntypedef struct _spc_lowpower_mode_sys_ldo_option\n{\n    spc_sys_ldo_drive_strength_t SysLDODriveStrength; /*!< System LDO Regulator Drive Strength\n                                                            selection in Low Power mode. */\n} spc_lowpower_mode_sys_ldo_option_t;\n#endif                                                /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n/*!\n * @brief DCDC regulator options in Low Power mode.\n */\ntypedef struct _spc_lowpower_mode_dcdc_option\n{\n    spc_dcdc_voltage_level_t DCDCVoltage;        /*!< DCDC Regulator Voltage Level selection in Low Power mode. */\n    spc_dcdc_drive_strength_t DCDCDriveStrength; /*!< DCDC_CORE Regulator Drive Strength selection in Low Power mode. */\n} spc_lowpower_mode_dcdc_option_t;\n\n/*!\n * @brief DCDC Burst configuration.\n * @deprecated Do not recommend to use this structure.\n */\ntypedef struct _spc_dcdc_burst_config\n{\n    bool sofwareBurstRequest;  /*!< Enable/Disable DCDC Software Burst Request. */\n    bool externalBurstRequest; /*!< Enable/Disable DCDC External Burst Request. */\n    bool stabilizeBurstFreq;   /*!< Enable/Disable DCDC frequency stabilization. */\n    uint8_t freq;              /*!< The frequency of the current burst.  */\n} spc_dcdc_burst_config_t;\n#endif                         /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n/*!\n * @brief CORE/SYS/IO VDD Voltage Detect options.\n */\ntypedef struct _spc_voltage_detect_option\n{\n    bool HVDInterruptEnable; /*!< CORE/SYS/IO VDD High Voltage Detect interrupt enable. */\n    bool HVDResetEnable;     /*!< CORE/SYS/IO VDD High Voltage Detect reset enable. */\n    bool LVDInterruptEnable; /*!< CORE/SYS/IO VDD Low Voltage Detect interrupt enable. */\n    bool LVDResetEnable;     /*!< CORE/SYS/IO VDD Low Voltage Detect reset enable. */\n} spc_voltage_detect_option_t;\n\n/*!\n * @brief Core Voltage Detect configuration.\n */\ntypedef struct _spc_core_voltage_detect_config\n{\n    spc_voltage_detect_option_t option; /*!< Core VDD Voltage Detect option. */\n} spc_core_voltage_detect_config_t;\n\n/*!\n * @brief System Voltage Detect Configuration.\n */\ntypedef struct _spc_system_voltage_detect_config\n{\n    spc_voltage_detect_option_t option;   /*!< System VDD Voltage Detect option. */\n    spc_low_voltage_level_select_t level; /*!< @deprecated, reserved for all devices, will removed in next release. */\n} spc_system_voltage_detect_config_t;\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD)\n/*!\n * @brief IO Voltage Detect Configuration.\n */\ntypedef struct _spc_io_voltage_detect_config\n{\n    spc_voltage_detect_option_t option;   /*!< IO VDD Voltage Detect option. */\n    spc_low_voltage_level_select_t level; /*!< IO VDD Low-voltage level selection. */\n} spc_io_voltage_detect_config_t;\n#endif                                    /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */\n\n/*!\n * @brief Active mode configuration.\n */\ntypedef struct _spc_active_mode_regulators_config\n{\n    spc_bandgap_mode_t bandgapMode; /*!< Specify bandgap mode in active mode. */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT)\n    bool lpBuff; /*!< Enable/disable CMP bandgap buffer. */\n#endif           /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n    spc_active_mode_dcdc_option_t DCDCOption; /*!< Specify DCDC configurations in active mode. */\n#endif                                        /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n    spc_active_mode_sys_ldo_option_t SysLDOOption;   /*!< Specify System LDO configurations in active mode. */\n#endif                                               /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n    spc_active_mode_core_ldo_option_t CoreLDOOption; /*!< Specify Core LDO configurations in active mode. */\n} spc_active_mode_regulators_config_t;\n\n/*!\n * @brief Low Power Mode configuration.\n */\ntypedef struct _spc_lowpower_mode_regulators_config\n{\n    bool lpIREF;                    /*!< Enable/disable low power IREF in low power modes. */\n    spc_bandgap_mode_t bandgapMode; /*!< Specify bandgap mode in low power modes. */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT)\n    bool lpBuff; /*!< Enable/disable CMP bandgap buffer in low power modes. */\n#endif           /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT)\n    bool CoreIVS; /*!< Enable/disable CORE VDD internal voltage scaling. */\n#endif            /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n    spc_lowpower_mode_dcdc_option_t DCDCOption; /*!< Specify DCDC configurations in low power modes. */\n#endif                                          /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n    spc_lowpower_mode_sys_ldo_option_t SysLDOOption;   /*!< Specify system LDO configurations in low power modes. */\n#endif                                                 /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n    spc_lowpower_mode_core_ldo_option_t CoreLDOOption; /*!< Specify core LDO configurations in low power modes. */\n} spc_lowpower_mode_regulators_config_t;\n\n/*******************************************************************************\n * API\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus */\n\n/*!\n * @name SPC Status\n * @{\n */\n/*!\n * @brief Gets Isolation status for each power domains.\n *\n * This function gets the status which indicates whether certain\n * peripheral and the IO pads are in a latched state as a result\n * of having been in POWERDOWN mode.\n *\n * @param base SPC peripheral base address.\n * @return Current isolation status for each power domains. See @ref _spc_power_domains for details.\n */\nuint8_t SPC_GetPeriphIOIsolationStatus(SPC_Type *base);\n\n/*!\n * @brief Clears peripherals and I/O pads isolation flags for each power domains.\n *\n * This function clears peripherals and I/O pads isolation flags for each power domains.\n * After recovering from the POWERDOWN mode, user must invoke this function to release the\n * I/O pads and certain peripherals to their normal run mode state. Before invoking this\n * function, user must restore chip configuration in particular pin configuration for enabled\n * WUU wakeup pins.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_ClearPeriphIOIsolationFlag(SPC_Type *base)\n{\n    base->SC |= SPC_SC_ISO_CLR_MASK;\n}\n\n/*!\n * @brief Gets SPC busy status flag.\n *\n * This function gets SPC busy status flag. When SPC executing any type of power mode\n * transition in ACTIVE mode or any of the SOC low power mode, the SPC busy status flag is set\n * and this function returns true. When changing CORE LDO voltage level and DCDC voltage level\n * in ACTIVE mode, the SPC busy status flag is set and this function return true.\n *\n * @param base SPC peripheral base address.\n * @return Ack busy flag.\n *          true    -   SPC is busy.\n *          false   -   SPC is not busy.\n */\nstatic inline bool SPC_GetBusyStatusFlag(SPC_Type *base)\n{\n    return ((base->SC & SPC_SC_BUSY_MASK) != 0UL);\n}\n\n/*!\n * @brief Checks system low power request.\n *\n * @note Only when all power domains request low power mode entry, the result of this function is true. That means when\n * all power domains request low power mode entry, the SPC regulators will be controlled by LP_CFG register.\n *\n * @param base SPC peripheral base address.\n * @return The system low power request check result.\n *       - \\b true All power domains have requested low power mode and SPC has entered a low power state and power mode\n *                 configuration are based on the LP_CFG configuration register.\n *       - \\b false SPC in active mode and ACTIVE_CFG register control system power supply.\n */\nstatic inline bool SPC_CheckLowPowerReqest(SPC_Type *base)\n{\n    return ((base->SC & SPC_SC_SPC_LP_REQ_MASK) == SPC_SC_SPC_LP_REQ_MASK);\n}\n\n/*!\n * @brief Clears system low power request, set SPC in active mode.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_ClearLowPowerRequest(SPC_Type *base)\n{\n    base->SC |= SPC_SC_SPC_LP_REQ_MASK;\n}\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SWITCH_STATE_BIT) && FSL_FEATURE_MCX_SPC_HAS_SWITCH_STATE_BIT)\n/*!\n * @brief Checks whether the power switch is on.\n *\n * @param base SPC peripheral base address.\n *\n * @retval true The power switch is on.\n * @retval false The power switch is off.\n */\nstatic inline bool SPC_CheckSwitchState(SPC_Type *base)\n{\n    return ((base->SC & SPC_SC_SWITCH_STATE_MASK) != 0UL);\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SWITCH_STATE_BIT */\n\n/*!\n * @brief Gets selected power domain's requested low power mode.\n *\n * @param base SPC peripheral base address.\n * @param powerDomainId Power Domain Id, please refer to @ref spc_power_domain_id_t.\n *\n * @return The selected power domain's requested low power mode, please refer to @ref spc_power_domain_low_power_mode_t.\n */\nspc_power_domain_low_power_mode_t SPC_GetPowerDomainLowPowerMode(SPC_Type *base, spc_power_domain_id_t powerDomainId);\n\n/*!\n * @brief Checks power domain's low power request.\n *\n * @param base SPC peripheral base address.\n * @param powerDomainId Power Domain Id, please refer to @ref spc_power_domain_id_t.\n * @return The result of power domain's low power request.\n *            - \\b true The selected power domain requests low power mode entry.\n *            - \\b false The selected power domain does not request low power mode entry.\n */\nstatic inline bool SPC_CheckPowerDomainLowPowerRequest(SPC_Type *base, spc_power_domain_id_t powerDomainId)\n{\n    assert((uint8_t)powerDomainId < SPC_PD_STATUS_COUNT);\n    return ((base->PD_STATUS[(uint8_t)powerDomainId] & SPC_PD_STATUS_PWR_REQ_STATUS_MASK) ==\n            SPC_PD_STATUS_PWR_REQ_STATUS_MASK);\n}\n\n/*!\n * @brief Clears selected power domain's low power request flag.\n *\n * @param base SPC peripheral base address.\n * @param powerDomainId Power Domain Id, please refer to @ref spc_power_domain_id_t.\n */\nstatic inline void SPC_ClearPowerDomainLowPowerRequestFlag(SPC_Type *base, spc_power_domain_id_t powerDomainId)\n{\n    assert((uint8_t)powerDomainId < SPC_PD_STATUS_COUNT);\n    base->PD_STATUS[(uint8_t)powerDomainId] |= SPC_PD_STATUS_PD_LP_REQ_MASK;\n}\n\n/*! @} */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SRAMRETLDO_REG) && FSL_FEATURE_MCX_SPC_HAS_SRAMRETLDO_REG)\n/*!\n * @name SRAM Retention LDO Control APIs\n * @{\n */\n\n/*!\n * @brief Trims SRAM retention regulator reference voltage, trim step is 12 mV, range is around 0.48V to 0.85V.\n *\n * @param base SPC peripheral base address.\n * @param trimValue Reference voltage trim value.\n */\nstatic inline void SPC_TrimSRAMLdoRefVoltage(SPC_Type *base, uint8_t trimValue)\n{\n    base->SRAMRETLDO_REFTRIM =\n        ((base->SRAMRETLDO_REFTRIM & ~SPC_SRAMRETLDO_REFTRIM_REFTRIM_MASK) | SPC_SRAMRETLDO_REFTRIM_REFTRIM(trimValue));\n}\n\n/*!\n * @brief Enables/disables SRAM retention LDO.\n *\n * @param base SPC peripheral base address.\n * @param enable Used to enable/disable SRAM LDO :\n *          - \\b true Enable SRAM LDO;\n *          - \\b false Disable SRAM LDO.\n */\nstatic inline void SPC_EnableSRAMLdo(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->SRAMRETLDO_CNTRL |= SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON_MASK;\n    }\n    else\n    {\n        base->SRAMRETLDO_CNTRL &= ~SPC_SRAMRETLDO_CNTRL_SRAMLDO_ON_MASK;\n    }\n}\n\n/*!\n * @brief\n *\n * @todo Need to check.\n *\n * @param base SPC peripheral base address.\n * @param mask The OR'ed value of SRAM Array.\n */\nstatic inline void SPC_RetainSRAMArray(SPC_Type *base, uint8_t mask)\n{\n    base->SRAMRETLDO_CNTRL |= SPC_SRAMRETLDO_CNTRL_SRAM_RET_EN(mask);\n}\n\n/*! @} */\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SRAMRETLDO_REG */\n\n/*!\n * @name Low Power Request configuration\n * @{\n */\n/*!\n * @brief Configs Low power request output pin.\n *\n * This function config the low power request output pin\n *\n * @param base SPC peripheral base address.\n * @param config Pointer the @ref spc_lowpower_request_config_t structure.\n */\nvoid SPC_SetLowPowerRequestConfig(SPC_Type *base, const spc_lowpower_request_config_t *config);\n\n/*! @} */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_CFG_REG) && FSL_FEATURE_MCX_SPC_HAS_CFG_REG)\n/*!\n * @name Integrated Power Switch Control APIs\n * @{\n */\n\n/*!\n * @brief Enables/disables the integrated power switch manually.\n *\n * @param base SPC peripheral base address.\n * @param enable Used to enable/disable the integrated power switch:\n *             - \\b true Enable the integrated power switch;\n *             - \\b false Disable the integrated power switch.\n */\nstatic inline void SPC_EnableIntegratedPowerSwitchManually(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->CFG |= (SPC_CFG_INTG_PWSWTCH_SLEEP_ACTIVE_EN_MASK | SPC_CFG_INTG_PWSWTCH_WKUP_ACTIVE_EN_MASK);\n    }\n    else\n    {\n        base->CFG &= ~(SPC_CFG_INTG_PWSWTCH_SLEEP_ACTIVE_EN_MASK | SPC_CFG_INTG_PWSWTCH_WKUP_ACTIVE_EN_MASK);\n    }\n}\n\n/*!\n * @brief Enables/disables the integrated power switch automatically.\n *\n * To gate the integrated power switch when chip enter low power modes, and ungate the switch after wake-up from low\n * power modes:\n * @code\n *   SPC_EnableIntegratedPowerSwitchAutomatically(SPC, true, true);\n * @endcode\n *\n * @param base SPC peripheral base address.\n * @param sleepGate Enable the integrated power switch when chip enter low power modes:\n *          - \\b true SPC asserts an output pin at low-power entry to power-gate the switch;\n *          - \\b false SPC does not assert an output pin at low-power entry to power-gate the switch.\n * @param wakeupUngate Enables the switch after wake-up from low power modes:\n *          - \\b true SPC asserts an output pin at low-power exit to power-ungate the switch;\n *          - \\b false SPC does not assert an output pin at low-power exit to power-ungate the switch.\n */\nstatic inline void SPC_EnableIntegratedPowerSwitchAutomatically(SPC_Type *base, bool sleepGate, bool wakeupUngate)\n{\n    uint32_t tmp32 = ((base->CFG) & ~(SPC_CFG_INTG_PWSWTCH_SLEEP_EN_MASK | SPC_CFG_INTG_PWSWTCH_WKUP_EN_MASK));\n\n    tmp32 |= SPC_CFG_INTG_PWSWTCH_SLEEP_EN(sleepGate) | SPC_CFG_INTG_PWSWTCH_WKUP_EN(wakeupUngate);\n\n    base->CFG = tmp32;\n}\n\n/*! @} */\n#endif /* FSL_FEATURE_MCX_SPC_HAS_CFG_REG */\n\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n/*!\n * @name VDD Core Glitch Detector Control APIs\n * @{\n */\n\n/*!\n * @brief Configures VDD Core Glitch detector, including ripple counter selection, timeout value and so on.\n *\n * @param base SPC peripheral base address.\n * @param config Pointer to the structure in type of @ref spc_vdd_core_glitch_detector_config_t.\n */\nvoid SPC_ConfigVddCoreGlitchDetector(SPC_Type *base, const spc_vdd_core_glitch_detector_config_t *config);\n\n/*!\n * @brief Checks selected 4-bit glitch ripple counter's output.\n *\n * @param base SPC peripheral base address.\n * @param rippleCounter The ripple counter to check, please refer to @ref spc_vdd_core_glitch_ripple_counter_select_t.\n *\n * @retval true The selected ripple counter output is 1, will generate interrupt or reset based on settings.\n * @retval false The selected ripple counter output is 0.\n */\n\nstatic inline bool SPC_CheckGlitchRippleCounterOutput(SPC_Type *base,\n                                                      spc_vdd_core_glitch_ripple_counter_select_t rippleCounter)\n{\n    return ((base->VDD_CORE_GLITCH_DETECT_SC & SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG_MASK) ==\n            SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG(1UL << (uint32_t)(rippleCounter)));\n}\n\n/*!\n * @brief Clears output of selected glitch ripple counter.\n *\n * @param base SPC peripheral base address.\n * @param rippleCounter The ripple counter to check, please refer to @ref spc_vdd_core_glitch_ripple_counter_select_t.\n */\nstatic inline void SPC_ClearGlitchRippleCounterOutput(SPC_Type *base,\n                                                      spc_vdd_core_glitch_ripple_counter_select_t rippleCounter)\n{\n    base->VDD_CORE_GLITCH_DETECT_SC |=\n        SPC_VDD_CORE_GLITCH_DETECT_SC_GLITCH_DETECT_FLAG(1UL << (uint32_t)(rippleCounter));\n}\n\n/*!\n * @brief After invoking this function, writes to SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register are ignored.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_LockVddCoreVoltageGlitchDetectResetControl(SPC_Type *base)\n{\n    base->VDD_CORE_GLITCH_DETECT_SC |= SPC_VDD_CORE_GLITCH_DETECT_SC_LOCK_MASK;\n}\n\n/*!\n * @brief After invoking this function, writes to SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register are allowed.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_UnlockVddCoreVoltageGlitchDetectResetControl(SPC_Type *base)\n{\n    base->VDD_CORE_GLITCH_DETECT_SC &= ~SPC_VDD_CORE_GLITCH_DETECT_SC_LOCK_MASK;\n}\n\n/*!\n * @brief Checks if SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register is writable.\n *\n * @param base SPC peripheral base address.\n *\n * @retval true SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register is writable.\n * @retval false SPC_VDD_CORE_GLITCH_DETECT_SC[RE] register is not writable.\n */\nstatic inline bool SPC_CheckVddCoreVoltageGlitchResetControlState(SPC_Type *base)\n{\n    return ((base->VDD_CORE_GLITCH_DETECT_SC & SPC_VDD_CORE_GLITCH_DETECT_SC_LOCK_MASK) != 0UL);\n}\n\n/*! @} */\n#endif\n\n/*!\n * @name SRAM Control APIs\n * @{\n */\n\n/*!\n * @brief Set SRAM operate voltage.\n *\n * @param base SPC peripheral base address.\n * @param config The pointer to @ref spc_sram_voltage_config_t, specifies the configuration of sram voltage.\n */\nvoid SPC_SetSRAMOperateVoltage(SPC_Type *base, const spc_sram_voltage_config_t *config);\n\n/*! @} */\n\n/*!\n * @name Active Mode configuration\n * @{\n */\n\n/*!\n * @brief Gets the Bandgap mode in Active mode.\n *\n * @param base SPC peripheral base address.\n * @return Bandgap mode in the type of @ref spc_bandgap_mode_t enumeration.\n */\nstatic inline spc_bandgap_mode_t SPC_GetActiveModeBandgapMode(SPC_Type *base)\n{\n    return (spc_bandgap_mode_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_BGMODE_MASK) >>\n                                          SPC_ACTIVE_CFG_BGMODE_SHIFT);\n}\n\n/*!\n * @brief Gets all voltage detectors status in Active mode.\n *\n * @param base SPC peripheral base address.\n * @return All voltage detectors status in Active mode.\n */\nstatic inline uint32_t SPC_GetActiveModeVoltageDetectStatus(SPC_Type *base)\n{\n    uint32_t state;\n    state = base->ACTIVE_CFG &\n            (\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD)\n                SPC_ACTIVE_CFG_IO_HVDE_MASK | SPC_ACTIVE_CFG_IO_LVDE_MASK |\n\n#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */\n                SPC_ACTIVE_CFG_SYS_HVDE_MASK | SPC_ACTIVE_CFG_SYS_LVDE_MASK | SPC_ACTIVE_CFG_CORE_LVDE_MASK\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD)\n                | SPC_ACTIVE_CFG_CORE_HVDE_MASK\n\n#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */\n            );\n    return state;\n}\n\n/*!\n * @brief Configs Bandgap mode in Active mode.\n *\n * @note To disable bandgap in Active mode:\n *          1. Disable all LVD's and HVD's in active mode;\n *          2. Disable Glitch detect;\n *          3. Configure LDO's and DCDC to low drive strength in active mode;\n *          4. Invoke this function to disable bandgap in active mode;\n *      otherwise the error status will be reported.\n *\n * @note Some other system resources(such as PLL, CMP) require bandgap to be enabled, to disable bandgap please\n * take care of other system resources.\n *\n * @param base SPC peripheral base address.\n * @param mode The Bandgap mode be selected.\n *\n * @retval #kStatus_SPC_BandgapModeWrong The Bandgap can not be disabled in active mode.\n * @retval #kStatus_Success Config Bandgap mode in Active power mode successful.\n */\nstatus_t SPC_SetActiveModeBandgapModeConfig(SPC_Type *base, spc_bandgap_mode_t mode);\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT)\n/*!\n * @brief Enables/Disable the CMP Bandgap Buffer in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable CMP Bandgap buffer.\n *          true    -   Enable Buffer Stored Reference voltage to CMP.\n *          false   -   Disable Buffer Stored Reference voltage to CMP.\n */\nstatic inline void SPC_EnableActiveModeCMPBandgapBuffer(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->ACTIVE_CFG |= SPC_ACTIVE_CFG_LPBUFF_EN_MASK;\n    }\n    else\n    {\n        base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_LPBUFF_EN_MASK;\n    }\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */\n\n/*!\n * @brief Sets the delay when the regulators change voltage level in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param delay The number of SPC timer clock cycles.\n */\nstatic inline void SPC_SetActiveModeVoltageTrimDelay(SPC_Type *base, uint16_t delay)\n{\n    base->ACTIVE_VDELAY = SPC_ACTIVE_VDELAY_ACTIVE_VDELAY(delay);\n}\n\n/*!\n * @brief Configs all settings of regulators in Active mode at a time.\n *\n * @note This function is used to overwrite all settings of regulators(including bandgap mode, regulators'\n * drive strength and voltage level) in active mode at a time.\n *\n * @note Enable/disable LVDs/HVDs before invoking this function.\n *\n * @note This function will check input parameters based on hardware restrictions before setting registers, if input\n * parameters do not satisfy hardware restrictions the specific error will be reported.\n *\n *\n * @note Some hardware restrictions not covered, application should be aware of this and follow this hardware\n * restrictions otherwise some unknown issue may occur:\n *        1. If Core LDO's drive strength are set to same value in both Active mode and low power mode,\n *          the voltage level should also set to same value.\n *        2. When switching Core LDO's drive strength from low to normal, ensure the LDO_CORE high voltage level is set\n *          to same level that was set prior to switching to the LDO_CORE drive strength. Otherwise, if the LVDs are\n *          enabled, an unexpected LVD can occur.\n *\n * @note If this function can not satisfy some tricky settings, please invoke other APIs in low-level function group.\n *\n * @param base SPC peripheral base address.\n * @param config Pointer to spc_active_mode_regulators_config_t structure.\n *\n * @retval #kStatus_Success Config regulators in Active power mode successful.\n * @retval #kStatus_SPC_BandgapModeWrong Based on input setting, bandgap can not be disabled.\n * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Any of LVDs/HVDs kept enabled before invoking this function.\n * @retval #kStatus_SPC_SYSLDOOverDriveVoltageFail Fail to regulator to Over Drive Voltage due to\n *                                                  System VDD HVD is not disabled.\n * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Any of LVDs/HVDs kept enabled before invoking this function.\n * @retval #kStatus_SPC_CORELDOVoltageWrong Core LDO and System LDO do not have same voltage level.\n */\nstatus_t SPC_SetActiveModeRegulatorsConfig(SPC_Type *base, const spc_active_mode_regulators_config_t *config);\n\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n/*!\n * @brief Disables/Enables VDD Core Glitch Detect in Active mode.\n *\n * @note State of glitch detect disable feature will be ignored if bandgap is disabled and\n * glitch detect hardware will be forced to OFF state.\n *\n * @param base SPC peripheral base address.\n * @param disable Used to disable/enable VDD Core Glitch detect feature.\n *         - \\b true Disable VDD Core Low Voltage detect;\n *         - \\b false Enable VDD Core Low Voltage detect.\n */\nstatic inline void SPC_DisableActiveModeVddCoreGlitchDetect(SPC_Type *base, bool disable)\n{\n    if (disable)\n    {\n        base->ACTIVE_CFG |= SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK;\n    }\n    else\n    {\n        base->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK;\n    }\n}\n\n/*!\n * @brief Check if Glitch detect hardware is enabled in active mode.\n *\n * @param base SPC peripheral base address.\n * @return Indicate if Glitch detector is enabled.\n */\nstatic inline bool SPC_CheckActiveModeVddCoreGlitchDetectEnabled(SPC_Type *base)\n{\n    if ((base->ACTIVE_CFG & SPC_ACTIVE_CFG_GLITCH_DETECT_DISABLE_MASK) == 0UL)\n    {\n        return true;\n    }\n    else\n    {\n        return false;\n    }\n}\n\n#endif /* FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT */\n\n/*!\n * @brief Enables analog modules in active mode.\n *\n * @param base SPC peripheral base address.\n * @param maskValue The mask of analog modules to enable in active mode, should be the OR'ed value\n * of @ref spc_analog_module_control.\n */\nstatic inline void SPC_EnableActiveModeAnalogModules(SPC_Type *base, uint32_t maskValue)\n{\n    base->ACTIVE_CFG1 |= SPC_ACTIVE_CFG1_SOC_CNTRL(maskValue);\n}\n\n/*!\n * @brief Disables analog modules in active mode.\n *\n * @param base SPC peripheral base address.\n * @param maskValue The mask of analog modules to disable in active mode, should be the OR'ed value\n * of @ref spc_analog_module_control.\n */\nstatic inline void SPC_DisableActiveModeAnalogModules(SPC_Type *base, uint32_t maskValue)\n{\n    base->ACTIVE_CFG1 &= ~SPC_ACTIVE_CFG1_SOC_CNTRL(maskValue);\n}\n\n/*!\n * @brief Gets enabled analog modules that enabled in active mode.\n *\n * @param base SPC peripheral base address.\n *\n * @return The mask of enabled analog modules that enabled in active mode.\n */\nstatic inline uint32_t SPC_GetActiveModeEnabledAnalogModules(SPC_Type *base)\n{\n    return base->ACTIVE_CFG1;\n}\n\n/*! @} */\n\n/*!\n * @name Low Power mode configuration\n * @{\n */\n\n/*!\n * @brief Gets the Bandgap mode in Low Power mode.\n *\n * @param base SPC peripheral base address.\n * @return Bandgap mode in the type of @ref spc_bandgap_mode_t enumeration.\n */\nstatic inline spc_bandgap_mode_t SPC_GetLowPowerModeBandgapMode(SPC_Type *base)\n{\n    return (spc_bandgap_mode_t)(uint32_t)((base->LP_CFG & SPC_LP_CFG_BGMODE_MASK) >> SPC_LP_CFG_BGMODE_SHIFT);\n}\n\n/*!\n * @brief Gets the status of all voltage detectors in Low Power mode.\n *\n * @param base SPC peripheral base address.\n * @return The status of all voltage detectors in low power mode.\n */\nstatic inline uint32_t SPC_GetLowPowerModeVoltageDetectStatus(SPC_Type *base)\n{\n    uint32_t state;\n    state = base->LP_CFG & (\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD)\n                               SPC_LP_CFG_IO_HVDE_MASK | SPC_LP_CFG_IO_LVDE_MASK |\n\n#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */\n                               SPC_LP_CFG_SYS_HVDE_MASK | SPC_LP_CFG_SYS_LVDE_MASK | SPC_LP_CFG_CORE_LVDE_MASK\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD)\n                               | SPC_LP_CFG_CORE_HVDE_MASK\n\n#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */\n                           );\n    return state;\n}\n\n/*!\n * @brief Enables/Disables Low Power IREF in low power modes.\n *\n * This function enables/disables Low Power IREF. Low Power IREF can only get\n * disabled in Deep power down mode. In other low power modes, the Low Power IREF\n * is always enabled.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable Low Power IREF.\n *          true    -   Enable Low Power IREF for Low Power modes.\n *          false   -   Disable Low Power IREF for Deep Power Down mode.\n */\nstatic inline void SPC_EnableLowPowerModeLowPowerIREF(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_LP_IREFEN_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_LP_IREFEN_MASK;\n    }\n}\n\n/*!\n * @brief Configs Bandgap mode in Low Power mode.\n *\n * @note To disable Bandgap in Low-power mode:\n *          1. Disable all LVD's ad HVD's in low power mode;\n *          2. Disable Glitch detect in low power mode;\n *          3. Configure LDO's and DCDC to low drive strength in low power mode;\n *          4. Disable bandgap in low power mode;\n *      Otherwise, the error status will be reported.\n *\n * @note Some other system resources(such as PLL, CMP) require bandgap to be enabled, to disable bandgap please\n * take care of other system resources.\n *\n * @param base SPC peripheral base address.\n * @param mode The Bandgap mode be selected.\n *\n * @retval #kStatus_SPC_BandgapModeWrong The bandgap mode setting in Low Power mode is wrong.\n * @retval #kStatus_Success Config Bandgap mode in Low Power power mode successful.\n */\nstatus_t SPC_SetLowPowerModeBandgapmodeConfig(SPC_Type *base, spc_bandgap_mode_t mode);\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SRAMLDO_DPD_ON_BIT) && FSL_FEATURE_MCX_SPC_HAS_SRAMLDO_DPD_ON_BIT)\n/*!\n * @brief Enables/disables SRAM_LDO deep power low power IREF.\n *\n * @param base SPC peripheral base address.\n * @param enable Used to enable/disable low power IREF :\n *        - \\b true: Low Power IREF is enabled ;\n *        - \\b false: Low Power IREF is disabled for power saving.\n */\nstatic inline void SPC_EnableSRAMLdOLowPowerModeIREF(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_SRAMLDO_DPD_ON_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_SRAMLDO_DPD_ON_MASK;\n    }\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SRAMLDO_DPD_ON_BIT */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT)\n/*!\n * @brief Enables/Disables CMP Bandgap Buffer.\n *\n * This function gates CMP bandgap buffer. CMP bandgap buffer is automatically disabled and turned off\n * in Deep Power Down mode.\n *\n * @deprecated No longer used, please use SPC_EnableLowPowerModeCMPBandgapBuffer as instead.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable CMP Bandgap buffer.\n *          true    -   Enable Buffer Stored Reference Voltage to CMP.\n *          false   -   Disable Buffer Stored Reference Voltage to CMP.\n */\nstatic inline void SPC_EnableLowPowerModeCMPBandgapBufferMode(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_LPBUFF_EN_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_LPBUFF_EN_MASK;\n    }\n}\n\n/*!\n * @brief Enables/Disables CMP Bandgap Buffer.\n *\n * This function gates CMP bandgap buffer. CMP bandgap buffer is automatically disabled and turned off\n * in Deep Power Down mode.\n *\n * @deprecated No longer used.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable CMP Bandgap buffer.\n *          true    -   Enable Buffer Stored Reference Voltage to CMP.\n *          false   -   Disable Buffer Stored Reference Voltage to CMP.\n */\nstatic inline void SPC_EnableLowPowerModeCMPBandgapBuffer(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_LPBUFF_EN_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_LPBUFF_EN_MASK;\n    }\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_LPBUFF_EN_BIT */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT)\n/*!\n * @brief Enables/Disables CORE VDD IVS(Internal Voltage Scaling) in power down modes.\n *\n * This function gates CORE VDD IVS. When enabled, the IVS regulator will scale the\n * external input CORE VDD to a lower voltage level to reduce internal leakage.\n * IVS is invalid in Sleep or Deep power down mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable IVS.\n *          true    -   enable CORE VDD IVS in Power Down mode.\n *          false   -   disable CORE VDD IVS in Power Down mode.\n */\nstatic inline void SPC_EnableLowPowerModeCoreVDDInternalVoltageScaling(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_COREVDD_IVS_EN_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_COREVDD_IVS_EN_MASK;\n    }\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_IVS_EN_BIT */\n\n/*!\n * @brief Sets the delay when exit the low power modes.\n *\n * @param base SPC peripheral base address.\n * @param delay The number of SPC timer clock cycles that the SPC waits on exit from low power modes.\n */\nstatic inline void SPC_SetLowPowerWakeUpDelay(SPC_Type *base, uint16_t delay)\n{\n    base->LPWKUP_DELAY = SPC_LPWKUP_DELAY_LPWKUP_DELAY(delay);\n}\n\n/*!\n * @brief Configs all settings of regulators in Low power mode at a time.\n *\n * @note This function is used to overwrite all settings of regulators(including bandgap mode, regulators'\n * drive strength and voltage level) in low power mode at a time.\n *\n * @note Enable/disable LVDs/HVDs before invoking this function.\n *\n * @note This function will check input parameters based on hardware restrictions before setting registers, if input\n * parameters do not satisfy hardware restrictions the specific error will be reported.\n *\n * @note Some hardware restrictions not covered, application should be aware of this and follow this hardware\n * restrictions otherwise some unknown issue may occur:\n *        1. If Core LDO's drive strength are set to same value in both Active mode and low power mode,\n *          the voltage level should also set to same value.\n *        2. When switching Core LDO's drive strength from low to normal, ensure the LDO_CORE high voltage level is set\n *          to same level that was set prior to switching to the LDO_CORE drive strength. Otherwise, if the LVDs are\n *          enabled, an unexpected LVD can occur.\n *\n * @note If this function can not satisfy some tricky settings, please invoke other APIs in low-level function group.\n *\n * @param base SPC peripheral base address.\n * @param config Pointer to spc_lowpower_mode_regulators_config_t structure.\n * @retval #kStatus_Success Config regulators in Low power mode successful.\n * @retval #kStatus_SPC_BandgapModeWrong The bandgap should not be disabled based on input settings.\n * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Set driver strength to low will be ignored.\n * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to low will be ignored.\n * @retval #kStatus_SPC_CORELDOVoltageWrong Core LDO and System LDO do not have same voltage level.\n */\nstatus_t SPC_SetLowPowerModeRegulatorsConfig(SPC_Type *base, const spc_lowpower_mode_regulators_config_t *config);\n\n#if !(defined(FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT) && FSL_FEATURE_MCX_SPC_HAS_NO_GLITCH_DETECT)\n/*!\n * @brief Disable/Enable VDD Core Glitch Detect in low power mode.\n *\n * @note State of glitch detect disable feature will be ignored if bandgap is disabled and\n * glitch detect hardware will be forced to OFF state.\n *\n * @param base SPC peripheral base address.\n * @param disable Used to disable/enable VDD Core Glitch detect feature.\n *         - \\b true Disable VDD Core Low Voltage detect;\n *         - \\b false Enable VDD Core Low Voltage detect.\n */\nstatic inline void SPC_DisableLowPowerModeVddCoreGlitchDetect(SPC_Type *base, bool disable)\n{\n    if (disable)\n    {\n        base->LP_CFG |= SPC_LP_CFG_GLITCH_DETECT_DISABLE_MASK;\n    }\n    else\n    {\n        base->LP_CFG &= ~SPC_LP_CFG_GLITCH_DETECT_DISABLE_MASK;\n    }\n}\n\n/*!\n * @brief Check if Glitch detect hardware is enabled in low power mode.\n *\n * @param base SPC peripheral base address.\n * @return Indicate if Glitch detector is enabled.\n */\nstatic inline bool SPC_CheckLowPowerModeVddCoreGlitchDetectEnabled(SPC_Type *base)\n{\n    if ((base->LP_CFG & SPC_LP_CFG_GLITCH_DETECT_DISABLE_MASK) == 0UL)\n    {\n        return true;\n    }\n    else\n    {\n        return false;\n    }\n}\n#endif\n\n/*!\n * @brief Enables analog modules in low power modes.\n *\n * @param base SPC peripheral base address.\n * @param maskValue The mask of analog modules to enable in low power modes, should be OR'ed value\n                    of @ref spc_analog_module_control.\n */\nstatic inline void SPC_EnableLowPowerModeAnalogModules(SPC_Type *base, uint32_t maskValue)\n{\n    base->LP_CFG1 |= SPC_LP_CFG1_SOC_CNTRL(maskValue);\n}\n\n/*!\n * @brief Disables analog modules in low power modes.\n *\n * @param base SPC peripheral base address.\n * @param maskValue The mask of analog modules to disable in low power modes, should be OR'ed value\n                    of @ref spc_analog_module_control.\n */\nstatic inline void SPC_DisableLowPowerModeAnalogModules(SPC_Type *base, uint32_t maskValue)\n{\n    base->LP_CFG1 &= ~SPC_LP_CFG1_SOC_CNTRL(maskValue);\n}\n\n/*!\n * @brief Gets enabled analog modules that enabled in low power modes.\n *\n * @param base SPC peripheral base address.\n *\n * @return The mask of enabled analog modules that enabled in low power modes.\n */\nstatic inline uint32_t SPC_GetLowPowerModeEnabledAnalogModules(SPC_Type *base)\n{\n    return base->LP_CFG1;\n}\n\n/*! @} */\n\n/*!\n * @name Voltage Detect Status\n * @{\n */\n/*!\n * @brief Get Voltage Detect Status Flags.\n *\n * @param base SPC peripheral base address.\n * @return Voltage Detect Status Flags. See @ref _spc_voltage_detect_flags for details.\n */\nstatic inline uint8_t SPC_GetVoltageDetectStatusFlag(SPC_Type *base)\n{\n    return (uint8_t)(base->VD_STAT);\n}\n\n/*!\n * @brief Clear Voltage Detect Status Flags.\n *\n * @param base SPC peripheral base address.\n * @param mask The mask of the voltage detect status flags. See @ref _spc_voltage_detect_flags for details.\n */\nstatic inline void SPC_ClearVoltageDetectStatusFlag(SPC_Type *base, uint8_t mask)\n{\n    base->VD_STAT |= mask;\n}\n\n/*! @} */\n\n/*!\n * @name Voltage Detect configuration for Core voltage domain.\n * @{\n */\n\n/*!\n * @brief Configs CORE voltage detect options.\n *\n * @note: Setting both the voltage detect interrupt and reset\n *       enable will cause interrupt to be generated on exit from reset.\n *       If those conditioned is not desired, interrupt/reset so only one is enabled.\n *\n * @param base       SPC peripheral base address.\n * @param config     Pointer to spc_core_voltage_detect_config_t structure.\n */\nvoid SPC_SetCoreVoltageDetectConfig(SPC_Type *base, const spc_core_voltage_detect_config_t *config);\n\n/*!\n * @brief Locks Core voltage detect reset setting.\n *\n * This function locks core voltage detect reset setting. After invoking this function\n * any configuration of Core voltage detect reset will be ignored.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_LockCoreVoltageDetectResetSetting(SPC_Type *base)\n{\n    base->VD_CORE_CFG |= SPC_VD_CORE_CFG_LOCK_MASK;\n}\n\n/*!\n * @brief Unlocks Core voltage detect reset setting.\n *\n * This function unlocks core voltage detect reset setting. If locks the Core\n * voltage detect reset setting, invoking this function to unlock.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_UnlockCoreVoltageDetectResetSetting(SPC_Type *base)\n{\n    base->VD_CORE_CFG &= ~SPC_VD_CORE_CFG_LOCK_MASK;\n}\n\n/*!\n * @brief Enables/Disables the Core Low Voltage Detector in Active mode.\n *\n * @note If the CORE_LDO low voltage detect is enabled in Active mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable Core LVD.\n *          true    -   Enable Core Low voltage detector in active mode.\n *          false   -   Disable Core Low voltage detector in active mode.\n *\n * @retval #kStatus_Success Enable/Disable Core Low Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeCoreLowVoltageDetect(SPC_Type *base, bool enable);\n\n/*!\n * @brief Enables/Disables the Core Low Voltage Detector in Low Power mode.\n *\n * This function enables/disables the Core Low Voltage Detector.\n * If enabled the Core Low Voltage detector. The Bandgap mode in\n * low power mode must be programmed so that Bandgap is enabled.\n *\n * @note If the CORE_LDO low voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Low Power mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable Core HVD.\n *          true    -   Enable Core Low voltage detector in low power mode.\n *          false   -   Disable Core Low voltage detector in low power mode.\n *\n * @retval #kStatus_Success Enable/Disable Core Low Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeCoreLowVoltageDetect(SPC_Type *base, bool enable);\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD) && FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD)\n/*!\n * @brief Enables/Disables the Core High Voltage Detector in Active mode.\n *\n * @note If the CORE_LDO high voltage detect is enabled in Active mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable Core HVD.\n *          true    -   Enable Core High voltage detector in active mode.\n *          false   -   Disable Core High voltage detector in active mode.\n *\n * @retval #kStatus_Success Enable/Disable Core High Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeCoreHighVoltageDetect(SPC_Type *base, bool enable);\n\n/*!\n * @brief Enables/Disables the Core High Voltage Detector in Low Power mode.\n *\n * This function enables/disables the Core High Voltage Detector.\n * If enabled the Core High Voltage detector. The Bandgap mode in\n * low power mode must be programmed so that Bandgap is enabled.\n *\n * @note If the CORE_LDO high voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in low power mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable Core HVD.\n *          true    -   Enable Core High voltage detector in low power mode.\n *          false   -   Disable Core High voltage detector in low power mode.\n *\n * @retval #kStatus_Success Enable/Disable Core High Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeCoreHighVoltageDetect(SPC_Type *base, bool enable);\n#endif /* FSL_FEATURE_MCX_SPC_HAS_COREVDD_HVD */\n\n/*! @} */\n\n/*!\n * @name Voltage detect configuration for System Voltage domain\n * @{\n */\n/*!\n * @brief Set system VDD Low-voltage level selection.\n *\n * This function selects the system VDD low-voltage level. Changing system VDD low-voltage level\n * must be done after disabling the System VDD low voltage reset and interrupt.\n *\n * @deprecated In latest RM, reserved for all devices, will removed in next release.\n *\n * @param base SPC peripheral base address.\n * @param level System VDD Low-Voltage level selection.\n */\nvoid SPC_SetSystemVDDLowVoltageLevel(SPC_Type *base, spc_low_voltage_level_select_t level);\n\n/*!\n * @brief Configs SYS voltage detect options.\n *\n * This function config SYS voltage detect options.\n * @note: Setting both the voltage detect interrupt and reset\n *       enable will cause interrupt to be generated on exit from reset.\n *       If those conditioned is not desired, interrupt/reset so only one is enabled.\n *\n * @param base       SPC peripheral base address.\n * @param config     Pointer to spc_system_voltage_detect_config_t structure.\n */\nvoid SPC_SetSystemVoltageDetectConfig(SPC_Type *base, const spc_system_voltage_detect_config_t *config);\n\n/*!\n * @brief Lock System voltage detect reset setting.\n *\n * This function locks system voltage detect reset setting. After invoking this function\n * any configuration of System Voltage detect reset will be ignored.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_LockSystemVoltageDetectResetSetting(SPC_Type *base)\n{\n    base->VD_SYS_CFG |= SPC_VD_SYS_CFG_LOCK_MASK;\n}\n\n/*!\n * @brief Unlock System voltage detect reset setting.\n *\n * This function unlocks system voltage detect reset setting. If locks the System\n * voltage detect reset setting, invoking this function to unlock.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_UnlockSystemVoltageDetectResetSetting(SPC_Type *base)\n{\n    base->VD_SYS_CFG &= ~SPC_VD_SYS_CFG_LOCK_MASK;\n}\n\n/*!\n * @brief Enables/Disables the System High Voltage Detector in Active mode.\n *\n * @note If the System_LDO high voltage detect is enabled in Active mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable System HVD.\n *          true    -   Enable System High voltage detector in active mode.\n *          false   -   Disable System High voltage detector in active mode.\n *\n * @retval #kStatus_Success Enable/Disable System High Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeSystemHighVoltageDetect(SPC_Type *base, bool enable);\n\n/*!\n * @brief Enables/Disable the System Low Voltage Detector in Active mode.\n *\n * @note If the System_LDO low voltage detect is enabled in Active mode,\n * please note that the bandgap must be enabled and the drive strength of each\n * regulator must not set to low in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable System LVD.\n *          true    -   Enable System Low voltage detector in active mode.\n *          false   -   Disable System Low voltage detector in active mode.\n *\n * @retval #kStatus_Success Enable/Disable the System Low Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeSystemLowVoltageDetect(SPC_Type *base, bool enable);\n\n/*!\n * @brief Enables/Disables the System High Voltage Detector in Low Power mode.\n *\n * @note If the System_LDO high voltage detect is enabled in Low Power mode, please note\n * that the bandgap must be enabled and the drive strength of each regulator must\n * not set to low in Low Power  mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable System HVD.\n *          true    -   Enable System High voltage detector in low power mode.\n *          false   -   Disable System High voltage detector in low power mode.\n *\n * @retval #kStatus_Success Enable/Disable System High Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeSystemHighVoltageDetect(SPC_Type *base, bool enable);\n\n/*!\n * @brief Enables/Disables the System Low Voltage Detector in Low Power mode.\n *\n * @note If the System_LDO low voltage detect is enabled in Low Power mode,\n * please note that the bandgap must be enabled and the drive strength of each\n * regulator must not set to low in Low Power mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable System HVD.\n *          true    -   Enable System Low voltage detector in low power mode.\n *          false   -   Disable System Low voltage detector in low power mode.\n *\n * @retval #kStatus_Success Enables System Low Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeSystemLowVoltageDetect(SPC_Type *base, bool enable);\n\n/*! @} */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD) && FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD)\n/*!\n * @name Voltage detect configuration for IO voltage domain\n * @{\n */\n/*!\n * @brief Set IO VDD Low-Voltage level selection.\n *\n * This function selects the IO VDD Low-voltage level. Changing IO VDD low-voltage level\n * must be done after disabling the IO VDD low voltage reset and interrupt.\n *\n * @param base SPC peripheral base address.\n * @param level IO VDD Low-voltage level selection.\n */\nvoid SPC_SetIOVDDLowVoltageLevel(SPC_Type *base, spc_low_voltage_level_select_t level);\n\n/*!\n * @brief Configs IO voltage detect options.\n *\n * This function config IO voltage detect options.\n * @note: Setting both the voltage detect interrupt and reset\n *       enable will cause interrupt to be generated on exit from reset.\n *       If those conditioned is not desired, interrupt/reset so only one is enabled.\n *\n * @param base       SPC peripheral base address.\n * @param config     Pointer to spc_voltage_detect_config_t structure.\n */\nvoid SPC_SetIOVoltageDetectConfig(SPC_Type *base, const spc_io_voltage_detect_config_t *config);\n\n/*!\n * @brief Lock IO Voltage detect reset setting.\n *\n * This function locks IO voltage detect reset setting. After invoking this function\n * any configuration of system voltage detect reset will be ignored.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_LockIOVoltageDetectResetSetting(SPC_Type *base)\n{\n    base->VD_IO_CFG |= SPC_VD_IO_CFG_LOCK_MASK;\n}\n\n/*!\n * @brief Unlock IO voltage detect reset setting.\n *\n * This function unlocks IO voltage detect reset setting. If locks the IO\n * voltage detect reset setting, invoking this function to unlock.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_UnlockIOVoltageDetectResetSetting(SPC_Type *base)\n{\n    base->VD_IO_CFG &= ~SPC_VD_IO_CFG_LOCK_MASK;\n}\n\n/*!\n * @brief Enables/Disables the IO High Voltage Detector in Active mode.\n *\n * @note If the IO high voltage detect is enabled in Active mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable IO HVD.\n *          true    -   Enable IO High voltage detector in active mode.\n *          false   -   Disable IO High voltage detector in active mode.\n *\n * @retval #kStatus_Success Enable/Disable IO High Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeIOHighVoltageDetect(SPC_Type *base, bool enable);\n\n/*!\n * @brief Enables/Disables the IO Low Voltage Detector in Active mode.\n *\n * @note If the IO low voltage detect is enabled in Active mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable IO LVD.\n *          true    -   Enable IO Low voltage detector in active mode.\n *          false   -   Disable IO Low voltage detector in active mode.\n *\n * @retval #kStatus_Success Enable IO Low Voltage Detect successfully.\n */\nstatus_t SPC_EnableActiveModeIOLowVoltageDetect(SPC_Type *base, bool enable);\n\n/*!\n * @brief Enables/Disables the IO High Voltage Detector in Low Power mode.\n *\n * @note If the IO high voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Low Power mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable IO HVD.\n *          true    -   Enable IO High voltage detector in low power mode.\n *          false   -   Disable IO High voltage detector in low power mode.\n *\n * @retval #kStatus_Success Enable IO High Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeIOHighVoltageDetect(SPC_Type *base, bool enable);\n\n/*!\n * @brief Enables/Disables the IO Low Voltage Detector in Low Power mode.\n *\n * @note If the IO low voltage detect is enabled in Low Power mode, please note that the bandgap must be enabled\n * and the drive strength of each regulator must not set to low in Low Power mode.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable IO LVD.\n *          true    -   Enable IO Low voltage detector in low power mode.\n *          false   -   Disable IO Low voltage detector in low power mode.\n *\n * @retval #kStatus_Success Enable/Disable IO Low Voltage Detect in low power mode successfully.\n */\nstatus_t SPC_EnableLowPowerModeIOLowVoltageDetect(SPC_Type *base, bool enable);\n\n/*! @} */\n\n#endif /* FSL_FEATURE_MCX_SPC_HAS_IOVDD_VD */\n\n/*!\n * @name External Voltage domains configuration\n * @{\n */\n/*!\n * @brief Configs external voltage domains\n *\n * This function configs external voltage domains isolation.\n *\n * @param base SPC peripheral base address.\n * @param lowPowerIsoMask The mask of external domains isolate enable during low power mode. Please read the Reference\n * Manual for the Bitmap.\n * @param IsoMask The mask of external domains isolate. Please read the Reference Manual for the Bitmap.\n */\nvoid SPC_SetExternalVoltageDomainsConfig(SPC_Type *base, uint8_t lowPowerIsoMask, uint8_t IsoMask);\n\n/*!\n * @brief Gets External Domains status.\n *\n * @param base SPC peripheral base address.\n * @return The status of each external domain.\n */\nstatic inline uint8_t SPC_GetExternalDomainsStatus(SPC_Type *base)\n{\n    return (uint8_t)(base->EVD_CFG >> SPC_EVD_CFG_REG_EVDSTAT_SHIFT);\n}\n\n/*! @} */\n\n/*!\n * @name Low Level APIs To Set CORE LDO Regulator\n * @{\n */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_CNTRL_REG) && FSL_FEATURE_MCX_SPC_HAS_CNTRL_REG)\n/*!\n * @brief Enable/Disable Core LDO regulator.\n *\n * @note The CORE LDO enable bit is write-once.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable CORE LDO Regulator.\n *          true   -   Enable CORE LDO Regulator.\n *          false  -   Disable CORE LDO Regulator.\n */\nstatic inline void SPC_EnableCoreLDORegulator(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->CNTRL |= SPC_CNTRL_CORELDO_EN_MASK;\n    }\n    else\n    {\n        /*\n         * $Branch Coverage Justification$\n         * If CORE_LDO is disabled, all RAMs data will powered off.\n         */\n        base->CNTRL &= ~SPC_CNTRL_CORELDO_EN_MASK;\n    }\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_CNTRL_REG */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DPDOWN_PULLDOWN_DISABLE_BIT) && \\\n     FSL_FEATURE_MCX_SPC_HAS_DPDOWN_PULLDOWN_DISABLE_BIT)\n/*!\n * @brief Enable/Disable the CORE LDO Regulator pull down in Deep Power Down.\n *\n * @note This function only useful when enabled the CORE LDO Regulator.\n *\n * @param base SPC peripheral base address.\n * @param pulldown Enable/Disable CORE LDO pulldown in Deep Power Down mode.\n *          true    -   CORE LDO Regulator will discharge in Deep Power Down mode.\n *          false   -   CORE LDO Regulator will not discharge in Deep Power Down mode.\n */\nstatic inline void SPC_PullDownCoreLDORegulator(SPC_Type *base, bool pulldown)\n{\n    if (pulldown)\n    {\n        base->CORELDO_CFG &= ~SPC_CORELDO_CFG_DPDOWN_PULLDOWN_DISABLE_MASK;\n    }\n    else\n    {\n        base->CORELDO_CFG |= SPC_CORELDO_CFG_DPDOWN_PULLDOWN_DISABLE_MASK;\n    }\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DPDOWN_PULLDOWN_DISABLE_BIT */\n\n/*!\n * @brief Configs Core LDO Regulator in Active mode.\n *\n * @note The bandgap must be enabled before invoking this function.\n * @note To set Core LDO as low drive strength, all HVDs/LVDs must be disabled previously.\n *\n * @param base SPC peripheral base address.\n * @param option Pointer to the spc_active_mode_core_ldo_option_t structure.\n *\n * @retval kStatus_Success Config Core LDO regulator in Active power mode successful.\n * @retval kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * @retval kStatus_SPC_BandgapModeWrong Bandgap should be enabled before invoking this function.\n * @retval kStatus_SPC_CORELDOLowDriveStrengthIgnore To set Core LDO as low drive strength,\n *                                                  all LVDs/HVDs must be disabled before invoking this function.\n */\nstatus_t SPC_SetActiveModeCoreLDORegulatorConfig(SPC_Type *base, const spc_active_mode_core_ldo_option_t *option);\n\n/*!\n * @brief Set Core LDO Regulator Voltage level in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param voltageLevel Specify the voltage level of CORE LDO Regulator in Active mode, please\n        refer to @ref spc_core_ldo_voltage_level_t.\n *\n * @note In active mode, the Core LDO voltage level should only be changed when the\n *  Core LDO is in normal drive strength.\n *\n * @note Update Core LDO voltage level will set Busy flag,\n *      this function return only when busy flag is cleared by hardware\n *\n * @retval kStatus_SPC_CORELDOVoltageSetFail  The drive strength of Core LDO is not normal.\n * @retval kStatus_Success Set Core LDO regulator voltage level in Active power mode successful.\n */\nstatus_t SPC_SetActiveModeCoreLDORegulatorVoltageLevel(SPC_Type *base, spc_core_ldo_voltage_level_t voltageLevel);\n\n/*!\n * @brief Gets CORE LDO Regulator Voltage level.\n *\n * This function returns the voltage level of CORE LDO Regulator in Active mode.\n *\n * @param base SPC peripheral base address.\n * @return Voltage level of CORE LDO in type of @ref spc_core_ldo_voltage_level_t enumeration.\n */\nstatic inline spc_core_ldo_voltage_level_t SPC_GetActiveModeCoreLDOVDDVoltageLevel(SPC_Type *base)\n{\n    return (spc_core_ldo_voltage_level_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_CORELDO_VDD_LVL_MASK) >>\n                                                    SPC_ACTIVE_CFG_CORELDO_VDD_LVL_SHIFT);\n}\n\n#if (defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS)\n/*!\n * @brief Set Core LDO VDD Regulator Drive Strength in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param driveStrength Specify the drive strength of CORE LDO Regulator in Active mode, please\n        refer to @ref spc_core_ldo_drive_strength_t.\n *\n * @retval #kStatus_Success Set Core LDO regulator drive strength in Active power mode successful.\n * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore If any voltage detect enabled,\n            core_ldo's drive strength can not set to low.\n * @retval #kStatus_SPC_BandgapModeWrong The selected bandgap mode is not allowed.\n */\nstatus_t SPC_SetActiveModeCoreLDORegulatorDriveStrength(SPC_Type *base, spc_core_ldo_drive_strength_t driveStrength);\n\n/*!\n * @brief Gets CORE LDO VDD Regulator Drive Strength in Active mode.\n *\n * @param base SPC peripheral base address.\n * @return Drive Strength of CORE LDO regulator in Active mode, please refer to @ref spc_core_ldo_drive_strength_t.\n */\nstatic inline spc_core_ldo_drive_strength_t SPC_GetActiveModeCoreLDODriveStrength(SPC_Type *base)\n{\n    return (spc_core_ldo_drive_strength_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK) >>\n                                                     SPC_ACTIVE_CFG_CORELDO_VDD_DS_SHIFT);\n}\n#endif /* defined(FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS) && FSL_FEATURE_SPC_HAS_CORELDO_VDD_DS */\n\n/*!\n * @brief Configs CORE LDO Regulator in low power mode\n *\n * This function configs CORE LDO Regulator in Low Power mode.\n * If CORE LDO VDD Drive Strength is set to Normal, the CORE LDO VDD regulator voltage\n * level in Active mode must be equal to the voltage level in Low power mode. And the Bandgap\n * must be programmed to select bandgap enabled.\n * Core VDD voltage levels for the Core LDO low power regulator can only be changed when the CORE\n * LDO Drive Strength set as Normal.\n *\n * @param base SPC peripheral base address.\n * @param option Pointer to the spc_lowpower_mode_core_ldo_option_t structure.\n *\n * @retval #kStatus_Success Config Core LDO regulator in power mode successfully.\n * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Set driver strength to low will be ignored.\n * @retval #kStatus_SPC_CORELDOVoltageSetFail. Fail to change Core LDO voltage level.\n */\nstatus_t SPC_SetLowPowerModeCoreLDORegulatorConfig(SPC_Type *base, const spc_lowpower_mode_core_ldo_option_t *option);\n\n/*!\n * @brief Set Core LDO VDD Regulator Voltage level in Low power mode.\n *\n * @note If CORE LDO's drive strength is set to Normal, the CORE LDO VDD regulator voltage in active mode and low power\n *  mode must be same.\n * @note Voltage level for the CORE LDO in low power mode can only be changed when the CORE LDO Drive Strength set as\n * Normal.\n *\n * @param base SPC peripheral base address.\n * @param voltageLevel Voltage level of CORE LDO Regulator in Low power mode, please\n        refer to @ref spc_core_ldo_voltage_level_t.\n *\n * @retval #kStatus_SPC_CORELDOVoltageWrong Voltage level in active mode and low power mode is not same.\n * @retval #kStatus_Success Set Core LDO regulator voltage level in Low power mode successful.\n * @retval #kStatus_SPC_CORELDOVoltageSetFail Fail to update voltage level because drive strength is incorrect.\n */\nstatus_t SPC_SetLowPowerModeCoreLDORegulatorVoltageLevel(SPC_Type *base, spc_core_ldo_voltage_level_t voltageLevel);\n\n/*!\n * @brief Gets the CORE LDO VDD Regulator Voltage Level for Low Power modes.\n *\n * @param base SPC peripheral base address.\n * @return The CORE LDO VDD Regulator's voltage level.\n */\nstatic inline spc_core_ldo_voltage_level_t SPC_GetLowPowerCoreLDOVDDVoltageLevel(SPC_Type *base)\n{\n    return ((spc_core_ldo_voltage_level_t)(uint32_t)((base->LP_CFG & SPC_LP_CFG_CORELDO_VDD_LVL_MASK) >>\n                                                     SPC_LP_CFG_CORELDO_VDD_LVL_SHIFT));\n}\n\n/*!\n * @brief Set Core LDO VDD Regulator Drive Strength in Low power mode.\n *\n * @param base SPC peripheral base address.\n * @param driveStrength Specify drive strength of CORE LDO in low power mode.\n *\n * @retval #kStatus_SPC_CORELDOLowDriveStrengthIgnore Some voltage detect enabled, CORE LDO's drive strength can not set\n *           as low.\n * @retval #kStatus_Success Set Core LDO regulator drive strength in Low power mode successful.\n * @retval #kStatus_SPC_BandgapModeWrong Bandgap is disabled when attempt to set CORE LDO work as normal drive strength.\n */\nstatus_t SPC_SetLowPowerModeCoreLDORegulatorDriveStrength(SPC_Type *base, spc_core_ldo_drive_strength_t driveStrength);\n\n/*!\n * @brief Gets CORE LDO VDD Drive Strength for Low Power modes.\n *\n * @param base SPC peripheral base address.\n * @return The CORE LDO's VDD Drive Strength.\n */\nstatic inline spc_core_ldo_drive_strength_t SPC_GetLowPowerCoreLDOVDDDriveStrength(SPC_Type *base)\n{\n    return (spc_core_ldo_drive_strength_t)(uint32_t)((base->LP_CFG & SPC_LP_CFG_CORELDO_VDD_DS_MASK) >>\n                                                     SPC_LP_CFG_CORELDO_VDD_DS_SHIFT);\n}\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_SYS_LDO) && FSL_FEATURE_MCX_SPC_HAS_SYS_LDO)\n/*!\n * @name Low Level APIs To Set System LDO Regulator\n * @{\n */\n\n/*!\n * @brief Enable/Disable System LDO regulator.\n *\n * @note The SYSTEM LDO enable bit is write-once.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable System LDO Regulator.\n *          true     -   Enable System LDO Regulator.\n *          false    -    Disable System LDO Regulator.\n */\nstatic inline void SPC_EnableSystemLDORegulator(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->CNTRL |= SPC_CNTRL_SYSLDO_EN_MASK;\n    }\n    else\n    {\n        /*\n         * $Branch Coverage Justification$\n         * If SYSTEM_LDO is disabled, may cause some unexpected issues.\n         */\n        base->CNTRL &= ~SPC_CNTRL_SYSLDO_EN_MASK;\n    }\n}\n\n/*!\n * @brief Enable/Disable current sink feature of System LDO Regulator.\n *\n * @param base SPC peripheral base address.\n * @param sink Enable/Disable current sink feature.\n *          true    -   Enable current sink feature of System LDO Regulator.\n *          false   -   Disable current sink feature of System LDO Regulator.\n */\nstatic inline void SPC_EnableSystemLDOSinkFeature(SPC_Type *base, bool sink)\n{\n    if (sink)\n    {\n        base->SYSLDO_CFG |= SPC_SYSLDO_CFG_ISINKEN_MASK;\n    }\n    else\n    {\n        base->SYSLDO_CFG &= ~SPC_SYSLDO_CFG_ISINKEN_MASK;\n    }\n}\n\n/*!\n * @brief Configs System LDO VDD Regulator in Active mode.\n *\n * @note If System LDO VDD Drive Strength is set to Normal, the Bandgap mode in Active mode must be programmed\n * to a value that enables the bandgap.\n * @note If any voltage detects are kept enabled, configuration to set System LDO VDD drive strength to low will\n * be ignored.\n * @note If select System LDO VDD Regulator voltage level to Over Drive Voltage, the Drive Strength of System LDO VDD\n * Regulator must be set to Normal otherwise the regulator Drive Strength will be forced to Normal.\n * @note If select System LDO VDD Regulator voltage level to Over Drive Voltage, the High voltage detect must be\n * disabled. Otherwise it will be fail to regulator to Over Drive Voltage.\n *\n * @param base SPC peripheral base address.\n * @param option Pointer to the spc_active_mode_sys_ldo_option_t structure.\n *\n * @retval #kStatus_Success Config System LDO regulator in Active power mode successful.\n * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * @retval #kStatus_SPC_BandgapModeWrong The bandgap is not enabled before invoking this function.\n * @retval #kStatus_SPC_SYSLDOOverDriveVoltageFail HVD of System VDD is not disable before setting to Over Drive\n * voltage.\n * @retval kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set System LDO VDD regulator's driver strength to Low will be\n * ignored.\n */\nstatus_t SPC_SetActiveModeSystemLDORegulatorConfig(SPC_Type *base, const spc_active_mode_sys_ldo_option_t *option);\n\n/*!\n * @brief Set System LDO Regulator voltage level in Active mode.\n *\n * @note The system LDO regulator can only operate at the overdrive voltage level for a limited amount of time for the\n * life of chip.\n *\n * @param base SPC peripheral base address.\n * @param voltageLevel Specify the voltage level of System LDO Regulator in Active mode.\n *\n * @retval #kStatus_Success Set System LDO Regulator voltage level in Active mode successfully.\n * @retval #kStatus_SPC_SYSLDOOverDriveVoltageFail Must disable system LDO high voltage detector before specifying\n * overdrive voltage.\n */\nstatus_t SPC_SetActiveModeSystemLDORegulatorVoltageLevel(SPC_Type *base, spc_sys_ldo_voltage_level_t voltageLevel);\n\n/*!\n * @brief Get System LDO Regulator voltage level in Active mode.\n *\n * @param base SPC peripheral base address.\n * @return System LDO Regulator voltage level in Active mode, please refer to @ref spc_sys_ldo_voltage_level_t.\n */\nstatic inline spc_sys_ldo_voltage_level_t SPC_GetActiveModeSystemLDORegulatorVoltageLevel(SPC_Type *base)\n{\n    return (spc_sys_ldo_voltage_level_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_SYSLDO_VDD_LVL_MASK) >>\n                                                   SPC_ACTIVE_CFG_SYSLDO_VDD_LVL_SHIFT);\n}\n\n/*!\n * @brief Set System LDO Regulator Drive Strength in Active mode.\n *\n * @param base SPC peripheral base address.\n * @param driveStrength Specify the drive strength  of System LDO Regulator in Active mode.\n *\n * @retval #kStatus_Success Set System LDO Regulator drive strength in Active mode successfully.\n * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Attempt to specify low drive strength is ignored due to any\n            voltage detect feature is enabled in active mode.\n * @retval #kStatus_SPC_BandgapModeWrong Bandgap mode in Active mode must be programmed to a value that enables\n            the bandgap if attempt to specify normal drive strength.\n */\nstatus_t SPC_SetActiveModeSystemLDORegulatorDriveStrength(SPC_Type *base, spc_sys_ldo_drive_strength_t driveStrength);\n\n/*!\n * @brief Get System LDO Regulator Drive Strength in Active mode.\n *\n * @param base SPC peripheral base address.\n * @return System LDO regulator drive strength in Active mode, please refer to @ref spc_sys_ldo_drive_strength_t.\n */\nstatic inline spc_sys_ldo_drive_strength_t SPC_GetActiveModeSystemLDORegulatorDriveStrength(SPC_Type *base)\n{\n    return (spc_sys_ldo_drive_strength_t)(uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK) >>\n                                                    SPC_ACTIVE_CFG_SYSLDO_VDD_DS_SHIFT);\n}\n\n/*!\n * @brief Configs System LDO regulator in low power modes.\n *\n * This function configs System LDO regulator in low power modes.\n * If System LDO VDD Regulator Drive strength is set to normal, bandgap mode in low power\n * mode must be programmed to a value that enables the Bandgap.\n * If any High voltage detectors or Low Voltage detectors are kept enabled, configuration\n * to set System LDO Regulator drive strength as Low will be ignored.\n *\n * @param base SPC peripheral base address.\n * @param option Pointer to spc_lowpower_mode_sys_ldo_option_t structure.\n *\n * @retval #kStatus_Success Config System LDO regulator in Low Power Mode successfully.\n * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Set driver strength to low will be ignored.\n */\nstatus_t SPC_SetLowPowerModeSystemLDORegulatorConfig(SPC_Type *base, const spc_lowpower_mode_sys_ldo_option_t *option);\n\n/*!\n * @brief Set System LDO Regulator drive strength in Low Power Mode.\n *\n * @param base SPC peripheral base address.\n * @param driveStrength Specify the drive strength of System LDO Regulator in Low Power Mode.\n *\n * @retval #kStatus_Success Set System LDO Regulator drive strength in Low Power Mode successfully.\n * @retval #kStatus_SPC_SYSLDOLowDriveStrengthIgnore Attempt to specify low drive strength is ignored due to any\n            voltage detect feature is enabled in low power mode.\n * @retval #kStatus_SPC_BandgapModeWrong Bandgap mode in low power mode must be programmed to a value that enables\n            the bandgap if attempt to specify normal drive strength.\n */\nstatus_t SPC_SetLowPowerModeSystemLDORegulatorDriveStrength(SPC_Type *base, spc_sys_ldo_drive_strength_t driveStrength);\n\n/*!\n * @brief Get System LDO Regulator drive strength in Low Power Mode.\n *\n * @param base SPC peripheral base address.\n * @return System LDO regulator drive strength in Low Power Mode, please refer to @ref spc_sys_ldo_drive_strength_t.\n */\nstatic inline spc_sys_ldo_drive_strength_t SPC_GetLowPowerModeSystemLDORegulatorDriveStrength(SPC_Type *base)\n{\n    return (spc_sys_ldo_drive_strength_t)(uint32_t)((base->LP_CFG & SPC_LP_CFG_SYSLDO_VDD_DS_MASK) >>\n                                                    SPC_LP_CFG_SYSLDO_VDD_DS_SHIFT);\n}\n/*! @} */\n#endif /* FSL_FEATURE_MCX_SPC_HAS_SYS_LDO */\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC) && FSL_FEATURE_MCX_SPC_HAS_DCDC)\n/*!\n * @name Low Level APIs To Set DCDC Regulator\n * @{\n */\n\n/*!\n * @brief Enable/Disable DCDC Regulator.\n *\n * @note The DCDC enable bit is write-once, settings only reset after a POR, LVD, or HVD event.\n *\n * @param base SPC peripheral base address.\n * @param enable Enable/Disable DCDC Regulator.\n *          true    -   Enable DCDC Regulator.\n *          false   -   Disable DCDC Regulator.\n */\nstatic inline void SPC_EnableDCDCRegulator(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->CNTRL |= SPC_CNTRL_DCDC_EN_MASK;\n    }\n    else\n    {\n        /*\n         * $Branch Coverage Justification$\n         * If DCDC is disabled, all RAMs data will powered off.\n         */\n        base->CNTRL &= ~SPC_CNTRL_DCDC_EN_MASK;\n    }\n}\n\n/*!\n * @brief Config DCDC Burst options\n *\n * @param base SPC peripheral base address.\n * @param config Pointer to spc_dcdc_burst_config_t structure.\n */\nvoid SPC_SetDCDCBurstConfig(SPC_Type *base, spc_dcdc_burst_config_t *config);\n\n/*!\n * @brief Trigger a software burst request to DCDC.\n *\n * @param base SPC peripheral base address.\n */\nstatic inline void SPC_TriggerDCDCBurstRequest(SPC_Type *base)\n{\n    /* Blocking until previous DCDC burst completed. */\n    while ((base->DCDC_BURST_CFG & SPC_DCDC_BURST_CFG_BURST_ACK_MASK) == 0UL)\n    {\n    }\n\n    base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_BURST_REQ_MASK;\n}\n\n/*!\n * @brief Check if burst acknowledge flag is asserted.\n *\n * @param base SPC peripheral base address.\n *\n * @retval false DCDC burst not complete.\n * @retval true DCDC burst complete.\n */\nstatic inline bool SPC_CheckDCDCBurstAck(SPC_Type *base)\n{\n    return ((base->DCDC_BURST_CFG & SPC_DCDC_BURST_CFG_BURST_ACK_MASK) != 0UL);\n}\n\n/*!\n * @brief Clear DCDC busrt acknowledge flag.\n *\n * @param base SPC periphral base address.\n */\nstatic inline void SPC_ClearDCDCBurstAckFlag(SPC_Type *base)\n{\n    base->DCDC_BURST_CFG |= SPC_DCDC_BURST_CFG_BURST_ACK_MASK;\n}\n\n/*!\n * @brief Set the count value of the reference clock to configure the period of DCDC not active.\n *\n * @note This function is only useful when DCDC's drive strength is set as pulse refresh.\n * @note The pulse duration(time between on and off) is: reference clock period * (count + 2).\n *\n * @param base SPC peripheral base address.\n * @param count The count value, 16 bit width.\n */\nvoid SPC_SetDCDCRefreshCount(SPC_Type *base, uint16_t count);\n\n#if (defined(FSL_FEATURE_MCX_SPC_HAS_DCDC_CFG_BLEED_EN) && FSL_FEATURE_MCX_SPC_HAS_DCDC_CFG_BLEED_EN)\n/*!\n * @brief Enable a bleed resistor to discharge DCDC output when DCDC is disabled.\n *\n * @param base SPC peripheral base address.\n * @param enable Used to enable/disable bleed resistor.\n */\nstatic inline void SPC_EnableDCDCBleedResistor(SPC_Type *base, bool enable)\n{\n    if (enable)\n    {\n        base->DCDC_CFG |= SPC_DCDC_CFG_BLEED_EN_MASK;\n    }\n    else\n    {\n        base->DCDC_CFG &= ~SPC_DCDC_CFG_BLEED_EN_MASK;\n    }\n}\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC_CFG_BLEED_EN */\n\n/*!\n * @brief Configs DCDC_CORE Regulator in Active mode.\n *\n * @note When changing the DCDC output voltage level, take care to change the CORE LDO voltage level.\n *\n * @param base SPC peripheral base address.\n * @param option Pointer to the spc_active_mode_dcdc_option_t structure.\n *\n * @retval #kStatus_Success Config DCDC regulator in Active power mode successful.\n * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * @retval #kStatus_SPC_BandgapModeWrong Set DCDC_CORE Regulator drive strength to Normal, the Bandgap must be enabled.\n */\nstatus_t SPC_SetActiveModeDCDCRegulatorConfig(SPC_Type *base, const spc_active_mode_dcdc_option_t *option);\n\n/*!\n * @brief Set DCDC_CORE Regulator voltage level in Active mode.\n *\n * @note When changing the DCDC output voltage level, take care to change the CORE LDO voltage level.\n *\n * @param base SPC peripheral base address.\n * @param voltageLevel Specify the DCDC_CORE Regulator voltage level, please refer to @ref spc_dcdc_voltage_level_t.\n */\nstatic inline void SPC_SetActiveModeDCDCRegulatorVoltageLevel(SPC_Type *base, spc_dcdc_voltage_level_t voltageLevel)\n{\n    base->ACTIVE_CFG =\n        (base->ACTIVE_CFG & (~SPC_ACTIVE_CFG_DCDC_VDD_LVL_MASK)) | SPC_ACTIVE_CFG_DCDC_VDD_LVL(voltageLevel);\n}\n\n/*!\n * @brief Get DCDC_CORE Regulator voltage level in Active mode.\n *\n * @param base SPC peripheral base address.\n * @return DCDC_CORE Regulator voltage level, please refer to @ref spc_dcdc_voltage_level_t.\n */\nstatic inline spc_dcdc_voltage_level_t SPC_GetActiveModeDCDCRegulatorVoltageLevel(SPC_Type *base)\n{\n    return (spc_dcdc_voltage_level_t)((uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_DCDC_VDD_LVL_MASK) >>\n                                                 SPC_ACTIVE_CFG_DCDC_VDD_LVL_SHIFT));\n}\n\n/*!\n * @brief Set DCDC_CORE Regulator drive strength in Active mode.\n *\n * @note To set DCDC drive strength as Normal, the bandgap must be enabled.\n *\n * @param base SPC peripheral base address.\n * @param driveStrength Specify the DCDC_CORE regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t.\n *\n * @retval #kStatus_Success Set DCDC_CORE Regulator drive strength in Active mode successfully.\n * @retval #kStatus_SPC_BandgapModeWrong Set DCDC_CORE Regulator drive strength to Normal, the Bandgap must be enabled.\n */\nstatus_t SPC_SetActiveModeDCDCRegulatorDriveStrength(SPC_Type *base, spc_dcdc_drive_strength_t driveStrength);\n\n/*!\n * @brief Get DCDC_CORE Regulator drive strength in Active mode.\n *\n * @param base SPC peripheral base address.\n * @return DCDC_CORE Regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t.\n */\nstatic inline spc_dcdc_drive_strength_t SPC_GetActiveModeDCDCRegulatorDriveStrength(SPC_Type *base)\n{\n    return (spc_dcdc_drive_strength_t)((uint32_t)((base->ACTIVE_CFG & SPC_ACTIVE_CFG_DCDC_VDD_DS_MASK) >>\n                                                  SPC_ACTIVE_CFG_DCDC_VDD_DS_SHIFT));\n}\n\n/*!\n * @brief Configs DCDC_CORE Regulator in Low power modes.\n *\n * @note If DCDC_CORE Drive Strength is set to Normal, the Bandgap mode in Low Power mode must be programmed\n * to a value that enables the Bandgap.\n * @note In Deep Power Down mode, DCDC regulator is always turned off.\n *\n * @param base SPC peripheral base address.\n * @param option Pointer to the spc_lowpower_mode_dcdc_option_t structure.\n *\n * @retval #kStatus_Success Config DCDC regulator in low power mode successfully.\n * @retval #kStatus_SPC_Busy The SPC instance is busy to execute any type of power mode transition.\n * @retval #kStatus_SPC_BandgapModeWrong The bandgap mode setting in Low Power mode is wrong.\n */\nstatus_t SPC_SetLowPowerModeDCDCRegulatorConfig(SPC_Type *base, const spc_lowpower_mode_dcdc_option_t *option);\n\n/*!\n * @brief Set DCDC_CORE Regulator drive strength in Low power mode.\n *\n * @note To set drive strength as normal, the bandgap must be enabled.\n *\n * @param base SPC peripheral base address.\n * @param driveStrength Specify the DCDC_CORE Regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t.\n *\n * @retval #kStatus_Success Set DCDC_CORE Regulator drive strength in Low power mode successfully.\n * @retval #kStatus_SPC_BandgapModeWrong Set DCDC_CORE Regulator drive strength to Normal, the Bandgap must be enabled.\n */\nstatus_t SPC_SetLowPowerModeDCDCRegulatorDriveStrength(SPC_Type *base, spc_dcdc_drive_strength_t driveStrength);\n\n/*!\n * @brief Get DCDC_CORE Regulator drive strength in Low power mode.\n *\n * @param base SPC peripheral base address.\n * @return DCDC_CORE Regulator drive strength, please refer to @ref spc_dcdc_drive_strength_t.\n */\nstatic inline spc_dcdc_drive_strength_t SPC_GetLowPowerModeDCDCRegulatorDriveStrength(SPC_Type *base)\n{\n    return (spc_dcdc_drive_strength_t)((uint32_t)((base->LP_CFG & SPC_LP_CFG_DCDC_VDD_DS_MASK) >>\n                                                  SPC_LP_CFG_DCDC_VDD_DS_SHIFT));\n}\n\n/*!\n * @brief Set DCDC_CORE Regulator voltage level in Low power mode.\n *\n * @note To change DCDC level in Low-Power mode:\n *          1. Configure LP_CFG[DCDC_VDD_LVL] to desired level;\n *          2. Configure LP_CFG[DCDC_VDD_DS] to low driver strength;\n *  \t    3. Configure ACTIVE_CFG[DCDC_VDD_LVL] to same level programmed in #1.\n *\n * @note After invoking this function, the voltage level in active mode(wakeup from low power modes) also changed,\n * if it is necessary, please invoke SPC_SetActiveModeDCDCRegulatorVoltageLevel() to change to desried voltage level.\n *\n * @param base SPC peripheral base address.\n * @param voltageLevel Specify the DCDC_CORE Regulator voltage level, please refer to @ref spc_dcdc_voltage_level_t.\n */\nstatic inline void SPC_SetLowPowerModeDCDCRegulatorVoltageLevel(SPC_Type *base, spc_dcdc_voltage_level_t voltageLevel)\n{\n    base->LP_CFG = (base->LP_CFG & (~SPC_LP_CFG_DCDC_VDD_LVL_MASK)) | SPC_LP_CFG_DCDC_VDD_LVL(voltageLevel);\n    (void)SPC_SetLowPowerModeDCDCRegulatorDriveStrength(base, kSPC_DCDC_LowDriveStrength);\n    SPC_SetActiveModeDCDCRegulatorVoltageLevel(base, voltageLevel);\n}\n\n/*!\n * @brief Get DCDC_CORE Regulator voltage level in Low power mode.\n *\n * @param base SPC peripheral base address.\n * @return DCDC_CORE Regulator voltage level, please refer to @ref spc_dcdc_voltage_level_t.\n */\nstatic inline spc_dcdc_voltage_level_t SPC_GetLowPowerModeDCDCRegulatorVoltageLevel(SPC_Type *base)\n{\n    return (spc_dcdc_voltage_level_t)((uint32_t)((base->LP_CFG & SPC_LP_CFG_DCDC_VDD_LVL_MASK) >>\n                                                 SPC_LP_CFG_DCDC_VDD_LVL_SHIFT));\n}\n\n/*! @} */\n#endif /* FSL_FEATURE_MCX_SPC_HAS_DCDC */\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus */\n\n/*! @} */\n\n#endif /* FSL_SPC_H_ */\n"
  },
  {
    "path": "hw/bsp/mcx/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"bsp/board_api.h\"\n#include \"fsl_device_registers.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_lpuart.h\"\n#include \"board.h\"\n\n#include \"pin_mux.h\"\n#include \"clock_config.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\n#if CFG_TUSB_MCU == OPT_MCU_MCXN9\nvoid USB0_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid USB1_HS_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n#elif CFG_TUSB_MCU == OPT_MCU_MCXA15\n\nvoid USB0_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n#endif\n\n\nvoid board_init(void) {\n\n   BOARD_InitBootPins();\n  BOARD_InitBootClocks();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  #if CFG_TUSB_MCU == OPT_MCU_MCXN9\n  NVIC_SetPriority(USB0_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USB1_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #else\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #endif\n#endif\n\n  // LED\n  CLOCK_EnableClock(LED_CLK);\n  gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0};\n  GPIO_PinInit(LED_GPIO, LED_PIN, &led_config);\n  board_led_write(0);\n\n#ifdef NEOPIXEL_PIN\n  // No neo pixel support yet\n#endif\n\n  // Button\n#ifdef BUTTON_GPIO\n  CLOCK_EnableClock(BUTTON_CLK);\n  gpio_pin_config_t const button_config = {kGPIO_DigitalInput, 0};\n  GPIO_PinInit(BUTTON_GPIO, BUTTON_PIN, &button_config);\n#endif\n\n#ifdef UART_DEV\n\n  // Enable UART when debug log is on\n  board_uart_init_clock();\n\n  lpuart_config_t uart_config;\n  LPUART_GetDefaultConfig(&uart_config);\n  uart_config.baudRate_Bps = CFG_BOARD_UART_BAUDRATE;\n  uart_config.enableTx = true;\n  uart_config.enableRx = true;\n\n  LPUART_Init(UART_DEV, &uart_config, 12000000u);\n#endif\n\n  // USB VBUS\n  /* PORT0 PIN22 configured as USB0_VBUS */\n\n#if defined(BOARD_TUD_RHPORT) && BOARD_TUD_RHPORT == 0\n  // Port0 is Full Speed\n\n  #if CFG_TUSB_MCU == OPT_MCU_MCXA15\n  RESET_PeripheralReset(kUSB0_RST_SHIFT_RSTn);\n  #elif CFG_TUSB_MCU == OPT_MCU_MCXN9\n  CLOCK_AttachClk(kCLK_48M_to_USB0);\n  CLOCK_EnableClock(kCLOCK_Usb0Ram);\n  CLOCK_EnableClock(kCLOCK_Usb0Fs);\n  #endif\n\n  CLOCK_EnableUsbfsClock();\n#endif\n\n#if defined(BOARD_TUD_RHPORT) && BOARD_TUD_RHPORT == 1 && (CFG_TUSB_MCU == OPT_MCU_MCXN9)\n  // Port1 is High Speed\n\n  // Power\n  SPC0->ACTIVE_VDELAY = 0x0500;\n  /* Change the power DCDC to 1.8v (By default, DCDC is 1.8V), CORELDO to 1.1v (By default, CORELDO is 1.0V) */\n  SPC0->ACTIVE_CFG &= ~SPC_ACTIVE_CFG_CORELDO_VDD_DS_MASK;\n  SPC0->ACTIVE_CFG |= SPC_ACTIVE_CFG_DCDC_VDD_LVL(0x3) | SPC_ACTIVE_CFG_CORELDO_VDD_LVL(0x3) |\n                      SPC_ACTIVE_CFG_SYSLDO_VDD_DS_MASK | SPC_ACTIVE_CFG_DCDC_VDD_DS(0x2u);\n  /* Wait until it is done */\n  while (SPC0->SC & SPC_SC_BUSY_MASK) {}\n  if (0u == (SCG0->LDOCSR & SCG_LDOCSR_LDOEN_MASK)) {\n    SCG0->TRIM_LOCK = 0x5a5a0001U;\n    SCG0->LDOCSR |= SCG_LDOCSR_LDOEN_MASK;\n    /* wait LDO ready */\n    while (0U == (SCG0->LDOCSR & SCG_LDOCSR_VOUT_OK_MASK));\n  }\n  SYSCON->AHBCLKCTRLSET[2] |= SYSCON_AHBCLKCTRL2_USB_HS_MASK | SYSCON_AHBCLKCTRL2_USB_HS_PHY_MASK;\n  SCG0->SOSCCFG &= ~(SCG_SOSCCFG_RANGE_MASK | SCG_SOSCCFG_EREFS_MASK);\n  /* xtal = 20 ~ 30MHz */\n  SCG0->SOSCCFG = (1U << SCG_SOSCCFG_RANGE_SHIFT) | (1U << SCG_SOSCCFG_EREFS_SHIFT);\n  SCG0->SOSCCSR |= SCG_SOSCCSR_SOSCEN_MASK;\n  while (1) {\n    if (SCG0->SOSCCSR & SCG_SOSCCSR_SOSCVLD_MASK) {\n      break;\n    }\n  }\n\n  // Clock\n  SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_CLKIN_ENA_MASK | SYSCON_CLOCK_CTRL_CLKIN_ENA_FM_USBH_LPT_MASK;\n  CLOCK_EnableClock(kCLOCK_UsbHs);\n  CLOCK_EnableClock(kCLOCK_UsbHsPhy);\n  CLOCK_EnableUsbhsPhyPllClock(kCLOCK_Usbphy480M, 24000000U);\n  CLOCK_EnableUsbhsClock();\n\n  // USB PHY\n#if ((!(defined FSL_FEATURE_SOC_CCM_ANALOG_COUNT)) && (!(defined FSL_FEATURE_SOC_ANATOP_COUNT)))\n  USBPHY->TRIM_OVERRIDE_EN = 0x001fU; /* override IFR value */\n#endif\n\n  // Enable PHY support for Low speed device + LS via FS Hub\n  USBPHY->CTRL |= USBPHY_CTRL_SET_ENUTMILEVEL2_MASK | USBPHY_CTRL_SET_ENUTMILEVEL3_MASK;\n\n  // Enable all power for normal operation\n  USBPHY->PWD = 0;\n\n  // TX Timing\n  uint32_t phytx = USBPHY->TX;\n  phytx &= ~(USBPHY_TX_D_CAL_MASK | USBPHY_TX_TXCAL45DM_MASK | USBPHY_TX_TXCAL45DP_MASK);\n  phytx |= USBPHY_TX_D_CAL(0x04) | USBPHY_TX_TXCAL45DP(0x07) | USBPHY_TX_TXCAL45DM(0x07);\n  //phytx |= USBPHY_TX_D_CAL(0x0C) | USBPHY_TX_TXCAL45DP(0x06) | USBPHY_TX_TXCAL45DM(0x06);\n  USBPHY->TX = phytx;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinWrite(LED_GPIO, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n#ifdef BUTTON_GPIO\n  return BUTTON_STATE_ACTIVE == GPIO_PinRead(BUTTON_GPIO, BUTTON_PIN);\n#endif\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n#ifdef UART_DEV\n  LPUART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);\n  return len;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mcx/family.cmake",
    "content": "include_guard()\n\nset(MCUX_DIR ${TOP}/hw/mcu/nxp/mcuxsdk-core)\nset(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-devices-mcx)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_6)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nif (MCU_VARIANT STREQUAL \"MCXA153\")\n  set(CMAKE_SYSTEM_CPU cortex-m33-nodsp-nofp CACHE INTERNAL \"System Processor\")\n  set(FAMILY_MCUS MCXA15 CACHE INTERNAL \"\")\nelseif (MCU_VARIANT STREQUAL \"MCXA156\")\n    set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\n    set(FAMILY_MCUS MCXA15 CACHE INTERNAL \"\")\nelseif (MCU_VARIANT STREQUAL \"MCXN947\")\n  set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\n  set(FAMILY_MCUS MCXN9 CACHE INTERNAL \"\")\nelse()\n  message(FATAL_ERROR \"MCU_VARIANT not supported\")\nendif()\n\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\n  set(LD_FILE_GNU ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}/gcc/${MCU_CORE}_flash.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\nif (NOT DEFINED STARTUP_FILE_GNU)\n  set(STARTUP_FILE_GNU ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}/gcc/startup_${MCU_CORE}.S)\nendif()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\nif (NOT DEFINED LD_FILE_IAR)\n  set(LD_FILE_IAR ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}/iar/${MCU_CORE}_flash.icf)\nendif ()\n\nif (NOT DEFINED STARTUP_FILE_IAR)\n  set(STARTUP_FILE_IAR ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}/iar/startup_${MCU_CORE}.s)\nendif ()\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    # driver\n    ${MCUX_DIR}/drivers/gpio/fsl_gpio.c\n    ${MCUX_DIR}/drivers/common/fsl_common_arm.c\n    ${MCUX_DIR}/drivers/lpuart/fsl_lpuart.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/drivers/spc/fsl_spc.c\n    # mcu\n    ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}/system_${MCU_CORE}.c\n    ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}/drivers/fsl_clock.c\n    ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}/drivers/fsl_reset.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    ${MCUX_DIR}/drivers/gpio/\n    ${MCUX_DIR}/drivers/lpuart\n    ${MCUX_DIR}/drivers/common\n    ${MCUX_DIR}/drivers/port\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/drivers/spc\n    ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}\n    ${SDK_DIR}/${MCU_FAMILY}/${MCU_VARIANT}/drivers\n    )\n\n  if (${FAMILY_MCUS} STREQUAL \"MCXN9\")\n    target_sources(${BOARD_TARGET} PRIVATE\n      ${MCUX_DIR}/drivers/lpflexcomm/fsl_lpflexcomm.c\n      )\n    target_include_directories(${BOARD_TARGET} PUBLIC\n      ${MCUX_DIR}/drivers/lpflexcomm\n      )\n  elseif(${FAMILY_MCUS} STREQUAL \"MCXA15\")\n  endif()\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  if (${FAMILY_MCUS} STREQUAL \"MCXN9\")\n    family_add_tinyusb(${TARGET} OPT_MCU_MCXN9)\n  elseif(${FAMILY_MCUS} STREQUAL \"MCXA15\")\n    family_add_tinyusb(${TARGET} OPT_MCU_MCXA15)\n  endif()\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/chipidea/$<IF:${PORT},ci_hs/dcd_ci_hs.c,ci_fs/dcd_ci_fs.c>\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      \"LINKER:--defsym=__stack_size__=0x1000\"\n      \"LINKER:--defsym=__heap_size__=0\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      \"LINKER:--config_def=__stack_size__=0x1000\"\n      \"LINKER:--config_def=__heap_size__=0\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_nxplink(${TARGET})\n  #family_flash_pyocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/mcx/family.mk",
    "content": "UF2_FAMILY_ID = 0x2abc77ec\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m33\nMCUX_DIR = hw/mcu/nxp/mcuxsdk-core\nSDK_DIR = hw/mcu/nxp/mcux-devices-mcx\n\n# Default to Highspeed PORT1\nPORT ?= 1\n\nCFLAGS += \\\n  -flto \\\n  -DBOARD_TUD_RHPORT=$(PORT) \\\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=old-style-declaration -Wno-error=redundant-decls\n\nLDFLAGS_GCC += \\\n  --specs=nosys.specs --specs=nano.specs \\\n  -Wl,--defsym=__stack_size__=0x1000 \\\n  -Wl,--defsym=__heap_size__=0 \\\n\n# All source paths should be relative to the top level.\nLD_FILE ?= $(SDK_DIR)/$(MCU_FAMILY)/$(MCU_VARIANT)/gcc/$(MCU_CORE)_flash.ld\n\n# TinyUSB: Port0 is chipidea FS, Port1 is chipidea HS\nifeq ($(PORT), 1)\n  $(info \"PORT1 High Speed\")\n  CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n\tSRC_C += src/portable/chipidea/ci_hs/dcd_ci_hs.c\nelse\n  $(info \"PORT0 Full Speed\")\n  CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_FULL_SPEED\n  SRC_C += src/portable/chipidea/ci_fs/dcd_ci_fs.c\nendif\n\nSRC_C += \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/$(MCU_VARIANT)/system_$(MCU_CORE).c \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/$(MCU_VARIANT)/drivers/fsl_clock.c \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/$(MCU_VARIANT)/drivers/fsl_reset.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/gpio/fsl_gpio.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpuart/fsl_lpuart.c \\\n\t$(TOP)/$(MCUX_DIR)/drivers/common/fsl_common_arm.c \\\n\thw/bsp/mcx/drivers/spc/fsl_spc.c\n\n# fsl_lpflexcomm for MCXN9\nifeq ($(MCU_VARIANT), MCXN947)\n\tSRC_C += $(MCUX_DIR)/drivers/lpflexcomm/fsl_lpflexcomm.c\nendif\n\n# fsl_spc for MCXNA15\nifeq ($(MCU_VARIANT), MCXA153)\n\nendif\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_6/CMSIS/Core/Include \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/$(MCU_VARIANT) \\\n\t$(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/$(MCU_VARIANT)/drivers \\\n\t$(TOP)/$(MCUX_DIR)/drivers/ \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpuart \\\n\t$(TOP)/$(MCUX_DIR)/drivers/lpflexcomm \\\n\t$(TOP)/$(MCUX_DIR)/drivers/common \\\n\t$(TOP)/$(MCUX_DIR)/drivers/gpio \\\n\t$(TOP)/$(MCUX_DIR)/drivers/port \\\n\t$(TOP)/hw/bsp/mcx/drivers/spc\n\nSRC_S += $(TOP)/$(SDK_DIR)/$(MCU_FAMILY)/$(MCU_VARIANT)/gcc/startup_$(MCU_CORE).S\n"
  },
  {
    "path": "hw/bsp/mm32/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"mm32_device.h\"\n  extern u32 SystemCoreClock;\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mm32/boards/mm32f327x_mb39/board.cmake",
    "content": "set(MCU_VARIANT mm32f327x)\nset(JLINK_DEVICE MM32F3273G9P)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    HSE_VALUE=8000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/mm32/boards/mm32f327x_mb39/board.h",
    "content": "/* metadata:\n   name: MM32F3273G9P MB-039\n   url: https://www.mindmotion.com.cn/support/development_tools/evaluation_boards/evboard/mm32f3273g9p/\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n// GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_15); //Disable JTDI   AF to  AF15\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_Pin_15\n#define LED_STATE_ON          1\n\n//#define BUTTON_PORT           GPIOC\n//#define BUTTON_PIN            GPIO_PIN_13\n//#define BUTTON_STATE_ACTIVE   1\n\n#define UART_DEV              UART1\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF_7\n#define UART_TX_PIN           9\n#define UART_RX_PIN           10\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mm32/boards/mm32f327x_mb39/board.mk",
    "content": "MCU_VARIANT = mm32f327x\nCFLAGS += \\\n\t-DHSE_VALUE=8000000\n\nJLINK_DEVICE = MM32F3273G9P\n\nLD_FILE = $(BOARD_PATH)/flash.ld\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/mm32/boards/mm32f327x_mb39/flash.ld",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 MM32 SE TEAM\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x2001FFFF;    /* end of RAM */\n\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K\nRAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/mm32/boards/mm32f327x_pitaya_lite/board.cmake",
    "content": "set(MCU_VARIANT mm32f327x)\nset(JLINK_DEVICE MM32F3273G8P)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    HSE_VALUE=12000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/mm32/boards/mm32f327x_pitaya_lite/board.h",
    "content": "/* metadata:\n   name: DshanMCU Pitaya Lite with MM32F3273G8P\n   url: https://gitee.com/weidongshan/DshanMCU-Pitaya-c\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n// GPIO_PinAFConfig(GPIOA, GPIO_PinSource15, GPIO_AF_15); //Disable JTDI   AF to  AF15\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_Pin_1\n#define LED_STATE_ON          1\n\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_Pin_0\n#define BUTTON_STATE_ACTIVE   0\n\n\n#endif\n"
  },
  {
    "path": "hw/bsp/mm32/boards/mm32f327x_pitaya_lite/board.mk",
    "content": "MCU_VARIANT = mm32f327x\n\nCFLAGS += \\\n\t-DHSE_VALUE=12000000\n\nLD_FILE = $(BOARD_PATH)/flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = MM32F3273G8P\n\n# flash target using on-board stlink\n#flash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/mm32/boards/mm32f327x_pitaya_lite/flash.ld",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 MM32 SE TEAM\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x2001FFFF;    /* end of RAM */\n\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K\nRAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/mm32/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 MM32 SE TEAM\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: MindMotion\n*/\n\n#include \"hal_conf.h\"\n#include \"mm32_device.h\"\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n#ifdef __GNUC__ // caused by extra declaration of SystemCoreClock in freeRTOSConfig.h\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\nextern u32 SystemCoreClock;\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTG_FS_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid USB_DeviceClockInit(void) {\n  /* Select USBCLK source */\n  //  RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1);\n  RCC->CFGR &= ~(0x3 << 22);\n  RCC->CFGR |= (0x1 << 22);\n\n  /* Enable USB clock */\n  RCC->AHB2ENR |= 0x1 << 7;\n}\n\nvoid board_init(void) {\n//   usb clock\n  USB_DeviceClockInit();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(SystemCoreClock / 1000);\n  NVIC_SetPriority(SysTick_IRQn, 0x0);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);\n\n  // LED\n  GPIO_InitTypeDef GPIO_InitStruct;\n  GPIO_StructInit(&GPIO_InitStruct);\n  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;\n  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;\n  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;\n  GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  board_led_write(true);\n\n  #ifdef BUTTON_PORT\n  GPIO_StructInit(&GPIO_InitStruct);\n  GPIO_InitStruct.GPIO_Pin = BUTTON_PIN;\n  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;\n  GPIO_InitStruct.GPIO_Mode = BUTTON_STATE_ACTIVE ? GPIO_Mode_IPD : GPIO_Mode_IPU;\n  GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n  #endif\n\n  #ifdef UART_DEV\n  // UART\n  UART_InitTypeDef UART_InitStruct;\n\n  RCC_APB2PeriphClockCmd(RCC_APB2ENR_UART1, ENABLE);  //enableUART1,GPIOAclock\n  GPIO_PinAFConfig(GPIOA, UART_TX_PIN, UART_GPIO_AF);\n  GPIO_PinAFConfig(GPIOA, UART_RX_PIN, UART_GPIO_AF);\n\n  UART_StructInit(&UART_InitStruct);\n  UART_InitStruct.UART_BaudRate = CFG_BOARD_UART_BAUDRATE;\n  UART_InitStruct.UART_WordLength = UART_WordLength_8b;\n  UART_InitStruct.UART_StopBits = UART_StopBits_1;\n  UART_InitStruct.UART_Parity = UART_Parity_No;\n  UART_InitStruct.UART_HardwareFlowControl = UART_HardwareFlowControl_None;\n  UART_InitStruct.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;\n\n  UART_Init(UART_DEV, &UART_InitStruct);\n  UART_Cmd(UART_DEV, ENABLE);\n\n  GPIO_StructInit(&GPIO_InitStruct);\n  GPIO_InitStruct.GPIO_Pin = 1 << UART_TX_PIN;\n  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;\n  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;\n  GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  GPIO_InitStruct.GPIO_Pin = 1 << UART_RX_PIN;\n  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;\n  GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_WriteBit(LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n#ifdef BUTTON_PORT\n  return GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN) == BUTTON_STATE_ACTIVE;\n#else\n  return 0;\n#endif\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  #ifdef UART_DEV\n  const char* buff = buf;\n  while (len) {\n    while ((UART1->CSR & UART_IT_TXIEN) == 0);    //The loop is sent until it is finished\n    UART1->TDR = (*buff & 0xFF);\n    buff++;\n    len--;\n  }\n  return len;\n  #else\n  (void) buf;\n  (void) len;\n  return 0;\n  #endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/mm32/family.cmake",
    "content": "include_guard()\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nstring(REPLACE \"mm32f\" \"MM32F\" MCU_VARIANT_UPPER ${MCU_VARIANT})\nset(SDK_DIR ${TOP}/hw/mcu/mindmotion/mm32sdk/${MCU_VARIANT_UPPER})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS MM32F327X CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${SDK_DIR}/Source/GCC_StartAsm/startup_${MCU_VARIANT}_gcc.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${SDK_DIR}/Source/IAR_StartAsm/startup_${MCU_VARIANT}_iar.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\n# set(LD_FILE_IAR )\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/Source/system_${MCU_VARIANT}.c\n    ${SDK_DIR}/HAL_Lib/Src/hal_gpio.c\n    ${SDK_DIR}/HAL_Lib/Src/hal_rcc.c\n    ${SDK_DIR}/HAL_Lib/Src/hal_uart.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${SDK_DIR}/Include\n    ${SDK_DIR}/HAL_Lib/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_MM32F327X)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/mindmotion/mm32/dcd_mm32f327x_otg.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/mm32/family.mk",
    "content": "UF2_FAMILY_ID = 0x0\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nMCU_VARIANT_UPPER = $(subst mm32f,MM32F,${MCU_VARIANT})\nSDK_DIR = hw/mcu/mindmotion/mm32sdk/${MCU_VARIANT_UPPER}\n\nCPU_CORE ?= cortex-m3\n\nCFLAGS += \\\n  -flto \\\n  -DCFG_TUSB_MCU=OPT_MCU_MM32F327X \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS += -Wno-error=unused-parameter -Wno-error=maybe-uninitialized -Wno-error=cast-qual\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  -specs=nosys.specs -specs=nano.specs \\\n\nSRC_C += \\\n\tsrc/portable/mindmotion/mm32/dcd_mm32f327x_otg.c \\\n\t$(SDK_DIR)/Source/system_${MCU_VARIANT}.c \\\n\t$(SDK_DIR)/HAL_Lib/Src/hal_gpio.c \\\n\t$(SDK_DIR)/HAL_Lib/Src/hal_rcc.c \\\n\t$(SDK_DIR)/HAL_Lib/Src/hal_uart.c \\\n\nSRC_S += ${SDK_DIR}/Source/GCC_StartAsm/startup_${MCU_VARIANT}_gcc.s\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(SDK_DIR)/Include \\\n\t$(TOP)/$(SDK_DIR)/HAL_Lib/Inc\n"
  },
  {
    "path": "hw/bsp/msp430/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"msp430.h\"\n#endif\n\n#define configUSE_PREEMPTION\t\t1\n#define configUSE_IDLE_HOOK\t\t\t1\n#define configUSE_TICK_HOOK\t\t\t0\n#define configUSE_MALLOC_FAILED_HOOK           0\n#define configCPU_CLOCK_HZ\t\t\t( ( unsigned long ) 7995392 ) /* Clock setup from main.c in the demo application. */\n#define configTICK_RATE_HZ\t\t\t( ( TickType_t ) 1000 )\n#define configMAX_PRIORITIES\t\t( 4 )\n#define configMINIMAL_STACK_SIZE\t( ( unsigned short ) 50 )\n#define configTOTAL_HEAP_SIZE\t\t( ( size_t ) ( 1700 ) )\n#define configMAX_TASK_NAME_LEN\t\t( 8 )\n#define configUSE_TRACE_FACILITY\t0\n#define configUSE_16_BIT_TICKS\t\t1\n#define configIDLE_SHOULD_YIELD\t\t1\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES \t\t0\n#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )\n\n/* Set the following definitions to 1 to include the API function, or zero to exclude the API function. */\n\n#define INCLUDE_vTaskPrioritySet\t\t0\n#define INCLUDE_uxTaskPriorityGet\t\t0\n#define INCLUDE_vTaskDelete\t\t\t\t1\n#define INCLUDE_vTaskCleanUpResources\t0\n#define INCLUDE_vTaskSuspend\t\t\t0\n#define INCLUDE_vTaskDelayUntil\t\t\t1\n#define INCLUDE_vTaskDelay\t\t\t\t1\n\n#endif /* FREERTOS_CONFIG_H */\n"
  },
  {
    "path": "hw/bsp/msp430/boards/msp_exp430f5529lp/board.cmake",
    "content": "set(MCU_VARIANT msp430f5529)\nset(LD_FILE_GNU ${SDK_DIR}/msp430f5529.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} INTERFACE\n    __MSP430F5529__\n    )\n\nendfunction()\n"
  },
  {
    "path": "hw/bsp/msp430/boards/msp_exp430f5529lp/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MSP430F5529 LaunchPad\n   url: https://www.ti.com/tool/MSP-EXP430F5529LP\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              P1OUT\n#define LED_PIN               BIT0\n#define LED_STATE_ON          1\n\n#define BUTTON_PORT           P1IN\n#define BUTTON_PIN            BIT1\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/msp430/boards/msp_exp430f5529lp/board.mk",
    "content": "CFLAGS += \\\n  -D__MSP430F5529__ \\\n\nLD_FILE = ${SDK_DIR}/msp430f5529.ld\n"
  },
  {
    "path": "hw/bsp/msp430/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Texas Instruments\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include \"msp430.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_UBM_ISR(void) __attribute__ ((interrupt(USB_UBM_VECTOR)));\nvoid USB_UBM_ISR(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\nuint32_t cnt = 0;\n\nstatic void SystemClock_Config(void)\n{\n  WDTCTL = WDTPW + WDTHOLD; // Disable watchdog.\n\n  // Increase VCore to level 2- required for 16 MHz operation on this MCU.\n  PMMCTL0 = PMMPW + PMMCOREV_2;\n\n  UCSCTL3 = SELREF__XT2CLK; // FLL is fed by XT2.\n\n  // XT1 used for ACLK (default- not used in this demo)\n  P5SEL |= BIT4; // Required to enable XT1\n  // Loop until XT1 fault flag is cleared.\n  do\n  {\n    UCSCTL7 &= ~XT1LFOFFG;\n  }while(UCSCTL7 & XT1LFOFFG);\n\n  // XT2 is 4 MHz an external oscillator, use PLL to boost to 16 MHz.\n  P5SEL |= BIT2; // Required to enable XT2.\n  // Loop until XT2 fault flag is cleared\n  do\n  {\n    UCSCTL7 &= ~XT2OFFG;\n  }while(UCSCTL7 & XT2OFFG);\n\n  // Kickstart the DCO into the correct frequency range, otherwise a\n  // fault will occur.\n  // FIXME: DCORSEL_6 should work according to datasheet params, but generates\n  // a fault. I am not sure why it faults.\n  UCSCTL1 = DCORSEL_7;\n  UCSCTL2 = FLLD_2 + 3; // DCO freq = D * (N + 1) * (FLLREFCLK / n)\n                        // DCOCLKDIV freq = (N + 1) * (FLLREFCLK / n)\n                        // N = 3, D = 2, thus DCO freq = 32 MHz.\n\n  // MCLK configured for 16 MHz using XT2.\n  // SMCLK configured for 8 MHz using XT2.\n  UCSCTL4 |= SELM__DCOCLKDIV + SELS__DCOCLKDIV;\n  UCSCTL5 |= DIVM__16 + DIVS__2;\n\n  // Now wait till everything's stabilized.\n  do\n  {\n    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + DCOFFG);\n    SFRIFG1 &= ~OFIFG;\n  }while(SFRIFG1 & OFIFG);\n\n  // Configure Timer A to use SMCLK as a source. Count 1000 ticks at 1 MHz.\n  TA0CCTL0 |= CCIE;\n  TA0CCR0 = 999; // 1000 ticks.\n  TA0CTL |= TASSEL_2 + ID_3 + MC__UP; // Use SMCLK, divide by 8, start timer.\n\n  // Initialize USB power and PLL.\n  USBKEYPID = USBKEY;\n\n  // VUSB enabled automatically.\n  // Wait two milliseconds to stabilize, per manual recommendation.\n  uint32_t ms_elapsed = tusb_time_millis_api();\n  do\n  {\n    while((tusb_time_millis_api() - ms_elapsed) < 2);\n  }while(!(USBPWRCTL & USBBGVBV));\n\n  // USB uses XT2 (4 MHz) directly. Enable the PLL.\n  USBPLLDIVB |= USBPLL_SETCLK_4_0;\n  USBPLLCTL |= (UPFDEN | UPLLEN);\n\n  // Wait until PLL locks. Check every 2ms, per manual.\n  ms_elapsed = tusb_time_millis_api();\n  do\n  {\n    USBPLLIR &= ~USBOOLIFG;\n    while((tusb_time_millis_api() - ms_elapsed) < 2);\n  }while(USBPLLIR & USBOOLIFG);\n\n  USBKEYPID = 0;\n}\n\nuint32_t wait = 0;\n\nvoid board_init(void)\n{\n  __bis_SR_register(GIE); // Enable interrupts.\n  SystemClock_Config();\n\n  // Enable basic I/O.\n  P1DIR |= LED_PIN; // LED output.\n  P1REN |= BUTTON_PIN; // Internal resistor enable.\n  P1OUT |= BUTTON_PIN; // Pullup.\n\n  // Enable the backchannel UART (115200)\n  P4DIR |= BIT5;\n  P4SEL |= (BIT5 | BIT4);\n\n  UCA1CTL1 |= (UCSSEL__SMCLK | UCSWRST); // Hold in reset, use SMCLK.\n  UCA1BRW = 4;\n  UCA1MCTL |= (UCBRF_3 | UCBRS_5 | UCOS16); // Overampling mode, 115200 baud.\n                                            // Copied from manual.\n  UCA1CTL1 &= ~UCSWRST;\n\n  // Set up USB pins.\n  USBKEYPID = USBKEY;\n  USBPHYCTL |= PUSEL; // Convert USB D+/D- pins to USB functionality.\n  USBKEYPID = 0;\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  if(state)\n  {\n    LED_PORT |= LED_PIN;\n  }\n  else\n  {\n    LED_PORT &= ~LED_PIN;\n  }\n}\n\nuint32_t board_button_read(void)\n{\n  return ((P1IN & BIT1) >> 1) == BUTTON_STATE_ACTIVE;\n}\n\nint board_uart_read(uint8_t * buf, int len)\n{\n  for(int i = 0; i < len; i++)\n  {\n    // Wait until something to receive (cleared by reading buffer).\n    while(!(UCA1IFG & UCRXIFG));\n    buf[i] = UCA1RXBUF;\n  }\n\n  return len;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  const char * char_buf = (const char *) buf;\n\n  for(int i = 0; i < len; i++)\n  {\n    // Wait until TX buffer is empty (cleared by writing buffer).\n    while(!(UCA1IFG & UCTXIFG));\n    UCA1TXBUF = char_buf[i];\n  }\n\n  return len;\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid TIMER0_A0_ISR (void) __attribute__ ((interrupt(TIMER0_A0_VECTOR)));\nvoid TIMER0_A0_ISR (void) {\n  system_ticks++;\n  // TAxCCR0 CCIFG resets itself as soon as interrupt is invoked.\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  uint32_t systick_mirror;\n\n  // 32-bit update is not atomic on MSP430. We can read the bottom 16-bits,\n  // an interrupt occurs, updates _all_ 32 bits, and then we return a\n  // garbage value. And I've seen it happen!\n  TA0CCTL0 &= ~CCIE;\n  systick_mirror = system_ticks;\n  TA0CCTL0 |= CCIE;\n\n  return systick_mirror;\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/msp430/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/ti/msp430/msp430-gcc-support-files/include)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU msp430 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/msp430_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS MSP430x5xx CACHE INTERNAL \"\")\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\n# only need to be built ONCE for all examples\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} INTERFACE)\n  target_compile_definitions(${BOARD_TARGET} INTERFACE\n    CFG_TUD_ENDPOINT0_SIZE=8\n    CFG_EXAMPLE_VIDEO_READONLY\n    CFG_EXAMPLE_MSC_READONLY\n    )\n  target_include_directories(${BOARD_TARGET} INTERFACE\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${SDK_DIR}\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_MSP430x5xx)\n\n  #---------- Port Specific ----------\n  # These files are built for each example since it depends on example's tusb_config.h\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    # family, hw, board\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -L${SDK_DIR}\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_msp430flasher(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/msp430/family.mk",
    "content": "CROSS_COMPILE = msp430-elf-\nSKIP_NANOLIB = 1\n\nSDK_DIR = hw/mcu/ti/msp430/msp430-gcc-support-files/include\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_MSP430x5xx \\\n\t-DCFG_EXAMPLE_MSC_READONLY \\\n\t-DCFG_TUD_ENDPOINT0_SIZE=8\n\nLDFLAGS += -L${TOP}/${SDK_DIR}\n\nSRC_C += src/portable/ti/msp430x5xx/dcd_msp430x5xx.c\n\nINC += \\\n\t${TOP}/${SDK_DIR} \\\n\t$(TOP)/$(BOARD_PATH)\n\n# export for libmsp430.so to same installation\nifneq ($(OS),Windows_NT)\nexport LD_LIBRARY_PATH=$(dir $(shell which MSP430Flasher))\nendif\n\n# flash target using TI MSP430-Flasher\n# http://www.ti.com/tool/MSP430-FLASHER\n# Please add its installation dir to PATH\nflash: $(BUILD)/$(PROJECT).hex\n\tMSP430Flasher -w $< -z [VCC]\n\n# flash target using mspdebug.\nflash-mspdebug: $(BUILD)/$(PROJECT).elf\n\t$(MSPDEBUG) tilib \"prog $<\" --allow-fw-update\n"
  },
  {
    "path": "hw/bsp/msp432e4/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"msp.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/msp432e4/boards/msp_exp432e401y/board.cmake",
    "content": "set(MCU_VARIANT msp432e401y)\nset(JLINK_DEVICE ${MCU_VARIANT})\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __MSP432E401Y__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/msp432e4/boards/msp_exp432e401y/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: MSP432E401Y LaunchPad\n   url: https://www.ti.com/tool/MSP-EXP432E401Y\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#define CLK_LED               12u\n#define GPIO_LED              GPION\n#define GPIO_LED_PIN          1u\n\n#define CLK_BUTTON            8u\n#define GPIO_BUTTON           GPIOJ\n#define GPIO_BUTTON_PIN       0u\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/msp432e4/boards/msp_exp432e401y/board.mk",
    "content": "MCU_VARIANT = msp432e401y\nCFLAGS += \\\n\t-D__MSP432E401Y__ \\\n"
  },
  {
    "path": "hw/bsp/msp432e4/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Texas Instruments\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include \"msp.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_IRQHandler(void)\n{\n#if CFG_TUH_ENABLED\n  tuh_int_handler(0, true);\n#endif\n#if CFG_TUD_ENABLED\n  tud_int_handler(0);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\nvoid board_init(void)\n{\n  unsigned bits;\n  /* Turn off power domains that unused peripherals belong to */\n  SYSCTL->PCCAN  = 0u;\n#ifdef __MCU_HAS_LCD0__\n  SYSCTL->PCLCD  = 0u;\n#endif\n  SYSCTL->PCEMAC = 0u;\n  SYSCTL->PCEPHY = 0u;\n  SYSCTL->PCCCM  = 0u;\n\n  /* --- Setup system clock --- */\n  /* Start power-up process of the main oscillator */\n  SYSCTL->MOSCCTL = SYSCTL_MOSCCTL_OSCRNG;\n  while (!(SYSCTL->RIS & SYSCTL_RIS_MOSCPUPRIS)) ; /* Wait for completion */\n  SYSCTL->MISC = SYSCTL_MISC_MOSCPUPMIS; /* Clear the completion interrupt status */\n  /* Set the main oscillator to PLL reference clock */\n  SYSCTL->RSCLKCFG = SYSCTL_RSCLKCFG_PLLSRC_MOSC;\n  /* PLL freq. = (MOSC freq. / 10) * 96 = 240MHz */\n  SYSCTL->PLLFREQ1 = (4 << SYSCTL_PLLFREQ1_N_S) | (1 << SYSCTL_PLLFREQ1_Q_S);\n  SYSCTL->PLLFREQ0 = (96 << SYSCTL_PLLFREQ0_MINT_S) | SYSCTL_PLLFREQ0_PLLPWR;\n  /* Set BCHT=6, BCE=0, WS=5 for 120MHz system clock */\n  SYSCTL->MEMTIM0 = SYSCTL_MEMTIM0_EBCHT_3_5 | (5 << SYSCTL_MEMTIM0_EWS_S) |\n    SYSCTL_MEMTIM0_FBCHT_3_5 | (5 << SYSCTL_MEMTIM0_FWS_S) | SYSCTL_MEMTIM0_MB1;\n  /* Wait for completion of PLL power-up process */\n  while (!(SYSCTL->RIS & SYSCTL_RIS_PLLLRIS)) ;\n  SYSCTL->MISC = SYSCTL_MISC_PLLLMIS; /* Clear the completion interrupt status */\n  /* Switch the system clock to PLL/4 */\n  SYSCTL->RSCLKCFG = SYSCTL_RSCLKCFG_MEMTIMU | SYSCTL_RSCLKCFG_ACG |\n         SYSCTL_RSCLKCFG_USEPLL | SYSCTL_RSCLKCFG_PLLSRC_MOSC | (1 << SYSCTL_RSCLKCFG_PSYSDIV_S);\n\n  SystemCoreClockUpdate();\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  /* USR_LED1 ON1 */\n  bits              = TU_BIT(CLK_LED);\n  SYSCTL->RCGCGPIO |= bits;\n  while (bits != (SYSCTL->RCGCGPIO & bits)) ;\n  GPIO_LED->DIR     = TU_BIT(GPIO_LED_PIN);\n  GPIO_LED->DEN     = TU_BIT(GPIO_LED_PIN);\n\n  /* USR_SW1 PJ0 */\n  bits              = TU_BIT(CLK_BUTTON);\n  SYSCTL->RCGCGPIO |= bits;\n  while (bits != (SYSCTL->RCGCGPIO & bits)) ;\n  GPIO_BUTTON->PUR  = TU_BIT(GPIO_BUTTON_PIN);\n  GPIO_BUTTON->DEN  = TU_BIT(GPIO_BUTTON_PIN);\n\n  /* UART PA0,1 */\n  bits              = TU_BIT(0);\n  SYSCTL->RCGCGPIO |= bits;\n  while (bits != (SYSCTL->RCGCGPIO & bits)) ;\n  GPIOA->AFSEL      = 3u;\n  GPIOA->PCTL       = 0x11u;\n  GPIOA->DEN        = 3u;\n\n  SYSCTL->RCGCUART |= 1u << 0;\n  while (!(SYSCTL->PRUART & (1u << 0))) ;\n  UART0->CTL        = 0;\n  UART0->IBRD       = 8;  /* 8.68056 = 16MHz / (16 * 115200) */\n  UART0->FBRD       = 44; /* 0.6875 = 44/64 -> 115108bps (0.08%) */\n  UART0->LCRH       = UART_LCRH_WLEN_8 | UART_LCRH_FEN;\n  UART0->CC         = UART_CC_CS_PIOSC; /* Set the baud clock to PIOSC */\n  UART0->CTL        = UART_CTL_RXE | UART_CTL_TXE | UART_CTL_UARTEN;\n\n  /* USB PB0(ID) PB1(VBUS) PL6,7(DP,DM) */\n  bits              = TU_BIT(1) | TU_BIT(10);\n  SYSCTL->RCGCGPIO |= bits;\n  while (bits != (SYSCTL->RCGCGPIO & bits)) ;\n  GPIOB->AMSEL      = TU_BIT(0) | TU_BIT(1);\n  GPIOL->AMSEL      = TU_BIT(6) | TU_BIT(7);\n\n#if CFG_TUH_ENABLED\n  /* USB PD6(EPEN) */\n  bits              = TU_BIT(3);\n  SYSCTL->RCGCGPIO |= bits;\n  while (bits != (SYSCTL->RCGCGPIO & bits)) ;\n  GPIOD->AFSEL      = TU_BIT(6);\n  GPIOD->PCTL       = 0x05000000u;\n  GPIOD->DEN        = TU_BIT(6);\n#endif\n\n  SYSCTL->RCGCUSB   = 1u; /* Open the clock gate for SYSCLK */\n  while (!(SYSCTL->PRUSB & (1u << 0))) ;\n  USB0->CC          = USB_CC_CLKEN | (3u << USB_CC_CLKDIV_S); /* 60MHz = 240MHz / 4 */\n  __DMB(); /* Wait for completion of opening of the clock gate */\n\n  SYSCTL->SRUSB     = 1u;\n  for (int i = 0; i < 16; ++i) __NOP();\n  SYSCTL->SRUSB     = 0u;\n\n  USB0->CC          = USB_CC_CLKEN | (3u << USB_CC_CLKDIV_S); /* 60MHz = 240MHz / 4 */\n  __DMB(); /* Wait for completion of opening of the clock gate */\n#if CFG_TUH_ENABLED\n  USB0->GPCS = USB_GPCS_DEVMOD_OTG;\n  USB0->EPC  = USB_EPC_EPENDE | USB_EPC_EPEN_HIGH;\n#endif\n#if CFG_TUD_ENABLED\n  USB0->GPCS = USB_GPCS_DEVMOD_DEVVBUS;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  if (state)\n    GPIO_LED->DATA |= TU_BIT(GPIO_LED_PIN);\n  else\n    GPIO_LED->DATA &= ~TU_BIT(GPIO_LED_PIN);\n}\n\nuint32_t board_button_read(void)\n{\n  return (GPIO_BUTTON->DATA & TU_BIT(GPIO_BUTTON_PIN)) ? 0u : 1u;\n}\n\nint board_uart_read(uint8_t * buf, int len)\n{\n  for (int i = 0; i < len; ++i) {\n    while (UART0->FR & UART_FR_RXFE) ;\n    *buf++ = UART0->DR;\n  }\n  return len;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  uint8_t const *p = (uint8_t const *)buf;\n  for (int i = 0; i < len; ++i) {\n    while (UART0->FR & UART_FR_TXFF) ;\n    UART0->DR = *p++;\n  }\n  return len;\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0u;\nvoid SysTick_Handler(void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/msp432e4/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/ti/msp432e4)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS MSP432E4 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${SDK_DIR}/Source/${MCU_VARIANT}.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED STARTUP_FILE_GNU)\nset(STARTUP_FILE_GNU ${SDK_DIR}/Source/startup_${MCU_VARIANT}_gcc.S)\nendif ()\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/Source/system_${MCU_VARIANT}.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/Include\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_MSP432E4)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/mentor/musb/dcd_musb.c\n    ${TOP}/src/portable/mentor/musb/hcd_musb.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${TARGET} PUBLIC\n      -mslow-flash-data\n      )\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    message(FATAL_ERROR \"Clang is not supported for MSP432E4\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_msp430flasher(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/msp432e4/family.mk",
    "content": "SDK_SIR = hw/mcu/ti/msp432e4\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nCFLAGS += \\\n\t-flto \\\n\t-mslow-flash-data \\\n\t-DCFG_TUSB_MCU=OPT_MCU_MSP432E4\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=cast-qual -Wno-error=format=\n\nLDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs\n\nLD_FILE = hw/mcu/ti/msp432e4/Source/${MCU_VARIANT}.ld\n\nSRC_C += \\\n\tsrc/portable/mentor/musb/dcd_musb.c \\\n\tsrc/portable/mentor/musb/hcd_musb.c \\\n\t$(SDK_SIR)/Source/system_${MCU_VARIANT}.c\n\nINC += \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(SDK_SIR)/Include \\\n\t$(TOP)/$(BOARD_PATH)\n\nSRC_S += $(SDK_SIR)/Source/startup_${MCU_VARIANT}_gcc.S\n\n# For flash-jlink target\nJLINK_DEVICE = $(MCU_VARIANT)\n"
  },
  {
    "path": "hw/bsp/nrf/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"nrf.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nrf/boards/adafruit_clue/board.cmake",
    "content": "set(MCU_VARIANT nrf52840)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/nrf52840_s140_v6.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/adafruit_clue/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit CLUE\n   url: https://www.adafruit.com/product/4500\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN               _PINNUM(1, 1)\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            _PINNUM(1, 02)\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           4\n#define UART_TX_PIN           5\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/adafruit_clue/board.mk",
    "content": "MCU_VARIANT = nrf52840\nCFLAGS += -DNRF52840_XXAA\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/nrf52840_s140_v6.ld\n\n$(BUILD)/$(PROJECT).zip: $(BUILD)/$(PROJECT).hex\n\tadafruit-nrfutil dfu genpkg --dev-type 0x0052 --sd-req 0xFFFE --application $^ $@\n\n# flash using adafruit-nrfutil dfu\nflash: $(BUILD)/$(PROJECT).zip\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\tadafruit-nrfutil --verbose dfu serial --package $^ -p $(SERIAL) -b 115200 --singlebank --touch 1200\n"
  },
  {
    "path": "hw/bsp/nrf/boards/arduino_nano33_ble/arduino_nano33_ble.ld",
    "content": "/* Linker script to configure memory regions. */\n\nSEARCH_DIR(.)\n/*GROUP(-lgcc -lc -lnosys) not compatible with clang*/\n\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x10000, LENGTH = 0xf0000\n  RAM_NVIC (rwx) : ORIGIN = 0x20000000, LENGTH = 0x100\n  RAM_CRASH_DATA (rwx) : ORIGIN = (0x20000000 + 0x100), LENGTH = 0x100\n  RAM (rwx) : ORIGIN = ((0x20000000 + 0x100) + 0x100), LENGTH = (0x40000 - (0x100 + 0x100))\n}\n\nSECTIONS\n{\n  . = ALIGN(4);\n  .svc_data :\n  {\n    PROVIDE(__start_svc_data = .);\n    KEEP(*(.svc_data))\n    PROVIDE(__stop_svc_data = .);\n  } > RAM\n\n  .fs_data :\n  {\n    PROVIDE(__start_fs_data = .);\n    KEEP(*(.fs_data))\n    PROVIDE(__stop_fs_data = .);\n  } > RAM\n} INSERT AFTER .data;\n\nINCLUDE \"nrf_common.ld\"\n"
  },
  {
    "path": "hw/bsp/nrf/boards/arduino_nano33_ble/board.cmake",
    "content": "set(MCU_VARIANT nrf52840)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/arduino_nano33_ble.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/arduino_nano33_ble/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Arduino Nano 33 BLE\n   url: https://store.arduino.cc/arduino-nano-33-ble\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN               _PINNUM(0, 24)\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            _PINNUM(1, 11) // D2\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           _PINNUM(1, 10)\n#define UART_TX_PIN           _PINNUM(1, 3)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/arduino_nano33_ble/board.mk",
    "content": "MCU_VARIANT = nrf52840\nCFLAGS += -DNRF52840_XXAA\n\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# flash using bossac (as part of Nano33 BSP tools)\n# can be found in arduino15/packages/arduino/tools/bossac/\n# Add it to your PATH or change BOSSAC variable to match your installation\nBOSSAC = bossac\n\nflash: $(BUILD)/$(PROJECT).bin\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\t$(BOSSAC) --port=$(SERIAL) -U -i -e -w $^ -R\n"
  },
  {
    "path": "hw/bsp/nrf/boards/circuitplayground_bluefruit/board.cmake",
    "content": "set(MCU_VARIANT nrf52840)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/nrf52840_s140_v6.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/circuitplayground_bluefruit/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Circuit Playground Bluefruit\n   url: https://www.adafruit.com/product/4333\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN         _PINNUM(1, 14)\n#define LED_STATE_ON    1\n\n// Button\n#define BUTTON_PIN      _PINNUM(1, 15)\n#define BUTTON_STATE_ACTIVE   1\n\n// UART\n#define UART_RX_PIN     30\n#define UART_TX_PIN     14\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/circuitplayground_bluefruit/board.mk",
    "content": "MCU_VARIANT = nrf52840\nCFLAGS += -DNRF52840_XXAA\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/nrf52840_s140_v6.ld\n\n$(BUILD)/$(PROJECT).zip: $(BUILD)/$(PROJECT).hex\n\tadafruit-nrfutil dfu genpkg --dev-type 0x0052 --sd-req 0xFFFE --application $^ $@\n\n# flash using adafruit-nrfutil dfu\nflash: $(BUILD)/$(PROJECT).zip\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\tadafruit-nrfutil --verbose dfu serial --package $^ -p $(SERIAL) -b 115200 --singlebank --touch 1200\n"
  },
  {
    "path": "hw/bsp/nrf/boards/feather_nrf52840_express/board.cmake",
    "content": "set(MCU_VARIANT nrf52840)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/nrf52840_s140_v6.ld)\n\n# enable max3421 host driver for this board\n# set(MAX3421_HOST 1)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/feather_nrf52840_express/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather nRF52840 Express\n   url: https://www.adafruit.com/product/4062\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN         _PINNUM(1, 15)\n#define LED_STATE_ON    1\n\n// Button\n#define BUTTON_PIN      _PINNUM(1, 02)\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN     24\n#define UART_TX_PIN     25\n\n// SPI for USB host shield\n#define MAX3421_SCK_PIN  14\n#define MAX3421_MOSI_PIN 13\n#define MAX3421_MISO_PIN 15\n#define MAX3421_CS_PIN   27 // D10\n#define MAX3421_INTR_PIN 26 // D9\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/feather_nrf52840_express/board.mk",
    "content": "MCU_VARIANT = nrf52840\nCFLAGS += -DNRF52840_XXAA\n\n# enable max3421 host driver for this board\nMAX3421_HOST = 1\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/nrf52840_s140_v6.ld\n\n$(BUILD)/$(PROJECT).zip: $(BUILD)/$(PROJECT).hex\n\tadafruit-nrfutil dfu genpkg --dev-type 0x0052 --sd-req 0xFFFE --application $^ $@\n\n# flash using adafruit-nrfutil dfu\nflash: $(BUILD)/$(PROJECT).zip\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\tadafruit-nrfutil --verbose dfu serial --package $^ -p $(SERIAL) -b 115200 --singlebank --touch 1200\n"
  },
  {
    "path": "hw/bsp/nrf/boards/feather_nrf52840_sense/board.cmake",
    "content": "set(MCU_VARIANT nrf52840)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/nrf52840_s140_v6.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/feather_nrf52840_sense/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather nRF52840 Sense\n   url: https://www.adafruit.com/product/4516\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN         _PINNUM(1, 9)\n#define LED_STATE_ON    1\n\n// Button\n#define BUTTON_PIN      _PINNUM(1, 02)\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN     24\n#define UART_TX_PIN     25\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/feather_nrf52840_sense/board.mk",
    "content": "MCU_VARIANT = nrf52840\nCFLAGS += -DNRF52840_XXAA\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/nrf52840_s140_v6.ld\n\n$(BUILD)/$(PROJECT).zip: $(BUILD)/$(PROJECT).hex\n\tadafruit-nrfutil dfu genpkg --dev-type 0x0052 --sd-req 0xFFFE --application $^ $@\n\n# flash using adafruit-nrfutil dfu\nflash: $(BUILD)/$(PROJECT).zip\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\tadafruit-nrfutil --verbose dfu serial --package $^ -p $(SERIAL) -b 115200 --singlebank --touch 1200\n"
  },
  {
    "path": "hw/bsp/nrf/boards/itsybitsy_nrf52840/board.cmake",
    "content": "set(MCU_VARIANT nrf52840)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/nrf52840_s140_v6.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/itsybitsy_nrf52840/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit ItsyBitsy nRF52840 Express\n   url: https://www.adafruit.com/product/4481\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN         _PINNUM(0, 6)\n#define LED_STATE_ON    1\n\n// Button\n#define BUTTON_PIN      _PINNUM(0, 29)\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN     25\n#define UART_TX_PIN     24\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/itsybitsy_nrf52840/board.mk",
    "content": "MCU_VARIANT = nrf52840\nCFLAGS += -DNRF52840_XXAA\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/nrf52840_s140_v6.ld\n\n$(BUILD)/$(PROJECT).zip: $(BUILD)/$(PROJECT).hex\n\tadafruit-nrfutil dfu genpkg --dev-type 0x0052 --sd-req 0xFFFE --application $^ $@\n\n# flash using adafruit-nrfutil dfu\nflash: $(BUILD)/$(PROJECT).zip\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\tadafruit-nrfutil --verbose dfu serial --package $^ -p $(SERIAL) -b 115200 --singlebank --touch 1200\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52833dk/board.cmake",
    "content": "set(MCU_VARIANT nrf52833)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52833dk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Nordic nRF52833 DK\n   url: https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52833-DK\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN               13\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            11\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           8\n#define UART_TX_PIN           6\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52833dk/board.mk",
    "content": "MCU_VARIANT = nrf52833\nCFLAGS += -DNRF52833_XXAA\n\nLD_FILE = ${FAMILY_PATH}/linker/nrf52833_xxaa.ld\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52840dk/board.cmake",
    "content": "set(MCU_VARIANT nrf52840)\n\nfunction(update_board TARGET)\nendfunction()\n\n#board_runner_args(jlink \"--device=nRF52840_xxAA\" \"--speed=4000\")\n#include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake)\n#include(${ZEPHYR_BASE}/boards/common/nrfutil.board.cmake)\n#include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)\n#include(${ZEPHYR_BASE}/boards/common/openocd-nrf5.board.cmake)\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52840dk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Nordic nRF52840DK\n   url: https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-DK\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN               13\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            25 // button 4\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           8\n#define UART_TX_PIN           6\n\n// SPI for USB host shield\n// Pin is correct but not working probably due to signal incompatible (1.8V 3v3) with MAC3421E !?\n//#define MAX3421_SCK_PIN  _PINNUM(1, 15)\n//#define MAX3421_MOSI_PIN _PINNUM(1, 13)\n//#define MAX3421_MISO_PIN _PINNUM(1, 14)\n//#define MAX3421_CS_PIN   _PINNUM(1, 12)\n//#define MAX3421_INTR_PIN _PINNUM(1, 11)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52840dk/board.mk",
    "content": "MCU_VARIANT = nrf52840\nCFLAGS += -DNRF52840_XXAA\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52840dk/ozone/nrf52840.jdebug",
    "content": "\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n  // Dialog-generated settings\n  Project.AddSvdFile (\"$(InstallDir)/Config/CPU/Cortex-M4F.svd\");\n  Project.AddSvdFile (\"$(InstallDir)/Config/Peripherals/ARMv7M.svd\");\n\n  Project.SetDevice (\"nRF52840_xxAA\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"8 MHz\");\n  Project.SetTraceSource (\"Trace Pins\");\n  Project.SetTracePortWidth (4);\n\n  // User settings\n  File.Open (\"../../../../../../examples/device/cdc_msc/cmake-build-pca10056/cdc_msc.elf\");\n}\n\n/*********************************************************************\n*\n*      TargetReset\n*\n* Function description\n*   Replaces the default target device reset routine. Optional.\n*\n* Notes\n*   This example demonstrates the usage when\n*   debugging a RAM program on a Cortex-M target device\n*\n**********************************************************************\n*/\n//void TargetReset (void) {\n//\n//  unsigned int SP;\n//  unsigned int PC;\n//  unsigned int VectorTableAddr;\n//\n//  Exec.Reset();\n//\n//  VectorTableAddr = Elf.GetBaseAddr();\n//\n//  if (VectorTableAddr != 0xFFFFFFFF) {\n//\n//    Util.Log(\"Resetting Program.\");\n//\n//    SP = Target.ReadU32(VectorTableAddr);\n//    Target.SetReg(\"SP\", SP);\n//\n//    PC = Target.ReadU32(VectorTableAddr + 4);\n//    Target.SetReg(\"PC\", PC);\n//  }\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetReset\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetReset (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetReset\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetReset (void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n\n  if (VectorTableAddr == 0xFFFFFFFF) {\n    Util.Log(\"Project file error: failed to get program base\");\n  } else {\n    SP = Target.ReadU32(VectorTableAddr);\n    Target.SetReg(\"SP\", SP);\n\n    PC = Target.ReadU32(VectorTableAddr + 4);\n    Target.SetReg(\"PC\", PC);\n  }\n}\n\n/*********************************************************************\n*\n*       DebugStart\n*\n* Function description\n*   Replaces the default debug session startup routine. Optional.\n*\n**********************************************************************\n*/\n//void DebugStart (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetConnect\n*\n* Function description\n*   Replaces the default target IF connection routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\nvoid BeforeTargetConnect (void) {\n}\n\n/*********************************************************************\n*\n*       AfterTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetDownload\n*\n* Function description\n*   Replaces the default program download routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*      AfterTargetDownload\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetDownload (void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n\n  if (VectorTableAddr == 0xFFFFFFFF) {\n    Util.Log(\"Project file error: failed to get program base\");\n  } else {\n    SP = Target.ReadU32(VectorTableAddr);\n    Target.SetReg(\"SP\", SP);\n\n    PC = Target.ReadU32(VectorTableAddr + 4);\n    Target.SetReg(\"PC\", PC);\n  }\n}\n\n/*********************************************************************\n*\n*       BeforeTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetHalt\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetHalt (void) {\n//}\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52840dongle/board.cmake",
    "content": "set(MCU_VARIANT nrf52840)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52840dongle/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Nordic nRF52840 Dongle\n   url: https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52840-Dongle\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN               8\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            _PINNUM(1, 6)\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           8\n#define UART_TX_PIN           6\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52840dongle/board.mk",
    "content": "MCU_VARIANT = nrf52840\nCFLAGS += -DNRF52840_XXAA\n\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# flash using Nordic nrfutil (pip2 install nrfutil)\n# \tmake BOARD=pca10059 SERIAL=/dev/ttyACM0 all flash\nNRFUTIL = nrfutil\n\n$(BUILD)/$(PROJECT).zip: $(BUILD)/$(PROJECT).hex\n\t$(NRFUTIL) pkg generate --hw-version 52 --sd-req 0x0000 --debug-mode --application $^ $@\n\nflash: $(BUILD)/$(PROJECT).zip\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\t$(NRFUTIL) dfu usb-serial --package $^ -p $(SERIAL) -b 115200\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf52840dongle/nrf52840dongle.ld",
    "content": "/* Linker script to configure memory regions. */\n\nSEARCH_DIR(.)\n/*GROUP(-lgcc -lc -lnosys) not compatible with clang*/\n\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x1000, LENGTH = 0xff000\n  RAM (rwx) :  ORIGIN = 0x20000008, LENGTH = 0x3fff8\n}\n\n\nINCLUDE \"nrf_common.ld\"\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf5340dk/board.cmake",
    "content": "set(MCU_VARIANT nrf5340)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf5340dk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Nordic nRF5340 DK\n   url: https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF5340-DK\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN               28\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            23\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           22\n#define UART_TX_PIN           20\n\n// SPI for USB host shield\n// Pin is correct but not working probably due to signal incompatible (1.8V 3v3) with MAC3421E !?\n//#define MAX3421_SCK_PIN  _PINNUM(1, 15)\n//#define MAX3421_MOSI_PIN _PINNUM(1, 13)\n//#define MAX3421_MISO_PIN _PINNUM(1, 14)\n//#define MAX3421_CS_PIN   _PINNUM(1, 12)\n//#define MAX3421_INTR_PIN _PINNUM(1, 11)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf5340dk/board.mk",
    "content": "MCU_VARIANT = nrf5340\nCFLAGS += -DNRF5340_XXAA -DNRF5340_XXAA_APPLICATION\n\n# enable max3421 host driver for this board\nMAX3421_HOST = 1\n\n# caused by void SystemStoreFICRNS() (without void) in system_nrf5340_application.c\nCFLAGS += -Wno-error=strict-prototypes\n\n# flash using jlink\nJLINK_DEVICE = nrf5340_xxaa_app\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf5340dk/ozone/nrf5340.jdebug",
    "content": "/*********************************************************************\n*                 (c) SEGGER Microcontroller GmbH                    *\n*                      The Embedded Experts                          *\n*                         www.segger.com                             *\n**********************************************************************\n\nFile          :\nCreated       : 30 Jun 2021 13:37\nOzone Version : V3.24a\n*/\n\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n  // Dialog-generated settings\n  Project.AddSvdFile (\"$(InstallDir)/Config/CPU/Cortex-M33F.svd\");\n  Project.AddSvdFile (\"./nrf5340_application.svd\");\n  Project.SetDevice (\"nRF5340_xxAA_APP\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"16 MHz\");\n\n  Project.SetTraceSource (\"Trace Pins\");\n  Project.SetTracePortWidth (4);\n\n  // User settings\n  File.Open (\"../../../../../../examples/device/cdc_msc/cmake-build-pca10095/cdc_msc.elf\");\n}\n\n/*********************************************************************\n*\n*       OnStartupComplete\n*\n* Function description\n*   Called when program execution has reached/passed\n*   the startup completion point. Optional.\n*\n**********************************************************************\n*/\n//void OnStartupComplete (void) {\n//}\n\n/*********************************************************************\n*\n*      TargetReset\n*\n* Function description\n*   Replaces the default target device reset routine. Optional.\n*\n* Notes\n*   This example demonstrates the usage when\n*   debugging an application in RAM on a Cortex-M target device.\n*\n**********************************************************************\n*/\n//void TargetReset (void) {\n//\n//  unsigned int SP;\n//  unsigned int PC;\n//  unsigned int VectorTableAddr;\n//\n//  VectorTableAddr = Elf.GetBaseAddr();\n//  //\n//  // Set up initial stack pointer\n//  //\n//  if (VectorTableAddr != 0xFFFFFFFF) {\n//    SP = Target.ReadU32(VectorTableAddr);\n//    Target.SetReg(\"SP\", SP);\n//  }\n//  //\n//  // Set up entry point PC\n//  //\n//  PC = Elf.GetEntryPointPC();\n//\n//  if (PC != 0xFFFFFFFF) {\n//    Target.SetReg(\"PC\", PC);\n//  } else if (VectorTableAddr != 0xFFFFFFFF) {\n//    PC = Target.ReadU32(VectorTableAddr + 4);\n//    Target.SetReg(\"PC\", PC);\n//  } else {\n//    Util.Error(\"Project file error: failed to set entry point PC\", 1);\n//  }\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetReset\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetReset (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetReset\n*\n* Function description\n*   Event handler routine. Optional.\n*   The default implementation initializes SP and PC to reset values.\n**\n**********************************************************************\n*/\nvoid AfterTargetReset (void) {\n  _SetupTarget();\n}\n\n/*********************************************************************\n*\n*       DebugStart\n*\n* Function description\n*   Replaces the default debug session startup routine. Optional.\n*\n**********************************************************************\n*/\n//void DebugStart (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetConnect\n*\n* Function description\n*   Replaces the default target IF connection routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\nvoid BeforeTargetConnect (void) {\n}\n\n/*********************************************************************\n*\n*       AfterTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetDownload\n*\n* Function description\n*   Replaces the default program download routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*      AfterTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*   The default implementation initializes SP and PC to reset values.\n*\n**********************************************************************\n*/\nvoid AfterTargetDownload (void) {\n  _SetupTarget();\n}\n\n/*********************************************************************\n*\n*       BeforeTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetHalt\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetHalt (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetResume\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetResume (void) {\n//}\n\n/*********************************************************************\n*\n*       OnSnapshotLoad\n*\n* Function description\n*   Called upon loading a snapshot. Optional.\n*\n* Additional information\n*   This function is used to restore the target state in cases\n*   where values cannot simply be written to the target.\n*   Typical use: GPIO clock needs to be enabled, before\n*   GPIO is configured.\n*\n**********************************************************************\n*/\n//void OnSnapshotLoad (void) {\n//}\n\n/*********************************************************************\n*\n*       OnSnapshotSave\n*\n* Function description\n*   Called upon saving a snapshot. Optional.\n*\n* Additional information\n*   This function is usually used to save values of the target\n*   state which can either not be trivially read,\n*   or need to be restored in a specific way or order.\n*   Typically use: Memory Mapped Registers,\n*   such as PLL and GPIO configuration.\n*\n**********************************************************************\n*/\n//void OnSnapshotSave (void) {\n//}\n\n/*********************************************************************\n*\n*       OnError\n*\n* Function description\n*   Called when an error occurred. Optional.\n*\n**********************************************************************\n*/\n//void OnError (void) {\n//}\n\n/*********************************************************************\n*\n*       _SetupTarget\n*\n* Function description\n*   Setup the target.\n*   Called by AfterTargetReset() and AfterTargetDownload().\n*\n*   Auto-generated function. May be overridden by Ozone.\n*\n**********************************************************************\n*/\nvoid _SetupTarget(void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n  //\n  // Set up initial stack pointer\n  //\n  SP = Target.ReadU32(VectorTableAddr);\n  if (SP != 0xFFFFFFFF) {\n    Target.SetReg(\"SP\", SP);\n  }\n  //\n  // Set up entry point PC\n  //\n  PC = Elf.GetEntryPointPC();\n  if (PC != 0xFFFFFFFF) {\n    Target.SetReg(\"PC\", PC);\n  } else {\n    Util.Error(\"Project script error: failed to set up entry point PC\", 1);\n  }\n}\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf54h20dk/board.cmake",
    "content": "set(MCU_VARIANT nrf54h20)\n\nfunction(update_board TARGET)\n  # temporarily, 54h20 has multiple sram sections\n  target_compile_definitions(${TARGET} PUBLIC\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\n  target_sources(${TARGET} PRIVATE\n#    ${NRFX_PATH}/drivers/src/nrfx_usbreg.c\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf54h20dk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Nordic nRF54H20 DK\n   url: https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF5340-DK\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN               28\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            23\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           22\n#define UART_TX_PIN           20\n\n// SPI for USB host shield\n// Pin is correct but not working probably due to signal incompatible (1.8V 3v3) with MAC3421E !?\n//#define MAX3421_SCK_PIN  _PINNUM(1, 15)\n//#define MAX3421_MOSI_PIN _PINNUM(1, 13)\n//#define MAX3421_MISO_PIN _PINNUM(1, 14)\n//#define MAX3421_CS_PIN   _PINNUM(1, 12)\n//#define MAX3421_INTR_PIN _PINNUM(1, 11)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/nrf/boards/nrf54h20dk/board.mk",
    "content": "MCU_VARIANT = nrf54h20\nCFLAGS += -DNRF54H20_XXAA\n\n# enable max3421 host driver for this board\nMAX3421_HOST = 1\n\n# caused by void SystemStoreFICRNS() (without void) in system_nrf5340_application.c\nCFLAGS += -Wno-error=strict-prototypes\n\n# flash using jlink\nJLINK_DEVICE = nrf5340_xxaa_app\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/nrf/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Nordic Semiconductor\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#pragma GCC diagnostic ignored \"-Wcast-align\"\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#pragma GCC diagnostic ignored \"-Wunused-variable\"\n#pragma GCC diagnostic ignored \"-Wundef\"\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\n#include \"nrfx.h\"\n#include \"hal/nrf_gpio.h\"\n#include \"nrfx_gpiote.h\"\n#if !defined(NRF54H20_XXAA)\n#include \"nrfx_power.h\"\n#endif\n#include \"nrfx_uarte.h\"\n#include \"nrfx_spim.h\"\n\n#ifdef SOFTDEVICE_PRESENT\n#include \"nrf_sdm.h\"\n#include \"nrf_soc.h\"\n#endif\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n// example only supports nrfx v3 for code simplicity\n#if !(defined(NRFX_CONFIG_API_VER_MAJOR) && NRFX_CONFIG_API_VER_MAJOR >= 3) && \\\n    !(85301 >= (10000*MDK_MAJOR_VERSION + 100*MDK_MINOR_VERSION + MDK_MICRO_VERSION))\n  #error \"Example requires nrfx v3.0.0 or later\"\n#endif\n\n\n/*------------------------------------------------------------------*/\n/* MACRO TYPEDEF CONSTANT ENUM\n *------------------------------------------------------------------*/\n\n// Value is chosen to be as same as NRFX_POWER_USB_EVT_* in nrfx_power.h\nenum {\n  USB_EVT_DETECTED = 0,\n  USB_EVT_REMOVED = 1,\n  USB_EVT_READY = 2\n};\n\n// Forward USB interrupt events to TinyUSB IRQ Handler\n#if defined(NRF54H20_XXAA)\n#define USBD_IRQn  USBHS_IRQn\nvoid USBHS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nstatic nrfx_uarte_t _uart_id = NRFX_UARTE_INSTANCE(120);\n\n#else\n\n#ifdef NRF5340_XXAA\n#define LFCLK_SRC_RC CLOCK_LFCLKSRC_SRC_LFRC\n#define VBUSDETECT_Msk USBREG_USBREGSTATUS_VBUSDETECT_Msk\n#define OUTPUTRDY_Msk USBREG_USBREGSTATUS_OUTPUTRDY_Msk\n#define GPIOTE_IRQn GPIOTE1_IRQn\n#else\n#define LFCLK_SRC_RC CLOCK_LFCLKSRC_SRC_RC\n#define VBUSDETECT_Msk POWER_USBREGSTATUS_VBUSDETECT_Msk\n#define OUTPUTRDY_Msk POWER_USBREGSTATUS_OUTPUTRDY_Msk\n#endif\n\n#if CFG_TUSB_OS != OPT_OS_ZEPHYR\nstatic nrfx_uarte_t _uart_id = NRFX_UARTE_INSTANCE(0);\n#endif\n\nvoid USBD_IRQHandler(void) {\n  tud_int_handler(0);\n}\n#endif\n\n\n// tinyusb function that handles power event (detected, ready, removed)\n// We must call it within SD's SOC event handler, or set it as power event handler if SD is not enabled.\nextern void tusb_hal_nrf_power_event(uint32_t event);\n\n#if !defined(NRF54H20_XXAA)\n// nrf power callback, could be unused if SD is enabled or usb is disabled (board_test example)\nTU_ATTR_UNUSED static void power_event_handler(nrfx_power_usb_evt_t event) {\n  tusb_hal_nrf_power_event((uint32_t) event);\n}\n#endif\n\n//------------- Host using MAX2341E -------------//\n#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\nstatic void max3421_init(void);\nstatic nrfx_spim_t _spi = NRFX_SPIM_INSTANCE(1);\nstatic nrfx_gpiote_t _gpiote = NRFX_GPIOTE_INSTANCE(0);\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nvoid board_init(void) {\n#if !defined(NRF54H20_XXAA)\n  // stop LF clock just in case we jump from application without reset\n  NRF_CLOCK->TASKS_LFCLKSTOP = 1UL;\n\n  // Use Internal OSC to compatible with all boards\n  NRF_CLOCK->LFCLKSRC = LFCLK_SRC_RC;\n  NRF_CLOCK->TASKS_LFCLKSTART = 1UL;\n#endif\n\n  // LED\n  nrf_gpio_cfg_output(LED_PIN);\n  board_led_write(false);\n\n  // Button\n  nrf_gpio_cfg_input(BUTTON_PIN, NRF_GPIO_PIN_PULLUP);\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#elif CFG_TUSB_OS == OPT_OS_ZEPHYR\n  #ifdef CONFIG_HAS_HW_NRF_USBREG\n  // IRQ_CONNECT(USBREGULATOR_IRQn, DT_IRQ(DT_INST(0, nordic_nrf_clock), priority), nrfx_isr, nrfx_usbreg_irq_handler, 0);\n  // irq_enable(USBREGULATOR_IRQn);\n  #endif\n\n  /* USB device controller access from devicetree */\n  #define DT_DRV_COMPAT nordic_nrf_usbd\n  IRQ_CONNECT(DT_INST_IRQN(0), DT_INST_IRQ(0, priority), nrfx_isr, USBD_IRQHandler, 0);\n  irq_enable(DT_INST_IRQN(0));\n#endif\n\n#if CFG_TUSB_OS != OPT_OS_ZEPHYR\n  // UART\n  nrfx_uarte_config_t uart_cfg = {\n      .txd_pin   = UART_TX_PIN,\n      .rxd_pin   = UART_RX_PIN,\n      .rts_pin   = NRF_UARTE_PSEL_DISCONNECTED,\n      .cts_pin   = NRF_UARTE_PSEL_DISCONNECTED,\n      .p_context = NULL,\n      .baudrate  = NRF_UARTE_BAUDRATE_115200, // CFG_BOARD_UART_BAUDRATE\n      .interrupt_priority = 7,\n      .config = {\n          .hwfc      = NRF_UARTE_HWFC_DISABLED,\n          .parity    = NRF_UARTE_PARITY_EXCLUDED,\n      }\n  };\n\n  nrfx_uarte_init(&_uart_id, &uart_cfg, NULL);\n#endif\n\n  //------------- USB -------------//\n#if CFG_TUD_ENABLED\n  // Priorities 0, 1, 4 (nRF52) are reserved for SoftDevice\n  // 2 is highest for application\n  NVIC_SetPriority(USBD_IRQn, 2);\n\n#if !defined(NRF54H20_XXAA)\n  // USB power may already be ready at this time -> no event generated\n  // We need to invoke the handler based on the status initially\n  uint32_t usb_reg;\n\n#ifdef SOFTDEVICE_PRESENT\n  uint8_t sd_en = false;\n  sd_softdevice_is_enabled(&sd_en);\n\n  if ( sd_en ) {\n    sd_power_usbdetected_enable(true);\n    sd_power_usbpwrrdy_enable(true);\n    sd_power_usbremoved_enable(true);\n\n    sd_power_usbregstatus_get(&usb_reg);\n  }else\n#endif\n  {\n    // Power module init\n    const nrfx_power_config_t pwr_cfg = {0};\n    nrfx_power_init(&pwr_cfg);\n\n    // Register tusb function as USB power handler\n    // cause cast-function-type warning\n    const nrfx_power_usbevt_config_t config = {.handler = power_event_handler};\n    nrfx_power_usbevt_init(&config);\n    nrfx_power_usbevt_enable();\n\n    // USB power may already be ready at this time -> no event generated\n    // We need to invoke the handler based on the status initially\n#ifdef NRF5340_XXAA\n    usb_reg = NRF_USBREGULATOR->USBREGSTATUS;\n#else\n    usb_reg = NRF_POWER->USBREGSTATUS;\n#endif\n  }\n\n  if ( usb_reg & VBUSDETECT_Msk ) {\n    tusb_hal_nrf_power_event(USB_EVT_DETECTED);\n  }\n  if ( usb_reg & OUTPUTRDY_Msk  ) {\n    tusb_hal_nrf_power_event(USB_EVT_READY);\n  }\n#endif\n#endif\n\n#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\n  max3421_init();\n#endif\n\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\nvoid board_led_write(bool state) {\n  nrf_gpio_pin_write(LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == nrf_gpio_pin_read(BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n\n#if defined(NRF54H20_XXAA)\n  uintptr_t did_addr = (uintptr_t) NRF_FICR->BLE.ADDR;\n#elif defined(NRF5340_XXAA)\n  uintptr_t did_addr = (uintptr_t) NRF_FICR->INFO.DEVICEID;\n#else\n  uintptr_t did_addr = (uintptr_t) NRF_FICR->DEVICEID;\n#endif\n\n  const uint8_t* device_id = (const uint8_t*) did_addr;\n  for(uint8_t i=0; i<8; i++) {\n    id[i] = device_id[i];\n  }\n  return 8;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n//  nrfx_err_t err = nrfx_uarte_rx(&_uart_id, buf, (size_t) len);\n//  return NRFX_SUCCESS == err ? len : 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n#if CFG_TUSB_OS == OPT_OS_ZEPHYR\n  (void) buf;\n  return len;\n#else\n  nrfx_err_t err = nrfx_uarte_tx(&_uart_id, (uint8_t const*) buf, (size_t) len ,0);\n  return (NRFX_SUCCESS == err) ? len : 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\n#ifndef __ICCARM__\n// Implement _start() since we use linker flag '-nostartfiles'.\n// Requires defined __STARTUP_CLEAR_BSS,\nextern int main(void);\nTU_ATTR_UNUSED void _start(void) {\n  // called by startup code\n  main();\n  while (1) {}\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Softdevice running\n//--------------------------------------------------------------------+\n#ifdef SOFTDEVICE_PRESENT\n// process SOC event from SD\nuint32_t proc_soc(void) {\n  uint32_t soc_evt;\n  uint32_t err = sd_evt_get(&soc_evt);\n\n  if (NRF_SUCCESS == err)\n  {\n    /*------------- usb power event handler -------------*/\n    int32_t usbevt = (soc_evt == NRF_EVT_POWER_USB_DETECTED   ) ? NRFX_POWER_USB_EVT_DETECTED:\n                     (soc_evt == NRF_EVT_POWER_USB_POWER_READY) ? NRFX_POWER_USB_EVT_READY   :\n                     (soc_evt == NRF_EVT_POWER_USB_REMOVED    ) ? NRFX_POWER_USB_EVT_REMOVED : -1;\n\n    if ( usbevt >= 0) tusb_hal_nrf_power_event(usbevt);\n  }\n\n  return err;\n}\n\nuint32_t proc_ble(void) {\n  // do nothing with ble\n  return NRF_ERROR_NOT_FOUND;\n}\n\nvoid SD_EVT_IRQHandler(void) {\n  // process BLE and SOC until there is no more events\n  while( (NRF_ERROR_NOT_FOUND != proc_ble()) || (NRF_ERROR_NOT_FOUND != proc_soc()) ) {\n  }\n}\n\nvoid nrf_error_cb(uint32_t id, uint32_t pc, uint32_t info) {\n  (void) id;\n  (void) pc;\n  (void) info;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// API: SPI transfer with MAX3421E, must be implemented by application\n//--------------------------------------------------------------------+\n#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\nvoid max3421_int_handler(nrfx_gpiote_pin_t pin, nrfx_gpiote_trigger_t action, void* p_context) {\n  (void) p_context;\n  if (action != NRFX_GPIOTE_TRIGGER_HITOLO) {\n    return;\n  }\n  if (pin != MAX3421_INTR_PIN) {\n    return;\n  }\n\n  tusb_int_handler(1, true);\n}\n\nstatic void max3421_init(void) {\n  // Somehow pca10056/95 is not working probably due to signal incompatible (1.8V 3v3) with MAC3421E !?\n\n  // manually manage CS\n  nrf_gpio_cfg_output(MAX3421_CS_PIN);\n  nrf_gpio_pin_write(MAX3421_CS_PIN, 1);\n\n  // USB host using max3421e usb controller via SPI\n  nrfx_spim_config_t cfg = {\n      .sck_pin        = MAX3421_SCK_PIN,\n      .mosi_pin       = MAX3421_MOSI_PIN,\n      .miso_pin       = MAX3421_MISO_PIN,\n      .ss_pin         = NRF_SPIM_PIN_NOT_CONNECTED,\n      .frequency      = 4000000u,\n      .ss_active_high = false,\n      .irq_priority   = 3,\n      .orc            = 0xFF,\n      // default setting 4 Mhz, Mode 0, MSB first\n      .mode           = NRF_SPIM_MODE_0,\n      .bit_order      = NRF_SPIM_BIT_ORDER_MSB_FIRST,\n      .miso_pull      = NRF_GPIO_PIN_NOPULL,\n  };\n\n  // no handler --> blocking\n  TU_ASSERT(NRFX_SUCCESS == nrfx_spim_init(&_spi, &cfg, NULL, NULL), );\n\n  // max3421e interrupt pin\n  nrf_gpio_pin_pull_t intr_pull = NRF_GPIO_PIN_PULLUP;\n  nrfx_gpiote_trigger_config_t intr_trigger = {\n      .trigger = NRFX_GPIOTE_TRIGGER_HITOLO,\n      .p_in_channel = NULL, // sensing mechanism\n  };\n  nrfx_gpiote_handler_config_t intr_handler = {\n      .handler = max3421_int_handler,\n      .p_context = NULL,\n  };\n  nrfx_gpiote_input_pin_config_t intr_config = {\n      .p_pull_config = &intr_pull,\n      .p_trigger_config = &intr_trigger,\n      .p_handler_config = &intr_handler,\n  };\n\n  nrfx_gpiote_init(&_gpiote, 1);\n  NVIC_SetPriority(GPIOTE_IRQn, 2);\n\n  nrfx_gpiote_input_configure(&_gpiote, MAX3421_INTR_PIN, &intr_config);\n  nrfx_gpiote_trigger_enable(&_gpiote, MAX3421_INTR_PIN, true);\n}\n\n// API to enable/disable MAX3421 INTR pin interrupt\nvoid tuh_max3421_int_api(uint8_t rhport, bool enabled) {\n  (void) rhport;\n\n  // use NVIC_Enable/Disable instead since nrfx_gpiote_trigger_enable/disable clear pending and can miss interrupt\n  // when disabled and re-enabled.\n  if (enabled) {\n    NVIC_EnableIRQ(GPIOTE_IRQn);\n  } else {\n    NVIC_DisableIRQ(GPIOTE_IRQn);\n  }\n}\n\n// API to control MAX3421 SPI CS\nvoid tuh_max3421_spi_cs_api(uint8_t rhport, bool active) {\n  (void) rhport;\n  nrf_gpio_pin_write(MAX3421_CS_PIN, active ? 0 : 1);\n}\n\n// API to transfer data with MAX3421 SPI\n// Either tx_buf or rx_buf can be NULL, which means transfer is write or read only\nbool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const* tx_buf, uint8_t* rx_buf, size_t xfer_bytes) {\n  (void) rhport;\n\n  nrfx_spim_xfer_desc_t xfer = {\n      .p_tx_buffer = tx_buf,\n      .tx_length   = tx_buf ? xfer_bytes : 0,\n      .p_rx_buffer = rx_buf,\n      .rx_length   = rx_buf ? xfer_bytes : 0,\n  };\n\n  return nrfx_spim_xfer(&_spi, &xfer, 0) == NRFX_SUCCESS;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nrf/family.cmake",
    "content": "include_guard()\n\nset(NRFX_PATH ${TOP}/hw/mcu/nordic/nrfx)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# include board specific, for zephyr BOARD_ALIAS may be used instead\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake OPTIONAL RESULT_VARIABLE board_cmake_included)\nif (NOT board_cmake_included)\n  include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD_ALIAS}/board.cmake)\nendif ()\n\n# toolchain set up\nif (MCU_VARIANT STREQUAL nrf5340 OR MCU_VARIANT STREQUAL nrf54h20)\n  set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\n  set(JLINK_DEVICE ${MCU_VARIANT}_xxaa_app)\nelse ()\n  set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\n  set(JLINK_DEVICE ${MCU_VARIANT}_xxaa)\nendif ()\n\nif (MCU_VARIANT STREQUAL \"nrf54h20\")\n  set(FAMILY_MCUS NRF54 CACHE INTERNAL \"\")\nelse ()\n  set(FAMILY_MCUS NRF5X CACHE INTERNAL \"\")\nendif ()\n\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (MCU_VARIANT STREQUAL nrf54h20)\n  set(LD_FILE_GNU_DEFAULT ${CMAKE_CURRENT_LIST_DIR}/linker/${MCU_VARIANT}_xxaa_application.ld)\n  set(STARTUP_FILE_GNU ${NRFX_PATH}/mdk/gcc_startup_${MCU_VARIANT}_application.S)\nelseif (MCU_VARIANT STREQUAL nrf5340)\n  set(LD_FILE_GNU_DEFAULT ${CMAKE_CURRENT_LIST_DIR}/linker/${MCU_VARIANT}_xxaa_application.ld)\n  set(STARTUP_FILE_GNU ${NRFX_PATH}/mdk/gcc_startup_${MCU_VARIANT}_application.S)\nelse()\n  set(LD_FILE_GNU_DEFAULT ${CMAKE_CURRENT_LIST_DIR}/linker/${MCU_VARIANT}_xxaa.ld)\n  set(STARTUP_FILE_GNU ${NRFX_PATH}/mdk/gcc_startup_${MCU_VARIANT}.S)\nendif ()\n\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${LD_FILE_GNU_DEFAULT})\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${NRFX_PATH}/helpers/nrfx_flag32_allocator.c\n    ${NRFX_PATH}/drivers/src/nrfx_gpiote.c\n    ${NRFX_PATH}/drivers/src/nrfx_power.c\n    ${NRFX_PATH}/drivers/src/nrfx_spim.c\n    ${NRFX_PATH}/drivers/src/nrfx_uarte.c\n    ${NRFX_PATH}/soc/nrfx_atomic.c\n    )\n\n  if (MCU_VARIANT STREQUAL nrf54h20)\n    target_sources(${BOARD_TARGET} PRIVATE\n      ${NRFX_PATH}/mdk/system_nrf54h.c\n    )\n  elseif (MCU_VARIANT STREQUAL nrf5340)\n    target_sources(${BOARD_TARGET} PRIVATE\n      ${NRFX_PATH}/mdk/system_${MCU_VARIANT}_application.c\n      ${NRFX_PATH}/drivers/src/nrfx_usbreg.c\n      )\n    target_compile_definitions(${BOARD_TARGET} PUBLIC NRF5340_XXAA_APPLICATION)\n  else()\n    target_sources(${BOARD_TARGET} PRIVATE\n      ${NRFX_PATH}/mdk/system_${MCU_VARIANT}.c\n      )\n  endif ()\n\n  string(TOUPPER ${MCU_VARIANT} MCU_VARIANT_UPPER)\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __STARTUP_CLEAR_BSS\n    CONFIG_GPIO_AS_PINRESET\n    ${MCU_VARIANT_UPPER}_XXAA\n    NRF_APPLICATION\n    )\n\n  if (TRACE_ETM STREQUAL \"1\")\n    # ENABLE_TRACE will cause system_nrf5x.c to set up ETM trace\n    target_compile_definitions(${BOARD_TARGET} PUBLIC ENABLE_TRACE)\n  endif ()\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/nrfx_config\n    ${NRFX_PATH}\n    ${NRFX_PATH}/mdk\n    ${NRFX_PATH}/drivers/include\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\n\n#function(family_flash_adafruit_nrfutil TARGET)\n#  add_custom_target(${TARGET}-adafruit-nrfutil\n#    DEPENDS ${TARGET}\n#    COMMAND adafruit-nrfutil --verbose dfu serial --package $^ -p /dev/ttyACM0 -b 115200 --singlebank --touch 1200\n#    )\n#endfunction()\n\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${FAMILY_MCUS})\n\n  target_sources(${TARGET} PRIVATE\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nordic/nrf5x/dcd_nrf5x.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (RTOS STREQUAL zephyr)\n    target_include_directories(${TARGET} PUBLIC ${ZEPHYR_HAL_NORDIC_MODULE_DIR}/nrfx/bsp/stable/mdk)\n  else ()\n    target_sources(${TARGET} PRIVATE ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}})\n\n    if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n      target_link_options(${TARGET} PUBLIC\n        \"LINKER:--script=${LD_FILE_GNU}\"\n        -L${NRFX_PATH}/mdk\n        --specs=nosys.specs --specs=nano.specs\n        -nostartfiles\n        )\n    elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n      target_link_options(${TARGET} PUBLIC\n        \"LINKER:--script=${LD_FILE_GNU}\"\n        -L${NRFX_PATH}/mdk\n        )\n    elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n      target_link_options(${TARGET} PUBLIC\n        \"LINKER:--config=${LD_FILE_IAR}\"\n        )\n    endif ()\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  #  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #  family_flash_adafruit_nrfutil(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nrf/family.mk",
    "content": "UF2_FAMILY_ID = 0xADA52840\n\nNRFX_PATH = hw/mcu/nordic/nrfx\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nifeq (${MCU_VARIANT},nrf54h20)\n\tCPU_CORE = cortex-m33\n\tCFLAGS += -DCFG_TUSB_MCU=OPT_MCU_NRF54\n\tLD_FILE_DEFAULT = ${FAMILY_PATH}/linker/${MCU_VARIANT}_xxaa_application.ld\n\tSRC_C += ${NRFX_PATH}/mdk/system_nrf54h.c\n\tSRC_S += ${NRFX_PATH}/mdk/gcc_startup_$(MCU_VARIANT)_application.S\n\tJLINK_DEVICE ?= $(MCU_VARIANT)_xxaa_app\n\nelse\nifeq (${MCU_VARIANT},nrf5340)\n\tCPU_CORE = cortex-m33\n\tCFLAGS += -DCFG_TUSB_MCU=OPT_MCU_NRF5X\n\tLD_FILE_DEFAULT = ${FAMILY_PATH}/linker/${MCU_VARIANT}_xxaa_application.ld\n\tSRC_C += ${NRFX_PATH}/mdk/system_$(MCU_VARIANT)_application.c \\\n\t\t\t\t\t ${NRFX_PATH}/drivers/src/nrfx_usbreg.c\n\tSRC_S += ${NRFX_PATH}/mdk/gcc_startup_$(MCU_VARIANT)_application.S\n  JLINK_DEVICE ?= $(MCU_VARIANT)_xxaa_app\n\nelse\n\n\tCPU_CORE = cortex-m4\n\tCFLAGS += -DCFG_TUSB_MCU=OPT_MCU_NRF5X\n\tLD_FILE_DEFAULT = ${FAMILY_PATH}/linker/${MCU_VARIANT}_xxaa.ld\n\tSRC_C += ${NRFX_PATH}/mdk/system_$(MCU_VARIANT).c\n\tSRC_S += ${NRFX_PATH}/mdk/gcc_startup_$(MCU_VARIANT).S\n\tJLINK_DEVICE ?= $(MCU_VARIANT)_xxaa\nendif\nendif\n\nCFLAGS += \\\n  -DNRF_APPLICATION \\\n  -DCONFIG_GPIO_AS_PINRESET \\\n  -D__STARTUP_CLEAR_BSS\n\n#CFLAGS += -nostdlib\n#CFLAGS += -D__START=main\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += \\\n  -flto \\\n  -Wno-error=undef \\\n  -Wno-error=unused-parameter \\\n  -Wno-error=unused-variable \\\n  -Wno-error=cast-align \\\n  -Wno-error=cast-qual \\\n  -Wno-error=redundant-decls \\\n\nLDFLAGS_GCC += \\\n  -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs \\\n  -L$(TOP)/${NRFX_PATH}/mdk\n\nLDFLAGS_CLANG += \\\n  -L$(TOP)/${NRFX_PATH}/mdk \\\n\nifndef LD_FILE\nLD_FILE = ${LD_FILE_DEFAULT}\nendif\n\nSRC_C += \\\n  src/portable/nordic/nrf5x/dcd_nrf5x.c \\\n  src/portable/synopsys/dwc2/dwc2_common.c \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\t${NRFX_PATH}/helpers/nrfx_flag32_allocator.c \\\n\t${NRFX_PATH}/drivers/src/nrfx_gpiote.c \\\n  ${NRFX_PATH}/drivers/src/nrfx_power.c \\\n  ${NRFX_PATH}/drivers/src/nrfx_spim.c \\\n  ${NRFX_PATH}/drivers/src/nrfx_uarte.c \\\n  ${NRFX_PATH}/soc/nrfx_atomic.c\n\nINC += \\\n  $(TOP)/$(BOARD_PATH) \\\n  $(TOP)/$(FAMILY_PATH)/nrfx_config \\\n  $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n  $(TOP)/${NRFX_PATH} \\\n  $(TOP)/${NRFX_PATH}/mdk \\\n  $(TOP)/${NRFX_PATH}/hal \\\n  $(TOP)/${NRFX_PATH}/drivers/include \\\n  $(TOP)/${NRFX_PATH}/drivers/src \\\n\nASFLAGS += -D__HEAP_SIZE=0\n"
  },
  {
    "path": "hw/bsp/nrf/linker/nrf52833_xxaa.ld",
    "content": "/* Linker script to configure memory regions. */\n\nSEARCH_DIR(.)\n/*GROUP(-lgcc -lc -lnosys) not compatible with clang*/\n\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x80000\n  RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x20000\n  CODE_RAM (rwx) : ORIGIN = 0x800000, LENGTH = 0x20000\n}\n\n\nINCLUDE \"nrf_common.ld\"\n"
  },
  {
    "path": "hw/bsp/nrf/linker/nrf52840_s140_v6.ld",
    "content": "/* Linker script to configure memory regions. */\n\nSEARCH_DIR(.)\n/*GROUP(-lgcc -lc -lnosys) not compatible with clang*/\n\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x26000, LENGTH = 0xED000 - 0x26000\n\n  /* SRAM required by S132 depend on\n   * - Attribute Table Size\n   * - Vendor UUID count\n   * - Max ATT MTU\n   * - Concurrent connection peripheral + central + secure links\n   * - Event Len, HVN queue, Write CMD queue\n   */\n  RAM (rwx) : ORIGIN = 0x20003400, LENGTH = 0x20040000 - 0x20003400\n}\n\nSECTIONS\n{\n  . = ALIGN(4);\n  .svc_data :\n  {\n    PROVIDE(__start_svc_data = .);\n    KEEP(*(.svc_data))\n    PROVIDE(__stop_svc_data = .);\n  } > RAM\n\n  .fs_data :\n  {\n    PROVIDE(__start_fs_data = .);\n    KEEP(*(.fs_data))\n    PROVIDE(__stop_fs_data = .);\n  } > RAM\n} INSERT AFTER .data;\n\nINCLUDE \"nrf_common.ld\"\n"
  },
  {
    "path": "hw/bsp/nrf/linker/nrf52840_xxaa.ld",
    "content": "/* Linker script to configure memory regions. */\n\nSEARCH_DIR(.)\n/*GROUP(-lgcc -lc -lnosys) not compatible with clang*/\n\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x100000\n  EXTFLASH (rx) : ORIGIN = 0x12000000, LENGTH = 0x8000000\n  RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000\n  CODE_RAM (rwx) : ORIGIN = 0x800000, LENGTH = 0x40000\n}\n\nINCLUDE \"nrf_common.ld\"\n"
  },
  {
    "path": "hw/bsp/nrf/linker/nrf5340_xxaa_application.ld",
    "content": "/* Linker script to configure memory regions. */\n\nSEARCH_DIR(.)\n/*GROUP(-lgcc -lc) not compatible with clang*/\n\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x100000\n  EXTFLASH (rx) : ORIGIN = 0x10000000, LENGTH = 0x8000000\n  RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x40000\n  RAM1 (rwx) : ORIGIN = 0x20040000, LENGTH = 0x3F000\n}\n\n\nINCLUDE \"nrf_common.ld\"\n"
  },
  {
    "path": "hw/bsp/nrf/linker/nrf54h20_xxaa_application.ld",
    "content": "/* Linker script to configure memory regions. */\n\nSEARCH_DIR(.)\n/*GROUP(-lgcc -lc) not compatible with clang*/\n\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0xE0A0000, LENGTH = 0x40000 /* Inside global MRAM0 */\n  FLASH1 (rx) : ORIGIN = 0x2F840000, LENGTH = 0x4000 /* OTP0 */\n  EXTFLASH (rx) : ORIGIN = 0x70000000, LENGTH = 0x20000000\n  RAM (rwx) : ORIGIN = 0x22000000, LENGTH = 0x8000\n  RAM1 (rwx) : ORIGIN = 0x2F000000, LENGTH = 0x80000 /* RAM00 */\n  RAM2 (rwx) : ORIGIN = 0x2F080000, LENGTH = 0x60000 /* RAM01 */\n  RAM3 (rwx) : ORIGIN = 0x2F880000, LENGTH = 0x10000 /* RAM20 */\n  RAM4 (rwx) : ORIGIN = 0x2F890000, LENGTH = 0x8000 /* RAM21 */\n  RAM5 (rwx) : ORIGIN = 0x2FC00000, LENGTH = 0x4000 /* RAM30 (low-speed) */\n  RAM6 (rwx) : ORIGIN = 0x2FC04000, LENGTH = 0x4000 /* RAM31 (low-speed) */\n}\n\n\nINCLUDE \"nrf_common.ld\"\n"
  },
  {
    "path": "hw/bsp/nrf/nrfx_config/nrfx_config.h",
    "content": "/*\n * Copyright (c) 2019 - 2025, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\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 * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef NRFX_CONFIG_H__\n#define NRFX_CONFIG_H__\n\n#include \"nrfx_config_common.h\"\n\n#if defined(NRF51)\n    #include <templates/nrfx_config_nrf51.h>\n#elif defined(NRF52805_XXAA)\n    #include <templates/nrfx_config_nrf52805.h>\n#elif defined(NRF52810_XXAA)\n    #include <templates/nrfx_config_nrf52810.h>\n#elif defined(NRF52811_XXAA)\n    #include <templates/nrfx_config_nrf52811.h>\n#elif defined(NRF52820_XXAA)\n    #include <templates/nrfx_config_nrf52820.h>\n#elif defined(NRF52832_XXAA) || defined (NRF52832_XXAB)\n    #include <templates/nrfx_config_nrf52832.h>\n#elif defined(NRF52833_XXAA)\n    #include <templates/nrfx_config_nrf52833.h>\n#elif defined(NRF52840_XXAA)\n    #include <templates/nrfx_config_nrf52840.h>\n#elif defined(NRF5340_XXAA_APPLICATION)\n    #include <templates/nrfx_config_nrf5340_application.h>\n#elif defined(NRF5340_XXAA_NETWORK)\n    #include <templates/nrfx_config_nrf5340_network.h>\n#elif defined(NRF54H20_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf54h20_application.h>\n#elif defined(NRF54H20_XXAA) && defined(NRF_RADIOCORE)\n    #include <templates/nrfx_config_nrf54h20_radiocore.h>\n#elif defined(NRF54H20_XXAA) && defined(NRF_PPR)\n    #include <templates/nrfx_config_nrf54h20_ppr.h>\n#elif defined(NRF54H20_XXAA) && defined(NRF_FLPR)\n    #include <templates/nrfx_config_nrf54h20_flpr.h>\n#elif defined(NRF54L05_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf54l05_application.h>\n#elif defined(NRF54L05_XXAA) && defined(NRF_FLPR)\n    #include <templates/nrfx_config_nrf54l05_flpr.h>\n#elif defined(NRF54L10_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf54l10_application.h>\n#elif defined(NRF54L10_XXAA) && defined(NRF_FLPR)\n    #include <templates/nrfx_config_nrf54l10_flpr.h>\n#elif defined(NRF54L15_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf54l15_application.h>\n#elif defined(NRF54L15_XXAA) && defined(NRF_FLPR)\n    #include <templates/nrfx_config_nrf54l15_flpr.h>\n#elif defined(NRF54LM20A_ENGA_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf54lm20a_enga_application.h>\n#elif defined(NRF54LM20A_ENGA_XXAA) && defined(NRF_FLPR)\n    #include <templates/nrfx_config_nrf54lm20a_enga_flpr.h>\n#elif defined(NRF54LS05B_ENGA_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf54ls05b_application.h>\n#elif defined(NRF54LV10A_ENGA_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf54lv10a_enga_application.h>\n#elif defined(NRF54LV10A_ENGA_XXAA) && defined(NRF_FLPR)\n    #include <templates/nrfx_config_nrf54lv10a_enga_flpr.h>\n#elif defined(NRF7120_ENGA_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf7120_application.h>\n#elif defined(NRF7120_ENGA_XXAA) && defined(NRF_FLPR)\n    #include <templates/nrfx_config_nrf7120_flpr.h>\n#elif defined(NRF7120_ENGA_XXAA) && defined(NRF_LMAC)\n    #include <templates/nrfx_config_nrf7120_lmac.h>\n#elif defined(NRF7120_ENGA_XXAA) && defined(NRF_UMAC)\n    #include <templates/nrfx_config_nrf7120_umac.h>\n#elif defined(NRF9120_XXAA) || defined(NRF9160_XXAA)\n    #include <templates/nrfx_config_nrf91.h>\n#elif defined(NRF9230_ENGB_XXAA) && defined(NRF_APPLICATION)\n    #include <templates/nrfx_config_nrf9230_engb_application.h>\n#elif defined(NRF9230_ENGB_XXAA) && defined(NRF_RADIOCORE)\n    #include <templates/nrfx_config_nrf9230_engb_radiocore.h>\n#elif defined(NRF9230_ENGB_XXAA) && defined(NRF_PPR)\n    #include <templates/nrfx_config_nrf9230_engb_ppr.h>\n#elif defined(NRF9230_ENGB_XXAA) && defined(NRF_FLPR)\n    #include <templates/nrfx_config_nrf9230_engb_flpr.h>\n#else\n    #include \"nrfx_config_ext.h\"\n#endif\n\n#endif // NRFX_CONFIG_H__\n"
  },
  {
    "path": "hw/bsp/nrf/nrfx_config/nrfx_config_common.h",
    "content": "/*\n * Copyright (c) 2022 - 2025, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\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 * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef NRFX_CONFIG_COMMON_H__\n#define NRFX_CONFIG_COMMON_H__\n\n#ifndef NRFX_CONFIG_H__\n#error \"This file should not be included directly. Include nrfx_config.h instead.\"\n#endif\n\n/** @brief Symbol specifying major version of the nrfx API to be used. */\n#ifndef NRFX_CONFIG_API_VER_MAJOR\n#define NRFX_CONFIG_API_VER_MAJOR 3\n#endif\n\n/** @brief Symbol specifying minor version of the nrfx API to be used. */\n#ifndef NRFX_CONFIG_API_VER_MINOR\n#define NRFX_CONFIG_API_VER_MINOR 12\n#endif\n\n/** @brief Symbol specifying micro version of the nrfx API to be used. */\n#ifndef NRFX_CONFIG_API_VER_MICRO\n#define NRFX_CONFIG_API_VER_MICRO 0\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n#define NRFX_CLOCK_ENABLED   0\n#define NRFX_UARTE_ENABLED   1\n\n#if defined(NRF54H20_XXAA)\n#define NRFX_UARTE120_ENABLED  1\n\n#else\n\n#define NRFX_POWER_ENABLED   1\n#define NRFX_POWER_DEFAULT_CONFIG_IRQ_PRIORITY  7\n\n#define NRFX_UARTE0_ENABLED  1\n\n#define NRFX_GPIOTE_ENABLED  1\n#define NRFX_GPIOTE0_ENABLED 1\n\n#define NRFX_SPIM_ENABLED    1\n#define NRFX_SPIM1_ENABLED   1 // use SPI1 since nrf5340 share uart with spi\n#endif\n\n#define NRFX_PRS_ENABLED     0\n#define NRFX_USBREG_ENABLED  1\n\n#define NRF_STATIC_INLINE static inline\n\n#endif /* NRFX_CONFIG_COMMON_H__ */\n"
  },
  {
    "path": "hw/bsp/nrf/nrfx_config/nrfx_config_ext.h",
    "content": "/*\n * Copyright (c) 2023 - 2025, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\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 * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef NRFX_CONFIG_EXT_H__\n#define NRFX_CONFIG_EXT_H__\n\n#error \"Unknown device.\"\n\n#endif // NRFX_CONFIG_EXT_H__\n"
  },
  {
    "path": "hw/bsp/nrf/nrfx_config/nrfx_glue.h",
    "content": "/*\n * Copyright (c) 2017 - 2024, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * SPDX-License-Identifier: BSD-3-Clause\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 * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef NRFX_GLUE_H__\n#define NRFX_GLUE_H__\n\n// THIS IS A TEMPLATE FILE.\n// It should be copied to a suitable location within the host environment into\n// which nrfx is integrated, and the following macros should be provided with\n// appropriate implementations.\n// And this comment should be removed from the customized file.\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @defgroup nrfx_glue nrfx_glue.h\n * @{\n * @ingroup nrfx\n *\n * @brief This file contains macros that should be implemented according to\n *        the needs of the host environment into which @em nrfx is integrated.\n */\n\n// Uncomment this line to use the standard MDK way of binding IRQ handlers\n// at linking time.\n#include <soc/nrfx_irqs.h>\n\n//------------------------------------------------------------------------------\n\n/**\n * @brief Macro for placing a runtime assertion.\n *\n * @param expression Expression to be evaluated.\n */\n#define NRFX_ASSERT(expression)\n\n/**\n * @brief Macro for placing a compile time assertion.\n *\n * @param expression Expression to be evaluated.\n */\n#define NRFX_STATIC_ASSERT(expression)\n\n//------------------------------------------------------------------------------\n\n/**\n * @brief Macro for setting the priority of a specific IRQ.\n *\n * @param irq_number IRQ number.\n * @param priority   Priority to be set.\n */\n#define NRFX_IRQ_PRIORITY_SET(irq_number, priority) _NRFX_IRQ_PRIORITY_SET(irq_number, priority)\nstatic inline void _NRFX_IRQ_PRIORITY_SET(IRQn_Type irq_number,\n                                          uint8_t   priority)\n{\n    NRFX_ASSERT(INTERRUPT_PRIORITY_IS_VALID(priority));\n    NVIC_SetPriority(irq_number, priority);\n}\n\n/**\n * @brief Macro for enabling a specific IRQ.\n *\n * @param irq_number  IRQ number.\n */\n#define NRFX_IRQ_ENABLE(irq_number)  _NRFX_IRQ_ENABLE(irq_number)\nstatic inline void _NRFX_IRQ_ENABLE(IRQn_Type irq_number)\n{\n    NVIC_ClearPendingIRQ(irq_number);\n    NVIC_EnableIRQ(irq_number);\n}\n\n/**\n * @brief Macro for checking if a specific IRQ is enabled.\n *\n * @param irq_number  IRQ number.\n *\n * @retval true  If the IRQ is enabled.\n * @retval false Otherwise.\n */\n#define NRFX_IRQ_IS_ENABLED(irq_number)  _NRFX_IRQ_IS_ENABLED(irq_number)\nstatic inline bool _NRFX_IRQ_IS_ENABLED(IRQn_Type irq_number)\n{\n    return 0 != (NVIC->ISER[irq_number / 32] & (1UL << (irq_number % 32)));\n}\n\n/**\n * @brief Macro for disabling a specific IRQ.\n *\n * @param irq_number  IRQ number.\n */\n#define NRFX_IRQ_DISABLE(irq_number)  _NRFX_IRQ_DISABLE(irq_number)\nstatic inline void _NRFX_IRQ_DISABLE(IRQn_Type irq_number)\n{\n    NVIC_DisableIRQ(irq_number);\n}\n\n/**\n * @brief Macro for setting a specific IRQ as pending.\n *\n * @param irq_number  IRQ number.\n */\n#define NRFX_IRQ_PENDING_SET(irq_number) _NRFX_IRQ_PENDING_SET(irq_number)\nstatic inline void _NRFX_IRQ_PENDING_SET(IRQn_Type irq_number)\n{\n    NVIC_SetPendingIRQ(irq_number);\n}\n\n/**\n * @brief Macro for clearing the pending status of a specific IRQ.\n *\n * @param irq_number  IRQ number.\n */\n#define NRFX_IRQ_PENDING_CLEAR(irq_number) _NRFX_IRQ_PENDING_CLEAR(irq_number)\nstatic inline void _NRFX_IRQ_PENDING_CLEAR(IRQn_Type irq_number)\n{\n    NVIC_ClearPendingIRQ(irq_number);\n}\n\n/**\n * @brief Macro for checking the pending status of a specific IRQ.\n *\n * @retval true  If the IRQ is pending.\n * @retval false Otherwise.\n */\n#define NRFX_IRQ_IS_PENDING(irq_number) _NRFX_IRQ_IS_PENDING(irq_number)\nstatic inline bool _NRFX_IRQ_IS_PENDING(IRQn_Type irq_number)\n{\n    return (NVIC_GetPendingIRQ(irq_number) == 1);\n}\n\n/** @brief Macro for entering into a critical section. */\n#define NRFX_CRITICAL_SECTION_ENTER()\n\n/** @brief Macro for exiting from a critical section. */\n#define NRFX_CRITICAL_SECTION_EXIT()\n\n//------------------------------------------------------------------------------\n\n/**\n * @brief When set to a non-zero value, this macro specifies that\n *        @ref nrfx_coredep_delay_us uses a precise DWT-based solution.\n *        A compilation error is generated if the DWT unit is not present\n *        in the SoC used.\n */\n#define NRFX_DELAY_DWT_BASED    0\n\n/**\n * @brief Macro for delaying the code execution for at least the specified time.\n *\n * @param us_time Number of microseconds to wait.\n */\n#include <soc/nrfx_coredep.h>\n#define NRFX_DELAY_US(us_time) nrfx_coredep_delay_us(us_time)\n\n//------------------------------------------------------------------------------\n\n/**\n * @brief When set to a non-zero value, this macro specifies that the\n *        @ref nrfx_error_codes and the @ref nrfx_err_t type itself are defined\n *        in a customized way and the default definitions from @c <nrfx_error.h>\n *        should not be used.\n */\n#define NRFX_CUSTOM_ERROR_CODES 0\n\n//------------------------------------------------------------------------------\n\n/**\n * @brief Bitmask defining PPI channels reserved to be used outside of nrfx.\n */\n#define NRFX_PPI_CHANNELS_USED  0\n\n/**\n * @brief Bitmask defining PPI groups reserved to be used outside of nrfx.\n */\n#define NRFX_PPI_GROUPS_USED    0\n\n/**\n * @brief Bitmask defining SWI instances reserved to be used outside of nrfx.\n */\n#define NRFX_SWI_USED           0\n\n/**\n * @brief Bitmask defining TIMER instances reserved to be used outside of nrfx.\n */\n#define NRFX_TIMERS_USED        0\n\n/** @} */\n\n//------------------------------------------------------------------------------\n\n#include <soc/nrfx_atomic.h>\n\n/**\n * @brief Atomic 32 bit unsigned type.\n */\n#define nrfx_atomic_t               nrfx_atomic_u32_t\n\n/**\n * @brief Stores value to an atomic object and returns previously stored value.\n *\n * @param[in] p_data  Atomic memory pointer.\n * @param[in] value   Value to store.\n *\n * @return Old value stored into atomic object.\n */\n#define NRFX_ATOMIC_FETCH_STORE(p_data, value) nrfx_atomic_u32_fetch_store(p_data, value)\n\n/**\n * @brief Performs logical OR operation on an atomic object and returns previously stored value.\n *\n * @param[in] p_data  Atomic memory pointer.\n * @param[in] value   Value of second operand of OR operation.\n *\n * @return Old value stored into atomic object.\n */\n#define NRFX_ATOMIC_FETCH_OR(p_data, value)   nrfx_atomic_u32_fetch_or(p_data, value)\n\n/**\n * @brief Performs logical AND operation on an atomic object and returns previously stored value.\n *\n * @param[in] p_data  Atomic memory pointer.\n * @param[in] value   Value of second operand of AND operation.\n *\n * @return Old value stored into atomic object.\n */\n#define NRFX_ATOMIC_FETCH_AND(p_data, value)   nrfx_atomic_u32_fetch_and(p_data, value)\n\n/**\n * @brief Performs logical XOR operation on an atomic object and returns previously stored value.\n *\n * @param[in] p_data  Atomic memory pointer.\n * @param[in] value   Value of second operand of XOR operation.\n *\n * @return Old value stored into atomic object.\n */\n#define NRFX_ATOMIC_FETCH_XOR(p_data, value)   nrfx_atomic_u32_fetch_xor(p_data, value)\n\n/**\n * @brief Performs logical ADD operation on an atomic object and returns previously stored value.\n *\n * @param[in] p_data  Atomic memory pointer.\n * @param[in] value   Value of second operand of ADD operation.\n *\n * @return Old value stored into atomic object.\n */\n#define NRFX_ATOMIC_FETCH_ADD(p_data, value)   nrfx_atomic_u32_fetch_add(p_data, value)\n\n/**\n * @brief Performs logical SUB operation on an atomic object and returns previously stored value.\n *\n * @param[in] p_data  Atomic memory pointer.\n * @param[in] value   Value of second operand of SUB operation.\n *\n * @return Old value stored into atomic object.\n */\n#define NRFX_ATOMIC_FETCH_SUB(p_data, value)   nrfx_atomic_u32_fetch_sub(p_data, value)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // NRFX_GLUE_H__\n"
  },
  {
    "path": "hw/bsp/nrf/nrfx_config/nrfx_log.h",
    "content": "/*\n * Copyright (c) 2017 - 2019, Nordic Semiconductor ASA\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 * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * 3. Neither the name of the copyright holder nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef NRFX_LOG_H__\n#define NRFX_LOG_H__\n\n// THIS IS A TEMPLATE FILE.\n// It should be copied to a suitable location within the host environment into\n// which nrfx is integrated, and the following macros should be provided with\n// appropriate implementations.\n// And this comment should be removed from the customized file.\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @defgroup nrfx_log nrfx_log.h\n * @{\n * @ingroup nrfx\n *\n * @brief This file contains macros that should be implemented according to\n *        the needs of the host environment into which @em nrfx is integrated.\n */\n\n/**\n * @brief Macro for logging a message with the severity level ERROR.\n *\n * @param format printf-style format string, optionally followed by arguments\n *               to be formatted and inserted in the resulting string.\n */\n#define NRFX_LOG_ERROR(format, ...)\n\n/**\n * @brief Macro for logging a message with the severity level WARNING.\n *\n * @param format printf-style format string, optionally followed by arguments\n *               to be formatted and inserted in the resulting string.\n */\n#define NRFX_LOG_WARNING(format, ...)\n\n/**\n * @brief Macro for logging a message with the severity level INFO.\n *\n * @param format printf-style format string, optionally followed by arguments\n *               to be formatted and inserted in the resulting string.\n */\n#define NRFX_LOG_INFO(format, ...)\n\n/**\n * @brief Macro for logging a message with the severity level DEBUG.\n *\n * @param format printf-style format string, optionally followed by arguments\n *               to be formatted and inserted in the resulting string.\n */\n#define NRFX_LOG_DEBUG(format, ...)\n\n\n/**\n * @brief Macro for logging a memory dump with the severity level ERROR.\n *\n * @param[in] p_memory Pointer to the memory region to be dumped.\n * @param[in] length   Length of the memory region in bytes.\n */\n#define NRFX_LOG_HEXDUMP_ERROR(p_memory, length)\n\n/**\n * @brief Macro for logging a memory dump with the severity level WARNING.\n *\n * @param[in] p_memory Pointer to the memory region to be dumped.\n * @param[in] length   Length of the memory region in bytes.\n */\n#define NRFX_LOG_HEXDUMP_WARNING(p_memory, length)\n\n/**\n * @brief Macro for logging a memory dump with the severity level INFO.\n *\n * @param[in] p_memory Pointer to the memory region to be dumped.\n * @param[in] length   Length of the memory region in bytes.\n */\n#define NRFX_LOG_HEXDUMP_INFO(p_memory, length)\n\n/**\n * @brief Macro for logging a memory dump with the severity level DEBUG.\n *\n * @param[in] p_memory Pointer to the memory region to be dumped.\n * @param[in] length   Length of the memory region in bytes.\n */\n#define NRFX_LOG_HEXDUMP_DEBUG(p_memory, length)\n\n\n/**\n * @brief Macro for getting the textual representation of a given error code.\n *\n * @param[in] error_code Error code.\n *\n * @return String containing the textual representation of the error code.\n */\n#define NRFX_LOG_ERROR_STRING_GET(error_code)\n\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // NRFX_LOG_H__\n"
  },
  {
    "path": "hw/bsp/nuc100_120/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n#include \"NUC100Series.h\"\n#endif\n\n/* Cortex-M0 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n// NUC121/125 has 2 priority bits\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc100_120/boards/nutiny_sdk_nuc120/board.cmake",
    "content": "set(JLINK_DEVICE NUC120LE3)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/nuc120_flash.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc100_120/boards/nutiny_sdk_nuc120/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT     PB\n#define LED_PIN      0\n#define LED_PIN_IO   PB0\n#define LED_STATE_ON 0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc100_120/boards/nutiny_sdk_nuc120/board.mk",
    "content": "JLINK_DEVICE = NUC120LE3\nLD_FILE = $(BOARD_PATH)/nuc120_flash.ld\n"
  },
  {
    "path": "hw/bsp/nuc100_120/boards/nutiny_sdk_nuc120/nuc120_flash.ld",
    "content": "/* Linker script to configure memory regions. */\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x20000   /* 128k */\n  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x4000    /*  16k */\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a libnosys.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be defined in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __end__\n *   end\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n\t.text :\n\t{\n\t\tKEEP(*(.vectors))\n\t\t__Vectors_End = .;\n\t\t__Vectors_Size = __Vectors_End - __Vectors;\n\t\t__end__ = .;\n\n\t\t*(.text*)\n\n\t\tKEEP(*(.init))\n\t\tKEEP(*(.fini))\n\n\t\t/* .ctors */\n\t\t*crtbegin.o(.ctors)\n\t\t*crtbegin?.o(.ctors)\n\t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n\t\t*(SORT(.ctors.*))\n\t\t*(.ctors)\n\n\t\t/* .dtors */\n \t\t*crtbegin.o(.dtors)\n \t\t*crtbegin?.o(.dtors)\n \t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n \t\t*(SORT(.dtors.*))\n \t\t*(.dtors)\n\n\t\t*(.rodata*)\n\n\t\tKEEP(*(.eh_frame*))\n\t} > FLASH\n\n\t.ARM.extab :\n\t{\n\t\t*(.ARM.extab* .gnu.linkonce.armextab.*)\n\t} > FLASH\n\n\t__exidx_start = .;\n\t.ARM.exidx :\n\t{\n\t\t*(.ARM.exidx* .gnu.linkonce.armexidx.*)\n\t} > FLASH\n\t__exidx_end = .;\n\n\t/* To copy multiple ROM to RAM sections,\n\t * uncomment .copy.table section and,\n\t * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.copy.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__copy_table_start__ = .;\n\t\tLONG (__etext)\n\t\tLONG (__data_start__)\n\t\tLONG (__data_end__ - __data_start__)\n\t\tLONG (__etext2)\n\t\tLONG (__data2_start__)\n\t\tLONG (__data2_end__ - __data2_start__)\n\t\t__copy_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t/* To clear multiple BSS sections,\n\t * uncomment .zero.table section and,\n\t * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.zero.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__zero_table_start__ = .;\n\t\tLONG (__bss_start__)\n\t\tLONG (__bss_end__ - __bss_start__)\n\t\tLONG (__bss2_start__)\n\t\tLONG (__bss2_end__ - __bss2_start__)\n\t\t__zero_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t__etext = .;\n\n\t.data : AT (__etext)\n\t{\n\t\t__data_start__ = .;\n\t\t*(vtable)\n\t\t*(.data*)\n\n\t\t. = ALIGN(4);\n\t\t/* preinit data */\n\t\tPROVIDE_HIDDEN (__preinit_array_start = .);\n\t\tKEEP(*(.preinit_array))\n\t\tPROVIDE_HIDDEN (__preinit_array_end = .);\n\n\t\t. = ALIGN(4);\n\t\t/* init data */\n\t\tPROVIDE_HIDDEN (__init_array_start = .);\n\t\tKEEP(*(SORT(.init_array.*)))\n\t\tKEEP(*(.init_array))\n\t\tPROVIDE_HIDDEN (__init_array_end = .);\n\n\n\t\t. = ALIGN(4);\n\t\t/* finit data */\n\t\tPROVIDE_HIDDEN (__fini_array_start = .);\n\t\tKEEP(*(SORT(.fini_array.*)))\n\t\tKEEP(*(.fini_array))\n\t\tPROVIDE_HIDDEN (__fini_array_end = .);\n\n\t\tKEEP(*(.jcr*))\n\t\t. = ALIGN(4);\n\t\t/* All data end */\n\t\t__data_end__ = .;\n\n\t} > RAM\n\n\t.bss :\n\t{\n\t\t. = ALIGN(4);\n\t\t__bss_start__ = .;\n\t\t*(.bss*)\n\t\t*(COMMON)\n\t\t. = ALIGN(4);\n\t\t__bss_end__ = .;\n\t} > RAM\n\n\t.heap (COPY):\n\t{\n\t\t__HeapBase = .;\n\t\t__end__ = .;\n\t\tend = __end__;\n\t\tKEEP(*(.heap*))\n\t\t__HeapLimit = .;\n\t} > RAM\n\n\t/* .stack_dummy section doesn't contains any symbols. It is only\n\t * used for linker to calculate size of stack sections, and assign\n\t * values to stack symbols later */\n\t.stack_dummy (COPY):\n\t{\n\t\tKEEP(*(.stack*))\n\t} > RAM\n\n\t/* Set stack top to end of RAM, and stack limit move down by\n\t * size of stack_dummy section */\n\t__StackTop = ORIGIN(RAM) + LENGTH(RAM);\n\t__StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\tPROVIDE(__stack = __StackTop);\n\n\t/* Check if data + heap + stack exceeds RAM limit */\n\tASSERT(__StackLimit >= __HeapLimit, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/nuc100_120/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n#include \"NUC100Series.h\"\n#include \"clk.h\"\n#include \"sys.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USBD_IRQHandler(void)\n{\n  tud_int_handler(0);\n}\n\nvoid board_init(void)\n{\n  SYS_UnlockReg();\n\n  /* Enable Internal RC 22.1184 MHz clock */\n  CLK_EnableXtalRC(CLK_PWRCON_OSC22M_EN_Msk);\n\n  /* Waiting for Internal RC clock ready */\n  CLK_WaitClockReady(CLK_CLKSTATUS_OSC22M_STB_Msk);\n\n  /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */\n  CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC, CLK_CLKDIV_HCLK(1));\n\n  /* Enable external XTAL 12 MHz clock */\n  CLK_EnableXtalRC(CLK_PWRCON_XTL12M_EN_Msk);\n\n  /* Waiting for external XTAL clock ready */\n  CLK_WaitClockReady(CLK_CLKSTATUS_XTL12M_STB_Msk);\n\n  /* Set core clock */\n  CLK_SetCoreClock(48000000);\n\n  /* Enable module clock */\n  CLK_EnableModuleClock(USBD_MODULE);\n\n  /* Select module clock source */\n  CLK_SetModuleClock(USBD_MODULE, 0, CLK_CLKDIV_USB(1));\n\n  SYS_LockReg();\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(48000000 / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  GPIO_SetMode(LED_PORT, 1UL << LED_PIN, GPIO_PMD_OUTPUT);\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler (void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n#if 0\n  /* this would be the simplest solution... *IF* the part supported the pin data interface */\n  LED_PIN_IO = (state) ? LED_STATE_ON : (1-LED_STATE_ON);\n#else\n  /* if the part's *PDIO pin data registers don't work, a more elaborate approach is needed */\n  uint32_t irq_state = __get_PRIMASK();\n  __disable_irq();\n  uint32_t current = LED_PORT->DOUT & ~(1UL << LED_PIN);\n  LED_PORT->DOUT = current | (((state) ? LED_STATE_ON : (1UL-LED_STATE_ON)) << LED_PIN);\n  __set_PRIMASK(irq_state);\n#endif\n}\n\nuint32_t board_button_read(void)\n{\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n"
  },
  {
    "path": "hw/bsp/nuc100_120/family.cmake",
    "content": "include_guard()\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(SDK_DIR ${TOP}/hw/mcu/nuvoton/nuc100_120)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\nset(CMAKE_SYSTEM_CPU cortex-m0 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\nset(OPENOCD_OPTION \"-f interface/nulink.cfg -f target/numicroM0.cfg\")\n\nset(FAMILY_MCUS NUC100 NUC120 CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/Device/Nuvoton/NUC100Series/Source/GCC/startup_NUC100Series.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/Device/Nuvoton/NUC100Series/Source/system_NUC100Series.c\n    ${SDK_DIR}/StdDriver/src/clk.c\n    ${SDK_DIR}/StdDriver/src/gpio.c\n    ${SDK_DIR}/StdDriver/src/sys.c\n    ${SDK_DIR}/StdDriver/src/timer.c\n    ${SDK_DIR}/StdDriver/src/uart.c\n    )\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/Device/Nuvoton/NUC100Series/Include\n    ${SDK_DIR}/StdDriver/inc\n    ${SDK_DIR}/CMSIS/Include\n  )\n\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CFG_EXAMPLE_MSC_READONLY\n    CFG_EXAMPLE_VIDEO_READONLY\n  )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_NUC120)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nuvoton/nuc120/dcd_nuc120.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n    target_compile_options(${TARGET} PRIVATE -Wno-redundant-decls)\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--script=${LD_FILE_Clang}\")\n    target_compile_options(${TARGET} PRIVATE -Wno-redundant-decls)\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--config=${LD_FILE_IAR}\")\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES\n      COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  family_flash_openocd_nuvoton(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc100_120/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n  -flto \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -DCFG_TUSB_MCU=OPT_MCU_NUC120\n\nCPU_CORE ?= cortex-m0\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\n# LD_FILE is defined in board.mk\n\nSRC_C += \\\n  src/portable/nuvoton/nuc120/dcd_nuc120.c \\\n  hw/mcu/nuvoton/nuc100_120/Device/Nuvoton/NUC100Series/Source/system_NUC100Series.c \\\n  hw/mcu/nuvoton/nuc100_120/StdDriver/src/clk.c \\\n  hw/mcu/nuvoton/nuc100_120/StdDriver/src/gpio.c \\\n  hw/mcu/nuvoton/nuc100_120/StdDriver/src/sys.c \\\n  hw/mcu/nuvoton/nuc100_120/StdDriver/src/timer.c \\\n  hw/mcu/nuvoton/nuc100_120/StdDriver/src/uart.c\n\nSRC_S += \\\n  hw/mcu/nuvoton/nuc100_120/Device/Nuvoton/NUC100Series/Source/GCC/startup_NUC100Series.S\n\nINC += \\\n  $(TOP)/hw/mcu/nuvoton/nuc100_120/Device/Nuvoton/NUC100Series/Include \\\n  $(TOP)/hw/mcu/nuvoton/nuc100_120/StdDriver/inc \\\n  $(TOP)/hw/mcu/nuvoton/nuc100_120/CMSIS/Include \\\n  $(TOP)/$(BOARD_PATH)\n\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM0\n\n# Flash using Nuvoton's openocd fork at https://github.com/OpenNuvoton/OpenOCD-Nuvoton\n# Please compile and install it from github source\nOPENOCD_NUVOTON_PATH ?= $(HOME)/app/OpenOCD-Nuvoton\nflash: $(BUILD)/$(PROJECT).elf\n\t$(OPENOCD_NUVOTON_PATH)/src/openocd -s $(OPENOCD_NUVOTON_PATH)/tcl -f interface/nulink.cfg -f target/numicroM0.cfg -c \"program $< reset exit\"\n"
  },
  {
    "path": "hw/bsp/nuc121_125/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"NuMicro.h\"\n#endif\n\n/* Cortex-M0 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n// NUC121/125 has 2 priority bits\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc121_125/boards/nutiny_sdk_nuc121/board.cmake",
    "content": "set(NUC_SERIES nuc121)\nset(JLINK_DEVICE NUC121SC2AE)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/nuc121_flash.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc121_125/boards/nutiny_sdk_nuc121/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              PB\n#define LED_PIN               4\n#define LED_PIN_IO            PB4\n#define LED_STATE_ON          0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc121_125/boards/nutiny_sdk_nuc121/board.mk",
    "content": "NUC_SERIES = nuc121\nJLINK_DEVICE = NUC121SC2AE\nLD_FILE = $(BOARD_PATH)/nuc121_flash.ld\n"
  },
  {
    "path": "hw/bsp/nuc121_125/boards/nutiny_sdk_nuc121/nuc121_flash.ld",
    "content": "/* Linker script to configure memory regions. */\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x8000    /* 32k */\n  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x2000    /* 8k  */\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a libnosys.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be defined in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __end__\n *   end\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n\t.text :\n\t{\n\t\tKEEP(*(.vectors))\n\t\t__Vectors_End = .;\n\t\t__Vectors_Size = __Vectors_End - __Vectors;\n\t\t__end__ = .;\n\n\t\t*(.text*)\n\n\t\tKEEP(*(.init))\n\t\tKEEP(*(.fini))\n\n\t\t/* .ctors */\n\t\t*crtbegin.o(.ctors)\n\t\t*crtbegin?.o(.ctors)\n\t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n\t\t*(SORT(.ctors.*))\n\t\t*(.ctors)\n\n\t\t/* .dtors */\n \t\t*crtbegin.o(.dtors)\n \t\t*crtbegin?.o(.dtors)\n \t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n \t\t*(SORT(.dtors.*))\n \t\t*(.dtors)\n\n\t\t*(.rodata*)\n\n\t\tKEEP(*(.eh_frame*))\n\t} > FLASH\n\n\t.ARM.extab :\n\t{\n\t\t*(.ARM.extab* .gnu.linkonce.armextab.*)\n\t} > FLASH\n\n\t__exidx_start = .;\n\t.ARM.exidx :\n\t{\n\t\t*(.ARM.exidx* .gnu.linkonce.armexidx.*)\n\t} > FLASH\n\t__exidx_end = .;\n\n\t/* To copy multiple ROM to RAM sections,\n\t * uncomment .copy.table section and,\n\t * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.copy.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__copy_table_start__ = .;\n\t\tLONG (__etext)\n\t\tLONG (__data_start__)\n\t\tLONG (__data_end__ - __data_start__)\n\t\tLONG (__etext2)\n\t\tLONG (__data2_start__)\n\t\tLONG (__data2_end__ - __data2_start__)\n\t\t__copy_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t/* To clear multiple BSS sections,\n\t * uncomment .zero.table section and,\n\t * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.zero.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__zero_table_start__ = .;\n\t\tLONG (__bss_start__)\n\t\tLONG (__bss_end__ - __bss_start__)\n\t\tLONG (__bss2_start__)\n\t\tLONG (__bss2_end__ - __bss2_start__)\n\t\t__zero_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t__etext = .;\n\n\t.data : AT (__etext)\n\t{\n\t\t__data_start__ = .;\n\t\t*(vtable)\n\t\t*(.data*)\n\n\t\t. = ALIGN(4);\n\t\t/* preinit data */\n\t\tPROVIDE_HIDDEN (__preinit_array_start = .);\n\t\tKEEP(*(.preinit_array))\n\t\tPROVIDE_HIDDEN (__preinit_array_end = .);\n\n\t\t. = ALIGN(4);\n\t\t/* init data */\n\t\tPROVIDE_HIDDEN (__init_array_start = .);\n\t\tKEEP(*(SORT(.init_array.*)))\n\t\tKEEP(*(.init_array))\n\t\tPROVIDE_HIDDEN (__init_array_end = .);\n\n\n\t\t. = ALIGN(4);\n\t\t/* finit data */\n\t\tPROVIDE_HIDDEN (__fini_array_start = .);\n\t\tKEEP(*(SORT(.fini_array.*)))\n\t\tKEEP(*(.fini_array))\n\t\tPROVIDE_HIDDEN (__fini_array_end = .);\n\n\t\tKEEP(*(.jcr*))\n\t\t. = ALIGN(4);\n\t\t/* All data end */\n\t\t__data_end__ = .;\n\n\t} > RAM\n\n\t.bss :\n\t{\n\t\t. = ALIGN(4);\n\t\t__bss_start__ = .;\n\t\t*(.bss*)\n\t\t*(COMMON)\n\t\t. = ALIGN(4);\n\t\t__bss_end__ = .;\n\t} > RAM\n\n\t.heap (COPY):\n\t{\n\t\t__HeapBase = .;\n\t\t__end__ = .;\n\t\tend = __end__;\n\t\tKEEP(*(.heap*))\n\t\t__HeapLimit = .;\n\t} > RAM\n\n\t/* .stack_dummy section doesn't contains any symbols. It is only\n\t * used for linker to calculate size of stack sections, and assign\n\t * values to stack symbols later */\n\t.stack_dummy (COPY):\n\t{\n\t\tKEEP(*(.stack*))\n\t} > RAM\n\n\t/* Set stack top to end of RAM, and stack limit move down by\n\t * size of stack_dummy section */\n\t__StackTop = ORIGIN(RAM) + LENGTH(RAM);\n\t__StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\tPROVIDE(__stack = __StackTop);\n\n\t/* Check if data + heap + stack exceeds RAM limit */\n\tASSERT(__StackLimit >= __HeapLimit, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/nuc121_125/boards/nutiny_sdk_nuc125/board.cmake",
    "content": "set(NUC_SERIES nuc125)\nset(JLINK_DEVICE NUC125SC2AE)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/nuc125_flash.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc121_125/boards/nutiny_sdk_nuc125/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              PB\n#define LED_PIN               4\n#define LED_PIN_IO            PB4\n#define LED_STATE_ON          0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc121_125/boards/nutiny_sdk_nuc125/board.mk",
    "content": "NUC_SERIES = nuc125\nJLINK_DEVICE = NUC125SC2AE\nLD_FILE = $(BOARD_PATH)/nuc125_flash.ld\n"
  },
  {
    "path": "hw/bsp/nuc121_125/boards/nutiny_sdk_nuc125/nuc125_flash.ld",
    "content": "/* Linker script to configure memory regions. */\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x8000    /* 32k */\n  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x2000    /* 8k  */\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a libnosys.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be defined in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __end__\n *   end\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n\t.text :\n\t{\n\t\tKEEP(*(.vectors))\n\t\t__Vectors_End = .;\n\t\t__Vectors_Size = __Vectors_End - __Vectors;\n\t\t__end__ = .;\n\n\t\t*(.text*)\n\n\t\tKEEP(*(.init))\n\t\tKEEP(*(.fini))\n\n\t\t/* .ctors */\n\t\t*crtbegin.o(.ctors)\n\t\t*crtbegin?.o(.ctors)\n\t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n\t\t*(SORT(.ctors.*))\n\t\t*(.ctors)\n\n\t\t/* .dtors */\n \t\t*crtbegin.o(.dtors)\n \t\t*crtbegin?.o(.dtors)\n \t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n \t\t*(SORT(.dtors.*))\n \t\t*(.dtors)\n\n\t\t*(.rodata*)\n\n\t\tKEEP(*(.eh_frame*))\n\t} > FLASH\n\n\t.ARM.extab :\n\t{\n\t\t*(.ARM.extab* .gnu.linkonce.armextab.*)\n\t} > FLASH\n\n\t__exidx_start = .;\n\t.ARM.exidx :\n\t{\n\t\t*(.ARM.exidx* .gnu.linkonce.armexidx.*)\n\t} > FLASH\n\t__exidx_end = .;\n\n\t/* To copy multiple ROM to RAM sections,\n\t * uncomment .copy.table section and,\n\t * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.copy.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__copy_table_start__ = .;\n\t\tLONG (__etext)\n\t\tLONG (__data_start__)\n\t\tLONG (__data_end__ - __data_start__)\n\t\tLONG (__etext2)\n\t\tLONG (__data2_start__)\n\t\tLONG (__data2_end__ - __data2_start__)\n\t\t__copy_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t/* To clear multiple BSS sections,\n\t * uncomment .zero.table section and,\n\t * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.zero.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__zero_table_start__ = .;\n\t\tLONG (__bss_start__)\n\t\tLONG (__bss_end__ - __bss_start__)\n\t\tLONG (__bss2_start__)\n\t\tLONG (__bss2_end__ - __bss2_start__)\n\t\t__zero_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t__etext = .;\n\n\t.data : AT (__etext)\n\t{\n\t\t__data_start__ = .;\n\t\t*(vtable)\n\t\t*(.data*)\n\n\t\t. = ALIGN(4);\n\t\t/* preinit data */\n\t\tPROVIDE_HIDDEN (__preinit_array_start = .);\n\t\tKEEP(*(.preinit_array))\n\t\tPROVIDE_HIDDEN (__preinit_array_end = .);\n\n\t\t. = ALIGN(4);\n\t\t/* init data */\n\t\tPROVIDE_HIDDEN (__init_array_start = .);\n\t\tKEEP(*(SORT(.init_array.*)))\n\t\tKEEP(*(.init_array))\n\t\tPROVIDE_HIDDEN (__init_array_end = .);\n\n\n\t\t. = ALIGN(4);\n\t\t/* finit data */\n\t\tPROVIDE_HIDDEN (__fini_array_start = .);\n\t\tKEEP(*(SORT(.fini_array.*)))\n\t\tKEEP(*(.fini_array))\n\t\tPROVIDE_HIDDEN (__fini_array_end = .);\n\n\t\tKEEP(*(.jcr*))\n\t\t. = ALIGN(4);\n\t\t/* All data end */\n\t\t__data_end__ = .;\n\n\t} > RAM\n\n\t.bss :\n\t{\n\t\t. = ALIGN(4);\n\t\t__bss_start__ = .;\n\t\t*(.bss*)\n\t\t*(COMMON)\n\t\t. = ALIGN(4);\n\t\t__bss_end__ = .;\n\t} > RAM\n\n\t.heap (COPY):\n\t{\n\t\t__HeapBase = .;\n\t\t__end__ = .;\n\t\tend = __end__;\n\t\tKEEP(*(.heap*))\n\t\t__HeapLimit = .;\n\t} > RAM\n\n\t/* .stack_dummy section doesn't contains any symbols. It is only\n\t * used for linker to calculate size of stack sections, and assign\n\t * values to stack symbols later */\n\t.stack_dummy (COPY):\n\t{\n\t\tKEEP(*(.stack*))\n\t} > RAM\n\n\t/* Set stack top to end of RAM, and stack limit move down by\n\t * size of stack_dummy section */\n\t__StackTop = ORIGIN(RAM) + LENGTH(RAM);\n\t__StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\tPROVIDE(__stack = __StackTop);\n\n\t/* Check if data + heap + stack exceeds RAM limit */\n\tASSERT(__StackLimit >= __HeapLimit, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/nuc121_125/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n#include \"NuMicro.h\"\n#include \"clk.h\"\n#include \"sys.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USBD_IRQHandler(void)\n{\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// Board Initialization\n//--------------------------------------------------------------------+\n\nvoid board_init(void)\n{\n  /* Unlock protected registers */\n  SYS_UnlockReg();\n\n  /*---------------------------------------------------------------------------------------------------------*/\n  /* Init System Clock                                                                                       */\n  /*---------------------------------------------------------------------------------------------------------*/\n\n  /* Enable Internal HIRC 48 MHz clock */\n  CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN);\n\n  /* Waiting for Internal RC clock ready */\n  CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);\n\n  /* Switch HCLK clock source to Internal HIRC and HCLK source divide 1 */\n  CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));\n\n  /* Enable module clock */\n  CLK_EnableModuleClock(USBD_MODULE);\n\n  /* Select module clock source */\n  CLK_SetModuleClock(USBD_MODULE, CLK_CLKSEL3_USBDSEL_HIRC, CLK_CLKDIV0_USB(1));\n\n  /* Enable module clock */\n  CLK_EnableModuleClock(USBD_MODULE);\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(48000000 / 1000);\n#endif\n\n  // LED\n  GPIO_SetMode(LED_PORT, 1 << LED_PIN, GPIO_MODE_OUTPUT);\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler (void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  LED_PIN_IO = (state ? LED_STATE_ON : (1-LED_STATE_ON));\n}\n\nuint32_t board_button_read(void)\n{\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n"
  },
  {
    "path": "hw/bsp/nuc121_125/family.cmake",
    "content": "include_guard()\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(SDK_DIR ${TOP}/hw/mcu/nuvoton/nuc121_125)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\nset(OPENOCD_OPTION \"-f interface/nulink.cfg -f target/numicroM0.cfg\")\n\nset(FAMILY_MCUS NUC121 CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/Device/Nuvoton/NUC121/Source/GCC/startup_NUC121.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  # Common sources for all NUC12x\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/Device/Nuvoton/NUC121/Source/system_NUC121.c\n    ${SDK_DIR}/StdDriver/src/clk.c\n    ${SDK_DIR}/StdDriver/src/gpio.c\n    ${SDK_DIR}/StdDriver/src/fmc.c\n    ${SDK_DIR}/StdDriver/src/sys.c\n    ${SDK_DIR}/StdDriver/src/timer.c\n  )\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/Device/Nuvoton/NUC121/Include\n    ${SDK_DIR}/StdDriver/inc\n    ${SDK_DIR}/CMSIS/Include\n  )\n\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __ARM_FEATURE_DSP=0\n    USE_ASSERT=0\n    CFG_EXAMPLE_MSC_READONLY\n  )\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_NUC121)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nuvoton/nuc121/dcd_nuc121.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n    target_compile_options(${TARGET} PRIVATE -Wno-redundant-decls)\n\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--script=${LD_FILE_Clang}\")\n    target_compile_options(${TARGET} PRIVATE -Wno-redundant-decls)\n\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--config=${LD_FILE_IAR}\")\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES\n      COMPILE_FLAGS \"-Wno-missing-prototypes -Wno-redundant-decls\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  family_flash_openocd_nuvoton(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc121_125/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n  -flto \\\n  -D__ARM_FEATURE_DSP=0 \\\n  -DUSE_ASSERT=0 \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_TUSB_MCU=OPT_MCU_NUC121\n\nCPU_CORE ?= cortex-m0\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=redundant-decls\n\nLDFLAGS_GCC += \\\n  --specs=nosys.specs --specs=nano.specs\n\n# All source paths should be relative to the top level.\n# LD_FILE is defined in board.mk\n\n# Common sources for all NUC12x variants\nSRC_C += \\\n  src/portable/nuvoton/nuc121/dcd_nuc121.c \\\n  hw/mcu/nuvoton/nuc121_125/Device/Nuvoton/NUC121/Source/system_NUC121.c \\\n  hw/mcu/nuvoton/nuc121_125/StdDriver/src/clk.c \\\n  hw/mcu/nuvoton/nuc121_125/StdDriver/src/gpio.c \\\n  hw/mcu/nuvoton/nuc121_125/StdDriver/src/fmc.c \\\n  hw/mcu/nuvoton/nuc121_125/StdDriver/src/sys.c \\\n  hw/mcu/nuvoton/nuc121_125/StdDriver/src/timer.c\n\n# Additional sources are added in board.mk if needed (e.g., fmc, sys, timer, uart for NUC121)\n\nSRC_S += \\\n  hw/mcu/nuvoton/nuc121_125/Device/Nuvoton/NUC121/Source/GCC/startup_NUC121.S\n\nINC += \\\n  $(TOP)/hw/mcu/nuvoton/nuc121_125/Device/Nuvoton/NUC121/Include \\\n  $(TOP)/hw/mcu/nuvoton/nuc121_125/StdDriver/inc \\\n  $(TOP)/hw/mcu/nuvoton/nuc121_125/CMSIS/Include \\\n  $(TOP)/$(BOARD_PATH)\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM0\n\n# Flash using Nuvoton's openocd fork at https://github.com/OpenNuvoton/OpenOCD-Nuvoton\n# Please compile and install it from github source\nOPENOCD_NUVOTON_PATH ?= $(HOME)/app/OpenOCD-Nuvoton\nflash: $(BUILD)/$(PROJECT).elf\n\t$(OPENOCD_NUVOTON_PATH)/src/openocd -s $(OPENOCD_NUVOTON_PATH)/tcl -f interface/nulink.cfg -f target/numicroM0.cfg -c \"program $< reset exit\"\n"
  },
  {
    "path": "hw/bsp/nuc126/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"NuMicro.h\"\n#endif\n\n/* Cortex-M0 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n// NUC121/125 has 2 priority bits\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc126/boards/nutiny_nuc126v/board.cmake",
    "content": "set(JLINK_DEVICE NUC126VG4AE)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/nuc126_flash.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc126/boards/nutiny_nuc126v/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              PC\n#define LED_PIN               9\n#define LED_PIN_IO            PC9\n#define LED_STATE_ON          0\n\n#define CRYSTAL_LESS /* system will be 48MHz when defined, otherwise, system is 72MHz */\n#define HIRC48_AUTO_TRIM    SYS_IRCTCTL1_REFCKSEL_Msk | (1UL << SYS_IRCTCTL1_LOOPSEL_Pos) | (2UL << SYS_IRCTCTL1_FREQSEL_Pos)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc126/boards/nutiny_nuc126v/board.mk",
    "content": "JLINK_DEVICE = NUC126VG4AE\nLD_FILE = $(BOARD_PATH)/nuc126_flash.ld\n"
  },
  {
    "path": "hw/bsp/nuc126/boards/nutiny_nuc126v/nuc126_flash.ld",
    "content": "/* Linker script to configure memory regions. */\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x40000   /* 256k */\n  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x5000    /*  20k */\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a libnosys.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be defined in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __end__\n *   end\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n\t.text :\n\t{\n\t\tKEEP(*(.vectors))\n\t\t__Vectors_End = .;\n\t\t__Vectors_Size = __Vectors_End - __Vectors;\n\t\t__end__ = .;\n\n\t\t*(.text*)\n\n\t\tKEEP(*(.init))\n\t\tKEEP(*(.fini))\n\n\t\t/* .ctors */\n\t\t*crtbegin.o(.ctors)\n\t\t*crtbegin?.o(.ctors)\n\t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n\t\t*(SORT(.ctors.*))\n\t\t*(.ctors)\n\n\t\t/* .dtors */\n \t\t*crtbegin.o(.dtors)\n \t\t*crtbegin?.o(.dtors)\n \t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n \t\t*(SORT(.dtors.*))\n \t\t*(.dtors)\n\n\t\t*(.rodata*)\n\n\t\tKEEP(*(.eh_frame*))\n\t} > FLASH\n\n\t.ARM.extab :\n\t{\n\t\t*(.ARM.extab* .gnu.linkonce.armextab.*)\n\t} > FLASH\n\n\t__exidx_start = .;\n\t.ARM.exidx :\n\t{\n\t\t*(.ARM.exidx* .gnu.linkonce.armexidx.*)\n\t} > FLASH\n\t__exidx_end = .;\n\n\t/* To copy multiple ROM to RAM sections,\n\t * uncomment .copy.table section and,\n\t * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.copy.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__copy_table_start__ = .;\n\t\tLONG (__etext)\n\t\tLONG (__data_start__)\n\t\tLONG (__data_end__ - __data_start__)\n\t\tLONG (__etext2)\n\t\tLONG (__data2_start__)\n\t\tLONG (__data2_end__ - __data2_start__)\n\t\t__copy_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t/* To clear multiple BSS sections,\n\t * uncomment .zero.table section and,\n\t * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.zero.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__zero_table_start__ = .;\n\t\tLONG (__bss_start__)\n\t\tLONG (__bss_end__ - __bss_start__)\n\t\tLONG (__bss2_start__)\n\t\tLONG (__bss2_end__ - __bss2_start__)\n\t\t__zero_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t__etext = .;\n\n\t.data : AT (__etext)\n\t{\n\t\t__data_start__ = .;\n\t\t*(vtable)\n\t\t*(.data*)\n\n\t\t. = ALIGN(4);\n\t\t/* preinit data */\n\t\tPROVIDE_HIDDEN (__preinit_array_start = .);\n\t\tKEEP(*(.preinit_array))\n\t\tPROVIDE_HIDDEN (__preinit_array_end = .);\n\n\t\t. = ALIGN(4);\n\t\t/* init data */\n\t\tPROVIDE_HIDDEN (__init_array_start = .);\n\t\tKEEP(*(SORT(.init_array.*)))\n\t\tKEEP(*(.init_array))\n\t\tPROVIDE_HIDDEN (__init_array_end = .);\n\n\n\t\t. = ALIGN(4);\n\t\t/* finit data */\n\t\tPROVIDE_HIDDEN (__fini_array_start = .);\n\t\tKEEP(*(SORT(.fini_array.*)))\n\t\tKEEP(*(.fini_array))\n\t\tPROVIDE_HIDDEN (__fini_array_end = .);\n\n\t\tKEEP(*(.jcr*))\n\t\t. = ALIGN(4);\n\t\t/* All data end */\n\t\t__data_end__ = .;\n\n\t} > RAM\n\n\t.bss :\n\t{\n\t\t. = ALIGN(4);\n\t\t__bss_start__ = .;\n\t\t*(.bss*)\n\t\t*(COMMON)\n\t\t. = ALIGN(4);\n\t\t__bss_end__ = .;\n\t} > RAM\n\n\t.heap (COPY):\n\t{\n\t\t__HeapBase = .;\n\t\t__end__ = .;\n\t\tend = __end__;\n\t\tKEEP(*(.heap*))\n\t\t__HeapLimit = .;\n\t} > RAM\n\n\t/* .stack_dummy section doesn't contains any symbols. It is only\n\t * used for linker to calculate size of stack sections, and assign\n\t * values to stack symbols later */\n\t.stack_dummy (COPY):\n\t{\n\t\tKEEP(*(.stack*))\n\t} > RAM\n\n\t/* Set stack top to end of RAM, and stack limit move down by\n\t * size of stack_dummy section */\n\t__StackTop = ORIGIN(RAM) + LENGTH(RAM);\n\t__StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\tPROVIDE(__stack = __StackTop);\n\n\t/* Check if data + heap + stack exceeds RAM limit */\n\tASSERT(__StackLimit >= __HeapLimit, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/nuc126/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n#include \"NuMicro.h\"\n#include \"clk.h\"\n#include \"sys.h\"\n\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USBD_IRQHandler(void)\n{\n  tud_int_handler(0);\n}\n#define TRIM_INIT           (SYS_BASE+0x118)\n\nvoid board_init(void)\n{\n  /* Unlock protected registers */\n  SYS_UnlockReg();\n\n  /*---------------------------------------------------------------------------------------------------------*/\n  /* Init System Clock                                                                                       */\n  /*---------------------------------------------------------------------------------------------------------*/\n\n  /* Enable Internal RC 22.1184 MHz clock */\n  CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);\n\n  /* Waiting for Internal RC clock ready */\n  CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);\n\n  /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */\n  CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));\n\n#ifndef CRYSTAL_LESS\n  /* Enable external XTAL 12 MHz clock */\n  CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);\n\n  /* Waiting for external XTAL clock ready */\n  CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);\n\n  /* Set core clock */\n  CLK_SetCoreClock(72000000);\n\n  /* Use HIRC as UART clock source */\n  CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HIRC, CLK_CLKDIV0_UART(1));\n\n  /* Use PLL as USB clock source */\n  CLK_SetModuleClock(USBD_MODULE, CLK_CLKSEL3_USBDSEL_PLL, CLK_CLKDIV0_USB(3));\n\n#else\n  /* Enable Internal RC 48MHz clock */\n  CLK_EnableXtalRC(CLK_PWRCTL_HIRC48EN_Msk);\n\n  /* Waiting for Internal RC clock ready */\n  CLK_WaitClockReady(CLK_STATUS_HIRC48STB_Msk);\n\n  /* Switch HCLK clock source to Internal RC and HCLK source divide 1 */\n  CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC48, CLK_CLKDIV0_HCLK(1));\n\n  /* Use HIRC as UART clock source */\n  CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HIRC, CLK_CLKDIV0_UART(1));\n\n  /* Use HIRC48 as USB clock source */\n  CLK_SetModuleClock(USBD_MODULE, CLK_CLKSEL3_USBDSEL_HIRC48, CLK_CLKDIV0_USB(1));\n#endif\n\n  /* Enable module clock */\n  CLK_EnableModuleClock(USBD_MODULE);\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(48000000 / 1000);\n#endif\n\n  // LED\n  GPIO_SetMode(LED_PORT, 1 << LED_PIN, GPIO_MODE_OUTPUT);\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler (void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  LED_PIN_IO = (state ? LED_STATE_ON : (1-LED_STATE_ON));\n}\n\nuint32_t board_button_read(void)\n{\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n"
  },
  {
    "path": "hw/bsp/nuc126/family.cmake",
    "content": "include_guard()\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(SDK_DIR ${TOP}/hw/mcu/nuvoton/nuc126)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\nset(OPENOCD_OPTION \"-f interface/nulink.cfg -f target/numicroM0.cfg\")\n\nset(FAMILY_MCUS NUC126 CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/Device/Nuvoton/NUC126/Source/GCC/startup_NUC126.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/Device/Nuvoton/NUC126/Source/system_NUC126.c\n    ${SDK_DIR}/StdDriver/src/clk.c\n    ${SDK_DIR}/StdDriver/src/crc.c\n    ${SDK_DIR}/StdDriver/src/gpio.c\n    ${SDK_DIR}/StdDriver/src/rtc.c\n    ${SDK_DIR}/StdDriver/src/sys.c\n    ${SDK_DIR}/StdDriver/src/timer.c\n    ${SDK_DIR}/StdDriver/src/uart.c\n    )\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/Device/Nuvoton/NUC126/Include\n    ${SDK_DIR}/StdDriver/inc\n    ${SDK_DIR}/CMSIS/Include\n  )\n\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    __ARM_FEATURE_DSP=0\n    USE_ASSERT=0\n    CFG_EXAMPLE_VIDEO_READONLY\n    __CORTEX_SC=0\n  )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_NUC126)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nuvoton/nuc121/dcd_nuc121.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n    target_compile_options(${TARGET} PRIVATE -Wno-redundant-decls)\n\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--script=${LD_FILE_Clang}\")\n    target_compile_options(${TARGET} PRIVATE -Wno-redundant-decls)\n\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--config=${LD_FILE_IAR}\")\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES\n      COMPILE_FLAGS \"-Wno-missing-prototypes -Wno-redundant-decls\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  family_flash_openocd_nuvoton(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc126/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n  -flto \\\n  -D__ARM_FEATURE_DSP=0 \\\n  -DUSE_ASSERT=0 \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -D__CORTEX_SC=0 \\\n  -DCFG_TUSB_MCU=OPT_MCU_NUC126\n\nCPU_CORE ?= cortex-m0\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=redundant-decls\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\n# All source paths should be relative to the top level.\n# LD_FILE is defined in board.mk\n\nSRC_C += \\\n  src/portable/nuvoton/nuc121/dcd_nuc121.c \\\n  hw/mcu/nuvoton/nuc126/Device/Nuvoton/NUC126/Source/system_NUC126.c \\\n  hw/mcu/nuvoton/nuc126/StdDriver/src/clk.c \\\n  hw/mcu/nuvoton/nuc126/StdDriver/src/crc.c \\\n  hw/mcu/nuvoton/nuc126/StdDriver/src/gpio.c \\\n  hw/mcu/nuvoton/nuc126/StdDriver/src/rtc.c \\\n  hw/mcu/nuvoton/nuc126/StdDriver/src/sys.c \\\n  hw/mcu/nuvoton/nuc126/StdDriver/src/timer.c \\\n  hw/mcu/nuvoton/nuc126/StdDriver/src/uart.c\n\nSRC_S += \\\n  hw/mcu/nuvoton/nuc126/Device/Nuvoton/NUC126/Source/GCC/startup_NUC126.S\n\nINC += \\\n  $(TOP)/hw/mcu/nuvoton/nuc126/Device/Nuvoton/NUC126/Include \\\n  $(TOP)/hw/mcu/nuvoton/nuc126/StdDriver/inc \\\n  $(TOP)/hw/mcu/nuvoton/nuc126/CMSIS/Include \\\n  $(TOP)/$(BOARD_PATH)\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM0\n\n# Flash using Nuvoton's openocd fork at https://github.com/OpenNuvoton/OpenOCD-Nuvoton\n# Please compile and install it from github source\nOPENOCD_NUVOTON_PATH ?= $(HOME)/app/OpenOCD-Nuvoton\nflash: $(BUILD)/$(PROJECT).elf\n\t$(OPENOCD_NUVOTON_PATH)/src/openocd -s $(OPENOCD_NUVOTON_PATH)/tcl -f interface/nulink.cfg -f target/numicroM0.cfg -c \"program $< reset exit\"\n"
  },
  {
    "path": "hw/bsp/nuc505/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n#include \"NUC505Series.h\"\n#endif\n\n/* Cortex-M4F port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*8*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n// NUC505 has 3 priority bits\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc505/boards/nutiny_sdk_nuc505/board.cmake",
    "content": "set(JLINK_DEVICE NUC505YO13Y)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/nuc505_flashtoram.ld)\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc505/boards/nutiny_sdk_nuc505/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT     PC\n#define LED_PIN      3\n#define LED_STATE_ON 0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/nuc505/boards/nutiny_sdk_nuc505/board.mk",
    "content": "JLINK_DEVICE = NUC505YO13Y\nLD_FILE = $(BOARD_PATH)/nuc505_flashtoram.ld\n"
  },
  {
    "path": "hw/bsp/nuc505/boards/nutiny_sdk_nuc505/nuc505_flashtoram.ld",
    "content": "/* Linker script to configure memory regions. */\nMEMORY\n{\n  FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x80000   /* 512k */\n  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x20000   /* 128k */\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a libnosys.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be defined in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __end__\n *   end\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n\t.startup :\n\t{\n\t\tKEEP(*(.vectors))\n\t\t__Vectors_End = .;\n\t\t__Vectors_Size = __Vectors_End - __Vectors;\n\t\t__end__ = .;\n\n\t\tKEEP(*(.preinit))\n\n\t\tKEEP(*(.init))\n\t\tKEEP(*(.fini))\n\n\t} > FLASH\n\n\t.ARM.extab :\n\t{\n\t\t*(.ARM.extab* .gnu.linkonce.armextab.*)\n\t} > FLASH\n\n\t__exidx_start = .;\n\t.ARM.exidx :\n\t{\n\t\t*(.ARM.exidx* .gnu.linkonce.armexidx.*)\n\t} > FLASH\n\t__exidx_end = .;\n\n\t/* To copy multiple ROM to RAM sections,\n\t * uncomment .copy.table section and,\n\t * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.copy.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__copy_table_start__ = .;\n\t\tLONG (__etext)\n\t\tLONG (__data_start__)\n\t\tLONG (__data_end__ - __data_start__)\n\t\tLONG (__etext2)\n\t\tLONG (__data2_start__)\n\t\tLONG (__data2_end__ - __data2_start__)\n\t\t__copy_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t/* To clear multiple BSS sections,\n\t * uncomment .zero.table section and,\n\t * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n\t/*\n\t.zero.table :\n\t{\n\t\t. = ALIGN(4);\n\t\t__zero_table_start__ = .;\n\t\tLONG (__bss_start__)\n\t\tLONG (__bss_end__ - __bss_start__)\n\t\tLONG (__bss2_start__)\n\t\tLONG (__bss2_end__ - __bss2_start__)\n\t\t__zero_table_end__ = .;\n\t} > FLASH\n\t*/\n\n\t__etext = .;\n\n\t.data : AT (__etext)\n\t{\n\t\t__data_start__ = .;\n\n\t\t*(.text*)\n\n\t\t/* .ctors */\n\t\t*crtbegin.o(.ctors)\n\t\t*crtbegin?.o(.ctors)\n\t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n\t\t*(SORT(.ctors.*))\n\t\t*(.ctors)\n\n\t\t/* .dtors */\n \t\t*crtbegin.o(.dtors)\n \t\t*crtbegin?.o(.dtors)\n \t\t*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n \t\t*(SORT(.dtors.*))\n \t\t*(.dtors)\n\n\t\t*(.rodata*)\n\n\t\tKEEP(*(.eh_frame*))\n\n\t\t*(vtable)\n\t\t*(.data*)\n\n\t\t. = ALIGN(4);\n\t\t/* preinit data */\n\t\tPROVIDE_HIDDEN (__preinit_array_start = .);\n\t\tKEEP(*(.preinit_array))\n\t\tPROVIDE_HIDDEN (__preinit_array_end = .);\n\n\t\t. = ALIGN(4);\n\t\t/* init data */\n\t\tPROVIDE_HIDDEN (__init_array_start = .);\n\t\tKEEP(*(SORT(.init_array.*)))\n\t\tKEEP(*(.init_array))\n\t\tPROVIDE_HIDDEN (__init_array_end = .);\n\n\n\t\t. = ALIGN(4);\n\t\t/* finit data */\n\t\tPROVIDE_HIDDEN (__fini_array_start = .);\n\t\tKEEP(*(SORT(.fini_array.*)))\n\t\tKEEP(*(.fini_array))\n\t\tPROVIDE_HIDDEN (__fini_array_end = .);\n\n\t\tKEEP(*(.jcr*))\n\t\t. = ALIGN(4);\n\t\t/* All data end */\n\t\t__data_end__ = .;\n\n\t} > RAM\n\n\t.bss :\n\t{\n\t\t. = ALIGN(4);\n\t\t__bss_start__ = .;\n\t\t*(.bss*)\n\t\t*(COMMON)\n\t\t. = ALIGN(4);\n\t\t__bss_end__ = .;\n\t} > RAM\n\n\t.heap (COPY):\n\t{\n\t\t__HeapBase = .;\n\t\t__end__ = .;\n\t\tend = __end__;\n\t\tKEEP(*(.heap*))\n\t\t__HeapLimit = .;\n\t} > RAM\n\n\t/* .stack_dummy section doesn't contains any symbols. It is only\n\t * used for linker to calculate size of stack sections, and assign\n\t * values to stack symbols later */\n\t.stack_dummy (COPY):\n\t{\n\t\tKEEP(*(.stack*))\n\t} > RAM\n\n\t/* Set stack top to end of RAM, and stack limit move down by\n\t * size of stack_dummy section */\n\t__StackTop = ORIGIN(RAM) + LENGTH(RAM);\n\t__StackLimit = __StackTop - SIZEOF(.stack_dummy);\n\tPROVIDE(__stack = __StackTop);\n\n\t/* Check if data + heap + stack exceeds RAM limit */\n\tASSERT(__StackLimit >= __HeapLimit, \"region RAM overflowed with stack\")\n}\n"
  },
  {
    "path": "hw/bsp/nuc505/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include \"NUC505Series.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USBD_IRQHandler(void)\n{\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\nvoid board_init(void)\n{\n  /* Enable XTAL */\n  CLK->PWRCTL |= CLK_PWRCTL_HXTEN_Msk;\n\n  CLK_SetCoreClock(96000000);\n\n  /* Set PCLK divider */\n  CLK_SetModuleClock(PCLK_MODULE, 0, 1);\n\n  /* Update System Core Clock */\n  SystemCoreClockUpdate();\n\n  /* Enable USB IP clock */\n  CLK_EnableModuleClock(USBD_MODULE);\n\n  /* Select USB IP clock source */\n  CLK_SetModuleClock(USBD_MODULE, CLK_USBD_SRC_EXT, 0);\n\n  CLK_SetModuleClock(PCLK_MODULE, 0, 1);\n\n  /* Enable PHY */\n  USBD_ENABLE_PHY();\n  /* wait PHY clock ready */\n  while (1) {\n      USBD->EP[EPA].EPMPS = 0x20;\n      if (USBD->EP[EPA].EPMPS == 0x20)\n          break;\n  }\n\n  /* Force SE0, and then clear it to connect*/\n  USBD_SET_SE0();\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(96000000 / 1000);\n#endif\n\n  GPIO_SetMode(LED_PORT, 1UL << LED_PIN, GPIO_MODE_OUTPUT);\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler (void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  uint32_t current = (state) ? LED_STATE_ON : (1-LED_STATE_ON);\n  current <<= LED_PIN;\n  uint32_t irq_state = __get_PRIMASK();\n  __disable_irq();\n  current |= LED_PORT->DOUT & ~(1UL << LED_PIN);\n  LED_PORT->DOUT = current;\n  __set_PRIMASK(irq_state);\n}\n\nuint32_t board_button_read(void)\n{\n  return 0;\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n"
  },
  {
    "path": "hw/bsp/nuc505/family.cmake",
    "content": "include_guard()\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(SDK_DIR ${TOP}/hw/mcu/nuvoton/nuc505)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\nset(OPENOCD_OPTION \"-f interface/nulink.cfg -f target/numicroM4.cfg\")\n\nset(FAMILY_MCUS NUC505 CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/Device/Nuvoton/NUC505Series/Source/GCC/startup_NUC505Series.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/Device/Nuvoton/NUC505Series/Source/system_NUC505Series.c\n    ${SDK_DIR}/StdDriver/src/adc.c\n    ${SDK_DIR}/StdDriver/src/clk.c\n    ${SDK_DIR}/StdDriver/src/gpio.c\n    ${SDK_DIR}/StdDriver/src/i2c.c\n    ${SDK_DIR}/StdDriver/src/i2s.c\n    ${SDK_DIR}/StdDriver/src/pwm.c\n    ${SDK_DIR}/StdDriver/src/rtc.c\n    ${SDK_DIR}/StdDriver/src/spi.c\n    ${SDK_DIR}/StdDriver/src/spim.c\n    ${SDK_DIR}/StdDriver/src/sys.c\n    ${SDK_DIR}/StdDriver/src/timer.c\n    ${SDK_DIR}/StdDriver/src/uart.c\n    ${SDK_DIR}/StdDriver/src/wdt.c\n    ${SDK_DIR}/StdDriver/src/wwdt.c\n    )\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/Device/Nuvoton/NUC505Series/Include\n    ${SDK_DIR}/StdDriver/inc\n    ${SDK_DIR}/CMSIS/Include\n  )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_NUC505)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/nuvoton/nuc505/dcd_nuc505.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n    target_compile_options(${TARGET} PRIVATE -Wno-redundant-decls)\n\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--script=${LD_FILE_Clang}\")\n    target_compile_options(${TARGET} PRIVATE -Wno-redundant-decls)\n\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--config=${LD_FILE_IAR}\")\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES\n      COMPILE_FLAGS \"-Wno-missing-prototypes -Wno-redundant-decls\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  family_flash_openocd_nuvoton(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/nuc505/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n  -flto \\\n  -DCFG_TUSB_MCU=OPT_MCU_NUC505\n\nCPU_CORE ?= cortex-m4\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=redundant-decls\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\n# LD_FILE is defined in board.mk\n\nSRC_C += \\\n  src/portable/nuvoton/nuc505/dcd_nuc505.c \\\n  hw/mcu/nuvoton/nuc505/Device/Nuvoton/NUC505Series/Source/system_NUC505Series.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/adc.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/clk.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/gpio.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/i2c.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/i2s.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/pwm.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/rtc.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/spi.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/spim.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/sys.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/timer.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/uart.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/wdt.c \\\n  hw/mcu/nuvoton/nuc505/StdDriver/src/wwdt.c\n\nSRC_S += \\\n  hw/mcu/nuvoton/nuc505/Device/Nuvoton/NUC505Series/Source/GCC/startup_NUC505Series.S\n\nINC += \\\n  $(TOP)/hw/mcu/nuvoton/nuc505/Device/Nuvoton/NUC505Series/Include \\\n  $(TOP)/hw/mcu/nuvoton/nuc505/StdDriver/inc \\\n  $(TOP)/hw/mcu/nuvoton/nuc505/CMSIS/Include \\\n  $(TOP)/$(BOARD_PATH)\n\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/ARM_CM4F\n\n# Note\n# To be able to program the SPI flash, it need to boot with ICP mode \"1011\".\n# However, in ICP mode, opencod cannot establish connection to the mcu.\n# Therefore, there is no easy command line flash for NUC505\n# It is probably better to just use Nuvoton NuMicro ICP programming on windows to program the board\n\n# Flash using Nuvoton's openocd fork at https://github.com/OpenNuvoton/OpenOCD-Nuvoton\n# Please compile and install it from github source\nOPENOCD_NUVOTON_PATH ?= $(HOME)/app/OpenOCD-Nuvoton\nflash: $(BUILD)/$(PROJECT).elf\n\t$(OPENOCD_NUVOTON_PATH)/src/openocd -s $(OPENOCD_NUVOTON_PATH)/tcl -f interface/nulink.cfg -f target/numicroM4.cfg -c \"program $< reset exit\"\n"
  },
  {
    "path": "hw/bsp/pic32mz/boards/olimex_emz64/board.h",
    "content": "/*\n* The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Olimex PIC32-EMZ64\n   url: https://www.olimex.com/Products/PIC/Development/PIC32-EMZ64/open-source-hardware\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/pic32mz/boards/olimex_emz64/board.mk",
    "content": "JLINK_DEVICE=PIC32MZ2048EFH064\nJLINK_IF=ICSP\n\nCFLAGS += \\\n  -mprocessor=32MZ2048EFH064 \\\n"
  },
  {
    "path": "hw/bsp/pic32mz/boards/olimex_emz64/olimex_emz64.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include <stdint.h>\n#include <stdbool.h>\n#include <xc.h>\n#include \"tusb.h\"\n\n/* JTAG on, WDT off */\n#pragma config FDMTEN=0, FSOSCEN=0, DMTCNT=1\n#pragma config DEBUG=ON\n#pragma config JTAGEN=ON\n#pragma config FSLEEP=OFF\n#pragma config TRCEN=OFF\n#pragma config ICESEL=ICS_PGx2\n\n#pragma config POSCMOD = EC\n#pragma config FNOSC = SPLL\n/* 24MHz posc input to pll, div by 3, multiply by 50, div by 2 -> 200mhz*/\n#pragma config FPLLICLK=0, FPLLIDIV=DIV_3, FPLLRNG=RANGE_5_10_MHZ, FPLLMULT=MUL_50, FPLLODIV=DIV_2\n#pragma config FUSBIDIO=1\n#pragma config WINDIS=NORMAL\n#pragma config WDTSPGM=1\n#pragma config WDTPS=15\n#pragma config FWDTEN=OFF\n\nvoid button_init(void)\n{\n  // RB12 - button\n  // ANSELB B12 not analog\n  ANSELBCLR = TU_BIT(12);\n  // TRISB B12 input\n  TRISBSET = TU_BIT(12);\n  // Pull-up\n  CNPUBSET = TU_BIT(12);\n}\n\nvoid led_init(void)\n{\n  // RB8 - LED\n  // ANASELB RB8 not analog\n  ANSELBCLR = TU_BIT(8);\n  // TRISH RH2 output\n  TRISBCLR = TU_BIT(8);\n  // Initial value 0, LED off\n  LATBCLR = TU_BIT(8);\n}\n\nvoid uart_init(void)\n{\n  // RD4/RD0 Uart4 TX/RX\n  // ANSELD - not present on 64 pin device\n\n  /* Unlock system for PPS configuration */\n  SYSKEY = 0x00000000;\n  SYSKEY = 0xAA996655;\n  SYSKEY = 0x556699AA;\n  CFGCONbits.IOLOCK = 0;\n\n  // PPS Input Remapping\n  // U4RX -> RD0\n  U4RXR = 3;\n\n  // PPS Output Remapping\n  // RD4 -> U4TX\n  RPD4R = 2;\n\n  // Lock back the system after PPS configuration\n  CFGCONbits.IOLOCK = 1;\n  SYSKEY = 0x00000000;\n\n  // UART4\n  // High speed mode\n  // 8 bits, no parity, no RTS/CTS, no flow control\n  U4MODE = 0x0;\n\n  // Enable UART2 Receiver and Transmitter\n  U4STASET = (_U4STA_UTXEN_MASK | _U4STA_URXEN_MASK | _U4STA_UTXISEL1_MASK);\n\n  // BAUD Rate register Setup\n  U4BRG = 100000000 / (16 * 115200) + 1;\n\n  // Disable Interrupts\n  IEC4CLR = _IEC5_U4EIE_MASK | _IEC5_U4RXIE_MASK | _IEC5_U4TXIE_MASK;\n\n  // Turn ON UART2\n  U4MODESET = _U4MODE_ON_MASK;\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  if (state)\n  {\n    LATBSET = TU_BIT(8);\n  }\n  else\n  {\n    LATBCLR = TU_BIT(8);\n  }\n}\n\nuint32_t board_button_read(void)\n{\n  return ((PORTB >> 12) & 1) == 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  int i = len;\n  uint8_t const * data = buf;\n  while (i--)\n  {\n    while (U4STAbits.UTXBF) ;\n    U4TXREG = *data++;\n  }\n  return len;\n}\n"
  },
  {
    "path": "hw/bsp/pic32mz/boards/olimex_hmz144/board.h",
    "content": "/*\n* The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Olimex PIC32-HMZ144\n   url: https://www.olimex.com/Products/PIC/Development/PIC32-HMZ144/open-source-hardware\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/pic32mz/boards/olimex_hmz144/board.mk",
    "content": "JLINK_DEVICE=PIC32MZ2048EFM144\nJLINK_IF=ICSP\n\nCFLAGS += \\\n  -mprocessor=32MZ2048EFM144 \\\n"
  },
  {
    "path": "hw/bsp/pic32mz/boards/olimex_hmz144/olimex_hmz144.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include <stdint.h>\n#include <stdbool.h>\n#include <xc.h>\n#include \"tusb.h\"\n\n/* JTAG on, WDT off */\n#pragma config FDMTEN=0, FSOSCEN=0, DMTCNT=1\n#pragma config DEBUG=ON\n#pragma config JTAGEN=ON\n#pragma config FSLEEP=OFF\n#pragma config TRCEN=OFF\n#pragma config ICESEL=ICS_PGx2\n\n#pragma config POSCMOD = HS\n#pragma config FNOSC = SPLL\n/* 24MHz posc input to pll, div by 3, multiply by 50, div by 2 -> 200mhz*/\n#pragma config FPLLICLK=0, FPLLIDIV=DIV_3, FPLLRNG=RANGE_5_10_MHZ, FPLLMULT=MUL_50, FPLLODIV=DIV_2\n#pragma config FUSBIDIO=1\n#pragma config WINDIS=NORMAL\n#pragma config WDTSPGM=1\n#pragma config WDTPS=15\n#pragma config FWDTEN=OFF\n\nvoid button_init(void)\n{\n  // RB12 - button\n  // ANSELB B12 not analog\n  ANSELBCLR = TU_BIT(12);\n  // TRISB B12 input\n  TRISBSET = TU_BIT(12);\n}\n\nvoid led_init(void)\n{\n  // RH2 - LED\n  // ANASELH no analog function on RH2\n  // TRISH RH2 output\n  TRISHCLR = TU_BIT(2);\n  // Initial value 0, LED off\n  LATHCLR = TU_BIT(2);\n}\n\nvoid uart_init(void)\n{\n  // RE8/RE9 Uart2 TX/RX\n  // ANSELE - TX/RX not analog\n  ANSELECLR = TU_BIT(8) | TU_BIT(9);\n\n  /* Unlock system for PPS configuration */\n  SYSKEY = 0x00000000;\n  SYSKEY = 0xAA996655;\n  SYSKEY = 0x556699AA;\n  CFGCONbits.IOLOCK = 0;\n\n  // PPS Input Remapping\n  // U2RX -> RE9\n  U2RXR = 13;\n\n  // PPS Output Remapping\n  // RE8 -> U2TX\n  RPE8R = 2;\n\n  // Lock back the system after PPS configuration\n  CFGCONbits.IOLOCK = 1;\n  SYSKEY = 0x00000000;\n\n  // UART2\n  // High speed mode\n  // 8 bits, no parity, no RTS/CTS, no flow control\n  U2MODE = 0x0;\n\n  // Enable UART2 Receiver and Transmitter\n  U2STASET = (_U2STA_UTXEN_MASK | _U2STA_URXEN_MASK | _U2STA_UTXISEL1_MASK);\n\n  // BAUD Rate register Setup\n  U2BRG = 100000000 / (16 * 115200) + 1;\n\n  // Disable Interrupts\n  IEC4CLR = _IEC4_U2EIE_MASK | _IEC4_U2RXIE_MASK | _IEC4_U2TXIE_MASK;\n\n  // Turn ON UART2\n  U2MODESET = _U2MODE_ON_MASK;\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  if (state)\n  {\n    LATHSET = TU_BIT(2);\n  }\n  else\n  {\n    LATHCLR = TU_BIT(2);\n  }\n}\n\nuint32_t board_button_read(void)\n{\n  return ((PORTB >> 12) & 1) == 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  int i = len;\n  uint8_t const * data = buf;\n  while (i--)\n  {\n    while (U2STAbits.UTXBF) ;\n    U2TXREG = *data++;\n  }\n  return len;\n}\n"
  },
  {
    "path": "hw/bsp/pic32mz/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Microchip\n*/\n\n#include <stdint.h>\n#include <stdbool.h>\n#include <xc.h>\n#include \"tusb.h\"\n\nvoid __attribute__((interrupt(IPL2AUTO), vector(_USB_VECTOR), no_fpu))\nUSBD_IRQHandler(void)\n{\n  IFS4CLR = _IFS4_USBIF_MASK;\n  tud_int_handler(0);\n}\n\nTU_ATTR_WEAK void button_init(void)\n{\n}\n\nTU_ATTR_WEAK void led_init(void)\n{\n}\n\nTU_ATTR_WEAK void uart_init(void)\n{\n}\n\nvoid board_init(void)\n{\n  button_init();\n  led_init();\n  uart_init();\n\n  // Force device mode by overriding USB ID and settings it to 1\n  USBCRCONbits.PHYIDEN = 0;\n  USBCRCONbits.USBIDVAL = 1;\n  USBCRCONbits.USBIDOVEN = 1;\n\n  // set interrupt priority (must much IPL2AUTO)\n  IPC33CLR = _IPC33_USBIP_MASK;\n  IPC33SET = (2 << _IPC33_USBIP_POSITION);\n  // set interrupt subpriority\n  IPC33CLR = _IPC33_USBIS_MASK;\n  IPC33SET = (0 << _IPC33_USBIS_POSITION);\n\n  USBCRCONbits.USBIE = 0;\n  IFS4CLR = _IFS4_USBIF_MASK;\n  IEC4SET = _IEC4_USBIE_MASK;\n\n  __builtin_enable_interrupts();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nTU_ATTR_WEAK void board_led_write(bool state)\n{\n  (void) state;\n}\n\nTU_ATTR_WEAK uint32_t board_button_read(void)\n{\n  return 0;\n}\n\nTU_ATTR_WEAK int board_uart_read(uint8_t * buf, int len)\n{\n  (void) buf;\n  (void) len;\n\n  return 0;\n}\n\nTU_ATTR_WEAK int board_uart_write(void const * buf, int len)\n{\n  (void) buf;\n  return len;\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\nuint32_t tusb_time_millis_api(void)\n{\n  // COUNTER is system clock (200MHz / 2 = 100MHz) convert to ms)\n  return _CP0_GET_COUNT() / (100000000 / 1000);\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/pic32mz/family.mk",
    "content": "CROSS_COMPILE = xc32-\nCFLAGS_OPTIMIZED = -O2\nLIBS_GCC = -lgcc -lm\nSKIP_NANOLIB = 1\n\nCFLAGS = \\\n  -std=c99 \\\n  -DCFG_TUSB_MCU=OPT_MCU_PIC32MZ\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nSRC_C += \\\n\tsrc/portable/microchip/pic32mz/dcd_pic32mz.c \\\n\nINC += \\\n\t$(TOP)/hw/mcu/microchip/pic32mz \\\n\t$(TOP)/$(BOARD_PATH) \\\n\n# flash target using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/ra/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#pragma GCC diagnostic ignored \"-Wundef\"\n\n// extra push due to https://github.com/renesas/fsp/pull/278\n#pragma GCC diagnostic push\n#endif\n\n#include \"bsp_api.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/board_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BOARD_CFG_H_\n#define BOARD_CFG_H_\n#ifdef __cplusplus\n        extern \"C\" {\n        #endif\n\n        void bsp_init(void * p_args);\n\n        #ifdef __cplusplus\n        }\n        #endif\n#endif /* BOARD_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\nset(MCU_VARIANT ra6m5)\n\nset(JLINK_DEVICE R7FA6M5BH)\nset(DFU_UTIL_VID_PID 2341:0368)\n\n# device default to PORT 1 High Speed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Arduino Portenta C33\n   url: https://www.arduino.cc/pro/hardware-product-portenta-c33/\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_STATE_ON          1\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/board.mk",
    "content": "CPU_CORE = cortex-m33\nMCU_VARIANT = ra6m5\n\n# Port 1 is highspeed\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nJLINK_DEVICE = R7FA6M5BH\nDFU_UTIL_OPTION = -d 2341:0368 -a 0\n\nflash: flash-dfu-util\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_cfg/fsp_cfg/bsp/bsp_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CFG_H_\n#define BSP_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_clock_cfg.h\"\n            #include \"bsp_mcu_family_cfg.h\"\n            #include \"board_cfg.h\"\n            #define RA_NOT_DEFINED 0\n            #ifndef BSP_CFG_RTOS\n             #if (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (2)\n             #elif (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (1)\n             #else\n              #define BSP_CFG_RTOS (0)\n             #endif\n            #endif\n            #ifndef BSP_CFG_RTC_USED\n             #define BSP_CFG_RTC_USED (RA_NOT_DEFINED)\n            #endif\n            #undef RA_NOT_DEFINED\n            #if defined(_RA_BOOT_IMAGE)\n             #define BSP_CFG_BOOT_IMAGE (1)\n            #endif\n            #define BSP_CFG_MCU_VCC_MV (3300)\n            #define BSP_CFG_STACK_MAIN_BYTES (0x1000)\n            #define BSP_CFG_HEAP_BYTES (0x1000)\n            #define BSP_CFG_PARAM_CHECKING_ENABLE (0)\n            #define BSP_CFG_ASSERT (0)\n            #define BSP_CFG_ERROR_LOG (0)\n\n            #define BSP_CFG_PFS_PROTECT ((1))\n\n            #define BSP_CFG_C_RUNTIME_INIT ((1))\n            #define BSP_CFG_EARLY_INIT     ((0))\n\n            #define BSP_CFG_STARTUP_CLOCK_REG_NOT_RESET ((0))\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_POPULATED\n            #define BSP_CLOCK_CFG_MAIN_OSC_POPULATED (1)\n            #endif\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE\n            #define BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_DRIVE\n            #define BSP_CLOCK_CFG_SUBCLOCK_DRIVE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_POPULATED\n            #define BSP_CLOCK_CFG_SUBCLOCK_POPULATED (1)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS\n            #define BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS 1000\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_CFG_H_\n#define BSP_MCU_DEVICE_CFG_H_\n#define BSP_CFG_MCU_PART_SERIES (6)\n#endif /* BSP_MCU_DEVICE_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_pn_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_R7FA6M5BH3CFC\n      #define BSP_MCU_FEATURE_SET ('B')\n      #define BSP_ROM_SIZE_BYTES (2097152)\n      #define BSP_RAM_SIZE_BYTES (524288)\n      #define BSP_DATA_FLASH_SIZE_BYTES (8192)\n      #define BSP_PACKAGE_LQFP\n      #define BSP_PACKAGE_PINS (176)\n#endif /* BSP_MCU_DEVICE_PN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_cfg/fsp_cfg/bsp/bsp_mcu_family_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_FAMILY_CFG_H_\n#define BSP_MCU_FAMILY_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n            #include \"bsp_mcu_device_pn_cfg.h\"\n            #include \"bsp_mcu_device_cfg.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra6m5/bsp_mcu_info.h\"\n            #include \"bsp_clock_cfg.h\"\n            #define BSP_MCU_GROUP_RA6M5 (1)\n            #define BSP_LOCO_HZ                 (32768)\n            #define BSP_MOCO_HZ                 (8000000)\n            #define BSP_SUB_CLOCK_HZ            (32768)\n            #if   BSP_CFG_HOCO_FREQUENCY == 0\n                #define BSP_HOCO_HZ                 (16000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 1\n                #define BSP_HOCO_HZ                 (18000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 2\n                #define BSP_HOCO_HZ                 (20000000)\n            #else\n                #error \"Invalid HOCO frequency chosen (BSP_CFG_HOCO_FREQUENCY) in bsp_clock_cfg.h\"\n            #endif\n\n            #define BSP_CFG_FLL_ENABLE                 (0)\n\n            #define BSP_CORTEX_VECTOR_TABLE_ENTRIES    (16U)\n            #define BSP_VECTOR_TABLE_MAX_ENTRIES       (112U)\n            #define BSP_CFG_INLINE_IRQ_FUNCTIONS       (1)\n\n            #if defined(_RA_TZ_SECURE)\n            #define BSP_TZ_SECURE_BUILD           (1)\n            #define BSP_TZ_NONSECURE_BUILD        (0)\n            #elif defined(_RA_TZ_NONSECURE)\n            #define BSP_TZ_SECURE_BUILD           (0)\n            #define BSP_TZ_NONSECURE_BUILD        (1)\n            #else\n            #define BSP_TZ_SECURE_BUILD           (0)\n            #define BSP_TZ_NONSECURE_BUILD        (0)\n            #endif\n\n            /* TrustZone Settings */\n            #define BSP_TZ_CFG_INIT_SECURE_ONLY       (BSP_CFG_CLOCKS_SECURE || (!BSP_CFG_CLOCKS_OVERRIDE))\n            #define BSP_TZ_CFG_SKIP_INIT              (BSP_TZ_NONSECURE_BUILD && BSP_TZ_CFG_INIT_SECURE_ONLY)\n            #define BSP_TZ_CFG_EXCEPTION_RESPONSE     (0)\n\n            /* CMSIS TrustZone Settings */\n            #define SCB_CSR_AIRCR_INIT                (1)\n            #define SCB_AIRCR_BFHFNMINS_VAL           (0)\n            #define SCB_AIRCR_SYSRESETREQS_VAL        (1)\n            #define SCB_AIRCR_PRIS_VAL                (0)\n            #define TZ_FPU_NS_USAGE                   (1)\n#ifndef SCB_NSACR_CP10_11_VAL\n            #define SCB_NSACR_CP10_11_VAL             (3U)\n#endif\n\n#ifndef FPU_FPCCR_TS_VAL\n            #define FPU_FPCCR_TS_VAL                  (1U)\n#endif\n            #define FPU_FPCCR_CLRONRETS_VAL           (1)\n\n#ifndef FPU_FPCCR_CLRONRET_VAL\n            #define FPU_FPCCR_CLRONRET_VAL            (1)\n#endif\n\n            /* The C-Cache line size that is configured during startup. */\n#ifndef BSP_CFG_C_CACHE_LINE_SIZE\n            #define BSP_CFG_C_CACHE_LINE_SIZE   (1U)\n#endif\n\n            /* Type 1 Peripheral Security Attribution */\n\n            /* Peripheral Security Attribution Register (PSAR) Settings */\n#ifndef BSP_TZ_CFG_PSARB\n#define BSP_TZ_CFG_PSARB (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* CAN1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* CAN0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* IIC1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9) /* IIC0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* USBFS */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 18) /* SPI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 19) /* SPI0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* SCI9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 23) /* SCI8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 24) /* SCI7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 25) /* SCI6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 26) /* SCI5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* SCI4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* SCI3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 29) /* SCI2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 30) /* SCI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* SCI0 */ | \\\n            0x33f4f9) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARC\n#define BSP_TZ_CFG_PSARC (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* CAC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* CRC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3) /* CTSU */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* SSIE0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* SDHI0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13) /* DOC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* SCE9 */ | \\\n            0x7fffcef4) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARD\n#define BSP_TZ_CFG_PSARD (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* AGT3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* AGT2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* AGT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3) /* AGT0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* POEG3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* POEG2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13) /* POEG1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14) /* POEG0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15) /* ADC1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 16) /* ADC0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 20) /* DAC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* TSN */ | \\\n            0xffae07f0) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARE\n#define BSP_TZ_CFG_PSARE (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* WDT */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* IWDT */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* RTC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14) /* AGT5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15) /* AGT4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* GPT9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 23) /* GPT8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 24) /* GPT7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 25) /* GPT6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 26) /* GPT5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* GPT4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* GPT3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 29) /* GPT2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 30) /* GPT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* GPT0 */ | \\\n            0x3f3ff8) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_MSSAR\n#define BSP_TZ_CFG_MSSAR (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* ELC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* DTC_DMAC */ | \\\n            0xfffffffc) /* Unused */\n#endif\n\n            /* Type 2 Peripheral Security Attribution */\n\n            /* Security attribution for Cache registers. */\n#ifndef BSP_TZ_CFG_CSAR\n#define BSP_TZ_CFG_CSAR (0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for RSTSRn registers. */\n#ifndef BSP_TZ_CFG_RSTSAR\n#define BSP_TZ_CFG_RSTSAR (0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for registers of LVD channels. */\n#ifndef BSP_TZ_CFG_LVDSAR\n#define BSP_TZ_CFG_LVDSAR (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) | /* LVD Channel 1 */ \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) | /* LVD Channel 2 */ \\\n            0xFFFFFFFCU)\n#endif\n\n            /* Security attribution for LPM registers. */\n#ifndef BSP_TZ_CFG_LPMSAR\n#define BSP_TZ_CFG_LPMSAR ((RA_NOT_DEFINED > 0) ? 0xFFFFFCEAU : 0xFFFFFFFFU)\n#endif\n            /* Deep Standby Interrupt Factor Security Attribution Register. */\n#ifndef BSP_TZ_CFG_DPFSAR\n#define BSP_TZ_CFG_DPFSAR ((RA_NOT_DEFINED > 0) ? 0xF2E00000U : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for CGC registers. */\n#ifndef BSP_TZ_CFG_CGFSAR\n#if BSP_CFG_CLOCKS_SECURE\n/* Protect all CGC registers from Non-secure write access. */\n#define BSP_TZ_CFG_CGFSAR (0xFFFCE402U)\n#else\n/* Allow Secure and Non-secure write access. */\n#define BSP_TZ_CFG_CGFSAR (0xFFFFFFFFU)\n#endif\n#endif\n\n            /* Security attribution for Battery Backup registers. */\n#ifndef BSP_TZ_CFG_BBFSAR\n#define BSP_TZ_CFG_BBFSAR (0x00FFFFFF)\n#endif\n\n            /* Security attribution for registers for IRQ channels. */\n#ifndef BSP_TZ_CFG_ICUSARA\n#define BSP_TZ_CFG_ICUSARA (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0U) /* External IRQ0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1U) /* External IRQ1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2U) /* External IRQ2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3U) /* External IRQ3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4U) /* External IRQ4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5U) /* External IRQ5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 6U) /* External IRQ6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7U) /* External IRQ7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8U) /* External IRQ8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9U) /* External IRQ9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 10U) /* External IRQ10 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11U) /* External IRQ11 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12U) /* External IRQ12 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13U) /* External IRQ13 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14U) /* External IRQ14 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15U) /* External IRQ15 */ | \\\n            0xFFFF0000U)\n#endif\n\n            /* Security attribution for NMI registers. */\n#ifndef BSP_TZ_CFG_ICUSARB\n#define BSP_TZ_CFG_ICUSARB (0 | 0xFFFFFFFEU) /* Should match AIRCR.BFHFNMINS. */\n#endif\n\n            /* Security attribution for registers for DMAC channels */\n#ifndef BSP_TZ_CFG_ICUSARC\n#define BSP_TZ_CFG_ICUSARC (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0U) /* DMAC Channel 0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1U) /* DMAC Channel 1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2U) /* DMAC Channel 2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3U) /* DMAC Channel 3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4U) /* DMAC Channel 4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5U) /* DMAC Channel 5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 6U) /* DMAC Channel 6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7U) /* DMAC Channel 7 */ | \\\n            0xFFFFFF00U)\n#endif\n\n            /* Security attribution registers for SELSR0. */\n#ifndef BSP_TZ_CFG_ICUSARD\n#define BSP_TZ_CFG_ICUSARD ((RA_NOT_DEFINED > 0) ? 0xFFFFFFFEU : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution registers for WUPEN0. */\n#ifndef BSP_TZ_CFG_ICUSARE\n#define BSP_TZ_CFG_ICUSARE ((RA_NOT_DEFINED > 0) ? 0x04F2FFFFU : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution registers for WUPEN1. */\n#ifndef BSP_TZ_CFG_ICUSARF\n#define BSP_TZ_CFG_ICUSARF ((RA_NOT_DEFINED > 0) ? 0xFFFFFFF8U : 0xFFFFFFFFU)\n#endif\n\n            /* Set DTCSTSAR if the Secure program uses the DTC. */\n#if RA_NOT_DEFINED == RA_NOT_DEFINED\n #define BSP_TZ_CFG_DTC_USED (0U)\n#else\n #define BSP_TZ_CFG_DTC_USED (1U)\n#endif\n\n            /* Security attribution of FLWT and FCKMHZ registers. */\n#ifndef BSP_TZ_CFG_FSAR\n/* If the CGC registers are only accessible in Secure mode, than there is no\n * reason for nonsecure applications to access FLWT and FCKMHZ. */\n#if BSP_CFG_CLOCKS_SECURE\n/* Protect FLWT and FCKMHZ registers from nonsecure write access. */\n#define BSP_TZ_CFG_FSAR (0xFEFEU)\n#else\n/* Allow Secure and Non-secure write access. */\n#define BSP_TZ_CFG_FSAR (0xFFFFU)\n#endif\n#endif\n\n            /* Security attribution for SRAM registers. */\n#ifndef BSP_TZ_CFG_SRAMSAR\n/* If the CGC registers are only accessible in Secure mode, than there is no reason for Non Secure applications to access\n * SRAM0WTEN and therefore there is no reason to access PRCR2. */\n    #define BSP_TZ_CFG_SRAMSAR (\\\n        1 | \\\n        ((BSP_CFG_CLOCKS_SECURE == 0) ? (1U << 1U) : 0U) | \\\n        4 | \\\n        0xFFFFFFF8U)\n#endif\n\n            /* Security attribution for Standby RAM registers. */\n#ifndef BSP_TZ_CFG_STBRAMSAR\n    #define BSP_TZ_CFG_STBRAMSAR (0 | 0xFFFFFFF0U)\n#endif\n\n            /* Security attribution for the DMAC Bus Master MPU settings. */\n#ifndef BSP_TZ_CFG_MMPUSARA\n    /* The DMAC Bus Master MPU settings should align with the DMAC channel settings. */\n    #define BSP_TZ_CFG_MMPUSARA (BSP_TZ_CFG_ICUSARC)\n#endif\n\n            /* Security Attribution Register A for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARA\n    #define BSP_TZ_CFG_BUSSARA (0xFFFFFFFFU)\n#endif\n            /* Security Attribution Register B for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARB\n    #define BSP_TZ_CFG_BUSSARB (0xFFFFFFFFU)\n#endif\n\n            /* Enable Uninitialized Non-Secure Application Fallback. */\n#ifndef BSP_TZ_CFG_NON_SECURE_APPLICATION_FALLBACK\n    #define BSP_TZ_CFG_NON_SECURE_APPLICATION_FALLBACK (1U)\n#endif\n\n\n            #define OFS_SEQ1 0xA001A001 | (1 << 1) | (3 << 2)\n            #define OFS_SEQ2 (15 << 4) | (3 << 8) | (3 << 10)\n            #define OFS_SEQ3 (1 << 12) | (1 << 14) | (1 << 17)\n            #define OFS_SEQ4 (3 << 18) |(15 << 20) | (3 << 24) | (3 << 26)\n            #define OFS_SEQ5 (1 << 28) | (1 << 30)\n            #define BSP_CFG_ROM_REG_OFS0 (OFS_SEQ1 | OFS_SEQ2 | OFS_SEQ3 | OFS_SEQ4 | OFS_SEQ5)\n\n            /* Option Function Select Register 1 Security Attribution */\n#ifndef BSP_CFG_ROM_REG_OFS1_SEL\n#if defined(_RA_TZ_SECURE) || defined(_RA_TZ_NONSECURE)\n            #define BSP_CFG_ROM_REG_OFS1_SEL (0xFFFFF8F8U | ((0U << 0U)) | ((0U << 2U)) | ((BSP_CFG_CLOCKS_SECURE == 0) ? 0x700U : 0U))\n#else\n            #define BSP_CFG_ROM_REG_OFS1_SEL (0xFFFFF8F8U)\n#endif\n#endif\n\n            #define BSP_CFG_ROM_REG_OFS1 (0xFFFFFEF8 | (1 << 2) | (3) |  (1 << 8))\n\n            /* Used to create IELS values for the interrupt initialization table g_interrupt_event_link_select. */\n            #define BSP_PRV_IELS_ENUM(vector)    (ELC_ ## vector)\n\n            /* Dual Mode Select Register */\n#ifndef BSP_CFG_ROM_REG_DUALSEL\n            #define BSP_CFG_ROM_REG_DUALSEL (0xFFFFFFF8U | (0x7U))\n#endif\n\n            /* Block Protection Register 0 */\n#ifndef BSP_CFG_ROM_REG_BPS0\n            #define BSP_CFG_ROM_REG_BPS0 (~( 0U))\n#endif\n            /* Block Protection Register 1 */\n#ifndef BSP_CFG_ROM_REG_BPS1\n            #define BSP_CFG_ROM_REG_BPS1 (~( 0U))\n#endif\n            /* Block Protection Register 2 */\n#ifndef BSP_CFG_ROM_REG_BPS2\n            #define BSP_CFG_ROM_REG_BPS2 (~( 0U))\n#endif\n            /* Block Protection Register 3 */\n#ifndef BSP_CFG_ROM_REG_BPS3\n            #define BSP_CFG_ROM_REG_BPS3 (0xFFFFFFFFU)\n#endif\n            /* Permanent Block Protection Register 0 */\n#ifndef BSP_CFG_ROM_REG_PBPS0\n            #define BSP_CFG_ROM_REG_PBPS0 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 1 */\n#ifndef BSP_CFG_ROM_REG_PBPS1\n            #define BSP_CFG_ROM_REG_PBPS1 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 2 */\n#ifndef BSP_CFG_ROM_REG_PBPS2\n            #define BSP_CFG_ROM_REG_PBPS2 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 3 */\n#ifndef BSP_CFG_ROM_REG_PBPS3\n            #define BSP_CFG_ROM_REG_PBPS3 (0xFFFFFFFFU)\n#endif\n            /* Security Attribution for Block Protection Register 0 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL0\n            #define BSP_CFG_ROM_REG_BPS_SEL0 (BSP_CFG_ROM_REG_BPS0 & BSP_CFG_ROM_REG_PBPS0)\n#endif\n            /* Security Attribution for Block Protection Register 1 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL1\n            #define BSP_CFG_ROM_REG_BPS_SEL1 (BSP_CFG_ROM_REG_BPS1 & BSP_CFG_ROM_REG_PBPS1)\n#endif\n            /* Security Attribution for Block Protection Register 2 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL2\n            #define BSP_CFG_ROM_REG_BPS_SEL2 (BSP_CFG_ROM_REG_BPS2 & BSP_CFG_ROM_REG_PBPS2)\n#endif\n            /* Security Attribution for Block Protection Register 3 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL3\n            #define BSP_CFG_ROM_REG_BPS_SEL3 (BSP_CFG_ROM_REG_BPS3 & BSP_CFG_ROM_REG_PBPS3)\n#endif\n            /* Security Attribution for Bank Select Register */\n#ifndef BSP_CFG_ROM_REG_BANKSEL_SEL\n            #define BSP_CFG_ROM_REG_BANKSEL_SEL (0xFFFFFFFFU)\n#endif\n#ifndef BSP_CLOCK_CFG_MAIN_OSC_WAIT\n            #define BSP_CLOCK_CFG_MAIN_OSC_WAIT (9)\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* BSP_MCU_FAMILY_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_cfg/fsp_cfg/bsp/bsp_pin_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_PIN_CFG_H_\n#define BSP_PIN_CFG_H_\n#include \"r_ioport.h\"\n\n/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */\nFSP_HEADER\n\n#define LED1 (BSP_IO_PORT_01_PIN_07)\n#define SW1 (BSP_IO_PORT_04_PIN_08)\nextern const ioport_cfg_t g_bsp_pin_cfg; /* R7FA6M5BH3CFC.pincfg */\n\nvoid BSP_PinConfigSecurityInit();\n\n/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */\nFSP_FOOTER\n#endif /* BSP_PIN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_cfg/fsp_cfg/r_ioport_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef R_IOPORT_CFG_H_\n#define R_IOPORT_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define IOPORT_CFG_PARAM_CHECKING_ENABLE (BSP_CFG_PARAM_CHECKING_ENABLE)\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* R_IOPORT_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_gen/bsp_clock_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CLOCK_CFG_H_\n#define BSP_CLOCK_CFG_H_\n#define BSP_CFG_CLOCKS_SECURE (0)\n#define BSP_CFG_CLOCKS_OVERRIDE (0)\n#define BSP_CFG_XTAL_HZ (24000000) /* XTAL 24000000Hz */\n#define BSP_CFG_HOCO_FREQUENCY (2) /* HOCO 20MHz */\n#define BSP_CFG_PLL_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL Src: XTAL */\n#define BSP_CFG_PLL_DIV (BSP_CLOCKS_PLL_DIV_3) /* PLL Div /3 */\n#define BSP_CFG_PLL_MUL BSP_CLOCKS_PLL_MUL(25U,0U) /* PLL Mul x25.0 */\n#define BSP_CFG_PLL2_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL2 Src: XTAL */\n#define BSP_CFG_PLL2_DIV (BSP_CLOCKS_PLL_DIV_2) /* PLL2 Div /2 */\n#define BSP_CFG_PLL2_MUL BSP_CLOCKS_PLL_MUL(20U,0U) /* PLL2 Mul x20.0 */\n#define BSP_CFG_CLOCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL) /* Clock Src: PLL */\n#define BSP_CFG_CLKOUT_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CLKOUT Disabled */\n#define BSP_CFG_UCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL2) /* UCLK Src: PLL2 */\n#define BSP_CFG_U60CK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL2) /* U60CK Src: PLL2 */\n#define BSP_CFG_OCTA_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* OCTASPICLK Disabled */\n#define BSP_CFG_CANFDCLK_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CANFDCLK Disabled */\n#define BSP_CFG_CECCLK_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CECCLK Disabled */\n#define BSP_CFG_ICLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* ICLK Div /1 */\n#define BSP_CFG_PCLKA_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKA Div /2 */\n#define BSP_CFG_PCLKB_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* PCLKB Div /4 */\n#define BSP_CFG_PCLKC_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* PCLKC Div /4 */\n#define BSP_CFG_PCLKD_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKD Div /2 */\n#define BSP_CFG_BCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* BCLK Div /2 */\n#define BSP_CFG_BCLK_OUTPUT (2) /* EBCLK Div /2 */\n#define BSP_CFG_FCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* FCLK Div /4 */\n#define BSP_CFG_CLKOUT_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* CLKOUT Div /1 */\n#define BSP_CFG_UCK_DIV (BSP_CLOCKS_USB_CLOCK_DIV_5) /* UCLK Div /5 */\n#define BSP_CFG_U60CK_DIV (BSP_CLOCKS_USB60_CLOCK_DIV_4) /* U60CK Div /4 */\n#define BSP_CFG_OCTA_DIV (BSP_CLOCKS_OCTA_CLOCK_DIV_1) /* OCTASPICLK Div /1 */\n#define BSP_CFG_CANFDCLK_DIV (BSP_CLOCKS_CANFD_CLOCK_DIV_1) /* CANFDCLK Div /1 */\n#define BSP_CFG_CECCLK_DIV (BSP_CLOCKS_CEC_CLOCK_DIV_1) /* CECCLK Div /1 */\n#endif /* BSP_CLOCK_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_gen/common_data.c",
    "content": "/* generated common source file - do not edit */\n#include \"common_data.h\"\nioport_instance_ctrl_t g_ioport_ctrl;\nconst ioport_instance_t g_ioport =\n        {\n            .p_api = &g_ioport_on_ioport,\n            .p_ctrl = &g_ioport_ctrl,\n            .p_cfg = &g_bsp_pin_cfg,\n        };\nvoid g_common_init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_gen/common_data.h",
    "content": "/* generated common header file - do not edit */\n#ifndef COMMON_DATA_H_\n#define COMMON_DATA_H_\n#include <stdint.h>\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n#include \"bsp_pin_cfg.h\"\nFSP_HEADER\n#define IOPORT_CFG_NAME g_bsp_pin_cfg\n#define IOPORT_CFG_OPEN R_IOPORT_Open\n#define IOPORT_CFG_CTRL g_ioport_ctrl\n\n/* IOPORT Instance */\nextern const ioport_instance_t g_ioport;\n\n/* IOPORT control structure. */\nextern ioport_instance_ctrl_t g_ioport_ctrl;\nvoid g_common_init(void);\nFSP_FOOTER\n#endif /* COMMON_DATA_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/ra_gen/pin_data.c",
    "content": "/* generated pin source file - do not edit */\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n\n\nconst ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {\n    {\n        .pin = BSP_IO_PORT_01_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_11_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_HS)\n    },\n};\n\nconst ioport_cfg_t g_bsp_pin_cfg = {\n    .number_of_pins = sizeof(g_bsp_pin_cfg_data)/sizeof(ioport_pin_cfg_t),\n    .p_pin_cfg_data = &g_bsp_pin_cfg_data[0],\n};\n\n#if BSP_TZ_SECURE_BUILD\n\nvoid R_BSP_PinCfgSecurityInit(void);\n\n/* Initialize SAR registers for secure pins. */\nvoid R_BSP_PinCfgSecurityInit(void)\n{\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n    uint32_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #else\n    uint16_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #endif\n    memset(pmsar, 0xFF, BSP_FEATURE_BSP_NUM_PMSAR * sizeof(R_PMISC->PMSAR[0]));\n\n\n    for(uint32_t i = 0; i < g_bsp_pin_cfg.number_of_pins; i++)\n    {\n        uint32_t port_pin = g_bsp_pin_cfg.p_pin_cfg_data[i].pin;\n        uint32_t port = port_pin >> 8U;\n        uint32_t pin = port_pin & 0xFFU;\n        pmsar[port] &= (uint16_t) ~(1U << pin);\n    }\n\n    for(uint32_t i = 0; i < BSP_FEATURE_BSP_NUM_PMSAR; i++)\n    {\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n        R_PMISC->PMSAR[i].PMSAR = (uint16_t) pmsar[i];\n #else\n        R_PMISC->PMSAR[i].PMSAR = pmsar[i];\n #endif\n    }\n\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/script/fsp.ld",
    "content": "/*\n                  Linker File for Renesas FSP\n*/\n\nINCLUDE memory_regions.ld\n\n/* Uncomment and set XIP_SECONDARY_SLOT_IMAGE to 1 below for the secondary XIP application image.*/\n/*\n XIP_SECONDARY_SLOT_IMAGE = 1;\n*/\n\nQSPI_FLASH_PRV_LENGTH = DEFINED(QSPI_FLASH_SIZE) ? ABSOLUTE(QSPI_FLASH_SIZE) : ABSOLUTE(QSPI_FLASH_LENGTH);\nOSPI_DEVICE_0_PRV_LENGTH = DEFINED(OSPI_DEVICE_0_SIZE) ? ABSOLUTE(OSPI_DEVICE_0_SIZE) : ABSOLUTE(OSPI_DEVICE_0_LENGTH);\nOSPI_DEVICE_1_PRV_LENGTH = DEFINED(OSPI_DEVICE_1_SIZE) ? ABSOLUTE(OSPI_DEVICE_1_SIZE) : ABSOLUTE(OSPI_DEVICE_1_LENGTH);\n\n/* If a flat (secure) project has DEFINED RAM_NS_BUFFER_LENGTH, then emit IDAU symbols to allocate non-secure RAM. */\n__RESERVE_NS_RAM = !DEFINED(PROJECT_NONSECURE) && DEFINED(RAM_NS_BUFFER_LENGTH) && (OPTION_SETTING_S_LENGTH != 0);\n\nITCM_START = DEFINED(ITCM_START)? ITCM_START : 0;\nITCM_LENGTH = DEFINED(ITCM_LENGTH)? ITCM_LENGTH : 0;\nDTCM_START = DEFINED(DTCM_START)? DTCM_START : 0;\nDTCM_LENGTH = DEFINED(DTCM_LENGTH)? DTCM_LENGTH : 0;\nRAM_NS_BUFFER_BLOCK_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? ALIGN(RAM_NS_BUFFER_LENGTH, 8192) : 0;\nRAM_NS_BUFFER_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? RAM_NS_BUFFER_LENGTH : 0;\nRAM_NS_BUFFER_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_LENGTH;\nRAM_NS_BUFFER_BLOCK_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_BLOCK_LENGTH;\n\nOPTION_SETTING_START_NS = DEFINED(PROJECT_NONSECURE) ? OPTION_SETTING_START : OPTION_SETTING_START + 0x80;\n\n/* This definition is used to avoid moving the counter in OPTION_SETTING regions for projects that should not configure option settings.\n * Bootloader images do not configure option settings because they are owned by the bootloader.\n * FSP_BOOTABLE_IMAGE is only defined in bootloader images. */\n__bl_FSP_BOOTABLE_IMAGE = 1;\n__bln_FSP_BOOTABLE_IMAGE = 1;\nPROJECT_SECURE_OR_FLAT = (!DEFINED(PROJECT_NONSECURE) || DEFINED(PROJECT_SECURE)) && OPTION_SETTING_LENGTH && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_NS = DEFINED(PROJECT_NONSECURE) && !DEFINED(FSP_BOOTABLE_IMAGE);\n\n__bl_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_APPLICATION_IMAGE_NUMBER == 1 ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         (DEFINED(BOOTLOADER_SECONDARY_USE_QSPI) || DEFINED(BOOTLOADER_SECONDARY_USE_OSPI_B)) ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                          FLASH_APPLICATION_S_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_END    = __bl_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_END = __bl_XIP_SECONDARY_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_FLASH_NS_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_START - FLASH_BOOTLOADER_HEADER_LENGTH + FLASH_APPLICATION_S_LENGTH;\n__bl_FLASH_NSC_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_END - FLASH_APPLICATION_NSC_LENGTH;\n__bl_RAM_NS_START    = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH;\n__bl_RAM_NSC_START   = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       __bl_RAM_NS_START - RAM_APPLICATION_NSC_LENGTH;\n__bl_FLASH_NS_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                            FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                            __bl_FLASH_NS_START + FLASH_BOOTLOADER_HEADER_LENGTH_2;\n__bln_FLASH_IMAGE_START = __bl_FLASH_NS_IMAGE_START | (!DEFINED (NS_OFFSET_START) ? 0 : NS_OFFSET_START);\n__bln_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                           FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                           FLASH_APPLICATION_NS_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH_2;\n\nXIP_SECONDARY_SLOT_IMAGE = DEFINED(XIP_SECONDARY_SLOT_IMAGE) ? XIP_SECONDARY_SLOT_IMAGE : 0;\nFLASH_ORIGIN = !DEFINED(FLASH_IMAGE_START) ? FLASH_START :\n                XIP_SECONDARY_SLOT_IMAGE == 1 ? XIP_SECONDARY_FLASH_IMAGE_START :\n                FLASH_IMAGE_START;\nLIMITED_FLASH_LENGTH = DEFINED(FLASH_IMAGE_LENGTH) ? FLASH_IMAGE_LENGTH :\n                       DEFINED(FLASH_BOOTLOADER_LENGTH) ? FLASH_BOOTLOADER_LENGTH :\n                       FLASH_LENGTH;\nOPTION_SETTING_SAS_SIZE = 0x34;\nOPTION_SETTING_SAS_LENGTH = !DEFINED(OPTION_SETTING_LENGTH) ? 0 :\n                            OPTION_SETTING_LENGTH == 0 ? 0 :\n                            OPTION_SETTING_LENGTH - OPTION_SETTING_SAS_SIZE;\n\n/* Define memory regions. */\nMEMORY\n{\n  ITCM (rx)                       : ORIGIN = ITCM_START, LENGTH = ITCM_LENGTH\n  DTCM (rwx)                      : ORIGIN = DTCM_START, LENGTH = DTCM_LENGTH\n  FLASH (rx)                      : ORIGIN = FLASH_ORIGIN, LENGTH = LIMITED_FLASH_LENGTH\n  RAM (rwx)                       : ORIGIN = RAM_START, LENGTH = RAM_LENGTH\n  DATA_FLASH (rx)                 : ORIGIN = DATA_FLASH_START, LENGTH = DATA_FLASH_LENGTH\n  QSPI_FLASH (rx)                 : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_PRV_LENGTH\n  OSPI_DEVICE_0 (rx)              : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1 (rx)              : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  OSPI_DEVICE_0_RAM (rwx)         : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1_RAM (rwx)         : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  SDRAM (rwx)                     : ORIGIN = SDRAM_START, LENGTH = SDRAM_LENGTH\n  OPTION_SETTING (r)              : ORIGIN = OPTION_SETTING_START, LENGTH = OPTION_SETTING_LENGTH\n  OPTION_SETTING_OFS (r)          : ORIGIN = OPTION_SETTING_START, LENGTH = 0x18\n  OPTION_SETTING_SAS (r)          : ORIGIN = OPTION_SETTING_START + OPTION_SETTING_SAS_SIZE, LENGTH = OPTION_SETTING_SAS_LENGTH\n  OPTION_SETTING_S (r)            : ORIGIN = OPTION_SETTING_S_START, LENGTH = OPTION_SETTING_S_LENGTH\n  ID_CODE (rx)                    : ORIGIN = ID_CODE_START, LENGTH = ID_CODE_LENGTH\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be DEFINED in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n *   __qspi_flash_start__\n *   __qspi_flash_end__\n *   __qspi_flash_code_size__\n *   __qspi_region_max_size__\n *   __qspi_region_start_address__\n *   __qspi_region_end_address__\n *   __ospi_device_0_start__\n *   __ospi_device_0_end__\n *   __ospi_device_0_code_size__\n *   __ospi_device_0_region_max_size__\n *   __ospi_device_0_region_start_address__\n *   __ospi_device_0_region_end_address__\n *   __ospi_device_1_start__\n *   __ospi_device_1_end__\n *   __ospi_device_1_code_size__\n *   __ospi_device_1_region_max_size__\n *   __ospi_device_1_region_start_address__\n *   __ospi_device_1_region_end_address__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .text :\n    {\n        __tz_FLASH_S = ABSOLUTE(FLASH_START);\n        __ROM_Start = .;\n\n        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much\n         * space because ROM registers are at address 0x400 and there is very little space\n         * in between. */\n        KEEP(*(.fixed_vectors*))\n        KEEP(*(.application_vectors*))\n        __Vectors_End = .;\n\n        /* Some devices have a gap of code flash between the vector table and ROM Registers.\n         * The flash gap section allows applications to place code and data in this section. */\n        *(.flash_gap*)\n\n        /* ROM Registers start at address 0x00000400 for devices that do not have the OPTION_SETTING region. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x400;\n        KEEP(*(.rom_registers*))\n\n        /* Reserving 0x100 bytes of space for ROM registers. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x500;\n\n        /* Allocate flash write-boundary-aligned\n         * space for sce9 wrapped public keys for mcuboot if the module is used.\n         */\n        KEEP(*(.mcuboot_sce9_key*))\n\n        *(.text*)\n\n        KEEP(*(.version))\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n        __usb_dev_descriptor_start_fs = .;\n        KEEP(*(.usb_device_desc_fs*))\n        __usb_cfg_descriptor_start_fs = .;\n        KEEP(*(.usb_config_desc_fs*))\n        __usb_interface_descriptor_start_fs = .;\n        KEEP(*(.usb_interface_desc_fs*))\n        __usb_descriptor_end_fs = .;\n        __usb_dev_descriptor_start_hs = .;\n        KEEP(*(.usb_device_desc_hs*))\n        __usb_cfg_descriptor_start_hs = .;\n        KEEP(*(.usb_config_desc_hs*))\n        __usb_interface_descriptor_start_hs = .;\n        KEEP(*(.usb_interface_desc_hs*))\n        __usb_descriptor_end_hs = .;\n\n        KEEP(*(.eh_frame*))\n\n        __ROM_End = .;\n    } > FLASH = 0xFF\n\n    __Vectors_Size = __Vectors_End - __Vectors;\n\n    . = .;\n    __itcm_data_pre_location = .;\n\n    /* Initialized ITCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .itcm_data : ALIGN(16)\n    {\n        /* Start of ITCM Secure Trustzone region. */\n        __tz_ITCM_S = ABSOLUTE(ITCM_START);\n\n        /* All ITCM data start */\n        __itcm_data_start = .;\n\n        KEEP(*(.itcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* All ITCM data end */\n        __itcm_data_end = .;\n\n        /*\n         * Start of the ITCM Non-Secure Trustzone region.\n         * ITCM_NS_START can be used to set a fixed address for non-secure ITCM in secure projects or flat projects.\n         */\n        __tz_ITCM_N = DEFINED(ITCM_NS_START) ? ABSOLUTE(ITCM_NS_START) : ALIGN(__itcm_data_end, 8192);\n    } > ITCM AT > FLASH = 0x00\n\n    /* Addresses exported for ITCM initialization. */\n    __itcm_data_init_start = LOADADDR(.itcm_data);\n    __itcm_data_init_end = LOADADDR(.itcm_data) + SIZEOF(.itcm_data);\n\n    ASSERT(ORIGIN(ITCM) % 8 == 0, \"ITCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(ITCM) % 8 == 0, \"ITCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.itcm_data) % 16 == 0, \".itcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.itcm_data) % 8 == 0, \".itcm_data section size must be a multiple of 8 bytes.\")\n\n    /* Restore location counter. */\n    /* If ITCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If ITCM is present, this will be the absolute address that follows the ITCM ROM location. */\n    . = (SIZEOF(.itcm_data) > 0) ? __itcm_data_init_end : __itcm_data_pre_location;\n\n    __exidx_start = .;\n    /DISCARD/ :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    }\n    __exidx_end = .;\n\n    /* To copy multiple ROM to RAM sections,\n     * uncomment .copy.table section and,\n     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .copy.table :\n    {\n        . = ALIGN(4);\n        __copy_table_start__ = .;\n        LONG (__etext)\n        LONG (__data_start__)\n        LONG (__data_end__ - __data_start__)\n        LONG (__etext2)\n        LONG (__data2_start__)\n        LONG (__data2_end__ - __data2_start__)\n        __copy_table_end__ = .;\n    } > FLASH\n    */\n\n    /* To clear multiple BSS sections,\n     * uncomment .zero.table section and,\n     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .zero.table :\n    {\n        . = ALIGN(4);\n        __zero_table_start__ = .;\n        LONG (__bss_start__)\n        LONG (__bss_end__ - __bss_start__)\n        LONG (__bss2_start__)\n        LONG (__bss2_end__ - __bss2_start__)\n        __zero_table_end__ = .;\n    } > FLASH\n    */\n\n    __etext = .;\n\n    __tz_RAM_S = ORIGIN(RAM);\n\n    /* If DTC is used, put the DTC vector table at the start of SRAM.\n       This avoids memory holes due to 1K alignment required by it. */\n    .fsp_dtc_vector_table (NOLOAD) :\n    {\n        . = ORIGIN(RAM);\n        *(.fsp_dtc_vector_table)\n    } > RAM\n\n    /* Initialized data section. */\n    .data :\n    {\n        __data_start__ = .;\n        . = ALIGN(4);\n\n        __Code_In_RAM_Start = .;\n\n        KEEP(*(.code_in_ram*))\n        __Code_In_RAM_End = .;\n\n        *(vtable)\n        /* Don't use *(.data*) because it will place data meant for .data_flash in this section. */\n        *(.data.*)\n        *(.data)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        KEEP(*(.jcr*))\n\n        . = ALIGN(4);\n\n        /* All data end */\n        __data_end__ = .;\n\n    } > RAM AT > FLASH\n\n    . = .;\n    __dtcm_data_pre_location = LOADADDR(.data) + SIZEOF(.data);\n\n    /* Initialized DTCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .dtcm_data : ALIGN(16)\n    {\n        /* Start of DTCM Secure Trustzone region. */\n        __tz_DTCM_S = ABSOLUTE(DTCM_START);\n\n        /* Initialized DTCM data start */\n        __dtcm_data_start = .;\n\n        KEEP(*(.dtcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* Initialized DTCM data end */\n        __dtcm_data_end = .;\n    } > DTCM AT > FLASH = 0x00\n\n    . = __dtcm_data_end;\n    /* Uninitialized DTCM data. */\n    /* ALIGN appears on the left side of the colon because it is being used to assign the VMA directly, as opposed to a right side appearance which would control the LMA. */\n    .dtcm_bss ALIGN(8) (NOLOAD) :\n    {\n        /* Uninitialized DTCM data start */\n        __dtcm_bss_start = .;\n\n        KEEP(*(.dtcm_bss*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. No fill because of NOLOAD. */\n        . = ALIGN(8);\n\n        /* Uninitialized DTCM data end */\n        __dtcm_bss_end = .;\n\n        /*\n         * Start of the DTCM Non-Secure Trustzone region.\n         * DTCM_NS_START can be used to set a fixed address for non-secure DTCM in secure projects or flat projects.\n         */\n        __tz_DTCM_N = DEFINED(DTCM_NS_START) ? ABSOLUTE(DTCM_NS_START) : ALIGN(__dtcm_bss_end, 8192);\n    } > DTCM\n\n    /* Addresses exported for DTCM initialization. */\n    __dtcm_data_init_start = LOADADDR(.dtcm_data);\n    __dtcm_data_init_end = LOADADDR(.dtcm_data) + SIZEOF(.dtcm_data);\n\n    ASSERT(ORIGIN(DTCM) % 8 == 0, \"DTCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(DTCM) % 8 == 0, \"DTCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) == ADDR(.dtcm_bss), \".dtcm_bss has (VMA != LMA) but should be NOLOAD (VMA == LMA).\")\n    ASSERT(LOADADDR(.dtcm_data) % 16 == 0, \".dtcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.dtcm_data) % 8 == 0, \".dtcm_data section size must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) % 8 == 0, \".dtcm_bss section must be aligned to 8 bytes.\")\n    ASSERT(SIZEOF(.dtcm_bss) % 8 == 0, \".dtcm_bss section size must be a multiple of 8 bytes.\")\n    ASSERT(__dtcm_bss_start == __dtcm_data_end, \".dtcm_bss section is not adjacent to .dtcm_data section.\")\n\n    /* Restore location counter. */\n    /* If DTCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If DTCM is present, this will be the absolute address that follows the DTCM ROM location. */\n    . = (SIZEOF(.dtcm_data) > 0) ? __dtcm_data_init_end : __dtcm_data_pre_location;\n\n    /* TrustZone Secure Gateway Stubs Section */\n\n    /* Store location counter for SPI non-retentive sections. */\n    sgstubs_pre_location = .;\n\n    /* Determine the secure gateway stubs address either by the provided linker variable or the next 1024-byte block. */\n    SGSTUBS_LOC = (DEFINED(PROJECT_SECURE) && DEFINED(FLASH_NSC_START)) ? ABSOLUTE(FLASH_NSC_START) : ALIGN(1024);\n    .gnu.sgstubs SGSTUBS_LOC : ALIGN(1024)\n    {\n        __tz_FLASH_C = DEFINED(FLASH_NSC_START) ? ABSOLUTE(FLASH_NSC_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : ALIGN(1024);\n        _start_sg = .;\n        *(.gnu.sgstubs*)\n        . = ALIGN(32);\n        _end_sg = .;\n    } > FLASH\n\n    __tz_FLASH_N = DEFINED(FLASH_NS_START) ? ABSOLUTE(FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : FLASH_LENGTH < 32768 ? FLASH_LENGTH : ALIGN(32768);\n    FLASH_NS_IMAGE_START = DEFINED(FLASH_NS_IMAGE_START) ? FLASH_NS_IMAGE_START : __tz_FLASH_N;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_S = ORIGIN(QSPI_FLASH);\n\n    /* QSPI_FLASH section to be downloaded via debugger */\n    .qspi_flash :\n    {\n        __qspi_flash_start__ = .;\n        KEEP(*(.qspi_flash*))\n        KEEP(*(.code_in_qspi*))\n        __qspi_flash_end__ = .;\n    } > QSPI_FLASH\n    __qspi_flash_code_size__ = __qspi_flash_end__ - __qspi_flash_start__;\n\n    /* QSPI_FLASH non-retentive section, creates a copy in internal flash that can be copied to QSPI */\n    __qspi_flash_code_addr__ = sgstubs_pre_location;\n    .qspi_non_retentive : AT(__qspi_flash_code_addr__)\n    {\n        __qspi_non_retentive_start__ = .;\n        KEEP(*(.qspi_non_retentive*))\n        __qspi_non_retentive_end__ = .;\n    } > QSPI_FLASH\n    __qspi_non_retentive_size__ = __qspi_non_retentive_end__ - __qspi_non_retentive_start__;\n\n    __qspi_region_max_size__ = 0x4000000;   /* Must be the same as defined in MEMORY above */\n    __qspi_region_start_address__ = __qspi_flash_start__;\n    __qspi_region_end_address__ = __qspi_flash_start__ + __qspi_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_N = __qspi_non_retentive_end__;\n\n    /* Support for OctaRAM */\n    .OSPI_DEVICE_0_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_0_start__ = .;\n        *(.ospi_device_0_no_load*)\n        . = ALIGN(4);\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0_RAM\n\n    .OSPI_DEVICE_1_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_1_start__ = .;\n        *(.ospi_device_1_no_load*)\n        . = ALIGN(4);\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1_RAM\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_S = ORIGIN(OSPI_DEVICE_0);\n\n    /* OSPI_DEVICE_0 section to be downloaded via debugger */\n    .OSPI_DEVICE_0 :\n    {\n        __ospi_device_0_start__ = .;\n        KEEP(*(.ospi_device_0*))\n        KEEP(*(.code_in_ospi_device_0*))\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_code_size__ = __ospi_device_0_end__ - __ospi_device_0_start__;\n\n    /* OSPI_DEVICE_0 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n     __ospi_device_0_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive));\n    .ospi_device_0_non_retentive : AT(__ospi_device_0_code_addr__)\n    {\n        __ospi_device_0_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_0_non_retentive*))\n        __ospi_device_0_non_retentive_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_non_retentive_size__ = __ospi_device_0_non_retentive_end__ - __ospi_device_0_non_retentive_start__;\n\n    __ospi_device_0_region_max_size__ = 0x8000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_0_region_start_address__ = __ospi_device_0_start__;\n    __ospi_device_0_region_end_address__ = __ospi_device_0_start__ + __ospi_device_0_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_N = __ospi_device_0_non_retentive_end__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_S = ORIGIN(OSPI_DEVICE_1);\n\n    /* OSPI_DEVICE_1 section to be downloaded via debugger */\n    .OSPI_DEVICE_1 :\n    {\n        __ospi_device_1_start__ = .;\n        KEEP(*(.ospi_device_1*))\n        KEEP(*(.code_in_ospi_device_1*))\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_code_size__ = __ospi_device_1_end__ - __ospi_device_1_start__;\n\n    /* OSPI_DEVICE_1 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n    __ospi_device_1_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive) + SIZEOF(.ospi_device_0_non_retentive));\n    .ospi_device_1_non_retentive : AT(__ospi_device_1_code_addr__)\n    {\n        __ospi_device_1_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_1_non_retentive*))\n        __ospi_device_1_non_retentive_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_non_retentive_size__ = __ospi_device_1_non_retentive_end__ - __ospi_device_1_non_retentive_start__;\n\n    __ospi_device_1_region_max_size__ = 0x10000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_1_region_start_address__ = __ospi_device_1_start__;\n    __ospi_device_1_region_end_address__ = __ospi_device_1_start__ + __ospi_device_1_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_N = __ospi_device_1_non_retentive_end__;\n\n    .noinit (NOLOAD):\n    {\n        . = ALIGN(4);\n        __noinit_start = .;\n        KEEP(*(.noinit*))\n        . = ALIGN(8);\n        /* Place the FreeRTOS heap here so that the __HeapLimit calculation does not include the freertos heap. */\n        KEEP(*(.heap.*))\n        __noinit_end = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n        __HeapBase = .;\n        /* Place the STD heap here. */\n        KEEP(*(.heap))\n        __HeapLimit = .;\n    } > RAM\n\n    /* Stacks are stored in this section. */\n    .stack_dummy (NOLOAD):\n    {\n        . = ALIGN(8);\n        __StackLimit = .;\n        /* Main stack */\n        KEEP(*(.stack))\n        __StackTop = .;\n        /* Thread stacks */\n        KEEP(*(.stack*))\n        __StackTopAll = .;\n    } > RAM\n\n    PROVIDE(__stack = __StackTopAll);\n\n    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used\n       at run time for things such as ThreadX memory pool allocations. */\n    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);\n\n    /* RAM_NSC_START can be used to set a fixed address for non-secure callable RAM in secure projects.\n     * If it is not specified, the address for NSC RAM is the end of RAM aligned to a 1K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_C = DEFINED(RAM_NSC_START) ? ABSOLUTE(RAM_NSC_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_segment_used_end__, 1024);\n\n    /* RAM_NS_START can be used to set a fixed address for non-secure RAM in secure projects or flat projects.\n     * RAM_NS_BUFFER_BLOCK_LENGTH is used to allocate non-secure buffers in a flat project. If it is not\n     * specified, the address for NSC RAM is the end of RAM aligned to an 8K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_N = DEFINED(RAM_NS_START) ? ABSOLUTE(RAM_NS_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__tz_RAM_C, 8192);\n\n    /* Non-secure buffers must be in non-secure RAM. This is primarily used for the EDMAC in flat projects.\n     * The EDMAC is a non-secure bus master and can only access non-secure RAM. */\n    .ns_buffer (NOLOAD):\n    {\n        /* Allocate RAM on a 32-byte boundary to help with placement of Ethernet buffers. */\n        . = __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_START & 0xFFFFFFE0) : .;\n\n        KEEP(*(.ns_buffer*))\n    } > RAM\n\n    /* Data flash. */\n    .data_flash :\n    {\n        . = ORIGIN(DATA_FLASH);\n        __tz_DATA_FLASH_S = .;\n        __Data_Flash_Start = .;\n        KEEP(*(.data_flash*))\n        __Data_Flash_End = .;\n\n        __tz_DATA_FLASH_N = DEFINED(DATA_FLASH_NS_START) ? ABSOLUTE(DATA_FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(DATA_FLASH_START + DATA_FLASH_LENGTH) : ALIGN(1024);\n    } > DATA_FLASH\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_S = ORIGIN(SDRAM);\n\n    /* SDRAM */\n    .sdram (NOLOAD):\n    {\n        __SDRAM_Start = .;\n        KEEP(*(.sdram*))\n        KEEP(*(.frame*))\n        __SDRAM_End = .;\n    } > SDRAM\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_N = __SDRAM_End;\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool. */\n    __tz_ID_CODE_S = ORIGIN(ID_CODE);\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool.\n     *       Set this symbol to the same value as __tz_ID_CODE_S so the RA configuration tool does not split the ID_CODE\n     *       memory region between TrustZone projects. */\n    __tz_ID_CODE_N = __tz_ID_CODE_S;\n\n    .id_code :\n    {\n        __ID_Code_Start = .;\n        KEEP(*(.id_code*))\n        __ID_Code_End = .;\n    } > ID_CODE\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S = ORIGIN(OPTION_SETTING_OFS);\n\n    .option_setting_ofs :\n    {\n        __OPTION_SETTING_OFS_Start = .;\n        KEEP(*(.option_setting_ofs0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x04 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_ofs2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x10 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_dualsel))\n        __OPTION_SETTING_OFS_End = .;\n    } > OPTION_SETTING_OFS = 0xFF\n\n    .option_setting_sas :\n    {\n        __OPTION_SETTING_SAS_Start = .;\n        KEEP(*(.option_setting_sas))\n        __OPTION_SETTING_SAS_End = .;\n    } > OPTION_SETTING_SAS = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_N = ABSOLUTE(OPTION_SETTING_START_NS);\n\n    .option_setting_ns :\n    {\n        __OPTION_SETTING_NS_Start = .;\n        KEEP(*(.option_setting_ofs1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x04 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_ofs3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x10 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_banksel))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x40 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x44 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x48 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x4C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x60 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x64 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x68 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x6C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps3))\n        __OPTION_SETTING_NS_End = .;\n    } > OPTION_SETTING = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_S = ORIGIN(OPTION_SETTING_S);\n\n    .option_setting_s :\n    {\n        __OPTION_SETTING_S_Start = .;\n        KEEP(*(.option_setting_ofs1_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x04 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x10 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x40 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x44 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x48 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x4C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x60 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x64 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x68 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x6C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x80 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs1_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x84 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x90 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC0 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC4 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC8 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xCC : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel3))\n        __OPTION_SETTING_S_End = .;\n    } > OPTION_SETTING_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_N = __OPTION_SETTING_S_End;\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/script/memory_regions.ld",
    "content": "\n            /* generated memory regions file - do not edit */\n                            RAM_START  = 0x20000000;\n                RAM_LENGTH = 0x80000;\n                FLASH_START  = 0x00000000;\n                FLASH_LENGTH = 0x200000;\n                DATA_FLASH_START  = 0x08000000;\n                DATA_FLASH_LENGTH = 0x2000;\n                OPTION_SETTING_START  = 0x0100A100;\n                OPTION_SETTING_LENGTH = 0x100;\n                OPTION_SETTING_S_START  = 0x0100A200;\n                OPTION_SETTING_S_LENGTH = 0x100;\n                ID_CODE_START  = 0x00000000;\n                ID_CODE_LENGTH = 0x0;\n                SDRAM_START  = 0x80010000;\n                SDRAM_LENGTH = 0x0;\n                QSPI_FLASH_START  = 0x60000000;\n                QSPI_FLASH_LENGTH = 0x4000000;\n                OSPI_DEVICE_0_START  = 0x68000000;\n                OSPI_DEVICE_0_LENGTH = 0x8000000;\n                OSPI_DEVICE_1_START  = 0x70000000;\n                OSPI_DEVICE_1_LENGTH = 0x10000000;\n\n/* Board has bootloader */\nFLASH_IMAGE_START = 0x10000;\n"
  },
  {
    "path": "hw/bsp/ra/boards/portenta_c33/smart_configurator/configuration.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<raConfiguration version=\"9\">\n  <generalSettings>\n    <option key=\"#Board#\" value=\"board.custom\"/>\n    <option key=\"CPU\" value=\"RA6M5\"/>\n    <option key=\"Core\" value=\"CM33\"/>\n    <option key=\"#TargetName#\" value=\"R7FA6M5BH3CFC\"/>\n    <option key=\"#TargetARCHITECTURE#\" value=\"cortex-m33\"/>\n    <option key=\"#DeviceCommand#\" value=\"R7FA6M5BH\"/>\n    <option key=\"#RTOS#\" value=\"_none\"/>\n    <option key=\"#pinconfiguration#\" value=\"R7FA6M5BH3CFC.pincfg\"/>\n    <option key=\"#FSPVersion#\" value=\"5.6.0\"/>\n    <option key=\"#SELECTED_TOOLCHAIN#\" value=\"com.renesas.cdt.managedbuild.gnuarm.toolchain.\"/>\n  </generalSettings>\n  <raBspConfiguration>\n    <config id=\"config.bsp.ra6m5.R7FA6M5BH3CFC\">\n      <property id=\"config.bsp.part_number\" value=\"config.bsp.part_number.value\"/>\n      <property id=\"config.bsp.rom_size_bytes\" value=\"config.bsp.rom_size_bytes.value\"/>\n      <property id=\"config.bsp.rom_size_bytes_hidden\" value=\"2097152\"/>\n      <property id=\"config.bsp.ram_size_bytes\" value=\"config.bsp.ram_size_bytes.value\"/>\n      <property id=\"config.bsp.data_flash_size_bytes\" value=\"config.bsp.data_flash_size_bytes.value\"/>\n      <property id=\"config.bsp.package_style\" value=\"config.bsp.package_style.value\"/>\n      <property id=\"config.bsp.package_pins\" value=\"config.bsp.package_pins.value\"/>\n      <property id=\"config.bsp.irq_count_hidden\" value=\"96\"/>\n    </config>\n    <config id=\"config.bsp.ra6m5\">\n      <property id=\"config.bsp.series\" value=\"config.bsp.series.value\"/>\n    </config>\n    <config id=\"config.bsp.ra6m5.fsp\">\n      <property id=\"config.bsp.fsp.inline_irq_functions\" value=\"config.bsp.common.inline_irq_functions.enabled\"/>\n      <property id=\"config.bsp.fsp.tz.exception_response\" value=\"config.bsp.fsp.tz.exception_response.nmi\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.bfhfnmins\" value=\"config.bsp.fsp.tz.cmsis.bfhfnmins.secure\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.sysresetreqs\" value=\"config.bsp.fsp.tz.cmsis.sysresetreqs.secure_only\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.s_priority_boost\" value=\"config.bsp.fsp.tz.cmsis.s_priority_boost.disabled\"/>\n      <property id=\"config.bsp.fsp.tz.csar\" value=\"config.bsp.fsp.tz.csar.both\"/>\n      <property id=\"config.bsp.fsp.tz.rstsar\" value=\"config.bsp.fsp.tz.rstsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.bbfsar\" value=\"config.bsp.fsp.tz.bbfsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.sramprcr\" value=\"config.bsp.fsp.tz.sramsar.sramprcr.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.sramecc\" value=\"config.bsp.fsp.tz.sramsar.sramecc.both\"/>\n      <property id=\"config.bsp.fsp.tz.stbramsar\" value=\"config.bsp.fsp.tz.stbramsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussara\" value=\"config.bsp.fsp.tz.bussara.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussarb\" value=\"config.bsp.fsp.tz.bussarb.both\"/>\n      <property id=\"config.bsp.fsp.tz.banksel_sel\" value=\"config.bsp.fsp.tz.banksel_sel.both\"/>\n      <property id=\"config.bsp.fsp.tz.uninitialized_ns_application_fallback\" value=\"config.bsp.fsp.tz.uninitialized_ns_application_fallback.enabled\"/>\n      <property id=\"config.bsp.fsp.cache_line_size\" value=\"config.bsp.fsp.cache_line_size.32\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_start_mode\" value=\"config.bsp.fsp.OFS0.iwdt_start_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_timeout\" value=\"config.bsp.fsp.OFS0.iwdt_timeout.2048\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_divisor\" value=\"config.bsp.fsp.OFS0.iwdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_end\" value=\"config.bsp.fsp.OFS0.iwdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_start\" value=\"config.bsp.fsp.OFS0.iwdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_stop_control\" value=\"config.bsp.fsp.OFS0.iwdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_start_mode\" value=\"config.bsp.fsp.OFS0.wdt_start_mode.register\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_timeout\" value=\"config.bsp.fsp.OFS0.wdt_timeout.16384\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_divisor\" value=\"config.bsp.fsp.OFS0.wdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_end\" value=\"config.bsp.fsp.OFS0.wdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_start\" value=\"config.bsp.fsp.OFS0.wdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.wdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_stop_control\" value=\"config.bsp.fsp.OFS0.wdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0_level.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.start.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1.voltage_detection0.start.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1.voltage_detection0_level.280\"/>\n      <property id=\"config.bsp.fsp.OFS1.hoco_osc\" value=\"config.bsp.fsp.OFS1.hoco_osc.disabled\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS0\" value=\"\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS1\" value=\"\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS2\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS0\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS1\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS2\" value=\"\"/>\n      <property id=\"config.bsp.fsp.dual_bank\" value=\"config.bsp.fsp.dual_bank.disabled\"/>\n      <property id=\"config.bsp.fsp.hoco_fll\" value=\"config.bsp.fsp.hoco_fll.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_wait\" value=\"config.bsp.common.main_osc_wait.wait_8163\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.max_freq_hz\" value=\"50000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.max_baud\" value=\"16666666\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sample_and_hold\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sensors_are_exclusive\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_spi.max_bitrate\" value=\"25000000\"/>\n      <property id=\"config.bsp.fsp.mcu.spi.max_bitrate\" value=\"50000000\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.fastplus_channels\" value=\"0x3\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.fastplus_channels\" value=\"0x3\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.num_channels\" value=\"2\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.rx_fifos\" value=\"8\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.buffer_ram\" value=\"4864\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.afl_rules\" value=\"128\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.afl_rules_each_chnl\" value=\"64\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.max_data_rate_hz\" value=\"5\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.cstpen_channels\" value=\"0x03F9\"/>\n      <property id=\"config.bsp.fsp.mcu.gpt.pin_count_source_channels\" value=\"0xFFFF\"/>\n      <property id=\"config.bsp.fsp.mcu.adc_dmac.samples_per_channel\" value=\"65535\"/>\n    </config>\n    <config id=\"config.bsp.ra\">\n      <property id=\"config.bsp.common.main\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.heap\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.vcc\" value=\"3300\"/>\n      <property id=\"config.bsp.common.checking\" value=\"config.bsp.common.checking.disabled\"/>\n      <property id=\"config.bsp.common.assert\" value=\"config.bsp.common.assert.none\"/>\n      <property id=\"config.bsp.common.error_log\" value=\"config.bsp.common.error_log.none\"/>\n      <property id=\"config.bsp.common.soft_reset\" value=\"config.bsp.common.soft_reset.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_populated\" value=\"config.bsp.common.main_osc_populated.enabled\"/>\n      <property id=\"config.bsp.common.pfs_protect\" value=\"config.bsp.common.pfs_protect.enabled\"/>\n      <property id=\"config.bsp.common.c_runtime_init\" value=\"config.bsp.common.c_runtime_init.enabled\"/>\n      <property id=\"config.bsp.common.early_init\" value=\"config.bsp.common.early_init.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_clock_source\" value=\"config.bsp.common.main_osc_clock_source.crystal\"/>\n      <property id=\"config.bsp.common.subclock_populated\" value=\"config.bsp.common.subclock_populated.enabled\"/>\n      <property id=\"config.bsp.common.subclock_drive\" value=\"config.bsp.common.subclock_drive.standard\"/>\n      <property id=\"config.bsp.common.subclock_stabilization_ms\" value=\"1000\"/>\n    </config>\n  </raBspConfiguration>\n  <raClockConfiguration>\n    <node id=\"board.clock.xtal.freq\" mul=\"24000000\" option=\"_edit\"/>\n    <node id=\"board.clock.hoco.freq\" option=\"board.clock.hoco.freq.20m\"/>\n    <node id=\"board.clock.loco.freq\" option=\"board.clock.loco.freq.32768\"/>\n    <node id=\"board.clock.moco.freq\" option=\"board.clock.moco.freq.8m\"/>\n    <node id=\"board.clock.subclk.freq\" option=\"board.clock.subclk.freq.32768\"/>\n    <node id=\"board.clock.pll.source\" option=\"board.clock.pll.source.xtal\"/>\n    <node id=\"board.clock.pll.div\" option=\"board.clock.pll.div.3\"/>\n    <node id=\"board.clock.pll.mul\" option=\"board.clock.pll.mul.250\"/>\n    <node id=\"board.clock.pll.display\" option=\"board.clock.pll.display.value\"/>\n    <node id=\"board.clock.pll2.source\" option=\"board.clock.pll2.source.xtal\"/>\n    <node id=\"board.clock.pll2.div\" option=\"board.clock.pll2.div.2\"/>\n    <node id=\"board.clock.pll2.mul\" option=\"board.clock.pll2.mul.200\"/>\n    <node id=\"board.clock.pll2.display\" option=\"board.clock.pll2.display.value\"/>\n    <node id=\"board.clock.clock.source\" option=\"board.clock.clock.source.pll\"/>\n    <node id=\"board.clock.clkout.source\" option=\"board.clock.clkout.source.disabled\"/>\n    <node id=\"board.clock.uclk.source\" option=\"board.clock.uclk.source.pll2\"/>\n    <node id=\"board.clock.u60ck.source\" option=\"board.clock.u60ck.source.pll2\"/>\n    <node id=\"board.clock.octaspiclk.source\" option=\"board.clock.octaspiclk.source.disabled\"/>\n    <node id=\"board.clock.canfdclk.source\" option=\"board.clock.canfdclk.source.disabled\"/>\n    <node id=\"board.clock.cecclk.source\" option=\"board.clock.cecclk.source.disabled\"/>\n    <node id=\"board.clock.iclk.div\" option=\"board.clock.iclk.div.1\"/>\n    <node id=\"board.clock.pclka.div\" option=\"board.clock.pclka.div.2\"/>\n    <node id=\"board.clock.pclkb.div\" option=\"board.clock.pclkb.div.4\"/>\n    <node id=\"board.clock.pclkc.div\" option=\"board.clock.pclkc.div.4\"/>\n    <node id=\"board.clock.pclkd.div\" option=\"board.clock.pclkd.div.2\"/>\n    <node id=\"board.clock.bclk.div\" option=\"board.clock.bclk.div.2\"/>\n    <node id=\"board.clock.bclkout.div\" option=\"board.clock.bclkout.div.2\"/>\n    <node id=\"board.clock.fclk.div\" option=\"board.clock.fclk.div.4\"/>\n    <node id=\"board.clock.clkout.div\" option=\"board.clock.clkout.div.1\"/>\n    <node id=\"board.clock.uclk.div\" option=\"board.clock.uclk.div.5\"/>\n    <node id=\"board.clock.u60ck.div\" option=\"board.clock.u60ck.div.4\"/>\n    <node id=\"board.clock.octaspiclk.div\" option=\"board.clock.octaspiclk.div.1\"/>\n    <node id=\"board.clock.canfdclk.div\" option=\"board.clock.canfdclk.div.1\"/>\n    <node id=\"board.clock.cecclk.div\" option=\"board.clock.cecclk.div.1\"/>\n    <node id=\"board.clock.iclk.display\" option=\"board.clock.iclk.display.value\"/>\n    <node id=\"board.clock.pclka.display\" option=\"board.clock.pclka.display.value\"/>\n    <node id=\"board.clock.pclkb.display\" option=\"board.clock.pclkb.display.value\"/>\n    <node id=\"board.clock.pclkc.display\" option=\"board.clock.pclkc.display.value\"/>\n    <node id=\"board.clock.pclkd.display\" option=\"board.clock.pclkd.display.value\"/>\n    <node id=\"board.clock.bclk.display\" option=\"board.clock.bclk.display.value\"/>\n    <node id=\"board.clock.bclkout.display\" option=\"board.clock.bclkout.display.value\"/>\n    <node id=\"board.clock.fclk.display\" option=\"board.clock.fclk.display.value\"/>\n    <node id=\"board.clock.clkout.display\" option=\"board.clock.clkout.display.value\"/>\n    <node id=\"board.clock.uclk.display\" option=\"board.clock.uclk.display.value\"/>\n    <node id=\"board.clock.u60ck.display\" option=\"board.clock.u60ck.display.value\"/>\n    <node id=\"board.clock.octaspiclk.display\" option=\"board.clock.octaspiclk.display.value\"/>\n    <node id=\"board.clock.canfdclk.display\" option=\"board.clock.canfdclk.display.value\"/>\n    <node id=\"board.clock.cecclk.display\" option=\"board.clock.cecclk.display.value\"/>\n  </raClockConfiguration>\n  <raComponentSelection>\n    <component apiversion=\"\" class=\"Common\" condition=\"\" group=\"all\" subgroup=\"fsp_common\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board Support Package Common Files</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_ioport\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>I/O Port</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"CMSIS\" condition=\"\" group=\"CMSIS5\" subgroup=\"CoreM\" variant=\"\" vendor=\"Arm\" version=\"6.1.0+fsp.5.6.0\">\n      <description>Arm CMSIS Version 6 - Core (M)</description>\n      <originalPack>Arm.CMSIS6.6.1.0+fsp.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"Board\" subgroup=\"custom\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Custom Board Support Files</description>\n      <originalPack>Renesas.RA_board_custom.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m5\" subgroup=\"device\" variant=\"R7FA6M5BH3CFC\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for R7FA6M5BH3CFC</description>\n      <originalPack>Renesas.RA_mcu_ra6m5.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m5\" subgroup=\"device\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M5</description>\n      <originalPack>Renesas.RA_mcu_ra6m5.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m5\" subgroup=\"fsp\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M5 - FSP Data</description>\n      <originalPack>Renesas.RA_mcu_ra6m5.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m5\" subgroup=\"events\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M5 - Events</description>\n      <originalPack>Renesas.RA_mcu_ra6m5.5.6.0.pack</originalPack>\n    </component>\n  </raComponentSelection>\n  <raElcConfiguration/>\n  <raIcuConfiguration/>\n  <raModuleConfiguration>\n    <module id=\"module.driver.ioport_on_ioport.0\">\n      <property id=\"module.driver.ioport.name\" value=\"g_ioport\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport1\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport2\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport3\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport4\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.pincfg\" value=\"g_bsp_pin_cfg\"/>\n    </module>\n    <context id=\"_hal.0\">\n      <stack module=\"module.driver.ioport_on_ioport.0\"/>\n    </context>\n    <config id=\"config.driver.ioport\">\n      <property id=\"config.driver.ioport.checking\" value=\"config.driver.ioport.checking.system\"/>\n    </config>\n  </raModuleConfiguration>\n  <raPinConfiguration>\n    <symbolicName propertyId=\"p107.symbolic_name\" value=\"LED1\"/>\n    <symbolicName propertyId=\"p408.symbolic_name\" value=\"SW1\"/>\n    <pincfg active=\"true\" name=\"R7FA6M5BH3CFC.pincfg\" selected=\"true\" symbol=\"g_bsp_pin_cfg\">\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"p107.output.low\" configurationId=\"p107\"/>\n      <configSetting altId=\"p107.gpio_mode.gpio_mode_out.low\" configurationId=\"p107.gpio_mode\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n      <configSetting altId=\"p407.usbfs0.vbus\" configurationId=\"p407\"/>\n      <configSetting altId=\"p407.gpio_mode.gpio_mode_peripheral\" configurationId=\"p407.gpio_mode\"/>\n      <configSetting altId=\"p408.input\" configurationId=\"p408\"/>\n      <configSetting altId=\"p408.gpio_mode.gpio_mode_in\" configurationId=\"p408.gpio_mode\"/>\n      <configSetting altId=\"p408.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p408.gpio_pupd\"/>\n      <configSetting altId=\"pb01.usbhs0.vbus\" configurationId=\"pb01\"/>\n      <configSetting altId=\"pb01.gpio_mode.gpio_mode_peripheral\" configurationId=\"pb01.gpio_mode\"/>\n      <configSetting altId=\"usbfs0.mode.device\" configurationId=\"usbfs0.mode\"/>\n      <configSetting altId=\"usbfs0.vbus.p407\" configurationId=\"usbfs0.vbus\"/>\n      <configSetting altId=\"usbhs0.mode.device\" configurationId=\"usbhs0.mode\"/>\n      <configSetting altId=\"usbhs0.vbus.pb01\" configurationId=\"usbhs0.vbus\"/>\n    </pincfg>\n  </raPinConfiguration>\n</raConfiguration>\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-m23 CACHE INTERNAL \"System Processor\")\nset(MCU_VARIANT ra2a1)\n\nset(JLINK_DEVICE R7FA2A1AB)\n\nfunction(update_board TARGET)\n#  target_compile_definitions(${TARGET} PUBLIC)\n#  target_sources(${TARGET} PRIVATE)\n#  target_include_directories(${BOARD_TARGET} PUBLIC)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: RA2A1 EK\n   url: https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra2a1-evaluation-kit-ra2a1-mcu-group\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_STATE_ON          1\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/board.mk",
    "content": "CPU_CORE = cortex-m23\nMCU_VARIANT = ra2a1\n\n# For flash-jlink target\nJLINK_DEVICE = R7FA2A1AB\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_cfg/fsp_cfg/bsp/bsp_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CFG_H_\n#define BSP_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_clock_cfg.h\"\n            #include \"bsp_mcu_family_cfg.h\"\n            #include \"board_cfg.h\"\n            #define RA_NOT_DEFINED 0\n            #ifndef BSP_CFG_RTOS\n             #if (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (2)\n             #elif (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (1)\n             #else\n              #define BSP_CFG_RTOS (0)\n             #endif\n            #endif\n            #ifndef BSP_CFG_RTC_USED\n             #define BSP_CFG_RTC_USED (RA_NOT_DEFINED)\n            #endif\n            #undef RA_NOT_DEFINED\n            #if defined(_RA_BOOT_IMAGE)\n             #define BSP_CFG_BOOT_IMAGE (1)\n            #endif\n            #define BSP_CFG_MCU_VCC_MV (3300)\n            #define BSP_CFG_STACK_MAIN_BYTES (0x400)\n            #define BSP_CFG_HEAP_BYTES (0x400)\n            #define BSP_CFG_PARAM_CHECKING_ENABLE (0)\n            #define BSP_CFG_ASSERT (0)\n            #define BSP_CFG_ERROR_LOG (0)\n\n            #define BSP_CFG_PFS_PROTECT ((1))\n\n            #define BSP_CFG_C_RUNTIME_INIT ((1))\n            #define BSP_CFG_EARLY_INIT     ((0))\n\n            #define BSP_CFG_STARTUP_CLOCK_REG_NOT_RESET ((0))\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_POPULATED\n            #define BSP_CLOCK_CFG_MAIN_OSC_POPULATED (1)\n            #endif\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE\n            #define BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_DRIVE\n            #define BSP_CLOCK_CFG_SUBCLOCK_DRIVE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_POPULATED\n            #define BSP_CLOCK_CFG_SUBCLOCK_POPULATED (1)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS\n            #define BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS 1000\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_CFG_H_\n#define BSP_MCU_DEVICE_CFG_H_\n#define BSP_CFG_MCU_PART_SERIES (2)\n#endif /* BSP_MCU_DEVICE_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_pn_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_R7FA2A1AB3CFM\n      #define BSP_MCU_FEATURE_SET ('A')\n      #define BSP_ROM_SIZE_BYTES (262144)\n      #define BSP_RAM_SIZE_BYTES (32768)\n      #define BSP_DATA_FLASH_SIZE_BYTES (8192)\n      #define BSP_PACKAGE_LQFP\n      #define BSP_PACKAGE_PINS (64)\n#endif /* BSP_MCU_DEVICE_PN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_family_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_FAMILY_CFG_H_\n#define BSP_MCU_FAMILY_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_mcu_device_pn_cfg.h\"\n            #include \"bsp_mcu_device_cfg.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra2a1/bsp_mcu_info.h\"\n            #include \"bsp_clock_cfg.h\"\n            #define BSP_MCU_GROUP_RA2A1 (1)\n            #define BSP_LOCO_HZ                 (32768)\n            #define BSP_MOCO_HZ                 (8000000)\n            #define BSP_SUB_CLOCK_HZ            (32768)\n            #if   BSP_CFG_HOCO_FREQUENCY == 0\n                #define BSP_HOCO_HZ             (24000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 2\n                #define BSP_HOCO_HZ             (32000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 4\n                #define BSP_HOCO_HZ             (48000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 5\n                #define BSP_HOCO_HZ             (64000000)\n            #else\n                #error \"Invalid HOCO frequency chosen (BSP_CFG_HOCO_FREQUENCY) in bsp_clock_cfg.h\"\n            #endif\n\n            #define BSP_CORTEX_VECTOR_TABLE_ENTRIES    (16U)\n            #define BSP_VECTOR_TABLE_MAX_ENTRIES       (48U)\n            #define BSP_CFG_INLINE_IRQ_FUNCTIONS       (0)\n\n            #define OFS_SEQ1 0xA001A001 | (1 << 1) | (3 << 2)\n            #define OFS_SEQ2 (15 << 4) | (3 << 8) | (3 << 10)\n            #define OFS_SEQ3 (1 << 12) | (1 << 14) | (1 << 17)\n            #define OFS_SEQ4 (3 << 18) |(15 << 20) | (3 << 24) | (3 << 26)\n            #define OFS_SEQ5 (1 << 28) | (1 << 30)\n            #define BSP_CFG_USE_LOW_VOLTAGE_MODE ((0))\n            #define BSP_CFG_ROM_REG_OFS0 (OFS_SEQ1 | OFS_SEQ2 | OFS_SEQ3 | OFS_SEQ4 | OFS_SEQ5)\n            #define BSP_CFG_ROM_REG_OFS1 (0xFFFFFEC3 | (1 << 2) | (3 << 3) | (0 << 8))\n            #define BSP_CFG_ROM_REG_MPU_PC0_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_PC0_START (0x000FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_PC0_END (0x000FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_PC1_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_PC1_START (0x000FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_PC1_END (0x000FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_START (0x000FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_END (0x000FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_START (0x200FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_END (0x200FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_START (0x407FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_END (0x407FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_START (0x400DFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_END (0x400DFFFF)\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_WAIT\n            #define BSP_CLOCK_CFG_MAIN_OSC_WAIT (9)\n            #endif\n            /* Used to create IELS values for the interrupt initialization table g_interrupt_event_link_select. */\n            #define BSP_PRV_IELS_ENUM(vector)    (ELC_ ## vector)\n\n            /*\n            ID Code\n            Note: To lock and disable the debug interface define BSP_ID_CODE_LOCKED in compiler settings.\n            WARNING: This will disable debug access to the part. However, ALeRASE command will be accepted, which will clear (reset) the ID code. After clearing ID code, debug access will be enabled.\n            */\n            #if defined(BSP_ID_CODE_LOCKED)\n            #define BSP_CFG_ID_CODE_LONG_1 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_2 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_3 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_4 (0x00000000)\n            #else\n            /* ID CODE: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF */\n            #define BSP_CFG_ID_CODE_LONG_1 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_2 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_3 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_4 (0xffFFFFFF)\n            #endif\n\n            #if (0)\n            #define BSP_SECTION_FLASH_GAP BSP_PLACE_IN_SECTION(\".flash_gap\")\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_MCU_FAMILY_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_cfg/fsp_cfg/bsp/bsp_pin_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_PIN_CFG_H_\n#define BSP_PIN_CFG_H_\n#include \"r_ioport.h\"\n\n/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */\nFSP_HEADER\n\n#define LED1 (BSP_IO_PORT_02_PIN_05)\n#define SW1 (BSP_IO_PORT_02_PIN_06)\nextern const ioport_cfg_t g_bsp_pin_cfg; /* RA2A1-EK.pincfg */\n\nvoid BSP_PinConfigSecurityInit();\n\n/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */\nFSP_FOOTER\n#endif /* BSP_PIN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_cfg/fsp_cfg/r_ioport_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef R_IOPORT_CFG_H_\n#define R_IOPORT_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define IOPORT_CFG_PARAM_CHECKING_ENABLE (BSP_CFG_PARAM_CHECKING_ENABLE)\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* R_IOPORT_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_gen/bsp_clock_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CLOCK_CFG_H_\n#define BSP_CLOCK_CFG_H_\n#define BSP_CFG_CLOCKS_SECURE (0)\n#define BSP_CFG_CLOCKS_OVERRIDE (0)\n#define BSP_CFG_XTAL_HZ (12000000) /* XTAL 12000000Hz */\n#define BSP_CFG_HOCO_FREQUENCY (4) /* HOCO 48MHz */\n#define BSP_CFG_CLOCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_HOCO) /* Clock Src: HOCO */\n#define BSP_CFG_ICLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* ICLK Div /1 */\n#define BSP_CFG_PCLKB_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKB Div /2 */\n#define BSP_CFG_PCLKD_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* PCLKD Div /1 */\n#define BSP_CFG_FCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* FCLK Div /2 */\n#define BSP_CFG_SDADC_CLOCK_SOURCE (0) /* SDADCCLK Src: HOCO */\n#define BSP_CFG_SDADCCLK_DIV (7) /* SDADCCLK Div /12 */\n#define BSP_CFG_CLKOUT_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CLKOUT Disabled */\n#define BSP_CFG_CLKOUT_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* CLKOUT Div /1 */\n#endif /* BSP_CLOCK_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_gen/common_data.c",
    "content": "/* generated common source file - do not edit */\n#include \"common_data.h\"\nioport_instance_ctrl_t g_ioport_ctrl;\nconst ioport_instance_t g_ioport =\n        {\n            .p_api = &g_ioport_on_ioport,\n            .p_ctrl = &g_ioport_ctrl,\n            .p_cfg = &g_bsp_pin_cfg,\n        };\nvoid g_common_init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_gen/common_data.h",
    "content": "/* generated common header file - do not edit */\n#ifndef COMMON_DATA_H_\n#define COMMON_DATA_H_\n#include <stdint.h>\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n#include \"bsp_pin_cfg.h\"\nFSP_HEADER\n#define IOPORT_CFG_NAME g_bsp_pin_cfg\n#define IOPORT_CFG_OPEN R_IOPORT_Open\n#define IOPORT_CFG_CTRL g_ioport_ctrl\n\n/* IOPORT Instance */\nextern const ioport_instance_t g_ioport;\n\n/* IOPORT control structure. */\nextern ioport_instance_ctrl_t g_ioport_ctrl;\nvoid g_common_init(void);\nFSP_FOOTER\n#endif /* COMMON_DATA_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/ra_gen/pin_data.c",
    "content": "/* generated pin source file - do not edit */\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n\n\nconst ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {\n    {\n        .pin = BSP_IO_PORT_00_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_CTSU)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_CTSU)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_09_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_09_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n};\n\nconst ioport_cfg_t g_bsp_pin_cfg = {\n    .number_of_pins = sizeof(g_bsp_pin_cfg_data)/sizeof(ioport_pin_cfg_t),\n    .p_pin_cfg_data = &g_bsp_pin_cfg_data[0],\n};\n\n#if BSP_TZ_SECURE_BUILD\n\nvoid R_BSP_PinCfgSecurityInit(void);\n\n/* Initialize SAR registers for secure pins. */\nvoid R_BSP_PinCfgSecurityInit(void)\n{\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n    uint32_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #else\n    uint16_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #endif\n    memset(pmsar, 0xFF, BSP_FEATURE_BSP_NUM_PMSAR * sizeof(R_PMISC->PMSAR[0]));\n\n\n    for(uint32_t i = 0; i < g_bsp_pin_cfg.number_of_pins; i++)\n    {\n        uint32_t port_pin = g_bsp_pin_cfg.p_pin_cfg_data[i].pin;\n        uint32_t port = port_pin >> 8U;\n        uint32_t pin = port_pin & 0xFFU;\n        pmsar[port] &= (uint16_t) ~(1U << pin);\n    }\n\n    for(uint32_t i = 0; i < BSP_FEATURE_BSP_NUM_PMSAR; i++)\n    {\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n        R_PMISC->PMSAR[i].PMSAR = (uint16_t) pmsar[i];\n #else\n        R_PMISC->PMSAR[i].PMSAR = pmsar[i];\n #endif\n    }\n\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/script/fsp.ld",
    "content": "/*\n                  Linker File for Renesas FSP\n*/\n\nINCLUDE memory_regions.ld\n\n/* Uncomment and set XIP_SECONDARY_SLOT_IMAGE to 1 below for the secondary XIP application image.*/\n/*\n XIP_SECONDARY_SLOT_IMAGE = 1;\n*/\n\nQSPI_FLASH_PRV_LENGTH = DEFINED(QSPI_FLASH_SIZE) ? ABSOLUTE(QSPI_FLASH_SIZE) : ABSOLUTE(QSPI_FLASH_LENGTH);\nOSPI_DEVICE_0_PRV_LENGTH = DEFINED(OSPI_DEVICE_0_SIZE) ? ABSOLUTE(OSPI_DEVICE_0_SIZE) : ABSOLUTE(OSPI_DEVICE_0_LENGTH);\nOSPI_DEVICE_1_PRV_LENGTH = DEFINED(OSPI_DEVICE_1_SIZE) ? ABSOLUTE(OSPI_DEVICE_1_SIZE) : ABSOLUTE(OSPI_DEVICE_1_LENGTH);\n\n/* If a flat (secure) project has DEFINED RAM_NS_BUFFER_LENGTH, then emit IDAU symbols to allocate non-secure RAM. */\n__RESERVE_NS_RAM = !DEFINED(PROJECT_NONSECURE) && DEFINED(RAM_NS_BUFFER_LENGTH) && (OPTION_SETTING_S_LENGTH != 0);\n\nITCM_START = DEFINED(ITCM_START)? ITCM_START : 0;\nITCM_LENGTH = DEFINED(ITCM_LENGTH)? ITCM_LENGTH : 0;\nDTCM_START = DEFINED(DTCM_START)? DTCM_START : 0;\nDTCM_LENGTH = DEFINED(DTCM_LENGTH)? DTCM_LENGTH : 0;\nRAM_NS_BUFFER_BLOCK_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? ALIGN(RAM_NS_BUFFER_LENGTH, 8192) : 0;\nRAM_NS_BUFFER_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? RAM_NS_BUFFER_LENGTH : 0;\nRAM_NS_BUFFER_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_LENGTH;\nRAM_NS_BUFFER_BLOCK_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_BLOCK_LENGTH;\n\nOPTION_SETTING_START_NS = DEFINED(PROJECT_NONSECURE) ? OPTION_SETTING_START : OPTION_SETTING_START + 0x80;\n\n/* This definition is used to avoid moving the counter in OPTION_SETTING regions for projects that should not configure option settings.\n * Bootloader images do not configure option settings because they are owned by the bootloader.\n * FSP_BOOTABLE_IMAGE is only defined in bootloader images. */\n__bl_FSP_BOOTABLE_IMAGE = 1;\n__bln_FSP_BOOTABLE_IMAGE = 1;\nPROJECT_SECURE_OR_FLAT = (!DEFINED(PROJECT_NONSECURE) || DEFINED(PROJECT_SECURE)) && OPTION_SETTING_LENGTH && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_NS = DEFINED(PROJECT_NONSECURE) && !DEFINED(FSP_BOOTABLE_IMAGE);\n\n__bl_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_APPLICATION_IMAGE_NUMBER == 1 ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         (DEFINED(BOOTLOADER_SECONDARY_USE_QSPI) || DEFINED(BOOTLOADER_SECONDARY_USE_OSPI_B)) ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                          FLASH_APPLICATION_S_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_END    = __bl_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_END = __bl_XIP_SECONDARY_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_FLASH_NS_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_START - FLASH_BOOTLOADER_HEADER_LENGTH + FLASH_APPLICATION_S_LENGTH;\n__bl_FLASH_NSC_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_END - FLASH_APPLICATION_NSC_LENGTH;\n__bl_RAM_NS_START    = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH;\n__bl_RAM_NSC_START   = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       __bl_RAM_NS_START - RAM_APPLICATION_NSC_LENGTH;\n__bl_FLASH_NS_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                            FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                            __bl_FLASH_NS_START + FLASH_BOOTLOADER_HEADER_LENGTH_2;\n__bln_FLASH_IMAGE_START = __bl_FLASH_NS_IMAGE_START | (!DEFINED (NS_OFFSET_START) ? 0 : NS_OFFSET_START);\n__bln_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                           FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                           FLASH_APPLICATION_NS_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH_2;\n\nXIP_SECONDARY_SLOT_IMAGE = DEFINED(XIP_SECONDARY_SLOT_IMAGE) ? XIP_SECONDARY_SLOT_IMAGE : 0;\nFLASH_ORIGIN = !DEFINED(FLASH_IMAGE_START) ? FLASH_START :\n                XIP_SECONDARY_SLOT_IMAGE == 1 ? XIP_SECONDARY_FLASH_IMAGE_START :\n                FLASH_IMAGE_START;\nLIMITED_FLASH_LENGTH = DEFINED(FLASH_IMAGE_LENGTH) ? FLASH_IMAGE_LENGTH :\n                       DEFINED(FLASH_BOOTLOADER_LENGTH) ? FLASH_BOOTLOADER_LENGTH :\n                       FLASH_LENGTH;\nOPTION_SETTING_SAS_SIZE = 0x34;\nOPTION_SETTING_SAS_LENGTH = !DEFINED(OPTION_SETTING_LENGTH) ? 0 :\n                            OPTION_SETTING_LENGTH == 0 ? 0 :\n                            OPTION_SETTING_LENGTH - OPTION_SETTING_SAS_SIZE;\n\n/* Define memory regions. */\nMEMORY\n{\n  ITCM (rx)                       : ORIGIN = ITCM_START, LENGTH = ITCM_LENGTH\n  DTCM (rwx)                      : ORIGIN = DTCM_START, LENGTH = DTCM_LENGTH\n  FLASH (rx)                      : ORIGIN = FLASH_ORIGIN, LENGTH = LIMITED_FLASH_LENGTH\n  RAM (rwx)                       : ORIGIN = RAM_START, LENGTH = RAM_LENGTH\n  DATA_FLASH (rx)                 : ORIGIN = DATA_FLASH_START, LENGTH = DATA_FLASH_LENGTH\n  QSPI_FLASH (rx)                 : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_PRV_LENGTH\n  OSPI_DEVICE_0 (rx)              : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1 (rx)              : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  OSPI_DEVICE_0_RAM (rwx)         : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1_RAM (rwx)         : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  SDRAM (rwx)                     : ORIGIN = SDRAM_START, LENGTH = SDRAM_LENGTH\n  OPTION_SETTING (r)              : ORIGIN = OPTION_SETTING_START, LENGTH = OPTION_SETTING_LENGTH\n  OPTION_SETTING_OFS (r)          : ORIGIN = OPTION_SETTING_START, LENGTH = 0x18\n  OPTION_SETTING_SAS (r)          : ORIGIN = OPTION_SETTING_START + OPTION_SETTING_SAS_SIZE, LENGTH = OPTION_SETTING_SAS_LENGTH\n  OPTION_SETTING_S (r)            : ORIGIN = OPTION_SETTING_S_START, LENGTH = OPTION_SETTING_S_LENGTH\n  ID_CODE (rx)                    : ORIGIN = ID_CODE_START, LENGTH = ID_CODE_LENGTH\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be DEFINED in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n *   __qspi_flash_start__\n *   __qspi_flash_end__\n *   __qspi_flash_code_size__\n *   __qspi_region_max_size__\n *   __qspi_region_start_address__\n *   __qspi_region_end_address__\n *   __ospi_device_0_start__\n *   __ospi_device_0_end__\n *   __ospi_device_0_code_size__\n *   __ospi_device_0_region_max_size__\n *   __ospi_device_0_region_start_address__\n *   __ospi_device_0_region_end_address__\n *   __ospi_device_1_start__\n *   __ospi_device_1_end__\n *   __ospi_device_1_code_size__\n *   __ospi_device_1_region_max_size__\n *   __ospi_device_1_region_start_address__\n *   __ospi_device_1_region_end_address__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .text :\n    {\n        __tz_FLASH_S = ABSOLUTE(FLASH_START);\n        __ROM_Start = .;\n\n        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much\n         * space because ROM registers are at address 0x400 and there is very little space\n         * in between. */\n        KEEP(*(.fixed_vectors*))\n        KEEP(*(.application_vectors*))\n        __Vectors_End = .;\n\n        /* Some devices have a gap of code flash between the vector table and ROM Registers.\n         * The flash gap section allows applications to place code and data in this section. */\n        *(.flash_gap*)\n\n        /* ROM Registers start at address 0x00000400 for devices that do not have the OPTION_SETTING region. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x400;\n        KEEP(*(.rom_registers*))\n\n        /* Reserving 0x100 bytes of space for ROM registers. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x500;\n\n        /* Allocate flash write-boundary-aligned\n         * space for sce9 wrapped public keys for mcuboot if the module is used.\n         */\n        KEEP(*(.mcuboot_sce9_key*))\n\n        *(.text*)\n\n        KEEP(*(.version))\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n        __usb_dev_descriptor_start_fs = .;\n        KEEP(*(.usb_device_desc_fs*))\n        __usb_cfg_descriptor_start_fs = .;\n        KEEP(*(.usb_config_desc_fs*))\n        __usb_interface_descriptor_start_fs = .;\n        KEEP(*(.usb_interface_desc_fs*))\n        __usb_descriptor_end_fs = .;\n        __usb_dev_descriptor_start_hs = .;\n        KEEP(*(.usb_device_desc_hs*))\n        __usb_cfg_descriptor_start_hs = .;\n        KEEP(*(.usb_config_desc_hs*))\n        __usb_interface_descriptor_start_hs = .;\n        KEEP(*(.usb_interface_desc_hs*))\n        __usb_descriptor_end_hs = .;\n\n        KEEP(*(.eh_frame*))\n\n        __ROM_End = .;\n    } > FLASH = 0xFF\n\n    __Vectors_Size = __Vectors_End - __Vectors;\n\n    . = .;\n    __itcm_data_pre_location = .;\n\n    /* Initialized ITCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .itcm_data : ALIGN(16)\n    {\n        /* Start of ITCM Secure Trustzone region. */\n        __tz_ITCM_S = ABSOLUTE(ITCM_START);\n\n        /* All ITCM data start */\n        __itcm_data_start = .;\n\n        KEEP(*(.itcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* All ITCM data end */\n        __itcm_data_end = .;\n\n        /*\n         * Start of the ITCM Non-Secure Trustzone region.\n         * ITCM_NS_START can be used to set a fixed address for non-secure ITCM in secure projects or flat projects.\n         */\n        __tz_ITCM_N = DEFINED(ITCM_NS_START) ? ABSOLUTE(ITCM_NS_START) : ALIGN(__itcm_data_end, 8192);\n    } > ITCM AT > FLASH = 0x00\n\n    /* Addresses exported for ITCM initialization. */\n    __itcm_data_init_start = LOADADDR(.itcm_data);\n    __itcm_data_init_end = LOADADDR(.itcm_data) + SIZEOF(.itcm_data);\n\n    ASSERT(ORIGIN(ITCM) % 8 == 0, \"ITCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(ITCM) % 8 == 0, \"ITCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.itcm_data) % 16 == 0, \".itcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.itcm_data) % 8 == 0, \".itcm_data section size must be a multiple of 8 bytes.\")\n\n    /* Restore location counter. */\n    /* If ITCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If ITCM is present, this will be the absolute address that follows the ITCM ROM location. */\n    . = (SIZEOF(.itcm_data) > 0) ? __itcm_data_init_end : __itcm_data_pre_location;\n\n    __exidx_start = .;\n    /DISCARD/ :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    }\n    __exidx_end = .;\n\n    /* To copy multiple ROM to RAM sections,\n     * uncomment .copy.table section and,\n     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .copy.table :\n    {\n        . = ALIGN(4);\n        __copy_table_start__ = .;\n        LONG (__etext)\n        LONG (__data_start__)\n        LONG (__data_end__ - __data_start__)\n        LONG (__etext2)\n        LONG (__data2_start__)\n        LONG (__data2_end__ - __data2_start__)\n        __copy_table_end__ = .;\n    } > FLASH\n    */\n\n    /* To clear multiple BSS sections,\n     * uncomment .zero.table section and,\n     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .zero.table :\n    {\n        . = ALIGN(4);\n        __zero_table_start__ = .;\n        LONG (__bss_start__)\n        LONG (__bss_end__ - __bss_start__)\n        LONG (__bss2_start__)\n        LONG (__bss2_end__ - __bss2_start__)\n        __zero_table_end__ = .;\n    } > FLASH\n    */\n\n    __etext = .;\n\n    __tz_RAM_S = ORIGIN(RAM);\n\n    /* If DTC is used, put the DTC vector table at the start of SRAM.\n       This avoids memory holes due to 1K alignment required by it. */\n    .fsp_dtc_vector_table (NOLOAD) :\n    {\n        . = ORIGIN(RAM);\n        *(.fsp_dtc_vector_table)\n    } > RAM\n\n    /* Initialized data section. */\n    .data :\n    {\n        __data_start__ = .;\n        . = ALIGN(4);\n\n        __Code_In_RAM_Start = .;\n\n        KEEP(*(.code_in_ram*))\n        __Code_In_RAM_End = .;\n\n        *(vtable)\n        /* Don't use *(.data*) because it will place data meant for .data_flash in this section. */\n        *(.data.*)\n        *(.data)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        KEEP(*(.jcr*))\n\n        . = ALIGN(4);\n\n        /* All data end */\n        __data_end__ = .;\n\n    } > RAM AT > FLASH\n\n    . = .;\n    __dtcm_data_pre_location = LOADADDR(.data) + SIZEOF(.data);\n\n    /* Initialized DTCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .dtcm_data : ALIGN(16)\n    {\n        /* Start of DTCM Secure Trustzone region. */\n        __tz_DTCM_S = ABSOLUTE(DTCM_START);\n\n        /* Initialized DTCM data start */\n        __dtcm_data_start = .;\n\n        KEEP(*(.dtcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* Initialized DTCM data end */\n        __dtcm_data_end = .;\n    } > DTCM AT > FLASH = 0x00\n\n    . = __dtcm_data_end;\n    /* Uninitialized DTCM data. */\n    /* ALIGN appears on the left side of the colon because it is being used to assign the VMA directly, as opposed to a right side appearance which would control the LMA. */\n    .dtcm_bss ALIGN(8) (NOLOAD) :\n    {\n        /* Uninitialized DTCM data start */\n        __dtcm_bss_start = .;\n\n        KEEP(*(.dtcm_bss*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. No fill because of NOLOAD. */\n        . = ALIGN(8);\n\n        /* Uninitialized DTCM data end */\n        __dtcm_bss_end = .;\n\n        /*\n         * Start of the DTCM Non-Secure Trustzone region.\n         * DTCM_NS_START can be used to set a fixed address for non-secure DTCM in secure projects or flat projects.\n         */\n        __tz_DTCM_N = DEFINED(DTCM_NS_START) ? ABSOLUTE(DTCM_NS_START) : ALIGN(__dtcm_bss_end, 8192);\n    } > DTCM\n\n    /* Addresses exported for DTCM initialization. */\n    __dtcm_data_init_start = LOADADDR(.dtcm_data);\n    __dtcm_data_init_end = LOADADDR(.dtcm_data) + SIZEOF(.dtcm_data);\n\n    ASSERT(ORIGIN(DTCM) % 8 == 0, \"DTCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(DTCM) % 8 == 0, \"DTCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) == ADDR(.dtcm_bss), \".dtcm_bss has (VMA != LMA) but should be NOLOAD (VMA == LMA).\")\n    ASSERT(LOADADDR(.dtcm_data) % 16 == 0, \".dtcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.dtcm_data) % 8 == 0, \".dtcm_data section size must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) % 8 == 0, \".dtcm_bss section must be aligned to 8 bytes.\")\n    ASSERT(SIZEOF(.dtcm_bss) % 8 == 0, \".dtcm_bss section size must be a multiple of 8 bytes.\")\n    ASSERT(__dtcm_bss_start == __dtcm_data_end, \".dtcm_bss section is not adjacent to .dtcm_data section.\")\n\n    /* Restore location counter. */\n    /* If DTCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If DTCM is present, this will be the absolute address that follows the DTCM ROM location. */\n    . = (SIZEOF(.dtcm_data) > 0) ? __dtcm_data_init_end : __dtcm_data_pre_location;\n\n    /* TrustZone Secure Gateway Stubs Section */\n\n    /* Store location counter for SPI non-retentive sections. */\n    sgstubs_pre_location = .;\n\n    /* Determine the secure gateway stubs address either by the provided linker variable or the next 1024-byte block. */\n    SGSTUBS_LOC = (DEFINED(PROJECT_SECURE) && DEFINED(FLASH_NSC_START)) ? ABSOLUTE(FLASH_NSC_START) : ALIGN(1024);\n    .gnu.sgstubs SGSTUBS_LOC : ALIGN(1024)\n    {\n        __tz_FLASH_C = DEFINED(FLASH_NSC_START) ? ABSOLUTE(FLASH_NSC_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : ALIGN(1024);\n        _start_sg = .;\n        *(.gnu.sgstubs*)\n        . = ALIGN(32);\n        _end_sg = .;\n    } > FLASH\n\n    __tz_FLASH_N = DEFINED(FLASH_NS_START) ? ABSOLUTE(FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : FLASH_LENGTH < 32768 ? FLASH_LENGTH : ALIGN(32768);\n    FLASH_NS_IMAGE_START = DEFINED(FLASH_NS_IMAGE_START) ? FLASH_NS_IMAGE_START : __tz_FLASH_N;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_S = ORIGIN(QSPI_FLASH);\n\n    /* QSPI_FLASH section to be downloaded via debugger */\n    .qspi_flash :\n    {\n        __qspi_flash_start__ = .;\n        KEEP(*(.qspi_flash*))\n        KEEP(*(.code_in_qspi*))\n        __qspi_flash_end__ = .;\n    } > QSPI_FLASH\n    __qspi_flash_code_size__ = __qspi_flash_end__ - __qspi_flash_start__;\n\n    /* QSPI_FLASH non-retentive section, creates a copy in internal flash that can be copied to QSPI */\n    __qspi_flash_code_addr__ = sgstubs_pre_location;\n    .qspi_non_retentive : AT(__qspi_flash_code_addr__)\n    {\n        __qspi_non_retentive_start__ = .;\n        KEEP(*(.qspi_non_retentive*))\n        __qspi_non_retentive_end__ = .;\n    } > QSPI_FLASH\n    __qspi_non_retentive_size__ = __qspi_non_retentive_end__ - __qspi_non_retentive_start__;\n\n    __qspi_region_max_size__ = 0x4000000;   /* Must be the same as defined in MEMORY above */\n    __qspi_region_start_address__ = __qspi_flash_start__;\n    __qspi_region_end_address__ = __qspi_flash_start__ + __qspi_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_N = __qspi_non_retentive_end__;\n\n    /* Support for OctaRAM */\n    .OSPI_DEVICE_0_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_0_start__ = .;\n        *(.ospi_device_0_no_load*)\n        . = ALIGN(4);\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0_RAM\n\n    .OSPI_DEVICE_1_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_1_start__ = .;\n        *(.ospi_device_1_no_load*)\n        . = ALIGN(4);\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1_RAM\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_S = ORIGIN(OSPI_DEVICE_0);\n\n    /* OSPI_DEVICE_0 section to be downloaded via debugger */\n    .OSPI_DEVICE_0 :\n    {\n        __ospi_device_0_start__ = .;\n        KEEP(*(.ospi_device_0*))\n        KEEP(*(.code_in_ospi_device_0*))\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_code_size__ = __ospi_device_0_end__ - __ospi_device_0_start__;\n\n    /* OSPI_DEVICE_0 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n     __ospi_device_0_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive));\n    .ospi_device_0_non_retentive : AT(__ospi_device_0_code_addr__)\n    {\n        __ospi_device_0_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_0_non_retentive*))\n        __ospi_device_0_non_retentive_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_non_retentive_size__ = __ospi_device_0_non_retentive_end__ - __ospi_device_0_non_retentive_start__;\n\n    __ospi_device_0_region_max_size__ = 0x8000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_0_region_start_address__ = __ospi_device_0_start__;\n    __ospi_device_0_region_end_address__ = __ospi_device_0_start__ + __ospi_device_0_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_N = __ospi_device_0_non_retentive_end__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_S = ORIGIN(OSPI_DEVICE_1);\n\n    /* OSPI_DEVICE_1 section to be downloaded via debugger */\n    .OSPI_DEVICE_1 :\n    {\n        __ospi_device_1_start__ = .;\n        KEEP(*(.ospi_device_1*))\n        KEEP(*(.code_in_ospi_device_1*))\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_code_size__ = __ospi_device_1_end__ - __ospi_device_1_start__;\n\n    /* OSPI_DEVICE_1 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n    __ospi_device_1_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive) + SIZEOF(.ospi_device_0_non_retentive));\n    .ospi_device_1_non_retentive : AT(__ospi_device_1_code_addr__)\n    {\n        __ospi_device_1_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_1_non_retentive*))\n        __ospi_device_1_non_retentive_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_non_retentive_size__ = __ospi_device_1_non_retentive_end__ - __ospi_device_1_non_retentive_start__;\n\n    __ospi_device_1_region_max_size__ = 0x10000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_1_region_start_address__ = __ospi_device_1_start__;\n    __ospi_device_1_region_end_address__ = __ospi_device_1_start__ + __ospi_device_1_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_N = __ospi_device_1_non_retentive_end__;\n\n    .noinit (NOLOAD):\n    {\n        . = ALIGN(4);\n        __noinit_start = .;\n        KEEP(*(.noinit*))\n        . = ALIGN(8);\n        /* Place the FreeRTOS heap here so that the __HeapLimit calculation does not include the freertos heap. */\n        KEEP(*(.heap.*))\n        __noinit_end = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n        __HeapBase = .;\n        /* Place the STD heap here. */\n        KEEP(*(.heap))\n        __HeapLimit = .;\n    } > RAM\n\n    /* Stacks are stored in this section. */\n    .stack_dummy (NOLOAD):\n    {\n        . = ALIGN(8);\n        __StackLimit = .;\n        /* Main stack */\n        KEEP(*(.stack))\n        __StackTop = .;\n        /* Thread stacks */\n        KEEP(*(.stack*))\n        __StackTopAll = .;\n    } > RAM\n\n    PROVIDE(__stack = __StackTopAll);\n\n    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used\n       at run time for things such as ThreadX memory pool allocations. */\n    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);\n\n    /* RAM_NSC_START can be used to set a fixed address for non-secure callable RAM in secure projects.\n     * If it is not specified, the address for NSC RAM is the end of RAM aligned to a 1K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_C = DEFINED(RAM_NSC_START) ? ABSOLUTE(RAM_NSC_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_segment_used_end__, 1024);\n\n    /* RAM_NS_START can be used to set a fixed address for non-secure RAM in secure projects or flat projects.\n     * RAM_NS_BUFFER_BLOCK_LENGTH is used to allocate non-secure buffers in a flat project. If it is not\n     * specified, the address for NSC RAM is the end of RAM aligned to an 8K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_N = DEFINED(RAM_NS_START) ? ABSOLUTE(RAM_NS_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__tz_RAM_C, 8192);\n\n    /* Non-secure buffers must be in non-secure RAM. This is primarily used for the EDMAC in flat projects.\n     * The EDMAC is a non-secure bus master and can only access non-secure RAM. */\n    .ns_buffer (NOLOAD):\n    {\n        /* Allocate RAM on a 32-byte boundary to help with placement of Ethernet buffers. */\n        . = __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_START & 0xFFFFFFE0) : .;\n\n        KEEP(*(.ns_buffer*))\n    } > RAM\n\n    /* Data flash. */\n    .data_flash :\n    {\n        . = ORIGIN(DATA_FLASH);\n        __tz_DATA_FLASH_S = .;\n        __Data_Flash_Start = .;\n        KEEP(*(.data_flash*))\n        __Data_Flash_End = .;\n\n        __tz_DATA_FLASH_N = DEFINED(DATA_FLASH_NS_START) ? ABSOLUTE(DATA_FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(DATA_FLASH_START + DATA_FLASH_LENGTH) : ALIGN(1024);\n    } > DATA_FLASH\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_S = ORIGIN(SDRAM);\n\n    /* SDRAM */\n    .sdram (NOLOAD):\n    {\n        __SDRAM_Start = .;\n        KEEP(*(.sdram*))\n        KEEP(*(.frame*))\n        __SDRAM_End = .;\n    } > SDRAM\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_N = __SDRAM_End;\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool. */\n    __tz_ID_CODE_S = ORIGIN(ID_CODE);\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool.\n     *       Set this symbol to the same value as __tz_ID_CODE_S so the RA configuration tool does not split the ID_CODE\n     *       memory region between TrustZone projects. */\n    __tz_ID_CODE_N = __tz_ID_CODE_S;\n\n    .id_code :\n    {\n        __ID_Code_Start = .;\n        KEEP(*(.id_code*))\n        __ID_Code_End = .;\n    } > ID_CODE\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S = ORIGIN(OPTION_SETTING_OFS);\n\n    .option_setting_ofs :\n    {\n        __OPTION_SETTING_OFS_Start = .;\n        KEEP(*(.option_setting_ofs0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x04 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_ofs2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x10 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_dualsel))\n        __OPTION_SETTING_OFS_End = .;\n    } > OPTION_SETTING_OFS = 0xFF\n\n    .option_setting_sas :\n    {\n        __OPTION_SETTING_SAS_Start = .;\n        KEEP(*(.option_setting_sas))\n        __OPTION_SETTING_SAS_End = .;\n    } > OPTION_SETTING_SAS = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_N = ABSOLUTE(OPTION_SETTING_START_NS);\n\n    .option_setting_ns :\n    {\n        __OPTION_SETTING_NS_Start = .;\n        KEEP(*(.option_setting_ofs1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x04 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_ofs3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x10 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_banksel))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x40 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x44 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x48 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x4C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x60 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x64 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x68 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x6C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps3))\n        __OPTION_SETTING_NS_End = .;\n    } > OPTION_SETTING = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_S = ORIGIN(OPTION_SETTING_S);\n\n    .option_setting_s :\n    {\n        __OPTION_SETTING_S_Start = .;\n        KEEP(*(.option_setting_ofs1_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x04 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x10 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x40 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x44 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x48 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x4C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x60 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x64 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x68 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x6C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x80 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs1_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x84 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x90 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC0 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC4 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC8 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xCC : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel3))\n        __OPTION_SETTING_S_End = .;\n    } > OPTION_SETTING_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_N = __OPTION_SETTING_S_End;\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/script/memory_regions.ld",
    "content": "\n            /* generated memory regions file - do not edit */\n                            RAM_START  = 0x20000000;\n                RAM_LENGTH = 0x8000;\n                FLASH_START  = 0x00000000;\n                FLASH_LENGTH = 0x40000;\n                DATA_FLASH_START  = 0x40100000;\n                DATA_FLASH_LENGTH = 0x2000;\n                OPTION_SETTING_START  = 0x00000000;\n                OPTION_SETTING_LENGTH = 0x0;\n                OPTION_SETTING_S_START  = 0x80000000;\n                OPTION_SETTING_S_LENGTH = 0x0;\n                ID_CODE_START  = 0x01010018;\n                ID_CODE_LENGTH = 0x20;\n                SDRAM_START  = 0x80010000;\n                SDRAM_LENGTH = 0x0;\n                QSPI_FLASH_START  = 0x60000000;\n                QSPI_FLASH_LENGTH = 0x0;\n                OSPI_DEVICE_0_START  = 0x80020000;\n                OSPI_DEVICE_0_LENGTH = 0x0;\n                OSPI_DEVICE_1_START  = 0x80030000;\n                OSPI_DEVICE_1_LENGTH = 0x0;\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra2a1_ek/smart_configurator/configuration.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<raConfiguration version=\"9\">\n  <generalSettings>\n    <option key=\"#Board#\" value=\"board.ra2a1_ek\"/>\n    <option key=\"CPU\" value=\"RA2A1\"/>\n    <option key=\"Core\" value=\"CM23\"/>\n    <option key=\"#TargetName#\" value=\"R7FA2A1AB3CFM\"/>\n    <option key=\"#TargetARCHITECTURE#\" value=\"cortex-m23\"/>\n    <option key=\"#DeviceCommand#\" value=\"R7FA2A1AB\"/>\n    <option key=\"#RTOS#\" value=\"_none\"/>\n    <option key=\"#pinconfiguration#\" value=\"R7FA2A1AB3CFM.pincfg\"/>\n    <option key=\"#FSPVersion#\" value=\"5.6.0\"/>\n    <option key=\"#ConfigurationFragments#\" value=\"Renesas##BSP##Board##ra2a1_ek##\"/>\n    <option key=\"#SELECTED_TOOLCHAIN#\" value=\"com.renesas.cdt.managedbuild.gnuarm.toolchain.\"/>\n  </generalSettings>\n  <raBspConfiguration>\n    <config id=\"config.bsp.ra2a1.R7FA2A1AB3CFM\">\n      <property id=\"config.bsp.part_number\" value=\"config.bsp.part_number.value\"/>\n      <property id=\"config.bsp.rom_size_bytes\" value=\"config.bsp.rom_size_bytes.value\"/>\n      <property id=\"config.bsp.rom_size_bytes_hidden\" value=\"262144\"/>\n      <property id=\"config.bsp.ram_size_bytes\" value=\"config.bsp.ram_size_bytes.value\"/>\n      <property id=\"config.bsp.data_flash_size_bytes\" value=\"config.bsp.data_flash_size_bytes.value\"/>\n      <property id=\"config.bsp.package_style\" value=\"config.bsp.package_style.value\"/>\n      <property id=\"config.bsp.package_pins\" value=\"config.bsp.package_pins.value\"/>\n      <property id=\"config.bsp.irq_count_hidden\" value=\"32\"/>\n    </config>\n    <config id=\"config.bsp.ra2a1\">\n      <property id=\"config.bsp.series\" value=\"config.bsp.series.value\"/>\n    </config>\n    <config id=\"config.bsp.ra2a1.fsp\">\n      <property id=\"config.bsp.fsp.inline_irq_functions\" value=\"config.bsp.common.inline_irq_functions.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_start_mode\" value=\"config.bsp.fsp.OFS0.iwdt_start_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_timeout\" value=\"config.bsp.fsp.OFS0.iwdt_timeout.2048\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_divisor\" value=\"config.bsp.fsp.OFS0.iwdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_end\" value=\"config.bsp.fsp.OFS0.iwdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_start\" value=\"config.bsp.fsp.OFS0.iwdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_stop_control\" value=\"config.bsp.fsp.OFS0.iwdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_start_mode\" value=\"config.bsp.fsp.OFS0.wdt_start_mode.register\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_timeout\" value=\"config.bsp.fsp.OFS0.wdt_timeout.16384\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_divisor\" value=\"config.bsp.fsp.OFS0.wdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_end\" value=\"config.bsp.fsp.OFS0.wdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_start\" value=\"config.bsp.fsp.OFS0.wdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.wdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_stop_control\" value=\"config.bsp.fsp.OFS0.wdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1.voltage_detection0.start.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1.voltage_detection0_level.190\"/>\n      <property id=\"config.bsp.fsp.OFS1.hoco_osc\" value=\"config.bsp.fsp.OFS1.hoco_osc.enabled\"/>\n      <property id=\"config.bsp.low_voltage_mode\" value=\"config.bsp.low_voltage_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_enable\" value=\"config.bsp.fsp.mpu_pc0_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_start\" value=\"0x000FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_end\" value=\"0x000FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_enable\" value=\"config.bsp.fsp.mpu_pc1_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_start\" value=\"0x000FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_end\" value=\"0x000FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_enable\" value=\"config.bsp.fsp.mpu_reg0_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_start\" value=\"0x000FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_end\" value=\"0x000FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_enable\" value=\"config.bsp.fsp.mpu_reg1_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_start\" value=\"0x200FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_end\" value=\"0x200FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_enable\" value=\"config.bsp.fsp.mpu_reg2_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_start\" value=\"0x407FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_end\" value=\"0x407FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_enable\" value=\"config.bsp.fsp.mpu_reg3_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_start\" value=\"0x400DFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_end\" value=\"0x400DFFFF\"/>\n      <property id=\"config.bsp.common.main_osc_wait\" value=\"config.bsp.common.main_osc_wait.wait_8163\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.max_freq_hz\" value=\"32000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.max_baud\" value=\"3333333\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sample_and_hold\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sensors_are_exclusive\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_spi.max_bitrate\" value=\"8000000\"/>\n      <property id=\"config.bsp.fsp.mcu.spi.max_bitrate\" value=\"16000000\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.rate.rate_fastplus\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.fastplus_channels\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.rate.rate_fastplus\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.fastplus_channels\" value=\"0x0\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.cstpen_channels\" value=\"0x0\"/>\n      <property id=\"config.bsp.fsp.mcu.gpt.pin_count_source_channels\" value=\"0xFFFF\"/>\n      <property id=\"config.bsp.common.id_mode\" value=\"config.bsp.common.id_mode.unlocked\"/>\n      <property id=\"config.bsp.common.id_code\" value=\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"/>\n      <property id=\"config.bsp.common.id1\" value=\"\"/>\n      <property id=\"config.bsp.common.id2\" value=\"\"/>\n      <property id=\"config.bsp.common.id3\" value=\"\"/>\n      <property id=\"config.bsp.common.id4\" value=\"\"/>\n      <property id=\"config.bsp.common.id_fixed\" value=\"\"/>\n      <property id=\"config.bsp.common.fill_flash_gap\" value=\"config.bsp.common.fill_flash_gap.disabled\"/>\n    </config>\n    <config id=\"config.bsp.ra\">\n      <property id=\"config.bsp.common.main\" value=\"0x400\"/>\n      <property id=\"config.bsp.common.heap\" value=\"0x400\"/>\n      <property id=\"config.bsp.common.vcc\" value=\"3300\"/>\n      <property id=\"config.bsp.common.checking\" value=\"config.bsp.common.checking.disabled\"/>\n      <property id=\"config.bsp.common.assert\" value=\"config.bsp.common.assert.none\"/>\n      <property id=\"config.bsp.common.error_log\" value=\"config.bsp.common.error_log.none\"/>\n      <property id=\"config.bsp.common.soft_reset\" value=\"config.bsp.common.soft_reset.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_populated\" value=\"config.bsp.common.main_osc_populated.enabled\"/>\n      <property id=\"config.bsp.common.pfs_protect\" value=\"config.bsp.common.pfs_protect.enabled\"/>\n      <property id=\"config.bsp.common.c_runtime_init\" value=\"config.bsp.common.c_runtime_init.enabled\"/>\n      <property id=\"config.bsp.common.early_init\" value=\"config.bsp.common.early_init.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_clock_source\" value=\"config.bsp.common.main_osc_clock_source.crystal\"/>\n      <property id=\"config.bsp.common.subclock_populated\" value=\"config.bsp.common.subclock_populated.enabled\"/>\n      <property id=\"config.bsp.common.subclock_drive\" value=\"config.bsp.common.subclock_drive.standard\"/>\n      <property id=\"config.bsp.common.subclock_stabilization_ms\" value=\"1000\"/>\n    </config>\n  </raBspConfiguration>\n  <raClockConfiguration>\n    <node id=\"board.clock.xtal.freq\" mul=\"12000000\" option=\"_edit\"/>\n    <node id=\"board.clock.hoco.freq\" option=\"board.clock.hoco.freq.48m\"/>\n    <node id=\"board.clock.loco.freq\" option=\"board.clock.loco.freq.32768\"/>\n    <node id=\"board.clock.moco.freq\" option=\"board.clock.moco.freq.8m\"/>\n    <node id=\"board.clock.subclk.freq\" option=\"board.clock.subclk.freq.32768\"/>\n    <node id=\"board.clock.clock.source\" option=\"board.clock.clock.source.hoco\"/>\n    <node id=\"board.clock.iclk.div\" option=\"board.clock.iclk.div.1\"/>\n    <node id=\"board.clock.iclk.display\" option=\"board.clock.iclk.display.value\"/>\n    <node id=\"board.clock.pclkb.div\" option=\"board.clock.pclkb.div.2\"/>\n    <node id=\"board.clock.pclkb.display\" option=\"board.clock.pclkb.display.value\"/>\n    <node id=\"board.clock.pclkd.div\" option=\"board.clock.pclkd.div.1\"/>\n    <node id=\"board.clock.pclkd.display\" option=\"board.clock.pclkd.display.value\"/>\n    <node id=\"board.clock.fclk.div\" option=\"board.clock.fclk.div.2\"/>\n    <node id=\"board.clock.fclk.display\" option=\"board.clock.fclk.display.value\"/>\n    <node id=\"board.clock.uclk.display\" option=\"board.clock.uclk.display.value\"/>\n    <node id=\"board.clock.sdadcclk.source\" option=\"board.clock.sdadcclk.source.hoco\"/>\n    <node id=\"board.clock.sdadcclk.div\" option=\"board.clock.sdadcclk.div.12\"/>\n    <node id=\"board.clock.sdadcclk.display\" option=\"board.clock.sdadcclk.display.value\"/>\n    <node id=\"board.clock.clkout.source\" option=\"board.clock.clkout.source.disabled\"/>\n    <node id=\"board.clock.clkout.div\" option=\"board.clock.clkout.div.1\"/>\n    <node id=\"board.clock.clkout.display\" option=\"board.clock.clkout.display.value\"/>\n  </raClockConfiguration>\n  <raComponentSelection>\n    <component apiversion=\"\" class=\"Projects\" condition=\"\" group=\"all\" subgroup=\"baremetal_blinky\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Simple application that blinks an LED. No RTOS included.</description>\n      <originalPack>Renesas.RA_baremetal_blinky.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"Common\" condition=\"\" group=\"all\" subgroup=\"fsp_common\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board Support Package Common Files</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_ioport\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>I/O Port</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"CMSIS\" condition=\"\" group=\"CMSIS5\" subgroup=\"CoreM\" variant=\"\" vendor=\"Arm\" version=\"6.1.0+fsp.5.6.0\">\n      <description>Arm CMSIS Version 6 - Core (M)</description>\n      <originalPack>Arm.CMSIS6.6.1.0+fsp.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"Board\" subgroup=\"ra2a1_ek\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>RA2A1-EK Board Support Files</description>\n      <originalPack>Renesas.RA_board_ra2a1_ek.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra2a1\" subgroup=\"device\" variant=\"R7FA2A1AB3CFM\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for R7FA2A1AB3CFM</description>\n      <originalPack>Renesas.RA_mcu_ra2a1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra2a1\" subgroup=\"device\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA2A1</description>\n      <originalPack>Renesas.RA_mcu_ra2a1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra2a1\" subgroup=\"fsp\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA2A1 - FSP Data</description>\n      <originalPack>Renesas.RA_mcu_ra2a1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra2a1\" subgroup=\"events\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA2A1 - Events</description>\n      <originalPack>Renesas.RA_mcu_ra2a1.5.6.0.pack</originalPack>\n    </component>\n  </raComponentSelection>\n  <raElcConfiguration/>\n  <raIcuConfiguration/>\n  <raModuleConfiguration>\n    <module id=\"module.driver.ioport_on_ioport.0\">\n      <property id=\"module.driver.ioport.name\" value=\"g_ioport\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport1\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport2\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport3\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport4\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.pincfg\" value=\"g_bsp_pin_cfg\"/>\n    </module>\n    <context id=\"_hal.0\">\n      <stack module=\"module.driver.ioport_on_ioport.0\"/>\n    </context>\n    <config id=\"config.driver.ioport\">\n      <property id=\"config.driver.ioport.checking\" value=\"config.driver.ioport.checking.system\"/>\n    </config>\n  </raModuleConfiguration>\n  <raPinConfiguration>\n    <symbolicName propertyId=\"p205.symbolic_name\" value=\"LED1\"/>\n    <symbolicName propertyId=\"p206.symbolic_name\" value=\"SW1\"/>\n    <pincfg active=\"true\" name=\"RA2A1-EK.pincfg\" selected=\"true\" symbol=\"g_bsp_pin_cfg\">\n      <configSetting altId=\"adc0.an06.p003\" configurationId=\"adc0.an06\"/>\n      <configSetting altId=\"adc0.mode.custom\" configurationId=\"adc0.mode\"/>\n      <configSetting altId=\"ctsu0.mode.enabled\" configurationId=\"ctsu0.mode\"/>\n      <configSetting altId=\"ctsu0.ts15.p001\" configurationId=\"ctsu0.ts15\"/>\n      <configSetting altId=\"ctsu0.tscap.p409\" configurationId=\"ctsu0.tscap\"/>\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"p001.ctsu0.ts15\" configurationId=\"p001\"/>\n      <configSetting altId=\"p001.gpio_mode.gpio_mode_peripheral\" configurationId=\"p001.gpio_mode\"/>\n      <configSetting altId=\"p003.adc0.an06\" configurationId=\"p003\"/>\n      <configSetting altId=\"p003.gpio_mode.gpio_mode_an\" configurationId=\"p003.gpio_mode\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p111.spi0.rspck\" configurationId=\"p111\"/>\n      <configSetting altId=\"p111.gpio_mode.gpio_mode_peripheral\" configurationId=\"p111.gpio_mode\"/>\n      <configSetting altId=\"p112.spi0.ssl0\" configurationId=\"p112\"/>\n      <configSetting altId=\"p112.gpio_mode.gpio_mode_peripheral\" configurationId=\"p112.gpio_mode\"/>\n      <configSetting altId=\"p201.input\" configurationId=\"p201\"/>\n      <configSetting altId=\"p201.gpio_mode.gpio_mode_in\" configurationId=\"p201.gpio_mode\"/>\n      <configSetting altId=\"p204.sci0.rxd\" configurationId=\"p204\"/>\n      <configSetting altId=\"p204.gpio_mode.gpio_mode_peripheral\" configurationId=\"p204.gpio_mode\"/>\n      <configSetting altId=\"p205.output.low\" configurationId=\"p205\"/>\n      <configSetting altId=\"p205.gpio_mode.gpio_mode_out.low\" configurationId=\"p205.gpio_mode\"/>\n      <configSetting altId=\"p206.input\" configurationId=\"p206\"/>\n      <configSetting altId=\"p206.gpio_mode.gpio_mode_in\" configurationId=\"p206.gpio_mode\"/>\n      <configSetting altId=\"p206.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p206.gpio_pupd\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n      <configSetting altId=\"p303.spi0.mosi\" configurationId=\"p303\"/>\n      <configSetting altId=\"p303.gpio_mode.gpio_mode_peripheral\" configurationId=\"p303.gpio_mode\"/>\n      <configSetting altId=\"p304.spi0.miso\" configurationId=\"p304\"/>\n      <configSetting altId=\"p304.gpio_mode.gpio_mode_peripheral\" configurationId=\"p304.gpio_mode\"/>\n      <configSetting altId=\"p407.usbfs0.vbus\" configurationId=\"p407\"/>\n      <configSetting altId=\"p407.gpio_mode.gpio_mode_peripheral\" configurationId=\"p407.gpio_mode\"/>\n      <configSetting altId=\"p409.ctsu0.tscap\" configurationId=\"p409\"/>\n      <configSetting altId=\"p409.gpio_mode.gpio_mode_peripheral\" configurationId=\"p409.gpio_mode\"/>\n      <configSetting altId=\"p411.sci0.txd\" configurationId=\"p411\"/>\n      <configSetting altId=\"p411.gpio_mode.gpio_mode_peripheral\" configurationId=\"p411.gpio_mode\"/>\n      <configSetting altId=\"p914.usbfs0.dp\" configurationId=\"p914\"/>\n      <configSetting altId=\"p914.gpio_mode.gpio_mode_peripheral\" configurationId=\"p914.gpio_mode\"/>\n      <configSetting altId=\"p915.usbfs0.dm\" configurationId=\"p915\"/>\n      <configSetting altId=\"p915.gpio_mode.gpio_mode_peripheral\" configurationId=\"p915.gpio_mode\"/>\n      <configSetting altId=\"sci0.mode.asynchronous.free\" configurationId=\"sci0.mode\"/>\n      <configSetting altId=\"sci0.rxd.p204\" configurationId=\"sci0.rxd\"/>\n      <configSetting altId=\"sci0.txd.p411\" configurationId=\"sci0.txd\"/>\n      <configSetting altId=\"spi0.miso.p304\" configurationId=\"spi0.miso\"/>\n      <configSetting altId=\"spi0.mode.enabled.b\" configurationId=\"spi0.mode\"/>\n      <configSetting altId=\"spi0.mosi.p303\" configurationId=\"spi0.mosi\"/>\n      <configSetting altId=\"spi0.pairing.b\" configurationId=\"spi0.pairing\"/>\n      <configSetting altId=\"spi0.rspck.p111\" configurationId=\"spi0.rspck\"/>\n      <configSetting altId=\"spi0.ssl0.p112\" configurationId=\"spi0.ssl0\"/>\n      <configSetting altId=\"usbfs0.dm.p915\" configurationId=\"usbfs0.dm\"/>\n      <configSetting altId=\"usbfs0.dp.p914\" configurationId=\"usbfs0.dp\"/>\n      <configSetting altId=\"usbfs0.mode.device\" configurationId=\"usbfs0.mode\"/>\n      <configSetting altId=\"usbfs0.vbus.p407\" configurationId=\"usbfs0.vbus\"/>\n    </pincfg>\n    <pincfg active=\"false\" name=\"R7FA2A1AB3CFM.pincfg\" selected=\"false\" symbol=\"\">\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n    </pincfg>\n  </raPinConfiguration>\n</raConfiguration>\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(MCU_VARIANT ra4m1)\n\nset(JLINK_DEVICE R7FA4M1AB)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\n#  target_sources(${TARGET} PRIVATE)\n#  target_include_directories(${BOARD_TARGET} PUBLIC)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: RA4M1 EK\n   url: https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra4m1-evaluation-kit-ra4m1-mcu-group\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_STATE_ON          1\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/board.mk",
    "content": "CPU_CORE = cortex-m4\nMCU_VARIANT = ra4m1\n\n# For flash-jlink target\nJLINK_DEVICE = R7FA4M1AB\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_cfg/fsp_cfg/bsp/bsp_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CFG_H_\n#define BSP_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_clock_cfg.h\"\n            #include \"bsp_mcu_family_cfg.h\"\n            #include \"board_cfg.h\"\n            #define RA_NOT_DEFINED 0\n            #ifndef BSP_CFG_RTOS\n             #if (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (2)\n             #elif (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (1)\n             #else\n              #define BSP_CFG_RTOS (0)\n             #endif\n            #endif\n            #ifndef BSP_CFG_RTC_USED\n             #define BSP_CFG_RTC_USED (RA_NOT_DEFINED)\n            #endif\n            #undef RA_NOT_DEFINED\n            #if defined(_RA_BOOT_IMAGE)\n             #define BSP_CFG_BOOT_IMAGE (1)\n            #endif\n            #define BSP_CFG_MCU_VCC_MV (3300)\n            #define BSP_CFG_STACK_MAIN_BYTES (0x800)\n            #define BSP_CFG_HEAP_BYTES (0x1000)\n            #define BSP_CFG_PARAM_CHECKING_ENABLE (0)\n            #define BSP_CFG_ASSERT (0)\n            #define BSP_CFG_ERROR_LOG (0)\n\n            #define BSP_CFG_PFS_PROTECT ((1))\n\n            #define BSP_CFG_C_RUNTIME_INIT ((1))\n            #define BSP_CFG_EARLY_INIT     ((0))\n\n            #define BSP_CFG_STARTUP_CLOCK_REG_NOT_RESET ((0))\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_POPULATED\n            #define BSP_CLOCK_CFG_MAIN_OSC_POPULATED (1)\n            #endif\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE\n            #define BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_DRIVE\n            #define BSP_CLOCK_CFG_SUBCLOCK_DRIVE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_POPULATED\n            #define BSP_CLOCK_CFG_SUBCLOCK_POPULATED (1)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS\n            #define BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS 1000\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_CFG_H_\n#define BSP_MCU_DEVICE_CFG_H_\n#define BSP_CFG_MCU_PART_SERIES (4)\n#endif /* BSP_MCU_DEVICE_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_pn_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_R7FA4M1AB3CFP\n      #define BSP_MCU_FEATURE_SET ('A')\n      #define BSP_ROM_SIZE_BYTES (262144)\n      #define BSP_RAM_SIZE_BYTES (32768)\n      #define BSP_DATA_FLASH_SIZE_BYTES (8192)\n      #define BSP_PACKAGE_LQFP\n      #define BSP_PACKAGE_PINS (100)\n#endif /* BSP_MCU_DEVICE_PN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_family_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_FAMILY_CFG_H_\n#define BSP_MCU_FAMILY_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_mcu_device_pn_cfg.h\"\n            #include \"bsp_mcu_device_cfg.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra4m1/bsp_mcu_info.h\"\n            #include \"bsp_clock_cfg.h\"\n            #define BSP_MCU_GROUP_RA4M1 (1)\n            #define BSP_LOCO_HZ                 (32768)\n            #define BSP_MOCO_HZ                 (8000000)\n            #define BSP_SUB_CLOCK_HZ            (32768)\n            #if   BSP_CFG_HOCO_FREQUENCY == 0\n                #define BSP_HOCO_HZ             (24000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 2\n                #define BSP_HOCO_HZ             (32000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 4\n                #define BSP_HOCO_HZ             (48000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 5\n                #define BSP_HOCO_HZ             (64000000)\n            #else\n                #error \"Invalid HOCO frequency chosen (BSP_CFG_HOCO_FREQUENCY) in bsp_clock_cfg.h\"\n            #endif\n            #define BSP_CORTEX_VECTOR_TABLE_ENTRIES    (16U)\n            #define BSP_VECTOR_TABLE_MAX_ENTRIES       (48U)\n            #define BSP_CFG_INLINE_IRQ_FUNCTIONS       (1)\n\n            #define OFS_SEQ1 0xA001A001 | (1 << 1) | (3 << 2)\n            #define OFS_SEQ2 (15 << 4) | (3 << 8) | (3 << 10)\n            #define OFS_SEQ3 (1 << 12) | (1 << 14) | (1 << 17)\n            #define OFS_SEQ4 (3 << 18) |(15 << 20) | (3 << 24) | (3 << 26)\n            #define OFS_SEQ5 (1 << 28) | (1 << 30)\n            #define BSP_CFG_ROM_REG_OFS0 (OFS_SEQ1 | OFS_SEQ2 | OFS_SEQ3 | OFS_SEQ4 | OFS_SEQ5)\n            #define BSP_CFG_ROM_REG_OFS1 (0xFFFFFEC3 | (1 << 2) | (3 << 3) | (0 << 8))\n            #define BSP_CFG_USE_LOW_VOLTAGE_MODE ((0))\n            #define BSP_CFG_ROM_REG_MPU_PC0_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_PC0_START (0x00FFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_PC0_END (0x00FFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_PC1_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_PC1_START (0x00FFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_PC1_END (0x00FFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_START (0x00FFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_END (0x00FFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_START (0x200FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_END (0x200FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_START (0x407FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_END (0x407FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_START (0x400DFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_END (0x400DFFFF)\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_WAIT\n            #define BSP_CLOCK_CFG_MAIN_OSC_WAIT (9)\n            #endif\n            /* Used to create IELS values for the interrupt initialization table g_interrupt_event_link_select. */\n            #define BSP_PRV_IELS_ENUM(vector)    (ELC_ ## vector)\n\n            /*\n            ID Code\n            Note: To permanently lock and disable the debug interface define the BSP_ID_CODE_PERMANENTLY_LOCKED in the compiler settings.\n            WARNING: This will disable debug access to the part and cannot be reversed by a debug probe.\n            */\n            #if defined(BSP_ID_CODE_PERMANENTLY_LOCKED)\n            #define BSP_CFG_ID_CODE_LONG_1 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_2 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_3 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_4 (0x00000000)\n            #else\n            /* ID CODE: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF */\n            #define BSP_CFG_ID_CODE_LONG_1 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_2 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_3 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_4 (0xffFFFFFF)\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_MCU_FAMILY_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_cfg/fsp_cfg/bsp/bsp_pin_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_PIN_CFG_H_\n#define BSP_PIN_CFG_H_\n#include \"r_ioport.h\"\n\n/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */\nFSP_HEADER\n\n#define SW1 (BSP_IO_PORT_01_PIN_05)\n#define LED1 (BSP_IO_PORT_01_PIN_06)\nextern const ioport_cfg_t g_bsp_pin_cfg; /* RA4M1-EK.pincfg */\n\nvoid BSP_PinConfigSecurityInit();\n\n/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */\nFSP_FOOTER\n#endif /* BSP_PIN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_cfg/fsp_cfg/r_ioport_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef R_IOPORT_CFG_H_\n#define R_IOPORT_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define IOPORT_CFG_PARAM_CHECKING_ENABLE (BSP_CFG_PARAM_CHECKING_ENABLE)\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* R_IOPORT_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_gen/bsp_clock_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CLOCK_CFG_H_\n#define BSP_CLOCK_CFG_H_\n#define BSP_CFG_CLOCKS_SECURE (0)\n#define BSP_CFG_CLOCKS_OVERRIDE (0)\n#define BSP_CFG_XTAL_HZ (12000000) /* XTAL 12000000Hz */\n#define BSP_CFG_PLL_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL Src: XTAL */\n#define BSP_CFG_HOCO_FREQUENCY (0) /* HOCO 24MHz */\n#define BSP_CFG_PLL_DIV (BSP_CLOCKS_PLL_DIV_2) /* PLL Div /2 */\n#define BSP_CFG_PLL_MUL BSP_CLOCKS_PLL_MUL(8U,0U) /* PLL Mul x8 */\n#define BSP_CFG_CLOCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL) /* Clock Src: PLL */\n#define BSP_CFG_ICLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* ICLK Div /1 */\n#define BSP_CFG_PCLKA_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* PCLKA Div /1 */\n#define BSP_CFG_PCLKB_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKB Div /2 */\n#define BSP_CFG_PCLKC_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* PCLKC Div /1 */\n#define BSP_CFG_PCLKD_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* PCLKD Div /1 */\n#define BSP_CFG_FCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* FCLK Div /2 */\n#define BSP_CFG_CLKOUT_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CLKOUT Disabled */\n#define BSP_CFG_CLKOUT_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* CLKOUT Div /1 */\n#define BSP_CFG_UCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL) /* UCLK Src: PLL */\n#endif /* BSP_CLOCK_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_gen/common_data.c",
    "content": "/* generated common source file - do not edit */\n#include \"common_data.h\"\nioport_instance_ctrl_t g_ioport_ctrl;\nconst ioport_instance_t g_ioport =\n        {\n            .p_api = &g_ioport_on_ioport,\n            .p_ctrl = &g_ioport_ctrl,\n            .p_cfg = &g_bsp_pin_cfg,\n        };\nvoid g_common_init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_gen/common_data.h",
    "content": "/* generated common header file - do not edit */\n#ifndef COMMON_DATA_H_\n#define COMMON_DATA_H_\n#include <stdint.h>\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n#include \"bsp_pin_cfg.h\"\nFSP_HEADER\n#define IOPORT_CFG_NAME g_bsp_pin_cfg\n#define IOPORT_CFG_OPEN R_IOPORT_Open\n#define IOPORT_CFG_CTRL g_ioport_ctrl\n\n/* IOPORT Instance */\nextern const ioport_instance_t g_ioport;\n\n/* IOPORT control structure. */\nextern ioport_instance_ctrl_t g_ioport_ctrl;\nvoid g_common_init(void);\nFSP_FOOTER\n#endif /* COMMON_DATA_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/ra_gen/pin_data.c",
    "content": "/* generated pin source file - do not edit */\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n\n\nconst ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {\n    {\n        .pin = BSP_IO_PORT_00_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_CTSU)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_CTSU)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_09_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_09_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n};\n\nconst ioport_cfg_t g_bsp_pin_cfg = {\n    .number_of_pins = sizeof(g_bsp_pin_cfg_data)/sizeof(ioport_pin_cfg_t),\n    .p_pin_cfg_data = &g_bsp_pin_cfg_data[0],\n};\n\n#if BSP_TZ_SECURE_BUILD\n\nvoid R_BSP_PinCfgSecurityInit(void);\n\n/* Initialize SAR registers for secure pins. */\nvoid R_BSP_PinCfgSecurityInit(void)\n{\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n    uint32_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #else\n    uint16_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #endif\n    memset(pmsar, 0xFF, BSP_FEATURE_BSP_NUM_PMSAR * sizeof(R_PMISC->PMSAR[0]));\n\n\n    for(uint32_t i = 0; i < g_bsp_pin_cfg.number_of_pins; i++)\n    {\n        uint32_t port_pin = g_bsp_pin_cfg.p_pin_cfg_data[i].pin;\n        uint32_t port = port_pin >> 8U;\n        uint32_t pin = port_pin & 0xFFU;\n        pmsar[port] &= (uint16_t) ~(1U << pin);\n    }\n\n    for(uint32_t i = 0; i < BSP_FEATURE_BSP_NUM_PMSAR; i++)\n    {\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n        R_PMISC->PMSAR[i].PMSAR = (uint16_t) pmsar[i];\n #else\n        R_PMISC->PMSAR[i].PMSAR = pmsar[i];\n #endif\n    }\n\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/script/fsp.ld",
    "content": "/*\n                  Linker File for Renesas FSP\n*/\n\nINCLUDE memory_regions.ld\n\n/* Uncomment and set XIP_SECONDARY_SLOT_IMAGE to 1 below for the secondary XIP application image.*/\n/*\n XIP_SECONDARY_SLOT_IMAGE = 1;\n*/\n\nQSPI_FLASH_PRV_LENGTH = DEFINED(QSPI_FLASH_SIZE) ? ABSOLUTE(QSPI_FLASH_SIZE) : ABSOLUTE(QSPI_FLASH_LENGTH);\nOSPI_DEVICE_0_PRV_LENGTH = DEFINED(OSPI_DEVICE_0_SIZE) ? ABSOLUTE(OSPI_DEVICE_0_SIZE) : ABSOLUTE(OSPI_DEVICE_0_LENGTH);\nOSPI_DEVICE_1_PRV_LENGTH = DEFINED(OSPI_DEVICE_1_SIZE) ? ABSOLUTE(OSPI_DEVICE_1_SIZE) : ABSOLUTE(OSPI_DEVICE_1_LENGTH);\n\n/* If a flat (secure) project has DEFINED RAM_NS_BUFFER_LENGTH, then emit IDAU symbols to allocate non-secure RAM. */\n__RESERVE_NS_RAM = !DEFINED(PROJECT_NONSECURE) && DEFINED(RAM_NS_BUFFER_LENGTH) && (OPTION_SETTING_S_LENGTH != 0);\n\nITCM_START = DEFINED(ITCM_START)? ITCM_START : 0;\nITCM_LENGTH = DEFINED(ITCM_LENGTH)? ITCM_LENGTH : 0;\nDTCM_START = DEFINED(DTCM_START)? DTCM_START : 0;\nDTCM_LENGTH = DEFINED(DTCM_LENGTH)? DTCM_LENGTH : 0;\nRAM_NS_BUFFER_BLOCK_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? ALIGN(RAM_NS_BUFFER_LENGTH, 8192) : 0;\nRAM_NS_BUFFER_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? RAM_NS_BUFFER_LENGTH : 0;\nRAM_NS_BUFFER_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_LENGTH;\nRAM_NS_BUFFER_BLOCK_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_BLOCK_LENGTH;\n\nOPTION_SETTING_START_NS = DEFINED(PROJECT_NONSECURE) ? OPTION_SETTING_START : OPTION_SETTING_START + 0x80;\n\n/* This definition is used to avoid moving the counter in OPTION_SETTING regions for projects that should not configure option settings.\n * Bootloader images do not configure option settings because they are owned by the bootloader.\n * FSP_BOOTABLE_IMAGE is only defined in bootloader images. */\n__bl_FSP_BOOTABLE_IMAGE = 1;\n__bln_FSP_BOOTABLE_IMAGE = 1;\nPROJECT_SECURE_OR_FLAT = (!DEFINED(PROJECT_NONSECURE) || DEFINED(PROJECT_SECURE)) && OPTION_SETTING_LENGTH && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_NS = DEFINED(PROJECT_NONSECURE) && !DEFINED(FSP_BOOTABLE_IMAGE);\n\n__bl_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_APPLICATION_IMAGE_NUMBER == 1 ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         (DEFINED(BOOTLOADER_SECONDARY_USE_QSPI) || DEFINED(BOOTLOADER_SECONDARY_USE_OSPI_B)) ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                          FLASH_APPLICATION_S_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_END    = __bl_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_END = __bl_XIP_SECONDARY_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_FLASH_NS_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_START - FLASH_BOOTLOADER_HEADER_LENGTH + FLASH_APPLICATION_S_LENGTH;\n__bl_FLASH_NSC_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_END - FLASH_APPLICATION_NSC_LENGTH;\n__bl_RAM_NS_START    = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH;\n__bl_RAM_NSC_START   = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       __bl_RAM_NS_START - RAM_APPLICATION_NSC_LENGTH;\n__bl_FLASH_NS_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                            FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                            __bl_FLASH_NS_START + FLASH_BOOTLOADER_HEADER_LENGTH_2;\n__bln_FLASH_IMAGE_START = __bl_FLASH_NS_IMAGE_START | (!DEFINED (NS_OFFSET_START) ? 0 : NS_OFFSET_START);\n__bln_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                           FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                           FLASH_APPLICATION_NS_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH_2;\n\nXIP_SECONDARY_SLOT_IMAGE = DEFINED(XIP_SECONDARY_SLOT_IMAGE) ? XIP_SECONDARY_SLOT_IMAGE : 0;\nFLASH_ORIGIN = !DEFINED(FLASH_IMAGE_START) ? FLASH_START :\n                XIP_SECONDARY_SLOT_IMAGE == 1 ? XIP_SECONDARY_FLASH_IMAGE_START :\n                FLASH_IMAGE_START;\nLIMITED_FLASH_LENGTH = DEFINED(FLASH_IMAGE_LENGTH) ? FLASH_IMAGE_LENGTH :\n                       DEFINED(FLASH_BOOTLOADER_LENGTH) ? FLASH_BOOTLOADER_LENGTH :\n                       FLASH_LENGTH;\nOPTION_SETTING_SAS_SIZE = 0x34;\nOPTION_SETTING_SAS_LENGTH = !DEFINED(OPTION_SETTING_LENGTH) ? 0 :\n                            OPTION_SETTING_LENGTH == 0 ? 0 :\n                            OPTION_SETTING_LENGTH - OPTION_SETTING_SAS_SIZE;\n\n/* Define memory regions. */\nMEMORY\n{\n  ITCM (rx)                       : ORIGIN = ITCM_START, LENGTH = ITCM_LENGTH\n  DTCM (rwx)                      : ORIGIN = DTCM_START, LENGTH = DTCM_LENGTH\n  FLASH (rx)                      : ORIGIN = FLASH_ORIGIN, LENGTH = LIMITED_FLASH_LENGTH\n  RAM (rwx)                       : ORIGIN = RAM_START, LENGTH = RAM_LENGTH\n  DATA_FLASH (rx)                 : ORIGIN = DATA_FLASH_START, LENGTH = DATA_FLASH_LENGTH\n  QSPI_FLASH (rx)                 : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_PRV_LENGTH\n  OSPI_DEVICE_0 (rx)              : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1 (rx)              : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  OSPI_DEVICE_0_RAM (rwx)         : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1_RAM (rwx)         : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  SDRAM (rwx)                     : ORIGIN = SDRAM_START, LENGTH = SDRAM_LENGTH\n  OPTION_SETTING (r)              : ORIGIN = OPTION_SETTING_START, LENGTH = OPTION_SETTING_LENGTH\n  OPTION_SETTING_OFS (r)          : ORIGIN = OPTION_SETTING_START, LENGTH = 0x18\n  OPTION_SETTING_SAS (r)          : ORIGIN = OPTION_SETTING_START + OPTION_SETTING_SAS_SIZE, LENGTH = OPTION_SETTING_SAS_LENGTH\n  OPTION_SETTING_S (r)            : ORIGIN = OPTION_SETTING_S_START, LENGTH = OPTION_SETTING_S_LENGTH\n  ID_CODE (rx)                    : ORIGIN = ID_CODE_START, LENGTH = ID_CODE_LENGTH\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be DEFINED in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n *   __qspi_flash_start__\n *   __qspi_flash_end__\n *   __qspi_flash_code_size__\n *   __qspi_region_max_size__\n *   __qspi_region_start_address__\n *   __qspi_region_end_address__\n *   __ospi_device_0_start__\n *   __ospi_device_0_end__\n *   __ospi_device_0_code_size__\n *   __ospi_device_0_region_max_size__\n *   __ospi_device_0_region_start_address__\n *   __ospi_device_0_region_end_address__\n *   __ospi_device_1_start__\n *   __ospi_device_1_end__\n *   __ospi_device_1_code_size__\n *   __ospi_device_1_region_max_size__\n *   __ospi_device_1_region_start_address__\n *   __ospi_device_1_region_end_address__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .text :\n    {\n        __tz_FLASH_S = ABSOLUTE(FLASH_START);\n        __ROM_Start = .;\n\n        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much\n         * space because ROM registers are at address 0x400 and there is very little space\n         * in between. */\n        KEEP(*(.fixed_vectors*))\n        KEEP(*(.application_vectors*))\n        __Vectors_End = .;\n\n        /* Some devices have a gap of code flash between the vector table and ROM Registers.\n         * The flash gap section allows applications to place code and data in this section. */\n        *(.flash_gap*)\n\n        /* ROM Registers start at address 0x00000400 for devices that do not have the OPTION_SETTING region. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x400;\n        KEEP(*(.rom_registers*))\n\n        /* Reserving 0x100 bytes of space for ROM registers. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x500;\n\n        /* Allocate flash write-boundary-aligned\n         * space for sce9 wrapped public keys for mcuboot if the module is used.\n         */\n        KEEP(*(.mcuboot_sce9_key*))\n\n        *(.text*)\n\n        KEEP(*(.version))\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n        __usb_dev_descriptor_start_fs = .;\n        KEEP(*(.usb_device_desc_fs*))\n        __usb_cfg_descriptor_start_fs = .;\n        KEEP(*(.usb_config_desc_fs*))\n        __usb_interface_descriptor_start_fs = .;\n        KEEP(*(.usb_interface_desc_fs*))\n        __usb_descriptor_end_fs = .;\n        __usb_dev_descriptor_start_hs = .;\n        KEEP(*(.usb_device_desc_hs*))\n        __usb_cfg_descriptor_start_hs = .;\n        KEEP(*(.usb_config_desc_hs*))\n        __usb_interface_descriptor_start_hs = .;\n        KEEP(*(.usb_interface_desc_hs*))\n        __usb_descriptor_end_hs = .;\n\n        KEEP(*(.eh_frame*))\n\n        __ROM_End = .;\n    } > FLASH = 0xFF\n\n    __Vectors_Size = __Vectors_End - __Vectors;\n\n    . = .;\n    __itcm_data_pre_location = .;\n\n    /* Initialized ITCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .itcm_data : ALIGN(16)\n    {\n        /* Start of ITCM Secure Trustzone region. */\n        __tz_ITCM_S = ABSOLUTE(ITCM_START);\n\n        /* All ITCM data start */\n        __itcm_data_start = .;\n\n        KEEP(*(.itcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* All ITCM data end */\n        __itcm_data_end = .;\n\n        /*\n         * Start of the ITCM Non-Secure Trustzone region.\n         * ITCM_NS_START can be used to set a fixed address for non-secure ITCM in secure projects or flat projects.\n         */\n        __tz_ITCM_N = DEFINED(ITCM_NS_START) ? ABSOLUTE(ITCM_NS_START) : ALIGN(__itcm_data_end, 8192);\n    } > ITCM AT > FLASH = 0x00\n\n    /* Addresses exported for ITCM initialization. */\n    __itcm_data_init_start = LOADADDR(.itcm_data);\n    __itcm_data_init_end = LOADADDR(.itcm_data) + SIZEOF(.itcm_data);\n\n    ASSERT(ORIGIN(ITCM) % 8 == 0, \"ITCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(ITCM) % 8 == 0, \"ITCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.itcm_data) % 16 == 0, \".itcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.itcm_data) % 8 == 0, \".itcm_data section size must be a multiple of 8 bytes.\")\n\n    /* Restore location counter. */\n    /* If ITCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If ITCM is present, this will be the absolute address that follows the ITCM ROM location. */\n    . = (SIZEOF(.itcm_data) > 0) ? __itcm_data_init_end : __itcm_data_pre_location;\n\n    __exidx_start = .;\n    /DISCARD/ :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    }\n    __exidx_end = .;\n\n    /* To copy multiple ROM to RAM sections,\n     * uncomment .copy.table section and,\n     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .copy.table :\n    {\n        . = ALIGN(4);\n        __copy_table_start__ = .;\n        LONG (__etext)\n        LONG (__data_start__)\n        LONG (__data_end__ - __data_start__)\n        LONG (__etext2)\n        LONG (__data2_start__)\n        LONG (__data2_end__ - __data2_start__)\n        __copy_table_end__ = .;\n    } > FLASH\n    */\n\n    /* To clear multiple BSS sections,\n     * uncomment .zero.table section and,\n     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .zero.table :\n    {\n        . = ALIGN(4);\n        __zero_table_start__ = .;\n        LONG (__bss_start__)\n        LONG (__bss_end__ - __bss_start__)\n        LONG (__bss2_start__)\n        LONG (__bss2_end__ - __bss2_start__)\n        __zero_table_end__ = .;\n    } > FLASH\n    */\n\n    __etext = .;\n\n    __tz_RAM_S = ORIGIN(RAM);\n\n    /* If DTC is used, put the DTC vector table at the start of SRAM.\n       This avoids memory holes due to 1K alignment required by it. */\n    .fsp_dtc_vector_table (NOLOAD) :\n    {\n        . = ORIGIN(RAM);\n        *(.fsp_dtc_vector_table)\n    } > RAM\n\n    /* Initialized data section. */\n    .data :\n    {\n        __data_start__ = .;\n        . = ALIGN(4);\n\n        __Code_In_RAM_Start = .;\n\n        KEEP(*(.code_in_ram*))\n        __Code_In_RAM_End = .;\n\n        *(vtable)\n        /* Don't use *(.data*) because it will place data meant for .data_flash in this section. */\n        *(.data.*)\n        *(.data)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        KEEP(*(.jcr*))\n\n        . = ALIGN(4);\n\n        /* All data end */\n        __data_end__ = .;\n\n    } > RAM AT > FLASH\n\n    . = .;\n    __dtcm_data_pre_location = LOADADDR(.data) + SIZEOF(.data);\n\n    /* Initialized DTCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .dtcm_data : ALIGN(16)\n    {\n        /* Start of DTCM Secure Trustzone region. */\n        __tz_DTCM_S = ABSOLUTE(DTCM_START);\n\n        /* Initialized DTCM data start */\n        __dtcm_data_start = .;\n\n        KEEP(*(.dtcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* Initialized DTCM data end */\n        __dtcm_data_end = .;\n    } > DTCM AT > FLASH = 0x00\n\n    . = __dtcm_data_end;\n    /* Uninitialized DTCM data. */\n    /* ALIGN appears on the left side of the colon because it is being used to assign the VMA directly, as opposed to a right side appearance which would control the LMA. */\n    .dtcm_bss ALIGN(8) (NOLOAD) :\n    {\n        /* Uninitialized DTCM data start */\n        __dtcm_bss_start = .;\n\n        KEEP(*(.dtcm_bss*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. No fill because of NOLOAD. */\n        . = ALIGN(8);\n\n        /* Uninitialized DTCM data end */\n        __dtcm_bss_end = .;\n\n        /*\n         * Start of the DTCM Non-Secure Trustzone region.\n         * DTCM_NS_START can be used to set a fixed address for non-secure DTCM in secure projects or flat projects.\n         */\n        __tz_DTCM_N = DEFINED(DTCM_NS_START) ? ABSOLUTE(DTCM_NS_START) : ALIGN(__dtcm_bss_end, 8192);\n    } > DTCM\n\n    /* Addresses exported for DTCM initialization. */\n    __dtcm_data_init_start = LOADADDR(.dtcm_data);\n    __dtcm_data_init_end = LOADADDR(.dtcm_data) + SIZEOF(.dtcm_data);\n\n    ASSERT(ORIGIN(DTCM) % 8 == 0, \"DTCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(DTCM) % 8 == 0, \"DTCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) == ADDR(.dtcm_bss), \".dtcm_bss has (VMA != LMA) but should be NOLOAD (VMA == LMA).\")\n    ASSERT(LOADADDR(.dtcm_data) % 16 == 0, \".dtcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.dtcm_data) % 8 == 0, \".dtcm_data section size must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) % 8 == 0, \".dtcm_bss section must be aligned to 8 bytes.\")\n    ASSERT(SIZEOF(.dtcm_bss) % 8 == 0, \".dtcm_bss section size must be a multiple of 8 bytes.\")\n    ASSERT(__dtcm_bss_start == __dtcm_data_end, \".dtcm_bss section is not adjacent to .dtcm_data section.\")\n\n    /* Restore location counter. */\n    /* If DTCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If DTCM is present, this will be the absolute address that follows the DTCM ROM location. */\n    . = (SIZEOF(.dtcm_data) > 0) ? __dtcm_data_init_end : __dtcm_data_pre_location;\n\n    /* TrustZone Secure Gateway Stubs Section */\n\n    /* Store location counter for SPI non-retentive sections. */\n    sgstubs_pre_location = .;\n\n    /* Determine the secure gateway stubs address either by the provided linker variable or the next 1024-byte block. */\n    SGSTUBS_LOC = (DEFINED(PROJECT_SECURE) && DEFINED(FLASH_NSC_START)) ? ABSOLUTE(FLASH_NSC_START) : ALIGN(1024);\n    .gnu.sgstubs SGSTUBS_LOC : ALIGN(1024)\n    {\n        __tz_FLASH_C = DEFINED(FLASH_NSC_START) ? ABSOLUTE(FLASH_NSC_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : ALIGN(1024);\n        _start_sg = .;\n        *(.gnu.sgstubs*)\n        . = ALIGN(32);\n        _end_sg = .;\n    } > FLASH\n\n    __tz_FLASH_N = DEFINED(FLASH_NS_START) ? ABSOLUTE(FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : FLASH_LENGTH < 32768 ? FLASH_LENGTH : ALIGN(32768);\n    FLASH_NS_IMAGE_START = DEFINED(FLASH_NS_IMAGE_START) ? FLASH_NS_IMAGE_START : __tz_FLASH_N;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_S = ORIGIN(QSPI_FLASH);\n\n    /* QSPI_FLASH section to be downloaded via debugger */\n    .qspi_flash :\n    {\n        __qspi_flash_start__ = .;\n        KEEP(*(.qspi_flash*))\n        KEEP(*(.code_in_qspi*))\n        __qspi_flash_end__ = .;\n    } > QSPI_FLASH\n    __qspi_flash_code_size__ = __qspi_flash_end__ - __qspi_flash_start__;\n\n    /* QSPI_FLASH non-retentive section, creates a copy in internal flash that can be copied to QSPI */\n    __qspi_flash_code_addr__ = sgstubs_pre_location;\n    .qspi_non_retentive : AT(__qspi_flash_code_addr__)\n    {\n        __qspi_non_retentive_start__ = .;\n        KEEP(*(.qspi_non_retentive*))\n        __qspi_non_retentive_end__ = .;\n    } > QSPI_FLASH\n    __qspi_non_retentive_size__ = __qspi_non_retentive_end__ - __qspi_non_retentive_start__;\n\n    __qspi_region_max_size__ = 0x4000000;   /* Must be the same as defined in MEMORY above */\n    __qspi_region_start_address__ = __qspi_flash_start__;\n    __qspi_region_end_address__ = __qspi_flash_start__ + __qspi_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_N = __qspi_non_retentive_end__;\n\n    /* Support for OctaRAM */\n    .OSPI_DEVICE_0_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_0_start__ = .;\n        *(.ospi_device_0_no_load*)\n        . = ALIGN(4);\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0_RAM\n\n    .OSPI_DEVICE_1_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_1_start__ = .;\n        *(.ospi_device_1_no_load*)\n        . = ALIGN(4);\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1_RAM\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_S = ORIGIN(OSPI_DEVICE_0);\n\n    /* OSPI_DEVICE_0 section to be downloaded via debugger */\n    .OSPI_DEVICE_0 :\n    {\n        __ospi_device_0_start__ = .;\n        KEEP(*(.ospi_device_0*))\n        KEEP(*(.code_in_ospi_device_0*))\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_code_size__ = __ospi_device_0_end__ - __ospi_device_0_start__;\n\n    /* OSPI_DEVICE_0 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n     __ospi_device_0_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive));\n    .ospi_device_0_non_retentive : AT(__ospi_device_0_code_addr__)\n    {\n        __ospi_device_0_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_0_non_retentive*))\n        __ospi_device_0_non_retentive_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_non_retentive_size__ = __ospi_device_0_non_retentive_end__ - __ospi_device_0_non_retentive_start__;\n\n    __ospi_device_0_region_max_size__ = 0x8000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_0_region_start_address__ = __ospi_device_0_start__;\n    __ospi_device_0_region_end_address__ = __ospi_device_0_start__ + __ospi_device_0_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_N = __ospi_device_0_non_retentive_end__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_S = ORIGIN(OSPI_DEVICE_1);\n\n    /* OSPI_DEVICE_1 section to be downloaded via debugger */\n    .OSPI_DEVICE_1 :\n    {\n        __ospi_device_1_start__ = .;\n        KEEP(*(.ospi_device_1*))\n        KEEP(*(.code_in_ospi_device_1*))\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_code_size__ = __ospi_device_1_end__ - __ospi_device_1_start__;\n\n    /* OSPI_DEVICE_1 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n    __ospi_device_1_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive) + SIZEOF(.ospi_device_0_non_retentive));\n    .ospi_device_1_non_retentive : AT(__ospi_device_1_code_addr__)\n    {\n        __ospi_device_1_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_1_non_retentive*))\n        __ospi_device_1_non_retentive_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_non_retentive_size__ = __ospi_device_1_non_retentive_end__ - __ospi_device_1_non_retentive_start__;\n\n    __ospi_device_1_region_max_size__ = 0x10000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_1_region_start_address__ = __ospi_device_1_start__;\n    __ospi_device_1_region_end_address__ = __ospi_device_1_start__ + __ospi_device_1_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_N = __ospi_device_1_non_retentive_end__;\n\n    .noinit (NOLOAD):\n    {\n        . = ALIGN(4);\n        __noinit_start = .;\n        KEEP(*(.noinit*))\n        . = ALIGN(8);\n        /* Place the FreeRTOS heap here so that the __HeapLimit calculation does not include the freertos heap. */\n        KEEP(*(.heap.*))\n        __noinit_end = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n        __HeapBase = .;\n        /* Place the STD heap here. */\n        KEEP(*(.heap))\n        __HeapLimit = .;\n    } > RAM\n\n    /* Stacks are stored in this section. */\n    .stack_dummy (NOLOAD):\n    {\n        . = ALIGN(8);\n        __StackLimit = .;\n        /* Main stack */\n        KEEP(*(.stack))\n        __StackTop = .;\n        /* Thread stacks */\n        KEEP(*(.stack*))\n        __StackTopAll = .;\n    } > RAM\n\n    PROVIDE(__stack = __StackTopAll);\n\n    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used\n       at run time for things such as ThreadX memory pool allocations. */\n    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);\n\n    /* RAM_NSC_START can be used to set a fixed address for non-secure callable RAM in secure projects.\n     * If it is not specified, the address for NSC RAM is the end of RAM aligned to a 1K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_C = DEFINED(RAM_NSC_START) ? ABSOLUTE(RAM_NSC_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_segment_used_end__, 1024);\n\n    /* RAM_NS_START can be used to set a fixed address for non-secure RAM in secure projects or flat projects.\n     * RAM_NS_BUFFER_BLOCK_LENGTH is used to allocate non-secure buffers in a flat project. If it is not\n     * specified, the address for NSC RAM is the end of RAM aligned to an 8K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_N = DEFINED(RAM_NS_START) ? ABSOLUTE(RAM_NS_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__tz_RAM_C, 8192);\n\n    /* Non-secure buffers must be in non-secure RAM. This is primarily used for the EDMAC in flat projects.\n     * The EDMAC is a non-secure bus master and can only access non-secure RAM. */\n    .ns_buffer (NOLOAD):\n    {\n        /* Allocate RAM on a 32-byte boundary to help with placement of Ethernet buffers. */\n        . = __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_START & 0xFFFFFFE0) : .;\n\n        KEEP(*(.ns_buffer*))\n    } > RAM\n\n    /* Data flash. */\n    .data_flash :\n    {\n        . = ORIGIN(DATA_FLASH);\n        __tz_DATA_FLASH_S = .;\n        __Data_Flash_Start = .;\n        KEEP(*(.data_flash*))\n        __Data_Flash_End = .;\n\n        __tz_DATA_FLASH_N = DEFINED(DATA_FLASH_NS_START) ? ABSOLUTE(DATA_FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(DATA_FLASH_START + DATA_FLASH_LENGTH) : ALIGN(1024);\n    } > DATA_FLASH\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_S = ORIGIN(SDRAM);\n\n    /* SDRAM */\n    .sdram (NOLOAD):\n    {\n        __SDRAM_Start = .;\n        KEEP(*(.sdram*))\n        KEEP(*(.frame*))\n        __SDRAM_End = .;\n    } > SDRAM\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_N = __SDRAM_End;\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool. */\n    __tz_ID_CODE_S = ORIGIN(ID_CODE);\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool.\n     *       Set this symbol to the same value as __tz_ID_CODE_S so the RA configuration tool does not split the ID_CODE\n     *       memory region between TrustZone projects. */\n    __tz_ID_CODE_N = __tz_ID_CODE_S;\n\n    .id_code :\n    {\n        __ID_Code_Start = .;\n        KEEP(*(.id_code*))\n        __ID_Code_End = .;\n    } > ID_CODE\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S = ORIGIN(OPTION_SETTING_OFS);\n\n    .option_setting_ofs :\n    {\n        __OPTION_SETTING_OFS_Start = .;\n        KEEP(*(.option_setting_ofs0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x04 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_ofs2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x10 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_dualsel))\n        __OPTION_SETTING_OFS_End = .;\n    } > OPTION_SETTING_OFS = 0xFF\n\n    .option_setting_sas :\n    {\n        __OPTION_SETTING_SAS_Start = .;\n        KEEP(*(.option_setting_sas))\n        __OPTION_SETTING_SAS_End = .;\n    } > OPTION_SETTING_SAS = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_N = ABSOLUTE(OPTION_SETTING_START_NS);\n\n    .option_setting_ns :\n    {\n        __OPTION_SETTING_NS_Start = .;\n        KEEP(*(.option_setting_ofs1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x04 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_ofs3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x10 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_banksel))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x40 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x44 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x48 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x4C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x60 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x64 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x68 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x6C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps3))\n        __OPTION_SETTING_NS_End = .;\n    } > OPTION_SETTING = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_S = ORIGIN(OPTION_SETTING_S);\n\n    .option_setting_s :\n    {\n        __OPTION_SETTING_S_Start = .;\n        KEEP(*(.option_setting_ofs1_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x04 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x10 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x40 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x44 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x48 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x4C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x60 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x64 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x68 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x6C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x80 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs1_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x84 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x90 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC0 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC4 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC8 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xCC : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel3))\n        __OPTION_SETTING_S_End = .;\n    } > OPTION_SETTING_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_N = __OPTION_SETTING_S_End;\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/script/memory_regions.ld",
    "content": "\n            /* generated memory regions file - do not edit */\n                            RAM_START  = 0x20000000;\n                RAM_LENGTH = 0x8000;\n                FLASH_START  = 0x00000000;\n                FLASH_LENGTH = 0x40000;\n                DATA_FLASH_START  = 0x40100000;\n                DATA_FLASH_LENGTH = 0x2000;\n                OPTION_SETTING_START  = 0x00000000;\n                OPTION_SETTING_LENGTH = 0x0;\n                OPTION_SETTING_S_START  = 0x80000000;\n                OPTION_SETTING_S_LENGTH = 0x0;\n                ID_CODE_START  = 0x01010018;\n                ID_CODE_LENGTH = 0x20;\n                SDRAM_START  = 0x80010000;\n                SDRAM_LENGTH = 0x0;\n                QSPI_FLASH_START  = 0x60000000;\n                QSPI_FLASH_LENGTH = 0x0;\n                OSPI_DEVICE_0_START  = 0x80020000;\n                OSPI_DEVICE_0_LENGTH = 0x0;\n                OSPI_DEVICE_1_START  = 0x80030000;\n                OSPI_DEVICE_1_LENGTH = 0x0;\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m1_ek/smart_configurator/configuration.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<raConfiguration version=\"9\">\n  <generalSettings>\n    <option key=\"#Board#\" value=\"board.ra4m1ek\"/>\n    <option key=\"CPU\" value=\"RA4M1\"/>\n    <option key=\"Core\" value=\"CM4\"/>\n    <option key=\"#TargetName#\" value=\"R7FA4M1AB3CFP\"/>\n    <option key=\"#TargetARCHITECTURE#\" value=\"cortex-m4\"/>\n    <option key=\"#DeviceCommand#\" value=\"R7FA4M1AB\"/>\n    <option key=\"#RTOS#\" value=\"_none\"/>\n    <option key=\"#pinconfiguration#\" value=\"R7FA4M1AB3CFP.pincfg\"/>\n    <option key=\"#FSPVersion#\" value=\"5.6.0\"/>\n    <option key=\"#ConfigurationFragments#\" value=\"Renesas##BSP##Board##ra4m1_ek##\"/>\n    <option key=\"#SELECTED_TOOLCHAIN#\" value=\"com.renesas.cdt.managedbuild.gnuarm.toolchain.\"/>\n  </generalSettings>\n  <raBspConfiguration>\n    <config id=\"config.bsp.ra4m1.R7FA4M1AB3CFP\">\n      <property id=\"config.bsp.part_number\" value=\"config.bsp.part_number.value\"/>\n      <property id=\"config.bsp.rom_size_bytes\" value=\"config.bsp.rom_size_bytes.value\"/>\n      <property id=\"config.bsp.rom_size_bytes_hidden\" value=\"262144\"/>\n      <property id=\"config.bsp.ram_size_bytes\" value=\"config.bsp.ram_size_bytes.value\"/>\n      <property id=\"config.bsp.data_flash_size_bytes\" value=\"config.bsp.data_flash_size_bytes.value\"/>\n      <property id=\"config.bsp.package_style\" value=\"config.bsp.package_style.value\"/>\n      <property id=\"config.bsp.package_pins\" value=\"config.bsp.package_pins.value\"/>\n      <property id=\"config.bsp.irq_count_hidden\" value=\"32\"/>\n    </config>\n    <config id=\"config.bsp.ra4m1\">\n      <property id=\"config.bsp.series\" value=\"config.bsp.series.value\"/>\n    </config>\n    <config id=\"config.bsp.ra4m1.fsp\">\n      <property id=\"config.bsp.fsp.inline_irq_functions\" value=\"config.bsp.common.inline_irq_functions.enabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_start_mode\" value=\"config.bsp.fsp.OFS0.iwdt_start_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_timeout\" value=\"config.bsp.fsp.OFS0.iwdt_timeout.2048\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_divisor\" value=\"config.bsp.fsp.OFS0.iwdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_end\" value=\"config.bsp.fsp.OFS0.iwdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_start\" value=\"config.bsp.fsp.OFS0.iwdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_stop_control\" value=\"config.bsp.fsp.OFS0.iwdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_start_mode\" value=\"config.bsp.fsp.OFS0.wdt_start_mode.register\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_timeout\" value=\"config.bsp.fsp.OFS0.wdt_timeout.16384\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_divisor\" value=\"config.bsp.fsp.OFS0.wdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_end\" value=\"config.bsp.fsp.OFS0.wdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_start\" value=\"config.bsp.fsp.OFS0.wdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.wdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_stop_control\" value=\"config.bsp.fsp.OFS0.wdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1.voltage_detection0.start.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1.voltage_detection0_level.190\"/>\n      <property id=\"config.bsp.fsp.OFS1.hoco_osc\" value=\"config.bsp.fsp.OFS1.hoco_osc.enabled\"/>\n      <property id=\"config.bsp.low_voltage_mode\" value=\"config.bsp.low_voltage_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_enable\" value=\"config.bsp.fsp.mpu_pc0_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_start\" value=\"0x00FFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_end\" value=\"0x00FFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_enable\" value=\"config.bsp.fsp.mpu_pc1_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_start\" value=\"0x00FFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_end\" value=\"0x00FFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_enable\" value=\"config.bsp.fsp.mpu_reg0_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_start\" value=\"0x00FFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_end\" value=\"0x00FFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_enable\" value=\"config.bsp.fsp.mpu_reg1_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_start\" value=\"0x200FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_end\" value=\"0x200FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_enable\" value=\"config.bsp.fsp.mpu_reg2_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_start\" value=\"0x407FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_end\" value=\"0x407FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_enable\" value=\"config.bsp.fsp.mpu_reg3_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_start\" value=\"0x400DFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_end\" value=\"0x400DFFFF\"/>\n      <property id=\"config.bsp.common.main_osc_wait\" value=\"config.bsp.common.main_osc_wait.wait_8163\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.max_freq_hz\" value=\"64000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.max_baud\" value=\"6666666\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sample_and_hold\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sensors_are_exclusive\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_spi.max_bitrate\" value=\"12000000\"/>\n      <property id=\"config.bsp.fsp.mcu.spi.max_bitrate\" value=\"24000000\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.rate.rate_fastplus\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.fastplus_channels\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.rate.rate_fastplus\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.fastplus_channels\" value=\"0x0\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.cstpen_channels\" value=\"0x0\"/>\n      <property id=\"config.bsp.fsp.mcu.gpt.pin_count_source_channels\" value=\"0xFFFF\"/>\n      <property id=\"config.bsp.fsp.mcu.slcdc.1_4_bias_method\" value=\"1\"/>\n      <property id=\"config.bsp.common.id_mode\" value=\"config.bsp.common.id_mode.unlocked\"/>\n      <property id=\"config.bsp.common.id_code\" value=\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"/>\n      <property id=\"config.bsp.common.id1\" value=\"\"/>\n      <property id=\"config.bsp.common.id2\" value=\"\"/>\n      <property id=\"config.bsp.common.id3\" value=\"\"/>\n      <property id=\"config.bsp.common.id4\" value=\"\"/>\n      <property id=\"config.bsp.common.id_fixed\" value=\"\"/>\n    </config>\n    <config id=\"config.bsp.ra\">\n      <property id=\"config.bsp.common.main\" value=\"0x800\"/>\n      <property id=\"config.bsp.common.heap\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.vcc\" value=\"3300\"/>\n      <property id=\"config.bsp.common.checking\" value=\"config.bsp.common.checking.disabled\"/>\n      <property id=\"config.bsp.common.assert\" value=\"config.bsp.common.assert.none\"/>\n      <property id=\"config.bsp.common.error_log\" value=\"config.bsp.common.error_log.none\"/>\n      <property id=\"config.bsp.common.soft_reset\" value=\"config.bsp.common.soft_reset.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_populated\" value=\"config.bsp.common.main_osc_populated.enabled\"/>\n      <property id=\"config.bsp.common.pfs_protect\" value=\"config.bsp.common.pfs_protect.enabled\"/>\n      <property id=\"config.bsp.common.c_runtime_init\" value=\"config.bsp.common.c_runtime_init.enabled\"/>\n      <property id=\"config.bsp.common.early_init\" value=\"config.bsp.common.early_init.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_clock_source\" value=\"config.bsp.common.main_osc_clock_source.crystal\"/>\n      <property id=\"config.bsp.common.subclock_populated\" value=\"config.bsp.common.subclock_populated.enabled\"/>\n      <property id=\"config.bsp.common.subclock_drive\" value=\"config.bsp.common.subclock_drive.standard\"/>\n      <property id=\"config.bsp.common.subclock_stabilization_ms\" value=\"1000\"/>\n    </config>\n  </raBspConfiguration>\n  <raClockConfiguration>\n    <node id=\"board.clock.xtal.freq\" mul=\"12000000\" option=\"_edit\"/>\n    <node id=\"board.clock.pll.source\" option=\"board.clock.pll.source.xtal\"/>\n    <node id=\"board.clock.hoco.freq\" option=\"board.clock.hoco.freq.24m\"/>\n    <node id=\"board.clock.loco.freq\" option=\"board.clock.loco.freq.32768\"/>\n    <node id=\"board.clock.moco.freq\" option=\"board.clock.moco.freq.8m\"/>\n    <node id=\"board.clock.subclk.freq\" option=\"board.clock.subclk.freq.32768\"/>\n    <node id=\"board.clock.pll.div\" option=\"board.clock.pll.div.2\"/>\n    <node id=\"board.clock.pll.mul\" option=\"board.clock.pll.mul.8\"/>\n    <node id=\"board.clock.pll.display\" option=\"board.clock.pll.display.value\"/>\n    <node id=\"board.clock.clock.source\" option=\"board.clock.clock.source.pll\"/>\n    <node id=\"board.clock.iclk.div\" option=\"board.clock.iclk.div.1\"/>\n    <node id=\"board.clock.iclk.display\" option=\"board.clock.iclk.display.value\"/>\n    <node id=\"board.clock.pclka.div\" option=\"board.clock.pclka.div.1\"/>\n    <node id=\"board.clock.pclka.display\" option=\"board.clock.pclka.display.value\"/>\n    <node id=\"board.clock.pclkb.div\" option=\"board.clock.pclkb.div.2\"/>\n    <node id=\"board.clock.pclkb.display\" option=\"board.clock.pclkb.display.value\"/>\n    <node id=\"board.clock.pclkc.div\" option=\"board.clock.pclkc.div.1\"/>\n    <node id=\"board.clock.pclkc.display\" option=\"board.clock.pclkc.display.value\"/>\n    <node id=\"board.clock.pclkd.div\" option=\"board.clock.pclkd.div.1\"/>\n    <node id=\"board.clock.pclkd.display\" option=\"board.clock.pclkd.display.value\"/>\n    <node id=\"board.clock.fclk.div\" option=\"board.clock.fclk.div.2\"/>\n    <node id=\"board.clock.fclk.display\" option=\"board.clock.fclk.display.value\"/>\n    <node id=\"board.clock.clkout.source\" option=\"board.clock.clkout.source.disabled\"/>\n    <node id=\"board.clock.clkout.div\" option=\"board.clock.clkout.div.1\"/>\n    <node id=\"board.clock.clkout.display\" option=\"board.clock.clkout.display.value\"/>\n    <node id=\"board.clock.uclk.source\" option=\"board.clock.uclk.source.pll\"/>\n    <node id=\"board.clock.uclk.display\" option=\"board.clock.clkout.display.value\"/>\n  </raClockConfiguration>\n  <raComponentSelection>\n    <component apiversion=\"\" class=\"Projects\" condition=\"\" group=\"all\" subgroup=\"baremetal_blinky\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Simple application that blinks an LED. No RTOS included.</description>\n      <originalPack>Renesas.RA_baremetal_blinky.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"Common\" condition=\"\" group=\"all\" subgroup=\"fsp_common\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board Support Package Common Files</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_ioport\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>I/O Port</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"CMSIS\" condition=\"\" group=\"CMSIS5\" subgroup=\"CoreM\" variant=\"\" vendor=\"Arm\" version=\"6.1.0+fsp.5.6.0\">\n      <description>Arm CMSIS Version 6 - Core (M)</description>\n      <originalPack>Arm.CMSIS6.6.1.0+fsp.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"Board\" subgroup=\"ra4m1_ek\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>RA4M1-EK Board Support Files</description>\n      <originalPack>Renesas.RA_board_ra4m1_ek.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m1\" subgroup=\"device\" variant=\"R7FA4M1AB3CFP\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for R7FA4M1AB3CFP</description>\n      <originalPack>Renesas.RA_mcu_ra4m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m1\" subgroup=\"device\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M1</description>\n      <originalPack>Renesas.RA_mcu_ra4m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m1\" subgroup=\"fsp\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M1 - FSP Data</description>\n      <originalPack>Renesas.RA_mcu_ra4m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m1\" subgroup=\"events\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M1 - Events</description>\n      <originalPack>Renesas.RA_mcu_ra4m1.5.6.0.pack</originalPack>\n    </component>\n  </raComponentSelection>\n  <raElcConfiguration/>\n  <raIcuConfiguration/>\n  <raModuleConfiguration>\n    <module id=\"module.driver.ioport_on_ioport.0\">\n      <property id=\"module.driver.ioport.name\" value=\"g_ioport\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport1\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport2\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport3\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport4\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.pincfg\" value=\"g_bsp_pin_cfg\"/>\n    </module>\n    <context id=\"_hal.0\">\n      <stack module=\"module.driver.ioport_on_ioport.0\"/>\n    </context>\n    <config id=\"config.driver.ioport\">\n      <property id=\"config.driver.ioport.checking\" value=\"config.driver.ioport.checking.system\"/>\n    </config>\n  </raModuleConfiguration>\n  <raPinConfiguration>\n    <symbolicName propertyId=\"p105.symbolic_name\" value=\"SW1\"/>\n    <symbolicName propertyId=\"p106.symbolic_name\" value=\"LED1\"/>\n    <pincfg active=\"true\" name=\"RA4M1-EK.pincfg\" selected=\"true\" symbol=\"g_bsp_pin_cfg\">\n      <configSetting altId=\"adc0.an04.p004\" configurationId=\"adc0.an04\"/>\n      <configSetting altId=\"adc0.mode.custom\" configurationId=\"adc0.mode\"/>\n      <configSetting altId=\"ctsu0.mode.enabled\" configurationId=\"ctsu0.mode\"/>\n      <configSetting altId=\"ctsu0.ts35.p115\" configurationId=\"ctsu0.ts35\"/>\n      <configSetting altId=\"ctsu0.tscap.p205\" configurationId=\"ctsu0.tscap\"/>\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"p004.adc0.an04\" configurationId=\"p004\"/>\n      <configSetting altId=\"p004.gpio_mode.gpio_mode_an\" configurationId=\"p004.gpio_mode\"/>\n      <configSetting altId=\"p100.spi0.miso\" configurationId=\"p100\"/>\n      <configSetting altId=\"p100.gpio_mode.gpio_mode_peripheral\" configurationId=\"p100.gpio_mode\"/>\n      <configSetting altId=\"p101.spi0.mosi\" configurationId=\"p101\"/>\n      <configSetting altId=\"p101.gpio_mode.gpio_mode_peripheral\" configurationId=\"p101.gpio_mode\"/>\n      <configSetting altId=\"p102.spi0.rspck\" configurationId=\"p102\"/>\n      <configSetting altId=\"p102.gpio_mode.gpio_mode_peripheral\" configurationId=\"p102.gpio_mode\"/>\n      <configSetting altId=\"p103.spi0.ssl0\" configurationId=\"p103\"/>\n      <configSetting altId=\"p103.gpio_mode.gpio_mode_peripheral\" configurationId=\"p103.gpio_mode\"/>\n      <configSetting altId=\"p105.input\" configurationId=\"p105\"/>\n      <configSetting altId=\"p105.gpio_mode.gpio_mode_in\" configurationId=\"p105.gpio_mode\"/>\n      <configSetting altId=\"p105.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p105.gpio_pupd\"/>\n      <configSetting altId=\"p106.output.low\" configurationId=\"p106\"/>\n      <configSetting altId=\"p106.gpio_mode.gpio_mode_out.low\" configurationId=\"p106.gpio_mode\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p115.ctsu0.ts35\" configurationId=\"p115\"/>\n      <configSetting altId=\"p115.gpio_mode.gpio_mode_peripheral\" configurationId=\"p115.gpio_mode\"/>\n      <configSetting altId=\"p205.ctsu0.tscap\" configurationId=\"p205\"/>\n      <configSetting altId=\"p205.gpio_mode.gpio_mode_peripheral\" configurationId=\"p205.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n      <configSetting altId=\"p400.output.low\" configurationId=\"p400\"/>\n      <configSetting altId=\"p400.gpio_mode.gpio_mode_out.low\" configurationId=\"p400.gpio_mode\"/>\n      <configSetting altId=\"p401.sci1.txd\" configurationId=\"p401\"/>\n      <configSetting altId=\"p401.gpio_mode.gpio_mode_peripheral\" configurationId=\"p401.gpio_mode\"/>\n      <configSetting altId=\"p402.sci1.rxd\" configurationId=\"p402\"/>\n      <configSetting altId=\"p402.gpio_mode.gpio_mode_peripheral\" configurationId=\"p402.gpio_mode\"/>\n      <configSetting altId=\"p403.output.low\" configurationId=\"p403\"/>\n      <configSetting altId=\"p403.gpio_mode.gpio_mode_out.low\" configurationId=\"p403.gpio_mode\"/>\n      <configSetting altId=\"p407.usbfs0.vbus\" configurationId=\"p407\"/>\n      <configSetting altId=\"p407.gpio_mode.gpio_mode_peripheral\" configurationId=\"p407.gpio_mode\"/>\n      <configSetting altId=\"p914.usbfs0.usbdp\" configurationId=\"p914\"/>\n      <configSetting altId=\"p914.gpio_mode.gpio_mode_peripheral\" configurationId=\"p914.gpio_mode\"/>\n      <configSetting altId=\"p915.usbfs0.usbdm\" configurationId=\"p915\"/>\n      <configSetting altId=\"p915.gpio_mode.gpio_mode_peripheral\" configurationId=\"p915.gpio_mode\"/>\n      <configSetting altId=\"sci1.mode.asynchronous.free\" configurationId=\"sci1.mode\"/>\n      <configSetting altId=\"sci1.rxd.p402\" configurationId=\"sci1.rxd\"/>\n      <configSetting altId=\"sci1.txd.p401\" configurationId=\"sci1.txd\"/>\n      <configSetting altId=\"spi0.miso.p100\" configurationId=\"spi0.miso\"/>\n      <configSetting altId=\"spi0.mode.enabled.a\" configurationId=\"spi0.mode\"/>\n      <configSetting altId=\"spi0.mosi.p101\" configurationId=\"spi0.mosi\"/>\n      <configSetting altId=\"spi0.rspck.p102\" configurationId=\"spi0.rspck\"/>\n      <configSetting altId=\"spi0.ssl0.p103\" configurationId=\"spi0.ssl0\"/>\n      <configSetting altId=\"usbfs0.mode.device\" configurationId=\"usbfs0.mode\"/>\n      <configSetting altId=\"usbfs0.usbdm.p915\" configurationId=\"usbfs0.usbdm\"/>\n      <configSetting altId=\"usbfs0.usbdp.p914\" configurationId=\"usbfs0.usbdp\"/>\n      <configSetting altId=\"usbfs0.vbus.p407\" configurationId=\"usbfs0.vbus\"/>\n    </pincfg>\n    <pincfg active=\"false\" name=\"R7FA4M1AB3CFP.pincfg\" selected=\"false\" symbol=\"\">\n      <configSetting altId=\"debug0.mode.jtag\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.tck.p300\" configurationId=\"debug0.tck\"/>\n      <configSetting altId=\"debug0.tdi.p110\" configurationId=\"debug0.tdi\"/>\n      <configSetting altId=\"debug0.tdo.p109\" configurationId=\"debug0.tdo\"/>\n      <configSetting altId=\"debug0.tms.p108\" configurationId=\"debug0.tms\"/>\n      <configSetting altId=\"p108.debug0.tms\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p109.debug0.tdo\" configurationId=\"p109\"/>\n      <configSetting altId=\"p109.gpio_mode.gpio_mode_peripheral\" configurationId=\"p109.gpio_mode\"/>\n      <configSetting altId=\"p110.debug0.tdi\" configurationId=\"p110\"/>\n      <configSetting altId=\"p110.gpio_mode.gpio_mode_peripheral\" configurationId=\"p110.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.tck\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n    </pincfg>\n  </raPinConfiguration>\n</raConfiguration>\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\nset(MCU_VARIANT ra4m3)\n\nset(JLINK_DEVICE R7FA4M3AF)\n\nfunction(update_board TARGET)\n#  target_compile_definitions(${TARGET} PUBLIC)\n#  target_sources(${TARGET} PRIVATE)\n#  target_include_directories(${BOARD_TARGET} PUBLIC)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: RA4M3 EK\n   url: https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra4m3-evaluation-kit-ra4m3-mcu-group\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED1 (BSP_IO_PORT_04_PIN_15)\n#define LED_STATE_ON          1\n\n#define SW1  (BSP_IO_PORT_00_PIN_05)\n#define BUTTON_STATE_ACTIVE   0\n\nstatic const ioport_pin_cfg_t board_pin_cfg[] = {\n  {.pin = LED1, .pin_cfg = IOPORT_CFG_PORT_DIRECTION_OUTPUT},\n  {.pin = SW1, .pin_cfg = IOPORT_CFG_PORT_DIRECTION_INPUT},\n    // USB FS\n  {.pin = BSP_IO_PORT_04_PIN_07, .pin_cfg = IOPORT_CFG_PERIPHERAL_PIN | IOPORT_PERIPHERAL_USB_FS},\n  {.pin = BSP_IO_PORT_05_PIN_00, .pin_cfg = IOPORT_CFG_PERIPHERAL_PIN | IOPORT_PERIPHERAL_USB_FS},\n  {.pin = BSP_IO_PORT_05_PIN_01, .pin_cfg = IOPORT_CFG_PERIPHERAL_PIN | IOPORT_PERIPHERAL_USB_FS},\n};\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/board.mk",
    "content": "CPU_CORE = cortex-m33\nMCU_VARIANT = ra4m3\n\n# For flash-jlink target\nJLINK_DEVICE = R7FA4M3AF\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_cfg/fsp_cfg/bsp/bsp_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CFG_H_\n#define BSP_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_clock_cfg.h\"\n            #include \"bsp_mcu_family_cfg.h\"\n            #include \"board_cfg.h\"\n            #define RA_NOT_DEFINED 0\n            #ifndef BSP_CFG_RTOS\n             #if (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (2)\n             #elif (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (1)\n             #else\n              #define BSP_CFG_RTOS (0)\n             #endif\n            #endif\n            #ifndef BSP_CFG_RTC_USED\n             #define BSP_CFG_RTC_USED (RA_NOT_DEFINED)\n            #endif\n            #undef RA_NOT_DEFINED\n            #if defined(_RA_BOOT_IMAGE)\n             #define BSP_CFG_BOOT_IMAGE (1)\n            #endif\n            #define BSP_CFG_MCU_VCC_MV (3300)\n            #define BSP_CFG_STACK_MAIN_BYTES (0x800)\n            #define BSP_CFG_HEAP_BYTES (0x800)\n            #define BSP_CFG_PARAM_CHECKING_ENABLE (0)\n            #define BSP_CFG_ASSERT (0)\n            #define BSP_CFG_ERROR_LOG (0)\n\n            #define BSP_CFG_PFS_PROTECT ((1))\n\n            #define BSP_CFG_C_RUNTIME_INIT ((1))\n            #define BSP_CFG_EARLY_INIT     ((0))\n\n            #define BSP_CFG_STARTUP_CLOCK_REG_NOT_RESET ((0))\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_POPULATED\n            #define BSP_CLOCK_CFG_MAIN_OSC_POPULATED (1)\n            #endif\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE\n            #define BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_DRIVE\n            #define BSP_CLOCK_CFG_SUBCLOCK_DRIVE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_POPULATED\n            #define BSP_CLOCK_CFG_SUBCLOCK_POPULATED (1)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS\n            #define BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS 1000\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_CFG_H_\n#define BSP_MCU_DEVICE_CFG_H_\n#define BSP_CFG_MCU_PART_SERIES (4)\n#endif /* BSP_MCU_DEVICE_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_pn_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_R7FA4M3AF3CFB\n      #define BSP_MCU_FEATURE_SET ('A')\n      #define BSP_ROM_SIZE_BYTES (1048576)\n      #define BSP_RAM_SIZE_BYTES (131072)\n      #define BSP_DATA_FLASH_SIZE_BYTES (8192)\n      #define BSP_PACKAGE_LQFP\n      #define BSP_PACKAGE_PINS (144)\n#endif /* BSP_MCU_DEVICE_PN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_family_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_FAMILY_CFG_H_\n#define BSP_MCU_FAMILY_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n            #include \"bsp_mcu_device_pn_cfg.h\"\n            #include \"bsp_mcu_device_cfg.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra4m3/bsp_mcu_info.h\"\n            #include \"bsp_clock_cfg.h\"\n            #define BSP_MCU_GROUP_RA4M3 (1)\n            #define BSP_LOCO_HZ                 (32768)\n            #define BSP_MOCO_HZ                 (8000000)\n            #define BSP_SUB_CLOCK_HZ            (32768)\n            #if   BSP_CFG_HOCO_FREQUENCY == 0\n                #define BSP_HOCO_HZ                 (16000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 1\n                #define BSP_HOCO_HZ                 (18000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 2\n                #define BSP_HOCO_HZ                 (20000000)\n            #else\n                #error \"Invalid HOCO frequency chosen (BSP_CFG_HOCO_FREQUENCY) in bsp_clock_cfg.h\"\n            #endif\n\n            #define BSP_CFG_FLL_ENABLE                 (0)\n\n            #define BSP_CORTEX_VECTOR_TABLE_ENTRIES    (16U)\n            #define BSP_VECTOR_TABLE_MAX_ENTRIES       (112U)\n            #define BSP_CFG_INLINE_IRQ_FUNCTIONS       (1)\n\n            #if defined(_RA_TZ_SECURE)\n            #define BSP_TZ_SECURE_BUILD           (1)\n            #define BSP_TZ_NONSECURE_BUILD        (0)\n            #elif defined(_RA_TZ_NONSECURE)\n            #define BSP_TZ_SECURE_BUILD           (0)\n            #define BSP_TZ_NONSECURE_BUILD        (1)\n            #else\n            #define BSP_TZ_SECURE_BUILD           (0)\n            #define BSP_TZ_NONSECURE_BUILD        (0)\n            #endif\n\n            /* TrustZone Settings */\n            #define BSP_TZ_CFG_INIT_SECURE_ONLY       (BSP_CFG_CLOCKS_SECURE || (!BSP_CFG_CLOCKS_OVERRIDE))\n            #define BSP_TZ_CFG_SKIP_INIT              (BSP_TZ_NONSECURE_BUILD && BSP_TZ_CFG_INIT_SECURE_ONLY)\n            #define BSP_TZ_CFG_EXCEPTION_RESPONSE     (0)\n\n            /* CMSIS TrustZone Settings */\n            #define SCB_CSR_AIRCR_INIT                (1)\n            #define SCB_AIRCR_BFHFNMINS_VAL           (0)\n            #define SCB_AIRCR_SYSRESETREQS_VAL        (1)\n            #define SCB_AIRCR_PRIS_VAL                (0)\n            #define TZ_FPU_NS_USAGE                   (1)\n#ifndef SCB_NSACR_CP10_11_VAL\n            #define SCB_NSACR_CP10_11_VAL             (3U)\n#endif\n\n#ifndef FPU_FPCCR_TS_VAL\n            #define FPU_FPCCR_TS_VAL                  (1U)\n#endif\n            #define FPU_FPCCR_CLRONRETS_VAL           (1)\n\n#ifndef FPU_FPCCR_CLRONRET_VAL\n            #define FPU_FPCCR_CLRONRET_VAL            (1)\n#endif\n\n            /* The C-Cache line size that is configured during startup. */\n#ifndef BSP_CFG_C_CACHE_LINE_SIZE\n            #define BSP_CFG_C_CACHE_LINE_SIZE   (1U)\n#endif\n\n            /* Type 1 Peripheral Security Attribution */\n\n            /* Peripheral Security Attribution Register (PSAR) Settings */\n#ifndef BSP_TZ_CFG_PSARB\n#define BSP_TZ_CFG_PSARB (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* CAN1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* CAN0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* IIC1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9) /* IIC0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* USBFS */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 18) /* SPI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 19) /* SPI0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* SCI9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 23) /* SCI8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 24) /* SCI7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 25) /* SCI6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 26) /* SCI5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* SCI4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* SCI3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 29) /* SCI2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 30) /* SCI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* SCI0 */ | \\\n            0x33f4f9) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARC\n#define BSP_TZ_CFG_PSARC (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* CAC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* CRC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3) /* CTSU */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* SSIE0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* SDHI0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13) /* DOC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* SCE9 */ | \\\n            0x7fffcef4) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARD\n#define BSP_TZ_CFG_PSARD (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* AGT3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* AGT2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* AGT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3) /* AGT0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* POEG3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* POEG2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13) /* POEG1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14) /* POEG0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15) /* ADC1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 16) /* ADC0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 20) /* DAC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* TSN */ | \\\n            0xffae07f0) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARE\n#define BSP_TZ_CFG_PSARE (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* WDT */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* IWDT */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* RTC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14) /* AGT5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15) /* AGT4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* GPT9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 23) /* GPT8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 24) /* GPT7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 25) /* GPT6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 26) /* GPT5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* GPT4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* GPT3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 29) /* GPT2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 30) /* GPT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* GPT0 */ | \\\n            0x3f3ff8) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_MSSAR\n#define BSP_TZ_CFG_MSSAR (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* ELC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* DTC_DMAC */ | \\\n            0xfffffffc) /* Unused */\n#endif\n\n            /* Type 2 Peripheral Security Attribution */\n\n            /* Security attribution for Cache registers. */\n#ifndef BSP_TZ_CFG_CSAR\n#define BSP_TZ_CFG_CSAR (0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for RSTSRn registers. */\n#ifndef BSP_TZ_CFG_RSTSAR\n#define BSP_TZ_CFG_RSTSAR (0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for registers of LVD channels. */\n#ifndef BSP_TZ_CFG_LVDSAR\n#define BSP_TZ_CFG_LVDSAR (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) | /* LVD Channel 1 */ \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) | /* LVD Channel 2 */ \\\n            0xFFFFFFFCU)\n#endif\n\n            /* Security attribution for LPM registers. */\n#ifndef BSP_TZ_CFG_LPMSAR\n#define BSP_TZ_CFG_LPMSAR ((RA_NOT_DEFINED > 0) ? 0xFFFFFCEAU : 0xFFFFFFFFU)\n#endif\n            /* Deep Standby Interrupt Factor Security Attribution Register. */\n#ifndef BSP_TZ_CFG_DPFSAR\n#define BSP_TZ_CFG_DPFSAR ((RA_NOT_DEFINED > 0) ? 0xF2E00000U : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for CGC registers. */\n#ifndef BSP_TZ_CFG_CGFSAR\n#if BSP_CFG_CLOCKS_SECURE\n/* Protect all CGC registers from Non-secure write access. */\n#define BSP_TZ_CFG_CGFSAR (0xFFFCE402U)\n#else\n/* Allow Secure and Non-secure write access. */\n#define BSP_TZ_CFG_CGFSAR (0xFFFFFFFFU)\n#endif\n#endif\n\n            /* Security attribution for Battery Backup registers. */\n#ifndef BSP_TZ_CFG_BBFSAR\n#define BSP_TZ_CFG_BBFSAR (0x00FFFFFF)\n#endif\n\n            /* Security attribution for registers for IRQ channels. */\n#ifndef BSP_TZ_CFG_ICUSARA\n#define BSP_TZ_CFG_ICUSARA (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0U) /* External IRQ0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1U) /* External IRQ1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2U) /* External IRQ2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3U) /* External IRQ3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4U) /* External IRQ4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5U) /* External IRQ5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 6U) /* External IRQ6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7U) /* External IRQ7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8U) /* External IRQ8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9U) /* External IRQ9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 10U) /* External IRQ10 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11U) /* External IRQ11 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12U) /* External IRQ12 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13U) /* External IRQ13 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14U) /* External IRQ14 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15U) /* External IRQ15 */ | \\\n            0xFFFF0000U)\n#endif\n\n            /* Security attribution for NMI registers. */\n#ifndef BSP_TZ_CFG_ICUSARB\n#define BSP_TZ_CFG_ICUSARB (0 | 0xFFFFFFFEU) /* Should match AIRCR.BFHFNMINS. */\n#endif\n\n            /* Security attribution for registers for DMAC channels */\n#ifndef BSP_TZ_CFG_ICUSARC\n#define BSP_TZ_CFG_ICUSARC (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0U) /* DMAC Channel 0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1U) /* DMAC Channel 1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2U) /* DMAC Channel 2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3U) /* DMAC Channel 3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4U) /* DMAC Channel 4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5U) /* DMAC Channel 5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 6U) /* DMAC Channel 6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7U) /* DMAC Channel 7 */ | \\\n            0xFFFFFF00U)\n#endif\n\n            /* Security attribution registers for SELSR0. */\n#ifndef BSP_TZ_CFG_ICUSARD\n#define BSP_TZ_CFG_ICUSARD ((RA_NOT_DEFINED > 0) ? 0xFFFFFFFEU : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution registers for WUPEN0. */\n#ifndef BSP_TZ_CFG_ICUSARE\n#define BSP_TZ_CFG_ICUSARE ((RA_NOT_DEFINED > 0) ? 0x04F2FFFFU : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution registers for WUPEN1. */\n#ifndef BSP_TZ_CFG_ICUSARF\n#define BSP_TZ_CFG_ICUSARF ((RA_NOT_DEFINED > 0) ? 0xFFFFFFF8U : 0xFFFFFFFFU)\n#endif\n\n            /* Set DTCSTSAR if the Secure program uses the DTC. */\n#if RA_NOT_DEFINED == RA_NOT_DEFINED\n #define BSP_TZ_CFG_DTC_USED (0U)\n#else\n #define BSP_TZ_CFG_DTC_USED (1U)\n#endif\n\n            /* Security attribution of FLWT and FCKMHZ registers. */\n#ifndef BSP_TZ_CFG_FSAR\n/* If the CGC registers are only accessible in Secure mode, than there is no\n * reason for nonsecure applications to access FLWT and FCKMHZ. */\n#if BSP_CFG_CLOCKS_SECURE\n/* Protect FLWT and FCKMHZ registers from nonsecure write access. */\n#define BSP_TZ_CFG_FSAR (0xFEFEU)\n#else\n/* Allow Secure and Non-secure write access. */\n#define BSP_TZ_CFG_FSAR (0xFFFFU)\n#endif\n#endif\n\n            /* Security attribution for SRAM registers. */\n#ifndef BSP_TZ_CFG_SRAMSAR\n/* If the CGC registers are only accessible in Secure mode, than there is no reason for Non Secure applications to access\n * SRAM0WTEN and therefore there is no reason to access PRCR2. */\n    #define BSP_TZ_CFG_SRAMSAR (\\\n        1 | \\\n        ((BSP_CFG_CLOCKS_SECURE == 0) ? (1U << 1U) : 0U) | \\\n        4 | \\\n        0xFFFFFFF8U)\n#endif\n\n            /* Security attribution for Standby RAM registers. */\n#ifndef BSP_TZ_CFG_STBRAMSAR\n    #define BSP_TZ_CFG_STBRAMSAR (0 | 0xFFFFFFF0U)\n#endif\n\n            /* Security attribution for the DMAC Bus Master MPU settings. */\n#ifndef BSP_TZ_CFG_MMPUSARA\n    /* The DMAC Bus Master MPU settings should align with the DMAC channel settings. */\n    #define BSP_TZ_CFG_MMPUSARA (BSP_TZ_CFG_ICUSARC)\n#endif\n\n            /* Security Attribution Register A for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARA\n    #define BSP_TZ_CFG_BUSSARA (0xFFFFFFFFU)\n#endif\n            /* Security Attribution Register B for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARB\n    #define BSP_TZ_CFG_BUSSARB (0xFFFFFFFFU)\n#endif\n\n            /* Enable Uninitialized Non-Secure Application Fallback. */\n#ifndef BSP_TZ_CFG_NON_SECURE_APPLICATION_FALLBACK\n    #define BSP_TZ_CFG_NON_SECURE_APPLICATION_FALLBACK (1U)\n#endif\n\n\n            #define OFS_SEQ1 0xA001A001 | (1 << 1) | (3 << 2)\n            #define OFS_SEQ2 (15 << 4) | (3 << 8) | (3 << 10)\n            #define OFS_SEQ3 (1 << 12) | (1 << 14) | (1 << 17)\n            #define OFS_SEQ4 (3 << 18) |(15 << 20) | (3 << 24) | (3 << 26)\n            #define OFS_SEQ5 (1 << 28) | (1 << 30)\n            #define BSP_CFG_ROM_REG_OFS0 (OFS_SEQ1 | OFS_SEQ2 | OFS_SEQ3 | OFS_SEQ4 | OFS_SEQ5)\n\n            /* Option Function Select Register 1 Security Attribution */\n#ifndef BSP_CFG_ROM_REG_OFS1_SEL\n#if defined(_RA_TZ_SECURE) || defined(_RA_TZ_NONSECURE)\n            #define BSP_CFG_ROM_REG_OFS1_SEL (0xFFFFF8F8U | ((0U << 0U)) | ((0U << 2U)) | ((BSP_CFG_CLOCKS_SECURE == 0) ? 0x700U : 0U))\n#else\n            #define BSP_CFG_ROM_REG_OFS1_SEL (0xFFFFF8F8U)\n#endif\n#endif\n\n            #define BSP_CFG_ROM_REG_OFS1 (0xFFFFFEF8 | (1 << 2) | (3) |  (1 << 8))\n\n            /* Used to create IELS values for the interrupt initialization table g_interrupt_event_link_select. */\n            #define BSP_PRV_IELS_ENUM(vector)    (ELC_ ## vector)\n\n            /* Dual Mode Select Register */\n#ifndef BSP_CFG_ROM_REG_DUALSEL\n            #define BSP_CFG_ROM_REG_DUALSEL (0xFFFFFFFFU)\n#endif\n\n            /* Block Protection Register 0 */\n#ifndef BSP_CFG_ROM_REG_BPS0\n            #define BSP_CFG_ROM_REG_BPS0 (~( 0U))\n#endif\n            /* Block Protection Register 1 */\n#ifndef BSP_CFG_ROM_REG_BPS1\n            #define BSP_CFG_ROM_REG_BPS1 (~( 0U))\n#endif\n            /* Block Protection Register 2 */\n#ifndef BSP_CFG_ROM_REG_BPS2\n            #define BSP_CFG_ROM_REG_BPS2 (0xFFFFFFFFU)\n#endif\n            /* Block Protection Register 3 */\n#ifndef BSP_CFG_ROM_REG_BPS3\n            #define BSP_CFG_ROM_REG_BPS3 (0xFFFFFFFFU)\n#endif\n            /* Permanent Block Protection Register 0 */\n#ifndef BSP_CFG_ROM_REG_PBPS0\n            #define BSP_CFG_ROM_REG_PBPS0 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 1 */\n#ifndef BSP_CFG_ROM_REG_PBPS1\n            #define BSP_CFG_ROM_REG_PBPS1 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 2 */\n#ifndef BSP_CFG_ROM_REG_PBPS2\n            #define BSP_CFG_ROM_REG_PBPS2 (0xFFFFFFFFU)\n#endif\n            /* Permanent Block Protection Register 3 */\n#ifndef BSP_CFG_ROM_REG_PBPS3\n            #define BSP_CFG_ROM_REG_PBPS3 (0xFFFFFFFFU)\n#endif\n            /* Security Attribution for Block Protection Register 0 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL0\n            #define BSP_CFG_ROM_REG_BPS_SEL0 (BSP_CFG_ROM_REG_BPS0 & BSP_CFG_ROM_REG_PBPS0)\n#endif\n            /* Security Attribution for Block Protection Register 1 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL1\n            #define BSP_CFG_ROM_REG_BPS_SEL1 (BSP_CFG_ROM_REG_BPS1 & BSP_CFG_ROM_REG_PBPS1)\n#endif\n            /* Security Attribution for Block Protection Register 2 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL2\n            #define BSP_CFG_ROM_REG_BPS_SEL2 (0xFFFFFFFFU)\n#endif\n            /* Security Attribution for Block Protection Register 3 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL3\n            #define BSP_CFG_ROM_REG_BPS_SEL3 (0xFFFFFFFFU)\n#endif\n#ifndef BSP_CLOCK_CFG_MAIN_OSC_WAIT\n            #define BSP_CLOCK_CFG_MAIN_OSC_WAIT (9)\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* BSP_MCU_FAMILY_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_cfg/fsp_cfg/bsp/bsp_pin_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_PIN_CFG_H_\n#define BSP_PIN_CFG_H_\n#include \"r_ioport.h\"\n\n/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */\nFSP_HEADER\n\n#define ARDUINO_A0_MIKROBUS_AN (BSP_IO_PORT_00_PIN_00)\n#define ARDUINO_A1 (BSP_IO_PORT_00_PIN_01)\n#define ARDUINO_A2 (BSP_IO_PORT_00_PIN_03)\n#define SW1 (BSP_IO_PORT_00_PIN_05)\n#define SW2 (BSP_IO_PORT_00_PIN_06)\n#define ARDUINO_A3 (BSP_IO_PORT_00_PIN_07)\n#define PMOD1_INT (BSP_IO_PORT_00_PIN_08)\n#define ARDUINO_A4 (BSP_IO_PORT_00_PIN_14)\n#define ARDUINO_A5 (BSP_IO_PORT_00_PIN_15)\n#define ARDUINO_RX_MIKROBUS_RX (BSP_IO_PORT_01_PIN_00)\n#define ARDUINO_TX_MIKROBUS_TX (BSP_IO_PORT_01_PIN_01)\n#define ARDUINO_D2 (BSP_IO_PORT_01_PIN_05)\n#define ARDUINO_D3 (BSP_IO_PORT_01_PIN_11)\n#define MIKROBUS_RST (BSP_IO_PORT_01_PIN_15)\n#define ARDUINO_MISO_MIKROBUS_MISO_PMOD1_MISO (BSP_IO_PORT_02_PIN_02)\n#define ARDUINO_MOSI_MIKROBUS_MOSI_PMOD1_MOSI (BSP_IO_PORT_02_PIN_03)\n#define ARDUINO_CLK_MIKROBUS_CLK_PMOD1_CLK (BSP_IO_PORT_02_PIN_04)\n#define ARDUINO_SS_MIKCRBUS_SS (BSP_IO_PORT_02_PIN_05)\n#define PMOD1_SS1 (BSP_IO_PORT_02_PIN_06)\n#define PMOD1_SS2 (BSP_IO_PORT_02_PIN_07)\n#define PMOD1_SS3 (BSP_IO_PORT_03_PIN_02)\n#define ARDUINO_D9 (BSP_IO_PORT_03_PIN_03)\n#define ARDUINO_D7 (BSP_IO_PORT_03_PIN_04)\n#define QSPI_CLK (BSP_IO_PORT_03_PIN_05)\n#define QSPI_SSL (BSP_IO_PORT_03_PIN_06)\n#define QSPI_IO0 (BSP_IO_PORT_03_PIN_07)\n#define QSPI_IO1 (BSP_IO_PORT_03_PIN_08)\n#define QSPI_IO2 (BSP_IO_PORT_03_PIN_09)\n#define QSPI_IO3 (BSP_IO_PORT_03_PIN_10)\n#define PMOD1_RST (BSP_IO_PORT_03_PIN_11)\n#define LED3 (BSP_IO_PORT_04_PIN_00)\n#define LED2 (BSP_IO_PORT_04_PIN_04)\n#define USB_VBUS (BSP_IO_PORT_04_PIN_07)\n#define ARDUINO_D6_MIKROBUS_PWM (BSP_IO_PORT_04_PIN_08)\n#define MIKROBUS_INT (BSP_IO_PORT_04_PIN_09)\n#define PMOD2_INT (BSP_IO_PORT_04_PIN_14)\n#define LED1 (BSP_IO_PORT_04_PIN_15)\n#define USB_VBUS_EN (BSP_IO_PORT_05_PIN_00)\n#define USB_VBUS_OC (BSP_IO_PORT_05_PIN_01)\n#define GROVE2_AN1 (BSP_IO_PORT_05_PIN_05)\n#define GROVE2_AN2 (BSP_IO_PORT_05_PIN_06)\n#define GROVE1_SDA_QWIIC_SDA (BSP_IO_PORT_05_PIN_11)\n#define GROVE1_SCL_QWIIC_SCL (BSP_IO_PORT_05_PIN_12)\n#define ARDUINO_SCL_MIKROBUS_SCL (BSP_IO_PORT_06_PIN_01)\n#define ARDUINO_SDA_MIKROBUS_SDA (BSP_IO_PORT_06_PIN_02)\n#define ARDUINO_D8 (BSP_IO_PORT_06_PIN_11)\n#define ARDUINO_RST (BSP_IO_PORT_06_PIN_12)\n#define PMOD2_RST (BSP_IO_PORT_07_PIN_08)\n#define PMOD2_SS2 (BSP_IO_PORT_07_PIN_09)\n#define PMOD2_SS3 (BSP_IO_PORT_07_PIN_10)\n#define ARDUINO_D5 (BSP_IO_PORT_07_PIN_12)\n#define ARDUINO_D4 (BSP_IO_PORT_07_PIN_13)\nextern const ioport_cfg_t g_bsp_pin_cfg; /* RA4M3 EK */\n\nvoid BSP_PinConfigSecurityInit();\n\n/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */\nFSP_FOOTER\n#endif /* BSP_PIN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_cfg/fsp_cfg/r_ioport_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef R_IOPORT_CFG_H_\n#define R_IOPORT_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define IOPORT_CFG_PARAM_CHECKING_ENABLE (BSP_CFG_PARAM_CHECKING_ENABLE)\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* R_IOPORT_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_gen/bsp_clock_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CLOCK_CFG_H_\n#define BSP_CLOCK_CFG_H_\n#define BSP_CFG_CLOCKS_SECURE (0)\n#define BSP_CFG_CLOCKS_OVERRIDE (0)\n#define BSP_CFG_XTAL_HZ (24000000) /* XTAL 24000000Hz */\n#define BSP_CFG_HOCO_FREQUENCY (2) /* HOCO 20MHz */\n#define BSP_CFG_PLL_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL Src: XTAL */\n#define BSP_CFG_PLL_DIV (BSP_CLOCKS_PLL_DIV_3) /* PLL Div /3 */\n#define BSP_CFG_PLL_MUL BSP_CLOCKS_PLL_MUL(25U,0U) /* PLL Mul x25.0 */\n#define BSP_CFG_PLL2_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL2 Src: XTAL */\n#define BSP_CFG_PLL2_DIV (BSP_CLOCKS_PLL_DIV_2) /* PLL2 Div /2 */\n#define BSP_CFG_PLL2_MUL BSP_CLOCKS_PLL_MUL(20U,0U) /* PLL2 Mul x20.0 */\n#define BSP_CFG_CLOCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL) /* Clock Src: PLL */\n#define BSP_CFG_CLKOUT_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CLKOUT Disabled */\n#define BSP_CFG_UCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL2) /* UCLK Src: PLL2 */\n#define BSP_CFG_ICLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* ICLK Div /2 */\n#define BSP_CFG_PCLKA_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKA Div /2 */\n#define BSP_CFG_PCLKB_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* PCLKB Div /4 */\n#define BSP_CFG_PCLKC_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* PCLKC Div /4 */\n#define BSP_CFG_PCLKD_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKD Div /2 */\n#define BSP_CFG_FCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* FCLK Div /4 */\n#define BSP_CFG_CLKOUT_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* CLKOUT Div /1 */\n#define BSP_CFG_UCK_DIV (BSP_CLOCKS_USB_CLOCK_DIV_5) /* UCLK Div /5 */\n#endif /* BSP_CLOCK_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_gen/common_data.c",
    "content": "/* generated common source file - do not edit */\n#include \"common_data.h\"\nioport_instance_ctrl_t g_ioport_ctrl;\nconst ioport_instance_t g_ioport =\n        {\n            .p_api = &g_ioport_on_ioport,\n            .p_ctrl = &g_ioport_ctrl,\n            .p_cfg = &g_bsp_pin_cfg,\n        };\nvoid g_common_init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_gen/common_data.h",
    "content": "/* generated common header file - do not edit */\n#ifndef COMMON_DATA_H_\n#define COMMON_DATA_H_\n#include <stdint.h>\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n#include \"bsp_pin_cfg.h\"\nFSP_HEADER\n#define IOPORT_CFG_NAME g_bsp_pin_cfg\n#define IOPORT_CFG_OPEN R_IOPORT_Open\n#define IOPORT_CFG_CTRL g_ioport_ctrl\n\n/* IOPORT Instance */\nextern const ioport_instance_t g_ioport;\n\n/* IOPORT control structure. */\nextern ioport_instance_ctrl_t g_ioport_ctrl;\nvoid g_common_init(void);\nFSP_FOOTER\n#endif /* COMMON_DATA_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/ra_gen/pin_data.c",
    "content": "/* generated pin source file - do not edit */\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n\n\nconst ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {\n    {\n        .pin = BSP_IO_PORT_00_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_GPT1)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_IIC)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_IIC)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_NMOS_ENABLE | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_NMOS_ENABLE | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_13,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n};\n\nconst ioport_cfg_t g_bsp_pin_cfg = {\n    .number_of_pins = sizeof(g_bsp_pin_cfg_data)/sizeof(ioport_pin_cfg_t),\n    .p_pin_cfg_data = &g_bsp_pin_cfg_data[0],\n};\n\n#if BSP_TZ_SECURE_BUILD\n\nvoid R_BSP_PinCfgSecurityInit(void);\n\n/* Initialize SAR registers for secure pins. */\nvoid R_BSP_PinCfgSecurityInit(void)\n{\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n    uint32_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #else\n    uint16_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #endif\n    memset(pmsar, 0xFF, BSP_FEATURE_BSP_NUM_PMSAR * sizeof(R_PMISC->PMSAR[0]));\n\n\n    for(uint32_t i = 0; i < g_bsp_pin_cfg.number_of_pins; i++)\n    {\n        uint32_t port_pin = g_bsp_pin_cfg.p_pin_cfg_data[i].pin;\n        uint32_t port = port_pin >> 8U;\n        uint32_t pin = port_pin & 0xFFU;\n        pmsar[port] &= (uint16_t) ~(1U << pin);\n    }\n\n    for(uint32_t i = 0; i < BSP_FEATURE_BSP_NUM_PMSAR; i++)\n    {\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n        R_PMISC->PMSAR[i].PMSAR = (uint16_t) pmsar[i];\n #else\n        R_PMISC->PMSAR[i].PMSAR = pmsar[i];\n #endif\n    }\n\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/script/fsp.ld",
    "content": "/*\n                  Linker File for Renesas FSP\n*/\n\nINCLUDE memory_regions.ld\n\n/* Uncomment and set XIP_SECONDARY_SLOT_IMAGE to 1 below for the secondary XIP application image.*/\n/*\n XIP_SECONDARY_SLOT_IMAGE = 1;\n*/\n\nQSPI_FLASH_PRV_LENGTH = DEFINED(QSPI_FLASH_SIZE) ? ABSOLUTE(QSPI_FLASH_SIZE) : ABSOLUTE(QSPI_FLASH_LENGTH);\nOSPI_DEVICE_0_PRV_LENGTH = DEFINED(OSPI_DEVICE_0_SIZE) ? ABSOLUTE(OSPI_DEVICE_0_SIZE) : ABSOLUTE(OSPI_DEVICE_0_LENGTH);\nOSPI_DEVICE_1_PRV_LENGTH = DEFINED(OSPI_DEVICE_1_SIZE) ? ABSOLUTE(OSPI_DEVICE_1_SIZE) : ABSOLUTE(OSPI_DEVICE_1_LENGTH);\n\n/* If a flat (secure) project has DEFINED RAM_NS_BUFFER_LENGTH, then emit IDAU symbols to allocate non-secure RAM. */\n__RESERVE_NS_RAM = !DEFINED(PROJECT_NONSECURE) && DEFINED(RAM_NS_BUFFER_LENGTH) && (OPTION_SETTING_S_LENGTH != 0);\n\nITCM_START = DEFINED(ITCM_START)? ITCM_START : 0;\nITCM_LENGTH = DEFINED(ITCM_LENGTH)? ITCM_LENGTH : 0;\nDTCM_START = DEFINED(DTCM_START)? DTCM_START : 0;\nDTCM_LENGTH = DEFINED(DTCM_LENGTH)? DTCM_LENGTH : 0;\nRAM_NS_BUFFER_BLOCK_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? ALIGN(RAM_NS_BUFFER_LENGTH, 8192) : 0;\nRAM_NS_BUFFER_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? RAM_NS_BUFFER_LENGTH : 0;\nRAM_NS_BUFFER_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_LENGTH;\nRAM_NS_BUFFER_BLOCK_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_BLOCK_LENGTH;\n\nOPTION_SETTING_START_NS = DEFINED(PROJECT_NONSECURE) ? OPTION_SETTING_START : OPTION_SETTING_START + 0x80;\n\n/* This definition is used to avoid moving the counter in OPTION_SETTING regions for projects that should not configure option settings.\n * Bootloader images do not configure option settings because they are owned by the bootloader.\n * FSP_BOOTABLE_IMAGE is only defined in bootloader images. */\n__bl_FSP_BOOTABLE_IMAGE = 1;\n__bln_FSP_BOOTABLE_IMAGE = 1;\nPROJECT_SECURE_OR_FLAT = (!DEFINED(PROJECT_NONSECURE) || DEFINED(PROJECT_SECURE)) && OPTION_SETTING_LENGTH && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_NS = DEFINED(PROJECT_NONSECURE) && !DEFINED(FSP_BOOTABLE_IMAGE);\n\n__bl_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_APPLICATION_IMAGE_NUMBER == 1 ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         (DEFINED(BOOTLOADER_SECONDARY_USE_QSPI) || DEFINED(BOOTLOADER_SECONDARY_USE_OSPI_B)) ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                          FLASH_APPLICATION_S_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_END    = __bl_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_END = __bl_XIP_SECONDARY_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_FLASH_NS_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_START - FLASH_BOOTLOADER_HEADER_LENGTH + FLASH_APPLICATION_S_LENGTH;\n__bl_FLASH_NSC_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_END - FLASH_APPLICATION_NSC_LENGTH;\n__bl_RAM_NS_START    = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH;\n__bl_RAM_NSC_START   = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       __bl_RAM_NS_START - RAM_APPLICATION_NSC_LENGTH;\n__bl_FLASH_NS_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                            FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                            __bl_FLASH_NS_START + FLASH_BOOTLOADER_HEADER_LENGTH_2;\n__bln_FLASH_IMAGE_START = __bl_FLASH_NS_IMAGE_START | (!DEFINED (NS_OFFSET_START) ? 0 : NS_OFFSET_START);\n__bln_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                           FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                           FLASH_APPLICATION_NS_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH_2;\n\nXIP_SECONDARY_SLOT_IMAGE = DEFINED(XIP_SECONDARY_SLOT_IMAGE) ? XIP_SECONDARY_SLOT_IMAGE : 0;\nFLASH_ORIGIN = !DEFINED(FLASH_IMAGE_START) ? FLASH_START :\n                XIP_SECONDARY_SLOT_IMAGE == 1 ? XIP_SECONDARY_FLASH_IMAGE_START :\n                FLASH_IMAGE_START;\nLIMITED_FLASH_LENGTH = DEFINED(FLASH_IMAGE_LENGTH) ? FLASH_IMAGE_LENGTH :\n                       DEFINED(FLASH_BOOTLOADER_LENGTH) ? FLASH_BOOTLOADER_LENGTH :\n                       FLASH_LENGTH;\nOPTION_SETTING_SAS_SIZE = 0x34;\nOPTION_SETTING_SAS_LENGTH = !DEFINED(OPTION_SETTING_LENGTH) ? 0 :\n                            OPTION_SETTING_LENGTH == 0 ? 0 :\n                            OPTION_SETTING_LENGTH - OPTION_SETTING_SAS_SIZE;\n\n/* Define memory regions. */\nMEMORY\n{\n  ITCM (rx)                       : ORIGIN = ITCM_START, LENGTH = ITCM_LENGTH\n  DTCM (rwx)                      : ORIGIN = DTCM_START, LENGTH = DTCM_LENGTH\n  FLASH (rx)                      : ORIGIN = FLASH_ORIGIN, LENGTH = LIMITED_FLASH_LENGTH\n  RAM (rwx)                       : ORIGIN = RAM_START, LENGTH = RAM_LENGTH\n  DATA_FLASH (rx)                 : ORIGIN = DATA_FLASH_START, LENGTH = DATA_FLASH_LENGTH\n  QSPI_FLASH (rx)                 : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_PRV_LENGTH\n  OSPI_DEVICE_0 (rx)              : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1 (rx)              : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  OSPI_DEVICE_0_RAM (rwx)         : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1_RAM (rwx)         : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  SDRAM (rwx)                     : ORIGIN = SDRAM_START, LENGTH = SDRAM_LENGTH\n  OPTION_SETTING (r)              : ORIGIN = OPTION_SETTING_START, LENGTH = OPTION_SETTING_LENGTH\n  OPTION_SETTING_OFS (r)          : ORIGIN = OPTION_SETTING_START, LENGTH = 0x18\n  OPTION_SETTING_SAS (r)          : ORIGIN = OPTION_SETTING_START + OPTION_SETTING_SAS_SIZE, LENGTH = OPTION_SETTING_SAS_LENGTH\n  OPTION_SETTING_S (r)            : ORIGIN = OPTION_SETTING_S_START, LENGTH = OPTION_SETTING_S_LENGTH\n  ID_CODE (rx)                    : ORIGIN = ID_CODE_START, LENGTH = ID_CODE_LENGTH\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be DEFINED in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n *   __qspi_flash_start__\n *   __qspi_flash_end__\n *   __qspi_flash_code_size__\n *   __qspi_region_max_size__\n *   __qspi_region_start_address__\n *   __qspi_region_end_address__\n *   __ospi_device_0_start__\n *   __ospi_device_0_end__\n *   __ospi_device_0_code_size__\n *   __ospi_device_0_region_max_size__\n *   __ospi_device_0_region_start_address__\n *   __ospi_device_0_region_end_address__\n *   __ospi_device_1_start__\n *   __ospi_device_1_end__\n *   __ospi_device_1_code_size__\n *   __ospi_device_1_region_max_size__\n *   __ospi_device_1_region_start_address__\n *   __ospi_device_1_region_end_address__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .text :\n    {\n        __tz_FLASH_S = ABSOLUTE(FLASH_START);\n        __ROM_Start = .;\n\n        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much\n         * space because ROM registers are at address 0x400 and there is very little space\n         * in between. */\n        KEEP(*(.fixed_vectors*))\n        KEEP(*(.application_vectors*))\n        __Vectors_End = .;\n\n        /* Some devices have a gap of code flash between the vector table and ROM Registers.\n         * The flash gap section allows applications to place code and data in this section. */\n        *(.flash_gap*)\n\n        /* ROM Registers start at address 0x00000400 for devices that do not have the OPTION_SETTING region. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x400;\n        KEEP(*(.rom_registers*))\n\n        /* Reserving 0x100 bytes of space for ROM registers. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x500;\n\n        /* Allocate flash write-boundary-aligned\n         * space for sce9 wrapped public keys for mcuboot if the module is used.\n         */\n        KEEP(*(.mcuboot_sce9_key*))\n\n        *(.text*)\n\n        KEEP(*(.version))\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n        __usb_dev_descriptor_start_fs = .;\n        KEEP(*(.usb_device_desc_fs*))\n        __usb_cfg_descriptor_start_fs = .;\n        KEEP(*(.usb_config_desc_fs*))\n        __usb_interface_descriptor_start_fs = .;\n        KEEP(*(.usb_interface_desc_fs*))\n        __usb_descriptor_end_fs = .;\n        __usb_dev_descriptor_start_hs = .;\n        KEEP(*(.usb_device_desc_hs*))\n        __usb_cfg_descriptor_start_hs = .;\n        KEEP(*(.usb_config_desc_hs*))\n        __usb_interface_descriptor_start_hs = .;\n        KEEP(*(.usb_interface_desc_hs*))\n        __usb_descriptor_end_hs = .;\n\n        KEEP(*(.eh_frame*))\n\n        __ROM_End = .;\n    } > FLASH = 0xFF\n\n    __Vectors_Size = __Vectors_End - __Vectors;\n\n    . = .;\n    __itcm_data_pre_location = .;\n\n    /* Initialized ITCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .itcm_data : ALIGN(16)\n    {\n        /* Start of ITCM Secure Trustzone region. */\n        __tz_ITCM_S = ABSOLUTE(ITCM_START);\n\n        /* All ITCM data start */\n        __itcm_data_start = .;\n\n        KEEP(*(.itcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* All ITCM data end */\n        __itcm_data_end = .;\n\n        /*\n         * Start of the ITCM Non-Secure Trustzone region.\n         * ITCM_NS_START can be used to set a fixed address for non-secure ITCM in secure projects or flat projects.\n         */\n        __tz_ITCM_N = DEFINED(ITCM_NS_START) ? ABSOLUTE(ITCM_NS_START) : ALIGN(__itcm_data_end, 8192);\n    } > ITCM AT > FLASH = 0x00\n\n    /* Addresses exported for ITCM initialization. */\n    __itcm_data_init_start = LOADADDR(.itcm_data);\n    __itcm_data_init_end = LOADADDR(.itcm_data) + SIZEOF(.itcm_data);\n\n    ASSERT(ORIGIN(ITCM) % 8 == 0, \"ITCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(ITCM) % 8 == 0, \"ITCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.itcm_data) % 16 == 0, \".itcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.itcm_data) % 8 == 0, \".itcm_data section size must be a multiple of 8 bytes.\")\n\n    /* Restore location counter. */\n    /* If ITCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If ITCM is present, this will be the absolute address that follows the ITCM ROM location. */\n    . = (SIZEOF(.itcm_data) > 0) ? __itcm_data_init_end : __itcm_data_pre_location;\n\n    __exidx_start = .;\n    /DISCARD/ :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    }\n    __exidx_end = .;\n\n    /* To copy multiple ROM to RAM sections,\n     * uncomment .copy.table section and,\n     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .copy.table :\n    {\n        . = ALIGN(4);\n        __copy_table_start__ = .;\n        LONG (__etext)\n        LONG (__data_start__)\n        LONG (__data_end__ - __data_start__)\n        LONG (__etext2)\n        LONG (__data2_start__)\n        LONG (__data2_end__ - __data2_start__)\n        __copy_table_end__ = .;\n    } > FLASH\n    */\n\n    /* To clear multiple BSS sections,\n     * uncomment .zero.table section and,\n     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .zero.table :\n    {\n        . = ALIGN(4);\n        __zero_table_start__ = .;\n        LONG (__bss_start__)\n        LONG (__bss_end__ - __bss_start__)\n        LONG (__bss2_start__)\n        LONG (__bss2_end__ - __bss2_start__)\n        __zero_table_end__ = .;\n    } > FLASH\n    */\n\n    __etext = .;\n\n    __tz_RAM_S = ORIGIN(RAM);\n\n    /* If DTC is used, put the DTC vector table at the start of SRAM.\n       This avoids memory holes due to 1K alignment required by it. */\n    .fsp_dtc_vector_table (NOLOAD) :\n    {\n        . = ORIGIN(RAM);\n        *(.fsp_dtc_vector_table)\n    } > RAM\n\n    /* Initialized data section. */\n    .data :\n    {\n        __data_start__ = .;\n        . = ALIGN(4);\n\n        __Code_In_RAM_Start = .;\n\n        KEEP(*(.code_in_ram*))\n        __Code_In_RAM_End = .;\n\n        *(vtable)\n        /* Don't use *(.data*) because it will place data meant for .data_flash in this section. */\n        *(.data.*)\n        *(.data)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        KEEP(*(.jcr*))\n\n        . = ALIGN(4);\n\n        /* All data end */\n        __data_end__ = .;\n\n    } > RAM AT > FLASH\n\n    . = .;\n    __dtcm_data_pre_location = LOADADDR(.data) + SIZEOF(.data);\n\n    /* Initialized DTCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .dtcm_data : ALIGN(16)\n    {\n        /* Start of DTCM Secure Trustzone region. */\n        __tz_DTCM_S = ABSOLUTE(DTCM_START);\n\n        /* Initialized DTCM data start */\n        __dtcm_data_start = .;\n\n        KEEP(*(.dtcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* Initialized DTCM data end */\n        __dtcm_data_end = .;\n    } > DTCM AT > FLASH = 0x00\n\n    . = __dtcm_data_end;\n    /* Uninitialized DTCM data. */\n    /* ALIGN appears on the left side of the colon because it is being used to assign the VMA directly, as opposed to a right side appearance which would control the LMA. */\n    .dtcm_bss ALIGN(8) (NOLOAD) :\n    {\n        /* Uninitialized DTCM data start */\n        __dtcm_bss_start = .;\n\n        KEEP(*(.dtcm_bss*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. No fill because of NOLOAD. */\n        . = ALIGN(8);\n\n        /* Uninitialized DTCM data end */\n        __dtcm_bss_end = .;\n\n        /*\n         * Start of the DTCM Non-Secure Trustzone region.\n         * DTCM_NS_START can be used to set a fixed address for non-secure DTCM in secure projects or flat projects.\n         */\n        __tz_DTCM_N = DEFINED(DTCM_NS_START) ? ABSOLUTE(DTCM_NS_START) : ALIGN(__dtcm_bss_end, 8192);\n    } > DTCM\n\n    /* Addresses exported for DTCM initialization. */\n    __dtcm_data_init_start = LOADADDR(.dtcm_data);\n    __dtcm_data_init_end = LOADADDR(.dtcm_data) + SIZEOF(.dtcm_data);\n\n    ASSERT(ORIGIN(DTCM) % 8 == 0, \"DTCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(DTCM) % 8 == 0, \"DTCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) == ADDR(.dtcm_bss), \".dtcm_bss has (VMA != LMA) but should be NOLOAD (VMA == LMA).\")\n    ASSERT(LOADADDR(.dtcm_data) % 16 == 0, \".dtcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.dtcm_data) % 8 == 0, \".dtcm_data section size must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) % 8 == 0, \".dtcm_bss section must be aligned to 8 bytes.\")\n    ASSERT(SIZEOF(.dtcm_bss) % 8 == 0, \".dtcm_bss section size must be a multiple of 8 bytes.\")\n    ASSERT(__dtcm_bss_start == __dtcm_data_end, \".dtcm_bss section is not adjacent to .dtcm_data section.\")\n\n    /* Restore location counter. */\n    /* If DTCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If DTCM is present, this will be the absolute address that follows the DTCM ROM location. */\n    . = (SIZEOF(.dtcm_data) > 0) ? __dtcm_data_init_end : __dtcm_data_pre_location;\n\n    /* TrustZone Secure Gateway Stubs Section */\n\n    /* Store location counter for SPI non-retentive sections. */\n    sgstubs_pre_location = .;\n\n    /* Determine the secure gateway stubs address either by the provided linker variable or the next 1024-byte block. */\n    SGSTUBS_LOC = (DEFINED(PROJECT_SECURE) && DEFINED(FLASH_NSC_START)) ? ABSOLUTE(FLASH_NSC_START) : ALIGN(1024);\n    .gnu.sgstubs SGSTUBS_LOC : ALIGN(1024)\n    {\n        __tz_FLASH_C = DEFINED(FLASH_NSC_START) ? ABSOLUTE(FLASH_NSC_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : ALIGN(1024);\n        _start_sg = .;\n        *(.gnu.sgstubs*)\n        . = ALIGN(32);\n        _end_sg = .;\n    } > FLASH\n\n    __tz_FLASH_N = DEFINED(FLASH_NS_START) ? ABSOLUTE(FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : FLASH_LENGTH < 32768 ? FLASH_LENGTH : ALIGN(32768);\n    FLASH_NS_IMAGE_START = DEFINED(FLASH_NS_IMAGE_START) ? FLASH_NS_IMAGE_START : __tz_FLASH_N;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_S = ORIGIN(QSPI_FLASH);\n\n    /* QSPI_FLASH section to be downloaded via debugger */\n    .qspi_flash :\n    {\n        __qspi_flash_start__ = .;\n        KEEP(*(.qspi_flash*))\n        KEEP(*(.code_in_qspi*))\n        __qspi_flash_end__ = .;\n    } > QSPI_FLASH\n    __qspi_flash_code_size__ = __qspi_flash_end__ - __qspi_flash_start__;\n\n    /* QSPI_FLASH non-retentive section, creates a copy in internal flash that can be copied to QSPI */\n    __qspi_flash_code_addr__ = sgstubs_pre_location;\n    .qspi_non_retentive : AT(__qspi_flash_code_addr__)\n    {\n        __qspi_non_retentive_start__ = .;\n        KEEP(*(.qspi_non_retentive*))\n        __qspi_non_retentive_end__ = .;\n    } > QSPI_FLASH\n    __qspi_non_retentive_size__ = __qspi_non_retentive_end__ - __qspi_non_retentive_start__;\n\n    __qspi_region_max_size__ = 0x4000000;   /* Must be the same as defined in MEMORY above */\n    __qspi_region_start_address__ = __qspi_flash_start__;\n    __qspi_region_end_address__ = __qspi_flash_start__ + __qspi_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_N = __qspi_non_retentive_end__;\n\n    /* Support for OctaRAM */\n    .OSPI_DEVICE_0_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_0_start__ = .;\n        *(.ospi_device_0_no_load*)\n        . = ALIGN(4);\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0_RAM\n\n    .OSPI_DEVICE_1_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_1_start__ = .;\n        *(.ospi_device_1_no_load*)\n        . = ALIGN(4);\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1_RAM\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_S = ORIGIN(OSPI_DEVICE_0);\n\n    /* OSPI_DEVICE_0 section to be downloaded via debugger */\n    .OSPI_DEVICE_0 :\n    {\n        __ospi_device_0_start__ = .;\n        KEEP(*(.ospi_device_0*))\n        KEEP(*(.code_in_ospi_device_0*))\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_code_size__ = __ospi_device_0_end__ - __ospi_device_0_start__;\n\n    /* OSPI_DEVICE_0 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n     __ospi_device_0_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive));\n    .ospi_device_0_non_retentive : AT(__ospi_device_0_code_addr__)\n    {\n        __ospi_device_0_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_0_non_retentive*))\n        __ospi_device_0_non_retentive_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_non_retentive_size__ = __ospi_device_0_non_retentive_end__ - __ospi_device_0_non_retentive_start__;\n\n    __ospi_device_0_region_max_size__ = 0x8000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_0_region_start_address__ = __ospi_device_0_start__;\n    __ospi_device_0_region_end_address__ = __ospi_device_0_start__ + __ospi_device_0_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_N = __ospi_device_0_non_retentive_end__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_S = ORIGIN(OSPI_DEVICE_1);\n\n    /* OSPI_DEVICE_1 section to be downloaded via debugger */\n    .OSPI_DEVICE_1 :\n    {\n        __ospi_device_1_start__ = .;\n        KEEP(*(.ospi_device_1*))\n        KEEP(*(.code_in_ospi_device_1*))\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_code_size__ = __ospi_device_1_end__ - __ospi_device_1_start__;\n\n    /* OSPI_DEVICE_1 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n    __ospi_device_1_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive) + SIZEOF(.ospi_device_0_non_retentive));\n    .ospi_device_1_non_retentive : AT(__ospi_device_1_code_addr__)\n    {\n        __ospi_device_1_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_1_non_retentive*))\n        __ospi_device_1_non_retentive_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_non_retentive_size__ = __ospi_device_1_non_retentive_end__ - __ospi_device_1_non_retentive_start__;\n\n    __ospi_device_1_region_max_size__ = 0x10000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_1_region_start_address__ = __ospi_device_1_start__;\n    __ospi_device_1_region_end_address__ = __ospi_device_1_start__ + __ospi_device_1_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_N = __ospi_device_1_non_retentive_end__;\n\n    .noinit (NOLOAD):\n    {\n        . = ALIGN(4);\n        __noinit_start = .;\n        KEEP(*(.noinit*))\n        . = ALIGN(8);\n        /* Place the FreeRTOS heap here so that the __HeapLimit calculation does not include the freertos heap. */\n        KEEP(*(.heap.*))\n        __noinit_end = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n        __HeapBase = .;\n        /* Place the STD heap here. */\n        KEEP(*(.heap))\n        __HeapLimit = .;\n    } > RAM\n\n    /* Stacks are stored in this section. */\n    .stack_dummy (NOLOAD):\n    {\n        . = ALIGN(8);\n        __StackLimit = .;\n        /* Main stack */\n        KEEP(*(.stack))\n        __StackTop = .;\n        /* Thread stacks */\n        KEEP(*(.stack*))\n        __StackTopAll = .;\n    } > RAM\n\n    PROVIDE(__stack = __StackTopAll);\n\n    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used\n       at run time for things such as ThreadX memory pool allocations. */\n    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);\n\n    /* RAM_NSC_START can be used to set a fixed address for non-secure callable RAM in secure projects.\n     * If it is not specified, the address for NSC RAM is the end of RAM aligned to a 1K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_C = DEFINED(RAM_NSC_START) ? ABSOLUTE(RAM_NSC_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_segment_used_end__, 1024);\n\n    /* RAM_NS_START can be used to set a fixed address for non-secure RAM in secure projects or flat projects.\n     * RAM_NS_BUFFER_BLOCK_LENGTH is used to allocate non-secure buffers in a flat project. If it is not\n     * specified, the address for NSC RAM is the end of RAM aligned to an 8K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_N = DEFINED(RAM_NS_START) ? ABSOLUTE(RAM_NS_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__tz_RAM_C, 8192);\n\n    /* Non-secure buffers must be in non-secure RAM. This is primarily used for the EDMAC in flat projects.\n     * The EDMAC is a non-secure bus master and can only access non-secure RAM. */\n    .ns_buffer (NOLOAD):\n    {\n        /* Allocate RAM on a 32-byte boundary to help with placement of Ethernet buffers. */\n        . = __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_START & 0xFFFFFFE0) : .;\n\n        KEEP(*(.ns_buffer*))\n    } > RAM\n\n    /* Data flash. */\n    .data_flash :\n    {\n        . = ORIGIN(DATA_FLASH);\n        __tz_DATA_FLASH_S = .;\n        __Data_Flash_Start = .;\n        KEEP(*(.data_flash*))\n        __Data_Flash_End = .;\n\n        __tz_DATA_FLASH_N = DEFINED(DATA_FLASH_NS_START) ? ABSOLUTE(DATA_FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(DATA_FLASH_START + DATA_FLASH_LENGTH) : ALIGN(1024);\n    } > DATA_FLASH\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_S = ORIGIN(SDRAM);\n\n    /* SDRAM */\n    .sdram (NOLOAD):\n    {\n        __SDRAM_Start = .;\n        KEEP(*(.sdram*))\n        KEEP(*(.frame*))\n        __SDRAM_End = .;\n    } > SDRAM\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_N = __SDRAM_End;\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool. */\n    __tz_ID_CODE_S = ORIGIN(ID_CODE);\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool.\n     *       Set this symbol to the same value as __tz_ID_CODE_S so the RA configuration tool does not split the ID_CODE\n     *       memory region between TrustZone projects. */\n    __tz_ID_CODE_N = __tz_ID_CODE_S;\n\n    .id_code :\n    {\n        __ID_Code_Start = .;\n        KEEP(*(.id_code*))\n        __ID_Code_End = .;\n    } > ID_CODE\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S = ORIGIN(OPTION_SETTING_OFS);\n\n    .option_setting_ofs :\n    {\n        __OPTION_SETTING_OFS_Start = .;\n        KEEP(*(.option_setting_ofs0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x04 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_ofs2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x10 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_dualsel))\n        __OPTION_SETTING_OFS_End = .;\n    } > OPTION_SETTING_OFS = 0xFF\n\n    .option_setting_sas :\n    {\n        __OPTION_SETTING_SAS_Start = .;\n        KEEP(*(.option_setting_sas))\n        __OPTION_SETTING_SAS_End = .;\n    } > OPTION_SETTING_SAS = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_N = ABSOLUTE(OPTION_SETTING_START_NS);\n\n    .option_setting_ns :\n    {\n        __OPTION_SETTING_NS_Start = .;\n        KEEP(*(.option_setting_ofs1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x04 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_ofs3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x10 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_banksel))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x40 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x44 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x48 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x4C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x60 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x64 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x68 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x6C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps3))\n        __OPTION_SETTING_NS_End = .;\n    } > OPTION_SETTING = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_S = ORIGIN(OPTION_SETTING_S);\n\n    .option_setting_s :\n    {\n        __OPTION_SETTING_S_Start = .;\n        KEEP(*(.option_setting_ofs1_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x04 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x10 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x40 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x44 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x48 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x4C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x60 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x64 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x68 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x6C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x80 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs1_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x84 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x90 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC0 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC4 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC8 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xCC : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel3))\n        __OPTION_SETTING_S_End = .;\n    } > OPTION_SETTING_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_N = __OPTION_SETTING_S_End;\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/script/memory_regions.ld",
    "content": "\n            /* generated memory regions file - do not edit */\n                            RAM_START  = 0x20000000;\n                RAM_LENGTH = 0x20000;\n                FLASH_START  = 0x00000000;\n                FLASH_LENGTH = 0x100000;\n                DATA_FLASH_START  = 0x08000000;\n                DATA_FLASH_LENGTH = 0x2000;\n                OPTION_SETTING_START  = 0x0100A100;\n                OPTION_SETTING_LENGTH = 0x100;\n                OPTION_SETTING_S_START  = 0x0100A200;\n                OPTION_SETTING_S_LENGTH = 0x100;\n                ID_CODE_START  = 0x00000000;\n                ID_CODE_LENGTH = 0x0;\n                SDRAM_START  = 0x80010000;\n                SDRAM_LENGTH = 0x0;\n                QSPI_FLASH_START  = 0x60000000;\n                QSPI_FLASH_LENGTH = 0x4000000;\n                OSPI_DEVICE_0_START  = 0x80020000;\n                OSPI_DEVICE_0_LENGTH = 0x0;\n                OSPI_DEVICE_1_START  = 0x80030000;\n                OSPI_DEVICE_1_LENGTH = 0x0;\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra4m3_ek/smart_configurator/configuration.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<raConfiguration version=\"9\">\n  <generalSettings>\n    <option key=\"#Board#\" value=\"board.ra4m3ek\"/>\n    <option key=\"CPU\" value=\"RA4M3\"/>\n    <option key=\"Core\" value=\"CM33\"/>\n    <option key=\"#TargetName#\" value=\"R7FA4M3AF3CFB\"/>\n    <option key=\"#TargetARCHITECTURE#\" value=\"cortex-m33\"/>\n    <option key=\"#DeviceCommand#\" value=\"R7FA4M3AF\"/>\n    <option key=\"#RTOS#\" value=\"_none\"/>\n    <option key=\"#pinconfiguration#\" value=\"R7FA4M3AF3CFB.pincfg\"/>\n    <option key=\"#FSPVersion#\" value=\"5.6.0\"/>\n    <option key=\"#ConfigurationFragments#\" value=\"Renesas##BSP##Board##ra4m3_ek##\"/>\n    <option key=\"#SELECTED_TOOLCHAIN#\" value=\"com.renesas.cdt.managedbuild.gnuarm.toolchain.\"/>\n  </generalSettings>\n  <raBspConfiguration>\n    <config id=\"config.bsp.ra4m3.R7FA4M3AF3CFB\">\n      <property id=\"config.bsp.part_number\" value=\"config.bsp.part_number.value\"/>\n      <property id=\"config.bsp.rom_size_bytes\" value=\"config.bsp.rom_size_bytes.value\"/>\n      <property id=\"config.bsp.rom_size_bytes_hidden\" value=\"1048576\"/>\n      <property id=\"config.bsp.ram_size_bytes\" value=\"config.bsp.ram_size_bytes.value\"/>\n      <property id=\"config.bsp.data_flash_size_bytes\" value=\"config.bsp.data_flash_size_bytes.value\"/>\n      <property id=\"config.bsp.package_style\" value=\"config.bsp.package_style.value\"/>\n      <property id=\"config.bsp.package_pins\" value=\"config.bsp.package_pins.value\"/>\n      <property id=\"config.bsp.irq_count_hidden\" value=\"96\"/>\n    </config>\n    <config id=\"config.bsp.ra4m3\">\n      <property id=\"config.bsp.series\" value=\"config.bsp.series.value\"/>\n    </config>\n    <config id=\"config.bsp.ra4m3.fsp\">\n      <property id=\"config.bsp.fsp.inline_irq_functions\" value=\"config.bsp.common.inline_irq_functions.enabled\"/>\n      <property id=\"config.bsp.fsp.tz.exception_response\" value=\"config.bsp.fsp.tz.exception_response.nmi\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.bfhfnmins\" value=\"config.bsp.fsp.tz.cmsis.bfhfnmins.secure\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.sysresetreqs\" value=\"config.bsp.fsp.tz.cmsis.sysresetreqs.secure_only\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.s_priority_boost\" value=\"config.bsp.fsp.tz.cmsis.s_priority_boost.disabled\"/>\n      <property id=\"config.bsp.fsp.tz.csar\" value=\"config.bsp.fsp.tz.csar.both\"/>\n      <property id=\"config.bsp.fsp.tz.rstsar\" value=\"config.bsp.fsp.tz.rstsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.bbfsar\" value=\"config.bsp.fsp.tz.bbfsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.sramprcr\" value=\"config.bsp.fsp.tz.sramsar.sramprcr.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.sramecc\" value=\"config.bsp.fsp.tz.sramsar.sramecc.both\"/>\n      <property id=\"config.bsp.fsp.tz.stbramsar\" value=\"config.bsp.fsp.tz.stbramsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussara\" value=\"config.bsp.fsp.tz.bussara.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussarb\" value=\"config.bsp.fsp.tz.bussarb.both\"/>\n      <property id=\"config.bsp.fsp.tz.uninitialized_ns_application_fallback\" value=\"config.bsp.fsp.tz.uninitialized_ns_application_fallback.enabled\"/>\n      <property id=\"config.bsp.fsp.cache_line_size\" value=\"config.bsp.fsp.cache_line_size.32\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_start_mode\" value=\"config.bsp.fsp.OFS0.iwdt_start_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_timeout\" value=\"config.bsp.fsp.OFS0.iwdt_timeout.2048\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_divisor\" value=\"config.bsp.fsp.OFS0.iwdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_end\" value=\"config.bsp.fsp.OFS0.iwdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_start\" value=\"config.bsp.fsp.OFS0.iwdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_stop_control\" value=\"config.bsp.fsp.OFS0.iwdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_start_mode\" value=\"config.bsp.fsp.OFS0.wdt_start_mode.register\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_timeout\" value=\"config.bsp.fsp.OFS0.wdt_timeout.16384\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_divisor\" value=\"config.bsp.fsp.OFS0.wdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_end\" value=\"config.bsp.fsp.OFS0.wdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_start\" value=\"config.bsp.fsp.OFS0.wdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.wdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_stop_control\" value=\"config.bsp.fsp.OFS0.wdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0_level.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.start.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1.voltage_detection0.start.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1.voltage_detection0_level.280\"/>\n      <property id=\"config.bsp.fsp.OFS1.hoco_osc\" value=\"config.bsp.fsp.OFS1.hoco_osc.disabled\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS0\" value=\"\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS1\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS0\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS1\" value=\"\"/>\n      <property id=\"config.bsp.fsp.hoco_fll\" value=\"config.bsp.fsp.hoco_fll.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_wait\" value=\"config.bsp.common.main_osc_wait.wait_8163\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.max_freq_hz\" value=\"50000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.max_baud\" value=\"16666666\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sensors_are_exclusive\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_spi.max_bitrate\" value=\"25000000\"/>\n      <property id=\"config.bsp.fsp.mcu.spi.max_bitrate\" value=\"50000000\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.fastplus_channels\" value=\"0x1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.fastplus_channels\" value=\"0x1\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.cstpen_channels\" value=\"0x0219\"/>\n      <property id=\"config.bsp.fsp.mcu.gpt.pin_count_source_channels\" value=\"0xFFFF\"/>\n      <property id=\"config.bsp.fsp.mcu.adc_dmac.samples_per_channel\" value=\"32767\"/>\n    </config>\n    <config id=\"config.bsp.ra\">\n      <property id=\"config.bsp.common.main\" value=\"0x800\"/>\n      <property id=\"config.bsp.common.heap\" value=\"0x800\"/>\n      <property id=\"config.bsp.common.vcc\" value=\"3300\"/>\n      <property id=\"config.bsp.common.checking\" value=\"config.bsp.common.checking.disabled\"/>\n      <property id=\"config.bsp.common.assert\" value=\"config.bsp.common.assert.none\"/>\n      <property id=\"config.bsp.common.error_log\" value=\"config.bsp.common.error_log.none\"/>\n      <property id=\"config.bsp.common.soft_reset\" value=\"config.bsp.common.soft_reset.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_populated\" value=\"config.bsp.common.main_osc_populated.enabled\"/>\n      <property id=\"config.bsp.common.pfs_protect\" value=\"config.bsp.common.pfs_protect.enabled\"/>\n      <property id=\"config.bsp.common.c_runtime_init\" value=\"config.bsp.common.c_runtime_init.enabled\"/>\n      <property id=\"config.bsp.common.early_init\" value=\"config.bsp.common.early_init.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_clock_source\" value=\"config.bsp.common.main_osc_clock_source.crystal\"/>\n      <property id=\"config.bsp.common.subclock_populated\" value=\"config.bsp.common.subclock_populated.enabled\"/>\n      <property id=\"config.bsp.common.subclock_drive\" value=\"config.bsp.common.subclock_drive.standard\"/>\n      <property id=\"config.bsp.common.subclock_stabilization_ms\" value=\"1000\"/>\n    </config>\n  </raBspConfiguration>\n  <raClockConfiguration>\n    <node id=\"board.clock.xtal.freq\" mul=\"24000000\" option=\"_edit\"/>\n    <node id=\"board.clock.hoco.freq\" option=\"board.clock.hoco.freq.20m\"/>\n    <node id=\"board.clock.loco.freq\" option=\"board.clock.loco.freq.32768\"/>\n    <node id=\"board.clock.moco.freq\" option=\"board.clock.moco.freq.8m\"/>\n    <node id=\"board.clock.subclk.freq\" option=\"board.clock.subclk.freq.32768\"/>\n    <node id=\"board.clock.pll.source\" option=\"board.clock.pll.source.xtal\"/>\n    <node id=\"board.clock.pll.div\" option=\"board.clock.pll.div.3\"/>\n    <node id=\"board.clock.pll.mul\" option=\"board.clock.pll.mul.250\"/>\n    <node id=\"board.clock.pll.display\" option=\"board.clock.pll.display.value\"/>\n    <node id=\"board.clock.pll2.source\" option=\"board.clock.pll2.source.xtal\"/>\n    <node id=\"board.clock.pll2.div\" option=\"board.clock.pll2.div.2\"/>\n    <node id=\"board.clock.pll2.mul\" option=\"board.clock.pll2.mul.200\"/>\n    <node id=\"board.clock.pll2.display\" option=\"board.clock.pll2.display.value\"/>\n    <node id=\"board.clock.clock.source\" option=\"board.clock.clock.source.pll\"/>\n    <node id=\"board.clock.clkout.source\" option=\"board.clock.clkout.source.disabled\"/>\n    <node id=\"board.clock.uclk.source\" option=\"board.clock.uclk.source.pll2\"/>\n    <node id=\"board.clock.iclk.div\" option=\"board.clock.iclk.div.2\"/>\n    <node id=\"board.clock.pclka.div\" option=\"board.clock.pclka.div.2\"/>\n    <node id=\"board.clock.pclkb.div\" option=\"board.clock.pclkb.div.4\"/>\n    <node id=\"board.clock.pclkc.div\" option=\"board.clock.pclkc.div.4\"/>\n    <node id=\"board.clock.pclkd.div\" option=\"board.clock.pclkd.div.2\"/>\n    <node id=\"board.clock.fclk.div\" option=\"board.clock.fclk.div.4\"/>\n    <node id=\"board.clock.clkout.div\" option=\"board.clock.clkout.div.1\"/>\n    <node id=\"board.clock.uclk.div\" option=\"board.clock.uclk.div.5\"/>\n    <node id=\"board.clock.iclk.display\" option=\"board.clock.iclk.display.value\"/>\n    <node id=\"board.clock.pclka.display\" option=\"board.clock.pclka.display.value\"/>\n    <node id=\"board.clock.pclkb.display\" option=\"board.clock.pclkb.display.value\"/>\n    <node id=\"board.clock.pclkc.display\" option=\"board.clock.pclkc.display.value\"/>\n    <node id=\"board.clock.pclkd.display\" option=\"board.clock.pclkd.display.value\"/>\n    <node id=\"board.clock.fclk.display\" option=\"board.clock.fclk.display.value\"/>\n    <node id=\"board.clock.clkout.display\" option=\"board.clock.clkout.display.value\"/>\n    <node id=\"board.clock.uclk.display\" option=\"board.clock.uclk.display.value\"/>\n  </raClockConfiguration>\n  <raComponentSelection>\n    <component apiversion=\"\" class=\"Projects\" condition=\"\" group=\"all\" subgroup=\"baremetal_blinky\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Simple application that blinks an LED. No RTOS included.</description>\n      <originalPack>Renesas.RA_baremetal_blinky.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"Common\" condition=\"\" group=\"all\" subgroup=\"fsp_common\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board Support Package Common Files</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_ioport\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>I/O Port</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"CMSIS\" condition=\"\" group=\"CMSIS5\" subgroup=\"CoreM\" variant=\"\" vendor=\"Arm\" version=\"6.1.0+fsp.5.6.0\">\n      <description>Arm CMSIS Version 6 - Core (M)</description>\n      <originalPack>Arm.CMSIS6.6.1.0+fsp.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m3\" subgroup=\"device\" variant=\"R7FA4M3AF3CFB\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for R7FA4M3AF3CFB</description>\n      <originalPack>Renesas.RA_mcu_ra4m3.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m3\" subgroup=\"device\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M3</description>\n      <originalPack>Renesas.RA_mcu_ra4m3.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m3\" subgroup=\"fsp\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M3 - FSP Data</description>\n      <originalPack>Renesas.RA_mcu_ra4m3.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m3\" subgroup=\"events\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M3 - Events</description>\n      <originalPack>Renesas.RA_mcu_ra4m3.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"Board\" subgroup=\"ra4m3_ek\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>RA4M3-EK Board Support Files</description>\n      <originalPack>Renesas.RA_board_ra4m3_ek.5.6.0.pack</originalPack>\n    </component>\n  </raComponentSelection>\n  <raElcConfiguration/>\n  <raIcuConfiguration/>\n  <raModuleConfiguration>\n    <module id=\"module.driver.ioport_on_ioport.0\">\n      <property id=\"module.driver.ioport.name\" value=\"g_ioport\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport1\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport2\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport3\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport4\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.pincfg\" value=\"g_bsp_pin_cfg\"/>\n    </module>\n    <context id=\"_hal.0\">\n      <stack module=\"module.driver.ioport_on_ioport.0\"/>\n    </context>\n    <config id=\"config.driver.ioport\">\n      <property id=\"config.driver.ioport.checking\" value=\"config.driver.ioport.checking.system\"/>\n    </config>\n  </raModuleConfiguration>\n  <raPinConfiguration>\n    <symbolicName propertyId=\"p000.symbolic_name\" value=\"ARDUINO_A0_MIKROBUS_AN\"/>\n    <symbolicName propertyId=\"p001.symbolic_name\" value=\"ARDUINO_A1\"/>\n    <symbolicName propertyId=\"p003.symbolic_name\" value=\"ARDUINO_A2\"/>\n    <symbolicName propertyId=\"p005.symbolic_name\" value=\"SW1\"/>\n    <symbolicName propertyId=\"p006.symbolic_name\" value=\"SW2\"/>\n    <symbolicName propertyId=\"p007.symbolic_name\" value=\"ARDUINO_A3\"/>\n    <symbolicName propertyId=\"p008.symbolic_name\" value=\"PMOD1_INT\"/>\n    <symbolicName propertyId=\"p014.symbolic_name\" value=\"ARDUINO_A4\"/>\n    <symbolicName propertyId=\"p015.symbolic_name\" value=\"ARDUINO_A5\"/>\n    <symbolicName propertyId=\"p100.symbolic_name\" value=\"ARDUINO_RX_MIKROBUS_RX\"/>\n    <symbolicName propertyId=\"p101.symbolic_name\" value=\"ARDUINO_TX_MIKROBUS_TX\"/>\n    <symbolicName propertyId=\"p105.symbolic_name\" value=\"ARDUINO_D2\"/>\n    <symbolicName propertyId=\"p111.symbolic_name\" value=\"ARDUINO_D3\"/>\n    <symbolicName propertyId=\"p115.symbolic_name\" value=\"MIKROBUS_RST\"/>\n    <symbolicName propertyId=\"p202.symbolic_name\" value=\"ARDUINO_MISO_MIKROBUS_MISO_PMOD1_MISO\"/>\n    <symbolicName propertyId=\"p203.symbolic_name\" value=\"ARDUINO_MOSI_MIKROBUS_MOSI_PMOD1_MOSI\"/>\n    <symbolicName propertyId=\"p204.symbolic_name\" value=\"ARDUINO_CLK_MIKROBUS_CLK_PMOD1_CLK\"/>\n    <symbolicName propertyId=\"p205.symbolic_name\" value=\"ARDUINO_SS_MIKCRBUS_SS\"/>\n    <symbolicName propertyId=\"p206.symbolic_name\" value=\"PMOD1_SS1\"/>\n    <symbolicName propertyId=\"p207.symbolic_name\" value=\"PMOD1_SS2\"/>\n    <symbolicName propertyId=\"p302.symbolic_name\" value=\"PMOD1_SS3\"/>\n    <symbolicName propertyId=\"p303.symbolic_name\" value=\"ARDUINO_D9\"/>\n    <symbolicName propertyId=\"p304.symbolic_name\" value=\"ARDUINO_D7\"/>\n    <symbolicName propertyId=\"p305.symbolic_name\" value=\"QSPI_CLK\"/>\n    <symbolicName propertyId=\"p306.symbolic_name\" value=\"QSPI_SSL\"/>\n    <symbolicName propertyId=\"p307.symbolic_name\" value=\"QSPI_IO0\"/>\n    <symbolicName propertyId=\"p308.symbolic_name\" value=\"QSPI_IO1\"/>\n    <symbolicName propertyId=\"p309.symbolic_name\" value=\"QSPI_IO2\"/>\n    <symbolicName propertyId=\"p310.symbolic_name\" value=\"QSPI_IO3\"/>\n    <symbolicName propertyId=\"p311.symbolic_name\" value=\"PMOD1_RST\"/>\n    <symbolicName propertyId=\"p400.symbolic_name\" value=\"LED3\"/>\n    <symbolicName propertyId=\"p404.symbolic_name\" value=\"LED2\"/>\n    <symbolicName propertyId=\"p407.symbolic_name\" value=\"USB_VBUS\"/>\n    <symbolicName propertyId=\"p408.symbolic_name\" value=\"ARDUINO_D6_MIKROBUS_PWM\"/>\n    <symbolicName propertyId=\"p409.symbolic_name\" value=\"MIKROBUS_INT\"/>\n    <symbolicName propertyId=\"p414.symbolic_name\" value=\"PMOD2_INT\"/>\n    <symbolicName propertyId=\"p415.symbolic_name\" value=\"LED1\"/>\n    <symbolicName propertyId=\"p500.symbolic_name\" value=\"USB_VBUS_EN\"/>\n    <symbolicName propertyId=\"p501.symbolic_name\" value=\"USB_VBUS_OC\"/>\n    <symbolicName propertyId=\"p505.symbolic_name\" value=\"GROVE2_AN1\"/>\n    <symbolicName propertyId=\"p506.symbolic_name\" value=\"GROVE2_AN2\"/>\n    <symbolicName propertyId=\"p511.symbolic_name\" value=\"GROVE1_SDA_QWIIC_SDA\"/>\n    <symbolicName propertyId=\"p512.symbolic_name\" value=\"GROVE1_SCL_QWIIC_SCL\"/>\n    <symbolicName propertyId=\"p601.symbolic_name\" value=\"ARDUINO_SCL_MIKROBUS_SCL\"/>\n    <symbolicName propertyId=\"p602.symbolic_name\" value=\"ARDUINO_SDA_MIKROBUS_SDA\"/>\n    <symbolicName propertyId=\"p611.symbolic_name\" value=\"ARDUINO_D8\"/>\n    <symbolicName propertyId=\"p612.symbolic_name\" value=\"ARDUINO_RST\"/>\n    <symbolicName propertyId=\"p708.symbolic_name\" value=\"PMOD2_RST\"/>\n    <symbolicName propertyId=\"p709.symbolic_name\" value=\"PMOD2_SS2\"/>\n    <symbolicName propertyId=\"p710.symbolic_name\" value=\"PMOD2_SS3\"/>\n    <symbolicName propertyId=\"p712.symbolic_name\" value=\"ARDUINO_D5\"/>\n    <symbolicName propertyId=\"p713.symbolic_name\" value=\"ARDUINO_D4\"/>\n    <pincfg active=\"true\" name=\"RA4M3 EK\" selected=\"true\" symbol=\"g_bsp_pin_cfg\">\n      <configSetting altId=\"adc0.an00.p000\" configurationId=\"adc0.an00\"/>\n      <configSetting altId=\"adc0.an01.p001\" configurationId=\"adc0.an01\"/>\n      <configSetting altId=\"adc0.an03.p003\" configurationId=\"adc0.an03\"/>\n      <configSetting altId=\"adc0.an07.p007\" configurationId=\"adc0.an07\"/>\n      <configSetting altId=\"adc0.an12.p014\" configurationId=\"adc0.an12\"/>\n      <configSetting altId=\"adc0.an13.p015\" configurationId=\"adc0.an13\"/>\n      <configSetting altId=\"adc0.mode.custom\" configurationId=\"adc0.mode\"/>\n      <configSetting altId=\"adc1.an21.p505\" configurationId=\"adc1.an21\"/>\n      <configSetting altId=\"adc1.an22.p506\" configurationId=\"adc1.an22\"/>\n      <configSetting altId=\"adc1.mode.custom\" configurationId=\"adc1.mode\"/>\n      <configSetting altId=\"cgc0.extal.p212\" configurationId=\"cgc0.extal\"/>\n      <configSetting altId=\"cgc0.mode.mainsub\" configurationId=\"cgc0.mode\"/>\n      <configSetting altId=\"cgc0.xtal.p213\" configurationId=\"cgc0.xtal\"/>\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"gpt6.gtiocb.p408\" configurationId=\"gpt6.gtiocb\"/>\n      <configSetting altId=\"gpt6.mode.gtiocaorgtiocb.free\" configurationId=\"gpt6.mode\"/>\n      <configSetting altId=\"iic1.mode.enabled.a\" configurationId=\"iic1.mode\"/>\n      <configSetting altId=\"iic1.scl.p512\" configurationId=\"iic1.scl\"/>\n      <configSetting altId=\"iic1.sda.p511\" configurationId=\"iic1.sda\"/>\n      <configSetting altId=\"p000.asel\" configurationId=\"p000\"/>\n      <configSetting altId=\"p000.gpio_mode.gpio_mode_an\" configurationId=\"p000.gpio_mode\"/>\n      <configSetting altId=\"p001.asel\" configurationId=\"p001\"/>\n      <configSetting altId=\"p001.gpio_mode.gpio_mode_an\" configurationId=\"p001.gpio_mode\"/>\n      <configSetting altId=\"p003.asel\" configurationId=\"p003\"/>\n      <configSetting altId=\"p003.gpio_mode.gpio_mode_an\" configurationId=\"p003.gpio_mode\"/>\n      <configSetting altId=\"p005.input\" configurationId=\"p005\"/>\n      <configSetting altId=\"p005.gpio_mode.gpio_mode_in\" configurationId=\"p005.gpio_mode\"/>\n      <configSetting altId=\"p006.input\" configurationId=\"p006\"/>\n      <configSetting altId=\"p006.gpio_irq.gpio_irq_enabled\" configurationId=\"p006.gpio_irq\"/>\n      <configSetting altId=\"p006.gpio_mode.gpio_mode_in\" configurationId=\"p006.gpio_mode\"/>\n      <configSetting altId=\"p007.asel\" configurationId=\"p007\"/>\n      <configSetting altId=\"p007.gpio_mode.gpio_mode_an\" configurationId=\"p007.gpio_mode\"/>\n      <configSetting altId=\"p008.input\" configurationId=\"p008\"/>\n      <configSetting altId=\"p008.gpio_irq.gpio_irq_enabled\" configurationId=\"p008.gpio_irq\"/>\n      <configSetting altId=\"p008.gpio_mode.gpio_mode_in\" configurationId=\"p008.gpio_mode\"/>\n      <configSetting altId=\"p008.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p008.gpio_pupd\"/>\n      <configSetting altId=\"p014.asel\" configurationId=\"p014\"/>\n      <configSetting altId=\"p014.gpio_mode.gpio_mode_an\" configurationId=\"p014.gpio_mode\"/>\n      <configSetting altId=\"p015.asel\" configurationId=\"p015\"/>\n      <configSetting altId=\"p015.gpio_mode.gpio_mode_an\" configurationId=\"p015.gpio_mode\"/>\n      <configSetting altId=\"p100.sci0.rxd\" configurationId=\"p100\"/>\n      <configSetting altId=\"p100.gpio_mode.gpio_mode_peripheral\" configurationId=\"p100.gpio_mode\"/>\n      <configSetting altId=\"p101.sci0.txd\" configurationId=\"p101\"/>\n      <configSetting altId=\"p101.gpio_mode.gpio_mode_peripheral\" configurationId=\"p101.gpio_mode\"/>\n      <configSetting altId=\"p105.output.low\" configurationId=\"p105\"/>\n      <configSetting altId=\"p105.gpio_mode.gpio_mode_out.low\" configurationId=\"p105.gpio_mode\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p111.output.low\" configurationId=\"p111\"/>\n      <configSetting altId=\"p111.gpio_mode.gpio_mode_out.low\" configurationId=\"p111.gpio_mode\"/>\n      <configSetting altId=\"p115.output.low\" configurationId=\"p115\"/>\n      <configSetting altId=\"p115.gpio_mode.gpio_mode_out.low\" configurationId=\"p115.gpio_mode\"/>\n      <configSetting altId=\"p202.spi0.miso\" configurationId=\"p202\"/>\n      <configSetting altId=\"p202.gpio_mode.gpio_mode_peripheral\" configurationId=\"p202.gpio_mode\"/>\n      <configSetting altId=\"p203.spi0.mosi\" configurationId=\"p203\"/>\n      <configSetting altId=\"p203.gpio_mode.gpio_mode_peripheral\" configurationId=\"p203.gpio_mode\"/>\n      <configSetting altId=\"p204.spi0.rspck\" configurationId=\"p204\"/>\n      <configSetting altId=\"p204.gpio_mode.gpio_mode_peripheral\" configurationId=\"p204.gpio_mode\"/>\n      <configSetting altId=\"p205.spi0.ssl0\" configurationId=\"p205\"/>\n      <configSetting altId=\"p205.gpio_mode.gpio_mode_peripheral\" configurationId=\"p205.gpio_mode\"/>\n      <configSetting altId=\"p206.spi0.ssl1\" configurationId=\"p206\"/>\n      <configSetting altId=\"p206.gpio_mode.gpio_mode_peripheral\" configurationId=\"p206.gpio_mode\"/>\n      <configSetting altId=\"p207.spi0.ssl2\" configurationId=\"p207\"/>\n      <configSetting altId=\"p207.gpio_mode.gpio_mode_peripheral\" configurationId=\"p207.gpio_mode\"/>\n      <configSetting altId=\"p212.cgc0.extal\" configurationId=\"p212\"/>\n      <configSetting altId=\"p212.gpio_mode.gpio_mode_peripheral\" configurationId=\"p212.gpio_mode\"/>\n      <configSetting altId=\"p213.cgc0.xtal\" configurationId=\"p213\"/>\n      <configSetting altId=\"p213.gpio_mode.gpio_mode_peripheral\" configurationId=\"p213.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n      <configSetting altId=\"p302.spi0.ssl3\" configurationId=\"p302\"/>\n      <configSetting altId=\"p302.gpio_mode.gpio_mode_peripheral\" configurationId=\"p302.gpio_mode\"/>\n      <configSetting altId=\"p303.output.low\" configurationId=\"p303\"/>\n      <configSetting altId=\"p303.gpio_mode.gpio_mode_out.low\" configurationId=\"p303.gpio_mode\"/>\n      <configSetting altId=\"p304.output.low\" configurationId=\"p304\"/>\n      <configSetting altId=\"p304.gpio_mode.gpio_mode_out.low\" configurationId=\"p304.gpio_mode\"/>\n      <configSetting altId=\"p305.qspi0.qspclk\" configurationId=\"p305\"/>\n      <configSetting altId=\"p305.gpio_mode.gpio_mode_peripheral\" configurationId=\"p305.gpio_mode\"/>\n      <configSetting altId=\"p306.qspi0.qssl\" configurationId=\"p306\"/>\n      <configSetting altId=\"p306.gpio_mode.gpio_mode_peripheral\" configurationId=\"p306.gpio_mode\"/>\n      <configSetting altId=\"p307.qspi0.qio0\" configurationId=\"p307\"/>\n      <configSetting altId=\"p307.gpio_mode.gpio_mode_peripheral\" configurationId=\"p307.gpio_mode\"/>\n      <configSetting altId=\"p308.qspi0.qio1\" configurationId=\"p308\"/>\n      <configSetting altId=\"p308.gpio_mode.gpio_mode_peripheral\" configurationId=\"p308.gpio_mode\"/>\n      <configSetting altId=\"p309.qspi0.qio2\" configurationId=\"p309\"/>\n      <configSetting altId=\"p309.gpio_mode.gpio_mode_peripheral\" configurationId=\"p309.gpio_mode\"/>\n      <configSetting altId=\"p310.qspi0.qio3\" configurationId=\"p310\"/>\n      <configSetting altId=\"p310.gpio_mode.gpio_mode_peripheral\" configurationId=\"p310.gpio_mode\"/>\n      <configSetting altId=\"p311.output.low\" configurationId=\"p311\"/>\n      <configSetting altId=\"p311.gpio_mode.gpio_mode_out.low\" configurationId=\"p311.gpio_mode\"/>\n      <configSetting altId=\"p400.output.low\" configurationId=\"p400\"/>\n      <configSetting altId=\"p400.gpio_mode.gpio_mode_out.low\" configurationId=\"p400.gpio_mode\"/>\n      <configSetting altId=\"p404.output.low\" configurationId=\"p404\"/>\n      <configSetting altId=\"p404.gpio_mode.gpio_mode_out.low\" configurationId=\"p404.gpio_mode\"/>\n      <configSetting altId=\"p407.usbfs0.vbus\" configurationId=\"p407\"/>\n      <configSetting altId=\"p407.gpio_mode.gpio_mode_peripheral\" configurationId=\"p407.gpio_mode\"/>\n      <configSetting altId=\"p408.gpt6.gtiocb\" configurationId=\"p408\"/>\n      <configSetting altId=\"p408.gpio_mode.gpio_mode_peripheral\" configurationId=\"p408.gpio_mode\"/>\n      <configSetting altId=\"p409.input\" configurationId=\"p409\"/>\n      <configSetting altId=\"p409.gpio_irq.gpio_irq_enabled\" configurationId=\"p409.gpio_irq\"/>\n      <configSetting altId=\"p409.gpio_mode.gpio_mode_in\" configurationId=\"p409.gpio_mode\"/>\n      <configSetting altId=\"p409.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p409.gpio_pupd\"/>\n      <configSetting altId=\"p414.input\" configurationId=\"p414\"/>\n      <configSetting altId=\"p414.gpio_irq.gpio_irq_enabled\" configurationId=\"p414.gpio_irq\"/>\n      <configSetting altId=\"p414.gpio_mode.gpio_mode_in\" configurationId=\"p414.gpio_mode\"/>\n      <configSetting altId=\"p414.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p414.gpio_pupd\"/>\n      <configSetting altId=\"p415.output.low\" configurationId=\"p415\"/>\n      <configSetting altId=\"p415.gpio_mode.gpio_mode_out.low\" configurationId=\"p415.gpio_mode\"/>\n      <configSetting altId=\"p500.usbfs0.vbusen\" configurationId=\"p500\"/>\n      <configSetting altId=\"p500.gpio_mode.gpio_mode_peripheral\" configurationId=\"p500.gpio_mode\"/>\n      <configSetting altId=\"p501.usbfs0.ovrcura\" configurationId=\"p501\"/>\n      <configSetting altId=\"p501.gpio_mode.gpio_mode_peripheral\" configurationId=\"p501.gpio_mode\"/>\n      <configSetting altId=\"p505.asel\" configurationId=\"p505\"/>\n      <configSetting altId=\"p505.gpio_mode.gpio_mode_an\" configurationId=\"p505.gpio_mode\"/>\n      <configSetting altId=\"p506.asel\" configurationId=\"p506\"/>\n      <configSetting altId=\"p506.gpio_mode.gpio_mode_an\" configurationId=\"p506.gpio_mode\"/>\n      <configSetting altId=\"p511.iic1.sda\" configurationId=\"p511\"/>\n      <configSetting altId=\"p511.gpio_mode.gpio_mode_peripheral\" configurationId=\"p511.gpio_mode\"/>\n      <configSetting altId=\"p512.iic1.scl\" configurationId=\"p512\"/>\n      <configSetting altId=\"p512.gpio_mode.gpio_mode_peripheral\" configurationId=\"p512.gpio_mode\"/>\n      <configSetting altId=\"p601.sci9.scl\" configurationId=\"p601\"/>\n      <configSetting altId=\"p601.gpio_mode.gpio_mode_peripheral\" configurationId=\"p601.gpio_mode\"/>\n      <configSetting altId=\"p601.gpio_otype.gpio_otype_n_ch_od\" configurationId=\"p601.gpio_otype\"/>\n      <configSetting altId=\"p602.sci9.sda\" configurationId=\"p602\"/>\n      <configSetting altId=\"p602.gpio_mode.gpio_mode_peripheral\" configurationId=\"p602.gpio_mode\"/>\n      <configSetting altId=\"p602.gpio_otype.gpio_otype_n_ch_od\" configurationId=\"p602.gpio_otype\"/>\n      <configSetting altId=\"p611.output.low\" configurationId=\"p611\"/>\n      <configSetting altId=\"p611.gpio_mode.gpio_mode_out.low\" configurationId=\"p611.gpio_mode\"/>\n      <configSetting altId=\"p612.output.low\" configurationId=\"p612\"/>\n      <configSetting altId=\"p612.gpio_mode.gpio_mode_out.low\" configurationId=\"p612.gpio_mode\"/>\n      <configSetting altId=\"p708.output.low\" configurationId=\"p708\"/>\n      <configSetting altId=\"p708.gpio_mode.gpio_mode_out.low\" configurationId=\"p708.gpio_mode\"/>\n      <configSetting altId=\"p709.output.low\" configurationId=\"p709\"/>\n      <configSetting altId=\"p709.gpio_mode.gpio_mode_out.low\" configurationId=\"p709.gpio_mode\"/>\n      <configSetting altId=\"p710.output.low\" configurationId=\"p710\"/>\n      <configSetting altId=\"p710.gpio_mode.gpio_mode_out.low\" configurationId=\"p710.gpio_mode\"/>\n      <configSetting altId=\"p712.output.low\" configurationId=\"p712\"/>\n      <configSetting altId=\"p712.gpio_mode.gpio_mode_out.low\" configurationId=\"p712.gpio_mode\"/>\n      <configSetting altId=\"p713.output.low\" configurationId=\"p713\"/>\n      <configSetting altId=\"p713.gpio_mode.gpio_mode_out.low\" configurationId=\"p713.gpio_mode\"/>\n      <configSetting altId=\"qspi0.mode.quad.b\" configurationId=\"qspi0.mode\"/>\n      <configSetting altId=\"qspi0.pairing.b\" configurationId=\"qspi0.pairing\"/>\n      <configSetting altId=\"qspi0.qio0.p307\" configurationId=\"qspi0.qio0\"/>\n      <configSetting altId=\"qspi0.qio1.p308\" configurationId=\"qspi0.qio1\"/>\n      <configSetting altId=\"qspi0.qio2.p309\" configurationId=\"qspi0.qio2\"/>\n      <configSetting altId=\"qspi0.qio3.p310\" configurationId=\"qspi0.qio3\"/>\n      <configSetting altId=\"qspi0.qspclk.p305\" configurationId=\"qspi0.qspclk\"/>\n      <configSetting altId=\"qspi0.qssl.p306\" configurationId=\"qspi0.qssl\"/>\n      <configSetting altId=\"sci0.mode.asynchronous.free\" configurationId=\"sci0.mode\"/>\n      <configSetting altId=\"sci0.rxd.p100\" configurationId=\"sci0.rxd\"/>\n      <configSetting altId=\"sci0.txd.p101\" configurationId=\"sci0.txd\"/>\n      <configSetting altId=\"sci9.mode.iic.free\" configurationId=\"sci9.mode\"/>\n      <configSetting altId=\"sci9.scl.p601\" configurationId=\"sci9.scl\"/>\n      <configSetting altId=\"sci9.sda.p602\" configurationId=\"sci9.sda\"/>\n      <configSetting altId=\"spi0.miso.p202\" configurationId=\"spi0.miso\"/>\n      <configSetting altId=\"spi0.mode.enabled.free\" configurationId=\"spi0.mode\"/>\n      <configSetting altId=\"spi0.mosi.p203\" configurationId=\"spi0.mosi\"/>\n      <configSetting altId=\"spi0.pairing.free\" configurationId=\"spi0.pairing\"/>\n      <configSetting altId=\"spi0.rspck.p204\" configurationId=\"spi0.rspck\"/>\n      <configSetting altId=\"spi0.ssl0.p205\" configurationId=\"spi0.ssl0\"/>\n      <configSetting altId=\"spi0.ssl1.p206\" configurationId=\"spi0.ssl1\"/>\n      <configSetting altId=\"spi0.ssl2.p207\" configurationId=\"spi0.ssl2\"/>\n      <configSetting altId=\"spi0.ssl3.p302\" configurationId=\"spi0.ssl3\"/>\n      <configSetting altId=\"usbfs0.mode.custom\" configurationId=\"usbfs0.mode\"/>\n      <configSetting altId=\"usbfs0.ovrcura.p501\" configurationId=\"usbfs0.ovrcura\"/>\n      <configSetting altId=\"usbfs0.vbus.p407\" configurationId=\"usbfs0.vbus\"/>\n      <configSetting altId=\"usbfs0.vbusen.p500\" configurationId=\"usbfs0.vbusen\"/>\n    </pincfg>\n    <pincfg active=\"false\" name=\"R7FA4M3AF3CFB.pincfg\" selected=\"false\" symbol=\"\">\n      <configSetting altId=\"debug0.mode.jtag\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.tck.p300\" configurationId=\"debug0.tck\"/>\n      <configSetting altId=\"debug0.tdi.p110\" configurationId=\"debug0.tdi\"/>\n      <configSetting altId=\"debug0.tdo.p109\" configurationId=\"debug0.tdo\"/>\n      <configSetting altId=\"debug0.tms.p108\" configurationId=\"debug0.tms\"/>\n      <configSetting altId=\"p108.debug0.tms\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p109.debug0.tdo\" configurationId=\"p109\"/>\n      <configSetting altId=\"p109.gpio_mode.gpio_mode_peripheral\" configurationId=\"p109.gpio_mode\"/>\n      <configSetting altId=\"p110.debug0.tdi\" configurationId=\"p110\"/>\n      <configSetting altId=\"p110.gpio_mode.gpio_mode_peripheral\" configurationId=\"p110.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.tck\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n    </pincfg>\n  </raPinConfiguration>\n</raConfiguration>\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(MCU_VARIANT ra6m1)\n\nset(JLINK_DEVICE R7FA6M1AD)\n\nfunction(update_board TARGET)\n#  target_compile_definitions(${TARGET} PUBLIC)\n#  target_sources(${TARGET} PRIVATE)\n#  target_include_directories(${BOARD_TARGET} PUBLIC)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: RA6M1 EK\n   url: https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra6m1-evaluation-kit-ra6m1-mcu-group\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_STATE_ON          1\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/board.mk",
    "content": "CPU_CORE = cortex-m4\nMCU_VARIANT = ra6m1\n\n# For flash-jlink target\nJLINK_DEVICE = R7FA6M1AD\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_cfg/fsp_cfg/bsp/bsp_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CFG_H_\n#define BSP_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_clock_cfg.h\"\n            #include \"bsp_mcu_family_cfg.h\"\n            #include \"board_cfg.h\"\n            #define RA_NOT_DEFINED 0\n            #ifndef BSP_CFG_RTOS\n             #if (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (2)\n             #elif (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (1)\n             #else\n              #define BSP_CFG_RTOS (0)\n             #endif\n            #endif\n            #ifndef BSP_CFG_RTC_USED\n             #define BSP_CFG_RTC_USED (RA_NOT_DEFINED)\n            #endif\n            #undef RA_NOT_DEFINED\n            #if defined(_RA_BOOT_IMAGE)\n             #define BSP_CFG_BOOT_IMAGE (1)\n            #endif\n            #define BSP_CFG_MCU_VCC_MV (3300)\n            #define BSP_CFG_STACK_MAIN_BYTES (0x1000)\n            #define BSP_CFG_HEAP_BYTES (0x1000)\n            #define BSP_CFG_PARAM_CHECKING_ENABLE (0)\n            #define BSP_CFG_ASSERT (0)\n            #define BSP_CFG_ERROR_LOG (0)\n\n            #define BSP_CFG_PFS_PROTECT ((1))\n\n            #define BSP_CFG_C_RUNTIME_INIT ((1))\n            #define BSP_CFG_EARLY_INIT     ((0))\n\n            #define BSP_CFG_STARTUP_CLOCK_REG_NOT_RESET ((0))\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_POPULATED\n            #define BSP_CLOCK_CFG_MAIN_OSC_POPULATED (1)\n            #endif\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE\n            #define BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_DRIVE\n            #define BSP_CLOCK_CFG_SUBCLOCK_DRIVE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_POPULATED\n            #define BSP_CLOCK_CFG_SUBCLOCK_POPULATED (1)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS\n            #define BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS 1000\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_CFG_H_\n#define BSP_MCU_DEVICE_CFG_H_\n#define BSP_CFG_MCU_PART_SERIES (6)\n#endif /* BSP_MCU_DEVICE_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_pn_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_R7FA6M1AD3CFP\n      #define BSP_MCU_FEATURE_SET ('A')\n      #define BSP_ROM_SIZE_BYTES (524288)\n      #define BSP_RAM_SIZE_BYTES (262144)\n      #define BSP_DATA_FLASH_SIZE_BYTES (8192)\n      #define BSP_PACKAGE_LQFP\n      #define BSP_PACKAGE_PINS (100)\n#endif /* BSP_MCU_DEVICE_PN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_family_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_FAMILY_CFG_H_\n#define BSP_MCU_FAMILY_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_mcu_device_pn_cfg.h\"\n            #include \"bsp_mcu_device_cfg.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra6m1/bsp_mcu_info.h\"\n            #include \"bsp_clock_cfg.h\"\n            #define BSP_MCU_GROUP_RA6M1 (1)\n            #define BSP_LOCO_HZ                 (32768)\n            #define BSP_MOCO_HZ                 (8000000)\n            #define BSP_SUB_CLOCK_HZ            (32768)\n            #if   BSP_CFG_HOCO_FREQUENCY == 0\n                #define BSP_HOCO_HZ                 (16000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 1\n                #define BSP_HOCO_HZ                 (18000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 2\n                #define BSP_HOCO_HZ                 (20000000)\n            #else\n                #error \"Invalid HOCO frequency chosen (BSP_CFG_HOCO_FREQUENCY) in bsp_clock_cfg.h\"\n            #endif\n\n            #define BSP_CFG_FLL_ENABLE                 (0)\n\n            #define BSP_CORTEX_VECTOR_TABLE_ENTRIES    (16U)\n            #define BSP_VECTOR_TABLE_MAX_ENTRIES       (112U)\n            #define BSP_CFG_INLINE_IRQ_FUNCTIONS       (1)\n\n            #define OFS_SEQ1 0xA001A001 | (1 << 1) | (3 << 2)\n            #define OFS_SEQ2 (15 << 4) | (3 << 8) | (3 << 10)\n            #define OFS_SEQ3 (1 << 12) | (1 << 14) | (1 << 17)\n            #define OFS_SEQ4 (3 << 18) |(15 << 20) | (3 << 24) | (3 << 26)\n            #define OFS_SEQ5 (1 << 28) | (1 << 30)\n            #define BSP_CFG_ROM_REG_OFS0 (OFS_SEQ1 | OFS_SEQ2 | OFS_SEQ3 | OFS_SEQ4 | OFS_SEQ5)\n            #define BSP_CFG_ROM_REG_OFS1 (0xFFFFFEF8 | (1 << 2) | (3) |  (1 << 8))\n            #define BSP_CFG_ROM_REG_MPU_PC0_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_PC0_START (0xFFFFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_PC0_END (0xFFFFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_PC1_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_PC1_START (0xFFFFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_PC1_END (0xFFFFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_START (0x00FFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_END (0x00FFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_START (0x200FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_END (0x200FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_START (0x407FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_END (0x407FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_START (0x400DFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_END (0x400DFFFF)\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_WAIT\n            #define BSP_CLOCK_CFG_MAIN_OSC_WAIT (9)\n            #endif\n            /* Used to create IELS values for the interrupt initialization table g_interrupt_event_link_select. */\n            #define BSP_PRV_IELS_ENUM(vector)    (ELC_ ## vector)\n\n            /*\n            ID Code\n            Note: To lock and disable the debug interface define BSP_ID_CODE_LOCKED in compiler settings.\n            WARNING: This will disable debug access to the part. However, ALeRASE command will be accepted, which will clear (reset) the ID code. After clearing ID code, debug access will be enabled.\n            */\n            #if defined(BSP_ID_CODE_LOCKED)\n            #define BSP_CFG_ID_CODE_LONG_1 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_2 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_3 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_4 (0x00000000)\n            #else\n            /* ID CODE: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF */\n            #define BSP_CFG_ID_CODE_LONG_1 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_2 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_3 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_4 (0xffFFFFFF)\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_MCU_FAMILY_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_cfg/fsp_cfg/bsp/bsp_pin_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_PIN_CFG_H_\n#define BSP_PIN_CFG_H_\n#include \"r_ioport.h\"\n\n/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */\nFSP_HEADER\n\n#define LED1 (BSP_IO_PORT_01_PIN_12)\n#define SW1 (BSP_IO_PORT_04_PIN_15)\nextern const ioport_cfg_t g_bsp_pin_cfg; /* RA6M1-EK.pincfg */\n\nvoid BSP_PinConfigSecurityInit();\n\n/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */\nFSP_FOOTER\n#endif /* BSP_PIN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_cfg/fsp_cfg/r_ioport_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef R_IOPORT_CFG_H_\n#define R_IOPORT_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define IOPORT_CFG_PARAM_CHECKING_ENABLE (BSP_CFG_PARAM_CHECKING_ENABLE)\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* R_IOPORT_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_gen/bsp_clock_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CLOCK_CFG_H_\n#define BSP_CLOCK_CFG_H_\n#define BSP_CFG_CLOCKS_SECURE (0)\n#define BSP_CFG_CLOCKS_OVERRIDE (0)\n#define BSP_CFG_XTAL_HZ (12000000) /* XTAL 12000000Hz */\n#define BSP_CFG_PLL_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL Src: XTAL */\n#define BSP_CFG_HOCO_FREQUENCY (2) /* HOCO 20MHz */\n#define BSP_CFG_PLL_DIV (BSP_CLOCKS_PLL_DIV_1) /* PLL Div /1 */\n#define BSP_CFG_PLL_MUL BSP_CLOCKS_PLL_MUL(20U,0U) /* PLL Mul x20.0 */\n#define BSP_CFG_CLOCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL) /* Clock Src: PLL */\n#define BSP_CFG_ICLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* ICLK Div /2 */\n#define BSP_CFG_PCLKA_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKA Div /2 */\n#define BSP_CFG_PCLKB_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* PCLKB Div /4 */\n#define BSP_CFG_PCLKC_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* PCLKC Div /4 */\n#define BSP_CFG_PCLKD_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKD Div /2 */\n#define BSP_CFG_BCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* BCLK Div /2 */\n#define BSP_CFG_BCLK_OUTPUT (2) /* EBCLK Div /2 */\n#define BSP_CFG_UCK_DIV (BSP_CLOCKS_USB_CLOCK_DIV_5) /* UCLK Div /5 */\n#define BSP_CFG_FCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* FCLK Div /4 */\n#define BSP_CFG_CLKOUT_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CLKOUT Disabled */\n#define BSP_CFG_CLKOUT_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* CLKOUT Div /1 */\n#endif /* BSP_CLOCK_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_gen/common_data.c",
    "content": "/* generated common source file - do not edit */\n#include \"common_data.h\"\nioport_instance_ctrl_t g_ioport_ctrl;\nconst ioport_instance_t g_ioport =\n        {\n            .p_api = &g_ioport_on_ioport,\n            .p_ctrl = &g_ioport_ctrl,\n            .p_cfg = &g_bsp_pin_cfg,\n        };\nvoid g_common_init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_gen/common_data.h",
    "content": "/* generated common header file - do not edit */\n#ifndef COMMON_DATA_H_\n#define COMMON_DATA_H_\n#include <stdint.h>\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n#include \"bsp_pin_cfg.h\"\nFSP_HEADER\n#define IOPORT_CFG_NAME g_bsp_pin_cfg\n#define IOPORT_CFG_OPEN R_IOPORT_Open\n#define IOPORT_CFG_CTRL g_ioport_ctrl\n\n/* IOPORT Instance */\nextern const ioport_instance_t g_ioport;\n\n/* IOPORT control structure. */\nextern ioport_instance_ctrl_t g_ioport_ctrl;\nvoid g_common_init(void);\nFSP_FOOTER\n#endif /* COMMON_DATA_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/ra_gen/pin_data.c",
    "content": "/* generated pin source file - do not edit */\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n\n\nconst ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {\n    {\n        .pin = BSP_IO_PORT_00_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_CTSU)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_CTSU)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n};\n\nconst ioport_cfg_t g_bsp_pin_cfg = {\n    .number_of_pins = sizeof(g_bsp_pin_cfg_data)/sizeof(ioport_pin_cfg_t),\n    .p_pin_cfg_data = &g_bsp_pin_cfg_data[0],\n};\n\n#if BSP_TZ_SECURE_BUILD\n\nvoid R_BSP_PinCfgSecurityInit(void);\n\n/* Initialize SAR registers for secure pins. */\nvoid R_BSP_PinCfgSecurityInit(void)\n{\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n    uint32_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #else\n    uint16_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #endif\n    memset(pmsar, 0xFF, BSP_FEATURE_BSP_NUM_PMSAR * sizeof(R_PMISC->PMSAR[0]));\n\n\n    for(uint32_t i = 0; i < g_bsp_pin_cfg.number_of_pins; i++)\n    {\n        uint32_t port_pin = g_bsp_pin_cfg.p_pin_cfg_data[i].pin;\n        uint32_t port = port_pin >> 8U;\n        uint32_t pin = port_pin & 0xFFU;\n        pmsar[port] &= (uint16_t) ~(1U << pin);\n    }\n\n    for(uint32_t i = 0; i < BSP_FEATURE_BSP_NUM_PMSAR; i++)\n    {\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n        R_PMISC->PMSAR[i].PMSAR = (uint16_t) pmsar[i];\n #else\n        R_PMISC->PMSAR[i].PMSAR = pmsar[i];\n #endif\n    }\n\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/script/fsp.ld",
    "content": "/*\n                  Linker File for Renesas FSP\n*/\n\nINCLUDE memory_regions.ld\n\n/* Uncomment and set XIP_SECONDARY_SLOT_IMAGE to 1 below for the secondary XIP application image.*/\n/*\n XIP_SECONDARY_SLOT_IMAGE = 1;\n*/\n\nQSPI_FLASH_PRV_LENGTH = DEFINED(QSPI_FLASH_SIZE) ? ABSOLUTE(QSPI_FLASH_SIZE) : ABSOLUTE(QSPI_FLASH_LENGTH);\nOSPI_DEVICE_0_PRV_LENGTH = DEFINED(OSPI_DEVICE_0_SIZE) ? ABSOLUTE(OSPI_DEVICE_0_SIZE) : ABSOLUTE(OSPI_DEVICE_0_LENGTH);\nOSPI_DEVICE_1_PRV_LENGTH = DEFINED(OSPI_DEVICE_1_SIZE) ? ABSOLUTE(OSPI_DEVICE_1_SIZE) : ABSOLUTE(OSPI_DEVICE_1_LENGTH);\n\n/* If a flat (secure) project has DEFINED RAM_NS_BUFFER_LENGTH, then emit IDAU symbols to allocate non-secure RAM. */\n__RESERVE_NS_RAM = !DEFINED(PROJECT_NONSECURE) && DEFINED(RAM_NS_BUFFER_LENGTH) && (OPTION_SETTING_S_LENGTH != 0);\n\nITCM_START = DEFINED(ITCM_START)? ITCM_START : 0;\nITCM_LENGTH = DEFINED(ITCM_LENGTH)? ITCM_LENGTH : 0;\nDTCM_START = DEFINED(DTCM_START)? DTCM_START : 0;\nDTCM_LENGTH = DEFINED(DTCM_LENGTH)? DTCM_LENGTH : 0;\nRAM_NS_BUFFER_BLOCK_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? ALIGN(RAM_NS_BUFFER_LENGTH, 8192) : 0;\nRAM_NS_BUFFER_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? RAM_NS_BUFFER_LENGTH : 0;\nRAM_NS_BUFFER_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_LENGTH;\nRAM_NS_BUFFER_BLOCK_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_BLOCK_LENGTH;\n\nOPTION_SETTING_START_NS = DEFINED(PROJECT_NONSECURE) ? OPTION_SETTING_START : OPTION_SETTING_START + 0x80;\n\n/* This definition is used to avoid moving the counter in OPTION_SETTING regions for projects that should not configure option settings.\n * Bootloader images do not configure option settings because they are owned by the bootloader.\n * FSP_BOOTABLE_IMAGE is only defined in bootloader images. */\n__bl_FSP_BOOTABLE_IMAGE = 1;\n__bln_FSP_BOOTABLE_IMAGE = 1;\nPROJECT_SECURE_OR_FLAT = (!DEFINED(PROJECT_NONSECURE) || DEFINED(PROJECT_SECURE)) && OPTION_SETTING_LENGTH && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_NS = DEFINED(PROJECT_NONSECURE) && !DEFINED(FSP_BOOTABLE_IMAGE);\n\n__bl_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_APPLICATION_IMAGE_NUMBER == 1 ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         (DEFINED(BOOTLOADER_SECONDARY_USE_QSPI) || DEFINED(BOOTLOADER_SECONDARY_USE_OSPI_B)) ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                          FLASH_APPLICATION_S_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_END    = __bl_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_END = __bl_XIP_SECONDARY_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_FLASH_NS_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_START - FLASH_BOOTLOADER_HEADER_LENGTH + FLASH_APPLICATION_S_LENGTH;\n__bl_FLASH_NSC_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_END - FLASH_APPLICATION_NSC_LENGTH;\n__bl_RAM_NS_START    = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH;\n__bl_RAM_NSC_START   = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       __bl_RAM_NS_START - RAM_APPLICATION_NSC_LENGTH;\n__bl_FLASH_NS_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                            FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                            __bl_FLASH_NS_START + FLASH_BOOTLOADER_HEADER_LENGTH_2;\n__bln_FLASH_IMAGE_START = __bl_FLASH_NS_IMAGE_START | (!DEFINED (NS_OFFSET_START) ? 0 : NS_OFFSET_START);\n__bln_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                           FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                           FLASH_APPLICATION_NS_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH_2;\n\nXIP_SECONDARY_SLOT_IMAGE = DEFINED(XIP_SECONDARY_SLOT_IMAGE) ? XIP_SECONDARY_SLOT_IMAGE : 0;\nFLASH_ORIGIN = !DEFINED(FLASH_IMAGE_START) ? FLASH_START :\n                XIP_SECONDARY_SLOT_IMAGE == 1 ? XIP_SECONDARY_FLASH_IMAGE_START :\n                FLASH_IMAGE_START;\nLIMITED_FLASH_LENGTH = DEFINED(FLASH_IMAGE_LENGTH) ? FLASH_IMAGE_LENGTH :\n                       DEFINED(FLASH_BOOTLOADER_LENGTH) ? FLASH_BOOTLOADER_LENGTH :\n                       FLASH_LENGTH;\nOPTION_SETTING_SAS_SIZE = 0x34;\nOPTION_SETTING_SAS_LENGTH = !DEFINED(OPTION_SETTING_LENGTH) ? 0 :\n                            OPTION_SETTING_LENGTH == 0 ? 0 :\n                            OPTION_SETTING_LENGTH - OPTION_SETTING_SAS_SIZE;\n\n/* Define memory regions. */\nMEMORY\n{\n  ITCM (rx)                       : ORIGIN = ITCM_START, LENGTH = ITCM_LENGTH\n  DTCM (rwx)                      : ORIGIN = DTCM_START, LENGTH = DTCM_LENGTH\n  FLASH (rx)                      : ORIGIN = FLASH_ORIGIN, LENGTH = LIMITED_FLASH_LENGTH\n  RAM (rwx)                       : ORIGIN = RAM_START, LENGTH = RAM_LENGTH\n  DATA_FLASH (rx)                 : ORIGIN = DATA_FLASH_START, LENGTH = DATA_FLASH_LENGTH\n  QSPI_FLASH (rx)                 : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_PRV_LENGTH\n  OSPI_DEVICE_0 (rx)              : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1 (rx)              : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  OSPI_DEVICE_0_RAM (rwx)         : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1_RAM (rwx)         : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  SDRAM (rwx)                     : ORIGIN = SDRAM_START, LENGTH = SDRAM_LENGTH\n  OPTION_SETTING (r)              : ORIGIN = OPTION_SETTING_START, LENGTH = OPTION_SETTING_LENGTH\n  OPTION_SETTING_OFS (r)          : ORIGIN = OPTION_SETTING_START, LENGTH = 0x18\n  OPTION_SETTING_SAS (r)          : ORIGIN = OPTION_SETTING_START + OPTION_SETTING_SAS_SIZE, LENGTH = OPTION_SETTING_SAS_LENGTH\n  OPTION_SETTING_S (r)            : ORIGIN = OPTION_SETTING_S_START, LENGTH = OPTION_SETTING_S_LENGTH\n  ID_CODE (rx)                    : ORIGIN = ID_CODE_START, LENGTH = ID_CODE_LENGTH\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be DEFINED in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n *   __qspi_flash_start__\n *   __qspi_flash_end__\n *   __qspi_flash_code_size__\n *   __qspi_region_max_size__\n *   __qspi_region_start_address__\n *   __qspi_region_end_address__\n *   __ospi_device_0_start__\n *   __ospi_device_0_end__\n *   __ospi_device_0_code_size__\n *   __ospi_device_0_region_max_size__\n *   __ospi_device_0_region_start_address__\n *   __ospi_device_0_region_end_address__\n *   __ospi_device_1_start__\n *   __ospi_device_1_end__\n *   __ospi_device_1_code_size__\n *   __ospi_device_1_region_max_size__\n *   __ospi_device_1_region_start_address__\n *   __ospi_device_1_region_end_address__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .text :\n    {\n        __tz_FLASH_S = ABSOLUTE(FLASH_START);\n        __ROM_Start = .;\n\n        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much\n         * space because ROM registers are at address 0x400 and there is very little space\n         * in between. */\n        KEEP(*(.fixed_vectors*))\n        KEEP(*(.application_vectors*))\n        __Vectors_End = .;\n\n        /* Some devices have a gap of code flash between the vector table and ROM Registers.\n         * The flash gap section allows applications to place code and data in this section. */\n        *(.flash_gap*)\n\n        /* ROM Registers start at address 0x00000400 for devices that do not have the OPTION_SETTING region. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x400;\n        KEEP(*(.rom_registers*))\n\n        /* Reserving 0x100 bytes of space for ROM registers. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x500;\n\n        /* Allocate flash write-boundary-aligned\n         * space for sce9 wrapped public keys for mcuboot if the module is used.\n         */\n        KEEP(*(.mcuboot_sce9_key*))\n\n        *(.text*)\n\n        KEEP(*(.version))\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n        __usb_dev_descriptor_start_fs = .;\n        KEEP(*(.usb_device_desc_fs*))\n        __usb_cfg_descriptor_start_fs = .;\n        KEEP(*(.usb_config_desc_fs*))\n        __usb_interface_descriptor_start_fs = .;\n        KEEP(*(.usb_interface_desc_fs*))\n        __usb_descriptor_end_fs = .;\n        __usb_dev_descriptor_start_hs = .;\n        KEEP(*(.usb_device_desc_hs*))\n        __usb_cfg_descriptor_start_hs = .;\n        KEEP(*(.usb_config_desc_hs*))\n        __usb_interface_descriptor_start_hs = .;\n        KEEP(*(.usb_interface_desc_hs*))\n        __usb_descriptor_end_hs = .;\n\n        KEEP(*(.eh_frame*))\n\n        __ROM_End = .;\n    } > FLASH = 0xFF\n\n    __Vectors_Size = __Vectors_End - __Vectors;\n\n    . = .;\n    __itcm_data_pre_location = .;\n\n    /* Initialized ITCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .itcm_data : ALIGN(16)\n    {\n        /* Start of ITCM Secure Trustzone region. */\n        __tz_ITCM_S = ABSOLUTE(ITCM_START);\n\n        /* All ITCM data start */\n        __itcm_data_start = .;\n\n        KEEP(*(.itcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* All ITCM data end */\n        __itcm_data_end = .;\n\n        /*\n         * Start of the ITCM Non-Secure Trustzone region.\n         * ITCM_NS_START can be used to set a fixed address for non-secure ITCM in secure projects or flat projects.\n         */\n        __tz_ITCM_N = DEFINED(ITCM_NS_START) ? ABSOLUTE(ITCM_NS_START) : ALIGN(__itcm_data_end, 8192);\n    } > ITCM AT > FLASH = 0x00\n\n    /* Addresses exported for ITCM initialization. */\n    __itcm_data_init_start = LOADADDR(.itcm_data);\n    __itcm_data_init_end = LOADADDR(.itcm_data) + SIZEOF(.itcm_data);\n\n    ASSERT(ORIGIN(ITCM) % 8 == 0, \"ITCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(ITCM) % 8 == 0, \"ITCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.itcm_data) % 16 == 0, \".itcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.itcm_data) % 8 == 0, \".itcm_data section size must be a multiple of 8 bytes.\")\n\n    /* Restore location counter. */\n    /* If ITCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If ITCM is present, this will be the absolute address that follows the ITCM ROM location. */\n    . = (SIZEOF(.itcm_data) > 0) ? __itcm_data_init_end : __itcm_data_pre_location;\n\n    __exidx_start = .;\n    /DISCARD/ :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    }\n    __exidx_end = .;\n\n    /* To copy multiple ROM to RAM sections,\n     * uncomment .copy.table section and,\n     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .copy.table :\n    {\n        . = ALIGN(4);\n        __copy_table_start__ = .;\n        LONG (__etext)\n        LONG (__data_start__)\n        LONG (__data_end__ - __data_start__)\n        LONG (__etext2)\n        LONG (__data2_start__)\n        LONG (__data2_end__ - __data2_start__)\n        __copy_table_end__ = .;\n    } > FLASH\n    */\n\n    /* To clear multiple BSS sections,\n     * uncomment .zero.table section and,\n     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .zero.table :\n    {\n        . = ALIGN(4);\n        __zero_table_start__ = .;\n        LONG (__bss_start__)\n        LONG (__bss_end__ - __bss_start__)\n        LONG (__bss2_start__)\n        LONG (__bss2_end__ - __bss2_start__)\n        __zero_table_end__ = .;\n    } > FLASH\n    */\n\n    __etext = .;\n\n    __tz_RAM_S = ORIGIN(RAM);\n\n    /* If DTC is used, put the DTC vector table at the start of SRAM.\n       This avoids memory holes due to 1K alignment required by it. */\n    .fsp_dtc_vector_table (NOLOAD) :\n    {\n        . = ORIGIN(RAM);\n        *(.fsp_dtc_vector_table)\n    } > RAM\n\n    /* Initialized data section. */\n    .data :\n    {\n        __data_start__ = .;\n        . = ALIGN(4);\n\n        __Code_In_RAM_Start = .;\n\n        KEEP(*(.code_in_ram*))\n        __Code_In_RAM_End = .;\n\n        *(vtable)\n        /* Don't use *(.data*) because it will place data meant for .data_flash in this section. */\n        *(.data.*)\n        *(.data)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        KEEP(*(.jcr*))\n\n        . = ALIGN(4);\n\n        /* All data end */\n        __data_end__ = .;\n\n    } > RAM AT > FLASH\n\n    . = .;\n    __dtcm_data_pre_location = LOADADDR(.data) + SIZEOF(.data);\n\n    /* Initialized DTCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .dtcm_data : ALIGN(16)\n    {\n        /* Start of DTCM Secure Trustzone region. */\n        __tz_DTCM_S = ABSOLUTE(DTCM_START);\n\n        /* Initialized DTCM data start */\n        __dtcm_data_start = .;\n\n        KEEP(*(.dtcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* Initialized DTCM data end */\n        __dtcm_data_end = .;\n    } > DTCM AT > FLASH = 0x00\n\n    . = __dtcm_data_end;\n    /* Uninitialized DTCM data. */\n    /* ALIGN appears on the left side of the colon because it is being used to assign the VMA directly, as opposed to a right side appearance which would control the LMA. */\n    .dtcm_bss ALIGN(8) (NOLOAD) :\n    {\n        /* Uninitialized DTCM data start */\n        __dtcm_bss_start = .;\n\n        KEEP(*(.dtcm_bss*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. No fill because of NOLOAD. */\n        . = ALIGN(8);\n\n        /* Uninitialized DTCM data end */\n        __dtcm_bss_end = .;\n\n        /*\n         * Start of the DTCM Non-Secure Trustzone region.\n         * DTCM_NS_START can be used to set a fixed address for non-secure DTCM in secure projects or flat projects.\n         */\n        __tz_DTCM_N = DEFINED(DTCM_NS_START) ? ABSOLUTE(DTCM_NS_START) : ALIGN(__dtcm_bss_end, 8192);\n    } > DTCM\n\n    /* Addresses exported for DTCM initialization. */\n    __dtcm_data_init_start = LOADADDR(.dtcm_data);\n    __dtcm_data_init_end = LOADADDR(.dtcm_data) + SIZEOF(.dtcm_data);\n\n    ASSERT(ORIGIN(DTCM) % 8 == 0, \"DTCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(DTCM) % 8 == 0, \"DTCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) == ADDR(.dtcm_bss), \".dtcm_bss has (VMA != LMA) but should be NOLOAD (VMA == LMA).\")\n    ASSERT(LOADADDR(.dtcm_data) % 16 == 0, \".dtcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.dtcm_data) % 8 == 0, \".dtcm_data section size must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) % 8 == 0, \".dtcm_bss section must be aligned to 8 bytes.\")\n    ASSERT(SIZEOF(.dtcm_bss) % 8 == 0, \".dtcm_bss section size must be a multiple of 8 bytes.\")\n    ASSERT(__dtcm_bss_start == __dtcm_data_end, \".dtcm_bss section is not adjacent to .dtcm_data section.\")\n\n    /* Restore location counter. */\n    /* If DTCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If DTCM is present, this will be the absolute address that follows the DTCM ROM location. */\n    . = (SIZEOF(.dtcm_data) > 0) ? __dtcm_data_init_end : __dtcm_data_pre_location;\n\n    /* TrustZone Secure Gateway Stubs Section */\n\n    /* Store location counter for SPI non-retentive sections. */\n    sgstubs_pre_location = .;\n\n    /* Determine the secure gateway stubs address either by the provided linker variable or the next 1024-byte block. */\n    SGSTUBS_LOC = (DEFINED(PROJECT_SECURE) && DEFINED(FLASH_NSC_START)) ? ABSOLUTE(FLASH_NSC_START) : ALIGN(1024);\n    .gnu.sgstubs SGSTUBS_LOC : ALIGN(1024)\n    {\n        __tz_FLASH_C = DEFINED(FLASH_NSC_START) ? ABSOLUTE(FLASH_NSC_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : ALIGN(1024);\n        _start_sg = .;\n        *(.gnu.sgstubs*)\n        . = ALIGN(32);\n        _end_sg = .;\n    } > FLASH\n\n    __tz_FLASH_N = DEFINED(FLASH_NS_START) ? ABSOLUTE(FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : FLASH_LENGTH < 32768 ? FLASH_LENGTH : ALIGN(32768);\n    FLASH_NS_IMAGE_START = DEFINED(FLASH_NS_IMAGE_START) ? FLASH_NS_IMAGE_START : __tz_FLASH_N;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_S = ORIGIN(QSPI_FLASH);\n\n    /* QSPI_FLASH section to be downloaded via debugger */\n    .qspi_flash :\n    {\n        __qspi_flash_start__ = .;\n        KEEP(*(.qspi_flash*))\n        KEEP(*(.code_in_qspi*))\n        __qspi_flash_end__ = .;\n    } > QSPI_FLASH\n    __qspi_flash_code_size__ = __qspi_flash_end__ - __qspi_flash_start__;\n\n    /* QSPI_FLASH non-retentive section, creates a copy in internal flash that can be copied to QSPI */\n    __qspi_flash_code_addr__ = sgstubs_pre_location;\n    .qspi_non_retentive : AT(__qspi_flash_code_addr__)\n    {\n        __qspi_non_retentive_start__ = .;\n        KEEP(*(.qspi_non_retentive*))\n        __qspi_non_retentive_end__ = .;\n    } > QSPI_FLASH\n    __qspi_non_retentive_size__ = __qspi_non_retentive_end__ - __qspi_non_retentive_start__;\n\n    __qspi_region_max_size__ = 0x4000000;   /* Must be the same as defined in MEMORY above */\n    __qspi_region_start_address__ = __qspi_flash_start__;\n    __qspi_region_end_address__ = __qspi_flash_start__ + __qspi_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_N = __qspi_non_retentive_end__;\n\n    /* Support for OctaRAM */\n    .OSPI_DEVICE_0_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_0_start__ = .;\n        *(.ospi_device_0_no_load*)\n        . = ALIGN(4);\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0_RAM\n\n    .OSPI_DEVICE_1_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_1_start__ = .;\n        *(.ospi_device_1_no_load*)\n        . = ALIGN(4);\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1_RAM\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_S = ORIGIN(OSPI_DEVICE_0);\n\n    /* OSPI_DEVICE_0 section to be downloaded via debugger */\n    .OSPI_DEVICE_0 :\n    {\n        __ospi_device_0_start__ = .;\n        KEEP(*(.ospi_device_0*))\n        KEEP(*(.code_in_ospi_device_0*))\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_code_size__ = __ospi_device_0_end__ - __ospi_device_0_start__;\n\n    /* OSPI_DEVICE_0 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n     __ospi_device_0_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive));\n    .ospi_device_0_non_retentive : AT(__ospi_device_0_code_addr__)\n    {\n        __ospi_device_0_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_0_non_retentive*))\n        __ospi_device_0_non_retentive_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_non_retentive_size__ = __ospi_device_0_non_retentive_end__ - __ospi_device_0_non_retentive_start__;\n\n    __ospi_device_0_region_max_size__ = 0x8000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_0_region_start_address__ = __ospi_device_0_start__;\n    __ospi_device_0_region_end_address__ = __ospi_device_0_start__ + __ospi_device_0_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_N = __ospi_device_0_non_retentive_end__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_S = ORIGIN(OSPI_DEVICE_1);\n\n    /* OSPI_DEVICE_1 section to be downloaded via debugger */\n    .OSPI_DEVICE_1 :\n    {\n        __ospi_device_1_start__ = .;\n        KEEP(*(.ospi_device_1*))\n        KEEP(*(.code_in_ospi_device_1*))\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_code_size__ = __ospi_device_1_end__ - __ospi_device_1_start__;\n\n    /* OSPI_DEVICE_1 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n    __ospi_device_1_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive) + SIZEOF(.ospi_device_0_non_retentive));\n    .ospi_device_1_non_retentive : AT(__ospi_device_1_code_addr__)\n    {\n        __ospi_device_1_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_1_non_retentive*))\n        __ospi_device_1_non_retentive_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_non_retentive_size__ = __ospi_device_1_non_retentive_end__ - __ospi_device_1_non_retentive_start__;\n\n    __ospi_device_1_region_max_size__ = 0x10000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_1_region_start_address__ = __ospi_device_1_start__;\n    __ospi_device_1_region_end_address__ = __ospi_device_1_start__ + __ospi_device_1_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_N = __ospi_device_1_non_retentive_end__;\n\n    .noinit (NOLOAD):\n    {\n        . = ALIGN(4);\n        __noinit_start = .;\n        KEEP(*(.noinit*))\n        . = ALIGN(8);\n        /* Place the FreeRTOS heap here so that the __HeapLimit calculation does not include the freertos heap. */\n        KEEP(*(.heap.*))\n        __noinit_end = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n        __HeapBase = .;\n        /* Place the STD heap here. */\n        KEEP(*(.heap))\n        __HeapLimit = .;\n    } > RAM\n\n    /* Stacks are stored in this section. */\n    .stack_dummy (NOLOAD):\n    {\n        . = ALIGN(8);\n        __StackLimit = .;\n        /* Main stack */\n        KEEP(*(.stack))\n        __StackTop = .;\n        /* Thread stacks */\n        KEEP(*(.stack*))\n        __StackTopAll = .;\n    } > RAM\n\n    PROVIDE(__stack = __StackTopAll);\n\n    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used\n       at run time for things such as ThreadX memory pool allocations. */\n    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);\n\n    /* RAM_NSC_START can be used to set a fixed address for non-secure callable RAM in secure projects.\n     * If it is not specified, the address for NSC RAM is the end of RAM aligned to a 1K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_C = DEFINED(RAM_NSC_START) ? ABSOLUTE(RAM_NSC_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_segment_used_end__, 1024);\n\n    /* RAM_NS_START can be used to set a fixed address for non-secure RAM in secure projects or flat projects.\n     * RAM_NS_BUFFER_BLOCK_LENGTH is used to allocate non-secure buffers in a flat project. If it is not\n     * specified, the address for NSC RAM is the end of RAM aligned to an 8K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_N = DEFINED(RAM_NS_START) ? ABSOLUTE(RAM_NS_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__tz_RAM_C, 8192);\n\n    /* Non-secure buffers must be in non-secure RAM. This is primarily used for the EDMAC in flat projects.\n     * The EDMAC is a non-secure bus master and can only access non-secure RAM. */\n    .ns_buffer (NOLOAD):\n    {\n        /* Allocate RAM on a 32-byte boundary to help with placement of Ethernet buffers. */\n        . = __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_START & 0xFFFFFFE0) : .;\n\n        KEEP(*(.ns_buffer*))\n    } > RAM\n\n    /* Data flash. */\n    .data_flash :\n    {\n        . = ORIGIN(DATA_FLASH);\n        __tz_DATA_FLASH_S = .;\n        __Data_Flash_Start = .;\n        KEEP(*(.data_flash*))\n        __Data_Flash_End = .;\n\n        __tz_DATA_FLASH_N = DEFINED(DATA_FLASH_NS_START) ? ABSOLUTE(DATA_FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(DATA_FLASH_START + DATA_FLASH_LENGTH) : ALIGN(1024);\n    } > DATA_FLASH\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_S = ORIGIN(SDRAM);\n\n    /* SDRAM */\n    .sdram (NOLOAD):\n    {\n        __SDRAM_Start = .;\n        KEEP(*(.sdram*))\n        KEEP(*(.frame*))\n        __SDRAM_End = .;\n    } > SDRAM\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_N = __SDRAM_End;\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool. */\n    __tz_ID_CODE_S = ORIGIN(ID_CODE);\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool.\n     *       Set this symbol to the same value as __tz_ID_CODE_S so the RA configuration tool does not split the ID_CODE\n     *       memory region between TrustZone projects. */\n    __tz_ID_CODE_N = __tz_ID_CODE_S;\n\n    .id_code :\n    {\n        __ID_Code_Start = .;\n        KEEP(*(.id_code*))\n        __ID_Code_End = .;\n    } > ID_CODE\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S = ORIGIN(OPTION_SETTING_OFS);\n\n    .option_setting_ofs :\n    {\n        __OPTION_SETTING_OFS_Start = .;\n        KEEP(*(.option_setting_ofs0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x04 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_ofs2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x10 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_dualsel))\n        __OPTION_SETTING_OFS_End = .;\n    } > OPTION_SETTING_OFS = 0xFF\n\n    .option_setting_sas :\n    {\n        __OPTION_SETTING_SAS_Start = .;\n        KEEP(*(.option_setting_sas))\n        __OPTION_SETTING_SAS_End = .;\n    } > OPTION_SETTING_SAS = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_N = ABSOLUTE(OPTION_SETTING_START_NS);\n\n    .option_setting_ns :\n    {\n        __OPTION_SETTING_NS_Start = .;\n        KEEP(*(.option_setting_ofs1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x04 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_ofs3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x10 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_banksel))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x40 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x44 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x48 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x4C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x60 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x64 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x68 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x6C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps3))\n        __OPTION_SETTING_NS_End = .;\n    } > OPTION_SETTING = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_S = ORIGIN(OPTION_SETTING_S);\n\n    .option_setting_s :\n    {\n        __OPTION_SETTING_S_Start = .;\n        KEEP(*(.option_setting_ofs1_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x04 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x10 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x40 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x44 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x48 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x4C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x60 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x64 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x68 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x6C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x80 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs1_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x84 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x90 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC0 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC4 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC8 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xCC : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel3))\n        __OPTION_SETTING_S_End = .;\n    } > OPTION_SETTING_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_N = __OPTION_SETTING_S_End;\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/script/memory_regions.ld",
    "content": "\n            /* generated memory regions file - do not edit */\n                            RAM_START  = 0x1FFE0000;\n                RAM_LENGTH = 0x40000;\n                FLASH_START  = 0x00000000;\n                FLASH_LENGTH = 0x80000;\n                DATA_FLASH_START  = 0x40100000;\n                DATA_FLASH_LENGTH = 0x2000;\n                OPTION_SETTING_START  = 0x00000000;\n                OPTION_SETTING_LENGTH = 0x0;\n                OPTION_SETTING_S_START  = 0x80000000;\n                OPTION_SETTING_S_LENGTH = 0x0;\n                ID_CODE_START  = 0x0100A150;\n                ID_CODE_LENGTH = 0x10;\n                SDRAM_START  = 0x80010000;\n                SDRAM_LENGTH = 0x0;\n                QSPI_FLASH_START  = 0x60000000;\n                QSPI_FLASH_LENGTH = 0x4000000;\n                OSPI_DEVICE_0_START  = 0x80020000;\n                OSPI_DEVICE_0_LENGTH = 0x0;\n                OSPI_DEVICE_1_START  = 0x80030000;\n                OSPI_DEVICE_1_LENGTH = 0x0;\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m1_ek/smart_configurator/configuration.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<raConfiguration version=\"9\">\n  <generalSettings>\n    <option key=\"#Board#\" value=\"board.ra6m1ek\"/>\n    <option key=\"CPU\" value=\"RA6M1\"/>\n    <option key=\"Core\" value=\"CM4\"/>\n    <option key=\"#TargetName#\" value=\"R7FA6M1AD3CFP\"/>\n    <option key=\"#TargetARCHITECTURE#\" value=\"cortex-m4\"/>\n    <option key=\"#DeviceCommand#\" value=\"R7FA6M1AD\"/>\n    <option key=\"#RTOS#\" value=\"_none\"/>\n    <option key=\"#pinconfiguration#\" value=\"R7FA6M1AD3CFP.pincfg\"/>\n    <option key=\"#FSPVersion#\" value=\"5.6.0\"/>\n    <option key=\"#ConfigurationFragments#\" value=\"Renesas##BSP##Board##ra6m1_ek##\"/>\n    <option key=\"#SELECTED_TOOLCHAIN#\" value=\"com.renesas.cdt.managedbuild.gnuarm.toolchain.\"/>\n  </generalSettings>\n  <raBspConfiguration>\n    <config id=\"config.bsp.ra6m1.R7FA6M1AD3CFP\">\n      <property id=\"config.bsp.part_number\" value=\"config.bsp.part_number.value\"/>\n      <property id=\"config.bsp.rom_size_bytes\" value=\"config.bsp.rom_size_bytes.value\"/>\n      <property id=\"config.bsp.rom_size_bytes_hidden\" value=\"524288\"/>\n      <property id=\"config.bsp.ram_size_bytes\" value=\"config.bsp.ram_size_bytes.value\"/>\n      <property id=\"config.bsp.data_flash_size_bytes\" value=\"config.bsp.data_flash_size_bytes.value\"/>\n      <property id=\"config.bsp.package_style\" value=\"config.bsp.package_style.value\"/>\n      <property id=\"config.bsp.package_pins\" value=\"config.bsp.package_pins.value\"/>\n      <property id=\"config.bsp.irq_count_hidden\" value=\"96\"/>\n    </config>\n    <config id=\"config.bsp.ra6m1\">\n      <property id=\"config.bsp.series\" value=\"config.bsp.series.value\"/>\n    </config>\n    <config id=\"config.bsp.ra6m1.fsp\">\n      <property id=\"config.bsp.fsp.inline_irq_functions\" value=\"config.bsp.common.inline_irq_functions.enabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_start_mode\" value=\"config.bsp.fsp.OFS0.iwdt_start_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_timeout\" value=\"config.bsp.fsp.OFS0.iwdt_timeout.2048\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_divisor\" value=\"config.bsp.fsp.OFS0.iwdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_end\" value=\"config.bsp.fsp.OFS0.iwdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_start\" value=\"config.bsp.fsp.OFS0.iwdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_stop_control\" value=\"config.bsp.fsp.OFS0.iwdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_start_mode\" value=\"config.bsp.fsp.OFS0.wdt_start_mode.register\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_timeout\" value=\"config.bsp.fsp.OFS0.wdt_timeout.16384\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_divisor\" value=\"config.bsp.fsp.OFS0.wdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_end\" value=\"config.bsp.fsp.OFS0.wdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_start\" value=\"config.bsp.fsp.OFS0.wdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.wdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_stop_control\" value=\"config.bsp.fsp.OFS0.wdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1.voltage_detection0.start.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1.voltage_detection0_level.280\"/>\n      <property id=\"config.bsp.fsp.OFS1.hoco_osc\" value=\"config.bsp.fsp.OFS1.hoco_osc.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_enable\" value=\"config.bsp.fsp.mpu_pc0_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_start\" value=\"0xFFFFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_end\" value=\"0xFFFFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_enable\" value=\"config.bsp.fsp.mpu_pc1_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_start\" value=\"0xFFFFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_end\" value=\"0xFFFFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_enable\" value=\"config.bsp.fsp.mpu_reg0_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_start\" value=\"0x00FFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_end\" value=\"0x00FFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_enable\" value=\"config.bsp.fsp.mpu_reg1_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_start\" value=\"0x200FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_end\" value=\"0x200FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_enable\" value=\"config.bsp.fsp.mpu_reg2_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_start\" value=\"0x407FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_end\" value=\"0x407FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_enable\" value=\"config.bsp.fsp.mpu_reg3_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_start\" value=\"0x400DFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_end\" value=\"0x400DFFFF\"/>\n      <property id=\"config.bsp.fsp.hoco_fll\" value=\"config.bsp.fsp.hoco_fll.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_wait\" value=\"config.bsp.common.main_osc_wait.wait_8163\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.max_freq_hz\" value=\"60000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.max_baud\" value=\"20000000\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sample_and_hold\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sensors_are_exclusive\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_spi.max_bitrate\" value=\"30000000\"/>\n      <property id=\"config.bsp.fsp.mcu.spi.max_bitrate\" value=\"30000000\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.fastplus_channels\" value=\"0x1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.fastplus_channels\" value=\"0x1\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.cstpen_channels\" value=\"0x0\"/>\n      <property id=\"config.bsp.fsp.mcu.gpt.pin_count_source_channels\" value=\"0xFFFF\"/>\n      <property id=\"config.bsp.common.id_mode\" value=\"config.bsp.common.id_mode.unlocked\"/>\n      <property id=\"config.bsp.common.id_code\" value=\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"/>\n      <property id=\"config.bsp.common.id1\" value=\"\"/>\n      <property id=\"config.bsp.common.id2\" value=\"\"/>\n      <property id=\"config.bsp.common.id3\" value=\"\"/>\n      <property id=\"config.bsp.common.id4\" value=\"\"/>\n      <property id=\"config.bsp.common.id_fixed\" value=\"\"/>\n    </config>\n    <config id=\"config.bsp.ra\">\n      <property id=\"config.bsp.common.main\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.heap\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.vcc\" value=\"3300\"/>\n      <property id=\"config.bsp.common.checking\" value=\"config.bsp.common.checking.disabled\"/>\n      <property id=\"config.bsp.common.assert\" value=\"config.bsp.common.assert.none\"/>\n      <property id=\"config.bsp.common.error_log\" value=\"config.bsp.common.error_log.none\"/>\n      <property id=\"config.bsp.common.soft_reset\" value=\"config.bsp.common.soft_reset.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_populated\" value=\"config.bsp.common.main_osc_populated.enabled\"/>\n      <property id=\"config.bsp.common.pfs_protect\" value=\"config.bsp.common.pfs_protect.enabled\"/>\n      <property id=\"config.bsp.common.c_runtime_init\" value=\"config.bsp.common.c_runtime_init.enabled\"/>\n      <property id=\"config.bsp.common.early_init\" value=\"config.bsp.common.early_init.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_clock_source\" value=\"config.bsp.common.main_osc_clock_source.crystal\"/>\n      <property id=\"config.bsp.common.subclock_populated\" value=\"config.bsp.common.subclock_populated.enabled\"/>\n      <property id=\"config.bsp.common.subclock_drive\" value=\"config.bsp.common.subclock_drive.standard\"/>\n      <property id=\"config.bsp.common.subclock_stabilization_ms\" value=\"1000\"/>\n    </config>\n  </raBspConfiguration>\n  <raClockConfiguration>\n    <node id=\"board.clock.xtal.freq\" mul=\"12000000\" option=\"_edit\"/>\n    <node id=\"board.clock.pll.source\" option=\"board.clock.pll.source.xtal\"/>\n    <node id=\"board.clock.hoco.freq\" option=\"board.clock.hoco.freq.20m\"/>\n    <node id=\"board.clock.loco.freq\" option=\"board.clock.loco.freq.32768\"/>\n    <node id=\"board.clock.moco.freq\" option=\"board.clock.moco.freq.8m\"/>\n    <node id=\"board.clock.subclk.freq\" option=\"board.clock.subclk.freq.32768\"/>\n    <node id=\"board.clock.pll.div\" option=\"board.clock.pll.div.1\"/>\n    <node id=\"board.clock.pll.mul\" option=\"board.clock.pll.mul.200\"/>\n    <node id=\"board.clock.pll.display\" option=\"board.clock.pll.display.value\"/>\n    <node id=\"board.clock.clock.source\" option=\"board.clock.clock.source.pll\"/>\n    <node id=\"board.clock.iclk.div\" option=\"board.clock.iclk.div.2\"/>\n    <node id=\"board.clock.iclk.display\" option=\"board.clock.iclk.display.value\"/>\n    <node id=\"board.clock.pclka.div\" option=\"board.clock.pclka.div.2\"/>\n    <node id=\"board.clock.pclka.display\" option=\"board.clock.pclka.display.value\"/>\n    <node id=\"board.clock.pclkb.div\" option=\"board.clock.pclkb.div.4\"/>\n    <node id=\"board.clock.pclkb.display\" option=\"board.clock.pclkb.display.value\"/>\n    <node id=\"board.clock.pclkc.div\" option=\"board.clock.pclkc.div.4\"/>\n    <node id=\"board.clock.pclkc.display\" option=\"board.clock.pclkc.display.value\"/>\n    <node id=\"board.clock.pclkd.div\" option=\"board.clock.pclkd.div.2\"/>\n    <node id=\"board.clock.pclkd.display\" option=\"board.clock.pclkd.display.value\"/>\n    <node id=\"board.clock.bclk.div\" option=\"board.clock.bclk.div.2\"/>\n    <node id=\"board.clock.bclk.display\" option=\"board.clock.bclk.display.value\"/>\n    <node id=\"board.clock.bclkout.div\" option=\"board.clock.bclkout.div.2\"/>\n    <node id=\"board.clock.bclkout.display\" option=\"board.clock.bclkout.display.value\"/>\n    <node id=\"board.clock.uclk.div\" option=\"board.clock.uclk.div.5\"/>\n    <node id=\"board.clock.uclk.display\" option=\"board.clock.uclk.display.value\"/>\n    <node id=\"board.clock.fclk.div\" option=\"board.clock.fclk.div.4\"/>\n    <node id=\"board.clock.fclk.display\" option=\"board.clock.fclk.display.value\"/>\n    <node id=\"board.clock.clkout.source\" option=\"board.clock.clkout.source.disabled\"/>\n    <node id=\"board.clock.clkout.div\" option=\"board.clock.clkout.div.1\"/>\n    <node id=\"board.clock.clkout.display\" option=\"board.clock.clkout.display.value\"/>\n  </raClockConfiguration>\n  <raComponentSelection>\n    <component apiversion=\"\" class=\"Projects\" condition=\"\" group=\"all\" subgroup=\"baremetal_blinky\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Simple application that blinks an LED. No RTOS included.</description>\n      <originalPack>Renesas.RA_baremetal_blinky.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"Common\" condition=\"\" group=\"all\" subgroup=\"fsp_common\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board Support Package Common Files</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_ioport\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>I/O Port</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"CMSIS\" condition=\"\" group=\"CMSIS5\" subgroup=\"CoreM\" variant=\"\" vendor=\"Arm\" version=\"6.1.0+fsp.5.6.0\">\n      <description>Arm CMSIS Version 6 - Core (M)</description>\n      <originalPack>Arm.CMSIS6.6.1.0+fsp.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"Board\" subgroup=\"ra6m1_ek\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>RA6M1-EK Board Support Files</description>\n      <originalPack>Renesas.RA_board_ra6m1_ek.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m1\" subgroup=\"device\" variant=\"R7FA6M1AD3CFP\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for R7FA6M1AD3CFP</description>\n      <originalPack>Renesas.RA_mcu_ra6m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m1\" subgroup=\"device\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M1</description>\n      <originalPack>Renesas.RA_mcu_ra6m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m1\" subgroup=\"fsp\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M1 - FSP Data</description>\n      <originalPack>Renesas.RA_mcu_ra6m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m1\" subgroup=\"events\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M1 - Events</description>\n      <originalPack>Renesas.RA_mcu_ra6m1.5.6.0.pack</originalPack>\n    </component>\n  </raComponentSelection>\n  <raElcConfiguration/>\n  <raIcuConfiguration/>\n  <raModuleConfiguration>\n    <module id=\"module.driver.ioport_on_ioport.0\">\n      <property id=\"module.driver.ioport.name\" value=\"g_ioport\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport1\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport2\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport3\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport4\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.pincfg\" value=\"g_bsp_pin_cfg\"/>\n    </module>\n    <context id=\"_hal.0\">\n      <stack module=\"module.driver.ioport_on_ioport.0\"/>\n    </context>\n    <config id=\"config.driver.ioport\">\n      <property id=\"config.driver.ioport.checking\" value=\"config.driver.ioport.checking.system\"/>\n    </config>\n  </raModuleConfiguration>\n  <raPinConfiguration>\n    <symbolicName propertyId=\"p112.symbolic_name\" value=\"LED1\"/>\n    <symbolicName propertyId=\"p415.symbolic_name\" value=\"SW1\"/>\n    <pincfg active=\"true\" name=\"RA6M1-EK.pincfg\" selected=\"true\" symbol=\"g_bsp_pin_cfg\">\n      <configSetting altId=\"adc1.an00.p004\" configurationId=\"adc1.an00\"/>\n      <configSetting altId=\"adc1.mode.custom\" configurationId=\"adc1.mode\"/>\n      <configSetting altId=\"ctsu0.mode.enabled\" configurationId=\"ctsu0.mode\"/>\n      <configSetting altId=\"ctsu0.ts02.p207\" configurationId=\"ctsu0.ts02\"/>\n      <configSetting altId=\"ctsu0.tscap.p205\" configurationId=\"ctsu0.tscap\"/>\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"p004.asel\" configurationId=\"p004\"/>\n      <configSetting altId=\"p004.gpio_mode.gpio_mode_an\" configurationId=\"p004.gpio_mode\"/>\n      <configSetting altId=\"p100.spi0.miso\" configurationId=\"p100\"/>\n      <configSetting altId=\"p100.gpio_mode.gpio_mode_peripheral\" configurationId=\"p100.gpio_mode\"/>\n      <configSetting altId=\"p101.spi0.mosi\" configurationId=\"p101\"/>\n      <configSetting altId=\"p101.gpio_mode.gpio_mode_peripheral\" configurationId=\"p101.gpio_mode\"/>\n      <configSetting altId=\"p102.spi0.rspck\" configurationId=\"p102\"/>\n      <configSetting altId=\"p102.gpio_mode.gpio_mode_peripheral\" configurationId=\"p102.gpio_mode\"/>\n      <configSetting altId=\"p103.spi0.ssl0\" configurationId=\"p103\"/>\n      <configSetting altId=\"p103.gpio_mode.gpio_mode_peripheral\" configurationId=\"p103.gpio_mode\"/>\n      <configSetting altId=\"p104.sci8.rxd\" configurationId=\"p104\"/>\n      <configSetting altId=\"p104.gpio_mode.gpio_mode_peripheral\" configurationId=\"p104.gpio_mode\"/>\n      <configSetting altId=\"p105.sci8.txd\" configurationId=\"p105\"/>\n      <configSetting altId=\"p105.gpio_mode.gpio_mode_peripheral\" configurationId=\"p105.gpio_mode\"/>\n      <configSetting altId=\"p106.output.low\" configurationId=\"p106\"/>\n      <configSetting altId=\"p106.gpio_mode.gpio_mode_out.low\" configurationId=\"p106.gpio_mode\"/>\n      <configSetting altId=\"p107.output.low\" configurationId=\"p107\"/>\n      <configSetting altId=\"p107.gpio_mode.gpio_mode_out.low\" configurationId=\"p107.gpio_mode\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p112.output.low\" configurationId=\"p112\"/>\n      <configSetting altId=\"p112.gpio_mode.gpio_mode_out.low\" configurationId=\"p112.gpio_mode\"/>\n      <configSetting altId=\"p201.input\" configurationId=\"p201\"/>\n      <configSetting altId=\"p201.gpio_mode.gpio_mode_in\" configurationId=\"p201.gpio_mode\"/>\n      <configSetting altId=\"p205.ctsu0.tscap\" configurationId=\"p205\"/>\n      <configSetting altId=\"p205.gpio_mode.gpio_mode_peripheral\" configurationId=\"p205.gpio_mode\"/>\n      <configSetting altId=\"p207.ctsu0.ts02\" configurationId=\"p207\"/>\n      <configSetting altId=\"p207.gpio_mode.gpio_mode_peripheral\" configurationId=\"p207.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n      <configSetting altId=\"p407.usbfs0.vbus\" configurationId=\"p407\"/>\n      <configSetting altId=\"p407.gpio_mode.gpio_mode_peripheral\" configurationId=\"p407.gpio_mode\"/>\n      <configSetting altId=\"p415.input\" configurationId=\"p415\"/>\n      <configSetting altId=\"p415.gpio_mode.gpio_mode_in\" configurationId=\"p415.gpio_mode\"/>\n      <configSetting altId=\"p415.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p415.gpio_pupd\"/>\n      <configSetting altId=\"sci8.mode.asynchronous.free\" configurationId=\"sci8.mode\"/>\n      <configSetting altId=\"sci8.rxd.p104\" configurationId=\"sci8.rxd\"/>\n      <configSetting altId=\"sci8.txd.p105\" configurationId=\"sci8.txd\"/>\n      <configSetting altId=\"spi0.miso.p100\" configurationId=\"spi0.miso\"/>\n      <configSetting altId=\"spi0.mode.enabled.a\" configurationId=\"spi0.mode\"/>\n      <configSetting altId=\"spi0.mosi.p101\" configurationId=\"spi0.mosi\"/>\n      <configSetting altId=\"spi0.rspck.p102\" configurationId=\"spi0.rspck\"/>\n      <configSetting altId=\"spi0.ssl0.p103\" configurationId=\"spi0.ssl0\"/>\n      <configSetting altId=\"usbfs0.mode.device\" configurationId=\"usbfs0.mode\"/>\n      <configSetting altId=\"usbfs0.vbus.p407\" configurationId=\"usbfs0.vbus\"/>\n    </pincfg>\n    <pincfg active=\"false\" name=\"R7FA6M1AD3CFP.pincfg\" selected=\"false\" symbol=\"\">\n      <configSetting altId=\"debug0.mode.jtag\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.tck.p300\" configurationId=\"debug0.tck\"/>\n      <configSetting altId=\"debug0.tdi.p110\" configurationId=\"debug0.tdi\"/>\n      <configSetting altId=\"debug0.tdo.p109\" configurationId=\"debug0.tdo\"/>\n      <configSetting altId=\"debug0.tms.p108\" configurationId=\"debug0.tms\"/>\n      <configSetting altId=\"p108.debug0.tms\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p109.debug0.tdo\" configurationId=\"p109\"/>\n      <configSetting altId=\"p109.gpio_mode.gpio_mode_peripheral\" configurationId=\"p109.gpio_mode\"/>\n      <configSetting altId=\"p110.debug0.tdi\" configurationId=\"p110\"/>\n      <configSetting altId=\"p110.gpio_mode.gpio_mode_peripheral\" configurationId=\"p110.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.tck\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n    </pincfg>\n  </raPinConfiguration>\n</raConfiguration>\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\nset(MCU_VARIANT ra6m5)\n\nset(JLINK_DEVICE R7FA6M5BH)\nset(JLINK_OPTION \"-USB 000831915224\")\n\n# device default to PORT 1 High Speed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: RA6M5 EK\n   url: https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra6m5-evaluation-kit-ra6m5-mcu-group\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_STATE_ON          1\n#define BUTTON_STATE_ACTIVE   0\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/board.mk",
    "content": "CPU_CORE = cortex-m33\nMCU_VARIANT = ra6m5\n\n# For flash-jlink target\nJLINK_DEVICE = R7FA6M5BH\n\n# Port 1 is highspeed\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ozone/ra6m5.jdebug",
    "content": "\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n  Project.AddSvdFile (\"Cortex-M33.svd\");\n  Project.AddSvdFile (\"./R7FA6M5BH.svd\");\n\n  Project.SetDevice (\"R7FA6M5BH\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"50 MHz\");\n\n  Project.SetTraceSource (\"Trace Pins\");\n  Project.SetTracePortWidth (4);\n\n  File.Open (\"../../../../../../examples/cmake-build-ra6m5_ek/device/cdc_msc/cdc_msc.elf\");\n}\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n**********************************************************************\n*/\nvoid BeforeTargetConnect (void) {\n  // Trace pin init is done by J-Link script file as J-Link script files are IDE independent\n\tProject.SetJLinkScript(\"../../../debug.jlinkscript\");\n}\n\n/*********************************************************************\n*\n*       AfterTargetReset\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetReset (void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n\n  if (VectorTableAddr != 0xFFFFFFFF) {\n    SP = Target.ReadU32(VectorTableAddr);\n    Target.SetReg(\"SP\", SP);\n  } else {\n    Util.Log(\"Project file error: failed to get program base\");\n  }\n\n  PC = Elf.GetEntryPointPC();\n\n  if (PC != 0xFFFFFFFF) {\n    Target.SetReg(\"PC\", PC);\n  } else if (VectorTableAddr != 0xFFFFFFFF) {\n    PC = Target.ReadU32(VectorTableAddr + 4);\n    Target.SetReg(\"PC\", PC);\n  }\n}\n\n/*********************************************************************\n*\n*      AfterTargetDownload\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetDownload (void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n\n  if (VectorTableAddr != 0xFFFFFFFF) {\n    SP = Target.ReadU32(VectorTableAddr);\n    Target.SetReg(\"SP\", SP);\n  } else {\n    Util.Log(\"Project file error: failed to get program base\");\n  }\n\n  PC = Elf.GetEntryPointPC();\n\n  if (PC != 0xFFFFFFFF) {\n    Target.SetReg(\"PC\", PC);\n  } else if (VectorTableAddr != 0xFFFFFFFF) {\n    PC = Target.ReadU32(VectorTableAddr + 4);\n    Target.SetReg(\"PC\", PC);\n  }\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_cfg/fsp_cfg/bsp/bsp_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CFG_H_\n#define BSP_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_clock_cfg.h\"\n            #include \"bsp_mcu_family_cfg.h\"\n            #include \"board_cfg.h\"\n            #define RA_NOT_DEFINED 0\n            #ifndef BSP_CFG_RTOS\n             #if (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (2)\n             #elif (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (1)\n             #else\n              #define BSP_CFG_RTOS (0)\n             #endif\n            #endif\n            #ifndef BSP_CFG_RTC_USED\n             #define BSP_CFG_RTC_USED (RA_NOT_DEFINED)\n            #endif\n            #undef RA_NOT_DEFINED\n            #if defined(_RA_BOOT_IMAGE)\n             #define BSP_CFG_BOOT_IMAGE (1)\n            #endif\n            #define BSP_CFG_MCU_VCC_MV (3300)\n            #define BSP_CFG_STACK_MAIN_BYTES (0x1000)\n            #define BSP_CFG_HEAP_BYTES (0x1000)\n            #define BSP_CFG_PARAM_CHECKING_ENABLE (0)\n            #define BSP_CFG_ASSERT (0)\n            #define BSP_CFG_ERROR_LOG (0)\n\n            #define BSP_CFG_PFS_PROTECT ((1))\n\n            #define BSP_CFG_C_RUNTIME_INIT ((1))\n            #define BSP_CFG_EARLY_INIT     ((0))\n\n            #define BSP_CFG_STARTUP_CLOCK_REG_NOT_RESET ((0))\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_POPULATED\n            #define BSP_CLOCK_CFG_MAIN_OSC_POPULATED (1)\n            #endif\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE\n            #define BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_DRIVE\n            #define BSP_CLOCK_CFG_SUBCLOCK_DRIVE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_POPULATED\n            #define BSP_CLOCK_CFG_SUBCLOCK_POPULATED (1)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS\n            #define BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS 1000\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_CFG_H_\n#define BSP_MCU_DEVICE_CFG_H_\n#define BSP_CFG_MCU_PART_SERIES (6)\n#endif /* BSP_MCU_DEVICE_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_pn_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_R7FA6M5BH3CFC\n      #define BSP_MCU_FEATURE_SET ('B')\n      #define BSP_ROM_SIZE_BYTES (2097152)\n      #define BSP_RAM_SIZE_BYTES (524288)\n      #define BSP_DATA_FLASH_SIZE_BYTES (8192)\n      #define BSP_PACKAGE_LQFP\n      #define BSP_PACKAGE_PINS (176)\n#endif /* BSP_MCU_DEVICE_PN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_family_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_FAMILY_CFG_H_\n#define BSP_MCU_FAMILY_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n            #include \"bsp_mcu_device_pn_cfg.h\"\n            #include \"bsp_mcu_device_cfg.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra6m5/bsp_mcu_info.h\"\n            #include \"bsp_clock_cfg.h\"\n            #define BSP_MCU_GROUP_RA6M5 (1)\n            #define BSP_LOCO_HZ                 (32768)\n            #define BSP_MOCO_HZ                 (8000000)\n            #define BSP_SUB_CLOCK_HZ            (32768)\n            #if   BSP_CFG_HOCO_FREQUENCY == 0\n                #define BSP_HOCO_HZ                 (16000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 1\n                #define BSP_HOCO_HZ                 (18000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 2\n                #define BSP_HOCO_HZ                 (20000000)\n            #else\n                #error \"Invalid HOCO frequency chosen (BSP_CFG_HOCO_FREQUENCY) in bsp_clock_cfg.h\"\n            #endif\n\n            #define BSP_CFG_FLL_ENABLE                 (0)\n\n            #define BSP_CORTEX_VECTOR_TABLE_ENTRIES    (16U)\n            #define BSP_VECTOR_TABLE_MAX_ENTRIES       (112U)\n            #define BSP_CFG_INLINE_IRQ_FUNCTIONS       (1)\n\n            #if defined(_RA_TZ_SECURE)\n            #define BSP_TZ_SECURE_BUILD           (1)\n            #define BSP_TZ_NONSECURE_BUILD        (0)\n            #elif defined(_RA_TZ_NONSECURE)\n            #define BSP_TZ_SECURE_BUILD           (0)\n            #define BSP_TZ_NONSECURE_BUILD        (1)\n            #else\n            #define BSP_TZ_SECURE_BUILD           (0)\n            #define BSP_TZ_NONSECURE_BUILD        (0)\n            #endif\n\n            /* TrustZone Settings */\n            #define BSP_TZ_CFG_INIT_SECURE_ONLY       (BSP_CFG_CLOCKS_SECURE || (!BSP_CFG_CLOCKS_OVERRIDE))\n            #define BSP_TZ_CFG_SKIP_INIT              (BSP_TZ_NONSECURE_BUILD && BSP_TZ_CFG_INIT_SECURE_ONLY)\n            #define BSP_TZ_CFG_EXCEPTION_RESPONSE     (0)\n\n            /* CMSIS TrustZone Settings */\n            #define SCB_CSR_AIRCR_INIT                (1)\n            #define SCB_AIRCR_BFHFNMINS_VAL           (0)\n            #define SCB_AIRCR_SYSRESETREQS_VAL        (1)\n            #define SCB_AIRCR_PRIS_VAL                (0)\n            #define TZ_FPU_NS_USAGE                   (1)\n#ifndef SCB_NSACR_CP10_11_VAL\n            #define SCB_NSACR_CP10_11_VAL             (3U)\n#endif\n\n#ifndef FPU_FPCCR_TS_VAL\n            #define FPU_FPCCR_TS_VAL                  (1U)\n#endif\n            #define FPU_FPCCR_CLRONRETS_VAL           (1)\n\n#ifndef FPU_FPCCR_CLRONRET_VAL\n            #define FPU_FPCCR_CLRONRET_VAL            (1)\n#endif\n\n            /* The C-Cache line size that is configured during startup. */\n#ifndef BSP_CFG_C_CACHE_LINE_SIZE\n            #define BSP_CFG_C_CACHE_LINE_SIZE   (1U)\n#endif\n\n            /* Type 1 Peripheral Security Attribution */\n\n            /* Peripheral Security Attribution Register (PSAR) Settings */\n#ifndef BSP_TZ_CFG_PSARB\n#define BSP_TZ_CFG_PSARB (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* CAN1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* CAN0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* IIC1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9) /* IIC0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* USBFS */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 18) /* SPI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 19) /* SPI0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* SCI9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 23) /* SCI8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 24) /* SCI7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 25) /* SCI6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 26) /* SCI5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* SCI4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* SCI3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 29) /* SCI2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 30) /* SCI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* SCI0 */ | \\\n            0x33f4f9) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARC\n#define BSP_TZ_CFG_PSARC (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* CAC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* CRC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3) /* CTSU */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* SSIE0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* SDHI0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13) /* DOC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* SCE9 */ | \\\n            0x7fffcef4) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARD\n#define BSP_TZ_CFG_PSARD (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* AGT3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* AGT2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* AGT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3) /* AGT0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* POEG3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* POEG2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13) /* POEG1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14) /* POEG0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15) /* ADC1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 16) /* ADC0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 20) /* DAC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* TSN */ | \\\n            0xffae07f0) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_PSARE\n#define BSP_TZ_CFG_PSARE (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* WDT */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* IWDT */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* RTC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14) /* AGT5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15) /* AGT4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* GPT9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 23) /* GPT8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 24) /* GPT7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 25) /* GPT6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 26) /* GPT5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* GPT4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* GPT3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 29) /* GPT2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 30) /* GPT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* GPT0 */ | \\\n            0x3f3ff8) /* Unused */\n#endif\n#ifndef BSP_TZ_CFG_MSSAR\n#define BSP_TZ_CFG_MSSAR (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* ELC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* DTC_DMAC */ | \\\n            0xfffffffc) /* Unused */\n#endif\n\n            /* Type 2 Peripheral Security Attribution */\n\n            /* Security attribution for Cache registers. */\n#ifndef BSP_TZ_CFG_CSAR\n#define BSP_TZ_CFG_CSAR (0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for RSTSRn registers. */\n#ifndef BSP_TZ_CFG_RSTSAR\n#define BSP_TZ_CFG_RSTSAR (0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for registers of LVD channels. */\n#ifndef BSP_TZ_CFG_LVDSAR\n#define BSP_TZ_CFG_LVDSAR (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) | /* LVD Channel 1 */ \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) | /* LVD Channel 2 */ \\\n            0xFFFFFFFCU)\n#endif\n\n            /* Security attribution for LPM registers. */\n#ifndef BSP_TZ_CFG_LPMSAR\n#define BSP_TZ_CFG_LPMSAR ((RA_NOT_DEFINED > 0) ? 0xFFFFFCEAU : 0xFFFFFFFFU)\n#endif\n            /* Deep Standby Interrupt Factor Security Attribution Register. */\n#ifndef BSP_TZ_CFG_DPFSAR\n#define BSP_TZ_CFG_DPFSAR ((RA_NOT_DEFINED > 0) ? 0xF2E00000U : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution for CGC registers. */\n#ifndef BSP_TZ_CFG_CGFSAR\n#if BSP_CFG_CLOCKS_SECURE\n/* Protect all CGC registers from Non-secure write access. */\n#define BSP_TZ_CFG_CGFSAR (0xFFFCE402U)\n#else\n/* Allow Secure and Non-secure write access. */\n#define BSP_TZ_CFG_CGFSAR (0xFFFFFFFFU)\n#endif\n#endif\n\n            /* Security attribution for Battery Backup registers. */\n#ifndef BSP_TZ_CFG_BBFSAR\n#define BSP_TZ_CFG_BBFSAR (0x00FFFFFF)\n#endif\n\n            /* Security attribution for registers for IRQ channels. */\n#ifndef BSP_TZ_CFG_ICUSARA\n#define BSP_TZ_CFG_ICUSARA (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0U) /* External IRQ0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1U) /* External IRQ1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2U) /* External IRQ2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3U) /* External IRQ3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4U) /* External IRQ4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5U) /* External IRQ5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 6U) /* External IRQ6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7U) /* External IRQ7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8U) /* External IRQ8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9U) /* External IRQ9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 10U) /* External IRQ10 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11U) /* External IRQ11 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12U) /* External IRQ12 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13U) /* External IRQ13 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14U) /* External IRQ14 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15U) /* External IRQ15 */ | \\\n            0xFFFF0000U)\n#endif\n\n            /* Security attribution for NMI registers. */\n#ifndef BSP_TZ_CFG_ICUSARB\n#define BSP_TZ_CFG_ICUSARB (0 | 0xFFFFFFFEU) /* Should match AIRCR.BFHFNMINS. */\n#endif\n\n            /* Security attribution for registers for DMAC channels */\n#ifndef BSP_TZ_CFG_ICUSARC\n#define BSP_TZ_CFG_ICUSARC (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0U) /* DMAC Channel 0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1U) /* DMAC Channel 1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2U) /* DMAC Channel 2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3U) /* DMAC Channel 3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4U) /* DMAC Channel 4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5U) /* DMAC Channel 5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 6U) /* DMAC Channel 6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7U) /* DMAC Channel 7 */ | \\\n            0xFFFFFF00U)\n#endif\n\n            /* Security attribution registers for SELSR0. */\n#ifndef BSP_TZ_CFG_ICUSARD\n#define BSP_TZ_CFG_ICUSARD ((RA_NOT_DEFINED > 0) ? 0xFFFFFFFEU : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution registers for WUPEN0. */\n#ifndef BSP_TZ_CFG_ICUSARE\n#define BSP_TZ_CFG_ICUSARE ((RA_NOT_DEFINED > 0) ? 0x04F2FFFFU : 0xFFFFFFFFU)\n#endif\n\n            /* Security attribution registers for WUPEN1. */\n#ifndef BSP_TZ_CFG_ICUSARF\n#define BSP_TZ_CFG_ICUSARF ((RA_NOT_DEFINED > 0) ? 0xFFFFFFF8U : 0xFFFFFFFFU)\n#endif\n\n            /* Set DTCSTSAR if the Secure program uses the DTC. */\n#if RA_NOT_DEFINED == RA_NOT_DEFINED\n #define BSP_TZ_CFG_DTC_USED (0U)\n#else\n #define BSP_TZ_CFG_DTC_USED (1U)\n#endif\n\n            /* Security attribution of FLWT and FCKMHZ registers. */\n#ifndef BSP_TZ_CFG_FSAR\n/* If the CGC registers are only accessible in Secure mode, than there is no\n * reason for nonsecure applications to access FLWT and FCKMHZ. */\n#if BSP_CFG_CLOCKS_SECURE\n/* Protect FLWT and FCKMHZ registers from nonsecure write access. */\n#define BSP_TZ_CFG_FSAR (0xFEFEU)\n#else\n/* Allow Secure and Non-secure write access. */\n#define BSP_TZ_CFG_FSAR (0xFFFFU)\n#endif\n#endif\n\n            /* Security attribution for SRAM registers. */\n#ifndef BSP_TZ_CFG_SRAMSAR\n/* If the CGC registers are only accessible in Secure mode, than there is no reason for Non Secure applications to access\n * SRAM0WTEN and therefore there is no reason to access PRCR2. */\n    #define BSP_TZ_CFG_SRAMSAR (\\\n        1 | \\\n        ((BSP_CFG_CLOCKS_SECURE == 0) ? (1U << 1U) : 0U) | \\\n        4 | \\\n        0xFFFFFFF8U)\n#endif\n\n            /* Security attribution for Standby RAM registers. */\n#ifndef BSP_TZ_CFG_STBRAMSAR\n    #define BSP_TZ_CFG_STBRAMSAR (0 | 0xFFFFFFF0U)\n#endif\n\n            /* Security attribution for the DMAC Bus Master MPU settings. */\n#ifndef BSP_TZ_CFG_MMPUSARA\n    /* The DMAC Bus Master MPU settings should align with the DMAC channel settings. */\n    #define BSP_TZ_CFG_MMPUSARA (BSP_TZ_CFG_ICUSARC)\n#endif\n\n            /* Security Attribution Register A for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARA\n    #define BSP_TZ_CFG_BUSSARA (0xFFFFFFFFU)\n#endif\n            /* Security Attribution Register B for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARB\n    #define BSP_TZ_CFG_BUSSARB (0xFFFFFFFFU)\n#endif\n\n            /* Enable Uninitialized Non-Secure Application Fallback. */\n#ifndef BSP_TZ_CFG_NON_SECURE_APPLICATION_FALLBACK\n    #define BSP_TZ_CFG_NON_SECURE_APPLICATION_FALLBACK (1U)\n#endif\n\n\n            #define OFS_SEQ1 0xA001A001 | (1 << 1) | (3 << 2)\n            #define OFS_SEQ2 (15 << 4) | (3 << 8) | (3 << 10)\n            #define OFS_SEQ3 (1 << 12) | (1 << 14) | (1 << 17)\n            #define OFS_SEQ4 (3 << 18) |(15 << 20) | (3 << 24) | (3 << 26)\n            #define OFS_SEQ5 (1 << 28) | (1 << 30)\n            #define BSP_CFG_ROM_REG_OFS0 (OFS_SEQ1 | OFS_SEQ2 | OFS_SEQ3 | OFS_SEQ4 | OFS_SEQ5)\n\n            /* Option Function Select Register 1 Security Attribution */\n#ifndef BSP_CFG_ROM_REG_OFS1_SEL\n#if defined(_RA_TZ_SECURE) || defined(_RA_TZ_NONSECURE)\n            #define BSP_CFG_ROM_REG_OFS1_SEL (0xFFFFF8F8U | ((0U << 0U)) | ((0U << 2U)) | ((BSP_CFG_CLOCKS_SECURE == 0) ? 0x700U : 0U))\n#else\n            #define BSP_CFG_ROM_REG_OFS1_SEL (0xFFFFF8F8U)\n#endif\n#endif\n\n            #define BSP_CFG_ROM_REG_OFS1 (0xFFFFFEF8 | (1 << 2) | (3) |  (1 << 8))\n\n            /* Used to create IELS values for the interrupt initialization table g_interrupt_event_link_select. */\n            #define BSP_PRV_IELS_ENUM(vector)    (ELC_ ## vector)\n\n            /* Dual Mode Select Register */\n#ifndef BSP_CFG_ROM_REG_DUALSEL\n            #define BSP_CFG_ROM_REG_DUALSEL (0xFFFFFFF8U | (0x7U))\n#endif\n\n            /* Block Protection Register 0 */\n#ifndef BSP_CFG_ROM_REG_BPS0\n            #define BSP_CFG_ROM_REG_BPS0 (~( 0U))\n#endif\n            /* Block Protection Register 1 */\n#ifndef BSP_CFG_ROM_REG_BPS1\n            #define BSP_CFG_ROM_REG_BPS1 (~( 0U))\n#endif\n            /* Block Protection Register 2 */\n#ifndef BSP_CFG_ROM_REG_BPS2\n            #define BSP_CFG_ROM_REG_BPS2 (~( 0U))\n#endif\n            /* Block Protection Register 3 */\n#ifndef BSP_CFG_ROM_REG_BPS3\n            #define BSP_CFG_ROM_REG_BPS3 (0xFFFFFFFFU)\n#endif\n            /* Permanent Block Protection Register 0 */\n#ifndef BSP_CFG_ROM_REG_PBPS0\n            #define BSP_CFG_ROM_REG_PBPS0 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 1 */\n#ifndef BSP_CFG_ROM_REG_PBPS1\n            #define BSP_CFG_ROM_REG_PBPS1 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 2 */\n#ifndef BSP_CFG_ROM_REG_PBPS2\n            #define BSP_CFG_ROM_REG_PBPS2 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 3 */\n#ifndef BSP_CFG_ROM_REG_PBPS3\n            #define BSP_CFG_ROM_REG_PBPS3 (0xFFFFFFFFU)\n#endif\n            /* Security Attribution for Block Protection Register 0 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL0\n            #define BSP_CFG_ROM_REG_BPS_SEL0 (BSP_CFG_ROM_REG_BPS0 & BSP_CFG_ROM_REG_PBPS0)\n#endif\n            /* Security Attribution for Block Protection Register 1 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL1\n            #define BSP_CFG_ROM_REG_BPS_SEL1 (BSP_CFG_ROM_REG_BPS1 & BSP_CFG_ROM_REG_PBPS1)\n#endif\n            /* Security Attribution for Block Protection Register 2 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL2\n            #define BSP_CFG_ROM_REG_BPS_SEL2 (BSP_CFG_ROM_REG_BPS2 & BSP_CFG_ROM_REG_PBPS2)\n#endif\n            /* Security Attribution for Block Protection Register 3 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL3\n            #define BSP_CFG_ROM_REG_BPS_SEL3 (BSP_CFG_ROM_REG_BPS3 & BSP_CFG_ROM_REG_PBPS3)\n#endif\n            /* Security Attribution for Bank Select Register */\n#ifndef BSP_CFG_ROM_REG_BANKSEL_SEL\n            #define BSP_CFG_ROM_REG_BANKSEL_SEL (0xFFFFFFFFU)\n#endif\n#ifndef BSP_CLOCK_CFG_MAIN_OSC_WAIT\n            #define BSP_CLOCK_CFG_MAIN_OSC_WAIT (9)\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* BSP_MCU_FAMILY_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_cfg/fsp_cfg/bsp/bsp_pin_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_PIN_CFG_H_\n#define BSP_PIN_CFG_H_\n#include \"r_ioport.h\"\n\n/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */\nFSP_HEADER\n\n#define MIKROBUS_AN_ARDUINO_A0 (BSP_IO_PORT_00_PIN_00)\n#define ARDUINO_A1 (BSP_IO_PORT_00_PIN_01)\n#define ARDUINO_A2 (BSP_IO_PORT_00_PIN_02)\n#define ARDUINO_A3 (BSP_IO_PORT_00_PIN_03)\n#define SW2 (BSP_IO_PORT_00_PIN_04)\n#define SW1 (BSP_IO_PORT_00_PIN_05)\n#define LED1 (BSP_IO_PORT_00_PIN_06)\n#define LED2 (BSP_IO_PORT_00_PIN_07)\n#define LED3 (BSP_IO_PORT_00_PIN_08)\n#define ARDUINO_A4 (BSP_IO_PORT_00_PIN_14)\n#define ARDUINO_A5 (BSP_IO_PORT_00_PIN_15)\n#define OSPI_CLK (BSP_IO_PORT_01_PIN_00)\n#define OSPI_SIO7 (BSP_IO_PORT_01_PIN_01)\n#define OSPI_SIO1 (BSP_IO_PORT_01_PIN_02)\n#define OSPI_SIO6 (BSP_IO_PORT_01_PIN_03)\n#define OSPI_DQS (BSP_IO_PORT_01_PIN_04)\n#define OSPI_SIO5 (BSP_IO_PORT_01_PIN_05)\n#define OSPI_SIO0 (BSP_IO_PORT_01_PIN_06)\n#define OSPI_SIO3 (BSP_IO_PORT_01_PIN_07)\n#define MIKROBUS_PWM_ARDUINO_D3_PWM (BSP_IO_PORT_01_PIN_11)\n#define ARDUINO_D4 (BSP_IO_PORT_01_PIN_12)\n#define ARDUINO_D5 (BSP_IO_PORT_01_PIN_13)\n#define ARDUINO_D6 (BSP_IO_PORT_01_PIN_14)\n#define ARDUINO_D9 (BSP_IO_PORT_01_PIN_15)\n#define MIKROBUS_MISO_ARDUINO_MISO_PMOD1_MISO (BSP_IO_PORT_02_PIN_02)\n#define MIKROBUS_MOSI_ARDUINO_MOSI_PMOD1_MOSI (BSP_IO_PORT_02_PIN_03)\n#define MIKROBUS_SCK_ARDUINO_SCK_PMOD1_SCK (BSP_IO_PORT_02_PIN_04)\n#define MIKROBUS_SS_ARDUINO_SS (BSP_IO_PORT_02_PIN_05)\n#define PMOD1_SS (BSP_IO_PORT_02_PIN_06)\n#define ARDUINO_D8 (BSP_IO_PORT_02_PIN_07)\n#define PMOD1_SS2 (BSP_IO_PORT_03_PIN_01)\n#define PMOD1_SS3 (BSP_IO_PORT_03_PIN_02)\n#define MIKROBUS_RESET_ARDUINO_RESET (BSP_IO_PORT_03_PIN_03)\n#define QSPI_CLK (BSP_IO_PORT_03_PIN_05)\n#define QSPI_CS (BSP_IO_PORT_03_PIN_06)\n#define QSPI_IO0 (BSP_IO_PORT_03_PIN_07)\n#define QSPI_IO1 (BSP_IO_PORT_03_PIN_08)\n#define QSPI_IO2 (BSP_IO_PORT_03_PIN_09)\n#define QSPI_IO3 (BSP_IO_PORT_03_PIN_10)\n#define PMOD1_RST (BSP_IO_PORT_03_PIN_11)\n#define PMOD2_INT (BSP_IO_PORT_04_PIN_00)\n#define ETH_MDC (BSP_IO_PORT_04_PIN_01)\n#define ETH_MDIO (BSP_IO_PORT_04_PIN_02)\n#define ETH_RST (BSP_IO_PORT_04_PIN_03)\n#define PMOD2_RST (BSP_IO_PORT_04_PIN_04)\n#define ETH_TXEN (BSP_IO_PORT_04_PIN_05)\n#define ETH_TXD1 (BSP_IO_PORT_04_PIN_06)\n#define USBFS_VBUS (BSP_IO_PORT_04_PIN_07)\n#define PMOD2_SS2 (BSP_IO_PORT_04_PIN_08)\n#define MIKROBUS_INT_ARDUINO_INT0 (BSP_IO_PORT_04_PIN_09)\n#define PMOD2_MISO (BSP_IO_PORT_04_PIN_10)\n#define PMOD2_MOSI (BSP_IO_PORT_04_PIN_11)\n#define PMOD2_SCK (BSP_IO_PORT_04_PIN_12)\n#define PMOS2_SS (BSP_IO_PORT_04_PIN_13)\n#define GROVE1_SDA_QWIIC_SDA (BSP_IO_PORT_04_PIN_14)\n#define GROVE1_SCL_QWIIC_SCL (BSP_IO_PORT_04_PIN_15)\n#define USBFS_VBUS_EN (BSP_IO_PORT_05_PIN_00)\n#define USBFS_OVERCURA (BSP_IO_PORT_05_PIN_01)\n#define GROVE2_SCL (BSP_IO_PORT_05_PIN_05)\n#define GROVE2_SDA (BSP_IO_PORT_05_PIN_06)\n#define MIKROBUS_SDA_ARDUINO_SDA (BSP_IO_PORT_05_PIN_11)\n#define MIKROBUS_SCL_ARDUINO_SCL (BSP_IO_PORT_05_PIN_12)\n#define OSPI_SIO4 (BSP_IO_PORT_06_PIN_00)\n#define OSPI_SIO2 (BSP_IO_PORT_06_PIN_01)\n#define OSPI_CS1 (BSP_IO_PORT_06_PIN_02)\n#define ARDUINO_D7 (BSP_IO_PORT_06_PIN_08)\n#define CAN_TXD (BSP_IO_PORT_06_PIN_09)\n#define CAN_RDX (BSP_IO_PORT_06_PIN_10)\n#define CAN_STBY (BSP_IO_PORT_06_PIN_11)\n#define MIKROBUS_TX_ARDUINO_TX (BSP_IO_PORT_06_PIN_13)\n#define MIKROBUS_RX_ARDUINO_RX (BSP_IO_PORT_06_PIN_14)\n#define OSPI_RST (BSP_IO_PORT_06_PIN_15)\n#define ETH_TXD0 (BSP_IO_PORT_07_PIN_00)\n#define ETH_50REF (BSP_IO_PORT_07_PIN_01)\n#define ETH_RXD0 (BSP_IO_PORT_07_PIN_02)\n#define ETH_RXD1 (BSP_IO_PORT_07_PIN_03)\n#define ETH_RXERR (BSP_IO_PORT_07_PIN_04)\n#define ETH_CRSDV (BSP_IO_PORT_07_PIN_05)\n#define ETH_INT (BSP_IO_PORT_07_PIN_06)\n#define USBHS_OVERCURA (BSP_IO_PORT_07_PIN_07)\n#define PMOD2_SS3 (BSP_IO_PORT_07_PIN_08)\n#define PMOD1_INT (BSP_IO_PORT_09_PIN_05)\n#define USBHS_VBUS_EN (BSP_IO_PORT_11_PIN_00)\n#define USBHS_VBUS (BSP_IO_PORT_11_PIN_01)\nextern const ioport_cfg_t g_bsp_pin_cfg; /* RA6M5 EK */\n\nvoid BSP_PinConfigSecurityInit();\n\n/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */\nFSP_FOOTER\n#endif /* BSP_PIN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_cfg/fsp_cfg/r_ioport_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef R_IOPORT_CFG_H_\n#define R_IOPORT_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define IOPORT_CFG_PARAM_CHECKING_ENABLE (BSP_CFG_PARAM_CHECKING_ENABLE)\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* R_IOPORT_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_gen/bsp_clock_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CLOCK_CFG_H_\n#define BSP_CLOCK_CFG_H_\n\n#define BSP_CFG_CLOCKS_SECURE   (0)\n#define BSP_CFG_CLOCKS_OVERRIDE (0)\n#define BSP_CFG_XTAL_HZ         (24000000)                         /* XTAL 24000000Hz */\n#define BSP_CFG_HOCO_FREQUENCY  (2)                                /* HOCO 20MHz */\n#define BSP_CFG_PLL_SOURCE      (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL Src: XTAL */\n#define BSP_CFG_PLL_DIV         (BSP_CLOCKS_PLL_DIV_3)             /* PLL Div /3 */\n#define BSP_CFG_PLL_MUL         (BSP_CLOCKS_PLL_MUL(25U,0U))       /* PLL Mul x25.0 */\n#define BSP_CFG_PLL2_SOURCE     (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL2 Src: XTAL */\n#define BSP_CFG_PLL2_DIV        (BSP_CLOCKS_PLL_DIV_2)             /* PLL2 Div /2 */\n#define BSP_CFG_PLL2_MUL        (BSP_CLOCKS_PLL_MUL(20U,0U))       /* PLL2 Mul x20.0 */\n#define BSP_CFG_CLOCK_SOURCE    (BSP_CLOCKS_SOURCE_CLOCK_PLL)      /* Clock Src: PLL */\n#define BSP_CFG_CLKOUT_SOURCE   (BSP_CLOCKS_CLOCK_DISABLED)        /* CLKOUT Disabled */\n#define BSP_CFG_UCK_SOURCE      (BSP_CLOCKS_SOURCE_CLOCK_PLL2)     /* UCLK Src: PLL2 */\n#define BSP_CFG_U60CK_SOURCE    (BSP_CLOCKS_SOURCE_CLOCK_PLL2)     /* U60CK Src: PLL2 */\n#define BSP_CFG_OCTA_SOURCE     (BSP_CLOCKS_CLOCK_DISABLED)        /* OCTASPICLK Disabled */\n#define BSP_CFG_CANFDCLK_SOURCE (BSP_CLOCKS_CLOCK_DISABLED)        /* CANFDCLK Disabled */\n#define BSP_CFG_CECCLK_SOURCE   (BSP_CLOCKS_CLOCK_DISABLED)        /* CECCLK Disabled */\n#define BSP_CFG_ICLK_DIV        (BSP_CLOCKS_SYS_CLOCK_DIV_1)       /* ICLK Div /1 */\n#define BSP_CFG_PCLKA_DIV       (BSP_CLOCKS_SYS_CLOCK_DIV_2)       /* PCLKA Div /2 */\n#define BSP_CFG_PCLKB_DIV       (BSP_CLOCKS_SYS_CLOCK_DIV_4)       /* PCLKB Div /4 */\n#define BSP_CFG_PCLKC_DIV       (BSP_CLOCKS_SYS_CLOCK_DIV_4)       /* PCLKC Div /4 */\n#define BSP_CFG_PCLKD_DIV       (BSP_CLOCKS_SYS_CLOCK_DIV_2)       /* PCLKD Div /2 */\n#define BSP_CFG_BCLK_DIV        (BSP_CLOCKS_SYS_CLOCK_DIV_2)       /* BCLK Div /2 */\n#define BSP_CFG_BCLK_OUTPUT     (2)                                /* EBCLK Div /2 */\n#define BSP_CFG_FCLK_DIV        (BSP_CLOCKS_SYS_CLOCK_DIV_4)       /* FCLK Div /4 */\n#define BSP_CFG_CLKOUT_DIV      (BSP_CLOCKS_SYS_CLOCK_DIV_1)       /* CLKOUT Div /1 */\n#define BSP_CFG_UCK_DIV         (BSP_CLOCKS_USB_CLOCK_DIV_5)       /* UCLK Div /5 */\n#define BSP_CFG_U60CK_DIV       (BSP_CLOCKS_USB60_CLOCK_DIV_4)     /* U60CK Div /4 */\n#define BSP_CFG_OCTA_DIV        (BSP_CLOCKS_OCTA_CLOCK_DIV_1)      /* OCTASPICLK Div /1 */\n#define BSP_CFG_CANFDCLK_DIV    (BSP_CLOCKS_CANFD_CLOCK_DIV_1)     /* CANFDCLK Div /1 */\n#define BSP_CFG_CECCLK_DIV      (BSP_CLOCKS_CEC_CLOCK_DIV_1)       /* CECCLK Div /1 */\n\n#endif /* BSP_CLOCK_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_gen/common_data.c",
    "content": "/* generated common source file - do not edit */\n#include \"common_data.h\"\nioport_instance_ctrl_t g_ioport_ctrl;\nconst ioport_instance_t g_ioport =\n        {\n            .p_api = &g_ioport_on_ioport,\n            .p_ctrl = &g_ioport_ctrl,\n            .p_cfg = &g_bsp_pin_cfg,\n        };\nvoid g_common_init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_gen/common_data.h",
    "content": "/* generated common header file - do not edit */\n#ifndef COMMON_DATA_H_\n#define COMMON_DATA_H_\n#include <stdint.h>\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n#include \"bsp_pin_cfg.h\"\nFSP_HEADER\n#define IOPORT_CFG_NAME g_bsp_pin_cfg\n#define IOPORT_CFG_OPEN R_IOPORT_Open\n#define IOPORT_CFG_CTRL g_ioport_ctrl\n\n/* IOPORT Instance */\nextern const ioport_instance_t g_ioport;\n\n/* IOPORT control structure. */\nextern ioport_instance_ctrl_t g_ioport_ctrl;\nvoid g_common_init(void);\nFSP_FOOTER\n#endif /* COMMON_DATA_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/ra_gen/pin_data.c",
    "content": "/* generated pin source file - do not edit */\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n\n\nconst ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {\n    {\n        .pin = BSP_IO_PORT_00_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_GPT1)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_13,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_QSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_HIGH)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_13,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_IIC)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_IIC)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_NMOS_ENABLE | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_NMOS_ENABLE | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_IIC)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_IIC)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_CAN)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_CAN)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_13,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_MID | (uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_HIGH)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_ETHER_RMII)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_HS)\n    },\n    {\n        .pin = BSP_IO_PORT_07_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_09_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_11_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_HS)\n    },\n    {\n        .pin = BSP_IO_PORT_11_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_HS)\n    },\n};\n\nconst ioport_cfg_t g_bsp_pin_cfg = {\n    .number_of_pins = sizeof(g_bsp_pin_cfg_data)/sizeof(ioport_pin_cfg_t),\n    .p_pin_cfg_data = &g_bsp_pin_cfg_data[0],\n};\n\n#if BSP_TZ_SECURE_BUILD\n\nvoid R_BSP_PinCfgSecurityInit(void);\n\n/* Initialize SAR registers for secure pins. */\nvoid R_BSP_PinCfgSecurityInit(void)\n{\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n    uint32_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #else\n    uint16_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #endif\n    memset(pmsar, 0xFF, BSP_FEATURE_BSP_NUM_PMSAR * sizeof(R_PMISC->PMSAR[0]));\n\n\n    for(uint32_t i = 0; i < g_bsp_pin_cfg.number_of_pins; i++)\n    {\n        uint32_t port_pin = g_bsp_pin_cfg.p_pin_cfg_data[i].pin;\n        uint32_t port = port_pin >> 8U;\n        uint32_t pin = port_pin & 0xFFU;\n        pmsar[port] &= (uint16_t) ~(1U << pin);\n    }\n\n    for(uint32_t i = 0; i < BSP_FEATURE_BSP_NUM_PMSAR; i++)\n    {\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n        R_PMISC->PMSAR[i].PMSAR = (uint16_t) pmsar[i];\n #else\n        R_PMISC->PMSAR[i].PMSAR = pmsar[i];\n #endif\n    }\n\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/script/fsp.ld",
    "content": "/*\n                  Linker File for Renesas FSP\n*/\n\nINCLUDE memory_regions.ld\n\n/* Uncomment and set XIP_SECONDARY_SLOT_IMAGE to 1 below for the secondary XIP application image.*/\n/*\n XIP_SECONDARY_SLOT_IMAGE = 1;\n*/\n\nQSPI_FLASH_PRV_LENGTH = DEFINED(QSPI_FLASH_SIZE) ? ABSOLUTE(QSPI_FLASH_SIZE) : ABSOLUTE(QSPI_FLASH_LENGTH);\nOSPI_DEVICE_0_PRV_LENGTH = DEFINED(OSPI_DEVICE_0_SIZE) ? ABSOLUTE(OSPI_DEVICE_0_SIZE) : ABSOLUTE(OSPI_DEVICE_0_LENGTH);\nOSPI_DEVICE_1_PRV_LENGTH = DEFINED(OSPI_DEVICE_1_SIZE) ? ABSOLUTE(OSPI_DEVICE_1_SIZE) : ABSOLUTE(OSPI_DEVICE_1_LENGTH);\n\n/* If a flat (secure) project has DEFINED RAM_NS_BUFFER_LENGTH, then emit IDAU symbols to allocate non-secure RAM. */\n__RESERVE_NS_RAM = !DEFINED(PROJECT_NONSECURE) && DEFINED(RAM_NS_BUFFER_LENGTH) && (OPTION_SETTING_S_LENGTH != 0);\n\nITCM_START = DEFINED(ITCM_START)? ITCM_START : 0;\nITCM_LENGTH = DEFINED(ITCM_LENGTH)? ITCM_LENGTH : 0;\nDTCM_START = DEFINED(DTCM_START)? DTCM_START : 0;\nDTCM_LENGTH = DEFINED(DTCM_LENGTH)? DTCM_LENGTH : 0;\nRAM_NS_BUFFER_BLOCK_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? ALIGN(RAM_NS_BUFFER_LENGTH, 8192) : 0;\nRAM_NS_BUFFER_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? RAM_NS_BUFFER_LENGTH : 0;\nRAM_NS_BUFFER_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_LENGTH;\nRAM_NS_BUFFER_BLOCK_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_BLOCK_LENGTH;\n\nOPTION_SETTING_START_NS = DEFINED(PROJECT_NONSECURE) ? OPTION_SETTING_START : OPTION_SETTING_START + 0x80;\n\n/* This definition is used to avoid moving the counter in OPTION_SETTING regions for projects that should not configure option settings.\n * Bootloader images do not configure option settings because they are owned by the bootloader.\n * FSP_BOOTABLE_IMAGE is only defined in bootloader images. */\n__bl_FSP_BOOTABLE_IMAGE = 1;\n__bln_FSP_BOOTABLE_IMAGE = 1;\nPROJECT_SECURE_OR_FLAT = (!DEFINED(PROJECT_NONSECURE) || DEFINED(PROJECT_SECURE)) && OPTION_SETTING_LENGTH && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_NS = DEFINED(PROJECT_NONSECURE) && !DEFINED(FSP_BOOTABLE_IMAGE);\n\n__bl_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_APPLICATION_IMAGE_NUMBER == 1 ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         (DEFINED(BOOTLOADER_SECONDARY_USE_QSPI) || DEFINED(BOOTLOADER_SECONDARY_USE_OSPI_B)) ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                          FLASH_APPLICATION_S_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_END    = __bl_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_END = __bl_XIP_SECONDARY_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_FLASH_NS_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_START - FLASH_BOOTLOADER_HEADER_LENGTH + FLASH_APPLICATION_S_LENGTH;\n__bl_FLASH_NSC_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_END - FLASH_APPLICATION_NSC_LENGTH;\n__bl_RAM_NS_START    = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH;\n__bl_RAM_NSC_START   = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       __bl_RAM_NS_START - RAM_APPLICATION_NSC_LENGTH;\n__bl_FLASH_NS_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                            FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                            __bl_FLASH_NS_START + FLASH_BOOTLOADER_HEADER_LENGTH_2;\n__bln_FLASH_IMAGE_START = __bl_FLASH_NS_IMAGE_START | (!DEFINED (NS_OFFSET_START) ? 0 : NS_OFFSET_START);\n__bln_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                           FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                           FLASH_APPLICATION_NS_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH_2;\n\nXIP_SECONDARY_SLOT_IMAGE = DEFINED(XIP_SECONDARY_SLOT_IMAGE) ? XIP_SECONDARY_SLOT_IMAGE : 0;\nFLASH_ORIGIN = !DEFINED(FLASH_IMAGE_START) ? FLASH_START :\n                XIP_SECONDARY_SLOT_IMAGE == 1 ? XIP_SECONDARY_FLASH_IMAGE_START :\n                FLASH_IMAGE_START;\nLIMITED_FLASH_LENGTH = DEFINED(FLASH_IMAGE_LENGTH) ? FLASH_IMAGE_LENGTH :\n                       DEFINED(FLASH_BOOTLOADER_LENGTH) ? FLASH_BOOTLOADER_LENGTH :\n                       FLASH_LENGTH;\nOPTION_SETTING_SAS_SIZE = 0x34;\nOPTION_SETTING_SAS_LENGTH = !DEFINED(OPTION_SETTING_LENGTH) ? 0 :\n                            OPTION_SETTING_LENGTH == 0 ? 0 :\n                            OPTION_SETTING_LENGTH - OPTION_SETTING_SAS_SIZE;\n\n/* Define memory regions. */\nMEMORY\n{\n  ITCM (rx)                       : ORIGIN = ITCM_START, LENGTH = ITCM_LENGTH\n  DTCM (rwx)                      : ORIGIN = DTCM_START, LENGTH = DTCM_LENGTH\n  FLASH (rx)                      : ORIGIN = FLASH_ORIGIN, LENGTH = LIMITED_FLASH_LENGTH\n  RAM (rwx)                       : ORIGIN = RAM_START, LENGTH = RAM_LENGTH\n  DATA_FLASH (rx)                 : ORIGIN = DATA_FLASH_START, LENGTH = DATA_FLASH_LENGTH\n  QSPI_FLASH (rx)                 : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_PRV_LENGTH\n  OSPI_DEVICE_0 (rx)              : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1 (rx)              : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  OSPI_DEVICE_0_RAM (rwx)         : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1_RAM (rwx)         : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  SDRAM (rwx)                     : ORIGIN = SDRAM_START, LENGTH = SDRAM_LENGTH\n  OPTION_SETTING (r)              : ORIGIN = OPTION_SETTING_START, LENGTH = OPTION_SETTING_LENGTH\n  OPTION_SETTING_OFS (r)          : ORIGIN = OPTION_SETTING_START, LENGTH = 0x18\n  OPTION_SETTING_SAS (r)          : ORIGIN = OPTION_SETTING_START + OPTION_SETTING_SAS_SIZE, LENGTH = OPTION_SETTING_SAS_LENGTH\n  OPTION_SETTING_S (r)            : ORIGIN = OPTION_SETTING_S_START, LENGTH = OPTION_SETTING_S_LENGTH\n  ID_CODE (rx)                    : ORIGIN = ID_CODE_START, LENGTH = ID_CODE_LENGTH\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be DEFINED in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n *   __qspi_flash_start__\n *   __qspi_flash_end__\n *   __qspi_flash_code_size__\n *   __qspi_region_max_size__\n *   __qspi_region_start_address__\n *   __qspi_region_end_address__\n *   __ospi_device_0_start__\n *   __ospi_device_0_end__\n *   __ospi_device_0_code_size__\n *   __ospi_device_0_region_max_size__\n *   __ospi_device_0_region_start_address__\n *   __ospi_device_0_region_end_address__\n *   __ospi_device_1_start__\n *   __ospi_device_1_end__\n *   __ospi_device_1_code_size__\n *   __ospi_device_1_region_max_size__\n *   __ospi_device_1_region_start_address__\n *   __ospi_device_1_region_end_address__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .text :\n    {\n        __tz_FLASH_S = ABSOLUTE(FLASH_START);\n        __ROM_Start = .;\n\n        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much\n         * space because ROM registers are at address 0x400 and there is very little space\n         * in between. */\n        KEEP(*(.fixed_vectors*))\n        KEEP(*(.application_vectors*))\n        __Vectors_End = .;\n\n        /* Some devices have a gap of code flash between the vector table and ROM Registers.\n         * The flash gap section allows applications to place code and data in this section. */\n        *(.flash_gap*)\n\n        /* ROM Registers start at address 0x00000400 for devices that do not have the OPTION_SETTING region. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x400;\n        KEEP(*(.rom_registers*))\n\n        /* Reserving 0x100 bytes of space for ROM registers. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x500;\n\n        /* Allocate flash write-boundary-aligned\n         * space for sce9 wrapped public keys for mcuboot if the module is used.\n         */\n        KEEP(*(.mcuboot_sce9_key*))\n\n        *(.text*)\n\n        KEEP(*(.version))\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n        __usb_dev_descriptor_start_fs = .;\n        KEEP(*(.usb_device_desc_fs*))\n        __usb_cfg_descriptor_start_fs = .;\n        KEEP(*(.usb_config_desc_fs*))\n        __usb_interface_descriptor_start_fs = .;\n        KEEP(*(.usb_interface_desc_fs*))\n        __usb_descriptor_end_fs = .;\n        __usb_dev_descriptor_start_hs = .;\n        KEEP(*(.usb_device_desc_hs*))\n        __usb_cfg_descriptor_start_hs = .;\n        KEEP(*(.usb_config_desc_hs*))\n        __usb_interface_descriptor_start_hs = .;\n        KEEP(*(.usb_interface_desc_hs*))\n        __usb_descriptor_end_hs = .;\n\n        KEEP(*(.eh_frame*))\n\n        __ROM_End = .;\n    } > FLASH = 0xFF\n\n    __Vectors_Size = __Vectors_End - __Vectors;\n\n    . = .;\n    __itcm_data_pre_location = .;\n\n    /* Initialized ITCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .itcm_data : ALIGN(16)\n    {\n        /* Start of ITCM Secure Trustzone region. */\n        __tz_ITCM_S = ABSOLUTE(ITCM_START);\n\n        /* All ITCM data start */\n        __itcm_data_start = .;\n\n        KEEP(*(.itcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* All ITCM data end */\n        __itcm_data_end = .;\n\n        /*\n         * Start of the ITCM Non-Secure Trustzone region.\n         * ITCM_NS_START can be used to set a fixed address for non-secure ITCM in secure projects or flat projects.\n         */\n        __tz_ITCM_N = DEFINED(ITCM_NS_START) ? ABSOLUTE(ITCM_NS_START) : ALIGN(__itcm_data_end, 8192);\n    } > ITCM AT > FLASH = 0x00\n\n    /* Addresses exported for ITCM initialization. */\n    __itcm_data_init_start = LOADADDR(.itcm_data);\n    __itcm_data_init_end = LOADADDR(.itcm_data) + SIZEOF(.itcm_data);\n\n    ASSERT(ORIGIN(ITCM) % 8 == 0, \"ITCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(ITCM) % 8 == 0, \"ITCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.itcm_data) % 16 == 0, \".itcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.itcm_data) % 8 == 0, \".itcm_data section size must be a multiple of 8 bytes.\")\n\n    /* Restore location counter. */\n    /* If ITCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If ITCM is present, this will be the absolute address that follows the ITCM ROM location. */\n    . = (SIZEOF(.itcm_data) > 0) ? __itcm_data_init_end : __itcm_data_pre_location;\n\n    __exidx_start = .;\n    /DISCARD/ :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    }\n    __exidx_end = .;\n\n    /* To copy multiple ROM to RAM sections,\n     * uncomment .copy.table section and,\n     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .copy.table :\n    {\n        . = ALIGN(4);\n        __copy_table_start__ = .;\n        LONG (__etext)\n        LONG (__data_start__)\n        LONG (__data_end__ - __data_start__)\n        LONG (__etext2)\n        LONG (__data2_start__)\n        LONG (__data2_end__ - __data2_start__)\n        __copy_table_end__ = .;\n    } > FLASH\n    */\n\n    /* To clear multiple BSS sections,\n     * uncomment .zero.table section and,\n     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .zero.table :\n    {\n        . = ALIGN(4);\n        __zero_table_start__ = .;\n        LONG (__bss_start__)\n        LONG (__bss_end__ - __bss_start__)\n        LONG (__bss2_start__)\n        LONG (__bss2_end__ - __bss2_start__)\n        __zero_table_end__ = .;\n    } > FLASH\n    */\n\n    __etext = .;\n\n    __tz_RAM_S = ORIGIN(RAM);\n\n    /* If DTC is used, put the DTC vector table at the start of SRAM.\n       This avoids memory holes due to 1K alignment required by it. */\n    .fsp_dtc_vector_table (NOLOAD) :\n    {\n        . = ORIGIN(RAM);\n        *(.fsp_dtc_vector_table)\n    } > RAM\n\n    /* Initialized data section. */\n    .data :\n    {\n        __data_start__ = .;\n        . = ALIGN(4);\n\n        __Code_In_RAM_Start = .;\n\n        KEEP(*(.code_in_ram*))\n        __Code_In_RAM_End = .;\n\n        *(vtable)\n        /* Don't use *(.data*) because it will place data meant for .data_flash in this section. */\n        *(.data.*)\n        *(.data)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        KEEP(*(.jcr*))\n\n        . = ALIGN(4);\n\n        /* All data end */\n        __data_end__ = .;\n\n    } > RAM AT > FLASH\n\n    . = .;\n    __dtcm_data_pre_location = LOADADDR(.data) + SIZEOF(.data);\n\n    /* Initialized DTCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .dtcm_data : ALIGN(16)\n    {\n        /* Start of DTCM Secure Trustzone region. */\n        __tz_DTCM_S = ABSOLUTE(DTCM_START);\n\n        /* Initialized DTCM data start */\n        __dtcm_data_start = .;\n\n        KEEP(*(.dtcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* Initialized DTCM data end */\n        __dtcm_data_end = .;\n    } > DTCM AT > FLASH = 0x00\n\n    . = __dtcm_data_end;\n    /* Uninitialized DTCM data. */\n    /* ALIGN appears on the left side of the colon because it is being used to assign the VMA directly, as opposed to a right side appearance which would control the LMA. */\n    .dtcm_bss ALIGN(8) (NOLOAD) :\n    {\n        /* Uninitialized DTCM data start */\n        __dtcm_bss_start = .;\n\n        KEEP(*(.dtcm_bss*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. No fill because of NOLOAD. */\n        . = ALIGN(8);\n\n        /* Uninitialized DTCM data end */\n        __dtcm_bss_end = .;\n\n        /*\n         * Start of the DTCM Non-Secure Trustzone region.\n         * DTCM_NS_START can be used to set a fixed address for non-secure DTCM in secure projects or flat projects.\n         */\n        __tz_DTCM_N = DEFINED(DTCM_NS_START) ? ABSOLUTE(DTCM_NS_START) : ALIGN(__dtcm_bss_end, 8192);\n    } > DTCM\n\n    /* Addresses exported for DTCM initialization. */\n    __dtcm_data_init_start = LOADADDR(.dtcm_data);\n    __dtcm_data_init_end = LOADADDR(.dtcm_data) + SIZEOF(.dtcm_data);\n\n    ASSERT(ORIGIN(DTCM) % 8 == 0, \"DTCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(DTCM) % 8 == 0, \"DTCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) == ADDR(.dtcm_bss), \".dtcm_bss has (VMA != LMA) but should be NOLOAD (VMA == LMA).\")\n    ASSERT(LOADADDR(.dtcm_data) % 16 == 0, \".dtcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.dtcm_data) % 8 == 0, \".dtcm_data section size must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) % 8 == 0, \".dtcm_bss section must be aligned to 8 bytes.\")\n    ASSERT(SIZEOF(.dtcm_bss) % 8 == 0, \".dtcm_bss section size must be a multiple of 8 bytes.\")\n    ASSERT(__dtcm_bss_start == __dtcm_data_end, \".dtcm_bss section is not adjacent to .dtcm_data section.\")\n\n    /* Restore location counter. */\n    /* If DTCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If DTCM is present, this will be the absolute address that follows the DTCM ROM location. */\n    . = (SIZEOF(.dtcm_data) > 0) ? __dtcm_data_init_end : __dtcm_data_pre_location;\n\n    /* TrustZone Secure Gateway Stubs Section */\n\n    /* Store location counter for SPI non-retentive sections. */\n    sgstubs_pre_location = .;\n\n    /* Determine the secure gateway stubs address either by the provided linker variable or the next 1024-byte block. */\n    SGSTUBS_LOC = (DEFINED(PROJECT_SECURE) && DEFINED(FLASH_NSC_START)) ? ABSOLUTE(FLASH_NSC_START) : ALIGN(1024);\n    .gnu.sgstubs SGSTUBS_LOC : ALIGN(1024)\n    {\n        __tz_FLASH_C = DEFINED(FLASH_NSC_START) ? ABSOLUTE(FLASH_NSC_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : ALIGN(1024);\n        _start_sg = .;\n        *(.gnu.sgstubs*)\n        . = ALIGN(32);\n        _end_sg = .;\n    } > FLASH\n\n    __tz_FLASH_N = DEFINED(FLASH_NS_START) ? ABSOLUTE(FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : FLASH_LENGTH < 32768 ? FLASH_LENGTH : ALIGN(32768);\n    FLASH_NS_IMAGE_START = DEFINED(FLASH_NS_IMAGE_START) ? FLASH_NS_IMAGE_START : __tz_FLASH_N;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_S = ORIGIN(QSPI_FLASH);\n\n    /* QSPI_FLASH section to be downloaded via debugger */\n    .qspi_flash :\n    {\n        __qspi_flash_start__ = .;\n        KEEP(*(.qspi_flash*))\n        KEEP(*(.code_in_qspi*))\n        __qspi_flash_end__ = .;\n    } > QSPI_FLASH\n    __qspi_flash_code_size__ = __qspi_flash_end__ - __qspi_flash_start__;\n\n    /* QSPI_FLASH non-retentive section, creates a copy in internal flash that can be copied to QSPI */\n    __qspi_flash_code_addr__ = sgstubs_pre_location;\n    .qspi_non_retentive : AT(__qspi_flash_code_addr__)\n    {\n        __qspi_non_retentive_start__ = .;\n        KEEP(*(.qspi_non_retentive*))\n        __qspi_non_retentive_end__ = .;\n    } > QSPI_FLASH\n    __qspi_non_retentive_size__ = __qspi_non_retentive_end__ - __qspi_non_retentive_start__;\n\n    __qspi_region_max_size__ = 0x4000000;   /* Must be the same as defined in MEMORY above */\n    __qspi_region_start_address__ = __qspi_flash_start__;\n    __qspi_region_end_address__ = __qspi_flash_start__ + __qspi_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_N = __qspi_non_retentive_end__;\n\n    /* Support for OctaRAM */\n    .OSPI_DEVICE_0_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_0_start__ = .;\n        *(.ospi_device_0_no_load*)\n        . = ALIGN(4);\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0_RAM\n\n    .OSPI_DEVICE_1_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_1_start__ = .;\n        *(.ospi_device_1_no_load*)\n        . = ALIGN(4);\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1_RAM\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_S = ORIGIN(OSPI_DEVICE_0);\n\n    /* OSPI_DEVICE_0 section to be downloaded via debugger */\n    .OSPI_DEVICE_0 :\n    {\n        __ospi_device_0_start__ = .;\n        KEEP(*(.ospi_device_0*))\n        KEEP(*(.code_in_ospi_device_0*))\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_code_size__ = __ospi_device_0_end__ - __ospi_device_0_start__;\n\n    /* OSPI_DEVICE_0 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n     __ospi_device_0_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive));\n    .ospi_device_0_non_retentive : AT(__ospi_device_0_code_addr__)\n    {\n        __ospi_device_0_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_0_non_retentive*))\n        __ospi_device_0_non_retentive_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_non_retentive_size__ = __ospi_device_0_non_retentive_end__ - __ospi_device_0_non_retentive_start__;\n\n    __ospi_device_0_region_max_size__ = 0x8000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_0_region_start_address__ = __ospi_device_0_start__;\n    __ospi_device_0_region_end_address__ = __ospi_device_0_start__ + __ospi_device_0_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_N = __ospi_device_0_non_retentive_end__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_S = ORIGIN(OSPI_DEVICE_1);\n\n    /* OSPI_DEVICE_1 section to be downloaded via debugger */\n    .OSPI_DEVICE_1 :\n    {\n        __ospi_device_1_start__ = .;\n        KEEP(*(.ospi_device_1*))\n        KEEP(*(.code_in_ospi_device_1*))\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_code_size__ = __ospi_device_1_end__ - __ospi_device_1_start__;\n\n    /* OSPI_DEVICE_1 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n    __ospi_device_1_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive) + SIZEOF(.ospi_device_0_non_retentive));\n    .ospi_device_1_non_retentive : AT(__ospi_device_1_code_addr__)\n    {\n        __ospi_device_1_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_1_non_retentive*))\n        __ospi_device_1_non_retentive_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_non_retentive_size__ = __ospi_device_1_non_retentive_end__ - __ospi_device_1_non_retentive_start__;\n\n    __ospi_device_1_region_max_size__ = 0x10000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_1_region_start_address__ = __ospi_device_1_start__;\n    __ospi_device_1_region_end_address__ = __ospi_device_1_start__ + __ospi_device_1_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_N = __ospi_device_1_non_retentive_end__;\n\n    .noinit (NOLOAD):\n    {\n        . = ALIGN(4);\n        __noinit_start = .;\n        KEEP(*(.noinit*))\n        . = ALIGN(8);\n        /* Place the FreeRTOS heap here so that the __HeapLimit calculation does not include the freertos heap. */\n        KEEP(*(.heap.*))\n        __noinit_end = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n        __HeapBase = .;\n        /* Place the STD heap here. */\n        KEEP(*(.heap))\n        __HeapLimit = .;\n    } > RAM\n\n    /* Stacks are stored in this section. */\n    .stack_dummy (NOLOAD):\n    {\n        . = ALIGN(8);\n        __StackLimit = .;\n        /* Main stack */\n        KEEP(*(.stack))\n        __StackTop = .;\n        /* Thread stacks */\n        KEEP(*(.stack*))\n        __StackTopAll = .;\n    } > RAM\n\n    PROVIDE(__stack = __StackTopAll);\n\n    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used\n       at run time for things such as ThreadX memory pool allocations. */\n    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);\n\n    /* RAM_NSC_START can be used to set a fixed address for non-secure callable RAM in secure projects.\n     * If it is not specified, the address for NSC RAM is the end of RAM aligned to a 1K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_C = DEFINED(RAM_NSC_START) ? ABSOLUTE(RAM_NSC_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_segment_used_end__, 1024);\n\n    /* RAM_NS_START can be used to set a fixed address for non-secure RAM in secure projects or flat projects.\n     * RAM_NS_BUFFER_BLOCK_LENGTH is used to allocate non-secure buffers in a flat project. If it is not\n     * specified, the address for NSC RAM is the end of RAM aligned to an 8K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_N = DEFINED(RAM_NS_START) ? ABSOLUTE(RAM_NS_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__tz_RAM_C, 8192);\n\n    /* Non-secure buffers must be in non-secure RAM. This is primarily used for the EDMAC in flat projects.\n     * The EDMAC is a non-secure bus master and can only access non-secure RAM. */\n    .ns_buffer (NOLOAD):\n    {\n        /* Allocate RAM on a 32-byte boundary to help with placement of Ethernet buffers. */\n        . = __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_START & 0xFFFFFFE0) : .;\n\n        KEEP(*(.ns_buffer*))\n    } > RAM\n\n    /* Data flash. */\n    .data_flash :\n    {\n        . = ORIGIN(DATA_FLASH);\n        __tz_DATA_FLASH_S = .;\n        __Data_Flash_Start = .;\n        KEEP(*(.data_flash*))\n        __Data_Flash_End = .;\n\n        __tz_DATA_FLASH_N = DEFINED(DATA_FLASH_NS_START) ? ABSOLUTE(DATA_FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(DATA_FLASH_START + DATA_FLASH_LENGTH) : ALIGN(1024);\n    } > DATA_FLASH\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_S = ORIGIN(SDRAM);\n\n    /* SDRAM */\n    .sdram (NOLOAD):\n    {\n        __SDRAM_Start = .;\n        KEEP(*(.sdram*))\n        KEEP(*(.frame*))\n        __SDRAM_End = .;\n    } > SDRAM\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_N = __SDRAM_End;\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool. */\n    __tz_ID_CODE_S = ORIGIN(ID_CODE);\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool.\n     *       Set this symbol to the same value as __tz_ID_CODE_S so the RA configuration tool does not split the ID_CODE\n     *       memory region between TrustZone projects. */\n    __tz_ID_CODE_N = __tz_ID_CODE_S;\n\n    .id_code :\n    {\n        __ID_Code_Start = .;\n        KEEP(*(.id_code*))\n        __ID_Code_End = .;\n    } > ID_CODE\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S = ORIGIN(OPTION_SETTING_OFS);\n\n    .option_setting_ofs :\n    {\n        __OPTION_SETTING_OFS_Start = .;\n        KEEP(*(.option_setting_ofs0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x04 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_ofs2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x10 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_dualsel))\n        __OPTION_SETTING_OFS_End = .;\n    } > OPTION_SETTING_OFS = 0xFF\n\n    .option_setting_sas :\n    {\n        __OPTION_SETTING_SAS_Start = .;\n        KEEP(*(.option_setting_sas))\n        __OPTION_SETTING_SAS_End = .;\n    } > OPTION_SETTING_SAS = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_N = ABSOLUTE(OPTION_SETTING_START_NS);\n\n    .option_setting_ns :\n    {\n        __OPTION_SETTING_NS_Start = .;\n        KEEP(*(.option_setting_ofs1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x04 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_ofs3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x10 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_banksel))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x40 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x44 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x48 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x4C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x60 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x64 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x68 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x6C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps3))\n        __OPTION_SETTING_NS_End = .;\n    } > OPTION_SETTING = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_S = ORIGIN(OPTION_SETTING_S);\n\n    .option_setting_s :\n    {\n        __OPTION_SETTING_S_Start = .;\n        KEEP(*(.option_setting_ofs1_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x04 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x10 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x40 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x44 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x48 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x4C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x60 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x64 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x68 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x6C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x80 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs1_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x84 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x90 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC0 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC4 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC8 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xCC : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel3))\n        __OPTION_SETTING_S_End = .;\n    } > OPTION_SETTING_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_N = __OPTION_SETTING_S_End;\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/script/memory_regions.ld",
    "content": "\n            /* generated memory regions file - do not edit */\n                            RAM_START  = 0x20000000;\n                RAM_LENGTH = 0x80000;\n                FLASH_START  = 0x00000000;\n                FLASH_LENGTH = 0x200000;\n                DATA_FLASH_START  = 0x08000000;\n                DATA_FLASH_LENGTH = 0x2000;\n                OPTION_SETTING_START  = 0x0100A100;\n                OPTION_SETTING_LENGTH = 0x100;\n                OPTION_SETTING_S_START  = 0x0100A200;\n                OPTION_SETTING_S_LENGTH = 0x100;\n                ID_CODE_START  = 0x00000000;\n                ID_CODE_LENGTH = 0x0;\n                SDRAM_START  = 0x80010000;\n                SDRAM_LENGTH = 0x0;\n                QSPI_FLASH_START  = 0x60000000;\n                QSPI_FLASH_LENGTH = 0x4000000;\n                OSPI_DEVICE_0_START  = 0x68000000;\n                OSPI_DEVICE_0_LENGTH = 0x8000000;\n                OSPI_DEVICE_1_START  = 0x70000000;\n                OSPI_DEVICE_1_LENGTH = 0x10000000;\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra6m5_ek/smart_configurator/configuration.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<raConfiguration version=\"9\">\n  <generalSettings>\n    <option key=\"#Board#\" value=\"board.ra6m5ek\"/>\n    <option key=\"CPU\" value=\"RA6M5\"/>\n    <option key=\"Core\" value=\"CM33\"/>\n    <option key=\"#TargetName#\" value=\"R7FA6M5BH3CFC\"/>\n    <option key=\"#TargetARCHITECTURE#\" value=\"cortex-m33\"/>\n    <option key=\"#DeviceCommand#\" value=\"R7FA6M5BH\"/>\n    <option key=\"#RTOS#\" value=\"_none\"/>\n    <option key=\"#pinconfiguration#\" value=\"R7FA6M5BH3CFC.pincfg\"/>\n    <option key=\"#FSPVersion#\" value=\"5.6.0\"/>\n    <option key=\"#ConfigurationFragments#\" value=\"Renesas##BSP##Board##ra6m5_ek##\"/>\n    <option key=\"#SELECTED_TOOLCHAIN#\" value=\"com.renesas.cdt.managedbuild.gnuarm.toolchain.\"/>\n  </generalSettings>\n  <raBspConfiguration>\n    <config id=\"config.bsp.ra6m5.R7FA6M5BH3CFC\">\n      <property id=\"config.bsp.part_number\" value=\"config.bsp.part_number.value\"/>\n      <property id=\"config.bsp.rom_size_bytes\" value=\"config.bsp.rom_size_bytes.value\"/>\n      <property id=\"config.bsp.rom_size_bytes_hidden\" value=\"2097152\"/>\n      <property id=\"config.bsp.ram_size_bytes\" value=\"config.bsp.ram_size_bytes.value\"/>\n      <property id=\"config.bsp.data_flash_size_bytes\" value=\"config.bsp.data_flash_size_bytes.value\"/>\n      <property id=\"config.bsp.package_style\" value=\"config.bsp.package_style.value\"/>\n      <property id=\"config.bsp.package_pins\" value=\"config.bsp.package_pins.value\"/>\n      <property id=\"config.bsp.irq_count_hidden\" value=\"96\"/>\n    </config>\n    <config id=\"config.bsp.ra6m5\">\n      <property id=\"config.bsp.series\" value=\"config.bsp.series.value\"/>\n    </config>\n    <config id=\"config.bsp.ra6m5.fsp\">\n      <property id=\"config.bsp.fsp.inline_irq_functions\" value=\"config.bsp.common.inline_irq_functions.enabled\"/>\n      <property id=\"config.bsp.fsp.tz.exception_response\" value=\"config.bsp.fsp.tz.exception_response.nmi\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.bfhfnmins\" value=\"config.bsp.fsp.tz.cmsis.bfhfnmins.secure\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.sysresetreqs\" value=\"config.bsp.fsp.tz.cmsis.sysresetreqs.secure_only\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.s_priority_boost\" value=\"config.bsp.fsp.tz.cmsis.s_priority_boost.disabled\"/>\n      <property id=\"config.bsp.fsp.tz.csar\" value=\"config.bsp.fsp.tz.csar.both\"/>\n      <property id=\"config.bsp.fsp.tz.rstsar\" value=\"config.bsp.fsp.tz.rstsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.bbfsar\" value=\"config.bsp.fsp.tz.bbfsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.sramprcr\" value=\"config.bsp.fsp.tz.sramsar.sramprcr.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.sramecc\" value=\"config.bsp.fsp.tz.sramsar.sramecc.both\"/>\n      <property id=\"config.bsp.fsp.tz.stbramsar\" value=\"config.bsp.fsp.tz.stbramsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussara\" value=\"config.bsp.fsp.tz.bussara.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussarb\" value=\"config.bsp.fsp.tz.bussarb.both\"/>\n      <property id=\"config.bsp.fsp.tz.banksel_sel\" value=\"config.bsp.fsp.tz.banksel_sel.both\"/>\n      <property id=\"config.bsp.fsp.tz.uninitialized_ns_application_fallback\" value=\"config.bsp.fsp.tz.uninitialized_ns_application_fallback.enabled\"/>\n      <property id=\"config.bsp.fsp.cache_line_size\" value=\"config.bsp.fsp.cache_line_size.32\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_start_mode\" value=\"config.bsp.fsp.OFS0.iwdt_start_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_timeout\" value=\"config.bsp.fsp.OFS0.iwdt_timeout.2048\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_divisor\" value=\"config.bsp.fsp.OFS0.iwdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_end\" value=\"config.bsp.fsp.OFS0.iwdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_start\" value=\"config.bsp.fsp.OFS0.iwdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_stop_control\" value=\"config.bsp.fsp.OFS0.iwdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_start_mode\" value=\"config.bsp.fsp.OFS0.wdt_start_mode.register\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_timeout\" value=\"config.bsp.fsp.OFS0.wdt_timeout.16384\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_divisor\" value=\"config.bsp.fsp.OFS0.wdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_end\" value=\"config.bsp.fsp.OFS0.wdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_start\" value=\"config.bsp.fsp.OFS0.wdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.wdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_stop_control\" value=\"config.bsp.fsp.OFS0.wdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0_level.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.start.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1.voltage_detection0.start.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1.voltage_detection0_level.280\"/>\n      <property id=\"config.bsp.fsp.OFS1.hoco_osc\" value=\"config.bsp.fsp.OFS1.hoco_osc.disabled\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS0\" value=\"\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS1\" value=\"\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS2\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS0\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS1\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS2\" value=\"\"/>\n      <property id=\"config.bsp.fsp.dual_bank\" value=\"config.bsp.fsp.dual_bank.disabled\"/>\n      <property id=\"config.bsp.fsp.hoco_fll\" value=\"config.bsp.fsp.hoco_fll.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_wait\" value=\"config.bsp.common.main_osc_wait.wait_8163\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.max_freq_hz\" value=\"50000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.max_baud\" value=\"16666666\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sample_and_hold\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sensors_are_exclusive\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_spi.max_bitrate\" value=\"25000000\"/>\n      <property id=\"config.bsp.fsp.mcu.spi.max_bitrate\" value=\"50000000\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.fastplus_channels\" value=\"0x3\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.fastplus_channels\" value=\"0x3\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.num_channels\" value=\"2\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.rx_fifos\" value=\"8\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.buffer_ram\" value=\"4864\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.afl_rules\" value=\"128\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.afl_rules_each_chnl\" value=\"64\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.max_data_rate_hz\" value=\"5\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.cstpen_channels\" value=\"0x03F9\"/>\n      <property id=\"config.bsp.fsp.mcu.gpt.pin_count_source_channels\" value=\"0xFFFF\"/>\n      <property id=\"config.bsp.fsp.mcu.adc_dmac.samples_per_channel\" value=\"65535\"/>\n    </config>\n    <config id=\"config.bsp.ra\">\n      <property id=\"config.bsp.common.main\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.heap\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.vcc\" value=\"3300\"/>\n      <property id=\"config.bsp.common.checking\" value=\"config.bsp.common.checking.disabled\"/>\n      <property id=\"config.bsp.common.assert\" value=\"config.bsp.common.assert.none\"/>\n      <property id=\"config.bsp.common.error_log\" value=\"config.bsp.common.error_log.none\"/>\n      <property id=\"config.bsp.common.soft_reset\" value=\"config.bsp.common.soft_reset.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_populated\" value=\"config.bsp.common.main_osc_populated.enabled\"/>\n      <property id=\"config.bsp.common.pfs_protect\" value=\"config.bsp.common.pfs_protect.enabled\"/>\n      <property id=\"config.bsp.common.c_runtime_init\" value=\"config.bsp.common.c_runtime_init.enabled\"/>\n      <property id=\"config.bsp.common.early_init\" value=\"config.bsp.common.early_init.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_clock_source\" value=\"config.bsp.common.main_osc_clock_source.crystal\"/>\n      <property id=\"config.bsp.common.subclock_populated\" value=\"config.bsp.common.subclock_populated.enabled\"/>\n      <property id=\"config.bsp.common.subclock_drive\" value=\"config.bsp.common.subclock_drive.standard\"/>\n      <property id=\"config.bsp.common.subclock_stabilization_ms\" value=\"1000\"/>\n    </config>\n  </raBspConfiguration>\n  <raClockConfiguration>\n    <node id=\"board.clock.xtal.freq\" mul=\"24000000\" option=\"_edit\"/>\n    <node id=\"board.clock.hoco.freq\" option=\"board.clock.hoco.freq.20m\"/>\n    <node id=\"board.clock.loco.freq\" option=\"board.clock.loco.freq.32768\"/>\n    <node id=\"board.clock.moco.freq\" option=\"board.clock.moco.freq.8m\"/>\n    <node id=\"board.clock.subclk.freq\" option=\"board.clock.subclk.freq.32768\"/>\n    <node id=\"board.clock.pll.source\" option=\"board.clock.pll.source.xtal\"/>\n    <node id=\"board.clock.pll.div\" option=\"board.clock.pll.div.3\"/>\n    <node id=\"board.clock.pll.mul\" option=\"board.clock.pll.mul.250\"/>\n    <node id=\"board.clock.pll.display\" option=\"board.clock.pll.display.value\"/>\n    <node id=\"board.clock.pll2.source\" option=\"board.clock.pll2.source.disabled\"/>\n    <node id=\"board.clock.pll2.div\" option=\"board.clock.pll2.div.2\"/>\n    <node id=\"board.clock.pll2.mul\" option=\"board.clock.pll2.mul.200\"/>\n    <node id=\"board.clock.pll2.display\" option=\"board.clock.pll2.display.value\"/>\n    <node id=\"board.clock.clock.source\" option=\"board.clock.clock.source.pll\"/>\n    <node id=\"board.clock.clkout.source\" option=\"board.clock.clkout.source.disabled\"/>\n    <node id=\"board.clock.uclk.source\" option=\"board.clock.uclk.source.disabled\"/>\n    <node id=\"board.clock.u60ck.source\" option=\"board.clock.u60ck.source.disabled\"/>\n    <node id=\"board.clock.octaspiclk.source\" option=\"board.clock.octaspiclk.source.disabled\"/>\n    <node id=\"board.clock.canfdclk.source\" option=\"board.clock.canfdclk.source.disabled\"/>\n    <node id=\"board.clock.cecclk.source\" option=\"board.clock.cecclk.source.disabled\"/>\n    <node id=\"board.clock.iclk.div\" option=\"board.clock.iclk.div.1\"/>\n    <node id=\"board.clock.pclka.div\" option=\"board.clock.pclka.div.2\"/>\n    <node id=\"board.clock.pclkb.div\" option=\"board.clock.pclkb.div.4\"/>\n    <node id=\"board.clock.pclkc.div\" option=\"board.clock.pclkc.div.4\"/>\n    <node id=\"board.clock.pclkd.div\" option=\"board.clock.pclkd.div.2\"/>\n    <node id=\"board.clock.bclk.div\" option=\"board.clock.bclk.div.2\"/>\n    <node id=\"board.clock.bclkout.div\" option=\"board.clock.bclkout.div.2\"/>\n    <node id=\"board.clock.fclk.div\" option=\"board.clock.fclk.div.4\"/>\n    <node id=\"board.clock.clkout.div\" option=\"board.clock.clkout.div.1\"/>\n    <node id=\"board.clock.uclk.div\" option=\"board.clock.uclk.div.5\"/>\n    <node id=\"board.clock.u60ck.div\" option=\"board.clock.u60ck.div.1\"/>\n    <node id=\"board.clock.octaspiclk.div\" option=\"board.clock.octaspiclk.div.1\"/>\n    <node id=\"board.clock.canfdclk.div\" option=\"board.clock.canfdclk.div.6\"/>\n    <node id=\"board.clock.cecclk.div\" option=\"board.clock.cecclk.div.1\"/>\n    <node id=\"board.clock.iclk.display\" option=\"board.clock.iclk.display.value\"/>\n    <node id=\"board.clock.pclka.display\" option=\"board.clock.pclka.display.value\"/>\n    <node id=\"board.clock.pclkb.display\" option=\"board.clock.pclkb.display.value\"/>\n    <node id=\"board.clock.pclkc.display\" option=\"board.clock.pclkc.display.value\"/>\n    <node id=\"board.clock.pclkd.display\" option=\"board.clock.pclkd.display.value\"/>\n    <node id=\"board.clock.bclk.display\" option=\"board.clock.bclk.display.value\"/>\n    <node id=\"board.clock.bclkout.display\" option=\"board.clock.bclkout.display.value\"/>\n    <node id=\"board.clock.fclk.display\" option=\"board.clock.fclk.display.value\"/>\n    <node id=\"board.clock.clkout.display\" option=\"board.clock.clkout.display.value\"/>\n    <node id=\"board.clock.uclk.display\" option=\"board.clock.uclk.display.value\"/>\n    <node id=\"board.clock.u60ck.display\" option=\"board.clock.u60ck.display.value\"/>\n    <node id=\"board.clock.octaspiclk.display\" option=\"board.clock.octaspiclk.display.value\"/>\n    <node id=\"board.clock.canfdclk.display\" option=\"board.clock.canfdclk.display.value\"/>\n    <node id=\"board.clock.cecclk.display\" option=\"board.clock.cecclk.display.value\"/>\n  </raClockConfiguration>\n  <raComponentSelection>\n    <component apiversion=\"\" class=\"Projects\" condition=\"\" group=\"all\" subgroup=\"baremetal_blinky\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Simple application that blinks an LED. No RTOS included.</description>\n      <originalPack>Renesas.RA_baremetal_blinky.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"Common\" condition=\"\" group=\"all\" subgroup=\"fsp_common\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board Support Package Common Files</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_ioport\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>I/O Port</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"CMSIS\" condition=\"\" group=\"CMSIS5\" subgroup=\"CoreM\" variant=\"\" vendor=\"Arm\" version=\"6.1.0+fsp.5.6.0\">\n      <description>Arm CMSIS Version 6 - Core (M)</description>\n      <originalPack>Arm.CMSIS6.6.1.0+fsp.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"Board\" subgroup=\"ra6m5_ek\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>RA6M5-EK Board Support Files</description>\n      <originalPack>Renesas.RA_board_ra6m5_ek.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m5\" subgroup=\"device\" variant=\"R7FA6M5BH3CFC\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for R7FA6M5BH3CFC</description>\n      <originalPack>Renesas.RA_mcu_ra6m5.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m5\" subgroup=\"device\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M5</description>\n      <originalPack>Renesas.RA_mcu_ra6m5.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m5\" subgroup=\"fsp\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M5 - FSP Data</description>\n      <originalPack>Renesas.RA_mcu_ra6m5.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra6m5\" subgroup=\"events\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA6M5 - Events</description>\n      <originalPack>Renesas.RA_mcu_ra6m5.5.6.0.pack</originalPack>\n    </component>\n  </raComponentSelection>\n  <raElcConfiguration/>\n  <raIcuConfiguration/>\n  <raModuleConfiguration>\n    <module id=\"module.driver.ioport_on_ioport.0\">\n      <property id=\"module.driver.ioport.name\" value=\"g_ioport\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport1\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport2\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport3\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport4\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.pincfg\" value=\"g_bsp_pin_cfg\"/>\n    </module>\n    <context id=\"_hal.0\">\n      <stack module=\"module.driver.ioport_on_ioport.0\"/>\n    </context>\n    <config id=\"config.driver.ioport\">\n      <property id=\"config.driver.ioport.checking\" value=\"config.driver.ioport.checking.system\"/>\n    </config>\n  </raModuleConfiguration>\n  <raPinConfiguration>\n    <symbolicName propertyId=\"p000.symbolic_name\" value=\"MIKROBUS_AN_ARDUINO_A0\"/>\n    <symbolicName propertyId=\"p001.symbolic_name\" value=\"ARDUINO_A1\"/>\n    <symbolicName propertyId=\"p002.symbolic_name\" value=\"ARDUINO_A2\"/>\n    <symbolicName propertyId=\"p003.symbolic_name\" value=\"ARDUINO_A3\"/>\n    <symbolicName propertyId=\"p004.symbolic_name\" value=\"SW2\"/>\n    <symbolicName propertyId=\"p005.symbolic_name\" value=\"SW1\"/>\n    <symbolicName propertyId=\"p006.symbolic_name\" value=\"LED1\"/>\n    <symbolicName propertyId=\"p007.symbolic_name\" value=\"LED2\"/>\n    <symbolicName propertyId=\"p008.symbolic_name\" value=\"LED3\"/>\n    <symbolicName propertyId=\"p014.symbolic_name\" value=\"ARDUINO_A4\"/>\n    <symbolicName propertyId=\"p015.symbolic_name\" value=\"ARDUINO_A5\"/>\n    <symbolicName propertyId=\"p100.symbolic_name\" value=\"OSPI_CLK\"/>\n    <symbolicName propertyId=\"p101.symbolic_name\" value=\"OSPI_SIO7\"/>\n    <symbolicName propertyId=\"p102.symbolic_name\" value=\"OSPI_SIO1\"/>\n    <symbolicName propertyId=\"p103.symbolic_name\" value=\"OSPI_SIO6\"/>\n    <symbolicName propertyId=\"p104.symbolic_name\" value=\"OSPI_DQS\"/>\n    <symbolicName propertyId=\"p105.symbolic_name\" value=\"OSPI_SIO5\"/>\n    <symbolicName propertyId=\"p106.symbolic_name\" value=\"OSPI_SIO0\"/>\n    <symbolicName propertyId=\"p107.symbolic_name\" value=\"OSPI_SIO3\"/>\n    <symbolicName propertyId=\"p111.symbolic_name\" value=\"MIKROBUS_PWM_ARDUINO_D3_PWM\"/>\n    <symbolicName propertyId=\"p112.symbolic_name\" value=\"ARDUINO_D4\"/>\n    <symbolicName propertyId=\"p113.symbolic_name\" value=\"ARDUINO_D5\"/>\n    <symbolicName propertyId=\"p114.symbolic_name\" value=\"ARDUINO_D6\"/>\n    <symbolicName propertyId=\"p115.symbolic_name\" value=\"ARDUINO_D9\"/>\n    <symbolicName propertyId=\"p202.symbolic_name\" value=\"MIKROBUS_MISO_ARDUINO_MISO_PMOD1_MISO\"/>\n    <symbolicName propertyId=\"p203.symbolic_name\" value=\"MIKROBUS_MOSI_ARDUINO_MOSI_PMOD1_MOSI\"/>\n    <symbolicName propertyId=\"p204.symbolic_name\" value=\"MIKROBUS_SCK_ARDUINO_SCK_PMOD1_SCK\"/>\n    <symbolicName propertyId=\"p205.symbolic_name\" value=\"MIKROBUS_SS_ARDUINO_SS\"/>\n    <symbolicName propertyId=\"p206.symbolic_name\" value=\"PMOD1_SS\"/>\n    <symbolicName propertyId=\"p207.symbolic_name\" value=\"ARDUINO_D8\"/>\n    <symbolicName propertyId=\"p301.symbolic_name\" value=\"PMOD1_SS2\"/>\n    <symbolicName propertyId=\"p302.symbolic_name\" value=\"PMOD1_SS3\"/>\n    <symbolicName propertyId=\"p303.symbolic_name\" value=\"MIKROBUS_RESET_ARDUINO_RESET\"/>\n    <symbolicName propertyId=\"p305.symbolic_name\" value=\"QSPI_CLK\"/>\n    <symbolicName propertyId=\"p306.symbolic_name\" value=\"QSPI_CS\"/>\n    <symbolicName propertyId=\"p307.symbolic_name\" value=\"QSPI_IO0\"/>\n    <symbolicName propertyId=\"p308.symbolic_name\" value=\"QSPI_IO1\"/>\n    <symbolicName propertyId=\"p309.symbolic_name\" value=\"QSPI_IO2\"/>\n    <symbolicName propertyId=\"p310.symbolic_name\" value=\"QSPI_IO3\"/>\n    <symbolicName propertyId=\"p311.symbolic_name\" value=\"PMOD1_RST\"/>\n    <symbolicName propertyId=\"p400.symbolic_name\" value=\"PMOD2_INT\"/>\n    <symbolicName propertyId=\"p401.symbolic_name\" value=\"ETH_MDC\"/>\n    <symbolicName propertyId=\"p402.symbolic_name\" value=\"ETH_MDIO\"/>\n    <symbolicName propertyId=\"p403.symbolic_name\" value=\"ETH_RST\"/>\n    <symbolicName propertyId=\"p404.symbolic_name\" value=\"PMOD2_RST\"/>\n    <symbolicName propertyId=\"p405.symbolic_name\" value=\"ETH_TXEN\"/>\n    <symbolicName propertyId=\"p406.symbolic_name\" value=\"ETH_TXD1\"/>\n    <symbolicName propertyId=\"p407.symbolic_name\" value=\"USBFS_VBUS\"/>\n    <symbolicName propertyId=\"p408.symbolic_name\" value=\"PMOD2_SS2\"/>\n    <symbolicName propertyId=\"p409.symbolic_name\" value=\"MIKROBUS_INT_ARDUINO_INT0\"/>\n    <symbolicName propertyId=\"p410.symbolic_name\" value=\"PMOD2_MISO\"/>\n    <symbolicName propertyId=\"p411.symbolic_name\" value=\"PMOD2_MOSI\"/>\n    <symbolicName propertyId=\"p412.symbolic_name\" value=\"PMOD2_SCK\"/>\n    <symbolicName propertyId=\"p413.symbolic_name\" value=\"PMOS2_SS\"/>\n    <symbolicName propertyId=\"p414.symbolic_name\" value=\"GROVE1_SDA_QWIIC_SDA\"/>\n    <symbolicName propertyId=\"p415.symbolic_name\" value=\"GROVE1_SCL_QWIIC_SCL\"/>\n    <symbolicName propertyId=\"p500.symbolic_name\" value=\"USBFS_VBUS_EN\"/>\n    <symbolicName propertyId=\"p501.symbolic_name\" value=\"USBFS_OVERCURA\"/>\n    <symbolicName propertyId=\"p505.symbolic_name\" value=\"GROVE2_SCL\"/>\n    <symbolicName propertyId=\"p506.symbolic_name\" value=\"GROVE2_SDA\"/>\n    <symbolicName propertyId=\"p511.symbolic_name\" value=\"MIKROBUS_SDA_ARDUINO_SDA\"/>\n    <symbolicName propertyId=\"p512.symbolic_name\" value=\"MIKROBUS_SCL_ARDUINO_SCL\"/>\n    <symbolicName propertyId=\"p600.symbolic_name\" value=\"OSPI_SIO4\"/>\n    <symbolicName propertyId=\"p601.symbolic_name\" value=\"OSPI_SIO2\"/>\n    <symbolicName propertyId=\"p602.symbolic_name\" value=\"OSPI_CS1\"/>\n    <symbolicName propertyId=\"p608.symbolic_name\" value=\"ARDUINO_D7\"/>\n    <symbolicName propertyId=\"p609.symbolic_name\" value=\"CAN_TXD\"/>\n    <symbolicName propertyId=\"p610.symbolic_name\" value=\"CAN_RDX\"/>\n    <symbolicName propertyId=\"p611.symbolic_name\" value=\"CAN_STBY\"/>\n    <symbolicName propertyId=\"p613.symbolic_name\" value=\"MIKROBUS_TX_ARDUINO_TX\"/>\n    <symbolicName propertyId=\"p614.symbolic_name\" value=\"MIKROBUS_RX_ARDUINO_RX\"/>\n    <symbolicName propertyId=\"p615.symbolic_name\" value=\"OSPI_RST\"/>\n    <symbolicName propertyId=\"p700.symbolic_name\" value=\"ETH_TXD0\"/>\n    <symbolicName propertyId=\"p701.symbolic_name\" value=\"ETH_50REF\"/>\n    <symbolicName propertyId=\"p702.symbolic_name\" value=\"ETH_RXD0\"/>\n    <symbolicName propertyId=\"p703.symbolic_name\" value=\"ETH_RXD1\"/>\n    <symbolicName propertyId=\"p704.symbolic_name\" value=\"ETH_RXERR\"/>\n    <symbolicName propertyId=\"p705.symbolic_name\" value=\"ETH_CRSDV\"/>\n    <symbolicName propertyId=\"p706.symbolic_name\" value=\"ETH_INT\"/>\n    <symbolicName propertyId=\"p707.symbolic_name\" value=\"USBHS_OVERCURA\"/>\n    <symbolicName propertyId=\"p708.symbolic_name\" value=\"PMOD2_SS3\"/>\n    <symbolicName propertyId=\"p905.symbolic_name\" value=\"PMOD1_INT\"/>\n    <symbolicName propertyId=\"pb00.symbolic_name\" value=\"USBHS_VBUS_EN\"/>\n    <symbolicName propertyId=\"pb01.symbolic_name\" value=\"USBHS_VBUS\"/>\n    <pincfg active=\"true\" name=\"RA6M5 EK\" selected=\"true\" symbol=\"g_bsp_pin_cfg\">\n      <configSetting altId=\"adc0.an00.p000\" configurationId=\"adc0.an00\"/>\n      <configSetting altId=\"adc0.an01.p001\" configurationId=\"adc0.an01\"/>\n      <configSetting altId=\"adc0.an02.p002\" configurationId=\"adc0.an02\"/>\n      <configSetting altId=\"adc0.an03.p003\" configurationId=\"adc0.an03\"/>\n      <configSetting altId=\"adc0.an12.p014\" configurationId=\"adc0.an12\"/>\n      <configSetting altId=\"adc0.an13.p015\" configurationId=\"adc0.an13\"/>\n      <configSetting altId=\"adc0.mode.custom\" configurationId=\"adc0.mode\"/>\n      <configSetting altId=\"can1.crx.p610\" configurationId=\"can1.crx\"/>\n      <configSetting altId=\"can1.ctx.p609\" configurationId=\"can1.ctx\"/>\n      <configSetting altId=\"can1.mode.enabled.free\" configurationId=\"can1.mode\"/>\n      <configSetting altId=\"cgc0.extal.p212\" configurationId=\"cgc0.extal\"/>\n      <configSetting altId=\"cgc0.mode.mainsub\" configurationId=\"cgc0.mode\"/>\n      <configSetting altId=\"cgc0.xtal.p213\" configurationId=\"cgc0.xtal\"/>\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"etherc0.rmii.crs_dv.p705\" configurationId=\"etherc0.rmii.crs_dv\"/>\n      <configSetting altId=\"etherc0.rmii.mdc.p401\" configurationId=\"etherc0.rmii.mdc\"/>\n      <configSetting altId=\"etherc0.rmii.mdio.p402\" configurationId=\"etherc0.rmii.mdio\"/>\n      <configSetting altId=\"etherc0.rmii.mode.rmii.free\" configurationId=\"etherc0.rmii.mode\"/>\n      <configSetting altId=\"etherc0.rmii.pairing.free\" configurationId=\"etherc0.rmii.pairing\"/>\n      <configSetting altId=\"etherc0.rmii.ref50ck.p701\" configurationId=\"etherc0.rmii.ref50ck\"/>\n      <configSetting altId=\"etherc0.rmii.rx_er.p704\" configurationId=\"etherc0.rmii.rx_er\"/>\n      <configSetting altId=\"etherc0.rmii.rxd0.p702\" configurationId=\"etherc0.rmii.rxd0\"/>\n      <configSetting altId=\"etherc0.rmii.rxd1.p703\" configurationId=\"etherc0.rmii.rxd1\"/>\n      <configSetting altId=\"etherc0.rmii.txd0.p700\" configurationId=\"etherc0.rmii.txd0\"/>\n      <configSetting altId=\"etherc0.rmii.txd1.p406\" configurationId=\"etherc0.rmii.txd1\"/>\n      <configSetting altId=\"etherc0.rmii.txd_en.p405\" configurationId=\"etherc0.rmii.txd_en\"/>\n      <configSetting altId=\"gpt3.gtioca.p111\" configurationId=\"gpt3.gtioca\"/>\n      <configSetting altId=\"gpt3.mode.gtiocaorgtiocb.free\" configurationId=\"gpt3.mode\"/>\n      <configSetting altId=\"iic1.mode.enabled.a\" configurationId=\"iic1.mode\"/>\n      <configSetting altId=\"iic1.scl.p512\" configurationId=\"iic1.scl\"/>\n      <configSetting altId=\"iic1.sda.p511\" configurationId=\"iic1.sda\"/>\n      <configSetting altId=\"iic2.mode.enabled.free\" configurationId=\"iic2.mode\"/>\n      <configSetting altId=\"iic2.pairing.free\" configurationId=\"iic2.pairing\"/>\n      <configSetting altId=\"iic2.scl.p415\" configurationId=\"iic2.scl\"/>\n      <configSetting altId=\"iic2.sda.p414\" configurationId=\"iic2.sda\"/>\n      <configSetting altId=\"ospi0.mode.custom.free\" configurationId=\"ospi0.mode\"/>\n      <configSetting altId=\"ospi0.omcs1.p602\" configurationId=\"ospi0.omcs1\"/>\n      <configSetting altId=\"ospi0.omdqs.p104\" configurationId=\"ospi0.omdqs\"/>\n      <configSetting altId=\"ospi0.omsclk.p100\" configurationId=\"ospi0.omsclk\"/>\n      <configSetting altId=\"ospi0.omsio0.p106\" configurationId=\"ospi0.omsio0\"/>\n      <configSetting altId=\"ospi0.omsio1.p102\" configurationId=\"ospi0.omsio1\"/>\n      <configSetting altId=\"ospi0.omsio2.p601\" configurationId=\"ospi0.omsio2\"/>\n      <configSetting altId=\"ospi0.omsio3.p107\" configurationId=\"ospi0.omsio3\"/>\n      <configSetting altId=\"ospi0.omsio4.p600\" configurationId=\"ospi0.omsio4\"/>\n      <configSetting altId=\"ospi0.omsio5.p105\" configurationId=\"ospi0.omsio5\"/>\n      <configSetting altId=\"ospi0.omsio6.p103\" configurationId=\"ospi0.omsio6\"/>\n      <configSetting altId=\"ospi0.omsio7.p101\" configurationId=\"ospi0.omsio7\"/>\n      <configSetting altId=\"ospi0.pairing.free\" configurationId=\"ospi0.pairing\"/>\n      <configSetting altId=\"p000.asel\" configurationId=\"p000\"/>\n      <configSetting altId=\"p000.gpio_mode.gpio_mode_an\" configurationId=\"p000.gpio_mode\"/>\n      <configSetting altId=\"p001.asel\" configurationId=\"p001\"/>\n      <configSetting altId=\"p001.gpio_mode.gpio_mode_an\" configurationId=\"p001.gpio_mode\"/>\n      <configSetting altId=\"p002.asel\" configurationId=\"p002\"/>\n      <configSetting altId=\"p002.gpio_mode.gpio_mode_an\" configurationId=\"p002.gpio_mode\"/>\n      <configSetting altId=\"p003.asel\" configurationId=\"p003\"/>\n      <configSetting altId=\"p003.gpio_mode.gpio_mode_an\" configurationId=\"p003.gpio_mode\"/>\n      <configSetting altId=\"p004.input\" configurationId=\"p004\"/>\n      <configSetting altId=\"p004.gpio_irq.gpio_irq_enabled\" configurationId=\"p004.gpio_irq\"/>\n      <configSetting altId=\"p004.gpio_mode.gpio_mode_in\" configurationId=\"p004.gpio_mode\"/>\n      <configSetting altId=\"p005.input\" configurationId=\"p005\"/>\n      <configSetting altId=\"p005.gpio_irq.gpio_irq_enabled\" configurationId=\"p005.gpio_irq\"/>\n      <configSetting altId=\"p005.gpio_mode.gpio_mode_in\" configurationId=\"p005.gpio_mode\"/>\n      <configSetting altId=\"p006.output.low\" configurationId=\"p006\"/>\n      <configSetting altId=\"p006.gpio_mode.gpio_mode_out.low\" configurationId=\"p006.gpio_mode\"/>\n      <configSetting altId=\"p007.output.low\" configurationId=\"p007\"/>\n      <configSetting altId=\"p007.gpio_mode.gpio_mode_out.low\" configurationId=\"p007.gpio_mode\"/>\n      <configSetting altId=\"p008.output.low\" configurationId=\"p008\"/>\n      <configSetting altId=\"p008.gpio_mode.gpio_mode_out.low\" configurationId=\"p008.gpio_mode\"/>\n      <configSetting altId=\"p014.asel\" configurationId=\"p014\"/>\n      <configSetting altId=\"p014.gpio_mode.gpio_mode_an\" configurationId=\"p014.gpio_mode\"/>\n      <configSetting altId=\"p015.asel\" configurationId=\"p015\"/>\n      <configSetting altId=\"p015.gpio_mode.gpio_mode_an\" configurationId=\"p015.gpio_mode\"/>\n      <configSetting altId=\"p100.ospi0.omsclk\" configurationId=\"p100\"/>\n      <configSetting altId=\"p100.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p100.gpio_drivecapacity\"/>\n      <configSetting altId=\"p100.gpio_mode.gpio_mode_peripheral\" configurationId=\"p100.gpio_mode\"/>\n      <configSetting altId=\"p101.ospi0.omsio7\" configurationId=\"p101\"/>\n      <configSetting altId=\"p101.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p101.gpio_drivecapacity\"/>\n      <configSetting altId=\"p101.gpio_mode.gpio_mode_peripheral\" configurationId=\"p101.gpio_mode\"/>\n      <configSetting altId=\"p102.ospi0.omsio1\" configurationId=\"p102\"/>\n      <configSetting altId=\"p102.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p102.gpio_drivecapacity\"/>\n      <configSetting altId=\"p102.gpio_mode.gpio_mode_peripheral\" configurationId=\"p102.gpio_mode\"/>\n      <configSetting altId=\"p103.ospi0.omsio6\" configurationId=\"p103\"/>\n      <configSetting altId=\"p103.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p103.gpio_drivecapacity\"/>\n      <configSetting altId=\"p103.gpio_mode.gpio_mode_peripheral\" configurationId=\"p103.gpio_mode\"/>\n      <configSetting altId=\"p104.ospi0.omdqs\" configurationId=\"p104\"/>\n      <configSetting altId=\"p104.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p104.gpio_drivecapacity\"/>\n      <configSetting altId=\"p104.gpio_mode.gpio_mode_peripheral\" configurationId=\"p104.gpio_mode\"/>\n      <configSetting altId=\"p105.ospi0.omsio5\" configurationId=\"p105\"/>\n      <configSetting altId=\"p105.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p105.gpio_drivecapacity\"/>\n      <configSetting altId=\"p105.gpio_mode.gpio_mode_peripheral\" configurationId=\"p105.gpio_mode\"/>\n      <configSetting altId=\"p106.ospi0.omsio0\" configurationId=\"p106\"/>\n      <configSetting altId=\"p106.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p106.gpio_drivecapacity\"/>\n      <configSetting altId=\"p106.gpio_mode.gpio_mode_peripheral\" configurationId=\"p106.gpio_mode\"/>\n      <configSetting altId=\"p107.ospi0.omsio3\" configurationId=\"p107\"/>\n      <configSetting altId=\"p107.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p107.gpio_drivecapacity\"/>\n      <configSetting altId=\"p107.gpio_mode.gpio_mode_peripheral\" configurationId=\"p107.gpio_mode\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p111.gpt3.gtioca\" configurationId=\"p111\"/>\n      <configSetting altId=\"p111.gpio_speed.gpio_speed_high\" configurationId=\"p111.gpio_drivecapacity\"/>\n      <configSetting altId=\"p111.gpio_mode.gpio_mode_peripheral\" configurationId=\"p111.gpio_mode\"/>\n      <configSetting altId=\"p112.output.low\" configurationId=\"p112\"/>\n      <configSetting altId=\"p112.gpio_speed.gpio_speed_high\" configurationId=\"p112.gpio_drivecapacity\"/>\n      <configSetting altId=\"p112.gpio_mode.gpio_mode_out.low\" configurationId=\"p112.gpio_mode\"/>\n      <configSetting altId=\"p113.output.low\" configurationId=\"p113\"/>\n      <configSetting altId=\"p113.gpio_speed.gpio_speed_high\" configurationId=\"p113.gpio_drivecapacity\"/>\n      <configSetting altId=\"p113.gpio_mode.gpio_mode_out.low\" configurationId=\"p113.gpio_mode\"/>\n      <configSetting altId=\"p114.output.low\" configurationId=\"p114\"/>\n      <configSetting altId=\"p114.gpio_speed.gpio_speed_high\" configurationId=\"p114.gpio_drivecapacity\"/>\n      <configSetting altId=\"p114.gpio_mode.gpio_mode_out.low\" configurationId=\"p114.gpio_mode\"/>\n      <configSetting altId=\"p115.output.low\" configurationId=\"p115\"/>\n      <configSetting altId=\"p115.gpio_speed.gpio_speed_high\" configurationId=\"p115.gpio_drivecapacity\"/>\n      <configSetting altId=\"p115.gpio_mode.gpio_mode_out.low\" configurationId=\"p115.gpio_mode\"/>\n      <configSetting altId=\"p202.spi0.miso\" configurationId=\"p202\"/>\n      <configSetting altId=\"p202.gpio_speed.gpio_speed_high\" configurationId=\"p202.gpio_drivecapacity\"/>\n      <configSetting altId=\"p202.gpio_mode.gpio_mode_peripheral\" configurationId=\"p202.gpio_mode\"/>\n      <configSetting altId=\"p203.spi0.mosi\" configurationId=\"p203\"/>\n      <configSetting altId=\"p203.gpio_speed.gpio_speed_high\" configurationId=\"p203.gpio_drivecapacity\"/>\n      <configSetting altId=\"p203.gpio_mode.gpio_mode_peripheral\" configurationId=\"p203.gpio_mode\"/>\n      <configSetting altId=\"p204.spi0.rspck\" configurationId=\"p204\"/>\n      <configSetting altId=\"p204.gpio_speed.gpio_speed_high\" configurationId=\"p204.gpio_drivecapacity\"/>\n      <configSetting altId=\"p204.gpio_mode.gpio_mode_peripheral\" configurationId=\"p204.gpio_mode\"/>\n      <configSetting altId=\"p205.spi0.ssl0\" configurationId=\"p205\"/>\n      <configSetting altId=\"p205.gpio_speed.gpio_speed_high\" configurationId=\"p205.gpio_drivecapacity\"/>\n      <configSetting altId=\"p205.gpio_mode.gpio_mode_peripheral\" configurationId=\"p205.gpio_mode\"/>\n      <configSetting altId=\"p206.spi0.ssl1\" configurationId=\"p206\"/>\n      <configSetting altId=\"p206.gpio_speed.gpio_speed_high\" configurationId=\"p206.gpio_drivecapacity\"/>\n      <configSetting altId=\"p206.gpio_mode.gpio_mode_peripheral\" configurationId=\"p206.gpio_mode\"/>\n      <configSetting altId=\"p207.output.low\" configurationId=\"p207\"/>\n      <configSetting altId=\"p207.gpio_speed.gpio_speed_high\" configurationId=\"p207.gpio_drivecapacity\"/>\n      <configSetting altId=\"p207.gpio_mode.gpio_mode_out.low\" configurationId=\"p207.gpio_mode\"/>\n      <configSetting altId=\"p208.trace0.tdata3\" configurationId=\"p208\"/>\n      <configSetting altId=\"p208.gpio_mode.gpio_mode_peripheral\" configurationId=\"p208.gpio_mode\"/>\n      <configSetting altId=\"p209.trace0.tdata2\" configurationId=\"p209\"/>\n      <configSetting altId=\"p209.gpio_mode.gpio_mode_peripheral\" configurationId=\"p209.gpio_mode\"/>\n      <configSetting altId=\"p210.trace0.tdata1\" configurationId=\"p210\"/>\n      <configSetting altId=\"p210.gpio_mode.gpio_mode_peripheral\" configurationId=\"p210.gpio_mode\"/>\n      <configSetting altId=\"p211.trace0.tdata0\" configurationId=\"p211\"/>\n      <configSetting altId=\"p211.gpio_mode.gpio_mode_peripheral\" configurationId=\"p211.gpio_mode\"/>\n      <configSetting altId=\"p212.cgc0.extal\" configurationId=\"p212\"/>\n      <configSetting altId=\"p212.gpio_mode.gpio_mode_peripheral\" configurationId=\"p212.gpio_mode\"/>\n      <configSetting altId=\"p213.cgc0.xtal\" configurationId=\"p213\"/>\n      <configSetting altId=\"p213.gpio_mode.gpio_mode_peripheral\" configurationId=\"p213.gpio_mode\"/>\n      <configSetting altId=\"p214.trace0.tclk\" configurationId=\"p214\"/>\n      <configSetting altId=\"p214.gpio_mode.gpio_mode_peripheral\" configurationId=\"p214.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n      <configSetting altId=\"p301.spi0.ssl2\" configurationId=\"p301\"/>\n      <configSetting altId=\"p301.gpio_speed.gpio_speed_high\" configurationId=\"p301.gpio_drivecapacity\"/>\n      <configSetting altId=\"p301.gpio_mode.gpio_mode_peripheral\" configurationId=\"p301.gpio_mode\"/>\n      <configSetting altId=\"p302.spi0.ssl3\" configurationId=\"p302\"/>\n      <configSetting altId=\"p302.gpio_speed.gpio_speed_high\" configurationId=\"p302.gpio_drivecapacity\"/>\n      <configSetting altId=\"p302.gpio_mode.gpio_mode_peripheral\" configurationId=\"p302.gpio_mode\"/>\n      <configSetting altId=\"p303.output.low\" configurationId=\"p303\"/>\n      <configSetting altId=\"p303.gpio_speed.gpio_speed_high\" configurationId=\"p303.gpio_drivecapacity\"/>\n      <configSetting altId=\"p303.gpio_mode.gpio_mode_out.low\" configurationId=\"p303.gpio_mode\"/>\n      <configSetting altId=\"p305.qspi0.qspclk\" configurationId=\"p305\"/>\n      <configSetting altId=\"p305.gpio_speed.gpio_speed_high\" configurationId=\"p305.gpio_drivecapacity\"/>\n      <configSetting altId=\"p305.gpio_mode.gpio_mode_peripheral\" configurationId=\"p305.gpio_mode\"/>\n      <configSetting altId=\"p306.qspi0.qssl\" configurationId=\"p306\"/>\n      <configSetting altId=\"p306.gpio_speed.gpio_speed_high\" configurationId=\"p306.gpio_drivecapacity\"/>\n      <configSetting altId=\"p306.gpio_mode.gpio_mode_peripheral\" configurationId=\"p306.gpio_mode\"/>\n      <configSetting altId=\"p307.qspi0.qio0\" configurationId=\"p307\"/>\n      <configSetting altId=\"p307.gpio_speed.gpio_speed_high\" configurationId=\"p307.gpio_drivecapacity\"/>\n      <configSetting altId=\"p307.gpio_mode.gpio_mode_peripheral\" configurationId=\"p307.gpio_mode\"/>\n      <configSetting altId=\"p308.qspi0.qio1\" configurationId=\"p308\"/>\n      <configSetting altId=\"p308.gpio_speed.gpio_speed_high\" configurationId=\"p308.gpio_drivecapacity\"/>\n      <configSetting altId=\"p308.gpio_mode.gpio_mode_peripheral\" configurationId=\"p308.gpio_mode\"/>\n      <configSetting altId=\"p309.qspi0.qio2\" configurationId=\"p309\"/>\n      <configSetting altId=\"p309.gpio_speed.gpio_speed_high\" configurationId=\"p309.gpio_drivecapacity\"/>\n      <configSetting altId=\"p309.gpio_mode.gpio_mode_peripheral\" configurationId=\"p309.gpio_mode\"/>\n      <configSetting altId=\"p310.qspi0.qio3\" configurationId=\"p310\"/>\n      <configSetting altId=\"p310.gpio_speed.gpio_speed_high\" configurationId=\"p310.gpio_drivecapacity\"/>\n      <configSetting altId=\"p310.gpio_mode.gpio_mode_peripheral\" configurationId=\"p310.gpio_mode\"/>\n      <configSetting altId=\"p311.output.low\" configurationId=\"p311\"/>\n      <configSetting altId=\"p311.gpio_speed.gpio_speed_high\" configurationId=\"p311.gpio_drivecapacity\"/>\n      <configSetting altId=\"p311.gpio_mode.gpio_mode_out.low\" configurationId=\"p311.gpio_mode\"/>\n      <configSetting altId=\"p400.input\" configurationId=\"p400\"/>\n      <configSetting altId=\"p400.gpio_irq.gpio_irq_enabled\" configurationId=\"p400.gpio_irq\"/>\n      <configSetting altId=\"p400.gpio_mode.gpio_mode_in\" configurationId=\"p400.gpio_mode\"/>\n      <configSetting altId=\"p400.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p400.gpio_pupd\"/>\n      <configSetting altId=\"p401.etherc0.rmii.mdc\" configurationId=\"p401\"/>\n      <configSetting altId=\"p401.gpio_speed.gpio_speed_high\" configurationId=\"p401.gpio_drivecapacity\"/>\n      <configSetting altId=\"p401.gpio_mode.gpio_mode_peripheral\" configurationId=\"p401.gpio_mode\"/>\n      <configSetting altId=\"p402.etherc0.rmii.mdio\" configurationId=\"p402\"/>\n      <configSetting altId=\"p402.gpio_speed.gpio_speed_high\" configurationId=\"p402.gpio_drivecapacity\"/>\n      <configSetting altId=\"p402.gpio_mode.gpio_mode_peripheral\" configurationId=\"p402.gpio_mode\"/>\n      <configSetting altId=\"p403.output.high\" configurationId=\"p403\"/>\n      <configSetting altId=\"p403.gpio_speed.gpio_speed_high\" configurationId=\"p403.gpio_drivecapacity\"/>\n      <configSetting altId=\"p403.gpio_mode.gpio_mode_out.high\" configurationId=\"p403.gpio_mode\"/>\n      <configSetting altId=\"p404.output.low\" configurationId=\"p404\"/>\n      <configSetting altId=\"p404.gpio_speed.gpio_speed_high\" configurationId=\"p404.gpio_drivecapacity\"/>\n      <configSetting altId=\"p404.gpio_mode.gpio_mode_out.low\" configurationId=\"p404.gpio_mode\"/>\n      <configSetting altId=\"p405.etherc0.rmii.txd_en\" configurationId=\"p405\"/>\n      <configSetting altId=\"p405.gpio_speed.gpio_speed_high\" configurationId=\"p405.gpio_drivecapacity\"/>\n      <configSetting altId=\"p405.gpio_mode.gpio_mode_peripheral\" configurationId=\"p405.gpio_mode\"/>\n      <configSetting altId=\"p406.etherc0.rmii.txd1\" configurationId=\"p406\"/>\n      <configSetting altId=\"p406.gpio_speed.gpio_speed_high\" configurationId=\"p406.gpio_drivecapacity\"/>\n      <configSetting altId=\"p406.gpio_mode.gpio_mode_peripheral\" configurationId=\"p406.gpio_mode\"/>\n      <configSetting altId=\"p407.usbfs0.vbus\" configurationId=\"p407\"/>\n      <configSetting altId=\"p407.gpio_speed.gpio_speed_high\" configurationId=\"p407.gpio_drivecapacity\"/>\n      <configSetting altId=\"p407.gpio_mode.gpio_mode_peripheral\" configurationId=\"p407.gpio_mode\"/>\n      <configSetting altId=\"p408.output.low\" configurationId=\"p408\"/>\n      <configSetting altId=\"p408.gpio_speed.gpio_speed_high\" configurationId=\"p408.gpio_drivecapacity\"/>\n      <configSetting altId=\"p408.gpio_mode.gpio_mode_out.low\" configurationId=\"p408.gpio_mode\"/>\n      <configSetting altId=\"p409.input\" configurationId=\"p409\"/>\n      <configSetting altId=\"p409.gpio_irq.gpio_irq_enabled\" configurationId=\"p409.gpio_irq\"/>\n      <configSetting altId=\"p409.gpio_mode.gpio_mode_in\" configurationId=\"p409.gpio_mode\"/>\n      <configSetting altId=\"p409.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p409.gpio_pupd\"/>\n      <configSetting altId=\"p410.spi1.miso\" configurationId=\"p410\"/>\n      <configSetting altId=\"p410.gpio_speed.gpio_speed_high\" configurationId=\"p410.gpio_drivecapacity\"/>\n      <configSetting altId=\"p410.gpio_mode.gpio_mode_peripheral\" configurationId=\"p410.gpio_mode\"/>\n      <configSetting altId=\"p411.spi1.mosi\" configurationId=\"p411\"/>\n      <configSetting altId=\"p411.gpio_speed.gpio_speed_high\" configurationId=\"p411.gpio_drivecapacity\"/>\n      <configSetting altId=\"p411.gpio_mode.gpio_mode_peripheral\" configurationId=\"p411.gpio_mode\"/>\n      <configSetting altId=\"p412.spi1.rspck\" configurationId=\"p412\"/>\n      <configSetting altId=\"p412.gpio_speed.gpio_speed_high\" configurationId=\"p412.gpio_drivecapacity\"/>\n      <configSetting altId=\"p412.gpio_mode.gpio_mode_peripheral\" configurationId=\"p412.gpio_mode\"/>\n      <configSetting altId=\"p413.spi1.ssl0\" configurationId=\"p413\"/>\n      <configSetting altId=\"p413.gpio_speed.gpio_speed_high\" configurationId=\"p413.gpio_drivecapacity\"/>\n      <configSetting altId=\"p413.gpio_mode.gpio_mode_peripheral\" configurationId=\"p413.gpio_mode\"/>\n      <configSetting altId=\"p414.iic2.sda\" configurationId=\"p414\"/>\n      <configSetting altId=\"p414.gpio_speed.gpio_speed_high\" configurationId=\"p414.gpio_drivecapacity\"/>\n      <configSetting altId=\"p414.gpio_mode.gpio_mode_peripheral\" configurationId=\"p414.gpio_mode\"/>\n      <configSetting altId=\"p415.iic2.scl\" configurationId=\"p415\"/>\n      <configSetting altId=\"p415.gpio_speed.gpio_speed_high\" configurationId=\"p415.gpio_drivecapacity\"/>\n      <configSetting altId=\"p415.gpio_mode.gpio_mode_peripheral\" configurationId=\"p415.gpio_mode\"/>\n      <configSetting altId=\"p500.usbfs0.vbusen\" configurationId=\"p500\"/>\n      <configSetting altId=\"p500.gpio_speed.gpio_speed_high\" configurationId=\"p500.gpio_drivecapacity\"/>\n      <configSetting altId=\"p500.gpio_mode.gpio_mode_peripheral\" configurationId=\"p500.gpio_mode\"/>\n      <configSetting altId=\"p501.usbfs0.ovrcura\" configurationId=\"p501\"/>\n      <configSetting altId=\"p501.gpio_speed.gpio_speed_high\" configurationId=\"p501.gpio_drivecapacity\"/>\n      <configSetting altId=\"p501.gpio_mode.gpio_mode_peripheral\" configurationId=\"p501.gpio_mode\"/>\n      <configSetting altId=\"p505.sci6.scl\" configurationId=\"p505\"/>\n      <configSetting altId=\"p505.gpio_speed.gpio_speed_high\" configurationId=\"p505.gpio_drivecapacity\"/>\n      <configSetting altId=\"p505.gpio_mode.gpio_mode_peripheral\" configurationId=\"p505.gpio_mode\"/>\n      <configSetting altId=\"p505.gpio_otype.gpio_otype_n_ch_od\" configurationId=\"p505.gpio_otype\"/>\n      <configSetting altId=\"p506.sci6.sda\" configurationId=\"p506\"/>\n      <configSetting altId=\"p506.gpio_speed.gpio_speed_high\" configurationId=\"p506.gpio_drivecapacity\"/>\n      <configSetting altId=\"p506.gpio_mode.gpio_mode_peripheral\" configurationId=\"p506.gpio_mode\"/>\n      <configSetting altId=\"p506.gpio_otype.gpio_otype_n_ch_od\" configurationId=\"p506.gpio_otype\"/>\n      <configSetting altId=\"p511.iic1.sda\" configurationId=\"p511\"/>\n      <configSetting altId=\"p511.gpio_speed.gpio_speed_high\" configurationId=\"p511.gpio_drivecapacity\"/>\n      <configSetting altId=\"p511.gpio_mode.gpio_mode_peripheral\" configurationId=\"p511.gpio_mode\"/>\n      <configSetting altId=\"p512.iic1.scl\" configurationId=\"p512\"/>\n      <configSetting altId=\"p512.gpio_speed.gpio_speed_high\" configurationId=\"p512.gpio_drivecapacity\"/>\n      <configSetting altId=\"p512.gpio_mode.gpio_mode_peripheral\" configurationId=\"p512.gpio_mode\"/>\n      <configSetting altId=\"p600.ospi0.omsio4\" configurationId=\"p600\"/>\n      <configSetting altId=\"p600.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p600.gpio_drivecapacity\"/>\n      <configSetting altId=\"p600.gpio_mode.gpio_mode_peripheral\" configurationId=\"p600.gpio_mode\"/>\n      <configSetting altId=\"p601.ospi0.omsio2\" configurationId=\"p601\"/>\n      <configSetting altId=\"p601.gpio_speed.gpio_speed_highspeedhigh\" configurationId=\"p601.gpio_drivecapacity\"/>\n      <configSetting altId=\"p601.gpio_mode.gpio_mode_peripheral\" configurationId=\"p601.gpio_mode\"/>\n      <configSetting altId=\"p602.ospi0.omcs1\" configurationId=\"p602\"/>\n      <configSetting altId=\"p602.gpio_mode.gpio_mode_peripheral\" configurationId=\"p602.gpio_mode\"/>\n      <configSetting altId=\"p608.output.low\" configurationId=\"p608\"/>\n      <configSetting altId=\"p608.gpio_speed.gpio_speed_high\" configurationId=\"p608.gpio_drivecapacity\"/>\n      <configSetting altId=\"p608.gpio_mode.gpio_mode_out.low\" configurationId=\"p608.gpio_mode\"/>\n      <configSetting altId=\"p609.can1.ctx\" configurationId=\"p609\"/>\n      <configSetting altId=\"p609.gpio_mode.gpio_mode_peripheral\" configurationId=\"p609.gpio_mode\"/>\n      <configSetting altId=\"p610.can1.crx\" configurationId=\"p610\"/>\n      <configSetting altId=\"p610.gpio_mode.gpio_mode_peripheral\" configurationId=\"p610.gpio_mode\"/>\n      <configSetting altId=\"p611.output.low\" configurationId=\"p611\"/>\n      <configSetting altId=\"p611.gpio_speed.gpio_speed_high\" configurationId=\"p611.gpio_drivecapacity\"/>\n      <configSetting altId=\"p611.gpio_mode.gpio_mode_out.low\" configurationId=\"p611.gpio_mode\"/>\n      <configSetting altId=\"p613.sci7.txd\" configurationId=\"p613\"/>\n      <configSetting altId=\"p613.gpio_mode.gpio_mode_peripheral\" configurationId=\"p613.gpio_mode\"/>\n      <configSetting altId=\"p614.sci7.rxd\" configurationId=\"p614\"/>\n      <configSetting altId=\"p614.gpio_mode.gpio_mode_peripheral\" configurationId=\"p614.gpio_mode\"/>\n      <configSetting altId=\"p615.output.high\" configurationId=\"p615\"/>\n      <configSetting altId=\"p615.gpio_speed.gpio_speed_medium\" configurationId=\"p615.gpio_drivecapacity\"/>\n      <configSetting altId=\"p615.gpio_mode.gpio_mode_out.high\" configurationId=\"p615.gpio_mode\"/>\n      <configSetting altId=\"p700.etherc0.rmii.txd0\" configurationId=\"p700\"/>\n      <configSetting altId=\"p700.gpio_speed.gpio_speed_high\" configurationId=\"p700.gpio_drivecapacity\"/>\n      <configSetting altId=\"p700.gpio_mode.gpio_mode_peripheral\" configurationId=\"p700.gpio_mode\"/>\n      <configSetting altId=\"p701.etherc0.rmii.ref50ck\" configurationId=\"p701\"/>\n      <configSetting altId=\"p701.gpio_speed.gpio_speed_high\" configurationId=\"p701.gpio_drivecapacity\"/>\n      <configSetting altId=\"p701.gpio_mode.gpio_mode_peripheral\" configurationId=\"p701.gpio_mode\"/>\n      <configSetting altId=\"p702.etherc0.rmii.rxd0\" configurationId=\"p702\"/>\n      <configSetting altId=\"p702.gpio_speed.gpio_speed_high\" configurationId=\"p702.gpio_drivecapacity\"/>\n      <configSetting altId=\"p702.gpio_mode.gpio_mode_peripheral\" configurationId=\"p702.gpio_mode\"/>\n      <configSetting altId=\"p703.etherc0.rmii.rxd1\" configurationId=\"p703\"/>\n      <configSetting altId=\"p703.gpio_speed.gpio_speed_high\" configurationId=\"p703.gpio_drivecapacity\"/>\n      <configSetting altId=\"p703.gpio_mode.gpio_mode_peripheral\" configurationId=\"p703.gpio_mode\"/>\n      <configSetting altId=\"p704.etherc0.rmii.rx_er\" configurationId=\"p704\"/>\n      <configSetting altId=\"p704.gpio_speed.gpio_speed_high\" configurationId=\"p704.gpio_drivecapacity\"/>\n      <configSetting altId=\"p704.gpio_mode.gpio_mode_peripheral\" configurationId=\"p704.gpio_mode\"/>\n      <configSetting altId=\"p705.etherc0.rmii.crs_dv\" configurationId=\"p705\"/>\n      <configSetting altId=\"p705.gpio_speed.gpio_speed_high\" configurationId=\"p705.gpio_drivecapacity\"/>\n      <configSetting altId=\"p705.gpio_mode.gpio_mode_peripheral\" configurationId=\"p705.gpio_mode\"/>\n      <configSetting altId=\"p706.input\" configurationId=\"p706\"/>\n      <configSetting altId=\"p706.gpio_irq.gpio_irq_enabled\" configurationId=\"p706.gpio_irq\"/>\n      <configSetting altId=\"p706.gpio_mode.gpio_mode_in\" configurationId=\"p706.gpio_mode\"/>\n      <configSetting altId=\"p707.usbhs0.ovrcura\" configurationId=\"p707\"/>\n      <configSetting altId=\"p707.gpio_mode.gpio_mode_peripheral\" configurationId=\"p707.gpio_mode\"/>\n      <configSetting altId=\"p708.spi1.ssl3\" configurationId=\"p708\"/>\n      <configSetting altId=\"p708.gpio_speed.gpio_speed_high\" configurationId=\"p708.gpio_drivecapacity\"/>\n      <configSetting altId=\"p708.gpio_mode.gpio_mode_peripheral\" configurationId=\"p708.gpio_mode\"/>\n      <configSetting altId=\"p905.input\" configurationId=\"p905\"/>\n      <configSetting altId=\"p905.gpio_irq.gpio_irq_enabled\" configurationId=\"p905.gpio_irq\"/>\n      <configSetting altId=\"p905.gpio_mode.gpio_mode_in\" configurationId=\"p905.gpio_mode\"/>\n      <configSetting altId=\"p905.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p905.gpio_pupd\"/>\n      <configSetting altId=\"pb00.usbhs0.vbusen\" configurationId=\"pb00\"/>\n      <configSetting altId=\"pb00.gpio_speed.gpio_speed_high\" configurationId=\"pb00.gpio_drivecapacity\"/>\n      <configSetting altId=\"pb00.gpio_mode.gpio_mode_peripheral\" configurationId=\"pb00.gpio_mode\"/>\n      <configSetting altId=\"pb01.usbhs0.vbus\" configurationId=\"pb01\"/>\n      <configSetting altId=\"pb01.gpio_speed.gpio_speed_high\" configurationId=\"pb01.gpio_drivecapacity\"/>\n      <configSetting altId=\"pb01.gpio_mode.gpio_mode_peripheral\" configurationId=\"pb01.gpio_mode\"/>\n      <configSetting altId=\"qspi0.mode.quad.free\" configurationId=\"qspi0.mode\"/>\n      <configSetting altId=\"qspi0.pairing.free\" configurationId=\"qspi0.pairing\"/>\n      <configSetting altId=\"qspi0.qio0.p307\" configurationId=\"qspi0.qio0\"/>\n      <configSetting altId=\"qspi0.qio1.p308\" configurationId=\"qspi0.qio1\"/>\n      <configSetting altId=\"qspi0.qio2.p309\" configurationId=\"qspi0.qio2\"/>\n      <configSetting altId=\"qspi0.qio3.p310\" configurationId=\"qspi0.qio3\"/>\n      <configSetting altId=\"qspi0.qspclk.p305\" configurationId=\"qspi0.qspclk\"/>\n      <configSetting altId=\"qspi0.qssl.p306\" configurationId=\"qspi0.qssl\"/>\n      <configSetting altId=\"sci6.mode.iic.free\" configurationId=\"sci6.mode\"/>\n      <configSetting altId=\"sci6.scl.p505\" configurationId=\"sci6.scl\"/>\n      <configSetting altId=\"sci6.sda.p506\" configurationId=\"sci6.sda\"/>\n      <configSetting altId=\"sci7.mode.asynchronous.free\" configurationId=\"sci7.mode\"/>\n      <configSetting altId=\"sci7.rxd.p614\" configurationId=\"sci7.rxd\"/>\n      <configSetting altId=\"sci7.txd.p613\" configurationId=\"sci7.txd\"/>\n      <configSetting altId=\"spi0.miso.p202\" configurationId=\"spi0.miso\"/>\n      <configSetting altId=\"spi0.mode.custom.free\" configurationId=\"spi0.mode\"/>\n      <configSetting altId=\"spi0.mosi.p203\" configurationId=\"spi0.mosi\"/>\n      <configSetting altId=\"spi0.pairing.free\" configurationId=\"spi0.pairing\"/>\n      <configSetting altId=\"spi0.rspck.p204\" configurationId=\"spi0.rspck\"/>\n      <configSetting altId=\"spi0.ssl0.p205\" configurationId=\"spi0.ssl0\"/>\n      <configSetting altId=\"spi0.ssl1.p206\" configurationId=\"spi0.ssl1\"/>\n      <configSetting altId=\"spi0.ssl2.p301\" configurationId=\"spi0.ssl2\"/>\n      <configSetting altId=\"spi0.ssl3.p302\" configurationId=\"spi0.ssl3\"/>\n      <configSetting altId=\"spi1.miso.p410\" configurationId=\"spi1.miso\"/>\n      <configSetting altId=\"spi1.mode.enabled.free\" configurationId=\"spi1.mode\"/>\n      <configSetting altId=\"spi1.mosi.p411\" configurationId=\"spi1.mosi\"/>\n      <configSetting altId=\"spi1.pairing.free\" configurationId=\"spi1.pairing\"/>\n      <configSetting altId=\"spi1.rspck.p412\" configurationId=\"spi1.rspck\"/>\n      <configSetting altId=\"spi1.ssl0.p413\" configurationId=\"spi1.ssl0\"/>\n      <configSetting altId=\"spi1.ssl3.p708\" configurationId=\"spi1.ssl3\"/>\n      <configSetting altId=\"trace0.mode.trace4bit\" configurationId=\"trace0.mode\"/>\n      <configSetting altId=\"trace0.tclk.p214\" configurationId=\"trace0.tclk\"/>\n      <configSetting altId=\"trace0.tdata0.p211\" configurationId=\"trace0.tdata0\"/>\n      <configSetting altId=\"trace0.tdata1.p210\" configurationId=\"trace0.tdata1\"/>\n      <configSetting altId=\"trace0.tdata2.p209\" configurationId=\"trace0.tdata2\"/>\n      <configSetting altId=\"trace0.tdata3.p208\" configurationId=\"trace0.tdata3\"/>\n      <configSetting altId=\"usbfs0.mode.custom\" configurationId=\"usbfs0.mode\"/>\n      <configSetting altId=\"usbfs0.ovrcura.p501\" configurationId=\"usbfs0.ovrcura\"/>\n      <configSetting altId=\"usbfs0.vbus.p407\" configurationId=\"usbfs0.vbus\"/>\n      <configSetting altId=\"usbfs0.vbusen.p500\" configurationId=\"usbfs0.vbusen\"/>\n      <configSetting altId=\"usbhs0.mode.custom\" configurationId=\"usbhs0.mode\"/>\n      <configSetting altId=\"usbhs0.ovrcura.p707\" configurationId=\"usbhs0.ovrcura\"/>\n      <configSetting altId=\"usbhs0.vbus.pb01\" configurationId=\"usbhs0.vbus\"/>\n      <configSetting altId=\"usbhs0.vbusen.pb00\" configurationId=\"usbhs0.vbusen\"/>\n    </pincfg>\n    <pincfg active=\"false\" name=\"R7FA6M5BH3CFC.pincfg\" selected=\"false\" symbol=\"\">\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n    </pincfg>\n  </raPinConfiguration>\n</raConfiguration>\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-m85 CACHE INTERNAL \"System Processor\")\nset(MCU_VARIANT ra8m1)\n\nset(JLINK_DEVICE R7FA8M1AH)\n#set(JLINK_OPTION \"-USB 001083115236\")\n\n# device default to PORT 1 High Speed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: RA8M1 EK\n   url: https://www.renesas.com/en/products/microcontrollers-microprocessors/ra-cortex-m-mcus/ek-ra8m1-evaluation-kit-ra8m1-mcu-group\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_STATE_ON          1\n#define BUTTON_STATE_ACTIVE   0\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/board.mk",
    "content": "CPU_CORE = cortex-m85\nMCU_VARIANT = ra8m1\n\n# For flash-jlink target\nJLINK_DEVICE = R7FA8M1AH\n\n# Port 1 is highspeed\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ozone/ra8m1.jdebug",
    "content": "\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n  Project.SetTraceSource (\"Trace Pins\");\n  Project.SetDevice (\"R7FA8M1AH\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"50 MHz\");\n\n  Project.AddSvdFile (\"$(InstallDir)/Config/CPU/Cortex-M85F.svd\");\n  Project.AddSvdFile (\"../../../../../../../cmsis-svd-data/data/Renesas/R7FA6M5BH.svd\");\n\n  File.Open (\"../../../../../../examples/cmake-build-ra8m1_ek/device/cdc_msc/cdc_msc.elf\");\n}\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\nvoid BeforeTargetConnect (void) {\n  // Trace pin init is done by J-Link script file as J-Link script files are IDE independent\n\t//Project.SetJLinkScript(\"../../../debug.jlinkscript\");\n  Project.SetJLinkScript (\"$(ProjectDir)/Renesas_RA8_TracePins.pex\");\n}\n\n/*********************************************************************\n*\n*       AfterTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetDownload\n*\n* Function description\n*   Replaces the default program download routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*      AfterTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*   The default implementation initializes SP and PC to reset values.\n*\n**********************************************************************\n*/\nvoid AfterTargetDownload (void) {\n  _SetupTarget();\n}\n\n/*********************************************************************\n*\n*       BeforeTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetHalt\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetHalt (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetResume\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetResume (void) {\n//}\n\n/*********************************************************************\n*\n*       OnSnapshotLoad\n*\n* Function description\n*   Called upon loading a snapshot. Optional.\n*\n* Additional information\n*   This function is used to restore the target state in cases\n*   where values cannot simply be written to the target.\n*   Typical use: GPIO clock needs to be enabled, before\n*   GPIO is configured.\n*\n**********************************************************************\n*/\n//void OnSnapshotLoad (void) {\n//}\n\n/*********************************************************************\n*\n*       OnSnapshotSave\n*\n* Function description\n*   Called upon saving a snapshot. Optional.\n*\n* Additional information\n*   This function is usually used to save values of the target\n*   state which can either not be trivially read,\n*   or need to be restored in a specific way or order.\n*   Typically use: Memory Mapped Registers,\n*   such as PLL and GPIO configuration.\n*\n**********************************************************************\n*/\n//void OnSnapshotSave (void) {\n//}\n\n/*********************************************************************\n*\n*       OnError\n*\n* Function description\n*   Called when an error occurred. Optional.\n*\n**********************************************************************\n*/\n//void OnError (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterProjectLoad\n*\n* Function description\n*   After Project load routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterProjectLoad (void) {\n//}\n\n/*********************************************************************\n*\n*       _SetupTarget\n*\n* Function description\n*   Setup the target.\n*   Called by AfterTargetReset() and AfterTargetDownload().\n*\n*   Auto-generated function. May be overridden by Ozone.\n*\n**********************************************************************\n*/\nvoid _SetupTarget(void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n  //\n  // Set up initial stack pointer\n  //\n  SP = Target.ReadU32(VectorTableAddr);\n  if (SP != 0xFFFFFFFF) {\n    Target.SetReg(\"SP\", SP);\n  }\n  //\n  // Set up entry point PC\n  //\n  PC = Elf.GetEntryPointPC();\n  if (PC != 0xFFFFFFFF) {\n    Target.SetReg(\"PC\", PC);\n  } else {\n    Util.Error(\"Project script error: failed to set up entry point PC\", 1);\n  }\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_cfg/fsp_cfg/bsp/bsp_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CFG_H_\n#define BSP_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_clock_cfg.h\"\n            #include \"bsp_mcu_family_cfg.h\"\n            #include \"board_cfg.h\"\n            #define RA_NOT_DEFINED 0\n            #ifndef BSP_CFG_RTOS\n             #if (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (2)\n             #elif (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (1)\n             #else\n              #define BSP_CFG_RTOS (0)\n             #endif\n            #endif\n            #ifndef BSP_CFG_RTC_USED\n             #define BSP_CFG_RTC_USED (RA_NOT_DEFINED)\n            #endif\n            #undef RA_NOT_DEFINED\n            #if defined(_RA_BOOT_IMAGE)\n             #define BSP_CFG_BOOT_IMAGE (1)\n            #endif\n            #define BSP_CFG_MCU_VCC_MV (3300)\n            #define BSP_CFG_STACK_MAIN_BYTES (0x1000)\n            #define BSP_CFG_HEAP_BYTES (0x1000)\n            #define BSP_CFG_PARAM_CHECKING_ENABLE (0)\n            #define BSP_CFG_ASSERT (0)\n            #define BSP_CFG_ERROR_LOG (0)\n\n            #define BSP_CFG_PFS_PROTECT ((1))\n\n            #define BSP_CFG_C_RUNTIME_INIT ((1))\n            #define BSP_CFG_EARLY_INIT     ((0))\n\n            #define BSP_CFG_STARTUP_CLOCK_REG_NOT_RESET ((0))\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_POPULATED\n            #define BSP_CLOCK_CFG_MAIN_OSC_POPULATED (1)\n            #endif\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE\n            #define BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_DRIVE\n            #define BSP_CLOCK_CFG_SUBCLOCK_DRIVE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_POPULATED\n            #define BSP_CLOCK_CFG_SUBCLOCK_POPULATED (1)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS\n            #define BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS 1000\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_CFG_H_\n#define BSP_MCU_DEVICE_CFG_H_\n#define BSP_CFG_MCU_PART_SERIES (8)\n#endif /* BSP_MCU_DEVICE_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_pn_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_R7FA8M1AHECBD\n      #define BSP_MCU_FEATURE_SET ('A')\n      #define BSP_ROM_SIZE_BYTES (2064384)\n      #define BSP_RAM_SIZE_BYTES (917504)\n      #define BSP_DATA_FLASH_SIZE_BYTES (12288)\n      #define BSP_PACKAGE_BGA\n      #define BSP_PACKAGE_PINS (224)\n#endif /* BSP_MCU_DEVICE_PN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_cfg/fsp_cfg/bsp/bsp_mcu_family_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_FAMILY_CFG_H_\n#define BSP_MCU_FAMILY_CFG_H_\n#include \"bsp_mcu_device_pn_cfg.h\"\n            #include \"bsp_mcu_device_cfg.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra8m1/bsp_override.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra8m1/bsp_mcu_info.h\"\n            #include \"bsp_clock_cfg.h\"\n            #define BSP_MCU_GROUP_RA8M1 (1)\n            #define BSP_LOCO_HZ                 (32768)\n            #define BSP_MOCO_HZ                 (8000000)\n            #define BSP_SUB_CLOCK_HZ            (0)\n            #if   BSP_CFG_HOCO_FREQUENCY == 0\n                #define BSP_HOCO_HZ                 (16000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 1\n                #define BSP_HOCO_HZ                 (18000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 2\n                #define BSP_HOCO_HZ                 (20000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 4\n                #define BSP_HOCO_HZ                 (32000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 7\n                #define BSP_HOCO_HZ                 (48000000)\n            #else\n                #error \"Invalid HOCO frequency chosen (BSP_CFG_HOCO_FREQUENCY) in bsp_clock_cfg.h\"\n            #endif\n\n            #define BSP_CFG_FLL_ENABLE                   (0)\n\n            #define BSP_CFG_CLOCK_SETTLING_DELAY_ENABLE  (1)\n            #define BSP_CFG_SLEEP_MODE_DELAY_ENABLE      (1)\n            #define BSP_CFG_MSTP_CHANGE_DELAY_ENABLE     (1)\n            #define BSP_CFG_RTOS_IDLE_SLEEP           (0)\n            #define BSP_CFG_CLOCK_SETTLING_DELAY_US      (150)\n\n            #if defined(BSP_PACKAGE_LQFP) && (BSP_PACKAGE_PINS == 100)\n                #define BSP_MAX_CLOCK_CHANGE_THRESHOLD (180000000U)\n            #elif defined(BSP_PACKAGE_LQFP)\n                #define BSP_MAX_CLOCK_CHANGE_THRESHOLD (200000000U)\n            #else\n                #define BSP_MAX_CLOCK_CHANGE_THRESHOLD (240000000U)\n            #endif\n\n            #define BSP_CORTEX_VECTOR_TABLE_ENTRIES    (16U)\n            #define BSP_VECTOR_TABLE_MAX_ENTRIES       (112U)\n            #define BSP_CFG_INLINE_IRQ_FUNCTIONS       (1)\n\n            #if defined(_RA_TZ_SECURE)\n            #define BSP_TZ_SECURE_BUILD           (1)\n            #define BSP_TZ_NONSECURE_BUILD        (0)\n            #elif defined(_RA_TZ_NONSECURE)\n            #define BSP_TZ_SECURE_BUILD           (0)\n            #define BSP_TZ_NONSECURE_BUILD        (1)\n            #else\n            #define BSP_TZ_SECURE_BUILD           (0)\n            #define BSP_TZ_NONSECURE_BUILD        (0)\n            #endif\n\n            /* TrustZone Settings */\n            #define BSP_TZ_CFG_INIT_SECURE_ONLY       (BSP_CFG_CLOCKS_SECURE || (!BSP_CFG_CLOCKS_OVERRIDE))\n            #define BSP_TZ_CFG_SKIP_INIT              (BSP_TZ_NONSECURE_BUILD && BSP_TZ_CFG_INIT_SECURE_ONLY)\n            #define BSP_TZ_CFG_EXCEPTION_RESPONSE     (0)\n\n            /* CMSIS TrustZone Settings */\n            #define SCB_CSR_AIRCR_INIT                (1)\n            #define SCB_AIRCR_BFHFNMINS_VAL           (0)\n            #define SCB_AIRCR_SYSRESETREQS_VAL        (1)\n            #define SCB_AIRCR_PRIS_VAL                (0)\n            #define TZ_FPU_NS_USAGE                   (1)\n#ifndef SCB_NSACR_CP10_11_VAL\n            #define SCB_NSACR_CP10_11_VAL             (3U)\n#endif\n\n#ifndef FPU_FPCCR_TS_VAL\n            #define FPU_FPCCR_TS_VAL                  (1U)\n#endif\n            #define FPU_FPCCR_CLRONRETS_VAL           (1)\n\n#ifndef FPU_FPCCR_CLRONRET_VAL\n            #define FPU_FPCCR_CLRONRET_VAL            (1)\n#endif\n\n            /* Type 1 Peripheral Security Attribution */\n\n            /* Peripheral Security Attribution Register (PSAR) Settings */\n#ifndef BSP_TZ_CFG_PSARB\n#define BSP_TZ_CFG_PSARB (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4) /* I3C */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* IIC1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9) /* IIC0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* USBFS */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* USBHS */ | \\\n            (1 << 15) /* ETHERC/EDMAC */ | \\\n            (1 << 16) /* OSPI */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 18) /* SPI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 19) /* SPI0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* SCI9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* SCI4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* SCI3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 29) /* SCI2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 30) /* SCI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* SCI0 */)\n#endif\n#ifndef BSP_TZ_CFG_PSARC\n#define BSP_TZ_CFG_PSARC (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0) /* CAC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* CRC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7) /* SSIE1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* SSIE0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* SDHI1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* SDHI0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13) /* DOC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 16) /* CEU */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 26) /* CANFD1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* CANFD0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* RSIP-E51A */)\n#endif\n#ifndef BSP_TZ_CFG_PSARD\n#define BSP_TZ_CFG_PSARD (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4) /* AGT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5) /* AGT0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11) /* POEG3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12) /* POEG2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13) /* POEG1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14) /* POEG0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15) /* ADC121 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 16) /* ADC120 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 20) /* DAC120 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* TSN */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* ACMPHS1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* ACMPHS0 */)\n#endif\n#ifndef BSP_TZ_CFG_PSARE\n#define BSP_TZ_CFG_PSARE (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1) /* WDT */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2) /* IWDT */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3) /* RTC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8) /* ULPT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9) /* ULPT0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 18) /* GPT13 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 19) /* GPT12 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 20) /* GPT11 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 21) /* GPT10 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* GPT9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 23) /* GPT8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 24) /* GPT7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 25) /* GPT6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 26) /* GPT5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 27) /* GPT4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 28) /* GPT3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 29) /* GPT2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 30) /* GPT1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* GPT0 */)\n#endif\n#ifndef BSP_TZ_CFG_MSSAR\n#define BSP_TZ_CFG_MSSAR (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 22) /* DTC_DMAC */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 31) /* ELC */)\n#endif\n\n            /* Type 2 Peripheral Security Attribution */\n\n            /* Security attribution for RSTSRn registers. */\n#ifndef BSP_TZ_CFG_RSTSAR\n#define BSP_TZ_CFG_RSTSAR (0x00000007U)\n#endif\n\n            /* Security attribution for registers of LVD channels. */\n#ifndef BSP_TZ_CFG_LVDSAR\n            /* The LVD driver needs to access both channels. This means that the security attribution for both channels must be the same. */\n#if (RA_NOT_DEFINED > 0) || (RA_NOT_DEFINED > 0)\n#define BSP_TZ_CFG_LVDSAR (0U)\n#else\n#define BSP_TZ_CFG_LVDSAR (3U)\n#endif\n#endif\n\n            /* Security attribution for LPM registers.\n             * - OPCCR based on clock security.\n             * - Set remaining registers based on LPM security.\n             */\n#ifndef BSP_TZ_CFG_LPMSAR\n#define BSP_TZ_CFG_LPMSAR ((RA_NOT_DEFINED > 0) ? BSP_CFG_CLOCKS_SECURE == 0 : (\\\n                                                  0x002E0106U | \\\n                                                  (BSP_CFG_CLOCKS_SECURE == 0)))\n#endif\n            /* Deep Standby Interrupt Factor Security Attribution Register. */\n#ifndef BSP_TZ_CFG_DPFSAR\n#define BSP_TZ_CFG_DPFSAR ((RA_NOT_DEFINED > 0) ? 0U : 0xAF1FFFFFU)\n#endif\n            /* RAM Standby Control Security Attribution Register. */\n#ifndef BSP_TZ_CFG_RSCSAR\n#define BSP_TZ_CFG_RSCSAR ((RA_NOT_DEFINED > 0) ? 0U : 0x00037FFFU)\n#endif\n\n            /* Security attribution for CGC registers. */\n#ifndef BSP_TZ_CFG_CGFSAR\n#if BSP_CFG_CLOCKS_SECURE\n/* Protect all CGC registers from Non-secure write access. */\n#define BSP_TZ_CFG_CGFSAR (0U)\n#else\n/* Allow Secure and Non-secure write access. */\n#define BSP_TZ_CFG_CGFSAR (0x047F3BFDU)\n#endif\n#endif\n\n            /* Security attribution for Battery Backup registers. */\n#ifndef BSP_TZ_CFG_BBFSAR\n#if 0\n#define BSP_TZ_CFG_BBFSAR   (0U)\n#else\n#define BSP_TZ_CFG_BBFSAR   (0x1FU)\n#endif\n#endif\n\n            /* Security attribution for Battery Backup registers (VBTBKRn). */\n#ifndef BSP_TZ_CFG_VBRSABAR\n#if 0\n#define BSP_TZ_CFG_VBRSABAR (0xFFE0)\n#else\n#define BSP_TZ_CFG_VBRSABAR (0xED00)\n#endif\n#endif\n\n            /* Security attribution for registers for IRQ channels. */\n#ifndef BSP_TZ_CFG_ICUSARA\n#define BSP_TZ_CFG_ICUSARA (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0U) /* External IRQ0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1U) /* External IRQ1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2U) /* External IRQ2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3U) /* External IRQ3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4U) /* External IRQ4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5U) /* External IRQ5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 6U) /* External IRQ6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7U) /* External IRQ7 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 8U) /* External IRQ8 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 9U) /* External IRQ9 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 10U) /* External IRQ10 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 11U) /* External IRQ11 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 12U) /* External IRQ12 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 13U) /* External IRQ13 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 14U) /* External IRQ14 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 15U) /* External IRQ15 */)\n#endif\n\n            /* Security attribution for NMI registers. */\n#ifndef BSP_TZ_CFG_ICUSARB\n#define BSP_TZ_CFG_ICUSARB (0 | 0U) /* Should match AIRCR.BFHFNMINS. */\n#endif\n\n            /* Security attribution for registers for DMAC channels */\n#ifndef BSP_TZ_CFG_DMACCHSAR\n#define BSP_TZ_CFG_DMACCHSAR (\\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 0U) /* DMAC Channel 0 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 1U) /* DMAC Channel 1 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 2U) /* DMAC Channel 2 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 3U) /* DMAC Channel 3 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 4U) /* DMAC Channel 4 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 5U) /* DMAC Channel 5 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 6U) /* DMAC Channel 6 */ | \\\n            (((RA_NOT_DEFINED > 0) ? 0U : 1U) << 7U) /* DMAC Channel 7 */)\n#endif\n\n            /* Security attribution registers for WUPEN0. */\n#ifndef BSP_TZ_CFG_ICUSARE\n#define BSP_TZ_CFG_ICUSARE ((RA_NOT_DEFINED > 0) ? 0U : 0xFF1D0000U)\n#endif\n\n            /* Security attribution registers for WUPEN1. */\n#ifndef BSP_TZ_CFG_ICUSARF\n#define BSP_TZ_CFG_ICUSARF ((RA_NOT_DEFINED > 0) ? 0U : 0x00007F08U)\n#endif\n\n            /* Trusted Event Route Control Register for IELSR, DMAC.DELSR and ELC.ELSR. Note that currently Trusted Event Route Control is not supported. */\n#ifndef BSP_TZ_CFG_TEVTRCR\n#define BSP_TZ_CFG_TEVTRCR (0)\n#endif\n\n            /* Security attribution register for ELCR, ELSEGR0, ELSEGR1 Security Attribution. */\n#ifndef BSP_TZ_CFG_ELCSARA\n #define BSP_TZ_CFG_ELCSARA (0x00000007U)\n#endif\n\n            /* Set DTCSTSAR if the Secure program uses the DTC. */\n#if RA_NOT_DEFINED == RA_NOT_DEFINED\n #define BSP_TZ_CFG_DTC_USED (0U)\n#else\n #define BSP_TZ_CFG_DTC_USED (1U)\n#endif\n\n            /* Security attribution of FLWT and FCKMHZ registers. */\n#ifndef BSP_TZ_CFG_FSAR\n/* If the CGC registers are only accessible in Secure mode, than there is no\n * reason for nonsecure applications to access FLWT and FCKMHZ. */\n#define BSP_TZ_CFG_FSAR (\\\n        ((BSP_CFG_CLOCKS_SECURE == 0) ? (1U << 0) : 0U) | /* FLWTSA */\\\n        ((RA_NOT_DEFINED) > 0 ? 0U: (1U << 1)) | /* FCACHESA */\\\n        ((BSP_CFG_CLOCKS_SECURE == 0) ? (1U << 8) : 0U) | /* FCKMHZSA */ \\\n        ((RA_NOT_DEFINED) > 0 ? 0U : (1U << 9U)) | /* FACICMISA */\\\n        ((RA_NOT_DEFINED) > 0 ? 0U: (1U << 10U)) /* FACICMRSA */)\n#endif\n\n            /* Security attribution for SRAM registers. */\n#ifndef BSP_TZ_CFG_SRAMSAR\n/* If the CGC registers are only accessible in Secure mode, than there is no reason for Non Secure applications to access\n * SRAM0WTEN and therefore there is no reason to access PRCR2. */\n    #define BSP_TZ_CFG_SRAMSAR (\\\n        ((1U) << 0U) | /* SRAMSA0 */\\\n        ((1U) << 1U) | /* SRAMSA1 */\\\n        ((1U) << 7U) | /* STBRAMSA */\\\n        ((BSP_CFG_CLOCKS_SECURE == 0) ? (1U << 8U) : 0U) /* SRAMWTSA */)\n#endif\n\n            /* Security attribution for the DMAC Bus Master MPU settings. */\n#ifndef BSP_TZ_CFG_MMPUSARA\n    /* The DMAC Bus Master MPU settings should align with the DMAC channel settings. */\n    #define BSP_TZ_CFG_MMPUSARA (BSP_TZ_CFG_DMACCHSAR)\n#endif\n\n            /* Security Attribution Register A for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARA\n    #define BSP_TZ_CFG_BUSSARA (1U)\n#endif\n            /* Security Attribution Register B for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARB\n    #define BSP_TZ_CFG_BUSSARB (1U)\n#endif\n            /* Security Attribution Register C for BUS Control registers. */\n#ifndef BSP_TZ_CFG_BUSSARC\n    #define BSP_TZ_CFG_BUSSARC (1U)\n#endif\n\n            /* Enable Uninitialized Non-Secure Application Fallback. */\n#ifndef BSP_TZ_CFG_NON_SECURE_APPLICATION_FALLBACK\n    #define BSP_TZ_CFG_NON_SECURE_APPLICATION_FALLBACK (1U)\n#endif\n\n\n            #define OFS_SEQ1 0xA001A001 | (1 << 1) | (3 << 2)\n            #define OFS_SEQ2 (15 << 4) | (3 << 8) | (3 << 10)\n            #define OFS_SEQ3 (1 << 12) | (1 << 14) | (1 << 17)\n            #define OFS_SEQ4 (3 << 18) |(15 << 20) | (3 << 24) | (3 << 26)\n            #define OFS_SEQ5 (1 << 28) | (1 << 30)\n            #define BSP_CFG_ROM_REG_OFS0 (OFS_SEQ1 | OFS_SEQ2 | OFS_SEQ3 | OFS_SEQ4 | OFS_SEQ5)\n\n            #define BSP_CFG_ROM_REG_OFS2 ((1 << 0) | 0xFFFFFFFEU)\n\n            /* Option Function Select Register 1 Security Attribution */\n#ifndef BSP_CFG_ROM_REG_OFS1_SEL\n#if defined(_RA_TZ_SECURE) || defined(_RA_TZ_NONSECURE)\n            #define BSP_CFG_ROM_REG_OFS1_SEL (0x00000000U | ((0U << 0U)) | ((0U << 3U)) | ((0U << 5U)) | ((BSP_CFG_CLOCKS_SECURE == 0) ? 0xF00U : 0U) | ((0U << 24U)) | ((0U << 25U)))\n#else\n            #define BSP_CFG_ROM_REG_OFS1_SEL (0x00000000U)\n#endif\n#endif\n            #define BSP_CFG_ROM_REG_OFS1_INITECCEN (0 << 25)\n            #define BSP_CFG_ROM_REG_OFS1 (0xFCFFFED0 | (1 << 3) | (7) | (1 << 5) |  (1 << 8) | (1 << 24) | (BSP_CFG_ROM_REG_OFS1_INITECCEN))\n\n            /* Used to create IELS values for the interrupt initialization table g_interrupt_event_link_select. */\n            #define BSP_PRV_IELS_ENUM(vector)    (ELC_ ## vector)\n\n            /* Dual Mode Select Register */\n#ifndef BSP_CFG_ROM_REG_DUALSEL\n            #define BSP_CFG_ROM_REG_DUALSEL (0xFFFFFFF8U | (0x7U))\n#endif\n\n            /* Block Protection Register 0 */\n#ifndef BSP_CFG_ROM_REG_BPS0\n            #define BSP_CFG_ROM_REG_BPS0 (~( 0U))\n#endif\n            /* Block Protection Register 1 */\n#ifndef BSP_CFG_ROM_REG_BPS1\n            #define BSP_CFG_ROM_REG_BPS1 (~( 0U))\n#endif\n            /* Block Protection Register 2 */\n#ifndef BSP_CFG_ROM_REG_BPS2\n            #define BSP_CFG_ROM_REG_BPS2 (~( 0U))\n#endif\n            /* Block Protection Register 3 */\n#ifndef BSP_CFG_ROM_REG_BPS3\n            #define BSP_CFG_ROM_REG_BPS3 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 0 */\n#ifndef BSP_CFG_ROM_REG_PBPS0\n            #define BSP_CFG_ROM_REG_PBPS0 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 1 */\n#ifndef BSP_CFG_ROM_REG_PBPS1\n            #define BSP_CFG_ROM_REG_PBPS1 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 2 */\n#ifndef BSP_CFG_ROM_REG_PBPS2\n            #define BSP_CFG_ROM_REG_PBPS2 (~( 0U))\n#endif\n            /* Permanent Block Protection Register 3 */\n#ifndef BSP_CFG_ROM_REG_PBPS3\n            #define BSP_CFG_ROM_REG_PBPS3 (~( 0U))\n#endif\n            /* Security Attribution for Block Protection Register 0 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL0\n            #define BSP_CFG_ROM_REG_BPS_SEL0 (BSP_CFG_ROM_REG_BPS0 & BSP_CFG_ROM_REG_PBPS0)\n#endif\n            /* Security Attribution for Block Protection Register 1 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL1\n            #define BSP_CFG_ROM_REG_BPS_SEL1 (BSP_CFG_ROM_REG_BPS1 & BSP_CFG_ROM_REG_PBPS1)\n#endif\n            /* Security Attribution for Block Protection Register 2 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL2\n            #define BSP_CFG_ROM_REG_BPS_SEL2 (BSP_CFG_ROM_REG_BPS2 & BSP_CFG_ROM_REG_PBPS2)\n#endif\n            /* Security Attribution for Block Protection Register 3 (If any blocks are marked as protected in the secure application, then mark them as secure) */\n#ifndef BSP_CFG_ROM_REG_BPS_SEL3\n            #define BSP_CFG_ROM_REG_BPS_SEL3 (BSP_CFG_ROM_REG_BPS3 & BSP_CFG_ROM_REG_PBPS3)\n#endif\n            /* Security Attribution for Bank Select Register */\n#ifndef BSP_CFG_ROM_REG_BANKSEL_SEL\n            #define BSP_CFG_ROM_REG_BANKSEL_SEL (0xFFFFFFFFU)\n#endif\n#ifndef BSP_CLOCK_CFG_MAIN_OSC_WAIT\n            #define BSP_CLOCK_CFG_MAIN_OSC_WAIT (9)\n#endif\n\n            /* FSBL Control Register 0 */\n#ifndef BSP_CFG_ROM_REG_FSBLCTRL0\n#define BSP_CFG_ROM_REG_FSBLCTRL0 ( \\\n                (7 << R_OFS_DATAFLASH_FSBLCTRL0_FSBLEN_Pos) | \\\n                (7 << R_OFS_DATAFLASH_FSBLCTRL0_FSBLSKIPSW_Pos) | \\\n                (7 << R_OFS_DATAFLASH_FSBLCTRL0_FSBLSKIPDS_Pos) | \\\n                (7 << R_OFS_DATAFLASH_FSBLCTRL0_FSBLCLK_Pos) | \\\n                0xFFFFF000)\n#endif\n\n            /* FSBL Control Register 1 */\n#ifndef BSP_CFG_ROM_REG_FSBLCTRL1\n#define BSP_CFG_ROM_REG_FSBLCTRL1 ( \\\n                (3 << R_OFS_DATAFLASH_FSBLCTRL1_FSBLEXMD_Pos) | \\\n                0xFFFFFFFC)\n#endif\n\n            /* FSBL Control Register 2 */\n#ifndef BSP_CFG_ROM_REG_FSBLCTRL2\n#define BSP_CFG_ROM_REG_FSBLCTRL2 ( \\\n                (15 << R_OFS_DATAFLASH_FSBLCTRL2_PORTPN_Pos) | \\\n                (0x1F << R_OFS_DATAFLASH_FSBLCTRL2_PORTGN_Pos) | \\\n                0xFFFFFE00)\n#endif\n\n            /* Start Address of Code Certificate Register 0 */\n#ifndef BSP_CFG_ROM_REG_SACC0\n#define BSP_CFG_ROM_REG_SACC0 (0xFFFFFFFF)\n#endif\n\n            /* Start Address of Code Certificate Register 1 */\n#ifndef BSP_CFG_ROM_REG_SACC1\n#define BSP_CFG_ROM_REG_SACC1 (0xFFFFFFFF)\n#endif\n\n            /* Start Address of Measurement Report Register */\n#ifndef BSP_CFG_ROM_REG_SAMR\n#define BSP_CFG_ROM_REG_SAMR (0xFFFFFFFF)\n#endif\n\n#ifndef BSP_CFG_DCACHE_ENABLED\n#define BSP_CFG_DCACHE_ENABLED (0)\n#endif\n\n\n#ifndef BSP_CFG_SDRAM_ENABLED\n #define BSP_CFG_SDRAM_ENABLED  (0)\n#endif\n\n#ifndef BSP_CFG_SDRAM_TRAS\n #define BSP_CFG_SDRAM_TRAS  (6)\n#endif\n\n#ifndef BSP_CFG_SDRAM_TRCD\n #define BSP_CFG_SDRAM_TRCD  (3)\n#endif\n\n#ifndef BSP_CFG_SDRAM_TRP\n #define BSP_CFG_SDRAM_TRP  (3)\n#endif\n\n#ifndef BSP_CFG_SDRAM_TWR\n #define BSP_CFG_SDRAM_TWR  (2)\n#endif\n\n#ifndef BSP_CFG_SDRAM_TCL\n #define BSP_CFG_SDRAM_TCL  (3)\n#endif\n\n#ifndef BSP_CFG_SDRAM_TRFC\n #define BSP_CFG_SDRAM_TRFC  (937)\n#endif\n\n#ifndef BSP_CFG_SDRAM_TREFW\n #define BSP_CFG_SDRAM_TREFW  (8)\n#endif\n\n#ifndef BSP_CFG_SDRAM_INIT_ARFI\n #define BSP_CFG_SDRAM_INIT_ARFI  (10)\n#endif\n\n#ifndef BSP_CFG_SDRAM_INIT_ARFC\n #define BSP_CFG_SDRAM_INIT_ARFC  (8)\n#endif\n\n#ifndef BSP_CFG_SDRAM_INIT_PRC\n #define BSP_CFG_SDRAM_INIT_PRC  (3)\n#endif\n\n#ifndef BSP_CFG_SDRAM_MULTIPLEX_ADDR_SHIFT\n #define BSP_CFG_SDRAM_MULTIPLEX_ADDR_SHIFT  (1)\n#endif\n\n#ifndef BSP_CFG_SDRAM_ENDIAN_MODE\n #define BSP_CFG_SDRAM_ENDIAN_MODE  (0)\n#endif\n\n#ifndef BSP_CFG_SDRAM_ACCESS_MODE\n #define BSP_CFG_SDRAM_ACCESS_MODE  (1)\n#endif\n\n#ifndef BSP_CFG_SDRAM_BUS_WIDTH\n #define BSP_CFG_SDRAM_BUS_WIDTH  (0)\n#endif\n#endif /* BSP_MCU_FAMILY_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_cfg/fsp_cfg/bsp/bsp_pin_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_PIN_CFG_H_\n#define BSP_PIN_CFG_H_\n#include \"r_ioport.h\"\n\n/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */\nFSP_HEADER\n\n#define ENET_RMII_INT (BSP_IO_PORT_00_PIN_00)\n#define ARDUINO_A3 (BSP_IO_PORT_00_PIN_01)\n#define GROVE2_AN102 (BSP_IO_PORT_00_PIN_02)\n#define ARDUINO_A1 (BSP_IO_PORT_00_PIN_03)\n#define ARDUINO_A0_MIKROBUS_AN000 (BSP_IO_PORT_00_PIN_04)\n#define GROVE2_AN001 (BSP_IO_PORT_00_PIN_05)\n#define PMOD1_IRQ11 (BSP_IO_PORT_00_PIN_06)\n#define ARDUINO_A004 (BSP_IO_PORT_00_PIN_07)\n#define USER_S2 (BSP_IO_PORT_00_PIN_08)\n#define SW1 (BSP_IO_PORT_00_PIN_09)\n#define MIKROBUS_IRQ14 (BSP_IO_PORT_00_PIN_10)\n#define ARDUINO_A4 (BSP_IO_PORT_00_PIN_14)\n#define ARDUINO_A5 (BSP_IO_PORT_00_PIN_15)\n#define OSPI_DQ0 (BSP_IO_PORT_01_PIN_00)\n#define OSPI_DQ3 (BSP_IO_PORT_01_PIN_01)\n#define OSPI_DQ4 (BSP_IO_PORT_01_PIN_02)\n#define OSPI_DQ2 (BSP_IO_PORT_01_PIN_03)\n#define OSPI_CS (BSP_IO_PORT_01_PIN_04)\n#define OSPI_INT (BSP_IO_PORT_01_PIN_05)\n#define OSPI_RESET (BSP_IO_PORT_01_PIN_06)\n#define LED3 (BSP_IO_PORT_01_PIN_07)\n#define ETH_A_RMII_RMII_RXDV (BSP_IO_PORT_01_PIN_12)\n#define ETH_A_LINKSTA (BSP_IO_PORT_01_PIN_14)\n#define MPLX_CTRL (BSP_IO_PORT_01_PIN_15)\n#define NMI (BSP_IO_PORT_02_PIN_00)\n#define MD (BSP_IO_PORT_02_PIN_01)\n#define CAN_STB (BSP_IO_PORT_02_PIN_07)\n#define TDI (BSP_IO_PORT_02_PIN_08)\n#define TDO (BSP_IO_PORT_02_PIN_09)\n#define SWDIO (BSP_IO_PORT_02_PIN_10)\n#define SWCLK (BSP_IO_PORT_02_PIN_11)\n#define EXTAL (BSP_IO_PORT_02_PIN_12)\n#define XTAL (BSP_IO_PORT_02_PIN_13)\n#define ETH_A_RXER (BSP_IO_PORT_03_PIN_00)\n#define ETH_A_RXD1 (BSP_IO_PORT_03_PIN_01)\n#define ETH_A_RXD0 (BSP_IO_PORT_03_PIN_02)\n#define ETH_A_REFCLK (BSP_IO_PORT_03_PIN_03)\n#define ETH_A_TXD0 (BSP_IO_PORT_03_PIN_04)\n#define ETH_A_TXD1 (BSP_IO_PORT_03_PIN_05)\n#define ETH_A_TXEN (BSP_IO_PORT_03_PIN_06)\n#define ETH_A_MDIO (BSP_IO_PORT_03_PIN_07)\n#define ETH_A_MDC (BSP_IO_PORT_03_PIN_08)\n#define ARDUINO_D0_MIKROBUS_RXD3 (BSP_IO_PORT_03_PIN_09)\n#define ARDUINO_D1_MIKROBUS_TXD3 (BSP_IO_PORT_03_PIN_10)\n#define CAN_RXD (BSP_IO_PORT_03_PIN_11)\n#define CAN_TXD (BSP_IO_PORT_03_PIN_12)\n#define I3C_SCL0_ARDUINO_MIKROBUS_PMOD1_3_qwiic (BSP_IO_PORT_04_PIN_00)\n#define I3C_SDA0_ARDUINO_MIKROBUS_PMOD1_4_qwiic (BSP_IO_PORT_04_PIN_01)\n#define ETH_B_MDIO (BSP_IO_PORT_04_PIN_02)\n#define ETH_B_LINKSTA (BSP_IO_PORT_04_PIN_03)\n#define ETH_B_RST_N (BSP_IO_PORT_04_PIN_04)\n#define ETH_B_TXEN (BSP_IO_PORT_04_PIN_05)\n#define ETH_B_TXD1 (BSP_IO_PORT_04_PIN_06)\n#define USBFS_VBUS (BSP_IO_PORT_04_PIN_07)\n#define USBHS_VBUSEN (BSP_IO_PORT_04_PIN_08)\n#define USBHS_OVRCURA (BSP_IO_PORT_04_PIN_09)\n#define MISOB_B_ARDUINO_MIKROBUS (BSP_IO_PORT_04_PIN_10)\n#define MOSIB_B_ARDUINO_MIKROBUS (BSP_IO_PORT_04_PIN_11)\n#define RSPCKB_B_ARDUINO_MIKROBUS (BSP_IO_PORT_04_PIN_12)\n#define SSLB0_B_ARDUINO_D10_MIKROBUS (BSP_IO_PORT_04_PIN_13)\n#define LED2 (BSP_IO_PORT_04_PIN_14)\n#define USBFS_VBUS_EN (BSP_IO_PORT_05_PIN_00)\n#define USBFS_OVERCURA (BSP_IO_PORT_05_PIN_01)\n#define MIKROBUS_RESET (BSP_IO_PORT_05_PIN_02)\n#define PMOD2_7_IRQ1 (BSP_IO_PORT_05_PIN_08)\n#define GROVE2_IIC_SDA1 (BSP_IO_PORT_05_PIN_11)\n#define GROVE2_IIC_SCL1 (BSP_IO_PORT_05_PIN_12)\n#define LED1 (BSP_IO_PORT_06_PIN_00)\n#define ARDUINO_D5 (BSP_IO_PORT_06_PIN_01)\n#define ARDUINO_D6 (BSP_IO_PORT_06_PIN_02)\n#define ARDUINO_D9 (BSP_IO_PORT_06_PIN_03)\n#define PMOD1_3_MISO0_RXD0_SCL0 (BSP_IO_PORT_06_PIN_09)\n#define PMOD1_2_MOSI0_TXD0 (BSP_IO_PORT_06_PIN_10)\n#define PMOD1_4_SCK0 (BSP_IO_PORT_06_PIN_11)\n#define PMOD1_1_SSL0_CTS_RTS (BSP_IO_PORT_06_PIN_12)\n#define PMOD1_1_CTS0 (BSP_IO_PORT_06_PIN_13)\n#define PMOD1_9_GPIO (BSP_IO_PORT_06_PIN_14)\n#define PMOD1_10_GPIO (BSP_IO_PORT_06_PIN_15)\n#define ETH_B_TXD0 (BSP_IO_PORT_07_PIN_00)\n#define ETH_B_REFCLK (BSP_IO_PORT_07_PIN_01)\n#define ETH_B_RXD0 (BSP_IO_PORT_07_PIN_02)\n#define ETH_B_RXD1 (BSP_IO_PORT_07_PIN_03)\n#define ETH_B_RXER (BSP_IO_PORT_07_PIN_04)\n#define ETH_B_RMII_RXDV (BSP_IO_PORT_07_PIN_05)\n#define I3C_SDA0_PULLUP (BSP_IO_PORT_07_PIN_11)\n#define OSPI_DQ5 (BSP_IO_PORT_08_PIN_00)\n#define OSPI_DS (BSP_IO_PORT_08_PIN_01)\n#define OSPI_DQ6 (BSP_IO_PORT_08_PIN_02)\n#define OSPI_DQ1 (BSP_IO_PORT_08_PIN_03)\n#define OSPI_DQ7 (BSP_IO_PORT_08_PIN_04)\n#define OSPI_CK (BSP_IO_PORT_08_PIN_08)\n#define PMOD2_8_RESET (BSP_IO_PORT_08_PIN_09)\n#define PMOD2_9_GPIO (BSP_IO_PORT_08_PIN_10)\n#define PMOD2_10_GPIO (BSP_IO_PORT_08_PIN_11)\n#define ARDUINO_RESET (BSP_IO_PORT_08_PIN_12)\n#define USBFS_P (BSP_IO_PORT_08_PIN_14)\n#define USBFS_N (BSP_IO_PORT_08_PIN_15)\n#define ARDUINO_D4 (BSP_IO_PORT_09_PIN_05)\n#define ARDUINO_D2 (BSP_IO_PORT_09_PIN_06)\n#define ARDUINO_D3_MIKROBUS_GTIOC13A (BSP_IO_PORT_09_PIN_07)\n#define ARDUINO_D7 (BSP_IO_PORT_09_PIN_08)\n#define ARDUINO_D8 (BSP_IO_PORT_09_PIN_09)\n#define PMOD2_3_MISO2_RXD2 (BSP_IO_PORT_10_PIN_02)\n#define PMOD2_2_MOSI2_TXD2 (BSP_IO_PORT_10_PIN_03)\n#define PMOD2_4_SCK2 (BSP_IO_PORT_10_PIN_04)\n#define PMOD2_1_CTS_RTS_SSL2 (BSP_IO_PORT_10_PIN_05)\n#define PMOD2_1_CTS2 (BSP_IO_PORT_10_PIN_06)\n#define PMOD1_8_RESET (BSP_IO_PORT_10_PIN_08)\n#define JLOB_COMS_TX (BSP_IO_PORT_10_PIN_14)\n#define JLOB_COMS_RX (BSP_IO_PORT_10_PIN_15)\n#define I3C_SCL0_PULLUP (BSP_IO_PORT_11_PIN_00)\n#define USBHS_VBUS (BSP_IO_PORT_11_PIN_01)\nextern const ioport_cfg_t g_bsp_pin_cfg; /* RA8M1 EK */\n\nvoid BSP_PinConfigSecurityInit();\n\n/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */\nFSP_FOOTER\n#endif /* BSP_PIN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_cfg/fsp_cfg/r_ioport_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef R_IOPORT_CFG_H_\n#define R_IOPORT_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define IOPORT_CFG_PARAM_CHECKING_ENABLE (BSP_CFG_PARAM_CHECKING_ENABLE)\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* R_IOPORT_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_gen/bsp_clock_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CLOCK_CFG_H_\n#define BSP_CLOCK_CFG_H_\n#define BSP_CFG_CLOCKS_SECURE (0)\n#define BSP_CFG_CLOCKS_OVERRIDE (0)\n#define BSP_CFG_XTAL_HZ (20000000) /* XTAL 20000000Hz */\n#define BSP_CFG_HOCO_FREQUENCY (7) /* HOCO 48MHz */\n#define BSP_CFG_PLL_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_MAIN_OSC) /* PLL Src: XTAL */\n#define BSP_CFG_PLL_DIV (BSP_CLOCKS_PLL_DIV_2) /* PLL Div /2 */\n#define BSP_CFG_PLL_MUL BSP_CLOCKS_PLL_MUL(96,0) /* PLL Mul x80-99|Mul x96|PLL Mul x96.00 */\n#define BSP_CFG_PLL_FREQUENCY_HZ (960000000) /* PLL 960000000Hz */\n#define BSP_CFG_PLODIVP (BSP_CLOCKS_PLL_DIV_2) /* PLL1P Div /2 */\n#define BSP_CFG_PLL1P_FREQUENCY_HZ (480000000) /* PLL1P 480000000Hz */\n#define BSP_CFG_PLODIVQ (BSP_CLOCKS_PLL_DIV_4) /* PLL1Q Div /4 */\n#define BSP_CFG_PLL1Q_FREQUENCY_HZ (240000000) /* PLL1Q 240000000Hz */\n#define BSP_CFG_PLODIVR (BSP_CLOCKS_PLL_DIV_2) /* PLL1R Div /2 */\n#define BSP_CFG_PLL1R_FREQUENCY_HZ (480000000) /* PLL1R 480000000Hz */\n#define BSP_CFG_PLL2_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* PLL2 Disabled */\n#define BSP_CFG_PLL2_DIV (BSP_CLOCKS_PLL_DIV_2) /* PLL2 Div /2 */\n#define BSP_CFG_PLL2_MUL BSP_CLOCKS_PLL_MUL(96,0) /* PLL2 Mul x80-99|Mul x96|PLL2 Mul x96.00 */\n#define BSP_CFG_PLL2_FREQUENCY_HZ (0) /* PLL2 0Hz */\n#define BSP_CFG_PL2ODIVP (BSP_CLOCKS_PLL_DIV_2) /* PLL2P Div /2 */\n#define BSP_CFG_PLL2P_FREQUENCY_HZ (0) /* PLL2P 0Hz */\n#define BSP_CFG_PL2ODIVQ (BSP_CLOCKS_PLL_DIV_2) /* PLL2Q Div /2 */\n#define BSP_CFG_PLL2Q_FREQUENCY_HZ (0) /* PLL2Q 0Hz */\n#define BSP_CFG_PL2ODIVR (BSP_CLOCKS_PLL_DIV_2) /* PLL2R Div /2 */\n#define BSP_CFG_PLL2R_FREQUENCY_HZ (0) /* PLL2R 0Hz */\n#define BSP_CFG_CLOCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL1P) /* Clock Src: PLL1P */\n#define BSP_CFG_CLKOUT_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CLKOUT Disabled */\n#define BSP_CFG_SCICLK_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* SCICLK Disabled */\n#define BSP_CFG_SPICLK_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* SPICLK Disabled */\n#define BSP_CFG_CANFDCLK_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CANFDCLK Disabled */\n#define BSP_CFG_I3CCLK_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* I3CCLK Disabled */\n#define BSP_CFG_UCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL1Q) /* UCK Src: PLL1Q */\n#define BSP_CFG_U60CK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_PLL1P) /* U60CK Src: PLL1P */\n#define BSP_CFG_OCTA_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* OCTASPICLK Disabled */\n#define BSP_CFG_CPUCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* CPUCLK Div /1 */\n#define BSP_CFG_ICLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* ICLK Div /2 */\n#define BSP_CFG_PCLKA_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* PCLKA Div /4 */\n#define BSP_CFG_PCLKB_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_8) /* PCLKB Div /8 */\n#define BSP_CFG_PCLKC_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_8) /* PCLKC Div /8 */\n#define BSP_CFG_PCLKD_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* PCLKD Div /4 */\n#define BSP_CFG_PCLKE_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKE Div /2 */\n#define BSP_CFG_SDCLK_OUTPUT (1) /* SDCLK Enabled */\n#define BSP_CFG_BCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_4) /* BCLK Div /4 */\n#define BSP_CFG_BCLK_OUTPUT (2) /* EBCLK Div /2 */\n#define BSP_CFG_FCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_8) /* FCLK Div /8 */\n#define BSP_CFG_CLKOUT_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* CLKOUT Div /1 */\n#define BSP_CFG_SCICLK_DIV (BSP_CLOCKS_SCI_CLOCK_DIV_4) /* SCICLK Div /4 */\n#define BSP_CFG_SPICLK_DIV (BSP_CLOCKS_SPI_CLOCK_DIV_4) /* SPICLK Div /4 */\n#define BSP_CFG_CANFDCLK_DIV (BSP_CLOCKS_CANFD_CLOCK_DIV_8) /* CANFDCLK Div /8 */\n#define BSP_CFG_I3CCLK_DIV (BSP_CLOCKS_I3C_CLOCK_DIV_3) /* I3CCLK Div /3 */\n#define BSP_CFG_UCK_DIV (BSP_CLOCKS_USB_CLOCK_DIV_5) /* UCK Div /5 */\n#define BSP_CFG_U60CK_DIV (BSP_CLOCKS_USB_CLOCK_DIV_8) /* U60CK Div /8 */\n#define BSP_CFG_OCTA_DIV (BSP_CLOCKS_OCTA_CLOCK_DIV_4) /* OCTASPICLK Div /4 */\n#endif /* BSP_CLOCK_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_gen/common_data.c",
    "content": "/* generated common source file - do not edit */\n#include \"common_data.h\"\nioport_instance_ctrl_t g_ioport_ctrl;\nconst ioport_instance_t g_ioport =\n        {\n            .p_api = &g_ioport_on_ioport,\n            .p_ctrl = &g_ioport_ctrl,\n            .p_cfg = &g_bsp_pin_cfg,\n        };\nvoid g_common_init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_gen/common_data.h",
    "content": "/* generated common header file - do not edit */\n#ifndef COMMON_DATA_H_\n#define COMMON_DATA_H_\n#include <stdint.h>\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n#include \"bsp_pin_cfg.h\"\nFSP_HEADER\n#define IOPORT_CFG_NAME g_bsp_pin_cfg\n#define IOPORT_CFG_OPEN R_IOPORT_Open\n#define IOPORT_CFG_CTRL g_ioport_ctrl\n\n/* IOPORT Instance */\nextern const ioport_instance_t g_ioport;\n\n/* IOPORT control structure. */\nextern ioport_instance_ctrl_t g_ioport_ctrl;\nvoid g_common_init(void);\nFSP_FOOTER\n#endif /* COMMON_DATA_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/ra_gen/pin_data.c",
    "content": "/* generated pin source file - do not edit */\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n\n\nconst ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {\n    {\n        .pin = BSP_IO_PORT_00_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_IRQ_ENABLE | (uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_00_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_ANALOG_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_02_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_TRACE)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_HS)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_HS)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_13,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SPI)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_MID | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_IIC)\n    },\n    {\n        .pin = BSP_IO_PORT_05_PIN_12,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_MID | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_IIC)\n    },\n    {\n        .pin = BSP_IO_PORT_06_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HS_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_OSPI)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_09,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_08_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_10_PIN_02,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_10_PIN_03,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_10_PIN_04,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_10_PIN_05,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI0_2_4_6_8)\n    },\n    {\n        .pin = BSP_IO_PORT_10_PIN_06,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT)\n    },\n    {\n        .pin = BSP_IO_PORT_10_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)\n    },\n    {\n        .pin = BSP_IO_PORT_10_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)\n    },\n    {\n        .pin = BSP_IO_PORT_11_PIN_01,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_DRIVE_HIGH | (uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_HS)\n    },\n};\n\nconst ioport_cfg_t g_bsp_pin_cfg = {\n    .number_of_pins = sizeof(g_bsp_pin_cfg_data)/sizeof(ioport_pin_cfg_t),\n    .p_pin_cfg_data = &g_bsp_pin_cfg_data[0],\n};\n\n#if BSP_TZ_SECURE_BUILD\n\nvoid R_BSP_PinCfgSecurityInit(void);\n\n/* Initialize SAR registers for secure pins. */\nvoid R_BSP_PinCfgSecurityInit(void)\n{\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n    uint32_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #else\n    uint16_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #endif\n    memset(pmsar, 0xFF, BSP_FEATURE_BSP_NUM_PMSAR * sizeof(R_PMISC->PMSAR[0]));\n\n\n    for(uint32_t i = 0; i < g_bsp_pin_cfg.number_of_pins; i++)\n    {\n        uint32_t port_pin = g_bsp_pin_cfg.p_pin_cfg_data[i].pin;\n        uint32_t port = port_pin >> 8U;\n        uint32_t pin = port_pin & 0xFFU;\n        pmsar[port] &= (uint16_t) ~(1U << pin);\n    }\n\n    for(uint32_t i = 0; i < BSP_FEATURE_BSP_NUM_PMSAR; i++)\n    {\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n        R_PMISC->PMSAR[i].PMSAR = (uint16_t) pmsar[i];\n #else\n        R_PMISC->PMSAR[i].PMSAR = pmsar[i];\n #endif\n    }\n\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/script/fsp.ld",
    "content": "/*\n                  Linker File for Renesas FSP\n*/\n\nINCLUDE memory_regions.ld\n\n/* Uncomment and set XIP_SECONDARY_SLOT_IMAGE to 1 below for the secondary XIP application image.*/\n/*\n XIP_SECONDARY_SLOT_IMAGE = 1;\n*/\n\nQSPI_FLASH_PRV_LENGTH = DEFINED(QSPI_FLASH_SIZE) ? ABSOLUTE(QSPI_FLASH_SIZE) : ABSOLUTE(QSPI_FLASH_LENGTH);\nOSPI_DEVICE_0_PRV_LENGTH = DEFINED(OSPI_DEVICE_0_SIZE) ? ABSOLUTE(OSPI_DEVICE_0_SIZE) : ABSOLUTE(OSPI_DEVICE_0_LENGTH);\nOSPI_DEVICE_1_PRV_LENGTH = DEFINED(OSPI_DEVICE_1_SIZE) ? ABSOLUTE(OSPI_DEVICE_1_SIZE) : ABSOLUTE(OSPI_DEVICE_1_LENGTH);\n\n/* If a flat (secure) project has DEFINED RAM_NS_BUFFER_LENGTH, then emit IDAU symbols to allocate non-secure RAM. */\n__RESERVE_NS_RAM = !DEFINED(PROJECT_NONSECURE) && DEFINED(RAM_NS_BUFFER_LENGTH) && (OPTION_SETTING_S_LENGTH != 0);\n\nITCM_START = DEFINED(ITCM_START)? ITCM_START : 0;\nITCM_LENGTH = DEFINED(ITCM_LENGTH)? ITCM_LENGTH : 0;\nDTCM_START = DEFINED(DTCM_START)? DTCM_START : 0;\nDTCM_LENGTH = DEFINED(DTCM_LENGTH)? DTCM_LENGTH : 0;\nRAM_NS_BUFFER_BLOCK_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? ALIGN(RAM_NS_BUFFER_LENGTH, 8192) : 0;\nRAM_NS_BUFFER_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? RAM_NS_BUFFER_LENGTH : 0;\nRAM_NS_BUFFER_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_LENGTH;\nRAM_NS_BUFFER_BLOCK_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_BLOCK_LENGTH;\n\nOPTION_SETTING_START_NS = DEFINED(PROJECT_NONSECURE) ? OPTION_SETTING_START : OPTION_SETTING_START + 0x80;\nOPTION_SETTING_DATA_FLASH_S_START = DEFINED(OPTION_SETTING_DATA_FLASH_S_START) ? OPTION_SETTING_DATA_FLASH_S_START : 0;\nOPTION_SETTING_DATA_FLASH_S_LENGTH = DEFINED(OPTION_SETTING_DATA_FLASH_S_LENGTH) ? OPTION_SETTING_DATA_FLASH_S_LENGTH : 0;\n\n/* This definition is used to avoid moving the counter in OPTION_SETTING regions for projects that should not configure option settings.\n * Bootloader images do not configure option settings because they are owned by the bootloader.\n * FSP_BOOTABLE_IMAGE is only defined in bootloader images. */\n__bl_FSP_BOOTABLE_IMAGE = 1;\n__bln_FSP_BOOTABLE_IMAGE = 1;\nPROJECT_SECURE_OR_FLAT = (!DEFINED(PROJECT_NONSECURE) || DEFINED(PROJECT_SECURE)) && OPTION_SETTING_LENGTH && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_NS = DEFINED(PROJECT_NONSECURE) && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_DATA_FLASH = PROJECT_SECURE_OR_FLAT && (OPTION_SETTING_DATA_FLASH_S_LENGTH != 0);\n\n__bl_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_APPLICATION_IMAGE_NUMBER == 1 ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         (DEFINED(BOOTLOADER_SECONDARY_USE_QSPI) || DEFINED(BOOTLOADER_SECONDARY_USE_OSPI_B)) ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                          FLASH_APPLICATION_S_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_END    = __bl_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_END = __bl_XIP_SECONDARY_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_FLASH_NS_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_START - FLASH_BOOTLOADER_HEADER_LENGTH + FLASH_APPLICATION_S_LENGTH;\n__bl_FLASH_NSC_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_END - FLASH_APPLICATION_NSC_LENGTH;\n__bl_RAM_NS_START    = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH;\n__bl_RAM_NSC_START   = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       __bl_RAM_NS_START - RAM_APPLICATION_NSC_LENGTH;\n__bl_FLASH_NS_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                            FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                            __bl_FLASH_NS_START + FLASH_BOOTLOADER_HEADER_LENGTH_2;\n__bln_FLASH_IMAGE_START = __bl_FLASH_NS_IMAGE_START | (!DEFINED (NS_OFFSET_START) ? 0 : NS_OFFSET_START);\n__bln_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                           FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                           FLASH_APPLICATION_NS_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH_2;\n\nXIP_SECONDARY_SLOT_IMAGE = DEFINED(XIP_SECONDARY_SLOT_IMAGE) ? XIP_SECONDARY_SLOT_IMAGE : 0;\nFLASH_ORIGIN = !DEFINED(FLASH_IMAGE_START) ? FLASH_START :\n                XIP_SECONDARY_SLOT_IMAGE == 1 ? XIP_SECONDARY_FLASH_IMAGE_START :\n                FLASH_IMAGE_START;\nLIMITED_FLASH_LENGTH = DEFINED(FLASH_IMAGE_LENGTH) ? FLASH_IMAGE_LENGTH :\n                       DEFINED(FLASH_BOOTLOADER_LENGTH) ? FLASH_BOOTLOADER_LENGTH :\n                       FLASH_LENGTH;\nOPTION_SETTING_SAS_SIZE = 0x34;\nOPTION_SETTING_SAS_LENGTH = !DEFINED(OPTION_SETTING_LENGTH) ? 0 :\n                            OPTION_SETTING_LENGTH == 0 ? 0 :\n                            OPTION_SETTING_LENGTH - OPTION_SETTING_SAS_SIZE;\n\n/* Define memory regions. */\nMEMORY\n{\n  ITCM (rx)                       : ORIGIN = ITCM_START, LENGTH = ITCM_LENGTH\n  DTCM (rwx)                      : ORIGIN = DTCM_START, LENGTH = DTCM_LENGTH\n  FLASH (rx)                      : ORIGIN = FLASH_ORIGIN, LENGTH = LIMITED_FLASH_LENGTH\n  RAM (rwx)                       : ORIGIN = RAM_START, LENGTH = RAM_LENGTH\n  DATA_FLASH (rx)                 : ORIGIN = DATA_FLASH_START, LENGTH = DATA_FLASH_LENGTH\n  QSPI_FLASH (rx)                 : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_PRV_LENGTH\n  OSPI_DEVICE_0 (rx)              : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1 (rx)              : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  OSPI_DEVICE_0_RAM (rwx)         : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1_RAM (rwx)         : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  SDRAM (rwx)                     : ORIGIN = SDRAM_START, LENGTH = SDRAM_LENGTH\n  OPTION_SETTING (r)              : ORIGIN = OPTION_SETTING_START, LENGTH = OPTION_SETTING_LENGTH\n  OPTION_SETTING_OFS (r)          : ORIGIN = OPTION_SETTING_START, LENGTH = 0x18\n  OPTION_SETTING_SAS (r)          : ORIGIN = OPTION_SETTING_START + OPTION_SETTING_SAS_SIZE, LENGTH = OPTION_SETTING_SAS_LENGTH\n  OPTION_SETTING_S (r)            : ORIGIN = OPTION_SETTING_S_START, LENGTH = OPTION_SETTING_S_LENGTH\n  OPTION_SETTING_DATA_FLASH_S (r) : ORIGIN = OPTION_SETTING_DATA_FLASH_S_START, LENGTH = OPTION_SETTING_DATA_FLASH_S_LENGTH\n  ID_CODE (rx)                    : ORIGIN = ID_CODE_START, LENGTH = ID_CODE_LENGTH\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be DEFINED in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n *   __qspi_flash_start__\n *   __qspi_flash_end__\n *   __qspi_flash_code_size__\n *   __qspi_region_max_size__\n *   __qspi_region_start_address__\n *   __qspi_region_end_address__\n *   __ospi_device_0_start__\n *   __ospi_device_0_end__\n *   __ospi_device_0_code_size__\n *   __ospi_device_0_region_max_size__\n *   __ospi_device_0_region_start_address__\n *   __ospi_device_0_region_end_address__\n *   __ospi_device_1_start__\n *   __ospi_device_1_end__\n *   __ospi_device_1_code_size__\n *   __ospi_device_1_region_max_size__\n *   __ospi_device_1_region_start_address__\n *   __ospi_device_1_region_end_address__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .text :\n    {\n        __tz_FLASH_S = ABSOLUTE(FLASH_START);\n        __ROM_Start = .;\n\n        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much\n         * space because ROM registers are at address 0x400 and there is very little space\n         * in between. */\n        KEEP(*(.fixed_vectors*))\n        KEEP(*(.application_vectors*))\n        __Vectors_End = .;\n\n        /* Some devices have a gap of code flash between the vector table and ROM Registers.\n         * The flash gap section allows applications to place code and data in this section. */\n        *(.flash_gap*)\n\n        /* ROM Registers start at address 0x00000400 for devices that do not have the OPTION_SETTING region. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x400;\n        KEEP(*(.rom_registers*))\n\n        /* Reserving 0x100 bytes of space for ROM registers. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x500;\n\n        /* Allocate flash write-boundary-aligned\n         * space for sce9 wrapped public keys for mcuboot if the module is used.\n         */\n        KEEP(*(.mcuboot_sce9_key*))\n\n        *(.text*)\n\n        KEEP(*(.version))\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n        __usb_dev_descriptor_start_fs = .;\n        KEEP(*(.usb_device_desc_fs*))\n        __usb_cfg_descriptor_start_fs = .;\n        KEEP(*(.usb_config_desc_fs*))\n        __usb_interface_descriptor_start_fs = .;\n        KEEP(*(.usb_interface_desc_fs*))\n        __usb_descriptor_end_fs = .;\n        __usb_dev_descriptor_start_hs = .;\n        KEEP(*(.usb_device_desc_hs*))\n        __usb_cfg_descriptor_start_hs = .;\n        KEEP(*(.usb_config_desc_hs*))\n        __usb_interface_descriptor_start_hs = .;\n        KEEP(*(.usb_interface_desc_hs*))\n        __usb_descriptor_end_hs = .;\n\n        KEEP(*(.eh_frame*))\n\n        __ROM_End = .;\n    } > FLASH = 0xFF\n\n    __Vectors_Size = __Vectors_End - __Vectors;\n\n    . = .;\n    __itcm_data_pre_location = .;\n\n    /* Initialized ITCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .itcm_data : ALIGN(16)\n    {\n        /* Start of ITCM Secure Trustzone region. */\n        __tz_ITCM_S = ABSOLUTE(ITCM_START);\n\n        /* All ITCM data start */\n        __itcm_data_start = .;\n\n        KEEP(*(.itcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* All ITCM data end */\n        __itcm_data_end = .;\n\n        /*\n         * Start of the ITCM Non-Secure Trustzone region.\n         * ITCM_NS_START can be used to set a fixed address for non-secure ITCM in secure projects or flat projects.\n         */\n        __tz_ITCM_N = DEFINED(ITCM_NS_START) ? ABSOLUTE(ITCM_NS_START) : ALIGN(__itcm_data_end, 8192);\n    } > ITCM AT > FLASH = 0x00\n\n    /* Addresses exported for ITCM initialization. */\n    __itcm_data_init_start = LOADADDR(.itcm_data);\n    __itcm_data_init_end = LOADADDR(.itcm_data) + SIZEOF(.itcm_data);\n\n    ASSERT(ORIGIN(ITCM) % 8 == 0, \"ITCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(ITCM) % 8 == 0, \"ITCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.itcm_data) % 16 == 0, \".itcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.itcm_data) % 8 == 0, \".itcm_data section size must be a multiple of 8 bytes.\")\n\n    /* Restore location counter. */\n    /* If ITCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If ITCM is present, this will be the absolute address that follows the ITCM ROM location. */\n    . = (SIZEOF(.itcm_data) > 0) ? __itcm_data_init_end : __itcm_data_pre_location;\n\n    __exidx_start = .;\n    /DISCARD/ :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    }\n    __exidx_end = .;\n\n    /* To copy multiple ROM to RAM sections,\n     * uncomment .copy.table section and,\n     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .copy.table :\n    {\n        . = ALIGN(4);\n        __copy_table_start__ = .;\n        LONG (__etext)\n        LONG (__data_start__)\n        LONG (__data_end__ - __data_start__)\n        LONG (__etext2)\n        LONG (__data2_start__)\n        LONG (__data2_end__ - __data2_start__)\n        __copy_table_end__ = .;\n    } > FLASH\n    */\n\n    /* To clear multiple BSS sections,\n     * uncomment .zero.table section and,\n     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .zero.table :\n    {\n        . = ALIGN(4);\n        __zero_table_start__ = .;\n        LONG (__bss_start__)\n        LONG (__bss_end__ - __bss_start__)\n        LONG (__bss2_start__)\n        LONG (__bss2_end__ - __bss2_start__)\n        __zero_table_end__ = .;\n    } > FLASH\n    */\n\n    __etext = .;\n\n    __tz_RAM_S = ORIGIN(RAM);\n\n    /* If DTC is used, put the DTC vector table at the start of SRAM.\n       This avoids memory holes due to 1K alignment required by it. */\n    .fsp_dtc_vector_table (NOLOAD) :\n    {\n        . = ORIGIN(RAM);\n        *(.fsp_dtc_vector_table)\n    } > RAM\n\n    /* Initialized data section. */\n    .data :\n    {\n        __data_start__ = .;\n        . = ALIGN(4);\n\n        __Code_In_RAM_Start = .;\n\n        KEEP(*(.code_in_ram*))\n        __Code_In_RAM_End = .;\n\n        *(vtable)\n        /* Don't use *(.data*) because it will place data meant for .data_flash in this section. */\n        *(.data.*)\n        *(.data)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        KEEP(*(.jcr*))\n\n        . = ALIGN(4);\n\n        /* All data end */\n        __data_end__ = .;\n\n    } > RAM AT > FLASH\n\n    . = .;\n    __dtcm_data_pre_location = LOADADDR(.data) + SIZEOF(.data);\n\n    /* Initialized DTCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .dtcm_data : ALIGN(16)\n    {\n        /* Start of DTCM Secure Trustzone region. */\n        __tz_DTCM_S = ABSOLUTE(DTCM_START);\n\n        /* Initialized DTCM data start */\n        __dtcm_data_start = .;\n\n        KEEP(*(.dtcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* Initialized DTCM data end */\n        __dtcm_data_end = .;\n    } > DTCM AT > FLASH = 0x00\n\n    . = __dtcm_data_end;\n    /* Uninitialized DTCM data. */\n    /* ALIGN appears on the left side of the colon because it is being used to assign the VMA directly, as opposed to a right side appearance which would control the LMA. */\n    .dtcm_bss ALIGN(8) (NOLOAD) :\n    {\n        /* Uninitialized DTCM data start */\n        __dtcm_bss_start = .;\n\n        KEEP(*(.dtcm_bss*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. No fill because of NOLOAD. */\n        . = ALIGN(8);\n\n        /* Uninitialized DTCM data end */\n        __dtcm_bss_end = .;\n\n        /*\n         * Start of the DTCM Non-Secure Trustzone region.\n         * DTCM_NS_START can be used to set a fixed address for non-secure DTCM in secure projects or flat projects.\n         */\n        __tz_DTCM_N = DEFINED(DTCM_NS_START) ? ABSOLUTE(DTCM_NS_START) : ALIGN(__dtcm_bss_end, 8192);\n    } > DTCM\n\n    /* Addresses exported for DTCM initialization. */\n    __dtcm_data_init_start = LOADADDR(.dtcm_data);\n    __dtcm_data_init_end = LOADADDR(.dtcm_data) + SIZEOF(.dtcm_data);\n\n    ASSERT(ORIGIN(DTCM) % 8 == 0, \"DTCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(DTCM) % 8 == 0, \"DTCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) == ADDR(.dtcm_bss), \".dtcm_bss has (VMA != LMA) but should be NOLOAD (VMA == LMA).\")\n    ASSERT(LOADADDR(.dtcm_data) % 16 == 0, \".dtcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.dtcm_data) % 8 == 0, \".dtcm_data section size must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) % 8 == 0, \".dtcm_bss section must be aligned to 8 bytes.\")\n    ASSERT(SIZEOF(.dtcm_bss) % 8 == 0, \".dtcm_bss section size must be a multiple of 8 bytes.\")\n    ASSERT(__dtcm_bss_start == __dtcm_data_end, \".dtcm_bss section is not adjacent to .dtcm_data section.\")\n\n    /* Restore location counter. */\n    /* If DTCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If DTCM is present, this will be the absolute address that follows the DTCM ROM location. */\n    . = (SIZEOF(.dtcm_data) > 0) ? __dtcm_data_init_end : __dtcm_data_pre_location;\n\n    /* TrustZone Secure Gateway Stubs Section */\n\n    /* Store location counter for SPI non-retentive sections. */\n    sgstubs_pre_location = .;\n\n    /* Determine the secure gateway stubs address either by the provided linker variable or the next 1024-byte block. */\n    SGSTUBS_LOC = (DEFINED(PROJECT_SECURE) && DEFINED(FLASH_NSC_START)) ? ABSOLUTE(FLASH_NSC_START) : ALIGN(1024);\n    .gnu.sgstubs SGSTUBS_LOC : ALIGN(1024)\n    {\n        __FLASH_NSC_START = DEFINED(FLASH_NSC_START) ? ABSOLUTE(FLASH_NSC_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : ALIGN(1024);\n        _start_sg = .;\n        *(.gnu.sgstubs*)\n        . = ALIGN(32);\n        _end_sg = .;\n    } > FLASH\n\n    __tz_FLASH_N = DEFINED(FLASH_NS_START) ? ABSOLUTE(FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : FLASH_LENGTH < 32768 ? FLASH_LENGTH : ALIGN(32768);\n    FLASH_NS_IMAGE_START = DEFINED(FLASH_NS_IMAGE_START) ? FLASH_NS_IMAGE_START : __tz_FLASH_N;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_S = ORIGIN(QSPI_FLASH);\n\n    /* QSPI_FLASH section to be downloaded via debugger */\n    .qspi_flash :\n    {\n        __qspi_flash_start__ = .;\n        KEEP(*(.qspi_flash*))\n        KEEP(*(.code_in_qspi*))\n        __qspi_flash_end__ = .;\n    } > QSPI_FLASH\n    __qspi_flash_code_size__ = __qspi_flash_end__ - __qspi_flash_start__;\n\n    /* QSPI_FLASH non-retentive section, creates a copy in internal flash that can be copied to QSPI */\n    __qspi_flash_code_addr__ = sgstubs_pre_location;\n    .qspi_non_retentive : AT(__qspi_flash_code_addr__)\n    {\n        __qspi_non_retentive_start__ = .;\n        KEEP(*(.qspi_non_retentive*))\n        __qspi_non_retentive_end__ = .;\n    } > QSPI_FLASH\n    __qspi_non_retentive_size__ = __qspi_non_retentive_end__ - __qspi_non_retentive_start__;\n\n    __qspi_region_max_size__ = 0x4000000;   /* Must be the same as defined in MEMORY above */\n    __qspi_region_start_address__ = __qspi_flash_start__;\n    __qspi_region_end_address__ = __qspi_flash_start__ + __qspi_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_N = __qspi_non_retentive_end__;\n\n    /* Support for OctaRAM */\n    .OSPI_DEVICE_0_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_0_start__ = .;\n        *(.ospi_device_0_no_load*)\n        . = ALIGN(4);\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0_RAM\n\n    .OSPI_DEVICE_1_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_1_start__ = .;\n        *(.ospi_device_1_no_load*)\n        . = ALIGN(4);\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1_RAM\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_S = ORIGIN(OSPI_DEVICE_0);\n\n    /* OSPI_DEVICE_0 section to be downloaded via debugger */\n    .OSPI_DEVICE_0 :\n    {\n        __ospi_device_0_start__ = .;\n        KEEP(*(.ospi_device_0*))\n        KEEP(*(.code_in_ospi_device_0*))\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_code_size__ = __ospi_device_0_end__ - __ospi_device_0_start__;\n\n    /* OSPI_DEVICE_0 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n     __ospi_device_0_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive));\n    .ospi_device_0_non_retentive : AT(__ospi_device_0_code_addr__)\n    {\n        __ospi_device_0_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_0_non_retentive*))\n        __ospi_device_0_non_retentive_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_non_retentive_size__ = __ospi_device_0_non_retentive_end__ - __ospi_device_0_non_retentive_start__;\n\n    __ospi_device_0_region_max_size__ = 0x8000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_0_region_start_address__ = __ospi_device_0_start__;\n    __ospi_device_0_region_end_address__ = __ospi_device_0_start__ + __ospi_device_0_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_N = __ospi_device_0_non_retentive_end__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_S = ORIGIN(OSPI_DEVICE_1);\n\n    /* OSPI_DEVICE_1 section to be downloaded via debugger */\n    .OSPI_DEVICE_1 :\n    {\n        __ospi_device_1_start__ = .;\n        KEEP(*(.ospi_device_1*))\n        KEEP(*(.code_in_ospi_device_1*))\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_code_size__ = __ospi_device_1_end__ - __ospi_device_1_start__;\n\n    /* OSPI_DEVICE_1 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n    __ospi_device_1_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive) + SIZEOF(.ospi_device_0_non_retentive));\n    .ospi_device_1_non_retentive : AT(__ospi_device_1_code_addr__)\n    {\n        __ospi_device_1_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_1_non_retentive*))\n        __ospi_device_1_non_retentive_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_non_retentive_size__ = __ospi_device_1_non_retentive_end__ - __ospi_device_1_non_retentive_start__;\n\n    __ospi_device_1_region_max_size__ = 0x10000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_1_region_start_address__ = __ospi_device_1_start__;\n    __ospi_device_1_region_end_address__ = __ospi_device_1_start__ + __ospi_device_1_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_N = __ospi_device_1_non_retentive_end__;\n\n    .noinit (NOLOAD):\n    {\n        . = ALIGN(4);\n        __noinit_start = .;\n        KEEP(*(.noinit*))\n        . = ALIGN(8);\n        /* Place the FreeRTOS heap here so that the __HeapLimit calculation does not include the freertos heap. */\n        KEEP(*(.heap.*))\n        __noinit_end = .;\n    } > RAM\n\n    . = .;\n    __nocache_pre_location = .;\n    .nocache ALIGN(32) (NOLOAD):\n    {\n        __nocache_start = .;\n\n        KEEP(*(.nocache))\n\n        . = ALIGN(32);\n        __nocache_end = .;\n    } > RAM\n    . = (SIZEOF(.nocache) > 0) ? __nocache_end : __nocache_pre_location;\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n        __HeapBase = .;\n        /* Place the STD heap here. */\n        KEEP(*(.heap))\n        __HeapLimit = .;\n    } > RAM\n\n    /* Stacks are stored in this section. */\n    .stack_dummy (NOLOAD):\n    {\n        . = ALIGN(8);\n        __StackLimit = .;\n        /* Main stack */\n        KEEP(*(.stack))\n        __StackTop = .;\n        /* Thread stacks */\n        KEEP(*(.stack*))\n        __StackTopAll = .;\n    } > RAM\n\n    PROVIDE(__stack = __StackTopAll);\n\n    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used\n       at run time for things such as ThreadX memory pool allocations. */\n    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);\n\n    /* RAM_NSC_START can be used to set a fixed address for non-secure callable RAM in secure projects.\n     * If it is not specified, the address for NSC RAM is the end of RAM aligned to a 1K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __RAM_NSC_START = DEFINED(RAM_NSC_START) ? ABSOLUTE(RAM_NSC_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_segment_used_end__, 1024);\n\n    /* RAM_NS_START can be used to set a fixed address for non-secure RAM in secure projects or flat projects.\n     * RAM_NS_BUFFER_BLOCK_LENGTH is used to allocate non-secure buffers in a flat project. If it is not\n     * specified, the address for NSC RAM is the end of RAM aligned to an 8K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_N = DEFINED(FLASH_BOOTLOADER_LENGTH) ? (RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH) : DEFINED(RAM_NS_START) ? ABSOLUTE(RAM_NS_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_NSC_START, 8192);\n\n    /* Non-secure buffers must be in non-secure RAM. This is primarily used for the EDMAC in flat projects.\n     * The EDMAC is a non-secure bus master and can only access non-secure RAM. */\n    .ns_buffer (NOLOAD):\n    {\n        /* Allocate RAM on a 32-byte boundary to help with placement of Ethernet buffers. */\n        . = __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_START & 0xFFFFFFE0) : .;\n\n        KEEP(*(.ns_buffer*))\n    } > RAM\n\n    /* Data flash. */\n    .data_flash :\n    {\n        . = ORIGIN(DATA_FLASH);\n        __tz_DATA_FLASH_S = .;\n        __Data_Flash_Start = .;\n        KEEP(*(.data_flash*))\n        __Data_Flash_End = .;\n\n        __tz_DATA_FLASH_N = DEFINED(DATA_FLASH_NS_START) ? ABSOLUTE(DATA_FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(DATA_FLASH_START + DATA_FLASH_LENGTH) : ALIGN(1024);\n    } > DATA_FLASH\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_S = ORIGIN(SDRAM);\n\n    /* SDRAM */\n    .sdram (NOLOAD):\n    {\n        __SDRAM_Start = .;\n        KEEP(*(.sdram*))\n        KEEP(*(.frame*))\n        __SDRAM_End = .;\n    } > SDRAM\n\n    . = .;\n    __nocache_sdram_pre_location = .;\n    .nocache_sdram ALIGN(32) (NOLOAD):\n    {\n        __nocache_sdram_start = .;\n\n        KEEP(*(.nocache_sdram))\n\n        . = ALIGN(32);\n        __nocache_sdram_end = .;\n    } > SDRAM\n    . = (SIZEOF(.nocache_sdram) > 0) ? __nocache_sdram_end : __nocache_sdram_pre_location;\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_N = __SDRAM_End;\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool. */\n    __tz_ID_CODE_S = ORIGIN(ID_CODE);\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool.\n     *       Set this symbol to the same value as __tz_ID_CODE_S so the RA configuration tool does not split the ID_CODE\n     *       memory region between TrustZone projects. */\n    __tz_ID_CODE_N = __tz_ID_CODE_S;\n\n    .id_code :\n    {\n        __ID_Code_Start = .;\n        KEEP(*(.id_code*))\n        __ID_Code_End = .;\n    } > ID_CODE\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S = ORIGIN(OPTION_SETTING_OFS);\n\n    .option_setting_ofs :\n    {\n        __OPTION_SETTING_OFS_Start = .;\n        KEEP(*(.option_setting_ofs0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x04 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_ofs2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x10 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_dualsel))\n        __OPTION_SETTING_OFS_End = .;\n    } > OPTION_SETTING_OFS = 0xFF\n\n    .option_setting_sas :\n    {\n        __OPTION_SETTING_SAS_Start = .;\n        KEEP(*(.option_setting_sas))\n        __OPTION_SETTING_SAS_End = .;\n    } > OPTION_SETTING_SAS = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_N = ABSOLUTE(OPTION_SETTING_START_NS);\n\n    .option_setting_ns :\n    {\n        __OPTION_SETTING_NS_Start = .;\n        KEEP(*(.option_setting_ofs1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x04 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_ofs3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x10 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_banksel))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x40 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x44 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x48 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x4C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x60 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x64 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x68 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x6C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps3))\n        __OPTION_SETTING_NS_End = .;\n    } > OPTION_SETTING = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_S = ORIGIN(OPTION_SETTING_S);\n\n    .option_setting_s :\n    {\n        __OPTION_SETTING_S_Start = .;\n        KEEP(*(.option_setting_ofs1_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x04 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x10 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x40 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x44 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x48 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x4C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x60 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x64 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x68 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x6C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x80 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs1_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x84 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x90 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC0 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC4 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC8 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xCC : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel3))\n        __OPTION_SETTING_S_End = .;\n    } > OPTION_SETTING_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_N = __OPTION_SETTING_S_End;\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_DATA_FLASH_S_S = ORIGIN(OPTION_SETTING_DATA_FLASH_S);\n\n    .option_setting_data_flash_s :\n    {\n        __OPTION_SETTING_DATA_FLASH_S_Start = .;\n        KEEP(*(.option_setting_data_flash_fsblctrl0))\n        . = USE_OPTION_SETTING_DATA_FLASH ? __OPTION_SETTING_DATA_FLASH_S_Start + 0x04 : __OPTION_SETTING_DATA_FLASH_S_Start;\n        KEEP(*(.option_setting_data_flash_fsblctrl1))\n        . = USE_OPTION_SETTING_DATA_FLASH ? __OPTION_SETTING_DATA_FLASH_S_Start + 0x08 : __OPTION_SETTING_DATA_FLASH_S_Start;\n        KEEP(*(.option_setting_data_flash_fsblctrl2))\n        . = USE_OPTION_SETTING_DATA_FLASH ? __OPTION_SETTING_DATA_FLASH_S_Start + 0x0C : __OPTION_SETTING_DATA_FLASH_S_Start;\n        KEEP(*(.option_setting_data_flash_sacc0))\n        . = USE_OPTION_SETTING_DATA_FLASH ? __OPTION_SETTING_DATA_FLASH_S_Start + 0x10 : __OPTION_SETTING_DATA_FLASH_S_Start;\n        KEEP(*(.option_setting_data_flash_sacc1))\n        . = USE_OPTION_SETTING_DATA_FLASH ? __OPTION_SETTING_DATA_FLASH_S_Start + 0x14 : __OPTION_SETTING_DATA_FLASH_S_Start;\n        KEEP(*(.option_setting_data_flash_samr))\n        . = USE_OPTION_SETTING_DATA_FLASH ? __OPTION_SETTING_DATA_FLASH_S_Start + 0x2E0 : __OPTION_SETTING_DATA_FLASH_S_Start;\n        KEEP(*(.option_setting_data_flash_hoemrtpk))\n        __OPTION_SETTING_DATA_FLASH_S_End = .;\n    } > OPTION_SETTING_DATA_FLASH_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_DATA_FLASH_S_N = __OPTION_SETTING_DATA_FLASH_S_End;\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/script/memory_regions.ld",
    "content": "\n            /* generated memory regions file - do not edit */\n                            RAM_START  = 0x22000000;\n                RAM_LENGTH = 0xE0000;\n                FLASH_START  = 0x02000000;\n                FLASH_LENGTH = 0x1F8000;\n                DATA_FLASH_START  = 0x27000000;\n                DATA_FLASH_LENGTH = 0x3000;\n                OPTION_SETTING_START  = 0x0300A100;\n                OPTION_SETTING_LENGTH = 0x100;\n                OPTION_SETTING_S_START  = 0x0300A200;\n                OPTION_SETTING_S_LENGTH = 0x100;\n                OPTION_SETTING_DATA_FLASH_S_START  = 0x27030080;\n                OPTION_SETTING_DATA_FLASH_S_LENGTH = 0x800;\n                ID_CODE_START  = 0x00000000;\n                ID_CODE_LENGTH = 0x0;\n                SDRAM_START  = 0x68000000;\n                SDRAM_LENGTH = 0x8000000;\n                QSPI_FLASH_START  = 0x60000000;\n                QSPI_FLASH_LENGTH = 0x0;\n                OSPI_DEVICE_0_START  = 0x80000000;\n                OSPI_DEVICE_0_LENGTH = 0x10000000;\n                OSPI_DEVICE_1_START  = 0x90000000;\n                OSPI_DEVICE_1_LENGTH = 0x10000000;\n                ITCM_START  = 0x00000000;\n                ITCM_LENGTH = 0x10000;\n                DTCM_START  = 0x20000000;\n                DTCM_LENGTH = 0x10000;\n                NS_OFFSET_START  = 0x10000000;\n                NS_OFFSET_LENGTH = 0x0;\n"
  },
  {
    "path": "hw/bsp/ra/boards/ra8m1_ek/smart_configurator/configuration.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<raConfiguration version=\"9\">\n  <generalSettings>\n    <option key=\"#Board#\" value=\"board.ra8m1ek\"/>\n    <option key=\"CPU\" value=\"RA8M1\"/>\n    <option key=\"Core\" value=\"CM85\"/>\n    <option key=\"#TargetName#\" value=\"R7FA8M1AHECBD\"/>\n    <option key=\"#TargetARCHITECTURE#\" value=\"cortex-m85\"/>\n    <option key=\"#DeviceCommand#\" value=\"R7FA8M1AH\"/>\n    <option key=\"#RTOS#\" value=\"_none\"/>\n    <option key=\"#pinconfiguration#\" value=\"R7FA8M1AHECBD.pincfg\"/>\n    <option key=\"#FSPVersion#\" value=\"5.6.0\"/>\n    <option key=\"#ConfigurationFragments#\" value=\"Renesas##BSP##Board##ra8m1_ek##\"/>\n    <option key=\"#SELECTED_TOOLCHAIN#\" value=\"com.renesas.cdt.managedbuild.gnuarm.toolchain.\"/>\n  </generalSettings>\n  <raBspConfiguration>\n    <config id=\"config.bsp.ra8m1.R7FA8M1AHECBD\">\n      <property id=\"config.bsp.part_number\" value=\"config.bsp.part_number.value\"/>\n      <property id=\"config.bsp.rom_size_bytes\" value=\"config.bsp.rom_size_bytes.value\"/>\n      <property id=\"config.bsp.rom_size_bytes_hidden\" value=\"2064384\"/>\n      <property id=\"config.bsp.ram_size_bytes\" value=\"config.bsp.ram_size_bytes.value\"/>\n      <property id=\"config.bsp.data_flash_size_bytes\" value=\"config.bsp.data_flash_size_bytes.value\"/>\n      <property id=\"config.bsp.package_style\" value=\"config.bsp.package_style.value\"/>\n      <property id=\"config.bsp.package_pins\" value=\"config.bsp.package_pins.value\"/>\n      <property id=\"config.bsp.irq_count_hidden\" value=\"96\"/>\n    </config>\n    <config id=\"config.bsp.ra8m1\">\n      <property id=\"config.bsp.series\" value=\"config.bsp.series.value\"/>\n    </config>\n    <config id=\"config.bsp.ra8m1.fsp\">\n      <property id=\"config.bsp.fsp.inline_irq_functions\" value=\"config.bsp.common.inline_irq_functions.enabled\"/>\n      <property id=\"config.bsp.fsp.sdram.enabled\" value=\"config.bsp.fsp.sdram.enabled.disabled\"/>\n      <property id=\"config.bsp.fsp.sdram.tras\" value=\"config.bsp.fsp.sdram.tras.6\"/>\n      <property id=\"config.bsp.fsp.sdram.trcd\" value=\"config.bsp.fsp.sdram.trcd.3\"/>\n      <property id=\"config.bsp.fsp.sdram.trp\" value=\"config.bsp.fsp.sdram.trp.3\"/>\n      <property id=\"config.bsp.fsp.sdram.twr\" value=\"config.bsp.fsp.sdram.twr.2\"/>\n      <property id=\"config.bsp.fsp.sdram.tcl\" value=\"config.bsp.fsp.sdram.tcl.3\"/>\n      <property id=\"config.bsp.fsp.sdram.trfc\" value=\"937\"/>\n      <property id=\"config.bsp.fsp.sdram.trefw\" value=\"config.bsp.fsp.sdram.trefw.8\"/>\n      <property id=\"config.bsp.fsp.sdram.arfi\" value=\"config.bsp.fsp.sdram.arfi.10\"/>\n      <property id=\"config.bsp.fsp.sdram.arfc\" value=\"config.bsp.fsp.sdram.arfc.8\"/>\n      <property id=\"config.bsp.fsp.sdram.prc\" value=\"config.bsp.fsp.sdram.prc.3\"/>\n      <property id=\"config.bsp.fsp.sdram.addr_shift\" value=\"config.bsp.fsp.sdram.addr_shift.9\"/>\n      <property id=\"config.bsp.fsp.sdram.endian_mode\" value=\"config.bsp.fsp.sdram.endian_mode.little\"/>\n      <property id=\"config.bsp.fsp.sdram.continuous_access_mode\" value=\"config.bsp.fsp.sdram.continuous_access_mode.enabled\"/>\n      <property id=\"config.bsp.fsp.sdram.bus_width\" value=\"config.bsp.fsp.sdram.bus_width.16\"/>\n      <property id=\"config.bsp.fsp.tz.exception_response\" value=\"config.bsp.fsp.tz.exception_response.nmi\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.bfhfnmins\" value=\"config.bsp.fsp.tz.cmsis.bfhfnmins.secure\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.sysresetreqs\" value=\"config.bsp.fsp.tz.cmsis.sysresetreqs.secure_only\"/>\n      <property id=\"config.bsp.fsp.tz.cmsis.s_priority_boost\" value=\"config.bsp.fsp.tz.cmsis.s_priority_boost.disabled\"/>\n      <property id=\"config.bsp.fsp.tz.rstsar\" value=\"config.bsp.fsp.tz.rstsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.bbfsar\" value=\"config.bsp.fsp.tz.bbfsar.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.sramsa0\" value=\"config.bsp.fsp.tz.sramsar.sramsa0.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.sramsa1\" value=\"config.bsp.fsp.tz.sramsar.sramsa1.both\"/>\n      <property id=\"config.bsp.fsp.tz.sramsar.stbramsa\" value=\"config.bsp.fsp.tz.sramsar.stbramsa.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussara\" value=\"config.bsp.fsp.tz.bussara.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussarb\" value=\"config.bsp.fsp.tz.bussarb.both\"/>\n      <property id=\"config.bsp.fsp.tz.bussarc\" value=\"config.bsp.fsp.tz.bussarc.both\"/>\n      <property id=\"config.bsp.fsp.tz.banksel_sel\" value=\"config.bsp.fsp.tz.banksel_sel.both\"/>\n      <property id=\"config.bsp.fsp.tz.uninitialized_ns_application_fallback\" value=\"config.bsp.fsp.tz.uninitialized_ns_application_fallback.enabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_start_mode\" value=\"config.bsp.fsp.OFS0.iwdt_start_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_timeout\" value=\"config.bsp.fsp.OFS0.iwdt_timeout.2048\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_divisor\" value=\"config.bsp.fsp.OFS0.iwdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_end\" value=\"config.bsp.fsp.OFS0.iwdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_start\" value=\"config.bsp.fsp.OFS0.iwdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_stop_control\" value=\"config.bsp.fsp.OFS0.iwdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_start_mode\" value=\"config.bsp.fsp.OFS0.wdt_start_mode.register\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_timeout\" value=\"config.bsp.fsp.OFS0.wdt_timeout.16384\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_divisor\" value=\"config.bsp.fsp.OFS0.wdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_end\" value=\"config.bsp.fsp.OFS0.wdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_start\" value=\"config.bsp.fsp.OFS0.wdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.wdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_stop_control\" value=\"config.bsp.fsp.OFS0.wdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0_level.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.start.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.low_power_consumption\" value=\"config.bsp.fsp.OFS1_SEL.voltage_detection0.low_power_consumption.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.swdbg\" value=\"config.bsp.fsp.OFS1_SEL.swdbg.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1_SEL.initeccen\" value=\"config.bsp.fsp.OFS1_SEL.initeccen.secure\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1.voltage_detection0.start.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1.voltage_detection0_level.160\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.low_power_consumption\" value=\"config.bsp.fsp.OFS1.voltage_detection0.low_power_consumption.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.hoco_osc\" value=\"config.bsp.fsp.OFS1.hoco_osc.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.swdbg\" value=\"config.bsp.fsp.OFS1.swdbg.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.initeccen\" value=\"config.bsp.fsp.OFS1.initeccen.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS2.dcdc\" value=\"config.bsp.fsp.OFS2.dcdc.enabled\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS0\" value=\"\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS1\" value=\"\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS2\" value=\"\"/>\n      <property id=\"config.bsp.fsp.BPS.BPS3\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS0\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS1\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS2\" value=\"\"/>\n      <property id=\"config.bsp.fsp.PBPS.PBPS3\" value=\"\"/>\n      <property id=\"config.bsp.fsp.dual_bank\" value=\"config.bsp.fsp.dual_bank.disabled\"/>\n      <property id=\"config.bsp.fsp.FSBLCTRL0.FSBLEN\" value=\"config.bsp.fsp.FSBLCTRL0.FSBLEN.disabled\"/>\n      <property id=\"config.bsp.fsp.FSBLCTRL0.FSBLSKIPSW\" value=\"config.bsp.fsp.FSBLCTRL0.FSBLSKIPSW.disabled\"/>\n      <property id=\"config.bsp.fsp.FSBLCTRL0.FSBLSKIPDS\" value=\"config.bsp.fsp.FSBLCTRL0.FSBLSKIPDS.disabled\"/>\n      <property id=\"config.bsp.fsp.FSBLCTRL0.FSBLCLK\" value=\"config.bsp.fsp.FSBLCTRL0.FSBLCLK.240\"/>\n      <property id=\"config.bsp.fsp.FSBLCTRL1.FSBLEXMD\" value=\"config.bsp.fsp.FSBLCTRL1.FSBLEXMD.secure_report\"/>\n      <property id=\"config.bsp.fsp.FSBLCTRL2.PORTPN\" value=\"config.bsp.fsp.FSBLCTRL2.PORTPN.15\"/>\n      <property id=\"config.bsp.fsp.FSBLCTRL2.PORTGN\" value=\"config.bsp.fsp.FSBLCTRL2.PORTGN.reserved\"/>\n      <property id=\"config.bsp.fsp.SACC0\" value=\"0xFFFFFFFF\"/>\n      <property id=\"config.bsp.fsp.SACC1\" value=\"0xFFFFFFFF\"/>\n      <property id=\"config.bsp.fsp.SAMR\" value=\"0xFFFFFFFF\"/>\n      <property id=\"config.bsp.fsp.hoco_fll\" value=\"config.bsp.fsp.hoco_fll.disabled\"/>\n      <property id=\"config.bsp.fsp.clock_settling_delay\" value=\"config.bsp.fsp.clock_settling_delay.enabled\"/>\n      <property id=\"config.bsp.fsp.sleep_mode_delays\" value=\"config.bsp.fsp.sleep_mode_delays.enabled\"/>\n      <property id=\"config.bsp.fsp.rtos_idle_sleep\" value=\"config.bsp.fsp.rtos_idle_sleep.disabled\"/>\n      <property id=\"config.bsp.fsp.mstp_change_delays\" value=\"config.bsp.fsp.mstp_change_delays.enabled\"/>\n      <property id=\"config.bsp.fsp.settling_delay_us\" value=\"150\"/>\n      <property id=\"config.bsp.common.main_osc_wait\" value=\"config.bsp.common.main_osc_wait.wait_8163\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.max_freq_hz\" value=\"60000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_b_uart.max_baud\" value=\"30000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_b_uart.ctspen_channels\" value=\"0x021F\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sample_and_hold\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sensors_are_exclusive\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_spi.max_bitrate\" value=\"30000000\"/>\n      <property id=\"config.bsp.fsp.mcu.spi.max_bitrate\" value=\"60000000\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.fastplus_channels\" value=\"0x3\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.rate.rate_fastplus\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.fastplus_channels\" value=\"0x3\"/>\n      <property id=\"config.bsp.fsp.mcu.gpt.pin_count_source_channels\" value=\"0x3FFF\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.num_channels\" value=\"2\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.rx_fifos\" value=\"2\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.buffer_ram\" value=\"1216\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.afl_rules\" value=\"32\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.afl_rules_each_chnl\" value=\"16\"/>\n      <property id=\"config.bsp.fsp.mcu.canfd.max_data_rate_hz\" value=\"8\"/>\n      <property id=\"config.bsp.fsp.mcu.adc_dmac.samples_per_channel\" value=\"32767\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_b_lin.max_baud\" value=\"7500000\"/>\n      <property id=\"config.bsp.fsp.dcache\" value=\"config.bsp.fsp.dcache.disabled\"/>\n    </config>\n    <config id=\"config.bsp.ra\">\n      <property id=\"config.bsp.common.main\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.heap\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.vcc\" value=\"3300\"/>\n      <property id=\"config.bsp.common.checking\" value=\"config.bsp.common.checking.disabled\"/>\n      <property id=\"config.bsp.common.assert\" value=\"config.bsp.common.assert.none\"/>\n      <property id=\"config.bsp.common.error_log\" value=\"config.bsp.common.error_log.none\"/>\n      <property id=\"config.bsp.common.soft_reset\" value=\"config.bsp.common.soft_reset.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_populated\" value=\"config.bsp.common.main_osc_populated.enabled\"/>\n      <property id=\"config.bsp.common.pfs_protect\" value=\"config.bsp.common.pfs_protect.enabled\"/>\n      <property id=\"config.bsp.common.c_runtime_init\" value=\"config.bsp.common.c_runtime_init.enabled\"/>\n      <property id=\"config.bsp.common.early_init\" value=\"config.bsp.common.early_init.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_clock_source\" value=\"config.bsp.common.main_osc_clock_source.crystal\"/>\n      <property id=\"config.bsp.common.subclock_populated\" value=\"config.bsp.common.subclock_populated.enabled\"/>\n      <property id=\"config.bsp.common.subclock_drive\" value=\"config.bsp.common.subclock_drive.standard\"/>\n      <property id=\"config.bsp.common.subclock_stabilization_ms\" value=\"1000\"/>\n    </config>\n  </raBspConfiguration>\n  <raClockConfiguration>\n    <node id=\"board.clock.xtal.freq\" mul=\"20000000\" option=\"_edit\"/>\n    <node id=\"board.clock.hoco.freq\" option=\"board.clock.hoco.freq.48m\"/>\n    <node id=\"board.clock.loco.freq\" option=\"board.clock.loco.freq.32768\"/>\n    <node id=\"board.clock.moco.freq\" option=\"board.clock.moco.freq.8m\"/>\n    <node id=\"board.clock.subclk.freq\" option=\"board.clock.subclk.freq.32768\"/>\n    <node id=\"board.clock.pll.source\" option=\"board.clock.pll.source.xtal\"/>\n    <node id=\"board.clock.pll.div\" option=\"board.clock.pll.div.2\"/>\n    <node id=\"board.clock.pll.mul\" option=\"board.clock.pll.mul.96_00\"/>\n    <node id=\"board.clock.pll.display\" option=\"board.clock.pll.display.value\"/>\n    <node id=\"board.clock.pll1p.div\" option=\"board.clock.pll1p.div.2\"/>\n    <node id=\"board.clock.pll1p.display\" option=\"board.clock.pll1p.display.value\"/>\n    <node id=\"board.clock.pll1q.div\" option=\"board.clock.pll1q.div.4\"/>\n    <node id=\"board.clock.pll1q.display\" option=\"board.clock.pll1q.display.value\"/>\n    <node id=\"board.clock.pll1r.div\" option=\"board.clock.pll1r.div.2\"/>\n    <node id=\"board.clock.pll1r.display\" option=\"board.clock.pll1r.display.value\"/>\n    <node id=\"board.clock.pll2.source\" option=\"board.clock.pll2.source.disabled\"/>\n    <node id=\"board.clock.pll2.div\" option=\"board.clock.pll2.div.2\"/>\n    <node id=\"board.clock.pll2.mul\" option=\"board.clock.pll2.mul.96_00\"/>\n    <node id=\"board.clock.pll2.display\" option=\"board.clock.pll2.display.value\"/>\n    <node id=\"board.clock.pll2p.div\" option=\"board.clock.pll2p.div.2\"/>\n    <node id=\"board.clock.pll2p.display\" option=\"board.clock.pll2p.display.value\"/>\n    <node id=\"board.clock.pll2q.div\" option=\"board.clock.pll2q.div.2\"/>\n    <node id=\"board.clock.pll2q.display\" option=\"board.clock.pll2q.display.value\"/>\n    <node id=\"board.clock.pll2r.div\" option=\"board.clock.pll2r.div.2\"/>\n    <node id=\"board.clock.pll2r.display\" option=\"board.clock.pll2r.display.value\"/>\n    <node id=\"board.clock.clock.source\" option=\"board.clock.clock.source.pll1p\"/>\n    <node id=\"board.clock.clkout.source\" option=\"board.clock.clkout.source.disabled\"/>\n    <node id=\"board.clock.sciclk.source\" option=\"board.clock.sciclk.source.disabled\"/>\n    <node id=\"board.clock.spiclk.source\" option=\"board.clock.spiclk.source.disabled\"/>\n    <node id=\"board.clock.canfdclk.source\" option=\"board.clock.canfdclk.source.disabled\"/>\n    <node id=\"board.clock.i3cclk.source\" option=\"board.clock.i3cclk.source.disabled\"/>\n    <node id=\"board.clock.uck.source\" option=\"board.clock.uck.source.pll1q\"/>\n    <node id=\"board.clock.u60ck.source\" option=\"board.clock.u60ck.source.pll1p\"/>\n    <node id=\"board.clock.octaspiclk.source\" option=\"board.clock.octaspiclk.source.disabled\"/>\n    <node id=\"board.clock.cpuclk.div\" option=\"board.clock.cpuclk.div.1\"/>\n    <node id=\"board.clock.iclk.div\" option=\"board.clock.iclk.div.2\"/>\n    <node id=\"board.clock.pclka.div\" option=\"board.clock.pclka.div.4\"/>\n    <node id=\"board.clock.pclkb.div\" option=\"board.clock.pclkb.div.8\"/>\n    <node id=\"board.clock.pclkc.div\" option=\"board.clock.pclkc.div.8\"/>\n    <node id=\"board.clock.pclkd.div\" option=\"board.clock.pclkd.div.4\"/>\n    <node id=\"board.clock.pclke.div\" option=\"board.clock.pclke.div.2\"/>\n    <node id=\"board.clock.sdclkout.enable\" option=\"board.clock.sdclkout.enable.enabled\"/>\n    <node id=\"board.clock.bclk.div\" option=\"board.clock.bclk.div.4\"/>\n    <node id=\"board.clock.bclkout.div\" option=\"board.clock.bclkout.div.2\"/>\n    <node id=\"board.clock.fclk.div\" option=\"board.clock.fclk.div.8\"/>\n    <node id=\"board.clock.clkout.div\" option=\"board.clock.clkout.div.1\"/>\n    <node id=\"board.clock.sciclk.div\" option=\"board.clock.sciclk.div.4\"/>\n    <node id=\"board.clock.spiclk.div\" option=\"board.clock.spiclk.div.4\"/>\n    <node id=\"board.clock.canfdclk.div\" option=\"board.clock.canfdclk.div.8\"/>\n    <node id=\"board.clock.i3cclk.div\" option=\"board.clock.i3cclk.div.3\"/>\n    <node id=\"board.clock.uck.div\" option=\"board.clock.uck.div.5\"/>\n    <node id=\"board.clock.u60ck.div\" option=\"board.clock.u60ck.div.8\"/>\n    <node id=\"board.clock.octaspiclk.div\" option=\"board.clock.octaspiclk.div.4\"/>\n    <node id=\"board.clock.cpuclk.display\" option=\"board.clock.cpuclk.display.value\"/>\n    <node id=\"board.clock.iclk.display\" option=\"board.clock.iclk.display.value\"/>\n    <node id=\"board.clock.pclka.display\" option=\"board.clock.pclka.display.value\"/>\n    <node id=\"board.clock.pclkb.display\" option=\"board.clock.pclkb.display.value\"/>\n    <node id=\"board.clock.pclkc.display\" option=\"board.clock.pclkc.display.value\"/>\n    <node id=\"board.clock.pclkd.display\" option=\"board.clock.pclkd.display.value\"/>\n    <node id=\"board.clock.pclke.display\" option=\"board.clock.pclke.display.value\"/>\n    <node id=\"board.clock.sdclkout.display\" option=\"board.clock.sdclkout.display.value\"/>\n    <node id=\"board.clock.bclk.display\" option=\"board.clock.bclk.display.value\"/>\n    <node id=\"board.clock.bclkout.display\" option=\"board.clock.bclkout.display.value\"/>\n    <node id=\"board.clock.fclk.display\" option=\"board.clock.fclk.display.value\"/>\n    <node id=\"board.clock.clkout.display\" option=\"board.clock.clkout.display.value\"/>\n    <node id=\"board.clock.sciclk.display\" option=\"board.clock.sciclk.display.value\"/>\n    <node id=\"board.clock.spiclk.display\" option=\"board.clock.spiclk.display.value\"/>\n    <node id=\"board.clock.canfdclk.display\" option=\"board.clock.canfdclk.display.value\"/>\n    <node id=\"board.clock.i3cclk.display\" option=\"board.clock.i3cclk.display.value\"/>\n    <node id=\"board.clock.uck.display\" option=\"board.clock.uck.display.value\"/>\n    <node id=\"board.clock.u60ck.display\" option=\"board.clock.u60ck.display.value\"/>\n    <node id=\"board.clock.octaspiclk.display\" option=\"board.clock.octaspiclk.display.value\"/>\n  </raClockConfiguration>\n  <raComponentSelection>\n    <component apiversion=\"\" class=\"Projects\" condition=\"\" group=\"all\" subgroup=\"baremetal_blinky\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Simple application that blinks an LED. No RTOS included.</description>\n      <originalPack>Renesas.RA_baremetal_blinky.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"Common\" condition=\"\" group=\"all\" subgroup=\"fsp_common\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board Support Package Common Files</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_ioport\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>I/O Port</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"CMSIS\" condition=\"\" group=\"CMSIS5\" subgroup=\"CoreM\" variant=\"\" vendor=\"Arm\" version=\"6.1.0+fsp.5.6.0\">\n      <description>Arm CMSIS Version 6 - Core (M)</description>\n      <originalPack>Arm.CMSIS6.6.1.0+fsp.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"Board\" subgroup=\"ra8m1_ek\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>RA8M1-EK Board Support Files</description>\n      <originalPack>Renesas.RA_board_ra8m1_ek.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra8m1\" subgroup=\"device\" variant=\"R7FA8M1AHECBD\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for R7FA8M1AHECBD</description>\n      <originalPack>Renesas.RA_mcu_ra8m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra8m1\" subgroup=\"device\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA8M1</description>\n      <originalPack>Renesas.RA_mcu_ra8m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra8m1\" subgroup=\"fsp\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA8M1 - FSP Data</description>\n      <originalPack>Renesas.RA_mcu_ra8m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra8m1\" subgroup=\"events\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA8M1 - Events</description>\n      <originalPack>Renesas.RA_mcu_ra8m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_usb_basic\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>USB Basic</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_usb_pcdc\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>USB Peripheral Communications Device Class</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n  </raComponentSelection>\n  <raElcConfiguration/>\n  <raIcuConfiguration/>\n  <raModuleConfiguration>\n    <module id=\"module.driver.ioport_on_ioport.0\">\n      <property id=\"module.driver.ioport.name\" value=\"g_ioport\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport1\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport2\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport3\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport4\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.pincfg\" value=\"g_bsp_pin_cfg\"/>\n    </module>\n    <module id=\"module.driver.pcdc_on_usb.216998869\">\n      <property id=\"module.driver.pcdc.name\" value=\"g_pcdc0\"/>\n    </module>\n    <module id=\"module.driver.basic_on_usb.877233012\">\n      <property id=\"module.driver.basic.name\" value=\"g_basic1\"/>\n      <property id=\"module.driver.usb_basic.usb_mode\" value=\"module.driver.usb_basic.usb_mode.host\"/>\n      <property id=\"module.driver.usb_basic.usb_speed\" value=\"module.driver.usb_basic.usb_speed.hs\"/>\n      <property id=\"module.driver.usb_basic.usb_modulenumber\" value=\"module.driver.usb_basic.usb_modulenumber.1\"/>\n      <property id=\"module.driver.usb_basic.usb_classtype\" value=\"module.driver.usb_basic.usb_classtype.pcdc\"/>\n      <property id=\"module.driver.usb_basic.p_usb_reg\" value=\"g_usb_descriptor\"/>\n      <property id=\"module.driver.usb_basic.complience_cb\" value=\"NULL\"/>\n      <property id=\"module.driver.usb_basic.ipl\" value=\"board.icu.common.irq.priority12\"/>\n      <property id=\"module.driver.usb_basic.ipl_r\" value=\"board.icu.common.irq.priority12\"/>\n      <property id=\"module.driver.usb_basic.ipl_d0\" value=\"board.icu.common.irq.priority12\"/>\n      <property id=\"module.driver.usb_basic.ipl_d1\" value=\"board.icu.common.irq.priority12\"/>\n      <property id=\"module.driver.usb_basic.hsipl\" value=\"board.icu.common.irq.priority12\"/>\n      <property id=\"module.driver.usb_basic.hsipl_d0\" value=\"board.icu.common.irq.priority12\"/>\n      <property id=\"module.driver.usb_basic.hsipl_d1\" value=\"board.icu.common.irq.priority12\"/>\n      <property id=\"module.driver.usb_basic.rtos_callback\" value=\"NULL\"/>\n      <property id=\"module.driver.usb_basic.other_context\" value=\"NULL\"/>\n    </module>\n    <context id=\"_hal.0\">\n      <stack module=\"module.driver.ioport_on_ioport.0\"/>\n      <stack module=\"module.driver.pcdc_on_usb.216998869\">\n        <stack module=\"module.driver.basic_on_usb.877233012\" requires=\"module.driver.basic_on_usb.requires.basic\"/>\n      </stack>\n    </context>\n    <config id=\"config.driver.usb_basic\">\n      <property id=\"config.driver.usb_basic.param_checking_enable\" value=\"config.driver.usb_basic.param_checking_enable.bsp\"/>\n      <property id=\"config.driver.usb_basic.pll_clock_frequency\" value=\"config.driver.usb_basic.pll_clock_frequency.20mhz\"/>\n      <property id=\"config.driver.usb_basic.buswait\" value=\"config.driver.usb_basic.buswait.7\"/>\n      <property id=\"config.driver.usb_basic.bc_function\" value=\"config.driver.usb_basic.bc_function.enable\"/>\n      <property id=\"config.driver.usb_basic.power_source\" value=\"config.driver.usb_basic.power_source.high\"/>\n      <property id=\"config.driver.usb_basic.dcp_function\" value=\"config.driver.usb_basic.dcp_function.disable\"/>\n      <property id=\"config.driver.usb_basic.request\" value=\"config.driver.usb_basic.request.enable\"/>\n      <property id=\"config.driver.usb_basic.dblb\" value=\"config.driver.usb_basic.dblb.enable\"/>\n      <property id=\"config.driver.usb_basic.cntmd\" value=\"config.driver.usb_basic.cntmd.disable\"/>\n      <property id=\"config.driver.usb_basic.ldo_regulator\" value=\"config.driver.usb_basic.ldo_regulator.disable\"/>\n      <property id=\"config.driver.usb_basic.type_c\" value=\"config.driver.usb_basic.type_c.disable\"/>\n      <property id=\"config.driver.usb_basic.dma\" value=\"config.driver.usb_basic.dma.disable\"/>\n      <property id=\"config.driver.usb_basic.source_address\" value=\"config.driver.usb_basic.source_address.none\"/>\n      <property id=\"config.driver.usb_basic.dest_address\" value=\"config.driver.usb_basic.dest_address.none\"/>\n      <property id=\"config.driver.usb_basic.compliance_mode\" value=\"config.driver.usb_basic.compliance_mode.disable\"/>\n      <property id=\"config.driver.usb_basic.tpl_table\" value=\"NULL\"/>\n    </config>\n    <config id=\"config.driver.usb_pcdc\">\n      <property id=\"config.driver.usb_pcdc.bulk_in\" value=\"config.driver.usb_pcdc.bulk_in.pipe4\"/>\n      <property id=\"config.driver.usb_pcdc.bulk_out\" value=\"config.driver.usb_pcdc.bulk_out.pipe5\"/>\n      <property id=\"config.driver.usb_pcdc.int_in\" value=\"config.driver.usb_pcdc.int_in.pipe6\"/>\n    </config>\n    <config id=\"config.driver.usb_pcdc_class\"/>\n    <config id=\"config.driver.ioport\">\n      <property id=\"config.driver.ioport.checking\" value=\"config.driver.ioport.checking.system\"/>\n    </config>\n  </raModuleConfiguration>\n  <raPinConfiguration>\n    <symbolicName propertyId=\"p000.symbolic_name\" value=\"ENET_RMII_INT\"/>\n    <symbolicName propertyId=\"p001.symbolic_name\" value=\"ARDUINO_A3\"/>\n    <symbolicName propertyId=\"p002.symbolic_name\" value=\"GROVE2_AN102\"/>\n    <symbolicName propertyId=\"p003.symbolic_name\" value=\"ARDUINO_A1\"/>\n    <symbolicName propertyId=\"p004.symbolic_name\" value=\"ARDUINO_A0_MIKROBUS_AN000\"/>\n    <symbolicName propertyId=\"p005.symbolic_name\" value=\"GROVE2_AN001\"/>\n    <symbolicName propertyId=\"p006.symbolic_name\" value=\"PMOD1_IRQ11\"/>\n    <symbolicName propertyId=\"p007.symbolic_name\" value=\"ARDUINO_A004\"/>\n    <symbolicName propertyId=\"p008.symbolic_name\" value=\"USER_S2\"/>\n    <symbolicName propertyId=\"p009.symbolic_name\" value=\"SW1\"/>\n    <symbolicName propertyId=\"p010.symbolic_name\" value=\"MIKROBUS_IRQ14\"/>\n    <symbolicName propertyId=\"p014.symbolic_name\" value=\"ARDUINO_A4\"/>\n    <symbolicName propertyId=\"p015.symbolic_name\" value=\"ARDUINO_A5\"/>\n    <symbolicName propertyId=\"p100.symbolic_name\" value=\"OSPI_DQ0\"/>\n    <symbolicName propertyId=\"p101.symbolic_name\" value=\"OSPI_DQ3\"/>\n    <symbolicName propertyId=\"p102.symbolic_name\" value=\"OSPI_DQ4\"/>\n    <symbolicName propertyId=\"p103.symbolic_name\" value=\"OSPI_DQ2\"/>\n    <symbolicName propertyId=\"p104.symbolic_name\" value=\"OSPI_CS\"/>\n    <symbolicName propertyId=\"p105.symbolic_name\" value=\"OSPI_INT\"/>\n    <symbolicName propertyId=\"p106.symbolic_name\" value=\"OSPI_RESET\"/>\n    <symbolicName propertyId=\"p107.symbolic_name\" value=\"LED3\"/>\n    <symbolicName propertyId=\"p112.symbolic_name\" value=\"ETH_A_RMII_RMII_RXDV\"/>\n    <symbolicName propertyId=\"p114.symbolic_name\" value=\"ETH_A_LINKSTA\"/>\n    <symbolicName propertyId=\"p115.symbolic_name\" value=\"MPLX_CTRL\"/>\n    <symbolicName propertyId=\"p200.symbolic_name\" value=\"NMI\"/>\n    <symbolicName propertyId=\"p201.symbolic_name\" value=\"MD\"/>\n    <symbolicName propertyId=\"p207.symbolic_name\" value=\"CAN_STB\"/>\n    <symbolicName propertyId=\"p208.symbolic_name\" value=\"TDI\"/>\n    <symbolicName propertyId=\"p209.symbolic_name\" value=\"TDO\"/>\n    <symbolicName propertyId=\"p210.symbolic_name\" value=\"SWDIO\"/>\n    <symbolicName propertyId=\"p211.symbolic_name\" value=\"SWCLK\"/>\n    <symbolicName propertyId=\"p212.symbolic_name\" value=\"EXTAL\"/>\n    <symbolicName propertyId=\"p213.symbolic_name\" value=\"XTAL\"/>\n    <symbolicName propertyId=\"p300.symbolic_name\" value=\"ETH_A_RXER\"/>\n    <symbolicName propertyId=\"p301.symbolic_name\" value=\"ETH_A_RXD1\"/>\n    <symbolicName propertyId=\"p302.symbolic_name\" value=\"ETH_A_RXD0\"/>\n    <symbolicName propertyId=\"p303.symbolic_name\" value=\"ETH_A_REFCLK\"/>\n    <symbolicName propertyId=\"p304.symbolic_name\" value=\"ETH_A_TXD0\"/>\n    <symbolicName propertyId=\"p305.symbolic_name\" value=\"ETH_A_TXD1\"/>\n    <symbolicName propertyId=\"p306.symbolic_name\" value=\"ETH_A_TXEN\"/>\n    <symbolicName propertyId=\"p307.symbolic_name\" value=\"ETH_A_MDIO\"/>\n    <symbolicName propertyId=\"p308.symbolic_name\" value=\"ETH_A_MDC\"/>\n    <symbolicName propertyId=\"p309.symbolic_name\" value=\"ARDUINO_D0_MIKROBUS_RXD3\"/>\n    <symbolicName propertyId=\"p310.symbolic_name\" value=\"ARDUINO_D1_MIKROBUS_TXD3\"/>\n    <symbolicName propertyId=\"p311.symbolic_name\" value=\"CAN_RXD\"/>\n    <symbolicName propertyId=\"p312.symbolic_name\" value=\"CAN_TXD\"/>\n    <symbolicName propertyId=\"p400.symbolic_name\" value=\"I3C_SCL0_ARDUINO_MIKROBUS_PMOD1_3_qwiic\"/>\n    <symbolicName propertyId=\"p401.symbolic_name\" value=\"I3C_SDA0_ARDUINO_MIKROBUS_PMOD1_4_qwiic\"/>\n    <symbolicName propertyId=\"p402.symbolic_name\" value=\"ETH_B_MDIO\"/>\n    <symbolicName propertyId=\"p403.symbolic_name\" value=\"ETH_B_LINKSTA\"/>\n    <symbolicName propertyId=\"p404.symbolic_name\" value=\"ETH_B_RST_N\"/>\n    <symbolicName propertyId=\"p405.symbolic_name\" value=\"ETH_B_TXEN\"/>\n    <symbolicName propertyId=\"p406.symbolic_name\" value=\"ETH_B_TXD1\"/>\n    <symbolicName propertyId=\"p407.symbolic_name\" value=\"USBFS_VBUS\"/>\n    <symbolicName propertyId=\"p408.symbolic_name\" value=\"USBHS_VBUSEN\"/>\n    <symbolicName propertyId=\"p409.symbolic_name\" value=\"USBHS_OVRCURA\"/>\n    <symbolicName propertyId=\"p410.symbolic_name\" value=\"MISOB_B_ARDUINO_MIKROBUS\"/>\n    <symbolicName propertyId=\"p411.symbolic_name\" value=\"MOSIB_B_ARDUINO_MIKROBUS\"/>\n    <symbolicName propertyId=\"p412.symbolic_name\" value=\"RSPCKB_B_ARDUINO_MIKROBUS\"/>\n    <symbolicName propertyId=\"p413.symbolic_name\" value=\"SSLB0_B_ARDUINO_D10_MIKROBUS\"/>\n    <symbolicName propertyId=\"p414.symbolic_name\" value=\"LED2\"/>\n    <symbolicName propertyId=\"p500.symbolic_name\" value=\"USBFS_VBUS_EN\"/>\n    <symbolicName propertyId=\"p501.symbolic_name\" value=\"USBFS_OVERCURA\"/>\n    <symbolicName propertyId=\"p502.symbolic_name\" value=\"MIKROBUS_RESET\"/>\n    <symbolicName propertyId=\"p508.symbolic_name\" value=\"PMOD2_7_IRQ1\"/>\n    <symbolicName propertyId=\"p511.symbolic_name\" value=\"GROVE2_IIC_SDA1\"/>\n    <symbolicName propertyId=\"p512.symbolic_name\" value=\"GROVE2_IIC_SCL1\"/>\n    <symbolicName propertyId=\"p600.symbolic_name\" value=\"LED1\"/>\n    <symbolicName propertyId=\"p601.symbolic_name\" value=\"ARDUINO_D5\"/>\n    <symbolicName propertyId=\"p602.symbolic_name\" value=\"ARDUINO_D6\"/>\n    <symbolicName propertyId=\"p603.symbolic_name\" value=\"ARDUINO_D9\"/>\n    <symbolicName propertyId=\"p609.symbolic_name\" value=\"PMOD1_3_MISO0_RXD0_SCL0\"/>\n    <symbolicName propertyId=\"p610.symbolic_name\" value=\"PMOD1_2_MOSI0_TXD0\"/>\n    <symbolicName propertyId=\"p611.symbolic_name\" value=\"PMOD1_4_SCK0\"/>\n    <symbolicName propertyId=\"p612.symbolic_name\" value=\"PMOD1_1_SSL0_CTS_RTS\"/>\n    <symbolicName propertyId=\"p613.symbolic_name\" value=\"PMOD1_1_CTS0\"/>\n    <symbolicName propertyId=\"p614.symbolic_name\" value=\"PMOD1_9_GPIO\"/>\n    <symbolicName propertyId=\"p615.symbolic_name\" value=\"PMOD1_10_GPIO\"/>\n    <symbolicName propertyId=\"p700.symbolic_name\" value=\"ETH_B_TXD0\"/>\n    <symbolicName propertyId=\"p701.symbolic_name\" value=\"ETH_B_REFCLK\"/>\n    <symbolicName propertyId=\"p702.symbolic_name\" value=\"ETH_B_RXD0\"/>\n    <symbolicName propertyId=\"p703.symbolic_name\" value=\"ETH_B_RXD1\"/>\n    <symbolicName propertyId=\"p704.symbolic_name\" value=\"ETH_B_RXER\"/>\n    <symbolicName propertyId=\"p705.symbolic_name\" value=\"ETH_B_RMII_RXDV\"/>\n    <symbolicName propertyId=\"p711.symbolic_name\" value=\"I3C_SDA0_PULLUP\"/>\n    <symbolicName propertyId=\"p800.symbolic_name\" value=\"OSPI_DQ5\"/>\n    <symbolicName propertyId=\"p801.symbolic_name\" value=\"OSPI_DS\"/>\n    <symbolicName propertyId=\"p802.symbolic_name\" value=\"OSPI_DQ6\"/>\n    <symbolicName propertyId=\"p803.symbolic_name\" value=\"OSPI_DQ1\"/>\n    <symbolicName propertyId=\"p804.symbolic_name\" value=\"OSPI_DQ7\"/>\n    <symbolicName propertyId=\"p808.symbolic_name\" value=\"OSPI_CK\"/>\n    <symbolicName propertyId=\"p809.symbolic_name\" value=\"PMOD2_8_RESET\"/>\n    <symbolicName propertyId=\"p810.symbolic_name\" value=\"PMOD2_9_GPIO\"/>\n    <symbolicName propertyId=\"p811.symbolic_name\" value=\"PMOD2_10_GPIO\"/>\n    <symbolicName propertyId=\"p812.symbolic_name\" value=\"ARDUINO_RESET\"/>\n    <symbolicName propertyId=\"p814.symbolic_name\" value=\"USBFS_P\"/>\n    <symbolicName propertyId=\"p815.symbolic_name\" value=\"USBFS_N\"/>\n    <symbolicName propertyId=\"p905.symbolic_name\" value=\"ARDUINO_D4\"/>\n    <symbolicName propertyId=\"p906.symbolic_name\" value=\"ARDUINO_D2\"/>\n    <symbolicName propertyId=\"p907.symbolic_name\" value=\"ARDUINO_D3_MIKROBUS_GTIOC13A\"/>\n    <symbolicName propertyId=\"p908.symbolic_name\" value=\"ARDUINO_D7\"/>\n    <symbolicName propertyId=\"p909.symbolic_name\" value=\"ARDUINO_D8\"/>\n    <symbolicName propertyId=\"pa02.symbolic_name\" value=\"PMOD2_3_MISO2_RXD2\"/>\n    <symbolicName propertyId=\"pa03.symbolic_name\" value=\"PMOD2_2_MOSI2_TXD2\"/>\n    <symbolicName propertyId=\"pa04.symbolic_name\" value=\"PMOD2_4_SCK2\"/>\n    <symbolicName propertyId=\"pa05.symbolic_name\" value=\"PMOD2_1_CTS_RTS_SSL2\"/>\n    <symbolicName propertyId=\"pa06.symbolic_name\" value=\"PMOD2_1_CTS2\"/>\n    <symbolicName propertyId=\"pa08.symbolic_name\" value=\"PMOD1_8_RESET\"/>\n    <symbolicName propertyId=\"pa14.symbolic_name\" value=\"JLOB_COMS_TX\"/>\n    <symbolicName propertyId=\"pa15.symbolic_name\" value=\"JLOB_COMS_RX\"/>\n    <symbolicName propertyId=\"pb00.symbolic_name\" value=\"I3C_SCL0_PULLUP\"/>\n    <symbolicName propertyId=\"pb01.symbolic_name\" value=\"USBHS_VBUS\"/>\n    <pincfg active=\"true\" name=\"RA8M1 EK\" selected=\"true\" symbol=\"g_bsp_pin_cfg\">\n      <configSetting altId=\"adc0.an000.p004\" configurationId=\"adc0.an000\"/>\n      <configSetting altId=\"adc0.an001.p005\" configurationId=\"adc0.an001\"/>\n      <configSetting altId=\"adc0.an004.p007\" configurationId=\"adc0.an004\"/>\n      <configSetting altId=\"adc0.an007.p014\" configurationId=\"adc0.an007\"/>\n      <configSetting altId=\"adc0.mode.custom.free\" configurationId=\"adc0.mode\"/>\n      <configSetting altId=\"adc1.an102.p002\" configurationId=\"adc1.an102\"/>\n      <configSetting altId=\"adc1.an104.p003\" configurationId=\"adc1.an104\"/>\n      <configSetting altId=\"adc1.an105.p015\" configurationId=\"adc1.an105\"/>\n      <configSetting altId=\"adc1.an106.p011\" configurationId=\"adc1.an106\"/>\n      <configSetting altId=\"adc1.mode.custom.free\" configurationId=\"adc1.mode\"/>\n      <configSetting altId=\"ether_rmii.pairing.a\" configurationId=\"ether_rmii.pairing\"/>\n      <configSetting altId=\"iic1.mode.enabled.a\" configurationId=\"iic1.mode\"/>\n      <configSetting altId=\"iic1.scl1.p512\" configurationId=\"iic1.scl1\"/>\n      <configSetting altId=\"iic1.sda1.p511\" configurationId=\"iic1.sda1\"/>\n      <configSetting altId=\"irq12.irq12_dash_ds.p008\" configurationId=\"irq12.irq12_dash_ds\"/>\n      <configSetting altId=\"irq12.mode.custom.free\" configurationId=\"irq12.mode\"/>\n      <configSetting altId=\"irq13.irq13_dash_ds.p009\" configurationId=\"irq13.irq13_dash_ds\"/>\n      <configSetting altId=\"irq13.mode.custom.free\" configurationId=\"irq13.mode\"/>\n      <configSetting altId=\"irq9.mode.custom.free\" configurationId=\"irq9.mode\"/>\n      <configSetting altId=\"jtag_fslash_swd.mode.swd.free\" configurationId=\"jtag_fslash_swd.mode\"/>\n      <configSetting altId=\"jtag_fslash_swd.swclk.p211\" configurationId=\"jtag_fslash_swd.swclk\"/>\n      <configSetting altId=\"jtag_fslash_swd.swdio.p210\" configurationId=\"jtag_fslash_swd.swdio\"/>\n      <configSetting altId=\"ospi.mode.custom.free\" configurationId=\"ospi.mode\"/>\n      <configSetting altId=\"ospi.om_cs1.p104\" configurationId=\"ospi.om_cs1\"/>\n      <configSetting altId=\"ospi.om_dqs.p801\" configurationId=\"ospi.om_dqs\"/>\n      <configSetting altId=\"ospi.om_ecsint1.p105\" configurationId=\"ospi.om_ecsint1\"/>\n      <configSetting altId=\"ospi.om_reset.p106\" configurationId=\"ospi.om_reset\"/>\n      <configSetting altId=\"ospi.om_sclk.p808\" configurationId=\"ospi.om_sclk\"/>\n      <configSetting altId=\"ospi.om_sio0.p100\" configurationId=\"ospi.om_sio0\"/>\n      <configSetting altId=\"ospi.om_sio1.p803\" configurationId=\"ospi.om_sio1\"/>\n      <configSetting altId=\"ospi.om_sio2.p103\" configurationId=\"ospi.om_sio2\"/>\n      <configSetting altId=\"ospi.om_sio3.p101\" configurationId=\"ospi.om_sio3\"/>\n      <configSetting altId=\"ospi.om_sio4.p102\" configurationId=\"ospi.om_sio4\"/>\n      <configSetting altId=\"ospi.om_sio5.p800\" configurationId=\"ospi.om_sio5\"/>\n      <configSetting altId=\"ospi.om_sio6.p802\" configurationId=\"ospi.om_sio6\"/>\n      <configSetting altId=\"ospi.om_sio7.p804\" configurationId=\"ospi.om_sio7\"/>\n      <configSetting altId=\"p000.input\" configurationId=\"p000\"/>\n      <configSetting altId=\"p000.gpio_mode.gpio_mode_in\" configurationId=\"p000.gpio_mode\"/>\n      <configSetting altId=\"p002.adc1.an102\" configurationId=\"p002\"/>\n      <configSetting altId=\"p002.gpio_mode.gpio_mode_an\" configurationId=\"p002.gpio_mode\"/>\n      <configSetting altId=\"p003.adc1.an104\" configurationId=\"p003\"/>\n      <configSetting altId=\"p003.gpio_mode.gpio_mode_an\" configurationId=\"p003.gpio_mode\"/>\n      <configSetting altId=\"p004.adc0.an000\" configurationId=\"p004\"/>\n      <configSetting altId=\"p004.gpio_mode.gpio_mode_an\" configurationId=\"p004.gpio_mode\"/>\n      <configSetting altId=\"p005.adc0.an001\" configurationId=\"p005\"/>\n      <configSetting altId=\"p005.gpio_mode.gpio_mode_an\" configurationId=\"p005.gpio_mode\"/>\n      <configSetting altId=\"p007.adc0.an004\" configurationId=\"p007\"/>\n      <configSetting altId=\"p007.gpio_mode.gpio_mode_an\" configurationId=\"p007.gpio_mode\"/>\n      <configSetting altId=\"p008.irq12.irq12_dash_ds\" configurationId=\"p008\"/>\n      <configSetting altId=\"p008.gpio_irq.gpio_irq_enabled\" configurationId=\"p008.gpio_irq\"/>\n      <configSetting altId=\"p008.gpio_mode.gpio_mode_irq\" configurationId=\"p008.gpio_mode\"/>\n      <configSetting altId=\"p009.irq13.irq13_dash_ds\" configurationId=\"p009\"/>\n      <configSetting altId=\"p009.gpio_irq.gpio_irq_enabled\" configurationId=\"p009.gpio_irq\"/>\n      <configSetting altId=\"p009.gpio_mode.gpio_mode_irq\" configurationId=\"p009.gpio_mode\"/>\n      <configSetting altId=\"p011.adc1.an106\" configurationId=\"p011\"/>\n      <configSetting altId=\"p011.gpio_mode.gpio_mode_an\" configurationId=\"p011.gpio_mode\"/>\n      <configSetting altId=\"p014.adc0.an007\" configurationId=\"p014\"/>\n      <configSetting altId=\"p014.gpio_mode.gpio_mode_an\" configurationId=\"p014.gpio_mode\"/>\n      <configSetting altId=\"p015.adc1.an105\" configurationId=\"p015\"/>\n      <configSetting altId=\"p015.gpio_mode.gpio_mode_an\" configurationId=\"p015.gpio_mode\"/>\n      <configSetting altId=\"p100.ospi.om_sio0\" configurationId=\"p100\"/>\n      <configSetting altId=\"p100.gpio_speed.gpio_speed_hh\" configurationId=\"p100.gpio_drivecapacity\"/>\n      <configSetting altId=\"p100.gpio_mode.gpio_mode_peripheral\" configurationId=\"p100.gpio_mode\"/>\n      <configSetting altId=\"p101.ospi.om_sio3\" configurationId=\"p101\"/>\n      <configSetting altId=\"p101.gpio_speed.gpio_speed_hh\" configurationId=\"p101.gpio_drivecapacity\"/>\n      <configSetting altId=\"p101.gpio_mode.gpio_mode_peripheral\" configurationId=\"p101.gpio_mode\"/>\n      <configSetting altId=\"p102.ospi.om_sio4\" configurationId=\"p102\"/>\n      <configSetting altId=\"p102.gpio_speed.gpio_speed_hh\" configurationId=\"p102.gpio_drivecapacity\"/>\n      <configSetting altId=\"p102.gpio_mode.gpio_mode_peripheral\" configurationId=\"p102.gpio_mode\"/>\n      <configSetting altId=\"p103.ospi.om_sio2\" configurationId=\"p103\"/>\n      <configSetting altId=\"p103.gpio_speed.gpio_speed_hh\" configurationId=\"p103.gpio_drivecapacity\"/>\n      <configSetting altId=\"p103.gpio_mode.gpio_mode_peripheral\" configurationId=\"p103.gpio_mode\"/>\n      <configSetting altId=\"p104.ospi.om_cs1\" configurationId=\"p104\"/>\n      <configSetting altId=\"p104.gpio_speed.gpio_speed_h\" configurationId=\"p104.gpio_drivecapacity\"/>\n      <configSetting altId=\"p104.gpio_mode.gpio_mode_peripheral\" configurationId=\"p104.gpio_mode\"/>\n      <configSetting altId=\"p105.ospi.om_ecsint1\" configurationId=\"p105\"/>\n      <configSetting altId=\"p105.gpio_mode.gpio_mode_peripheral\" configurationId=\"p105.gpio_mode\"/>\n      <configSetting altId=\"p106.ospi.om_reset\" configurationId=\"p106\"/>\n      <configSetting altId=\"p106.gpio_mode.gpio_mode_peripheral\" configurationId=\"p106.gpio_mode\"/>\n      <configSetting altId=\"p107.output.low\" configurationId=\"p107\"/>\n      <configSetting altId=\"p107.gpio_mode.gpio_mode_out.low\" configurationId=\"p107.gpio_mode\"/>\n      <configSetting altId=\"p209.trace.traceswo\" configurationId=\"p209\"/>\n      <configSetting altId=\"p209.gpio_mode.gpio_mode_peripheral\" configurationId=\"p209.gpio_mode\"/>\n      <configSetting altId=\"p210.jtag_fslash_swd.swdio\" configurationId=\"p210\"/>\n      <configSetting altId=\"p210.gpio_mode.gpio_mode_peripheral\" configurationId=\"p210.gpio_mode\"/>\n      <configSetting altId=\"p211.jtag_fslash_swd.swclk\" configurationId=\"p211\"/>\n      <configSetting altId=\"p211.gpio_mode.gpio_mode_peripheral\" configurationId=\"p211.gpio_mode\"/>\n      <configSetting altId=\"p304.trace.tdata3\" configurationId=\"p304\"/>\n      <configSetting altId=\"p304.gpio_mode.gpio_mode_peripheral\" configurationId=\"p304.gpio_mode\"/>\n      <configSetting altId=\"p305.trace.tdata2\" configurationId=\"p305\"/>\n      <configSetting altId=\"p305.gpio_mode.gpio_mode_peripheral\" configurationId=\"p305.gpio_mode\"/>\n      <configSetting altId=\"p306.trace.tdata1\" configurationId=\"p306\"/>\n      <configSetting altId=\"p306.gpio_mode.gpio_mode_peripheral\" configurationId=\"p306.gpio_mode\"/>\n      <configSetting altId=\"p307.trace.tdata0\" configurationId=\"p307\"/>\n      <configSetting altId=\"p307.gpio_mode.gpio_mode_peripheral\" configurationId=\"p307.gpio_mode\"/>\n      <configSetting altId=\"p308.trace.tclk\" configurationId=\"p308\"/>\n      <configSetting altId=\"p308.gpio_mode.gpio_mode_peripheral\" configurationId=\"p308.gpio_mode\"/>\n      <configSetting altId=\"p407.usbfs.usb_vbus\" configurationId=\"p407\"/>\n      <configSetting altId=\"p407.gpio_mode.gpio_mode_peripheral\" configurationId=\"p407.gpio_mode\"/>\n      <configSetting altId=\"p408.usbhs.usbhs_vbusen\" configurationId=\"p408\"/>\n      <configSetting altId=\"p408.gpio_mode.gpio_mode_peripheral\" configurationId=\"p408.gpio_mode\"/>\n      <configSetting altId=\"p409.usbhs.usbhs_ovrcura\" configurationId=\"p409\"/>\n      <configSetting altId=\"p409.gpio_mode.gpio_mode_peripheral\" configurationId=\"p409.gpio_mode\"/>\n      <configSetting altId=\"p410.spi1.miso1\" configurationId=\"p410\"/>\n      <configSetting altId=\"p410.gpio_speed.gpio_speed_h\" configurationId=\"p410.gpio_drivecapacity\"/>\n      <configSetting altId=\"p410.gpio_mode.gpio_mode_peripheral\" configurationId=\"p410.gpio_mode\"/>\n      <configSetting altId=\"p411.spi1.mosi1\" configurationId=\"p411\"/>\n      <configSetting altId=\"p411.gpio_speed.gpio_speed_h\" configurationId=\"p411.gpio_drivecapacity\"/>\n      <configSetting altId=\"p411.gpio_mode.gpio_mode_peripheral\" configurationId=\"p411.gpio_mode\"/>\n      <configSetting altId=\"p412.spi1.rspck1\" configurationId=\"p412\"/>\n      <configSetting altId=\"p412.gpio_speed.gpio_speed_h\" configurationId=\"p412.gpio_drivecapacity\"/>\n      <configSetting altId=\"p412.gpio_mode.gpio_mode_peripheral\" configurationId=\"p412.gpio_mode\"/>\n      <configSetting altId=\"p413.spi1.sslb0\" configurationId=\"p413\"/>\n      <configSetting altId=\"p413.gpio_speed.gpio_speed_h\" configurationId=\"p413.gpio_drivecapacity\"/>\n      <configSetting altId=\"p413.gpio_mode.gpio_mode_peripheral\" configurationId=\"p413.gpio_mode\"/>\n      <configSetting altId=\"p414.output.low\" configurationId=\"p414\"/>\n      <configSetting altId=\"p414.gpio_mode.gpio_mode_out.low\" configurationId=\"p414.gpio_mode\"/>\n      <configSetting altId=\"p500.usbfs.usb_vbusen\" configurationId=\"p500\"/>\n      <configSetting altId=\"p500.gpio_mode.gpio_mode_peripheral\" configurationId=\"p500.gpio_mode\"/>\n      <configSetting altId=\"p501.usbfs.usb_ovrcura\" configurationId=\"p501\"/>\n      <configSetting altId=\"p501.gpio_mode.gpio_mode_peripheral\" configurationId=\"p501.gpio_mode\"/>\n      <configSetting altId=\"p511.iic1.sda1\" configurationId=\"p511\"/>\n      <configSetting altId=\"p511.gpio_speed.gpio_speed_m\" configurationId=\"p511.gpio_drivecapacity\"/>\n      <configSetting altId=\"p511.gpio_mode.gpio_mode_peripheral\" configurationId=\"p511.gpio_mode\"/>\n      <configSetting altId=\"p512.iic1.scl1\" configurationId=\"p512\"/>\n      <configSetting altId=\"p512.gpio_speed.gpio_speed_m\" configurationId=\"p512.gpio_drivecapacity\"/>\n      <configSetting altId=\"p512.gpio_mode.gpio_mode_peripheral\" configurationId=\"p512.gpio_mode\"/>\n      <configSetting altId=\"p600.output.low\" configurationId=\"p600\"/>\n      <configSetting altId=\"p600.gpio_mode.gpio_mode_out.low\" configurationId=\"p600.gpio_mode\"/>\n      <configSetting altId=\"p800.ospi.om_sio5\" configurationId=\"p800\"/>\n      <configSetting altId=\"p800.gpio_speed.gpio_speed_hh\" configurationId=\"p800.gpio_drivecapacity\"/>\n      <configSetting altId=\"p800.gpio_mode.gpio_mode_peripheral\" configurationId=\"p800.gpio_mode\"/>\n      <configSetting altId=\"p801.ospi.om_dqs\" configurationId=\"p801\"/>\n      <configSetting altId=\"p801.gpio_speed.gpio_speed_hh\" configurationId=\"p801.gpio_drivecapacity\"/>\n      <configSetting altId=\"p801.gpio_mode.gpio_mode_peripheral\" configurationId=\"p801.gpio_mode\"/>\n      <configSetting altId=\"p802.ospi.om_sio6\" configurationId=\"p802\"/>\n      <configSetting altId=\"p802.gpio_speed.gpio_speed_hh\" configurationId=\"p802.gpio_drivecapacity\"/>\n      <configSetting altId=\"p802.gpio_mode.gpio_mode_peripheral\" configurationId=\"p802.gpio_mode\"/>\n      <configSetting altId=\"p803.ospi.om_sio1\" configurationId=\"p803\"/>\n      <configSetting altId=\"p803.gpio_speed.gpio_speed_hh\" configurationId=\"p803.gpio_drivecapacity\"/>\n      <configSetting altId=\"p803.gpio_mode.gpio_mode_peripheral\" configurationId=\"p803.gpio_mode\"/>\n      <configSetting altId=\"p804.ospi.om_sio7\" configurationId=\"p804\"/>\n      <configSetting altId=\"p804.gpio_speed.gpio_speed_hh\" configurationId=\"p804.gpio_drivecapacity\"/>\n      <configSetting altId=\"p804.gpio_mode.gpio_mode_peripheral\" configurationId=\"p804.gpio_mode\"/>\n      <configSetting altId=\"p808.ospi.om_sclk\" configurationId=\"p808\"/>\n      <configSetting altId=\"p808.gpio_speed.gpio_speed_hh\" configurationId=\"p808.gpio_drivecapacity\"/>\n      <configSetting altId=\"p808.gpio_mode.gpio_mode_peripheral\" configurationId=\"p808.gpio_mode\"/>\n      <configSetting altId=\"p809.output.low\" configurationId=\"p809\"/>\n      <configSetting altId=\"p809.gpio_mode.gpio_mode_out.low\" configurationId=\"p809.gpio_mode\"/>\n      <configSetting altId=\"p814.usbfs.usb_dp\" configurationId=\"p814\"/>\n      <configSetting altId=\"p814.gpio_mode.gpio_mode_peripheral\" configurationId=\"p814.gpio_mode\"/>\n      <configSetting altId=\"p815.usbfs.usb_dm\" configurationId=\"p815\"/>\n      <configSetting altId=\"p815.gpio_mode.gpio_mode_peripheral\" configurationId=\"p815.gpio_mode\"/>\n      <configSetting altId=\"pa02.sci2.rxd2\" configurationId=\"pa02\"/>\n      <configSetting altId=\"pa02.gpio_speed.gpio_speed_h\" configurationId=\"pa02.gpio_drivecapacity\"/>\n      <configSetting altId=\"pa02.gpio_mode.gpio_mode_peripheral\" configurationId=\"pa02.gpio_mode\"/>\n      <configSetting altId=\"pa03.sci2.txd2\" configurationId=\"pa03\"/>\n      <configSetting altId=\"pa03.gpio_speed.gpio_speed_h\" configurationId=\"pa03.gpio_drivecapacity\"/>\n      <configSetting altId=\"pa03.gpio_mode.gpio_mode_peripheral\" configurationId=\"pa03.gpio_mode\"/>\n      <configSetting altId=\"pa04.sci2.sck2\" configurationId=\"pa04\"/>\n      <configSetting altId=\"pa04.gpio_speed.gpio_speed_h\" configurationId=\"pa04.gpio_drivecapacity\"/>\n      <configSetting altId=\"pa04.gpio_mode.gpio_mode_peripheral\" configurationId=\"pa04.gpio_mode\"/>\n      <configSetting altId=\"pa05.sci2.cts_rts2\" configurationId=\"pa05\"/>\n      <configSetting altId=\"pa05.gpio_speed.gpio_speed_h\" configurationId=\"pa05.gpio_drivecapacity\"/>\n      <configSetting altId=\"pa05.gpio_mode.gpio_mode_peripheral\" configurationId=\"pa05.gpio_mode\"/>\n      <configSetting altId=\"pa06.input\" configurationId=\"pa06\"/>\n      <configSetting altId=\"pa06.gpio_mode.gpio_mode_in\" configurationId=\"pa06.gpio_mode\"/>\n      <configSetting altId=\"pa14.sci9.txd9\" configurationId=\"pa14\"/>\n      <configSetting altId=\"pa14.gpio_speed.gpio_speed_h\" configurationId=\"pa14.gpio_drivecapacity\"/>\n      <configSetting altId=\"pa14.gpio_mode.gpio_mode_peripheral\" configurationId=\"pa14.gpio_mode\"/>\n      <configSetting altId=\"pa15.sci9.rxd9\" configurationId=\"pa15\"/>\n      <configSetting altId=\"pa15.gpio_speed.gpio_speed_h\" configurationId=\"pa15.gpio_drivecapacity\"/>\n      <configSetting altId=\"pa15.gpio_mode.gpio_mode_peripheral\" configurationId=\"pa15.gpio_mode\"/>\n      <configSetting altId=\"pb01.usbhs.usbhs_vbus\" configurationId=\"pb01\"/>\n      <configSetting altId=\"pb01.gpio_speed.gpio_speed_h\" configurationId=\"pb01.gpio_drivecapacity\"/>\n      <configSetting altId=\"pb01.gpio_mode.gpio_mode_peripheral\" configurationId=\"pb01.gpio_mode\"/>\n      <configSetting altId=\"sci0.mode.custom.free\" configurationId=\"sci0.mode\"/>\n      <configSetting altId=\"sci1.mode.custom.free\" configurationId=\"sci1.mode\"/>\n      <configSetting altId=\"sci2.cts_rts2.pa05\" configurationId=\"sci2.cts_rts2\"/>\n      <configSetting altId=\"sci2.mode.custom.free\" configurationId=\"sci2.mode\"/>\n      <configSetting altId=\"sci2.rxd2.pa02\" configurationId=\"sci2.rxd2\"/>\n      <configSetting altId=\"sci2.sck2.pa04\" configurationId=\"sci2.sck2\"/>\n      <configSetting altId=\"sci2.txd2.pa03\" configurationId=\"sci2.txd2\"/>\n      <configSetting altId=\"sci4.mode.custom.free\" configurationId=\"sci4.mode\"/>\n      <configSetting altId=\"sci9.mode.custom.free\" configurationId=\"sci9.mode\"/>\n      <configSetting altId=\"sci9.rxd9.pa15\" configurationId=\"sci9.rxd9\"/>\n      <configSetting altId=\"sci9.txd9.pa14\" configurationId=\"sci9.txd9\"/>\n      <configSetting altId=\"spi1.miso1.p410\" configurationId=\"spi1.miso1\"/>\n      <configSetting altId=\"spi1.mode.custom.free\" configurationId=\"spi1.mode\"/>\n      <configSetting altId=\"spi1.mosi1.p411\" configurationId=\"spi1.mosi1\"/>\n      <configSetting altId=\"spi1.rspck1.p412\" configurationId=\"spi1.rspck1\"/>\n      <configSetting altId=\"spi1.sslb0.p413\" configurationId=\"spi1.sslb0\"/>\n      <configSetting altId=\"system.mode.custom.free\" configurationId=\"system.mode\"/>\n      <configSetting altId=\"trace.mode.custom.free\" configurationId=\"trace.mode\"/>\n      <configSetting altId=\"trace.tclk.p308\" configurationId=\"trace.tclk\"/>\n      <configSetting altId=\"trace.tdata0.p307\" configurationId=\"trace.tdata0\"/>\n      <configSetting altId=\"trace.tdata1.p306\" configurationId=\"trace.tdata1\"/>\n      <configSetting altId=\"trace.tdata2.p305\" configurationId=\"trace.tdata2\"/>\n      <configSetting altId=\"trace.tdata3.p304\" configurationId=\"trace.tdata3\"/>\n      <configSetting altId=\"trace.traceswo.p209\" configurationId=\"trace.traceswo\"/>\n      <configSetting altId=\"usbfs.mode.custom.free\" configurationId=\"usbfs.mode\"/>\n      <configSetting altId=\"usbfs.usb_dm.p815\" configurationId=\"usbfs.usb_dm\"/>\n      <configSetting altId=\"usbfs.usb_dp.p814\" configurationId=\"usbfs.usb_dp\"/>\n      <configSetting altId=\"usbfs.usb_ovrcura.p501\" configurationId=\"usbfs.usb_ovrcura\"/>\n      <configSetting altId=\"usbfs.usb_vbus.p407\" configurationId=\"usbfs.usb_vbus\"/>\n      <configSetting altId=\"usbfs.usb_vbusen.p500\" configurationId=\"usbfs.usb_vbusen\"/>\n      <configSetting altId=\"usbhs.mode.custom.free\" configurationId=\"usbhs.mode\"/>\n      <configSetting altId=\"usbhs.usbhs_ovrcura.p409\" configurationId=\"usbhs.usbhs_ovrcura\"/>\n      <configSetting altId=\"usbhs.usbhs_vbus.pb01\" configurationId=\"usbhs.usbhs_vbus\"/>\n      <configSetting altId=\"usbhs.usbhs_vbusen.p408\" configurationId=\"usbhs.usbhs_vbusen\"/>\n    </pincfg>\n    <pincfg active=\"false\" name=\"R7FA8M1AHECBD.pincfg\" selected=\"false\" symbol=\"\">\n      <configSetting altId=\"jtag_fslash_swd.mode.jtag.free\" configurationId=\"jtag_fslash_swd.mode\"/>\n      <configSetting altId=\"jtag_fslash_swd.tck.p211\" configurationId=\"jtag_fslash_swd.tck\"/>\n      <configSetting altId=\"jtag_fslash_swd.tdi.p208\" configurationId=\"jtag_fslash_swd.tdi\"/>\n      <configSetting altId=\"jtag_fslash_swd.tdo.p209\" configurationId=\"jtag_fslash_swd.tdo\"/>\n      <configSetting altId=\"jtag_fslash_swd.tms.p210\" configurationId=\"jtag_fslash_swd.tms\"/>\n      <configSetting altId=\"p208.jtag_fslash_swd.tdi\" configurationId=\"p208\"/>\n      <configSetting altId=\"p208.gpio_mode.gpio_mode_peripheral\" configurationId=\"p208.gpio_mode\"/>\n      <configSetting altId=\"p209.jtag_fslash_swd.tdo\" configurationId=\"p209\"/>\n      <configSetting altId=\"p209.gpio_mode.gpio_mode_peripheral\" configurationId=\"p209.gpio_mode\"/>\n      <configSetting altId=\"p210.jtag_fslash_swd.tms\" configurationId=\"p210\"/>\n      <configSetting altId=\"p210.gpio_mode.gpio_mode_peripheral\" configurationId=\"p210.gpio_mode\"/>\n      <configSetting altId=\"p211.jtag_fslash_swd.tck\" configurationId=\"p211\"/>\n      <configSetting altId=\"p211.gpio_mode.gpio_mode_peripheral\" configurationId=\"p211.gpio_mode\"/>\n    </pincfg>\n  </raPinConfiguration>\n</raConfiguration>\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/board.cmake",
    "content": "set(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(MCU_VARIANT ra4m1)\nset(JLINK_DEVICE R7FA4M1AB)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Arduino UNO R4\n   url: https://store-usa.arduino.cc/pages/uno-r4\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_STATE_ON         1\n#define BUTTON_STATE_ACTIVE  0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/board.mk",
    "content": "CPU_CORE = cortex-m4\nMCU_VARIANT = ra4m1\n\n# For flash-jlink target\nJLINK_DEVICE = R7FA4M1AB\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_cfg/fsp_cfg/bsp/bsp_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CFG_H_\n#define BSP_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_clock_cfg.h\"\n            #include \"bsp_mcu_family_cfg.h\"\n            #include \"board_cfg.h\"\n            #define RA_NOT_DEFINED 0\n            #ifndef BSP_CFG_RTOS\n             #if (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (2)\n             #elif (RA_NOT_DEFINED) != (RA_NOT_DEFINED)\n              #define BSP_CFG_RTOS (1)\n             #else\n              #define BSP_CFG_RTOS (0)\n             #endif\n            #endif\n            #ifndef BSP_CFG_RTC_USED\n             #define BSP_CFG_RTC_USED (RA_NOT_DEFINED)\n            #endif\n            #undef RA_NOT_DEFINED\n            #if defined(_RA_BOOT_IMAGE)\n             #define BSP_CFG_BOOT_IMAGE (1)\n            #endif\n            #define BSP_CFG_MCU_VCC_MV (3300)\n            #define BSP_CFG_STACK_MAIN_BYTES (0x800)\n            #define BSP_CFG_HEAP_BYTES (0x1000)\n            #define BSP_CFG_PARAM_CHECKING_ENABLE (0)\n            #define BSP_CFG_ASSERT (0)\n            #define BSP_CFG_ERROR_LOG (0)\n\n            #define BSP_CFG_PFS_PROTECT ((1))\n\n            #define BSP_CFG_C_RUNTIME_INIT ((1))\n            #define BSP_CFG_EARLY_INIT     ((0))\n\n            #define BSP_CFG_STARTUP_CLOCK_REG_NOT_RESET ((0))\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_POPULATED\n            #define BSP_CLOCK_CFG_MAIN_OSC_POPULATED (0)\n            #endif\n\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE\n            #define BSP_CLOCK_CFG_MAIN_OSC_CLOCK_SOURCE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_DRIVE\n            #define BSP_CLOCK_CFG_SUBCLOCK_DRIVE (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_POPULATED\n            #define BSP_CLOCK_CFG_SUBCLOCK_POPULATED (0)\n            #endif\n            #ifndef BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS\n            #define BSP_CLOCK_CFG_SUBCLOCK_STABILIZATION_MS 1000\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_CFG_H_\n#define BSP_MCU_DEVICE_CFG_H_\n#define BSP_CFG_MCU_PART_SERIES (4)\n#endif /* BSP_MCU_DEVICE_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_cfg/fsp_cfg/bsp/bsp_mcu_device_pn_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_DEVICE_PN_CFG_H_\n#define BSP_MCU_R7FA4M1AB3CNE\n      #define BSP_MCU_FEATURE_SET ('A')\n      #define BSP_ROM_SIZE_BYTES (262144)\n      #define BSP_RAM_SIZE_BYTES (32768)\n      #define BSP_DATA_FLASH_SIZE_BYTES (8192)\n      #define BSP_PACKAGE_QFN\n      #define BSP_PACKAGE_PINS (48)\n#endif /* BSP_MCU_DEVICE_PN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_cfg/fsp_cfg/bsp/bsp_mcu_family_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_MCU_FAMILY_CFG_H_\n#define BSP_MCU_FAMILY_CFG_H_\n#ifdef __cplusplus\n            extern \"C\" {\n            #endif\n\n            #include \"bsp_mcu_device_pn_cfg.h\"\n            #include \"bsp_mcu_device_cfg.h\"\n            #include \"../../../ra/fsp/src/bsp/mcu/ra4m1/bsp_mcu_info.h\"\n            #include \"bsp_clock_cfg.h\"\n            #define BSP_MCU_GROUP_RA4M1 (1)\n            #define BSP_LOCO_HZ                 (32768)\n            #define BSP_MOCO_HZ                 (8000000)\n            #define BSP_SUB_CLOCK_HZ            (32768)\n            #if   BSP_CFG_HOCO_FREQUENCY == 0\n                #define BSP_HOCO_HZ             (24000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 2\n                #define BSP_HOCO_HZ             (32000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 4\n                #define BSP_HOCO_HZ             (48000000)\n            #elif BSP_CFG_HOCO_FREQUENCY == 5\n                #define BSP_HOCO_HZ             (64000000)\n            #else\n                #error \"Invalid HOCO frequency chosen (BSP_CFG_HOCO_FREQUENCY) in bsp_clock_cfg.h\"\n            #endif\n            #define BSP_CORTEX_VECTOR_TABLE_ENTRIES    (16U)\n            #define BSP_VECTOR_TABLE_MAX_ENTRIES       (48U)\n            #define BSP_CFG_INLINE_IRQ_FUNCTIONS       (1)\n\n            #define OFS_SEQ1 0xA001A001 | (1 << 1) | (3 << 2)\n            #define OFS_SEQ2 (15 << 4) | (3 << 8) | (3 << 10)\n            #define OFS_SEQ3 (1 << 12) | (1 << 14) | (1 << 17)\n            #define OFS_SEQ4 (3 << 18) |(15 << 20) | (3 << 24) | (3 << 26)\n            #define OFS_SEQ5 (1 << 28) | (1 << 30)\n            #define BSP_CFG_ROM_REG_OFS0 (OFS_SEQ1 | OFS_SEQ2 | OFS_SEQ3 | OFS_SEQ4 | OFS_SEQ5)\n            #define BSP_CFG_ROM_REG_OFS1 (0xFFFFFEC3 | (1 << 2) | (3 << 3) | (0 << 8))\n            #define BSP_CFG_USE_LOW_VOLTAGE_MODE ((0))\n            #define BSP_CFG_ROM_REG_MPU_PC0_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_PC0_START (0x00FFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_PC0_END (0x00FFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_PC1_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_PC1_START (0x00FFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_PC1_END (0x00FFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_START (0x00FFFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION0_END (0x00FFFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_START (0x200FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION1_END (0x200FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_START (0x407FFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION2_END (0x407FFFFF)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_ENABLE (1)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_START (0x400DFFFC)\n            #define BSP_CFG_ROM_REG_MPU_REGION3_END (0x400DFFFF)\n            #ifndef BSP_CLOCK_CFG_MAIN_OSC_WAIT\n            #define BSP_CLOCK_CFG_MAIN_OSC_WAIT (9)\n            #endif\n            /* Used to create IELS values for the interrupt initialization table g_interrupt_event_link_select. */\n            #define BSP_PRV_IELS_ENUM(vector)    (ELC_ ## vector)\n\n            /*\n            ID Code\n            Note: To permanently lock and disable the debug interface define the BSP_ID_CODE_PERMANENTLY_LOCKED in the compiler settings.\n            WARNING: This will disable debug access to the part and cannot be reversed by a debug probe.\n            */\n            #if defined(BSP_ID_CODE_PERMANENTLY_LOCKED)\n            #define BSP_CFG_ID_CODE_LONG_1 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_2 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_3 (0x00000000)\n            #define BSP_CFG_ID_CODE_LONG_4 (0x00000000)\n            #else\n            /* ID CODE: FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF */\n            #define BSP_CFG_ID_CODE_LONG_1 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_2 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_3 (0xFFFFFFFF)\n            #define BSP_CFG_ID_CODE_LONG_4 (0xffFFFFFF)\n            #endif\n\n            #ifdef __cplusplus\n            }\n            #endif\n#endif /* BSP_MCU_FAMILY_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_cfg/fsp_cfg/bsp/bsp_pin_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_PIN_CFG_H_\n#define BSP_PIN_CFG_H_\n#include \"r_ioport.h\"\n\n/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */\nFSP_HEADER\n\n#define SW1 (BSP_IO_PORT_01_PIN_10) /* active low */\n#define LED1 (BSP_IO_PORT_01_PIN_11) /* active high */\nextern const ioport_cfg_t g_bsp_pin_cfg; /* R7FA4M1AB3CNE.pincfg */\n\nvoid BSP_PinConfigSecurityInit();\n\n/* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */\nFSP_FOOTER\n#endif /* BSP_PIN_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_cfg/fsp_cfg/r_ioport_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef R_IOPORT_CFG_H_\n#define R_IOPORT_CFG_H_\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define IOPORT_CFG_PARAM_CHECKING_ENABLE (BSP_CFG_PARAM_CHECKING_ENABLE)\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* R_IOPORT_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_gen/bsp_clock_cfg.h",
    "content": "/* generated configuration header file - do not edit */\n#ifndef BSP_CLOCK_CFG_H_\n#define BSP_CLOCK_CFG_H_\n#define BSP_CFG_CLOCKS_SECURE (0)\n#define BSP_CFG_CLOCKS_OVERRIDE (0)\n#define BSP_CFG_XTAL_HZ (0) /* XTAL 0Hz */\n#define BSP_CFG_PLL_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* PLL Src: Disabled */\n#define BSP_CFG_HOCO_FREQUENCY (4) /* HOCO 48MHz */\n#define BSP_CFG_PLL_DIV (BSP_CLOCKS_PLL_DIV_4) /* PLL Div /4 */\n#define BSP_CFG_PLL_MUL BSP_CLOCKS_PLL_MUL(12U,0U) /* PLL Mul x12 */\n#define BSP_CFG_CLOCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_HOCO) /* Clock Src: HOCO */\n#define BSP_CFG_ICLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* ICLK Div /1 */\n#define BSP_CFG_PCLKA_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* PCLKA Div /1 */\n#define BSP_CFG_PCLKB_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* PCLKB Div /2 */\n#define BSP_CFG_PCLKC_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* PCLKC Div /1 */\n#define BSP_CFG_PCLKD_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* PCLKD Div /1 */\n#define BSP_CFG_FCLK_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_2) /* FCLK Div /2 */\n#define BSP_CFG_CLKOUT_SOURCE (BSP_CLOCKS_CLOCK_DISABLED) /* CLKOUT Disabled */\n#define BSP_CFG_CLKOUT_DIV (BSP_CLOCKS_SYS_CLOCK_DIV_1) /* CLKOUT Div /1 */\n#define BSP_CFG_UCK_SOURCE (BSP_CLOCKS_SOURCE_CLOCK_HOCO) /* UCLK Src: HOCO */\n#endif /* BSP_CLOCK_CFG_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_gen/common_data.c",
    "content": "/* generated common source file - do not edit */\n#include \"common_data.h\"\nioport_instance_ctrl_t g_ioport_ctrl;\nconst ioport_instance_t g_ioport =\n        {\n            .p_api = &g_ioport_on_ioport,\n            .p_ctrl = &g_ioport_ctrl,\n            .p_cfg = &g_bsp_pin_cfg,\n        };\nvoid g_common_init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_gen/common_data.h",
    "content": "/* generated common header file - do not edit */\n#ifndef COMMON_DATA_H_\n#define COMMON_DATA_H_\n#include <stdint.h>\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n#include \"bsp_pin_cfg.h\"\nFSP_HEADER\n#define IOPORT_CFG_NAME g_bsp_pin_cfg\n#define IOPORT_CFG_OPEN R_IOPORT_Open\n#define IOPORT_CFG_CTRL g_ioport_ctrl\n\n/* IOPORT Instance */\nextern const ioport_instance_t g_ioport;\n\n/* IOPORT control structure. */\nextern ioport_instance_ctrl_t g_ioport_ctrl;\nvoid g_common_init(void);\nFSP_FOOTER\n#endif /* COMMON_DATA_H_ */\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/ra_gen/pin_data.c",
    "content": "/* generated pin source file - do not edit */\n#include \"bsp_api.h\"\n#include \"r_ioport.h\"\n\n\nconst ioport_pin_cfg_t g_bsp_pin_cfg_data[] = {\n    {\n        .pin = BSP_IO_PORT_01_PIN_08,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_10,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_INPUT | (uint32_t) IOPORT_CFG_PULLUP_ENABLE)\n    },\n    {\n        .pin = BSP_IO_PORT_01_PIN_11,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PORT_DIRECTION_OUTPUT | (uint32_t) IOPORT_CFG_PORT_OUTPUT_LOW)\n    },\n    {\n        .pin = BSP_IO_PORT_03_PIN_00,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_DEBUG)\n    },\n    {\n        .pin = BSP_IO_PORT_04_PIN_07,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_09_PIN_14,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n    {\n        .pin = BSP_IO_PORT_09_PIN_15,\n        .pin_cfg = ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_USB_FS)\n    },\n};\n\nconst ioport_cfg_t g_bsp_pin_cfg = {\n    .number_of_pins = sizeof(g_bsp_pin_cfg_data)/sizeof(ioport_pin_cfg_t),\n    .p_pin_cfg_data = &g_bsp_pin_cfg_data[0],\n};\n\n#if BSP_TZ_SECURE_BUILD\n\nvoid R_BSP_PinCfgSecurityInit(void);\n\n/* Initialize SAR registers for secure pins. */\nvoid R_BSP_PinCfgSecurityInit(void)\n{\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n    uint32_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #else\n    uint16_t pmsar[BSP_FEATURE_BSP_NUM_PMSAR];\n #endif\n    memset(pmsar, 0xFF, BSP_FEATURE_BSP_NUM_PMSAR * sizeof(R_PMISC->PMSAR[0]));\n\n\n    for(uint32_t i = 0; i < g_bsp_pin_cfg.number_of_pins; i++)\n    {\n        uint32_t port_pin = g_bsp_pin_cfg.p_pin_cfg_data[i].pin;\n        uint32_t port = port_pin >> 8U;\n        uint32_t pin = port_pin & 0xFFU;\n        pmsar[port] &= (uint16_t) ~(1U << pin);\n    }\n\n    for(uint32_t i = 0; i < BSP_FEATURE_BSP_NUM_PMSAR; i++)\n    {\n #if (2U == BSP_FEATURE_IOPORT_VERSION)\n        R_PMISC->PMSAR[i].PMSAR = (uint16_t) pmsar[i];\n #else\n        R_PMISC->PMSAR[i].PMSAR = pmsar[i];\n #endif\n    }\n\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/script/fsp.ld",
    "content": "/*\n                  Linker File for Renesas FSP\n*/\n\nINCLUDE memory_regions.ld\n\n/* Uncomment and set XIP_SECONDARY_SLOT_IMAGE to 1 below for the secondary XIP application image.*/\n/*\n XIP_SECONDARY_SLOT_IMAGE = 1;\n*/\n\nQSPI_FLASH_PRV_LENGTH = DEFINED(QSPI_FLASH_SIZE) ? ABSOLUTE(QSPI_FLASH_SIZE) : ABSOLUTE(QSPI_FLASH_LENGTH);\nOSPI_DEVICE_0_PRV_LENGTH = DEFINED(OSPI_DEVICE_0_SIZE) ? ABSOLUTE(OSPI_DEVICE_0_SIZE) : ABSOLUTE(OSPI_DEVICE_0_LENGTH);\nOSPI_DEVICE_1_PRV_LENGTH = DEFINED(OSPI_DEVICE_1_SIZE) ? ABSOLUTE(OSPI_DEVICE_1_SIZE) : ABSOLUTE(OSPI_DEVICE_1_LENGTH);\n\n/* If a flat (secure) project has DEFINED RAM_NS_BUFFER_LENGTH, then emit IDAU symbols to allocate non-secure RAM. */\n__RESERVE_NS_RAM = !DEFINED(PROJECT_NONSECURE) && DEFINED(RAM_NS_BUFFER_LENGTH) && (OPTION_SETTING_S_LENGTH != 0);\n\nITCM_START = DEFINED(ITCM_START)? ITCM_START : 0;\nITCM_LENGTH = DEFINED(ITCM_LENGTH)? ITCM_LENGTH : 0;\nDTCM_START = DEFINED(DTCM_START)? DTCM_START : 0;\nDTCM_LENGTH = DEFINED(DTCM_LENGTH)? DTCM_LENGTH : 0;\nRAM_NS_BUFFER_BLOCK_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? ALIGN(RAM_NS_BUFFER_LENGTH, 8192) : 0;\nRAM_NS_BUFFER_LENGTH = DEFINED(RAM_NS_BUFFER_LENGTH) ? RAM_NS_BUFFER_LENGTH : 0;\nRAM_NS_BUFFER_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_LENGTH;\nRAM_NS_BUFFER_BLOCK_START = RAM_START + RAM_LENGTH - RAM_NS_BUFFER_BLOCK_LENGTH;\n\nOPTION_SETTING_START_NS = DEFINED(PROJECT_NONSECURE) ? OPTION_SETTING_START : OPTION_SETTING_START + 0x80;\n\n/* This definition is used to avoid moving the counter in OPTION_SETTING regions for projects that should not configure option settings.\n * Bootloader images do not configure option settings because they are owned by the bootloader.\n * FSP_BOOTABLE_IMAGE is only defined in bootloader images. */\n__bl_FSP_BOOTABLE_IMAGE = 1;\n__bln_FSP_BOOTABLE_IMAGE = 1;\nPROJECT_SECURE_OR_FLAT = (!DEFINED(PROJECT_NONSECURE) || DEFINED(PROJECT_SECURE)) && OPTION_SETTING_LENGTH && !DEFINED(FSP_BOOTABLE_IMAGE);\nUSE_OPTION_SETTING_NS = DEFINED(PROJECT_NONSECURE) && !DEFINED(FSP_BOOTABLE_IMAGE);\n\n__bl_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_APPLICATION_IMAGE_NUMBER == 1 ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         (DEFINED(BOOTLOADER_SECONDARY_USE_QSPI) || DEFINED(BOOTLOADER_SECONDARY_USE_OSPI_B)) ? FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_BOOTLOADER_SCRATCH_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                          FLASH_APPLICATION_S_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_FLASH_IMAGE_END    = __bl_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                         FLASH_START + FLASH_BOOTLOADER_LENGTH + FLASH_APPLICATION_S_LENGTH + FLASH_BOOTLOADER_HEADER_LENGTH;\n__bl_XIP_SECONDARY_FLASH_IMAGE_END = __bl_XIP_SECONDARY_FLASH_IMAGE_START + __bl_FLASH_IMAGE_LENGTH;\n__bl_FLASH_NS_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_START - FLASH_BOOTLOADER_HEADER_LENGTH + FLASH_APPLICATION_S_LENGTH;\n__bl_FLASH_NSC_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                        FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                        __bl_FLASH_IMAGE_END - FLASH_APPLICATION_NSC_LENGTH;\n__bl_RAM_NS_START    = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       RAM_START + RAM_LENGTH - RAM_APPLICATION_NS_LENGTH;\n__bl_RAM_NSC_START   = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                       FLASH_APPLICATION_NS_LENGTH == 0 ? RAM_START + RAM_LENGTH :\n                       __bl_RAM_NS_START - RAM_APPLICATION_NSC_LENGTH;\n__bl_FLASH_NS_IMAGE_START = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                            FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                            __bl_FLASH_NS_START + FLASH_BOOTLOADER_HEADER_LENGTH_2;\n__bln_FLASH_IMAGE_START = __bl_FLASH_NS_IMAGE_START | (!DEFINED (NS_OFFSET_START) ? 0 : NS_OFFSET_START);\n__bln_FLASH_IMAGE_LENGTH = !DEFINED(FLASH_BOOTLOADER_LENGTH) ? 0 :\n                           FLASH_APPLICATION_NS_LENGTH == 0 ? __bl_FLASH_IMAGE_END :\n                           FLASH_APPLICATION_NS_LENGTH - FLASH_BOOTLOADER_HEADER_LENGTH_2;\n\nXIP_SECONDARY_SLOT_IMAGE = DEFINED(XIP_SECONDARY_SLOT_IMAGE) ? XIP_SECONDARY_SLOT_IMAGE : 0;\nFLASH_ORIGIN = !DEFINED(FLASH_IMAGE_START) ? FLASH_START :\n                XIP_SECONDARY_SLOT_IMAGE == 1 ? XIP_SECONDARY_FLASH_IMAGE_START :\n                FLASH_IMAGE_START;\nLIMITED_FLASH_LENGTH = DEFINED(FLASH_IMAGE_LENGTH) ? FLASH_IMAGE_LENGTH :\n                       DEFINED(FLASH_BOOTLOADER_LENGTH) ? FLASH_BOOTLOADER_LENGTH :\n                       FLASH_LENGTH;\nOPTION_SETTING_SAS_SIZE = 0x34;\nOPTION_SETTING_SAS_LENGTH = !DEFINED(OPTION_SETTING_LENGTH) ? 0 :\n                            OPTION_SETTING_LENGTH == 0 ? 0 :\n                            OPTION_SETTING_LENGTH - OPTION_SETTING_SAS_SIZE;\n\n/* Define memory regions. */\nMEMORY\n{\n  ITCM (rx)                       : ORIGIN = ITCM_START, LENGTH = ITCM_LENGTH\n  DTCM (rwx)                      : ORIGIN = DTCM_START, LENGTH = DTCM_LENGTH\n  FLASH (rx)                      : ORIGIN = FLASH_ORIGIN, LENGTH = LIMITED_FLASH_LENGTH\n  RAM (rwx)                       : ORIGIN = RAM_START, LENGTH = RAM_LENGTH\n  DATA_FLASH (rx)                 : ORIGIN = DATA_FLASH_START, LENGTH = DATA_FLASH_LENGTH\n  QSPI_FLASH (rx)                 : ORIGIN = QSPI_FLASH_START, LENGTH = QSPI_FLASH_PRV_LENGTH\n  OSPI_DEVICE_0 (rx)              : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1 (rx)              : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  OSPI_DEVICE_0_RAM (rwx)         : ORIGIN = OSPI_DEVICE_0_START, LENGTH = OSPI_DEVICE_0_PRV_LENGTH\n  OSPI_DEVICE_1_RAM (rwx)         : ORIGIN = OSPI_DEVICE_1_START, LENGTH = OSPI_DEVICE_1_PRV_LENGTH\n  SDRAM (rwx)                     : ORIGIN = SDRAM_START, LENGTH = SDRAM_LENGTH\n  OPTION_SETTING (r)              : ORIGIN = OPTION_SETTING_START, LENGTH = OPTION_SETTING_LENGTH\n  OPTION_SETTING_OFS (r)          : ORIGIN = OPTION_SETTING_START, LENGTH = 0x18\n  OPTION_SETTING_SAS (r)          : ORIGIN = OPTION_SETTING_START + OPTION_SETTING_SAS_SIZE, LENGTH = OPTION_SETTING_SAS_LENGTH\n  OPTION_SETTING_S (r)            : ORIGIN = OPTION_SETTING_S_START, LENGTH = OPTION_SETTING_S_LENGTH\n  ID_CODE (rx)                    : ORIGIN = ID_CODE_START, LENGTH = ID_CODE_LENGTH\n}\n\n/* Library configurations */\nGROUP(libgcc.a libc.a libm.a)\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be DEFINED in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __copy_table_start__\n *   __copy_table_end__\n *   __zero_table_start__\n *   __zero_table_end__\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __Vectors_End\n *   __Vectors_Size\n *   __qspi_flash_start__\n *   __qspi_flash_end__\n *   __qspi_flash_code_size__\n *   __qspi_region_max_size__\n *   __qspi_region_start_address__\n *   __qspi_region_end_address__\n *   __ospi_device_0_start__\n *   __ospi_device_0_end__\n *   __ospi_device_0_code_size__\n *   __ospi_device_0_region_max_size__\n *   __ospi_device_0_region_start_address__\n *   __ospi_device_0_region_end_address__\n *   __ospi_device_1_start__\n *   __ospi_device_1_end__\n *   __ospi_device_1_code_size__\n *   __ospi_device_1_region_max_size__\n *   __ospi_device_1_region_start_address__\n *   __ospi_device_1_region_end_address__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .text :\n    {\n        __tz_FLASH_S = ABSOLUTE(FLASH_START);\n        __ROM_Start = .;\n\n        /* Even though the vector table is not 256 entries (1KB) long, we still allocate that much\n         * space because ROM registers are at address 0x400 and there is very little space\n         * in between. */\n        KEEP(*(.fixed_vectors*))\n        KEEP(*(.application_vectors*))\n        __Vectors_End = .;\n\n        /* Some devices have a gap of code flash between the vector table and ROM Registers.\n         * The flash gap section allows applications to place code and data in this section. */\n        *(.flash_gap*)\n\n        /* ROM Registers start at address 0x00000400 for devices that do not have the OPTION_SETTING region. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x400;\n        KEEP(*(.rom_registers*))\n\n        /* Reserving 0x100 bytes of space for ROM registers. */\n        . = OPTION_SETTING_LENGTH > 0 ? . : __ROM_Start + 0x500;\n\n        /* Allocate flash write-boundary-aligned\n         * space for sce9 wrapped public keys for mcuboot if the module is used.\n         */\n        KEEP(*(.mcuboot_sce9_key*))\n\n        *(.text*)\n\n        KEEP(*(.version))\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n        __usb_dev_descriptor_start_fs = .;\n        KEEP(*(.usb_device_desc_fs*))\n        __usb_cfg_descriptor_start_fs = .;\n        KEEP(*(.usb_config_desc_fs*))\n        __usb_interface_descriptor_start_fs = .;\n        KEEP(*(.usb_interface_desc_fs*))\n        __usb_descriptor_end_fs = .;\n        __usb_dev_descriptor_start_hs = .;\n        KEEP(*(.usb_device_desc_hs*))\n        __usb_cfg_descriptor_start_hs = .;\n        KEEP(*(.usb_config_desc_hs*))\n        __usb_interface_descriptor_start_hs = .;\n        KEEP(*(.usb_interface_desc_hs*))\n        __usb_descriptor_end_hs = .;\n\n        KEEP(*(.eh_frame*))\n\n        __ROM_End = .;\n    } > FLASH = 0xFF\n\n    __Vectors_Size = __Vectors_End - __Vectors;\n\n    . = .;\n    __itcm_data_pre_location = .;\n\n    /* Initialized ITCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .itcm_data : ALIGN(16)\n    {\n        /* Start of ITCM Secure Trustzone region. */\n        __tz_ITCM_S = ABSOLUTE(ITCM_START);\n\n        /* All ITCM data start */\n        __itcm_data_start = .;\n\n        KEEP(*(.itcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* All ITCM data end */\n        __itcm_data_end = .;\n\n        /*\n         * Start of the ITCM Non-Secure Trustzone region.\n         * ITCM_NS_START can be used to set a fixed address for non-secure ITCM in secure projects or flat projects.\n         */\n        __tz_ITCM_N = DEFINED(ITCM_NS_START) ? ABSOLUTE(ITCM_NS_START) : ALIGN(__itcm_data_end, 8192);\n    } > ITCM AT > FLASH = 0x00\n\n    /* Addresses exported for ITCM initialization. */\n    __itcm_data_init_start = LOADADDR(.itcm_data);\n    __itcm_data_init_end = LOADADDR(.itcm_data) + SIZEOF(.itcm_data);\n\n    ASSERT(ORIGIN(ITCM) % 8 == 0, \"ITCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(ITCM) % 8 == 0, \"ITCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.itcm_data) % 16 == 0, \".itcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.itcm_data) % 8 == 0, \".itcm_data section size must be a multiple of 8 bytes.\")\n\n    /* Restore location counter. */\n    /* If ITCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If ITCM is present, this will be the absolute address that follows the ITCM ROM location. */\n    . = (SIZEOF(.itcm_data) > 0) ? __itcm_data_init_end : __itcm_data_pre_location;\n\n    __exidx_start = .;\n    /DISCARD/ :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    }\n    __exidx_end = .;\n\n    /* To copy multiple ROM to RAM sections,\n     * uncomment .copy.table section and,\n     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .copy.table :\n    {\n        . = ALIGN(4);\n        __copy_table_start__ = .;\n        LONG (__etext)\n        LONG (__data_start__)\n        LONG (__data_end__ - __data_start__)\n        LONG (__etext2)\n        LONG (__data2_start__)\n        LONG (__data2_end__ - __data2_start__)\n        __copy_table_end__ = .;\n    } > FLASH\n    */\n\n    /* To clear multiple BSS sections,\n     * uncomment .zero.table section and,\n     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */\n    /*\n    .zero.table :\n    {\n        . = ALIGN(4);\n        __zero_table_start__ = .;\n        LONG (__bss_start__)\n        LONG (__bss_end__ - __bss_start__)\n        LONG (__bss2_start__)\n        LONG (__bss2_end__ - __bss2_start__)\n        __zero_table_end__ = .;\n    } > FLASH\n    */\n\n    __etext = .;\n\n    __tz_RAM_S = ORIGIN(RAM);\n\n    /* If DTC is used, put the DTC vector table at the start of SRAM.\n       This avoids memory holes due to 1K alignment required by it. */\n    .fsp_dtc_vector_table (NOLOAD) :\n    {\n        . = ORIGIN(RAM);\n        *(.fsp_dtc_vector_table)\n    } > RAM\n\n    /* Initialized data section. */\n    .data :\n    {\n        __data_start__ = .;\n        . = ALIGN(4);\n\n        __Code_In_RAM_Start = .;\n\n        KEEP(*(.code_in_ram*))\n        __Code_In_RAM_End = .;\n\n        *(vtable)\n        /* Don't use *(.data*) because it will place data meant for .data_flash in this section. */\n        *(.data.*)\n        *(.data)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        KEEP(*(.preinit_array))\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        KEEP(*(SORT(.init_array.*)))\n        KEEP(*(.init_array))\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        KEEP(*(SORT(.fini_array.*)))\n        KEEP(*(.fini_array))\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        KEEP(*(.jcr*))\n\n        . = ALIGN(4);\n\n        /* All data end */\n        __data_end__ = .;\n\n    } > RAM AT > FLASH\n\n    . = .;\n    __dtcm_data_pre_location = LOADADDR(.data) + SIZEOF(.data);\n\n    /* Initialized DTCM data. */\n    /* Aligned to FCACHE2 for RA8. */\n    .dtcm_data : ALIGN(16)\n    {\n        /* Start of DTCM Secure Trustzone region. */\n        __tz_DTCM_S = ABSOLUTE(DTCM_START);\n\n        /* Initialized DTCM data start */\n        __dtcm_data_start = .;\n\n        KEEP(*(.dtcm_data*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. Fill zero. */\n        . = ALIGN(8);\n\n        /* Initialized DTCM data end */\n        __dtcm_data_end = .;\n    } > DTCM AT > FLASH = 0x00\n\n    . = __dtcm_data_end;\n    /* Uninitialized DTCM data. */\n    /* ALIGN appears on the left side of the colon because it is being used to assign the VMA directly, as opposed to a right side appearance which would control the LMA. */\n    .dtcm_bss ALIGN(8) (NOLOAD) :\n    {\n        /* Uninitialized DTCM data start */\n        __dtcm_bss_start = .;\n\n        KEEP(*(.dtcm_bss*))\n\n        /* Pad to eight byte alignment in case of ECC initialization. No fill because of NOLOAD. */\n        . = ALIGN(8);\n\n        /* Uninitialized DTCM data end */\n        __dtcm_bss_end = .;\n\n        /*\n         * Start of the DTCM Non-Secure Trustzone region.\n         * DTCM_NS_START can be used to set a fixed address for non-secure DTCM in secure projects or flat projects.\n         */\n        __tz_DTCM_N = DEFINED(DTCM_NS_START) ? ABSOLUTE(DTCM_NS_START) : ALIGN(__dtcm_bss_end, 8192);\n    } > DTCM\n\n    /* Addresses exported for DTCM initialization. */\n    __dtcm_data_init_start = LOADADDR(.dtcm_data);\n    __dtcm_data_init_end = LOADADDR(.dtcm_data) + SIZEOF(.dtcm_data);\n\n    ASSERT(ORIGIN(DTCM) % 8 == 0, \"DTCM memory region origin must be aligned to 8 bytes.\")\n    ASSERT(LENGTH(DTCM) % 8 == 0, \"DTCM memory region length must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) == ADDR(.dtcm_bss), \".dtcm_bss has (VMA != LMA) but should be NOLOAD (VMA == LMA).\")\n    ASSERT(LOADADDR(.dtcm_data) % 16 == 0, \".dtcm_data section must be aligned to 16 bytes.\")\n    ASSERT(SIZEOF(.dtcm_data) % 8 == 0, \".dtcm_data section size must be a multiple of 8 bytes.\")\n    ASSERT(LOADADDR(.dtcm_bss) % 8 == 0, \".dtcm_bss section must be aligned to 8 bytes.\")\n    ASSERT(SIZEOF(.dtcm_bss) % 8 == 0, \".dtcm_bss section size must be a multiple of 8 bytes.\")\n    ASSERT(__dtcm_bss_start == __dtcm_data_end, \".dtcm_bss section is not adjacent to .dtcm_data section.\")\n\n    /* Restore location counter. */\n    /* If DTCM is not present, this will be the address stored in '.' before ALIGN was attempted. */\n    /* If DTCM is present, this will be the absolute address that follows the DTCM ROM location. */\n    . = (SIZEOF(.dtcm_data) > 0) ? __dtcm_data_init_end : __dtcm_data_pre_location;\n\n    /* TrustZone Secure Gateway Stubs Section */\n\n    /* Store location counter for SPI non-retentive sections. */\n    sgstubs_pre_location = .;\n\n    /* Determine the secure gateway stubs address either by the provided linker variable or the next 1024-byte block. */\n    SGSTUBS_LOC = (DEFINED(PROJECT_SECURE) && DEFINED(FLASH_NSC_START)) ? ABSOLUTE(FLASH_NSC_START) : ALIGN(1024);\n    .gnu.sgstubs SGSTUBS_LOC : ALIGN(1024)\n    {\n        __tz_FLASH_C = DEFINED(FLASH_NSC_START) ? ABSOLUTE(FLASH_NSC_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : ALIGN(1024);\n        _start_sg = .;\n        *(.gnu.sgstubs*)\n        . = ALIGN(32);\n        _end_sg = .;\n    } > FLASH\n\n    __tz_FLASH_N = DEFINED(FLASH_NS_START) ? ABSOLUTE(FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(FLASH_START + FLASH_LENGTH) : FLASH_LENGTH < 32768 ? FLASH_LENGTH : ALIGN(32768);\n    FLASH_NS_IMAGE_START = DEFINED(FLASH_NS_IMAGE_START) ? FLASH_NS_IMAGE_START : __tz_FLASH_N;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_S = ORIGIN(QSPI_FLASH);\n\n    /* QSPI_FLASH section to be downloaded via debugger */\n    .qspi_flash :\n    {\n        __qspi_flash_start__ = .;\n        KEEP(*(.qspi_flash*))\n        KEEP(*(.code_in_qspi*))\n        __qspi_flash_end__ = .;\n    } > QSPI_FLASH\n    __qspi_flash_code_size__ = __qspi_flash_end__ - __qspi_flash_start__;\n\n    /* QSPI_FLASH non-retentive section, creates a copy in internal flash that can be copied to QSPI */\n    __qspi_flash_code_addr__ = sgstubs_pre_location;\n    .qspi_non_retentive : AT(__qspi_flash_code_addr__)\n    {\n        __qspi_non_retentive_start__ = .;\n        KEEP(*(.qspi_non_retentive*))\n        __qspi_non_retentive_end__ = .;\n    } > QSPI_FLASH\n    __qspi_non_retentive_size__ = __qspi_non_retentive_end__ - __qspi_non_retentive_start__;\n\n    __qspi_region_max_size__ = 0x4000000;   /* Must be the same as defined in MEMORY above */\n    __qspi_region_start_address__ = __qspi_flash_start__;\n    __qspi_region_end_address__ = __qspi_flash_start__ + __qspi_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_QSPI_FLASH_N = __qspi_non_retentive_end__;\n\n    /* Support for OctaRAM */\n    .OSPI_DEVICE_0_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_0_start__ = .;\n        *(.ospi_device_0_no_load*)\n        . = ALIGN(4);\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0_RAM\n\n    .OSPI_DEVICE_1_NO_LOAD (NOLOAD):\n    {\n        . = ALIGN(4);\n        __ospi_device_1_start__ = .;\n        *(.ospi_device_1_no_load*)\n        . = ALIGN(4);\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1_RAM\n\n    /* Note: There are no secure/non-secure boundaries for QSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_S = ORIGIN(OSPI_DEVICE_0);\n\n    /* OSPI_DEVICE_0 section to be downloaded via debugger */\n    .OSPI_DEVICE_0 :\n    {\n        __ospi_device_0_start__ = .;\n        KEEP(*(.ospi_device_0*))\n        KEEP(*(.code_in_ospi_device_0*))\n        __ospi_device_0_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_code_size__ = __ospi_device_0_end__ - __ospi_device_0_start__;\n\n    /* OSPI_DEVICE_0 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n     __ospi_device_0_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive));\n    .ospi_device_0_non_retentive : AT(__ospi_device_0_code_addr__)\n    {\n        __ospi_device_0_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_0_non_retentive*))\n        __ospi_device_0_non_retentive_end__ = .;\n    } > OSPI_DEVICE_0\n    __ospi_device_0_non_retentive_size__ = __ospi_device_0_non_retentive_end__ - __ospi_device_0_non_retentive_start__;\n\n    __ospi_device_0_region_max_size__ = 0x8000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_0_region_start_address__ = __ospi_device_0_start__;\n    __ospi_device_0_region_end_address__ = __ospi_device_0_start__ + __ospi_device_0_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_0_N = __ospi_device_0_non_retentive_end__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_S = ORIGIN(OSPI_DEVICE_1);\n\n    /* OSPI_DEVICE_1 section to be downloaded via debugger */\n    .OSPI_DEVICE_1 :\n    {\n        __ospi_device_1_start__ = .;\n        KEEP(*(.ospi_device_1*))\n        KEEP(*(.code_in_ospi_device_1*))\n        __ospi_device_1_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_code_size__ = __ospi_device_1_end__ - __ospi_device_1_start__;\n\n    /* OSPI_DEVICE_1 non-retentive section, creates a copy in internal flash that can be copied to OSPI */\n    __ospi_device_1_code_addr__ = sgstubs_pre_location + (SIZEOF(.qspi_non_retentive) + SIZEOF(.ospi_device_0_non_retentive));\n    .ospi_device_1_non_retentive : AT(__ospi_device_1_code_addr__)\n    {\n        __ospi_device_1_non_retentive_start__ = .;\n        KEEP(*(.ospi_device_1_non_retentive*))\n        __ospi_device_1_non_retentive_end__ = .;\n    } > OSPI_DEVICE_1\n    __ospi_device_1_non_retentive_size__ = __ospi_device_1_non_retentive_end__ - __ospi_device_1_non_retentive_start__;\n\n    __ospi_device_1_region_max_size__ = 0x10000000;   /* Must be the same as defined in MEMORY above */\n    __ospi_device_1_region_start_address__ = __ospi_device_1_start__;\n    __ospi_device_1_region_end_address__ = __ospi_device_1_start__ + __ospi_device_1_region_max_size__;\n\n    /* Note: There are no secure/non-secure boundaries for OSPI.  These symbols are provided for the RA configuration tool. */\n    __tz_OSPI_DEVICE_1_N = __ospi_device_1_non_retentive_end__;\n\n    .noinit (NOLOAD):\n    {\n        . = ALIGN(4);\n        __noinit_start = .;\n        KEEP(*(.noinit*))\n        . = ALIGN(8);\n        /* Place the FreeRTOS heap here so that the __HeapLimit calculation does not include the freertos heap. */\n        KEEP(*(.heap.*))\n        __noinit_end = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n        __HeapBase = .;\n        /* Place the STD heap here. */\n        KEEP(*(.heap))\n        __HeapLimit = .;\n    } > RAM\n\n    /* Stacks are stored in this section. */\n    .stack_dummy (NOLOAD):\n    {\n        . = ALIGN(8);\n        __StackLimit = .;\n        /* Main stack */\n        KEEP(*(.stack))\n        __StackTop = .;\n        /* Thread stacks */\n        KEEP(*(.stack*))\n        __StackTopAll = .;\n    } > RAM\n\n    PROVIDE(__stack = __StackTopAll);\n\n    /* This symbol represents the end of user allocated RAM. The RAM after this symbol can be used\n       at run time for things such as ThreadX memory pool allocations. */\n    __RAM_segment_used_end__ = ALIGN(__StackTopAll , 4);\n\n    /* RAM_NSC_START can be used to set a fixed address for non-secure callable RAM in secure projects.\n     * If it is not specified, the address for NSC RAM is the end of RAM aligned to a 1K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_C = DEFINED(RAM_NSC_START) ? ABSOLUTE(RAM_NSC_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__RAM_segment_used_end__, 1024);\n\n    /* RAM_NS_START can be used to set a fixed address for non-secure RAM in secure projects or flat projects.\n     * RAM_NS_BUFFER_BLOCK_LENGTH is used to allocate non-secure buffers in a flat project. If it is not\n     * specified, the address for NSC RAM is the end of RAM aligned to an 8K boundary.\n     * In flat projects that require non-secure RAM, this variable is set to the start of non-secure RAM. */\n    __tz_RAM_N = DEFINED(RAM_NS_START) ? ABSOLUTE(RAM_NS_START - RAM_NS_BUFFER_BLOCK_LENGTH) : __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_BLOCK_START) : ALIGN(__tz_RAM_C, 8192);\n\n    /* Non-secure buffers must be in non-secure RAM. This is primarily used for the EDMAC in flat projects.\n     * The EDMAC is a non-secure bus master and can only access non-secure RAM. */\n    .ns_buffer (NOLOAD):\n    {\n        /* Allocate RAM on a 32-byte boundary to help with placement of Ethernet buffers. */\n        . = __RESERVE_NS_RAM ? ABSOLUTE(RAM_NS_BUFFER_START & 0xFFFFFFE0) : .;\n\n        KEEP(*(.ns_buffer*))\n    } > RAM\n\n    /* Data flash. */\n    .data_flash :\n    {\n        . = ORIGIN(DATA_FLASH);\n        __tz_DATA_FLASH_S = .;\n        __Data_Flash_Start = .;\n        KEEP(*(.data_flash*))\n        __Data_Flash_End = .;\n\n        __tz_DATA_FLASH_N = DEFINED(DATA_FLASH_NS_START) ? ABSOLUTE(DATA_FLASH_NS_START) : __RESERVE_NS_RAM ? ABSOLUTE(DATA_FLASH_START + DATA_FLASH_LENGTH) : ALIGN(1024);\n    } > DATA_FLASH\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_S = ORIGIN(SDRAM);\n\n    /* SDRAM */\n    .sdram (NOLOAD):\n    {\n        __SDRAM_Start = .;\n        KEEP(*(.sdram*))\n        KEEP(*(.frame*))\n        __SDRAM_End = .;\n    } > SDRAM\n\n    /* Note: There are no secure/non-secure boundaries for SDRAM.  These symbols are provided for the RA configuration tool. */\n    __tz_SDRAM_N = __SDRAM_End;\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool. */\n    __tz_ID_CODE_S = ORIGIN(ID_CODE);\n\n    /* Note: There are no secure/non-secure boundaries for ID_CODE.  These symbols are provided for the RA configuration tool.\n     *       Set this symbol to the same value as __tz_ID_CODE_S so the RA configuration tool does not split the ID_CODE\n     *       memory region between TrustZone projects. */\n    __tz_ID_CODE_N = __tz_ID_CODE_S;\n\n    .id_code :\n    {\n        __ID_Code_Start = .;\n        KEEP(*(.id_code*))\n        __ID_Code_End = .;\n    } > ID_CODE\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S = ORIGIN(OPTION_SETTING_OFS);\n\n    .option_setting_ofs :\n    {\n        __OPTION_SETTING_OFS_Start = .;\n        KEEP(*(.option_setting_ofs0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x04 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_ofs2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_OFS_Start + 0x10 : __OPTION_SETTING_OFS_Start;\n        KEEP(*(.option_setting_dualsel))\n        __OPTION_SETTING_OFS_End = .;\n    } > OPTION_SETTING_OFS = 0xFF\n\n    .option_setting_sas :\n    {\n        __OPTION_SETTING_SAS_Start = .;\n        KEEP(*(.option_setting_sas))\n        __OPTION_SETTING_SAS_End = .;\n    } > OPTION_SETTING_SAS = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_N = ABSOLUTE(OPTION_SETTING_START_NS);\n\n    .option_setting_ns :\n    {\n        __OPTION_SETTING_NS_Start = .;\n        KEEP(*(.option_setting_ofs1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x04 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_ofs3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x10 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_banksel))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x40 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x44 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x48 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x4C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_bps3))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x60 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps0))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x64 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps1))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x68 : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps2))\n        . = USE_OPTION_SETTING_NS ? __OPTION_SETTING_NS_Start + 0x6C : __OPTION_SETTING_NS_Start;\n        KEEP(*(.option_setting_pbps3))\n        __OPTION_SETTING_NS_End = .;\n    } > OPTION_SETTING = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_S = ORIGIN(OPTION_SETTING_S);\n\n    .option_setting_s :\n    {\n        __OPTION_SETTING_S_Start = .;\n        KEEP(*(.option_setting_ofs1_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x04 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x10 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sec))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x40 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x44 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x48 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x4C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x60 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x64 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x68 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x6C : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_pbps_sec3))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x80 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs1_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x84 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_ofs3_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0x90 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_banksel_sel))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC0 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel0))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC4 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel1))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xC8 : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel2))\n        . = PROJECT_SECURE_OR_FLAT ? __OPTION_SETTING_S_Start + 0xCC : __OPTION_SETTING_S_Start;\n        KEEP(*(.option_setting_bps_sel3))\n        __OPTION_SETTING_S_End = .;\n    } > OPTION_SETTING_S = 0xFF\n\n    /* Symbol required for RA Configuration tool. */\n    __tz_OPTION_SETTING_S_N = __OPTION_SETTING_S_End;\n}\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/script/memory_regions.ld",
    "content": "\n            /* generated memory regions file - do not edit */\n                            RAM_START  = 0x20000000;\n                RAM_LENGTH = 0x8000;\n                FLASH_START  = 0x00000000;\n                FLASH_LENGTH = 0x40000;\n                DATA_FLASH_START  = 0x40100000;\n                DATA_FLASH_LENGTH = 0x2000;\n                OPTION_SETTING_START  = 0x00000000;\n                OPTION_SETTING_LENGTH = 0x0;\n                OPTION_SETTING_S_START  = 0x80000000;\n                OPTION_SETTING_S_LENGTH = 0x0;\n                ID_CODE_START  = 0x01010018;\n                ID_CODE_LENGTH = 0x20;\n                SDRAM_START  = 0x80010000;\n                SDRAM_LENGTH = 0x0;\n                QSPI_FLASH_START  = 0x60000000;\n                QSPI_FLASH_LENGTH = 0x0;\n                OSPI_DEVICE_0_START  = 0x80020000;\n                OSPI_DEVICE_0_LENGTH = 0x0;\n                OSPI_DEVICE_1_START  = 0x80030000;\n                OSPI_DEVICE_1_LENGTH = 0x0;\n\n/* Uno R4 has bootloader */\nFLASH_IMAGE_START = 0x4000;\n"
  },
  {
    "path": "hw/bsp/ra/boards/uno_r4/smart_configurator/configuration.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<raConfiguration version=\"9\">\n  <generalSettings>\n    <option key=\"#Board#\" value=\"board.custom\"/>\n    <option key=\"CPU\" value=\"RA4M1\"/>\n    <option key=\"Core\" value=\"CM4\"/>\n    <option key=\"#TargetName#\" value=\"R7FA4M1AB3CNE\"/>\n    <option key=\"#TargetARCHITECTURE#\" value=\"cortex-m4\"/>\n    <option key=\"#DeviceCommand#\" value=\"R7FA4M1AB\"/>\n    <option key=\"#RTOS#\" value=\"_none\"/>\n    <option key=\"#pinconfiguration#\" value=\"R7FA4M1AB3CNE.pincfg\"/>\n    <option key=\"#FSPVersion#\" value=\"5.6.0\"/>\n    <option key=\"#SELECTED_TOOLCHAIN#\" value=\"com.renesas.cdt.managedbuild.gnuarm.toolchain.\"/>\n  </generalSettings>\n  <raBspConfiguration>\n    <config id=\"config.bsp.ra4m1.R7FA4M1AB3CNE\">\n      <property id=\"config.bsp.part_number\" value=\"config.bsp.part_number.value\"/>\n      <property id=\"config.bsp.rom_size_bytes\" value=\"config.bsp.rom_size_bytes.value\"/>\n      <property id=\"config.bsp.rom_size_bytes_hidden\" value=\"262144\"/>\n      <property id=\"config.bsp.ram_size_bytes\" value=\"config.bsp.ram_size_bytes.value\"/>\n      <property id=\"config.bsp.data_flash_size_bytes\" value=\"config.bsp.data_flash_size_bytes.value\"/>\n      <property id=\"config.bsp.package_style\" value=\"config.bsp.package_style.value\"/>\n      <property id=\"config.bsp.package_pins\" value=\"config.bsp.package_pins.value\"/>\n      <property id=\"config.bsp.irq_count_hidden\" value=\"32\"/>\n    </config>\n    <config id=\"config.bsp.ra4m1\">\n      <property id=\"config.bsp.series\" value=\"config.bsp.series.value\"/>\n    </config>\n    <config id=\"config.bsp.ra4m1.fsp\">\n      <property id=\"config.bsp.fsp.inline_irq_functions\" value=\"config.bsp.common.inline_irq_functions.enabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_start_mode\" value=\"config.bsp.fsp.OFS0.iwdt_start_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_timeout\" value=\"config.bsp.fsp.OFS0.iwdt_timeout.2048\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_divisor\" value=\"config.bsp.fsp.OFS0.iwdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_end\" value=\"config.bsp.fsp.OFS0.iwdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_window_start\" value=\"config.bsp.fsp.OFS0.iwdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.iwdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.iwdt_stop_control\" value=\"config.bsp.fsp.OFS0.iwdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_start_mode\" value=\"config.bsp.fsp.OFS0.wdt_start_mode.register\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_timeout\" value=\"config.bsp.fsp.OFS0.wdt_timeout.16384\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_divisor\" value=\"config.bsp.fsp.OFS0.wdt_divisor.128\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_end\" value=\"config.bsp.fsp.OFS0.wdt_window_end.0\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_window_start\" value=\"config.bsp.fsp.OFS0.wdt_window_start.100\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_reset_interrupt\" value=\"config.bsp.fsp.OFS0.wdt_reset_interrupt.Reset\"/>\n      <property id=\"config.bsp.fsp.OFS0.wdt_stop_control\" value=\"config.bsp.fsp.OFS0.wdt_stop_control.stops\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0.start\" value=\"config.bsp.fsp.OFS1.voltage_detection0.start.disabled\"/>\n      <property id=\"config.bsp.fsp.OFS1.voltage_detection0_level\" value=\"config.bsp.fsp.OFS1.voltage_detection0_level.190\"/>\n      <property id=\"config.bsp.fsp.OFS1.hoco_osc\" value=\"config.bsp.fsp.OFS1.hoco_osc.enabled\"/>\n      <property id=\"config.bsp.low_voltage_mode\" value=\"config.bsp.low_voltage_mode.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_enable\" value=\"config.bsp.fsp.mpu_pc0_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_start\" value=\"0x00FFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_pc0_end\" value=\"0x00FFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_enable\" value=\"config.bsp.fsp.mpu_pc1_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_start\" value=\"0x00FFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_pc1_end\" value=\"0x00FFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_enable\" value=\"config.bsp.fsp.mpu_reg0_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_start\" value=\"0x00FFFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg0_end\" value=\"0x00FFFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_enable\" value=\"config.bsp.fsp.mpu_reg1_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_start\" value=\"0x200FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg1_end\" value=\"0x200FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_enable\" value=\"config.bsp.fsp.mpu_reg2_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_start\" value=\"0x407FFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg2_end\" value=\"0x407FFFFF\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_enable\" value=\"config.bsp.fsp.mpu_reg3_enable.disabled\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_start\" value=\"0x400DFFFC\"/>\n      <property id=\"config.bsp.fsp.mpu_reg3_end\" value=\"0x400DFFFF\"/>\n      <property id=\"config.bsp.common.main_osc_wait\" value=\"config.bsp.common.main_osc_wait.wait_8163\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.max_freq_hz\" value=\"64000000\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.max_baud\" value=\"6666666\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sample_and_hold\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.adc.sensors_are_exclusive\" value=\"1\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_spi.max_bitrate\" value=\"12000000\"/>\n      <property id=\"config.bsp.fsp.mcu.spi.max_bitrate\" value=\"24000000\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.rate.rate_fastplus\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_master.fastplus_channels\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.rate.rate_fastplus\" value=\"0\"/>\n      <property id=\"config.bsp.fsp.mcu.iic_slave.fastplus_channels\" value=\"0x0\"/>\n      <property id=\"config.bsp.fsp.mcu.sci_uart.cstpen_channels\" value=\"0x0\"/>\n      <property id=\"config.bsp.fsp.mcu.gpt.pin_count_source_channels\" value=\"0xFFFF\"/>\n      <property id=\"config.bsp.fsp.mcu.slcdc.1_4_bias_method\" value=\"1\"/>\n      <property id=\"config.bsp.common.id_mode\" value=\"config.bsp.common.id_mode.unlocked\"/>\n      <property id=\"config.bsp.common.id_code\" value=\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\"/>\n      <property id=\"config.bsp.common.id1\" value=\"\"/>\n      <property id=\"config.bsp.common.id2\" value=\"\"/>\n      <property id=\"config.bsp.common.id3\" value=\"\"/>\n      <property id=\"config.bsp.common.id4\" value=\"\"/>\n      <property id=\"config.bsp.common.id_fixed\" value=\"\"/>\n    </config>\n    <config id=\"config.bsp.ra\">\n      <property id=\"config.bsp.common.main\" value=\"0x800\"/>\n      <property id=\"config.bsp.common.heap\" value=\"0x1000\"/>\n      <property id=\"config.bsp.common.vcc\" value=\"3300\"/>\n      <property id=\"config.bsp.common.checking\" value=\"config.bsp.common.checking.disabled\"/>\n      <property id=\"config.bsp.common.assert\" value=\"config.bsp.common.assert.none\"/>\n      <property id=\"config.bsp.common.error_log\" value=\"config.bsp.common.error_log.none\"/>\n      <property id=\"config.bsp.common.soft_reset\" value=\"config.bsp.common.soft_reset.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_populated\" value=\"config.bsp.common.main_osc_populated.disabled\"/>\n      <property id=\"config.bsp.common.pfs_protect\" value=\"config.bsp.common.pfs_protect.enabled\"/>\n      <property id=\"config.bsp.common.c_runtime_init\" value=\"config.bsp.common.c_runtime_init.enabled\"/>\n      <property id=\"config.bsp.common.early_init\" value=\"config.bsp.common.early_init.disabled\"/>\n      <property id=\"config.bsp.common.main_osc_clock_source\" value=\"config.bsp.common.main_osc_clock_source.crystal\"/>\n      <property id=\"config.bsp.common.subclock_populated\" value=\"config.bsp.common.subclock_populated.disabled\"/>\n      <property id=\"config.bsp.common.subclock_drive\" value=\"config.bsp.common.subclock_drive.standard\"/>\n      <property id=\"config.bsp.common.subclock_stabilization_ms\" value=\"1000\"/>\n    </config>\n  </raBspConfiguration>\n  <raClockConfiguration>\n    <node id=\"board.clock.xtal.freq\" mul=\"0\" option=\"_edit\"/>\n    <node id=\"board.clock.pll.source\" option=\"board.clock.pll.source.disabled\"/>\n    <node id=\"board.clock.hoco.freq\" option=\"board.clock.hoco.freq.48m\"/>\n    <node id=\"board.clock.loco.freq\" option=\"board.clock.loco.freq.32768\"/>\n    <node id=\"board.clock.moco.freq\" option=\"board.clock.moco.freq.8m\"/>\n    <node id=\"board.clock.subclk.freq\" option=\"board.clock.subclk.freq.32768\"/>\n    <node id=\"board.clock.pll.div\" option=\"board.clock.pll.div.4\"/>\n    <node id=\"board.clock.pll.mul\" option=\"board.clock.pll.mul.12\"/>\n    <node id=\"board.clock.pll.display\" option=\"board.clock.pll.display.value\"/>\n    <node id=\"board.clock.clock.source\" option=\"board.clock.clock.source.hoco\"/>\n    <node id=\"board.clock.iclk.div\" option=\"board.clock.iclk.div.1\"/>\n    <node id=\"board.clock.iclk.display\" option=\"board.clock.iclk.display.value\"/>\n    <node id=\"board.clock.pclka.div\" option=\"board.clock.pclka.div.1\"/>\n    <node id=\"board.clock.pclka.display\" option=\"board.clock.pclka.display.value\"/>\n    <node id=\"board.clock.pclkb.div\" option=\"board.clock.pclkb.div.2\"/>\n    <node id=\"board.clock.pclkb.display\" option=\"board.clock.pclkb.display.value\"/>\n    <node id=\"board.clock.pclkc.div\" option=\"board.clock.pclkc.div.1\"/>\n    <node id=\"board.clock.pclkc.display\" option=\"board.clock.pclkc.display.value\"/>\n    <node id=\"board.clock.pclkd.div\" option=\"board.clock.pclkd.div.1\"/>\n    <node id=\"board.clock.pclkd.display\" option=\"board.clock.pclkd.display.value\"/>\n    <node id=\"board.clock.fclk.div\" option=\"board.clock.fclk.div.2\"/>\n    <node id=\"board.clock.fclk.display\" option=\"board.clock.fclk.display.value\"/>\n    <node id=\"board.clock.clkout.source\" option=\"board.clock.clkout.source.disabled\"/>\n    <node id=\"board.clock.clkout.div\" option=\"board.clock.clkout.div.1\"/>\n    <node id=\"board.clock.clkout.display\" option=\"board.clock.clkout.display.value\"/>\n    <node id=\"board.clock.uclk.source\" option=\"board.clock.uclk.source.hoco\"/>\n    <node id=\"board.clock.uclk.display\" option=\"board.clock.clkout.display.value\"/>\n  </raClockConfiguration>\n  <raComponentSelection>\n    <component apiversion=\"\" class=\"Common\" condition=\"\" group=\"all\" subgroup=\"fsp_common\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board Support Package Common Files</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"HAL Drivers\" condition=\"\" group=\"all\" subgroup=\"r_ioport\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>I/O Port</description>\n      <originalPack>Renesas.RA.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"CMSIS\" condition=\"\" group=\"CMSIS5\" subgroup=\"CoreM\" variant=\"\" vendor=\"Arm\" version=\"6.1.0+fsp.5.6.0\">\n      <description>Arm CMSIS Version 6 - Core (M)</description>\n      <originalPack>Arm.CMSIS6.6.1.0+fsp.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"Board\" subgroup=\"custom\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Custom Board Support Files</description>\n      <originalPack>Renesas.RA_board_custom.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m1\" subgroup=\"device\" variant=\"R7FA4M1AB3CNE\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for R7FA4M1AB3CNE</description>\n      <originalPack>Renesas.RA_mcu_ra4m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m1\" subgroup=\"device\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M1</description>\n      <originalPack>Renesas.RA_mcu_ra4m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m1\" subgroup=\"fsp\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M1 - FSP Data</description>\n      <originalPack>Renesas.RA_mcu_ra4m1.5.6.0.pack</originalPack>\n    </component>\n    <component apiversion=\"\" class=\"BSP\" condition=\"\" group=\"ra4m1\" subgroup=\"events\" variant=\"\" vendor=\"Renesas\" version=\"5.6.0\">\n      <description>Board support package for RA4M1 - Events</description>\n      <originalPack>Renesas.RA_mcu_ra4m1.5.6.0.pack</originalPack>\n    </component>\n  </raComponentSelection>\n  <raElcConfiguration/>\n  <raIcuConfiguration/>\n  <raModuleConfiguration>\n    <module id=\"module.driver.ioport_on_ioport.0\">\n      <property id=\"module.driver.ioport.name\" value=\"g_ioport\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport1\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport2\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport3\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.elc_trigger_ioport4\" value=\"_disabled\"/>\n      <property id=\"module.driver.ioport.pincfg\" value=\"g_bsp_pin_cfg\"/>\n    </module>\n    <context id=\"_hal.0\">\n      <stack module=\"module.driver.ioport_on_ioport.0\"/>\n    </context>\n    <config id=\"config.driver.ioport\">\n      <property id=\"config.driver.ioport.checking\" value=\"config.driver.ioport.checking.system\"/>\n    </config>\n  </raModuleConfiguration>\n  <raPinConfiguration>\n    <symbolicName propertyId=\"p110.symbolic_name\" value=\"SW1\"/>\n    <symbolicName propertyId=\"p111.symbolic_name\" value=\"LED1\"/>\n    <comment propertyId=\"p110.comment\" value=\"active low\"/>\n    <comment propertyId=\"p111.comment\" value=\"active high\"/>\n    <pincfg active=\"true\" name=\"R7FA4M1AB3CNE.pincfg\" selected=\"true\" symbol=\"g_bsp_pin_cfg\">\n      <configSetting altId=\"debug0.mode.swd\" configurationId=\"debug0.mode\"/>\n      <configSetting altId=\"debug0.swclk.p300\" configurationId=\"debug0.swclk\"/>\n      <configSetting altId=\"debug0.swdio.p108\" configurationId=\"debug0.swdio\"/>\n      <configSetting altId=\"p108.debug0.swdio\" configurationId=\"p108\"/>\n      <configSetting altId=\"p108.gpio_mode.gpio_mode_peripheral\" configurationId=\"p108.gpio_mode\"/>\n      <configSetting altId=\"p110.input\" configurationId=\"p110\"/>\n      <configSetting altId=\"p110.gpio_mode.gpio_mode_in\" configurationId=\"p110.gpio_mode\"/>\n      <configSetting altId=\"p110.gpio_pupd.gpio_pupd_ip_up\" configurationId=\"p110.gpio_pupd\"/>\n      <configSetting altId=\"p111.output.low\" configurationId=\"p111\"/>\n      <configSetting altId=\"p111.gpio_mode.gpio_mode_out.low\" configurationId=\"p111.gpio_mode\"/>\n      <configSetting altId=\"p300.debug0.swclk\" configurationId=\"p300\"/>\n      <configSetting altId=\"p300.gpio_mode.gpio_mode_peripheral\" configurationId=\"p300.gpio_mode\"/>\n      <configSetting altId=\"p407.usbfs0.vbus\" configurationId=\"p407\"/>\n      <configSetting altId=\"p407.gpio_mode.gpio_mode_peripheral\" configurationId=\"p407.gpio_mode\"/>\n      <configSetting altId=\"p914.usbfs0.usbdp\" configurationId=\"p914\"/>\n      <configSetting altId=\"p914.gpio_mode.gpio_mode_peripheral\" configurationId=\"p914.gpio_mode\"/>\n      <configSetting altId=\"p915.usbfs0.usbdm\" configurationId=\"p915\"/>\n      <configSetting altId=\"p915.gpio_mode.gpio_mode_peripheral\" configurationId=\"p915.gpio_mode\"/>\n      <configSetting altId=\"usbfs0.mode.device\" configurationId=\"usbfs0.mode\"/>\n      <configSetting altId=\"usbfs0.usbdm.p915\" configurationId=\"usbfs0.usbdm\"/>\n      <configSetting altId=\"usbfs0.usbdp.p914\" configurationId=\"usbfs0.usbdp\"/>\n      <configSetting altId=\"usbfs0.vbus.p407\" configurationId=\"usbfs0.vbus\"/>\n    </pincfg>\n  </raPinConfiguration>\n</raConfiguration>\n"
  },
  {
    "path": "hw/bsp/ra/debug.jlinkscript",
    "content": "int SetupTarget(void) {\n  JLINK_ExecCommand(\"SetRTTSearchRanges 0x20000000 0x80000\");\n  return 0;\n}\n"
  },
  {
    "path": "hw/bsp/ra/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022, Rafael Silva\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Renesas\n*/\n\n#include <stdio.h>\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#pragma GCC diagnostic ignored \"-Wundef\"\n#endif\n\n#include \"common_data.h\"\n#include \"renesas.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n/* Key code for writing PRCR register. */\n#define BSP_PRV_PRCR_KEY         (0xA500U)\n\n//--------------------------------------------------------------------+\n// Vector Data\n//--------------------------------------------------------------------+\n\nBSP_DONT_REMOVE BSP_PLACE_IN_SECTION(BSP_SECTION_APPLICATION_VECTORS)\nconst fsp_vector_t g_vector_table[BSP_ICU_VECTOR_MAX_ENTRIES] = {\n    [0] = usbfs_interrupt_handler, /* USBFS INT (USBFS interrupt) */\n    [1] = usbfs_resume_handler,    /* USBFS RESUME (USBFS resume interrupt) */\n\n#ifndef BSP_MCU_GROUP_RA2A1\n    [2] = usbfs_d0fifo_handler,    /* USBFS FIFO 0 (DMA transfer request 0) */\n    [3] = usbfs_d1fifo_handler,    /* USBFS FIFO 1 (DMA transfer request 1) */\n#endif\n\n#ifdef BOARD_HAS_USB_HIGHSPEED\n    [4] = usbhs_interrupt_handler, /* USBHS INT (USBHS interrupt) */\n    [5] = usbhs_d0fifo_handler,    /* USBHS FIFO 0 (DMA transfer request 0) */\n    [6] = usbhs_d1fifo_handler,    /* USBHS FIFO 1 (DMA transfer request 1) */\n#endif\n};\n\nconst bsp_interrupt_event_t g_interrupt_event_link_select[BSP_ICU_VECTOR_MAX_ENTRIES] = {\n    [0] = BSP_PRV_IELS_ENUM(EVENT_USBFS_INT),            /* USBFS INT (USBFS interrupt) */\n    [1] = BSP_PRV_IELS_ENUM(EVENT_USBFS_RESUME),         /* USBFS RESUME (USBFS resume interrupt) */\n\n#ifndef BSP_MCU_GROUP_RA2A1\n    [2] = BSP_PRV_IELS_ENUM(EVENT_USBFS_FIFO_0),         /* USBFS FIFO 0 (DMA transfer request 0) */\n    [3] = BSP_PRV_IELS_ENUM(EVENT_USBFS_FIFO_1),         /* USBFS FIFO 1 (DMA transfer request 1) */\n#endif\n\n#ifdef BOARD_HAS_USB_HIGHSPEED\n    [4] = BSP_PRV_IELS_ENUM(EVENT_USBHS_USB_INT_RESUME), /* USBHS USB INT RESUME (USBHS interrupt) */\n    [5] = BSP_PRV_IELS_ENUM(EVENT_USBHS_FIFO_0),         /* USBHS FIFO 0 (DMA transfer request 0) */\n    [6] = BSP_PRV_IELS_ENUM(EVENT_USBHS_FIFO_1),         /* USBHS FIFO 1 (DMA transfer request 1) */\n#endif\n};\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_init(void) {\n  // Enable global interrupts in CPSR register since board with bootloader such as Arduino Uno R4\n  // can transfer CPU control with CPSR.I bit set to 0 (disable IRQ)\n  __enable_irq();\n\n  /* Configure pins. */\n  R_IOPORT_Open(&IOPORT_CFG_CTRL, &IOPORT_CFG_NAME);\n\n#ifdef TRACE_ETM\n  // TRCKCR is protected by PRCR bit0 register\n  R_SYSTEM->PRCR = (uint16_t) (BSP_PRV_PRCR_KEY | 0x01);\n\n  // Enable trace clock (max 100Mhz). Since PLL/CPU is 200Mhz, clock div = 2\n  R_SYSTEM->TRCKCR = R_SYSTEM_TRCKCR_TRCKEN_Msk | 0x01;\n\n  R_SYSTEM->PRCR = (uint16_t) BSP_PRV_PRCR_KEY;\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USBFS_INT_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBFS_RESUME_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBFS_FIFO_0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBFS_FIFO_1_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  board_led_write(false);\n}\n\nvoid board_init_after_tusb(void) {\n  // For board that use USB LDO regulator\n#if defined(BOARD_UNO_R4)\n  R_USB_FS0->USBMC |= R_USB_FS0_USBMC_VDCEN_Msk;\n#endif\n}\n\nvoid board_led_write(bool state) {\n  R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, LED1, state ? LED_STATE_ON : !LED_STATE_ON);\n}\n\nuint32_t board_button_read(void) {\n  bsp_io_level_t lvl = !BUTTON_STATE_ACTIVE;\n  R_IOPORT_PinRead(&IOPORT_CFG_CTRL, SW1, &lvl);\n  return lvl == BUTTON_STATE_ACTIVE;\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  max_len = tu_min32(max_len, sizeof(bsp_unique_id_t));\n  bsp_unique_id_t const *uid = R_BSP_UniqueIdGet();\n  memcpy(id, uid->unique_id_bytes, max_len);\n  return max_len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\n//------------- USB0 FullSpeed -------------//\nvoid usbfs_interrupt_handler(void) {\n  IRQn_Type irq = R_FSP_CurrentIrqGet();\n  R_BSP_IrqStatusClear(irq);\n\n  tusb_int_handler(0, true);\n}\n\nvoid usbfs_resume_handler(void) {\n  IRQn_Type irq = R_FSP_CurrentIrqGet();\n  R_BSP_IrqStatusClear(irq);\n\n  tusb_int_handler(0, true);\n}\n\nvoid usbfs_d0fifo_handler(void) {\n  IRQn_Type irq = R_FSP_CurrentIrqGet();\n  R_BSP_IrqStatusClear(irq);\n  // TODO not used yet\n}\n\nvoid usbfs_d1fifo_handler(void) {\n  IRQn_Type irq = R_FSP_CurrentIrqGet();\n  R_BSP_IrqStatusClear(irq);\n  // TODO not used yet\n}\n\n//------------- USB1 HighSpeed -------------//\n#ifdef BOARD_HAS_USB_HIGHSPEED\nvoid usbhs_interrupt_handler(void) {\n  IRQn_Type irq = R_FSP_CurrentIrqGet();\n  R_BSP_IrqStatusClear(irq);\n\n  tusb_int_handler(1, true);\n}\n\nvoid usbhs_d0fifo_handler(void) {\n  IRQn_Type irq = R_FSP_CurrentIrqGet();\n  R_BSP_IrqStatusClear(irq);\n  // TODO not used yet\n}\n\nvoid usbhs_d1fifo_handler(void) {\n  IRQn_Type irq = R_FSP_CurrentIrqGet();\n  R_BSP_IrqStatusClear(irq);\n  // TODO not used yet\n}\n#endif\n\n//--------------------------------------------------------------------+\n// stdlib\n//--------------------------------------------------------------------+\n\nint close(int fd) {\n  (void) fd;\n  return -1;\n}\n\nint fstat(int fd, void *pstat) {\n  (void) fd;\n  (void) pstat;\n  return 0;\n}\n\noff_t lseek(int fd, off_t pos, int whence) {\n  (void) fd;\n  (void) pos;\n  (void) whence;\n  return 0;\n}\n\nint isatty(int fd) {\n  (void) fd;\n  return 1;\n}\n"
  },
  {
    "path": "hw/bsp/ra/family.cmake",
    "content": "include_guard()\n\nif (NOT BOARD)\n  message(FATAL_ERROR \"BOARD not specified\")\nendif ()\n\nset(CMSIS_DIR ${TOP}/lib/CMSIS_6)\nset(FSP_RA ${TOP}/hw/mcu/renesas/fsp/ra/fsp)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n#set(FREERTOS_PORT A_CUSTOM_PORT CACHE INTERNAL \"\")\n\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS RAXXX ${MCU_VARIANT} CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif ()\n\nif (NOT DEFINED RHPORT_SPEED)\n  set(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\ncmake_print_variables(RHPORT_DEVICE RHPORT_DEVICE_SPEED RHPORT_HOST RHPORT_HOST_SPEED)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/script/fsp.ld)\nendif ()\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${FSP_RA}/src/bsp/cmsis/Device/RENESAS/Source/startup.c\n    ${FSP_RA}/src/bsp/cmsis/Device/RENESAS/Source/system.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_clocks.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_common.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_delay.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_group_irq.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_guard.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_io.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_irq.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_register_protection.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_sbrk.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_security.c\n    ${FSP_RA}/src/r_ioport/r_ioport.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/ra_gen/common_data.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/ra_gen/pin_data.c\n    )\n\n  target_compile_options(${BOARD_TARGET} PUBLIC\n    -ffreestanding\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/ra_cfg/fsp_cfg\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/ra_cfg/fsp_cfg/bsp\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/ra_gen\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    ${FSP_RA}/inc\n    ${FSP_RA}/inc/api\n    ${FSP_RA}/inc/instances\n    ${FSP_RA}/src/bsp/cmsis/Device/RENESAS/Include\n    ${FSP_RA}/src/bsp/mcu/all\n    ${FSP_RA}/src/bsp/mcu/${MCU_VARIANT}\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_RAXXX)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${FSP_RA}/src/bsp/mcu/all/bsp_rom_registers.c\n    ${TOP}/src/portable/renesas/rusb2/dcd_rusb2.c\n    ${TOP}/src/portable/renesas/rusb2/hcd_rusb2.c\n    ${TOP}/src/portable/renesas/rusb2/rusb2_common.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      # linker file\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -L${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}/script\n      -Wl,--defsym=end=__bss_end__\n      -nostartfiles\n      --specs=nano.specs --specs=nosys.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${FSP_RA}/src/bsp/mcu/all/bsp_rom_registers.c PROPERTIES COMPILE_FLAGS \"-Wno-undef\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n\n  # Flashing\n  family_flash_jlink(${TARGET})\n  family_add_bin_hex(${TARGET})\n\n  if (DEFINED DFU_UTIL_VID_PID)\n    family_flash_dfu_util(${TARGET} ${DFU_UTIL_VID_PID})\n  endif ()\nendfunction()\n"
  },
  {
    "path": "hw/bsp/ra/family.mk",
    "content": "FSP_RA = hw/mcu/renesas/fsp/ra/fsp\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\n# Don't include options setting in .bin file since it create unnecessary large file due to padding\nOBJCOPY_BIN_OPTION = --only-section .text --only-section .data --only-section .rodata --only-section .bss\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nRHPORT_SPEED ?= OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 0\n\n# Determine RHPORT_DEVICE_SPEED if not defined\nifndef RHPORT_DEVICE_SPEED\nifeq ($(RHPORT_DEVICE), 0)\n  RHPORT_DEVICE_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_DEVICE_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# Determine RHPORT_HOST_SPEED if not defined\nifndef RHPORT_HOST_SPEED\nifeq ($(RHPORT_HOST), 0)\n  RHPORT_HOST_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_HOST_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_RAXXX \\\n\t-DBOARD_TUD_RHPORT=${RHPORT_DEVICE} \\\n\t-DBOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED} \\\n\t-DBOARD_TUH_RHPORT=${RHPORT_HOST} \\\n\t-DBOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n\nCFLAGS_GCC += \\\n  -flto \\\n\t-Wno-error=undef \\\n\t-Wno-error=strict-prototypes \\\n\t-Wno-error=cast-align \\\n\t-Wno-error=cast-qual \\\n\t-Wno-error=unused-but-set-variable \\\n\t-Wno-error=unused-variable \\\n\t-ffreestanding\n\nLDFLAGS_GCC += \\\n\t-nostartfiles -nostdlib \\\n  -specs=nosys.specs -specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\nSRC_C += \\\n\tsrc/portable/renesas/rusb2/dcd_rusb2.c \\\n\tsrc/portable/renesas/rusb2/hcd_rusb2.c \\\n\tsrc/portable/renesas/rusb2/rusb2_common.c \\\n\t${BOARD_PATH}/ra_gen/common_data.c \\\n\t${BOARD_PATH}/ra_gen/pin_data.c \\\n\t$(FSP_RA)/src/bsp/cmsis/Device/RENESAS/Source/startup.c \\\n\t$(FSP_RA)/src/bsp/cmsis/Device/RENESAS/Source/system.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_clocks.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_common.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_delay.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_group_irq.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_guard.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_io.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_irq.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_register_protection.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_rom_registers.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_sbrk.c \\\n\t$(FSP_RA)/src/bsp/mcu/all/bsp_security.c \\\n\t$(FSP_RA)/src/r_ioport/r_ioport.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(BOARD_PATH)/ra_cfg/fsp_cfg \\\n\t$(TOP)/$(BOARD_PATH)/ra_cfg/fsp_cfg/bsp \\\n\t$(TOP)/$(BOARD_PATH)/ra_gen \\\n\t$(TOP)/lib/CMSIS_6/CMSIS/Core/Include \\\n\t$(TOP)/$(FSP_RA)/src/bsp/cmsis/Device/RENESAS/Include \\\n\t$(TOP)/$(FSP_RA)/inc \\\n\t$(TOP)/$(FSP_RA)/inc/api \\\n\t$(TOP)/$(FSP_RA)/inc/instances \\\n  $(TOP)/$(FSP_RA)/src/bsp/mcu/all \\\n\t$(TOP)/$(FSP_RA)/src/bsp/mcu/$(MCU_VARIANT) \\\n\nifndef LD_FILE\nLD_FILE = $(BOARD_PATH)/script/fsp.ld\nendif\n\nLDFLAGS += -L$(TOP)/$(BOARD_PATH)/script\nLDFLAGS += -Wl,--defsym=end=__bss_end__\n\n# For freeRTOS port source\n# hack to use the port provided by renesas\nFREERTOS_PORTABLE_SRC = $(FSP_RA)/src/rm_freertos_port\n"
  },
  {
    "path": "hw/bsp/ra/vector_data.h",
    "content": "/* vector numbers are configurable/dynamic, hence this, it will be used inside the port */\n#ifndef VECTOR_DATA_H\n#define VECTOR_DATA_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(BSP_MCU_GROUP_RA6M5) || defined(BSP_MCU_GROUP_RA6M3) || (BSP_CFG_MCU_PART_SERIES == 8)\n#define BOARD_HAS_USB_HIGHSPEED\n#endif\n\n/* ISR prototypes */\nvoid usbfs_interrupt_handler(void);\nvoid usbfs_resume_handler(void);\n\n#ifndef BSP_MCU_GROUP_RA2A1\nvoid usbfs_d0fifo_handler(void);\nvoid usbfs_d1fifo_handler(void);\n#endif\n\n#ifdef BOARD_HAS_USB_HIGHSPEED\nvoid usbhs_interrupt_handler(void);\nvoid usbhs_d0fifo_handler(void);\nvoid usbhs_d1fifo_handler(void);\n#endif\n\n/* Vector table allocations */\n#define USBFS_INT_IRQn    0\n#define USBFS_RESUME_IRQn 1\n#define USBFS_FIFO_0_IRQn 2\n#define USBFS_FIFO_1_IRQn 3\n\n#define USBHS_USB_INT_RESUME_IRQn  4 /* USBHS USB INT RESUME (USBHS interrupt) */\n#define USBHS_FIFO_0_IRQn          5 /* USBHS FIFO 0 (DMA transfer request 0) */\n#define USBHS_FIFO_1_IRQn          6 /* USBHS FIFO 1 (DMA transfer request 1) */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/adafruit_feather_rp2040_usb_host/board.cmake",
    "content": "set(PICO_PLATFORM rp2040)\nset(PICO_BOARD adafruit_feather_rp2040_usb_host)\nset(CFG_TUH_RPI_PIO_USB 1)\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/adafruit_feather_rp2040_usb_host/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather RP2040 with USB Type A Host\n   url: https://www.adafruit.com/product/5723\n*/\n\n#ifndef TUSB_BOARD_H\n#define TUSB_BOARD_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART and LED are already defined in pico-sdk board\n\n//--------------------------------------------------------------------+\n// PIO_USB\n//--------------------------------------------------------------------+\n\n#define PICO_DEFAULT_PIO_USB_DP_PIN       16\n#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN   18\n#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1\n\n//--------------------------------------------------------------------\n// USB Host MAX3421E\n//--------------------------------------------------------------------\n\n#ifdef PICO_DEFAULT_SPI\n#define MAX3421_SPI      PICO_DEFAULT_SPI // sdk v2\n#else\n#define MAX3421_SPI      PICO_DEFAULT_SPI_INSTANCE // sdk v1\n#endif\n\n#define MAX3421_SCK_PIN  PICO_DEFAULT_SPI_SCK_PIN\n#define MAX3421_MOSI_PIN PICO_DEFAULT_SPI_TX_PIN\n#define MAX3421_MISO_PIN PICO_DEFAULT_SPI_RX_PIN\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 9\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/adafruit_fruit_jam/adafruit_fruit_jam.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef BOARDS_ADAFRUIT_FRUIT_JAM_H\n#define BOARDS_ADAFRUIT_FRUIT_JAM_H\n\n// required for board that is not part of pico-sdk\n\n// -----------------------------------------------------\n// NOTE: THIS HEADER IS ALSO INCLUDED BY ASSEMBLER SO\n//       SHOULD ONLY CONSIST OF PREPROCESSOR DIRECTIVES\n// -----------------------------------------------------\n\n// pico_cmake_set PICO_PLATFORM=rp2350\n\n// On some samples, the xosc can take longer to stabilize than is usual\n#ifndef PICO_XOSC_STARTUP_DELAY_MULTIPLIER\n#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64\n#endif\n\n// For board detection\n#define ADAFRUIT_FRUIT_JAM\n\n// --- RP2350 VARIANT ---\n#define PICO_RP2350A 0\n\n// --- UART ---\n#ifndef PICO_DEFAULT_UART\n#define PICO_DEFAULT_UART 1\n#endif\n#ifndef PICO_DEFAULT_UART_TX_PIN\n#define PICO_DEFAULT_UART_TX_PIN 8\n#endif\n#ifndef PICO_DEFAULT_UART_RX_PIN\n#define PICO_DEFAULT_UART_RX_PIN 9\n#endif\n\n// --- LED ---\n#ifndef PICO_DEFAULT_LED_PIN\n#define PICO_DEFAULT_LED_PIN 29\n#endif\n\n#ifndef PICO_DEFAULT_WS2812_PIN\n#define PICO_DEFAULT_WS2812_PIN 32\n#endif\n\n// --- I2C ---\n#ifndef PICO_DEFAULT_I2C\n#define PICO_DEFAULT_I2C 0\n#endif\n#ifndef PICO_DEFAULT_I2C_SDA_PIN\n#define PICO_DEFAULT_I2C_SDA_PIN 20\n#endif\n#ifndef PICO_DEFAULT_I2C_SCL_PIN\n#define PICO_DEFAULT_I2C_SCL_PIN 21\n#endif\n\n// --- SPI ---\n#ifndef PICO_DEFAULT_SPI\n#define PICO_DEFAULT_SPI 1\n#endif\n#ifndef PICO_DEFAULT_SPI_SCK_PIN\n#define PICO_DEFAULT_SPI_SCK_PIN 30\n#endif\n#ifndef PICO_DEFAULT_SPI_TX_PIN\n#define PICO_DEFAULT_SPI_TX_PIN 31\n#endif\n#ifndef PICO_DEFAULT_SPI_RX_PIN\n#define PICO_DEFAULT_SPI_RX_PIN 28\n#endif\n\n// --- FLASH ---\n\n// FruitJam use w25q128 but sdk does not have .s for it, use q080 instead\n#define PICO_BOOT_STAGE2_CHOOSE_W25Q080 1\n\n#ifndef PICO_FLASH_SPI_CLKDIV\n#define PICO_FLASH_SPI_CLKDIV 2\n#endif\n\n// pico_cmake_set_default PICO_FLASH_SIZE_BYTES = (8 * 1024 * 1024)\n#ifndef PICO_FLASH_SIZE_BYTES\n#define PICO_FLASH_SIZE_BYTES (8 * 1024 * 1024)\n#endif\n\n// pico_cmake_set_default PICO_RP2350_A2_SUPPORTED = 1\n#ifndef PICO_RP2350_A2_SUPPORTED\n#define PICO_RP2350_A2_SUPPORTED 1\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/adafruit_fruit_jam/board.cmake",
    "content": "set(PICO_PLATFORM rp2350-arm-s)\nset(PICO_BOARD adafruit_fruit_jam)\nset(PICO_BOARD_HEADER_DIRS ${CMAKE_CURRENT_LIST_DIR})\n#set(OPENOCD_SERIAL E6614103E78E8324)\n\nset(CFG_TUH_RPI_PIO_USB 1)\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/adafruit_fruit_jam/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Fruit Jam - Mini RP2350\n   url: https://www.adafruit.com/product/6200\n*/\n\n#ifndef TUSB_BOARD_H\n#define TUSB_BOARD_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART and LED are already defined in pico-sdk board\n\n//--------------------------------------------------------------------+\n// PIO_USB\n//--------------------------------------------------------------------+\n// default to pico brain tester\n#define PICO_DEFAULT_PIO_USB_DP_PIN       1\n#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN   11\n#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1\n\n//--------------------------------------------------------------------\n// USB Host MAX3421E\n//--------------------------------------------------------------------\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/adafruit_metro_rp2350/adafruit_metro_rp2350.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef BOARDS_ADAFRUIT_METRO_RP2350_H\n#define BOARDS_ADAFRUIT_METRO_RP2350_H\n\n// required for board that is not part of pico-sdk\n\n// -----------------------------------------------------\n// NOTE: THIS HEADER IS ALSO INCLUDED BY ASSEMBLER SO\n//       SHOULD ONLY CONSIST OF PREPROCESSOR DIRECTIVES\n// -----------------------------------------------------\n\n// pico_cmake_set PICO_PLATFORM=rp2350\n\n// On some samples, the xosc can take longer to stabilize than is usual\n#ifndef PICO_XOSC_STARTUP_DELAY_MULTIPLIER\n#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 64\n#endif\n\n// For board detection\n#define ADAFRUIT_METRO_RP2350\n\n// --- RP2350 VARIANT ---\n#define PICO_RP2350A 0\n\n// --- UART ---\n#ifndef PICO_DEFAULT_UART\n#define PICO_DEFAULT_UART 0\n#endif\n#ifndef PICO_DEFAULT_UART_TX_PIN\n#define PICO_DEFAULT_UART_TX_PIN 0\n#endif\n#ifndef PICO_DEFAULT_UART_RX_PIN\n#define PICO_DEFAULT_UART_RX_PIN 1\n#endif\n\n// --- LED ---\n#ifndef PICO_DEFAULT_LED_PIN\n#define PICO_DEFAULT_LED_PIN 23\n#endif\n\n#ifndef PICO_DEFAULT_WS2812_PIN\n#define PICO_DEFAULT_WS2812_PIN 25\n#endif\n\n// --- I2C ---\n#ifndef PICO_DEFAULT_I2C\n#define PICO_DEFAULT_I2C 0\n#endif\n#ifndef PICO_DEFAULT_I2C_SDA_PIN\n#define PICO_DEFAULT_I2C_SDA_PIN 20\n#endif\n#ifndef PICO_DEFAULT_I2C_SCL_PIN\n#define PICO_DEFAULT_I2C_SCL_PIN 21\n#endif\n\n// --- SPI ---\n#ifndef PICO_DEFAULT_SPI\n#define PICO_DEFAULT_SPI 1\n#endif\n#ifndef PICO_DEFAULT_SPI_SCK_PIN\n#define PICO_DEFAULT_SPI_SCK_PIN 30\n#endif\n#ifndef PICO_DEFAULT_SPI_TX_PIN\n#define PICO_DEFAULT_SPI_TX_PIN 31\n#endif\n#ifndef PICO_DEFAULT_SPI_RX_PIN\n#define PICO_DEFAULT_SPI_RX_PIN 28\n#endif\n\n// --- FLASH ---\n\n// FruitJam use w25q128 but sdk does not have .s for it, use q080 instead\n#define PICO_BOOT_STAGE2_CHOOSE_W25Q080 1\n\n#ifndef PICO_FLASH_SPI_CLKDIV\n#define PICO_FLASH_SPI_CLKDIV 2\n#endif\n\n// pico_cmake_set_default PICO_FLASH_SIZE_BYTES = (8 * 1024 * 1024)\n#ifndef PICO_FLASH_SIZE_BYTES\n#define PICO_FLASH_SIZE_BYTES (8 * 1024 * 1024)\n#endif\n\n// pico_cmake_set_default PICO_RP2350_A2_SUPPORTED = 1\n#ifndef PICO_RP2350_A2_SUPPORTED\n#define PICO_RP2350_A2_SUPPORTED 1\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/adafruit_metro_rp2350/board.cmake",
    "content": "set(PICO_PLATFORM rp2350-arm-s)\nset(PICO_BOARD adafruit_metro_rp2350)\nset(PICO_BOARD_HEADER_DIRS ${CMAKE_CURRENT_LIST_DIR})\n#set(OPENOCD_SERIAL E6614103E78E8324)\n\nset(CFG_TUH_RPI_PIO_USB 1)\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/adafruit_metro_rp2350/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Metro RP2350\n   url: https://www.adafruit.com/product/6003\n*/\n\n#ifndef TUSB_BOARD_H\n#define TUSB_BOARD_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART and LED are already defined in pico-sdk board\n\n//--------------------------------------------------------------------+\n// PIO_USB\n//--------------------------------------------------------------------+\n// default to pico brain tester\n#define PICO_DEFAULT_PIO_USB_DP_PIN       32\n#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN   29\n#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1\n\n//--------------------------------------------------------------------\n// USB Host MAX3421E\n//--------------------------------------------------------------------\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/feather_rp2040_max3421/board.cmake",
    "content": "set(PICO_PLATFORM rp2040)\nset(PICO_BOARD adafruit_feather_rp2040)\n\n# Enable MAX3421E USB Host\nset(MAX3421_HOST 1)\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/feather_rp2040_max3421/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_BOARD_H\n#define TUSB_BOARD_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART and LED are already defined in pico-sdk board\n\n//--------------------------------------------------------------------+\n// PIO_USB\n//--------------------------------------------------------------------+\n\n#define PICO_DEFAULT_PIO_USB_DP_PIN       16\n#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN   18\n#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1\n\n//--------------------------------------------------------------------\n// USB Host MAX3421E\n//--------------------------------------------------------------------\n\n#ifdef PICO_DEFAULT_SPI\n#define MAX3421_SPI      PICO_DEFAULT_SPI // sdk v2\n#else\n#define MAX3421_SPI      PICO_DEFAULT_SPI_INSTANCE // sdk v1\n#endif\n\n#define MAX3421_SCK_PIN  PICO_DEFAULT_SPI_SCK_PIN\n#define MAX3421_MOSI_PIN PICO_DEFAULT_SPI_TX_PIN\n#define MAX3421_MISO_PIN PICO_DEFAULT_SPI_RX_PIN\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 9\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/pico_sdk/board.cmake",
    "content": "# This builds with settings based purely on the current PICO_BOARD set via the SDK\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/pico_sdk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_BOARD_H\n#define TUSB_BOARD_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART and LED are already defined in pico-sdk board\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/raspberry_pi_pico/board.cmake",
    "content": "set(PICO_PLATFORM rp2040)\nset(PICO_BOARD pico)\n#set(OPENOCD_SERIAL E6614103E719612F)\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/raspberry_pi_pico/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Pico\n   url: https://www.raspberrypi.com/products/raspberry-pi-pico/\n*/\n\n#ifndef TUSB_BOARD_H\n#define TUSB_BOARD_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART and LED are already defined in pico-sdk board\n\n//--------------------------------------------------------------------+\n// PIO_USB\n//--------------------------------------------------------------------+\n// default to pico brain tester\n#define PICO_DEFAULT_PIO_USB_DP_PIN       20\n#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN   22\n#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1\n\n//--------------------------------------------------------------------\n// USB Host MAX3421E\n//--------------------------------------------------------------------\n\n#ifdef PICO_DEFAULT_SPI\n#define MAX3421_SPI      PICO_DEFAULT_SPI // sdk v2\n#else\n#define MAX3421_SPI      PICO_DEFAULT_SPI_INSTANCE // sdk v1\n#endif\n\n#define MAX3421_SCK_PIN  PICO_DEFAULT_SPI_SCK_PIN\n#define MAX3421_MOSI_PIN PICO_DEFAULT_SPI_TX_PIN\n#define MAX3421_MISO_PIN PICO_DEFAULT_SPI_RX_PIN\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 9\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/raspberry_pi_pico2/board.cmake",
    "content": "set(PICO_PLATFORM rp2350-arm-s)\nset(PICO_BOARD pico2)\n#set(OPENOCD_SERIAL E6614103E77C5A24)\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/raspberry_pi_pico2/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Pico2\n   url: https://www.raspberrypi.com/products/raspberry-pi-pico-2/\n*/\n\n#ifndef TUSB_BOARD_H\n#define TUSB_BOARD_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART and LED are already defined in pico-sdk board\n\n//--------------------------------------------------------------------+\n// PIO_USB\n//--------------------------------------------------------------------+\n// default to pico brain tester\n#define PICO_DEFAULT_PIO_USB_DP_PIN       20\n#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN   22\n#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1\n\n//--------------------------------------------------------------------\n// USB Host MAX3421E\n//--------------------------------------------------------------------\n\n#ifdef PICO_DEFAULT_SPI\n#define MAX3421_SPI      PICO_DEFAULT_SPI // sdk v2\n#else\n#define MAX3421_SPI      PICO_DEFAULT_SPI_INSTANCE // sdk v1\n#endif\n\n#define MAX3421_SCK_PIN  PICO_DEFAULT_SPI_SCK_PIN\n#define MAX3421_MOSI_PIN PICO_DEFAULT_SPI_TX_PIN\n#define MAX3421_MISO_PIN PICO_DEFAULT_SPI_RX_PIN\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 9\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/raspberry_pi_pico_w/board.cmake",
    "content": "set(PICO_PLATFORM rp2040)\nset(PICO_BOARD pico_w)\n"
  },
  {
    "path": "hw/bsp/rp2040/boards/raspberry_pi_pico_w/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Pico\n   url: https://www.raspberrypi.com/products/raspberry-pi-pico/\n*/\n\n#ifndef TUSB_BOARD_H\n#define TUSB_BOARD_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART and LED are already defined in pico-sdk board\n\n//--------------------------------------------------------------------+\n// PIO_USB\n//--------------------------------------------------------------------+\n// default to pico brain tester\n#define PICO_DEFAULT_PIO_USB_DP_PIN       20\n#define PICO_DEFAULT_PIO_USB_VBUSEN_PIN   22\n#define PICO_DEFAULT_PIO_USB_VBUSEN_STATE 1\n\n//--------------------------------------------------------------------\n// USB Host MAX3421E\n//--------------------------------------------------------------------\n\n#ifdef PICO_DEFAULT_SPI\n#define MAX3421_SPI      PICO_DEFAULT_SPI // sdk v2\n#else\n#define MAX3421_SPI      PICO_DEFAULT_SPI_INSTANCE // sdk v1\n#endif\n\n#define MAX3421_SCK_PIN  PICO_DEFAULT_SPI_SCK_PIN\n#define MAX3421_MOSI_PIN PICO_DEFAULT_SPI_TX_PIN\n#define MAX3421_MISO_PIN PICO_DEFAULT_SPI_RX_PIN\n#define MAX3421_CS_PIN   10\n#define MAX3421_INTR_PIN 9\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Raspberry Pi\n*/\n\n#include \"pico/stdlib.h\"\n#include \"pico/binary_info.h\"\n#include \"pico/unique_id.h\"\n#include \"hardware/gpio.h\"\n#include \"hardware/sync.h\"\n#include \"hardware/resets.h\"\n#include \"hardware/clocks.h\"\n#include \"hardware/structs/ioqspi.h\"\n#include \"hardware/structs/sio.h\"\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n#if (CFG_TUH_ENABLED && CFG_TUH_RPI_PIO_USB) || (CFG_TUD_ENABLED && CFG_TUD_RPI_PIO_USB)\n#include \"pio_usb.h\"\n#endif\n\n#if CFG_TUH_ENABLED && CFG_TUH_MAX3421\n#include \"hardware/spi.h\"\nstatic void max3421_init(void);\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n// LED\n#if !defined(LED_PIN) && defined(PICO_DEFAULT_LED_PIN)\n#define LED_PIN               PICO_DEFAULT_LED_PIN\n#define LED_STATE_ON          (!(PICO_DEFAULT_LED_PIN_INVERTED))\n#endif\n\n// Button, if not defined use BOOTSEL button\n#ifndef BUTTON_PIN\n#define BUTTON_BOOTSEL\n#define BUTTON_STATE_ACTIVE   0\n#endif\n\n// UART\n#if !defined(UART_DEV) && defined(PICO_DEFAULT_UART) && defined(LIB_PICO_STDIO_UART) && \\\n  defined(PICO_DEFAULT_UART_TX_PIN) && defined(PICO_DEFAULT_UART_RX_PIN)\n#define UART_DEV              PICO_DEFAULT_UART\n#define UART_TX_PIN           PICO_DEFAULT_UART_TX_PIN\n#define UART_RX_PIN           PICO_DEFAULT_UART_RX_PIN\n#endif\n\n#ifdef UART_DEV\nstatic uart_inst_t *uart_inst;\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n#ifdef BUTTON_BOOTSEL\n// This example blinks the Picoboard LED when the BOOTSEL button is pressed.\n//\n// Picoboard has a button attached to the flash CS pin, which the bootrom\n// checks, and jumps straight to the USB bootcode if the button is pressed\n// (pulling flash CS low). We can check this pin in by jumping to some code in\n// SRAM (so that the XIP interface is not required), floating the flash CS\n// pin, and observing whether it is pulled low.\n//\n// This doesn't work if others are trying to access flash at the same time,\n// e.g. XIP streamer, or the other core.\nstatic bool __no_inline_not_in_flash_func(get_bootsel_button)(void) {\n  const uint CS_PIN_INDEX = 1;\n\n  // Must disable interrupts, as interrupt handlers may be in flash, and we\n  // are about to temporarily disable flash access!\n  uint32_t flags = save_and_disable_interrupts();\n\n  // Set chip select to Hi-Z\n  hw_write_masked(&ioqspi_hw->io[CS_PIN_INDEX].ctrl,\n                  GPIO_OVERRIDE_LOW << IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_LSB,\n                  IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS);\n\n  // Note we can't call into any sleep functions in flash right now\n  for (volatile int i = 0; i < 1000; ++i) {\n    __nop();\n  }\n\n  // The HI GPIO registers in SIO can observe and control the 6 QSPI pins.\n  // Note the button pulls the pin *low* when pressed.\n\n  #ifdef __ARM_ARCH_6M__ // CM0 for rp2040\n    #define CS_BIT (1u << 1)\n  #else // rp2350 (cm33/risv)\n    #define CS_BIT SIO_GPIO_HI_IN_QSPI_CSN_BITS\n  #endif\n  bool button_state = (sio_hw->gpio_hi_in & CS_BIT);\n\n  // Need to restore the state of chip select, else we are going to have a\n  // bad time when we return to code in flash!\n  hw_write_masked(&ioqspi_hw->io[CS_PIN_INDEX].ctrl,\n                  GPIO_OVERRIDE_NORMAL << IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_LSB,\n                  IO_QSPI_GPIO_QSPI_SS_CTRL_OEOVER_BITS);\n\n  restore_interrupts(flags);\n\n  return button_state;\n}\n#endif\n\n//------------- Segger RTT retarget -------------//\n#if defined(LOGGER_RTT)\n// Logging with RTT\n// - If RTT Control Block is not found by 'Auto Detection` try to use 'Search Range` with '0x20000000 0x10000'\n// - SWD speed is rather slow around 1000Khz\n#include \"pico/stdio/driver.h\"\n#include \"SEGGER_RTT.h\"\n\nstatic void stdio_rtt_write (const char *buf, int length) {\n  SEGGER_RTT_Write(0, buf, (unsigned) length);\n}\n\nstatic int stdio_rtt_read (char *buf, int len) {\n  return (int) SEGGER_RTT_Read(0, buf, (unsigned) len);\n}\n\nstatic stdio_driver_t stdio_rtt = {\n  .out_chars = stdio_rtt_write,\n  .out_flush = NULL,\n  .in_chars = stdio_rtt_read\n};\n\nvoid stdio_rtt_init(void) {\n  stdio_set_driver_enabled(&stdio_rtt, true);\n}\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nvoid board_init(void)\n{\n#if (CFG_TUH_ENABLED && CFG_TUH_RPI_PIO_USB) || (CFG_TUD_ENABLED && CFG_TUD_RPI_PIO_USB)\n  // Set the system clock to a multiple of 12mhz for bit-banging USB with pico-usb\n  set_sys_clock_khz(120000, true);\n  // set_sys_clock_khz(180000, true);\n  // set_sys_clock_khz(192000, true);\n  // set_sys_clock_khz(240000, true);\n  // set_sys_clock_khz(264000, true);\n\n#ifdef PICO_DEFAULT_PIO_USB_VBUSEN_PIN\n  gpio_init(PICO_DEFAULT_PIO_USB_VBUSEN_PIN);\n  gpio_set_dir(PICO_DEFAULT_PIO_USB_VBUSEN_PIN, GPIO_OUT);\n  gpio_put(PICO_DEFAULT_PIO_USB_VBUSEN_PIN, PICO_DEFAULT_PIO_USB_VBUSEN_STATE);\n#endif\n\n  // rp2040 use pico-pio-usb for host tuh_configure() can be used to passed pio configuration to the host stack\n  // Note: tuh_configure() must be called before tuh_init()\n  pio_usb_configuration_t pio_cfg = PIO_USB_DEFAULT_CONFIG;\n  pio_cfg.pin_dp = PICO_DEFAULT_PIO_USB_DP_PIN;\n  tuh_configure(BOARD_TUH_RHPORT, TUH_CFGID_RPI_PIO_USB_CONFIGURATION, &pio_cfg);\n#endif\n\n#ifdef LED_PIN\n  bi_decl(bi_1pin_with_name(LED_PIN, \"LED\"));\n  gpio_init(LED_PIN);\n  gpio_set_dir(LED_PIN, GPIO_OUT);\n#endif\n\n  // Button\n#ifndef BUTTON_BOOTSEL\n#endif\n\n#ifdef UART_DEV\n  bi_decl(bi_2pins_with_func(UART_TX_PIN, UART_RX_PIN, GPIO_FUNC_UART));\n  uart_inst = uart_get_instance(UART_DEV);\n  stdio_uart_init_full(uart_inst, CFG_BOARD_UART_BAUDRATE, UART_TX_PIN, UART_RX_PIN);\n#endif\n\n#if defined(LOGGER_RTT)\n  stdio_rtt_init();\n#endif\n\n#if CFG_TUD_ENABLED\n  // TODO probably set up device mode?\n#endif\n\n#if CFG_TUH_ENABLED\n  #if CFG_TUH_MAX3421\n  max3421_init();\n  #endif\n#endif\n\n#if !CFG_TUD_ENABLED && !CFG_TUH_ENABLED\n  // board test exxample, reset usb controller\n  reset_block(RESETS_RESET_USBCTRL_BITS);\n  unreset_block_wait(RESETS_RESET_USBCTRL_BITS);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\nvoid board_led_write(bool state) {\n  (void) state;\n\n#ifdef LED_PIN\n  gpio_put(LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef BUTTON_BOOTSEL\n  return BUTTON_STATE_ACTIVE == get_bootsel_button();\n#else\n  return 0;\n#endif\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  pico_unique_board_id_t pico_id;\n  pico_get_unique_board_id(&pico_id);\n\n  size_t len = PICO_UNIQUE_BOARD_ID_SIZE_BYTES;\n  if (len > max_len) {\n    len = max_len;\n  }\n\n  memcpy(id, pico_id.id, len);\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n#ifdef UART_DEV\n  int count = 0;\n  while ((count < len) && uart_is_readable(uart_inst)) {\n    buf[count] = uart_getc(uart_inst);\n    count++;\n  }\n  return count;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  char const *bufch = (char const *) buf;\n  for ( int i = 0; i < len; i++ ) {\n    uart_putc(uart_inst, bufch[i]);\n  }\n  return len;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\nint board_getchar(void) {\n  return getchar_timeout_us(0);\n}\n\nvoid board_putchar(int c) {\n  stdio_putchar(c);\n}\n\nvoid board_init_after_tusb(void) {\n  // nothing to do\n}\n\nvoid board_reset_to_bootloader(void) {\n  // not implemented\n}\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n// rp2040 implementation will install appropriate handler when initializing\n// tinyusb. There is no need to forward IRQ from application\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// API: SPI transfer with MAX3421E, must be implemented by application\n//--------------------------------------------------------------------+\n#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\n\nvoid max3421_int_handler(uint gpio, uint32_t event_mask) {\n  if (!(gpio == MAX3421_INTR_PIN && event_mask & GPIO_IRQ_EDGE_FALL)) {\n    return;\n  }\n  tuh_int_handler(BOARD_TUH_RHPORT, true);\n}\n\nstatic void max3421_init(void) {\n  // CS pin\n  gpio_init(MAX3421_CS_PIN);\n  gpio_set_dir(MAX3421_CS_PIN, GPIO_OUT);\n  gpio_put(MAX3421_CS_PIN, true);\n\n  // Interrupt pin\n  gpio_init(MAX3421_INTR_PIN);\n  gpio_set_dir(MAX3421_INTR_PIN, GPIO_IN);\n  gpio_pull_up(MAX3421_INTR_PIN);\n  gpio_set_irq_enabled_with_callback(MAX3421_INTR_PIN, GPIO_IRQ_EDGE_FALL, true, max3421_int_handler);\n\n  // SPI init\n  spi_init(MAX3421_SPI, 4*1000000ul);\n  gpio_set_function(MAX3421_SCK_PIN, GPIO_FUNC_SPI);\n  gpio_set_function(MAX3421_MOSI_PIN, GPIO_FUNC_SPI);\n  gpio_set_function(MAX3421_MISO_PIN, GPIO_FUNC_SPI);\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wnull-dereference\"\n#endif\n  spi_set_format(MAX3421_SPI, 8, SPI_CPOL_0, SPI_CPHA_0, SPI_MSB_FIRST);\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n}\n\n//// API to enable/disable MAX3421 INTR pin interrupt\nvoid tuh_max3421_int_api(uint8_t rhport, bool enabled) {\n  (void) rhport;\n  irq_set_enabled(IO_IRQ_BANK0, enabled);\n}\n\n// API to control MAX3421 SPI CS\nvoid tuh_max3421_spi_cs_api(uint8_t rhport, bool active) {\n  (void) rhport;\n  gpio_put(MAX3421_CS_PIN, !active);\n}\n\n// API to transfer data with MAX3421 SPI\n// Either tx_buf or rx_buf can be NULL, which means transfer is write or read only\nbool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const* tx_buf, uint8_t* rx_buf, size_t xfer_bytes) {\n  (void) rhport;\n\n  if (tx_buf == NULL && rx_buf == NULL) {\n    return false;\n  }\n\n  int ret;\n\n  if (tx_buf == NULL) {\n    ret = spi_read_blocking(MAX3421_SPI, 0, rx_buf, xfer_bytes);\n  }else if (rx_buf == NULL) {\n    ret = spi_write_blocking(MAX3421_SPI, tx_buf, xfer_bytes);\n  }else {\n    ret = spi_write_read_blocking(MAX3421_SPI, tx_buf, rx_buf, xfer_bytes);\n  }\n\n  return ret == (int) xfer_bytes;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rp2040/family.cmake",
    "content": "cmake_minimum_required(VERSION 3.13)\ninclude_guard(GLOBAL)\n\nif (NOT BOARD)\n\tmessage(\"BOARD not specified, defaulting to pico_sdk\")\n\tset(BOARD pico_sdk)\nendif()\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n#if (TOOLCHAIN STREQUAL \"clang\")\n#\tset(PICO_COMPILER \"pico_arm_clang\")\n#else()\n#\tset(PICO_COMPILER \"pico_arm_gcc\")\n#endif()\n\n# add the SDK in case we are standalone tinyusb example (noop if already present)\ninclude(${CMAKE_CURRENT_LIST_DIR}/pico_sdk_import.cmake)\n\n# include basic family CMake functionality\nset(FAMILY_MCUS RP2040)\n\nif (PICO_PLATFORM STREQUAL \"rp2040\")\n\tset(JLINK_DEVICE rp2040_m0_0)\n\tset(OPENOCD_TARGET rp2040)\nelseif (PICO_PLATFORM STREQUAL \"rp2350-arm-s\" OR PICO_PLATFORM STREQUAL \"rp2350\")\n\tset(JLINK_DEVICE rp2350_m33_0)\n\tset(OPENOCD_TARGET rp2350)\nelseif (PICO_PLATFORM STREQUAL \"rp2350-riscv\")\n\tset(JLINK_DEVICE rp2350_riscv_0)\n\tset(OPENOCD_TARGET rp2350-riscv)\nendif()\n\nif (NOT OPENOCD_OPTION)\n\tset(OPENOCD_OPTION \"-f interface/cmsis-dap.cfg -f target/${OPENOCD_TARGET}.cfg -c \\\"adapter speed 5000\\\"\")\nendif()\n\nif (NOT PICO_TINYUSB_PATH)\n\tset(PICO_TINYUSB_PATH ${TOP})\nendif()\n\nif (NOT TINYUSB_OPT_OS)\n\tset(TINYUSB_OPT_OS OPT_OS_PICO)\nendif()\n\n#------------------------------------\n# Base config for both device and host; wrapped by SDK's tinyusb_common\n#------------------------------------\nadd_library(tinyusb_common_base INTERFACE)\n\ntarget_sources(tinyusb_common_base INTERFACE\n\t${TOP}/src/tusb.c\n\t${TOP}/src/common/tusb_fifo.c\n\t)\n\ntarget_include_directories(tinyusb_common_base INTERFACE\n\t${TOP}/src\n\t)\n\nif(DEFINED LOG)\n\tset(TINYUSB_DEBUG_LEVEL ${LOG})\nelseif (CMAKE_BUILD_TYPE STREQUAL \"Debug\")\n\tmessage(\"Compiling TinyUSB with CFG_TUSB_DEBUG=1\")\n\tset(TINYUSB_DEBUG_LEVEL 1)\nelse ()\n\tset(TINYUSB_DEBUG_LEVEL 0)\nendif()\n\ntarget_compile_definitions(tinyusb_common_base INTERFACE\n\tCFG_TUSB_MCU=OPT_MCU_RP2040\n\tCFG_TUSB_OS=${TINYUSB_OPT_OS}\n\tCFG_TUSB_DEBUG=${TINYUSB_DEBUG_LEVEL}\n)\n\nif (CFG_TUH_RPI_PIO_USB)\n\ttarget_compile_definitions(tinyusb_common_base INTERFACE\n\t\tCFG_TUH_RPI_PIO_USB=1\n\t)\nendif()\n\ntarget_link_libraries(tinyusb_common_base INTERFACE\n\thardware_structs\n\thardware_irq\n\thardware_resets\n\tpico_sync\n\t)\n\n#------------------------------------\n# Base config for device mode; wrapped by SDK's tinyusb_device\n#------------------------------------\nadd_library(tinyusb_device_base INTERFACE)\ntarget_sources(tinyusb_device_base INTERFACE\n\t\t${TOP}/src/portable/raspberrypi/rp2040/dcd_rp2040.c\n\t\t${TOP}/src/portable/raspberrypi/rp2040/rp2040_usb.c\n\t\t${TOP}/src/device/usbd.c\n\t\t${TOP}/src/device/usbd_control.c\n\t\t${TOP}/src/class/audio/audio_device.c\n\t\t${TOP}/src/class/cdc/cdc_device.c\n\t\t${TOP}/src/class/dfu/dfu_device.c\n\t\t${TOP}/src/class/dfu/dfu_rt_device.c\n\t\t${TOP}/src/class/hid/hid_device.c\n\t\t${TOP}/src/class/midi/midi_device.c\n\t\t${TOP}/src/class/msc/msc_device.c\n\t\t${TOP}/src/class/mtp/mtp_device.c\n\t\t${TOP}/src/class/net/ecm_rndis_device.c\n\t\t${TOP}/src/class/net/ncm_device.c\n\t\t${TOP}/src/class/printer/printer_device.c\n\t\t${TOP}/src/class/usbtmc/usbtmc_device.c\n\t\t${TOP}/src/class/vendor/vendor_device.c\n\t\t${TOP}/src/class/video/video_device.c\n\t\t)\n\n#------------------------------------\n# Base config for host mode; wrapped by SDK's tinyusb_host\n#------------------------------------\nadd_library(tinyusb_host_base INTERFACE)\ntarget_sources(tinyusb_host_base INTERFACE\n\t\t${TOP}/src/portable/raspberrypi/rp2040/hcd_rp2040.c\n\t\t${TOP}/src/portable/raspberrypi/rp2040/rp2040_usb.c\n\t\t${TOP}/src/host/usbh.c\n\t\t${TOP}/src/host/hub.c\n\t\t${TOP}/src/class/cdc/cdc_host.c\n\t\t${TOP}/src/class/hid/hid_host.c\n\t\t${TOP}/src/class/midi/midi_host.c\n\t\t${TOP}/src/class/msc/msc_host.c\n\t\t${TOP}/src/class/vendor/vendor_host.c\n\t\t)\n\n# Sometimes have to do host specific actions in mostly common functions\ntarget_compile_definitions(tinyusb_host_base INTERFACE\n\t\tRP2040_USB_HOST_MODE=1\n)\n\n#------------------------------------\n# Host MAX3421\n#------------------------------------\nadd_library(tinyusb_host_max3421 INTERFACE)\ntarget_sources(tinyusb_host_max3421 INTERFACE\n\t${TOP}/src/portable/analog/max3421/hcd_max3421.c\n\t)\ntarget_compile_definitions(tinyusb_host_max3421 INTERFACE\n\tCFG_TUH_MAX3421=1\n\t)\ntarget_link_libraries(tinyusb_host_max3421 INTERFACE\n\thardware_spi\n\t)\n\n#------------------------------------\n# BSP & Additions\n#------------------------------------\nadd_library(tinyusb_bsp INTERFACE)\ntarget_sources(tinyusb_bsp INTERFACE\n\t${TOP}/hw/bsp/rp2040/family.c\n\t)\ntarget_include_directories(tinyusb_bsp INTERFACE\n\t${TOP}/hw\n\t${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}\n\t)\ntarget_link_libraries(tinyusb_bsp INTERFACE\n\tpico_unique_id\n\thardware_clocks\n\t)\n\n# tinyusb_additions will hold our extra settings for examples\nadd_library(tinyusb_additions INTERFACE)\n\nif (PICO_PLATFORM STREQUAL rp2040)\ntarget_compile_definitions(tinyusb_additions INTERFACE\n\tPICO_RP2040_USB_DEVICE_ENUMERATION_FIX=1\n\tPICO_RP2040_USB_DEVICE_UFRAME_FIX=1\n\t)\nendif ()\n\nif(LOGGER STREQUAL \"RTT\" OR LOGGER STREQUAL \"rtt\")\n\ttarget_compile_definitions(tinyusb_additions INTERFACE\n\t\t\tLOGGER_RTT\n\t\t\t#SEGGER_RTT_MODE_DEFAULT=SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL\n\t)\n\n\ttarget_sources(tinyusb_additions INTERFACE\n\t\t\t${TOP}/lib/SEGGER_RTT/RTT/SEGGER_RTT.c\n\t)\n\n\tset_source_files_properties(${TOP}/lib/SEGGER_RTT/RTT/SEGGER_RTT.c\n\t\tPROPERTIES\n\t\tCOMPILE_FLAGS \"-Wno-cast-qual -Wno-cast-align -Wno-sign-conversion\")\n\n\ttarget_include_directories(tinyusb_additions INTERFACE\n\t\t\t${TOP}/lib/SEGGER_RTT/RTT\n\t)\nendif()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_add_default_example_warnings TARGET)\n  # Apply warnings to all TinyUSB interface library sources as well as examples sources\n  # we cannot set compile options for target since it will not propagate to INTERFACE sources then picosdk files\n  foreach(TINYUSB_TARGET IN ITEMS tinyusb_common_base tinyusb_device_base tinyusb_host_base tinyusb_host_max3421 tinyusb_bsp)\n    get_target_property(TINYUSB_SOURCES ${TINYUSB_TARGET} INTERFACE_SOURCES)\n    set_source_files_properties(${TINYUSB_SOURCES} PROPERTIES COMPILE_OPTIONS \"${WARN_FLAGS_${CMAKE_C_COMPILER_ID}}\")\n  endforeach()\n\n  # Also apply to example sources, but filter out any source files from lib/ (e.g. fatfs)\n  get_target_property(EXAMPLE_SOURCES ${TARGET} SOURCES)\n  set(FILTERED_SOURCES \"\")\n  foreach(SOURCE_FILE IN LISTS EXAMPLE_SOURCES)\n    string(FIND \"${SOURCE_FILE}\" \"${TOP}/lib\" FOUND_POS)\n    if(FOUND_POS EQUAL -1)\n      list(APPEND FILTERED_SOURCES ${SOURCE_FILE})\n    endif()\n  endforeach()\n  set_source_files_properties(${FILTERED_SOURCES} PROPERTIES COMPILE_OPTIONS \"${WARN_FLAGS_${CMAKE_C_COMPILER_ID}}\")\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 12.0 AND NO_WARN_RWX_SEGMENTS_SUPPORTED)\n      target_link_options(${TARGET} PRIVATE \"LINKER:--no-warn-rwx-segments\")\n    endif()\n\n    if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 10.0)\n      target_compile_options(${TARGET} PRIVATE -Wconversion)\n    endif()\n\n    if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 8.0)\n      target_compile_options(${TARGET} PRIVATE -Wcast-function-type -Wstrict-overflow)\n    endif()\n\n    if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 6.0)\n      target_compile_options(${TARGET} PRIVATE -Wno-strict-aliasing)\n    endif()\n  endif()\nendfunction()\n\n\n# TODO merge with family_configure_common from family_support.cmake\nfunction(family_configure_target TARGET RTOS)\n\tif (RTOS STREQUAL noos OR RTOS STREQUAL \"\")\n\t\tset(RTOS_SUFFIX \"\")\n\telse()\n\t\tset(RTOS_SUFFIX _${RTOS})\n\tendif()\n\t# export RTOS_SUFFIX to parent scope\n\tset(RTOS_SUFFIX ${RTOS_SUFFIX} PARENT_SCOPE)\n\n\t# compile define from command line\n\tif(DEFINED CFLAGS_CLI)\n\t\tseparate_arguments(CFLAGS_CLI)\n\t\ttarget_compile_options(${TARGET} PUBLIC ${CFLAGS_CLI})\n\tendif()\n\n\tpico_add_extra_outputs(${TARGET})\n\tpico_enable_stdio_uart(${TARGET} 1)\n\n  target_link_options(${TARGET} PUBLIC \"LINKER:-Map=$<TARGET_FILE:${TARGET}>.map\")\n\ttarget_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_board${RTOS_SUFFIX} tinyusb_additions)\n\n  family_flash_openocd(${TARGET})\n\tfamily_flash_jlink(${TARGET})\n\n\t# Generate linkermap target and post build. LINKERMAP_OPTION can be set with -D to change default options\n\tfamily_add_bloaty(${TARGET})\n  family_add_linkermap(${TARGET})\n  family_add_membrowse(${TARGET})\nendfunction()\n\n\nfunction(rp2040_family_configure_example_warnings TARGET)\n\tif (NOT PICO_TINYUSB_NO_EXAMPLE_WARNINGS)\n\t\tfamily_add_default_example_warnings(${TARGET})\n\tendif()\n\tif(CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n\t\ttarget_compile_options(${TARGET} PRIVATE -Wno-unreachable-code)\n\tendif()\n\tsuppress_tinyusb_warnings()\nendfunction()\n\n\nfunction(family_configure_device_example TARGET RTOS)\n\tfamily_configure_target(${TARGET} ${RTOS})\n\ttarget_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_device${RTOS_SUFFIX})\n\trp2040_family_configure_example_warnings(${TARGET})\nendfunction()\n\n\nfunction(family_add_pico_pio_usb TARGET)\n\ttarget_link_libraries(${TARGET} PUBLIC tinyusb_pico_pio_usb)\nendfunction()\n\n\n# since Pico-PIO_USB compiler support may lag, and change from version to version, add a function that pico-sdk/pico-examples\n# can check (if present) in case the user has updated their TinyUSB\nfunction(is_compiler_supported_by_pico_pio_usb OUTVAR)\n\tif ((NOT CMAKE_C_COMPILER_ID STREQUAL \"GNU\"))\n\t\tSET(${OUTVAR} 0 PARENT_SCOPE)\n\telse()\n\t\tset(${OUTVAR} 1 PARENT_SCOPE)\n\tendif()\nendfunction()\n\nfunction(family_configure_host_example TARGET RTOS)\n\tfamily_configure_target(${TARGET} ${RTOS})\n\ttarget_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_host${RTOS_SUFFIX})\n\trp2040_family_configure_example_warnings(${TARGET})\n\n\t# For rp2040 enable pico-pio-usb\n\tif (TARGET tinyusb_pico_pio_usb)\n\t\t# Pico-PIO-USB does not compile with all pico-sdk supported compilers, so check before enabling it\n\t\tis_compiler_supported_by_pico_pio_usb(PICO_PIO_USB_COMPILER_SUPPORTED)\n\t\tif (PICO_PIO_USB_COMPILER_SUPPORTED)\n\t\t\tfamily_add_pico_pio_usb(${TARGET})\n\t\tendif()\n\tendif()\n\n\t# for max3421 host\n\tif (MAX3421_HOST STREQUAL \"1\")\n\t\ttarget_link_libraries(${TARGET} PUBLIC tinyusb_host_max3421)\n\tendif()\nendfunction()\n\n\nfunction(family_configure_dual_usb_example TARGET RTOS)\n\tfamily_configure_target(${TARGET} ${RTOS})\n\t# require tinyusb_pico_pio_usb\n\ttarget_link_libraries(${TARGET} PUBLIC pico_stdlib tinyusb_device tinyusb_host tinyusb_pico_pio_usb )\n\trp2040_family_configure_example_warnings(${TARGET})\nendfunction()\n\n\nfunction(check_and_add_pico_pio_usb_support)\n\t# check for pico_generate_pio_header (as depending on environment we may be called before SDK is\n\t# initialized in which case it isn't available yet), and only do the initialization once\n\tif (COMMAND pico_generate_pio_header AND NOT TARGET tinyusb_pico_pio_usb)\n\t\t#------------------------------------\n\t\t# PIO USB for both host and device\n\t\t#------------------------------------\n\n\t\tif (NOT DEFINED PICO_PIO_USB_PATH)\n\t\t\tset(PICO_PIO_USB_PATH \"${TOP}/hw/mcu/raspberry_pi/Pico-PIO-USB\")\n\t\tendif()\n\n\t\tif (EXISTS ${PICO_PIO_USB_PATH}/src/pio_usb.c)\n\t\t\tadd_library(tinyusb_pico_pio_usb INTERFACE)\n\t\t\ttarget_sources(tinyusb_device_base INTERFACE\n\t\t\t\t\t${TOP}/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c\n\t\t\t\t\t)\n\t\t\ttarget_sources(tinyusb_host_base INTERFACE\n\t\t\t\t\t${TOP}/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c\n\t\t\t\t\t)\n\n\t\t\ttarget_sources(tinyusb_pico_pio_usb INTERFACE\n\t\t\t\t\t${PICO_PIO_USB_PATH}/src/pio_usb.c\n\t\t\t\t\t${PICO_PIO_USB_PATH}/src/pio_usb_host.c\n\t\t\t\t\t${PICO_PIO_USB_PATH}/src/pio_usb_device.c\n\t\t\t\t\t${PICO_PIO_USB_PATH}/src/usb_crc.c\n\t\t\t\t\t)\n\n\t\t\ttarget_include_directories(tinyusb_pico_pio_usb INTERFACE\n\t\t\t\t\t${PICO_PIO_USB_PATH}/src\n\t\t\t\t\t)\n\n\t\t\ttarget_link_libraries(tinyusb_pico_pio_usb INTERFACE\n\t\t\t\t\thardware_dma\n\t\t\t\t\thardware_pio\n\t\t\t\t\tpico_multicore\n\t\t\t\t\t)\n\n\t\t\ttarget_compile_definitions(tinyusb_pico_pio_usb INTERFACE\n\t\t\t\t\tPIO_USB_USE_TINYUSB\n\t\t\t\t\t)\n\n\t\t\tpico_generate_pio_header(tinyusb_pico_pio_usb ${PICO_PIO_USB_PATH}/src/usb_tx.pio)\n\t\t\tpico_generate_pio_header(tinyusb_pico_pio_usb ${PICO_PIO_USB_PATH}/src/usb_rx.pio)\n\t\tendif()\n\tendif()\nendfunction()\n\n# Try to add Pico-PIO_USB support now for the case where this file is included directly\n# after Pico SDK initialization, but without using the family_ functions (as is the case\n# when included by the SDK itself)\ncheck_and_add_pico_pio_usb_support()\n\n\nfunction(family_initialize_project PROJECT DIR)\n\t# call the original version of this function from family_common.cmake\n\t_family_initialize_project(${PROJECT} ${DIR})\n\tenable_language(C CXX ASM)\n\tpico_sdk_init()\n\n\t# now re-check for adding Pico-PIO_USB support now SDK is definitely available\n\tcheck_and_add_pico_pio_usb_support()\nendfunction()\n\n\n# This method must be called from the project scope to suppress known warnings in TinyUSB source files\nfunction(suppress_tinyusb_warnings)\n\t# some of these are pretty silly warnings only occurring in some older GCC versions 9 or prior\n\tif (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n\t\tif (CMAKE_C_COMPILER_VERSION VERSION_LESS 10.0)\n\t\t\tset(CONVERSION_WARNING_FILES\n\t\t\t\t${PICO_TINYUSB_PATH}/src/tusb.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/common/tusb_fifo.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/device/usbd.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/device/usbd_control.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/host/usbh.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/cdc/cdc_device.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/cdc/cdc_host.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/hid/hid_device.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/hid/hid_host.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/audio/audio_device.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/dfu/dfu_device.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/dfu/dfu_rt_device.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/midi/midi_device.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/usbtmc/usbtmc_device.c\n\t\t\t\t${PICO_TINYUSB_PATH}/src/portable/raspberrypi/rp2040/hcd_rp2040.c\n\t\t\t\t)\n\t\t\tforeach(SOURCE_FILE IN LISTS CONVERSION_WARNING_FILES)\n\t\t\t\tset_source_files_properties(${SOURCE_FILE} PROPERTIES COMPILE_FLAGS \"-Wno-conversion\")\n\t\t\tendforeach()\n\t\tendif()\n\n\t\tif (TARGET tinyusb_pico_pio_usb)\n\t\t\tset_source_files_properties(\n\t\t\t\t\t${PICO_TINYUSB_PATH}/hw/mcu/raspberry_pi/Pico-PIO-USB/src/pio_usb_device.c\n\t\t\t\t\t${PICO_TINYUSB_PATH}/hw/mcu/raspberry_pi/Pico-PIO-USB/src/pio_usb.c\n\t\t\t\t\t${PICO_TINYUSB_PATH}/hw/mcu/raspberry_pi/Pico-PIO-USB/src/pio_usb_host.c\n\t\t\t\t\t${PICO_TINYUSB_PATH}/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c\n\t\t\t\t\tPROPERTIES\n\t\t\t\t\tCOMPILE_FLAGS \"-Wno-conversion -Wno-cast-qual -Wno-attributes\")\n\t\tendif()\n\telseif(CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n\t\tset_source_files_properties(\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/cdc/cdc_device.c\n\t\t\t\tCOMPILE_FLAGS \"-Wno-unreachable-code\")\n\t\tset_source_files_properties(\n\t\t\t\t${PICO_TINYUSB_PATH}/src/class/cdc/cdc_host.c\n\t\t\t\tCOMPILE_FLAGS \"-Wno-unreachable-code-fallthrough\")\n\t\tset_source_files_properties(\n\t\t\t\t${PICO_TINYUSB_PATH}/lib/fatfs/source/ff.c\n\t\t\t\tPROPERTIES\n\t\t\t\tCOMPILE_FLAGS \"-Wno-cast-qual\")\n\tendif()\nendfunction()\n"
  },
  {
    "path": "hw/bsp/rp2040/pico_sdk_import.cmake",
    "content": "# This is a copy of <PICO_SDK_PATH>/external/pico_sdk_import.cmake\n\n# This can be dropped into an external project to help locate this SDK\n# It should be include()ed prior to project()\n\nif (DEFINED ENV{PICO_SDK_PATH} AND (NOT PICO_SDK_PATH))\n    set(PICO_SDK_PATH $ENV{PICO_SDK_PATH})\n    message(\"Using PICO_SDK_PATH from environment ('${PICO_SDK_PATH}')\")\nendif ()\n\nif (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT} AND (NOT PICO_SDK_FETCH_FROM_GIT))\n    set(PICO_SDK_FETCH_FROM_GIT $ENV{PICO_SDK_FETCH_FROM_GIT})\n    message(\"Using PICO_SDK_FETCH_FROM_GIT from environment ('${PICO_SDK_FETCH_FROM_GIT}')\")\nendif ()\n\nif (DEFINED ENV{PICO_SDK_FETCH_FROM_GIT_PATH} AND (NOT PICO_SDK_FETCH_FROM_GIT_PATH))\n    set(PICO_SDK_FETCH_FROM_GIT_PATH $ENV{PICO_SDK_FETCH_FROM_GIT_PATH})\n    message(\"Using PICO_SDK_FETCH_FROM_GIT_PATH from environment ('${PICO_SDK_FETCH_FROM_GIT_PATH}')\")\nendif ()\n\nset(PICO_SDK_PATH \"${PICO_SDK_PATH}\" CACHE PATH \"Path to the Raspberry Pi Pico SDK\")\nset(PICO_SDK_FETCH_FROM_GIT \"${PICO_SDK_FETCH_FROM_GIT}\" CACHE BOOL \"Set to ON to fetch copy of SDK from git if not otherwise locatable\")\nset(PICO_SDK_FETCH_FROM_GIT_PATH \"${PICO_SDK_FETCH_FROM_GIT_PATH}\" CACHE FILEPATH \"location to download SDK\")\n\nif (NOT PICO_SDK_PATH)\n    if (PICO_SDK_FETCH_FROM_GIT)\n        include(FetchContent)\n        set(FETCHCONTENT_BASE_DIR_SAVE ${FETCHCONTENT_BASE_DIR})\n        if (PICO_SDK_FETCH_FROM_GIT_PATH)\n            get_filename_component(FETCHCONTENT_BASE_DIR \"${PICO_SDK_FETCH_FROM_GIT_PATH}\" REALPATH BASE_DIR \"${CMAKE_SOURCE_DIR}\")\n        endif ()\n        FetchContent_Declare(\n                pico_sdk\n                GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk\n                GIT_TAG master\n        )\n        if (NOT pico_sdk)\n            message(\"Downloading Raspberry Pi Pico SDK\")\n            FetchContent_Populate(pico_sdk)\n            set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR})\n        endif ()\n        set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE})\n    else ()\n        message(FATAL_ERROR\n                \"SDK location was not specified. Please set PICO_SDK_PATH or set PICO_SDK_FETCH_FROM_GIT to on to fetch from git.\"\n                )\n    endif ()\nendif ()\n\nget_filename_component(PICO_SDK_PATH \"${PICO_SDK_PATH}\" REALPATH BASE_DIR \"${CMAKE_BINARY_DIR}\")\nif (NOT EXISTS ${PICO_SDK_PATH})\n    message(FATAL_ERROR \"Directory '${PICO_SDK_PATH}' not found\")\nendif ()\n\nset(PICO_SDK_INIT_CMAKE_FILE ${PICO_SDK_PATH}/pico_sdk_init.cmake)\nif (NOT EXISTS ${PICO_SDK_INIT_CMAKE_FILE})\n    message(FATAL_ERROR \"Directory '${PICO_SDK_PATH}' does not appear to contain the Raspberry Pi Pico SDK\")\nendif ()\n\nset(PICO_SDK_PATH ${PICO_SDK_PATH} CACHE PATH \"Path to the Raspberry Pi Pico SDK\" FORCE)\n\ninclude(${PICO_SDK_INIT_CMAKE_FILE})\n"
  },
  {
    "path": "hw/bsp/rp2040/rp2040-openocd.cfg",
    "content": "source [find interface/cmsis-dap.cfg]\nadapter speed 5000\nsource [find target/rp2040.cfg]\n"
  },
  {
    "path": "hw/bsp/rp2040/rp2350-openocd.cfg",
    "content": "source [find interface/cmsis-dap.cfg]\nadapter speed 5000\nsource [find target/rp2350.cfg]\n"
  },
  {
    "path": "hw/bsp/rw61x/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"fsl_device_registers.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0 // RW61x has FPU but is disabled due to using cortex-m33-nodsp-nofp.mk\n#define configENABLE_TRUSTZONE                  0\n#define configRUN_FREERTOS_SECURE_ONLY          1 // Cortex-M33 runs in secure mode after reset by default!\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rw61x/boards/frdm_rw612/board.cmake",
    "content": "set(MCU_VARIANT RW612)\nset(MCU_CORE    RW612)\n\nset(JLINK_DEVICE ${MCU_VARIANT})\nset(PYOCD_TARGET rw612eta2i)\n\nset(BOARD_DIR ${SDK_DIR}/boards/frdmrw612)\n\nset(PORT 1)\n\n\nfunction(update_board BOARD_TARGET)\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CPU_RW612ETA2I\n    BOARD_TUD_RHPORT=${PORT}\n    BOARD_TUH_RHPORT=${PORT}\n    BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n    BOOT_HEADER_ENABLE=1\n    )\n\n  target_sources(${BOARD_TARGET} PUBLIC\n    ${BOARD_DIR}/flash_config/flash_config.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/clock_config.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/pin_mux.c\n    )\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${BOARD_DIR}/flash_config\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/rw61x/boards/frdm_rw612/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n * Copyright (c) 2025, Gabriel Koppenstein\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: FRDM-RW612\n   url: https://www.nxp.com/design/design-center/development-boards-and-designs/FRDM-RW612\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n\n// LED - Green channel of RGB LED\n#define LED_GPIO              BOARD_INITLEDPINS_LED_GREEN_PERIPHERAL\n#define LED_CLK               kCLOCK_HsGpio0\n#define LED_PIN               BOARD_INITLEDPINS_LED_GREEN_PIN\n#define LED_PORT              BOARD_INITLEDPINS_LED_GREEN_PORT\n#define LED_STATE_ON          0\n\n// WAKE button (Dummy, use unused pin\n#define BUTTON_GPIO           BOARD_INITPINS_WAKEUP_BTN_PERIPHERAL\n#define BUTTON_CLK            kCLOCK_HsGpio0\n#define BUTTON_PIN            BOARD_INITPINS_WAKEUP_BTN_PIN\n#define BUTTON_PORT           BOARD_INITPINS_WAKEUP_BTN_PORT\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV                   USART3\n#define LP_FLEXCOMM_INST           3U\n\n#define BOARD_DEBUG_UART_FRG_CLK \\\n    (&(const clock_frg_clk_config_t){3, kCLOCK_FrgPllDiv, 255, 0}) /*!< Select FRG3 mux as frg_pll */\n#define BOARD_DEBUG_UART_CLK_ATTACH kFRG_to_FLEXCOMM3\n\n\nstatic inline void board_uart_init_clock(void) {\n  /* attach FRG0 clock to FLEXCOMM3/USART3 */\n  CLOCK_SetFRGClock(BOARD_DEBUG_UART_FRG_CLK);\n  CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rw61x/boards/frdm_rw612/board.mk",
    "content": "MCU_VARIANT = RW612\nMCU_CORE = RW612\n\nCPU_CORE = cortex-m33-nodsp-nofp\nCFLAGS += \\\n\t-DCPU_RW612ETA2I \\\n\t-DCFG_TUSB_MCU=OPT_MCU_RW61X \\\n\t-DBOOT_HEADER_ENABLE=1 \\\n\nJLINK_DEVICE = ${MCU_VARIANT}\nPYOCD_TARGET = rw612eta2i\n\nSRC_C += \\\n\t$(SDK_DIR)/boards/frdmrw612/flash_config/flash_config.c \\\n\nINC += \\\n\t$(TOP)/$(SDK_DIR)/boards/frdmrw612/flash_config/ \\\n\n# flash using pyocd\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/rw61x/boards/frdm_rw612/clock_config.c",
    "content": "/*\n * Copyright 2024,2025 NXP\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n/*\n * How to set up clock using clock driver functions:\n *\n * 1. Setup clock sources.\n *\n * 2. Set up all selectors to provide selected clocks.\n *\n * 3. Set up all dividers.\n */\n\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Clocks v15.0\nprocessor: RW612\npackage_id: RW612ETA2I\nmcu_data: ksdk2_0\nprocessor_version: 24.12.10\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n#include \"fsl_power.h\"\n#include \"fsl_clock.h\"\n#include \"clock_config.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n * Variables\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\nvoid BOARD_InitBootClocks(void)\n{\n    BOARD_BootClockRUN();\n}\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/* clang-format off */\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!Configuration\nname: BOARD_BootClockRUN\ncalled_from_default_init: true\noutputs:\n- {id: audio_pll_clk.outFreq, value: 4246732800/345600007 MHz}\n- {id: aux0_pll_clk.outFreq, value: 260 MHz}\n- {id: avpll_ch1_clkout.outFreq, value: 4246732800/345600007 MHz}\n- {id: avpll_ch2_clkout.outFreq, value: 1415577600/22118401 MHz}\n- {id: cau_slp_clk.outFreq, value: 4 MHz}\n- {id: clk_32k.outFreq, value: 32 kHz}\n- {id: clk_pmu_sys.outFreq, value: 52 MHz}\n- {id: els_128m_clk.outFreq, value: 128 MHz}\n- {id: els_256m_clk.outFreq, value: 256 MHz}\n- {id: els_64m_clk.outFreq, value: 64 MHz}\n- {id: ffro_clk_div4.outFreq, value: 640/53 MHz}\n- {id: hclk.outFreq, value: 260 MHz}\n- {id: lposc_clk_i.outFreq, value: 1 MHz}\n- {id: main_clk.outFreq, value: 260 MHz}\n- {id: main_pll_clk.outFreq, value: 260 MHz}\n- {id: otp_fuse_32m_clk.outFreq, value: 32 MHz}\n- {id: refclk_phy.outFreq, value: 40 MHz}\n- {id: sfro_clk_i.outFreq, value: 16 MHz}\n- {id: systick_fclk.outFreq, value: 260 MHz}\n- {id: t3pll_mci_256m.outFreq, value: 256 MHz}\n- {id: t3pll_mci_48_60m_irc.outFreq, value: 2560/53 MHz}\n- {id: tcpu_mci_clk.outFreq, value: 260 MHz}\n- {id: tddr_mci_flexspi_clk.outFreq, value: 320 MHz}\nsettings:\n- {id: CLKCTL0.MAINCLKSELB.sel, value: CLKCTL0.MAINPLLCLKDIV}\n- {id: CLKCTL0.MAINPLLCLKDIV.scale, value: '1', locked: true}\n- {id: CLKCTL0.PMUFCLKDIV.scale, value: '5', locked: true}\n- {id: CLKCTL0.SYSCPUAHBCLKDIV.scale, value: '1', locked: true}\n- {id: CLKCTL0.SYSTICKFCLKSEL.sel, value: CLKCTL0.SYSTICKFCLKDIV}\n- {id: CLKCTL0.WDT0FCLKSEL.sel, value: NO_CLOCK}\n- {id: CLKCTL1.FRGPLLCLKDIV.scale, value: '13', locked: true}\n- {id: CLKCTL1.OSEVENTFCLKSEL.sel, value: NO_CLOCK}\n- {id: REFCLK_SYS_Config, value: Disabled}\n- {id: SYSCTL2.CH1_M.scale, value: '2621440', locked: true}\n- {id: SYSCTL2.CH1_OFFSET_DIV.scale, value: '345600007', locked: true}\n- {id: SYSCTL2.CH2_M.scale, value: '2621440', locked: true}\n- {id: SYSCTL2.CH2_OFFSET_DIV.scale, value: '66355203', locked: true}\n- {id: SYSCTL2.T3_FBDIV.scale, value: '64', locked: true}\n- {id: SYSCTL2.T3_REFDIV.scale, value: '1', locked: true}\n- {id: T3PLL_MCI_213P3M_Config, value: Disabled}\n- {id: T3PLL_MCI_FLEXSPI_Config, value: Disabled}\n- {id: TCPU_MCI_FLEXSPI_CLK_Config, value: Disabled}\n- {id: TDDR_MCI_ENET_CLK_Config, value: Disabled}\nsources:\n- {id: CAU.XTAL_OSC.outFreq, value: 40 MHz, enabled: true}\n- {id: PMU.XTAL32K.outFreq, value: 32.768 kHz}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\n/* clang-format on */\n\n/*******************************************************************************\n * Variables for BOARD_BootClockRUN configuration\n ******************************************************************************/\nconst clock_avpll_config_t avpllConfig_BOARD_BootClockRUN =\n    {\n        .ch1Freq = kCLOCK_AvPllChFreq12p288m,     /* AVPLL channel frequency 12.288 MHz */\n        .ch2Freq = kCLOCK_AvPllChFreq64m,         /* AVPLL channel frequency 64 MHz */\n        .enableCali = true,                       /* AVPLL calibration is enabled */\n    };\n/*******************************************************************************\n * Code for BOARD_BootClockRUN configuration\n ******************************************************************************/\nvoid BOARD_BootClockRUN(void)\n{\n    /* Disable GDET and VSensors */\n    POWER_DisableGDetVSensors();\n    /* Enable CAU sleep clock for PMU */\n    if ((PMU->CAU_SLP_CTRL & PMU_CAU_SLP_CTRL_SOC_SLP_RDY_MASK) == 0U)\n    {\n        /* Enable the CAU sleep clock. */\n        CLOCK_EnableClock(kCLOCK_RefClkCauSlp);\n    }\n    if ((SYSCTL2->SOURCE_CLK_GATE & SYSCTL2_SOURCE_CLK_GATE_REFCLK_SYS_CG_MASK) != 0U)\n    {\n        /* Enable the REFCLK_SYS clock. */\n        CLOCK_EnableClock(kCLOCK_RefClkSys);\n    }\n    /* Initialize T3 PLL and enable outputs that are not clock gated. */\n    CLOCK_InitT3RefClk(kCLOCK_T3MciIrc48m);\n    /* Enable FFRO - T3 PLL 48/60 MHz IRC clock output */\n    CLOCK_EnableClock(kCLOCK_T3PllMciIrcClk);\n    /* Enable T3 PLL 256 MHz clock output */\n    CLOCK_EnableClock(kCLOCK_T3PllMci256mClk);\n    /* Set core clock to safe system oscillator clock for initialization of other sources. */\n    CLOCK_AttachClk(kSYSOSC_to_MAIN_CLK);\n    CLOCK_SetClkDiv(kCLOCK_DivSysCpuAhbClk, 1);\n    /* Enable TCPU PLL MCI clock output */\n    CLOCK_EnableClock(kCLOCK_TcpuMciClk);\n    /* Initialize TDDR PLL and enable outputs that are not clock gated. */\n    CLOCK_InitTddrRefClk(kCLOCK_TddrFlexspiDiv10);\n    /* Enable TDDR PLL FlexSPI clock output */\n    CLOCK_EnableClock(kCLOCK_TddrMciFlexspiClk);\n    /* Initialize AVPLL and enable both channels. */\n    CLOCK_InitAvPll(&avpllConfig_BOARD_BootClockRUN);\n    /* Set up clock selectors - Attach clocks to the peripheries */\n    CLOCK_AttachClk(kRC32K_to_CLK32K);                 /* Switch CLK32K to RC32K */\n    /*!< Please note SYSTICK_CLK source is used only if the SysTick SYST_CSR register CLKSOURCE bit is set to 0. */\n    CLOCK_AttachClk(kSYSTICK_DIV_to_SYSTICK_CLK);                 /* Switch SYSTICK_CLK to SYSTICK_DIV */\n    /* Set up dividers */\n    CLOCK_SetClkDiv(kCLOCK_DivAudioPllClk, 1U);         /* Set .AUDIOPLLCLKDIV divider to value 1 */\n    CLOCK_SetClkDiv(kCLOCK_DivPllFrgClk, 13U);         /* Set .FRGPLLCLKDIV divider to value 13 */\n    CLOCK_SetClkDiv(kCLOCK_DivMainPllClk, 1U);         /* Set .MAINPLLCLKDIV divider to value 1 */\n    CLOCK_SetClkDiv(kCLOCK_DivAux0PllClk, 1U);         /* Set .AUX0PLLCLKDIV divider to value 1 */\n    CLOCK_SetClkDiv(kCLOCK_DivSystickClk, 1U);         /* Set .SYSTICKFCLKDIV divider to value 1 */\n    CLOCK_SetClkDiv(kCLOCK_DivPmuFclk, 5U);         /* Set .PMUFCLKDIV divider to value 5 */\n    /* Select the main clock source for the main system clock (MAINCLKSELA and MAINCLKSELB). */\n    CLOCK_AttachClk(kMAIN_PLL_to_MAIN_CLK);\n    /*!< Set SystemCoreClock variable. */\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_HCLK;\n}\n"
  },
  {
    "path": "hw/bsp/rw61x/boards/frdm_rw612/clock_config.h",
    "content": "/*\n * Copyright 2024 NXP\n *\n * SPDX-License-Identifier: BSD-3-Clause\n */\n\n#ifndef _CLOCK_CONFIG_H_\n#define _CLOCK_CONFIG_H_\n\n#include \"fsl_common.h\"\n\n/*******************************************************************************\n * Definitions\n ******************************************************************************/\n\n/*******************************************************************************\n ************************ BOARD_InitBootClocks function ************************\n ******************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes default configuration of clocks.\n *\n */\nvoid BOARD_InitBootClocks(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n/*******************************************************************************\n ********************** Configuration BOARD_BootClockRUN ***********************\n ******************************************************************************/\n/*******************************************************************************\n * Definitions for BOARD_BootClockRUN configuration\n ******************************************************************************/\n\n/* Clock outputs (values are in Hz): */\n#define BOARD_BOOTCLOCKRUN_AUDIO_PLL_CLK              12287999UL     /* Clock consumers of audio_pll_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_AUX0_PLL_CLK               260000000UL    /* Clock consumers of aux0_pll_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_AUX1_PLL_CLK               0UL            /* Clock consumers of aux1_pll_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_AVPLL_CH1_CLKOUT           12287999UL     /* Clock consumers of avpll_ch1_clkout output : N/A */\n#define BOARD_BOOTCLOCKRUN_AVPLL_CH2_CLKOUT           63999997UL     /* Clock consumers of avpll_ch2_clkout output : N/A */\n#define BOARD_BOOTCLOCKRUN_CAU_SLP_CLK                4000000UL      /* Clock consumers of cau_slp_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLK_32K                    32000UL        /* Clock consumers of clk_32k output : RTC */\n#define BOARD_BOOTCLOCKRUN_CLK_OUT                    0UL            /* Clock consumers of clk_out output : N/A */\n#define BOARD_BOOTCLOCKRUN_CLK_PMU_SYS                52000000UL     /* Clock consumers of clk_pmu_sys output : PMU */\n#define BOARD_BOOTCLOCKRUN_CTIMER0_FCLK               0UL            /* Clock consumers of ctimer0_fclk output : CTIMER0 */\n#define BOARD_BOOTCLOCKRUN_CTIMER1_FCLK               0UL            /* Clock consumers of ctimer1_fclk output : CTIMER1 */\n#define BOARD_BOOTCLOCKRUN_CTIMER2_FCLK               0UL            /* Clock consumers of ctimer2_fclk output : CTIMER2 */\n#define BOARD_BOOTCLOCKRUN_CTIMER3_FCLK               0UL            /* Clock consumers of ctimer3_fclk output : CTIMER3 */\n#define BOARD_BOOTCLOCKRUN_DMIC_FCLK                  0UL            /* Clock consumers of dmic_fclk output : DMIC0 */\n#define BOARD_BOOTCLOCKRUN_ELS_128M_CLK               128000000UL    /* Clock consumers of els_128m_clk output : ELS */\n#define BOARD_BOOTCLOCKRUN_ELS_256M_CLK               256000000UL    /* Clock consumers of els_256m_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_ELS_64M_CLK                64000000UL     /* Clock consumers of els_64m_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_ELS_FCLK                   0UL            /* Clock consumers of els_fclk output : ELS */\n#define BOARD_BOOTCLOCKRUN_FFRO_CLK_DIV4              12075471UL     /* Clock consumers of ffro_clk_div4 output : N/A */\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM0_FCLK             0UL            /* Clock consumers of flexcomm0_fclk output : FLEXCOMM0 */\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM14_FCLK            0UL            /* Clock consumers of flexcomm14_fclk output : FLEXCOMM14 */\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM1_FCLK             0UL            /* Clock consumers of flexcomm1_fclk output : FLEXCOMM1 */\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM2_FCLK             0UL            /* Clock consumers of flexcomm2_fclk output : FLEXCOMM2 */\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM3_FCLK             0UL            /* Clock consumers of flexcomm3_fclk output : FLEXCOMM3 */\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_FCLK               0UL            /* Clock consumers of flexspi_fclk output : FLEXSPI */\n#define BOARD_BOOTCLOCKRUN_GAU_FCLK                   0UL            /* Clock consumers of gau_fclk output : GAU_ACOMP, GAU_BG, GAU_DAC0, GAU_GPADC0, GAU_GPADC1 */\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 */\n#define BOARD_BOOTCLOCKRUN_LCD_FCLK                   0UL            /* Clock consumers of lcd_fclk output : LCDIC */\n#define BOARD_BOOTCLOCKRUN_LPOSC_CLK_I                1000000UL      /* Clock consumers of lposc_clk_i output : N/A */\n#define BOARD_BOOTCLOCKRUN_MAIN_CLK                   260000000UL    /* Clock consumers of main_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_MAIN_PLL_CLK               260000000UL    /* Clock consumers of main_pll_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_MCLK_OUT                   0UL            /* Clock consumers of mclk_out output : N/A */\n#define BOARD_BOOTCLOCKRUN_OSEVENT_FCLK               0UL            /* Clock consumers of osevent_fclk output : OSTIMER */\n#define BOARD_BOOTCLOCKRUN_OTP_FUSE_32M_CLK           32000000UL     /* Clock consumers of otp_fuse_32m_clk output : OCOTP */\n#define BOARD_BOOTCLOCKRUN_REFCLK_PHY                 40000000UL     /* Clock consumers of refclk_phy output : USBOTG */\n#define BOARD_BOOTCLOCKRUN_REFCLK_SYS                 0UL            /* Clock consumers of refclk_sys output : N/A */\n#define BOARD_BOOTCLOCKRUN_SCT_FCLK                   0UL            /* Clock consumers of sct_fclk output : SCT0 */\n#define BOARD_BOOTCLOCKRUN_SFRO_CLK_I                 16000000UL     /* Clock consumers of sfro_clk_i output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYSOSC_CLK_I               0UL            /* Clock consumers of sysosc_clk_i output : N/A */\n#define BOARD_BOOTCLOCKRUN_SYSTICK_FCLK               260000000UL    /* Clock consumers of systick_fclk output : SysTick */\n#define BOARD_BOOTCLOCKRUN_T3PLL_MCI_213P3M           0UL            /* Clock consumers of t3pll_mci_213p3m output : N/A */\n#define BOARD_BOOTCLOCKRUN_T3PLL_MCI_256M             256000000UL    /* Clock consumers of t3pll_mci_256m output : N/A */\n#define BOARD_BOOTCLOCKRUN_T3PLL_MCI_48_60M_IRC       48301886UL     /* Clock consumers of t3pll_mci_48_60m_irc output : N/A */\n#define BOARD_BOOTCLOCKRUN_T3PLL_MCI_FLEXSPI_CLK      0UL            /* Clock consumers of t3pll_mci_flexspi_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_TCPU_MCI_CLK               260000000UL    /* Clock consumers of tcpu_mci_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_TCPU_MCI_FLEXSPI_CLK       0UL            /* Clock consumers of tcpu_mci_flexspi_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_TDDR_MCI_ENET_CLK          0UL            /* Clock consumers of tddr_mci_enet_clk output : ENET */\n#define BOARD_BOOTCLOCKRUN_TDDR_MCI_FLEXSPI_CLK       320000000UL    /* Clock consumers of tddr_mci_flexspi_clk output : N/A */\n#define BOARD_BOOTCLOCKRUN_USIM_FCLK                  0UL            /* Clock consumers of usim_fclk output : USIM */\n#define BOARD_BOOTCLOCKRUN_UTICK_FCLK                 0UL            /* Clock consumers of utick_fclk output : UTICK */\n#define BOARD_BOOTCLOCKRUN_WDT0_FCLK                  0UL            /* Clock consumers of wdt0_fclk output : WWDT0 */\n\n/*! @brief AVPLL set for BOARD_BootClockRUN configuration.\n */\nextern const clock_avpll_config_t avpllConfig_BOARD_BootClockRUN;\n/*******************************************************************************\n * API for BOARD_BootClockRUN configuration\n ******************************************************************************/\n#if defined(__cplusplus)\nextern \"C\" {\n#endif /* __cplusplus*/\n\n/*!\n * @brief This function executes configuration of clocks.\n *\n */\nvoid BOARD_BootClockRUN(void);\n\n#if defined(__cplusplus)\n}\n#endif /* __cplusplus*/\n\n\n#endif /* _CLOCK_CONFIG_H_ */\n"
  },
  {
    "path": "hw/bsp/rw61x/boards/frdm_rw612/pin_mux.c",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\n!!GlobalInfo\nproduct: Pins v17.0\nprocessor: RW612\npackage_id: RW612ETA2I\nmcu_data: ksdk2_0\nprocessor_version: 25.09.10\nboard: FRDM-RW612\npin_labels:\n- {pin_num: M2, pin_signal: GPIO_11, label: 'J1[6]/WAKEUP_BTN', identifier: WAKEUP;WAKEUP_BTN}\n- {pin_num: L7, pin_signal: GPIO_5, label: 'J1[7]/MCLK', identifier: MCLKOUT}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n#include \"fsl_common.h\"\n#include \"fsl_gpio.h\"\n#include \"fsl_io_mux.h\"\n#include \"pin_mux.h\"\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitBootPins\n * Description   : Calls initialization functions.\n *\n * END ****************************************************************************************************************/\nvoid BOARD_InitBootPins(void)\n{\n    BOARD_InitPins();\n    BOARD_InitDEBUG_UARTPins();\n    BOARD_InitSWD_DEBUGPins();\n    BOARD_InitLEDPins();\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitPins:\n- options: {callFromInitBoot: 'true', coreID: cm33, enableClock: 'true'}\n- pin_list:\n  - {pin_num: M2, peripheral: GPIO, signal: 'PIO0, 11', pin_signal: GPIO_11, identifier: WAKEUP_BTN, direction: INPUT}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitPins\n * Description   :\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 */\nvoid BOARD_InitPins(void)\n{\n    /* Enables the clock for the GPIO0 module */\n    GPIO_PortInit(GPIO, 0);\n\n    gpio_pin_config_t WAKEUP_BTN_config = {\n        .pinDirection = kGPIO_DigitalInput,\n        .outputLogic = 0U\n    };\n    /* Initialize GPIO functionality on pin PIO0_11 (pin M2)  */\n    GPIO_PinInit(BOARD_INITPINS_WAKEUP_BTN_GPIO, BOARD_INITPINS_WAKEUP_BTN_PORT, BOARD_INITPINS_WAKEUP_BTN_PIN, &WAKEUP_BTN_config);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitDEBUG_UARTPins:\n- options: {callFromInitBoot: 'true', coreID: cm33, enableClock: 'true'}\n- pin_list:\n  - {pin_num: E5, peripheral: FLEXCOMM3, signal: USART_RXD, pin_signal: GPIO_24}\n  - {pin_num: F6, peripheral: FLEXCOMM3, signal: USART_TXD, pin_signal: GPIO_26}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitDEBUG_UARTPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 */\nvoid BOARD_InitDEBUG_UARTPins(void)\n{\n    /* Initialize FC3_USART_DATA functionality on pin GPIO_24, GPIO_26 (pin E5_F6) */\n    IO_MUX_SetPinMux(IO_MUX_FC3_USART_DATA);\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitSWD_DEBUGPins:\n- options: {callFromInitBoot: 'true', coreID: cm33, enableClock: 'true'}\n- pin_list:\n  - {pin_num: G5, peripheral: SWD, signal: CLK, pin_signal: GPIO_13}\n  - {pin_num: K4, peripheral: SWD, signal: IO, pin_signal: GPIO_14}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitSWD_DEBUGPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 */\nvoid BOARD_InitSWD_DEBUGPins(void)\n{\n\n    MCI_IO_MUX->C_TIMER_IN = ((MCI_IO_MUX->C_TIMER_IN &\n                               /* Mask bits to zero which are setting */\n                               (~(MCI_IO_MUX_C_TIMER_IN_CT_INP3_SEL_MASK | MCI_IO_MUX_C_TIMER_IN_CT_INP4_SEL_MASK)))\n\n                              /* sel GPIO-13 as ct_inp3: 0x00u */\n                              | MCI_IO_MUX_C_TIMER_IN_CT_INP3_SEL(0x00u)\n                              /* sel GPIO-14 as ct_inp4: 0x00u */\n                              | MCI_IO_MUX_C_TIMER_IN_CT_INP4_SEL(0x00u));\n\n    MCI_IO_MUX->C_TIMER_OUT = ((MCI_IO_MUX->C_TIMER_OUT &\n                                /* Mask bits to zero which are setting */\n                                (~(MCI_IO_MUX_C_TIMER_OUT_CT0MAT3_SEL_MASK | MCI_IO_MUX_C_TIMER_OUT_CT1MAT0_SEL_MASK)))\n\n                               /* sel GPIO-13 as ct0mat3: 0x00u */\n                               | MCI_IO_MUX_C_TIMER_OUT_CT0MAT3_SEL(0x00u)\n                               /* sel GPIO-14 as ct1mat0: 0x00u */\n                               | MCI_IO_MUX_C_TIMER_OUT_CT1MAT0_SEL(0x00u));\n\n    MCI_IO_MUX->FC2 =\n        ((MCI_IO_MUX->FC2 &\n          /* Mask bits to zero which are setting */\n          (~(MCI_IO_MUX_FC2_SEL_FC2_I2C_MASK | MCI_IO_MUX_FC2_SEL_FC2_I2S_MASK | MCI_IO_MUX_FC2_SEL_FC2_SPI_MASK | MCI_IO_MUX_FC2_SEL_FC2_I2S_DATA_ONLY_MASK | MCI_IO_MUX_FC2_SEL_FC2_USART_DATA_MASK)))\n\n         /* flexcomm2:select GPIO-13/14 as i2c function: 0x00u */\n         | MCI_IO_MUX_FC2_SEL_FC2_I2C(0x00u)\n         /* flexcomm2:select GPIO-13/14/15 as i2s function: 0x00u */\n         | MCI_IO_MUX_FC2_SEL_FC2_I2S(0x00u)\n         /* flexcomm2:select GPIO-13/14/15/16 as spi function: 0x00u */\n         | MCI_IO_MUX_FC2_SEL_FC2_SPI(0x00u)\n         /* flexcomm2:select GPIO-13 as i2s data function: 0x00u */\n         | MCI_IO_MUX_FC2_SEL_FC2_I2S_DATA_ONLY(0x00u)\n         /* flexcomm2:select GPIO-13/14 as usart rxd/txd: 0x00u */\n         | MCI_IO_MUX_FC2_SEL_FC2_USART_DATA(0x00u));\n\n    MCI_IO_MUX->GPIO_GRP0 = ((MCI_IO_MUX->GPIO_GRP0 &\n                              /* Mask bits to zero which are setting */\n                              (~(MCI_IO_MUX_GPIO_GRP0_SEL_13_MASK | MCI_IO_MUX_GPIO_GRP0_SEL_14_MASK)))\n\n                             /* pio0[31:0] selection, high valid; sel[i]->pio0[i]->GPIO[i]: 0x00u */\n                             | MCI_IO_MUX_GPIO_GRP0_SEL(0x00u));\n\n    SOCCTRL->MCI_IOMUX_EN0 = ((SOCCTRL->MCI_IOMUX_EN0 &\n                               /* Mask bits to zero which are setting */\n                               (~(SOCCIU_MCI_IOMUX_EN0_EN_21_0_13_MASK | SOCCIU_MCI_IOMUX_EN0_EN_21_0_14_MASK)))\n\n                              /* Bitwise enable control for mci_io_mux GPIO[21:0]: 0x00u */\n                              | SOCCIU_MCI_IOMUX_EN0_EN_21_0(0x00u));\n}\n\n/* clang-format off */\n/*\n * TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\nBOARD_InitLEDPins:\n- options: {callFromInitBoot: 'true', coreID: cm33, enableClock: 'true'}\n- pin_list:\n  - {pin_num: M1, peripheral: GPIO, signal: 'PIO0, 0', pin_signal: GPIO_0, direction: OUTPUT, gpio_init_state: 'true'}\n  - {pin_num: N2, peripheral: GPIO, signal: 'PIO0, 1', pin_signal: GPIO_1, direction: OUTPUT, gpio_init_state: 'true'}\n  - {pin_num: N8, peripheral: GPIO, signal: 'PIO0, 12', pin_signal: GPIO_12, direction: OUTPUT, gpio_init_state: 'true'}\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS ***********\n */\n/* clang-format on */\n\n/* FUNCTION ************************************************************************************************************\n *\n * Function Name : BOARD_InitLEDPins\n * Description   : Configures pin routing and optionally pin electrical features.\n *\n * END ****************************************************************************************************************/\n/* Function assigned for the Cortex-M33 */\nvoid BOARD_InitLEDPins(void)\n{\n    /* Enables the clock for the GPIO0 module */\n    CLOCK_EnableClock(kCLOCK_HsGpio0);\n\n    gpio_pin_config_t LED_BLUE_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO0_0 (pin M1)  */\n    GPIO_PinInit(BOARD_INITLEDPINS_LED_BLUE_GPIO, BOARD_INITLEDPINS_LED_BLUE_PORT, BOARD_INITLEDPINS_LED_BLUE_PIN, &LED_BLUE_config);\n\n    gpio_pin_config_t LED_RED_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO0_1 (pin N2)  */\n    GPIO_PinInit(BOARD_INITLEDPINS_LED_RED_GPIO, BOARD_INITLEDPINS_LED_RED_PORT, BOARD_INITLEDPINS_LED_RED_PIN, &LED_RED_config);\n\n    gpio_pin_config_t LED_GREEN_config = {\n        .pinDirection = kGPIO_DigitalOutput,\n        .outputLogic = 1U\n    };\n    /* Initialize GPIO functionality on pin PIO0_12 (pin N8)  */\n    GPIO_PinInit(BOARD_INITLEDPINS_LED_GREEN_GPIO, BOARD_INITLEDPINS_LED_GREEN_PORT, BOARD_INITLEDPINS_LED_GREEN_PIN, &LED_GREEN_config);\n    /* Initialize GPIO0 functionality on pin GPIO_0 (pin M1) */\n    IO_MUX_SetPinMux(IO_MUX_GPIO0);\n    /* Initialize GPIO1 functionality on pin GPIO_1 (pin N2) */\n    IO_MUX_SetPinMux(IO_MUX_GPIO1);\n    /* Initialize GPIO12 functionality on pin GPIO_12 (pin N8) */\n    IO_MUX_SetPinMux(IO_MUX_GPIO12);\n}\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/rw61x/boards/frdm_rw612/pin_mux.h",
    "content": "/***********************************************************************************************************************\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\n **********************************************************************************************************************/\n\n#ifndef _PIN_MUX_H_\n#define _PIN_MUX_H_\n\n/*!\n * @addtogroup pin_mux\n * @{\n */\n\n/***********************************************************************************************************************\n * API\n **********************************************************************************************************************/\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n/*!\n * @brief Calls initialization functions.\n *\n */\nvoid BOARD_InitBootPins(void);\n\n/*!\n * @brief mclk direction control: MCLK is in the output direction. */\n#define MCLKPINDIR_MCLKPINDIR_OUTPUT_DIRECTION 0x01u\n\n/*! @name GPIO_5 (coord L7), J1[7]/MCLK\n  @{ */\n/* Routed pin properties */\n#define BOARD_INITPINS_MCLKOUT_PERIPHERAL CLKCTL1                 /*!<@brief Peripheral name */\n#define BOARD_INITPINS_MCLKOUT_SIGNAL MCLK                        /*!<@brief Signal name */\n#define BOARD_INITPINS_MCLKOUT_GPIO_PIN 5U                        /*!<@brief GPIO pin number */\n#define BOARD_INITPINS_MCLKOUT_PORT 0U                            /*!<@brief PORT number */\n#define BOARD_INITPINS_MCLKOUT_PIN 5U                             /*!<@brief PORT pin number */\n#define BOARD_INITPINS_MCLKOUT_PIN_MASK (1U << 5U)                /*!<@brief PORT pin mask */\n                                                                  /* @} */\n\n/*! @name GPIO_11 (coord M2), J1[6]/WAKEUP_BTN\n  @{ */\n/* Routed pin properties */\n#define BOARD_INITPINS_WAKEUP_BTN_PERIPHERAL GPIO          /*!<@brief Peripheral name */\n#define BOARD_INITPINS_WAKEUP_BTN_SIGNAL PIO0              /*!<@brief Signal name */\n#define BOARD_INITPINS_WAKEUP_BTN_CHANNEL 11               /*!<@brief Signal channel */\n#define BOARD_INITPINS_WAKEUP_BTN_GPIO GPIO                /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITPINS_WAKEUP_BTN_GPIO_PIN 11U             /*!<@brief GPIO pin number */\n#define BOARD_INITPINS_WAKEUP_BTN_PORT 0U                  /*!<@brief PORT number */\n#define BOARD_INITPINS_WAKEUP_BTN_PIN 11U                  /*!<@brief PORT pin number */\n#define BOARD_INITPINS_WAKEUP_BTN_PIN_MASK (1U << 11U)     /*!<@brief PORT pin mask */\n                                                           /* @} */\n\n/*!\n * @brief\n *\n */\nvoid BOARD_InitPins(void); /* Function assigned for the Cortex-M33 */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitDEBUG_UARTPins(void); /* Function assigned for the Cortex-M33 */\n\n/*!\n * @brief pio0[31:0] selection, high valid; sel[i]->pio0[i]->GPIO[i] Mask for item 13. */\n#define MCI_IO_MUX_GPIO_GRP0_SEL_13_MASK 0x2000u\n/*!\n * @brief pio0[31:0] selection, high valid; sel[i]->pio0[i]->GPIO[i] Mask for item 14. */\n#define MCI_IO_MUX_GPIO_GRP0_SEL_14_MASK 0x4000u\n/*!\n * @brief Bitwise enable control for mci_io_mux GPIO[21:0] Mask for item 13. */\n#define SOCCIU_MCI_IOMUX_EN0_EN_21_0_13_MASK 0x2000u\n/*!\n * @brief Bitwise enable control for mci_io_mux GPIO[21:0] Mask for item 14. */\n#define SOCCIU_MCI_IOMUX_EN0_EN_21_0_14_MASK 0x4000u\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitSWD_DEBUGPins(void); /* Function assigned for the Cortex-M33 */\n\n/*! @name GPIO_0 (coord M1), J1[14]/LED_BLUE\n  @{ */\n/* Routed pin properties */\n#define BOARD_INITLEDPINS_LED_BLUE_PERIPHERAL GPIO                    /*!<@brief Peripheral name */\n#define BOARD_INITLEDPINS_LED_BLUE_SIGNAL PIO0                        /*!<@brief Signal name */\n#define BOARD_INITLEDPINS_LED_BLUE_CHANNEL 0                          /*!<@brief Signal channel */\n#define BOARD_INITLEDPINS_LED_BLUE_GPIO GPIO                          /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDPINS_LED_BLUE_INIT_GPIO_VALUE 1U                 /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDPINS_LED_BLUE_GPIO_PIN 0U                        /*!<@brief GPIO pin number */\n#define BOARD_INITLEDPINS_LED_BLUE_PORT 0U                            /*!<@brief PORT number */\n#define BOARD_INITLEDPINS_LED_BLUE_PIN 0U                             /*!<@brief PORT pin number */\n#define BOARD_INITLEDPINS_LED_BLUE_PIN_MASK (1U << 0U)                /*!<@brief PORT pin mask */\n                                                                      /* @} */\n\n/*! @name GPIO_1 (coord N2), J5[1]/LED_RED\n  @{ */\n/* Routed pin properties */\n#define BOARD_INITLEDPINS_LED_RED_PERIPHERAL GPIO                    /*!<@brief Peripheral name */\n#define BOARD_INITLEDPINS_LED_RED_SIGNAL PIO0                        /*!<@brief Signal name */\n#define BOARD_INITLEDPINS_LED_RED_CHANNEL 1                          /*!<@brief Signal channel */\n#define BOARD_INITLEDPINS_LED_RED_GPIO GPIO                          /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDPINS_LED_RED_INIT_GPIO_VALUE 1U                 /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDPINS_LED_RED_GPIO_PIN 1U                        /*!<@brief GPIO pin number */\n#define BOARD_INITLEDPINS_LED_RED_PORT 0U                            /*!<@brief PORT number */\n#define BOARD_INITLEDPINS_LED_RED_PIN 1U                             /*!<@brief PORT pin number */\n#define BOARD_INITLEDPINS_LED_RED_PIN_MASK (1U << 1U)                /*!<@brief PORT pin mask */\n                                                                     /* @} */\n\n/*! @name GPIO_12 (coord N8), LED_GREEN\n  @{ */\n/* Routed pin properties */\n#define BOARD_INITLEDPINS_LED_GREEN_PERIPHERAL GPIO                    /*!<@brief Peripheral name */\n#define BOARD_INITLEDPINS_LED_GREEN_SIGNAL PIO0                        /*!<@brief Signal name */\n#define BOARD_INITLEDPINS_LED_GREEN_CHANNEL 12                         /*!<@brief Signal channel */\n#define BOARD_INITLEDPINS_LED_GREEN_GPIO GPIO                          /*!<@brief GPIO peripheral base pointer */\n#define BOARD_INITLEDPINS_LED_GREEN_INIT_GPIO_VALUE 1U                 /*!<@brief GPIO output initial state */\n#define BOARD_INITLEDPINS_LED_GREEN_GPIO_PIN 12U                       /*!<@brief GPIO pin number */\n#define BOARD_INITLEDPINS_LED_GREEN_PORT 0U                            /*!<@brief PORT number */\n#define BOARD_INITLEDPINS_LED_GREEN_PIN 12U                            /*!<@brief PORT pin number */\n#define BOARD_INITLEDPINS_LED_GREEN_PIN_MASK (1U << 12U)               /*!<@brief PORT pin mask */\n                                                                       /* @} */\n\n/*!\n * @brief Configures pin routing and optionally pin electrical features.\n *\n */\nvoid BOARD_InitLEDPins(void); /* Function assigned for the Cortex-M33 */\n\n#if defined(__cplusplus)\n}\n#endif\n\n/*!\n * @}\n */\n#endif /* _PIN_MUX_H_ */\n\n/***********************************************************************************************************************\n * EOF\n **********************************************************************************************************************/\n"
  },
  {
    "path": "hw/bsp/rw61x/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n * Copyright (c) 2025, Gabriel Koppenstein\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: NXP\n*/\n\n#include \"bsp/board_api.h\"\n#include \"fsl_device_registers.h\"\n#include \"fsl_gpio.h\"\n#include \"board.h\"\n#include \"fsl_usart.h\"\n#include \"fsl_clock.h\"\n\n#include \"pin_mux.h\"\n#include \"clock_config.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\nvoid USB_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\nvoid board_init(void) {\n\n  // Init button pin, LED pins, SWD pins & UART pins\n  BOARD_InitBootPins();\n\n  // Init Clocks\n  BOARD_InitBootClocks();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n#ifdef NEOPIXEL_PIN\n  // No neo pixel support yet\n#endif\n\n#ifdef UART_DEV\n  // Enable UART when debug log is on\n  board_uart_init_clock();\n  usart_config_t uart_config;\n  USART_GetDefaultConfig(&uart_config);\n  uart_config.baudRate_Bps = CFG_BOARD_UART_BAUDRATE;\n  uart_config.enableRx = true;\n  uart_config.enableTx = true;\n  USART_Init(UART_DEV, &uart_config, CLOCK_GetFlexCommClkFreq(LP_FLEXCOMM_INST));\n#endif\n\n  // USB Initialization\n  // Reset USB\n  RESET_PeripheralReset(kUSB_RST_SHIFT_RSTn);\n\n  // Enable USB Clock\n  CLOCK_EnableClock(kCLOCK_Usb);\n\n  // Enable USB PHY\n  CLOCK_EnableUsbhsPhyClock();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinWrite(LED_GPIO, LED_PORT, LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n}\n\nuint32_t board_button_read(void) {\n#ifdef BUTTON_GPIO\n  return BUTTON_STATE_ACTIVE == GPIO_PinRead(BUTTON_GPIO, BOARD_INITPINS_WAKEUP_BTN_PORT, BUTTON_PIN);\n#endif\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n#ifdef UART_DEV\n  USART_WriteBlocking(UART_DEV, (uint8_t const*) buf, len);\n  return len;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/rw61x/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-sdk)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m33-nodsp-nofp CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS RW61X CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\n\nset(STARTUP_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/startup_${MCU_CORE}.S)\nset(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/${MCU_CORE}_flash.ld)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/devices/${MCU_VARIANT}/system_${MCU_CORE}.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_clock.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_reset.c\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_power.c\n    ${SDK_DIR}/drivers/lpc_gpio/fsl_gpio.c\n    ${SDK_DIR}/drivers/common/fsl_common_arm.c\n    ${SDK_DIR}/drivers/flexcomm/fsl_flexcomm.c\n    ${SDK_DIR}/drivers/flexcomm/usart/fsl_usart.c\n    ${SDK_DIR}/drivers/flexspi/fsl_flexspi.c\n    )\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${SDK_DIR}/devices/${MCU_VARIANT}\n    ${SDK_DIR}/devices/${MCU_VARIANT}/drivers\n    ${SDK_DIR}/drivers\n    ${SDK_DIR}/drivers/common\n    ${SDK_DIR}/drivers/lpc_gpio\n    ${SDK_DIR}/drivers/flexcomm\n    ${SDK_DIR}/drivers/flexcomm/usart\n    ${SDK_DIR}/drivers/flexspi\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_RW61X)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n\n    # ChipIdea HS\n    ${TOP}/src/portable/chipidea/ci_hs/dcd_ci_hs.c\n    ${TOP}/src/portable/chipidea/ci_hs/hcd_ci_hs.c\n    ${TOP}/src/portable/ehci/ehci.c\n\n    # Startup File\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n\n  # Add Board specific includes\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  # Linker Options\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n\n  # Handle Startup File Properties (Linting/Warnings)\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w\n    )\n\n  # Flashing & Binary Generation\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/rw61x/family.mk",
    "content": "UF2_FAMILY_ID = 0x2abc77ec\nSDK_DIR = hw/mcu/nxp/mcux-sdk\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\n# Default to Highspeed PORT1\nPORT ?= 1\n\nCFLAGS += \\\n  -flto \\\n  -DBOARD_TUD_RHPORT=$(PORT) \\\n  -DBOARD_TUH_RHPORT=$(PORT) \\\n  -DSERIAL_PORT_TYPE_UART=1 \\\n  -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED \\\n  -DBOARD_TUH_MAX_SPEED=OPT_MODE_HIGH_SPEED\t\\\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=unused-parameter -Wno-error=old-style-declaration -Wno-error=redundant-decls\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\n# All source paths should be relative to the top level.\nLD_FILE ?= $(SDK_DIR)/devices/$(MCU_VARIANT)/gcc/$(MCU_CORE)_flash.ld\n\nSRC_C += \\\n\tsrc/portable/chipidea/ci_hs/dcd_ci_hs.c \\\n\tsrc/portable/chipidea/ci_hs/hcd_ci_hs.c \\\n\tsrc/portable/ehci/ehci.c \\\n\t$(SDK_DIR)/devices/$(MCU_VARIANT)/system_$(MCU_CORE).c \\\n\t$(SDK_DIR)/devices/$(MCU_VARIANT)/drivers/fsl_clock.c \\\n\t$(SDK_DIR)/devices/$(MCU_VARIANT)/drivers/fsl_reset.c \\\n\t$(SDK_DIR)/devices/$(MCU_VARIANT)/drivers/fsl_power.c \\\n\t$(SDK_DIR)/drivers/lpc_gpio/fsl_gpio.c \\\n\t$(SDK_DIR)/drivers/common/fsl_common_arm.c\\\n\t$(SDK_DIR)/drivers/flexcomm/fsl_flexcomm.c \\\n\t$(SDK_DIR)/drivers/flexcomm/usart/fsl_usart.c \\\n\t$(SDK_DIR)/drivers/flexspi/fsl_flexspi.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(SDK_DIR)/devices/$(MCU_VARIANT) \\\n\t$(TOP)/$(SDK_DIR)/devices/$(MCU_VARIANT)/drivers \\\n\t$(TOP)/$(SDK_DIR)/drivers/ \\\n\t$(TOP)/$(SDK_DIR)/drivers/common\\\n\t$(TOP)/$(SDK_DIR)/drivers/lpc_gpio\\\n\t$(TOP)/$(SDK_DIR)/drivers/flexcomm \\\n    $(TOP)/$(SDK_DIR)/drivers/flexcomm/usart \\\n    $(TOP)/$(SDK_DIR)/drivers/flexspi \\\n\n\nSRC_S += $(SDK_DIR)/devices/$(MCU_VARIANT)/gcc/startup_$(MCU_CORE).S\n"
  },
  {
    "path": "hw/bsp/rx/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n// FIXME cause redundant-decls warnings\nextern uint32_t SystemCoreClock;\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_FPU\t\t\t\t\t\t\t\t        0\n#define configENABLE_TRUSTZONE\t\t\t\t\t        0\n#define configMINIMAL_SECURE_STACK_SIZE\t\t\t\t\t( 1024 )\n#define configRUN_FREERTOS_SECURE_ONLY          1\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n#ifdef __RX__\n/* Renesas RX series */\n#define vSoftwareInterruptISR\t\t\t\t\t        INT_Excep_ICU_SWINT\n#define vTickISR\t\t\t\t\t\t\t\t              INT_Excep_CMT0_CMI0\n#define configPERIPHERAL_CLOCK_HZ\t\t\t\t      (configCPU_CLOCK_HZ/2)\n#define configKERNEL_INTERRUPT_PRIORITY\t\t\t  1\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY\t4\n\n#else\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n#if defined(__NVIC_PRIO_BITS)\n  // For Cortex-M specific: __NVIC_PRIO_BITS is defined in core_cmx.h\n\t#define configPRIO_BITS       __NVIC_PRIO_BITS\n\n#elif defined(__ECLIC_INTCTLBITS)\n  // RISC-V Bumblebee core from nuclei\n  #define configPRIO_BITS       __ECLIC_INTCTLBITS\n\n#elif defined(__IASMARM__)\n  // FIXME: IAR Assembler cannot include mcu header directly to get __NVIC_PRIO_BITS.\n  // Therefore we will hard coded it to minimum value of 2 to get pass ci build.\n  // IAR user must update this to correct value of the target MCU\n  #message \"configPRIO_BITS is hard coded to 2 to pass IAR build only. User should update it per MCU\"\n  #define configPRIO_BITS       2\n\n#else\n  #error \"FreeRTOS configPRIO_BITS to be defined\"\n#endif\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n\n#endif /* __FREERTOS_CONFIG__H */\n"
  },
  {
    "path": "hw/bsp/rx/boards/gr_citrus/board.cmake",
    "content": "set(MCU_VARIANT rx63n)\nset(MCU_FAMILY RX63X)\n\nset(CMAKE_SYSTEM_CPU rx610 CACHE INTERNAL \"System Processor\")\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/r5f5631fd.ld)\n\nset(JLINK_DEVICE R5F5631F)\nset(JLINK_IF JTAG)\n\nset(BOARD_SOURCES\n  ${CMAKE_CURRENT_LIST_DIR}/gr_citrus.c\n  )\n\nfunction(update_board TARGET)\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/rx/boards/gr_citrus/board.h",
    "content": "/*\n* The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: GR Citrus\n   url: https://www.renesas.com/en/products/gadget-renesas/boards/gr-citrus\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"iodefine.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED: PA0, active high\n#define BOARD_LED_WRITE(state)    (PORTA.PODR.BIT.B0 = (state) ? 1 : 0)\n\n// No user button\n#define BOARD_BUTTON_READ()       0\n\n// UART: SCI0\n#define BOARD_UART_SCI            SCI0\n#define BOARD_SCI_TXI_HANDLER     INT_Excep_SCI0_TXI0\n#define BOARD_SCI_TEI_HANDLER     INT_Excep_SCI0_TEI0\n#define BOARD_SCI_RXI_HANDLER     INT_Excep_SCI0_RXI0\n\n// USB interrupt handler\n#define BOARD_USB_IRQ_HANDLER     INT_Excep_USB0_USBI0\n\n// Clocks\n#define BOARD_PCLK                48000000\n#define BOARD_CPUCLK              96000000\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/rx/boards/gr_citrus/board.mk",
    "content": "CFLAGS += \\\n  -mcpu=rx610 \\\n  -misa=v1 \\\n  -DCFG_TUSB_MCU=OPT_MCU_RX63X\n\nMCU_DIR = hw/mcu/renesas/rx/rx63n\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/r5f5631fd.ld\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RX600\n\n# For flash-jlink target\nJLINK_DEVICE = R5F5631F\nJLINK_IF     = JTAG\n\n# For flash-pyocd target\nPYOCD_TARGET =\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/rx/boards/gr_citrus/gr_citrus.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* How to connect JLink and GR-CITRUS\n *\n * GR-CITRUS needs to solder some pads to enable JTAG interface.\n * - Short the following pads individually with solder.\n *   - J4\n *   - J5\n * - Short EMLE pad and 3.3V(GR-CITRUS pin name) with a wire.\n *\n * The pads are [the back side of GR-CITRUS](https://www.slideshare.net/MinaoYamamoto/grcitrusrx631/2).\n *\n * Connect the pins between GR-CITRUS and JLink as follows.\n *\n * | Function  | GR-CITRUS pin | JLink pin No.| note     |\n * |:---------:|:-------------:|:------------:|:--------:|\n * | VTref     |   3.3V        |   1          |          |\n * | TRST      |   5           |   3          |          |\n * | GND       |   GND         |   4          |          |\n * | TDI       |   3           |   5          |          |\n * | TMS       |   2           |   7          |          |\n * | TCK/FINEC |   14          |   9          | short J4 |\n * | TDO       |   9           |  13          | short J5 |\n * | nRES      |   RST         |  15          |          |\n *\n * JLink firmware needs to update to V6.96 or newer version to avoid\n * [a bug](https://forum.segger.com/index.php/Thread/7758-SOLVED-Bug-in-JLink-from-V6-88b-regarding-RX65N)\n * regarding downloading.\n */\n\n#include \"iodefine.h\"\n#include \"board.h\"\n\n#define SYSTEM_PRCR_PRC1      (1<<1)\n#define SYSTEM_PRCR_PRKEY     (0xA5u<<8)\n#define MPC_PFS_ISEL          (1<<6)\n\n#define IRQ_PRIORITY_SCI0     5\n#define SCI_PCLK              48000000\n\nvoid HardwareSetup(void)\n{\n  SYSTEM.PRCR.WORD     = 0xA503u;\n  SYSTEM.SOSCCR.BYTE   = 0x01u;\n  SYSTEM.MOSCWTCR.BYTE = 0x0Du;\n  SYSTEM.PLLWTCR.BYTE  = 0x0Eu;\n  SYSTEM.PLLCR.WORD    = 0x0F00u;\n  SYSTEM.MOSCCR.BYTE   = 0x00u;\n  SYSTEM.PLLCR2.BYTE   = 0x00u;\n  for (unsigned i = 0; i < 2075u; ++i) __asm(\"nop\");\n  SYSTEM.SCKCR.LONG    = 0x21021211u;\n  SYSTEM.SCKCR2.WORD   = 0x0033u;\n  SYSTEM.SCKCR3.WORD   = 0x0400u;\n  SYSTEM.SYSCR0.WORD   = 0x5A01;\n  SYSTEM.MSTPCRB.BIT.MSTPB15 = 0;\n  SYSTEM.PRCR.WORD     = 0xA500u;\n}\n\nvoid board_pin_init(void)\n{\n  /* Unlock MPC registers */\n  MPC.PWPR.BIT.B0WI  = 0;\n  MPC.PWPR.BIT.PFSWE = 1;\n\n  /* LED PA0 */\n  PORTA.PMR.BIT.B0  = 0U;\n  PORTA.PODR.BIT.B0 = 0U;\n  PORTA.PDR.BIT.B0  = 1U;\n\n  /* UART TXD0 => P20, RXD0 => P21 */\n  PORT2.PMR.BIT.B0 = 1U;\n  PORT2.PCR.BIT.B0 = 1U;\n  MPC.P20PFS.BYTE  = 0b01010;\n  PORT2.PMR.BIT.B1 = 1U;\n  MPC.P21PFS.BYTE  = 0b01010;\n\n  /* USB VBUS -> P16 DPUPE -> P14 */\n  PORT1.PMR.BIT.B4 = 1U;\n  PORT1.PMR.BIT.B6 = 1U;\n  MPC.P14PFS.BYTE  = 0b10001;\n  MPC.P16PFS.BYTE  = MPC_PFS_ISEL | 0b10001;\n  MPC.PFUSB0.BIT.PUPHZS = 1;\n\n  /* Lock MPC registers */\n  MPC.PWPR.BIT.PFSWE = 0;\n  MPC.PWPR.BIT.B0WI  = 1;\n\n  /* Enable SCI0 */\n  SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;\n  MSTP(SCI0) = 0;\n  SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY;\n  SCI0.BRR = (SCI_PCLK / (32 * 115200)) - 1;\n  IR(SCI0,  RXI0)  = 0;\n  IR(SCI0,  TXI0)  = 0;\n  IR(SCI0,  TEI0)  = 0;\n  IPR(SCI0, RXI0) = IRQ_PRIORITY_SCI0;\n  IPR(SCI0, TXI0) = IRQ_PRIORITY_SCI0;\n  IPR(SCI0, TEI0) = IRQ_PRIORITY_SCI0;\n  IEN(SCI0, RXI0) = 1;\n  IEN(SCI0, TXI0) = 1;\n  IEN(SCI0, TEI0) = 1;\n}\n"
  },
  {
    "path": "hw/bsp/rx/boards/gr_citrus/r5f5631fd.ld",
    "content": "__USTACK_SIZE = 0x00000400;\n__ISTACK_SIZE = 0x00000400;\n\nMEMORY\n{\n\tRAM : ORIGIN = 0x4,        LENGTH = 0x3fffc\n\tROM : ORIGIN = 0xFFE00000, LENGTH = 0x200000\n}\nSECTIONS\n{\n\t.fvectors 0xFFFFFF80: AT(0xFFFFFF80)\n\t{\n\t\tKEEP(*(.fvectors))\n\t} > ROM\n\t.text 0xFFE00000: AT(0xFFE00000)\n\t{\n\t\t*(.text)\n\t\t*(.text.*)\n\t\t*(P)\n\t\tetext = .;\n\t} > ROM\n\t.rvectors ALIGN(4):\n\t{\n\t\t_rvectors_start = .;\n\t\tKEEP(*(.rvectors))\n\t\t_rvectors_end = .;\n\t} > ROM\n\t.init :\n\t{\n\t\tKEEP(*(.init))\n\t\t__preinit_array_start = .;\n\t\tKEEP(*(.preinit_array))\n\t\t__preinit_array_end = .;\n\t\t__init_array_start = (. + 3) & ~ 3;\n\t\tKEEP(*(.init_array))\n\t\tKEEP(*(SORT(.init_array.*)))\n\t\t__init_array_end = .;\n\t\t__fini_array_start = .;\n\t\tKEEP(*(.fini_array))\n\t\tKEEP(*(SORT(.fini_array.*)))\n\t\t__fini_array_end = .;\n\t} > ROM\n\t.fini :\n\t{\n\t\tKEEP(*(.fini))\n\t} > ROM\n\t.got :\n\t{\n\t\t*(.got)\n\t\t*(.got.plt)\n\t} > ROM\n\t.rodata :\n\t{\n\t\t*(.rodata)\n\t\t*(.rodata.*)\n\t\t*(C_1)\n\t\t*(C_2)\n\t\t*(C)\n\t\t_erodata = .;\n\t} > ROM\n\t.eh_frame_hdr :\n\t{\n\t\t*(.eh_frame_hdr)\n\t} > ROM\n\t.eh_frame :\n\t{\n\t\t*(.eh_frame)\n\t} > ROM\n\t.jcr :\n\t{\n\t\t*(.jcr)\n\t} > ROM\n\t.tors :\n\t{\n\t\t__CTOR_LIST__ = .;\n\t\t. = ALIGN(2);\n\t\t___ctors = .;\n\t\t*(.ctors)\n\t\t___ctors_end = .;\n\t\t__CTOR_END__ = .;\n\t\t__DTOR_LIST__ = .;\n\t\t___dtors = .;\n\t\t*(.dtors)\n\t\t___dtors_end = .;\n\t\t__DTOR_END__ = .;\n\t\t. = ALIGN(2);\n\t\t_mdata = .;\n\t} > ROM\n\t.data : AT(_mdata)\n\t{\n\t\t_data = .;\n\t\t*(.data)\n\t\t*(.data.*)\n\t\t*(D)\n\t\t*(D_1)\n\t\t*(D_2)\n\t\t_edata = .;\n\t} > RAM\n\t.gcc_exc :\n\t{\n\t\t*(.gcc_exc)\n\t} > RAM\n\t.bss :\n\t{\n\t\t_bss = .;\n\t\t*(.bss)\n\t\t*(.bss.**)\n\t\t*(COMMON)\n\t\t*(B)\n\t\t*(B_1)\n\t\t*(B_2)\n\t\t_ebss = .;\n\t\t_end = .;\n\t} > RAM\n\t.ustack :\n\t{\n\t\t. = ALIGN(8);\n\t\t. = . + __USTACK_SIZE;\n\t\tPROVIDE(_ustack = .);\n\t} > RAM\n\t.istack :\n\t{\n\t\t. = ALIGN(8);\n\t\t. = . + __ISTACK_SIZE;\n\t\tPROVIDE(_istack = .);\n\t} > RAM\n}\n"
  },
  {
    "path": "hw/bsp/rx/boards/rx65n_target/board.cmake",
    "content": "set(MCU_VARIANT rx65n)\nset(MCU_FAMILY RX65X)\n\nset(CMAKE_SYSTEM_CPU rx64m CACHE INTERNAL \"System Processor\")\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/r5f565ne.ld)\n\nset(JLINK_DEVICE R5F565NE)\nset(JLINK_IF JTAG)\n\nset(RFP_DEVICE rx65x)\nset(RFP_TOOL e2l)\n\nset(BOARD_SOURCES\n  ${CMAKE_CURRENT_LIST_DIR}/rx65n_target.c\n  )\n\nfunction(update_board TARGET)\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/rx/boards/rx65n_target/board.h",
    "content": "/*\n* The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: RX65N Target Board\n   url: https://www.renesas.com/en/products/microcontrollers-microprocessors/rx-32-bit-performance-efficiency-mcus/rtk5rx65n0c00000br-target-board-rx65n\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#include \"iodefine.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED: PD6, active low (open-drain)\n#define BOARD_LED_WRITE(state)    (PORTD.PODR.BIT.B6 = (state) ? 0 : 1)\n\n// Button: PB1, active low\n#define BOARD_BUTTON_READ()       (PORTB.PIDR.BIT.B1 ? 0 : 1)\n\n// UART: SCI5\n#define BOARD_UART_SCI            SCI5\n#define BOARD_SCI_TXI_HANDLER     INT_Excep_SCI5_TXI5\n#define BOARD_SCI_TEI_HANDLER     INT_Excep_ICU_GROUPBL0  // SCI5 TEI uses group interrupt\n#define BOARD_SCI_RXI_HANDLER     INT_Excep_SCI5_RXI5\n\n// USB interrupt handler (software configurable vector)\n#define IRQ_USB0_USBI0            62\n#define SLIBR_USBI0               SLIBR185\n#define IR_USB0_USBI0             IR_PERIB_INTB185\n#define IER_USB0_USBI0            IER_PERIB_INTB185\n#define IEN_USB0_USBI0            IEN_PERIB_INTB185\n#define IPR_USB0_USBI0            IPR_PERIB_INTB185\n#define INT_Excep_USB0_USBI0      INT_Excep_PERIB_INTB185\n#define BOARD_USB_IRQ_HANDLER     INT_Excep_USB0_USBI0\n\n// Clocks\n#define BOARD_PCLK                60000000\n#define BOARD_CPUCLK              120000000\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/rx/boards/rx65n_target/board.mk",
    "content": "CFLAGS += \\\n  -mcpu=rx64m \\\n  -misa=v2 \\\n  -DCFG_TUSB_MCU=OPT_MCU_RX65X \\\n  -DIR_USB0_USBI0=IR_PERIB_INTB185 \\\n  -DIER_USB0_USBI0=IER_PERIB_INTB185 \\\n  -DIEN_USB0_USBI0=IEN_PERIB_INTB185\n\nMCU_DIR = hw/mcu/renesas/rx/rx65n\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/r5f565ne.ld\n\n# For freeRTOS port source\nFREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RX600\n\n# For flash-jlink target\nJLINK_DEVICE = R5F565NE\nJLINK_IF     = JTAG\n\n# For flash-pyocd target\nPYOCD_TARGET =\n\n# flash using rfp-cli\nflash: flash-rfp\n"
  },
  {
    "path": "hw/bsp/rx/boards/rx65n_target/r5f565ne.ld",
    "content": "__USTACK_SIZE = 0x00000800;\n__ISTACK_SIZE = 0x00000800;\n\nMEMORY\n{\n\tRAM  : ORIGIN = 0x4,        LENGTH = 0x3fffc\n\tRAM2 : ORIGIN = 0x00800000, LENGTH = 0x60000\n\tOFS  : ORIGIN = 0xFE7F5D00, LENGTH = 128\n\tROM  : ORIGIN = 0xFFE00000, LENGTH = 0x200000\n}\nSECTIONS\n{\n\t.exvectors 0xFFFFFF80: AT(0xFFFFFF80)\n\t{\n\t\t\"_exvectors_start\" = .;\n\t\tKEEP(*(.exvectors))\n\t\t\"_exvectors_end\" = .;\n\t} >ROM\n\t.fvectors 0xFFFFFFFC: AT(0xFFFFFFFC)\n\t{\n\t\tKEEP(*(.fvectors))\n\t} > ROM\n\t.text 0xFFE00000: AT(0xFFE00000)\n\t{\n\t\t*(.text)\n\t\t*(.text.*)\n\t\t*(P)\n\t\tKEEP(*(.text.*_isr))\n\t\tetext = .;\n\t} > ROM\n\t.rvectors ALIGN(4):\n\t{\n\t\t_rvectors_start = .;\n\t\tKEEP(*(.rvectors))\n\t\t_rvectors_end = .;\n\t} > ROM\n\t.init :\n\t{\n\t\tKEEP(*(.init))\n\t\t__preinit_array_start = .;\n\t\tKEEP(*(.preinit_array))\n\t\t__preinit_array_end = .;\n\t\t__init_array_start = (. + 3) & ~ 3;\n\t\tKEEP(*(.init_array))\n\t\tKEEP(*(SORT(.init_array.*)))\n\t\t__init_array_end = .;\n\t\t__fini_array_start = .;\n\t\tKEEP(*(.fini_array))\n\t\tKEEP(*(SORT(.fini_array.*)))\n\t\t__fini_array_end = .;\n\t} > ROM\n\t.fini :\n\t{\n\t\tKEEP(*(.fini))\n\t} > ROM\n\t.got :\n\t{\n\t\t*(.got)\n\t\t*(.got.plt)\n\t} > ROM\n\t.rodata :\n\t{\n\t\t*(.rodata)\n\t\t*(.rodata.*)\n\t\t*(C_1)\n\t\t*(C_2)\n\t\t*(C)\n\t\t_erodata = .;\n\t} > ROM\n\t.eh_frame_hdr :\n\t{\n\t\t*(.eh_frame_hdr)\n\t} > ROM\n\t.eh_frame :\n\t{\n\t\t*(.eh_frame)\n\t} > ROM\n\t.jcr :\n\t{\n\t\t*(.jcr)\n\t} > ROM\n\t.tors :\n\t{\n\t\t__CTOR_LIST__ = .;\n\t\t. = ALIGN(2);\n\t\t___ctors = .;\n\t\t*(.ctors)\n\t\t___ctors_end = .;\n\t\t__CTOR_END__ = .;\n\t\t__DTOR_LIST__ = .;\n\t\t___dtors = .;\n\t\t*(.dtors)\n\t\t___dtors_end = .;\n\t\t__DTOR_END__ = .;\n\t\t. = ALIGN(2);\n\t\t_mdata = .;\n\t} > ROM\n\t.data : AT(_mdata)\n\t{\n\t\t_data = .;\n\t\t*(.data)\n\t\t*(.data.*)\n\t\t*(D)\n\t\t*(D_1)\n\t\t*(D_2)\n\t\t_edata = .;\n\t} > RAM\n\t.gcc_exc :\n\t{\n\t\t*(.gcc_exc)\n\t} > RAM\n\t.bss :\n\t{\n\t\t_bss = .;\n\t\t*(.bss)\n\t\t*(.bss.**)\n\t\t*(COMMON)\n\t\t*(B)\n\t\t*(B_1)\n\t\t*(B_2)\n\t\t_ebss = .;\n\t\t_end = .;\n\t} > RAM\n\t.ustack :\n\t{\n\t\t. = ALIGN(8);\n\t\t. = . + __USTACK_SIZE;\n\t\tPROVIDE(_ustack = .);\n\t} > RAM\n\t.istack :\n\t{\n\t\t. = ALIGN(8);\n\t\t. = . + __ISTACK_SIZE;\n\t\tPROVIDE(_istack = .);\n\t} > RAM\n\t.ofs1 0xFE7F5D00: AT(0xFE7F5D00)\n\t{\n\t\tKEEP(*(.ofs1))\n\t} > OFS\n\t.ofs2 0xFE7F5D10: AT(0xFE7F5D10)\n\t{\n\t\tKEEP(*(.ofs2))\n\t} > OFS\n\t.ofs3 0xFE7F5D20: AT(0xFE7F5D20)\n\t{\n\t\tKEEP(*(.ofs3))\n\t} > OFS\n\t.ofs4 0xFE7F5D40: AT(0xFE7F5D40)\n\t{\n\t\tKEEP(*(.ofs4))\n\t} > OFS\n\t.ofs5 0xFE7F5D48: AT(0xFE7F5D48)\n\t{\n\t\tKEEP(*(.ofs5))\n\t} > OFS\n\t.ofs6 0xFE7F5D50: AT(0xFE7F5D50)\n\t{\n\t\tKEEP(*(.ofs6))\n\t} > OFS\n\t.ofs7 0xFE7F5D64: AT(0xFE7F5D64)\n\t{\n\t\tKEEP(*(.ofs7))\n\t} > OFS\n\t.ofs8 0xFE7F5D70: AT(0xFE7F5D70)\n\t{\n\t\tKEEP(*(.ofs8))\n\t} > OFS\n}\n"
  },
  {
    "path": "hw/bsp/rx/boards/rx65n_target/rx65n_target.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* How to connect JLink and RX65n Target and option board\n * (For original comment https://github.com/hathach/tinyusb/pull/922#issuecomment-869786131)\n *\n * To enable JTAG, RX65N requires following connections on main board.\n * - short EJ2 jumper header, to disable onboard E2L.\n * - short EMLE(J1-2) and 3V3(J1-14 or J2-10), to enable In-Circuit Emulator.\n *\n * Note: For RX65N-Cloud-Kit, the option board's JTAG pins to some switches or floating.\n * To use JLink with the option board, I think some further modifications will be necessary.\n *\n * | Function  | RX65N pin  | main board | option board | JLink connector |\n * |:---------:|:----------:|:----------:|:------------:|:---------------:|\n * | 3V3       | VCC        |   J1-14    | CN5-6        |    1            |\n * | TRST      | P34        |   J1-16    | CN5-7        |    3            |\n * | GND       | VSS        |   J1-12    | CN5-5        |    4            |\n * | TDI       | P30        |   J1-20    | CN5-10       |    5            |\n * | TMS       | P31        |   J1-19    | USER_SW      |    7            |\n * | TCK/FINEC | P27        |   J1-21    | N/A          |    9            |\n * | TDO       | P26        |   J1-22    | CN5-9        |   13            |\n * | nRES      | RES#       |   J1-10    | RESET_SW     |   15            |\n *\n * JLink firmware needs to update to V6.96 or newer version to avoid\n * [a bug](https://forum.segger.com/index.php/Thread/7758-SOLVED-Bug-in-JLink-from-V6-88b-regarding-RX65N)\n * regarding downloading.\n */\n\n#include \"iodefine.h\"\n#include \"board.h\"\n\n#define SYSTEM_PRCR_PRC1      (1<<1)\n#define SYSTEM_PRCR_PRKEY     (0xA5u<<8)\n#define MPC_PFS_ISEL          (1<<6)\n\n#define IRQ_PRIORITY_SCI5     5\n#define SCI_PCLK              60000000\n\nvoid HardwareSetup(void)\n{\n  FLASH.ROMCIV.WORD = 1;\n  while (FLASH.ROMCIV.WORD) ;\n  FLASH.ROMCE.WORD = 1;\n  while (!FLASH.ROMCE.WORD) ;\n\n  SYSTEM.PRCR.WORD = 0xA503u;\n  if (!SYSTEM.RSTSR1.BYTE) {\n    RTC.RCR4.BYTE = 0;\n    RTC.RCR3.BYTE = 12;\n    while (12 != RTC.RCR3.BYTE) ;\n  }\n  SYSTEM.SOSCCR.BYTE = 1;\n\n  if (SYSTEM.HOCOCR.BYTE) {\n    SYSTEM.HOCOCR.BYTE = 0;\n    while (!SYSTEM.OSCOVFSR.BIT.HCOVF) ;\n  }\n  SYSTEM.PLLCR.WORD  = 0x1D10u; /* HOCO x 15 */\n  SYSTEM.PLLCR2.BYTE = 0;\n  while (!SYSTEM.OSCOVFSR.BIT.PLOVF) ;\n\n  SYSTEM.SCKCR.LONG  = 0x21C11222u;\n  SYSTEM.SCKCR2.WORD = 0x0041u;\n  SYSTEM.ROMWT.BYTE  = 0x02u;\n  while (0x02u != SYSTEM.ROMWT.BYTE) ;\n  SYSTEM.SCKCR3.WORD = 0x400u;\n  SYSTEM.PRCR.WORD   = 0xA500u;\n}\n\nvoid board_pin_init(void)\n{\n  /* Setup software configurable interrupts for USB */\n  ICU.SLIBR_USBI0.BYTE = IRQ_USB0_USBI0;\n  ICU.SLIPRCR.BYTE     = 1;\n\n  /* Unlock MPC registers */\n  MPC.PWPR.BIT.B0WI  = 0;\n  MPC.PWPR.BIT.PFSWE = 1;\n\n  /* Button PB1 */\n  PORTB.PMR.BIT.B1 = 0U;\n  PORTB.PDR.BIT.B1 = 0U;\n\n  /* LED PD6 (open-drain, active low) */\n  PORTD.PODR.BIT.B6 = 1U;\n  PORTD.ODR1.BIT.B4 = 1U;\n  PORTD.PMR.BIT.B6  = 0U;\n  PORTD.PDR.BIT.B6  = 1U;\n\n  /* UART TXD5 => PA4, RXD5 => PA3 */\n  PORTA.PMR.BIT.B4 = 1U;\n  PORTA.PCR.BIT.B4 = 1U;\n  MPC.PA4PFS.BYTE  = 0b01010;\n  PORTA.PMR.BIT.B3 = 1U;\n  MPC.PA3PFS.BYTE  = 0b01010;\n\n  /* USB VBUS -> P16 */\n  PORT1.PMR.BIT.B6 = 1U;\n  MPC.P16PFS.BYTE  = MPC_PFS_ISEL | 0b10001;\n\n  /* Lock MPC registers */\n  MPC.PWPR.BIT.PFSWE = 0;\n  MPC.PWPR.BIT.B0WI  = 1;\n\n  /* Enable SCI5 */\n  SYSTEM.PRCR.WORD   = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;\n  MSTP(SCI5)         = 0;\n  SYSTEM.PRCR.WORD   = SYSTEM_PRCR_PRKEY;\n  SCI5.SEMR.BIT.ABCS = 1;\n  SCI5.SEMR.BIT.BGDM = 1;\n  SCI5.BRR           = (SCI_PCLK / (8 * 115200)) - 1;\n  IR(SCI5,  RXI5)    = 0;\n  IR(SCI5,  TXI5)    = 0;\n  IS(SCI5,  TEI5)    = 0;\n  IR(ICU, GROUPBL0)  = 0;\n  IPR(SCI5, RXI5)    = IRQ_PRIORITY_SCI5;\n  IPR(SCI5, TXI5)    = IRQ_PRIORITY_SCI5;\n  IPR(ICU,GROUPBL0)  = IRQ_PRIORITY_SCI5;\n  IEN(SCI5, RXI5)    = 1;\n  IEN(SCI5, TXI5)    = 1;\n  IEN(ICU,GROUPBL0)  = 1;\n  EN(SCI5, TEI5)     = 1;\n}\n"
  },
  {
    "path": "hw/bsp/rx/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n#include \"interrupt_handlers.h\"\n\n#define SYSTEM_PRCR_PRC1      (1<<1)\n#define SYSTEM_PRCR_PRKEY     (0xA5u<<8)\n\n#define CMT_CMCR_CKS_DIV_128  2\n#define CMT_CMCR_CMIE         (1<<6)\n\n#define IRQ_PRIORITY_CMT0     5\n#define IRQ_PRIORITY_USBI0    6\n\n#define SCI_SSR_FER           (1<<4)\n#define SCI_SSR_ORER          (1<<5)\n#define SCI_SCR_TEIE          (1u<<2)\n#define SCI_SCR_RE            (1u<<4)\n#define SCI_SCR_TE            (1u<<5)\n#define SCI_SCR_RIE           (1u<<6)\n#define SCI_SCR_TIE           (1u<<7)\n\n// Board-specific pin/peripheral init (implemented per board)\nvoid board_pin_init(void);\n\n//--------------------------------------------------------------------+\n// SCI UART interrupt handlers\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t *buf;\n  uint32_t cnt;\n} sci_buf_t;\nstatic volatile sci_buf_t sci_buf[2];\n\nvoid BOARD_SCI_TXI_HANDLER(void)\n{\n  uint8_t *buf = sci_buf[0].buf;\n  uint32_t cnt = sci_buf[0].cnt;\n\n  if (!buf || !cnt) {\n    BOARD_UART_SCI.SCR.BYTE &= ~(SCI_SCR_TEIE | SCI_SCR_TE | SCI_SCR_TIE);\n    return;\n  }\n  BOARD_UART_SCI.TDR = *buf;\n  if (--cnt) {\n    ++buf;\n  } else {\n    buf = NULL;\n    BOARD_UART_SCI.SCR.BIT.TIE  = 0;\n    BOARD_UART_SCI.SCR.BIT.TEIE = 1;\n  }\n  sci_buf[0].buf = buf;\n  sci_buf[0].cnt = cnt;\n}\n\nvoid BOARD_SCI_TEI_HANDLER(void)\n{\n  BOARD_UART_SCI.SCR.BYTE &= ~(SCI_SCR_TEIE | SCI_SCR_TE | SCI_SCR_TIE);\n}\n\nvoid BOARD_SCI_RXI_HANDLER(void)\n{\n  uint8_t *buf = sci_buf[1].buf;\n  uint32_t cnt = sci_buf[1].cnt;\n\n  if (!buf || !cnt ||\n      (BOARD_UART_SCI.SSR.BYTE & (SCI_SSR_FER | SCI_SSR_ORER))) {\n    sci_buf[1].buf = NULL;\n    BOARD_UART_SCI.SSR.BYTE   = 0;\n    BOARD_UART_SCI.SCR.BYTE  &= ~(SCI_SCR_RE | SCI_SCR_RIE);\n    return;\n  }\n  *buf = BOARD_UART_SCI.RDR;\n  if (--cnt) {\n    ++buf;\n  } else {\n    buf = NULL;\n    BOARD_UART_SCI.SCR.BYTE &= ~(SCI_SCR_RE | SCI_SCR_RIE);\n  }\n  sci_buf[1].buf = buf;\n  sci_buf[1].cnt = cnt;\n}\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid BOARD_USB_IRQ_HANDLER(void)\n{\n#if CFG_TUH_ENABLED\n  tuh_int_handler(0, true);\n#endif\n#if CFG_TUD_ENABLED\n  tud_int_handler(0);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board init\n//--------------------------------------------------------------------+\nvoid board_init(void)\n{\n#if CFG_TUSB_OS == OPT_OS_NONE\n  /* Enable CMT0 */\n  SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;\n  MSTP(CMT0)       = 0;\n  SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY;\n  /* Setup 1ms tick timer */\n  CMT0.CMCNT      = 0;\n  CMT0.CMCOR      = BOARD_PCLK / 1000 / 128;\n  CMT0.CMCR.WORD  = CMT_CMCR_CMIE | CMT_CMCR_CKS_DIV_128;\n  IR(CMT0, CMI0)  = 0;\n  IPR(CMT0, CMI0) = IRQ_PRIORITY_CMT0;\n  IEN(CMT0, CMI0) = 1;\n  CMT.CMSTR0.BIT.STR0 = 1;\n#endif\n\n  /* Board-specific: pin mux, SCI, USB pin config */\n  board_pin_init();\n\n  /* Enable USB0 module */\n  unsigned short oldPRCR = SYSTEM.PRCR.WORD;\n  SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;\n  MSTP(USB0) = 0;\n  SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | oldPRCR;\n\n  /* USB IRQ */\n  IR(USB0, USBI0)  = 0;\n  IPR(USB0, USBI0) = IRQ_PRIORITY_USBI0;\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  BOARD_LED_WRITE(state);\n}\n\nuint32_t board_button_read(void)\n{\n  return BOARD_BUTTON_READ();\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  sci_buf[1].buf = buf;\n  sci_buf[1].cnt = len;\n  BOARD_UART_SCI.SCR.BYTE |= SCI_SCR_RE | SCI_SCR_RIE;\n  while (BOARD_UART_SCI.SCR.BIT.RE) ;\n  return len - sci_buf[1].cnt;\n}\n\nint board_uart_write(void const *buf, int len)\n{\n  sci_buf[0].buf = (uint8_t*)(uintptr_t) buf;\n  sci_buf[0].cnt = len;\n  BOARD_UART_SCI.SCR.BYTE |= SCI_SCR_TE | SCI_SCR_TIE;\n  while (BOARD_UART_SCI.SCR.BIT.TE) ;\n  return len;\n}\n\n//--------------------------------------------------------------------+\n// Tick timer\n//--------------------------------------------------------------------+\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid INT_Excep_CMT0_CMI0(void)\n{\n  ++system_ticks;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n#else\nuint32_t SystemCoreClock = BOARD_CPUCLK;\n#endif\n\n//--------------------------------------------------------------------+\n// Newlib syscall stubs\n//--------------------------------------------------------------------+\nint close(int fd)\n{\n  (void)fd;\n  return -1;\n}\n\nint fstat(int fd, void *pstat)\n{\n  (void)fd;\n  (void)pstat;\n  return 0;\n}\n\noff_t lseek(int fd, off_t pos, int whence)\n{\n  (void)fd;\n  (void)pos;\n  (void)whence;\n  return 0;\n}\n\nint isatty(int fd)\n{\n  (void)fd;\n  return 1;\n}\n"
  },
  {
    "path": "hw/bsp/rx/family.cmake",
    "content": "include_guard()\n\nset(MCU_DIR ${TOP}/hw/mcu/renesas/rx)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/rx_gcc.cmake)\n\nset(FAMILY_MCUS ${MCU_FAMILY} CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${MCU_DIR}/${MCU_VARIANT}/vects.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${MCU_DIR}/${MCU_VARIANT}\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    SSIZE_MAX=__INT_MAX__\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${MCU_FAMILY})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/renesas/rusb2/rusb2_common.c\n    ${TOP}/src/portable/renesas/rusb2/dcd_rusb2.c\n    ${TOP}/src/portable/renesas/rusb2/hcd_rusb2.c\n    ${MCU_DIR}/${MCU_VARIANT}/start.S\n    ${BOARD_SOURCES}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_compile_options(${TARGET} PUBLIC\n      -Wno-error=redundant-decls\n      )\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  endif ()\n\n  set_source_files_properties(${MCU_DIR}/${MCU_VARIANT}/start.S PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Suppress warnings for board-specific and family source files\n  set_source_files_properties(\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${BOARD_SOURCES}\n    PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  family_flash_rfp(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/rx/family.mk",
    "content": "# Cross Compiler for RX\nCROSS_COMPILE = rx-elf-\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\nCFLAGS += \\\n  -nostartfiles \\\n  -ffunction-sections \\\n  -fdata-sections \\\n  -fshort-enums \\\n  -mlittle-endian-data \\\n  -DSSIZE_MAX=__INT_MAX__\n\n# suppress warning caused by vendor mcu driver\nCFLAGS += -Wno-error=redundant-decls\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/renesas/rusb2/dcd_rusb2.c \\\n\tsrc/portable/renesas/rusb2/hcd_rusb2.c \\\n\tsrc/portable/renesas/rusb2/rusb2_common.c \\\n\t$(MCU_DIR)/vects.c \\\n\t$(FAMILY_PATH)/family.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(MCU_DIR)\n\nSRC_S += $(MCU_DIR)/start.S\n\n$(BUILD)/$(PROJECT).mot: $(BUILD)/$(PROJECT).elf\n\t@echo CREATE $@\n\t$(OBJCOPY) -O srec -I elf32-rx-be-ns $^ $@\n\n# flash using rfp-cli\nflash-rfp: $(BUILD)/$(PROJECT).mot\n\trfp-cli -device rx65x -tool e2l -if fine -fo id FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -auth id FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF -auto $^\n"
  },
  {
    "path": "hw/bsp/samd11/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"sam.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/samd11/boards/cynthion_d11/board.cmake",
    "content": "set(JLINK_DEVICE ATSAMD11D14)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/cynthion_d11.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD11D14AM__\n    _BOARD_REVISION_MAJOR_=1\n    _BOARD_REVISION_MINOR_=0\n    )\n\n  target_link_options(${BOARD_TARGET} PUBLIC\n    -Wl,--defsym=BOOTLOADER_SIZE=0x800\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd11/boards/cynthion_d11/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Great Scott Gadgets Cynthion\n   url: https://greatscottgadgets.com/cynthion/\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               PIN_PA27 // pin PA22\n#define LED_STATE_ON          0\n\n// Button\n#if ((_BOARD_REVISION_MAJOR_ == 0) && (_BOARD_REVISION_MINOR_ < 6))\n#define BUTTON_PIN            PIN_PA16 // pin PB22\n#define BUTTON_PULL_MODE      GPIO_PULL_UP\n#else\n#define BUTTON_PIN            PIN_PA02\n#define BUTTON_PULL_MODE      GPIO_PULL_OFF\n#endif\n#define BUTTON_STATE_ACTIVE   0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd11/boards/cynthion_d11/board.mk",
    "content": "BOARD_REVISION_MAJOR ?= 1\nBOARD_REVISION_MINOR ?= 0\n\nCFLAGS += -D__SAMD11D14AM__ \\\n\t-D_BOARD_REVISION_MAJOR_=$(BOARD_REVISION_MAJOR) \\\n\t-D_BOARD_REVISION_MINOR_=$(BOARD_REVISION_MINOR)\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/cynthion_d11.ld\n\n# Default bootloader size is now 2K, allow to specify other\nifeq ($(BOOTLOADER_SIZE), )\n\tBOOTLOADER_SIZE := 0x800\nendif\nLDFLAGS += -Wl,--defsym=BOOTLOADER_SIZE=$(BOOTLOADER_SIZE)\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD11D14\n\n# flash using dfu-util\nflash: $(BUILD)/$(PROJECT).bin\n\tdfu-util -a 0 -d 1d50:615c -D $< || dfu-util -a 0 -d 16d0:05a5 -D $<\n"
  },
  {
    "path": "hw/bsp/samd11/boards/cynthion_d11/cynthion_d11.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD11D14AM\n *\n * Copyright (c) 2018 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\nENTRY(Reset_Handler)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + BOOTLOADER_SIZE, LENGTH = 0x00004000 - BOOTLOADER_SIZE\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00001000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x400;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd11/boards/samd11_xplained/board.cmake",
    "content": "set(JLINK_DEVICE ATSAMD11D14)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/samd11d14am_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD11D14AM__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd11/boards/samd11_xplained/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SAMD11 Xplained Pro\n   url: https://www.microchip.com/en-us/development-tool/ATSAMD11-XPRO\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               PIN_PA16 // pin PA22\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            PIN_PA14 // pin PB22\n#define BUTTON_STATE_ACTIVE   0\n#define BUTTON_PULL_MODE      GPIO_PULL_UP\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd11/boards/samd11_xplained/board.mk",
    "content": "CFLAGS += -D__SAMD11D14AM__\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/samd11d14am_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD11D14\n\n# flash using edbg\nflash: $(BUILD)/$(PROJECT).bin\n\tedbg -b -t samd11 -e -pv -f $<\n"
  },
  {
    "path": "hw/bsp/samd11/boards/samd11_xplained/samd11d14am_flash.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD11D14AM\n *\n * Copyright (c) 2018 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\nENTRY(Reset_Handler)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00004000\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00001000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x400;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd11/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Microchip\n*/\n\n#include \"sam.h\"\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#endif\n\n#include \"hal/include/hal_gpio.h\"\n#include \"hal/include/hal_init.h\"\n#include \"hri/hri_nvmctrl_d11.h\"\n\n#include \"hpl/gclk/hpl_gclk_base.h\"\n#include \"hpl_pm_config.h\"\n#include \"hpl/pm/hpl_pm_base.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_Handler(void)\n{\n  tud_int_handler(0);\n}\n\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n/* Referenced GCLKs, should be initialized firstly */\n#define _GCLK_INIT_1ST (1 << 0 | 1 << 1)\n\n/* Not referenced GCLKs, initialized last */\n#define _GCLK_INIT_LAST (~_GCLK_INIT_1ST)\n\nvoid board_init(void)\n{\n  // Clock init ( follow hpl_init.c )\n  hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, 2);\n\n  _pm_init();\n  _sysctrl_init_sources();\n#if _GCLK_INIT_1ST\n  _gclk_init_generators_by_fref(_GCLK_INIT_1ST);\n#endif\n  _sysctrl_init_referenced_generators();\n  _gclk_init_generators_by_fref(_GCLK_INIT_LAST);\n\n  // 1ms tick timer (samd SystemCoreClock may not correct)\n  SystemCoreClock = CONF_CPU_FREQUENCY;\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(CONF_CPU_FREQUENCY / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  // Led init\n  gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(LED_PIN, 0);\n\n  // Button init\n  gpio_set_pin_direction(BUTTON_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(BUTTON_PIN, BUTTON_PULL_MODE);\n\n  /* USB Clock init\n   * The USB module requires a GCLK_USB of 48 MHz ~ 0.25% clock\n   * for low speed and full speed operation. */\n  _pm_enable_bus_clock(PM_BUS_APBB, USB);\n  _pm_enable_bus_clock(PM_BUS_AHB, USB);\n  _gclk_enable_channel(USB_GCLK_ID, GCLK_CLKCTRL_GEN_GCLK0_Val);\n\n  // USB Pin Init\n  gpio_set_pin_direction(PIN_PA24, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(PIN_PA24, false);\n  gpio_set_pin_pull_mode(PIN_PA24, GPIO_PULL_OFF);\n  gpio_set_pin_direction(PIN_PA25, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(PIN_PA25, false);\n  gpio_set_pin_pull_mode(PIN_PA25, GPIO_PULL_OFF);\n\n  gpio_set_pin_function(PIN_PA24, PINMUX_PA24G_USB_DM);\n  gpio_set_pin_function(PIN_PA25, PINMUX_PA25G_USB_DP);\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state)\n{\n  gpio_set_pin_level(LED_PIN, state ? LED_STATE_ON : (1-LED_STATE_ON));\n}\n\nuint32_t board_button_read(void)\n{\n  return BUTTON_STATE_ACTIVE == gpio_get_pin_level(BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\n\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler (void)\n{\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void)\n{\n  return system_ticks;\n}\n\nvoid _init(void);\nvoid _init(void) {\n  // This _init() standin makes certain GCC environments happier.\n  // They expect the main binary to have a constructor called _init; but don't provide a weak default.\n  // Providing an empty constructor satisfies this odd case, and doesn't harm anything.\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/samd11/family.cmake",
    "content": "include_guard()\n\nset(SAM_FAMILY samd11)\nset(SDK_DIR ${TOP}/hw/mcu/microchip/${SAM_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS SAMD11 CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f interface/cmsis-dap.cfg -c \\\"transport select swd\\\" -f target/at91samdXX.cfg\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/gcc/gcc/startup_${SAM_FAMILY}.c)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/gcc/system_${SAM_FAMILY}.c\n    ${SDK_DIR}/hal/src/hal_atomic.c\n    ${SDK_DIR}/hpl/gclk/hpl_gclk.c\n    ${SDK_DIR}/hpl/pm/hpl_pm.c\n    ${SDK_DIR}/hpl/sysctrl/hpl_sysctrl.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}\n    ${SDK_DIR}/config\n    ${SDK_DIR}/include\n    ${SDK_DIR}/hal/include\n    ${SDK_DIR}/hal/utils/include\n    ${SDK_DIR}/hpl/pm\n    ${SDK_DIR}/hpl/port\n    ${SDK_DIR}/hri\n    ${CMSIS_5}/CMSIS/Core/Include\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CONF_DFLL_OVERWRITE_CALIBRATION=0\n    OSC32K_OVERWRITE_CALIBRATION=0\n    CFG_EXAMPLE_MSC_READONLY\n    CFG_EXAMPLE_VIDEO_READONLY\n    CFG_EXAMPLE_MTP_READONLY\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_SAMD11)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/microchip/samd/dcd_samd.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_openocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd11/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\n\nCFLAGS += \\\n  -mthumb \\\n  -nostdlib -nostartfiles \\\n  -DCONF_DFLL_OVERWRITE_CALIBRATION=0 \\\n  -DOSC32K_OVERWRITE_CALIBRATION=0 \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -DCFG_EXAMPLE_MTP_READONLY \\\n  -DCFG_TUSB_MCU=OPT_MCU_SAMD11\n\n# suppress warning caused by vendor mcu driver\nCFLAGS += -Wno-error=redundant-decls\n\n# SAM driver is flooded with -Wcast-qual which slow down complication significantly\nCFLAGS_SKIP += -Wcast-qual\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/microchip/samd/dcd_samd.c \\\n\thw/mcu/microchip/samd11/gcc/system_samd11.c \\\n\thw/mcu/microchip/samd11/gcc/gcc/startup_samd11.c \\\n\thw/mcu/microchip/samd11/hal/src/hal_atomic.c \\\n\thw/mcu/microchip/samd11/hpl/gclk/hpl_gclk.c \\\n\thw/mcu/microchip/samd11/hpl/pm/hpl_pm.c \\\n\thw/mcu/microchip/samd11/hpl/sysctrl/hpl_sysctrl.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/hw/mcu/microchip/samd11/ \\\n\t$(TOP)/hw/mcu/microchip/samd11/config \\\n\t$(TOP)/hw/mcu/microchip/samd11/include \\\n\t$(TOP)/hw/mcu/microchip/samd11/hal/include \\\n\t$(TOP)/hw/mcu/microchip/samd11/hal/utils/include \\\n\t$(TOP)/hw/mcu/microchip/samd11/hpl/pm/ \\\n\t$(TOP)/hw/mcu/microchip/samd11/hpl/port \\\n\t$(TOP)/hw/mcu/microchip/samd11/hri \\\n\t$(TOP)/hw/mcu/microchip/samd11/CMSIS/Include \\\n\t$(TOP)/hw/mcu/microchip/samd11/CMSIS/Core/Include\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"sam.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/atsamd21_xpro/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21J18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/samd21j18a_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21J18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/atsamd21_xpro/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SAMD21 Xplained Pro\n   url: https://www.microchip.com/DevelopmentTools/ProductDetails/ATSAMD21-XPRO\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               (32 + 30) // PB30\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            (0  + 15) // PA15\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           4\n#define UART_TX_PIN           5\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/atsamd21_xpro/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21J18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/samd21j18a_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21J18\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/atsamd21_xpro/samd21j18a_flash.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21J18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/atsaml21_xpro/board.cmake",
    "content": "set(SAM_FAMILY saml21)\nset(JLINK_DEVICE ATSAML21J18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/saml21j18b_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAML21J18B__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/atsaml21_xpro/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SAML21 Xplained Pro\n   url: https://www.microchip.com/en-us/development-tool/atsaml21-xpro-b\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               (32 + 30) // PB30\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            (0  + 15) // PA15\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           4\n#define UART_TX_PIN           5\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/atsaml21_xpro/board.mk",
    "content": "SAM_FAMILY = saml21\n\nCFLAGS += -D__SAML21J18B__\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/saml21j18b_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAML21J18\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/atsaml21_xpro/saml21j18b_flash.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAML21J18B\n *\n * Copyright (c) 2016 Atmel Corporation,\n *                    a wholly owned subsidiary of Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\nENTRY(Reset_Handler)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n  lpram    (rwx) : ORIGIN = 0x30000000, LENGTH = 0x00002000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .lpram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _slpram = .;\n        *(.lpram .lpram.*);\n        . = ALIGN(8);\n        _elpram = .;\n    } > lpram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/circuitplayground_express/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21G18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21G18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/circuitplayground_express/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Circuit Playground Express\n   url: https://www.adafruit.com/product/3333\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               17\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            28\n#define BUTTON_STATE_ACTIVE   1\n\n// UART\n#define UART_RX_PIN           4\n#define UART_TX_PIN           5\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/circuitplayground_express/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21G18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21G18\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/circuitplayground_express/circuitplayground_express.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/curiosity_nano/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE atsamd21g17a)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/samd21g17a_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21G17A__\n    CFG_EXAMPLE_MSC_READONLY\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/curiosity_nano/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SAMD21 Curiosty Nano\n   url: https://www.microchip.com/en-us/development-tool/dm320119\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               (32 + 10) // PB10\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            (0  + 11) // PB11\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           31\t// CDC5_RX\n#define UART_TX_PIN           37\t// CDC5_TX\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/curiosity_nano/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21G17A__ -DCFG_EXAMPLE_MSC_READONLY -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/samd21g17a_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = atsamd21g17a\n\n# flash using jlink (options are: jlink/cmsisdap/stlink/dfu)\n#flash: flash-jlink\n\nPYOCD_TARGET = atsamd21g17a\nPYOCD_OPTION = -O dap_protocol=swd\nflash: flash-pyocd\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/curiosity_nano/samd21g17a_flash.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G17A/D\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00020000\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00004000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/cynthion_d21/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21G18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/samd21g18a_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21G18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\n  target_link_options(${TARGET} PUBLIC\n    \"LINKER:--defsym=BOOTLOADER_SIZE=0x800\"\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/cynthion_d21/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Great Scott Gadgets Cynthion\n   url: https://greatscottgadgets.com/cynthion/\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               PIN_PA22\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            PIN_PB22\n#define BUTTON_STATE_ACTIVE   0\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/cynthion_d21/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21G18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\nLD_FILE = $(BOARD_PATH)/samd21g18a_flash.ld\n\n# Default bootloader size is now 2K, allow to specify other\nifeq ($(BOOTLOADER_SIZE), )\n\tBOOTLOADER_SIZE := 0x800\nendif\nLDFLAGS += -Wl,--defsym=BOOTLOADER_SIZE=$(BOOTLOADER_SIZE)\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21G18\n\n# flash using dfu-util\nflash: $(BUILD)/$(PROJECT).bin\n\tdfu-util -a 0 -d 1d50:615c -D $< || dfu-util -a 0 -d 16d0:05a5 -D $<\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/cynthion_d21/samd21g18a_flash.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + BOOTLOADER_SIZE, LENGTH = 0x00040000 - BOOTLOADER_SIZE\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/feather_m0_express/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21G18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21G18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/feather_m0_express/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather M0 Express\n   url: https://www.adafruit.com/product/3403\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               17\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            15\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           4\n#define UART_TX_PIN           5\n\n// SPI for USB host shield\n#define MAX3421_SERCOM_ID       4       // SERCOM4\n#define MAX3421_SERCOM_FUNCTION 3       // function D (Sercom Alt)\n\n#define MAX3421_SCK_PIN         (32+11)\n#define MAX3421_MOSI_PIN        (32+10)\n#define MAX3421_MISO_PIN        12\n#define MAX3421_TX_PAD          1 // MOSI = PAD_2, SCK = PAD_3\n#define MAX3421_RX_PAD          0 // MISO = PAD_2\n\n#define MAX3421_CS_PIN          18     // D10\n\n#define MAX3421_INTR_PIN        7      // D10\n#define MAX3421_INTR_EIC_ID     7      // EIC7\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/feather_m0_express/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21G18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21G18\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/feather_m0_express/feather_m0_express.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/itsybitsy_m0/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21G18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21G18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/itsybitsy_m0/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit ItsyBitsy M0\n   url: https://www.adafruit.com/product/3727\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               17\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            21\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           4\n#define UART_TX_PIN           5\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/itsybitsy_m0/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21G18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21G18\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/itsybitsy_m0/itsybitsy_m0.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/metro_m0_express/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21G18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21G18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/metro_m0_express/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Metro M0 Express\n   url: https://www.adafruit.com/product/3505\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               17\n#define LED_STATE_ON          1\n\n// Button: D5\n#define BUTTON_PIN            15\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           4\n#define UART_TX_PIN           5\n\n// SPI for USB host shield\n#define MAX3421_SERCOM_ID       4       // SERCOM4\n#define MAX3421_SERCOM_FUNCTION 3       // function D (Sercom Alt)\n\n#define MAX3421_SCK_PIN         (32+11)\n#define MAX3421_MOSI_PIN        (32+10)\n#define MAX3421_MISO_PIN        12\n#define MAX3421_TX_PAD          1 // MOSI = PAD_2, SCK = PAD_3\n#define MAX3421_RX_PAD          0 // MISO = PAD_2\n\n#define MAX3421_CS_PIN          18      // D10\n\n#define MAX3421_INTR_PIN        7       // D9\n#define MAX3421_INTR_EIC_ID     7       // EIC7\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/metro_m0_express/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21G18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21G18\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/metro_m0_express/metro_m0_express.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/qtpy/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21E18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21E18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/qtpy/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit QT Py\n   url: https://www.adafruit.com/product/4600\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED is neopixel, leave unset for now\n\n// Button is wired to reset\n\n// UART\n#define UART_RX_PIN           8\n#define UART_TX_PIN           7\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/qtpy/board.mk",
    "content": "SAM_FAMILY = samd21\n\n# For Adafruit QT Py board\n\nCFLAGS += -D__SAMD21E18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21E18\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/qtpy/qtpy.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/saml22_feather/board.cmake",
    "content": "set(SAM_FAMILY saml22)\nset(JLINK_DEVICE ATSAML22J18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAML22J18A__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/saml22_feather/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SAML22 Feather\n   url: https://github.com/joeycastillo/Feather-Projects/tree/main/SAML22%20Feather\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               PIN_PA08\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            PIN_PA06\n#define BUTTON_STATE_ACTIVE   0\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/saml22_feather/board.mk",
    "content": "SAM_FAMILY = saml22\n\nCFLAGS += -D__SAML22J18A__\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAML22J18\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/saml22_feather/saml22_feather.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAML22J18A\n *\n * Copyright (c) 2018 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\nENTRY(Reset_Handler)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/seeeduino_xiao/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21G18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21G18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/seeeduino_xiao/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Seeeduino XIAO\n   url: https://wiki.seeedstudio.com/Seeeduino-XIAO/\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               17\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PIN            9 // PA4 pin D1 on seed input\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_RX_PIN           4\n#define UART_TX_PIN           5\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/seeeduino_xiao/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21G18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21G18\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/seeeduino_xiao/seeeduino_xiao.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K  /* 8K offset to preserve bootloader */\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/sensorwatch_m0/board.cmake",
    "content": "set(SAM_FAMILY saml22)\nset(JLINK_DEVICE ATSAML21J18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAML22J18A__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/sensorwatch_m0/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SensorWatch\n   url: https://github.com/joeycastillo/Sensor-Watch\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               PIN_PA21\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            PIN_PA22\n#define BUTTON_STATE_ACTIVE   1\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/sensorwatch_m0/board.mk",
    "content": "SAM_FAMILY = saml22\n\nCFLAGS += -D__SAML22J18A__\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAML22J18\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/sensorwatch_m0/sensorwatch_m0.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAML22J18A\n *\n * Copyright (c) 2018 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\nENTRY(Reset_Handler)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00040000\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/sparkfun_samd21_mini_usb/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21G18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21G18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/sparkfun_samd21_mini_usb/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SparkFun SAMD21 Mini\n   url: https://www.sparkfun.com/products/13664\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               17 // PA17 (D13)\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            14 // PA14 (D2)\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_SERCOM           0\n#define UART_RX_PIN           11 // PA11 D0\n#define UART_TX_PIN           10 // PA10 D1\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport;\n  gpio_set_pin_direction(PIN_PA28, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(PIN_PA28, state);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/sparkfun_samd21_mini_usb/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21G18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD21G18\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/sparkfun_samd21_mini_usb/sparkfun_samd21_mini_usb.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000-0x0004 /* 4 bytes used by bootloader to keep data between resets */\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/trinket_m0/board.cmake",
    "content": "set(SAM_FAMILY samd21)\nset(JLINK_DEVICE ATSAMD21E18)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD21E18A__\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/trinket_m0/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Jean Gressmann <jean@0x42.de>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* metadata:\n   name: Adafruit Trinket M0\n   url: https://www.adafruit.com/product/3500\n*/\n\n#pragma once\n\n// LED\n#define LED_PIN               10 // PA10\n#define LED_STATE_ON          1\n\n// UART\n#define UART_SERCOM           0\n#define UART_RX_PIN           7\n#define UART_TX_PIN           6\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/trinket_m0/board.mk",
    "content": "SAM_FAMILY = samd21\n\nCFLAGS += -D__SAMD21E18A__ -DCFG_EXAMPLE_VIDEO_READONLY\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/trinket_m0.ld\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/boards/trinket_m0/trinket_m0.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD21G18A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 8K, LENGTH = 0x00040000 - 8K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00008000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x2000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Microchip\n*/\n\n#include \"sam.h\"\n#include \"bsp/board_api.h\"\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#endif\n\n#include \"hal/include/hal_gpio.h\"\n#include \"hal/include/hal_init.h\"\n#include \"hpl/gclk/hpl_gclk_base.h\"\n\n// SAMD21 specific includes\n#if defined(__SAMD21E15A__) || defined(__SAMD21E16A__) || defined(__SAMD21E17A__) || defined(__SAMD21E18A__) || \\\n    defined(__SAMD21G15A__) || defined(__SAMD21G16A__) || defined(__SAMD21G17A__) || defined(__SAMD21G18A__) || \\\n    defined(__SAMD21J15A__) || defined(__SAMD21J16A__) || defined(__SAMD21J17A__) || defined(__SAMD21J18A__)\n  #define SAMD21_FAMILY\n  #include \"hri/hri_nvmctrl_d21.h\"\n  #include \"hpl_pm_config.h\"\n  #include \"hpl/pm/hpl_pm_base.h\"\n#endif\n\n// SAML21/22 specific includes\n#if defined(__SAML21E15B__) || defined(__SAML21E16B__) || defined(__SAML21E17B__) || defined(__SAML21E18B__) || \\\n    defined(__SAML21G16B__) || defined(__SAML21G17B__) || defined(__SAML21G18B__) || \\\n    defined(__SAML21J16B__) || defined(__SAML21J17B__) || defined(__SAML21J18B__) || \\\n    defined(__SAML22G16A__) || defined(__SAML22G17A__) || defined(__SAML22G18A__) || \\\n    defined(__SAML22J16A__) || defined(__SAML22J17A__) || defined(__SAML22J18A__) || \\\n    defined(__SAML22N16A__) || defined(__SAML22N17A__) || defined(__SAML22N18A__)\n  #define SAML2X_FAMILY\n  #include \"hpl_mclk_config.h\"\n#endif\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"board.h\"\n\n// board_vbus_set is defined in board.h for boards that support it\n#if !defined(board_vbus_set)\n  #define board_vbus_set(rhport, state) do { (void)(rhport); (void)(state); } while(0)\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n#ifdef SAMD21_FAMILY\n/* Referenced GCLKs, should be initialized firstly */\n#define _GCLK_INIT_1ST (1 << 0 | 1 << 1)\n/* Not referenced GCLKs, initialized last */\n#define _GCLK_INIT_LAST (~_GCLK_INIT_1ST)\n#endif\n\n#ifdef SAML2X_FAMILY\n/* Referenced GCLKs (out of 0~4), should be initialized firstly */\n#define _GCLK_INIT_1ST 0x00000000\n/* Not referenced GCLKs, initialized last */\n#define _GCLK_INIT_LAST 0x0000001F\n#endif\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_Handler(void) {\n#if CFG_TUD_ENABLED\n  tud_int_handler(0);\n#endif\n\n#if CFG_TUH_ENABLED && !CFG_TUH_MAX3421\n  tuh_int_handler(0);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Implementation\n//--------------------------------------------------------------------+\nstatic void uart_init(void);\n\n#if CFG_TUH_ENABLED && CFG_TUH_MAX3421\n#define MAX3421_SERCOM TU_XSTRCAT(SERCOM, MAX3421_SERCOM_ID)\nstatic void max3421_init(void);\n#endif\n\nvoid board_init(void) {\n#ifdef SAMD21_FAMILY\n  // Clock init for SAMD21 ( follow hpl_init.c )\n  hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, 2);\n\n  _pm_init();\n  _sysctrl_init_sources();\n#if _GCLK_INIT_1ST\n  _gclk_init_generators_by_fref(_GCLK_INIT_1ST);\n#endif\n  _sysctrl_init_referenced_generators();\n  _gclk_init_generators_by_fref(_GCLK_INIT_LAST);\n#endif\n\n#ifdef SAML2X_FAMILY\n  // Clock init for SAML2x ( follow hpl_init.c )\n  hri_nvmctrl_set_CTRLB_RWS_bf(NVMCTRL, CONF_NVM_WAIT_STATE);\n\n  _set_performance_level(2);\n\n  _osc32kctrl_init_sources();\n  _oscctrl_init_sources();\n  _mclk_init();\n#if _GCLK_INIT_1ST\n  _gclk_init_generators_by_fref(_GCLK_INIT_1ST);\n#endif\n  _oscctrl_init_referenced_generators();\n  _gclk_init_generators_by_fref(_GCLK_INIT_LAST);\n\n#if (CONF_PORT_EVCTRL_PORT_0 | CONF_PORT_EVCTRL_PORT_1 | CONF_PORT_EVCTRL_PORT_2 | CONF_PORT_EVCTRL_PORT_3)\n  hri_port_set_EVCTRL_reg(PORT, 0, CONF_PORTA_EVCTRL);\n  hri_port_set_EVCTRL_reg(PORT, 1, CONF_PORTB_EVCTRL);\n#endif\n#endif\n\n  // Update SystemCoreClock since it is hard coded with asf4 and not correct\n  // Init 1ms tick timer (samd SystemCoreClock may not correct)\n  SystemCoreClock = CONF_CPU_FREQUENCY;\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(CONF_CPU_FREQUENCY / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  // Led init\n#ifdef LED_PIN\n  gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT);\n  board_led_write(false);\n#endif\n\n  // Button init\n#ifdef BUTTON_PIN\n  gpio_set_pin_direction(BUTTON_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(BUTTON_PIN, BUTTON_STATE_ACTIVE ? GPIO_PULL_DOWN : GPIO_PULL_UP);\n#endif\n\n  uart_init();\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  /* USB Clock init\n   * The USB module requires a GCLK_USB of 48 MHz ~ 0.25% clock\n   * for low speed and full speed operation. */\n#ifdef SAMD21_FAMILY\n  _pm_enable_bus_clock(PM_BUS_APBB, USB);\n  _pm_enable_bus_clock(PM_BUS_AHB, USB);\n  _gclk_enable_channel(USB_GCLK_ID, GCLK_CLKCTRL_GEN_GCLK0_Val);\n#endif\n\n#ifdef SAML2X_FAMILY\n  hri_gclk_write_PCHCTRL_reg(GCLK, USB_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK1_Val | GCLK_PCHCTRL_CHEN);\n  hri_mclk_set_AHBMASK_USB_bit(MCLK);\n  hri_mclk_set_APBBMASK_USB_bit(MCLK);\n#endif\n\n  // USB Pin Init\n  gpio_set_pin_direction(PIN_PA24, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(PIN_PA24, false);\n  gpio_set_pin_pull_mode(PIN_PA24, GPIO_PULL_OFF);\n  gpio_set_pin_direction(PIN_PA25, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(PIN_PA25, false);\n  gpio_set_pin_pull_mode(PIN_PA25, GPIO_PULL_OFF);\n\n  gpio_set_pin_function(PIN_PA24, PINMUX_PA24G_USB_DM);\n  gpio_set_pin_function(PIN_PA25, PINMUX_PA25G_USB_DP);\n\n#ifdef SAMD21_FAMILY\n  // Output 500hz PWM on D12 (PA19 - TCC0 WO[3]) so we can validate the GCLK0 clock speed with a Saleae.\n  _pm_enable_bus_clock(PM_BUS_APBC, TCC0);\n  TCC0->PER.bit.PER = 48000000 / 1000;\n  TCC0->CC[3].bit.CC = 48000000 / 2000;\n  TCC0->CTRLA.bit.ENABLE = true;\n\n  gpio_set_pin_function(PIN_PA19, PINMUX_PA19F_TCC0_WO3);\n  _gclk_enable_channel(TCC0_GCLK_ID, GCLK_CLKCTRL_GEN_GCLK0_Val);\n#endif\n\n#if CFG_TUH_ENABLED\n  #if CFG_TUH_MAX3421\n    max3421_init();\n  #else\n    // VBUS Power\n    board_vbus_set(0, true);\n  #endif\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  (void) state;\n#ifdef LED_PIN\n  gpio_set_pin_level(LED_PIN, state ? LED_STATE_ON : (1 - LED_STATE_ON));\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef BUTTON_PIN\n  return BUTTON_STATE_ACTIVE == gpio_get_pin_level(BUTTON_PIN);\n#else\n  return 0;\n#endif\n}\n\n#if defined(UART_SERCOM)\n\n#define BOARD_SERCOM2(n)  SERCOM ## n\n#define BOARD_SERCOM(n) BOARD_SERCOM2(n)\n\nstatic void uart_init(void)\n{\n#if UART_SERCOM == 0\n  #if UART_TX_PIN == 6\n    gpio_set_pin_function(PIN_PA06, PINMUX_PA06D_SERCOM0_PAD2);\n  #elif UART_TX_PIN == 10\n    gpio_set_pin_function(PIN_PA10, PINMUX_PA10C_SERCOM0_PAD2);\n  #else\n    #error \"UART_TX_PIN not supported\"\n  #endif\n\n  #if UART_RX_PIN == 7\n    gpio_set_pin_function(PIN_PA07, PINMUX_PA07D_SERCOM0_PAD3);\n  #elif UART_RX_PIN == 11\n    gpio_set_pin_function(PIN_PA11, PINMUX_PA11C_SERCOM0_PAD3);\n  #else\n    #error \"UART_RX_PIN not supported\"\n#endif\n\n#ifdef SAMD21_FAMILY\n  // setup clock (48MHz)\n  _pm_enable_bus_clock(PM_BUS_APBC, SERCOM0);\n  _gclk_enable_channel(SERCOM0_GCLK_ID_CORE, GCLK_CLKCTRL_GEN_GCLK0_Val);\n#endif\n\n#ifdef SAML2X_FAMILY\n  // setup clock (48MHz)\n  hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM0_GCLK_ID_CORE, GCLK_PCHCTRL_GEN_GCLK1_Val | GCLK_PCHCTRL_CHEN);\n  hri_mclk_set_APBCMASK_SERCOM0_bit(MCLK);\n#endif\n\n  SERCOM0->USART.CTRLA.bit.SWRST = 1; /* reset SERCOM & enable config */\n  while(SERCOM0->USART.SYNCBUSY.bit.SWRST);\n\n  SERCOM0->USART.CTRLA.reg  =  /* CMODE = 0 -> async, SAMPA = 0, FORM = 0 -> USART frame, SMPR = 0 -> arithmetic baud rate */\n    SERCOM_USART_CTRLA_SAMPR(1) | /* 0 = 16x / arithmetic baud rate, 1 = 16x / fractional baud rate */\n//    SERCOM_USART_CTRLA_FORM(0) | /* 0 = USART Frame, 2 = LIN Master */\n    SERCOM_USART_CTRLA_DORD | /* LSB first */\n    SERCOM_USART_CTRLA_MODE(1) | /* 0 = Asynchronous, 1 = USART with internal clock */\n    SERCOM_USART_CTRLA_RXPO(3) | /* pad 3 */\n    SERCOM_USART_CTRLA_TXPO(1);  /* pad 2 */\n\n  SERCOM0->USART.CTRLB.reg =\n    SERCOM_USART_CTRLB_TXEN | /* tx enabled */\n    SERCOM_USART_CTRLB_RXEN;  /* rx enabled */\n\n  /* 115200 */\n  SERCOM0->USART.BAUD.reg = SERCOM_USART_BAUD_FRAC_FP(0) | SERCOM_USART_BAUD_FRAC_BAUD(26);\n\n  SERCOM0->USART.CTRLA.bit.ENABLE = 1; /* activate SERCOM */\n  while(SERCOM0->USART.SYNCBUSY.bit.ENABLE); /* wait for SERCOM to be ready */\n#endif\n}\n\nstatic inline void uart_send_buffer(uint8_t const *text, size_t len)\n{\n  for (size_t i = 0; i < len; ++i) {\n    BOARD_SERCOM(UART_SERCOM)->USART.DATA.reg = text[i];\n    while((BOARD_SERCOM(UART_SERCOM)->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_TXC) == 0);\n  }\n}\n\nstatic inline void uart_send_str(const char* text)\n{\n  while (*text) {\n    BOARD_SERCOM(UART_SERCOM)->USART.DATA.reg = *text++;\n    while((BOARD_SERCOM(UART_SERCOM)->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_TXC) == 0);\n  }\n}\n\nint board_uart_read(uint8_t* buf, int len)\n{\n  (void) buf; (void) len;\n  return 0;\n}\n\nint board_uart_write(void const * buf, int len)\n{\n  if (len < 0) {\n    uart_send_str(buf);\n  } else {\n    uart_send_buffer(buf, len);\n  }\n  return len;\n}\n\n#else // ! defined(UART_SERCOM)\n\nstatic void uart_init(void) {\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\n\nstatic void max3421_init(void) {\n  //------------- SPI Init -------------//\n  // MAX3421E max SPI clock is 26MHz however SAMD can only work reliably at 12 Mhz\n  uint32_t const baudrate = 12000000u;\n\n#ifdef SAMD21_FAMILY\n  // Enable the APB clock for SERCOM\n  PM->APBCMASK.reg |= 1u << (PM_APBCMASK_SERCOM0_Pos + MAX3421_SERCOM_ID);\n\n  // Configure GCLK for SERCOM\n  GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(GCLK_CLKCTRL_ID_SERCOM0_CORE_Val + MAX3421_SERCOM_ID) |\n                      GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_CLKEN;\n  while (GCLK->STATUS.bit.SYNCBUSY);\n#endif\n\n#ifdef SAML2X_FAMILY\n  // Enable the APB clock for SERCOM\n  hri_mclk_set_APBCMASK_reg(MCLK, 1u << (MCLK_APBCMASK_SERCOM0_Pos + MAX3421_SERCOM_ID));\n\n  // Configure GCLK for SERCOM\n  hri_gclk_write_PCHCTRL_reg(GCLK, SERCOM0_GCLK_ID_CORE + MAX3421_SERCOM_ID,\n                             GCLK_PCHCTRL_GEN_GCLK1_Val | GCLK_PCHCTRL_CHEN);\n#endif\n\n  Sercom* sercom = MAX3421_SERCOM;\n\n  // Disable the SPI module\n  sercom->SPI.CTRLA.bit.ENABLE = 0;\n\n  // Reset the SPI module\n  sercom->SPI.CTRLA.bit.SWRST = 1;\n  while (sercom->SPI.SYNCBUSY.bit.SWRST);\n\n  // Set up SPI in master mode, MSB first, SPI mode 0\n  sercom->SPI.CTRLA.reg = SERCOM_SPI_CTRLA_DOPO(MAX3421_TX_PAD) | SERCOM_SPI_CTRLA_DIPO(MAX3421_RX_PAD) |\n                          SERCOM_SPI_CTRLA_MODE(3);\n\n  sercom->SPI.CTRLB.reg = SERCOM_SPI_CTRLB_CHSIZE(0) | SERCOM_SPI_CTRLB_RXEN;\n  while (sercom->SPI.SYNCBUSY.bit.CTRLB == 1);\n\n  // Set the baud rate\n  sercom->SPI.BAUD.reg = (uint8_t) (SystemCoreClock / (2 * baudrate) - 1);\n\n  // Configure SPI pins\n  gpio_set_pin_direction(MAX3421_SCK_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_pull_mode(MAX3421_SCK_PIN, GPIO_PULL_OFF);\n  gpio_set_pin_function(MAX3421_SCK_PIN, MAX3421_SERCOM_FUNCTION);\n\n  gpio_set_pin_direction(MAX3421_MOSI_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_pull_mode(MAX3421_MOSI_PIN, GPIO_PULL_OFF);\n  gpio_set_pin_function(MAX3421_MOSI_PIN, MAX3421_SERCOM_FUNCTION);\n\n  gpio_set_pin_direction(MAX3421_MISO_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(MAX3421_MISO_PIN, GPIO_PULL_OFF);\n  gpio_set_pin_function(MAX3421_MISO_PIN, MAX3421_SERCOM_FUNCTION);\n\n  // CS pin\n  gpio_set_pin_direction(MAX3421_CS_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(MAX3421_CS_PIN, 1);\n\n  // Enable the SPI module\n  sercom->SPI.CTRLA.bit.ENABLE = 1;\n  while (sercom->SPI.SYNCBUSY.bit.ENABLE);\n\n  //------------- External Interrupt -------------//\n\n#ifdef SAMD21_FAMILY\n  // Enable the APB clock for EIC (External Interrupt Controller)\n  PM->APBAMASK.reg |= PM_APBAMASK_EIC;\n\n  // Configure GCLK for EIC\n  GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID_EIC | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_CLKEN;\n  while (GCLK->STATUS.bit.SYNCBUSY);\n#endif\n\n#ifdef SAML2X_FAMILY\n  // Enable the APB clock for EIC\n  hri_mclk_set_APBAMASK_EIC_bit(MCLK);\n\n  // Configure GCLK for EIC\n  hri_gclk_write_PCHCTRL_reg(GCLK, EIC_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK1_Val | GCLK_PCHCTRL_CHEN);\n#endif\n\n  // Configure interrupt pin as an input with function A (external interrupt)\n  gpio_set_pin_direction(MAX3421_INTR_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(MAX3421_INTR_PIN, GPIO_PULL_UP);\n  gpio_set_pin_function(MAX3421_INTR_PIN, 0);\n\n  // Disable EIC\n  EIC->CTRL.bit.ENABLE = 0;\n  while (EIC->STATUS.bit.SYNCBUSY);\n\n  // Configure EIC to trigger on falling edge\n  uint8_t const sense_shift = MAX3421_INTR_EIC_ID * 4;\n  EIC->CONFIG[0].reg &= ~(7 << sense_shift);\n  EIC->CONFIG[0].reg |= 2 << sense_shift;\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(EIC_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // Enable External Interrupt\n  EIC->INTENSET.reg = EIC_INTENSET_EXTINT(1 << MAX3421_INTR_EIC_ID);\n\n  // Enable EIC\n  EIC->CTRL.bit.ENABLE = 1;\n  while (EIC->STATUS.bit.SYNCBUSY);\n}\n\nvoid EIC_Handler(void) {\n  // Clear the interrupt flag\n  EIC->INTFLAG.reg = EIC_INTFLAG_EXTINT(1 << MAX3421_INTR_EIC_ID);\n\n  // Call the TinyUSB interrupt handler\n  tuh_int_handler(1, true);\n}\n\n// API to enable/disable MAX3421 INTR pin interrupt\nvoid tuh_max3421_int_api(uint8_t rhport, bool enabled) {\n  (void) rhport;\n\n  if (enabled) {\n    NVIC_EnableIRQ(EIC_IRQn);\n  } else {\n    NVIC_DisableIRQ(EIC_IRQn);\n  }\n}\n\n// API to control MAX3421 SPI CS\nvoid tuh_max3421_spi_cs_api(uint8_t rhport, bool active) {\n  (void) rhport;\n  gpio_set_pin_level(MAX3421_CS_PIN, active ? 0 : 1);\n}\n\n// API to transfer data with MAX3421 SPI\n// Either tx_buf or rx_buf can be NULL, which means transfer is write or read only\nbool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const* tx_buf, uint8_t* rx_buf, size_t xfer_bytes) {\n  (void) rhport;\n\n  Sercom* sercom = MAX3421_SERCOM;\n\n  for (size_t count = 0; count < xfer_bytes; count++) {\n    // Wait for the transmit buffer to be empty\n    while (!sercom->SPI.INTFLAG.bit.DRE);\n\n    // Write data to be transmitted\n    uint8_t data = 0x00;\n    if (tx_buf) {\n      data = tx_buf[count];\n    }\n\n    sercom->SPI.DATA.reg = (uint32_t) data;\n\n    // Wait for the receive buffer to be filled\n    while (!sercom->SPI.INTFLAG.bit.RXC);\n\n    // Read received data\n    data = (uint8_t) sercom->SPI.DATA.reg;\n    if (rx_buf) {\n      rx_buf[count] = data;\n    }\n  }\n\n  // wait for bus idle and clear flags\n  while (!(sercom->SPI.INTFLAG.reg & (SERCOM_SPI_INTFLAG_TXC | SERCOM_SPI_INTFLAG_DRE)));\n  sercom->SPI.INTFLAG.reg = SERCOM_SPI_INTFLAG_TXC | SERCOM_SPI_INTFLAG_DRE;\n\n  return true;\n}\n\n#endif\n\n// Stub for libc init array (required by SAML21/SAML22)\n#ifdef SAML2X_FAMILY\nvoid _init(void);\nvoid _init(void) {\n}\n#endif\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/family.cmake",
    "content": "include_guard()\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# Determine which SAM family based on board configuration\n# SAM_FAMILY should be set by board.cmake (samd21, saml21, or saml22)\nif(NOT DEFINED SAM_FAMILY)\n  # Default to samd21 if not specified for backward compatibility\n  set(SAM_FAMILY samd21)\nendif()\n\nset(SDK_DIR ${TOP}/hw/mcu/microchip/${SAM_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS SAMD21 SAML2X CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f interface/cmsis-dap.cfg -c \\\"transport select swd\\\" -f target/at91samdXX.cfg\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/gcc/gcc/startup_${SAM_FAMILY}.c)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  # Common sources for all SAM families\n  set(COMMON_SOURCES\n    ${SDK_DIR}/gcc/system_${SAM_FAMILY}.c\n    ${SDK_DIR}/hal/src/hal_atomic.c\n    ${SDK_DIR}/hpl/gclk/hpl_gclk.c\n  )\n\n  # Family-specific sources\n  if(SAM_FAMILY STREQUAL \"samd21\")\n    list(APPEND COMMON_SOURCES\n      ${SDK_DIR}/hpl/pm/hpl_pm.c\n      ${SDK_DIR}/hpl/sysctrl/hpl_sysctrl.c\n    )\n  else()\n    # SAML21/SAML22\n    list(APPEND COMMON_SOURCES\n      ${SDK_DIR}/hpl/mclk/hpl_mclk.c\n      ${SDK_DIR}/hpl/osc32kctrl/hpl_osc32kctrl.c\n      ${SDK_DIR}/hpl/oscctrl/hpl_oscctrl.c\n      ${SDK_DIR}/hpl/pm/hpl_pm.c\n    )\n  endif()\n\n  add_library(${BOARD_TARGET} STATIC ${COMMON_SOURCES})\n\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}\n    ${SDK_DIR}/config\n    ${SDK_DIR}/include\n    ${SDK_DIR}/hal/include\n    ${SDK_DIR}/hal/utils/include\n    ${SDK_DIR}/hpl/pm\n    ${SDK_DIR}/hpl/port\n    ${SDK_DIR}/hri\n    ${CMSIS_5}/CMSIS/Core/Include\n  )\n\n  # Family-specific compile definitions\n  if(SAM_FAMILY STREQUAL \"samd21\")\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      CONF_DFLL_OVERWRITE_CALIBRATION=0\n    )\n  else()\n    # SAML21/SAML22\n    target_compile_definitions(${BOARD_TARGET} PUBLIC\n      CONF_OSC32K_CALIB_ENABLE=0\n      CFG_EXAMPLE_VIDEO_READONLY\n    )\n  endif()\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n\n  # Determine MCU option based on SAM_FAMILY\n  if(SAM_FAMILY STREQUAL \"samd21\")\n    set(MCU_OPTION OPT_MCU_SAMD21)\n  elseif(SAM_FAMILY STREQUAL \"saml21\")\n    set(MCU_OPTION OPT_MCU_SAML21)\n  elseif(SAM_FAMILY STREQUAL \"saml22\")\n    set(MCU_OPTION OPT_MCU_SAML22)\n  else()\n    message(FATAL_ERROR \"Unknown SAM_FAMILY: ${SAM_FAMILY}\")\n  endif()\n  family_add_tinyusb(${TARGET} ${MCU_OPTION})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/microchip/samd/dcd_samd.c\n    ${TOP}/src/portable/microchip/samd/hcd_samd.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  # Add HCD support for SAMD21 (has host capability)\n  if(SAM_FAMILY STREQUAL \"samd21\")\n    target_sources(${TARGET} PUBLIC\n      ${TOP}/src/portable/microchip/samd/hcd_samd.c\n      )\n  endif()\n\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_openocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd2x_l2x/family.mk",
    "content": "UF2_FAMILY_ID = 0x68ed2b88\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\n\n# SAM_FAMILY should be set by board.mk (samd21, saml21, or saml22)\nifeq ($(SAM_FAMILY),)\n  # Default to samd21 if not specified for backward compatibility\n  SAM_FAMILY = samd21\nendif\n\nSDK_DIR = hw/mcu/microchip/$(SAM_FAMILY)\nCPU_CORE ?= cortex-m0plus\n\n# Common CFLAGS\nCFLAGS += \\\n  -flto \\\n\n# Family-specific CFLAGS\nifeq ($(SAM_FAMILY),samd21)\n  CFLAGS += \\\n    -DCONF_DFLL_OVERWRITE_CALIBRATION=0 \\\n    -DCFG_TUSB_MCU=OPT_MCU_SAMD21\nelse\n  # SAML21/SAML22\n  CFLAGS += \\\n    -DCONF_OSC32K_CALIB_ENABLE=0 \\\n    -DCFG_EXAMPLE_VIDEO_READONLY \\\n\n  ifeq ($(SAM_FAMILY),saml21)\n    CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_SAML21\n  else ifeq ($(SAM_FAMILY),saml22)\n    CFLAGS += -DCFG_TUSB_MCU=OPT_MCU_SAML22\n  endif\nendif\n\n# suppress warning caused by vendor mcu driver\nCFLAGS += -Wno-error=redundant-decls\n\n# SAM driver is flooded with -Wcast-qual which slow down complication significantly\nCFLAGS_SKIP += -Wcast-qual\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs \\\n\nLDFLAGS_CLANG +=\n\n# Common source files\nSRC_C += \\\n\tsrc/portable/microchip/samd/dcd_samd.c \\\n\t${SDK_DIR}/gcc/gcc/startup_$(SAM_FAMILY).c \\\n\t${SDK_DIR}/gcc/system_$(SAM_FAMILY).c \\\n\t${SDK_DIR}/hal/src/hal_atomic.c \\\n\t${SDK_DIR}/hpl/gclk/hpl_gclk.c \\\n\n# Family-specific source files\nifeq ($(SAM_FAMILY),samd21)\n  SRC_C += \\\n    src/portable/microchip/samd/hcd_samd.c \\\n    ${SDK_DIR}/hpl/pm/hpl_pm.c \\\n    ${SDK_DIR}/hpl/sysctrl/hpl_sysctrl.c \\\n\nelse\n  # SAML21/SAML22\n  SRC_C += \\\n    ${SDK_DIR}/hpl/mclk/hpl_mclk.c \\\n    ${SDK_DIR}/hpl/osc32kctrl/hpl_osc32kctrl.c \\\n    ${SDK_DIR}/hpl/oscctrl/hpl_oscctrl.c \\\n    ${SDK_DIR}/hpl/pm/hpl_pm.c \\\n\nendif\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/${SDK_DIR} \\\n\t$(TOP)/${SDK_DIR}/config \\\n\t$(TOP)/${SDK_DIR}/include \\\n\t$(TOP)/${SDK_DIR}/hal/include \\\n\t$(TOP)/${SDK_DIR}/hal/utils/include \\\n\t$(TOP)/${SDK_DIR}/hpl/pm/ \\\n\t$(TOP)/${SDK_DIR}/hpl/port \\\n\t$(TOP)/${SDK_DIR}/hri \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\n# flash using bossac at least version 1.8\n# can be found in arduino15/packages/arduino/tools/bossac/\n# Add it to your PATH or change BOSSAC variable to match your installation\nBOSSAC = bossac\n\nflash-bossac: $(BUILD)/$(PROJECT).bin\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\t$(BOSSAC) --port=$(SERIAL) -U -i --offset=0x2000 -e -w $^ -R\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"sam.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*6*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/d5035_01/board.cmake",
    "content": "set(SAM_FAMILY same51)\n\nset(JLINK_DEVICE ATSAME51J19)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/same51j19a_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAME51J19A__\n    SVC_Handler=SVCall_Handler\n    CONF_CPU_FREQUENCY=80000000\n    CONF_GCLK_USB_FREQUENCY=48000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/d5035_01/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: D5035-01\n   url: https://github.com/RudolphRiedel/USB_CAN-FD\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               PIN_PA02\n#define LED_STATE_ON          1\n\n// Button: no button\n\n// UART: HWREV < 3: SERCOM5 on PB02, otherwise SERCOM0 on PA08\n// XTAL configure is also different for HWREV as well\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/d5035_01/board.mk",
    "content": "SAM_FAMILY = same51\n\nHWREV ?= 1\n\nCFLAGS += \\\n  -D__SAME51J19A__ \\\n  -DCONF_CPU_FREQUENCY=80000000 \\\n  -DCONF_GCLK_USB_FREQUENCY=48000000 \\\n  -DD5035_01=1 \\\n  -DBOARD_NAME=\"\\\"D5035-01\\\"\" \\\n  -DSVC_Handler=SVCall_Handler \\\n  -DHWREV=$(HWREV)\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/same51j19a_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAME51J19\n\n# flash using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/d5035_01/same51j19a_flash.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAME51J19A\n *\n * Copyright (c) 2019 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00080000\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00030000\n  bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000\n  qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x1000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .bkupram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sbkupram = .;\n        *(.bkupram .bkupram.*);\n        . = ALIGN(8);\n        _ebkupram = .;\n    } > bkupram\n\n    .qspi (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sqspi = .;\n        *(.qspi .qspi.*);\n        . = ALIGN(8);\n        _eqspi = .;\n    } > qspi\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n    end = .;\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/feather_m4_express/board.cmake",
    "content": "set(SAM_FAMILY samd51)\n\nset(JLINK_DEVICE ATSAMD51J19)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD51J19A__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/feather_m4_express/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather M4 Express\n   url: https://www.adafruit.com/product/3857\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define _PINNUM(port, pin)    ((port)*32 + (pin))\n\n// LED\n#define LED_PIN               23\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            16 // D5\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_TX_PIN           (32 + 17)\n#define UART_RX_PIN           (32 + 16)\n\n// SPI for USB host shield\n#define MAX3421_SERCOM_ID       1  // SERCOM2\n#define MAX3421_SERCOM_FUNCTION 2  // function C\n\n#define MAX3421_SCK_PIN         _PINNUM(0, 17)\n#define MAX3421_MOSI_PIN        _PINNUM(1, 23)\n#define MAX3421_MISO_PIN        _PINNUM(1, 22)\n#define MAX3421_TX_PAD          2 // MOSI = PAD_3, SCK = PAD_1\n#define MAX3421_RX_PAD          2 // MISO = PAD_2\n\n#define MAX3421_CS_PIN          20 // D10\n\n#define MAX3421_INTR_PIN        19 // D9\n#define MAX3421_INTR_EIC_ID     3  // EIC3\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/feather_m4_express/board.mk",
    "content": "SAM_FAMILY = samd51\n\nCFLAGS += -D__SAMD51J19A__\n\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD51J19\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/feather_m4_express/feather_m4_express.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD51G19A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 16K, LENGTH = 0x00080000 - 16K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00030000\n  bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000\n  qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0xC000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .bkupram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sbkupram = .;\n        *(.bkupram .bkupram.*);\n        . = ALIGN(8);\n        _ebkupram = .;\n    } > bkupram\n\n    .qspi (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sqspi = .;\n        *(.qspi .qspi.*);\n        . = ALIGN(8);\n        _eqspi = .;\n    } > qspi\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/itsybitsy_m4/board.cmake",
    "content": "set(SAM_FAMILY samd51)\n\nset(JLINK_DEVICE ATSAMD51J19)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD51J19A__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/itsybitsy_m4/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit ItsyBitsy M4\n   url: https://www.adafruit.com/product/3800\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               22\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            18 // D5\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_TX_PIN           16\n#define UART_RX_PIN           17\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/itsybitsy_m4/board.mk",
    "content": "SAM_FAMILY = samd51\n\nCFLAGS += -D__SAMD51J19A__\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD51J19\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/itsybitsy_m4/itsybitsy_m4.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD51G19A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 16K, LENGTH = 0x00080000 - 16K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00030000\n  bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000\n  qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0xC000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .bkupram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sbkupram = .;\n        *(.bkupram .bkupram.*);\n        . = ALIGN(8);\n        _ebkupram = .;\n    } > bkupram\n\n    .qspi (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sqspi = .;\n        *(.qspi .qspi.*);\n        . = ALIGN(8);\n        _eqspi = .;\n    } > qspi\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/metro_m4_express/board.cmake",
    "content": "set(SAM_FAMILY samd51)\n\nset(JLINK_DEVICE ATSAMD51J19)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD51J19A__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/metro_m4_express/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Metro M4 Express\n   url: https://www.adafruit.com/product/3382\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               16\n#define LED_STATE_ON          1\n\n// Button: D5\n#define BUTTON_PIN            (32+14)\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_TX_PIN           23\n#define UART_RX_PIN           22\n\n// SPI for USB host shield\n#define MAX3421_SERCOM_ID       2  // SERCOM2\n#define MAX3421_SERCOM_FUNCTION 2  // function C\n\n#define MAX3421_SCK_PIN         13\n#define MAX3421_MOSI_PIN        12\n#define MAX3421_MISO_PIN        14\n#define MAX3421_TX_PAD          0 // MOSI = PAD_0, SCK = PAD_1\n#define MAX3421_RX_PAD          2 // MISO = PAD_2\n\n#define MAX3421_CS_PIN          18 // D10\n\n#define MAX3421_INTR_PIN        20 // D9\n#define MAX3421_INTR_EIC_ID     4  // EIC4\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/metro_m4_express/board.mk",
    "content": "SAM_FAMILY = samd51\n\nCFLAGS += -D__SAMD51J19A__\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD51J19\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/metro_m4_express/metro_m4_express.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD51G19A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 16K, LENGTH = 0x00080000 - 16K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00030000\n  bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000\n  qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0xC000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .bkupram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sbkupram = .;\n        *(.bkupram .bkupram.*);\n        . = ALIGN(8);\n        _ebkupram = .;\n    } > bkupram\n\n    .qspi (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sqspi = .;\n        *(.qspi .qspi.*);\n        . = ALIGN(8);\n        _eqspi = .;\n    } > qspi\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/pybadge/board.cmake",
    "content": "set(SAM_FAMILY samd51)\n\nset(JLINK_DEVICE ATSAMD51J19)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD51J19A__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/pybadge/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit PyBadge\n   url: https://www.adafruit.com/product/4200\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               23\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            16 // D5\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_TX_PIN           (32 + 17)\n#define UART_RX_PIN           (32 + 16)\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/pybadge/board.mk",
    "content": "SAM_FAMILY = samd51\n\nCFLAGS += -D__SAMD51J19A__\n\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD51J19\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/pybadge/pybadge.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD51G19A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 16K, LENGTH = 0x00080000 - 16K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00030000\n  bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000\n  qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0xC000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .bkupram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sbkupram = .;\n        *(.bkupram .bkupram.*);\n        . = ALIGN(8);\n        _ebkupram = .;\n    } > bkupram\n\n    .qspi (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sqspi = .;\n        *(.qspi .qspi.*);\n        . = ALIGN(8);\n        _eqspi = .;\n    } > qspi\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/pyportal/board.cmake",
    "content": "set(SAM_FAMILY samd51)\n\nset(JLINK_DEVICE ATSAMD51J19)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMD51J19A__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/pyportal/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit PyPortal\n   url: https://www.adafruit.com/product/4116\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               (32+23)\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PIN            (32+22) // D2\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_TX_PIN           (32 + 13)\n#define UART_RX_PIN           (32 + 12)\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/pyportal/board.mk",
    "content": "SAM_FAMILY = samd51\n\nCFLAGS += -D__SAMD51J19A__\n\nLD_FILE = $(BOARD_PATH)/$(BOARD).ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAMD51J19\n\nflash: flash-bossac\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/pyportal/pyportal.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAMD51G19A\n *\n * Copyright (c) 2017 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000 + 16K, LENGTH = 0x00080000 - 16K\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00030000\n  bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000\n  qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0xC000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .bkupram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sbkupram = .;\n        *(.bkupram .bkupram.*);\n        . = ALIGN(8);\n        _ebkupram = .;\n    } > bkupram\n\n    .qspi (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sqspi = .;\n        *(.qspi .qspi.*);\n        . = ALIGN(8);\n        _eqspi = .;\n    } > qspi\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/same54_xplained/board.cmake",
    "content": "set(SAM_FAMILY same54)\n\nset(JLINK_DEVICE ATSAME54P20)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/same54p20a_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAME54P20A__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/same54_xplained/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SAME54 Xplained Pro\n   url: https://www.microchip.com/DevelopmentTools/ProductDetails/ATSAME54-XPRO\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PIN               PIN_PC18\n#define LED_STATE_ON          1\n\n// Button: D5\n#define BUTTON_PIN            PIN_PB31\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: SERCOM2\n//#define UART_TX_PIN           23\n//#define UART_RX_PIN           22\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/same54_xplained/board.mk",
    "content": "SAM_FAMILY = same54\n\nCFLAGS += -D__SAME54P20A__\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/same54p20a_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = ATSAME54P20\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/same54_xplained/same54p20a_flash.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal FLASH on the SAME54P20A\n *\n * Copyright (c) 2019 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  rom      (rx)  : ORIGIN = 0x00000000, LENGTH = 0x00100000\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000\n  bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000\n  qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x10000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .bkupram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sbkupram = .;\n        *(.bkupram .bkupram.*);\n        . = ALIGN(8);\n        _ebkupram = .;\n    } > bkupram\n\n    .qspi (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sqspi = .;\n        *(.qspi .qspi.*);\n        . = ALIGN(8);\n        _eqspi = .;\n    } > qspi\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n    end = .;\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/boards/same54_xplained/same54p20a_sram.ld",
    "content": "/**\n * \\file\n *\n * \\brief Linker script for running in internal SRAM on the SAME54P20A\n *\n * Copyright (c) 2019 Microchip Technology Inc.\n *\n * \\asf_license_start\n *\n * \\page License\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the Licence at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\asf_license_stop\n *\n */\n\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\nSEARCH_DIR(.)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n  ram      (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000\n  bkupram  (rwx) : ORIGIN = 0x47000000, LENGTH = 0x00002000\n  qspi     (rwx) : ORIGIN = 0x04000000, LENGTH = 0x01000000\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x10000;\n\nENTRY(Reset_Handler)\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > ram\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > ram\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    .bkupram (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sbkupram = .;\n        *(.bkupram .bkupram.*);\n        . = ALIGN(8);\n        _ebkupram = .;\n    } > bkupram\n\n    .qspi (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sqspi = .;\n        *(.qspi .qspi.*);\n        . = ALIGN(8);\n        _eqspi = .;\n    } > qspi\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n    end = .;\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Microchip\n*/\n\n#include \"sam.h\"\n#include \"bsp/board_api.h\"\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#endif\n\n#include \"hal_gpio.h\"\n#include \"hal_init.h\"\n#include \"hpl/gclk/hpl_gclk_base.h\"\n#include \"hpl_mclk_config.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) TU_ATTR_UNUSED;\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n/* Referenced GCLKs, should be initialized firstly */\n#define _GCLK_INIT_1ST 0xFFFFFFFF\n\n/* Not referenced GCLKs, initialized last */\n#define _GCLK_INIT_LAST (~_GCLK_INIT_1ST)\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline void USB_Any_Handler(void) {\n#if CFG_TUD_ENABLED\n  tud_int_handler(0);\n#endif\n\n#if CFG_TUH_ENABLED && !CFG_TUH_MAX3421\n  tuh_int_handler(0);\n#endif\n}\n\nvoid USB_0_Handler(void) { USB_Any_Handler(); }\nvoid USB_1_Handler(void) { USB_Any_Handler(); }\nvoid USB_2_Handler(void) { USB_Any_Handler(); }\nvoid USB_3_Handler(void) { USB_Any_Handler(); }\n\n//--------------------------------------------------------------------+\n// Implementation\n//--------------------------------------------------------------------+\n\n#if CFG_TUH_ENABLED && CFG_TUH_MAX3421\n#define MAX3421_SERCOM TU_XSTRCAT(SERCOM, MAX3421_SERCOM_ID)\n#define MAX3421_EIC_Handler TU_XSTRCAT3(EIC_, MAX3421_INTR_EIC_ID, _Handler)\nstatic void max3421_init(void);\n#endif\n\nvoid board_init(void) {\n  // Clock init ( follow hpl_init.c )\n  hri_nvmctrl_set_CTRLA_RWS_bf(NVMCTRL, 0);\n\n  _osc32kctrl_init_sources();\n  _oscctrl_init_sources();\n  _mclk_init();\n#if _GCLK_INIT_1ST\n  _gclk_init_generators_by_fref(_GCLK_INIT_1ST);\n#endif\n  _oscctrl_init_referenced_generators();\n  _gclk_init_generators_by_fref(_GCLK_INIT_LAST);\n\n  // Update SystemCoreClock since it is hard coded with asf4 and not correct\n  // Init 1ms tick timer (samd SystemCoreClock may not correct)\n  SystemCoreClock = CONF_CPU_FREQUENCY;\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  SysTick_Config(CONF_CPU_FREQUENCY / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  // Led init\n  gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(LED_PIN, 0);\n\n#ifdef BUTTON_PIN\n  // Button init\n  gpio_set_pin_direction(BUTTON_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(BUTTON_PIN, GPIO_PULL_UP);\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USB_1_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USB_2_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USB_3_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  /* USB Clock init\n   * The USB module requires a GCLK_USB of 48 MHz ~ 0.25% clock\n   * for low speed and full speed operation. */\n  hri_gclk_write_PCHCTRL_reg(GCLK, USB_GCLK_ID, GCLK_PCHCTRL_GEN_GCLK1_Val | GCLK_PCHCTRL_CHEN);\n  hri_mclk_set_AHBMASK_USB_bit(MCLK);\n  hri_mclk_set_APBBMASK_USB_bit(MCLK);\n\n  // USB Pin Init\n  gpio_set_pin_direction(PIN_PA24, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(PIN_PA24, false);\n  gpio_set_pin_pull_mode(PIN_PA24, GPIO_PULL_OFF);\n  gpio_set_pin_direction(PIN_PA25, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(PIN_PA25, false);\n  gpio_set_pin_pull_mode(PIN_PA25, GPIO_PULL_OFF);\n\n  gpio_set_pin_function(PIN_PA24, PINMUX_PA24H_USB_DM);\n  gpio_set_pin_function(PIN_PA25, PINMUX_PA25H_USB_DP);\n\n#if CFG_TUH_ENABLED\n  #if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\n    max3421_init();\n  #else\n    // VBUS Power\n    board_vbus_set(0, true);\n  #endif\n#endif\n}\n\nvoid board_init_after_tusb(void) {\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  gpio_set_pin_level(LED_PIN, state);\n}\n\nuint32_t board_button_read(void) {\n  // button is active low\n  #ifdef BUTTON_PIN\n  return gpio_get_pin_level(BUTTON_PIN) ? 0 : 1;\n  #else\n  return 0;\n  #endif\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n\n  uint32_t did_addr[4] = {0x008061FC, 0x00806010, 0x00806014, 0x00806018};\n\n  for (int i = 0; i < 4; i++) {\n    uint32_t did = *((uint32_t const*) did_addr[i]);\n    did = TU_BSWAP32(did); // swap endian to match samd51 uf2 bootloader\n    memcpy(id + i * 4, &did, sizeof(uint32_t));\n  }\n\n  return 16;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#if 0\n/* Initialize SERCOM2 for 115200 bps 8N1 using a 48 MHz clock */\nstatic inline void uart_init(void) {\n  gpio_set_pin_function(PIN_PB24, PINMUX_PB24D_SERCOM2_PAD1);\n  gpio_set_pin_function(PIN_PB25, PINMUX_PB25D_SERCOM2_PAD0);\n\n  MCLK->APBBMASK.bit.SERCOM2_ = 1;\n  GCLK->PCHCTRL[SERCOM2_GCLK_ID_CORE].reg = GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN;\n\n  BOARD_SERCOM->USART.CTRLA.bit.SWRST = 1; /* reset and disable SERCOM -> enable configuration */\n  while (BOARD_SERCOM->USART.SYNCBUSY.bit.SWRST);\n\n  BOARD_SERCOM->USART.CTRLA.reg =\n      SERCOM_USART_CTRLA_SAMPR(0) | /* 0 = 16x / arithmetic baud rate, 1 = 16x / fractional baud rate */\n      SERCOM_USART_CTRLA_SAMPA(0) | /* 16x over sampling */\n      SERCOM_USART_CTRLA_FORM(0) | /* 0x0 USART frame, 0x1 USART frame with parity, ... */\n      SERCOM_USART_CTRLA_DORD | /* LSB first */\n      SERCOM_USART_CTRLA_MODE(1) | /* 0x0 USART with external clock, 0x1 USART with internal clock */\n      SERCOM_USART_CTRLA_RXPO(1) | /* SERCOM PAD[1] is used for data reception */\n      SERCOM_USART_CTRLA_TXPO(0); /* SERCOM PAD[0] is used for data transmission */\n\n  BOARD_SERCOM->USART.CTRLB.reg = /* RXEM = 0 -> receiver disabled, LINCMD = 0 -> normal USART transmission, SFDE = 0 -> start-of-frame detection disabled, SBMODE = 0 -> one stop bit, CHSIZE = 0 -> 8 bits */\n      SERCOM_USART_CTRLB_TXEN | /* transmitter enabled */\n      SERCOM_USART_CTRLB_RXEN; /* receiver enabled */\n  // BOARD_SERCOM->USART.BAUD.reg = SERCOM_USART_BAUD_FRAC_FP(0) | SERCOM_USART_BAUD_FRAC_BAUD(26); /* 48000000/(16*115200) = 26.041666667 */\n  BOARD_SERCOM->USART.BAUD.reg = SERCOM_USART_BAUD_BAUD(63019); /* 65536*(1−16*115200/48000000) */\n\n  BOARD_SERCOM->USART.CTRLA.bit.ENABLE = 1; /* activate SERCOM */\n  while (BOARD_SERCOM->USART.SYNCBUSY.bit.ENABLE); /* wait for SERCOM to be ready */\n}\n\nstatic inline void uart_send_buffer(uint8_t const* text, size_t len) {\n  for (size_t i = 0; i < len; ++i) {\n    BOARD_SERCOM->USART.DATA.reg = text[i];\n    while ((BOARD_SERCOM->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_TXC) == 0);\n  }\n}\n\nstatic inline void uart_send_str(const char* text) {\n  while (*text) {\n    BOARD_SERCOM->USART.DATA.reg = *text++;\n    while ((BOARD_SERCOM->USART.INTFLAG.reg & SERCOM_USART_INTFLAG_TXC) == 0);\n  }\n}\n\n#endif\n\n#endif\n\n//--------------------------------------------------------------------+\n// API: SPI transfer with MAX3421E, must be implemented by application\n//--------------------------------------------------------------------+\n#if CFG_TUH_ENABLED && CFG_TUH_MAX3421\n\nstatic void max3421_init(void) {\n  //------------- SPI Init -------------//\n\n  // MAX3421E max SPI clock is 26MHz however SAMD can only work reliably at 12 Mhz\n  uint32_t const baudrate = 12000000u;\n\n  struct {\n    volatile uint32_t* mck_apb;\n    uint32_t mask;\n    uint8_t gclk_id_core;\n    uint8_t gclk_id_slow;\n  } const sercom_clock[] = {\n      { &MCLK->APBAMASK.reg, MCLK_APBAMASK_SERCOM0, SERCOM0_GCLK_ID_CORE, SERCOM0_GCLK_ID_SLOW },\n      { &MCLK->APBAMASK.reg, MCLK_APBAMASK_SERCOM1, SERCOM1_GCLK_ID_CORE, SERCOM1_GCLK_ID_SLOW },\n      { &MCLK->APBBMASK.reg, MCLK_APBBMASK_SERCOM2, SERCOM2_GCLK_ID_CORE, SERCOM2_GCLK_ID_SLOW },\n      { &MCLK->APBBMASK.reg, MCLK_APBBMASK_SERCOM3, SERCOM3_GCLK_ID_CORE, SERCOM3_GCLK_ID_SLOW },\n      { &MCLK->APBDMASK.reg, MCLK_APBDMASK_SERCOM4, SERCOM4_GCLK_ID_CORE, SERCOM4_GCLK_ID_SLOW },\n      { &MCLK->APBDMASK.reg, MCLK_APBDMASK_SERCOM5, SERCOM5_GCLK_ID_CORE, SERCOM5_GCLK_ID_SLOW },\n      #ifdef SERCOM6_GCLK_ID_CORE\n      { &MCLK->APBDMASK.reg, MCLK_APBDMASK_SERCOM6, SERCOM6_GCLK_ID_CORE, SERCOM6_GCLK_ID_SLOW },\n      #endif\n      #ifdef SERCOM7_GCLK_ID_CORE\n      { &MCLK->APBDMASK.reg, MCLK_APBDMASK_SERCOM7, SERCOM7_GCLK_ID_CORE, SERCOM7_GCLK_ID_SLOW },\n      #endif\n  };\n\n  Sercom* sercom = MAX3421_SERCOM;\n\n  // Enable the APB clock for SERCOM\n  *sercom_clock[MAX3421_SERCOM_ID].mck_apb |= sercom_clock[MAX3421_SERCOM_ID].mask;\n\n  // Configure GCLK for SERCOM\n  GCLK->PCHCTRL[sercom_clock[MAX3421_SERCOM_ID].gclk_id_core].reg =\n      GCLK_PCHCTRL_GEN_GCLK0_Val | (1 << GCLK_PCHCTRL_CHEN_Pos);\n  GCLK->PCHCTRL[sercom_clock[MAX3421_SERCOM_ID].gclk_id_slow].reg =\n      GCLK_PCHCTRL_GEN_GCLK3_Val | (1 << GCLK_PCHCTRL_CHEN_Pos);\n\n  // Disable the SPI module\n  sercom->SPI.CTRLA.bit.ENABLE = 0;\n\n  // Reset the SPI module\n  sercom->SPI.CTRLA.bit.SWRST = 1;\n  while (sercom->SPI.SYNCBUSY.bit.SWRST);\n\n  // Set up SPI in master mode, MSB first, SPI mode 0\n  sercom->SPI.CTRLA.reg = SERCOM_SPI_CTRLA_DOPO(MAX3421_TX_PAD) | SERCOM_SPI_CTRLA_DIPO(MAX3421_RX_PAD) |\n                          SERCOM_SPI_CTRLA_MODE(3);\n\n  sercom->SPI.CTRLB.reg = SERCOM_SPI_CTRLB_CHSIZE(0) | SERCOM_SPI_CTRLB_RXEN;\n  while (sercom->SPI.SYNCBUSY.bit.CTRLB == 1);\n\n  // Set the baud rate\n  uint8_t baud_reg = (uint8_t) (SystemCoreClock / (2 * baudrate));\n  if (baud_reg) {\n    baud_reg--;\n  }\n\n  sercom->SPI.BAUD.reg = baud_reg;\n\n  // Configure PA12 as MOSI (PAD0), PA13 as SCK (PAD1), PA14 as MISO (PAD2), function C (sercom)\n  gpio_set_pin_direction(MAX3421_SCK_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_pull_mode(MAX3421_SCK_PIN, GPIO_PULL_OFF);\n  gpio_set_pin_function(MAX3421_SCK_PIN, MAX3421_SERCOM_FUNCTION);\n\n  gpio_set_pin_direction(MAX3421_MOSI_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_pull_mode(MAX3421_MOSI_PIN, GPIO_PULL_OFF);\n  gpio_set_pin_function(MAX3421_MOSI_PIN, MAX3421_SERCOM_FUNCTION);\n\n  gpio_set_pin_direction(MAX3421_MISO_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(MAX3421_MISO_PIN, GPIO_PULL_OFF);\n  gpio_set_pin_function(MAX3421_MISO_PIN, MAX3421_SERCOM_FUNCTION);\n\n  // CS pin\n  gpio_set_pin_direction(MAX3421_CS_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_level(MAX3421_CS_PIN, 1);\n\n  // Enable the SPI module\n  sercom->SPI.CTRLA.bit.ENABLE = 1;\n  while (sercom->SPI.SYNCBUSY.bit.ENABLE) {}\n\n  //------------- External Interrupt -------------//\n\n  // Enable the APB clock for EIC (External Interrupt Controller)\n  MCLK->APBAMASK.reg |= MCLK_APBAMASK_EIC;\n\n  // Configure GCLK for EIC\n  GCLK->PCHCTRL[EIC_GCLK_ID].reg = GCLK_PCHCTRL_GEN_GCLK0_Val | (1 << GCLK_PCHCTRL_CHEN_Pos);\n\n  // Configure PA20 as an input with function A (external interrupt)\n  gpio_set_pin_direction(MAX3421_INTR_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(MAX3421_INTR_PIN, GPIO_PULL_UP);\n  gpio_set_pin_function(MAX3421_INTR_PIN, 0);\n\n  // Disable EIC\n  EIC->CTRLA.bit.ENABLE = 0;\n  while (EIC->SYNCBUSY.bit.ENABLE);\n\n  // Configure EIC to trigger on falling edge\n  volatile uint32_t* eic_config;\n  uint8_t sense_shift;\n  if (MAX3421_INTR_EIC_ID < 8) {\n    eic_config = &EIC->CONFIG[0].reg;\n    sense_shift = MAX3421_INTR_EIC_ID * 4;\n  } else {\n    eic_config = &EIC->CONFIG[1].reg;\n    sense_shift = (MAX3421_INTR_EIC_ID - 8) * 4;\n  }\n\n  *eic_config &= ~(7 << sense_shift);\n  *eic_config |= 2 << sense_shift;\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(EIC_0_IRQn + MAX3421_INTR_EIC_ID, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // Enable External Interrupt\n  EIC->INTENSET.reg = EIC_INTENSET_EXTINT(1 << MAX3421_INTR_EIC_ID);\n\n  // Enable EIC\n  EIC->CTRLA.bit.ENABLE = 1;\n  while (EIC->SYNCBUSY.bit.ENABLE);\n}\n\nvoid MAX3421_EIC_Handler(void) {\n  // Clear the interrupt flag\n  EIC->INTFLAG.reg = EIC_INTFLAG_EXTINT(1 << MAX3421_INTR_EIC_ID);\n\n  // Call the TinyUSB interrupt handler\n  tuh_int_handler(1, true);\n}\n\n// API to enable/disable MAX3421 INTR pin interrupt\nvoid tuh_max3421_int_api(uint8_t rhport, bool enabled) {\n  (void) rhport;\n\n  const IRQn_Type irq = EIC_0_IRQn + MAX3421_INTR_EIC_ID;\n  if (enabled) {\n    NVIC_EnableIRQ(irq);\n  } else {\n    NVIC_DisableIRQ(irq);\n  }\n}\n\n// API to control MAX3421 SPI CS\nvoid tuh_max3421_spi_cs_api(uint8_t rhport, bool active) {\n  (void) rhport;\n  gpio_set_pin_level(MAX3421_CS_PIN, active ? 0 : 1);\n}\n\n// API to transfer data with MAX3421 SPI\n// Either tx_buf or rx_buf can be NULL, which means transfer is write or read only\nbool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const* tx_buf, uint8_t* rx_buf, size_t xfer_bytes) {\n  (void) rhport;\n\n  Sercom* sercom = MAX3421_SERCOM;\n\n  for (size_t count = 0; count < xfer_bytes; count++) {\n    // Wait for the transmit buffer to be empty\n    while (!sercom->SPI.INTFLAG.bit.DRE);\n\n    // Write data to be transmitted\n    uint8_t data = 0x00;\n    if (tx_buf) {\n      data = tx_buf[count];\n    }\n\n    sercom->SPI.DATA.reg = (uint32_t) data;\n\n    // Wait for the receive buffer to be filled\n    while (!sercom->SPI.INTFLAG.bit.RXC);\n\n    // Read received data\n    data = (uint8_t) sercom->SPI.DATA.reg;\n    if (rx_buf) {\n      rx_buf[count] = data;\n    }\n  }\n\n  // wait for bus idle and clear flags\n  while (!(sercom->SPI.INTFLAG.reg & (SERCOM_SPI_INTFLAG_TXC | SERCOM_SPI_INTFLAG_DRE)));\n  sercom->SPI.INTFLAG.reg = SERCOM_SPI_INTFLAG_TXC | SERCOM_SPI_INTFLAG_DRE;\n\n  return true;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  __BKPT(0);\n  while (1);\n}\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/family.cmake",
    "content": "include_guard()\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(SDK_DIR ${TOP}/hw/mcu/microchip/${SAM_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS SAMD51 SAME54 CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f interface/cmsis-dap.cfg -c \\\"transport select swd\\\" -c \\\"set CHIPNAME samd51\\\" -f target/atsame5x.cfg\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/gcc/gcc/startup_${SAM_FAMILY}.c)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/gcc/system_${SAM_FAMILY}.c\n    ${SDK_DIR}/hal/src/hal_atomic.c\n    ${SDK_DIR}/hpl/gclk/hpl_gclk.c\n    ${SDK_DIR}/hpl/mclk/hpl_mclk.c\n    ${SDK_DIR}/hpl/osc32kctrl/hpl_osc32kctrl.c\n    ${SDK_DIR}/hpl/oscctrl/hpl_oscctrl.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}\n    ${SDK_DIR}/config\n    ${SDK_DIR}/include\n    ${SDK_DIR}/hal/include\n    ${SDK_DIR}/hal/utils/include\n    ${SDK_DIR}/hpl/port\n    ${SDK_DIR}/hri\n    ${CMSIS_5}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_SAMD51)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/microchip/samd/dcd_samd.c\n    ${TOP}/src/portable/microchip/samd/hcd_samd.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  #family_flash_openocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samd5x_e5x/family.mk",
    "content": "UF2_FAMILY_ID = 0x55114460\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nSDK_DIR = hw/mcu/microchip/${SAM_FAMILY}\n\nCFLAGS += \\\n  -flto \\\n  -DCFG_TUSB_MCU=OPT_MCU_SAMD51\n\n# SAM driver is flooded with -Wcast-qual which slow down complication significantly\nCFLAGS_SKIP += -Wcast-qual\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/microchip/samd/dcd_samd.c \\\n\tsrc/portable/microchip/samd/hcd_samd.c \\\n\t${SDK_DIR}/gcc/gcc/startup_${SAM_FAMILY}.c \\\n\t${SDK_DIR}/gcc/system_${SAM_FAMILY}.c \\\n\t${SDK_DIR}/hpl/gclk/hpl_gclk.c \\\n\t${SDK_DIR}/hpl/mclk/hpl_mclk.c \\\n\t${SDK_DIR}/hpl/osc32kctrl/hpl_osc32kctrl.c \\\n\t${SDK_DIR}/hpl/oscctrl/hpl_oscctrl.c \\\n\t${SDK_DIR}/hal/src/hal_atomic.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/${SDK_DIR} \\\n\t$(TOP)/${SDK_DIR}/config \\\n\t$(TOP)/${SDK_DIR}/include \\\n\t$(TOP)/${SDK_DIR}/hal/include \\\n\t$(TOP)/${SDK_DIR}/hal/utils/include \\\n\t$(TOP)/${SDK_DIR}/hpl/port \\\n\t$(TOP)/${SDK_DIR}/hri \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\n# flash using bossac at least version 1.8\n# can be found in arduino15/packages/arduino/tools/bossac/\n# Add it to your PATH or change BOSSAC variable to match your installation\nBOSSAC = bossac\n\nflash-bossac: $(BUILD)/$(PROJECT).bin\n\t@:$(call check_defined, SERIAL, example: SERIAL=/dev/ttyACM0)\n\t$(BOSSAC) --port=$(SERIAL) -U -i --offset=0x4000 -e -w $^ -R\n\n# flash using edbg from https://github.com/ataradov/edbg\nflash-edbg: $(BUILD)/$(PROJECT).bin\n\tedbg --verbose -t $(MCU) -pv -f $<\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_qmtech/board.cmake",
    "content": "set(JLINK_DEVICE ATSAME70N19B)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/same70n19b_flash.ld)\n\n# N19B and Q21B share the same vector table / startup code\nset(STARTUP_FILE_GNU ${TOP}/hw/mcu/microchip/same70/same70b/gcc/gcc/startup_same70q21b.c)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAME70N19B__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_qmtech/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SAME70 QMTech\n   manufacturer: Microchip\n   url: https://www.aliexpress.com/item/1005003173783268.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_PIN GPIO(GPIO_PORTA, 15)\n#define LED_STATE_ON 1\n#define LED_PORT_CLOCK ID_PIOB\n\n#define BUTTON_PIN GPIO(GPIO_PORTA, 21)\n#define BUTTON_STATE_ACTIVE 0\n#define BUTTON_PORT_CLOCK ID_PIOA\n\n#define UART_TX_PIN GPIO(GPIO_PORTB, 1)\n#define UART_TX_FUNCTION MUX_PB4D_USART1_TXD1\n#define UART_RX_PIN GPIO(GPIO_PORTB, 0)\n#define UART_RX_FUNCTION MUX_PA21A_USART1_RXD1\n#define UART_PORT_CLOCK ID_USART1\n#define BOARD_USART USART1\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport;\n  (void) state;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_qmtech/board.mk",
    "content": "CFLAGS += -D__SAME70N19B__\n\nLD_FILE = $(BOARD_PATH)/same70n19b_flash.ld\nSTARTUP_FILE = $(SDK_DIR)/same70b/gcc/gcc/startup_same70q21b.c\n\nJLINK_DEVICE = ATSAME70N19B\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_qmtech/hpl_pmc_config.h",
    "content": "/* Auto-generated config file hpl_pmc_config.h */\n#ifndef HPL_PMC_CONFIG_H\n#define HPL_PMC_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n#include <peripheral_clk_config.h>\n\n#define CLK_SRC_OPTION_OSC32K 0\n#define CLK_SRC_OPTION_XOSC32K 1\n#define CLK_SRC_OPTION_OSC12M 2\n#define CLK_SRC_OPTION_XOSC20M 3\n\n#define CLK_SRC_OPTION_SLCK 0\n#define CLK_SRC_OPTION_MAINCK 1\n#define CLK_SRC_OPTION_PLLACK 2\n#define CLK_SRC_OPTION_UPLLCKDIV 3\n#define CLK_SRC_OPTION_MCK 4\n\n#define CLK_SRC_OPTION_UPLLCK 3\n\n#define CONF_RC_4M 0\n#define CONF_RC_8M 1\n#define CONF_RC_12M 2\n\n#define CONF_XOSC32K_NO_BYPASS 0\n#define CONF_XOSC32K_BYPASS 1\n\n#define CONF_XOSC20M_NO_BYPASS 0\n#define CONF_XOSC20M_BYPASS 1\n\n// <e> Clock_SLCK configuration\n// <i> Indicates whether SLCK configuration is enabled or not\n// <id> enable_clk_gen_slck\n#ifndef CONF_CLK_SLCK_CONFIG\n#define CONF_CLK_SLCK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator SLCK source\n\n// <CLK_SRC_OPTION_OSC32K\"> 32kHz High Accuracy Internal Oscillator (OSC32K)\n\n// <CLK_SRC_OPTION_XOSC32K\"> 32kHz External Crystal Oscillator (XOSC32K)\n\n// <i> This defines the clock source for SLCK\n// <id> clk_gen_slck_oscillator\n#ifndef CONF_CLK_GEN_SLCK_SRC\n#define CONF_CLK_GEN_SLCK_SRC CLK_SRC_OPTION_OSC32K\n#endif\n\n// <q> Enable Clock_SLCK\n// <i> Indicates whether SLCK is enabled or disable\n// <id> clk_gen_slck_arch_enable\n#ifndef CONF_CLK_SLCK_ENABLE\n#define CONF_CLK_SLCK_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>// <e> Clock_MAINCK configuration\n// <i> Indicates whether MAINCK configuration is enabled or not\n// <id> enable_clk_gen_mainck\n#ifndef CONF_CLK_MAINCK_CONFIG\n#define CONF_CLK_MAINCK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator MAINCK source\n\n// <CLK_SRC_OPTION_OSC12M\"> Embedded 4/8/12MHz RC Oscillator (OSC12M)\n\n// <CLK_SRC_OPTION_XOSC20M\"> External 3-20MHz Oscillator (XOSC20M)\n\n// <i> This defines the clock source for MAINCK\n// <id> clk_gen_mainck_oscillator\n#ifndef CONF_CLK_GEN_MAINCK_SRC\n#define CONF_CLK_GEN_MAINCK_SRC CLK_SRC_OPTION_XOSC20M\n#endif\n\n// <q> Enable Clock_MAINCK\n// <i> Indicates whether MAINCK is enabled or disable\n// <id> clk_gen_mainck_arch_enable\n#ifndef CONF_CLK_MAINCK_ENABLE\n#define CONF_CLK_MAINCK_ENABLE 1\n#endif\n\n// <q> Enable Main Clock Failure Detection\n// <i> Indicates whether Main Clock Failure Detection is enabled or disable.\n// <i> The 4/8/12 MHz RC oscillator must be selected as the source of MAINCK.\n// <id> clk_gen_cfden_enable\n#ifndef CONF_CLK_CFDEN_ENABLE\n#define CONF_CLK_CFDEN_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>// <e> Clock_MCKR configuration\n// <i> Indicates whether MCKR configuration is enabled or not\n// <id> enable_clk_gen_mckr\n#ifndef CONF_CLK_MCKR_CONFIG\n#define CONF_CLK_MCKR_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator MCKR source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <i> This defines the clock source for MCKR\n// <id> clk_gen_mckr_oscillator\n#ifndef CONF_CLK_GEN_MCKR_SRC\n#define CONF_CLK_GEN_MCKR_SRC CLK_SRC_OPTION_PLLACK\n#endif\n\n// <q> Enable Clock_MCKR\n// <i> Indicates whether MCKR is enabled or disable\n// <id> clk_gen_mckr_arch_enable\n#ifndef CONF_CLK_MCKR_ENABLE\n#define CONF_CLK_MCKR_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Master Clock Prescaler\n// <0=> 1\n// <1=> 2\n// <2=> 4\n// <3=> 8\n// <4=> 16\n// <5=> 32\n// <6=> 64\n// <7=> 3\n// <i> Select the clock prescaler.\n// <id> mckr_presc\n#ifndef CONF_MCKR_PRESC\n#define CONF_MCKR_PRESC 0\n#endif\n\n// </h>\n// </e>// <e> Clock_MCK configuration\n// <i> Indicates whether MCK configuration is enabled or not\n// <id> enable_clk_gen_mck\n#ifndef CONF_CLK_MCK_CONFIG\n#define CONF_CLK_MCK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator MCK source\n\n// <CLK_SRC_OPTION_MCKR\"> Master Clock Controller (PMC_MCKR)\n\n// <i> This defines the clock source for MCK\n// <id> clk_gen_mck_oscillator\n#ifndef CONF_CLK_GEN_MCK_SRC\n#define CONF_CLK_GEN_MCK_SRC CLK_SRC_OPTION_MCKR\n#endif\n\n// </h>\n\n// <h>\n\n//<o> Master Clock Controller Divider MCK divider\n// <0=> 1\n// <1=> 2\n// <3=> 3\n// <2=> 4\n// <i> Select the master clock divider.\n// <id> mck_div\n#ifndef CONF_MCK_DIV\n#define CONF_MCK_DIV 1\n#endif\n\n// </h>\n// </e>// <e> Clock_SYSTICK configuration\n// <i> Indicates whether SYSTICK configuration is enabled or not\n// <id> enable_clk_gen_systick\n#ifndef CONF_CLK_SYSTICK_CONFIG\n#define CONF_CLK_SYSTICK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator SYSTICK source\n\n// <CLK_SRC_OPTION_MCKR\"> Master Clock Controller (PMC_MCKR)\n\n// <i> This defines the clock source for SYSTICK\n// <id> clk_gen_systick_oscillator\n#ifndef CONF_CLK_GEN_SYSTICK_SRC\n#define CONF_CLK_GEN_SYSTICK_SRC CLK_SRC_OPTION_MCKR\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Systick clock divider\n// <8=> 8\n// <i> Select systick clock divider\n// <id> systick_clock_div\n#ifndef CONF_SYSTICK_DIV\n#define CONF_SYSTICK_DIV 8\n#endif\n\n// </h>\n// </e>// <e> Clock_FCLK configuration\n// <i> Indicates whether FCLK configuration is enabled or not\n// <id> enable_clk_gen_fclk\n#ifndef CONF_CLK_FCLK_CONFIG\n#define CONF_CLK_FCLK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator FCLK source\n\n// <CLK_SRC_OPTION_MCKR\"> Master Clock Controller (PMC_MCKR)\n\n// <i> This defines the clock source for FCLK\n// <id> clk_gen_fclk_oscillator\n#ifndef CONF_CLK_GEN_FCLK_SRC\n#define CONF_CLK_GEN_FCLK_SRC CLK_SRC_OPTION_MCKR\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>// <e> Clock_GCLK0 configuration\n// <i> Indicates whether GCLK0 configuration is enabled or not\n// <id> enable_clk_gen_gclk0\n#ifndef CONF_CLK_GCLK0_CONFIG\n#define CONF_CLK_GCLK0_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator GCLK0 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCK\"> USB 480M Clock (UPLLCK)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for GCLK0\n// <id> clk_gen_gclk0_oscillator\n#ifndef CONF_CLK_GEN_GCLK0_SRC\n#define CONF_CLK_GEN_GCLK0_SRC CLK_SRC_OPTION_MCK\n#endif\n\n// <q> Enable Clock_GCLK0\n// <i> Indicates whether GCLK0 is enabled or disable\n// <id> clk_gen_gclk0_arch_enable\n#ifndef CONF_CLK_GCLK0_ENABLE\n#define CONF_CLK_GCLK0_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n// <q> Enable GCLK0 GCLKEN\n// <i> Indicates whether GCLK0 GCLKEN is enabled or disable\n// <id> gclk0_gclken_enable\n#ifndef CONF_GCLK0_GCLKEN_ENABLE\n#define CONF_GCLK0_GCLKEN_ENABLE 0\n#endif\n\n// <o> Generic Clock GCLK0 divider <1-256>\n// <i> Select the clock divider (divider = GCLKDIV + 1).\n// <id> gclk0_div\n#ifndef CONF_GCLK0_DIV\n#define CONF_GCLK0_DIV 2\n#endif\n\n// </h>\n// </e>// <e> Clock_GCLK1 configuration\n// <i> Indicates whether GCLK1 configuration is enabled or not\n// <id> enable_clk_gen_gclk1\n#ifndef CONF_CLK_GCLK1_CONFIG\n#define CONF_CLK_GCLK1_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator GCLK1 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCK\"> USB 480M Clock (UPLLCK)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for GCLK1\n// <id> clk_gen_gclk1_oscillator\n#ifndef CONF_CLK_GEN_GCLK1_SRC\n#define CONF_CLK_GEN_GCLK1_SRC CLK_SRC_OPTION_PLLACK\n#endif\n\n// <q> Enable Clock_GCLK1\n// <i> Indicates whether GCLK1 is enabled or disable\n// <id> clk_gen_gclk1_arch_enable\n#ifndef CONF_CLK_GCLK1_ENABLE\n#define CONF_CLK_GCLK1_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n// <q> Enable GCLK1 GCLKEN\n// <i> Indicates whether GCLK1 GCLKEN is enabled or disable\n// <id> gclk1_gclken_enable\n#ifndef CONF_GCLK1_GCLKEN_ENABLE\n#define CONF_GCLK1_GCLKEN_ENABLE 0\n#endif\n\n// <o> Generic Clock GCLK1 divider <1-256>\n// <i> Select the clock divider (divider = GCLKDIV + 1).\n// <id> gclk1_div\n#ifndef CONF_GCLK1_DIV\n#define CONF_GCLK1_DIV 3\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK0 configuration\n// <i> Indicates whether PCK0 configuration is enabled or not\n// <id> enable_clk_gen_pck0\n#ifndef CONF_CLK_PCK0_CONFIG\n#define CONF_CLK_PCK0_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK0 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK0\n// <id> clk_gen_pck0_oscillator\n#ifndef CONF_CLK_GEN_PCK0_SRC\n#define CONF_CLK_GEN_PCK0_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK0\n// <i> Indicates whether PCK0 is enabled or disable\n// <id> clk_gen_pck0_arch_enable\n#ifndef CONF_CLK_PCK0_ENABLE\n#define CONF_CLK_PCK0_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck0_presc\n#ifndef CONF_PCK0_PRESC\n#define CONF_PCK0_PRESC 1\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK1 configuration\n// <i> Indicates whether PCK1 configuration is enabled or not\n// <id> enable_clk_gen_pck1\n#ifndef CONF_CLK_PCK1_CONFIG\n#define CONF_CLK_PCK1_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK1 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK1\n// <id> clk_gen_pck1_oscillator\n#ifndef CONF_CLK_GEN_PCK1_SRC\n#define CONF_CLK_GEN_PCK1_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK1\n// <i> Indicates whether PCK1 is enabled or disable\n// <id> clk_gen_pck1_arch_enable\n#ifndef CONF_CLK_PCK1_ENABLE\n#define CONF_CLK_PCK1_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck1_presc\n#ifndef CONF_PCK1_PRESC\n#define CONF_PCK1_PRESC 2\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK2 configuration\n// <i> Indicates whether PCK2 configuration is enabled or not\n// <id> enable_clk_gen_pck2\n#ifndef CONF_CLK_PCK2_CONFIG\n#define CONF_CLK_PCK2_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK2 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK2\n// <id> clk_gen_pck2_oscillator\n#ifndef CONF_CLK_GEN_PCK2_SRC\n#define CONF_CLK_GEN_PCK2_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK2\n// <i> Indicates whether PCK2 is enabled or disable\n// <id> clk_gen_pck2_arch_enable\n#ifndef CONF_CLK_PCK2_ENABLE\n#define CONF_CLK_PCK2_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck2_presc\n#ifndef CONF_PCK2_PRESC\n#define CONF_PCK2_PRESC 3\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK3 configuration\n// <i> Indicates whether PCK3 configuration is enabled or not\n// <id> enable_clk_gen_pck3\n#ifndef CONF_CLK_PCK3_CONFIG\n#define CONF_CLK_PCK3_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK3 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK3\n// <id> clk_gen_pck3_oscillator\n#ifndef CONF_CLK_GEN_PCK3_SRC\n#define CONF_CLK_GEN_PCK3_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK3\n// <i> Indicates whether PCK3 is enabled or disable\n// <id> clk_gen_pck3_arch_enable\n#ifndef CONF_CLK_PCK3_ENABLE\n#define CONF_CLK_PCK3_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck3_presc\n#ifndef CONF_PCK3_PRESC\n#define CONF_PCK3_PRESC 4\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK4 configuration\n// <i> Indicates whether PCK4 configuration is enabled or not\n// <id> enable_clk_gen_pck4\n#ifndef CONF_CLK_PCK4_CONFIG\n#define CONF_CLK_PCK4_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK4 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK4\n// <id> clk_gen_pck4_oscillator\n#ifndef CONF_CLK_GEN_PCK4_SRC\n#define CONF_CLK_GEN_PCK4_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK4\n// <i> Indicates whether PCK4 is enabled or disable\n// <id> clk_gen_pck4_arch_enable\n#ifndef CONF_CLK_PCK4_ENABLE\n#define CONF_CLK_PCK4_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck4_presc\n#ifndef CONF_PCK4_PRESC\n#define CONF_PCK4_PRESC 5\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK5 configuration\n// <i> Indicates whether PCK5 configuration is enabled or not\n// <id> enable_clk_gen_pck5\n#ifndef CONF_CLK_PCK5_CONFIG\n#define CONF_CLK_PCK5_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK5 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK5\n// <id> clk_gen_pck5_oscillator\n#ifndef CONF_CLK_GEN_PCK5_SRC\n#define CONF_CLK_GEN_PCK5_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK5\n// <i> Indicates whether PCK5 is enabled or disable\n// <id> clk_gen_pck5_arch_enable\n#ifndef CONF_CLK_PCK5_ENABLE\n#define CONF_CLK_PCK5_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck5_presc\n#ifndef CONF_PCK5_PRESC\n#define CONF_PCK5_PRESC 6\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK6 configuration\n// <i> Indicates whether PCK6 configuration is enabled or not\n// <id> enable_clk_gen_pck6\n#ifndef CONF_CLK_PCK6_CONFIG\n#define CONF_CLK_PCK6_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK6 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK6\n// <id> clk_gen_pck6_oscillator\n#ifndef CONF_CLK_GEN_PCK6_SRC\n#define CONF_CLK_GEN_PCK6_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK6\n// <i> Indicates whether PCK6 is enabled or disable\n// <id> clk_gen_pck6_arch_enable\n#ifndef CONF_CLK_PCK6_ENABLE\n#define CONF_CLK_PCK6_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck6_presc\n#ifndef CONF_PCK6_PRESC\n#define CONF_PCK6_PRESC 7\n#endif\n\n// </h>\n// </e>// <e> Clock_USB_480M configuration\n// <i> Indicates whether USB_480M configuration is enabled or not\n// <id> enable_clk_gen_usb_480m\n#ifndef CONF_CLK_USB_480M_CONFIG\n#define CONF_CLK_USB_480M_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator USB_480M source\n\n// <CLK_SRC_OPTION_UPLLCK\"> USB 480M Clock (UPLLCK)\n\n// <i> This defines the clock source for USB_480M\n// <id> clk_gen_usb_480m_oscillator\n#ifndef CONF_CLK_GEN_USB_480M_SRC\n#define CONF_CLK_GEN_USB_480M_SRC CLK_SRC_OPTION_UPLLCK\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>// <e> Clock_USB_48M configuration\n// <i> Indicates whether USB_48M configuration is enabled or not\n// <id> enable_clk_gen_usb_48m\n#ifndef CONF_CLK_USB_48M_CONFIG\n#define CONF_CLK_USB_48M_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator USB_48M source\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <i> This defines the clock source for USB_48M\n// <id> clk_gen_usb_48m_oscillator\n#ifndef CONF_CLK_GEN_USB_48M_SRC\n#define CONF_CLK_GEN_USB_48M_SRC CLK_SRC_OPTION_UPLLCKDIV\n#endif\n\n// <q> Enable Clock_USB_48M\n// <i> Indicates whether USB_48M is enabled or disable\n// <id> clk_gen_usb_48m_arch_enable\n#ifndef CONF_CLK_USB_48M_ENABLE\n#define CONF_CLK_USB_48M_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n\n// <o> USB Clock Controller Divider <1-16>\n// <i> Select the USB clock divider (divider = USBDIV + 1).\n// <id> usb_48m_div\n#ifndef CONF_USB_48M_DIV\n#define CONF_USB_48M_DIV 5\n#endif\n\n// </h>\n// </e>// <e> Clock_SLCK2 configuration\n// <i> Indicates whether SLCK2 configuration is enabled or not\n// <id> enable_clk_gen_slck2\n#ifndef CONF_CLK_SLCK2_CONFIG\n#define CONF_CLK_SLCK2_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator SLCK2 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <i> This defines the clock source for SLCK2\n// <id> clk_gen_slck2_oscillator\n#ifndef CONF_CLK_GEN_SLCK2_SRC\n#define CONF_CLK_GEN_SLCK2_SRC CLK_SRC_OPTION_SLCK\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>\n\n// <e> System Configuration\n// <i> Indicates whether configuration for system is enabled or not\n// <id> enable_hclk_clock\n#ifndef CONF_SYSTEM_CONFIG\n#define CONF_SYSTEM_CONFIG 1\n#endif\n\n// <h> Processor Clock Settings\n// <y> Processor Clock source\n// <MCKR\"> Master Clock Controller (PMC_MCKR)\n// <i> This defines the clock source for the HCLK (Processor clock)\n// <id> hclk_clock_source\n#ifndef CONF_HCLK_SRC\n#define CONF_HCLK_SRC MCKR\n#endif\n\n// <o> Flash Wait State\n// <0=> 1 cycle\n// <1=> 2 cycles\n// <2=> 3 cycles\n// <3=> 4 cycles\n// <4=> 5 cycles\n// <5=> 6 cycles\n// <6=> 7 cycles\n// <i> This field defines the number of wait states for read and write operations.\n// <id> efc_fws\n#ifndef CONF_EFC_WAIT_STATE\n#define CONF_EFC_WAIT_STATE 5\n#endif\n\n// </h>\n// </e>\n\n// <e> SysTick Clock\n// <id> enable_systick_clk_clock\n#ifndef CONF_SYSTICK_CLK_CONFIG\n#define CONF_SYSTICK_CLK_CONFIG 1\n#endif\n\n// <y> SysTick Clock source\n// <MCKR\"> Master Clock Controller (PMC_MCKR)\n// <i> This defines the clock source for the SysTick Clock\n// <id> systick_clk_clock_source\n#ifndef CONF_SYSTICK_CLK_SRC\n#define CONF_SYSTICK_CLK_SRC MCKR\n#endif\n\n// <o> SysTick Clock Divider\n// <8=> 8\n// <i> Fixed to 8 if Systick is not using Processor clock\n// <id> systick_clk_clock_div\n#ifndef CONF_SYSTICK_CLK_DIV\n#define CONF_SYSTICK_CLK_DIV 8\n#endif\n\n// </e>\n\n// <e> OSC32K Oscillator Configuration\n// <i> Indicates whether configuration for OSC32K is enabled or not\n// <id> enable_osc32k\n#ifndef CONF_OSC32K_CONFIG\n#define CONF_OSC32K_CONFIG 1\n#endif\n\n// <h> OSC32K Oscillator Control\n// <q> OSC32K Oscillator Enable\n// <i> Indicates whether OSC32K Oscillator is enabled or not\n// <id> osc32k_arch_enable\n#ifndef CONF_OSC32K_ENABLE\n#define CONF_OSC32K_ENABLE 0\n#endif\n// </h>\n// </e>\n\n// <e> XOSC32K Oscillator Configuration\n// <i> Indicates whether configuration for XOSC32K is enabled or not\n// <id> enable_xosc32k\n#ifndef CONF_XOSC32K_CONFIG\n#define CONF_XOSC32K_CONFIG 0\n#endif\n\n// <h> XOSC32K Oscillator Control\n// <y> Oscillator Bypass Select\n// <CONF_XOSC32K_NO_BYPASS\"> The 32kHz crystal oscillator is not bypassed.\n// <CONF_XOSC32K_BYPASS\"> The 32kHz crystal oscillator is bypassed.\n// <i> Indicates whether XOSC32K is bypassed.\n// <id> xosc32k_bypass\n#ifndef CONF_XOSC32K\n#define CONF_XOSC32K CONF_XOSC32K_NO_BYPASS\n#endif\n\n// <q> XOSC32K Oscillator Enable\n// <i> Indicates whether XOSC32K Oscillator is enabled or not\n// <id> xosc32k_arch_enable\n#ifndef CONF_XOSC32K_ENABLE\n#define CONF_XOSC32K_ENABLE 0\n#endif\n// </h>\n// </e>\n\n// <e> OSC12M Oscillator Configuration\n// <i> Indicates whether configuration for OSC12M is enabled or not\n// <id> enable_osc12m\n#ifndef CONF_OSC12M_CONFIG\n#define CONF_OSC12M_CONFIG 0\n#endif\n\n// <h> OSC12M Oscillator Control\n// <q> OSC12M Oscillator Enable\n// <i> Indicates whether OSC12M Oscillator is enabled or not.\n// <id> osc12m_arch_enable\n#ifndef CONF_OSC12M_ENABLE\n#define CONF_OSC12M_ENABLE 0\n#endif\n\n// <o> OSC12M selector\n//  <0=> 4000000\n//  <1=> 8000000\n//  <2=> 12000000\n// <i> Select the frequency of embedded fast RC oscillator.\n// <id> osc12m_selector\n#ifndef CONF_OSC12M_SELECTOR\n#define CONF_OSC12M_SELECTOR 2\n#endif\n// </h>\n// </e>\n\n// <e> XOSC20M Oscillator Configuration\n// <i> Indicates whether configuration for XOSC20M is enabled or not.\n// <id> enable_xosc20m\n#ifndef CONF_XOSC20M_CONFIG\n#define CONF_XOSC20M_CONFIG 1\n#endif\n\n// <h> XOSC20M Oscillator Control\n// <o> XOSC20M selector <3000000-20000000>\n// <i> Select the frequency of crystal or ceramic resonator oscillator.\n// <id> xosc20m_selector\n#ifndef CONF_XOSC20M_SELECTOR\n#define CONF_XOSC20M_SELECTOR 12000000\n#endif\n\n// <o> Start up time for the external oscillator (ms): <0-256>\n// <i> Select start-up time.\n// <id> xosc20m_startup_time\n#ifndef CONF_XOSC20M_STARTUP_TIME\n#define CONF_XOSC20M_STARTUP_TIME 62\n#endif\n\n// <y> Oscillator Bypass Select\n// <CONF_XOSC20M_NO_BYPASS\"> The external crystal oscillator is not bypassed.\n// <CONF_XOSC20M_BYPASS\"> The external crystal oscillator is bypassed.\n// <i> Indicates whether XOSC20M is bypassed.\n// <id> xosc20m_bypass\n#ifndef CONF_XOSC20M\n#define CONF_XOSC20M CONF_XOSC20M_NO_BYPASS\n#endif\n\n// <q> XOSC20M Oscillator Enable\n// <i> Indicates whether XOSC20M Oscillator is enabled or not\n// <id> xosc20m_arch_enable\n#ifndef CONF_XOSC20M_ENABLE\n#define CONF_XOSC20M_ENABLE 1\n#endif\n// </h>\n// </e>\n\n// <e> PLLACK Oscillator Configuration\n// <i> Indicates whether configuration for PLLACK is enabled or not\n// <id> enable_pllack\n#ifndef CONF_PLLACK_CONFIG\n#define CONF_PLLACK_CONFIG 1\n#endif\n\n// <y> PLLACK Reference Clock Source\n// <MAINCK\"> Main Clock (MAINCK)\n// <i> Select the clock source.\n// <id> pllack_ref_clock\n#ifndef CONF_PLLACK_CLK\n#define CONF_PLLACK_CLK MAINCK\n#endif\n\n// <h> PLLACK Oscillator Control\n// <q> PLLACK Oscillator Enable\n// <i> Indicates whether PLLACK Oscillator is enabled or not\n// <id> pllack_arch_enable\n#ifndef CONF_PLLACK_ENABLE\n#define CONF_PLLACK_ENABLE 1\n#endif\n\n// <o> PLLA Frontend Divider (DIVA)  <1-255>\n// <i> Select the clock divider\n// <id> pllack_div\n#ifndef CONF_PLLACK_DIV\n#define CONF_PLLACK_DIV 1\n#endif\n\n// <o> PLLACK Muliplier <1-62>\n// <i> Indicates PLLA multiplier (multiplier = MULA + 1).\n// <id> pllack_mul\n#ifndef CONF_PLLACK_MUL\n#define CONF_PLLACK_MUL 25\n#endif\n// </h>\n// </e>\n\n// <e> UPLLCK Oscillator Configuration\n// <i> Indicates whether configuration for UPLLCK is enabled or not\n// <id> enable_upllck\n#ifndef CONF_UPLLCK_CONFIG\n#define CONF_UPLLCK_CONFIG 1\n#endif\n\n// <y> UPLLCK Reference Clock Source\n// <XOSC20M\"> External 3-20MHz Oscillator (XOSC20M)\n// <i> Select the clock source,only when the input frequency is 12M or 16M, the upllck output is 480M.\n// <id> upllck_ref_clock\n#ifndef CONF_UPLLCK_CLK\n#define CONF_UPLLCK_CLK XOSC20M\n#endif\n\n// <h> UPLLCK Oscillator Control\n// <q> UPLLCK Oscillator Enable\n// <i> Indicates whether UPLLCK Oscillator is enabled or not\n// <id> upllck_arch_enable\n#ifndef CONF_UPLLCK_ENABLE\n#define CONF_UPLLCK_ENABLE 1\n#endif\n// </h>\n// </e>\n\n// <e> UPLLCKDIV Oscillator Configuration\n// <i> Indicates whether configuration for UPLLCKDIV is enabled or not\n// <id> enable_upllckdiv\n#ifndef CONF_UPLLCKDIV_CONFIG\n#define CONF_UPLLCKDIV_CONFIG 1\n#endif\n\n// <y> UPLLCKDIV Reference Clock Source\n// <UPLLCK\"> USB 480M Clock (UPLLCK)\n// <i> Select the clock source.\n// <id> upllckdiv_ref_clock\n#ifndef CONF_UPLLCKDIV_CLK\n#define CONF_UPLLCKDIV_CLK UPLLCK\n#endif\n\n// <h> UPLLCKDIV Oscillator Control\n// <o> UPLLCKDIV Clock Divider\n// <0=> 1\n// <1=> 2\n// <i> Select the clock divider.\n// <id> upllckdiv_div\n#ifndef CONF_UPLLCKDIV_DIV\n#define CONF_UPLLCKDIV_DIV 1\n#endif\n// </h>\n// </e>\n\n// <e> MCK/8\n// <id> enable_mck_div_8\n#ifndef CONF_MCK_DIV_8_CONFIG\n#define CONF_MCK_DIV_8_CONFIG 0\n#endif\n\n// <o> MCK/8 Source\n// <0=> Master Clock (MCK)\n// <id> mck_div_8_src\n#ifndef CONF_MCK_DIV_8_SRC\n#define CONF_MCK_DIV_8_SRC 0\n#endif\n// </e>\n\n// <e> External Clock Input Configuration\n// <id> enable_dummy_ext\n#ifndef CONF_DUMMY_EXT_CONFIG\n#define CONF_DUMMY_EXT_CONFIG 1\n#endif\n\n// <o> External Clock Input Source\n// <i> All here are dummy values\n// <i> Refer to the peripherals settings for actual input information\n// <0=> Specific clock input from specific pin\n// <id> dummy_ext_src\n#ifndef CONF_DUMMY_EXT_SRC\n#define CONF_DUMMY_EXT_SRC 0\n#endif\n// </e>\n\n// <e> External Clock Configuration\n// <id> enable_dummy_ext_clk\n#ifndef CONF_DUMMY_EXT_CLK_CONFIG\n#define CONF_DUMMY_EXT_CLK_CONFIG 1\n#endif\n\n// <o> External Clock Source\n// <i> All here are dummy values\n// <i> Refer to the peripherals settings for actual input information\n// <0=> External Clock Input\n// <id> dummy_ext_clk_src\n#ifndef CONF_DUMMY_EXT_CLK_SRC\n#define CONF_DUMMY_EXT_CLK_SRC 0\n#endif\n// </e>\n\n// <<< end of configuration section >>>\n\n#endif // HPL_PMC_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_qmtech/hpl_usart_config.h",
    "content": "/* Auto-generated config file hpl_usart_config.h */\n#ifndef HPL_USART_CONFIG_H\n#define HPL_USART_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n#include <peripheral_clk_config.h>\n\n#ifndef CONF_USART_1_ENABLE\n#define CONF_USART_1_ENABLE 1\n#endif\n\n// <h> Basic Configuration\n\n// <o> Frame parity\n// <0x0=>Even parity\n// <0x1=>Odd parity\n// <0x2=>Parity forced to 0\n// <0x3=>Parity forced to 1\n// <0x4=>No parity\n// <i> Parity bit mode for USART frame\n// <id> usart_parity\n#ifndef CONF_USART_1_PARITY\n#define CONF_USART_1_PARITY 0x4\n#endif\n\n// <o> Character Size\n// <0x0=>5 bits\n// <0x1=>6 bits\n// <0x2=>7 bits\n// <0x3=>8 bits\n// <i> Data character size in USART frame\n// <id> usart_character_size\n#ifndef CONF_USART_1_CHSIZE\n#define CONF_USART_1_CHSIZE 0x3\n#endif\n\n// <o> Stop Bit\n// <0=>1 stop bit\n// <1=>1.5 stop bits\n// <2=>2 stop bits\n// <i> Number of stop bits in USART frame\n// <id> usart_stop_bit\n#ifndef CONF_USART_1_SBMODE\n#define CONF_USART_1_SBMODE 0\n#endif\n\n// <o> Clock Output Select\n// <0=>The USART does not drive the SCK pin\n// <1=>The USART drives the SCK pin if USCLKS does not select the external clock SCK\n// <i> Clock Output Select in USART sck, if in usrt master mode, please drive SCK.\n// <id> usart_clock_output_select\n#ifndef CONF_USART_1_CLKO\n#define CONF_USART_1_CLKO 0\n#endif\n\n// <o> Baud rate <1-3000000>\n// <i> USART baud rate setting\n// <id> usart_baud_rate\n#ifndef CONF_USART_1_BAUD\n#define CONF_USART_1_BAUD 9600\n#endif\n\n// </h>\n\n// <e> Advanced configuration\n// <id> usart_advanced\n#ifndef CONF_USART_1_ADVANCED_CONFIG\n#define CONF_USART_1_ADVANCED_CONFIG 0\n#endif\n\n// <o> Channel Mode\n// <0=>Normal Mode\n// <1=>Automatic Echo\n// <2=>Local Loopback\n// <3=>Remote Loopback\n// <i> Channel mode in USART frame\n// <id> usart_channel_mode\n#ifndef CONF_USART_1_CHMODE\n#define CONF_USART_1_CHMODE 0\n#endif\n\n// <q> 9 bits character enable\n// <i> Enable 9 bits character, this has high priority than 5/6/7/8 bits.\n// <id> usart_9bits_enable\n#ifndef CONF_USART_1_MODE9\n#define CONF_USART_1_MODE9 0\n#endif\n\n// <o> Variable Sync\n// <0=>User defined configuration\n// <1=>sync field is updated when a character is written into US_THR\n// <i> Variable Synchronization of Command/Data Sync Start Frarm Delimiter\n// <id> variable_sync\n#ifndef CONF_USART_1_VAR_SYNC\n#define CONF_USART_1_VAR_SYNC 0\n#endif\n\n// <o> Oversampling Mode\n// <0=>16 Oversampling\n// <1=>8 Oversampling\n// <i> Oversampling Mode in UART mode\n// <id> usart__oversampling_mode\n#ifndef CONF_USART_1_OVER\n#define CONF_USART_1_OVER 0\n#endif\n\n// <o> Inhibit Non Ack\n// <0=>The NACK is generated\n// <1=>The NACK is not generated\n// <i> Inhibit Non Acknowledge\n// <id> usart__inack\n#ifndef CONF_USART_1_INACK\n#define CONF_USART_1_INACK 1\n#endif\n\n// <o> Disable Successive NACK\n// <0=>NACK is sent on the ISO line as soon as a parity error occurs\n// <1=>Many parity errors generate a NACK on the ISO line\n// <i> Disable Successive NACK\n// <id> usart_dsnack\n#ifndef CONF_USART_1_DSNACK\n#define CONF_USART_1_DSNACK 0\n#endif\n\n// <o> Inverted Data\n// <0=>Data isn't inverted, nomal mode\n// <1=>Data is inverted\n// <i> Inverted Data\n// <id> usart_invdata\n#ifndef CONF_USART_1_INVDATA\n#define CONF_USART_1_INVDATA 0\n#endif\n\n// <o> Maximum Number of Automatic Iteration <0-7>\n// <i> Defines the maximum number of iterations in mode ISO7816, protocol T = 0.\n// <id> usart_max_iteration\n#ifndef CONF_USART_1_MAX_ITERATION\n#define CONF_USART_1_MAX_ITERATION 0\n#endif\n\n// <q> Receive Line Filter enable\n// <i> whether the USART filters the receive line using a three-sample filter\n// <id> usart_receive_filter_enable\n#ifndef CONF_USART_1_FILTER\n#define CONF_USART_1_FILTER 0\n#endif\n\n// <q> Manchester Encoder/Decoder Enable\n// <i> whether the USART Manchester Encoder/Decoder\n// <id> usart_manchester_filter_enable\n#ifndef CONF_USART_1_MAN\n#define CONF_USART_1_MAN 0\n#endif\n\n// <o> Manchester Synchronization Mode\n// <0=>The Manchester start bit is a 0 to 1 transition\n// <1=>The Manchester start bit is a 1 to 0 transition\n// <i> Manchester Synchronization Mode\n// <id> usart_manchester_synchronization_mode\n#ifndef CONF_USART_1_MODSYNC\n#define CONF_USART_1_MODSYNC 0\n#endif\n\n// <o> Start Frame Delimiter Selector\n// <0=>Start frame delimiter is COMMAND or DATA SYNC\n// <1=>Start frame delimiter is one bit\n// <i> Start Frame Delimiter Selector\n// <id> usart_start_frame_delimiter\n#ifndef CONF_USART_1_ONEBIT\n#define CONF_USART_1_ONEBIT 0\n#endif\n\n// <o> Fractional Part <0-7>\n// <i> Fractional part of the baud rate if baud rate generator is in fractional mode\n// <id> usart_arch_fractional\n#ifndef CONF_USART_1_FRACTIONAL\n#define CONF_USART_1_FRACTIONAL 0x0\n#endif\n\n// <o> Data Order\n// <0=>LSB is transmitted first\n// <1=>MSB is transmitted first\n// <i> Data order of the data bits in the frame\n// <id> usart_arch_msbf\n#ifndef CONF_USART_1_MSBF\n#define CONF_USART_1_MSBF 0\n#endif\n\n// </e>\n\n#define CONF_USART_1_MODE 0x0\n\n// Calculate BAUD register value in UART mode\n#if CONF_USART1_CK_SRC < 3\n#ifndef CONF_USART_1_BAUD_CD\n#define CONF_USART_1_BAUD_CD ((CONF_USART1_FREQUENCY) / CONF_USART_1_BAUD / 8 / (2 - CONF_USART_1_OVER))\n#endif\n#ifndef CONF_USART_1_BAUD_FP\n#define CONF_USART_1_BAUD_FP                                                                                           \\\n\t((CONF_USART1_FREQUENCY) / CONF_USART_1_BAUD / (2 - CONF_USART_1_OVER) - 8 * CONF_USART_1_BAUD_CD)\n#endif\n#elif CONF_USART1_CK_SRC == 3\n// No division is active. The value written in US_BRGR has no effect.\n#ifndef CONF_USART_1_BAUD_CD\n#define CONF_USART_1_BAUD_CD 1\n#endif\n#ifndef CONF_USART_1_BAUD_FP\n#define CONF_USART_1_BAUD_FP 1\n#endif\n#endif\n\n// <<< end of configuration section >>>\n\n#endif // HPL_USART_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_qmtech/hpl_xdmac_config.h",
    "content": "/* Auto-generated config file hpl_xdmac_config.h */\n#ifndef HPL_XDMAC_CONFIG_H\n#define HPL_XDMAC_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n// <e> XDMAC enable\n// <i> Indicates whether xdmac is enabled or not\n// <id> xdmac_enable\n#ifndef CONF_DMA_ENABLE\n#define CONF_DMA_ENABLE 0\n#endif\n\n// <e> Channel 0 settings\n// <id> dmac_channel_0_settings\n#ifndef CONF_DMAC_CHANNEL_0_SETTINGS\n#define CONF_DMAC_CHANNEL_0_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_0\n#ifndef CONF_DMAC_BURSTSIZE_0\n#define CONF_DMAC_BURSTSIZE_0 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_0\n#ifndef CONF_DMAC_CHUNKSIZE_0\n#define CONF_DMAC_CHUNKSIZE_0 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_0\n#ifndef CONF_DMAC_BEATSIZE_0\n#define CONF_DMAC_BEATSIZE_0 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_0\n#ifndef CONF_DMAC_SRC_INTERFACE_0\n#define CONF_DMAC_SRC_INTERFACE_0 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_0\n#ifndef CONF_DMAC_DES_INTERFACE_0\n#define CONF_DMAC_DES_INTERFACE_0 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_0\n#ifndef CONF_DMAC_SRCINC_0\n#define CONF_DMAC_SRCINC_0 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_0\n#ifndef CONF_DMAC_DSTINC_0\n#define CONF_DMAC_DSTINC_0 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_0\n#ifndef CONF_DMAC_TRANS_TYPE_0\n#define CONF_DMAC_TRANS_TYPE_0 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_0\n#ifndef CONF_DMAC_TRIGSRC_0\n#define CONF_DMAC_TRIGSRC_0 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_0 == 0\n#define CONF_DMAC_TYPE_0 0\n#define CONF_DMAC_DSYNC_0 0\n#elif CONF_DMAC_TRANS_TYPE_0 == 1\n#define CONF_DMAC_TYPE_0 1\n#define CONF_DMAC_DSYNC_0 0\n#elif CONF_DMAC_TRANS_TYPE_0 == 2\n#define CONF_DMAC_TYPE_0 1\n#define CONF_DMAC_DSYNC_0 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_0 == 0xFF\n#define CONF_DMAC_SWREQ_0 1\n#else\n#define CONF_DMAC_SWREQ_0 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_0_SETTINGS == 1 && CONF_DMAC_BEATSIZE_0 != 2 && ((!CONF_DMAC_SRCINC_0) || (!CONF_DMAC_DSTINC_0)))\n#if (!CONF_DMAC_SRCINC_0)\n#define CONF_DMAC_SRC_STRIDE_0 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_0)\n#define CONF_DMAC_DES_STRIDE_0 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_0\n#define CONF_DMAC_SRC_STRIDE_0 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_0\n#define CONF_DMAC_DES_STRIDE_0 0\n#endif\n\n// <e> Channel 1 settings\n// <id> dmac_channel_1_settings\n#ifndef CONF_DMAC_CHANNEL_1_SETTINGS\n#define CONF_DMAC_CHANNEL_1_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_1\n#ifndef CONF_DMAC_BURSTSIZE_1\n#define CONF_DMAC_BURSTSIZE_1 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_1\n#ifndef CONF_DMAC_CHUNKSIZE_1\n#define CONF_DMAC_CHUNKSIZE_1 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_1\n#ifndef CONF_DMAC_BEATSIZE_1\n#define CONF_DMAC_BEATSIZE_1 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_1\n#ifndef CONF_DMAC_SRC_INTERFACE_1\n#define CONF_DMAC_SRC_INTERFACE_1 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_1\n#ifndef CONF_DMAC_DES_INTERFACE_1\n#define CONF_DMAC_DES_INTERFACE_1 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_1\n#ifndef CONF_DMAC_SRCINC_1\n#define CONF_DMAC_SRCINC_1 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_1\n#ifndef CONF_DMAC_DSTINC_1\n#define CONF_DMAC_DSTINC_1 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_1\n#ifndef CONF_DMAC_TRANS_TYPE_1\n#define CONF_DMAC_TRANS_TYPE_1 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_1\n#ifndef CONF_DMAC_TRIGSRC_1\n#define CONF_DMAC_TRIGSRC_1 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_1 == 0\n#define CONF_DMAC_TYPE_1 0\n#define CONF_DMAC_DSYNC_1 0\n#elif CONF_DMAC_TRANS_TYPE_1 == 1\n#define CONF_DMAC_TYPE_1 1\n#define CONF_DMAC_DSYNC_1 0\n#elif CONF_DMAC_TRANS_TYPE_1 == 2\n#define CONF_DMAC_TYPE_1 1\n#define CONF_DMAC_DSYNC_1 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_1 == 0xFF\n#define CONF_DMAC_SWREQ_1 1\n#else\n#define CONF_DMAC_SWREQ_1 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_1_SETTINGS == 1 && CONF_DMAC_BEATSIZE_1 != 2 && ((!CONF_DMAC_SRCINC_1) || (!CONF_DMAC_DSTINC_1)))\n#if (!CONF_DMAC_SRCINC_1)\n#define CONF_DMAC_SRC_STRIDE_1 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_1)\n#define CONF_DMAC_DES_STRIDE_1 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_1\n#define CONF_DMAC_SRC_STRIDE_1 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_1\n#define CONF_DMAC_DES_STRIDE_1 0\n#endif\n\n// <e> Channel 2 settings\n// <id> dmac_channel_2_settings\n#ifndef CONF_DMAC_CHANNEL_2_SETTINGS\n#define CONF_DMAC_CHANNEL_2_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_2\n#ifndef CONF_DMAC_BURSTSIZE_2\n#define CONF_DMAC_BURSTSIZE_2 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_2\n#ifndef CONF_DMAC_CHUNKSIZE_2\n#define CONF_DMAC_CHUNKSIZE_2 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_2\n#ifndef CONF_DMAC_BEATSIZE_2\n#define CONF_DMAC_BEATSIZE_2 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_2\n#ifndef CONF_DMAC_SRC_INTERFACE_2\n#define CONF_DMAC_SRC_INTERFACE_2 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_2\n#ifndef CONF_DMAC_DES_INTERFACE_2\n#define CONF_DMAC_DES_INTERFACE_2 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_2\n#ifndef CONF_DMAC_SRCINC_2\n#define CONF_DMAC_SRCINC_2 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_2\n#ifndef CONF_DMAC_DSTINC_2\n#define CONF_DMAC_DSTINC_2 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_2\n#ifndef CONF_DMAC_TRANS_TYPE_2\n#define CONF_DMAC_TRANS_TYPE_2 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_2\n#ifndef CONF_DMAC_TRIGSRC_2\n#define CONF_DMAC_TRIGSRC_2 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_2 == 0\n#define CONF_DMAC_TYPE_2 0\n#define CONF_DMAC_DSYNC_2 0\n#elif CONF_DMAC_TRANS_TYPE_2 == 1\n#define CONF_DMAC_TYPE_2 1\n#define CONF_DMAC_DSYNC_2 0\n#elif CONF_DMAC_TRANS_TYPE_2 == 2\n#define CONF_DMAC_TYPE_2 1\n#define CONF_DMAC_DSYNC_2 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_2 == 0xFF\n#define CONF_DMAC_SWREQ_2 1\n#else\n#define CONF_DMAC_SWREQ_2 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_2_SETTINGS == 1 && CONF_DMAC_BEATSIZE_2 != 2 && ((!CONF_DMAC_SRCINC_2) || (!CONF_DMAC_DSTINC_2)))\n#if (!CONF_DMAC_SRCINC_2)\n#define CONF_DMAC_SRC_STRIDE_2 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_2)\n#define CONF_DMAC_DES_STRIDE_2 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_2\n#define CONF_DMAC_SRC_STRIDE_2 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_2\n#define CONF_DMAC_DES_STRIDE_2 0\n#endif\n\n// <e> Channel 3 settings\n// <id> dmac_channel_3_settings\n#ifndef CONF_DMAC_CHANNEL_3_SETTINGS\n#define CONF_DMAC_CHANNEL_3_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_3\n#ifndef CONF_DMAC_BURSTSIZE_3\n#define CONF_DMAC_BURSTSIZE_3 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_3\n#ifndef CONF_DMAC_CHUNKSIZE_3\n#define CONF_DMAC_CHUNKSIZE_3 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_3\n#ifndef CONF_DMAC_BEATSIZE_3\n#define CONF_DMAC_BEATSIZE_3 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_3\n#ifndef CONF_DMAC_SRC_INTERFACE_3\n#define CONF_DMAC_SRC_INTERFACE_3 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_3\n#ifndef CONF_DMAC_DES_INTERFACE_3\n#define CONF_DMAC_DES_INTERFACE_3 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_3\n#ifndef CONF_DMAC_SRCINC_3\n#define CONF_DMAC_SRCINC_3 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_3\n#ifndef CONF_DMAC_DSTINC_3\n#define CONF_DMAC_DSTINC_3 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_3\n#ifndef CONF_DMAC_TRANS_TYPE_3\n#define CONF_DMAC_TRANS_TYPE_3 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_3\n#ifndef CONF_DMAC_TRIGSRC_3\n#define CONF_DMAC_TRIGSRC_3 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_3 == 0\n#define CONF_DMAC_TYPE_3 0\n#define CONF_DMAC_DSYNC_3 0\n#elif CONF_DMAC_TRANS_TYPE_3 == 1\n#define CONF_DMAC_TYPE_3 1\n#define CONF_DMAC_DSYNC_3 0\n#elif CONF_DMAC_TRANS_TYPE_3 == 2\n#define CONF_DMAC_TYPE_3 1\n#define CONF_DMAC_DSYNC_3 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_3 == 0xFF\n#define CONF_DMAC_SWREQ_3 1\n#else\n#define CONF_DMAC_SWREQ_3 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_3_SETTINGS == 1 && CONF_DMAC_BEATSIZE_3 != 2 && ((!CONF_DMAC_SRCINC_3) || (!CONF_DMAC_DSTINC_3)))\n#if (!CONF_DMAC_SRCINC_3)\n#define CONF_DMAC_SRC_STRIDE_3 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_3)\n#define CONF_DMAC_DES_STRIDE_3 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_3\n#define CONF_DMAC_SRC_STRIDE_3 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_3\n#define CONF_DMAC_DES_STRIDE_3 0\n#endif\n\n// <e> Channel 4 settings\n// <id> dmac_channel_4_settings\n#ifndef CONF_DMAC_CHANNEL_4_SETTINGS\n#define CONF_DMAC_CHANNEL_4_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_4\n#ifndef CONF_DMAC_BURSTSIZE_4\n#define CONF_DMAC_BURSTSIZE_4 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_4\n#ifndef CONF_DMAC_CHUNKSIZE_4\n#define CONF_DMAC_CHUNKSIZE_4 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_4\n#ifndef CONF_DMAC_BEATSIZE_4\n#define CONF_DMAC_BEATSIZE_4 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_4\n#ifndef CONF_DMAC_SRC_INTERFACE_4\n#define CONF_DMAC_SRC_INTERFACE_4 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_4\n#ifndef CONF_DMAC_DES_INTERFACE_4\n#define CONF_DMAC_DES_INTERFACE_4 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_4\n#ifndef CONF_DMAC_SRCINC_4\n#define CONF_DMAC_SRCINC_4 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_4\n#ifndef CONF_DMAC_DSTINC_4\n#define CONF_DMAC_DSTINC_4 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_4\n#ifndef CONF_DMAC_TRANS_TYPE_4\n#define CONF_DMAC_TRANS_TYPE_4 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_4\n#ifndef CONF_DMAC_TRIGSRC_4\n#define CONF_DMAC_TRIGSRC_4 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_4 == 0\n#define CONF_DMAC_TYPE_4 0\n#define CONF_DMAC_DSYNC_4 0\n#elif CONF_DMAC_TRANS_TYPE_4 == 1\n#define CONF_DMAC_TYPE_4 1\n#define CONF_DMAC_DSYNC_4 0\n#elif CONF_DMAC_TRANS_TYPE_4 == 2\n#define CONF_DMAC_TYPE_4 1\n#define CONF_DMAC_DSYNC_4 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_4 == 0xFF\n#define CONF_DMAC_SWREQ_4 1\n#else\n#define CONF_DMAC_SWREQ_4 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_4_SETTINGS == 1 && CONF_DMAC_BEATSIZE_4 != 2 && ((!CONF_DMAC_SRCINC_4) || (!CONF_DMAC_DSTINC_4)))\n#if (!CONF_DMAC_SRCINC_4)\n#define CONF_DMAC_SRC_STRIDE_4 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_4)\n#define CONF_DMAC_DES_STRIDE_4 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_4\n#define CONF_DMAC_SRC_STRIDE_4 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_4\n#define CONF_DMAC_DES_STRIDE_4 0\n#endif\n\n// <e> Channel 5 settings\n// <id> dmac_channel_5_settings\n#ifndef CONF_DMAC_CHANNEL_5_SETTINGS\n#define CONF_DMAC_CHANNEL_5_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_5\n#ifndef CONF_DMAC_BURSTSIZE_5\n#define CONF_DMAC_BURSTSIZE_5 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_5\n#ifndef CONF_DMAC_CHUNKSIZE_5\n#define CONF_DMAC_CHUNKSIZE_5 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_5\n#ifndef CONF_DMAC_BEATSIZE_5\n#define CONF_DMAC_BEATSIZE_5 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_5\n#ifndef CONF_DMAC_SRC_INTERFACE_5\n#define CONF_DMAC_SRC_INTERFACE_5 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_5\n#ifndef CONF_DMAC_DES_INTERFACE_5\n#define CONF_DMAC_DES_INTERFACE_5 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_5\n#ifndef CONF_DMAC_SRCINC_5\n#define CONF_DMAC_SRCINC_5 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_5\n#ifndef CONF_DMAC_DSTINC_5\n#define CONF_DMAC_DSTINC_5 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_5\n#ifndef CONF_DMAC_TRANS_TYPE_5\n#define CONF_DMAC_TRANS_TYPE_5 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_5\n#ifndef CONF_DMAC_TRIGSRC_5\n#define CONF_DMAC_TRIGSRC_5 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_5 == 0\n#define CONF_DMAC_TYPE_5 0\n#define CONF_DMAC_DSYNC_5 0\n#elif CONF_DMAC_TRANS_TYPE_5 == 1\n#define CONF_DMAC_TYPE_5 1\n#define CONF_DMAC_DSYNC_5 0\n#elif CONF_DMAC_TRANS_TYPE_5 == 2\n#define CONF_DMAC_TYPE_5 1\n#define CONF_DMAC_DSYNC_5 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_5 == 0xFF\n#define CONF_DMAC_SWREQ_5 1\n#else\n#define CONF_DMAC_SWREQ_5 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_5_SETTINGS == 1 && CONF_DMAC_BEATSIZE_5 != 2 && ((!CONF_DMAC_SRCINC_5) || (!CONF_DMAC_DSTINC_5)))\n#if (!CONF_DMAC_SRCINC_5)\n#define CONF_DMAC_SRC_STRIDE_5 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_5)\n#define CONF_DMAC_DES_STRIDE_5 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_5\n#define CONF_DMAC_SRC_STRIDE_5 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_5\n#define CONF_DMAC_DES_STRIDE_5 0\n#endif\n\n// <e> Channel 6 settings\n// <id> dmac_channel_6_settings\n#ifndef CONF_DMAC_CHANNEL_6_SETTINGS\n#define CONF_DMAC_CHANNEL_6_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_6\n#ifndef CONF_DMAC_BURSTSIZE_6\n#define CONF_DMAC_BURSTSIZE_6 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_6\n#ifndef CONF_DMAC_CHUNKSIZE_6\n#define CONF_DMAC_CHUNKSIZE_6 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_6\n#ifndef CONF_DMAC_BEATSIZE_6\n#define CONF_DMAC_BEATSIZE_6 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_6\n#ifndef CONF_DMAC_SRC_INTERFACE_6\n#define CONF_DMAC_SRC_INTERFACE_6 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_6\n#ifndef CONF_DMAC_DES_INTERFACE_6\n#define CONF_DMAC_DES_INTERFACE_6 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_6\n#ifndef CONF_DMAC_SRCINC_6\n#define CONF_DMAC_SRCINC_6 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_6\n#ifndef CONF_DMAC_DSTINC_6\n#define CONF_DMAC_DSTINC_6 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_6\n#ifndef CONF_DMAC_TRANS_TYPE_6\n#define CONF_DMAC_TRANS_TYPE_6 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_6\n#ifndef CONF_DMAC_TRIGSRC_6\n#define CONF_DMAC_TRIGSRC_6 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_6 == 0\n#define CONF_DMAC_TYPE_6 0\n#define CONF_DMAC_DSYNC_6 0\n#elif CONF_DMAC_TRANS_TYPE_6 == 1\n#define CONF_DMAC_TYPE_6 1\n#define CONF_DMAC_DSYNC_6 0\n#elif CONF_DMAC_TRANS_TYPE_6 == 2\n#define CONF_DMAC_TYPE_6 1\n#define CONF_DMAC_DSYNC_6 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_6 == 0xFF\n#define CONF_DMAC_SWREQ_6 1\n#else\n#define CONF_DMAC_SWREQ_6 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_6_SETTINGS == 1 && CONF_DMAC_BEATSIZE_6 != 2 && ((!CONF_DMAC_SRCINC_6) || (!CONF_DMAC_DSTINC_6)))\n#if (!CONF_DMAC_SRCINC_6)\n#define CONF_DMAC_SRC_STRIDE_6 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_6)\n#define CONF_DMAC_DES_STRIDE_6 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_6\n#define CONF_DMAC_SRC_STRIDE_6 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_6\n#define CONF_DMAC_DES_STRIDE_6 0\n#endif\n\n// <e> Channel 7 settings\n// <id> dmac_channel_7_settings\n#ifndef CONF_DMAC_CHANNEL_7_SETTINGS\n#define CONF_DMAC_CHANNEL_7_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_7\n#ifndef CONF_DMAC_BURSTSIZE_7\n#define CONF_DMAC_BURSTSIZE_7 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_7\n#ifndef CONF_DMAC_CHUNKSIZE_7\n#define CONF_DMAC_CHUNKSIZE_7 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_7\n#ifndef CONF_DMAC_BEATSIZE_7\n#define CONF_DMAC_BEATSIZE_7 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_7\n#ifndef CONF_DMAC_SRC_INTERFACE_7\n#define CONF_DMAC_SRC_INTERFACE_7 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_7\n#ifndef CONF_DMAC_DES_INTERFACE_7\n#define CONF_DMAC_DES_INTERFACE_7 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_7\n#ifndef CONF_DMAC_SRCINC_7\n#define CONF_DMAC_SRCINC_7 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_7\n#ifndef CONF_DMAC_DSTINC_7\n#define CONF_DMAC_DSTINC_7 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_7\n#ifndef CONF_DMAC_TRANS_TYPE_7\n#define CONF_DMAC_TRANS_TYPE_7 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_7\n#ifndef CONF_DMAC_TRIGSRC_7\n#define CONF_DMAC_TRIGSRC_7 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_7 == 0\n#define CONF_DMAC_TYPE_7 0\n#define CONF_DMAC_DSYNC_7 0\n#elif CONF_DMAC_TRANS_TYPE_7 == 1\n#define CONF_DMAC_TYPE_7 1\n#define CONF_DMAC_DSYNC_7 0\n#elif CONF_DMAC_TRANS_TYPE_7 == 2\n#define CONF_DMAC_TYPE_7 1\n#define CONF_DMAC_DSYNC_7 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_7 == 0xFF\n#define CONF_DMAC_SWREQ_7 1\n#else\n#define CONF_DMAC_SWREQ_7 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_7_SETTINGS == 1 && CONF_DMAC_BEATSIZE_7 != 2 && ((!CONF_DMAC_SRCINC_7) || (!CONF_DMAC_DSTINC_7)))\n#if (!CONF_DMAC_SRCINC_7)\n#define CONF_DMAC_SRC_STRIDE_7 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_7)\n#define CONF_DMAC_DES_STRIDE_7 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_7\n#define CONF_DMAC_SRC_STRIDE_7 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_7\n#define CONF_DMAC_DES_STRIDE_7 0\n#endif\n\n// <e> Channel 8 settings\n// <id> dmac_channel_8_settings\n#ifndef CONF_DMAC_CHANNEL_8_SETTINGS\n#define CONF_DMAC_CHANNEL_8_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_8\n#ifndef CONF_DMAC_BURSTSIZE_8\n#define CONF_DMAC_BURSTSIZE_8 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_8\n#ifndef CONF_DMAC_CHUNKSIZE_8\n#define CONF_DMAC_CHUNKSIZE_8 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_8\n#ifndef CONF_DMAC_BEATSIZE_8\n#define CONF_DMAC_BEATSIZE_8 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_8\n#ifndef CONF_DMAC_SRC_INTERFACE_8\n#define CONF_DMAC_SRC_INTERFACE_8 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_8\n#ifndef CONF_DMAC_DES_INTERFACE_8\n#define CONF_DMAC_DES_INTERFACE_8 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_8\n#ifndef CONF_DMAC_SRCINC_8\n#define CONF_DMAC_SRCINC_8 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_8\n#ifndef CONF_DMAC_DSTINC_8\n#define CONF_DMAC_DSTINC_8 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_8\n#ifndef CONF_DMAC_TRANS_TYPE_8\n#define CONF_DMAC_TRANS_TYPE_8 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_8\n#ifndef CONF_DMAC_TRIGSRC_8\n#define CONF_DMAC_TRIGSRC_8 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_8 == 0\n#define CONF_DMAC_TYPE_8 0\n#define CONF_DMAC_DSYNC_8 0\n#elif CONF_DMAC_TRANS_TYPE_8 == 1\n#define CONF_DMAC_TYPE_8 1\n#define CONF_DMAC_DSYNC_8 0\n#elif CONF_DMAC_TRANS_TYPE_8 == 2\n#define CONF_DMAC_TYPE_8 1\n#define CONF_DMAC_DSYNC_8 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_8 == 0xFF\n#define CONF_DMAC_SWREQ_8 1\n#else\n#define CONF_DMAC_SWREQ_8 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_8_SETTINGS == 1 && CONF_DMAC_BEATSIZE_8 != 2 && ((!CONF_DMAC_SRCINC_8) || (!CONF_DMAC_DSTINC_8)))\n#if (!CONF_DMAC_SRCINC_8)\n#define CONF_DMAC_SRC_STRIDE_8 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_8)\n#define CONF_DMAC_DES_STRIDE_8 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_8\n#define CONF_DMAC_SRC_STRIDE_8 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_8\n#define CONF_DMAC_DES_STRIDE_8 0\n#endif\n\n// <e> Channel 9 settings\n// <id> dmac_channel_9_settings\n#ifndef CONF_DMAC_CHANNEL_9_SETTINGS\n#define CONF_DMAC_CHANNEL_9_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_9\n#ifndef CONF_DMAC_BURSTSIZE_9\n#define CONF_DMAC_BURSTSIZE_9 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_9\n#ifndef CONF_DMAC_CHUNKSIZE_9\n#define CONF_DMAC_CHUNKSIZE_9 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_9\n#ifndef CONF_DMAC_BEATSIZE_9\n#define CONF_DMAC_BEATSIZE_9 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_9\n#ifndef CONF_DMAC_SRC_INTERFACE_9\n#define CONF_DMAC_SRC_INTERFACE_9 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_9\n#ifndef CONF_DMAC_DES_INTERFACE_9\n#define CONF_DMAC_DES_INTERFACE_9 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_9\n#ifndef CONF_DMAC_SRCINC_9\n#define CONF_DMAC_SRCINC_9 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_9\n#ifndef CONF_DMAC_DSTINC_9\n#define CONF_DMAC_DSTINC_9 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_9\n#ifndef CONF_DMAC_TRANS_TYPE_9\n#define CONF_DMAC_TRANS_TYPE_9 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_9\n#ifndef CONF_DMAC_TRIGSRC_9\n#define CONF_DMAC_TRIGSRC_9 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_9 == 0\n#define CONF_DMAC_TYPE_9 0\n#define CONF_DMAC_DSYNC_9 0\n#elif CONF_DMAC_TRANS_TYPE_9 == 1\n#define CONF_DMAC_TYPE_9 1\n#define CONF_DMAC_DSYNC_9 0\n#elif CONF_DMAC_TRANS_TYPE_9 == 2\n#define CONF_DMAC_TYPE_9 1\n#define CONF_DMAC_DSYNC_9 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_9 == 0xFF\n#define CONF_DMAC_SWREQ_9 1\n#else\n#define CONF_DMAC_SWREQ_9 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_9_SETTINGS == 1 && CONF_DMAC_BEATSIZE_9 != 2 && ((!CONF_DMAC_SRCINC_9) || (!CONF_DMAC_DSTINC_9)))\n#if (!CONF_DMAC_SRCINC_9)\n#define CONF_DMAC_SRC_STRIDE_9 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_9)\n#define CONF_DMAC_DES_STRIDE_9 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_9\n#define CONF_DMAC_SRC_STRIDE_9 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_9\n#define CONF_DMAC_DES_STRIDE_9 0\n#endif\n\n// <e> Channel 10 settings\n// <id> dmac_channel_10_settings\n#ifndef CONF_DMAC_CHANNEL_10_SETTINGS\n#define CONF_DMAC_CHANNEL_10_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_10\n#ifndef CONF_DMAC_BURSTSIZE_10\n#define CONF_DMAC_BURSTSIZE_10 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_10\n#ifndef CONF_DMAC_CHUNKSIZE_10\n#define CONF_DMAC_CHUNKSIZE_10 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_10\n#ifndef CONF_DMAC_BEATSIZE_10\n#define CONF_DMAC_BEATSIZE_10 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_10\n#ifndef CONF_DMAC_SRC_INTERFACE_10\n#define CONF_DMAC_SRC_INTERFACE_10 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_10\n#ifndef CONF_DMAC_DES_INTERFACE_10\n#define CONF_DMAC_DES_INTERFACE_10 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_10\n#ifndef CONF_DMAC_SRCINC_10\n#define CONF_DMAC_SRCINC_10 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_10\n#ifndef CONF_DMAC_DSTINC_10\n#define CONF_DMAC_DSTINC_10 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_10\n#ifndef CONF_DMAC_TRANS_TYPE_10\n#define CONF_DMAC_TRANS_TYPE_10 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_10\n#ifndef CONF_DMAC_TRIGSRC_10\n#define CONF_DMAC_TRIGSRC_10 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_10 == 0\n#define CONF_DMAC_TYPE_10 0\n#define CONF_DMAC_DSYNC_10 0\n#elif CONF_DMAC_TRANS_TYPE_10 == 1\n#define CONF_DMAC_TYPE_10 1\n#define CONF_DMAC_DSYNC_10 0\n#elif CONF_DMAC_TRANS_TYPE_10 == 2\n#define CONF_DMAC_TYPE_10 1\n#define CONF_DMAC_DSYNC_10 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_10 == 0xFF\n#define CONF_DMAC_SWREQ_10 1\n#else\n#define CONF_DMAC_SWREQ_10 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_10_SETTINGS == 1 && CONF_DMAC_BEATSIZE_10 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_10) || (!CONF_DMAC_DSTINC_10)))\n#if (!CONF_DMAC_SRCINC_10)\n#define CONF_DMAC_SRC_STRIDE_10 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_10)\n#define CONF_DMAC_DES_STRIDE_10 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_10\n#define CONF_DMAC_SRC_STRIDE_10 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_10\n#define CONF_DMAC_DES_STRIDE_10 0\n#endif\n\n// <e> Channel 11 settings\n// <id> dmac_channel_11_settings\n#ifndef CONF_DMAC_CHANNEL_11_SETTINGS\n#define CONF_DMAC_CHANNEL_11_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_11\n#ifndef CONF_DMAC_BURSTSIZE_11\n#define CONF_DMAC_BURSTSIZE_11 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_11\n#ifndef CONF_DMAC_CHUNKSIZE_11\n#define CONF_DMAC_CHUNKSIZE_11 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_11\n#ifndef CONF_DMAC_BEATSIZE_11\n#define CONF_DMAC_BEATSIZE_11 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_11\n#ifndef CONF_DMAC_SRC_INTERFACE_11\n#define CONF_DMAC_SRC_INTERFACE_11 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_11\n#ifndef CONF_DMAC_DES_INTERFACE_11\n#define CONF_DMAC_DES_INTERFACE_11 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_11\n#ifndef CONF_DMAC_SRCINC_11\n#define CONF_DMAC_SRCINC_11 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_11\n#ifndef CONF_DMAC_DSTINC_11\n#define CONF_DMAC_DSTINC_11 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_11\n#ifndef CONF_DMAC_TRANS_TYPE_11\n#define CONF_DMAC_TRANS_TYPE_11 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_11\n#ifndef CONF_DMAC_TRIGSRC_11\n#define CONF_DMAC_TRIGSRC_11 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_11 == 0\n#define CONF_DMAC_TYPE_11 0\n#define CONF_DMAC_DSYNC_11 0\n#elif CONF_DMAC_TRANS_TYPE_11 == 1\n#define CONF_DMAC_TYPE_11 1\n#define CONF_DMAC_DSYNC_11 0\n#elif CONF_DMAC_TRANS_TYPE_11 == 2\n#define CONF_DMAC_TYPE_11 1\n#define CONF_DMAC_DSYNC_11 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_11 == 0xFF\n#define CONF_DMAC_SWREQ_11 1\n#else\n#define CONF_DMAC_SWREQ_11 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_11_SETTINGS == 1 && CONF_DMAC_BEATSIZE_11 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_11) || (!CONF_DMAC_DSTINC_11)))\n#if (!CONF_DMAC_SRCINC_11)\n#define CONF_DMAC_SRC_STRIDE_11 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_11)\n#define CONF_DMAC_DES_STRIDE_11 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_11\n#define CONF_DMAC_SRC_STRIDE_11 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_11\n#define CONF_DMAC_DES_STRIDE_11 0\n#endif\n\n// <e> Channel 12 settings\n// <id> dmac_channel_12_settings\n#ifndef CONF_DMAC_CHANNEL_12_SETTINGS\n#define CONF_DMAC_CHANNEL_12_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_12\n#ifndef CONF_DMAC_BURSTSIZE_12\n#define CONF_DMAC_BURSTSIZE_12 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_12\n#ifndef CONF_DMAC_CHUNKSIZE_12\n#define CONF_DMAC_CHUNKSIZE_12 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_12\n#ifndef CONF_DMAC_BEATSIZE_12\n#define CONF_DMAC_BEATSIZE_12 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_12\n#ifndef CONF_DMAC_SRC_INTERFACE_12\n#define CONF_DMAC_SRC_INTERFACE_12 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_12\n#ifndef CONF_DMAC_DES_INTERFACE_12\n#define CONF_DMAC_DES_INTERFACE_12 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_12\n#ifndef CONF_DMAC_SRCINC_12\n#define CONF_DMAC_SRCINC_12 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_12\n#ifndef CONF_DMAC_DSTINC_12\n#define CONF_DMAC_DSTINC_12 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_12\n#ifndef CONF_DMAC_TRANS_TYPE_12\n#define CONF_DMAC_TRANS_TYPE_12 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_12\n#ifndef CONF_DMAC_TRIGSRC_12\n#define CONF_DMAC_TRIGSRC_12 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_12 == 0\n#define CONF_DMAC_TYPE_12 0\n#define CONF_DMAC_DSYNC_12 0\n#elif CONF_DMAC_TRANS_TYPE_12 == 1\n#define CONF_DMAC_TYPE_12 1\n#define CONF_DMAC_DSYNC_12 0\n#elif CONF_DMAC_TRANS_TYPE_12 == 2\n#define CONF_DMAC_TYPE_12 1\n#define CONF_DMAC_DSYNC_12 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_12 == 0xFF\n#define CONF_DMAC_SWREQ_12 1\n#else\n#define CONF_DMAC_SWREQ_12 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_12_SETTINGS == 1 && CONF_DMAC_BEATSIZE_12 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_12) || (!CONF_DMAC_DSTINC_12)))\n#if (!CONF_DMAC_SRCINC_12)\n#define CONF_DMAC_SRC_STRIDE_12 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_12)\n#define CONF_DMAC_DES_STRIDE_12 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_12\n#define CONF_DMAC_SRC_STRIDE_12 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_12\n#define CONF_DMAC_DES_STRIDE_12 0\n#endif\n\n// <e> Channel 13 settings\n// <id> dmac_channel_13_settings\n#ifndef CONF_DMAC_CHANNEL_13_SETTINGS\n#define CONF_DMAC_CHANNEL_13_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_13\n#ifndef CONF_DMAC_BURSTSIZE_13\n#define CONF_DMAC_BURSTSIZE_13 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_13\n#ifndef CONF_DMAC_CHUNKSIZE_13\n#define CONF_DMAC_CHUNKSIZE_13 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_13\n#ifndef CONF_DMAC_BEATSIZE_13\n#define CONF_DMAC_BEATSIZE_13 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_13\n#ifndef CONF_DMAC_SRC_INTERFACE_13\n#define CONF_DMAC_SRC_INTERFACE_13 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_13\n#ifndef CONF_DMAC_DES_INTERFACE_13\n#define CONF_DMAC_DES_INTERFACE_13 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_13\n#ifndef CONF_DMAC_SRCINC_13\n#define CONF_DMAC_SRCINC_13 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_13\n#ifndef CONF_DMAC_DSTINC_13\n#define CONF_DMAC_DSTINC_13 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_13\n#ifndef CONF_DMAC_TRANS_TYPE_13\n#define CONF_DMAC_TRANS_TYPE_13 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_13\n#ifndef CONF_DMAC_TRIGSRC_13\n#define CONF_DMAC_TRIGSRC_13 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_13 == 0\n#define CONF_DMAC_TYPE_13 0\n#define CONF_DMAC_DSYNC_13 0\n#elif CONF_DMAC_TRANS_TYPE_13 == 1\n#define CONF_DMAC_TYPE_13 1\n#define CONF_DMAC_DSYNC_13 0\n#elif CONF_DMAC_TRANS_TYPE_13 == 2\n#define CONF_DMAC_TYPE_13 1\n#define CONF_DMAC_DSYNC_13 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_13 == 0xFF\n#define CONF_DMAC_SWREQ_13 1\n#else\n#define CONF_DMAC_SWREQ_13 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_13_SETTINGS == 1 && CONF_DMAC_BEATSIZE_13 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_13) || (!CONF_DMAC_DSTINC_13)))\n#if (!CONF_DMAC_SRCINC_13)\n#define CONF_DMAC_SRC_STRIDE_13 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_13)\n#define CONF_DMAC_DES_STRIDE_13 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_13\n#define CONF_DMAC_SRC_STRIDE_13 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_13\n#define CONF_DMAC_DES_STRIDE_13 0\n#endif\n\n// <e> Channel 14 settings\n// <id> dmac_channel_14_settings\n#ifndef CONF_DMAC_CHANNEL_14_SETTINGS\n#define CONF_DMAC_CHANNEL_14_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_14\n#ifndef CONF_DMAC_BURSTSIZE_14\n#define CONF_DMAC_BURSTSIZE_14 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_14\n#ifndef CONF_DMAC_CHUNKSIZE_14\n#define CONF_DMAC_CHUNKSIZE_14 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_14\n#ifndef CONF_DMAC_BEATSIZE_14\n#define CONF_DMAC_BEATSIZE_14 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_14\n#ifndef CONF_DMAC_SRC_INTERFACE_14\n#define CONF_DMAC_SRC_INTERFACE_14 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_14\n#ifndef CONF_DMAC_DES_INTERFACE_14\n#define CONF_DMAC_DES_INTERFACE_14 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_14\n#ifndef CONF_DMAC_SRCINC_14\n#define CONF_DMAC_SRCINC_14 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_14\n#ifndef CONF_DMAC_DSTINC_14\n#define CONF_DMAC_DSTINC_14 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_14\n#ifndef CONF_DMAC_TRANS_TYPE_14\n#define CONF_DMAC_TRANS_TYPE_14 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_14\n#ifndef CONF_DMAC_TRIGSRC_14\n#define CONF_DMAC_TRIGSRC_14 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_14 == 0\n#define CONF_DMAC_TYPE_14 0\n#define CONF_DMAC_DSYNC_14 0\n#elif CONF_DMAC_TRANS_TYPE_14 == 1\n#define CONF_DMAC_TYPE_14 1\n#define CONF_DMAC_DSYNC_14 0\n#elif CONF_DMAC_TRANS_TYPE_14 == 2\n#define CONF_DMAC_TYPE_14 1\n#define CONF_DMAC_DSYNC_14 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_14 == 0xFF\n#define CONF_DMAC_SWREQ_14 1\n#else\n#define CONF_DMAC_SWREQ_14 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_14_SETTINGS == 1 && CONF_DMAC_BEATSIZE_14 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_14) || (!CONF_DMAC_DSTINC_14)))\n#if (!CONF_DMAC_SRCINC_14)\n#define CONF_DMAC_SRC_STRIDE_14 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_14)\n#define CONF_DMAC_DES_STRIDE_14 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_14\n#define CONF_DMAC_SRC_STRIDE_14 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_14\n#define CONF_DMAC_DES_STRIDE_14 0\n#endif\n\n// <e> Channel 15 settings\n// <id> dmac_channel_15_settings\n#ifndef CONF_DMAC_CHANNEL_15_SETTINGS\n#define CONF_DMAC_CHANNEL_15_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_15\n#ifndef CONF_DMAC_BURSTSIZE_15\n#define CONF_DMAC_BURSTSIZE_15 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_15\n#ifndef CONF_DMAC_CHUNKSIZE_15\n#define CONF_DMAC_CHUNKSIZE_15 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_15\n#ifndef CONF_DMAC_BEATSIZE_15\n#define CONF_DMAC_BEATSIZE_15 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_15\n#ifndef CONF_DMAC_SRC_INTERFACE_15\n#define CONF_DMAC_SRC_INTERFACE_15 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_15\n#ifndef CONF_DMAC_DES_INTERFACE_15\n#define CONF_DMAC_DES_INTERFACE_15 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_15\n#ifndef CONF_DMAC_SRCINC_15\n#define CONF_DMAC_SRCINC_15 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_15\n#ifndef CONF_DMAC_DSTINC_15\n#define CONF_DMAC_DSTINC_15 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_15\n#ifndef CONF_DMAC_TRANS_TYPE_15\n#define CONF_DMAC_TRANS_TYPE_15 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_15\n#ifndef CONF_DMAC_TRIGSRC_15\n#define CONF_DMAC_TRIGSRC_15 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_15 == 0\n#define CONF_DMAC_TYPE_15 0\n#define CONF_DMAC_DSYNC_15 0\n#elif CONF_DMAC_TRANS_TYPE_15 == 1\n#define CONF_DMAC_TYPE_15 1\n#define CONF_DMAC_DSYNC_15 0\n#elif CONF_DMAC_TRANS_TYPE_15 == 2\n#define CONF_DMAC_TYPE_15 1\n#define CONF_DMAC_DSYNC_15 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_15 == 0xFF\n#define CONF_DMAC_SWREQ_15 1\n#else\n#define CONF_DMAC_SWREQ_15 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_15_SETTINGS == 1 && CONF_DMAC_BEATSIZE_15 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_15) || (!CONF_DMAC_DSTINC_15)))\n#if (!CONF_DMAC_SRCINC_15)\n#define CONF_DMAC_SRC_STRIDE_15 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_15)\n#define CONF_DMAC_DES_STRIDE_15 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_15\n#define CONF_DMAC_SRC_STRIDE_15 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_15\n#define CONF_DMAC_DES_STRIDE_15 0\n#endif\n\n// <e> Channel 16 settings\n// <id> dmac_channel_16_settings\n#ifndef CONF_DMAC_CHANNEL_16_SETTINGS\n#define CONF_DMAC_CHANNEL_16_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_16\n#ifndef CONF_DMAC_BURSTSIZE_16\n#define CONF_DMAC_BURSTSIZE_16 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_16\n#ifndef CONF_DMAC_CHUNKSIZE_16\n#define CONF_DMAC_CHUNKSIZE_16 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_16\n#ifndef CONF_DMAC_BEATSIZE_16\n#define CONF_DMAC_BEATSIZE_16 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_16\n#ifndef CONF_DMAC_SRC_INTERFACE_16\n#define CONF_DMAC_SRC_INTERFACE_16 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_16\n#ifndef CONF_DMAC_DES_INTERFACE_16\n#define CONF_DMAC_DES_INTERFACE_16 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_16\n#ifndef CONF_DMAC_SRCINC_16\n#define CONF_DMAC_SRCINC_16 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_16\n#ifndef CONF_DMAC_DSTINC_16\n#define CONF_DMAC_DSTINC_16 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_16\n#ifndef CONF_DMAC_TRANS_TYPE_16\n#define CONF_DMAC_TRANS_TYPE_16 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_16\n#ifndef CONF_DMAC_TRIGSRC_16\n#define CONF_DMAC_TRIGSRC_16 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_16 == 0\n#define CONF_DMAC_TYPE_16 0\n#define CONF_DMAC_DSYNC_16 0\n#elif CONF_DMAC_TRANS_TYPE_16 == 1\n#define CONF_DMAC_TYPE_16 1\n#define CONF_DMAC_DSYNC_16 0\n#elif CONF_DMAC_TRANS_TYPE_16 == 2\n#define CONF_DMAC_TYPE_16 1\n#define CONF_DMAC_DSYNC_16 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_16 == 0xFF\n#define CONF_DMAC_SWREQ_16 1\n#else\n#define CONF_DMAC_SWREQ_16 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_16_SETTINGS == 1 && CONF_DMAC_BEATSIZE_16 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_16) || (!CONF_DMAC_DSTINC_16)))\n#if (!CONF_DMAC_SRCINC_16)\n#define CONF_DMAC_SRC_STRIDE_16 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_16)\n#define CONF_DMAC_DES_STRIDE_16 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_16\n#define CONF_DMAC_SRC_STRIDE_16 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_16\n#define CONF_DMAC_DES_STRIDE_16 0\n#endif\n\n// <e> Channel 17 settings\n// <id> dmac_channel_17_settings\n#ifndef CONF_DMAC_CHANNEL_17_SETTINGS\n#define CONF_DMAC_CHANNEL_17_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_17\n#ifndef CONF_DMAC_BURSTSIZE_17\n#define CONF_DMAC_BURSTSIZE_17 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_17\n#ifndef CONF_DMAC_CHUNKSIZE_17\n#define CONF_DMAC_CHUNKSIZE_17 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_17\n#ifndef CONF_DMAC_BEATSIZE_17\n#define CONF_DMAC_BEATSIZE_17 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_17\n#ifndef CONF_DMAC_SRC_INTERFACE_17\n#define CONF_DMAC_SRC_INTERFACE_17 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_17\n#ifndef CONF_DMAC_DES_INTERFACE_17\n#define CONF_DMAC_DES_INTERFACE_17 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_17\n#ifndef CONF_DMAC_SRCINC_17\n#define CONF_DMAC_SRCINC_17 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_17\n#ifndef CONF_DMAC_DSTINC_17\n#define CONF_DMAC_DSTINC_17 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_17\n#ifndef CONF_DMAC_TRANS_TYPE_17\n#define CONF_DMAC_TRANS_TYPE_17 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_17\n#ifndef CONF_DMAC_TRIGSRC_17\n#define CONF_DMAC_TRIGSRC_17 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_17 == 0\n#define CONF_DMAC_TYPE_17 0\n#define CONF_DMAC_DSYNC_17 0\n#elif CONF_DMAC_TRANS_TYPE_17 == 1\n#define CONF_DMAC_TYPE_17 1\n#define CONF_DMAC_DSYNC_17 0\n#elif CONF_DMAC_TRANS_TYPE_17 == 2\n#define CONF_DMAC_TYPE_17 1\n#define CONF_DMAC_DSYNC_17 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_17 == 0xFF\n#define CONF_DMAC_SWREQ_17 1\n#else\n#define CONF_DMAC_SWREQ_17 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_17_SETTINGS == 1 && CONF_DMAC_BEATSIZE_17 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_17) || (!CONF_DMAC_DSTINC_17)))\n#if (!CONF_DMAC_SRCINC_17)\n#define CONF_DMAC_SRC_STRIDE_17 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_17)\n#define CONF_DMAC_DES_STRIDE_17 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_17\n#define CONF_DMAC_SRC_STRIDE_17 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_17\n#define CONF_DMAC_DES_STRIDE_17 0\n#endif\n\n// <e> Channel 18 settings\n// <id> dmac_channel_18_settings\n#ifndef CONF_DMAC_CHANNEL_18_SETTINGS\n#define CONF_DMAC_CHANNEL_18_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_18\n#ifndef CONF_DMAC_BURSTSIZE_18\n#define CONF_DMAC_BURSTSIZE_18 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_18\n#ifndef CONF_DMAC_CHUNKSIZE_18\n#define CONF_DMAC_CHUNKSIZE_18 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_18\n#ifndef CONF_DMAC_BEATSIZE_18\n#define CONF_DMAC_BEATSIZE_18 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_18\n#ifndef CONF_DMAC_SRC_INTERFACE_18\n#define CONF_DMAC_SRC_INTERFACE_18 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_18\n#ifndef CONF_DMAC_DES_INTERFACE_18\n#define CONF_DMAC_DES_INTERFACE_18 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_18\n#ifndef CONF_DMAC_SRCINC_18\n#define CONF_DMAC_SRCINC_18 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_18\n#ifndef CONF_DMAC_DSTINC_18\n#define CONF_DMAC_DSTINC_18 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_18\n#ifndef CONF_DMAC_TRANS_TYPE_18\n#define CONF_DMAC_TRANS_TYPE_18 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_18\n#ifndef CONF_DMAC_TRIGSRC_18\n#define CONF_DMAC_TRIGSRC_18 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_18 == 0\n#define CONF_DMAC_TYPE_18 0\n#define CONF_DMAC_DSYNC_18 0\n#elif CONF_DMAC_TRANS_TYPE_18 == 1\n#define CONF_DMAC_TYPE_18 1\n#define CONF_DMAC_DSYNC_18 0\n#elif CONF_DMAC_TRANS_TYPE_18 == 2\n#define CONF_DMAC_TYPE_18 1\n#define CONF_DMAC_DSYNC_18 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_18 == 0xFF\n#define CONF_DMAC_SWREQ_18 1\n#else\n#define CONF_DMAC_SWREQ_18 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_18_SETTINGS == 1 && CONF_DMAC_BEATSIZE_18 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_18) || (!CONF_DMAC_DSTINC_18)))\n#if (!CONF_DMAC_SRCINC_18)\n#define CONF_DMAC_SRC_STRIDE_18 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_18)\n#define CONF_DMAC_DES_STRIDE_18 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_18\n#define CONF_DMAC_SRC_STRIDE_18 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_18\n#define CONF_DMAC_DES_STRIDE_18 0\n#endif\n\n// <e> Channel 19 settings\n// <id> dmac_channel_19_settings\n#ifndef CONF_DMAC_CHANNEL_19_SETTINGS\n#define CONF_DMAC_CHANNEL_19_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_19\n#ifndef CONF_DMAC_BURSTSIZE_19\n#define CONF_DMAC_BURSTSIZE_19 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_19\n#ifndef CONF_DMAC_CHUNKSIZE_19\n#define CONF_DMAC_CHUNKSIZE_19 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_19\n#ifndef CONF_DMAC_BEATSIZE_19\n#define CONF_DMAC_BEATSIZE_19 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_19\n#ifndef CONF_DMAC_SRC_INTERFACE_19\n#define CONF_DMAC_SRC_INTERFACE_19 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_19\n#ifndef CONF_DMAC_DES_INTERFACE_19\n#define CONF_DMAC_DES_INTERFACE_19 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_19\n#ifndef CONF_DMAC_SRCINC_19\n#define CONF_DMAC_SRCINC_19 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_19\n#ifndef CONF_DMAC_DSTINC_19\n#define CONF_DMAC_DSTINC_19 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_19\n#ifndef CONF_DMAC_TRANS_TYPE_19\n#define CONF_DMAC_TRANS_TYPE_19 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_19\n#ifndef CONF_DMAC_TRIGSRC_19\n#define CONF_DMAC_TRIGSRC_19 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_19 == 0\n#define CONF_DMAC_TYPE_19 0\n#define CONF_DMAC_DSYNC_19 0\n#elif CONF_DMAC_TRANS_TYPE_19 == 1\n#define CONF_DMAC_TYPE_19 1\n#define CONF_DMAC_DSYNC_19 0\n#elif CONF_DMAC_TRANS_TYPE_19 == 2\n#define CONF_DMAC_TYPE_19 1\n#define CONF_DMAC_DSYNC_19 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_19 == 0xFF\n#define CONF_DMAC_SWREQ_19 1\n#else\n#define CONF_DMAC_SWREQ_19 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_19_SETTINGS == 1 && CONF_DMAC_BEATSIZE_19 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_19) || (!CONF_DMAC_DSTINC_19)))\n#if (!CONF_DMAC_SRCINC_19)\n#define CONF_DMAC_SRC_STRIDE_19 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_19)\n#define CONF_DMAC_DES_STRIDE_19 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_19\n#define CONF_DMAC_SRC_STRIDE_19 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_19\n#define CONF_DMAC_DES_STRIDE_19 0\n#endif\n\n// <e> Channel 20 settings\n// <id> dmac_channel_20_settings\n#ifndef CONF_DMAC_CHANNEL_20_SETTINGS\n#define CONF_DMAC_CHANNEL_20_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_20\n#ifndef CONF_DMAC_BURSTSIZE_20\n#define CONF_DMAC_BURSTSIZE_20 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_20\n#ifndef CONF_DMAC_CHUNKSIZE_20\n#define CONF_DMAC_CHUNKSIZE_20 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_20\n#ifndef CONF_DMAC_BEATSIZE_20\n#define CONF_DMAC_BEATSIZE_20 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_20\n#ifndef CONF_DMAC_SRC_INTERFACE_20\n#define CONF_DMAC_SRC_INTERFACE_20 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_20\n#ifndef CONF_DMAC_DES_INTERFACE_20\n#define CONF_DMAC_DES_INTERFACE_20 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_20\n#ifndef CONF_DMAC_SRCINC_20\n#define CONF_DMAC_SRCINC_20 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_20\n#ifndef CONF_DMAC_DSTINC_20\n#define CONF_DMAC_DSTINC_20 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_20\n#ifndef CONF_DMAC_TRANS_TYPE_20\n#define CONF_DMAC_TRANS_TYPE_20 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_20\n#ifndef CONF_DMAC_TRIGSRC_20\n#define CONF_DMAC_TRIGSRC_20 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_20 == 0\n#define CONF_DMAC_TYPE_20 0\n#define CONF_DMAC_DSYNC_20 0\n#elif CONF_DMAC_TRANS_TYPE_20 == 1\n#define CONF_DMAC_TYPE_20 1\n#define CONF_DMAC_DSYNC_20 0\n#elif CONF_DMAC_TRANS_TYPE_20 == 2\n#define CONF_DMAC_TYPE_20 1\n#define CONF_DMAC_DSYNC_20 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_20 == 0xFF\n#define CONF_DMAC_SWREQ_20 1\n#else\n#define CONF_DMAC_SWREQ_20 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_20_SETTINGS == 1 && CONF_DMAC_BEATSIZE_20 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_20) || (!CONF_DMAC_DSTINC_20)))\n#if (!CONF_DMAC_SRCINC_20)\n#define CONF_DMAC_SRC_STRIDE_20 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_20)\n#define CONF_DMAC_DES_STRIDE_20 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_20\n#define CONF_DMAC_SRC_STRIDE_20 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_20\n#define CONF_DMAC_DES_STRIDE_20 0\n#endif\n\n// <e> Channel 21 settings\n// <id> dmac_channel_21_settings\n#ifndef CONF_DMAC_CHANNEL_21_SETTINGS\n#define CONF_DMAC_CHANNEL_21_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_21\n#ifndef CONF_DMAC_BURSTSIZE_21\n#define CONF_DMAC_BURSTSIZE_21 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_21\n#ifndef CONF_DMAC_CHUNKSIZE_21\n#define CONF_DMAC_CHUNKSIZE_21 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_21\n#ifndef CONF_DMAC_BEATSIZE_21\n#define CONF_DMAC_BEATSIZE_21 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_21\n#ifndef CONF_DMAC_SRC_INTERFACE_21\n#define CONF_DMAC_SRC_INTERFACE_21 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_21\n#ifndef CONF_DMAC_DES_INTERFACE_21\n#define CONF_DMAC_DES_INTERFACE_21 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_21\n#ifndef CONF_DMAC_SRCINC_21\n#define CONF_DMAC_SRCINC_21 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_21\n#ifndef CONF_DMAC_DSTINC_21\n#define CONF_DMAC_DSTINC_21 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_21\n#ifndef CONF_DMAC_TRANS_TYPE_21\n#define CONF_DMAC_TRANS_TYPE_21 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_21\n#ifndef CONF_DMAC_TRIGSRC_21\n#define CONF_DMAC_TRIGSRC_21 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_21 == 0\n#define CONF_DMAC_TYPE_21 0\n#define CONF_DMAC_DSYNC_21 0\n#elif CONF_DMAC_TRANS_TYPE_21 == 1\n#define CONF_DMAC_TYPE_21 1\n#define CONF_DMAC_DSYNC_21 0\n#elif CONF_DMAC_TRANS_TYPE_21 == 2\n#define CONF_DMAC_TYPE_21 1\n#define CONF_DMAC_DSYNC_21 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_21 == 0xFF\n#define CONF_DMAC_SWREQ_21 1\n#else\n#define CONF_DMAC_SWREQ_21 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_21_SETTINGS == 1 && CONF_DMAC_BEATSIZE_21 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_21) || (!CONF_DMAC_DSTINC_21)))\n#if (!CONF_DMAC_SRCINC_21)\n#define CONF_DMAC_SRC_STRIDE_21 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_21)\n#define CONF_DMAC_DES_STRIDE_21 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_21\n#define CONF_DMAC_SRC_STRIDE_21 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_21\n#define CONF_DMAC_DES_STRIDE_21 0\n#endif\n\n// <e> Channel 22 settings\n// <id> dmac_channel_22_settings\n#ifndef CONF_DMAC_CHANNEL_22_SETTINGS\n#define CONF_DMAC_CHANNEL_22_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_22\n#ifndef CONF_DMAC_BURSTSIZE_22\n#define CONF_DMAC_BURSTSIZE_22 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_22\n#ifndef CONF_DMAC_CHUNKSIZE_22\n#define CONF_DMAC_CHUNKSIZE_22 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_22\n#ifndef CONF_DMAC_BEATSIZE_22\n#define CONF_DMAC_BEATSIZE_22 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_22\n#ifndef CONF_DMAC_SRC_INTERFACE_22\n#define CONF_DMAC_SRC_INTERFACE_22 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_22\n#ifndef CONF_DMAC_DES_INTERFACE_22\n#define CONF_DMAC_DES_INTERFACE_22 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_22\n#ifndef CONF_DMAC_SRCINC_22\n#define CONF_DMAC_SRCINC_22 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_22\n#ifndef CONF_DMAC_DSTINC_22\n#define CONF_DMAC_DSTINC_22 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_22\n#ifndef CONF_DMAC_TRANS_TYPE_22\n#define CONF_DMAC_TRANS_TYPE_22 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_22\n#ifndef CONF_DMAC_TRIGSRC_22\n#define CONF_DMAC_TRIGSRC_22 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_22 == 0\n#define CONF_DMAC_TYPE_22 0\n#define CONF_DMAC_DSYNC_22 0\n#elif CONF_DMAC_TRANS_TYPE_22 == 1\n#define CONF_DMAC_TYPE_22 1\n#define CONF_DMAC_DSYNC_22 0\n#elif CONF_DMAC_TRANS_TYPE_22 == 2\n#define CONF_DMAC_TYPE_22 1\n#define CONF_DMAC_DSYNC_22 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_22 == 0xFF\n#define CONF_DMAC_SWREQ_22 1\n#else\n#define CONF_DMAC_SWREQ_22 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_22_SETTINGS == 1 && CONF_DMAC_BEATSIZE_22 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_22) || (!CONF_DMAC_DSTINC_22)))\n#if (!CONF_DMAC_SRCINC_22)\n#define CONF_DMAC_SRC_STRIDE_22 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_22)\n#define CONF_DMAC_DES_STRIDE_22 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_22\n#define CONF_DMAC_SRC_STRIDE_22 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_22\n#define CONF_DMAC_DES_STRIDE_22 0\n#endif\n\n// <e> Channel 23 settings\n// <id> dmac_channel_23_settings\n#ifndef CONF_DMAC_CHANNEL_23_SETTINGS\n#define CONF_DMAC_CHANNEL_23_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_23\n#ifndef CONF_DMAC_BURSTSIZE_23\n#define CONF_DMAC_BURSTSIZE_23 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_23\n#ifndef CONF_DMAC_CHUNKSIZE_23\n#define CONF_DMAC_CHUNKSIZE_23 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_23\n#ifndef CONF_DMAC_BEATSIZE_23\n#define CONF_DMAC_BEATSIZE_23 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_23\n#ifndef CONF_DMAC_SRC_INTERFACE_23\n#define CONF_DMAC_SRC_INTERFACE_23 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_23\n#ifndef CONF_DMAC_DES_INTERFACE_23\n#define CONF_DMAC_DES_INTERFACE_23 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_23\n#ifndef CONF_DMAC_SRCINC_23\n#define CONF_DMAC_SRCINC_23 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_23\n#ifndef CONF_DMAC_DSTINC_23\n#define CONF_DMAC_DSTINC_23 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_23\n#ifndef CONF_DMAC_TRANS_TYPE_23\n#define CONF_DMAC_TRANS_TYPE_23 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_23\n#ifndef CONF_DMAC_TRIGSRC_23\n#define CONF_DMAC_TRIGSRC_23 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_23 == 0\n#define CONF_DMAC_TYPE_23 0\n#define CONF_DMAC_DSYNC_23 0\n#elif CONF_DMAC_TRANS_TYPE_23 == 1\n#define CONF_DMAC_TYPE_23 1\n#define CONF_DMAC_DSYNC_23 0\n#elif CONF_DMAC_TRANS_TYPE_23 == 2\n#define CONF_DMAC_TYPE_23 1\n#define CONF_DMAC_DSYNC_23 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_23 == 0xFF\n#define CONF_DMAC_SWREQ_23 1\n#else\n#define CONF_DMAC_SWREQ_23 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_23_SETTINGS == 1 && CONF_DMAC_BEATSIZE_23 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_23) || (!CONF_DMAC_DSTINC_23)))\n#if (!CONF_DMAC_SRCINC_23)\n#define CONF_DMAC_SRC_STRIDE_23 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_23)\n#define CONF_DMAC_DES_STRIDE_23 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_23\n#define CONF_DMAC_SRC_STRIDE_23 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_23\n#define CONF_DMAC_DES_STRIDE_23 0\n#endif\n\n// </e>\n\n// <<< end of configuration section >>>\n\n#endif // HPL_XDMAC_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_qmtech/peripheral_clk_config.h",
    "content": "/* Auto-generated config file peripheral_clk_config.h */\n#ifndef PERIPHERAL_CLK_CONFIG_H\n#define PERIPHERAL_CLK_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n/**\n * \\def CONF_HCLK_FREQUENCY\n * \\brief HCLK's Clock frequency\n */\n#ifndef CONF_HCLK_FREQUENCY\n#define CONF_HCLK_FREQUENCY 300000000\n#endif\n\n/**\n * \\def CONF_FCLK_FREQUENCY\n * \\brief FCLK's Clock frequency\n */\n#ifndef CONF_FCLK_FREQUENCY\n#define CONF_FCLK_FREQUENCY 300000000\n#endif\n\n/**\n * \\def CONF_CPU_FREQUENCY\n * \\brief CPU's Clock frequency\n */\n#ifndef CONF_CPU_FREQUENCY\n#define CONF_CPU_FREQUENCY 300000000\n#endif\n\n/**\n * \\def CONF_SLCK_FREQUENCY\n * \\brief Slow Clock frequency\n */\n#define CONF_SLCK_FREQUENCY 0\n\n/**\n * \\def CONF_MCK_FREQUENCY\n * \\brief Master Clock frequency\n */\n#define CONF_MCK_FREQUENCY 150000000\n\n/**\n * \\def CONF_PCK6_FREQUENCY\n * \\brief Programmable Clock Controller 6 frequency\n */\n#define CONF_PCK6_FREQUENCY 1714285\n\n// <h> USART Clock Settings\n// <o> USART Clock source\n\n// <0=> Master Clock (MCK)\n// <1=> MCK / 8 for USART\n// <2=> Programmable Clock Controller 4 (PMC_PCK4)\n// <3=> External Clock\n// <i> This defines the clock source for the USART\n// <id> usart_clock_source\n#ifndef CONF_USART1_CK_SRC\n#define CONF_USART1_CK_SRC 0\n#endif\n\n// <o> USART External Clock Input on SCK <1-4294967295>\n// <i> Inputs the external clock frequency on SCK\n// <id> usart_clock_freq\n#ifndef CONF_USART1_SCK_FREQ\n#define CONF_USART1_SCK_FREQ 10000000\n#endif\n\n// </h>\n\n/**\n * \\def USART FREQUENCY\n * \\brief USART's Clock frequency\n */\n#ifndef CONF_USART1_FREQUENCY\n#define CONF_USART1_FREQUENCY 150000000\n#endif\n\n#ifndef CONF_SRC_USB_480M\n#define CONF_SRC_USB_480M 0\n#endif\n\n#ifndef CONF_SRC_USB_48M\n#define CONF_SRC_USB_48M 1\n#endif\n\n// <y> USB Full/Low Speed Clock\n// <CONF_SRC_USB_48M\"> USB Clock Controller (USB_48M)\n// <id> usb_fsls_clock_source\n// <i> 48MHz clock source for low speed and full speed.\n// <i> It must be available when low speed is supported by host driver.\n// <i> It must be available when low power mode is selected.\n#ifndef CONF_USBHS_FSLS_SRC\n#define CONF_USBHS_FSLS_SRC CONF_SRC_USB_48M\n#endif\n\n// <y> USB Clock Source(Normal/Low-power Mode Selection)\n// <CONF_SRC_USB_480M\"> USB High Speed Clock (USB_480M)\n// <CONF_SRC_USB_48M\"> USB Clock Controller (USB_48M)\n// <id> usb_clock_source\n// <i> Select the clock source for USB.\n// <i> In normal mode, use \"USB High Speed Clock (USB_480M)\".\n// <i> In low-power mode, use \"USB Clock Controller (USB_48M)\".\n#ifndef CONF_USBHS_SRC\n#define CONF_USBHS_SRC CONF_SRC_USB_480M\n#endif\n\n/**\n * \\def CONF_USBHS_FSLS_FREQUENCY\n * \\brief USBHS's Full/Low Speed Clock Source frequency\n */\n#ifndef CONF_USBHS_FSLS_FREQUENCY\n#define CONF_USBHS_FSLS_FREQUENCY 48000000\n#endif\n\n/**\n * \\def CONF_USBHS_FREQUENCY\n * \\brief USBHS's Selected Clock Source frequency\n */\n#ifndef CONF_USBHS_FREQUENCY\n#define CONF_USBHS_FREQUENCY 480000000\n#endif\n\n// <<< end of configuration section >>>\n\n#endif // PERIPHERAL_CLK_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_xplained/board.cmake",
    "content": "set(JLINK_DEVICE ATSAME70Q21B)\nset(LD_FILE_GNU ${TOP}/hw/mcu/microchip/same70/same70b/gcc/gcc/same70q21b_flash.ld)\nset(LD_FILE_IAR ${TOP}/hw/mcu/microchip/same70/same70b/iar/config/linker/Microchip/atsame70q21b/flash.icf)\n\nset(STARTUP_FILE_GNU ${TOP}/hw/mcu/microchip/same70/same70b/gcc/gcc/startup_same70q21b.c)\nset(STARTUP_FILE_IAR ${TOP}/hw/mcu/microchip/same70/same70b/iar/iar/startup_same70q21b.c)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAME70Q21B__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_xplained/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to do so, subject to the\n * following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: SAME70 Xplained\n   manufacturer: Microchip\n   url: https://www.microchip.com/en-us/development-tool/atsame70-xpld\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define LED_PIN GPIO(GPIO_PORTC, 8)\n#define LED_STATE_ON 1\n#define LED_PORT_CLOCK ID_PIOC\n\n#define BUTTON_PIN GPIO(GPIO_PORTA, 11)\n#define BUTTON_STATE_ACTIVE 0\n#define BUTTON_PORT_CLOCK ID_PIOA\n\n#define UART_TX_PIN GPIO(GPIO_PORTB, 4)\n#define UART_TX_FUNCTION MUX_PB4D_USART1_TXD1\n#define UART_RX_PIN GPIO(GPIO_PORTA, 21)\n#define UART_RX_FUNCTION MUX_PA21A_USART1_RXD1\n#define UART_PORT_CLOCK ID_USART1\n#define BOARD_USART USART1\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport;\n  (void) state;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_xplained/board.mk",
    "content": "CFLAGS += -D__SAME70Q21B__\n\nLD_FILE = $(SDK_DIR)/same70b/gcc/gcc/same70q21b_flash.ld\nSTARTUP_FILE = $(SDK_DIR)/same70b/gcc/gcc/startup_same70q21b.c\n\nJLINK_DEVICE = ATSAME70Q21B\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_xplained/hpl_pmc_config.h",
    "content": "/* Auto-generated config file hpl_pmc_config.h */\n#ifndef HPL_PMC_CONFIG_H\n#define HPL_PMC_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n#include <peripheral_clk_config.h>\n\n#define CLK_SRC_OPTION_OSC32K 0\n#define CLK_SRC_OPTION_XOSC32K 1\n#define CLK_SRC_OPTION_OSC12M 2\n#define CLK_SRC_OPTION_XOSC20M 3\n\n#define CLK_SRC_OPTION_SLCK 0\n#define CLK_SRC_OPTION_MAINCK 1\n#define CLK_SRC_OPTION_PLLACK 2\n#define CLK_SRC_OPTION_UPLLCKDIV 3\n#define CLK_SRC_OPTION_MCK 4\n\n#define CLK_SRC_OPTION_UPLLCK 3\n\n#define CONF_RC_4M 0\n#define CONF_RC_8M 1\n#define CONF_RC_12M 2\n\n#define CONF_XOSC32K_NO_BYPASS 0\n#define CONF_XOSC32K_BYPASS 1\n\n#define CONF_XOSC20M_NO_BYPASS 0\n#define CONF_XOSC20M_BYPASS 1\n\n// <e> Clock_SLCK configuration\n// <i> Indicates whether SLCK configuration is enabled or not\n// <id> enable_clk_gen_slck\n#ifndef CONF_CLK_SLCK_CONFIG\n#define CONF_CLK_SLCK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator SLCK source\n\n// <CLK_SRC_OPTION_OSC32K\"> 32kHz High Accuracy Internal Oscillator (OSC32K)\n\n// <CLK_SRC_OPTION_XOSC32K\"> 32kHz External Crystal Oscillator (XOSC32K)\n\n// <i> This defines the clock source for SLCK\n// <id> clk_gen_slck_oscillator\n#ifndef CONF_CLK_GEN_SLCK_SRC\n#define CONF_CLK_GEN_SLCK_SRC CLK_SRC_OPTION_OSC32K\n#endif\n\n// <q> Enable Clock_SLCK\n// <i> Indicates whether SLCK is enabled or disable\n// <id> clk_gen_slck_arch_enable\n#ifndef CONF_CLK_SLCK_ENABLE\n#define CONF_CLK_SLCK_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>// <e> Clock_MAINCK configuration\n// <i> Indicates whether MAINCK configuration is enabled or not\n// <id> enable_clk_gen_mainck\n#ifndef CONF_CLK_MAINCK_CONFIG\n#define CONF_CLK_MAINCK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator MAINCK source\n\n// <CLK_SRC_OPTION_OSC12M\"> Embedded 4/8/12MHz RC Oscillator (OSC12M)\n\n// <CLK_SRC_OPTION_XOSC20M\"> External 3-20MHz Oscillator (XOSC20M)\n\n// <i> This defines the clock source for MAINCK\n// <id> clk_gen_mainck_oscillator\n#ifndef CONF_CLK_GEN_MAINCK_SRC\n#define CONF_CLK_GEN_MAINCK_SRC CLK_SRC_OPTION_XOSC20M\n#endif\n\n// <q> Enable Clock_MAINCK\n// <i> Indicates whether MAINCK is enabled or disable\n// <id> clk_gen_mainck_arch_enable\n#ifndef CONF_CLK_MAINCK_ENABLE\n#define CONF_CLK_MAINCK_ENABLE 1\n#endif\n\n// <q> Enable Main Clock Failure Detection\n// <i> Indicates whether Main Clock Failure Detection is enabled or disable.\n// <i> The 4/8/12 MHz RC oscillator must be selected as the source of MAINCK.\n// <id> clk_gen_cfden_enable\n#ifndef CONF_CLK_CFDEN_ENABLE\n#define CONF_CLK_CFDEN_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>// <e> Clock_MCKR configuration\n// <i> Indicates whether MCKR configuration is enabled or not\n// <id> enable_clk_gen_mckr\n#ifndef CONF_CLK_MCKR_CONFIG\n#define CONF_CLK_MCKR_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator MCKR source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <i> This defines the clock source for MCKR\n// <id> clk_gen_mckr_oscillator\n#ifndef CONF_CLK_GEN_MCKR_SRC\n#define CONF_CLK_GEN_MCKR_SRC CLK_SRC_OPTION_PLLACK\n#endif\n\n// <q> Enable Clock_MCKR\n// <i> Indicates whether MCKR is enabled or disable\n// <id> clk_gen_mckr_arch_enable\n#ifndef CONF_CLK_MCKR_ENABLE\n#define CONF_CLK_MCKR_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Master Clock Prescaler\n// <0=> 1\n// <1=> 2\n// <2=> 4\n// <3=> 8\n// <4=> 16\n// <5=> 32\n// <6=> 64\n// <7=> 3\n// <i> Select the clock prescaler.\n// <id> mckr_presc\n#ifndef CONF_MCKR_PRESC\n#define CONF_MCKR_PRESC 0\n#endif\n\n// </h>\n// </e>// <e> Clock_MCK configuration\n// <i> Indicates whether MCK configuration is enabled or not\n// <id> enable_clk_gen_mck\n#ifndef CONF_CLK_MCK_CONFIG\n#define CONF_CLK_MCK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator MCK source\n\n// <CLK_SRC_OPTION_MCKR\"> Master Clock Controller (PMC_MCKR)\n\n// <i> This defines the clock source for MCK\n// <id> clk_gen_mck_oscillator\n#ifndef CONF_CLK_GEN_MCK_SRC\n#define CONF_CLK_GEN_MCK_SRC CLK_SRC_OPTION_MCKR\n#endif\n\n// </h>\n\n// <h>\n\n//<o> Master Clock Controller Divider MCK divider\n// <0=> 1\n// <1=> 2\n// <3=> 3\n// <2=> 4\n// <i> Select the master clock divider.\n// <id> mck_div\n#ifndef CONF_MCK_DIV\n#define CONF_MCK_DIV 1\n#endif\n\n// </h>\n// </e>// <e> Clock_SYSTICK configuration\n// <i> Indicates whether SYSTICK configuration is enabled or not\n// <id> enable_clk_gen_systick\n#ifndef CONF_CLK_SYSTICK_CONFIG\n#define CONF_CLK_SYSTICK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator SYSTICK source\n\n// <CLK_SRC_OPTION_MCKR\"> Master Clock Controller (PMC_MCKR)\n\n// <i> This defines the clock source for SYSTICK\n// <id> clk_gen_systick_oscillator\n#ifndef CONF_CLK_GEN_SYSTICK_SRC\n#define CONF_CLK_GEN_SYSTICK_SRC CLK_SRC_OPTION_MCKR\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Systick clock divider\n// <8=> 8\n// <i> Select systick clock divider\n// <id> systick_clock_div\n#ifndef CONF_SYSTICK_DIV\n#define CONF_SYSTICK_DIV 8\n#endif\n\n// </h>\n// </e>// <e> Clock_FCLK configuration\n// <i> Indicates whether FCLK configuration is enabled or not\n// <id> enable_clk_gen_fclk\n#ifndef CONF_CLK_FCLK_CONFIG\n#define CONF_CLK_FCLK_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator FCLK source\n\n// <CLK_SRC_OPTION_MCKR\"> Master Clock Controller (PMC_MCKR)\n\n// <i> This defines the clock source for FCLK\n// <id> clk_gen_fclk_oscillator\n#ifndef CONF_CLK_GEN_FCLK_SRC\n#define CONF_CLK_GEN_FCLK_SRC CLK_SRC_OPTION_MCKR\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>// <e> Clock_GCLK0 configuration\n// <i> Indicates whether GCLK0 configuration is enabled or not\n// <id> enable_clk_gen_gclk0\n#ifndef CONF_CLK_GCLK0_CONFIG\n#define CONF_CLK_GCLK0_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator GCLK0 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCK\"> USB 480M Clock (UPLLCK)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for GCLK0\n// <id> clk_gen_gclk0_oscillator\n#ifndef CONF_CLK_GEN_GCLK0_SRC\n#define CONF_CLK_GEN_GCLK0_SRC CLK_SRC_OPTION_MCK\n#endif\n\n// <q> Enable Clock_GCLK0\n// <i> Indicates whether GCLK0 is enabled or disable\n// <id> clk_gen_gclk0_arch_enable\n#ifndef CONF_CLK_GCLK0_ENABLE\n#define CONF_CLK_GCLK0_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n// <q> Enable GCLK0 GCLKEN\n// <i> Indicates whether GCLK0 GCLKEN is enabled or disable\n// <id> gclk0_gclken_enable\n#ifndef CONF_GCLK0_GCLKEN_ENABLE\n#define CONF_GCLK0_GCLKEN_ENABLE 0\n#endif\n\n// <o> Generic Clock GCLK0 divider <1-256>\n// <i> Select the clock divider (divider = GCLKDIV + 1).\n// <id> gclk0_div\n#ifndef CONF_GCLK0_DIV\n#define CONF_GCLK0_DIV 2\n#endif\n\n// </h>\n// </e>// <e> Clock_GCLK1 configuration\n// <i> Indicates whether GCLK1 configuration is enabled or not\n// <id> enable_clk_gen_gclk1\n#ifndef CONF_CLK_GCLK1_CONFIG\n#define CONF_CLK_GCLK1_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator GCLK1 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCK\"> USB 480M Clock (UPLLCK)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for GCLK1\n// <id> clk_gen_gclk1_oscillator\n#ifndef CONF_CLK_GEN_GCLK1_SRC\n#define CONF_CLK_GEN_GCLK1_SRC CLK_SRC_OPTION_PLLACK\n#endif\n\n// <q> Enable Clock_GCLK1\n// <i> Indicates whether GCLK1 is enabled or disable\n// <id> clk_gen_gclk1_arch_enable\n#ifndef CONF_CLK_GCLK1_ENABLE\n#define CONF_CLK_GCLK1_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n// <q> Enable GCLK1 GCLKEN\n// <i> Indicates whether GCLK1 GCLKEN is enabled or disable\n// <id> gclk1_gclken_enable\n#ifndef CONF_GCLK1_GCLKEN_ENABLE\n#define CONF_GCLK1_GCLKEN_ENABLE 0\n#endif\n\n// <o> Generic Clock GCLK1 divider <1-256>\n// <i> Select the clock divider (divider = GCLKDIV + 1).\n// <id> gclk1_div\n#ifndef CONF_GCLK1_DIV\n#define CONF_GCLK1_DIV 3\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK0 configuration\n// <i> Indicates whether PCK0 configuration is enabled or not\n// <id> enable_clk_gen_pck0\n#ifndef CONF_CLK_PCK0_CONFIG\n#define CONF_CLK_PCK0_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK0 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK0\n// <id> clk_gen_pck0_oscillator\n#ifndef CONF_CLK_GEN_PCK0_SRC\n#define CONF_CLK_GEN_PCK0_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK0\n// <i> Indicates whether PCK0 is enabled or disable\n// <id> clk_gen_pck0_arch_enable\n#ifndef CONF_CLK_PCK0_ENABLE\n#define CONF_CLK_PCK0_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck0_presc\n#ifndef CONF_PCK0_PRESC\n#define CONF_PCK0_PRESC 1\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK1 configuration\n// <i> Indicates whether PCK1 configuration is enabled or not\n// <id> enable_clk_gen_pck1\n#ifndef CONF_CLK_PCK1_CONFIG\n#define CONF_CLK_PCK1_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK1 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK1\n// <id> clk_gen_pck1_oscillator\n#ifndef CONF_CLK_GEN_PCK1_SRC\n#define CONF_CLK_GEN_PCK1_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK1\n// <i> Indicates whether PCK1 is enabled or disable\n// <id> clk_gen_pck1_arch_enable\n#ifndef CONF_CLK_PCK1_ENABLE\n#define CONF_CLK_PCK1_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck1_presc\n#ifndef CONF_PCK1_PRESC\n#define CONF_PCK1_PRESC 2\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK2 configuration\n// <i> Indicates whether PCK2 configuration is enabled or not\n// <id> enable_clk_gen_pck2\n#ifndef CONF_CLK_PCK2_CONFIG\n#define CONF_CLK_PCK2_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK2 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK2\n// <id> clk_gen_pck2_oscillator\n#ifndef CONF_CLK_GEN_PCK2_SRC\n#define CONF_CLK_GEN_PCK2_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK2\n// <i> Indicates whether PCK2 is enabled or disable\n// <id> clk_gen_pck2_arch_enable\n#ifndef CONF_CLK_PCK2_ENABLE\n#define CONF_CLK_PCK2_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck2_presc\n#ifndef CONF_PCK2_PRESC\n#define CONF_PCK2_PRESC 3\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK3 configuration\n// <i> Indicates whether PCK3 configuration is enabled or not\n// <id> enable_clk_gen_pck3\n#ifndef CONF_CLK_PCK3_CONFIG\n#define CONF_CLK_PCK3_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK3 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK3\n// <id> clk_gen_pck3_oscillator\n#ifndef CONF_CLK_GEN_PCK3_SRC\n#define CONF_CLK_GEN_PCK3_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK3\n// <i> Indicates whether PCK3 is enabled or disable\n// <id> clk_gen_pck3_arch_enable\n#ifndef CONF_CLK_PCK3_ENABLE\n#define CONF_CLK_PCK3_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck3_presc\n#ifndef CONF_PCK3_PRESC\n#define CONF_PCK3_PRESC 4\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK4 configuration\n// <i> Indicates whether PCK4 configuration is enabled or not\n// <id> enable_clk_gen_pck4\n#ifndef CONF_CLK_PCK4_CONFIG\n#define CONF_CLK_PCK4_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK4 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK4\n// <id> clk_gen_pck4_oscillator\n#ifndef CONF_CLK_GEN_PCK4_SRC\n#define CONF_CLK_GEN_PCK4_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK4\n// <i> Indicates whether PCK4 is enabled or disable\n// <id> clk_gen_pck4_arch_enable\n#ifndef CONF_CLK_PCK4_ENABLE\n#define CONF_CLK_PCK4_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck4_presc\n#ifndef CONF_PCK4_PRESC\n#define CONF_PCK4_PRESC 5\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK5 configuration\n// <i> Indicates whether PCK5 configuration is enabled or not\n// <id> enable_clk_gen_pck5\n#ifndef CONF_CLK_PCK5_CONFIG\n#define CONF_CLK_PCK5_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK5 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK5\n// <id> clk_gen_pck5_oscillator\n#ifndef CONF_CLK_GEN_PCK5_SRC\n#define CONF_CLK_GEN_PCK5_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK5\n// <i> Indicates whether PCK5 is enabled or disable\n// <id> clk_gen_pck5_arch_enable\n#ifndef CONF_CLK_PCK5_ENABLE\n#define CONF_CLK_PCK5_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck5_presc\n#ifndef CONF_PCK5_PRESC\n#define CONF_PCK5_PRESC 6\n#endif\n\n// </h>\n// </e>// <e> Clock_PCK6 configuration\n// <i> Indicates whether PCK6 configuration is enabled or not\n// <id> enable_clk_gen_pck6\n#ifndef CONF_CLK_PCK6_CONFIG\n#define CONF_CLK_PCK6_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator PCK6 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <CLK_SRC_OPTION_MAINCK\"> Main Clock (MAINCK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_MCK\"> Master Clock (MCK)\n\n// <i> This defines the clock source for PCK6\n// <id> clk_gen_pck6_oscillator\n#ifndef CONF_CLK_GEN_PCK6_SRC\n#define CONF_CLK_GEN_PCK6_SRC CLK_SRC_OPTION_MAINCK\n#endif\n\n// <q> Enable Clock_PCK6\n// <i> Indicates whether PCK6 is enabled or disable\n// <id> clk_gen_pck6_arch_enable\n#ifndef CONF_CLK_PCK6_ENABLE\n#define CONF_CLK_PCK6_ENABLE 0\n#endif\n\n// </h>\n\n// <h>\n\n// <o> Programmable Clock Controller Prescaler <1-256>\n// <i> Select the clock prescaler (prescaler = PRESC + 1).\n// <id> pck6_presc\n#ifndef CONF_PCK6_PRESC\n#define CONF_PCK6_PRESC 7\n#endif\n\n// </h>\n// </e>// <e> Clock_USB_480M configuration\n// <i> Indicates whether USB_480M configuration is enabled or not\n// <id> enable_clk_gen_usb_480m\n#ifndef CONF_CLK_USB_480M_CONFIG\n#define CONF_CLK_USB_480M_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator USB_480M source\n\n// <CLK_SRC_OPTION_UPLLCK\"> USB 480M Clock (UPLLCK)\n\n// <i> This defines the clock source for USB_480M\n// <id> clk_gen_usb_480m_oscillator\n#ifndef CONF_CLK_GEN_USB_480M_SRC\n#define CONF_CLK_GEN_USB_480M_SRC CLK_SRC_OPTION_UPLLCK\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>// <e> Clock_USB_48M configuration\n// <i> Indicates whether USB_48M configuration is enabled or not\n// <id> enable_clk_gen_usb_48m\n#ifndef CONF_CLK_USB_48M_CONFIG\n#define CONF_CLK_USB_48M_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator USB_48M source\n\n// <CLK_SRC_OPTION_PLLACK\"> PLLA Clock (PLLACK)\n\n// <CLK_SRC_OPTION_UPLLCKDIV\"> UDPLL with Divider (MCKR UPLLDIV2)\n\n// <i> This defines the clock source for USB_48M\n// <id> clk_gen_usb_48m_oscillator\n#ifndef CONF_CLK_GEN_USB_48M_SRC\n#define CONF_CLK_GEN_USB_48M_SRC CLK_SRC_OPTION_UPLLCKDIV\n#endif\n\n// <q> Enable Clock_USB_48M\n// <i> Indicates whether USB_48M is enabled or disable\n// <id> clk_gen_usb_48m_arch_enable\n#ifndef CONF_CLK_USB_48M_ENABLE\n#define CONF_CLK_USB_48M_ENABLE 1\n#endif\n\n// </h>\n\n// <h>\n\n// <o> USB Clock Controller Divider <1-16>\n// <i> Select the USB clock divider (divider = USBDIV + 1).\n// <id> usb_48m_div\n#ifndef CONF_USB_48M_DIV\n#define CONF_USB_48M_DIV 5\n#endif\n\n// </h>\n// </e>// <e> Clock_SLCK2 configuration\n// <i> Indicates whether SLCK2 configuration is enabled or not\n// <id> enable_clk_gen_slck2\n#ifndef CONF_CLK_SLCK2_CONFIG\n#define CONF_CLK_SLCK2_CONFIG 1\n#endif\n\n//<h> Clock Generator\n// <y> clock generator SLCK2 source\n\n// <CLK_SRC_OPTION_SLCK\"> Slow Clock (SLCK)\n\n// <i> This defines the clock source for SLCK2\n// <id> clk_gen_slck2_oscillator\n#ifndef CONF_CLK_GEN_SLCK2_SRC\n#define CONF_CLK_GEN_SLCK2_SRC CLK_SRC_OPTION_SLCK\n#endif\n\n// </h>\n\n// <h>\n\n// </h>\n// </e>\n\n// <e> System Configuration\n// <i> Indicates whether configuration for system is enabled or not\n// <id> enable_hclk_clock\n#ifndef CONF_SYSTEM_CONFIG\n#define CONF_SYSTEM_CONFIG 1\n#endif\n\n// <h> Processor Clock Settings\n// <y> Processor Clock source\n// <MCKR\"> Master Clock Controller (PMC_MCKR)\n// <i> This defines the clock source for the HCLK (Processor clock)\n// <id> hclk_clock_source\n#ifndef CONF_HCLK_SRC\n#define CONF_HCLK_SRC MCKR\n#endif\n\n// <o> Flash Wait State\n// <0=> 1 cycle\n// <1=> 2 cycles\n// <2=> 3 cycles\n// <3=> 4 cycles\n// <4=> 5 cycles\n// <5=> 6 cycles\n// <6=> 7 cycles\n// <i> This field defines the number of wait states for read and write operations.\n// <id> efc_fws\n#ifndef CONF_EFC_WAIT_STATE\n#define CONF_EFC_WAIT_STATE 5\n#endif\n\n// </h>\n// </e>\n\n// <e> SysTick Clock\n// <id> enable_systick_clk_clock\n#ifndef CONF_SYSTICK_CLK_CONFIG\n#define CONF_SYSTICK_CLK_CONFIG 1\n#endif\n\n// <y> SysTick Clock source\n// <MCKR\"> Master Clock Controller (PMC_MCKR)\n// <i> This defines the clock source for the SysTick Clock\n// <id> systick_clk_clock_source\n#ifndef CONF_SYSTICK_CLK_SRC\n#define CONF_SYSTICK_CLK_SRC MCKR\n#endif\n\n// <o> SysTick Clock Divider\n// <8=> 8\n// <i> Fixed to 8 if Systick is not using Processor clock\n// <id> systick_clk_clock_div\n#ifndef CONF_SYSTICK_CLK_DIV\n#define CONF_SYSTICK_CLK_DIV 8\n#endif\n\n// </e>\n\n// <e> OSC32K Oscillator Configuration\n// <i> Indicates whether configuration for OSC32K is enabled or not\n// <id> enable_osc32k\n#ifndef CONF_OSC32K_CONFIG\n#define CONF_OSC32K_CONFIG 1\n#endif\n\n// <h> OSC32K Oscillator Control\n// <q> OSC32K Oscillator Enable\n// <i> Indicates whether OSC32K Oscillator is enabled or not\n// <id> osc32k_arch_enable\n#ifndef CONF_OSC32K_ENABLE\n#define CONF_OSC32K_ENABLE 0\n#endif\n// </h>\n// </e>\n\n// <e> XOSC32K Oscillator Configuration\n// <i> Indicates whether configuration for XOSC32K is enabled or not\n// <id> enable_xosc32k\n#ifndef CONF_XOSC32K_CONFIG\n#define CONF_XOSC32K_CONFIG 0\n#endif\n\n// <h> XOSC32K Oscillator Control\n// <y> Oscillator Bypass Select\n// <CONF_XOSC32K_NO_BYPASS\"> The 32kHz crystal oscillator is not bypassed.\n// <CONF_XOSC32K_BYPASS\"> The 32kHz crystal oscillator is bypassed.\n// <i> Indicates whether XOSC32K is bypassed.\n// <id> xosc32k_bypass\n#ifndef CONF_XOSC32K\n#define CONF_XOSC32K CONF_XOSC32K_NO_BYPASS\n#endif\n\n// <q> XOSC32K Oscillator Enable\n// <i> Indicates whether XOSC32K Oscillator is enabled or not\n// <id> xosc32k_arch_enable\n#ifndef CONF_XOSC32K_ENABLE\n#define CONF_XOSC32K_ENABLE 0\n#endif\n// </h>\n// </e>\n\n// <e> OSC12M Oscillator Configuration\n// <i> Indicates whether configuration for OSC12M is enabled or not\n// <id> enable_osc12m\n#ifndef CONF_OSC12M_CONFIG\n#define CONF_OSC12M_CONFIG 0\n#endif\n\n// <h> OSC12M Oscillator Control\n// <q> OSC12M Oscillator Enable\n// <i> Indicates whether OSC12M Oscillator is enabled or not.\n// <id> osc12m_arch_enable\n#ifndef CONF_OSC12M_ENABLE\n#define CONF_OSC12M_ENABLE 0\n#endif\n\n// <o> OSC12M selector\n//  <0=> 4000000\n//  <1=> 8000000\n//  <2=> 12000000\n// <i> Select the frequency of embedded fast RC oscillator.\n// <id> osc12m_selector\n#ifndef CONF_OSC12M_SELECTOR\n#define CONF_OSC12M_SELECTOR 2\n#endif\n// </h>\n// </e>\n\n// <e> XOSC20M Oscillator Configuration\n// <i> Indicates whether configuration for XOSC20M is enabled or not.\n// <id> enable_xosc20m\n#ifndef CONF_XOSC20M_CONFIG\n#define CONF_XOSC20M_CONFIG 1\n#endif\n\n// <h> XOSC20M Oscillator Control\n// <o> XOSC20M selector <3000000-20000000>\n// <i> Select the frequency of crystal or ceramic resonator oscillator.\n// <id> xosc20m_selector\n#ifndef CONF_XOSC20M_SELECTOR\n#define CONF_XOSC20M_SELECTOR 12000000\n#endif\n\n// <o> Start up time for the external oscillator (ms): <0-256>\n// <i> Select start-up time.\n// <id> xosc20m_startup_time\n#ifndef CONF_XOSC20M_STARTUP_TIME\n#define CONF_XOSC20M_STARTUP_TIME 62\n#endif\n\n// <y> Oscillator Bypass Select\n// <CONF_XOSC20M_NO_BYPASS\"> The external crystal oscillator is not bypassed.\n// <CONF_XOSC20M_BYPASS\"> The external crystal oscillator is bypassed.\n// <i> Indicates whether XOSC20M is bypassed.\n// <id> xosc20m_bypass\n#ifndef CONF_XOSC20M\n#define CONF_XOSC20M CONF_XOSC20M_NO_BYPASS\n#endif\n\n// <q> XOSC20M Oscillator Enable\n// <i> Indicates whether XOSC20M Oscillator is enabled or not\n// <id> xosc20m_arch_enable\n#ifndef CONF_XOSC20M_ENABLE\n#define CONF_XOSC20M_ENABLE 1\n#endif\n// </h>\n// </e>\n\n// <e> PLLACK Oscillator Configuration\n// <i> Indicates whether configuration for PLLACK is enabled or not\n// <id> enable_pllack\n#ifndef CONF_PLLACK_CONFIG\n#define CONF_PLLACK_CONFIG 1\n#endif\n\n// <y> PLLACK Reference Clock Source\n// <MAINCK\"> Main Clock (MAINCK)\n// <i> Select the clock source.\n// <id> pllack_ref_clock\n#ifndef CONF_PLLACK_CLK\n#define CONF_PLLACK_CLK MAINCK\n#endif\n\n// <h> PLLACK Oscillator Control\n// <q> PLLACK Oscillator Enable\n// <i> Indicates whether PLLACK Oscillator is enabled or not\n// <id> pllack_arch_enable\n#ifndef CONF_PLLACK_ENABLE\n#define CONF_PLLACK_ENABLE 1\n#endif\n\n// <o> PLLA Frontend Divider (DIVA)  <1-255>\n// <i> Select the clock divider\n// <id> pllack_div\n#ifndef CONF_PLLACK_DIV\n#define CONF_PLLACK_DIV 1\n#endif\n\n// <o> PLLACK Muliplier <1-62>\n// <i> Indicates PLLA multiplier (multiplier = MULA + 1).\n// <id> pllack_mul\n#ifndef CONF_PLLACK_MUL\n#define CONF_PLLACK_MUL 25\n#endif\n// </h>\n// </e>\n\n// <e> UPLLCK Oscillator Configuration\n// <i> Indicates whether configuration for UPLLCK is enabled or not\n// <id> enable_upllck\n#ifndef CONF_UPLLCK_CONFIG\n#define CONF_UPLLCK_CONFIG 1\n#endif\n\n// <y> UPLLCK Reference Clock Source\n// <XOSC20M\"> External 3-20MHz Oscillator (XOSC20M)\n// <i> Select the clock source,only when the input frequency is 12M or 16M, the upllck output is 480M.\n// <id> upllck_ref_clock\n#ifndef CONF_UPLLCK_CLK\n#define CONF_UPLLCK_CLK XOSC20M\n#endif\n\n// <h> UPLLCK Oscillator Control\n// <q> UPLLCK Oscillator Enable\n// <i> Indicates whether UPLLCK Oscillator is enabled or not\n// <id> upllck_arch_enable\n#ifndef CONF_UPLLCK_ENABLE\n#define CONF_UPLLCK_ENABLE 1\n#endif\n// </h>\n// </e>\n\n// <e> UPLLCKDIV Oscillator Configuration\n// <i> Indicates whether configuration for UPLLCKDIV is enabled or not\n// <id> enable_upllckdiv\n#ifndef CONF_UPLLCKDIV_CONFIG\n#define CONF_UPLLCKDIV_CONFIG 1\n#endif\n\n// <y> UPLLCKDIV Reference Clock Source\n// <UPLLCK\"> USB 480M Clock (UPLLCK)\n// <i> Select the clock source.\n// <id> upllckdiv_ref_clock\n#ifndef CONF_UPLLCKDIV_CLK\n#define CONF_UPLLCKDIV_CLK UPLLCK\n#endif\n\n// <h> UPLLCKDIV Oscillator Control\n// <o> UPLLCKDIV Clock Divider\n// <0=> 1\n// <1=> 2\n// <i> Select the clock divider.\n// <id> upllckdiv_div\n#ifndef CONF_UPLLCKDIV_DIV\n#define CONF_UPLLCKDIV_DIV 1\n#endif\n// </h>\n// </e>\n\n// <e> MCK/8\n// <id> enable_mck_div_8\n#ifndef CONF_MCK_DIV_8_CONFIG\n#define CONF_MCK_DIV_8_CONFIG 0\n#endif\n\n// <o> MCK/8 Source\n// <0=> Master Clock (MCK)\n// <id> mck_div_8_src\n#ifndef CONF_MCK_DIV_8_SRC\n#define CONF_MCK_DIV_8_SRC 0\n#endif\n// </e>\n\n// <e> External Clock Input Configuration\n// <id> enable_dummy_ext\n#ifndef CONF_DUMMY_EXT_CONFIG\n#define CONF_DUMMY_EXT_CONFIG 1\n#endif\n\n// <o> External Clock Input Source\n// <i> All here are dummy values\n// <i> Refer to the peripherals settings for actual input information\n// <0=> Specific clock input from specific pin\n// <id> dummy_ext_src\n#ifndef CONF_DUMMY_EXT_SRC\n#define CONF_DUMMY_EXT_SRC 0\n#endif\n// </e>\n\n// <e> External Clock Configuration\n// <id> enable_dummy_ext_clk\n#ifndef CONF_DUMMY_EXT_CLK_CONFIG\n#define CONF_DUMMY_EXT_CLK_CONFIG 1\n#endif\n\n// <o> External Clock Source\n// <i> All here are dummy values\n// <i> Refer to the peripherals settings for actual input information\n// <0=> External Clock Input\n// <id> dummy_ext_clk_src\n#ifndef CONF_DUMMY_EXT_CLK_SRC\n#define CONF_DUMMY_EXT_CLK_SRC 0\n#endif\n// </e>\n\n// <<< end of configuration section >>>\n\n#endif // HPL_PMC_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_xplained/hpl_usart_config.h",
    "content": "/* Auto-generated config file hpl_usart_config.h */\n#ifndef HPL_USART_CONFIG_H\n#define HPL_USART_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n#include <peripheral_clk_config.h>\n\n#ifndef CONF_USART_1_ENABLE\n#define CONF_USART_1_ENABLE 1\n#endif\n\n// <h> Basic Configuration\n\n// <o> Frame parity\n// <0x0=>Even parity\n// <0x1=>Odd parity\n// <0x2=>Parity forced to 0\n// <0x3=>Parity forced to 1\n// <0x4=>No parity\n// <i> Parity bit mode for USART frame\n// <id> usart_parity\n#ifndef CONF_USART_1_PARITY\n#define CONF_USART_1_PARITY 0x4\n#endif\n\n// <o> Character Size\n// <0x0=>5 bits\n// <0x1=>6 bits\n// <0x2=>7 bits\n// <0x3=>8 bits\n// <i> Data character size in USART frame\n// <id> usart_character_size\n#ifndef CONF_USART_1_CHSIZE\n#define CONF_USART_1_CHSIZE 0x3\n#endif\n\n// <o> Stop Bit\n// <0=>1 stop bit\n// <1=>1.5 stop bits\n// <2=>2 stop bits\n// <i> Number of stop bits in USART frame\n// <id> usart_stop_bit\n#ifndef CONF_USART_1_SBMODE\n#define CONF_USART_1_SBMODE 0\n#endif\n\n// <o> Clock Output Select\n// <0=>The USART does not drive the SCK pin\n// <1=>The USART drives the SCK pin if USCLKS does not select the external clock SCK\n// <i> Clock Output Select in USART sck, if in usrt master mode, please drive SCK.\n// <id> usart_clock_output_select\n#ifndef CONF_USART_1_CLKO\n#define CONF_USART_1_CLKO 0\n#endif\n\n// <o> Baud rate <1-3000000>\n// <i> USART baud rate setting\n// <id> usart_baud_rate\n#ifndef CONF_USART_1_BAUD\n#define CONF_USART_1_BAUD 9600\n#endif\n\n// </h>\n\n// <e> Advanced configuration\n// <id> usart_advanced\n#ifndef CONF_USART_1_ADVANCED_CONFIG\n#define CONF_USART_1_ADVANCED_CONFIG 0\n#endif\n\n// <o> Channel Mode\n// <0=>Normal Mode\n// <1=>Automatic Echo\n// <2=>Local Loopback\n// <3=>Remote Loopback\n// <i> Channel mode in USART frame\n// <id> usart_channel_mode\n#ifndef CONF_USART_1_CHMODE\n#define CONF_USART_1_CHMODE 0\n#endif\n\n// <q> 9 bits character enable\n// <i> Enable 9 bits character, this has high priority than 5/6/7/8 bits.\n// <id> usart_9bits_enable\n#ifndef CONF_USART_1_MODE9\n#define CONF_USART_1_MODE9 0\n#endif\n\n// <o> Variable Sync\n// <0=>User defined configuration\n// <1=>sync field is updated when a character is written into US_THR\n// <i> Variable Synchronization of Command/Data Sync Start Frarm Delimiter\n// <id> variable_sync\n#ifndef CONF_USART_1_VAR_SYNC\n#define CONF_USART_1_VAR_SYNC 0\n#endif\n\n// <o> Oversampling Mode\n// <0=>16 Oversampling\n// <1=>8 Oversampling\n// <i> Oversampling Mode in UART mode\n// <id> usart__oversampling_mode\n#ifndef CONF_USART_1_OVER\n#define CONF_USART_1_OVER 0\n#endif\n\n// <o> Inhibit Non Ack\n// <0=>The NACK is generated\n// <1=>The NACK is not generated\n// <i> Inhibit Non Acknowledge\n// <id> usart__inack\n#ifndef CONF_USART_1_INACK\n#define CONF_USART_1_INACK 1\n#endif\n\n// <o> Disable Successive NACK\n// <0=>NACK is sent on the ISO line as soon as a parity error occurs\n// <1=>Many parity errors generate a NACK on the ISO line\n// <i> Disable Successive NACK\n// <id> usart_dsnack\n#ifndef CONF_USART_1_DSNACK\n#define CONF_USART_1_DSNACK 0\n#endif\n\n// <o> Inverted Data\n// <0=>Data isn't inverted, nomal mode\n// <1=>Data is inverted\n// <i> Inverted Data\n// <id> usart_invdata\n#ifndef CONF_USART_1_INVDATA\n#define CONF_USART_1_INVDATA 0\n#endif\n\n// <o> Maximum Number of Automatic Iteration <0-7>\n// <i> Defines the maximum number of iterations in mode ISO7816, protocol T = 0.\n// <id> usart_max_iteration\n#ifndef CONF_USART_1_MAX_ITERATION\n#define CONF_USART_1_MAX_ITERATION 0\n#endif\n\n// <q> Receive Line Filter enable\n// <i> whether the USART filters the receive line using a three-sample filter\n// <id> usart_receive_filter_enable\n#ifndef CONF_USART_1_FILTER\n#define CONF_USART_1_FILTER 0\n#endif\n\n// <q> Manchester Encoder/Decoder Enable\n// <i> whether the USART Manchester Encoder/Decoder\n// <id> usart_manchester_filter_enable\n#ifndef CONF_USART_1_MAN\n#define CONF_USART_1_MAN 0\n#endif\n\n// <o> Manchester Synchronization Mode\n// <0=>The Manchester start bit is a 0 to 1 transition\n// <1=>The Manchester start bit is a 1 to 0 transition\n// <i> Manchester Synchronization Mode\n// <id> usart_manchester_synchronization_mode\n#ifndef CONF_USART_1_MODSYNC\n#define CONF_USART_1_MODSYNC 0\n#endif\n\n// <o> Start Frame Delimiter Selector\n// <0=>Start frame delimiter is COMMAND or DATA SYNC\n// <1=>Start frame delimiter is one bit\n// <i> Start Frame Delimiter Selector\n// <id> usart_start_frame_delimiter\n#ifndef CONF_USART_1_ONEBIT\n#define CONF_USART_1_ONEBIT 0\n#endif\n\n// <o> Fractional Part <0-7>\n// <i> Fractional part of the baud rate if baud rate generator is in fractional mode\n// <id> usart_arch_fractional\n#ifndef CONF_USART_1_FRACTIONAL\n#define CONF_USART_1_FRACTIONAL 0x0\n#endif\n\n// <o> Data Order\n// <0=>LSB is transmitted first\n// <1=>MSB is transmitted first\n// <i> Data order of the data bits in the frame\n// <id> usart_arch_msbf\n#ifndef CONF_USART_1_MSBF\n#define CONF_USART_1_MSBF 0\n#endif\n\n// </e>\n\n#define CONF_USART_1_MODE 0x0\n\n// Calculate BAUD register value in UART mode\n#if CONF_USART1_CK_SRC < 3\n#ifndef CONF_USART_1_BAUD_CD\n#define CONF_USART_1_BAUD_CD ((CONF_USART1_FREQUENCY) / CONF_USART_1_BAUD / 8 / (2 - CONF_USART_1_OVER))\n#endif\n#ifndef CONF_USART_1_BAUD_FP\n#define CONF_USART_1_BAUD_FP                                                                                           \\\n\t((CONF_USART1_FREQUENCY) / CONF_USART_1_BAUD / (2 - CONF_USART_1_OVER) - 8 * CONF_USART_1_BAUD_CD)\n#endif\n#elif CONF_USART1_CK_SRC == 3\n// No division is active. The value written in US_BRGR has no effect.\n#ifndef CONF_USART_1_BAUD_CD\n#define CONF_USART_1_BAUD_CD 1\n#endif\n#ifndef CONF_USART_1_BAUD_FP\n#define CONF_USART_1_BAUD_FP 1\n#endif\n#endif\n\n// <<< end of configuration section >>>\n\n#endif // HPL_USART_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_xplained/hpl_xdmac_config.h",
    "content": "/* Auto-generated config file hpl_xdmac_config.h */\n#ifndef HPL_XDMAC_CONFIG_H\n#define HPL_XDMAC_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n// <e> XDMAC enable\n// <i> Indicates whether xdmac is enabled or not\n// <id> xdmac_enable\n#ifndef CONF_DMA_ENABLE\n#define CONF_DMA_ENABLE 0\n#endif\n\n// <e> Channel 0 settings\n// <id> dmac_channel_0_settings\n#ifndef CONF_DMAC_CHANNEL_0_SETTINGS\n#define CONF_DMAC_CHANNEL_0_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_0\n#ifndef CONF_DMAC_BURSTSIZE_0\n#define CONF_DMAC_BURSTSIZE_0 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_0\n#ifndef CONF_DMAC_CHUNKSIZE_0\n#define CONF_DMAC_CHUNKSIZE_0 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_0\n#ifndef CONF_DMAC_BEATSIZE_0\n#define CONF_DMAC_BEATSIZE_0 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_0\n#ifndef CONF_DMAC_SRC_INTERFACE_0\n#define CONF_DMAC_SRC_INTERFACE_0 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_0\n#ifndef CONF_DMAC_DES_INTERFACE_0\n#define CONF_DMAC_DES_INTERFACE_0 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_0\n#ifndef CONF_DMAC_SRCINC_0\n#define CONF_DMAC_SRCINC_0 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_0\n#ifndef CONF_DMAC_DSTINC_0\n#define CONF_DMAC_DSTINC_0 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_0\n#ifndef CONF_DMAC_TRANS_TYPE_0\n#define CONF_DMAC_TRANS_TYPE_0 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_0\n#ifndef CONF_DMAC_TRIGSRC_0\n#define CONF_DMAC_TRIGSRC_0 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_0 == 0\n#define CONF_DMAC_TYPE_0 0\n#define CONF_DMAC_DSYNC_0 0\n#elif CONF_DMAC_TRANS_TYPE_0 == 1\n#define CONF_DMAC_TYPE_0 1\n#define CONF_DMAC_DSYNC_0 0\n#elif CONF_DMAC_TRANS_TYPE_0 == 2\n#define CONF_DMAC_TYPE_0 1\n#define CONF_DMAC_DSYNC_0 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_0 == 0xFF\n#define CONF_DMAC_SWREQ_0 1\n#else\n#define CONF_DMAC_SWREQ_0 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_0_SETTINGS == 1 && CONF_DMAC_BEATSIZE_0 != 2 && ((!CONF_DMAC_SRCINC_0) || (!CONF_DMAC_DSTINC_0)))\n#if (!CONF_DMAC_SRCINC_0)\n#define CONF_DMAC_SRC_STRIDE_0 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_0)\n#define CONF_DMAC_DES_STRIDE_0 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_0\n#define CONF_DMAC_SRC_STRIDE_0 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_0\n#define CONF_DMAC_DES_STRIDE_0 0\n#endif\n\n// <e> Channel 1 settings\n// <id> dmac_channel_1_settings\n#ifndef CONF_DMAC_CHANNEL_1_SETTINGS\n#define CONF_DMAC_CHANNEL_1_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_1\n#ifndef CONF_DMAC_BURSTSIZE_1\n#define CONF_DMAC_BURSTSIZE_1 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_1\n#ifndef CONF_DMAC_CHUNKSIZE_1\n#define CONF_DMAC_CHUNKSIZE_1 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_1\n#ifndef CONF_DMAC_BEATSIZE_1\n#define CONF_DMAC_BEATSIZE_1 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_1\n#ifndef CONF_DMAC_SRC_INTERFACE_1\n#define CONF_DMAC_SRC_INTERFACE_1 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_1\n#ifndef CONF_DMAC_DES_INTERFACE_1\n#define CONF_DMAC_DES_INTERFACE_1 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_1\n#ifndef CONF_DMAC_SRCINC_1\n#define CONF_DMAC_SRCINC_1 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_1\n#ifndef CONF_DMAC_DSTINC_1\n#define CONF_DMAC_DSTINC_1 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_1\n#ifndef CONF_DMAC_TRANS_TYPE_1\n#define CONF_DMAC_TRANS_TYPE_1 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_1\n#ifndef CONF_DMAC_TRIGSRC_1\n#define CONF_DMAC_TRIGSRC_1 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_1 == 0\n#define CONF_DMAC_TYPE_1 0\n#define CONF_DMAC_DSYNC_1 0\n#elif CONF_DMAC_TRANS_TYPE_1 == 1\n#define CONF_DMAC_TYPE_1 1\n#define CONF_DMAC_DSYNC_1 0\n#elif CONF_DMAC_TRANS_TYPE_1 == 2\n#define CONF_DMAC_TYPE_1 1\n#define CONF_DMAC_DSYNC_1 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_1 == 0xFF\n#define CONF_DMAC_SWREQ_1 1\n#else\n#define CONF_DMAC_SWREQ_1 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_1_SETTINGS == 1 && CONF_DMAC_BEATSIZE_1 != 2 && ((!CONF_DMAC_SRCINC_1) || (!CONF_DMAC_DSTINC_1)))\n#if (!CONF_DMAC_SRCINC_1)\n#define CONF_DMAC_SRC_STRIDE_1 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_1)\n#define CONF_DMAC_DES_STRIDE_1 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_1\n#define CONF_DMAC_SRC_STRIDE_1 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_1\n#define CONF_DMAC_DES_STRIDE_1 0\n#endif\n\n// <e> Channel 2 settings\n// <id> dmac_channel_2_settings\n#ifndef CONF_DMAC_CHANNEL_2_SETTINGS\n#define CONF_DMAC_CHANNEL_2_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_2\n#ifndef CONF_DMAC_BURSTSIZE_2\n#define CONF_DMAC_BURSTSIZE_2 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_2\n#ifndef CONF_DMAC_CHUNKSIZE_2\n#define CONF_DMAC_CHUNKSIZE_2 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_2\n#ifndef CONF_DMAC_BEATSIZE_2\n#define CONF_DMAC_BEATSIZE_2 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_2\n#ifndef CONF_DMAC_SRC_INTERFACE_2\n#define CONF_DMAC_SRC_INTERFACE_2 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_2\n#ifndef CONF_DMAC_DES_INTERFACE_2\n#define CONF_DMAC_DES_INTERFACE_2 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_2\n#ifndef CONF_DMAC_SRCINC_2\n#define CONF_DMAC_SRCINC_2 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_2\n#ifndef CONF_DMAC_DSTINC_2\n#define CONF_DMAC_DSTINC_2 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_2\n#ifndef CONF_DMAC_TRANS_TYPE_2\n#define CONF_DMAC_TRANS_TYPE_2 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_2\n#ifndef CONF_DMAC_TRIGSRC_2\n#define CONF_DMAC_TRIGSRC_2 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_2 == 0\n#define CONF_DMAC_TYPE_2 0\n#define CONF_DMAC_DSYNC_2 0\n#elif CONF_DMAC_TRANS_TYPE_2 == 1\n#define CONF_DMAC_TYPE_2 1\n#define CONF_DMAC_DSYNC_2 0\n#elif CONF_DMAC_TRANS_TYPE_2 == 2\n#define CONF_DMAC_TYPE_2 1\n#define CONF_DMAC_DSYNC_2 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_2 == 0xFF\n#define CONF_DMAC_SWREQ_2 1\n#else\n#define CONF_DMAC_SWREQ_2 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_2_SETTINGS == 1 && CONF_DMAC_BEATSIZE_2 != 2 && ((!CONF_DMAC_SRCINC_2) || (!CONF_DMAC_DSTINC_2)))\n#if (!CONF_DMAC_SRCINC_2)\n#define CONF_DMAC_SRC_STRIDE_2 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_2)\n#define CONF_DMAC_DES_STRIDE_2 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_2\n#define CONF_DMAC_SRC_STRIDE_2 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_2\n#define CONF_DMAC_DES_STRIDE_2 0\n#endif\n\n// <e> Channel 3 settings\n// <id> dmac_channel_3_settings\n#ifndef CONF_DMAC_CHANNEL_3_SETTINGS\n#define CONF_DMAC_CHANNEL_3_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_3\n#ifndef CONF_DMAC_BURSTSIZE_3\n#define CONF_DMAC_BURSTSIZE_3 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_3\n#ifndef CONF_DMAC_CHUNKSIZE_3\n#define CONF_DMAC_CHUNKSIZE_3 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_3\n#ifndef CONF_DMAC_BEATSIZE_3\n#define CONF_DMAC_BEATSIZE_3 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_3\n#ifndef CONF_DMAC_SRC_INTERFACE_3\n#define CONF_DMAC_SRC_INTERFACE_3 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_3\n#ifndef CONF_DMAC_DES_INTERFACE_3\n#define CONF_DMAC_DES_INTERFACE_3 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_3\n#ifndef CONF_DMAC_SRCINC_3\n#define CONF_DMAC_SRCINC_3 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_3\n#ifndef CONF_DMAC_DSTINC_3\n#define CONF_DMAC_DSTINC_3 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_3\n#ifndef CONF_DMAC_TRANS_TYPE_3\n#define CONF_DMAC_TRANS_TYPE_3 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_3\n#ifndef CONF_DMAC_TRIGSRC_3\n#define CONF_DMAC_TRIGSRC_3 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_3 == 0\n#define CONF_DMAC_TYPE_3 0\n#define CONF_DMAC_DSYNC_3 0\n#elif CONF_DMAC_TRANS_TYPE_3 == 1\n#define CONF_DMAC_TYPE_3 1\n#define CONF_DMAC_DSYNC_3 0\n#elif CONF_DMAC_TRANS_TYPE_3 == 2\n#define CONF_DMAC_TYPE_3 1\n#define CONF_DMAC_DSYNC_3 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_3 == 0xFF\n#define CONF_DMAC_SWREQ_3 1\n#else\n#define CONF_DMAC_SWREQ_3 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_3_SETTINGS == 1 && CONF_DMAC_BEATSIZE_3 != 2 && ((!CONF_DMAC_SRCINC_3) || (!CONF_DMAC_DSTINC_3)))\n#if (!CONF_DMAC_SRCINC_3)\n#define CONF_DMAC_SRC_STRIDE_3 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_3)\n#define CONF_DMAC_DES_STRIDE_3 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_3\n#define CONF_DMAC_SRC_STRIDE_3 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_3\n#define CONF_DMAC_DES_STRIDE_3 0\n#endif\n\n// <e> Channel 4 settings\n// <id> dmac_channel_4_settings\n#ifndef CONF_DMAC_CHANNEL_4_SETTINGS\n#define CONF_DMAC_CHANNEL_4_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_4\n#ifndef CONF_DMAC_BURSTSIZE_4\n#define CONF_DMAC_BURSTSIZE_4 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_4\n#ifndef CONF_DMAC_CHUNKSIZE_4\n#define CONF_DMAC_CHUNKSIZE_4 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_4\n#ifndef CONF_DMAC_BEATSIZE_4\n#define CONF_DMAC_BEATSIZE_4 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_4\n#ifndef CONF_DMAC_SRC_INTERFACE_4\n#define CONF_DMAC_SRC_INTERFACE_4 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_4\n#ifndef CONF_DMAC_DES_INTERFACE_4\n#define CONF_DMAC_DES_INTERFACE_4 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_4\n#ifndef CONF_DMAC_SRCINC_4\n#define CONF_DMAC_SRCINC_4 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_4\n#ifndef CONF_DMAC_DSTINC_4\n#define CONF_DMAC_DSTINC_4 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_4\n#ifndef CONF_DMAC_TRANS_TYPE_4\n#define CONF_DMAC_TRANS_TYPE_4 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_4\n#ifndef CONF_DMAC_TRIGSRC_4\n#define CONF_DMAC_TRIGSRC_4 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_4 == 0\n#define CONF_DMAC_TYPE_4 0\n#define CONF_DMAC_DSYNC_4 0\n#elif CONF_DMAC_TRANS_TYPE_4 == 1\n#define CONF_DMAC_TYPE_4 1\n#define CONF_DMAC_DSYNC_4 0\n#elif CONF_DMAC_TRANS_TYPE_4 == 2\n#define CONF_DMAC_TYPE_4 1\n#define CONF_DMAC_DSYNC_4 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_4 == 0xFF\n#define CONF_DMAC_SWREQ_4 1\n#else\n#define CONF_DMAC_SWREQ_4 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_4_SETTINGS == 1 && CONF_DMAC_BEATSIZE_4 != 2 && ((!CONF_DMAC_SRCINC_4) || (!CONF_DMAC_DSTINC_4)))\n#if (!CONF_DMAC_SRCINC_4)\n#define CONF_DMAC_SRC_STRIDE_4 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_4)\n#define CONF_DMAC_DES_STRIDE_4 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_4\n#define CONF_DMAC_SRC_STRIDE_4 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_4\n#define CONF_DMAC_DES_STRIDE_4 0\n#endif\n\n// <e> Channel 5 settings\n// <id> dmac_channel_5_settings\n#ifndef CONF_DMAC_CHANNEL_5_SETTINGS\n#define CONF_DMAC_CHANNEL_5_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_5\n#ifndef CONF_DMAC_BURSTSIZE_5\n#define CONF_DMAC_BURSTSIZE_5 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_5\n#ifndef CONF_DMAC_CHUNKSIZE_5\n#define CONF_DMAC_CHUNKSIZE_5 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_5\n#ifndef CONF_DMAC_BEATSIZE_5\n#define CONF_DMAC_BEATSIZE_5 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_5\n#ifndef CONF_DMAC_SRC_INTERFACE_5\n#define CONF_DMAC_SRC_INTERFACE_5 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_5\n#ifndef CONF_DMAC_DES_INTERFACE_5\n#define CONF_DMAC_DES_INTERFACE_5 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_5\n#ifndef CONF_DMAC_SRCINC_5\n#define CONF_DMAC_SRCINC_5 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_5\n#ifndef CONF_DMAC_DSTINC_5\n#define CONF_DMAC_DSTINC_5 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_5\n#ifndef CONF_DMAC_TRANS_TYPE_5\n#define CONF_DMAC_TRANS_TYPE_5 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_5\n#ifndef CONF_DMAC_TRIGSRC_5\n#define CONF_DMAC_TRIGSRC_5 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_5 == 0\n#define CONF_DMAC_TYPE_5 0\n#define CONF_DMAC_DSYNC_5 0\n#elif CONF_DMAC_TRANS_TYPE_5 == 1\n#define CONF_DMAC_TYPE_5 1\n#define CONF_DMAC_DSYNC_5 0\n#elif CONF_DMAC_TRANS_TYPE_5 == 2\n#define CONF_DMAC_TYPE_5 1\n#define CONF_DMAC_DSYNC_5 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_5 == 0xFF\n#define CONF_DMAC_SWREQ_5 1\n#else\n#define CONF_DMAC_SWREQ_5 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_5_SETTINGS == 1 && CONF_DMAC_BEATSIZE_5 != 2 && ((!CONF_DMAC_SRCINC_5) || (!CONF_DMAC_DSTINC_5)))\n#if (!CONF_DMAC_SRCINC_5)\n#define CONF_DMAC_SRC_STRIDE_5 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_5)\n#define CONF_DMAC_DES_STRIDE_5 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_5\n#define CONF_DMAC_SRC_STRIDE_5 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_5\n#define CONF_DMAC_DES_STRIDE_5 0\n#endif\n\n// <e> Channel 6 settings\n// <id> dmac_channel_6_settings\n#ifndef CONF_DMAC_CHANNEL_6_SETTINGS\n#define CONF_DMAC_CHANNEL_6_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_6\n#ifndef CONF_DMAC_BURSTSIZE_6\n#define CONF_DMAC_BURSTSIZE_6 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_6\n#ifndef CONF_DMAC_CHUNKSIZE_6\n#define CONF_DMAC_CHUNKSIZE_6 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_6\n#ifndef CONF_DMAC_BEATSIZE_6\n#define CONF_DMAC_BEATSIZE_6 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_6\n#ifndef CONF_DMAC_SRC_INTERFACE_6\n#define CONF_DMAC_SRC_INTERFACE_6 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_6\n#ifndef CONF_DMAC_DES_INTERFACE_6\n#define CONF_DMAC_DES_INTERFACE_6 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_6\n#ifndef CONF_DMAC_SRCINC_6\n#define CONF_DMAC_SRCINC_6 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_6\n#ifndef CONF_DMAC_DSTINC_6\n#define CONF_DMAC_DSTINC_6 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_6\n#ifndef CONF_DMAC_TRANS_TYPE_6\n#define CONF_DMAC_TRANS_TYPE_6 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_6\n#ifndef CONF_DMAC_TRIGSRC_6\n#define CONF_DMAC_TRIGSRC_6 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_6 == 0\n#define CONF_DMAC_TYPE_6 0\n#define CONF_DMAC_DSYNC_6 0\n#elif CONF_DMAC_TRANS_TYPE_6 == 1\n#define CONF_DMAC_TYPE_6 1\n#define CONF_DMAC_DSYNC_6 0\n#elif CONF_DMAC_TRANS_TYPE_6 == 2\n#define CONF_DMAC_TYPE_6 1\n#define CONF_DMAC_DSYNC_6 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_6 == 0xFF\n#define CONF_DMAC_SWREQ_6 1\n#else\n#define CONF_DMAC_SWREQ_6 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_6_SETTINGS == 1 && CONF_DMAC_BEATSIZE_6 != 2 && ((!CONF_DMAC_SRCINC_6) || (!CONF_DMAC_DSTINC_6)))\n#if (!CONF_DMAC_SRCINC_6)\n#define CONF_DMAC_SRC_STRIDE_6 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_6)\n#define CONF_DMAC_DES_STRIDE_6 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_6\n#define CONF_DMAC_SRC_STRIDE_6 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_6\n#define CONF_DMAC_DES_STRIDE_6 0\n#endif\n\n// <e> Channel 7 settings\n// <id> dmac_channel_7_settings\n#ifndef CONF_DMAC_CHANNEL_7_SETTINGS\n#define CONF_DMAC_CHANNEL_7_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_7\n#ifndef CONF_DMAC_BURSTSIZE_7\n#define CONF_DMAC_BURSTSIZE_7 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_7\n#ifndef CONF_DMAC_CHUNKSIZE_7\n#define CONF_DMAC_CHUNKSIZE_7 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_7\n#ifndef CONF_DMAC_BEATSIZE_7\n#define CONF_DMAC_BEATSIZE_7 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_7\n#ifndef CONF_DMAC_SRC_INTERFACE_7\n#define CONF_DMAC_SRC_INTERFACE_7 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_7\n#ifndef CONF_DMAC_DES_INTERFACE_7\n#define CONF_DMAC_DES_INTERFACE_7 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_7\n#ifndef CONF_DMAC_SRCINC_7\n#define CONF_DMAC_SRCINC_7 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_7\n#ifndef CONF_DMAC_DSTINC_7\n#define CONF_DMAC_DSTINC_7 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_7\n#ifndef CONF_DMAC_TRANS_TYPE_7\n#define CONF_DMAC_TRANS_TYPE_7 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_7\n#ifndef CONF_DMAC_TRIGSRC_7\n#define CONF_DMAC_TRIGSRC_7 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_7 == 0\n#define CONF_DMAC_TYPE_7 0\n#define CONF_DMAC_DSYNC_7 0\n#elif CONF_DMAC_TRANS_TYPE_7 == 1\n#define CONF_DMAC_TYPE_7 1\n#define CONF_DMAC_DSYNC_7 0\n#elif CONF_DMAC_TRANS_TYPE_7 == 2\n#define CONF_DMAC_TYPE_7 1\n#define CONF_DMAC_DSYNC_7 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_7 == 0xFF\n#define CONF_DMAC_SWREQ_7 1\n#else\n#define CONF_DMAC_SWREQ_7 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_7_SETTINGS == 1 && CONF_DMAC_BEATSIZE_7 != 2 && ((!CONF_DMAC_SRCINC_7) || (!CONF_DMAC_DSTINC_7)))\n#if (!CONF_DMAC_SRCINC_7)\n#define CONF_DMAC_SRC_STRIDE_7 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_7)\n#define CONF_DMAC_DES_STRIDE_7 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_7\n#define CONF_DMAC_SRC_STRIDE_7 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_7\n#define CONF_DMAC_DES_STRIDE_7 0\n#endif\n\n// <e> Channel 8 settings\n// <id> dmac_channel_8_settings\n#ifndef CONF_DMAC_CHANNEL_8_SETTINGS\n#define CONF_DMAC_CHANNEL_8_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_8\n#ifndef CONF_DMAC_BURSTSIZE_8\n#define CONF_DMAC_BURSTSIZE_8 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_8\n#ifndef CONF_DMAC_CHUNKSIZE_8\n#define CONF_DMAC_CHUNKSIZE_8 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_8\n#ifndef CONF_DMAC_BEATSIZE_8\n#define CONF_DMAC_BEATSIZE_8 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_8\n#ifndef CONF_DMAC_SRC_INTERFACE_8\n#define CONF_DMAC_SRC_INTERFACE_8 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_8\n#ifndef CONF_DMAC_DES_INTERFACE_8\n#define CONF_DMAC_DES_INTERFACE_8 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_8\n#ifndef CONF_DMAC_SRCINC_8\n#define CONF_DMAC_SRCINC_8 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_8\n#ifndef CONF_DMAC_DSTINC_8\n#define CONF_DMAC_DSTINC_8 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_8\n#ifndef CONF_DMAC_TRANS_TYPE_8\n#define CONF_DMAC_TRANS_TYPE_8 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_8\n#ifndef CONF_DMAC_TRIGSRC_8\n#define CONF_DMAC_TRIGSRC_8 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_8 == 0\n#define CONF_DMAC_TYPE_8 0\n#define CONF_DMAC_DSYNC_8 0\n#elif CONF_DMAC_TRANS_TYPE_8 == 1\n#define CONF_DMAC_TYPE_8 1\n#define CONF_DMAC_DSYNC_8 0\n#elif CONF_DMAC_TRANS_TYPE_8 == 2\n#define CONF_DMAC_TYPE_8 1\n#define CONF_DMAC_DSYNC_8 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_8 == 0xFF\n#define CONF_DMAC_SWREQ_8 1\n#else\n#define CONF_DMAC_SWREQ_8 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_8_SETTINGS == 1 && CONF_DMAC_BEATSIZE_8 != 2 && ((!CONF_DMAC_SRCINC_8) || (!CONF_DMAC_DSTINC_8)))\n#if (!CONF_DMAC_SRCINC_8)\n#define CONF_DMAC_SRC_STRIDE_8 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_8)\n#define CONF_DMAC_DES_STRIDE_8 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_8\n#define CONF_DMAC_SRC_STRIDE_8 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_8\n#define CONF_DMAC_DES_STRIDE_8 0\n#endif\n\n// <e> Channel 9 settings\n// <id> dmac_channel_9_settings\n#ifndef CONF_DMAC_CHANNEL_9_SETTINGS\n#define CONF_DMAC_CHANNEL_9_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_9\n#ifndef CONF_DMAC_BURSTSIZE_9\n#define CONF_DMAC_BURSTSIZE_9 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_9\n#ifndef CONF_DMAC_CHUNKSIZE_9\n#define CONF_DMAC_CHUNKSIZE_9 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_9\n#ifndef CONF_DMAC_BEATSIZE_9\n#define CONF_DMAC_BEATSIZE_9 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_9\n#ifndef CONF_DMAC_SRC_INTERFACE_9\n#define CONF_DMAC_SRC_INTERFACE_9 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_9\n#ifndef CONF_DMAC_DES_INTERFACE_9\n#define CONF_DMAC_DES_INTERFACE_9 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_9\n#ifndef CONF_DMAC_SRCINC_9\n#define CONF_DMAC_SRCINC_9 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_9\n#ifndef CONF_DMAC_DSTINC_9\n#define CONF_DMAC_DSTINC_9 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_9\n#ifndef CONF_DMAC_TRANS_TYPE_9\n#define CONF_DMAC_TRANS_TYPE_9 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_9\n#ifndef CONF_DMAC_TRIGSRC_9\n#define CONF_DMAC_TRIGSRC_9 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_9 == 0\n#define CONF_DMAC_TYPE_9 0\n#define CONF_DMAC_DSYNC_9 0\n#elif CONF_DMAC_TRANS_TYPE_9 == 1\n#define CONF_DMAC_TYPE_9 1\n#define CONF_DMAC_DSYNC_9 0\n#elif CONF_DMAC_TRANS_TYPE_9 == 2\n#define CONF_DMAC_TYPE_9 1\n#define CONF_DMAC_DSYNC_9 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_9 == 0xFF\n#define CONF_DMAC_SWREQ_9 1\n#else\n#define CONF_DMAC_SWREQ_9 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_9_SETTINGS == 1 && CONF_DMAC_BEATSIZE_9 != 2 && ((!CONF_DMAC_SRCINC_9) || (!CONF_DMAC_DSTINC_9)))\n#if (!CONF_DMAC_SRCINC_9)\n#define CONF_DMAC_SRC_STRIDE_9 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_9)\n#define CONF_DMAC_DES_STRIDE_9 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_9\n#define CONF_DMAC_SRC_STRIDE_9 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_9\n#define CONF_DMAC_DES_STRIDE_9 0\n#endif\n\n// <e> Channel 10 settings\n// <id> dmac_channel_10_settings\n#ifndef CONF_DMAC_CHANNEL_10_SETTINGS\n#define CONF_DMAC_CHANNEL_10_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_10\n#ifndef CONF_DMAC_BURSTSIZE_10\n#define CONF_DMAC_BURSTSIZE_10 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_10\n#ifndef CONF_DMAC_CHUNKSIZE_10\n#define CONF_DMAC_CHUNKSIZE_10 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_10\n#ifndef CONF_DMAC_BEATSIZE_10\n#define CONF_DMAC_BEATSIZE_10 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_10\n#ifndef CONF_DMAC_SRC_INTERFACE_10\n#define CONF_DMAC_SRC_INTERFACE_10 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_10\n#ifndef CONF_DMAC_DES_INTERFACE_10\n#define CONF_DMAC_DES_INTERFACE_10 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_10\n#ifndef CONF_DMAC_SRCINC_10\n#define CONF_DMAC_SRCINC_10 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_10\n#ifndef CONF_DMAC_DSTINC_10\n#define CONF_DMAC_DSTINC_10 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_10\n#ifndef CONF_DMAC_TRANS_TYPE_10\n#define CONF_DMAC_TRANS_TYPE_10 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_10\n#ifndef CONF_DMAC_TRIGSRC_10\n#define CONF_DMAC_TRIGSRC_10 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_10 == 0\n#define CONF_DMAC_TYPE_10 0\n#define CONF_DMAC_DSYNC_10 0\n#elif CONF_DMAC_TRANS_TYPE_10 == 1\n#define CONF_DMAC_TYPE_10 1\n#define CONF_DMAC_DSYNC_10 0\n#elif CONF_DMAC_TRANS_TYPE_10 == 2\n#define CONF_DMAC_TYPE_10 1\n#define CONF_DMAC_DSYNC_10 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_10 == 0xFF\n#define CONF_DMAC_SWREQ_10 1\n#else\n#define CONF_DMAC_SWREQ_10 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_10_SETTINGS == 1 && CONF_DMAC_BEATSIZE_10 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_10) || (!CONF_DMAC_DSTINC_10)))\n#if (!CONF_DMAC_SRCINC_10)\n#define CONF_DMAC_SRC_STRIDE_10 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_10)\n#define CONF_DMAC_DES_STRIDE_10 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_10\n#define CONF_DMAC_SRC_STRIDE_10 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_10\n#define CONF_DMAC_DES_STRIDE_10 0\n#endif\n\n// <e> Channel 11 settings\n// <id> dmac_channel_11_settings\n#ifndef CONF_DMAC_CHANNEL_11_SETTINGS\n#define CONF_DMAC_CHANNEL_11_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_11\n#ifndef CONF_DMAC_BURSTSIZE_11\n#define CONF_DMAC_BURSTSIZE_11 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_11\n#ifndef CONF_DMAC_CHUNKSIZE_11\n#define CONF_DMAC_CHUNKSIZE_11 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_11\n#ifndef CONF_DMAC_BEATSIZE_11\n#define CONF_DMAC_BEATSIZE_11 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_11\n#ifndef CONF_DMAC_SRC_INTERFACE_11\n#define CONF_DMAC_SRC_INTERFACE_11 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_11\n#ifndef CONF_DMAC_DES_INTERFACE_11\n#define CONF_DMAC_DES_INTERFACE_11 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_11\n#ifndef CONF_DMAC_SRCINC_11\n#define CONF_DMAC_SRCINC_11 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_11\n#ifndef CONF_DMAC_DSTINC_11\n#define CONF_DMAC_DSTINC_11 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_11\n#ifndef CONF_DMAC_TRANS_TYPE_11\n#define CONF_DMAC_TRANS_TYPE_11 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_11\n#ifndef CONF_DMAC_TRIGSRC_11\n#define CONF_DMAC_TRIGSRC_11 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_11 == 0\n#define CONF_DMAC_TYPE_11 0\n#define CONF_DMAC_DSYNC_11 0\n#elif CONF_DMAC_TRANS_TYPE_11 == 1\n#define CONF_DMAC_TYPE_11 1\n#define CONF_DMAC_DSYNC_11 0\n#elif CONF_DMAC_TRANS_TYPE_11 == 2\n#define CONF_DMAC_TYPE_11 1\n#define CONF_DMAC_DSYNC_11 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_11 == 0xFF\n#define CONF_DMAC_SWREQ_11 1\n#else\n#define CONF_DMAC_SWREQ_11 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_11_SETTINGS == 1 && CONF_DMAC_BEATSIZE_11 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_11) || (!CONF_DMAC_DSTINC_11)))\n#if (!CONF_DMAC_SRCINC_11)\n#define CONF_DMAC_SRC_STRIDE_11 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_11)\n#define CONF_DMAC_DES_STRIDE_11 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_11\n#define CONF_DMAC_SRC_STRIDE_11 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_11\n#define CONF_DMAC_DES_STRIDE_11 0\n#endif\n\n// <e> Channel 12 settings\n// <id> dmac_channel_12_settings\n#ifndef CONF_DMAC_CHANNEL_12_SETTINGS\n#define CONF_DMAC_CHANNEL_12_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_12\n#ifndef CONF_DMAC_BURSTSIZE_12\n#define CONF_DMAC_BURSTSIZE_12 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_12\n#ifndef CONF_DMAC_CHUNKSIZE_12\n#define CONF_DMAC_CHUNKSIZE_12 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_12\n#ifndef CONF_DMAC_BEATSIZE_12\n#define CONF_DMAC_BEATSIZE_12 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_12\n#ifndef CONF_DMAC_SRC_INTERFACE_12\n#define CONF_DMAC_SRC_INTERFACE_12 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_12\n#ifndef CONF_DMAC_DES_INTERFACE_12\n#define CONF_DMAC_DES_INTERFACE_12 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_12\n#ifndef CONF_DMAC_SRCINC_12\n#define CONF_DMAC_SRCINC_12 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_12\n#ifndef CONF_DMAC_DSTINC_12\n#define CONF_DMAC_DSTINC_12 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_12\n#ifndef CONF_DMAC_TRANS_TYPE_12\n#define CONF_DMAC_TRANS_TYPE_12 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_12\n#ifndef CONF_DMAC_TRIGSRC_12\n#define CONF_DMAC_TRIGSRC_12 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_12 == 0\n#define CONF_DMAC_TYPE_12 0\n#define CONF_DMAC_DSYNC_12 0\n#elif CONF_DMAC_TRANS_TYPE_12 == 1\n#define CONF_DMAC_TYPE_12 1\n#define CONF_DMAC_DSYNC_12 0\n#elif CONF_DMAC_TRANS_TYPE_12 == 2\n#define CONF_DMAC_TYPE_12 1\n#define CONF_DMAC_DSYNC_12 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_12 == 0xFF\n#define CONF_DMAC_SWREQ_12 1\n#else\n#define CONF_DMAC_SWREQ_12 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_12_SETTINGS == 1 && CONF_DMAC_BEATSIZE_12 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_12) || (!CONF_DMAC_DSTINC_12)))\n#if (!CONF_DMAC_SRCINC_12)\n#define CONF_DMAC_SRC_STRIDE_12 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_12)\n#define CONF_DMAC_DES_STRIDE_12 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_12\n#define CONF_DMAC_SRC_STRIDE_12 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_12\n#define CONF_DMAC_DES_STRIDE_12 0\n#endif\n\n// <e> Channel 13 settings\n// <id> dmac_channel_13_settings\n#ifndef CONF_DMAC_CHANNEL_13_SETTINGS\n#define CONF_DMAC_CHANNEL_13_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_13\n#ifndef CONF_DMAC_BURSTSIZE_13\n#define CONF_DMAC_BURSTSIZE_13 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_13\n#ifndef CONF_DMAC_CHUNKSIZE_13\n#define CONF_DMAC_CHUNKSIZE_13 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_13\n#ifndef CONF_DMAC_BEATSIZE_13\n#define CONF_DMAC_BEATSIZE_13 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_13\n#ifndef CONF_DMAC_SRC_INTERFACE_13\n#define CONF_DMAC_SRC_INTERFACE_13 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_13\n#ifndef CONF_DMAC_DES_INTERFACE_13\n#define CONF_DMAC_DES_INTERFACE_13 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_13\n#ifndef CONF_DMAC_SRCINC_13\n#define CONF_DMAC_SRCINC_13 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_13\n#ifndef CONF_DMAC_DSTINC_13\n#define CONF_DMAC_DSTINC_13 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_13\n#ifndef CONF_DMAC_TRANS_TYPE_13\n#define CONF_DMAC_TRANS_TYPE_13 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_13\n#ifndef CONF_DMAC_TRIGSRC_13\n#define CONF_DMAC_TRIGSRC_13 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_13 == 0\n#define CONF_DMAC_TYPE_13 0\n#define CONF_DMAC_DSYNC_13 0\n#elif CONF_DMAC_TRANS_TYPE_13 == 1\n#define CONF_DMAC_TYPE_13 1\n#define CONF_DMAC_DSYNC_13 0\n#elif CONF_DMAC_TRANS_TYPE_13 == 2\n#define CONF_DMAC_TYPE_13 1\n#define CONF_DMAC_DSYNC_13 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_13 == 0xFF\n#define CONF_DMAC_SWREQ_13 1\n#else\n#define CONF_DMAC_SWREQ_13 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_13_SETTINGS == 1 && CONF_DMAC_BEATSIZE_13 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_13) || (!CONF_DMAC_DSTINC_13)))\n#if (!CONF_DMAC_SRCINC_13)\n#define CONF_DMAC_SRC_STRIDE_13 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_13)\n#define CONF_DMAC_DES_STRIDE_13 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_13\n#define CONF_DMAC_SRC_STRIDE_13 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_13\n#define CONF_DMAC_DES_STRIDE_13 0\n#endif\n\n// <e> Channel 14 settings\n// <id> dmac_channel_14_settings\n#ifndef CONF_DMAC_CHANNEL_14_SETTINGS\n#define CONF_DMAC_CHANNEL_14_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_14\n#ifndef CONF_DMAC_BURSTSIZE_14\n#define CONF_DMAC_BURSTSIZE_14 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_14\n#ifndef CONF_DMAC_CHUNKSIZE_14\n#define CONF_DMAC_CHUNKSIZE_14 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_14\n#ifndef CONF_DMAC_BEATSIZE_14\n#define CONF_DMAC_BEATSIZE_14 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_14\n#ifndef CONF_DMAC_SRC_INTERFACE_14\n#define CONF_DMAC_SRC_INTERFACE_14 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_14\n#ifndef CONF_DMAC_DES_INTERFACE_14\n#define CONF_DMAC_DES_INTERFACE_14 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_14\n#ifndef CONF_DMAC_SRCINC_14\n#define CONF_DMAC_SRCINC_14 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_14\n#ifndef CONF_DMAC_DSTINC_14\n#define CONF_DMAC_DSTINC_14 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_14\n#ifndef CONF_DMAC_TRANS_TYPE_14\n#define CONF_DMAC_TRANS_TYPE_14 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_14\n#ifndef CONF_DMAC_TRIGSRC_14\n#define CONF_DMAC_TRIGSRC_14 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_14 == 0\n#define CONF_DMAC_TYPE_14 0\n#define CONF_DMAC_DSYNC_14 0\n#elif CONF_DMAC_TRANS_TYPE_14 == 1\n#define CONF_DMAC_TYPE_14 1\n#define CONF_DMAC_DSYNC_14 0\n#elif CONF_DMAC_TRANS_TYPE_14 == 2\n#define CONF_DMAC_TYPE_14 1\n#define CONF_DMAC_DSYNC_14 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_14 == 0xFF\n#define CONF_DMAC_SWREQ_14 1\n#else\n#define CONF_DMAC_SWREQ_14 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_14_SETTINGS == 1 && CONF_DMAC_BEATSIZE_14 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_14) || (!CONF_DMAC_DSTINC_14)))\n#if (!CONF_DMAC_SRCINC_14)\n#define CONF_DMAC_SRC_STRIDE_14 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_14)\n#define CONF_DMAC_DES_STRIDE_14 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_14\n#define CONF_DMAC_SRC_STRIDE_14 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_14\n#define CONF_DMAC_DES_STRIDE_14 0\n#endif\n\n// <e> Channel 15 settings\n// <id> dmac_channel_15_settings\n#ifndef CONF_DMAC_CHANNEL_15_SETTINGS\n#define CONF_DMAC_CHANNEL_15_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_15\n#ifndef CONF_DMAC_BURSTSIZE_15\n#define CONF_DMAC_BURSTSIZE_15 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_15\n#ifndef CONF_DMAC_CHUNKSIZE_15\n#define CONF_DMAC_CHUNKSIZE_15 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_15\n#ifndef CONF_DMAC_BEATSIZE_15\n#define CONF_DMAC_BEATSIZE_15 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_15\n#ifndef CONF_DMAC_SRC_INTERFACE_15\n#define CONF_DMAC_SRC_INTERFACE_15 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_15\n#ifndef CONF_DMAC_DES_INTERFACE_15\n#define CONF_DMAC_DES_INTERFACE_15 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_15\n#ifndef CONF_DMAC_SRCINC_15\n#define CONF_DMAC_SRCINC_15 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_15\n#ifndef CONF_DMAC_DSTINC_15\n#define CONF_DMAC_DSTINC_15 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_15\n#ifndef CONF_DMAC_TRANS_TYPE_15\n#define CONF_DMAC_TRANS_TYPE_15 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_15\n#ifndef CONF_DMAC_TRIGSRC_15\n#define CONF_DMAC_TRIGSRC_15 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_15 == 0\n#define CONF_DMAC_TYPE_15 0\n#define CONF_DMAC_DSYNC_15 0\n#elif CONF_DMAC_TRANS_TYPE_15 == 1\n#define CONF_DMAC_TYPE_15 1\n#define CONF_DMAC_DSYNC_15 0\n#elif CONF_DMAC_TRANS_TYPE_15 == 2\n#define CONF_DMAC_TYPE_15 1\n#define CONF_DMAC_DSYNC_15 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_15 == 0xFF\n#define CONF_DMAC_SWREQ_15 1\n#else\n#define CONF_DMAC_SWREQ_15 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_15_SETTINGS == 1 && CONF_DMAC_BEATSIZE_15 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_15) || (!CONF_DMAC_DSTINC_15)))\n#if (!CONF_DMAC_SRCINC_15)\n#define CONF_DMAC_SRC_STRIDE_15 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_15)\n#define CONF_DMAC_DES_STRIDE_15 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_15\n#define CONF_DMAC_SRC_STRIDE_15 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_15\n#define CONF_DMAC_DES_STRIDE_15 0\n#endif\n\n// <e> Channel 16 settings\n// <id> dmac_channel_16_settings\n#ifndef CONF_DMAC_CHANNEL_16_SETTINGS\n#define CONF_DMAC_CHANNEL_16_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_16\n#ifndef CONF_DMAC_BURSTSIZE_16\n#define CONF_DMAC_BURSTSIZE_16 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_16\n#ifndef CONF_DMAC_CHUNKSIZE_16\n#define CONF_DMAC_CHUNKSIZE_16 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_16\n#ifndef CONF_DMAC_BEATSIZE_16\n#define CONF_DMAC_BEATSIZE_16 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_16\n#ifndef CONF_DMAC_SRC_INTERFACE_16\n#define CONF_DMAC_SRC_INTERFACE_16 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_16\n#ifndef CONF_DMAC_DES_INTERFACE_16\n#define CONF_DMAC_DES_INTERFACE_16 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_16\n#ifndef CONF_DMAC_SRCINC_16\n#define CONF_DMAC_SRCINC_16 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_16\n#ifndef CONF_DMAC_DSTINC_16\n#define CONF_DMAC_DSTINC_16 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_16\n#ifndef CONF_DMAC_TRANS_TYPE_16\n#define CONF_DMAC_TRANS_TYPE_16 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_16\n#ifndef CONF_DMAC_TRIGSRC_16\n#define CONF_DMAC_TRIGSRC_16 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_16 == 0\n#define CONF_DMAC_TYPE_16 0\n#define CONF_DMAC_DSYNC_16 0\n#elif CONF_DMAC_TRANS_TYPE_16 == 1\n#define CONF_DMAC_TYPE_16 1\n#define CONF_DMAC_DSYNC_16 0\n#elif CONF_DMAC_TRANS_TYPE_16 == 2\n#define CONF_DMAC_TYPE_16 1\n#define CONF_DMAC_DSYNC_16 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_16 == 0xFF\n#define CONF_DMAC_SWREQ_16 1\n#else\n#define CONF_DMAC_SWREQ_16 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_16_SETTINGS == 1 && CONF_DMAC_BEATSIZE_16 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_16) || (!CONF_DMAC_DSTINC_16)))\n#if (!CONF_DMAC_SRCINC_16)\n#define CONF_DMAC_SRC_STRIDE_16 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_16)\n#define CONF_DMAC_DES_STRIDE_16 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_16\n#define CONF_DMAC_SRC_STRIDE_16 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_16\n#define CONF_DMAC_DES_STRIDE_16 0\n#endif\n\n// <e> Channel 17 settings\n// <id> dmac_channel_17_settings\n#ifndef CONF_DMAC_CHANNEL_17_SETTINGS\n#define CONF_DMAC_CHANNEL_17_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_17\n#ifndef CONF_DMAC_BURSTSIZE_17\n#define CONF_DMAC_BURSTSIZE_17 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_17\n#ifndef CONF_DMAC_CHUNKSIZE_17\n#define CONF_DMAC_CHUNKSIZE_17 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_17\n#ifndef CONF_DMAC_BEATSIZE_17\n#define CONF_DMAC_BEATSIZE_17 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_17\n#ifndef CONF_DMAC_SRC_INTERFACE_17\n#define CONF_DMAC_SRC_INTERFACE_17 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_17\n#ifndef CONF_DMAC_DES_INTERFACE_17\n#define CONF_DMAC_DES_INTERFACE_17 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_17\n#ifndef CONF_DMAC_SRCINC_17\n#define CONF_DMAC_SRCINC_17 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_17\n#ifndef CONF_DMAC_DSTINC_17\n#define CONF_DMAC_DSTINC_17 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_17\n#ifndef CONF_DMAC_TRANS_TYPE_17\n#define CONF_DMAC_TRANS_TYPE_17 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_17\n#ifndef CONF_DMAC_TRIGSRC_17\n#define CONF_DMAC_TRIGSRC_17 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_17 == 0\n#define CONF_DMAC_TYPE_17 0\n#define CONF_DMAC_DSYNC_17 0\n#elif CONF_DMAC_TRANS_TYPE_17 == 1\n#define CONF_DMAC_TYPE_17 1\n#define CONF_DMAC_DSYNC_17 0\n#elif CONF_DMAC_TRANS_TYPE_17 == 2\n#define CONF_DMAC_TYPE_17 1\n#define CONF_DMAC_DSYNC_17 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_17 == 0xFF\n#define CONF_DMAC_SWREQ_17 1\n#else\n#define CONF_DMAC_SWREQ_17 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_17_SETTINGS == 1 && CONF_DMAC_BEATSIZE_17 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_17) || (!CONF_DMAC_DSTINC_17)))\n#if (!CONF_DMAC_SRCINC_17)\n#define CONF_DMAC_SRC_STRIDE_17 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_17)\n#define CONF_DMAC_DES_STRIDE_17 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_17\n#define CONF_DMAC_SRC_STRIDE_17 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_17\n#define CONF_DMAC_DES_STRIDE_17 0\n#endif\n\n// <e> Channel 18 settings\n// <id> dmac_channel_18_settings\n#ifndef CONF_DMAC_CHANNEL_18_SETTINGS\n#define CONF_DMAC_CHANNEL_18_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_18\n#ifndef CONF_DMAC_BURSTSIZE_18\n#define CONF_DMAC_BURSTSIZE_18 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_18\n#ifndef CONF_DMAC_CHUNKSIZE_18\n#define CONF_DMAC_CHUNKSIZE_18 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_18\n#ifndef CONF_DMAC_BEATSIZE_18\n#define CONF_DMAC_BEATSIZE_18 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_18\n#ifndef CONF_DMAC_SRC_INTERFACE_18\n#define CONF_DMAC_SRC_INTERFACE_18 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_18\n#ifndef CONF_DMAC_DES_INTERFACE_18\n#define CONF_DMAC_DES_INTERFACE_18 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_18\n#ifndef CONF_DMAC_SRCINC_18\n#define CONF_DMAC_SRCINC_18 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_18\n#ifndef CONF_DMAC_DSTINC_18\n#define CONF_DMAC_DSTINC_18 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_18\n#ifndef CONF_DMAC_TRANS_TYPE_18\n#define CONF_DMAC_TRANS_TYPE_18 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_18\n#ifndef CONF_DMAC_TRIGSRC_18\n#define CONF_DMAC_TRIGSRC_18 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_18 == 0\n#define CONF_DMAC_TYPE_18 0\n#define CONF_DMAC_DSYNC_18 0\n#elif CONF_DMAC_TRANS_TYPE_18 == 1\n#define CONF_DMAC_TYPE_18 1\n#define CONF_DMAC_DSYNC_18 0\n#elif CONF_DMAC_TRANS_TYPE_18 == 2\n#define CONF_DMAC_TYPE_18 1\n#define CONF_DMAC_DSYNC_18 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_18 == 0xFF\n#define CONF_DMAC_SWREQ_18 1\n#else\n#define CONF_DMAC_SWREQ_18 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_18_SETTINGS == 1 && CONF_DMAC_BEATSIZE_18 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_18) || (!CONF_DMAC_DSTINC_18)))\n#if (!CONF_DMAC_SRCINC_18)\n#define CONF_DMAC_SRC_STRIDE_18 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_18)\n#define CONF_DMAC_DES_STRIDE_18 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_18\n#define CONF_DMAC_SRC_STRIDE_18 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_18\n#define CONF_DMAC_DES_STRIDE_18 0\n#endif\n\n// <e> Channel 19 settings\n// <id> dmac_channel_19_settings\n#ifndef CONF_DMAC_CHANNEL_19_SETTINGS\n#define CONF_DMAC_CHANNEL_19_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_19\n#ifndef CONF_DMAC_BURSTSIZE_19\n#define CONF_DMAC_BURSTSIZE_19 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_19\n#ifndef CONF_DMAC_CHUNKSIZE_19\n#define CONF_DMAC_CHUNKSIZE_19 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_19\n#ifndef CONF_DMAC_BEATSIZE_19\n#define CONF_DMAC_BEATSIZE_19 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_19\n#ifndef CONF_DMAC_SRC_INTERFACE_19\n#define CONF_DMAC_SRC_INTERFACE_19 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_19\n#ifndef CONF_DMAC_DES_INTERFACE_19\n#define CONF_DMAC_DES_INTERFACE_19 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_19\n#ifndef CONF_DMAC_SRCINC_19\n#define CONF_DMAC_SRCINC_19 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_19\n#ifndef CONF_DMAC_DSTINC_19\n#define CONF_DMAC_DSTINC_19 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_19\n#ifndef CONF_DMAC_TRANS_TYPE_19\n#define CONF_DMAC_TRANS_TYPE_19 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_19\n#ifndef CONF_DMAC_TRIGSRC_19\n#define CONF_DMAC_TRIGSRC_19 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_19 == 0\n#define CONF_DMAC_TYPE_19 0\n#define CONF_DMAC_DSYNC_19 0\n#elif CONF_DMAC_TRANS_TYPE_19 == 1\n#define CONF_DMAC_TYPE_19 1\n#define CONF_DMAC_DSYNC_19 0\n#elif CONF_DMAC_TRANS_TYPE_19 == 2\n#define CONF_DMAC_TYPE_19 1\n#define CONF_DMAC_DSYNC_19 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_19 == 0xFF\n#define CONF_DMAC_SWREQ_19 1\n#else\n#define CONF_DMAC_SWREQ_19 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_19_SETTINGS == 1 && CONF_DMAC_BEATSIZE_19 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_19) || (!CONF_DMAC_DSTINC_19)))\n#if (!CONF_DMAC_SRCINC_19)\n#define CONF_DMAC_SRC_STRIDE_19 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_19)\n#define CONF_DMAC_DES_STRIDE_19 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_19\n#define CONF_DMAC_SRC_STRIDE_19 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_19\n#define CONF_DMAC_DES_STRIDE_19 0\n#endif\n\n// <e> Channel 20 settings\n// <id> dmac_channel_20_settings\n#ifndef CONF_DMAC_CHANNEL_20_SETTINGS\n#define CONF_DMAC_CHANNEL_20_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_20\n#ifndef CONF_DMAC_BURSTSIZE_20\n#define CONF_DMAC_BURSTSIZE_20 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_20\n#ifndef CONF_DMAC_CHUNKSIZE_20\n#define CONF_DMAC_CHUNKSIZE_20 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_20\n#ifndef CONF_DMAC_BEATSIZE_20\n#define CONF_DMAC_BEATSIZE_20 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_20\n#ifndef CONF_DMAC_SRC_INTERFACE_20\n#define CONF_DMAC_SRC_INTERFACE_20 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_20\n#ifndef CONF_DMAC_DES_INTERFACE_20\n#define CONF_DMAC_DES_INTERFACE_20 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_20\n#ifndef CONF_DMAC_SRCINC_20\n#define CONF_DMAC_SRCINC_20 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_20\n#ifndef CONF_DMAC_DSTINC_20\n#define CONF_DMAC_DSTINC_20 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_20\n#ifndef CONF_DMAC_TRANS_TYPE_20\n#define CONF_DMAC_TRANS_TYPE_20 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_20\n#ifndef CONF_DMAC_TRIGSRC_20\n#define CONF_DMAC_TRIGSRC_20 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_20 == 0\n#define CONF_DMAC_TYPE_20 0\n#define CONF_DMAC_DSYNC_20 0\n#elif CONF_DMAC_TRANS_TYPE_20 == 1\n#define CONF_DMAC_TYPE_20 1\n#define CONF_DMAC_DSYNC_20 0\n#elif CONF_DMAC_TRANS_TYPE_20 == 2\n#define CONF_DMAC_TYPE_20 1\n#define CONF_DMAC_DSYNC_20 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_20 == 0xFF\n#define CONF_DMAC_SWREQ_20 1\n#else\n#define CONF_DMAC_SWREQ_20 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_20_SETTINGS == 1 && CONF_DMAC_BEATSIZE_20 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_20) || (!CONF_DMAC_DSTINC_20)))\n#if (!CONF_DMAC_SRCINC_20)\n#define CONF_DMAC_SRC_STRIDE_20 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_20)\n#define CONF_DMAC_DES_STRIDE_20 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_20\n#define CONF_DMAC_SRC_STRIDE_20 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_20\n#define CONF_DMAC_DES_STRIDE_20 0\n#endif\n\n// <e> Channel 21 settings\n// <id> dmac_channel_21_settings\n#ifndef CONF_DMAC_CHANNEL_21_SETTINGS\n#define CONF_DMAC_CHANNEL_21_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_21\n#ifndef CONF_DMAC_BURSTSIZE_21\n#define CONF_DMAC_BURSTSIZE_21 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_21\n#ifndef CONF_DMAC_CHUNKSIZE_21\n#define CONF_DMAC_CHUNKSIZE_21 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_21\n#ifndef CONF_DMAC_BEATSIZE_21\n#define CONF_DMAC_BEATSIZE_21 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_21\n#ifndef CONF_DMAC_SRC_INTERFACE_21\n#define CONF_DMAC_SRC_INTERFACE_21 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_21\n#ifndef CONF_DMAC_DES_INTERFACE_21\n#define CONF_DMAC_DES_INTERFACE_21 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_21\n#ifndef CONF_DMAC_SRCINC_21\n#define CONF_DMAC_SRCINC_21 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_21\n#ifndef CONF_DMAC_DSTINC_21\n#define CONF_DMAC_DSTINC_21 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_21\n#ifndef CONF_DMAC_TRANS_TYPE_21\n#define CONF_DMAC_TRANS_TYPE_21 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_21\n#ifndef CONF_DMAC_TRIGSRC_21\n#define CONF_DMAC_TRIGSRC_21 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_21 == 0\n#define CONF_DMAC_TYPE_21 0\n#define CONF_DMAC_DSYNC_21 0\n#elif CONF_DMAC_TRANS_TYPE_21 == 1\n#define CONF_DMAC_TYPE_21 1\n#define CONF_DMAC_DSYNC_21 0\n#elif CONF_DMAC_TRANS_TYPE_21 == 2\n#define CONF_DMAC_TYPE_21 1\n#define CONF_DMAC_DSYNC_21 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_21 == 0xFF\n#define CONF_DMAC_SWREQ_21 1\n#else\n#define CONF_DMAC_SWREQ_21 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_21_SETTINGS == 1 && CONF_DMAC_BEATSIZE_21 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_21) || (!CONF_DMAC_DSTINC_21)))\n#if (!CONF_DMAC_SRCINC_21)\n#define CONF_DMAC_SRC_STRIDE_21 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_21)\n#define CONF_DMAC_DES_STRIDE_21 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_21\n#define CONF_DMAC_SRC_STRIDE_21 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_21\n#define CONF_DMAC_DES_STRIDE_21 0\n#endif\n\n// <e> Channel 22 settings\n// <id> dmac_channel_22_settings\n#ifndef CONF_DMAC_CHANNEL_22_SETTINGS\n#define CONF_DMAC_CHANNEL_22_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_22\n#ifndef CONF_DMAC_BURSTSIZE_22\n#define CONF_DMAC_BURSTSIZE_22 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_22\n#ifndef CONF_DMAC_CHUNKSIZE_22\n#define CONF_DMAC_CHUNKSIZE_22 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_22\n#ifndef CONF_DMAC_BEATSIZE_22\n#define CONF_DMAC_BEATSIZE_22 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_22\n#ifndef CONF_DMAC_SRC_INTERFACE_22\n#define CONF_DMAC_SRC_INTERFACE_22 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_22\n#ifndef CONF_DMAC_DES_INTERFACE_22\n#define CONF_DMAC_DES_INTERFACE_22 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_22\n#ifndef CONF_DMAC_SRCINC_22\n#define CONF_DMAC_SRCINC_22 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_22\n#ifndef CONF_DMAC_DSTINC_22\n#define CONF_DMAC_DSTINC_22 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_22\n#ifndef CONF_DMAC_TRANS_TYPE_22\n#define CONF_DMAC_TRANS_TYPE_22 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_22\n#ifndef CONF_DMAC_TRIGSRC_22\n#define CONF_DMAC_TRIGSRC_22 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_22 == 0\n#define CONF_DMAC_TYPE_22 0\n#define CONF_DMAC_DSYNC_22 0\n#elif CONF_DMAC_TRANS_TYPE_22 == 1\n#define CONF_DMAC_TYPE_22 1\n#define CONF_DMAC_DSYNC_22 0\n#elif CONF_DMAC_TRANS_TYPE_22 == 2\n#define CONF_DMAC_TYPE_22 1\n#define CONF_DMAC_DSYNC_22 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_22 == 0xFF\n#define CONF_DMAC_SWREQ_22 1\n#else\n#define CONF_DMAC_SWREQ_22 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_22_SETTINGS == 1 && CONF_DMAC_BEATSIZE_22 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_22) || (!CONF_DMAC_DSTINC_22)))\n#if (!CONF_DMAC_SRCINC_22)\n#define CONF_DMAC_SRC_STRIDE_22 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_22)\n#define CONF_DMAC_DES_STRIDE_22 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_22\n#define CONF_DMAC_SRC_STRIDE_22 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_22\n#define CONF_DMAC_DES_STRIDE_22 0\n#endif\n\n// <e> Channel 23 settings\n// <id> dmac_channel_23_settings\n#ifndef CONF_DMAC_CHANNEL_23_SETTINGS\n#define CONF_DMAC_CHANNEL_23_SETTINGS 0\n#endif\n\n// <o> Burst Size\n// <0x0=> 1 burst size\n// <0x1=> 4 burst size\n// <0x2=> 8 burst size\n// <0x3=> 16 burst size\n// <i> Define the memory burst size\n// <id> dmac_burstsize_23\n#ifndef CONF_DMAC_BURSTSIZE_23\n#define CONF_DMAC_BURSTSIZE_23 0x0\n#endif\n\n// <o> Chunk Size\n// <0x0=> 1 data transferred\n// <0x1=> 2 data transferred\n// <0x2=> 4 data transferred\n// <0x3=> 8 data transferred\n// <0x4=> 16 data transferred\n// <i> Define the peripheral chunk size\n// <id> dmac_chunksize_23\n#ifndef CONF_DMAC_CHUNKSIZE_23\n#define CONF_DMAC_CHUNKSIZE_23 0x0\n#endif\n\n// <o> Beat Size\n// <0=> 8-bit bus transfer\n// <1=> 16-bit bus transfer\n// <2=> 32-bit bus transfer\n// <i> Defines the size of one beat\n// <id> dmac_beatsize_23\n#ifndef CONF_DMAC_BEATSIZE_23\n#define CONF_DMAC_BEATSIZE_23 0x0\n#endif\n\n// <o> Source Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is read through the system bus interface 0 or 1\n// <id> dma_src_interface_23\n#ifndef CONF_DMAC_SRC_INTERFACE_23\n#define CONF_DMAC_SRC_INTERFACE_23 0x0\n#endif\n\n// <o> Destination Interface Identifier\n// <0x0=> AHB_IF0\n// <0x1=> AHB_IF1\n// <i> Define the data is written through the system bus interface 0 or 1\n// <id> dma_des_interface_23\n#ifndef CONF_DMAC_DES_INTERFACE_23\n#define CONF_DMAC_DES_INTERFACE_23 0x0\n#endif\n\n// <q> Source Address Increment\n// <i> Indicates whether the source address incremented as beat size or not\n// <id> dmac_srcinc_23\n#ifndef CONF_DMAC_SRCINC_23\n#define CONF_DMAC_SRCINC_23 0\n#endif\n\n// <q> Destination Address Increment\n// <i> Indicates whether the destination address incremented as beat size or not\n// <id> dmac_dstinc_23\n#ifndef CONF_DMAC_DSTINC_23\n#define CONF_DMAC_DSTINC_23 0\n#endif\n\n// <o> Transfer Type\n// <0x0=> Memory to Memory Transfer\n// <0x1=> Peripheral to Memory Transfer\n// <0x2=> Memory to Peripheral Transfer\n// <i> Define the data transfer type\n// <id> dma_trans_type_23\n#ifndef CONF_DMAC_TRANS_TYPE_23\n#define CONF_DMAC_TRANS_TYPE_23 0x0\n#endif\n\n// <o> Trigger source\n// <0xFF=> Software Trigger\n// <0x00=> HSMCI TX/RX Trigger\n// <0x01=> SPI0 TX Trigger\n// <0x02=> SPI0 RX Trigger\n// <0x03=> SPI1 TX Trigger\n// <0x04=> SPI1 RX Trigger\n// <0x05=> QSPI TX Trigger\n// <0x06=> QSPI RX Trigger\n// <0x07=> USART0 TX Trigger\n// <0x08=> USART0 RX Trigger\n// <0x09=> USART1 TX Trigger\n// <0x0A=> USART1 RX Trigger\n// <0x0B=> USART2 TX Trigger\n// <0x0C=> USART2 RX Trigger\n// <0x0D=> PWM0 TX Trigger\n// <0x0E=> TWIHS0 TX Trigger\n// <0x0F=> TWIHS0 RX Trigger\n// <0x10=> TWIHS1 TX Trigger\n// <0x11=> TWIHS1 RX Trigger\n// <0x12=> TWIHS2 TX Trigger\n// <0x13=> TWIHS2 RX Trigger\n// <0x14=> UART0 TX Trigger\n// <0x15=> UART0 RX Trigger\n// <0x16=> UART1 TX Trigger\n// <0x17=> UART1 RX Trigger\n// <0x18=> UART2 TX Trigger\n// <0x19=> UART2 RX Trigger\n// <0x1A=> UART3 TX Trigger\n// <0x1B=> UART3 RX Trigger\n// <0x1C=> UART4 TX Trigger\n// <0x1D=> UART4 RX Trigger\n// <0x1E=> DACC TX Trigger\n// <0x20=> SSC TX Trigger\n// <0x21=> SSC RX Trigger\n// <0x22=> PIOA RX Trigger\n// <0x23=> AFEC0 RX Trigger\n// <0x24=> AFEC1 RX Trigger\n// <0x25=> AES TX Trigger\n// <0x26=> AES RX Trigger\n// <0x27=> PWM1 TX Trigger\n// <0x28=> TC0 RX Trigger\n// <0x29=> TC3 RX Trigger\n// <0x2A=> TC6 RX Trigger\n// <0x2B=> TC9 RX Trigger\n// <0x2C=> I2SC0 TX Left Trigger\n// <0x2D=> I2SC0 RX Left Trigger\n// <0x2E=> I2SC1 TX Left Trigger\n// <0x2F=> I2SC1 RX Left Trigger\n// <0x30=> I2SC0 TX Right Trigger\n// <0x31=> I2SC0 RX Right Trigger\n// <0x32=> I2SC1 TX Right Trigger\n// <0x33=> I2SC1 RX Right Trigger\n// <i> Define the DMA trigger source\n// <id> dmac_trifsrc_23\n#ifndef CONF_DMAC_TRIGSRC_23\n#define CONF_DMAC_TRIGSRC_23 0xff\n#endif\n\n// </e>\n\n#if CONF_DMAC_TRANS_TYPE_23 == 0\n#define CONF_DMAC_TYPE_23 0\n#define CONF_DMAC_DSYNC_23 0\n#elif CONF_DMAC_TRANS_TYPE_23 == 1\n#define CONF_DMAC_TYPE_23 1\n#define CONF_DMAC_DSYNC_23 0\n#elif CONF_DMAC_TRANS_TYPE_23 == 2\n#define CONF_DMAC_TYPE_23 1\n#define CONF_DMAC_DSYNC_23 1\n#endif\n\n#if CONF_DMAC_TRIGSRC_23 == 0xFF\n#define CONF_DMAC_SWREQ_23 1\n#else\n#define CONF_DMAC_SWREQ_23 0\n#endif\n\n/* Errata: If XDMA is used to transfer 8-bit or 16-bit data in fixed source address\n * or fixed destination address mode, source and destination addresses are incremented\n * by 8-bit or 16-bit.\n * Workaround: The user can fix the problem by setting the source addressing mode to\n * use microblock and data striding with microblock stride set to 0 and data stride set to -1.\n */\n#if (CONF_DMAC_CHANNEL_23_SETTINGS == 1 && CONF_DMAC_BEATSIZE_23 != 2                                                  \\\n     && ((!CONF_DMAC_SRCINC_23) || (!CONF_DMAC_DSTINC_23)))\n#if (!CONF_DMAC_SRCINC_23)\n#define CONF_DMAC_SRC_STRIDE_23 ((int16_t)(-1))\n#endif\n#if (!CONF_DMAC_DSTINC_23)\n#define CONF_DMAC_DES_STRIDE_23 ((int16_t)(-1))\n#endif\n#endif\n\n#ifndef CONF_DMAC_SRC_STRIDE_23\n#define CONF_DMAC_SRC_STRIDE_23 0\n#endif\n\n#ifndef CONF_DMAC_DES_STRIDE_23\n#define CONF_DMAC_DES_STRIDE_23 0\n#endif\n\n// </e>\n\n// <<< end of configuration section >>>\n\n#endif // HPL_XDMAC_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/same7x/boards/same70_xplained/peripheral_clk_config.h",
    "content": "/* Auto-generated config file peripheral_clk_config.h */\n#ifndef PERIPHERAL_CLK_CONFIG_H\n#define PERIPHERAL_CLK_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n/**\n * \\def CONF_HCLK_FREQUENCY\n * \\brief HCLK's Clock frequency\n */\n#ifndef CONF_HCLK_FREQUENCY\n#define CONF_HCLK_FREQUENCY 300000000\n#endif\n\n/**\n * \\def CONF_FCLK_FREQUENCY\n * \\brief FCLK's Clock frequency\n */\n#ifndef CONF_FCLK_FREQUENCY\n#define CONF_FCLK_FREQUENCY 300000000\n#endif\n\n/**\n * \\def CONF_CPU_FREQUENCY\n * \\brief CPU's Clock frequency\n */\n#ifndef CONF_CPU_FREQUENCY\n#define CONF_CPU_FREQUENCY 300000000\n#endif\n\n/**\n * \\def CONF_SLCK_FREQUENCY\n * \\brief Slow Clock frequency\n */\n#define CONF_SLCK_FREQUENCY 0\n\n/**\n * \\def CONF_MCK_FREQUENCY\n * \\brief Master Clock frequency\n */\n#define CONF_MCK_FREQUENCY 150000000\n\n/**\n * \\def CONF_PCK6_FREQUENCY\n * \\brief Programmable Clock Controller 6 frequency\n */\n#define CONF_PCK6_FREQUENCY 1714285\n\n// <h> USART Clock Settings\n// <o> USART Clock source\n\n// <0=> Master Clock (MCK)\n// <1=> MCK / 8 for USART\n// <2=> Programmable Clock Controller 4 (PMC_PCK4)\n// <3=> External Clock\n// <i> This defines the clock source for the USART\n// <id> usart_clock_source\n#ifndef CONF_USART1_CK_SRC\n#define CONF_USART1_CK_SRC 0\n#endif\n\n// <o> USART External Clock Input on SCK <1-4294967295>\n// <i> Inputs the external clock frequency on SCK\n// <id> usart_clock_freq\n#ifndef CONF_USART1_SCK_FREQ\n#define CONF_USART1_SCK_FREQ 10000000\n#endif\n\n// </h>\n\n/**\n * \\def USART FREQUENCY\n * \\brief USART's Clock frequency\n */\n#ifndef CONF_USART1_FREQUENCY\n#define CONF_USART1_FREQUENCY 150000000\n#endif\n\n#ifndef CONF_SRC_USB_480M\n#define CONF_SRC_USB_480M 0\n#endif\n\n#ifndef CONF_SRC_USB_48M\n#define CONF_SRC_USB_48M 1\n#endif\n\n// <y> USB Full/Low Speed Clock\n// <CONF_SRC_USB_48M\"> USB Clock Controller (USB_48M)\n// <id> usb_fsls_clock_source\n// <i> 48MHz clock source for low speed and full speed.\n// <i> It must be available when low speed is supported by host driver.\n// <i> It must be available when low power mode is selected.\n#ifndef CONF_USBHS_FSLS_SRC\n#define CONF_USBHS_FSLS_SRC CONF_SRC_USB_48M\n#endif\n\n// <y> USB Clock Source(Normal/Low-power Mode Selection)\n// <CONF_SRC_USB_480M\"> USB High Speed Clock (USB_480M)\n// <CONF_SRC_USB_48M\"> USB Clock Controller (USB_48M)\n// <id> usb_clock_source\n// <i> Select the clock source for USB.\n// <i> In normal mode, use \"USB High Speed Clock (USB_480M)\".\n// <i> In low-power mode, use \"USB Clock Controller (USB_48M)\".\n#ifndef CONF_USBHS_SRC\n#define CONF_USBHS_SRC CONF_SRC_USB_480M\n#endif\n\n/**\n * \\def CONF_USBHS_FSLS_FREQUENCY\n * \\brief USBHS's Full/Low Speed Clock Source frequency\n */\n#ifndef CONF_USBHS_FSLS_FREQUENCY\n#define CONF_USBHS_FSLS_FREQUENCY 48000000\n#endif\n\n/**\n * \\def CONF_USBHS_FREQUENCY\n * \\brief USBHS's Selected Clock Source frequency\n */\n#ifndef CONF_USBHS_FREQUENCY\n#define CONF_USBHS_FREQUENCY 480000000\n#endif\n\n// <<< end of configuration section >>>\n\n#endif // PERIPHERAL_CLK_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/same7x/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to do so, subject to the\n * following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Microchip\n*/\n\n#include \"bsp/board_api.h\"\n#include \"sam.h\"\n\n#include \"hal/include/hal_gpio.h\"\n#include \"hal/include/hal_init.h\"\n#include \"hal/include/hal_usart_async.h\"\n#include \"hpl/pmc/hpl_pmc.h\"\n#include \"hpl/usart/hpl_usart_base.h\"\n#include \"peripheral_clk_config.h\"\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state);\nvoid _init(void);\n#include \"board.h\"\n\n#ifndef UART_BUFFER_SIZE\n  #define UART_BUFFER_SIZE 64\n#endif\n\n#define LED_STATE_OFF (1 - LED_STATE_ON)\n\nstatic struct usart_async_descriptor edbg_com;\nstatic uint8_t edbg_com_buffer[UART_BUFFER_SIZE];\nstatic volatile bool uart_busy = false;\nstatic void tx_complete_cb(const struct usart_async_descriptor *const io_descr) {\n  (void) io_descr;\n  uart_busy = false;\n}\n\nvoid board_init(void) {\n  init_mcu();\n\n  /* Disable Watchdog */\n  hri_wdt_set_MR_WDDIS_bit(WDT);\n\n#ifdef LED_PIN\n  _pmc_enable_periph_clock(LED_PORT_CLOCK);\n  gpio_set_pin_level(LED_PIN, LED_STATE_OFF);\n  gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_function(LED_PIN, GPIO_PIN_FUNCTION_OFF);\n#endif\n\n#ifdef BUTTON_PIN\n  _pmc_enable_periph_clock(BUTTON_PORT_CLOCK);\n  gpio_set_pin_direction(BUTTON_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(BUTTON_PIN, BUTTON_STATE_ACTIVE ? GPIO_PULL_DOWN : GPIO_PULL_UP);\n  gpio_set_pin_function(BUTTON_PIN, GPIO_PIN_FUNCTION_OFF);\n#endif\n\n  _pmc_enable_periph_clock(UART_PORT_CLOCK);\n  gpio_set_pin_function(UART_RX_PIN, UART_RX_FUNCTION);\n  gpio_set_pin_function(UART_TX_PIN, UART_TX_FUNCTION);\n\n  usart_async_init(&edbg_com, BOARD_USART, edbg_com_buffer, sizeof(edbg_com_buffer), _usart_get_usart_async());\n  usart_async_set_baud_rate(&edbg_com, CFG_BOARD_UART_BAUDRATE);\n  usart_async_register_callback(&edbg_com, USART_ASYNC_TXC_CB, tx_complete_cb);\n  usart_async_enable(&edbg_com);\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer (SystemCoreClock may not be correct after init)\n  SysTick_Config(CONF_CPU_FREQUENCY / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority((IRQn_Type) ID_USBHS, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // Enable USB clock\n  _pmc_enable_periph_clock(ID_USBHS);\n\n#if CFG_TUH_ENABLED\n  board_vbus_set(0, true);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n//--------------------------------------------------------------------+\nvoid USBHS_Handler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n#ifdef LED_PIN\n  gpio_set_pin_level(LED_PIN, state ? LED_STATE_ON : LED_STATE_OFF);\n#else\n  (void) state;\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef BUTTON_PIN\n  return BUTTON_STATE_ACTIVE == gpio_get_pin_level(BUTTON_PIN);\n#else\n  return 0;\n#endif\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  while (uart_busy) {}\n  uart_busy = true;\n\n  io_write(&edbg_com.io, buf, len);\n  return len;\n}\n\n// Read 128-bit unique ID via EFC STUI/SPUI commands\n// Must run from RAM since STUI remaps flash to the unique ID\n__attribute__((noinline)) TU_ATTR_SECTION(.ramfunc) static void read_unique_id(uint32_t uid[4]) {\n  // Wait for flash to be ready\n  while (!(EFC->EEFC_FSR & EEFC_FSR_FRDY)) {}\n\n  // Issue Start Read Unique Identifier command\n  EFC->EEFC_FCR = EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_STUI;\n  while (EFC->EEFC_FSR & EEFC_FSR_FRDY) {}\n\n  // Read 128-bit unique ID from flash base address\n  const volatile uint32_t *flash = (const volatile uint32_t *) IFLASH_ADDR;\n  for (int i = 0; i < 4; i++) {\n    uid[i] = flash[i];\n  }\n\n  // Issue Stop Read Unique Identifier command\n  EFC->EEFC_FCR = EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_SPUI;\n  while (!(EFC->EEFC_FSR & EEFC_FSR_FRDY)) {}\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  const size_t uid_len = 16;\n  if (max_len < uid_len) {\n    return 0;\n  }\n  read_unique_id((uint32_t *)(uintptr_t) id);\n  return uid_len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/same7x/family.cmake",
    "content": "include_guard()\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(SDK_DIR ${TOP}/hw/mcu/microchip/same70)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m7 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS SAMX7X CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/same70b/gcc/system_same70q21b.c\n    ${SDK_DIR}/hpl/core/hpl_init.c\n    ${SDK_DIR}/hpl/usart/hpl_usart.c\n    ${SDK_DIR}/hpl/pmc/hpl_pmc.c\n    ${SDK_DIR}/hal/src/hal_usart_async.c\n    ${SDK_DIR}/hal/src/hal_io.c\n    ${SDK_DIR}/hal/src/hal_atomic.c\n    ${SDK_DIR}/hal/utils/src/utils_ringbuffer.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}\n    ${SDK_DIR}/config\n    ${SDK_DIR}/same70b/include\n    ${SDK_DIR}/hal/include\n    ${SDK_DIR}/hal/utils/include\n    ${SDK_DIR}/hpl/core\n    ${SDK_DIR}/hpl/pio\n    ${SDK_DIR}/hpl/pmc\n    ${SDK_DIR}/hri\n    ${SDK_DIR}/CMSIS/Core/Include\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  update_board(${BOARD_TARGET})\n\n  if (TOOLCHAIN STREQUAL \"gcc\" OR TOOLCHAIN STREQUAL \"clang\")\n    set_target_properties(${BOARD_TARGET} PROPERTIES COMPILE_FLAGS -Wno-error=cast-qual)\n  endif ()\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_SAMX7X)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/microchip/samx7x/dcd_samx7x.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    # ignore hal error\n    set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n      PROPERTIES\n      SKIP_LINTING ON\n      COMPILE_OPTIONS -w)\n  endif()\n\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/same7x/family.mk",
    "content": "SDK_DIR = hw/mcu/microchip/same70\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m7\n\nCFLAGS += \\\n  -mthumb \\\n  -mabi=aapcs \\\n  -mcpu=cortex-m7 \\\n  -mfloat-abi=hard \\\n  -mfpu=fpv4-sp-d16 \\\n  -nostdlib -nostartfiles \\\n  -DCFG_TUSB_MCU=OPT_MCU_SAMX7X\n\n# suppress following warnings from mcu driver\nCFLAGS += -Wno-error=unused-parameter -Wno-error=cast-align -Wno-error=redundant-decls\n\n# SAM driver is flooded with -Wcast-qual which slows down compilation significantly\nCFLAGS_SKIP += -Wcast-qual\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\n# All source paths should be relative to the top level.\nSRC_C += \\\n\tsrc/portable/microchip/samx7x/dcd_samx7x.c \\\n\t$(STARTUP_FILE) \\\n\t$(SDK_DIR)/same70b/gcc/system_same70q21b.c \\\n\t$(SDK_DIR)/hpl/core/hpl_init.c \\\n\t$(SDK_DIR)/hpl/usart/hpl_usart.c \\\n\t$(SDK_DIR)/hpl/pmc/hpl_pmc.c \\\n\t$(SDK_DIR)/hal/src/hal_usart_async.c \\\n\t$(SDK_DIR)/hal/src/hal_io.c \\\n\t$(SDK_DIR)/hal/src/hal_atomic.c \\\n\t$(SDK_DIR)/hal/utils/src/utils_ringbuffer.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(SDK_DIR) \\\n\t$(TOP)/$(SDK_DIR)/config \\\n\t$(TOP)/$(SDK_DIR)/same70b/include \\\n\t$(TOP)/$(SDK_DIR)/hal/include \\\n\t$(TOP)/$(SDK_DIR)/hal/utils/include \\\n\t$(TOP)/$(SDK_DIR)/hpl/core \\\n\t$(TOP)/$(SDK_DIR)/hpl/pio \\\n\t$(TOP)/$(SDK_DIR)/hpl/pmc \\\n\t$(TOP)/$(SDK_DIR)/hri \\\n\t$(TOP)/$(SDK_DIR)/CMSIS/Core/Include\n\n# For flash-jlink target\nflash: $(BUILD)/$(PROJECT).bin\n\tedbg --verbose -t same70 -pv -f $<\n"
  },
  {
    "path": "hw/bsp/samg/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  extern uint32_t SystemCoreClock;\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*6*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/samg/boards/samg55_xplained/board.cmake",
    "content": "set(JLINK_DEVICE ATSAMG55J19)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/samg55j19_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    __SAMG55J19__\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samg/boards/samg55_xplained/board.h",
    "content": "/* metadata:\n   name: SAMG55 Xplained Pro\n   url: https://www.microchip.com/DevelopmentTools/ProductDetails/ATSAMG55-XPRO\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n#define LED_PIN               GPIO(GPIO_PORTA, 6)\n\n#define BUTTON_PIN            GPIO(GPIO_PORTA, 2)\n#define BUTTON_STATE_ACTIVE   0\n\n#define UART_TX_PIN           GPIO(GPIO_PORTA, 28)\n#define UART_RX_PIN           GPIO(GPIO_PORTA, 27)\n\n#endif\n"
  },
  {
    "path": "hw/bsp/samg/boards/samg55_xplained/board.mk",
    "content": "CFLAGS += -D__SAMG55J19__\n\nJLINK_DEVICE = ATSAMG55J19\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/samg55j19_flash.ld\n\nOPENOCD_OPTION = -f board/atmel_samg55_xplained_pro.cfg\n\nflash: flash-openocd\n"
  },
  {
    "path": "hw/bsp/samg/boards/samg55_xplained/samg55j19_flash.ld",
    "content": "/**\n * \\file\n *\n * \\brief GCC linker script (flash) for ATSAMG55J19\n *\n * Copyright (c) 2017 Atmel Corporation, a wholly owned subsidiary of Microchip Technology Inc.\n *\n * \\license_start\n *\n * \\page License\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *   http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * \\license_stop\n *\n */\n\n/*------------------------------------------------------------------------------\n *      Linker script for running in internal FLASH on the ATSAMG55J19\n *----------------------------------------------------------------------------*/\n\nOUTPUT_FORMAT(\"elf32-littlearm\", \"elf32-littlearm\", \"elf32-littlearm\")\nOUTPUT_ARCH(arm)\n\nENTRY(Reset_Handler)\n\n/* Memory Spaces Definitions */\nMEMORY\n{\n    rom (rx)    : ORIGIN = 0x00400000, LENGTH = 0x00080000 /* rom, 524288K */\n    ram (rwx)   : ORIGIN = 0x20000000, LENGTH = 0x00028000 /* ram, 163840K */\n}\n\n/* The stack size used by the application. NOTE: you need to adjust according to your application. */\nSTACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;\n\n/* The heapsize used by the application. NOTE: you need to adjust according to your application. */\nHEAP_SIZE = DEFINED(__heap_size__) ? __heap_size__ : 0x0200;\n\n/* Section Definitions */\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4);\n        _sfixed = .;\n        KEEP(*(.vectors .vectors.*))\n        *(.text .text.* .gnu.linkonce.t.*)\n        *(.glue_7t) *(.glue_7)\n        *(.rodata .rodata* .gnu.linkonce.r.*)\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n\n        /* Support C constructors, and C destructors in both user code\n           and the C library. This also provides support for C++ code. */\n        . = ALIGN(4);\n        KEEP(*(.init))\n        . = ALIGN(4);\n        __preinit_array_start = .;\n        KEEP (*(.preinit_array))\n        __preinit_array_end = .;\n\n        . = ALIGN(4);\n        __init_array_start = .;\n        KEEP (*(SORT(.init_array.*)))\n        KEEP (*(.init_array))\n        __init_array_end = .;\n\n        . = ALIGN(0x4);\n        KEEP (*crtbegin.o(.ctors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))\n        KEEP (*(SORT(.ctors.*)))\n        KEEP (*crtend.o(.ctors))\n\n        . = ALIGN(4);\n        KEEP(*(.fini))\n\n        . = ALIGN(4);\n        __fini_array_start = .;\n        KEEP (*(.fini_array))\n        KEEP (*(SORT(.fini_array.*)))\n        __fini_array_end = .;\n\n        KEEP (*crtbegin.o(.dtors))\n        KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))\n        KEEP (*(SORT(.dtors.*)))\n        KEEP (*crtend.o(.dtors))\n\n        . = ALIGN(4);\n        _efixed = .;            /* End of text section */\n    } > rom\n\n    /* .ARM.exidx is sorted, so has to go in its own output section.  */\n    PROVIDE_HIDDEN (__exidx_start = .);\n    .ARM.exidx :\n    {\n      *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n    } > rom\n    PROVIDE_HIDDEN (__exidx_end = .);\n\n    . = ALIGN(4);\n    _etext = .;\n\n    .relocate : AT (_etext)\n    {\n        . = ALIGN(4);\n        _srelocate = .;\n        *(.ramfunc .ramfunc.*);\n        *(.data .data.*);\n        . = ALIGN(4);\n        _erelocate = .;\n    } > ram\n\n    /* .bss section which is used for uninitialized data */\n    .bss (NOLOAD) :\n    {\n        . = ALIGN(4);\n        _sbss = . ;\n        _szero = .;\n        *(.bss .bss.*)\n        *(COMMON)\n        . = ALIGN(4);\n        _ebss = . ;\n        _ezero = .;\n        end = .;\n    } > ram\n\n    /* heap section */\n    .heap (NOLOAD):\n    {\n        . = ALIGN(8);\n         _sheap = .;\n        . = . + HEAP_SIZE;\n        . = ALIGN(8);\n        _eheap = .;\n    } > ram\n\n    /* stack section */\n    .stack (NOLOAD):\n    {\n        . = ALIGN(8);\n        _sstack = .;\n        . = . + STACK_SIZE;\n        . = ALIGN(8);\n        _estack = .;\n    } > ram\n\n    . = ALIGN(4);\n    _end = . ;\n    _ram_end_ = ORIGIN(ram) + LENGTH(ram) - 1 ;\n}\n"
  },
  {
    "path": "hw/bsp/samg/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n/* metadata:\n   manufacturer: Microchip\n*/\n\n#include \"sam.h\"\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\n#include \"peripheral_clk_config.h\"\n#include \"hal/include/hal_init.h\"\n#include \"hal/include/hpl_usart_sync.h\"\n#include \"hpl/pmc/hpl_pmc.h\"\n#include \"hal/include/hal_gpio.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\nstruct _usart_sync_device edbg_com;\n\n//------------- IMPLEMENTATION -------------//\nvoid board_init(void) {\n  init_mcu();\n\n  _pmc_enable_periph_clock(ID_PIOA);\n\n  /* Disable Watchdog */\n  hri_wdt_set_MR_WDDIS_bit(WDT);\n\n  // LED\n  gpio_set_pin_level(LED_PIN, false);\n  gpio_set_pin_direction(LED_PIN, GPIO_DIRECTION_OUT);\n  gpio_set_pin_function(LED_PIN, GPIO_PIN_FUNCTION_OFF);\n\n  // Button\n  gpio_set_pin_direction(BUTTON_PIN, GPIO_DIRECTION_IN);\n  gpio_set_pin_pull_mode(BUTTON_PIN, GPIO_PULL_UP);\n  gpio_set_pin_function(BUTTON_PIN, GPIO_PIN_FUNCTION_OFF);\n\n  // Uart via EDBG Com\n  _pmc_enable_periph_clock(ID_FLEXCOM7);\n  gpio_set_pin_function(UART_RX_PIN, MUX_PA27B_FLEXCOM7_RXD);\n  gpio_set_pin_function(UART_TX_PIN, MUX_PA28B_FLEXCOM7_TXD);\n\n  _usart_sync_init(&edbg_com, FLEXCOM7);\n  _usart_sync_set_baud_rate(&edbg_com, CFG_BOARD_UART_BAUDRATE);\n  _usart_sync_set_mode(&edbg_com, USART_MODE_ASYNCHRONOUS);\n  _usart_sync_enable(&edbg_com);\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer (samd SystemCoreClock may not correct)\n  SysTick_Config(CONF_CPU_FREQUENCY / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  NVIC_SetPriority(UDP_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // USB Pin, Clock init\n\n  /* Clear SYSIO 10 & 11 for USB DM & DP */\n  hri_matrix_clear_CCFG_SYSIO_reg(MATRIX, CCFG_SYSIO_SYSIO10 | CCFG_SYSIO_SYSIO11);\n\n  // Enable clock\n  _pmc_enable_periph_clock(ID_UDP);\n\n  /* USB Device mode & Transceiver active */\n  hri_matrix_write_CCFG_USBMR_reg(MATRIX, CCFG_USBMR_USBMODE);\n}\n\n//--------------------------------------------------------------------+\n// USB Interrupt Handler\n//--------------------------------------------------------------------+\nvoid UDP_Handler(void) {\n  #if CFG_TUD_ENABLED\n  tud_int_handler(0);\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  gpio_set_pin_level(LED_PIN, state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == gpio_get_pin_level(BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  uint8_t const* buf8 = (uint8_t const*) buf;\n  for (int i = 0; i < len; i++) {\n    while (!_usart_sync_is_ready_to_send(&edbg_com)) {}\n    _usart_sync_write_byte(&edbg_com, buf8[i]);\n  }\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/samg/family.cmake",
    "content": "include_guard()\n\nset(SAM_FAMILY samg55)\nset(SDK_DIR ${TOP}/hw/mcu/microchip/samg55)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS SAMG CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f board/atmel_samg55_xplained_pro.cfg\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/${SAM_FAMILY}/gcc/gcc/startup_${SAM_FAMILY}.c)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/${SAM_FAMILY}/gcc/system_${SAM_FAMILY}.c\n    ${SDK_DIR}/hal/src/hal_atomic.c\n    ${SDK_DIR}/hpl/core/hpl_init.c\n    ${SDK_DIR}/hpl/usart/hpl_usart.c\n    ${SDK_DIR}/hpl/pmc/hpl_pmc.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${SDK_DIR}\n    ${SDK_DIR}/config\n    ${SDK_DIR}/samg55/include\n    ${SDK_DIR}/hal/include\n    ${SDK_DIR}/hal/utils/include\n    ${SDK_DIR}/hpl/core\n    ${SDK_DIR}/hpl/pio\n    ${SDK_DIR}/hpl/pmc\n    ${SDK_DIR}/hri\n    ${SDK_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_SAMG)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/microchip/samg/dcd_samg.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  family_flash_openocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/samg/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nSDK_DIR = hw/mcu/microchip/samg55\n\nCFLAGS += \\\n  -flto \\\n  -DCFG_TUSB_MCU=OPT_MCU_SAMG\n\n# suppress following warnings from mcu driver\nCFLAGS += -Wno-error=undef -Wno-error=null-dereference -Wno-error=redundant-decls\n\n# SAM driver is flooded with -Wcast-qual which slow down complication significantly\nCFLAGS_SKIP += -Wcast-qual\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs \\\n\nSRC_C += \\\n\tsrc/portable/microchip/samg/dcd_samg.c \\\n\t${SDK_DIR}/samg55/gcc/gcc/startup_samg55.c \\\n\t${SDK_DIR}/samg55/gcc/system_samg55.c \\\n\t${SDK_DIR}/hal/src/hal_atomic.c \\\n\t${SDK_DIR}/hpl/core/hpl_init.c \\\n\t${SDK_DIR}/hpl/usart/hpl_usart.c \\\n\t${SDK_DIR}/hpl/pmc/hpl_pmc.c \\\n\nINC += \\\n  $(TOP)/$(FAMILY_PATH) \\\n  $(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/${SDK_DIR} \\\n\t$(TOP)/${SDK_DIR}/config \\\n\t$(TOP)/${SDK_DIR}/samg55/include \\\n\t$(TOP)/${SDK_DIR}/hal/include \\\n\t$(TOP)/${SDK_DIR}/hal/utils/include \\\n\t$(TOP)/${SDK_DIR}/hpl/core \\\n\t$(TOP)/${SDK_DIR}/hpl/pio \\\n\t$(TOP)/${SDK_DIR}/hpl/pmc \\\n\t$(TOP)/${SDK_DIR}/hri \\\n\t$(TOP)/${SDK_DIR}/CMSIS/Core/Include\n\n# flash using edbg from https://github.com/ataradov/edbg\nflash-edbg: $(BUILD)/$(PROJECT).bin\n\tedbg --verbose -t samg55 -pv -f $<\n"
  },
  {
    "path": "hw/bsp/samg/hpl_usart_config.h",
    "content": "/* Auto-generated config file hpl_usart_config.h */\n#ifndef HPL_USART_CONFIG_H\n#define HPL_USART_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n#include <peripheral_clk_config.h>\n\n#ifndef CONF_USART_7_ENABLE\n#define CONF_USART_7_ENABLE 1\n#endif\n\n// <h> Basic Configuration\n\n// <o> Frame parity\n// <0x0=>Even parity\n// <0x1=>Odd parity\n// <0x2=>Parity forced to 0\n// <0x3=>Parity forced to 1\n// <0x4=>No parity\n// <i> Parity bit mode for USART frame\n// <id> usart_parity\n#ifndef CONF_USART_7_PARITY\n#define CONF_USART_7_PARITY 0x4\n#endif\n\n// <o> Character Size\n// <0x0=>5 bits\n// <0x1=>6 bits\n// <0x2=>7 bits\n// <0x3=>8 bits\n// <i> Data character size in USART frame\n// <id> usart_character_size\n#ifndef CONF_USART_7_CHSIZE\n#define CONF_USART_7_CHSIZE 0x3\n#endif\n\n// <o> Stop Bit\n// <0=>1 stop bit\n// <1=>1.5 stop bits\n// <2=>2 stop bits\n// <i> Number of stop bits in USART frame\n// <id> usart_stop_bit\n#ifndef CONF_USART_7_SBMODE\n#define CONF_USART_7_SBMODE 0\n#endif\n\n// <o> Clock Output Select\n// <0=>The USART does not drive the SCK pin\n// <1=>The USART drives the SCK pin if USCLKS does not select the external clock SCK\n// <i> Clock Output Select in USART sck, if in usrt master mode, please drive SCK.\n// <id> usart_clock_output_select\n#ifndef CONF_USART_7_CLKO\n#define CONF_USART_7_CLKO 0\n#endif\n\n// <o> Baud rate <1-3000000>\n// <i> USART baud rate setting\n// <id> usart_baud_rate\n#ifndef CONF_USART_7_BAUD\n#define CONF_USART_7_BAUD 9600\n#endif\n\n// </h>\n\n// <e> Advanced configuration\n// <id> usart_advanced\n#ifndef CONF_USART_7_ADVANCED_CONFIG\n#define CONF_USART_7_ADVANCED_CONFIG 0\n#endif\n\n// <o> Channel Mode\n// <0=>Normal Mode\n// <1=>Automatic Echo\n// <2=>Local Loopback\n// <3=>Remote Loopback\n// <i> Channel mode in USART frame\n// <id> usart_channel_mode\n#ifndef CONF_USART_7_CHMODE\n#define CONF_USART_7_CHMODE 0\n#endif\n\n// <q> 9 bits character enable\n// <i> Enable 9 bits character, this has high priority than 5/6/7/8 bits.\n// <id> usart_9bits_enable\n#ifndef CONF_USART_7_MODE9\n#define CONF_USART_7_MODE9 0\n#endif\n\n// <o> Variable Sync\n// <0=>User defined configuration\n// <1=>sync field is updated when a character is written into US_THR\n// <i> Variable Synchronization of Command/Data Sync Start Frarm Delimiter\n// <id> variable_sync\n#ifndef CONF_USART_7_VAR_SYNC\n#define CONF_USART_7_VAR_SYNC 0\n#endif\n\n// <o> Oversampling Mode\n// <0=>16 Oversampling\n// <1=>8 Oversampling\n// <i> Oversampling Mode in UART mode\n// <id> usart__oversampling_mode\n#ifndef CONF_USART_7_OVER\n#define CONF_USART_7_OVER 0\n#endif\n\n// <o> Inhibit Non Ack\n// <0=>The NACK is generated\n// <1=>The NACK is not generated\n// <i> Inhibit Non Acknowledge\n// <id> usart__inack\n#ifndef CONF_USART_7_INACK\n#define CONF_USART_7_INACK 1\n#endif\n\n// <o> Disable Successive NACK\n// <0=>NACK is sent on the ISO line as soon as a parity error occurs\n// <1=>Many parity errors generate a NACK on the ISO line\n// <i> Disable Successive NACK\n// <id> usart_dsnack\n#ifndef CONF_USART_7_DSNACK\n#define CONF_USART_7_DSNACK 0\n#endif\n\n// <o> Inverted Data\n// <0=>Data isn't inverted, nomal mode\n// <1=>Data is inverted\n// <i> Inverted Data\n// <id> usart_invdata\n#ifndef CONF_USART_7_INVDATA\n#define CONF_USART_7_INVDATA 0\n#endif\n\n// <o> Maximum Number of Automatic Iteration <0-7>\n// <i> Defines the maximum number of iterations in mode ISO7816, protocol T = 0.\n// <id> usart_max_iteration\n#ifndef CONF_USART_7_MAX_ITERATION\n#define CONF_USART_7_MAX_ITERATION 0\n#endif\n\n// <q> Receive Line Filter enable\n// <i> whether the USART filters the receive line using a three-sample filter\n// <id> usart_receive_filter_enable\n#ifndef CONF_USART_7_FILTER\n#define CONF_USART_7_FILTER 0\n#endif\n\n// <q> Manchester Encoder/Decoder Enable\n// <i> whether the USART Manchester Encoder/Decoder\n// <id> usart_manchester_filter_enable\n#ifndef CONF_USART_7_MAN\n#define CONF_USART_7_MAN 0\n#endif\n\n// <o> Manchester Synchronization Mode\n// <0=>The Manchester start bit is a 0 to 1 transition\n// <1=>The Manchester start bit is a 1 to 0 transition\n// <i> Manchester Synchronization Mode\n// <id> usart_manchester_synchronization_mode\n#ifndef CONF_USART_7_MODSYNC\n#define CONF_USART_7_MODSYNC 0\n#endif\n\n// <o> Start Frame Delimiter Selector\n// <0=>Start frame delimiter is COMMAND or DATA SYNC\n// <1=>Start frame delimiter is one bit\n// <i> Start Frame Delimiter Selector\n// <id> usart_start_frame_delimiter\n#ifndef CONF_USART_7_ONEBIT\n#define CONF_USART_7_ONEBIT 0\n#endif\n\n// <o> Fractional Part <0-7>\n// <i> Fractional part of the baud rate if baud rate generator is in fractional mode\n// <id> usart_arch_fractional\n#ifndef CONF_USART_7_FRACTIONAL\n#define CONF_USART_7_FRACTIONAL 0x0\n#endif\n\n// <o> Data Order\n// <0=>LSB is transmitted first\n// <1=>MSB is transmitted first\n// <i> Data order of the data bits in the frame\n// <id> usart_arch_msbf\n#ifndef CONF_USART_7_MSBF\n#define CONF_USART_7_MSBF 0\n#endif\n\n// </e>\n\n#define CONF_USART_7_MODE 0x0\n\n// Calculate BAUD register value in UART mode\n#if CONF_FLEXCOM7_CK_SRC < 3\n#ifndef CONF_USART_7_BAUD_CD\n#define CONF_USART_7_BAUD_CD ((CONF_FLEXCOM7_FREQUENCY) / CONF_USART_7_BAUD / 8 / (2 - CONF_USART_7_OVER))\n#endif\n#ifndef CONF_USART_7_BAUD_FP\n#define CONF_USART_7_BAUD_FP                                                                                           \\\n\t((CONF_FLEXCOM7_FREQUENCY) / CONF_USART_7_BAUD / (2 - CONF_USART_7_OVER) - 8 * CONF_USART_7_BAUD_CD)\n#endif\n#elif CONF_FLEXCOM7_CK_SRC == 3\n// No division is active. The value written in US_BRGR has no effect.\n#ifndef CONF_USART_7_BAUD_CD\n#define CONF_USART_7_BAUD_CD 1\n#endif\n#ifndef CONF_USART_7_BAUD_FP\n#define CONF_USART_7_BAUD_FP 1\n#endif\n#endif\n\n// <<< end of configuration section >>>\n\n#endif // HPL_USART_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/samg/peripheral_clk_config.h",
    "content": "/* Auto-generated config file peripheral_clk_config.h */\n#ifndef PERIPHERAL_CLK_CONFIG_H\n#define PERIPHERAL_CLK_CONFIG_H\n\n// <<< Use Configuration Wizard in Context Menu >>>\n\n/**\n * \\def CONF_HCLK_FREQUENCY\n * \\brief HCLK's Clock frequency\n */\n#ifndef CONF_HCLK_FREQUENCY\n#define CONF_HCLK_FREQUENCY 8000000\n#endif\n\n/**\n * \\def CONF_FCLK_FREQUENCY\n * \\brief FCLK's Clock frequency\n */\n#ifndef CONF_FCLK_FREQUENCY\n#define CONF_FCLK_FREQUENCY 8000000\n#endif\n\n/**\n * \\def CONF_CPU_FREQUENCY\n * \\brief CPU's Clock frequency\n */\n#ifndef CONF_CPU_FREQUENCY\n#define CONF_CPU_FREQUENCY 8000000\n#endif\n\n/**\n * \\def CONF_SLCK_FREQUENCY\n * \\brief Slow Clock frequency\n */\n#ifndef CONF_SLCK_FREQUENCY\n#define CONF_SLCK_FREQUENCY 32768\n#endif\n\n/**\n * \\def CONF_MCK_FREQUENCY\n * \\brief Master Clock frequency\n */\n#ifndef CONF_MCK_FREQUENCY\n#define CONF_MCK_FREQUENCY 8000000\n#endif\n\n// <o> USB Clock Source\n// <0=> USB Clock Controller (USB_48M)\n// <id> usb_clock_source\n// <i> Select the clock source for USB.\n#ifndef CONF_UDP_SRC\n#define CONF_UDP_SRC 0\n#endif\n\n/**\n * \\def CONF_UDP_FREQUENCY\n * \\brief UDP's Clock frequency\n */\n#ifndef CONF_UDP_FREQUENCY\n#define CONF_UDP_FREQUENCY 48005120\n#endif\n\n// <h> FLEXCOM Clock Settings\n// <o> FLEXCOM Clock source\n// <0=> Master Clock (MCK)\n// <1=> MCK / 8\n// <2=> Programmable Clock Controller 6 (PMC_PCK6)\n// <2=> Programmable Clock Controller 7 (PMC_PCK7)\n// <3=> External Clock\n// <i> This defines the clock source for the FLEXCOM, PCK6 is used for FLEXCOM0/1/2/3 and PCK7 is used for FLEXCOM4/5/6/7\n// <id> flexcom_clock_source\n#ifndef CONF_FLEXCOM7_CK_SRC\n#define CONF_FLEXCOM7_CK_SRC 0\n#endif\n\n// <o> FLEXCOM External Clock Input on SCK <1-4294967295>\n// <i> Inputs the external clock frequency on SCK\n// <id> flexcom_clock_freq\n#ifndef CONF_FLEXCOM7_SCK_FREQ\n#define CONF_FLEXCOM7_SCK_FREQ 10000000\n#endif\n\n#ifndef CONF_FLEXCOM7_FREQUENCY\n#define CONF_FLEXCOM7_FREQUENCY 8000000\n#endif\n\n// <<< end of configuration section >>>\n\n#endif // PERIPHERAL_CLK_CONFIG_H\n"
  },
  {
    "path": "hw/bsp/stm32c0/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32c0xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 200 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32c0/boards/stm32c071nucleo/STM32C071RBTx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n** @file        : LinkerScript.ld\n**\n** @author      : Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for NUCLEO-C071RB Board embedding STM32C071RBTx Device from stm32c0 series\n**                      128KBytes FLASH\n**                      24KBytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n******************************************************************************\n** @attention\n**\n** Copyright (c) 2024 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0xc00; /* required amount of stack */\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 24K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 128K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab :\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM :\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32c0/boards/stm32c071nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32c071xx)\nset(JLINK_DEVICE stm32c071rb)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32C071RBTx_FLASH.ld)\nset(LD_FILE_IAR ${CMAKE_CURRENT_LIST_DIR}/stm32c071xx_flash.icf)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32C071xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32c0/boards/stm32c071nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n * Copyright (c) 2023, HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32C071 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-g071rb.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n// Green LED\n#define GREEN_LED_PORT         GPIOA\n#define GREEN_LED_PIN          GPIO_PIN_5\n#define GREEN_LED_STATE_ON     1\n\n// Blue LED\n#define BLUE_LED_PORT          GPIOC\n#define BLUE_LED_PIN           GPIO_PIN_9\n#define BLUE_LED_STATE_ON      0\n\n// Generic LED\n#define LED_PORT GREEN_LED_PORT\n#define LED_PIN GREEN_LED_PIN\n#define LED_STATE_ON GREEN_LED_STATE_ON\n\n// Button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   0\n\n// Enable UART serial communication with the ST-Link\n#define UART_DEV              USART2\n#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF1_USART2\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\nstatic inline void board_clock_init(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n\n  __HAL_FLASH_SET_LATENCY(FLASH_LATENCY_1);\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                              |RCC_CLOCKTYPE_PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSE;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n}\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32c0/boards/stm32c071nucleo/board.mk",
    "content": "CFLAGS += \\\n\t-DSTM32C071xx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32c071xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32C071RBTx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32c071xx.s\nLD_FILE_IAR = $(BOARD_PATH)/stm32c071xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32c071rb\n"
  },
  {
    "path": "hw/bsp/stm32c0/boards/stm32c071nucleo/stm32c071xx_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__ = 0x08000000;\ndefine symbol __ICFEDIT_region_ROM_end__   = 0x0801FFFF;\ndefine symbol __ICFEDIT_region_RAM_start__ = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__   = 0x20005FFF;\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__ = 0xc00;\ndefine symbol __ICFEDIT_size_heap__   = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\ndefine memory mem with size = 4G;\ndefine region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n\nexport symbol __ICFEDIT_region_RAM_start__;\nexport symbol __ICFEDIT_region_RAM_end__;\n"
  },
  {
    "path": "hw/bsp/stm32c0/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2023 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32c0xx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_DRD_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n// Startup code generated by STM32CubeIDE uses USB_IRQHandler, while\n// stm32c071xx.s from cmsis_device_c0 uses USB_DRD_FS_IRQHandler.\nvoid USB_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\nUART_HandleTypeDef UartHandle;\n\nvoid board_init(void) {\n  HAL_Init();\n  board_clock_init();\n\n  // Enable peripheral clocks.\n  __HAL_RCC_USB_CLK_ENABLE();\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_SYSCFG_CLK_ENABLE();\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_DRD_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // LED\n  {\n    GPIO_InitTypeDef gpio_init = { 0 };\n    gpio_init.Pin = LED_PIN;\n    gpio_init.Mode = GPIO_MODE_OUTPUT_PP;\n    HAL_GPIO_Init(LED_PORT, &gpio_init);\n    board_led_write(false);\n  }\n\n  // Button\n  {\n    GPIO_InitTypeDef gpio_init = { 0 };\n    gpio_init.Pin = BUTTON_PIN;\n    gpio_init.Mode = GPIO_MODE_INPUT;\n    gpio_init.Pull = BUTTON_STATE_ACTIVE ? GPIO_PULLDOWN : GPIO_PULLUP;\n    HAL_GPIO_Init(BUTTON_PORT, &gpio_init);\n  }\n\n#ifdef UART_DEV\n  UART_CLK_EN();\n  // UART\n  {\n    GPIO_InitTypeDef gpio_init = { 0 };\n    gpio_init.Pin = UART_TX_PIN | UART_RX_PIN;\n    gpio_init.Mode = GPIO_MODE_AF_PP;\n    gpio_init.Pull = GPIO_PULLUP;\n    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;\n    gpio_init.Alternate = UART_GPIO_AF;\n    HAL_GPIO_Init(UART_GPIO_PORT, &gpio_init);\n  }\n\n  UartHandle = (UART_HandleTypeDef){\n    .Instance = UART_DEV,\n    .Init.BaudRate = CFG_BOARD_UART_BAUDRATE,\n    .Init.WordLength = UART_WORDLENGTH_8B,\n    .Init.StopBits = UART_STOPBITS_1,\n    .Init.Parity = UART_PARITY_NONE,\n    .Init.HwFlowCtl = UART_HWCONTROL_NONE,\n    .Init.Mode = UART_MODE_TX_RX,\n    .Init.OverSampling = UART_OVERSAMPLING_16,\n    .AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT\n  };\n  HAL_UART_Init(&UartHandle);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState)(state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t*)(uintptr_t) buf, len, 0xffff);\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  (void) UartHandle;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n  HAL_IncTick();\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/stm32c0/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY c0)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32C0 CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f interface/stlink.cfg -f target/stm32c0x.cfg\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32C0)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/hcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${TOP}/src/portable/st/typec/typec_stm32.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  family_flash_stlink(${TARGET})\n  #family_flash_openocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32c0/family.mk",
    "content": "ST_FAMILY = c0\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32C0 \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += -Wno-error=cast-align -Wno-error=unused-parameter\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/hcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_dma.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32c0/stm32c0xx_hal_conf.h",
    "content": "/* USER CODE BEGIN Header */\n/**\n  ******************************************************************************\n  * @file    stm32c0xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration template file.\n  *          This file should be copied to the application folder and renamed\n  *          to stm32c0xx_hal_conf.h.\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2021 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n/* USER CODE END Header */\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32C0xx_HAL_CONF_H\n#define STM32C0xx_HAL_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED   */\n/* #define HAL_CRC_MODULE_ENABLED   */\n/* #define HAL_CRYP_MODULE_ENABLED   */\n/* #define HAL_I2C_MODULE_ENABLED   */\n/* #define HAL_I2S_MODULE_ENABLED   */\n/* #define HAL_IWDG_MODULE_ENABLED   */\n/* #define HAL_IRDA_MODULE_ENABLED   */\n/* #define HAL_PCD_MODULE_ENABLED   */\n/* #define HAL_HCD_MODULE_ENABLED   */\n/* #define HAL_RNG_MODULE_ENABLED   */\n/* #define HAL_RTC_MODULE_ENABLED   */\n/* #define HAL_SMARTCARD_MODULE_ENABLED   */\n/* #define HAL_SMBUS_MODULE_ENABLED   */\n/* #define HAL_SPI_MODULE_ENABLED   */\n/* #define HAL_TIM_MODULE_ENABLED   */\n/* #define HAL_USART_MODULE_ENABLED   */\n/* #define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n#define HAL_UART_MODULE_ENABLED\n\n/* ########################## Register Callbacks selection ############################## */\n/**\n  * @brief Set below the peripheral configuration  to \"1U\" to add the support\n  *        of HAL callback registration/unregistration feature for the HAL\n  *        driver(s). This allows user application to provide specific callback\n  *        functions thanks to HAL_PPP_RegisterCallback() rather than overwriting\n  *        the default weak callback functions (see each stm32c0xx_hal_ppp.h file\n  *        for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef\n  *        for each PPP peripheral).\n  */\n#define USE_HAL_ADC_REGISTER_CALLBACKS         0U  /* ADC register callback disabled      */\n#define USE_HAL_I2C_REGISTER_CALLBACKS         0U  /* I2C register callback disabled      */\n#define USE_HAL_IRDA_REGISTER_CALLBACKS        0U  /* IRDA register callback disabled     */\n#define USE_HAL_I2S_REGISTER_CALLBACKS         0U  /* I2S register callback disabled      */\n#define USE_HAL_IWDG_REGISTER_CALLBACKS        0U  /* IWDG register callback disabled     */\n#define USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */\n#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */\n#define USE_HAL_SMBUS_REGISTER_CALLBACKS       0U /* SMBUS register callback disabled     */\n#define USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */\n#define USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */\n#define USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */\n#define USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */\n#define USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n#define HSE_VALUE    (48000000U)         /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n#define HSE_STARTUP_TIMEOUT    (100UL)         /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n#define HSI_VALUE    (48000000UL)            /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n#define LSI_VALUE  (32000UL)                /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\nThe real value may vary depending on the variations\nin voltage and temperature.*/\n#if !defined  (LSI_STARTUP_TIME)\n#define LSI_STARTUP_TIME    130UL      /*!< Time out for LSI start up, in ms */\n#endif /* LSI_STARTUP_TIME */\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n#define LSE_VALUE    (32768UL)               /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n#if !defined (LSE_STARTUP_TIMEOUT)\n#define LSE_STARTUP_TIMEOUT    (5000UL)      /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for I2S1 peripheral\n  *        This value is used by the RCC HAL module to compute the I2S1 clock source\n  *        frequency.\n  */\n#if !defined  (EXTERNAL_I2S1_CLOCK_VALUE)\n#define EXTERNAL_I2S1_CLOCK_VALUE    (12288000UL) /*!< Value of the I2S1 External clock source in Hz*/\n#endif /* EXTERNAL_I2S1_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    (3300UL)                                        /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            3U /*!< tick interrupt priority */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              0U\n#define  INSTRUCTION_CACHE_ENABLE     1U\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include modules header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32c0xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32c0xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32c0xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32c0xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32c0xx_hal_adc.h\"\n  #include \"stm32c0xx_hal_adc_ex.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32c0xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n#include \"stm32c0xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32c0xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32c0xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32c0xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32c0xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32c0xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32c0xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32c0xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32c0xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32c0xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32c0xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32c0xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32c0xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32c0xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32c0xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32c0xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n #include \"stm32c0xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for functions parameters check.\n  * @param  expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\nvoid assert_failed(uint8_t *file, uint32_t line);\n#else\n#define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32C0xx_HAL_CONF_H */\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32f0/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32f0xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 200 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f070rbnucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32f070xb)\nset(JLINK_DEVICE stm32f070rb)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/stm32F070rbtx_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F070xB\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f070rbnucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F070 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-f070rb.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART2\n#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF1_USART2\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_stm32f0_clock_init(void)\n{\n  /* Configure the system clock to 48 MHz */\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n\n  /* Enable HSE Oscillator and activate PLL with 8 MHz HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;\n  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);\n\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) ;\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f070rbnucleo/board.mk",
    "content": "MCU_VARIANT = stm32f070xb\n\nCFLAGS += -DSTM32F070xB -DCFG_EXAMPLE_VIDEO_READONLY\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/stm32F070rbtx_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f070rb\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f070rbnucleo/stm32F070rbtx_flash.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author\t\t: Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32F070RBTx Device from STM32F0 series\n**                      128Kbytes FLASH\n**                      16Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>\n**\n** Redistribution and use in source and binary forms, with or without modification,\n** are permitted provided that the following conditions are met:\n**   1. Redistributions of source code must retain the above copyright notice,\n**      this list of conditions and the following disclaimer.\n**   2. 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**   3. Neither the name of STMicroelectronics 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 \"AS IS\"\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20004000;\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200;\t/* required amount of heap  */\n_Min_Stack_Size = 0x400;\t/* required amount of stack */\n\n/* Memories definition */\nMEMORY\n{\n    RAM\t(xrw)\t: ORIGIN = 0x20000000,\tLENGTH = 16K\n    FLASH\t(rx)\t: ORIGIN = 0x8000000,\tLENGTH = 128K\n}\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : {\n  \t. = ALIGN(4);\n  \t*(.ARM.extab* .gnu.linkonce.armextab.*)\n  \t. = ALIGN(4);\n  } >FLASH\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f072disco/STM32F072RBTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F072RBTx Device with\n**                128KByte FLASH, 16KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20004000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 128K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 16K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f072disco/board.cmake",
    "content": "set(MCU_VARIANT stm32f072xb)\nset(JLINK_DEVICE stm32f072rb)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F072RBTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F072xB\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f072disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F072 Discovery\n   url: https://www.st.com/en/evaluation-tools/32f072bdiscovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOC\n#define LED_PIN               GPIO_PIN_6\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE   1\n\n// UART\n#define UART_DEV              USART1\n#define UART_CLK_EN           __HAL_RCC_USART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF1_USART1\n#define UART_TX_PIN           GPIO_PIN_9\n#define UART_RX_PIN           GPIO_PIN_10\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_stm32f0_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Select HSI48 Oscillator as PLL source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI48;\n  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;\n  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK and PCLK1 clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f072disco/board.mk",
    "content": "MCU_VARIANT = stm32f072xb\n\nCFLAGS += -DSTM32F072xB -DCFG_EXAMPLE_VIDEO_READONLY\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F072RBTx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f072rb\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f072eval/STM32F072VBTx_FLASH.ld",
    "content": "/**\n ******************************************************************************\n * @file      LinkerScript.ld\n * @author    Auto-generated by STM32CubeIDE\n *  Abstract    : Linker script for STM32072B-EVAL Board embedding STM32F072VBTx Device from stm32f0 series\n *                      128Kbytes FLASH\n *                      16Kbytes RAM\n *\n *            Set heap size, stack size and stack location according\n *            to application requirements.\n *\n *            Set memory bank area and size if external memory is used\n ******************************************************************************\n * @attention\n *\n * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.\n * All rights reserved.</center></h2>\n *\n * This software component is licensed by ST under BSD 3-Clause license,\n * the \"License\"; You may not use this file except in compliance with the\n * License. You may obtain a copy of the License at:\n *                        opensource.org/licenses/BSD-3-Clause\n *\n ******************************************************************************\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 16K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 128K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ;\t/* required amount of heap  */\n_Min_Stack_Size = 0x400 ;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f072eval/board.cmake",
    "content": "set(MCU_VARIANT stm32f072xb)\nset(JLINK_DEVICE stm32f072vb)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F072VBTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F072xB\n    LSI_VALUE=40000\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f072eval/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F072 Eval\n   url: https://www.st.com/en/evaluation-tools/stm32072b-eval.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PIN_8\t// LED1, GREEN\n// #define LED_PIN               GPIO_PIN_9\t// LED2, ORANGE\n// #define LED_PIN               GPIO_PIN_10\t// LED3, RED\n// #define LED_PIN               GPIO_PIN_11\t// LED4, BLUE\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PIN_0 // JOY_SEL\n#define BUTTON_STATE_ACTIVE   1\n\n// UART\n#define UART_DEV              USART2\n#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOD\n#define UART_GPIO_AF          GPIO_AF0_USART2\n#define UART_TX_PIN           GPIO_PIN_5\n#define UART_RX_PIN           GPIO_PIN_6\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_stm32f0_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n   * in the RCC_OscInitTypeDef structure.\n   */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;\n  RCC_OscInitStruct.HSEState = RCC_HSE_OFF;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL6;\n  RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;\n\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n   */\n  RCC_ClkInitStruct.ClockType =\n      RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB | RCC_PERIPHCLK_USART2;\n  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;\n  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f0/boards/stm32f072eval/board.mk",
    "content": "MCU_VARIANT = stm32f072xb\n\nCFLAGS += -DSTM32F072xB -DLSI_VALUE=40000 -DCFG_EXAMPLE_VIDEO_READONLY\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F072VBTx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f072vb\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f0/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32f0xx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\nUART_HandleTypeDef UartHandle;\n\nvoid board_init(void) {\n  board_stm32f0_clock_init();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n\n  // Enable UART Clock\n  UART_CLK_EN();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // LED\n  GPIO_InitTypeDef GPIO_InitStruct;\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_PULLDOWN;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n  // Uart\n  GPIO_InitStruct.Pin = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UartHandle.Instance = UART_DEV;\n  UartHandle.Init.BaudRate = CFG_BOARD_UART_BAUDRATE;\n  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;\n  UartHandle.Init.StopBits = UART_STOPBITS_1;\n  UartHandle.Init.Parity = UART_PARITY_NONE;\n  UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;\n  UartHandle.Init.Mode = UART_MODE_TX_RX;\n  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;\n  HAL_UART_Init(&UartHandle);\n\n  // USB Pins\n  // Configure USB DM and DP pins. This is optional, and maintained only for user guidance.\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  // USB Clock enable\n  __HAL_RCC_USB_CLK_ENABLE();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState) (state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  HAL_UART_Transmit(&UartHandle, (uint8_t * )(uintptr_t)\n  buf, len, 0xffff);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n#ifdef  USE_FULL_ASSERT\nvoid assert_failed(const char* file, uint32_t line)\n{\n  (void) file; (void) line;\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32f0/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY f0)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32F0 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  #target_compile_options(${BOARD_TARGET} PUBLIC)\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CFG_EXAMPLE_MSC_READONLY\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32F0)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f0/family.mk",
    "content": "UF2_FAMILY_ID = 0x647824b6\nST_FAMILY = f0\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32F0\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += -Wno-error=unused-parameter -Wno-error=cast-align\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# ------------------------\n# All source paths should be relative to the top level.\n# ------------------------\n\nSRC_C += \\\n  src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n  src/portable/st/stm32_fsdev/fsdev_common.c \\\n  $(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_dma.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart_ex.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n  $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n  $(TOP)/$(ST_CMSIS)/Include \\\n  $(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT).s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32f0/stm32f0xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32f0xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32F0xx_HAL_CONF_H\n#define __STM32F0xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/*#define HAL_ADC_MODULE_ENABLED   */\n/*#define HAL_CAN_MODULE_ENABLED   */\n/*#define HAL_CEC_MODULE_ENABLED   */\n/*#define HAL_COMP_MODULE_ENABLED   */\n#define HAL_CORTEX_MODULE_ENABLED\n/*#define HAL_CRC_MODULE_ENABLED   */\n/*#define HAL_DAC_MODULE_ENABLED   */\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_GPIO_MODULE_ENABLED\n/*#define HAL_EXTI_MODULE_ENABLED   */\n/*#define HAL_I2C_MODULE_ENABLED */\n/*#define HAL_I2S_MODULE_ENABLED */\n/*#define HAL_IRDA_MODULE_ENABLED */\n/*#define HAL_IWDG_MODULE_ENABLED */\n#define HAL_PCD_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n/*#define HAL_RTC_MODULE_ENABLED   */\n/*#define HAL_SMARTCARD_MODULE_ENABLED   */\n/*#define HAL_SMBUS_MODULE_ENABLED   */\n/*#define HAL_SPI_MODULE_ENABLED   */\n/*#define HAL_TIM_MODULE_ENABLED   */\n/*#define HAL_TSC_MODULE_ENABLED   */\n#define HAL_UART_MODULE_ENABLED\n/*#define HAL_USART_MODULE_ENABLED   */\n/*#define HAL_WWDG_MODULE_ENABLED */\n\n/* ######################### Oscillator Values adaptation ################### */\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE            8000000U  /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n/**\n  * @brief In the following line adjust the External High Speed oscillator (HSE) Startup\n  *        Timeout value\n  */\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT  100U      /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE            8000000U  /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup\n  *        Timeout value\n  */\n#if !defined  (HSI_STARTUP_TIMEOUT)\n  #define HSI_STARTUP_TIMEOUT  5000U     /*!< Time out for HSI start up */\n#endif /* HSI_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator for ADC (HSI14) value.\n  */\n#if !defined  (HSI14_VALUE)\n  #define HSI14_VALUE          14000000U /*!< Value of the Internal High Speed oscillator for ADC in Hz.\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.  */\n#endif /* HSI14_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator for USB (HSI48) value.\n  */\n#if !defined  (HSI48_VALUE)\n  #define HSI48_VALUE          48000000U /*!< Value of the Internal High Speed oscillator for USB in Hz.\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.  */\n#endif /* HSI48_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n  #define LSI_VALUE            32000U\n#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.  */\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  */\n#if !defined  (LSE_VALUE)\n  #define LSE_VALUE            32768U    /*!< Value of the External Low Speed oscillator in Hz */\n#endif /* LSE_VALUE */\n\n/**\n  * @brief Time out for LSE start up value in ms.\n  */\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT  5000U     /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    3300U  /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            ((uint32_t)(1U<<__NVIC_PRIO_BITS) - 1U) /*!< tick interrupt priority (lowest by default)             */\n                                                                              /*  Warning: Must be set to higher priority for HAL_Delay()  */\n                                                                              /*  and HAL_GetTick() usage under interrupt context          */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U\n#define  INSTRUCTION_CACHE_ENABLE     0U\n#define  DATA_CACHE_ENABLE            0U\n#define  USE_SPI_CRC                  1U\n\n#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */\n#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */\n#define  USE_HAL_COMP_REGISTER_CALLBACKS        0U /* COMP register callback disabled      */\n#define  USE_HAL_CEC_REGISTER_CALLBACKS         0U /* CEC register callback disabled       */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS       0U /* SMBUS register callback disabled     */\n#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */\n#define  USE_HAL_TSC_REGISTER_CALLBACKS         0U /* TSC register callback disabled       */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n #define USE_FULL_ASSERT   1\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n #include \"stm32f0xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n #include \"stm32f0xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n  #include \"stm32f0xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32f0xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n #include \"stm32f0xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n #include \"stm32f0xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CAN_MODULE_ENABLED\n #include \"stm32f0xx_hal_can.h\"\n#endif /* HAL_CAN_MODULE_ENABLED */\n\n#ifdef HAL_CEC_MODULE_ENABLED\n #include \"stm32f0xx_hal_cec.h\"\n#endif /* HAL_CEC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n #include \"stm32f0xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n #include \"stm32f0xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n #include \"stm32f0xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n #include \"stm32f0xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32f0xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32f0xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32f0xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32f0xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32f0xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32f0xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32f0xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32f0xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32f0xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32f0xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32f0xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_TSC_MODULE_ENABLED\n #include \"stm32f0xx_hal_tsc.h\"\n#endif /* HAL_TSC_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32f0xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32f0xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32f0xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed(__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(const char* file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32F0xx_HAL_CONF_H */\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32f1/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32f1xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_bluepill/STM32F103X8_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n**  File        : STM32F103XB_FLASH.ld\n**\n**  Abstract    : Linker script for STM32F103xB Device with\n**                128KByte FLASH, 20KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20004FFF;    /* end of RAM */\n\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 64K\nRAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 20K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_bluepill/board.cmake",
    "content": "set(MCU_VARIANT stm32f103xb)\nset(JLINK_DEVICE stm32f103c8)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F103X8_FLASH.ld)\nset(LD_FILE_IAR ${CMAKE_CURRENT_LIST_DIR}/stm32f103x8_flash.icf)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F103xB\n    HSE_VALUE=8000000U\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_bluepill/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F103 Bluepill\n   url: https://stm32-base.org/boards/STM32F103C8T6-Blue-Pill\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOC\n#define LED_PIN               GPIO_PIN_13\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE   1\n\n// UART\n#define UART_DEV              USART1\n#define UART_CLK_EN           __HAL_RCC_USART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n//#define UART_GPIO_AF          GPIO_AF1_USART1\n#define UART_TX_PIN           GPIO_PIN_9\n#define UART_RX_PIN           GPIO_PIN_10\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_stm32f1_clock_init(void)\n{\n  RCC_ClkInitTypeDef clkinitstruct = {0};\n  RCC_OscInitTypeDef oscinitstruct = {0};\n  RCC_PeriphCLKInitTypeDef rccperiphclkinit = {0};\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  oscinitstruct.OscillatorType  = RCC_OSCILLATORTYPE_HSE;\n  oscinitstruct.HSEState        = RCC_HSE_ON;\n  oscinitstruct.HSEPredivValue  = RCC_HSE_PREDIV_DIV1;\n  oscinitstruct.PLL.PLLMUL      = RCC_PLL_MUL9;\n  oscinitstruct.PLL.PLLState    = RCC_PLL_ON;\n  oscinitstruct.PLL.PLLSource   = RCC_PLLSOURCE_HSE;\n  HAL_RCC_OscConfig(&oscinitstruct);\n\n  /* USB clock selection */\n  rccperiphclkinit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  rccperiphclkinit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;\n  HAL_RCCEx_PeriphCLKConfig(&rccperiphclkinit);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_bluepill/board.mk",
    "content": "MCU_VARIANT = stm32f103xb\n\nCFLAGS += -DSTM32F103xB -DHSE_VALUE=8000000U -DCFG_EXAMPLE_VIDEO_READONLY\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F103X8_FLASH.ld\nLD_FILE_IAR = $(BOARD_PATH)/stm32f103x8_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f103c8\n\n# flash target ROM bootloader\nflash: flash-dfu-util\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_bluepill/stm32f103x8_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__   = 0x08000000 ;\ndefine symbol __ICFEDIT_region_ROM_end__     = 0x0800FFFF;\ndefine symbol __ICFEDIT_region_RAM_start__   = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__     = 0x20004FFF;\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__   = 0x400;\ndefine symbol __ICFEDIT_size_heap__     = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;\ndefine region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_mini_2/STM32F103XC_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n**  File        : STM32F103XB_FLASH.ld\n**\n**  Abstract    : Linker script for STM32F103xB Device with\n**                128KByte FLASH, 20KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20004FFF;    /* end of RAM */\n\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 256K\nRAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 48K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_mini_2/board.cmake",
    "content": "set(MCU_VARIANT stm32f103xb)\nset(JLINK_DEVICE stm32f103rc)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F103XC_FLASH.ld)\nset(LD_FILE_IAR ${CMAKE_CURRENT_LIST_DIR}/stm32f103xc_flash.icf)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F103xB\n    HSE_VALUE=8000000U\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_mini_2/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F103 Mini v2\n   url: https://stm32-base.org/boards/STM32F103RCT6-STM32-Mini-V2.0\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_PIN_8\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE   1\n\n// UART\n//#define UART_DEV              USART1\n//#define UART_CLK_EN           __HAL_RCC_USART1_CLK_ENABLE\n//#define UART_GPIO_PORT        GPIOA\n//#define UART_GPIO_AF          GPIO_AF1_USART1\n//#define UART_TX_PIN           GPIO_PIN_9\n//#define UART_RX_PIN           GPIO_PIN_10\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_stm32f1_clock_init(void)\n{\n  RCC_ClkInitTypeDef clkinitstruct = {0};\n  RCC_OscInitTypeDef oscinitstruct = {0};\n  RCC_PeriphCLKInitTypeDef rccperiphclkinit = {0};\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  oscinitstruct.OscillatorType  = RCC_OSCILLATORTYPE_HSE;\n  oscinitstruct.HSEState        = RCC_HSE_ON;\n  oscinitstruct.HSEPredivValue  = RCC_HSE_PREDIV_DIV1;\n  oscinitstruct.PLL.PLLMUL      = RCC_PLL_MUL9;\n  oscinitstruct.PLL.PLLState    = RCC_PLL_ON;\n  oscinitstruct.PLL.PLLSource   = RCC_PLLSOURCE_HSE;\n  HAL_RCC_OscConfig(&oscinitstruct);\n\n  /* USB clock selection */\n  rccperiphclkinit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  rccperiphclkinit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;\n  HAL_RCCEx_PeriphCLKConfig(&rccperiphclkinit);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_mini_2/board.mk",
    "content": "MCU_VARIANT = stm32f103xb\n\nCFLAGS += -DSTM32F103xB -DHSE_VALUE=8000000U\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F103XC_FLASH.ld\nLD_FILE_IAR = $(BOARD_PATH)/stm32f103xc_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f103rc\n\n# flash target ROM bootloader\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103_mini_2/stm32f103xc_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__   = 0x08000000 ;\ndefine symbol __ICFEDIT_region_ROM_end__     = 0x0803FFFF;\ndefine symbol __ICFEDIT_region_RAM_start__   = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__     = 0x2000BFFF;\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__   = 0x400;\ndefine symbol __ICFEDIT_size_heap__     = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;\ndefine region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103ze_iar/board.cmake",
    "content": "set(MCU_VARIANT stm32f103xe)\nset(JLINK_DEVICE stm32f103ze)\n#set(JLINK_OPTION \"-USB 320000338\")\n\nstring(TOUPPER ${MCU_VARIANT} MCU_VARIANT_UPPER)\n\nset(LD_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/linker/${MCU_VARIANT_UPPER}_FLASH.ld)\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F103xE\n    HSE_VALUE=8000000U\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103ze_iar/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: IAR STM32 F103ze starter kit\n   url: n/a\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOF\n#define LED_PIN               GPIO_PIN_6\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PORT           GPIOG\n#define BUTTON_PIN            GPIO_PIN_8\n#define BUTTON_STATE_ACTIVE   0\n\n// USB Connect\n#define USB_CONNECT_PORT      GPIOG\n#define USB_CONNECT_PIN       GPIO_PIN_11\n#define USB_CONNECT_STATE     0\n\n// UART\n//#define UART_DEV              USART1\n//#define UART_CLK_EN           __HAL_RCC_USART1_CLK_ENABLE\n//#define UART_GPIO_PORT        GPIOA\n//#define UART_GPIO_AF          GPIO_AF1_USART1\n//#define UART_TX_PIN           GPIO_PIN_9\n//#define UART_RX_PIN           GPIO_PIN_10\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_stm32f1_clock_init(void)\n{\n  RCC_ClkInitTypeDef clkinitstruct = {0};\n  RCC_OscInitTypeDef oscinitstruct = {0};\n  RCC_PeriphCLKInitTypeDef rccperiphclkinit = {0};\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  oscinitstruct.OscillatorType  = RCC_OSCILLATORTYPE_HSE;\n  oscinitstruct.HSEState        = RCC_HSE_ON;\n  oscinitstruct.HSEPredivValue  = RCC_HSE_PREDIV_DIV1;\n  oscinitstruct.PLL.PLLMUL      = RCC_PLL_MUL9;\n  oscinitstruct.PLL.PLLState    = RCC_PLL_ON;\n  oscinitstruct.PLL.PLLSource   = RCC_PLLSOURCE_HSE;\n  HAL_RCC_OscConfig(&oscinitstruct);\n\n  /* USB clock selection */\n  rccperiphclkinit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  rccperiphclkinit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;\n  HAL_RCCEx_PeriphCLKConfig(&rccperiphclkinit);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  clkinitstruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  clkinitstruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  clkinitstruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  clkinitstruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  clkinitstruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&clkinitstruct, FLASH_LATENCY_2);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f1/boards/stm32f103ze_iar/board.mk",
    "content": "MCU_VARIANT = stm32f103xe\n\nCFLAGS += -DSTM32F103xE -DHSE_VALUE=8000000U\n\n# Linker\nLD_FILE_GCC = ${ST_CMSIS}/Source/Templates/gcc/linker/STM32F103XE_FLASH.ld\nLD_FILE_IAR = ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f103ze\n\n# flash target ROM bootloader\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/stm32f1/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32f1xx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_HP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid USB_LP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid USBWakeUp_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\nUART_HandleTypeDef UartHandle;\n\nvoid board_init(void) {\n  board_stm32f1_clock_init();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n\n#ifdef __HAL_RCC_GPIOE_CLK_ENABLE\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n#endif\n\n#ifdef __HAL_RCC_GPIOF_CLK_ENABLE\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n#endif\n\n#ifdef __HAL_RCC_GPIOG_CLK_ENABLE\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n#endif\n\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_HP_CAN1_TX_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBWakeUp_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // LED\n  GPIO_InitTypeDef GPIO_InitStruct;\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = LED_STATE_ON ? GPIO_PULLDOWN : GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = BUTTON_STATE_ACTIVE ? GPIO_PULLDOWN : GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n#ifdef UART_DEV\n  // UART\n  UART_CLK_EN();\n\n  GPIO_InitStruct.Pin = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  //GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UartHandle = (UART_HandleTypeDef) {\n      .Instance        = UART_DEV,\n      .Init.BaudRate   = CFG_BOARD_UART_BAUDRATE,\n      .Init.WordLength = UART_WORDLENGTH_8B,\n      .Init.StopBits   = UART_STOPBITS_1,\n      .Init.Parity     = UART_PARITY_NONE,\n      .Init.HwFlowCtl  = UART_HWCONTROL_NONE,\n      .Init.Mode       = UART_MODE_TX_RX,\n      .Init.OverSampling = UART_OVERSAMPLING_16\n  };\n  HAL_UART_Init(&UartHandle);\n#endif\n\n#ifdef USB_CONNECT_PIN\n  GPIO_InitStruct.Pin = USB_CONNECT_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(USB_CONNECT_PORT, &GPIO_InitStruct);\n#endif\n\n  // USB Pins\n  // Configure USB DM and DP pins.\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  // USB Clock enable\n  __HAL_RCC_USB_CLK_ENABLE();\n}\n\n#ifdef USB_CONNECT_PIN\nvoid dcd_disconnect(uint8_t rhport) {\n  (void)rhport;\n  HAL_GPIO_WritePin(USB_CONNECT_PORT, USB_CONNECT_PIN, (GPIO_PinState)(1 - USB_CONNECT_STATE));\n}\n\nvoid dcd_connect(uint8_t rhport) {\n  (void)rhport;\n  HAL_GPIO_WritePin(USB_CONNECT_PORT, USB_CONNECT_PIN, (GPIO_PinState)USB_CONNECT_STATE);\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState) (state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  HAL_UART_Transmit(&UartHandle, (uint8_t *) (uintptr_t) buf, len, 0xffff);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n#ifdef  USE_FULL_ASSERT\nvoid assert_failed(const char *file, uint32_t line)\n{\n  /* USER CODE BEGIN 6 */\n  /* User can add his own implementation to report the file name and line number,\n     tex: printf(\"Wrong parameters value: file %s on line %d\\r\\n\", file, line) */\n  /* USER CODE END 6 */\n}\n#endif /* USE_FULL_ASSERT */\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32f1/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY f1)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32F1 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED LD_FILE_IAR)\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\nendif ()\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32F1)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f1/family.mk",
    "content": "ST_FAMILY = f1\nST_CMSIS = hw/mcu/st/cmsis_device_${ST_FAMILY}\nST_HAL_DRIVER = hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver\n\ninclude ${TOP}/${BOARD_PATH}/board.mk\nCPU_CORE ?= cortex-m3\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32F1\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# mcu driver cause following warnings\nCFLAGS_GCC += -Wno-error=cast-align\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  -specs=nosys.specs -specs=nano.specs\n\n# ------------------------\n# All source paths should be relative to the top level.\n# ------------------------\nSRC_C += \\\n  src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n  src/portable/st/stm32_fsdev/fsdev_common.c \\\n  ${ST_CMSIS}/Source/Templates/system_stm32${ST_FAMILY}xx.c \\\n  ${ST_HAL_DRIVER}/Src/stm32${ST_FAMILY}xx_hal.c \\\n  ${ST_HAL_DRIVER}/Src/stm32${ST_FAMILY}xx_hal_cortex.c \\\n  ${ST_HAL_DRIVER}/Src/stm32${ST_FAMILY}xx_hal_rcc.c \\\n  ${ST_HAL_DRIVER}/Src/stm32${ST_FAMILY}xx_hal_rcc_ex.c \\\n  ${ST_HAL_DRIVER}/Src/stm32${ST_FAMILY}xx_hal_gpio.c \\\n  ${ST_HAL_DRIVER}/Src/stm32${ST_FAMILY}xx_hal_uart.c\n\nINC += \\\n  ${TOP}/${BOARD_PATH} \\\n  ${TOP}/lib/CMSIS_5/CMSIS/Core/Include \\\n  ${TOP}/${ST_CMSIS}/Include \\\n  ${TOP}/${ST_HAL_DRIVER}/Inc\n\n# Startup\nSRC_S_GCC += ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s\nSRC_S_IAR += ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s\n\n# flash target ROM bootloader: flash-dfu-util\nDFU_UTIL_OPTION = -a 0 --dfuse-address 0x08000000\n"
  },
  {
    "path": "hw/bsp/stm32f1/stm32f1xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    USB_Device/HID_Standalone/Inc/stm32f1xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration template file.\n  *          This file should be copied to the application folder and renamed\n  *          to stm32f1xx_hal_conf.h.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32F1xx_HAL_CONF_H\n#define __STM32F1xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED */\n/* #define HAL_CAN_MODULE_ENABLED */\n/* #define HAL_CAN_LEGACY_MODULE_ENABLED */\n#define HAL_CORTEX_MODULE_ENABLED\n/* #define HAL_CRC_MODULE_ENABLED */\n/* #define HAL_DAC_MODULE_ENABLED */\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_GPIO_MODULE_ENABLED\n/* #define HAL_I2C_MODULE_ENABLED */\n/* #define HAL_I2S_MODULE_ENABLED */\n/* #define HAL_IRDA_MODULE_ENABLED */\n/* #define HAL_IWDG_MODULE_ENABLED */\n/* #define HAL_NOR_MODULE_ENABLED */\n/* #define HAL_PCCARD_MODULE_ENABLED */\n#define HAL_PCD_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n/* #define HAL_RTC_MODULE_ENABLED */\n/* #define HAL_SD_MODULE_ENABLED */\n/* #define HAL_SDRAM_MODULE_ENABLED */\n/* #define HAL_SMARTCARD_MODULE_ENABLED */\n/* #define HAL_SPI_MODULE_ENABLED */\n/* #define HAL_SRAM_MODULE_ENABLED */\n/* #define HAL_TIM_MODULE_ENABLED */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED */\n/* #define HAL_WWDG_MODULE_ENABLED */\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n#if defined(USE_STM3210C_EVAL)\n  #define HSE_VALUE    25000000U /*!< Value of the External oscillator in Hz */\n#else\n  #define HSE_VALUE    8000000U /*!< Value of the External oscillator in Hz */\n#endif\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    100U      /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE              8000000U  /*!< Value of the Internal oscillator in Hz */\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n #define LSI_VALUE               40000U    /*!< LSI Typical Value in Hz */\n#endif /* LSI_VALUE */                     /*!< Value of the Internal Low Speed oscillator in Hz\n                                                The real value may vary depending on the variations\n                                                in voltage and temperature. */\n\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n #define LSE_VALUE               32768U    /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    5000U     /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    3300U /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            0x00U /*!< tick interrupt priority */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U\n\n#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */\n#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */\n#define  USE_HAL_CEC_REGISTER_CALLBACKS         0U /* CEC register callback disabled       */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */\n#define  USE_HAL_ETH_REGISTER_CALLBACKS         0U /* ETH register callback disabled       */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS         0U /* HCD register callback disabled       */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */\n#define  USE_HAL_MMC_REGISTER_CALLBACKS         0U /* MMC register callback disabled       */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS        0U /* NAND register callback disabled      */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS         0U /* NOR register callback disabled       */\n#define  USE_HAL_PCCARD_REGISTER_CALLBACKS      0U /* PCCARD register callback disabled    */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */\n#define  USE_HAL_SD_REGISTER_CALLBACKS          0U /* SD register callback disabled        */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS        0U /* SRAM register callback disabled      */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## Ethernet peripheral configuration ##################### */\n\n/* Section 1 : Ethernet peripheral configuration */\n\n/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */\n#define MAC_ADDR0   2U\n#define MAC_ADDR1   0U\n#define MAC_ADDR2   0U\n#define MAC_ADDR3   0U\n#define MAC_ADDR4   0U\n#define MAC_ADDR5   0U\n\n/* Definition of the Ethernet driver buffers size and count */\n#define ETH_RX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for receive               */\n#define ETH_TX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for transmit              */\n#define ETH_RXBUFNB                    8U                  /* 8 Rx buffers of size ETH_RX_BUF_SIZE  */\n#define ETH_TXBUFNB                    4U                  /* 4 Tx buffers of size ETH_TX_BUF_SIZE  */\n\n/* Section 2: PHY configuration section */\n\n/* DP83848 PHY Address*/\n#define DP83848_PHY_ADDRESS             0x01U\n/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/\n#define PHY_RESET_DELAY                 0x000000FFU\n/* PHY Configuration delay */\n#define PHY_CONFIG_DELAY                0x00000FFFU\n\n#define PHY_READ_TO                     0x0000FFFFU\n#define PHY_WRITE_TO                    0x0000FFFFU\n\n/* Section 3: Common PHY Registers */\n\n#define PHY_BCR                         ((uint16_t)0x0000)  /*!< Transceiver Basic Control Register   */\n#define PHY_BSR                         ((uint16_t)0x0001)  /*!< Transceiver Basic Status Register    */\n\n#define PHY_RESET                       ((uint16_t)0x8000)  /*!< PHY Reset */\n#define PHY_LOOPBACK                    ((uint16_t)0x4000)  /*!< Select loop-back mode */\n#define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100)  /*!< Set the full-duplex mode at 100 Mb/s */\n#define PHY_HALFDUPLEX_100M             ((uint16_t)0x2000)  /*!< Set the half-duplex mode at 100 Mb/s */\n#define PHY_FULLDUPLEX_10M              ((uint16_t)0x0100)  /*!< Set the full-duplex mode at 10 Mb/s  */\n#define PHY_HALFDUPLEX_10M              ((uint16_t)0x0000)  /*!< Set the half-duplex mode at 10 Mb/s  */\n#define PHY_AUTONEGOTIATION             ((uint16_t)0x1000)  /*!< Enable auto-negotiation function     */\n#define PHY_RESTART_AUTONEGOTIATION     ((uint16_t)0x0200)  /*!< Restart auto-negotiation function    */\n#define PHY_POWERDOWN                   ((uint16_t)0x0800)  /*!< Select the power down mode           */\n#define PHY_ISOLATE                     ((uint16_t)0x0400)  /*!< Isolate PHY from MII                 */\n\n#define PHY_AUTONEGO_COMPLETE           ((uint16_t)0x0020)  /*!< Auto-Negotiation process completed   */\n#define PHY_LINKED_STATUS               ((uint16_t)0x0004)  /*!< Valid link established               */\n#define PHY_JABBER_DETECTION            ((uint16_t)0x0002)  /*!< Jabber condition detected            */\n\n/* Section 4: Extended PHY Registers */\n\n#define PHY_SR                          ((uint16_t)0x0010)  /*!< PHY status register Offset                      */\n#define PHY_MICR                        ((uint16_t)0x0011)  /*!< MII Interrupt Control Register                  */\n#define PHY_MISR                        ((uint16_t)0x0012)  /*!< MII Interrupt Status and Misc. Control Register */\n\n#define PHY_LINK_STATUS                 ((uint16_t)0x0001)  /*!< PHY Link mask                                   */\n#define PHY_SPEED_STATUS                ((uint16_t)0x0002)  /*!< PHY Speed mask                                  */\n#define PHY_DUPLEX_STATUS               ((uint16_t)0x0004)  /*!< PHY Duplex mask                                 */\n\n#define PHY_MICR_INT_EN                 ((uint16_t)0x0002)  /*!< PHY Enable interrupts                           */\n#define PHY_MICR_INT_OE                 ((uint16_t)0x0001)  /*!< PHY Enable output interrupt events              */\n\n#define PHY_MISR_LINK_INT_EN            ((uint16_t)0x0020)  /*!< Enable Interrupt on change of link status       */\n#define PHY_LINK_INTERRUPT              ((uint16_t)0x2000)  /*!< PHY link status interrupt mask                  */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n* Activated: CRC code is present inside driver\n* Deactivated: CRC code cleaned from driver\n*/\n\n#define USE_SPI_CRC                     1U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n #include \"stm32f1xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n #include \"stm32f1xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n  #include \"stm32f1xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32f1xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CAN_MODULE_ENABLED\n #include \"stm32f1xx_hal_can.h\"\n#endif /* HAL_CAN_MODULE_ENABLED */\n\n#ifdef HAL_CAN_LEGACY_MODULE_ENABLED\n  #include \"Legacy/stm32f1xx_hal_can_legacy.h\"\n#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n #include \"stm32f1xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n #include \"stm32f1xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n #include \"stm32f1xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n #include \"stm32f1xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n #include \"stm32f1xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32f1xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32f1xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32f1xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32f1xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32f1xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32f1xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32f1xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_PCCARD_MODULE_ENABLED\n #include \"stm32f1xx_hal_pccard.h\"\n#endif /* HAL_PCCARD_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n #include \"stm32f1xx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SDRAM_MODULE_ENABLED\n #include \"stm32f1xx_hal_sdram.h\"\n#endif /* HAL_SDRAM_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32f1xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32f1xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32f1xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32f1xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32f1xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32f1xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32f1xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32f1xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed(__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(const char* file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32F1xx_HAL_CONF_H */\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32f2/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32f2xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32f2/boards/stm32f207nucleo/STM32F207ZGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F207IGHx Device with\n**                1024KByte FLASH, 128KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f2/boards/stm32f207nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32f207xx)\nset(JLINK_DEVICE stm32f207zg)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F207ZGTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F207xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f2/boards/stm32f207nucleo/board.h",
    "content": "\n/* metadata:\n   name: STM32 F207 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-f207zg.html\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_14\n#define LED_STATE_ON          1\n\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   1\n\n\n/**\n  * @brief  System Clock Configuration\n  *         The system Clock is configured as follow :\n  *            System Clock source            = PLL (HSE)\n  *            SYSCLK(Hz)                     = 120000000\n  *            HCLK(Hz)                       = 120000000\n  *            AHB Prescaler                  = 1\n  *            APB1 Prescaler                 = 4\n  *            APB2 Prescaler                 = 2\n  *            HSE Frequency(Hz)              = 8000000\n  *            PLL_M                          = HSE_VALUE/1000000\n  *            PLL_N                          = 240\n  *            PLL_P                          = 2\n  *            PLL_Q                          = 5\n  *            VDD(V)                         = 3.3\n  *            Flash Latency(WS)              = 3\n  * @param  None\n  * @retval None\n  */\nstatic inline void SystemClock_Config(void) {\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE / 1000000;\n  RCC_OscInitStruct.PLL.PLLN = 240;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 5;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32f2/boards/stm32f207nucleo/board.mk",
    "content": "MCU_VARIANT = stm32f207xx\nCFLAGS += -DSTM32F207xx\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/STM32F207ZGTx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f207zg\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f2/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32f2xx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTG_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n// enable all LED, Button, Uart, USB clock\nstatic void all_rcc_clk_enable(void) {\n  __HAL_RCC_GPIOA_CLK_ENABLE();  // USB D+, D-\n  __HAL_RCC_GPIOB_CLK_ENABLE();  // LED\n  __HAL_RCC_GPIOC_CLK_ENABLE();  // Button\n}\n\nvoid board_init(void) {\n  SystemClock_Config();\n\n  #if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n  #elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  #endif\n\n  all_rcc_clk_enable();\n\n  GPIO_InitTypeDef GPIO_InitStruct;\n\n  // LED\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  board_led_write(false);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_PULLDOWN;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n  /* Configure DM DP Pins */\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Configure VBUS Pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_9;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Configure ID pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_10;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Enable USB FS Clocks */\n  __HAL_RCC_USB_OTG_FS_CLK_ENABLE();\n\n#if CFG_TUD_ENABLED\n  // Enable VBUS sense (B device) via pin PA9\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = true;\n  tud_configure(0, TUD_CFGID_DWC2, &cfg);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState) (state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32f2/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY f2)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32F2 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED LD_FILE_IAR)\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\nendif ()\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32F2)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f2/family.mk",
    "content": "ST_FAMILY = f2\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m3\n\nCFLAGS += \\\n\t-DCFG_TUSB_MCU=OPT_MCU_STM32F2\n\n# mcu driver cause following warnings\nCFLAGS_GCC += \\\n  -flto \\\n  -Wno-error=sign-compare\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n  src/portable/synopsys/dwc2/dcd_dwc2.c \\\n  src/portable/synopsys/dwc2/hcd_dwc2.c \\\n  src/portable/synopsys/dwc2/dwc2_common.c \\\n  $(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c\n\nINC += \\\n  $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n  $(TOP)/$(ST_CMSIS)/Include \\\n  $(TOP)/$(ST_HAL_DRIVER)/Inc \\\n  $(TOP)/$(BOARD_PATH)\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_${MCU_VARIANT}.s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_${MCU_VARIANT}.s\n\n# Linker\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32f2/stm32f2xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32f2xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32F2xx_HAL_CONF_H\n#define __STM32F2xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED   */\n/* #define HAL_CAN_MODULE_ENABLED   */\n/* #define HAL_CRC_MODULE_ENABLED   */\n/* #define HAL_CRYP_MODULE_ENABLED   */\n/* #define HAL_DAC_MODULE_ENABLED   */\n/* #define HAL_DCMI_MODULE_ENABLED  */\n/* #define HAL_DMA_MODULE_ENABLED */\n/* #define HAL_ETH_MODULE_ENABLED */\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n/* #define HAL_NAND_MODULE_ENABLED */\n/* #define HAL_NOR_MODULE_ENABLED */\n/* #define HAL_PCCARD_MODULE_ENABLED */\n/* #define HAL_SRAM_MODULE_ENABLED */\n/* #define HAL_HASH_MODULE_ENABLED   */\n#define HAL_GPIO_MODULE_ENABLED\n/* #define HAL_I2C_MODULE_ENABLED */\n/* #define HAL_I2S_MODULE_ENABLED    */\n/* #define HAL_IWDG_MODULE_ENABLED  */\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n/* #define HAL_RNG_MODULE_ENABLED    */\n/* #define HAL_RTC_MODULE_ENABLED */\n/* #define HAL_SD_MODULE_ENABLED   */\n/* #define HAL_SPI_MODULE_ENABLED    */\n/* #define HAL_TIM_MODULE_ENABLED    */\n/* #define HAL_UART_MODULE_ENABLED  */\n/* #define HAL_USART_MODULE_ENABLED  */\n/* #define HAL_IRDA_MODULE_ENABLED  */\n/* #define HAL_SMARTCARD_MODULE_ENABLED  */\n/* #define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_CORTEX_MODULE_ENABLED\n#define HAL_PCD_MODULE_ENABLED\n/* #define HAL_HCD_MODULE_ENABLED */\n\n\n/* ########################## HSE/HSI Values adaptation ##################### */\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE                     8000000U       /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT               100U       /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE                    16000000U       /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n #define LSI_VALUE                        32000U       /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                                 /*!< Value of the Internal Low Speed oscillator in Hz\n                                                            The real value may vary depending on the variations\n                                                            in voltage and temperature.*/\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  */\n#if !defined  (LSE_VALUE)\n #define LSE_VALUE                        32768U       /*!< Value of the External Low Speed oscillator in Hz */\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT              5000U       /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for I2S peripheral\n  *        This value is used by the I2S HAL module to compute the I2S clock source\n  *        frequency, this source is inserted directly through I2S_CKIN pad.\n  */\n#if !defined  (EXTERNAL_CLOCK_VALUE)\n  #define EXTERNAL_CLOCK_VALUE       12288000U        /*!< Value of the Internal oscillator in Hz*/\n#endif /* EXTERNAL_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                      3300U /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY              0x0FU /*!< tick interrupt priority */\n#define  USE_RTOS                          0U\n#define  PREFETCH_ENABLE                   1U\n#define  INSTRUCTION_CACHE_ENABLE          1U\n#define  DATA_CACHE_ENABLE                 1U\n\n#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */\n#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS        0U /* CRYP register callback disabled      */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */\n#define  USE_HAL_DCMI_REGISTER_CALLBACKS        0U /* DCMI register callback disabled      */\n#define  USE_HAL_ETH_REGISTER_CALLBACKS         0U /* ETH register callback disabled       */\n#define  USE_HAL_HASH_REGISTER_CALLBACKS        0U /* HASH register callback disabled      */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS         0U /* HCD register callback disabled       */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */\n#define  USE_HAL_MMC_REGISTER_CALLBACKS         0U /* MMC register callback disabled       */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS        0U /* NAND register callback disabled      */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS         0U /* NOR register callback disabled       */\n#define  USE_HAL_PCCARD_REGISTER_CALLBACKS      0U /* PCCARD register callback disabled    */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS         0U /* RNG register callback disabled       */\n#define  USE_HAL_SD_REGISTER_CALLBACKS          0U /* SD register callback disabled        */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS        0U /* SRAM register callback disabled      */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## Ethernet peripheral configuration for NUCLEO 144 board ##################### */\n\n/* Section 1 : Ethernet peripheral configuration */\n\n/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */\n#define MAC_ADDR0                         2U\n#define MAC_ADDR1                         0U\n#define MAC_ADDR2                         0U\n#define MAC_ADDR3                         0U\n#define MAC_ADDR4                         0U\n#define MAC_ADDR5                         0U\n\n/* Definition of the Ethernet driver buffers size and count */\n#define ETH_RX_BUF_SIZE                   ETH_MAX_PACKET_SIZE /* buffer size for receive               */\n#define ETH_TX_BUF_SIZE                   ETH_MAX_PACKET_SIZE /* buffer size for transmit              */\n#define ETH_RXBUFNB                       5U       /* 5 Rx buffers of size ETH_RX_BUF_SIZE  */\n#define ETH_TXBUFNB                       5U       /* 5 Tx buffers of size ETH_TX_BUF_SIZE  */\n\n/* Section 2: PHY configuration section */\n\n/* LAN8742A PHY Address*/\n#define LAN8742A_PHY_ADDRESS            0x00U\n/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/\n#define PHY_RESET_DELAY                 0x000000FFU\n/* PHY Configuration delay */\n#define PHY_CONFIG_DELAY                0x00000FFFU\n\n#define PHY_READ_TO                     0x0000FFFFU\n#define PHY_WRITE_TO                    0x0000FFFFU\n\n/* Section 3: Common PHY Registers */\n\n#define PHY_BCR                         ((uint16_t)0x0000)  /*!< Transceiver Basic Control Register   */\n#define PHY_BSR                         ((uint16_t)0x0001)  /*!< Transceiver Basic Status Register    */\n\n#define PHY_RESET                       ((uint16_t)0x8000)  /*!< PHY Reset */\n#define PHY_LOOPBACK                    ((uint16_t)0x4000)  /*!< Select loop-back mode */\n#define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100)  /*!< Set the full-duplex mode at 100 Mb/s */\n#define PHY_HALFDUPLEX_100M             ((uint16_t)0x2000)  /*!< Set the half-duplex mode at 100 Mb/s */\n#define PHY_FULLDUPLEX_10M              ((uint16_t)0x0100)  /*!< Set the full-duplex mode at 10 Mb/s  */\n#define PHY_HALFDUPLEX_10M              ((uint16_t)0x0000)  /*!< Set the half-duplex mode at 10 Mb/s  */\n#define PHY_AUTONEGOTIATION             ((uint16_t)0x1000)  /*!< Enable auto-negotiation function     */\n#define PHY_RESTART_AUTONEGOTIATION     ((uint16_t)0x0200)  /*!< Restart auto-negotiation function    */\n#define PHY_POWERDOWN                   ((uint16_t)0x0800)  /*!< Select the power down mode           */\n#define PHY_ISOLATE                     ((uint16_t)0x0400)  /*!< Isolate PHY from MII                 */\n\n#define PHY_AUTONEGO_COMPLETE           ((uint16_t)0x0020)  /*!< Auto-Negotiation process completed   */\n#define PHY_LINKED_STATUS               ((uint16_t)0x0004)  /*!< Valid link established               */\n#define PHY_JABBER_DETECTION            ((uint16_t)0x0002)  /*!< Jabber condition detected            */\n\n/* Section 4: Extended PHY Registers */\n\n#define PHY_SR                          ((uint16_t)0x1F)    /*!< PHY special control/ status register Offset     */\n\n#define PHY_SPEED_STATUS                ((uint16_t)0x0004)  /*!< PHY Speed mask                                  */\n#define PHY_DUPLEX_STATUS               ((uint16_t)0x0010)  /*!< PHY Duplex mask                                 */\n\n\n#define PHY_ISFR                        ((uint16_t)0x1D)    /*!< PHY Interrupt Source Flag register Offset       */\n#define PHY_ISFR_INT4                   ((uint16_t)0x0010)  /*!< PHY Link down inturrupt                         */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n* Activated: CRC code is present inside driver\n* Deactivated: CRC code cleaned from driver\n*/\n\n#define USE_SPI_CRC                     1U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32f2xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32f2xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n  #include \"stm32f2xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32f2xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32f2xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32f2xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CAN_MODULE_ENABLED\n  #include \"stm32f2xx_hal_can.h\"\n#endif /* HAL_CAN_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32f2xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32f2xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n  #include \"stm32f2xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_DCMI_MODULE_ENABLED\n  #include \"stm32f2xx_hal_dcmi.h\"\n#endif /* HAL_DCMI_MODULE_ENABLED */\n\n#ifdef HAL_ETH_MODULE_ENABLED\n  #include \"stm32f2xx_hal_eth.h\"\n#endif /* HAL_ETH_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32f2xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32f2xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32f2xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n  #include \"stm32f2xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_PCCARD_MODULE_ENABLED\n  #include \"stm32f2xx_hal_pccard.h\"\n#endif /* HAL_PCCARD_MODULE_ENABLED */\n\n#ifdef HAL_HASH_MODULE_ENABLED\n #include \"stm32f2xx_hal_hash.h\"\n#endif /* HAL_HASH_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32f2xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32f2xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32f2xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32f2xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n #include \"stm32f2xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32f2xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n #include \"stm32f2xx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32f2xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32f2xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32f2xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32f2xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32f2xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32f2xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32f2xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32f2xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n #include \"stm32f2xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t* file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32F2xx_HAL_CONF_H */\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32f3/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32f3xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32f3/boards/stm32f303disco/STM32F303VCTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F303VCTx Device with\n**                256KByte FLASH, 40KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x2000a000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x800;;      /* required amount of heap  */\n_Min_Stack_Size = 0x800;; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 256K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 40K\nCCMRAM (rw)      : ORIGIN = 0x10000000, LENGTH = 8K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  _siccmram = LOADADDR(.ccmram);\n\n  /* CCM-RAM section\n  *\n  * IMPORTANT NOTE!\n  * If initialized variables will be placed in this section,\n  * the startup code needs to be modified to copy the init-values.\n  */\n  .ccmram :\n  {\n    . = ALIGN(4);\n    _sccmram = .;       /* create a global symbol at ccmram start */\n    *(.ccmram)\n    *(.ccmram*)\n\n    . = ALIGN(4);\n    _eccmram = .;       /* create a global symbol at ccmram end */\n  } >CCMRAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f3/boards/stm32f303disco/board.cmake",
    "content": "set(MCU_VARIANT stm32f303xc)\nset(JLINK_DEVICE stm32f303vc)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F303VCTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F303xC\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f3/boards/stm32f303disco/board.h",
    "content": "\n/* metadata:\n   name: STM32 F303 Discovery\n   url: https://www.st.com/en/evaluation-tools/stm32f3discovery.html\n*/\n\n#ifndef BOARD_H\n#define BOARD_H\n\n#define LED_PORT              GPIOE\n#define LED_PIN               GPIO_PIN_9\n#define LED_STATE_ON          1\n\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE   1\n\n\n/**\n  * @brief  System Clock Configuration\n  *         The system Clock is configured as follow :\n  *            System Clock source            = PLL (HSE)\n  *            SYSCLK(Hz)                     = 72000000\n  *            HCLK(Hz)                       = 72000000\n  *            AHB Prescaler                  = 1\n  *            APB1 Prescaler                 = 2\n  *            APB2 Prescaler                 = 1\n  *            HSE Frequency(Hz)              = 8000000\n  *            HSE PREDIV                     = 1\n  *            PLLMUL                         = RCC_PLL_MUL9 (9)\n  *            Flash Latency(WS)              = 2\n  * @param  None\n  * @retval None\n  */\nstatic inline void SystemClock_Config(void) {\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n  RCC_PeriphCLKInitTypeDef RCC_PeriphClkInit;\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Configures the USB clock */\n  HAL_RCCEx_GetPeriphCLKConfig(&RCC_PeriphClkInit);\n  RCC_PeriphClkInit.USBClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;\n  HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphClkInit);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n  clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);\n\n  /* Enable Power Clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32f3/boards/stm32f303disco/board.mk",
    "content": "MCU_VARIANT = stm32f303xc\nCFLAGS += \\\n  -DSTM32F303xC \\\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/STM32F303VCTx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f303vc\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f3/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32f3xx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\n// USB defaults to using interrupts 19, 20 and 42, however, this BSP sets the\n// SYSCFG_CFGR1.USB_IT_RMP bit remapping interrupts to 74, 75 and 76.\n\n// FIXME: Do all three need to be handled, or just the LP one?\n// USB high-priority interrupt (Channel 74): Triggered only by a correct\n// transfer event for isochronous and double-buffer bulk transfer to reach\n// the highest possible transfer rate.\nvoid USB_HP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n// USB low-priority interrupt (Channel 75): Triggered by all USB events\n// (Correct transfer, USB reset, etc.). The firmware has to check the\n// interrupt source before serving the interrupt.\nvoid USB_LP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n// USB wakeup interrupt (Channel 76): Triggered by the wakeup event from the USB\n// Suspend mode.\nvoid USBWakeUp_RMP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n\nvoid board_init(void) {\n  SystemClock_Config();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  // Remap the USB interrupts\n  __HAL_RCC_SYSCFG_CLK_ENABLE();\n  __HAL_REMAPINTERRUPT_USB_ENABLE();\n\n  // LED\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n  GPIO_InitTypeDef GPIO_InitStruct;\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  // Button\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_PULLDOWN;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n  /* Configure USB DM and DP pins */\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF14_USB;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  // Enable USB clock\n  __HAL_RCC_USB_CLK_ENABLE();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState) (state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  asm(\"bkpt 0\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/stm32f3/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY f3)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m3 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32F3 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  #target_compile_options(${BOARD_TARGET} PUBLIC)\n  #target_compile_definitions(${BOARD_TARGET} PUBLIC)\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32F3)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f3/family.mk",
    "content": "ST_FAMILY = f3\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32F3\n\n# mcu driver cause following warnings\nCFLAGS_GCC += \\\n  -flto \\\n  -Wno-error=unused-parameter\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n  src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n  src/portable/st/stm32_fsdev/fsdev_common.c \\\n  $(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c\n\nINC += \\\n  $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n  $(TOP)/$(ST_CMSIS)/Include \\\n  $(TOP)/$(ST_HAL_DRIVER)/Inc \\\n  $(TOP)/$(BOARD_PATH)\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_${MCU_VARIANT}.s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_${MCU_VARIANT}.s\n\n# Linker\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32f3/stm32f3xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32f3xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32F3xx_HAL_CONF_H\n#define __STM32F3xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED */\n/* #define HAL_CAN_MODULE_ENABLED */\n/* #define HAL_CAN_LEGACY_MODULE_ENABLED */\n/* #define HAL_CEC_MODULE_ENABLED */\n/* #define HAL_COMP_MODULE_ENABLED */\n#define HAL_CORTEX_MODULE_ENABLED\n/* #define HAL_CRC_MODULE_ENABLED */\n/* #define HAL_DAC_MODULE_ENABLED */\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n/* #define HAL_SRAM_MODULE_ENABLED */\n/* #define HAL_NOR_MODULE_ENABLED */\n/* #define HAL_NAND_MODULE_ENABLED */\n/* #define HAL_PCCARD_MODULE_ENABLED */\n#define HAL_GPIO_MODULE_ENABLED\n/* #define HAL_EXTI_MODULE_ENABLED */\n/* #define HAL_HRTIM_MODULE_ENABLED */\n/* #define HAL_I2C_MODULE_ENABLED */\n/* #define HAL_I2S_MODULE_ENABLED */\n/* #define HAL_IRDA_MODULE_ENABLED */\n/* #define HAL_IWDG_MODULE_ENABLED */\n/* #define HAL_OPAMP_MODULE_ENABLED */\n/* #define HAL_PCD_MODULE_ENABLED */\n/* #define HAL_PWR_MODULE_ENABLED */\n#define HAL_RCC_MODULE_ENABLED\n/* #define HAL_RTC_MODULE_ENABLED */\n/* #define HAL_SDADC_MODULE_ENABLED */\n/* #define HAL_SMARTCARD_MODULE_ENABLED */\n/* #define HAL_SMBUS_MODULE_ENABLED */\n/* #define HAL_SPI_MODULE_ENABLED */\n/* #define HAL_TIM_MODULE_ENABLED */\n/* #define HAL_TSC_MODULE_ENABLED */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED */\n/* #define HAL_WWDG_MODULE_ENABLED */\n\n/* ########################## HSE/HSI Values adaptation ##################### */\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE    (8000000U) /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n/**\n  * @brief In the following line adjust the External High Speed oscillator (HSE) Startup\n  *        Timeout value\n  */\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    (100U)   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE    (8000000U) /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief In the following line adjust the Internal High Speed oscillator (HSI) Startup\n  *        Timeout value\n  */\n#if !defined  (HSI_STARTUP_TIMEOUT)\n #define HSI_STARTUP_TIMEOUT   (5000U) /*!< Time out for HSI start up */\n#endif /* HSI_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n #define LSI_VALUE  (40000U)\n#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.  */\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  */\n#if !defined  (LSE_VALUE)\n #define LSE_VALUE  (32768U)    /*!< Value of the External Low Speed oscillator in Hz */\n#endif /* LSE_VALUE */\n\n/**\n  * @brief Time out for LSE start up value in ms.\n  */\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    (5000U)   /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for I2S peripheral\n  *        This value is used by the I2S HAL module to compute the I2S clock source\n  *        frequency, this source is inserted directly through I2S_CKIN pad.\n  *        - External clock generated through external PLL component on EVAL 303 (based on MCO or crystal)\n  *        - External clock not generated on EVAL 373\n  */\n#if !defined  (EXTERNAL_CLOCK_VALUE)\n  #define EXTERNAL_CLOCK_VALUE    (8000000U) /*!< Value of the External oscillator in Hz*/\n#endif /* EXTERNAL_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    (3300U) /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            ((uint32_t)(1U<<__NVIC_PRIO_BITS) - 1U)   /*!< tick interrupt priority (lowest by default) */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U\n#define  INSTRUCTION_CACHE_ENABLE     0U\n#define  DATA_CACHE_ENABLE            0U\n#define  USE_SPI_CRC                  1U\n\n#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */\n#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */\n#define  USE_HAL_COMP_REGISTER_CALLBACKS        0U /* COMP register callback disabled      */\n#define  USE_HAL_CEC_REGISTER_CALLBACKS         0U /* CEC register callback disabled       */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS        0U /* SRAM register callback disabled      */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS       0U /* SMBUS register callback disabled     */\n#define  USE_HAL_SDADC_REGISTER_CALLBACKS       0U /* SDADC register callback disabled     */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS        0U /* NAND register callback disabled      */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS         0U /* NOR register callback disabled       */\n#define  USE_HAL_PCCARD_REGISTER_CALLBACKS      0U /* PCCARD register callback disabled    */\n#define  USE_HAL_HRTIM_REGISTER_CALLBACKS       0U /* HRTIM register callback disabled     */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */\n#define  USE_HAL_OPAMP_REGISTER_CALLBACKS       0U /* OPAMP register callback disabled     */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */\n#define  USE_HAL_TSC_REGISTER_CALLBACKS         0U /* TSC register callback disabled       */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/*#define USE_FULL_ASSERT    1U*/\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n #include \"stm32f3xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n #include \"stm32f3xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n  #include \"stm32f3xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32f3xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n #include \"stm32f3xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n #include \"stm32f3xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CAN_MODULE_ENABLED\n #include \"stm32f3xx_hal_can.h\"\n#endif /* HAL_CAN_MODULE_ENABLED */\n\n#ifdef HAL_CAN_LEGACY_MODULE_ENABLED\n #include \"stm32f3xx_hal_can_legacy.h\"\n#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */\n\n#ifdef HAL_CEC_MODULE_ENABLED\n #include \"stm32f3xx_hal_cec.h\"\n#endif /* HAL_CEC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n #include \"stm32f3xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n #include \"stm32f3xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n #include \"stm32f3xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n #include \"stm32f3xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32f3xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32f3xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n  #include \"stm32f3xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_PCCARD_MODULE_ENABLED\n  #include \"stm32f3xx_hal_pccard.h\"\n#endif /* HAL_PCCARD_MODULE_ENABLED */\n\n#ifdef HAL_HRTIM_MODULE_ENABLED\n #include \"stm32f3xx_hal_hrtim.h\"\n#endif /* HAL_HRTIM_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32f3xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32f3xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32f3xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32f3xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_OPAMP_MODULE_ENABLED\n #include \"stm32f3xx_hal_opamp.h\"\n#endif /* HAL_OPAMP_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32f3xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32f3xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32f3xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SDADC_MODULE_ENABLED\n #include \"stm32f3xx_hal_sdadc.h\"\n#endif /* HAL_SDADC_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32f3xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32f3xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32f3xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32f3xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_TSC_MODULE_ENABLED\n #include \"stm32f3xx_hal_tsc.h\"\n#endif /* HAL_TSC_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32f3xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32f3xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32f3xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t* file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32F3xx_HAL_CONF_H */\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32f4/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32f4xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/feather_stm32f405/STM32F405RGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F405RGTx Device with\n**                1024KByte FLASH, 128KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K\nCCMRAM (rw)      : ORIGIN = 0x10000000, LENGTH = 64K\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  _siccmram = LOADADDR(.ccmram);\n\n  /* CCM-RAM section\n  *\n  * IMPORTANT NOTE!\n  * If initialized variables will be placed in this section,\n  * the startup code needs to be modified to copy the init-values.\n  */\n  .ccmram :\n  {\n    . = ALIGN(4);\n    _sccmram = .;       /* create a global symbol at ccmram start */\n    *(.ccmram)\n    *(.ccmram*)\n\n    . = ALIGN(4);\n    _eccmram = .;       /* create a global symbol at ccmram end */\n  } >CCMRAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/feather_stm32f405/board.cmake",
    "content": "set(MCU_VARIANT stm32f405xx)\nset(JLINK_DEVICE stm32f405rg)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F405RGTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F405xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/feather_stm32f405/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Adafruit Feather STM32F405\n   url: https://www.adafruit.com/product/4382\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART3\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\n#define VBUS_SENSE_EN  1\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_1, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // BUTTON\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_7, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // UART TX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_11, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 336;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n\n  // Enable clocks for Uart\n  __HAL_RCC_USART3_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/feather_stm32f405/board.mk",
    "content": "CFLAGS += -DSTM32F405xx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f405xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F405RGTx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f405xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f405xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f405rg\n\n# flash target ROM bootloader\nflash: $(BUILD)/$(PROJECT).bin\n\tdfu-util -R -a 0 --dfuse-address 0x08000000 -D $<\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/pyboardv11/STM32F405RGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F405RGTx Device with\n**                1024KByte FLASH, 128KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K\nCCMRAM (rw)      : ORIGIN = 0x10000000, LENGTH = 64K\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  _siccmram = LOADADDR(.ccmram);\n\n  /* CCM-RAM section\n  *\n  * IMPORTANT NOTE!\n  * If initialized variables will be placed in this section,\n  * the startup code needs to be modified to copy the init-values.\n  */\n  .ccmram :\n  {\n    . = ALIGN(4);\n    _sccmram = .;       /* create a global symbol at ccmram start */\n    *(.ccmram)\n    *(.ccmram*)\n\n    . = ALIGN(4);\n    _eccmram = .;       /* create a global symbol at ccmram end */\n  } >CCMRAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/pyboardv11/board.cmake",
    "content": "set(MCU_VARIANT stm32f405xx)\nset(JLINK_DEVICE stm32f405rg)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F405RGTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F405xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/pyboardv11/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Pyboard v1.1\n   url: https://www.adafruit.com/product/2390\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART2\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\n#define VBUS_SENSE_EN  1\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_4, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // BUTTON\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 336;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n\n  // Enable clocks for Uart\n  __HAL_RCC_USART2_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/pyboardv11/board.mk",
    "content": "CFLAGS += -DSTM32F405xx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f405xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F405RGTx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f405xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f405xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f405rg\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f401blackpill/STM32F401VCTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F401VCTx Device with\n**                256KByte FLASH, 64KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20010000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;;      /* required amount of heap  */\n_Min_Stack_Size = 0x400;; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 256K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 64K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f401blackpill/board.cmake",
    "content": "set(MCU_VARIANT stm32f401xc)\nset(JLINK_DEVICE stm32f401cc)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F401VCTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F405xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f401blackpill/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F401 Blackpill\n   url: https://stm32-base.org/boards/STM32F401CCU6-WeAct-Black-Pill-V1.2\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Enable PA2 as the debug log UART\n#define UART_DEV              USART2\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\n#define VBUS_SENSE_EN  0\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // BUTTON\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 336;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);\n\n  // Enable clocks for Uart\n  __HAL_RCC_USART2_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f401blackpill/board.mk",
    "content": "CFLAGS += -DSTM32F401xC\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f401xc.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F401VCTx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f401xc.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f401xc_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f401cc\n\n# flash target ROM bootloader\nflash: $(BUILD)/$(PROJECT).bin\n\tdfu-util -R -a 0 --dfuse-address 0x08000000 -D $<\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f407blackvet/STM32F407VETx_FLASH.ld",
    "content": "/**\n ******************************************************************************\n * @file      LinkerScript.ld\n * @author    Auto-generated by STM32CubeIDE\n * @brief     Linker script for STM32F407VETx Device from STM32F4 series\n *                      512Kbytes FLASH\n *                      64Kbytes CCMRAM\n *                      128Kbytes RAM\n *\n *            Set heap size, stack size and stack location according\n *            to application requirements.\n *\n *            Set memory bank area and size if external memory is used\n ******************************************************************************\n * @attention\n *\n * <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.\n * All rights reserved.</center></h2>\n *\n * This software component is licensed by ST under BSD 3-Clause license,\n * the \"License\"; You may not use this file except in compliance with the\n * License. You may obtain a copy of the License at:\n *                        opensource.org/licenses/BSD-3-Clause\n *\n ******************************************************************************\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ;\t/* required amount of heap  */\n_Min_Stack_Size = 0x400 ;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f407blackvet/board.cmake",
    "content": "set(MCU_VARIANT stm32f407xx)\nset(JLINK_DEVICE stm32f407ve)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F407VETx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F407xx\n    HSE_VALUE=8000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f407blackvet/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F407 Blackvet\n   url: https://stm32-base.org/boards/STM32F407VET6-STM32-F4VE-V2.0\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Enable PA2 as the debug log UART\n#define UART_DEV              USART2\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\n#define VBUS_SENSE_EN  0\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_6, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // BUTTON\n    .port = GPIOE,\n    .pin_init = { .Pin = GPIO_PIN_4, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n};\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/2000000;\n  RCC_OscInitStruct.PLL.PLLN = 168;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n\n  // Enable clocks for LED, Button, Uart\n  __HAL_RCC_USART2_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f407blackvet/board.mk",
    "content": "CFLAGS += -DSTM32F407xx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f407xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F407VETx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f407xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f407xx_flash.icf\n\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f407vg\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f407disco/STM32F407VGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F407VGTx Device with\n**                1024KByte FLASH, 128KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x1000;      /* required amount of heap  */\n_Min_Stack_Size = 0x4000; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\n  RAM (xrw)    : ORIGIN = 0x20000000, LENGTH = 128K\n  CCMRAM (rw)  : ORIGIN = 0x10000000, LENGTH = 64K\n  FLASH (rx)   : ORIGIN = 0x8000000, LENGTH = 1024K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  _siccmram = LOADADDR(.ccmram);\n\n  /* CCM-RAM section\n  *\n  * IMPORTANT NOTE!\n  * If initialized variables will be placed in this section,\n  * the startup code needs to be modified to copy the init-values.\n  */\n  .ccmram :\n  {\n    . = ALIGN(4);\n    _sccmram = .;       /* create a global symbol at ccmram start */\n    *(.ccmram)\n    *(.ccmram*)\n\n    . = ALIGN(4);\n    _eccmram = .;       /* create a global symbol at ccmram end */\n  } >CCMRAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f407disco/board.cmake",
    "content": "set(MCU_VARIANT stm32f407xx)\nset(JLINK_DEVICE stm32f407vg)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F407VGTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F407xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f407disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F407 Discovery\n   url: https://www.st.com/en/evaluation-tools/stm32f4discovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Enable PA2 as the debug log UART\n// It is not routed to the ST/Link on the Discovery board.\n#define UART_DEV              USART2\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\n#define VBUS_SENSE_EN  1\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_14, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // BUTTON\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 336;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n\n  // Enable clocks Uart\n  __HAL_RCC_USART2_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f407disco/board.mk",
    "content": "CFLAGS += -DSTM32F407xx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f407xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F407VGTx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f407xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f407xx_flash.icf\n\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f407vg\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f411blackpill/STM32F411CEUx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F411CEUx Device with\n**                512KByte FLASH, 128KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;;      /* required amount of heap  */\n_Min_Stack_Size = 0x400;; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(4);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(4);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f411blackpill/board.cmake",
    "content": "set(MCU_VARIANT stm32f411xe)\nset(JLINK_DEVICE stm32f411ce)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F411CEUx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F411xE\n    HSE_VALUE=25000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f411blackpill/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F411 Blackpill\n   url: https://stm32-base.org/boards/STM32F411CEU6-WeAct-Black-Pill-V2.0\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART2\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\n#define VBUS_SENSE_EN  0\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // BUTTON\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 336;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);\n\n  // Enable clocks for Uart\n  __HAL_RCC_USART2_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f411blackpill/board.mk",
    "content": "CFLAGS += -DSTM32F411xE -DHSE_VALUE=25000000\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f411xe.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F411CEUx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f411xe.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f411xe_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f411ce\n\n# flash target ROM bootloader\nflash: $(BUILD)/$(PROJECT).bin\n\tdfu-util -R -a 0 --dfuse-address 0x08000000 -D $<\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f411disco/STM32F411VETx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F411VETx Device with\n**                512KByte FLASH, 128KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;;      /* required amount of heap  */\n_Min_Stack_Size = 0x400;; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 512K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f411disco/board.cmake",
    "content": "set(MCU_VARIANT stm32f411xe)\nset(JLINK_DEVICE stm32f411ve)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F411VETx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F411xE\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f411disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F411 Discovery\n   url: https://www.st.com/en/evaluation-tools/32f411ediscovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART2\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\n#define VBUS_SENSE_EN  1\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // BUTTON\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void) {\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 336;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV4;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);\n\n  // Enable clocks for UART\n  __HAL_RCC_USART2_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f411disco/board.mk",
    "content": "CFLAGS += -DSTM32F411xE\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f411xe.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F411VETx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f411xe.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f411xe_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f411ve\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f412disco/STM32F412ZGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F412ZGTx Device with\n**                1024KByte FLASH, 256KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20040000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 256K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f412disco/board.cmake",
    "content": "set(MCU_VARIANT stm32f412zx)\nset(JLINK_DEVICE stm32f412zg)\n# set(JLINK_OPTION \"-USB 000771775987\")\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F412ZGTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F412Zx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f412disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F412 Discovery\n   url: https://www.st.com/en/evaluation-tools/32f412gdiscovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART Enable PA2 as the debug log UART\n#define UART_DEV              USART2\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\n#define VBUS_SENSE_EN  1\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOE,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // BUTTON\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART2 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void) {\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the\n   * device is clocked below the maximum system frequency, to update the\n   * voltage scaling value regarding system frequency refer to product\n   * datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 200;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLLSAI output as USB clock source */\n  PeriphClkInitStruct.PLLI2S.PLLI2SM = 8;\n  PeriphClkInitStruct.PLLI2S.PLLI2SQ = 4;\n  PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CK48;\n  PeriphClkInitStruct.Clk48ClockSelection = RCC_CK48CLKSOURCE_PLLI2SQ;\n  PeriphClkInitStruct.PLLI2SSelection = RCC_PLLI2SCLKSOURCE_PLLSRC;\n  PeriphClkInitStruct.PLLI2S.PLLI2SR = 7;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n   * clocks dividers */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |\n                                RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\n\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);\n\n  // Enable clocks for Uart\n  __HAL_RCC_USART2_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f412disco/board.mk",
    "content": "CFLAGS += -DSTM32F412Zx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f412zx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F412ZGTx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f412zx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f412zx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f412zg\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f412nucleo/STM32F412ZGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F412ZGTx Device with\n**                1024KByte FLASH, 256KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20040000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 256K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f412nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32f412zx)\nset(JLINK_DEVICE stm32f412zg)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F412ZGTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F412Zx\n    BOARD_TUD_RHPORT=0\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f412nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F412 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-f412zg.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART Enable for STLink VCOM\n#define UART_DEV              USART3\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\n#define VBUS_SENSE_EN  1\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_14, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // BUTTON\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_6, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the\n   * device is clocked below the maximum system frequency, to update the\n   * voltage scaling value regarding system frequency refer to product\n   * datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 200;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLLSAI output as USB clock source */\n  PeriphClkInitStruct.PLLI2S.PLLI2SM = 8;\n  PeriphClkInitStruct.PLLI2S.PLLI2SQ = 4;\n  PeriphClkInitStruct.PLLI2S.PLLI2SN = 192;\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_CK48;\n  PeriphClkInitStruct.Clk48ClockSelection = RCC_CK48CLKSOURCE_PLLI2SQ;\n  PeriphClkInitStruct.PLLI2SSelection = RCC_PLLI2SCLKSOURCE_PLLSRC;\n  PeriphClkInitStruct.PLLI2S.PLLI2SR = 7;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n   * clocks dividers */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |\n                                RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\n\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);\n\n  // Enable clocks for Uart\n  __HAL_RCC_USART3_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f412nucleo/board.mk",
    "content": "CFLAGS += -DSTM32F412Zx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f412zx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F412ZGTx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f412zx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f412zx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f412zg\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f439nucleo/STM32F439ZITX_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n** @file        : LinkerScript.ld\n**\n** @author      : Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for NUCLEO-F439ZI Board embedding STM32F439ZITx Device from stm32f4 series\n**                      2048Kbytes FLASH\n**                      64Kbytes CCMRAM\n**                      192Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n******************************************************************************\n** @attention\n**\n** Copyright (c) 2021 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  CCMRAM    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 192K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 2048K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  _siccmram = LOADADDR(.ccmram);\n\n  /* CCM-RAM section\n  *\n  * IMPORTANT NOTE!\n  * If initialized variables will be placed in this section,\n  * the startup code needs to be modified to copy the init-values.\n  */\n  .ccmram :\n  {\n    . = ALIGN(4);\n    _sccmram = .;       /* create a global symbol at ccmram start */\n    *(.ccmram)\n    *(.ccmram*)\n\n    . = ALIGN(4);\n    _eccmram = .;       /* create a global symbol at ccmram end */\n  } >CCMRAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f439nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32f439xx)\nset(JLINK_DEVICE stm32f439zi)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F439ZITX_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F439xx\n    BOARD_TUD_RHPORT=0\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f439nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F439 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-f439zi.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n\n// UART Enable for STLink VCOM\n#define UART_DEV              USART3\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\n#define VBUS_SENSE_EN  1\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_14, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // BUTTON\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_6, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the\n   * device is clocked below the maximum system frequency, to update the\n   * voltage scaling value regarding system frequency refer to product\n   * datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 336;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n   * clocks dividers */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |\n                                RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\n\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n\n  // Enable clocks Uart\n  __HAL_RCC_USART3_CLK_ENABLE();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f4/boards/stm32f439nucleo/board.mk",
    "content": "CFLAGS += -DSTM32F439xx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32f439xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32F439ZITX_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32f439xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32f439xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f439zi\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f4/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32f4xx_hal.h\"\n#include \"bsp/board_api.h\"\n\ntypedef struct {\n  GPIO_TypeDef* port;\n  GPIO_InitTypeDef pin_init;\n  uint8_t active_state;\n} board_pindef_t;\n\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTG_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid OTG_HS_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#ifdef UART_DEV\nstatic UART_HandleTypeDef UartHandle = {\n    .Instance = UART_DEV,\n    .Init = {\n      .BaudRate   = CFG_BOARD_UART_BAUDRATE,\n      .WordLength = UART_WORDLENGTH_8B,\n      .StopBits   = UART_STOPBITS_1,\n      .Parity     = UART_PARITY_NONE,\n      .HwFlowCtl  = UART_HWCONTROL_NONE,\n      .Mode       = UART_MODE_TX_RX,\n      .OverSampling = UART_OVERSAMPLING_16\n    }\n};\n#endif\n\nvoid board_init(void) {\n  board_clock_init();\n  //SystemCoreClockUpdate();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n#ifdef __HAL_RCC_GPIOE_CLK_ENABLE\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n#endif\n#ifdef __HAL_RCC_GPIOF_CLK_ENABLE\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n#endif\n#ifdef __HAL_RCC_GPIOG_CLK_ENABLE\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n#endif\n  __HAL_RCC_GPIOH_CLK_ENABLE();\n#ifdef __HAL_RCC_GPIOI_CLK_ENABLE\n  __HAL_RCC_GPIOI_CLK_ENABLE();\n#endif\n#ifdef __HAL_RCC_GPIOJ_CLK_ENABLE\n  __HAL_RCC_GPIOJ_CLK_ENABLE();\n#endif\n\n  for (uint8_t i = 0; i < TU_ARRAY_SIZE(board_pindef); i++) {\n    HAL_GPIO_Init(board_pindef[i].port, &board_pindef[i].pin_init);\n  }\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  board_led_write(false);\n\n#ifdef UART_DEV\n  HAL_UART_Init(&UartHandle);\n#endif\n\n  //------------- USB FS -------------//\n  GPIO_InitTypeDef GPIO_InitStruct;\n\n  /* Configure USB D+ D- Pins */\n  GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;\n  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Configure VBUS Pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_9;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* ID Pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_10;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  // Enable USB OTG clock\n  __HAL_RCC_USB_OTG_FS_CLK_ENABLE();\n\n  //------------- USB HS -------------//\n#ifdef __HAL_RCC_USB_OTG_HS_CLK_ENABLE\n  GPIO_InitStruct.Pin = GPIO_PIN_14 | GPIO_PIN_15;\n  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS;\n  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n  /* Configure VBUS Pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_13;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n  /* ID Pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_12;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS;\n  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n  // Enable USB OTG clock\n  __HAL_RCC_USB_OTG_HS_CLK_ENABLE();\n#endif\n\n#ifdef STM32F412Zx\n  /* Configure POWER_SWITCH IO pin */\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n  GPIO_InitStruct.Pin = GPIO_PIN_8;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);\n#endif\n\n#if CFG_TUD_ENABLED\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = VBUS_SENSE_EN;\n  tud_configure(BOARD_TUD_RHPORT, TUD_CFGID_DWC2, &cfg);\n  board_vbus_set(BOARD_TUD_RHPORT, false);\n#endif\n\n#if CFG_TUH_ENABLED\n  board_vbus_set(BOARD_TUH_RHPORT, true);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n#ifdef PINID_LED\n  board_pindef_t* pindef = &board_pindef[PINID_LED];\n  GPIO_PinState pin_state = state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET;\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, pin_state);\n#else\n  (void) state;\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef PINID_BUTTON\n  board_pindef_t* pindef = &board_pindef[PINID_BUTTON];\n  return pindef->active_state == HAL_GPIO_ReadPin(pindef->port, pindef->pin_init.Pin);\n#else\n  return 0;\n#endif\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t *) (uintptr_t) buf, len, 0xffff);\n  return len;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32f4/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY f4)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32F4 CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif ()\n\nif (NOT DEFINED RHPORT_SPEED)\n  # Most F7 does not has built-in HS PHY\n  set(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_FULL_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\ncmake_print_variables(RHPORT_DEVICE RHPORT_DEVICE_SPEED RHPORT_HOST RHPORT_HOST_SPEED)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32F4)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f4/family.mk",
    "content": "UF2_FAMILY_ID = 0x57755a57\nST_FAMILY = f4\n\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nRHPORT_SPEED ?= OPT_MODE_FULL_SPEED OPT_MODE_FULL_SPEED\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 0\n\n# Determine RHPORT_DEVICE_SPEED if not defined\nifndef RHPORT_DEVICE_SPEED\nifeq ($(RHPORT_DEVICE), 0)\n  RHPORT_DEVICE_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_DEVICE_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# Determine RHPORT_HOST_SPEED if not defined\nifndef RHPORT_HOST_SPEED\nifeq ($(RHPORT_HOST), 0)\n  RHPORT_HOST_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_HOST_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32F4 \\\n\t-DBOARD_TUD_RHPORT=${RHPORT_DEVICE} \\\n\t-DBOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED} \\\n\t-DBOARD_TUH_RHPORT=${RHPORT_HOST} \\\n\t-DBOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED} \\\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += -Wno-error=cast-align\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_dma.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c\n\nINC += \\\n\t$(TOP)/hw/bsp/stm32$(ST_FAMILY) \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f4/stm32f4xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32f4xx_hal_conf_template.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32F4xx_HAL_CONF_H\n#define __STM32F4xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED      */\n/* #define HAL_CAN_MODULE_ENABLED      */\n/* #define HAL_CAN_LEGACY_MODULE_ENABLED      */\n/* #define HAL_CRC_MODULE_ENABLED      */\n/* #define HAL_CEC_MODULE_ENABLED      */\n/* #define HAL_CRYP_MODULE_ENABLED     */\n/* #define HAL_DAC_MODULE_ENABLED      */\n/* #define HAL_DCMI_MODULE_ENABLED     */\n#define HAL_DMA_MODULE_ENABLED\n/* #define HAL_DMA2D_MODULE_ENABLED    */\n/* #define HAL_ETH_MODULE_ENABLED      */\n#define HAL_FLASH_MODULE_ENABLED\n/* #define HAL_NAND_MODULE_ENABLED     */\n/* #define HAL_NOR_MODULE_ENABLED      */\n/* #define HAL_PCCARD_MODULE_ENABLED   */\n/* #define HAL_SRAM_MODULE_ENABLED     */\n/* #define HAL_SDRAM_MODULE_ENABLED    */\n/* #define HAL_HASH_MODULE_ENABLED     */\n#define HAL_GPIO_MODULE_ENABLED\n/* #define HAL_EXTI_MODULE_ENABLED     */\n/* #define HAL_I2C_MODULE_ENABLED      */\n/* #define HAL_SMBUS_MODULE_ENABLED    */\n/* #define HAL_I2S_MODULE_ENABLED      */\n/* #define HAL_IWDG_MODULE_ENABLED     */\n/* #define HAL_LTDC_MODULE_ENABLED     */\n/* #define HAL_DSI_MODULE_ENABLED      */\n#define HAL_PWR_MODULE_ENABLED\n/* #define HAL_QSPI_MODULE_ENABLED     */\n#define HAL_RCC_MODULE_ENABLED\n/* #define HAL_RNG_MODULE_ENABLED      */\n/* #define HAL_RTC_MODULE_ENABLED      */\n/* #define HAL_SAI_MODULE_ENABLED      */\n/* #define HAL_SD_MODULE_ENABLED       */\n// #define HAL_SPI_MODULE_ENABLED\n/* #define HAL_TIM_MODULE_ENABLED      */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED    */\n/* #define HAL_IRDA_MODULE_ENABLED     */\n/* #define HAL_SMARTCARD_MODULE_ENABLED */\n/* #define HAL_WWDG_MODULE_ENABLED     */\n#define HAL_CORTEX_MODULE_ENABLED\n/* #define HAL_PCD_MODULE_ENABLED      */\n/* #define HAL_HCD_MODULE_ENABLED      */\n/* #define HAL_FMPI2C_MODULE_ENABLED   */\n/* #define HAL_SPDIFRX_MODULE_ENABLED  */\n/* #define HAL_DFSDM_MODULE_ENABLED    */\n/* #define HAL_LPTIM_MODULE_ENABLED    */\n/* #define HAL_MMC_MODULE_ENABLED      */\n\n/* ########################## HSE/HSI Values adaptation ##################### */\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE    (8000000U) /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    (100U)   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE    (16000000U) /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n #define LSI_VALUE  (32000U)\n#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.  */\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  */\n#if !defined  (LSE_VALUE)\n #define LSE_VALUE  (32768U)    /*!< Value of the External Low Speed oscillator in Hz */\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    (5000U)   /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for I2S peripheral\n  *        This value is used by the I2S HAL module to compute the I2S clock source\n  *        frequency, this source is inserted directly through I2S_CKIN pad.\n  */\n#if !defined  (EXTERNAL_CLOCK_VALUE)\n  #define EXTERNAL_CLOCK_VALUE    (12288000U) /*!< Value of the External oscillator in Hz*/\n#endif /* EXTERNAL_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    (3300U) /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            (0x0FU) /*!< tick interrupt priority */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U\n#define  INSTRUCTION_CACHE_ENABLE     1U\n#define  DATA_CACHE_ENABLE            1U\n\n#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */\n#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */\n#define  USE_HAL_CEC_REGISTER_CALLBACKS         0U /* CEC register callback disabled       */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS        0U /* CRYP register callback disabled      */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */\n#define  USE_HAL_DCMI_REGISTER_CALLBACKS        0U /* DCMI register callback disabled      */\n#define  USE_HAL_DFSDM_REGISTER_CALLBACKS       0U /* DFSDM register callback disabled     */\n#define  USE_HAL_DMA2D_REGISTER_CALLBACKS       0U /* DMA2D register callback disabled     */\n#define  USE_HAL_DSI_REGISTER_CALLBACKS         0U /* DSI register callback disabled       */\n#define  USE_HAL_ETH_REGISTER_CALLBACKS         0U /* ETH register callback disabled       */\n#define  USE_HAL_HASH_REGISTER_CALLBACKS        0U /* HASH register callback disabled      */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS         0U /* HCD register callback disabled       */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */\n#define  USE_HAL_FMPI2C_REGISTER_CALLBACKS      0U /* FMPI2C register callback disabled    */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */\n#define  USE_HAL_LPTIM_REGISTER_CALLBACKS       0U /* LPTIM register callback disabled     */\n#define  USE_HAL_LTDC_REGISTER_CALLBACKS        0U /* LTDC register callback disabled      */\n#define  USE_HAL_MMC_REGISTER_CALLBACKS         0U /* MMC register callback disabled       */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS        0U /* NAND register callback disabled      */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS         0U /* NOR register callback disabled       */\n#define  USE_HAL_PCCARD_REGISTER_CALLBACKS      0U /* PCCARD register callback disabled    */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */\n#define  USE_HAL_QSPI_REGISTER_CALLBACKS        0U /* QSPI register callback disabled      */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS         0U /* RNG register callback disabled       */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */\n#define  USE_HAL_SAI_REGISTER_CALLBACKS         0U /* SAI register callback disabled       */\n#define  USE_HAL_SD_REGISTER_CALLBACKS          0U /* SD register callback disabled        */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_SDRAM_REGISTER_CALLBACKS       0U /* SDRAM register callback disabled     */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS        0U /* SRAM register callback disabled      */\n#define  USE_HAL_SPDIFRX_REGISTER_CALLBACKS     0U /* SPDIFRX register callback disabled   */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS       0U /* SMBUS register callback disabled     */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## Ethernet peripheral configuration ##################### */\n\n/* Section 1 : Ethernet peripheral configuration */\n\n/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */\n#define MAC_ADDR0   2U\n#define MAC_ADDR1   0U\n#define MAC_ADDR2   0U\n#define MAC_ADDR3   0U\n#define MAC_ADDR4   0U\n#define MAC_ADDR5   0U\n\n/* Definition of the Ethernet driver buffers size and count */\n#define ETH_RX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for receive               */\n#define ETH_TX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for transmit              */\n#define ETH_RXBUFNB                    4U                  /* 4 Rx buffers of size ETH_RX_BUF_SIZE  */\n#define ETH_TXBUFNB                    4U                  /* 4 Tx buffers of size ETH_TX_BUF_SIZE  */\n\n/* Section 2: PHY configuration section */\n\n/* DP83848 PHY Address*/\n#define DP83848_PHY_ADDRESS             0x01U\n/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/\n#define PHY_RESET_DELAY                 0x000000FFU\n/* PHY Configuration delay */\n#define PHY_CONFIG_DELAY                0x00000FFFU\n\n#define PHY_READ_TO                     0x0000FFFFU\n#define PHY_WRITE_TO                    0x0000FFFFU\n\n/* Section 3: Common PHY Registers */\n\n#define PHY_BCR                         ((uint16_t)0x0000)  /*!< Transceiver Basic Control Register   */\n#define PHY_BSR                         ((uint16_t)0x0001)  /*!< Transceiver Basic Status Register    */\n\n#define PHY_RESET                       ((uint16_t)0x8000)  /*!< PHY Reset */\n#define PHY_LOOPBACK                    ((uint16_t)0x4000)  /*!< Select loop-back mode */\n#define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100)  /*!< Set the full-duplex mode at 100 Mb/s */\n#define PHY_HALFDUPLEX_100M             ((uint16_t)0x2000)  /*!< Set the half-duplex mode at 100 Mb/s */\n#define PHY_FULLDUPLEX_10M              ((uint16_t)0x0100)  /*!< Set the full-duplex mode at 10 Mb/s  */\n#define PHY_HALFDUPLEX_10M              ((uint16_t)0x0000)  /*!< Set the half-duplex mode at 10 Mb/s  */\n#define PHY_AUTONEGOTIATION             ((uint16_t)0x1000)  /*!< Enable auto-negotiation function     */\n#define PHY_RESTART_AUTONEGOTIATION     ((uint16_t)0x0200)  /*!< Restart auto-negotiation function    */\n#define PHY_POWERDOWN                   ((uint16_t)0x0800)  /*!< Select the power down mode           */\n#define PHY_ISOLATE                     ((uint16_t)0x0400)  /*!< Isolate PHY from MII                 */\n\n#define PHY_AUTONEGO_COMPLETE           ((uint16_t)0x0020)  /*!< Auto-Negotiation process completed   */\n#define PHY_LINKED_STATUS               ((uint16_t)0x0004)  /*!< Valid link established               */\n#define PHY_JABBER_DETECTION            ((uint16_t)0x0002)  /*!< Jabber condition detected            */\n\n/* Section 4: Extended PHY Registers */\n\n#define PHY_SR                          ((uint16_t)0x0010)  /*!< PHY status register Offset                      */\n#define PHY_MICR                        ((uint16_t)0x0011)  /*!< MII Interrupt Control Register                  */\n#define PHY_MISR                        ((uint16_t)0x0012)  /*!< MII Interrupt Status and Misc. Control Register */\n\n#define PHY_LINK_STATUS                 ((uint16_t)0x0001)  /*!< PHY Link mask                                   */\n#define PHY_SPEED_STATUS                ((uint16_t)0x0002)  /*!< PHY Speed mask                                  */\n#define PHY_DUPLEX_STATUS               ((uint16_t)0x0004)  /*!< PHY Duplex mask                                 */\n\n#define PHY_MICR_INT_EN                 ((uint16_t)0x0002)  /*!< PHY Enable interrupts                           */\n#define PHY_MICR_INT_OE                 ((uint16_t)0x0001)  /*!< PHY Enable output interrupt events              */\n\n#define PHY_MISR_LINK_INT_EN            ((uint16_t)0x0020)  /*!< Enable Interrupt on change of link status       */\n#define PHY_LINK_INTERRUPT              ((uint16_t)0x2000)  /*!< PHY link status interrupt mask                  */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n* Activated: CRC code is present inside driver\n* Deactivated: CRC code cleaned from driver\n*/\n\n#define USE_SPI_CRC                     1U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32f4xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32f4xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n  #include \"stm32f4xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32f4xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32f4xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32f4xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CAN_MODULE_ENABLED\n  #include \"stm32f4xx_hal_can.h\"\n#endif /* HAL_CAN_MODULE_ENABLED */\n\n#ifdef HAL_CAN_LEGACY_MODULE_ENABLED\n  #include \"stm32f4xx_hal_can_legacy.h\"\n#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32f4xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32f4xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DMA2D_MODULE_ENABLED\n  #include \"stm32f4xx_hal_dma2d.h\"\n#endif /* HAL_DMA2D_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n  #include \"stm32f4xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_DCMI_MODULE_ENABLED\n  #include \"stm32f4xx_hal_dcmi.h\"\n#endif /* HAL_DCMI_MODULE_ENABLED */\n\n#ifdef HAL_ETH_MODULE_ENABLED\n  #include \"stm32f4xx_hal_eth.h\"\n#endif /* HAL_ETH_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32f4xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32f4xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32f4xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n  #include \"stm32f4xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_PCCARD_MODULE_ENABLED\n  #include \"stm32f4xx_hal_pccard.h\"\n#endif /* HAL_PCCARD_MODULE_ENABLED */\n\n#ifdef HAL_SDRAM_MODULE_ENABLED\n  #include \"stm32f4xx_hal_sdram.h\"\n#endif /* HAL_SDRAM_MODULE_ENABLED */\n\n#ifdef HAL_HASH_MODULE_ENABLED\n #include \"stm32f4xx_hal_hash.h\"\n#endif /* HAL_HASH_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32f4xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32f4xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32f4xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32f4xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LTDC_MODULE_ENABLED\n #include \"stm32f4xx_hal_ltdc.h\"\n#endif /* HAL_LTDC_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32f4xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n #include \"stm32f4xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32f4xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n #include \"stm32f4xx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n #include \"stm32f4xx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32f4xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32f4xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32f4xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32f4xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32f4xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32f4xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32f4xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32f4xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n #include \"stm32f4xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_DSI_MODULE_ENABLED\n #include \"stm32f4xx_hal_dsi.h\"\n#endif /* HAL_DSI_MODULE_ENABLED */\n\n#ifdef HAL_QSPI_MODULE_ENABLED\n #include \"stm32f4xx_hal_qspi.h\"\n#endif /* HAL_QSPI_MODULE_ENABLED */\n\n#ifdef HAL_CEC_MODULE_ENABLED\n #include \"stm32f4xx_hal_cec.h\"\n#endif /* HAL_CEC_MODULE_ENABLED */\n\n#ifdef HAL_FMPI2C_MODULE_ENABLED\n #include \"stm32f4xx_hal_fmpi2c.h\"\n#endif /* HAL_FMPI2C_MODULE_ENABLED */\n\n#ifdef HAL_SPDIFRX_MODULE_ENABLED\n #include \"stm32f4xx_hal_spdifrx.h\"\n#endif /* HAL_SPDIFRX_MODULE_ENABLED */\n\n#ifdef HAL_DFSDM_MODULE_ENABLED\n #include \"stm32f4xx_hal_dfsdm.h\"\n#endif /* HAL_DFSDM_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n #include \"stm32f4xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_MMC_MODULE_ENABLED\n #include \"stm32f4xx_hal_mmc.h\"\n#endif /* HAL_MMC_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t* file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32F4xx_HAL_CONF_H */\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32f7/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32f7xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stlinkv3mini/STM32F723xE_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F723xE Device with\n**                512KByte FLASH, 256KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20040000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x460; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 256K\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 512K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stlinkv3mini/board.cmake",
    "content": "set(MCU_VARIANT stm32f723xx)\nset(JLINK_DEVICE stm32f723xx)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F723xE_FLASH.ld)\n\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 1)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F723xx\n    HSE_VALUE=25000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stlinkv3mini/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Stlink-v3 mini\n   url: https://www.st.com/en/development-tools/stlink-v3mini.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART6\n#define UART_CLK_EN           __HAL_RCC_USART6_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_UART_TX  1\n#define PINID_UART_RX  2\n//#define PINID_VBUS0_EN 4\n//#define PINID_VBUS1_EN 5\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF8_USART6 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_14, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF8_USART6 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 432;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 9;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Activate the OverDrive to reach the 216 MHz Frequency */\n  HAL_PWREx_EnableOverDrive();\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7);\n\n  UART_CLK_EN();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stlinkv3mini/board.mk",
    "content": "MCU_VARIANT = stm32f723xx\n\n# Only OTG-HS has a connector on this board\nRHPORT_SPEED = OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 1\n\nPORT ?= 1\nSPEED ?= high\n\nCFLAGS += \\\n  -DSTM32F723xx \\\n  -DHSE_VALUE=25000000 \\\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F723xE_FLASH.ld\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f723disco/STM32F723xE_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F723xE Device with\n**                512KByte FLASH, 256KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20040000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x460; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 256K\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 512K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f723disco/board.cmake",
    "content": "set(MCU_VARIANT stm32f723xx)\nset(JLINK_DEVICE stm32f723ie)\n#set(JLINK_OPTION \"-USB 000776606156\")\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F723xE_FLASH.ld)\n\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\n# For Hardware test: device default to PORT 0, Host to port 1\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 1)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F723xx\n    HSE_VALUE=25000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f723disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F723 Discovery\n   url: https://www.st.com/en/evaluation-tools/32f723ediscovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART6\n#define UART_CLK_EN           __HAL_RCC_USART6_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     1\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n#define PINID_VBUS1_EN 5\n\nstatic board_pindef_t board_pindef[] = {\n{ // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_1, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n{ // Button\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n{ // UART TX\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_6, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF8_USART6 },\n    .active_state = 0\n  },\n{ // UART RX\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_7, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF8_USART6 },\n    .active_state = 0\n  },\n{ // VBUS0 EN\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_OUTPUT_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n{ // VBUS1 EN\n    .port = GPIOH,\n    .pin_init = { .Pin = GPIO_PIN_12, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void) {\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE / 1000000;\n  RCC_OscInitStruct.PLL.PLLN = 432;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 9;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Activate the OverDrive to reach the 216 MHz Frequency */\n  HAL_PWREx_EnableOverDrive();\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7);\n\n  UART_CLK_EN();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  board_pindef_t* pindef = &board_pindef[rhport ? PINID_VBUS1_EN : PINID_VBUS0_EN];\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f723disco/board.mk",
    "content": "MCU_VARIANT = stm32f723xx\n\n# For Hardware test: device default to PORT 0, Host to port 1\nRHPORT_SPEED = OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 1\n\nCFLAGS += \\\n  -DSTM32F723xx \\\n  -DHSE_VALUE=25000000 \\\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F723xE_FLASH.ld\n\n# flash target using on-board stlink\nflash: flash-stlink\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f723ie\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f746disco/STM32F746ZGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F746ZGTx Device with\n**                1024KByte FLASH, 320KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20050000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x460; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f746disco/board.cmake",
    "content": "set(MCU_VARIANT stm32f746xx)\nset(JLINK_DEVICE stm32f746xx)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F746ZGTx_FLASH.ld)\n\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F746xx\n    HSE_VALUE=25000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f746disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F746 Discovery\n   url: https://www.st.com/en/evaluation-tools/32f746gdiscovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART1\n#define UART_CLK_EN           __HAL_RCC_USART1_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     1\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n//#define PINID_VBUS0_EN 4\n//#define PINID_VBUS1_EN 5\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOI,\n    .pin_init = { .Pin = GPIO_PIN_1, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n   .port = GPIOI,\n   .pin_init = { .Pin = GPIO_PIN_11, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n   .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART1 },\n    .active_state = 0\n  },\n  { // UART RX\n   .port = GPIOB,\n   .pin_init = { .Pin = GPIO_PIN_7, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART1 },\n   .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 432;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 9;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Activate the OverDrive to reach the 216 MHz Frequency */\n  HAL_PWREx_EnableOverDrive();\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7);\n\n  UART_CLK_EN();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f746disco/board.mk",
    "content": "MCU_VARIANT = stm32f746xx\n\nRHPORT_SPEED = OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nPORT ?= 1\nSPEED ?= high\n\nCFLAGS += \\\n  -DSTM32F746xx \\\n  -DHSE_VALUE=25000000\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F746ZGTx_FLASH.ld\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f746nucleo/STM32F746ZGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F746ZGTx Device with\n**                1024KByte FLASH, 320KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20050000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x460; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 320K\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f746nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32f746xx)\nset(JLINK_DEVICE stm32f746xx)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F746ZGTx_FLASH.ld)\n\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F746xx\n    HSE_VALUE=8000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f746nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F746 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-f746zg.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n//#define PINID_VBUS0_EN 4\n//#define PINID_VBUS1_EN 5\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_14, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n};\n\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 432;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 9;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  // TODO need to enable usb clock source\n\n  /* Activate the OverDrive to reach the 216 MHz Frequency */\n  HAL_PWREx_EnableOverDrive();\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7);\n\n  UART_CLK_EN();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f746nucleo/board.mk",
    "content": "MCU_VARIANT = stm32f746xx\n\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 0\n\nPORT ?= 0\nSPEED ?= full\n\nCFLAGS += \\\n  -DSTM32F746xx \\\n  -DHSE_VALUE=8000000\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F746ZGTx_FLASH.ld\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f767nucleo/STM32F767ZITx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F767ZITx Device with\n**                2048KByte FLASH, 512KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20080000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 2048K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 512K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f767nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32f767xx)\nset(JLINK_DEVICE stm32f767zi)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F767ZITx_FLASH.ld)\n\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F767xx\n    HSE_VALUE=8000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f767nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F767 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-f767zi.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n//#define PINID_VBUS0_EN 4\n//#define PINID_VBUS1_EN 5\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_14, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 432;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 9;\n  RCC_OscInitStruct.PLL.PLLR = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Activate the OverDrive to reach the 216 MHz Frequency */\n  HAL_PWREx_EnableOverDrive();\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7);\n\n  UART_CLK_EN();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f767nucleo/board.mk",
    "content": "MCU_VARIANT = stm32f767xx\n\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 0\n\nPORT ?= 0\nSPEED ?= full\n\nCFLAGS += \\\n  -DSTM32F767xx \\\n\t-DHSE_VALUE=8000000 \\\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F767ZITx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32f767zi\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f769disco/STM32F769ZITx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32F767ZITx Device with\n**                2048KByte FLASH, 512KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20080000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 2048K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 512K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f769disco/board.cmake",
    "content": "set(MCU_VARIANT stm32f769xx)\nset(JLINK_DEVICE stm32f769ni)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F769ZITx_FLASH.ld)\n\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 1)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32F769xx\n    HSE_VALUE=25000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f769disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 F769 Discovery\n   url: https://www.st.com/en/evaluation-tools/32f769idiscovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART1\n#define UART_CLK_EN           __HAL_RCC_USART1_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n//#define PINID_VBUS0_EN 4\n//#define PINID_VBUS1_EN 5\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOJ,\n    .pin_init = { .Pin = GPIO_PIN_12, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART1 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART1 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n\n  /* Enable Power Control clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 432;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 9;\n  RCC_OscInitStruct.PLL.PLLR = 7;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Activate the OverDrive to reach the 216 MHz Frequency */\n  HAL_PWREx_EnableOverDrive();\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7);\n\n  UART_CLK_EN();\n}\n\nstatic inline void board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32f7/boards/stm32f769disco/board.mk",
    "content": "MCU_VARIANT = stm32f769xx\n\n# Only OTG-HS has a connector on this board\nRHPORT_SPEED = OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 1\n\nPORT ?= 1\nSPEED ?= high\n\nCFLAGS += \\\n  -DSTM32F769xx \\\n  -DHSE_VALUE=25000000 \\\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32F769ZITx_FLASH.ld\n\nJLINK_DEVICE = stm32f769ni\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32f7/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 William D. Jones (thor0505@comcast.net),\n * Uwe Bonnes (bon@elektron.ikp.physik.tu-darmstadt.de),\n * Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32f7xx_hal.h\"\n#include \"bsp/board_api.h\"\n\ntypedef struct {\n  GPIO_TypeDef* port;\n  GPIO_InitTypeDef pin_init;\n  uint8_t active_state;\n} board_pindef_t;\n\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n#ifdef UART_DEV\nstatic UART_HandleTypeDef UartHandle = {\n  .Instance = UART_DEV,\n  .Init = {\n    .BaudRate = CFG_BOARD_UART_BAUDRATE,\n    .WordLength = UART_WORDLENGTH_8B,\n    .StopBits = UART_STOPBITS_1,\n    .Parity = UART_PARITY_NONE,\n    .HwFlowCtl = UART_HWCONTROL_NONE,\n    .Mode = UART_MODE_TX_RX,\n    .OverSampling = UART_OVERSAMPLING_16,\n  }\n};\n#endif\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid OTG_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n// Despite being call USB2_OTG\n// OTG_HS is marked as RHPort1 by TinyUSB to be consistent across stm32 port\nvoid OTG_HS_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\nvoid board_init(void) {\n  SCB_EnableICache();\n\n  HAL_Init();\n\n  board_clock_init();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n  __HAL_RCC_GPIOH_CLK_ENABLE();  // ULPI NXT\n  __HAL_RCC_GPIOI_CLK_ENABLE();  // ULPI NXT\n#ifdef __HAL_RCC_GPIOJ_CLK_ENABLE\n  __HAL_RCC_GPIOJ_CLK_ENABLE();\n#endif\n\n  for (uint8_t i = 0; i < TU_ARRAY_SIZE(board_pindef); i++) {\n    HAL_GPIO_Init(board_pindef[i].port, &board_pindef[i].pin_init);\n  }\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n  NVIC_SetPriority(OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n#ifdef UART_DEV\n  HAL_UART_Init(&UartHandle);\n#endif\n\n  GPIO_InitTypeDef GPIO_InitStruct;\n\n  //------------- rhport0: OTG_FS -------------//\n  /* Configure DM DP Pins */\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Configure OTG-FS ID pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_10;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wshadow\"\n#endif\n\n  /* Enable USB FS Clocks */\n  __HAL_RCC_USB_OTG_FS_CLK_ENABLE();\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#if OTG_FS_VBUS_SENSE\n  /* Configure VBUS Pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_9;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n#endif // vbus sense\n\n#if CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = OTG_FS_VBUS_SENSE;\n  tud_configure(0, TUD_CFGID_DWC2, &cfg);\n#endif\n\n  //------------- rhport1: OTG_HS -------------//\n#ifdef USB_HS_PHYC\n  // MCU with built-in HS PHY such as F723, F733, F730\n\n  /* Configure DM DP Pins */\n  GPIO_InitStruct.Pin       = (GPIO_PIN_14 | GPIO_PIN_15);\n  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull      = GPIO_NOPULL;\n  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS;\n  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n  /* Configure OTG-HS ID pin */\n  GPIO_InitStruct.Pin       = GPIO_PIN_13;\n  GPIO_InitStruct.Mode      = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull      = GPIO_PULLUP;\n  GPIO_InitStruct.Alternate = GPIO_AF12_OTG_HS_FS;\n  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n  /* Enable PHYC Clocks */\n  __HAL_RCC_OTGPHYC_CLK_ENABLE();\n\n#else\n  // MCU with external ULPI PHY\n\n  /* ULPI CLK */\n  GPIO_InitStruct.Pin = GPIO_PIN_5;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* ULPI D0 */\n  GPIO_InitStruct.Pin = GPIO_PIN_3;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* ULPI D1 D2 D3 D4 D5 D6 D7 */\n  GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_5;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;\n  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);\n\n  /* ULPI STP */\n  GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_2;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;\n  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);\n\n  /* NXT */\n  GPIO_InitStruct.Pin = GPIO_PIN_4;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;\n  HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);\n\n  /* ULPI DIR */\n  GPIO_InitStruct.Pin = GPIO_PIN_11;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_HS;\n  HAL_GPIO_Init(GPIOI, &GPIO_InitStruct);\n#endif // USB_HS_PHYC\n\n  // Enable USB HS & ULPI Clocks\n  __HAL_RCC_USB_OTG_HS_ULPI_CLK_ENABLE();\n  __HAL_RCC_USB_OTG_HS_CLK_ENABLE();\n\n#if CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = OTG_HS_VBUS_SENSE;\n  tud_configure(1, TUD_CFGID_DWC2, &cfg);\n#endif\n\n  // Turn off device vbus\n#if CFG_TUD_ENABLED\n  board_vbus_set(BOARD_TUD_RHPORT, false);\n#endif\n  // Turn on host vbus\n#if CFG_TUH_ENABLED\n  board_vbus_set(BOARD_TUH_RHPORT, true);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n#ifdef PINID_LED\n  board_pindef_t* pindef = &board_pindef[PINID_LED];\n  GPIO_PinState pin_state = state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET;\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, pin_state);\n#else\n  (void) state;\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef PINID_BUTTON\n  board_pindef_t* pindef = &board_pindef[PINID_BUTTON];\n  return pindef->active_state == HAL_GPIO_ReadPin(pindef->port, pindef->pin_init.Pin);\n#else\n  return 0;\n#endif\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n#ifdef UART_DEV\n  int count = 0;\n  // clear overrun error if any\n  if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ORE)) {\n    __HAL_UART_CLEAR_FLAG(&UartHandle, UART_CLEAR_OREF);\n  }\n  for (int i = 0; i < len; i++) {\n    if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE)) {\n      buf[i] = (uint8_t) UartHandle.Instance->RDR;\n      count++;\n    } else {\n      break;\n    }\n  }\n  return count;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t * )(uintptr_t)\n  buf, len, 0xffff);\n  return len;\n#else\n  (void) buf; (void) len;\n  return -1;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n// Keep HAL_GetTick() working for HAL functions called from board_init()\nvoid osal_threadx_tick_cb(void) {\n  HAL_IncTick();\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32f7/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY f7)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m7-fpsp CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32F7 CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif ()\n\nif (NOT DEFINED RHPORT_SPEED)\n  # Most F7 does not has built-in HS PHY\n  set(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_FULL_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\ncmake_print_variables(RHPORT_DEVICE RHPORT_DEVICE_SPEED RHPORT_HOST RHPORT_HOST_SPEED)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32F7)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32f7/family.mk",
    "content": "UF2_FAMILY_ID = 0x53b80f00\nST_FAMILY = f7\n\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m7-fpsp\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nRHPORT_SPEED ?= OPT_MODE_FULL_SPEED OPT_MODE_FULL_SPEED\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 0\n\n# Determine RHPORT_DEVICE_SPEED if not defined\nifndef RHPORT_DEVICE_SPEED\nifeq ($(RHPORT_DEVICE), 0)\n  RHPORT_DEVICE_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_DEVICE_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# Determine RHPORT_HOST_SPEED if not defined\nifndef RHPORT_HOST_SPEED\nifeq ($(RHPORT_HOST), 0)\n  RHPORT_HOST_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_HOST_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32F7 \\\n\t-DBOARD_TUD_RHPORT=${RHPORT_DEVICE} \\\n\t-DBOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED} \\\n\t-DBOARD_TUH_RHPORT=${RHPORT_HOST} \\\n\t-DBOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED} \\\n\n#ifeq ($(PORT), 1)\n#  ifeq ($(SPEED), high)\n#    CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED\n#    $(info \"Using OTG_HS in HighSpeed mode\")\n#  else\n#    CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_FULL_SPEED\n#    $(info \"Using OTG_HS in FullSpeed mode\")\n#  endif\n#else\n#  CFLAGS += -DBOARD_TUD_MAX_SPEED=OPT_MODE_FULL_SPEED\n#  $(info \"Using OTG_FS\")\n#endif\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# mcu driver cause following warnings\nCFLAGS_GCC += -Wno-error=cast-align\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_dma.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr_ex.c\n\nINC += \\\n  $(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT).s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32f7/stm32f7xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32f7xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32F7xx_HAL_CONF_H\n#define __STM32F7xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED   */\n/* #define HAL_CAN_MODULE_ENABLED */\n/* #define HAL_CAN_LEGACY_MODULE_ENABLED */\n/* #define HAL_CEC_MODULE_ENABLED   */\n/* #define HAL_CRC_MODULE_ENABLED   */\n/* #define HAL_CRYP_MODULE_ENABLED   */\n/* #define HAL_DAC_MODULE_ENABLED   */\n/* #define HAL_DCMI_MODULE_ENABLED  */\n#define HAL_DMA_MODULE_ENABLED\n/* #define HAL_DMA2D_MODULE_ENABLED  */\n/* #define HAL_ETH_MODULE_ENABLED  */\n#define HAL_FLASH_MODULE_ENABLED\n/* #define HAL_NAND_MODULE_ENABLED */\n/* #define HAL_NOR_MODULE_ENABLED */\n/* #define HAL_SRAM_MODULE_ENABLED */\n/* #define HAL_SDRAM_MODULE_ENABLED */\n/* #define HAL_HASH_MODULE_ENABLED   */\n#define HAL_GPIO_MODULE_ENABLED\n/* #define HAL_I2C_MODULE_ENABLED */\n/* #define HAL_I2S_MODULE_ENABLED    */\n/* #define HAL_IWDG_MODULE_ENABLED  */\n/* #define HAL_LPTIM_MODULE_ENABLED */\n/* #define HAL_LTDC_MODULE_ENABLED  */\n#define HAL_PWR_MODULE_ENABLED\n/* #define HAL_QSPI_MODULE_ENABLED    */\n#define HAL_RCC_MODULE_ENABLED\n/* #define HAL_RNG_MODULE_ENABLED    */\n/* #define HAL_RTC_MODULE_ENABLED */\n/* #define HAL_SAI_MODULE_ENABLED    */\n/* #define HAL_SD_MODULE_ENABLED   */\n/* #define HAL_SPDIFRX_MODULE_ENABLED */\n/* #define HAL_SPI_MODULE_ENABLED    */\n/* #define HAL_TIM_MODULE_ENABLED    */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED  */\n/* #define HAL_IRDA_MODULE_ENABLED  */\n/* #define HAL_SMARTCARD_MODULE_ENABLED  */\n/* #define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_CORTEX_MODULE_ENABLED\n/* #define HAL_PCD_MODULE_ENABLED */\n/* #define HAL_HCD_MODULE_ENABLED */\n/* #define HAL_DFSDM_MODULE_ENABLED */\n/* #define HAL_DSI_MODULE_ENABLED */\n/* #define HAL_JPEG_MODULE_ENABLED */\n/* #define HAL_MDIOS_MODULE_ENABLED */\n\n\n/* ########################## HSE/HSI Values adaptation ##################### */\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE    ((uint32_t)25000000U) /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    ((uint32_t)100U)   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE    ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n #define LSI_VALUE  ((uint32_t)32000U)       /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.  */\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  */\n#if !defined  (LSE_VALUE)\n #define LSE_VALUE  ((uint32_t)32768U)    /*!< Value of the External Low Speed oscillator in Hz */\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    ((uint32_t)5000U)   /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for I2S peripheral\n  *        This value is used by the I2S HAL module to compute the I2S clock source\n  *        frequency, this source is inserted directly through I2S_CKIN pad.\n  */\n#if !defined  (EXTERNAL_CLOCK_VALUE)\n  #define EXTERNAL_CLOCK_VALUE    ((uint32_t)12288000U) /*!< Value of the Internal oscillator in Hz*/\n#endif /* EXTERNAL_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    ((uint32_t)3300U) /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            ((uint32_t)0x0FU) /*!< tick interrupt priority */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U\n#define  ART_ACCELERATOR_ENABLE       1U /* To enable instruction cache and prefetch */\n\n#define  USE_HAL_ADC_REGISTER_CALLBACKS         0U /* ADC register callback disabled       */\n#define  USE_HAL_CAN_REGISTER_CALLBACKS         0U /* CAN register callback disabled       */\n#define  USE_HAL_CEC_REGISTER_CALLBACKS         0U /* CEC register callback disabled       */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS        0U /* CRYP register callback disabled      */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS         0U /* DAC register callback disabled       */\n#define  USE_HAL_DCMI_REGISTER_CALLBACKS        0U /* DCMI register callback disabled      */\n#define  USE_HAL_DFSDM_REGISTER_CALLBACKS       0U /* DFSDM register callback disabled     */\n#define  USE_HAL_DMA2D_REGISTER_CALLBACKS       0U /* DMA2D register callback disabled     */\n#define  USE_HAL_DSI_REGISTER_CALLBACKS         0U /* DSI register callback disabled       */\n#define  USE_HAL_ETH_REGISTER_CALLBACKS         0U /* ETH register callback disabled       */\n#define  USE_HAL_HASH_REGISTER_CALLBACKS        0U /* HASH register callback disabled      */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS         0U /* HCD register callback disabled       */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS         0U /* I2C register callback disabled       */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS         0U /* I2S register callback disabled       */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS        0U /* IRDA register callback disabled      */\n#define  USE_HAL_JPEG_REGISTER_CALLBACKS        0U /* JPEG register callback disabled      */\n#define  USE_HAL_LPTIM_REGISTER_CALLBACKS       0U /* LPTIM register callback disabled     */\n#define  USE_HAL_LTDC_REGISTER_CALLBACKS        0U /* LTDC register callback disabled      */\n#define  USE_HAL_MDIOS_REGISTER_CALLBACKS       0U /* MDIOS register callback disabled     */\n#define  USE_HAL_MMC_REGISTER_CALLBACKS         0U /* MMC register callback disabled       */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS        0U /* NAND register callback disabled      */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS         0U /* NOR register callback disabled       */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS         0U /* PCD register callback disabled       */\n#define  USE_HAL_QSPI_REGISTER_CALLBACKS        0U /* QSPI register callback disabled      */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS         0U /* RNG register callback disabled       */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS         0U /* RTC register callback disabled       */\n#define  USE_HAL_SAI_REGISTER_CALLBACKS         0U /* SAI register callback disabled       */\n#define  USE_HAL_SD_REGISTER_CALLBACKS          0U /* SD register callback disabled        */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS   0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_SDRAM_REGISTER_CALLBACKS       0U /* SDRAM register callback disabled     */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS        0U /* SRAM register callback disabled      */\n#define  USE_HAL_SPDIFRX_REGISTER_CALLBACKS     0U /* SPDIFRX register callback disabled   */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS       0U /* SMBUS register callback disabled     */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS         0U /* SPI register callback disabled       */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS         0U /* TIM register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS        0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS       0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS        0U /* WWDG register callback disabled      */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1 */\n\n/* ################## Ethernet peripheral configuration for NUCLEO 144 board ##################### */\n\n/* Section 1 : Ethernet peripheral configuration */\n\n/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */\n#define MAC_ADDR0   2U\n#define MAC_ADDR1   0U\n#define MAC_ADDR2   0U\n#define MAC_ADDR3   0U\n#define MAC_ADDR4   0U\n#define MAC_ADDR5   0U\n\n/* Definition of the Ethernet driver buffers size and count */\n#define ETH_RX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for receive               */\n#define ETH_TX_BUF_SIZE                ETH_MAX_PACKET_SIZE /* buffer size for transmit              */\n#define ETH_RXBUFNB                    ((uint32_t)5)       /* 5 Rx buffers of size ETH_RX_BUF_SIZE  */\n#define ETH_TXBUFNB                    ((uint32_t)5)       /* 5 Tx buffers of size ETH_TX_BUF_SIZE  */\n\n/* Section 2: PHY configuration section */\n/* LAN8742A PHY Address*/\n#define LAN8742A_PHY_ADDRESS            0x00\n/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/\n#define PHY_RESET_DELAY                 ((uint32_t)0x00000FFF)\n/* PHY Configuration delay */\n#define PHY_CONFIG_DELAY                ((uint32_t)0x00000FFF)\n\n#define PHY_READ_TO                     ((uint32_t)0x0000FFFF)\n#define PHY_WRITE_TO                    ((uint32_t)0x0000FFFF)\n\n/* Section 3: Common PHY Registers */\n\n#define PHY_BCR                         ((uint16_t)0x00)    /*!< Transceiver Basic Control Register   */\n#define PHY_BSR                         ((uint16_t)0x01)    /*!< Transceiver Basic Status Register    */\n\n#define PHY_RESET                       ((uint16_t)0x8000)  /*!< PHY Reset */\n#define PHY_LOOPBACK                    ((uint16_t)0x4000)  /*!< Select loop-back mode */\n#define PHY_FULLDUPLEX_100M             ((uint16_t)0x2100)  /*!< Set the full-duplex mode at 100 Mb/s */\n#define PHY_HALFDUPLEX_100M             ((uint16_t)0x2000)  /*!< Set the half-duplex mode at 100 Mb/s */\n#define PHY_FULLDUPLEX_10M              ((uint16_t)0x0100)  /*!< Set the full-duplex mode at 10 Mb/s  */\n#define PHY_HALFDUPLEX_10M              ((uint16_t)0x0000)  /*!< Set the half-duplex mode at 10 Mb/s  */\n#define PHY_AUTONEGOTIATION             ((uint16_t)0x1000)  /*!< Enable auto-negotiation function     */\n#define PHY_RESTART_AUTONEGOTIATION     ((uint16_t)0x0200)  /*!< Restart auto-negotiation function    */\n#define PHY_POWERDOWN                   ((uint16_t)0x0800)  /*!< Select the power down mode           */\n#define PHY_ISOLATE                     ((uint16_t)0x0400)  /*!< Isolate PHY from MII                 */\n\n#define PHY_AUTONEGO_COMPLETE           ((uint16_t)0x0020)  /*!< Auto-Negotiation process completed   */\n#define PHY_LINKED_STATUS               ((uint16_t)0x0004)  /*!< Valid link established               */\n#define PHY_JABBER_DETECTION            ((uint16_t)0x0002)  /*!< Jabber condition detected            */\n\n/* Section 4: Extended PHY Registers */\n\n#define PHY_SR                          ((uint16_t)0x1F)    /*!< PHY special control/ status register Offset     */\n\n#define PHY_SPEED_STATUS                ((uint16_t)0x0004)  /*!< PHY Speed mask                                  */\n#define PHY_DUPLEX_STATUS               ((uint16_t)0x0010)  /*!< PHY Duplex mask                                 */\n\n\n#define PHY_ISFR                        ((uint16_t)0x1D)    /*!< PHY Interrupt Source Flag register Offset       */\n#define PHY_ISFR_INT4                   ((uint16_t)0x0010)  /*!< PHY Link down inturrupt                         */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n* Activated: CRC code is present inside driver\n* Deactivated: CRC code cleaned from driver\n*/\n\n#define USE_SPI_CRC                     1U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32f7xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32f7xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32f7xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32f7xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32f7xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CAN_MODULE_ENABLED\n  #include \"stm32f7xx_hal_can.h\"\n#endif /* HAL_CAN_MODULE_ENABLED */\n\n#ifdef HAL_CAN_LEGACY_MODULE_ENABLED\n  #include \"stm32f7xx_hal_can_legacy.h\"\n#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */\n\n#ifdef HAL_CEC_MODULE_ENABLED\n  #include \"stm32f7xx_hal_cec.h\"\n#endif /* HAL_CEC_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32f7xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32f7xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DMA2D_MODULE_ENABLED\n  #include \"stm32f7xx_hal_dma2d.h\"\n#endif /* HAL_DMA2D_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n  #include \"stm32f7xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_DCMI_MODULE_ENABLED\n  #include \"stm32f7xx_hal_dcmi.h\"\n#endif /* HAL_DCMI_MODULE_ENABLED */\n\n#ifdef HAL_ETH_MODULE_ENABLED\n  #include \"stm32f7xx_hal_eth.h\"\n#endif /* HAL_ETH_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32f7xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32f7xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32f7xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n  #include \"stm32f7xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_SDRAM_MODULE_ENABLED\n  #include \"stm32f7xx_hal_sdram.h\"\n#endif /* HAL_SDRAM_MODULE_ENABLED */\n\n#ifdef HAL_HASH_MODULE_ENABLED\n #include \"stm32f7xx_hal_hash.h\"\n#endif /* HAL_HASH_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32f7xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32f7xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32f7xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n #include \"stm32f7xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_LTDC_MODULE_ENABLED\n #include \"stm32f7xx_hal_ltdc.h\"\n#endif /* HAL_LTDC_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32f7xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_QSPI_MODULE_ENABLED\n #include \"stm32f7xx_hal_qspi.h\"\n#endif /* HAL_QSPI_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n #include \"stm32f7xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32f7xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n #include \"stm32f7xx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n #include \"stm32f7xx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SPDIFRX_MODULE_ENABLED\n #include \"stm32f7xx_hal_spdifrx.h\"\n#endif /* HAL_SPDIFRX_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32f7xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32f7xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32f7xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32f7xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32f7xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32f7xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32f7xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32f7xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n #include \"stm32f7xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_DFSDM_MODULE_ENABLED\n #include \"stm32f7xx_hal_dfsdm.h\"\n#endif /* HAL_DFSDM_MODULE_ENABLED */\n\n#ifdef HAL_DSI_MODULE_ENABLED\n #include \"stm32f7xx_hal_dsi.h\"\n#endif /* HAL_DSI_MODULE_ENABLED */\n\n#ifdef HAL_JPEG_MODULE_ENABLED\n #include \"stm32f7xx_hal_jpeg.h\"\n#endif /* HAL_JPEG_MODULE_ENABLED */\n\n#ifdef HAL_MDIOS_MODULE_ENABLED\n #include \"stm32f7xx_hal_mdios.h\"\n#endif /* HAL_MDIOS_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t* file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32F7xx_HAL_CONF_H */\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32g0/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32g0xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 200 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32g0/boards/stm32g0b1nucleo/STM32G0B1RETx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Author\t\t: STM32CubeMX\n**\n**  Abstract    : Linker script for STM32G0B1RETx series\n**                512Kbytes FLASH and 144Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed “as is,” without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>\n**\n** Redistribution and use in source and binary forms, with or without modification,\n** are permitted provided that the following conditions are met:\n**   1. Redistributions of source code must retain the above copyright notice,\n**      this list of conditions and the following disclaimer.\n**   2. 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**   3. Neither the name of STMicroelectronics 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 \"AS IS\"\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Specify the memory areas */\nMEMORY\n{\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 144K\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of RAM */\n\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32g0/boards/stm32g0b1nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32g0b1xx)\nset(JLINK_DEVICE stm32g0b1re)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32G0B1RETx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32G0B1xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32g0/boards/stm32g0b1nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n * Copyright (c) 2023, HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 G0B1 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-g0b1re.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// G0B1RE Nucleo does not has usb connection. We need to manually connect\n// - PA12 for D+, CN10.12\n// - PA11 for D-, CN10.14\n\n// LED\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   0\n\n// UART Enable for STLink VCOM\n#define UART_DEV              USART2\n#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF1_USART2\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n#if 1\n// Clock configure for STM32G0B1RE Nucleo\nstatic inline void board_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n\n  /** Configure the main internal regulator output voltage */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure. */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;\n  RCC_OscInitStruct.PLL.PLLN = 8;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;\n  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);\n\n  // Configure CRS clock source\n  __HAL_RCC_CRS_CLK_ENABLE();\n  RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n  RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;\n  RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000,1000);\n  RCC_CRSInitStruct.ErrorLimitValue = 34;\n  RCC_CRSInitStruct.HSI48CalibrationValue = 32;\n\n  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n\n  /* Select HSI48 as USB clock source */\n  RCC_PeriphCLKInitTypeDef usb_clk = {0 };\n  usb_clk.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  usb_clk.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&usb_clk);\n\n  // Enable HSI48\n  RCC_OscInitTypeDef osc_hsi48 = {0};\n  osc_hsi48.OscillatorType = RCC_OSCILLATORTYPE_HSI48;\n  osc_hsi48.HSI48State = RCC_HSI48_ON;\n  HAL_RCC_OscConfig(&osc_hsi48);\n}\n#else\n\n// Clock configure for STM32G0 nucleo with B0 mcu variant for someone that is skilled enough\n// to rework and solder the B0 chip. Note: SB17 may need to be soldered as well (check user manual)\nstatic inline void board_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct = { 0 };\n\n  /** Configure the main internal regulator output voltage */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure. */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;\n  RCC_OscInitStruct.PLL.PLLN = 12;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;\n  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select HSI48 as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                              |RCC_CLOCKTYPE_PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);\n}\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32g0/boards/stm32g0b1nucleo/board.mk",
    "content": "CFLAGS += \\\n\t-DSTM32G0B1xx\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32g0b1xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32G0B1RETx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32g0b1xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32g0b1xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32g0b1re\n"
  },
  {
    "path": "hw/bsp/stm32g0/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2023 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32g0xx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_UCPD1_2_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#ifdef UART_DEV\nUART_HandleTypeDef UartHandle;\n#endif\n\nvoid board_init(void) {\n  HAL_Init(); // required for HAL_RCC_Osc TODO check with freeRTOS\n  board_clock_init();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n\n  __HAL_RCC_SYSCFG_CLK_ENABLE();\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_UCPD1_2_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  GPIO_InitTypeDef GPIO_InitStruct;\n\n  // LED\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  board_led_write(false);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = BUTTON_STATE_ACTIVE ? GPIO_PULLDOWN : GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n#ifdef UART_DEV\n  UART_CLK_EN();\n\n  // UART\n  GPIO_InitStruct.Pin       = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull      = GPIO_PULLUP;\n  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UartHandle = (UART_HandleTypeDef){\n    .Instance        = UART_DEV,\n    .Init.BaudRate   = CFG_BOARD_UART_BAUDRATE,\n    .Init.WordLength = UART_WORDLENGTH_8B,\n    .Init.StopBits   = UART_STOPBITS_1,\n    .Init.Parity     = UART_PARITY_NONE,\n    .Init.HwFlowCtl  = UART_HWCONTROL_NONE,\n    .Init.Mode       = UART_MODE_TX_RX,\n    .Init.OverSampling = UART_OVERSAMPLING_16,\n    .AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT\n  };\n  HAL_UART_Init(&UartHandle);\n#endif\n\n  // USB Pins TODO double check USB clock and pin setup\n  // Configure USB DM and DP pins. This is optional, and maintained only for user guidance.\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Peripheral clock enable */\n  __HAL_RCC_USB_CLK_ENABLE();\n\n  /* Enable VDDUSB */\n  HAL_PWREx_EnableVddUSB();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState)(state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t*)(uintptr_t) buf, len, 0xffff);\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n  HAL_IncTick();\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/stm32g0/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY g0)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32G0 CACHE INTERNAL \"\")\nset(OPENOCD_OPTION \"-f interface/stlink.cfg -f target/stm32g0x.cfg\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32G0)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/hcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${TOP}/src/portable/st/typec/typec_stm32.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  family_flash_stlink(${TARGET})\n  #family_flash_openocd(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32g0/family.mk",
    "content": "ST_FAMILY = g0\n\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32G0\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += -Wno-error=cast-align\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/hcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_dma.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32g0/stm32g0xx_hal_conf.h",
    "content": "/* USER CODE BEGIN Header */\n/**\n  ******************************************************************************\n  * @file    stm32g0xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2018-2021 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n/* USER CODE END Header */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32G0xx_HAL_CONF_H\n#define STM32G0xx_HAL_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED   */\n/* #define HAL_CEC_MODULE_ENABLED   */\n/* #define HAL_COMP_MODULE_ENABLED   */\n/* #define HAL_CRC_MODULE_ENABLED   */\n/* #define HAL_CRYP_MODULE_ENABLED   */\n/* #define HAL_DAC_MODULE_ENABLED   */\n/* #define HAL_EXTI_MODULE_ENABLED   */\n/* #define HAL_FDCAN_MODULE_ENABLED   */\n/* #define HAL_HCD_MODULE_ENABLED   */\n/* #define HAL_I2C_MODULE_ENABLED   */\n/* #define HAL_I2S_MODULE_ENABLED   */\n/* #define HAL_IWDG_MODULE_ENABLED   */\n/* #define HAL_IRDA_MODULE_ENABLED   */\n/* #define HAL_LPTIM_MODULE_ENABLED   */\n/* #define HAL_PCD_MODULE_ENABLED   */\n/* #define HAL_RNG_MODULE_ENABLED   */\n/* #define HAL_RTC_MODULE_ENABLED   */\n/* #define HAL_SMARTCARD_MODULE_ENABLED   */\n/* #define HAL_SMBUS_MODULE_ENABLED   */\n/* #define HAL_SPI_MODULE_ENABLED   */\n/* #define HAL_TIM_MODULE_ENABLED   */\n/* #define HAL_USART_MODULE_ENABLED   */\n/* #define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n#define HAL_UART_MODULE_ENABLED\n\n/* ########################## Register Callbacks selection ############################## */\n/**\n  * @brief This is the list of modules where register callback can be used\n  */\n#define USE_HAL_ADC_REGISTER_CALLBACKS    0u\n#define USE_HAL_CEC_REGISTER_CALLBACKS    0u\n#define USE_HAL_COMP_REGISTER_CALLBACKS   0u\n#define USE_HAL_CRYP_REGISTER_CALLBACKS   0u\n#define USE_HAL_DAC_REGISTER_CALLBACKS    0u\n#define USE_HAL_FDCAN_REGISTER_CALLBACKS  0u\n#define USE_HAL_HCD_REGISTER_CALLBACKS    0u\n#define USE_HAL_I2C_REGISTER_CALLBACKS    0u\n#define USE_HAL_I2S_REGISTER_CALLBACKS    0u\n#define USE_HAL_IRDA_REGISTER_CALLBACKS   0u\n#define USE_HAL_LPTIM_REGISTER_CALLBACKS  0u\n#define USE_HAL_PCD_REGISTER_CALLBACKS    0u\n#define USE_HAL_RNG_REGISTER_CALLBACKS    0u\n#define USE_HAL_RTC_REGISTER_CALLBACKS    0u\n#define USE_HAL_SMBUS_REGISTER_CALLBACKS  0u\n#define USE_HAL_SPI_REGISTER_CALLBACKS    0u\n#define USE_HAL_TIM_REGISTER_CALLBACKS    0u\n#define USE_HAL_UART_REGISTER_CALLBACKS   0u\n#define USE_HAL_USART_REGISTER_CALLBACKS  0u\n#define USE_HAL_WWDG_REGISTER_CALLBACKS   0u\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n#define HSE_VALUE    (8000000UL)         /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n#define HSE_STARTUP_TIMEOUT    (100UL)         /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n#define HSI_VALUE    (16000000UL)            /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)\n/**\n  * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG.\n  *        This internal oscillator is mainly dedicated to provide a high precision clock to\n  *        the USB peripheral by means of a special Clock Recovery System (CRS) circuitry.\n  *        When the CRS is not used, the HSI48 RC oscillator runs on it default frequency\n  *        which is subject to manufacturing process variations.\n  */\n#if !defined  (HSI48_VALUE)\n  #define HSI48_VALUE   48000000U             /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz.\n                                               The real value my vary depending on manufacturing process variations.*/\n#endif /* HSI48_VALUE */\n#endif\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n#define LSI_VALUE  (32000UL)                /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\nThe real value may vary depending on the variations\nin voltage and temperature.*/\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n#define LSE_VALUE    (32768UL)               /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n#define LSE_STARTUP_TIMEOUT    (5000UL)      /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for I2S1 peripheral\n  *        This value is used by the RCC HAL module to compute the I2S1 clock source\n  *        frequency.\n  */\n#if !defined  (EXTERNAL_I2S1_CLOCK_VALUE)\n#define EXTERNAL_I2S1_CLOCK_VALUE    (48000UL) /*!< Value of the I2S1 External clock source in Hz*/\n#endif /* EXTERNAL_I2S1_CLOCK_VALUE */\n\n#if defined(STM32G0C1xx) || defined(STM32G0B1xx) || defined(STM32G0B0xx)\n/**\n  * @brief External clock source for I2S2 peripheral\n  *        This value is used by the RCC HAL module to compute the I2S2 clock source\n  *        frequency.\n  */\n#if !defined  (EXTERNAL_I2S2_CLOCK_VALUE)\n  #define EXTERNAL_I2S2_CLOCK_VALUE    48000U /*!< Value of the I2S2 External clock source in Hz*/\n#endif /* EXTERNAL_I2S2_CLOCK_VALUE */\n#endif\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    (3300UL)                                        /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            0U /*!< tick interrupt priority */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U\n#define  INSTRUCTION_CACHE_ENABLE     1U\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n* Activated: CRC code is present inside driver\n* Deactivated: CRC code cleaned from driver\n*/\n\n#define USE_SPI_CRC                     0U\n\n/* ################## CRYP peripheral configuration ########################## */\n\n#define USE_HAL_CRYP_SUSPEND_RESUME     1U\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include modules header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n#include \"stm32g0xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n#include \"stm32g0xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n#include \"stm32g0xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n#include \"stm32g0xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n#include \"stm32g0xx_hal_adc.h\"\n#include \"stm32g0xx_hal_adc_ex.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CEC_MODULE_ENABLED\n#include \"stm32g0xx_hal_cec.h\"\n#endif /* HAL_CEC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n#include \"stm32g0xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n#include \"stm32g0xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n#include \"stm32g0xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n#include \"stm32g0xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n#include \"stm32g0xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n#include \"stm32g0xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_FDCAN_MODULE_ENABLED\n#include \"stm32g0xx_hal_fdcan.h\"\n#endif /* HAL_FDCAN_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n#include \"stm32g0xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n#include \"stm32g0xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n#include \"stm32g0xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n#include \"stm32g0xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n#include \"stm32g0xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32g0xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n#include \"stm32g0xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n#include \"stm32g0xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n#include \"stm32g0xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n#include \"stm32g0xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n#include \"stm32g0xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n#include \"stm32g0xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n#include \"stm32g0xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n#include \"stm32g0xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n#include \"stm32g0xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n#include \"stm32g0xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n#include \"stm32g0xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for functions parameters check.\n  * @param  expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\nvoid assert_failed(uint8_t *file, uint32_t line);\n#else\n#define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32G0xx_HAL_CONF_H */\n"
  },
  {
    "path": "hw/bsp/stm32g4/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32g4xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 200 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/b_g474e_dpow1/STM32G474RETx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author\t\t: Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32G474RETx Device from stm32g4 series\n**                      512Kbytes FLASH\n**                      128Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; COPYRIGHT(c) 2020 STMicroelectronics</center></h2>\n**\n** Redistribution and use in source and binary forms, with or without modification,\n** are permitted provided that the following conditions are met:\n**   1. Redistributions of source code must retain the above copyright notice,\n**      this list of conditions and the following disclaimer.\n**   2. 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**   3. Neither the name of STMicroelectronics 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 \"AS IS\"\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x1000 ;\t/* required amount of heap  */\n_Min_Stack_Size = 0x1000 ;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/b_g474e_dpow1/board.cmake",
    "content": "set(MCU_VARIANT stm32g474xx)\nset(JLINK_DEVICE stm32g474re)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32G474RETx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32G474xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/b_g474e_dpow1/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 B-G474E-DPOW1 Discovery kit\n   url: https://www.st.com/en/evaluation-tools/b-g474e-dpow1.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// G474RE Nucleo does not has usb connection. We need to manually connect\n// - PA12 for D+, CN10.12\n// - PA11 for D-, CN10.14\n\n// LED\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   0\n\n// UART Enable for STLink VCOM\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOC\n#define UART_GPIO_AF          GPIO_AF7_USART3\n#define UART_TX_PIN           GPIO_PIN_10\n#define UART_RX_PIN           GPIO_PIN_11\n\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\n// CPU Frequency (Core Clock) is 170 MHz\nstatic inline void board_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n\n  // Configure the main internal regulator output voltage\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);\n\n  /* Activate PLL with HSI as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;\n  RCC_OscInitStruct.PLL.PLLN = 85;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV10;\n  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;\n  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  // Initializes the CPU, AHB and APB buses clocks\n  RCC_ClkInitStruct.ClockType      = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK |\n                                     RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\n  RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_8);\n\n  //------------- HSI48 and CRS for USB -------------//\n  RCC_OscInitTypeDef osc_hsi48 = {0};\n  osc_hsi48.OscillatorType = RCC_OSCILLATORTYPE_HSI48;\n  osc_hsi48.HSI48State = RCC_HSI48_ON;\n  osc_hsi48.PLL.PLLState = RCC_PLL_NONE;\n  HAL_RCC_OscConfig(&osc_hsi48);\n\n  /*Enable CRS Clock*/\n  RCC_CRSInitTypeDef RCC_CRSInitStruct= {0};\n  __HAL_RCC_CRS_CLK_ENABLE();\n\n  /* Default Synchro Signal division factor (not divided) */\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n\n  /* Set the SYNCSRC[1:0] bits according to CRS_Source value */\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n\n  /* HSI48 is synchronized with USB SOF at 1KHz rate */\n  RCC_CRSInitStruct.ReloadValue =  __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000, 1000);\n  RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;\n\n  /* Set the TRIM[5:0] to the default value */\n  RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;\n\n  /* Start automatic synchronization */\n  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInit.UsbClockSelection    = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n  // Enable VBUS sense (B device) via pin PA9\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/b_g474e_dpow1/board.mk",
    "content": "MCU_VARIANT = stm32g474xx\n\nCFLAGS += \\\n\t-DSTM32G474xx \\\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32G474RETx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32g474re\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/b_g474e_dpow1/cubemx/b_g474e_dpow1.ioc",
    "content": "#MicroXplorer Configuration settings - do not modify\nCAD.formats=\nCAD.pinconfig=\nCAD.provider=\nDma.Request0=UCPD1_RX\nDma.Request1=UCPD1_TX\nDma.RequestsNb=2\nDma.UCPD1_RX.0.Direction=DMA_PERIPH_TO_MEMORY\nDma.UCPD1_RX.0.EventEnable=DISABLE\nDma.UCPD1_RX.0.Instance=DMA1_Channel1\nDma.UCPD1_RX.0.MemDataAlignment=DMA_MDATAALIGN_BYTE\nDma.UCPD1_RX.0.MemInc=DMA_MINC_ENABLE\nDma.UCPD1_RX.0.Mode=DMA_NORMAL\nDma.UCPD1_RX.0.PeriphDataAlignment=DMA_PDATAALIGN_BYTE\nDma.UCPD1_RX.0.PeriphInc=DMA_PINC_DISABLE\nDma.UCPD1_RX.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING\nDma.UCPD1_RX.0.Priority=DMA_PRIORITY_HIGH\nDma.UCPD1_RX.0.RequestNumber=1\nDma.UCPD1_RX.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber\nDma.UCPD1_RX.0.SignalID=NONE\nDma.UCPD1_RX.0.SyncEnable=DISABLE\nDma.UCPD1_RX.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT\nDma.UCPD1_RX.0.SyncRequestNumber=1\nDma.UCPD1_RX.0.SyncSignalID=NONE\nDma.UCPD1_TX.1.Direction=DMA_MEMORY_TO_PERIPH\nDma.UCPD1_TX.1.EventEnable=DISABLE\nDma.UCPD1_TX.1.Instance=DMA1_Channel2\nDma.UCPD1_TX.1.MemDataAlignment=DMA_MDATAALIGN_BYTE\nDma.UCPD1_TX.1.MemInc=DMA_MINC_ENABLE\nDma.UCPD1_TX.1.Mode=DMA_NORMAL\nDma.UCPD1_TX.1.PeriphDataAlignment=DMA_PDATAALIGN_BYTE\nDma.UCPD1_TX.1.PeriphInc=DMA_PINC_DISABLE\nDma.UCPD1_TX.1.Polarity=HAL_DMAMUX_REQ_GEN_RISING\nDma.UCPD1_TX.1.Priority=DMA_PRIORITY_HIGH\nDma.UCPD1_TX.1.RequestNumber=1\nDma.UCPD1_TX.1.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber\nDma.UCPD1_TX.1.SignalID=NONE\nDma.UCPD1_TX.1.SyncEnable=DISABLE\nDma.UCPD1_TX.1.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT\nDma.UCPD1_TX.1.SyncRequestNumber=1\nDma.UCPD1_TX.1.SyncSignalID=NONE\nFile.Version=6\nGPIO.groupedBy=Group By Peripherals\nKeepUserPlacement=true\nMcu.CPN=STM32G474RET3\nMcu.Family=STM32G4\nMcu.IP0=DMA\nMcu.IP1=NVIC\nMcu.IP2=RCC\nMcu.IP3=SYS\nMcu.IP4=UCPD1\nMcu.IP5=USART3\nMcu.IPNb=6\nMcu.Name=STM32G474R(B-C-E)Tx\nMcu.Package=LQFP64\nMcu.Pin0=PC10\nMcu.Pin1=PC11\nMcu.Pin2=PB4\nMcu.Pin3=PB6\nMcu.Pin4=VP_SYS_VS_Systick\nMcu.Pin5=VP_SYS_VS_DBSignals\nMcu.PinsNb=6\nMcu.ThirdPartyNb=0\nMcu.UserConstants=\nMcu.UserName=STM32G474RETx\nMxCube.Version=6.8.1\nMxDb.Version=DB.6.0.81\nNVIC.BusFault_IRQn=true\\:0\\:0\\:false\\:false\\:false\\:true\\:false\\:false\nNVIC.DMA1_Channel1_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:true\\:true\nNVIC.DMA1_Channel2_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:true\\:true\nNVIC.DebugMonitor_IRQn=true\\:0\\:0\\:false\\:false\\:false\\:true\\:false\\:false\nNVIC.ForceEnableDMAVector=true\nNVIC.HardFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.MemoryManagement_IRQn=true\\:0\\:0\\:false\\:false\\:false\\:true\\:false\\:false\nNVIC.NonMaskableInt_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.PendSV_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nNVIC.PriorityGroup=NVIC_PRIORITYGROUP_4\nNVIC.SVCall_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nNVIC.SysTick_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:true\\:false\nNVIC.UsageFault_IRQn=true\\:0\\:0\\:false\\:false\\:false\\:true\\:false\\:false\nPB4.Mode=Sink_AllSignals\nPB4.Signal=UCPD1_CC2\nPB6.Mode=Sink_AllSignals\nPB6.Signal=UCPD1_CC1\nPC10.GPIOParameters=GPIO_PuPd\nPC10.GPIO_PuPd=GPIO_PULLUP\nPC10.Mode=Asynchronous\nPC10.Signal=USART3_TX\nPC11.GPIOParameters=GPIO_PuPd\nPC11.GPIO_PuPd=GPIO_PULLUP\nPC11.Mode=Asynchronous\nPC11.Signal=USART3_RX\nPinOutPanel.RotationAngle=0\nProjectManager.AskForMigrate=true\nProjectManager.BackupPrevious=false\nProjectManager.CompilerOptimize=6\nProjectManager.ComputerToolchain=false\nProjectManager.CoupleFile=false\nProjectManager.CustomerFirmwarePackage=\nProjectManager.DefaultFWLocation=true\nProjectManager.DeletePrevious=true\nProjectManager.DeviceId=STM32G474RETx\nProjectManager.FirmwarePackage=STM32Cube FW_G4 V1.5.1\nProjectManager.FreePins=false\nProjectManager.HalAssertFull=false\nProjectManager.HeapSize=0x200\nProjectManager.KeepUserCode=true\nProjectManager.LastFirmware=true\nProjectManager.LibraryCopy=2\nProjectManager.MainLocation=Src\nProjectManager.NoMain=false\nProjectManager.PreviousToolchain=\nProjectManager.ProjectBuild=false\nProjectManager.ProjectFileName=b_g474e_dpow1.ioc\nProjectManager.ProjectName=b_g474e_dpow1\nProjectManager.ProjectStructure=\nProjectManager.RegisterCallBack=\nProjectManager.StackSize=0x400\nProjectManager.TargetToolchain=Makefile\nProjectManager.ToolChainLocation=Src\nProjectManager.UnderRoot=false\nProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_DMA_Init-DMA-false-HAL-true,4-MX_USART3_UART_Init-USART3-false-HAL-true,5-MX_UCPD1_Init-UCPD1-false-LL-true\nRCC.ADC12Freq_Value=150000000\nRCC.ADC345Freq_Value=150000000\nRCC.AHBFreq_Value=150000000\nRCC.APB1Freq_Value=150000000\nRCC.APB1TimFreq_Value=150000000\nRCC.APB2Freq_Value=150000000\nRCC.APB2TimFreq_Value=150000000\nRCC.CRSFreq_Value=48000000\nRCC.CortexFreq_Value=150000000\nRCC.EXTERNAL_CLOCK_VALUE=12288000\nRCC.FCLKCortexFreq_Value=150000000\nRCC.FDCANFreq_Value=150000000\nRCC.FamilyName=M\nRCC.HCLKFreq_Value=150000000\nRCC.HRTIM1Freq_Value=150000000\nRCC.HSE_VALUE=24000000\nRCC.HSI48_VALUE=48000000\nRCC.HSI_VALUE=16000000\nRCC.I2C1Freq_Value=150000000\nRCC.I2C2Freq_Value=150000000\nRCC.I2C3Freq_Value=150000000\nRCC.I2C4Freq_Value=150000000\nRCC.I2SFreq_Value=150000000\nRCC.IPParameters=ADC12Freq_Value,ADC345Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HRTIM1Freq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSI_VALUE,MCO1PinFreq_Value,PLLM,PLLN,PLLPoutputFreq_Value,PLLQ,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,QSPIFreq_Value,RNGFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value\nRCC.LPTIM1Freq_Value=150000000\nRCC.LPUART1Freq_Value=150000000\nRCC.LSCOPinFreq_Value=32000\nRCC.LSE_VALUE=32768\nRCC.LSI_VALUE=32000\nRCC.MCO1PinFreq_Value=16000000\nRCC.PLLM=RCC_PLLM_DIV4\nRCC.PLLN=75\nRCC.PLLPoutputFreq_Value=150000000\nRCC.PLLQ=RCC_PLLQ_DIV4\nRCC.PLLQoutputFreq_Value=75000000\nRCC.PLLRCLKFreq_Value=150000000\nRCC.PWRFreq_Value=150000000\nRCC.QSPIFreq_Value=150000000\nRCC.RNGFreq_Value=75000000\nRCC.SAI1Freq_Value=150000000\nRCC.SYSCLKFreq_VALUE=150000000\nRCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK\nRCC.UART4Freq_Value=150000000\nRCC.UART5Freq_Value=150000000\nRCC.USART1Freq_Value=150000000\nRCC.USART2Freq_Value=150000000\nRCC.USART3Freq_Value=150000000\nRCC.USBFreq_Value=75000000\nRCC.VCOInputFreq_Value=4000000\nRCC.VCOOutputFreq_Value=300000000\nUSART3.AutoBaudRateEnableParam=UART_ADVFEATURE_AUTOBAUDRATE_DISABLE\nUSART3.BaudRate=115200\nUSART3.DMADisableonRxErrorParam=ADVFEATURE_DMA_ENABLEONRXERROR\nUSART3.DataInvertParam=ADVFEATURE_DATAINV_DISABLE\nUSART3.IPParameters=BaudRate,WordLength,Parity,StopBits,Mode,OverSampling,OneBitSampling,AutoBaudRateEnableParam,TxPinLevelInvertParam,RxPinLevelInvertParam,DataInvertParam,SwapParam,OverrunDisableParam,DMADisableonRxErrorParam,MSBFirstParam,VirtualMode-Asynchronous\nUSART3.MSBFirstParam=ADVFEATURE_MSBFIRST_DISABLE\nUSART3.Mode=MODE_TX_RX\nUSART3.OneBitSampling=UART_ONE_BIT_SAMPLE_DISABLE\nUSART3.OverSampling=UART_OVERSAMPLING_16\nUSART3.OverrunDisableParam=ADVFEATURE_OVERRUN_ENABLE\nUSART3.Parity=PARITY_ODD\nUSART3.RxPinLevelInvertParam=ADVFEATURE_RXINV_DISABLE\nUSART3.StopBits=STOPBITS_1\nUSART3.SwapParam=ADVFEATURE_SWAP_DISABLE\nUSART3.TxPinLevelInvertParam=ADVFEATURE_TXINV_DISABLE\nUSART3.VirtualMode-Asynchronous=VM_ASYNC\nUSART3.WordLength=WORDLENGTH_8B\nVP_SYS_VS_DBSignals.Mode=DisableDeadBatterySignals\nVP_SYS_VS_DBSignals.Signal=SYS_VS_DBSignals\nVP_SYS_VS_Systick.Mode=SysTick\nVP_SYS_VS_Systick.Signal=SYS_VS_Systick\nboard=custom\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/stm32g474nucleo/STM32G474RETx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author\t\t: Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32G474RETx Device from stm32g4 series\n**                      512Kbytes FLASH\n**                      128Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; COPYRIGHT(c) 2020 STMicroelectronics</center></h2>\n**\n** Redistribution and use in source and binary forms, with or without modification,\n** are permitted provided that the following conditions are met:\n**   1. Redistributions of source code must retain the above copyright notice,\n**      this list of conditions and the following disclaimer.\n**   2. 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**   3. Neither the name of STMicroelectronics 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 \"AS IS\"\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x1000 ;\t/* required amount of heap  */\n_Min_Stack_Size = 0x1000 ;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/stm32g474nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32g474xx)\nset(JLINK_DEVICE stm32g474re)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32G474RETx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32G474xx\n    HSE_VALUE=24000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/stm32g474nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 G474 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-g474re.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// G474RE Nucleo does not has usb connection. We need to manually connect\n// - PA12 for D+, CN10.12\n// - PA11 for D-, CN10.14\n\n// LED\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   1\n\n// UART Enable for STLink VCOM\n#define UART_DEV              LPUART1\n#define UART_CLK_EN           __HAL_RCC_LPUART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF12_LPUART1\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n\n  // Configure the main internal regulator output voltage\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);\n\n  // Initializes the CPU, AHB and APB buses clocks\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState       = RCC_HSE_ON;\n  RCC_OscInitStruct.HSI48State     = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState   = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource  = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM       = RCC_PLLM_DIV4;\n  RCC_OscInitStruct.PLL.PLLN       = 50;\n  RCC_OscInitStruct.PLL.PLLP       = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ       = RCC_PLLQ_DIV2;\n  RCC_OscInitStruct.PLL.PLLR       = RCC_PLLR_DIV2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  // Initializes the CPU, AHB and APB buses clocks\n  RCC_ClkInitStruct.ClockType      = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\n  RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_8);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInit.UsbClockSelection    = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) ;\n\n#if 0 // TODO need to check if USB clock is enabled\n  /* Enable HSI48 */\n  memset(&RCC_OscInitStruct, 0, sizeof(RCC_OscInitStruct));\n\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /*Enable CRS Clock*/\n  RCC_CRSInitTypeDef RCC_CRSInitStruct= {0};\n  __HAL_RCC_CRS_CLK_ENABLE();\n\n  /* Default Synchro Signal division factor (not divided) */\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n\n  /* Set the SYNCSRC[1:0] bits according to CRS_Source value */\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n\n  /* HSI48 is synchronized with USB SOF at 1KHz rate */\n  RCC_CRSInitStruct.ReloadValue =  __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000, 1000);\n  RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;\n\n  /* Set the TRIM[5:0] to the default value */\n  RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;\n\n  /* Start automatic synchronization */\n  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n#endif\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n  // Enable VBUS sense (B device) via pin PA9\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/stm32g474nucleo/board.mk",
    "content": "MCU_VARIANT = stm32g474xx\n\nCFLAGS += \\\n\t-DSTM32G474xx \\\n\t-DHSE_VALUE=24000000\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32G474RETx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32g474re\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/stm32g491nucleo/STM32G491RETX_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n** @file        : LinkerScript.ld\n**\n** @author      : Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for NUCLEO-G491RE Board embedding STM32G491RETx Device from stm32g4 series\n**                      512KBytes FLASH\n**                      112KBytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n******************************************************************************\n** @attention\n**\n** Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 112K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/stm32g491nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32g491xx)\nset(JLINK_DEVICE stm32g491re)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32G491RETX_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32G491xx\n    HSE_VALUE=24000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/stm32g491nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 G491 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-g491re.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// G474RE Nucleo does not has usb connection. We need to manually connect\n// - PA12 for D+, CN10.12\n// - PA11 for D-, CN10.14\n\n// LED\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          0\n\n// Button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   1\n\n// UART Enable for STLink VCOM\n#define UART_DEV              LPUART1\n#define UART_CLK_EN           __HAL_RCC_LPUART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF12_LPUART1\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n\n  // Configure the main internal regulator output voltage\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);\n\n  // Initializes the CPU, AHB and APB buses clocks\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState       = RCC_HSE_ON;\n  RCC_OscInitStruct.HSI48State     = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState   = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource  = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM       = RCC_PLLM_DIV6;\n  RCC_OscInitStruct.PLL.PLLN       = 85;\n  RCC_OscInitStruct.PLL.PLLP       = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ       = RCC_PLLQ_DIV2;\n  RCC_OscInitStruct.PLL.PLLR       = RCC_PLLR_DIV2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  // Initializes the CPU, AHB and APB buses clocks\n  RCC_ClkInitStruct.ClockType      = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;\n  RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInit.UsbClockSelection    = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) ;\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n  // Enable VBUS sense (B device) via pin PA9\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32g4/boards/stm32g491nucleo/board.mk",
    "content": "MCU_VARIANT = stm32g491xx\n\nCFLAGS += \\\n\t-DSTM32G491xx \\\n\t-DHSE_VALUE=24000000\n\n# Linker\nLD_FILE_GCC = $(BOARD_PATH)/STM32G491RETX_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32g491re\n"
  },
  {
    "path": "hw/bsp/stm32g4/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32g4xx_hal.h\"\n#include \"stm32g4xx_ll_bus.h\"\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_HP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid USB_LP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid USBWakeUp_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n// USB PD\nvoid UCPD1_IRQHandler(void) {\n  tuc_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#ifdef UART_DEV\nUART_HandleTypeDef UartHandle;\n#endif\n\nvoid board_init(void) {\n  HAL_Init();\n  board_clock_init();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_HP_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USB_LP_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USBWakeUp_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  GPIO_InitTypeDef GPIO_InitStruct;\n\n  // LED\n  memset(&GPIO_InitStruct, 0, sizeof(GPIO_InitStruct));\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  board_led_write(false);\n\n  // Button\n  memset(&GPIO_InitStruct, 0, sizeof(GPIO_InitStruct));\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = BUTTON_STATE_ACTIVE ? GPIO_PULLDOWN : GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n#ifdef UART_DEV\n  UART_CLK_EN();\n\n  // UART\n  memset(&GPIO_InitStruct, 0, sizeof(GPIO_InitStruct));\n  GPIO_InitStruct.Pin       = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull      = GPIO_PULLUP;\n  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UartHandle = (UART_HandleTypeDef){\n    .Instance        = UART_DEV,\n    .Init.BaudRate   = CFG_BOARD_UART_BAUDRATE,\n    .Init.WordLength = UART_WORDLENGTH_8B,\n    .Init.StopBits   = UART_STOPBITS_1,\n    .Init.Parity     = UART_PARITY_NONE,\n    .Init.HwFlowCtl  = UART_HWCONTROL_NONE,\n    .Init.Mode       = UART_MODE_TX_RX,\n    .Init.OverSampling = UART_OVERSAMPLING_16\n  };\n  HAL_UART_Init(&UartHandle);\n#endif\n\n  // USB Pins TODO double check USB clock and pin setup\n  // Configure USB DM and DP pins. This is optional, and maintained only for user guidance.\n  memset(&GPIO_InitStruct, 0, sizeof(GPIO_InitStruct));\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  __HAL_RCC_USB_CLK_ENABLE();\n\n  board_vbus_sense_init();\n\n#if 1\n  // USB PD\n  // Default CC1/CC2 is PB4/PB6\n\n  // Enable pwr for disabling dead battery feature in Power's CR3\n  __HAL_RCC_PWR_CLK_ENABLE();\n  __HAL_RCC_CRC_CLK_ENABLE();\n  __HAL_RCC_UCPD1_CLK_ENABLE();\n\n  // Enable DMA for USB PD\n  __HAL_RCC_DMAMUX1_CLK_ENABLE();\n  __HAL_RCC_DMA1_CLK_ENABLE();\n#endif\n\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState)(state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t*)(uintptr_t) buf, len, 0xffff);\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32g4/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY g4)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32G4 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32G4)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${TOP}/src/portable/st/typec/typec_stm32.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32g4/family.mk",
    "content": "UF2_FAMILY_ID = 0x4c71240a\nST_FAMILY = g4\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32G4\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += -Wno-error=cast-align\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\tsrc/portable/st/typec/typec_stm32.c \\\n\t$(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT).s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32g4/stm32g4xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32g4xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32G4xx_HAL_CONF_H\n#define STM32G4xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n\n#define HAL_MODULE_ENABLED\n\n  /*#define HAL_ADC_MODULE_ENABLED   */\n/*#define HAL_COMP_MODULE_ENABLED   */\n/*#define HAL_CORDIC_MODULE_ENABLED   */\n/*#define HAL_CRC_MODULE_ENABLED   */\n/*#define HAL_CRYP_MODULE_ENABLED   */\n/*#define HAL_DAC_MODULE_ENABLED   */\n/*#define HAL_FDCAN_MODULE_ENABLED   */\n/*#define HAL_FMAC_MODULE_ENABLED   */\n/*#define HAL_HRTIM_MODULE_ENABLED   */\n/*#define HAL_IRDA_MODULE_ENABLED   */\n/*#define HAL_IWDG_MODULE_ENABLED   */\n/*#define HAL_I2C_MODULE_ENABLED   */\n/*#define HAL_I2S_MODULE_ENABLED   */\n/*#define HAL_LPTIM_MODULE_ENABLED   */\n/*#define HAL_NAND_MODULE_ENABLED   */\n/*#define HAL_NOR_MODULE_ENABLED   */\n/*#define HAL_OPAMP_MODULE_ENABLED   */\n/*#define HAL_PCD_MODULE_ENABLED   */\n/*#define HAL_QSPI_MODULE_ENABLED   */\n/*#define HAL_RNG_MODULE_ENABLED   */\n/*#define HAL_RTC_MODULE_ENABLED   */\n/*#define HAL_SAI_MODULE_ENABLED   */\n/*#define HAL_SMARTCARD_MODULE_ENABLED   */\n/*#define HAL_SMBUS_MODULE_ENABLED   */\n/*#define HAL_SPI_MODULE_ENABLED   */\n/*#define HAL_SRAM_MODULE_ENABLED   */\n/*#define HAL_TIM_MODULE_ENABLED   */\n#define HAL_UART_MODULE_ENABLED\n/*#define HAL_USART_MODULE_ENABLED   */\n/*#define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n\n/* ########################## Register Callbacks selection ############################## */\n/**\n  * @brief This is the list of modules where register callback can be used\n  */\n#define USE_HAL_ADC_REGISTER_CALLBACKS        0U\n#define USE_HAL_COMP_REGISTER_CALLBACKS       0U\n#define USE_HAL_CORDIC_REGISTER_CALLBACKS     0U\n#define USE_HAL_CRYP_REGISTER_CALLBACKS       0U\n#define USE_HAL_DAC_REGISTER_CALLBACKS        0U\n#define USE_HAL_EXTI_REGISTER_CALLBACKS       0U\n#define USE_HAL_FDCAN_REGISTER_CALLBACKS      0U\n#define USE_HAL_FMAC_REGISTER_CALLBACKS       0U\n#define USE_HAL_HRTIM_REGISTER_CALLBACKS      0U\n#define USE_HAL_I2C_REGISTER_CALLBACKS        0U\n#define USE_HAL_I2S_REGISTER_CALLBACKS        0U\n#define USE_HAL_IRDA_REGISTER_CALLBACKS       0U\n#define USE_HAL_LPTIM_REGISTER_CALLBACKS      0U\n#define USE_HAL_NAND_REGISTER_CALLBACKS       0U\n#define USE_HAL_NOR_REGISTER_CALLBACKS        0U\n#define USE_HAL_OPAMP_REGISTER_CALLBACKS      0U\n#define USE_HAL_PCD_REGISTER_CALLBACKS        0U\n#define USE_HAL_QSPI_REGISTER_CALLBACKS       0U\n#define USE_HAL_RNG_REGISTER_CALLBACKS        0U\n#define USE_HAL_RTC_REGISTER_CALLBACKS        0U\n#define USE_HAL_SAI_REGISTER_CALLBACKS        0U\n#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS  0U\n#define USE_HAL_SMBUS_REGISTER_CALLBACKS      0U\n#define USE_HAL_SPI_REGISTER_CALLBACKS        0U\n#define USE_HAL_SRAM_REGISTER_CALLBACKS       0U\n#define USE_HAL_TIM_REGISTER_CALLBACKS        0U\n#define USE_HAL_UART_REGISTER_CALLBACKS       0U\n#define USE_HAL_USART_REGISTER_CALLBACKS      0U\n#define USE_HAL_WWDG_REGISTER_CALLBACKS       0U\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE    (24000000UL) /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    (100UL)   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE    (16000000UL) /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG.\n  *        This internal oscillator is mainly dedicated to provide a high precision clock to\n  *        the USB peripheral by means of a special Clock Recovery System (CRS) circuitry.\n  *        When the CRS is not used, the HSI48 RC oscillator runs on it default frequency\n  *        which is subject to manufacturing process variations.\n  */\n#if !defined  (HSI48_VALUE)\n  #define HSI48_VALUE   (48000000UL) /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz.\n                                               The real value my vary depending on manufacturing process variations.*/\n#endif /* HSI48_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n/*!< Value of the Internal Low Speed oscillator in Hz\nThe real value may vary depending on the variations in voltage and temperature.*/\n#define LSI_VALUE  (32000UL)     /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n#define LSE_VALUE  (32768UL)    /*!< Value of the External Low Speed oscillator in Hz */\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n#define LSE_STARTUP_TIMEOUT    (5000UL)   /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for I2S and SAI peripherals\n  *        This value is used by the I2S and SAI HAL modules to compute the I2S and SAI clock source\n  *        frequency, this source is inserted directly through I2S_CKIN pad.\n  */\n#if !defined  (EXTERNAL_CLOCK_VALUE)\n#define EXTERNAL_CLOCK_VALUE    (12288000UL) /*!< Value of the External oscillator in Hz*/\n#endif /* EXTERNAL_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n\n#define  VDD_VALUE                   (3300UL) /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY           (0UL)    /*!< tick interrupt priority (lowest by default)  */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              0U\n#define  INSTRUCTION_CACHE_ENABLE     1U\n#define  DATA_CACHE_ENABLE            1U\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n * Activated: CRC code is present inside driver\n * Deactivated: CRC code cleaned from driver\n */\n\n#define USE_SPI_CRC                   0U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n#include \"stm32g4xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n#include \"stm32g4xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n#include \"stm32g4xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n#include \"stm32g4xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n#include \"stm32g4xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n#include \"stm32g4xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CORDIC_MODULE_ENABLED\n#include \"stm32g4xx_hal_cordic.h\"\n#endif /* HAL_CORDIC_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n#include \"stm32g4xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n#include \"stm32g4xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n#include \"stm32g4xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n#include \"stm32g4xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FDCAN_MODULE_ENABLED\n#include \"stm32g4xx_hal_fdcan.h\"\n#endif /* HAL_FDCAN_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n#include \"stm32g4xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_FMAC_MODULE_ENABLED\n#include \"stm32g4xx_hal_fmac.h\"\n#endif /* HAL_FMAC_MODULE_ENABLED */\n\n#ifdef HAL_HRTIM_MODULE_ENABLED\n#include \"stm32g4xx_hal_hrtim.h\"\n#endif /* HAL_HRTIM_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n#include \"stm32g4xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n#include \"stm32g4xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n#include \"stm32g4xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n#include \"stm32g4xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32g4xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n#include \"stm32g4xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n#include \"stm32g4xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_OPAMP_MODULE_ENABLED\n#include \"stm32g4xx_hal_opamp.h\"\n#endif /* HAL_OPAMP_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n#include \"stm32g4xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n#include \"stm32g4xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_QSPI_MODULE_ENABLED\n#include \"stm32g4xx_hal_qspi.h\"\n#endif /* HAL_QSPI_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n#include \"stm32g4xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n#include \"stm32g4xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n#include \"stm32g4xx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n#include \"stm32g4xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n#include \"stm32g4xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n#include \"stm32g4xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n#include \"stm32g4xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n#include \"stm32g4xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n#include \"stm32g4xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n#include \"stm32g4xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n#include \"stm32g4xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\nvoid assert_failed(uint8_t *file, uint32_t line);\n#else\n#define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32G4xx_HAL_CONF_H */\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32h5/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32h5xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 200 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* Define to trap errors during development. */\n// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7\n#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8_1M_MAIN__) || \\\n    defined(__ARM7M__) || defined (__ARM7EM__) || defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)\n  #define configASSERT(_exp) \\\n    do {\\\n      if ( !(_exp) ) { \\\n        volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \\\n        if ( (*ARM_CM_DHCSR) & 1UL ) {  /* Only halt mcu if debugger is attached */ \\\n          taskDISABLE_INTERRUPTS(); \\\n           __asm(\"BKPT #0\\n\"); \\\n        }\\\n      }\\\n    } while(0)\n#endif\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY       ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY  2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY               ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY          ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h503nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32h503xx)\nset(JLINK_DEVICE stm32h503rb)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H503xx\n    HSE_VALUE=24000000\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h503nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n * Copyright (c) 2023, HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H503 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-h503rb.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_5, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF13_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_4, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF13_USART3 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n\n  /** Configure the main internal regulator output voltage\n  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);\n\n  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = 12;\n  RCC_OscInitStruct.PLL.PLLN = 250;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1_VCIRANGE_1;\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1_VCORANGE_WIDE;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2\n                                |RCC_CLOCKTYPE_PCLK3;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n\n  // Configure CRS clock source\n  __HAL_RCC_CRS_CLK_ENABLE();\n  RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n  RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;\n  RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000, 1000);\n  RCC_CRSInitStruct.ErrorLimitValue = 34;\n  RCC_CRSInitStruct.HSI48CalibrationValue = 32;\n  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n\n  /* Select HSI48 as USB clock source */\n  RCC_PeriphCLKInitTypeDef usb_clk = {0 };\n  usb_clk.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  usb_clk.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&usb_clk);\n\n  /* Peripheral clock enable */\n  __HAL_RCC_USB_CLK_ENABLE();\n}\n\nstatic inline void board_init2(void) {\n  // Empty for this board\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport;\n  (void) state;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h503nucleo/board.mk",
    "content": "MCU_VARIANT = stm32h503xx\n\nCFLAGS += \\\n\t-DSTM32H503xx \\\n\t-DHSE_VALUE=24000000 \\\n\t-DCFG_EXAMPLE_VIDEO_READONLY \\\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h503rb\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h563nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32h563xx)\nset(JLINK_DEVICE stm32h563zi)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H563xx\n    HSE_VALUE=8000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h563nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n * Copyright (c) 2023, HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H563 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-h563zi.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_4, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF7_USART1 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF7_USART1 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n\n  /** Configure the main internal regulator output voltage\n  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);\n\n  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = 4;\n  RCC_OscInitStruct.PLL.PLLN = 250;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1_VCIRANGE_1;\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1_VCORANGE_WIDE;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2\n                              |RCC_CLOCKTYPE_PCLK3;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;\n\n  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  /** Configure the programming delay\n  */\n  __HAL_FLASH_SET_PROGRAM_DELAY(FLASH_PROGRAMMING_DELAY_2);\n\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.PLL3.PLL3Source = RCC_PLL3_SOURCE_HSE;\n  PeriphClkInitStruct.PLL3.PLL3M = 1;\n  PeriphClkInitStruct.PLL3.PLL3N = 18;\n  PeriphClkInitStruct.PLL3.PLL3P = 2;\n  PeriphClkInitStruct.PLL3.PLL3Q = 3;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n  PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3_VCIRANGE_1;\n  PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3_VCORANGE_WIDE;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0.0;\n  PeriphClkInitStruct.PLL3.PLL3ClockOut = RCC_PLL3_DIVQ;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3Q;\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)\n  {\n    Error_Handler();\n  }\n}\n\nstatic inline void board_init2(void) {\n  // Empty for this board\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport;\n  (void) state;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h563nucleo/board.mk",
    "content": "MCU_VARIANT = stm32h563xx\n\nCFLAGS += \\\n\t-DSTM32H563xx \\\n\t-DHSE_VALUE=8000000 \\\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h563zi\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h563nucleo/cubemx/stm32h563nucleo.ioc",
    "content": "#MicroXplorer Configuration settings - do not modify\nBOOTPATH.BootPathName=LEGACY\nBOOTPATH.IPParameters=BootPathName\nBOOTPATH.UserSelectedBootPath=LEGACY\nBSP_IP_NAME=NUCLEO-H563ZI\nCAD.formats=\nCAD.pinconfig=\nCAD.provider=\nCORTEX_M33_NS.userName=CORTEX_M33\nFile.Version=6\nGPIO.groupedBy=Group By Peripherals\nKeepUserPlacement=false\nMMTAppRegionsCount=0\nMMTConfigApplied=false\nMcu.CPN=STM32H563ZIT6\nMcu.ContextProject=TrustZoneDisabled\nMcu.Family=STM32H5\nMcu.IP0=BOOTPATH\nMcu.IP1=CORTEX_M33_NS\nMcu.IP10=NUCLEO-H563ZI\nMcu.IP2=DEBUG\nMcu.IP3=ICACHE\nMcu.IP4=MEMORYMAP\nMcu.IP5=NVIC\nMcu.IP6=PWR\nMcu.IP7=RCC\nMcu.IP8=SYS\nMcu.IP9=USB\nMcu.IPNb=11\nMcu.Name=STM32H563ZITx\nMcu.Package=LQFP144\nMcu.Pin0=PE2\nMcu.Pin1=PE3\nMcu.Pin10=PC1\nMcu.Pin11=PA1\nMcu.Pin12=PA2\nMcu.Pin13=PA4\nMcu.Pin14=PA7\nMcu.Pin15=PC4\nMcu.Pin16=PC5\nMcu.Pin17=PB0\nMcu.Pin18=PB13\nMcu.Pin19=PB14\nMcu.Pin2=PE4\nMcu.Pin20=PB15\nMcu.Pin21=PD8\nMcu.Pin22=PD9\nMcu.Pin23=PG4\nMcu.Pin24=PG7\nMcu.Pin25=PA9\nMcu.Pin26=PA11\nMcu.Pin27=PA12\nMcu.Pin28=PA13(JTMS/SWDIO)\nMcu.Pin29=PA14(JTCK/SWCLK)\nMcu.Pin3=PE5\nMcu.Pin30=PA15(JTDI)\nMcu.Pin31=PG11\nMcu.Pin32=PG13\nMcu.Pin33=PB3(JTDO/TRACESWO)\nMcu.Pin34=PB6\nMcu.Pin35=PB7\nMcu.Pin36=VP_ICACHE_VS_ICACHE\nMcu.Pin37=VP_PWR_VS_SECSignals\nMcu.Pin38=VP_PWR_VS_LPOM\nMcu.Pin39=VP_PWR_VS_DBSignals\nMcu.Pin4=PE6\nMcu.Pin40=VP_SYS_VS_Systick\nMcu.Pin41=VP_BOOTPATH_VS_BOOTPATH\nMcu.Pin42=VP_MEMORYMAP_VS_MEMORYMAP\nMcu.Pin5=PC13\nMcu.Pin6=PC14-OSC32_IN(OSC32_IN)\nMcu.Pin7=PC15-OSC32_OUT(OSC32_OUT)\nMcu.Pin8=PF4\nMcu.Pin9=PH0-OSC_IN(PH0)\nMcu.PinsNb=43\nMcu.ThirdPartyNb=0\nMcu.UserConstants=\nMcu.UserName=STM32H563ZITx\nMxCube.Version=6.12.1\nMxDb.Version=DB.6.0.121\nNVIC.BusFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.DebugMonitor_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.EXTI13_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:true\\:true\nNVIC.ForceEnableDMAVector=true\nNVIC.HardFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.MemoryManagement_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.NonMaskableInt_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.PendSV_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.PriorityGroup=NVIC_PRIORITYGROUP_4\nNVIC.SVCall_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.SysTick_IRQn=true\\:15\\:0\\:false\\:false\\:true\\:false\\:true\\:false\nNVIC.UsageFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nPA1.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPA1.GPIO_Label=RMII_REF_CLK\nPA1.GPIO_Mode=GPIO_MODE_AF_PP\nPA1.GPIO_PuPd=GPIO_NOPULL\nPA1.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPA1.Locked=true\nPA1.Signal=ETH_REF_CLK\nPA11.GPIOParameters=GPIO_Label\nPA11.GPIO_Label=USB_FS_N\nPA11.Locked=true\nPA11.Mode=Device\nPA11.Signal=USB_DM\nPA12.GPIOParameters=GPIO_Label\nPA12.GPIO_Label=USB_FS_P\nPA12.Locked=true\nPA12.Mode=Device\nPA12.Signal=USB_DP\nPA13(JTMS/SWDIO).GPIOParameters=GPIO_Label\nPA13(JTMS/SWDIO).GPIO_Label=SWDIO\nPA13(JTMS/SWDIO).Locked=true\nPA13(JTMS/SWDIO).Mode=Trace_Synchro_4bits_JTAG\nPA13(JTMS/SWDIO).Signal=DEBUG_JTMS-SWDIO\nPA14(JTCK/SWCLK).GPIOParameters=GPIO_Label\nPA14(JTCK/SWCLK).GPIO_Label=SWCLK\nPA14(JTCK/SWCLK).Locked=true\nPA14(JTCK/SWCLK).Mode=Trace_Synchro_4bits_JTAG\nPA14(JTCK/SWCLK).Signal=DEBUG_JTCK-SWCLK\nPA15(JTDI).GPIOParameters=GPIO_Label\nPA15(JTDI).GPIO_Label=T_JTDI\nPA15(JTDI).Locked=true\nPA15(JTDI).Mode=Trace_Synchro_4bits_JTAG\nPA15(JTDI).Signal=DEBUG_JTDI\nPA2.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPA2.GPIO_Label=RMII_MDIO\nPA2.GPIO_Mode=GPIO_MODE_AF_PP\nPA2.GPIO_PuPd=GPIO_NOPULL\nPA2.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPA2.Locked=true\nPA2.Signal=ETH_MDIO\nPA4.GPIOParameters=GPIO_Label\nPA4.GPIO_Label=VBUS_SENSE\nPA4.Locked=true\nPA4.Signal=ADCx_INP18\nPA7.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPA7.GPIO_Label=RMII_CRS_DV\nPA7.GPIO_Mode=GPIO_MODE_AF_PP\nPA7.GPIO_PuPd=GPIO_NOPULL\nPA7.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPA7.Locked=true\nPA7.Signal=ETH_CRS_DV\nPA9.GPIOParameters=GPIO_Label\nPA9.GPIO_Label=UCDP_DBn\nPA9.Locked=true\nPA9.Signal=UCPD1_DB1\nPB0.Locked=true\nPB0.Signal=GPIO_Output\nPB13.GPIOParameters=GPIO_Label\nPB13.GPIO_Label=UCPD_CC1\nPB13.Locked=true\nPB13.Signal=UCPD1_CC1\nPB14.GPIOParameters=GPIO_Label\nPB14.GPIO_Label=UCPD_CC2\nPB14.Locked=true\nPB14.Signal=UCPD1_CC2\nPB15.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPB15.GPIO_Label=RMII_TXD1\nPB15.GPIO_Mode=GPIO_MODE_AF_PP\nPB15.GPIO_PuPd=GPIO_NOPULL\nPB15.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPB15.Locked=true\nPB15.Signal=ETH_TXD1\nPB3(JTDO/TRACESWO).GPIOParameters=GPIO_Label\nPB3(JTDO/TRACESWO).GPIO_Label=SWO\nPB3(JTDO/TRACESWO).Locked=true\nPB3(JTDO/TRACESWO).Mode=Trace_Synchro_4bits_JTAG\nPB3(JTDO/TRACESWO).Signal=DEBUG_JTDO-SWO\nPB6.GPIOParameters=GPIO_Label\nPB6.GPIO_Label=ARD_D1_TX\nPB6.Locked=true\nPB6.Signal=LPUART1_TX\nPB7.GPIOParameters=GPIO_Label\nPB7.GPIO_Label=ARD_D0_RX\nPB7.Locked=true\nPB7.Signal=LPUART1_RX\nPC1.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPC1.GPIO_Label=RMII_MDC\nPC1.GPIO_Mode=GPIO_MODE_AF_PP\nPC1.GPIO_PuPd=GPIO_NOPULL\nPC1.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPC1.Locked=true\nPC1.Signal=ETH_MDC\nPC13.Locked=true\nPC13.Signal=GPXTI13\nPC14-OSC32_IN(OSC32_IN).Locked=true\nPC14-OSC32_IN(OSC32_IN).Mode=LSE-External-Oscillator\nPC14-OSC32_IN(OSC32_IN).Signal=RCC_OSC32_IN\nPC15-OSC32_OUT(OSC32_OUT).Locked=true\nPC15-OSC32_OUT(OSC32_OUT).Mode=LSE-External-Oscillator\nPC15-OSC32_OUT(OSC32_OUT).Signal=RCC_OSC32_OUT\nPC4.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPC4.GPIO_Label=RMII_RXD0\nPC4.GPIO_Mode=GPIO_MODE_AF_PP\nPC4.GPIO_PuPd=GPIO_NOPULL\nPC4.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPC4.Locked=true\nPC4.Signal=ETH_RXD0\nPC5.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPC5.GPIO_Label=RMII_RXD1\nPC5.GPIO_Mode=GPIO_MODE_AF_PP\nPC5.GPIO_PuPd=GPIO_NOPULL\nPC5.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPC5.Locked=true\nPC5.Signal=ETH_RXD1\nPD8.Locked=true\nPD8.Signal=USART3_TX\nPD9.Locked=true\nPD9.Signal=USART3_RX\nPE2.GPIOParameters=GPIO_Label\nPE2.GPIO_Label=TRACE_CK\nPE2.Locked=true\nPE2.Mode=Trace_Synchro_4bits_JTAG\nPE2.Signal=DEBUG_TRACECLK\nPE3.GPIOParameters=GPIO_Label\nPE3.GPIO_Label=TRACE_D0\nPE3.Locked=true\nPE3.Mode=Trace_Synchro_4bits_JTAG\nPE3.Signal=DEBUG_TRACED0\nPE4.GPIOParameters=GPIO_Label\nPE4.GPIO_Label=TRACE_D1\nPE4.Locked=true\nPE4.Mode=Trace_Synchro_4bits_JTAG\nPE4.Signal=DEBUG_TRACED1\nPE5.GPIOParameters=GPIO_Label\nPE5.GPIO_Label=TRACE_D2\nPE5.Locked=true\nPE5.Mode=Trace_Synchro_4bits_JTAG\nPE5.Signal=DEBUG_TRACED2\nPE6.GPIOParameters=GPIO_Label\nPE6.GPIO_Label=TRACE_D3\nPE6.Locked=true\nPE6.Mode=Trace_Synchro_4bits_JTAG\nPE6.Signal=DEBUG_TRACED3\nPF4.Locked=true\nPF4.Signal=GPIO_Output\nPG11.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPG11.GPIO_Label=RMII_TXT_EN\nPG11.GPIO_Mode=GPIO_MODE_AF_PP\nPG11.GPIO_PuPd=GPIO_NOPULL\nPG11.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPG11.Locked=true\nPG11.Signal=ETH_TX_EN\nPG13.GPIOParameters=GPIO_Speed,GPIO_PuPd,GPIO_Label,GPIO_Mode\nPG13.GPIO_Label=RMI_TXD0\nPG13.GPIO_Mode=GPIO_MODE_AF_PP\nPG13.GPIO_PuPd=GPIO_NOPULL\nPG13.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPG13.Locked=true\nPG13.Signal=ETH_TXD0\nPG4.Locked=true\nPG4.Signal=GPIO_Output\nPG7.GPIOParameters=GPIO_Label\nPG7.GPIO_Label=UCPD_FLT\nPG7.Locked=true\nPG7.Signal=GPXTI7\nPH0-OSC_IN(PH0).GPIOParameters=GPIO_Label\nPH0-OSC_IN(PH0).GPIO_Label=STLK_MCO\nPH0-OSC_IN(PH0).Locked=true\nPH0-OSC_IN(PH0).Mode=HSE-External-Clock-Source\nPH0-OSC_IN(PH0).Signal=RCC_OSC_IN\nPinOutPanel.RotationAngle=0\nProjectManager.AskForMigrate=true\nProjectManager.BackupPrevious=false\nProjectManager.CompilerOptimize=6\nProjectManager.ComputerToolchain=false\nProjectManager.CoupleFile=false\nProjectManager.CustomerFirmwarePackage=\nProjectManager.DefaultFWLocation=true\nProjectManager.DeletePrevious=true\nProjectManager.DeviceId=STM32H563ZITx\nProjectManager.FirmwarePackage=STM32Cube FW_H5 V1.3.0\nProjectManager.FreePins=false\nProjectManager.HalAssertFull=false\nProjectManager.HeapSize=0x200\nProjectManager.KeepUserCode=true\nProjectManager.LastFirmware=true\nProjectManager.LibraryCopy=2\nProjectManager.MainLocation=Core/Src\nProjectManager.NoMain=false\nProjectManager.PreviousToolchain=\nProjectManager.ProjectBuild=false\nProjectManager.ProjectFileName=stm32h563nucleo.ioc\nProjectManager.ProjectName=stm32h563nucleo\nProjectManager.ProjectStructure=\nProjectManager.RegisterCallBack=\nProjectManager.StackSize=0x400\nProjectManager.TargetToolchain=Makefile\nProjectManager.ToolChainLocation=\nProjectManager.UAScriptAfterPath=\nProjectManager.UAScriptBeforePath=\nProjectManager.UnderRoot=false\nProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USB_PCD_Init-USB-false-HAL-true,4-MX_ICACHE_Init-ICACHE-false-HAL-true,0-MX_CORTEX_M33_NS_Init-CORTEX_M33_NS-false-HAL-true,0-MX_PWR_Init-PWR-false-HAL-true\nRCC.ADCFreq_Value=250000000\nRCC.AHBFreq_Value=250000000\nRCC.APB1Freq_Value=250000000\nRCC.APB1TimFreq_Value=250000000\nRCC.APB2Freq_Value=250000000\nRCC.APB2TimFreq_Value=250000000\nRCC.APB3Freq_Value=250000000\nRCC.CECFreq_Value=32000\nRCC.CKPERFreq_Value=64000000\nRCC.CRSFreq_Value=48000000\nRCC.CSI_VALUE=4000000\nRCC.CortexFreq_Value=250000000\nRCC.DACFreq_Value=32768\nRCC.EPOD_VALUE=8000000\nRCC.ETHFreq_Value=250000000\nRCC.FCLKCortexFreq_Value=250000000\nRCC.FDCANFreq_Value=8000000\nRCC.FamilyName=M\nRCC.HCLKFreq_Value=250000000\nRCC.HSE_VALUE=8000000\nRCC.HSI48_VALUE=48000000\nRCC.HSIDiv=RCC_HSI_DIV1\nRCC.HSI_VALUE=64000000\nRCC.I2C1Freq_Value=250000000\nRCC.I2C2Freq_Value=250000000\nRCC.I2C3Freq_Value=250000000\nRCC.I2C4Freq_Value=250000000\nRCC.I3C1Freq_Value=250000000\nRCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,APB3Freq_Value,CECFreq_Value,CKPERFreq_Value,CRSFreq_Value,CSI_VALUE,CortexFreq_Value,DACFreq_Value,EPOD_VALUE,ETHFreq_Value,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSIDiv,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I3C1Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM3Freq_Value,LPTIM4Freq_Value,LPTIM5Freq_Value,LPTIM6Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSIRC_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,OCTOSPIMFreq_Value,PLL2PoutputFreq_Value,PLL2QoutputFreq_Value,PLL2RoutputFreq_Value,PLL2Source,PLL3FRACN,PLL3N,PLL3PoutputFreq_Value,PLL3Q,PLL3QoutputFreq_Value,PLL3RoutputFreq_Value,PLL3Source,PLLFRACN,PLLM,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMC1Freq_Value,SDMMC2Freq_Value,SPI1Freq_Value,SPI2Freq_Value,SPI3Freq_Value,SPI4Freq_Value,SPI5Freq_Value,SPI6Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART12Freq_Value,UART4Freq_Value,UART5Freq_Value,UART7Freq_Value,UART8Freq_Value,UART9Freq_Value,UCPD1outputFreq_Value,USART10Freq_Value,USART11Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USART6Freq_Value,USBCLockSelection,USBFreq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOPLL2OutputFreq_Value,VCOPLL3OutputFreq_Value\nRCC.LPTIM1Freq_Value=250000000\nRCC.LPTIM2Freq_Value=250000000\nRCC.LPTIM3Freq_Value=250000000\nRCC.LPTIM4Freq_Value=250000000\nRCC.LPTIM5Freq_Value=250000000\nRCC.LPTIM6Freq_Value=250000000\nRCC.LPUART1Freq_Value=250000000\nRCC.LSCOPinFreq_Value=32000\nRCC.LSIRC_VALUE=32000\nRCC.MCO1PinFreq_Value=64000000\nRCC.MCO2PinFreq_Value=250000000\nRCC.OCTOSPIMFreq_Value=250000000\nRCC.PLL2PoutputFreq_Value=516000000\nRCC.PLL2QoutputFreq_Value=516000000\nRCC.PLL2RoutputFreq_Value=516000000\nRCC.PLL2Source=RCC_PLL2_SOURCE_HSE\nRCC.PLL3FRACN=0\nRCC.PLL3N=18\nRCC.PLL3PoutputFreq_Value=72000000\nRCC.PLL3Q=3\nRCC.PLL3QoutputFreq_Value=48000000\nRCC.PLL3RoutputFreq_Value=72000000\nRCC.PLL3Source=RCC_PLL3_SOURCE_HSE\nRCC.PLLFRACN=0\nRCC.PLLM=4\nRCC.PLLN=250\nRCC.PLLPoutputFreq_Value=250000000\nRCC.PLLQoutputFreq_Value=250000000\nRCC.PLLSourceVirtual=RCC_PLL1_SOURCE_HSE\nRCC.PWRFreq_Value=250000000\nRCC.RNGFreq_Value=48000000\nRCC.SAI1Freq_Value=516000000\nRCC.SAI2Freq_Value=516000000\nRCC.SDMMC1Freq_Value=250000000\nRCC.SDMMC2Freq_Value=250000000\nRCC.SPI1Freq_Value=250000000\nRCC.SPI2Freq_Value=250000000\nRCC.SPI3Freq_Value=250000000\nRCC.SPI4Freq_Value=250000000\nRCC.SPI5Freq_Value=250000000\nRCC.SPI6Freq_Value=250000000\nRCC.SYSCLKFreq_VALUE=250000000\nRCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK\nRCC.UART12Freq_Value=250000000\nRCC.UART4Freq_Value=250000000\nRCC.UART5Freq_Value=250000000\nRCC.UART7Freq_Value=250000000\nRCC.UART8Freq_Value=250000000\nRCC.UART9Freq_Value=250000000\nRCC.UCPD1outputFreq_Value=16000000\nRCC.USART10Freq_Value=250000000\nRCC.USART11Freq_Value=250000000\nRCC.USART1Freq_Value=250000000\nRCC.USART2Freq_Value=250000000\nRCC.USART3Freq_Value=250000000\nRCC.USART6Freq_Value=250000000\nRCC.USBCLockSelection=RCC_USBCLKSOURCE_PLL3Q\nRCC.USBFreq_Value=48000000\nRCC.VCOInput2Freq_Value=8000000\nRCC.VCOInput3Freq_Value=8000000\nRCC.VCOInputFreq_Value=2000000\nRCC.VCOOutputFreq_Value=500000000\nRCC.VCOPLL2OutputFreq_Value=1032000000\nRCC.VCOPLL3OutputFreq_Value=144000000\nSH.ADCx_INP18.0=ADC1_INP18\nSH.ADCx_INP18.ConfNb=1\nSH.GPXTI13.0=GPIO_EXTI13\nSH.GPXTI13.ConfNb=1\nSH.GPXTI7.0=GPIO_EXTI7\nSH.GPXTI7.ConfNb=1\nUSB.IPParameters=VirtualMode\nUSB.VirtualMode=Device_Only\nVP_BOOTPATH_VS_BOOTPATH.Mode=BP_Activate\nVP_BOOTPATH_VS_BOOTPATH.Signal=BOOTPATH_VS_BOOTPATH\nVP_ICACHE_VS_ICACHE.Mode=DirectMappedCache\nVP_ICACHE_VS_ICACHE.Signal=ICACHE_VS_ICACHE\nVP_MEMORYMAP_VS_MEMORYMAP.Mode=CurAppReg\nVP_MEMORYMAP_VS_MEMORYMAP.Signal=MEMORYMAP_VS_MEMORYMAP\nVP_PWR_VS_DBSignals.Mode=DisableDeadBatterySignals\nVP_PWR_VS_DBSignals.Signal=PWR_VS_DBSignals\nVP_PWR_VS_LPOM.Mode=PowerOptimisation\nVP_PWR_VS_LPOM.Signal=PWR_VS_LPOM\nVP_PWR_VS_SECSignals.Mode=Security/Privilege\nVP_PWR_VS_SECSignals.Signal=PWR_VS_SECSignals\nVP_SYS_VS_Systick.Mode=SysTick\nVP_SYS_VS_Systick.Signal=SYS_VS_Systick\nboard=NUCLEO-H563ZI\nboardIOC=true\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h573i_dk/board.cmake",
    "content": "set(MCU_VARIANT stm32h573xx)\nset(JLINK_DEVICE stm32h573ii)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H573xx\n    )\n  target_sources(${TARGET} PUBLIC\n    ${ST_TCPP0203}/tcpp0203.c\n    ${ST_TCPP0203}/tcpp0203_reg.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${ST_TCPP0203}\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h573i_dk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n * Copyright (c) 2023, HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H573i Discovery\n   url: https://www.st.com/en/evaluation-tools/stm32h573i-dk.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"tcpp0203.h\"\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED          0\n#define PINID_BUTTON       1\n#define PINID_UART_TX      2\n#define PINID_UART_RX      3\n#define PINID_TCPP0203_EN  4\n#define PINID_I2C_SCL      5\n#define PINID_I2C_SDA      6\n#define PINID_TCPP0203_INT 7\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOI,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF7_USART1 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF7_USART1 },\n    .active_state = 0\n  },\n  { // TCPP0203 VCC_EN\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // I2C4 SCL\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF6_I2C4 },\n    .active_state = 0\n  },\n  { // I2C4 SDA\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF6_I2C4 },\n    .active_state = 0\n  },\n  { // TCPP0203 INT\n    .port = GPIOG,\n    .pin_init = { .Pin = GPIO_PIN_1, .Mode = GPIO_MODE_IT_FALLING, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n\n  /** Configure the main internal regulator output voltage */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  Freq 250MHZ */\n\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS_DIGITAL;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = 5;\n  RCC_OscInitStruct.PLL.PLLN = 100;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 10;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1_VCIRANGE_2;\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1_VCORANGE_WIDE;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n\n  // Configure CRS clock source\n  __HAL_RCC_CRS_CLK_ENABLE();\n  RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n  RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;\n  RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000, 1000);\n  RCC_CRSInitStruct.ErrorLimitValue = 34;\n  RCC_CRSInitStruct.HSI48CalibrationValue = 32;\n  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n\n  /* Select HSI48 as USB clock source */\n  RCC_PeriphCLKInitTypeDef usb_clk = {0 };\n  usb_clk.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  usb_clk.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&usb_clk);\n\n  /* Peripheral clock enable */\n  __HAL_RCC_USB_CLK_ENABLE();\n}\n\n//--------------------------------------------------------------------+\n// USB PD\n//--------------------------------------------------------------------+\nstatic I2C_HandleTypeDef i2c_handle = {\n  .Instance = I2C4,\n  .Init = {\n    .Timing = 0x20C0EDFF, // 100kHz @ 250MHz\n    .OwnAddress1 = 0,\n    .AddressingMode = I2C_ADDRESSINGMODE_7BIT,\n    .DualAddressMode = I2C_DUALADDRESS_DISABLE,\n    .OwnAddress2 = 0,\n    .OwnAddress2Masks = I2C_OA2_NOMASK,\n    .GeneralCallMode = I2C_GENERALCALL_DISABLE,\n    .NoStretchMode = I2C_NOSTRETCH_DISABLE,\n  }\n};\nstatic TCPP0203_Object_t tcpp0203_obj = { 0 };\n\nint32_t board_tcpp0203_init(void) {\n  // Enable TCPP0203 VCC (GPIO already configured in pindef array)\n  board_pindef_t* pindef = &board_pindef[PINID_TCPP0203_EN];\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, GPIO_PIN_SET);\n\n  // Initialize I2C4 for TCPP0203 (GPIO already configured in pindef array)\n  __HAL_RCC_I2C4_CLK_ENABLE();\n  __HAL_RCC_I2C4_FORCE_RESET();\n  __HAL_RCC_I2C4_RELEASE_RESET();\n  if (HAL_I2C_Init(&i2c_handle) != HAL_OK) {\n    return HAL_ERROR;\n  }\n\n  // Enable interrupt for TCPP0203 FLGn (GPIO already configured in pindef array)\n  NVIC_SetPriority(EXTI1_IRQn, 12);\n  NVIC_EnableIRQ(EXTI1_IRQn);\n\n  return 0;\n}\n\nint32_t board_tcpp0203_deinit(void) {\n  return 0;\n}\n\nint32_t i2c_readreg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  TU_ASSERT (HAL_OK == HAL_I2C_Mem_Read(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000));\n  return 0;\n}\n\nint32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  TU_ASSERT(HAL_OK == HAL_I2C_Mem_Write(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000));\n  return 0;\n}\n\nstatic inline void board_init2(void) {\n  TCPP0203_IO_t            io_ctx;\n\n  io_ctx.Address     = TCPP0203_I2C_ADDRESS_X68;\n  io_ctx.Init        = board_tcpp0203_init;\n  io_ctx.DeInit      = board_tcpp0203_deinit;\n  io_ctx.ReadReg     = i2c_readreg;\n  io_ctx.WriteReg    = i2c_writereg;\n\n  TU_ASSERT(TCPP0203_RegisterBusIO(&tcpp0203_obj, &io_ctx) == TCPP0203_OK, );\n\n  TU_ASSERT(TCPP0203_Init(&tcpp0203_obj) == TCPP0203_OK, );\n\n  TU_ASSERT(TCPP0203_SetPowerMode(&tcpp0203_obj, TCPP0203_POWER_MODE_NORMAL) == TCPP0203_OK, );\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  (void) state;\n  if (rhport == 0) {\n    TU_ASSERT(TCPP0203_SetGateDriverProvider(&tcpp0203_obj, TCPP0203_GD_PROVIDER_SWITCH_CLOSED) == TCPP0203_OK, );\n  }\n}\n\nvoid EXTI1_IRQHandler(void) {\n    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_1);\n    if (tcpp0203_obj.IsInitialized) {\n      TU_ASSERT(TCPP0203_SetPowerMode(&tcpp0203_obj, TCPP0203_POWER_MODE_NORMAL) == TCPP0203_OK, );\n      TU_ASSERT(TCPP0203_SetGateDriverProvider(&tcpp0203_obj, TCPP0203_GD_PROVIDER_SWITCH_CLOSED) == TCPP0203_OK, );\n    }\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32h5/boards/stm32h573i_dk/board.mk",
    "content": "MCU_VARIANT = stm32h573xx\n\nCFLAGS += \\\n\t-DSTM32H573xx\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h573ii\n\nSRC_C += \\\n\t$(ST_TCPP0203)/tcpp0203.c \\\n\t$(ST_TCPP0203)/tcpp0203_reg.c \\\n\nINC += \\\n\t$(TOP)/$(ST_TCPP0203) \\\n"
  },
  {
    "path": "hw/bsp/stm32h5/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2023 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wundef\"\n#endif\n\n#include \"stm32h5xx_hal.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n\nTU_ATTR_UNUSED static void Error_Handler(void) {\n}\n\ntypedef struct {\n  GPIO_TypeDef* port;\n  GPIO_InitTypeDef pin_init;\n  uint8_t active_state;\n} board_pindef_t;\n\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_DRD_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#ifdef UART_DEV\nstatic UART_HandleTypeDef UartHandle = {\n  .Instance = UART_DEV,\n  .Init = {\n    .BaudRate = CFG_BOARD_UART_BAUDRATE,\n    .WordLength = UART_WORDLENGTH_8B,\n    .StopBits = UART_STOPBITS_1,\n    .Parity = UART_PARITY_NONE,\n    .HwFlowCtl = UART_HWCONTROL_NONE,\n    .Mode = UART_MODE_TX_RX,\n    .OverSampling = UART_OVERSAMPLING_16,\n    .AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT\n  }\n};\n#endif\n\nvoid board_init(void) {\n  HAL_Init(); // required for HAL_RCC_Osc TODO check with freeRTOS\n  SystemClock_Config(); // implemented in board.h\n  SystemCoreClockUpdate();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOH_CLK_ENABLE();\n\n  #ifdef __HAL_RCC_GPIOE_CLK_ENABLE\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n  #endif\n  #ifdef __HAL_RCC_GPIOG_CLK_ENABLE\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n  #endif\n  #ifdef __HAL_RCC_GPIOI_CLK_ENABLE\n  __HAL_RCC_GPIOI_CLK_ENABLE();\n  #endif\n\n  #if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n  #elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_DRD_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #endif\n\n  for (uint8_t i = 0; i < TU_ARRAY_SIZE(board_pindef); i++) {\n    HAL_GPIO_Init(board_pindef[i].port, &board_pindef[i].pin_init);\n  }\n\n  #ifdef UART_DEV\n  UART_CLK_EN();\n  HAL_UART_Init(&UartHandle);\n  #endif\n\n  // USB Pins TODO double check USB clock and pin setup\n  // Configure USB DM and DP pins. This is optional, and maintained only for user guidance.\n  GPIO_InitTypeDef GPIO_InitStruct;\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Peripheral clock enable */\n  __HAL_RCC_USB_CLK_ENABLE();\n\n  /* Enable VDDUSB */\n  #if defined (PWR_USBSCR_USB33DEN)\n  HAL_PWREx_EnableVddUSB();\n  #endif\n\n  board_init2();\n\n#if CFG_TUH_ENABLED\n  board_vbus_set(BOARD_TUH_RHPORT, 1);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n#ifdef PINID_LED\n  board_pindef_t* pindef = &board_pindef[PINID_LED];\n  GPIO_PinState pin_state = state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET;\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, pin_state);\n#else\n  (void) state;\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef PINID_BUTTON\n  board_pindef_t* pindef = &board_pindef[PINID_BUTTON];\n  return pindef->active_state == HAL_GPIO_ReadPin(pindef->port, pindef->pin_init.Pin);\n#else\n  return 0;\n#endif\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t* stm32_uuid = (volatile uint32_t*) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n  #ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t*) (uintptr_t) buf, len, 0xffff);\n  return len;\n  #else\n  (void) buf;\n  (void) len;\n  return 0;\n  #endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n  HAL_IncTick();\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/stm32h5/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY h5)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(ST_TCPP0203 ${TOP}/hw/mcu/st/stm32-tcpp0203)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32H5 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nstring(REPLACE \"stm32h\" \"STM32H\" MCU_VARIANT_UPPER ${MCU_VARIANT})\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/${MCU_VARIANT_UPPER}_FLASH.ld)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${CMAKE_CURRENT_LIST_DIR}/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_i2c.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32H5)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/hcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${TOP}/src/portable/st/typec/typec_stm32.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h5/family.mk",
    "content": "ST_FAMILY = h5\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\nST_TCPP0203 = hw/mcu/st/stm32-tcpp0203\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m33\n\nMCU_VARIANT_UPPER = $(subst stm32h,STM32H,$(MCU_VARIANT))\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32H5\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += \\\n  -Wno-error=cast-align \\\n  -Wno-error=undef \\\n  -Wno-error=unused-parameter \\\n\nCFLAGS_CLANG += \\\n  -Wno-error=parentheses-equality\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/hcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_i2c.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_dma.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT).s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\nLD_FILE_GCC = $(FAMILY_PATH)/linker/$(MCU_VARIANT_UPPER)_FLASH.ld\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/STM32H503xx_FLASH.ld",
    "content": "/*\n ******************************************************************************\n **\n ** @file        : LinkerScript.ld\n **\n ** @author      : Auto-generated by STM32CubeIDE\n **\n ** @brief       : Linker script for STM32H503xx Device from STM32H5 series\n **                      128Kbytes FLASH\n **                      32Kbytes RAM\n **\n **                Set heap size, stack size and stack location according\n **                to application requirements.\n **\n **                Set memory bank area and size if external memory is used\n **\n **  Target      : STMicroelectronics STM32\n **\n **  Distribution: The file is distributed as is, without any warranty\n **                of any kind.\n **\n ******************************************************************************\n ** @attention\n **\n ** Copyright (c) 2023 STMicroelectronics.\n ** All rights reserved.\n **\n ** This software is licensed under terms that can be found in the LICENSE file\n ** in the root directory of this software component.\n ** If no LICENSE file comes with this software, it is provided AS-IS.\n **\n ******************************************************************************\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 32K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 128K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/STM32H523xx_FLASH.ld",
    "content": "/*\n ******************************************************************************\n **\n ** @file        : LinkerScript.ld\n **\n ** @author      : Auto-generated by STM32CubeIDE\n **\n ** @brief       : Linker script for STM32H523xx Device from STM32H5 series\n **                      512Kbytes FLASH\n **                      272Kbytes RAM\n **\n **                Set heap size, stack size and stack location according\n **                to application requirements.\n **\n **                Set memory bank area and size if external memory is used\n **\n **  Target      : STMicroelectronics STM32\n **\n **  Distribution: The file is distributed as is, without any warranty\n **                of any kind.\n **\n ******************************************************************************\n ** @attention\n **\n ** Copyright (c) 2023 STMicroelectronics.\n ** All rights reserved.\n **\n ** This software is licensed under terms that can be found in the LICENSE file\n ** in the root directory of this software component.\n ** If no LICENSE file comes with this software, it is provided AS-IS.\n **\n ******************************************************************************\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 272K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/STM32H533xx_FLASH.ld",
    "content": "/*\n ******************************************************************************\n **\n ** @file        : LinkerScript.ld\n **\n ** @author      : Auto-generated by STM32CubeIDE\n **\n ** @brief       : Linker script for STM32H533xx Device from STM32H5 series\n **                      512Kbytes FLASH\n **                      272Kbytes RAM\n **\n **                Set heap size, stack size and stack location according\n **                to application requirements.\n **\n **                Set memory bank area and size if external memory is used\n **\n **  Target      : STMicroelectronics STM32\n **\n **  Distribution: The file is distributed as is, without any warranty\n **                of any kind.\n **\n ******************************************************************************\n ** @attention\n **\n ** Copyright (c) 2023 STMicroelectronics.\n ** All rights reserved.\n **\n ** This software is licensed under terms that can be found in the LICENSE file\n ** in the root directory of this software component.\n ** If no LICENSE file comes with this software, it is provided AS-IS.\n **\n ******************************************************************************\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 272K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/STM32H562xx_FLASH.ld",
    "content": "/*\n ******************************************************************************\n **\n ** @file        : LinkerScript.ld\n **\n ** @author      : Auto-generated by STM32CubeIDE\n **\n ** @brief       : Linker script for STM32H562xx Device from STM32H5 series\n **                      2048Kbytes FLASH\n **                      640Kbytes RAM\n **\n **                Set heap size, stack size and stack location according\n **                to application requirements.\n **\n **                Set memory bank area and size if external memory is used\n **\n **  Target      : STMicroelectronics STM32\n **\n **  Distribution: The file is distributed as is, without any warranty\n **                of any kind.\n **\n ******************************************************************************\n ** @attention\n **\n ** Copyright (c) 2023 STMicroelectronics.\n ** All rights reserved.\n **\n ** This software is licensed under terms that can be found in the LICENSE file\n ** in the root directory of this software component.\n ** If no LICENSE file comes with this software, it is provided AS-IS.\n **\n ******************************************************************************\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 640K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 2048K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/STM32H563xx_FLASH.ld",
    "content": "/*\n ******************************************************************************\n **\n ** @file        : LinkerScript.ld\n **\n ** @author      : Auto-generated by STM32CubeIDE\n **\n ** @brief       : Linker script for STM32H563xx Device from STM32H5 series\n **                      2048Kbytes FLASH\n **                      640Kbytes RAM\n **\n **                Set heap size, stack size and stack location according\n **                to application requirements.\n **\n **                Set memory bank area and size if external memory is used\n **\n **  Target      : STMicroelectronics STM32\n **\n **  Distribution: The file is distributed as is, without any warranty\n **                of any kind.\n **\n ******************************************************************************\n ** @attention\n **\n ** Copyright (c) 2023 STMicroelectronics.\n ** All rights reserved.\n **\n ** This software is licensed under terms that can be found in the LICENSE file\n ** in the root directory of this software component.\n ** If no LICENSE file comes with this software, it is provided AS-IS.\n **\n ******************************************************************************\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 640K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 2048K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/STM32H573xx_FLASH.ld",
    "content": "/*\n ******************************************************************************\n **\n ** @file        : LinkerScript.ld\n **\n ** @author      : Auto-generated by STM32CubeIDE\n **\n ** @brief       : Linker script for STM32H573xx Device from STM32H5 series\n **                      2048Kbytes FLASH\n **                      640Kbytes RAM\n **\n **                Set heap size, stack size and stack location according\n **                to application requirements.\n **\n **                Set memory bank area and size if external memory is used\n **\n **  Target      : STMicroelectronics STM32\n **\n **  Distribution: The file is distributed as is, without any warranty\n **                of any kind.\n **\n ******************************************************************************\n ** @attention\n **\n ** Copyright (c) 2023 STMicroelectronics.\n ** All rights reserved.\n **\n ** This software is licensed under terms that can be found in the LICENSE file\n ** in the root directory of this software component.\n ** If no LICENSE file comes with this software, it is provided AS-IS.\n **\n ******************************************************************************\n */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 640K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 2048K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/stm32h503xx_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__ = 0x08000000;\ndefine symbol __ICFEDIT_region_ROM_end__   = 0x0801FFFF;\ndefine symbol __ICFEDIT_region_RAM_start__ = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__   = 0x20007FFF;\n\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__ = 0x1000;\ndefine symbol __ICFEDIT_size_heap__   = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;\ndefine region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/stm32h523xx_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__     = 0x08000000;\ndefine symbol __ICFEDIT_region_ROM_end__       = 0x0807FFFF;\ndefine symbol __ICFEDIT_region_RAM_start__     = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__       = 0x20043FFF;\n\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__ = 0x1000;\ndefine symbol __ICFEDIT_size_heap__   = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;\ndefine region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/stm32h562xx_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__     = 0x08000000;\ndefine symbol __ICFEDIT_region_ROM_end__       = 0x081FFFFF;\ndefine symbol __ICFEDIT_region_RAM_start__     = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__       = 0x2009FFFF;\n\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__ = 0x1000;\ndefine symbol __ICFEDIT_size_heap__   = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;\ndefine region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/stm32h563xx_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__     = 0x08000000;\ndefine symbol __ICFEDIT_region_ROM_end__       = 0x081FFFFF;\ndefine symbol __ICFEDIT_region_RAM_start__     = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__       = 0x2009FFFF;\n\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__ = 0x1000;\ndefine symbol __ICFEDIT_size_heap__   = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;\ndefine region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/stm32h5/linker/stm32h573xx_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__     = 0x08000000;\ndefine symbol __ICFEDIT_region_ROM_end__       = 0x081FFFFF;\ndefine symbol __ICFEDIT_region_RAM_start__     = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__       = 0x2009FFFF;\n\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__ = 0x1000;\ndefine symbol __ICFEDIT_size_heap__   = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;\ndefine region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/stm32h5/stm32h5xx_hal_conf.h",
    "content": "/* USER CODE BEGIN Header */\n/**\n  ******************************************************************************\n  * @file    stm32h5xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2018-2021 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n/* USER CODE END Header */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32h5xx_HAL_CONF_H\n#define STM32h5xx_HAL_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED   */\n/* #define HAL_CEC_MODULE_ENABLED   */\n/* #define HAL_COMP_MODULE_ENABLED   */\n/* #define HAL_CRC_MODULE_ENABLED   */\n/* #define HAL_CRYP_MODULE_ENABLED   */\n/* #define HAL_DAC_MODULE_ENABLED   */\n/* #define HAL_EXTI_MODULE_ENABLED   */\n/* #define HAL_FDCAN_MODULE_ENABLED   */\n/* #define HAL_HCD_MODULE_ENABLED   */\n/* #define HAL_I2S_MODULE_ENABLED   */\n/* #define HAL_IWDG_MODULE_ENABLED   */\n/* #define HAL_IRDA_MODULE_ENABLED   */\n/* #define HAL_LPTIM_MODULE_ENABLED   */\n/* #define HAL_PCD_MODULE_ENABLED   */\n/* #define HAL_RNG_MODULE_ENABLED   */\n/* #define HAL_RTC_MODULE_ENABLED   */\n/* #define HAL_SMARTCARD_MODULE_ENABLED   */\n/* #define HAL_SMBUS_MODULE_ENABLED   */\n/* #define HAL_SPI_MODULE_ENABLED   */\n/* #define HAL_TIM_MODULE_ENABLED   */\n/* #define HAL_USART_MODULE_ENABLED   */\n/* #define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n#define HAL_UART_MODULE_ENABLED\n#define HAL_I2C_MODULE_ENABLED\n\n/* ########################## Register Callbacks selection ############################## */\n/**\n  * @brief This is the list of modules where register callback can be used\n  */\n#define USE_HAL_ADC_REGISTER_CALLBACKS    0u\n#define USE_HAL_CEC_REGISTER_CALLBACKS    0u\n#define USE_HAL_COMP_REGISTER_CALLBACKS   0u\n#define USE_HAL_CRYP_REGISTER_CALLBACKS   0u\n#define USE_HAL_DAC_REGISTER_CALLBACKS    0u\n#define USE_HAL_FDCAN_REGISTER_CALLBACKS  0u\n#define USE_HAL_HCD_REGISTER_CALLBACKS    0u\n#define USE_HAL_I2C_REGISTER_CALLBACKS    0u\n#define USE_HAL_I2S_REGISTER_CALLBACKS    0u\n#define USE_HAL_IRDA_REGISTER_CALLBACKS   0u\n#define USE_HAL_LPTIM_REGISTER_CALLBACKS  0u\n#define USE_HAL_PCD_REGISTER_CALLBACKS    0u\n#define USE_HAL_RNG_REGISTER_CALLBACKS    0u\n#define USE_HAL_RTC_REGISTER_CALLBACKS    0u\n#define USE_HAL_SMBUS_REGISTER_CALLBACKS  0u\n#define USE_HAL_SPI_REGISTER_CALLBACKS    0u\n#define USE_HAL_TIM_REGISTER_CALLBACKS    0u\n#define USE_HAL_UART_REGISTER_CALLBACKS   0u\n#define USE_HAL_USART_REGISTER_CALLBACKS  0u\n#define USE_HAL_WWDG_REGISTER_CALLBACKS   0u\n\n\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n#define HSE_VALUE    25000000U /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n#define HSE_STARTUP_TIMEOUT    100U   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal Core Speed oscillator (CSI) default value.\n  *        This value is the default CSI range value after Reset.\n  */\n#if !defined  (CSI_VALUE)\n#define CSI_VALUE              4000000UL /*!< Value of the Internal oscillator in Hz*/\n#endif /* CSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n#define HSI_VALUE              64000000UL /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG.\n  *        This internal oscillator is mainly dedicated to provide a high precision clock to\n  *        the USB peripheral by means of a special Clock Recovery System (CRS) circuitry.\n  *        When the CRS is not used, the HSI48 RC oscillator runs on it default frequency\n  *        which is subject to manufacturing process variations.\n  */\n#if !defined  (HSI48_VALUE)\n#define HSI48_VALUE             48000000UL /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz.\n                                                  The real value my vary depending on manufacturing process variations.*/\n#endif /* HSI48_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n#define LSI_VALUE  32000UL    /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                     /*!< Value of the Internal Low Speed oscillator in Hz\nThe real value may vary depending on the variations\nin voltage and temperature.*/\n\n#if !defined  (LSI_STARTUP_TIME)\n#define LSI_STARTUP_TIME          130UL      /*!< Time out for LSI start up, in ms */\n#endif /* LSI_STARTUP_TIME */\n\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n#define LSE_VALUE  32768UL    /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n#define LSE_STARTUP_TIMEOUT    5000UL     /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for SPI/SAI peripheral\n  *        This value is used by the SPI/SAI HAL module to compute the SPI/SAI clock source\n  *        frequency, this source is inserted directly through I2S_CKIN pad.\n\n  */\n#if !defined  (EXTERNAL_CLOCK_VALUE)\n#define EXTERNAL_CLOCK_VALUE    12288000UL /*!< Value of the External clock in Hz*/\n#endif /* EXTERNAL_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ############################################ System Configuration ################################################ */\n\n/**\n  * @brief This is the HAL system configuration section\n  */\n\n#define  VDD_VALUE                  3300UL /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY          (15UL)  /*!< tick interrupt priority (lowest by default) */\n#define  USE_RTOS                   0U\n#define  PREFETCH_ENABLE            0U               /*!< Enable prefetch */\n\n\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n* Activated: CRC code is present inside driver\n* Deactivated: CRC code cleaned from driver\n*/\n\n#define USE_SPI_CRC                     0U\n\n/* ################## CRYP peripheral configuration ########################## */\n\n#define USE_HAL_CRYP_SUSPEND_RESUME     1U\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include modules header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n#include \"stm32h5xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n#include \"stm32h5xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n#include \"stm32h5xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n#include \"stm32h5xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n#include \"stm32h5xx_hal_adc.h\"\n#include \"stm32h5xx_hal_adc_ex.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CEC_MODULE_ENABLED\n#include \"stm32h5xx_hal_cec.h\"\n#endif /* HAL_CEC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n#include \"stm32h5xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n#include \"stm32h5xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n#include \"stm32h5xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n#include \"stm32h5xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n#include \"stm32h5xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n#include \"stm32h5xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_FDCAN_MODULE_ENABLED\n#include \"stm32h5xx_hal_fdcan.h\"\n#endif /* HAL_FDCAN_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n#include \"stm32h5xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n#include \"stm32h5xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n#include \"stm32h5xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n#include \"stm32h5xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n#include \"stm32h5xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32h5xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n#include \"stm32h5xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n#include \"stm32h5xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n#include \"stm32h5xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n#include \"stm32h5xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n#include \"stm32h5xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n#include \"stm32h5xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n#include \"stm32h5xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n#include \"stm32h5xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n#include \"stm32h5xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n#include \"stm32h5xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n#include \"stm32h5xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for functions parameters check.\n  * @param  expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\nvoid assert_failed(uint8_t *file, uint32_t line);\n#else\n#define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32h5xx_HAL_CONF_H */\n"
  },
  {
    "path": "hw/bsp/stm32h7/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32h7xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*8*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/daisyseed/board.cmake",
    "content": "set(MCU_VARIANT stm32h750xx)\nset(JLINK_DEVICE stm32h750ibk6_m7)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/stm32h750ibkx_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H750xx\n    HSE_VALUE=16000000\n    CORE_CM7\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/daisyseed/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Daisy Seed\n   url: https://electro-smith.com/products/daisy-seed\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_7, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_11, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };\n\n  /*!< Supply configuration update enable */\n  /* For STM32H750XB, use \"HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\" */\n//  HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);\n  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\n\n  /* The voltage scaling allows optimizing the power consumption when the\n     device is clocked below the maximum system frequency, to update the\n     voltage scaling value regarding system frequency refer to product\n     datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.HSIState = RCC_HSI_OFF;\n  RCC_OscInitStruct.CSIState = RCC_CSI_OFF;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n\n  /* PLL1 for System Clock */\n  RCC_OscInitStruct.PLL.PLLM = 5;\n  RCC_OscInitStruct.PLL.PLLN = 160;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 4;\n\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOMEDIUM;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* PLL3 for USB Clock */\n  PeriphClkInitStruct.PLL3.PLL3M = 25;\n  PeriphClkInitStruct.PLL3.PLL3N = 336;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0;\n  PeriphClkInitStruct.PLL3.PLL3P = 2;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n  PeriphClkInitStruct.PLL3.PLL3Q = 7;\n\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure  bus clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \\\n  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);\n\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  /*activate CSI clock mondatory for I/O Compensation Cell*/\n  __HAL_RCC_CSI_ENABLE() ;\n\n  /* Enable SYSCFG clock mondatory for I/O Compensation Cell */\n  __HAL_RCC_SYSCFG_CLK_ENABLE() ;\n\n  /* Enables the I/O Compensation Cell */\n  HAL_EnableCompensationCell();\n}\n\nstatic inline void board_init2(void) {\n  // For this board does nothing\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/daisyseed/board.mk",
    "content": "MCU_VARIANT = stm32h750xx\nCFLAGS += -DSTM32H750xx -DCORE_CM7 -DHSE_VALUE=16000000\n\nLD_FILE_GCC = $(BOARD_PATH)/stm32h750ibkx_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h750ibk6_m7\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/daisyseed/stm32h750ibkx_flash.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32H7 series\n**                128Kbytes FLASH and 1056Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2022 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Specify the memory areas */\nMEMORY\n{\n  FLASH (rx)     : ORIGIN = 0x08000000, LENGTH = 128K\n  DTCMRAM (xrw)  : ORIGIN = 0x20000000, LENGTH = 128K\n  RAM_D1 (xrw)   : ORIGIN = 0x24000000, LENGTH = 512K\n  RAM_D2 (xrw)   : ORIGIN = 0x30000000, LENGTH = 288K\n  RAM_D3 (xrw)   : ORIGIN = 0x38000000, LENGTH = 64K\n  ITCMRAM (xrw)  : ORIGIN = 0x00000000, LENGTH = 64K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM_D1) + LENGTH(RAM_D1);    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x2000 ;      /* required amount of heap  */\n_Min_Stack_Size = 0x4000 ; /* required amount of stack */\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM_D1 AT> FLASH\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM_D1\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM_D1\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/daisyseed/stm32h750ibkx_ram.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld (debug in RAM dedicated)\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32H7 series\n**                128Kbytes RAM_EXEC and 544Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2022 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Specify the memory areas */\nMEMORY\n{\n  RAM_EXEC (xrw)  : ORIGIN = 0x24000000, LENGTH = 128K\n  DTCMRAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 128K\n  RAM_D2 (xrw)    : ORIGIN = 0x30000000, LENGTH = 288K\n  RAM_D3 (xrw)    : ORIGIN = 0x38000000, LENGTH = 64K\n  ITCMRAM (xrw)   : ORIGIN = 0x00000000, LENGTH = 64K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM);    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x2000 ;      /* required amount of heap  */\n_Min_Stack_Size = 0x4000 ; /* required amount of stack */\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into RAM_EXEC */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >RAM_EXEC\n\n  /* The program code and other data goes into RAM_EXEC */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >RAM_EXEC\n\n  /* Constant data goes into RAM_EXEC */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >RAM_EXEC\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >RAM_EXEC\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >RAM_EXEC\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >RAM_EXEC\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >RAM_EXEC\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >RAM_EXEC\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >DTCMRAM AT> RAM_EXEC\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >DTCMRAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >DTCMRAM\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h723nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32h723xx)\nset(JLINK_DEVICE stm32h723zg)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/${MCU_VARIANT}_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H723xx\n    HSE_VALUE=8000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h723nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H723 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-h723zg.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n// STM32F723 has only one USB HS peripheral\n// Nucleo board does not have ULPI so USB will operate in FS mode only\n// For the rest of the synopsys driver it is FS device however there\n// is only USB_OTG_HS defined. Here are required conversions to\n// make peripheral FS.\n#define __HAL_RCC_USB2_OTG_FS_CLK_ENABLE __HAL_RCC_USB1_OTG_HS_CLK_ENABLE\n#define GPIO_AF10_OTG2_HS               GPIO_AF10_OTG1_HS\n#define USB_OTG_FS                      USB_OTG_HS\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_OUTPUT_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n\n  /* The PWR block is always enabled on the H7 series- there is no clock\n     enable. For now, use the default VOS3 scale mode (lowest) and limit clock\n     frequencies to avoid potential current draw problems from bus\n     power when using the max clock speeds throughout the chip. */\n\n  /* Enable HSE Oscillator and activate PLL1 with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.HSIState = RCC_HSI_OFF;\n  RCC_OscInitStruct.CSIState = RCC_CSI_OFF;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = HSE_VALUE/1000000;\n  RCC_OscInitStruct.PLL.PLLN = 336;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 7;\n  RCC_OscInitStruct.PLL.PLLR = 2; /* Unused */\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_0;\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOMEDIUM;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | \\\n    RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | \\\n    RCC_CLOCKTYPE_D3PCLK1);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;\n\n  /* Unlike on the STM32F4 family, it appears the maximum APB frequencies are\n     device-dependent- 120 MHz for this board according to Figure 2 of\n     the datasheet. Dividing by half will be safe for now. */\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;\n\n  /* 4 wait states required for 168MHz and VOS3. */\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  /* Like on F4, on H7, USB's actual peripheral clock and bus clock are\n     separate. However, the main system PLL (PLL1) doesn't have a direct\n     connection to the USB peripheral clock to generate 48 MHz, so we do this\n     dance. This will connect PLL1's Q output to the USB peripheral clock. */\n  RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct = { 0 };\n\n  RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  RCC_PeriphCLKInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL;\n  HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);\n}\n\nstatic inline void board_init2(void) {\n  // For this board does nothing\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h723nucleo/board.mk",
    "content": "MCU_VARIANT = stm32h723xx\nCFLAGS += -DSTM32H723xx -DHSE_VALUE=8000000\n\nLD_FILE_GCC = $(FAMILY_PATH)/linker/${MCU_VARIANT}_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h723zg\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743eval/board.cmake",
    "content": "set(MCU_VARIANT stm32h743xx)\nset(JLINK_DEVICE stm32h743xi)\n#set(JLINK_OPTION \"-USB jtrace\")\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/${MCU_VARIANT}_flash.ld)\n\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\n# device default to PORT 1 High Speed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\n  target_sources(${TARGET} PRIVATE\n    ${ST_MFXSTM32L152}/mfxstm32l152.c\n    ${ST_MFXSTM32L152}/mfxstm32l152_reg.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${ST_MFXSTM32L152}\n    )\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H743xx\n    HSE_VALUE=25000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743eval/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H743 Eval\n   url: https://www.st.com/en/evaluation-tools/stm32h743i-eval.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"mfxstm32l152.h\"\n\n// Need to change jumper setting J7 and J8 from RS-232 to STLink\n#define UART_DEV              USART1\n#define UART_CLK_EN           __HAL_RCC_USART1_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     1\n\n// USB HS External PHY Pin: CLK, STP, DIR, NXT, D0-D7\n#define ULPI_PINS \\\n  {GPIOA, GPIO_PIN_3 }, {GPIOA, GPIO_PIN_5 }, {GPIOB, GPIO_PIN_0 }, {GPIOB, GPIO_PIN_1 }, \\\n  {GPIOB, GPIO_PIN_5 }, {GPIOB, GPIO_PIN_10}, {GPIOB, GPIO_PIN_11}, {GPIOB, GPIO_PIN_12}, \\\n  {GPIOB, GPIO_PIN_13}, {GPIOC, GPIO_PIN_0 }, {GPIOH, GPIO_PIN_4 }, {GPIOI, GPIO_PIN_11}\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_4, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // UART TX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_14, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF4_USART1 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_15, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF4_USART1 },\n    .active_state = 0\n  },\n  { // I2C SCL for MFX VBUS\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_6, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF4_I2C1 },\n    .active_state = 0\n  },\n  { // I2C SDA for MFX VBUS\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_7, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF4_I2C1 },\n    .active_state = 1\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };\n\n  /*!< Supply configuration update enable */\n  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\n\n  /* The voltage scaling allows optimizing the power consumption when the device is\n     clocked below the maximum system frequency, to update the voltage scaling value\n     regarding system frequency refer to product datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  while ( (PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY ) {}\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.HSIState = RCC_HSI_OFF;\n  RCC_OscInitStruct.CSIState = RCC_CSI_OFF;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n\n  // PLL1 for System Clock (400Mhz)\n  // From H743 eval manual ETM can only work at 50 MHz clock by default because ETM signals\n  // are shared with other peripherals. Trace CLK = PLL1R.\n  RCC_OscInitStruct.PLL.PLLM = 5;\n  RCC_OscInitStruct.PLL.PLLN      = 160; // May reduce to 100/200 Mhz when tracing to avoid overflowing trace buffer\n  RCC_OscInitStruct.PLL.PLLP      = 2;\n  RCC_OscInitStruct.PLL.PLLQ      = 4;\n  RCC_OscInitStruct.PLL.PLLR      = RCC_OscInitStruct.PLL.PLLN/10;  // Trace clock is limit to 50 Mhz to meet board requirement\n  RCC_OscInitStruct.PLL.PLLRGE    = RCC_PLL1VCIRANGE_2;\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOMEDIUM;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n\n  /* Select PLL as system clock source and configure bus clocks dividers */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 |\n                                RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_D3PCLK1;\n\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);\n\n  /* PLL3 for USB Clock */\n  PeriphClkInitStruct.PLL3.PLL3M = 25;\n  PeriphClkInitStruct.PLL3.PLL3N = 336;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0;\n  PeriphClkInitStruct.PLL3.PLL3P = 2;\n  PeriphClkInitStruct.PLL3.PLL3Q = 7;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /*activate CSI clock mondatory for I/O Compensation Cell*/\n  __HAL_RCC_CSI_ENABLE();\n\n  /* Enable SYSCFG clock mondatory for I/O Compensation Cell */\n  __HAL_RCC_SYSCFG_CLK_ENABLE();\n\n  /* Enables the I/O Compensation Cell */\n  HAL_EnableCompensationCell();\n}\n\n//--------------------------------------------------------------------+\n// MFX\n//--------------------------------------------------------------------+\nstatic I2C_HandleTypeDef i2c_handle = {\n  .Instance = I2C1,\n  .Init = {\n    .Timing = 0x10C0ECFF,\n    .OwnAddress1 = 0,\n    .AddressingMode = I2C_ADDRESSINGMODE_7BIT,\n    .DualAddressMode = I2C_DUALADDRESS_DISABLE,\n    .OwnAddress2 = 0,\n    .OwnAddress2Masks = I2C_OA2_NOMASK,\n    .GeneralCallMode = I2C_GENERALCALL_DISABLE,\n    .NoStretchMode = I2C_NOSTRETCH_DISABLE,\n  }\n};\nstatic MFXSTM32L152_Object_t  mfx_obj = { 0 };\nstatic MFXSTM32L152_IO_Mode_t* mfx_io = NULL;\nstatic uint32_t mfx_vbus_pin[2] = { MFXSTM32L152_GPIO_PIN_7, MFXSTM32L152_GPIO_PIN_9 };\n\nstatic int32_t board_i2c_init(void) {\n  __HAL_RCC_I2C1_CLK_ENABLE();\n  __HAL_RCC_I2C1_FORCE_RESET();\n  __HAL_RCC_I2C1_RELEASE_RESET();\n  if (HAL_I2C_Init(&i2c_handle) != HAL_OK) {\n    return HAL_ERROR;\n  }\n  if (HAL_I2CEx_ConfigAnalogFilter(&i2c_handle, I2C_ANALOGFILTER_ENABLE) != HAL_OK) {\n    return HAL_ERROR;\n  }\n  if (HAL_I2CEx_ConfigDigitalFilter(&i2c_handle, 0) != HAL_OK) {\n    return HAL_ERROR;\n  }\n  return 0;\n}\n\nstatic int32_t board_i2c_deinit(void) {\n  return 0;\n}\n\nstatic int32_t i2c_readreg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  for (int retry = 0; retry < 3; retry++) {\n    if (HAL_OK == HAL_I2C_Mem_Read(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000)) {\n      return 0;\n    }\n    HAL_Delay(10);\n  }\n  return -1;\n}\n\nstatic int32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  for (int retry = 0; retry < 3; retry++) {\n    if (HAL_OK == HAL_I2C_Mem_Write(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000)) {\n      return 0;\n    }\n    HAL_Delay(10);\n  }\n  return -1;\n}\n\nstatic int32_t i2c_get_tick(void) {\n  return (int32_t) HAL_GetTick();\n}\n\nstatic inline void board_init2(void) {\n  // IO control via MFX\n  MFXSTM32L152_IO_t io_ctx;\n  io_ctx.Init        = board_i2c_init;\n  io_ctx.DeInit      = board_i2c_deinit;\n  io_ctx.ReadReg     = i2c_readreg;\n  io_ctx.WriteReg    = i2c_writereg;\n  io_ctx.GetTick     = i2c_get_tick;\n\n  uint16_t i2c_addr[] = { 0x84, 0x86 };\n  for(uint8_t i = 0U; i < 2U; i++) {\n    uint32_t mfx_id;\n    io_ctx.Address = i2c_addr[i];\n    TU_ASSERT(MFXSTM32L152_RegisterBusIO(&mfx_obj, &io_ctx) == MFXSTM32L152_OK, );\n    TU_ASSERT(MFXSTM32L152_ReadID(&mfx_obj, &mfx_id) == MFXSTM32L152_OK, );\n    if ((mfx_id == MFXSTM32L152_ID) || (mfx_id == MFXSTM32L152_ID_2)) {\n      TU_ASSERT(MFXSTM32L152_Init(&mfx_obj) == MFXSTM32L152_OK, );\n      break;\n    }\n  }\n\n  mfx_io = &MFXSTM32L152_IO_Driver;\n  mfx_io->IO_Start(&mfx_obj, MFXSTM32L152_GPIO_PINS_ALL);\n\n  for(uint32_t i=0; i<2; i++) {\n    MFXSTM32L152_IO_Init_t io_init = {\n      .Pin = mfx_vbus_pin[i],\n      .Mode = MFXSTM32L152_GPIO_MODE_OUTPUT_PP,\n      .Pull = MFXSTM32L152_GPIO_PULLUP,\n    };\n    mfx_io->Init(&mfx_obj, &io_init);\n  }\n}\n\n// VBUS1 is actually controlled by USB3320C PHY (using dwc2 drivebus signal)\nstatic void TU_ATTR_UNUSED board_vbus_set(uint8_t rhport, bool state) {\n  if (mfx_io) {\n    mfx_io->IO_WritePin(&mfx_obj, mfx_vbus_pin[rhport], state);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743eval/board.mk",
    "content": "MCU_VARIANT = stm32h743xx\nCFLAGS += -DSTM32H743xx -DHSE_VALUE=25000000\n\nRHPORT_SPEED = OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nLD_FILE_GCC = $(FAMILY_PATH)/linker/${MCU_VARIANT}_flash.ld\n\nSRC_C += \\\n  ${ST_MFXSTM32L152}/mfxstm32l152.c \\\n  ${ST_MFXSTM32L152}/mfxstm32l152_reg.c \\\n\nINC += $(TOP)/${ST_MFXSTM32L152}\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h743xi\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743eval/cubemx/stm32h743eval.ioc",
    "content": "#MicroXplorer Configuration settings - do not modify\nCAD.formats=[]\nCAD.pinconfig=Project naming\nCAD.provider=\nFile.Version=6\nGPIO.groupedBy=Group By Peripherals\nI2C1.IPParameters=Timing\nI2C1.Timing=0x10C0ECFF\nKeepUserPlacement=false\nMcu.CPN=STM32H743XIH6\nMcu.Family=STM32H7\nMcu.IP0=CORTEX_M7\nMcu.IP1=DEBUG\nMcu.IP2=I2C1\nMcu.IP3=NVIC\nMcu.IP4=RCC\nMcu.IP5=SYS\nMcu.IP6=USB_OTG_FS\nMcu.IP7=USB_OTG_HS\nMcu.IPNb=8\nMcu.Name=STM32H743XIHx\nMcu.Package=TFBGA240\nMcu.Pin0=PI6\nMcu.Pin1=PI5\nMcu.Pin10=PA15 (JTDI)\nMcu.Pin100=PC1\nMcu.Pin101=PC2\nMcu.Pin102=PC3\nMcu.Pin103=PJ9\nMcu.Pin104=PH2\nMcu.Pin105=PA2\nMcu.Pin106=PA1\nMcu.Pin107=PJ0\nMcu.Pin108=PE10\nMcu.Pin109=PJ8\nMcu.Pin11=PI1\nMcu.Pin110=PJ7\nMcu.Pin111=PJ6\nMcu.Pin112=PH3\nMcu.Pin113=PH4\nMcu.Pin114=PH5\nMcu.Pin115=PI15\nMcu.Pin116=PJ1\nMcu.Pin117=PF13\nMcu.Pin118=PF14\nMcu.Pin119=PE9\nMcu.Pin12=PI0\nMcu.Pin120=PE11\nMcu.Pin121=PB10\nMcu.Pin122=PB11\nMcu.Pin123=PH10\nMcu.Pin124=PH11\nMcu.Pin125=PD15\nMcu.Pin126=PD14\nMcu.Pin127=PA6\nMcu.Pin128=PA7\nMcu.Pin129=PB2\nMcu.Pin13=PI7\nMcu.Pin130=PF12\nMcu.Pin131=PF15\nMcu.Pin132=PE12\nMcu.Pin133=PE15\nMcu.Pin134=PJ5\nMcu.Pin135=PH9\nMcu.Pin136=PH12\nMcu.Pin137=PD11\nMcu.Pin138=PD12\nMcu.Pin139=PD13\nMcu.Pin14=PE1\nMcu.Pin140=PA0_C\nMcu.Pin141=PA5\nMcu.Pin142=PC4\nMcu.Pin143=PB1\nMcu.Pin144=PJ2\nMcu.Pin145=PF11\nMcu.Pin146=PG0\nMcu.Pin147=PE8\nMcu.Pin148=PE13\nMcu.Pin149=PH6\nMcu.Pin15=PB6\nMcu.Pin150=PH8\nMcu.Pin151=PB12\nMcu.Pin152=PB15\nMcu.Pin153=PD10\nMcu.Pin154=PD9\nMcu.Pin155=PA3\nMcu.Pin156=PA4\nMcu.Pin157=PC5\nMcu.Pin158=PB0\nMcu.Pin159=PJ3\nMcu.Pin16=PB4 (NJTRST)\nMcu.Pin160=PJ4\nMcu.Pin161=PG1\nMcu.Pin162=PE7\nMcu.Pin163=PE14\nMcu.Pin164=PH7\nMcu.Pin165=PB13\nMcu.Pin166=PB14\nMcu.Pin167=PD8\nMcu.Pin168=VP_SYS_VS_Systick\nMcu.Pin17=PK4\nMcu.Pin18=PG11\nMcu.Pin19=PJ15\nMcu.Pin2=PI4\nMcu.Pin20=PD6\nMcu.Pin21=PD3\nMcu.Pin22=PC11\nMcu.Pin23=PA14 (JTCK/SWCLK)\nMcu.Pin24=PI2\nMcu.Pin25=PH15\nMcu.Pin26=PH14\nMcu.Pin27=PC15-OSC32_OUT (OSC32_OUT)\nMcu.Pin28=PC14-OSC32_IN (OSC32_IN)\nMcu.Pin29=PE2\nMcu.Pin3=PB5\nMcu.Pin30=PE0\nMcu.Pin31=PB7\nMcu.Pin32=PB3 (JTDO/TRACESWO)\nMcu.Pin33=PK6\nMcu.Pin34=PK3\nMcu.Pin35=PG12\nMcu.Pin36=PD7\nMcu.Pin37=PC12\nMcu.Pin38=PI3\nMcu.Pin39=PA13 (JTMS/SWDIO)\nMcu.Pin4=PK5\nMcu.Pin40=PE5\nMcu.Pin41=PE4\nMcu.Pin42=PE3\nMcu.Pin43=PB9\nMcu.Pin44=PB8\nMcu.Pin45=PG15\nMcu.Pin46=PK7\nMcu.Pin47=PG14\nMcu.Pin48=PG13\nMcu.Pin49=PJ14\nMcu.Pin5=PG10\nMcu.Pin50=PJ12\nMcu.Pin51=PD2\nMcu.Pin52=PD0\nMcu.Pin53=PA10\nMcu.Pin54=PA9\nMcu.Pin55=PH13\nMcu.Pin56=PI9\nMcu.Pin57=PC13\nMcu.Pin58=PI8\nMcu.Pin59=PE6\nMcu.Pin6=PG9\nMcu.Pin60=PJ13\nMcu.Pin61=PD1\nMcu.Pin62=PC8\nMcu.Pin63=PC9\nMcu.Pin64=PA8\nMcu.Pin65=PA12\nMcu.Pin66=PA11\nMcu.Pin67=PI10\nMcu.Pin68=PI11\nMcu.Pin69=PC7\nMcu.Pin7=PD5\nMcu.Pin70=PC6\nMcu.Pin71=PG8\nMcu.Pin72=PG7\nMcu.Pin73=PF2\nMcu.Pin74=PF1\nMcu.Pin75=PF0\nMcu.Pin76=PG5\nMcu.Pin77=PG6\nMcu.Pin78=PI12\nMcu.Pin79=PI13\nMcu.Pin8=PD4\nMcu.Pin80=PI14\nMcu.Pin81=PF3\nMcu.Pin82=PG4\nMcu.Pin83=PG3\nMcu.Pin84=PG2\nMcu.Pin85=PK2\nMcu.Pin86=PH1-OSC_OUT (PH1)\nMcu.Pin87=PH0-OSC_IN (PH0)\nMcu.Pin88=PF5\nMcu.Pin89=PF4\nMcu.Pin9=PC10\nMcu.Pin90=PK0\nMcu.Pin91=PK1\nMcu.Pin92=PF6\nMcu.Pin93=PF7\nMcu.Pin94=PF8\nMcu.Pin95=PJ11\nMcu.Pin96=PC0\nMcu.Pin97=PF10\nMcu.Pin98=PF9\nMcu.Pin99=PJ10\nMcu.PinsNb=169\nMcu.ThirdPartyNb=0\nMcu.UserConstants=\nMcu.UserName=STM32H743XIHx\nMxCube.Version=6.12.1\nMxDb.Version=DB.6.0.121\nNVIC.BusFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nNVIC.DebugMonitor_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nNVIC.ForceEnableDMAVector=true\nNVIC.HardFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nNVIC.MemoryManagement_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nNVIC.NonMaskableInt_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:true\\:false\nNVIC.PendSV_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nNVIC.PriorityGroup=NVIC_PRIORITYGROUP_4\nNVIC.SVCall_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nNVIC.SysTick_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:true\\:false\nNVIC.UsageFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:false\\:false\nPA0_C.GPIOParameters=GPIO_Label\nPA0_C.GPIO_Label=Potentiometer\nPA0_C.Locked=true\nPA0_C.Signal=ADCx_INN1\nPA1.GPIOParameters=GPIO_Label\nPA1.GPIO_Label=RMII_REF_CLK [LAN8742A_REFCLK0]\nPA1.Locked=true\nPA1.Signal=ETH_REF_CLK\nPA10.GPIOParameters=GPIO_Label\nPA10.GPIO_Label=USB_FS1_ID\nPA10.Locked=true\nPA10.Signal=USB_OTG_FS_ID\nPA11.GPIOParameters=GPIO_Label\nPA11.GPIO_Label=USB_FS1_DM\nPA11.Locked=true\nPA11.Mode=Device_Only\nPA11.Signal=USB_OTG_FS_DM\nPA12.GPIOParameters=GPIO_Label\nPA12.GPIO_Label=USB_FS1_DP\nPA12.Locked=true\nPA12.Mode=Device_Only\nPA12.Signal=USB_OTG_FS_DP\nPA13\\ (JTMS/SWDIO).Locked=true\nPA13\\ (JTMS/SWDIO).Mode=Trace_Synchro_4bits_SW\nPA13\\ (JTMS/SWDIO).Signal=DEBUG_JTMS-SWDIO\nPA14\\ (JTCK/SWCLK).Locked=true\nPA14\\ (JTCK/SWCLK).Mode=Trace_Synchro_4bits_SW\nPA14\\ (JTCK/SWCLK).Signal=DEBUG_JTCK-SWCLK\nPA15\\ (JTDI).GPIOParameters=GPIO_Label\nPA15\\ (JTDI).GPIO_Label=TDI\nPA15\\ (JTDI).Locked=true\nPA15\\ (JTDI).Signal=DEBUG_JTDI\nPA2.GPIOParameters=GPIO_Label\nPA2.GPIO_Label=ETH_MDIO [LAN8742A_MDIO]\nPA2.Locked=true\nPA2.Signal=ETH_MDIO\nPA3.GPIOParameters=GPIO_Label\nPA3.GPIO_Label=ULPI_D0 [USB3320C_D0]\nPA3.Locked=true\nPA3.Mode=Device_HS\nPA3.Signal=USB_OTG_HS_ULPI_D0\nPA4.GPIOParameters=GPIO_Label\nPA4.GPIO_Label=LED3_RGB [LD3_Red]\nPA4.Locked=true\nPA4.Signal=GPIO_Output\nPA5.GPIOParameters=GPIO_Label\nPA5.GPIO_Label=ULPI_CK  [USB3320C_CLKOUT]\nPA5.Locked=true\nPA5.Mode=Device_HS\nPA5.Signal=USB_OTG_HS_ULPI_CK\nPA6.GPIOParameters=GPIO_Label\nPA6.GPIO_Label=LCD_BL_CTRL\nPA6.Locked=true\nPA6.Signal=GPIO_Output\nPA7.GPIOParameters=GPIO_Label\nPA7.GPIO_Label=RMII_CRS_DV [LAN8742A_CRS_DV]\nPA7.Locked=true\nPA7.Signal=ETH_CRS_DV\nPA8.GPIOParameters=GPIO_Label\nPA8.GPIO_Label=MCO\nPA8.Locked=true\nPA8.Signal=RCC_MCO_1\nPA9.GPIOParameters=GPIO_Label\nPA9.GPIO_Label=VBUS_FS1\nPA9.Locked=true\nPA9.Signal=USB_OTG_FS_VBUS\nPB0.GPIOParameters=GPIO_Label\nPB0.GPIO_Label=ULPI_D1 [USB3320C_D1]\nPB0.Locked=true\nPB0.Mode=Device_HS\nPB0.Signal=USB_OTG_HS_ULPI_D1\nPB1.GPIOParameters=GPIO_Label\nPB1.GPIO_Label=ULPI_D2 [USB3320C_D2]\nPB1.Locked=true\nPB1.Mode=Device_HS\nPB1.Signal=USB_OTG_HS_ULPI_D2\nPB10.GPIOParameters=GPIO_Label\nPB10.GPIO_Label=ULPI_D3 [USB3320C_D3]\nPB10.Locked=true\nPB10.Mode=Device_HS\nPB10.Signal=USB_OTG_HS_ULPI_D3\nPB11.GPIOParameters=GPIO_Label\nPB11.GPIO_Label=ULPI_D4 [USB3320C_D4]\nPB11.Locked=true\nPB11.Mode=Device_HS\nPB11.Signal=USB_OTG_HS_ULPI_D4\nPB12.GPIOParameters=GPIO_Label\nPB12.GPIO_Label=ULPI_D5 [USB3320C_D5]\nPB12.Locked=true\nPB12.Mode=Device_HS\nPB12.Signal=USB_OTG_HS_ULPI_D5\nPB13.GPIOParameters=GPIO_Label\nPB13.GPIO_Label=ULPI_D6 [USB3320C_D6]\nPB13.Locked=true\nPB13.Mode=Device_HS\nPB13.Signal=USB_OTG_HS_ULPI_D6\nPB14.GPIOParameters=GPIO_Label\nPB14.GPIO_Label=RS232_TX [ST3241EBPR_T2IN]\nPB14.Locked=true\nPB14.Signal=USART1_TX\nPB15.GPIOParameters=GPIO_Label\nPB15.GPIO_Label=RS_232RX [ST3241EBPR_R3OUT]\nPB15.Locked=true\nPB15.Signal=USART1_RX\nPB2.GPIOParameters=GPIO_Label\nPB2.GPIO_Label=QSPI_CLK [MT25TL01GHBA8ESF_CLK_1]\nPB2.Locked=true\nPB2.Signal=QUADSPI_CLK\nPB3\\ (JTDO/TRACESWO).Locked=true\nPB3\\ (JTDO/TRACESWO).Signal=DEBUG_JTDO-SWO\nPB4\\ (NJTRST).GPIOParameters=GPIO_Label\nPB4\\ (NJTRST).GPIO_Label=TRST\nPB4\\ (NJTRST).Locked=true\nPB4\\ (NJTRST).Signal=DEBUG_JTRST\nPB5.GPIOParameters=GPIO_Label\nPB5.GPIO_Label=ULPI_D7 [USB3320C_D7]\nPB5.Locked=true\nPB5.Mode=Device_HS\nPB5.Signal=USB_OTG_HS_ULPI_D7\nPB6.GPIOParameters=GPIO_Label\nPB6.GPIO_Label=I2C1_SCL [STM32L152CCT6_I2C_SCL]\nPB6.Locked=true\nPB6.Mode=I2C\nPB6.Signal=I2C1_SCL\nPB7.GPIOParameters=GPIO_Label\nPB7.GPIO_Label=I2C1_SDA [STM32L152CCT6_I2C_SDA]\nPB7.Locked=true\nPB7.Mode=I2C\nPB7.Signal=I2C1_SDA\nPB8.GPIOParameters=GPIO_Label\nPB8.GPIO_Label=SDIO1_CKIN\nPB8.Locked=true\nPB8.Signal=SDMMC1_CKIN\nPB9.GPIOParameters=GPIO_Label\nPB9.GPIO_Label=SDIO1_CDIR\nPB9.Locked=true\nPB9.Signal=SDMMC1_CDIR\nPC0.GPIOParameters=GPIO_Label\nPC0.GPIO_Label=ULPI_STP [USB3320C_STP]\nPC0.Locked=true\nPC0.Mode=Device_HS\nPC0.Signal=USB_OTG_HS_ULPI_STP\nPC1.GPIOParameters=GPIO_Label\nPC1.GPIO_Label=RMII_MDC [LAN8742A_MDC]\nPC1.Locked=true\nPC1.Signal=ETH_MDC\nPC10.GPIOParameters=GPIO_Label\nPC10.GPIO_Label=SDIO1_D2\nPC10.Locked=true\nPC10.Signal=SDMMC1_D2\nPC11.GPIOParameters=GPIO_Label\nPC11.GPIO_Label=SDIO1_D3\nPC11.Locked=true\nPC11.Signal=SDMMC1_D3\nPC12.GPIOParameters=GPIO_Label\nPC12.GPIO_Label=SDIO1_CLK\nPC12.Locked=true\nPC12.Signal=SDMMC1_CK\nPC13.GPIOParameters=GPIO_Label\nPC13.GPIO_Label=TAMPER_KEY [B1]\nPC13.Locked=true\nPC13.Signal=RTC_TAMP1\nPC14-OSC32_IN\\ (OSC32_IN).Locked=true\nPC14-OSC32_IN\\ (OSC32_IN).Signal=RCC_OSC32_IN\nPC15-OSC32_OUT\\ (OSC32_OUT).Locked=true\nPC15-OSC32_OUT\\ (OSC32_OUT).Signal=RCC_OSC32_OUT\nPC2.GPIOParameters=GPIO_Label\nPC2.GPIO_Label=DFSDM_CLK\nPC2.Locked=true\nPC2.Signal=S_CKOUTDFSDM1\nPC3.GPIOParameters=GPIO_Label\nPC3.GPIO_Label=DFSM_DAT1\nPC3.Locked=true\nPC3.Signal=S_DATAIN1DFSDM1\nPC4.GPIOParameters=GPIO_Label\nPC4.GPIO_Label=RMII_RXD0 [LAN8742A_RXD0]\nPC4.Locked=true\nPC4.Signal=ETH_RXD0\nPC5.GPIOParameters=GPIO_Label\nPC5.GPIO_Label=RMII_RXD1 [LAN8742A_RXD1]\nPC5.Locked=true\nPC5.Signal=ETH_RXD1\nPC6.GPIOParameters=GPIO_Label\nPC6.GPIO_Label=SDIO1_D0DIR\nPC6.Locked=true\nPC6.Signal=SDMMC1_D0DIR\nPC7.Locked=true\nPC7.Signal=DEBUG_TRGIO\nPC8.GPIOParameters=GPIO_Label\nPC8.GPIO_Label=SDIO1_D0\nPC8.Locked=true\nPC8.Signal=SDMMC1_D0\nPC9.GPIOParameters=GPIO_Label\nPC9.GPIO_Label=SDIO1_D1\nPC9.Locked=true\nPC9.Signal=SDMMC1_D1\nPD0.GPIOParameters=GPIO_Label\nPD0.GPIO_Label=D2 [IS42S32800G_DQ2]\nPD0.Locked=true\nPD0.Signal=FMC_D2_DA2\nPD1.GPIOParameters=GPIO_Label\nPD1.GPIO_Label=D3 [IS42S32800G_DQ3]\nPD1.Locked=true\nPD1.Signal=FMC_D3_DA3\nPD10.GPIOParameters=GPIO_Label\nPD10.GPIO_Label=D15 [IS42S32800G_DQ15]\nPD10.Locked=true\nPD10.Signal=FMC_D15_DA15\nPD11.GPIOParameters=GPIO_Label\nPD11.GPIO_Label=A16 [PC28F128M29EWLA_A16]\nPD11.Locked=true\nPD11.Signal=FMC_A16_CLE\nPD12.GPIOParameters=GPIO_Label\nPD12.GPIO_Label=A17 [PC28F128M29EWLA_A17]\nPD12.Locked=true\nPD12.Signal=FMC_A17_ALE\nPD13.GPIOParameters=GPIO_Label\nPD13.GPIO_Label=A18 [PC28F128M29EWLA_A18]\nPD13.Locked=true\nPD13.Signal=FMC_A18\nPD14.GPIOParameters=GPIO_Label\nPD14.GPIO_Label=D0 [IS42S32800G_DQ0]\nPD14.Locked=true\nPD14.Signal=FMC_D0_DA0\nPD15.GPIOParameters=GPIO_Label\nPD15.GPIO_Label=D1 [IS42S32800G_DQ1]\nPD15.Locked=true\nPD15.Signal=FMC_D1_DA1\nPD2.GPIOParameters=GPIO_Label\nPD2.GPIO_Label=SDIO1_CMD\nPD2.Locked=true\nPD2.Signal=SDMMC1_CMD\nPD3.GPIOParameters=GPIO_Label\nPD3.GPIO_Label=FDCAN1_STBY [MCP2562FD_STBY]\nPD3.Locked=true\nPD3.Signal=GPIO_Output\nPD4.GPIOParameters=GPIO_Label\nPD4.GPIO_Label=FMC_NOE [IS61WV102416BLL_OE]\nPD4.Locked=true\nPD4.Signal=FMC_NOE\nPD5.GPIOParameters=GPIO_Label\nPD5.GPIO_Label=FMC_NWE [IS61WV102416BLL_WE]\nPD5.Locked=true\nPD5.Signal=FMC_NWE\nPD6.GPIOParameters=GPIO_Label\nPD6.GPIO_Label=FMC_NWAIT [PC28F128M29EWLA_RB]\nPD6.Locked=true\nPD6.Signal=FMC_NWAIT\nPD7.GPIOParameters=GPIO_Label\nPD7.GPIO_Label=FMC_NE1 [PC28F128M29EWLA_E]\nPD7.Locked=true\nPD7.Signal=FMC_NE1\nPD8.GPIOParameters=GPIO_Label\nPD8.GPIO_Label=D13 [IS42S32800G_DQ13]\nPD8.Locked=true\nPD8.Signal=FMC_D13_DA13\nPD9.GPIOParameters=GPIO_Label\nPD9.GPIO_Label=D14 [IS42S32800G_DQ14]\nPD9.Locked=true\nPD9.Signal=FMC_D14_DA14\nPE0.GPIOParameters=GPIO_Label\nPE0.GPIO_Label=FMC_NBL0 [IS42S32800G_DQM0]\nPE0.Locked=true\nPE0.Signal=FMC_NBL0\nPE1.GPIOParameters=GPIO_Label\nPE1.GPIO_Label=FMC_NBL1 [IS42S32800G_DQM1]\nPE1.Locked=true\nPE1.Signal=FMC_NBL1\nPE10.GPIOParameters=GPIO_Label\nPE10.GPIO_Label=D7 [IS42S32800G_DQ7]\nPE10.Locked=true\nPE10.Signal=FMC_D7_DA7\nPE11.GPIOParameters=GPIO_Label\nPE11.GPIO_Label=D8 [IS42S32800G_DQ8]\nPE11.Locked=true\nPE11.Signal=FMC_D8_DA8\nPE12.GPIOParameters=GPIO_Label\nPE12.GPIO_Label=D9 [IS42S32800G_DQ9]\nPE12.Locked=true\nPE12.Signal=FMC_D9_DA9\nPE13.GPIOParameters=GPIO_Label\nPE13.GPIO_Label=D10 [IS42S32800G_DQ10]\nPE13.Locked=true\nPE13.Signal=FMC_D10_DA10\nPE14.GPIOParameters=GPIO_Label\nPE14.GPIO_Label=D11 [IS42S32800G_DQ11]\nPE14.Locked=true\nPE14.Signal=FMC_D11_DA11\nPE15.GPIOParameters=GPIO_Label\nPE15.GPIO_Label=D12 [IS42S32800G_DQ12]\nPE15.Locked=true\nPE15.Signal=FMC_D12_DA12\nPE2.Locked=true\nPE2.Mode=Trace_Synchro_4bits_SW\nPE2.Signal=DEBUG_TRACECLK\nPE3.Locked=true\nPE3.Mode=Trace_Synchro_4bits_SW\nPE3.Signal=DEBUG_TRACED0\nPE4.Locked=true\nPE4.Mode=Trace_Synchro_4bits_SW\nPE4.Signal=DEBUG_TRACED1\nPE5.Locked=true\nPE5.Mode=Trace_Synchro_4bits_SW\nPE5.Signal=DEBUG_TRACED2\nPE6.Locked=true\nPE6.Mode=Trace_Synchro_4bits_SW\nPE6.Signal=DEBUG_TRACED3\nPE7.GPIOParameters=GPIO_Label\nPE7.GPIO_Label=D4 [IS42S32800G_DQ4]\nPE7.Locked=true\nPE7.Signal=FMC_D4_DA4\nPE8.GPIOParameters=GPIO_Label\nPE8.GPIO_Label=D5 [IS42S32800G_DQ5]\nPE8.Locked=true\nPE8.Signal=FMC_D5_DA5\nPE9.GPIOParameters=GPIO_Label\nPE9.GPIO_Label=D6 [IS42S32800G_DQ6]\nPE9.Locked=true\nPE9.Signal=FMC_D6_DA6\nPF0.GPIOParameters=GPIO_Label\nPF0.GPIO_Label=A0 [PC28F128M29EWLA_A0]\nPF0.Locked=true\nPF0.Signal=FMC_A0\nPF1.GPIOParameters=GPIO_Label\nPF1.GPIO_Label=A1 [PC28F128M29EWLA_A1]\nPF1.Locked=true\nPF1.Signal=FMC_A1\nPF10.GPIOParameters=GPIO_Label\nPF10.GPIO_Label=LED1_RGB [LD1_Green]\nPF10.Locked=true\nPF10.Signal=GPIO_Output\nPF11.GPIOParameters=GPIO_Label\nPF11.GPIO_Label=SNDRAS [IS42S32800G_RAS]\nPF11.Locked=true\nPF11.Signal=FMC_SDNRAS\nPF12.GPIOParameters=GPIO_Label\nPF12.GPIO_Label=A6 [PC28F128M29EWLA_A6]\nPF12.Locked=true\nPF12.Signal=FMC_A6\nPF13.GPIOParameters=GPIO_Label\nPF13.GPIO_Label=A7 [PC28F128M29EWLA_A7]\nPF13.Locked=true\nPF13.Signal=FMC_A7\nPF14.GPIOParameters=GPIO_Label\nPF14.GPIO_Label=A8 [PC28F128M29EWLA_A8]\nPF14.Locked=true\nPF14.Signal=FMC_A8\nPF15.GPIOParameters=GPIO_Label\nPF15.GPIO_Label=A9 [PC28F128M29EWLA_A9]\nPF15.Locked=true\nPF15.Signal=FMC_A9\nPF2.GPIOParameters=GPIO_Label\nPF2.GPIO_Label=A2 [PC28F128M29EWLA_A2]\nPF2.Locked=true\nPF2.Signal=FMC_A2\nPF3.GPIOParameters=GPIO_Label\nPF3.GPIO_Label=A3 [PC28F128M29EWLA_A3]\nPF3.Locked=true\nPF3.Signal=FMC_A3\nPF4.GPIOParameters=GPIO_Label\nPF4.GPIO_Label=A4 [PC28F128M29EWLA_A4]\nPF4.Locked=true\nPF4.Signal=FMC_A4\nPF5.GPIOParameters=GPIO_Label\nPF5.GPIO_Label=A5 [PC28F128M29EWLA_A5]\nPF5.Locked=true\nPF5.Signal=FMC_A5\nPF6.GPIOParameters=GPIO_Label\nPF6.GPIO_Label=QSPI_BK1_IO3 [MT25TL01GHBA8ESF_DQ3]\nPF6.Locked=true\nPF6.Signal=QUADSPI_BK1_IO3\nPF7.GPIOParameters=GPIO_Label\nPF7.GPIO_Label=QSPI_BK1_IO2 [MT25TL01GHBA8ESF_DQ2]\nPF7.Locked=true\nPF7.Signal=QUADSPI_BK1_IO2\nPF8.GPIOParameters=GPIO_Label\nPF8.GPIO_Label=QSPI_BK1_IO0 [MT25TL01GHBA8ESF_DQ0]\nPF8.Locked=true\nPF8.Signal=QUADSPI_BK1_IO0\nPF9.GPIOParameters=GPIO_Label\nPF9.GPIO_Label=QSPI_BK1_IO1 [MT25TL01GHBA8ESF_DQ1]\nPF9.Locked=true\nPF9.Signal=QUADSPI_BK1_IO1\nPG0.GPIOParameters=GPIO_Label\nPG0.GPIO_Label=A10 [PC28F128M29EWLA_A10]\nPG0.Locked=true\nPG0.Signal=FMC_A10\nPG1.GPIOParameters=GPIO_Label\nPG1.GPIO_Label=A11 [PC28F128M29EWLA_A11]\nPG1.Locked=true\nPG1.Signal=FMC_A11\nPG10.GPIOParameters=GPIO_Label\nPG10.GPIO_Label=FMC_NE3 [IS61WV102416BLL_CE]\nPG10.Locked=true\nPG10.Signal=FMC_NE3\nPG11.GPIOParameters=GPIO_Label\nPG11.GPIO_Label=RMII_TX_EN [LAN8742A_TXEN]\nPG11.Locked=true\nPG11.Signal=ETH_TX_EN\nPG12.GPIOParameters=GPIO_Label\nPG12.GPIO_Label=RMII_TXD1 [LAN8742A_TXD1]\nPG12.Locked=true\nPG12.Signal=ETH_TXD1\nPG13.GPIOParameters=GPIO_Label\nPG13.GPIO_Label=RMII_TXD0 [LAN8742A_TXD0]\nPG13.Locked=true\nPG13.Signal=ETH_TXD0\nPG14.GPIOParameters=GPIO_Label\nPG14.GPIO_Label=QSPI_BK2_IO3 [MT25TL01GHBA8ESF_DQ7]\nPG14.Locked=true\nPG14.Signal=QUADSPI_BK2_IO3\nPG15.GPIOParameters=GPIO_Label\nPG15.GPIO_Label=SDNCAS [IS42S32800G_CAS]\nPG15.Locked=true\nPG15.Signal=FMC_SDNCAS\nPG2.GPIOParameters=GPIO_Label\nPG2.GPIO_Label=A12 [PC28F128M29EWLA_A12]\nPG2.Locked=true\nPG2.Signal=FMC_A12\nPG3.GPIOParameters=GPIO_Label\nPG3.GPIO_Label=A13 [PC28F128M29EWLA_A13]\nPG3.Locked=true\nPG3.Signal=FMC_A13\nPG4.Locked=true\nPG4.Signal=FMC_A14_BA0\nPG5.Locked=true\nPG5.Signal=FMC_A15_BA1\nPG6.GPIOParameters=GPIO_Label\nPG6.GPIO_Label=QSPI_BK1_NCS [MT25TL01GHBA8ESF_CS]\nPG6.Locked=true\nPG6.Signal=QUADSPI_BK1_NCS\nPG7.GPIOParameters=GPIO_Label\nPG7.GPIO_Label=SAI1_MCLKA [WM8994ECS_MCLK1]\nPG7.Locked=true\nPG7.Signal=SAI1_MCLK_A\nPG8.GPIOParameters=GPIO_Label\nPG8.GPIO_Label=SDCLK [IS42S32800G_CLK]\nPG8.Locked=true\nPG8.Signal=FMC_SDCLK\nPG9.GPIOParameters=GPIO_Label\nPG9.GPIO_Label=QSPI_BK2_IO2 [MT25TL01GHBA8ESF_DQ6]\nPG9.Locked=true\nPG9.Signal=QUADSPI_BK2_IO2\nPH0-OSC_IN\\ (PH0).Locked=true\nPH0-OSC_IN\\ (PH0).Mode=HSE-External-Oscillator\nPH0-OSC_IN\\ (PH0).Signal=RCC_OSC_IN\nPH1-OSC_OUT\\ (PH1).Locked=true\nPH1-OSC_OUT\\ (PH1).Mode=HSE-External-Oscillator\nPH1-OSC_OUT\\ (PH1).Signal=RCC_OSC_OUT\nPH10.GPIOParameters=GPIO_Label\nPH10.GPIO_Label=D18 [IS42S32800G_DQ18]\nPH10.Locked=true\nPH10.Signal=FMC_D18\nPH11.GPIOParameters=GPIO_Label\nPH11.GPIO_Label=D19 [IS42S32800G_DQ19]\nPH11.Locked=true\nPH11.Signal=FMC_D19\nPH12.GPIOParameters=GPIO_Label\nPH12.GPIO_Label=D20 [IS42S32800G_DQ20]\nPH12.Locked=true\nPH12.Signal=FMC_D20\nPH13.GPIOParameters=GPIO_Label\nPH13.GPIO_Label=D21 [IS42S32800G_DQ21]\nPH13.Locked=true\nPH13.Signal=FMC_D21\nPH14.GPIOParameters=GPIO_Label\nPH14.GPIO_Label=D22 [IS42S32800G_DQ22]\nPH14.Locked=true\nPH14.Signal=FMC_D22\nPH15.GPIOParameters=GPIO_Label\nPH15.GPIO_Label=D23 [IS42S32800G_DQ23]\nPH15.Locked=true\nPH15.Signal=FMC_D23\nPH2.GPIOParameters=GPIO_Label\nPH2.GPIO_Label=QSPI_BK2_IO0 [MT25TL01GHBA8ESF_DQ4]\nPH2.Locked=true\nPH2.Signal=QUADSPI_BK2_IO0\nPH3.GPIOParameters=GPIO_Label\nPH3.GPIO_Label=QSPI_BK2_IO1 [MT25TL01GHBA8ESF_DQ5]\nPH3.Locked=true\nPH3.Signal=QUADSPI_BK2_IO1\nPH4.GPIOParameters=GPIO_Label\nPH4.GPIO_Label=ULPI_NXT [USB3320C_NXT]\nPH4.Locked=true\nPH4.Mode=Device_HS\nPH4.Signal=USB_OTG_HS_ULPI_NXT\nPH5.GPIOParameters=GPIO_Label\nPH5.GPIO_Label=SDNWE [IS42S32800G_WE]\nPH5.Locked=true\nPH5.Signal=FMC_SDNWE\nPH6.GPIOParameters=GPIO_Label\nPH6.GPIO_Label=SDNE1 [IS42S32800G_CS]\nPH6.Locked=true\nPH6.Signal=FMC_SDNE1\nPH7.GPIOParameters=GPIO_Label\nPH7.GPIO_Label=SDCKE1 [IS42S32800G_CKE]\nPH7.Locked=true\nPH7.Signal=FMC_SDCKE1\nPH8.GPIOParameters=GPIO_Label\nPH8.GPIO_Label=D16 [IS42S32800G_DQ16]\nPH8.Locked=true\nPH8.Signal=FMC_D16\nPH9.GPIOParameters=GPIO_Label\nPH9.GPIO_Label=D17 [IS42S32800G_DQ17]\nPH9.Locked=true\nPH9.Signal=FMC_D17\nPI0.GPIOParameters=GPIO_Label\nPI0.GPIO_Label=D24 [IS42S32800G_DQ24]\nPI0.Locked=true\nPI0.Signal=FMC_D24\nPI1.GPIOParameters=GPIO_Label\nPI1.GPIO_Label=D25 [IS42S32800G_DQ25]\nPI1.Locked=true\nPI1.Signal=FMC_D25\nPI10.GPIOParameters=GPIO_Label\nPI10.GPIO_Label=D31 [IS42S32800G_DQ31]\nPI10.Locked=true\nPI10.Signal=FMC_D31\nPI11.GPIOParameters=GPIO_Label\nPI11.GPIO_Label=ULPI_DIR [USB3320C_DIR]\nPI11.Locked=true\nPI11.Mode=Device_HS\nPI11.Signal=USB_OTG_HS_ULPI_DIR\nPI12.GPIOParameters=GPIO_Label\nPI12.GPIO_Label=LCD_HSYNC\nPI12.Locked=true\nPI12.Signal=LTDC_HSYNC\nPI13.GPIOParameters=GPIO_Label\nPI13.GPIO_Label=LCD_VSYNC\nPI13.Locked=true\nPI13.Signal=LTDC_VSYNC\nPI14.GPIOParameters=GPIO_Label\nPI14.GPIO_Label=LCD_CLK\nPI14.Locked=true\nPI14.Signal=LTDC_CLK\nPI15.GPIOParameters=GPIO_Label\nPI15.GPIO_Label=LCD_R0\nPI15.Locked=true\nPI15.Signal=LTDC_R0\nPI2.GPIOParameters=GPIO_Label\nPI2.GPIO_Label=D26 [IS42S32800G_DQ26]\nPI2.Locked=true\nPI2.Signal=FMC_D26\nPI3.GPIOParameters=GPIO_Label\nPI3.GPIO_Label=D27 [IS42S32800G_DQ27\nPI3.Locked=true\nPI3.Signal=FMC_D27\nPI4.GPIOParameters=GPIO_Label\nPI4.GPIO_Label=FMC_NBL2 [IS42S32800G_DQM2]\nPI4.Locked=true\nPI4.Signal=FMC_NBL2\nPI5.GPIOParameters=GPIO_Label\nPI5.GPIO_Label=FMC_NBL3 [IS42S32800G_DQM3]\nPI5.Locked=true\nPI5.Signal=FMC_NBL3\nPI6.GPIOParameters=GPIO_Label\nPI6.GPIO_Label=D28 [IS42S32800G_DQ28]\nPI6.Locked=true\nPI6.Signal=FMC_D28\nPI7.GPIOParameters=GPIO_Label\nPI7.GPIO_Label=D29 [IS42S32800G_DQ29]\nPI7.Locked=true\nPI7.Signal=FMC_D29\nPI8.GPIOParameters=GPIO_Label\nPI8.GPIO_Label=MFX_IRQOUT [MFX_V3_IRQOUT]\nPI8.Locked=true\nPI8.Signal=GPXTI8\nPI9.GPIOParameters=GPIO_Label\nPI9.GPIO_Label=D30 [IS42S32800G_DQ30]\nPI9.Locked=true\nPI9.Signal=FMC_D30\nPJ0.GPIOParameters=GPIO_Label\nPJ0.GPIO_Label=LCD_R1\nPJ0.Locked=true\nPJ0.Signal=LTDC_R1\nPJ1.GPIOParameters=GPIO_Label\nPJ1.GPIO_Label=LCD_R2\nPJ1.Locked=true\nPJ1.Signal=LTDC_R2\nPJ10.GPIOParameters=GPIO_Label\nPJ10.GPIO_Label=LCd_G3\nPJ10.Locked=true\nPJ10.Signal=LTDC_G3\nPJ11.GPIOParameters=GPIO_Label\nPJ11.GPIO_Label=LCD_G4\nPJ11.Locked=true\nPJ11.Signal=LTDC_G4\nPJ12.Locked=true\nPJ12.Signal=DEBUG_TRGOUT\nPJ13.GPIOParameters=GPIO_Label\nPJ13.GPIO_Label=LCD_B1\nPJ13.Locked=true\nPJ13.Signal=LTDC_B1\nPJ14.GPIOParameters=GPIO_Label\nPJ14.GPIO_Label=LCD_B2\nPJ14.Locked=true\nPJ14.Signal=LTDC_B2\nPJ15.GPIOParameters=GPIO_Label\nPJ15.GPIO_Label=LCD_B3\nPJ15.Locked=true\nPJ15.Signal=LTDC_B3\nPJ2.GPIOParameters=GPIO_Label\nPJ2.GPIO_Label=LCD_R3\nPJ2.Locked=true\nPJ2.Signal=LTDC_R3\nPJ3.GPIOParameters=GPIO_Label\nPJ3.GPIO_Label=LCD_R4\nPJ3.Locked=true\nPJ3.Signal=LTDC_R4\nPJ4.GPIOParameters=GPIO_Label\nPJ4.GPIO_Label=LCD_R5\nPJ4.Locked=true\nPJ4.Signal=LTDC_R5\nPJ5.GPIOParameters=GPIO_Label\nPJ5.GPIO_Label=LCD_R6\nPJ5.Locked=true\nPJ5.Signal=LTDC_R6\nPJ6.GPIOParameters=GPIO_Label\nPJ6.GPIO_Label=LCD_R7\nPJ6.Locked=true\nPJ6.Signal=LTDC_R7\nPJ7.Locked=true\nPJ7.Signal=DEBUG_TRGIN\nPJ8.GPIOParameters=GPIO_Label\nPJ8.GPIO_Label=LCD_G1\nPJ8.Locked=true\nPJ8.Signal=LTDC_G1\nPJ9.GPIOParameters=GPIO_Label\nPJ9.GPIO_Label=LCD_G2\nPJ9.Locked=true\nPJ9.Signal=LTDC_G2\nPK0.GPIOParameters=GPIO_Label\nPK0.GPIO_Label=LCD_G5\nPK0.Locked=true\nPK0.Signal=LTDC_G5\nPK1.GPIOParameters=GPIO_Label\nPK1.GPIO_Label=LCD_G6\nPK1.Locked=true\nPK1.Signal=LTDC_G6\nPK2.GPIOParameters=GPIO_Label\nPK2.GPIO_Label=LCD_G7\nPK2.Locked=true\nPK2.Signal=LTDC_G7\nPK3.GPIOParameters=GPIO_Label\nPK3.GPIO_Label=LCD_B4\nPK3.Locked=true\nPK3.Signal=LTDC_B4\nPK4.GPIOParameters=GPIO_Label\nPK4.GPIO_Label=LCD_B5\nPK4.Locked=true\nPK4.Signal=LTDC_B5\nPK5.GPIOParameters=GPIO_Label\nPK5.GPIO_Label=LCD_B6\nPK5.Locked=true\nPK5.Signal=LTDC_B6\nPK6.GPIOParameters=GPIO_Label\nPK6.GPIO_Label=LCD_B7\nPK6.Locked=true\nPK6.Signal=LTDC_B7\nPK7.GPIOParameters=GPIO_Label\nPK7.GPIO_Label=LCD_DE\nPK7.Locked=true\nPK7.Signal=LTDC_DE\nPinOutPanel.CurrentBGAView=Top\nPinOutPanel.RotationAngle=0\nProjectManager.AskForMigrate=true\nProjectManager.BackupPrevious=false\nProjectManager.CompilerOptimize=6\nProjectManager.ComputerToolchain=false\nProjectManager.CoupleFile=false\nProjectManager.CustomerFirmwarePackage=\nProjectManager.DefaultFWLocation=true\nProjectManager.DeletePrevious=true\nProjectManager.DeviceId=STM32H743XIHx\nProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.11.2\nProjectManager.FreePins=false\nProjectManager.HalAssertFull=false\nProjectManager.HeapSize=0x200\nProjectManager.KeepUserCode=true\nProjectManager.LastFirmware=true\nProjectManager.LibraryCopy=2\nProjectManager.MainLocation=Src\nProjectManager.NoMain=false\nProjectManager.PreviousToolchain=\nProjectManager.ProjectBuild=false\nProjectManager.ProjectFileName=stm32h743eval.ioc\nProjectManager.ProjectName=stm32h743eval\nProjectManager.ProjectStructure=\nProjectManager.RegisterCallBack=\nProjectManager.StackSize=0x400\nProjectManager.TargetToolchain=Makefile\nProjectManager.ToolChainLocation=Src/\nProjectManager.UAScriptAfterPath=\nProjectManager.UAScriptBeforePath=\nProjectManager.UnderRoot=false\nProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USB_OTG_HS_PCD_Init-USB_OTG_HS-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true\nRCC.ADCFreq_Value=50390625\nRCC.AHB12Freq_Value=200000000\nRCC.AHB4Freq_Value=200000000\nRCC.APB1Freq_Value=100000000\nRCC.APB2Freq_Value=100000000\nRCC.APB3Freq_Value=100000000\nRCC.APB4Freq_Value=100000000\nRCC.AXIClockFreq_Value=200000000\nRCC.CECFreq_Value=32000\nRCC.CKPERFreq_Value=64000000\nRCC.CortexFreq_Value=400000000\nRCC.CpuClockFreq_Value=400000000\nRCC.D1CPREFreq_Value=400000000\nRCC.D1PPRE=RCC_APB3_DIV2\nRCC.D2PPRE1=RCC_APB1_DIV2\nRCC.D2PPRE2=RCC_APB2_DIV2\nRCC.D3PPRE=RCC_APB4_DIV2\nRCC.DFSDMACLkFreq_Value=200000000\nRCC.DFSDMFreq_Value=100000000\nRCC.DIVM1=5\nRCC.DIVM3=25\nRCC.DIVN1=160\nRCC.DIVN3=336\nRCC.DIVP1Freq_Value=400000000\nRCC.DIVP2Freq_Value=50390625\nRCC.DIVP3Freq_Value=168000000\nRCC.DIVQ1=4\nRCC.DIVQ1Freq_Value=200000000\nRCC.DIVQ2Freq_Value=50390625\nRCC.DIVQ3=7\nRCC.DIVQ3Freq_Value=48000000\nRCC.DIVR1=8\nRCC.DIVR1Freq_Value=100000000\nRCC.DIVR2Freq_Value=50390625\nRCC.DIVR3Freq_Value=168000000\nRCC.EnbaleCSS=true\nRCC.FDCANFreq_Value=200000000\nRCC.FMCFreq_Value=200000000\nRCC.FamilyName=M\nRCC.HCLK3ClockFreq_Value=200000000\nRCC.HCLKFreq_Value=200000000\nRCC.HPRE=RCC_HCLK_DIV2\nRCC.HPREFreq_Value=64000000\nRCC.HRTIMFreq_Value=200000000\nRCC.HSICalibrationValue=32\nRCC.I2C123Freq_Value=100000000\nRCC.I2C4Freq_Value=100000000\nRCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM3,DIVN1,DIVN3,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3,DIVQ3Freq_Value,DIVR1,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3Freq_Value,EnbaleCSS,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HPREFreq_Value,HRTIMFreq_Value,HSICalibrationValue,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,PLLSourceVirtual,PWR_Regulator_Voltage_Scale,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBCLockSelection,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value\nRCC.LPTIM1Freq_Value=100000000\nRCC.LPTIM2Freq_Value=100000000\nRCC.LPTIM345Freq_Value=100000000\nRCC.LPUART1Freq_Value=100000000\nRCC.LTDCFreq_Value=168000000\nRCC.MCO1PinFreq_Value=64000000\nRCC.MCO2PinFreq_Value=400000000\nRCC.PLL2FRACN=0\nRCC.PLL3FRACN=0\nRCC.PLLFRACN=0\nRCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE\nRCC.PWR_Regulator_Voltage_Scale=PWR_REGULATOR_VOLTAGE_SCALE1\nRCC.QSPIFreq_Value=200000000\nRCC.RNGFreq_Value=48000000\nRCC.RTCFreq_Value=32000\nRCC.SAI1Freq_Value=200000000\nRCC.SAI23Freq_Value=200000000\nRCC.SAI4AFreq_Value=200000000\nRCC.SAI4BFreq_Value=200000000\nRCC.SDMMCFreq_Value=200000000\nRCC.SPDIFRXFreq_Value=200000000\nRCC.SPI123Freq_Value=200000000\nRCC.SPI45Freq_Value=100000000\nRCC.SPI6Freq_Value=100000000\nRCC.SWPMI1Freq_Value=100000000\nRCC.SYSCLKFreq_VALUE=400000000\nRCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK\nRCC.Tim1OutputFreq_Value=200000000\nRCC.Tim2OutputFreq_Value=200000000\nRCC.TraceFreq_Value=100000000\nRCC.USART16Freq_Value=100000000\nRCC.USART234578Freq_Value=100000000\nRCC.USBCLockSelection=RCC_USBCLKSOURCE_PLL3\nRCC.USBFreq_Value=48000000\nRCC.VCO1OutputFreq_Value=800000000\nRCC.VCO2OutputFreq_Value=100781250\nRCC.VCO3OutputFreq_Value=336000000\nRCC.VCOInput1Freq_Value=5000000\nRCC.VCOInput2Freq_Value=781250\nRCC.VCOInput3Freq_Value=1000000\nSH.ADCx_INN1.0=ADC1_INN1\nSH.ADCx_INN1.ConfNb=1\nSH.FMC_A0.0=FMC_A0\nSH.FMC_A0.ConfNb=1\nSH.FMC_A1.0=FMC_A1\nSH.FMC_A1.ConfNb=1\nSH.FMC_A10.0=FMC_A10\nSH.FMC_A10.ConfNb=1\nSH.FMC_A11.0=FMC_A11\nSH.FMC_A11.ConfNb=1\nSH.FMC_A12.0=FMC_A12\nSH.FMC_A12.ConfNb=1\nSH.FMC_A13.0=FMC_A13\nSH.FMC_A13.ConfNb=1\nSH.FMC_A14_BA0.0=FMC_BA0\nSH.FMC_A14_BA0.1=FMC_A14\nSH.FMC_A14_BA0.ConfNb=2\nSH.FMC_A15_BA1.0=FMC_BA1\nSH.FMC_A15_BA1.1=FMC_A15\nSH.FMC_A15_BA1.ConfNb=2\nSH.FMC_A16_CLE.0=FMC_A16\nSH.FMC_A16_CLE.ConfNb=1\nSH.FMC_A17_ALE.0=FMC_A17\nSH.FMC_A17_ALE.ConfNb=1\nSH.FMC_A18.0=FMC_A18\nSH.FMC_A18.ConfNb=1\nSH.FMC_A2.0=FMC_A2\nSH.FMC_A2.ConfNb=1\nSH.FMC_A3.0=FMC_A3\nSH.FMC_A3.ConfNb=1\nSH.FMC_A4.0=FMC_A4\nSH.FMC_A4.ConfNb=1\nSH.FMC_A5.0=FMC_A5\nSH.FMC_A5.ConfNb=1\nSH.FMC_A6.0=FMC_A6\nSH.FMC_A6.ConfNb=1\nSH.FMC_A7.0=FMC_A7\nSH.FMC_A7.ConfNb=1\nSH.FMC_A8.0=FMC_A8\nSH.FMC_A8.ConfNb=1\nSH.FMC_A9.0=FMC_A9\nSH.FMC_A9.ConfNb=1\nSH.FMC_D0_DA0.0=FMC_D0\nSH.FMC_D0_DA0.ConfNb=1\nSH.FMC_D10_DA10.0=FMC_D10\nSH.FMC_D10_DA10.ConfNb=1\nSH.FMC_D11_DA11.0=FMC_D11\nSH.FMC_D11_DA11.ConfNb=1\nSH.FMC_D12_DA12.0=FMC_D12\nSH.FMC_D12_DA12.ConfNb=1\nSH.FMC_D13_DA13.0=FMC_D13\nSH.FMC_D13_DA13.ConfNb=1\nSH.FMC_D14_DA14.0=FMC_D14\nSH.FMC_D14_DA14.ConfNb=1\nSH.FMC_D15_DA15.0=FMC_D15\nSH.FMC_D15_DA15.ConfNb=1\nSH.FMC_D16.0=FMC_D16\nSH.FMC_D16.ConfNb=1\nSH.FMC_D17.0=FMC_D17\nSH.FMC_D17.ConfNb=1\nSH.FMC_D18.0=FMC_D18\nSH.FMC_D18.ConfNb=1\nSH.FMC_D19.0=FMC_D19\nSH.FMC_D19.ConfNb=1\nSH.FMC_D1_DA1.0=FMC_D1\nSH.FMC_D1_DA1.ConfNb=1\nSH.FMC_D20.0=FMC_D20\nSH.FMC_D20.ConfNb=1\nSH.FMC_D21.0=FMC_D21\nSH.FMC_D21.ConfNb=1\nSH.FMC_D22.0=FMC_D22\nSH.FMC_D22.ConfNb=1\nSH.FMC_D23.0=FMC_D23\nSH.FMC_D23.ConfNb=1\nSH.FMC_D24.0=FMC_D24\nSH.FMC_D24.ConfNb=1\nSH.FMC_D25.0=FMC_D25\nSH.FMC_D25.ConfNb=1\nSH.FMC_D26.0=FMC_D26\nSH.FMC_D26.ConfNb=1\nSH.FMC_D27.0=FMC_D27\nSH.FMC_D27.ConfNb=1\nSH.FMC_D28.0=FMC_D28\nSH.FMC_D28.ConfNb=1\nSH.FMC_D29.0=FMC_D29\nSH.FMC_D29.ConfNb=1\nSH.FMC_D2_DA2.0=FMC_D2\nSH.FMC_D2_DA2.ConfNb=1\nSH.FMC_D30.0=FMC_D30\nSH.FMC_D30.ConfNb=1\nSH.FMC_D31.0=FMC_D31\nSH.FMC_D31.ConfNb=1\nSH.FMC_D3_DA3.0=FMC_D3\nSH.FMC_D3_DA3.ConfNb=1\nSH.FMC_D4_DA4.0=FMC_D4\nSH.FMC_D4_DA4.ConfNb=1\nSH.FMC_D5_DA5.0=FMC_D5\nSH.FMC_D5_DA5.ConfNb=1\nSH.FMC_D6_DA6.0=FMC_D6\nSH.FMC_D6_DA6.ConfNb=1\nSH.FMC_D7_DA7.0=FMC_D7\nSH.FMC_D7_DA7.ConfNb=1\nSH.FMC_D8_DA8.0=FMC_D8\nSH.FMC_D8_DA8.ConfNb=1\nSH.FMC_D9_DA9.0=FMC_D9\nSH.FMC_D9_DA9.ConfNb=1\nSH.FMC_NBL0.0=FMC_NBL0\nSH.FMC_NBL0.ConfNb=1\nSH.FMC_NBL1.0=FMC_NBL1\nSH.FMC_NBL1.ConfNb=1\nSH.FMC_NBL2.0=FMC_NBL2\nSH.FMC_NBL2.ConfNb=1\nSH.FMC_NBL3.0=FMC_NBL3\nSH.FMC_NBL3.ConfNb=1\nSH.FMC_NOE.0=FMC_NOE\nSH.FMC_NOE.ConfNb=1\nSH.FMC_NWAIT.0=FMC_NWAIT\nSH.FMC_NWAIT.ConfNb=1\nSH.FMC_NWE.0=FMC_NWE\nSH.FMC_NWE.ConfNb=1\nSH.FMC_SDCLK.0=FMC_SDCLK\nSH.FMC_SDCLK.ConfNb=1\nSH.FMC_SDNCAS.0=FMC_SDNCAS\nSH.FMC_SDNCAS.ConfNb=1\nSH.FMC_SDNRAS.0=FMC_SDNRAS\nSH.FMC_SDNRAS.ConfNb=1\nSH.FMC_SDNWE.0=FMC_SDNWE\nSH.FMC_SDNWE.ConfNb=1\nSH.GPXTI8.0=GPIO_EXTI8\nSH.GPXTI8.ConfNb=1\nSH.S_CKOUTDFSDM1.0=DFSDM1_CKOUT\nSH.S_CKOUTDFSDM1.ConfNb=1\nSH.S_DATAIN1DFSDM1.0=DFSDM1_DATIN1\nSH.S_DATAIN1DFSDM1.ConfNb=1\nUSB_OTG_FS.IPParameters=VirtualMode\nUSB_OTG_FS.VirtualMode=Device_Only\nUSB_OTG_HS.IPParameters=VirtualMode-Device_HS\nUSB_OTG_HS.VirtualMode-Device_HS=Device_HS\nVP_SYS_VS_Systick.Mode=SysTick\nVP_SYS_VS_Systick.Signal=SYS_VS_Systick\nboard=STM32H743I-EVAL2\nboardIOC=true\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743eval/ozone/stm32h743.jdebug",
    "content": "\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n   Project.SetTraceSource (\"Trace Pins\");\n  Project.SetTraceTiming (100, 100, 100, 100);\n  Project.SetSWO (0);\n  Edit.SysVar (VAR_TRACE_CORE_CLOCK, 200000000);\n  Project.AddSvdFile (\"$(InstallDir)/Config/CPU/Cortex-M7F.svd\");\n  Project.AddSvdFile (\"$(InstallDir)/Config/Peripherals/ARMv7M.svd\");\n  Project.AddSvdFile (\"./STM32H743.svd\");\n\n  Project.SetDevice (\"STM32H743XI\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"50 MHz\");\n\n  File.Open (\"../../../../../../examples/device/cdc_msc/cmake-build-stm32h743eval/cdc_msc.elf\");\n  // File.Open (\"../../../../../../examples/cmake-build-stm32h743eval_host1/host/cdc_msc_hid/cdc_msc_hid.elf\");\n}\n\n/*********************************************************************\n*0\n*      TargetReset\n*\n* Function description\n*   Replaces the default target device reset routine. Optional.\n*\n* Notes\n*   This example demonstrates the usage when\n*   debugging a RAM program on a Cortex-M target device\n*\n**********************************************************************\n*/\n//void TargetReset (void) {\n//\n//  unsigned int SP;\n//  unsigned int PC;\n//  unsigned int VectorTableAddr;\n//\n//  Exec.Reset();\n//\n//  VectorTableAddr = Elf.GetBaseAddr();\n//\n//  if (VectorTableAddr != 0xFFFFFFFF) {\n//\n//    Util.Log(\"Resetting Program.\");\n//\n//    SP = Target.ReadU32(VectorTableAddr);\n//    Target.SetReg(\"SP\", SP);\n//\n//    PC = Target.ReadU32(VectorTableAddr + 4);\n//    Target.SetReg(\"PC\", PC);\n//  }\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetReset\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetReset (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetReset\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetReset (void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n\n  if (VectorTableAddr == 0xFFFFFFFF) {\n    Util.Log(\"Project file error: failed to get program base\");\n  } else {\n    SP = Target.ReadU32(VectorTableAddr);\n    Target.SetReg(\"SP\", SP);\n\n    PC = Target.ReadU32(VectorTableAddr + 4);\n    Target.SetReg(\"PC\", PC);\n  }\n}\n\n/*********************************************************************\n*\n*       DebugStart\n*\n* Function description\n*   Replaces the default debug session startup routine. Optional.\n*\n**********************************************************************\n*/\n//void DebugStart (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetConnect\n*\n* Function description\n*   Replaces the default target IF connection routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n\nvoid BeforeTargetConnect (void) {\n  //\n  // Trace pin init is done by J-Link script file as J-Link script files are IDE independent\n  //\n  //Project.SetJLinkScript(\"./ST_STM32H743_Traceconfig.pex\");\n}\n\n/*********************************************************************\n*\n*       AfterTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetDownload\n*\n* Function description\n*   Replaces the default program download routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*      AfterTargetDownload\n*\n* Function description\n*   Event handler routine.\n*    - Sets the PC register to program reset value.\n*    - Sets the SP register to program reset value on Cortex-M.\n*\n**********************************************************************\n*/\nvoid AfterTargetDownload (void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n  VectorTableAddr = Elf.GetBaseAddr();\n  Util.Log(\"___\");\n  if (VectorTableAddr == 0xFFFFFFFF) {\n    Util.Log(\"Project file error: failed to get program base\");\n  } else {\n    SP = Target.ReadU32(VectorTableAddr);\n    Target.SetReg(\"SP\", SP);\n\n    PC = Target.ReadU32(VectorTableAddr + 4);\n    Target.SetReg(\"PC\", PC);\n  }\n}\n\n/*********************************************************************\n*\n*       BeforeTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetHalt\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetHalt (void) {\n//}\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32h743xx)\nset(JLINK_DEVICE stm32h743xi)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/${MCU_VARIANT}_flash.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H743xx\n    HSE_VALUE=8000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H743 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-h743zi.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_OUTPUT_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n\n  /** Supply configuration update enable\n  */\n  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\n\n  /** Configure the main internal regulator output voltage\n  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = 1;\n  RCC_OscInitStruct.PLL.PLLN = 100;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 4;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_3;\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                                |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2\n                                |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;\n\n  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {\n    Error_Handler();\n  }\n\n  // Initialize USB clock\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.PLL3.PLL3M = 1;\n  PeriphClkInitStruct.PLL3.PLL3N = 24;\n  PeriphClkInitStruct.PLL3.PLL3P = 2;\n  PeriphClkInitStruct.PLL3.PLL3Q = 4;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n  PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_3;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {\n    Error_Handler();\n  }\n}\n\nstatic inline void board_init2(void) {\n  // For this board does nothing\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743nucleo/board.mk",
    "content": "MCU_VARIANT = stm32h743xx\nCFLAGS += -DSTM32H743xx -DHSE_VALUE=8000000\n\nLD_FILE_GCC = $(FAMILY_PATH)/linker/${MCU_VARIANT}_flash.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h743zi\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h743nucleo/cubemx/stm32h743nucleo.ioc",
    "content": "#MicroXplorer Configuration settings - do not modify\nCAD.formats=\nCAD.pinconfig=\nCAD.provider=\nETH.IPParameters=MediaInterface\nETH.MediaInterface=HAL_ETH_RMII_MODE\nFile.Version=6\nKeepUserPlacement=false\nMcu.CPN=STM32H743ZIT6\nMcu.Family=STM32H7\nMcu.IP0=CORTEX_M7\nMcu.IP1=ETH\nMcu.IP2=NVIC\nMcu.IP3=RCC\nMcu.IP4=SYS\nMcu.IP5=USART3\nMcu.IP6=USB_OTG_FS\nMcu.IPNb=7\nMcu.Name=STM32H743ZITx\nMcu.Package=LQFP144\nMcu.Pin0=PC13\nMcu.Pin1=PC14-OSC32_IN (OSC32_IN)\nMcu.Pin10=PC5\nMcu.Pin11=PB0\nMcu.Pin12=PB13\nMcu.Pin13=PB14\nMcu.Pin14=PD8\nMcu.Pin15=PD9\nMcu.Pin16=PD10\nMcu.Pin17=PG7\nMcu.Pin18=PA8\nMcu.Pin19=PA9\nMcu.Pin2=PC15-OSC32_OUT (OSC32_OUT)\nMcu.Pin20=PA11\nMcu.Pin21=PA12\nMcu.Pin22=PG11\nMcu.Pin23=PG13\nMcu.Pin24=PE1\nMcu.Pin25=VP_SYS_VS_Systick\nMcu.Pin3=PH0-OSC_IN (PH0)\nMcu.Pin4=PH1-OSC_OUT (PH1)\nMcu.Pin5=PC1\nMcu.Pin6=PA1\nMcu.Pin7=PA2\nMcu.Pin8=PA7\nMcu.Pin9=PC4\nMcu.PinsNb=26\nMcu.ThirdPartyNb=0\nMcu.UserConstants=\nMcu.UserName=STM32H743ZITx\nMxCube.Version=6.9.2\nMxDb.Version=DB.6.0.92\nNVIC.BusFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.DebugMonitor_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.ForceEnableDMAVector=true\nNVIC.HardFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.MemoryManagement_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.NonMaskableInt_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.PendSV_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.PriorityGroup=NVIC_PRIORITYGROUP_4\nNVIC.SVCall_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.SysTick_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:true\\:false\nNVIC.UsageFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nPA1.Locked=true\nPA1.Mode=RMII\nPA1.Signal=ETH_REF_CLK\nPA11.Locked=true\nPA11.Mode=Device_Only\nPA11.Signal=USB_OTG_FS_DM\nPA12.Locked=true\nPA12.Mode=Device_Only\nPA12.Signal=USB_OTG_FS_DP\nPA2.Locked=true\nPA2.Mode=RMII\nPA2.Signal=ETH_MDIO\nPA7.Locked=true\nPA7.Mode=RMII\nPA7.Signal=ETH_CRS_DV\nPA8.Locked=true\nPA8.Mode=Activate_SOF_FS\nPA8.Signal=USB_OTG_FS_SOF\nPA9.Locked=true\nPA9.Mode=Activate_VBUS\nPA9.Signal=USB_OTG_FS_VBUS\nPB0.GPIOParameters=GPIO_Label\nPB0.GPIO_Label=LD1 [Green Led]\nPB0.Locked=true\nPB0.Signal=GPIO_Output\nPB13.Locked=true\nPB13.Mode=RMII\nPB13.Signal=ETH_TXD1\nPB14.GPIOParameters=GPIO_Label\nPB14.GPIO_Label=LD3 [Red Led]\nPB14.Locked=true\nPB14.Signal=GPIO_Output\nPC1.Locked=true\nPC1.Mode=RMII\nPC1.Signal=ETH_MDC\nPC13.GPIOParameters=GPIO_Label\nPC13.GPIO_Label=B1 [Blue PushButton]\nPC13.Locked=true\nPC13.Signal=GPIO_Input\nPC14-OSC32_IN\\ (OSC32_IN).Locked=true\nPC14-OSC32_IN\\ (OSC32_IN).Mode=LSE-External-Oscillator\nPC14-OSC32_IN\\ (OSC32_IN).Signal=RCC_OSC32_IN\nPC15-OSC32_OUT\\ (OSC32_OUT).Locked=true\nPC15-OSC32_OUT\\ (OSC32_OUT).Mode=LSE-External-Oscillator\nPC15-OSC32_OUT\\ (OSC32_OUT).Signal=RCC_OSC32_OUT\nPC4.Locked=true\nPC4.Mode=RMII\nPC4.Signal=ETH_RXD0\nPC5.Locked=true\nPC5.Mode=RMII\nPC5.Signal=ETH_RXD1\nPD10.GPIOParameters=GPIO_Label\nPD10.GPIO_Label=USB_OTG_FS_PWR_EN\nPD10.Locked=true\nPD10.Signal=GPIO_Output\nPD8.GPIOParameters=GPIO_Label\nPD8.GPIO_Label=STLINK_RX\nPD8.Locked=true\nPD8.Mode=Asynchronous\nPD8.Signal=USART3_TX\nPD9.GPIOParameters=GPIO_Label\nPD9.GPIO_Label=STLINK_TX\nPD9.Locked=true\nPD9.Mode=Asynchronous\nPD9.Signal=USART3_RX\nPE1.GPIOParameters=GPIO_Label\nPE1.GPIO_Label=LD2 [Yellow Led]\nPE1.Locked=true\nPE1.Signal=GPIO_Output\nPG11.Locked=true\nPG11.Mode=RMII\nPG11.Signal=ETH_TX_EN\nPG13.Locked=true\nPG13.Mode=RMII\nPG13.Signal=ETH_TXD0\nPG7.GPIOParameters=GPIO_Label\nPG7.GPIO_Label=USB_OTG_FS_OVCR\nPG7.Locked=true\nPG7.Signal=GPXTI7\nPH0-OSC_IN\\ (PH0).Locked=true\nPH0-OSC_IN\\ (PH0).Mode=HSE-External-Clock-Source\nPH0-OSC_IN\\ (PH0).Signal=RCC_OSC_IN\nPH1-OSC_OUT\\ (PH1).Locked=true\nPH1-OSC_OUT\\ (PH1).Signal=RCC_OSC_OUT\nPinOutPanel.RotationAngle=0\nProjectManager.AskForMigrate=true\nProjectManager.BackupPrevious=false\nProjectManager.CompilerOptimize=6\nProjectManager.ComputerToolchain=false\nProjectManager.CoupleFile=false\nProjectManager.CustomerFirmwarePackage=\nProjectManager.DefaultFWLocation=true\nProjectManager.DeletePrevious=true\nProjectManager.DeviceId=STM32H743ZITx\nProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.11.1\nProjectManager.FreePins=false\nProjectManager.HalAssertFull=false\nProjectManager.HeapSize=0x200\nProjectManager.KeepUserCode=true\nProjectManager.LastFirmware=true\nProjectManager.LibraryCopy=2\nProjectManager.MainLocation=Core/Src\nProjectManager.NoMain=false\nProjectManager.PreviousToolchain=STM32CubeIDE\nProjectManager.ProjectBuild=false\nProjectManager.ProjectFileName=stm32h743nucleo.ioc\nProjectManager.ProjectName=stm32h743nucleo\nProjectManager.ProjectStructure=\nProjectManager.RegisterCallBack=\nProjectManager.StackSize=0x400\nProjectManager.TargetToolchain=Makefile\nProjectManager.ToolChainLocation=\nProjectManager.UAScriptAfterPath=\nProjectManager.UAScriptBeforePath=\nProjectManager.UnderRoot=false\nProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,false-3-MX_ETH_Init-ETH-false-HAL-true,4-MX_USART3_UART_Init-USART3-false-HAL-true,5-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true\nRCC.ADCFreq_Value=16125000\nRCC.AHB12Freq_Value=200000000\nRCC.AHB4Freq_Value=200000000\nRCC.APB1Freq_Value=100000000\nRCC.APB2Freq_Value=100000000\nRCC.APB3Freq_Value=100000000\nRCC.APB4Freq_Value=100000000\nRCC.AXIClockFreq_Value=200000000\nRCC.CECFreq_Value=32000\nRCC.CKPERFreq_Value=64000000\nRCC.CortexFreq_Value=400000000\nRCC.CpuClockFreq_Value=400000000\nRCC.D1CPREFreq_Value=400000000\nRCC.D1PPRE=RCC_APB3_DIV2\nRCC.D2PPRE1=RCC_APB1_DIV2\nRCC.D2PPRE2=RCC_APB2_DIV2\nRCC.D3PPRE=RCC_APB4_DIV2\nRCC.DFSDMACLkFreq_Value=200000000\nRCC.DFSDMFreq_Value=100000000\nRCC.DIVM1=1\nRCC.DIVM3=1\nRCC.DIVN1=100\nRCC.DIVN3=24\nRCC.DIVP1Freq_Value=400000000\nRCC.DIVP2Freq_Value=16125000\nRCC.DIVP3Freq_Value=96000000\nRCC.DIVQ1=4\nRCC.DIVQ1Freq_Value=200000000\nRCC.DIVQ2Freq_Value=16125000\nRCC.DIVQ3=4\nRCC.DIVQ3Freq_Value=48000000\nRCC.DIVR1Freq_Value=400000000\nRCC.DIVR2Freq_Value=16125000\nRCC.DIVR3Freq_Value=96000000\nRCC.FDCANFreq_Value=200000000\nRCC.FMCFreq_Value=200000000\nRCC.FamilyName=M\nRCC.HCLK3ClockFreq_Value=200000000\nRCC.HCLKFreq_Value=200000000\nRCC.HPRE=RCC_HCLK_DIV2\nRCC.HRTIMFreq_Value=200000000\nRCC.HSE_VALUE=8000000\nRCC.I2C123Freq_Value=100000000\nRCC.I2C4Freq_Value=100000000\nRCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVM3,DIVN1,DIVN3,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HRTIMFreq_Value,HSE_VALUE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,PLLSourceVirtual,PWR_Regulator_Voltage_Scale,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBCLockSelection,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value\nRCC.LPTIM1Freq_Value=100000000\nRCC.LPTIM2Freq_Value=100000000\nRCC.LPTIM345Freq_Value=100000000\nRCC.LPUART1Freq_Value=100000000\nRCC.LTDCFreq_Value=96000000\nRCC.MCO1PinFreq_Value=64000000\nRCC.MCO2PinFreq_Value=400000000\nRCC.PLL2FRACN=0\nRCC.PLL3FRACN=0\nRCC.PLLFRACN=0\nRCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE\nRCC.PWR_Regulator_Voltage_Scale=PWR_REGULATOR_VOLTAGE_SCALE1\nRCC.QSPIFreq_Value=200000000\nRCC.RNGFreq_Value=48000000\nRCC.RTCFreq_Value=32000\nRCC.SAI1Freq_Value=200000000\nRCC.SAI23Freq_Value=200000000\nRCC.SAI4AFreq_Value=200000000\nRCC.SAI4BFreq_Value=200000000\nRCC.SDMMCFreq_Value=200000000\nRCC.SPDIFRXFreq_Value=200000000\nRCC.SPI123Freq_Value=200000000\nRCC.SPI45Freq_Value=100000000\nRCC.SPI6Freq_Value=100000000\nRCC.SWPMI1Freq_Value=100000000\nRCC.SYSCLKFreq_VALUE=400000000\nRCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK\nRCC.Tim1OutputFreq_Value=200000000\nRCC.Tim2OutputFreq_Value=200000000\nRCC.TraceFreq_Value=64000000\nRCC.USART16Freq_Value=100000000\nRCC.USART234578Freq_Value=100000000\nRCC.USBCLockSelection=RCC_USBCLKSOURCE_PLL3\nRCC.USBFreq_Value=48000000\nRCC.VCO1OutputFreq_Value=800000000\nRCC.VCO2OutputFreq_Value=32250000\nRCC.VCO3OutputFreq_Value=192000000\nRCC.VCOInput1Freq_Value=8000000\nRCC.VCOInput2Freq_Value=250000\nRCC.VCOInput3Freq_Value=8000000\nSH.GPXTI7.0=GPIO_EXTI7\nSH.GPXTI7.ConfNb=1\nUSART3.IPParameters=VirtualMode-Asynchronous\nUSART3.VirtualMode-Asynchronous=VM_ASYNC\nUSB_OTG_FS.IPParameters=VirtualMode\nUSB_OTG_FS.VirtualMode=Device_Only\nVP_SYS_VS_Systick.Mode=SysTick\nVP_SYS_VS_Systick.Signal=SYS_VS_Systick\nboard=NUCLEO-H743ZI2\nboardIOC=true\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h745disco/board.cmake",
    "content": "set(MCU_VARIANT stm32h745xx)\nset(JLINK_DEVICE stm32h745xi_m7)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/${MCU_VARIANT}_flash_CM7.ld)\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash_CM7.icf)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H745xx\n    HSE_VALUE=25000000\n    CORE_CM7\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h745disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H745 Discovery\n   url: https://www.st.com/en/evaluation-tools/stm32h745i-disco.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOJ,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_11, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_5, .Mode = GPIO_MODE_OUTPUT_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };\n\n  /*!< Supply configuration update enable */\n  /* For STM32H750XB, use \"HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\" */\n  HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);\n\n  /* The voltage scaling allows optimizing the power consumption when the\n     device is clocked below the maximum system frequency, to update the\n     voltage scaling value regarding system frequency refer to product\n     datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.HSIState = RCC_HSI_OFF;\n  RCC_OscInitStruct.CSIState = RCC_CSI_OFF;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n\n  /* PLL1 for System Clock */\n  RCC_OscInitStruct.PLL.PLLM = 5;\n  RCC_OscInitStruct.PLL.PLLN = 160;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 4;\n\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOMEDIUM;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* PLL3 for USB Clock */\n  PeriphClkInitStruct.PLL3.PLL3M = 25;\n  PeriphClkInitStruct.PLL3.PLL3N = 336;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0;\n  PeriphClkInitStruct.PLL3.PLL3P = 2;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n  PeriphClkInitStruct.PLL3.PLL3Q = 7;\n\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure  bus clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \\\n  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);\n\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  /*activate CSI clock mondatory for I/O Compensation Cell*/\n  __HAL_RCC_CSI_ENABLE() ;\n\n  /* Enable SYSCFG clock mondatory for I/O Compensation Cell */\n  __HAL_RCC_SYSCFG_CLK_ENABLE() ;\n\n  /* Enables the I/O Compensation Cell */\n  HAL_EnableCompensationCell();\n}\n\nstatic inline void board_init2(void) {\n  // For this board does nothing\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h745disco/board.mk",
    "content": "# STM32H745I-DISCO uses OTG_FS\n# FIXME: Reset enumerates, un/replug USB plug does not enumerate\nMCU_VARIANT = stm32h745xx\nCFLAGS += -DSTM32H745xx -DCORE_CM7 -DHSE_VALUE=25000000\n\n# Default is FulSpeed port\nPORT ?= 0\n\nLD_FILE_GCC = $(FAMILY_PATH)/linker/${MCU_VARIANT}_flash_CM7.ld\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32h745xx_flash_CM7.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h745xi_m7\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h747disco/board.cmake",
    "content": "set(MCU_VARIANT stm32h747xx)\nset(JLINK_DEVICE stm32h747xi_m7)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/${MCU_VARIANT}_flash_CM7.ld)\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash_CM7.icf)\n\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\n# device default to PORT 1 High Speed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 1)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H747xx\n    HSE_VALUE=25000000\n    CORE_CM7\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h747disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H747 Discovery\n   url: https://www.st.com/en/evaluation-tools/stm32h747i-disco.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     1\n\n// USB HS External PHY Pin: CLK, STP, DIR, NXT, D0-D7\n#define ULPI_PINS \\\n  {GPIOA, GPIO_PIN_3 }, {GPIOA, GPIO_PIN_5 }, {GPIOB, GPIO_PIN_0 }, {GPIOB, GPIO_PIN_1 }, \\\n  {GPIOB, GPIO_PIN_5 }, {GPIOB, GPIO_PIN_10}, {GPIOB, GPIO_PIN_11}, {GPIOB, GPIO_PIN_12}, \\\n  {GPIOB, GPIO_PIN_13}, {GPIOC, GPIO_PIN_0 }, {GPIOH, GPIO_PIN_4 }, {GPIOI, GPIO_PIN_11}\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOI,\n    .pin_init = { .Pin = GPIO_PIN_12, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };\n\n  /*!< Supply configuration update enable */\n  /* For STM32H750XB, use \"HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\" */\n  HAL_PWREx_ConfigSupply(PWR_DIRECT_SMPS_SUPPLY);\n\n  /* The voltage scaling allows optimizing the power consumption when the\n     device is clocked below the maximum system frequency, to update the\n     voltage scaling value regarding system frequency refer to product\n     datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.HSIState = RCC_HSI_OFF;\n  RCC_OscInitStruct.CSIState = RCC_CSI_OFF;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n\n  /* PLL1 for System Clock */\n  RCC_OscInitStruct.PLL.PLLM = 5;\n  RCC_OscInitStruct.PLL.PLLN = 160;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 4;\n\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOMEDIUM;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* PLL3 for USB Clock */\n  PeriphClkInitStruct.PLL3.PLL3M = 25;\n  PeriphClkInitStruct.PLL3.PLL3N = 336;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0;\n  PeriphClkInitStruct.PLL3.PLL3P = 2;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n  PeriphClkInitStruct.PLL3.PLL3Q = 7;\n\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure  bus clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \\\n  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);\n\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  /*activate CSI clock mondatory for I/O Compensation Cell*/\n  __HAL_RCC_CSI_ENABLE() ;\n\n  /* Enable SYSCFG clock mondatory for I/O Compensation Cell */\n  __HAL_RCC_SYSCFG_CLK_ENABLE() ;\n\n  /* Enables the I/O Compensation Cell */\n  HAL_EnableCompensationCell();\n}\n\nstatic inline void board_init2(void) {\n  // For this board does nothing\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport;\n  (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h747disco/board.mk",
    "content": "# STM32H747I-DISCO uses OTG_FS\n# FIXME: Reset enumerates, un/replug USB plug does not enumerate\nMCU_VARIANT = stm32h747xx\nCFLAGS += -DSTM32H747xx -DCORE_CM7 -DHSE_VALUE=25000000\n\n# Default is FulSpeed port\nPORT ?= 0\n\nLD_FILE_GCC = $(FAMILY_PATH)/linker/${MCU_VARIANT}_flash_CM7.ld\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32h747xx_flash_CM7.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h747xi_m7\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h750_weact/board.cmake",
    "content": "set(MCU_VARIANT stm32h750xx)\nset(JLINK_DEVICE stm32h750vb)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${MCU_VARIANT}_flash_CM7.ld)\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H750xx\n    HSE_VALUE=25000000\n    CORE_CM7\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h750_weact/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H750 WeAct\n   url: https://www.adafruit.com/product/5032\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOE,\n    .pin_init = { .Pin = GPIO_PIN_3, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_11, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n\n  // Supply configuration update enable\n  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\n\n  // Configure the main internal regulator output voltage\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);\n  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}\n\n  // Configure the PLL clock source\n  __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);\n\n  // Initializes the CPU, AHB and APB busses clocks\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.LSIState = RCC_LSI_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = 5;\n  RCC_OscInitStruct.PLL.PLLN = 96;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  // Initializes the CPU, AHB and APB busses clocks\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2\n                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;\n  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);\n\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_SPI4\n                              |RCC_PERIPHCLK_SPI1|RCC_PERIPHCLK_USB\n                              |RCC_PERIPHCLK_QSPI;\n  PeriphClkInitStruct.PLL3.PLL3M = 10;\n  PeriphClkInitStruct.PLL3.PLL3N = 96;\n  PeriphClkInitStruct.PLL3.PLL3P = 5;\n  PeriphClkInitStruct.PLL3.PLL3Q = 5;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n  PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_1;\n  PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0;\n  PeriphClkInitStruct.QspiClockSelection = RCC_QSPICLKSOURCE_D1HCLK;\n  PeriphClkInitStruct.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL;\n  PeriphClkInitStruct.Spi45ClockSelection = RCC_SPI45CLKSOURCE_D2PCLK1;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;\n  PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  // Enable USB Voltage detector\n  HAL_PWREx_EnableUSBVoltageDetector();\n}\n\nstatic inline void board_init2(void) {\n  // For this board does nothing\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h750_weact/board.mk",
    "content": "# STM32H745I-DISCO uses OTG_FS\n# FIXME: Reset enumerates, un/replug USB plug does not enumerate\nMCU_VARIANT = stm32h750xx\nCFLAGS += -DSTM32H750xx -DCORE_CM7 -DHSE_VALUE=25000000\n\nLD_FILE_GCC = $(BOARD_PATH)/stm32h750xx_flash_CM7.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h750vb\n\n# flash target using on-board stlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h750_weact/stm32h750xx_flash_CM7.ld",
    "content": "/*\n******************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**\n**  Abstract    : Linker script for STM32H7 series\n**                128Kbytes FLASH and 1Mbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed �as is,� without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2019 STMicroelectronics.\n** All rights reserved.\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 128K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 1M\nITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h750bdk/board.cmake",
    "content": "set(MCU_VARIANT stm32h750xx)\nset(JLINK_DEVICE stm32h750xb)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/${MCU_VARIANT}_flash_CM7.ld)\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H750xx\n    HSE_VALUE=25000000\n    CORE_CM7\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h750bdk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H750b Discovery Kit\n   url: https://www.st.com/en/evaluation-tools/stm32h750b-dk.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// UART\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_VBUS0_EN 4\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOJ,\n    .pin_init = { .Pin = GPIO_PIN_2, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_11, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // VBUS0 EN\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_5, .Mode = GPIO_MODE_OUTPUT_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  }\n};\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = { 0 };\n\n  /*!< Supply configuration update enable */\n  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\n\n  /* The voltage scaling allows optimizing the power consumption when the\n     device is clocked below the maximum system frequency, to update the\n     voltage scaling value regarding system frequency refer to product\n     datasheet.  */\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  while ((PWR->D3CR & (PWR_D3CR_VOSRDY)) != PWR_D3CR_VOSRDY) {}\n\n  /* Enable HSE Oscillator and activate PLL with HSE as source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;\n  RCC_OscInitStruct.HSIState = RCC_HSI_OFF;\n  RCC_OscInitStruct.CSIState = RCC_CSI_OFF;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n\n  /* PLL1 for System Clock */\n  RCC_OscInitStruct.PLL.PLLM = 5;\n  RCC_OscInitStruct.PLL.PLLN = 160;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 4;\n\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOMEDIUM;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* PLL3 for USB Clock */\n  PeriphClkInitStruct.PLL3.PLL3M = 25;\n  PeriphClkInitStruct.PLL3.PLL3N = 336;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0;\n  PeriphClkInitStruct.PLL3.PLL3P = 2;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n  PeriphClkInitStruct.PLL3.PLL3Q = 7;\n\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure  bus clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_D1PCLK1 | RCC_CLOCKTYPE_PCLK1 | \\\n  RCC_CLOCKTYPE_PCLK2  | RCC_CLOCKTYPE_D3PCLK1);\n\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  /*activate CSI clock mondatory for I/O Compensation Cell*/\n  __HAL_RCC_CSI_ENABLE() ;\n\n  /* Enable SYSCFG clock mondatory for I/O Compensation Cell */\n  __HAL_RCC_SYSCFG_CLK_ENABLE() ;\n\n  /* Enables the I/O Compensation Cell */\n  HAL_EnableCompensationCell();\n}\n\nstatic inline void board_init2(void) {\n  // For this board does nothing\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    board_pindef_t* pindef = &board_pindef[PINID_VBUS0_EN];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h750bdk/board.mk",
    "content": "# STM32H745I-DISCO uses OTG_FS\n# FIXME: Reset enumerates, un/replug USB plug does not enumerate\nMCU_VARIANT = stm32h750xx\nCFLAGS += -DSTM32H750xx -DCORE_CM7 -DHSE_VALUE=25000000\n\nLD_FILE_GCC = $(BOARD_PATH)/stm32h750xx_flash_CM7.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h750xb\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/stm32h750bdk/stm32h750xx_flash_CM7.ld",
    "content": "/*\n******************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**\n**  Abstract    : Linker script for STM32H7 series\n**                128Kbytes FLASH and 1Mbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed �as is,� without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2019 STMicroelectronics.\n** All rights reserved.\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 128K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 1M\nITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/waveshare_openh743i/board.cmake",
    "content": "set(MCU_VARIANT stm32h743xx)\nset(JLINK_DEVICE stm32h743xi)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/${MCU_VARIANT}_flash.ld)\n\nset(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\n\n# device default to PORT 1 High Speed\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H743xx\n    HSE_VALUE=8000000\n    HAL_TIM_MODULE_ENABLED\n    )\n  target_sources(${TARGET} PUBLIC\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_tim.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_tim_ex.c\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/waveshare_openh743i/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021\n *    Ha Thach (tinyusb.org)\n *    Benjamin Evans\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: Waveshare Open H743i\n   url: https://www.waveshare.com/openh743i-c-standard.htm\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n/* ** BOARD SETUP **\n *\n * NOTE: This board has bad signal integrity so you may experience some problems.\n * This setup assumes you have an openh743i-c Core and breakout board. For the HS\n * examples it also assumes you have a waveshare USB3300 breakout board plugged\n * into the ULPI PMOD header on the openh743i-c.\n *\n * UART Debugging:\n * Due to pin conflicts in the HS configuration, this BSP uses USART3 (PD8, PD9).\n * As such, you won't be able to use the UART to USB converter on board and will\n * require an external UART to USB converter. You could use the waveshare FT232\n * USB UART Board (micro) but any 3.3V UART to USB converter will be fine.\n *\n * Fullspeed:\n * If VBUS sense is enabled, ensure the PA9-VBUS jumper is connected on the core\n * board. Connect the PB6 jumper for the LED and the Wakeup - PA0 jumper for the\n * button. Connect the USB cable to the USB connector on the core board.\n *\n * High Speed:\n * Remove all jumpers from the openh743i-c (especially the USART1 jumpers as the\n * pins conflict). Connect the PB6 jumper for the LED and the Wakeup - PA0\n * jumper for the button.\n *\n * The reset pin on the ULPI PMOD port is not connected to the MCU. You'll need\n * to solder a wire from the RST pin on the USB3300 to a pin of your choosing on\n * the openh743i-c board (this example assumes you've used PD14 as specified with\n * the ULPI_RST_PORT and ULPI_RST_PIN defines below).\n *\n * Preferably power the board using the external 5VDC jack. Connect the USB cable\n * to the USB connector on the ULPI board. Adjust delays in this file as required.\n *\n * If you're having trouble, ask a question on the tinyUSB Github Discussion boards.\n *\n * Have fun!\n *\n*/\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Need to change jumper setting J7 and J8 from RS-232 to STLink\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     1\n#define OTG_HS_VBUS_SENSE     0\n\n // USB HS External PHY Pin: CLK, STP, DIR, NXT, D0-D7\n#define ULPI_PINS \\\n  {GPIOA, GPIO_PIN_3 }, {GPIOA, GPIO_PIN_5 }, {GPIOB, GPIO_PIN_0 }, {GPIOB, GPIO_PIN_1 }, \\\n  {GPIOB, GPIO_PIN_5 }, {GPIOB, GPIO_PIN_10}, {GPIOB, GPIO_PIN_11}, {GPIOB, GPIO_PIN_12}, \\\n  {GPIOB, GPIO_PIN_13}, {GPIOC, GPIO_PIN_0 }, {GPIOC, GPIO_PIN_2 }, {GPIOC, GPIO_PIN_3 }\n\n// ULPI PHY reset pin used by walkaround\n#define ULPI_RST_PORT GPIOD\n#define ULPI_RST_PIN GPIO_PIN_14\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_6, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_0, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // UART TX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n\n  { // I2C SCL for MFX VBUS\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_6, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF4_I2C1 },\n    .active_state = 0\n  },\n  { // I2C SDA for MFX VBUS\n    .port = GPIOB,\n    .pin_init = { .Pin = GPIO_PIN_7, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_HIGH, .Alternate = GPIO_AF4_I2C1 },\n    .active_state = 1\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n\n  __HAL_RCC_SYSCFG_CLK_ENABLE();\n\n  // Supply configuration update enable\n  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\n\n  // Configure the main internal regulator output voltage\n  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);\n\n  while (!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY))\n  {\n  }\n  // Macro to configure the PLL clock source\n  __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);\n\n  // Initializes the RCC Oscillators according to the specified parameters in the RCC_OscInitTypeDef structure.\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM = 2;\n  RCC_OscInitStruct.PLL.PLLN = 240;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;\n  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB | RCC_PERIPHCLK_USART3;\n  PeriphClkInitStruct.PLL3.PLL3M = 8;\n  PeriphClkInitStruct.PLL3.PLL3N = 336;\n  PeriphClkInitStruct.PLL3.PLL3P = 2;\n  PeriphClkInitStruct.PLL3.PLL3Q = 7;\n  PeriphClkInitStruct.PLL3.PLL3R = 2;\n  PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3VCIRANGE_0;\n  PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3VCOWIDE;\n  PeriphClkInitStruct.PLL3.PLL3FRACN = 0;\n  PeriphClkInitStruct.Usart234578ClockSelection = RCC_USART234578CLKSOURCE_PLL3;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  // Initializes the CPU, AHB and APB buses clocks\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_D3PCLK1 | RCC_CLOCKTYPE_D1PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);\n\n  __HAL_RCC_CSI_ENABLE();\n\n  // Enable SYSCFG clock mondatory for I/O Compensation Cell\n  __HAL_RCC_SYSCFG_CLK_ENABLE();\n\n  // Enables the I/O Compensation Cell\n  HAL_EnableCompensationCell();\n\n  // Enable voltage detector\n  HAL_PWREx_EnableUSBVoltageDetector();\n}\n\nstatic inline void timer_board_delay(TIM_HandleTypeDef* tim_hdl, uint32_t ms)\n{\n  uint32_t startMs = __HAL_TIM_GET_COUNTER(tim_hdl);\n  while ((__HAL_TIM_GET_COUNTER(tim_hdl) - startMs) < ms) {\n    asm(\"nop\"); //do nothing\n  }\n}\n\nstatic inline void board_init2(void)\n{\n  // walkaround for resetting the ULPI PHY using Timer since systick is not\n  // available when RTOS is used.\n\n  // Init timer\n  TIM_HandleTypeDef tim2Handle;\n  TIM_ClockConfigTypeDef sClockSourceConfig = {0};\n  GPIO_InitTypeDef  GPIO_InitStruct;\n\n  // ULPI_RST\n  GPIO_InitStruct.Pin   = ULPI_RST_PIN;\n  GPIO_InitStruct.Mode  = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull  = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = 0;\n  HAL_GPIO_Init(ULPI_RST_PORT, &GPIO_InitStruct);\n\n  __HAL_RCC_TIM2_CLK_ENABLE();\n\n  //Assuming timer clock is running at 260Mhz this should configure the timer counter to 1000Hz\n  tim2Handle.Instance = TIM2;\n  tim2Handle.Init.Prescaler = 60000U - 1U;\n  tim2Handle.Init.CounterMode = TIM_COUNTERMODE_UP;\n  tim2Handle.Init.Period = 0xFFFFFFFFU;\n  tim2Handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;\n  tim2Handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\n  HAL_TIM_Base_Init(&tim2Handle);\n\n  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;\n  HAL_TIM_ConfigClockSource(&tim2Handle, &sClockSourceConfig);\n\n  //Start the timer\n  HAL_TIM_Base_Start(&tim2Handle);\n\n  // Reset PHY, change the delays as you see fit\n  timer_board_delay(&tim2Handle, 5U);\n  HAL_GPIO_WritePin(ULPI_RST_PORT, ULPI_RST_PIN, GPIO_PIN_SET);\n  timer_board_delay(&tim2Handle, 20U);\n  HAL_GPIO_WritePin(ULPI_RST_PORT, ULPI_RST_PIN, GPIO_PIN_RESET);\n  timer_board_delay(&tim2Handle, 20U);\n\n  //Disable the timer used for delays\n  HAL_TIM_Base_Stop(&tim2Handle);\n  __HAL_RCC_TIM2_CLK_DISABLE();\n}\n\n// need to short a jumper\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  (void) rhport; (void) state;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7/boards/waveshare_openh743i/board.mk",
    "content": "MCU_VARIANT = stm32h743xx\nCFLAGS += -DSTM32H743xx -DHSE_VALUE=8000000\n\nRHPORT_SPEED = OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 0\n\nLD_FILE_GCC = $(FAMILY_PATH)/linker/stm32h743xx_flash.ld\n\n# Use Timer module for ULPI PHY reset\nCFLAGS += -DHAL_TIM_MODULE_ENABLED\nSRC_C += \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_tim.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_tim_ex.c\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h743ii\n\n# flash target using jlink\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/stm32h7/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019\n *    William D. Jones (thor0505@comcast.net),\n *    Ha Thach (tinyusb.org)\n *    Uwe Bonnes (bon@elektron.ikp.physik.tu-darmstadt.de\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32h7xx_hal.h\"\n#include \"bsp/board_api.h\"\n\nTU_ATTR_UNUSED static void Error_Handler(void) { }\n\ntypedef struct {\n  GPIO_TypeDef* port;\n  GPIO_InitTypeDef pin_init;\n  uint8_t active_state;\n} board_pindef_t;\n\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n#ifdef UART_DEV\nstatic UART_HandleTypeDef UartHandle = {\n  .Instance = UART_DEV,\n  .Init = {\n    .BaudRate = CFG_BOARD_UART_BAUDRATE,\n    .WordLength = UART_WORDLENGTH_8B,\n    .StopBits = UART_STOPBITS_1,\n    .Parity = UART_PARITY_NONE,\n    .HwFlowCtl = UART_HWCONTROL_NONE,\n    .Mode = UART_MODE_TX_RX,\n    .OverSampling = UART_OVERSAMPLING_16,\n  }\n};\n#endif\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\n// Despite being call USB2_OTG_FS on some MCUs\n// OTG_FS is marked as RHPort0 by TinyUSB to be consistent across stm32 port\nvoid OTG_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n// Despite being call USB1_OTG_HS on some MCUs\n// OTG_HS is marked as RHPort1 by TinyUSB to be consistent across stm32 port\nvoid OTG_HS_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n#ifdef TRACE_ETM\nstatic void trace_etm_init(void) {\n  // H7 trace pin is PE2 to PE6\n  GPIO_InitTypeDef  gpio_init;\n  gpio_init.Pin       = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6;\n  gpio_init.Mode      = GPIO_MODE_AF_PP;\n  gpio_init.Pull      = GPIO_PULLUP;\n  gpio_init.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;\n  gpio_init.Alternate = GPIO_AF0_TRACE;\n  HAL_GPIO_Init(GPIOE, &gpio_init);\n\n  // Enable trace clk, also in D1 and D3 domain\n  DBGMCU->CR |= DBGMCU_CR_DBG_TRACECKEN | DBGMCU_CR_DBG_CKD1EN | DBGMCU_CR_DBG_CKD3EN;\n}\n#else\n#define trace_etm_init()\n#endif\n\nvoid board_init(void) {\n  SCB_EnableICache();\n\n  HAL_Init();\n\n  // Implemented in board.h\n  SystemClock_Config();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n  __HAL_RCC_GPIOH_CLK_ENABLE();\n#ifdef __HAL_RCC_GPIOI_CLK_ENABLE\n  __HAL_RCC_GPIOI_CLK_ENABLE();\n#endif\n  __HAL_RCC_GPIOJ_CLK_ENABLE();\n\n  trace_etm_init();\n\n  for (uint8_t i = 0; i < TU_ARRAY_SIZE(board_pindef); i++) {\n    HAL_GPIO_Init(board_pindef[i].port, &board_pindef[i].pin_init);\n  }\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000u);\n\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1UL;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  #ifdef USB_OTG_FS_PERIPH_BASE\n  NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n  #endif\n\n  NVIC_SetPriority(OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n  // Disable SysTick before kernel entry; _tx_initialize_low_level() will re-configure it\n  SysTick->CTRL &= ~1UL;\n#endif\n\n  GPIO_InitTypeDef GPIO_InitStruct;\n\n#ifdef UART_DEV\n  UART_CLK_EN();\n  HAL_UART_Init(&UartHandle);\n#endif\n\n  //------------- USB FS -------------//\n  // Despite being call USB2_OTG\n  // OTG_FS is marked as RHPort0 by TinyUSB to be consistent across stm32 port\n  // PA9 VUSB, PA10 ID, PA11 DM, PA12 DP\n\n  // Configure DM DP Pins\n  GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG2_HS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  // This for ID line debug\n  GPIO_InitStruct.Pin = GPIO_PIN_10;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG2_HS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  // https://community.st.com/s/question/0D50X00009XkYZLSA3/stm32h7-nucleo-usb-fs-cdc\n  // TODO: Board init actually works fine without this line.\n  HAL_PWREx_EnableUSBVoltageDetector();\n  __HAL_RCC_USB2_OTG_FS_CLK_ENABLE();\n\n#if OTG_FS_VBUS_SENSE\n  // Configure VBUS Pin\n  GPIO_InitStruct.Pin = GPIO_PIN_9;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n#endif // vbus sense\n\n#if CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = OTG_FS_VBUS_SENSE;\n  tud_configure(0, TUD_CFGID_DWC2, &cfg);\n#endif\n\n  //------------- USB HS -------------//\n#if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 1)\n  // Despite being call USB2_OTG\n  // OTG_HS is marked as RHPort1 by TinyUSB to be consistent across stm32 port\n  struct {\n    GPIO_TypeDef* port;\n    uint32_t pin;\n  } const ulpi_pins[] = {\n    ULPI_PINS\n  };\n\n  for (uint8_t i=0; i < sizeof(ulpi_pins)/sizeof(ulpi_pins[0]); i++) {\n    GPIO_InitStruct.Pin       = ulpi_pins[i].pin;\n    GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;\n    GPIO_InitStruct.Pull      = GPIO_NOPULL;\n    GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;\n    GPIO_InitStruct.Alternate = GPIO_AF10_OTG2_HS;\n    HAL_GPIO_Init(ulpi_pins[i].port, &GPIO_InitStruct);\n  }\n\n  // Enable USB HS & ULPI Clocks\n  __HAL_RCC_USB1_OTG_HS_ULPI_CLK_ENABLE();\n  __HAL_RCC_USB1_OTG_HS_CLK_ENABLE();\n\n  #if CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = OTG_HS_VBUS_SENSE;\n  tud_configure(1, TUD_CFGID_DWC2, &cfg);\n  #endif\n#endif\n\n  HAL_PWREx_EnableUSBVoltageDetector();\n\n  board_init2(); // optional init\n\n  // Turn off device vbus\n#if CFG_TUD_ENABLED\n  board_vbus_set(BOARD_TUD_RHPORT, false);\n#endif\n  // Turn on host vbus\n#if CFG_TUH_ENABLED\n  board_vbus_set(BOARD_TUH_RHPORT, true);\n#endif\n\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n#ifdef PINID_LED\n  board_pindef_t* pindef = &board_pindef[PINID_LED];\n  GPIO_PinState pin_state = state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET;\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, pin_state);\n#else\n  (void) state;\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef PINID_BUTTON\n  board_pindef_t* pindef = &board_pindef[PINID_BUTTON];\n  return pindef->active_state == HAL_GPIO_ReadPin(pindef->port, pindef->pin_init.Pin);\n#else\n  return 0;\n#endif\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n#ifdef UART_DEV\n  int count = 0;\n  // clear overrun error if any\n  if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_ORE)) {\n    __HAL_UART_CLEAR_FLAG(&UartHandle, UART_CLEAR_OREF);\n  }\n  for (int i = 0; i < len; i++) {\n    if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE)) {\n      buf[i] = (uint8_t) UartHandle.Instance->RDR;\n      count++;\n    } else {\n      break;\n    }\n  }\n  return count;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t * )(uintptr_t)\n  buf, len, 0xffff);\n  return len;\n#else\n  (void) buf; (void) len;\n  return -1;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n// Keep HAL_GetTick() working for HAL functions called from board_init()\nvoid osal_threadx_tick_cb(void) {\n  HAL_IncTick();\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY h7)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(ST_MFXSTM32L152 ${TOP}/hw/mcu/st/stm32-mfxstm32l152)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m7 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32H7 CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif ()\n\nif (NOT DEFINED RHPORT_SPEED)\n  # Most F7 does not has built-in HS PHY\n  set(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_FULL_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\ncmake_print_variables(RHPORT_DEVICE RHPORT_DEVICE_SPEED RHPORT_HOST RHPORT_HOST_SPEED)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\n\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif(NOT DEFINED LD_FILE_IAR)\n  set(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\nendif()\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\n# only need to be built ONCE for all examples\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_i2c.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_i2c_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32H7)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--script=${LD_FILE_GNU}\")\n\n    if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n      target_link_options(${TARGET} PUBLIC -nostartfiles --specs=nosys.specs --specs=nano.specs)\n    endif ()\n\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC \"LINKER:--config=${LD_FILE_IAR}\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7/family.mk",
    "content": "ST_FAMILY = h7\nST_PREFIX = stm32${ST_FAMILY}xx\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/${ST_PREFIX}_hal_driver\nST_MFXSTM32L152 = hw/mcu/st/stm32-mfxstm32l152\n\nUF2_FAMILY_ID = 0x6db66082\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m7\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nRHPORT_SPEED ?= OPT_MODE_FULL_SPEED OPT_MODE_FULL_SPEED\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 0\n\n# Determine RHPORT_DEVICE_SPEED if not defined\nifndef RHPORT_DEVICE_SPEED\nifeq ($(RHPORT_DEVICE), 0)\n  RHPORT_DEVICE_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_DEVICE_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# Determine RHPORT_HOST_SPEED if not defined\nifndef RHPORT_HOST_SPEED\nifeq ($(RHPORT_HOST), 0)\n  RHPORT_HOST_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_HOST_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32H7 \\\n\t-DBOARD_TUD_RHPORT=${RHPORT_DEVICE} \\\n\t-DBOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED} \\\n\t-DBOARD_TUH_RHPORT=${RHPORT_HOST} \\\n\t-DBOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED} \\\n\n# GCC Flags\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += \\\n  -flto \\\n  -Wno-error=cast-align \\\n  -Wno-error=unused-parameter \\\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_${ST_PREFIX}.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_dma.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_gpio.c \\\n  ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_i2c.c \\\n  ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_i2c_ex.c \\\n  $(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_uart_ex.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT).s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32h7/linker/stm32h723xx_flash.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32H7 series\n**                1024Kbytes FLASH and 560Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2021 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Specify the memory areas */\nMEMORY\n{\n  ITCMRAM (xrw)    : ORIGIN = 0x00000000,   LENGTH = 64K\n  DTCMRAM (xrw)    : ORIGIN = 0x20000000,   LENGTH = 128K\n  FLASH    (rx)    : ORIGIN = 0x08000000,   LENGTH = 1024K\n  RAM_D1  (xrw)    : ORIGIN = 0x24000000,   LENGTH = 320K\n  RAM_D2  (xrw)    : ORIGIN = 0x30000000,   LENGTH = 32K\n  RAM_D3  (xrw)    : ORIGIN = 0x38000000,   LENGTH = 16K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM_D1) + LENGTH(RAM_D1);    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200 ;      /* required amount of heap  */\n_Min_Stack_Size = 0x400 ; /* required amount of stack */\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM_D1 AT> FLASH\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM_D1\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM_D1\n\n  .usbx_data 0x24027000 (NOLOAD):\n  {\n    *(.UsbHpcdSection)\n\n  } >RAM_D1\n\n  .uart_bss 0x24028000 (NOLOAD):\n  {\n    *(.UsbxAppSection)\n\n  } >RAM_D1\n\n  .usbx_bss 0x24029000 (NOLOAD):\n  {\n    *(.UsbxPoolSection)\n\n  } >RAM_D1\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/linker/stm32h743xx_flash.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32H743XIHx Device with\n**                2048KByte FLASH, 128KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Specify the memory areas */\nMEMORY\n{\n    DTCMRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K\n    RAM_D1 (xrw)  : ORIGIN = 0x24000000, LENGTH = 512K\n    RAM_D2 (xrw)  : ORIGIN = 0x30000000, LENGTH = 288K\n    RAM_D3 (xrw)  : ORIGIN = 0x38000000, LENGTH = 64K\n    ITCMRAM (xrw) : ORIGIN = 0x00000000, LENGTH = 64K\n    FLASH (rx)    : ORIGIN = 0x08000000, LENGTH = 2048K\n\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM_D1) + LENGTH(RAM_D1);    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM_D1 AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM_D1\n\n\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM_D1\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/linker/stm32h745xx_flash_CM7.ld",
    "content": "/*\n******************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**\n**  Abstract    : Linker script for STM32H7 series\n**                1024Kbytes FLASH and 192Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2019 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K\nITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab :\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n  .ARM :\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/linker/stm32h747xx_flash_CM7.ld",
    "content": "/*\n******************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**\n**  Abstract    : Linker script for STM32H7 series\n**                1024Kbytes FLASH and 192Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2019 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20020000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 1024K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 128K\nITCMRAM (xrw)      : ORIGIN = 0x00000000, LENGTH = 64K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab :\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n  .ARM :\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7/stm32h7xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32h7xx_hal_conf_template.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration template file.\n  *          This file should be copied to the application folder and renamed\n  *          to stm32h7xx_hal_conf.h.\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2017 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32H7xx_HAL_CONF_H\n#define STM32H7xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n#define HAL_ADC_MODULE_ENABLED\n/* #define HAL_CEC_MODULE_ENABLED */\n/* #define HAL_COMP_MODULE_ENABLED */\n#define HAL_CORTEX_MODULE_ENABLED\n/* #define HAL_CRC_MODULE_ENABLED */\n/* #define HAL_CRYP_MODULE_ENABLED */\n/* #define HAL_DAC_MODULE_ENABLED */\n/* #define HAL_DCMI_MODULE_ENABLED */\n/* #define HAL_DFSDM_MODULE_ENABLED */\n#define HAL_DMA_MODULE_ENABLED\n/* #define HAL_DMA2D_MODULE_ENABLED */\n/* #define HAL_ETH_MODULE_ENABLED */\n/* #define HAL_EXTI_MODULE_ENABLED */\n/* #define HAL_FDCAN_MODULE_ENABLED */\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_GPIO_MODULE_ENABLED\n/* #define HAL_HASH_MODULE_ENABLED */\n/* #define HAL_HCD_MODULE_ENABLED */\n/* #define HAL_HRTIM_MODULE_ENABLED */\n/* #define HAL_HSEM_MODULE_ENABLED */\n#define HAL_I2C_MODULE_ENABLED\n/* #define HAL_I2S_MODULE_ENABLED */\n/* #define HAL_IRDA_MODULE_ENABLED */\n/* #define HAL_IWDG_MODULE_ENABLED */\n/* #define HAL_JPEG_MODULE_ENABLED */\n/* #define HAL_LPTIM_MODULE_ENABLED */\n/* #define HAL_LTDC_MODULE_ENABLED */\n/* #define HAL_MDIOS_MODULE_ENABLED */\n/* #define HAL_MDMA_MODULE_ENABLED */\n/* #define HAL_MMC_MODULE_ENABLED */\n/* #define HAL_NAND_MODULE_ENABLED */\n/* #define HAL_NOR_MODULE_ENABLED */\n/* #define HAL_OPAMP_MODULE_ENABLED */\n/* #define HAL_PCD_MODULE_ENABLED */\n#define HAL_PWR_MODULE_ENABLED\n/* #define HAL_QSPI_MODULE_ENABLED */\n/* #define HAL_RAMECC_MODULE_ENABLED */\n#define HAL_RCC_MODULE_ENABLED\n/* #define HAL_RNG_MODULE_ENABLED */\n/* #define HAL_RTC_MODULE_ENABLED */\n/* #define HAL_SAI_MODULE_ENABLED */\n/* #define HAL_SD_MODULE_ENABLED */\n/* #define HAL_SDRAM_MODULE_ENABLED */\n/* #define HAL_SMARTCARD_MODULE_ENABLED */\n/* #define HAL_SMBUS_MODULE_ENABLED */\n/* #define HAL_SPDIFRX_MODULE_ENABLED */\n#define HAL_SPI_MODULE_ENABLED\n/* #define HAL_SRAM_MODULE_ENABLED */\n/* #define HAL_SWPMI_MODULE_ENABLED */\n/* #define HAL_TIM_MODULE_ENABLED */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED */\n/* #define HAL_WWDG_MODULE_ENABLED */\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n//#define HSE_VALUE    ((uint32_t)25000000) /*!< Value of the External oscillator in Hz */\n#error HSE_VALUE is not defined\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    ((uint32_t)5000)   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal  oscillator (CSI) default value.\n  *        This value is the default CSI value after Reset.\n  */\n#if !defined  (CSI_VALUE)\n  #define CSI_VALUE    ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/\n#endif /* CSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE    ((uint32_t)64000000) /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n  #define LSE_VALUE    ((uint32_t)32768) /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    ((uint32_t)5000)   /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n#if !defined  (LSI_VALUE)\n  #define LSI_VALUE  ((uint32_t)32000)      /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\n                                              The real value may vary depending on the variations\n                                              in voltage and temperature.*/\n\n/**\n  * @brief External clock source for I2S peripheral\n  *        This value is used by the I2S HAL module to compute the I2S clock source\n  *        frequency, this source is inserted directly through I2S_CKIN pad.\n  */\n#if !defined  (EXTERNAL_CLOCK_VALUE)\n  #define EXTERNAL_CLOCK_VALUE    12288000UL /*!< Value of the External clock in Hz*/\n#endif /* EXTERNAL_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    (3300UL) /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            (0x0FUL) /*!< tick interrupt priority */\n#define  USE_RTOS                     0\n#define  USE_SD_TRANSCEIVER           0U       /*!< use uSD Transceiver */\n#define  USE_SPI_CRC                  1U       /*!< use CRC in SPI */\n#define  USE_FLASH_ECC                0U       /*!< use ECC error management in FLASH */\n#define  USE_SDIO_TRANSCEIVER         0U       /*!< use SDIO Transceiver */\n#define  SDIO_MAX_IO_NUMBER           7U       /*!< SDIO device support maximum IO number */\n\n#define  USE_HAL_ADC_REGISTER_CALLBACKS     0U /* ADC register callback disabled     */\n#define  USE_HAL_CEC_REGISTER_CALLBACKS     0U /* CEC register callback disabled     */\n#define  USE_HAL_COMP_REGISTER_CALLBACKS    0U /* COMP register callback disabled    */\n#define  USE_HAL_CORDIC_REGISTER_CALLBACKS  0U /* CORDIC register callback disabled  */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS    0U /* CRYP register callback disabled    */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS     0U /* DAC register callback disabled     */\n#define  USE_HAL_DCMI_REGISTER_CALLBACKS    0U /* DCMI register callback disabled    */\n#define  USE_HAL_DFSDM_REGISTER_CALLBACKS   0U /* DFSDM register callback disabled   */\n#define  USE_HAL_DMA2D_REGISTER_CALLBACKS   0U /* DMA2D register callback disabled   */\n#define  USE_HAL_DSI_REGISTER_CALLBACKS     0U /* DSI register callback disabled     */\n#define  USE_HAL_DTS_REGISTER_CALLBACKS     0U /* DTS register callback disabled     */\n#define  USE_HAL_ETH_REGISTER_CALLBACKS     0U /* ETH register callback disabled     */\n#define  USE_HAL_FDCAN_REGISTER_CALLBACKS   0U /* FDCAN register callback disabled   */\n#define  USE_HAL_FMAC_REGISTER_CALLBACKS    0U /* FMAC register callback disabled  */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS    0U /* NAND register callback disabled    */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS     0U /* NOR register callback disabled     */\n#define  USE_HAL_SDRAM_REGISTER_CALLBACKS   0U /* SDRAM register callback disabled   */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS    0U /* SRAM register callback disabled    */\n#define  USE_HAL_HASH_REGISTER_CALLBACKS    0U /* HASH register callback disabled    */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS     0U /* HCD register callback disabled     */\n#define  USE_HAL_GFXMMU_REGISTER_CALLBACKS  0U /* GFXMMU register callback disabled  */\n#define  USE_HAL_HRTIM_REGISTER_CALLBACKS   0U /* HRTIM register callback disabled   */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS     0U /* I2C register callback disabled     */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS     0U /* I2S register callback disabled     */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS    0U /* IRDA register callback disabled    */\n#define  USE_HAL_JPEG_REGISTER_CALLBACKS    0U /* JPEG register callback disabled    */\n#define  USE_HAL_LPTIM_REGISTER_CALLBACKS   0U /* LPTIM register callback disabled   */\n#define  USE_HAL_LTDC_REGISTER_CALLBACKS    0U /* LTDC register callback disabled    */\n#define  USE_HAL_MDIOS_REGISTER_CALLBACKS   0U /* MDIO register callback disabled    */\n#define  USE_HAL_MMC_REGISTER_CALLBACKS     0U /* MMC register callback disabled     */\n#define  USE_HAL_OPAMP_REGISTER_CALLBACKS   0U /* MDIO register callback disabled    */\n#define  USE_HAL_OSPI_REGISTER_CALLBACKS    0U /* OSPI register callback disabled    */\n#define  USE_HAL_OTFDEC_REGISTER_CALLBACKS  0U /* OTFDEC register callback disabled  */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS     0U /* PCD register callback disabled     */\n#define  USE_HAL_QSPI_REGISTER_CALLBACKS    0U /* QSPI register callback disabled    */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS     0U /* RNG register callback disabled     */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS     0U /* RTC register callback disabled     */\n#define  USE_HAL_SAI_REGISTER_CALLBACKS     0U /* SAI register callback disabled     */\n#define  USE_HAL_SD_REGISTER_CALLBACKS      0U /* SD register callback disabled      */\n#define  USE_HAL_SDIO_REGISTER_CALLBACKS    0U /* SDIO register callback disabled      */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS  0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS   0U /* SMBUS register callback disabled   */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS     0U /* SPI register callback disabled     */\n#define  USE_HAL_SWPMI_REGISTER_CALLBACKS   0U /* SWPMI register callback disabled   */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS     0U /* TIM register callback disabled     */\n#define  USE_HAL_UART_REGISTER_CALLBACKS    0U /* UART register callback disabled    */\n#define  USE_HAL_USART_REGISTER_CALLBACKS   0U /* USART register callback disabled   */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS    0U /* WWDG register callback disabled    */\n\n/* ########################### Ethernet Configuration ######################### */\n#define ETH_TX_DESC_CNT         4U  /* number of Ethernet Tx DMA descriptors */\n#define ETH_RX_DESC_CNT         4U  /* number of Ethernet Rx DMA descriptors */\n\n#define ETH_MAC_ADDR0    (0x02UL)\n#define ETH_MAC_ADDR1    (0x00UL)\n#define ETH_MAC_ADDR2    (0x00UL)\n#define ETH_MAC_ADDR3    (0x00UL)\n#define ETH_MAC_ADDR4    (0x00UL)\n#define ETH_MAC_ADDR5    (0x00UL)\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1 */\n\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32h7xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32h7xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32h7xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_MDMA_MODULE_ENABLED\n #include \"stm32h7xx_hal_mdma.h\"\n#endif /* HAL_MDMA_MODULE_ENABLED */\n\n#ifdef HAL_HASH_MODULE_ENABLED\n  #include \"stm32h7xx_hal_hash.h\"\n#endif /* HAL_HASH_MODULE_ENABLED */\n\n#ifdef HAL_DCMI_MODULE_ENABLED\n  #include \"stm32h7xx_hal_dcmi.h\"\n#endif /* HAL_DCMI_MODULE_ENABLED */\n\n#ifdef HAL_DMA2D_MODULE_ENABLED\n  #include \"stm32h7xx_hal_dma2d.h\"\n#endif /* HAL_DMA2D_MODULE_ENABLED */\n\n#ifdef HAL_DSI_MODULE_ENABLED\n  #include \"stm32h7xx_hal_dsi.h\"\n#endif /* HAL_DSI_MODULE_ENABLED */\n\n#ifdef HAL_DFSDM_MODULE_ENABLED\n  #include \"stm32h7xx_hal_dfsdm.h\"\n#endif /* HAL_DFSDM_MODULE_ENABLED */\n\n#ifdef HAL_ETH_MODULE_ENABLED\n  #include \"stm32h7xx_hal_eth.h\"\n#endif /* HAL_ETH_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n  #include \"stm32h7xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32h7xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32h7xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_FDCAN_MODULE_ENABLED\n  #include \"stm32h7xx_hal_fdcan.h\"\n#endif /* HAL_FDCAN_MODULE_ENABLED */\n\n#ifdef HAL_CEC_MODULE_ENABLED\n  #include \"stm32h7xx_hal_cec.h\"\n#endif /* HAL_CEC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n  #include \"stm32h7xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32h7xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32h7xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n  #include \"stm32h7xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32h7xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_HRTIM_MODULE_ENABLED\n  #include \"stm32h7xx_hal_hrtim.h\"\n#endif /* HAL_HRTIM_MODULE_ENABLED */\n\n#ifdef HAL_HSEM_MODULE_ENABLED\n  #include \"stm32h7xx_hal_hsem.h\"\n#endif /* HAL_HSEM_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32h7xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32h7xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n  #include \"stm32h7xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32h7xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32h7xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32h7xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_JPEG_MODULE_ENABLED\n #include \"stm32h7xx_hal_jpeg.h\"\n#endif /* HAL_JPEG_MODULE_ENABLED */\n\n#ifdef HAL_MDIOS_MODULE_ENABLED\n #include \"stm32h7xx_hal_mdios.h\"\n#endif /* HAL_MDIOS_MODULE_ENABLED */\n\n#ifdef HAL_MMC_MODULE_ENABLED\n #include \"stm32h7xx_hal_mmc.h\"\n#endif /* HAL_MMC_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32h7xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_LTDC_MODULE_ENABLED\n#include \"stm32h7xx_hal_ltdc.h\"\n#endif /* HAL_LTDC_MODULE_ENABLED */\n\n#ifdef HAL_OPAMP_MODULE_ENABLED\n#include \"stm32h7xx_hal_opamp.h\"\n#endif /* HAL_OPAMP_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32h7xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_QSPI_MODULE_ENABLED\n #include \"stm32h7xx_hal_qspi.h\"\n#endif /* HAL_QSPI_MODULE_ENABLED */\n\n#ifdef HAL_RAMECC_MODULE_ENABLED\n #include \"stm32h7xx_hal_ramecc.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n #include \"stm32h7xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32h7xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n #include \"stm32h7xx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n #include \"stm32h7xx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SDRAM_MODULE_ENABLED\n #include \"stm32h7xx_hal_sdram.h\"\n#endif /* HAL_SDRAM_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32h7xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_SPDIFRX_MODULE_ENABLED\n #include \"stm32h7xx_hal_spdifrx.h\"\n#endif /* HAL_SPDIFRX_MODULE_ENABLED */\n\n#ifdef HAL_SWPMI_MODULE_ENABLED\n #include \"stm32h7xx_hal_swpmi.h\"\n#endif /* HAL_SWPMI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32h7xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32h7xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32h7xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32h7xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32h7xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32h7xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32h7xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32h7xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n #include \"stm32h7xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t *file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32H7xx_HAL_CONF_H */\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32h7rsxx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*8*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/boards/stm32h7s3nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32h7s3xx)\nset(JLINK_DEVICE stm32h7s3l8)\n\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(RHPORT_DEVICE 1)\nset(RHPORT_HOST 1)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32H7S3xx\n    )\n  target_sources(${TARGET} PUBLIC\n    ${ST_TCPP0203}/tcpp0203.c\n    ${ST_TCPP0203}/tcpp0203_reg.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${ST_TCPP0203}\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/boards/stm32h7s3nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 H7S3L8 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-h7s3l8.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"tcpp0203.h\"\n#include \"stm32h7rsxx_ll_exti.h\"\n#include \"stm32h7rsxx_ll_system.h\"\n\n#define UART_DEV              USART3\n#define UART_CLK_EN           __HAL_RCC_USART3_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE     0\n#define OTG_HS_VBUS_SENSE     0\n\n#define PINID_LED      0\n#define PINID_BUTTON   1\n#define PINID_UART_TX  2\n#define PINID_UART_RX  3\n#define PINID_TCPP0203_EN  4\n\nstatic board_pindef_t board_pindef[] = {\n  { // LED\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_10, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 1\n  },\n  { // Button\n    .port = GPIOC,\n    .pin_init = { .Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // UART TX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // UART RX\n    .port = GPIOD,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF7_USART3 },\n    .active_state = 0\n  },\n  { // VBUS input pin used for TCPP0203 EN\n    .port = GPIOM,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n    .active_state = 0\n  },\n  { // I2C SCL for TCPP0203\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF4_I2C3 },\n  },\n  { // I2C SDA for TCPP0203\n    .port = GPIOA,\n    .pin_init = { .Pin = GPIO_PIN_9, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = GPIO_AF4_I2C3 },\n  },\n  { // INT for TCPP0203\n    .port = GPIOM,\n    .pin_init = { .Pin = GPIO_PIN_8, .Mode = GPIO_MODE_IT_FALLING, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0 },\n  },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_CSI;\n  RCC_OscInitStruct.CSIState = RCC_CSI_ON;\n  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  /** Configure the main internal regulator output voltage\n  */\n  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE0) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL1.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL1.PLLM = 12;\n  RCC_OscInitStruct.PLL1.PLLN = 300;\n  RCC_OscInitStruct.PLL1.PLLP = 1;\n  RCC_OscInitStruct.PLL1.PLLQ = 2;\n  RCC_OscInitStruct.PLL1.PLLR = 2;\n  RCC_OscInitStruct.PLL1.PLLS = 2;\n  RCC_OscInitStruct.PLL1.PLLT = 2;\n  RCC_OscInitStruct.PLL1.PLLFractional = 0;\n  RCC_OscInitStruct.PLL2.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL2.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL2.PLLM = 12;\n  RCC_OscInitStruct.PLL2.PLLN = 200;\n  RCC_OscInitStruct.PLL2.PLLP = 2;\n  RCC_OscInitStruct.PLL2.PLLQ = 2;\n  RCC_OscInitStruct.PLL2.PLLR = 2;\n  RCC_OscInitStruct.PLL2.PLLS = 2;\n  RCC_OscInitStruct.PLL2.PLLT = 2;\n  RCC_OscInitStruct.PLL2.PLLFractional = 0;\n  RCC_OscInitStruct.PLL3.PLLState = RCC_PLL_NONE;\n  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2\n                              |RCC_CLOCKTYPE_PCLK4|RCC_CLOCKTYPE_PCLK5;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;\n  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;\n  RCC_ClkInitStruct.APB5CLKDivider = RCC_APB5_DIV2;\n\n  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_7) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USBPHYC;\n  PeriphClkInit.UsbPhycClockSelection = RCC_USBPHYCCLKSOURCE_HSE;\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)\n  {\n    Error_Handler();\n  }\n\n  __HAL_RCC_SBS_CLK_ENABLE();\n}\n\n//--------------------------------------------------------------------+\n// USB PD\n//--------------------------------------------------------------------+\nstatic I2C_HandleTypeDef i2c_handle = {\n  .Instance = I2C3,\n  .Init = {\n    .Timing = 0x20C0EDFF,\n    .OwnAddress1 = 0,\n    .AddressingMode = I2C_ADDRESSINGMODE_7BIT,\n    .DualAddressMode = I2C_DUALADDRESS_DISABLE,\n    .OwnAddress2 = 0,\n    .OwnAddress2Masks = I2C_OA2_NOMASK,\n    .GeneralCallMode = I2C_GENERALCALL_DISABLE,\n    .NoStretchMode = I2C_NOSTRETCH_DISABLE,\n  }\n};\nstatic TCPP0203_Object_t tcpp0203_obj = { 0 };\n\nint32_t board_tcpp0203_init(void) {\n  board_pindef_t* pindef = &board_pindef[PINID_TCPP0203_EN];\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, GPIO_PIN_SET);\n\n  __HAL_RCC_I2C3_CLK_ENABLE();\n  __HAL_RCC_I2C3_FORCE_RESET();\n  __HAL_RCC_I2C3_RELEASE_RESET();\n  if (HAL_I2C_Init(&i2c_handle) != HAL_OK) {\n    return HAL_ERROR;\n  }\n\n  NVIC_SetPriority(EXTI8_IRQn, 12);\n  NVIC_EnableIRQ(EXTI8_IRQn);\n\n  return 0;\n}\n\nint32_t board_tcpp0203_deinit(void) {\n  return 0;\n}\n\nint32_t i2c_readreg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  TU_ASSERT (HAL_OK == HAL_I2C_Mem_Read(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000));\n  return 0;\n}\n\nint32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  TU_ASSERT(HAL_OK == HAL_I2C_Mem_Write(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000));\n  return 0;\n}\n\nstatic inline void board_init2(void) {\n  TCPP0203_IO_t            io_ctx;\n\n  io_ctx.Address     = TCPP0203_I2C_ADDRESS_X68;\n  io_ctx.Init        = board_tcpp0203_init;\n  io_ctx.DeInit      = board_tcpp0203_deinit;\n  io_ctx.ReadReg     = i2c_readreg;\n  io_ctx.WriteReg    = i2c_writereg;\n\n  TU_ASSERT(TCPP0203_RegisterBusIO(&tcpp0203_obj, &io_ctx) == TCPP0203_OK, );\n\n  TU_ASSERT(TCPP0203_Init(&tcpp0203_obj) == TCPP0203_OK, );\n\n  TU_ASSERT(TCPP0203_SetPowerMode(&tcpp0203_obj, TCPP0203_POWER_MODE_NORMAL) == TCPP0203_OK, );\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  (void) state;\n  if (rhport == 1) {\n    TU_ASSERT(TCPP0203_SetGateDriverProvider(&tcpp0203_obj, TCPP0203_GD_PROVIDER_SWITCH_CLOSED) == TCPP0203_OK, );\n  }\n}\n\nvoid EXTI8_IRQHandler(void) {\n    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);\n    if (tcpp0203_obj.IsInitialized) {\n      TU_ASSERT(TCPP0203_SetPowerMode(&tcpp0203_obj, TCPP0203_POWER_MODE_NORMAL) == TCPP0203_OK, );\n      TU_ASSERT(TCPP0203_SetGateDriverProvider(&tcpp0203_obj, TCPP0203_GD_PROVIDER_SWITCH_CLOSED) == TCPP0203_OK, );\n    }\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/boards/stm32h7s3nucleo/board.mk",
    "content": "MCU_VARIANT = stm32h7s3xx\nCFLAGS += -DSTM32H7S3xx\n\n# For flash-jlink target\nJLINK_DEVICE = stm32h7s3l8\n\n# flash target using on-board stlink\nflash: flash-stlink\n\nSRC_C += \\\n\t$(ST_TCPP0203)/tcpp0203.c \\\n\t$(ST_TCPP0203)/tcpp0203_reg.c \\\n\nINC += \\\n\t$(TOP)/$(ST_TCPP0203) \\\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019\n *    William D. Jones (thor0505@comcast.net),\n *    Ha Thach (tinyusb.org)\n *    Uwe Bonnes (bon@elektron.ikp.physik.tu-darmstadt.de\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32h7rsxx_hal.h\"\n#include \"bsp/board_api.h\"\n\nTU_ATTR_UNUSED static void Error_Handler(void) { }\n\ntypedef struct {\n  GPIO_TypeDef* port;\n  GPIO_InitTypeDef pin_init;\n  uint8_t active_state;\n} board_pindef_t;\n\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n#ifdef UART_DEV\nstatic UART_HandleTypeDef UartHandle = {\n  .Instance = UART_DEV,\n  .Init = {\n    .BaudRate = CFG_BOARD_UART_BAUDRATE,\n    .WordLength = UART_WORDLENGTH_8B,\n    .StopBits = UART_STOPBITS_1,\n    .Parity = UART_PARITY_NONE,\n    .HwFlowCtl = UART_HWCONTROL_NONE,\n    .Mode = UART_MODE_TX_RX,\n    .OverSampling = UART_OVERSAMPLING_16,\n  }\n};\n#endif\n\n#ifndef SWO_FREQ\n#define SWO_FREQ  4000000\n#endif\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\n// Despite being call USB2_OTG_FS on some MCUs\n// OTG_FS is marked as RHPort0 by TinyUSB to be consistent across stm32 port\nvoid OTG_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\n// Despite being call USB1_OTG_HS on some MCUs\n// OTG_HS is marked as RHPort1 by TinyUSB to be consistent across stm32 port\nvoid OTG_HS_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n#ifdef TRACE_ETM\nvoid trace_etm_init(void) {\n  // H7 trace pin is PE2 to PE6\n  GPIO_InitTypeDef  gpio_init;\n  gpio_init.Pin       = GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6;\n  gpio_init.Mode      = GPIO_MODE_AF_PP;\n  gpio_init.Pull      = GPIO_PULLUP;\n  gpio_init.Speed     = GPIO_SPEED_FREQ_VERY_HIGH;\n  gpio_init.Alternate = GPIO_AF0_TRACE;\n  HAL_GPIO_Init(GPIOE, &gpio_init);\n\n  // Enable trace clk, also in D1 and D3 domain\n  DBGMCU->CR |= DBGMCU_CR_DBG_TRACECKEN | DBGMCU_CR_DBG_CKD1EN | DBGMCU_CR_DBG_CKD3EN;\n}\n#else\n  #define trace_etm_init()\n#endif\n\n#ifdef LOGGER_SWO\nvoid log_swo_init(void)\n{\n  //UNLOCK FUNNEL\n  *(volatile uint32_t*)(0x5C004FB0) = 0xC5ACCE55; // SWTF_LAR\n  *(volatile uint32_t*)(0x5C003FB0) = 0xC5ACCE55; // SWO_LAR\n\n  //SWO current output divisor register\n  //To change it, you can use the following rule\n  // value = (CPU_Freq / 3 / SWO_Freq) - 1\n  *(volatile uint32_t*)(0x5C003010) = ((SystemCoreClock / 3 / SWO_FREQ) - 1); // SWO_CODR\n\n  //SWO selected pin protocol register\n  *(volatile uint32_t*)(0x5C0030F0) = 0x00000002; // SWO_SPPR\n\n  //Enable ITM input of SWO trace funnel\n  *(volatile uint32_t*)(0x5C004000) |= 0x00000001; // SWFT_CTRL\n}\n#else\n  #define log_swo_init()\n#endif\n\nstatic void MPU_AdjustRegionAddressSize(uint32_t Address, uint32_t Size, MPU_Region_InitTypeDef* pInit);\nstatic void MPU_Config(void)\n{\n  MPU_Region_InitTypeDef MPU_InitStruct = {0};\n  uint32_t index = MPU_REGION_NUMBER0;\n  uint32_t address;\n  uint32_t size;\n\n  /* Disable the MPU */\n  HAL_MPU_Disable();\n\n  /* Initialize the background region */\n  MPU_InitStruct.Enable = MPU_REGION_ENABLE;\n  MPU_InitStruct.Number = index;\n  MPU_InitStruct.BaseAddress = 0x0;\n  MPU_InitStruct.Size = MPU_REGION_SIZE_4GB;\n  MPU_InitStruct.SubRegionDisable = 0x87;\n  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;\n  MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;\n  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;\n  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;\n  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;\n  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;\n  HAL_MPU_ConfigRegion(&MPU_InitStruct);\n  index++;\n\n  /* Initialize the non cacheable region */\n#if defined ( __ICCARM__ )\n  /* get the region attribute form the icf file */\n  extern uint32_t NONCACHEABLEBUFFER_start;\n  extern uint32_t NONCACHEABLEBUFFER_size;\n\n  address = (uint32_t)&NONCACHEABLEBUFFER_start;\n  size = (uint32_t)&NONCACHEABLEBUFFER_size;\n\n#elif defined (__CC_ARM) || defined(__ARMCC_VERSION)\n  extern uint32_t Image$$RW_NONCACHEABLEBUFFER$$Base;\n  extern uint32_t Image$$RW_NONCACHEABLEBUFFER$$Length;\n  extern uint32_t Image$$RW_NONCACHEABLEBUFFER$$ZI$$Length;\n\n  address = (uint32_t)&Image$$RW_NONCACHEABLEBUFFER$$Base;\n  size  = (uint32_t)&Image$$RW_NONCACHEABLEBUFFER$$Length + (uint32_t)&Image$$RW_NONCACHEABLEBUFFER$$ZI$$Length;\n#elif defined ( __GNUC__ )\n  extern int __NONCACHEABLEBUFFER_BEGIN;\n  extern int __NONCACHEABLEBUFFER_END;\n\n  address = (uint32_t)&__NONCACHEABLEBUFFER_BEGIN;\n  size  = (uint32_t)&__NONCACHEABLEBUFFER_END - (uint32_t)&__NONCACHEABLEBUFFER_BEGIN;\n#else\n#error \"Compiler toolchain is unsupported\"\n#endif\n\n  if (size != 0)\n  {\n    /* Configure the MPU attributes as Normal Non Cacheable */\n    MPU_InitStruct.Enable = MPU_REGION_ENABLE;\n    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;\n    MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;\n    MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;\n    MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;\n    MPU_InitStruct.Number = index;\n    MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;\n    MPU_InitStruct.SubRegionDisable = 0x00;\n    MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;\n    MPU_AdjustRegionAddressSize(address, size, &MPU_InitStruct);\n    HAL_MPU_ConfigRegion(&MPU_InitStruct);\n    index++;\n  }\n\n  /* Initialize the region corresponding to the execution area\n     (external or internal flash or external or internal RAM\n     depending on scatter file definition) */\n#if defined ( __ICCARM__ )\n  extern uint32_t __ICFEDIT_region_ROM_start__;\n  extern uint32_t __ICFEDIT_region_ROM_end__;\n  address = (uint32_t)&__ICFEDIT_region_ROM_start__;\n  size = (uint32_t)&__ICFEDIT_region_ROM_end__ - (uint32_t)&__ICFEDIT_region_ROM_start__ + 1;\n#elif defined (__CC_ARM) || defined(__ARMCC_VERSION)\n  extern uint32_t Image$$ER_ROM$$Base;\n  extern uint32_t Image$$ER_ROM$$Limit;\n  address = (uint32_t)&Image$$ER_ROM$$Base;\n  size    = (uint32_t)&Image$$ER_ROM$$Limit-(uint32_t)&Image$$ER_ROM$$Base;\n#elif defined ( __GNUC__ )\n  extern uint32_t __FLASH_BEGIN;\n  extern uint32_t __FLASH_SIZE;\n  address = (uint32_t)&__FLASH_BEGIN;\n  size  = (uint32_t)&__FLASH_SIZE;\n#else\n#error \"Compiler toolchain is unsupported\"\n#endif\n\n  MPU_InitStruct.Enable = MPU_REGION_ENABLE;\n  MPU_InitStruct.Number = index;\n  MPU_InitStruct.SubRegionDisable = 0u;\n  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;\n  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;\n  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;\n  MPU_InitStruct.IsShareable = MPU_ACCESS_SHAREABLE;\n  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;\n  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;\n  MPU_AdjustRegionAddressSize(address, size, &MPU_InitStruct);\n  HAL_MPU_ConfigRegion(&MPU_InitStruct);\n  index++;\n\n  /* Reset unused MPU regions */\n  for(; index < __MPU_REGIONCOUNT ; index++)\n  {\n    /* All unused regions disabled */\n    MPU_InitStruct.Enable = MPU_REGION_DISABLE;\n    MPU_InitStruct.Number = index;\n    HAL_MPU_ConfigRegion(&MPU_InitStruct);\n  }\n\n  /* Enable the MPU */\n  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);\n}\n\n/**\n  * @brief This function adjusts the MPU region Address and Size within an MPU configuration.\n  * @param Address memory address\n  * @param Size memory size\n  * @param pInit pointer to an MPU initialization structure\n  * @retval None\n  */\nstatic void MPU_AdjustRegionAddressSize(uint32_t Address, uint32_t Size, MPU_Region_InitTypeDef* pInit)\n{\n  /* Compute the MPU region size */\n  pInit->Size = ((31 - __CLZ(Size)) - 1);\n  if (Size > (1u << (pInit->Size + 1)))\n  {\n    pInit->Size++;\n  }\n  uint32_t Modulo = Address % (1 << (pInit->Size - 1));\n  if (0 != Modulo)\n  {\n    /* Align address with MPU region size considering there is no need to increase the size */\n    pInit->BaseAddress = Address - Modulo;\n  }\n  else\n  {\n    pInit->BaseAddress = Address;\n  }\n}\n\nvoid board_init(void) {\n  HAL_Init();\n\n  MPU_Config();\n  SCB_EnableICache();\n  SCB_EnableDCache();\n\n  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);\n\n  // Implemented in board.h\n  SystemClock_Config();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n  __HAL_RCC_GPIOM_CLK_ENABLE();\n  __HAL_RCC_GPION_CLK_ENABLE();\n  __HAL_RCC_GPIOO_CLK_ENABLE();\n  __HAL_RCC_GPIOP_CLK_ENABLE();\n\n  log_swo_init();\n  trace_etm_init();\n\n  for (uint8_t i = 0; i < TU_ARRAY_SIZE(board_pindef); i++) {\n    HAL_GPIO_Init(board_pindef[i].port, &board_pindef[i].pin_init);\n  }\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  #ifdef USB_OTG_FS_PERIPH_BASE\n  NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n  #endif\n\n  NVIC_SetPriority(OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n\n\n#ifdef UART_DEV\n  UART_CLK_EN();\n  HAL_UART_Init(&UartHandle);\n#endif\n\n  //------------- USB FS -------------//\n#if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 0)\n  // OTG_FS is marked as RHPort0 by TinyUSB to be consistent across stm32 port\n\n  HAL_PWREx_EnableUSBVoltageDetector();\n  HAL_PWREx_EnableUSBReg();\n\n  __HAL_RCC_USB_OTG_FS_CLK_ENABLE();\n\n  // PM14 VUSB, PM10 ID, PM11 DM, PM12 DP\n  // Configure DM DP Pins\n  GPIO_InitTypeDef GPIO_InitStruct;\n  GPIO_InitStruct.Pin = GPIO_PIN_11 | GPIO_PIN_12;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOM, &GPIO_InitStruct);\n\n  // This for ID line debug\n  GPIO_InitStruct.Pin = GPIO_PIN_10;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOM, &GPIO_InitStruct);\n\n#if OTG_FS_VBUS_SENSE\n  // Configure VBUS Pin\n  GPIO_InitStruct.Pin = GPIO_PIN_14;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOM, &GPIO_InitStruct);\n#endif // vbus sense\n\n#if CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = OTG_FS_VBUS_SENSE;\n  tud_configure(0, TUD_CFGID_DWC2, &cfg);\n#endif\n\n#endif\n\n  //------------- USB HS -------------//\n#if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 1)\n\n  // Enable USB HS & ULPI Clocks\n  __HAL_RCC_USB_OTG_HS_CLK_ENABLE();\n  __HAL_RCC_USBPHYC_CLK_ENABLE();\n\n  // Enable USB power\n  HAL_PWREx_EnableUSBVoltageDetector();\n  HAL_PWREx_EnableUSBHSregulator();\n\n#if OTG_HS_VBUS_SENSE\n  // Configure VBUS Pin\n  GPIO_InitTypeDef GPIO_InitStruct2;\n  GPIO_InitStruct2.Pin = GPIO_PIN_8;\n  GPIO_InitStruct2.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct2.Pull = GPIO_NOPULL;\n  GPIO_InitStruct2.Alternate = GPIO_AF10_OTG_HS;\n  HAL_GPIO_Init(GPIOM, &GPIO_InitStruct2);\n#endif\n\n#if CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = OTG_HS_VBUS_SENSE;\n  tud_configure(1, TUD_CFGID_DWC2, &cfg);\n#endif\n\n#endif\n\n  board_init2();\n\n  // Turn off device vbus\n#if CFG_TUD_ENABLED\n  board_vbus_set(BOARD_TUD_RHPORT, false);\n#endif\n  // Turn on host vbus\n#if CFG_TUH_ENABLED\n  board_vbus_set(BOARD_TUH_RHPORT, true);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n#ifdef PINID_LED\n  board_pindef_t* pindef = &board_pindef[PINID_LED];\n  GPIO_PinState pin_state = state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET;\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, pin_state);\n#else\n  (void) state;\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef PINID_BUTTON\n  board_pindef_t* pindef = &board_pindef[PINID_BUTTON];\n  return pindef->active_state == HAL_GPIO_ReadPin(pindef->port, pindef->pin_init.Pin);\n#else\n  return 0;\n#endif\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t * )(uintptr_t)\n  buf, len, 0xffff);\n  return len;\n#else\n  (void) buf; (void) len;\n  return -1;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY h7rs)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(ST_TCPP0203 ${TOP}/hw/mcu/st/stm32-tcpp0203)\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m7 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32H7RS CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 1)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif ()\n\nif (NOT DEFINED RHPORT_SPEED)\n  set(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)\nendif ()\n\ncmake_print_variables(RHPORT_DEVICE RHPORT_DEVICE_SPEED RHPORT_HOST RHPORT_HOST_SPEED)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nif(NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/${MCU_VARIANT}_flash.ld)\nendif()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif(NOT DEFINED LD_FILE_IAR)\n  set(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\nendif()\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_i2c.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    SEGGER_RTT_SECTION=\\\"noncacheable_buffer\\\"\n    BUFFER_SIZE_UP=0x300\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32H7RS ${RTOS})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/family.mk",
    "content": "ST_FAMILY = h7rs\nST_PREFIX = stm32${ST_FAMILY}xx\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/${ST_PREFIX}_hal_driver\nST_TCPP0203 = hw/mcu/st/stm32-tcpp0203\n\nUF2_FAMILY_ID = 0x6db66083\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m7\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nRHPORT_SPEED ?= OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED\nRHPORT_DEVICE ?= 1\nRHPORT_HOST ?= 1\n\n# Determine RHPORT_DEVICE_SPEED if not defined\nifndef RHPORT_DEVICE_SPEED\nifeq ($(RHPORT_DEVICE), 0)\n  RHPORT_DEVICE_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_DEVICE_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# Determine RHPORT_HOST_SPEED if not defined\nifndef RHPORT_HOST_SPEED\nifeq ($(RHPORT_HOST), 0)\n  RHPORT_HOST_SPEED = $(firstword $(RHPORT_SPEED))\nelse\n  RHPORT_HOST_SPEED = $(lastword $(RHPORT_SPEED))\nendif\nendif\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32H7RS \\\n\t-DBOARD_TUD_RHPORT=${RHPORT_DEVICE} \\\n\t-DBOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED} \\\n\t-DBOARD_TUH_RHPORT=${RHPORT_HOST} \\\n\t-DBOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED} \\\n\t-DSEGGER_RTT_SECTION=\"\\\"noncacheable_buffer\\\"\" \\\n\t-DBUFFER_SIZE_UP=0x300 \\\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += \\\n  -Wno-error=cast-align \\\n  -Wno-error=unused-parameter \\\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_${ST_PREFIX}.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_dma.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_gpio.c \\\n    $(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_i2c.c \\\n    $(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_uart_ex.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT).s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_GCC ?= $(FAMILY_PATH)/linker/$(MCU_VARIANT)_flash.ld\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/linker/stm32h7s3xx_flash.ld",
    "content": "/*\n******************************************************************************\n**\n** @file        : LinkerScript.ld\n**\n** @author      : Auto-generated by STM32CubeIDE\n**\n** @brief       : Linker script for STM32H7S3xx Device from STM32H7RS series\n**                      64Kbytes FLASH\n**                      456Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n******************************************************************************\n** @attention\n**\n** Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n__FLASH_BEGIN  = 0x08000000;\n__FLASH_SIZE   = 0x00010000;\n\n__RAM_BEGIN    = 0x24000000;\n__RAM_SIZE     = 0x4FC00;\n__RAM_NONCACHEABLEBUFFER_SIZE = 0x400;\n\n/* Memories definition */\nMEMORY\n{\n  RAM       (xrw) : ORIGIN = __RAM_BEGIN,    LENGTH = __RAM_SIZE\n  RAM_NONCACHEABLEBUFFER (xrw) : ORIGIN = __RAM_BEGIN + __RAM_SIZE,  LENGTH = __RAM_NONCACHEABLEBUFFER_SIZE\n\n  ITCM      (xrw) : ORIGIN = 0x00000000,    LENGTH = 0x00010000\n  DTCM       (rw) : ORIGIN = 0x20000000,    LENGTH = 0x00010000\n  SRAMAHB   (rw)  : ORIGIN = 0x30000000,  LENGTH = 0x00008000\n  BKPSRAM   (rw)  : ORIGIN = 0x38800000,  LENGTH = 0x00001000\n\n  FLASH     (xrw) : ORIGIN = __FLASH_BEGIN, LENGTH = __FLASH_SIZE\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(DTCM) + LENGTH(DTCM); /* end of \"DTCM\" Ram type memory */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab :\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM :\n   {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array   :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array  :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array  :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  RW_NONCACHEABLE :\n  {\n    __NONCACHEABLEBUFFER_BEGIN = .;/* create symbol for start of section */\n    KEEP(*(noncacheable_buffer))\n    __NONCACHEABLEBUFFER_END = .;  /* create symbol for end of section */\n  } > RAM_NONCACHEABLEBUFFER\n\n  /* User_heap_stack section, used to check that there is enough \"DTCM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >DTCM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32h7rs/stm32h7rsxx_hal_conf.h",
    "content": "/* USER CODE BEGIN Header */\n/**\n  ******************************************************************************\n  * @file    stm32h7rsxx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration template file.\n  *          This file should be copied to the application folder and renamed\n  *          to stm32h7rsxx_hal_conf.h.\n  *\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2022 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n/* USER CODE END Header */\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32H7RSxx_HAL_CONF_H\n#define STM32H7RSxx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED   */\n/* #define HAL_CEC_MODULE_ENABLED   */\n/* #define HAL_CORDIC_MODULE_ENABLED   */\n/* #define HAL_CRC_MODULE_ENABLED   */\n/* #define HAL_CRYP_MODULE_ENABLED   */\n/* #define HAL_DCMIPP_MODULE_ENABLED   */\n/* #define HAL_DMA2D_MODULE_ENABLED   */\n/* #define HAL_DTS_MODULE_ENABLED   */\n/* #define HAL_ETH_MODULE_ENABLED   */\n/* #define HAL_FDCAN_MODULE_ENABLED   */\n/* #define HAL_GFXMMU_MODULE_ENABLED   */\n/* #define HAL_GFXTIM_MODULE_ENABLED   */\n/* #define HAL_GPU2D_MODULE_ENABLED   */\n/* #define HAL_HASH_MODULE_ENABLED   */\n/* #define HAL_HCD_MODULE_ENABLED   */\n#define HAL_I2C_MODULE_ENABLED\n/* #define HAL_I2S_MODULE_ENABLED   */\n/* #define HAL_I3C_MODULE_ENABLED   */\n/* #define HAL_ICACHE_MODULE_ENABLED   */\n/* #define HAL_IRDA_MODULE_ENABLED   */\n/* #define HAL_IWDG_MODULE_ENABLED   */\n/* #define HAL_JPEG_MODULE_ENABLED   */\n/* #define HAL_LPTIM_MODULE_ENABLED   */\n/* #define HAL_LTDC_MODULE_ENABLED   */\n/* #define HAL_MCE_MODULE_ENABLED   */\n/* #define HAL_MDF_MODULE_ENABLED   */\n/* #define HAL_MMC_MODULE_ENABLED   */\n/* #define HAL_NAND_MODULE_ENABLED   */\n/* #define HAL_NOR_MODULE_ENABLED   */\n/* #define HAL_PCD_MODULE_ENABLED   */\n/* #define HAL_PKA_MODULE_ENABLED   */\n/* #define HAL_PSSI_MODULE_ENABLED   */\n/* #define HAL_RAMECC_MODULE_ENABLED   */\n/* #define HAL_RCC_MODULE_ENABLED   */\n/* #define HAL_RNG_MODULE_ENABLED   */\n/* #define HAL_RTC_MODULE_ENABLED   */\n/* #define HAL_SAI_MODULE_ENABLED   */\n/* #define HAL_SD_MODULE_ENABLED   */\n/* #define HAL_SDRAM_MODULE_ENABLED   */\n/* #define HAL_SMARTCARD_MODULE_ENABLED   */\n/* #define HAL_SMBUS_MODULE_ENABLED   */\n/* #define HAL_SPDIFRX_MODULE_ENABLED   */\n/* #define HAL_SPI_MODULE_ENABLED   */\n/* #define HAL_SRAM_MODULE_ENABLED   */\n/* #define HAL_TIM_MODULE_ENABLED   */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED   */\n/* #define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_XSPI_MODULE_ENABLED\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n#define HSE_VALUE    24000000UL /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n#define HSE_STARTUP_TIMEOUT    100UL   /*!< Time out for HSE start up (in ms) */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n#define HSI_VALUE          64000000UL /*!< Value of the Internal oscillator in Hz */\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low-power oscillator (CSI) default value.\n  *        This value is the default CSI range value after Reset.\n  */\n#if !defined  (CSI_VALUE)\n#define CSI_VALUE          4000000UL  /*!< Value of the Internal oscillator in Hz */\n#endif /* CSI_VALUE */\n\n/**\n * @brief Internal High Speed oscillator (HSI48) value for USB OTG FS and RNG.\n *        This internal oscillator is mainly dedicated to provide a high precision clock to\n *        the USB peripheral by means of a special Clock Recovery System (CRS) circuitry.\n *        When the CRS is not used, the HSI48 RC oscillator runs on it default frequency\n *        which is subject to manufacturing process variations.\n  */\n  #if !defined  (HSI48_VALUE)\n  #define HSI48_VALUE        48000000UL /*!< Value of the Internal High Speed oscillator for USB OTG FS/RNG in Hz.\n                                            The real value my vary depending on manufacturing process variations. */\n  #endif /* HSI48_VALUE */\n\n/**\n* @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n#define LSI_VALUE  32000UL              /*!< LSI Typical Value in Hz.\n                                            Value of the Internal Low Speed oscillator in Hz.\n                                              The real value may vary depending on the variations\n                                              in voltage and temperature.*/\n#endif /* LSI_VALUE */\n\n/**\n* @brief External Low Speed oscillator (LSE) value.\n*/\n#if !defined  (LSE_VALUE)\n#define LSE_VALUE    32768UL /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n#define LSE_STARTUP_TIMEOUT    5000UL   /*!< Time out for LSE start up (in ms) */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for digital audio interfaces: SPI/I2S, SAI and ADF\n  *        This value is used by the RCC HAL module to provide the digital audio interfaces\n  *        frequency. This clock source is inserted directly through I2S_CKIN pad.\n  */\n#if !defined  (EXTERNAL_CLOCK_VALUE)\n#define EXTERNAL_CLOCK_VALUE      48000UL /*!< Value of the external clock source in Hz */\n#endif /* EXTERNAL_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    3300UL /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            (15UL)/*!< tick interrupt priority (lowest by default) */\n#define  USE_RTOS                     0U\n\n/* ########################## Assert Selection ############################## */\n/**\n* @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n*        HAL drivers code\n*/\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## Register callback feature configuration ############### */\n/**\n* @brief Set below the peripheral configuration  to \"1U\" to add the support\n*        of HAL callback registration/unregistration feature for the HAL\n*        driver(s). This allows user application to provide specific callback\n*        functions thanks to HAL_PPP_RegisterCallback() rather than overwriting\n*        the default weak callback functions (see each stm32h7rsxx_hal_ppp.h file\n*        for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef\n*        for each PPP peripheral).\n*/\n#define USE_HAL_ADC_REGISTER_CALLBACKS        0U\n#define USE_HAL_CEC_REGISTER_CALLBACKS        0U\n#define USE_HAL_CORDIC_REGISTER_CALLBACKS     0U\n#define USE_HAL_CRYP_REGISTER_CALLBACKS       0U\n#define USE_HAL_DCMIPP_REGISTER_CALLBACKS     0U\n#define USE_HAL_FDCAN_REGISTER_CALLBACKS      0U\n#define USE_HAL_GFXMMU_REGISTER_CALLBACKS     0U\n#define USE_HAL_HASH_REGISTER_CALLBACKS       0U\n#define USE_HAL_I2C_REGISTER_CALLBACKS        0U\n#define USE_HAL_I2S_REGISTER_CALLBACKS        0U\n#define USE_HAL_IRDA_REGISTER_CALLBACKS       0U\n#define USE_HAL_JPEG_REGISTER_CALLBACKS       0U\n#define USE_HAL_LPTIM_REGISTER_CALLBACKS      0U\n#define USE_HAL_MDF_REGISTER_CALLBACKS        0U\n#define USE_HAL_MMC_REGISTER_CALLBACKS        0U\n#define USE_HAL_NAND_REGISTER_CALLBACKS       0U\n#define USE_HAL_NOR_REGISTER_CALLBACKS        0U\n#define USE_HAL_PCD_REGISTER_CALLBACKS        0U\n#define USE_HAL_PKA_REGISTER_CALLBACKS        0U\n#define USE_HAL_PSSI_REGISTER_CALLBACKS       0U\n#define USE_HAL_RNG_REGISTER_CALLBACKS        0U\n#define USE_HAL_RTC_REGISTER_CALLBACKS        0U\n#define USE_HAL_SAI_REGISTER_CALLBACKS        0U\n#define USE_HAL_SD_REGISTER_CALLBACKS         0U\n#define USE_HAL_SDRAM_REGISTER_CALLBACKS      0U\n#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS  0U\n#define USE_HAL_SMBUS_REGISTER_CALLBACKS      0U\n#define USE_HAL_SPDIFRX_REGISTER_CALLBACKS    0U\n#define USE_HAL_SPI_REGISTER_CALLBACKS        0U\n#define USE_HAL_SRAM_REGISTER_CALLBACKS       0U\n#define USE_HAL_TIM_REGISTER_CALLBACKS        0U\n#define USE_HAL_UART_REGISTER_CALLBACKS       0U\n#define USE_HAL_USART_REGISTER_CALLBACKS      0U\n#define USE_HAL_WWDG_REGISTER_CALLBACKS       0U\n#define USE_HAL_XSPI_REGISTER_CALLBACKS       0U\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n* Activated: CRC code is present inside driver\n* Deactivated: CRC code cleaned from driver\n*/\n\n#define USE_SPI_CRC                   1U\n\n/* ################## CRYP peripheral configuration ########################## */\n\n#define USE_HAL_CRYP_SUSPEND_RESUME   0U\n\n/* ################## HASH peripheral configuration ########################## */\n\n#define USE_HAL_HASH_SUSPEND_RESUME   0U\n\n/* ################## SDMMC peripheral configuration ######################### */\n\n#define USE_SD_TRANSCEIVER            0U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CEC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_cec.h\"\n#endif /* HAL_CEC_MODULE_ENABLED */\n\n#ifdef HAL_CORDIC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_cordic.h\"\n#endif /* HAL_CORDIC_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DCMIPP_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_dcmipp.h\"\n#endif /* HAL_DCMIPP_MODULE_ENABLED */\n\n#ifdef HAL_DMA2D_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_dma2d.h\"\n#endif /* HAL_DMA2D_MODULE_ENABLED */\n\n#ifdef HAL_DTS_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_dts.h\"\n#endif /* HAL_DTS_MODULE_ENABLED */\n\n#ifdef HAL_ETH_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_eth.h\"\n#endif /* HAL_ETH_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FDCAN_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_fdcan.h\"\n#endif /* HAL_FDCAN_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_GFXMMU_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_gfxmmu.h\"\n#endif /* HAL_GFXMMU_MODULE_ENABLED */\n\n#ifdef HAL_GFXTIM_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_gfxtim.h\"\n#endif /* HAL_GFXTIM_MODULE_ENABLED */\n\n#ifdef HAL_GPU2D_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_gpu2d.h\"\n#endif /* HAL_GPU2D_MODULE_ENABLED */\n\n#ifdef HAL_HASH_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_hash.h\"\n#endif /* HAL_HASH_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32h7rsxx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_I3C_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_i3c.h\"\n#endif /* HAL_I3C_MODULE_ENABLED */\n\n#ifdef HAL_ICACHE_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_icache.h\"\n#endif /* HAL_ICACHE_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_JPEG_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_jpeg.h\"\n#endif /* HAL_JPEG_MODULE_ENABLED */\n\n#ifdef HAL_LTDC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_ltdc.h\"\n#endif /* HAL_LTDC_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_MCE_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_mce.h\"\n#endif /* HAL_MCE_MODULE_ENABLED */\n\n#ifdef HAL_MDF_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_mdf.h\"\n#endif /* HAL_MDF_MODULE_ENABLED */\n\n#ifdef HAL_MMC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_mmc.h\"\n#endif /* HAL_MMC_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PKA_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_pka.h\"\n#endif /* HAL_PKA_MODULE_ENABLED */\n\n#ifdef HAL_PSSI_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_pssi.h\"\n#endif /* HAL_PSSI_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RAMECC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_ramecc.h\"\n#endif /* HAL_RAMECC_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SDRAM_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_sdram.h\"\n#endif /* HAL_SDRAM_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPDIFRX_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_spdifrx.h\"\n#endif /* HAL_SPDIFRX_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_XSPI_MODULE_ENABLED\n  #include \"stm32h7rsxx_hal_xspi.h\"\n#endif /* HAL_XSPI_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t *file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32H7RSxx_HAL_CONF_H */\n"
  },
  {
    "path": "hw/bsp/stm32l0/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32l0xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32l0/boards/stm32l052dap52/STM32L052K8Ux_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32L052K8Ux Device with\n**                64KByte FLASH, 8KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20002000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 8K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32l0/boards/stm32l052dap52/board.cmake",
    "content": "set(MCU_VARIANT stm32l052xx)\nset(JLINK_DEVICE stm32l052k8)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32L052K8Ux_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32L052xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l0/boards/stm32l052dap52/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 L052 DAP\n   url: n/a\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_4\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PIN_6\n#define BUTTON_STATE_ACTIVE   0\n\n// UART\n#define UART_DEV              USART2\n#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF4_USART2\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_stm32l0_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct = {0};\n  RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};\n\n  /* Enable HSI Oscillator to be used as System clock source\n     Enable HSI48 Oscillator to be used as USB clock source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select HSI48 as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select HSI as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clock dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);\n\n  /*Configure the clock recovery system (CRS)**********************************/\n\n  /*Enable CRS Clock*/\n  __HAL_RCC_CRS_CLK_ENABLE();\n\n  /* Default Synchro Signal division factor (not divided) */\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n  /* Set the SYNCSRC[1:0] bits according to CRS_Source value */\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n  /* HSI48 is synchronized with USB SOF at 1KHz rate */\n  RCC_CRSInitStruct.ReloadValue =  __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000, 1000);\n  RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;\n  /* Set the TRIM[5:0] to the default value*/\n  RCC_CRSInitStruct.HSI48CalibrationValue = 0x20;\n  /* Start automatic synchronization */\n  HAL_RCCEx_CRSConfig (&RCC_CRSInitStruct);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32l0/boards/stm32l052dap52/board.mk",
    "content": "MCU_VARIANT = stm32l052xx\nCFLAGS += \\\n\t-DSTM32L052xx\n\nLD_FILE = $(BOARD_PATH)/STM32L052K8Ux_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32l052k8\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32l0/boards/stm32l0538disco/STM32L053C8Tx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32L053C8Tx Device with\n**                64KByte FLASH, 8KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20002000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x200; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 64K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 8K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32l0/boards/stm32l0538disco/board.cmake",
    "content": "set(MCU_VARIANT stm32l053xx)\nset(JLINK_DEVICE stm32l053r8)\n#set(JLINK_OPTION \"-USB 778921770\")\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32L053C8Tx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32L053xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l0/boards/stm32l0538disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 L0538 Discovery\n   url: https://www.st.com/en/evaluation-tools/32l0538discovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE   1\n\n// UART\n//#define UART_DEV              USART2\n//#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n//#define UART_GPIO_PORT        GPIOA\n//#define UART_GPIO_AF          GPIO_AF4_USART2\n//#define UART_TX_PIN           GPIO_PIN_2\n//#define UART_RX_PIN           GPIO_PIN_3\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_stm32l0_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef  PeriphClkInitStruct = {0};\n  RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};\n\n  /* Enable HSI Oscillator to be used as System clock source\n     Enable HSI48 Oscillator to be used as USB clock source */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Select HSI48 as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select HSI as system clock source and configure the HCLK, PCLK1 and PCLK2\n     clock dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);\n\n  /*Configure the clock recovery system (CRS)**********************************/\n\n  /*Enable CRS Clock*/\n  __HAL_RCC_CRS_CLK_ENABLE();\n\n  /* Default Synchro Signal division factor (not divided) */\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n  /* Set the SYNCSRC[1:0] bits according to CRS_Source value */\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n  /* HSI48 is synchronized with USB SOF at 1KHz rate */\n  RCC_CRSInitStruct.ReloadValue =  __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000, 1000);\n  RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;\n  /* Set the TRIM[5:0] to the default value*/\n  RCC_CRSInitStruct.HSI48CalibrationValue = 0x20;\n  /* Start automatic synchronization */\n  HAL_RCCEx_CRSConfig (&RCC_CRSInitStruct);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32l0/boards/stm32l0538disco/board.mk",
    "content": "MCU_VARIANT = stm32l053xx\nCFLAGS += \\\n  -DSTM32L053xx\n\n# All source paths should be relative to the top level.\nLD_FILE = $(BOARD_PATH)/STM32L053C8Tx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = STM32L053R8\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32l0/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32l0xx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#ifdef UART_DEV\nUART_HandleTypeDef UartHandle;\n#endif\n\nvoid board_init(void) {\n  board_stm32l0_clock_init();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n\n  // LED\n  GPIO_InitTypeDef GPIO_InitStruct;\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  board_led_write(false);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_PULLDOWN;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n#ifdef UART_DEV\n  // Enable UART Clock\n  UART_CLK_EN();\n\n  GPIO_InitStruct.Pin       = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull      = GPIO_PULLUP;\n  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UartHandle.Instance        = UART_DEV;\n  UartHandle.Init.BaudRate   = CFG_BOARD_UART_BAUDRATE;\n  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;\n  UartHandle.Init.StopBits   = UART_STOPBITS_1;\n  UartHandle.Init.Parity     = UART_PARITY_NONE;\n  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;\n  UartHandle.Init.Mode       = UART_MODE_TX_RX;\n  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;\n  HAL_UART_Init(&UartHandle);\n#endif\n\n  // USB Pins\n  // Configure USB DM and DP pins. This is optional, and maintained only for user guidance.\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  // USB Clock enable\n  __HAL_RCC_USB_CLK_ENABLE();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState)(state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t*)(uintptr_t) buf, len, 0xffff);\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n#ifdef  USE_FULL_ASSERT\nvoid assert_failed(uint8_t* file, uint32_t line) {\n  (void) file; (void) line;\n}\n#endif /* USE_FULL_ASSERT */\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32l0/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY l0)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32L0 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  #target_compile_options(${BOARD_TARGET} PUBLIC)\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    CFG_EXAMPLE_MSC_READONLY\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32L0)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l0/family.mk",
    "content": "ST_FAMILY = l0\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\n\nCFLAGS += \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32L0\n\n# mcu driver cause following warnings\nCFLAGS_GCC += \\\n  -flto \\\n\t-Wno-error=unused-parameter \\\n\t-Wno-error=redundant-decls \\\n\t-Wno-error=cast-align \\\n\t-Wno-error=maybe-uninitialized \\\n\nCFLAGS_CLANG += \\\n  -Wno-error=parentheses-equality\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n  src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n  src/portable/st/stm32_fsdev/fsdev_common.c \\\n  $(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n  $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n  $(TOP)/$(ST_CMSIS)/Include \\\n  $(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_${MCU_VARIANT}.s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_${MCU_VARIANT}.s\n\n# Linker\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32l0/stm32l0xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32l0xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  *\n  * Copyright (c) 2016 STMicroelectronics International N.V. 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  * 1. Redistribution of source code must retain the above copyright notice,\n  *    this list of conditions and the following disclaimer.\n  * 2. 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  * 3. Neither the name of STMicroelectronics nor the names of other\n  *    contributors to this software may be used to endorse or promote products\n  *    derived from this software without specific written permission.\n  * 4. This software, including modifications and/or derivative works of this\n  *    software, must execute solely and exclusively on microcontroller or\n  *    microprocessor devices manufactured by or for STMicroelectronics.\n  * 5. Redistribution and use of this software other than as permitted under\n  *    this license is void and will automatically terminate your rights under\n  *    this license.\n  *\n  * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS \"AS IS\"\n  * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT\n  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n  * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY\n  * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT\n  * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\n  * OR 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 SOFTWARE,\n  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32L0xx_HAL_CONF_H\n#define __STM32L0xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n// #define HAL_ADC_MODULE_ENABLED\n/* #define HAL_COMP_MODULE_ENABLED */\n/* #define HAL_CRC_MODULE_ENABLED */\n/* #define HAL_CRYP_MODULE_ENABLED */\n/* #define HAL_DAC_MODULE_ENABLED */\n#define HAL_DMA_MODULE_ENABLED\n/* #define HAL_FIREWALL_MODULE_ENABLED */\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_GPIO_MODULE_ENABLED\n/* #define HAL_I2C_MODULE_ENABLED */\n/* #define HAL_I2S_MODULE_ENABLED */\n/* #define HAL_IWDG_MODULE_ENABLED */\n/* #define HAL_LCD_MODULE_ENABLED */\n/* #define HAL_LPTIM_MODULE_ENABLED */\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n//#define HAL_RNG_MODULE_ENABLED\n/* #define HAL_RTC_MODULE_ENABLED */\n//#define HAL_SPI_MODULE_ENABLED\n/* #define HAL_TIM_MODULE_ENABLED */\n/* #define HAL_TSC_MODULE_ENABLED */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED */\n/* #define HAL_IRDA_MODULE_ENABLED */\n/* #define HAL_SMARTCARD_MODULE_ENABLED */\n/* #define HAL_SMBUS_MODULE_ENABLED */\n/* #define HAL_WWDG_MODULE_ENABLED */\n//#define HAL_PCD_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n/* #define HAL_PCD_MODULE_ENABLED */\n\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE    ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    ((uint32_t)100U)   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal Multiple Speed oscillator (MSI) default value.\n  *        This value is the default MSI range value after Reset.\n  */\n#if !defined  (MSI_VALUE)\n  #define MSI_VALUE    ((uint32_t)2097152U) /*!< Value of the Internal oscillator in Hz*/\n#endif /* MSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE    ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator for USB (HSI48) value.\n  */\n#if !defined  (HSI48_VALUE)\n#define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB in Hz.\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.  */\n#endif /* HSI48_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n #define LSI_VALUE  ((uint32_t)37000U)       /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.*/\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n  #define LSE_VALUE    ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n/**\n  * @brief Time out for LSE start up value in ms.\n  */\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    ((uint32_t)5000U)   /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    ((uint32_t)3300U) /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            (((uint32_t)1U<<__NVIC_PRIO_BITS) - 1U)    /*!< tick interrupt priority */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U\n#define  PREREAD_ENABLE               0U\n#define  BUFFER_CACHE_DISABLE         0U\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n\n/* ################## Register callback feature configuration ############### */\n/**\n  * @brief Set below the peripheral configuration  to \"1U\" to add the support\n  *        of HAL callback registration/deregistration feature for the HAL\n  *        driver(s). This allows user application to provide specific callback\n  *        functions thanks to HAL_PPP_RegisterCallback() rather than overwriting\n  *        the default weak callback functions (see each stm32l0xx_hal_ppp.h file\n  *        for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef\n  *        for each PPP peripheral).\n  */\n#define USE_HAL_ADC_REGISTER_CALLBACKS        0U\n#define USE_HAL_COMP_REGISTER_CALLBACKS       0U\n#define USE_HAL_DAC_REGISTER_CALLBACKS        0U\n#define USE_HAL_I2C_REGISTER_CALLBACKS        0U\n#define USE_HAL_I2S_REGISTER_CALLBACKS        0U\n#define USE_HAL_IRDA_REGISTER_CALLBACKS       0U\n#define USE_HAL_LPTIM_REGISTER_CALLBACKS      0U\n#define USE_HAL_PCD_REGISTER_CALLBACKS        0U\n#define USE_HAL_RNG_REGISTER_CALLBACKS        0U\n#define USE_HAL_RTC_REGISTER_CALLBACKS        0U\n#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS  0U\n#define USE_HAL_SMBUS_REGISTER_CALLBACKS      0U\n#define USE_HAL_SPI_REGISTER_CALLBACKS        0U\n#define USE_HAL_TIM_REGISTER_CALLBACKS        0U\n#define USE_HAL_TSC_REGISTER_CALLBACKS        0U\n#define USE_HAL_UART_REGISTER_CALLBACKS       0U\n#define USE_HAL_USART_REGISTER_CALLBACKS      0U\n#define USE_HAL_WWDG_REGISTER_CALLBACKS       0U\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n * Activated: CRC code is present inside driver\n * Deactivated: CRC code cleaned from driver\n */\n\n#define USE_SPI_CRC                   1U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32l0xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32l0xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32l0xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32l0xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32l0xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n  #include \"stm32l0xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32l0xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32l0xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n  #include \"stm32l0xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_FIREWALL_MODULE_ENABLED\n  #include \"stm32l0xx_hal_firewall.h\"\n#endif /* HAL_FIREWALL_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32l0xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32l0xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32l0xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32l0xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LCD_MODULE_ENABLED\n #include \"stm32l0xx_hal_lcd.h\"\n#endif /* HAL_LCD_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32l0xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32l0xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n #include \"stm32l0xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32l0xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32l0xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32l0xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_TSC_MODULE_ENABLED\n #include \"stm32l0xx_hal_tsc.h\"\n#endif /* HAL_TSC_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32l0xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32l0xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32l0xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32l0xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32l0xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32l0xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32l0xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t *file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32L0xx_HAL_CONF_H */\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32l4/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32l4xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l412nucleo/STM32L412KBUx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32L412KBTx Device with\n**                128KByte FLASH, 40KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20008000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 128K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 32K\nSRAM2 (xrw)      : ORIGIN = 0x10000000, LENGTH = 8K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(8);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(8);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(8);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(8);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(8);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(8);\n  } >FLASH\n\n  .ARM.extab   :\n  {\n  . = ALIGN(8);\n  *(.ARM.extab* .gnu.linkonce.armextab.*)\n  . = ALIGN(8);\n  } >FLASH\n  .ARM : {\n\t. = ALIGN(8);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n\t. = ALIGN(8);\n  } >FLASH\n\n  .preinit_array     :\n  {\n\t. = ALIGN(8);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n\t. = ALIGN(8);\n  } >FLASH\n\n  .init_array :\n  {\n\t. = ALIGN(8);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n\t. = ALIGN(8);\n  } >FLASH\n  .fini_array :\n  {\n\t. = ALIGN(8);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n\t. = ALIGN(8);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(8);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(8);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l412nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32l412xx)\nset(JLINK_DEVICE stm32l412kb)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32L412KBUx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32L412xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l412nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 L412 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-l412kb.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_3\n#define LED_STATE_ON          1\n\n// Not a real button\n#define BUTTON_PORT           GPIOB\n#define BUTTON_PIN            GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE   1\n\n#define UART_DEV              LPUART1\n#define UART_CLK_EN           __HAL_RCC_LPUART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF8_LPUART1\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\n/**\n  * @brief  System Clock Configuration\n  *         The system Clock is configured as follow :\n  *            System Clock source            = PLL (MSI)\n  *            SYSCLK(Hz)                     = 80000000\n  *            HCLK(Hz)                       = 80000000\n  *            AHB Prescaler                  = 1\n  *            APB1 Prescaler                 = 1\n  *            APB2 Prescaler                 = 1\n  *            MSI Frequency(Hz)              = 8000000\n  *            PLL_M                          = 1\n  *            PLL_N                          = 10\n  *            PLL_Q                          = 2\n  *            PLL_R                          = 2\n  *            VDD(V)                         = 3.3\n  * @param  None\n  * @retval None\n  */\n\nstatic inline void board_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n\n  /** Configure the main internal regulator output voltage\n  */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLM = 1;\n  RCC_OscInitStruct.PLL.PLLN = 10;\n  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;\n  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;\n\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  /** Enable the SYSCFG APB clock\n  */\n  __HAL_RCC_CRS_CLK_ENABLE();\n\n  /** Configures CRS\n  */\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n  RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;\n  RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000,1000);\n  RCC_CRSInitStruct.ErrorLimitValue = 34;\n  RCC_CRSInitStruct.HSI48CalibrationValue = 32;\n\n  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n\n  /* Select HSI48 output as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL output as UART clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;\n  PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l412nucleo/board.mk",
    "content": "CFLAGS += \\\n  -DSTM32L412xx \\\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32l412xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32L412KBUx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32l412xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32l412xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32l412kb\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l476disco/STM32L476VGTx_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32L476VGTx Device with\n**                1024KByte FLASH, 96KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20018000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x500;      /* required amount of heap  */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 1024K\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 96K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(8);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(8);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(8);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(8);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(8);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(8);\n  } >FLASH\n\n  .ARM.extab   :\n  {\n  . = ALIGN(8);\n  *(.ARM.extab* .gnu.linkonce.armextab.*)\n  . = ALIGN(8);\n  } >FLASH\n  .ARM : {\n\t. = ALIGN(8);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n\t. = ALIGN(8);\n  } >FLASH\n\n  .preinit_array     :\n  {\n\t. = ALIGN(8);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n\t. = ALIGN(8);\n  } >FLASH\n\n  .init_array :\n  {\n\t. = ALIGN(8);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n\t. = ALIGN(8);\n  } >FLASH\n  .fini_array :\n  {\n\t. = ALIGN(8);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n\t. = ALIGN(8);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(8);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(8);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l476disco/board.cmake",
    "content": "set(MCU_VARIANT stm32l476xx)\nset(JLINK_DEVICE stm32l476vg)\n# set(JLINK_OPTION \"-USB 000777632258\")\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32L476VGTx_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32L476xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l476disco/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 L476 Disco\n   url: https://www.st.com/en/evaluation-tools/32l476gdiscovery.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_2\n#define LED_STATE_ON          1\n\n#define BUTTON_PORT           GPIOA\n#define BUTTON_PIN            GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE   1\n\n#define UART_DEV              USART2\n#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOD\n#define UART_GPIO_AF          GPIO_AF7_USART2\n#define UART_TX_PIN           GPIO_PIN_5\n#define UART_RX_PIN           GPIO_PIN_6\n\n#define VBUS_SENSE_EN         0\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\n/**\n  * @brief  System Clock Configuration\n  *         The system Clock is configured as follow :\n  *\n  *         If define USB_USE_LSE_MSI_CLOCK enabled:\n  *            System Clock source            = PLL (MSI)\n  *            SYSCLK(Hz)                     = 80000000\n  *            HCLK(Hz)                       = 80000000\n  *            AHB Prescaler                  = 1\n  *            APB1 Prescaler                 = 1\n  *            APB2 Prescaler                 = 2\n  *            MSI Frequency(Hz)              = 4800000\n  *            LSE Frequency(Hz)              = 32768\n  *            PLL_M                          = 6\n  *            PLL_N                          = 40\n  *            PLL_P                          = 7\n  *            PLL_Q                          = 4\n  *            PLL_R                          = 4\n  *            Flash Latency(WS)              = 4\n  * @param  None\n  * @retval None\n  */\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;\n\n  /* Enable the LSE Oscillator */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;\n  RCC_OscInitStruct.LSEState = RCC_LSE_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Enable the CSS interrupt in case LSE signal is corrupted or not present */\n  HAL_RCCEx_DisableLSECSS();\n\n  /* Set tick interrupt priority, default HAL value is intentionally invalid\n     and that prevents PLL initialization in HAL_RCC_OscConfig() */\n  HAL_InitTick((1UL << __NVIC_PRIO_BITS) - 1UL);\n\n  /* Enable MSI Oscillator and activate PLL with MSI as source */\n  RCC_OscInitStruct.OscillatorType      = RCC_OSCILLATORTYPE_MSI;\n  RCC_OscInitStruct.MSIState            = RCC_MSI_ON;\n  RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.MSIClockRange       = RCC_MSIRANGE_11;\n  RCC_OscInitStruct.PLL.PLLState        = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource       = RCC_PLLSOURCE_MSI;\n  RCC_OscInitStruct.PLL.PLLM            = 6;\n  RCC_OscInitStruct.PLL.PLLN            = 40;\n  RCC_OscInitStruct.PLL.PLLP            = 7;\n  RCC_OscInitStruct.PLL.PLLQ            = 4;\n  RCC_OscInitStruct.PLL.PLLR            = 4;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Enable MSI Auto-calibration through LSE */\n  HAL_RCCEx_EnableMSIPLLMode();\n\n  /* Select MSI output as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n  clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l476disco/board.mk",
    "content": "CFLAGS += \\\n  -DSTM32L476xx \\\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32l476xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32L476VGTx_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32l476xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32l476xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32l476vg\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l496nucleo/STM32L496ZGTX_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n** @file        : LinkerScript.ld\n**\n** @author      : Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for NUCLEO-L496ZG Board embedding STM32L496ZGTx Device from stm32l4 series\n**                      1024Kbytes ROM\n**                      256Kbytes RAM\n**                      64Kbytes SRAM2\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n******************************************************************************\n** @attention\n**\n** Copyright (c) 2022 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 256K\n  SRAM2    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 64K\n  ROM    (rx)    : ORIGIN = 0x08000000,   LENGTH = 1024K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"ROM\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >ROM\n\n  /* The program code and other data into \"ROM\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >ROM\n\n  /* Constant data into \"ROM\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >ROM\n\n  .ARM.extab :\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >ROM\n\n  .ARM :\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >ROM\n\n  .preinit_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> ROM\n\n  _sisram2 = LOADADDR(.sram2);\n\n  /* SRAM2 section\n  *\n  * IMPORTANT NOTE!\n  * If initialized variables will be placed in this section,\n  * the startup code needs to be modified to copy the init-values.\n  */\n  .sram2 :\n  {\n    . = ALIGN(4);\n    _ssram2 = .;       /* create a global symbol at sram2 start */\n    *(.sram2)\n    *(.sram2*)\n\n    . = ALIGN(4);\n    _esram2 = .;       /* create a global symbol at sram2 end */\n  } >SRAM2 AT> ROM\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l496nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32l496xx)\nset(JLINK_DEVICE stm32l496zg)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32L496ZGTX_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32L496xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l496nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 L496 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-l496ZG-P.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_7\n#define LED_STATE_ON          1\n\n// Not a real button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   1\n\n#define UART_DEV              LPUART1\n#define UART_CLK_EN           __HAL_RCC_LPUART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOG\n#define UART_GPIO_AF          GPIO_AF8_LPUART1\n#define UART_TX_PIN           GPIO_PIN_7\n#define UART_RX_PIN           GPIO_PIN_8\n\n#define VBUS_SENSE_EN         1\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\n/**\n  * @brief  System Clock Configuration\n  *         The system Clock is configured as follow :\n  *            System Clock source            = PLL (MSI)\n  *            SYSCLK(Hz)                     = 80000000\n  *            HCLK(Hz)                       = 80000000\n  *            AHB Prescaler                  = 1\n  *            APB1 Prescaler                 = 1\n  *            APB2 Prescaler                 = 1\n  *            MSI Frequency(Hz)              = 8000000\n  *            PLL_M                          = 1\n  *            PLL_N                          = 10\n  *            PLL_Q                          = 2\n  *            PLL_R                          = 2\n  *            VDD(V)                         = 3.3\n  * @param  None\n  * @retval None\n  */\n\nstatic inline void board_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n\n  /** Configure the main internal regulator output voltage\n  */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Configure LSE Drive Capability\n  */\n  HAL_PWR_EnableBkUpAccess();\n  __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLM = 1;\n  RCC_OscInitStruct.PLL.PLLN = 10;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;\n  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;\n\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  // /** Enable the SYSCFG APB clock\n  // */\n  // __HAL_RCC_CRS_CLK_ENABLE();\n  //\n  // /** Configures CRS\n  // */\n  // RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};\n  // RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n  // RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n  // RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;\n  // RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000,1000);\n  // RCC_CRSInitStruct.ErrorLimitValue = 34;\n  // RCC_CRSInitStruct.HSI48CalibrationValue = 32;\n  //\n  // HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n\n  /* Select HSI48 output as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL output as UART clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;\n  PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l496nucleo/board.mk",
    "content": "CFLAGS += \\\n  -DSTM32L496xx \\\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32l496xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32L496ZGTX_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32l496xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32l496xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32l496zg\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l4p5nucleo/STM32L4P5ZGTX_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author\t\t: Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32L4P5ZGTx Device from STM32L4PLUS series\n**                      1024Kbytes ROM\n**                      320Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; COPYRIGHT(c) 2019 STMicroelectronics</center></h2>\n**\n** Redistribution and use in source and binary forms, with or without modification,\n** are permitted provided that the following conditions are met:\n**   1. Redistributions of source code must retain the above copyright notice,\n**      this list of conditions and the following disclaimer.\n**   2. 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**   3. Neither the name of STMicroelectronics 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 \"AS IS\"\n** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n** FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n** DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n** SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n** CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM\t(xrw)\t: ORIGIN = 0x20000000,\tLENGTH = 320K\n  ROM\t(rx)\t: ORIGIN = 0x08000000,\tLENGTH = 1024K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + 0x0001FFFF;\t/* end of \"SRAM1\" Ram type memory */\n\n_Min_Heap_Size = 0x200;\t/* required amount of heap  */\n_Min_Stack_Size = 0x400;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"ROM\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >ROM\n\n  /* The program code and other data into \"ROM\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >ROM\n\n  /* Constant data into \"ROM\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >ROM\n\n  .ARM.extab   : {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >ROM\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >ROM\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> ROM\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l4p5nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32l4p5xx)\nset(JLINK_DEVICE stm32l4p5zg)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32L4P5ZGTX_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32L4P5xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l4p5nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 L4P5 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-l4p5zg.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_14\n#define LED_STATE_ON          1\n\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   1\n\n#define UART_DEV              LPUART1\n#define UART_CLK_EN           __HAL_RCC_LPUART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOG\n#define UART_GPIO_AF          GPIO_AF8_LPUART1\n#define UART_TX_PIN           GPIO_PIN_7\n#define UART_RX_PIN           GPIO_PIN_8\n\n#define VBUS_SENSE_EN         1\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\n/**\n  * @brief  System Clock Configuration\n  *         The system Clock is configured as follow :\n  *            System Clock source            = PLL (MSI)\n  *            SYSCLK(Hz)                     = 120000000\n  *            HCLK(Hz)                       = 120000000\n  *            AHB Prescaler                  = 1\n  *            APB1 Prescaler                 = 1\n  *            APB2 Prescaler                 = 1\n  *            MSI Frequency(Hz)              = 48000000\n  *            PLL_M                          = 12\n  *            PLL_N                          = 60\n  *            PLL_P                          = 2\n  *            PLL_Q                          = 2\n  *            VDD(V)                         = 3.3\n  *            Main regulator output voltage  = Scale1 mode\n  *            Flash Latency(WS)              = 5\n  *         The USB clock configuration from PLLSAI:\n  *            PLLSAIP                        = 8 FIXME\n  *            PLLSAIN                        = 384 FIXME\n  *            PLLSAIQ                        = 7 FIXME\n  * @param  None\n  * @retval None\n  */\n\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n\n  /* Activate PLL with MSI , stabilizied via PLL by LSE */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_MSI;\n  RCC_OscInitStruct.MSIState = RCC_MSI_ON;\n  RCC_OscInitStruct.LSEState = RCC_LSE_ON;\n  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;\n  RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;\n  RCC_OscInitStruct.PLL.PLLM = 12;\n  RCC_OscInitStruct.PLL.PLLN = 60;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Enable MSI Auto-calibration through LSE */\n  HAL_RCCEx_EnableMSIPLLMode();\n\n  /* Select MSI output as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select MSI output as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;\n  PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n  clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  // Avoid overshoot and start with HCLK 60 MHz\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);\n\n  /* AHB prescaler divider at 1 as second step */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l4p5nucleo/board.mk",
    "content": "CFLAGS += \\\n  -DSTM32L4P5xx \\\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32l4p5xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32L4P5ZGTX_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32l4p5xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32l4p5xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32l4p5zg\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l4r5nucleo/STM32L4RXxI_FLASH.ld",
    "content": "/*\n*****************************************************************************\n**\n\n**  File        : LinkerScript.ld\n**\n**  Abstract    : Linker script for STM32L4RxI Device with\n**                2048KByte FLASH, 640KByte RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n**  (c)Copyright Ac6.\n**  You may use this file as-is or modify it according to the needs of your\n**  project. Distribution of this file (unmodified or modified) is not\n**  permitted. Ac6 permit registered System Workbench for MCU users the\n**  rights to distribute the assembled, compiled & linked contents of this\n**  file as part of an application binary file, provided that it is built\n**  using the System Workbench for MCU toolchain.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x200a0000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0x200;      /* required amount of heap  */\n_Min_Stack_Size = 0x460; /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nRAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 640K\nFLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 2048K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array     :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l4r5nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32l4r5xx)\nset(JLINK_DEVICE stm32l4r5zi)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32L4RXxI_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32L4R5xx\n    HSE_VALUE=8000000\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l4r5nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 L4R5 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-l4r5zi.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_14\n#define LED_STATE_ON          1\n\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   1\n\n#define UART_DEV              LPUART1\n#define UART_CLK_EN           __HAL_RCC_LPUART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOG\n#define UART_GPIO_AF          GPIO_AF8_LPUART1\n#define UART_TX_PIN           GPIO_PIN_7\n#define UART_RX_PIN           GPIO_PIN_8\n\n#define VBUS_SENSE_EN         1\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\n/**\n  * @brief  System Clock Configuration\n  *         The system Clock is configured as follow :\n  *            System Clock source            = PLL (MSI)\n  *            SYSCLK(Hz)                     = 120000000\n  *            HCLK(Hz)                       = 120000000\n  *            AHB Prescaler                  = 1\n  *            APB1 Prescaler                 = 1\n  *            APB2 Prescaler                 = 1\n  *            MSI Frequency(Hz)              = 48000000\n  *            PLL_M                          = 12\n  *            PLL_N                          = 60\n  *            PLL_P                          = 2\n  *            PLL_Q                          = 2\n  *            VDD(V)                         = 3.3\n  *            Main regulator output voltage  = Scale1 mode\n  *            Flash Latency(WS)              = 5\n  *         The USB clock configuration from PLLSAI:\n  *            PLLSAIP                        = 8 FIXME\n  *            PLLSAIN                        = 384 FIXME\n  *            PLLSAIQ                        = 7 FIXME\n  * @param  None\n  * @retval None\n  */\n\nstatic inline void board_clock_init(void)\n{\n  RCC_ClkInitTypeDef RCC_ClkInitStruct;\n  RCC_OscInitTypeDef RCC_OscInitStruct;\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n\n  /* Activate PLL with MSI , stabilizied via PLL by LSE */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE | RCC_OSCILLATORTYPE_MSI;\n  RCC_OscInitStruct.MSIState = RCC_MSI_ON;\n  RCC_OscInitStruct.LSEState = RCC_LSE_ON;\n  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;\n  RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;\n  RCC_OscInitStruct.PLL.PLLM = 12;\n  RCC_OscInitStruct.PLL.PLLN = 60;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /* Enable MSI Auto-calibration through LSE */\n  HAL_RCCEx_EnableMSIPLLMode();\n\n  /* Select MSI output as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_MSI;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select MSI output as USB clock source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LPUART1;\n  PeriphClkInitStruct.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);\n\n  /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2\n  clocks dividers */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  // Avoid overshoot and start with HCLK 60 MHz\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);\n\n  /* AHB prescaler divider at 1 as second step */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32l4/boards/stm32l4r5nucleo/board.mk",
    "content": "CFLAGS += \\\n  -DHSE_VALUE=8000000 \\\n  -DSTM32L4R5xx \\\n\n# GCC\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_stm32l4r5xx.s\nLD_FILE_GCC = $(BOARD_PATH)/STM32L4RXxI_FLASH.ld\n\n# IAR\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_stm32l4r5xx.s\nLD_FILE_IAR = $(ST_CMSIS)/Source/Templates/iar/linker/stm32l4r5xx_flash.icf\n\n# For flash-jlink target\nJLINK_DEVICE = stm32l4r5zi\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32l4/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 William D. Jones (thor0505@comcast.net),\n * Ha Thach (tinyusb.org)\n * Uwe Bonnes (bon@elektron.ikp.physik.tu-darmstadt.de)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32l4xx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n#if defined(USB_OTG_FS)\nvoid OTG_FS_IRQHandler(void)\n#else\nvoid USB_IRQHandler(void)\n#endif\n{\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\nUART_HandleTypeDef UartHandle;\n\nvoid board_init(void) {\n  board_clock_init();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n#if defined(GPIOD)\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n#endif\n#if defined(GPIOE)\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n#endif\n#if defined(GPIOF)\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n#endif\n#if defined(GPIOG)\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n#endif\n  __HAL_RCC_GPIOH_CLK_ENABLE();\n  UART_CLK_EN();\n\n#if CFG_TUSB_OS  == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n#if defined(USB_OTG_FS)\n  NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#else\n  NVIC_SetPriority(USB_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n#endif\n\n  /* Enable USB power on Pwrctrl CR2 register */\n  /* Enable Power Clock*/\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n#if defined(PWR_CR5_R1MODE)\n  /* Enable voltage range 1 boost mode for frequency above 80 Mhz */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);\n#endif\n\n  /* Enable USB power on Pwrctrl CR2 register */\n  HAL_PWREx_EnableVddUSB();\n\n  GPIO_InitTypeDef  GPIO_InitStruct;\n\n  // LED\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n  // IOSV bit MUST be set to access GPIO port G[2:15] */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n#if defined(PWR_CR2_IOSV)\n  HAL_PWREx_EnableVddIO2();\n#endif\n\n  // Uart\n  GPIO_InitStruct.Pin       = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull      = GPIO_PULLUP;\n  GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UartHandle.Instance        = UART_DEV;\n  UartHandle.Init.BaudRate   = CFG_BOARD_UART_BAUDRATE;\n  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;\n  UartHandle.Init.StopBits   = UART_STOPBITS_1;\n  UartHandle.Init.Parity     = UART_PARITY_NONE;\n  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;\n  UartHandle.Init.Mode       = UART_MODE_TX_RX;\n  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;\n  UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;\n  //UartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1;\n  UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;\n\n  HAL_UART_Init(&UartHandle);\n\n  /* Configure USB FS GPIOs */\n  /* Configure DM DP Pins */\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;\n#if defined(USB_OTG_FS)\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n#else\n  GPIO_InitStruct.Alternate = GPIO_AF10_USB_FS;\n#endif\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n#if defined(USB_OTG_FS)\n  /* Configure VBUS Pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_9;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Configure ID pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_10;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n#endif\n\n#if defined(USB_OTG_FS)\n  /* Enable USB FS Clocks */\n  __HAL_RCC_USB_OTG_FS_CLK_ENABLE();\n\n  #if CFG_TUD_ENABLED\n  /* Set Vbus sense */\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = VBUS_SENSE_EN;\n  tud_configure(0, TUD_CFGID_DWC2, &cfg);\n  #endif\n#else\n  __HAL_RCC_USB_CLK_ENABLE();\n#endif\n\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState) (state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  HAL_UART_Transmit(&UartHandle, (uint8_t *) (uintptr_t) buf, len, 0xffff);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/stm32l4/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY l4)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32L4 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${FAMILY_MCUS})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32l4/family.mk",
    "content": "ST_FAMILY = l4\n\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32L4\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n  -Wno-error=cast-align \\\n\nifeq ($(TOOLCHAIN),gcc)\nCFLAGS_GCC += -Wno-error=maybe-uninitialized\nendif\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_dma.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart_ex.c\n\nINC += \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc \\\n\t$(TOP)/$(BOARD_PATH)\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32l4/stm32l4xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32l4xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration template file.\n  *          This file should be copied to the application folder and renamed\n  *          to stm32l4xx_hal_conf.h.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2017 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32L4xx_HAL_CONF_H\n#define __STM32L4xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED */\n/* #define HAL_CAN_MODULE_ENABLED */\n/* #define HAL_CAN_LEGACY_MODULE_ENABLED */\n/* #define HAL_COMP_MODULE_ENABLED */\n#define HAL_CORTEX_MODULE_ENABLED\n/* #define HAL_CRC_MODULE_ENABLED */\n/* #define HAL_CRYP_MODULE_ENABLED */\n/* #define HAL_DAC_MODULE_ENABLED */\n/* #define HAL_DFSDM_MODULE_ENABLED */\n#define HAL_DMA_MODULE_ENABLED\n/* #define HAL_FIREWALL_MODULE_ENABLED */\n#define HAL_FLASH_MODULE_ENABLED\n/* #define HAL_NAND_MODULE_ENABLED */\n// #define HAL_NOR_MODULE_ENABLED\n// #define HAL_SRAM_MODULE_ENABLED\n/* #define HAL_HCD_MODULE_ENABLED */\n#define HAL_GPIO_MODULE_ENABLED\n//#define HAL_I2C_MODULE_ENABLED\n/* #define HAL_IRDA_MODULE_ENABLED */\n/* #define HAL_IWDG_MODULE_ENABLED */\n//#define HAL_LCD_MODULE_ENABLED\n/* #define HAL_LPTIM_MODULE_ENABLED */\n/* #define HAL_OPAMP_MODULE_ENABLED */\n//#define HAL_PCD_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n/* #define HAL_QSPI_MODULE_ENABLED */\n#define HAL_RCC_MODULE_ENABLED\n/* #define HAL_RNG_MODULE_ENABLED */\n/* #define HAL_RTC_MODULE_ENABLED */\n//#define HAL_SAI_MODULE_ENABLED\n//#define HAL_SD_MODULE_ENABLED\n/* #define HAL_SMARTCARD_MODULE_ENABLED */\n/* #define HAL_SMBUS_MODULE_ENABLED */\n/* #define HAL_SPI_MODULE_ENABLED */\n/* #define HAL_SWPMI_MODULE_ENABLED */\n/* #define HAL_TIM_MODULE_ENABLED */\n/* #define HAL_TSC_MODULE_ENABLED */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED */\n/* #define HAL_WWDG_MODULE_ENABLED */\n\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE    8000000U /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    100U   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal Multiple Speed oscillator (MSI) default value.\n  *        This value is the default MSI range value after Reset.\n  */\n#if !defined  (MSI_VALUE)\n  #define MSI_VALUE    4000000U /*!< Value of the Internal oscillator in Hz*/\n#endif /* MSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE    16000000U /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG.\n  *        This internal oscillator is mainly dedicated to provide a high precision clock to\n  *        the USB peripheral by means of a special Clock Recovery System (CRS) circuitry.\n  *        When the CRS is not used, the HSI48 RC oscillator runs on it default frequency\n  *        which is subject to manufacturing process variations.\n  */\n#if !defined  (HSI48_VALUE)\n #define HSI48_VALUE   48000000U             /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz.\n                                              The real value my vary depending on manufacturing process variations.*/\n#endif /* HSI48_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n #define LSI_VALUE  32000U                 /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                     /*!< Value of the Internal Low Speed oscillator in Hz\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.*/\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n  #define LSE_VALUE    32768U /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    5000U  /*!< Time out for LSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for SAI1 peripheral\n  *        This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source\n  *        frequency.\n  */\n#if !defined  (EXTERNAL_SAI1_CLOCK_VALUE)\n  #define EXTERNAL_SAI1_CLOCK_VALUE    48000U /*!< Value of the SAI1 External clock source in Hz*/\n#endif /* EXTERNAL_SAI1_CLOCK_VALUE */\n\n/**\n  * @brief External clock source for SAI2 peripheral\n  *        This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source\n  *        frequency.\n  */\n#if !defined  (EXTERNAL_SAI2_CLOCK_VALUE)\n  #define EXTERNAL_SAI2_CLOCK_VALUE    48000U /*!< Value of the SAI2 External clock source in Hz*/\n#endif /* EXTERNAL_SAI2_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    3300U /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            0U /*!< tick interrupt priority */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              0U\n#define  INSTRUCTION_CACHE_ENABLE     1U\n#define  DATA_CACHE_ENABLE            1U\n\n\n#define  USE_HAL_ADC_REGISTER_CALLBACKS     0U /* ADC register callback disabled     */\n#define  USE_HAL_CEC_REGISTER_CALLBACKS     0U /* CEC register callback disabled     */\n#define  USE_HAL_COMP_REGISTER_CALLBACKS    0U /* COMP register callback disabled    */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS    0U /* CRYP register callback disabled    */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS     0U /* DAC register callback disabled     */\n#define  USE_HAL_DCMI_REGISTER_CALLBACKS    0U /* DCMI register callback disabled    */\n#define  USE_HAL_DFSDM_REGISTER_CALLBACKS   0U /* DFSDM register callback disabled   */\n#define  USE_HAL_DMA2D_REGISTER_CALLBACKS   0U /* DMA2D register callback disabled   */\n#define  USE_HAL_DSI_REGISTER_CALLBACKS     0U /* DSI register callback disabled     */\n#define  USE_HAL_ETH_REGISTER_CALLBACKS     0U /* ETH register callback disabled     */\n#define  USE_HAL_FDCAN_REGISTER_CALLBACKS   0U /* FDCAN register callback disabled   */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS    0U /* NAND register callback disabled    */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS     0U /* NOR register callback disabled     */\n#define  USE_HAL_SDRAM_REGISTER_CALLBACKS   0U /* SDRAM register callback disabled   */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS    0U /* SRAM register callback disabled    */\n#define  USE_HAL_HASH_REGISTER_CALLBACKS    0U /* HASH register callback disabled    */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS     0U /* HCD register callback disabled     */\n#define  USE_HAL_HRTIM_REGISTER_CALLBACKS   0U /* HRTIM register callback disabled   */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS     0U /* I2C register callback disabled     */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS     0U /* I2S register callback disabled     */\n#define  USE_HAL_JPEG_REGISTER_CALLBACKS    0U /* JPEG register callback disabled    */\n#define  USE_HAL_LPTIM_REGISTER_CALLBACKS   0U /* LPTIM register callback disabled   */\n#define  USE_HAL_LTDC_REGISTER_CALLBACKS    0U /* LTDC register callback disabled    */\n#define  USE_HAL_MDIOS_REGISTER_CALLBACKS   0U /* MDIO register callback disabled    */\n#define  USE_HAL_OPAMP_REGISTER_CALLBACKS   0U /* MDIO register callback disabled    */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS     0U /* PCD register callback disabled     */\n#define  USE_HAL_QSPI_REGISTER_CALLBACKS    0U /* QSPI register callback disabled    */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS     0U /* RNG register callback disabled     */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS     0U /* RTC register callback disabled     */\n#define  USE_HAL_SAI_REGISTER_CALLBACKS     0U /* SAI register callback disabled     */\n#define  USE_HAL_SPDIFRX_REGISTER_CALLBACKS 0U /* SPDIFRX register callback disabled */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS   0U /* SMBUS register callback disabled   */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS     0U /* SPI register callback disabled     */\n#define  USE_HAL_SWPMI_REGISTER_CALLBACKS   0U /* SWPMI register callback disabled   */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS     0U /* TIM register callback disabled     */\n#define  USE_HAL_UART_REGISTER_CALLBACKS    0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS   0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS    0U /* WWDG register callback disabled    */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT               1U */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n * Activated: CRC code is present inside driver\n * Deactivated: CRC code cleaned from driver\n */\n\n#define USE_SPI_CRC                   1U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32l4xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32l4xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32l4xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_DFSDM_MODULE_ENABLED\n  #include \"stm32l4xx_hal_dfsdm.h\"\n#endif /* HAL_DFSDM_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32l4xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32l4xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_CAN_MODULE_ENABLED\n  #include \"stm32l4xx_hal_can.h\"\n#endif /* HAL_CAN_MODULE_ENABLED */\n\n#ifdef HAL_CAN_LEGACY_MODULE_ENABLED\n  #include \"Legacy/stm32l4xx_hal_can_legacy.h\"\n#endif /* HAL_CAN_LEGACY_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n  #include \"stm32l4xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32l4xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32l4xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n  #include \"stm32l4xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_FIREWALL_MODULE_ENABLED\n  #include \"stm32l4xx_hal_firewall.h\"\n#endif /* HAL_FIREWALL_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32l4xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32l4xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32l4xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n  #include \"stm32l4xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32l4xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32l4xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LCD_MODULE_ENABLED\n #include \"stm32l4xx_hal_lcd.h\"\n#endif /* HAL_LCD_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32l4xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_OPAMP_MODULE_ENABLED\n#include \"stm32l4xx_hal_opamp.h\"\n#endif /* HAL_OPAMP_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32l4xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_QSPI_MODULE_ENABLED\n #include \"stm32l4xx_hal_qspi.h\"\n#endif /* HAL_QSPI_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n #include \"stm32l4xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32l4xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n #include \"stm32l4xx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n #include \"stm32l4xx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32l4xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32l4xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_SWPMI_MODULE_ENABLED\n #include \"stm32l4xx_hal_swpmi.h\"\n#endif /* HAL_SWPMI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32l4xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_TSC_MODULE_ENABLED\n #include \"stm32l4xx_hal_tsc.h\"\n#endif /* HAL_TSC_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32l4xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32l4xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32l4xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32l4xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32l4xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32l4xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n #include \"stm32l4xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t *file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32L4xx_HAL_CONF_H */\n\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32n6/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32n6xx.h\"\n#endif\n\n/* Cortex M55 port configuration. */\n#define configENABLE_MVE                        0\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*8*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32n6/boards/stm32n6570dk/STM32N657XX_AXISRAM2_fsbl.ld",
    "content": "/*\n******************************************************************************\n**\n** @file        : STM32N657XX_AXISRAM2_fsbl.ld\n**\n** @author      : GPM Application Team\n**\n** @brief       : Linker script for STM32N657XX Device from STM32N6 series\n**                      512 KBytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n******************************************************************************\n** @attention\n**\n** Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n_sstack = _estack - _Min_Stack_Size;\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x800; /* required amount of stack */\n\n/* Memories definition */\nMEMORY\n{\n  ROM    (xrw)    : ORIGIN = 0x34180400,   LENGTH = 255K\n  RAM    (xrw)    : ORIGIN = 0x341C0000,   LENGTH = 256K\n}\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"RAM\" Ram type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >ROM\n\n  /* The program code and other data into \"RAM\" Ram type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >ROM\n\n  /* Constant data into \"RAM\" Ram type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >ROM\n\n  .ARM.extab   (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n   {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >ROM\n\n  .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n   {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >ROM\n\n  .preinit_array     (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> ROM\n\n  .noncacheable :\n  {\n    . = ALIGN(8);\n    __snoncacheable = .;/* create symbol for start of section */\n    KEEP(*(.noncacheable))\n    . = ALIGN(8);\n    __enoncacheable = .;  /* create symbol for end of section */\n  } > RAM\n\n\n  .gnu.sgstubs :\n  {\n    . = ALIGN(4);\n    *(.gnu.sgstubs*)   /* Secure Gateway stubs */\n    . = ALIGN(4);\n  } >ROM\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32n6/boards/stm32n6570dk/board.cmake",
    "content": "set(MCU_VARIANT stm32n657xx)\nset(JLINK_DEVICE stm32n657x0)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32N657XX_AXISRAM2_fsbl.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32N657xx\n    )\n  target_sources(${TARGET} PUBLIC\n    ${ST_TCPP0203}/tcpp0203.c\n    ${ST_TCPP0203}/tcpp0203_reg.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${ST_TCPP0203}\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32n6/boards/stm32n6570dk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 N6570-DK\n   url: https://www.st.com/en/evaluation-tools/stm32n6570-dk.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"stm32n657xx.h\"\n#include \"stm32n6xx_ll_exti.h\"\n#include \"stm32n6xx_ll_system.h\"\n#include \"tcpp0203.h\"\n\n#define UART_DEV USART1\n#define UART_CLK_EN __HAL_RCC_USART1_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE 0\n#define OTG_HS_VBUS_SENSE 0\n\n#define PINID_LED 0\n#define PINID_BUTTON 1\n#define PINID_UART_TX 2\n#define PINID_UART_RX 3\n#define PINID_TCPP0203_EN 4\n#define PINID_PWR_USB2 8\n\nstatic board_pindef_t board_pindef[] = {\n    {// LED\n     .port = GPIOG,\n     .pin_init = {.Pin = GPIO_PIN_10, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n     .active_state = 1},\n    {// Button\n     .port = GPIOC,\n     .pin_init = {.Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n     .active_state = 1},\n    {// UART TX\n     .port = GPIOE,\n     .pin_init = {.Pin = GPIO_PIN_5, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = GPIO_AF7_USART1},\n     .active_state = 0},\n    {// UART RX\n     .port = GPIOE,\n     .pin_init = {.Pin = GPIO_PIN_6, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = GPIO_AF7_USART1},\n     .active_state = 0},\n    {// VBUS input pin used for TCPP0203 EN\n     .port = GPIOA,\n     .pin_init = {.Pin = GPIO_PIN_4, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n     .active_state = 0},\n    { // I2C SCL for TCPP0203\n      .port = GPIOD,\n      .pin_init = {.Pin = GPIO_PIN_14, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = GPIO_AF4_I2C2},\n    },\n    {// I2C SDA for TCPP0203\n      .port = GPIOD,\n      .pin_init = {.Pin = GPIO_PIN_4, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = GPIO_AF4_I2C2},\n    },\n    {// INT for TCPP0203\n      .port = GPIOD,\n      .pin_init = {.Pin = GPIO_PIN_10, .Mode = GPIO_MODE_IT_FALLING, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n    },\n    {// PWR for USB2\n      .port = GPIOB,\n      .pin_init = {.Pin = GPIO_PIN_9, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n    }\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  /* Configure the power domain */\n  if (HAL_PWREx_ConfigSupply(PWR_EXTERNAL_SOURCE_SUPPLY) != HAL_OK) {\n    Error_Handler();\n  }\n\n  /* Get current CPU/System buses clocks configuration */\n  /* and if necessary switch to intermediate HSI clock */\n  /* to ensure target clock can be set                 */\n  HAL_RCC_GetClockConfig(&RCC_ClkInitStruct);\n  if ((RCC_ClkInitStruct.CPUCLKSource == RCC_CPUCLKSOURCE_IC1) ||\n      (RCC_ClkInitStruct.SYSCLKSource == RCC_SYSCLKSOURCE_IC2_IC6_IC11)) {\n    RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_CPUCLK | RCC_CLOCKTYPE_SYSCLK);\n    RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_HSI;\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK) {\n      Error_Handler();\n    }\n  }\n\n  /* HSE selected as source (stable clock on Level 0 samples */\n  /* PLL1 output = ((HSE/PLLM)*PLLN)/PLLP1/PLLP2             */\n  /*             = ((48000000/3)*75)/1/1                     */\n  /*             = (16000000*75)/1/1                         */\n  /*             = 1200000000 (1200 MHz)                     */\n  /* PLL2 off                                                */\n  /* PLL3 off                                                */\n  /* PLL4 off                                                */\n\n  /* Enable HSE && HSI */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSIState = RCC_HSI_OFF;\n  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON; /* 48 MHz */\n\n  RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL1.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL1.PLLM = 3;\n  RCC_OscInitStruct.PLL1.PLLN = 75; /* PLL1 VCO = 48/3 * 75 = 1200MHz */\n  RCC_OscInitStruct.PLL1.PLLP1 = 1; /* PLL output = PLL VCO frequency / (PLLP1 * PLLP2) */\n  RCC_OscInitStruct.PLL1.PLLP2 = 1; /* PLL output = 1200 MHz */\n  RCC_OscInitStruct.PLL1.PLLFractional = 0;\n\n  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n    /* Initialization error */\n    Error_Handler();\n  }\n\n  /* Select PLL1 outputs as CPU and System bus clock source */\n  /* CPUCLK = ic1_ck = PLL1 output/ic1_divider = 600 MHz */\n  /* SYSCLK = ic2_ck = PLL1 output/ic2_divider = 400 MHz */\n  /* Configure the HCLK clock divider */\n  /* HCLK =  PLL1 SYSCLK/HCLK divider = 200 MHz */\n  /* PCLKx = HCLK / PCLKx divider = 200 MHz */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_CPUCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |\n                                 RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK4 | RCC_CLOCKTYPE_PCLK5);\n  RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_IC1;\n  RCC_ClkInitStruct.IC1Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;\n  RCC_ClkInitStruct.IC1Selection.ClockDivider = 2;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_IC2_IC6_IC11;\n  RCC_ClkInitStruct.IC2Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;\n  RCC_ClkInitStruct.IC2Selection.ClockDivider = 3;\n  RCC_ClkInitStruct.IC6Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;\n  RCC_ClkInitStruct.IC6Selection.ClockDivider = 3;\n  RCC_ClkInitStruct.IC11Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;\n  RCC_ClkInitStruct.IC11Selection.ClockDivider = 3;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;\n  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;\n  RCC_ClkInitStruct.APB5CLKDivider = RCC_APB5_DIV1;\n  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK) {\n    /* Initialization Error */\n    Error_Handler();\n  }\n\n  /** Initializes the peripherals clock\n    */\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USBOTGHS1;\n  PeriphClkInitStruct.UsbOtgHs1ClockSelection = RCC_USBPHY1REFCLKSOURCE_HSE_DIRECT;\n\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {\n    /* Initialization Error */\n    Error_Handler();\n  }\n\n  /** Set USB OTG HS PHY1 Reference Clock Source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USBPHY1;\n  PeriphClkInitStruct.UsbPhy1ClockSelection = RCC_USBPHY1REFCLKSOURCE_HSE_DIRECT;\n\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {\n    /* Initialization Error */\n    Error_Handler();\n  }\n}\n\n//--------------------------------------------------------------------+\n// USB PD\n//--------------------------------------------------------------------+\nstatic I2C_HandleTypeDef i2c_handle = {\n    .Instance = I2C2,\n    .Init = {\n        .Timing = 0x20C0EDFF,\n        .OwnAddress1 = 0,\n        .AddressingMode = I2C_ADDRESSINGMODE_7BIT,\n        .DualAddressMode = I2C_DUALADDRESS_DISABLE,\n        .OwnAddress2 = 0,\n        .OwnAddress2Masks = I2C_OA2_NOMASK,\n        .GeneralCallMode = I2C_GENERALCALL_DISABLE,\n        .NoStretchMode = I2C_NOSTRETCH_DISABLE,\n    }};\nstatic TCPP0203_Object_t tcpp0203_obj = {0};\n\nstatic int32_t board_tcpp0203_init(void) {\n  board_pindef_t *pindef = &board_pindef[PINID_TCPP0203_EN];\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, GPIO_PIN_SET);\n\n  __HAL_RCC_I2C2_CLK_ENABLE();\n  __HAL_RCC_I2C2_FORCE_RESET();\n  __HAL_RCC_I2C2_RELEASE_RESET();\n  if (HAL_I2C_Init(&i2c_handle) != HAL_OK) {\n    return HAL_ERROR;\n  }\n\n  NVIC_SetPriority(EXTI10_IRQn, 12);\n  NVIC_EnableIRQ(EXTI10_IRQn);\n\n  return 0;\n}\n\nstatic int32_t board_tcpp0203_deinit(void) {\n  return 0;\n}\n\nstatic int32_t i2c_readreg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  TU_ASSERT(HAL_OK == HAL_I2C_Mem_Read(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000));\n  return 0;\n}\n\nstatic int32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  TU_ASSERT(HAL_OK == HAL_I2C_Mem_Write(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000));\n  return 0;\n}\n\nstatic inline void board_init2(void) {\n  TCPP0203_IO_t io_ctx;\n\n  io_ctx.Address = TCPP0203_I2C_ADDRESS_X68;\n  io_ctx.Init = board_tcpp0203_init;\n  io_ctx.DeInit = board_tcpp0203_deinit;\n  io_ctx.ReadReg = i2c_readreg;\n  io_ctx.WriteReg = i2c_writereg;\n\n  TU_ASSERT(TCPP0203_RegisterBusIO(&tcpp0203_obj, &io_ctx) == TCPP0203_OK, );\n\n  TU_ASSERT(TCPP0203_Init(&tcpp0203_obj) == TCPP0203_OK, );\n\n  TU_ASSERT(TCPP0203_SetPowerMode(&tcpp0203_obj, TCPP0203_POWER_MODE_NORMAL) == TCPP0203_OK, );\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    uint8_t switch_state = state ? TCPP0203_GD_PROVIDER_SWITCH_CLOSED : TCPP0203_GD_PROVIDER_SWITCH_OPEN;\n    TU_ASSERT(TCPP0203_SetGateDriverProvider(&tcpp0203_obj, switch_state) == TCPP0203_OK, );\n  } else if (rhport == 1) {\n    board_pindef_t *pindef = &board_pindef[PINID_PWR_USB2];\n    HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, state ? GPIO_PIN_SET : GPIO_PIN_RESET);\n  }\n}\n\nvoid EXTI10_IRQHandler(void) {\n  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_10);\n  if (tcpp0203_obj.IsInitialized) {\n    TU_ASSERT(TCPP0203_SetPowerMode(&tcpp0203_obj, TCPP0203_POWER_MODE_NORMAL) == TCPP0203_OK, );\n    TU_ASSERT(TCPP0203_SetGateDriverProvider(&tcpp0203_obj, TCPP0203_GD_PROVIDER_SWITCH_CLOSED) == TCPP0203_OK, );\n  }\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32n6/boards/stm32n6570dk/board.mk",
    "content": "MCU_VARIANT = stm32n657xx\nCFLAGS += -DSTM32N657xx\nJLINK_DEVICE = stm32n6xx\n\nLD_FILE_GCC = $(BOARD_PATH)/STM32N657XX_AXISRAM2_fsbl.ld\n\n# flash target using on-board stlink\nflash: flash-stlink\n\nPORT = 1\n\nSRC_C += \\\n\t$(ST_TCPP0203)/tcpp0203.c \\\n\t$(ST_TCPP0203)/tcpp0203_reg.c \\\n\nINC += \\\n\t$(TOP)/$(ST_TCPP0203) \\\n"
  },
  {
    "path": "hw/bsp/stm32n6/boards/stm32n657nucleo/STM32N657XX_AXISRAM2_fsbl.ld",
    "content": "/*\n******************************************************************************\n**\n** @file        : STM32N657XX_AXISRAM2_fsbl.ld\n**\n** @author      : GPM Application Team\n**\n** @brief       : Linker script for STM32N657XX Device from STM32N6 series\n**                      512 KBytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n******************************************************************************\n** @attention\n**\n** Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n_sstack = _estack - _Min_Stack_Size;\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x800; /* required amount of stack */\n\n/* Memories definition */\nMEMORY\n{\n  ROM    (xrw)    : ORIGIN = 0x34180400,   LENGTH = 255K\n  RAM    (xrw)    : ORIGIN = 0x341C0000,   LENGTH = 256K\n}\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"RAM\" Ram type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >ROM\n\n  /* The program code and other data into \"RAM\" Ram type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >ROM\n\n  /* Constant data into \"RAM\" Ram type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >ROM\n\n  .ARM.extab   (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n   {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >ROM\n\n  .ARM (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n   {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >ROM\n\n  .preinit_array     (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  .init_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  .fini_array (READONLY) : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >ROM\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> ROM\n\n  .noncacheable :\n  {\n    . = ALIGN(8);\n    __snoncacheable = .;/* create symbol for start of section */\n    KEEP(*(.noncacheable))\n    . = ALIGN(8);\n    __enoncacheable = .;  /* create symbol for end of section */\n  } > RAM\n\n\n  .gnu.sgstubs :\n  {\n    . = ALIGN(4);\n    *(.gnu.sgstubs*)   /* Secure Gateway stubs */\n    . = ALIGN(4);\n  } >ROM\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32n6/boards/stm32n657nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32n657xx)\nset(JLINK_DEVICE stm32n657x0)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32N657XX_AXISRAM2_fsbl.ld)\n\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 0)\nendif ()\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32N657xx\n    )\n  target_sources(${TARGET} PUBLIC\n    ${ST_TCPP0203}/tcpp0203.c\n    ${ST_TCPP0203}/tcpp0203_reg.c\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${ST_TCPP0203}\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32n6/boards/stm32n657nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 N657X0-Q Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-n657x0-q.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"stm32n657xx.h\"\n#include \"stm32n6xx_ll_exti.h\"\n#include \"stm32n6xx_ll_system.h\"\n#include \"tcpp0203.h\"\n\n#define UART_DEV USART1\n#define UART_CLK_EN __HAL_RCC_USART1_CLK_ENABLE\n\n// VBUS Sense detection\n#define OTG_FS_VBUS_SENSE 0\n#define OTG_HS_VBUS_SENSE 0\n\n#define PINID_LED 0\n#define PINID_BUTTON 1\n#define PINID_UART_TX 2\n#define PINID_UART_RX 3\n#define PINID_TCPP0203_EN 4\n\nstatic board_pindef_t board_pindef[] = {\n    {// LED\n     .port = GPIOG,\n     .pin_init = {.Pin = GPIO_PIN_10, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n     .active_state = 1},\n    {// Button\n     .port = GPIOC,\n     .pin_init = {.Pin = GPIO_PIN_13, .Mode = GPIO_MODE_INPUT, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n     .active_state = 1},\n    {// UART TX\n     .port = GPIOE,\n     .pin_init = {.Pin = GPIO_PIN_5, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = GPIO_AF7_USART1},\n     .active_state = 0},\n    {// UART RX\n     .port = GPIOE,\n     .pin_init = {.Pin = GPIO_PIN_6, .Mode = GPIO_MODE_AF_PP, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = GPIO_AF7_USART1},\n     .active_state = 0},\n    {// VBUS input pin used for TCPP0203 EN\n     .port = GPIOA,\n     .pin_init = {.Pin = GPIO_PIN_7, .Mode = GPIO_MODE_OUTPUT_PP, .Pull = GPIO_PULLDOWN, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n     .active_state = 0},\n    {// I2C SCL for TCPP0203\n      .port = GPIOB,\n      .pin_init = {.Pin = GPIO_PIN_10, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = GPIO_AF4_I2C2},\n    },\n    {// I2C SDA for TCPP0203\n      .port = GPIOB,\n      .pin_init = {.Pin = GPIO_PIN_11, .Mode = GPIO_MODE_AF_OD, .Pull = GPIO_NOPULL, .Speed = GPIO_SPEED_FREQ_LOW, .Alternate = GPIO_AF4_I2C2},\n    },\n    {// INT for TCPP0203\n      .port = GPIOD,\n      .pin_init = {.Pin = GPIO_PIN_2, .Mode = GPIO_MODE_IT_FALLING, .Pull = GPIO_PULLUP, .Speed = GPIO_SPEED_FREQ_HIGH, .Alternate = 0},\n    },\n};\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  /* Configure the power domain */\n  if (HAL_PWREx_ConfigSupply(PWR_EXTERNAL_SOURCE_SUPPLY) != HAL_OK) {\n    Error_Handler();\n  }\n\n  /* Get current CPU/System buses clocks configuration */\n  /* and if necessary switch to intermediate HSI clock */\n  /* to ensure target clock can be set                 */\n  HAL_RCC_GetClockConfig(&RCC_ClkInitStruct);\n  if ((RCC_ClkInitStruct.CPUCLKSource == RCC_CPUCLKSOURCE_IC1) ||\n      (RCC_ClkInitStruct.SYSCLKSource == RCC_SYSCLKSOURCE_IC2_IC6_IC11)) {\n    RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_CPUCLK | RCC_CLOCKTYPE_SYSCLK);\n    RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_HSI;\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;\n    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK) {\n      Error_Handler();\n    }\n  }\n\n  /* HSE selected as source (stable clock on Level 0 samples */\n  /* PLL1 output = ((HSE/PLLM)*PLLN)/PLLP1/PLLP2             */\n  /*             = ((48000000/3)*75)/1/1                     */\n  /*             = (16000000*75)/1/1                         */\n  /*             = 1200000000 (1200 MHz)                     */\n  /* PLL2 off                                                */\n  /* PLL3 off                                                */\n  /* PLL4 off                                                */\n\n  /* Enable HSE && HSI */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSIState = RCC_HSI_OFF;\n  RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON; /* 48 MHz */\n\n  RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL1.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL1.PLLM = 3;\n  RCC_OscInitStruct.PLL1.PLLN = 75; /* PLL1 VCO = 48/3 * 75 = 1200MHz */\n  RCC_OscInitStruct.PLL1.PLLP1 = 1; /* PLL output = PLL VCO frequency / (PLLP1 * PLLP2) */\n  RCC_OscInitStruct.PLL1.PLLP2 = 1; /* PLL output = 1200 MHz */\n  RCC_OscInitStruct.PLL1.PLLFractional = 0;\n\n  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n    /* Initialization error */\n    Error_Handler();\n  }\n\n  /* Select PLL1 outputs as CPU and System bus clock source */\n  /* CPUCLK = ic1_ck = PLL1 output/ic1_divider = 600 MHz */\n  /* SYSCLK = ic2_ck = PLL1 output/ic2_divider = 400 MHz */\n  /* Configure the HCLK clock divider */\n  /* HCLK =  PLL1 SYSCLK/HCLK divider = 200 MHz */\n  /* PCLKx = HCLK / PCLKx divider = 200 MHz */\n  RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_CPUCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK |\n                                 RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK4 | RCC_CLOCKTYPE_PCLK5);\n  RCC_ClkInitStruct.CPUCLKSource = RCC_CPUCLKSOURCE_IC1;\n  RCC_ClkInitStruct.IC1Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;\n  RCC_ClkInitStruct.IC1Selection.ClockDivider = 2;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_IC2_IC6_IC11;\n  RCC_ClkInitStruct.IC2Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;\n  RCC_ClkInitStruct.IC2Selection.ClockDivider = 3;\n  RCC_ClkInitStruct.IC6Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;\n  RCC_ClkInitStruct.IC6Selection.ClockDivider = 3;\n  RCC_ClkInitStruct.IC11Selection.ClockSelection = RCC_ICCLKSOURCE_PLL1;\n  RCC_ClkInitStruct.IC11Selection.ClockDivider = 3;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;\n  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;\n  RCC_ClkInitStruct.APB5CLKDivider = RCC_APB5_DIV1;\n  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct) != HAL_OK) {\n    /* Initialization Error */\n    Error_Handler();\n  }\n\n  /** Initializes the peripherals clock\n    */\n  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USBOTGHS1;\n  PeriphClkInitStruct.UsbOtgHs1ClockSelection = RCC_USBPHY1REFCLKSOURCE_HSE_DIRECT;\n\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {\n    /* Initialization Error */\n    Error_Handler();\n  }\n\n  /** Set USB OTG HS PHY1 Reference Clock Source */\n  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USBPHY1;\n  PeriphClkInitStruct.UsbPhy1ClockSelection = RCC_USBPHY1REFCLKSOURCE_HSE_DIRECT;\n\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) {\n    /* Initialization Error */\n    Error_Handler();\n  }\n}\n\n//--------------------------------------------------------------------+\n// USB PD\n//--------------------------------------------------------------------+\nstatic I2C_HandleTypeDef i2c_handle = {\n    .Instance = I2C2,\n    .Init = {\n        .Timing = 0x20C0EDFF,\n        .OwnAddress1 = 0,\n        .AddressingMode = I2C_ADDRESSINGMODE_7BIT,\n        .DualAddressMode = I2C_DUALADDRESS_DISABLE,\n        .OwnAddress2 = 0,\n        .OwnAddress2Masks = I2C_OA2_NOMASK,\n        .GeneralCallMode = I2C_GENERALCALL_DISABLE,\n        .NoStretchMode = I2C_NOSTRETCH_DISABLE,\n    }};\nstatic TCPP0203_Object_t tcpp0203_obj = {0};\n\nint32_t board_tcpp0203_init(void) {\n  board_pindef_t *pindef = &board_pindef[PINID_TCPP0203_EN];\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, GPIO_PIN_SET);\n\n  __HAL_RCC_I2C2_CLK_ENABLE();\n  __HAL_RCC_I2C2_FORCE_RESET();\n  __HAL_RCC_I2C2_RELEASE_RESET();\n  if (HAL_I2C_Init(&i2c_handle) != HAL_OK) {\n    return HAL_ERROR;\n  }\n\n  NVIC_SetPriority(EXTI8_IRQn, 12);\n  NVIC_EnableIRQ(EXTI8_IRQn);\n\n  return 0;\n}\n\nint32_t board_tcpp0203_deinit(void) {\n  return 0;\n}\n\nint32_t i2c_readreg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  TU_ASSERT(HAL_OK == HAL_I2C_Mem_Read(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000));\n  return 0;\n}\n\nint32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Length) {\n  TU_ASSERT(HAL_OK == HAL_I2C_Mem_Write(&i2c_handle, DevAddr, Reg, I2C_MEMADD_SIZE_8BIT, pData, Length, 10000));\n  return 0;\n}\n\nstatic inline void board_init2(void) {\n  TCPP0203_IO_t io_ctx;\n\n  io_ctx.Address = TCPP0203_I2C_ADDRESS_X68;\n  io_ctx.Init = board_tcpp0203_init;\n  io_ctx.DeInit = board_tcpp0203_deinit;\n  io_ctx.ReadReg = i2c_readreg;\n  io_ctx.WriteReg = i2c_writereg;\n\n  TU_ASSERT(TCPP0203_RegisterBusIO(&tcpp0203_obj, &io_ctx) == TCPP0203_OK, );\n\n  TU_ASSERT(TCPP0203_Init(&tcpp0203_obj) == TCPP0203_OK, );\n\n  TU_ASSERT(TCPP0203_SetPowerMode(&tcpp0203_obj, TCPP0203_POWER_MODE_NORMAL) == TCPP0203_OK, );\n}\n\nvoid board_vbus_set(uint8_t rhport, bool state) {\n  if (rhport == 0) {\n    uint8_t switch_state = state ? TCPP0203_GD_PROVIDER_SWITCH_CLOSED : TCPP0203_GD_PROVIDER_SWITCH_OPEN;\n    TU_ASSERT(TCPP0203_SetGateDriverProvider(&tcpp0203_obj, switch_state) == TCPP0203_OK, );\n  }\n}\n\nvoid EXTI8_IRQHandler(void) {\n  __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);\n  if (tcpp0203_obj.IsInitialized) {\n    TU_ASSERT(TCPP0203_SetPowerMode(&tcpp0203_obj, TCPP0203_POWER_MODE_NORMAL) == TCPP0203_OK, );\n    TU_ASSERT(TCPP0203_SetGateDriverProvider(&tcpp0203_obj, TCPP0203_GD_PROVIDER_SWITCH_CLOSED) == TCPP0203_OK, );\n  }\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32n6/boards/stm32n657nucleo/board.mk",
    "content": "MCU_VARIANT = stm32n657xx\nCFLAGS += -DSTM32N657xx\nJLINK_DEVICE = stm32n657x0\n\nLD_FILE_GCC = $(BOARD_PATH)/STM32N657XX_AXISRAM2_fsbl.ld\n\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 0\n\n# flash target using on-board stlink\nflash: flash-stlink\n\nPORT = 1\n\nSRC_C += \\\n\t$(ST_TCPP0203)/tcpp0203.c \\\n\t$(ST_TCPP0203)/tcpp0203_reg.c \\\n\nINC += \\\n\t$(TOP)/$(ST_TCPP0203) \\\n"
  },
  {
    "path": "hw/bsp/stm32n6/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019\n *    William D. Jones (thor0505@comcast.net),\n *    Ha Thach (tinyusb.org)\n *    Uwe Bonnes (bon@elektron.ikp.physik.tu-darmstadt.de\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-align\"\n#endif\n\n#include \"stm32n6xx_hal.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n\nTU_ATTR_UNUSED static void Error_Handler(void) { }\n\nvoid HardFault_Handler(void);\nstatic void MPU_Config(void);\nstatic void SystemIsolation_Config(void);\ntypedef struct {\n  GPIO_TypeDef* port;\n  GPIO_InitTypeDef pin_init;\n  uint8_t active_state;\n} board_pindef_t;\n\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\n#ifdef UART_DEV\nstatic UART_HandleTypeDef UartHandle = {\n  .Instance = UART_DEV,\n  .Init = {\n    .BaudRate = CFG_BOARD_UART_BAUDRATE,\n    .WordLength = UART_WORDLENGTH_8B,\n    .StopBits = UART_STOPBITS_1,\n    .Parity = UART_PARITY_NONE,\n    .HwFlowCtl = UART_HWCONTROL_NONE,\n    .Mode = UART_MODE_TX_RX,\n    .OverSampling = UART_OVERSAMPLING_16,\n  }\n};\n#endif\n\n#ifndef SWO_FREQ\n#define SWO_FREQ  4000000\n#endif\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n\n// Despite being call USB2_OTG_FS on some MCUs\n// OTG_FS is marked as RHPort0 by TinyUSB to be consistent across stm32 port\nvoid USB2_OTG_HS_IRQHandler(void) {\n  tusb_int_handler(1, true);\n}\n\n// Despite being call USB1_OTG_HS on some MCUs\n// OTG_HS is marked as RHPort1 by TinyUSB to be consistent across stm32 port\nvoid USB1_OTG_HS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n\nvoid board_init(void) {\n  /* Enable BusFault and SecureFault handlers (HardFault is default) */\n  SCB->SHCSR |= (SCB_SHCSR_BUSFAULTENA_Msk | SCB_SHCSR_SECUREFAULTENA_Msk);\n\n  MPU_Config();\n  SystemIsolation_Config();\n\n  SCB_EnableICache();\n  SCB_EnableDCache();\n\n  HAL_PWREx_EnableVddA();\n  HAL_PWREx_EnableVddIO2();\n  HAL_PWREx_EnableVddIO3();\n  HAL_PWREx_EnableVddIO4();\n  HAL_PWREx_EnableVddIO5();\n\n  HAL_Init();\n\n  // Implemented in board.h\n  SystemClock_Config();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n  __HAL_RCC_GPIOH_CLK_ENABLE();\n  __HAL_RCC_GPION_CLK_ENABLE();\n  __HAL_RCC_GPIOO_CLK_ENABLE();\n  __HAL_RCC_GPIOP_CLK_ENABLE();\n  __HAL_RCC_GPIOQ_CLK_ENABLE();\n\n  for (uint8_t i = 0; i < TU_ARRAY_SIZE(board_pindef); i++) {\n    HAL_GPIO_Init(board_pindef[i].port, &board_pindef[i].pin_init);\n  }\n\n  NVIC_SetPriority(UCPD1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));\n  NVIC_EnableIRQ(UCPD1_IRQn);\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n\n  NVIC_SetPriority(USB1_OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n\n\n#ifdef UART_DEV\n  UART_CLK_EN();\n  HAL_UART_Init(&UartHandle);\n#endif\n\n#if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 0) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 0)\n  __HAL_RCC_USB1_OTG_HS_CLK_ENABLE();\n  __HAL_RCC_PWR_CLK_ENABLE();\n  HAL_PWREx_EnableVddUSBVMEN();\n  while(__HAL_PWR_GET_FLAG(PWR_FLAG_USB33RDY));\n  HAL_PWREx_EnableVddUSB();\n\n  LL_AHB5_GRP1_ForceReset(0x00800000);\n  __HAL_RCC_USB1_OTG_HS_FORCE_RESET();\n  __HAL_RCC_USB1_OTG_HS_PHY_FORCE_RESET();\n\n  LL_RCC_HSE_SelectHSEDiv2AsDiv2Clock();\n  LL_AHB5_GRP1_ReleaseReset(0x00800000);\n\n  /* Peripheral clock enable */\n  __HAL_RCC_USB1_OTG_HS_CLK_ENABLE();\n\n  /* Required few clock cycles before accessing USB PHY Controller Registers */\n  for (volatile uint32_t i = 0; i < 10; i++) {\n      __NOP(); // No Operation instruction to create a delay\n  }\n\n  USB1_HS_PHYC->USBPHYC_CR &= ~(0x7 << 0x4);\n\n  USB1_HS_PHYC->USBPHYC_CR |= (0x1 << 16) |\n                              (0x2 << 4)  |\n                              (0x1 << 2)  |\n                                0x1U;\n\n  __HAL_RCC_USB1_OTG_HS_PHY_RELEASE_RESET();\n\n  /* Required few clock cycles before Releasing Reset */\n  for (volatile uint32_t i = 0; i < 10; i++) {\n      __NOP(); // No Operation instruction to create a delay\n  }\n\n  __HAL_RCC_USB1_OTG_HS_RELEASE_RESET();\n\n  /* Peripheral PHY clock enable */\n  __HAL_RCC_USB1_OTG_HS_PHY_CLK_ENABLE();\n\n#if CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 0\n  board_vbus_set(BOARD_TUH_RHPORT, 1);\n#endif\n#endif\n\n#if (CFG_TUD_ENABLED && BOARD_TUD_RHPORT == 1) || (CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 1)\n  __HAL_RCC_USB2_OTG_HS_CLK_ENABLE();\n  __HAL_RCC_PWR_CLK_ENABLE();\n  HAL_PWREx_EnableVddUSBVMEN();\n  while(__HAL_PWR_GET_FLAG(PWR_FLAG_USB33RDY));\n  HAL_PWREx_EnableVddUSB();\n\n  LL_AHB5_GRP1_ForceReset(0x00800000);\n  __HAL_RCC_USB2_OTG_HS_FORCE_RESET();\n  __HAL_RCC_USB2_OTG_HS_PHY_FORCE_RESET();\n\n  LL_RCC_HSE_SelectHSEDiv2AsDiv2Clock();\n  LL_AHB5_GRP1_ReleaseReset(0x00800000);\n\n  /* Peripheral clock enable */\n  __HAL_RCC_USB2_OTG_HS_CLK_ENABLE();\n\n  /* Required few clock cycles before accessing USB PHY Controller Registers */\n  for (volatile uint32_t i = 0; i < 10; i++) {\n      __NOP(); // No Operation instruction to create a delay\n  }\n\n  USB2_HS_PHYC->USBPHYC_CR &= ~(0x7 << 0x4);\n\n  USB2_HS_PHYC->USBPHYC_CR |= (0x1 << 16) |\n                              (0x2 << 4)  |\n                              (0x1 << 2)  |\n                                0x1U;\n\n  __HAL_RCC_USB2_OTG_HS_PHY_RELEASE_RESET();\n\n  /* Required few clock cycles before Releasing Reset */\n  for (volatile uint32_t i = 0; i < 10; i++) {\n      __NOP(); // No Operation instruction to create a delay\n  }\n\n  __HAL_RCC_USB2_OTG_HS_RELEASE_RESET();\n\n  /* Peripheral PHY clock enable */\n  __HAL_RCC_USB2_OTG_HS_PHY_CLK_ENABLE();\n\n#if CFG_TUH_ENABLED && BOARD_TUH_RHPORT == 1\n  board_vbus_set(BOARD_TUH_RHPORT, 1);\n#endif\n#endif\n\n  board_init2();\n}\n\nstatic void MPU_Config(void)\n{\n  MPU_Region_InitTypeDef default_config = {0};\n  MPU_Attributes_InitTypeDef attr_config = {0};\n  uint32_t primask_bit = __get_PRIMASK();\n  __disable_irq();\n\n  /* disable the MPU */\n  HAL_MPU_Disable();\n\n  /* create an attribute configuration for the MPU */\n  attr_config.Attributes = INNER_OUTER(MPU_NOT_CACHEABLE);\n  attr_config.Number = MPU_ATTRIBUTES_NUMBER0;\n\n  HAL_MPU_ConfigMemoryAttributes(&attr_config);\n\n  /* Create a non cacheable region */\n  /*Normal memory type, code execution allowed */\n  default_config.Enable = MPU_REGION_ENABLE;\n  default_config.Number = MPU_REGION_NUMBER0;\n  default_config.BaseAddress = __NON_CACHEABLE_SECTION_BEGIN;\n  default_config.LimitAddress =  __NON_CACHEABLE_SECTION_END;\n  default_config.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;\n  default_config.AccessPermission = MPU_REGION_ALL_RW;\n  default_config.IsShareable = MPU_ACCESS_NOT_SHAREABLE;\n  default_config.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;\n  HAL_MPU_ConfigRegion(&default_config);\n\n  /* enable the MPU */\n  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);\n\n  /* Exit critical section to lock the system and avoid any issue around MPU mechanisme */\n  __set_PRIMASK(primask_bit);\n}\n\nstatic void SystemIsolation_Config(void) {\n  /* set all required IPs as secure privileged */\n  __HAL_RCC_RIFSC_CLK_ENABLE();\n  RIMC_MasterConfig_t RIMC_master = {0};\n  RIMC_master.MasterCID = RIF_CID_1;\n  RIMC_master.SecPriv = RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV;\n\n  /*RIMC configuration*/\n  HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_OTG1, &RIMC_master);\n  HAL_RIF_RIMC_ConfigMasterAttributes(RIF_MASTER_INDEX_OTG2, &RIMC_master);\n\n  /*RISUP configuration*/\n  HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_OTG1HS , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);\n  HAL_RIF_RISC_SetSlaveSecureAttributes(RIF_RISC_PERIPH_INDEX_OTG2HS , RIF_ATTRIBUTE_SEC | RIF_ATTRIBUTE_PRIV);\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n#ifdef PINID_LED\n  board_pindef_t* pindef = &board_pindef[PINID_LED];\n  GPIO_PinState pin_state = state == pindef->active_state ? GPIO_PIN_SET : GPIO_PIN_RESET;\n  HAL_GPIO_WritePin(pindef->port, pindef->pin_init.Pin, pin_state);\n#else\n  (void) state;\n#endif\n}\n\nuint32_t board_button_read(void) {\n#ifdef PINID_BUTTON\n  board_pindef_t* pindef = &board_pindef[PINID_BUTTON];\n  return pindef->active_state == HAL_GPIO_ReadPin(pindef->port, pindef->pin_init.Pin);\n#else\n  return 0;\n#endif\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t* id32 = (uint32_t*) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t * )(uintptr_t)\n  buf, len, 0xffff);\n  return len;\n#else\n  (void) buf; (void) len;\n  return -1;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32n6/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY n6)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\nset(ST_TCPP0203 ${TOP}/hw/mcu/st/stm32-tcpp0203)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m55 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32N6 CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nif (NOT DEFINED RHPORT_DEVICE)\n  set(RHPORT_DEVICE 0)\nendif ()\nif (NOT DEFINED RHPORT_HOST)\n  set(RHPORT_HOST 1)\nendif ()\n\n# N6 are all high speed\nif (NOT DEFINED RHPORT_DEVICE_SPEED)\n  set(RHPORT_DEVICE_SPEED OPT_MODE_HIGH_SPEED)\nendif ()\nif (NOT DEFINED RHPORT_HOST_SPEED)\n  set(RHPORT_HOST_SPEED OPT_MODE_HIGH_SPEED)\nendif ()\n\ncmake_print_variables(RHPORT_DEVICE RHPORT_DEVICE_SPEED RHPORT_HOST RHPORT_HOST_SPEED)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nif(NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/linker/${MCU_VARIANT}_axisram2_fsbl.ld)\nendif()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif(NOT DEFINED LD_FILE_IAR)\n  set(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_axisram2_fsbl.icf)\nendif()\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}_fsbl.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_i2c.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rif.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${TOP}/lib/CMSIS_6/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  target_compile_definitions(${BOARD_TARGET} PUBLIC\n    BOARD_TUD_RHPORT=${RHPORT_DEVICE}\n    BOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED}\n    BOARD_TUH_RHPORT=${RHPORT_HOST}\n    BOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED}\n    SEGGER_RTT_SECTION=\".noncacheable\"\n    BUFFER_SIZE_UP=0x4000\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32N6 ${RTOS})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n      PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32n6/family.mk",
    "content": "ST_FAMILY = n6\nST_PREFIX = stm32${ST_FAMILY}xx\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/${ST_PREFIX}_hal_driver\nST_TCPP0203 = hw/mcu/st/stm32-tcpp0203\n\nUF2_FAMILY_ID = 0x6db66083\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m55\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nRHPORT_DEVICE ?= 0\nRHPORT_HOST ?= 1\n\nifndef RHPORT_DEVICE_SPEED\n  RHPORT_DEVICE_SPEED = OPT_MODE_HIGH_SPEED\nendif\n\nifndef RHPORT_HOST_SPEED\n  RHPORT_HOST_SPEED = OPT_MODE_HIGH_SPEED\nendif\n\n# --------------\n# Compiler Flags\n# --------------\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32N6 \\\n\t-DBOARD_TUD_RHPORT=${RHPORT_DEVICE} \\\n\t-DBOARD_TUD_MAX_SPEED=${RHPORT_DEVICE_SPEED} \\\n\t-DBOARD_TUH_RHPORT=${RHPORT_HOST} \\\n\t-DBOARD_TUH_MAX_SPEED=${RHPORT_HOST_SPEED} \\\n\t-DSEGGER_RTT_SECTION=\"\\\".noncacheable\\\"\" \\\n\t-DBUFFER_SIZE_UP=0x4000 \\\n\n# GCC Flags\nCFLAGS_GCC += \\\n  -flto \\\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += \\\n  -Wno-error=cast-align \\\n  -Wno-error=unused-parameter \\\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\n# -----------------\n# Sources & Include\n# -----------------\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_${ST_PREFIX}_fsbl.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_dma.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_gpio.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_hcd.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_i2c.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pcd.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pcd_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rif.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_uart_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_ll_usb.c \\\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_6/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT)_fsbl.s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_GCC ?= $(ST_CMSIS)/Source/Templates/gcc/linker/$(MCU_VARIANT)_flash.ld\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32n6/partition_stm32n657xx.h",
    "content": "/**\n  ******************************************************************************\n  * @file    partition_stm32n657xx.h\n  * @author  MCD Application Team\n  * @brief   CMSIS STM32N657xx Device Initial Setup for Secure / Non-Secure Zones\n  *          for ARMCM55 based on CMSIS CORE V5.3.1 partition_ARMCM33.h Template.\n  *\n  *          This file contains:\n  *           - Initialize Security Attribution Unit (SAU) CTRL register\n  *           - Setup behavior of Sleep and Exception Handling\n  *           - Setup behavior of Floating Point Unit\n  *           - Setup Interrupt Target\n  *\n  ******************************************************************************/\n/*\n * Copyright (c) 2009-2016 ARM Limited. All rights reserved.\n * Portions Copyright (c) 2023 STMicroelectronics, all rights reserved\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef PARTITION_STM32N657XX_H\n#define PARTITION_STM32N657XX_H\n\n/*\n//-------- <<< Use Configuration Wizard in Context Menu >>> -----------------\n*/\n\n/*\n// <e>Initialize Security Attribution Unit (SAU) CTRL register\n*/\n#define SAU_INIT_CTRL          0\n\n/*\n//   <q> Enable SAU\n//   <i> Value for SAU->CTRL register bit ENABLE\n*/\n#define SAU_INIT_CTRL_ENABLE   0\n\n/*\n//   <o> When SAU is disabled\n//     <0=> All Memory is Secure\n//     <1=> All Memory is Non-Secure\n//   <i> Value for SAU->CTRL register bit ALLNS\n//   <i> When all Memory is Non-Secure (ALLNS is 1), IDAU can override memory map configuration.\n*/\n#define SAU_INIT_CTRL_ALLNS  0\n\n/*\n// </e>\n*/\n\n/*\n// <h>Initialize Security Attribution Unit (SAU) Address Regions\n// <i>SAU configuration specifies regions to be one of:\n// <i> - Secure and Non-Secure Callable\n// <i> - Non-Secure\n// <i>Note: All memory regions not configured by SAU are Secure\n*/\n#define SAU_REGIONS_MAX   8                 /* Max. number of SAU regions */\n\n/*\n//   <e>Initialize SAU Region 0\n//   <i> Setup SAU Region 0 memory attributes\n*/\n#define SAU_INIT_REGION0    0\n\n/*\n//     <o>Start Address <0-0xFFFFFFE0>\n*/\n#define SAU_INIT_START0     0x00000000      /* start address of SAU region 0 */\n\n/*\n//     <o>End Address <0x1F-0xFFFFFFFF>\n*/\n#define SAU_INIT_END0       0x00000000      /* end address of SAU region 0 */\n\n/*\n//     <o>Region is\n//         <0=>Non-Secure\n//         <1=>Secure, Non-Secure Callable\n*/\n#define SAU_INIT_NSC0       0\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize SAU Region 1\n//   <i> Setup SAU Region 1 memory attributes\n*/\n#define SAU_INIT_REGION1    0\n\n/*\n//     <o>Start Address <0-0xFFFFFFE0>\n*/\n#define SAU_INIT_START1     0x00000000      /* start address of SAU region 1 */\n\n/*\n//     <o>End Address <0x1F-0xFFFFFFFF>\n*/\n#define SAU_INIT_END1       0x00000000      /* end address of SAU region 1 */\n\n/*\n//     <o>Region is\n//         <0=>Non-Secure\n//         <1=>Secure, Non-Secure Callable\n*/\n#define SAU_INIT_NSC1       0\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize SAU Region 2\n//   <i> Setup SAU Region 2 memory attributes\n*/\n#define SAU_INIT_REGION2    0\n\n/*\n//     <o>Start Address <0-0xFFFFFFE0>\n*/\n#define SAU_INIT_START2     0x00000000      /* start address of SAU region 2 */\n\n/*\n//     <o>End Address <0x1F-0xFFFFFFFF>\n*/\n#define SAU_INIT_END2       0x00000000      /* end address of SAU region 2 */\n\n/*\n//     <o>Region is\n//         <0=>Non-Secure\n//         <1=>Secure, Non-Secure Callable\n*/\n#define SAU_INIT_NSC2       0\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize SAU Region 3\n//   <i> Setup SAU Region 3 memory attributes\n*/\n#define SAU_INIT_REGION3    0\n\n/*\n//     <o>Start Address <0-0xFFFFFFE0>\n*/\n#define SAU_INIT_START3     0x00000000      /* start address of SAU region 3 */\n\n/*\n//     <o>End Address <0x1F-0xFFFFFFFF>\n*/\n#define SAU_INIT_END3       0x00000000      /* end address of SAU region 3 */\n\n/*\n//     <o>Region is\n//         <0=>Non-Secure\n//         <1=>Secure, Non-Secure Callable\n*/\n#define SAU_INIT_NSC3       0\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize SAU Region 4\n//   <i> Setup SAU Region 4 memory attributes\n*/\n#define SAU_INIT_REGION4    0\n\n/*\n//     <o>Start Address <0-0xFFFFFFE0>\n*/\n#define SAU_INIT_START4     0x00000000      /* start address of SAU region 4 */\n\n/*\n//     <o>End Address <0x1F-0xFFFFFFFF>\n*/\n#define SAU_INIT_END4       0x00000000      /* end address of SAU region 4 */\n\n/*\n//     <o>Region is\n//         <0=>Non-Secure\n//         <1=>Secure, Non-Secure Callable\n*/\n#define SAU_INIT_NSC4       0\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize SAU Region 5\n//   <i> Setup SAU Region 5 memory attributes\n*/\n#define SAU_INIT_REGION5    0\n\n/*\n//     <o>Start Address <0-0xFFFFFFE0>\n*/\n#define SAU_INIT_START5     0x00000000      /* start address of SAU region 5 */\n\n/*\n//     <o>End Address <0x1F-0xFFFFFFFF>\n*/\n#define SAU_INIT_END5       0x00000000      /* end address of SAU region 5 */\n\n/*\n//     <o>Region is\n//         <0=>Non-Secure\n//         <1=>Secure, Non-Secure Callable\n*/\n#define SAU_INIT_NSC5       0\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize SAU Region 6\n//   <i> Setup SAU Region 6 memory attributes\n*/\n#define SAU_INIT_REGION6    0\n\n/*\n//     <o>Start Address <0-0xFFFFFFE0>\n*/\n#define SAU_INIT_START6     0x00000000      /* start address of SAU region 6 */\n\n/*\n//     <o>End Address <0x1F-0xFFFFFFFF>\n*/\n#define SAU_INIT_END6       0x00000000      /* end address of SAU region 6 */\n\n/*\n//     <o>Region is\n//         <0=>Non-Secure\n//         <1=>Secure, Non-Secure Callable\n*/\n#define SAU_INIT_NSC6       0\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize SAU Region 7\n//   <i> Setup SAU Region 7 memory attributes\n*/\n#define SAU_INIT_REGION7    0\n\n/*\n//     <o>Start Address <0-0xFFFFFFE0>\n*/\n#define SAU_INIT_START7     0x00000000      /* start address of SAU region 7 */\n\n/*\n//     <o>End Address <0x1F-0xFFFFFFFF>\n*/\n#define SAU_INIT_END7       0x00000000      /* end address of SAU region 7 */\n\n/*\n//     <o>Region is\n//         <0=>Non-Secure\n//         <1=>Secure, Non-Secure Callable\n*/\n#define SAU_INIT_NSC7       0\n/*\n//   </e>\n*/\n\n/*\n// </h>\n*/\n\n/*\n// <e>Setup behaviour of Sleep and Exception Handling\n*/\n#define SCB_CSR_AIRCR_INIT  0\n\n/*\n//   <o> Deep Sleep can be enabled by\n//     <0=>Secure and Non-Secure state\n//     <1=>Secure state only\n//   <i> Value for SCB->CSR register bit DEEPSLEEPS\n*/\n#define SCB_CSR_DEEPSLEEPS_VAL  0\n\n/*\n//   <o>System reset request accessible from\n//     <0=> Secure and Non-Secure state\n//     <1=> Secure state only\n//   <i> Value for SCB->AIRCR register bit SYSRESETREQS\n*/\n#define SCB_AIRCR_SYSRESETREQS_VAL  0\n\n/*\n//   <o>Priority of Non-Secure exceptions is\n//     <0=> Not altered\n//     <1=> Lowered to 0x04-0x07\n//   <i> Value for SCB->AIRCR register bit PRIS\n*/\n#define SCB_AIRCR_PRIS_VAL      0\n\n/*\n//   <o>BusFault, HardFault, and NMI target\n//     <0=> Secure state\n//     <1=> Non-Secure state\n//   <i> Value for SCB->AIRCR register bit BFHFNMINS\n*/\n#define SCB_AIRCR_BFHFNMINS_VAL 0\n\n/*\n// </e>\n*/\n\n/*\n// <e>Setup behaviour of Floating Point Unit\n*/\n#define TZ_FPU_NS_USAGE 1\n\n/*\n// <o>Floating Point Unit usage\n//     <0=> Secure state only\n//     <3=> Secure and Non-Secure state\n//   <i> Value for SCB->NSACR register bits CP10, CP11\n*/\n#define SCB_NSACR_CP10_11_VAL       3\n\n/*\n// <o>Treat floating-point registers as Secure\n//     <0=> Disabled\n//     <1=> Enabled\n//   <i> Value for FPU->FPCCR register bit TS\n*/\n#define FPU_FPCCR_TS_VAL            0\n\n/*\n// <o>Clear on return (CLRONRET) accessibility\n//     <0=> Secure and Non-Secure state\n//     <1=> Secure state only\n//   <i> Value for FPU->FPCCR register bit CLRONRETS\n*/\n#define FPU_FPCCR_CLRONRETS_VAL     0\n\n/*\n// <o>Clear floating-point caller saved registers on exception return\n//     <0=> Disabled\n//     <1=> Enabled\n//   <i> Value for FPU->FPCCR register bit CLRONRET\n*/\n#define FPU_FPCCR_CLRONRET_VAL      1\n\n/*\n// </e>\n*/\n\n/*\n// <h>Setup Interrupt Target\n*/\n\n/*\n//   <e>Initialize ITNS 0 (Interrupts 0..31)\n*/\n#define NVIC_INIT_ITNS0    1\n\n/*\n// Interrupts 0..31\n//   <o.0>  PVD_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.1>  Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.2>  DTS_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.3>  RCC_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.4>  LOCKUP_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.5>  CACHE_ECC_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.6>  TCM_ECC_IRQn        <0=> Secure state <1=> Non-Secure state\n//   <o.7>  BKP_ECC_IRQn        <0=> Secure state <1=> Non-Secure state\n//   <o.8>  FPU_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.9>  Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.10> RTC_S_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.11> TAMP_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.12> RIFSC_TAMPER_IRQn   <0=> Secure state <1=> Non-Secure state\n//   <o.13> IAC_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.14> RCC_S_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.15> Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.16> RTC_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.17> Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.18> IWDG_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.19> WWDG_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.20> EXTI0_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.21> EXTI1_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.22> EXTI2_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.23> EXTI3_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.24> EXTI4_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.25> EXTI5_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.26> EXTI6_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.27> EXTI7_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.28> EXTI8_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.29> EXTI9_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.30> EXTI10_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.31> EXTI11_IRQn         <0=> Secure state <1=> Non-Secure state\n*/\n#define NVIC_INIT_ITNS0_VAL     0x00000000\n\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize ITNS 1 (Interrupts 32..63)\n*/\n#define NVIC_INIT_ITNS1    1\n\n/*\n// Interrupts 32..63\n//   <o.0>  EXTI12_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.1>  EXTI13_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.2>  EXTI14_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.3>  EXTI15_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.4>  SAES_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.5>  CRYP_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.6>  PKA_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.7>  HASH_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.8>  RNG_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.9>  Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.10> MCE1_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.11> MCE2_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.12> MCE3_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.13> MCE4_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.14> ADC1_2_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.15> CSI_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.16> DCMIPP_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.17> Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.18> Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.19> Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.20> PAHB_ERR_IRQn       <0=> Secure state <1=> Non-Secure state\n//   <o.21> NPU0_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.22> NPU1_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.23> NPU2_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.24> NPU3_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.25> CACHEAXI_IRQn       <0=> Secure state <1=> Non-Secure state\n//   <o.26> LTDC_LO_IRQn        <0=> Secure state <1=> Non-Secure state\n//   <o.27> LTDC_LO_ERR_IRQn    <0=> Secure state <1=> Non-Secure state\n//   <o.28> DMA2D_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.29> JPEG_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.30> VENC_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.31> GFXMMU_IRQn         <0=> Secure state <1=> Non-Secure state\n*/\n#define NVIC_INIT_ITNS1_VAL     0x00000000\n\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize ITNS 2 (Interrupts 64..95)\n*/\n#define NVIC_INIT_ITNS2    1\n\n/*\n// Interrupts 64..95\n//   <o.0>  GFXTIM_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.1>  GPU2D_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.2>  GPU2D_ER_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.3>  ICACHE_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.4>  HPDMA1_Channel0_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.5>  HPDMA1_Channel1_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.6>  HPDMA1_Channel2_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.7>  HPDMA1_Channel3_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.8>  HPDMA1_Channel4_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.9>  HPDMA1_Channel5_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.10> HPDMA1_Channel6_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.11> HPDMA1_Channel7_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.12> HPDMA1_Channel8_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.13> HPDMA1_Channel9_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.14> HPDMA1_Channel10_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.15> HPDMA1_Channel11_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.16> HPDMA1_Channel12_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.17> HPDMA1_Channel13_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.18> HPDMA1_Channel14_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.19> HPDMA1_Channel15_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.20> GPDMA1_Channel0_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.21> GPDMA1_Channel1_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.22> GPDMA1_Channel2_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.23> GPDMA1_Channel3_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.24> GPDMA1_Channel4_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.25> GPDMA1_Channel5_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.26> GPDMA1_Channel6_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.27> GPDMA1_Channel7_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.28> GPDMA1_Channel8_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.29> GPDMA1_Channel9_IRQn  <0=> Secure state <1=> Non-Secure state\n//   <o.30> GPDMA1_Channel10_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.31> GPDMA1_Channel11_IRQn <0=> Secure state <1=> Non-Secure state\n*/\n#define NVIC_INIT_ITNS2_VAL     0x00000000\n\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize ITNS 3 (Interrupts 96..127)\n*/\n#define NVIC_INIT_ITNS3    1\n\n/*\n// Interrupts 96..127\n//   <o.0>  GPDMA1_Channel12_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.1>  GPDMA1_Channel13_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.2>  GPDMA1_Channel14_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.3>  GPDMA1_Channel15_IRQn <0=> Secure state <1=> Non-Secure state\n//   <o.4>  I2C1_EV_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.5>  I2C1_ER_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.6>  I2C2_EV_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.7>  I2C2_ER_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.8>  I2C3_EV_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.9>  I2C3_ER_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.10> I2C4_EV_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.11> I2C4_ER_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.12> I3C1_EV_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.13> I3C1_ER_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.14> I3C2_EV_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.15> I3C2_ER_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.16> TIM1_BRK_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.17> TIM1_UP_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.18> TIM1_TRG_COM_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.19> TIM1_CC_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.20> TIM2_IRQn             <0=> Secure state <1=> Non-Secure state\n//   <o.21> TIM3_IRQn             <0=> Secure state <1=> Non-Secure state\n//   <o.22> TIM4_IRQn             <0=> Secure state <1=> Non-Secure state\n//   <o.23> TIM5_IRQn             <0=> Secure state <1=> Non-Secure state\n//   <o.24> TIM6_IRQn             <0=> Secure state <1=> Non-Secure state\n//   <o.25> TIM7_IRQn             <0=> Secure state <1=> Non-Secure state\n//   <o.26> TIM8_BRK_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.27> TIM8_UP_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.28> TIM8_TRG_COM_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.29> TIM8_CC_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.30> TIM9_IRQn             <0=> Secure state <1=> Non-Secure state\n//   <o.31> TIM10_IRQn            <0=> Secure state <1=> Non-Secure state\n\n*/\n#define NVIC_INIT_ITNS3_VAL     0x00000000\n\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize ITNS 4 (Interrupts 128..159)\n*/\n#define NVIC_INIT_ITNS4    1\n\n/*\n// Interrupts 128..159\n//   <o.0>  TIM11_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.1>  TIM12_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.2>  TIM13_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.3>  TIM14_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.4>  TIM15_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.5>  TIM16_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.6>  TIM17_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.7>  TIM18_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.8>  LPTIM1_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.9>  LPTIM2_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.10> LPTIM3_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.11> LPTIM4_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.12> LPTIM5_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.13> ADF1_FLT0_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.14> MDF1_FLT0_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.15> MDF1_FLT1_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.16> MDF1_FLT2_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.17> MDF1_FLT3_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.18> MDF1_FLT4_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.19> MDF1_FLT5_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.20> SAI1_A_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.21> SAI1_B_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.22> SAI2_A_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.23> SAI2_B_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.24> SPDIFRX1_IRQn       <0=> Secure state <1=> Non-Secure state\n//   <o.25> SPI1_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.26> SPI2_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.27> SPI3_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.28> SPI4_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.29> SPI5_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.30> SPI6_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.31> USART1_IRQn         <0=> Secure state <1=> Non-Secure state\n\n*/\n#define NVIC_INIT_ITNS4_VAL      0x00000000\n\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize ITNS 5 (Interrupts 160..191)\n*/\n#define NVIC_INIT_ITNS5    1\n\n/*\n// Interrupts 160..191\n//   <o.0>  USART2_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.1>  USART3_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.2>  UART4_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.3>  UART5_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.4>  USART6_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.5>  UART7_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.6>  UART8_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.7>  UART9_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.8>  USART10_IRQn        <0=> Secure state <1=> Non-Secure state\n//   <o.9>  LPUART1_IRQn        <0=> Secure state <1=> Non-Secure state\n//   <o.10> XSPI1_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.11> XSPI2_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.12> XSPI3_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.13> FMC_IRQn            <0=> Secure state <1=> Non-Secure state\n//   <o.14> SDMMC1_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.15> SDMMC2_IRQn         <0=> Secure state <1=> Non-Secure state\n//   <o.16> UCPD1_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.17> USB1_OTG_HS_IRQn    <0=> Secure state <1=> Non-Secure state\n//   <o.18> USB2_OTG_HS_IRQn    <0=> Secure state <1=> Non-Secure state\n//   <o.19> ETH1_IRQn           <0=> Secure state <1=> Non-Secure state\n//   <o.20> FDCAN1_IT0_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.21> FDCAN1_IT1_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.22> FDCAN2_IT0_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.23> FDCAN2_IT1_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.24> FDCAN3_IT0_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.25> FDCAN3_IT1_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.26> FDCAN_CU_IRQn       <0=> Secure state <1=> Non-Secure state\n//   <o.27> MDIOS_IRQn          <0=> Secure state <1=> Non-Secure state\n//   <o.28> DCMI_PSSI_IRQn      <0=> Secure state <1=> Non-Secure state\n//   <o.29> WAKEUP_PIN_IRQn     <0=> Secure state <1=> Non-Secure state\n//   <o.30> CTI_INT0_IRQn       <0=> Secure state <1=> Non-Secure state\n//   <o.31> CTI_INT1_IRQn       <0=> Secure state <1=> Non-Secure state\n\n*/\n#define NVIC_INIT_ITNS5_VAL      0x00000000\n\n/*\n//   </e>\n*/\n\n/*\n//   <e>Initialize ITNS 6 (Interrupts 192..223)\n*/\n#define NVIC_INIT_ITNS6    1\n\n/*\n// Interrupts 192..223\n//   <o.0>  Reserved            <0=> Secure state <1=> Non-Secure state\n//   <o.1>  LTDC_UP_IRQn        <0=> Secure state <1=> Non-Secure state\n//   <o.2>  LTDC_UP_ERR_IRQn    <0=> Secure state <1=> Non-Secure state\n\n*/\n#define NVIC_INIT_ITNS6_VAL      0x00000000\n\n/*\n//   </e>\n*/\n\n/*\n// </h>\n*/\n\n\n\n/*\n    max 8 SAU regions.\n    SAU regions are defined in partition.h\n */\n\n#define SAU_INIT_REGION(n) \\\n    SAU->RNR  =  (n                                     & SAU_RNR_REGION_Msk); \\\n    SAU->RBAR =  (SAU_INIT_START##n                     & SAU_RBAR_BADDR_Msk); \\\n    SAU->RLAR =  (SAU_INIT_END##n                       & SAU_RLAR_LADDR_Msk) | \\\n                ((SAU_INIT_NSC##n << SAU_RLAR_NSC_Pos)  & SAU_RLAR_NSC_Msk)   | 1U\n\n/**\n  \\brief   Setup a SAU Region\n  \\details Writes the region information contained in SAU_Region to the\n           registers SAU_RNR, SAU_RBAR, and SAU_RLAR\n */\n__STATIC_INLINE void TZ_SAU_Setup (void)\n{\n\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n\n  #if defined (SAU_INIT_REGION0) && (SAU_INIT_REGION0 == 1U)\n    SAU_INIT_REGION(0);\n  #endif\n\n  #if defined (SAU_INIT_REGION1) && (SAU_INIT_REGION1 == 1U)\n    SAU_INIT_REGION(1);\n  #endif\n\n  #if defined (SAU_INIT_REGION2) && (SAU_INIT_REGION2 == 1U)\n    SAU_INIT_REGION(2);\n  #endif\n\n  #if defined (SAU_INIT_REGION3) && (SAU_INIT_REGION3 == 1U)\n    SAU_INIT_REGION(3);\n  #endif\n\n  #if defined (SAU_INIT_REGION4) && (SAU_INIT_REGION4 == 1U)\n    SAU_INIT_REGION(4);\n  #endif\n\n  #if defined (SAU_INIT_REGION5) && (SAU_INIT_REGION5 == 1U)\n    SAU_INIT_REGION(5);\n  #endif\n\n  #if defined (SAU_INIT_REGION6) && (SAU_INIT_REGION6 == 1U)\n    SAU_INIT_REGION(6);\n  #endif\n\n  #if defined (SAU_INIT_REGION7) && (SAU_INIT_REGION7 == 1U)\n    SAU_INIT_REGION(7);\n  #endif\n\n  /* repeat this for all possible SAU regions */\n\n#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */\n\n\n  #if defined (SAU_INIT_CTRL) && (SAU_INIT_CTRL == 1U)\n    SAU->CTRL = ((SAU_INIT_CTRL_ENABLE << SAU_CTRL_ENABLE_Pos) & SAU_CTRL_ENABLE_Msk) |\n                ((SAU_INIT_CTRL_ALLNS  << SAU_CTRL_ALLNS_Pos)  & SAU_CTRL_ALLNS_Msk)   ;\n  #endif\n\n  #if defined (SCB_CSR_AIRCR_INIT) && (SCB_CSR_AIRCR_INIT == 1U)\n    SCB->SCR   = (SCB->SCR   & ~(SCB_SCR_SLEEPDEEPS_Msk    )) |\n                   ((SCB_CSR_DEEPSLEEPS_VAL     << SCB_SCR_SLEEPDEEPS_Pos)     & SCB_SCR_SLEEPDEEPS_Msk);\n\n    SCB->AIRCR = (SCB->AIRCR & ~(SCB_AIRCR_VECTKEY_Msk   | SCB_AIRCR_SYSRESETREQS_Msk |\n                                 SCB_AIRCR_BFHFNMINS_Msk | SCB_AIRCR_PRIS_Msk)        )                     |\n                   ((0x05FAU                    << SCB_AIRCR_VECTKEY_Pos)      & SCB_AIRCR_VECTKEY_Msk)      |\n                   ((SCB_AIRCR_SYSRESETREQS_VAL << SCB_AIRCR_SYSRESETREQS_Pos) & SCB_AIRCR_SYSRESETREQS_Msk) |\n                   ((SCB_AIRCR_PRIS_VAL         << SCB_AIRCR_PRIS_Pos)         & SCB_AIRCR_PRIS_Msk)         |\n                   ((SCB_AIRCR_BFHFNMINS_VAL    << SCB_AIRCR_BFHFNMINS_Pos)    & SCB_AIRCR_BFHFNMINS_Msk);\n  #endif /* defined (SCB_CSR_AIRCR_INIT) && (SCB_CSR_AIRCR_INIT == 1U) */\n\n  #if defined (__FPU_USED) && (__FPU_USED == 1U) && \\\n      defined (TZ_FPU_NS_USAGE) && (TZ_FPU_NS_USAGE == 1U)\n\n    SCB->NSACR = (SCB->NSACR & ~(SCB_NSACR_CP10_Msk | SCB_NSACR_CP11_Msk)) |\n                   ((SCB_NSACR_CP10_11_VAL << SCB_NSACR_CP10_Pos) & (SCB_NSACR_CP10_Msk | SCB_NSACR_CP11_Msk));\n\n    FPU->FPCCR = (FPU->FPCCR & ~(FPU_FPCCR_TS_Msk | FPU_FPCCR_CLRONRETS_Msk | FPU_FPCCR_CLRONRET_Msk)) |\n                   ((FPU_FPCCR_TS_VAL        << FPU_FPCCR_TS_Pos       ) & FPU_FPCCR_TS_Msk       ) |\n                   ((FPU_FPCCR_CLRONRETS_VAL << FPU_FPCCR_CLRONRETS_Pos) & FPU_FPCCR_CLRONRETS_Msk) |\n                   ((FPU_FPCCR_CLRONRET_VAL  << FPU_FPCCR_CLRONRET_Pos ) & FPU_FPCCR_CLRONRET_Msk );\n  #endif\n\n  #if defined (NVIC_INIT_ITNS0) && (NVIC_INIT_ITNS0 == 1U)\n    NVIC->ITNS[0] = NVIC_INIT_ITNS0_VAL;\n  #endif\n\n  #if defined (NVIC_INIT_ITNS1) && (NVIC_INIT_ITNS1 == 1U)\n    NVIC->ITNS[1] = NVIC_INIT_ITNS1_VAL;\n  #endif\n\n  #if defined (NVIC_INIT_ITNS2) && (NVIC_INIT_ITNS2 == 1U)\n    NVIC->ITNS[2] = NVIC_INIT_ITNS2_VAL;\n  #endif\n\n  #if defined (NVIC_INIT_ITNS3) && (NVIC_INIT_ITNS3 == 1U)\n    NVIC->ITNS[3] = NVIC_INIT_ITNS3_VAL;\n  #endif\n\n  #if defined (NVIC_INIT_ITNS4) && (NVIC_INIT_ITNS4 == 1U)\n    NVIC->ITNS[4] = NVIC_INIT_ITNS4_VAL;\n  #endif\n\n  #if defined (NVIC_INIT_ITNS5) && (NVIC_INIT_ITNS5 == 1U)\n    NVIC->ITNS[5] = NVIC_INIT_ITNS5_VAL;\n  #endif\n\n  #if defined (NVIC_INIT_ITNS6) && (NVIC_INIT_ITNS6 == 1U)\n    NVIC->ITNS[6] = NVIC_INIT_ITNS6_VAL;\n  #endif\n\n}\n\n#endif  /* PARTITION_STM32N657XX_H */\n"
  },
  {
    "path": "hw/bsp/stm32n6/setup_iar.mac",
    "content": "/* Called once after the target reset. */\nexecUserReset()\n{\n    /* Re-load image as AIXRAM2 is erased after CPU reset */\n    __loadImage(\"$EXE_DIR$\\\\$TARGET_BNAME$.hex\", 0, 0);\n\n    __restoreSoftwareBreakpoints();\n\n     #PC = __readMemory32(0x34180404, \"Memory\");\n\n     #SP = 0x341FFD00;\n}\n"
  },
  {
    "path": "hw/bsp/stm32n6/stm32n6.jdebug",
    "content": "/*********************************************************************\n*                 (c) SEGGER Microcontroller GmbH                    *\n*                      The Embedded Experts                          *\n*                         www.segger.com                             *\n**********************************************************************\n\nFile          :\nCreated       : 31. Jan 2026 16:34\nOzone Version : V3.40e\n*/\n\n/*********************************************************************\n*\n*       OnProjectLoad\n*\n* Function description\n*   Project load routine. Required.\n*\n**********************************************************************\n*/\nvoid OnProjectLoad (void) {\n  //\n  // Dialog-generated settings\n  //\n  Project.SetDevice (\"STM32N657X0\");\n  Project.SetHostIF (\"USB\", \"\");\n  Project.SetTargetIF (\"SWD\");\n  Project.SetTIFSpeed (\"4 MHz\");\n  Project.AddSvdFile (\"$(InstallDir)/Config/CPU/Cortex-M55F.svd\");\n  //\n  // User settings\n  //\n  File.Open (\"$(ProjectDir)/../../../examples/device/cdc_msc/build/stm32n6570dk/RelWithDebInfo/cdc_msc.elf\");\n}\n\n/*********************************************************************\n*\n*       OnStartupComplete\n*\n* Function description\n*   Called when program execution has reached/passed\n*   the startup completion point. Optional.\n*\n**********************************************************************\n*/\n//void OnStartupComplete (void) {\n//}\n\n/*********************************************************************\n*\n*      TargetReset\n*\n* Function description\n*   Replaces the default target device reset routine. Optional.\n*\n* Notes\n*   This example demonstrates the usage when\n*   debugging an application in RAM on a Cortex-M target device.\n*\n**********************************************************************\n*/\n//void TargetReset (void) {\n//\n//  unsigned int SP;\n//  unsigned int PC;\n//  unsigned int VectorTableAddr;\n//\n//  VectorTableAddr = Elf.GetBaseAddr();\n//  //\n//  // Set up initial stack pointer\n//  //\n//  if (VectorTableAddr != 0xFFFFFFFF) {\n//    SP = Target.ReadU32(VectorTableAddr);\n//    Target.SetReg(\"SP\", SP);\n//  }\n//  //\n//  // Set up entry point PC\n//  //\n//  PC = Elf.GetEntryPointPC();\n//\n//  if (PC != 0xFFFFFFFF) {\n//    Target.SetReg(\"PC\", PC);\n//  } else if (VectorTableAddr != 0xFFFFFFFF) {\n//    PC = Target.ReadU32(VectorTableAddr + 4);\n//    Target.SetReg(\"PC\", PC);\n//  } else {\n//    Util.Error(\"Project file error: failed to set entry point PC\", 1);\n//  }\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetReset\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetReset (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetReset\n*\n* Function description\n*   Event handler routine. Optional.\n*   The default implementation initializes SP and PC to reset values.\n**\n**********************************************************************\n*/\nvoid AfterTargetReset (void) {\n  _SetupTarget();\n}\n\n/*********************************************************************\n*\n*       DebugStart\n*\n* Function description\n*   Replaces the default debug session startup routine. Optional.\n*\n**********************************************************************\n*/\n//void DebugStart (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetConnect\n*\n* Function description\n*   Replaces the default target IF connection routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetConnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetConnect (void) {\n//}\n\n/*********************************************************************\n*\n*       TargetDownload\n*\n* Function description\n*   Replaces the default program download routine. Optional.\n*\n**********************************************************************\n*/\n//void TargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDownload (void) {\n//}\n\n/*********************************************************************\n*\n*      AfterTargetDownload\n*\n* Function description\n*   Event handler routine. Optional.\n*   The default implementation initializes SP and PC to reset values.\n*\n**********************************************************************\n*/\nvoid AfterTargetDownload (void) {\n  //_SetupTarget();\n}\n\n/*********************************************************************\n*\n*       BeforeTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetDisconnect\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetDisconnect (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterTargetHalt\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterTargetHalt (void) {\n//}\n\n/*********************************************************************\n*\n*       BeforeTargetResume\n*\n* Function description\n*   Event handler routine. Optional.\n*\n**********************************************************************\n*/\n//void BeforeTargetResume (void) {\n//}\n\n/*********************************************************************\n*\n*       OnSnapshotLoad\n*\n* Function description\n*   Called upon loading a snapshot. Optional.\n*\n* Additional information\n*   This function is used to restore the target state in cases\n*   where values cannot simply be written to the target.\n*   Typical use: GPIO clock needs to be enabled, before\n*   GPIO is configured.\n*\n**********************************************************************\n*/\n//void OnSnapshotLoad (void) {\n//}\n\n/*********************************************************************\n*\n*       OnSnapshotSave\n*\n* Function description\n*   Called upon saving a snapshot. Optional.\n*\n* Additional information\n*   This function is usually used to save values of the target\n*   state which can either not be trivially read,\n*   or need to be restored in a specific way or order.\n*   Typically use: Memory Mapped Registers,\n*   such as PLL and GPIO configuration.\n*\n**********************************************************************\n*/\n//void OnSnapshotSave (void) {\n//}\n\n/*********************************************************************\n*\n*       OnError\n*\n* Function description\n*   Called when an error occurred. Optional.\n*\n**********************************************************************\n*/\n//void OnError (void) {\n//}\n\n/*********************************************************************\n*\n*       AfterProjectLoad\n*\n* Function description\n*   After Project load routine. Optional.\n*\n**********************************************************************\n*/\n//void AfterProjectLoad (void) {\n//}\n\n/*********************************************************************\n*\n*       OnDebugStartBreakSymbolReached\n*\n* Function description\n*   Called when program execution has reached/passed\n*   the symbol to be breaked at during debug start. Optional.\n*\n**********************************************************************\n*/\n//void OnDebugStartBreakSymReached (void) {\n//}\n\n/*********************************************************************\n*\n*       _SetupTarget\n*\n* Function description\n*   Setup the target.\n*   Called by AfterTargetReset() and AfterTargetDownload().\n*\n*   Auto-generated function. May be overridden by Ozone.\n*\n**********************************************************************\n*/\nvoid _SetupTarget(void) {\n  unsigned int SP;\n  unsigned int PC;\n  unsigned int VectorTableAddr;\n\n\tDebug.Download();\n  Debug.Halt();\n\n  VectorTableAddr = Elf.GetBaseAddr();\n  //\n  // Set up initial stack pointer\n  //\n  SP = Target.ReadU32(VectorTableAddr);\n  if (SP != 0xFFFFFFFF) {\n    Target.SetReg(\"SP\", SP);\n  }\n  //\n  // Set up entry point PC\n  //\n  PC = Elf.GetEntryPointPC();\n  if (PC != 0xFFFFFFFF) {\n    Target.SetReg(\"PC\", PC);\n  } else {\n    Util.Error(\"Project script error: failed to set up entry point PC\", 1);\n  }\n}\n"
  },
  {
    "path": "hw/bsp/stm32n6/stm32n6xx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32n6xx_hal_conf_template.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration template file.\n  *          This file should be copied to the application folder and renamed\n  *          to stm32n6xx_hal_conf.h.\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2023 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32N6xx_HAL_CONF_H\n#define STM32N6xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/*#define HAL_ADC_MODULE_ENABLED      */\n/*#define HAL_BSEC_MODULE_ENABLED     */\n/*#define HAL_CRC_MODULE_ENABLED      */\n/*#define HAL_CRYP_MODULE_ENABLED     */\n/*#define HAL_DCMI_MODULE_ENABLED     */\n/*#define HAL_DCMIPP_MODULE_ENABLED   */\n/*#define HAL_DMA2D_MODULE_ENABLED    */\n/*#define HAL_DTS_MODULE_ENABLED      */\n/*#define HAL_ETH_MODULE_ENABLED      */\n/*#define HAL_EXTI_MODULE_ENABLED     */\n/*#define HAL_FDCAN_MODULE_ENABLED    */\n/*#define HAL_GFXMMU_MODULE_ENABLED   */\n/*#define HAL_GFXTIM_MODULE_ENABLED   */\n/*#define HAL_HASH_MODULE_ENABLED     */\n/*#define HAL_HCD_MODULE_ENABLED      */\n#define HAL_I2C_MODULE_ENABLED\n/*#define HAL_I2S_MODULE_ENABLED      */\n/*#define HAL_I3C_MODULE_ENABLED      */\n/*#define HAL_ICACHE_MODULE_ENABLED   */\n/*#define HAL_IRDA_MODULE_ENABLED     */\n/*#define HAL_IWDG_MODULE_ENABLED     */\n/*#define HAL_JPEG_MODULE_ENABLED     */\n/*#define HAL_LPTIM_MODULE_ENABLED    */\n/*#define HAL_LTDC_MODULE_ENABLED     */\n/*#define HAL_MCE_MODULE_ENABLED      */\n/*#define HAL_MDF_MODULE_ENABLED      */\n/*#define HAL_MMC_MODULE_ENABLED      */\n/*#define HAL_NAND_MODULE_ENABLED     */\n/*#define HAL_NOR_MODULE_ENABLED      */\n/*#define HAL_PCD_MODULE_ENABLED      */\n/*#define HAL_PKA_MODULE_ENABLED      */\n/*#define HAL_PSSI_MODULE_ENABLED     */\n/*#define HAL_RAMCFG_MODULE_ENABLED   */\n#define HAL_RIF_MODULE_ENABLED\n/*#define HAL_RNG_MODULE_ENABLED      */\n/*#define HAL_RTC_MODULE_ENABLED      */\n/*#define HAL_SAI_MODULE_ENABLED      */\n/*#define HAL_SD_MODULE_ENABLED       */\n/*#define HAL_SDIO_MODULE_ENABLED     */\n/*#define HAL_SDRAM_MODULE_ENABLED    */\n/*#define HAL_SMARTCARD_MODULE_ENABLED*/\n/*#define HAL_SMBUS_MODULE_ENABLED    */\n/*#define HAL_SPDIFRX_MODULE_ENABLED  */\n/*#define HAL_SPI_MODULE_ENABLED      */\n/*#define HAL_SRAM_MODULE_ENABLED     */\n/*#define HAL_TIM_MODULE_ENABLED      */\n#define HAL_UART_MODULE_ENABLED\n/*#define HAL_USART_MODULE_ENABLED    */\n/*#define HAL_WWDG_MODULE_ENABLED     */\n/*#define HAL_XSPI_MODULE_ENABLED     */\n/*#define HAL_CACHEAXI_MODULE_ENABLED */\n/*#define HAL_MDIOS_MODULE_ENABLED    */\n/*#define HAL_GPU2D_MODULE_ENABLED    */\n/*#define HAL_CACHEAXI_MODULE_ENABLED */\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n#define HSE_VALUE              48000000UL /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n#define HSE_STARTUP_TIMEOUT    100UL   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n#define LSE_VALUE              32768UL   /*!< Value of the External oscillator in Hz */\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n#define LSE_STARTUP_TIMEOUT    5000UL     /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal Multiple Speed oscillator (MSI) default value.\n  *        This value is the default MSI range value after Reset.\n  */\n#if !defined  (MSI_VALUE)\n#define MSI_VALUE              4000000UL /*!< Value of the Internal oscillator in Hz */\n#endif /* MSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n#define HSI_VALUE              64000000UL /*!< Value of the Internal oscillator in Hz */\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n#define LSI_VALUE               32000UL    /*!< LSI Typical Value in Hz */\n#endif /* LSI_VALUE */                     /*!< Value of the Internal Low Speed oscillator in Hz */\n/* The real value may vary depending on the variations in voltage and temperature.*/\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                  3300UL /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY          15U  /*!< tick interrupt priority (lowest by default) */\n#define  USE_RTOS                   0U\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## Register callback feature configuration ############### */\n/**\n  * @brief Set below the peripheral configuration  to \"1U\" to add the support\n  *        of HAL callback registration/unregistration feature for the HAL\n  *        driver(s). This allows user application to provide specific callback\n  *        functions thanks to HAL_PPP_RegisterCallback() rather than overwriting\n  *        the default weak callback functions (see each stm32n6xx_hal_ppp.h file\n  *        for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef\n  *        for each PPP peripheral).\n  */\n#define  USE_HAL_ADC_REGISTER_CALLBACKS       0U /* ADC register callback disabled       */\n#define  USE_HAL_CACHEAXI_REGISTER_CALLBACKS  0U /* CACHEAXI register callback disabled  */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS      0U /* CRYP register callback disabled      */\n#define  USE_HAL_DCMI_REGISTER_CALLBACKS      0U /* DCMI register callback disabled      */\n#define  USE_HAL_DCMIPP_REGISTER_CALLBACKS    0U /* DCMIPP register callback disabled    */\n#define  USE_HAL_DMA2D_REGISTER_CALLBACKS     0U /* DMA2D register callback disabled     */\n#define  USE_HAL_DTS_REGISTER_CALLBACKS       0U /* DTS register callback disabled       */\n#define  USE_HAL_ETH_REGISTER_CALLBACKS       0U /* ETH register callback disabled       */\n#define  USE_HAL_FDCAN_REGISTER_CALLBACKS     0U /* FDCAN register callback disabled     */\n#define  USE_HAL_GFXMMU_REGISTER_CALLBACKS    0U /* GFXMMU register callback disabled    */\n#define  USE_HAL_GFXTIM_REGISTER_CALLBACKS    0U /* GFXTIM register callback disabled    */\n#define  USE_HAL_HASH_REGISTER_CALLBACKS      0U /* HASH register callback disabled      */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS       0U /* HCD register callback disabled       */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS       0U /* I2C register callback disabled       */\n#define  USE_HAL_I2S_REGISTER_CALLBACKS       0U /* I2S register callback disabled       */\n#define  USE_HAL_I3C_REGISTER_CALLBACKS       0U /* I3C register callback disabled       */\n#define  USE_HAL_IWDG_REGISTER_CALLBACKS      0U /* IWDG register callback disabled      */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS      0U /* IRDA register callback disabled      */\n#define  USE_HAL_LPTIM_REGISTER_CALLBACKS     0U /* LPTIM register callback disabled     */\n#define  USE_HAL_LTDC_REGISTER_CALLBACKS      0U /* LTDC register callback disabled      */\n#define  USE_HAL_MCE_REGISTER_CALLBACKS       0U /* MCE register callback disabled       */\n#define  USE_HAL_MDF_REGISTER_CALLBACKS       0U /* MDF register callback disabled       */\n#define  USE_HAL_MMC_REGISTER_CALLBACKS       0U /* MMC register callback disabled       */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS      0U /* NAND register callback disabled      */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS       0U /* NOR register callback disabled       */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS       0U /* PCD register callback disabled       */\n#define  USE_HAL_PKA_REGISTER_CALLBACKS       0U /* PKA register callback disabled       */\n#define  USE_HAL_PSSI_REGISTER_CALLBACKS      0U /* PSSI register callback disabled      */\n#define  USE_HAL_RAMCFG_REGISTER_CALLBACKS    0U /* RAMCFG register callback disabled    */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS       0U /* RNG register callback disabled       */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS       0U /* RTC register callback disabled       */\n#define  USE_HAL_SAI_REGISTER_CALLBACKS       0U /* SAI register callback disabled       */\n#define  USE_HAL_SD_REGISTER_CALLBACKS        0U /* SD register callback disabled        */\n#define  USE_HAL_SDIO_REGISTER_CALLBACKS      0U /* SDIO register callback disabled      */\n#define  USE_HAL_SDRAM_REGISTER_CALLBACKS     0U /* SDRAM register callback disabled     */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS     0U /* SMBUS register callback disabled     */\n#define  USE_HAL_SPDIFRX_REGISTER_CALLBACKS   0U /* SPDIFRX register callback disabled   */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS       0U /* SPI register callback disabled       */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS      0U /* SRAM register callback disabled      */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS       0U /* TIM register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS      0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS     0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS      0U /* WWDG register callback disabled      */\n#define  USE_HAL_XSPI_REGISTER_CALLBACKS      0U /* XSPI register callback disabled      */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n * Activated: CRC code is present inside driver\n * Deactivated: CRC code cleaned from driver\n */\n#define USE_SPI_CRC                   0U\n\n/* ################## SDMMC peripheral configuration ######################### */\n\n#define USE_SD_TRANSCEIVER            0U\n\n/* ################## SDIO peripheral configuration ########################## */\n#define USE_SDIO_TRANSCEIVER          1U\n#define SDIO_MAX_IO_NUMBER            7U /*!< SDIO device support maximum IO number */\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n#ifdef HAL_RCC_MODULE_ENABLED\n#include \"stm32n6xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n#include \"stm32n6xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_RIF_MODULE_ENABLED\n#include \"stm32n6xx_hal_rif.h\"\n#endif /* HAL_RIF_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n#include \"stm32n6xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CACHEAXI_MODULE_ENABLED\n#include \"stm32n6xx_hal_cacheaxi.h\"\n#endif /* HAL_CACHEAXI_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n#include \"stm32n6xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n#include \"stm32n6xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_BSEC_MODULE_ENABLED\n#include \"stm32n6xx_hal_bsec.h\"\n#endif /* HAL_BSEC_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n#include \"stm32n6xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n#include \"stm32n6xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DCMI_MODULE_ENABLED\n#include \"stm32n6xx_hal_dcmi.h\"\n#endif /* HAL_DCMI_MODULE_ENABLED */\n\n#ifdef HAL_DCMIPP_MODULE_ENABLED\n#include \"stm32n6xx_hal_dcmipp.h\"\n#endif /* HAL_DCMIPP_MODULE_ENABLED */\n\n#ifdef HAL_DMA2D_MODULE_ENABLED\n#include \"stm32n6xx_hal_dma2d.h\"\n#endif /* HAL_DMA2D_MODULE_ENABLED */\n\n#ifdef HAL_DTS_MODULE_ENABLED\n#include \"stm32n6xx_hal_dts.h\"\n#endif /* HAL_DTS_MODULE_ENABLED */\n\n#ifdef HAL_ETH_MODULE_ENABLED\n#include \"stm32n6xx_hal_eth.h\"\n#endif /* HAL_ETH_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n#include \"stm32n6xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FDCAN_MODULE_ENABLED\n#include \"stm32n6xx_hal_fdcan.h\"\n#endif /* HAL_FDCAN_MODULE_ENABLED */\n\n#ifdef HAL_GFXMMU_MODULE_ENABLED\n#include \"stm32n6xx_hal_gfxmmu.h\"\n#endif /* HAL_GFXMMU_MODULE_ENABLED */\n\n#ifdef HAL_GFXTIM_MODULE_ENABLED\n#include \"stm32n6xx_hal_gfxtim.h\"\n#endif /* HAL_GFXTIM_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n#include \"stm32n6xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_GPU2D_MODULE_ENABLED\n#include \"stm32n6xx_hal_gpu2d.h\"\n#endif /* HAL_GPU2D_MODULE_ENABLED */\n\n#ifdef HAL_HASH_MODULE_ENABLED\n#include \"stm32n6xx_hal_hash.h\"\n#endif /* HAL_HASH_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n#include \"stm32n6xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n#include \"stm32n6xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_I2S_MODULE_ENABLED\n #include \"stm32n6xx_hal_i2s.h\"\n#endif /* HAL_I2S_MODULE_ENABLED */\n\n#ifdef HAL_I3C_MODULE_ENABLED\n#include \"stm32n6xx_hal_i3c.h\"\n#endif /* HAL_I3C_MODULE_ENABLED */\n\n#ifdef HAL_ICACHE_MODULE_ENABLED\n#include \"stm32n6xx_hal_icache.h\"\n#endif /* HAL_ICACHE_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n#include \"stm32n6xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n#include \"stm32n6xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_JPEG_MODULE_ENABLED\n#include \"stm32n6xx_hal_jpeg.h\"\n#endif /* HAL_JPEG_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32n6xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_LTDC_MODULE_ENABLED\n#include \"stm32n6xx_hal_ltdc.h\"\n#endif /* HAL_LTDC_MODULE_ENABLED */\n\n#ifdef HAL_MCE_MODULE_ENABLED\n#include \"stm32n6xx_hal_mce.h\"\n#endif /* HAL_MCE_MODULE_ENABLED */\n\n#ifdef HAL_MDF_MODULE_ENABLED\n#include \"stm32n6xx_hal_mdf.h\"\n#endif /* HAL_MDF_MODULE_ENABLED */\n\n#ifdef HAL_MDIOS_MODULE_ENABLED\n#include \"stm32n6xx_hal_mdios.h\"\n#endif /* HAL_MDIOS_MODULE_ENABLED */\n\n#ifdef HAL_MMC_MODULE_ENABLED\n#include \"stm32n6xx_hal_mmc.h\"\n#endif /* HAL_MMC_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n#include \"stm32n6xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n#include \"stm32n6xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n#include \"stm32n6xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n#include \"stm32n6xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PKA_MODULE_ENABLED\n#include \"stm32n6xx_hal_pka.h\"\n#endif /* HAL_PKA_MODULE_ENABLED */\n\n#ifdef HAL_PSSI_MODULE_ENABLED\n#include \"stm32n6xx_hal_pssi.h\"\n#endif /* HAL_PSSI_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n#include \"stm32n6xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RAMCFG_MODULE_ENABLED\n#include \"stm32n6xx_hal_ramcfg.h\"\n#endif /* HAL_RAMCFG_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n#include \"stm32n6xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n#include \"stm32n6xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n#include \"stm32n6xx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n#include \"stm32n6xx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SDIO_MODULE_ENABLED\n#include \"stm32n6xx_hal_sdio.h\"\n#endif /* HAL_SDIO_MODULE_ENABLED */\n\n#ifdef HAL_SDRAM_MODULE_ENABLED\n#include \"stm32n6xx_hal_sdram.h\"\n#endif /* HAL_SDRAM_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n#include \"stm32n6xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n#include \"stm32n6xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPDIFRX_MODULE_ENABLED\n#include \"stm32n6xx_hal_spdifrx.h\"\n#endif /* HAL_SPDIFRX_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n#include \"stm32n6xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n#include \"stm32n6xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n#include \"stm32n6xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n#include \"stm32n6xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n#include \"stm32n6xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n#include \"stm32n6xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_XSPI_MODULE_ENABLED\n#include \"stm32n6xx_hal_xspi.h\"\n#endif /* HAL_XSPI_MODULE_ENABLED */\n\n/* Exported macros -----------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\nvoid assert_failed(uint8_t *file, uint32_t line);\n#else\n#define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32N6xx_HAL_CONF_H */\n"
  },
  {
    "path": "hw/bsp/stm32u0/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32u0xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        0\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 200 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       2\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32u0/boards/stm32u083cdk/board.cmake",
    "content": "set(MCU_VARIANT stm32u083xx)\nset(JLINK_DEVICE stm32u083mc)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32U083xx\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u0/boards/stm32u083cdk/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32U083C-DK Discovery Kit\n   url: https://www.st.com/en/evaluation-tools/stm32u083c-dk.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED - using PA5 (Blue LED from CubeMX)\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          1\n\n// Button - using PC2 (from CubeMX generated code)\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_2\n#define BUTTON_STATE_ACTIVE   0  // Active low (pressed = 0)\n\n// UART - using USART2 on PA2/PA3 (VCP TX/RX from CubeMX)\n#define UART_DEV              USART2\n#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF7_USART2\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef  PeriphClkInit = {0};\n\n  /** Configure the main internal regulator output voltage\n  */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the RCC Oscillators according to the specified parameters\n  * in the RCC_OscInitTypeDef structure.\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_HSI48;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;\n  RCC_OscInitStruct.PLL.PLLN = 7;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;\n  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK\n                              |RCC_CLOCKTYPE_PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1);\n\n  /** Enable the CRS clock\n  */\n  __HAL_RCC_CRS_CLK_ENABLE();\n\n  /** Configures CRS\n  */\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n  RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;\n  RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000,1000);\n  RCC_CRSInitStruct.ErrorLimitValue = 34;\n  RCC_CRSInitStruct.HSI48CalibrationValue = 32;\n  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;\n  PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n}\n\nstatic inline void board_vbus_sense_init(void)\n{\n  // USB VBUS sensing not required for device-only operation\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32u0/boards/stm32u083cdk/board.mk",
    "content": "MCU_VARIANT = stm32u083xx\nCFLAGS += \\\n  -DSTM32U083xx\n\n# For flash-jlink target\nJLINK_DEVICE = STM32U083MC\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32u0/boards/stm32u083nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32u083xx)\nset(JLINK_DEVICE stm32u083rc)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32U083xx\n    CFG_EXAMPLE_VIDEO_READONLY\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u0/boards/stm32u083nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: NUCLEO-U083RC\n   url: https://www.st.com/en/evaluation-tools/nucleo-u083rc.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED: PA5 (LD4, Green)\n#define LED_PORT              GPIOA\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          1\n\n// Button: PC13 (B1, Blue)\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   0\n\n// UART: USART2 on PA2/PA3 (VCP via ST-Link)\n#define UART_DEV              USART2\n#define UART_CLK_EN           __HAL_RCC_USART2_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOA\n#define UART_GPIO_AF          GPIO_AF7_USART2\n#define UART_TX_PIN           GPIO_PIN_2\n#define UART_RX_PIN           GPIO_PIN_3\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSI48;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV1;\n  RCC_OscInitStruct.PLL.PLLN = 7;\n  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;\n  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;\n  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK\n                              | RCC_CLOCKTYPE_PCLK1;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n}\n\nstatic inline void board_vbus_sense_init(void) {\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32u0/boards/stm32u083nucleo/board.mk",
    "content": "MCU_VARIANT = stm32u083xx\nCFLAGS += \\\n  -DSTM32U083xx\n\n# For flash-jlink target\nJLINK_DEVICE = STM32U083RC\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32u0/boards/stm32u083nucleo/cubemx/cubemx.ioc",
    "content": "#MicroXplorer Configuration settings - do not modify\nBSP_IP_NAME=NUCLEO-U083RC\nCAD.formats=[]\nCAD.pinconfig=Dual\nCAD.provider=\nFile.Version=6\nGPIO.groupedBy=\nKeepUserPlacement=false\nMcu.CPN=STM32U083RCT6\nMcu.Family=STM32U0\nMcu.IP0=CORTEX_M0+\nMcu.IP1=NVIC\nMcu.IP2=PWR\nMcu.IP3=RCC\nMcu.IP4=SYS\nMcu.IP5=USART2\nMcu.IP6=USB\nMcu.IP7=NUCLEO-U083RC\nMcu.IPNb=8\nMcu.Name=STM32U083RCTx\nMcu.Package=LQFP64\nMcu.Pin0=PC14-OSC32_IN\nMcu.Pin1=PC15-OSC32_OUT\nMcu.Pin10=VP_PWR_VS_SECSignals\nMcu.Pin11=VP_SYS_VS_Systick\nMcu.Pin2=PF0-OSC_IN\nMcu.Pin3=PF1-OSC_OUT\nMcu.Pin4=PA2\nMcu.Pin5=PA3\nMcu.Pin6=PA11 [PA9]\nMcu.Pin7=PA12 [PA10]\nMcu.Pin8=PA13 (SWDIO)\nMcu.Pin9=PA14 (SWCLK)\nMcu.PinsNb=12\nMcu.ThirdPartyNb=0\nMcu.UserConstants=\nMcu.UserName=STM32U083RCTx\nMxCube.Version=6.17.0\nMxDb.Version=DB.6.0.170\nNVIC.ForceEnableDMAVector=true\nNVIC.HardFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.NonMaskableInt_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.PendSV_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.PriorityGroup=NVIC_PRIORITYGROUP_2\nNVIC.SVCall_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\nNVIC.SysTick_IRQn=true\\:3\\:0\\:false\\:false\\:true\\:false\\:true\\:false\nPA11\\ [PA9].Mode=Device\nPA11\\ [PA9].Signal=USB_DM\nPA12\\ [PA10].Mode=Device\nPA12\\ [PA10].Signal=USB_DP\nPA13\\ (SWDIO).GPIOParameters=GPIO_Label\nPA13\\ (SWDIO).GPIO_Label=SWDIO\nPA13\\ (SWDIO).Locked=true\nPA13\\ (SWDIO).Signal=DEBUG_JTMS-SWDIO\nPA14\\ (SWCLK).GPIOParameters=GPIO_Label\nPA14\\ (SWCLK).GPIO_Label=SWCLK\nPA14\\ (SWCLK).Locked=true\nPA14\\ (SWCLK).Signal=DEBUG_JTCK-SWCLK\nPA2.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd\nPA2.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP\nPA2.GPIO_PuPd=GPIO_NOPULL\nPA2.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPA2.Locked=true\nPA2.Mode=Asynchronous\nPA2.Signal=USART2_TX\nPA3.GPIOParameters=GPIO_ModeDefaultPP,GPIO_Speed,GPIO_PuPd\nPA3.GPIO_ModeDefaultPP=GPIO_MODE_AF_PP\nPA3.GPIO_PuPd=GPIO_NOPULL\nPA3.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPA3.Locked=true\nPA3.Mode=Asynchronous\nPA3.Signal=USART2_RX\nPC14-OSC32_IN.GPIOParameters=GPIO_Label\nPC14-OSC32_IN.GPIO_Label=OSC32_IN\nPC14-OSC32_IN.Locked=true\nPC14-OSC32_IN.Mode=LSE-External-Oscillator-for-RTC\nPC14-OSC32_IN.Signal=RCC_OSC32_IN\nPC15-OSC32_OUT.GPIOParameters=GPIO_Label\nPC15-OSC32_OUT.GPIO_Label=OSC32_OUT\nPC15-OSC32_OUT.Locked=true\nPC15-OSC32_OUT.Mode=LSE-External-Oscillator-for-RTC\nPC15-OSC32_OUT.Signal=RCC_OSC32_OUT\nPCC.Checker=false\nPCC.Display=Plot\\: All Steps\nPCC.Line=STM32U0x3\nPCC.MCU=STM32U083RCTx\nPCC.PartNumber=STM32U083RCTx\nPCC.Series=STM32U0\nPCC.Temperature=25\nPCC.Vdd=3.0\nPF0-OSC_IN.GPIOParameters=GPIO_Label\nPF0-OSC_IN.GPIO_Label=OSC_IN\nPF0-OSC_IN.Locked=true\nPF0-OSC_IN.Signal=RCC_OSC_IN\nPF1-OSC_OUT.GPIOParameters=GPIO_Label\nPF1-OSC_OUT.GPIO_Label=OSC_OUT\nPF1-OSC_OUT.Locked=true\nPF1-OSC_OUT.Signal=RCC_OSC_OUT\nPinOutPanel.RotationAngle=0\nProjectManager.AskForMigrate=true\nProjectManager.BackupPrevious=false\nProjectManager.CompilerLinker=GCC\nProjectManager.CompilerOptimize=6\nProjectManager.ComputerToolchain=false\nProjectManager.CoupleFile=false\nProjectManager.CustomerFirmwarePackage=\nProjectManager.DefaultFWLocation=true\nProjectManager.DeletePrevious=true\nProjectManager.DeviceId=STM32U083RCTx\nProjectManager.FirmwarePackage=STM32Cube FW_U0 V1.3.0\nProjectManager.FreePins=false\nProjectManager.FreePinsContext=\nProjectManager.HalAssertFull=false\nProjectManager.HeapSize=0x200\nProjectManager.KeepUserCode=true\nProjectManager.LastFirmware=true\nProjectManager.LibraryCopy=2\nProjectManager.MainLocation=Core/Src\nProjectManager.NoMain=false\nProjectManager.PreviousToolchain=\nProjectManager.ProjectBuild=false\nProjectManager.ProjectFileName=cubemx.ioc\nProjectManager.ProjectName=cubemx\nProjectManager.ProjectStructure=\nProjectManager.RegisterCallBack=\nProjectManager.StackSize=0x400\nProjectManager.TargetToolchain=CMake\nProjectManager.ToolChainLocation=\nProjectManager.UAScriptAfterPath=\nProjectManager.UAScriptBeforePath=\nProjectManager.UnderRoot=false\nProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_USART2_UART_Init-USART2-false-HAL-true,4-MX_USB_PCD_Init-USB-false-HAL-true,0-MX_CORTEX_M0+_Init-CORTEX_M0+-false-HAL-true,0-MX_PWR_Init-PWR-false-HAL-true\nRCC.ADCFreq_Value=56000000\nRCC.AHBFreq_Value=56000000\nRCC.APBFreq_Value=56000000\nRCC.APBTimFreq_Value=56000000\nRCC.CortexFreq_Value=56000000\nRCC.FCLKCortexFreq_Value=56000000\nRCC.FamilyName=M\nRCC.HCLKFreq_Value=56000000\nRCC.HSE_VALUE=4000000\nRCC.HSI48_VALUE=48000000\nRCC.HSI_VALUE=16000000\nRCC.I2C1Freq_Value=56000000\nRCC.I2C3Freq_Value=56000000\nRCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APBFreq_Value,APBTimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM3Freq_Value,LPUART1Freq_Value,LPUART2Freq_Value,LPUART3Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,MSIClockRangeVal,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQ,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PWRFreq_Value,RNGFreq_Value,SYSCLKFreq_VALUE,SYSCLKSource,TIM15Freq_Value,TIM1Freq_Value,USART1Freq_Value,USART2Freq_Value,USBCLockSelection,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value\nRCC.LPTIM1Freq_Value=56000000\nRCC.LPTIM2Freq_Value=56000000\nRCC.LPTIM3Freq_Value=56000000\nRCC.LPUART1Freq_Value=56000000\nRCC.LPUART2Freq_Value=56000000\nRCC.LPUART3Freq_Value=56000000\nRCC.LSCOPinFreq_Value=32000\nRCC.LSI_VALUE=32000\nRCC.MCO1PinFreq_Value=56000000\nRCC.MCO2PinFreq_Value=56000000\nRCC.MSIClockRangeVal=RCC_MSIRANGE_11\nRCC.MSI_VALUE=48000000\nRCC.PLLN=7\nRCC.PLLPoutputFreq_Value=56000000\nRCC.PLLQ=RCC_PLLQ_DIV4\nRCC.PLLQoutputFreq_Value=28000000\nRCC.PLLRCLKFreq_Value=56000000\nRCC.PWRFreq_Value=56000000\nRCC.RNGFreq_Value=48000000\nRCC.SYSCLKFreq_VALUE=56000000\nRCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK\nRCC.TIM15Freq_Value=56000000\nRCC.TIM1Freq_Value=56000000\nRCC.USART1Freq_Value=56000000\nRCC.USART2Freq_Value=56000000\nRCC.USBCLockSelection=RCC_USBCLKSOURCE_HSI48\nRCC.USBFreq_Value=48000000\nRCC.VCOInputFreq_Value=16000000\nRCC.VCOOutputFreq_Value=112000000\nUSART2.IPParameters=VirtualMode-Asynchronous\nUSART2.VirtualMode-Asynchronous=VM_ASYNC\nUSB.IPParameters=VirtualMode\nUSB.VirtualMode=Device_Only\nVP_PWR_VS_SECSignals.Mode=Security/Privilege\nVP_PWR_VS_SECSignals.Signal=PWR_VS_SECSignals\nVP_SYS_VS_Systick.Mode=SysTick\nVP_SYS_VS_Systick.Signal=SYS_VS_Systick\nboard=NUCLEO-U083RC\nboardIOC=true\n"
  },
  {
    "path": "hw/bsp/stm32u0/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32u0xx_hal.h\"\n#include \"bsp/board_api.h\"\n\nTU_ATTR_UNUSED static void Error_Handler(void) { }\n\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_DRD_FS_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#ifdef UART_DEV\nUART_HandleTypeDef UartHandle;\n#endif\n\nvoid board_init(void) {\n  SystemClock_Config();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n#ifdef GPIOD\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n#endif\n#ifdef GPIOE\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n#endif\n#ifdef GPIOF\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n#endif\n#ifdef GPIOG\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n#endif\n#ifdef GPIOH\n  __HAL_RCC_GPIOH_CLK_ENABLE();\n#endif\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  // LED\n  GPIO_InitTypeDef  GPIO_InitStruct;\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = BUTTON_STATE_ACTIVE ? GPIO_PULLDOWN : GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n#ifdef UART_DEV\n  // UART\n  GPIO_InitStruct.Pin       = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode      = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull      = GPIO_PULLUP;\n  GPIO_InitStruct.Speed     = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UART_CLK_EN();\n  UartHandle.Instance        = UART_DEV;\n  UartHandle.Init.BaudRate   = CFG_BOARD_UART_BAUDRATE;\n  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;\n  UartHandle.Init.StopBits   = UART_STOPBITS_1;\n  UartHandle.Init.Parity     = UART_PARITY_NONE;\n  UartHandle.Init.HwFlowCtl  = UART_HWCONTROL_NONE;\n  UartHandle.Init.Mode       = UART_MODE_TX_RX;\n  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;\n  HAL_UART_Init(&UartHandle);\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_DRD_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  // USB Pins TODO double check USB clock and pin setup\n  // Configure USB DM and DP pins. This is optional, and maintained only for user guidance.\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_USB;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  // Enable VDDUSB\n  HAL_PWREx_EnableVddUSB();\n  // USB Clock enable\n  __HAL_RCC_USB_CLK_ENABLE();\n\n  board_vbus_sense_init();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState) (state ? LED_STATE_ON : (1-LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n#ifdef UART_DEV\n  (void) buf; (void) len;\n  return 0;\n#else\n  return 0;\n#endif\n}\n\nint board_uart_write(void const * buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t*)(uintptr_t) buf, len, 0xffff);\n  return len;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n#endif\n\nvoid HardFault_Handler(void) {\n  __asm(\"BKPT #0\\n\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n\n}\n"
  },
  {
    "path": "hw/bsp/stm32u0/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY u0)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis-device-${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m0plus CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32U0 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nstring(REPLACE \"stm32u\" \"STM32U\" MCU_VARIANT_UPPER ${MCU_VARIANT})\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nif (NOT DEFINED LD_FILE_GNU)\n  set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/${MCU_VARIANT_UPPER}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nif (NOT DEFINED LD_FILE_IAR)\n  set(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\nendif ()\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32U0)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u0/family.mk",
    "content": "ST_FAMILY = u0\nST_CMSIS = hw/mcu/st/cmsis-device-$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m0plus\n\nCFLAGS += \\\n  -DCFG_EXAMPLE_MSC_READONLY \\\n  -DCFG_EXAMPLE_VIDEO_READONLY \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32U0\n\n# mcu driver cause following warnings\nCFLAGS_GCC += \\\n  -flto \\\n\t-Wno-error=unused-parameter \\\n\t-Wno-error=redundant-decls \\\n\t-Wno-error=cast-align \\\n\t-Wno-error=maybe-uninitialized \\\n\nCFLAGS_CLANG += \\\n  -Wno-error=parentheses-equality\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n  src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n  src/portable/st/stm32_fsdev/fsdev_common.c \\\n  $(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n  ${ST_HAL_DRIVER}/Src/stm32$(ST_FAMILY)xx_hal_pwr_ex.c \\\n  $(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n  $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n  $(TOP)/$(ST_CMSIS)/Include \\\n  $(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_${MCU_VARIANT}.s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_${MCU_VARIANT}.s\n\n# Linker\nMCU_VARIANT_UPPER = $(subst stm32u,STM32U,$(MCU_VARIANT))\nLD_FILE ?= $(FAMILY_PATH)/linker/$(MCU_VARIANT_UPPER)_FLASH.ld\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n"
  },
  {
    "path": "hw/bsp/stm32u0/linker/STM32U083xx_FLASH.ld",
    "content": "/**\n  ******************************************************************************\n  * @file      LinkerScript.ld\n  * @author    Auto-generated by STM32CubeIDE\n  * @brief     Linker script for STM32U083xx Device from STM32U0 series\n  *            256KBytes FLASH\n  *            40KBytes RAM\n  *\n  *            Set heap size, stack size and stack location according\n  *            to application requirements.\n  *\n  *            Set memory bank area and size if external memory is used\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2023 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 40K\n  FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 256K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200;  /* required amount of heap */\n_Min_Stack_Size = 0x800; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab   : {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM : {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array     :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u0/linker/stm32u083xx_flash.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x08000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__ = 0x08000000;\ndefine symbol __ICFEDIT_region_ROM_end__   = 0x0803FFFF;\ndefine symbol __ICFEDIT_region_RAM_start__ = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__   = 0x20007FFF;\n\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__ = 0x800;\ndefine symbol __ICFEDIT_size_heap__   = 0x200;\n/**** End of ICF editor section. ###ICF###*/\n\n\ndefine memory mem with size = 4G;\ndefine region ROM_region      = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region      = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\ndo not initialize  { section .noinit };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\n\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/stm32u0/stm32u0xx_hal_conf.h",
    "content": "/* USER CODE BEGIN Header */\n/**\n  ******************************************************************************\n  * @file    stm32u0xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2023 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n/* USER CODE END Header */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32U0xx_HAL_CONF_H\n#define __STM32U0xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n\n#define HAL_MODULE_ENABLED\n/* #define HAL_ADC_MODULE_ENABLED   */\n/* #define HAL_COMP_MODULE_ENABLED   */\n/* #define HAL_CRC_MODULE_ENABLED   */\n/* #define HAL_CRS_MODULE_ENABLED   */\n/* #define HAL_CRYP_MODULE_ENABLED   */\n/* #define HAL_DAC_MODULE_ENABLED   */\n/* #define HAL_I2C_MODULE_ENABLED   */\n/* #define HAL_IRDA_MODULE_ENABLED   */\n/* #define HAL_IWDG_MODULE_ENABLED   */\n/* #define HAL_LCD_MODULE_ENABLED   */\n/* #define HAL_LPTIM_MODULE_ENABLED   */\n/* #define HAL_OPAMP_MODULE_ENABLED   */\n#define HAL_PCD_MODULE_ENABLED\n/* #define HAL_RNG_MODULE_ENABLED   */\n/* #define HAL_RTC_MODULE_ENABLED   */\n/* #define HAL_SPI_MODULE_ENABLED   */\n/* #define HAL_SMARTCARD_MODULE_ENABLED   */\n/* #define HAL_TIM_MODULE_ENABLED   */\n/* #define HAL_TSC_MODULE_ENABLED   */\n#define HAL_UART_MODULE_ENABLED\n/* #define HAL_USART_MODULE_ENABLED   */\n/* #define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE              4000000U /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    100U   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal Multiple Speed oscillator (MSI) default value.\n  *        This value is the default MSI range value after Reset.\n  */\n#if !defined  (MSI_VALUE)\n  #define MSI_VALUE              4000000U /*!< Value of the Internal oscillator in Hz*/\n#endif /* MSI_VALUE */\n\n/**\n * @brief Internal Multiple Speed oscillator (MSI) default value.\n *        This value is the default MSI range value after Reset.\n */\n#if !defined  (MSI32_VALUE)\n#define MSI32_VALUE            32000000U /*!< Value of the Internal oscillator in Hz*/\n#endif /* MSI32_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE              16000000U /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI48) value for USB FS and RNG.\n  *        This internal oscillator is mainly dedicated to provide a high precision clock to\n  *        the USB peripheral by means of a special Clock Recovery System (CRS) circuitry.\n  *        When the CRS is not used, the HSI48 RC oscillator runs on it default frequency\n  *        which is subject to manufacturing process variations.\n  */\n#if !defined  (HSI48_VALUE)\n  #define HSI48_VALUE             48000000U /*!< Value of the Internal High Speed oscillator for USB FS/RNG in Hz.\n                                               The real value my vary depending on manufacturing process variations.*/\n#endif /* HSI48_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n  #define LSI_VALUE  32000U     /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                     /*!< Value of the Internal Low Speed oscillator in Hz\n                                                The real value may vary depending on the variations\n                                                in voltage and temperature.*/\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n  #define LSE_VALUE              32768U    /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    5000U   /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n\n#define  VDD_VALUE                    3300U /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            (3U)    /*!< tick interrupt priority (lowest by default) */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              0U\n#define  INSTRUCTION_CACHE_ENABLE     1U\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## Register callback feature configuration ############### */\n/**\n  * @brief Set below the peripheral configuration  to \"1U\" to add the support\n  *        of HAL callback registration/unregistration feature for the HAL\n  *        driver(s). This allows user application to provide specific callback\n  *        functions thanks to HAL_PPP_RegisterCallback() rather than overwriting\n  *        the default weak callback functions (see each stm32u0xx_hal_ppp.h file\n  *        for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef\n  *        for each PPP peripheral).\n  */\n#define  USE_HAL_ADC_REGISTER_CALLBACKS        0U /* ADC register callback disabled       */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS       0U /* CRYP register callback disabled      */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS        0U /* DAC register callback disabled       */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS        0U /* I2C register callback disabled       */\n#define  USE_HAL_IWDG_REGISTER_CALLBACKS       0U /* IWDG register callback disabled      */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS       0U /* IRDA register callback disabled      */\n#define  USE_HAL_LPTIM_REGISTER_CALLBACKS      0U /* LPTIM register callback disabled     */\n#define  USE_HAL_LCD_REGISTER_CALLBACKS        0U /* LCD register callback disabled      */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS        0U /* PCD register callback disabled       */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS        0U /* RNG register callback disabled       */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS        0U /* RTC register callback disabled       */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS  0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS        0U /* SPI register callback disabled       */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS        0U /* TIM register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS       0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS      0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS       0U /* WWDG register callback disabled      */\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n#include \"stm32u0xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n#include \"stm32u0xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n#include \"stm32u0xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n#include \"stm32u0xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n#include \"stm32u0xx_hal_adc.h\"\n#include \"stm32u0xx_hal_adc_ex.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n#include \"stm32u0xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n#include \"stm32u0xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRS_MODULE_ENABLED\n#include \"stm32u0xx_ll_crs.h\"\n#endif /* HAL_CRS_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n#include \"stm32u0xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n#include \"stm32u0xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n#include \"stm32u0xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n#include \"stm32u0xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n#include \"stm32u0xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n#include \"stm32u0xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32u0xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_LCD_MODULE_ENABLED\n#include \"stm32u0xx_hal_lcd.h\"\n#endif /* HAL_LCD_MODULE_ENABLED */\n\n#ifdef HAL_OPAMP_MODULE_ENABLED\n#include \"stm32u0xx_hal_opamp.h\"\n#endif /* HAL_OPAMP_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n#include \"stm32u0xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n#include \"stm32u0xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n#include \"stm32u0xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n#include \"stm32u0xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n#include \"stm32u0xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_TSC_MODULE_ENABLED\n#include \"stm32u0xx_ll_system.h\"\n#include \"stm32u0xx_hal_tsc.h\"\n#endif /* HAL_TSC_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n#include \"stm32u0xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n#include \"stm32u0xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n#include \"stm32u0xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n#include \"stm32u0xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n#include \"stm32u0xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_LCD_MODULE_ENABLED\n#include \"stm32u0xx_hal_lcd.h\"\n#endif /* HAL_LCD_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n#include \"stm32u0xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t *file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32U0xx_HAL_CONF_H */\n"
  },
  {
    "path": "hw/bsp/stm32u5/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32u5xx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/b_u585i_iot2a/board.cmake",
    "content": "set(MCU_VARIANT stm32u585xx)\nset(JLINK_DEVICE stm32u585zi)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32U585xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/b_u585i_iot2a/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 B-U585i IOT2A Discovery kit\n   url: https://www.st.com/en/evaluation-tools/b-u585i-iot02a.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n// LED GREEN\n#define LED_PORT GPIOH\n#define LED_PIN GPIO_PIN_7\n#define LED_STATE_ON 0\n\n// BUTTON\n#define BUTTON_PORT GPIOC\n#define BUTTON_PIN GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE 1\n\n// UART Enable for STLink VCOM\n#define UART_DEV USART1\n#define UART_CLK_EN __HAL_RCC_USART1_CLK_ENABLE\n#define UART_GPIO_PORT GPIOA\n#define UART_GPIO_AF GPIO_AF7_USART1\n#define UART_TX_PIN GPIO_PIN_9\n#define UART_RX_PIN GPIO_PIN_10\n\n#define VBUS_SENSE_EN 0\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\nstatic void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };\n\n  /* Enable Power Clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /** Configure the main internal regulator output voltage\n   */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;\n  RCC_OscInitStruct.PLL.PLLM = 1;\n  RCC_OscInitStruct.PLL.PLLN = 10;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 1;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_1;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_CLK48;\n  PeriphClkInit.IclkClockSelection = RCC_CLK48CLKSOURCE_HSI48;\n\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n   */\n  RCC_ClkInitStruct.ClockType =\n      RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK3;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n}\n\nstatic void SystemPower_Config(void) {\n}\n\nstatic inline void board_vbus_sense_init(void) {\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/b_u585i_iot2a/board.mk",
    "content": "MCU_VARIANT = stm32u585xx\nCFLAGS += \\\n  -DSTM32U585xx \\\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/STM32U575xx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32u585zi\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u545nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32u545xx)\nset(JLINK_DEVICE stm32u545re)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32U545xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u545nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 U545 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-u545re-q.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n// LED GREEN\n#define LED_PORT GPIOA\n#define LED_PIN GPIO_PIN_5\n#define LED_STATE_ON 1\n\n// BUTTON\n#define BUTTON_PORT GPIOC\n#define BUTTON_PIN GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE 1\n\n// UART Enable for STLink VCOM\n#define UART_DEV LPUART1\n#define UART_CLK_EN __HAL_RCC_LPUART1_CLK_ENABLE\n#define UART_GPIO_PORT GPIOA\n#define UART_GPIO_AF GPIO_AF8_LPUART1\n#define UART_TX_PIN GPIO_PIN_2\n#define UART_RX_PIN GPIO_PIN_3\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\nstatic void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };\n\n  /* Enable Power Clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /** Configure the main internal regulator output voltage\n   */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;\n  RCC_OscInitStruct.PLL.PLLM = 1;\n  RCC_OscInitStruct.PLL.PLLN = 10;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 1;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_1;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_CLK48;\n  PeriphClkInit.IclkClockSelection = RCC_CLK48CLKSOURCE_HSI48;\n\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n   */\n  RCC_ClkInitStruct.ClockType =\n      RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK3;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n}\n\nstatic void SystemPower_Config(void) {\n}\n\nstatic inline void board_vbus_sense_init(void) {\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u545nucleo/board.mk",
    "content": "MCU_VARIANT = stm32u545xx\nCFLAGS += \\\n  -DSTM32U545xx \\\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/STM32U545xx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32u545re\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u575eval/board.cmake",
    "content": "set(MCU_VARIANT stm32u575xx)\nset(JLINK_DEVICE stm32u575ai)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32U575xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u575eval/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022, Hongtai Liu <lht856@foxmail.com>\n * Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 U575 Eval\n   url: https://www.st.com/en/evaluation-tools/stm32u575i-ev.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n// LED GREEN\n#define LED_PORT GPIOB\n#define LED_PIN GPIO_PIN_7\n#define LED_STATE_ON 1\n\n// // LED\n#define BUTTON_PORT GPIOC\n#define BUTTON_PIN GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE 1\n\n// UART Enable for STLink VCOM\n#define UART_DEV USART1\n#define UART_CLK_EN __HAL_RCC_USART1_CLK_ENABLE\n#define UART_GPIO_PORT GPIOA\n#define UART_GPIO_AF GPIO_AF7_USART1\n#define UART_TX_PIN GPIO_PIN_9\n#define UART_RX_PIN GPIO_PIN_10\n\n#define VBUS_SENSE_EN 0\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\nstatic void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };\n\n  /* Enable Power Clock*/\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /** Configure the main internal regulator output voltage\n   */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;\n  RCC_OscInitStruct.PLL.PLLM = 1;\n  RCC_OscInitStruct.PLL.PLLN = 10;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 1;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_1;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_CLK48;\n  PeriphClkInit.IclkClockSelection = RCC_CLK48CLKSOURCE_HSI48;\n\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n   */\n  RCC_ClkInitStruct.ClockType =\n      RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK3;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n}\n\nstatic void SystemPower_Config(void) {\n}\n\nstatic inline void board_vbus_sense_init(void) {\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u575eval/board.mk",
    "content": "MCU_VARIANT = stm32u575xx\nCFLAGS += \\\n  -DSTM32U575xx \\\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/STM32U575xx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32u575ai\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u575nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32u575xx)\nset(JLINK_DEVICE stm32u575zi)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32U575xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u575nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 U575 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-u575zi-q.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#include \"stm32u5xx_ll_tim.h\"\n\n// LED GREEN\n#define LED_PORT GPIOC\n#define LED_PIN GPIO_PIN_7\n#define LED_STATE_ON 1\n\n// BUTTON\n#define BUTTON_PORT GPIOA\n#define BUTTON_PIN GPIO_PIN_0\n#define BUTTON_STATE_ACTIVE 1\n\n// UART Enable for STLink VCOM\n#define UART_DEV LPUART1\n#define UART_CLK_EN __HAL_RCC_LPUART1_CLK_ENABLE\n#define UART_GPIO_PORT GPIOG\n#define UART_GPIO_AF GPIO_AF8_LPUART1\n#define UART_TX_PIN GPIO_PIN_7\n#define UART_RX_PIN GPIO_PIN_8\n\n#define VBUS_SENSE_EN 0\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\nstatic void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = { 0 };\n\n  /* Enable Power Clock */\n  __HAL_RCC_PWR_CLK_ENABLE();\n\n  /** Configure the main internal regulator output voltage\n   */\n  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSI;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;\n  RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;\n  RCC_OscInitStruct.PLL.PLLM = 1;\n  RCC_OscInitStruct.PLL.PLLN = 10;\n  RCC_OscInitStruct.PLL.PLLP = 2;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 1;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_1;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_CLK48;\n  PeriphClkInit.IclkClockSelection = RCC_CLK48CLKSOURCE_HSI48;\n\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit);\n\n  /** Initializes the CPU, AHB and APB buses clocks\n   */\n  RCC_ClkInitStruct.ClockType =\n      RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2 | RCC_CLOCKTYPE_PCLK3;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n}\n\nstatic void SystemPower_Config(void) {\n}\n\nstatic inline void board_vbus_sense_init(void) {\n  /* ADC config */\n  GPIO_InitTypeDef GPIO_InitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC;\n  PeriphClkInit.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HSE;\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)\n  {\n    Error_Handler();\n  }\n  __HAL_RCC_ADC12_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  GPIO_InitStruct.Pin = GPIO_PIN_2;\n  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);\n\n  ADC_HandleTypeDef hadc1;\n  hadc1.Instance = ADC1;\n  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;\n  hadc1.Init.Resolution = ADC_RESOLUTION_14B;\n  hadc1.Init.GainCompensation = 0;\n  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;\n  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;\n  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;\n  hadc1.Init.LowPowerAutoWait = DISABLE;\n  hadc1.Init.ContinuousConvMode = DISABLE;\n  hadc1.Init.NbrOfConversion = 1;\n  hadc1.Init.DiscontinuousConvMode = DISABLE;\n  hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;\n  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;\n  hadc1.Init.DMAContinuousRequests = DISABLE;\n  hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;\n  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;\n  hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;\n  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;\n  hadc1.Init.OversamplingMode = DISABLE;\n  if (HAL_ADC_Init(&hadc1) != HAL_OK) {\n    Error_Handler();\n  }\n\n  ADC_ChannelConfTypeDef sConfig = {0};\n  sConfig.Channel = ADC_CHANNEL_3;\n  sConfig.Rank = ADC_REGULAR_RANK_1;\n  sConfig.SamplingTime = ADC_SAMPLETIME_68CYCLES;\n  sConfig.SingleDiff = ADC_SINGLE_ENDED;\n  sConfig.OffsetNumber = ADC_OFFSET_NONE;\n  sConfig.Offset = 0;\n  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {\n    Error_Handler();\n  }\n  HAL_NVIC_EnableIRQ(ADC1_IRQn);\n\n  /* TIM1 init for TRGO */\n  __HAL_RCC_TIM1_CLK_ENABLE();\n  TIM_HandleTypeDef htim1;\n  TIM_ClockConfigTypeDef sClockSourceConfig = {0};\n  htim1.Instance = TIM1;\n  htim1.Init.Prescaler = 159;\n  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;\n  htim1.Init.Period = 999;\n  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\n  htim1.Init.RepetitionCounter = 0;\n  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\n  if (HAL_TIM_Base_Init(&htim1) != HAL_OK) {\n    Error_Handler();\n  }\n  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;\n  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) {\n    Error_Handler();\n  }\n  LL_TIM_SetTriggerOutput(htim1.Instance, LL_TIM_TRGO_UPDATE);\n\n  HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);\n  HAL_ADC_Start_IT(&hadc1);\n  HAL_TIM_Base_Start(&htim1);\n}\n\nvoid ADC1_IRQHandler(void) {\n  if(LL_ADC_IsActiveFlag_EOC(ADC1) != 0) {\n    /* Clear flag ADC group regular end of unitary conversion */\n    LL_ADC_ClearFlag_EOC(ADC1);\n    /* ADC code = 4.5V * R2 / (R1 + R2) * (2^14) / 3.3V\n     * with R1 = 330kOhm and R2 = 50kOhm\n     */\n    const uint32_t threshold = 4500 * 50 / (50 + 330) * 16384 / 3300;\n    if((ADC1->DR > threshold) && (USB_OTG_FS->GOTGCTL & USB_OTG_GOTGCTL_BVALOEN)) {\n      USB_OTG_FS->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL;\n    } else {\n      USB_OTG_FS->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOVAL;\n    }\n  }\n  if(LL_ADC_IsActiveFlag_OVR(ADC1) != 0) {\n    /* Clear flag ADC group regular overrun */\n    LL_ADC_ClearFlag_OVR(ADC1);\n  }\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u575nucleo/board.mk",
    "content": "MCU_VARIANT = stm32u575xx\nCFLAGS += \\\n  -DSTM32U575xx \\\n\n# All source paths should be relative to the top level.\nLD_FILE = ${FAMILY_PATH}/linker/STM32U575xx_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32u575zi\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u5a5nucleo/STM32U5A5ZJTXQ_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U5A5xJ Device from STM32U5 series\n**                      4096Kbytes FLASH\n**                      2512Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM   (xrw) : ORIGIN = 0x20000000, LENGTH = 2496K\n  SRAM4 (xrw) : ORIGIN = 0x28000000, LENGTH = 16K\n  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 4096K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u5a5nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32u5a5xx)\nset(JLINK_DEVICE stm32u5a5zj)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32U5A5ZJTXQ_FLASH.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32U5A5xx\n    HSE_VALUE=16000000UL\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u5a5nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 U5a5 Nucleo\n   url: https://www.st.com/en/evaluation-tools/nucleo-u5a5zj-q.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif\n\n#include \"stm32u5xx_ll_tim.h\"\n\n// LED GREEN\n#define LED_PORT GPIOC\n#define LED_PIN GPIO_PIN_7\n#define LED_STATE_ON 1\n\n// BUTTON\n#define BUTTON_PORT GPIOC\n#define BUTTON_PIN GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE 1\n\n// UART Enable for STLink VCOM\n#define UART_DEV USART1\n#define UART_CLK_EN __HAL_RCC_USART1_CLK_ENABLE\n#define UART_GPIO_PORT GPIOA\n#define UART_GPIO_AF GPIO_AF7_USART1\n#define UART_TX_PIN GPIO_PIN_9\n#define UART_RX_PIN GPIO_PIN_10\n\n#define VBUS_SENSE_EN 0\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\n\nstatic inline void SystemClock_Config(void) {\n  RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n\n  __HAL_RCC_PWR_CLK_ENABLE();\n  HAL_PWREx_EnableVddA();\n\n  /** Configure the main internal regulator output voltage\n  */\n  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) {\n    Error_Handler();\n  }\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n  RCC_OscInitStruct.HSIState = RCC_HSI_ON;\n  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLMBOOST = RCC_PLLMBOOST_DIV1;\n  RCC_OscInitStruct.PLL.PLLM = 1;\n  RCC_OscInitStruct.PLL.PLLN = 20;\n  RCC_OscInitStruct.PLL.PLLP = 8;\n  RCC_OscInitStruct.PLL.PLLQ = 2;\n  RCC_OscInitStruct.PLL.PLLR = 2;\n  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLLVCIRANGE_1;\n  RCC_OscInitStruct.PLL.PLLFRACN = 0;\n  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {\n    Error_Handler();\n  }\n\n  /** Initializes the CPU, AHB and APB buses clocks\n  */\n  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK\n                                | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2\n                                | RCC_CLOCKTYPE_PCLK3;\n  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;\n\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);\n\n  // USB Clock\n  __HAL_RCC_SYSCFG_CLK_ENABLE();\n\n  RCC_PeriphCLKInitTypeDef usb_clk_init = { 0};\n  usb_clk_init.PeriphClockSelection = RCC_PERIPHCLK_USBPHY;\n  usb_clk_init.UsbPhyClockSelection = RCC_USBPHYCLKSOURCE_HSE;\n  if (HAL_RCCEx_PeriphCLKConfig(&usb_clk_init) != HAL_OK) {\n    Error_Handler();\n  }\n\n  /** Set the OTG PHY reference clock selection\n  */\n  HAL_SYSCFG_SetOTGPHYReferenceClockSelection(SYSCFG_OTG_HS_PHY_CLK_SELECT_1);\n\n  // USART clock\n  RCC_PeriphCLKInitTypeDef uart_clk_init = { 0};\n  uart_clk_init.PeriphClockSelection = RCC_PERIPHCLK_USART1;\n  uart_clk_init.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;\n  if (HAL_RCCEx_PeriphCLKConfig(&uart_clk_init) != HAL_OK) {\n    Error_Handler();\n  }\n}\n\nstatic inline void SystemPower_Config(void) {\n  HAL_PWREx_EnableVddIO2();\n\n  /*\n   * Switch to SMPS regulator instead of LDO\n   */\n  if (HAL_PWREx_ConfigSupply(PWR_SMPS_SUPPLY) != HAL_OK) {\n    Error_Handler();\n  }\n/* USER CODE BEGIN PWR */\n/* USER CODE END PWR */\n}\n\nstatic inline void board_vbus_sense_init(void) {\n  /* ADC config */\n  GPIO_InitTypeDef GPIO_InitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_ADCDAC;\n  PeriphClkInit.AdcDacClockSelection = RCC_ADCDACCLKSOURCE_HSE;\n  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)\n  {\n    Error_Handler();\n  }\n  __HAL_RCC_ADC12_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  GPIO_InitStruct.Pin = GPIO_PIN_2;\n  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);\n\n  ADC_HandleTypeDef hadc1;\n  hadc1.Instance = ADC1;\n  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1;\n  hadc1.Init.Resolution = ADC_RESOLUTION_14B;\n  hadc1.Init.GainCompensation = 0;\n  hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;\n  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;\n  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;\n  hadc1.Init.LowPowerAutoWait = DISABLE;\n  hadc1.Init.ContinuousConvMode = DISABLE;\n  hadc1.Init.NbrOfConversion = 1;\n  hadc1.Init.DiscontinuousConvMode = DISABLE;\n  hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T1_TRGO;\n  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;\n  hadc1.Init.DMAContinuousRequests = DISABLE;\n  hadc1.Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;\n  hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;\n  hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;\n  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;\n  hadc1.Init.OversamplingMode = DISABLE;\n  if (HAL_ADC_Init(&hadc1) != HAL_OK) {\n    Error_Handler();\n  }\n\n  ADC_ChannelConfTypeDef sConfig = {0};\n  sConfig.Channel = ADC_CHANNEL_3;\n  sConfig.Rank = ADC_REGULAR_RANK_1;\n  sConfig.SamplingTime = ADC_SAMPLETIME_68CYCLES;\n  sConfig.SingleDiff = ADC_SINGLE_ENDED;\n  sConfig.OffsetNumber = ADC_OFFSET_NONE;\n  sConfig.Offset = 0;\n  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {\n    Error_Handler();\n  }\n  HAL_NVIC_EnableIRQ(ADC1_2_IRQn);\n\n  /* TIM1 init for TRGO */\n  __HAL_RCC_TIM1_CLK_ENABLE();\n  TIM_HandleTypeDef htim1;\n  TIM_ClockConfigTypeDef sClockSourceConfig = {0};\n  htim1.Instance = TIM1;\n  htim1.Init.Prescaler = 159;\n  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;\n  htim1.Init.Period = 999;\n  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;\n  htim1.Init.RepetitionCounter = 0;\n  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;\n  if (HAL_TIM_Base_Init(&htim1) != HAL_OK) {\n    Error_Handler();\n  }\n  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;\n  if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK) {\n    Error_Handler();\n  }\n  LL_TIM_SetTriggerOutput(htim1.Instance, LL_TIM_TRGO_UPDATE);\n\n  HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);\n  HAL_ADC_Start_IT(&hadc1);\n  HAL_TIM_Base_Start(&htim1);\n}\n\nvoid ADC1_2_IRQHandler(void) {\n  if(LL_ADC_IsActiveFlag_EOC(ADC1) != 0) {\n    /* Clear flag ADC group regular end of unitary conversion */\n    LL_ADC_ClearFlag_EOC(ADC1);\n    /* ADC code = 4.5V * R2 / (R1 + R2) * (2^14) / 3.3V\n     * with R1 = 330kOhm and R2 = 50kOhm\n     */\n    const uint32_t threshold = 4500 * 50 / (50 + 330) * 16384 / 3300;\n    if((ADC1->DR > threshold) && (USB_OTG_HS->GOTGCTL & USB_OTG_GOTGCTL_BVALOEN)) {\n      USB_OTG_HS->GOTGCTL |= USB_OTG_GOTGCTL_BVALOVAL;\n      USB_OTG_HS->GCCFG |= USB_OTG_GCCFG_VBVALOVAL;\n    } else {\n      USB_OTG_HS->GOTGCTL &= ~USB_OTG_GOTGCTL_BVALOVAL;\n      USB_OTG_HS->GCCFG &= ~USB_OTG_GCCFG_VBVALOVAL;\n    }\n  }\n  if(LL_ADC_IsActiveFlag_OVR(ADC1) != 0) {\n    /* Clear flag ADC group regular overrun */\n    LL_ADC_ClearFlag_OVR(ADC1);\n  }\n}\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u5a5nucleo/board.mk",
    "content": "MCU_VARIANT = stm32u5a5xx\nCFLAGS += \\\n  -DSTM32U5A5xx \\\n  -DHSE_VALUE=16000000UL \\\n\n# All source paths should be relative to the top level.\nLD_FILE = ${BOARD_PATH}/STM32U5A5ZJTXQ_FLASH.ld\n\n# For flash-jlink target\nJLINK_DEVICE = stm32u575zi\n"
  },
  {
    "path": "hw/bsp/stm32u5/boards/stm32u5a5nucleo/cubemx/stm32u5a5nucleo.ioc",
    "content": "#MicroXplorer Configuration settings - do not modify\nADC1.Channel-1\\#ChannelRegularConversion=ADC_CHANNEL_2\nADC1.IPParameters=Rank-1\\#ChannelRegularConversion,master,Channel-1\\#ChannelRegularConversion,SamplingTime-1\\#ChannelRegularConversion,OffsetNumber-1\\#ChannelRegularConversion,MonitoredBy-1\\#ChannelRegularConversion,NbrOfConversionFlag\nADC1.MonitoredBy-1\\#ChannelRegularConversion=__NULL\nADC1.NbrOfConversionFlag=1\nADC1.OffsetNumber-1\\#ChannelRegularConversion=ADC_OFFSET_NONE\nADC1.Rank-1\\#ChannelRegularConversion=1\nADC1.SamplingTime-1\\#ChannelRegularConversion=ADC_SAMPLETIME_5CYCLE\nADC1.master=1\nCAD.formats=\nCAD.pinconfig=\nCAD.provider=\nCORTEX_M33_NS.userName=CORTEX_M33\nFile.Version=6\nGPDMA1.DIRECTION_GPDMACH0=DMA_MEMORY_TO_PERIPH\nGPDMA1.DIRECTION_GPDMACH3=DMA_MEMORY_TO_PERIPH\nGPDMA1.IPHANDLE_GPDMACH0-SIMPLEREQUEST_GPDMACH0=__NULL\nGPDMA1.IPHANDLE_GPDMACH3-SIMPLEREQUEST_GPDMACH3=__NULL\nGPDMA1.IPHANDLE_GPDMACH5-SIMPLEREQUEST_GPDMACH5=__NULL\nGPDMA1.IPParameters=IPHANDLE_GPDMACH5-SIMPLEREQUEST_GPDMACH5,REQUEST_GPDMACH5,IPHANDLE_GPDMACH3-SIMPLEREQUEST_GPDMACH3,REQUEST_GPDMACH3,DIRECTION_GPDMACH3,IPHANDLE_GPDMACH0-SIMPLEREQUEST_GPDMACH0,REQUEST_GPDMACH0,DIRECTION_GPDMACH0,SRCINC_GPDMACH0\nGPDMA1.REQUEST_GPDMACH0=GPDMA1_REQUEST_USART1_TX\nGPDMA1.REQUEST_GPDMACH3=GPDMA1_REQUEST_UCPD1_TX\nGPDMA1.REQUEST_GPDMACH5=GPDMA1_REQUEST_UCPD1_RX\nGPDMA1.SRCINC_GPDMACH0=DMA_SINC_INCREMENTED\nGPIO.groupedBy=Group By Peripherals\nKeepUserPlacement=false\nMMTAppReg1.MEMORYMAP.AP=RW_priv_only\nMMTAppReg1.MEMORYMAP.AppRegionName=RAM\nMMTAppReg1.MEMORYMAP.ContextName=CortexM33\nMMTAppReg1.MEMORYMAP.CoreName=ARM Cortex-M33\nMMTAppReg1.MEMORYMAP.DefaultDataRegion=true\nMMTAppReg1.MEMORYMAP.IPParameters=StartAddress,Size,CoreName,DefaultDataRegion,ContextName,Name,AP\nMMTAppReg1.MEMORYMAP.Name=RAM\nMMTAppReg1.MEMORYMAP.Size=2555904\nMMTAppReg1.MEMORYMAP.StartAddress=0x20000000\nMMTAppReg2.MEMORYMAP.AppRegionName=RAM Reserved Alias Region\nMMTAppReg2.MEMORYMAP.CoreName=ARM Cortex-M33\nMMTAppReg2.MEMORYMAP.DefaultDataRegion=false\nMMTAppReg2.MEMORYMAP.IPParameters=StartAddress,Size,CoreName,DefaultDataRegion,ReservedRegion,Name\nMMTAppReg2.MEMORYMAP.Name=RAM Reserved Alias Region\nMMTAppReg2.MEMORYMAP.ReservedRegion=true\nMMTAppReg2.MEMORYMAP.Size=2555904\nMMTAppReg2.MEMORYMAP.StartAddress=0x0A000000\nMMTAppReg3.MEMORYMAP.AP=RO_priv_only\nMMTAppReg3.MEMORYMAP.AppRegionName=FLASH\nMMTAppReg3.MEMORYMAP.Cacheability=WTRA\nMMTAppReg3.MEMORYMAP.ContextName=CortexM33\nMMTAppReg3.MEMORYMAP.CoreName=ARM Cortex-M33\nMMTAppReg3.MEMORYMAP.DefaultCodeRegion=true\nMMTAppReg3.MEMORYMAP.DefaultDataRegion=false\nMMTAppReg3.MEMORYMAP.IPParameters=StartAddress,Size,CoreName,DefaultDataRegion,MemType,ContextName,Name,AP,Cacheability,DefaultCodeRegion\nMMTAppReg3.MEMORYMAP.MemType=ROM\nMMTAppReg3.MEMORYMAP.Name=FLASH\nMMTAppReg3.MEMORYMAP.Size=4194304\nMMTAppReg3.MEMORYMAP.StartAddress=0x08000000\nMMTAppRegionsCount=3\nMMTConfigApplied=false\nMcu.CPN=STM32U5A5ZJT6Q\nMcu.ContextProject=TrustZoneDisabled\nMcu.Family=STM32U5\nMcu.IP0=ADC1\nMcu.IP1=CORTEX_M33_NS\nMcu.IP10=UCPD1\nMcu.IP11=USART1\nMcu.IP12=USBPD\nMcu.IP13=USBX\nMcu.IP14=USB_OTG_HS\nMcu.IP2=GPDMA1\nMcu.IP3=ICACHE\nMcu.IP4=MEMORYMAP\nMcu.IP5=NVIC\nMcu.IP6=PWR\nMcu.IP7=RCC\nMcu.IP8=SYS\nMcu.IP9=THREADX\nMcu.IPNb=15\nMcu.Name=STM32U5A5ZJTxQ\nMcu.Package=LQFP144\nMcu.Pin0=PH0-OSC_IN (PH0)\nMcu.Pin1=PH1-OSC_OUT (PH1)\nMcu.Pin10=VP_GPDMA1_VS_GPDMACH0\nMcu.Pin11=VP_GPDMA1_VS_GPDMACH3\nMcu.Pin12=VP_GPDMA1_VS_GPDMACH5\nMcu.Pin13=VP_ICACHE_VS_ICACHE\nMcu.Pin14=VP_PWR_VS_DBSignals\nMcu.Pin15=VP_PWR_VS_SECSignals\nMcu.Pin16=VP_PWR_VS_LPOM\nMcu.Pin17=VP_SYS_VS_tim6\nMcu.Pin18=VP_THREADX_VS_RTOSJjThreadXJjCoreJjDefault\nMcu.Pin19=VP_USBPD_VS_USBPD1\nMcu.Pin2=PC1\nMcu.Pin20=VP_USBPD_VS_PD3TYPEC\nMcu.Pin21=VP_USBPD_VS_usbpd_tim2\nMcu.Pin22=VP_USBPD_VS_usbpd_usb_cohabitation\nMcu.Pin23=VP_USBX_Core_System\nMcu.Pin24=VP_USBX_UX Device CoreStack_HS\nMcu.Pin25=VP_USBX_UX Device Controller_HS\nMcu.Pin26=VP_USBX_UX Device CDC ACM Class_HS\nMcu.Pin27=VP_MEMORYMAP_VS_MEMORYMAP\nMcu.Pin3=PB15\nMcu.Pin4=PG2\nMcu.Pin5=PA9\nMcu.Pin6=PA10\nMcu.Pin7=PA11\nMcu.Pin8=PA12\nMcu.Pin9=PA15 (JTDI)\nMcu.PinsNb=28\nMcu.ThirdPartyNb=0\nMcu.UserConstants=\nMcu.UserName=STM32U5A5ZJTxQ\nMxCube.Version=6.9.2\nMxDb.Version=DB.6.0.92\nNVIC.BusFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\\:false\nNVIC.DebugMonitor_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\\:false\nNVIC.ForceEnableDMAVector=true\nNVIC.GPDMA1_Channel0_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:true\\:true\\:true\nNVIC.GPDMA1_Channel3_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:true\\:true\\:true\nNVIC.GPDMA1_Channel5_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:true\\:true\\:true\\:true\nNVIC.HardFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\\:false\nNVIC.MemoryManagement_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\\:false\nNVIC.NonMaskableInt_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\\:false\nNVIC.OTG_HS_IRQn=true\\:7\\:0\\:true\\:false\\:true\\:false\\:true\\:true\\:true\nNVIC.PendSV_IRQn=true\\:0\\:0\\:false\\:false\\:false\\:false\\:false\\:false\\:false\nNVIC.PriorityGroup=NVIC_PRIORITYGROUP_4\nNVIC.SVCall_IRQn=true\\:0\\:0\\:false\\:false\\:false\\:false\\:false\\:false\\:false\nNVIC.SavedPendsvIrqHandlerGenerated=true\nNVIC.SavedSvcallIrqHandlerGenerated=true\nNVIC.SavedSystickIrqHandlerGenerated=true\nNVIC.SysTick_IRQn=true\\:0\\:0\\:true\\:false\\:false\\:false\\:false\\:true\\:false\nNVIC.TIM6_IRQn=true\\:15\\:0\\:false\\:false\\:true\\:false\\:false\\:true\\:true\nNVIC.TimeBase=TIM6_IRQn\nNVIC.TimeBaseIP=TIM6\nNVIC.UCPD1_IRQn=true\\:5\\:0\\:true\\:false\\:true\\:false\\:true\\:false\\:true\nNVIC.USART1_IRQn=true\\:6\\:0\\:true\\:false\\:true\\:false\\:true\\:true\\:true\nNVIC.UsageFault_IRQn=true\\:0\\:0\\:false\\:false\\:true\\:false\\:false\\:false\\:false\nPA10.GPIOParameters=GPIO_Speed,GPIO_PuPd\nPA10.GPIO_PuPd=GPIO_PULLUP\nPA10.GPIO_Speed=GPIO_SPEED_FREQ_HIGH\nPA10.Mode=Asynchronous\nPA10.Signal=USART1_RX\nPA11.GPIOParameters=GPIO_Speed\nPA11.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPA11.Mode=Internal_Phy_Device\nPA11.Signal=USB_OTG_HS_DM\nPA12.GPIOParameters=GPIO_Speed\nPA12.GPIO_Speed=GPIO_SPEED_FREQ_LOW\nPA12.Mode=Internal_Phy_Device\nPA12.Signal=USB_OTG_HS_DP\nPA15\\ (JTDI).Mode=Sink_AllSignals\nPA15\\ (JTDI).Signal=UCPD1_CC1\nPA9.GPIOParameters=GPIO_Speed,GPIO_PuPd\nPA9.GPIO_PuPd=GPIO_PULLUP\nPA9.GPIO_Speed=GPIO_SPEED_FREQ_HIGH\nPA9.Mode=Asynchronous\nPA9.Signal=USART1_TX\nPB15.Mode=Sink_AllSignals\nPB15.Signal=UCPD1_CC2\nPC1.Mode=IN2-Single-Ended\nPC1.Signal=ADC1_IN2\nPG2.GPIOParameters=GPIO_Label\nPG2.GPIO_Label=LED_RED\nPG2.Locked=true\nPG2.Signal=GPIO_Output\nPH0-OSC_IN\\ (PH0).Mode=HSE-External-Oscillator\nPH0-OSC_IN\\ (PH0).Signal=RCC_OSC_IN\nPH1-OSC_OUT\\ (PH1).Mode=HSE-External-Oscillator\nPH1-OSC_OUT\\ (PH1).Signal=RCC_OSC_OUT\nPWR.IPParameters=PowerMode\nPWR.PowerMode=PWR_SMPS_SUPPLY\nPinOutPanel.RotationAngle=0\nProjectManager.AskForMigrate=true\nProjectManager.BackupPrevious=false\nProjectManager.CompilerOptimize=6\nProjectManager.ComputerToolchain=false\nProjectManager.CoupleFile=false\nProjectManager.CustomerFirmwarePackage=\nProjectManager.DefaultFWLocation=true\nProjectManager.DeletePrevious=true\nProjectManager.DeviceId=STM32U5A5ZJTxQ\nProjectManager.Example=Ux_Device_CDC_ACM\nProjectManager.ExampleSource=MxCubeFw\nProjectManager.FirmwarePackage=STM32Cube FW_U5 V1.3.0\nProjectManager.FreePins=false\nProjectManager.HalAssertFull=false\nProjectManager.HeapSize=0x200\nProjectManager.KeepUserCode=true\nProjectManager.LPBAM.generateCode=\nProjectManager.LastFirmware=true\nProjectManager.LibraryCopy=1\nProjectManager.MainLocation=Core/Src\nProjectManager.NoMain=false\nProjectManager.PreviousToolchain=\nProjectManager.ProjectBuild=false\nProjectManager.ProjectFileName=stm32u5a5nucleo.ioc\nProjectManager.ProjectName=stm32u5a5nucleo\nProjectManager.ProjectStructure=\nProjectManager.RegisterCallBack=\nProjectManager.StackSize=0x400\nProjectManager.TargetToolchain=STM32CubeIDE\nProjectManager.ToolChainLocation=\nProjectManager.UAScriptAfterPath=\nProjectManager.UAScriptBeforePath=\nProjectManager.UnderRoot=false\nProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_GPDMA1_Init-GPDMA1-false-HAL-true,4-MX_ICACHE_Init-ICACHE-false-HAL-true,5-MX_USART1_UART_Init-USART1-false-HAL-false,6-MX_UCPD1_Init-UCPD1-false-LL-true,7-MX_USB_OTG_HS_PCD_Init-USB_OTG_HS-true-HAL-false,8-MX_USBPD_Init-USBPD-false-HAL-false,9-MX_USBX_Init-USBX-false-HAL-false,10-MX_ADC1_Init-ADC1-false-HAL-true,11-MX_MEMORYMAP_Init-MEMORYMAP-false-HAL-true,0-MX_CORTEX_M33_NS_Init-CORTEX_M33_NS-false-HAL-true,0-MX_PWR_Init-PWR-false-HAL-true\nRCC.ADCFreq_Value=16000000\nRCC.ADF1Freq_Value=160000000\nRCC.AHBFreq_Value=160000000\nRCC.APB1Freq_Value=160000000\nRCC.APB1TimFreq_Value=160000000\nRCC.APB2Freq_Value=160000000\nRCC.APB2TimFreq_Value=160000000\nRCC.APB3Freq_Value=160000000\nRCC.CK48Freq_Value=48000000\nRCC.CRSFreq_Value=48000000\nRCC.CortexFreq_Value=160000000\nRCC.DACCLockSelectionVirtual=RCC_DAC1CLKSOURCE_LSI\nRCC.DACFreq_Value=32000\nRCC.EPOD_VALUE=16000000\nRCC.FCLKCortexFreq_Value=160000000\nRCC.FDCANFreq_Value=160000000\nRCC.FamilyName=M\nRCC.HCLKFreq_Value=160000000\nRCC.HSE_VALUE=16000000\nRCC.HSI48_VALUE=48000000\nRCC.HSI_VALUE=16000000\nRCC.I2C1Freq_Value=160000000\nRCC.I2C2Freq_Value=160000000\nRCC.I2C3Freq_Value=160000000\nRCC.I2C4Freq_Value=160000000\nRCC.I2C5Freq_Value=160000000\nRCC.I2C6Freq_Value=160000000\nRCC.IPParameters=ADCFreq_Value,ADF1Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,APB3Freq_Value,CK48Freq_Value,CRSFreq_Value,CortexFreq_Value,DACCLockSelectionVirtual,DACFreq_Value,EPOD_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I2C5Freq_Value,I2C6Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSE_VALUE,LSIDIV_VALUE,LSI_VALUE,MCO1PinFreq_Value,MDF1Freq_Value,MSIClockRange,MSI_VALUE,OCTOSPIMFreq_Value,PLL1P,PLL2FRACN,PLL2PoutputFreq_Value,PLL2QoutputFreq_Value,PLL2RoutputFreq_Value,PLL3FRACN,PLL3PoutputFreq_Value,PLL3QoutputFreq_Value,PLL3RoutputFreq_Value,PLLFRACN,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSourceVirtual,RNGFreq_Value,SAESFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMCFreq_Value,SPI1Freq_Value,SPI2Freq_Value,SPI3Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,UART5Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USART6Freq_Value,USBPHYCLockSelection,USBPHYFreq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOPLL2OutputFreq_Value,VCOPLL3OutputFreq_Value\nRCC.LPTIM2Freq_Value=160000000\nRCC.LPUART1Freq_Value=160000000\nRCC.LSCOPinFreq_Value=32000\nRCC.LSE_VALUE=32768\nRCC.LSIDIV_VALUE=32000\nRCC.LSI_VALUE=32000\nRCC.MCO1PinFreq_Value=160000000\nRCC.MDF1Freq_Value=160000000\nRCC.MSIClockRange=RCC_MSIRANGE_0\nRCC.MSI_VALUE=48000000\nRCC.OCTOSPIMFreq_Value=160000000\nRCC.PLL1P=8\nRCC.PLL2FRACN=0\nRCC.PLL2PoutputFreq_Value=3096000000\nRCC.PLL2QoutputFreq_Value=3096000000\nRCC.PLL2RoutputFreq_Value=3096000000\nRCC.PLL3FRACN=0\nRCC.PLL3PoutputFreq_Value=3096000000\nRCC.PLL3QoutputFreq_Value=3096000000\nRCC.PLL3RoutputFreq_Value=3096000000\nRCC.PLLFRACN=0\nRCC.PLLN=20\nRCC.PLLPoutputFreq_Value=40000000\nRCC.PLLQoutputFreq_Value=160000000\nRCC.PLLRCLKFreq_Value=160000000\nRCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE\nRCC.RNGFreq_Value=48000000\nRCC.SAESFreq_Value=48000000\nRCC.SAI1Freq_Value=3096000000\nRCC.SAI2Freq_Value=3096000000\nRCC.SDMMCFreq_Value=40000000\nRCC.SPI1Freq_Value=160000000\nRCC.SPI2Freq_Value=160000000\nRCC.SPI3Freq_Value=160000000\nRCC.SYSCLKFreq_VALUE=160000000\nRCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK\nRCC.UART4Freq_Value=160000000\nRCC.UART5Freq_Value=160000000\nRCC.USART1Freq_Value=160000000\nRCC.USART2Freq_Value=160000000\nRCC.USART3Freq_Value=160000000\nRCC.USART6Freq_Value=160000000\nRCC.USBPHYCLockSelection=RCC_USBPHYCLKSOURCE_HSE\nRCC.USBPHYFreq_Value=16000000\nRCC.VCOInput2Freq_Value=48000000\nRCC.VCOInput3Freq_Value=48000000\nRCC.VCOInputFreq_Value=16000000\nRCC.VCOOutputFreq_Value=320000000\nRCC.VCOPLL2OutputFreq_Value=6192000000\nRCC.VCOPLL3OutputFreq_Value=6192000000\nUSART1.IPParameters=VirtualMode-Asynchronous\nUSART1.VirtualMode-Asynchronous=VM_ASYNC\nUSBX.BSP.number=1\nUSBX.Core_System=1\nUSBX.IPParameters=Core_System,UX_Device_CoreStack,UX_Device_Controller,UX_DEVICE_CDC_ACM,USBD_CDCACM_EPIN_ADDR,USBD_CDCACM_EPOUT_HS_MPS,USBD_CDCACM_EPIN_HS_MPS,UX_DEVICE_APP_MEM_POOL_SIZE,USBD_PRODUCT_STRING,UX_SLAVE_REQUEST_DATA_MAX_LENGTH,USBX_DEVICE_SYS_SIZE,USBD_PID,USBD_SERIAL_NUMBER,UX_SLAVE_REQUEST_CONTROL_MAX_LENGTH,USBD_CDCACM_EPINCMD_ADDR,MAX_POWER_IN_MILLI_AMPER\nUSBX.MAX_POWER_IN_MILLI_AMPER=0\nUSBX.USBD_CDCACM_EPINCMD_ADDR=2\nUSBX.USBD_CDCACM_EPIN_ADDR=1\nUSBX.USBD_CDCACM_EPIN_HS_MPS=512\nUSBX.USBD_CDCACM_EPOUT_HS_MPS=512\nUSBX.USBD_PID=22336\nUSBX.USBD_PRODUCT_STRING=STM32 Virtual ComPort\nUSBX.USBD_SERIAL_NUMBER=CDC_ACM001\nUSBX.USBX_DEVICE_SYS_SIZE=4*1024\nUSBX.UX_DEVICE_APP_MEM_POOL_SIZE=8192\nUSBX.UX_DEVICE_CDC_ACM=1\nUSBX.UX_Device_Controller=1\nUSBX.UX_Device_CoreStack=1\nUSBX.UX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=256\nUSBX.UX_SLAVE_REQUEST_DATA_MAX_LENGTH=512\nUSBX0.BSP.STBoard=false\nUSBX0.BSP.api=Unknown\nUSBX0.BSP.component=\nUSBX0.BSP.condition=\nUSBX0.BSP.instance=USB_OTG_HS\nUSBX0.BSP.ip=USB_OTG_HS\nUSBX0.BSP.mode=Device_Only\nUSBX0.BSP.name=USBDevice\nUSBX0.BSP.semaphore=\nUSBX0.BSP.solution=USB_OTG_HS\nUSB_OTG_HS.IPParameters=VirtualMode\nUSB_OTG_HS.VirtualMode=Device_HS\nVP_GPDMA1_VS_GPDMACH0.Mode=SIMPLEREQUEST_GPDMACH0\nVP_GPDMA1_VS_GPDMACH0.Signal=GPDMA1_VS_GPDMACH0\nVP_GPDMA1_VS_GPDMACH3.Mode=SIMPLEREQUEST_GPDMACH3\nVP_GPDMA1_VS_GPDMACH3.Signal=GPDMA1_VS_GPDMACH3\nVP_GPDMA1_VS_GPDMACH5.Mode=SIMPLEREQUEST_GPDMACH5\nVP_GPDMA1_VS_GPDMACH5.Signal=GPDMA1_VS_GPDMACH5\nVP_ICACHE_VS_ICACHE.Mode=DirectMappedCache\nVP_ICACHE_VS_ICACHE.Signal=ICACHE_VS_ICACHE\nVP_MEMORYMAP_VS_MEMORYMAP.Mode=CurAppReg\nVP_MEMORYMAP_VS_MEMORYMAP.Signal=MEMORYMAP_VS_MEMORYMAP\nVP_PWR_VS_DBSignals.Mode=DisableDeadBatterySignals\nVP_PWR_VS_DBSignals.Signal=PWR_VS_DBSignals\nVP_PWR_VS_LPOM.Mode=PowerOptimisation\nVP_PWR_VS_LPOM.Signal=PWR_VS_LPOM\nVP_PWR_VS_SECSignals.Mode=Security/Privilege\nVP_PWR_VS_SECSignals.Signal=PWR_VS_SECSignals\nVP_SYS_VS_tim6.Mode=TIM6\nVP_SYS_VS_tim6.Signal=SYS_VS_tim6\nVP_THREADX_VS_RTOSJjThreadXJjCoreJjDefault.Mode=Core_Default\nVP_THREADX_VS_RTOSJjThreadXJjCoreJjDefault.Signal=THREADX_VS_RTOSJjThreadXJjCoreJjDefault\nVP_USBPD_VS_PD3TYPEC.Mode=PD3_TypeC\nVP_USBPD_VS_PD3TYPEC.Signal=USBPD_VS_PD3TYPEC\nVP_USBPD_VS_USBPD1.Mode=USBPD_P0\nVP_USBPD_VS_USBPD1.Signal=USBPD_VS_USBPD1\nVP_USBPD_VS_usbpd_tim2.Mode=TIM2\nVP_USBPD_VS_usbpd_tim2.Signal=USBPD_VS_usbpd_tim2\nVP_USBPD_VS_usbpd_usb_cohabitation.Mode=Enable USB Support\nVP_USBPD_VS_usbpd_usb_cohabitation.Signal=USBPD_VS_usbpd_usb_cohabitation\nVP_USBX_Core_System.Mode=Core_System\nVP_USBX_Core_System.Signal=USBX_Core_System\nVP_USBX_UX\\ Device\\ CDC\\ ACM\\ Class_HS.Mode=UX_Device_class_CDC_ACM_HS\nVP_USBX_UX\\ Device\\ CDC\\ ACM\\ Class_HS.Signal=USBX_UX Device CDC ACM Class_HS\nVP_USBX_UX\\ Device\\ Controller_HS.Mode=UX_Device_Controller_HS\nVP_USBX_UX\\ Device\\ Controller_HS.Signal=USBX_UX Device Controller_HS\nVP_USBX_UX\\ Device\\ CoreStack_HS.Mode=UX_Device_CoreStack_HS\nVP_USBX_UX\\ Device\\ CoreStack_HS.Signal=USBX_UX Device CoreStack_HS\nboard=NUCLEO-U5A5ZJ-Q\nboardIOC=true\n"
  },
  {
    "path": "hw/bsp/stm32u5/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022, Hongtai Liu <lht856@foxmail.com>\n * Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n// Suppress warning caused by mcu driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wundef\"\n#endif\n\n#include \"stm32u5xx_hal.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"bsp/board_api.h\"\n\nTU_ATTR_UNUSED static void Error_Handler(void) {\n}\n\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\n#ifdef USB_DRD_FS\nvoid USB_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n#endif\n#ifdef USB_OTG_FS\nvoid OTG_FS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n#endif\n#ifdef USB_OTG_HS\nvoid OTG_HS_IRQHandler(void) {\n  tusb_int_handler(0, true);\n}\n#endif\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\nUART_HandleTypeDef UartHandle;\n\nvoid board_init(void) {\n  // Init clock, implemented in board.h\n  SystemClock_Config();\n  SystemPower_Config();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n#ifdef GPIOF\n  __HAL_RCC_GPIOF_CLK_ENABLE();\n#endif\n  __HAL_RCC_GPIOG_CLK_ENABLE();\n  __HAL_RCC_GPIOH_CLK_ENABLE();\n\n  UART_CLK_EN();\n\n  /* Enable Instruction cache */\n  HAL_ICACHE_Enable();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n#endif\n\n  GPIO_InitTypeDef GPIO_InitStruct;\n\n  // LED\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n  // IOSV bit MUST be set to access GPIO port G[2:15] */\n  HAL_PWREx_EnableVddIO2();\n\n  // Uart\n  GPIO_InitStruct.Pin = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;\n  GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UartHandle.Instance = UART_DEV;\n  UartHandle.Init.BaudRate = CFG_BOARD_UART_BAUDRATE;\n  UartHandle.Init.WordLength = UART_WORDLENGTH_8B;\n  UartHandle.Init.StopBits = UART_STOPBITS_1;\n  UartHandle.Init.Parity = UART_PARITY_NONE;\n  UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE;\n  UartHandle.Init.Mode = UART_MODE_TX_RX;\n  UartHandle.Init.OverSampling = UART_OVERSAMPLING_16;\n  UartHandle.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;\n  UartHandle.Init.ClockPrescaler = UART_PRESCALER_DIV1;\n  UartHandle.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;\n  HAL_UART_Init(&UartHandle);\n\n  /* Configure USB GPIOs */\n  /* Configure DM DP Pins */\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF10_USB;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  /* Configure ID pin */\n  GPIO_InitStruct.Pin = GPIO_PIN_10;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Alternate = GPIO_AF10_USB;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n#ifdef USB_DRD_FS\n  // STM32U535/STM32U545\n\n  /* Enable USB power on Pwrctrl CR2 register */\n  HAL_PWREx_EnableVddUSB();\n\n  /* USB clock enable */\n  __HAL_RCC_USB_FS_CLK_ENABLE();\n\n#endif\n\n#ifdef USB_OTG_FS\n  #if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #endif\n\n  #if defined(OTG_FS_VBUS_SENSE) && OTG_FS_VBUS_SENSE\n  // Configure VBUS Pin OTG_FS_VBUS_SENSE\n  GPIO_InitStruct.Pin = GPIO_PIN_9;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n  #endif // vbus sense\n\n#if CFG_TUD_ENABLED\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = VBUS_SENSE_EN;\n  tud_configure(0, TUD_CFGID_DWC2, &cfg);\n#endif\n\n  /* Enable USB power on Pwrctrl CR2 register */\n  HAL_PWREx_EnableVddUSB();\n\n  /* USB clock enable */\n  __HAL_RCC_USB_OTG_FS_CLK_ENABLE();\n\n#endif\n\n#ifdef USB_OTG_HS\n  // STM59x/Ax/Fx/Gx only have 1 USB HS port\n\n  #if CFG_TUSB_OS == OPT_OS_FREERTOS\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #endif\n\n  /* USB clock enable */\n  __HAL_RCC_USB_OTG_HS_CLK_ENABLE();\n  __HAL_RCC_USBPHYC_CLK_ENABLE();\n\n  /* Enable USB power on Pwrctrl CR2 register */\n  HAL_PWREx_EnableVddUSB();\n  HAL_PWREx_EnableUSBHSTranceiverSupply();\n\n  /*Configuring the SYSCFG registers OTG_HS PHY*/\n  HAL_SYSCFG_EnableOTGPHY(SYSCFG_OTG_HS_PHY_ENABLE);\n\n#if CFG_TUD_ENABLED\n  tud_configure_dwc2_t cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n  cfg.vbus_sensing = VBUS_SENSE_EN;\n  tud_configure(0, TUD_CFGID_DWC2, &cfg);\n#endif\n#endif // USB_OTG_FS\n\n  /* Non-standard VBus sense settings */\n  board_vbus_sense_init();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState) (state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  volatile uint32_t *stm32_uuid = (volatile uint32_t *) UID_BASE;\n  uint32_t *id32 = (uint32_t *) (uintptr_t) id;\n  uint8_t const len = 12;\n\n  id32[0] = stm32_uuid[0];\n  id32[1] = stm32_uuid[1];\n  id32[2] = stm32_uuid[2];\n\n  return len;\n}\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  HAL_UART_Transmit(&UartHandle, (uint8_t *) (uintptr_t) buf, len, 0xffff);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  asm(\"bkpt 1\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY u5)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32U5 CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nstring(REPLACE \"stm32u\" \"STM32U\" MCU_VARIANT_UPPER ${MCU_VARIANT})\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\n\nif (NOT DEFINED LD_FILE_GNU)\n  set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/${MCU_VARIANT_UPPER}_FLASH.ld)\nendif ()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash.icf)\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_icache.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_adc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_adc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_tim.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32U5)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/hcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes -Wno-self-assign\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32u5/family.mk",
    "content": "ST_FAMILY = u5\n\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m33\n\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32U5\n\n# suppress warning caused by vendor mcu driver\nCFLAGS_GCC += \\\n  -flto \\\n  -Wno-error=cast-align \\\n  -Wno-error=undef \\\n  -Wno-error=unused-parameter \\\n  -Wno-error=type-limits \\\n  -Wno-self-assign \\\n\nifeq ($(TOOLCHAIN),gcc)\nCFLAGS_GCC += -Wno-error=maybe-uninitialized\nendif\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  --specs=nosys.specs --specs=nano.specs\n\nSRC_C += \\\n\t$(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_gpio.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_icache.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_adc.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_adc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/stm32$(ST_FAMILY)xx_hal_tim.c\n\nifneq ($(filter stm32u545xx stm32u535xx,$(MCU_VARIANT)),)\nSRC_C += \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/hcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c\nelse\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c\nendif\n\nINC += \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc \\\n\t$(TOP)/$(BOARD_PATH)\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT).s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash.icf\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U535xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U535xE Device from STM32U5 series\n**                      512Kbytes FLASH\n**                      272Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2022 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM\t(xrw)\t: ORIGIN = 0x20000000,\tLENGTH = 256K\n  SRAM4\t(xrw)\t: ORIGIN = 0x28000000,\tLENGTH = 16K\n  FLASH\t(rx)\t: ORIGIN = 0x08000000,\tLENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ;\t/* required amount of heap  */\n_Min_Stack_Size = 0x400 ;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U545xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U545xE Device from STM32U5 series\n**                      512Kbytes FLASH\n**                      272Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2022 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM\t(xrw)\t: ORIGIN = 0x20000000,\tLENGTH = 256K\n  SRAM4\t(xrw)\t: ORIGIN = 0x28000000,\tLENGTH = 16K\n  FLASH\t(rx)\t: ORIGIN = 0x08000000,\tLENGTH = 512K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ;\t/* required amount of heap  */\n_Min_Stack_Size = 0x400 ;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U575xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author\t\t: Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U575xx Device from STM32U5 series\n**                      2048Kbytes ROM\n**                      784Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM\t(xrw)\t: ORIGIN = 0x20000000,\tLENGTH = 768K\n  ROM\t(rx)\t: ORIGIN = 0x08000000,\tLENGTH = 2048K\n  SRAM4\t(xrw)\t: ORIGIN = 0x28000000,\tLENGTH = 16K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200;\t/* required amount of heap  */\n_Min_Stack_Size = 0x400;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"ROM\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(8);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(8);\n  } >ROM\n\n  /* The program code and other data into \"ROM\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(8);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(8);\n    _etext = .;        /* define a global symbols at end of code */\n  } >ROM\n\n  /* Constant data into \"ROM\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(8);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(8);\n  } >ROM\n\n  .ARM.extab   : {\n    . = ALIGN(8);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(8);\n  } >ROM\n\n  .ARM : {\n    . = ALIGN(8);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(8);\n  } >ROM\n\n  .preinit_array     :\n  {\n    . = ALIGN(8);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(8);\n  } >ROM\n\n  .init_array :\n  {\n    . = ALIGN(8);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(8);\n  } >ROM\n\n  .fini_array :\n  {\n    . = ALIGN(8);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(8);\n  } >ROM\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(8);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(8);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> ROM\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(8);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(8);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U585xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author\t\t: Auto-generated by STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U585xx Device from STM32U5 series\n**                      2048Kbytes ROM\n**                      784Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM\t(xrw)\t: ORIGIN = 0x20000000,\tLENGTH = 768K\n  ROM\t(rx)\t: ORIGIN = 0x08000000,\tLENGTH = 2048K\n  SRAM4 (xrw)   : ORIGIN = 0x28000000,  LENGTH = 16K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM);\t/* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200;\t/* required amount of heap  */\n_Min_Stack_Size = 0x400;\t/* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"ROM\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(8);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(8);\n  } >ROM\n\n  /* The program code and other data into \"ROM\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(8);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(8);\n    _etext = .;        /* define a global symbols at end of code */\n  } >ROM\n\n  /* Constant data into \"ROM\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(8);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(8);\n  } >ROM\n\n  .ARM.extab   : {\n    . = ALIGN(8);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(8);\n  } >ROM\n\n  .ARM : {\n    . = ALIGN(8);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(8);\n  } >ROM\n\n  .preinit_array     :\n  {\n    . = ALIGN(8);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(8);\n  } >ROM\n\n  .init_array :\n  {\n    . = ALIGN(8);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(8);\n  } >ROM\n\n  .fini_array :\n  {\n    . = ALIGN(8);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(8);\n  } >ROM\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(8);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(8);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> ROM\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(8);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(8);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U595xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U595xJ Device from STM32U5 series\n**                      4096Kbytes FLASH\n**                      2528Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM   (xrw) : ORIGIN = 0x20000000, LENGTH = 2496K\n  SRAM4 (xrw) : ORIGIN = 0x28000000, LENGTH = 16K\n  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 4096K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ; /* required amount of heap */\n_Min_Stack_Size = 0x400 ; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U599xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U599xJ Device from STM32U5 series\n**                      4096Kbytes FLASH\n**                      2528Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 2496K\n  SRAM4 (xrw) : ORIGIN = 0x28000000, LENGTH = 16K\n  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 4096K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ; /* required amount of heap */\n_Min_Stack_Size = 0x400 ; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U5A9xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U5A9xJ Device from STM32U5 series\n**                      4096Kbytes FLASH\n**                      2528Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 2496K\n  SRAM4 (xrw) : ORIGIN = 0x28000000, LENGTH = 16K\n  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 4096K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ; /* required amount of heap */\n_Min_Stack_Size = 0x400 ; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U5F7xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U5F7xJ Device from STM32U5 series\n**                      4096Kbytes FLASH\n**                      2528Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 2496K\n  SRAM4 (xrw) : ORIGIN = 0x28000000, LENGTH = 16K\n  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 4096K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ; /* required amount of heap */\n_Min_Stack_Size = 0x400 ; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U5F9xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U5F9xJ Device from STM32U5 series\n**                      4096Kbytes FLASH\n**                      2528Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 2496K\n  SRAM4 (xrw) : ORIGIN = 0x28000000, LENGTH = 16K\n  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 4096K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ; /* required amount of heap */\n_Min_Stack_Size = 0x400 ; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U5G7xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U5G7xJ Device from STM32U5 series\n**                      4096Kbytes FLASH\n**                      2528Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 2496K\n  SRAM4 (xrw) : ORIGIN = 0x28000000, LENGTH = 16K\n  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 4096K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ; /* required amount of heap */\n_Min_Stack_Size = 0x400 ; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/linker/STM32U5G9xx_FLASH.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32U5G9xJ Device from STM32U5 series\n**                      4096Kbytes FLASH\n**                      2528Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** <h2><center>&copy; Copyright (c) 2023 STMicroelectronics.\n** All rights reserved.</center></h2>\n**\n** This software component is licensed by ST under BSD 3-Clause license,\n** the \"License\"; You may not use this file except in compliance with the\n** License. You may obtain a copy of the License at:\n**                        opensource.org/licenses/BSD-3-Clause\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Memories definition */\nMEMORY\n{\n  RAM (xrw)   : ORIGIN = 0x20000000, LENGTH = 2496K\n  SRAM4 (xrw) : ORIGIN = 0x28000000, LENGTH = 16K\n  FLASH (rx)  : ORIGIN = 0x08000000, LENGTH = 4096K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n_Min_Heap_Size = 0x200 ; /* required amount of heap */\n_Min_Stack_Size = 0x400 ; /* required amount of stack */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    KEEP(*(.isr_vector)) /* Startup code */\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n\n  .ARM :\n  {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32u5/stm32u5xx_hal_conf.h",
    "content": "/* USER CODE BEGIN Header */\n/**\n  ******************************************************************************\n  * @file    stm32u5xx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2021 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n/* USER CODE END Header */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32U5xx_HAL_CONF_H\n#define STM32U5xx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n\n#define HAL_MODULE_ENABLED\n\n#define HAL_ADC_MODULE_ENABLED\n/*#define HAL_MDF_MODULE_ENABLED */\n/*#define HAL_COMP_MODULE_ENABLED */\n/*#define HAL_CORDIC_MODULE_ENABLED */\n/*#define HAL_CRC_MODULE_ENABLED */\n/*#define HAL_CRYP_MODULE_ENABLED */\n/*#define HAL_DAC_MODULE_ENABLED */\n/*#define HAL_DMA2D_MODULE_ENABLED */\n/*#define HAL_DSI_MODULE_ENABLED */\n/*#define HAL_FDCAN_MODULE_ENABLED */\n/*#define HAL_FMAC_MODULE_ENABLED */\n/*#define HAL_GFXMMU_MODULE_ENABLED */\n/*#define HAL_GPU2D_MODULE_ENABLED */\n/*#define HAL_GTZC_MODULE_ENABLED */\n/*#define HAL_HASH_MODULE_ENABLED */\n/*#define HAL_HRTIM_MODULE_ENABLED */\n/*#define HAL_IRDA_MODULE_ENABLED */\n/*#define HAL_IWDG_MODULE_ENABLED */\n/*#define HAL_I2C_MODULE_ENABLED */\n/*#define HAL_I2S_MODULE_ENABLED */\n/*#define HAL_LPTIM_MODULE_ENABLED */\n/*#define HAL_LTDC_MODULE_ENABLED */\n/*#define HAL_NAND_MODULE_ENABLED */\n/*#define HAL_NOR_MODULE_ENABLED */\n/*#define HAL_OPAMP_MODULE_ENABLED */\n#define HAL_OSPI_MODULE_ENABLED\n/*#define HAL_OTFDEC_MODULE_ENABLED */\n#define HAL_PCD_MODULE_ENABLED\n/*#define HAL_PKA_MODULE_ENABLED */\n/*#define HAL_QSPI_MODULE_ENABLED */\n/*#define HAL_RNG_MODULE_ENABLED */\n/*#define HAL_RTC_MODULE_ENABLED */\n/*#define HAL_SAI_MODULE_ENABLED */\n/*#define HAL_CRYP_MODULE_ENABLED */\n/*#define HAL_SD_MODULE_ENABLED */\n/*#define HAL_MMC_MODULE_ENABLED */\n/*#define HAL_SMARTCARD_MODULE_ENABLED */\n/*#define HAL_SMBUS_MODULE_ENABLED */\n/*#define HAL_SPI_MODULE_ENABLED */\n/*#define HAL_SRAM_MODULE_ENABLED */\n#define HAL_TIM_MODULE_ENABLED\n/*#define HAL_TSC_MODULE_ENABLED */\n/*#define HAL_RAMCFG_MODULE_ENABLED */\n#define HAL_UART_MODULE_ENABLED\n/*#define HAL_USART_MODULE_ENABLED */\n/*#define HAL_WWDG_MODULE_ENABLED */\n/*#define HAL_DCMI_MODULE_ENABLED */\n/*#define HAL_PSSI_MODULE_ENABLED */\n#define HAL_ICACHE_MODULE_ENABLED\n/*#define HAL_DCACHE_MODULE_ENABLED */\n#define HAL_PCD_MODULE_ENABLED\n/*#define HAL_HCD_MODULE_ENABLED */\n/*#define HAL_XSPI_MODULE_ENABLED */\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n  #define HSE_VALUE    16000000UL /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    100UL   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal Multiple Speed oscillator (MSI) default value.\n  *        This value is the default MSI range value after Reset.\n  */\n#if !defined  (MSI_VALUE)\n  #define MSI_VALUE              4000000UL /*!< Value of the Internal oscillator in Hz*/\n#endif /* MSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n  #define HSI_VALUE              16000000UL /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG.\n  *        This internal oscillator is mainly dedicated to provide a high precision clock to\n  *        the USB peripheral by means of a special Clock Recovery System (CRS) circuitry.\n  *        When the CRS is not used, the HSI48 RC oscillator runs on it default frequency\n  *        which is subject to manufacturing process variations.\n  */\n#if !defined  (HSI48_VALUE)\n  #define HSI48_VALUE             48000000UL /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz.\n                                               The real value my vary depending on manufacturing process variations.*/\n#endif /* HSI48_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined  (LSI_VALUE)\n  #define LSI_VALUE  32000UL     /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                     /*!< Value of the Internal Low Speed oscillator in Hz\n                                                The real value may vary depending on the variations\n                                                in voltage and temperature.*/\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n  #define LSE_VALUE  32768UL    /*!< Value of the External Low Speed oscillator in Hz */\n#endif /* LSE_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n  #define LSE_STARTUP_TIMEOUT    5000UL   /*!< Time out for LSE start up, in ms */\n#endif /* LSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for SAI1 peripheral\n  *        This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source\n  *        frequency.\n  */\n#if !defined  (EXTERNAL_SAI1_CLOCK_VALUE)\n  #define EXTERNAL_SAI1_CLOCK_VALUE    48000UL /*!< Value of the SAI1 External clock source in Hz*/\n#endif /* EXTERNAL_SAI1_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n\n#define  VDD_VALUE                    3300UL /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            (15UL)    /*!< tick interrupt priority (lowest by default)  */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U                    /*!< Enable prefetch */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## Register callback feature configuration ############### */\n/**\n  * @brief Set below the peripheral configuration  to \"1U\" to add the support\n  *        of HAL callback registration/unregistration feature for the HAL\n  *        driver(s). This allows user application to provide specific callback\n  *        functions thanks to HAL_PPP_RegisterCallback() rather than overwriting\n  *        the default weak callback functions (see each stm32u5xx_hal_ppp.h file\n  *        for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef\n  *        for each PPP peripheral).\n  */\n#define  USE_HAL_ADC_REGISTER_CALLBACKS        0U /* ADC register callback disabled       */\n#define  USE_HAL_COMP_REGISTER_CALLBACKS       0U /* COMP register callback disabled      */\n#define  USE_HAL_CORDIC_REGISTER_CALLBACKS     0U /* CORDIC register callback disabled    */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS       0U /* CRYP register callback disabled      */\n#define  USE_HAL_DAC_REGISTER_CALLBACKS        0U /* DAC register callback disabled       */\n#define  USE_HAL_DCMI_REGISTER_CALLBACKS       0U /* DCMI register callback disabled      */\n#define  USE_HAL_DMA2D_REGISTER_CALLBACKS      0U /* DMA2D register callback disabled     */\n#define  USE_HAL_DSI_REGISTER_CALLBACKS        0U /* DSI register callback disabled       */\n#define  USE_HAL_ETH_REGISTER_CALLBACKS        0U /* ETH register callback disabled       */\n#define  USE_HAL_FDCAN_REGISTER_CALLBACKS      0U /* FDCAN register callback disabled     */\n#define  USE_HAL_FMAC_REGISTER_CALLBACKS       0U /* FMAC register callback disabled      */\n#define  USE_HAL_HASH_REGISTER_CALLBACKS       0U /* HASH register callback disabled      */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS        0U /* HCD register callback disabled       */\n#define  USE_HAL_GFXMMU_REGISTER_CALLBACKS     0U /* GFXMMU register callback disabled    */\n#define  USE_HAL_GPU2D_REGISTER_CALLBACKS      0U /* GPU2D register callback disabled     */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS        0U /* I2C register callback disabled       */\n#define  USE_HAL_IWDG_REGISTER_CALLBACKS       0U /* IWDG register callback disabled      */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS       0U /* IRDA register callback disabled      */\n#define  USE_HAL_LPTIM_REGISTER_CALLBACKS      0U /* LPTIM register callback disabled     */\n#define  USE_HAL_LTDC_REGISTER_CALLBACKS       0U /* LTDC register callback disabled      */\n#define  USE_HAL_MDF_REGISTER_CALLBACKS        0U /* MDF register callback disabled       */\n#define  USE_HAL_MMC_REGISTER_CALLBACKS        0U /* MMC register callback disabled       */\n#define  USE_HAL_NAND_REGISTER_CALLBACKS       0U /* NAND register callback disabled      */\n#define  USE_HAL_NOR_REGISTER_CALLBACKS        0U /* NOR register callback disabled       */\n#define  USE_HAL_OPAMP_REGISTER_CALLBACKS      0U /* MDIO register callback disabled      */\n#define  USE_HAL_OTFDEC_REGISTER_CALLBACKS     0U /* OTFDEC register callback disabled    */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS        0U /* PCD register callback disabled       */\n#define  USE_HAL_PKA_REGISTER_CALLBACKS        0U /* PKA register callback disabled       */\n#define  USE_HAL_RAMCFG_REGISTER_CALLBACKS     0U /* RAMCFG register callback disabled    */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS        0U /* RNG register callback disabled       */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS        0U /* RTC register callback disabled       */\n#define  USE_HAL_SAI_REGISTER_CALLBACKS        0U /* SAI register callback disabled       */\n#define  USE_HAL_SD_REGISTER_CALLBACKS         0U /* SD register callback disabled        */\n#define  USE_HAL_SDRAM_REGISTER_CALLBACKS      0U /* SDRAM register callback disabled     */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS  0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS      0U /* SMBUS register callback disabled     */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS        0U /* SPI register callback disabled       */\n#define  USE_HAL_SRAM_REGISTER_CALLBACKS       0U /* SRAM register callback disabled      */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS        0U /* TIM register callback disabled       */\n#define  USE_HAL_TSC_REGISTER_CALLBACKS        0U /* TSC register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS       0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS      0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS       0U /* WWDG register callback disabled      */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n * Activated: CRC code is present inside driver\n * Deactivated: CRC code cleaned from driver\n */\n#define USE_SPI_CRC                   0U\n\n/* ################## SDMMC peripheral configuration ######################### */\n\n#define USE_SD_TRANSCEIVER           0U               /*!< use uSD Transceiver */\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32u5xx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32u5xx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_ICACHE_MODULE_ENABLED\n  #include \"stm32u5xx_hal_icache.h\"\n#endif /* HAL_ICACHE_MODULE_ENABLED */\n\n#ifdef HAL_DCACHE_MODULE_ENABLED\n  #include \"stm32u5xx_hal_dcache.h\"\n#endif /* HAL_DCACHE_MODULE_ENABLED */\n\n#ifdef HAL_GTZC_MODULE_ENABLED\n  #include \"stm32u5xx_hal_gtzc.h\"\n#endif /* HAL_GTZC_MODULE_ENABLED */\n\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32u5xx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_DMA2D_MODULE_ENABLED\n  #include \"stm32u5xx_hal_dma2d.h\"\n#endif /* HAL_DMA2D_MODULE_ENABLED */\n\n#ifdef HAL_DSI_MODULE_ENABLED\n#include \"stm32u5xx_hal_dsi.h\"\n#endif /* HAL_DSI_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32u5xx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_PKA_MODULE_ENABLED\n  #include \"stm32u5xx_hal_pka.h\"\n#endif /* HAL_PKA_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32u5xx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n  #include \"stm32u5xx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32u5xx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32u5xx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_DAC_MODULE_ENABLED\n  #include \"stm32u5xx_hal_dac.h\"\n#endif /* HAL_DAC_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32u5xx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_HASH_MODULE_ENABLED\n  #include \"stm32u5xx_hal_hash.h\"\n#endif /* HAL_HASH_MODULE_ENABLED */\n\n#ifdef HAL_SRAM_MODULE_ENABLED\n  #include \"stm32u5xx_hal_sram.h\"\n#endif /* HAL_SRAM_MODULE_ENABLED */\n\n#ifdef HAL_MMC_MODULE_ENABLED\n #include \"stm32u5xx_hal_mmc.h\"\n#endif /* HAL_MMC_MODULE_ENABLED */\n\n#ifdef HAL_NOR_MODULE_ENABLED\n  #include \"stm32u5xx_hal_nor.h\"\n#endif /* HAL_NOR_MODULE_ENABLED */\n\n#ifdef HAL_NAND_MODULE_ENABLED\n  #include \"stm32u5xx_hal_nand.h\"\n#endif /* HAL_NAND_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32u5xx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32u5xx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32u5xx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_LTDC_MODULE_ENABLED\n#include \"stm32u5xx_hal_ltdc.h\"\n#endif /* HAL_LTDC_MODULE_ENABLED */\n\n#ifdef HAL_OPAMP_MODULE_ENABLED\n#include \"stm32u5xx_hal_opamp.h\"\n#endif /* HAL_OPAMP_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32u5xx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_OSPI_MODULE_ENABLED\n #include \"stm32u5xx_hal_ospi.h\"\n#endif /* HAL_OSPI_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n #include \"stm32u5xx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32u5xx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n #include \"stm32u5xx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SD_MODULE_ENABLED\n #include \"stm32u5xx_hal_sd.h\"\n#endif /* HAL_SD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32u5xx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32u5xx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32u5xx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_TSC_MODULE_ENABLED\n #include \"stm32u5xx_hal_tsc.h\"\n#endif /* HAL_TSC_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32u5xx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32u5xx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32u5xx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32u5xx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32u5xx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n #include \"stm32u5xx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n #include \"stm32u5xx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_CORDIC_MODULE_ENABLED\n #include \"stm32u5xx_hal_cordic.h\"\n#endif /* HAL_CORDIC_MODULE_ENABLED */\n\n#ifdef HAL_DCMI_MODULE_ENABLED\n #include \"stm32u5xx_hal_dcmi.h\"\n#endif /* HAL_DCMI_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n #include \"stm32u5xx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FDCAN_MODULE_ENABLED\n #include \"stm32u5xx_hal_fdcan.h\"\n#endif /* HAL_FDCAN_MODULE_ENABLED */\n\n#ifdef HAL_FMAC_MODULE_ENABLED\n #include \"stm32u5xx_hal_fmac.h\"\n#endif /* HAL_FMAC_MODULE_ENABLED */\n\n#ifdef HAL_GFXMMU_MODULE_ENABLED\n  #include \"stm32u5xx_hal_gfxmmu.h\"\n#endif /* HAL_GFXMMU_MODULE_ENABLED */\n\n#ifdef HAL_GPU2D_MODULE_ENABLED\n  #include \"stm32u5xx_hal_gpu2d.h\"\n#endif /* HAL_GPU2D_MODULE_ENABLED */\n\n#ifdef HAL_OTFDEC_MODULE_ENABLED\n #include \"stm32u5xx_hal_otfdec.h\"\n#endif /* HAL_OTFDEC_MODULE_ENABLED */\n\n#ifdef HAL_PSSI_MODULE_ENABLED\n #include \"stm32u5xx_hal_pssi.h\"\n#endif /* HAL_PSSI_MODULE_ENABLED */\n\n#ifdef HAL_RAMCFG_MODULE_ENABLED\n #include \"stm32u5xx_hal_ramcfg.h\"\n#endif /* HAL_RAMCFG_MODULE_ENABLED */\n\n#ifdef HAL_MDF_MODULE_ENABLED\n #include \"stm32u5xx_hal_mdf.h\"\n#endif /* HAL_MDF_MODULE_ENABLED */\n\n#ifdef HAL_XSPI_MODULE_ENABLED\n #include \"stm32u5xx_hal_xspi.h\"\n#endif /* HAL_XSPI_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n  #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\n  void assert_failed(uint8_t *file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32U5xx_HAL_CONF_H */\n"
  },
  {
    "path": "hw/bsp/stm32wb/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32wbxx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32wb/boards/stm32wb55nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32wb55xx)\nset(JLINK_DEVICE STM32WB55RG)\n\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/stm32wb55xx_flash_cm4.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32WB55xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32wb/boards/stm32wb55nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022, Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: STM32 P-NUCLEO-WB55\n   url: https://www.st.com/en/evaluation-tools/p-nucleo-wb55.html\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// LED\n#define LED_PORT              GPIOB\n#define LED_PIN               GPIO_PIN_5\n#define LED_STATE_ON          1\n\n// Button\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_4\n#define BUTTON_STATE_ACTIVE   0\n\n// UART Enable for STLink VCOM\n#define UART_DEV              USART1\n#define UART_CLK_EN           __HAL_RCC_USART1_CLK_ENABLE\n#define UART_GPIO_PORT        GPIOB\n#define UART_GPIO_AF          GPIO_AF7_USART1\n#define UART_TX_PIN           GPIO_PIN_6\n#define UART_RX_PIN           GPIO_PIN_7\n\n\n//--------------------------------------------------------------------+\n// RCC Clock\n//--------------------------------------------------------------------+\nstatic inline void board_clock_init(void)\n{\n  RCC_OscInitTypeDef RCC_OscInitStruct = {0};\n  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};\n  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};\n\n  // Initializes the CPU, AHB and APB buses clocks\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48 | RCC_OSCILLATORTYPE_HSE;\n  RCC_OscInitStruct.HSEState       = RCC_HSE_ON;\n  RCC_OscInitStruct.HSI48State     = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState   = RCC_PLL_ON;\n  RCC_OscInitStruct.PLL.PLLSource  = RCC_PLLSOURCE_HSE;\n  RCC_OscInitStruct.PLL.PLLM       = RCC_PLLM_DIV4;\n  RCC_OscInitStruct.PLL.PLLN       = 24;\n  RCC_OscInitStruct.PLL.PLLP       = RCC_PLLP_DIV4;\n  RCC_OscInitStruct.PLL.PLLQ       = RCC_PLLQ_DIV4;\n  RCC_OscInitStruct.PLL.PLLR       = RCC_PLLR_DIV3;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  // Initializes the CPU, AHB and APB buses clocks\n  RCC_ClkInitStruct.ClockType      = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;\n  RCC_ClkInitStruct.SYSCLKSource   = RCC_SYSCLKSOURCE_PLLCLK;\n  RCC_ClkInitStruct.AHBCLKDivider  = RCC_SYSCLK_DIV1;\n  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n  HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_3);\n\n  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USB;\n  PeriphClkInit.UsbClockSelection    = RCC_USBCLKSOURCE_HSI48;\n  HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) ;\n\n#if 0 // TODO need to check if USB clock is enabled\n  /* Enable HSI48 */\n  memset(&RCC_OscInitStruct, 0, sizeof(RCC_OscInitStruct));\n\n  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48;\n  RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;\n  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;\n  HAL_RCC_OscConfig(&RCC_OscInitStruct);\n\n  /*Enable CRS Clock*/\n  RCC_CRSInitTypeDef RCC_CRSInitStruct= {0};\n  __HAL_RCC_CRS_CLK_ENABLE();\n\n  /* Default Synchro Signal division factor (not divided) */\n  RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;\n\n  /* Set the SYNCSRC[1:0] bits according to CRS_Source value */\n  RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;\n\n  /* HSI48 is synchronized with USB SOF at 1KHz rate */\n  RCC_CRSInitStruct.ReloadValue =  __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000, 1000);\n  RCC_CRSInitStruct.ErrorLimitValue = RCC_CRS_ERRORLIMIT_DEFAULT;\n\n  /* Set the TRIM[5:0] to the default value */\n  RCC_CRSInitStruct.HSI48CalibrationValue = RCC_CRS_HSI48CALIBRATION_DEFAULT;\n\n  /* Start automatic synchronization */\n  HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);\n#endif\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32wb/boards/stm32wb55nucleo/board.mk",
    "content": "MCU_VARIANT = stm32wb55xx\n\nCFLAGS += \\\n\t-DSTM32WB55xx\n\n# For flash-jlink target\nJLINK_DEVICE = STM32WB55RG\n"
  },
  {
    "path": "hw/bsp/stm32wb/boards/stm32wb55nucleo/stm32wb55xx_flash_cm4.ld",
    "content": "/**\n*****************************************************************************\n**\n**  File        : stm32wb55xx_flash_cm4.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32WB55xx Device\n**                     1024Kbytes FLASH\n**                      128Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used.\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is without any warranty\n**                of any kind.\n**\n*****************************************************************************\n** @attention\n**\n** Copyright (c) 2019-2022 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n*****************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n/* Highest address of the user mode stack */\n_estack = 0x20030000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size  = 0x400;    /* required amount of heap  */\n_Min_Stack_Size = 0x1000;   /* required amount of stack */\n\n/* Specify the memory areas */\nMEMORY\n{\nFLASH (rx)                 : ORIGIN = 0x08000000, LENGTH = 512K\nRAM1 (xrw)                 : ORIGIN = 0x20000008, LENGTH = 0x2FFF8\nRAM_SHARED (xrw)           : ORIGIN = 0x20030000, LENGTH = 10K\n}\n\n/* Define output sections */\nSECTIONS\n{\n  /* The startup code goes first into FLASH */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data goes into FLASH */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data goes into FLASH */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab :\n  {\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n  } >FLASH\n  .ARM : {\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n  } >FLASH\n\n  .preinit_array :\n  {\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n  } >FLASH\n  .init_array :\n  {\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n  } >FLASH\n  .fini_array :\n  {\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n  } >FLASH\n\n  /* used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections goes into RAM, load LMA copy after code */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n  } >RAM1 AT> FLASH\n\n  /* Uninitialized data section */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM1\n\n  /* User_heap_stack section, used to check that there is enough RAM left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM1\n\n  /* Remove information from the standard libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0       : { *(.ARM.attributes) }\n  MAPPING_TABLE (NOLOAD) : { *(MAPPING_TABLE) } >RAM_SHARED\n  MB_MEM1 (NOLOAD)       : { *(MB_MEM1) } >RAM_SHARED\n\n  /* used by the startup to initialize .MB_MEM2 data */\n  _siMB_MEM2 = LOADADDR(.MB_MEM2);\n  .MB_MEM2 :\n  {\n    _sMB_MEM2 = . ;\n    *(MB_MEM2) ;\n    _eMB_MEM2 = . ;\n  } >RAM_SHARED AT> FLASH\n}\n"
  },
  {
    "path": "hw/bsp/stm32wb/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include \"stm32wbxx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_HP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid USB_LP_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#ifdef UART_DEV\nUART_HandleTypeDef UartHandle;\n#endif\n\nvoid board_init(void) {\n  board_clock_init();\n\n  // Enable All GPIOs clocks\n  __HAL_RCC_GPIOA_CLK_ENABLE();\n  __HAL_RCC_GPIOB_CLK_ENABLE();\n  __HAL_RCC_GPIOC_CLK_ENABLE();\n  __HAL_RCC_GPIOD_CLK_ENABLE();\n  __HAL_RCC_GPIOE_CLK_ENABLE();\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_HP_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  NVIC_SetPriority(USB_LP_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n#endif\n\n  GPIO_InitTypeDef GPIO_InitStruct;\n\n  // LED\n  GPIO_InitStruct.Pin = LED_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);\n\n#if 0\n  // MCO configuration for System clock value verification PA8 will have SYSCLK / 2\n  GPIO_InitStruct.Pin = 8;\n  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = GPIO_AF0_MCO;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n  HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_SYSCLK, RCC_MCODIV_2);\n#endif\n\n  board_led_write(false);\n\n  // Button\n  GPIO_InitStruct.Pin = BUTTON_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = BUTTON_STATE_ACTIVE ? GPIO_PULLDOWN : GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(BUTTON_PORT, &GPIO_InitStruct);\n\n#ifdef UART_DEV\n  UART_CLK_EN();\n\n  // UART\n  GPIO_InitStruct.Pin = UART_TX_PIN | UART_RX_PIN;\n  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;\n  GPIO_InitStruct.Pull = GPIO_PULLUP;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  GPIO_InitStruct.Alternate = UART_GPIO_AF;\n  HAL_GPIO_Init(UART_GPIO_PORT, &GPIO_InitStruct);\n\n  UartHandle = (UART_HandleTypeDef) {\n      .Instance        = UART_DEV,\n      .Init.BaudRate   = CFG_BOARD_UART_BAUDRATE,\n      .Init.WordLength = UART_WORDLENGTH_8B,\n      .Init.StopBits   = UART_STOPBITS_1,\n      .Init.Parity     = UART_PARITY_NONE,\n      .Init.HwFlowCtl  = UART_HWCONTROL_NONE,\n      .Init.Mode       = UART_MODE_TX_RX,\n      .Init.OverSampling = UART_OVERSAMPLING_16\n  };\n  HAL_UART_Init(&UartHandle);\n#endif\n\n  // USB Pins TODO double check USB clock and pin setup\n  // Configure USB DM and DP pins. This is optional, and maintained only for user guidance.\n  GPIO_InitStruct.Pin = (GPIO_PIN_11 | GPIO_PIN_12);\n  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;\n  GPIO_InitStruct.Pull = GPIO_NOPULL;\n  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);\n\n  HAL_PWREx_EnableVddUSB();\n  __HAL_RCC_USB_CLK_ENABLE();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState) (state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const* buf, int len) {\n#ifdef UART_DEV\n  HAL_UART_Transmit(&UartHandle, (uint8_t*) (uintptr_t) buf, len, 0xffff);\n  return len;\n#else\n  (void) buf; (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\nvoid HardFault_Handler(void) {\n  asm(\"bkpt 1\");\n}\n\n// Required by __libc_init_array in startup code if we are compiling using -nostdlib/-nostartfiles.\nvoid _init(void);\nvoid _init(void) {\n}\n"
  },
  {
    "path": "hw/bsp/stm32wb/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY wb)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis_device_${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32WB CACHE INTERNAL \"\")\n\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}_cm4.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}_cm4.s)\nif (NOT DEFINED LD_FILE_GNU)\nset(LD_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/linker/${MCU_VARIANT}_flash_cm4.ld)\nendif()\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash_cm4.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_dma.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart_ex.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_${FAMILY_MCUS})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\n    ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32wb/family.mk",
    "content": "UF2_FAMILY_ID = 0x70d16653\nST_FAMILY = wb\n\nST_PREFIX = stm32${ST_FAMILY}xx\nST_CMSIS = hw/mcu/st/cmsis_device_$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32WB\n\nCFLAGS_GCC += \\\n  -flto \\\n  -nostdlib -nostartfiles \\\n\t-Wno-error=cast-align -Wno-unused-parameter\n\nLDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs\n\nSRC_C += \\\n\tsrc/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \\\n\tsrc/portable/st/stm32_fsdev/fsdev_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_${ST_PREFIX}.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_gpio.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# Startup\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT)_cm4.s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT)_cm4.s\n\n# Linker\nLD_FILE_GCC ?= ${ST_CMSIS}/Source/Templates/gcc/linker/${MCU_VARIANT}_flash_cm4.ld\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash_cm4.icf\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32wb/stm32wbxx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32wbxx_hal_conf.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration file.\n  ******************************************************************************\n  * @attention\n  *\n  * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef __STM32WBxx_HAL_CONF_H\n#define __STM32WBxx_HAL_CONF_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n/*#define HAL_ADC_MODULE_ENABLED   */\n/*#define HAL_COMP_MODULE_ENABLED   */\n/*#define HAL_CRC_MODULE_ENABLED   */\n/*#define HAL_HSEM_MODULE_ENABLED   */\n/*#define HAL_IPCC_MODULE_ENABLED   */\n/*#define HAL_IRDA_MODULE_ENABLED   */\n/*#define HAL_LCD_MODULE_ENABLED   */\n/*#define HAL_LPTIM_MODULE_ENABLED   */\n/*#define HAL_PCD_MODULE_ENABLED   */\n/*#define HAL_PKA_MODULE_ENABLED   */\n/*#define HAL_QSPI_MODULE_ENABLED   */\n#define HAL_RTC_MODULE_ENABLED\n/*#define HAL_SAI_MODULE_ENABLED   */\n/*#define HAL_SMBUS_MODULE_ENABLED   */\n/*#define HAL_SMARTCARD_MODULE_ENABLED   */\n/*#define HAL_TSC_MODULE_ENABLED   */\n#define HAL_UART_MODULE_ENABLED\n/*#define HAL_USART_MODULE_ENABLED   */\n/*#define HAL_WWDG_MODULE_ENABLED   */\n#define HAL_CORTEX_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n#define HAL_IWDG_MODULE_ENABLED\n#define HAL_TIM_MODULE_ENABLED\n#define HAL_SPI_MODULE_ENABLED\n#define HAL_I2C_MODULE_ENABLED\n#define HAL_RNG_MODULE_ENABLED\n/*#define HAL_CRYP_MODULE_ENABLED  */\n\n#define USE_HAL_ADC_REGISTER_CALLBACKS       0u\n#define USE_HAL_COMP_REGISTER_CALLBACKS      0u\n#define USE_HAL_CRYP_REGISTER_CALLBACKS      0u\n#define USE_HAL_I2C_REGISTER_CALLBACKS       0u\n#define USE_HAL_IRDA_REGISTER_CALLBACKS      0u\n#define USE_HAL_LPTIM_REGISTER_CALLBACKS     0u\n#define USE_HAL_PCD_REGISTER_CALLBACKS       0u\n#define USE_HAL_PKA_REGISTER_CALLBACKS       0u\n#define USE_HAL_QSPI_REGISTER_CALLBACKS      0u\n#define USE_HAL_RNG_REGISTER_CALLBACKS       0u\n#define USE_HAL_RTC_REGISTER_CALLBACKS       0u\n#define USE_HAL_SAI_REGISTER_CALLBACKS       0u\n#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0u\n#define USE_HAL_SMBUS_REGISTER_CALLBACKS     0u\n#define USE_HAL_SPI_REGISTER_CALLBACKS       0u\n#define USE_HAL_TIM_REGISTER_CALLBACKS       0u\n#define USE_HAL_TSC_REGISTER_CALLBACKS       0u\n#define USE_HAL_UART_REGISTER_CALLBACKS      0u\n#define USE_HAL_USART_REGISTER_CALLBACKS     0u\n#define USE_HAL_WWDG_REGISTER_CALLBACKS      0u\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSE_VALUE)\n#define HSE_VALUE    32000000U             /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined  (HSE_STARTUP_TIMEOUT)\n  #define HSE_STARTUP_TIMEOUT    ((uint32_t)100)   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal Multiple Speed oscillator (MSI) default value.\n  *        This value is the default MSI range value after Reset.\n  */\n#if !defined  (MSI_VALUE)\n  #define MSI_VALUE    ((uint32_t)4000000) /*!< Value of the Internal oscillator in Hz*/\n#endif /* MSI_VALUE */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined  (HSI_VALUE)\n#define HSI_VALUE    16000000U            /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI1) value.\n  */\n#if !defined  (LSI1_VALUE)\n #define LSI1_VALUE  ((uint32_t)32000)       /*!< LSI1 Typical Value in Hz*/\n#endif /* LSI1_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.*/\n/**\n  * @brief Internal Low Speed oscillator (LSI2) value.\n  */\n#if !defined  (LSI2_VALUE)\n #define LSI2_VALUE  ((uint32_t)32000)       /*!< LSI2 Typical Value in Hz*/\n#endif /* LSI2_VALUE */                      /*!< Value of the Internal Low Speed oscillator in Hz\n                                             The real value may vary depending on the variations\n                                             in voltage and temperature.*/\n\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined  (LSE_VALUE)\n#define LSE_VALUE    32768U               /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n/**\n  * @brief Internal Multiple Speed oscillator (HSI48) default value.\n  *        This value is the default HSI48 range value after Reset.\n  */\n#if !defined (HSI48_VALUE)\n  #define HSI48_VALUE    ((uint32_t)48000000) /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI48_VALUE */\n\n#if !defined  (LSE_STARTUP_TIMEOUT)\n#define LSE_STARTUP_TIMEOUT    5000U      /*!< Time out for LSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for SAI1 peripheral\n  *        This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source\n  *        frequency.\n  */\n#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)\n  #define EXTERNAL_SAI1_CLOCK_VALUE    ((uint32_t)2097000) /*!< Value of the SAI1 External clock source in Hz*/\n#endif /* EXTERNAL_SAI1_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n\n#define  VDD_VALUE                    3300U   /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            0U      /*!< tick interrupt priority */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1\n#define  INSTRUCTION_CACHE_ENABLE     1\n#define  DATA_CACHE_ENABLE            1\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n * Activated: CRC code is present inside driver\n * Deactivated: CRC code cleaned from driver\n */\n\n#define USE_SPI_CRC                   0U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n#ifdef HAL_DMA_MODULE_ENABLED\n  #include \"stm32wbxx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n  #include \"stm32wbxx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n  #include \"stm32wbxx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n  #include \"stm32wbxx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n  #include \"stm32wbxx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n  #include \"stm32wbxx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n  #include \"stm32wbxx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n  #include \"stm32wbxx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_HSEM_MODULE_ENABLED\n  #include \"stm32wbxx_hal_hsem.h\"\n#endif /* HAL_HSEM_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n #include \"stm32wbxx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_IPCC_MODULE_ENABLED\n #include \"stm32wbxx_hal_ipcc.h\"\n#endif /* HAL_IPCC_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n #include \"stm32wbxx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n #include \"stm32wbxx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LCD_MODULE_ENABLED\n #include \"stm32wbxx_hal_lcd.h\"\n#endif /* HAL_LCD_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n  #include \"stm32wbxx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n  #include \"stm32wbxx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PKA_MODULE_ENABLED\n  #include \"stm32wbxx_hal_pka.h\"\n#endif /* HAL_PKA_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n #include \"stm32wbxx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_QSPI_MODULE_ENABLED\n #define USE_HAL_QSPI_REGISTER_CALLBACKS 0U\n #include \"stm32wbxx_hal_qspi.h\"\n#endif /* HAL_QSPI_MODULE_ENABLED */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n  #include \"stm32wbxx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n  #include \"stm32wbxx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n #include \"stm32wbxx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n #include \"stm32wbxx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n #include \"stm32wbxx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n #include \"stm32wbxx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n #include \"stm32wbxx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n #include \"stm32wbxx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_TSC_MODULE_ENABLED\n  #include \"stm32wbxx_hal_tsc.h\"\n#endif /* HAL_TSC_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n #include \"stm32wbxx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n #include \"stm32wbxx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n #include \"stm32wbxx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param expr If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\nvoid assert_failed(uint8_t* file, uint32_t line);\n#else\n  #define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __STM32WBxx_HAL_CONF_H */\n\n/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\n"
  },
  {
    "path": "hw/bsp/stm32wba/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"stm32wbaxx.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#if defined(__ARM_FP) && __ARM_FP >= 4\n  #define configENABLE_FPU                      1\n#else\n  #define configENABLE_FPU                      0\n#endif\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       4\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/stm32wba/boards/stm32wba_nucleo/board.cmake",
    "content": "set(MCU_VARIANT stm32wba65xx)\nset(JLINK_DEVICE STM32WBA65RI)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    STM32WBA65xx\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32wba/boards/stm32wba_nucleo/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025, Dalton Caron\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n /* metadata:\n    name: STM32 NUCLEO-WBA65RI\n    url: https://www.st.com/en/evaluation-tools/nucleo-wba65ri.html\n */\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n    // LED (user LED 1)\n#define LED_CLK_EN            __HAL_RCC_GPIOD_CLK_ENABLE\n#define LED_PORT              GPIOD\n#define LED_PIN               GPIO_PIN_8\n#define LED_STATE_ON          1\n\n// Button (user button 1)\n#define BUTTON_CLK_EN         __HAL_RCC_GPIOC_CLK_ENABLE\n#define BUTTON_PORT           GPIOC\n#define BUTTON_PIN            GPIO_PIN_13\n#define BUTTON_STATE_ACTIVE   0\n\n// USART (on STM link USB connector)\n#define USART_GPIO_CLK_EN     __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE\n#define USART_DEV             USART3\n#define USART_CLK_EN          __HAL_RCC_USART3_CLK_ENABLE\n#define USART_TX_GPIO_PORT    GPIOA\n#define USART_RX_GPIO_PORT    GPIOA\n#define USART_GPIO_AF         GPIO_AF8_USART3\n#define USART_TX_PIN          GPIO_PIN_7\n#define USART_RX_PIN          GPIO_PIN_5\n\n// USB Pins\n// These pints are only used for USB and must be in analog mode when not used.\n// They are by default configured for USB operation after reset.\n#define USB_DP_PORT           GPIOD\n#define USB_DP_PIN            GPIO_PIN_6\n\n#define USB_DM_PORT           GPIOD\n#define USB_DM_PIN            GPIO_PIN_7\n\n//--------------------------------------------------------------------+\n//    The system clock is configured as follows:\n//        System Clock source       = PLL (HSE, crystal)\n//        SYSCLK (CPU Clock)        = 64 MHz\n//        HCLK (AXI and AHB Clocks) = 64 MHz\n//        AHB Prescaler             = 1\n//        APB1 Prescaler            = 1 (APB3 Clock = 64MHz)\n//        APB2 Prescaler            = 1 (APB1 Clock = 64MHz)\n//        APB7 Prescaler            = 1 (APB2 Clock = 64MHz)\n//        HPRE5 Prescaler           = 2 (AHB5 Clock = 32MHz)\n//        HSE Frequency (Hz)        = 32 MHz\n//        PLL_M                     = 2\n//        PLL_N                     = 8\n//        PLL_P                     = 2\n//        PLL_Q                     = 2\n//        PLL_R                     = 2\n//        VDD (V)                   = 3.3 V\n//        Flash Latency             = 1  Wait States\n//--------------------------------------------------------------------+\nstatic void board_system_clock_config( void )\n{\n    RCC_OscInitTypeDef RCC_OscInitStruct = { 0 };\n    RCC_ClkInitTypeDef RCC_ClkInitStruct = { 0 };\n\n    __HAL_RCC_SYSCFG_CLK_ENABLE();\n    __HAL_RCC_PWR_CLK_ENABLE();\n\n    ( void ) HAL_PWREx_ConfigSupply( PWR_LDO_SUPPLY );\n\n    // Must be in voltage scaling mode 1 for the OTG USB HS peripheral to function\n    ( void ) HAL_PWREx_ControlVoltageScaling( PWR_REGULATOR_VOLTAGE_SCALE1 );\n\n    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;\n    RCC_OscInitStruct.HSEState = RCC_HSE_ON;\n    RCC_OscInitStruct.HSEDiv = RCC_HSE_DIV1;\n    RCC_OscInitStruct.PLL1.PLLState = RCC_PLL_ON;\n    RCC_OscInitStruct.PLL1.PLLSource = RCC_PLLSOURCE_HSE;\n    RCC_OscInitStruct.PLL1.PLLM = 2;\n    RCC_OscInitStruct.PLL1.PLLN = 8;\n    RCC_OscInitStruct.PLL1.PLLP = 2;\n    RCC_OscInitStruct.PLL1.PLLQ = 2;\n    RCC_OscInitStruct.PLL1.PLLR = 2;\n    RCC_OscInitStruct.PLL1.PLLFractional = 0;\n    ( void ) HAL_RCC_OscConfig( &RCC_OscInitStruct );\n\n    RCC_ClkInitStruct.ClockType = ( RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK\n        | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2\n        | RCC_CLOCKTYPE_PCLK7 | RCC_CLOCKTYPE_HCLK5 );\n    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;\n    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;\n    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;\n    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;\n    RCC_ClkInitStruct.APB7CLKDivider = RCC_HCLK_DIV1;\n    RCC_ClkInitStruct.AHB5_PLL1_CLKDivider = RCC_SYSCLK_PLL1_DIV2;\n    RCC_ClkInitStruct.AHB5_HSEHSI_CLKDivider = RCC_SYSCLK_HSEHSI_DIV1;\n\n    ( void ) HAL_RCC_ClockConfig( &RCC_ClkInitStruct, FLASH_LATENCY_1 );\n\n    ( void ) SystemCoreClockUpdate();\n\n    ( void ) HAL_ICACHE_Enable();\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/stm32wba/boards/stm32wba_nucleo/board.mk",
    "content": "MCU_VARIANT = stm32wba65xx\n\nCFLAGS += -DSTM32WBA65xx\n\n# For flash-jlink target\nJLINK_DEVICE = STM32WBA65RI\n"
  },
  {
    "path": "hw/bsp/stm32wba/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Dalton Caron\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: STMicroelectronics\n*/\n\n#include <stdbool.h>\n\n#include \"stm32wbaxx_hal.h\"\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n#ifndef USART_TIMEOUT_TICKS\n#define USART_TIMEOUT_TICKS 1000\n#endif\n\nstatic UART_HandleTypeDef uart_handle;\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB_OTG_HS_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nstatic void board_gpio_configuration(void) {\n  GPIO_InitTypeDef gpio_init = {0};\n\n  USART_GPIO_CLK_EN();\n  USART_CLK_EN();\n\n  // Configure USART TX pin\n  gpio_init.Pin = USART_TX_PIN;\n  gpio_init.Mode = GPIO_MODE_AF_PP;\n  gpio_init.Pull = GPIO_NOPULL;\n  gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;\n  gpio_init.Alternate = USART_GPIO_AF;\n  HAL_GPIO_Init(USART_TX_GPIO_PORT, &gpio_init);\n\n  // Configure USART RX pin\n  gpio_init.Pin = USART_RX_PIN;\n  gpio_init.Mode = GPIO_MODE_AF_PP;\n  gpio_init.Pull = GPIO_PULLUP;\n  gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;\n  gpio_init.Alternate = USART_GPIO_AF;\n  HAL_GPIO_Init(USART_RX_GPIO_PORT, &gpio_init);\n\n  // Configure the LED\n  LED_CLK_EN();\n  gpio_init.Pin = LED_PIN;\n  gpio_init.Mode = GPIO_MODE_OUTPUT_PP;\n  gpio_init.Pull = GPIO_PULLUP;\n  gpio_init.Speed = GPIO_SPEED_FREQ_LOW;\n  gpio_init.Alternate = 0;\n  HAL_GPIO_Init(LED_PORT, &gpio_init);\n\n  // Default LED state is off\n  board_led_write(false);\n\n  // Configure the button\n  BUTTON_CLK_EN();\n  gpio_init.Pin = BUTTON_PIN;\n  gpio_init.Mode = GPIO_MODE_INPUT;\n  gpio_init.Pull = GPIO_PULLUP;\n  gpio_init.Speed = GPIO_SPEED_FREQ_LOW;\n  gpio_init.Alternate = 0;\n  HAL_GPIO_Init(BUTTON_PORT, &gpio_init);\n\n  // Configure USB DM and DP pins. This is optional, and maintained only for user guidance.\n  gpio_init.Pin = (GPIO_PIN_7 | GPIO_PIN_6);\n  gpio_init.Mode = GPIO_MODE_INPUT;\n  gpio_init.Pull = GPIO_NOPULL;\n  gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;\n  HAL_GPIO_Init(GPIOD, &gpio_init);\n}\n\nstatic void board_uart_configuration(void) {\n  uart_handle = ( UART_HandleTypeDef){\n      .Instance = USART_DEV,\n      .Init.BaudRate = CFG_BOARD_UART_BAUDRATE,\n      .Init.WordLength = UART_WORDLENGTH_8B,\n      .Init.StopBits = UART_STOPBITS_1,\n      .Init.Parity = UART_PARITY_NONE,\n      .Init.HwFlowCtl = UART_HWCONTROL_NONE,\n      .Init.Mode = UART_MODE_TX_RX,\n      .Init.OverSampling = UART_OVERSAMPLING_16\n  };\n  HAL_UART_Init(&uart_handle);\n}\n\nvoid board_init(void) {\n  board_system_clock_config();\n  board_gpio_configuration();\n  board_uart_configuration();\n\n  #ifdef USB_OTG_HS\n  // STM32WBA65/64/62 only has 1 USB HS port\n\n  #if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n  #elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB_OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);\n  #endif\n\n  // USB clock enable\n  __HAL_RCC_USB_OTG_HS_CLK_ENABLE();\n  __HAL_RCC_USB_OTG_HS_PHY_CLK_ENABLE();\n\n  // See the reference manual section 11.4.7 for the USB OTG powering sequence\n\n  // Remove the VDDUSB power isolation\n  PWR->SVMCR |= PWR_SVMCR_USV;\n\n  // Enable VDD11USB supply by clearing VDD11USBDIS to 0\n  PWR->VOSR &= ~PWR_VOSR_VDD11USBDIS;\n\n  // Enable USB OTG internal power by setting USBPWREN to 1\n  PWR->VOSR |= PWR_VOSR_USBPWREN;\n\n  // Wait for VDD11USB supply to be ready in VDD11USBRDY = 1\n  while ((PWR->VOSR & PWR_VOSR_VDD11USBRDY) == 0) {}\n\n  // Enable USB OTG booster by setting USBBOOSTEN to 1\n  PWR->VOSR |= PWR_VOSR_USBBOOSTEN;\n\n  // Wait for USB OTG booster to be ready in USBBOOSTRDY = 1\n  while ((PWR->VOSR & PWR_VOSR_USBBOOSTRDY) == 0) {}\n\n  // Enable USB power on Pwrctrl CR2 register\n  PWR->SVMCR |= PWR_SVMCR_USV;\n\n  // Set the reference clock selection (must match the clock source)\n  SYSCFG->OTGHSPHYCR &= ~SYSCFG_OTGHSPHYCR_CLKSEL;\n  SYSCFG->OTGHSPHYCR |= SYSCFG_OTGHSPHYCR_CLKSEL_0 | SYSCFG_OTGHSPHYCR_CLKSEL_1 |\n      SYSCFG_OTGHSPHYCR_CLKSEL_3;// 32MHz clock\n\n  // Configuring the SYSCFG registers OTG_HS PHY\n  SYSCFG->OTGHSPHYCR |= SYSCFG_OTGHSPHYCR_EN;\n  #endif // USB_OTG_HS\n}\n\nvoid board_led_write(bool state) {\n  GPIO_PinState pin_state = (GPIO_PinState)(state ? LED_STATE_ON : (1 - LED_STATE_ON));\n  HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);\n}\n\nuint32_t board_button_read(void) { return HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == BUTTON_STATE_ACTIVE; }\n\nint board_uart_read(uint8_t *buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\nint board_uart_write(void const *buf, int len) {\n  (void) HAL_UART_Transmit(&uart_handle, (const uint8_t *) buf, len, USART_TIMEOUT_TICKS);\n  return len;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  HAL_IncTick();\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) { return system_ticks; }\n#endif\n\nvoid HardFault_Handler(void) { asm( \"bkpt 1\" ); }\n\n// Required by __libc_init_array in startup code if we are compiling using -nostdlib/-nostartfiles.\nvoid _init(void);\n\nvoid _init(void) {}\n"
  },
  {
    "path": "hw/bsp/stm32wba/family.cmake",
    "content": "include_guard()\n\nset(ST_FAMILY wba)\nset(ST_PREFIX stm32${ST_FAMILY}xx)\n\nset(ST_HAL_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx_hal_driver)\nset(ST_CMSIS ${TOP}/hw/mcu/st/cmsis-device-${ST_FAMILY})\nset(CMSIS_5 ${TOP}/lib/CMSIS_5)\n\n# include board specific\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS STM32WBA CACHE INTERNAL \"\")\n\n# ----------------------\n# Port & Speed Selection\n# ----------------------\nset(RHPORT_DEVICE 0)\nset(RHPORT_HOST 0)\n\n# WBA65/64/62 has built-in HS PHY\nset(RHPORT_DEVICE_SPEED OPT_MODE_HIGH_SPEED)\nset(RHPORT_HOST_SPEED OPT_MODE_HIGH_SPEED)\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\n# STM32WBA HAL uses uppercase MCU_VARIANT (excluding the x's) for linking and lowercase MCU_VARIANT for startup.\nstring(TOUPPER \"${MCU_VARIANT}\" UPPERCASE_MCU_VARIANT)\nstring(REGEX REPLACE \"X\" \"x\" UPPERCASE_MCU_VARIANT \"${UPPERCASE_MCU_VARIANT}\")\n\nset(STARTUP_FILE_GNU ${ST_CMSIS}/Source/Templates/gcc/startup_${MCU_VARIANT}.s)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/startup_${MCU_VARIANT}.s)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/${UPPERCASE_MCU_VARIANT}_FLASH_ns.ld)\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(LD_FILE_IAR ${ST_CMSIS}/Source/Templates/iar/linker/${MCU_VARIANT}_flash_ns.icf)\n\n#------------------------------------\n# BOARD_TARGET\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_cortex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_icache.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pwr_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_rcc_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_uart.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_gpio.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pcd.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_hal_pcd_ex.c\n    ${ST_HAL_DRIVER}/Src/${ST_PREFIX}_ll_usb.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMSIS_5}/CMSIS/Core/Include\n    ${ST_CMSIS}/Include\n    ${ST_HAL_DRIVER}/Inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_STM32WBA)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      -nostartfiles\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_Clang}\"\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_stlink(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/stm32wba/family.mk",
    "content": "UF2_FAMILY_ID = 0x70d16657\nST_FAMILY = wba\n\nST_PREFIX = stm32${ST_FAMILY}xx\nST_CMSIS = hw/mcu/st/cmsis-device-$(ST_FAMILY)\nST_HAL_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx_hal_driver\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m33\n\nCFLAGS += \\\n  -DCFG_TUSB_MCU=OPT_MCU_STM32WBA\n\nCFLAGS_GCC += \\\n  -flto \\\n  -Wno-error=cast-align -Wno-unused-parameter\n\nLDFLAGS_GCC += \\\n  -nostdlib -nostartfiles \\\n  -specs=nosys.specs -specs=nano.specs -Wl,--gc-sections\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t$(ST_CMSIS)/Source/Templates/system_${ST_PREFIX}.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_cortex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_icache.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pwr_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_rcc_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_uart.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_gpio.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pcd.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_hal_pcd_ex.c \\\n\t$(ST_HAL_DRIVER)/Src/${ST_PREFIX}_ll_usb.c\n\nINC += \\\n\t$(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/$(BOARD_PATH)/include \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(ST_CMSIS)/Include \\\n\t$(TOP)/$(ST_HAL_DRIVER)/Inc\n\n# STM32WBA HAL uses uppercase MCU_VARIANT (excluding the x's) for linking and lowercase MCU_VARIANT for startup.\nUPPERCASE_MCU_VARIANT = $(subst XX,xx,$(call to_upper,$(MCU_VARIANT)))\n\n# Startup - Manually specify lowercase version for startup file\nSRC_S_GCC += $(ST_CMSIS)/Source/Templates/gcc/startup_$(MCU_VARIANT).s\nSRC_S_IAR += $(ST_CMSIS)/Source/Templates/iar/startup_$(MCU_VARIANT).s\n\n# Linker\nLD_FILE_GCC ?= ${FAMILY_PATH}/linker/${UPPERCASE_MCU_VARIANT}_FLASH_ns.ld\nLD_FILE_IAR ?= $(ST_CMSIS)/Source/Templates/iar/linker/$(MCU_VARIANT)_flash_ns.icf\n\n# flash target using on-board stlink\nflash: flash-stlink\n"
  },
  {
    "path": "hw/bsp/stm32wba/linker/STM32WBA65xx_FLASH_ns.ld",
    "content": "/*\n******************************************************************************\n**\n**  File        : LinkerScript.ld\n**\n**  Author      : STM32CubeIDE\n**\n**  Abstract    : Linker script for STM32WBA65xx Device from STM32WBA series\n**                      2048Kbytes FLASH\n**                      512Kbytes RAM\n**\n**                Set heap size, stack size and stack location according\n**                to application requirements.\n**\n**                Set memory bank area and size if external memory is used\n**\n**  Target      : STMicroelectronics STM32\n**\n**  Distribution: The file is distributed as is, without any warranty\n**                of any kind.\n**\n******************************************************************************\n** @attention\n**\n** Copyright (c) 2024 STMicroelectronics.\n** All rights reserved.\n**\n** This software is licensed under terms that can be found in the LICENSE file\n** in the root directory of this software component.\n** If no LICENSE file comes with this software, it is provided AS-IS.\n**\n******************************************************************************\n*/\n\n/* Entry Point */\nENTRY(Reset_Handler)\n\n_Min_Heap_Size = 0x200; /* required amount of heap */\n_Min_Stack_Size = 0x400; /* required amount of stack */\n\n/* Memories definition */\nMEMORY\n{\n  RAM       (xrw)    : ORIGIN = 0x20038000,   LENGTH = 224K\n  RAM2      (xrw)    : ORIGIN = 0x20078000,   LENGTH = 32K\n  FLASH     (rx)     : ORIGIN = 0x08100000,   LENGTH = 1024K\n}\n\n/* Highest address of the user mode stack */\n_estack = ORIGIN(RAM) + LENGTH(RAM); /* end of \"RAM\" Ram type memory */\n\n/* Sections */\nSECTIONS\n{\n  /* The startup code into \"FLASH\" Rom type memory */\n  .isr_vector :\n  {\n    . = ALIGN(4);\n    KEEP(*(.isr_vector)) /* Startup code */\n    . = ALIGN(4);\n  } >FLASH\n\n  /* The program code and other data into \"FLASH\" Rom type memory */\n  .text :\n  {\n    . = ALIGN(4);\n    *(.text)           /* .text sections (code) */\n    *(.text*)          /* .text* sections (code) */\n    *(.glue_7)         /* glue arm to thumb code */\n    *(.glue_7t)        /* glue thumb to arm code */\n    *(.eh_frame)\n\n    KEEP (*(.init))\n    KEEP (*(.fini))\n\n    . = ALIGN(4);\n    _etext = .;        /* define a global symbols at end of code */\n  } >FLASH\n\n  /* Constant data into \"FLASH\" Rom type memory */\n  .rodata :\n  {\n    . = ALIGN(4);\n    *(.rodata)         /* .rodata sections (constants, strings, etc.) */\n    *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM.extab :\n  {\n    . = ALIGN(4);\n    *(.ARM.extab* .gnu.linkonce.armextab.*)\n    . = ALIGN(4);\n  } >FLASH\n\n  .ARM :\n  {\n    . = ALIGN(4);\n    __exidx_start = .;\n    *(.ARM.exidx*)\n    __exidx_end = .;\n    . = ALIGN(4);\n  } >FLASH\n\n  .preinit_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__preinit_array_start = .);\n    KEEP (*(.preinit_array*))\n    PROVIDE_HIDDEN (__preinit_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .init_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__init_array_start = .);\n    KEEP (*(SORT(.init_array.*)))\n    KEEP (*(.init_array*))\n    PROVIDE_HIDDEN (__init_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  .fini_array :\n  {\n    . = ALIGN(4);\n    PROVIDE_HIDDEN (__fini_array_start = .);\n    KEEP (*(SORT(.fini_array.*)))\n    KEEP (*(.fini_array*))\n    PROVIDE_HIDDEN (__fini_array_end = .);\n    . = ALIGN(4);\n  } >FLASH\n\n  /* Used by the startup to initialize data */\n  _sidata = LOADADDR(.data);\n\n  /* Initialized data sections into \"RAM\" Ram type memory */\n  .data :\n  {\n    . = ALIGN(4);\n    _sdata = .;        /* create a global symbol at data start */\n    *(.data)           /* .data sections */\n    *(.data*)          /* .data* sections */\n    *(.RamFunc)        /* .RamFunc sections */\n    *(.RamFunc*)       /* .RamFunc* sections */\n\n    . = ALIGN(4);\n    _edata = .;        /* define a global symbol at data end */\n\n  } >RAM AT> FLASH\n\n  /* Uninitialized data section into \"RAM\" Ram type memory */\n  . = ALIGN(4);\n  .bss :\n  {\n    /* This is used by the startup in order to initialize the .bss section */\n    _sbss = .;         /* define a global symbol at bss start */\n    __bss_start__ = _sbss;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n\n    . = ALIGN(4);\n    _ebss = .;         /* define a global symbol at bss end */\n    __bss_end__ = _ebss;\n  } >RAM\n\n  /* User_heap_stack section, used to check that there is enough \"RAM\" Ram  type memory left */\n  ._user_heap_stack :\n  {\n    . = ALIGN(8);\n    PROVIDE ( end = . );\n    PROVIDE ( _end = . );\n    . = . + _Min_Heap_Size;\n    . = . + _Min_Stack_Size;\n    . = ALIGN(8);\n  } >RAM\n\n  /* Remove information from the compiler libraries */\n  /DISCARD/ :\n  {\n    libc.a ( * )\n    libm.a ( * )\n    libgcc.a ( * )\n  }\n\n  .ARM.attributes 0 : { *(.ARM.attributes) }\n}\n"
  },
  {
    "path": "hw/bsp/stm32wba/stm32wbaxx_hal_conf.h",
    "content": "/**\n  ******************************************************************************\n  * @file    stm32wbaxx_hal_conf_template.h\n  * @author  MCD Application Team\n  * @brief   HAL configuration template file.\n  *          This file should be copied to the application folder and renamed\n  *          to stm32wbaxx_hal_conf.h.\n  ******************************************************************************\n  * @attention\n  *\n  * Copyright (c) 2022 STMicroelectronics.\n  * All rights reserved.\n  *\n  * This software is licensed under terms that can be found in the LICENSE file\n  * in the root directory of this software component.\n  * If no LICENSE file comes with this software, it is provided AS-IS.\n  *\n  ******************************************************************************\n  */\n\n/* Define to prevent recursive inclusion -------------------------------------*/\n#ifndef STM32WBAxx_HAL_CONF_H\n#define STM32WBAxx_HAL_CONF_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Exported types ------------------------------------------------------------*/\n/* Exported constants --------------------------------------------------------*/\n\n/* ########################## Module Selection ############################## */\n/**\n  * @brief This is the list of modules to be used in the HAL driver\n  */\n#define HAL_MODULE_ENABLED\n// #define HAL_ADC_MODULE_ENABLED\n// #define HAL_COMP_MODULE_ENABLED\n#define HAL_CORTEX_MODULE_ENABLED\n// #define HAL_CRC_MODULE_ENABLED\n// #define HAL_CRYP_MODULE_ENABLED\n#define HAL_DMA_MODULE_ENABLED\n#define HAL_EXTI_MODULE_ENABLED\n#define HAL_FLASH_MODULE_ENABLED\n#define HAL_GPIO_MODULE_ENABLED\n#define HAL_GTZC_MODULE_ENABLED\n#define HAL_HASH_MODULE_ENABLED\n#define HAL_HCD_MODULE_ENABLED\n#define HAL_HSEM_MODULE_ENABLED\n// #define HAL_I2C_MODULE_ENABLED\n#define HAL_ICACHE_MODULE_ENABLED\n// #define HAL_IRDA_MODULE_ENABLED\n// #define HAL_IWDG_MODULE_ENABLED\n// #define HAL_LPTIM_MODULE_ENABLED\n#define HAL_PCD_MODULE_ENABLED\n// #define HAL_PKA_MODULE_ENABLED\n#define HAL_PWR_MODULE_ENABLED\n#define HAL_RAMCFG_MODULE_ENABLED\n#define HAL_RCC_MODULE_ENABLED\n// #define HAL_RNG_MODULE_ENABLED\n// #define HAL_RTC_MODULE_ENABLED\n// #define HAL_SAI_MODULE_ENABLED\n// #define HAL_SMARTCARD_MODULE_ENABLED\n// #define HAL_SMBUS_MODULE_ENABLED\n#define HAL_SPI_MODULE_ENABLED\n#define HAL_TIM_MODULE_ENABLED\n// #define HAL_TSC_MODULE_ENABLED\n#define HAL_UART_MODULE_ENABLED\n#define HAL_USART_MODULE_ENABLED\n// #define HAL_WWDG_MODULE_ENABLED\n// #define HAL_XSPI_MODULE_ENABLED\n\n/* ########################## Oscillator Values adaptation ####################*/\n/**\n  * @brief Adjust the value of External High Speed oscillator (HSE) used in your application.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSE is used as system clock source, directly or through the PLL).\n  */\n#if !defined (HSE_VALUE)\n#define HSE_VALUE              32000000UL /*!< Value of the External oscillator in Hz */\n#endif /* HSE_VALUE */\n\n#if !defined (HSE_STARTUP_TIMEOUT)\n#define HSE_STARTUP_TIMEOUT    100UL   /*!< Time out for HSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief Internal High Speed oscillator (HSI) value.\n  *        This value is used by the RCC HAL module to compute the system frequency\n  *        (when HSI is used as system clock source, directly or through the PLL).\n  */\n#if !defined (HSI_VALUE)\n#define HSI_VALUE              16000000UL /*!< Value of the Internal oscillator in Hz*/\n#endif /* HSI_VALUE */\n\n/**\n  * @brief Internal Low Speed oscillator (LSI) value.\n  */\n#if !defined (LSI_VALUE)\n#define LSI_VALUE               32000UL    /*!< LSI Typical Value in Hz*/\n#endif /* LSI_VALUE */                     /*!< Value of the Internal Low Speed oscillator in Hz\n                                                The real value may vary depending on the variations in voltage\n                                                and temperature.*/\n\n#if defined (RCC_LSI2_SUPPORT)\n#if !defined (LSI2_VALUE)\n#define LSI2_VALUE              32000UL    /*!< LSI2 Typical Value in Hz*/\n#endif /* LSI2_VALUE */\n#endif\n\n/**\n  * @brief External Low Speed oscillator (LSE) value.\n  *        This value is used by the UART, RTC HAL module to compute the system frequency\n  */\n#if !defined (LSE_VALUE)\n#define LSE_VALUE              32768UL   /*!< Value of the External oscillator in Hz*/\n#endif /* LSE_VALUE */\n\n#if !defined (LSE_STARTUP_TIMEOUT)\n#define LSE_STARTUP_TIMEOUT    5000UL     /*!< Time out for LSE start up, in ms */\n#endif /* HSE_STARTUP_TIMEOUT */\n\n/**\n  * @brief External clock source for SAI1 peripheral\n  *        This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source\n  *        frequency.\n  */\n#if !defined (EXTERNAL_SAI1_CLOCK_VALUE)\n#define EXTERNAL_SAI1_CLOCK_VALUE  48000UL /*!< Value of the SAI1 External clock source in Hz*/\n#endif /* EXTERNAL_SAI1_CLOCK_VALUE */\n\n/* Tip: To avoid modifying this file each time you need to use different HSE,\n   ===  you can define the HSE value in your toolchain compiler preprocessor. */\n\n/* ########################### System Configuration ######################### */\n/**\n  * @brief This is the HAL system configuration section\n  */\n#define  VDD_VALUE                    3300UL /*!< Value of VDD in mv */\n#define  TICK_INT_PRIORITY            ((1UL<<__NVIC_PRIO_BITS) - 1UL)  /*!< tick interrupt priority (lowest by default) */\n#define  USE_RTOS                     0U\n#define  PREFETCH_ENABLE              1U               /*!< Enable prefetch */\n\n/* ########################## Assert Selection ############################## */\n/**\n  * @brief Uncomment the line below to expanse the \"assert_param\" macro in the\n  *        HAL drivers code\n  */\n/* #define USE_FULL_ASSERT    1U */\n\n/* ################## Register callback feature configuration ############### */\n/**\n  * @brief Set below the peripheral configuration  to \"1U\" to add the support\n  *        of HAL callback registration/unregistration feature for the HAL\n  *        driver(s). This allows user application to provide specific callback\n  *        functions thanks to HAL_PPP_RegisterCallback() rather than overwriting\n  *        the default weak callback functions (see each stm32wbaxx_hal_ppp.h file\n  *        for possible callback identifiers defined in HAL_PPP_CallbackIDTypeDef\n  *        for each PPP peripheral).\n  */\n#define  USE_HAL_ADC_REGISTER_CALLBACKS        0U /* ADC register callback disabled       */\n#define  USE_HAL_COMP_REGISTER_CALLBACKS       0U /* COMP register callback disabled      */\n#define  USE_HAL_CRYP_REGISTER_CALLBACKS       0U /* CRYP register callback disabled      */\n#define  USE_HAL_HASH_REGISTER_CALLBACKS       0U /* HASH register callback disabled      */\n#define  USE_HAL_HCD_REGISTER_CALLBACKS        0U /* HCD register callback disabled       */\n#define  USE_HAL_I2C_REGISTER_CALLBACKS        0U /* I2C register callback disabled       */\n#define  USE_HAL_IRDA_REGISTER_CALLBACKS       0U /* IRDA register callback disabled      */\n#define  USE_HAL_IWDG_REGISTER_CALLBACKS       0U /* IWDG register callback disabled      */\n#define  USE_HAL_LPTIM_REGISTER_CALLBACKS      0U /* LPTIM register callback disabled     */\n#define  USE_HAL_PCD_REGISTER_CALLBACKS        0U /* PCD register callback disabled       */\n#define  USE_HAL_PKA_REGISTER_CALLBACKS        0U /* PKA register callback disabled       */\n#define  USE_HAL_RAMCFG_REGISTER_CALLBACKS     0U /* RAMCFG register callback disabled    */\n#define  USE_HAL_RNG_REGISTER_CALLBACKS        0U /* RNG register callback disabled       */\n#define  USE_HAL_RTC_REGISTER_CALLBACKS        0U /* RTC register callback disabled       */\n#define  USE_HAL_SAI_REGISTER_CALLBACKS        0U /* SAI register callback disabled       */\n#define  USE_HAL_SMARTCARD_REGISTER_CALLBACKS  0U /* SMARTCARD register callback disabled */\n#define  USE_HAL_SMBUS_REGISTER_CALLBACKS      0U /* SMBUS register callback disabled     */\n#define  USE_HAL_SPI_REGISTER_CALLBACKS        0U /* SPI register callback disabled       */\n#define  USE_HAL_TIM_REGISTER_CALLBACKS        0U /* TIM register callback disabled       */\n#define  USE_HAL_TSC_REGISTER_CALLBACKS        0U /* TSC register callback disabled       */\n#define  USE_HAL_UART_REGISTER_CALLBACKS       0U /* UART register callback disabled      */\n#define  USE_HAL_USART_REGISTER_CALLBACKS      0U /* USART register callback disabled     */\n#define  USE_HAL_WWDG_REGISTER_CALLBACKS       0U /* WWDG register callback disabled      */\n#define  USE_HAL_XSPI_REGISTER_CALLBACKS       0U /* XSPI register callback disabled      */\n\n/* ################## SPI peripheral configuration ########################## */\n\n/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver\n * Activated: CRC code is present inside driver\n * Deactivated: CRC code cleaned from driver\n */\n#define USE_SPI_CRC                   1U\n\n/* ################## CRYP peripheral configuration ########################## */\n\n#define USE_HAL_CRYP_SUSPEND_RESUME   0U\n\n/* ################## HASH peripheral configuration ########################## */\n\n#define USE_HAL_HASH_SUSPEND_RESUME   0U\n\n/* Includes ------------------------------------------------------------------*/\n/**\n  * @brief Include module's header file\n  */\n#ifdef HAL_DMA_MODULE_ENABLED\n#include \"stm32wbaxx_hal_dma.h\"\n#endif /* HAL_DMA_MODULE_ENABLED */\n\n#ifdef HAL_RCC_MODULE_ENABLED\n#include \"stm32wbaxx_hal_rcc.h\"\n#endif /* HAL_RCC_MODULE_ENABLED */\n\n#ifdef HAL_ADC_MODULE_ENABLED\n#include \"stm32wbaxx_hal_adc.h\"\n#endif /* HAL_ADC_MODULE_ENABLED */\n\n#ifdef HAL_COMP_MODULE_ENABLED\n#include \"stm32wbaxx_hal_comp.h\"\n#endif /* HAL_COMP_MODULE_ENABLED */\n\n#ifdef HAL_CORTEX_MODULE_ENABLED\n#include \"stm32wbaxx_hal_cortex.h\"\n#endif /* HAL_CORTEX_MODULE_ENABLED */\n\n#ifdef HAL_CRC_MODULE_ENABLED\n#include \"stm32wbaxx_hal_crc.h\"\n#endif /* HAL_CRC_MODULE_ENABLED */\n\n#ifdef HAL_CRYP_MODULE_ENABLED\n#include \"stm32wbaxx_hal_cryp.h\"\n#endif /* HAL_CRYP_MODULE_ENABLED */\n\n#ifdef HAL_EXTI_MODULE_ENABLED\n#include \"stm32wbaxx_hal_exti.h\"\n#endif /* HAL_EXTI_MODULE_ENABLED */\n\n#ifdef HAL_FLASH_MODULE_ENABLED\n#include \"stm32wbaxx_hal_flash.h\"\n#endif /* HAL_FLASH_MODULE_ENABLED */\n\n#ifdef HAL_GPIO_MODULE_ENABLED\n#include \"stm32wbaxx_hal_gpio.h\"\n#endif /* HAL_GPIO_MODULE_ENABLED */\n\n#ifdef HAL_GTZC_MODULE_ENABLED\n#include \"stm32wbaxx_hal_gtzc.h\"\n#endif /* HAL_GTZC_MODULE_ENABLED */\n\n#ifdef HAL_HASH_MODULE_ENABLED\n#include \"stm32wbaxx_hal_hash.h\"\n#endif /* HAL_HASH_MODULE_ENABLED */\n\n#ifdef HAL_HCD_MODULE_ENABLED\n#include \"stm32wbaxx_hal_hcd.h\"\n#endif /* HAL_HCD_MODULE_ENABLED */\n\n#ifdef HAL_HSEM_MODULE_ENABLED\n#include \"stm32wbaxx_hal_hsem.h\"\n#endif /* HAL_HSEM_MODULE_ENABLED */\n\n#ifdef HAL_I2C_MODULE_ENABLED\n#include \"stm32wbaxx_hal_i2c.h\"\n#endif /* HAL_I2C_MODULE_ENABLED */\n\n#ifdef HAL_ICACHE_MODULE_ENABLED\n#include \"stm32wbaxx_hal_icache.h\"\n#endif /* HAL_ICACHE_MODULE_ENABLED */\n\n#ifdef HAL_IRDA_MODULE_ENABLED\n#include \"stm32wbaxx_hal_irda.h\"\n#endif /* HAL_IRDA_MODULE_ENABLED */\n\n#ifdef HAL_IWDG_MODULE_ENABLED\n#include \"stm32wbaxx_hal_iwdg.h\"\n#endif /* HAL_IWDG_MODULE_ENABLED */\n\n#ifdef HAL_LPTIM_MODULE_ENABLED\n#include \"stm32wbaxx_hal_lptim.h\"\n#endif /* HAL_LPTIM_MODULE_ENABLED */\n\n#ifdef HAL_PCD_MODULE_ENABLED\n#include \"stm32wbaxx_hal_pcd.h\"\n#endif /* HAL_PCD_MODULE_ENABLED */\n\n#ifdef HAL_PKA_MODULE_ENABLED\n#include \"stm32wbaxx_hal_pka.h\"\n#endif /* HAL_PKA_MODULE_ENABLED */\n\n#ifdef HAL_PWR_MODULE_ENABLED\n#include \"stm32wbaxx_hal_pwr.h\"\n#endif /* HAL_PWR_MODULE_ENABLED */\n\n#ifdef HAL_RAMCFG_MODULE_ENABLED\n#include \"stm32wbaxx_hal_ramcfg.h\"\n#endif /* HAL_RAMCFG_MODULE_ENABLED */\n\n#ifdef HAL_RNG_MODULE_ENABLED\n#include \"stm32wbaxx_hal_rng.h\"\n#endif /* HAL_RNG_MODULE_ENABLED */\n\n#ifdef HAL_RTC_MODULE_ENABLED\n#include \"stm32wbaxx_hal_rtc.h\"\n#endif /* HAL_RTC_MODULE_ENABLED */\n\n#ifdef HAL_SAI_MODULE_ENABLED\n#include \"stm32wbaxx_hal_sai.h\"\n#endif /* HAL_SAI_MODULE_ENABLED */\n\n#ifdef HAL_SMARTCARD_MODULE_ENABLED\n#include \"stm32wbaxx_hal_smartcard.h\"\n#endif /* HAL_SMARTCARD_MODULE_ENABLED */\n\n#ifdef HAL_SMBUS_MODULE_ENABLED\n#include \"stm32wbaxx_hal_smbus.h\"\n#endif /* HAL_SMBUS_MODULE_ENABLED */\n\n#ifdef HAL_SPI_MODULE_ENABLED\n#include \"stm32wbaxx_hal_spi.h\"\n#endif /* HAL_SPI_MODULE_ENABLED */\n\n#ifdef HAL_TIM_MODULE_ENABLED\n#include \"stm32wbaxx_hal_tim.h\"\n#endif /* HAL_TIM_MODULE_ENABLED */\n\n#ifdef HAL_TSC_MODULE_ENABLED\n#include \"stm32wbaxx_hal_tsc.h\"\n#endif /* HAL_TSC_MODULE_ENABLED */\n\n#ifdef HAL_UART_MODULE_ENABLED\n#include \"stm32wbaxx_hal_uart.h\"\n#endif /* HAL_UART_MODULE_ENABLED */\n\n#ifdef HAL_USART_MODULE_ENABLED\n#include \"stm32wbaxx_hal_usart.h\"\n#endif /* HAL_USART_MODULE_ENABLED */\n\n#ifdef HAL_WWDG_MODULE_ENABLED\n#include \"stm32wbaxx_hal_wwdg.h\"\n#endif /* HAL_WWDG_MODULE_ENABLED */\n\n#ifdef HAL_XSPI_MODULE_ENABLED\n#include \"stm32wbaxx_hal_xspi.h\"\n#endif /* HAL_XSPI_MODULE_ENABLED */\n\n/* Exported macro ------------------------------------------------------------*/\n#ifdef  USE_FULL_ASSERT\n/**\n  * @brief  The assert_param macro is used for function's parameters check.\n  * @param  expr: If expr is false, it calls assert_failed function\n  *         which reports the name of the source file and the source\n  *         line number of the call that failed.\n  *         If expr is true, it returns no value.\n  * @retval None\n  */\n#define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__))\n/* Exported functions ------------------------------------------------------- */\nvoid assert_failed(uint8_t *file, uint32_t line);\n#else\n#define assert_param(expr) ((void)0U)\n#endif /* USE_FULL_ASSERT */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* STM32WBAxx_HAL_CONF_H */\n"
  },
  {
    "path": "hw/bsp/tm4c/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #ifdef TM4C123GH6PM\n    #include \"TM4C123.h\"\n  #elif TM4C1294NCPDT\n    #include \"TM4C129.h\"\n  #else\n      #error \"Unknown TM4C device\"\n  #endif\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       3\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c123gxl/board.cmake",
    "content": "set(MCU_SUB_VARIANT 123)\n\nset(JLINK_DEVICE TM4C123GH6PM)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/tm4c123.ld)\n\nset(OPENOCD_OPTION \"-f board/ti_ek-tm4c123gxl.cfg\")\nset(UNIFLASH_OPTION \"-c ${CMAKE_CURRENT_LIST_DIR}/${BOARD}.ccxml -r 1\")\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    TM4C123GH6PM\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c123gxl/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: TM4C123G LaunchPad\n   url: https://www.ti.com/tool/EK-TM4C123GXL\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"TM4C123.h\"\n\n#define BOARD_UART            UART0\n#define BOARD_UART_PORT       GPIOA\n\n#define BTN_PORT_CLK          5\n#define BOARD_BTN_PORT        GPIOF\n#define BOARD_BTN             4\n#define BOARD_BTN_Msk         (1u<<4)\n#define BUTTON_STATE_ACTIVE   0\n\n#define LED_PORT_CLK          5\n#define LED_PORT              GPIOF\n#define LED_PIN_RED           1\n#define LED_PIN_BLUE          2\n#define LED_PIN_GREEN         3\n#define LED_STATE_ON          1\n\n#define BOARD_LED_PIN         LED_PIN_BLUE\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c123gxl/board.mk",
    "content": "MCU_SUB_VARIANT = 123\n\nCFLAGS += -DTM4C123GH6PM\n\nLD_FILE = $(BOARD_PATH)/tm4c123.ld\n\n# For flash-jlink target\nJLINK_DEVICE = TM4C123GH6PM\n\n# flash using openocd\nOPENOCD_OPTION = -f board/ti_ek-tm4c123gxl.cfg\n\nUNIFLASH_OPTION = -c ${TOP}/${BOARD_PATH}/${BOARD}.ccxml -r 1\n\nflash: flash-openocd\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c123gxl/ek_tm4c123gxl.ccxml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<configurations XML_version=\"1.2\" id=\"configurations_0\">\n<configuration XML_version=\"1.2\" id=\"configuration_0\">\n        <instance XML_version=\"1.2\" desc=\"Stellaris In-Circuit Debug Interface\" href=\"connections/Stellaris_ICDI_Connection.xml\" id=\"Stellaris In-Circuit Debug Interface\" xml=\"Stellaris_ICDI_Connection.xml\" xmlpath=\"connections\"/>\n        <connection XML_version=\"1.2\" id=\"Stellaris In-Circuit Debug Interface\">\n\n        \t\t   <instance XML_version=\"1.2\" href=\"drivers/stellaris_cs_dap.xml\" id=\"drivers\" xml=\"stellaris_cs_dap.xml\" xmlpath=\"drivers\"/>\n\n        \t\t   <instance XML_version=\"1.2\" href=\"drivers/stellaris_cortex_m4.xml\" id=\"drivers\" xml=\"stellaris_cortex_m4.xml\" xmlpath=\"drivers\"/>\n\n\n            <platform XML_version=\"1.2\" id=\"platform_0\">\n                <instance XML_version=\"1.2\" desc=\"Tiva TM4C123GH6PM\" href=\"devices/tm4c123gh6pm.xml\" id=\"Tiva TM4C123GH6PM\" xml=\"tm4c123gh6pm.xml\" xmlpath=\"devices\"/>\n            </platform>\n        </connection>\n    </configuration>\n</configurations>\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c123gxl/tm4c123.ld",
    "content": "ENTRY(Reset_Handler)\n\n_estack = 0x20008000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0;      /* required amount of heap  */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n\nMEMORY\n{\n    FLASH(rx) : ORIGIN = 0x00000000, LENGTH = 256K\n    SRAM(rwx) : ORIGIN = 0x20000000, LENGTH = 32K\n}\n\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4) ;\n        KEEP(*(.vectors))\n        *(.text)\n        *(.text.*)\n        *(.init)\n        *(.fini)\n        *(.rodata)\n        *(.rodata.*)\n        *(.ARM.exidx*)\n        . = ALIGN(4) ;\n        __end_text = . ;\n    } >FLASH\n\n    .data : AT(ADDR(.text) + SIZEOF(.text))\n    {\n        . = ALIGN(4);\n        __start_data = . ;\n        __la_data = LOADADDR(.data);\n        *(.data)\n        *(.data.*)\n        . = ALIGN(4);\n        __end_data = . ;\n\n    } >SRAM\n\n    .bss :\n    {\n        . = ALIGN(4) ;\n        __start_bss = . ;\n        __bss_start__ = __start_bss;\n        *(.bss)\n        *(.bss.*)\n        *(.COMMON)\n        __end_bss = . ;\n        . = ALIGN(4);\n    }>SRAM\n\n    /* User_heap_stack section, used to check that there is enough RAM left */\n    ._user_heap_stack :\n    {\n        . = ALIGN(8);\n        PROVIDE ( end = . );\n        PROVIDE ( _end = . );\n        . = . + _Min_Heap_Size;\n        . = . + _Min_Stack_Size;\n        . = ALIGN(8);\n    } >SRAM\n}\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c1294xl/TM4C1294NC.icf",
    "content": "/*###ICF### Section handled by ICF editor, don't touch! ****/\n/*-Editor annotation file-*/\n/* IcfEditorFile=\"$TOOLKIT_DIR$\\config\\ide\\IcfEditor\\cortex_v1_0.xml\" */\n/*-Specials-*/\ndefine symbol __ICFEDIT_intvec_start__ = 0x00000000;\n/*-Memory Regions-*/\ndefine symbol __ICFEDIT_region_ROM_start__   = 0x00000000;\ndefine symbol __ICFEDIT_region_ROM_end__     = 0x000FFFFF;\ndefine symbol __ICFEDIT_region_RAM_start__   = 0x20000000;\ndefine symbol __ICFEDIT_region_RAM_end__     = 0x2003FFFF;\n/*-Sizes-*/\ndefine symbol __ICFEDIT_size_cstack__   = 0x8000;\ndefine symbol __ICFEDIT_size_heap__     = 0x10000;\n/**** End of ICF editor section. ###ICF###*/\n\ndefine memory mem with size = 4G;\ndefine region ROM_region   = mem:[from __ICFEDIT_region_ROM_start__   to __ICFEDIT_region_ROM_end__];\ndefine region RAM_region   = mem:[from __ICFEDIT_region_RAM_start__   to __ICFEDIT_region_RAM_end__];\n\ndefine block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };\ndefine block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };\n\ninitialize by copy { readwrite };\n\nplace at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };\nplace in ROM_region   { readonly };\nplace in RAM_region   { readwrite,\n                        block CSTACK, block HEAP };\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c1294xl/board.cmake",
    "content": "set(MCU_SUB_VARIANT 129)\n\nset(JLINK_DEVICE TM4C1294NCPDT)\nset(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/tm4c1294nc.ld)\nset(LD_FILE_IAR ${CMAKE_CURRENT_LIST_DIR}/TM4C1294NC.icf)\n\nset(OPENOCD_OPTION \"-f board/ti_ek-tm4c1294xl.cfg\")\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    TM4C1294NCPDT\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c1294xl/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: TM4C1294 LaunchPad\n   url: https://www.ti.com/tool/EK-TM4C1294XL\n*/\n\n#ifndef _BOARD_H_\n#define _BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"TM4C129.h\"\n\n#define BOARD_UART            UART0\n#define BOARD_UART_PORT       GPIOA\n\n#define BTN_PORT_CLK          8\n#define BOARD_BTN_PORT        GPIOJ\n#define BOARD_BTN             0\n#define BOARD_BTN_Msk         (1u<<0)\n#define BUTTON_STATE_ACTIVE   0\n\n#define LED_PORT_CLK          12\n#define LED_PORT              GPION\n#define LED_PIN_1             1\n#define LED_PIN_2             0\n#define LED_STATE_ON          1\n\n#define BOARD_LED_PIN         LED_PIN_2\n\n#define GPIOA                 GPIOA_AHB\n#define GPIOB                 GPIOB_AHB\n#define GPIOC                 GPIOC_AHB\n#define GPIOD                 GPIOD_AHB\n#define GPIOE                 GPIOE_AHB\n#define GPIOF                 GPIOF_AHB\n#define GPIOG                 GPIOG_AHB\n#define GPIOH                 GPIOH_AHB\n#define GPIOI                 GPIOI_AHB\n#define GPIOJ                 GPIOJ_AHB\n\n#define GPIOA_Type            GPIOA_AHB_Type\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c1294xl/board.mk",
    "content": "MCU_SUB_VARIANT = 129\n\nCFLAGS += -DTM4C1294NCPDT\n\nLD_FILE_GCC = $(BOARD_PATH)/tm4c1294nc.ld\nLD_FILE_IAR = $(BOARD_PATH)/TM4C1294NC.icf\n\n# For flash-jlink target\nJLINK_DEVICE = TM4C1294NCPDT\n\n# flash using openocd\nOPENOCD_OPTION = -f board/ti_ek-tm4c1294xl.cfg\n\nUNIFLASH_OPTION = -c ${TOP}/${BOARD_PATH}/${BOARD}.ccxml -r 1\n\nflash: flash-openocd\n"
  },
  {
    "path": "hw/bsp/tm4c/boards/ek_tm4c1294xl/tm4c1294nc.ld",
    "content": "ENTRY(Reset_Handler)\n\n_estack = 0x20008000;    /* end of RAM */\n/* Generate a link error if heap and stack don't fit into RAM */\n_Min_Heap_Size = 0;      /* required amount of heap  */\n_Min_Stack_Size = 0x1000; /* required amount of stack */\n\n\nMEMORY\n{\n    FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 0x00100000\n    SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x00040000\n}\n\nSECTIONS\n{\n    .text :\n    {\n        . = ALIGN(4) ;\n        _text = . ;\n        KEEP(*(.isr_vector))\n        *(.text)\n        *(.text.*)\n        *(.init)\n        *(.fini)\n        *(.rodata)\n        *(.rodata.*)\n        *(.ARM.exidx*)\n        _etext = . ;\n        . = ALIGN(4) ;\n    } >FLASH\n\n    .data : AT(ADDR(.text) + SIZEOF(.text))\n    {\n        _data = .;\n        . = ALIGN(4);\n        _ldata = LOADADDR (.data);\n        *(.data)\n        *(.data.*)\n        _edata = .;\n        . = ALIGN(4);\n\n    } >SRAM\n\n    .bss :\n    {\n        . = ALIGN(4) ;\n        _bss = .;\n        *(.bss)\n        *(.bss.*)\n        *(.COMMON)\n        _ebss = .;\n        . = ALIGN(4);\n    }>SRAM\n\n    /* User_heap_stack section, used to check that there is enough RAM left */\n    ._user_heap_stack :\n    {\n        . = ALIGN(8);\n        PROVIDE ( end = . );\n        PROVIDE ( _end = . );\n        . = . + _Min_Heap_Size;\n        . = . + _Min_Stack_Size;\n        . = ALIGN(8);\n    } >SRAM\n}\n"
  },
  {
    "path": "hw/bsp/tm4c/family.c",
    "content": "/* metadata:\n   manufacturer: Texas Instruments\n*/\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_Handler(void) {\n#if CFG_TUH_ENABLED\n  tuh_int_handler(0, true);\n#endif\n\n#if CFG_TUD_ENABLED\n  tud_int_handler(0);\n#endif\n}\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\n\nstatic void board_uart_init(void) {\n  SYSCTL->RCGCUART |= (1 << 0);                // Enable the clock to UART0\n  SYSCTL->RCGCGPIO |= (1 << 0);                // Enable the clock to GPIOA\n\n  while (!(SYSCTL->PRGPIO & (1 << 0))) {}      // Wait for the GPIOA clock to stabilize\n  while (!(SYSCTL->PRUART & (1 << 0))) {}      // Wait for the UART0 clock to stabilize\n\n  GPIOA->AFSEL |= (1 << 1) | (1 << 0);         // Enable the alternate function on pin PA0 & PA1\n  GPIOA->PCTL |= (1 << 0) | (1 << 4);          // Configure the GPIOPCTL register to select UART0 in PA0 and PA1\n  GPIOA->DEN |= (1 << 0) | (1 << 1);           // Enable the digital functionality in PA0 and PA1\n\n  // BAUDRATE = 115200, with SystemCoreClock = 50 Mhz refer manual for calculation\n  //  - BRDI = SystemCoreClock / (16* baud)\n  //  - BRDF = int(fraction*64 + 0.5)\n  UART0->CTL &= ~(1 << 0);                     // Disable UART0 by clearing UARTEN bit in the UARTCTL register\n  UART0->IBRD = 27;                            // Write the integer portion of the BRD to the UARTIRD register\n  UART0->FBRD = 8;                             // Write the fractional portion of the BRD to the UARTFBRD registerer\n\n  UART0->LCRH = (0x3 << 5);                    // 8-bit, no parity, 1 stop bit\n  UART0->CC = 0x0;                             // Configure the UART clock source as system clock\n\n  UART0->CTL = (1 << 0) | (1 << 8) | (1 << 9); // UART0 Enable, Transmit Enable, Receive Enable\n}\n\nstatic void board_button_init(GPIOA_Type* port, uint8_t PinMsk) {\n  /* Enable Port Clock */\n  SYSCTL->RCGCGPIO |= (1 << BTN_PORT_CLK);\n\n  /* Let the clock stabilize */\n  while (!((SYSCTL->PRGPIO) & (1 << BTN_PORT_CLK))) {}\n\n  /* Port Digital Enable */\n  port->DEN |= PinMsk;\n\n  /* Set direction */\n  port->DIR &= ~PinMsk;\n}\n\nstatic void board_led_init(GPIOA_Type* port, uint8_t PinMsk, uint8_t dirmsk) {\n  /* Enable Port Clock */\n  SYSCTL->RCGCGPIO |= (1 << LED_PORT_CLK);\n\n  /* Let the clock stabilize */\n  while (!((SYSCTL->PRGPIO) & (1 << LED_PORT_CLK))) {}\n\n  /* Port Digital Enable */\n  port->DEN |= PinMsk;\n\n  /* Set direction */\n  port->DIR = dirmsk;\n}\n\nstatic void WriteGPIOPin(GPIOA_Type* port, uint8_t PinMsk, bool state) {\n  if (state) {\n    port->DATA |= PinMsk;\n  } else {\n    port->DATA &= ~(PinMsk);\n  }\n}\n\nstatic uint32_t ReadGPIOPin(GPIOA_Type* port, uint8_t pinMsk) {\n  return (port->DATA & pinMsk);\n}\n\nvoid board_init(void) {\n#ifdef TM4C123_H\n  SystemCoreClockUpdate();\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n#ifdef TM4C123_H\n  /* Reset USB */\n  SYSCTL->SRCR2 |= (1u << 16);\n\n  for (volatile uint8_t i = 0; i < 20; i++) {}\n\n  SYSCTL->SRCR2 &= ~(1u << 16);\n\n  /* Open the USB clock gate */\n  SYSCTL->RCGCUSB |= (1 << 0);\n\n  /* Power-up USB PLL */\n  SYSCTL->RCC2 &= ~(1u << 14);\n\n  /* USB IO Initialization */\n  SYSCTL->RCGCGPIO |= (1u << 3);\n\n    /* Let the clock stabilize */\n  while (!(SYSCTL->PRGPIO & (1u << 3))) {}\n\n  /* USB IOs to Analog Mode */\n  GPIOD->AFSEL &= ~((1u << 4) | (1u << 5));\n  GPIOD->DEN &= ~((1u << 4) | (1u << 5));\n  GPIOD->AMSEL |= ((1u << 4) | (1u << 5));\n\n#else // TM4C129\n  /* Reset USB */\n  SYSCTL->SRUSB = 1;\n\n  for (volatile uint8_t i = 0; i < 20; i++) {}\n\n  SYSCTL->SRUSB = 0;\n\n  /* Open the USB clock gate */\n  SYSCTL->RCGCUSB = 1;\n\n  /* Let the clock stabilize */\n  while(!(SYSCTL->PRUSB & 1)) {}\n\n  /* USB IO Initialization */\n  SYSCTL->RCGCGPIO |= (1u << 10);\n\n  /* Let the clock stabilize */\n  while (!(SYSCTL->PRGPIO & (1u << 10))) {}\n\n  /* USB IOs to Analog Mode */\n  GPIOL->AFSEL &= ~((1u << 6) | (1u << 7));\n  GPIOL->DEN &= ~((1u << 6) | (1u << 7));\n  GPIOL->AMSEL |= ((1u << 6) | (1u << 7));\n\n  /* USB Clock Configuration */\n  USB0->CC = 0x207;\n#endif\n\n  uint8_t leds = 1 << BOARD_LED_PIN;\n  uint8_t dirmsk = 1 << BOARD_LED_PIN;\n\n  /* Configure GPIO for board button */\n  board_button_init(BOARD_BTN_PORT, BOARD_BTN_Msk);\n\n  /* Configure GPIO for board LED */\n  board_led_init(LED_PORT, leds, dirmsk);\n\n  /* Initialize board UART */\n  board_uart_init();\n\n  TU_LOG1_INT(SystemCoreClock);\n}\n\nvoid board_led_write(bool state) {\n  WriteGPIOPin(LED_PORT, (1 << BOARD_LED_PIN), state);\n}\n\nuint32_t board_button_read(void) {\n  uint32_t gpio_value = ReadGPIOPin(BOARD_BTN_PORT, BOARD_BTN_Msk);\n  return BUTTON_STATE_ACTIVE ? gpio_value : !gpio_value;\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  (void) max_len;\n  uint8_t const len = 8;\n  // Note: DID0, DID1 are variant ID, they aer used since TM4C123 does not have unique ID\n  memcpy(id, (void*)(uintptr_t) &SYSCTL->DID0, len);\n  return len;\n}\n\nint board_uart_write(void const* buf, int len) {\n  uint8_t const* data = buf;\n\n  for (int i = 0; i < len; i++) {\n    while ((UART0->FR & (1 << 5)) != 0) {} // Poll until previous data was shofted out\n    UART0->DR = data[i];                   // Write UART0 DATA REGISTER\n  }\n\n  return len;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n  (void) buf;\n  (void) len;\n  return 0;\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n"
  },
  {
    "path": "hw/bsp/tm4c/family.cmake",
    "content": "include_guard()\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\nset(MCU_VARIANT tm4c${MCU_SUB_VARIANT})\nset(MCU_VARIANT_UPPER TM4C${MCU_SUB_VARIANT})\n\nset(SDK_DIR ${TOP}/hw/mcu/ti/tm4c)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS TM4C CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/Source/GCC/${MCU_VARIANT}_startup.c)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\nset(STARTUP_FILE_IAR ${SDK_DIR}/Source/IAR/${MCU_VARIANT}_startup.c)\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/Source/system_${MCU_VARIANT_UPPER}.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/Include\n    ${CMSIS_DIR}/CMSIS/Core/Include\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_TM4C${MCU_SUB_VARIANT})\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${TOP}/src/portable/mentor/musb/dcd_musb.c\n    ${TOP}/src/portable/mentor/musb/hcd_musb.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs --specs=nano.specs\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    message(FATAL_ERROR \"Clang is not supported\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n    set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n      SKIP_LINTING ON\n      COMPILE_OPTIONS -w)\n  endif ()\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\n  family_flash_openocd(${TARGET})\n  family_flash_uniflash(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/tm4c/family.mk",
    "content": "include $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nMCU_VARIANT = tm4c${MCU_SUB_VARIANT}\nMCU_VARIANT_UPPER = TM4C${MCU_SUB_VARIANT}\n\nSDK_DIR = hw/mcu/ti/tm4c\n\nCFLAGS += \\\n  -flto \\\n  -DCFG_TUSB_MCU=OPT_MCU_TM4C${MCU_SUB_VARIANT} \\\n  -uvectors \\\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-error=strict-prototypes -Wno-error=cast-qual\n\nLDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs\n\nINC += \\\n\t$(TOP)/lib/CMSIS_5/CMSIS/Core/Include \\\n\t$(TOP)/$(SDK_DIR)/Include \\\n\t$(TOP)/$(BOARD_PATH)\n\nSRC_C += \\\n\tsrc/portable/mentor/musb/dcd_musb.c \\\n\tsrc/portable/mentor/musb/hcd_musb.c \\\n\t$(SDK_DIR)/Source/system_${MCU_VARIANT_UPPER}.c \\\n\t$(SDK_DIR)/Source/GCC/${MCU_VARIANT}_startup.c\n"
  },
  {
    "path": "hw/bsp/xmc4000/FreeRTOSConfig/FreeRTOSConfig.h",
    "content": "/*\n * FreeRTOS Kernel V10.0.0\n * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software. If you wish to use our Amazon\n * FreeRTOS name, please do so in a fair use way that does not cause confusion.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n *\n * http://www.FreeRTOS.org\n * http://aws.amazon.com/freertos\n *\n * 1 tab == 4 spaces!\n */\n\n\n#ifndef FREERTOS_CONFIG_H\n#define FREERTOS_CONFIG_H\n\n/*-----------------------------------------------------------\n * Application specific definitions.\n *\n * These definitions should be adjusted for your particular hardware and\n * application requirements.\n *\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\n *\n * See http://www.freertos.org/a00110.html.\n *----------------------------------------------------------*/\n\n// skip if included from IAR assembler\n#ifndef __IASMARM__\n  #include \"xmc_device.h\"\n#endif\n\n/* Cortex M23/M33 port configuration. */\n#define configENABLE_MPU                        0\n#define configENABLE_FPU                        1\n#define configENABLE_TRUSTZONE                  0\n#define configMINIMAL_SECURE_STACK_SIZE         (1024)\n\n#define configUSE_PREEMPTION                    1\n#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0\n#define configCPU_CLOCK_HZ                      SystemCoreClock\n#define configTICK_RATE_HZ                      ( 1000 )\n#define configMAX_PRIORITIES                    ( 5 )\n#define configMINIMAL_STACK_SIZE                ( 128 )\n#define configTOTAL_HEAP_SIZE                   ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )\n#define configMAX_TASK_NAME_LEN                 16\n#define configUSE_16_BIT_TICKS                  0\n#define configIDLE_SHOULD_YIELD                 1\n#define configUSE_MUTEXES                       1\n#define configUSE_RECURSIVE_MUTEXES             1\n#define configUSE_COUNTING_SEMAPHORES           1\n#define configQUEUE_REGISTRY_SIZE               4\n#define configUSE_QUEUE_SETS                    0\n#define configUSE_TIME_SLICING                  0\n#define configUSE_NEWLIB_REENTRANT              0\n#define configENABLE_BACKWARD_COMPATIBILITY     1\n#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP   0\n\n#define configSUPPORT_STATIC_ALLOCATION         1\n#define configSUPPORT_DYNAMIC_ALLOCATION        0\n\n/* Hook function related definitions. */\n#define configUSE_IDLE_HOOK                    0\n#define configUSE_TICK_HOOK                    0\n#define configUSE_MALLOC_FAILED_HOOK           0 // cause nested extern warning\n#define configCHECK_FOR_STACK_OVERFLOW         2\n#define configCHECK_HANDLER_INSTALLATION       0\n\n/* Run time and task stats gathering related definitions. */\n#define configGENERATE_RUN_TIME_STATS          0\n#define configRECORD_STACK_HIGH_ADDRESS        1\n#define configUSE_TRACE_FACILITY               1 // legacy trace\n#define configUSE_STATS_FORMATTING_FUNCTIONS   0\n\n/* Co-routine definitions. */\n#define configUSE_CO_ROUTINES                  0\n#define configMAX_CO_ROUTINE_PRIORITIES        2\n\n/* Software timer related definitions. */\n#define configUSE_TIMERS                       1\n#define configTIMER_TASK_PRIORITY              (configMAX_PRIORITIES-2)\n#define configTIMER_QUEUE_LENGTH               32\n#define configTIMER_TASK_STACK_DEPTH           configMINIMAL_STACK_SIZE\n\n/* Optional functions - most linkers will remove unused functions anyway. */\n#define INCLUDE_vTaskPrioritySet               0\n#define INCLUDE_uxTaskPriorityGet              0\n#define INCLUDE_vTaskDelete                    0\n#define INCLUDE_vTaskSuspend                   1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY\n#define INCLUDE_xResumeFromISR                 0\n#define INCLUDE_vTaskDelayUntil                1\n#define INCLUDE_vTaskDelay                     1\n#define INCLUDE_xTaskGetSchedulerState         0\n#define INCLUDE_xTaskGetCurrentTaskHandle      1\n#define INCLUDE_uxTaskGetStackHighWaterMark    0\n#define INCLUDE_xTaskGetIdleTaskHandle         0\n#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0\n#define INCLUDE_pcTaskGetTaskName              0\n#define INCLUDE_eTaskGetState                  0\n#define INCLUDE_xEventGroupSetBitFromISR       0\n#define INCLUDE_xTimerPendFunctionCall         0\n\n/* FreeRTOS hooks to NVIC vectors */\n#define xPortPendSVHandler    PendSV_Handler\n#define xPortSysTickHandler   SysTick_Handler\n#define vPortSVCHandler       SVC_Handler\n\n//--------------------------------------------------------------------+\n// Interrupt nesting behavior configuration.\n//--------------------------------------------------------------------+\n\n// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header\n#define configPRIO_BITS       6\n\n/* The lowest interrupt priority that can be used in a call to a \"set priority\" function. */\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY\t\t\t  ((1<<configPRIO_BITS) - 1)\n\n/* The highest interrupt priority that can be used by any interrupt service\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY\t2\n\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\nto all Cortex-M ports, and do not rely on any particular library functions. */\n#define configKERNEL_INTERRUPT_PRIORITY \t\t          ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY \t        ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n\n#endif\n"
  },
  {
    "path": "hw/bsp/xmc4000/boards/xmc4500_relax/board.cmake",
    "content": "set(MCU_VARIANT XMC4500)\n\nset(JLINK_DEVICE XMC4500-1024)\n#set(JLINK_OPTION \"-USB 000551005307\")\nset(LD_FILE_GNU ${SDK_DIR}/CMSIS/Infineon/COMPONENT_${MCU_VARIANT}/Source/TOOLCHAIN_GCC_ARM/XMC4500x1024.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    XMC4500_F100x1024\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/xmc4000/boards/xmc4500_relax/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: XMC4500 relax kit\n   url: https://www.infineon.com/cms/en/product/evaluation-boards/kit_xmc45_relax_v1/\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PIN               P1_1\n#define LED_STATE_ON          1\n\n#define BUTTON_PIN            P1_14\n#define BUTTON_STATE_ACTIVE   0\n\n//#define UART_DEV              USART6\n//#define UART_CLK_EN           __HAL_RCC_USART6_CLK_ENABLE\n//#define UART_GPIO_AF          GPIO_AF8_USART6\n//\n//#define UART_TX_PORT          GPIOC\n//#define UART_TX_PIN           GPIO_PIN_6\n//\n//#define UART_RX_PORT          GPIOC\n//#define UART_RX_PIN           GPIO_PIN_7\n\nstatic inline void board_clock_init(void)\n{\n  /* Clock configuration */\n  /* fPLL = 120MHz */\n  /* fSYS = 120MHz */\n  /* fUSBPLL = 192MHz */\n  /* fUSB = 48MHz */\n  const XMC_SCU_CLOCK_CONFIG_t clock_config =\n  {\n    .syspll_config.p_div  = 2,\n    .syspll_config.n_div  = 80,\n    .syspll_config.k_div  = 4,\n    .syspll_config.mode   = XMC_SCU_CLOCK_SYSPLL_MODE_NORMAL,\n    .syspll_config.clksrc = XMC_SCU_CLOCK_SYSPLLCLKSRC_OSCHP,\n    .enable_oschp         = true,\n    .calibration_mode     = XMC_SCU_CLOCK_FOFI_CALIBRATION_MODE_FACTORY,\n    .fsys_clksrc          = XMC_SCU_CLOCK_SYSCLKSRC_PLL,\n    .fsys_clkdiv          = 1,\n    .fcpu_clkdiv          = 1,\n    .fccu_clkdiv          = 1,\n    .fperipheral_clkdiv   = 1\n  };\n\n  /* Setup settings for USB clock */\n  XMC_SCU_CLOCK_Init(&clock_config);\n\n  XMC_SCU_CLOCK_EnableUsbPll();\n  XMC_SCU_CLOCK_StartUsbPll(2, 64);\n  XMC_SCU_CLOCK_SetUsbClockDivider(4);\n  XMC_SCU_CLOCK_SetUsbClockSource(XMC_SCU_CLOCK_USBCLKSRC_USBPLL);\n  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_USB);\n}\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/xmc4000/boards/xmc4500_relax/board.mk",
    "content": "MCU_VARIANT = XMC4500\nCFLAGS += \\\n  -DXMC4500_F100x1024 \\\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-stringop-overread\n\nLD_FILE = $(SDK_DIR)/CMSIS/Infineon/COMPONENT_$(MCU_VARIANT)/Source/TOOLCHAIN_GCC_ARM/XMC4500x1024.ld\n\nJLINK_DEVICE = XMC4500-1024\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/xmc4000/boards/xmc4700_relax/board.cmake",
    "content": "set(MCU_VARIANT XMC4700)\n\nset(JLINK_DEVICE XMC4700-2048)\nset(LD_FILE_GNU ${SDK_DIR}/CMSIS/Infineon/COMPONENT_${MCU_VARIANT}/Source/TOOLCHAIN_GCC_ARM/XMC4700x2048.ld)\n\nfunction(update_board TARGET)\n  target_compile_definitions(${TARGET} PUBLIC\n    XMC4700_F144x2048\n    )\nendfunction()\n"
  },
  {
    "path": "hw/bsp/xmc4000/boards/xmc4700_relax/board.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   name: XMC4700 relax kit\n   url: https://www.infineon.com/cms/en/product/evaluation-boards/kit_xmc47_relax_v1/\n*/\n\n#ifndef BOARD_H_\n#define BOARD_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define LED_PIN               P5_9\n#define LED_STATE_ON          1\n\n#define BUTTON_PIN            P15_13\n#define BUTTON_STATE_ACTIVE   0\n\n#define UART_DEV              XMC_UART0_CH0\n#define UART_TX_PIN           P1_5\n#define UART_TX_PIN_AF        P1_5_AF_U0C0_DOUT0\n#define UART_RX_PIN           P1_4\n#define UART_RX_INPUT         USIC0_C0_DX0_P1_4\n\nstatic inline void board_clock_init(void)\n{\n  /* Clock configuration */\n  /* fPLL = 144MHz */\n  /* fSYS = 144MHz */\n  /* fUSB = 48MHz */\n  const XMC_SCU_CLOCK_CONFIG_t clock_config =\n  {\n    .syspll_config.p_div  = 2,\n    .syspll_config.n_div  = 48,\n    .syspll_config.k_div  = 1,\n    .syspll_config.mode   = XMC_SCU_CLOCK_SYSPLL_MODE_NORMAL,\n    .syspll_config.clksrc = XMC_SCU_CLOCK_SYSPLLCLKSRC_OSCHP,\n    .enable_oschp         = true,\n    .calibration_mode     = XMC_SCU_CLOCK_FOFI_CALIBRATION_MODE_FACTORY,\n    .fsys_clksrc          = XMC_SCU_CLOCK_SYSCLKSRC_PLL,\n    .fsys_clkdiv          = 2,\n    .fcpu_clkdiv          = 1,\n    .fccu_clkdiv          = 1,\n    .fperipheral_clkdiv   = 1\n  };\n\n  /* Setup settings for USB clock */\n  XMC_SCU_CLOCK_Init(&clock_config);\n\n  XMC_SCU_CLOCK_SetUsbClockDivider(6);\n  XMC_SCU_CLOCK_SetUsbClockSource(XMC_SCU_CLOCK_USBCLKSRC_SYSPLL);\n  XMC_SCU_CLOCK_EnableClock(XMC_SCU_CLOCK_USB);\n}\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* BOARD_H_ */\n"
  },
  {
    "path": "hw/bsp/xmc4000/boards/xmc4700_relax/board.mk",
    "content": "MCU_VARIANT = XMC4700\nCFLAGS += \\\n  -DXMC4700_F144x2048 \\\n\n# mcu driver cause following warnings\nCFLAGS += -Wno-stringop-overread\n\nLD_FILE = $(SDK_DIR)/CMSIS/Infineon/COMPONENT_$(MCU_VARIANT)/Source/TOOLCHAIN_GCC_ARM/XMC4700x2048.ld\n\nJLINK_DEVICE = XMC4700-2048\n\nflash: flash-jlink\n"
  },
  {
    "path": "hw/bsp/xmc4000/family.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/* metadata:\n   manufacturer: Infineon\n*/\n\n#include \"xmc_gpio.h\"\n#include \"xmc_scu.h\"\n#include \"xmc_uart.h\"\n\n#include \"bsp/board_api.h\"\n#include \"board.h\"\n\n\n//--------------------------------------------------------------------+\n// Forward USB interrupt events to TinyUSB IRQ Handler\n//--------------------------------------------------------------------+\nvoid USB0_0_IRQHandler(void) {\n  tud_int_handler(0);\n}\n\nvoid board_init(void) {\n  board_clock_init();\n  SystemCoreClockUpdate();\n\n  // LED\n  XMC_GPIO_CONFIG_t led_cfg = {0};\n  led_cfg.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL;\n  led_cfg.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH;\n  led_cfg.output_strength = XMC_GPIO_OUTPUT_STRENGTH_MEDIUM;\n  XMC_GPIO_Init(LED_PIN, &led_cfg);\n\n  // Button\n  XMC_GPIO_CONFIG_t button_cfg = {0};\n  button_cfg.mode = XMC_GPIO_MODE_INPUT_TRISTATE;\n  XMC_GPIO_Init(BUTTON_PIN, &button_cfg);\n\n#ifdef UART_DEV\n  XMC_UART_CH_CONFIG_t uart_cfg = {0};\n  uart_cfg.baudrate = CFG_BOARD_UART_BAUDRATE;\n  uart_cfg.data_bits = 8;\n  uart_cfg.stop_bits = 1;\n  XMC_UART_CH_Init(UART_DEV, &uart_cfg);\n\n  XMC_GPIO_SetMode(UART_RX_PIN, XMC_GPIO_MODE_INPUT_PULL_UP);\n  XMC_UART_CH_SetInputSource(UART_DEV, XMC_UART_CH_INPUT_RXD, UART_RX_INPUT);\n\n  XMC_UART_CH_Start(UART_DEV);\n  XMC_GPIO_SetMode(UART_TX_PIN, (XMC_GPIO_MODE_t)(XMC_GPIO_MODE_OUTPUT_PUSH_PULL | UART_TX_PIN_AF));\n#endif\n\n#if CFG_TUSB_OS == OPT_OS_NONE\n  // 1ms tick timer\n  SysTick_Config(SystemCoreClock / 1000);\n\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  // Explicitly disable systick to prevent its ISR from running before scheduler start\n  SysTick->CTRL &= ~1U;\n\n  // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )\n  NVIC_SetPriority(USB0_0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY );\n#endif\n\n  // USB Power Enable\n#if(UC_SERIES != XMC45)\n  XMC_SCU_CLOCK_UngatePeripheralClock(XMC_SCU_PERIPHERAL_CLOCK_USB0);\n#endif\n  XMC_SCU_RESET_DeassertPeripheralReset(XMC_SCU_PERIPHERAL_RESET_USB0);\n  XMC_SCU_POWER_EnableUsb();\n}\n\n//--------------------------------------------------------------------+\n// Board porting API\n//--------------------------------------------------------------------+\n\nvoid board_led_write(bool state) {\n  uint32_t is_high = state ? LED_STATE_ON : (1 - LED_STATE_ON);\n\n  XMC_GPIO_SetOutputLevel(LED_PIN, is_high ? XMC_GPIO_OUTPUT_LEVEL_HIGH : XMC_GPIO_OUTPUT_LEVEL_LOW);\n}\n\nuint32_t board_button_read(void) {\n  return BUTTON_STATE_ACTIVE == XMC_GPIO_GetInput(BUTTON_PIN);\n}\n\nsize_t board_get_unique_id(uint8_t id[], size_t max_len) {\n  uint8_t const len = tu_min8(16, max_len);\n  memcpy(id, g_chipid, len);\n  return len;\n}\n\nint board_uart_read(uint8_t* buf, int len) {\n#ifdef UART_DEV\n  for(int i=0;i<len;i++) {\n    buf[i] = XMC_UART_CH_GetReceivedData(UART_DEV);\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\nint board_uart_write(void const* buf, int len) {\n#ifdef UART_DEV\n  char const* bufch = (char const*) buf;\n  for(int i=0;i<len;i++) {\n    XMC_UART_CH_Transmit(UART_DEV, bufch[i]);\n  }\n  return len;\n#else\n  (void) buf;\n  (void) len;\n  return 0;\n#endif\n}\n\n#if CFG_TUSB_OS == OPT_OS_NONE\nvolatile uint32_t system_ticks = 0;\n\nvoid SysTick_Handler(void) {\n  system_ticks++;\n}\n\nuint32_t tusb_time_millis_api(void) {\n  return system_ticks;\n}\n\n#endif\n\n// Required by __libc_init_array in startup code if we are compiling using\n// -nostdlib/-nostartfiles.\n//void _init(void) {\n//}\n"
  },
  {
    "path": "hw/bsp/xmc4000/family.cmake",
    "content": "include_guard()\n\nset(SDK_DIR ${TOP}/hw/mcu/infineon/mtb-xmclib-cat3)\nset(CMSIS_DIR ${TOP}/lib/CMSIS_5)\n\ninclude(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)\n\n# toolchain set up\nset(CMAKE_SYSTEM_CPU cortex-m4 CACHE INTERNAL \"System Processor\")\nset(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)\n\nset(FAMILY_MCUS XMC4000 CACHE INTERNAL \"\")\n\n#------------------------------------\n# Startup & Linker script\n#------------------------------------\nset(LD_FILE_Clang ${LD_FILE_GNU})\nset(STARTUP_FILE_GNU ${SDK_DIR}/CMSIS/Infineon/COMPONENT_${MCU_VARIANT}/Source/TOOLCHAIN_GCC_ARM/startup_${MCU_VARIANT}.S)\nset(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})\n\n#------------------------------------\n# Board Target\n#------------------------------------\nfunction(family_add_board BOARD_TARGET)\n  add_library(${BOARD_TARGET} STATIC\n    ${SDK_DIR}/CMSIS/Infineon/COMPONENT_${MCU_VARIANT}/Source/system_${MCU_VARIANT}.c\n    ${SDK_DIR}/XMCLib/src/xmc_gpio.c\n    ${SDK_DIR}/XMCLib/src/xmc4_gpio.c\n    ${SDK_DIR}/XMCLib/src/xmc4_scu.c\n    ${SDK_DIR}/XMCLib/src/xmc_usic.c\n    ${SDK_DIR}/XMCLib/src/xmc_uart.c\n    )\n  target_include_directories(${BOARD_TARGET} PUBLIC\n    ${SDK_DIR}/CMSIS/Core/Include\n    ${SDK_DIR}/CMSIS/Infineon/COMPONENT_${MCU_VARIANT}/Include\n    ${SDK_DIR}/XMCLib/inc\n    )\n\n  update_board(${BOARD_TARGET})\nendfunction()\n\n#------------------------------------\n# Functions\n#------------------------------------\nfunction(family_configure_example TARGET RTOS)\n  family_configure_common(${TARGET} ${RTOS})\n  family_add_tinyusb(${TARGET} OPT_MCU_XMC4000)\n\n  target_sources(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c\n    ${SDK_DIR}/Newlib/syscalls.c\n    ${TOP}/src/portable/synopsys/dwc2/dcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/hcd_dwc2.c\n    ${TOP}/src/portable/synopsys/dwc2/dwc2_common.c\n    ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}\n    )\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}\n    )\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--script=${LD_FILE_GNU}\"\n      --specs=nosys.specs\n      -nostartfiles\n      )\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    message(FATAL_ERROR \"Clang is not supported\")\n  elseif (CMAKE_C_COMPILER_ID STREQUAL \"IAR\")\n    target_link_options(${TARGET} PUBLIC\n      \"LINKER:--config=${LD_FILE_IAR}\"\n      )\n  endif ()\n\n  if (CMAKE_C_COMPILER_ID STREQUAL \"GNU\" OR CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS \"-Wno-missing-prototypes\")\n  endif ()\n  set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES\n    SKIP_LINTING ON\n    COMPILE_OPTIONS -w)\n\n  # Flashing\n  family_add_bin_hex(${TARGET})\n  family_flash_jlink(${TARGET})\nendfunction()\n"
  },
  {
    "path": "hw/bsp/xmc4000/family.mk",
    "content": "UF2_FAMILY_ID = 0x00\nSDK_DIR = hw/mcu/infineon/mtb-xmclib-cat3\n\ninclude $(TOP)/$(BOARD_PATH)/board.mk\nCPU_CORE ?= cortex-m4\n\nCFLAGS += \\\n  -flto \\\n  -nostdlib -nostartfiles \\\n  -DCFG_TUSB_MCU=OPT_MCU_XMC4000\n\n# mcu driver cause following warnings\n#CFLAGS += -Wno-error=shadow -Wno-error=cast-align\n\nSRC_C += \\\n\tsrc/portable/synopsys/dwc2/dcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/hcd_dwc2.c \\\n\tsrc/portable/synopsys/dwc2/dwc2_common.c \\\n\t${SDK_DIR}/CMSIS/Infineon/COMPONENT_${MCU_VARIANT}/Source/system_${MCU_VARIANT}.c \\\n\t${SDK_DIR}/Newlib/syscalls.c \\\n\t${SDK_DIR}/XMCLib/src/xmc_gpio.c \\\n\t${SDK_DIR}/XMCLib/src/xmc4_gpio.c \\\n\t${SDK_DIR}/XMCLib/src/xmc4_scu.c \\\n\t${SDK_DIR}/XMCLib/src/xmc_usic.c \\\n\t${SDK_DIR}/XMCLib/src/xmc_uart.c\n\nSRC_S += ${SDK_DIR}/CMSIS/Infineon/COMPONENT_${MCU_VARIANT}/Source/TOOLCHAIN_GCC_ARM/startup_${MCU_VARIANT}.S\n\nINC += \\\n  $(TOP)/$(BOARD_PATH) \\\n\t$(TOP)/${SDK_DIR}/CMSIS/Core/Include \\\n\t$(TOP)/${SDK_DIR}/CMSIS/Infineon/COMPONENT_${MCU_VARIANT}/Include \\\n\t$(TOP)/${SDK_DIR}/XMCLib/inc\n"
  },
  {
    "path": "hw/bsp/zephyr_board_aliases.cmake",
    "content": "set(nrf52840dk_BOARD_ALIAS nrf52840dk/nrf52840)\nset(stm32n657nucleo_BOARD_ALIAS nucleo_n657x0_q)\n"
  },
  {
    "path": "hw/mcu/bridgetek/ft9xx/Readme.md",
    "content": "# BridgeTek FT9xx MCU\n\n**BridgeTek** provides a hardware abstraction library with software source code for the SDKs for FT9xx software family.\n\nWhole SDK repository is installed as part of the FT9xx Toolchain and can be downloaded from BridgeTek web page `https://www.brtchip.com`.\n\nRegisters definition files, and included peripheral register definition files have licenses that allow for redistribution.\n"
  },
  {
    "path": "hw/mcu/bridgetek/ft9xx/scripts/crt0.S",
    "content": ".equ SYS_REGMSC0CFG_B3  , 0x1001b\n.equ SYS_REGIRQCTL_B3   , 0x100e3\n.equ MAILBOX_MEMORY     , 0x13000\n\n.equ\tIS_IMG_SDBL_PRESENT, 0\n.equ\tIS_IMG_D2XX_PRESENT, 0\n.equ\tIS_IMG_DLOG_PRESENT, 0\n\n.section .crt0\n.global _start\n\n_start:\n# START Interrupt Vector Table [[\n        jmp     __PMSIZE-4         # RESET Vector\n        jmp     interrupt_33\t   # Watchdog reset vector\n        jmp     interrupt_0\n        jmp     interrupt_1\n        jmp     interrupt_2\n        jmp     interrupt_3\n        jmp     interrupt_4\n        jmp     interrupt_5\n        jmp     interrupt_6\n        jmp     interrupt_7\n        jmp     interrupt_8\n        jmp     interrupt_9\n        jmp     interrupt_10\n        jmp     interrupt_11\n        jmp     interrupt_12\n        jmp     interrupt_13\n        jmp     interrupt_14\n        jmp     interrupt_15\n        jmp     interrupt_16\n        jmp     interrupt_17\n        jmp     interrupt_18\n        jmp     interrupt_19\n        jmp     interrupt_20\n        jmp     interrupt_21\n        jmp     interrupt_22\n        jmp     interrupt_23\n        jmp     interrupt_24\n        jmp     interrupt_25\n        jmp     interrupt_26\n        jmp     interrupt_27\n        jmp     interrupt_28\n        jmp     interrupt_29\n        jmp     interrupt_30\n        jmp     interrupt_31\n        jmp     __PMSIZE-8\t\t\t\t#Interrupt vector 32 (NMI)\n# ]] END Interrupt Vector Table\n\ncodestart:\n        jmp    init\n\n.global _exithook\n_exithook:               # Debugger uses '_exithook' at 0x90 to catch program exit\n        return\n\ninit:\n        # Disable all interrupts\n        ldk     $r0,0x80\n.ifdef __FT930__\n        sta.b   0x10123, $r0\n.else\n        sta.b   0x100e3,$r0\n.endif\n\n        # Reset all peripherals\n        # lda.l   $r0, 0x10018\n        # bins.l  $r0, $r0, 0x23F  # Set bit 31\n        # sta.l   0x10018, $r0\n\n        # Initialize DATA by copying from program memory\n        ldk.l   $r0,__data_load_start\n        ldk.l   $r1,__data_load_end\n        ldk.l   $r2,0   # Will use __data after binutils patch\n\n        jmp     .dscopy\n.dsloop:\n        # Copy PM[$r0] to RAM $r2\n        lpmi.l  $r3,$r0,0\n        sti.l   $r2,0,$r3\n        add.l   $r0,$r0,4\n        add.l   $r2,$r2,4\n.dscopy:\n        cmp.l   $r0,$r1\n        jmpc    lt,.dsloop\n\n        # Zero BSS\n        ldk.l   $r0,_bss_start\n        ldk.l   $r2,_end\n        sub.l   $r2,$r2,$r0\n        ldk.l   $r1,0\n        ldk    $r3,32764\n1:\n        cmp    $r2,$r3\n        jmpc   lt,2f\n        memset $r0,$r1,$r3\n        add    $r0,$r0,$r3\n        sub    $r2,$r2,$r3\n        jmp    1b\n2:\n        memset $r0,$r1,$r2\n.ifdef __FT930__\n/*##############################################################*/\n\t\t# copy UserConfig DATA from flash to mailbox memory\n/*##############################################################*/\n        ldk.l   $r0,D2XX_Struct_start  /*start of d2xx config in PM memory */\n        ldk.l   $r1,D2XX_Struct_end /*end of d2xx config in PM memory */\n        ldk.l   $r2,D2XXTEST_UserD2xxConfig /* RAM cache where the d2xx config from PM to be copied*/\n        jmp     .configcopy\n\n.configloop:\n        # Copy PM[$r0] to RAM[$r2]\n        lpmi.l  $r3,$r0,0\n        sti.l   $r2,0,$r3\n        # Increment\n        add.l   $r0,$r0,4\n        add.l   $r2,$r2,4\n.configcopy:\n        cmp.l   $r0,$r1\n        jmpc    lt,.configloop\n\n        ldk.l   $r1,D2XX_Struct_start\n        ldk.l   $r2,D2XX_Struct_end\n        #compute size\n        sub.l   $r2,$r2,$r1\n        ldk.l   $r1,D2XXTEST_UserD2xxConfig\n        ldk.l   $r0,MAILBOX_MEMORY\t\t/* D2xx config from RAM cache to be copied to Mailbox memory */\n        # Copy RAM[$r1] to Mailbox $r0, for $r2 bytes\n        streamouti.b   $r0,$r1,$r2\n/*############################################################*/\n.endif\n        sub.l   $sp,$sp,24  # Space for the caller argument frame\n        call    main\n\n.equ EXITEXIT    , 0x1fffc\n\n.global _exit\n_exit:\n        sta.l   EXITEXIT,$r0    # simulator end of test\n        jmp     _exithook\n\n#_watchdog_isr:\n#        ldk     $sp,__RAMSIZE\n#        jmp     __PMSIZE-4\n\n# Macro to construct the interrupt stub code.\n# it just saves r0, loads r0 with the int vector\n# and branches to interrupt_common.\n\n.macro  inth i=0\ninterrupt_\\i:\n        push    $r0     # {\n        lda     $r0,(vector_table + 4 * \\i)\n        jmp     interrupt_common\n.endm\n\n        inth    0\n        inth    1\n        inth    2\n        inth    3\n        inth    4\n        inth    5\n        inth    6\n        inth    7\n        inth    8\n        inth    9\n        inth    10\n        inth    11\n        inth    12\n        inth    13\n        inth    14\n        inth    15\n        inth    16\n        inth    17\n        inth    18\n        inth    19\n        inth    20\n        inth    21\n        inth    22\n        inth    23\n        inth    24\n        inth    25\n        inth    26\n        inth    27\n        inth    28\n        inth    29\n        inth    30\n        inth    31\n        inth    32\n        inth    33\n\n        # On entry: r0, already saved, holds the handler function\ninterrupt_common:\n        push    $r1     # {\n        push    $r2     # {\n        push    $r3     # {\n        push    $r4     # {\n        push    $r5     # {\n        push    $r6     # {\n        push    $r7     # {\n        push    $r8     # {\n        push    $r9     # {\n        push    $r10    # {\n        push    $r11    # {\n        push    $r12    # {\n        push    $cc     # {\n\n        calli   $r0\n\n        pop     $cc     # }\n        pop     $r12    # }\n        pop     $r11    # }\n        pop     $r10    # }\n        pop     $r9     # }\n        pop     $r8     # }\n        pop     $r7     # }\n        pop     $r6     # }\n        pop     $r5     # }\n        pop     $r4     # }\n        pop     $r3     # }\n        pop     $r2     # }\n        pop     $r1     # }\n        pop     $r0     # } matching push in interrupt_0-31 above\n        reti\n\n        # Null function for unassigned interrupt to point at\n.global     nullvector\nnullvector:\n        return\n\n.section .data\n.global vector_table\n\t.align (4)\t\t\t# assembler alignment is in the power of 2 (in this case 2^4)\nvector_table:\n        .rept 34\n                .long   nullvector\n        .endr\n\n\n.section .text\n.global __gxx_personality_sj0\n__gxx_personality_sj0:\n\n\n\t.section ._flash_d2xx_config\n.global __pD2XXDefaultConfiguration\n\t.align (10)\n\nD2XX_partition_start = .\n\n.if IS_IMG_D2XX_PRESENT\n.ifdef __FT930__\n.include \"ft930_d2xx_default_config.inc\"\n.else\n.include \"ft900_d2xx_default_config.inc\"\n.endif\n.endif\n\nD2XX_partition_end = .\n\n\t.section ._flash_dlog_partition\n\t.align (10)\n.global __dlog_partition\n__dlog_partition:\ndlog_partition_start = .\n.if IS_IMG_DLOG_PRESENT\n\t.long\t0xF7D1D106\n\t.rept  (0x1000-4)\n\t.byte\t0xFF\n\t.endr\n.endif\ndlog_partition_end = .\n\n\t.section ._pm\n.global\t__sdbl_partition_sizeof\n.global __D2XX_partition_sizeof\n.global __dlog_partition_sizeof\n\t.if IS_IMG_SDBL_PRESENT\n__sdbl_partition_sizeof = 0x2000\n\t.else\n__sdbl_partition_sizeof = 0\n\t.endif\n\n__D2XX_partition_sizeof = D2XX_partition_end - D2XX_partition_start\n__dlog_partition_sizeof = dlog_partition_end - dlog_partition_start\n"
  },
  {
    "path": "hw/mcu/bridgetek/ft9xx/scripts/ldscript.ld",
    "content": "/* Default linker script, for normal executables */\nOUTPUT_FORMAT(\"elf32-ft32\")\nOUTPUT_ARCH(ft32)\nSEARCH_DIR(\"/data/win8/ft32/ft32-elf/lib\");\n/* Allow the command line to override the memory region sizes.  */\n__PMSIZE = DEFINED(__PMSIZE)  ? __PMSIZE : 256K;\n__RAMSIZE = DEFINED(__RAMSIZE) ? __RAMSIZE : 64K;\nMEMORY\n{\n  flash     (rx)   : ORIGIN = 0,        LENGTH = __PMSIZE\n  ram       (rw!x) : ORIGIN = 0x800000, LENGTH = __RAMSIZE\n  ehci_mmap (rw!x) : ORIGIN = 0x811000, LENGTH = 2K\n}\nSECTIONS\n{\n  .text :\n  {\n    *(.text*)\n    *(.strings)\n    *(._pm*)\n    *(.init)\n    *(.fini)\n     _etext = . ;\n    . = ALIGN(4);\n  }  > flash\n  .tors :\n  {\n    ___ctors = . ;\n    *(.ctors)\n    ___ctors_end = . ;\n    ___dtors = . ;\n    *(.dtors)\n    ___dtors_end = . ;\n    . = ALIGN(4);\n  } > ram\n  .data :  AT (ADDR (.text) + SIZEOF (.text))\n  {\n    *(.data)\n    *(.data*)\n    *(.rodata)\n    *(.rodata*)\n     _edata = . ;\n    . = ALIGN(4);\n  }  > ram\n  .bss   SIZEOF(.data) + ADDR(.data) :\n  {\n     _bss_start = . ;\n    *(.bss)\n    *(.bss*)\n    *(COMMON)\n     _end = . ;\n    . = ALIGN(4);\n  }  > ram\n   __data_load_start = LOADADDR(.data);\n   __data_load_end = __data_load_start + SIZEOF(.data);\n  .stab 0 (NOLOAD) :\n  {\n    *(.stab)\n  }\n  .stabstr 0 (NOLOAD) :\n  {\n    *(.stabstr)\n  }\n  /* DWARF debug sections.\n     Symbols in the DWARF debugging sections are relative to the beginning\n     of the section so we begin them at 0.  */\n  /* DWARF 1 */\n  .debug          0 : { *(.debug) }\n  .line           0 : { *(.line) }\n  /* GNU DWARF 1 extensions */\n  .debug_srcinfo  0 : { *(.debug_srcinfo) }\n  .debug_sfnames  0 : { *(.debug_sfnames) }\n  /* DWARF 1.1 and DWARF 2 */\n  .debug_aranges  0 : { *(.debug_aranges) }\n  .debug_pubnames 0 : { *(.debug_pubnames) }\n  /* DWARF 2 */\n  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }\n  .debug_abbrev   0 : { *(.debug_abbrev) }\n  .debug_line     0 : { *(.debug_line .debug_line.* .debug_line_end ) }\n  .debug_frame    0 : { *(.debug_frame) }\n  .debug_str      0 : { *(.debug_str) }\n  .debug_loc      0 : { *(.debug_loc) }\n  .debug_macinfo  0 : { *(.debug_macinfo) }\n  /* SGI/MIPS DWARF 2 extensions */\n  .debug_weaknames 0 : { *(.debug_weaknames) }\n  .debug_funcnames 0 : { *(.debug_funcnames) }\n  .debug_typenames 0 : { *(.debug_typenames) }\n  .debug_varnames  0 : { *(.debug_varnames) }\n  /* DWARF 3 */\n  .debug_pubtypes 0 : { *(.debug_pubtypes) }\n  .debug_ranges   0 : { *(.debug_ranges) }\n  /* DWARF Extension.  */\n  .debug_macro    0 : { *(.debug_macro) }\n  .debug_addr     0 : { *(.debug_addr) }\n}\n"
  },
  {
    "path": "hw/mcu/dialog/README.md",
    "content": "# Dialog DA1469x MCU\n\n**Dialog Semiconductors** provides SDKs for DA146x MCU family.\nMost of the files there can't be redistributed.\nRegisters definition file `DA1469xAB.h` and some **ARM** originated headers are have licenses that allow\nfor redistribution.\nWhole SDK repository can be downloaded from Dialog Semiconductor web page `https://www.dialog.com`\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/arm_license.txt",
    "content": "/* Copyright (c) 2009 - 2013 ARM LIMITED\n\n   All rights reserved.\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions are met:\n   - Redistributions of source code must retain the above copyright\n     notice, this list of conditions and the following disclaimer.\n   - Redistributions in binary form must reproduce the above copyright\n     notice, this list of conditions and the following disclaimer in the\n     documentation and/or other materials provided with the distribution.\n   - Neither the name of ARM nor the names of its contributors may be used\n     to endorse or promote products derived from this software without\n     specific prior written permission.\n   *\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE\n   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n   POSSIBILITY OF SUCH DAMAGE.\n   ---------------------------------------------------------------------------*/\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/DA1469xAB.h",
    "content": "/*\n * Copyright (C) 2019 Dialog Semiconductor. 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 * - Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * - Redistributions in binary form must reproduce the above copyright\n * notice, this list of conditions and the following disclaimer in the\n * documentation and/or other materials provided with the distribution.\n * - Neither the name of Dialog Semiconductor 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 \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n * @file     DA1469xAB.h\n * @brief    CMSIS HeaderFile\n * @version  1.2\n * @date     22. April 2019\n * @note     Generated by SVDConv V3.3.25 on Monday, 22.04.2019 11:06:30\n *           from File 'DA1469xAB.xml',\n */\n\n\n\n/** @addtogroup PLA_BSP_REGISTERS\n  * @{\n  */\n\n\n/** @addtogroup DA1469x\n  * @{\n  */\n\n\n#ifndef DA1469X_H\n#define DA1469X_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n/** @addtogroup Configuration_of_CMSIS\n  * @{\n  */\n\n\n/* =========================================================================================================================== */\n/* ================                                Interrupt Number Definition                                ================ */\n/* =========================================================================================================================== */\n\n/**\n  * @brief Interrupt Number Definition\n  */\n\ntypedef enum {\n/* =======================================  ARM Cortex-M33 Specific Interrupt Numbers  ======================================= */\n  Reset_IRQn                = -15,              /*!< -15  Reset Vector, invoked on Power up and warm reset                     */\n  NonMaskableInt_IRQn       = -14,              /*!< -14  Non maskable Interrupt, cannot be stopped or preempted               */\n  HardFault_IRQn            = -13,              /*!< -13  Hard Fault, all classes of Fault                                     */\n  MemoryManagement_IRQn     = -12,              /*!< -12  Memory Management, MPU mismatch, including Access Violation\n                                                     and No Match                                                              */\n  BusFault_IRQn             = -11,              /*!< -11  Bus Fault, Pre-Fetch-, Memory Access Fault, other address/memory\n                                                     related Fault                                                             */\n  UsageFault_IRQn           = -10,              /*!< -10  Usage Fault, i.e. Undef Instruction, Illegal State Transition        */\n  SecureFault_IRQn          =  -9,              /*!< -9 Secure Fault Handler                                                   */\n  SVCall_IRQn               =  -5,              /*!< -5 System Service Call via SVC instruction                                */\n  DebugMonitor_IRQn         =  -4,              /*!< -4 Debug Monitor                                                          */\n  PendSV_IRQn               =  -2,              /*!< -2 Pendable request for system service                                    */\n  SysTick_IRQn              =  -1,              /*!< -1 System Tick Timer                                                      */\n/* ==========================================  DA1469x Specific Interrupt Numbers  =========================================== */\n  SNC_IRQn                  =   0,              /*!< 0  Sensor Node Controller interrupt request.                              */\n  DMA_IRQn                  =   1,              /*!< 1  General Purpose DMA interrupt request.                                 */\n  CHARGER_STATE_IRQn        =   2,              /*!< 2  Charger State interrupt request.                                       */\n  CHARGER_ERROR_IRQn        =   3,              /*!< 3  Charger Error interrupt request.                                       */\n  CMAC2SYS_IRQn             =   4,              /*!< 4  CMAC and mailbox interrupt request.                                    */\n  UART_IRQn                 =   5,              /*!< 5  UART interrupt request.                                                */\n  UART2_IRQn                =   6,              /*!< 6  UART2 interrupt request.                                               */\n  UART3_IRQn                =   7,              /*!< 7  UART3 interrupt request.                                               */\n  I2C_IRQn                  =   8,              /*!< 8  I2C interrupt request.                                                 */\n  I2C2_IRQn                 =   9,              /*!< 9  I2C2 interrupt request.                                                */\n  SPI_IRQn                  =  10,              /*!< 10 SPI interrupt request.                                                 */\n  SPI2_IRQn                 =  11,              /*!< 11 SPI2 interrupt request.                                                */\n  PCM_IRQn                  =  12,              /*!< 12 PCM interrupt request.                                                 */\n  SRC_IN_IRQn               =  13,              /*!< 13 SRC input interrupt request.                                           */\n  SRC_OUT_IRQn              =  14,              /*!< 14 SRC output interrupt request.                                          */\n  USB_IRQn                  =  15,              /*!< 15 USB interrupt request.                                                 */\n  TIMER_IRQn                =  16,              /*!< 16 TIMER interrupt request.                                               */\n  TIMER2_IRQn               =  17,              /*!< 17 TIMER2 interrupt request.                                              */\n  RTC_IRQn                  =  18,              /*!< 18 RTC interrupt request.                                                 */\n  KEY_WKUP_GPIO_IRQn        =  19,              /*!< 19 Debounced button press interrupt request.                              */\n  PDC_IRQn                  =  20,              /*!< 20 Wakeup IRQ from PDC to CM33                                            */\n  VBUS_IRQn                 =  21,              /*!< 21 VBUS presence interrupt request.                                       */\n  MRM_IRQn                  =  22,              /*!< 22 Cache Miss Rate Monitor interrupt request.                             */\n  MOTOR_CONTROLLER_IRQn     =  23,              /*!< 23 MOTOR and mailbox interrupt request.                                   */\n  TRNG_IRQn                 =  24,              /*!< 24 True Random Number Generation interrupt request.                       */\n  DCDC_IRQn                 =  25,              /*!< 25 DCDC interrupt request.                                                */\n  XTAL32M_RDY_IRQn          =  26,              /*!< 26 XTAL32M trimmed and ready interrupt request.                           */\n  GPADC_IRQn                =  27,              /*!< 27 General Purpose Analog-Digital Converter interrupt request.            */\n  SDADC_IRQn                =  28,              /*!< 28 Sigma Delta Analog-Digital Converter interrupt request.                */\n  CRYPTO_IRQn               =  29,              /*!< 29 Crypto interrupt request.                                              */\n  CAPTIMER_IRQn             =  30,              /*!< 30 GPIO triggered Timer Capture interrupt request.                        */\n  RFDIAG_IRQn               =  31,              /*!< 31 Baseband or Radio Diagnostics interrupt request.                       */\n  LCD_CONTROLLER_IRQn       =  32,              /*!< 32 Parallel LCD Controller interrupt request.                             */\n  PLL_LOCK_IRQn             =  33,              /*!< 33 Pll lock interrupt request.                                            */\n  TIMER3_IRQn               =  34,              /*!< 34 TIMER3 interrupt request.                                              */\n  TIMER4_IRQn               =  35,              /*!< 35 TIMER4 interrupt request.                                              */\n  LRA_IRQn                  =  36,              /*!< 36 LRA/ERM interrupt request.                                             */\n  RTC_EVENT_IRQn            =  37,              /*!< 37 RTC event interrupt request.                                           */\n  GPIO_P0_IRQn              =  38,              /*!< 38 GPIO port 0 toggle interrupt request.                                  */\n  GPIO_P1_IRQn              =  39               /*!< 39 GPIO port 1 toggle interrupt request.                                  */\n} IRQn_Type;\n\n\n\n/* =========================================================================================================================== */\n/* ================                           Processor and Core Peripheral Section                           ================ */\n/* =========================================================================================================================== */\n\n/* ==========================  Configuration of the ARM Cortex-M33 Processor and Core Peripherals  =========================== */\n#define __CM33_REV                 0x0000U      /*!< CM33 Core Revision                                                        */\n#define __NVIC_PRIO_BITS               4        /*!< Number of Bits used for Priority Levels                                   */\n#define __Vendor_SysTickConfig         0        /*!< Set to 1 if different SysTick Config is used                              */\n#define __VTOR_PRESENT                 1        /*!< Set to 1 if CPU supports Vector Table Offset Register                     */\n#define __MPU_PRESENT                  1        /*!< MPU present                                                               */\n#define __FPU_PRESENT                  1        /*!< FPU present                                                               */\n#define __FPU_DP                       0        /*!< Double Precision FPU                                                      */\n#define __DSP_PRESENT                  1        /*!< DSP extension present                                                     */\n#define __SAU_REGION_PRESENT           0        /*!< SAU present                                                               */\n\n\n/** @} */ /* End of group Configuration_of_CMSIS */\n\n#include \"core_cm33.h\"                          /*!< ARM Cortex-M33 processor and core peripherals                             */\n#include \"system_DA1469x.h\"                     /*!< DA1469x System                                                            */\n\n#ifndef __IM                                    /*!< Fallback for older CMSIS versions                                         */\n  #define __IM   __I\n#endif\n#ifndef __OM                                    /*!< Fallback for older CMSIS versions                                         */\n  #define __OM   __O\n#endif\n#ifndef __IOM                                   /*!< Fallback for older CMSIS versions                                         */\n  #define __IOM  __IO\n#endif\n\n\n/* =========================================================================================================================== */\n/* ================                            Device Specific Peripheral Section                             ================ */\n/* =========================================================================================================================== */\n\n\n/** @addtogroup Device_Peripheral_peripherals\n  * @{\n  */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                         AES_HASH                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief AES_HASH registers (AES_HASH)\n  */\n\ntypedef struct {                                /*!< (@ 0x30040000) AES_HASH Structure                                         */\n  __IOM uint32_t  CRYPTO_CTRL_REG;              /*!< (@ 0x00000000) Crypto Control register                                    */\n  __IOM uint32_t  CRYPTO_START_REG;             /*!< (@ 0x00000004) Crypto Start calculation                                   */\n  __IOM uint32_t  CRYPTO_FETCH_ADDR_REG;        /*!< (@ 0x00000008) Crypto DMA fetch register                                  */\n  __IOM uint32_t  CRYPTO_LEN_REG;               /*!< (@ 0x0000000C) Crypto Length of the input block in bytes                  */\n  __IOM uint32_t  CRYPTO_DEST_ADDR_REG;         /*!< (@ 0x00000010) Crypto DMA destination memory                              */\n  __IOM uint32_t  CRYPTO_STATUS_REG;            /*!< (@ 0x00000014) Crypto Status register                                     */\n  __IOM uint32_t  CRYPTO_CLRIRQ_REG;            /*!< (@ 0x00000018) Crypto Clear interrupt request                             */\n  __IOM uint32_t  CRYPTO_MREG0_REG;             /*!< (@ 0x0000001C) Crypto Mode depended register 0                            */\n  __IOM uint32_t  CRYPTO_MREG1_REG;             /*!< (@ 0x00000020) Crypto Mode depended register 1                            */\n  __IOM uint32_t  CRYPTO_MREG2_REG;             /*!< (@ 0x00000024) Crypto Mode depended register 2                            */\n  __IOM uint32_t  CRYPTO_MREG3_REG;             /*!< (@ 0x00000028) Crypto Mode depended register 3                            */\n  __IM  uint32_t  RESERVED[53];\n  __IOM uint32_t  CRYPTO_KEYS_START;            /*!< (@ 0x00000100) Crypto First position of the AES keys storage\n                                                                    memory                                                     */\n} AES_HASH_Type;                                /*!< Size = 260 (0x104)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                        ANAMISC_BIF                                        ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief ANAMISC_BIF registers (ANAMISC_BIF)\n  */\n\ntypedef struct {                                /*!< (@ 0x50030B00) ANAMISC_BIF Structure                                      */\n  __IM  uint32_t  RESERVED[4];\n  __IOM uint32_t  CLK_REF_SEL_REG;              /*!< (@ 0x00000010) Select clock for oscillator calibration                    */\n  __IOM uint32_t  CLK_REF_CNT_REG;              /*!< (@ 0x00000014) Count value for oscillator calibration                     */\n  __IOM uint32_t  CLK_REF_VAL_REG;              /*!< (@ 0x00000018) DIVN reference cycles, lower 16 bits                       */\n} ANAMISC_BIF_Type;                             /*!< Size = 28 (0x1c)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            APU                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief APU registers (APU)\n  */\n\ntypedef struct {                                /*!< (@ 0x50030600) APU Structure                                              */\n  __IOM uint32_t  SRC1_CTRL_REG;                /*!< (@ 0x00000000) SRC1 control register                                      */\n  __IOM uint32_t  SRC1_IN_FS_REG;               /*!< (@ 0x00000004) SRC1 Sample input rate                                     */\n  __IOM uint32_t  SRC1_OUT_FS_REG;              /*!< (@ 0x00000008) SRC1 Sample output rate                                    */\n  __IOM uint32_t  SRC1_IN1_REG;                 /*!< (@ 0x0000000C) SRC1 data in 1                                             */\n  __IOM uint32_t  SRC1_IN2_REG;                 /*!< (@ 0x00000010) SRC1 data in 2                                             */\n  __IOM uint32_t  SRC1_OUT1_REG;                /*!< (@ 0x00000014) SRC1 data out 1                                            */\n  __IOM uint32_t  SRC1_OUT2_REG;                /*!< (@ 0x00000018) SRC1 data out 2                                            */\n  __IOM uint32_t  APU_MUX_REG;                  /*!< (@ 0x0000001C) APU mux register                                           */\n  __IOM uint32_t  COEF10_SET1_REG;              /*!< (@ 0x00000020) SRC coefficient 1,0 set 1                                  */\n  __IOM uint32_t  COEF32_SET1_REG;              /*!< (@ 0x00000024) SRC coefficient 3,2 set 1                                  */\n  __IOM uint32_t  COEF54_SET1_REG;              /*!< (@ 0x00000028) SRC coefficient 5,4 set 1                                  */\n  __IOM uint32_t  COEF76_SET1_REG;              /*!< (@ 0x0000002C) SRC coefficient 7,6 set 1                                  */\n  __IOM uint32_t  COEF98_SET1_REG;              /*!< (@ 0x00000030) SRC coefficient 9,8 set 1                                  */\n  __IOM uint32_t  COEF0A_SET1_REG;              /*!< (@ 0x00000034) SRC coefficient 10 set 1                                   */\n  __IM  uint32_t  RESERVED[50];\n  __IOM uint32_t  PCM1_CTRL_REG;                /*!< (@ 0x00000100) PCM1 Control register                                      */\n  __IOM uint32_t  PCM1_IN1_REG;                 /*!< (@ 0x00000104) PCM1 data in 1                                             */\n  __IOM uint32_t  PCM1_IN2_REG;                 /*!< (@ 0x00000108) PCM1 data in 2                                             */\n  __IOM uint32_t  PCM1_OUT1_REG;                /*!< (@ 0x0000010C) PCM1 data out 1                                            */\n  __IOM uint32_t  PCM1_OUT2_REG;                /*!< (@ 0x00000110) PCM1 data out 2                                            */\n} APU_Type;                                     /*!< Size = 276 (0x114)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           CACHE                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief CACHE registers (CACHE)\n  */\n\ntypedef struct {                                /*!< (@ 0x100C0000) CACHE Structure                                            */\n  __IOM uint32_t  CACHE_CTRL1_REG;              /*!< (@ 0x00000000) Cache control register 1                                   */\n  __IOM uint32_t  CACHE_LNSIZECFG_REG;          /*!< (@ 0x00000004) Cache line size configuration register                     */\n  __IOM uint32_t  CACHE_ASSOCCFG_REG;           /*!< (@ 0x00000008) Cache associativity configuration register                 */\n  __IM  uint32_t  RESERVED[5];\n  __IOM uint32_t  CACHE_CTRL2_REG;              /*!< (@ 0x00000020) Cache control register 2                                   */\n  __IM  uint32_t  RESERVED1;\n  __IOM uint32_t  CACHE_MRM_HITS_REG;           /*!< (@ 0x00000028) Cache MRM (Miss Rate Monitor) HITS register                */\n  __IOM uint32_t  CACHE_MRM_MISSES_REG;         /*!< (@ 0x0000002C) Cache MRM (Miss Rate Monitor) MISSES register              */\n  __IOM uint32_t  CACHE_MRM_CTRL_REG;           /*!< (@ 0x00000030) Cache MRM (Miss Rate Monitor) CONTROL register             */\n  __IOM uint32_t  CACHE_MRM_TINT_REG;           /*!< (@ 0x00000034) Cache MRM (Miss Rate Monitor) TIME INTERVAL register       */\n  __IOM uint32_t  CACHE_MRM_MISSES_THRES_REG;   /*!< (@ 0x00000038) Cache MRM (Miss Rate Monitor) THRESHOLD register           */\n  __IOM uint32_t  CACHE_MRM_HITS_THRES_REG;     /*!< (@ 0x0000003C) Cache MRM (Miss Rate Monitor) HITS THRESHOLD\n                                                                    register                                                   */\n  __IOM uint32_t  CACHE_FLASH_REG;              /*!< (@ 0x00000040) Cache Flash program size and base address register         */\n  __IM  uint32_t  RESERVED2[3];\n  __IOM uint32_t  SWD_RESET_REG;                /*!< (@ 0x00000050) SWD HW reset control register                              */\n} CACHE_Type;                                   /*!< Size = 84 (0x54)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          CHARGER                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief CHARGER registers (CHARGER)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040400) CHARGER Structure                                          */\n  __IOM uint32_t  CHARGER_CTRL_REG;             /*!< (@ 0x00000000) Charger main control register                              */\n  __IOM uint32_t  CHARGER_TEST_CTRL_REG;        /*!< (@ 0x00000004) Charger test control register                              */\n  __IOM uint32_t  CHARGER_STATUS_REG;           /*!< (@ 0x00000008) Charger main status register                               */\n  __IOM uint32_t  CHARGER_VOLTAGE_PARAM_REG;    /*!< (@ 0x0000000C) Charger voltage settings register                          */\n  __IOM uint32_t  CHARGER_CURRENT_PARAM_REG;    /*!< (@ 0x00000010) Charger current settings register                          */\n  __IOM uint32_t  CHARGER_TEMPSET_PARAM_REG;    /*!< (@ 0x00000014) Charger battery temperature settings register              */\n  __IOM uint32_t  CHARGER_PRE_CHARGE_TIMER_REG; /*!< (@ 0x00000018) Maximum pre-charge time limit register                     */\n  __IOM uint32_t  CHARGER_CC_CHARGE_TIMER_REG;  /*!< (@ 0x0000001C) Maximum CC-charge time limit register                      */\n  __IOM uint32_t  CHARGER_CV_CHARGE_TIMER_REG;  /*!< (@ 0x00000020) Maximum CV-charge time limit register                      */\n  __IOM uint32_t  CHARGER_TOTAL_CHARGE_TIMER_REG;/*!< (@ 0x00000024) Maximum total charge time limit register                  */\n  __IOM uint32_t  CHARGER_JEITA_V_CHARGE_REG;   /*!< (@ 0x00000028) JEITA-compliant Charge voltage settings register           */\n  __IOM uint32_t  CHARGER_JEITA_V_PRECHARGE_REG;/*!< (@ 0x0000002C) JEITA-compliant Pre-Charge voltage settings register       */\n  __IOM uint32_t  CHARGER_JEITA_V_REPLENISH_REG;/*!< (@ 0x00000030) JEITA-compliant Replenish settings register                */\n  __IOM uint32_t  CHARGER_JEITA_V_OVP_REG;      /*!< (@ 0x00000034) JEITA-compliant OVP settings register                      */\n  __IOM uint32_t  CHARGER_JEITA_CURRENT_REG;    /*!< (@ 0x00000038) JEITA-compliant current settings register                  */\n  __IOM uint32_t  CHARGER_VBAT_COMP_TIMER_REG;  /*!< (@ 0x0000003C) Main Vbat comparator timer register                        */\n  __IOM uint32_t  CHARGER_VOVP_COMP_TIMER_REG;  /*!< (@ 0x00000040) Vbat OVP comparator timer register                         */\n  __IOM uint32_t  CHARGER_TDIE_COMP_TIMER_REG;  /*!< (@ 0x00000044) Die temperature comparator timer register                  */\n  __IOM uint32_t  CHARGER_TBAT_MON_TIMER_REG;   /*!< (@ 0x00000048) Battery temperature monitor interval timer                 */\n  __IOM uint32_t  CHARGER_TBAT_COMP_TIMER_REG;  /*!< (@ 0x0000004C) Battery temperature (main) comparator timer                */\n  __IOM uint32_t  CHARGER_THOT_COMP_TIMER_REG;  /*!< (@ 0x00000050) Battery temperature comparator timer for 'Hot'\n                                                                    zone                                                       */\n  __IOM uint32_t  CHARGER_PWR_UP_TIMER_REG;     /*!< (@ 0x00000054) Charger power-up (settling) timer                          */\n  __IOM uint32_t  CHARGER_STATE_IRQ_MASK_REG;   /*!< (@ 0x00000058) Mask register of Charger FSM IRQs                          */\n  __IOM uint32_t  CHARGER_ERROR_IRQ_MASK_REG;   /*!< (@ 0x0000005C) Mask register of Charger Error IRQs                        */\n  __IOM uint32_t  CHARGER_STATE_IRQ_STATUS_REG; /*!< (@ 0x00000060) Status register of Charger FSM IRQs                        */\n  __IOM uint32_t  CHARGER_ERROR_IRQ_STATUS_REG; /*!< (@ 0x00000064) Status register of Charger Error IRQs                      */\n  __IOM uint32_t  CHARGER_STATE_IRQ_CLR_REG;    /*!< (@ 0x00000068) Interrupt clear register of Charger FSM IRQs               */\n  __IOM uint32_t  CHARGER_ERROR_IRQ_CLR_REG;    /*!< (@ 0x0000006C) Interrupt clear register of Charger Error IRQs             */\n} CHARGER_Type;                                 /*!< Size = 112 (0x70)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                       CHIP_VERSION                                        ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief CHIP_VERSION registers (CHIP_VERSION)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040200) CHIP_VERSION Structure                                     */\n  __IOM uint32_t  CHIP_ID1_REG;                 /*!< (@ 0x00000000) Chip identification register 1.                            */\n  __IOM uint32_t  CHIP_ID2_REG;                 /*!< (@ 0x00000004) Chip identification register 2.                            */\n  __IOM uint32_t  CHIP_ID3_REG;                 /*!< (@ 0x00000008) Chip identification register 3.                            */\n  __IOM uint32_t  CHIP_ID4_REG;                 /*!< (@ 0x0000000C) Chip identification register 4.                            */\n  __IOM uint32_t  CHIP_SWC_REG;                 /*!< (@ 0x00000010) Software compatibility register.                           */\n  __IOM uint32_t  CHIP_REVISION_REG;            /*!< (@ 0x00000014) Chip revision register.                                    */\n  __IM  uint32_t  RESERVED[56];\n  __IOM uint32_t  CHIP_TEST1_REG;               /*!< (@ 0x000000F8) Chip test register 1.                                      */\n  __IOM uint32_t  CHIP_TEST2_REG;               /*!< (@ 0x000000FC) Chip test register 2.                                      */\n} CHIP_VERSION_Type;                            /*!< Size = 256 (0x100)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          CRG_COM                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief CRG_COM registers (CRG_COM)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020900) CRG_COM Structure                                          */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  CLK_COM_REG;                  /*!< (@ 0x00000004) Peripheral divider register                                */\n  __IOM uint32_t  SET_CLK_COM_REG;              /*!< (@ 0x00000008) Peripheral divider register SET register. Reads\n                                                                    back 0x0000                                                */\n  __IOM uint32_t  RESET_CLK_COM_REG;            /*!< (@ 0x0000000C) Peripheral divider register RESET register. Reads\n                                                                    back 0x0000                                                */\n} CRG_COM_Type;                                 /*!< Size = 16 (0x10)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          CRG_PER                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief CRG_PER registers (CRG_PER)\n  */\n\ntypedef struct {                                /*!< (@ 0x50030C00) CRG_PER Structure                                          */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  CLK_PER_REG;                  /*!< (@ 0x00000004) Peripheral divider register                                */\n  __IOM uint32_t  SET_CLK_PER_REG;              /*!< (@ 0x00000008) Peripheral divider register SET register, reads\n                                                                    0x0000                                                     */\n  __IOM uint32_t  RESET_CLK_PER_REG;            /*!< (@ 0x0000000C) Peripheral divider register RESET register, reads\n                                                                    0x0000                                                     */\n  __IM  uint32_t  RESERVED1[12];\n  __IOM uint32_t  PCM_DIV_REG;                  /*!< (@ 0x00000040) PCM divider and enables                                    */\n  __IOM uint32_t  PCM_FDIV_REG;                 /*!< (@ 0x00000044) PCM fractional division register                           */\n  __IOM uint32_t  PDM_DIV_REG;                  /*!< (@ 0x00000048) PDM divider and enables                                    */\n  __IOM uint32_t  SRC_DIV_REG;                  /*!< (@ 0x0000004C) SRC divider and enables                                    */\n} CRG_PER_Type;                                 /*!< Size = 80 (0x50)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          CRG_SYS                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief CRG_SYS registers (CRG_SYS)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040500) CRG_SYS Structure                                          */\n  __IOM uint32_t  CLK_SYS_REG;                  /*!< (@ 0x00000000) Peripheral divider register                                */\n  __IOM uint32_t  BATCHECK_REG;                 /*!< (@ 0x00000004) BATCHECK_REG                                               */\n} CRG_SYS_Type;                                 /*!< Size = 8 (0x8)                                                            */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          CRG_TOP                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief CRG_TOP registers (CRG_TOP)\n  */\n\ntypedef struct {                                /*!< (@ 0x50000000) CRG_TOP Structure                                          */\n  __IOM uint32_t  CLK_AMBA_REG;                 /*!< (@ 0x00000000) HCLK, PCLK, divider and clock gates                        */\n  __IM  uint32_t  RESERVED[3];\n  __IOM uint32_t  CLK_RADIO_REG;                /*!< (@ 0x00000010) Radio PLL control register                                 */\n  __IOM uint32_t  CLK_CTRL_REG;                 /*!< (@ 0x00000014) Clock control register                                     */\n  __IOM uint32_t  CLK_TMR_REG;                  /*!< (@ 0x00000018) Clock control for the timers                               */\n  __IOM uint32_t  CLK_SWITCH2XTAL_REG;          /*!< (@ 0x0000001C) Switches clock from RC32M to XTAL32M                       */\n  __IOM uint32_t  PMU_CTRL_REG;                 /*!< (@ 0x00000020) Power Management Unit control register                     */\n  __IOM uint32_t  SYS_CTRL_REG;                 /*!< (@ 0x00000024) System Control register                                    */\n  __IOM uint32_t  SYS_STAT_REG;                 /*!< (@ 0x00000028) System status register                                     */\n  __IM  uint32_t  RESERVED1[4];\n  __IOM uint32_t  CLK_RC32K_REG;                /*!< (@ 0x0000003C) 32 kHz RC oscillator register                              */\n  __IOM uint32_t  CLK_XTAL32K_REG;              /*!< (@ 0x00000040) 32 kHz XTAL oscillator register                            */\n  __IOM uint32_t  CLK_RC32M_REG;                /*!< (@ 0x00000044) Fast RC control register                                   */\n  __IOM uint32_t  CLK_RCX_REG;                  /*!< (@ 0x00000048) RCX-oscillator control register                            */\n  __IOM uint32_t  CLK_RTCDIV_REG;               /*!< (@ 0x0000004C) Divisor for RTC 100Hz clock                                */\n  __IOM uint32_t  BANDGAP_REG;                  /*!< (@ 0x00000050) bandgap trimming                                           */\n  __IOM uint32_t  VBUS_IRQ_MASK_REG;            /*!< (@ 0x00000054) IRQ masking                                                */\n  __IOM uint32_t  VBUS_IRQ_CLEAR_REG;           /*!< (@ 0x00000058) Clear pending IRQ register                                 */\n  __IM  uint32_t  RESERVED2;\n  __IOM uint32_t  BOD_CTRL_REG;                 /*!< (@ 0x00000060) Brown Out Detection control register                       */\n  __IOM uint32_t  BOD_LVL_CTRL0_REG;            /*!< (@ 0x00000064) BOD_LVL_CTRL0_REG                                          */\n  __IOM uint32_t  BOD_LVL_CTRL1_REG;            /*!< (@ 0x00000068) BOD_LVL_CTRL1_REG                                          */\n  __IOM uint32_t  BOD_LVL_CTRL2_REG;            /*!< (@ 0x0000006C) BOD_LVL_CTRL2_REG                                          */\n  __IOM uint32_t  P0_PAD_LATCH_REG;             /*!< (@ 0x00000070) Control the state retention of the GPIO ports              */\n  __IOM uint32_t  P0_SET_PAD_LATCH_REG;         /*!< (@ 0x00000074) Control the state retention of the GPIO ports              */\n  __IOM uint32_t  P0_RESET_PAD_LATCH_REG;       /*!< (@ 0x00000078) Control the state retention of the GPIO ports              */\n  __IOM uint32_t  P1_PAD_LATCH_REG;             /*!< (@ 0x0000007C) Control the state retention of the GPIO ports              */\n  __IOM uint32_t  P1_SET_PAD_LATCH_REG;         /*!< (@ 0x00000080) Control the state retention of the GPIO ports              */\n  __IOM uint32_t  P1_RESET_PAD_LATCH_REG;       /*!< (@ 0x00000084) Control the state retention of the GPIO ports              */\n  __IM  uint32_t  RESERVED3[2];\n  __IOM uint32_t  BOD_STATUS_REG;               /*!< (@ 0x00000090) BOD_STATUS_REG                                             */\n  __IOM uint32_t  POR_VBAT_CTRL_REG;            /*!< (@ 0x00000094) Controls the POR on VBAT                                   */\n  __IOM uint32_t  POR_PIN_REG;                  /*!< (@ 0x00000098) Selects a GPIO pin for POR generation                      */\n  __IOM uint32_t  POR_TIMER_REG;                /*!< (@ 0x0000009C) Time for POR to happen                                     */\n  __IOM uint32_t  LDO_VDDD_HIGH_CTRL_REG;       /*!< (@ 0x000000A0) LDO control register                                       */\n  __IOM uint32_t  BIAS_VREF_SEL_REG;            /*!< (@ 0x000000A4) BIAS_VREF_SEL_REG                                          */\n  __IM  uint32_t  RESERVED4[5];\n  __IOM uint32_t  RESET_STAT_REG;               /*!< (@ 0x000000BC) Reset status register                                      */\n  __IOM uint32_t  RAM_PWR_CTRL_REG;             /*!< (@ 0x000000C0) Control power state of System RAMS                         */\n  __IM  uint32_t  RESERVED5[2];\n  __IOM uint32_t  SECURE_BOOT_REG;              /*!< (@ 0x000000CC) Controls secure booting                                    */\n  __IM  uint32_t  RESERVED6;\n  __IOM uint32_t  DISCHARGE_RAIL_REG;           /*!< (@ 0x000000D4) Immediate rail resetting. There is no LDO/DCDC\n                                                                    gating                                                     */\n  __IM  uint32_t  RESERVED7[5];\n  __IOM uint32_t  ANA_STATUS_REG;               /*!< (@ 0x000000EC) Analog Signals Status Register                             */\n  __IOM uint32_t  POWER_CTRL_REG;               /*!< (@ 0x000000F0) Power control register                                     */\n  __IOM uint32_t  PMU_SLEEP_REG;                /*!< (@ 0x000000F4) Configures the sleep/wakeup strategy                       */\n  __IOM uint32_t  PMU_TRIM_REG;                 /*!< (@ 0x000000F8) LDO trimming register                                      */\n} CRG_TOP_Type;                                 /*!< Size = 252 (0xfc)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                         CRG_XTAL                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief CRG_XTAL registers (CRG_XTAL)\n  */\n\ntypedef struct {                                /*!< (@ 0x50010000) CRG_XTAL Structure                                         */\n  __IOM uint32_t  CLK_FREQ_TRIM_REG;            /*!< (@ 0x00000000) Xtal frequency trimming register.                          */\n  __IM  uint32_t  RESERVED[3];\n  __IOM uint32_t  TRIM_CTRL_REG;                /*!< (@ 0x00000010) Control trimming of the XTAL32M                            */\n  __IM  uint32_t  RESERVED1;\n  __IOM uint32_t  XTALRDY_CTRL_REG;             /*!< (@ 0x00000018) Control register for XTALRDY IRQ                           */\n  __IOM uint32_t  XTALRDY_STAT_REG;             /*!< (@ 0x0000001C) Difference between XTAL_OK and XTALRDY_IRQ in\n                                                                    LP clock cycles                                            */\n  __IM  uint32_t  RESERVED2[4];\n  __IOM uint32_t  XTAL32M_CTRL0_REG;            /*!< (@ 0x00000030) Control register for XTAL32M                               */\n  __IOM uint32_t  XTAL32M_CTRL1_REG;            /*!< (@ 0x00000034) Control register for XTAL32M                               */\n  __IOM uint32_t  XTAL32M_CTRL2_REG;            /*!< (@ 0x00000038) Control register for XTAL32M                               */\n  __IOM uint32_t  XTAL32M_CTRL3_REG;            /*!< (@ 0x0000003C) Control register for XTAL32M                               */\n  __IOM uint32_t  XTAL32M_CTRL4_REG;            /*!< (@ 0x00000040) Control register for XTAL32M                               */\n  __IM  uint32_t  RESERVED3[3];\n  __IOM uint32_t  XTAL32M_STAT0_REG;            /*!< (@ 0x00000050) Status register for XTAL32M                                */\n  __IOM uint32_t  XTAL32M_STAT1_REG;            /*!< (@ 0x00000054) Status register for XTAL32M                                */\n  __IM  uint32_t  RESERVED4[2];\n  __IOM uint32_t  PLL_SYS_CTRL1_REG;            /*!< (@ 0x00000060) System PLL control register 1.                             */\n  __IOM uint32_t  PLL_SYS_CTRL2_REG;            /*!< (@ 0x00000064) System PLL control register 2.                             */\n  __IOM uint32_t  PLL_SYS_CTRL3_REG;            /*!< (@ 0x00000068) System PLL control register 3.                             */\n  __IM  uint32_t  RESERVED5;\n  __IOM uint32_t  PLL_SYS_STATUS_REG;           /*!< (@ 0x00000070) System PLL status register.                                */\n} CRG_XTAL_Type;                                /*!< Size = 116 (0x74)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           DCDC                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief DCDC registers (DCDC)\n  */\n\ntypedef struct {                                /*!< (@ 0x50000300) DCDC Structure                                             */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  DCDC_CTRL1_REG;               /*!< (@ 0x00000004) DCDC First Control Register                                */\n  __IOM uint32_t  DCDC_CTRL2_REG;               /*!< (@ 0x00000008) DCDC Second Control Register                               */\n  __IOM uint32_t  DCDC_V14_REG;                 /*!< (@ 0x0000000C) DCDC V14 Control Register                                  */\n  __IOM uint32_t  DCDC_VDD_REG;                 /*!< (@ 0x00000010) DCDC VDD Control Register                                  */\n  __IOM uint32_t  DCDC_V18_REG;                 /*!< (@ 0x00000014) DCDC V18 Control Register                                  */\n  __IOM uint32_t  DCDC_V18P_REG;                /*!< (@ 0x00000018) DCDC V18P Control Register                                 */\n  __IM  uint32_t  RESERVED1;\n  __IOM uint32_t  DCDC_STATUS1_REG;             /*!< (@ 0x00000020) DCDC First Status Register                                 */\n  __IM  uint32_t  RESERVED2[3];\n  __IOM uint32_t  DCDC_IRQ_STATUS_REG;          /*!< (@ 0x00000030) DCDC Interrupt Status Register                             */\n  __IOM uint32_t  DCDC_IRQ_CLEAR_REG;           /*!< (@ 0x00000034) DCDC Interrupt Clear Register                              */\n  __IOM uint32_t  DCDC_IRQ_MASK_REG;            /*!< (@ 0x00000038) DCDC Interrupt Mask Register                               */\n} DCDC_Type;                                    /*!< Size = 60 (0x3c)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            DMA                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief DMA registers (DMA)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040800) DMA Structure                                              */\n  __IOM uint32_t  DMA0_A_START_REG;             /*!< (@ 0x00000000) Start address A of DMA channel 0                           */\n  __IOM uint32_t  DMA0_B_START_REG;             /*!< (@ 0x00000004) Start address B of DMA channel 0                           */\n  __IOM uint32_t  DMA0_INT_REG;                 /*!< (@ 0x00000008) DMA receive interrupt register channel 0                   */\n  __IOM uint32_t  DMA0_LEN_REG;                 /*!< (@ 0x0000000C) DMA receive length register channel 0                      */\n  __IOM uint32_t  DMA0_CTRL_REG;                /*!< (@ 0x00000010) Control register for the DMA channel 0                     */\n  __IOM uint32_t  DMA0_IDX_REG;                 /*!< (@ 0x00000014) Index value of DMA channel 0                               */\n  __IM  uint32_t  RESERVED[2];\n  __IOM uint32_t  DMA1_A_START_REG;             /*!< (@ 0x00000020) Start address A of DMA channel 1                           */\n  __IOM uint32_t  DMA1_B_START_REG;             /*!< (@ 0x00000024) Start address B of DMA channel 1                           */\n  __IOM uint32_t  DMA1_INT_REG;                 /*!< (@ 0x00000028) DMA receive interrupt register channel 1                   */\n  __IOM uint32_t  DMA1_LEN_REG;                 /*!< (@ 0x0000002C) DMA receive length register channel 1                      */\n  __IOM uint32_t  DMA1_CTRL_REG;                /*!< (@ 0x00000030) Control register for the DMA channel 1                     */\n  __IOM uint32_t  DMA1_IDX_REG;                 /*!< (@ 0x00000034) Index value of DMA channel 1                               */\n  __IM  uint32_t  RESERVED1[2];\n  __IOM uint32_t  DMA2_A_START_REG;             /*!< (@ 0x00000040) Start address A of DMA channel 2                           */\n  __IOM uint32_t  DMA2_B_START_REG;             /*!< (@ 0x00000044) Start address B of DMA channel 2                           */\n  __IOM uint32_t  DMA2_INT_REG;                 /*!< (@ 0x00000048) DMA receive interrupt register channel 2                   */\n  __IOM uint32_t  DMA2_LEN_REG;                 /*!< (@ 0x0000004C) DMA receive length register channel 2                      */\n  __IOM uint32_t  DMA2_CTRL_REG;                /*!< (@ 0x00000050) Control register for the DMA channel 2                     */\n  __IOM uint32_t  DMA2_IDX_REG;                 /*!< (@ 0x00000054) Index value of DMA channel 2                               */\n  __IM  uint32_t  RESERVED2[2];\n  __IOM uint32_t  DMA3_A_START_REG;             /*!< (@ 0x00000060) Start address A of DMA channel 3                           */\n  __IOM uint32_t  DMA3_B_START_REG;             /*!< (@ 0x00000064) Start address B of DMA channel 3                           */\n  __IOM uint32_t  DMA3_INT_REG;                 /*!< (@ 0x00000068) DMA receive interrupt register channel 3                   */\n  __IOM uint32_t  DMA3_LEN_REG;                 /*!< (@ 0x0000006C) DMA receive length register channel 3                      */\n  __IOM uint32_t  DMA3_CTRL_REG;                /*!< (@ 0x00000070) Control register for the DMA channel 3                     */\n  __IOM uint32_t  DMA3_IDX_REG;                 /*!< (@ 0x00000074) Index value of DMA channel 3                               */\n  __IM  uint32_t  RESERVED3[2];\n  __IOM uint32_t  DMA4_A_START_REG;             /*!< (@ 0x00000080) Start address A of DMA channel 4                           */\n  __IOM uint32_t  DMA4_B_START_REG;             /*!< (@ 0x00000084) Start address B of DMA channel 4                           */\n  __IOM uint32_t  DMA4_INT_REG;                 /*!< (@ 0x00000088) DMA receive interrupt register channel 4                   */\n  __IOM uint32_t  DMA4_LEN_REG;                 /*!< (@ 0x0000008C) DMA receive length register channel 4                      */\n  __IOM uint32_t  DMA4_CTRL_REG;                /*!< (@ 0x00000090) Control register for the DMA channel 4                     */\n  __IOM uint32_t  DMA4_IDX_REG;                 /*!< (@ 0x00000094) Index value of DMA channel 4                               */\n  __IM  uint32_t  RESERVED4[2];\n  __IOM uint32_t  DMA5_A_START_REG;             /*!< (@ 0x000000A0) Start address A of DMA channel 5                           */\n  __IOM uint32_t  DMA5_B_START_REG;             /*!< (@ 0x000000A4) Start address B of DMA channel 5                           */\n  __IOM uint32_t  DMA5_INT_REG;                 /*!< (@ 0x000000A8) DMA receive interrupt register channel 5                   */\n  __IOM uint32_t  DMA5_LEN_REG;                 /*!< (@ 0x000000AC) DMA receive length register channel 5                      */\n  __IOM uint32_t  DMA5_CTRL_REG;                /*!< (@ 0x000000B0) Control register for the DMA channel 5                     */\n  __IOM uint32_t  DMA5_IDX_REG;                 /*!< (@ 0x000000B4) Index value of DMA channel 5                               */\n  __IM  uint32_t  RESERVED5[2];\n  __IOM uint32_t  DMA6_A_START_REG;             /*!< (@ 0x000000C0) Start address A of DMA channel 6                           */\n  __IOM uint32_t  DMA6_B_START_REG;             /*!< (@ 0x000000C4) Start address B of DMA channel 6                           */\n  __IOM uint32_t  DMA6_INT_REG;                 /*!< (@ 0x000000C8) DMA receive interrupt register channel 6                   */\n  __IOM uint32_t  DMA6_LEN_REG;                 /*!< (@ 0x000000CC) DMA receive length register channel 6                      */\n  __IOM uint32_t  DMA6_CTRL_REG;                /*!< (@ 0x000000D0) Control register for the DMA channel 6                     */\n  __IOM uint32_t  DMA6_IDX_REG;                 /*!< (@ 0x000000D4) Index value of DMA channel 6                               */\n  __IM  uint32_t  RESERVED6[2];\n  __IOM uint32_t  DMA7_A_START_REG;             /*!< (@ 0x000000E0) Start address A of DMA channel 7                           */\n  __IOM uint32_t  DMA7_B_START_REG;             /*!< (@ 0x000000E4) Start address B of DMA channel 7                           */\n  __IOM uint32_t  DMA7_INT_REG;                 /*!< (@ 0x000000E8) DMA receive interrupt register channel 7                   */\n  __IOM uint32_t  DMA7_LEN_REG;                 /*!< (@ 0x000000EC) DMA receive length register channel 7                      */\n  __IOM uint32_t  DMA7_CTRL_REG;                /*!< (@ 0x000000F0) Control register for the DMA channel 7                     */\n  __IOM uint32_t  DMA7_IDX_REG;                 /*!< (@ 0x000000F4) Index value of DMA channel 7                               */\n  __IM  uint32_t  RESERVED7[2];\n  __IOM uint32_t  DMA_REQ_MUX_REG;              /*!< (@ 0x00000100) DMA channel assignments                                    */\n  __IOM uint32_t  DMA_INT_STATUS_REG;           /*!< (@ 0x00000104) DMA interrupt status register                              */\n  __IOM uint32_t  DMA_CLEAR_INT_REG;            /*!< (@ 0x00000108) DMA clear interrupt register                               */\n  __IOM uint32_t  DMA_INT_MASK_REG;             /*!< (@ 0x0000010C) DMA Interrupt mask register                                */\n} DMA_Type;                                     /*!< Size = 272 (0x110)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            DW                                             ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief DW registers (DW)\n  */\n\ntypedef struct {                                /*!< (@ 0x30020000) DW Structure                                               */\n  __IOM uint32_t  AHB_DMA_PL1_REG;              /*!< (@ 0x00000000) AHB-DMA layer priority level for RFTP (AHB DMA\n                                                                    layer only)                                                */\n  __IOM uint32_t  AHB_DMA_PL2_REG;              /*!< (@ 0x00000004) AHB-DMA layer priority level for LCD (AHB DMA\n                                                                    layer only)                                                */\n  __IOM uint32_t  AHB_DMA_PL3_REG;              /*!< (@ 0x00000008) AHB-DMA layer Priority level for GEN-DMA (AHB\n                                                                    DMA layer only)                                            */\n  __IOM uint32_t  AHB_DMA_PL4_REG;              /*!< (@ 0x0000000C) AHB-DMA layer Priority level for CRYPTO-DMA (AHB\n                                                                    DMA layer only)                                            */\n  __IM  uint32_t  RESERVED[14];\n  __IOM uint32_t  AHB_DMA_DFLT_MASTER_REG;      /*!< (@ 0x00000048) Default master ID number (AHB DMA layer only)              */\n  __IOM uint32_t  AHB_DMA_WTEN_REG;             /*!< (@ 0x0000004C) Weighted-Token Arbitration Scheme Enable (AHB\n                                                                    DMA layer only)                                            */\n  __IOM uint32_t  AHB_DMA_TCL_REG;              /*!< (@ 0x00000050) Master clock refresh period (AHB DMA layer only)           */\n  __IOM uint32_t  AHB_DMA_CCLM1_REG;            /*!< (@ 0x00000054) USB Master clock tokens (AHB DMA layer only)               */\n  __IOM uint32_t  AHB_DMA_CCLM2_REG;            /*!< (@ 0x00000058) GenDMA Master clock tokens (AHB DMA layer only)            */\n  __IOM uint32_t  AHB_DMA_CCLM3_REG;            /*!< (@ 0x0000005C) CRYPTO Master clock tokens (AHB DMA layer only)            */\n  __IOM uint32_t  AHB_DMA_CCLM4_REG;            /*!< (@ 0x00000060) CRYPTO Master clock tokens (AHB DMA layer only)            */\n  __IM  uint32_t  RESERVED1[11];\n  __IOM uint32_t  AHB_DMA_VERSION_REG;          /*!< (@ 0x00000090) Version ID (AHB DMA layer only)                            */\n} DW_Type;                                      /*!< Size = 148 (0x94)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           GPADC                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief GPADC registers (GPADC)\n  */\n\ntypedef struct {                                /*!< (@ 0x50030900) GPADC Structure                                            */\n  __IOM uint32_t  GP_ADC_CTRL_REG;              /*!< (@ 0x00000000) General Purpose ADC Control Register                       */\n  __IOM uint32_t  GP_ADC_CTRL2_REG;             /*!< (@ 0x00000004) General Purpose ADC Second Control Register                */\n  __IOM uint32_t  GP_ADC_CTRL3_REG;             /*!< (@ 0x00000008) General Purpose ADC Third Control Register                 */\n  __IOM uint32_t  GP_ADC_OFFP_REG;              /*!< (@ 0x0000000C) General Purpose ADC Positive Offset Register               */\n  __IOM uint32_t  GP_ADC_OFFN_REG;              /*!< (@ 0x00000010) General Purpose ADC Negative Offset Register               */\n  __IOM uint32_t  GP_ADC_CLEAR_INT_REG;         /*!< (@ 0x00000014) General Purpose ADC Clear Interrupt Register               */\n  __IOM uint32_t  GP_ADC_RESULT_REG;            /*!< (@ 0x00000018) General Purpose ADC Result Register                        */\n} GPADC_Type;                                   /*!< Size = 28 (0x1c)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           GPIO                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief GPIO registers (GPIO)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020A00) GPIO Structure                                             */\n  __IOM uint32_t  P0_DATA_REG;                  /*!< (@ 0x00000000) P0 Data input / output Register                            */\n  __IOM uint32_t  P1_DATA_REG;                  /*!< (@ 0x00000004) P1 Data input / output Register                            */\n  __IOM uint32_t  P0_SET_DATA_REG;              /*!< (@ 0x00000008) P0 Set port pins Register                                  */\n  __IOM uint32_t  P1_SET_DATA_REG;              /*!< (@ 0x0000000C) P1 Set port pins Register                                  */\n  __IOM uint32_t  P0_RESET_DATA_REG;            /*!< (@ 0x00000010) P0 Reset port pins Register                                */\n  __IOM uint32_t  P1_RESET_DATA_REG;            /*!< (@ 0x00000014) P1 Reset port pins Register                                */\n  __IOM uint32_t  P0_00_MODE_REG;               /*!< (@ 0x00000018) P0_00 Mode Register                                        */\n  __IOM uint32_t  P0_01_MODE_REG;               /*!< (@ 0x0000001C) P0_01 Mode Register                                        */\n  __IOM uint32_t  P0_02_MODE_REG;               /*!< (@ 0x00000020) P0_02 Mode Register                                        */\n  __IOM uint32_t  P0_03_MODE_REG;               /*!< (@ 0x00000024) P0_03 Mode Register                                        */\n  __IOM uint32_t  P0_04_MODE_REG;               /*!< (@ 0x00000028) P0_04 Mode Register                                        */\n  __IOM uint32_t  P0_05_MODE_REG;               /*!< (@ 0x0000002C) P0_05 Mode Register                                        */\n  __IOM uint32_t  P0_06_MODE_REG;               /*!< (@ 0x00000030) P0_06 Mode Register                                        */\n  __IOM uint32_t  P0_07_MODE_REG;               /*!< (@ 0x00000034) P0_07 Mode Register                                        */\n  __IOM uint32_t  P0_08_MODE_REG;               /*!< (@ 0x00000038) P0_08 Mode Register                                        */\n  __IOM uint32_t  P0_09_MODE_REG;               /*!< (@ 0x0000003C) P0_09 Mode Register                                        */\n  __IOM uint32_t  P0_10_MODE_REG;               /*!< (@ 0x00000040) P0_10 Mode Register                                        */\n  __IOM uint32_t  P0_11_MODE_REG;               /*!< (@ 0x00000044) P0_11 Mode Register                                        */\n  __IOM uint32_t  P0_12_MODE_REG;               /*!< (@ 0x00000048) P0_12 Mode Register                                        */\n  __IOM uint32_t  P0_13_MODE_REG;               /*!< (@ 0x0000004C) P0_13 Mode Register                                        */\n  __IOM uint32_t  P0_14_MODE_REG;               /*!< (@ 0x00000050) P0_14 Mode Register                                        */\n  __IOM uint32_t  P0_15_MODE_REG;               /*!< (@ 0x00000054) P0_15 Mode Register                                        */\n  __IOM uint32_t  P0_16_MODE_REG;               /*!< (@ 0x00000058) P0_16 Mode Register                                        */\n  __IOM uint32_t  P0_17_MODE_REG;               /*!< (@ 0x0000005C) P0_17 Mode Register                                        */\n  __IOM uint32_t  P0_18_MODE_REG;               /*!< (@ 0x00000060) P0_18 Mode Register                                        */\n  __IOM uint32_t  P0_19_MODE_REG;               /*!< (@ 0x00000064) P0_19 Mode Register                                        */\n  __IOM uint32_t  P0_20_MODE_REG;               /*!< (@ 0x00000068) P0_20 Mode Register                                        */\n  __IOM uint32_t  P0_21_MODE_REG;               /*!< (@ 0x0000006C) P0_21 Mode Register                                        */\n  __IOM uint32_t  P0_22_MODE_REG;               /*!< (@ 0x00000070) P0_22 Mode Register                                        */\n  __IOM uint32_t  P0_23_MODE_REG;               /*!< (@ 0x00000074) P0_23 Mode Register                                        */\n  __IOM uint32_t  P0_24_MODE_REG;               /*!< (@ 0x00000078) P0_24 Mode Register                                        */\n  __IOM uint32_t  P0_25_MODE_REG;               /*!< (@ 0x0000007C) P0_25 Mode Register                                        */\n  __IOM uint32_t  P0_26_MODE_REG;               /*!< (@ 0x00000080) P0_26 Mode Register                                        */\n  __IOM uint32_t  P0_27_MODE_REG;               /*!< (@ 0x00000084) P0_27 Mode Register                                        */\n  __IOM uint32_t  P0_28_MODE_REG;               /*!< (@ 0x00000088) P0_28 Mode Register                                        */\n  __IOM uint32_t  P0_29_MODE_REG;               /*!< (@ 0x0000008C) P0_29 Mode Register                                        */\n  __IOM uint32_t  P0_30_MODE_REG;               /*!< (@ 0x00000090) P0_30 Mode Register                                        */\n  __IOM uint32_t  P0_31_MODE_REG;               /*!< (@ 0x00000094) P0_31 Mode Register                                        */\n  __IOM uint32_t  P1_00_MODE_REG;               /*!< (@ 0x00000098) P1_00 Mode Register                                        */\n  __IOM uint32_t  P1_01_MODE_REG;               /*!< (@ 0x0000009C) P1_01 Mode Register                                        */\n  __IOM uint32_t  P1_02_MODE_REG;               /*!< (@ 0x000000A0) P1_02 Mode Register                                        */\n  __IOM uint32_t  P1_03_MODE_REG;               /*!< (@ 0x000000A4) P1_03 Mode Register                                        */\n  __IOM uint32_t  P1_04_MODE_REG;               /*!< (@ 0x000000A8) P1_04 Mode Register                                        */\n  __IOM uint32_t  P1_05_MODE_REG;               /*!< (@ 0x000000AC) P1_05 Mode Register                                        */\n  __IOM uint32_t  P1_06_MODE_REG;               /*!< (@ 0x000000B0) P1_06 Mode Register                                        */\n  __IOM uint32_t  P1_07_MODE_REG;               /*!< (@ 0x000000B4) P1_07 Mode Register                                        */\n  __IOM uint32_t  P1_08_MODE_REG;               /*!< (@ 0x000000B8) P1_08 Mode Register                                        */\n  __IOM uint32_t  P1_09_MODE_REG;               /*!< (@ 0x000000BC) P1_09 Mode Register                                        */\n  __IOM uint32_t  P1_10_MODE_REG;               /*!< (@ 0x000000C0) P1_10 Mode Register                                        */\n  __IOM uint32_t  P1_11_MODE_REG;               /*!< (@ 0x000000C4) P1_11 Mode Register                                        */\n  __IOM uint32_t  P1_12_MODE_REG;               /*!< (@ 0x000000C8) P1_12 Mode Register                                        */\n  __IOM uint32_t  P1_13_MODE_REG;               /*!< (@ 0x000000CC) P1_13 Mode Register                                        */\n  __IOM uint32_t  P1_14_MODE_REG;               /*!< (@ 0x000000D0) P1_14 Mode Register                                        */\n  __IOM uint32_t  P1_15_MODE_REG;               /*!< (@ 0x000000D4) P1_15 Mode Register                                        */\n  __IOM uint32_t  P1_16_MODE_REG;               /*!< (@ 0x000000D8) P1_16 Mode Register                                        */\n  __IOM uint32_t  P1_17_MODE_REG;               /*!< (@ 0x000000DC) P1_17 Mode Register                                        */\n  __IOM uint32_t  P1_18_MODE_REG;               /*!< (@ 0x000000E0) P1_18 Mode Register                                        */\n  __IOM uint32_t  P1_19_MODE_REG;               /*!< (@ 0x000000E4) P1_19 Mode Register                                        */\n  __IOM uint32_t  P1_20_MODE_REG;               /*!< (@ 0x000000E8) P1_20 Mode Register                                        */\n  __IOM uint32_t  P1_21_MODE_REG;               /*!< (@ 0x000000EC) P1_21 Mode Register                                        */\n  __IOM uint32_t  P1_22_MODE_REG;               /*!< (@ 0x000000F0) P1_22 Mode Register                                        */\n  __IOM uint32_t  P0_PADPWR_CTRL_REG;           /*!< (@ 0x000000F4) P0 Output Power Control Register                           */\n  __IOM uint32_t  P1_PADPWR_CTRL_REG;           /*!< (@ 0x000000F8) P1 Output Power Control Register                           */\n  __IOM uint32_t  GPIO_CLK_SEL_REG;             /*!< (@ 0x000000FC) Select which clock to map on ports P0/P1                   */\n  __IOM uint32_t  PAD_WEAK_CTRL_REG;            /*!< (@ 0x00000100) Weak Pads Control Register                                 */\n} GPIO_Type;                                    /*!< Size = 260 (0x104)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           GPREG                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief GPREG registers (GPREG)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040300) GPREG Structure                                            */\n  __IOM uint32_t  SET_FREEZE_REG;               /*!< (@ 0x00000000) Controls freezing of various timers/counters\n                                                                    (incl. DMA and USB).                                       */\n  __IOM uint32_t  RESET_FREEZE_REG;             /*!< (@ 0x00000004) Controls unfreezing of various timers/counters\n                                                                    (incl. DMA and USB).                                       */\n  __IOM uint32_t  DEBUG_REG;                    /*!< (@ 0x00000008) Various debug information register.                        */\n  __IOM uint32_t  GP_STATUS_REG;                /*!< (@ 0x0000000C) General purpose system status register.                    */\n  __IOM uint32_t  GP_CONTROL_REG;               /*!< (@ 0x00000010) General purpose system control register.                   */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  USBPAD_REG;                   /*!< (@ 0x00000018) USB pads control register                                  */\n} GPREG_Type;                                   /*!< Size = 28 (0x1c)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            I2C                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief I2C registers (I2C)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020600) I2C Structure                                              */\n  __IOM uint32_t  I2C_CON_REG;                  /*!< (@ 0x00000000) I2C Control Register                                       */\n  __IOM uint32_t  I2C_TAR_REG;                  /*!< (@ 0x00000004) I2C Target Address Register                                */\n  __IOM uint32_t  I2C_SAR_REG;                  /*!< (@ 0x00000008) I2C Slave Address Register                                 */\n  __IOM uint32_t  I2C_HS_MADDR_REG;             /*!< (@ 0x0000000C) I2C High Speed Master Mode Code Address Register           */\n  __IOM uint32_t  I2C_DATA_CMD_REG;             /*!< (@ 0x00000010) I2C Rx/Tx Data Buffer and Command Register                 */\n  __IOM uint32_t  I2C_SS_SCL_HCNT_REG;          /*!< (@ 0x00000014) Standard Speed I2C Clock SCL High Count Register           */\n  __IOM uint32_t  I2C_SS_SCL_LCNT_REG;          /*!< (@ 0x00000018) Standard Speed I2C Clock SCL Low Count Register            */\n  __IOM uint32_t  I2C_FS_SCL_HCNT_REG;          /*!< (@ 0x0000001C) Fast Speed I2C Clock SCL High Count Register               */\n  __IOM uint32_t  I2C_FS_SCL_LCNT_REG;          /*!< (@ 0x00000020) Fast Speed I2C Clock SCL Low Count Register                */\n  __IOM uint32_t  I2C_HS_SCL_HCNT_REG;          /*!< (@ 0x00000024) High Speed I2C Clock SCL High Count Register               */\n  __IOM uint32_t  I2C_HS_SCL_LCNT_REG;          /*!< (@ 0x00000028) High Speed I2C Clock SCL Low Count Register                */\n  __IOM uint32_t  I2C_INTR_STAT_REG;            /*!< (@ 0x0000002C) I2C Interrupt Status Register                              */\n  __IOM uint32_t  I2C_INTR_MASK_REG;            /*!< (@ 0x00000030) I2C Interrupt Mask Register                                */\n  __IOM uint32_t  I2C_RAW_INTR_STAT_REG;        /*!< (@ 0x00000034) I2C Raw Interrupt Status Register                          */\n  __IOM uint32_t  I2C_RX_TL_REG;                /*!< (@ 0x00000038) I2C Receive FIFO Threshold Register                        */\n  __IOM uint32_t  I2C_TX_TL_REG;                /*!< (@ 0x0000003C) I2C Transmit FIFO Threshold Register                       */\n  __IOM uint32_t  I2C_CLR_INTR_REG;             /*!< (@ 0x00000040) Clear Combined and Individual Interrupt Register           */\n  __IOM uint32_t  I2C_CLR_RX_UNDER_REG;         /*!< (@ 0x00000044) Clear RX_UNDER Interrupt Register                          */\n  __IOM uint32_t  I2C_CLR_RX_OVER_REG;          /*!< (@ 0x00000048) Clear RX_OVER Interrupt Register                           */\n  __IOM uint32_t  I2C_CLR_TX_OVER_REG;          /*!< (@ 0x0000004C) Clear TX_OVER Interrupt Register                           */\n  __IOM uint32_t  I2C_CLR_RD_REQ_REG;           /*!< (@ 0x00000050) Clear RD_REQ Interrupt Register                            */\n  __IOM uint32_t  I2C_CLR_TX_ABRT_REG;          /*!< (@ 0x00000054) Clear TX_ABRT Interrupt Register                           */\n  __IOM uint32_t  I2C_CLR_RX_DONE_REG;          /*!< (@ 0x00000058) Clear RX_DONE Interrupt Register                           */\n  __IOM uint32_t  I2C_CLR_ACTIVITY_REG;         /*!< (@ 0x0000005C) Clear ACTIVITY Interrupt Register                          */\n  __IOM uint32_t  I2C_CLR_STOP_DET_REG;         /*!< (@ 0x00000060) Clear STOP_DET Interrupt Register                          */\n  __IOM uint32_t  I2C_CLR_START_DET_REG;        /*!< (@ 0x00000064) Clear START_DET Interrupt Register                         */\n  __IOM uint32_t  I2C_CLR_GEN_CALL_REG;         /*!< (@ 0x00000068) Clear GEN_CALL Interrupt Register                          */\n  __IOM uint32_t  I2C_ENABLE_REG;               /*!< (@ 0x0000006C) I2C Enable Register                                        */\n  __IOM uint32_t  I2C_STATUS_REG;               /*!< (@ 0x00000070) I2C Status Register                                        */\n  __IOM uint32_t  I2C_TXFLR_REG;                /*!< (@ 0x00000074) I2C Transmit FIFO Level Register                           */\n  __IOM uint32_t  I2C_RXFLR_REG;                /*!< (@ 0x00000078) I2C Receive FIFO Level Register                            */\n  __IOM uint32_t  I2C_SDA_HOLD_REG;             /*!< (@ 0x0000007C) I2C SDA Hold Time Length Register                          */\n  __IOM uint32_t  I2C_TX_ABRT_SOURCE_REG;       /*!< (@ 0x00000080) I2C Transmit Abort Source Register                         */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  I2C_DMA_CR_REG;               /*!< (@ 0x00000088) DMA Control Register                                       */\n  __IOM uint32_t  I2C_DMA_TDLR_REG;             /*!< (@ 0x0000008C) DMA Transmit Data Level Register                           */\n  __IOM uint32_t  I2C_DMA_RDLR_REG;             /*!< (@ 0x00000090) I2C Receive Data Level Register                            */\n  __IOM uint32_t  I2C_SDA_SETUP_REG;            /*!< (@ 0x00000094) I2C SDA Setup Register                                     */\n  __IOM uint32_t  I2C_ACK_GENERAL_CALL_REG;     /*!< (@ 0x00000098) I2C ACK General Call Register                              */\n  __IOM uint32_t  I2C_ENABLE_STATUS_REG;        /*!< (@ 0x0000009C) I2C Enable Status Register                                 */\n  __IOM uint32_t  I2C_IC_FS_SPKLEN_REG;         /*!< (@ 0x000000A0) I2C SS and FS spike suppression limit Size                 */\n  __IOM uint32_t  I2C_IC_HS_SPKLEN_REG;         /*!< (@ 0x000000A4) I2C HS spike suppression limit Size                        */\n} I2C_Type;                                     /*!< Size = 168 (0xa8)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           I2C2                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief I2C2 registers (I2C2)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020700) I2C2 Structure                                             */\n  __IOM uint32_t  I2C2_CON_REG;                 /*!< (@ 0x00000000) I2C Control Register                                       */\n  __IOM uint32_t  I2C2_TAR_REG;                 /*!< (@ 0x00000004) I2C Target Address Register                                */\n  __IOM uint32_t  I2C2_SAR_REG;                 /*!< (@ 0x00000008) I2C Slave Address Register                                 */\n  __IOM uint32_t  I2C2_HS_MADDR_REG;            /*!< (@ 0x0000000C) I2C High Speed Master Mode Code Address Register           */\n  __IOM uint32_t  I2C2_DATA_CMD_REG;            /*!< (@ 0x00000010) I2C Rx/Tx Data Buffer and Command Register                 */\n  __IOM uint32_t  I2C2_SS_SCL_HCNT_REG;         /*!< (@ 0x00000014) Standard Speed I2C Clock SCL High Count Register           */\n  __IOM uint32_t  I2C2_SS_SCL_LCNT_REG;         /*!< (@ 0x00000018) Standard Speed I2C Clock SCL Low Count Register            */\n  __IOM uint32_t  I2C2_FS_SCL_HCNT_REG;         /*!< (@ 0x0000001C) Fast Speed I2C Clock SCL High Count Register               */\n  __IOM uint32_t  I2C2_FS_SCL_LCNT_REG;         /*!< (@ 0x00000020) Fast Speed I2C Clock SCL Low Count Register                */\n  __IOM uint32_t  I2C2_HS_SCL_HCNT_REG;         /*!< (@ 0x00000024) High Speed I2C Clock SCL High Count Register               */\n  __IOM uint32_t  I2C2_HS_SCL_LCNT_REG;         /*!< (@ 0x00000028) High Speed I2C Clock SCL Low Count Register                */\n  __IOM uint32_t  I2C2_INTR_STAT_REG;           /*!< (@ 0x0000002C) I2C Interrupt Status Register                              */\n  __IOM uint32_t  I2C2_INTR_MASK_REG;           /*!< (@ 0x00000030) I2C Interrupt Mask Register                                */\n  __IOM uint32_t  I2C2_RAW_INTR_STAT_REG;       /*!< (@ 0x00000034) I2C Raw Interrupt Status Register                          */\n  __IOM uint32_t  I2C2_RX_TL_REG;               /*!< (@ 0x00000038) I2C Receive FIFO Threshold Register                        */\n  __IOM uint32_t  I2C2_TX_TL_REG;               /*!< (@ 0x0000003C) I2C Transmit FIFO Threshold Register                       */\n  __IOM uint32_t  I2C2_CLR_INTR_REG;            /*!< (@ 0x00000040) Clear Combined and Individual Interrupt Register           */\n  __IOM uint32_t  I2C2_CLR_RX_UNDER_REG;        /*!< (@ 0x00000044) Clear RX_UNDER Interrupt Register                          */\n  __IOM uint32_t  I2C2_CLR_RX_OVER_REG;         /*!< (@ 0x00000048) Clear RX_OVER Interrupt Register                           */\n  __IOM uint32_t  I2C2_CLR_TX_OVER_REG;         /*!< (@ 0x0000004C) Clear TX_OVER Interrupt Register                           */\n  __IOM uint32_t  I2C2_CLR_RD_REQ_REG;          /*!< (@ 0x00000050) Clear RD_REQ Interrupt Register                            */\n  __IOM uint32_t  I2C2_CLR_TX_ABRT_REG;         /*!< (@ 0x00000054) Clear TX_ABRT Interrupt Register                           */\n  __IOM uint32_t  I2C2_CLR_RX_DONE_REG;         /*!< (@ 0x00000058) Clear RX_DONE Interrupt Register                           */\n  __IOM uint32_t  I2C2_CLR_ACTIVITY_REG;        /*!< (@ 0x0000005C) Clear ACTIVITY Interrupt Register                          */\n  __IOM uint32_t  I2C2_CLR_STOP_DET_REG;        /*!< (@ 0x00000060) Clear STOP_DET Interrupt Register                          */\n  __IOM uint32_t  I2C2_CLR_START_DET_REG;       /*!< (@ 0x00000064) Clear START_DET Interrupt Register                         */\n  __IOM uint32_t  I2C2_CLR_GEN_CALL_REG;        /*!< (@ 0x00000068) Clear GEN_CALL Interrupt Register                          */\n  __IOM uint32_t  I2C2_ENABLE_REG;              /*!< (@ 0x0000006C) I2C Enable Register                                        */\n  __IOM uint32_t  I2C2_STATUS_REG;              /*!< (@ 0x00000070) I2C Status Register                                        */\n  __IOM uint32_t  I2C2_TXFLR_REG;               /*!< (@ 0x00000074) I2C Transmit FIFO Level Register                           */\n  __IOM uint32_t  I2C2_RXFLR_REG;               /*!< (@ 0x00000078) I2C Receive FIFO Level Register                            */\n  __IOM uint32_t  I2C2_SDA_HOLD_REG;            /*!< (@ 0x0000007C) I2C SDA Hold Time Length Register                          */\n  __IOM uint32_t  I2C2_TX_ABRT_SOURCE_REG;      /*!< (@ 0x00000080) I2C Transmit Abort Source Register                         */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  I2C2_DMA_CR_REG;              /*!< (@ 0x00000088) DMA Control Register                                       */\n  __IOM uint32_t  I2C2_DMA_TDLR_REG;            /*!< (@ 0x0000008C) DMA Transmit Data Level Register                           */\n  __IOM uint32_t  I2C2_DMA_RDLR_REG;            /*!< (@ 0x00000090) I2C Receive Data Level Register                            */\n  __IOM uint32_t  I2C2_SDA_SETUP_REG;           /*!< (@ 0x00000094) I2C SDA Setup Register                                     */\n  __IOM uint32_t  I2C2_ACK_GENERAL_CALL_REG;    /*!< (@ 0x00000098) I2C ACK General Call Register                              */\n  __IOM uint32_t  I2C2_ENABLE_STATUS_REG;       /*!< (@ 0x0000009C) I2C Enable Status Register                                 */\n  __IOM uint32_t  I2C2_IC_FS_SPKLEN_REG;        /*!< (@ 0x000000A0) I2C SS and FS spike suppression limit Size                 */\n  __IOM uint32_t  I2C2_IC_HS_SPKLEN_REG;        /*!< (@ 0x000000A4) I2C HS spike suppression limit Size                        */\n} I2C2_Type;                                    /*!< Size = 168 (0xa8)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           LCDC                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief LCDC registers (LCDC)\n  */\n\ntypedef struct {                                /*!< (@ 0x30030000) LCDC Structure                                             */\n  __IOM uint32_t  LCDC_MODE_REG;                /*!< (@ 0x00000000) Display Mode                                               */\n  __IOM uint32_t  LCDC_CLKCTRL_REG;             /*!< (@ 0x00000004) Clock Divider                                              */\n  __IOM uint32_t  LCDC_BGCOLOR_REG;             /*!< (@ 0x00000008) Background Color                                           */\n  __IOM uint32_t  LCDC_RESXY_REG;               /*!< (@ 0x0000000C) Resolution X,Y                                             */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  LCDC_FRONTPORCHXY_REG;        /*!< (@ 0x00000014) Front Porch X and Y                                        */\n  __IOM uint32_t  LCDC_BLANKINGXY_REG;          /*!< (@ 0x00000018) Blanking X and Y                                           */\n  __IOM uint32_t  LCDC_BACKPORCHXY_REG;         /*!< (@ 0x0000001C) Back Porch X and Y                                         */\n  __IM  uint32_t  RESERVED1[2];\n  __IOM uint32_t  LCDC_DBIB_CFG_REG;            /*!< (@ 0x00000028) MIPI Config Register                                       */\n  __IOM uint32_t  LCDC_GPIO_REG;                /*!< (@ 0x0000002C) General Purpose IO (2-bits)                                */\n  __IOM uint32_t  LCDC_LAYER0_MODE_REG;         /*!< (@ 0x00000030) Layer0 Mode                                                */\n  __IOM uint32_t  LCDC_LAYER0_STARTXY_REG;      /*!< (@ 0x00000034) Layer0 Start XY                                            */\n  __IOM uint32_t  LCDC_LAYER0_SIZEXY_REG;       /*!< (@ 0x00000038) Layer0 Size XY                                             */\n  __IOM uint32_t  LCDC_LAYER0_BASEADDR_REG;     /*!< (@ 0x0000003C) Layer0 Base Addr                                           */\n  __IOM uint32_t  LCDC_LAYER0_STRIDE_REG;       /*!< (@ 0x00000040) Layer0 Stride                                              */\n  __IOM uint32_t  LCDC_LAYER0_RESXY_REG;        /*!< (@ 0x00000044) Layer0 Res XY                                              */\n  __IM  uint32_t  RESERVED2[18];\n  __IOM uint32_t  LCDC_JDI_RESXY_REG;           /*!< (@ 0x00000090) Resolution XY for the JDI parallel I/F                     */\n  __IOM uint32_t  LCDC_JDI_FBX_BLANKING_REG;    /*!< (@ 0x00000094) Horizontal front/back blanking (hck half periods)          */\n  __IOM uint32_t  LCDC_JDI_FBY_BLANKING_REG;    /*!< (@ 0x00000098) Vertical front/back blanking (vck half periods)            */\n  __IOM uint32_t  LCDC_JDI_HCK_WIDTH_REG;       /*!< (@ 0x0000009C) HCK high/low width                                         */\n  __IOM uint32_t  LCDC_JDI_XRST_WIDTH_REG;      /*!< (@ 0x000000A0) XRST width                                                 */\n  __IOM uint32_t  LCDC_JDI_VST_DELAY_REG;       /*!< (@ 0x000000A4) XRST-to-VST delay                                          */\n  __IOM uint32_t  LCDC_JDI_VST_WIDTH_REG;       /*!< (@ 0x000000A8) VST width                                                  */\n  __IOM uint32_t  LCDC_JDI_VCK_DELAY_REG;       /*!< (@ 0x000000AC) XRST-to-VCK delay                                          */\n  __IOM uint32_t  LCDC_JDI_HST_DELAY_REG;       /*!< (@ 0x000000B0) VCK-to-HST delay                                           */\n  __IOM uint32_t  LCDC_JDI_HST_WIDTH_REG;       /*!< (@ 0x000000B4) HST width                                                  */\n  __IOM uint32_t  LCDC_JDI_ENB_START_HLINE_REG; /*!< (@ 0x000000B8) ENB start horizontal line                                  */\n  __IOM uint32_t  LCDC_JDI_ENB_END_HLINE_REG;   /*!< (@ 0x000000BC) ENB end horizontal line                                    */\n  __IOM uint32_t  LCDC_JDI_ENB_START_CLK_REG;   /*!< (@ 0x000000C0) ENB start delay                                            */\n  __IOM uint32_t  LCDC_JDI_ENB_WIDTH_CLK_REG;   /*!< (@ 0x000000C4) ENB width                                                  */\n  __IM  uint32_t  RESERVED3[8];\n  __IOM uint32_t  LCDC_DBIB_CMD_REG;            /*!< (@ 0x000000E8) MIPI DBIB Command Register                                 */\n  __IM  uint32_t  RESERVED4[2];\n  __IOM uint32_t  LCDC_IDREG_REG;               /*!< (@ 0x000000F4) Identification Register                                    */\n  __IOM uint32_t  LCDC_INTERRUPT_REG;           /*!< (@ 0x000000F8) Interrupt Register                                         */\n  __IOM uint32_t  LCDC_STATUS_REG;              /*!< (@ 0x000000FC) Status Register                                            */\n  __IM  uint32_t  RESERVED5[33];\n  __IOM uint32_t  LCDC_CRC_REG;                 /*!< (@ 0x00000184) CRC check                                                  */\n  __IOM uint32_t  LCDC_LAYER0_OFFSETX_REG;      /*!< (@ 0x00000188) Layer0 OffsetX and DMA prefetch                            */\n} LCDC_Type;                                    /*!< Size = 396 (0x18c)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            LRA                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief LRA registers (LRA)\n  */\n\ntypedef struct {                                /*!< (@ 0x50030A00) LRA Structure                                              */\n  __IOM uint32_t  LRA_CTRL1_REG;                /*!< (@ 0x00000000) General Purpose LRA Control Register                       */\n  __IOM uint32_t  LRA_CTRL2_REG;                /*!< (@ 0x00000004) General Purpose LRA Control Register                       */\n  __IOM uint32_t  LRA_CTRL3_REG;                /*!< (@ 0x00000008) General Purpose LRA Control Register                       */\n  __IOM uint32_t  LRA_FLT_SMP1_REG;             /*!< (@ 0x0000000C) LRA Sample Register                                        */\n  __IOM uint32_t  LRA_FLT_SMP2_REG;             /*!< (@ 0x00000010) LRA Sample Register                                        */\n  __IOM uint32_t  LRA_FLT_SMP3_REG;             /*!< (@ 0x00000014) LRA Sample Register                                        */\n  __IOM uint32_t  LRA_FLT_SMP4_REG;             /*!< (@ 0x00000018) LRA Sample Register                                        */\n  __IOM uint32_t  LRA_FLT_SMP5_REG;             /*!< (@ 0x0000001C) LRA Sample Register                                        */\n  __IOM uint32_t  LRA_FLT_SMP6_REG;             /*!< (@ 0x00000020) LRA Sample Register                                        */\n  __IOM uint32_t  LRA_FLT_SMP7_REG;             /*!< (@ 0x00000024) LRA Sample Register                                        */\n  __IOM uint32_t  LRA_FLT_SMP8_REG;             /*!< (@ 0x00000028) LRA Sample Register                                        */\n  __IOM uint32_t  LRA_FLT_COEF1_REG;            /*!< (@ 0x0000002C) LRA Filter Coefficient Register                            */\n  __IOM uint32_t  LRA_FLT_COEF2_REG;            /*!< (@ 0x00000030) LRA Filter Coefficient Register                            */\n  __IOM uint32_t  LRA_FLT_COEF3_REG;            /*!< (@ 0x00000034) LRA Filter Coefficient Register                            */\n  __IOM uint32_t  LRA_BRD_LS_REG;               /*!< (@ 0x00000038) LRA Bridge Register                                        */\n  __IOM uint32_t  LRA_BRD_HS_REG;               /*!< (@ 0x0000003C) LRA Bridge Register                                        */\n  __IOM uint32_t  LRA_BRD_STAT_REG;             /*!< (@ 0x00000040) LRA Bridge Status Register                                  */\n  __IOM uint32_t  LRA_ADC_CTRL1_REG;            /*!< (@ 0x00000044) General Purpose ADC Control Register                       */\n  __IM  uint32_t  RESERVED[2];\n  __IOM uint32_t  LRA_ADC_RESULT_REG;           /*!< (@ 0x00000050) General Purpose ADC Result Register                        */\n  __IOM uint32_t  LRA_LDO_REG;                  /*!< (@ 0x00000054) LRA LDO Register                                           */\n  __IOM uint32_t  LRA_DFT_REG;                  /*!< (@ 0x00000058) LRA test Register                                          */\n} LRA_Type;                                     /*!< Size = 92 (0x5c)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          MEMCTRL                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief MEMCTRL registers (MEMCTRL)\n  */\n\ntypedef struct {                                /*!< (@ 0x50050000) MEMCTRL Structure                                          */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  MEM_PRIO_REG;                 /*!< (@ 0x00000004) Priority Control Register                                  */\n  __IOM uint32_t  MEM_STALL_REG;                /*!< (@ 0x00000008) Maximum Stall cycles Control Register                      */\n  __IOM uint32_t  MEM_STATUS_REG;               /*!< (@ 0x0000000C) Memory Arbiter Status Register                             */\n  __IOM uint32_t  MEM_STATUS2_REG;              /*!< (@ 0x00000010) RAM cells Status Register                                  */\n  __IM  uint32_t  RESERVED1[3];\n  __IOM uint32_t  CMI_CODE_BASE_REG;            /*!< (@ 0x00000020) CMAC code Base Address Register                            */\n  __IOM uint32_t  CMI_DATA_BASE_REG;            /*!< (@ 0x00000024) CMAC data Base Address Register                            */\n  __IOM uint32_t  CMI_SHARED_BASE_REG;          /*!< (@ 0x00000028) CMAC shared data Base Address Register                     */\n  __IOM uint32_t  CMI_END_REG;                  /*!< (@ 0x0000002C) CMAC end Address Register                                  */\n  __IOM uint32_t  SNC_BASE_REG;                 /*!< (@ 0x00000030) Sensor Node Controller Base Address Register               */\n  __IM  uint32_t  RESERVED2[16];\n  __IOM uint32_t  BUSY_SET_REG;                 /*!< (@ 0x00000074) BSR Set Register                                           */\n  __IOM uint32_t  BUSY_RESET_REG;               /*!< (@ 0x00000078) BSR Reset Register                                         */\n  __IOM uint32_t  BUSY_STAT_REG;                /*!< (@ 0x0000007C) BSR Status Register                                        */\n} MEMCTRL_Type;                                 /*!< Size = 128 (0x80)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           OTPC                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief OTPC registers (OTPC)\n  */\n\ntypedef struct {                                /*!< (@ 0x30070000) OTPC Structure                                             */\n  __IOM uint32_t  OTPC_MODE_REG;                /*!< (@ 0x00000000) Mode register                                              */\n  __IOM uint32_t  OTPC_STAT_REG;                /*!< (@ 0x00000004) Status register                                            */\n  __IOM uint32_t  OTPC_PADDR_REG;               /*!< (@ 0x00000008) The address of the word that will be programmed,\n                                                                    when the PROG mode is used.                                */\n  __IOM uint32_t  OTPC_PWORD_REG;               /*!< (@ 0x0000000C) The 32-bit word that will be programmed, when\n                                                                    the PROG mode is used.                                     */\n  __IOM uint32_t  OTPC_TIM1_REG;                /*!< (@ 0x00000010) Various timing parameters of the OTP cell.                 */\n  __IOM uint32_t  OTPC_TIM2_REG;                /*!< (@ 0x00000014) Various timing parameters of the OTP cell.                 */\n} OTPC_Type;                                    /*!< Size = 24 (0x18)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            PDC                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief PDC registers (PDC)\n  */\n\ntypedef struct {                                /*!< (@ 0x50000200) PDC Structure                                              */\n  __IOM uint32_t  PDC_CTRL0_REG;                /*!< (@ 0x00000000) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL1_REG;                /*!< (@ 0x00000004) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL2_REG;                /*!< (@ 0x00000008) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL3_REG;                /*!< (@ 0x0000000C) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL4_REG;                /*!< (@ 0x00000010) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL5_REG;                /*!< (@ 0x00000014) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL6_REG;                /*!< (@ 0x00000018) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL7_REG;                /*!< (@ 0x0000001C) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL8_REG;                /*!< (@ 0x00000020) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL9_REG;                /*!< (@ 0x00000024) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL10_REG;               /*!< (@ 0x00000028) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL11_REG;               /*!< (@ 0x0000002C) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL12_REG;               /*!< (@ 0x00000030) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL13_REG;               /*!< (@ 0x00000034) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL14_REG;               /*!< (@ 0x00000038) PDC control register                                       */\n  __IOM uint32_t  PDC_CTRL15_REG;               /*!< (@ 0x0000003C) PDC control register                                       */\n  __IM  uint32_t  RESERVED[16];\n  __IOM uint32_t  PDC_ACKNOWLEDGE_REG;          /*!< (@ 0x00000080) Clear a pending PDC bit                                    */\n  __IOM uint32_t  PDC_PENDING_REG;              /*!< (@ 0x00000084) Shows any pending wakeup event                              */\n  __IOM uint32_t  PDC_PENDING_SNC_REG;          /*!< (@ 0x00000088) Shows any pending IRQ to SNC                               */\n  __IOM uint32_t  PDC_PENDING_CM33_REG;         /*!< (@ 0x0000008C) Shows any pending IRQ to CM33                              */\n  __IOM uint32_t  PDC_PENDING_CMAC_REG;         /*!< (@ 0x00000090) Shows any pending IRQ to CM33                              */\n  __IOM uint32_t  PDC_SET_PENDING_REG;          /*!< (@ 0x00000094) Set a pending PDC bit                                      */\n} PDC_Type;                                     /*!< Size = 152 (0x98)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          PWMLED                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief PWMLED registers (PWMLED)\n  */\n\ntypedef struct {                                /*!< (@ 0x50030500) PWMLED Structure                                           */\n  __IOM uint32_t  PWMLED_DUTY_CYCLE_LED1_REG;   /*!< (@ 0x00000000) Defines duty cycle for PWM1                                */\n  __IOM uint32_t  PWMLED_DUTY_CYCLE_LED2_REG;   /*!< (@ 0x00000004) Defines duty cycle for PWM2                                */\n  __IOM uint32_t  PWMLED_FREQUENCY_REG;         /*!< (@ 0x00000008) Defines the PWM frequecny                                  */\n  __IOM uint32_t  PWMLED_CTRL_REG;              /*!< (@ 0x0000000C) PWM Control register                                       */\n} PWMLED_Type;                                  /*!< Size = 16 (0x10)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           QSPIC                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief QSPIC registers (QSPIC)\n  */\n\ntypedef struct {                                /*!< (@ 0x38000000) QSPIC Structure                                            */\n  __IOM uint32_t  QSPIC_CTRLBUS_REG;            /*!< (@ 0x00000000) SPI Bus control register for the Manual mode               */\n  __IOM uint32_t  QSPIC_CTRLMODE_REG;           /*!< (@ 0x00000004) Mode Control register                                      */\n  __IOM uint32_t  QSPIC_RECVDATA_REG;           /*!< (@ 0x00000008) Received data for the Manual mode                          */\n  __IOM uint32_t  QSPIC_BURSTCMDA_REG;          /*!< (@ 0x0000000C) The way of reading in Auto mode (command register\n                                                                    A)                                                         */\n  __IOM uint32_t  QSPIC_BURSTCMDB_REG;          /*!< (@ 0x00000010) The way of reading in Auto mode (command register\n                                                                    B)                                                         */\n  __IOM uint32_t  QSPIC_STATUS_REG;             /*!< (@ 0x00000014) The status register of the QSPI controller                 */\n  __IOM uint32_t  QSPIC_WRITEDATA_REG;          /*!< (@ 0x00000018) Write data to SPI Bus for the Manual mode                  */\n  __IOM uint32_t  QSPIC_READDATA_REG;           /*!< (@ 0x0000001C) Read data from SPI Bus for the Manual mode                 */\n  __IOM uint32_t  QSPIC_DUMMYDATA_REG;          /*!< (@ 0x00000020) Send dummy clocks to SPI Bus for the Manual mode           */\n  __IOM uint32_t  QSPIC_ERASECTRL_REG;          /*!< (@ 0x00000024) QSPI Erase control register                                */\n  __IOM uint32_t  QSPIC_ERASECMDA_REG;          /*!< (@ 0x00000028) The way of erasing in Auto mode (command register\n                                                                    A)                                                         */\n  __IOM uint32_t  QSPIC_ERASECMDB_REG;          /*!< (@ 0x0000002C) The way of erasing in Auto mode (command register\n                                                                    B)                                                         */\n  __IOM uint32_t  QSPIC_BURSTBRK_REG;           /*!< (@ 0x00000030) Read break sequence in Auto mode                           */\n  __IOM uint32_t  QSPIC_STATUSCMD_REG;          /*!< (@ 0x00000034) The way of reading the status of external device\n                                                                    in Auto mode                                               */\n  __IOM uint32_t  QSPIC_CHCKERASE_REG;          /*!< (@ 0x00000038) Check erase progress in Auto mode                          */\n  __IOM uint32_t  QSPIC_GP_REG;                 /*!< (@ 0x0000003C) QSPI General Purpose control register                      */\n  __IOM uint32_t  QSPIC_UCODE_START;            /*!< (@ 0x00000040) QSPIC uCode memory                                         */\n  __IM  uint32_t  RESERVED[15];\n  __IOM uint32_t  QSPIC_CTR_CTRL_REG;           /*!< (@ 0x00000080) Control register for the decryption engine of\n                                                                    the QSPIC                                                  */\n  __IOM uint32_t  QSPIC_CTR_SADDR_REG;          /*!< (@ 0x00000084) Start address of the encrypted content in the\n                                                                    QSPI flash                                                 */\n  __IOM uint32_t  QSPIC_CTR_EADDR_REG;          /*!< (@ 0x00000088) End address of the encrypted content in the QSPI\n                                                                    flash                                                      */\n  __IOM uint32_t  QSPIC_CTR_NONCE_0_3_REG;      /*!< (@ 0x0000008C) Nonce bytes 0 to 3 for the AES-CTR algorithm               */\n  __IOM uint32_t  QSPIC_CTR_NONCE_4_7_REG;      /*!< (@ 0x00000090) Nonce bytes 4 to 7 for the AES-CTR algorithm               */\n  __IOM uint32_t  QSPIC_CTR_KEY_0_3_REG;        /*!< (@ 0x00000094) Key bytes 0 to 3 for the AES-CTR algorithm                 */\n  __IOM uint32_t  QSPIC_CTR_KEY_4_7_REG;        /*!< (@ 0x00000098) Key bytes 4 to 7 for the AES-CTR algorithm                 */\n  __IOM uint32_t  QSPIC_CTR_KEY_8_11_REG;       /*!< (@ 0x0000009C) Key bytes 8 to 11 for the AES-CTR algorithm                */\n  __IOM uint32_t  QSPIC_CTR_KEY_12_15_REG;      /*!< (@ 0x000000A0) Key bytes 12 to 15 for the AES-CTR algorithm               */\n  __IOM uint32_t  QSPIC_CTR_KEY_16_19_REG;      /*!< (@ 0x000000A4) Key bytes 16 to 19 for the AES-CTR algorithm               */\n  __IOM uint32_t  QSPIC_CTR_KEY_20_23_REG;      /*!< (@ 0x000000A8) Key bytes 20 to 23 for the AES-CTR algorithm               */\n  __IOM uint32_t  QSPIC_CTR_KEY_24_27_REG;      /*!< (@ 0x000000AC) Key bytes 24 to 27 for the AES-CTR algorithm               */\n  __IOM uint32_t  QSPIC_CTR_KEY_28_31_REG;      /*!< (@ 0x000000B0) Key bytes 28 to 31 for the AES-CTR algorithm               */\n} QSPIC_Type;                                   /*!< Size = 180 (0xb4)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          QSPIC2                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief QSPIC2 registers (QSPIC2)\n  */\n\ntypedef struct {                                /*!< (@ 0x34000000) QSPIC2 Structure                                           */\n  __IOM uint32_t  QSPIC2_CTRLBUS_REG;           /*!< (@ 0x00000000) SPI Bus control register for the Manual mode               */\n  __IOM uint32_t  QSPIC2_CTRLMODE_REG;          /*!< (@ 0x00000004) Mode control register                                      */\n  __IOM uint32_t  QSPIC2_RECVDATA_REG;          /*!< (@ 0x00000008) Received data for the Manual mode                          */\n  __IOM uint32_t  QSPIC2_BURSTCMDA_REG;         /*!< (@ 0x0000000C) The way of reading in Auto mode (command register\n                                                                    A)                                                         */\n  __IOM uint32_t  QSPIC2_BURSTCMDB_REG;         /*!< (@ 0x00000010) The way of reading in Auto mode (command register\n                                                                    B)                                                         */\n  __IOM uint32_t  QSPIC2_STATUS_REG;            /*!< (@ 0x00000014) The status register of the QSPI controller                 */\n  __IOM uint32_t  QSPIC2_WRITEDATA_REG;         /*!< (@ 0x00000018) Write data to SPI Bus for the Manual mode                  */\n  __IOM uint32_t  QSPIC2_READDATA_REG;          /*!< (@ 0x0000001C) Read data from SPI Bus for the Manual mode                 */\n  __IOM uint32_t  QSPIC2_DUMMYDATA_REG;         /*!< (@ 0x00000020) Send dummy clocks to SPI Bus for the Manual mode           */\n  __IOM uint32_t  QSPIC2_ERASECTRL_REG;         /*!< (@ 0x00000024) Erase control register                                     */\n  __IOM uint32_t  QSPIC2_ERASECMDA_REG;         /*!< (@ 0x00000028) The way of erasing in Auto mode (command register\n                                                                    A)                                                         */\n  __IOM uint32_t  QSPIC2_ERASECMDB_REG;         /*!< (@ 0x0000002C) The way of erasing in Auto mode (command register\n                                                                    B)                                                         */\n  __IOM uint32_t  QSPIC2_BURSTBRK_REG;          /*!< (@ 0x00000030) Read break sequence in Auto mode                           */\n  __IOM uint32_t  QSPIC2_STATUSCMD_REG;         /*!< (@ 0x00000034) The way of reading the status of external device\n                                                                    in Auto mode                                               */\n  __IOM uint32_t  QSPIC2_CHCKERASE_REG;         /*!< (@ 0x00000038) Check erase progress in Auto mode                          */\n  __IOM uint32_t  QSPIC2_GP_REG;                /*!< (@ 0x0000003C) General purpose QSPIC2 register                            */\n  __IOM uint32_t  QSPIC2_AWRITECMD_REG;         /*!< (@ 0x00000040) The way of writing in Auto mode when the external\n                                                                    device is a serial SRAM                                    */\n  __IOM uint32_t  QSPIC2_MEMBLEN_REG;           /*!< (@ 0x00000044) External memory burst length configuration                 */\n} QSPIC2_Type;                                  /*!< Size = 72 (0x48)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           RFMON                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief RFMON registers (RFMON)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040600) RFMON Structure                                            */\n  __IOM uint32_t  RFMON_CTRL_REG;               /*!< (@ 0x00000000) Control register                                           */\n  __IOM uint32_t  RFMON_ADDR_REG;               /*!< (@ 0x00000004) AHB master start address                                   */\n  __IOM uint32_t  RFMON_LEN_REG;                /*!< (@ 0x00000008) Data length register                                       */\n  __IOM uint32_t  RFMON_STAT_REG;               /*!< (@ 0x0000000C) Status register                                            */\n  __IOM uint32_t  RFMON_CRV_ADDR_REG;           /*!< (@ 0x00000010) AHB master current address                                 */\n  __IOM uint32_t  RFMON_CRV_LEN_REG;            /*!< (@ 0x00000014) The remaining data to be transferred                       */\n} RFMON_Type;                                   /*!< Size = 24 (0x18)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            RTC                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief RTC registers (RTC)\n  */\n\ntypedef struct {                                /*!< (@ 0x50000400) RTC Structure                                              */\n  __IOM uint32_t  RTC_CONTROL_REG;              /*!< (@ 0x00000000) RTC Control Register                                       */\n  __IOM uint32_t  RTC_HOUR_MODE_REG;            /*!< (@ 0x00000004) RTC Hour Mode Register                                     */\n  __IOM uint32_t  RTC_TIME_REG;                 /*!< (@ 0x00000008) RTC Time Register                                          */\n  __IOM uint32_t  RTC_CALENDAR_REG;             /*!< (@ 0x0000000C) RTC Calendar Register                                      */\n  __IOM uint32_t  RTC_TIME_ALARM_REG;           /*!< (@ 0x00000010) RTC Time Alarm Register                                    */\n  __IOM uint32_t  RTC_CALENDAR_ALARM_REG;       /*!< (@ 0x00000014) RTC Calendar Alram Register                                */\n  __IOM uint32_t  RTC_ALARM_ENABLE_REG;         /*!< (@ 0x00000018) RTC Alarm Enable Register                                  */\n  __IOM uint32_t  RTC_EVENT_FLAGS_REG;          /*!< (@ 0x0000001C) RTC Event Flags Register                                   */\n  __IOM uint32_t  RTC_INTERRUPT_ENABLE_REG;     /*!< (@ 0x00000020) RTC Interrupt Enable Register                              */\n  __IOM uint32_t  RTC_INTERRUPT_DISABLE_REG;    /*!< (@ 0x00000024) RTC Interrupt Disable Register                             */\n  __IOM uint32_t  RTC_INTERRUPT_MASK_REG;       /*!< (@ 0x00000028) RTC Interrupt Mask Register                                */\n  __IOM uint32_t  RTC_STATUS_REG;               /*!< (@ 0x0000002C) RTC Status Register                                        */\n  __IOM uint32_t  RTC_KEEP_RTC_REG;             /*!< (@ 0x00000030) RTC Keep RTC Register                                      */\n  __IM  uint32_t  RESERVED[19];\n  __IOM uint32_t  RTC_EVENT_CTRL_REG;           /*!< (@ 0x00000080) RTC Event Control Register                                 */\n  __IOM uint32_t  RTC_MOTOR_EVENT_PERIOD_REG;   /*!< (@ 0x00000084) RTC Motor Event Period Register                            */\n  __IOM uint32_t  RTC_PDC_EVENT_PERIOD_REG;     /*!< (@ 0x00000088) RTC PDC Event Period Register                              */\n  __IOM uint32_t  RTC_PDC_EVENT_CLEAR_REG;      /*!< (@ 0x0000008C) RTC PDC Event Clear Register                               */\n  __IOM uint32_t  RTC_MOTOR_EVENT_CNT_REG;      /*!< (@ 0x00000090) RTC Motor Event Counter Register                           */\n  __IOM uint32_t  RTC_PDC_EVENT_CNT_REG;        /*!< (@ 0x00000094) RTC PDC Event Counter Register                             */\n} RTC_Type;                                     /*!< Size = 152 (0x98)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           SDADC                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief SDADC registers (SDADC)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020800) SDADC Structure                                            */\n  __IOM uint32_t  SDADC_CTRL_REG;               /*!< (@ 0x00000000) Sigma Delta ADC Control Register                           */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  SDADC_TEST_REG;               /*!< (@ 0x00000008) Sigma Delta ADC Test Register                              */\n  __IOM uint32_t  SDADC_GAIN_CORR_REG;          /*!< (@ 0x0000000C) Sigma Delta ADC Gain Correction Register                   */\n  __IOM uint32_t  SDADC_OFFS_CORR_REG;          /*!< (@ 0x00000010) Sigma Delta ADC Offset Correction Register                 */\n  __IOM uint32_t  SDADC_CLEAR_INT_REG;          /*!< (@ 0x00000014) Sigma Delta ADC Clear Interrupt Register                   */\n  __IOM uint32_t  SDADC_RESULT_REG;             /*!< (@ 0x00000018) Sigma Delta ADC Result Register                            */\n} SDADC_Type;                                   /*!< Size = 28 (0x1c)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          SMOTOR                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief SMOTOR registers (SMOTOR)\n  */\n\ntypedef struct {                                /*!< (@ 0x50030E00) SMOTOR Structure                                           */\n  __IOM uint32_t  SMOTOR_CTRL_REG;              /*!< (@ 0x00000000) Motor control register                                     */\n  __IOM uint32_t  PG0_CTRL_REG;                 /*!< (@ 0x00000004) Pattern generator 0 control register                       */\n  __IOM uint32_t  PG1_CTRL_REG;                 /*!< (@ 0x00000008) Pattern generator 1 control register                       */\n  __IOM uint32_t  PG2_CTRL_REG;                 /*!< (@ 0x0000000C) Pattern generator 2 control register                       */\n  __IOM uint32_t  PG3_CTRL_REG;                 /*!< (@ 0x00000010) Pattern generator 3 control register                       */\n  __IOM uint32_t  PG4_CTRL_REG;                 /*!< (@ 0x00000014) Pattern generator 4 control register                       */\n  __IOM uint32_t  SMOTOR_TRIGGER_REG;           /*!< (@ 0x00000018) Motor controller trigger register                          */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  SMOTOR_CMD_FIFO_REG;          /*!< (@ 0x00000020) Motor control command FIFO register                        */\n  __IOM uint32_t  SMOTOR_CMD_READ_PTR_REG;      /*!< (@ 0x00000024) Command read pointer register                              */\n  __IOM uint32_t  SMOTOR_CMD_WRITE_PTR_REG;     /*!< (@ 0x00000028) Command write pointer register                             */\n  __IOM uint32_t  SMOTOR_STATUS_REG;            /*!< (@ 0x0000002C) Motor controller status register                           */\n  __IOM uint32_t  SMOTOR_IRQ_CLEAR_REG;         /*!< (@ 0x00000030) Motor control IRQ clear register                           */\n  __IM  uint32_t  RESERVED1[3];\n  __IOM uint32_t  WAVETABLE_BASE;               /*!< (@ 0x00000040) Base address of the wavetable                              */\n  __IM  uint32_t  RESERVED2[15];\n  __IOM uint32_t  CMD_TABLE_BASE;               /*!< (@ 0x00000080) Base address of the command table                          */\n} SMOTOR_Type;                                  /*!< Size = 132 (0x84)                                                         */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            SNC                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief SNC registers (SNC)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020C00) SNC Structure                                              */\n  __IOM uint32_t  SNC_CTRL_REG;                 /*!< (@ 0x00000000) Sensor Node Control Register                               */\n  __IOM uint32_t  SNC_STATUS_REG;               /*!< (@ 0x00000004) Sensor Node Status Register                                */\n  __IOM uint32_t  SNC_LP_TIMER_REG;             /*!< (@ 0x00000008) Sensor Node Low-Power Timer Register                       */\n  __IOM uint32_t  SNC_PC_REG;                   /*!< (@ 0x0000000C) Sensor Node Program Counter                                */\n  __IOM uint32_t  SNC_R1_REG;                   /*!< (@ 0x00000010) Sensor Node core - Operand 1 Register                      */\n  __IOM uint32_t  SNC_R2_REG;                   /*!< (@ 0x00000014) Sensor Node core - Operand 2 Register                      */\n  __IOM uint32_t  SNC_TMP1_REG;                 /*!< (@ 0x00000018) Sensor Node core - Temporary Register 1                    */\n  __IOM uint32_t  SNC_TMP2_REG;                 /*!< (@ 0x0000001C) Sensor Node core - Temporary Register 2                    */\n} SNC_Type;                                     /*!< Size = 32 (0x20)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            SPI                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief SPI registers (SPI)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020300) SPI Structure                                              */\n  __IOM uint32_t  SPI_CTRL_REG;                 /*!< (@ 0x00000000) SPI control register 0                                     */\n  __IOM uint32_t  SPI_RX_TX_REG;                /*!< (@ 0x00000004) SPI RX/TX register0                                        */\n  __IOM uint32_t  SPI_CLEAR_INT_REG;            /*!< (@ 0x00000008) SPI clear interrupt register                               */\n} SPI_Type;                                     /*!< Size = 12 (0xc)                                                           */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           SPI2                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief SPI2 registers (SPI2)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020400) SPI2 Structure                                             */\n  __IOM uint32_t  SPI2_CTRL_REG;                /*!< (@ 0x00000000) SPI control register 0                                     */\n  __IOM uint32_t  SPI2_RX_TX_REG;               /*!< (@ 0x00000004) SPI RX/TX register0                                        */\n  __IOM uint32_t  SPI2_CLEAR_INT_REG;           /*!< (@ 0x00000008) SPI clear interrupt register                               */\n} SPI2_Type;                                    /*!< Size = 12 (0xc)                                                           */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                         SYS_WDOG                                          ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief SYS_WDOG registers (SYS_WDOG)\n  */\n\ntypedef struct {                                /*!< (@ 0x50000700) SYS_WDOG Structure                                         */\n  __IOM uint32_t  WATCHDOG_REG;                 /*!< (@ 0x00000000) Watchdog timer register.                                   */\n  __IOM uint32_t  WATCHDOG_CTRL_REG;            /*!< (@ 0x00000004) Watchdog control register.                                 */\n} SYS_WDOG_Type;                                /*!< Size = 8 (0x8)                                                            */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           TIMER                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief TIMER registers (TIMER)\n  */\n\ntypedef struct {                                /*!< (@ 0x50010200) TIMER Structure                                            */\n  __IOM uint32_t  TIMER_CTRL_REG;               /*!< (@ 0x00000000) Timer control register                                     */\n  __IOM uint32_t  TIMER_TIMER_VAL_REG;          /*!< (@ 0x00000004) Timer counter value                                        */\n  __IOM uint32_t  TIMER_STATUS_REG;             /*!< (@ 0x00000008) Timer status register                                      */\n  __IOM uint32_t  TIMER_GPIO1_CONF_REG;         /*!< (@ 0x0000000C) Timer gpio1 selection                                      */\n  __IOM uint32_t  TIMER_GPIO2_CONF_REG;         /*!< (@ 0x00000010) Timer gpio2 selection                                      */\n  __IOM uint32_t  TIMER_RELOAD_REG;             /*!< (@ 0x00000014) Timer reload value and Delay in shot mode                  */\n  __IOM uint32_t  TIMER_SHOTWIDTH_REG;          /*!< (@ 0x00000018) Timer Shot duration in shot mode                           */\n  __IOM uint32_t  TIMER_PRESCALER_REG;          /*!< (@ 0x0000001C) Timer prescaler value                                      */\n  __IOM uint32_t  TIMER_CAPTURE_GPIO1_REG;      /*!< (@ 0x00000020) Timer value for event on GPIO1                             */\n  __IOM uint32_t  TIMER_CAPTURE_GPIO2_REG;      /*!< (@ 0x00000024) Timer value for event on GPIO2                             */\n  __IOM uint32_t  TIMER_PRESCALER_VAL_REG;      /*!< (@ 0x00000028) Timer prescaler counter valuew                             */\n  __IOM uint32_t  TIMER_PWM_FREQ_REG;           /*!< (@ 0x0000002C) Timer pwm frequency register                               */\n  __IOM uint32_t  TIMER_PWM_DC_REG;             /*!< (@ 0x00000030) Timer pwm dc register                                      */\n  __IOM uint32_t  TIMER_GPIO3_CONF_REG;         /*!< (@ 0x00000034) Timer gpio3 selection                                      */\n  __IOM uint32_t  TIMER_GPIO4_CONF_REG;         /*!< (@ 0x00000038) Timer gpio4 selection                                      */\n  __IOM uint32_t  TIMER_CAPTURE_GPIO3_REG;      /*!< (@ 0x0000003C) Timer value for event on GPIO1                             */\n  __IOM uint32_t  TIMER_CAPTURE_GPIO4_REG;      /*!< (@ 0x00000040) Timer value for event on GPIO1                             */\n  __IOM uint32_t  TIMER_CLEAR_GPIO_EVENT_REG;   /*!< (@ 0x00000044) Timer clear gpio event register                            */\n  __IOM uint32_t  TIMER_CLEAR_IRQ_REG;          /*!< (@ 0x00000048) Timer clear interrupt                                      */\n} TIMER_Type;                                   /*!< Size = 76 (0x4c)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          TIMER2                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief TIMER2 registers (TIMER2)\n  */\n\ntypedef struct {                                /*!< (@ 0x50010300) TIMER2 Structure                                           */\n  __IOM uint32_t  TIMER2_CTRL_REG;              /*!< (@ 0x00000000) Timer control register                                     */\n  __IOM uint32_t  TIMER2_TIMER_VAL_REG;         /*!< (@ 0x00000004) Timer counter value                                        */\n  __IOM uint32_t  TIMER2_STATUS_REG;            /*!< (@ 0x00000008) Timer status register                                      */\n  __IOM uint32_t  TIMER2_GPIO1_CONF_REG;        /*!< (@ 0x0000000C) Timer gpio1 selection                                      */\n  __IOM uint32_t  TIMER2_GPIO2_CONF_REG;        /*!< (@ 0x00000010) Timer gpio2 selection                                      */\n  __IOM uint32_t  TIMER2_RELOAD_REG;            /*!< (@ 0x00000014) Timer reload value and Delay in shot mode                  */\n  __IOM uint32_t  TIMER2_SHOTWIDTH_REG;         /*!< (@ 0x00000018) Timer Shot duration in shot mode                           */\n  __IOM uint32_t  TIMER2_PRESCALER_REG;         /*!< (@ 0x0000001C) Timer prescaler value                                      */\n  __IOM uint32_t  TIMER2_CAPTURE_GPIO1_REG;     /*!< (@ 0x00000020) Timer value for event on GPIO1                             */\n  __IOM uint32_t  TIMER2_CAPTURE_GPIO2_REG;     /*!< (@ 0x00000024) Timer value for event on GPIO2                             */\n  __IOM uint32_t  TIMER2_PRESCALER_VAL_REG;     /*!< (@ 0x00000028) Timer prescaler counter valuew                             */\n  __IOM uint32_t  TIMER2_PWM_FREQ_REG;          /*!< (@ 0x0000002C) Timer pwm frequency register                               */\n  __IOM uint32_t  TIMER2_PWM_DC_REG;            /*!< (@ 0x00000030) Timer pwm dc register                                      */\n  __IOM uint32_t  TIMER2_CLEAR_IRQ_REG;         /*!< (@ 0x00000034) Timer clear interrupt                                      */\n} TIMER2_Type;                                  /*!< Size = 56 (0x38)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          TIMER3                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief TIMER3 registers (TIMER3)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040A00) TIMER3 Structure                                           */\n  __IOM uint32_t  TIMER3_CTRL_REG;              /*!< (@ 0x00000000) Timer control register                                     */\n  __IOM uint32_t  TIMER3_TIMER_VAL_REG;         /*!< (@ 0x00000004) Timer counter value                                        */\n  __IOM uint32_t  TIMER3_STATUS_REG;            /*!< (@ 0x00000008) Timer status register                                      */\n  __IOM uint32_t  TIMER3_GPIO1_CONF_REG;        /*!< (@ 0x0000000C) Timer gpio1 selection                                      */\n  __IOM uint32_t  TIMER3_GPIO2_CONF_REG;        /*!< (@ 0x00000010) Timer gpio2 selection                                      */\n  __IOM uint32_t  TIMER3_RELOAD_REG;            /*!< (@ 0x00000014) Timer reload value and Delay in shot mode                  */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  TIMER3_PRESCALER_REG;         /*!< (@ 0x0000001C) Timer prescaler value                                      */\n  __IOM uint32_t  TIMER3_CAPTURE_GPIO1_REG;     /*!< (@ 0x00000020) Timer value for event on GPIO1                             */\n  __IOM uint32_t  TIMER3_CAPTURE_GPIO2_REG;     /*!< (@ 0x00000024) Timer value for event on GPIO2                             */\n  __IOM uint32_t  TIMER3_PRESCALER_VAL_REG;     /*!< (@ 0x00000028) Timer prescaler counter valuew                             */\n  __IOM uint32_t  TIMER3_PWM_FREQ_REG;          /*!< (@ 0x0000002C) Timer pwm frequency register                               */\n  __IOM uint32_t  TIMER3_PWM_DC_REG;            /*!< (@ 0x00000030) Timer pwm dc register                                      */\n  __IOM uint32_t  TIMER3_CLEAR_IRQ_REG;         /*!< (@ 0x00000034) Timer clear interrupt                                      */\n} TIMER3_Type;                                  /*!< Size = 56 (0x38)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          TIMER4                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief TIMER4 registers (TIMER4)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040B00) TIMER4 Structure                                           */\n  __IOM uint32_t  TIMER4_CTRL_REG;              /*!< (@ 0x00000000) Timer control register                                     */\n  __IOM uint32_t  TIMER4_TIMER_VAL_REG;         /*!< (@ 0x00000004) Timer counter value                                        */\n  __IOM uint32_t  TIMER4_STATUS_REG;            /*!< (@ 0x00000008) Timer status register                                      */\n  __IOM uint32_t  TIMER4_GPIO1_CONF_REG;        /*!< (@ 0x0000000C) Timer gpio1 selection                                      */\n  __IOM uint32_t  TIMER4_GPIO2_CONF_REG;        /*!< (@ 0x00000010) Timer gpio2 selection                                      */\n  __IOM uint32_t  TIMER4_RELOAD_REG;            /*!< (@ 0x00000014) Timer reload value and Delay in shot mode                  */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  TIMER4_PRESCALER_REG;         /*!< (@ 0x0000001C) Timer prescaler value                                      */\n  __IOM uint32_t  TIMER4_CAPTURE_GPIO1_REG;     /*!< (@ 0x00000020) Timer value for event on GPIO1                             */\n  __IOM uint32_t  TIMER4_CAPTURE_GPIO2_REG;     /*!< (@ 0x00000024) Timer value for event on GPIO2                             */\n  __IOM uint32_t  TIMER4_PRESCALER_VAL_REG;     /*!< (@ 0x00000028) Timer prescaler counter valuew                             */\n  __IOM uint32_t  TIMER4_PWM_FREQ_REG;          /*!< (@ 0x0000002C) Timer pwm frequency register                               */\n  __IOM uint32_t  TIMER4_PWM_DC_REG;            /*!< (@ 0x00000030) Timer pwm dc register                                      */\n  __IOM uint32_t  TIMER4_CLEAR_IRQ_REG;         /*!< (@ 0x00000034) Timer clear interrupt                                      */\n} TIMER4_Type;                                  /*!< Size = 56 (0x38)                                                          */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           TRNG                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief TRNG registers (TRNG)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040C00) TRNG Structure                                             */\n  __IOM uint32_t  TRNG_CTRL_REG;                /*!< (@ 0x00000000) TRNG control register                                      */\n  __IOM uint32_t  TRNG_FIFOLVL_REG;             /*!< (@ 0x00000004) TRNG FIFO level register                                   */\n  __IOM uint32_t  TRNG_VER_REG;                 /*!< (@ 0x00000008) TRNG Version register                                      */\n} TRNG_Type;                                    /*!< Size = 12 (0xc)                                                           */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           UART                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief UART registers (UART)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020000) UART Structure                                             */\n  __IOM uint32_t  UART_RBR_THR_DLL_REG;         /*!< (@ 0x00000000) Receive Buffer Register                                    */\n  __IOM uint32_t  UART_IER_DLH_REG;             /*!< (@ 0x00000004) Interrupt Enable Register                                  */\n  __IOM uint32_t  UART_IIR_FCR_REG;             /*!< (@ 0x00000008) Interrupt Identification Register/FIFO Control\n                                                                    Register                                                   */\n  __IOM uint32_t  UART_LCR_REG;                 /*!< (@ 0x0000000C) Line Control Register                                      */\n  __IOM uint32_t  UART_MCR_REG;                 /*!< (@ 0x00000010) Modem Control Register                                     */\n  __IOM uint32_t  UART_LSR_REG;                 /*!< (@ 0x00000014) Line Status Register                                       */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  UART_SCR_REG;                 /*!< (@ 0x0000001C) Scratchpad Register                                        */\n  __IM  uint32_t  RESERVED1[4];\n  __IOM uint32_t  UART_SRBR_STHR0_REG;          /*!< (@ 0x00000030) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR1_REG;          /*!< (@ 0x00000034) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR2_REG;          /*!< (@ 0x00000038) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR3_REG;          /*!< (@ 0x0000003C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR4_REG;          /*!< (@ 0x00000040) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR5_REG;          /*!< (@ 0x00000044) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR6_REG;          /*!< (@ 0x00000048) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR7_REG;          /*!< (@ 0x0000004C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR8_REG;          /*!< (@ 0x00000050) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR9_REG;          /*!< (@ 0x00000054) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR10_REG;         /*!< (@ 0x00000058) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR11_REG;         /*!< (@ 0x0000005C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR12_REG;         /*!< (@ 0x00000060) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR13_REG;         /*!< (@ 0x00000064) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR14_REG;         /*!< (@ 0x00000068) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART_SRBR_STHR15_REG;         /*!< (@ 0x0000006C) Shadow Receive/Transmit Buffer Register                    */\n  __IM  uint32_t  RESERVED2[3];\n  __IOM uint32_t  UART_USR_REG;                 /*!< (@ 0x0000007C) UART Status register.                                      */\n  __IOM uint32_t  UART_TFL_REG;                 /*!< (@ 0x00000080) Transmit FIFO Level                                        */\n  __IOM uint32_t  UART_RFL_REG;                 /*!< (@ 0x00000084) Receive FIFO Level.                                        */\n  __IOM uint32_t  UART_SRR_REG;                 /*!< (@ 0x00000088) Software Reset Register.                                   */\n  __IM  uint32_t  RESERVED3;\n  __IOM uint32_t  UART_SBCR_REG;                /*!< (@ 0x00000090) Shadow Break Control Register                              */\n  __IOM uint32_t  UART_SDMAM_REG;               /*!< (@ 0x00000094) Shadow DMA Mode                                            */\n  __IOM uint32_t  UART_SFE_REG;                 /*!< (@ 0x00000098) Shadow FIFO Enable                                         */\n  __IOM uint32_t  UART_SRT_REG;                 /*!< (@ 0x0000009C) Shadow RCVR Trigger                                        */\n  __IOM uint32_t  UART_STET_REG;                /*!< (@ 0x000000A0) Shadow TX Empty Trigger                                    */\n  __IOM uint32_t  UART_HTX_REG;                 /*!< (@ 0x000000A4) Halt TX                                                    */\n  __IOM uint32_t  UART_DMASA_REG;               /*!< (@ 0x000000A8) DMA Software Acknowledge                                   */\n  __IM  uint32_t  RESERVED4[5];\n  __IOM uint32_t  UART_DLF_REG;                 /*!< (@ 0x000000C0) Divisor Latch Fraction Register                            */\n  __IM  uint32_t  RESERVED5[13];\n  __IOM uint32_t  UART_UCV_REG;                 /*!< (@ 0x000000F8) Component Version                                          */\n  __IOM uint32_t  UART_CTR_REG;                 /*!< (@ 0x000000FC) Component Type Register                                    */\n} UART_Type;                                    /*!< Size = 256 (0x100)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           UART2                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief UART2 registers (UART2)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020100) UART2 Structure                                            */\n  __IOM uint32_t  UART2_RBR_THR_DLL_REG;        /*!< (@ 0x00000000) Receive Buffer Register                                    */\n  __IOM uint32_t  UART2_IER_DLH_REG;            /*!< (@ 0x00000004) Interrupt Enable Register                                  */\n  __IOM uint32_t  UART2_IIR_FCR_REG;            /*!< (@ 0x00000008) Interrupt Identification Register/FIFO Control\n                                                                    Register                                                   */\n  __IOM uint32_t  UART2_LCR_REG;                /*!< (@ 0x0000000C) Line Control Register                                      */\n  __IOM uint32_t  UART2_MCR_REG;                /*!< (@ 0x00000010) Modem Control Register                                     */\n  __IOM uint32_t  UART2_LSR_REG;                /*!< (@ 0x00000014) Line Status Register                                       */\n  __IOM uint32_t  UART2_MSR_REG;                /*!< (@ 0x00000018) Modem Status Register                                      */\n  __IOM uint32_t  UART2_SCR_REG;                /*!< (@ 0x0000001C) Scratchpad Register                                        */\n  __IM  uint32_t  RESERVED[4];\n  __IOM uint32_t  UART2_SRBR_STHR0_REG;         /*!< (@ 0x00000030) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR1_REG;         /*!< (@ 0x00000034) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR2_REG;         /*!< (@ 0x00000038) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR3_REG;         /*!< (@ 0x0000003C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR4_REG;         /*!< (@ 0x00000040) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR5_REG;         /*!< (@ 0x00000044) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR6_REG;         /*!< (@ 0x00000048) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR7_REG;         /*!< (@ 0x0000004C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR8_REG;         /*!< (@ 0x00000050) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR9_REG;         /*!< (@ 0x00000054) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR10_REG;        /*!< (@ 0x00000058) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR11_REG;        /*!< (@ 0x0000005C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR12_REG;        /*!< (@ 0x00000060) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR13_REG;        /*!< (@ 0x00000064) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR14_REG;        /*!< (@ 0x00000068) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART2_SRBR_STHR15_REG;        /*!< (@ 0x0000006C) Shadow Receive/Transmit Buffer Register                    */\n  __IM  uint32_t  RESERVED1[3];\n  __IOM uint32_t  UART2_USR_REG;                /*!< (@ 0x0000007C) UART Status register.                                      */\n  __IOM uint32_t  UART2_TFL_REG;                /*!< (@ 0x00000080) Transmit FIFO Level                                        */\n  __IOM uint32_t  UART2_RFL_REG;                /*!< (@ 0x00000084) Receive FIFO Level.                                        */\n  __IOM uint32_t  UART2_SRR_REG;                /*!< (@ 0x00000088) Software Reset Register.                                   */\n  __IOM uint32_t  UART2_SRTS_REG;               /*!< (@ 0x0000008C) Shadow Request to Send                                     */\n  __IOM uint32_t  UART2_SBCR_REG;               /*!< (@ 0x00000090) Shadow Break Control Register                              */\n  __IOM uint32_t  UART2_SDMAM_REG;              /*!< (@ 0x00000094) Shadow DMA Mode                                            */\n  __IOM uint32_t  UART2_SFE_REG;                /*!< (@ 0x00000098) Shadow FIFO Enable                                         */\n  __IOM uint32_t  UART2_SRT_REG;                /*!< (@ 0x0000009C) Shadow RCVR Trigger                                        */\n  __IOM uint32_t  UART2_STET_REG;               /*!< (@ 0x000000A0) Shadow TX Empty Trigger                                    */\n  __IOM uint32_t  UART2_HTX_REG;                /*!< (@ 0x000000A4) Halt TX                                                    */\n  __IOM uint32_t  UART2_DMASA_REG;              /*!< (@ 0x000000A8) DMA Software Acknowledge                                   */\n  __IM  uint32_t  RESERVED2[5];\n  __IOM uint32_t  UART2_DLF_REG;                /*!< (@ 0x000000C0) Divisor Latch Fraction Register                            */\n  __IOM uint32_t  UART2_RAR_REG;                /*!< (@ 0x000000C4) Receive Address Register                                   */\n  __IOM uint32_t  UART2_TAR_REG;                /*!< (@ 0x000000C8) Transmit Address Register                                  */\n  __IOM uint32_t  UART2_LCR_EXT;                /*!< (@ 0x000000CC) Line Extended Control Register                             */\n  __IM  uint32_t  RESERVED3[10];\n  __IOM uint32_t  UART2_UCV_REG;                /*!< (@ 0x000000F8) Component Version                                          */\n  __IOM uint32_t  UART2_CTR_REG;                /*!< (@ 0x000000FC) Component Type Register                                    */\n} UART2_Type;                                   /*!< Size = 256 (0x100)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                           UART3                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief UART3 registers (UART3)\n  */\n\ntypedef struct {                                /*!< (@ 0x50020200) UART3 Structure                                            */\n  __IOM uint32_t  UART3_RBR_THR_DLL_REG;        /*!< (@ 0x00000000) Receive Buffer Register                                    */\n  __IOM uint32_t  UART3_IER_DLH_REG;            /*!< (@ 0x00000004) Interrupt Enable Register                                  */\n  __IOM uint32_t  UART3_IIR_FCR_REG;            /*!< (@ 0x00000008) Interrupt Identification Register/FIFO Control\n                                                                    Register                                                   */\n  __IOM uint32_t  UART3_LCR_REG;                /*!< (@ 0x0000000C) Line Control Register                                      */\n  __IOM uint32_t  UART3_MCR_REG;                /*!< (@ 0x00000010) Modem Control Register                                     */\n  __IOM uint32_t  UART3_LSR_REG;                /*!< (@ 0x00000014) Line Status Register                                       */\n  __IOM uint32_t  UART3_MSR_REG;                /*!< (@ 0x00000018) Modem Status Register                                      */\n  __IOM uint32_t  UART3_CONFIG_REG;             /*!< (@ 0x0000001C) ISO7816 Config Register                                    */\n  __IM  uint32_t  RESERVED[4];\n  __IOM uint32_t  UART3_SRBR_STHR0_REG;         /*!< (@ 0x00000030) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR1_REG;         /*!< (@ 0x00000034) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR2_REG;         /*!< (@ 0x00000038) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR3_REG;         /*!< (@ 0x0000003C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR4_REG;         /*!< (@ 0x00000040) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR5_REG;         /*!< (@ 0x00000044) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR6_REG;         /*!< (@ 0x00000048) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR7_REG;         /*!< (@ 0x0000004C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR8_REG;         /*!< (@ 0x00000050) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR9_REG;         /*!< (@ 0x00000054) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR10_REG;        /*!< (@ 0x00000058) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR11_REG;        /*!< (@ 0x0000005C) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR12_REG;        /*!< (@ 0x00000060) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR13_REG;        /*!< (@ 0x00000064) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR14_REG;        /*!< (@ 0x00000068) Shadow Receive/Transmit Buffer Register                    */\n  __IOM uint32_t  UART3_SRBR_STHR15_REG;        /*!< (@ 0x0000006C) Shadow Receive/Transmit Buffer Register                    */\n  __IM  uint32_t  RESERVED1[3];\n  __IOM uint32_t  UART3_USR_REG;                /*!< (@ 0x0000007C) UART Status register.                                      */\n  __IOM uint32_t  UART3_TFL_REG;                /*!< (@ 0x00000080) Transmit FIFO Level                                        */\n  __IOM uint32_t  UART3_RFL_REG;                /*!< (@ 0x00000084) Receive FIFO Level.                                        */\n  __IOM uint32_t  UART3_SRR_REG;                /*!< (@ 0x00000088) Software Reset Register.                                   */\n  __IOM uint32_t  UART3_SRTS_REG;               /*!< (@ 0x0000008C) Shadow Request to Send                                     */\n  __IOM uint32_t  UART3_SBCR_REG;               /*!< (@ 0x00000090) Shadow Break Control Register                              */\n  __IOM uint32_t  UART3_SDMAM_REG;              /*!< (@ 0x00000094) Shadow DMA Mode                                            */\n  __IOM uint32_t  UART3_SFE_REG;                /*!< (@ 0x00000098) Shadow FIFO Enable                                         */\n  __IOM uint32_t  UART3_SRT_REG;                /*!< (@ 0x0000009C) Shadow RCVR Trigger                                        */\n  __IOM uint32_t  UART3_STET_REG;               /*!< (@ 0x000000A0) Shadow TX Empty Trigger                                    */\n  __IOM uint32_t  UART3_HTX_REG;                /*!< (@ 0x000000A4) Halt TX                                                    */\n  __IOM uint32_t  UART3_DMASA_REG;              /*!< (@ 0x000000A8) DMA Software Acknowledge                                   */\n  __IM  uint32_t  RESERVED2[5];\n  __IOM uint32_t  UART3_DLF_REG;                /*!< (@ 0x000000C0) Divisor Latch Fraction Register                            */\n  __IOM uint32_t  UART3_RAR_REG;                /*!< (@ 0x000000C4) Receive Address Register                                   */\n  __IOM uint32_t  UART3_TAR_REG;                /*!< (@ 0x000000C8) Transmit Address Register                                  */\n  __IOM uint32_t  UART3_LCR_EXT;                /*!< (@ 0x000000CC) Line Extended Control Register                             */\n  __IM  uint32_t  RESERVED3[4];\n  __IOM uint32_t  UART3_CTRL_REG;               /*!< (@ 0x000000E0) ISO7816 Control Register                                   */\n  __IOM uint32_t  UART3_TIMER_REG;              /*!< (@ 0x000000E4) ISO7816 Timer Register                                     */\n  __IOM uint32_t  UART3_ERR_CTRL_REG;           /*!< (@ 0x000000E8) ISO7816 Error Signal Control Register                      */\n  __IOM uint32_t  UART3_IRQ_STATUS_REG;         /*!< (@ 0x000000EC) ISO7816 Interrupt Status Register                          */\n  __IM  uint32_t  RESERVED4[2];\n  __IOM uint32_t  UART3_UCV_REG;                /*!< (@ 0x000000F8) Component Version                                          */\n  __IOM uint32_t  UART3_CTR_REG;                /*!< (@ 0x000000FC) Component Type Register                                    */\n} UART3_Type;                                   /*!< Size = 256 (0x100)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                            USB                                            ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief USB registers (USB)\n  */\n\ntypedef struct {                                /*!< (@ 0x50040000) USB Structure                                              */\n  __IOM uint32_t  USB_MCTRL_REG;                /*!< (@ 0x00000000) Main Control Register)                                     */\n  __IOM uint32_t  USB_XCVDIAG_REG;              /*!< (@ 0x00000004) Transceiver diagnostic Register (for test purpose\n                                                                    only)                                                      */\n  __IOM uint32_t  USB_TCR_REG;                  /*!< (@ 0x00000008) Transceiver configuration Register                         */\n  __IOM uint32_t  USB_UTR_REG;                  /*!< (@ 0x0000000C) USB test Register (for test purpose only)                  */\n  __IOM uint32_t  USB_FAR_REG;                  /*!< (@ 0x00000010) Function Address Register                                  */\n  __IOM uint32_t  USB_NFSR_REG;                 /*!< (@ 0x00000014) Node Functional State Register                             */\n  __IOM uint32_t  USB_MAEV_REG;                 /*!< (@ 0x00000018) Main Event Register                                        */\n  __IOM uint32_t  USB_MAMSK_REG;                /*!< (@ 0x0000001C) Main Mask Register                                         */\n  __IOM uint32_t  USB_ALTEV_REG;                /*!< (@ 0x00000020) Alternate Event Register                                   */\n  __IOM uint32_t  USB_ALTMSK_REG;               /*!< (@ 0x00000024) Alternate Mask Register                                    */\n  __IOM uint32_t  USB_TXEV_REG;                 /*!< (@ 0x00000028) Transmit Event Register                                    */\n  __IOM uint32_t  USB_TXMSK_REG;                /*!< (@ 0x0000002C) Transmit Mask Register                                     */\n  __IOM uint32_t  USB_RXEV_REG;                 /*!< (@ 0x00000030) Receive Event Register                                     */\n  __IOM uint32_t  USB_RXMSK_REG;                /*!< (@ 0x00000034) Receive Mask Register                                      */\n  __IOM uint32_t  USB_NAKEV_REG;                /*!< (@ 0x00000038) NAK Event Register                                         */\n  __IOM uint32_t  USB_NAKMSK_REG;               /*!< (@ 0x0000003C) NAK Mask Register                                          */\n  __IOM uint32_t  USB_FWEV_REG;                 /*!< (@ 0x00000040) FIFO Warning Event Register                                */\n  __IOM uint32_t  USB_FWMSK_REG;                /*!< (@ 0x00000044) FIFO Warning Mask Register                                 */\n  __IOM uint32_t  USB_FNH_REG;                  /*!< (@ 0x00000048) Frame Number High Byte Register                            */\n  __IOM uint32_t  USB_FNL_REG;                  /*!< (@ 0x0000004C) Frame Number Low Byte Register                             */\n  __IM  uint32_t  RESERVED[11];\n  __IOM uint32_t  USB_UX20CDR_REG;              /*!< (@ 0x0000007C) Transceiver 2.0 Configuration and Diagnostics\n                                                                    Register(for test purpose only)                            */\n  __IOM uint32_t  USB_EPC0_REG;                 /*!< (@ 0x00000080) Endpoint Control 0 Register                                */\n  __IOM uint32_t  USB_TXD0_REG;                 /*!< (@ 0x00000084) Transmit Data 0 Register                                   */\n  __IOM uint32_t  USB_TXS0_REG;                 /*!< (@ 0x00000088) Transmit Status 0 Register                                 */\n  __IOM uint32_t  USB_TXC0_REG;                 /*!< (@ 0x0000008C) Transmit command 0 Register                                */\n  __IOM uint32_t  USB_EP0_NAK_REG;              /*!< (@ 0x00000090) EP0 INNAK and OUTNAK Register                              */\n  __IOM uint32_t  USB_RXD0_REG;                 /*!< (@ 0x00000094) Receive Data 0 Register                                    */\n  __IOM uint32_t  USB_RXS0_REG;                 /*!< (@ 0x00000098) Receive Status 0 Register                                  */\n  __IOM uint32_t  USB_RXC0_REG;                 /*!< (@ 0x0000009C) Receive Command 0 Register                                 */\n  __IOM uint32_t  USB_EPC1_REG;                 /*!< (@ 0x000000A0) Endpoint Control Register 1                                */\n  __IOM uint32_t  USB_TXD1_REG;                 /*!< (@ 0x000000A4) Transmit Data Register 1                                   */\n  __IOM uint32_t  USB_TXS1_REG;                 /*!< (@ 0x000000A8) Transmit Status Register 1                                 */\n  __IOM uint32_t  USB_TXC1_REG;                 /*!< (@ 0x000000AC) Transmit Command Register 1                                */\n  __IOM uint32_t  USB_EPC2_REG;                 /*!< (@ 0x000000B0) Endpoint Control Register 2                                */\n  __IOM uint32_t  USB_RXD1_REG;                 /*!< (@ 0x000000B4) Receive Data Register,1                                    */\n  __IOM uint32_t  USB_RXS1_REG;                 /*!< (@ 0x000000B8) Receive Status Register 1                                  */\n  __IOM uint32_t  USB_RXC1_REG;                 /*!< (@ 0x000000BC) Receive Command Register 1                                 */\n  __IOM uint32_t  USB_EPC3_REG;                 /*!< (@ 0x000000C0) Endpoint Control Register 3                                */\n  __IOM uint32_t  USB_TXD2_REG;                 /*!< (@ 0x000000C4) Transmit Data Register 2                                   */\n  __IOM uint32_t  USB_TXS2_REG;                 /*!< (@ 0x000000C8) Transmit Status Register 2                                 */\n  __IOM uint32_t  USB_TXC2_REG;                 /*!< (@ 0x000000CC) Transmit Command Register 2                                */\n  __IOM uint32_t  USB_EPC4_REG;                 /*!< (@ 0x000000D0) Endpoint Control Register 4                                */\n  __IOM uint32_t  USB_RXD2_REG;                 /*!< (@ 0x000000D4) Receive Data Register 2                                    */\n  __IOM uint32_t  USB_RXS2_REG;                 /*!< (@ 0x000000D8) Receive Status Register 2                                  */\n  __IOM uint32_t  USB_RXC2_REG;                 /*!< (@ 0x000000DC) Receive Command Register 2                                 */\n  __IOM uint32_t  USB_EPC5_REG;                 /*!< (@ 0x000000E0) Endpoint Control Register 5                                */\n  __IOM uint32_t  USB_TXD3_REG;                 /*!< (@ 0x000000E4) Transmit Data Register 3                                   */\n  __IOM uint32_t  USB_TXS3_REG;                 /*!< (@ 0x000000E8) Transmit Status Register 3                                 */\n  __IOM uint32_t  USB_TXC3_REG;                 /*!< (@ 0x000000EC) Transmit Command Register 3                                */\n  __IOM uint32_t  USB_EPC6_REG;                 /*!< (@ 0x000000F0) Endpoint Control Register 6                                */\n  __IOM uint32_t  USB_RXD3_REG;                 /*!< (@ 0x000000F4) Receive Data Register 3                                    */\n  __IOM uint32_t  USB_RXS3_REG;                 /*!< (@ 0x000000F8) Receive Status Register 3                                  */\n  __IOM uint32_t  USB_RXC3_REG;                 /*!< (@ 0x000000FC) Receive Command Register 3                                 */\n  __IM  uint32_t  RESERVED1[40];\n  __IOM uint32_t  USB_DMA_CTRL_REG;             /*!< (@ 0x000001A0) USB DMA control register                                   */\n  __IM  uint32_t  RESERVED2;\n  __IOM uint32_t  USB_CHARGER_CTRL_REG;         /*!< (@ 0x000001A8) USB Charger Control Register                               */\n  __IOM uint32_t  USB_CHARGER_STAT_REG;         /*!< (@ 0x000001AC) USB Charger Status Register                                */\n} USB_Type;                                     /*!< Size = 432 (0x1b0)                                                        */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                          WAKEUP                                           ================ */\n/* =========================================================================================================================== */\n\n\n/**\n  * @brief WAKEUP registers (WAKEUP)\n  */\n\ntypedef struct {                                /*!< (@ 0x50000100) WAKEUP Structure                                           */\n  __IOM uint32_t  WKUP_CTRL_REG;                /*!< (@ 0x00000000) Control register for the wakeup counter                    */\n  __IM  uint32_t  RESERVED;\n  __IOM uint32_t  WKUP_RESET_IRQ_REG;           /*!< (@ 0x00000008) Reset wakeup interrupt                                     */\n  __IM  uint32_t  RESERVED1[2];\n  __IOM uint32_t  WKUP_SELECT_P0_REG;           /*!< (@ 0x00000014) select which inputs from P0 port can trigger\n                                                                    wkup counter                                               */\n  __IOM uint32_t  WKUP_SELECT_P1_REG;           /*!< (@ 0x00000018) select which inputs from P1 port can trigger\n                                                                    wkup counter                                               */\n  __IM  uint32_t  RESERVED2[3];\n  __IOM uint32_t  WKUP_POL_P0_REG;              /*!< (@ 0x00000028) select the sensitivity polarity for each P0 input           */\n  __IOM uint32_t  WKUP_POL_P1_REG;              /*!< (@ 0x0000002C) select the sensitivity polarity for each P1 input           */\n  __IM  uint32_t  RESERVED3[3];\n  __IOM uint32_t  WKUP_STATUS_P0_REG;           /*!< (@ 0x0000003C) Event status register for P0                               */\n  __IOM uint32_t  WKUP_STATUS_P1_REG;           /*!< (@ 0x00000040) Event status register for P1                               */\n  __IM  uint32_t  RESERVED4;\n  __IOM uint32_t  WKUP_CLEAR_P0_REG;            /*!< (@ 0x00000048) Clear event register for P0                                */\n  __IOM uint32_t  WKUP_CLEAR_P1_REG;            /*!< (@ 0x0000004C) Clear event register for P1                                */\n  __IM  uint32_t  RESERVED5;\n  __IOM uint32_t  WKUP_SEL_GPIO_P0_REG;         /*!< (@ 0x00000054) select which inputs from P0 port can trigger\n                                                                    interrupt                                                  */\n  __IOM uint32_t  WKUP_SEL_GPIO_P1_REG;         /*!< (@ 0x00000058) select which inputs from P1 port can trigger\n                                                                    interrupt                                                  */\n} WAKEUP_Type;                                  /*!< Size = 92 (0x5c)                                                          */\n\n\n/** @} */ /* End of group Device_Peripheral_peripherals */\n\n\n/* =========================================================================================================================== */\n/* ================                          Device Specific Peripheral Address Map                           ================ */\n/* =========================================================================================================================== */\n\n\n#define AES_HASH_BASE               0x30040000UL\n#define ANAMISC_BIF_BASE            0x50030B00UL\n#define APU_BASE                    0x50030600UL\n#define CACHE_BASE                  0x100C0000UL\n#define CHARGER_BASE                0x50040400UL\n#define CHIP_VERSION_BASE           0x50040200UL\n#define CRG_COM_BASE                0x50020900UL\n#define CRG_PER_BASE                0x50030C00UL\n#define CRG_SYS_BASE                0x50040500UL\n#define CRG_TOP_BASE                0x50000000UL\n#define CRG_XTAL_BASE               0x50010000UL\n#define DCDC_BASE                   0x50000300UL\n#define DMA_BASE                    0x50040800UL\n#define DW_BASE                     0x30020000UL\n#define GPADC_BASE                  0x50030900UL\n#define GPIO_BASE                   0x50020A00UL\n#define GPREG_BASE                  0x50040300UL\n#define I2C_BASE                    0x50020600UL\n#define I2C2_BASE                   0x50020700UL\n#define LCDC_BASE                   0x30030000UL\n#define LRA_BASE                    0x50030A00UL\n#define MEMCTRL_BASE                0x50050000UL\n#define OTPC_BASE                   0x30070000UL\n#define PDC_BASE                    0x50000200UL\n#define PWMLED_BASE                 0x50030500UL\n#define QSPIC_BASE                  0x38000000UL\n#define QSPIC2_BASE                 0x34000000UL\n#define RFMON_BASE                  0x50040600UL\n#define RTC_BASE                    0x50000400UL\n#define SDADC_BASE                  0x50020800UL\n#define SMOTOR_BASE                 0x50030E00UL\n#define SNC_BASE                    0x50020C00UL\n#define SPI_BASE                    0x50020300UL\n#define SPI2_BASE                   0x50020400UL\n#define SYS_WDOG_BASE               0x50000700UL\n#define TIMER_BASE                  0x50010200UL\n#define TIMER2_BASE                 0x50010300UL\n#define TIMER3_BASE                 0x50040A00UL\n#define TIMER4_BASE                 0x50040B00UL\n#define TRNG_BASE                   0x50040C00UL\n#define UART_BASE                   0x50020000UL\n#define UART2_BASE                  0x50020100UL\n#define UART3_BASE                  0x50020200UL\n#define USB_BASE                    0x50040000UL\n#define WAKEUP_BASE                 0x50000100UL\n\n\n/* =========================================================================================================================== */\n/* ================                                  Peripheral declaration                                   ================ */\n/* =========================================================================================================================== */\n\n\n#define AES_HASH                    ((AES_HASH_Type*)          AES_HASH_BASE)\n#define ANAMISC_BIF                 ((ANAMISC_BIF_Type*)       ANAMISC_BIF_BASE)\n#define APU                         ((APU_Type*)               APU_BASE)\n#define CACHE                       ((CACHE_Type*)             CACHE_BASE)\n#define CHARGER                     ((CHARGER_Type*)           CHARGER_BASE)\n#define CHIP_VERSION                ((CHIP_VERSION_Type*)      CHIP_VERSION_BASE)\n#define CRG_COM                     ((CRG_COM_Type*)           CRG_COM_BASE)\n#define CRG_PER                     ((CRG_PER_Type*)           CRG_PER_BASE)\n#define CRG_SYS                     ((CRG_SYS_Type*)           CRG_SYS_BASE)\n#define CRG_TOP                     ((CRG_TOP_Type*)           CRG_TOP_BASE)\n#define CRG_XTAL                    ((CRG_XTAL_Type*)          CRG_XTAL_BASE)\n#define DCDC                        ((DCDC_Type*)              DCDC_BASE)\n#define DMA                         ((DMA_Type*)               DMA_BASE)\n#define DW                          ((DW_Type*)                DW_BASE)\n#define GPADC                       ((GPADC_Type*)             GPADC_BASE)\n#define GPIO                        ((GPIO_Type*)              GPIO_BASE)\n#define GPREG                       ((GPREG_Type*)             GPREG_BASE)\n#define I2C                         ((I2C_Type*)               I2C_BASE)\n#define I2C2                        ((I2C2_Type*)              I2C2_BASE)\n#define LCDC                        ((LCDC_Type*)              LCDC_BASE)\n#define LRA                         ((LRA_Type*)               LRA_BASE)\n#define MEMCTRL                     ((MEMCTRL_Type*)           MEMCTRL_BASE)\n#define OTPC                        ((OTPC_Type*)              OTPC_BASE)\n#define PDC                         ((PDC_Type*)               PDC_BASE)\n#define PWMLED                      ((PWMLED_Type*)            PWMLED_BASE)\n#define QSPIC                       ((QSPIC_Type*)             QSPIC_BASE)\n#define QSPIC2                      ((QSPIC2_Type*)            QSPIC2_BASE)\n#define RFMON                       ((RFMON_Type*)             RFMON_BASE)\n#define RTC                         ((RTC_Type*)               RTC_BASE)\n#define SDADC                       ((SDADC_Type*)             SDADC_BASE)\n#define SMOTOR                      ((SMOTOR_Type*)            SMOTOR_BASE)\n#define SNC                         ((SNC_Type*)               SNC_BASE)\n#define SPI                         ((SPI_Type*)               SPI_BASE)\n#define SPI2                        ((SPI2_Type*)              SPI2_BASE)\n#define SYS_WDOG                    ((SYS_WDOG_Type*)          SYS_WDOG_BASE)\n#define TIMER                       ((TIMER_Type*)             TIMER_BASE)\n#define TIMER2                      ((TIMER2_Type*)            TIMER2_BASE)\n#define TIMER3                      ((TIMER3_Type*)            TIMER3_BASE)\n#define TIMER4                      ((TIMER4_Type*)            TIMER4_BASE)\n#define TRNG                        ((TRNG_Type*)              TRNG_BASE)\n#define UART                        ((UART_Type*)              UART_BASE)\n#define UART2                       ((UART2_Type*)             UART2_BASE)\n#define UART3                       ((UART3_Type*)             UART3_BASE)\n#define USB                         ((USB_Type*)               USB_BASE)\n#define WAKEUP                      ((WAKEUP_Type*)            WAKEUP_BASE)\n\n\n/* =========================================================================================================================== */\n/* ================                                Pos/Mask Peripheral Section                                ================ */\n/* =========================================================================================================================== */\n\n\n/** @addtogroup PosMask_peripherals\n  * @{\n  */\n\n\n\n/* =========================================================================================================================== */\n/* ================                                         AES_HASH                                          ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  CRYPTO_CLRIRQ_REG  =================================================== */\n#define AES_HASH_CRYPTO_CLRIRQ_REG_CRYPTO_CLRIRQ_Pos (0UL)          /*!< CRYPTO_CLRIRQ (Bit 0)                                 */\n#define AES_HASH_CRYPTO_CLRIRQ_REG_CRYPTO_CLRIRQ_Msk (0x1UL)        /*!< CRYPTO_CLRIRQ (Bitfield-Mask: 0x01)                   */\n/* ====================================================  CRYPTO_CTRL_REG  ==================================================== */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_AES_KEXP_Pos (17UL)         /*!< CRYPTO_AES_KEXP (Bit 17)                              */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_AES_KEXP_Msk (0x20000UL)    /*!< CRYPTO_AES_KEXP (Bitfield-Mask: 0x01)                 */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_MORE_IN_Pos (16UL)          /*!< CRYPTO_MORE_IN (Bit 16)                               */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_MORE_IN_Msk (0x10000UL)     /*!< CRYPTO_MORE_IN (Bitfield-Mask: 0x01)                  */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_HASH_OUT_LEN_Pos (10UL)     /*!< CRYPTO_HASH_OUT_LEN (Bit 10)                          */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_HASH_OUT_LEN_Msk (0xfc00UL) /*!< CRYPTO_HASH_OUT_LEN (Bitfield-Mask: 0x3f)             */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_HASH_SEL_Pos (9UL)          /*!< CRYPTO_HASH_SEL (Bit 9)                               */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_HASH_SEL_Msk (0x200UL)      /*!< CRYPTO_HASH_SEL (Bitfield-Mask: 0x01)                 */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_IRQ_EN_Pos (8UL)            /*!< CRYPTO_IRQ_EN (Bit 8)                                 */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_IRQ_EN_Msk (0x100UL)        /*!< CRYPTO_IRQ_EN (Bitfield-Mask: 0x01)                   */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_ENCDEC_Pos (7UL)            /*!< CRYPTO_ENCDEC (Bit 7)                                 */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_ENCDEC_Msk (0x80UL)         /*!< CRYPTO_ENCDEC (Bitfield-Mask: 0x01)                   */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_AES_KEY_SZ_Pos (5UL)        /*!< CRYPTO_AES_KEY_SZ (Bit 5)                             */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_AES_KEY_SZ_Msk (0x60UL)     /*!< CRYPTO_AES_KEY_SZ (Bitfield-Mask: 0x03)               */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_OUT_MD_Pos (4UL)            /*!< CRYPTO_OUT_MD (Bit 4)                                 */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_OUT_MD_Msk (0x10UL)         /*!< CRYPTO_OUT_MD (Bitfield-Mask: 0x01)                   */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_ALG_MD_Pos (2UL)            /*!< CRYPTO_ALG_MD (Bit 2)                                 */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_ALG_MD_Msk (0xcUL)          /*!< CRYPTO_ALG_MD (Bitfield-Mask: 0x03)                   */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_ALG_Pos (0UL)               /*!< CRYPTO_ALG (Bit 0)                                    */\n#define AES_HASH_CRYPTO_CTRL_REG_CRYPTO_ALG_Msk (0x3UL)             /*!< CRYPTO_ALG (Bitfield-Mask: 0x03)                      */\n/* =================================================  CRYPTO_DEST_ADDR_REG  ================================================== */\n#define AES_HASH_CRYPTO_DEST_ADDR_REG_CRYPTO_DEST_ADDR_Pos (0UL)    /*!< CRYPTO_DEST_ADDR (Bit 0)                              */\n#define AES_HASH_CRYPTO_DEST_ADDR_REG_CRYPTO_DEST_ADDR_Msk (0xffffffffUL) /*!< CRYPTO_DEST_ADDR (Bitfield-Mask: 0xffffffff)    */\n/* =================================================  CRYPTO_FETCH_ADDR_REG  ================================================= */\n#define AES_HASH_CRYPTO_FETCH_ADDR_REG_CRYPTO_FETCH_ADDR_Pos (0UL)  /*!< CRYPTO_FETCH_ADDR (Bit 0)                             */\n#define AES_HASH_CRYPTO_FETCH_ADDR_REG_CRYPTO_FETCH_ADDR_Msk (0xffffffffUL) /*!< CRYPTO_FETCH_ADDR (Bitfield-Mask: 0xffffffff) */\n/* ===================================================  CRYPTO_KEYS_START  =================================================== */\n#define AES_HASH_CRYPTO_KEYS_START_CRYPTO_KEY_X_Pos (0UL)           /*!< CRYPTO_KEY_X (Bit 0)                                  */\n#define AES_HASH_CRYPTO_KEYS_START_CRYPTO_KEY_X_Msk (0xffffffffUL)  /*!< CRYPTO_KEY_X (Bitfield-Mask: 0xffffffff)              */\n/* ====================================================  CRYPTO_LEN_REG  ===================================================== */\n#define AES_HASH_CRYPTO_LEN_REG_CRYPTO_LEN_Pos (0UL)                /*!< CRYPTO_LEN (Bit 0)                                    */\n#define AES_HASH_CRYPTO_LEN_REG_CRYPTO_LEN_Msk (0xffffffUL)         /*!< CRYPTO_LEN (Bitfield-Mask: 0xffffff)                  */\n/* ===================================================  CRYPTO_MREG0_REG  ==================================================== */\n#define AES_HASH_CRYPTO_MREG0_REG_CRYPTO_MREG0_Pos (0UL)            /*!< CRYPTO_MREG0 (Bit 0)                                  */\n#define AES_HASH_CRYPTO_MREG0_REG_CRYPTO_MREG0_Msk (0xffffffffUL)   /*!< CRYPTO_MREG0 (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  CRYPTO_MREG1_REG  ==================================================== */\n#define AES_HASH_CRYPTO_MREG1_REG_CRYPTO_MREG1_Pos (0UL)            /*!< CRYPTO_MREG1 (Bit 0)                                  */\n#define AES_HASH_CRYPTO_MREG1_REG_CRYPTO_MREG1_Msk (0xffffffffUL)   /*!< CRYPTO_MREG1 (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  CRYPTO_MREG2_REG  ==================================================== */\n#define AES_HASH_CRYPTO_MREG2_REG_CRYPTO_MREG2_Pos (0UL)            /*!< CRYPTO_MREG2 (Bit 0)                                  */\n#define AES_HASH_CRYPTO_MREG2_REG_CRYPTO_MREG2_Msk (0xffffffffUL)   /*!< CRYPTO_MREG2 (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  CRYPTO_MREG3_REG  ==================================================== */\n#define AES_HASH_CRYPTO_MREG3_REG_CRYPTO_MREG3_Pos (0UL)            /*!< CRYPTO_MREG3 (Bit 0)                                  */\n#define AES_HASH_CRYPTO_MREG3_REG_CRYPTO_MREG3_Msk (0xffffffffUL)   /*!< CRYPTO_MREG3 (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  CRYPTO_START_REG  ==================================================== */\n#define AES_HASH_CRYPTO_START_REG_CRYPTO_START_Pos (0UL)            /*!< CRYPTO_START (Bit 0)                                  */\n#define AES_HASH_CRYPTO_START_REG_CRYPTO_START_Msk (0x1UL)          /*!< CRYPTO_START (Bitfield-Mask: 0x01)                    */\n/* ===================================================  CRYPTO_STATUS_REG  =================================================== */\n#define AES_HASH_CRYPTO_STATUS_REG_CRYPTO_IRQ_ST_Pos (2UL)          /*!< CRYPTO_IRQ_ST (Bit 2)                                 */\n#define AES_HASH_CRYPTO_STATUS_REG_CRYPTO_IRQ_ST_Msk (0x4UL)        /*!< CRYPTO_IRQ_ST (Bitfield-Mask: 0x01)                   */\n#define AES_HASH_CRYPTO_STATUS_REG_CRYPTO_WAIT_FOR_IN_Pos (1UL)     /*!< CRYPTO_WAIT_FOR_IN (Bit 1)                            */\n#define AES_HASH_CRYPTO_STATUS_REG_CRYPTO_WAIT_FOR_IN_Msk (0x2UL)   /*!< CRYPTO_WAIT_FOR_IN (Bitfield-Mask: 0x01)              */\n#define AES_HASH_CRYPTO_STATUS_REG_CRYPTO_INACTIVE_Pos (0UL)        /*!< CRYPTO_INACTIVE (Bit 0)                               */\n#define AES_HASH_CRYPTO_STATUS_REG_CRYPTO_INACTIVE_Msk (0x1UL)      /*!< CRYPTO_INACTIVE (Bitfield-Mask: 0x01)                 */\n\n\n/* =========================================================================================================================== */\n/* ================                                        ANAMISC_BIF                                        ================ */\n/* =========================================================================================================================== */\n\n/* ====================================================  CLK_REF_CNT_REG  ==================================================== */\n#define ANAMISC_BIF_CLK_REF_CNT_REG_REF_CNT_VAL_Pos (0UL)           /*!< REF_CNT_VAL (Bit 0)                                   */\n#define ANAMISC_BIF_CLK_REF_CNT_REG_REF_CNT_VAL_Msk (0xffffUL)      /*!< REF_CNT_VAL (Bitfield-Mask: 0xffff)                   */\n/* ====================================================  CLK_REF_SEL_REG  ==================================================== */\n#define ANAMISC_BIF_CLK_REF_SEL_REG_CAL_CLK_SEL_Pos (5UL)           /*!< CAL_CLK_SEL (Bit 5)                                   */\n#define ANAMISC_BIF_CLK_REF_SEL_REG_CAL_CLK_SEL_Msk (0xe0UL)        /*!< CAL_CLK_SEL (Bitfield-Mask: 0x07)                     */\n#define ANAMISC_BIF_CLK_REF_SEL_REG_EXT_CNT_EN_SEL_Pos (4UL)        /*!< EXT_CNT_EN_SEL (Bit 4)                                */\n#define ANAMISC_BIF_CLK_REF_SEL_REG_EXT_CNT_EN_SEL_Msk (0x10UL)     /*!< EXT_CNT_EN_SEL (Bitfield-Mask: 0x01)                  */\n#define ANAMISC_BIF_CLK_REF_SEL_REG_REF_CAL_START_Pos (3UL)         /*!< REF_CAL_START (Bit 3)                                 */\n#define ANAMISC_BIF_CLK_REF_SEL_REG_REF_CAL_START_Msk (0x8UL)       /*!< REF_CAL_START (Bitfield-Mask: 0x01)                   */\n#define ANAMISC_BIF_CLK_REF_SEL_REG_REF_CLK_SEL_Pos (0UL)           /*!< REF_CLK_SEL (Bit 0)                                   */\n#define ANAMISC_BIF_CLK_REF_SEL_REG_REF_CLK_SEL_Msk (0x7UL)         /*!< REF_CLK_SEL (Bitfield-Mask: 0x07)                     */\n/* ====================================================  CLK_REF_VAL_REG  ==================================================== */\n#define ANAMISC_BIF_CLK_REF_VAL_REG_XTAL_CNT_VAL_Pos (0UL)          /*!< XTAL_CNT_VAL (Bit 0)                                  */\n#define ANAMISC_BIF_CLK_REF_VAL_REG_XTAL_CNT_VAL_Msk (0xffffffffUL) /*!< XTAL_CNT_VAL (Bitfield-Mask: 0xffffffff)              */\n\n\n/* =========================================================================================================================== */\n/* ================                                            APU                                            ================ */\n/* =========================================================================================================================== */\n\n/* ======================================================  APU_MUX_REG  ====================================================== */\n#define APU_APU_MUX_REG_PDM1_MUX_IN_Pos   (6UL)                     /*!< PDM1_MUX_IN (Bit 6)                                   */\n#define APU_APU_MUX_REG_PDM1_MUX_IN_Msk   (0x40UL)                  /*!< PDM1_MUX_IN (Bitfield-Mask: 0x01)                     */\n#define APU_APU_MUX_REG_PCM1_MUX_IN_Pos   (3UL)                     /*!< PCM1_MUX_IN (Bit 3)                                   */\n#define APU_APU_MUX_REG_PCM1_MUX_IN_Msk   (0x38UL)                  /*!< PCM1_MUX_IN (Bitfield-Mask: 0x07)                     */\n#define APU_APU_MUX_REG_SRC1_MUX_IN_Pos   (0UL)                     /*!< SRC1_MUX_IN (Bit 0)                                   */\n#define APU_APU_MUX_REG_SRC1_MUX_IN_Msk   (0x7UL)                   /*!< SRC1_MUX_IN (Bitfield-Mask: 0x07)                     */\n/* ====================================================  COEF0A_SET1_REG  ==================================================== */\n#define APU_COEF0A_SET1_REG_SRC_COEF10_Pos (0UL)                    /*!< SRC_COEF10 (Bit 0)                                    */\n#define APU_COEF0A_SET1_REG_SRC_COEF10_Msk (0xffffUL)               /*!< SRC_COEF10 (Bitfield-Mask: 0xffff)                    */\n/* ====================================================  COEF10_SET1_REG  ==================================================== */\n#define APU_COEF10_SET1_REG_SRC_COEF1_Pos (16UL)                    /*!< SRC_COEF1 (Bit 16)                                    */\n#define APU_COEF10_SET1_REG_SRC_COEF1_Msk (0xffff0000UL)            /*!< SRC_COEF1 (Bitfield-Mask: 0xffff)                     */\n#define APU_COEF10_SET1_REG_SRC_COEF0_Pos (0UL)                     /*!< SRC_COEF0 (Bit 0)                                     */\n#define APU_COEF10_SET1_REG_SRC_COEF0_Msk (0xffffUL)                /*!< SRC_COEF0 (Bitfield-Mask: 0xffff)                     */\n/* ====================================================  COEF32_SET1_REG  ==================================================== */\n#define APU_COEF32_SET1_REG_SRC_COEF3_Pos (16UL)                    /*!< SRC_COEF3 (Bit 16)                                    */\n#define APU_COEF32_SET1_REG_SRC_COEF3_Msk (0xffff0000UL)            /*!< SRC_COEF3 (Bitfield-Mask: 0xffff)                     */\n#define APU_COEF32_SET1_REG_SRC_COEF2_Pos (0UL)                     /*!< SRC_COEF2 (Bit 0)                                     */\n#define APU_COEF32_SET1_REG_SRC_COEF2_Msk (0xffffUL)                /*!< SRC_COEF2 (Bitfield-Mask: 0xffff)                     */\n/* ====================================================  COEF54_SET1_REG  ==================================================== */\n#define APU_COEF54_SET1_REG_SRC_COEF5_Pos (16UL)                    /*!< SRC_COEF5 (Bit 16)                                    */\n#define APU_COEF54_SET1_REG_SRC_COEF5_Msk (0xffff0000UL)            /*!< SRC_COEF5 (Bitfield-Mask: 0xffff)                     */\n#define APU_COEF54_SET1_REG_SRC_COEF4_Pos (0UL)                     /*!< SRC_COEF4 (Bit 0)                                     */\n#define APU_COEF54_SET1_REG_SRC_COEF4_Msk (0xffffUL)                /*!< SRC_COEF4 (Bitfield-Mask: 0xffff)                     */\n/* ====================================================  COEF76_SET1_REG  ==================================================== */\n#define APU_COEF76_SET1_REG_SRC_COEF7_Pos (16UL)                    /*!< SRC_COEF7 (Bit 16)                                    */\n#define APU_COEF76_SET1_REG_SRC_COEF7_Msk (0xffff0000UL)            /*!< SRC_COEF7 (Bitfield-Mask: 0xffff)                     */\n#define APU_COEF76_SET1_REG_SRC_COEF6_Pos (0UL)                     /*!< SRC_COEF6 (Bit 0)                                     */\n#define APU_COEF76_SET1_REG_SRC_COEF6_Msk (0xffffUL)                /*!< SRC_COEF6 (Bitfield-Mask: 0xffff)                     */\n/* ====================================================  COEF98_SET1_REG  ==================================================== */\n#define APU_COEF98_SET1_REG_SRC_COEF9_Pos (16UL)                    /*!< SRC_COEF9 (Bit 16)                                    */\n#define APU_COEF98_SET1_REG_SRC_COEF9_Msk (0xffff0000UL)            /*!< SRC_COEF9 (Bitfield-Mask: 0xffff)                     */\n#define APU_COEF98_SET1_REG_SRC_COEF8_Pos (0UL)                     /*!< SRC_COEF8 (Bit 0)                                     */\n#define APU_COEF98_SET1_REG_SRC_COEF8_Msk (0xffffUL)                /*!< SRC_COEF8 (Bitfield-Mask: 0xffff)                     */\n/* =====================================================  PCM1_CTRL_REG  ===================================================== */\n#define APU_PCM1_CTRL_REG_PCM_FSC_DIV_Pos (20UL)                    /*!< PCM_FSC_DIV (Bit 20)                                  */\n#define APU_PCM1_CTRL_REG_PCM_FSC_DIV_Msk (0xfff00000UL)            /*!< PCM_FSC_DIV (Bitfield-Mask: 0xfff)                    */\n#define APU_PCM1_CTRL_REG_PCM_FSC_EDGE_Pos (16UL)                   /*!< PCM_FSC_EDGE (Bit 16)                                 */\n#define APU_PCM1_CTRL_REG_PCM_FSC_EDGE_Msk (0x10000UL)              /*!< PCM_FSC_EDGE (Bitfield-Mask: 0x01)                    */\n#define APU_PCM1_CTRL_REG_PCM_CH_DEL_Pos  (11UL)                    /*!< PCM_CH_DEL (Bit 11)                                   */\n#define APU_PCM1_CTRL_REG_PCM_CH_DEL_Msk  (0xf800UL)                /*!< PCM_CH_DEL (Bitfield-Mask: 0x1f)                      */\n#define APU_PCM1_CTRL_REG_PCM_CLK_BIT_Pos (10UL)                    /*!< PCM_CLK_BIT (Bit 10)                                  */\n#define APU_PCM1_CTRL_REG_PCM_CLK_BIT_Msk (0x400UL)                 /*!< PCM_CLK_BIT (Bitfield-Mask: 0x01)                     */\n#define APU_PCM1_CTRL_REG_PCM_FSCINV_Pos  (9UL)                     /*!< PCM_FSCINV (Bit 9)                                    */\n#define APU_PCM1_CTRL_REG_PCM_FSCINV_Msk  (0x200UL)                 /*!< PCM_FSCINV (Bitfield-Mask: 0x01)                      */\n#define APU_PCM1_CTRL_REG_PCM_CLKINV_Pos  (8UL)                     /*!< PCM_CLKINV (Bit 8)                                    */\n#define APU_PCM1_CTRL_REG_PCM_CLKINV_Msk  (0x100UL)                 /*!< PCM_CLKINV (Bitfield-Mask: 0x01)                      */\n#define APU_PCM1_CTRL_REG_PCM_PPOD_Pos    (7UL)                     /*!< PCM_PPOD (Bit 7)                                      */\n#define APU_PCM1_CTRL_REG_PCM_PPOD_Msk    (0x80UL)                  /*!< PCM_PPOD (Bitfield-Mask: 0x01)                        */\n#define APU_PCM1_CTRL_REG_PCM_FSCDEL_Pos  (6UL)                     /*!< PCM_FSCDEL (Bit 6)                                    */\n#define APU_PCM1_CTRL_REG_PCM_FSCDEL_Msk  (0x40UL)                  /*!< PCM_FSCDEL (Bitfield-Mask: 0x01)                      */\n#define APU_PCM1_CTRL_REG_PCM_FSCLEN_Pos  (2UL)                     /*!< PCM_FSCLEN (Bit 2)                                    */\n#define APU_PCM1_CTRL_REG_PCM_FSCLEN_Msk  (0x3cUL)                  /*!< PCM_FSCLEN (Bitfield-Mask: 0x0f)                      */\n#define APU_PCM1_CTRL_REG_PCM_MASTER_Pos  (1UL)                     /*!< PCM_MASTER (Bit 1)                                    */\n#define APU_PCM1_CTRL_REG_PCM_MASTER_Msk  (0x2UL)                   /*!< PCM_MASTER (Bitfield-Mask: 0x01)                      */\n#define APU_PCM1_CTRL_REG_PCM_EN_Pos      (0UL)                     /*!< PCM_EN (Bit 0)                                        */\n#define APU_PCM1_CTRL_REG_PCM_EN_Msk      (0x1UL)                   /*!< PCM_EN (Bitfield-Mask: 0x01)                          */\n/* =====================================================  PCM1_IN1_REG  ====================================================== */\n#define APU_PCM1_IN1_REG_PCM_IN_Pos       (0UL)                     /*!< PCM_IN (Bit 0)                                        */\n#define APU_PCM1_IN1_REG_PCM_IN_Msk       (0xffffffffUL)            /*!< PCM_IN (Bitfield-Mask: 0xffffffff)                    */\n/* =====================================================  PCM1_IN2_REG  ====================================================== */\n#define APU_PCM1_IN2_REG_PCM_IN_Pos       (0UL)                     /*!< PCM_IN (Bit 0)                                        */\n#define APU_PCM1_IN2_REG_PCM_IN_Msk       (0xffffffffUL)            /*!< PCM_IN (Bitfield-Mask: 0xffffffff)                    */\n/* =====================================================  PCM1_OUT1_REG  ===================================================== */\n#define APU_PCM1_OUT1_REG_PCM_OUT_Pos     (0UL)                     /*!< PCM_OUT (Bit 0)                                       */\n#define APU_PCM1_OUT1_REG_PCM_OUT_Msk     (0xffffffffUL)            /*!< PCM_OUT (Bitfield-Mask: 0xffffffff)                   */\n/* =====================================================  PCM1_OUT2_REG  ===================================================== */\n#define APU_PCM1_OUT2_REG_PCM_OUT_Pos     (0UL)                     /*!< PCM_OUT (Bit 0)                                       */\n#define APU_PCM1_OUT2_REG_PCM_OUT_Msk     (0xffffffffUL)            /*!< PCM_OUT (Bitfield-Mask: 0xffffffff)                   */\n/* =====================================================  SRC1_CTRL_REG  ===================================================== */\n#define APU_SRC1_CTRL_REG_SRC_PDM_DO_DEL_Pos (30UL)                 /*!< SRC_PDM_DO_DEL (Bit 30)                               */\n#define APU_SRC1_CTRL_REG_SRC_PDM_DO_DEL_Msk (0xc0000000UL)         /*!< SRC_PDM_DO_DEL (Bitfield-Mask: 0x03)                  */\n#define APU_SRC1_CTRL_REG_SRC_PDM_MODE_Pos (28UL)                   /*!< SRC_PDM_MODE (Bit 28)                                 */\n#define APU_SRC1_CTRL_REG_SRC_PDM_MODE_Msk (0x30000000UL)           /*!< SRC_PDM_MODE (Bitfield-Mask: 0x03)                    */\n#define APU_SRC1_CTRL_REG_SRC_PDM_DI_DEL_Pos (26UL)                 /*!< SRC_PDM_DI_DEL (Bit 26)                               */\n#define APU_SRC1_CTRL_REG_SRC_PDM_DI_DEL_Msk (0xc000000UL)          /*!< SRC_PDM_DI_DEL (Bitfield-Mask: 0x03)                  */\n#define APU_SRC1_CTRL_REG_SRC_OUT_FLOWCLR_Pos (25UL)                /*!< SRC_OUT_FLOWCLR (Bit 25)                              */\n#define APU_SRC1_CTRL_REG_SRC_OUT_FLOWCLR_Msk (0x2000000UL)         /*!< SRC_OUT_FLOWCLR (Bitfield-Mask: 0x01)                 */\n#define APU_SRC1_CTRL_REG_SRC_IN_FLOWCLR_Pos (24UL)                 /*!< SRC_IN_FLOWCLR (Bit 24)                               */\n#define APU_SRC1_CTRL_REG_SRC_IN_FLOWCLR_Msk (0x1000000UL)          /*!< SRC_IN_FLOWCLR (Bitfield-Mask: 0x01)                  */\n#define APU_SRC1_CTRL_REG_SRC_OUT_UNFLOW_Pos (23UL)                 /*!< SRC_OUT_UNFLOW (Bit 23)                               */\n#define APU_SRC1_CTRL_REG_SRC_OUT_UNFLOW_Msk (0x800000UL)           /*!< SRC_OUT_UNFLOW (Bitfield-Mask: 0x01)                  */\n#define APU_SRC1_CTRL_REG_SRC_OUT_OVFLOW_Pos (22UL)                 /*!< SRC_OUT_OVFLOW (Bit 22)                               */\n#define APU_SRC1_CTRL_REG_SRC_OUT_OVFLOW_Msk (0x400000UL)           /*!< SRC_OUT_OVFLOW (Bitfield-Mask: 0x01)                  */\n#define APU_SRC1_CTRL_REG_SRC_IN_UNFLOW_Pos (21UL)                  /*!< SRC_IN_UNFLOW (Bit 21)                                */\n#define APU_SRC1_CTRL_REG_SRC_IN_UNFLOW_Msk (0x200000UL)            /*!< SRC_IN_UNFLOW (Bitfield-Mask: 0x01)                   */\n#define APU_SRC1_CTRL_REG_SRC_IN_OVFLOW_Pos (20UL)                  /*!< SRC_IN_OVFLOW (Bit 20)                                */\n#define APU_SRC1_CTRL_REG_SRC_IN_OVFLOW_Msk (0x100000UL)            /*!< SRC_IN_OVFLOW (Bitfield-Mask: 0x01)                   */\n#define APU_SRC1_CTRL_REG_SRC_RESYNC_Pos  (19UL)                    /*!< SRC_RESYNC (Bit 19)                                   */\n#define APU_SRC1_CTRL_REG_SRC_RESYNC_Msk  (0x80000UL)               /*!< SRC_RESYNC (Bitfield-Mask: 0x01)                      */\n#define APU_SRC1_CTRL_REG_SRC_OUT_OK_Pos  (18UL)                    /*!< SRC_OUT_OK (Bit 18)                                   */\n#define APU_SRC1_CTRL_REG_SRC_OUT_OK_Msk  (0x40000UL)               /*!< SRC_OUT_OK (Bitfield-Mask: 0x01)                      */\n#define APU_SRC1_CTRL_REG_SRC_OUT_US_Pos  (16UL)                    /*!< SRC_OUT_US (Bit 16)                                   */\n#define APU_SRC1_CTRL_REG_SRC_OUT_US_Msk  (0x30000UL)               /*!< SRC_OUT_US (Bitfield-Mask: 0x03)                      */\n#define APU_SRC1_CTRL_REG_SRC_OUT_CAL_BYPASS_Pos (14UL)             /*!< SRC_OUT_CAL_BYPASS (Bit 14)                           */\n#define APU_SRC1_CTRL_REG_SRC_OUT_CAL_BYPASS_Msk (0x4000UL)         /*!< SRC_OUT_CAL_BYPASS (Bitfield-Mask: 0x01)              */\n#define APU_SRC1_CTRL_REG_SRC_OUT_AMODE_Pos (13UL)                  /*!< SRC_OUT_AMODE (Bit 13)                                */\n#define APU_SRC1_CTRL_REG_SRC_OUT_AMODE_Msk (0x2000UL)              /*!< SRC_OUT_AMODE (Bitfield-Mask: 0x01)                   */\n#define APU_SRC1_CTRL_REG_SRC_PDM_OUT_INV_Pos (12UL)                /*!< SRC_PDM_OUT_INV (Bit 12)                              */\n#define APU_SRC1_CTRL_REG_SRC_PDM_OUT_INV_Msk (0x1000UL)            /*!< SRC_PDM_OUT_INV (Bitfield-Mask: 0x01)                 */\n#define APU_SRC1_CTRL_REG_SRC_FIFO_DIRECTION_Pos (11UL)             /*!< SRC_FIFO_DIRECTION (Bit 11)                           */\n#define APU_SRC1_CTRL_REG_SRC_FIFO_DIRECTION_Msk (0x800UL)          /*!< SRC_FIFO_DIRECTION (Bitfield-Mask: 0x01)              */\n#define APU_SRC1_CTRL_REG_SRC_FIFO_ENABLE_Pos (10UL)                /*!< SRC_FIFO_ENABLE (Bit 10)                              */\n#define APU_SRC1_CTRL_REG_SRC_FIFO_ENABLE_Msk (0x400UL)             /*!< SRC_FIFO_ENABLE (Bitfield-Mask: 0x01)                 */\n#define APU_SRC1_CTRL_REG_SRC_OUT_DSD_MODE_Pos (9UL)                /*!< SRC_OUT_DSD_MODE (Bit 9)                              */\n#define APU_SRC1_CTRL_REG_SRC_OUT_DSD_MODE_Msk (0x200UL)            /*!< SRC_OUT_DSD_MODE (Bitfield-Mask: 0x01)                */\n#define APU_SRC1_CTRL_REG_SRC_IN_DSD_MODE_Pos (8UL)                 /*!< SRC_IN_DSD_MODE (Bit 8)                               */\n#define APU_SRC1_CTRL_REG_SRC_IN_DSD_MODE_Msk (0x100UL)             /*!< SRC_IN_DSD_MODE (Bitfield-Mask: 0x01)                 */\n#define APU_SRC1_CTRL_REG_SRC_DITHER_DISABLE_Pos (7UL)              /*!< SRC_DITHER_DISABLE (Bit 7)                            */\n#define APU_SRC1_CTRL_REG_SRC_DITHER_DISABLE_Msk (0x80UL)           /*!< SRC_DITHER_DISABLE (Bitfield-Mask: 0x01)              */\n#define APU_SRC1_CTRL_REG_SRC_IN_OK_Pos   (6UL)                     /*!< SRC_IN_OK (Bit 6)                                     */\n#define APU_SRC1_CTRL_REG_SRC_IN_OK_Msk   (0x40UL)                  /*!< SRC_IN_OK (Bitfield-Mask: 0x01)                       */\n#define APU_SRC1_CTRL_REG_SRC_IN_DS_Pos   (4UL)                     /*!< SRC_IN_DS (Bit 4)                                     */\n#define APU_SRC1_CTRL_REG_SRC_IN_DS_Msk   (0x30UL)                  /*!< SRC_IN_DS (Bitfield-Mask: 0x03)                       */\n#define APU_SRC1_CTRL_REG_SRC_PDM_IN_INV_Pos (3UL)                  /*!< SRC_PDM_IN_INV (Bit 3)                                */\n#define APU_SRC1_CTRL_REG_SRC_PDM_IN_INV_Msk (0x8UL)                /*!< SRC_PDM_IN_INV (Bitfield-Mask: 0x01)                  */\n#define APU_SRC1_CTRL_REG_SRC_IN_CAL_BYPASS_Pos (2UL)               /*!< SRC_IN_CAL_BYPASS (Bit 2)                             */\n#define APU_SRC1_CTRL_REG_SRC_IN_CAL_BYPASS_Msk (0x4UL)             /*!< SRC_IN_CAL_BYPASS (Bitfield-Mask: 0x01)               */\n#define APU_SRC1_CTRL_REG_SRC_IN_AMODE_Pos (1UL)                    /*!< SRC_IN_AMODE (Bit 1)                                  */\n#define APU_SRC1_CTRL_REG_SRC_IN_AMODE_Msk (0x2UL)                  /*!< SRC_IN_AMODE (Bitfield-Mask: 0x01)                    */\n#define APU_SRC1_CTRL_REG_SRC_EN_Pos      (0UL)                     /*!< SRC_EN (Bit 0)                                        */\n#define APU_SRC1_CTRL_REG_SRC_EN_Msk      (0x1UL)                   /*!< SRC_EN (Bitfield-Mask: 0x01)                          */\n/* =====================================================  SRC1_IN1_REG  ====================================================== */\n#define APU_SRC1_IN1_REG_SRC_IN_Pos       (0UL)                     /*!< SRC_IN (Bit 0)                                        */\n#define APU_SRC1_IN1_REG_SRC_IN_Msk       (0xffffffffUL)            /*!< SRC_IN (Bitfield-Mask: 0xffffffff)                    */\n/* =====================================================  SRC1_IN2_REG  ====================================================== */\n#define APU_SRC1_IN2_REG_SRC_IN_Pos       (0UL)                     /*!< SRC_IN (Bit 0)                                        */\n#define APU_SRC1_IN2_REG_SRC_IN_Msk       (0xffffffffUL)            /*!< SRC_IN (Bitfield-Mask: 0xffffffff)                    */\n/* ====================================================  SRC1_IN_FS_REG  ===================================================== */\n#define APU_SRC1_IN_FS_REG_SRC_IN_FS_Pos  (0UL)                     /*!< SRC_IN_FS (Bit 0)                                     */\n#define APU_SRC1_IN_FS_REG_SRC_IN_FS_Msk  (0xffffffUL)              /*!< SRC_IN_FS (Bitfield-Mask: 0xffffff)                   */\n/* =====================================================  SRC1_OUT1_REG  ===================================================== */\n#define APU_SRC1_OUT1_REG_SRC_OUT_Pos     (0UL)                     /*!< SRC_OUT (Bit 0)                                       */\n#define APU_SRC1_OUT1_REG_SRC_OUT_Msk     (0xffffffffUL)            /*!< SRC_OUT (Bitfield-Mask: 0xffffffff)                   */\n/* =====================================================  SRC1_OUT2_REG  ===================================================== */\n#define APU_SRC1_OUT2_REG_SRC_OUT_Pos     (0UL)                     /*!< SRC_OUT (Bit 0)                                       */\n#define APU_SRC1_OUT2_REG_SRC_OUT_Msk     (0xffffffffUL)            /*!< SRC_OUT (Bitfield-Mask: 0xffffffff)                   */\n/* ====================================================  SRC1_OUT_FS_REG  ==================================================== */\n#define APU_SRC1_OUT_FS_REG_SRC_OUT_FS_Pos (0UL)                    /*!< SRC_OUT_FS (Bit 0)                                    */\n#define APU_SRC1_OUT_FS_REG_SRC_OUT_FS_Msk (0xffffffUL)             /*!< SRC_OUT_FS (Bitfield-Mask: 0xffffff)                  */\n\n\n/* =========================================================================================================================== */\n/* ================                                           CACHE                                           ================ */\n/* =========================================================================================================================== */\n\n/* ==================================================  CACHE_ASSOCCFG_REG  =================================================== */\n#define CACHE_CACHE_ASSOCCFG_REG_CACHE_ASSOC_Pos (0UL)              /*!< CACHE_ASSOC (Bit 0)                                   */\n#define CACHE_CACHE_ASSOCCFG_REG_CACHE_ASSOC_Msk (0x3UL)            /*!< CACHE_ASSOC (Bitfield-Mask: 0x03)                     */\n/* ====================================================  CACHE_CTRL1_REG  ==================================================== */\n#define CACHE_CACHE_CTRL1_REG_CACHE_RES1_Pos (1UL)                  /*!< CACHE_RES1 (Bit 1)                                    */\n#define CACHE_CACHE_CTRL1_REG_CACHE_RES1_Msk (0x2UL)                /*!< CACHE_RES1 (Bitfield-Mask: 0x01)                      */\n#define CACHE_CACHE_CTRL1_REG_CACHE_FLUSH_Pos (0UL)                 /*!< CACHE_FLUSH (Bit 0)                                   */\n#define CACHE_CACHE_CTRL1_REG_CACHE_FLUSH_Msk (0x1UL)               /*!< CACHE_FLUSH (Bitfield-Mask: 0x01)                     */\n/* ====================================================  CACHE_CTRL2_REG  ==================================================== */\n#define CACHE_CACHE_CTRL2_REG_CACHE_CGEN_Pos (10UL)                 /*!< CACHE_CGEN (Bit 10)                                   */\n#define CACHE_CACHE_CTRL2_REG_CACHE_CGEN_Msk (0x400UL)              /*!< CACHE_CGEN (Bitfield-Mask: 0x01)                      */\n#define CACHE_CACHE_CTRL2_REG_CACHE_WEN_Pos (9UL)                   /*!< CACHE_WEN (Bit 9)                                     */\n#define CACHE_CACHE_CTRL2_REG_CACHE_WEN_Msk (0x200UL)               /*!< CACHE_WEN (Bitfield-Mask: 0x01)                       */\n#define CACHE_CACHE_CTRL2_REG_CACHE_LEN_Pos (0UL)                   /*!< CACHE_LEN (Bit 0)                                     */\n#define CACHE_CACHE_CTRL2_REG_CACHE_LEN_Msk (0x1ffUL)               /*!< CACHE_LEN (Bitfield-Mask: 0x1ff)                      */\n/* ====================================================  CACHE_FLASH_REG  ==================================================== */\n#define CACHE_CACHE_FLASH_REG_FLASH_REGION_BASE_Pos (16UL)          /*!< FLASH_REGION_BASE (Bit 16)                            */\n#define CACHE_CACHE_FLASH_REG_FLASH_REGION_BASE_Msk (0xffff0000UL)  /*!< FLASH_REGION_BASE (Bitfield-Mask: 0xffff)             */\n#define CACHE_CACHE_FLASH_REG_FLASH_REGION_OFFSET_Pos (4UL)         /*!< FLASH_REGION_OFFSET (Bit 4)                           */\n#define CACHE_CACHE_FLASH_REG_FLASH_REGION_OFFSET_Msk (0xfff0UL)    /*!< FLASH_REGION_OFFSET (Bitfield-Mask: 0xfff)            */\n#define CACHE_CACHE_FLASH_REG_FLASH_REGION_SIZE_Pos (0UL)           /*!< FLASH_REGION_SIZE (Bit 0)                             */\n#define CACHE_CACHE_FLASH_REG_FLASH_REGION_SIZE_Msk (0x7UL)         /*!< FLASH_REGION_SIZE (Bitfield-Mask: 0x07)               */\n/* ==================================================  CACHE_LNSIZECFG_REG  ================================================== */\n#define CACHE_CACHE_LNSIZECFG_REG_CACHE_LINE_Pos (0UL)              /*!< CACHE_LINE (Bit 0)                                    */\n#define CACHE_CACHE_LNSIZECFG_REG_CACHE_LINE_Msk (0x3UL)            /*!< CACHE_LINE (Bitfield-Mask: 0x03)                      */\n/* ==================================================  CACHE_MRM_CTRL_REG  =================================================== */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_IRQ_HITS_THRES_STATUS_Pos (4UL) /*!< MRM_IRQ_HITS_THRES_STATUS (Bit 4)                    */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_IRQ_HITS_THRES_STATUS_Msk (0x10UL) /*!< MRM_IRQ_HITS_THRES_STATUS (Bitfield-Mask: 0x01)   */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_IRQ_MISSES_THRES_STATUS_Pos (3UL) /*!< MRM_IRQ_MISSES_THRES_STATUS (Bit 3)                */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_IRQ_MISSES_THRES_STATUS_Msk (0x8UL) /*!< MRM_IRQ_MISSES_THRES_STATUS (Bitfield-Mask: 0x01) */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_IRQ_TINT_STATUS_Pos (2UL)      /*!< MRM_IRQ_TINT_STATUS (Bit 2)                           */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_IRQ_TINT_STATUS_Msk (0x4UL)    /*!< MRM_IRQ_TINT_STATUS (Bitfield-Mask: 0x01)             */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_IRQ_MASK_Pos (1UL)             /*!< MRM_IRQ_MASK (Bit 1)                                  */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_IRQ_MASK_Msk (0x2UL)           /*!< MRM_IRQ_MASK (Bitfield-Mask: 0x01)                    */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_START_Pos (0UL)                /*!< MRM_START (Bit 0)                                     */\n#define CACHE_CACHE_MRM_CTRL_REG_MRM_START_Msk (0x1UL)              /*!< MRM_START (Bitfield-Mask: 0x01)                       */\n/* ==================================================  CACHE_MRM_HITS_REG  =================================================== */\n#define CACHE_CACHE_MRM_HITS_REG_MRM_HITS_Pos (0UL)                 /*!< MRM_HITS (Bit 0)                                      */\n#define CACHE_CACHE_MRM_HITS_REG_MRM_HITS_Msk (0xffffffffUL)        /*!< MRM_HITS (Bitfield-Mask: 0xffffffff)                  */\n/* ===============================================  CACHE_MRM_HITS_THRES_REG  ================================================ */\n#define CACHE_CACHE_MRM_HITS_THRES_REG_MRM_HITS_THRES_Pos (0UL)     /*!< MRM_HITS_THRES (Bit 0)                                */\n#define CACHE_CACHE_MRM_HITS_THRES_REG_MRM_HITS_THRES_Msk (0xffffffffUL) /*!< MRM_HITS_THRES (Bitfield-Mask: 0xffffffff)       */\n/* =================================================  CACHE_MRM_MISSES_REG  ================================================== */\n#define CACHE_CACHE_MRM_MISSES_REG_MRM_MISSES_Pos (0UL)             /*!< MRM_MISSES (Bit 0)                                    */\n#define CACHE_CACHE_MRM_MISSES_REG_MRM_MISSES_Msk (0xffffffffUL)    /*!< MRM_MISSES (Bitfield-Mask: 0xffffffff)                */\n/* ==============================================  CACHE_MRM_MISSES_THRES_REG  =============================================== */\n#define CACHE_CACHE_MRM_MISSES_THRES_REG_MRM_MISSES_THRES_Pos (0UL) /*!< MRM_MISSES_THRES (Bit 0)                              */\n#define CACHE_CACHE_MRM_MISSES_THRES_REG_MRM_MISSES_THRES_Msk (0xffffffffUL) /*!< MRM_MISSES_THRES (Bitfield-Mask: 0xffffffff) */\n/* ==================================================  CACHE_MRM_TINT_REG  =================================================== */\n#define CACHE_CACHE_MRM_TINT_REG_MRM_TINT_Pos (0UL)                 /*!< MRM_TINT (Bit 0)                                      */\n#define CACHE_CACHE_MRM_TINT_REG_MRM_TINT_Msk (0x7ffffUL)           /*!< MRM_TINT (Bitfield-Mask: 0x7ffff)                     */\n/* =====================================================  SWD_RESET_REG  ===================================================== */\n#define CACHE_SWD_RESET_REG_SWD_HW_RESET_REQ_Pos (0UL)              /*!< SWD_HW_RESET_REQ (Bit 0)                              */\n#define CACHE_SWD_RESET_REG_SWD_HW_RESET_REQ_Msk (0x1UL)            /*!< SWD_HW_RESET_REQ (Bitfield-Mask: 0x01)                */\n\n\n/* =========================================================================================================================== */\n/* ================                                          CHARGER                                          ================ */\n/* =========================================================================================================================== */\n\n/* ==============================================  CHARGER_CC_CHARGE_TIMER_REG  ============================================== */\n#define CHARGER_CHARGER_CC_CHARGE_TIMER_REG_CC_CHARGE_TIMER_Pos (16UL) /*!< CC_CHARGE_TIMER (Bit 16)                           */\n#define CHARGER_CHARGER_CC_CHARGE_TIMER_REG_CC_CHARGE_TIMER_Msk (0x7fff0000UL) /*!< CC_CHARGE_TIMER (Bitfield-Mask: 0x7fff)    */\n#define CHARGER_CHARGER_CC_CHARGE_TIMER_REG_MAX_CC_CHARGE_TIME_Pos (0UL) /*!< MAX_CC_CHARGE_TIME (Bit 0)                       */\n#define CHARGER_CHARGER_CC_CHARGE_TIMER_REG_MAX_CC_CHARGE_TIME_Msk (0x7fffUL) /*!< MAX_CC_CHARGE_TIME (Bitfield-Mask: 0x7fff)  */\n/* ===================================================  CHARGER_CTRL_REG  ==================================================== */\n#define CHARGER_CHARGER_CTRL_REG_EOC_INTERVAL_CHECK_TIMER_Pos (22UL) /*!< EOC_INTERVAL_CHECK_TIMER (Bit 22)                    */\n#define CHARGER_CHARGER_CTRL_REG_EOC_INTERVAL_CHECK_TIMER_Msk (0xfc00000UL) /*!< EOC_INTERVAL_CHECK_TIMER (Bitfield-Mask: 0x3f) */\n#define CHARGER_CHARGER_CTRL_REG_EOC_INTERVAL_CHECK_THRES_Pos (16UL) /*!< EOC_INTERVAL_CHECK_THRES (Bit 16)                    */\n#define CHARGER_CHARGER_CTRL_REG_EOC_INTERVAL_CHECK_THRES_Msk (0x3f0000UL) /*!< EOC_INTERVAL_CHECK_THRES (Bitfield-Mask: 0x3f) */\n#define CHARGER_CHARGER_CTRL_REG_REPLENISH_MODE_Pos (15UL)          /*!< REPLENISH_MODE (Bit 15)                               */\n#define CHARGER_CHARGER_CTRL_REG_REPLENISH_MODE_Msk (0x8000UL)      /*!< REPLENISH_MODE (Bitfield-Mask: 0x01)                  */\n#define CHARGER_CHARGER_CTRL_REG_PRE_CHARGE_MODE_Pos (14UL)         /*!< PRE_CHARGE_MODE (Bit 14)                              */\n#define CHARGER_CHARGER_CTRL_REG_PRE_CHARGE_MODE_Msk (0x4000UL)     /*!< PRE_CHARGE_MODE (Bitfield-Mask: 0x01)                 */\n#define CHARGER_CHARGER_CTRL_REG_CHARGE_LOOP_HOLD_Pos (13UL)        /*!< CHARGE_LOOP_HOLD (Bit 13)                             */\n#define CHARGER_CHARGER_CTRL_REG_CHARGE_LOOP_HOLD_Msk (0x2000UL)    /*!< CHARGE_LOOP_HOLD (Bitfield-Mask: 0x01)                */\n#define CHARGER_CHARGER_CTRL_REG_JEITA_SUPPORT_DISABLED_Pos (12UL)  /*!< JEITA_SUPPORT_DISABLED (Bit 12)                       */\n#define CHARGER_CHARGER_CTRL_REG_JEITA_SUPPORT_DISABLED_Msk (0x1000UL) /*!< JEITA_SUPPORT_DISABLED (Bitfield-Mask: 0x01)       */\n#define CHARGER_CHARGER_CTRL_REG_TBAT_MONITOR_MODE_Pos (10UL)       /*!< TBAT_MONITOR_MODE (Bit 10)                            */\n#define CHARGER_CHARGER_CTRL_REG_TBAT_MONITOR_MODE_Msk (0xc00UL)    /*!< TBAT_MONITOR_MODE (Bitfield-Mask: 0x03)               */\n#define CHARGER_CHARGER_CTRL_REG_CHARGE_TIMERS_HALT_ENABLE_Pos (9UL) /*!< CHARGE_TIMERS_HALT_ENABLE (Bit 9)                    */\n#define CHARGER_CHARGER_CTRL_REG_CHARGE_TIMERS_HALT_ENABLE_Msk (0x200UL) /*!< CHARGE_TIMERS_HALT_ENABLE (Bitfield-Mask: 0x01)  */\n#define CHARGER_CHARGER_CTRL_REG_NTC_LOW_DISABLE_Pos (7UL)          /*!< NTC_LOW_DISABLE (Bit 7)                               */\n#define CHARGER_CHARGER_CTRL_REG_NTC_LOW_DISABLE_Msk (0x80UL)       /*!< NTC_LOW_DISABLE (Bitfield-Mask: 0x01)                 */\n#define CHARGER_CHARGER_CTRL_REG_TBAT_PROT_ENABLE_Pos (6UL)         /*!< TBAT_PROT_ENABLE (Bit 6)                              */\n#define CHARGER_CHARGER_CTRL_REG_TBAT_PROT_ENABLE_Msk (0x40UL)      /*!< TBAT_PROT_ENABLE (Bitfield-Mask: 0x01)                */\n#define CHARGER_CHARGER_CTRL_REG_TDIE_ERROR_RESUME_Pos (5UL)        /*!< TDIE_ERROR_RESUME (Bit 5)                             */\n#define CHARGER_CHARGER_CTRL_REG_TDIE_ERROR_RESUME_Msk (0x20UL)     /*!< TDIE_ERROR_RESUME (Bitfield-Mask: 0x01)               */\n#define CHARGER_CHARGER_CTRL_REG_TDIE_PROT_ENABLE_Pos (4UL)         /*!< TDIE_PROT_ENABLE (Bit 4)                              */\n#define CHARGER_CHARGER_CTRL_REG_TDIE_PROT_ENABLE_Msk (0x10UL)      /*!< TDIE_PROT_ENABLE (Bitfield-Mask: 0x01)                */\n#define CHARGER_CHARGER_CTRL_REG_CHARGER_RESUME_Pos (3UL)           /*!< CHARGER_RESUME (Bit 3)                                */\n#define CHARGER_CHARGER_CTRL_REG_CHARGER_RESUME_Msk (0x8UL)         /*!< CHARGER_RESUME (Bitfield-Mask: 0x01)                  */\n#define CHARGER_CHARGER_CTRL_REG_CHARGER_BYPASS_Pos (2UL)           /*!< CHARGER_BYPASS (Bit 2)                                */\n#define CHARGER_CHARGER_CTRL_REG_CHARGER_BYPASS_Msk (0x4UL)         /*!< CHARGER_BYPASS (Bitfield-Mask: 0x01)                  */\n#define CHARGER_CHARGER_CTRL_REG_CHARGE_START_Pos (1UL)             /*!< CHARGE_START (Bit 1)                                  */\n#define CHARGER_CHARGER_CTRL_REG_CHARGE_START_Msk (0x2UL)           /*!< CHARGE_START (Bitfield-Mask: 0x01)                    */\n#define CHARGER_CHARGER_CTRL_REG_CHARGER_ENABLE_Pos (0UL)           /*!< CHARGER_ENABLE (Bit 0)                                */\n#define CHARGER_CHARGER_CTRL_REG_CHARGER_ENABLE_Msk (0x1UL)         /*!< CHARGER_ENABLE (Bitfield-Mask: 0x01)                  */\n/* ===============================================  CHARGER_CURRENT_PARAM_REG  =============================================== */\n#define CHARGER_CHARGER_CURRENT_PARAM_REG_I_EOC_DOUBLE_RANGE_Pos (15UL) /*!< I_EOC_DOUBLE_RANGE (Bit 15)                       */\n#define CHARGER_CHARGER_CURRENT_PARAM_REG_I_EOC_DOUBLE_RANGE_Msk (0x8000UL) /*!< I_EOC_DOUBLE_RANGE (Bitfield-Mask: 0x01)      */\n#define CHARGER_CHARGER_CURRENT_PARAM_REG_I_END_OF_CHARGE_Pos (12UL) /*!< I_END_OF_CHARGE (Bit 12)                             */\n#define CHARGER_CHARGER_CURRENT_PARAM_REG_I_END_OF_CHARGE_Msk (0x7000UL) /*!< I_END_OF_CHARGE (Bitfield-Mask: 0x07)            */\n#define CHARGER_CHARGER_CURRENT_PARAM_REG_I_PRECHARGE_Pos (6UL)     /*!< I_PRECHARGE (Bit 6)                                   */\n#define CHARGER_CHARGER_CURRENT_PARAM_REG_I_PRECHARGE_Msk (0xfc0UL) /*!< I_PRECHARGE (Bitfield-Mask: 0x3f)                     */\n#define CHARGER_CHARGER_CURRENT_PARAM_REG_I_CHARGE_Pos (0UL)        /*!< I_CHARGE (Bit 0)                                      */\n#define CHARGER_CHARGER_CURRENT_PARAM_REG_I_CHARGE_Msk (0x3fUL)     /*!< I_CHARGE (Bitfield-Mask: 0x3f)                        */\n/* ==============================================  CHARGER_CV_CHARGE_TIMER_REG  ============================================== */\n#define CHARGER_CHARGER_CV_CHARGE_TIMER_REG_CV_CHARGE_TIMER_Pos (16UL) /*!< CV_CHARGE_TIMER (Bit 16)                           */\n#define CHARGER_CHARGER_CV_CHARGE_TIMER_REG_CV_CHARGE_TIMER_Msk (0x7fff0000UL) /*!< CV_CHARGE_TIMER (Bitfield-Mask: 0x7fff)    */\n#define CHARGER_CHARGER_CV_CHARGE_TIMER_REG_MAX_CV_CHARGE_TIME_Pos (0UL) /*!< MAX_CV_CHARGE_TIME (Bit 0)                       */\n#define CHARGER_CHARGER_CV_CHARGE_TIMER_REG_MAX_CV_CHARGE_TIME_Msk (0x7fffUL) /*!< MAX_CV_CHARGE_TIME (Bitfield-Mask: 0x7fff)  */\n/* ===============================================  CHARGER_ERROR_IRQ_CLR_REG  =============================================== */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_TBAT_ERROR_IRQ_CLR_Pos (6UL) /*!< TBAT_ERROR_IRQ_CLR (Bit 6)                         */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_TBAT_ERROR_IRQ_CLR_Msk (0x40UL) /*!< TBAT_ERROR_IRQ_CLR (Bitfield-Mask: 0x01)        */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_TDIE_ERROR_IRQ_CLR_Pos (5UL) /*!< TDIE_ERROR_IRQ_CLR (Bit 5)                         */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_TDIE_ERROR_IRQ_CLR_Msk (0x20UL) /*!< TDIE_ERROR_IRQ_CLR (Bitfield-Mask: 0x01)        */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_VBAT_OVP_ERROR_IRQ_CLR_Pos (4UL) /*!< VBAT_OVP_ERROR_IRQ_CLR (Bit 4)                 */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_VBAT_OVP_ERROR_IRQ_CLR_Msk (0x10UL) /*!< VBAT_OVP_ERROR_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_TOTAL_CHARGE_TIMEOUT_IRQ_CLR_Pos (3UL) /*!< TOTAL_CHARGE_TIMEOUT_IRQ_CLR (Bit 3)     */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_TOTAL_CHARGE_TIMEOUT_IRQ_CLR_Msk (0x8UL) /*!< TOTAL_CHARGE_TIMEOUT_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_CV_CHARGE_TIMEOUT_IRQ_CLR_Pos (2UL) /*!< CV_CHARGE_TIMEOUT_IRQ_CLR (Bit 2)           */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_CV_CHARGE_TIMEOUT_IRQ_CLR_Msk (0x4UL) /*!< CV_CHARGE_TIMEOUT_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_CC_CHARGE_TIMEOUT_IRQ_CLR_Pos (1UL) /*!< CC_CHARGE_TIMEOUT_IRQ_CLR (Bit 1)           */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_CC_CHARGE_TIMEOUT_IRQ_CLR_Msk (0x2UL) /*!< CC_CHARGE_TIMEOUT_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_PRECHARGE_TIMEOUT_IRQ_CLR_Pos (0UL) /*!< PRECHARGE_TIMEOUT_IRQ_CLR (Bit 0)           */\n#define CHARGER_CHARGER_ERROR_IRQ_CLR_REG_PRECHARGE_TIMEOUT_IRQ_CLR_Msk (0x1UL) /*!< PRECHARGE_TIMEOUT_IRQ_CLR (Bitfield-Mask: 0x01) */\n/* ==============================================  CHARGER_ERROR_IRQ_MASK_REG  =============================================== */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_TBAT_ERROR_IRQ_EN_Pos (6UL) /*!< TBAT_ERROR_IRQ_EN (Bit 6)                          */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_TBAT_ERROR_IRQ_EN_Msk (0x40UL) /*!< TBAT_ERROR_IRQ_EN (Bitfield-Mask: 0x01)         */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_TDIE_ERROR_IRQ_EN_Pos (5UL) /*!< TDIE_ERROR_IRQ_EN (Bit 5)                          */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_TDIE_ERROR_IRQ_EN_Msk (0x20UL) /*!< TDIE_ERROR_IRQ_EN (Bitfield-Mask: 0x01)         */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_VBAT_OVP_ERROR_IRQ_EN_Pos (4UL) /*!< VBAT_OVP_ERROR_IRQ_EN (Bit 4)                  */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_VBAT_OVP_ERROR_IRQ_EN_Msk (0x10UL) /*!< VBAT_OVP_ERROR_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_TOTAL_CHARGE_TIMEOUT_IRQ_EN_Pos (3UL) /*!< TOTAL_CHARGE_TIMEOUT_IRQ_EN (Bit 3)      */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_TOTAL_CHARGE_TIMEOUT_IRQ_EN_Msk (0x8UL) /*!< TOTAL_CHARGE_TIMEOUT_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_CV_CHARGE_TIMEOUT_IRQ_EN_Pos (2UL) /*!< CV_CHARGE_TIMEOUT_IRQ_EN (Bit 2)            */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_CV_CHARGE_TIMEOUT_IRQ_EN_Msk (0x4UL) /*!< CV_CHARGE_TIMEOUT_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_CC_CHARGE_TIMEOUT_IRQ_EN_Pos (1UL) /*!< CC_CHARGE_TIMEOUT_IRQ_EN (Bit 1)            */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_CC_CHARGE_TIMEOUT_IRQ_EN_Msk (0x2UL) /*!< CC_CHARGE_TIMEOUT_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_PRECHARGE_TIMEOUT_IRQ_EN_Pos (0UL) /*!< PRECHARGE_TIMEOUT_IRQ_EN (Bit 0)            */\n#define CHARGER_CHARGER_ERROR_IRQ_MASK_REG_PRECHARGE_TIMEOUT_IRQ_EN_Msk (0x1UL) /*!< PRECHARGE_TIMEOUT_IRQ_EN (Bitfield-Mask: 0x01) */\n/* =============================================  CHARGER_ERROR_IRQ_STATUS_REG  ============================================== */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_TBAT_ERROR_IRQ_Pos (6UL) /*!< TBAT_ERROR_IRQ (Bit 6)                              */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_TBAT_ERROR_IRQ_Msk (0x40UL) /*!< TBAT_ERROR_IRQ (Bitfield-Mask: 0x01)             */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_TDIE_ERROR_IRQ_Pos (5UL) /*!< TDIE_ERROR_IRQ (Bit 5)                              */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_TDIE_ERROR_IRQ_Msk (0x20UL) /*!< TDIE_ERROR_IRQ (Bitfield-Mask: 0x01)             */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_VBAT_OVP_ERROR_IRQ_Pos (4UL) /*!< VBAT_OVP_ERROR_IRQ (Bit 4)                      */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_VBAT_OVP_ERROR_IRQ_Msk (0x10UL) /*!< VBAT_OVP_ERROR_IRQ (Bitfield-Mask: 0x01)     */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_TOTAL_CHARGE_TIMEOUT_IRQ_Pos (3UL) /*!< TOTAL_CHARGE_TIMEOUT_IRQ (Bit 3)          */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_TOTAL_CHARGE_TIMEOUT_IRQ_Msk (0x8UL) /*!< TOTAL_CHARGE_TIMEOUT_IRQ (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_CV_CHARGE_TIMEOUT_IRQ_Pos (2UL) /*!< CV_CHARGE_TIMEOUT_IRQ (Bit 2)                */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_CV_CHARGE_TIMEOUT_IRQ_Msk (0x4UL) /*!< CV_CHARGE_TIMEOUT_IRQ (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_CC_CHARGE_TIMEOUT_IRQ_Pos (1UL) /*!< CC_CHARGE_TIMEOUT_IRQ (Bit 1)                */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_CC_CHARGE_TIMEOUT_IRQ_Msk (0x2UL) /*!< CC_CHARGE_TIMEOUT_IRQ (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_PRECHARGE_TIMEOUT_IRQ_Pos (0UL) /*!< PRECHARGE_TIMEOUT_IRQ (Bit 0)                */\n#define CHARGER_CHARGER_ERROR_IRQ_STATUS_REG_PRECHARGE_TIMEOUT_IRQ_Msk (0x1UL) /*!< PRECHARGE_TIMEOUT_IRQ (Bitfield-Mask: 0x01) */\n/* ===============================================  CHARGER_JEITA_CURRENT_REG  =============================================== */\n#define CHARGER_CHARGER_JEITA_CURRENT_REG_I_PRECHARGE_TWARM_Pos (18UL) /*!< I_PRECHARGE_TWARM (Bit 18)                         */\n#define CHARGER_CHARGER_JEITA_CURRENT_REG_I_PRECHARGE_TWARM_Msk (0xfc0000UL) /*!< I_PRECHARGE_TWARM (Bitfield-Mask: 0x3f)      */\n#define CHARGER_CHARGER_JEITA_CURRENT_REG_I_PRECHARGE_TCOOL_Pos (12UL) /*!< I_PRECHARGE_TCOOL (Bit 12)                         */\n#define CHARGER_CHARGER_JEITA_CURRENT_REG_I_PRECHARGE_TCOOL_Msk (0x3f000UL) /*!< I_PRECHARGE_TCOOL (Bitfield-Mask: 0x3f)       */\n#define CHARGER_CHARGER_JEITA_CURRENT_REG_I_CHARGE_TWARM_Pos (6UL)  /*!< I_CHARGE_TWARM (Bit 6)                                */\n#define CHARGER_CHARGER_JEITA_CURRENT_REG_I_CHARGE_TWARM_Msk (0xfc0UL) /*!< I_CHARGE_TWARM (Bitfield-Mask: 0x3f)               */\n#define CHARGER_CHARGER_JEITA_CURRENT_REG_I_CHARGE_TCOOL_Pos (0UL)  /*!< I_CHARGE_TCOOL (Bit 0)                                */\n#define CHARGER_CHARGER_JEITA_CURRENT_REG_I_CHARGE_TCOOL_Msk (0x3fUL) /*!< I_CHARGE_TCOOL (Bitfield-Mask: 0x3f)                */\n/* ==============================================  CHARGER_JEITA_V_CHARGE_REG  =============================================== */\n#define CHARGER_CHARGER_JEITA_V_CHARGE_REG_V_CHARGE_TWARM_Pos (6UL) /*!< V_CHARGE_TWARM (Bit 6)                                */\n#define CHARGER_CHARGER_JEITA_V_CHARGE_REG_V_CHARGE_TWARM_Msk (0xfc0UL) /*!< V_CHARGE_TWARM (Bitfield-Mask: 0x3f)              */\n#define CHARGER_CHARGER_JEITA_V_CHARGE_REG_V_CHARGE_TCOOL_Pos (0UL) /*!< V_CHARGE_TCOOL (Bit 0)                                */\n#define CHARGER_CHARGER_JEITA_V_CHARGE_REG_V_CHARGE_TCOOL_Msk (0x3fUL) /*!< V_CHARGE_TCOOL (Bitfield-Mask: 0x3f)               */\n/* ================================================  CHARGER_JEITA_V_OVP_REG  ================================================ */\n#define CHARGER_CHARGER_JEITA_V_OVP_REG_V_OVP_TWARM_Pos (6UL)       /*!< V_OVP_TWARM (Bit 6)                                   */\n#define CHARGER_CHARGER_JEITA_V_OVP_REG_V_OVP_TWARM_Msk (0xfc0UL)   /*!< V_OVP_TWARM (Bitfield-Mask: 0x3f)                     */\n#define CHARGER_CHARGER_JEITA_V_OVP_REG_V_OVP_TCOOL_Pos (0UL)       /*!< V_OVP_TCOOL (Bit 0)                                   */\n#define CHARGER_CHARGER_JEITA_V_OVP_REG_V_OVP_TCOOL_Msk (0x3fUL)    /*!< V_OVP_TCOOL (Bitfield-Mask: 0x3f)                     */\n/* =============================================  CHARGER_JEITA_V_PRECHARGE_REG  ============================================= */\n#define CHARGER_CHARGER_JEITA_V_PRECHARGE_REG_V_PRECHARGE_TWARM_Pos (6UL) /*!< V_PRECHARGE_TWARM (Bit 6)                       */\n#define CHARGER_CHARGER_JEITA_V_PRECHARGE_REG_V_PRECHARGE_TWARM_Msk (0xfc0UL) /*!< V_PRECHARGE_TWARM (Bitfield-Mask: 0x3f)     */\n#define CHARGER_CHARGER_JEITA_V_PRECHARGE_REG_V_PRECHARGE_TCOOL_Pos (0UL) /*!< V_PRECHARGE_TCOOL (Bit 0)                       */\n#define CHARGER_CHARGER_JEITA_V_PRECHARGE_REG_V_PRECHARGE_TCOOL_Msk (0x3fUL) /*!< V_PRECHARGE_TCOOL (Bitfield-Mask: 0x3f)      */\n/* =============================================  CHARGER_JEITA_V_REPLENISH_REG  ============================================= */\n#define CHARGER_CHARGER_JEITA_V_REPLENISH_REG_V_REPLENISH_TWARM_Pos (6UL) /*!< V_REPLENISH_TWARM (Bit 6)                       */\n#define CHARGER_CHARGER_JEITA_V_REPLENISH_REG_V_REPLENISH_TWARM_Msk (0xfc0UL) /*!< V_REPLENISH_TWARM (Bitfield-Mask: 0x3f)     */\n#define CHARGER_CHARGER_JEITA_V_REPLENISH_REG_V_REPLENISH_TCOOL_Pos (0UL) /*!< V_REPLENISH_TCOOL (Bit 0)                       */\n#define CHARGER_CHARGER_JEITA_V_REPLENISH_REG_V_REPLENISH_TCOOL_Msk (0x3fUL) /*!< V_REPLENISH_TCOOL (Bitfield-Mask: 0x3f)      */\n/* =============================================  CHARGER_PRE_CHARGE_TIMER_REG  ============================================== */\n#define CHARGER_CHARGER_PRE_CHARGE_TIMER_REG_PRE_CHARGE_TIMER_Pos (16UL) /*!< PRE_CHARGE_TIMER (Bit 16)                        */\n#define CHARGER_CHARGER_PRE_CHARGE_TIMER_REG_PRE_CHARGE_TIMER_Msk (0x7fff0000UL) /*!< PRE_CHARGE_TIMER (Bitfield-Mask: 0x7fff) */\n#define CHARGER_CHARGER_PRE_CHARGE_TIMER_REG_MAX_PRE_CHARGE_TIME_Pos (0UL) /*!< MAX_PRE_CHARGE_TIME (Bit 0)                    */\n#define CHARGER_CHARGER_PRE_CHARGE_TIMER_REG_MAX_PRE_CHARGE_TIME_Msk (0x7fffUL) /*!< MAX_PRE_CHARGE_TIME (Bitfield-Mask: 0x7fff) */\n/* ===============================================  CHARGER_PWR_UP_TIMER_REG  ================================================ */\n#define CHARGER_CHARGER_PWR_UP_TIMER_REG_CHARGER_PWR_UP_TIMER_Pos (16UL) /*!< CHARGER_PWR_UP_TIMER (Bit 16)                    */\n#define CHARGER_CHARGER_PWR_UP_TIMER_REG_CHARGER_PWR_UP_TIMER_Msk (0x3ff0000UL) /*!< CHARGER_PWR_UP_TIMER (Bitfield-Mask: 0x3ff) */\n#define CHARGER_CHARGER_PWR_UP_TIMER_REG_CHARGER_PWR_UP_SETTLING_Pos (0UL) /*!< CHARGER_PWR_UP_SETTLING (Bit 0)                */\n#define CHARGER_CHARGER_PWR_UP_TIMER_REG_CHARGER_PWR_UP_SETTLING_Msk (0x3ffUL) /*!< CHARGER_PWR_UP_SETTLING (Bitfield-Mask: 0x3ff) */\n/* ===============================================  CHARGER_STATE_IRQ_CLR_REG  =============================================== */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CV_TO_PRECHARGE_IRQ_CLR_Pos (11UL) /*!< CV_TO_PRECHARGE_IRQ_CLR (Bit 11)             */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CV_TO_PRECHARGE_IRQ_CLR_Msk (0x800UL) /*!< CV_TO_PRECHARGE_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CC_TO_PRECHARGE_IRQ_CLR_Pos (10UL) /*!< CC_TO_PRECHARGE_IRQ_CLR (Bit 10)             */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CC_TO_PRECHARGE_IRQ_CLR_Msk (0x400UL) /*!< CC_TO_PRECHARGE_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CV_TO_CC_IRQ_CLR_Pos (9UL) /*!< CV_TO_CC_IRQ_CLR (Bit 9)                             */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CV_TO_CC_IRQ_CLR_Msk (0x200UL) /*!< CV_TO_CC_IRQ_CLR (Bitfield-Mask: 0x01)           */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_TBAT_STATUS_UPDATE_IRQ_CLR_Pos (8UL) /*!< TBAT_STATUS_UPDATE_IRQ_CLR (Bit 8)         */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_TBAT_STATUS_UPDATE_IRQ_CLR_Msk (0x100UL) /*!< TBAT_STATUS_UPDATE_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_TBAT_PROT_TO_PRECHARGE_IRQ_CLR_Pos (7UL) /*!< TBAT_PROT_TO_PRECHARGE_IRQ_CLR (Bit 7) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_TBAT_PROT_TO_PRECHARGE_IRQ_CLR_Msk (0x80UL) /*!< TBAT_PROT_TO_PRECHARGE_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_TDIE_PROT_TO_PRECHARGE_IRQ_CLR_Pos (6UL) /*!< TDIE_PROT_TO_PRECHARGE_IRQ_CLR (Bit 6) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_TDIE_PROT_TO_PRECHARGE_IRQ_CLR_Msk (0x40UL) /*!< TDIE_PROT_TO_PRECHARGE_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_EOC_TO_PRECHARGE_IRQ_CLR_Pos (5UL) /*!< EOC_TO_PRECHARGE_IRQ_CLR (Bit 5)             */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_EOC_TO_PRECHARGE_IRQ_CLR_Msk (0x20UL) /*!< EOC_TO_PRECHARGE_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CV_TO_EOC_IRQ_CLR_Pos (4UL) /*!< CV_TO_EOC_IRQ_CLR (Bit 4)                           */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CV_TO_EOC_IRQ_CLR_Msk (0x10UL) /*!< CV_TO_EOC_IRQ_CLR (Bitfield-Mask: 0x01)          */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CC_TO_EOC_IRQ_CLR_Pos (3UL) /*!< CC_TO_EOC_IRQ_CLR (Bit 3)                           */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CC_TO_EOC_IRQ_CLR_Msk (0x8UL) /*!< CC_TO_EOC_IRQ_CLR (Bitfield-Mask: 0x01)           */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CC_TO_CV_IRQ_CLR_Pos (2UL) /*!< CC_TO_CV_IRQ_CLR (Bit 2)                             */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_CC_TO_CV_IRQ_CLR_Msk (0x4UL) /*!< CC_TO_CV_IRQ_CLR (Bitfield-Mask: 0x01)             */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_PRECHARGE_TO_CC_IRQ_CLR_Pos (1UL) /*!< PRECHARGE_TO_CC_IRQ_CLR (Bit 1)               */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_PRECHARGE_TO_CC_IRQ_CLR_Msk (0x2UL) /*!< PRECHARGE_TO_CC_IRQ_CLR (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_DISABLED_TO_PRECHARGE_IRQ_CLR_Pos (0UL) /*!< DISABLED_TO_PRECHARGE_IRQ_CLR (Bit 0)   */\n#define CHARGER_CHARGER_STATE_IRQ_CLR_REG_DISABLED_TO_PRECHARGE_IRQ_CLR_Msk (0x1UL) /*!< DISABLED_TO_PRECHARGE_IRQ_CLR (Bitfield-Mask: 0x01) */\n/* ==============================================  CHARGER_STATE_IRQ_MASK_REG  =============================================== */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CV_TO_PRECHARGE_IRQ_EN_Pos (11UL) /*!< CV_TO_PRECHARGE_IRQ_EN (Bit 11)              */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CV_TO_PRECHARGE_IRQ_EN_Msk (0x800UL) /*!< CV_TO_PRECHARGE_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CC_TO_PRECHARGE_IRQ_EN_Pos (10UL) /*!< CC_TO_PRECHARGE_IRQ_EN (Bit 10)              */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CC_TO_PRECHARGE_IRQ_EN_Msk (0x400UL) /*!< CC_TO_PRECHARGE_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CV_TO_CC_IRQ_EN_Pos (9UL) /*!< CV_TO_CC_IRQ_EN (Bit 9)                              */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CV_TO_CC_IRQ_EN_Msk (0x200UL) /*!< CV_TO_CC_IRQ_EN (Bitfield-Mask: 0x01)            */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_TBAT_STATUS_UPDATE_IRQ_EN_Pos (8UL) /*!< TBAT_STATUS_UPDATE_IRQ_EN (Bit 8)          */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_TBAT_STATUS_UPDATE_IRQ_EN_Msk (0x100UL) /*!< TBAT_STATUS_UPDATE_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_TBAT_PROT_TO_PRECHARGE_IRQ_EN_Pos (7UL) /*!< TBAT_PROT_TO_PRECHARGE_IRQ_EN (Bit 7)  */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_TBAT_PROT_TO_PRECHARGE_IRQ_EN_Msk (0x80UL) /*!< TBAT_PROT_TO_PRECHARGE_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_TDIE_PROT_TO_PRECHARGE_IRQ_EN_Pos (6UL) /*!< TDIE_PROT_TO_PRECHARGE_IRQ_EN (Bit 6)  */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_TDIE_PROT_TO_PRECHARGE_IRQ_EN_Msk (0x40UL) /*!< TDIE_PROT_TO_PRECHARGE_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_EOC_TO_PRECHARGE_IRQ_EN_Pos (5UL) /*!< EOC_TO_PRECHARGE_IRQ_EN (Bit 5)              */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_EOC_TO_PRECHARGE_IRQ_EN_Msk (0x20UL) /*!< EOC_TO_PRECHARGE_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CV_TO_EOC_IRQ_EN_Pos (4UL) /*!< CV_TO_EOC_IRQ_EN (Bit 4)                            */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CV_TO_EOC_IRQ_EN_Msk (0x10UL) /*!< CV_TO_EOC_IRQ_EN (Bitfield-Mask: 0x01)           */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CC_TO_EOC_IRQ_EN_Pos (3UL) /*!< CC_TO_EOC_IRQ_EN (Bit 3)                            */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CC_TO_EOC_IRQ_EN_Msk (0x8UL) /*!< CC_TO_EOC_IRQ_EN (Bitfield-Mask: 0x01)            */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CC_TO_CV_IRQ_EN_Pos (2UL) /*!< CC_TO_CV_IRQ_EN (Bit 2)                              */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_CC_TO_CV_IRQ_EN_Msk (0x4UL) /*!< CC_TO_CV_IRQ_EN (Bitfield-Mask: 0x01)              */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_PRECHARGE_TO_CC_IRQ_EN_Pos (1UL) /*!< PRECHARGE_TO_CC_IRQ_EN (Bit 1)                */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_PRECHARGE_TO_CC_IRQ_EN_Msk (0x2UL) /*!< PRECHARGE_TO_CC_IRQ_EN (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_DISABLED_TO_PRECHARGE_IRQ_EN_Pos (0UL) /*!< DISABLED_TO_PRECHARGE_IRQ_EN (Bit 0)    */\n#define CHARGER_CHARGER_STATE_IRQ_MASK_REG_DISABLED_TO_PRECHARGE_IRQ_EN_Msk (0x1UL) /*!< DISABLED_TO_PRECHARGE_IRQ_EN (Bitfield-Mask: 0x01) */\n/* =============================================  CHARGER_STATE_IRQ_STATUS_REG  ============================================== */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CV_TO_PRECHARGE_IRQ_Pos (11UL) /*!< CV_TO_PRECHARGE_IRQ (Bit 11)                  */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CV_TO_PRECHARGE_IRQ_Msk (0x800UL) /*!< CV_TO_PRECHARGE_IRQ (Bitfield-Mask: 0x01)  */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CC_TO_PRECHARGE_IRQ_Pos (10UL) /*!< CC_TO_PRECHARGE_IRQ (Bit 10)                  */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CC_TO_PRECHARGE_IRQ_Msk (0x400UL) /*!< CC_TO_PRECHARGE_IRQ (Bitfield-Mask: 0x01)  */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CV_TO_CC_IRQ_Pos (9UL) /*!< CV_TO_CC_IRQ (Bit 9)                                  */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CV_TO_CC_IRQ_Msk (0x200UL) /*!< CV_TO_CC_IRQ (Bitfield-Mask: 0x01)                */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_TBAT_STATUS_UPDATE_IRQ_Pos (8UL) /*!< TBAT_STATUS_UPDATE_IRQ (Bit 8)              */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_TBAT_STATUS_UPDATE_IRQ_Msk (0x100UL) /*!< TBAT_STATUS_UPDATE_IRQ (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_TBAT_PROT_TO_PRECHARGE_IRQ_Pos (7UL) /*!< TBAT_PROT_TO_PRECHARGE_IRQ (Bit 7)      */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_TBAT_PROT_TO_PRECHARGE_IRQ_Msk (0x80UL) /*!< TBAT_PROT_TO_PRECHARGE_IRQ (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_TDIE_PROT_TO_PRECHARGE_IRQ_Pos (6UL) /*!< TDIE_PROT_TO_PRECHARGE_IRQ (Bit 6)      */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_TDIE_PROT_TO_PRECHARGE_IRQ_Msk (0x40UL) /*!< TDIE_PROT_TO_PRECHARGE_IRQ (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_EOC_TO_PRECHARGE_IRQ_Pos (5UL) /*!< EOC_TO_PRECHARGE_IRQ (Bit 5)                  */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_EOC_TO_PRECHARGE_IRQ_Msk (0x20UL) /*!< EOC_TO_PRECHARGE_IRQ (Bitfield-Mask: 0x01) */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CV_TO_EOC_IRQ_Pos (4UL) /*!< CV_TO_EOC_IRQ (Bit 4)                                */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CV_TO_EOC_IRQ_Msk (0x10UL) /*!< CV_TO_EOC_IRQ (Bitfield-Mask: 0x01)               */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CC_TO_EOC_IRQ_Pos (3UL) /*!< CC_TO_EOC_IRQ (Bit 3)                                */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CC_TO_EOC_IRQ_Msk (0x8UL) /*!< CC_TO_EOC_IRQ (Bitfield-Mask: 0x01)                */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CC_TO_CV_IRQ_Pos (2UL) /*!< CC_TO_CV_IRQ (Bit 2)                                  */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_CC_TO_CV_IRQ_Msk (0x4UL) /*!< CC_TO_CV_IRQ (Bitfield-Mask: 0x01)                  */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_PRECHARGE_TO_CC_IRQ_Pos (1UL) /*!< PRECHARGE_TO_CC_IRQ (Bit 1)                    */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_PRECHARGE_TO_CC_IRQ_Msk (0x2UL) /*!< PRECHARGE_TO_CC_IRQ (Bitfield-Mask: 0x01)    */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_DISABLED_TO_PRECHARGE_IRQ_Pos (0UL) /*!< DISABLED_TO_PRECHARGE_IRQ (Bit 0)        */\n#define CHARGER_CHARGER_STATE_IRQ_STATUS_REG_DISABLED_TO_PRECHARGE_IRQ_Msk (0x1UL) /*!< DISABLED_TO_PRECHARGE_IRQ (Bitfield-Mask: 0x01) */\n/* ==================================================  CHARGER_STATUS_REG  =================================================== */\n#define CHARGER_CHARGER_STATUS_REG_OVP_EVENTS_DEBOUNCE_CNT_Pos (27UL) /*!< OVP_EVENTS_DEBOUNCE_CNT (Bit 27)                    */\n#define CHARGER_CHARGER_STATUS_REG_OVP_EVENTS_DEBOUNCE_CNT_Msk (0x38000000UL) /*!< OVP_EVENTS_DEBOUNCE_CNT (Bitfield-Mask: 0x07) */\n#define CHARGER_CHARGER_STATUS_REG_EOC_EVENTS_DEBOUNCE_CNT_Pos (24UL) /*!< EOC_EVENTS_DEBOUNCE_CNT (Bit 24)                    */\n#define CHARGER_CHARGER_STATUS_REG_EOC_EVENTS_DEBOUNCE_CNT_Msk (0x7000000UL) /*!< EOC_EVENTS_DEBOUNCE_CNT (Bitfield-Mask: 0x07) */\n#define CHARGER_CHARGER_STATUS_REG_TDIE_ERROR_DEBOUNCE_CNT_Pos (21UL) /*!< TDIE_ERROR_DEBOUNCE_CNT (Bit 21)                    */\n#define CHARGER_CHARGER_STATUS_REG_TDIE_ERROR_DEBOUNCE_CNT_Msk (0xe00000UL) /*!< TDIE_ERROR_DEBOUNCE_CNT (Bitfield-Mask: 0x07) */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_JEITA_STATE_Pos (18UL)   /*!< CHARGER_JEITA_STATE (Bit 18)                          */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_JEITA_STATE_Msk (0x1c0000UL) /*!< CHARGER_JEITA_STATE (Bitfield-Mask: 0x07)         */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_STATE_Pos (14UL)         /*!< CHARGER_STATE (Bit 14)                                */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_STATE_Msk (0x3c000UL)    /*!< CHARGER_STATE (Bitfield-Mask: 0x0f)                   */\n#define CHARGER_CHARGER_STATUS_REG_TBAT_STATUS_Pos (9UL)            /*!< TBAT_STATUS (Bit 9)                                   */\n#define CHARGER_CHARGER_STATUS_REG_TBAT_STATUS_Msk (0x3e00UL)       /*!< TBAT_STATUS (Bitfield-Mask: 0x1f)                     */\n#define CHARGER_CHARGER_STATUS_REG_MAIN_TBAT_COMP_OUT_Pos (8UL)     /*!< MAIN_TBAT_COMP_OUT (Bit 8)                            */\n#define CHARGER_CHARGER_STATUS_REG_MAIN_TBAT_COMP_OUT_Msk (0x100UL) /*!< MAIN_TBAT_COMP_OUT (Bitfield-Mask: 0x01)              */\n#define CHARGER_CHARGER_STATUS_REG_TBAT_HOT_COMP_OUT_Pos (7UL)      /*!< TBAT_HOT_COMP_OUT (Bit 7)                             */\n#define CHARGER_CHARGER_STATUS_REG_TBAT_HOT_COMP_OUT_Msk (0x80UL)   /*!< TBAT_HOT_COMP_OUT (Bitfield-Mask: 0x01)               */\n#define CHARGER_CHARGER_STATUS_REG_TDIE_COMP_OUT_Pos (6UL)          /*!< TDIE_COMP_OUT (Bit 6)                                 */\n#define CHARGER_CHARGER_STATUS_REG_TDIE_COMP_OUT_Msk (0x40UL)       /*!< TDIE_COMP_OUT (Bitfield-Mask: 0x01)                   */\n#define CHARGER_CHARGER_STATUS_REG_VBAT_OVP_COMP_OUT_Pos (5UL)      /*!< VBAT_OVP_COMP_OUT (Bit 5)                             */\n#define CHARGER_CHARGER_STATUS_REG_VBAT_OVP_COMP_OUT_Msk (0x20UL)   /*!< VBAT_OVP_COMP_OUT (Bitfield-Mask: 0x01)               */\n#define CHARGER_CHARGER_STATUS_REG_MAIN_VBAT_COMP_OUT_Pos (4UL)     /*!< MAIN_VBAT_COMP_OUT (Bit 4)                            */\n#define CHARGER_CHARGER_STATUS_REG_MAIN_VBAT_COMP_OUT_Msk (0x10UL)  /*!< MAIN_VBAT_COMP_OUT (Bitfield-Mask: 0x01)              */\n#define CHARGER_CHARGER_STATUS_REG_END_OF_CHARGE_Pos (3UL)          /*!< END_OF_CHARGE (Bit 3)                                 */\n#define CHARGER_CHARGER_STATUS_REG_END_OF_CHARGE_Msk (0x8UL)        /*!< END_OF_CHARGE (Bitfield-Mask: 0x01)                   */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_CV_MODE_Pos (2UL)        /*!< CHARGER_CV_MODE (Bit 2)                               */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_CV_MODE_Msk (0x4UL)      /*!< CHARGER_CV_MODE (Bitfield-Mask: 0x01)                 */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_CC_MODE_Pos (1UL)        /*!< CHARGER_CC_MODE (Bit 1)                               */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_CC_MODE_Msk (0x2UL)      /*!< CHARGER_CC_MODE (Bitfield-Mask: 0x01)                 */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_IS_POWERED_UP_Pos (0UL)  /*!< CHARGER_IS_POWERED_UP (Bit 0)                         */\n#define CHARGER_CHARGER_STATUS_REG_CHARGER_IS_POWERED_UP_Msk (0x1UL) /*!< CHARGER_IS_POWERED_UP (Bitfield-Mask: 0x01)          */\n/* ==============================================  CHARGER_TBAT_COMP_TIMER_REG  ============================================== */\n#define CHARGER_CHARGER_TBAT_COMP_TIMER_REG_TBAT_COMP_TIMER_Pos (16UL) /*!< TBAT_COMP_TIMER (Bit 16)                           */\n#define CHARGER_CHARGER_TBAT_COMP_TIMER_REG_TBAT_COMP_TIMER_Msk (0x3ff0000UL) /*!< TBAT_COMP_TIMER (Bitfield-Mask: 0x3ff)      */\n#define CHARGER_CHARGER_TBAT_COMP_TIMER_REG_TBAT_COMP_SETTLING_Pos (0UL) /*!< TBAT_COMP_SETTLING (Bit 0)                       */\n#define CHARGER_CHARGER_TBAT_COMP_TIMER_REG_TBAT_COMP_SETTLING_Msk (0x3ffUL) /*!< TBAT_COMP_SETTLING (Bitfield-Mask: 0x3ff)    */\n/* ==============================================  CHARGER_TBAT_MON_TIMER_REG  =============================================== */\n#define CHARGER_CHARGER_TBAT_MON_TIMER_REG_TBAT_MON_TIMER_Pos (16UL) /*!< TBAT_MON_TIMER (Bit 16)                              */\n#define CHARGER_CHARGER_TBAT_MON_TIMER_REG_TBAT_MON_TIMER_Msk (0x3ff0000UL) /*!< TBAT_MON_TIMER (Bitfield-Mask: 0x3ff)         */\n#define CHARGER_CHARGER_TBAT_MON_TIMER_REG_TBAT_MON_INTERVAL_Pos (0UL) /*!< TBAT_MON_INTERVAL (Bit 0)                          */\n#define CHARGER_CHARGER_TBAT_MON_TIMER_REG_TBAT_MON_INTERVAL_Msk (0x3ffUL) /*!< TBAT_MON_INTERVAL (Bitfield-Mask: 0x3ff)       */\n/* ==============================================  CHARGER_TDIE_COMP_TIMER_REG  ============================================== */\n#define CHARGER_CHARGER_TDIE_COMP_TIMER_REG_TDIE_COMP_TIMER_Pos (16UL) /*!< TDIE_COMP_TIMER (Bit 16)                           */\n#define CHARGER_CHARGER_TDIE_COMP_TIMER_REG_TDIE_COMP_TIMER_Msk (0x3ff0000UL) /*!< TDIE_COMP_TIMER (Bitfield-Mask: 0x3ff)      */\n#define CHARGER_CHARGER_TDIE_COMP_TIMER_REG_TDIE_COMP_SETTLING_Pos (0UL) /*!< TDIE_COMP_SETTLING (Bit 0)                       */\n#define CHARGER_CHARGER_TDIE_COMP_TIMER_REG_TDIE_COMP_SETTLING_Msk (0x3ffUL) /*!< TDIE_COMP_SETTLING (Bitfield-Mask: 0x3ff)    */\n/* ===============================================  CHARGER_TEMPSET_PARAM_REG  =============================================== */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TDIE_MAX_Pos (24UL)       /*!< TDIE_MAX (Bit 24)                                     */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TDIE_MAX_Msk (0x7000000UL) /*!< TDIE_MAX (Bitfield-Mask: 0x07)                       */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TBAT_HOT_Pos (18UL)       /*!< TBAT_HOT (Bit 18)                                     */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TBAT_HOT_Msk (0xfc0000UL) /*!< TBAT_HOT (Bitfield-Mask: 0x3f)                        */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TBAT_WARM_Pos (12UL)      /*!< TBAT_WARM (Bit 12)                                    */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TBAT_WARM_Msk (0x3f000UL) /*!< TBAT_WARM (Bitfield-Mask: 0x3f)                       */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TBAT_COOL_Pos (6UL)       /*!< TBAT_COOL (Bit 6)                                     */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TBAT_COOL_Msk (0xfc0UL)   /*!< TBAT_COOL (Bitfield-Mask: 0x3f)                       */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TBAT_COLD_Pos (0UL)       /*!< TBAT_COLD (Bit 0)                                     */\n#define CHARGER_CHARGER_TEMPSET_PARAM_REG_TBAT_COLD_Msk (0x3fUL)    /*!< TBAT_COLD (Bitfield-Mask: 0x3f)                       */\n/* =================================================  CHARGER_TEST_CTRL_REG  ================================================= */\n/* ==============================================  CHARGER_THOT_COMP_TIMER_REG  ============================================== */\n#define CHARGER_CHARGER_THOT_COMP_TIMER_REG_THOT_COMP_TIMER_Pos (16UL) /*!< THOT_COMP_TIMER (Bit 16)                           */\n#define CHARGER_CHARGER_THOT_COMP_TIMER_REG_THOT_COMP_TIMER_Msk (0x3ff0000UL) /*!< THOT_COMP_TIMER (Bitfield-Mask: 0x3ff)      */\n#define CHARGER_CHARGER_THOT_COMP_TIMER_REG_THOT_COMP_SETTLING_Pos (0UL) /*!< THOT_COMP_SETTLING (Bit 0)                       */\n#define CHARGER_CHARGER_THOT_COMP_TIMER_REG_THOT_COMP_SETTLING_Msk (0x3ffUL) /*!< THOT_COMP_SETTLING (Bitfield-Mask: 0x3ff)    */\n/* ============================================  CHARGER_TOTAL_CHARGE_TIMER_REG  ============================================= */\n#define CHARGER_CHARGER_TOTAL_CHARGE_TIMER_REG_TOTAL_CHARGE_TIMER_Pos (16UL) /*!< TOTAL_CHARGE_TIMER (Bit 16)                  */\n#define CHARGER_CHARGER_TOTAL_CHARGE_TIMER_REG_TOTAL_CHARGE_TIMER_Msk (0xffff0000UL) /*!< TOTAL_CHARGE_TIMER (Bitfield-Mask: 0xffff) */\n#define CHARGER_CHARGER_TOTAL_CHARGE_TIMER_REG_MAX_TOTAL_CHARGE_TIME_Pos (0UL) /*!< MAX_TOTAL_CHARGE_TIME (Bit 0)              */\n#define CHARGER_CHARGER_TOTAL_CHARGE_TIMER_REG_MAX_TOTAL_CHARGE_TIME_Msk (0xffffUL) /*!< MAX_TOTAL_CHARGE_TIME (Bitfield-Mask: 0xffff) */\n/* ==============================================  CHARGER_VBAT_COMP_TIMER_REG  ============================================== */\n#define CHARGER_CHARGER_VBAT_COMP_TIMER_REG_VBAT_COMP_TIMER_Pos (16UL) /*!< VBAT_COMP_TIMER (Bit 16)                           */\n#define CHARGER_CHARGER_VBAT_COMP_TIMER_REG_VBAT_COMP_TIMER_Msk (0x3ff0000UL) /*!< VBAT_COMP_TIMER (Bitfield-Mask: 0x3ff)      */\n#define CHARGER_CHARGER_VBAT_COMP_TIMER_REG_VBAT_COMP_SETTLING_Pos (0UL) /*!< VBAT_COMP_SETTLING (Bit 0)                       */\n#define CHARGER_CHARGER_VBAT_COMP_TIMER_REG_VBAT_COMP_SETTLING_Msk (0x3ffUL) /*!< VBAT_COMP_SETTLING (Bitfield-Mask: 0x3ff)    */\n/* ===============================================  CHARGER_VOLTAGE_PARAM_REG  =============================================== */\n#define CHARGER_CHARGER_VOLTAGE_PARAM_REG_V_OVP_Pos (18UL)          /*!< V_OVP (Bit 18)                                        */\n#define CHARGER_CHARGER_VOLTAGE_PARAM_REG_V_OVP_Msk (0xfc0000UL)    /*!< V_OVP (Bitfield-Mask: 0x3f)                           */\n#define CHARGER_CHARGER_VOLTAGE_PARAM_REG_V_REPLENISH_Pos (12UL)    /*!< V_REPLENISH (Bit 12)                                  */\n#define CHARGER_CHARGER_VOLTAGE_PARAM_REG_V_REPLENISH_Msk (0x3f000UL) /*!< V_REPLENISH (Bitfield-Mask: 0x3f)                   */\n#define CHARGER_CHARGER_VOLTAGE_PARAM_REG_V_PRECHARGE_Pos (6UL)     /*!< V_PRECHARGE (Bit 6)                                   */\n#define CHARGER_CHARGER_VOLTAGE_PARAM_REG_V_PRECHARGE_Msk (0xfc0UL) /*!< V_PRECHARGE (Bitfield-Mask: 0x3f)                     */\n#define CHARGER_CHARGER_VOLTAGE_PARAM_REG_V_CHARGE_Pos (0UL)        /*!< V_CHARGE (Bit 0)                                      */\n#define CHARGER_CHARGER_VOLTAGE_PARAM_REG_V_CHARGE_Msk (0x3fUL)     /*!< V_CHARGE (Bitfield-Mask: 0x3f)                        */\n/* ==============================================  CHARGER_VOVP_COMP_TIMER_REG  ============================================== */\n#define CHARGER_CHARGER_VOVP_COMP_TIMER_REG_OVP_INTERVAL_CHECK_TIMER_Pos (26UL) /*!< OVP_INTERVAL_CHECK_TIMER (Bit 26)         */\n#define CHARGER_CHARGER_VOVP_COMP_TIMER_REG_OVP_INTERVAL_CHECK_TIMER_Msk (0xfc000000UL) /*!< OVP_INTERVAL_CHECK_TIMER (Bitfield-Mask: 0x3f) */\n#define CHARGER_CHARGER_VOVP_COMP_TIMER_REG_VBAT_OVP_COMP_TIMER_Pos (16UL) /*!< VBAT_OVP_COMP_TIMER (Bit 16)                   */\n#define CHARGER_CHARGER_VOVP_COMP_TIMER_REG_VBAT_OVP_COMP_TIMER_Msk (0x3ff0000UL) /*!< VBAT_OVP_COMP_TIMER (Bitfield-Mask: 0x3ff) */\n#define CHARGER_CHARGER_VOVP_COMP_TIMER_REG_OVP_INTERVAL_CHECK_THRES_Pos (10UL) /*!< OVP_INTERVAL_CHECK_THRES (Bit 10)         */\n#define CHARGER_CHARGER_VOVP_COMP_TIMER_REG_OVP_INTERVAL_CHECK_THRES_Msk (0xfc00UL) /*!< OVP_INTERVAL_CHECK_THRES (Bitfield-Mask: 0x3f) */\n#define CHARGER_CHARGER_VOVP_COMP_TIMER_REG_VBAT_OVP_COMP_SETTLING_Pos (0UL) /*!< VBAT_OVP_COMP_SETTLING (Bit 0)               */\n#define CHARGER_CHARGER_VOVP_COMP_TIMER_REG_VBAT_OVP_COMP_SETTLING_Msk (0x3ffUL) /*!< VBAT_OVP_COMP_SETTLING (Bitfield-Mask: 0x3ff) */\n\n\n/* =========================================================================================================================== */\n/* ================                                       CHIP_VERSION                                        ================ */\n/* =========================================================================================================================== */\n\n/* =====================================================  CHIP_ID1_REG  ====================================================== */\n#define CHIP_VERSION_CHIP_ID1_REG_CHIP_ID1_Pos (0UL)                /*!< CHIP_ID1 (Bit 0)                                      */\n#define CHIP_VERSION_CHIP_ID1_REG_CHIP_ID1_Msk (0xffUL)             /*!< CHIP_ID1 (Bitfield-Mask: 0xff)                        */\n/* =====================================================  CHIP_ID2_REG  ====================================================== */\n#define CHIP_VERSION_CHIP_ID2_REG_CHIP_ID2_Pos (0UL)                /*!< CHIP_ID2 (Bit 0)                                      */\n#define CHIP_VERSION_CHIP_ID2_REG_CHIP_ID2_Msk (0xffUL)             /*!< CHIP_ID2 (Bitfield-Mask: 0xff)                        */\n/* =====================================================  CHIP_ID3_REG  ====================================================== */\n#define CHIP_VERSION_CHIP_ID3_REG_CHIP_ID3_Pos (0UL)                /*!< CHIP_ID3 (Bit 0)                                      */\n#define CHIP_VERSION_CHIP_ID3_REG_CHIP_ID3_Msk (0xffUL)             /*!< CHIP_ID3 (Bitfield-Mask: 0xff)                        */\n/* =====================================================  CHIP_ID4_REG  ====================================================== */\n#define CHIP_VERSION_CHIP_ID4_REG_CHIP_ID4_Pos (0UL)                /*!< CHIP_ID4 (Bit 0)                                      */\n#define CHIP_VERSION_CHIP_ID4_REG_CHIP_ID4_Msk (0xffUL)             /*!< CHIP_ID4 (Bitfield-Mask: 0xff)                        */\n/* ===================================================  CHIP_REVISION_REG  =================================================== */\n#define CHIP_VERSION_CHIP_REVISION_REG_CHIP_REVISION_Pos (0UL)      /*!< CHIP_REVISION (Bit 0)                                 */\n#define CHIP_VERSION_CHIP_REVISION_REG_CHIP_REVISION_Msk (0xffUL)   /*!< CHIP_REVISION (Bitfield-Mask: 0xff)                   */\n/* =====================================================  CHIP_SWC_REG  ====================================================== */\n#define CHIP_VERSION_CHIP_SWC_REG_CHIP_SWC_Pos (0UL)                /*!< CHIP_SWC (Bit 0)                                      */\n#define CHIP_VERSION_CHIP_SWC_REG_CHIP_SWC_Msk (0xfUL)              /*!< CHIP_SWC (Bitfield-Mask: 0x0f)                        */\n/* ====================================================  CHIP_TEST1_REG  ===================================================== */\n#define CHIP_VERSION_CHIP_TEST1_REG_CHIP_LAYOUT_REVISION_Pos (0UL)  /*!< CHIP_LAYOUT_REVISION (Bit 0)                          */\n#define CHIP_VERSION_CHIP_TEST1_REG_CHIP_LAYOUT_REVISION_Msk (0xffUL) /*!< CHIP_LAYOUT_REVISION (Bitfield-Mask: 0xff)          */\n/* ====================================================  CHIP_TEST2_REG  ===================================================== */\n#define CHIP_VERSION_CHIP_TEST2_REG_CHIP_METAL_OPTION_Pos (0UL)     /*!< CHIP_METAL_OPTION (Bit 0)                             */\n#define CHIP_VERSION_CHIP_TEST2_REG_CHIP_METAL_OPTION_Msk (0xfUL)   /*!< CHIP_METAL_OPTION (Bitfield-Mask: 0x0f)               */\n\n\n/* =========================================================================================================================== */\n/* ================                                          CRG_COM                                          ================ */\n/* =========================================================================================================================== */\n\n/* ======================================================  CLK_COM_REG  ====================================================== */\n#define CRG_COM_CLK_COM_REG_LCD_EXT_CLK_SEL_Pos (16UL)              /*!< LCD_EXT_CLK_SEL (Bit 16)                              */\n#define CRG_COM_CLK_COM_REG_LCD_EXT_CLK_SEL_Msk (0x30000UL)         /*!< LCD_EXT_CLK_SEL (Bitfield-Mask: 0x03)                 */\n#define CRG_COM_CLK_COM_REG_SNC_DIV_Pos   (14UL)                    /*!< SNC_DIV (Bit 14)                                      */\n#define CRG_COM_CLK_COM_REG_SNC_DIV_Msk   (0xc000UL)                /*!< SNC_DIV (Bitfield-Mask: 0x03)                         */\n#define CRG_COM_CLK_COM_REG_I2C2_CLK_SEL_Pos (12UL)                 /*!< I2C2_CLK_SEL (Bit 12)                                 */\n#define CRG_COM_CLK_COM_REG_I2C2_CLK_SEL_Msk (0x1000UL)             /*!< I2C2_CLK_SEL (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_CLK_COM_REG_I2C2_ENABLE_Pos (11UL)                  /*!< I2C2_ENABLE (Bit 11)                                  */\n#define CRG_COM_CLK_COM_REG_I2C2_ENABLE_Msk (0x800UL)               /*!< I2C2_ENABLE (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_CLK_COM_REG_I2C_CLK_SEL_Pos (10UL)                  /*!< I2C_CLK_SEL (Bit 10)                                  */\n#define CRG_COM_CLK_COM_REG_I2C_CLK_SEL_Msk (0x400UL)               /*!< I2C_CLK_SEL (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_CLK_COM_REG_I2C_ENABLE_Pos (9UL)                    /*!< I2C_ENABLE (Bit 9)                                    */\n#define CRG_COM_CLK_COM_REG_I2C_ENABLE_Msk (0x200UL)                /*!< I2C_ENABLE (Bitfield-Mask: 0x01)                      */\n#define CRG_COM_CLK_COM_REG_SPI2_CLK_SEL_Pos (8UL)                  /*!< SPI2_CLK_SEL (Bit 8)                                  */\n#define CRG_COM_CLK_COM_REG_SPI2_CLK_SEL_Msk (0x100UL)              /*!< SPI2_CLK_SEL (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_CLK_COM_REG_SPI2_ENABLE_Pos (7UL)                   /*!< SPI2_ENABLE (Bit 7)                                   */\n#define CRG_COM_CLK_COM_REG_SPI2_ENABLE_Msk (0x80UL)                /*!< SPI2_ENABLE (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_CLK_COM_REG_SPI_CLK_SEL_Pos (6UL)                   /*!< SPI_CLK_SEL (Bit 6)                                   */\n#define CRG_COM_CLK_COM_REG_SPI_CLK_SEL_Msk (0x40UL)                /*!< SPI_CLK_SEL (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_CLK_COM_REG_SPI_ENABLE_Pos (5UL)                    /*!< SPI_ENABLE (Bit 5)                                    */\n#define CRG_COM_CLK_COM_REG_SPI_ENABLE_Msk (0x20UL)                 /*!< SPI_ENABLE (Bitfield-Mask: 0x01)                      */\n#define CRG_COM_CLK_COM_REG_UART3_CLK_SEL_Pos (4UL)                 /*!< UART3_CLK_SEL (Bit 4)                                 */\n#define CRG_COM_CLK_COM_REG_UART3_CLK_SEL_Msk (0x10UL)              /*!< UART3_CLK_SEL (Bitfield-Mask: 0x01)                   */\n#define CRG_COM_CLK_COM_REG_UART3_ENABLE_Pos (3UL)                  /*!< UART3_ENABLE (Bit 3)                                  */\n#define CRG_COM_CLK_COM_REG_UART3_ENABLE_Msk (0x8UL)                /*!< UART3_ENABLE (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_CLK_COM_REG_UART2_CLK_SEL_Pos (2UL)                 /*!< UART2_CLK_SEL (Bit 2)                                 */\n#define CRG_COM_CLK_COM_REG_UART2_CLK_SEL_Msk (0x4UL)               /*!< UART2_CLK_SEL (Bitfield-Mask: 0x01)                   */\n#define CRG_COM_CLK_COM_REG_UART2_ENABLE_Pos (1UL)                  /*!< UART2_ENABLE (Bit 1)                                  */\n#define CRG_COM_CLK_COM_REG_UART2_ENABLE_Msk (0x2UL)                /*!< UART2_ENABLE (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_CLK_COM_REG_UART_ENABLE_Pos (0UL)                   /*!< UART_ENABLE (Bit 0)                                   */\n#define CRG_COM_CLK_COM_REG_UART_ENABLE_Msk (0x1UL)                 /*!< UART_ENABLE (Bitfield-Mask: 0x01)                     */\n/* ===================================================  RESET_CLK_COM_REG  =================================================== */\n#define CRG_COM_RESET_CLK_COM_REG_LCD_EXT_CLK_SEL_Pos (16UL)        /*!< LCD_EXT_CLK_SEL (Bit 16)                              */\n#define CRG_COM_RESET_CLK_COM_REG_LCD_EXT_CLK_SEL_Msk (0x30000UL)   /*!< LCD_EXT_CLK_SEL (Bitfield-Mask: 0x03)                 */\n#define CRG_COM_RESET_CLK_COM_REG_SNC_DIV_Pos (14UL)                /*!< SNC_DIV (Bit 14)                                      */\n#define CRG_COM_RESET_CLK_COM_REG_SNC_DIV_Msk (0xc000UL)            /*!< SNC_DIV (Bitfield-Mask: 0x03)                         */\n#define CRG_COM_RESET_CLK_COM_REG_I2C2_CLK_SEL_Pos (12UL)           /*!< I2C2_CLK_SEL (Bit 12)                                 */\n#define CRG_COM_RESET_CLK_COM_REG_I2C2_CLK_SEL_Msk (0x1000UL)       /*!< I2C2_CLK_SEL (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_RESET_CLK_COM_REG_I2C2_ENABLE_Pos (11UL)            /*!< I2C2_ENABLE (Bit 11)                                  */\n#define CRG_COM_RESET_CLK_COM_REG_I2C2_ENABLE_Msk (0x800UL)         /*!< I2C2_ENABLE (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_RESET_CLK_COM_REG_I2C_CLK_SEL_Pos (10UL)            /*!< I2C_CLK_SEL (Bit 10)                                  */\n#define CRG_COM_RESET_CLK_COM_REG_I2C_CLK_SEL_Msk (0x400UL)         /*!< I2C_CLK_SEL (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_RESET_CLK_COM_REG_I2C_ENABLE_Pos (9UL)              /*!< I2C_ENABLE (Bit 9)                                    */\n#define CRG_COM_RESET_CLK_COM_REG_I2C_ENABLE_Msk (0x200UL)          /*!< I2C_ENABLE (Bitfield-Mask: 0x01)                      */\n#define CRG_COM_RESET_CLK_COM_REG_SPI2_CLK_SEL_Pos (8UL)            /*!< SPI2_CLK_SEL (Bit 8)                                  */\n#define CRG_COM_RESET_CLK_COM_REG_SPI2_CLK_SEL_Msk (0x100UL)        /*!< SPI2_CLK_SEL (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_RESET_CLK_COM_REG_SPI2_ENABLE_Pos (7UL)             /*!< SPI2_ENABLE (Bit 7)                                   */\n#define CRG_COM_RESET_CLK_COM_REG_SPI2_ENABLE_Msk (0x80UL)          /*!< SPI2_ENABLE (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_RESET_CLK_COM_REG_SPI_CLK_SEL_Pos (6UL)             /*!< SPI_CLK_SEL (Bit 6)                                   */\n#define CRG_COM_RESET_CLK_COM_REG_SPI_CLK_SEL_Msk (0x40UL)          /*!< SPI_CLK_SEL (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_RESET_CLK_COM_REG_SPI_ENABLE_Pos (5UL)              /*!< SPI_ENABLE (Bit 5)                                    */\n#define CRG_COM_RESET_CLK_COM_REG_SPI_ENABLE_Msk (0x20UL)           /*!< SPI_ENABLE (Bitfield-Mask: 0x01)                      */\n#define CRG_COM_RESET_CLK_COM_REG_UART3_CLK_SEL_Pos (4UL)           /*!< UART3_CLK_SEL (Bit 4)                                 */\n#define CRG_COM_RESET_CLK_COM_REG_UART3_CLK_SEL_Msk (0x10UL)        /*!< UART3_CLK_SEL (Bitfield-Mask: 0x01)                   */\n#define CRG_COM_RESET_CLK_COM_REG_UART3_ENABLE_Pos (3UL)            /*!< UART3_ENABLE (Bit 3)                                  */\n#define CRG_COM_RESET_CLK_COM_REG_UART3_ENABLE_Msk (0x8UL)          /*!< UART3_ENABLE (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_RESET_CLK_COM_REG_UART2_CLK_SEL_Pos (2UL)           /*!< UART2_CLK_SEL (Bit 2)                                 */\n#define CRG_COM_RESET_CLK_COM_REG_UART2_CLK_SEL_Msk (0x4UL)         /*!< UART2_CLK_SEL (Bitfield-Mask: 0x01)                   */\n#define CRG_COM_RESET_CLK_COM_REG_UART2_ENABLE_Pos (1UL)            /*!< UART2_ENABLE (Bit 1)                                  */\n#define CRG_COM_RESET_CLK_COM_REG_UART2_ENABLE_Msk (0x2UL)          /*!< UART2_ENABLE (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_RESET_CLK_COM_REG_UART_ENABLE_Pos (0UL)             /*!< UART_ENABLE (Bit 0)                                   */\n#define CRG_COM_RESET_CLK_COM_REG_UART_ENABLE_Msk (0x1UL)           /*!< UART_ENABLE (Bitfield-Mask: 0x01)                     */\n/* ====================================================  SET_CLK_COM_REG  ==================================================== */\n#define CRG_COM_SET_CLK_COM_REG_LCD_EXT_CLK_SEL_Pos (16UL)          /*!< LCD_EXT_CLK_SEL (Bit 16)                              */\n#define CRG_COM_SET_CLK_COM_REG_LCD_EXT_CLK_SEL_Msk (0x30000UL)     /*!< LCD_EXT_CLK_SEL (Bitfield-Mask: 0x03)                 */\n#define CRG_COM_SET_CLK_COM_REG_SNC_DIV_Pos (14UL)                  /*!< SNC_DIV (Bit 14)                                      */\n#define CRG_COM_SET_CLK_COM_REG_SNC_DIV_Msk (0xc000UL)              /*!< SNC_DIV (Bitfield-Mask: 0x03)                         */\n#define CRG_COM_SET_CLK_COM_REG_I2C2_CLK_SEL_Pos (12UL)             /*!< I2C2_CLK_SEL (Bit 12)                                 */\n#define CRG_COM_SET_CLK_COM_REG_I2C2_CLK_SEL_Msk (0x1000UL)         /*!< I2C2_CLK_SEL (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_SET_CLK_COM_REG_I2C2_ENABLE_Pos (11UL)              /*!< I2C2_ENABLE (Bit 11)                                  */\n#define CRG_COM_SET_CLK_COM_REG_I2C2_ENABLE_Msk (0x800UL)           /*!< I2C2_ENABLE (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_SET_CLK_COM_REG_I2C_CLK_SEL_Pos (10UL)              /*!< I2C_CLK_SEL (Bit 10)                                  */\n#define CRG_COM_SET_CLK_COM_REG_I2C_CLK_SEL_Msk (0x400UL)           /*!< I2C_CLK_SEL (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_SET_CLK_COM_REG_I2C_ENABLE_Pos (9UL)                /*!< I2C_ENABLE (Bit 9)                                    */\n#define CRG_COM_SET_CLK_COM_REG_I2C_ENABLE_Msk (0x200UL)            /*!< I2C_ENABLE (Bitfield-Mask: 0x01)                      */\n#define CRG_COM_SET_CLK_COM_REG_SPI2_CLK_SEL_Pos (8UL)              /*!< SPI2_CLK_SEL (Bit 8)                                  */\n#define CRG_COM_SET_CLK_COM_REG_SPI2_CLK_SEL_Msk (0x100UL)          /*!< SPI2_CLK_SEL (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_SET_CLK_COM_REG_SPI2_ENABLE_Pos (7UL)               /*!< SPI2_ENABLE (Bit 7)                                   */\n#define CRG_COM_SET_CLK_COM_REG_SPI2_ENABLE_Msk (0x80UL)            /*!< SPI2_ENABLE (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_SET_CLK_COM_REG_SPI_CLK_SEL_Pos (6UL)               /*!< SPI_CLK_SEL (Bit 6)                                   */\n#define CRG_COM_SET_CLK_COM_REG_SPI_CLK_SEL_Msk (0x40UL)            /*!< SPI_CLK_SEL (Bitfield-Mask: 0x01)                     */\n#define CRG_COM_SET_CLK_COM_REG_SPI_ENABLE_Pos (5UL)                /*!< SPI_ENABLE (Bit 5)                                    */\n#define CRG_COM_SET_CLK_COM_REG_SPI_ENABLE_Msk (0x20UL)             /*!< SPI_ENABLE (Bitfield-Mask: 0x01)                      */\n#define CRG_COM_SET_CLK_COM_REG_UART3_CLK_SEL_Pos (4UL)             /*!< UART3_CLK_SEL (Bit 4)                                 */\n#define CRG_COM_SET_CLK_COM_REG_UART3_CLK_SEL_Msk (0x10UL)          /*!< UART3_CLK_SEL (Bitfield-Mask: 0x01)                   */\n#define CRG_COM_SET_CLK_COM_REG_UART3_ENABLE_Pos (3UL)              /*!< UART3_ENABLE (Bit 3)                                  */\n#define CRG_COM_SET_CLK_COM_REG_UART3_ENABLE_Msk (0x8UL)            /*!< UART3_ENABLE (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_SET_CLK_COM_REG_UART2_CLK_SEL_Pos (2UL)             /*!< UART2_CLK_SEL (Bit 2)                                 */\n#define CRG_COM_SET_CLK_COM_REG_UART2_CLK_SEL_Msk (0x4UL)           /*!< UART2_CLK_SEL (Bitfield-Mask: 0x01)                   */\n#define CRG_COM_SET_CLK_COM_REG_UART2_ENABLE_Pos (1UL)              /*!< UART2_ENABLE (Bit 1)                                  */\n#define CRG_COM_SET_CLK_COM_REG_UART2_ENABLE_Msk (0x2UL)            /*!< UART2_ENABLE (Bitfield-Mask: 0x01)                    */\n#define CRG_COM_SET_CLK_COM_REG_UART_ENABLE_Pos (0UL)               /*!< UART_ENABLE (Bit 0)                                   */\n#define CRG_COM_SET_CLK_COM_REG_UART_ENABLE_Msk (0x1UL)             /*!< UART_ENABLE (Bitfield-Mask: 0x01)                     */\n\n\n/* =========================================================================================================================== */\n/* ================                                          CRG_PER                                          ================ */\n/* =========================================================================================================================== */\n\n/* ======================================================  CLK_PER_REG  ====================================================== */\n#define CRG_PER_CLK_PER_REG_MC_TRIG_DIV_Pos (8UL)                   /*!< MC_TRIG_DIV (Bit 8)                                   */\n#define CRG_PER_CLK_PER_REG_MC_TRIG_DIV_Msk (0x1f00UL)              /*!< MC_TRIG_DIV (Bitfield-Mask: 0x1f)                     */\n#define CRG_PER_CLK_PER_REG_MC_CLK_DIV_Pos (3UL)                    /*!< MC_CLK_DIV (Bit 3)                                    */\n#define CRG_PER_CLK_PER_REG_MC_CLK_DIV_Msk (0xf8UL)                 /*!< MC_CLK_DIV (Bitfield-Mask: 0x1f)                      */\n#define CRG_PER_CLK_PER_REG_MC_CLK_EN_Pos (2UL)                     /*!< MC_CLK_EN (Bit 2)                                     */\n#define CRG_PER_CLK_PER_REG_MC_CLK_EN_Msk (0x4UL)                   /*!< MC_CLK_EN (Bitfield-Mask: 0x01)                       */\n#define CRG_PER_CLK_PER_REG_LRA_CLK_EN_Pos (1UL)                    /*!< LRA_CLK_EN (Bit 1)                                    */\n#define CRG_PER_CLK_PER_REG_LRA_CLK_EN_Msk (0x2UL)                  /*!< LRA_CLK_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_PER_CLK_PER_REG_GPADC_CLK_SEL_Pos (0UL)                 /*!< GPADC_CLK_SEL (Bit 0)                                 */\n#define CRG_PER_CLK_PER_REG_GPADC_CLK_SEL_Msk (0x1UL)               /*!< GPADC_CLK_SEL (Bitfield-Mask: 0x01)                   */\n/* ======================================================  PCM_DIV_REG  ====================================================== */\n#define CRG_PER_PCM_DIV_REG_PCM_SRC_SEL_Pos (13UL)                  /*!< PCM_SRC_SEL (Bit 13)                                  */\n#define CRG_PER_PCM_DIV_REG_PCM_SRC_SEL_Msk (0x2000UL)              /*!< PCM_SRC_SEL (Bitfield-Mask: 0x01)                     */\n#define CRG_PER_PCM_DIV_REG_CLK_PCM_EN_Pos (12UL)                   /*!< CLK_PCM_EN (Bit 12)                                   */\n#define CRG_PER_PCM_DIV_REG_CLK_PCM_EN_Msk (0x1000UL)               /*!< CLK_PCM_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_PER_PCM_DIV_REG_PCM_DIV_Pos   (0UL)                     /*!< PCM_DIV (Bit 0)                                       */\n#define CRG_PER_PCM_DIV_REG_PCM_DIV_Msk   (0xfffUL)                 /*!< PCM_DIV (Bitfield-Mask: 0xfff)                        */\n/* =====================================================  PCM_FDIV_REG  ====================================================== */\n#define CRG_PER_PCM_FDIV_REG_PCM_FDIV_Pos (0UL)                     /*!< PCM_FDIV (Bit 0)                                      */\n#define CRG_PER_PCM_FDIV_REG_PCM_FDIV_Msk (0xffffUL)                /*!< PCM_FDIV (Bitfield-Mask: 0xffff)                      */\n/* ======================================================  PDM_DIV_REG  ====================================================== */\n#define CRG_PER_PDM_DIV_REG_PDM_MASTER_MODE_Pos (9UL)               /*!< PDM_MASTER_MODE (Bit 9)                               */\n#define CRG_PER_PDM_DIV_REG_PDM_MASTER_MODE_Msk (0x200UL)           /*!< PDM_MASTER_MODE (Bitfield-Mask: 0x01)                 */\n#define CRG_PER_PDM_DIV_REG_CLK_PDM_EN_Pos (8UL)                    /*!< CLK_PDM_EN (Bit 8)                                    */\n#define CRG_PER_PDM_DIV_REG_CLK_PDM_EN_Msk (0x100UL)                /*!< CLK_PDM_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_PER_PDM_DIV_REG_PDM_DIV_Pos   (0UL)                     /*!< PDM_DIV (Bit 0)                                       */\n#define CRG_PER_PDM_DIV_REG_PDM_DIV_Msk   (0xffUL)                  /*!< PDM_DIV (Bitfield-Mask: 0xff)                         */\n/* ===================================================  RESET_CLK_PER_REG  =================================================== */\n#define CRG_PER_RESET_CLK_PER_REG_MC_TRIG_DIV_Pos (8UL)             /*!< MC_TRIG_DIV (Bit 8)                                   */\n#define CRG_PER_RESET_CLK_PER_REG_MC_TRIG_DIV_Msk (0x1f00UL)        /*!< MC_TRIG_DIV (Bitfield-Mask: 0x1f)                     */\n#define CRG_PER_RESET_CLK_PER_REG_MC_CLK_DIV_Pos (3UL)              /*!< MC_CLK_DIV (Bit 3)                                    */\n#define CRG_PER_RESET_CLK_PER_REG_MC_CLK_DIV_Msk (0xf8UL)           /*!< MC_CLK_DIV (Bitfield-Mask: 0x1f)                      */\n#define CRG_PER_RESET_CLK_PER_REG_MC_CLK_EN_Pos (2UL)               /*!< MC_CLK_EN (Bit 2)                                     */\n#define CRG_PER_RESET_CLK_PER_REG_MC_CLK_EN_Msk (0x4UL)             /*!< MC_CLK_EN (Bitfield-Mask: 0x01)                       */\n#define CRG_PER_RESET_CLK_PER_REG_LRA_CLK_EN_Pos (1UL)              /*!< LRA_CLK_EN (Bit 1)                                    */\n#define CRG_PER_RESET_CLK_PER_REG_LRA_CLK_EN_Msk (0x2UL)            /*!< LRA_CLK_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_PER_RESET_CLK_PER_REG_GPADC_CLK_SEL_Pos (0UL)           /*!< GPADC_CLK_SEL (Bit 0)                                 */\n#define CRG_PER_RESET_CLK_PER_REG_GPADC_CLK_SEL_Msk (0x1UL)         /*!< GPADC_CLK_SEL (Bitfield-Mask: 0x01)                   */\n/* ====================================================  SET_CLK_PER_REG  ==================================================== */\n#define CRG_PER_SET_CLK_PER_REG_MC_TRIG_DIV_Pos (8UL)               /*!< MC_TRIG_DIV (Bit 8)                                   */\n#define CRG_PER_SET_CLK_PER_REG_MC_TRIG_DIV_Msk (0x1f00UL)          /*!< MC_TRIG_DIV (Bitfield-Mask: 0x1f)                     */\n#define CRG_PER_SET_CLK_PER_REG_MC_CLK_DIV_Pos (3UL)                /*!< MC_CLK_DIV (Bit 3)                                    */\n#define CRG_PER_SET_CLK_PER_REG_MC_CLK_DIV_Msk (0xf8UL)             /*!< MC_CLK_DIV (Bitfield-Mask: 0x1f)                      */\n#define CRG_PER_SET_CLK_PER_REG_MC_CLK_EN_Pos (2UL)                 /*!< MC_CLK_EN (Bit 2)                                     */\n#define CRG_PER_SET_CLK_PER_REG_MC_CLK_EN_Msk (0x4UL)               /*!< MC_CLK_EN (Bitfield-Mask: 0x01)                       */\n#define CRG_PER_SET_CLK_PER_REG_LRA_CLK_EN_Pos (1UL)                /*!< LRA_CLK_EN (Bit 1)                                    */\n#define CRG_PER_SET_CLK_PER_REG_LRA_CLK_EN_Msk (0x2UL)              /*!< LRA_CLK_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_PER_SET_CLK_PER_REG_GPADC_CLK_SEL_Pos (0UL)             /*!< GPADC_CLK_SEL (Bit 0)                                 */\n#define CRG_PER_SET_CLK_PER_REG_GPADC_CLK_SEL_Msk (0x1UL)           /*!< GPADC_CLK_SEL (Bitfield-Mask: 0x01)                   */\n/* ======================================================  SRC_DIV_REG  ====================================================== */\n#define CRG_PER_SRC_DIV_REG_CLK_SRC_EN_Pos (8UL)                    /*!< CLK_SRC_EN (Bit 8)                                    */\n#define CRG_PER_SRC_DIV_REG_CLK_SRC_EN_Msk (0x100UL)                /*!< CLK_SRC_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_PER_SRC_DIV_REG_SRC_DIV_Pos   (0UL)                     /*!< SRC_DIV (Bit 0)                                       */\n#define CRG_PER_SRC_DIV_REG_SRC_DIV_Msk   (0xffUL)                  /*!< SRC_DIV (Bitfield-Mask: 0xff)                         */\n\n\n/* =========================================================================================================================== */\n/* ================                                          CRG_SYS                                          ================ */\n/* =========================================================================================================================== */\n\n/* =====================================================  BATCHECK_REG  ====================================================== */\n#define CRG_SYS_BATCHECK_REG_BATCHECK_LOAD_ENABLE_Pos (7UL)         /*!< BATCHECK_LOAD_ENABLE (Bit 7)                          */\n#define CRG_SYS_BATCHECK_REG_BATCHECK_LOAD_ENABLE_Msk (0x80UL)      /*!< BATCHECK_LOAD_ENABLE (Bitfield-Mask: 0x01)            */\n#define CRG_SYS_BATCHECK_REG_BATCHECK_ILOAD_Pos (4UL)               /*!< BATCHECK_ILOAD (Bit 4)                                */\n#define CRG_SYS_BATCHECK_REG_BATCHECK_ILOAD_Msk (0x70UL)            /*!< BATCHECK_ILOAD (Bitfield-Mask: 0x07)                  */\n#define CRG_SYS_BATCHECK_REG_BATCHECK_TRIM_Pos (0UL)                /*!< BATCHECK_TRIM (Bit 0)                                 */\n#define CRG_SYS_BATCHECK_REG_BATCHECK_TRIM_Msk (0xfUL)              /*!< BATCHECK_TRIM (Bitfield-Mask: 0x0f)                   */\n/* ======================================================  CLK_SYS_REG  ====================================================== */\n#define CRG_SYS_CLK_SYS_REG_CLK_CHG_EN_Pos (5UL)                    /*!< CLK_CHG_EN (Bit 5)                                    */\n#define CRG_SYS_CLK_SYS_REG_CLK_CHG_EN_Msk (0x20UL)                 /*!< CLK_CHG_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_SYS_CLK_SYS_REG_LCD_RESET_REQ_Pos (4UL)                 /*!< LCD_RESET_REQ (Bit 4)                                 */\n#define CRG_SYS_CLK_SYS_REG_LCD_RESET_REQ_Msk (0x10UL)              /*!< LCD_RESET_REQ (Bitfield-Mask: 0x01)                   */\n#define CRG_SYS_CLK_SYS_REG_LCD_CLK_SEL_Pos (1UL)                   /*!< LCD_CLK_SEL (Bit 1)                                   */\n#define CRG_SYS_CLK_SYS_REG_LCD_CLK_SEL_Msk (0x2UL)                 /*!< LCD_CLK_SEL (Bitfield-Mask: 0x01)                     */\n#define CRG_SYS_CLK_SYS_REG_LCD_ENABLE_Pos (0UL)                    /*!< LCD_ENABLE (Bit 0)                                    */\n#define CRG_SYS_CLK_SYS_REG_LCD_ENABLE_Msk (0x1UL)                  /*!< LCD_ENABLE (Bitfield-Mask: 0x01)                      */\n\n\n/* =========================================================================================================================== */\n/* ================                                          CRG_TOP                                          ================ */\n/* =========================================================================================================================== */\n\n/* ====================================================  ANA_STATUS_REG  ===================================================== */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VBUS_HIGH_Pos (14UL)            /*!< COMP_VBUS_HIGH (Bit 14)                               */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VBUS_HIGH_Msk (0x4000UL)        /*!< COMP_VBUS_HIGH (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VBUS_LOW_Pos (13UL)             /*!< COMP_VBUS_LOW (Bit 13)                                */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VBUS_LOW_Msk (0x2000UL)         /*!< COMP_VBUS_LOW (Bitfield-Mask: 0x01)                   */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VBAT_HIGH_Pos (12UL)            /*!< COMP_VBAT_HIGH (Bit 12)                               */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VBAT_HIGH_Msk (0x1000UL)        /*!< COMP_VBAT_HIGH (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VBAT_LOW_Pos (11UL)             /*!< COMP_VBAT_LOW (Bit 11)                                */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VBAT_LOW_Msk (0x800UL)          /*!< COMP_VBAT_LOW (Bitfield-Mask: 0x01)                   */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VDD_OK_Pos (10UL)               /*!< COMP_VDD_OK (Bit 10)                                  */\n#define CRG_TOP_ANA_STATUS_REG_COMP_VDD_OK_Msk (0x400UL)            /*!< COMP_VDD_OK (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_ANA_STATUS_REG_VBUS_AVAILABLE_Pos (9UL)             /*!< VBUS_AVAILABLE (Bit 9)                                */\n#define CRG_TOP_ANA_STATUS_REG_VBUS_AVAILABLE_Msk (0x200UL)         /*!< VBUS_AVAILABLE (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_ANA_STATUS_REG_BANDGAP_OK_Pos (8UL)                 /*!< BANDGAP_OK (Bit 8)                                    */\n#define CRG_TOP_ANA_STATUS_REG_BANDGAP_OK_Msk (0x100UL)             /*!< BANDGAP_OK (Bitfield-Mask: 0x01)                      */\n#define CRG_TOP_ANA_STATUS_REG_LDO_3V0_VBAT_OK_Pos (7UL)            /*!< LDO_3V0_VBAT_OK (Bit 7)                               */\n#define CRG_TOP_ANA_STATUS_REG_LDO_3V0_VBAT_OK_Msk (0x80UL)         /*!< LDO_3V0_VBAT_OK (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_ANA_STATUS_REG_LDO_3V0_VBUS_OK_Pos (6UL)            /*!< LDO_3V0_VBUS_OK (Bit 6)                               */\n#define CRG_TOP_ANA_STATUS_REG_LDO_3V0_VBUS_OK_Msk (0x40UL)         /*!< LDO_3V0_VBUS_OK (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_ANA_STATUS_REG_LDO_1V8P_OK_Pos (5UL)                /*!< LDO_1V8P_OK (Bit 5)                                   */\n#define CRG_TOP_ANA_STATUS_REG_LDO_1V8P_OK_Msk (0x20UL)             /*!< LDO_1V8P_OK (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_ANA_STATUS_REG_LDO_1V8_OK_Pos (4UL)                 /*!< LDO_1V8_OK (Bit 4)                                    */\n#define CRG_TOP_ANA_STATUS_REG_LDO_1V8_OK_Msk (0x10UL)              /*!< LDO_1V8_OK (Bitfield-Mask: 0x01)                      */\n#define CRG_TOP_ANA_STATUS_REG_LDO_RADIO_OK_Pos (3UL)               /*!< LDO_RADIO_OK (Bit 3)                                  */\n#define CRG_TOP_ANA_STATUS_REG_LDO_RADIO_OK_Msk (0x8UL)             /*!< LDO_RADIO_OK (Bitfield-Mask: 0x01)                    */\n#define CRG_TOP_ANA_STATUS_REG_LDO_CORE_OK_Pos (2UL)                /*!< LDO_CORE_OK (Bit 2)                                   */\n#define CRG_TOP_ANA_STATUS_REG_LDO_CORE_OK_Msk (0x4UL)              /*!< LDO_CORE_OK (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_ANA_STATUS_REG_LDO_VDD_HIGH_OK_Pos (1UL)            /*!< LDO_VDD_HIGH_OK (Bit 1)                               */\n#define CRG_TOP_ANA_STATUS_REG_LDO_VDD_HIGH_OK_Msk (0x2UL)          /*!< LDO_VDD_HIGH_OK (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_ANA_STATUS_REG_BOD_VIN_NOK_Pos (0UL)                /*!< BOD_VIN_NOK (Bit 0)                                   */\n#define CRG_TOP_ANA_STATUS_REG_BOD_VIN_NOK_Msk (0x1UL)              /*!< BOD_VIN_NOK (Bitfield-Mask: 0x01)                     */\n/* ======================================================  BANDGAP_REG  ====================================================== */\n#define CRG_TOP_BANDGAP_REG_BANDGAP_ENABLE_CLAMP_Pos (12UL)         /*!< BANDGAP_ENABLE_CLAMP (Bit 12)                         */\n#define CRG_TOP_BANDGAP_REG_BANDGAP_ENABLE_CLAMP_Msk (0x1000UL)     /*!< BANDGAP_ENABLE_CLAMP (Bitfield-Mask: 0x01)            */\n#define CRG_TOP_BANDGAP_REG_BGR_ITRIM_Pos (6UL)                     /*!< BGR_ITRIM (Bit 6)                                     */\n#define CRG_TOP_BANDGAP_REG_BGR_ITRIM_Msk (0xfc0UL)                 /*!< BGR_ITRIM (Bitfield-Mask: 0x3f)                       */\n#define CRG_TOP_BANDGAP_REG_SYSRAM_LPMX_Pos (5UL)                   /*!< SYSRAM_LPMX (Bit 5)                                   */\n#define CRG_TOP_BANDGAP_REG_SYSRAM_LPMX_Msk (0x20UL)                /*!< SYSRAM_LPMX (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_BANDGAP_REG_BGR_TRIM_Pos  (0UL)                     /*!< BGR_TRIM (Bit 0)                                      */\n#define CRG_TOP_BANDGAP_REG_BGR_TRIM_Msk  (0x1fUL)                  /*!< BGR_TRIM (Bitfield-Mask: 0x1f)                        */\n/* ===================================================  BIAS_VREF_SEL_REG  =================================================== */\n#define CRG_TOP_BIAS_VREF_SEL_REG_BIAS_VREF_RF2_SEL_Pos (4UL)       /*!< BIAS_VREF_RF2_SEL (Bit 4)                             */\n#define CRG_TOP_BIAS_VREF_SEL_REG_BIAS_VREF_RF2_SEL_Msk (0xf0UL)    /*!< BIAS_VREF_RF2_SEL (Bitfield-Mask: 0x0f)               */\n#define CRG_TOP_BIAS_VREF_SEL_REG_BIAS_VREF_RF1_SEL_Pos (0UL)       /*!< BIAS_VREF_RF1_SEL (Bit 0)                             */\n#define CRG_TOP_BIAS_VREF_SEL_REG_BIAS_VREF_RF1_SEL_Msk (0xfUL)     /*!< BIAS_VREF_RF1_SEL (Bitfield-Mask: 0x0f)               */\n/* =====================================================  BOD_CTRL_REG  ====================================================== */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V14_RST_EN_Pos (16UL)              /*!< BOD_V14_RST_EN (Bit 16)                               */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V14_RST_EN_Msk (0x10000UL)         /*!< BOD_V14_RST_EN (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18F_RST_EN_Pos (15UL)             /*!< BOD_V18F_RST_EN (Bit 15)                              */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18F_RST_EN_Msk (0x8000UL)         /*!< BOD_V18F_RST_EN (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_BOD_CTRL_REG_BOD_VDD_RST_EN_Pos (14UL)              /*!< BOD_VDD_RST_EN (Bit 14)                               */\n#define CRG_TOP_BOD_CTRL_REG_BOD_VDD_RST_EN_Msk (0x4000UL)          /*!< BOD_VDD_RST_EN (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18P_RST_EN_Pos (13UL)             /*!< BOD_V18P_RST_EN (Bit 13)                              */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18P_RST_EN_Msk (0x2000UL)         /*!< BOD_V18P_RST_EN (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18_RST_EN_Pos (12UL)              /*!< BOD_V18_RST_EN (Bit 12)                               */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18_RST_EN_Msk (0x1000UL)          /*!< BOD_V18_RST_EN (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V30_RST_EN_Pos (11UL)              /*!< BOD_V30_RST_EN (Bit 11)                               */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V30_RST_EN_Msk (0x800UL)           /*!< BOD_V30_RST_EN (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_BOD_CTRL_REG_BOD_VBAT_RST_EN_Pos (10UL)             /*!< BOD_VBAT_RST_EN (Bit 10)                              */\n#define CRG_TOP_BOD_CTRL_REG_BOD_VBAT_RST_EN_Msk (0x400UL)          /*!< BOD_VBAT_RST_EN (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V14_EN_Pos (9UL)                   /*!< BOD_V14_EN (Bit 9)                                    */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V14_EN_Msk (0x200UL)               /*!< BOD_V14_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18F_EN_Pos (8UL)                  /*!< BOD_V18F_EN (Bit 8)                                   */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18F_EN_Msk (0x100UL)              /*!< BOD_V18F_EN (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_BOD_CTRL_REG_BOD_VDD_EN_Pos (7UL)                   /*!< BOD_VDD_EN (Bit 7)                                    */\n#define CRG_TOP_BOD_CTRL_REG_BOD_VDD_EN_Msk (0x80UL)                /*!< BOD_VDD_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18P_EN_Pos (6UL)                  /*!< BOD_V18P_EN (Bit 6)                                   */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18P_EN_Msk (0x40UL)               /*!< BOD_V18P_EN (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18_EN_Pos (5UL)                   /*!< BOD_V18_EN (Bit 5)                                    */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V18_EN_Msk (0x20UL)                /*!< BOD_V18_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V30_EN_Pos (4UL)                   /*!< BOD_V30_EN (Bit 4)                                    */\n#define CRG_TOP_BOD_CTRL_REG_BOD_V30_EN_Msk (0x10UL)                /*!< BOD_V30_EN (Bitfield-Mask: 0x01)                      */\n#define CRG_TOP_BOD_CTRL_REG_BOD_VBAT_EN_Pos (3UL)                  /*!< BOD_VBAT_EN (Bit 3)                                   */\n#define CRG_TOP_BOD_CTRL_REG_BOD_VBAT_EN_Msk (0x8UL)                /*!< BOD_VBAT_EN (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_BOD_CTRL_REG_BOD_STATUS_CLEAR_Pos (2UL)             /*!< BOD_STATUS_CLEAR (Bit 2)                              */\n#define CRG_TOP_BOD_CTRL_REG_BOD_STATUS_CLEAR_Msk (0x4UL)           /*!< BOD_STATUS_CLEAR (Bitfield-Mask: 0x01)                */\n#define CRG_TOP_BOD_CTRL_REG_BOD_CLK_DIV_Pos (0UL)                  /*!< BOD_CLK_DIV (Bit 0)                                   */\n#define CRG_TOP_BOD_CTRL_REG_BOD_CLK_DIV_Msk (0x3UL)                /*!< BOD_CLK_DIV (Bitfield-Mask: 0x03)                     */\n/* ===================================================  BOD_LVL_CTRL0_REG  =================================================== */\n#define CRG_TOP_BOD_LVL_CTRL0_REG_BOD_LVL_V18_Pos (18UL)            /*!< BOD_LVL_V18 (Bit 18)                                  */\n#define CRG_TOP_BOD_LVL_CTRL0_REG_BOD_LVL_V18_Msk (0x7fc0000UL)     /*!< BOD_LVL_V18 (Bitfield-Mask: 0x1ff)                    */\n#define CRG_TOP_BOD_LVL_CTRL0_REG_BOD_LVL_V30_Pos (9UL)             /*!< BOD_LVL_V30 (Bit 9)                                   */\n#define CRG_TOP_BOD_LVL_CTRL0_REG_BOD_LVL_V30_Msk (0x3fe00UL)       /*!< BOD_LVL_V30 (Bitfield-Mask: 0x1ff)                    */\n#define CRG_TOP_BOD_LVL_CTRL0_REG_BOD_LVL_VBAT_Pos (0UL)            /*!< BOD_LVL_VBAT (Bit 0)                                  */\n#define CRG_TOP_BOD_LVL_CTRL0_REG_BOD_LVL_VBAT_Msk (0x1ffUL)        /*!< BOD_LVL_VBAT (Bitfield-Mask: 0x1ff)                   */\n/* ===================================================  BOD_LVL_CTRL1_REG  =================================================== */\n#define CRG_TOP_BOD_LVL_CTRL1_REG_BOD_LVL_VDD_RET_Pos (17UL)        /*!< BOD_LVL_VDD_RET (Bit 17)                              */\n#define CRG_TOP_BOD_LVL_CTRL1_REG_BOD_LVL_VDD_RET_Msk (0x1fe0000UL) /*!< BOD_LVL_VDD_RET (Bitfield-Mask: 0xff)                 */\n#define CRG_TOP_BOD_LVL_CTRL1_REG_BOD_LVL_VDD_ON_Pos (9UL)          /*!< BOD_LVL_VDD_ON (Bit 9)                                */\n#define CRG_TOP_BOD_LVL_CTRL1_REG_BOD_LVL_VDD_ON_Msk (0x1fe00UL)    /*!< BOD_LVL_VDD_ON (Bitfield-Mask: 0xff)                  */\n#define CRG_TOP_BOD_LVL_CTRL1_REG_BOD_LVL_V18P_Pos (0UL)            /*!< BOD_LVL_V18P (Bit 0)                                  */\n#define CRG_TOP_BOD_LVL_CTRL1_REG_BOD_LVL_V18P_Msk (0x1ffUL)        /*!< BOD_LVL_V18P (Bitfield-Mask: 0x1ff)                   */\n/* ===================================================  BOD_LVL_CTRL2_REG  =================================================== */\n#define CRG_TOP_BOD_LVL_CTRL2_REG_BOD_LVL_V14_Pos (9UL)             /*!< BOD_LVL_V14 (Bit 9)                                   */\n#define CRG_TOP_BOD_LVL_CTRL2_REG_BOD_LVL_V14_Msk (0x3fe00UL)       /*!< BOD_LVL_V14 (Bitfield-Mask: 0x1ff)                    */\n#define CRG_TOP_BOD_LVL_CTRL2_REG_BOD_LVL_V18F_Pos (0UL)            /*!< BOD_LVL_V18F (Bit 0)                                  */\n#define CRG_TOP_BOD_LVL_CTRL2_REG_BOD_LVL_V18F_Msk (0x1ffUL)        /*!< BOD_LVL_V18F (Bitfield-Mask: 0x1ff)                   */\n/* ====================================================  BOD_STATUS_REG  ===================================================== */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V14_Pos (6UL)                    /*!< BOD_V14 (Bit 6)                                       */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V14_Msk (0x40UL)                 /*!< BOD_V14 (Bitfield-Mask: 0x01)                         */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V18F_Pos (5UL)                   /*!< BOD_V18F (Bit 5)                                      */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V18F_Msk (0x20UL)                /*!< BOD_V18F (Bitfield-Mask: 0x01)                        */\n#define CRG_TOP_BOD_STATUS_REG_BOD_VDD_Pos (4UL)                    /*!< BOD_VDD (Bit 4)                                       */\n#define CRG_TOP_BOD_STATUS_REG_BOD_VDD_Msk (0x10UL)                 /*!< BOD_VDD (Bitfield-Mask: 0x01)                         */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V18P_Pos (3UL)                   /*!< BOD_V18P (Bit 3)                                      */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V18P_Msk (0x8UL)                 /*!< BOD_V18P (Bitfield-Mask: 0x01)                        */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V18_Pos (2UL)                    /*!< BOD_V18 (Bit 2)                                       */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V18_Msk (0x4UL)                  /*!< BOD_V18 (Bitfield-Mask: 0x01)                         */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V30_Pos (1UL)                    /*!< BOD_V30 (Bit 1)                                       */\n#define CRG_TOP_BOD_STATUS_REG_BOD_V30_Msk (0x2UL)                  /*!< BOD_V30 (Bitfield-Mask: 0x01)                         */\n#define CRG_TOP_BOD_STATUS_REG_BOD_VBAT_Pos (0UL)                   /*!< BOD_VBAT (Bit 0)                                      */\n#define CRG_TOP_BOD_STATUS_REG_BOD_VBAT_Msk (0x1UL)                 /*!< BOD_VBAT (Bitfield-Mask: 0x01)                        */\n/* =====================================================  CLK_AMBA_REG  ====================================================== */\n#define CRG_TOP_CLK_AMBA_REG_QSPI2_ENABLE_Pos (15UL)                /*!< QSPI2_ENABLE (Bit 15)                                 */\n#define CRG_TOP_CLK_AMBA_REG_QSPI2_ENABLE_Msk (0x8000UL)            /*!< QSPI2_ENABLE (Bitfield-Mask: 0x01)                    */\n#define CRG_TOP_CLK_AMBA_REG_QSPI2_DIV_Pos (13UL)                   /*!< QSPI2_DIV (Bit 13)                                    */\n#define CRG_TOP_CLK_AMBA_REG_QSPI2_DIV_Msk (0x6000UL)               /*!< QSPI2_DIV (Bitfield-Mask: 0x03)                       */\n#define CRG_TOP_CLK_AMBA_REG_QSPI_ENABLE_Pos (12UL)                 /*!< QSPI_ENABLE (Bit 12)                                  */\n#define CRG_TOP_CLK_AMBA_REG_QSPI_ENABLE_Msk (0x1000UL)             /*!< QSPI_ENABLE (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_CLK_AMBA_REG_QSPI_DIV_Pos (10UL)                    /*!< QSPI_DIV (Bit 10)                                     */\n#define CRG_TOP_CLK_AMBA_REG_QSPI_DIV_Msk (0xc00UL)                 /*!< QSPI_DIV (Bitfield-Mask: 0x03)                        */\n#define CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Pos (9UL)                   /*!< OTP_ENABLE (Bit 9)                                    */\n#define CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk (0x200UL)               /*!< OTP_ENABLE (Bitfield-Mask: 0x01)                      */\n#define CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Pos (8UL)              /*!< TRNG_CLK_ENABLE (Bit 8)                               */\n#define CRG_TOP_CLK_AMBA_REG_TRNG_CLK_ENABLE_Msk (0x100UL)          /*!< TRNG_CLK_ENABLE (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_CLK_AMBA_REG_AES_CLK_ENABLE_Pos (6UL)               /*!< AES_CLK_ENABLE (Bit 6)                                */\n#define CRG_TOP_CLK_AMBA_REG_AES_CLK_ENABLE_Msk (0x40UL)            /*!< AES_CLK_ENABLE (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_CLK_AMBA_REG_PCLK_DIV_Pos (4UL)                     /*!< PCLK_DIV (Bit 4)                                      */\n#define CRG_TOP_CLK_AMBA_REG_PCLK_DIV_Msk (0x30UL)                  /*!< PCLK_DIV (Bitfield-Mask: 0x03)                        */\n#define CRG_TOP_CLK_AMBA_REG_HCLK_DIV_Pos (0UL)                     /*!< HCLK_DIV (Bit 0)                                      */\n#define CRG_TOP_CLK_AMBA_REG_HCLK_DIV_Msk (0x7UL)                   /*!< HCLK_DIV (Bitfield-Mask: 0x07)                        */\n/* =====================================================  CLK_CTRL_REG  ====================================================== */\n#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_PLL96M_Pos (15UL)           /*!< RUNNING_AT_PLL96M (Bit 15)                            */\n#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_PLL96M_Msk (0x8000UL)       /*!< RUNNING_AT_PLL96M (Bitfield-Mask: 0x01)               */\n#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_XTAL32M_Pos (14UL)          /*!< RUNNING_AT_XTAL32M (Bit 14)                           */\n#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_XTAL32M_Msk (0x4000UL)      /*!< RUNNING_AT_XTAL32M (Bitfield-Mask: 0x01)              */\n#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_RC32M_Pos (13UL)            /*!< RUNNING_AT_RC32M (Bit 13)                             */\n#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_RC32M_Msk (0x2000UL)        /*!< RUNNING_AT_RC32M (Bitfield-Mask: 0x01)                */\n#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_LP_CLK_Pos (12UL)           /*!< RUNNING_AT_LP_CLK (Bit 12)                            */\n#define CRG_TOP_CLK_CTRL_REG_RUNNING_AT_LP_CLK_Msk (0x1000UL)       /*!< RUNNING_AT_LP_CLK (Bitfield-Mask: 0x01)               */\n#define CRG_TOP_CLK_CTRL_REG_USB_CLK_SRC_Pos (4UL)                  /*!< USB_CLK_SRC (Bit 4)                                   */\n#define CRG_TOP_CLK_CTRL_REG_USB_CLK_SRC_Msk (0x10UL)               /*!< USB_CLK_SRC (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_CLK_CTRL_REG_LP_CLK_SEL_Pos (2UL)                   /*!< LP_CLK_SEL (Bit 2)                                    */\n#define CRG_TOP_CLK_CTRL_REG_LP_CLK_SEL_Msk (0xcUL)                 /*!< LP_CLK_SEL (Bitfield-Mask: 0x03)                      */\n#define CRG_TOP_CLK_CTRL_REG_SYS_CLK_SEL_Pos (0UL)                  /*!< SYS_CLK_SEL (Bit 0)                                   */\n#define CRG_TOP_CLK_CTRL_REG_SYS_CLK_SEL_Msk (0x3UL)                /*!< SYS_CLK_SEL (Bitfield-Mask: 0x03)                     */\n/* =====================================================  CLK_RADIO_REG  ===================================================== */\n#define CRG_TOP_CLK_RADIO_REG_RFCU_ENABLE_Pos (5UL)                 /*!< RFCU_ENABLE (Bit 5)                                   */\n#define CRG_TOP_CLK_RADIO_REG_RFCU_ENABLE_Msk (0x20UL)              /*!< RFCU_ENABLE (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_CLK_RADIO_REG_CMAC_SYNCH_RESET_Pos (4UL)            /*!< CMAC_SYNCH_RESET (Bit 4)                              */\n#define CRG_TOP_CLK_RADIO_REG_CMAC_SYNCH_RESET_Msk (0x10UL)         /*!< CMAC_SYNCH_RESET (Bitfield-Mask: 0x01)                */\n#define CRG_TOP_CLK_RADIO_REG_CMAC_CLK_SEL_Pos (3UL)                /*!< CMAC_CLK_SEL (Bit 3)                                  */\n#define CRG_TOP_CLK_RADIO_REG_CMAC_CLK_SEL_Msk (0x8UL)              /*!< CMAC_CLK_SEL (Bitfield-Mask: 0x01)                    */\n#define CRG_TOP_CLK_RADIO_REG_CMAC_CLK_ENABLE_Pos (2UL)             /*!< CMAC_CLK_ENABLE (Bit 2)                               */\n#define CRG_TOP_CLK_RADIO_REG_CMAC_CLK_ENABLE_Msk (0x4UL)           /*!< CMAC_CLK_ENABLE (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_CLK_RADIO_REG_CMAC_DIV_Pos (0UL)                    /*!< CMAC_DIV (Bit 0)                                      */\n#define CRG_TOP_CLK_RADIO_REG_CMAC_DIV_Msk (0x3UL)                  /*!< CMAC_DIV (Bitfield-Mask: 0x03)                        */\n/* =====================================================  CLK_RC32K_REG  ===================================================== */\n#define CRG_TOP_CLK_RC32K_REG_RC32K_TRIM_Pos (1UL)                  /*!< RC32K_TRIM (Bit 1)                                    */\n#define CRG_TOP_CLK_RC32K_REG_RC32K_TRIM_Msk (0x1eUL)               /*!< RC32K_TRIM (Bitfield-Mask: 0x0f)                      */\n#define CRG_TOP_CLK_RC32K_REG_RC32K_ENABLE_Pos (0UL)                /*!< RC32K_ENABLE (Bit 0)                                  */\n#define CRG_TOP_CLK_RC32K_REG_RC32K_ENABLE_Msk (0x1UL)              /*!< RC32K_ENABLE (Bitfield-Mask: 0x01)                    */\n/* =====================================================  CLK_RC32M_REG  ===================================================== */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_INIT_RANGE_Pos (20UL)           /*!< RC32M_INIT_RANGE (Bit 20)                             */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_INIT_RANGE_Msk (0x300000UL)     /*!< RC32M_INIT_RANGE (Bitfield-Mask: 0x03)                */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_INIT_DEL_Pos (12UL)             /*!< RC32M_INIT_DEL (Bit 12)                               */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_INIT_DEL_Msk (0xff000UL)        /*!< RC32M_INIT_DEL (Bitfield-Mask: 0xff)                  */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_INIT_DTCF_Pos (9UL)             /*!< RC32M_INIT_DTCF (Bit 9)                               */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_INIT_DTCF_Msk (0xe00UL)         /*!< RC32M_INIT_DTCF (Bitfield-Mask: 0x07)                 */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_INIT_DTC_Pos (5UL)              /*!< RC32M_INIT_DTC (Bit 5)                                */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_INIT_DTC_Msk (0x1e0UL)          /*!< RC32M_INIT_DTC (Bitfield-Mask: 0x0f)                  */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_BIAS_Pos (1UL)                  /*!< RC32M_BIAS (Bit 1)                                    */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_BIAS_Msk (0x1eUL)               /*!< RC32M_BIAS (Bitfield-Mask: 0x0f)                      */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_ENABLE_Pos (0UL)                /*!< RC32M_ENABLE (Bit 0)                                  */\n#define CRG_TOP_CLK_RC32M_REG_RC32M_ENABLE_Msk (0x1UL)              /*!< RC32M_ENABLE (Bitfield-Mask: 0x01)                    */\n/* ======================================================  CLK_RCX_REG  ====================================================== */\n#define CRG_TOP_CLK_RCX_REG_RCX_BIAS_Pos  (8UL)                     /*!< RCX_BIAS (Bit 8)                                      */\n#define CRG_TOP_CLK_RCX_REG_RCX_BIAS_Msk  (0xf00UL)                 /*!< RCX_BIAS (Bitfield-Mask: 0x0f)                        */\n#define CRG_TOP_CLK_RCX_REG_RCX_C0_Pos    (7UL)                     /*!< RCX_C0 (Bit 7)                                        */\n#define CRG_TOP_CLK_RCX_REG_RCX_C0_Msk    (0x80UL)                  /*!< RCX_C0 (Bitfield-Mask: 0x01)                          */\n#define CRG_TOP_CLK_RCX_REG_RCX_CADJUST_Pos (2UL)                   /*!< RCX_CADJUST (Bit 2)                                   */\n#define CRG_TOP_CLK_RCX_REG_RCX_CADJUST_Msk (0x7cUL)                /*!< RCX_CADJUST (Bitfield-Mask: 0x1f)                     */\n#define CRG_TOP_CLK_RCX_REG_RCX_RADJUST_Pos (1UL)                   /*!< RCX_RADJUST (Bit 1)                                   */\n#define CRG_TOP_CLK_RCX_REG_RCX_RADJUST_Msk (0x2UL)                 /*!< RCX_RADJUST (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_CLK_RCX_REG_RCX_ENABLE_Pos (0UL)                    /*!< RCX_ENABLE (Bit 0)                                    */\n#define CRG_TOP_CLK_RCX_REG_RCX_ENABLE_Msk (0x1UL)                  /*!< RCX_ENABLE (Bitfield-Mask: 0x01)                      */\n/* ====================================================  CLK_RTCDIV_REG  ===================================================== */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_RESET_REQ_Pos (21UL)             /*!< RTC_RESET_REQ (Bit 21)                                */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_RESET_REQ_Msk (0x200000UL)       /*!< RTC_RESET_REQ (Bitfield-Mask: 0x01)                   */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_DIV_ENABLE_Pos (20UL)            /*!< RTC_DIV_ENABLE (Bit 20)                               */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_DIV_ENABLE_Msk (0x100000UL)      /*!< RTC_DIV_ENABLE (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_DIV_DENOM_Pos (19UL)             /*!< RTC_DIV_DENOM (Bit 19)                                */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_DIV_DENOM_Msk (0x80000UL)        /*!< RTC_DIV_DENOM (Bitfield-Mask: 0x01)                   */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_DIV_INT_Pos (10UL)               /*!< RTC_DIV_INT (Bit 10)                                  */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_DIV_INT_Msk (0x7fc00UL)          /*!< RTC_DIV_INT (Bitfield-Mask: 0x1ff)                    */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_DIV_FRAC_Pos (0UL)               /*!< RTC_DIV_FRAC (Bit 0)                                  */\n#define CRG_TOP_CLK_RTCDIV_REG_RTC_DIV_FRAC_Msk (0x3ffUL)           /*!< RTC_DIV_FRAC (Bitfield-Mask: 0x3ff)                   */\n/* ==================================================  CLK_SWITCH2XTAL_REG  ================================================== */\n#define CRG_TOP_CLK_SWITCH2XTAL_REG_SWITCH2XTAL_Pos (0UL)           /*!< SWITCH2XTAL (Bit 0)                                   */\n#define CRG_TOP_CLK_SWITCH2XTAL_REG_SWITCH2XTAL_Msk (0x1UL)         /*!< SWITCH2XTAL (Bitfield-Mask: 0x01)                     */\n/* ======================================================  CLK_TMR_REG  ====================================================== */\n#define CRG_TOP_CLK_TMR_REG_TMR2_PWM_AON_MODE_Pos (2UL)             /*!< TMR2_PWM_AON_MODE (Bit 2)                             */\n#define CRG_TOP_CLK_TMR_REG_TMR2_PWM_AON_MODE_Msk (0x4UL)           /*!< TMR2_PWM_AON_MODE (Bitfield-Mask: 0x01)               */\n#define CRG_TOP_CLK_TMR_REG_TMR_PWM_AON_MODE_Pos (1UL)              /*!< TMR_PWM_AON_MODE (Bit 1)                              */\n#define CRG_TOP_CLK_TMR_REG_TMR_PWM_AON_MODE_Msk (0x2UL)            /*!< TMR_PWM_AON_MODE (Bitfield-Mask: 0x01)                */\n#define CRG_TOP_CLK_TMR_REG_WAKEUPCT_ENABLE_Pos (0UL)               /*!< WAKEUPCT_ENABLE (Bit 0)                               */\n#define CRG_TOP_CLK_TMR_REG_WAKEUPCT_ENABLE_Msk (0x1UL)             /*!< WAKEUPCT_ENABLE (Bitfield-Mask: 0x01)                 */\n/* ====================================================  CLK_XTAL32K_REG  ==================================================== */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_DISABLE_OUTPUT_Pos (9UL)    /*!< XTAL32K_DISABLE_OUTPUT (Bit 9)                        */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_DISABLE_OUTPUT_Msk (0x200UL) /*!< XTAL32K_DISABLE_OUTPUT (Bitfield-Mask: 0x01)         */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_DISABLE_AMPREG_Pos (7UL)    /*!< XTAL32K_DISABLE_AMPREG (Bit 7)                        */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_DISABLE_AMPREG_Msk (0x80UL) /*!< XTAL32K_DISABLE_AMPREG (Bitfield-Mask: 0x01)          */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_CUR_Pos (3UL)               /*!< XTAL32K_CUR (Bit 3)                                   */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_CUR_Msk (0x78UL)            /*!< XTAL32K_CUR (Bitfield-Mask: 0x0f)                     */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_RBIAS_Pos (1UL)             /*!< XTAL32K_RBIAS (Bit 1)                                 */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_RBIAS_Msk (0x6UL)           /*!< XTAL32K_RBIAS (Bitfield-Mask: 0x03)                   */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_ENABLE_Pos (0UL)            /*!< XTAL32K_ENABLE (Bit 0)                                */\n#define CRG_TOP_CLK_XTAL32K_REG_XTAL32K_ENABLE_Msk (0x1UL)          /*!< XTAL32K_ENABLE (Bitfield-Mask: 0x01)                  */\n/* ==================================================  DISCHARGE_RAIL_REG  =================================================== */\n#define CRG_TOP_DISCHARGE_RAIL_REG_RESET_V18P_Pos (2UL)             /*!< RESET_V18P (Bit 2)                                    */\n#define CRG_TOP_DISCHARGE_RAIL_REG_RESET_V18P_Msk (0x4UL)           /*!< RESET_V18P (Bitfield-Mask: 0x01)                      */\n#define CRG_TOP_DISCHARGE_RAIL_REG_RESET_V18_Pos (1UL)              /*!< RESET_V18 (Bit 1)                                     */\n#define CRG_TOP_DISCHARGE_RAIL_REG_RESET_V18_Msk (0x2UL)            /*!< RESET_V18 (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_DISCHARGE_RAIL_REG_RESET_V14_Pos (0UL)              /*!< RESET_V14 (Bit 0)                                     */\n#define CRG_TOP_DISCHARGE_RAIL_REG_RESET_V14_Msk (0x1UL)            /*!< RESET_V14 (Bitfield-Mask: 0x01)                       */\n/* ================================================  LDO_VDDD_HIGH_CTRL_REG  ================================================= */\n#define CRG_TOP_LDO_VDDD_HIGH_CTRL_REG_LDO_VDDD_HIGH_LOW_ZOUT_DISABLE_Pos (3UL) /*!< LDO_VDDD_HIGH_LOW_ZOUT_DISABLE (Bit 3)    */\n#define CRG_TOP_LDO_VDDD_HIGH_CTRL_REG_LDO_VDDD_HIGH_LOW_ZOUT_DISABLE_Msk (0x8UL) /*!< LDO_VDDD_HIGH_LOW_ZOUT_DISABLE (Bitfield-Mask: 0x01) */\n#define CRG_TOP_LDO_VDDD_HIGH_CTRL_REG_LDO_VDDD_HIGH_STATIC_LOAD_ENABLE_Pos (2UL) /*!< LDO_VDDD_HIGH_STATIC_LOAD_ENABLE (Bit 2) */\n#define CRG_TOP_LDO_VDDD_HIGH_CTRL_REG_LDO_VDDD_HIGH_STATIC_LOAD_ENABLE_Msk (0x4UL) /*!< LDO_VDDD_HIGH_STATIC_LOAD_ENABLE (Bitfield-Mask: 0x01) */\n#define CRG_TOP_LDO_VDDD_HIGH_CTRL_REG_LDO_VDDD_HIGH_ENABLE_Pos (1UL) /*!< LDO_VDDD_HIGH_ENABLE (Bit 1)                        */\n#define CRG_TOP_LDO_VDDD_HIGH_CTRL_REG_LDO_VDDD_HIGH_ENABLE_Msk (0x2UL) /*!< LDO_VDDD_HIGH_ENABLE (Bitfield-Mask: 0x01)        */\n#define CRG_TOP_LDO_VDDD_HIGH_CTRL_REG_LDO_VDDD_HIGH_VREF_HOLD_Pos (0UL) /*!< LDO_VDDD_HIGH_VREF_HOLD (Bit 0)                  */\n#define CRG_TOP_LDO_VDDD_HIGH_CTRL_REG_LDO_VDDD_HIGH_VREF_HOLD_Msk (0x1UL) /*!< LDO_VDDD_HIGH_VREF_HOLD (Bitfield-Mask: 0x01)  */\n/* ===================================================  P0_PAD_LATCH_REG  ==================================================== */\n#define CRG_TOP_P0_PAD_LATCH_REG_P0_LATCH_EN_Pos (0UL)              /*!< P0_LATCH_EN (Bit 0)                                   */\n#define CRG_TOP_P0_PAD_LATCH_REG_P0_LATCH_EN_Msk (0xffffffffUL)     /*!< P0_LATCH_EN (Bitfield-Mask: 0xffffffff)               */\n/* ================================================  P0_RESET_PAD_LATCH_REG  ================================================= */\n#define CRG_TOP_P0_RESET_PAD_LATCH_REG_P0_RESET_LATCH_EN_Pos (0UL)  /*!< P0_RESET_LATCH_EN (Bit 0)                             */\n#define CRG_TOP_P0_RESET_PAD_LATCH_REG_P0_RESET_LATCH_EN_Msk (0xffffffffUL) /*!< P0_RESET_LATCH_EN (Bitfield-Mask: 0xffffffff) */\n/* =================================================  P0_SET_PAD_LATCH_REG  ================================================== */\n#define CRG_TOP_P0_SET_PAD_LATCH_REG_P0_SET_LATCH_EN_Pos (0UL)      /*!< P0_SET_LATCH_EN (Bit 0)                               */\n#define CRG_TOP_P0_SET_PAD_LATCH_REG_P0_SET_LATCH_EN_Msk (0xffffffffUL) /*!< P0_SET_LATCH_EN (Bitfield-Mask: 0xffffffff)       */\n/* ===================================================  P1_PAD_LATCH_REG  ==================================================== */\n#define CRG_TOP_P1_PAD_LATCH_REG_P1_LATCH_EN_Pos (0UL)              /*!< P1_LATCH_EN (Bit 0)                                   */\n#define CRG_TOP_P1_PAD_LATCH_REG_P1_LATCH_EN_Msk (0x7fffffUL)       /*!< P1_LATCH_EN (Bitfield-Mask: 0x7fffff)                 */\n/* ================================================  P1_RESET_PAD_LATCH_REG  ================================================= */\n#define CRG_TOP_P1_RESET_PAD_LATCH_REG_P1_RESET_LATCH_EN_Pos (0UL)  /*!< P1_RESET_LATCH_EN (Bit 0)                             */\n#define CRG_TOP_P1_RESET_PAD_LATCH_REG_P1_RESET_LATCH_EN_Msk (0x7fffffUL) /*!< P1_RESET_LATCH_EN (Bitfield-Mask: 0x7fffff)     */\n/* =================================================  P1_SET_PAD_LATCH_REG  ================================================== */\n#define CRG_TOP_P1_SET_PAD_LATCH_REG_P1_SET_LATCH_EN_Pos (0UL)      /*!< P1_SET_LATCH_EN (Bit 0)                               */\n#define CRG_TOP_P1_SET_PAD_LATCH_REG_P1_SET_LATCH_EN_Msk (0x7fffffUL) /*!< P1_SET_LATCH_EN (Bitfield-Mask: 0x7fffff)           */\n/* =====================================================  PMU_CTRL_REG  ====================================================== */\n#define CRG_TOP_PMU_CTRL_REG_ENABLE_CLKLESS_Pos (8UL)               /*!< ENABLE_CLKLESS (Bit 8)                                */\n#define CRG_TOP_PMU_CTRL_REG_ENABLE_CLKLESS_Msk (0x100UL)           /*!< ENABLE_CLKLESS (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_PMU_CTRL_REG_RETAIN_CACHE_Pos (7UL)                 /*!< RETAIN_CACHE (Bit 7)                                  */\n#define CRG_TOP_PMU_CTRL_REG_RETAIN_CACHE_Msk (0x80UL)              /*!< RETAIN_CACHE (Bitfield-Mask: 0x01)                    */\n#define CRG_TOP_PMU_CTRL_REG_SYS_SLEEP_Pos (6UL)                    /*!< SYS_SLEEP (Bit 6)                                     */\n#define CRG_TOP_PMU_CTRL_REG_SYS_SLEEP_Msk (0x40UL)                 /*!< SYS_SLEEP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_PMU_CTRL_REG_RESET_ON_WAKEUP_Pos (5UL)              /*!< RESET_ON_WAKEUP (Bit 5)                               */\n#define CRG_TOP_PMU_CTRL_REG_RESET_ON_WAKEUP_Msk (0x20UL)           /*!< RESET_ON_WAKEUP (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_PMU_CTRL_REG_MAP_BANDGAP_EN_Pos (4UL)               /*!< MAP_BANDGAP_EN (Bit 4)                                */\n#define CRG_TOP_PMU_CTRL_REG_MAP_BANDGAP_EN_Msk (0x10UL)            /*!< MAP_BANDGAP_EN (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_PMU_CTRL_REG_COM_SLEEP_Pos (3UL)                    /*!< COM_SLEEP (Bit 3)                                     */\n#define CRG_TOP_PMU_CTRL_REG_COM_SLEEP_Msk (0x8UL)                  /*!< COM_SLEEP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_PMU_CTRL_REG_TIM_SLEEP_Pos (2UL)                    /*!< TIM_SLEEP (Bit 2)                                     */\n#define CRG_TOP_PMU_CTRL_REG_TIM_SLEEP_Msk (0x4UL)                  /*!< TIM_SLEEP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_PMU_CTRL_REG_RADIO_SLEEP_Pos (1UL)                  /*!< RADIO_SLEEP (Bit 1)                                   */\n#define CRG_TOP_PMU_CTRL_REG_RADIO_SLEEP_Msk (0x2UL)                /*!< RADIO_SLEEP (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_PMU_CTRL_REG_PERIPH_SLEEP_Pos (0UL)                 /*!< PERIPH_SLEEP (Bit 0)                                  */\n#define CRG_TOP_PMU_CTRL_REG_PERIPH_SLEEP_Msk (0x1UL)               /*!< PERIPH_SLEEP (Bitfield-Mask: 0x01)                    */\n/* =====================================================  PMU_SLEEP_REG  ===================================================== */\n#define CRG_TOP_PMU_SLEEP_REG_CLAMP_VDD_WKUP_MAX_Pos (18UL)         /*!< CLAMP_VDD_WKUP_MAX (Bit 18)                           */\n#define CRG_TOP_PMU_SLEEP_REG_CLAMP_VDD_WKUP_MAX_Msk (0x40000UL)    /*!< CLAMP_VDD_WKUP_MAX (Bitfield-Mask: 0x01)              */\n#define CRG_TOP_PMU_SLEEP_REG_ULTRA_FAST_WAKEUP_Pos (17UL)          /*!< ULTRA_FAST_WAKEUP (Bit 17)                            */\n#define CRG_TOP_PMU_SLEEP_REG_ULTRA_FAST_WAKEUP_Msk (0x20000UL)     /*!< ULTRA_FAST_WAKEUP (Bitfield-Mask: 0x01)               */\n#define CRG_TOP_PMU_SLEEP_REG_FAST_WAKEUP_Pos (16UL)                /*!< FAST_WAKEUP (Bit 16)                                  */\n#define CRG_TOP_PMU_SLEEP_REG_FAST_WAKEUP_Msk (0x10000UL)           /*!< FAST_WAKEUP (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_PMU_SLEEP_REG_BOD_SLEEP_INTERVAL_Pos (12UL)         /*!< BOD_SLEEP_INTERVAL (Bit 12)                           */\n#define CRG_TOP_PMU_SLEEP_REG_BOD_SLEEP_INTERVAL_Msk (0xf000UL)     /*!< BOD_SLEEP_INTERVAL (Bitfield-Mask: 0x0f)              */\n#define CRG_TOP_PMU_SLEEP_REG_BG_REFRESH_INTERVAL_Pos (0UL)         /*!< BG_REFRESH_INTERVAL (Bit 0)                           */\n#define CRG_TOP_PMU_SLEEP_REG_BG_REFRESH_INTERVAL_Msk (0xfffUL)     /*!< BG_REFRESH_INTERVAL (Bitfield-Mask: 0xfff)            */\n/* =====================================================  PMU_TRIM_REG  ====================================================== */\n#define CRG_TOP_PMU_TRIM_REG_LDO_1V8_TRIM_Pos (12UL)                /*!< LDO_1V8_TRIM (Bit 12)                                 */\n#define CRG_TOP_PMU_TRIM_REG_LDO_1V8_TRIM_Msk (0xf000UL)            /*!< LDO_1V8_TRIM (Bitfield-Mask: 0x0f)                    */\n#define CRG_TOP_PMU_TRIM_REG_LDO_1V8P_TRIM_Pos (8UL)                /*!< LDO_1V8P_TRIM (Bit 8)                                 */\n#define CRG_TOP_PMU_TRIM_REG_LDO_1V8P_TRIM_Msk (0xf00UL)            /*!< LDO_1V8P_TRIM (Bitfield-Mask: 0x0f)                   */\n#define CRG_TOP_PMU_TRIM_REG_LDO_SUPPLY_VBAT_TRIM_Pos (4UL)         /*!< LDO_SUPPLY_VBAT_TRIM (Bit 4)                          */\n#define CRG_TOP_PMU_TRIM_REG_LDO_SUPPLY_VBAT_TRIM_Msk (0xf0UL)      /*!< LDO_SUPPLY_VBAT_TRIM (Bitfield-Mask: 0x0f)            */\n#define CRG_TOP_PMU_TRIM_REG_LDO_SUPPLY_VBUS_TRIM_Pos (0UL)         /*!< LDO_SUPPLY_VBUS_TRIM (Bit 0)                          */\n#define CRG_TOP_PMU_TRIM_REG_LDO_SUPPLY_VBUS_TRIM_Msk (0xfUL)       /*!< LDO_SUPPLY_VBUS_TRIM (Bitfield-Mask: 0x0f)            */\n/* ======================================================  POR_PIN_REG  ====================================================== */\n#define CRG_TOP_POR_PIN_REG_POR_PIN_POLARITY_Pos (7UL)              /*!< POR_PIN_POLARITY (Bit 7)                              */\n#define CRG_TOP_POR_PIN_REG_POR_PIN_POLARITY_Msk (0x80UL)           /*!< POR_PIN_POLARITY (Bitfield-Mask: 0x01)                */\n#define CRG_TOP_POR_PIN_REG_POR_PIN_SELECT_Pos (0UL)                /*!< POR_PIN_SELECT (Bit 0)                                */\n#define CRG_TOP_POR_PIN_REG_POR_PIN_SELECT_Msk (0x3fUL)             /*!< POR_PIN_SELECT (Bitfield-Mask: 0x3f)                  */\n/* =====================================================  POR_TIMER_REG  ===================================================== */\n#define CRG_TOP_POR_TIMER_REG_POR_TIME_Pos (0UL)                    /*!< POR_TIME (Bit 0)                                      */\n#define CRG_TOP_POR_TIMER_REG_POR_TIME_Msk (0x7fUL)                 /*!< POR_TIME (Bitfield-Mask: 0x7f)                        */\n/* ===================================================  POR_VBAT_CTRL_REG  =================================================== */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_MASK_N_Pos (13UL)        /*!< POR_VBAT_MASK_N (Bit 13)                              */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_MASK_N_Msk (0x2000UL)    /*!< POR_VBAT_MASK_N (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_ENABLE_Pos (12UL)        /*!< POR_VBAT_ENABLE (Bit 12)                              */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_ENABLE_Msk (0x1000UL)    /*!< POR_VBAT_ENABLE (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_HYST_LOW_Pos (8UL)       /*!< POR_VBAT_HYST_LOW (Bit 8)                             */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_HYST_LOW_Msk (0xf00UL)   /*!< POR_VBAT_HYST_LOW (Bitfield-Mask: 0x0f)               */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_THRES_HIGH_Pos (4UL)     /*!< POR_VBAT_THRES_HIGH (Bit 4)                           */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_THRES_HIGH_Msk (0xf0UL)  /*!< POR_VBAT_THRES_HIGH (Bitfield-Mask: 0x0f)             */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_THRES_LOW_Pos (0UL)      /*!< POR_VBAT_THRES_LOW (Bit 0)                            */\n#define CRG_TOP_POR_VBAT_CTRL_REG_POR_VBAT_THRES_LOW_Msk (0xfUL)    /*!< POR_VBAT_THRES_LOW (Bitfield-Mask: 0x0f)              */\n/* ====================================================  POWER_CTRL_REG  ===================================================== */\n#define CRG_TOP_POWER_CTRL_REG_VDD_SLEEP_LEVEL_Pos (29UL)           /*!< VDD_SLEEP_LEVEL (Bit 29)                              */\n#define CRG_TOP_POWER_CTRL_REG_VDD_SLEEP_LEVEL_Msk (0xe0000000UL)   /*!< VDD_SLEEP_LEVEL (Bitfield-Mask: 0x07)                 */\n#define CRG_TOP_POWER_CTRL_REG_VDD_CLAMP_LEVEL_Pos (25UL)           /*!< VDD_CLAMP_LEVEL (Bit 25)                              */\n#define CRG_TOP_POWER_CTRL_REG_VDD_CLAMP_LEVEL_Msk (0x1e000000UL)   /*!< VDD_CLAMP_LEVEL (Bitfield-Mask: 0x0f)                 */\n#define CRG_TOP_POWER_CTRL_REG_CLAMP_3V0_VBAT_ENABLE_Pos (24UL)     /*!< CLAMP_3V0_VBAT_ENABLE (Bit 24)                        */\n#define CRG_TOP_POWER_CTRL_REG_CLAMP_3V0_VBAT_ENABLE_Msk (0x1000000UL) /*!< CLAMP_3V0_VBAT_ENABLE (Bitfield-Mask: 0x01)        */\n#define CRG_TOP_POWER_CTRL_REG_V18_LEVEL_Pos (23UL)                 /*!< V18_LEVEL (Bit 23)                                    */\n#define CRG_TOP_POWER_CTRL_REG_V18_LEVEL_Msk (0x800000UL)           /*!< V18_LEVEL (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_POWER_CTRL_REG_V14_LEVEL_Pos (20UL)                 /*!< V14_LEVEL (Bit 20)                                    */\n#define CRG_TOP_POWER_CTRL_REG_V14_LEVEL_Msk (0x700000UL)           /*!< V14_LEVEL (Bitfield-Mask: 0x07)                       */\n#define CRG_TOP_POWER_CTRL_REG_V30_LEVEL_Pos (18UL)                 /*!< V30_LEVEL (Bit 18)                                    */\n#define CRG_TOP_POWER_CTRL_REG_V30_LEVEL_Msk (0xc0000UL)            /*!< V30_LEVEL (Bitfield-Mask: 0x03)                       */\n#define CRG_TOP_POWER_CTRL_REG_VDD_LEVEL_Pos (16UL)                 /*!< VDD_LEVEL (Bit 16)                                    */\n#define CRG_TOP_POWER_CTRL_REG_VDD_LEVEL_Msk (0x30000UL)            /*!< VDD_LEVEL (Bitfield-Mask: 0x03)                       */\n#define CRG_TOP_POWER_CTRL_REG_LDO_3V0_REF_Pos (15UL)               /*!< LDO_3V0_REF (Bit 15)                                  */\n#define CRG_TOP_POWER_CTRL_REG_LDO_3V0_REF_Msk (0x8000UL)           /*!< LDO_3V0_REF (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_POWER_CTRL_REG_LDO_CORE_RET_ENABLE_SLEEP_Pos (14UL) /*!< LDO_CORE_RET_ENABLE_SLEEP (Bit 14)                    */\n#define CRG_TOP_POWER_CTRL_REG_LDO_CORE_RET_ENABLE_SLEEP_Msk (0x4000UL) /*!< LDO_CORE_RET_ENABLE_SLEEP (Bitfield-Mask: 0x01)   */\n#define CRG_TOP_POWER_CTRL_REG_LDO_CORE_RET_ENABLE_ACTIVE_Pos (13UL) /*!< LDO_CORE_RET_ENABLE_ACTIVE (Bit 13)                  */\n#define CRG_TOP_POWER_CTRL_REG_LDO_CORE_RET_ENABLE_ACTIVE_Msk (0x2000UL) /*!< LDO_CORE_RET_ENABLE_ACTIVE (Bitfield-Mask: 0x01) */\n#define CRG_TOP_POWER_CTRL_REG_LDO_CORE_ENABLE_Pos (12UL)           /*!< LDO_CORE_ENABLE (Bit 12)                              */\n#define CRG_TOP_POWER_CTRL_REG_LDO_CORE_ENABLE_Msk (0x1000UL)       /*!< LDO_CORE_ENABLE (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_POWER_CTRL_REG_LDO_3V0_RET_ENABLE_SLEEP_Pos (11UL)  /*!< LDO_3V0_RET_ENABLE_SLEEP (Bit 11)                     */\n#define CRG_TOP_POWER_CTRL_REG_LDO_3V0_RET_ENABLE_SLEEP_Msk (0x800UL) /*!< LDO_3V0_RET_ENABLE_SLEEP (Bitfield-Mask: 0x01)      */\n#define CRG_TOP_POWER_CTRL_REG_LDO_3V0_RET_ENABLE_ACTIVE_Pos (10UL) /*!< LDO_3V0_RET_ENABLE_ACTIVE (Bit 10)                    */\n#define CRG_TOP_POWER_CTRL_REG_LDO_3V0_RET_ENABLE_ACTIVE_Msk (0x400UL) /*!< LDO_3V0_RET_ENABLE_ACTIVE (Bitfield-Mask: 0x01)    */\n#define CRG_TOP_POWER_CTRL_REG_LDO_3V0_MODE_Pos (8UL)               /*!< LDO_3V0_MODE (Bit 8)                                  */\n#define CRG_TOP_POWER_CTRL_REG_LDO_3V0_MODE_Msk (0x300UL)           /*!< LDO_3V0_MODE (Bitfield-Mask: 0x03)                    */\n#define CRG_TOP_POWER_CTRL_REG_LDO_RADIO_ENABLE_Pos (7UL)           /*!< LDO_RADIO_ENABLE (Bit 7)                              */\n#define CRG_TOP_POWER_CTRL_REG_LDO_RADIO_ENABLE_Msk (0x80UL)        /*!< LDO_RADIO_ENABLE (Bitfield-Mask: 0x01)                */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8_RET_ENABLE_SLEEP_Pos (6UL)   /*!< LDO_1V8_RET_ENABLE_SLEEP (Bit 6)                      */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8_RET_ENABLE_SLEEP_Msk (0x40UL) /*!< LDO_1V8_RET_ENABLE_SLEEP (Bitfield-Mask: 0x01)       */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8_RET_ENABLE_ACTIVE_Pos (5UL)  /*!< LDO_1V8_RET_ENABLE_ACTIVE (Bit 5)                     */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8_RET_ENABLE_ACTIVE_Msk (0x20UL) /*!< LDO_1V8_RET_ENABLE_ACTIVE (Bitfield-Mask: 0x01)     */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8_ENABLE_Pos (4UL)             /*!< LDO_1V8_ENABLE (Bit 4)                                */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8_ENABLE_Msk (0x10UL)          /*!< LDO_1V8_ENABLE (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_POWER_CTRL_REG_SW_1V8F_ENABLE_FORCE_Pos (3UL)       /*!< SW_1V8F_ENABLE_FORCE (Bit 3)                          */\n#define CRG_TOP_POWER_CTRL_REG_SW_1V8F_ENABLE_FORCE_Msk (0x8UL)     /*!< SW_1V8F_ENABLE_FORCE (Bitfield-Mask: 0x01)            */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8P_RET_ENABLE_SLEEP_Pos (2UL)  /*!< LDO_1V8P_RET_ENABLE_SLEEP (Bit 2)                     */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8P_RET_ENABLE_SLEEP_Msk (0x4UL) /*!< LDO_1V8P_RET_ENABLE_SLEEP (Bitfield-Mask: 0x01)      */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8P_RET_ENABLE_ACTIVE_Pos (1UL) /*!< LDO_1V8P_RET_ENABLE_ACTIVE (Bit 1)                    */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8P_RET_ENABLE_ACTIVE_Msk (0x2UL) /*!< LDO_1V8P_RET_ENABLE_ACTIVE (Bitfield-Mask: 0x01)    */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8P_ENABLE_Pos (0UL)            /*!< LDO_1V8P_ENABLE (Bit 0)                               */\n#define CRG_TOP_POWER_CTRL_REG_LDO_1V8P_ENABLE_Msk (0x1UL)          /*!< LDO_1V8P_ENABLE (Bitfield-Mask: 0x01)                 */\n/* ===================================================  RAM_PWR_CTRL_REG  ==================================================== */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM8_PWR_CTRL_Pos (14UL)           /*!< RAM8_PWR_CTRL (Bit 14)                                */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM8_PWR_CTRL_Msk (0xc000UL)       /*!< RAM8_PWR_CTRL (Bitfield-Mask: 0x03)                   */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM7_PWR_CTRL_Pos (12UL)           /*!< RAM7_PWR_CTRL (Bit 12)                                */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM7_PWR_CTRL_Msk (0x3000UL)       /*!< RAM7_PWR_CTRL (Bitfield-Mask: 0x03)                   */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM6_PWR_CTRL_Pos (10UL)           /*!< RAM6_PWR_CTRL (Bit 10)                                */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM6_PWR_CTRL_Msk (0xc00UL)        /*!< RAM6_PWR_CTRL (Bitfield-Mask: 0x03)                   */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM5_PWR_CTRL_Pos (8UL)            /*!< RAM5_PWR_CTRL (Bit 8)                                 */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM5_PWR_CTRL_Msk (0x300UL)        /*!< RAM5_PWR_CTRL (Bitfield-Mask: 0x03)                   */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM4_PWR_CTRL_Pos (6UL)            /*!< RAM4_PWR_CTRL (Bit 6)                                 */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM4_PWR_CTRL_Msk (0xc0UL)         /*!< RAM4_PWR_CTRL (Bitfield-Mask: 0x03)                   */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM3_PWR_CTRL_Pos (4UL)            /*!< RAM3_PWR_CTRL (Bit 4)                                 */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM3_PWR_CTRL_Msk (0x30UL)         /*!< RAM3_PWR_CTRL (Bitfield-Mask: 0x03)                   */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM2_PWR_CTRL_Pos (2UL)            /*!< RAM2_PWR_CTRL (Bit 2)                                 */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM2_PWR_CTRL_Msk (0xcUL)          /*!< RAM2_PWR_CTRL (Bitfield-Mask: 0x03)                   */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM1_PWR_CTRL_Pos (0UL)            /*!< RAM1_PWR_CTRL (Bit 0)                                 */\n#define CRG_TOP_RAM_PWR_CTRL_REG_RAM1_PWR_CTRL_Msk (0x3UL)          /*!< RAM1_PWR_CTRL (Bitfield-Mask: 0x03)                   */\n/* ====================================================  RESET_STAT_REG  ===================================================== */\n#define CRG_TOP_RESET_STAT_REG_CMAC_WDOGRESET_STAT_Pos (5UL)        /*!< CMAC_WDOGRESET_STAT (Bit 5)                           */\n#define CRG_TOP_RESET_STAT_REG_CMAC_WDOGRESET_STAT_Msk (0x20UL)     /*!< CMAC_WDOGRESET_STAT (Bitfield-Mask: 0x01)             */\n#define CRG_TOP_RESET_STAT_REG_SWD_HWRESET_STAT_Pos (4UL)           /*!< SWD_HWRESET_STAT (Bit 4)                              */\n#define CRG_TOP_RESET_STAT_REG_SWD_HWRESET_STAT_Msk (0x10UL)        /*!< SWD_HWRESET_STAT (Bitfield-Mask: 0x01)                */\n#define CRG_TOP_RESET_STAT_REG_WDOGRESET_STAT_Pos (3UL)             /*!< WDOGRESET_STAT (Bit 3)                                */\n#define CRG_TOP_RESET_STAT_REG_WDOGRESET_STAT_Msk (0x8UL)           /*!< WDOGRESET_STAT (Bitfield-Mask: 0x01)                  */\n#define CRG_TOP_RESET_STAT_REG_SWRESET_STAT_Pos (2UL)               /*!< SWRESET_STAT (Bit 2)                                  */\n#define CRG_TOP_RESET_STAT_REG_SWRESET_STAT_Msk (0x4UL)             /*!< SWRESET_STAT (Bitfield-Mask: 0x01)                    */\n#define CRG_TOP_RESET_STAT_REG_HWRESET_STAT_Pos (1UL)               /*!< HWRESET_STAT (Bit 1)                                  */\n#define CRG_TOP_RESET_STAT_REG_HWRESET_STAT_Msk (0x2UL)             /*!< HWRESET_STAT (Bitfield-Mask: 0x01)                    */\n#define CRG_TOP_RESET_STAT_REG_PORESET_STAT_Pos (0UL)               /*!< PORESET_STAT (Bit 0)                                  */\n#define CRG_TOP_RESET_STAT_REG_PORESET_STAT_Msk (0x1UL)             /*!< PORESET_STAT (Bitfield-Mask: 0x01)                    */\n/* ====================================================  SECURE_BOOT_REG  ==================================================== */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_QSPI_KEY_READ_Pos (7UL)        /*!< PROT_QSPI_KEY_READ (Bit 7)                            */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_QSPI_KEY_READ_Msk (0x80UL)     /*!< PROT_QSPI_KEY_READ (Bitfield-Mask: 0x01)              */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_QSPI_KEY_WRITE_Pos (6UL)       /*!< PROT_QSPI_KEY_WRITE (Bit 6)                           */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_QSPI_KEY_WRITE_Msk (0x40UL)    /*!< PROT_QSPI_KEY_WRITE (Bitfield-Mask: 0x01)             */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_AES_KEY_READ_Pos (5UL)         /*!< PROT_AES_KEY_READ (Bit 5)                             */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_AES_KEY_READ_Msk (0x20UL)      /*!< PROT_AES_KEY_READ (Bitfield-Mask: 0x01)               */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_AES_KEY_WRITE_Pos (4UL)        /*!< PROT_AES_KEY_WRITE (Bit 4)                            */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_AES_KEY_WRITE_Msk (0x10UL)     /*!< PROT_AES_KEY_WRITE (Bitfield-Mask: 0x01)              */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_SIG_KEY_WRITE_Pos (3UL)        /*!< PROT_SIG_KEY_WRITE (Bit 3)                            */\n#define CRG_TOP_SECURE_BOOT_REG_PROT_SIG_KEY_WRITE_Msk (0x8UL)      /*!< PROT_SIG_KEY_WRITE (Bitfield-Mask: 0x01)              */\n#define CRG_TOP_SECURE_BOOT_REG_FORCE_CMAC_DEBUGGER_OFF_Pos (2UL)   /*!< FORCE_CMAC_DEBUGGER_OFF (Bit 2)                       */\n#define CRG_TOP_SECURE_BOOT_REG_FORCE_CMAC_DEBUGGER_OFF_Msk (0x4UL) /*!< FORCE_CMAC_DEBUGGER_OFF (Bitfield-Mask: 0x01)         */\n#define CRG_TOP_SECURE_BOOT_REG_FORCE_DEBUGGER_OFF_Pos (1UL)        /*!< FORCE_DEBUGGER_OFF (Bit 1)                            */\n#define CRG_TOP_SECURE_BOOT_REG_FORCE_DEBUGGER_OFF_Msk (0x2UL)      /*!< FORCE_DEBUGGER_OFF (Bitfield-Mask: 0x01)              */\n#define CRG_TOP_SECURE_BOOT_REG_SECURE_BOOT_Pos (0UL)               /*!< SECURE_BOOT (Bit 0)                                   */\n#define CRG_TOP_SECURE_BOOT_REG_SECURE_BOOT_Msk (0x1UL)             /*!< SECURE_BOOT (Bitfield-Mask: 0x01)                     */\n/* =====================================================  SYS_CTRL_REG  ====================================================== */\n#define CRG_TOP_SYS_CTRL_REG_SW_RESET_Pos (15UL)                    /*!< SW_RESET (Bit 15)                                     */\n#define CRG_TOP_SYS_CTRL_REG_SW_RESET_Msk (0x8000UL)                /*!< SW_RESET (Bitfield-Mask: 0x01)                        */\n#define CRG_TOP_SYS_CTRL_REG_CACHERAM_MUX_Pos (10UL)                /*!< CACHERAM_MUX (Bit 10)                                 */\n#define CRG_TOP_SYS_CTRL_REG_CACHERAM_MUX_Msk (0x400UL)             /*!< CACHERAM_MUX (Bitfield-Mask: 0x01)                    */\n#define CRG_TOP_SYS_CTRL_REG_TIMEOUT_DISABLE_Pos (9UL)              /*!< TIMEOUT_DISABLE (Bit 9)                               */\n#define CRG_TOP_SYS_CTRL_REG_TIMEOUT_DISABLE_Msk (0x200UL)          /*!< TIMEOUT_DISABLE (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_SYS_CTRL_REG_DEBUGGER_ENABLE_Pos (7UL)              /*!< DEBUGGER_ENABLE (Bit 7)                               */\n#define CRG_TOP_SYS_CTRL_REG_DEBUGGER_ENABLE_Msk (0x80UL)           /*!< DEBUGGER_ENABLE (Bitfield-Mask: 0x01)                 */\n#define CRG_TOP_SYS_CTRL_REG_QSPI_INIT_Pos (4UL)                    /*!< QSPI_INIT (Bit 4)                                     */\n#define CRG_TOP_SYS_CTRL_REG_QSPI_INIT_Msk (0x10UL)                 /*!< QSPI_INIT (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_SYS_CTRL_REG_REMAP_INTVECT_Pos (3UL)                /*!< REMAP_INTVECT (Bit 3)                                 */\n#define CRG_TOP_SYS_CTRL_REG_REMAP_INTVECT_Msk (0x8UL)              /*!< REMAP_INTVECT (Bitfield-Mask: 0x01)                   */\n#define CRG_TOP_SYS_CTRL_REG_REMAP_ADR0_Pos (0UL)                   /*!< REMAP_ADR0 (Bit 0)                                    */\n#define CRG_TOP_SYS_CTRL_REG_REMAP_ADR0_Msk (0x7UL)                 /*!< REMAP_ADR0 (Bitfield-Mask: 0x07)                      */\n/* =====================================================  SYS_STAT_REG  ====================================================== */\n#define CRG_TOP_SYS_STAT_REG_POWER_IS_UP_Pos (13UL)                 /*!< POWER_IS_UP (Bit 13)                                  */\n#define CRG_TOP_SYS_STAT_REG_POWER_IS_UP_Msk (0x2000UL)             /*!< POWER_IS_UP (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_SYS_STAT_REG_DBG_IS_ACTIVE_Pos (12UL)               /*!< DBG_IS_ACTIVE (Bit 12)                                */\n#define CRG_TOP_SYS_STAT_REG_DBG_IS_ACTIVE_Msk (0x1000UL)           /*!< DBG_IS_ACTIVE (Bitfield-Mask: 0x01)                   */\n#define CRG_TOP_SYS_STAT_REG_COM_IS_UP_Pos (11UL)                   /*!< COM_IS_UP (Bit 11)                                    */\n#define CRG_TOP_SYS_STAT_REG_COM_IS_UP_Msk (0x800UL)                /*!< COM_IS_UP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_SYS_STAT_REG_COM_IS_DOWN_Pos (10UL)                 /*!< COM_IS_DOWN (Bit 10)                                  */\n#define CRG_TOP_SYS_STAT_REG_COM_IS_DOWN_Msk (0x400UL)              /*!< COM_IS_DOWN (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_SYS_STAT_REG_TIM_IS_UP_Pos (9UL)                    /*!< TIM_IS_UP (Bit 9)                                     */\n#define CRG_TOP_SYS_STAT_REG_TIM_IS_UP_Msk (0x200UL)                /*!< TIM_IS_UP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_SYS_STAT_REG_TIM_IS_DOWN_Pos (8UL)                  /*!< TIM_IS_DOWN (Bit 8)                                   */\n#define CRG_TOP_SYS_STAT_REG_TIM_IS_DOWN_Msk (0x100UL)              /*!< TIM_IS_DOWN (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_SYS_STAT_REG_MEM_IS_UP_Pos (7UL)                    /*!< MEM_IS_UP (Bit 7)                                     */\n#define CRG_TOP_SYS_STAT_REG_MEM_IS_UP_Msk (0x80UL)                 /*!< MEM_IS_UP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_SYS_STAT_REG_MEM_IS_DOWN_Pos (6UL)                  /*!< MEM_IS_DOWN (Bit 6)                                   */\n#define CRG_TOP_SYS_STAT_REG_MEM_IS_DOWN_Msk (0x40UL)               /*!< MEM_IS_DOWN (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_SYS_STAT_REG_SYS_IS_UP_Pos (5UL)                    /*!< SYS_IS_UP (Bit 5)                                     */\n#define CRG_TOP_SYS_STAT_REG_SYS_IS_UP_Msk (0x20UL)                 /*!< SYS_IS_UP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_SYS_STAT_REG_SYS_IS_DOWN_Pos (4UL)                  /*!< SYS_IS_DOWN (Bit 4)                                   */\n#define CRG_TOP_SYS_STAT_REG_SYS_IS_DOWN_Msk (0x10UL)               /*!< SYS_IS_DOWN (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_SYS_STAT_REG_PER_IS_UP_Pos (3UL)                    /*!< PER_IS_UP (Bit 3)                                     */\n#define CRG_TOP_SYS_STAT_REG_PER_IS_UP_Msk (0x8UL)                  /*!< PER_IS_UP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_SYS_STAT_REG_PER_IS_DOWN_Pos (2UL)                  /*!< PER_IS_DOWN (Bit 2)                                   */\n#define CRG_TOP_SYS_STAT_REG_PER_IS_DOWN_Msk (0x4UL)                /*!< PER_IS_DOWN (Bitfield-Mask: 0x01)                     */\n#define CRG_TOP_SYS_STAT_REG_RAD_IS_UP_Pos (1UL)                    /*!< RAD_IS_UP (Bit 1)                                     */\n#define CRG_TOP_SYS_STAT_REG_RAD_IS_UP_Msk (0x2UL)                  /*!< RAD_IS_UP (Bitfield-Mask: 0x01)                       */\n#define CRG_TOP_SYS_STAT_REG_RAD_IS_DOWN_Pos (0UL)                  /*!< RAD_IS_DOWN (Bit 0)                                   */\n#define CRG_TOP_SYS_STAT_REG_RAD_IS_DOWN_Msk (0x1UL)                /*!< RAD_IS_DOWN (Bitfield-Mask: 0x01)                     */\n/* ==================================================  VBUS_IRQ_CLEAR_REG  =================================================== */\n#define CRG_TOP_VBUS_IRQ_CLEAR_REG_VBUS_IRQ_CLEAR_Pos (0UL)         /*!< VBUS_IRQ_CLEAR (Bit 0)                                */\n#define CRG_TOP_VBUS_IRQ_CLEAR_REG_VBUS_IRQ_CLEAR_Msk (0xffffUL)    /*!< VBUS_IRQ_CLEAR (Bitfield-Mask: 0xffff)                */\n/* ===================================================  VBUS_IRQ_MASK_REG  =================================================== */\n#define CRG_TOP_VBUS_IRQ_MASK_REG_VBUS_IRQ_EN_RISE_Pos (1UL)        /*!< VBUS_IRQ_EN_RISE (Bit 1)                              */\n#define CRG_TOP_VBUS_IRQ_MASK_REG_VBUS_IRQ_EN_RISE_Msk (0x2UL)      /*!< VBUS_IRQ_EN_RISE (Bitfield-Mask: 0x01)                */\n#define CRG_TOP_VBUS_IRQ_MASK_REG_VBUS_IRQ_EN_FALL_Pos (0UL)        /*!< VBUS_IRQ_EN_FALL (Bit 0)                              */\n#define CRG_TOP_VBUS_IRQ_MASK_REG_VBUS_IRQ_EN_FALL_Msk (0x1UL)      /*!< VBUS_IRQ_EN_FALL (Bitfield-Mask: 0x01)                */\n\n\n/* =========================================================================================================================== */\n/* ================                                         CRG_XTAL                                          ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  CLK_FREQ_TRIM_REG  =================================================== */\n#define CRG_XTAL_CLK_FREQ_TRIM_REG_XTAL32M_START_Pos (20UL)         /*!< XTAL32M_START (Bit 20)                                */\n#define CRG_XTAL_CLK_FREQ_TRIM_REG_XTAL32M_START_Msk (0x3ff00000UL) /*!< XTAL32M_START (Bitfield-Mask: 0x3ff)                  */\n#define CRG_XTAL_CLK_FREQ_TRIM_REG_XTAL32M_RAMP_Pos (10UL)          /*!< XTAL32M_RAMP (Bit 10)                                 */\n#define CRG_XTAL_CLK_FREQ_TRIM_REG_XTAL32M_RAMP_Msk (0xffc00UL)     /*!< XTAL32M_RAMP (Bitfield-Mask: 0x3ff)                   */\n#define CRG_XTAL_CLK_FREQ_TRIM_REG_XTAL32M_TRIM_Pos (0UL)           /*!< XTAL32M_TRIM (Bit 0)                                  */\n#define CRG_XTAL_CLK_FREQ_TRIM_REG_XTAL32M_TRIM_Msk (0x3ffUL)       /*!< XTAL32M_TRIM (Bitfield-Mask: 0x3ff)                   */\n/* ===================================================  PLL_SYS_CTRL1_REG  =================================================== */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_SEL_MIN_CUR_INT_Pos (14UL)   /*!< PLL_SEL_MIN_CUR_INT (Bit 14)                          */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_SEL_MIN_CUR_INT_Msk (0x4000UL) /*!< PLL_SEL_MIN_CUR_INT (Bitfield-Mask: 0x01)           */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_PRE_DIV_Pos (11UL)           /*!< PLL_PRE_DIV (Bit 11)                                  */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_PRE_DIV_Msk (0x800UL)        /*!< PLL_PRE_DIV (Bitfield-Mask: 0x01)                     */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_N_DIV_Pos (4UL)              /*!< PLL_N_DIV (Bit 4)                                     */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_N_DIV_Msk (0x7f0UL)          /*!< PLL_N_DIV (Bitfield-Mask: 0x7f)                       */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_LDO_PLL_VREF_HOLD_Pos (3UL)      /*!< LDO_PLL_VREF_HOLD (Bit 3)                             */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_LDO_PLL_VREF_HOLD_Msk (0x8UL)    /*!< LDO_PLL_VREF_HOLD (Bitfield-Mask: 0x01)               */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_LDO_PLL_ENABLE_Pos (2UL)         /*!< LDO_PLL_ENABLE (Bit 2)                                */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_LDO_PLL_ENABLE_Msk (0x4UL)       /*!< LDO_PLL_ENABLE (Bitfield-Mask: 0x01)                  */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_EN_Pos (1UL)                 /*!< PLL_EN (Bit 1)                                        */\n#define CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_EN_Msk (0x2UL)               /*!< PLL_EN (Bitfield-Mask: 0x01)                          */\n/* ===================================================  PLL_SYS_CTRL2_REG  =================================================== */\n#define CRG_XTAL_PLL_SYS_CTRL2_REG_PLL_RECALIB_Pos (15UL)           /*!< PLL_RECALIB (Bit 15)                                  */\n#define CRG_XTAL_PLL_SYS_CTRL2_REG_PLL_RECALIB_Msk (0x8000UL)       /*!< PLL_RECALIB (Bitfield-Mask: 0x01)                     */\n/* ===================================================  PLL_SYS_CTRL3_REG  =================================================== */\n#define CRG_XTAL_PLL_SYS_CTRL3_REG_PLL_TEST_VCTR_Pos (7UL)          /*!< PLL_TEST_VCTR (Bit 7)                                 */\n#define CRG_XTAL_PLL_SYS_CTRL3_REG_PLL_TEST_VCTR_Msk (0x80UL)       /*!< PLL_TEST_VCTR (Bitfield-Mask: 0x01)                   */\n#define CRG_XTAL_PLL_SYS_CTRL3_REG_PLL_MIN_CURRENT_Pos (1UL)        /*!< PLL_MIN_CURRENT (Bit 1)                               */\n#define CRG_XTAL_PLL_SYS_CTRL3_REG_PLL_MIN_CURRENT_Msk (0x7eUL)     /*!< PLL_MIN_CURRENT (Bitfield-Mask: 0x3f)                 */\n/* ==================================================  PLL_SYS_STATUS_REG  =================================================== */\n#define CRG_XTAL_PLL_SYS_STATUS_REG_LDO_PLL_OK_Pos (15UL)           /*!< LDO_PLL_OK (Bit 15)                                   */\n#define CRG_XTAL_PLL_SYS_STATUS_REG_LDO_PLL_OK_Msk (0x8000UL)       /*!< LDO_PLL_OK (Bitfield-Mask: 0x01)                      */\n#define CRG_XTAL_PLL_SYS_STATUS_REG_PLL_CALIBRATION_END_Pos (11UL)  /*!< PLL_CALIBRATION_END (Bit 11)                          */\n#define CRG_XTAL_PLL_SYS_STATUS_REG_PLL_CALIBRATION_END_Msk (0x800UL) /*!< PLL_CALIBRATION_END (Bitfield-Mask: 0x01)           */\n#define CRG_XTAL_PLL_SYS_STATUS_REG_PLL_BEST_MIN_CUR_Pos (5UL)      /*!< PLL_BEST_MIN_CUR (Bit 5)                              */\n#define CRG_XTAL_PLL_SYS_STATUS_REG_PLL_BEST_MIN_CUR_Msk (0x7e0UL)  /*!< PLL_BEST_MIN_CUR (Bitfield-Mask: 0x3f)                */\n#define CRG_XTAL_PLL_SYS_STATUS_REG_PLL_LOCK_FINE_Pos (0UL)         /*!< PLL_LOCK_FINE (Bit 0)                                 */\n#define CRG_XTAL_PLL_SYS_STATUS_REG_PLL_LOCK_FINE_Msk (0x1UL)       /*!< PLL_LOCK_FINE (Bitfield-Mask: 0x01)                   */\n/* =====================================================  TRIM_CTRL_REG  ===================================================== */\n#define CRG_XTAL_TRIM_CTRL_REG_XTAL_SETTLE_N_Pos (8UL)              /*!< XTAL_SETTLE_N (Bit 8)                                 */\n#define CRG_XTAL_TRIM_CTRL_REG_XTAL_SETTLE_N_Msk (0x3f00UL)         /*!< XTAL_SETTLE_N (Bitfield-Mask: 0x3f)                   */\n#define CRG_XTAL_TRIM_CTRL_REG_XTAL_TRIM_SELECT_Pos (6UL)           /*!< XTAL_TRIM_SELECT (Bit 6)                              */\n#define CRG_XTAL_TRIM_CTRL_REG_XTAL_TRIM_SELECT_Msk (0xc0UL)        /*!< XTAL_TRIM_SELECT (Bitfield-Mask: 0x03)                */\n#define CRG_XTAL_TRIM_CTRL_REG_XTAL_COUNT_N_Pos (0UL)               /*!< XTAL_COUNT_N (Bit 0)                                  */\n#define CRG_XTAL_TRIM_CTRL_REG_XTAL_COUNT_N_Msk (0x3fUL)            /*!< XTAL_COUNT_N (Bitfield-Mask: 0x3f)                    */\n/* ===================================================  XTAL32M_CTRL0_REG  =================================================== */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_DXTAL_SYSPLL_ENABLE_Pos (30UL) /*!< XTAL32M_DXTAL_SYSPLL_ENABLE (Bit 30)            */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_DXTAL_SYSPLL_ENABLE_Msk (0x40000000UL) /*!< XTAL32M_DXTAL_SYSPLL_ENABLE (Bitfield-Mask: 0x01) */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_CORE_CUR_SET_Pos (15UL)  /*!< XTAL32M_CORE_CUR_SET (Bit 15)                         */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_CORE_CUR_SET_Msk (0x38000UL) /*!< XTAL32M_CORE_CUR_SET (Bitfield-Mask: 0x07)        */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_RCOSC_CALIBRATE_Pos (3UL) /*!< XTAL32M_RCOSC_CALIBRATE (Bit 3)                      */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_RCOSC_CALIBRATE_Msk (0x8UL) /*!< XTAL32M_RCOSC_CALIBRATE (Bitfield-Mask: 0x01)      */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_RCOSC_XTAL_DRIVE_Pos (1UL) /*!< XTAL32M_RCOSC_XTAL_DRIVE (Bit 1)                    */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_RCOSC_XTAL_DRIVE_Msk (0x2UL) /*!< XTAL32M_RCOSC_XTAL_DRIVE (Bitfield-Mask: 0x01)    */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_CXCOMP_ENABLE_Pos (0UL)  /*!< XTAL32M_CXCOMP_ENABLE (Bit 0)                         */\n#define CRG_XTAL_XTAL32M_CTRL0_REG_XTAL32M_CXCOMP_ENABLE_Msk (0x1UL) /*!< XTAL32M_CXCOMP_ENABLE (Bitfield-Mask: 0x01)          */\n/* ===================================================  XTAL32M_CTRL1_REG  =================================================== */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_STARTUP_TDISCHARGE_Pos (28UL) /*!< XTAL32M_STARTUP_TDISCHARGE (Bit 28)              */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_STARTUP_TDISCHARGE_Msk (0x70000000UL) /*!< XTAL32M_STARTUP_TDISCHARGE (Bitfield-Mask: 0x07) */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_STARTUP_TSETTLE_Pos (24UL) /*!< XTAL32M_STARTUP_TSETTLE (Bit 24)                    */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_STARTUP_TSETTLE_Msk (0x7000000UL) /*!< XTAL32M_STARTUP_TSETTLE (Bitfield-Mask: 0x07) */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_XTAL_ENABLE_Pos (23UL)   /*!< XTAL32M_XTAL_ENABLE (Bit 23)                          */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_XTAL_ENABLE_Msk (0x800000UL) /*!< XTAL32M_XTAL_ENABLE (Bitfield-Mask: 0x01)         */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_STARTUP_TDRIVE_LSB_Pos (13UL) /*!< XTAL32M_STARTUP_TDRIVE_LSB (Bit 13)              */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_STARTUP_TDRIVE_LSB_Msk (0x7fe000UL) /*!< XTAL32M_STARTUP_TDRIVE_LSB (Bitfield-Mask: 0x3ff) */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_DRIVE_CYCLES_Pos (8UL)   /*!< XTAL32M_DRIVE_CYCLES (Bit 8)                          */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_DRIVE_CYCLES_Msk (0x1f00UL) /*!< XTAL32M_DRIVE_CYCLES (Bitfield-Mask: 0x1f)         */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_STARTUP_TDRIVE_Pos (5UL) /*!< XTAL32M_STARTUP_TDRIVE (Bit 5)                        */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_STARTUP_TDRIVE_Msk (0xe0UL) /*!< XTAL32M_STARTUP_TDRIVE (Bitfield-Mask: 0x07)       */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_RCOSC_SYNC_DELAY_TRIM_Pos (0UL) /*!< XTAL32M_RCOSC_SYNC_DELAY_TRIM (Bit 0)          */\n#define CRG_XTAL_XTAL32M_CTRL1_REG_XTAL32M_RCOSC_SYNC_DELAY_TRIM_Msk (0x1fUL) /*!< XTAL32M_RCOSC_SYNC_DELAY_TRIM (Bitfield-Mask: 0x1f) */\n/* ===================================================  XTAL32M_CTRL2_REG  =================================================== */\n#define CRG_XTAL_XTAL32M_CTRL2_REG_XTAL32M_RCOSC_TRIM_SNS_Pos (14UL) /*!< XTAL32M_RCOSC_TRIM_SNS (Bit 14)                      */\n#define CRG_XTAL_XTAL32M_CTRL2_REG_XTAL32M_RCOSC_TRIM_SNS_Msk (0x3fc000UL) /*!< XTAL32M_RCOSC_TRIM_SNS (Bitfield-Mask: 0xff)   */\n#define CRG_XTAL_XTAL32M_CTRL2_REG_XTAL32M_CXCOMP_PHI_TRIM_Pos (12UL) /*!< XTAL32M_CXCOMP_PHI_TRIM (Bit 12)                    */\n#define CRG_XTAL_XTAL32M_CTRL2_REG_XTAL32M_CXCOMP_PHI_TRIM_Msk (0x3000UL) /*!< XTAL32M_CXCOMP_PHI_TRIM (Bitfield-Mask: 0x03)   */\n#define CRG_XTAL_XTAL32M_CTRL2_REG_XTAL32M_CXCOMP_TRIM_CAP_Pos (3UL) /*!< XTAL32M_CXCOMP_TRIM_CAP (Bit 3)                      */\n#define CRG_XTAL_XTAL32M_CTRL2_REG_XTAL32M_CXCOMP_TRIM_CAP_Msk (0xff8UL) /*!< XTAL32M_CXCOMP_TRIM_CAP (Bitfield-Mask: 0x1ff)   */\n/* ===================================================  XTAL32M_CTRL3_REG  =================================================== */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_RCOSC_TRIM_STROBE_Pos (30UL) /*!< XTAL32M_RCOSC_TRIM_STROBE (Bit 30)                */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_RCOSC_TRIM_STROBE_Msk (0x40000000UL) /*!< XTAL32M_RCOSC_TRIM_STROBE (Bitfield-Mask: 0x01) */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_FREQ_DET_START_Pos (22UL) /*!< XTAL32M_FREQ_DET_START (Bit 22)                      */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_FREQ_DET_START_Msk (0x400000UL) /*!< XTAL32M_FREQ_DET_START (Bitfield-Mask: 0x01)   */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_SW_CTRL_MODE_Pos (18UL)  /*!< XTAL32M_SW_CTRL_MODE (Bit 18)                         */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_SW_CTRL_MODE_Msk (0x40000UL) /*!< XTAL32M_SW_CTRL_MODE (Bitfield-Mask: 0x01)        */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_RCOSC_BAND_SELECT_Pos (14UL) /*!< XTAL32M_RCOSC_BAND_SELECT (Bit 14)                */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_RCOSC_BAND_SELECT_Msk (0x3c000UL) /*!< XTAL32M_RCOSC_BAND_SELECT (Bitfield-Mask: 0x0f) */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_RCOSC_TRIM_Pos (4UL)     /*!< XTAL32M_RCOSC_TRIM (Bit 4)                            */\n#define CRG_XTAL_XTAL32M_CTRL3_REG_XTAL32M_RCOSC_TRIM_Msk (0x3ff0UL) /*!< XTAL32M_RCOSC_TRIM (Bitfield-Mask: 0x3ff)            */\n/* ===================================================  XTAL32M_CTRL4_REG  =================================================== */\n/* ===================================================  XTAL32M_STAT0_REG  =================================================== */\n#define CRG_XTAL_XTAL32M_STAT0_REG_XTAL32M_RCOSC_BAND_SELECT_STAT_Pos (28UL) /*!< XTAL32M_RCOSC_BAND_SELECT_STAT (Bit 28)      */\n#define CRG_XTAL_XTAL32M_STAT0_REG_XTAL32M_RCOSC_BAND_SELECT_STAT_Msk (0xf0000000UL) /*!< XTAL32M_RCOSC_BAND_SELECT_STAT (Bitfield-Mask: 0x0f) */\n#define CRG_XTAL_XTAL32M_STAT0_REG_XTAL32M_RCOSC_CALIBRATION_DONE_Pos (15UL) /*!< XTAL32M_RCOSC_CALIBRATION_DONE (Bit 15)      */\n#define CRG_XTAL_XTAL32M_STAT0_REG_XTAL32M_RCOSC_CALIBRATION_DONE_Msk (0x8000UL) /*!< XTAL32M_RCOSC_CALIBRATION_DONE (Bitfield-Mask: 0x01) */\n/* ===================================================  XTAL32M_STAT1_REG  =================================================== */\n#define CRG_XTAL_XTAL32M_STAT1_REG_XTAL32M_CAL_STATE_Pos (4UL)      /*!< XTAL32M_CAL_STATE (Bit 4)                             */\n#define CRG_XTAL_XTAL32M_STAT1_REG_XTAL32M_CAL_STATE_Msk (0xf0UL)   /*!< XTAL32M_CAL_STATE (Bitfield-Mask: 0x0f)               */\n#define CRG_XTAL_XTAL32M_STAT1_REG_XTAL32M_STATE_Pos (0UL)          /*!< XTAL32M_STATE (Bit 0)                                 */\n#define CRG_XTAL_XTAL32M_STAT1_REG_XTAL32M_STATE_Msk (0xfUL)        /*!< XTAL32M_STATE (Bitfield-Mask: 0x0f)                   */\n/* ===================================================  XTALRDY_CTRL_REG  ==================================================== */\n#define CRG_XTAL_XTALRDY_CTRL_REG_XTALRDY_CLK_SEL_Pos (8UL)         /*!< XTALRDY_CLK_SEL (Bit 8)                               */\n#define CRG_XTAL_XTALRDY_CTRL_REG_XTALRDY_CLK_SEL_Msk (0x100UL)     /*!< XTALRDY_CLK_SEL (Bitfield-Mask: 0x01)                 */\n#define CRG_XTAL_XTALRDY_CTRL_REG_XTALRDY_CNT_Pos (0UL)             /*!< XTALRDY_CNT (Bit 0)                                   */\n#define CRG_XTAL_XTALRDY_CTRL_REG_XTALRDY_CNT_Msk (0xffUL)          /*!< XTALRDY_CNT (Bitfield-Mask: 0xff)                     */\n/* ===================================================  XTALRDY_STAT_REG  ==================================================== */\n#define CRG_XTAL_XTALRDY_STAT_REG_XTALRDY_COUNT_Pos (8UL)           /*!< XTALRDY_COUNT (Bit 8)                                 */\n#define CRG_XTAL_XTALRDY_STAT_REG_XTALRDY_COUNT_Msk (0xff00UL)      /*!< XTALRDY_COUNT (Bitfield-Mask: 0xff)                   */\n#define CRG_XTAL_XTALRDY_STAT_REG_XTALRDY_STAT_Pos (0UL)            /*!< XTALRDY_STAT (Bit 0)                                  */\n#define CRG_XTAL_XTALRDY_STAT_REG_XTALRDY_STAT_Msk (0xffUL)         /*!< XTALRDY_STAT (Bitfield-Mask: 0xff)                    */\n\n\n/* =========================================================================================================================== */\n/* ================                                           DCDC                                            ================ */\n/* =========================================================================================================================== */\n\n/* ====================================================  DCDC_CTRL1_REG  ===================================================== */\n#define DCDC_DCDC_CTRL1_REG_DCDC_SH_ENABLE_Pos (31UL)               /*!< DCDC_SH_ENABLE (Bit 31)                               */\n#define DCDC_DCDC_CTRL1_REG_DCDC_SH_ENABLE_Msk (0x80000000UL)       /*!< DCDC_SH_ENABLE (Bitfield-Mask: 0x01)                  */\n#define DCDC_DCDC_CTRL1_REG_DCDC_STARTUP_DELAY_Pos (26UL)           /*!< DCDC_STARTUP_DELAY (Bit 26)                           */\n#define DCDC_DCDC_CTRL1_REG_DCDC_STARTUP_DELAY_Msk (0x7c000000UL)   /*!< DCDC_STARTUP_DELAY (Bitfield-Mask: 0x1f)              */\n#define DCDC_DCDC_CTRL1_REG_DCDC_IDLE_MAX_FAST_DOWNRAMP_Pos (20UL)  /*!< DCDC_IDLE_MAX_FAST_DOWNRAMP (Bit 20)                  */\n#define DCDC_DCDC_CTRL1_REG_DCDC_IDLE_MAX_FAST_DOWNRAMP_Msk (0x3f00000UL) /*!< DCDC_IDLE_MAX_FAST_DOWNRAMP (Bitfield-Mask: 0x3f) */\n#define DCDC_DCDC_CTRL1_REG_DCDC_SW_TIMEOUT_Pos (15UL)              /*!< DCDC_SW_TIMEOUT (Bit 15)                              */\n#define DCDC_DCDC_CTRL1_REG_DCDC_SW_TIMEOUT_Msk (0xf8000UL)         /*!< DCDC_SW_TIMEOUT (Bitfield-Mask: 0x1f)                 */\n#define DCDC_DCDC_CTRL1_REG_DCDC_FAST_STARTUP_Pos (14UL)            /*!< DCDC_FAST_STARTUP (Bit 14)                            */\n#define DCDC_DCDC_CTRL1_REG_DCDC_FAST_STARTUP_Msk (0x4000UL)        /*!< DCDC_FAST_STARTUP (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_CTRL1_REG_DCDC_MAN_LV_MODE_Pos (13UL)             /*!< DCDC_MAN_LV_MODE (Bit 13)                             */\n#define DCDC_DCDC_CTRL1_REG_DCDC_MAN_LV_MODE_Msk (0x2000UL)         /*!< DCDC_MAN_LV_MODE (Bitfield-Mask: 0x01)                */\n#define DCDC_DCDC_CTRL1_REG_DCDC_AUTO_LV_MODE_Pos (12UL)            /*!< DCDC_AUTO_LV_MODE (Bit 12)                            */\n#define DCDC_DCDC_CTRL1_REG_DCDC_AUTO_LV_MODE_Msk (0x1000UL)        /*!< DCDC_AUTO_LV_MODE (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_CTRL1_REG_DCDC_IDLE_CLK_DIV_Pos (10UL)            /*!< DCDC_IDLE_CLK_DIV (Bit 10)                            */\n#define DCDC_DCDC_CTRL1_REG_DCDC_IDLE_CLK_DIV_Msk (0xc00UL)         /*!< DCDC_IDLE_CLK_DIV (Bitfield-Mask: 0x03)               */\n#define DCDC_DCDC_CTRL1_REG_DCDC_PRIORITY_Pos (2UL)                 /*!< DCDC_PRIORITY (Bit 2)                                 */\n#define DCDC_DCDC_CTRL1_REG_DCDC_PRIORITY_Msk (0x3fcUL)             /*!< DCDC_PRIORITY (Bitfield-Mask: 0xff)                   */\n#define DCDC_DCDC_CTRL1_REG_DCDC_FW_ENABLE_Pos (1UL)                /*!< DCDC_FW_ENABLE (Bit 1)                                */\n#define DCDC_DCDC_CTRL1_REG_DCDC_FW_ENABLE_Msk (0x2UL)              /*!< DCDC_FW_ENABLE (Bitfield-Mask: 0x01)                  */\n#define DCDC_DCDC_CTRL1_REG_DCDC_ENABLE_Pos (0UL)                   /*!< DCDC_ENABLE (Bit 0)                                   */\n#define DCDC_DCDC_CTRL1_REG_DCDC_ENABLE_Msk (0x1UL)                 /*!< DCDC_ENABLE (Bitfield-Mask: 0x01)                     */\n/* ====================================================  DCDC_CTRL2_REG  ===================================================== */\n#define DCDC_DCDC_CTRL2_REG_DCDC_V_NOK_CNT_MAX_Pos (24UL)           /*!< DCDC_V_NOK_CNT_MAX (Bit 24)                           */\n#define DCDC_DCDC_CTRL2_REG_DCDC_V_NOK_CNT_MAX_Msk (0xf000000UL)    /*!< DCDC_V_NOK_CNT_MAX (Bitfield-Mask: 0x0f)              */\n#define DCDC_DCDC_CTRL2_REG_DCDC_N_COMP_TRIM_MAN_Pos (22UL)         /*!< DCDC_N_COMP_TRIM_MAN (Bit 22)                         */\n#define DCDC_DCDC_CTRL2_REG_DCDC_N_COMP_TRIM_MAN_Msk (0x400000UL)   /*!< DCDC_N_COMP_TRIM_MAN (Bitfield-Mask: 0x01)            */\n#define DCDC_DCDC_CTRL2_REG_DCDC_N_COMP_TRIM_VAL_Pos (16UL)         /*!< DCDC_N_COMP_TRIM_VAL (Bit 16)                         */\n#define DCDC_DCDC_CTRL2_REG_DCDC_N_COMP_TRIM_VAL_Msk (0x3f0000UL)   /*!< DCDC_N_COMP_TRIM_VAL (Bitfield-Mask: 0x3f)            */\n#define DCDC_DCDC_CTRL2_REG_DCDC_TIMEOUT_IRQ_TRIG_Pos (12UL)        /*!< DCDC_TIMEOUT_IRQ_TRIG (Bit 12)                        */\n#define DCDC_DCDC_CTRL2_REG_DCDC_TIMEOUT_IRQ_TRIG_Msk (0xf000UL)    /*!< DCDC_TIMEOUT_IRQ_TRIG (Bitfield-Mask: 0x0f)           */\n#define DCDC_DCDC_CTRL2_REG_DCDC_TIMEOUT_IRQ_RES_Pos (8UL)          /*!< DCDC_TIMEOUT_IRQ_RES (Bit 8)                          */\n#define DCDC_DCDC_CTRL2_REG_DCDC_TIMEOUT_IRQ_RES_Msk (0xf00UL)      /*!< DCDC_TIMEOUT_IRQ_RES (Bitfield-Mask: 0x0f)            */\n#define DCDC_DCDC_CTRL2_REG_DCDC_SLOPE_CONTROL_Pos (6UL)            /*!< DCDC_SLOPE_CONTROL (Bit 6)                            */\n#define DCDC_DCDC_CTRL2_REG_DCDC_SLOPE_CONTROL_Msk (0xc0UL)         /*!< DCDC_SLOPE_CONTROL (Bitfield-Mask: 0x03)              */\n#define DCDC_DCDC_CTRL2_REG_DCDC_VBTSTRP_TRIM_Pos (4UL)             /*!< DCDC_VBTSTRP_TRIM (Bit 4)                             */\n#define DCDC_DCDC_CTRL2_REG_DCDC_VBTSTRP_TRIM_Msk (0x30UL)          /*!< DCDC_VBTSTRP_TRIM (Bitfield-Mask: 0x03)               */\n#define DCDC_DCDC_CTRL2_REG_DCDC_LSSUP_TRIM_Pos (2UL)               /*!< DCDC_LSSUP_TRIM (Bit 2)                               */\n#define DCDC_DCDC_CTRL2_REG_DCDC_LSSUP_TRIM_Msk (0xcUL)             /*!< DCDC_LSSUP_TRIM (Bitfield-Mask: 0x03)                 */\n#define DCDC_DCDC_CTRL2_REG_DCDC_HSGND_TRIM_Pos (0UL)               /*!< DCDC_HSGND_TRIM (Bit 0)                               */\n#define DCDC_DCDC_CTRL2_REG_DCDC_HSGND_TRIM_Msk (0x3UL)             /*!< DCDC_HSGND_TRIM (Bitfield-Mask: 0x03)                 */\n/* ==================================================  DCDC_IRQ_CLEAR_REG  =================================================== */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_LOW_VBAT_IRQ_CLEAR_Pos (4UL)   /*!< DCDC_LOW_VBAT_IRQ_CLEAR (Bit 4)                       */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_LOW_VBAT_IRQ_CLEAR_Msk (0x10UL) /*!< DCDC_LOW_VBAT_IRQ_CLEAR (Bitfield-Mask: 0x01)        */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_V18P_TIMEOUT_IRQ_CLEAR_Pos (3UL) /*!< DCDC_V18P_TIMEOUT_IRQ_CLEAR (Bit 3)                 */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_V18P_TIMEOUT_IRQ_CLEAR_Msk (0x8UL) /*!< DCDC_V18P_TIMEOUT_IRQ_CLEAR (Bitfield-Mask: 0x01) */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_VDD_TIMEOUT_IRQ_CLEAR_Pos (2UL) /*!< DCDC_VDD_TIMEOUT_IRQ_CLEAR (Bit 2)                   */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_VDD_TIMEOUT_IRQ_CLEAR_Msk (0x4UL) /*!< DCDC_VDD_TIMEOUT_IRQ_CLEAR (Bitfield-Mask: 0x01)   */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_V18_TIMEOUT_IRQ_CLEAR_Pos (1UL) /*!< DCDC_V18_TIMEOUT_IRQ_CLEAR (Bit 1)                   */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_V18_TIMEOUT_IRQ_CLEAR_Msk (0x2UL) /*!< DCDC_V18_TIMEOUT_IRQ_CLEAR (Bitfield-Mask: 0x01)   */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_V14_TIMEOUT_IRQ_CLEAR_Pos (0UL) /*!< DCDC_V14_TIMEOUT_IRQ_CLEAR (Bit 0)                   */\n#define DCDC_DCDC_IRQ_CLEAR_REG_DCDC_V14_TIMEOUT_IRQ_CLEAR_Msk (0x1UL) /*!< DCDC_V14_TIMEOUT_IRQ_CLEAR (Bitfield-Mask: 0x01)   */\n/* ===================================================  DCDC_IRQ_MASK_REG  =================================================== */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_LOW_VBAT_IRQ_MASK_Pos (4UL)     /*!< DCDC_LOW_VBAT_IRQ_MASK (Bit 4)                        */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_LOW_VBAT_IRQ_MASK_Msk (0x10UL)  /*!< DCDC_LOW_VBAT_IRQ_MASK (Bitfield-Mask: 0x01)          */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_V18P_TIMEOUT_IRQ_MASK_Pos (3UL) /*!< DCDC_V18P_TIMEOUT_IRQ_MASK (Bit 3)                    */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_V18P_TIMEOUT_IRQ_MASK_Msk (0x8UL) /*!< DCDC_V18P_TIMEOUT_IRQ_MASK (Bitfield-Mask: 0x01)    */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_VDD_TIMEOUT_IRQ_MASK_Pos (2UL)  /*!< DCDC_VDD_TIMEOUT_IRQ_MASK (Bit 2)                     */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_VDD_TIMEOUT_IRQ_MASK_Msk (0x4UL) /*!< DCDC_VDD_TIMEOUT_IRQ_MASK (Bitfield-Mask: 0x01)      */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_V18_TIMEOUT_IRQ_MASK_Pos (1UL)  /*!< DCDC_V18_TIMEOUT_IRQ_MASK (Bit 1)                     */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_V18_TIMEOUT_IRQ_MASK_Msk (0x2UL) /*!< DCDC_V18_TIMEOUT_IRQ_MASK (Bitfield-Mask: 0x01)      */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_V14_TIMEOUT_IRQ_MASK_Pos (0UL)  /*!< DCDC_V14_TIMEOUT_IRQ_MASK (Bit 0)                     */\n#define DCDC_DCDC_IRQ_MASK_REG_DCDC_V14_TIMEOUT_IRQ_MASK_Msk (0x1UL) /*!< DCDC_V14_TIMEOUT_IRQ_MASK (Bitfield-Mask: 0x01)      */\n/* ==================================================  DCDC_IRQ_STATUS_REG  ================================================== */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_LOW_VBAT_IRQ_STATUS_Pos (4UL) /*!< DCDC_LOW_VBAT_IRQ_STATUS (Bit 4)                      */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_LOW_VBAT_IRQ_STATUS_Msk (0x10UL) /*!< DCDC_LOW_VBAT_IRQ_STATUS (Bitfield-Mask: 0x01)     */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_V18P_TIMEOUT_IRQ_STATUS_Pos (3UL) /*!< DCDC_V18P_TIMEOUT_IRQ_STATUS (Bit 3)              */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_V18P_TIMEOUT_IRQ_STATUS_Msk (0x8UL) /*!< DCDC_V18P_TIMEOUT_IRQ_STATUS (Bitfield-Mask: 0x01) */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_VDD_TIMEOUT_IRQ_STATUS_Pos (2UL) /*!< DCDC_VDD_TIMEOUT_IRQ_STATUS (Bit 2)                */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_VDD_TIMEOUT_IRQ_STATUS_Msk (0x4UL) /*!< DCDC_VDD_TIMEOUT_IRQ_STATUS (Bitfield-Mask: 0x01) */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_V18_TIMEOUT_IRQ_STATUS_Pos (1UL) /*!< DCDC_V18_TIMEOUT_IRQ_STATUS (Bit 1)                */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_V18_TIMEOUT_IRQ_STATUS_Msk (0x2UL) /*!< DCDC_V18_TIMEOUT_IRQ_STATUS (Bitfield-Mask: 0x01) */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_V14_TIMEOUT_IRQ_STATUS_Pos (0UL) /*!< DCDC_V14_TIMEOUT_IRQ_STATUS (Bit 0)                */\n#define DCDC_DCDC_IRQ_STATUS_REG_DCDC_V14_TIMEOUT_IRQ_STATUS_Msk (0x1UL) /*!< DCDC_V14_TIMEOUT_IRQ_STATUS (Bitfield-Mask: 0x01) */\n/* ===================================================  DCDC_STATUS1_REG  ==================================================== */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18P_AVAILABLE_Pos (27UL)        /*!< DCDC_V18P_AVAILABLE (Bit 27)                          */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18P_AVAILABLE_Msk (0x8000000UL) /*!< DCDC_V18P_AVAILABLE (Bitfield-Mask: 0x01)             */\n#define DCDC_DCDC_STATUS1_REG_DCDC_VDD_AVAILABLE_Pos (26UL)         /*!< DCDC_VDD_AVAILABLE (Bit 26)                           */\n#define DCDC_DCDC_STATUS1_REG_DCDC_VDD_AVAILABLE_Msk (0x4000000UL)  /*!< DCDC_VDD_AVAILABLE (Bitfield-Mask: 0x01)              */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18_AVAILABLE_Pos (25UL)         /*!< DCDC_V18_AVAILABLE (Bit 25)                           */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18_AVAILABLE_Msk (0x2000000UL)  /*!< DCDC_V18_AVAILABLE (Bitfield-Mask: 0x01)              */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V14_AVAILABLE_Pos (24UL)         /*!< DCDC_V14_AVAILABLE (Bit 24)                           */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V14_AVAILABLE_Msk (0x1000000UL)  /*!< DCDC_V14_AVAILABLE (Bitfield-Mask: 0x01)              */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18P_COMP_OK_Pos (23UL)          /*!< DCDC_V18P_COMP_OK (Bit 23)                            */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18P_COMP_OK_Msk (0x800000UL)    /*!< DCDC_V18P_COMP_OK (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_VDD_COMP_OK_Pos (22UL)           /*!< DCDC_VDD_COMP_OK (Bit 22)                             */\n#define DCDC_DCDC_STATUS1_REG_DCDC_VDD_COMP_OK_Msk (0x400000UL)     /*!< DCDC_VDD_COMP_OK (Bitfield-Mask: 0x01)                */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18_COMP_OK_Pos (21UL)           /*!< DCDC_V18_COMP_OK (Bit 21)                             */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18_COMP_OK_Msk (0x200000UL)     /*!< DCDC_V18_COMP_OK (Bitfield-Mask: 0x01)                */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V14_COMP_OK_Pos (20UL)           /*!< DCDC_V14_COMP_OK (Bit 20)                             */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V14_COMP_OK_Msk (0x100000UL)     /*!< DCDC_V14_COMP_OK (Bitfield-Mask: 0x01)                */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18P_COMP_NOK_Pos (19UL)         /*!< DCDC_V18P_COMP_NOK (Bit 19)                           */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18P_COMP_NOK_Msk (0x80000UL)    /*!< DCDC_V18P_COMP_NOK (Bitfield-Mask: 0x01)              */\n#define DCDC_DCDC_STATUS1_REG_DCDC_VDD_COMP_NOK_Pos (18UL)          /*!< DCDC_VDD_COMP_NOK (Bit 18)                            */\n#define DCDC_DCDC_STATUS1_REG_DCDC_VDD_COMP_NOK_Msk (0x40000UL)     /*!< DCDC_VDD_COMP_NOK (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18_COMP_NOK_Pos (17UL)          /*!< DCDC_V18_COMP_NOK (Bit 17)                            */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18_COMP_NOK_Msk (0x20000UL)     /*!< DCDC_V18_COMP_NOK (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V14_COMP_NOK_Pos (16UL)          /*!< DCDC_V14_COMP_NOK (Bit 16)                            */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V14_COMP_NOK_Msk (0x10000UL)     /*!< DCDC_V14_COMP_NOK (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_N_COMP_P_Pos (11UL)              /*!< DCDC_N_COMP_P (Bit 11)                                */\n#define DCDC_DCDC_STATUS1_REG_DCDC_N_COMP_P_Msk (0x800UL)           /*!< DCDC_N_COMP_P (Bitfield-Mask: 0x01)                   */\n#define DCDC_DCDC_STATUS1_REG_DCDC_N_COMP_N_Pos (10UL)              /*!< DCDC_N_COMP_N (Bit 10)                                */\n#define DCDC_DCDC_STATUS1_REG_DCDC_N_COMP_N_Msk (0x400UL)           /*!< DCDC_N_COMP_N (Bitfield-Mask: 0x01)                   */\n#define DCDC_DCDC_STATUS1_REG_DCDC_P_COMP_Pos (9UL)                 /*!< DCDC_P_COMP (Bit 9)                                   */\n#define DCDC_DCDC_STATUS1_REG_DCDC_P_COMP_Msk (0x200UL)             /*!< DCDC_P_COMP (Bitfield-Mask: 0x01)                     */\n#define DCDC_DCDC_STATUS1_REG_DCDC_N_COMP_Pos (8UL)                 /*!< DCDC_N_COMP (Bit 8)                                   */\n#define DCDC_DCDC_STATUS1_REG_DCDC_N_COMP_Msk (0x100UL)             /*!< DCDC_N_COMP (Bitfield-Mask: 0x01)                     */\n#define DCDC_DCDC_STATUS1_REG_DCDC_LV_MODE_Pos (7UL)                /*!< DCDC_LV_MODE (Bit 7)                                  */\n#define DCDC_DCDC_STATUS1_REG_DCDC_LV_MODE_Msk (0x80UL)             /*!< DCDC_LV_MODE (Bitfield-Mask: 0x01)                    */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18P_SW_STATE_Pos (6UL)          /*!< DCDC_V18P_SW_STATE (Bit 6)                            */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18P_SW_STATE_Msk (0x40UL)       /*!< DCDC_V18P_SW_STATE (Bitfield-Mask: 0x01)              */\n#define DCDC_DCDC_STATUS1_REG_DCDC_VDD_SW_STATE_Pos (5UL)           /*!< DCDC_VDD_SW_STATE (Bit 5)                             */\n#define DCDC_DCDC_STATUS1_REG_DCDC_VDD_SW_STATE_Msk (0x20UL)        /*!< DCDC_VDD_SW_STATE (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18_SW_STATE_Pos (4UL)           /*!< DCDC_V18_SW_STATE (Bit 4)                             */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V18_SW_STATE_Msk (0x10UL)        /*!< DCDC_V18_SW_STATE (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V14_SW_STATE_Pos (3UL)           /*!< DCDC_V14_SW_STATE (Bit 3)                             */\n#define DCDC_DCDC_STATUS1_REG_DCDC_V14_SW_STATE_Msk (0x8UL)         /*!< DCDC_V14_SW_STATE (Bitfield-Mask: 0x01)               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_N_SW_STATE_Pos (2UL)             /*!< DCDC_N_SW_STATE (Bit 2)                               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_N_SW_STATE_Msk (0x4UL)           /*!< DCDC_N_SW_STATE (Bitfield-Mask: 0x01)                 */\n#define DCDC_DCDC_STATUS1_REG_DCDC_P_SW_STATE_Pos (1UL)             /*!< DCDC_P_SW_STATE (Bit 1)                               */\n#define DCDC_DCDC_STATUS1_REG_DCDC_P_SW_STATE_Msk (0x2UL)           /*!< DCDC_P_SW_STATE (Bitfield-Mask: 0x01)                 */\n#define DCDC_DCDC_STATUS1_REG_DCDC_STARTUP_COMPLETE_Pos (0UL)       /*!< DCDC_STARTUP_COMPLETE (Bit 0)                         */\n#define DCDC_DCDC_STATUS1_REG_DCDC_STARTUP_COMPLETE_Msk (0x1UL)     /*!< DCDC_STARTUP_COMPLETE (Bitfield-Mask: 0x01)           */\n/* =====================================================  DCDC_V14_REG  ====================================================== */\n#define DCDC_DCDC_V14_REG_DCDC_V14_FAST_RAMPING_Pos (31UL)          /*!< DCDC_V14_FAST_RAMPING (Bit 31)                        */\n#define DCDC_DCDC_V14_REG_DCDC_V14_FAST_RAMPING_Msk (0x80000000UL)  /*!< DCDC_V14_FAST_RAMPING (Bitfield-Mask: 0x01)           */\n#define DCDC_DCDC_V14_REG_DCDC_V14_TRIM_Pos (27UL)                  /*!< DCDC_V14_TRIM (Bit 27)                                */\n#define DCDC_DCDC_V14_REG_DCDC_V14_TRIM_Msk (0x8000000UL)           /*!< DCDC_V14_TRIM (Bitfield-Mask: 0x01)                   */\n#define DCDC_DCDC_V14_REG_DCDC_V14_CUR_LIM_MAX_HV_Pos (22UL)        /*!< DCDC_V14_CUR_LIM_MAX_HV (Bit 22)                      */\n#define DCDC_DCDC_V14_REG_DCDC_V14_CUR_LIM_MAX_HV_Msk (0x7c00000UL) /*!< DCDC_V14_CUR_LIM_MAX_HV (Bitfield-Mask: 0x1f)         */\n#define DCDC_DCDC_V14_REG_DCDC_V14_CUR_LIM_MAX_LV_Pos (17UL)        /*!< DCDC_V14_CUR_LIM_MAX_LV (Bit 17)                      */\n#define DCDC_DCDC_V14_REG_DCDC_V14_CUR_LIM_MAX_LV_Msk (0x3e0000UL)  /*!< DCDC_V14_CUR_LIM_MAX_LV (Bitfield-Mask: 0x1f)         */\n#define DCDC_DCDC_V14_REG_DCDC_V14_CUR_LIM_MIN_Pos (12UL)           /*!< DCDC_V14_CUR_LIM_MIN (Bit 12)                         */\n#define DCDC_DCDC_V14_REG_DCDC_V14_CUR_LIM_MIN_Msk (0x1f000UL)      /*!< DCDC_V14_CUR_LIM_MIN (Bitfield-Mask: 0x1f)            */\n#define DCDC_DCDC_V14_REG_DCDC_V14_IDLE_HYST_Pos (7UL)              /*!< DCDC_V14_IDLE_HYST (Bit 7)                            */\n#define DCDC_DCDC_V14_REG_DCDC_V14_IDLE_HYST_Msk (0xf80UL)          /*!< DCDC_V14_IDLE_HYST (Bitfield-Mask: 0x1f)              */\n#define DCDC_DCDC_V14_REG_DCDC_V14_IDLE_MIN_Pos (2UL)               /*!< DCDC_V14_IDLE_MIN (Bit 2)                             */\n#define DCDC_DCDC_V14_REG_DCDC_V14_IDLE_MIN_Msk (0x7cUL)            /*!< DCDC_V14_IDLE_MIN (Bitfield-Mask: 0x1f)               */\n#define DCDC_DCDC_V14_REG_DCDC_V14_ENABLE_HV_Pos (1UL)              /*!< DCDC_V14_ENABLE_HV (Bit 1)                            */\n#define DCDC_DCDC_V14_REG_DCDC_V14_ENABLE_HV_Msk (0x2UL)            /*!< DCDC_V14_ENABLE_HV (Bitfield-Mask: 0x01)              */\n#define DCDC_DCDC_V14_REG_DCDC_V14_ENABLE_LV_Pos (0UL)              /*!< DCDC_V14_ENABLE_LV (Bit 0)                            */\n#define DCDC_DCDC_V14_REG_DCDC_V14_ENABLE_LV_Msk (0x1UL)            /*!< DCDC_V14_ENABLE_LV (Bitfield-Mask: 0x01)              */\n/* =====================================================  DCDC_V18P_REG  ===================================================== */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_FAST_RAMPING_Pos (31UL)        /*!< DCDC_V18P_FAST_RAMPING (Bit 31)                       */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_FAST_RAMPING_Msk (0x80000000UL) /*!< DCDC_V18P_FAST_RAMPING (Bitfield-Mask: 0x01)         */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_TRIM_Pos (27UL)                /*!< DCDC_V18P_TRIM (Bit 27)                               */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_TRIM_Msk (0x78000000UL)        /*!< DCDC_V18P_TRIM (Bitfield-Mask: 0x0f)                  */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_CUR_LIM_MAX_HV_Pos (22UL)      /*!< DCDC_V18P_CUR_LIM_MAX_HV (Bit 22)                     */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_CUR_LIM_MAX_HV_Msk (0x7c00000UL) /*!< DCDC_V18P_CUR_LIM_MAX_HV (Bitfield-Mask: 0x1f)      */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_CUR_LIM_MAX_LV_Pos (17UL)      /*!< DCDC_V18P_CUR_LIM_MAX_LV (Bit 17)                     */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_CUR_LIM_MAX_LV_Msk (0x3e0000UL) /*!< DCDC_V18P_CUR_LIM_MAX_LV (Bitfield-Mask: 0x1f)       */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_CUR_LIM_MIN_Pos (12UL)         /*!< DCDC_V18P_CUR_LIM_MIN (Bit 12)                        */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_CUR_LIM_MIN_Msk (0x1f000UL)    /*!< DCDC_V18P_CUR_LIM_MIN (Bitfield-Mask: 0x1f)           */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_IDLE_HYST_Pos (7UL)            /*!< DCDC_V18P_IDLE_HYST (Bit 7)                           */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_IDLE_HYST_Msk (0xf80UL)        /*!< DCDC_V18P_IDLE_HYST (Bitfield-Mask: 0x1f)             */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_IDLE_MIN_Pos (2UL)             /*!< DCDC_V18P_IDLE_MIN (Bit 2)                            */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_IDLE_MIN_Msk (0x7cUL)          /*!< DCDC_V18P_IDLE_MIN (Bitfield-Mask: 0x1f)              */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_ENABLE_HV_Pos (1UL)            /*!< DCDC_V18P_ENABLE_HV (Bit 1)                           */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_ENABLE_HV_Msk (0x2UL)          /*!< DCDC_V18P_ENABLE_HV (Bitfield-Mask: 0x01)             */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_ENABLE_LV_Pos (0UL)            /*!< DCDC_V18P_ENABLE_LV (Bit 0)                           */\n#define DCDC_DCDC_V18P_REG_DCDC_V18P_ENABLE_LV_Msk (0x1UL)          /*!< DCDC_V18P_ENABLE_LV (Bitfield-Mask: 0x01)             */\n/* =====================================================  DCDC_V18_REG  ====================================================== */\n#define DCDC_DCDC_V18_REG_DCDC_V18_FAST_RAMPING_Pos (31UL)          /*!< DCDC_V18_FAST_RAMPING (Bit 31)                        */\n#define DCDC_DCDC_V18_REG_DCDC_V18_FAST_RAMPING_Msk (0x80000000UL)  /*!< DCDC_V18_FAST_RAMPING (Bitfield-Mask: 0x01)           */\n#define DCDC_DCDC_V18_REG_DCDC_V18_TRIM_Pos (27UL)                  /*!< DCDC_V18_TRIM (Bit 27)                                */\n#define DCDC_DCDC_V18_REG_DCDC_V18_TRIM_Msk (0x78000000UL)          /*!< DCDC_V18_TRIM (Bitfield-Mask: 0x0f)                   */\n#define DCDC_DCDC_V18_REG_DCDC_V18_CUR_LIM_MAX_HV_Pos (22UL)        /*!< DCDC_V18_CUR_LIM_MAX_HV (Bit 22)                      */\n#define DCDC_DCDC_V18_REG_DCDC_V18_CUR_LIM_MAX_HV_Msk (0x7c00000UL) /*!< DCDC_V18_CUR_LIM_MAX_HV (Bitfield-Mask: 0x1f)         */\n#define DCDC_DCDC_V18_REG_DCDC_V18_CUR_LIM_MAX_LV_Pos (17UL)        /*!< DCDC_V18_CUR_LIM_MAX_LV (Bit 17)                      */\n#define DCDC_DCDC_V18_REG_DCDC_V18_CUR_LIM_MAX_LV_Msk (0x3e0000UL)  /*!< DCDC_V18_CUR_LIM_MAX_LV (Bitfield-Mask: 0x1f)         */\n#define DCDC_DCDC_V18_REG_DCDC_V18_CUR_LIM_MIN_Pos (12UL)           /*!< DCDC_V18_CUR_LIM_MIN (Bit 12)                         */\n#define DCDC_DCDC_V18_REG_DCDC_V18_CUR_LIM_MIN_Msk (0x1f000UL)      /*!< DCDC_V18_CUR_LIM_MIN (Bitfield-Mask: 0x1f)            */\n#define DCDC_DCDC_V18_REG_DCDC_V18_IDLE_HYST_Pos (7UL)              /*!< DCDC_V18_IDLE_HYST (Bit 7)                            */\n#define DCDC_DCDC_V18_REG_DCDC_V18_IDLE_HYST_Msk (0xf80UL)          /*!< DCDC_V18_IDLE_HYST (Bitfield-Mask: 0x1f)              */\n#define DCDC_DCDC_V18_REG_DCDC_V18_IDLE_MIN_Pos (2UL)               /*!< DCDC_V18_IDLE_MIN (Bit 2)                             */\n#define DCDC_DCDC_V18_REG_DCDC_V18_IDLE_MIN_Msk (0x7cUL)            /*!< DCDC_V18_IDLE_MIN (Bitfield-Mask: 0x1f)               */\n#define DCDC_DCDC_V18_REG_DCDC_V18_ENABLE_HV_Pos (1UL)              /*!< DCDC_V18_ENABLE_HV (Bit 1)                            */\n#define DCDC_DCDC_V18_REG_DCDC_V18_ENABLE_HV_Msk (0x2UL)            /*!< DCDC_V18_ENABLE_HV (Bitfield-Mask: 0x01)              */\n#define DCDC_DCDC_V18_REG_DCDC_V18_ENABLE_LV_Pos (0UL)              /*!< DCDC_V18_ENABLE_LV (Bit 0)                            */\n#define DCDC_DCDC_V18_REG_DCDC_V18_ENABLE_LV_Msk (0x1UL)            /*!< DCDC_V18_ENABLE_LV (Bitfield-Mask: 0x01)              */\n/* =====================================================  DCDC_VDD_REG  ====================================================== */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_FAST_RAMPING_Pos (31UL)          /*!< DCDC_VDD_FAST_RAMPING (Bit 31)                        */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_FAST_RAMPING_Msk (0x80000000UL)  /*!< DCDC_VDD_FAST_RAMPING (Bitfield-Mask: 0x01)           */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_TRIM_Pos (27UL)                  /*!< DCDC_VDD_TRIM (Bit 27)                                */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_TRIM_Msk (0x38000000UL)          /*!< DCDC_VDD_TRIM (Bitfield-Mask: 0x07)                   */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_CUR_LIM_MAX_HV_Pos (22UL)        /*!< DCDC_VDD_CUR_LIM_MAX_HV (Bit 22)                      */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_CUR_LIM_MAX_HV_Msk (0x7c00000UL) /*!< DCDC_VDD_CUR_LIM_MAX_HV (Bitfield-Mask: 0x1f)         */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_CUR_LIM_MAX_LV_Pos (17UL)        /*!< DCDC_VDD_CUR_LIM_MAX_LV (Bit 17)                      */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_CUR_LIM_MAX_LV_Msk (0x3e0000UL)  /*!< DCDC_VDD_CUR_LIM_MAX_LV (Bitfield-Mask: 0x1f)         */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_CUR_LIM_MIN_Pos (12UL)           /*!< DCDC_VDD_CUR_LIM_MIN (Bit 12)                         */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_CUR_LIM_MIN_Msk (0x1f000UL)      /*!< DCDC_VDD_CUR_LIM_MIN (Bitfield-Mask: 0x1f)            */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_IDLE_HYST_Pos (7UL)              /*!< DCDC_VDD_IDLE_HYST (Bit 7)                            */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_IDLE_HYST_Msk (0xf80UL)          /*!< DCDC_VDD_IDLE_HYST (Bitfield-Mask: 0x1f)              */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_IDLE_MIN_Pos (2UL)               /*!< DCDC_VDD_IDLE_MIN (Bit 2)                             */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_IDLE_MIN_Msk (0x7cUL)            /*!< DCDC_VDD_IDLE_MIN (Bitfield-Mask: 0x1f)               */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_ENABLE_HV_Pos (1UL)              /*!< DCDC_VDD_ENABLE_HV (Bit 1)                            */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_ENABLE_HV_Msk (0x2UL)            /*!< DCDC_VDD_ENABLE_HV (Bitfield-Mask: 0x01)              */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_ENABLE_LV_Pos (0UL)              /*!< DCDC_VDD_ENABLE_LV (Bit 0)                            */\n#define DCDC_DCDC_VDD_REG_DCDC_VDD_ENABLE_LV_Msk (0x1UL)            /*!< DCDC_VDD_ENABLE_LV (Bitfield-Mask: 0x01)              */\n\n\n/* =========================================================================================================================== */\n/* ================                                            DMA                                            ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  DMA0_A_START_REG  ==================================================== */\n#define DMA_DMA0_A_START_REG_DMA0_A_START_Pos (0UL)                 /*!< DMA0_A_START (Bit 0)                                  */\n#define DMA_DMA0_A_START_REG_DMA0_A_START_Msk (0xffffffffUL)        /*!< DMA0_A_START (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  DMA0_B_START_REG  ==================================================== */\n#define DMA_DMA0_B_START_REG_DMA0_B_START_Pos (0UL)                 /*!< DMA0_B_START (Bit 0)                                  */\n#define DMA_DMA0_B_START_REG_DMA0_B_START_Msk (0xffffffffUL)        /*!< DMA0_B_START (Bitfield-Mask: 0xffffffff)              */\n/* =====================================================  DMA0_CTRL_REG  ===================================================== */\n#define DMA_DMA0_CTRL_REG_BUS_ERROR_DETECT_Pos (15UL)               /*!< BUS_ERROR_DETECT (Bit 15)                             */\n#define DMA_DMA0_CTRL_REG_BUS_ERROR_DETECT_Msk (0x8000UL)           /*!< BUS_ERROR_DETECT (Bitfield-Mask: 0x01)                */\n#define DMA_DMA0_CTRL_REG_BURST_MODE_Pos  (13UL)                    /*!< BURST_MODE (Bit 13)                                   */\n#define DMA_DMA0_CTRL_REG_BURST_MODE_Msk  (0x6000UL)                /*!< BURST_MODE (Bitfield-Mask: 0x03)                      */\n#define DMA_DMA0_CTRL_REG_REQ_SENSE_Pos   (12UL)                    /*!< REQ_SENSE (Bit 12)                                    */\n#define DMA_DMA0_CTRL_REG_REQ_SENSE_Msk   (0x1000UL)                /*!< REQ_SENSE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA0_CTRL_REG_DMA_INIT_Pos    (11UL)                    /*!< DMA_INIT (Bit 11)                                     */\n#define DMA_DMA0_CTRL_REG_DMA_INIT_Msk    (0x800UL)                 /*!< DMA_INIT (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA0_CTRL_REG_DMA_IDLE_Pos    (10UL)                    /*!< DMA_IDLE (Bit 10)                                     */\n#define DMA_DMA0_CTRL_REG_DMA_IDLE_Msk    (0x400UL)                 /*!< DMA_IDLE (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA0_CTRL_REG_DMA_PRIO_Pos    (7UL)                     /*!< DMA_PRIO (Bit 7)                                      */\n#define DMA_DMA0_CTRL_REG_DMA_PRIO_Msk    (0x380UL)                 /*!< DMA_PRIO (Bitfield-Mask: 0x07)                        */\n#define DMA_DMA0_CTRL_REG_CIRCULAR_Pos    (6UL)                     /*!< CIRCULAR (Bit 6)                                      */\n#define DMA_DMA0_CTRL_REG_CIRCULAR_Msk    (0x40UL)                  /*!< CIRCULAR (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA0_CTRL_REG_AINC_Pos        (5UL)                     /*!< AINC (Bit 5)                                          */\n#define DMA_DMA0_CTRL_REG_AINC_Msk        (0x20UL)                  /*!< AINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA0_CTRL_REG_BINC_Pos        (4UL)                     /*!< BINC (Bit 4)                                          */\n#define DMA_DMA0_CTRL_REG_BINC_Msk        (0x10UL)                  /*!< BINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA0_CTRL_REG_DREQ_MODE_Pos   (3UL)                     /*!< DREQ_MODE (Bit 3)                                     */\n#define DMA_DMA0_CTRL_REG_DREQ_MODE_Msk   (0x8UL)                   /*!< DREQ_MODE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA0_CTRL_REG_BW_Pos          (1UL)                     /*!< BW (Bit 1)                                            */\n#define DMA_DMA0_CTRL_REG_BW_Msk          (0x6UL)                   /*!< BW (Bitfield-Mask: 0x03)                              */\n#define DMA_DMA0_CTRL_REG_DMA_ON_Pos      (0UL)                     /*!< DMA_ON (Bit 0)                                        */\n#define DMA_DMA0_CTRL_REG_DMA_ON_Msk      (0x1UL)                   /*!< DMA_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  DMA0_IDX_REG  ====================================================== */\n#define DMA_DMA0_IDX_REG_DMA0_IDX_Pos     (0UL)                     /*!< DMA0_IDX (Bit 0)                                      */\n#define DMA_DMA0_IDX_REG_DMA0_IDX_Msk     (0xffffUL)                /*!< DMA0_IDX (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA0_INT_REG  ====================================================== */\n#define DMA_DMA0_INT_REG_DMA0_INT_Pos     (0UL)                     /*!< DMA0_INT (Bit 0)                                      */\n#define DMA_DMA0_INT_REG_DMA0_INT_Msk     (0xffffUL)                /*!< DMA0_INT (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA0_LEN_REG  ====================================================== */\n#define DMA_DMA0_LEN_REG_DMA0_LEN_Pos     (0UL)                     /*!< DMA0_LEN (Bit 0)                                      */\n#define DMA_DMA0_LEN_REG_DMA0_LEN_Msk     (0xffffUL)                /*!< DMA0_LEN (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  DMA1_A_START_REG  ==================================================== */\n#define DMA_DMA1_A_START_REG_DMA1_A_START_Pos (0UL)                 /*!< DMA1_A_START (Bit 0)                                  */\n#define DMA_DMA1_A_START_REG_DMA1_A_START_Msk (0xffffffffUL)        /*!< DMA1_A_START (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  DMA1_B_START_REG  ==================================================== */\n#define DMA_DMA1_B_START_REG_DMA1_B_START_Pos (0UL)                 /*!< DMA1_B_START (Bit 0)                                  */\n#define DMA_DMA1_B_START_REG_DMA1_B_START_Msk (0xffffffffUL)        /*!< DMA1_B_START (Bitfield-Mask: 0xffffffff)              */\n/* =====================================================  DMA1_CTRL_REG  ===================================================== */\n#define DMA_DMA1_CTRL_REG_BUS_ERROR_DETECT_Pos (15UL)               /*!< BUS_ERROR_DETECT (Bit 15)                             */\n#define DMA_DMA1_CTRL_REG_BUS_ERROR_DETECT_Msk (0x8000UL)           /*!< BUS_ERROR_DETECT (Bitfield-Mask: 0x01)                */\n#define DMA_DMA1_CTRL_REG_BURST_MODE_Pos  (13UL)                    /*!< BURST_MODE (Bit 13)                                   */\n#define DMA_DMA1_CTRL_REG_BURST_MODE_Msk  (0x6000UL)                /*!< BURST_MODE (Bitfield-Mask: 0x03)                      */\n#define DMA_DMA1_CTRL_REG_REQ_SENSE_Pos   (12UL)                    /*!< REQ_SENSE (Bit 12)                                    */\n#define DMA_DMA1_CTRL_REG_REQ_SENSE_Msk   (0x1000UL)                /*!< REQ_SENSE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA1_CTRL_REG_DMA_INIT_Pos    (11UL)                    /*!< DMA_INIT (Bit 11)                                     */\n#define DMA_DMA1_CTRL_REG_DMA_INIT_Msk    (0x800UL)                 /*!< DMA_INIT (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA1_CTRL_REG_DMA_IDLE_Pos    (10UL)                    /*!< DMA_IDLE (Bit 10)                                     */\n#define DMA_DMA1_CTRL_REG_DMA_IDLE_Msk    (0x400UL)                 /*!< DMA_IDLE (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA1_CTRL_REG_DMA_PRIO_Pos    (7UL)                     /*!< DMA_PRIO (Bit 7)                                      */\n#define DMA_DMA1_CTRL_REG_DMA_PRIO_Msk    (0x380UL)                 /*!< DMA_PRIO (Bitfield-Mask: 0x07)                        */\n#define DMA_DMA1_CTRL_REG_CIRCULAR_Pos    (6UL)                     /*!< CIRCULAR (Bit 6)                                      */\n#define DMA_DMA1_CTRL_REG_CIRCULAR_Msk    (0x40UL)                  /*!< CIRCULAR (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA1_CTRL_REG_AINC_Pos        (5UL)                     /*!< AINC (Bit 5)                                          */\n#define DMA_DMA1_CTRL_REG_AINC_Msk        (0x20UL)                  /*!< AINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA1_CTRL_REG_BINC_Pos        (4UL)                     /*!< BINC (Bit 4)                                          */\n#define DMA_DMA1_CTRL_REG_BINC_Msk        (0x10UL)                  /*!< BINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA1_CTRL_REG_DREQ_MODE_Pos   (3UL)                     /*!< DREQ_MODE (Bit 3)                                     */\n#define DMA_DMA1_CTRL_REG_DREQ_MODE_Msk   (0x8UL)                   /*!< DREQ_MODE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA1_CTRL_REG_BW_Pos          (1UL)                     /*!< BW (Bit 1)                                            */\n#define DMA_DMA1_CTRL_REG_BW_Msk          (0x6UL)                   /*!< BW (Bitfield-Mask: 0x03)                              */\n#define DMA_DMA1_CTRL_REG_DMA_ON_Pos      (0UL)                     /*!< DMA_ON (Bit 0)                                        */\n#define DMA_DMA1_CTRL_REG_DMA_ON_Msk      (0x1UL)                   /*!< DMA_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  DMA1_IDX_REG  ====================================================== */\n#define DMA_DMA1_IDX_REG_DMA1_IDX_Pos     (0UL)                     /*!< DMA1_IDX (Bit 0)                                      */\n#define DMA_DMA1_IDX_REG_DMA1_IDX_Msk     (0xffffUL)                /*!< DMA1_IDX (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA1_INT_REG  ====================================================== */\n#define DMA_DMA1_INT_REG_DMA1_INT_Pos     (0UL)                     /*!< DMA1_INT (Bit 0)                                      */\n#define DMA_DMA1_INT_REG_DMA1_INT_Msk     (0xffffUL)                /*!< DMA1_INT (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA1_LEN_REG  ====================================================== */\n#define DMA_DMA1_LEN_REG_DMA1_LEN_Pos     (0UL)                     /*!< DMA1_LEN (Bit 0)                                      */\n#define DMA_DMA1_LEN_REG_DMA1_LEN_Msk     (0xffffUL)                /*!< DMA1_LEN (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  DMA2_A_START_REG  ==================================================== */\n#define DMA_DMA2_A_START_REG_DMA2_A_START_Pos (0UL)                 /*!< DMA2_A_START (Bit 0)                                  */\n#define DMA_DMA2_A_START_REG_DMA2_A_START_Msk (0xffffffffUL)        /*!< DMA2_A_START (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  DMA2_B_START_REG  ==================================================== */\n#define DMA_DMA2_B_START_REG_DMA2_B_START_Pos (0UL)                 /*!< DMA2_B_START (Bit 0)                                  */\n#define DMA_DMA2_B_START_REG_DMA2_B_START_Msk (0xffffffffUL)        /*!< DMA2_B_START (Bitfield-Mask: 0xffffffff)              */\n/* =====================================================  DMA2_CTRL_REG  ===================================================== */\n#define DMA_DMA2_CTRL_REG_BUS_ERROR_DETECT_Pos (15UL)               /*!< BUS_ERROR_DETECT (Bit 15)                             */\n#define DMA_DMA2_CTRL_REG_BUS_ERROR_DETECT_Msk (0x8000UL)           /*!< BUS_ERROR_DETECT (Bitfield-Mask: 0x01)                */\n#define DMA_DMA2_CTRL_REG_BURST_MODE_Pos  (13UL)                    /*!< BURST_MODE (Bit 13)                                   */\n#define DMA_DMA2_CTRL_REG_BURST_MODE_Msk  (0x6000UL)                /*!< BURST_MODE (Bitfield-Mask: 0x03)                      */\n#define DMA_DMA2_CTRL_REG_REQ_SENSE_Pos   (12UL)                    /*!< REQ_SENSE (Bit 12)                                    */\n#define DMA_DMA2_CTRL_REG_REQ_SENSE_Msk   (0x1000UL)                /*!< REQ_SENSE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA2_CTRL_REG_DMA_INIT_Pos    (11UL)                    /*!< DMA_INIT (Bit 11)                                     */\n#define DMA_DMA2_CTRL_REG_DMA_INIT_Msk    (0x800UL)                 /*!< DMA_INIT (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA2_CTRL_REG_DMA_IDLE_Pos    (10UL)                    /*!< DMA_IDLE (Bit 10)                                     */\n#define DMA_DMA2_CTRL_REG_DMA_IDLE_Msk    (0x400UL)                 /*!< DMA_IDLE (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA2_CTRL_REG_DMA_PRIO_Pos    (7UL)                     /*!< DMA_PRIO (Bit 7)                                      */\n#define DMA_DMA2_CTRL_REG_DMA_PRIO_Msk    (0x380UL)                 /*!< DMA_PRIO (Bitfield-Mask: 0x07)                        */\n#define DMA_DMA2_CTRL_REG_CIRCULAR_Pos    (6UL)                     /*!< CIRCULAR (Bit 6)                                      */\n#define DMA_DMA2_CTRL_REG_CIRCULAR_Msk    (0x40UL)                  /*!< CIRCULAR (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA2_CTRL_REG_AINC_Pos        (5UL)                     /*!< AINC (Bit 5)                                          */\n#define DMA_DMA2_CTRL_REG_AINC_Msk        (0x20UL)                  /*!< AINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA2_CTRL_REG_BINC_Pos        (4UL)                     /*!< BINC (Bit 4)                                          */\n#define DMA_DMA2_CTRL_REG_BINC_Msk        (0x10UL)                  /*!< BINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA2_CTRL_REG_DREQ_MODE_Pos   (3UL)                     /*!< DREQ_MODE (Bit 3)                                     */\n#define DMA_DMA2_CTRL_REG_DREQ_MODE_Msk   (0x8UL)                   /*!< DREQ_MODE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA2_CTRL_REG_BW_Pos          (1UL)                     /*!< BW (Bit 1)                                            */\n#define DMA_DMA2_CTRL_REG_BW_Msk          (0x6UL)                   /*!< BW (Bitfield-Mask: 0x03)                              */\n#define DMA_DMA2_CTRL_REG_DMA_ON_Pos      (0UL)                     /*!< DMA_ON (Bit 0)                                        */\n#define DMA_DMA2_CTRL_REG_DMA_ON_Msk      (0x1UL)                   /*!< DMA_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  DMA2_IDX_REG  ====================================================== */\n#define DMA_DMA2_IDX_REG_DMA2_IDX_Pos     (0UL)                     /*!< DMA2_IDX (Bit 0)                                      */\n#define DMA_DMA2_IDX_REG_DMA2_IDX_Msk     (0xffffUL)                /*!< DMA2_IDX (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA2_INT_REG  ====================================================== */\n#define DMA_DMA2_INT_REG_DMA2_INT_Pos     (0UL)                     /*!< DMA2_INT (Bit 0)                                      */\n#define DMA_DMA2_INT_REG_DMA2_INT_Msk     (0xffffUL)                /*!< DMA2_INT (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA2_LEN_REG  ====================================================== */\n#define DMA_DMA2_LEN_REG_DMA2_LEN_Pos     (0UL)                     /*!< DMA2_LEN (Bit 0)                                      */\n#define DMA_DMA2_LEN_REG_DMA2_LEN_Msk     (0xffffUL)                /*!< DMA2_LEN (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  DMA3_A_START_REG  ==================================================== */\n#define DMA_DMA3_A_START_REG_DMA3_A_START_Pos (0UL)                 /*!< DMA3_A_START (Bit 0)                                  */\n#define DMA_DMA3_A_START_REG_DMA3_A_START_Msk (0xffffffffUL)        /*!< DMA3_A_START (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  DMA3_B_START_REG  ==================================================== */\n#define DMA_DMA3_B_START_REG_DMA3_B_START_Pos (0UL)                 /*!< DMA3_B_START (Bit 0)                                  */\n#define DMA_DMA3_B_START_REG_DMA3_B_START_Msk (0xffffffffUL)        /*!< DMA3_B_START (Bitfield-Mask: 0xffffffff)              */\n/* =====================================================  DMA3_CTRL_REG  ===================================================== */\n#define DMA_DMA3_CTRL_REG_BUS_ERROR_DETECT_Pos (15UL)               /*!< BUS_ERROR_DETECT (Bit 15)                             */\n#define DMA_DMA3_CTRL_REG_BUS_ERROR_DETECT_Msk (0x8000UL)           /*!< BUS_ERROR_DETECT (Bitfield-Mask: 0x01)                */\n#define DMA_DMA3_CTRL_REG_BURST_MODE_Pos  (13UL)                    /*!< BURST_MODE (Bit 13)                                   */\n#define DMA_DMA3_CTRL_REG_BURST_MODE_Msk  (0x6000UL)                /*!< BURST_MODE (Bitfield-Mask: 0x03)                      */\n#define DMA_DMA3_CTRL_REG_REQ_SENSE_Pos   (12UL)                    /*!< REQ_SENSE (Bit 12)                                    */\n#define DMA_DMA3_CTRL_REG_REQ_SENSE_Msk   (0x1000UL)                /*!< REQ_SENSE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA3_CTRL_REG_DMA_INIT_Pos    (11UL)                    /*!< DMA_INIT (Bit 11)                                     */\n#define DMA_DMA3_CTRL_REG_DMA_INIT_Msk    (0x800UL)                 /*!< DMA_INIT (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA3_CTRL_REG_DMA_IDLE_Pos    (10UL)                    /*!< DMA_IDLE (Bit 10)                                     */\n#define DMA_DMA3_CTRL_REG_DMA_IDLE_Msk    (0x400UL)                 /*!< DMA_IDLE (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA3_CTRL_REG_DMA_PRIO_Pos    (7UL)                     /*!< DMA_PRIO (Bit 7)                                      */\n#define DMA_DMA3_CTRL_REG_DMA_PRIO_Msk    (0x380UL)                 /*!< DMA_PRIO (Bitfield-Mask: 0x07)                        */\n#define DMA_DMA3_CTRL_REG_CIRCULAR_Pos    (6UL)                     /*!< CIRCULAR (Bit 6)                                      */\n#define DMA_DMA3_CTRL_REG_CIRCULAR_Msk    (0x40UL)                  /*!< CIRCULAR (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA3_CTRL_REG_AINC_Pos        (5UL)                     /*!< AINC (Bit 5)                                          */\n#define DMA_DMA3_CTRL_REG_AINC_Msk        (0x20UL)                  /*!< AINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA3_CTRL_REG_BINC_Pos        (4UL)                     /*!< BINC (Bit 4)                                          */\n#define DMA_DMA3_CTRL_REG_BINC_Msk        (0x10UL)                  /*!< BINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA3_CTRL_REG_DREQ_MODE_Pos   (3UL)                     /*!< DREQ_MODE (Bit 3)                                     */\n#define DMA_DMA3_CTRL_REG_DREQ_MODE_Msk   (0x8UL)                   /*!< DREQ_MODE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA3_CTRL_REG_BW_Pos          (1UL)                     /*!< BW (Bit 1)                                            */\n#define DMA_DMA3_CTRL_REG_BW_Msk          (0x6UL)                   /*!< BW (Bitfield-Mask: 0x03)                              */\n#define DMA_DMA3_CTRL_REG_DMA_ON_Pos      (0UL)                     /*!< DMA_ON (Bit 0)                                        */\n#define DMA_DMA3_CTRL_REG_DMA_ON_Msk      (0x1UL)                   /*!< DMA_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  DMA3_IDX_REG  ====================================================== */\n#define DMA_DMA3_IDX_REG_DMA3_IDX_Pos     (0UL)                     /*!< DMA3_IDX (Bit 0)                                      */\n#define DMA_DMA3_IDX_REG_DMA3_IDX_Msk     (0xffffUL)                /*!< DMA3_IDX (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA3_INT_REG  ====================================================== */\n#define DMA_DMA3_INT_REG_DMA3_INT_Pos     (0UL)                     /*!< DMA3_INT (Bit 0)                                      */\n#define DMA_DMA3_INT_REG_DMA3_INT_Msk     (0xffffUL)                /*!< DMA3_INT (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA3_LEN_REG  ====================================================== */\n#define DMA_DMA3_LEN_REG_DMA3_LEN_Pos     (0UL)                     /*!< DMA3_LEN (Bit 0)                                      */\n#define DMA_DMA3_LEN_REG_DMA3_LEN_Msk     (0xffffUL)                /*!< DMA3_LEN (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  DMA4_A_START_REG  ==================================================== */\n#define DMA_DMA4_A_START_REG_DMA4_A_START_Pos (0UL)                 /*!< DMA4_A_START (Bit 0)                                  */\n#define DMA_DMA4_A_START_REG_DMA4_A_START_Msk (0xffffffffUL)        /*!< DMA4_A_START (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  DMA4_B_START_REG  ==================================================== */\n#define DMA_DMA4_B_START_REG_DMA4_B_START_Pos (0UL)                 /*!< DMA4_B_START (Bit 0)                                  */\n#define DMA_DMA4_B_START_REG_DMA4_B_START_Msk (0xffffffffUL)        /*!< DMA4_B_START (Bitfield-Mask: 0xffffffff)              */\n/* =====================================================  DMA4_CTRL_REG  ===================================================== */\n#define DMA_DMA4_CTRL_REG_BUS_ERROR_DETECT_Pos (15UL)               /*!< BUS_ERROR_DETECT (Bit 15)                             */\n#define DMA_DMA4_CTRL_REG_BUS_ERROR_DETECT_Msk (0x8000UL)           /*!< BUS_ERROR_DETECT (Bitfield-Mask: 0x01)                */\n#define DMA_DMA4_CTRL_REG_BURST_MODE_Pos  (13UL)                    /*!< BURST_MODE (Bit 13)                                   */\n#define DMA_DMA4_CTRL_REG_BURST_MODE_Msk  (0x6000UL)                /*!< BURST_MODE (Bitfield-Mask: 0x03)                      */\n#define DMA_DMA4_CTRL_REG_REQ_SENSE_Pos   (12UL)                    /*!< REQ_SENSE (Bit 12)                                    */\n#define DMA_DMA4_CTRL_REG_REQ_SENSE_Msk   (0x1000UL)                /*!< REQ_SENSE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA4_CTRL_REG_DMA_INIT_Pos    (11UL)                    /*!< DMA_INIT (Bit 11)                                     */\n#define DMA_DMA4_CTRL_REG_DMA_INIT_Msk    (0x800UL)                 /*!< DMA_INIT (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA4_CTRL_REG_DMA_IDLE_Pos    (10UL)                    /*!< DMA_IDLE (Bit 10)                                     */\n#define DMA_DMA4_CTRL_REG_DMA_IDLE_Msk    (0x400UL)                 /*!< DMA_IDLE (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA4_CTRL_REG_DMA_PRIO_Pos    (7UL)                     /*!< DMA_PRIO (Bit 7)                                      */\n#define DMA_DMA4_CTRL_REG_DMA_PRIO_Msk    (0x380UL)                 /*!< DMA_PRIO (Bitfield-Mask: 0x07)                        */\n#define DMA_DMA4_CTRL_REG_CIRCULAR_Pos    (6UL)                     /*!< CIRCULAR (Bit 6)                                      */\n#define DMA_DMA4_CTRL_REG_CIRCULAR_Msk    (0x40UL)                  /*!< CIRCULAR (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA4_CTRL_REG_AINC_Pos        (5UL)                     /*!< AINC (Bit 5)                                          */\n#define DMA_DMA4_CTRL_REG_AINC_Msk        (0x20UL)                  /*!< AINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA4_CTRL_REG_BINC_Pos        (4UL)                     /*!< BINC (Bit 4)                                          */\n#define DMA_DMA4_CTRL_REG_BINC_Msk        (0x10UL)                  /*!< BINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA4_CTRL_REG_DREQ_MODE_Pos   (3UL)                     /*!< DREQ_MODE (Bit 3)                                     */\n#define DMA_DMA4_CTRL_REG_DREQ_MODE_Msk   (0x8UL)                   /*!< DREQ_MODE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA4_CTRL_REG_BW_Pos          (1UL)                     /*!< BW (Bit 1)                                            */\n#define DMA_DMA4_CTRL_REG_BW_Msk          (0x6UL)                   /*!< BW (Bitfield-Mask: 0x03)                              */\n#define DMA_DMA4_CTRL_REG_DMA_ON_Pos      (0UL)                     /*!< DMA_ON (Bit 0)                                        */\n#define DMA_DMA4_CTRL_REG_DMA_ON_Msk      (0x1UL)                   /*!< DMA_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  DMA4_IDX_REG  ====================================================== */\n#define DMA_DMA4_IDX_REG_DMA4_IDX_Pos     (0UL)                     /*!< DMA4_IDX (Bit 0)                                      */\n#define DMA_DMA4_IDX_REG_DMA4_IDX_Msk     (0xffffUL)                /*!< DMA4_IDX (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA4_INT_REG  ====================================================== */\n#define DMA_DMA4_INT_REG_DMA4_INT_Pos     (0UL)                     /*!< DMA4_INT (Bit 0)                                      */\n#define DMA_DMA4_INT_REG_DMA4_INT_Msk     (0xffffUL)                /*!< DMA4_INT (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA4_LEN_REG  ====================================================== */\n#define DMA_DMA4_LEN_REG_DMA4_LEN_Pos     (0UL)                     /*!< DMA4_LEN (Bit 0)                                      */\n#define DMA_DMA4_LEN_REG_DMA4_LEN_Msk     (0xffffUL)                /*!< DMA4_LEN (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  DMA5_A_START_REG  ==================================================== */\n#define DMA_DMA5_A_START_REG_DMA5_A_START_Pos (0UL)                 /*!< DMA5_A_START (Bit 0)                                  */\n#define DMA_DMA5_A_START_REG_DMA5_A_START_Msk (0xffffffffUL)        /*!< DMA5_A_START (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  DMA5_B_START_REG  ==================================================== */\n#define DMA_DMA5_B_START_REG_DMA5_B_START_Pos (0UL)                 /*!< DMA5_B_START (Bit 0)                                  */\n#define DMA_DMA5_B_START_REG_DMA5_B_START_Msk (0xffffffffUL)        /*!< DMA5_B_START (Bitfield-Mask: 0xffffffff)              */\n/* =====================================================  DMA5_CTRL_REG  ===================================================== */\n#define DMA_DMA5_CTRL_REG_BUS_ERROR_DETECT_Pos (15UL)               /*!< BUS_ERROR_DETECT (Bit 15)                             */\n#define DMA_DMA5_CTRL_REG_BUS_ERROR_DETECT_Msk (0x8000UL)           /*!< BUS_ERROR_DETECT (Bitfield-Mask: 0x01)                */\n#define DMA_DMA5_CTRL_REG_BURST_MODE_Pos  (13UL)                    /*!< BURST_MODE (Bit 13)                                   */\n#define DMA_DMA5_CTRL_REG_BURST_MODE_Msk  (0x6000UL)                /*!< BURST_MODE (Bitfield-Mask: 0x03)                      */\n#define DMA_DMA5_CTRL_REG_REQ_SENSE_Pos   (12UL)                    /*!< REQ_SENSE (Bit 12)                                    */\n#define DMA_DMA5_CTRL_REG_REQ_SENSE_Msk   (0x1000UL)                /*!< REQ_SENSE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA5_CTRL_REG_DMA_INIT_Pos    (11UL)                    /*!< DMA_INIT (Bit 11)                                     */\n#define DMA_DMA5_CTRL_REG_DMA_INIT_Msk    (0x800UL)                 /*!< DMA_INIT (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA5_CTRL_REG_DMA_IDLE_Pos    (10UL)                    /*!< DMA_IDLE (Bit 10)                                     */\n#define DMA_DMA5_CTRL_REG_DMA_IDLE_Msk    (0x400UL)                 /*!< DMA_IDLE (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA5_CTRL_REG_DMA_PRIO_Pos    (7UL)                     /*!< DMA_PRIO (Bit 7)                                      */\n#define DMA_DMA5_CTRL_REG_DMA_PRIO_Msk    (0x380UL)                 /*!< DMA_PRIO (Bitfield-Mask: 0x07)                        */\n#define DMA_DMA5_CTRL_REG_CIRCULAR_Pos    (6UL)                     /*!< CIRCULAR (Bit 6)                                      */\n#define DMA_DMA5_CTRL_REG_CIRCULAR_Msk    (0x40UL)                  /*!< CIRCULAR (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA5_CTRL_REG_AINC_Pos        (5UL)                     /*!< AINC (Bit 5)                                          */\n#define DMA_DMA5_CTRL_REG_AINC_Msk        (0x20UL)                  /*!< AINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA5_CTRL_REG_BINC_Pos        (4UL)                     /*!< BINC (Bit 4)                                          */\n#define DMA_DMA5_CTRL_REG_BINC_Msk        (0x10UL)                  /*!< BINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA5_CTRL_REG_DREQ_MODE_Pos   (3UL)                     /*!< DREQ_MODE (Bit 3)                                     */\n#define DMA_DMA5_CTRL_REG_DREQ_MODE_Msk   (0x8UL)                   /*!< DREQ_MODE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA5_CTRL_REG_BW_Pos          (1UL)                     /*!< BW (Bit 1)                                            */\n#define DMA_DMA5_CTRL_REG_BW_Msk          (0x6UL)                   /*!< BW (Bitfield-Mask: 0x03)                              */\n#define DMA_DMA5_CTRL_REG_DMA_ON_Pos      (0UL)                     /*!< DMA_ON (Bit 0)                                        */\n#define DMA_DMA5_CTRL_REG_DMA_ON_Msk      (0x1UL)                   /*!< DMA_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  DMA5_IDX_REG  ====================================================== */\n#define DMA_DMA5_IDX_REG_DMA5_IDX_Pos     (0UL)                     /*!< DMA5_IDX (Bit 0)                                      */\n#define DMA_DMA5_IDX_REG_DMA5_IDX_Msk     (0xffffUL)                /*!< DMA5_IDX (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA5_INT_REG  ====================================================== */\n#define DMA_DMA5_INT_REG_DMA5_INT_Pos     (0UL)                     /*!< DMA5_INT (Bit 0)                                      */\n#define DMA_DMA5_INT_REG_DMA5_INT_Msk     (0xffffUL)                /*!< DMA5_INT (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA5_LEN_REG  ====================================================== */\n#define DMA_DMA5_LEN_REG_DMA5_LEN_Pos     (0UL)                     /*!< DMA5_LEN (Bit 0)                                      */\n#define DMA_DMA5_LEN_REG_DMA5_LEN_Msk     (0xffffUL)                /*!< DMA5_LEN (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  DMA6_A_START_REG  ==================================================== */\n#define DMA_DMA6_A_START_REG_DMA6_A_START_Pos (0UL)                 /*!< DMA6_A_START (Bit 0)                                  */\n#define DMA_DMA6_A_START_REG_DMA6_A_START_Msk (0xffffffffUL)        /*!< DMA6_A_START (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  DMA6_B_START_REG  ==================================================== */\n#define DMA_DMA6_B_START_REG_DMA6_B_START_Pos (0UL)                 /*!< DMA6_B_START (Bit 0)                                  */\n#define DMA_DMA6_B_START_REG_DMA6_B_START_Msk (0xffffffffUL)        /*!< DMA6_B_START (Bitfield-Mask: 0xffffffff)              */\n/* =====================================================  DMA6_CTRL_REG  ===================================================== */\n#define DMA_DMA6_CTRL_REG_BUS_ERROR_DETECT_Pos (15UL)               /*!< BUS_ERROR_DETECT (Bit 15)                             */\n#define DMA_DMA6_CTRL_REG_BUS_ERROR_DETECT_Msk (0x8000UL)           /*!< BUS_ERROR_DETECT (Bitfield-Mask: 0x01)                */\n#define DMA_DMA6_CTRL_REG_BURST_MODE_Pos  (13UL)                    /*!< BURST_MODE (Bit 13)                                   */\n#define DMA_DMA6_CTRL_REG_BURST_MODE_Msk  (0x6000UL)                /*!< BURST_MODE (Bitfield-Mask: 0x03)                      */\n#define DMA_DMA6_CTRL_REG_REQ_SENSE_Pos   (12UL)                    /*!< REQ_SENSE (Bit 12)                                    */\n#define DMA_DMA6_CTRL_REG_REQ_SENSE_Msk   (0x1000UL)                /*!< REQ_SENSE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA6_CTRL_REG_DMA_INIT_Pos    (11UL)                    /*!< DMA_INIT (Bit 11)                                     */\n#define DMA_DMA6_CTRL_REG_DMA_INIT_Msk    (0x800UL)                 /*!< DMA_INIT (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA6_CTRL_REG_DMA_IDLE_Pos    (10UL)                    /*!< DMA_IDLE (Bit 10)                                     */\n#define DMA_DMA6_CTRL_REG_DMA_IDLE_Msk    (0x400UL)                 /*!< DMA_IDLE (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA6_CTRL_REG_DMA_PRIO_Pos    (7UL)                     /*!< DMA_PRIO (Bit 7)                                      */\n#define DMA_DMA6_CTRL_REG_DMA_PRIO_Msk    (0x380UL)                 /*!< DMA_PRIO (Bitfield-Mask: 0x07)                        */\n#define DMA_DMA6_CTRL_REG_CIRCULAR_Pos    (6UL)                     /*!< CIRCULAR (Bit 6)                                      */\n#define DMA_DMA6_CTRL_REG_CIRCULAR_Msk    (0x40UL)                  /*!< CIRCULAR (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA6_CTRL_REG_AINC_Pos        (5UL)                     /*!< AINC (Bit 5)                                          */\n#define DMA_DMA6_CTRL_REG_AINC_Msk        (0x20UL)                  /*!< AINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA6_CTRL_REG_BINC_Pos        (4UL)                     /*!< BINC (Bit 4)                                          */\n#define DMA_DMA6_CTRL_REG_BINC_Msk        (0x10UL)                  /*!< BINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA6_CTRL_REG_DREQ_MODE_Pos   (3UL)                     /*!< DREQ_MODE (Bit 3)                                     */\n#define DMA_DMA6_CTRL_REG_DREQ_MODE_Msk   (0x8UL)                   /*!< DREQ_MODE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA6_CTRL_REG_BW_Pos          (1UL)                     /*!< BW (Bit 1)                                            */\n#define DMA_DMA6_CTRL_REG_BW_Msk          (0x6UL)                   /*!< BW (Bitfield-Mask: 0x03)                              */\n#define DMA_DMA6_CTRL_REG_DMA_ON_Pos      (0UL)                     /*!< DMA_ON (Bit 0)                                        */\n#define DMA_DMA6_CTRL_REG_DMA_ON_Msk      (0x1UL)                   /*!< DMA_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  DMA6_IDX_REG  ====================================================== */\n#define DMA_DMA6_IDX_REG_DMA6_IDX_Pos     (0UL)                     /*!< DMA6_IDX (Bit 0)                                      */\n#define DMA_DMA6_IDX_REG_DMA6_IDX_Msk     (0xffffUL)                /*!< DMA6_IDX (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA6_INT_REG  ====================================================== */\n#define DMA_DMA6_INT_REG_DMA6_INT_Pos     (0UL)                     /*!< DMA6_INT (Bit 0)                                      */\n#define DMA_DMA6_INT_REG_DMA6_INT_Msk     (0xffffUL)                /*!< DMA6_INT (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA6_LEN_REG  ====================================================== */\n#define DMA_DMA6_LEN_REG_DMA6_LEN_Pos     (0UL)                     /*!< DMA6_LEN (Bit 0)                                      */\n#define DMA_DMA6_LEN_REG_DMA6_LEN_Msk     (0xffffUL)                /*!< DMA6_LEN (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  DMA7_A_START_REG  ==================================================== */\n#define DMA_DMA7_A_START_REG_DMA7_A_START_Pos (0UL)                 /*!< DMA7_A_START (Bit 0)                                  */\n#define DMA_DMA7_A_START_REG_DMA7_A_START_Msk (0xffffffffUL)        /*!< DMA7_A_START (Bitfield-Mask: 0xffffffff)              */\n/* ===================================================  DMA7_B_START_REG  ==================================================== */\n#define DMA_DMA7_B_START_REG_DMA7_B_START_Pos (0UL)                 /*!< DMA7_B_START (Bit 0)                                  */\n#define DMA_DMA7_B_START_REG_DMA7_B_START_Msk (0xffffffffUL)        /*!< DMA7_B_START (Bitfield-Mask: 0xffffffff)              */\n/* =====================================================  DMA7_CTRL_REG  ===================================================== */\n#define DMA_DMA7_CTRL_REG_BUS_ERROR_DETECT_Pos (15UL)               /*!< BUS_ERROR_DETECT (Bit 15)                             */\n#define DMA_DMA7_CTRL_REG_BUS_ERROR_DETECT_Msk (0x8000UL)           /*!< BUS_ERROR_DETECT (Bitfield-Mask: 0x01)                */\n#define DMA_DMA7_CTRL_REG_BURST_MODE_Pos  (13UL)                    /*!< BURST_MODE (Bit 13)                                   */\n#define DMA_DMA7_CTRL_REG_BURST_MODE_Msk  (0x6000UL)                /*!< BURST_MODE (Bitfield-Mask: 0x03)                      */\n#define DMA_DMA7_CTRL_REG_REQ_SENSE_Pos   (12UL)                    /*!< REQ_SENSE (Bit 12)                                    */\n#define DMA_DMA7_CTRL_REG_REQ_SENSE_Msk   (0x1000UL)                /*!< REQ_SENSE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA7_CTRL_REG_DMA_INIT_Pos    (11UL)                    /*!< DMA_INIT (Bit 11)                                     */\n#define DMA_DMA7_CTRL_REG_DMA_INIT_Msk    (0x800UL)                 /*!< DMA_INIT (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA7_CTRL_REG_DMA_IDLE_Pos    (10UL)                    /*!< DMA_IDLE (Bit 10)                                     */\n#define DMA_DMA7_CTRL_REG_DMA_IDLE_Msk    (0x400UL)                 /*!< DMA_IDLE (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA7_CTRL_REG_DMA_PRIO_Pos    (7UL)                     /*!< DMA_PRIO (Bit 7)                                      */\n#define DMA_DMA7_CTRL_REG_DMA_PRIO_Msk    (0x380UL)                 /*!< DMA_PRIO (Bitfield-Mask: 0x07)                        */\n#define DMA_DMA7_CTRL_REG_CIRCULAR_Pos    (6UL)                     /*!< CIRCULAR (Bit 6)                                      */\n#define DMA_DMA7_CTRL_REG_CIRCULAR_Msk    (0x40UL)                  /*!< CIRCULAR (Bitfield-Mask: 0x01)                        */\n#define DMA_DMA7_CTRL_REG_AINC_Pos        (5UL)                     /*!< AINC (Bit 5)                                          */\n#define DMA_DMA7_CTRL_REG_AINC_Msk        (0x20UL)                  /*!< AINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA7_CTRL_REG_BINC_Pos        (4UL)                     /*!< BINC (Bit 4)                                          */\n#define DMA_DMA7_CTRL_REG_BINC_Msk        (0x10UL)                  /*!< BINC (Bitfield-Mask: 0x01)                            */\n#define DMA_DMA7_CTRL_REG_DREQ_MODE_Pos   (3UL)                     /*!< DREQ_MODE (Bit 3)                                     */\n#define DMA_DMA7_CTRL_REG_DREQ_MODE_Msk   (0x8UL)                   /*!< DREQ_MODE (Bitfield-Mask: 0x01)                       */\n#define DMA_DMA7_CTRL_REG_BW_Pos          (1UL)                     /*!< BW (Bit 1)                                            */\n#define DMA_DMA7_CTRL_REG_BW_Msk          (0x6UL)                   /*!< BW (Bitfield-Mask: 0x03)                              */\n#define DMA_DMA7_CTRL_REG_DMA_ON_Pos      (0UL)                     /*!< DMA_ON (Bit 0)                                        */\n#define DMA_DMA7_CTRL_REG_DMA_ON_Msk      (0x1UL)                   /*!< DMA_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  DMA7_IDX_REG  ====================================================== */\n#define DMA_DMA7_IDX_REG_DMA7_IDX_Pos     (0UL)                     /*!< DMA7_IDX (Bit 0)                                      */\n#define DMA_DMA7_IDX_REG_DMA7_IDX_Msk     (0xffffUL)                /*!< DMA7_IDX (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA7_INT_REG  ====================================================== */\n#define DMA_DMA7_INT_REG_DMA7_INT_Pos     (0UL)                     /*!< DMA7_INT (Bit 0)                                      */\n#define DMA_DMA7_INT_REG_DMA7_INT_Msk     (0xffffUL)                /*!< DMA7_INT (Bitfield-Mask: 0xffff)                      */\n/* =====================================================  DMA7_LEN_REG  ====================================================== */\n#define DMA_DMA7_LEN_REG_DMA7_LEN_Pos     (0UL)                     /*!< DMA7_LEN (Bit 0)                                      */\n#define DMA_DMA7_LEN_REG_DMA7_LEN_Msk     (0xffffUL)                /*!< DMA7_LEN (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  DMA_CLEAR_INT_REG  =================================================== */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH7_Pos (7UL)             /*!< DMA_RST_IRQ_CH7 (Bit 7)                               */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH7_Msk (0x80UL)          /*!< DMA_RST_IRQ_CH7 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH6_Pos (6UL)             /*!< DMA_RST_IRQ_CH6 (Bit 6)                               */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH6_Msk (0x40UL)          /*!< DMA_RST_IRQ_CH6 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH5_Pos (5UL)             /*!< DMA_RST_IRQ_CH5 (Bit 5)                               */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH5_Msk (0x20UL)          /*!< DMA_RST_IRQ_CH5 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH4_Pos (4UL)             /*!< DMA_RST_IRQ_CH4 (Bit 4)                               */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH4_Msk (0x10UL)          /*!< DMA_RST_IRQ_CH4 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH3_Pos (3UL)             /*!< DMA_RST_IRQ_CH3 (Bit 3)                               */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH3_Msk (0x8UL)           /*!< DMA_RST_IRQ_CH3 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH2_Pos (2UL)             /*!< DMA_RST_IRQ_CH2 (Bit 2)                               */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH2_Msk (0x4UL)           /*!< DMA_RST_IRQ_CH2 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH1_Pos (1UL)             /*!< DMA_RST_IRQ_CH1 (Bit 1)                               */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH1_Msk (0x2UL)           /*!< DMA_RST_IRQ_CH1 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH0_Pos (0UL)             /*!< DMA_RST_IRQ_CH0 (Bit 0)                               */\n#define DMA_DMA_CLEAR_INT_REG_DMA_RST_IRQ_CH0_Msk (0x1UL)           /*!< DMA_RST_IRQ_CH0 (Bitfield-Mask: 0x01)                 */\n/* ===================================================  DMA_INT_MASK_REG  ==================================================== */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE7_Pos (7UL)              /*!< DMA_IRQ_ENABLE7 (Bit 7)                               */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE7_Msk (0x80UL)           /*!< DMA_IRQ_ENABLE7 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE6_Pos (6UL)              /*!< DMA_IRQ_ENABLE6 (Bit 6)                               */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE6_Msk (0x40UL)           /*!< DMA_IRQ_ENABLE6 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE5_Pos (5UL)              /*!< DMA_IRQ_ENABLE5 (Bit 5)                               */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE5_Msk (0x20UL)           /*!< DMA_IRQ_ENABLE5 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE4_Pos (4UL)              /*!< DMA_IRQ_ENABLE4 (Bit 4)                               */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE4_Msk (0x10UL)           /*!< DMA_IRQ_ENABLE4 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE3_Pos (3UL)              /*!< DMA_IRQ_ENABLE3 (Bit 3)                               */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE3_Msk (0x8UL)            /*!< DMA_IRQ_ENABLE3 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE2_Pos (2UL)              /*!< DMA_IRQ_ENABLE2 (Bit 2)                               */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE2_Msk (0x4UL)            /*!< DMA_IRQ_ENABLE2 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE1_Pos (1UL)              /*!< DMA_IRQ_ENABLE1 (Bit 1)                               */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE1_Msk (0x2UL)            /*!< DMA_IRQ_ENABLE1 (Bitfield-Mask: 0x01)                 */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE0_Pos (0UL)              /*!< DMA_IRQ_ENABLE0 (Bit 0)                               */\n#define DMA_DMA_INT_MASK_REG_DMA_IRQ_ENABLE0_Msk (0x1UL)            /*!< DMA_IRQ_ENABLE0 (Bitfield-Mask: 0x01)                 */\n/* ==================================================  DMA_INT_STATUS_REG  =================================================== */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR7_Pos (15UL)              /*!< DMA_BUS_ERR7 (Bit 15)                                 */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR7_Msk (0x8000UL)          /*!< DMA_BUS_ERR7 (Bitfield-Mask: 0x01)                    */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR6_Pos (14UL)              /*!< DMA_BUS_ERR6 (Bit 14)                                 */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR6_Msk (0x4000UL)          /*!< DMA_BUS_ERR6 (Bitfield-Mask: 0x01)                    */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR5_Pos (13UL)              /*!< DMA_BUS_ERR5 (Bit 13)                                 */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR5_Msk (0x2000UL)          /*!< DMA_BUS_ERR5 (Bitfield-Mask: 0x01)                    */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR4_Pos (12UL)              /*!< DMA_BUS_ERR4 (Bit 12)                                 */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR4_Msk (0x1000UL)          /*!< DMA_BUS_ERR4 (Bitfield-Mask: 0x01)                    */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR3_Pos (11UL)              /*!< DMA_BUS_ERR3 (Bit 11)                                 */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR3_Msk (0x800UL)           /*!< DMA_BUS_ERR3 (Bitfield-Mask: 0x01)                    */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR2_Pos (10UL)              /*!< DMA_BUS_ERR2 (Bit 10)                                 */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR2_Msk (0x400UL)           /*!< DMA_BUS_ERR2 (Bitfield-Mask: 0x01)                    */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR1_Pos (9UL)               /*!< DMA_BUS_ERR1 (Bit 9)                                  */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR1_Msk (0x200UL)           /*!< DMA_BUS_ERR1 (Bitfield-Mask: 0x01)                    */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR0_Pos (8UL)               /*!< DMA_BUS_ERR0 (Bit 8)                                  */\n#define DMA_DMA_INT_STATUS_REG_DMA_BUS_ERR0_Msk (0x100UL)           /*!< DMA_BUS_ERR0 (Bitfield-Mask: 0x01)                    */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH7_Pos (7UL)                /*!< DMA_IRQ_CH7 (Bit 7)                                   */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH7_Msk (0x80UL)             /*!< DMA_IRQ_CH7 (Bitfield-Mask: 0x01)                     */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH6_Pos (6UL)                /*!< DMA_IRQ_CH6 (Bit 6)                                   */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH6_Msk (0x40UL)             /*!< DMA_IRQ_CH6 (Bitfield-Mask: 0x01)                     */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH5_Pos (5UL)                /*!< DMA_IRQ_CH5 (Bit 5)                                   */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH5_Msk (0x20UL)             /*!< DMA_IRQ_CH5 (Bitfield-Mask: 0x01)                     */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH4_Pos (4UL)                /*!< DMA_IRQ_CH4 (Bit 4)                                   */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH4_Msk (0x10UL)             /*!< DMA_IRQ_CH4 (Bitfield-Mask: 0x01)                     */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH3_Pos (3UL)                /*!< DMA_IRQ_CH3 (Bit 3)                                   */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH3_Msk (0x8UL)              /*!< DMA_IRQ_CH3 (Bitfield-Mask: 0x01)                     */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH2_Pos (2UL)                /*!< DMA_IRQ_CH2 (Bit 2)                                   */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH2_Msk (0x4UL)              /*!< DMA_IRQ_CH2 (Bitfield-Mask: 0x01)                     */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH1_Pos (1UL)                /*!< DMA_IRQ_CH1 (Bit 1)                                   */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH1_Msk (0x2UL)              /*!< DMA_IRQ_CH1 (Bitfield-Mask: 0x01)                     */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH0_Pos (0UL)                /*!< DMA_IRQ_CH0 (Bit 0)                                   */\n#define DMA_DMA_INT_STATUS_REG_DMA_IRQ_CH0_Msk (0x1UL)              /*!< DMA_IRQ_CH0 (Bitfield-Mask: 0x01)                     */\n/* ====================================================  DMA_REQ_MUX_REG  ==================================================== */\n#define DMA_DMA_REQ_MUX_REG_DMA67_SEL_Pos (12UL)                    /*!< DMA67_SEL (Bit 12)                                    */\n#define DMA_DMA_REQ_MUX_REG_DMA67_SEL_Msk (0xf000UL)                /*!< DMA67_SEL (Bitfield-Mask: 0x0f)                       */\n#define DMA_DMA_REQ_MUX_REG_DMA45_SEL_Pos (8UL)                     /*!< DMA45_SEL (Bit 8)                                     */\n#define DMA_DMA_REQ_MUX_REG_DMA45_SEL_Msk (0xf00UL)                 /*!< DMA45_SEL (Bitfield-Mask: 0x0f)                       */\n#define DMA_DMA_REQ_MUX_REG_DMA23_SEL_Pos (4UL)                     /*!< DMA23_SEL (Bit 4)                                     */\n#define DMA_DMA_REQ_MUX_REG_DMA23_SEL_Msk (0xf0UL)                  /*!< DMA23_SEL (Bitfield-Mask: 0x0f)                       */\n#define DMA_DMA_REQ_MUX_REG_DMA01_SEL_Pos (0UL)                     /*!< DMA01_SEL (Bit 0)                                     */\n#define DMA_DMA_REQ_MUX_REG_DMA01_SEL_Msk (0xfUL)                   /*!< DMA01_SEL (Bitfield-Mask: 0x0f)                       */\n\n\n/* =========================================================================================================================== */\n/* ================                                            DW                                             ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  AHB_DMA_CCLM1_REG  =================================================== */\n#define DW_AHB_DMA_CCLM1_REG_AHB_DMA_CCLM_Pos (0UL)                 /*!< AHB_DMA_CCLM (Bit 0)                                  */\n#define DW_AHB_DMA_CCLM1_REG_AHB_DMA_CCLM_Msk (0xffffUL)            /*!< AHB_DMA_CCLM (Bitfield-Mask: 0xffff)                  */\n/* ===================================================  AHB_DMA_CCLM2_REG  =================================================== */\n#define DW_AHB_DMA_CCLM2_REG_AHB_DMA_CCLM_Pos (0UL)                 /*!< AHB_DMA_CCLM (Bit 0)                                  */\n#define DW_AHB_DMA_CCLM2_REG_AHB_DMA_CCLM_Msk (0xffffUL)            /*!< AHB_DMA_CCLM (Bitfield-Mask: 0xffff)                  */\n/* ===================================================  AHB_DMA_CCLM3_REG  =================================================== */\n#define DW_AHB_DMA_CCLM3_REG_AHB_DMA_CCLM_Pos (0UL)                 /*!< AHB_DMA_CCLM (Bit 0)                                  */\n#define DW_AHB_DMA_CCLM3_REG_AHB_DMA_CCLM_Msk (0xffffUL)            /*!< AHB_DMA_CCLM (Bitfield-Mask: 0xffff)                  */\n/* ===================================================  AHB_DMA_CCLM4_REG  =================================================== */\n#define DW_AHB_DMA_CCLM4_REG_AHB_DMA_CCLM_Pos (0UL)                 /*!< AHB_DMA_CCLM (Bit 0)                                  */\n#define DW_AHB_DMA_CCLM4_REG_AHB_DMA_CCLM_Msk (0xffffUL)            /*!< AHB_DMA_CCLM (Bitfield-Mask: 0xffff)                  */\n/* ================================================  AHB_DMA_DFLT_MASTER_REG  ================================================ */\n#define DW_AHB_DMA_DFLT_MASTER_REG_AHB_DMA_DFLT_MASTER_Pos (0UL)    /*!< AHB_DMA_DFLT_MASTER (Bit 0)                           */\n#define DW_AHB_DMA_DFLT_MASTER_REG_AHB_DMA_DFLT_MASTER_Msk (0xfUL)  /*!< AHB_DMA_DFLT_MASTER (Bitfield-Mask: 0x0f)             */\n/* ====================================================  AHB_DMA_PL1_REG  ==================================================== */\n#define DW_AHB_DMA_PL1_REG_AHB_DMA_PL1_Pos (0UL)                    /*!< AHB_DMA_PL1 (Bit 0)                                   */\n#define DW_AHB_DMA_PL1_REG_AHB_DMA_PL1_Msk (0xfUL)                  /*!< AHB_DMA_PL1 (Bitfield-Mask: 0x0f)                     */\n/* ====================================================  AHB_DMA_PL2_REG  ==================================================== */\n#define DW_AHB_DMA_PL2_REG_AHB_DMA_PL2_Pos (0UL)                    /*!< AHB_DMA_PL2 (Bit 0)                                   */\n#define DW_AHB_DMA_PL2_REG_AHB_DMA_PL2_Msk (0xfUL)                  /*!< AHB_DMA_PL2 (Bitfield-Mask: 0x0f)                     */\n/* ====================================================  AHB_DMA_PL3_REG  ==================================================== */\n#define DW_AHB_DMA_PL3_REG_AHB_DMA_PL3_Pos (0UL)                    /*!< AHB_DMA_PL3 (Bit 0)                                   */\n#define DW_AHB_DMA_PL3_REG_AHB_DMA_PL3_Msk (0xfUL)                  /*!< AHB_DMA_PL3 (Bitfield-Mask: 0x0f)                     */\n/* ====================================================  AHB_DMA_PL4_REG  ==================================================== */\n#define DW_AHB_DMA_PL4_REG_AHB_DMA_PL4_Pos (0UL)                    /*!< AHB_DMA_PL4 (Bit 0)                                   */\n#define DW_AHB_DMA_PL4_REG_AHB_DMA_PL4_Msk (0xfUL)                  /*!< AHB_DMA_PL4 (Bitfield-Mask: 0x0f)                     */\n/* ====================================================  AHB_DMA_TCL_REG  ==================================================== */\n#define DW_AHB_DMA_TCL_REG_AHB_DMA_TCL_Pos (0UL)                    /*!< AHB_DMA_TCL (Bit 0)                                   */\n#define DW_AHB_DMA_TCL_REG_AHB_DMA_TCL_Msk (0xffffUL)               /*!< AHB_DMA_TCL (Bitfield-Mask: 0xffff)                   */\n/* ==================================================  AHB_DMA_VERSION_REG  ================================================== */\n#define DW_AHB_DMA_VERSION_REG_AHB_DMA_VERSION_Pos (0UL)            /*!< AHB_DMA_VERSION (Bit 0)                               */\n#define DW_AHB_DMA_VERSION_REG_AHB_DMA_VERSION_Msk (0xffffffffUL)   /*!< AHB_DMA_VERSION (Bitfield-Mask: 0xffffffff)           */\n/* ===================================================  AHB_DMA_WTEN_REG  ==================================================== */\n#define DW_AHB_DMA_WTEN_REG_AHB_DMA_WTEN_Pos (0UL)                  /*!< AHB_DMA_WTEN (Bit 0)                                  */\n#define DW_AHB_DMA_WTEN_REG_AHB_DMA_WTEN_Msk (0x1UL)                /*!< AHB_DMA_WTEN (Bitfield-Mask: 0x01)                    */\n\n\n/* =========================================================================================================================== */\n/* ================                                           GPADC                                           ================ */\n/* =========================================================================================================================== */\n\n/* =================================================  GP_ADC_CLEAR_INT_REG  ================================================== */\n#define GPADC_GP_ADC_CLEAR_INT_REG_GP_ADC_CLR_INT_Pos (0UL)         /*!< GP_ADC_CLR_INT (Bit 0)                                */\n#define GPADC_GP_ADC_CLEAR_INT_REG_GP_ADC_CLR_INT_Msk (0xffffUL)    /*!< GP_ADC_CLR_INT (Bitfield-Mask: 0xffff)                */\n/* ===================================================  GP_ADC_CTRL2_REG  ==================================================== */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_STORE_DEL_Pos (12UL)          /*!< GP_ADC_STORE_DEL (Bit 12)                             */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_STORE_DEL_Msk (0xf000UL)      /*!< GP_ADC_STORE_DEL (Bitfield-Mask: 0x0f)                */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_SMPL_TIME_Pos (8UL)           /*!< GP_ADC_SMPL_TIME (Bit 8)                              */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_SMPL_TIME_Msk (0xf00UL)       /*!< GP_ADC_SMPL_TIME (Bitfield-Mask: 0x0f)                */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_CONV_NRS_Pos (5UL)            /*!< GP_ADC_CONV_NRS (Bit 5)                               */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_CONV_NRS_Msk (0xe0UL)         /*!< GP_ADC_CONV_NRS (Bitfield-Mask: 0x07)                 */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_DMA_EN_Pos (3UL)              /*!< GP_ADC_DMA_EN (Bit 3)                                 */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_DMA_EN_Msk (0x8UL)            /*!< GP_ADC_DMA_EN (Bitfield-Mask: 0x01)                   */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_I20U_Pos (2UL)                /*!< GP_ADC_I20U (Bit 2)                                   */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_I20U_Msk (0x4UL)              /*!< GP_ADC_I20U (Bitfield-Mask: 0x01)                     */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_IDYN_Pos (1UL)                /*!< GP_ADC_IDYN (Bit 1)                                   */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_IDYN_Msk (0x2UL)              /*!< GP_ADC_IDYN (Bitfield-Mask: 0x01)                     */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_ATTN3X_Pos (0UL)              /*!< GP_ADC_ATTN3X (Bit 0)                                 */\n#define GPADC_GP_ADC_CTRL2_REG_GP_ADC_ATTN3X_Msk (0x1UL)            /*!< GP_ADC_ATTN3X (Bitfield-Mask: 0x01)                   */\n/* ===================================================  GP_ADC_CTRL3_REG  ==================================================== */\n#define GPADC_GP_ADC_CTRL3_REG_GP_ADC_INTERVAL_Pos (8UL)            /*!< GP_ADC_INTERVAL (Bit 8)                               */\n#define GPADC_GP_ADC_CTRL3_REG_GP_ADC_INTERVAL_Msk (0xff00UL)       /*!< GP_ADC_INTERVAL (Bitfield-Mask: 0xff)                 */\n#define GPADC_GP_ADC_CTRL3_REG_GP_ADC_EN_DEL_Pos (0UL)              /*!< GP_ADC_EN_DEL (Bit 0)                                 */\n#define GPADC_GP_ADC_CTRL3_REG_GP_ADC_EN_DEL_Msk (0xffUL)           /*!< GP_ADC_EN_DEL (Bitfield-Mask: 0xff)                   */\n/* ====================================================  GP_ADC_CTRL_REG  ==================================================== */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_DIFF_TEMP_EN_Pos (18UL)        /*!< GP_ADC_DIFF_TEMP_EN (Bit 18)                          */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_DIFF_TEMP_EN_Msk (0x40000UL)   /*!< GP_ADC_DIFF_TEMP_EN (Bitfield-Mask: 0x01)             */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_DIFF_TEMP_SEL_Pos (16UL)       /*!< GP_ADC_DIFF_TEMP_SEL (Bit 16)                         */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_DIFF_TEMP_SEL_Msk (0x30000UL)  /*!< GP_ADC_DIFF_TEMP_SEL (Bitfield-Mask: 0x03)            */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_LDO_ZERO_Pos (15UL)            /*!< GP_ADC_LDO_ZERO (Bit 15)                              */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_LDO_ZERO_Msk (0x8000UL)        /*!< GP_ADC_LDO_ZERO (Bitfield-Mask: 0x01)                 */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_CHOP_Pos (14UL)                /*!< GP_ADC_CHOP (Bit 14)                                  */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_CHOP_Msk (0x4000UL)            /*!< GP_ADC_CHOP (Bitfield-Mask: 0x01)                     */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_SIGN_Pos (13UL)                /*!< GP_ADC_SIGN (Bit 13)                                  */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_SIGN_Msk (0x2000UL)            /*!< GP_ADC_SIGN (Bitfield-Mask: 0x01)                     */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_SEL_Pos (8UL)                  /*!< GP_ADC_SEL (Bit 8)                                    */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_SEL_Msk (0x1f00UL)             /*!< GP_ADC_SEL (Bitfield-Mask: 0x1f)                      */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_MUTE_Pos (7UL)                 /*!< GP_ADC_MUTE (Bit 7)                                   */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_MUTE_Msk (0x80UL)              /*!< GP_ADC_MUTE (Bitfield-Mask: 0x01)                     */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_SE_Pos (6UL)                   /*!< GP_ADC_SE (Bit 6)                                     */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_SE_Msk (0x40UL)                /*!< GP_ADC_SE (Bitfield-Mask: 0x01)                       */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_MINT_Pos (5UL)                 /*!< GP_ADC_MINT (Bit 5)                                   */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_MINT_Msk (0x20UL)              /*!< GP_ADC_MINT (Bitfield-Mask: 0x01)                     */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_INT_Pos (4UL)                  /*!< GP_ADC_INT (Bit 4)                                    */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_INT_Msk (0x10UL)               /*!< GP_ADC_INT (Bitfield-Mask: 0x01)                      */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_CLK_SEL_Pos (3UL)              /*!< GP_ADC_CLK_SEL (Bit 3)                                */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_CLK_SEL_Msk (0x8UL)            /*!< GP_ADC_CLK_SEL (Bitfield-Mask: 0x01)                  */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_CONT_Pos (2UL)                 /*!< GP_ADC_CONT (Bit 2)                                   */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_CONT_Msk (0x4UL)               /*!< GP_ADC_CONT (Bitfield-Mask: 0x01)                     */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_START_Pos (1UL)                /*!< GP_ADC_START (Bit 1)                                  */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_START_Msk (0x2UL)              /*!< GP_ADC_START (Bitfield-Mask: 0x01)                    */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_EN_Pos (0UL)                   /*!< GP_ADC_EN (Bit 0)                                     */\n#define GPADC_GP_ADC_CTRL_REG_GP_ADC_EN_Msk (0x1UL)                 /*!< GP_ADC_EN (Bitfield-Mask: 0x01)                       */\n/* ====================================================  GP_ADC_OFFN_REG  ==================================================== */\n#define GPADC_GP_ADC_OFFN_REG_GP_ADC_OFFN_Pos (0UL)                 /*!< GP_ADC_OFFN (Bit 0)                                   */\n#define GPADC_GP_ADC_OFFN_REG_GP_ADC_OFFN_Msk (0x3ffUL)             /*!< GP_ADC_OFFN (Bitfield-Mask: 0x3ff)                    */\n/* ====================================================  GP_ADC_OFFP_REG  ==================================================== */\n#define GPADC_GP_ADC_OFFP_REG_GP_ADC_OFFP_Pos (0UL)                 /*!< GP_ADC_OFFP (Bit 0)                                   */\n#define GPADC_GP_ADC_OFFP_REG_GP_ADC_OFFP_Msk (0x3ffUL)             /*!< GP_ADC_OFFP (Bitfield-Mask: 0x3ff)                    */\n/* ===================================================  GP_ADC_RESULT_REG  =================================================== */\n#define GPADC_GP_ADC_RESULT_REG_GP_ADC_VAL_Pos (0UL)                /*!< GP_ADC_VAL (Bit 0)                                    */\n#define GPADC_GP_ADC_RESULT_REG_GP_ADC_VAL_Msk (0xffffUL)           /*!< GP_ADC_VAL (Bitfield-Mask: 0xffff)                    */\n\n\n/* =========================================================================================================================== */\n/* ================                                           GPIO                                            ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  GPIO_CLK_SEL_REG  ==================================================== */\n#define GPIO_GPIO_CLK_SEL_REG_DIVN_OUTPUT_EN_Pos (9UL)              /*!< DIVN_OUTPUT_EN (Bit 9)                                */\n#define GPIO_GPIO_CLK_SEL_REG_DIVN_OUTPUT_EN_Msk (0x200UL)          /*!< DIVN_OUTPUT_EN (Bitfield-Mask: 0x01)                  */\n#define GPIO_GPIO_CLK_SEL_REG_RC32M_OUTPUT_EN_Pos (8UL)             /*!< RC32M_OUTPUT_EN (Bit 8)                               */\n#define GPIO_GPIO_CLK_SEL_REG_RC32M_OUTPUT_EN_Msk (0x100UL)         /*!< RC32M_OUTPUT_EN (Bitfield-Mask: 0x01)                 */\n#define GPIO_GPIO_CLK_SEL_REG_XTAL32M_OUTPUT_EN_Pos (7UL)           /*!< XTAL32M_OUTPUT_EN (Bit 7)                             */\n#define GPIO_GPIO_CLK_SEL_REG_XTAL32M_OUTPUT_EN_Msk (0x80UL)        /*!< XTAL32M_OUTPUT_EN (Bitfield-Mask: 0x01)               */\n#define GPIO_GPIO_CLK_SEL_REG_RCX_OUTPUT_EN_Pos (6UL)               /*!< RCX_OUTPUT_EN (Bit 6)                                 */\n#define GPIO_GPIO_CLK_SEL_REG_RCX_OUTPUT_EN_Msk (0x40UL)            /*!< RCX_OUTPUT_EN (Bitfield-Mask: 0x01)                   */\n#define GPIO_GPIO_CLK_SEL_REG_RC32K_OUTPUT_EN_Pos (5UL)             /*!< RC32K_OUTPUT_EN (Bit 5)                               */\n#define GPIO_GPIO_CLK_SEL_REG_RC32K_OUTPUT_EN_Msk (0x20UL)          /*!< RC32K_OUTPUT_EN (Bitfield-Mask: 0x01)                 */\n#define GPIO_GPIO_CLK_SEL_REG_XTAL32K_OUTPUT_EN_Pos (4UL)           /*!< XTAL32K_OUTPUT_EN (Bit 4)                             */\n#define GPIO_GPIO_CLK_SEL_REG_XTAL32K_OUTPUT_EN_Msk (0x10UL)        /*!< XTAL32K_OUTPUT_EN (Bitfield-Mask: 0x01)               */\n#define GPIO_GPIO_CLK_SEL_REG_FUNC_CLOCK_EN_Pos (3UL)               /*!< FUNC_CLOCK_EN (Bit 3)                                 */\n#define GPIO_GPIO_CLK_SEL_REG_FUNC_CLOCK_EN_Msk (0x8UL)             /*!< FUNC_CLOCK_EN (Bitfield-Mask: 0x01)                   */\n#define GPIO_GPIO_CLK_SEL_REG_FUNC_CLOCK_SEL_Pos (0UL)              /*!< FUNC_CLOCK_SEL (Bit 0)                                */\n#define GPIO_GPIO_CLK_SEL_REG_FUNC_CLOCK_SEL_Msk (0x7UL)            /*!< FUNC_CLOCK_SEL (Bitfield-Mask: 0x07)                  */\n/* ====================================================  P0_00_MODE_REG  ===================================================== */\n#define GPIO_P0_00_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_00_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_00_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_00_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_00_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_00_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_01_MODE_REG  ===================================================== */\n#define GPIO_P0_01_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_01_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_01_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_01_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_01_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_01_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_02_MODE_REG  ===================================================== */\n#define GPIO_P0_02_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_02_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_02_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_02_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_02_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_02_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_03_MODE_REG  ===================================================== */\n#define GPIO_P0_03_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_03_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_03_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_03_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_03_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_03_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_04_MODE_REG  ===================================================== */\n#define GPIO_P0_04_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_04_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_04_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_04_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_04_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_04_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_05_MODE_REG  ===================================================== */\n#define GPIO_P0_05_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_05_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_05_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_05_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_05_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_05_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_06_MODE_REG  ===================================================== */\n#define GPIO_P0_06_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_06_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_06_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_06_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_06_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_06_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_07_MODE_REG  ===================================================== */\n#define GPIO_P0_07_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_07_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_07_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_07_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_07_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_07_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_08_MODE_REG  ===================================================== */\n#define GPIO_P0_08_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_08_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_08_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_08_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_08_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_08_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_09_MODE_REG  ===================================================== */\n#define GPIO_P0_09_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_09_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_09_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_09_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_09_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_09_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_10_MODE_REG  ===================================================== */\n#define GPIO_P0_10_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_10_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_10_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_10_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_10_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_10_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_11_MODE_REG  ===================================================== */\n#define GPIO_P0_11_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_11_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_11_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_11_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_11_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_11_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_12_MODE_REG  ===================================================== */\n#define GPIO_P0_12_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_12_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_12_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_12_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_12_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_12_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_13_MODE_REG  ===================================================== */\n#define GPIO_P0_13_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_13_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_13_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_13_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_13_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_13_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_14_MODE_REG  ===================================================== */\n#define GPIO_P0_14_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_14_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_14_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_14_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_14_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_14_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_15_MODE_REG  ===================================================== */\n#define GPIO_P0_15_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_15_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_15_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_15_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_15_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_15_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_16_MODE_REG  ===================================================== */\n#define GPIO_P0_16_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_16_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_16_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_16_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_16_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_16_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_17_MODE_REG  ===================================================== */\n#define GPIO_P0_17_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_17_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_17_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_17_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_17_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_17_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_18_MODE_REG  ===================================================== */\n#define GPIO_P0_18_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_18_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_18_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_18_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_18_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_18_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_19_MODE_REG  ===================================================== */\n#define GPIO_P0_19_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_19_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_19_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_19_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_19_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_19_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_20_MODE_REG  ===================================================== */\n#define GPIO_P0_20_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_20_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_20_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_20_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_20_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_20_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_21_MODE_REG  ===================================================== */\n#define GPIO_P0_21_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_21_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_21_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_21_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_21_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_21_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_22_MODE_REG  ===================================================== */\n#define GPIO_P0_22_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_22_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_22_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_22_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_22_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_22_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_23_MODE_REG  ===================================================== */\n#define GPIO_P0_23_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_23_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_23_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_23_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_23_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_23_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_24_MODE_REG  ===================================================== */\n#define GPIO_P0_24_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_24_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_24_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_24_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_24_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_24_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_25_MODE_REG  ===================================================== */\n#define GPIO_P0_25_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_25_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_25_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_25_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_25_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_25_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_26_MODE_REG  ===================================================== */\n#define GPIO_P0_26_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_26_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_26_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_26_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_26_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_26_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_27_MODE_REG  ===================================================== */\n#define GPIO_P0_27_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_27_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_27_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_27_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_27_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_27_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_28_MODE_REG  ===================================================== */\n#define GPIO_P0_28_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_28_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_28_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_28_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_28_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_28_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_29_MODE_REG  ===================================================== */\n#define GPIO_P0_29_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_29_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_29_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_29_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_29_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_29_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_30_MODE_REG  ===================================================== */\n#define GPIO_P0_30_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_30_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_30_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_30_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_30_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_30_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P0_31_MODE_REG  ===================================================== */\n#define GPIO_P0_31_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P0_31_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P0_31_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P0_31_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P0_31_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P0_31_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ======================================================  P0_DATA_REG  ====================================================== */\n#define GPIO_P0_DATA_REG_P0_DATA_Pos      (0UL)                     /*!< P0_DATA (Bit 0)                                       */\n#define GPIO_P0_DATA_REG_P0_DATA_Msk      (0xffffffffUL)            /*!< P0_DATA (Bitfield-Mask: 0xffffffff)                   */\n/* ==================================================  P0_PADPWR_CTRL_REG  =================================================== */\n#define GPIO_P0_PADPWR_CTRL_REG_P0_OUT_CTRL_Pos (6UL)               /*!< P0_OUT_CTRL (Bit 6)                                   */\n#define GPIO_P0_PADPWR_CTRL_REG_P0_OUT_CTRL_Msk (0xffffffc0UL)      /*!< P0_OUT_CTRL (Bitfield-Mask: 0x3ffffff)                */\n/* ===================================================  P0_RESET_DATA_REG  =================================================== */\n#define GPIO_P0_RESET_DATA_REG_P0_RESET_Pos (0UL)                   /*!< P0_RESET (Bit 0)                                      */\n#define GPIO_P0_RESET_DATA_REG_P0_RESET_Msk (0xffffffffUL)          /*!< P0_RESET (Bitfield-Mask: 0xffffffff)                  */\n/* ====================================================  P0_SET_DATA_REG  ==================================================== */\n#define GPIO_P0_SET_DATA_REG_P0_SET_Pos   (0UL)                     /*!< P0_SET (Bit 0)                                        */\n#define GPIO_P0_SET_DATA_REG_P0_SET_Msk   (0xffffffffUL)            /*!< P0_SET (Bitfield-Mask: 0xffffffff)                    */\n/* ====================================================  P1_00_MODE_REG  ===================================================== */\n#define GPIO_P1_00_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_00_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_00_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_00_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_00_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_00_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_01_MODE_REG  ===================================================== */\n#define GPIO_P1_01_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_01_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_01_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_01_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_01_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_01_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_02_MODE_REG  ===================================================== */\n#define GPIO_P1_02_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_02_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_02_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_02_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_02_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_02_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_03_MODE_REG  ===================================================== */\n#define GPIO_P1_03_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_03_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_03_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_03_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_03_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_03_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_04_MODE_REG  ===================================================== */\n#define GPIO_P1_04_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_04_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_04_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_04_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_04_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_04_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_05_MODE_REG  ===================================================== */\n#define GPIO_P1_05_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_05_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_05_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_05_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_05_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_05_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_06_MODE_REG  ===================================================== */\n#define GPIO_P1_06_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_06_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_06_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_06_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_06_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_06_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_07_MODE_REG  ===================================================== */\n#define GPIO_P1_07_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_07_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_07_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_07_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_07_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_07_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_08_MODE_REG  ===================================================== */\n#define GPIO_P1_08_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_08_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_08_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_08_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_08_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_08_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_09_MODE_REG  ===================================================== */\n#define GPIO_P1_09_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_09_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_09_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_09_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_09_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_09_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_10_MODE_REG  ===================================================== */\n#define GPIO_P1_10_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_10_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_10_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_10_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_10_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_10_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_11_MODE_REG  ===================================================== */\n#define GPIO_P1_11_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_11_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_11_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_11_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_11_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_11_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_12_MODE_REG  ===================================================== */\n#define GPIO_P1_12_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_12_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_12_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_12_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_12_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_12_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_13_MODE_REG  ===================================================== */\n#define GPIO_P1_13_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_13_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_13_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_13_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_13_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_13_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_14_MODE_REG  ===================================================== */\n#define GPIO_P1_14_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_14_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_14_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_14_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_14_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_14_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_15_MODE_REG  ===================================================== */\n#define GPIO_P1_15_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_15_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_15_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_15_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_15_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_15_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_16_MODE_REG  ===================================================== */\n#define GPIO_P1_16_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_16_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_16_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_16_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_16_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_16_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_17_MODE_REG  ===================================================== */\n#define GPIO_P1_17_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_17_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_17_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_17_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_17_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_17_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_18_MODE_REG  ===================================================== */\n#define GPIO_P1_18_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_18_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_18_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_18_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_18_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_18_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_19_MODE_REG  ===================================================== */\n#define GPIO_P1_19_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_19_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_19_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_19_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_19_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_19_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_20_MODE_REG  ===================================================== */\n#define GPIO_P1_20_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_20_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_20_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_20_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_20_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_20_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_21_MODE_REG  ===================================================== */\n#define GPIO_P1_21_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_21_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_21_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_21_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_21_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_21_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ====================================================  P1_22_MODE_REG  ===================================================== */\n#define GPIO_P1_22_MODE_REG_PPOD_Pos      (10UL)                    /*!< PPOD (Bit 10)                                         */\n#define GPIO_P1_22_MODE_REG_PPOD_Msk      (0x400UL)                 /*!< PPOD (Bitfield-Mask: 0x01)                            */\n#define GPIO_P1_22_MODE_REG_PUPD_Pos      (8UL)                     /*!< PUPD (Bit 8)                                          */\n#define GPIO_P1_22_MODE_REG_PUPD_Msk      (0x300UL)                 /*!< PUPD (Bitfield-Mask: 0x03)                            */\n#define GPIO_P1_22_MODE_REG_PID_Pos       (0UL)                     /*!< PID (Bit 0)                                           */\n#define GPIO_P1_22_MODE_REG_PID_Msk       (0x3fUL)                  /*!< PID (Bitfield-Mask: 0x3f)                             */\n/* ======================================================  P1_DATA_REG  ====================================================== */\n#define GPIO_P1_DATA_REG_P1_DATA_Pos      (0UL)                     /*!< P1_DATA (Bit 0)                                       */\n#define GPIO_P1_DATA_REG_P1_DATA_Msk      (0x7fffffUL)              /*!< P1_DATA (Bitfield-Mask: 0x7fffff)                     */\n/* ==================================================  P1_PADPWR_CTRL_REG  =================================================== */\n#define GPIO_P1_PADPWR_CTRL_REG_P1_OUT_CTRL_Pos (0UL)               /*!< P1_OUT_CTRL (Bit 0)                                   */\n#define GPIO_P1_PADPWR_CTRL_REG_P1_OUT_CTRL_Msk (0x7fffffUL)        /*!< P1_OUT_CTRL (Bitfield-Mask: 0x7fffff)                 */\n/* ===================================================  P1_RESET_DATA_REG  =================================================== */\n#define GPIO_P1_RESET_DATA_REG_P1_RESET_Pos (0UL)                   /*!< P1_RESET (Bit 0)                                      */\n#define GPIO_P1_RESET_DATA_REG_P1_RESET_Msk (0x7fffffUL)            /*!< P1_RESET (Bitfield-Mask: 0x7fffff)                    */\n/* ====================================================  P1_SET_DATA_REG  ==================================================== */\n#define GPIO_P1_SET_DATA_REG_P1_SET_Pos   (0UL)                     /*!< P1_SET (Bit 0)                                        */\n#define GPIO_P1_SET_DATA_REG_P1_SET_Msk   (0x7fffffUL)              /*!< P1_SET (Bitfield-Mask: 0x7fffff)                      */\n/* ===================================================  PAD_WEAK_CTRL_REG  =================================================== */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_09_LOWDRV_Pos (12UL)              /*!< P1_09_LOWDRV (Bit 12)                                 */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_09_LOWDRV_Msk (0x1000UL)          /*!< P1_09_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_06_LOWDRV_Pos (11UL)              /*!< P1_06_LOWDRV (Bit 11)                                 */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_06_LOWDRV_Msk (0x800UL)           /*!< P1_06_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_02_LOWDRV_Pos (10UL)              /*!< P1_02_LOWDRV (Bit 10)                                 */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_02_LOWDRV_Msk (0x400UL)           /*!< P1_02_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_01_LOWDRV_Pos (9UL)               /*!< P1_01_LOWDRV (Bit 9)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_01_LOWDRV_Msk (0x200UL)           /*!< P1_01_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_00_LOWDRV_Pos (8UL)               /*!< P1_00_LOWDRV (Bit 8)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P1_00_LOWDRV_Msk (0x100UL)           /*!< P1_00_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_27_LOWDRV_Pos (7UL)               /*!< P0_27_LOWDRV (Bit 7)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_27_LOWDRV_Msk (0x80UL)            /*!< P0_27_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_26_LOWDRV_Pos (6UL)               /*!< P0_26_LOWDRV (Bit 6)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_26_LOWDRV_Msk (0x40UL)            /*!< P0_26_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_25_LOWDRV_Pos (5UL)               /*!< P0_25_LOWDRV (Bit 5)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_25_LOWDRV_Msk (0x20UL)            /*!< P0_25_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_18_LOWDRV_Pos (4UL)               /*!< P0_18_LOWDRV (Bit 4)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_18_LOWDRV_Msk (0x10UL)            /*!< P0_18_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_17_LOWDRV_Pos (3UL)               /*!< P0_17_LOWDRV (Bit 3)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_17_LOWDRV_Msk (0x8UL)             /*!< P0_17_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_16_LOWDRV_Pos (2UL)               /*!< P0_16_LOWDRV (Bit 2)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_16_LOWDRV_Msk (0x4UL)             /*!< P0_16_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_07_LOWDRV_Pos (1UL)               /*!< P0_07_LOWDRV (Bit 1)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_07_LOWDRV_Msk (0x2UL)             /*!< P0_07_LOWDRV (Bitfield-Mask: 0x01)                    */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_06_LOWDRV_Pos (0UL)               /*!< P0_06_LOWDRV (Bit 0)                                  */\n#define GPIO_PAD_WEAK_CTRL_REG_P0_06_LOWDRV_Msk (0x1UL)             /*!< P0_06_LOWDRV (Bitfield-Mask: 0x01)                    */\n\n\n/* =========================================================================================================================== */\n/* ================                                           GPREG                                           ================ */\n/* =========================================================================================================================== */\n\n/* =======================================================  DEBUG_REG  ======================================================= */\n#define GPREG_DEBUG_REG_CROSS_CPU_HALT_SENSITIVITY_Pos (8UL)        /*!< CROSS_CPU_HALT_SENSITIVITY (Bit 8)                    */\n#define GPREG_DEBUG_REG_CROSS_CPU_HALT_SENSITIVITY_Msk (0x100UL)    /*!< CROSS_CPU_HALT_SENSITIVITY (Bitfield-Mask: 0x01)      */\n#define GPREG_DEBUG_REG_SYS_CPUWAIT_ON_JTAG_Pos (7UL)               /*!< SYS_CPUWAIT_ON_JTAG (Bit 7)                           */\n#define GPREG_DEBUG_REG_SYS_CPUWAIT_ON_JTAG_Msk (0x80UL)            /*!< SYS_CPUWAIT_ON_JTAG (Bitfield-Mask: 0x01)             */\n#define GPREG_DEBUG_REG_SYS_CPUWAIT_Pos   (6UL)                     /*!< SYS_CPUWAIT (Bit 6)                                   */\n#define GPREG_DEBUG_REG_SYS_CPUWAIT_Msk   (0x40UL)                  /*!< SYS_CPUWAIT (Bitfield-Mask: 0x01)                     */\n#define GPREG_DEBUG_REG_CMAC_CPU_IS_HALTED_Pos (5UL)                /*!< CMAC_CPU_IS_HALTED (Bit 5)                            */\n#define GPREG_DEBUG_REG_CMAC_CPU_IS_HALTED_Msk (0x20UL)             /*!< CMAC_CPU_IS_HALTED (Bitfield-Mask: 0x01)              */\n#define GPREG_DEBUG_REG_SYS_CPU_IS_HALTED_Pos (4UL)                 /*!< SYS_CPU_IS_HALTED (Bit 4)                             */\n#define GPREG_DEBUG_REG_SYS_CPU_IS_HALTED_Msk (0x10UL)              /*!< SYS_CPU_IS_HALTED (Bitfield-Mask: 0x01)               */\n#define GPREG_DEBUG_REG_HALT_CMAC_SYS_CPU_EN_Pos (3UL)              /*!< HALT_CMAC_SYS_CPU_EN (Bit 3)                          */\n#define GPREG_DEBUG_REG_HALT_CMAC_SYS_CPU_EN_Msk (0x8UL)            /*!< HALT_CMAC_SYS_CPU_EN (Bitfield-Mask: 0x01)            */\n#define GPREG_DEBUG_REG_HALT_SYS_CMAC_CPU_EN_Pos (2UL)              /*!< HALT_SYS_CMAC_CPU_EN (Bit 2)                          */\n#define GPREG_DEBUG_REG_HALT_SYS_CMAC_CPU_EN_Msk (0x4UL)            /*!< HALT_SYS_CMAC_CPU_EN (Bitfield-Mask: 0x01)            */\n#define GPREG_DEBUG_REG_CMAC_CPU_FREEZE_EN_Pos (1UL)                /*!< CMAC_CPU_FREEZE_EN (Bit 1)                            */\n#define GPREG_DEBUG_REG_CMAC_CPU_FREEZE_EN_Msk (0x2UL)              /*!< CMAC_CPU_FREEZE_EN (Bitfield-Mask: 0x01)              */\n#define GPREG_DEBUG_REG_SYS_CPU_FREEZE_EN_Pos (0UL)                 /*!< SYS_CPU_FREEZE_EN (Bit 0)                             */\n#define GPREG_DEBUG_REG_SYS_CPU_FREEZE_EN_Msk (0x1UL)               /*!< SYS_CPU_FREEZE_EN (Bitfield-Mask: 0x01)               */\n/* ====================================================  GP_CONTROL_REG  ===================================================== */\n#define GPREG_GP_CONTROL_REG_CMAC_H2H_BRIDGE_BYPASS_Pos (1UL)       /*!< CMAC_H2H_BRIDGE_BYPASS (Bit 1)                        */\n#define GPREG_GP_CONTROL_REG_CMAC_H2H_BRIDGE_BYPASS_Msk (0x2UL)     /*!< CMAC_H2H_BRIDGE_BYPASS (Bitfield-Mask: 0x01)          */\n/* =====================================================  GP_STATUS_REG  ===================================================== */\n#define GPREG_GP_STATUS_REG_CAL_PHASE_Pos (0UL)                     /*!< CAL_PHASE (Bit 0)                                     */\n#define GPREG_GP_STATUS_REG_CAL_PHASE_Msk (0x1UL)                   /*!< CAL_PHASE (Bitfield-Mask: 0x01)                       */\n/* ===================================================  RESET_FREEZE_REG  ==================================================== */\n#define GPREG_RESET_FREEZE_REG_FRZ_CMAC_WDOG_Pos (10UL)             /*!< FRZ_CMAC_WDOG (Bit 10)                                */\n#define GPREG_RESET_FREEZE_REG_FRZ_CMAC_WDOG_Msk (0x400UL)          /*!< FRZ_CMAC_WDOG (Bitfield-Mask: 0x01)                   */\n#define GPREG_RESET_FREEZE_REG_FRZ_SWTIM4_Pos (9UL)                 /*!< FRZ_SWTIM4 (Bit 9)                                    */\n#define GPREG_RESET_FREEZE_REG_FRZ_SWTIM4_Msk (0x200UL)             /*!< FRZ_SWTIM4 (Bitfield-Mask: 0x01)                      */\n#define GPREG_RESET_FREEZE_REG_FRZ_SWTIM3_Pos (8UL)                 /*!< FRZ_SWTIM3 (Bit 8)                                    */\n#define GPREG_RESET_FREEZE_REG_FRZ_SWTIM3_Msk (0x100UL)             /*!< FRZ_SWTIM3 (Bitfield-Mask: 0x01)                      */\n#define GPREG_RESET_FREEZE_REG_FRZ_PWMLED_Pos (7UL)                 /*!< FRZ_PWMLED (Bit 7)                                    */\n#define GPREG_RESET_FREEZE_REG_FRZ_PWMLED_Msk (0x80UL)              /*!< FRZ_PWMLED (Bitfield-Mask: 0x01)                      */\n#define GPREG_RESET_FREEZE_REG_FRZ_SWTIM2_Pos (6UL)                 /*!< FRZ_SWTIM2 (Bit 6)                                    */\n#define GPREG_RESET_FREEZE_REG_FRZ_SWTIM2_Msk (0x40UL)              /*!< FRZ_SWTIM2 (Bitfield-Mask: 0x01)                      */\n#define GPREG_RESET_FREEZE_REG_FRZ_DMA_Pos (5UL)                    /*!< FRZ_DMA (Bit 5)                                       */\n#define GPREG_RESET_FREEZE_REG_FRZ_DMA_Msk (0x20UL)                 /*!< FRZ_DMA (Bitfield-Mask: 0x01)                         */\n#define GPREG_RESET_FREEZE_REG_FRZ_USB_Pos (4UL)                    /*!< FRZ_USB (Bit 4)                                       */\n#define GPREG_RESET_FREEZE_REG_FRZ_USB_Msk (0x10UL)                 /*!< FRZ_USB (Bitfield-Mask: 0x01)                         */\n#define GPREG_RESET_FREEZE_REG_FRZ_SYS_WDOG_Pos (3UL)               /*!< FRZ_SYS_WDOG (Bit 3)                                  */\n#define GPREG_RESET_FREEZE_REG_FRZ_SYS_WDOG_Msk (0x8UL)             /*!< FRZ_SYS_WDOG (Bitfield-Mask: 0x01)                    */\n#define GPREG_RESET_FREEZE_REG_FRZ_RESERVED_Pos (2UL)               /*!< FRZ_RESERVED (Bit 2)                                  */\n#define GPREG_RESET_FREEZE_REG_FRZ_RESERVED_Msk (0x4UL)             /*!< FRZ_RESERVED (Bitfield-Mask: 0x01)                    */\n#define GPREG_RESET_FREEZE_REG_FRZ_SWTIM_Pos (1UL)                  /*!< FRZ_SWTIM (Bit 1)                                     */\n#define GPREG_RESET_FREEZE_REG_FRZ_SWTIM_Msk (0x2UL)                /*!< FRZ_SWTIM (Bitfield-Mask: 0x01)                       */\n#define GPREG_RESET_FREEZE_REG_FRZ_WKUPTIM_Pos (0UL)                /*!< FRZ_WKUPTIM (Bit 0)                                   */\n#define GPREG_RESET_FREEZE_REG_FRZ_WKUPTIM_Msk (0x1UL)              /*!< FRZ_WKUPTIM (Bitfield-Mask: 0x01)                     */\n/* ====================================================  SET_FREEZE_REG  ===================================================== */\n#define GPREG_SET_FREEZE_REG_FRZ_CMAC_WDOG_Pos (10UL)               /*!< FRZ_CMAC_WDOG (Bit 10)                                */\n#define GPREG_SET_FREEZE_REG_FRZ_CMAC_WDOG_Msk (0x400UL)            /*!< FRZ_CMAC_WDOG (Bitfield-Mask: 0x01)                   */\n#define GPREG_SET_FREEZE_REG_FRZ_SWTIM4_Pos (9UL)                   /*!< FRZ_SWTIM4 (Bit 9)                                    */\n#define GPREG_SET_FREEZE_REG_FRZ_SWTIM4_Msk (0x200UL)               /*!< FRZ_SWTIM4 (Bitfield-Mask: 0x01)                      */\n#define GPREG_SET_FREEZE_REG_FRZ_SWTIM3_Pos (8UL)                   /*!< FRZ_SWTIM3 (Bit 8)                                    */\n#define GPREG_SET_FREEZE_REG_FRZ_SWTIM3_Msk (0x100UL)               /*!< FRZ_SWTIM3 (Bitfield-Mask: 0x01)                      */\n#define GPREG_SET_FREEZE_REG_FRZ_PWMLED_Pos (7UL)                   /*!< FRZ_PWMLED (Bit 7)                                    */\n#define GPREG_SET_FREEZE_REG_FRZ_PWMLED_Msk (0x80UL)                /*!< FRZ_PWMLED (Bitfield-Mask: 0x01)                      */\n#define GPREG_SET_FREEZE_REG_FRZ_SWTIM2_Pos (6UL)                   /*!< FRZ_SWTIM2 (Bit 6)                                    */\n#define GPREG_SET_FREEZE_REG_FRZ_SWTIM2_Msk (0x40UL)                /*!< FRZ_SWTIM2 (Bitfield-Mask: 0x01)                      */\n#define GPREG_SET_FREEZE_REG_FRZ_DMA_Pos  (5UL)                     /*!< FRZ_DMA (Bit 5)                                       */\n#define GPREG_SET_FREEZE_REG_FRZ_DMA_Msk  (0x20UL)                  /*!< FRZ_DMA (Bitfield-Mask: 0x01)                         */\n#define GPREG_SET_FREEZE_REG_FRZ_USB_Pos  (4UL)                     /*!< FRZ_USB (Bit 4)                                       */\n#define GPREG_SET_FREEZE_REG_FRZ_USB_Msk  (0x10UL)                  /*!< FRZ_USB (Bitfield-Mask: 0x01)                         */\n#define GPREG_SET_FREEZE_REG_FRZ_SYS_WDOG_Pos (3UL)                 /*!< FRZ_SYS_WDOG (Bit 3)                                  */\n#define GPREG_SET_FREEZE_REG_FRZ_SYS_WDOG_Msk (0x8UL)               /*!< FRZ_SYS_WDOG (Bitfield-Mask: 0x01)                    */\n#define GPREG_SET_FREEZE_REG_FRZ_RESERVED_Pos (2UL)                 /*!< FRZ_RESERVED (Bit 2)                                  */\n#define GPREG_SET_FREEZE_REG_FRZ_RESERVED_Msk (0x4UL)               /*!< FRZ_RESERVED (Bitfield-Mask: 0x01)                    */\n#define GPREG_SET_FREEZE_REG_FRZ_SWTIM_Pos (1UL)                    /*!< FRZ_SWTIM (Bit 1)                                     */\n#define GPREG_SET_FREEZE_REG_FRZ_SWTIM_Msk (0x2UL)                  /*!< FRZ_SWTIM (Bitfield-Mask: 0x01)                       */\n#define GPREG_SET_FREEZE_REG_FRZ_WKUPTIM_Pos (0UL)                  /*!< FRZ_WKUPTIM (Bit 0)                                   */\n#define GPREG_SET_FREEZE_REG_FRZ_WKUPTIM_Msk (0x1UL)                /*!< FRZ_WKUPTIM (Bitfield-Mask: 0x01)                     */\n/* ======================================================  USBPAD_REG  ======================================================= */\n#define GPREG_USBPAD_REG_USBPHY_FORCE_SW2_ON_Pos (2UL)              /*!< USBPHY_FORCE_SW2_ON (Bit 2)                           */\n#define GPREG_USBPAD_REG_USBPHY_FORCE_SW2_ON_Msk (0x4UL)            /*!< USBPHY_FORCE_SW2_ON (Bitfield-Mask: 0x01)             */\n#define GPREG_USBPAD_REG_USBPHY_FORCE_SW1_OFF_Pos (1UL)             /*!< USBPHY_FORCE_SW1_OFF (Bit 1)                          */\n#define GPREG_USBPAD_REG_USBPHY_FORCE_SW1_OFF_Msk (0x2UL)           /*!< USBPHY_FORCE_SW1_OFF (Bitfield-Mask: 0x01)            */\n#define GPREG_USBPAD_REG_USBPAD_EN_Pos    (0UL)                     /*!< USBPAD_EN (Bit 0)                                     */\n#define GPREG_USBPAD_REG_USBPAD_EN_Msk    (0x1UL)                   /*!< USBPAD_EN (Bitfield-Mask: 0x01)                       */\n\n\n/* =========================================================================================================================== */\n/* ================                                            I2C                                            ================ */\n/* =========================================================================================================================== */\n\n/* ===============================================  I2C_ACK_GENERAL_CALL_REG  ================================================ */\n#define I2C_I2C_ACK_GENERAL_CALL_REG_ACK_GEN_CALL_Pos (0UL)         /*!< ACK_GEN_CALL (Bit 0)                                  */\n#define I2C_I2C_ACK_GENERAL_CALL_REG_ACK_GEN_CALL_Msk (0x1UL)       /*!< ACK_GEN_CALL (Bitfield-Mask: 0x01)                    */\n/* =================================================  I2C_CLR_ACTIVITY_REG  ================================================== */\n#define I2C_I2C_CLR_ACTIVITY_REG_CLR_ACTIVITY_Pos (0UL)             /*!< CLR_ACTIVITY (Bit 0)                                  */\n#define I2C_I2C_CLR_ACTIVITY_REG_CLR_ACTIVITY_Msk (0x1UL)           /*!< CLR_ACTIVITY (Bitfield-Mask: 0x01)                    */\n/* =================================================  I2C_CLR_GEN_CALL_REG  ================================================== */\n#define I2C_I2C_CLR_GEN_CALL_REG_CLR_GEN_CALL_Pos (0UL)             /*!< CLR_GEN_CALL (Bit 0)                                  */\n#define I2C_I2C_CLR_GEN_CALL_REG_CLR_GEN_CALL_Msk (0x1UL)           /*!< CLR_GEN_CALL (Bitfield-Mask: 0x01)                    */\n/* ===================================================  I2C_CLR_INTR_REG  ==================================================== */\n#define I2C_I2C_CLR_INTR_REG_CLR_INTR_Pos (0UL)                     /*!< CLR_INTR (Bit 0)                                      */\n#define I2C_I2C_CLR_INTR_REG_CLR_INTR_Msk (0x1UL)                   /*!< CLR_INTR (Bitfield-Mask: 0x01)                        */\n/* ==================================================  I2C_CLR_RD_REQ_REG  =================================================== */\n#define I2C_I2C_CLR_RD_REQ_REG_CLR_RD_REQ_Pos (0UL)                 /*!< CLR_RD_REQ (Bit 0)                                    */\n#define I2C_I2C_CLR_RD_REQ_REG_CLR_RD_REQ_Msk (0x1UL)               /*!< CLR_RD_REQ (Bitfield-Mask: 0x01)                      */\n/* ==================================================  I2C_CLR_RX_DONE_REG  ================================================== */\n#define I2C_I2C_CLR_RX_DONE_REG_CLR_RX_DONE_Pos (0UL)               /*!< CLR_RX_DONE (Bit 0)                                   */\n#define I2C_I2C_CLR_RX_DONE_REG_CLR_RX_DONE_Msk (0x1UL)             /*!< CLR_RX_DONE (Bitfield-Mask: 0x01)                     */\n/* ==================================================  I2C_CLR_RX_OVER_REG  ================================================== */\n#define I2C_I2C_CLR_RX_OVER_REG_CLR_RX_OVER_Pos (0UL)               /*!< CLR_RX_OVER (Bit 0)                                   */\n#define I2C_I2C_CLR_RX_OVER_REG_CLR_RX_OVER_Msk (0x1UL)             /*!< CLR_RX_OVER (Bitfield-Mask: 0x01)                     */\n/* =================================================  I2C_CLR_RX_UNDER_REG  ================================================== */\n#define I2C_I2C_CLR_RX_UNDER_REG_CLR_RX_UNDER_Pos (0UL)             /*!< CLR_RX_UNDER (Bit 0)                                  */\n#define I2C_I2C_CLR_RX_UNDER_REG_CLR_RX_UNDER_Msk (0x1UL)           /*!< CLR_RX_UNDER (Bitfield-Mask: 0x01)                    */\n/* =================================================  I2C_CLR_START_DET_REG  ================================================= */\n#define I2C_I2C_CLR_START_DET_REG_CLR_START_DET_Pos (0UL)           /*!< CLR_START_DET (Bit 0)                                 */\n#define I2C_I2C_CLR_START_DET_REG_CLR_START_DET_Msk (0x1UL)         /*!< CLR_START_DET (Bitfield-Mask: 0x01)                   */\n/* =================================================  I2C_CLR_STOP_DET_REG  ================================================== */\n#define I2C_I2C_CLR_STOP_DET_REG_CLR_STOP_DET_Pos (0UL)             /*!< CLR_STOP_DET (Bit 0)                                  */\n#define I2C_I2C_CLR_STOP_DET_REG_CLR_STOP_DET_Msk (0x1UL)           /*!< CLR_STOP_DET (Bitfield-Mask: 0x01)                    */\n/* ==================================================  I2C_CLR_TX_ABRT_REG  ================================================== */\n#define I2C_I2C_CLR_TX_ABRT_REG_CLR_TX_ABRT_Pos (0UL)               /*!< CLR_TX_ABRT (Bit 0)                                   */\n#define I2C_I2C_CLR_TX_ABRT_REG_CLR_TX_ABRT_Msk (0x1UL)             /*!< CLR_TX_ABRT (Bitfield-Mask: 0x01)                     */\n/* ==================================================  I2C_CLR_TX_OVER_REG  ================================================== */\n#define I2C_I2C_CLR_TX_OVER_REG_CLR_TX_OVER_Pos (0UL)               /*!< CLR_TX_OVER (Bit 0)                                   */\n#define I2C_I2C_CLR_TX_OVER_REG_CLR_TX_OVER_Msk (0x1UL)             /*!< CLR_TX_OVER (Bitfield-Mask: 0x01)                     */\n/* ======================================================  I2C_CON_REG  ====================================================== */\n#define I2C_I2C_CON_REG_I2C_STOP_DET_IF_MASTER_ACTIVE_Pos (10UL)    /*!< I2C_STOP_DET_IF_MASTER_ACTIVE (Bit 10)                */\n#define I2C_I2C_CON_REG_I2C_STOP_DET_IF_MASTER_ACTIVE_Msk (0x400UL) /*!< I2C_STOP_DET_IF_MASTER_ACTIVE (Bitfield-Mask: 0x01)   */\n#define I2C_I2C_CON_REG_I2C_RX_FIFO_FULL_HLD_CTRL_Pos (9UL)         /*!< I2C_RX_FIFO_FULL_HLD_CTRL (Bit 9)                     */\n#define I2C_I2C_CON_REG_I2C_RX_FIFO_FULL_HLD_CTRL_Msk (0x200UL)     /*!< I2C_RX_FIFO_FULL_HLD_CTRL (Bitfield-Mask: 0x01)       */\n#define I2C_I2C_CON_REG_I2C_TX_EMPTY_CTRL_Pos (8UL)                 /*!< I2C_TX_EMPTY_CTRL (Bit 8)                             */\n#define I2C_I2C_CON_REG_I2C_TX_EMPTY_CTRL_Msk (0x100UL)             /*!< I2C_TX_EMPTY_CTRL (Bitfield-Mask: 0x01)               */\n#define I2C_I2C_CON_REG_I2C_STOP_DET_IFADDRESSED_Pos (7UL)          /*!< I2C_STOP_DET_IFADDRESSED (Bit 7)                      */\n#define I2C_I2C_CON_REG_I2C_STOP_DET_IFADDRESSED_Msk (0x80UL)       /*!< I2C_STOP_DET_IFADDRESSED (Bitfield-Mask: 0x01)        */\n#define I2C_I2C_CON_REG_I2C_SLAVE_DISABLE_Pos (6UL)                 /*!< I2C_SLAVE_DISABLE (Bit 6)                             */\n#define I2C_I2C_CON_REG_I2C_SLAVE_DISABLE_Msk (0x40UL)              /*!< I2C_SLAVE_DISABLE (Bitfield-Mask: 0x01)               */\n#define I2C_I2C_CON_REG_I2C_RESTART_EN_Pos (5UL)                    /*!< I2C_RESTART_EN (Bit 5)                                */\n#define I2C_I2C_CON_REG_I2C_RESTART_EN_Msk (0x20UL)                 /*!< I2C_RESTART_EN (Bitfield-Mask: 0x01)                  */\n#define I2C_I2C_CON_REG_I2C_10BITADDR_MASTER_Pos (4UL)              /*!< I2C_10BITADDR_MASTER (Bit 4)                          */\n#define I2C_I2C_CON_REG_I2C_10BITADDR_MASTER_Msk (0x10UL)           /*!< I2C_10BITADDR_MASTER (Bitfield-Mask: 0x01)            */\n#define I2C_I2C_CON_REG_I2C_10BITADDR_SLAVE_Pos (3UL)               /*!< I2C_10BITADDR_SLAVE (Bit 3)                           */\n#define I2C_I2C_CON_REG_I2C_10BITADDR_SLAVE_Msk (0x8UL)             /*!< I2C_10BITADDR_SLAVE (Bitfield-Mask: 0x01)             */\n#define I2C_I2C_CON_REG_I2C_SPEED_Pos     (1UL)                     /*!< I2C_SPEED (Bit 1)                                     */\n#define I2C_I2C_CON_REG_I2C_SPEED_Msk     (0x6UL)                   /*!< I2C_SPEED (Bitfield-Mask: 0x03)                       */\n#define I2C_I2C_CON_REG_I2C_MASTER_MODE_Pos (0UL)                   /*!< I2C_MASTER_MODE (Bit 0)                               */\n#define I2C_I2C_CON_REG_I2C_MASTER_MODE_Msk (0x1UL)                 /*!< I2C_MASTER_MODE (Bitfield-Mask: 0x01)                 */\n/* ===================================================  I2C_DATA_CMD_REG  ==================================================== */\n#define I2C_I2C_DATA_CMD_REG_I2C_RESTART_Pos (10UL)                 /*!< I2C_RESTART (Bit 10)                                  */\n#define I2C_I2C_DATA_CMD_REG_I2C_RESTART_Msk (0x400UL)              /*!< I2C_RESTART (Bitfield-Mask: 0x01)                     */\n#define I2C_I2C_DATA_CMD_REG_I2C_STOP_Pos (9UL)                     /*!< I2C_STOP (Bit 9)                                      */\n#define I2C_I2C_DATA_CMD_REG_I2C_STOP_Msk (0x200UL)                 /*!< I2C_STOP (Bitfield-Mask: 0x01)                        */\n#define I2C_I2C_DATA_CMD_REG_I2C_CMD_Pos  (8UL)                     /*!< I2C_CMD (Bit 8)                                       */\n#define I2C_I2C_DATA_CMD_REG_I2C_CMD_Msk  (0x100UL)                 /*!< I2C_CMD (Bitfield-Mask: 0x01)                         */\n#define I2C_I2C_DATA_CMD_REG_I2C_DAT_Pos  (0UL)                     /*!< I2C_DAT (Bit 0)                                       */\n#define I2C_I2C_DATA_CMD_REG_I2C_DAT_Msk  (0xffUL)                  /*!< I2C_DAT (Bitfield-Mask: 0xff)                         */\n/* ====================================================  I2C_DMA_CR_REG  ===================================================== */\n#define I2C_I2C_DMA_CR_REG_TDMAE_Pos      (1UL)                     /*!< TDMAE (Bit 1)                                         */\n#define I2C_I2C_DMA_CR_REG_TDMAE_Msk      (0x2UL)                   /*!< TDMAE (Bitfield-Mask: 0x01)                           */\n#define I2C_I2C_DMA_CR_REG_RDMAE_Pos      (0UL)                     /*!< RDMAE (Bit 0)                                         */\n#define I2C_I2C_DMA_CR_REG_RDMAE_Msk      (0x1UL)                   /*!< RDMAE (Bitfield-Mask: 0x01)                           */\n/* ===================================================  I2C_DMA_RDLR_REG  ==================================================== */\n#define I2C_I2C_DMA_RDLR_REG_DMARDL_Pos   (0UL)                     /*!< DMARDL (Bit 0)                                        */\n#define I2C_I2C_DMA_RDLR_REG_DMARDL_Msk   (0x1fUL)                  /*!< DMARDL (Bitfield-Mask: 0x1f)                          */\n/* ===================================================  I2C_DMA_TDLR_REG  ==================================================== */\n#define I2C_I2C_DMA_TDLR_REG_DMATDL_Pos   (0UL)                     /*!< DMATDL (Bit 0)                                        */\n#define I2C_I2C_DMA_TDLR_REG_DMATDL_Msk   (0x1fUL)                  /*!< DMATDL (Bitfield-Mask: 0x1f)                          */\n/* ====================================================  I2C_ENABLE_REG  ===================================================== */\n#define I2C_I2C_ENABLE_REG_I2C_TX_CMD_BLOCK_Pos (2UL)               /*!< I2C_TX_CMD_BLOCK (Bit 2)                              */\n#define I2C_I2C_ENABLE_REG_I2C_TX_CMD_BLOCK_Msk (0x4UL)             /*!< I2C_TX_CMD_BLOCK (Bitfield-Mask: 0x01)                */\n#define I2C_I2C_ENABLE_REG_I2C_ABORT_Pos  (1UL)                     /*!< I2C_ABORT (Bit 1)                                     */\n#define I2C_I2C_ENABLE_REG_I2C_ABORT_Msk  (0x2UL)                   /*!< I2C_ABORT (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_ENABLE_REG_I2C_EN_Pos     (0UL)                     /*!< I2C_EN (Bit 0)                                        */\n#define I2C_I2C_ENABLE_REG_I2C_EN_Msk     (0x1UL)                   /*!< I2C_EN (Bitfield-Mask: 0x01)                          */\n/* =================================================  I2C_ENABLE_STATUS_REG  ================================================= */\n#define I2C_I2C_ENABLE_STATUS_REG_SLV_RX_DATA_LOST_Pos (2UL)        /*!< SLV_RX_DATA_LOST (Bit 2)                              */\n#define I2C_I2C_ENABLE_STATUS_REG_SLV_RX_DATA_LOST_Msk (0x4UL)      /*!< SLV_RX_DATA_LOST (Bitfield-Mask: 0x01)                */\n#define I2C_I2C_ENABLE_STATUS_REG_SLV_DISABLED_WHILE_BUSY_Pos (1UL) /*!< SLV_DISABLED_WHILE_BUSY (Bit 1)                       */\n#define I2C_I2C_ENABLE_STATUS_REG_SLV_DISABLED_WHILE_BUSY_Msk (0x2UL) /*!< SLV_DISABLED_WHILE_BUSY (Bitfield-Mask: 0x01)       */\n#define I2C_I2C_ENABLE_STATUS_REG_IC_EN_Pos (0UL)                   /*!< IC_EN (Bit 0)                                         */\n#define I2C_I2C_ENABLE_STATUS_REG_IC_EN_Msk (0x1UL)                 /*!< IC_EN (Bitfield-Mask: 0x01)                           */\n/* ==================================================  I2C_FS_SCL_HCNT_REG  ================================================== */\n#define I2C_I2C_FS_SCL_HCNT_REG_IC_FS_SCL_HCNT_Pos (0UL)            /*!< IC_FS_SCL_HCNT (Bit 0)                                */\n#define I2C_I2C_FS_SCL_HCNT_REG_IC_FS_SCL_HCNT_Msk (0xffffUL)       /*!< IC_FS_SCL_HCNT (Bitfield-Mask: 0xffff)                */\n/* ==================================================  I2C_FS_SCL_LCNT_REG  ================================================== */\n#define I2C_I2C_FS_SCL_LCNT_REG_IC_FS_SCL_LCNT_Pos (0UL)            /*!< IC_FS_SCL_LCNT (Bit 0)                                */\n#define I2C_I2C_FS_SCL_LCNT_REG_IC_FS_SCL_LCNT_Msk (0xffffUL)       /*!< IC_FS_SCL_LCNT (Bitfield-Mask: 0xffff)                */\n/* ===================================================  I2C_HS_MADDR_REG  ==================================================== */\n#define I2C_I2C_HS_MADDR_REG_I2C_IC_HS_MAR_Pos (0UL)                /*!< I2C_IC_HS_MAR (Bit 0)                                 */\n#define I2C_I2C_HS_MADDR_REG_I2C_IC_HS_MAR_Msk (0x7UL)              /*!< I2C_IC_HS_MAR (Bitfield-Mask: 0x07)                   */\n/* ==================================================  I2C_HS_SCL_HCNT_REG  ================================================== */\n#define I2C_I2C_HS_SCL_HCNT_REG_IC_HS_SCL_HCNT_Pos (0UL)            /*!< IC_HS_SCL_HCNT (Bit 0)                                */\n#define I2C_I2C_HS_SCL_HCNT_REG_IC_HS_SCL_HCNT_Msk (0xffffUL)       /*!< IC_HS_SCL_HCNT (Bitfield-Mask: 0xffff)                */\n/* ==================================================  I2C_HS_SCL_LCNT_REG  ================================================== */\n#define I2C_I2C_HS_SCL_LCNT_REG_IC_HS_SCL_LCNT_Pos (0UL)            /*!< IC_HS_SCL_LCNT (Bit 0)                                */\n#define I2C_I2C_HS_SCL_LCNT_REG_IC_HS_SCL_LCNT_Msk (0xffffUL)       /*!< IC_HS_SCL_LCNT (Bitfield-Mask: 0xffff)                */\n/* =================================================  I2C_IC_FS_SPKLEN_REG  ================================================== */\n#define I2C_I2C_IC_FS_SPKLEN_REG_I2C_FS_SPKLEN_Pos (0UL)            /*!< I2C_FS_SPKLEN (Bit 0)                                 */\n#define I2C_I2C_IC_FS_SPKLEN_REG_I2C_FS_SPKLEN_Msk (0xffUL)         /*!< I2C_FS_SPKLEN (Bitfield-Mask: 0xff)                   */\n/* =================================================  I2C_IC_HS_SPKLEN_REG  ================================================== */\n#define I2C_I2C_IC_HS_SPKLEN_REG_I2C_HS_SPKLEN_Pos (0UL)            /*!< I2C_HS_SPKLEN (Bit 0)                                 */\n#define I2C_I2C_IC_HS_SPKLEN_REG_I2C_HS_SPKLEN_Msk (0xffUL)         /*!< I2C_HS_SPKLEN (Bitfield-Mask: 0xff)                   */\n/* ===================================================  I2C_INTR_MASK_REG  =================================================== */\n#define I2C_I2C_INTR_MASK_REG_M_SCL_STUCK_AT_LOW_Pos (14UL)         /*!< M_SCL_STUCK_AT_LOW (Bit 14)                           */\n#define I2C_I2C_INTR_MASK_REG_M_SCL_STUCK_AT_LOW_Msk (0x4000UL)     /*!< M_SCL_STUCK_AT_LOW (Bitfield-Mask: 0x01)              */\n#define I2C_I2C_INTR_MASK_REG_M_MASTER_ON_HOLD_Pos (13UL)           /*!< M_MASTER_ON_HOLD (Bit 13)                             */\n#define I2C_I2C_INTR_MASK_REG_M_MASTER_ON_HOLD_Msk (0x2000UL)       /*!< M_MASTER_ON_HOLD (Bitfield-Mask: 0x01)                */\n#define I2C_I2C_INTR_MASK_REG_M_RESTART_DET_Pos (12UL)              /*!< M_RESTART_DET (Bit 12)                                */\n#define I2C_I2C_INTR_MASK_REG_M_RESTART_DET_Msk (0x1000UL)          /*!< M_RESTART_DET (Bitfield-Mask: 0x01)                   */\n#define I2C_I2C_INTR_MASK_REG_M_GEN_CALL_Pos (11UL)                 /*!< M_GEN_CALL (Bit 11)                                   */\n#define I2C_I2C_INTR_MASK_REG_M_GEN_CALL_Msk (0x800UL)              /*!< M_GEN_CALL (Bitfield-Mask: 0x01)                      */\n#define I2C_I2C_INTR_MASK_REG_M_START_DET_Pos (10UL)                /*!< M_START_DET (Bit 10)                                  */\n#define I2C_I2C_INTR_MASK_REG_M_START_DET_Msk (0x400UL)             /*!< M_START_DET (Bitfield-Mask: 0x01)                     */\n#define I2C_I2C_INTR_MASK_REG_M_STOP_DET_Pos (9UL)                  /*!< M_STOP_DET (Bit 9)                                    */\n#define I2C_I2C_INTR_MASK_REG_M_STOP_DET_Msk (0x200UL)              /*!< M_STOP_DET (Bitfield-Mask: 0x01)                      */\n#define I2C_I2C_INTR_MASK_REG_M_ACTIVITY_Pos (8UL)                  /*!< M_ACTIVITY (Bit 8)                                    */\n#define I2C_I2C_INTR_MASK_REG_M_ACTIVITY_Msk (0x100UL)              /*!< M_ACTIVITY (Bitfield-Mask: 0x01)                      */\n#define I2C_I2C_INTR_MASK_REG_M_RX_DONE_Pos (7UL)                   /*!< M_RX_DONE (Bit 7)                                     */\n#define I2C_I2C_INTR_MASK_REG_M_RX_DONE_Msk (0x80UL)                /*!< M_RX_DONE (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_MASK_REG_M_TX_ABRT_Pos (6UL)                   /*!< M_TX_ABRT (Bit 6)                                     */\n#define I2C_I2C_INTR_MASK_REG_M_TX_ABRT_Msk (0x40UL)                /*!< M_TX_ABRT (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_MASK_REG_M_RD_REQ_Pos (5UL)                    /*!< M_RD_REQ (Bit 5)                                      */\n#define I2C_I2C_INTR_MASK_REG_M_RD_REQ_Msk (0x20UL)                 /*!< M_RD_REQ (Bitfield-Mask: 0x01)                        */\n#define I2C_I2C_INTR_MASK_REG_M_TX_EMPTY_Pos (4UL)                  /*!< M_TX_EMPTY (Bit 4)                                    */\n#define I2C_I2C_INTR_MASK_REG_M_TX_EMPTY_Msk (0x10UL)               /*!< M_TX_EMPTY (Bitfield-Mask: 0x01)                      */\n#define I2C_I2C_INTR_MASK_REG_M_TX_OVER_Pos (3UL)                   /*!< M_TX_OVER (Bit 3)                                     */\n#define I2C_I2C_INTR_MASK_REG_M_TX_OVER_Msk (0x8UL)                 /*!< M_TX_OVER (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_MASK_REG_M_RX_FULL_Pos (2UL)                   /*!< M_RX_FULL (Bit 2)                                     */\n#define I2C_I2C_INTR_MASK_REG_M_RX_FULL_Msk (0x4UL)                 /*!< M_RX_FULL (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_MASK_REG_M_RX_OVER_Pos (1UL)                   /*!< M_RX_OVER (Bit 1)                                     */\n#define I2C_I2C_INTR_MASK_REG_M_RX_OVER_Msk (0x2UL)                 /*!< M_RX_OVER (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_MASK_REG_M_RX_UNDER_Pos (0UL)                  /*!< M_RX_UNDER (Bit 0)                                    */\n#define I2C_I2C_INTR_MASK_REG_M_RX_UNDER_Msk (0x1UL)                /*!< M_RX_UNDER (Bitfield-Mask: 0x01)                      */\n/* ===================================================  I2C_INTR_STAT_REG  =================================================== */\n#define I2C_I2C_INTR_STAT_REG_R_SCL_STUCK_AT_LOW_Pos (14UL)         /*!< R_SCL_STUCK_AT_LOW (Bit 14)                           */\n#define I2C_I2C_INTR_STAT_REG_R_SCL_STUCK_AT_LOW_Msk (0x4000UL)     /*!< R_SCL_STUCK_AT_LOW (Bitfield-Mask: 0x01)              */\n#define I2C_I2C_INTR_STAT_REG_R_MASTER_ON_HOLD_Pos (13UL)           /*!< R_MASTER_ON_HOLD (Bit 13)                             */\n#define I2C_I2C_INTR_STAT_REG_R_MASTER_ON_HOLD_Msk (0x2000UL)       /*!< R_MASTER_ON_HOLD (Bitfield-Mask: 0x01)                */\n#define I2C_I2C_INTR_STAT_REG_R_RESTART_DET_Pos (12UL)              /*!< R_RESTART_DET (Bit 12)                                */\n#define I2C_I2C_INTR_STAT_REG_R_RESTART_DET_Msk (0x1000UL)          /*!< R_RESTART_DET (Bitfield-Mask: 0x01)                   */\n#define I2C_I2C_INTR_STAT_REG_R_GEN_CALL_Pos (11UL)                 /*!< R_GEN_CALL (Bit 11)                                   */\n#define I2C_I2C_INTR_STAT_REG_R_GEN_CALL_Msk (0x800UL)              /*!< R_GEN_CALL (Bitfield-Mask: 0x01)                      */\n#define I2C_I2C_INTR_STAT_REG_R_START_DET_Pos (10UL)                /*!< R_START_DET (Bit 10)                                  */\n#define I2C_I2C_INTR_STAT_REG_R_START_DET_Msk (0x400UL)             /*!< R_START_DET (Bitfield-Mask: 0x01)                     */\n#define I2C_I2C_INTR_STAT_REG_R_STOP_DET_Pos (9UL)                  /*!< R_STOP_DET (Bit 9)                                    */\n#define I2C_I2C_INTR_STAT_REG_R_STOP_DET_Msk (0x200UL)              /*!< R_STOP_DET (Bitfield-Mask: 0x01)                      */\n#define I2C_I2C_INTR_STAT_REG_R_ACTIVITY_Pos (8UL)                  /*!< R_ACTIVITY (Bit 8)                                    */\n#define I2C_I2C_INTR_STAT_REG_R_ACTIVITY_Msk (0x100UL)              /*!< R_ACTIVITY (Bitfield-Mask: 0x01)                      */\n#define I2C_I2C_INTR_STAT_REG_R_RX_DONE_Pos (7UL)                   /*!< R_RX_DONE (Bit 7)                                     */\n#define I2C_I2C_INTR_STAT_REG_R_RX_DONE_Msk (0x80UL)                /*!< R_RX_DONE (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_STAT_REG_R_TX_ABRT_Pos (6UL)                   /*!< R_TX_ABRT (Bit 6)                                     */\n#define I2C_I2C_INTR_STAT_REG_R_TX_ABRT_Msk (0x40UL)                /*!< R_TX_ABRT (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_STAT_REG_R_RD_REQ_Pos (5UL)                    /*!< R_RD_REQ (Bit 5)                                      */\n#define I2C_I2C_INTR_STAT_REG_R_RD_REQ_Msk (0x20UL)                 /*!< R_RD_REQ (Bitfield-Mask: 0x01)                        */\n#define I2C_I2C_INTR_STAT_REG_R_TX_EMPTY_Pos (4UL)                  /*!< R_TX_EMPTY (Bit 4)                                    */\n#define I2C_I2C_INTR_STAT_REG_R_TX_EMPTY_Msk (0x10UL)               /*!< R_TX_EMPTY (Bitfield-Mask: 0x01)                      */\n#define I2C_I2C_INTR_STAT_REG_R_TX_OVER_Pos (3UL)                   /*!< R_TX_OVER (Bit 3)                                     */\n#define I2C_I2C_INTR_STAT_REG_R_TX_OVER_Msk (0x8UL)                 /*!< R_TX_OVER (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_STAT_REG_R_RX_FULL_Pos (2UL)                   /*!< R_RX_FULL (Bit 2)                                     */\n#define I2C_I2C_INTR_STAT_REG_R_RX_FULL_Msk (0x4UL)                 /*!< R_RX_FULL (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_STAT_REG_R_RX_OVER_Pos (1UL)                   /*!< R_RX_OVER (Bit 1)                                     */\n#define I2C_I2C_INTR_STAT_REG_R_RX_OVER_Msk (0x2UL)                 /*!< R_RX_OVER (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_INTR_STAT_REG_R_RX_UNDER_Pos (0UL)                  /*!< R_RX_UNDER (Bit 0)                                    */\n#define I2C_I2C_INTR_STAT_REG_R_RX_UNDER_Msk (0x1UL)                /*!< R_RX_UNDER (Bitfield-Mask: 0x01)                      */\n/* =================================================  I2C_RAW_INTR_STAT_REG  ================================================= */\n#define I2C_I2C_RAW_INTR_STAT_REG_SCL_STUCK_AT_LOW_Pos (14UL)       /*!< SCL_STUCK_AT_LOW (Bit 14)                             */\n#define I2C_I2C_RAW_INTR_STAT_REG_SCL_STUCK_AT_LOW_Msk (0x4000UL)   /*!< SCL_STUCK_AT_LOW (Bitfield-Mask: 0x01)                */\n#define I2C_I2C_RAW_INTR_STAT_REG_MASTER_ON_HOLD_Pos (13UL)         /*!< MASTER_ON_HOLD (Bit 13)                               */\n#define I2C_I2C_RAW_INTR_STAT_REG_MASTER_ON_HOLD_Msk (0x2000UL)     /*!< MASTER_ON_HOLD (Bitfield-Mask: 0x01)                  */\n#define I2C_I2C_RAW_INTR_STAT_REG_RESTART_DET_Pos (12UL)            /*!< RESTART_DET (Bit 12)                                  */\n#define I2C_I2C_RAW_INTR_STAT_REG_RESTART_DET_Msk (0x1000UL)        /*!< RESTART_DET (Bitfield-Mask: 0x01)                     */\n#define I2C_I2C_RAW_INTR_STAT_REG_GEN_CALL_Pos (11UL)               /*!< GEN_CALL (Bit 11)                                     */\n#define I2C_I2C_RAW_INTR_STAT_REG_GEN_CALL_Msk (0x800UL)            /*!< GEN_CALL (Bitfield-Mask: 0x01)                        */\n#define I2C_I2C_RAW_INTR_STAT_REG_START_DET_Pos (10UL)              /*!< START_DET (Bit 10)                                    */\n#define I2C_I2C_RAW_INTR_STAT_REG_START_DET_Msk (0x400UL)           /*!< START_DET (Bitfield-Mask: 0x01)                       */\n#define I2C_I2C_RAW_INTR_STAT_REG_STOP_DET_Pos (9UL)                /*!< STOP_DET (Bit 9)                                      */\n#define I2C_I2C_RAW_INTR_STAT_REG_STOP_DET_Msk (0x200UL)            /*!< STOP_DET (Bitfield-Mask: 0x01)                        */\n#define I2C_I2C_RAW_INTR_STAT_REG_ACTIVITY_Pos (8UL)                /*!< ACTIVITY (Bit 8)                                      */\n#define I2C_I2C_RAW_INTR_STAT_REG_ACTIVITY_Msk (0x100UL)            /*!< ACTIVITY (Bitfield-Mask: 0x01)                        */\n#define I2C_I2C_RAW_INTR_STAT_REG_RX_DONE_Pos (7UL)                 /*!< RX_DONE (Bit 7)                                       */\n#define I2C_I2C_RAW_INTR_STAT_REG_RX_DONE_Msk (0x80UL)              /*!< RX_DONE (Bitfield-Mask: 0x01)                         */\n#define I2C_I2C_RAW_INTR_STAT_REG_TX_ABRT_Pos (6UL)                 /*!< TX_ABRT (Bit 6)                                       */\n#define I2C_I2C_RAW_INTR_STAT_REG_TX_ABRT_Msk (0x40UL)              /*!< TX_ABRT (Bitfield-Mask: 0x01)                         */\n#define I2C_I2C_RAW_INTR_STAT_REG_RD_REQ_Pos (5UL)                  /*!< RD_REQ (Bit 5)                                        */\n#define I2C_I2C_RAW_INTR_STAT_REG_RD_REQ_Msk (0x20UL)               /*!< RD_REQ (Bitfield-Mask: 0x01)                          */\n#define I2C_I2C_RAW_INTR_STAT_REG_TX_EMPTY_Pos (4UL)                /*!< TX_EMPTY (Bit 4)                                      */\n#define I2C_I2C_RAW_INTR_STAT_REG_TX_EMPTY_Msk (0x10UL)             /*!< TX_EMPTY (Bitfield-Mask: 0x01)                        */\n#define I2C_I2C_RAW_INTR_STAT_REG_TX_OVER_Pos (3UL)                 /*!< TX_OVER (Bit 3)                                       */\n#define I2C_I2C_RAW_INTR_STAT_REG_TX_OVER_Msk (0x8UL)               /*!< TX_OVER (Bitfield-Mask: 0x01)                         */\n#define I2C_I2C_RAW_INTR_STAT_REG_RX_FULL_Pos (2UL)                 /*!< RX_FULL (Bit 2)                                       */\n#define I2C_I2C_RAW_INTR_STAT_REG_RX_FULL_Msk (0x4UL)               /*!< RX_FULL (Bitfield-Mask: 0x01)                         */\n#define I2C_I2C_RAW_INTR_STAT_REG_RX_OVER_Pos (1UL)                 /*!< RX_OVER (Bit 1)                                       */\n#define I2C_I2C_RAW_INTR_STAT_REG_RX_OVER_Msk (0x2UL)               /*!< RX_OVER (Bitfield-Mask: 0x01)                         */\n#define I2C_I2C_RAW_INTR_STAT_REG_RX_UNDER_Pos (0UL)                /*!< RX_UNDER (Bit 0)                                      */\n#define I2C_I2C_RAW_INTR_STAT_REG_RX_UNDER_Msk (0x1UL)              /*!< RX_UNDER (Bitfield-Mask: 0x01)                        */\n/* =====================================================  I2C_RXFLR_REG  ===================================================== */\n#define I2C_I2C_RXFLR_REG_RXFLR_Pos       (0UL)                     /*!< RXFLR (Bit 0)                                         */\n#define I2C_I2C_RXFLR_REG_RXFLR_Msk       (0x3fUL)                  /*!< RXFLR (Bitfield-Mask: 0x3f)                           */\n/* =====================================================  I2C_RX_TL_REG  ===================================================== */\n#define I2C_I2C_RX_TL_REG_RX_TL_Pos       (0UL)                     /*!< RX_TL (Bit 0)                                         */\n#define I2C_I2C_RX_TL_REG_RX_TL_Msk       (0x1fUL)                  /*!< RX_TL (Bitfield-Mask: 0x1f)                           */\n/* ======================================================  I2C_SAR_REG  ====================================================== */\n#define I2C_I2C_SAR_REG_IC_SAR_Pos        (0UL)                     /*!< IC_SAR (Bit 0)                                        */\n#define I2C_I2C_SAR_REG_IC_SAR_Msk        (0x3ffUL)                 /*!< IC_SAR (Bitfield-Mask: 0x3ff)                         */\n/* ===================================================  I2C_SDA_HOLD_REG  ==================================================== */\n#define I2C_I2C_SDA_HOLD_REG_I2C_SDA_RX_HOLD_Pos (16UL)             /*!< I2C_SDA_RX_HOLD (Bit 16)                              */\n#define I2C_I2C_SDA_HOLD_REG_I2C_SDA_RX_HOLD_Msk (0xff0000UL)       /*!< I2C_SDA_RX_HOLD (Bitfield-Mask: 0xff)                 */\n#define I2C_I2C_SDA_HOLD_REG_I2C_SDA_TX_HOLD_Pos (0UL)              /*!< I2C_SDA_TX_HOLD (Bit 0)                               */\n#define I2C_I2C_SDA_HOLD_REG_I2C_SDA_TX_HOLD_Msk (0xffffUL)         /*!< I2C_SDA_TX_HOLD (Bitfield-Mask: 0xffff)               */\n/* ===================================================  I2C_SDA_SETUP_REG  =================================================== */\n#define I2C_I2C_SDA_SETUP_REG_SDA_SETUP_Pos (0UL)                   /*!< SDA_SETUP (Bit 0)                                     */\n#define I2C_I2C_SDA_SETUP_REG_SDA_SETUP_Msk (0xffUL)                /*!< SDA_SETUP (Bitfield-Mask: 0xff)                       */\n/* ==================================================  I2C_SS_SCL_HCNT_REG  ================================================== */\n#define I2C_I2C_SS_SCL_HCNT_REG_IC_SS_SCL_HCNT_Pos (0UL)            /*!< IC_SS_SCL_HCNT (Bit 0)                                */\n#define I2C_I2C_SS_SCL_HCNT_REG_IC_SS_SCL_HCNT_Msk (0xffffUL)       /*!< IC_SS_SCL_HCNT (Bitfield-Mask: 0xffff)                */\n/* ==================================================  I2C_SS_SCL_LCNT_REG  ================================================== */\n#define I2C_I2C_SS_SCL_LCNT_REG_IC_SS_SCL_LCNT_Pos (0UL)            /*!< IC_SS_SCL_LCNT (Bit 0)                                */\n#define I2C_I2C_SS_SCL_LCNT_REG_IC_SS_SCL_LCNT_Msk (0xffffUL)       /*!< IC_SS_SCL_LCNT (Bitfield-Mask: 0xffff)                */\n/* ====================================================  I2C_STATUS_REG  ===================================================== */\n#define I2C_I2C_STATUS_REG_LV_HOLD_RX_FIFO_FULL_Pos (10UL)          /*!< LV_HOLD_RX_FIFO_FULL (Bit 10)                         */\n#define I2C_I2C_STATUS_REG_LV_HOLD_RX_FIFO_FULL_Msk (0x400UL)       /*!< LV_HOLD_RX_FIFO_FULL (Bitfield-Mask: 0x01)            */\n#define I2C_I2C_STATUS_REG_SLV_HOLD_TX_FIFO_EMPTY_Pos (9UL)         /*!< SLV_HOLD_TX_FIFO_EMPTY (Bit 9)                        */\n#define I2C_I2C_STATUS_REG_SLV_HOLD_TX_FIFO_EMPTY_Msk (0x200UL)     /*!< SLV_HOLD_TX_FIFO_EMPTY (Bitfield-Mask: 0x01)          */\n#define I2C_I2C_STATUS_REG_MST_HOLD_RX_FIFO_FULL_Pos (8UL)          /*!< MST_HOLD_RX_FIFO_FULL (Bit 8)                         */\n#define I2C_I2C_STATUS_REG_MST_HOLD_RX_FIFO_FULL_Msk (0x100UL)      /*!< MST_HOLD_RX_FIFO_FULL (Bitfield-Mask: 0x01)           */\n#define I2C_I2C_STATUS_REG_MST_HOLD_TX_FIFO_EMPTY_Pos (7UL)         /*!< MST_HOLD_TX_FIFO_EMPTY (Bit 7)                        */\n#define I2C_I2C_STATUS_REG_MST_HOLD_TX_FIFO_EMPTY_Msk (0x80UL)      /*!< MST_HOLD_TX_FIFO_EMPTY (Bitfield-Mask: 0x01)          */\n#define I2C_I2C_STATUS_REG_SLV_ACTIVITY_Pos (6UL)                   /*!< SLV_ACTIVITY (Bit 6)                                  */\n#define I2C_I2C_STATUS_REG_SLV_ACTIVITY_Msk (0x40UL)                /*!< SLV_ACTIVITY (Bitfield-Mask: 0x01)                    */\n#define I2C_I2C_STATUS_REG_MST_ACTIVITY_Pos (5UL)                   /*!< MST_ACTIVITY (Bit 5)                                  */\n#define I2C_I2C_STATUS_REG_MST_ACTIVITY_Msk (0x20UL)                /*!< MST_ACTIVITY (Bitfield-Mask: 0x01)                    */\n#define I2C_I2C_STATUS_REG_RFF_Pos        (4UL)                     /*!< RFF (Bit 4)                                           */\n#define I2C_I2C_STATUS_REG_RFF_Msk        (0x10UL)                  /*!< RFF (Bitfield-Mask: 0x01)                             */\n#define I2C_I2C_STATUS_REG_RFNE_Pos       (3UL)                     /*!< RFNE (Bit 3)                                          */\n#define I2C_I2C_STATUS_REG_RFNE_Msk       (0x8UL)                   /*!< RFNE (Bitfield-Mask: 0x01)                            */\n#define I2C_I2C_STATUS_REG_TFE_Pos        (2UL)                     /*!< TFE (Bit 2)                                           */\n#define I2C_I2C_STATUS_REG_TFE_Msk        (0x4UL)                   /*!< TFE (Bitfield-Mask: 0x01)                             */\n#define I2C_I2C_STATUS_REG_TFNF_Pos       (1UL)                     /*!< TFNF (Bit 1)                                          */\n#define I2C_I2C_STATUS_REG_TFNF_Msk       (0x2UL)                   /*!< TFNF (Bitfield-Mask: 0x01)                            */\n#define I2C_I2C_STATUS_REG_I2C_ACTIVITY_Pos (0UL)                   /*!< I2C_ACTIVITY (Bit 0)                                  */\n#define I2C_I2C_STATUS_REG_I2C_ACTIVITY_Msk (0x1UL)                 /*!< I2C_ACTIVITY (Bitfield-Mask: 0x01)                    */\n/* ======================================================  I2C_TAR_REG  ====================================================== */\n#define I2C_I2C_TAR_REG_SPECIAL_Pos       (11UL)                    /*!< SPECIAL (Bit 11)                                      */\n#define I2C_I2C_TAR_REG_SPECIAL_Msk       (0x800UL)                 /*!< SPECIAL (Bitfield-Mask: 0x01)                         */\n#define I2C_I2C_TAR_REG_GC_OR_START_Pos   (10UL)                    /*!< GC_OR_START (Bit 10)                                  */\n#define I2C_I2C_TAR_REG_GC_OR_START_Msk   (0x400UL)                 /*!< GC_OR_START (Bitfield-Mask: 0x01)                     */\n#define I2C_I2C_TAR_REG_IC_TAR_Pos        (0UL)                     /*!< IC_TAR (Bit 0)                                        */\n#define I2C_I2C_TAR_REG_IC_TAR_Msk        (0x3ffUL)                 /*!< IC_TAR (Bitfield-Mask: 0x3ff)                         */\n/* =====================================================  I2C_TXFLR_REG  ===================================================== */\n#define I2C_I2C_TXFLR_REG_TXFLR_Pos       (0UL)                     /*!< TXFLR (Bit 0)                                         */\n#define I2C_I2C_TXFLR_REG_TXFLR_Msk       (0x3fUL)                  /*!< TXFLR (Bitfield-Mask: 0x3f)                           */\n/* ================================================  I2C_TX_ABRT_SOURCE_REG  ================================================= */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_USER_ABRT_Pos (16UL)        /*!< ABRT_USER_ABRT (Bit 16)                               */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_USER_ABRT_Msk (0x10000UL)   /*!< ABRT_USER_ABRT (Bitfield-Mask: 0x01)                  */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SLVRD_INTX_Pos (15UL)       /*!< ABRT_SLVRD_INTX (Bit 15)                              */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SLVRD_INTX_Msk (0x8000UL)   /*!< ABRT_SLVRD_INTX (Bitfield-Mask: 0x01)                 */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SLV_ARBLOST_Pos (14UL)      /*!< ABRT_SLV_ARBLOST (Bit 14)                             */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SLV_ARBLOST_Msk (0x4000UL)  /*!< ABRT_SLV_ARBLOST (Bitfield-Mask: 0x01)                */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SLVFLUSH_TXFIFO_Pos (13UL)  /*!< ABRT_SLVFLUSH_TXFIFO (Bit 13)                         */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SLVFLUSH_TXFIFO_Msk (0x2000UL) /*!< ABRT_SLVFLUSH_TXFIFO (Bitfield-Mask: 0x01)         */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ARB_LOST_Pos (12UL)              /*!< ARB_LOST (Bit 12)                                     */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ARB_LOST_Msk (0x1000UL)          /*!< ARB_LOST (Bitfield-Mask: 0x01)                        */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_MASTER_DIS_Pos (11UL)       /*!< ABRT_MASTER_DIS (Bit 11)                              */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_MASTER_DIS_Msk (0x800UL)    /*!< ABRT_MASTER_DIS (Bitfield-Mask: 0x01)                 */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_10B_RD_NORSTRT_Pos (10UL)   /*!< ABRT_10B_RD_NORSTRT (Bit 10)                          */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_10B_RD_NORSTRT_Msk (0x400UL) /*!< ABRT_10B_RD_NORSTRT (Bitfield-Mask: 0x01)            */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SBYTE_NORSTRT_Pos (9UL)     /*!< ABRT_SBYTE_NORSTRT (Bit 9)                            */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SBYTE_NORSTRT_Msk (0x200UL) /*!< ABRT_SBYTE_NORSTRT (Bitfield-Mask: 0x01)              */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_HS_NORSTRT_Pos (8UL)        /*!< ABRT_HS_NORSTRT (Bit 8)                               */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_HS_NORSTRT_Msk (0x100UL)    /*!< ABRT_HS_NORSTRT (Bitfield-Mask: 0x01)                 */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SBYTE_ACKDET_Pos (7UL)      /*!< ABRT_SBYTE_ACKDET (Bit 7)                             */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_SBYTE_ACKDET_Msk (0x80UL)   /*!< ABRT_SBYTE_ACKDET (Bitfield-Mask: 0x01)               */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_HS_ACKDET_Pos (6UL)         /*!< ABRT_HS_ACKDET (Bit 6)                                */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_HS_ACKDET_Msk (0x40UL)      /*!< ABRT_HS_ACKDET (Bitfield-Mask: 0x01)                  */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_GCALL_READ_Pos (5UL)        /*!< ABRT_GCALL_READ (Bit 5)                               */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_GCALL_READ_Msk (0x20UL)     /*!< ABRT_GCALL_READ (Bitfield-Mask: 0x01)                 */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_GCALL_NOACK_Pos (4UL)       /*!< ABRT_GCALL_NOACK (Bit 4)                              */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_GCALL_NOACK_Msk (0x10UL)    /*!< ABRT_GCALL_NOACK (Bitfield-Mask: 0x01)                */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_TXDATA_NOACK_Pos (3UL)      /*!< ABRT_TXDATA_NOACK (Bit 3)                             */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_TXDATA_NOACK_Msk (0x8UL)    /*!< ABRT_TXDATA_NOACK (Bitfield-Mask: 0x01)               */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_10ADDR2_NOACK_Pos (2UL)     /*!< ABRT_10ADDR2_NOACK (Bit 2)                            */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_10ADDR2_NOACK_Msk (0x4UL)   /*!< ABRT_10ADDR2_NOACK (Bitfield-Mask: 0x01)              */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_10ADDR1_NOACK_Pos (1UL)     /*!< ABRT_10ADDR1_NOACK (Bit 1)                            */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_10ADDR1_NOACK_Msk (0x2UL)   /*!< ABRT_10ADDR1_NOACK (Bitfield-Mask: 0x01)              */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_7B_ADDR_NOACK_Pos (0UL)     /*!< ABRT_7B_ADDR_NOACK (Bit 0)                            */\n#define I2C_I2C_TX_ABRT_SOURCE_REG_ABRT_7B_ADDR_NOACK_Msk (0x1UL)   /*!< ABRT_7B_ADDR_NOACK (Bitfield-Mask: 0x01)              */\n/* =====================================================  I2C_TX_TL_REG  ===================================================== */\n#define I2C_I2C_TX_TL_REG_TX_TL_Pos       (0UL)                     /*!< TX_TL (Bit 0)                                         */\n#define I2C_I2C_TX_TL_REG_TX_TL_Msk       (0x1fUL)                  /*!< TX_TL (Bitfield-Mask: 0x1f)                           */\n\n\n/* =========================================================================================================================== */\n/* ================                                           I2C2                                            ================ */\n/* =========================================================================================================================== */\n\n/* ===============================================  I2C2_ACK_GENERAL_CALL_REG  =============================================== */\n#define I2C2_I2C2_ACK_GENERAL_CALL_REG_ACK_GEN_CALL_Pos (0UL)       /*!< ACK_GEN_CALL (Bit 0)                                  */\n#define I2C2_I2C2_ACK_GENERAL_CALL_REG_ACK_GEN_CALL_Msk (0x1UL)     /*!< ACK_GEN_CALL (Bitfield-Mask: 0x01)                    */\n/* =================================================  I2C2_CLR_ACTIVITY_REG  ================================================= */\n#define I2C2_I2C2_CLR_ACTIVITY_REG_CLR_ACTIVITY_Pos (0UL)           /*!< CLR_ACTIVITY (Bit 0)                                  */\n#define I2C2_I2C2_CLR_ACTIVITY_REG_CLR_ACTIVITY_Msk (0x1UL)         /*!< CLR_ACTIVITY (Bitfield-Mask: 0x01)                    */\n/* =================================================  I2C2_CLR_GEN_CALL_REG  ================================================= */\n#define I2C2_I2C2_CLR_GEN_CALL_REG_CLR_GEN_CALL_Pos (0UL)           /*!< CLR_GEN_CALL (Bit 0)                                  */\n#define I2C2_I2C2_CLR_GEN_CALL_REG_CLR_GEN_CALL_Msk (0x1UL)         /*!< CLR_GEN_CALL (Bitfield-Mask: 0x01)                    */\n/* ===================================================  I2C2_CLR_INTR_REG  =================================================== */\n#define I2C2_I2C2_CLR_INTR_REG_CLR_INTR_Pos (0UL)                   /*!< CLR_INTR (Bit 0)                                      */\n#define I2C2_I2C2_CLR_INTR_REG_CLR_INTR_Msk (0x1UL)                 /*!< CLR_INTR (Bitfield-Mask: 0x01)                        */\n/* ==================================================  I2C2_CLR_RD_REQ_REG  ================================================== */\n#define I2C2_I2C2_CLR_RD_REQ_REG_CLR_RD_REQ_Pos (0UL)               /*!< CLR_RD_REQ (Bit 0)                                    */\n#define I2C2_I2C2_CLR_RD_REQ_REG_CLR_RD_REQ_Msk (0x1UL)             /*!< CLR_RD_REQ (Bitfield-Mask: 0x01)                      */\n/* =================================================  I2C2_CLR_RX_DONE_REG  ================================================== */\n#define I2C2_I2C2_CLR_RX_DONE_REG_CLR_RX_DONE_Pos (0UL)             /*!< CLR_RX_DONE (Bit 0)                                   */\n#define I2C2_I2C2_CLR_RX_DONE_REG_CLR_RX_DONE_Msk (0x1UL)           /*!< CLR_RX_DONE (Bitfield-Mask: 0x01)                     */\n/* =================================================  I2C2_CLR_RX_OVER_REG  ================================================== */\n#define I2C2_I2C2_CLR_RX_OVER_REG_CLR_RX_OVER_Pos (0UL)             /*!< CLR_RX_OVER (Bit 0)                                   */\n#define I2C2_I2C2_CLR_RX_OVER_REG_CLR_RX_OVER_Msk (0x1UL)           /*!< CLR_RX_OVER (Bitfield-Mask: 0x01)                     */\n/* =================================================  I2C2_CLR_RX_UNDER_REG  ================================================= */\n#define I2C2_I2C2_CLR_RX_UNDER_REG_CLR_RX_UNDER_Pos (0UL)           /*!< CLR_RX_UNDER (Bit 0)                                  */\n#define I2C2_I2C2_CLR_RX_UNDER_REG_CLR_RX_UNDER_Msk (0x1UL)         /*!< CLR_RX_UNDER (Bitfield-Mask: 0x01)                    */\n/* ================================================  I2C2_CLR_START_DET_REG  ================================================= */\n#define I2C2_I2C2_CLR_START_DET_REG_CLR_START_DET_Pos (0UL)         /*!< CLR_START_DET (Bit 0)                                 */\n#define I2C2_I2C2_CLR_START_DET_REG_CLR_START_DET_Msk (0x1UL)       /*!< CLR_START_DET (Bitfield-Mask: 0x01)                   */\n/* =================================================  I2C2_CLR_STOP_DET_REG  ================================================= */\n#define I2C2_I2C2_CLR_STOP_DET_REG_CLR_STOP_DET_Pos (0UL)           /*!< CLR_STOP_DET (Bit 0)                                  */\n#define I2C2_I2C2_CLR_STOP_DET_REG_CLR_STOP_DET_Msk (0x1UL)         /*!< CLR_STOP_DET (Bitfield-Mask: 0x01)                    */\n/* =================================================  I2C2_CLR_TX_ABRT_REG  ================================================== */\n#define I2C2_I2C2_CLR_TX_ABRT_REG_CLR_TX_ABRT_Pos (0UL)             /*!< CLR_TX_ABRT (Bit 0)                                   */\n#define I2C2_I2C2_CLR_TX_ABRT_REG_CLR_TX_ABRT_Msk (0x1UL)           /*!< CLR_TX_ABRT (Bitfield-Mask: 0x01)                     */\n/* =================================================  I2C2_CLR_TX_OVER_REG  ================================================== */\n#define I2C2_I2C2_CLR_TX_OVER_REG_CLR_TX_OVER_Pos (0UL)             /*!< CLR_TX_OVER (Bit 0)                                   */\n#define I2C2_I2C2_CLR_TX_OVER_REG_CLR_TX_OVER_Msk (0x1UL)           /*!< CLR_TX_OVER (Bitfield-Mask: 0x01)                     */\n/* =====================================================  I2C2_CON_REG  ====================================================== */\n#define I2C2_I2C2_CON_REG_I2C_STOP_DET_IF_MASTER_ACTIVE_Pos (10UL)  /*!< I2C_STOP_DET_IF_MASTER_ACTIVE (Bit 10)                */\n#define I2C2_I2C2_CON_REG_I2C_STOP_DET_IF_MASTER_ACTIVE_Msk (0x400UL) /*!< I2C_STOP_DET_IF_MASTER_ACTIVE (Bitfield-Mask: 0x01) */\n#define I2C2_I2C2_CON_REG_I2C_RX_FIFO_FULL_HLD_CTRL_Pos (9UL)       /*!< I2C_RX_FIFO_FULL_HLD_CTRL (Bit 9)                     */\n#define I2C2_I2C2_CON_REG_I2C_RX_FIFO_FULL_HLD_CTRL_Msk (0x200UL)   /*!< I2C_RX_FIFO_FULL_HLD_CTRL (Bitfield-Mask: 0x01)       */\n#define I2C2_I2C2_CON_REG_I2C_TX_EMPTY_CTRL_Pos (8UL)               /*!< I2C_TX_EMPTY_CTRL (Bit 8)                             */\n#define I2C2_I2C2_CON_REG_I2C_TX_EMPTY_CTRL_Msk (0x100UL)           /*!< I2C_TX_EMPTY_CTRL (Bitfield-Mask: 0x01)               */\n#define I2C2_I2C2_CON_REG_I2C_STOP_DET_IFADDRESSED_Pos (7UL)        /*!< I2C_STOP_DET_IFADDRESSED (Bit 7)                      */\n#define I2C2_I2C2_CON_REG_I2C_STOP_DET_IFADDRESSED_Msk (0x80UL)     /*!< I2C_STOP_DET_IFADDRESSED (Bitfield-Mask: 0x01)        */\n#define I2C2_I2C2_CON_REG_I2C_SLAVE_DISABLE_Pos (6UL)               /*!< I2C_SLAVE_DISABLE (Bit 6)                             */\n#define I2C2_I2C2_CON_REG_I2C_SLAVE_DISABLE_Msk (0x40UL)            /*!< I2C_SLAVE_DISABLE (Bitfield-Mask: 0x01)               */\n#define I2C2_I2C2_CON_REG_I2C_RESTART_EN_Pos (5UL)                  /*!< I2C_RESTART_EN (Bit 5)                                */\n#define I2C2_I2C2_CON_REG_I2C_RESTART_EN_Msk (0x20UL)               /*!< I2C_RESTART_EN (Bitfield-Mask: 0x01)                  */\n#define I2C2_I2C2_CON_REG_I2C_10BITADDR_MASTER_Pos (4UL)            /*!< I2C_10BITADDR_MASTER (Bit 4)                          */\n#define I2C2_I2C2_CON_REG_I2C_10BITADDR_MASTER_Msk (0x10UL)         /*!< I2C_10BITADDR_MASTER (Bitfield-Mask: 0x01)            */\n#define I2C2_I2C2_CON_REG_I2C_10BITADDR_SLAVE_Pos (3UL)             /*!< I2C_10BITADDR_SLAVE (Bit 3)                           */\n#define I2C2_I2C2_CON_REG_I2C_10BITADDR_SLAVE_Msk (0x8UL)           /*!< I2C_10BITADDR_SLAVE (Bitfield-Mask: 0x01)             */\n#define I2C2_I2C2_CON_REG_I2C_SPEED_Pos   (1UL)                     /*!< I2C_SPEED (Bit 1)                                     */\n#define I2C2_I2C2_CON_REG_I2C_SPEED_Msk   (0x6UL)                   /*!< I2C_SPEED (Bitfield-Mask: 0x03)                       */\n#define I2C2_I2C2_CON_REG_I2C_MASTER_MODE_Pos (0UL)                 /*!< I2C_MASTER_MODE (Bit 0)                               */\n#define I2C2_I2C2_CON_REG_I2C_MASTER_MODE_Msk (0x1UL)               /*!< I2C_MASTER_MODE (Bitfield-Mask: 0x01)                 */\n/* ===================================================  I2C2_DATA_CMD_REG  =================================================== */\n#define I2C2_I2C2_DATA_CMD_REG_I2C_RESTART_Pos (10UL)               /*!< I2C_RESTART (Bit 10)                                  */\n#define I2C2_I2C2_DATA_CMD_REG_I2C_RESTART_Msk (0x400UL)            /*!< I2C_RESTART (Bitfield-Mask: 0x01)                     */\n#define I2C2_I2C2_DATA_CMD_REG_I2C_STOP_Pos (9UL)                   /*!< I2C_STOP (Bit 9)                                      */\n#define I2C2_I2C2_DATA_CMD_REG_I2C_STOP_Msk (0x200UL)               /*!< I2C_STOP (Bitfield-Mask: 0x01)                        */\n#define I2C2_I2C2_DATA_CMD_REG_I2C_CMD_Pos (8UL)                    /*!< I2C_CMD (Bit 8)                                       */\n#define I2C2_I2C2_DATA_CMD_REG_I2C_CMD_Msk (0x100UL)                /*!< I2C_CMD (Bitfield-Mask: 0x01)                         */\n#define I2C2_I2C2_DATA_CMD_REG_I2C_DAT_Pos (0UL)                    /*!< I2C_DAT (Bit 0)                                       */\n#define I2C2_I2C2_DATA_CMD_REG_I2C_DAT_Msk (0xffUL)                 /*!< I2C_DAT (Bitfield-Mask: 0xff)                         */\n/* ====================================================  I2C2_DMA_CR_REG  ==================================================== */\n#define I2C2_I2C2_DMA_CR_REG_TDMAE_Pos    (1UL)                     /*!< TDMAE (Bit 1)                                         */\n#define I2C2_I2C2_DMA_CR_REG_TDMAE_Msk    (0x2UL)                   /*!< TDMAE (Bitfield-Mask: 0x01)                           */\n#define I2C2_I2C2_DMA_CR_REG_RDMAE_Pos    (0UL)                     /*!< RDMAE (Bit 0)                                         */\n#define I2C2_I2C2_DMA_CR_REG_RDMAE_Msk    (0x1UL)                   /*!< RDMAE (Bitfield-Mask: 0x01)                           */\n/* ===================================================  I2C2_DMA_RDLR_REG  =================================================== */\n#define I2C2_I2C2_DMA_RDLR_REG_DMARDL_Pos (0UL)                     /*!< DMARDL (Bit 0)                                        */\n#define I2C2_I2C2_DMA_RDLR_REG_DMARDL_Msk (0x1fUL)                  /*!< DMARDL (Bitfield-Mask: 0x1f)                          */\n/* ===================================================  I2C2_DMA_TDLR_REG  =================================================== */\n#define I2C2_I2C2_DMA_TDLR_REG_DMATDL_Pos (0UL)                     /*!< DMATDL (Bit 0)                                        */\n#define I2C2_I2C2_DMA_TDLR_REG_DMATDL_Msk (0x1fUL)                  /*!< DMATDL (Bitfield-Mask: 0x1f)                          */\n/* ====================================================  I2C2_ENABLE_REG  ==================================================== */\n#define I2C2_I2C2_ENABLE_REG_I2C_TX_CMD_BLOCK_Pos (2UL)             /*!< I2C_TX_CMD_BLOCK (Bit 2)                              */\n#define I2C2_I2C2_ENABLE_REG_I2C_TX_CMD_BLOCK_Msk (0x4UL)           /*!< I2C_TX_CMD_BLOCK (Bitfield-Mask: 0x01)                */\n#define I2C2_I2C2_ENABLE_REG_I2C_ABORT_Pos (1UL)                    /*!< I2C_ABORT (Bit 1)                                     */\n#define I2C2_I2C2_ENABLE_REG_I2C_ABORT_Msk (0x2UL)                  /*!< I2C_ABORT (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_ENABLE_REG_I2C_EN_Pos   (0UL)                     /*!< I2C_EN (Bit 0)                                        */\n#define I2C2_I2C2_ENABLE_REG_I2C_EN_Msk   (0x1UL)                   /*!< I2C_EN (Bitfield-Mask: 0x01)                          */\n/* ================================================  I2C2_ENABLE_STATUS_REG  ================================================= */\n#define I2C2_I2C2_ENABLE_STATUS_REG_SLV_RX_DATA_LOST_Pos (2UL)      /*!< SLV_RX_DATA_LOST (Bit 2)                              */\n#define I2C2_I2C2_ENABLE_STATUS_REG_SLV_RX_DATA_LOST_Msk (0x4UL)    /*!< SLV_RX_DATA_LOST (Bitfield-Mask: 0x01)                */\n#define I2C2_I2C2_ENABLE_STATUS_REG_SLV_DISABLED_WHILE_BUSY_Pos (1UL) /*!< SLV_DISABLED_WHILE_BUSY (Bit 1)                     */\n#define I2C2_I2C2_ENABLE_STATUS_REG_SLV_DISABLED_WHILE_BUSY_Msk (0x2UL) /*!< SLV_DISABLED_WHILE_BUSY (Bitfield-Mask: 0x01)     */\n#define I2C2_I2C2_ENABLE_STATUS_REG_IC_EN_Pos (0UL)                 /*!< IC_EN (Bit 0)                                         */\n#define I2C2_I2C2_ENABLE_STATUS_REG_IC_EN_Msk (0x1UL)               /*!< IC_EN (Bitfield-Mask: 0x01)                           */\n/* =================================================  I2C2_FS_SCL_HCNT_REG  ================================================== */\n#define I2C2_I2C2_FS_SCL_HCNT_REG_IC_FS_SCL_HCNT_Pos (0UL)          /*!< IC_FS_SCL_HCNT (Bit 0)                                */\n#define I2C2_I2C2_FS_SCL_HCNT_REG_IC_FS_SCL_HCNT_Msk (0xffffUL)     /*!< IC_FS_SCL_HCNT (Bitfield-Mask: 0xffff)                */\n/* =================================================  I2C2_FS_SCL_LCNT_REG  ================================================== */\n#define I2C2_I2C2_FS_SCL_LCNT_REG_IC_FS_SCL_LCNT_Pos (0UL)          /*!< IC_FS_SCL_LCNT (Bit 0)                                */\n#define I2C2_I2C2_FS_SCL_LCNT_REG_IC_FS_SCL_LCNT_Msk (0xffffUL)     /*!< IC_FS_SCL_LCNT (Bitfield-Mask: 0xffff)                */\n/* ===================================================  I2C2_HS_MADDR_REG  =================================================== */\n#define I2C2_I2C2_HS_MADDR_REG_I2C_IC_HS_MAR_Pos (0UL)              /*!< I2C_IC_HS_MAR (Bit 0)                                 */\n#define I2C2_I2C2_HS_MADDR_REG_I2C_IC_HS_MAR_Msk (0x7UL)            /*!< I2C_IC_HS_MAR (Bitfield-Mask: 0x07)                   */\n/* =================================================  I2C2_HS_SCL_HCNT_REG  ================================================== */\n#define I2C2_I2C2_HS_SCL_HCNT_REG_IC_HS_SCL_HCNT_Pos (0UL)          /*!< IC_HS_SCL_HCNT (Bit 0)                                */\n#define I2C2_I2C2_HS_SCL_HCNT_REG_IC_HS_SCL_HCNT_Msk (0xffffUL)     /*!< IC_HS_SCL_HCNT (Bitfield-Mask: 0xffff)                */\n/* =================================================  I2C2_HS_SCL_LCNT_REG  ================================================== */\n#define I2C2_I2C2_HS_SCL_LCNT_REG_IC_HS_SCL_LCNT_Pos (0UL)          /*!< IC_HS_SCL_LCNT (Bit 0)                                */\n#define I2C2_I2C2_HS_SCL_LCNT_REG_IC_HS_SCL_LCNT_Msk (0xffffUL)     /*!< IC_HS_SCL_LCNT (Bitfield-Mask: 0xffff)                */\n/* =================================================  I2C2_IC_FS_SPKLEN_REG  ================================================= */\n#define I2C2_I2C2_IC_FS_SPKLEN_REG_I2C_FS_SPKLEN_Pos (0UL)          /*!< I2C_FS_SPKLEN (Bit 0)                                 */\n#define I2C2_I2C2_IC_FS_SPKLEN_REG_I2C_FS_SPKLEN_Msk (0xffUL)       /*!< I2C_FS_SPKLEN (Bitfield-Mask: 0xff)                   */\n/* =================================================  I2C2_IC_HS_SPKLEN_REG  ================================================= */\n#define I2C2_I2C2_IC_HS_SPKLEN_REG_I2C_HS_SPKLEN_Pos (0UL)          /*!< I2C_HS_SPKLEN (Bit 0)                                 */\n#define I2C2_I2C2_IC_HS_SPKLEN_REG_I2C_HS_SPKLEN_Msk (0xffUL)       /*!< I2C_HS_SPKLEN (Bitfield-Mask: 0xff)                   */\n/* ==================================================  I2C2_INTR_MASK_REG  =================================================== */\n#define I2C2_I2C2_INTR_MASK_REG_M_SCL_STUCK_AT_LOW_Pos (14UL)       /*!< M_SCL_STUCK_AT_LOW (Bit 14)                           */\n#define I2C2_I2C2_INTR_MASK_REG_M_SCL_STUCK_AT_LOW_Msk (0x4000UL)   /*!< M_SCL_STUCK_AT_LOW (Bitfield-Mask: 0x01)              */\n#define I2C2_I2C2_INTR_MASK_REG_M_MASTER_ON_HOLD_Pos (13UL)         /*!< M_MASTER_ON_HOLD (Bit 13)                             */\n#define I2C2_I2C2_INTR_MASK_REG_M_MASTER_ON_HOLD_Msk (0x2000UL)     /*!< M_MASTER_ON_HOLD (Bitfield-Mask: 0x01)                */\n#define I2C2_I2C2_INTR_MASK_REG_M_RESTART_DET_Pos (12UL)            /*!< M_RESTART_DET (Bit 12)                                */\n#define I2C2_I2C2_INTR_MASK_REG_M_RESTART_DET_Msk (0x1000UL)        /*!< M_RESTART_DET (Bitfield-Mask: 0x01)                   */\n#define I2C2_I2C2_INTR_MASK_REG_M_GEN_CALL_Pos (11UL)               /*!< M_GEN_CALL (Bit 11)                                   */\n#define I2C2_I2C2_INTR_MASK_REG_M_GEN_CALL_Msk (0x800UL)            /*!< M_GEN_CALL (Bitfield-Mask: 0x01)                      */\n#define I2C2_I2C2_INTR_MASK_REG_M_START_DET_Pos (10UL)              /*!< M_START_DET (Bit 10)                                  */\n#define I2C2_I2C2_INTR_MASK_REG_M_START_DET_Msk (0x400UL)           /*!< M_START_DET (Bitfield-Mask: 0x01)                     */\n#define I2C2_I2C2_INTR_MASK_REG_M_STOP_DET_Pos (9UL)                /*!< M_STOP_DET (Bit 9)                                    */\n#define I2C2_I2C2_INTR_MASK_REG_M_STOP_DET_Msk (0x200UL)            /*!< M_STOP_DET (Bitfield-Mask: 0x01)                      */\n#define I2C2_I2C2_INTR_MASK_REG_M_ACTIVITY_Pos (8UL)                /*!< M_ACTIVITY (Bit 8)                                    */\n#define I2C2_I2C2_INTR_MASK_REG_M_ACTIVITY_Msk (0x100UL)            /*!< M_ACTIVITY (Bitfield-Mask: 0x01)                      */\n#define I2C2_I2C2_INTR_MASK_REG_M_RX_DONE_Pos (7UL)                 /*!< M_RX_DONE (Bit 7)                                     */\n#define I2C2_I2C2_INTR_MASK_REG_M_RX_DONE_Msk (0x80UL)              /*!< M_RX_DONE (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_MASK_REG_M_TX_ABRT_Pos (6UL)                 /*!< M_TX_ABRT (Bit 6)                                     */\n#define I2C2_I2C2_INTR_MASK_REG_M_TX_ABRT_Msk (0x40UL)              /*!< M_TX_ABRT (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_MASK_REG_M_RD_REQ_Pos (5UL)                  /*!< M_RD_REQ (Bit 5)                                      */\n#define I2C2_I2C2_INTR_MASK_REG_M_RD_REQ_Msk (0x20UL)               /*!< M_RD_REQ (Bitfield-Mask: 0x01)                        */\n#define I2C2_I2C2_INTR_MASK_REG_M_TX_EMPTY_Pos (4UL)                /*!< M_TX_EMPTY (Bit 4)                                    */\n#define I2C2_I2C2_INTR_MASK_REG_M_TX_EMPTY_Msk (0x10UL)             /*!< M_TX_EMPTY (Bitfield-Mask: 0x01)                      */\n#define I2C2_I2C2_INTR_MASK_REG_M_TX_OVER_Pos (3UL)                 /*!< M_TX_OVER (Bit 3)                                     */\n#define I2C2_I2C2_INTR_MASK_REG_M_TX_OVER_Msk (0x8UL)               /*!< M_TX_OVER (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_MASK_REG_M_RX_FULL_Pos (2UL)                 /*!< M_RX_FULL (Bit 2)                                     */\n#define I2C2_I2C2_INTR_MASK_REG_M_RX_FULL_Msk (0x4UL)               /*!< M_RX_FULL (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_MASK_REG_M_RX_OVER_Pos (1UL)                 /*!< M_RX_OVER (Bit 1)                                     */\n#define I2C2_I2C2_INTR_MASK_REG_M_RX_OVER_Msk (0x2UL)               /*!< M_RX_OVER (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_MASK_REG_M_RX_UNDER_Pos (0UL)                /*!< M_RX_UNDER (Bit 0)                                    */\n#define I2C2_I2C2_INTR_MASK_REG_M_RX_UNDER_Msk (0x1UL)              /*!< M_RX_UNDER (Bitfield-Mask: 0x01)                      */\n/* ==================================================  I2C2_INTR_STAT_REG  =================================================== */\n#define I2C2_I2C2_INTR_STAT_REG_R_SCL_STUCK_AT_LOW_Pos (14UL)       /*!< R_SCL_STUCK_AT_LOW (Bit 14)                           */\n#define I2C2_I2C2_INTR_STAT_REG_R_SCL_STUCK_AT_LOW_Msk (0x4000UL)   /*!< R_SCL_STUCK_AT_LOW (Bitfield-Mask: 0x01)              */\n#define I2C2_I2C2_INTR_STAT_REG_R_MASTER_ON_HOLD_Pos (13UL)         /*!< R_MASTER_ON_HOLD (Bit 13)                             */\n#define I2C2_I2C2_INTR_STAT_REG_R_MASTER_ON_HOLD_Msk (0x2000UL)     /*!< R_MASTER_ON_HOLD (Bitfield-Mask: 0x01)                */\n#define I2C2_I2C2_INTR_STAT_REG_R_RESTART_DET_Pos (12UL)            /*!< R_RESTART_DET (Bit 12)                                */\n#define I2C2_I2C2_INTR_STAT_REG_R_RESTART_DET_Msk (0x1000UL)        /*!< R_RESTART_DET (Bitfield-Mask: 0x01)                   */\n#define I2C2_I2C2_INTR_STAT_REG_R_GEN_CALL_Pos (11UL)               /*!< R_GEN_CALL (Bit 11)                                   */\n#define I2C2_I2C2_INTR_STAT_REG_R_GEN_CALL_Msk (0x800UL)            /*!< R_GEN_CALL (Bitfield-Mask: 0x01)                      */\n#define I2C2_I2C2_INTR_STAT_REG_R_START_DET_Pos (10UL)              /*!< R_START_DET (Bit 10)                                  */\n#define I2C2_I2C2_INTR_STAT_REG_R_START_DET_Msk (0x400UL)           /*!< R_START_DET (Bitfield-Mask: 0x01)                     */\n#define I2C2_I2C2_INTR_STAT_REG_R_STOP_DET_Pos (9UL)                /*!< R_STOP_DET (Bit 9)                                    */\n#define I2C2_I2C2_INTR_STAT_REG_R_STOP_DET_Msk (0x200UL)            /*!< R_STOP_DET (Bitfield-Mask: 0x01)                      */\n#define I2C2_I2C2_INTR_STAT_REG_R_ACTIVITY_Pos (8UL)                /*!< R_ACTIVITY (Bit 8)                                    */\n#define I2C2_I2C2_INTR_STAT_REG_R_ACTIVITY_Msk (0x100UL)            /*!< R_ACTIVITY (Bitfield-Mask: 0x01)                      */\n#define I2C2_I2C2_INTR_STAT_REG_R_RX_DONE_Pos (7UL)                 /*!< R_RX_DONE (Bit 7)                                     */\n#define I2C2_I2C2_INTR_STAT_REG_R_RX_DONE_Msk (0x80UL)              /*!< R_RX_DONE (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_STAT_REG_R_TX_ABRT_Pos (6UL)                 /*!< R_TX_ABRT (Bit 6)                                     */\n#define I2C2_I2C2_INTR_STAT_REG_R_TX_ABRT_Msk (0x40UL)              /*!< R_TX_ABRT (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_STAT_REG_R_RD_REQ_Pos (5UL)                  /*!< R_RD_REQ (Bit 5)                                      */\n#define I2C2_I2C2_INTR_STAT_REG_R_RD_REQ_Msk (0x20UL)               /*!< R_RD_REQ (Bitfield-Mask: 0x01)                        */\n#define I2C2_I2C2_INTR_STAT_REG_R_TX_EMPTY_Pos (4UL)                /*!< R_TX_EMPTY (Bit 4)                                    */\n#define I2C2_I2C2_INTR_STAT_REG_R_TX_EMPTY_Msk (0x10UL)             /*!< R_TX_EMPTY (Bitfield-Mask: 0x01)                      */\n#define I2C2_I2C2_INTR_STAT_REG_R_TX_OVER_Pos (3UL)                 /*!< R_TX_OVER (Bit 3)                                     */\n#define I2C2_I2C2_INTR_STAT_REG_R_TX_OVER_Msk (0x8UL)               /*!< R_TX_OVER (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_STAT_REG_R_RX_FULL_Pos (2UL)                 /*!< R_RX_FULL (Bit 2)                                     */\n#define I2C2_I2C2_INTR_STAT_REG_R_RX_FULL_Msk (0x4UL)               /*!< R_RX_FULL (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_STAT_REG_R_RX_OVER_Pos (1UL)                 /*!< R_RX_OVER (Bit 1)                                     */\n#define I2C2_I2C2_INTR_STAT_REG_R_RX_OVER_Msk (0x2UL)               /*!< R_RX_OVER (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_INTR_STAT_REG_R_RX_UNDER_Pos (0UL)                /*!< R_RX_UNDER (Bit 0)                                    */\n#define I2C2_I2C2_INTR_STAT_REG_R_RX_UNDER_Msk (0x1UL)              /*!< R_RX_UNDER (Bitfield-Mask: 0x01)                      */\n/* ================================================  I2C2_RAW_INTR_STAT_REG  ================================================= */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_SCL_STUCK_AT_LOW_Pos (14UL)     /*!< SCL_STUCK_AT_LOW (Bit 14)                             */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_SCL_STUCK_AT_LOW_Msk (0x4000UL) /*!< SCL_STUCK_AT_LOW (Bitfield-Mask: 0x01)                */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_MASTER_ON_HOLD_Pos (13UL)       /*!< MASTER_ON_HOLD (Bit 13)                               */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_MASTER_ON_HOLD_Msk (0x2000UL)   /*!< MASTER_ON_HOLD (Bitfield-Mask: 0x01)                  */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RESTART_DET_Pos (12UL)          /*!< RESTART_DET (Bit 12)                                  */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RESTART_DET_Msk (0x1000UL)      /*!< RESTART_DET (Bitfield-Mask: 0x01)                     */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_GEN_CALL_Pos (11UL)             /*!< GEN_CALL (Bit 11)                                     */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_GEN_CALL_Msk (0x800UL)          /*!< GEN_CALL (Bitfield-Mask: 0x01)                        */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_START_DET_Pos (10UL)            /*!< START_DET (Bit 10)                                    */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_START_DET_Msk (0x400UL)         /*!< START_DET (Bitfield-Mask: 0x01)                       */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_STOP_DET_Pos (9UL)              /*!< STOP_DET (Bit 9)                                      */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_STOP_DET_Msk (0x200UL)          /*!< STOP_DET (Bitfield-Mask: 0x01)                        */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_ACTIVITY_Pos (8UL)              /*!< ACTIVITY (Bit 8)                                      */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_ACTIVITY_Msk (0x100UL)          /*!< ACTIVITY (Bitfield-Mask: 0x01)                        */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RX_DONE_Pos (7UL)               /*!< RX_DONE (Bit 7)                                       */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RX_DONE_Msk (0x80UL)            /*!< RX_DONE (Bitfield-Mask: 0x01)                         */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_TX_ABRT_Pos (6UL)               /*!< TX_ABRT (Bit 6)                                       */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_TX_ABRT_Msk (0x40UL)            /*!< TX_ABRT (Bitfield-Mask: 0x01)                         */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RD_REQ_Pos (5UL)                /*!< RD_REQ (Bit 5)                                        */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RD_REQ_Msk (0x20UL)             /*!< RD_REQ (Bitfield-Mask: 0x01)                          */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_TX_EMPTY_Pos (4UL)              /*!< TX_EMPTY (Bit 4)                                      */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_TX_EMPTY_Msk (0x10UL)           /*!< TX_EMPTY (Bitfield-Mask: 0x01)                        */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_TX_OVER_Pos (3UL)               /*!< TX_OVER (Bit 3)                                       */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_TX_OVER_Msk (0x8UL)             /*!< TX_OVER (Bitfield-Mask: 0x01)                         */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RX_FULL_Pos (2UL)               /*!< RX_FULL (Bit 2)                                       */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RX_FULL_Msk (0x4UL)             /*!< RX_FULL (Bitfield-Mask: 0x01)                         */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RX_OVER_Pos (1UL)               /*!< RX_OVER (Bit 1)                                       */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RX_OVER_Msk (0x2UL)             /*!< RX_OVER (Bitfield-Mask: 0x01)                         */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RX_UNDER_Pos (0UL)              /*!< RX_UNDER (Bit 0)                                      */\n#define I2C2_I2C2_RAW_INTR_STAT_REG_RX_UNDER_Msk (0x1UL)            /*!< RX_UNDER (Bitfield-Mask: 0x01)                        */\n/* ====================================================  I2C2_RXFLR_REG  ===================================================== */\n#define I2C2_I2C2_RXFLR_REG_RXFLR_Pos     (0UL)                     /*!< RXFLR (Bit 0)                                         */\n#define I2C2_I2C2_RXFLR_REG_RXFLR_Msk     (0x3fUL)                  /*!< RXFLR (Bitfield-Mask: 0x3f)                           */\n/* ====================================================  I2C2_RX_TL_REG  ===================================================== */\n#define I2C2_I2C2_RX_TL_REG_RX_TL_Pos     (0UL)                     /*!< RX_TL (Bit 0)                                         */\n#define I2C2_I2C2_RX_TL_REG_RX_TL_Msk     (0x1fUL)                  /*!< RX_TL (Bitfield-Mask: 0x1f)                           */\n/* =====================================================  I2C2_SAR_REG  ====================================================== */\n#define I2C2_I2C2_SAR_REG_IC_SAR_Pos      (0UL)                     /*!< IC_SAR (Bit 0)                                        */\n#define I2C2_I2C2_SAR_REG_IC_SAR_Msk      (0x3ffUL)                 /*!< IC_SAR (Bitfield-Mask: 0x3ff)                         */\n/* ===================================================  I2C2_SDA_HOLD_REG  =================================================== */\n#define I2C2_I2C2_SDA_HOLD_REG_I2C_SDA_RX_HOLD_Pos (16UL)           /*!< I2C_SDA_RX_HOLD (Bit 16)                              */\n#define I2C2_I2C2_SDA_HOLD_REG_I2C_SDA_RX_HOLD_Msk (0xff0000UL)     /*!< I2C_SDA_RX_HOLD (Bitfield-Mask: 0xff)                 */\n#define I2C2_I2C2_SDA_HOLD_REG_I2C_SDA_TX_HOLD_Pos (0UL)            /*!< I2C_SDA_TX_HOLD (Bit 0)                               */\n#define I2C2_I2C2_SDA_HOLD_REG_I2C_SDA_TX_HOLD_Msk (0xffffUL)       /*!< I2C_SDA_TX_HOLD (Bitfield-Mask: 0xffff)               */\n/* ==================================================  I2C2_SDA_SETUP_REG  =================================================== */\n#define I2C2_I2C2_SDA_SETUP_REG_SDA_SETUP_Pos (0UL)                 /*!< SDA_SETUP (Bit 0)                                     */\n#define I2C2_I2C2_SDA_SETUP_REG_SDA_SETUP_Msk (0xffUL)              /*!< SDA_SETUP (Bitfield-Mask: 0xff)                       */\n/* =================================================  I2C2_SS_SCL_HCNT_REG  ================================================== */\n#define I2C2_I2C2_SS_SCL_HCNT_REG_IC_SS_SCL_HCNT_Pos (0UL)          /*!< IC_SS_SCL_HCNT (Bit 0)                                */\n#define I2C2_I2C2_SS_SCL_HCNT_REG_IC_SS_SCL_HCNT_Msk (0xffffUL)     /*!< IC_SS_SCL_HCNT (Bitfield-Mask: 0xffff)                */\n/* =================================================  I2C2_SS_SCL_LCNT_REG  ================================================== */\n#define I2C2_I2C2_SS_SCL_LCNT_REG_IC_SS_SCL_LCNT_Pos (0UL)          /*!< IC_SS_SCL_LCNT (Bit 0)                                */\n#define I2C2_I2C2_SS_SCL_LCNT_REG_IC_SS_SCL_LCNT_Msk (0xffffUL)     /*!< IC_SS_SCL_LCNT (Bitfield-Mask: 0xffff)                */\n/* ====================================================  I2C2_STATUS_REG  ==================================================== */\n#define I2C2_I2C2_STATUS_REG_LV_HOLD_RX_FIFO_FULL_Pos (10UL)        /*!< LV_HOLD_RX_FIFO_FULL (Bit 10)                         */\n#define I2C2_I2C2_STATUS_REG_LV_HOLD_RX_FIFO_FULL_Msk (0x400UL)     /*!< LV_HOLD_RX_FIFO_FULL (Bitfield-Mask: 0x01)            */\n#define I2C2_I2C2_STATUS_REG_SLV_HOLD_TX_FIFO_EMPTY_Pos (9UL)       /*!< SLV_HOLD_TX_FIFO_EMPTY (Bit 9)                        */\n#define I2C2_I2C2_STATUS_REG_SLV_HOLD_TX_FIFO_EMPTY_Msk (0x200UL)   /*!< SLV_HOLD_TX_FIFO_EMPTY (Bitfield-Mask: 0x01)          */\n#define I2C2_I2C2_STATUS_REG_MST_HOLD_RX_FIFO_FULL_Pos (8UL)        /*!< MST_HOLD_RX_FIFO_FULL (Bit 8)                         */\n#define I2C2_I2C2_STATUS_REG_MST_HOLD_RX_FIFO_FULL_Msk (0x100UL)    /*!< MST_HOLD_RX_FIFO_FULL (Bitfield-Mask: 0x01)           */\n#define I2C2_I2C2_STATUS_REG_MST_HOLD_TX_FIFO_EMPTY_Pos (7UL)       /*!< MST_HOLD_TX_FIFO_EMPTY (Bit 7)                        */\n#define I2C2_I2C2_STATUS_REG_MST_HOLD_TX_FIFO_EMPTY_Msk (0x80UL)    /*!< MST_HOLD_TX_FIFO_EMPTY (Bitfield-Mask: 0x01)          */\n#define I2C2_I2C2_STATUS_REG_SLV_ACTIVITY_Pos (6UL)                 /*!< SLV_ACTIVITY (Bit 6)                                  */\n#define I2C2_I2C2_STATUS_REG_SLV_ACTIVITY_Msk (0x40UL)              /*!< SLV_ACTIVITY (Bitfield-Mask: 0x01)                    */\n#define I2C2_I2C2_STATUS_REG_MST_ACTIVITY_Pos (5UL)                 /*!< MST_ACTIVITY (Bit 5)                                  */\n#define I2C2_I2C2_STATUS_REG_MST_ACTIVITY_Msk (0x20UL)              /*!< MST_ACTIVITY (Bitfield-Mask: 0x01)                    */\n#define I2C2_I2C2_STATUS_REG_RFF_Pos      (4UL)                     /*!< RFF (Bit 4)                                           */\n#define I2C2_I2C2_STATUS_REG_RFF_Msk      (0x10UL)                  /*!< RFF (Bitfield-Mask: 0x01)                             */\n#define I2C2_I2C2_STATUS_REG_RFNE_Pos     (3UL)                     /*!< RFNE (Bit 3)                                          */\n#define I2C2_I2C2_STATUS_REG_RFNE_Msk     (0x8UL)                   /*!< RFNE (Bitfield-Mask: 0x01)                            */\n#define I2C2_I2C2_STATUS_REG_TFE_Pos      (2UL)                     /*!< TFE (Bit 2)                                           */\n#define I2C2_I2C2_STATUS_REG_TFE_Msk      (0x4UL)                   /*!< TFE (Bitfield-Mask: 0x01)                             */\n#define I2C2_I2C2_STATUS_REG_TFNF_Pos     (1UL)                     /*!< TFNF (Bit 1)                                          */\n#define I2C2_I2C2_STATUS_REG_TFNF_Msk     (0x2UL)                   /*!< TFNF (Bitfield-Mask: 0x01)                            */\n#define I2C2_I2C2_STATUS_REG_I2C_ACTIVITY_Pos (0UL)                 /*!< I2C_ACTIVITY (Bit 0)                                  */\n#define I2C2_I2C2_STATUS_REG_I2C_ACTIVITY_Msk (0x1UL)               /*!< I2C_ACTIVITY (Bitfield-Mask: 0x01)                    */\n/* =====================================================  I2C2_TAR_REG  ====================================================== */\n#define I2C2_I2C2_TAR_REG_SPECIAL_Pos     (11UL)                    /*!< SPECIAL (Bit 11)                                      */\n#define I2C2_I2C2_TAR_REG_SPECIAL_Msk     (0x800UL)                 /*!< SPECIAL (Bitfield-Mask: 0x01)                         */\n#define I2C2_I2C2_TAR_REG_GC_OR_START_Pos (10UL)                    /*!< GC_OR_START (Bit 10)                                  */\n#define I2C2_I2C2_TAR_REG_GC_OR_START_Msk (0x400UL)                 /*!< GC_OR_START (Bitfield-Mask: 0x01)                     */\n#define I2C2_I2C2_TAR_REG_IC_TAR_Pos      (0UL)                     /*!< IC_TAR (Bit 0)                                        */\n#define I2C2_I2C2_TAR_REG_IC_TAR_Msk      (0x3ffUL)                 /*!< IC_TAR (Bitfield-Mask: 0x3ff)                         */\n/* ====================================================  I2C2_TXFLR_REG  ===================================================== */\n#define I2C2_I2C2_TXFLR_REG_TXFLR_Pos     (0UL)                     /*!< TXFLR (Bit 0)                                         */\n#define I2C2_I2C2_TXFLR_REG_TXFLR_Msk     (0x3fUL)                  /*!< TXFLR (Bitfield-Mask: 0x3f)                           */\n/* ================================================  I2C2_TX_ABRT_SOURCE_REG  ================================================ */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_USER_ABRT_Pos (16UL)      /*!< ABRT_USER_ABRT (Bit 16)                               */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_USER_ABRT_Msk (0x10000UL) /*!< ABRT_USER_ABRT (Bitfield-Mask: 0x01)                  */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SLVRD_INTX_Pos (15UL)     /*!< ABRT_SLVRD_INTX (Bit 15)                              */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SLVRD_INTX_Msk (0x8000UL) /*!< ABRT_SLVRD_INTX (Bitfield-Mask: 0x01)                 */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SLV_ARBLOST_Pos (14UL)    /*!< ABRT_SLV_ARBLOST (Bit 14)                             */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SLV_ARBLOST_Msk (0x4000UL) /*!< ABRT_SLV_ARBLOST (Bitfield-Mask: 0x01)               */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SLVFLUSH_TXFIFO_Pos (13UL) /*!< ABRT_SLVFLUSH_TXFIFO (Bit 13)                        */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SLVFLUSH_TXFIFO_Msk (0x2000UL) /*!< ABRT_SLVFLUSH_TXFIFO (Bitfield-Mask: 0x01)       */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ARB_LOST_Pos (12UL)            /*!< ARB_LOST (Bit 12)                                     */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ARB_LOST_Msk (0x1000UL)        /*!< ARB_LOST (Bitfield-Mask: 0x01)                        */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_MASTER_DIS_Pos (11UL)     /*!< ABRT_MASTER_DIS (Bit 11)                              */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_MASTER_DIS_Msk (0x800UL)  /*!< ABRT_MASTER_DIS (Bitfield-Mask: 0x01)                 */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_10B_RD_NORSTRT_Pos (10UL) /*!< ABRT_10B_RD_NORSTRT (Bit 10)                          */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_10B_RD_NORSTRT_Msk (0x400UL) /*!< ABRT_10B_RD_NORSTRT (Bitfield-Mask: 0x01)          */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SBYTE_NORSTRT_Pos (9UL)   /*!< ABRT_SBYTE_NORSTRT (Bit 9)                            */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SBYTE_NORSTRT_Msk (0x200UL) /*!< ABRT_SBYTE_NORSTRT (Bitfield-Mask: 0x01)            */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_HS_NORSTRT_Pos (8UL)      /*!< ABRT_HS_NORSTRT (Bit 8)                               */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_HS_NORSTRT_Msk (0x100UL)  /*!< ABRT_HS_NORSTRT (Bitfield-Mask: 0x01)                 */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SBYTE_ACKDET_Pos (7UL)    /*!< ABRT_SBYTE_ACKDET (Bit 7)                             */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_SBYTE_ACKDET_Msk (0x80UL) /*!< ABRT_SBYTE_ACKDET (Bitfield-Mask: 0x01)               */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_HS_ACKDET_Pos (6UL)       /*!< ABRT_HS_ACKDET (Bit 6)                                */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_HS_ACKDET_Msk (0x40UL)    /*!< ABRT_HS_ACKDET (Bitfield-Mask: 0x01)                  */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_GCALL_READ_Pos (5UL)      /*!< ABRT_GCALL_READ (Bit 5)                               */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_GCALL_READ_Msk (0x20UL)   /*!< ABRT_GCALL_READ (Bitfield-Mask: 0x01)                 */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_GCALL_NOACK_Pos (4UL)     /*!< ABRT_GCALL_NOACK (Bit 4)                              */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_GCALL_NOACK_Msk (0x10UL)  /*!< ABRT_GCALL_NOACK (Bitfield-Mask: 0x01)                */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_TXDATA_NOACK_Pos (3UL)    /*!< ABRT_TXDATA_NOACK (Bit 3)                             */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_TXDATA_NOACK_Msk (0x8UL)  /*!< ABRT_TXDATA_NOACK (Bitfield-Mask: 0x01)               */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_10ADDR2_NOACK_Pos (2UL)   /*!< ABRT_10ADDR2_NOACK (Bit 2)                            */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_10ADDR2_NOACK_Msk (0x4UL) /*!< ABRT_10ADDR2_NOACK (Bitfield-Mask: 0x01)              */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_10ADDR1_NOACK_Pos (1UL)   /*!< ABRT_10ADDR1_NOACK (Bit 1)                            */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_10ADDR1_NOACK_Msk (0x2UL) /*!< ABRT_10ADDR1_NOACK (Bitfield-Mask: 0x01)              */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_7B_ADDR_NOACK_Pos (0UL)   /*!< ABRT_7B_ADDR_NOACK (Bit 0)                            */\n#define I2C2_I2C2_TX_ABRT_SOURCE_REG_ABRT_7B_ADDR_NOACK_Msk (0x1UL) /*!< ABRT_7B_ADDR_NOACK (Bitfield-Mask: 0x01)              */\n/* ====================================================  I2C2_TX_TL_REG  ===================================================== */\n#define I2C2_I2C2_TX_TL_REG_TX_TL_Pos     (0UL)                     /*!< TX_TL (Bit 0)                                         */\n#define I2C2_I2C2_TX_TL_REG_TX_TL_Msk     (0x1fUL)                  /*!< TX_TL (Bitfield-Mask: 0x1f)                           */\n\n\n/* =========================================================================================================================== */\n/* ================                                           LCDC                                            ================ */\n/* =========================================================================================================================== */\n\n/* =================================================  LCDC_BACKPORCHXY_REG  ================================================== */\n#define LCDC_LCDC_BACKPORCHXY_REG_LCDC_BPORCH_X_Pos (16UL)          /*!< LCDC_BPORCH_X (Bit 16)                                */\n#define LCDC_LCDC_BACKPORCHXY_REG_LCDC_BPORCH_X_Msk (0xffff0000UL)  /*!< LCDC_BPORCH_X (Bitfield-Mask: 0xffff)                 */\n#define LCDC_LCDC_BACKPORCHXY_REG_LCDC_BPORCH_Y_Pos (0UL)           /*!< LCDC_BPORCH_Y (Bit 0)                                 */\n#define LCDC_LCDC_BACKPORCHXY_REG_LCDC_BPORCH_Y_Msk (0xffffUL)      /*!< LCDC_BPORCH_Y (Bitfield-Mask: 0xffff)                 */\n/* ===================================================  LCDC_BGCOLOR_REG  ==================================================== */\n#define LCDC_LCDC_BGCOLOR_REG_LCDC_BG_RED_Pos (24UL)                /*!< LCDC_BG_RED (Bit 24)                                  */\n#define LCDC_LCDC_BGCOLOR_REG_LCDC_BG_RED_Msk (0xff000000UL)        /*!< LCDC_BG_RED (Bitfield-Mask: 0xff)                     */\n#define LCDC_LCDC_BGCOLOR_REG_LCDC_BG_GREEN_Pos (16UL)              /*!< LCDC_BG_GREEN (Bit 16)                                */\n#define LCDC_LCDC_BGCOLOR_REG_LCDC_BG_GREEN_Msk (0xff0000UL)        /*!< LCDC_BG_GREEN (Bitfield-Mask: 0xff)                   */\n#define LCDC_LCDC_BGCOLOR_REG_LCDC_BG_BLUE_Pos (8UL)                /*!< LCDC_BG_BLUE (Bit 8)                                  */\n#define LCDC_LCDC_BGCOLOR_REG_LCDC_BG_BLUE_Msk (0xff00UL)           /*!< LCDC_BG_BLUE (Bitfield-Mask: 0xff)                    */\n#define LCDC_LCDC_BGCOLOR_REG_LCDC_BG_ALPHA_Pos (0UL)               /*!< LCDC_BG_ALPHA (Bit 0)                                 */\n#define LCDC_LCDC_BGCOLOR_REG_LCDC_BG_ALPHA_Msk (0xffUL)            /*!< LCDC_BG_ALPHA (Bitfield-Mask: 0xff)                   */\n/* ==================================================  LCDC_BLANKINGXY_REG  ================================================== */\n#define LCDC_LCDC_BLANKINGXY_REG_LCDC_BLANKING_X_Pos (16UL)         /*!< LCDC_BLANKING_X (Bit 16)                              */\n#define LCDC_LCDC_BLANKINGXY_REG_LCDC_BLANKING_X_Msk (0xffff0000UL) /*!< LCDC_BLANKING_X (Bitfield-Mask: 0xffff)               */\n#define LCDC_LCDC_BLANKINGXY_REG_LCDC_BLANKING_Y_Pos (0UL)          /*!< LCDC_BLANKING_Y (Bit 0)                               */\n#define LCDC_LCDC_BLANKINGXY_REG_LCDC_BLANKING_Y_Msk (0xffffUL)     /*!< LCDC_BLANKING_Y (Bitfield-Mask: 0xffff)               */\n/* ===================================================  LCDC_CLKCTRL_REG  ==================================================== */\n#define LCDC_LCDC_CLKCTRL_REG_LCDC_SEC_CLK_DIV_Pos (27UL)           /*!< LCDC_SEC_CLK_DIV (Bit 27)                             */\n#define LCDC_LCDC_CLKCTRL_REG_LCDC_SEC_CLK_DIV_Msk (0xf8000000UL)   /*!< LCDC_SEC_CLK_DIV (Bitfield-Mask: 0x1f)                */\n#define LCDC_LCDC_CLKCTRL_REG_LCDC_DMA_HOLD_Pos (8UL)               /*!< LCDC_DMA_HOLD (Bit 8)                                 */\n#define LCDC_LCDC_CLKCTRL_REG_LCDC_DMA_HOLD_Msk (0x3f00UL)          /*!< LCDC_DMA_HOLD (Bitfield-Mask: 0x3f)                   */\n#define LCDC_LCDC_CLKCTRL_REG_LCDC_CLK_DIV_Pos (0UL)                /*!< LCDC_CLK_DIV (Bit 0)                                  */\n#define LCDC_LCDC_CLKCTRL_REG_LCDC_CLK_DIV_Msk (0x3fUL)             /*!< LCDC_CLK_DIV (Bitfield-Mask: 0x3f)                    */\n/* =====================================================  LCDC_CRC_REG  ====================================================== */\n#define LCDC_LCDC_CRC_REG_LCDC_CRC_Pos    (0UL)                     /*!< LCDC_CRC (Bit 0)                                      */\n#define LCDC_LCDC_CRC_REG_LCDC_CRC_Msk    (0xffffffffUL)            /*!< LCDC_CRC (Bitfield-Mask: 0xffffffff)                  */\n/* ===================================================  LCDC_DBIB_CFG_REG  =================================================== */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_TE_DIS_Pos (31UL)          /*!< LCDC_DBIB_TE_DIS (Bit 31)                             */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_TE_DIS_Msk (0x80000000UL)  /*!< LCDC_DBIB_TE_DIS (Bitfield-Mask: 0x01)                */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_CSX_FORCE_Pos (30UL)       /*!< LCDC_DBIB_CSX_FORCE (Bit 30)                          */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_CSX_FORCE_Msk (0x40000000UL) /*!< LCDC_DBIB_CSX_FORCE (Bitfield-Mask: 0x01)           */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_CSX_FORCE_VAL_Pos (29UL)   /*!< LCDC_DBIB_CSX_FORCE_VAL (Bit 29)                      */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_CSX_FORCE_VAL_Msk (0x20000000UL) /*!< LCDC_DBIB_CSX_FORCE_VAL (Bitfield-Mask: 0x01)   */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_PAD_Pos (28UL)         /*!< LCDC_DBIB_SPI_PAD (Bit 28)                            */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_PAD_Msk (0x10000000UL) /*!< LCDC_DBIB_SPI_PAD (Bitfield-Mask: 0x01)               */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_RESX_Pos (25UL)            /*!< LCDC_DBIB_RESX (Bit 25)                               */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_RESX_Msk (0x2000000UL)     /*!< LCDC_DBIB_RESX (Bitfield-Mask: 0x01)                  */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_DMA_EN_Pos (24UL)          /*!< LCDC_DBIB_DMA_EN (Bit 24)                             */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_DMA_EN_Msk (0x1000000UL)   /*!< LCDC_DBIB_DMA_EN (Bitfield-Mask: 0x01)                */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI3_EN_Pos (23UL)         /*!< LCDC_DBIB_SPI3_EN (Bit 23)                            */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI3_EN_Msk (0x800000UL)   /*!< LCDC_DBIB_SPI3_EN (Bitfield-Mask: 0x01)               */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI4_EN_Pos (22UL)         /*!< LCDC_DBIB_SPI4_EN (Bit 22)                            */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI4_EN_Msk (0x400000UL)   /*!< LCDC_DBIB_SPI4_EN (Bitfield-Mask: 0x01)               */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_CPHA_Pos (20UL)        /*!< LCDC_DBIB_SPI_CPHA (Bit 20)                           */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_CPHA_Msk (0x100000UL)  /*!< LCDC_DBIB_SPI_CPHA (Bitfield-Mask: 0x01)              */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_CPOL_Pos (19UL)        /*!< LCDC_DBIB_SPI_CPOL (Bit 19)                           */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_CPOL_Msk (0x80000UL)   /*!< LCDC_DBIB_SPI_CPOL (Bitfield-Mask: 0x01)              */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_JDI_Pos (18UL)         /*!< LCDC_DBIB_SPI_JDI (Bit 18)                            */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_JDI_Msk (0x40000UL)    /*!< LCDC_DBIB_SPI_JDI (Bitfield-Mask: 0x01)               */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_HOLD_Pos (17UL)        /*!< LCDC_DBIB_SPI_HOLD (Bit 17)                           */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_HOLD_Msk (0x20000UL)   /*!< LCDC_DBIB_SPI_HOLD (Bitfield-Mask: 0x01)              */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_INV_ADDR_Pos (16UL)    /*!< LCDC_DBIB_SPI_INV_ADDR (Bit 16)                       */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_SPI_INV_ADDR_Msk (0x10000UL) /*!< LCDC_DBIB_SPI_INV_ADDR (Bitfield-Mask: 0x01)        */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_INV_DATA_Pos (15UL)        /*!< LCDC_DBIB_INV_DATA (Bit 15)                           */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_INV_DATA_Msk (0x8000UL)    /*!< LCDC_DBIB_INV_DATA (Bitfield-Mask: 0x01)              */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_JDI_INV_PIX_Pos (14UL)     /*!< LCDC_DBIB_JDI_INV_PIX (Bit 14)                        */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_JDI_INV_PIX_Msk (0x4000UL) /*!< LCDC_DBIB_JDI_INV_PIX (Bitfield-Mask: 0x01)           */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_JDI_SOFT_RST_Pos (13UL)    /*!< LCDC_DBIB_JDI_SOFT_RST (Bit 13)                       */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_JDI_SOFT_RST_Msk (0x2000UL) /*!< LCDC_DBIB_JDI_SOFT_RST (Bitfield-Mask: 0x01)         */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_FMT_Pos (0UL)              /*!< LCDC_DBIB_FMT (Bit 0)                                 */\n#define LCDC_LCDC_DBIB_CFG_REG_LCDC_DBIB_FMT_Msk (0x1fUL)           /*!< LCDC_DBIB_FMT (Bitfield-Mask: 0x1f)                   */\n/* ===================================================  LCDC_DBIB_CMD_REG  =================================================== */\n#define LCDC_LCDC_DBIB_CMD_REG_LCDC_DBIB_CMD_SEND_Pos (30UL)        /*!< LCDC_DBIB_CMD_SEND (Bit 30)                           */\n#define LCDC_LCDC_DBIB_CMD_REG_LCDC_DBIB_CMD_SEND_Msk (0x40000000UL) /*!< LCDC_DBIB_CMD_SEND (Bitfield-Mask: 0x01)             */\n#define LCDC_LCDC_DBIB_CMD_REG_LCDC_DBIB_CMD_STORE_Pos (27UL)       /*!< LCDC_DBIB_CMD_STORE (Bit 27)                          */\n#define LCDC_LCDC_DBIB_CMD_REG_LCDC_DBIB_CMD_STORE_Msk (0x8000000UL) /*!< LCDC_DBIB_CMD_STORE (Bitfield-Mask: 0x01)            */\n#define LCDC_LCDC_DBIB_CMD_REG_LCDC_DBIB_CMD_VAL_Pos (0UL)          /*!< LCDC_DBIB_CMD_VAL (Bit 0)                             */\n#define LCDC_LCDC_DBIB_CMD_REG_LCDC_DBIB_CMD_VAL_Msk (0xffffUL)     /*!< LCDC_DBIB_CMD_VAL (Bitfield-Mask: 0xffff)             */\n/* =================================================  LCDC_FRONTPORCHXY_REG  ================================================= */\n#define LCDC_LCDC_FRONTPORCHXY_REG_LCDC_FPORCH_X_Pos (16UL)         /*!< LCDC_FPORCH_X (Bit 16)                                */\n#define LCDC_LCDC_FRONTPORCHXY_REG_LCDC_FPORCH_X_Msk (0xffff0000UL) /*!< LCDC_FPORCH_X (Bitfield-Mask: 0xffff)                 */\n#define LCDC_LCDC_FRONTPORCHXY_REG_LCDC_FPORCH_Y_Pos (0UL)          /*!< LCDC_FPORCH_Y (Bit 0)                                 */\n#define LCDC_LCDC_FRONTPORCHXY_REG_LCDC_FPORCH_Y_Msk (0xffffUL)     /*!< LCDC_FPORCH_Y (Bitfield-Mask: 0xffff)                 */\n/* =====================================================  LCDC_GPIO_REG  ===================================================== */\n#define LCDC_LCDC_GPIO_REG_LCDC_TE_INV_Pos (1UL)                    /*!< LCDC_TE_INV (Bit 1)                                   */\n#define LCDC_LCDC_GPIO_REG_LCDC_TE_INV_Msk (0x2UL)                  /*!< LCDC_TE_INV (Bitfield-Mask: 0x01)                     */\n#define LCDC_LCDC_GPIO_REG_LCDC_PARIF_SEL_Pos (0UL)                 /*!< LCDC_PARIF_SEL (Bit 0)                                */\n#define LCDC_LCDC_GPIO_REG_LCDC_PARIF_SEL_Msk (0x1UL)               /*!< LCDC_PARIF_SEL (Bitfield-Mask: 0x01)                  */\n/* ====================================================  LCDC_IDREG_REG  ===================================================== */\n#define LCDC_LCDC_IDREG_REG_LCDC_ID_Pos   (0UL)                     /*!< LCDC_ID (Bit 0)                                       */\n#define LCDC_LCDC_IDREG_REG_LCDC_ID_Msk   (0xffffffffUL)            /*!< LCDC_ID (Bitfield-Mask: 0xffffffff)                   */\n/* ==================================================  LCDC_INTERRUPT_REG  =================================================== */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_IRQ_TRIGGER_SEL_Pos (31UL)     /*!< LCDC_IRQ_TRIGGER_SEL (Bit 31)                         */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_IRQ_TRIGGER_SEL_Msk (0x80000000UL) /*!< LCDC_IRQ_TRIGGER_SEL (Bitfield-Mask: 0x01)        */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_FRAME_END_IRQ_EN_Pos (5UL)     /*!< LCDC_FRAME_END_IRQ_EN (Bit 5)                         */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_FRAME_END_IRQ_EN_Msk (0x20UL)  /*!< LCDC_FRAME_END_IRQ_EN (Bitfield-Mask: 0x01)           */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_TE_IRQ_EN_Pos (3UL)            /*!< LCDC_TE_IRQ_EN (Bit 3)                                */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_TE_IRQ_EN_Msk (0x8UL)          /*!< LCDC_TE_IRQ_EN (Bitfield-Mask: 0x01)                  */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_HSYNC_IRQ_EN_Pos (1UL)         /*!< LCDC_HSYNC_IRQ_EN (Bit 1)                             */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_HSYNC_IRQ_EN_Msk (0x2UL)       /*!< LCDC_HSYNC_IRQ_EN (Bitfield-Mask: 0x01)               */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_VSYNC_IRQ_EN_Pos (0UL)         /*!< LCDC_VSYNC_IRQ_EN (Bit 0)                             */\n#define LCDC_LCDC_INTERRUPT_REG_LCDC_VSYNC_IRQ_EN_Msk (0x1UL)       /*!< LCDC_VSYNC_IRQ_EN (Bitfield-Mask: 0x01)               */\n/* ==============================================  LCDC_JDI_ENB_END_HLINE_REG  =============================================== */\n#define LCDC_LCDC_JDI_ENB_END_HLINE_REG_LCDC_JDI_ENB_END_HLINE_Pos (0UL) /*!< LCDC_JDI_ENB_END_HLINE (Bit 0)                   */\n#define LCDC_LCDC_JDI_ENB_END_HLINE_REG_LCDC_JDI_ENB_END_HLINE_Msk (0xffffffffUL) /*!< LCDC_JDI_ENB_END_HLINE (Bitfield-Mask: 0xffffffff) */\n/* ==============================================  LCDC_JDI_ENB_START_CLK_REG  =============================================== */\n#define LCDC_LCDC_JDI_ENB_START_CLK_REG_LCDC_JDI_ENB_START_CLK_Pos (0UL) /*!< LCDC_JDI_ENB_START_CLK (Bit 0)                   */\n#define LCDC_LCDC_JDI_ENB_START_CLK_REG_LCDC_JDI_ENB_START_CLK_Msk (0xffffffffUL) /*!< LCDC_JDI_ENB_START_CLK (Bitfield-Mask: 0xffffffff) */\n/* =============================================  LCDC_JDI_ENB_START_HLINE_REG  ============================================== */\n#define LCDC_LCDC_JDI_ENB_START_HLINE_REG_LCDC_JDI_ENB_START_HLINE_Pos (0UL) /*!< LCDC_JDI_ENB_START_HLINE (Bit 0)             */\n#define LCDC_LCDC_JDI_ENB_START_HLINE_REG_LCDC_JDI_ENB_START_HLINE_Msk (0xffffffffUL) /*!< LCDC_JDI_ENB_START_HLINE (Bitfield-Mask: 0xffffffff) */\n/* ==============================================  LCDC_JDI_ENB_WIDTH_CLK_REG  =============================================== */\n#define LCDC_LCDC_JDI_ENB_WIDTH_CLK_REG_LCDC_JDI_ENB_WIDTH_CLK_Pos (0UL) /*!< LCDC_JDI_ENB_WIDTH_CLK (Bit 0)                   */\n#define LCDC_LCDC_JDI_ENB_WIDTH_CLK_REG_LCDC_JDI_ENB_WIDTH_CLK_Msk (0xffffffffUL) /*!< LCDC_JDI_ENB_WIDTH_CLK (Bitfield-Mask: 0xffffffff) */\n/* ===============================================  LCDC_JDI_FBX_BLANKING_REG  =============================================== */\n#define LCDC_LCDC_JDI_FBX_BLANKING_REG_LCDC_JDI_FXBLANKING_Pos (16UL) /*!< LCDC_JDI_FXBLANKING (Bit 16)                        */\n#define LCDC_LCDC_JDI_FBX_BLANKING_REG_LCDC_JDI_FXBLANKING_Msk (0xffff0000UL) /*!< LCDC_JDI_FXBLANKING (Bitfield-Mask: 0xffff) */\n#define LCDC_LCDC_JDI_FBX_BLANKING_REG_LCDC_JDI_BXBLANKING_Pos (0UL) /*!< LCDC_JDI_BXBLANKING (Bit 0)                          */\n#define LCDC_LCDC_JDI_FBX_BLANKING_REG_LCDC_JDI_BXBLANKING_Msk (0xffffUL) /*!< LCDC_JDI_BXBLANKING (Bitfield-Mask: 0xffff)     */\n/* ===============================================  LCDC_JDI_FBY_BLANKING_REG  =============================================== */\n#define LCDC_LCDC_JDI_FBY_BLANKING_REG_LCDC_JDI_FYBLANKING_Pos (16UL) /*!< LCDC_JDI_FYBLANKING (Bit 16)                        */\n#define LCDC_LCDC_JDI_FBY_BLANKING_REG_LCDC_JDI_FYBLANKING_Msk (0xffff0000UL) /*!< LCDC_JDI_FYBLANKING (Bitfield-Mask: 0xffff) */\n#define LCDC_LCDC_JDI_FBY_BLANKING_REG_LCDC_JDI_BYBLANKING_Pos (0UL) /*!< LCDC_JDI_BYBLANKING (Bit 0)                          */\n#define LCDC_LCDC_JDI_FBY_BLANKING_REG_LCDC_JDI_BYBLANKING_Msk (0xffffUL) /*!< LCDC_JDI_BYBLANKING (Bitfield-Mask: 0xffff)     */\n/* ================================================  LCDC_JDI_HCK_WIDTH_REG  ================================================= */\n#define LCDC_LCDC_JDI_HCK_WIDTH_REG_LCDC_JDI_HCK_WIDTH_Pos (0UL)    /*!< LCDC_JDI_HCK_WIDTH (Bit 0)                            */\n#define LCDC_LCDC_JDI_HCK_WIDTH_REG_LCDC_JDI_HCK_WIDTH_Msk (0xffffffffUL) /*!< LCDC_JDI_HCK_WIDTH (Bitfield-Mask: 0xffffffff)  */\n/* ================================================  LCDC_JDI_HST_DELAY_REG  ================================================= */\n#define LCDC_LCDC_JDI_HST_DELAY_REG_LCDC_JDI_HST_DELAY_Pos (0UL)    /*!< LCDC_JDI_HST_DELAY (Bit 0)                            */\n#define LCDC_LCDC_JDI_HST_DELAY_REG_LCDC_JDI_HST_DELAY_Msk (0xffffffffUL) /*!< LCDC_JDI_HST_DELAY (Bitfield-Mask: 0xffffffff)  */\n/* ================================================  LCDC_JDI_HST_WIDTH_REG  ================================================= */\n#define LCDC_LCDC_JDI_HST_WIDTH_REG_LCDC_JDI_HST_WIDTH_Pos (0UL)    /*!< LCDC_JDI_HST_WIDTH (Bit 0)                            */\n#define LCDC_LCDC_JDI_HST_WIDTH_REG_LCDC_JDI_HST_WIDTH_Msk (0xffffffffUL) /*!< LCDC_JDI_HST_WIDTH (Bitfield-Mask: 0xffffffff)  */\n/* ==================================================  LCDC_JDI_RESXY_REG  =================================================== */\n#define LCDC_LCDC_JDI_RESXY_REG_LCDC_JDI_RES_X_Pos (16UL)           /*!< LCDC_JDI_RES_X (Bit 16)                               */\n#define LCDC_LCDC_JDI_RESXY_REG_LCDC_JDI_RES_X_Msk (0xffff0000UL)   /*!< LCDC_JDI_RES_X (Bitfield-Mask: 0xffff)                */\n#define LCDC_LCDC_JDI_RESXY_REG_LCDC_JDI_RES_Y_Pos (0UL)            /*!< LCDC_JDI_RES_Y (Bit 0)                                */\n#define LCDC_LCDC_JDI_RESXY_REG_LCDC_JDI_RES_Y_Msk (0xffffUL)       /*!< LCDC_JDI_RES_Y (Bitfield-Mask: 0xffff)                */\n/* ================================================  LCDC_JDI_VCK_DELAY_REG  ================================================= */\n#define LCDC_LCDC_JDI_VCK_DELAY_REG_LCDC_JDI_VCK_DELAY_Pos (0UL)    /*!< LCDC_JDI_VCK_DELAY (Bit 0)                            */\n#define LCDC_LCDC_JDI_VCK_DELAY_REG_LCDC_JDI_VCK_DELAY_Msk (0xffffffffUL) /*!< LCDC_JDI_VCK_DELAY (Bitfield-Mask: 0xffffffff)  */\n/* ================================================  LCDC_JDI_VST_DELAY_REG  ================================================= */\n#define LCDC_LCDC_JDI_VST_DELAY_REG_LCDC_JDI_VST_DELAY_Pos (0UL)    /*!< LCDC_JDI_VST_DELAY (Bit 0)                            */\n#define LCDC_LCDC_JDI_VST_DELAY_REG_LCDC_JDI_VST_DELAY_Msk (0xffffffffUL) /*!< LCDC_JDI_VST_DELAY (Bitfield-Mask: 0xffffffff)  */\n/* ================================================  LCDC_JDI_VST_WIDTH_REG  ================================================= */\n#define LCDC_LCDC_JDI_VST_WIDTH_REG_LCDC_JDI_VST_WIDTH_Pos (0UL)    /*!< LCDC_JDI_VST_WIDTH (Bit 0)                            */\n#define LCDC_LCDC_JDI_VST_WIDTH_REG_LCDC_JDI_VST_WIDTH_Msk (0xffffffffUL) /*!< LCDC_JDI_VST_WIDTH (Bitfield-Mask: 0xffffffff)  */\n/* ================================================  LCDC_JDI_XRST_WIDTH_REG  ================================================ */\n#define LCDC_LCDC_JDI_XRST_WIDTH_REG_LCDC_JDI_XRST_WIDTH_Pos (0UL)  /*!< LCDC_JDI_XRST_WIDTH (Bit 0)                           */\n#define LCDC_LCDC_JDI_XRST_WIDTH_REG_LCDC_JDI_XRST_WIDTH_Msk (0xffffffffUL) /*!< LCDC_JDI_XRST_WIDTH (Bitfield-Mask: 0xffffffff) */\n/* ===============================================  LCDC_LAYER0_BASEADDR_REG  ================================================ */\n#define LCDC_LCDC_LAYER0_BASEADDR_REG_LCDC_L0_FB_ADDR_Pos (0UL)     /*!< LCDC_L0_FB_ADDR (Bit 0)                               */\n#define LCDC_LCDC_LAYER0_BASEADDR_REG_LCDC_L0_FB_ADDR_Msk (0xffffffffUL) /*!< LCDC_L0_FB_ADDR (Bitfield-Mask: 0xffffffff)      */\n/* =================================================  LCDC_LAYER0_MODE_REG  ================================================== */\n#define LCDC_LCDC_LAYER0_MODE_REG_LCDC_L0_EN_Pos (31UL)             /*!< LCDC_L0_EN (Bit 31)                                   */\n#define LCDC_LCDC_LAYER0_MODE_REG_LCDC_L0_EN_Msk (0x80000000UL)     /*!< LCDC_L0_EN (Bitfield-Mask: 0x01)                      */\n#define LCDC_LCDC_LAYER0_MODE_REG_LCDC_L0_COLOUR_MODE_Pos (0UL)     /*!< LCDC_L0_COLOUR_MODE (Bit 0)                           */\n#define LCDC_LCDC_LAYER0_MODE_REG_LCDC_L0_COLOUR_MODE_Msk (0x1fUL)  /*!< LCDC_L0_COLOUR_MODE (Bitfield-Mask: 0x1f)             */\n/* ================================================  LCDC_LAYER0_OFFSETX_REG  ================================================ */\n#define LCDC_LCDC_LAYER0_OFFSETX_REG_LCDC_L0_DMA_PREFETCH_Pos (16UL) /*!< LCDC_L0_DMA_PREFETCH (Bit 16)                        */\n#define LCDC_LCDC_LAYER0_OFFSETX_REG_LCDC_L0_DMA_PREFETCH_Msk (0xffff0000UL) /*!< LCDC_L0_DMA_PREFETCH (Bitfield-Mask: 0xffff) */\n#define LCDC_LCDC_LAYER0_OFFSETX_REG_LCDC_L0_OFFSETX_Pos (0UL)      /*!< LCDC_L0_OFFSETX (Bit 0)                               */\n#define LCDC_LCDC_LAYER0_OFFSETX_REG_LCDC_L0_OFFSETX_Msk (0xffffUL) /*!< LCDC_L0_OFFSETX (Bitfield-Mask: 0xffff)               */\n/* =================================================  LCDC_LAYER0_RESXY_REG  ================================================= */\n#define LCDC_LCDC_LAYER0_RESXY_REG_LCDC_L0_RES_X_Pos (16UL)         /*!< LCDC_L0_RES_X (Bit 16)                                */\n#define LCDC_LCDC_LAYER0_RESXY_REG_LCDC_L0_RES_X_Msk (0xffff0000UL) /*!< LCDC_L0_RES_X (Bitfield-Mask: 0xffff)                 */\n#define LCDC_LCDC_LAYER0_RESXY_REG_LCDC_L0_RES_Y_Pos (0UL)          /*!< LCDC_L0_RES_Y (Bit 0)                                 */\n#define LCDC_LCDC_LAYER0_RESXY_REG_LCDC_L0_RES_Y_Msk (0xffffUL)     /*!< LCDC_L0_RES_Y (Bitfield-Mask: 0xffff)                 */\n/* ================================================  LCDC_LAYER0_SIZEXY_REG  ================================================= */\n#define LCDC_LCDC_LAYER0_SIZEXY_REG_LCDC_L0_SIZE_X_Pos (16UL)       /*!< LCDC_L0_SIZE_X (Bit 16)                               */\n#define LCDC_LCDC_LAYER0_SIZEXY_REG_LCDC_L0_SIZE_X_Msk (0xffff0000UL) /*!< LCDC_L0_SIZE_X (Bitfield-Mask: 0xffff)              */\n#define LCDC_LCDC_LAYER0_SIZEXY_REG_LCDC_L0_SIZE_Y_Pos (0UL)        /*!< LCDC_L0_SIZE_Y (Bit 0)                                */\n#define LCDC_LCDC_LAYER0_SIZEXY_REG_LCDC_L0_SIZE_Y_Msk (0xffffUL)   /*!< LCDC_L0_SIZE_Y (Bitfield-Mask: 0xffff)                */\n/* ================================================  LCDC_LAYER0_STARTXY_REG  ================================================ */\n#define LCDC_LCDC_LAYER0_STARTXY_REG_LCDC_L0_START_X_Pos (16UL)     /*!< LCDC_L0_START_X (Bit 16)                              */\n#define LCDC_LCDC_LAYER0_STARTXY_REG_LCDC_L0_START_X_Msk (0xffff0000UL) /*!< LCDC_L0_START_X (Bitfield-Mask: 0xffff)           */\n#define LCDC_LCDC_LAYER0_STARTXY_REG_LCDC_L0_START_Y_Pos (0UL)      /*!< LCDC_L0_START_Y (Bit 0)                               */\n#define LCDC_LCDC_LAYER0_STARTXY_REG_LCDC_L0_START_Y_Msk (0xffffUL) /*!< LCDC_L0_START_Y (Bitfield-Mask: 0xffff)               */\n/* ================================================  LCDC_LAYER0_STRIDE_REG  ================================================= */\n#define LCDC_LCDC_LAYER0_STRIDE_REG_LCDC_L0_FIFO_THR_Pos (19UL)     /*!< LCDC_L0_FIFO_THR (Bit 19)                             */\n#define LCDC_LCDC_LAYER0_STRIDE_REG_LCDC_L0_FIFO_THR_Msk (0x180000UL) /*!< LCDC_L0_FIFO_THR (Bitfield-Mask: 0x03)              */\n#define LCDC_LCDC_LAYER0_STRIDE_REG_LCDC_L0_BURST_LEN_Pos (16UL)    /*!< LCDC_L0_BURST_LEN (Bit 16)                            */\n#define LCDC_LCDC_LAYER0_STRIDE_REG_LCDC_L0_BURST_LEN_Msk (0x70000UL) /*!< LCDC_L0_BURST_LEN (Bitfield-Mask: 0x07)             */\n#define LCDC_LCDC_LAYER0_STRIDE_REG_LCDC_L0_STRIDE_Pos (0UL)        /*!< LCDC_L0_STRIDE (Bit 0)                                */\n#define LCDC_LCDC_LAYER0_STRIDE_REG_LCDC_L0_STRIDE_Msk (0xffffUL)   /*!< LCDC_L0_STRIDE (Bitfield-Mask: 0xffff)                */\n/* =====================================================  LCDC_MODE_REG  ===================================================== */\n#define LCDC_LCDC_MODE_REG_LCDC_MODE_EN_Pos (31UL)                  /*!< LCDC_MODE_EN (Bit 31)                                 */\n#define LCDC_LCDC_MODE_REG_LCDC_MODE_EN_Msk (0x80000000UL)          /*!< LCDC_MODE_EN (Bitfield-Mask: 0x01)                    */\n#define LCDC_LCDC_MODE_REG_LCDC_VSYNC_POL_Pos (28UL)                /*!< LCDC_VSYNC_POL (Bit 28)                               */\n#define LCDC_LCDC_MODE_REG_LCDC_VSYNC_POL_Msk (0x10000000UL)        /*!< LCDC_VSYNC_POL (Bitfield-Mask: 0x01)                  */\n#define LCDC_LCDC_MODE_REG_LCDC_HSYNC_POL_Pos (27UL)                /*!< LCDC_HSYNC_POL (Bit 27)                               */\n#define LCDC_LCDC_MODE_REG_LCDC_HSYNC_POL_Msk (0x8000000UL)         /*!< LCDC_HSYNC_POL (Bitfield-Mask: 0x01)                  */\n#define LCDC_LCDC_MODE_REG_LCDC_DE_POL_Pos (26UL)                   /*!< LCDC_DE_POL (Bit 26)                                  */\n#define LCDC_LCDC_MODE_REG_LCDC_DE_POL_Msk (0x4000000UL)            /*!< LCDC_DE_POL (Bitfield-Mask: 0x01)                     */\n#define LCDC_LCDC_MODE_REG_LCDC_VSYNC_SCPL_Pos (23UL)               /*!< LCDC_VSYNC_SCPL (Bit 23)                              */\n#define LCDC_LCDC_MODE_REG_LCDC_VSYNC_SCPL_Msk (0x800000UL)         /*!< LCDC_VSYNC_SCPL (Bitfield-Mask: 0x01)                 */\n#define LCDC_LCDC_MODE_REG_LCDC_PIXCLKOUT_POL_Pos (22UL)            /*!< LCDC_PIXCLKOUT_POL (Bit 22)                           */\n#define LCDC_LCDC_MODE_REG_LCDC_PIXCLKOUT_POL_Msk (0x400000UL)      /*!< LCDC_PIXCLKOUT_POL (Bitfield-Mask: 0x01)              */\n#define LCDC_LCDC_MODE_REG_LCDC_FORCE_BLANK_Pos (19UL)              /*!< LCDC_FORCE_BLANK (Bit 19)                             */\n#define LCDC_LCDC_MODE_REG_LCDC_FORCE_BLANK_Msk (0x80000UL)         /*!< LCDC_FORCE_BLANK (Bitfield-Mask: 0x01)                */\n#define LCDC_LCDC_MODE_REG_LCDC_SFRAME_UPD_Pos (17UL)               /*!< LCDC_SFRAME_UPD (Bit 17)                              */\n#define LCDC_LCDC_MODE_REG_LCDC_SFRAME_UPD_Msk (0x20000UL)          /*!< LCDC_SFRAME_UPD (Bitfield-Mask: 0x01)                 */\n#define LCDC_LCDC_MODE_REG_LCDC_PIXCLKOUT_SEL_Pos (11UL)            /*!< LCDC_PIXCLKOUT_SEL (Bit 11)                           */\n#define LCDC_LCDC_MODE_REG_LCDC_PIXCLKOUT_SEL_Msk (0x800UL)         /*!< LCDC_PIXCLKOUT_SEL (Bitfield-Mask: 0x01)              */\n#define LCDC_LCDC_MODE_REG_LCDC_OUT_MODE_Pos (5UL)                  /*!< LCDC_OUT_MODE (Bit 5)                                 */\n#define LCDC_LCDC_MODE_REG_LCDC_OUT_MODE_Msk (0x1e0UL)              /*!< LCDC_OUT_MODE (Bitfield-Mask: 0x0f)                   */\n#define LCDC_LCDC_MODE_REG_LCDC_MIPI_OFF_Pos (4UL)                  /*!< LCDC_MIPI_OFF (Bit 4)                                 */\n#define LCDC_LCDC_MODE_REG_LCDC_MIPI_OFF_Msk (0x10UL)               /*!< LCDC_MIPI_OFF (Bitfield-Mask: 0x01)                   */\n#define LCDC_LCDC_MODE_REG_LCDC_FORM_OFF_Pos (3UL)                  /*!< LCDC_FORM_OFF (Bit 3)                                 */\n#define LCDC_LCDC_MODE_REG_LCDC_FORM_OFF_Msk (0x8UL)                /*!< LCDC_FORM_OFF (Bitfield-Mask: 0x01)                   */\n#define LCDC_LCDC_MODE_REG_LCDC_DSCAN_Pos (1UL)                     /*!< LCDC_DSCAN (Bit 1)                                    */\n#define LCDC_LCDC_MODE_REG_LCDC_DSCAN_Msk (0x2UL)                   /*!< LCDC_DSCAN (Bitfield-Mask: 0x01)                      */\n#define LCDC_LCDC_MODE_REG_LCDC_TMODE_Pos (0UL)                     /*!< LCDC_TMODE (Bit 0)                                    */\n#define LCDC_LCDC_MODE_REG_LCDC_TMODE_Msk (0x1UL)                   /*!< LCDC_TMODE (Bitfield-Mask: 0x01)                      */\n/* ====================================================  LCDC_RESXY_REG  ===================================================== */\n#define LCDC_LCDC_RESXY_REG_LCDC_RES_X_Pos (16UL)                   /*!< LCDC_RES_X (Bit 16)                                   */\n#define LCDC_LCDC_RESXY_REG_LCDC_RES_X_Msk (0xffff0000UL)           /*!< LCDC_RES_X (Bitfield-Mask: 0xffff)                    */\n#define LCDC_LCDC_RESXY_REG_LCDC_RES_Y_Pos (0UL)                    /*!< LCDC_RES_Y (Bit 0)                                    */\n#define LCDC_LCDC_RESXY_REG_LCDC_RES_Y_Msk (0xffffUL)               /*!< LCDC_RES_Y (Bitfield-Mask: 0xffff)                    */\n/* ====================================================  LCDC_STATUS_REG  ==================================================== */\n#define LCDC_LCDC_STATUS_REG_LCDC_JDI_TIM_SW_RST_Pos (15UL)         /*!< LCDC_JDI_TIM_SW_RST (Bit 15)                          */\n#define LCDC_LCDC_STATUS_REG_LCDC_JDI_TIM_SW_RST_Msk (0x8000UL)     /*!< LCDC_JDI_TIM_SW_RST (Bitfield-Mask: 0x01)             */\n#define LCDC_LCDC_STATUS_REG_LCDC_FRAME_START_Pos (14UL)            /*!< LCDC_FRAME_START (Bit 14)                             */\n#define LCDC_LCDC_STATUS_REG_LCDC_FRAME_START_Msk (0x4000UL)        /*!< LCDC_FRAME_START (Bitfield-Mask: 0x01)                */\n#define LCDC_LCDC_STATUS_REG_LCDC_FRAME_END_Pos (13UL)              /*!< LCDC_FRAME_END (Bit 13)                               */\n#define LCDC_LCDC_STATUS_REG_LCDC_FRAME_END_Msk (0x2000UL)          /*!< LCDC_FRAME_END (Bitfield-Mask: 0x01)                  */\n#define LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_PENDING_Pos (12UL)       /*!< LCDC_DBIB_CMD_PENDING (Bit 12)                        */\n#define LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_PENDING_Msk (0x1000UL)   /*!< LCDC_DBIB_CMD_PENDING (Bitfield-Mask: 0x01)           */\n#define LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_FIFO_FULL_Pos (11UL)     /*!< LCDC_DBIB_CMD_FIFO_FULL (Bit 11)                      */\n#define LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_FIFO_FULL_Msk (0x800UL)  /*!< LCDC_DBIB_CMD_FIFO_FULL (Bitfield-Mask: 0x01)         */\n#define LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_FIFO_EMPTY_N_Pos (10UL)  /*!< LCDC_DBIB_CMD_FIFO_EMPTY_N (Bit 10)                   */\n#define LCDC_LCDC_STATUS_REG_LCDC_DBIB_CMD_FIFO_EMPTY_N_Msk (0x400UL) /*!< LCDC_DBIB_CMD_FIFO_EMPTY_N (Bitfield-Mask: 0x01)    */\n#define LCDC_LCDC_STATUS_REG_LCDC_DBIB_TE_Pos (8UL)                 /*!< LCDC_DBIB_TE (Bit 8)                                  */\n#define LCDC_LCDC_STATUS_REG_LCDC_DBIB_TE_Msk (0x100UL)             /*!< LCDC_DBIB_TE (Bitfield-Mask: 0x01)                    */\n#define LCDC_LCDC_STATUS_REG_LCDC_STICKY_UNDERFLOW_Pos (7UL)        /*!< LCDC_STICKY_UNDERFLOW (Bit 7)                         */\n#define LCDC_LCDC_STATUS_REG_LCDC_STICKY_UNDERFLOW_Msk (0x80UL)     /*!< LCDC_STICKY_UNDERFLOW (Bitfield-Mask: 0x01)           */\n#define LCDC_LCDC_STATUS_REG_LCDC_UNDERFLOW_Pos (6UL)               /*!< LCDC_UNDERFLOW (Bit 6)                                */\n#define LCDC_LCDC_STATUS_REG_LCDC_UNDERFLOW_Msk (0x40UL)            /*!< LCDC_UNDERFLOW (Bitfield-Mask: 0x01)                  */\n#define LCDC_LCDC_STATUS_REG_LCDC_LAST_ROW_Pos (5UL)                /*!< LCDC_LAST_ROW (Bit 5)                                 */\n#define LCDC_LCDC_STATUS_REG_LCDC_LAST_ROW_Msk (0x20UL)             /*!< LCDC_LAST_ROW (Bitfield-Mask: 0x01)                   */\n#define LCDC_LCDC_STATUS_REG_LCDC_STAT_CSYNC_Pos (4UL)              /*!< LCDC_STAT_CSYNC (Bit 4)                               */\n#define LCDC_LCDC_STATUS_REG_LCDC_STAT_CSYNC_Msk (0x10UL)           /*!< LCDC_STAT_CSYNC (Bitfield-Mask: 0x01)                 */\n#define LCDC_LCDC_STATUS_REG_LCDC_STAT_VSYNC_Pos (3UL)              /*!< LCDC_STAT_VSYNC (Bit 3)                               */\n#define LCDC_LCDC_STATUS_REG_LCDC_STAT_VSYNC_Msk (0x8UL)            /*!< LCDC_STAT_VSYNC (Bitfield-Mask: 0x01)                 */\n#define LCDC_LCDC_STATUS_REG_LCDC_STAT_HSYNC_Pos (2UL)              /*!< LCDC_STAT_HSYNC (Bit 2)                               */\n#define LCDC_LCDC_STATUS_REG_LCDC_STAT_HSYNC_Msk (0x4UL)            /*!< LCDC_STAT_HSYNC (Bitfield-Mask: 0x01)                 */\n#define LCDC_LCDC_STATUS_REG_LCDC_FRAMEGEN_BUSY_Pos (1UL)           /*!< LCDC_FRAMEGEN_BUSY (Bit 1)                            */\n#define LCDC_LCDC_STATUS_REG_LCDC_FRAMEGEN_BUSY_Msk (0x2UL)         /*!< LCDC_FRAMEGEN_BUSY (Bitfield-Mask: 0x01)              */\n#define LCDC_LCDC_STATUS_REG_LCDC_STAT_ACTIVE_Pos (0UL)             /*!< LCDC_STAT_ACTIVE (Bit 0)                              */\n#define LCDC_LCDC_STATUS_REG_LCDC_STAT_ACTIVE_Msk (0x1UL)           /*!< LCDC_STAT_ACTIVE (Bitfield-Mask: 0x01)                */\n\n\n/* =========================================================================================================================== */\n/* ================                                            LRA                                            ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  LRA_ADC_CTRL1_REG  =================================================== */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_BUSY_Pos (31UL)               /*!< LRA_ADC_BUSY (Bit 31)                                 */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_BUSY_Msk (0x80000000UL)       /*!< LRA_ADC_BUSY (Bitfield-Mask: 0x01)                    */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_OFFSET_Pos (9UL)              /*!< LRA_ADC_OFFSET (Bit 9)                                */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_OFFSET_Msk (0x1fe00UL)        /*!< LRA_ADC_OFFSET (Bitfield-Mask: 0xff)                  */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_TEST_PARAM_Pos (8UL)          /*!< LRA_ADC_TEST_PARAM (Bit 8)                            */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_TEST_PARAM_Msk (0x100UL)      /*!< LRA_ADC_TEST_PARAM (Bitfield-Mask: 0x01)              */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_TEST_IN_SEL_Pos (7UL)         /*!< LRA_ADC_TEST_IN_SEL (Bit 7)                           */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_TEST_IN_SEL_Msk (0x80UL)      /*!< LRA_ADC_TEST_IN_SEL (Bitfield-Mask: 0x01)             */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_FREQ_Pos (3UL)                /*!< LRA_ADC_FREQ (Bit 3)                                  */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_FREQ_Msk (0x78UL)             /*!< LRA_ADC_FREQ (Bitfield-Mask: 0x0f)                    */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_SIGN_Pos (2UL)                /*!< LRA_ADC_SIGN (Bit 2)                                  */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_SIGN_Msk (0x4UL)              /*!< LRA_ADC_SIGN (Bitfield-Mask: 0x01)                    */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_MUTE_Pos (1UL)                /*!< LRA_ADC_MUTE (Bit 1)                                  */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_MUTE_Msk (0x2UL)              /*!< LRA_ADC_MUTE (Bitfield-Mask: 0x01)                    */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_START_Pos (0UL)               /*!< LRA_ADC_START (Bit 0)                                 */\n#define LRA_LRA_ADC_CTRL1_REG_LRA_ADC_START_Msk (0x1UL)             /*!< LRA_ADC_START (Bitfield-Mask: 0x01)                   */\n/* ==================================================  LRA_ADC_RESULT_REG  =================================================== */\n#define LRA_LRA_ADC_RESULT_REG_MAN_FLT_IN_Pos (16UL)                /*!< MAN_FLT_IN (Bit 16)                                   */\n#define LRA_LRA_ADC_RESULT_REG_MAN_FLT_IN_Msk (0xffff0000UL)        /*!< MAN_FLT_IN (Bitfield-Mask: 0xffff)                    */\n#define LRA_LRA_ADC_RESULT_REG_GP_ADC_VAL_Pos (0UL)                 /*!< GP_ADC_VAL (Bit 0)                                    */\n#define LRA_LRA_ADC_RESULT_REG_GP_ADC_VAL_Msk (0xffffUL)            /*!< GP_ADC_VAL (Bitfield-Mask: 0xffff)                    */\n/* ====================================================  LRA_BRD_HS_REG  ===================================================== */\n#define LRA_LRA_BRD_HS_REG_TRIM_GAIN_Pos  (11UL)                    /*!< TRIM_GAIN (Bit 11)                                    */\n#define LRA_LRA_BRD_HS_REG_TRIM_GAIN_Msk  (0x7800UL)                /*!< TRIM_GAIN (Bitfield-Mask: 0x0f)                       */\n#define LRA_LRA_BRD_HS_REG_HSGND_TRIM_Pos (8UL)                     /*!< HSGND_TRIM (Bit 8)                                    */\n#define LRA_LRA_BRD_HS_REG_HSGND_TRIM_Msk (0x700UL)                 /*!< HSGND_TRIM (Bitfield-Mask: 0x07)                      */\n#define LRA_LRA_BRD_HS_REG_SCP_HS_TRIM_Pos (4UL)                    /*!< SCP_HS_TRIM (Bit 4)                                   */\n#define LRA_LRA_BRD_HS_REG_SCP_HS_TRIM_Msk (0xf0UL)                 /*!< SCP_HS_TRIM (Bitfield-Mask: 0x0f)                     */\n#define LRA_LRA_BRD_HS_REG_SCP_HS_EN_Pos  (3UL)                     /*!< SCP_HS_EN (Bit 3)                                     */\n#define LRA_LRA_BRD_HS_REG_SCP_HS_EN_Msk  (0x8UL)                   /*!< SCP_HS_EN (Bitfield-Mask: 0x01)                       */\n#define LRA_LRA_BRD_HS_REG_ERC_HS_TRIM_Pos (1UL)                    /*!< ERC_HS_TRIM (Bit 1)                                   */\n#define LRA_LRA_BRD_HS_REG_ERC_HS_TRIM_Msk (0x6UL)                  /*!< ERC_HS_TRIM (Bitfield-Mask: 0x03)                     */\n#define LRA_LRA_BRD_HS_REG_ERC_HS_EN_Pos  (0UL)                     /*!< ERC_HS_EN (Bit 0)                                     */\n#define LRA_LRA_BRD_HS_REG_ERC_HS_EN_Msk  (0x1UL)                   /*!< ERC_HS_EN (Bitfield-Mask: 0x01)                       */\n/* ====================================================  LRA_BRD_LS_REG  ===================================================== */\n#define LRA_LRA_BRD_LS_REG_SCP_LS_TRIM_N_Pos (8UL)                  /*!< SCP_LS_TRIM_N (Bit 8)                                 */\n#define LRA_LRA_BRD_LS_REG_SCP_LS_TRIM_N_Msk (0xf00UL)              /*!< SCP_LS_TRIM_N (Bitfield-Mask: 0x0f)                   */\n#define LRA_LRA_BRD_LS_REG_SCP_LS_TRIM_P_Pos (4UL)                  /*!< SCP_LS_TRIM_P (Bit 4)                                 */\n#define LRA_LRA_BRD_LS_REG_SCP_LS_TRIM_P_Msk (0xf0UL)               /*!< SCP_LS_TRIM_P (Bitfield-Mask: 0x0f)                   */\n#define LRA_LRA_BRD_LS_REG_SCP_LS_EN_Pos  (3UL)                     /*!< SCP_LS_EN (Bit 3)                                     */\n#define LRA_LRA_BRD_LS_REG_SCP_LS_EN_Msk  (0x8UL)                   /*!< SCP_LS_EN (Bitfield-Mask: 0x01)                       */\n#define LRA_LRA_BRD_LS_REG_ERC_LS_TRIM_Pos (1UL)                    /*!< ERC_LS_TRIM (Bit 1)                                   */\n#define LRA_LRA_BRD_LS_REG_ERC_LS_TRIM_Msk (0x6UL)                  /*!< ERC_LS_TRIM (Bitfield-Mask: 0x03)                     */\n#define LRA_LRA_BRD_LS_REG_ERC_LS_EN_Pos  (0UL)                     /*!< ERC_LS_EN (Bit 0)                                     */\n#define LRA_LRA_BRD_LS_REG_ERC_LS_EN_Msk  (0x1UL)                   /*!< ERC_LS_EN (Bitfield-Mask: 0x01)                       */\n/* ===================================================  LRA_BRD_STAT_REG  ==================================================== */\n#define LRA_LRA_BRD_STAT_REG_SCP_HS_OUT_Pos (13UL)                  /*!< SCP_HS_OUT (Bit 13)                                   */\n#define LRA_LRA_BRD_STAT_REG_SCP_HS_OUT_Msk (0x2000UL)              /*!< SCP_HS_OUT (Bitfield-Mask: 0x01)                      */\n#define LRA_LRA_BRD_STAT_REG_SCP_LS_COMP_OUT_N_Pos (12UL)           /*!< SCP_LS_COMP_OUT_N (Bit 12)                            */\n#define LRA_LRA_BRD_STAT_REG_SCP_LS_COMP_OUT_N_Msk (0x1000UL)       /*!< SCP_LS_COMP_OUT_N (Bitfield-Mask: 0x01)               */\n#define LRA_LRA_BRD_STAT_REG_SCP_LS_COMP_OUT_P_Pos (11UL)           /*!< SCP_LS_COMP_OUT_P (Bit 11)                            */\n#define LRA_LRA_BRD_STAT_REG_SCP_LS_COMP_OUT_P_Msk (0x800UL)        /*!< SCP_LS_COMP_OUT_P (Bitfield-Mask: 0x01)               */\n#define LRA_LRA_BRD_STAT_REG_SC_EVENT_LS_Pos (10UL)                 /*!< SC_EVENT_LS (Bit 10)                                  */\n#define LRA_LRA_BRD_STAT_REG_SC_EVENT_LS_Msk (0x400UL)              /*!< SC_EVENT_LS (Bitfield-Mask: 0x01)                     */\n#define LRA_LRA_BRD_STAT_REG_SC_EVENT_HS_Pos (9UL)                  /*!< SC_EVENT_HS (Bit 9)                                   */\n#define LRA_LRA_BRD_STAT_REG_SC_EVENT_HS_Msk (0x200UL)              /*!< SC_EVENT_HS (Bitfield-Mask: 0x01)                     */\n#define LRA_LRA_BRD_STAT_REG_LOOP_STAT_Pos (8UL)                    /*!< LOOP_STAT (Bit 8)                                     */\n#define LRA_LRA_BRD_STAT_REG_LOOP_STAT_Msk (0x100UL)                /*!< LOOP_STAT (Bitfield-Mask: 0x01)                       */\n#define LRA_LRA_BRD_STAT_REG_LSN_ON_Pos   (7UL)                     /*!< LSN_ON (Bit 7)                                        */\n#define LRA_LRA_BRD_STAT_REG_LSN_ON_Msk   (0x80UL)                  /*!< LSN_ON (Bitfield-Mask: 0x01)                          */\n#define LRA_LRA_BRD_STAT_REG_LSP_ON_Pos   (6UL)                     /*!< LSP_ON (Bit 6)                                        */\n#define LRA_LRA_BRD_STAT_REG_LSP_ON_Msk   (0x40UL)                  /*!< LSP_ON (Bitfield-Mask: 0x01)                          */\n#define LRA_LRA_BRD_STAT_REG_HSN_ON_Pos   (5UL)                     /*!< HSN_ON (Bit 5)                                        */\n#define LRA_LRA_BRD_STAT_REG_HSN_ON_Msk   (0x20UL)                  /*!< HSN_ON (Bitfield-Mask: 0x01)                          */\n#define LRA_LRA_BRD_STAT_REG_HSP_ON_Pos   (4UL)                     /*!< HSP_ON (Bit 4)                                        */\n#define LRA_LRA_BRD_STAT_REG_HSP_ON_Msk   (0x10UL)                  /*!< HSP_ON (Bitfield-Mask: 0x01)                          */\n#define LRA_LRA_BRD_STAT_REG_LSN_STAT_Pos (3UL)                     /*!< LSN_STAT (Bit 3)                                      */\n#define LRA_LRA_BRD_STAT_REG_LSN_STAT_Msk (0x8UL)                   /*!< LSN_STAT (Bitfield-Mask: 0x01)                        */\n#define LRA_LRA_BRD_STAT_REG_LSP_STAT_Pos (2UL)                     /*!< LSP_STAT (Bit 2)                                      */\n#define LRA_LRA_BRD_STAT_REG_LSP_STAT_Msk (0x4UL)                   /*!< LSP_STAT (Bitfield-Mask: 0x01)                        */\n#define LRA_LRA_BRD_STAT_REG_HSN_STAT_Pos (1UL)                     /*!< HSN_STAT (Bit 1)                                      */\n#define LRA_LRA_BRD_STAT_REG_HSN_STAT_Msk (0x2UL)                   /*!< HSN_STAT (Bitfield-Mask: 0x01)                        */\n#define LRA_LRA_BRD_STAT_REG_HSP_STAT_Pos (0UL)                     /*!< HSP_STAT (Bit 0)                                      */\n#define LRA_LRA_BRD_STAT_REG_HSP_STAT_Msk (0x1UL)                   /*!< HSP_STAT (Bitfield-Mask: 0x01)                        */\n/* =====================================================  LRA_CTRL1_REG  ===================================================== */\n#define LRA_LRA_CTRL1_REG_SMP_IDX_Pos     (24UL)                    /*!< SMP_IDX (Bit 24)                                      */\n#define LRA_LRA_CTRL1_REG_SMP_IDX_Msk     (0xf000000UL)             /*!< SMP_IDX (Bitfield-Mask: 0x0f)                         */\n#define LRA_LRA_CTRL1_REG_IRQ_SCP_EVENT_EN_Pos (18UL)               /*!< IRQ_SCP_EVENT_EN (Bit 18)                             */\n#define LRA_LRA_CTRL1_REG_IRQ_SCP_EVENT_EN_Msk (0x40000UL)          /*!< IRQ_SCP_EVENT_EN (Bitfield-Mask: 0x01)                */\n#define LRA_LRA_CTRL1_REG_IRQ_ADC_EN_Pos  (17UL)                    /*!< IRQ_ADC_EN (Bit 17)                                   */\n#define LRA_LRA_CTRL1_REG_IRQ_ADC_EN_Msk  (0x20000UL)               /*!< IRQ_ADC_EN (Bitfield-Mask: 0x01)                      */\n#define LRA_LRA_CTRL1_REG_IRQ_CTRL_EN_Pos (16UL)                    /*!< IRQ_CTRL_EN (Bit 16)                                  */\n#define LRA_LRA_CTRL1_REG_IRQ_CTRL_EN_Msk (0x10000UL)               /*!< IRQ_CTRL_EN (Bitfield-Mask: 0x01)                     */\n#define LRA_LRA_CTRL1_REG_IRQ_IDX_Pos     (12UL)                    /*!< IRQ_IDX (Bit 12)                                      */\n#define LRA_LRA_CTRL1_REG_IRQ_IDX_Msk     (0xf000UL)                /*!< IRQ_IDX (Bitfield-Mask: 0x0f)                         */\n#define LRA_LRA_CTRL1_REG_IRQ_DIV_Pos     (8UL)                     /*!< IRQ_DIV (Bit 8)                                       */\n#define LRA_LRA_CTRL1_REG_IRQ_DIV_Msk     (0xf00UL)                 /*!< IRQ_DIV (Bitfield-Mask: 0x0f)                         */\n#define LRA_LRA_CTRL1_REG_SMP_SEL_Pos     (6UL)                     /*!< SMP_SEL (Bit 6)                                       */\n#define LRA_LRA_CTRL1_REG_SMP_SEL_Msk     (0xc0UL)                  /*!< SMP_SEL (Bitfield-Mask: 0x03)                         */\n#define LRA_LRA_CTRL1_REG_PULLDOWN_EN_Pos (5UL)                     /*!< PULLDOWN_EN (Bit 5)                                   */\n#define LRA_LRA_CTRL1_REG_PULLDOWN_EN_Msk (0x20UL)                  /*!< PULLDOWN_EN (Bitfield-Mask: 0x01)                     */\n#define LRA_LRA_CTRL1_REG_LOOP_EN_Pos     (4UL)                     /*!< LOOP_EN (Bit 4)                                       */\n#define LRA_LRA_CTRL1_REG_LOOP_EN_Msk     (0x10UL)                  /*!< LOOP_EN (Bitfield-Mask: 0x01)                         */\n#define LRA_LRA_CTRL1_REG_LDO_EN_Pos      (3UL)                     /*!< LDO_EN (Bit 3)                                        */\n#define LRA_LRA_CTRL1_REG_LDO_EN_Msk      (0x8UL)                   /*!< LDO_EN (Bitfield-Mask: 0x01)                          */\n#define LRA_LRA_CTRL1_REG_ADC_EN_Pos      (2UL)                     /*!< ADC_EN (Bit 2)                                        */\n#define LRA_LRA_CTRL1_REG_ADC_EN_Msk      (0x4UL)                   /*!< ADC_EN (Bitfield-Mask: 0x01)                          */\n#define LRA_LRA_CTRL1_REG_HBRIDGE_EN_Pos  (1UL)                     /*!< HBRIDGE_EN (Bit 1)                                    */\n#define LRA_LRA_CTRL1_REG_HBRIDGE_EN_Msk  (0x2UL)                   /*!< HBRIDGE_EN (Bitfield-Mask: 0x01)                      */\n#define LRA_LRA_CTRL1_REG_LRA_EN_Pos      (0UL)                     /*!< LRA_EN (Bit 0)                                        */\n#define LRA_LRA_CTRL1_REG_LRA_EN_Msk      (0x1UL)                   /*!< LRA_EN (Bitfield-Mask: 0x01)                          */\n/* =====================================================  LRA_CTRL2_REG  ===================================================== */\n#define LRA_LRA_CTRL2_REG_HALF_PERIOD_Pos (16UL)                    /*!< HALF_PERIOD (Bit 16)                                  */\n#define LRA_LRA_CTRL2_REG_HALF_PERIOD_Msk (0xffff0000UL)            /*!< HALF_PERIOD (Bitfield-Mask: 0xffff)                   */\n#define LRA_LRA_CTRL2_REG_AUTO_MODE_Pos   (5UL)                     /*!< AUTO_MODE (Bit 5)                                     */\n#define LRA_LRA_CTRL2_REG_AUTO_MODE_Msk   (0x20UL)                  /*!< AUTO_MODE (Bitfield-Mask: 0x01)                       */\n#define LRA_LRA_CTRL2_REG_SMP_MODE_Pos    (4UL)                     /*!< SMP_MODE (Bit 4)                                      */\n#define LRA_LRA_CTRL2_REG_SMP_MODE_Msk    (0x10UL)                  /*!< SMP_MODE (Bitfield-Mask: 0x01)                        */\n#define LRA_LRA_CTRL2_REG_POLARITY_Pos    (3UL)                     /*!< POLARITY (Bit 3)                                      */\n#define LRA_LRA_CTRL2_REG_POLARITY_Msk    (0x8UL)                   /*!< POLARITY (Bitfield-Mask: 0x01)                        */\n#define LRA_LRA_CTRL2_REG_FLT_IN_SEL_Pos  (2UL)                     /*!< FLT_IN_SEL (Bit 2)                                    */\n#define LRA_LRA_CTRL2_REG_FLT_IN_SEL_Msk  (0x4UL)                   /*!< FLT_IN_SEL (Bitfield-Mask: 0x01)                      */\n#define LRA_LRA_CTRL2_REG_PWM_MODE_Pos    (0UL)                     /*!< PWM_MODE (Bit 0)                                      */\n#define LRA_LRA_CTRL2_REG_PWM_MODE_Msk    (0x3UL)                   /*!< PWM_MODE (Bitfield-Mask: 0x03)                        */\n/* =====================================================  LRA_CTRL3_REG  ===================================================== */\n#define LRA_LRA_CTRL3_REG_VREF_Pos        (16UL)                    /*!< VREF (Bit 16)                                         */\n#define LRA_LRA_CTRL3_REG_VREF_Msk        (0xffff0000UL)            /*!< VREF (Bitfield-Mask: 0xffff)                          */\n#define LRA_LRA_CTRL3_REG_DREF_Pos        (0UL)                     /*!< DREF (Bit 0)                                          */\n#define LRA_LRA_CTRL3_REG_DREF_Msk        (0xffffUL)                /*!< DREF (Bitfield-Mask: 0xffff)                          */\n/* ======================================================  LRA_DFT_REG  ====================================================== */\n#define LRA_LRA_DFT_REG_SPARE_Pos         (29UL)                    /*!< SPARE (Bit 29)                                        */\n#define LRA_LRA_DFT_REG_SPARE_Msk         (0xe0000000UL)            /*!< SPARE (Bitfield-Mask: 0x07)                           */\n#define LRA_LRA_DFT_REG_SWM_SEL_Pos       (28UL)                    /*!< SWM_SEL (Bit 28)                                      */\n#define LRA_LRA_DFT_REG_SWM_SEL_Msk       (0x10000000UL)            /*!< SWM_SEL (Bitfield-Mask: 0x01)                         */\n#define LRA_LRA_DFT_REG_SWM_MAN_Pos       (27UL)                    /*!< SWM_MAN (Bit 27)                                      */\n#define LRA_LRA_DFT_REG_SWM_MAN_Msk       (0x8000000UL)             /*!< SWM_MAN (Bitfield-Mask: 0x01)                         */\n#define LRA_LRA_DFT_REG_PWM_SEL_Pos       (26UL)                    /*!< PWM_SEL (Bit 26)                                      */\n#define LRA_LRA_DFT_REG_PWM_SEL_Msk       (0x4000000UL)             /*!< PWM_SEL (Bitfield-Mask: 0x01)                         */\n#define LRA_LRA_DFT_REG_PWM_MAN_Pos       (25UL)                    /*!< PWM_MAN (Bit 25)                                      */\n#define LRA_LRA_DFT_REG_PWM_MAN_Msk       (0x2000000UL)             /*!< PWM_MAN (Bitfield-Mask: 0x01)                         */\n#define LRA_LRA_DFT_REG_TIMER_TRIM_Pos    (23UL)                    /*!< TIMER_TRIM (Bit 23)                                   */\n#define LRA_LRA_DFT_REG_TIMER_TRIM_Msk    (0x1800000UL)             /*!< TIMER_TRIM (Bitfield-Mask: 0x03)                      */\n#define LRA_LRA_DFT_REG_TIMER_SCALE_TRIM_Pos (21UL)                 /*!< TIMER_SCALE_TRIM (Bit 21)                             */\n#define LRA_LRA_DFT_REG_TIMER_SCALE_TRIM_Msk (0x600000UL)           /*!< TIMER_SCALE_TRIM (Bitfield-Mask: 0x03)                */\n#define LRA_LRA_DFT_REG_DFT_SEL_Pos       (20UL)                    /*!< DFT_SEL (Bit 20)                                      */\n#define LRA_LRA_DFT_REG_DFT_SEL_Msk       (0x100000UL)              /*!< DFT_SEL (Bitfield-Mask: 0x01)                         */\n#define LRA_LRA_DFT_REG_DFT_FORCE_HSPN_Pos (19UL)                   /*!< DFT_FORCE_HSPN (Bit 19)                               */\n#define LRA_LRA_DFT_REG_DFT_FORCE_HSPN_Msk (0x80000UL)              /*!< DFT_FORCE_HSPN (Bitfield-Mask: 0x01)                  */\n#define LRA_LRA_DFT_REG_DFT_EN_TIMER_Pos  (18UL)                    /*!< DFT_EN_TIMER (Bit 18)                                 */\n#define LRA_LRA_DFT_REG_DFT_EN_TIMER_Msk  (0x40000UL)               /*!< DFT_EN_TIMER (Bitfield-Mask: 0x01)                    */\n#define LRA_LRA_DFT_REG_DFT_STALL_Pos     (16UL)                    /*!< DFT_STALL (Bit 16)                                    */\n#define LRA_LRA_DFT_REG_DFT_STALL_Msk     (0x30000UL)               /*!< DFT_STALL (Bitfield-Mask: 0x03)                       */\n#define LRA_LRA_DFT_REG_DFT_CTRL_Pos      (0UL)                     /*!< DFT_CTRL (Bit 0)                                      */\n#define LRA_LRA_DFT_REG_DFT_CTRL_Msk      (0xffffUL)                /*!< DFT_CTRL (Bitfield-Mask: 0xffff)                      */\n/* ===================================================  LRA_FLT_COEF1_REG  =================================================== */\n#define LRA_LRA_FLT_COEF1_REG_FLT_COEF_01_Pos (16UL)                /*!< FLT_COEF_01 (Bit 16)                                  */\n#define LRA_LRA_FLT_COEF1_REG_FLT_COEF_01_Msk (0xffff0000UL)        /*!< FLT_COEF_01 (Bitfield-Mask: 0xffff)                   */\n#define LRA_LRA_FLT_COEF1_REG_FLT_COEF_00_Pos (0UL)                 /*!< FLT_COEF_00 (Bit 0)                                   */\n#define LRA_LRA_FLT_COEF1_REG_FLT_COEF_00_Msk (0xffffUL)            /*!< FLT_COEF_00 (Bitfield-Mask: 0xffff)                   */\n/* ===================================================  LRA_FLT_COEF2_REG  =================================================== */\n#define LRA_LRA_FLT_COEF2_REG_FLT_COEF_10_Pos (16UL)                /*!< FLT_COEF_10 (Bit 16)                                  */\n#define LRA_LRA_FLT_COEF2_REG_FLT_COEF_10_Msk (0xffff0000UL)        /*!< FLT_COEF_10 (Bitfield-Mask: 0xffff)                   */\n#define LRA_LRA_FLT_COEF2_REG_FLT_COEF_02_Pos (0UL)                 /*!< FLT_COEF_02 (Bit 0)                                   */\n#define LRA_LRA_FLT_COEF2_REG_FLT_COEF_02_Msk (0xffffUL)            /*!< FLT_COEF_02 (Bitfield-Mask: 0xffff)                   */\n/* ===================================================  LRA_FLT_COEF3_REG  =================================================== */\n#define LRA_LRA_FLT_COEF3_REG_FLT_COEF_12_Pos (16UL)                /*!< FLT_COEF_12 (Bit 16)                                  */\n#define LRA_LRA_FLT_COEF3_REG_FLT_COEF_12_Msk (0xffff0000UL)        /*!< FLT_COEF_12 (Bitfield-Mask: 0xffff)                   */\n#define LRA_LRA_FLT_COEF3_REG_FLT_COEF_11_Pos (0UL)                 /*!< FLT_COEF_11 (Bit 0)                                   */\n#define LRA_LRA_FLT_COEF3_REG_FLT_COEF_11_Msk (0xffffUL)            /*!< FLT_COEF_11 (Bitfield-Mask: 0xffff)                   */\n/* ===================================================  LRA_FLT_SMP1_REG  ==================================================== */\n#define LRA_LRA_FLT_SMP1_REG_LRA_SMP_2_Pos (16UL)                   /*!< LRA_SMP_2 (Bit 16)                                    */\n#define LRA_LRA_FLT_SMP1_REG_LRA_SMP_2_Msk (0xffff0000UL)           /*!< LRA_SMP_2 (Bitfield-Mask: 0xffff)                     */\n#define LRA_LRA_FLT_SMP1_REG_LRA_SMP_1_Pos (0UL)                    /*!< LRA_SMP_1 (Bit 0)                                     */\n#define LRA_LRA_FLT_SMP1_REG_LRA_SMP_1_Msk (0xffffUL)               /*!< LRA_SMP_1 (Bitfield-Mask: 0xffff)                     */\n/* ===================================================  LRA_FLT_SMP2_REG  ==================================================== */\n#define LRA_LRA_FLT_SMP2_REG_LRA_SMP_4_Pos (16UL)                   /*!< LRA_SMP_4 (Bit 16)                                    */\n#define LRA_LRA_FLT_SMP2_REG_LRA_SMP_4_Msk (0xffff0000UL)           /*!< LRA_SMP_4 (Bitfield-Mask: 0xffff)                     */\n#define LRA_LRA_FLT_SMP2_REG_LRA_SMP_3_Pos (0UL)                    /*!< LRA_SMP_3 (Bit 0)                                     */\n#define LRA_LRA_FLT_SMP2_REG_LRA_SMP_3_Msk (0xffffUL)               /*!< LRA_SMP_3 (Bitfield-Mask: 0xffff)                     */\n/* ===================================================  LRA_FLT_SMP3_REG  ==================================================== */\n#define LRA_LRA_FLT_SMP3_REG_LRA_SMP_6_Pos (16UL)                   /*!< LRA_SMP_6 (Bit 16)                                    */\n#define LRA_LRA_FLT_SMP3_REG_LRA_SMP_6_Msk (0xffff0000UL)           /*!< LRA_SMP_6 (Bitfield-Mask: 0xffff)                     */\n#define LRA_LRA_FLT_SMP3_REG_LRA_SMP_5_Pos (0UL)                    /*!< LRA_SMP_5 (Bit 0)                                     */\n#define LRA_LRA_FLT_SMP3_REG_LRA_SMP_5_Msk (0xffffUL)               /*!< LRA_SMP_5 (Bitfield-Mask: 0xffff)                     */\n/* ===================================================  LRA_FLT_SMP4_REG  ==================================================== */\n#define LRA_LRA_FLT_SMP4_REG_LRA_SMP_8_Pos (16UL)                   /*!< LRA_SMP_8 (Bit 16)                                    */\n#define LRA_LRA_FLT_SMP4_REG_LRA_SMP_8_Msk (0xffff0000UL)           /*!< LRA_SMP_8 (Bitfield-Mask: 0xffff)                     */\n#define LRA_LRA_FLT_SMP4_REG_LRA_SMP_7_Pos (0UL)                    /*!< LRA_SMP_7 (Bit 0)                                     */\n#define LRA_LRA_FLT_SMP4_REG_LRA_SMP_7_Msk (0xffffUL)               /*!< LRA_SMP_7 (Bitfield-Mask: 0xffff)                     */\n/* ===================================================  LRA_FLT_SMP5_REG  ==================================================== */\n#define LRA_LRA_FLT_SMP5_REG_LRA_SMP_10_Pos (16UL)                  /*!< LRA_SMP_10 (Bit 16)                                   */\n#define LRA_LRA_FLT_SMP5_REG_LRA_SMP_10_Msk (0xffff0000UL)          /*!< LRA_SMP_10 (Bitfield-Mask: 0xffff)                    */\n#define LRA_LRA_FLT_SMP5_REG_LRA_SMP_9_Pos (0UL)                    /*!< LRA_SMP_9 (Bit 0)                                     */\n#define LRA_LRA_FLT_SMP5_REG_LRA_SMP_9_Msk (0xffffUL)               /*!< LRA_SMP_9 (Bitfield-Mask: 0xffff)                     */\n/* ===================================================  LRA_FLT_SMP6_REG  ==================================================== */\n#define LRA_LRA_FLT_SMP6_REG_LRA_SMP_12_Pos (16UL)                  /*!< LRA_SMP_12 (Bit 16)                                   */\n#define LRA_LRA_FLT_SMP6_REG_LRA_SMP_12_Msk (0xffff0000UL)          /*!< LRA_SMP_12 (Bitfield-Mask: 0xffff)                    */\n#define LRA_LRA_FLT_SMP6_REG_LRA_SMP_11_Pos (0UL)                   /*!< LRA_SMP_11 (Bit 0)                                    */\n#define LRA_LRA_FLT_SMP6_REG_LRA_SMP_11_Msk (0xffffUL)              /*!< LRA_SMP_11 (Bitfield-Mask: 0xffff)                    */\n/* ===================================================  LRA_FLT_SMP7_REG  ==================================================== */\n#define LRA_LRA_FLT_SMP7_REG_LRA_SMP_14_Pos (16UL)                  /*!< LRA_SMP_14 (Bit 16)                                   */\n#define LRA_LRA_FLT_SMP7_REG_LRA_SMP_14_Msk (0xffff0000UL)          /*!< LRA_SMP_14 (Bitfield-Mask: 0xffff)                    */\n#define LRA_LRA_FLT_SMP7_REG_LRA_SMP_13_Pos (0UL)                   /*!< LRA_SMP_13 (Bit 0)                                    */\n#define LRA_LRA_FLT_SMP7_REG_LRA_SMP_13_Msk (0xffffUL)              /*!< LRA_SMP_13 (Bitfield-Mask: 0xffff)                    */\n/* ===================================================  LRA_FLT_SMP8_REG  ==================================================== */\n#define LRA_LRA_FLT_SMP8_REG_LRA_SMP_16_Pos (16UL)                  /*!< LRA_SMP_16 (Bit 16)                                   */\n#define LRA_LRA_FLT_SMP8_REG_LRA_SMP_16_Msk (0xffff0000UL)          /*!< LRA_SMP_16 (Bitfield-Mask: 0xffff)                    */\n#define LRA_LRA_FLT_SMP8_REG_LRA_SMP_15_Pos (0UL)                   /*!< LRA_SMP_15 (Bit 0)                                    */\n#define LRA_LRA_FLT_SMP8_REG_LRA_SMP_15_Msk (0xffffUL)              /*!< LRA_SMP_15 (Bitfield-Mask: 0xffff)                    */\n/* ======================================================  LRA_LDO_REG  ====================================================== */\n#define LRA_LRA_LDO_REG_LDO_OK_Pos        (31UL)                    /*!< LDO_OK (Bit 31)                                       */\n#define LRA_LRA_LDO_REG_LDO_OK_Msk        (0x80000000UL)            /*!< LDO_OK (Bitfield-Mask: 0x01)                          */\n#define LRA_LRA_LDO_REG_LDO_TST_Pos       (1UL)                     /*!< LDO_TST (Bit 1)                                       */\n#define LRA_LRA_LDO_REG_LDO_TST_Msk       (0x2UL)                   /*!< LDO_TST (Bitfield-Mask: 0x01)                         */\n#define LRA_LRA_LDO_REG_LDO_VREF_HOLD_Pos (0UL)                     /*!< LDO_VREF_HOLD (Bit 0)                                 */\n#define LRA_LRA_LDO_REG_LDO_VREF_HOLD_Msk (0x1UL)                   /*!< LDO_VREF_HOLD (Bitfield-Mask: 0x01)                   */\n\n\n/* =========================================================================================================================== */\n/* ================                                          MEMCTRL                                          ================ */\n/* =========================================================================================================================== */\n\n/* ====================================================  BUSY_RESET_REG  ===================================================== */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SPARE_Pos (30UL)                /*!< BUSY_SPARE (Bit 30)                                   */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SPARE_Msk (0xc0000000UL)        /*!< BUSY_SPARE (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_MOTOR_Pos (28UL)                /*!< BUSY_MOTOR (Bit 28)                                   */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_MOTOR_Msk (0x30000000UL)        /*!< BUSY_MOTOR (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_TIMER2_Pos (26UL)               /*!< BUSY_TIMER2 (Bit 26)                                  */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_TIMER2_Msk (0xc000000UL)        /*!< BUSY_TIMER2 (Bitfield-Mask: 0x03)                     */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_TIMER_Pos (24UL)                /*!< BUSY_TIMER (Bit 24)                                   */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_TIMER_Msk (0x3000000UL)         /*!< BUSY_TIMER (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_UART3_Pos (22UL)                /*!< BUSY_UART3 (Bit 22)                                   */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_UART3_Msk (0xc00000UL)          /*!< BUSY_UART3 (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_GPADC_Pos (20UL)                /*!< BUSY_GPADC (Bit 20)                                   */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_GPADC_Msk (0x300000UL)          /*!< BUSY_GPADC (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_PDM_Pos (18UL)                  /*!< BUSY_PDM (Bit 18)                                     */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_PDM_Msk (0xc0000UL)             /*!< BUSY_PDM (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SRC_Pos (16UL)                  /*!< BUSY_SRC (Bit 16)                                     */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SRC_Msk (0x30000UL)             /*!< BUSY_SRC (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_PCM_Pos (14UL)                  /*!< BUSY_PCM (Bit 14)                                     */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_PCM_Msk (0xc000UL)              /*!< BUSY_PCM (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SDADC_Pos (12UL)                /*!< BUSY_SDADC (Bit 12)                                   */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SDADC_Msk (0x3000UL)            /*!< BUSY_SDADC (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_I2C2_Pos (10UL)                 /*!< BUSY_I2C2 (Bit 10)                                    */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_I2C2_Msk (0xc00UL)              /*!< BUSY_I2C2 (Bitfield-Mask: 0x03)                       */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_I2C_Pos (8UL)                   /*!< BUSY_I2C (Bit 8)                                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_I2C_Msk (0x300UL)               /*!< BUSY_I2C (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SPI2_Pos (6UL)                  /*!< BUSY_SPI2 (Bit 6)                                     */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SPI2_Msk (0xc0UL)               /*!< BUSY_SPI2 (Bitfield-Mask: 0x03)                       */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SPI_Pos (4UL)                   /*!< BUSY_SPI (Bit 4)                                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_SPI_Msk (0x30UL)                /*!< BUSY_SPI (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_UART2_Pos (2UL)                 /*!< BUSY_UART2 (Bit 2)                                    */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_UART2_Msk (0xcUL)               /*!< BUSY_UART2 (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_UART_Pos (0UL)                  /*!< BUSY_UART (Bit 0)                                     */\n#define MEMCTRL_BUSY_RESET_REG_BUSY_UART_Msk (0x3UL)                /*!< BUSY_UART (Bitfield-Mask: 0x03)                       */\n/* =====================================================  BUSY_SET_REG  ====================================================== */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SPARE_Pos (30UL)                  /*!< BUSY_SPARE (Bit 30)                                   */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SPARE_Msk (0xc0000000UL)          /*!< BUSY_SPARE (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_MOTOR_Pos (28UL)                  /*!< BUSY_MOTOR (Bit 28)                                   */\n#define MEMCTRL_BUSY_SET_REG_BUSY_MOTOR_Msk (0x30000000UL)          /*!< BUSY_MOTOR (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_TIMER2_Pos (26UL)                 /*!< BUSY_TIMER2 (Bit 26)                                  */\n#define MEMCTRL_BUSY_SET_REG_BUSY_TIMER2_Msk (0xc000000UL)          /*!< BUSY_TIMER2 (Bitfield-Mask: 0x03)                     */\n#define MEMCTRL_BUSY_SET_REG_BUSY_TIMER_Pos (24UL)                  /*!< BUSY_TIMER (Bit 24)                                   */\n#define MEMCTRL_BUSY_SET_REG_BUSY_TIMER_Msk (0x3000000UL)           /*!< BUSY_TIMER (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_UART3_Pos (22UL)                  /*!< BUSY_UART3 (Bit 22)                                   */\n#define MEMCTRL_BUSY_SET_REG_BUSY_UART3_Msk (0xc00000UL)            /*!< BUSY_UART3 (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_GPADC_Pos (20UL)                  /*!< BUSY_GPADC (Bit 20)                                   */\n#define MEMCTRL_BUSY_SET_REG_BUSY_GPADC_Msk (0x300000UL)            /*!< BUSY_GPADC (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_PDM_Pos (18UL)                    /*!< BUSY_PDM (Bit 18)                                     */\n#define MEMCTRL_BUSY_SET_REG_BUSY_PDM_Msk (0xc0000UL)               /*!< BUSY_PDM (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SRC_Pos (16UL)                    /*!< BUSY_SRC (Bit 16)                                     */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SRC_Msk (0x30000UL)               /*!< BUSY_SRC (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_SET_REG_BUSY_PCM_Pos (14UL)                    /*!< BUSY_PCM (Bit 14)                                     */\n#define MEMCTRL_BUSY_SET_REG_BUSY_PCM_Msk (0xc000UL)                /*!< BUSY_PCM (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SDADC_Pos (12UL)                  /*!< BUSY_SDADC (Bit 12)                                   */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SDADC_Msk (0x3000UL)              /*!< BUSY_SDADC (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_I2C2_Pos (10UL)                   /*!< BUSY_I2C2 (Bit 10)                                    */\n#define MEMCTRL_BUSY_SET_REG_BUSY_I2C2_Msk (0xc00UL)                /*!< BUSY_I2C2 (Bitfield-Mask: 0x03)                       */\n#define MEMCTRL_BUSY_SET_REG_BUSY_I2C_Pos (8UL)                     /*!< BUSY_I2C (Bit 8)                                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_I2C_Msk (0x300UL)                 /*!< BUSY_I2C (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SPI2_Pos (6UL)                    /*!< BUSY_SPI2 (Bit 6)                                     */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SPI2_Msk (0xc0UL)                 /*!< BUSY_SPI2 (Bitfield-Mask: 0x03)                       */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SPI_Pos (4UL)                     /*!< BUSY_SPI (Bit 4)                                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_SPI_Msk (0x30UL)                  /*!< BUSY_SPI (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_SET_REG_BUSY_UART2_Pos (2UL)                   /*!< BUSY_UART2 (Bit 2)                                    */\n#define MEMCTRL_BUSY_SET_REG_BUSY_UART2_Msk (0xcUL)                 /*!< BUSY_UART2 (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_SET_REG_BUSY_UART_Pos (0UL)                    /*!< BUSY_UART (Bit 0)                                     */\n#define MEMCTRL_BUSY_SET_REG_BUSY_UART_Msk (0x3UL)                  /*!< BUSY_UART (Bitfield-Mask: 0x03)                       */\n/* =====================================================  BUSY_STAT_REG  ===================================================== */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SPARE_Pos (30UL)                 /*!< BUSY_SPARE (Bit 30)                                   */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SPARE_Msk (0xc0000000UL)         /*!< BUSY_SPARE (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_MOTOR_Pos (28UL)                 /*!< BUSY_MOTOR (Bit 28)                                   */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_MOTOR_Msk (0x30000000UL)         /*!< BUSY_MOTOR (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_TIMER2_Pos (26UL)                /*!< BUSY_TIMER2 (Bit 26)                                  */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_TIMER2_Msk (0xc000000UL)         /*!< BUSY_TIMER2 (Bitfield-Mask: 0x03)                     */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_TIMER_Pos (24UL)                 /*!< BUSY_TIMER (Bit 24)                                   */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_TIMER_Msk (0x3000000UL)          /*!< BUSY_TIMER (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_UART3_Pos (22UL)                 /*!< BUSY_UART3 (Bit 22)                                   */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_UART3_Msk (0xc00000UL)           /*!< BUSY_UART3 (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_GPADC_Pos (20UL)                 /*!< BUSY_GPADC (Bit 20)                                   */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_GPADC_Msk (0x300000UL)           /*!< BUSY_GPADC (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_PDM_Pos (18UL)                   /*!< BUSY_PDM (Bit 18)                                     */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_PDM_Msk (0xc0000UL)              /*!< BUSY_PDM (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SRC_Pos (16UL)                   /*!< BUSY_SRC (Bit 16)                                     */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SRC_Msk (0x30000UL)              /*!< BUSY_SRC (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_PCM_Pos (14UL)                   /*!< BUSY_PCM (Bit 14)                                     */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_PCM_Msk (0xc000UL)               /*!< BUSY_PCM (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SDADC_Pos (12UL)                 /*!< BUSY_SDADC (Bit 12)                                   */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SDADC_Msk (0x3000UL)             /*!< BUSY_SDADC (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_I2C2_Pos (10UL)                  /*!< BUSY_I2C2 (Bit 10)                                    */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_I2C2_Msk (0xc00UL)               /*!< BUSY_I2C2 (Bitfield-Mask: 0x03)                       */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_I2C_Pos (8UL)                    /*!< BUSY_I2C (Bit 8)                                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_I2C_Msk (0x300UL)                /*!< BUSY_I2C (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SPI2_Pos (6UL)                   /*!< BUSY_SPI2 (Bit 6)                                     */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SPI2_Msk (0xc0UL)                /*!< BUSY_SPI2 (Bitfield-Mask: 0x03)                       */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SPI_Pos (4UL)                    /*!< BUSY_SPI (Bit 4)                                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_SPI_Msk (0x30UL)                 /*!< BUSY_SPI (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_UART2_Pos (2UL)                  /*!< BUSY_UART2 (Bit 2)                                    */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_UART2_Msk (0xcUL)                /*!< BUSY_UART2 (Bitfield-Mask: 0x03)                      */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_UART_Pos (0UL)                   /*!< BUSY_UART (Bit 0)                                     */\n#define MEMCTRL_BUSY_STAT_REG_BUSY_UART_Msk (0x3UL)                 /*!< BUSY_UART (Bitfield-Mask: 0x03)                       */\n/* ===================================================  CMI_CODE_BASE_REG  =================================================== */\n#define MEMCTRL_CMI_CODE_BASE_REG_CMI_CODE_BASE_ADDR_Pos (10UL)     /*!< CMI_CODE_BASE_ADDR (Bit 10)                           */\n#define MEMCTRL_CMI_CODE_BASE_REG_CMI_CODE_BASE_ADDR_Msk (0x7fc00UL) /*!< CMI_CODE_BASE_ADDR (Bitfield-Mask: 0x1ff)            */\n/* ===================================================  CMI_DATA_BASE_REG  =================================================== */\n#define MEMCTRL_CMI_DATA_BASE_REG_CMI_DATA_BASE_ADDR_Pos (2UL)      /*!< CMI_DATA_BASE_ADDR (Bit 2)                            */\n#define MEMCTRL_CMI_DATA_BASE_REG_CMI_DATA_BASE_ADDR_Msk (0x7fffcUL) /*!< CMI_DATA_BASE_ADDR (Bitfield-Mask: 0x1ffff)          */\n/* ======================================================  CMI_END_REG  ====================================================== */\n#define MEMCTRL_CMI_END_REG_CMI_END_ADDR_Pos (10UL)                 /*!< CMI_END_ADDR (Bit 10)                                 */\n#define MEMCTRL_CMI_END_REG_CMI_END_ADDR_Msk (0x7fc00UL)            /*!< CMI_END_ADDR (Bitfield-Mask: 0x1ff)                   */\n/* ==================================================  CMI_SHARED_BASE_REG  ================================================== */\n#define MEMCTRL_CMI_SHARED_BASE_REG_CMI_SHARED_BASE_ADDR_Pos (10UL) /*!< CMI_SHARED_BASE_ADDR (Bit 10)                         */\n#define MEMCTRL_CMI_SHARED_BASE_REG_CMI_SHARED_BASE_ADDR_Msk (0x7fc00UL) /*!< CMI_SHARED_BASE_ADDR (Bitfield-Mask: 0x1ff)      */\n/* =====================================================  MEM_PRIO_REG  ====================================================== */\n#define MEMCTRL_MEM_PRIO_REG_AHB_PRIO_Pos (4UL)                     /*!< AHB_PRIO (Bit 4)                                      */\n#define MEMCTRL_MEM_PRIO_REG_AHB_PRIO_Msk (0x30UL)                  /*!< AHB_PRIO (Bitfield-Mask: 0x03)                        */\n#define MEMCTRL_MEM_PRIO_REG_AHB2_PRIO_Pos (2UL)                    /*!< AHB2_PRIO (Bit 2)                                     */\n#define MEMCTRL_MEM_PRIO_REG_AHB2_PRIO_Msk (0xcUL)                  /*!< AHB2_PRIO (Bitfield-Mask: 0x03)                       */\n#define MEMCTRL_MEM_PRIO_REG_SNC_PRIO_Pos (0UL)                     /*!< SNC_PRIO (Bit 0)                                      */\n#define MEMCTRL_MEM_PRIO_REG_SNC_PRIO_Msk (0x3UL)                   /*!< SNC_PRIO (Bitfield-Mask: 0x03)                        */\n/* =====================================================  MEM_STALL_REG  ===================================================== */\n#define MEMCTRL_MEM_STALL_REG_AHB_MAX_STALL_Pos (8UL)               /*!< AHB_MAX_STALL (Bit 8)                                 */\n#define MEMCTRL_MEM_STALL_REG_AHB_MAX_STALL_Msk (0xf00UL)           /*!< AHB_MAX_STALL (Bitfield-Mask: 0x0f)                   */\n#define MEMCTRL_MEM_STALL_REG_AHB2_MAX_STALL_Pos (4UL)              /*!< AHB2_MAX_STALL (Bit 4)                                */\n#define MEMCTRL_MEM_STALL_REG_AHB2_MAX_STALL_Msk (0xf0UL)           /*!< AHB2_MAX_STALL (Bitfield-Mask: 0x0f)                  */\n#define MEMCTRL_MEM_STALL_REG_SNC_MAX_STALL_Pos (0UL)               /*!< SNC_MAX_STALL (Bit 0)                                 */\n#define MEMCTRL_MEM_STALL_REG_SNC_MAX_STALL_Msk (0xfUL)             /*!< SNC_MAX_STALL (Bitfield-Mask: 0x0f)                   */\n/* ====================================================  MEM_STATUS2_REG  ==================================================== */\n#define MEMCTRL_MEM_STATUS2_REG_RAM8_OFF_BUT_ACCESS_Pos (7UL)       /*!< RAM8_OFF_BUT_ACCESS (Bit 7)                           */\n#define MEMCTRL_MEM_STATUS2_REG_RAM8_OFF_BUT_ACCESS_Msk (0x80UL)    /*!< RAM8_OFF_BUT_ACCESS (Bitfield-Mask: 0x01)             */\n#define MEMCTRL_MEM_STATUS2_REG_RAM7_OFF_BUT_ACCESS_Pos (6UL)       /*!< RAM7_OFF_BUT_ACCESS (Bit 6)                           */\n#define MEMCTRL_MEM_STATUS2_REG_RAM7_OFF_BUT_ACCESS_Msk (0x40UL)    /*!< RAM7_OFF_BUT_ACCESS (Bitfield-Mask: 0x01)             */\n#define MEMCTRL_MEM_STATUS2_REG_RAM6_OFF_BUT_ACCESS_Pos (5UL)       /*!< RAM6_OFF_BUT_ACCESS (Bit 5)                           */\n#define MEMCTRL_MEM_STATUS2_REG_RAM6_OFF_BUT_ACCESS_Msk (0x20UL)    /*!< RAM6_OFF_BUT_ACCESS (Bitfield-Mask: 0x01)             */\n#define MEMCTRL_MEM_STATUS2_REG_RAM5_OFF_BUT_ACCESS_Pos (4UL)       /*!< RAM5_OFF_BUT_ACCESS (Bit 4)                           */\n#define MEMCTRL_MEM_STATUS2_REG_RAM5_OFF_BUT_ACCESS_Msk (0x10UL)    /*!< RAM5_OFF_BUT_ACCESS (Bitfield-Mask: 0x01)             */\n#define MEMCTRL_MEM_STATUS2_REG_RAM4_OFF_BUT_ACCESS_Pos (3UL)       /*!< RAM4_OFF_BUT_ACCESS (Bit 3)                           */\n#define MEMCTRL_MEM_STATUS2_REG_RAM4_OFF_BUT_ACCESS_Msk (0x8UL)     /*!< RAM4_OFF_BUT_ACCESS (Bitfield-Mask: 0x01)             */\n#define MEMCTRL_MEM_STATUS2_REG_RAM3_OFF_BUT_ACCESS_Pos (2UL)       /*!< RAM3_OFF_BUT_ACCESS (Bit 2)                           */\n#define MEMCTRL_MEM_STATUS2_REG_RAM3_OFF_BUT_ACCESS_Msk (0x4UL)     /*!< RAM3_OFF_BUT_ACCESS (Bitfield-Mask: 0x01)             */\n#define MEMCTRL_MEM_STATUS2_REG_RAM2_OFF_BUT_ACCESS_Pos (1UL)       /*!< RAM2_OFF_BUT_ACCESS (Bit 1)                           */\n#define MEMCTRL_MEM_STATUS2_REG_RAM2_OFF_BUT_ACCESS_Msk (0x2UL)     /*!< RAM2_OFF_BUT_ACCESS (Bitfield-Mask: 0x01)             */\n#define MEMCTRL_MEM_STATUS2_REG_RAM1_OFF_BUT_ACCESS_Pos (0UL)       /*!< RAM1_OFF_BUT_ACCESS (Bit 0)                           */\n#define MEMCTRL_MEM_STATUS2_REG_RAM1_OFF_BUT_ACCESS_Msk (0x1UL)     /*!< RAM1_OFF_BUT_ACCESS (Bitfield-Mask: 0x01)             */\n/* ====================================================  MEM_STATUS_REG  ===================================================== */\n#define MEMCTRL_MEM_STATUS_REG_CMI_CLEAR_READY_Pos (13UL)           /*!< CMI_CLEAR_READY (Bit 13)                              */\n#define MEMCTRL_MEM_STATUS_REG_CMI_CLEAR_READY_Msk (0x2000UL)       /*!< CMI_CLEAR_READY (Bitfield-Mask: 0x01)                 */\n#define MEMCTRL_MEM_STATUS_REG_CMI_NOT_READY_Pos (12UL)             /*!< CMI_NOT_READY (Bit 12)                                */\n#define MEMCTRL_MEM_STATUS_REG_CMI_NOT_READY_Msk (0x1000UL)         /*!< CMI_NOT_READY (Bitfield-Mask: 0x01)                   */\n#define MEMCTRL_MEM_STATUS_REG_AHB2_WR_BUFF_CNT_Pos (8UL)           /*!< AHB2_WR_BUFF_CNT (Bit 8)                              */\n#define MEMCTRL_MEM_STATUS_REG_AHB2_WR_BUFF_CNT_Msk (0xf00UL)       /*!< AHB2_WR_BUFF_CNT (Bitfield-Mask: 0x0f)                */\n#define MEMCTRL_MEM_STATUS_REG_AHB_WR_BUFF_CNT_Pos (4UL)            /*!< AHB_WR_BUFF_CNT (Bit 4)                               */\n#define MEMCTRL_MEM_STATUS_REG_AHB_WR_BUFF_CNT_Msk (0xf0UL)         /*!< AHB_WR_BUFF_CNT (Bitfield-Mask: 0x0f)                 */\n#define MEMCTRL_MEM_STATUS_REG_AHB2_CLR_WR_BUFF_Pos (3UL)           /*!< AHB2_CLR_WR_BUFF (Bit 3)                              */\n#define MEMCTRL_MEM_STATUS_REG_AHB2_CLR_WR_BUFF_Msk (0x8UL)         /*!< AHB2_CLR_WR_BUFF (Bitfield-Mask: 0x01)                */\n#define MEMCTRL_MEM_STATUS_REG_AHB_CLR_WR_BUFF_Pos (2UL)            /*!< AHB_CLR_WR_BUFF (Bit 2)                               */\n#define MEMCTRL_MEM_STATUS_REG_AHB_CLR_WR_BUFF_Msk (0x4UL)          /*!< AHB_CLR_WR_BUFF (Bitfield-Mask: 0x01)                 */\n#define MEMCTRL_MEM_STATUS_REG_AHB2_WRITE_BUFF_Pos (1UL)            /*!< AHB2_WRITE_BUFF (Bit 1)                               */\n#define MEMCTRL_MEM_STATUS_REG_AHB2_WRITE_BUFF_Msk (0x2UL)          /*!< AHB2_WRITE_BUFF (Bitfield-Mask: 0x01)                 */\n#define MEMCTRL_MEM_STATUS_REG_AHB_WRITE_BUFF_Pos (0UL)             /*!< AHB_WRITE_BUFF (Bit 0)                                */\n#define MEMCTRL_MEM_STATUS_REG_AHB_WRITE_BUFF_Msk (0x1UL)           /*!< AHB_WRITE_BUFF (Bitfield-Mask: 0x01)                  */\n/* =====================================================  SNC_BASE_REG  ====================================================== */\n#define MEMCTRL_SNC_BASE_REG_SNC_BASE_ADDRESS_Pos (2UL)             /*!< SNC_BASE_ADDRESS (Bit 2)                              */\n#define MEMCTRL_SNC_BASE_REG_SNC_BASE_ADDRESS_Msk (0x7fffcUL)       /*!< SNC_BASE_ADDRESS (Bitfield-Mask: 0x1ffff)             */\n\n\n/* =========================================================================================================================== */\n/* ================                                           OTPC                                            ================ */\n/* =========================================================================================================================== */\n\n/* =====================================================  OTPC_MODE_REG  ===================================================== */\n#define OTPC_OTPC_MODE_REG_OTPC_MODE_PRG_SEL_Pos (6UL)              /*!< OTPC_MODE_PRG_SEL (Bit 6)                             */\n#define OTPC_OTPC_MODE_REG_OTPC_MODE_PRG_SEL_Msk (0xc0UL)           /*!< OTPC_MODE_PRG_SEL (Bitfield-Mask: 0x03)               */\n#define OTPC_OTPC_MODE_REG_OTPC_MODE_HT_MARG_EN_Pos (5UL)           /*!< OTPC_MODE_HT_MARG_EN (Bit 5)                          */\n#define OTPC_OTPC_MODE_REG_OTPC_MODE_HT_MARG_EN_Msk (0x20UL)        /*!< OTPC_MODE_HT_MARG_EN (Bitfield-Mask: 0x01)            */\n#define OTPC_OTPC_MODE_REG_OTPC_MODE_USE_TST_ROW_Pos (4UL)          /*!< OTPC_MODE_USE_TST_ROW (Bit 4)                         */\n#define OTPC_OTPC_MODE_REG_OTPC_MODE_USE_TST_ROW_Msk (0x10UL)       /*!< OTPC_MODE_USE_TST_ROW (Bitfield-Mask: 0x01)           */\n#define OTPC_OTPC_MODE_REG_OTPC_MODE_MODE_Pos (0UL)                 /*!< OTPC_MODE_MODE (Bit 0)                                */\n#define OTPC_OTPC_MODE_REG_OTPC_MODE_MODE_Msk (0x7UL)               /*!< OTPC_MODE_MODE (Bitfield-Mask: 0x07)                  */\n/* ====================================================  OTPC_PADDR_REG  ===================================================== */\n#define OTPC_OTPC_PADDR_REG_OTPC_PADDR_Pos (0UL)                    /*!< OTPC_PADDR (Bit 0)                                    */\n#define OTPC_OTPC_PADDR_REG_OTPC_PADDR_Msk (0x3ffUL)                /*!< OTPC_PADDR (Bitfield-Mask: 0x3ff)                     */\n/* ====================================================  OTPC_PWORD_REG  ===================================================== */\n#define OTPC_OTPC_PWORD_REG_OTPC_PWORD_Pos (0UL)                    /*!< OTPC_PWORD (Bit 0)                                    */\n#define OTPC_OTPC_PWORD_REG_OTPC_PWORD_Msk (0xffffffffUL)           /*!< OTPC_PWORD (Bitfield-Mask: 0xffffffff)                */\n/* =====================================================  OTPC_STAT_REG  ===================================================== */\n#define OTPC_OTPC_STAT_REG_OTPC_STAT_MRDY_Pos (2UL)                 /*!< OTPC_STAT_MRDY (Bit 2)                                */\n#define OTPC_OTPC_STAT_REG_OTPC_STAT_MRDY_Msk (0x4UL)               /*!< OTPC_STAT_MRDY (Bitfield-Mask: 0x01)                  */\n#define OTPC_OTPC_STAT_REG_OTPC_STAT_PBUF_EMPTY_Pos (1UL)           /*!< OTPC_STAT_PBUF_EMPTY (Bit 1)                          */\n#define OTPC_OTPC_STAT_REG_OTPC_STAT_PBUF_EMPTY_Msk (0x2UL)         /*!< OTPC_STAT_PBUF_EMPTY (Bitfield-Mask: 0x01)            */\n#define OTPC_OTPC_STAT_REG_OTPC_STAT_PRDY_Pos (0UL)                 /*!< OTPC_STAT_PRDY (Bit 0)                                */\n#define OTPC_OTPC_STAT_REG_OTPC_STAT_PRDY_Msk (0x1UL)               /*!< OTPC_STAT_PRDY (Bitfield-Mask: 0x01)                  */\n/* =====================================================  OTPC_TIM1_REG  ===================================================== */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_US_T_CSP_Pos (24UL)            /*!< OTPC_TIM1_US_T_CSP (Bit 24)                           */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_US_T_CSP_Msk (0x7f000000UL)    /*!< OTPC_TIM1_US_T_CSP (Bitfield-Mask: 0x7f)              */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_US_T_CS_Pos (20UL)             /*!< OTPC_TIM1_US_T_CS (Bit 20)                            */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_US_T_CS_Msk (0xf00000UL)       /*!< OTPC_TIM1_US_T_CS (Bitfield-Mask: 0x0f)               */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_US_T_PL_Pos (16UL)             /*!< OTPC_TIM1_US_T_PL (Bit 16)                            */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_US_T_PL_Msk (0xf0000UL)        /*!< OTPC_TIM1_US_T_PL (Bitfield-Mask: 0x0f)               */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_CC_T_RD_Pos (12UL)             /*!< OTPC_TIM1_CC_T_RD (Bit 12)                            */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_CC_T_RD_Msk (0x7000UL)         /*!< OTPC_TIM1_CC_T_RD (Bitfield-Mask: 0x07)               */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_CC_T_20NS_Pos (8UL)            /*!< OTPC_TIM1_CC_T_20NS (Bit 8)                           */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_CC_T_20NS_Msk (0x300UL)        /*!< OTPC_TIM1_CC_T_20NS (Bitfield-Mask: 0x03)             */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_CC_T_1US_Pos (0UL)             /*!< OTPC_TIM1_CC_T_1US (Bit 0)                            */\n#define OTPC_OTPC_TIM1_REG_OTPC_TIM1_CC_T_1US_Msk (0x7fUL)          /*!< OTPC_TIM1_CC_T_1US (Bitfield-Mask: 0x7f)              */\n/* =====================================================  OTPC_TIM2_REG  ===================================================== */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_ADD_CC_EN_Pos (31UL)        /*!< OTPC_TIM2_US_ADD_CC_EN (Bit 31)                       */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_ADD_CC_EN_Msk (0x80000000UL) /*!< OTPC_TIM2_US_ADD_CC_EN (Bitfield-Mask: 0x01)         */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_SAS_Pos (29UL)            /*!< OTPC_TIM2_US_T_SAS (Bit 29)                           */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_SAS_Msk (0x60000000UL)    /*!< OTPC_TIM2_US_T_SAS (Bitfield-Mask: 0x03)              */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PPH_Pos (24UL)            /*!< OTPC_TIM2_US_T_PPH (Bit 24)                           */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PPH_Msk (0x1f000000UL)    /*!< OTPC_TIM2_US_T_PPH (Bitfield-Mask: 0x1f)              */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_VDS_Pos (21UL)            /*!< OTPC_TIM2_US_T_VDS (Bit 21)                           */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_VDS_Msk (0xe00000UL)      /*!< OTPC_TIM2_US_T_VDS (Bitfield-Mask: 0x07)              */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PPS_Pos (16UL)            /*!< OTPC_TIM2_US_T_PPS (Bit 16)                           */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PPS_Msk (0x1f0000UL)      /*!< OTPC_TIM2_US_T_PPS (Bitfield-Mask: 0x1f)              */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PPR_Pos (8UL)             /*!< OTPC_TIM2_US_T_PPR (Bit 8)                            */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PPR_Msk (0x7f00UL)        /*!< OTPC_TIM2_US_T_PPR (Bitfield-Mask: 0x7f)              */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PWI_Pos (5UL)             /*!< OTPC_TIM2_US_T_PWI (Bit 5)                            */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PWI_Msk (0xe0UL)          /*!< OTPC_TIM2_US_T_PWI (Bitfield-Mask: 0x07)              */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PW_Pos (0UL)              /*!< OTPC_TIM2_US_T_PW (Bit 0)                             */\n#define OTPC_OTPC_TIM2_REG_OTPC_TIM2_US_T_PW_Msk (0x1fUL)           /*!< OTPC_TIM2_US_T_PW (Bitfield-Mask: 0x1f)               */\n\n\n/* =========================================================================================================================== */\n/* ================                                            PDC                                            ================ */\n/* =========================================================================================================================== */\n\n/* ==================================================  PDC_ACKNOWLEDGE_REG  ================================================== */\n#define PDC_PDC_ACKNOWLEDGE_REG_PDC_ACKNOWLEDGE_Pos (0UL)           /*!< PDC_ACKNOWLEDGE (Bit 0)                               */\n#define PDC_PDC_ACKNOWLEDGE_REG_PDC_ACKNOWLEDGE_Msk (0x1fUL)        /*!< PDC_ACKNOWLEDGE (Bitfield-Mask: 0x1f)                 */\n/* =====================================================  PDC_CTRL0_REG  ===================================================== */\n#define PDC_PDC_CTRL0_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL0_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL0_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL0_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL0_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL0_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL0_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL0_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL0_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL0_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL0_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL0_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL0_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL0_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* ====================================================  PDC_CTRL10_REG  ===================================================== */\n#define PDC_PDC_CTRL10_REG_PDC_MASTER_Pos (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL10_REG_PDC_MASTER_Msk (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL10_REG_EN_COM_Pos     (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL10_REG_EN_COM_Msk     (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL10_REG_EN_PER_Pos     (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL10_REG_EN_PER_Msk     (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL10_REG_EN_TMR_Pos     (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL10_REG_EN_TMR_Msk     (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL10_REG_EN_XTAL_Pos    (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL10_REG_EN_XTAL_Msk    (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL10_REG_TRIG_ID_Pos    (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL10_REG_TRIG_ID_Msk    (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL10_REG_TRIG_SELECT_Pos (0UL)                    /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL10_REG_TRIG_SELECT_Msk (0x3UL)                  /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* ====================================================  PDC_CTRL11_REG  ===================================================== */\n#define PDC_PDC_CTRL11_REG_PDC_MASTER_Pos (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL11_REG_PDC_MASTER_Msk (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL11_REG_EN_COM_Pos     (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL11_REG_EN_COM_Msk     (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL11_REG_EN_PER_Pos     (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL11_REG_EN_PER_Msk     (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL11_REG_EN_TMR_Pos     (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL11_REG_EN_TMR_Msk     (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL11_REG_EN_XTAL_Pos    (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL11_REG_EN_XTAL_Msk    (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL11_REG_TRIG_ID_Pos    (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL11_REG_TRIG_ID_Msk    (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL11_REG_TRIG_SELECT_Pos (0UL)                    /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL11_REG_TRIG_SELECT_Msk (0x3UL)                  /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* ====================================================  PDC_CTRL12_REG  ===================================================== */\n#define PDC_PDC_CTRL12_REG_PDC_MASTER_Pos (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL12_REG_PDC_MASTER_Msk (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL12_REG_EN_COM_Pos     (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL12_REG_EN_COM_Msk     (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL12_REG_EN_PER_Pos     (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL12_REG_EN_PER_Msk     (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL12_REG_EN_TMR_Pos     (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL12_REG_EN_TMR_Msk     (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL12_REG_EN_XTAL_Pos    (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL12_REG_EN_XTAL_Msk    (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL12_REG_TRIG_ID_Pos    (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL12_REG_TRIG_ID_Msk    (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL12_REG_TRIG_SELECT_Pos (0UL)                    /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL12_REG_TRIG_SELECT_Msk (0x3UL)                  /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* ====================================================  PDC_CTRL13_REG  ===================================================== */\n#define PDC_PDC_CTRL13_REG_PDC_MASTER_Pos (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL13_REG_PDC_MASTER_Msk (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL13_REG_EN_COM_Pos     (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL13_REG_EN_COM_Msk     (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL13_REG_EN_PER_Pos     (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL13_REG_EN_PER_Msk     (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL13_REG_EN_TMR_Pos     (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL13_REG_EN_TMR_Msk     (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL13_REG_EN_XTAL_Pos    (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL13_REG_EN_XTAL_Msk    (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL13_REG_TRIG_ID_Pos    (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL13_REG_TRIG_ID_Msk    (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL13_REG_TRIG_SELECT_Pos (0UL)                    /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL13_REG_TRIG_SELECT_Msk (0x3UL)                  /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* ====================================================  PDC_CTRL14_REG  ===================================================== */\n#define PDC_PDC_CTRL14_REG_PDC_MASTER_Pos (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL14_REG_PDC_MASTER_Msk (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL14_REG_EN_COM_Pos     (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL14_REG_EN_COM_Msk     (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL14_REG_EN_PER_Pos     (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL14_REG_EN_PER_Msk     (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL14_REG_EN_TMR_Pos     (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL14_REG_EN_TMR_Msk     (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL14_REG_EN_XTAL_Pos    (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL14_REG_EN_XTAL_Msk    (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL14_REG_TRIG_ID_Pos    (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL14_REG_TRIG_ID_Msk    (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL14_REG_TRIG_SELECT_Pos (0UL)                    /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL14_REG_TRIG_SELECT_Msk (0x3UL)                  /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* ====================================================  PDC_CTRL15_REG  ===================================================== */\n#define PDC_PDC_CTRL15_REG_PDC_MASTER_Pos (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL15_REG_PDC_MASTER_Msk (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL15_REG_EN_COM_Pos     (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL15_REG_EN_COM_Msk     (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL15_REG_EN_PER_Pos     (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL15_REG_EN_PER_Msk     (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL15_REG_EN_TMR_Pos     (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL15_REG_EN_TMR_Msk     (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL15_REG_EN_XTAL_Pos    (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL15_REG_EN_XTAL_Msk    (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL15_REG_TRIG_ID_Pos    (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL15_REG_TRIG_ID_Msk    (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL15_REG_TRIG_SELECT_Pos (0UL)                    /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL15_REG_TRIG_SELECT_Msk (0x3UL)                  /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL1_REG  ===================================================== */\n#define PDC_PDC_CTRL1_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL1_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL1_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL1_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL1_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL1_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL1_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL1_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL1_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL1_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL1_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL1_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL1_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL1_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL2_REG  ===================================================== */\n#define PDC_PDC_CTRL2_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL2_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL2_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL2_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL2_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL2_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL2_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL2_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL2_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL2_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL2_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL2_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL2_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL2_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL3_REG  ===================================================== */\n#define PDC_PDC_CTRL3_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL3_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL3_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL3_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL3_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL3_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL3_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL3_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL3_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL3_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL3_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL3_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL3_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL3_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL4_REG  ===================================================== */\n#define PDC_PDC_CTRL4_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL4_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL4_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL4_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL4_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL4_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL4_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL4_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL4_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL4_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL4_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL4_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL4_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL4_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL5_REG  ===================================================== */\n#define PDC_PDC_CTRL5_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL5_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL5_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL5_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL5_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL5_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL5_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL5_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL5_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL5_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL5_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL5_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL5_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL5_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL6_REG  ===================================================== */\n#define PDC_PDC_CTRL6_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL6_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL6_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL6_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL6_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL6_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL6_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL6_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL6_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL6_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL6_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL6_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL6_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL6_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL7_REG  ===================================================== */\n#define PDC_PDC_CTRL7_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL7_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL7_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL7_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL7_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL7_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL7_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL7_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL7_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL7_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL7_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL7_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL7_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL7_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL8_REG  ===================================================== */\n#define PDC_PDC_CTRL8_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL8_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL8_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL8_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL8_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL8_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL8_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL8_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL8_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL8_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL8_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL8_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL8_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL8_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =====================================================  PDC_CTRL9_REG  ===================================================== */\n#define PDC_PDC_CTRL9_REG_PDC_MASTER_Pos  (11UL)                    /*!< PDC_MASTER (Bit 11)                                   */\n#define PDC_PDC_CTRL9_REG_PDC_MASTER_Msk  (0x1800UL)                /*!< PDC_MASTER (Bitfield-Mask: 0x03)                      */\n#define PDC_PDC_CTRL9_REG_EN_COM_Pos      (10UL)                    /*!< EN_COM (Bit 10)                                       */\n#define PDC_PDC_CTRL9_REG_EN_COM_Msk      (0x400UL)                 /*!< EN_COM (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL9_REG_EN_PER_Pos      (9UL)                     /*!< EN_PER (Bit 9)                                        */\n#define PDC_PDC_CTRL9_REG_EN_PER_Msk      (0x200UL)                 /*!< EN_PER (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL9_REG_EN_TMR_Pos      (8UL)                     /*!< EN_TMR (Bit 8)                                        */\n#define PDC_PDC_CTRL9_REG_EN_TMR_Msk      (0x100UL)                 /*!< EN_TMR (Bitfield-Mask: 0x01)                          */\n#define PDC_PDC_CTRL9_REG_EN_XTAL_Pos     (7UL)                     /*!< EN_XTAL (Bit 7)                                       */\n#define PDC_PDC_CTRL9_REG_EN_XTAL_Msk     (0x80UL)                  /*!< EN_XTAL (Bitfield-Mask: 0x01)                         */\n#define PDC_PDC_CTRL9_REG_TRIG_ID_Pos     (2UL)                     /*!< TRIG_ID (Bit 2)                                       */\n#define PDC_PDC_CTRL9_REG_TRIG_ID_Msk     (0x7cUL)                  /*!< TRIG_ID (Bitfield-Mask: 0x1f)                         */\n#define PDC_PDC_CTRL9_REG_TRIG_SELECT_Pos (0UL)                     /*!< TRIG_SELECT (Bit 0)                                   */\n#define PDC_PDC_CTRL9_REG_TRIG_SELECT_Msk (0x3UL)                   /*!< TRIG_SELECT (Bitfield-Mask: 0x03)                     */\n/* =================================================  PDC_PENDING_CM33_REG  ================================================== */\n#define PDC_PDC_PENDING_CM33_REG_PDC_PENDING_Pos (0UL)              /*!< PDC_PENDING (Bit 0)                                   */\n#define PDC_PDC_PENDING_CM33_REG_PDC_PENDING_Msk (0xffffUL)         /*!< PDC_PENDING (Bitfield-Mask: 0xffff)                   */\n/* =================================================  PDC_PENDING_CMAC_REG  ================================================== */\n#define PDC_PDC_PENDING_CMAC_REG_PDC_PENDING_Pos (0UL)              /*!< PDC_PENDING (Bit 0)                                   */\n#define PDC_PDC_PENDING_CMAC_REG_PDC_PENDING_Msk (0xffffUL)         /*!< PDC_PENDING (Bitfield-Mask: 0xffff)                   */\n/* ====================================================  PDC_PENDING_REG  ==================================================== */\n#define PDC_PDC_PENDING_REG_PDC_PENDING_Pos (0UL)                   /*!< PDC_PENDING (Bit 0)                                   */\n#define PDC_PDC_PENDING_REG_PDC_PENDING_Msk (0xffffUL)              /*!< PDC_PENDING (Bitfield-Mask: 0xffff)                   */\n/* ==================================================  PDC_PENDING_SNC_REG  ================================================== */\n#define PDC_PDC_PENDING_SNC_REG_PDC_PENDING_Pos (0UL)               /*!< PDC_PENDING (Bit 0)                                   */\n#define PDC_PDC_PENDING_SNC_REG_PDC_PENDING_Msk (0xffffUL)          /*!< PDC_PENDING (Bitfield-Mask: 0xffff)                   */\n/* ==================================================  PDC_SET_PENDING_REG  ================================================== */\n#define PDC_PDC_SET_PENDING_REG_PDC_SET_PENDING_Pos (0UL)           /*!< PDC_SET_PENDING (Bit 0)                               */\n#define PDC_PDC_SET_PENDING_REG_PDC_SET_PENDING_Msk (0x1fUL)        /*!< PDC_SET_PENDING (Bitfield-Mask: 0x1f)                 */\n\n\n/* =========================================================================================================================== */\n/* ================                                          PWMLED                                           ================ */\n/* =========================================================================================================================== */\n\n/* ====================================================  PWMLED_CTRL_REG  ==================================================== */\n#define PWMLED_PWMLED_CTRL_REG_LED2_LOAD_SEL_Pos (11UL)             /*!< LED2_LOAD_SEL (Bit 11)                                */\n#define PWMLED_PWMLED_CTRL_REG_LED2_LOAD_SEL_Msk (0x3800UL)         /*!< LED2_LOAD_SEL (Bitfield-Mask: 0x07)                   */\n#define PWMLED_PWMLED_CTRL_REG_LED1_LOAD_SEL_Pos (8UL)              /*!< LED1_LOAD_SEL (Bit 8)                                 */\n#define PWMLED_PWMLED_CTRL_REG_LED1_LOAD_SEL_Msk (0x700UL)          /*!< LED1_LOAD_SEL (Bitfield-Mask: 0x07)                   */\n#define PWMLED_PWMLED_CTRL_REG_LED2_EN_Pos (7UL)                    /*!< LED2_EN (Bit 7)                                       */\n#define PWMLED_PWMLED_CTRL_REG_LED2_EN_Msk (0x80UL)                 /*!< LED2_EN (Bitfield-Mask: 0x01)                         */\n#define PWMLED_PWMLED_CTRL_REG_LED1_EN_Pos (6UL)                    /*!< LED1_EN (Bit 6)                                       */\n#define PWMLED_PWMLED_CTRL_REG_LED1_EN_Msk (0x40UL)                 /*!< LED1_EN (Bitfield-Mask: 0x01)                         */\n#define PWMLED_PWMLED_CTRL_REG_LED_TRIM_Pos (2UL)                   /*!< LED_TRIM (Bit 2)                                      */\n#define PWMLED_PWMLED_CTRL_REG_LED_TRIM_Msk (0x3cUL)                /*!< LED_TRIM (Bitfield-Mask: 0x0f)                        */\n#define PWMLED_PWMLED_CTRL_REG_SW_PAUSE_EN_Pos (1UL)                /*!< SW_PAUSE_EN (Bit 1)                                   */\n#define PWMLED_PWMLED_CTRL_REG_SW_PAUSE_EN_Msk (0x2UL)              /*!< SW_PAUSE_EN (Bitfield-Mask: 0x01)                     */\n#define PWMLED_PWMLED_CTRL_REG_PWM_ENABLE_Pos (0UL)                 /*!< PWM_ENABLE (Bit 0)                                    */\n#define PWMLED_PWMLED_CTRL_REG_PWM_ENABLE_Msk (0x1UL)               /*!< PWM_ENABLE (Bitfield-Mask: 0x01)                      */\n/* ==============================================  PWMLED_DUTY_CYCLE_LED1_REG  =============================================== */\n#define PWMLED_PWMLED_DUTY_CYCLE_LED1_REG_LED1_PWM_START_CYCLE_Pos (8UL) /*!< LED1_PWM_START_CYCLE (Bit 8)                     */\n#define PWMLED_PWMLED_DUTY_CYCLE_LED1_REG_LED1_PWM_START_CYCLE_Msk (0xff00UL) /*!< LED1_PWM_START_CYCLE (Bitfield-Mask: 0xff)  */\n#define PWMLED_PWMLED_DUTY_CYCLE_LED1_REG_LED1_PWM_END_CYCLE_Pos (0UL) /*!< LED1_PWM_END_CYCLE (Bit 0)                         */\n#define PWMLED_PWMLED_DUTY_CYCLE_LED1_REG_LED1_PWM_END_CYCLE_Msk (0xffUL) /*!< LED1_PWM_END_CYCLE (Bitfield-Mask: 0xff)        */\n/* ==============================================  PWMLED_DUTY_CYCLE_LED2_REG  =============================================== */\n#define PWMLED_PWMLED_DUTY_CYCLE_LED2_REG_LED2_PWM_START_CYCLE_Pos (8UL) /*!< LED2_PWM_START_CYCLE (Bit 8)                     */\n#define PWMLED_PWMLED_DUTY_CYCLE_LED2_REG_LED2_PWM_START_CYCLE_Msk (0xff00UL) /*!< LED2_PWM_START_CYCLE (Bitfield-Mask: 0xff)  */\n#define PWMLED_PWMLED_DUTY_CYCLE_LED2_REG_LED2_PWM_END_CYCLE_Pos (0UL) /*!< LED2_PWM_END_CYCLE (Bit 0)                         */\n#define PWMLED_PWMLED_DUTY_CYCLE_LED2_REG_LED2_PWM_END_CYCLE_Msk (0xffUL) /*!< LED2_PWM_END_CYCLE (Bitfield-Mask: 0xff)        */\n/* =================================================  PWMLED_FREQUENCY_REG  ================================================== */\n#define PWMLED_PWMLED_FREQUENCY_REG_LED_PWM_FREQUENCY_Pos (0UL)     /*!< LED_PWM_FREQUENCY (Bit 0)                             */\n#define PWMLED_PWMLED_FREQUENCY_REG_LED_PWM_FREQUENCY_Msk (0xffUL)  /*!< LED_PWM_FREQUENCY (Bitfield-Mask: 0xff)               */\n\n\n/* =========================================================================================================================== */\n/* ================                                           QSPIC                                           ================ */\n/* =========================================================================================================================== */\n\n/* ==================================================  QSPIC_BURSTBRK_REG  =================================================== */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_SEC_HF_DS_Pos (20UL)         /*!< QSPIC_SEC_HF_DS (Bit 20)                              */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_SEC_HF_DS_Msk (0x100000UL)   /*!< QSPIC_SEC_HF_DS (Bitfield-Mask: 0x01)                 */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_BRK_TX_MD_Pos (18UL)         /*!< QSPIC_BRK_TX_MD (Bit 18)                              */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_BRK_TX_MD_Msk (0xc0000UL)    /*!< QSPIC_BRK_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_BRK_SZ_Pos (17UL)            /*!< QSPIC_BRK_SZ (Bit 17)                                 */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_BRK_SZ_Msk (0x20000UL)       /*!< QSPIC_BRK_SZ (Bitfield-Mask: 0x01)                    */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_BRK_EN_Pos (16UL)            /*!< QSPIC_BRK_EN (Bit 16)                                 */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_BRK_EN_Msk (0x10000UL)       /*!< QSPIC_BRK_EN (Bitfield-Mask: 0x01)                    */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_BRK_WRD_Pos (0UL)            /*!< QSPIC_BRK_WRD (Bit 0)                                 */\n#define QSPIC_QSPIC_BURSTBRK_REG_QSPIC_BRK_WRD_Msk (0xffffUL)       /*!< QSPIC_BRK_WRD (Bitfield-Mask: 0xffff)                 */\n/* ==================================================  QSPIC_BURSTCMDA_REG  ================================================== */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_DMY_TX_MD_Pos (30UL)        /*!< QSPIC_DMY_TX_MD (Bit 30)                              */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_DMY_TX_MD_Msk (0xc0000000UL) /*!< QSPIC_DMY_TX_MD (Bitfield-Mask: 0x03)                */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_EXT_TX_MD_Pos (28UL)        /*!< QSPIC_EXT_TX_MD (Bit 28)                              */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_EXT_TX_MD_Msk (0x30000000UL) /*!< QSPIC_EXT_TX_MD (Bitfield-Mask: 0x03)                */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_ADR_TX_MD_Pos (26UL)        /*!< QSPIC_ADR_TX_MD (Bit 26)                              */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_ADR_TX_MD_Msk (0xc000000UL) /*!< QSPIC_ADR_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_INST_TX_MD_Pos (24UL)       /*!< QSPIC_INST_TX_MD (Bit 24)                             */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_INST_TX_MD_Msk (0x3000000UL) /*!< QSPIC_INST_TX_MD (Bitfield-Mask: 0x03)               */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_EXT_BYTE_Pos (16UL)         /*!< QSPIC_EXT_BYTE (Bit 16)                               */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_EXT_BYTE_Msk (0xff0000UL)   /*!< QSPIC_EXT_BYTE (Bitfield-Mask: 0xff)                  */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_INST_WB_Pos (8UL)           /*!< QSPIC_INST_WB (Bit 8)                                 */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_INST_WB_Msk (0xff00UL)      /*!< QSPIC_INST_WB (Bitfield-Mask: 0xff)                   */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_INST_Pos (0UL)              /*!< QSPIC_INST (Bit 0)                                    */\n#define QSPIC_QSPIC_BURSTCMDA_REG_QSPIC_INST_Msk (0xffUL)           /*!< QSPIC_INST (Bitfield-Mask: 0xff)                      */\n/* ==================================================  QSPIC_BURSTCMDB_REG  ================================================== */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_DMY_FORCE_Pos (15UL)        /*!< QSPIC_DMY_FORCE (Bit 15)                              */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_DMY_FORCE_Msk (0x8000UL)    /*!< QSPIC_DMY_FORCE (Bitfield-Mask: 0x01)                 */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_CS_HIGH_MIN_Pos (12UL)      /*!< QSPIC_CS_HIGH_MIN (Bit 12)                            */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_CS_HIGH_MIN_Msk (0x7000UL)  /*!< QSPIC_CS_HIGH_MIN (Bitfield-Mask: 0x07)               */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_WRAP_SIZE_Pos (10UL)        /*!< QSPIC_WRAP_SIZE (Bit 10)                              */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_WRAP_SIZE_Msk (0xc00UL)     /*!< QSPIC_WRAP_SIZE (Bitfield-Mask: 0x03)                 */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_WRAP_LEN_Pos (8UL)          /*!< QSPIC_WRAP_LEN (Bit 8)                                */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_WRAP_LEN_Msk (0x300UL)      /*!< QSPIC_WRAP_LEN (Bitfield-Mask: 0x03)                  */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_WRAP_MD_Pos (7UL)           /*!< QSPIC_WRAP_MD (Bit 7)                                 */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_WRAP_MD_Msk (0x80UL)        /*!< QSPIC_WRAP_MD (Bitfield-Mask: 0x01)                   */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_INST_MD_Pos (6UL)           /*!< QSPIC_INST_MD (Bit 6)                                 */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_INST_MD_Msk (0x40UL)        /*!< QSPIC_INST_MD (Bitfield-Mask: 0x01)                   */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_DMY_NUM_Pos (4UL)           /*!< QSPIC_DMY_NUM (Bit 4)                                 */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_DMY_NUM_Msk (0x30UL)        /*!< QSPIC_DMY_NUM (Bitfield-Mask: 0x03)                   */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_EXT_HF_DS_Pos (3UL)         /*!< QSPIC_EXT_HF_DS (Bit 3)                               */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_EXT_HF_DS_Msk (0x8UL)       /*!< QSPIC_EXT_HF_DS (Bitfield-Mask: 0x01)                 */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_EXT_BYTE_EN_Pos (2UL)       /*!< QSPIC_EXT_BYTE_EN (Bit 2)                             */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_EXT_BYTE_EN_Msk (0x4UL)     /*!< QSPIC_EXT_BYTE_EN (Bitfield-Mask: 0x01)               */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_DAT_RX_MD_Pos (0UL)         /*!< QSPIC_DAT_RX_MD (Bit 0)                               */\n#define QSPIC_QSPIC_BURSTCMDB_REG_QSPIC_DAT_RX_MD_Msk (0x3UL)       /*!< QSPIC_DAT_RX_MD (Bitfield-Mask: 0x03)                 */\n/* ==================================================  QSPIC_CHCKERASE_REG  ================================================== */\n#define QSPIC_QSPIC_CHCKERASE_REG_QSPIC_CHCKERASE_Pos (0UL)         /*!< QSPIC_CHCKERASE (Bit 0)                               */\n#define QSPIC_QSPIC_CHCKERASE_REG_QSPIC_CHCKERASE_Msk (0xffffffffUL) /*!< QSPIC_CHCKERASE (Bitfield-Mask: 0xffffffff)          */\n/* ===================================================  QSPIC_CTRLBUS_REG  =================================================== */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_DIS_CS_Pos (4UL)              /*!< QSPIC_DIS_CS (Bit 4)                                  */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_DIS_CS_Msk (0x10UL)           /*!< QSPIC_DIS_CS (Bitfield-Mask: 0x01)                    */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_EN_CS_Pos (3UL)               /*!< QSPIC_EN_CS (Bit 3)                                   */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_EN_CS_Msk (0x8UL)             /*!< QSPIC_EN_CS (Bitfield-Mask: 0x01)                     */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_SET_QUAD_Pos (2UL)            /*!< QSPIC_SET_QUAD (Bit 2)                                */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_SET_QUAD_Msk (0x4UL)          /*!< QSPIC_SET_QUAD (Bitfield-Mask: 0x01)                  */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_SET_DUAL_Pos (1UL)            /*!< QSPIC_SET_DUAL (Bit 1)                                */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_SET_DUAL_Msk (0x2UL)          /*!< QSPIC_SET_DUAL (Bitfield-Mask: 0x01)                  */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_SET_SINGLE_Pos (0UL)          /*!< QSPIC_SET_SINGLE (Bit 0)                              */\n#define QSPIC_QSPIC_CTRLBUS_REG_QSPIC_SET_SINGLE_Msk (0x1UL)        /*!< QSPIC_SET_SINGLE (Bitfield-Mask: 0x01)                */\n/* ==================================================  QSPIC_CTRLMODE_REG  =================================================== */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_USE_32BA_Pos (13UL)          /*!< QSPIC_USE_32BA (Bit 13)                               */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_USE_32BA_Msk (0x2000UL)      /*!< QSPIC_USE_32BA (Bitfield-Mask: 0x01)                  */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_BUF_LIM_EN_Pos (12UL)        /*!< QSPIC_BUF_LIM_EN (Bit 12)                             */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_BUF_LIM_EN_Msk (0x1000UL)    /*!< QSPIC_BUF_LIM_EN (Bitfield-Mask: 0x01)                */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_PCLK_MD_Pos (9UL)            /*!< QSPIC_PCLK_MD (Bit 9)                                 */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_PCLK_MD_Msk (0xe00UL)        /*!< QSPIC_PCLK_MD (Bitfield-Mask: 0x07)                   */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_RPIPE_EN_Pos (8UL)           /*!< QSPIC_RPIPE_EN (Bit 8)                                */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_RPIPE_EN_Msk (0x100UL)       /*!< QSPIC_RPIPE_EN (Bitfield-Mask: 0x01)                  */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_RXD_NEG_Pos (7UL)            /*!< QSPIC_RXD_NEG (Bit 7)                                 */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_RXD_NEG_Msk (0x80UL)         /*!< QSPIC_RXD_NEG (Bitfield-Mask: 0x01)                   */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_HRDY_MD_Pos (6UL)            /*!< QSPIC_HRDY_MD (Bit 6)                                 */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_HRDY_MD_Msk (0x40UL)         /*!< QSPIC_HRDY_MD (Bitfield-Mask: 0x01)                   */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_IO3_DAT_Pos (5UL)            /*!< QSPIC_IO3_DAT (Bit 5)                                 */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_IO3_DAT_Msk (0x20UL)         /*!< QSPIC_IO3_DAT (Bitfield-Mask: 0x01)                   */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_IO2_DAT_Pos (4UL)            /*!< QSPIC_IO2_DAT (Bit 4)                                 */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_IO2_DAT_Msk (0x10UL)         /*!< QSPIC_IO2_DAT (Bitfield-Mask: 0x01)                   */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_IO3_OEN_Pos (3UL)            /*!< QSPIC_IO3_OEN (Bit 3)                                 */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_IO3_OEN_Msk (0x8UL)          /*!< QSPIC_IO3_OEN (Bitfield-Mask: 0x01)                   */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_IO2_OEN_Pos (2UL)            /*!< QSPIC_IO2_OEN (Bit 2)                                 */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_IO2_OEN_Msk (0x4UL)          /*!< QSPIC_IO2_OEN (Bitfield-Mask: 0x01)                   */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_CLK_MD_Pos (1UL)             /*!< QSPIC_CLK_MD (Bit 1)                                  */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_CLK_MD_Msk (0x2UL)           /*!< QSPIC_CLK_MD (Bitfield-Mask: 0x01)                    */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_AUTO_MD_Pos (0UL)            /*!< QSPIC_AUTO_MD (Bit 0)                                 */\n#define QSPIC_QSPIC_CTRLMODE_REG_QSPIC_AUTO_MD_Msk (0x1UL)          /*!< QSPIC_AUTO_MD (Bitfield-Mask: 0x01)                   */\n/* ==================================================  QSPIC_CTR_CTRL_REG  =================================================== */\n#define QSPIC_QSPIC_CTR_CTRL_REG_QSPIC_CTR_EN_Pos (0UL)             /*!< QSPIC_CTR_EN (Bit 0)                                  */\n#define QSPIC_QSPIC_CTR_CTRL_REG_QSPIC_CTR_EN_Msk (0x1UL)           /*!< QSPIC_CTR_EN (Bitfield-Mask: 0x01)                    */\n/* ==================================================  QSPIC_CTR_EADDR_REG  ================================================== */\n#define QSPIC_QSPIC_CTR_EADDR_REG_QSPIC_CTR_EADDR_Pos (10UL)        /*!< QSPIC_CTR_EADDR (Bit 10)                              */\n#define QSPIC_QSPIC_CTR_EADDR_REG_QSPIC_CTR_EADDR_Msk (0xfffffc00UL) /*!< QSPIC_CTR_EADDR (Bitfield-Mask: 0x3fffff)            */\n/* =================================================  QSPIC_CTR_KEY_0_3_REG  ================================================= */\n#define QSPIC_QSPIC_CTR_KEY_0_3_REG_QSPIC_CTR_KEY_0_3_Pos (0UL)     /*!< QSPIC_CTR_KEY_0_3 (Bit 0)                             */\n#define QSPIC_QSPIC_CTR_KEY_0_3_REG_QSPIC_CTR_KEY_0_3_Msk (0xffffffffUL) /*!< QSPIC_CTR_KEY_0_3 (Bitfield-Mask: 0xffffffff)    */\n/* ================================================  QSPIC_CTR_KEY_12_15_REG  ================================================ */\n#define QSPIC_QSPIC_CTR_KEY_12_15_REG_QSPIC_CTR_KEY_12_15_Pos (0UL) /*!< QSPIC_CTR_KEY_12_15 (Bit 0)                           */\n#define QSPIC_QSPIC_CTR_KEY_12_15_REG_QSPIC_CTR_KEY_12_15_Msk (0xffffffffUL) /*!< QSPIC_CTR_KEY_12_15 (Bitfield-Mask: 0xffffffff) */\n/* ================================================  QSPIC_CTR_KEY_16_19_REG  ================================================ */\n#define QSPIC_QSPIC_CTR_KEY_16_19_REG_QSPIC_CTR_KEY_16_19_Pos (0UL) /*!< QSPIC_CTR_KEY_16_19 (Bit 0)                           */\n#define QSPIC_QSPIC_CTR_KEY_16_19_REG_QSPIC_CTR_KEY_16_19_Msk (0xffffffffUL) /*!< QSPIC_CTR_KEY_16_19 (Bitfield-Mask: 0xffffffff) */\n/* ================================================  QSPIC_CTR_KEY_20_23_REG  ================================================ */\n#define QSPIC_QSPIC_CTR_KEY_20_23_REG_QSPIC_CTR_KEY_20_23_Pos (0UL) /*!< QSPIC_CTR_KEY_20_23 (Bit 0)                           */\n#define QSPIC_QSPIC_CTR_KEY_20_23_REG_QSPIC_CTR_KEY_20_23_Msk (0xffffffffUL) /*!< QSPIC_CTR_KEY_20_23 (Bitfield-Mask: 0xffffffff) */\n/* ================================================  QSPIC_CTR_KEY_24_27_REG  ================================================ */\n#define QSPIC_QSPIC_CTR_KEY_24_27_REG_QSPIC_CTR_KEY_24_27_Pos (0UL) /*!< QSPIC_CTR_KEY_24_27 (Bit 0)                           */\n#define QSPIC_QSPIC_CTR_KEY_24_27_REG_QSPIC_CTR_KEY_24_27_Msk (0xffffffffUL) /*!< QSPIC_CTR_KEY_24_27 (Bitfield-Mask: 0xffffffff) */\n/* ================================================  QSPIC_CTR_KEY_28_31_REG  ================================================ */\n#define QSPIC_QSPIC_CTR_KEY_28_31_REG_QSPIC_CTR_KEY_28_31_Pos (0UL) /*!< QSPIC_CTR_KEY_28_31 (Bit 0)                           */\n#define QSPIC_QSPIC_CTR_KEY_28_31_REG_QSPIC_CTR_KEY_28_31_Msk (0xffffffffUL) /*!< QSPIC_CTR_KEY_28_31 (Bitfield-Mask: 0xffffffff) */\n/* =================================================  QSPIC_CTR_KEY_4_7_REG  ================================================= */\n#define QSPIC_QSPIC_CTR_KEY_4_7_REG_QSPIC_CTR_KEY_4_7_Pos (0UL)     /*!< QSPIC_CTR_KEY_4_7 (Bit 0)                             */\n#define QSPIC_QSPIC_CTR_KEY_4_7_REG_QSPIC_CTR_KEY_4_7_Msk (0xffffffffUL) /*!< QSPIC_CTR_KEY_4_7 (Bitfield-Mask: 0xffffffff)    */\n/* ================================================  QSPIC_CTR_KEY_8_11_REG  ================================================= */\n#define QSPIC_QSPIC_CTR_KEY_8_11_REG_QSPIC_CTR_KEY_8_11_Pos (0UL)   /*!< QSPIC_CTR_KEY_8_11 (Bit 0)                            */\n#define QSPIC_QSPIC_CTR_KEY_8_11_REG_QSPIC_CTR_KEY_8_11_Msk (0xffffffffUL) /*!< QSPIC_CTR_KEY_8_11 (Bitfield-Mask: 0xffffffff) */\n/* ================================================  QSPIC_CTR_NONCE_0_3_REG  ================================================ */\n#define QSPIC_QSPIC_CTR_NONCE_0_3_REG_QSPIC_CTR_NONCE_0_3_Pos (0UL) /*!< QSPIC_CTR_NONCE_0_3 (Bit 0)                           */\n#define QSPIC_QSPIC_CTR_NONCE_0_3_REG_QSPIC_CTR_NONCE_0_3_Msk (0xffffffffUL) /*!< QSPIC_CTR_NONCE_0_3 (Bitfield-Mask: 0xffffffff) */\n/* ================================================  QSPIC_CTR_NONCE_4_7_REG  ================================================ */\n#define QSPIC_QSPIC_CTR_NONCE_4_7_REG_QSPIC_CTR_NONCE_4_7_Pos (0UL) /*!< QSPIC_CTR_NONCE_4_7 (Bit 0)                           */\n#define QSPIC_QSPIC_CTR_NONCE_4_7_REG_QSPIC_CTR_NONCE_4_7_Msk (0xffffffffUL) /*!< QSPIC_CTR_NONCE_4_7 (Bitfield-Mask: 0xffffffff) */\n/* ==================================================  QSPIC_CTR_SADDR_REG  ================================================== */\n#define QSPIC_QSPIC_CTR_SADDR_REG_QSPIC_CTR_SADDR_Pos (10UL)        /*!< QSPIC_CTR_SADDR (Bit 10)                              */\n#define QSPIC_QSPIC_CTR_SADDR_REG_QSPIC_CTR_SADDR_Msk (0xfffffc00UL) /*!< QSPIC_CTR_SADDR (Bitfield-Mask: 0x3fffff)            */\n/* ==================================================  QSPIC_DUMMYDATA_REG  ================================================== */\n#define QSPIC_QSPIC_DUMMYDATA_REG_QSPIC_DUMMYDATA_Pos (0UL)         /*!< QSPIC_DUMMYDATA (Bit 0)                               */\n#define QSPIC_QSPIC_DUMMYDATA_REG_QSPIC_DUMMYDATA_Msk (0xffffffffUL) /*!< QSPIC_DUMMYDATA (Bitfield-Mask: 0xffffffff)          */\n/* ==================================================  QSPIC_ERASECMDA_REG  ================================================== */\n#define QSPIC_QSPIC_ERASECMDA_REG_QSPIC_RES_INST_Pos (24UL)         /*!< QSPIC_RES_INST (Bit 24)                               */\n#define QSPIC_QSPIC_ERASECMDA_REG_QSPIC_RES_INST_Msk (0xff000000UL) /*!< QSPIC_RES_INST (Bitfield-Mask: 0xff)                  */\n#define QSPIC_QSPIC_ERASECMDA_REG_QSPIC_SUS_INST_Pos (16UL)         /*!< QSPIC_SUS_INST (Bit 16)                               */\n#define QSPIC_QSPIC_ERASECMDA_REG_QSPIC_SUS_INST_Msk (0xff0000UL)   /*!< QSPIC_SUS_INST (Bitfield-Mask: 0xff)                  */\n#define QSPIC_QSPIC_ERASECMDA_REG_QSPIC_WEN_INST_Pos (8UL)          /*!< QSPIC_WEN_INST (Bit 8)                                */\n#define QSPIC_QSPIC_ERASECMDA_REG_QSPIC_WEN_INST_Msk (0xff00UL)     /*!< QSPIC_WEN_INST (Bitfield-Mask: 0xff)                  */\n#define QSPIC_QSPIC_ERASECMDA_REG_QSPIC_ERS_INST_Pos (0UL)          /*!< QSPIC_ERS_INST (Bit 0)                                */\n#define QSPIC_QSPIC_ERASECMDA_REG_QSPIC_ERS_INST_Msk (0xffUL)       /*!< QSPIC_ERS_INST (Bitfield-Mask: 0xff)                  */\n/* ==================================================  QSPIC_ERASECMDB_REG  ================================================== */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_RESSUS_DLY_Pos (24UL)       /*!< QSPIC_RESSUS_DLY (Bit 24)                             */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_RESSUS_DLY_Msk (0x3f000000UL) /*!< QSPIC_RESSUS_DLY (Bitfield-Mask: 0x3f)              */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_ERSRES_HLD_Pos (16UL)       /*!< QSPIC_ERSRES_HLD (Bit 16)                             */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_ERSRES_HLD_Msk (0xf0000UL)  /*!< QSPIC_ERSRES_HLD (Bitfield-Mask: 0x0f)                */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_ERS_CS_HI_Pos (10UL)        /*!< QSPIC_ERS_CS_HI (Bit 10)                              */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_ERS_CS_HI_Msk (0x7c00UL)    /*!< QSPIC_ERS_CS_HI (Bitfield-Mask: 0x1f)                 */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_EAD_TX_MD_Pos (8UL)         /*!< QSPIC_EAD_TX_MD (Bit 8)                               */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_EAD_TX_MD_Msk (0x300UL)     /*!< QSPIC_EAD_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_RES_TX_MD_Pos (6UL)         /*!< QSPIC_RES_TX_MD (Bit 6)                               */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_RES_TX_MD_Msk (0xc0UL)      /*!< QSPIC_RES_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_SUS_TX_MD_Pos (4UL)         /*!< QSPIC_SUS_TX_MD (Bit 4)                               */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_SUS_TX_MD_Msk (0x30UL)      /*!< QSPIC_SUS_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_WEN_TX_MD_Pos (2UL)         /*!< QSPIC_WEN_TX_MD (Bit 2)                               */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_WEN_TX_MD_Msk (0xcUL)       /*!< QSPIC_WEN_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_ERS_TX_MD_Pos (0UL)         /*!< QSPIC_ERS_TX_MD (Bit 0)                               */\n#define QSPIC_QSPIC_ERASECMDB_REG_QSPIC_ERS_TX_MD_Msk (0x3UL)       /*!< QSPIC_ERS_TX_MD (Bitfield-Mask: 0x03)                 */\n/* ==================================================  QSPIC_ERASECTRL_REG  ================================================== */\n#define QSPIC_QSPIC_ERASECTRL_REG_QSPIC_ERS_STATE_Pos (25UL)        /*!< QSPIC_ERS_STATE (Bit 25)                              */\n#define QSPIC_QSPIC_ERASECTRL_REG_QSPIC_ERS_STATE_Msk (0xe000000UL) /*!< QSPIC_ERS_STATE (Bitfield-Mask: 0x07)                 */\n#define QSPIC_QSPIC_ERASECTRL_REG_QSPIC_ERASE_EN_Pos (24UL)         /*!< QSPIC_ERASE_EN (Bit 24)                               */\n#define QSPIC_QSPIC_ERASECTRL_REG_QSPIC_ERASE_EN_Msk (0x1000000UL)  /*!< QSPIC_ERASE_EN (Bitfield-Mask: 0x01)                  */\n#define QSPIC_QSPIC_ERASECTRL_REG_QSPIC_ERS_ADDR_Pos (4UL)          /*!< QSPIC_ERS_ADDR (Bit 4)                                */\n#define QSPIC_QSPIC_ERASECTRL_REG_QSPIC_ERS_ADDR_Msk (0xfffff0UL)   /*!< QSPIC_ERS_ADDR (Bitfield-Mask: 0xfffff)               */\n/* =====================================================  QSPIC_GP_REG  ====================================================== */\n#define QSPIC_QSPIC_GP_REG_QSPIC_PADS_SLEW_Pos (3UL)                /*!< QSPIC_PADS_SLEW (Bit 3)                               */\n#define QSPIC_QSPIC_GP_REG_QSPIC_PADS_SLEW_Msk (0x18UL)             /*!< QSPIC_PADS_SLEW (Bitfield-Mask: 0x03)                 */\n#define QSPIC_QSPIC_GP_REG_QSPIC_PADS_DRV_Pos (1UL)                 /*!< QSPIC_PADS_DRV (Bit 1)                                */\n#define QSPIC_QSPIC_GP_REG_QSPIC_PADS_DRV_Msk (0x6UL)               /*!< QSPIC_PADS_DRV (Bitfield-Mask: 0x03)                  */\n/* ==================================================  QSPIC_READDATA_REG  =================================================== */\n#define QSPIC_QSPIC_READDATA_REG_QSPIC_READDATA_Pos (0UL)           /*!< QSPIC_READDATA (Bit 0)                                */\n#define QSPIC_QSPIC_READDATA_REG_QSPIC_READDATA_Msk (0xffffffffUL)  /*!< QSPIC_READDATA (Bitfield-Mask: 0xffffffff)            */\n/* ==================================================  QSPIC_RECVDATA_REG  =================================================== */\n#define QSPIC_QSPIC_RECVDATA_REG_QSPIC_RECVDATA_Pos (0UL)           /*!< QSPIC_RECVDATA (Bit 0)                                */\n#define QSPIC_QSPIC_RECVDATA_REG_QSPIC_RECVDATA_Msk (0xffffffffUL)  /*!< QSPIC_RECVDATA (Bitfield-Mask: 0xffffffff)            */\n/* ==================================================  QSPIC_STATUSCMD_REG  ================================================== */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_STSDLY_SEL_Pos (22UL)       /*!< QSPIC_STSDLY_SEL (Bit 22)                             */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_STSDLY_SEL_Msk (0x400000UL) /*!< QSPIC_STSDLY_SEL (Bitfield-Mask: 0x01)                */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_RESSTS_DLY_Pos (16UL)       /*!< QSPIC_RESSTS_DLY (Bit 16)                             */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_RESSTS_DLY_Msk (0x3f0000UL) /*!< QSPIC_RESSTS_DLY (Bitfield-Mask: 0x3f)                */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_BUSY_VAL_Pos (15UL)         /*!< QSPIC_BUSY_VAL (Bit 15)                               */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_BUSY_VAL_Msk (0x8000UL)     /*!< QSPIC_BUSY_VAL (Bitfield-Mask: 0x01)                  */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_BUSY_POS_Pos (12UL)         /*!< QSPIC_BUSY_POS (Bit 12)                               */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_BUSY_POS_Msk (0x7000UL)     /*!< QSPIC_BUSY_POS (Bitfield-Mask: 0x07)                  */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_RSTAT_RX_MD_Pos (10UL)      /*!< QSPIC_RSTAT_RX_MD (Bit 10)                            */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_RSTAT_RX_MD_Msk (0xc00UL)   /*!< QSPIC_RSTAT_RX_MD (Bitfield-Mask: 0x03)               */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_RSTAT_TX_MD_Pos (8UL)       /*!< QSPIC_RSTAT_TX_MD (Bit 8)                             */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_RSTAT_TX_MD_Msk (0x300UL)   /*!< QSPIC_RSTAT_TX_MD (Bitfield-Mask: 0x03)               */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_RSTAT_INST_Pos (0UL)        /*!< QSPIC_RSTAT_INST (Bit 0)                              */\n#define QSPIC_QSPIC_STATUSCMD_REG_QSPIC_RSTAT_INST_Msk (0xffUL)     /*!< QSPIC_RSTAT_INST (Bitfield-Mask: 0xff)                */\n/* ===================================================  QSPIC_STATUS_REG  ==================================================== */\n#define QSPIC_QSPIC_STATUS_REG_QSPIC_BUSY_Pos (0UL)                 /*!< QSPIC_BUSY (Bit 0)                                    */\n#define QSPIC_QSPIC_STATUS_REG_QSPIC_BUSY_Msk (0x1UL)               /*!< QSPIC_BUSY (Bitfield-Mask: 0x01)                      */\n/* ===================================================  QSPIC_UCODE_START  =================================================== */\n#define QSPIC_QSPIC_UCODE_START_QSPIC_UCODE_X_Pos (0UL)             /*!< QSPIC_UCODE_X (Bit 0)                                 */\n#define QSPIC_QSPIC_UCODE_START_QSPIC_UCODE_X_Msk (0xffffffffUL)    /*!< QSPIC_UCODE_X (Bitfield-Mask: 0xffffffff)             */\n/* ==================================================  QSPIC_WRITEDATA_REG  ================================================== */\n#define QSPIC_QSPIC_WRITEDATA_REG_QSPIC_WRITEDATA_Pos (0UL)         /*!< QSPIC_WRITEDATA (Bit 0)                               */\n#define QSPIC_QSPIC_WRITEDATA_REG_QSPIC_WRITEDATA_Msk (0xffffffffUL) /*!< QSPIC_WRITEDATA (Bitfield-Mask: 0xffffffff)          */\n\n\n/* =========================================================================================================================== */\n/* ================                                          QSPIC2                                           ================ */\n/* =========================================================================================================================== */\n\n/* =================================================  QSPIC2_AWRITECMD_REG  ================================================== */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_CS_HIGH_MIN_Pos (14UL) /*!< QSPIC_WR_CS_HIGH_MIN (Bit 14)                         */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_CS_HIGH_MIN_Msk (0x7c000UL) /*!< QSPIC_WR_CS_HIGH_MIN (Bitfield-Mask: 0x1f)       */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_DAT_TX_MD_Pos (12UL)   /*!< QSPIC_WR_DAT_TX_MD (Bit 12)                           */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_DAT_TX_MD_Msk (0x3000UL) /*!< QSPIC_WR_DAT_TX_MD (Bitfield-Mask: 0x03)            */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_ADR_TX_MD_Pos (10UL)   /*!< QSPIC_WR_ADR_TX_MD (Bit 10)                           */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_ADR_TX_MD_Msk (0xc00UL) /*!< QSPIC_WR_ADR_TX_MD (Bitfield-Mask: 0x03)             */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_INST_TX_MD_Pos (8UL)   /*!< QSPIC_WR_INST_TX_MD (Bit 8)                           */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_INST_TX_MD_Msk (0x300UL) /*!< QSPIC_WR_INST_TX_MD (Bitfield-Mask: 0x03)           */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_INST_Pos (0UL)         /*!< QSPIC_WR_INST (Bit 0)                                 */\n#define QSPIC2_QSPIC2_AWRITECMD_REG_QSPIC_WR_INST_Msk (0xffUL)      /*!< QSPIC_WR_INST (Bitfield-Mask: 0xff)                   */\n/* ==================================================  QSPIC2_BURSTBRK_REG  ================================================== */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_SEC_HF_DS_Pos (20UL)       /*!< QSPIC_SEC_HF_DS (Bit 20)                              */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_SEC_HF_DS_Msk (0x100000UL) /*!< QSPIC_SEC_HF_DS (Bitfield-Mask: 0x01)                 */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_BRK_TX_MD_Pos (18UL)       /*!< QSPIC_BRK_TX_MD (Bit 18)                              */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_BRK_TX_MD_Msk (0xc0000UL)  /*!< QSPIC_BRK_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_BRK_SZ_Pos (17UL)          /*!< QSPIC_BRK_SZ (Bit 17)                                 */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_BRK_SZ_Msk (0x20000UL)     /*!< QSPIC_BRK_SZ (Bitfield-Mask: 0x01)                    */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_BRK_EN_Pos (16UL)          /*!< QSPIC_BRK_EN (Bit 16)                                 */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_BRK_EN_Msk (0x10000UL)     /*!< QSPIC_BRK_EN (Bitfield-Mask: 0x01)                    */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_BRK_WRD_Pos (0UL)          /*!< QSPIC_BRK_WRD (Bit 0)                                 */\n#define QSPIC2_QSPIC2_BURSTBRK_REG_QSPIC_BRK_WRD_Msk (0xffffUL)     /*!< QSPIC_BRK_WRD (Bitfield-Mask: 0xffff)                 */\n/* =================================================  QSPIC2_BURSTCMDA_REG  ================================================== */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_DMY_TX_MD_Pos (30UL)      /*!< QSPIC_DMY_TX_MD (Bit 30)                              */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_DMY_TX_MD_Msk (0xc0000000UL) /*!< QSPIC_DMY_TX_MD (Bitfield-Mask: 0x03)              */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_EXT_TX_MD_Pos (28UL)      /*!< QSPIC_EXT_TX_MD (Bit 28)                              */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_EXT_TX_MD_Msk (0x30000000UL) /*!< QSPIC_EXT_TX_MD (Bitfield-Mask: 0x03)              */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_ADR_TX_MD_Pos (26UL)      /*!< QSPIC_ADR_TX_MD (Bit 26)                              */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_ADR_TX_MD_Msk (0xc000000UL) /*!< QSPIC_ADR_TX_MD (Bitfield-Mask: 0x03)               */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_INST_TX_MD_Pos (24UL)     /*!< QSPIC_INST_TX_MD (Bit 24)                             */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_INST_TX_MD_Msk (0x3000000UL) /*!< QSPIC_INST_TX_MD (Bitfield-Mask: 0x03)             */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_EXT_BYTE_Pos (16UL)       /*!< QSPIC_EXT_BYTE (Bit 16)                               */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_EXT_BYTE_Msk (0xff0000UL) /*!< QSPIC_EXT_BYTE (Bitfield-Mask: 0xff)                  */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_INST_WB_Pos (8UL)         /*!< QSPIC_INST_WB (Bit 8)                                 */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_INST_WB_Msk (0xff00UL)    /*!< QSPIC_INST_WB (Bitfield-Mask: 0xff)                   */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_INST_Pos (0UL)            /*!< QSPIC_INST (Bit 0)                                    */\n#define QSPIC2_QSPIC2_BURSTCMDA_REG_QSPIC_INST_Msk (0xffUL)         /*!< QSPIC_INST (Bitfield-Mask: 0xff)                      */\n/* =================================================  QSPIC2_BURSTCMDB_REG  ================================================== */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_DMY_FORCE_Pos (15UL)      /*!< QSPIC_DMY_FORCE (Bit 15)                              */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_DMY_FORCE_Msk (0x8000UL)  /*!< QSPIC_DMY_FORCE (Bitfield-Mask: 0x01)                 */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_CS_HIGH_MIN_Pos (12UL)    /*!< QSPIC_CS_HIGH_MIN (Bit 12)                            */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_CS_HIGH_MIN_Msk (0x7000UL) /*!< QSPIC_CS_HIGH_MIN (Bitfield-Mask: 0x07)              */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_WRAP_SIZE_Pos (10UL)      /*!< QSPIC_WRAP_SIZE (Bit 10)                              */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_WRAP_SIZE_Msk (0xc00UL)   /*!< QSPIC_WRAP_SIZE (Bitfield-Mask: 0x03)                 */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_WRAP_LEN_Pos (8UL)        /*!< QSPIC_WRAP_LEN (Bit 8)                                */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_WRAP_LEN_Msk (0x300UL)    /*!< QSPIC_WRAP_LEN (Bitfield-Mask: 0x03)                  */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_WRAP_MD_Pos (7UL)         /*!< QSPIC_WRAP_MD (Bit 7)                                 */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_WRAP_MD_Msk (0x80UL)      /*!< QSPIC_WRAP_MD (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_INST_MD_Pos (6UL)         /*!< QSPIC_INST_MD (Bit 6)                                 */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_INST_MD_Msk (0x40UL)      /*!< QSPIC_INST_MD (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_DMY_NUM_Pos (4UL)         /*!< QSPIC_DMY_NUM (Bit 4)                                 */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_DMY_NUM_Msk (0x30UL)      /*!< QSPIC_DMY_NUM (Bitfield-Mask: 0x03)                   */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_EXT_HF_DS_Pos (3UL)       /*!< QSPIC_EXT_HF_DS (Bit 3)                               */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_EXT_HF_DS_Msk (0x8UL)     /*!< QSPIC_EXT_HF_DS (Bitfield-Mask: 0x01)                 */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_EXT_BYTE_EN_Pos (2UL)     /*!< QSPIC_EXT_BYTE_EN (Bit 2)                             */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_EXT_BYTE_EN_Msk (0x4UL)   /*!< QSPIC_EXT_BYTE_EN (Bitfield-Mask: 0x01)               */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_DAT_RX_MD_Pos (0UL)       /*!< QSPIC_DAT_RX_MD (Bit 0)                               */\n#define QSPIC2_QSPIC2_BURSTCMDB_REG_QSPIC_DAT_RX_MD_Msk (0x3UL)     /*!< QSPIC_DAT_RX_MD (Bitfield-Mask: 0x03)                 */\n/* =================================================  QSPIC2_CHCKERASE_REG  ================================================== */\n#define QSPIC2_QSPIC2_CHCKERASE_REG_QSPIC_CHCKERASE_Pos (0UL)       /*!< QSPIC_CHCKERASE (Bit 0)                               */\n#define QSPIC2_QSPIC2_CHCKERASE_REG_QSPIC_CHCKERASE_Msk (0xffffffffUL) /*!< QSPIC_CHCKERASE (Bitfield-Mask: 0xffffffff)        */\n/* ==================================================  QSPIC2_CTRLBUS_REG  =================================================== */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_DIS_CS_Pos (4UL)            /*!< QSPIC_DIS_CS (Bit 4)                                  */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_DIS_CS_Msk (0x10UL)         /*!< QSPIC_DIS_CS (Bitfield-Mask: 0x01)                    */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_EN_CS_Pos (3UL)             /*!< QSPIC_EN_CS (Bit 3)                                   */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_EN_CS_Msk (0x8UL)           /*!< QSPIC_EN_CS (Bitfield-Mask: 0x01)                     */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_SET_QUAD_Pos (2UL)          /*!< QSPIC_SET_QUAD (Bit 2)                                */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_SET_QUAD_Msk (0x4UL)        /*!< QSPIC_SET_QUAD (Bitfield-Mask: 0x01)                  */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_SET_DUAL_Pos (1UL)          /*!< QSPIC_SET_DUAL (Bit 1)                                */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_SET_DUAL_Msk (0x2UL)        /*!< QSPIC_SET_DUAL (Bitfield-Mask: 0x01)                  */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_SET_SINGLE_Pos (0UL)        /*!< QSPIC_SET_SINGLE (Bit 0)                              */\n#define QSPIC2_QSPIC2_CTRLBUS_REG_QSPIC_SET_SINGLE_Msk (0x1UL)      /*!< QSPIC_SET_SINGLE (Bitfield-Mask: 0x01)                */\n/* ==================================================  QSPIC2_CTRLMODE_REG  ================================================== */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_CLK_FREE_EN_Pos (16UL)     /*!< QSPIC_CLK_FREE_EN (Bit 16)                            */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_CLK_FREE_EN_Msk (0x10000UL) /*!< QSPIC_CLK_FREE_EN (Bitfield-Mask: 0x01)              */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_CS_MD_Pos (15UL)           /*!< QSPIC_CS_MD (Bit 15)                                  */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_CS_MD_Msk (0x8000UL)       /*!< QSPIC_CS_MD (Bitfield-Mask: 0x01)                     */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_SRAM_EN_Pos (14UL)         /*!< QSPIC_SRAM_EN (Bit 14)                                */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_SRAM_EN_Msk (0x4000UL)     /*!< QSPIC_SRAM_EN (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_USE_32BA_Pos (13UL)        /*!< QSPIC_USE_32BA (Bit 13)                               */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_USE_32BA_Msk (0x2000UL)    /*!< QSPIC_USE_32BA (Bitfield-Mask: 0x01)                  */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_FORCENSEQ_EN_Pos (12UL)    /*!< QSPIC_FORCENSEQ_EN (Bit 12)                           */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_FORCENSEQ_EN_Msk (0x1000UL) /*!< QSPIC_FORCENSEQ_EN (Bitfield-Mask: 0x01)             */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_PCLK_MD_Pos (9UL)          /*!< QSPIC_PCLK_MD (Bit 9)                                 */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_PCLK_MD_Msk (0xe00UL)      /*!< QSPIC_PCLK_MD (Bitfield-Mask: 0x07)                   */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_RPIPE_EN_Pos (8UL)         /*!< QSPIC_RPIPE_EN (Bit 8)                                */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_RPIPE_EN_Msk (0x100UL)     /*!< QSPIC_RPIPE_EN (Bitfield-Mask: 0x01)                  */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_RXD_NEG_Pos (7UL)          /*!< QSPIC_RXD_NEG (Bit 7)                                 */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_RXD_NEG_Msk (0x80UL)       /*!< QSPIC_RXD_NEG (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_HRDY_MD_Pos (6UL)          /*!< QSPIC_HRDY_MD (Bit 6)                                 */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_HRDY_MD_Msk (0x40UL)       /*!< QSPIC_HRDY_MD (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_IO3_DAT_Pos (5UL)          /*!< QSPIC_IO3_DAT (Bit 5)                                 */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_IO3_DAT_Msk (0x20UL)       /*!< QSPIC_IO3_DAT (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_IO2_DAT_Pos (4UL)          /*!< QSPIC_IO2_DAT (Bit 4)                                 */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_IO2_DAT_Msk (0x10UL)       /*!< QSPIC_IO2_DAT (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_IO3_OEN_Pos (3UL)          /*!< QSPIC_IO3_OEN (Bit 3)                                 */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_IO3_OEN_Msk (0x8UL)        /*!< QSPIC_IO3_OEN (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_IO2_OEN_Pos (2UL)          /*!< QSPIC_IO2_OEN (Bit 2)                                 */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_IO2_OEN_Msk (0x4UL)        /*!< QSPIC_IO2_OEN (Bitfield-Mask: 0x01)                   */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_CLK_MD_Pos (1UL)           /*!< QSPIC_CLK_MD (Bit 1)                                  */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_CLK_MD_Msk (0x2UL)         /*!< QSPIC_CLK_MD (Bitfield-Mask: 0x01)                    */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_AUTO_MD_Pos (0UL)          /*!< QSPIC_AUTO_MD (Bit 0)                                 */\n#define QSPIC2_QSPIC2_CTRLMODE_REG_QSPIC_AUTO_MD_Msk (0x1UL)        /*!< QSPIC_AUTO_MD (Bitfield-Mask: 0x01)                   */\n/* =================================================  QSPIC2_DUMMYDATA_REG  ================================================== */\n#define QSPIC2_QSPIC2_DUMMYDATA_REG_QSPIC_DUMMYDATA_Pos (0UL)       /*!< QSPIC_DUMMYDATA (Bit 0)                               */\n#define QSPIC2_QSPIC2_DUMMYDATA_REG_QSPIC_DUMMYDATA_Msk (0xffffffffUL) /*!< QSPIC_DUMMYDATA (Bitfield-Mask: 0xffffffff)        */\n/* =================================================  QSPIC2_ERASECMDA_REG  ================================================== */\n#define QSPIC2_QSPIC2_ERASECMDA_REG_QSPIC_RES_INST_Pos (24UL)       /*!< QSPIC_RES_INST (Bit 24)                               */\n#define QSPIC2_QSPIC2_ERASECMDA_REG_QSPIC_RES_INST_Msk (0xff000000UL) /*!< QSPIC_RES_INST (Bitfield-Mask: 0xff)                */\n#define QSPIC2_QSPIC2_ERASECMDA_REG_QSPIC_SUS_INST_Pos (16UL)       /*!< QSPIC_SUS_INST (Bit 16)                               */\n#define QSPIC2_QSPIC2_ERASECMDA_REG_QSPIC_SUS_INST_Msk (0xff0000UL) /*!< QSPIC_SUS_INST (Bitfield-Mask: 0xff)                  */\n#define QSPIC2_QSPIC2_ERASECMDA_REG_QSPIC_WEN_INST_Pos (8UL)        /*!< QSPIC_WEN_INST (Bit 8)                                */\n#define QSPIC2_QSPIC2_ERASECMDA_REG_QSPIC_WEN_INST_Msk (0xff00UL)   /*!< QSPIC_WEN_INST (Bitfield-Mask: 0xff)                  */\n#define QSPIC2_QSPIC2_ERASECMDA_REG_QSPIC_ERS_INST_Pos (0UL)        /*!< QSPIC_ERS_INST (Bit 0)                                */\n#define QSPIC2_QSPIC2_ERASECMDA_REG_QSPIC_ERS_INST_Msk (0xffUL)     /*!< QSPIC_ERS_INST (Bitfield-Mask: 0xff)                  */\n/* =================================================  QSPIC2_ERASECMDB_REG  ================================================== */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_RESSUS_DLY_Pos (24UL)     /*!< QSPIC_RESSUS_DLY (Bit 24)                             */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_RESSUS_DLY_Msk (0x3f000000UL) /*!< QSPIC_RESSUS_DLY (Bitfield-Mask: 0x3f)            */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_ERSRES_HLD_Pos (16UL)     /*!< QSPIC_ERSRES_HLD (Bit 16)                             */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_ERSRES_HLD_Msk (0xf0000UL) /*!< QSPIC_ERSRES_HLD (Bitfield-Mask: 0x0f)               */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_ERS_CS_HI_Pos (10UL)      /*!< QSPIC_ERS_CS_HI (Bit 10)                              */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_ERS_CS_HI_Msk (0x7c00UL)  /*!< QSPIC_ERS_CS_HI (Bitfield-Mask: 0x1f)                 */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_EAD_TX_MD_Pos (8UL)       /*!< QSPIC_EAD_TX_MD (Bit 8)                               */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_EAD_TX_MD_Msk (0x300UL)   /*!< QSPIC_EAD_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_RES_TX_MD_Pos (6UL)       /*!< QSPIC_RES_TX_MD (Bit 6)                               */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_RES_TX_MD_Msk (0xc0UL)    /*!< QSPIC_RES_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_SUS_TX_MD_Pos (4UL)       /*!< QSPIC_SUS_TX_MD (Bit 4)                               */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_SUS_TX_MD_Msk (0x30UL)    /*!< QSPIC_SUS_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_WEN_TX_MD_Pos (2UL)       /*!< QSPIC_WEN_TX_MD (Bit 2)                               */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_WEN_TX_MD_Msk (0xcUL)     /*!< QSPIC_WEN_TX_MD (Bitfield-Mask: 0x03)                 */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_ERS_TX_MD_Pos (0UL)       /*!< QSPIC_ERS_TX_MD (Bit 0)                               */\n#define QSPIC2_QSPIC2_ERASECMDB_REG_QSPIC_ERS_TX_MD_Msk (0x3UL)     /*!< QSPIC_ERS_TX_MD (Bitfield-Mask: 0x03)                 */\n/* =================================================  QSPIC2_ERASECTRL_REG  ================================================== */\n#define QSPIC2_QSPIC2_ERASECTRL_REG_QSPIC_ERS_STATE_Pos (25UL)      /*!< QSPIC_ERS_STATE (Bit 25)                              */\n#define QSPIC2_QSPIC2_ERASECTRL_REG_QSPIC_ERS_STATE_Msk (0xe000000UL) /*!< QSPIC_ERS_STATE (Bitfield-Mask: 0x07)               */\n#define QSPIC2_QSPIC2_ERASECTRL_REG_QSPIC_ERASE_EN_Pos (24UL)       /*!< QSPIC_ERASE_EN (Bit 24)                               */\n#define QSPIC2_QSPIC2_ERASECTRL_REG_QSPIC_ERASE_EN_Msk (0x1000000UL) /*!< QSPIC_ERASE_EN (Bitfield-Mask: 0x01)                 */\n#define QSPIC2_QSPIC2_ERASECTRL_REG_QSPIC_ERS_ADDR_Pos (4UL)        /*!< QSPIC_ERS_ADDR (Bit 4)                                */\n#define QSPIC2_QSPIC2_ERASECTRL_REG_QSPIC_ERS_ADDR_Msk (0xfffff0UL) /*!< QSPIC_ERS_ADDR (Bitfield-Mask: 0xfffff)               */\n/* =====================================================  QSPIC2_GP_REG  ===================================================== */\n#define QSPIC2_QSPIC2_GP_REG_QSPIC_PADS_SLEW_Pos (3UL)              /*!< QSPIC_PADS_SLEW (Bit 3)                               */\n#define QSPIC2_QSPIC2_GP_REG_QSPIC_PADS_SLEW_Msk (0x18UL)           /*!< QSPIC_PADS_SLEW (Bitfield-Mask: 0x03)                 */\n#define QSPIC2_QSPIC2_GP_REG_QSPIC_PADS_DRV_Pos (1UL)               /*!< QSPIC_PADS_DRV (Bit 1)                                */\n#define QSPIC2_QSPIC2_GP_REG_QSPIC_PADS_DRV_Msk (0x6UL)             /*!< QSPIC_PADS_DRV (Bitfield-Mask: 0x03)                  */\n/* ==================================================  QSPIC2_MEMBLEN_REG  =================================================== */\n#define QSPIC2_QSPIC2_MEMBLEN_REG_QSPIC_T_CEM_CC_Pos (4UL)          /*!< QSPIC_T_CEM_CC (Bit 4)                                */\n#define QSPIC2_QSPIC2_MEMBLEN_REG_QSPIC_T_CEM_CC_Msk (0x3ff0UL)     /*!< QSPIC_T_CEM_CC (Bitfield-Mask: 0x3ff)                 */\n#define QSPIC2_QSPIC2_MEMBLEN_REG_QSPIC_T_CEM_EN_Pos (3UL)          /*!< QSPIC_T_CEM_EN (Bit 3)                                */\n#define QSPIC2_QSPIC2_MEMBLEN_REG_QSPIC_T_CEM_EN_Msk (0x8UL)        /*!< QSPIC_T_CEM_EN (Bitfield-Mask: 0x01)                  */\n#define QSPIC2_QSPIC2_MEMBLEN_REG_QSPIC_MEMBLEN_Pos (0UL)           /*!< QSPIC_MEMBLEN (Bit 0)                                 */\n#define QSPIC2_QSPIC2_MEMBLEN_REG_QSPIC_MEMBLEN_Msk (0x7UL)         /*!< QSPIC_MEMBLEN (Bitfield-Mask: 0x07)                   */\n/* ==================================================  QSPIC2_READDATA_REG  ================================================== */\n#define QSPIC2_QSPIC2_READDATA_REG_QSPIC_READDATA_Pos (0UL)         /*!< QSPIC_READDATA (Bit 0)                                */\n#define QSPIC2_QSPIC2_READDATA_REG_QSPIC_READDATA_Msk (0xffffffffUL) /*!< QSPIC_READDATA (Bitfield-Mask: 0xffffffff)           */\n/* ==================================================  QSPIC2_RECVDATA_REG  ================================================== */\n#define QSPIC2_QSPIC2_RECVDATA_REG_QSPIC_RECVDATA_Pos (0UL)         /*!< QSPIC_RECVDATA (Bit 0)                                */\n#define QSPIC2_QSPIC2_RECVDATA_REG_QSPIC_RECVDATA_Msk (0xffffffffUL) /*!< QSPIC_RECVDATA (Bitfield-Mask: 0xffffffff)           */\n/* =================================================  QSPIC2_STATUSCMD_REG  ================================================== */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_STSDLY_SEL_Pos (22UL)     /*!< QSPIC_STSDLY_SEL (Bit 22)                             */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_STSDLY_SEL_Msk (0x400000UL) /*!< QSPIC_STSDLY_SEL (Bitfield-Mask: 0x01)              */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_RESSTS_DLY_Pos (16UL)     /*!< QSPIC_RESSTS_DLY (Bit 16)                             */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_RESSTS_DLY_Msk (0x3f0000UL) /*!< QSPIC_RESSTS_DLY (Bitfield-Mask: 0x3f)              */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_BUSY_VAL_Pos (15UL)       /*!< QSPIC_BUSY_VAL (Bit 15)                               */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_BUSY_VAL_Msk (0x8000UL)   /*!< QSPIC_BUSY_VAL (Bitfield-Mask: 0x01)                  */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_BUSY_POS_Pos (12UL)       /*!< QSPIC_BUSY_POS (Bit 12)                               */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_BUSY_POS_Msk (0x7000UL)   /*!< QSPIC_BUSY_POS (Bitfield-Mask: 0x07)                  */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_RSTAT_RX_MD_Pos (10UL)    /*!< QSPIC_RSTAT_RX_MD (Bit 10)                            */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_RSTAT_RX_MD_Msk (0xc00UL) /*!< QSPIC_RSTAT_RX_MD (Bitfield-Mask: 0x03)               */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_RSTAT_TX_MD_Pos (8UL)     /*!< QSPIC_RSTAT_TX_MD (Bit 8)                             */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_RSTAT_TX_MD_Msk (0x300UL) /*!< QSPIC_RSTAT_TX_MD (Bitfield-Mask: 0x03)               */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_RSTAT_INST_Pos (0UL)      /*!< QSPIC_RSTAT_INST (Bit 0)                              */\n#define QSPIC2_QSPIC2_STATUSCMD_REG_QSPIC_RSTAT_INST_Msk (0xffUL)   /*!< QSPIC_RSTAT_INST (Bitfield-Mask: 0xff)                */\n/* ===================================================  QSPIC2_STATUS_REG  =================================================== */\n#define QSPIC2_QSPIC2_STATUS_REG_QSPIC_BUSY_Pos (0UL)               /*!< QSPIC_BUSY (Bit 0)                                    */\n#define QSPIC2_QSPIC2_STATUS_REG_QSPIC_BUSY_Msk (0x1UL)             /*!< QSPIC_BUSY (Bitfield-Mask: 0x01)                      */\n/* =================================================  QSPIC2_WRITEDATA_REG  ================================================== */\n#define QSPIC2_QSPIC2_WRITEDATA_REG_QSPIC_WRITEDATA_Pos (0UL)       /*!< QSPIC_WRITEDATA (Bit 0)                               */\n#define QSPIC2_QSPIC2_WRITEDATA_REG_QSPIC_WRITEDATA_Msk (0xffffffffUL) /*!< QSPIC_WRITEDATA (Bitfield-Mask: 0xffffffff)        */\n\n\n/* =========================================================================================================================== */\n/* ================                                           RFMON                                           ================ */\n/* =========================================================================================================================== */\n\n/* ====================================================  RFMON_ADDR_REG  ===================================================== */\n#define RFMON_RFMON_ADDR_REG_RFMON_ADDR_Pos (2UL)                   /*!< RFMON_ADDR (Bit 2)                                    */\n#define RFMON_RFMON_ADDR_REG_RFMON_ADDR_Msk (0xfffffffcUL)          /*!< RFMON_ADDR (Bitfield-Mask: 0x3fffffff)                */\n/* ==================================================  RFMON_CRV_ADDR_REG  =================================================== */\n#define RFMON_RFMON_CRV_ADDR_REG_RFMON_CRV_ADDR_Pos (2UL)           /*!< RFMON_CRV_ADDR (Bit 2)                                */\n#define RFMON_RFMON_CRV_ADDR_REG_RFMON_CRV_ADDR_Msk (0xfffffffcUL)  /*!< RFMON_CRV_ADDR (Bitfield-Mask: 0x3fffffff)            */\n/* ===================================================  RFMON_CRV_LEN_REG  =================================================== */\n#define RFMON_RFMON_CRV_LEN_REG_RFMON_CRV_LEN_Pos (0UL)             /*!< RFMON_CRV_LEN (Bit 0)                                 */\n#define RFMON_RFMON_CRV_LEN_REG_RFMON_CRV_LEN_Msk (0x1ffffUL)       /*!< RFMON_CRV_LEN (Bitfield-Mask: 0x1ffff)                */\n/* ====================================================  RFMON_CTRL_REG  ===================================================== */\n#define RFMON_RFMON_CTRL_REG_RFMON_BREQ_FORCE_Pos (2UL)             /*!< RFMON_BREQ_FORCE (Bit 2)                              */\n#define RFMON_RFMON_CTRL_REG_RFMON_BREQ_FORCE_Msk (0x4UL)           /*!< RFMON_BREQ_FORCE (Bitfield-Mask: 0x01)                */\n#define RFMON_RFMON_CTRL_REG_RFMON_CIRC_EN_Pos (1UL)                /*!< RFMON_CIRC_EN (Bit 1)                                 */\n#define RFMON_RFMON_CTRL_REG_RFMON_CIRC_EN_Msk (0x2UL)              /*!< RFMON_CIRC_EN (Bitfield-Mask: 0x01)                   */\n#define RFMON_RFMON_CTRL_REG_RFMON_PACK_EN_Pos (0UL)                /*!< RFMON_PACK_EN (Bit 0)                                 */\n#define RFMON_RFMON_CTRL_REG_RFMON_PACK_EN_Msk (0x1UL)              /*!< RFMON_PACK_EN (Bitfield-Mask: 0x01)                   */\n/* =====================================================  RFMON_LEN_REG  ===================================================== */\n#define RFMON_RFMON_LEN_REG_RFMON_LEN_Pos (0UL)                     /*!< RFMON_LEN (Bit 0)                                     */\n#define RFMON_RFMON_LEN_REG_RFMON_LEN_Msk (0x1ffffUL)               /*!< RFMON_LEN (Bitfield-Mask: 0x1ffff)                    */\n/* ====================================================  RFMON_STAT_REG  ===================================================== */\n#define RFMON_RFMON_STAT_REG_RFMON_OFLOW_STK_Pos (1UL)              /*!< RFMON_OFLOW_STK (Bit 1)                               */\n#define RFMON_RFMON_STAT_REG_RFMON_OFLOW_STK_Msk (0x2UL)            /*!< RFMON_OFLOW_STK (Bitfield-Mask: 0x01)                 */\n#define RFMON_RFMON_STAT_REG_RFMON_ACTIVE_Pos (0UL)                 /*!< RFMON_ACTIVE (Bit 0)                                  */\n#define RFMON_RFMON_STAT_REG_RFMON_ACTIVE_Msk (0x1UL)               /*!< RFMON_ACTIVE (Bitfield-Mask: 0x01)                    */\n\n\n/* =========================================================================================================================== */\n/* ================                                            RTC                                            ================ */\n/* =========================================================================================================================== */\n\n/* =================================================  RTC_ALARM_ENABLE_REG  ================================================== */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_MNTH_EN_Pos (5UL)        /*!< RTC_ALARM_MNTH_EN (Bit 5)                             */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_MNTH_EN_Msk (0x20UL)     /*!< RTC_ALARM_MNTH_EN (Bitfield-Mask: 0x01)               */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_DATE_EN_Pos (4UL)        /*!< RTC_ALARM_DATE_EN (Bit 4)                             */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_DATE_EN_Msk (0x10UL)     /*!< RTC_ALARM_DATE_EN (Bitfield-Mask: 0x01)               */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_HOUR_EN_Pos (3UL)        /*!< RTC_ALARM_HOUR_EN (Bit 3)                             */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_HOUR_EN_Msk (0x8UL)      /*!< RTC_ALARM_HOUR_EN (Bitfield-Mask: 0x01)               */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_MIN_EN_Pos (2UL)         /*!< RTC_ALARM_MIN_EN (Bit 2)                              */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_MIN_EN_Msk (0x4UL)       /*!< RTC_ALARM_MIN_EN (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_SEC_EN_Pos (1UL)         /*!< RTC_ALARM_SEC_EN (Bit 1)                              */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_SEC_EN_Msk (0x2UL)       /*!< RTC_ALARM_SEC_EN (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_HOS_EN_Pos (0UL)         /*!< RTC_ALARM_HOS_EN (Bit 0)                              */\n#define RTC_RTC_ALARM_ENABLE_REG_RTC_ALARM_HOS_EN_Msk (0x1UL)       /*!< RTC_ALARM_HOS_EN (Bitfield-Mask: 0x01)                */\n/* ================================================  RTC_CALENDAR_ALARM_REG  ================================================= */\n#define RTC_RTC_CALENDAR_ALARM_REG_RTC_CAL_D_T_Pos (12UL)           /*!< RTC_CAL_D_T (Bit 12)                                  */\n#define RTC_RTC_CALENDAR_ALARM_REG_RTC_CAL_D_T_Msk (0x3000UL)       /*!< RTC_CAL_D_T (Bitfield-Mask: 0x03)                     */\n#define RTC_RTC_CALENDAR_ALARM_REG_RTC_CAL_D_U_Pos (8UL)            /*!< RTC_CAL_D_U (Bit 8)                                   */\n#define RTC_RTC_CALENDAR_ALARM_REG_RTC_CAL_D_U_Msk (0xf00UL)        /*!< RTC_CAL_D_U (Bitfield-Mask: 0x0f)                     */\n#define RTC_RTC_CALENDAR_ALARM_REG_RTC_CAL_M_T_Pos (7UL)            /*!< RTC_CAL_M_T (Bit 7)                                   */\n#define RTC_RTC_CALENDAR_ALARM_REG_RTC_CAL_M_T_Msk (0x80UL)         /*!< RTC_CAL_M_T (Bitfield-Mask: 0x01)                     */\n#define RTC_RTC_CALENDAR_ALARM_REG_RTC_CAL_M_U_Pos (3UL)            /*!< RTC_CAL_M_U (Bit 3)                                   */\n#define RTC_RTC_CALENDAR_ALARM_REG_RTC_CAL_M_U_Msk (0x78UL)         /*!< RTC_CAL_M_U (Bitfield-Mask: 0x0f)                     */\n/* ===================================================  RTC_CALENDAR_REG  ==================================================== */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_CH_Pos (31UL)                  /*!< RTC_CAL_CH (Bit 31)                                   */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_CH_Msk (0x80000000UL)          /*!< RTC_CAL_CH (Bitfield-Mask: 0x01)                      */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_C_T_Pos (28UL)                 /*!< RTC_CAL_C_T (Bit 28)                                  */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_C_T_Msk (0x30000000UL)         /*!< RTC_CAL_C_T (Bitfield-Mask: 0x03)                     */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_C_U_Pos (24UL)                 /*!< RTC_CAL_C_U (Bit 24)                                  */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_C_U_Msk (0xf000000UL)          /*!< RTC_CAL_C_U (Bitfield-Mask: 0x0f)                     */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_Y_T_Pos (20UL)                 /*!< RTC_CAL_Y_T (Bit 20)                                  */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_Y_T_Msk (0xf00000UL)           /*!< RTC_CAL_Y_T (Bitfield-Mask: 0x0f)                     */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_Y_U_Pos (16UL)                 /*!< RTC_CAL_Y_U (Bit 16)                                  */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_Y_U_Msk (0xf0000UL)            /*!< RTC_CAL_Y_U (Bitfield-Mask: 0x0f)                     */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_D_T_Pos (12UL)                 /*!< RTC_CAL_D_T (Bit 12)                                  */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_D_T_Msk (0x3000UL)             /*!< RTC_CAL_D_T (Bitfield-Mask: 0x03)                     */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_D_U_Pos (8UL)                  /*!< RTC_CAL_D_U (Bit 8)                                   */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_D_U_Msk (0xf00UL)              /*!< RTC_CAL_D_U (Bitfield-Mask: 0x0f)                     */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_M_T_Pos (7UL)                  /*!< RTC_CAL_M_T (Bit 7)                                   */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_M_T_Msk (0x80UL)               /*!< RTC_CAL_M_T (Bitfield-Mask: 0x01)                     */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_M_U_Pos (3UL)                  /*!< RTC_CAL_M_U (Bit 3)                                   */\n#define RTC_RTC_CALENDAR_REG_RTC_CAL_M_U_Msk (0x78UL)               /*!< RTC_CAL_M_U (Bitfield-Mask: 0x0f)                     */\n#define RTC_RTC_CALENDAR_REG_RTC_DAY_Pos  (0UL)                     /*!< RTC_DAY (Bit 0)                                       */\n#define RTC_RTC_CALENDAR_REG_RTC_DAY_Msk  (0x7UL)                   /*!< RTC_DAY (Bitfield-Mask: 0x07)                         */\n/* ====================================================  RTC_CONTROL_REG  ==================================================== */\n#define RTC_RTC_CONTROL_REG_RTC_CAL_DISABLE_Pos (1UL)               /*!< RTC_CAL_DISABLE (Bit 1)                               */\n#define RTC_RTC_CONTROL_REG_RTC_CAL_DISABLE_Msk (0x2UL)             /*!< RTC_CAL_DISABLE (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_CONTROL_REG_RTC_TIME_DISABLE_Pos (0UL)              /*!< RTC_TIME_DISABLE (Bit 0)                              */\n#define RTC_RTC_CONTROL_REG_RTC_TIME_DISABLE_Msk (0x1UL)            /*!< RTC_TIME_DISABLE (Bitfield-Mask: 0x01)                */\n/* ==================================================  RTC_EVENT_CTRL_REG  =================================================== */\n#define RTC_RTC_EVENT_CTRL_REG_RTC_PDC_EVENT_EN_Pos (1UL)           /*!< RTC_PDC_EVENT_EN (Bit 1)                              */\n#define RTC_RTC_EVENT_CTRL_REG_RTC_PDC_EVENT_EN_Msk (0x2UL)         /*!< RTC_PDC_EVENT_EN (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_EVENT_CTRL_REG_RTC_MOTOR_EVENT_EN_Pos (0UL)         /*!< RTC_MOTOR_EVENT_EN (Bit 0)                            */\n#define RTC_RTC_EVENT_CTRL_REG_RTC_MOTOR_EVENT_EN_Msk (0x1UL)       /*!< RTC_MOTOR_EVENT_EN (Bitfield-Mask: 0x01)              */\n/* ==================================================  RTC_EVENT_FLAGS_REG  ================================================== */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_ALRM_Pos (6UL)            /*!< RTC_EVENT_ALRM (Bit 6)                                */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_ALRM_Msk (0x40UL)         /*!< RTC_EVENT_ALRM (Bitfield-Mask: 0x01)                  */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_MNTH_Pos (5UL)            /*!< RTC_EVENT_MNTH (Bit 5)                                */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_MNTH_Msk (0x20UL)         /*!< RTC_EVENT_MNTH (Bitfield-Mask: 0x01)                  */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_DATE_Pos (4UL)            /*!< RTC_EVENT_DATE (Bit 4)                                */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_DATE_Msk (0x10UL)         /*!< RTC_EVENT_DATE (Bitfield-Mask: 0x01)                  */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_HOUR_Pos (3UL)            /*!< RTC_EVENT_HOUR (Bit 3)                                */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_HOUR_Msk (0x8UL)          /*!< RTC_EVENT_HOUR (Bitfield-Mask: 0x01)                  */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_MIN_Pos (2UL)             /*!< RTC_EVENT_MIN (Bit 2)                                 */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_MIN_Msk (0x4UL)           /*!< RTC_EVENT_MIN (Bitfield-Mask: 0x01)                   */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_SEC_Pos (1UL)             /*!< RTC_EVENT_SEC (Bit 1)                                 */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_SEC_Msk (0x2UL)           /*!< RTC_EVENT_SEC (Bitfield-Mask: 0x01)                   */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_HOS_Pos (0UL)             /*!< RTC_EVENT_HOS (Bit 0)                                 */\n#define RTC_RTC_EVENT_FLAGS_REG_RTC_EVENT_HOS_Msk (0x1UL)           /*!< RTC_EVENT_HOS (Bitfield-Mask: 0x01)                   */\n/* ===================================================  RTC_HOUR_MODE_REG  =================================================== */\n#define RTC_RTC_HOUR_MODE_REG_RTC_HMS_Pos (0UL)                     /*!< RTC_HMS (Bit 0)                                       */\n#define RTC_RTC_HOUR_MODE_REG_RTC_HMS_Msk (0x1UL)                   /*!< RTC_HMS (Bitfield-Mask: 0x01)                         */\n/* ===============================================  RTC_INTERRUPT_DISABLE_REG  =============================================== */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_ALRM_INT_DIS_Pos (6UL)    /*!< RTC_ALRM_INT_DIS (Bit 6)                              */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_ALRM_INT_DIS_Msk (0x40UL) /*!< RTC_ALRM_INT_DIS (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_MNTH_INT_DIS_Pos (5UL)    /*!< RTC_MNTH_INT_DIS (Bit 5)                              */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_MNTH_INT_DIS_Msk (0x20UL) /*!< RTC_MNTH_INT_DIS (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_DATE_INT_DIS_Pos (4UL)    /*!< RTC_DATE_INT_DIS (Bit 4)                              */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_DATE_INT_DIS_Msk (0x10UL) /*!< RTC_DATE_INT_DIS (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_HOUR_INT_DIS_Pos (3UL)    /*!< RTC_HOUR_INT_DIS (Bit 3)                              */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_HOUR_INT_DIS_Msk (0x8UL)  /*!< RTC_HOUR_INT_DIS (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_MIN_INT_DIS_Pos (2UL)     /*!< RTC_MIN_INT_DIS (Bit 2)                               */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_MIN_INT_DIS_Msk (0x4UL)   /*!< RTC_MIN_INT_DIS (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_SEC_INT_DIS_Pos (1UL)     /*!< RTC_SEC_INT_DIS (Bit 1)                               */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_SEC_INT_DIS_Msk (0x2UL)   /*!< RTC_SEC_INT_DIS (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_HOS_INT_DIS_Pos (0UL)     /*!< RTC_HOS_INT_DIS (Bit 0)                               */\n#define RTC_RTC_INTERRUPT_DISABLE_REG_RTC_HOS_INT_DIS_Msk (0x1UL)   /*!< RTC_HOS_INT_DIS (Bitfield-Mask: 0x01)                 */\n/* ===============================================  RTC_INTERRUPT_ENABLE_REG  ================================================ */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_ALRM_INT_EN_Pos (6UL)      /*!< RTC_ALRM_INT_EN (Bit 6)                               */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_ALRM_INT_EN_Msk (0x40UL)   /*!< RTC_ALRM_INT_EN (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_MNTH_INT_EN_Pos (5UL)      /*!< RTC_MNTH_INT_EN (Bit 5)                               */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_MNTH_INT_EN_Msk (0x20UL)   /*!< RTC_MNTH_INT_EN (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_DATE_INT_EN_Pos (4UL)      /*!< RTC_DATE_INT_EN (Bit 4)                               */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_DATE_INT_EN_Msk (0x10UL)   /*!< RTC_DATE_INT_EN (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_HOUR_INT_EN_Pos (3UL)      /*!< RTC_HOUR_INT_EN (Bit 3)                               */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_HOUR_INT_EN_Msk (0x8UL)    /*!< RTC_HOUR_INT_EN (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_MIN_INT_EN_Pos (2UL)       /*!< RTC_MIN_INT_EN (Bit 2)                                */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_MIN_INT_EN_Msk (0x4UL)     /*!< RTC_MIN_INT_EN (Bitfield-Mask: 0x01)                  */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_SEC_INT_EN_Pos (1UL)       /*!< RTC_SEC_INT_EN (Bit 1)                                */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_SEC_INT_EN_Msk (0x2UL)     /*!< RTC_SEC_INT_EN (Bitfield-Mask: 0x01)                  */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_HOS_INT_EN_Pos (0UL)       /*!< RTC_HOS_INT_EN (Bit 0)                                */\n#define RTC_RTC_INTERRUPT_ENABLE_REG_RTC_HOS_INT_EN_Msk (0x1UL)     /*!< RTC_HOS_INT_EN (Bitfield-Mask: 0x01)                  */\n/* ================================================  RTC_INTERRUPT_MASK_REG  ================================================= */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_ALRM_INT_MSK_Pos (6UL)       /*!< RTC_ALRM_INT_MSK (Bit 6)                              */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_ALRM_INT_MSK_Msk (0x40UL)    /*!< RTC_ALRM_INT_MSK (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_MNTH_INT_MSK_Pos (5UL)       /*!< RTC_MNTH_INT_MSK (Bit 5)                              */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_MNTH_INT_MSK_Msk (0x20UL)    /*!< RTC_MNTH_INT_MSK (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_DATE_INT_MSK_Pos (4UL)       /*!< RTC_DATE_INT_MSK (Bit 4)                              */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_DATE_INT_MSK_Msk (0x10UL)    /*!< RTC_DATE_INT_MSK (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_HOUR_INT_MSK_Pos (3UL)       /*!< RTC_HOUR_INT_MSK (Bit 3)                              */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_HOUR_INT_MSK_Msk (0x8UL)     /*!< RTC_HOUR_INT_MSK (Bitfield-Mask: 0x01)                */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_MIN_INT_MSK_Pos (2UL)        /*!< RTC_MIN_INT_MSK (Bit 2)                               */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_MIN_INT_MSK_Msk (0x4UL)      /*!< RTC_MIN_INT_MSK (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_SEC_INT_MSK_Pos (1UL)        /*!< RTC_SEC_INT_MSK (Bit 1)                               */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_SEC_INT_MSK_Msk (0x2UL)      /*!< RTC_SEC_INT_MSK (Bitfield-Mask: 0x01)                 */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_HOS_INT_MSK_Pos (0UL)        /*!< RTC_HOS_INT_MSK (Bit 0)                               */\n#define RTC_RTC_INTERRUPT_MASK_REG_RTC_HOS_INT_MSK_Msk (0x1UL)      /*!< RTC_HOS_INT_MSK (Bitfield-Mask: 0x01)                 */\n/* ===================================================  RTC_KEEP_RTC_REG  ==================================================== */\n#define RTC_RTC_KEEP_RTC_REG_RTC_KEEP_Pos (0UL)                     /*!< RTC_KEEP (Bit 0)                                      */\n#define RTC_RTC_KEEP_RTC_REG_RTC_KEEP_Msk (0x1UL)                   /*!< RTC_KEEP (Bitfield-Mask: 0x01)                        */\n/* ================================================  RTC_MOTOR_EVENT_CNT_REG  ================================================ */\n#define RTC_RTC_MOTOR_EVENT_CNT_REG_RTC_MOTOR_EVENT_CNT_Pos (0UL)   /*!< RTC_MOTOR_EVENT_CNT (Bit 0)                           */\n#define RTC_RTC_MOTOR_EVENT_CNT_REG_RTC_MOTOR_EVENT_CNT_Msk (0xfffUL) /*!< RTC_MOTOR_EVENT_CNT (Bitfield-Mask: 0xfff)          */\n/* ==============================================  RTC_MOTOR_EVENT_PERIOD_REG  =============================================== */\n#define RTC_RTC_MOTOR_EVENT_PERIOD_REG_RTC_MOTOR_EVENT_PERIOD_Pos (0UL) /*!< RTC_MOTOR_EVENT_PERIOD (Bit 0)                    */\n#define RTC_RTC_MOTOR_EVENT_PERIOD_REG_RTC_MOTOR_EVENT_PERIOD_Msk (0xfffUL) /*!< RTC_MOTOR_EVENT_PERIOD (Bitfield-Mask: 0xfff) */\n/* ================================================  RTC_PDC_EVENT_CLEAR_REG  ================================================ */\n#define RTC_RTC_PDC_EVENT_CLEAR_REG_PDC_EVENT_CLEAR_Pos (0UL)       /*!< PDC_EVENT_CLEAR (Bit 0)                               */\n#define RTC_RTC_PDC_EVENT_CLEAR_REG_PDC_EVENT_CLEAR_Msk (0x1UL)     /*!< PDC_EVENT_CLEAR (Bitfield-Mask: 0x01)                 */\n/* =================================================  RTC_PDC_EVENT_CNT_REG  ================================================= */\n#define RTC_RTC_PDC_EVENT_CNT_REG_RTC_PDC_EVENT_CNT_Pos (0UL)       /*!< RTC_PDC_EVENT_CNT (Bit 0)                             */\n#define RTC_RTC_PDC_EVENT_CNT_REG_RTC_PDC_EVENT_CNT_Msk (0x1fffUL)  /*!< RTC_PDC_EVENT_CNT (Bitfield-Mask: 0x1fff)             */\n/* ===============================================  RTC_PDC_EVENT_PERIOD_REG  ================================================ */\n#define RTC_RTC_PDC_EVENT_PERIOD_REG_RTC_PDC_EVENT_PERIOD_Pos (0UL) /*!< RTC_PDC_EVENT_PERIOD (Bit 0)                          */\n#define RTC_RTC_PDC_EVENT_PERIOD_REG_RTC_PDC_EVENT_PERIOD_Msk (0x1fffUL) /*!< RTC_PDC_EVENT_PERIOD (Bitfield-Mask: 0x1fff)     */\n/* ====================================================  RTC_STATUS_REG  ===================================================== */\n#define RTC_RTC_STATUS_REG_RTC_VALID_CAL_ALM_Pos (3UL)              /*!< RTC_VALID_CAL_ALM (Bit 3)                             */\n#define RTC_RTC_STATUS_REG_RTC_VALID_CAL_ALM_Msk (0x8UL)            /*!< RTC_VALID_CAL_ALM (Bitfield-Mask: 0x01)               */\n#define RTC_RTC_STATUS_REG_RTC_VALID_TIME_ALM_Pos (2UL)             /*!< RTC_VALID_TIME_ALM (Bit 2)                            */\n#define RTC_RTC_STATUS_REG_RTC_VALID_TIME_ALM_Msk (0x4UL)           /*!< RTC_VALID_TIME_ALM (Bitfield-Mask: 0x01)              */\n#define RTC_RTC_STATUS_REG_RTC_VALID_CAL_Pos (1UL)                  /*!< RTC_VALID_CAL (Bit 1)                                 */\n#define RTC_RTC_STATUS_REG_RTC_VALID_CAL_Msk (0x2UL)                /*!< RTC_VALID_CAL (Bitfield-Mask: 0x01)                   */\n#define RTC_RTC_STATUS_REG_RTC_VALID_TIME_Pos (0UL)                 /*!< RTC_VALID_TIME (Bit 0)                                */\n#define RTC_RTC_STATUS_REG_RTC_VALID_TIME_Msk (0x1UL)               /*!< RTC_VALID_TIME (Bitfield-Mask: 0x01)                  */\n/* ==================================================  RTC_TIME_ALARM_REG  =================================================== */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_PM_Pos (30UL)               /*!< RTC_TIME_PM (Bit 30)                                  */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_PM_Msk (0x40000000UL)       /*!< RTC_TIME_PM (Bitfield-Mask: 0x01)                     */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_HR_T_Pos (28UL)             /*!< RTC_TIME_HR_T (Bit 28)                                */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_HR_T_Msk (0x30000000UL)     /*!< RTC_TIME_HR_T (Bitfield-Mask: 0x03)                   */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_HR_U_Pos (24UL)             /*!< RTC_TIME_HR_U (Bit 24)                                */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_HR_U_Msk (0xf000000UL)      /*!< RTC_TIME_HR_U (Bitfield-Mask: 0x0f)                   */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_M_T_Pos (20UL)              /*!< RTC_TIME_M_T (Bit 20)                                 */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_M_T_Msk (0x700000UL)        /*!< RTC_TIME_M_T (Bitfield-Mask: 0x07)                    */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_M_U_Pos (16UL)              /*!< RTC_TIME_M_U (Bit 16)                                 */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_M_U_Msk (0xf0000UL)         /*!< RTC_TIME_M_U (Bitfield-Mask: 0x0f)                    */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_S_T_Pos (12UL)              /*!< RTC_TIME_S_T (Bit 12)                                 */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_S_T_Msk (0x7000UL)          /*!< RTC_TIME_S_T (Bitfield-Mask: 0x07)                    */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_S_U_Pos (8UL)               /*!< RTC_TIME_S_U (Bit 8)                                  */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_S_U_Msk (0xf00UL)           /*!< RTC_TIME_S_U (Bitfield-Mask: 0x0f)                    */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_H_T_Pos (4UL)               /*!< RTC_TIME_H_T (Bit 4)                                  */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_H_T_Msk (0xf0UL)            /*!< RTC_TIME_H_T (Bitfield-Mask: 0x0f)                    */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_H_U_Pos (0UL)               /*!< RTC_TIME_H_U (Bit 0)                                  */\n#define RTC_RTC_TIME_ALARM_REG_RTC_TIME_H_U_Msk (0xfUL)             /*!< RTC_TIME_H_U (Bitfield-Mask: 0x0f)                    */\n/* =====================================================  RTC_TIME_REG  ====================================================== */\n#define RTC_RTC_TIME_REG_RTC_TIME_CH_Pos  (31UL)                    /*!< RTC_TIME_CH (Bit 31)                                  */\n#define RTC_RTC_TIME_REG_RTC_TIME_CH_Msk  (0x80000000UL)            /*!< RTC_TIME_CH (Bitfield-Mask: 0x01)                     */\n#define RTC_RTC_TIME_REG_RTC_TIME_PM_Pos  (30UL)                    /*!< RTC_TIME_PM (Bit 30)                                  */\n#define RTC_RTC_TIME_REG_RTC_TIME_PM_Msk  (0x40000000UL)            /*!< RTC_TIME_PM (Bitfield-Mask: 0x01)                     */\n#define RTC_RTC_TIME_REG_RTC_TIME_HR_T_Pos (28UL)                   /*!< RTC_TIME_HR_T (Bit 28)                                */\n#define RTC_RTC_TIME_REG_RTC_TIME_HR_T_Msk (0x30000000UL)           /*!< RTC_TIME_HR_T (Bitfield-Mask: 0x03)                   */\n#define RTC_RTC_TIME_REG_RTC_TIME_HR_U_Pos (24UL)                   /*!< RTC_TIME_HR_U (Bit 24)                                */\n#define RTC_RTC_TIME_REG_RTC_TIME_HR_U_Msk (0xf000000UL)            /*!< RTC_TIME_HR_U (Bitfield-Mask: 0x0f)                   */\n#define RTC_RTC_TIME_REG_RTC_TIME_M_T_Pos (20UL)                    /*!< RTC_TIME_M_T (Bit 20)                                 */\n#define RTC_RTC_TIME_REG_RTC_TIME_M_T_Msk (0x700000UL)              /*!< RTC_TIME_M_T (Bitfield-Mask: 0x07)                    */\n#define RTC_RTC_TIME_REG_RTC_TIME_M_U_Pos (16UL)                    /*!< RTC_TIME_M_U (Bit 16)                                 */\n#define RTC_RTC_TIME_REG_RTC_TIME_M_U_Msk (0xf0000UL)               /*!< RTC_TIME_M_U (Bitfield-Mask: 0x0f)                    */\n#define RTC_RTC_TIME_REG_RTC_TIME_S_T_Pos (12UL)                    /*!< RTC_TIME_S_T (Bit 12)                                 */\n#define RTC_RTC_TIME_REG_RTC_TIME_S_T_Msk (0x7000UL)                /*!< RTC_TIME_S_T (Bitfield-Mask: 0x07)                    */\n#define RTC_RTC_TIME_REG_RTC_TIME_S_U_Pos (8UL)                     /*!< RTC_TIME_S_U (Bit 8)                                  */\n#define RTC_RTC_TIME_REG_RTC_TIME_S_U_Msk (0xf00UL)                 /*!< RTC_TIME_S_U (Bitfield-Mask: 0x0f)                    */\n#define RTC_RTC_TIME_REG_RTC_TIME_H_T_Pos (4UL)                     /*!< RTC_TIME_H_T (Bit 4)                                  */\n#define RTC_RTC_TIME_REG_RTC_TIME_H_T_Msk (0xf0UL)                  /*!< RTC_TIME_H_T (Bitfield-Mask: 0x0f)                    */\n#define RTC_RTC_TIME_REG_RTC_TIME_H_U_Pos (0UL)                     /*!< RTC_TIME_H_U (Bit 0)                                  */\n#define RTC_RTC_TIME_REG_RTC_TIME_H_U_Msk (0xfUL)                   /*!< RTC_TIME_H_U (Bitfield-Mask: 0x0f)                    */\n\n\n/* =========================================================================================================================== */\n/* ================                                           SDADC                                           ================ */\n/* =========================================================================================================================== */\n\n/* ==================================================  SDADC_CLEAR_INT_REG  ================================================== */\n#define SDADC_SDADC_CLEAR_INT_REG_SDADC_CLR_INT_Pos (0UL)           /*!< SDADC_CLR_INT (Bit 0)                                 */\n#define SDADC_SDADC_CLEAR_INT_REG_SDADC_CLR_INT_Msk (0xffffUL)      /*!< SDADC_CLR_INT (Bitfield-Mask: 0xffff)                 */\n/* ====================================================  SDADC_CTRL_REG  ===================================================== */\n#define SDADC_SDADC_CTRL_REG_SDADC_DMA_EN_Pos (17UL)                /*!< SDADC_DMA_EN (Bit 17)                                 */\n#define SDADC_SDADC_CTRL_REG_SDADC_DMA_EN_Msk (0x20000UL)           /*!< SDADC_DMA_EN (Bitfield-Mask: 0x01)                    */\n#define SDADC_SDADC_CTRL_REG_SDADC_MINT_Pos (16UL)                  /*!< SDADC_MINT (Bit 16)                                   */\n#define SDADC_SDADC_CTRL_REG_SDADC_MINT_Msk (0x10000UL)             /*!< SDADC_MINT (Bitfield-Mask: 0x01)                      */\n#define SDADC_SDADC_CTRL_REG_SDADC_INT_Pos (15UL)                   /*!< SDADC_INT (Bit 15)                                    */\n#define SDADC_SDADC_CTRL_REG_SDADC_INT_Msk (0x8000UL)               /*!< SDADC_INT (Bitfield-Mask: 0x01)                       */\n#define SDADC_SDADC_CTRL_REG_SDADC_LDO_OK_Pos (14UL)                /*!< SDADC_LDO_OK (Bit 14)                                 */\n#define SDADC_SDADC_CTRL_REG_SDADC_LDO_OK_Msk (0x4000UL)            /*!< SDADC_LDO_OK (Bitfield-Mask: 0x01)                    */\n#define SDADC_SDADC_CTRL_REG_SDADC_VREF_SEL_Pos (13UL)              /*!< SDADC_VREF_SEL (Bit 13)                               */\n#define SDADC_SDADC_CTRL_REG_SDADC_VREF_SEL_Msk (0x2000UL)          /*!< SDADC_VREF_SEL (Bitfield-Mask: 0x01)                  */\n#define SDADC_SDADC_CTRL_REG_SDADC_CONT_Pos (12UL)                  /*!< SDADC_CONT (Bit 12)                                   */\n#define SDADC_SDADC_CTRL_REG_SDADC_CONT_Msk (0x1000UL)              /*!< SDADC_CONT (Bitfield-Mask: 0x01)                      */\n#define SDADC_SDADC_CTRL_REG_SDADC_OSR_Pos (10UL)                   /*!< SDADC_OSR (Bit 10)                                    */\n#define SDADC_SDADC_CTRL_REG_SDADC_OSR_Msk (0xc00UL)                /*!< SDADC_OSR (Bitfield-Mask: 0x03)                       */\n#define SDADC_SDADC_CTRL_REG_SDADC_SE_Pos (9UL)                     /*!< SDADC_SE (Bit 9)                                      */\n#define SDADC_SDADC_CTRL_REG_SDADC_SE_Msk (0x200UL)                 /*!< SDADC_SE (Bitfield-Mask: 0x01)                        */\n#define SDADC_SDADC_CTRL_REG_SDADC_INN_SEL_Pos (6UL)                /*!< SDADC_INN_SEL (Bit 6)                                 */\n#define SDADC_SDADC_CTRL_REG_SDADC_INN_SEL_Msk (0x1c0UL)            /*!< SDADC_INN_SEL (Bitfield-Mask: 0x07)                   */\n#define SDADC_SDADC_CTRL_REG_SDADC_INP_SEL_Pos (2UL)                /*!< SDADC_INP_SEL (Bit 2)                                 */\n#define SDADC_SDADC_CTRL_REG_SDADC_INP_SEL_Msk (0x3cUL)             /*!< SDADC_INP_SEL (Bitfield-Mask: 0x0f)                   */\n#define SDADC_SDADC_CTRL_REG_SDADC_START_Pos (1UL)                  /*!< SDADC_START (Bit 1)                                   */\n#define SDADC_SDADC_CTRL_REG_SDADC_START_Msk (0x2UL)                /*!< SDADC_START (Bitfield-Mask: 0x01)                     */\n#define SDADC_SDADC_CTRL_REG_SDADC_EN_Pos (0UL)                     /*!< SDADC_EN (Bit 0)                                      */\n#define SDADC_SDADC_CTRL_REG_SDADC_EN_Msk (0x1UL)                   /*!< SDADC_EN (Bitfield-Mask: 0x01)                        */\n/* ==================================================  SDADC_GAIN_CORR_REG  ================================================== */\n#define SDADC_SDADC_GAIN_CORR_REG_SDADC_GAIN_CORR_Pos (0UL)         /*!< SDADC_GAIN_CORR (Bit 0)                               */\n#define SDADC_SDADC_GAIN_CORR_REG_SDADC_GAIN_CORR_Msk (0x3ffUL)     /*!< SDADC_GAIN_CORR (Bitfield-Mask: 0x3ff)                */\n/* ==================================================  SDADC_OFFS_CORR_REG  ================================================== */\n#define SDADC_SDADC_OFFS_CORR_REG_SDADC_OFFS_CORR_Pos (0UL)         /*!< SDADC_OFFS_CORR (Bit 0)                               */\n#define SDADC_SDADC_OFFS_CORR_REG_SDADC_OFFS_CORR_Msk (0x3ffUL)     /*!< SDADC_OFFS_CORR (Bitfield-Mask: 0x3ff)                */\n/* ===================================================  SDADC_RESULT_REG  ==================================================== */\n#define SDADC_SDADC_RESULT_REG_SDADC_VAL_Pos (0UL)                  /*!< SDADC_VAL (Bit 0)                                     */\n#define SDADC_SDADC_RESULT_REG_SDADC_VAL_Msk (0xffffUL)             /*!< SDADC_VAL (Bitfield-Mask: 0xffff)                     */\n/* ====================================================  SDADC_TEST_REG  ===================================================== */\n#define SDADC_SDADC_TEST_REG_SDADC_CLK_FREQ_Pos (6UL)               /*!< SDADC_CLK_FREQ (Bit 6)                                */\n#define SDADC_SDADC_TEST_REG_SDADC_CLK_FREQ_Msk (0xc0UL)            /*!< SDADC_CLK_FREQ (Bitfield-Mask: 0x03)                  */\n\n\n/* =========================================================================================================================== */\n/* ================                                          SMOTOR                                           ================ */\n/* =========================================================================================================================== */\n\n/* ====================================================  CMD_TABLE_BASE  ===================================================== */\n/* =====================================================  PG0_CTRL_REG  ====================================================== */\n#define SMOTOR_PG0_CTRL_REG_GENEND_IRQ_EN_Pos (15UL)                /*!< GENEND_IRQ_EN (Bit 15)                                */\n#define SMOTOR_PG0_CTRL_REG_GENEND_IRQ_EN_Msk (0x8000UL)            /*!< GENEND_IRQ_EN (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG0_CTRL_REG_GENSTART_IRQ_EN_Pos (14UL)              /*!< GENSTART_IRQ_EN (Bit 14)                              */\n#define SMOTOR_PG0_CTRL_REG_GENSTART_IRQ_EN_Msk (0x4000UL)          /*!< GENSTART_IRQ_EN (Bitfield-Mask: 0x01)                 */\n#define SMOTOR_PG0_CTRL_REG_PG_START_MODE_Pos (13UL)                /*!< PG_START_MODE (Bit 13)                                */\n#define SMOTOR_PG0_CTRL_REG_PG_START_MODE_Msk (0x2000UL)            /*!< PG_START_MODE (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG0_CTRL_REG_PG_MODE_Pos   (12UL)                    /*!< PG_MODE (Bit 12)                                      */\n#define SMOTOR_PG0_CTRL_REG_PG_MODE_Msk   (0x1000UL)                /*!< PG_MODE (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG0_CTRL_REG_SIG3_EN_Pos   (11UL)                    /*!< SIG3_EN (Bit 11)                                      */\n#define SMOTOR_PG0_CTRL_REG_SIG3_EN_Msk   (0x800UL)                 /*!< SIG3_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG0_CTRL_REG_SIG2_EN_Pos   (10UL)                    /*!< SIG2_EN (Bit 10)                                      */\n#define SMOTOR_PG0_CTRL_REG_SIG2_EN_Msk   (0x400UL)                 /*!< SIG2_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG0_CTRL_REG_SIG1_EN_Pos   (9UL)                     /*!< SIG1_EN (Bit 9)                                       */\n#define SMOTOR_PG0_CTRL_REG_SIG1_EN_Msk   (0x200UL)                 /*!< SIG1_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG0_CTRL_REG_SIG0_EN_Pos   (8UL)                     /*!< SIG0_EN (Bit 8)                                       */\n#define SMOTOR_PG0_CTRL_REG_SIG0_EN_Msk   (0x100UL)                 /*!< SIG0_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG0_CTRL_REG_OUT3_SIG_Pos  (6UL)                     /*!< OUT3_SIG (Bit 6)                                      */\n#define SMOTOR_PG0_CTRL_REG_OUT3_SIG_Msk  (0xc0UL)                  /*!< OUT3_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG0_CTRL_REG_OUT2_SIG_Pos  (4UL)                     /*!< OUT2_SIG (Bit 4)                                      */\n#define SMOTOR_PG0_CTRL_REG_OUT2_SIG_Msk  (0x30UL)                  /*!< OUT2_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG0_CTRL_REG_OUT1_SIG_Pos  (2UL)                     /*!< OUT1_SIG (Bit 2)                                      */\n#define SMOTOR_PG0_CTRL_REG_OUT1_SIG_Msk  (0xcUL)                   /*!< OUT1_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG0_CTRL_REG_OUT0_SIG_Pos  (0UL)                     /*!< OUT0_SIG (Bit 0)                                      */\n#define SMOTOR_PG0_CTRL_REG_OUT0_SIG_Msk  (0x3UL)                   /*!< OUT0_SIG (Bitfield-Mask: 0x03)                        */\n/* =====================================================  PG1_CTRL_REG  ====================================================== */\n#define SMOTOR_PG1_CTRL_REG_GENEND_IRQ_EN_Pos (15UL)                /*!< GENEND_IRQ_EN (Bit 15)                                */\n#define SMOTOR_PG1_CTRL_REG_GENEND_IRQ_EN_Msk (0x8000UL)            /*!< GENEND_IRQ_EN (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG1_CTRL_REG_GENSTART_IRQ_EN_Pos (14UL)              /*!< GENSTART_IRQ_EN (Bit 14)                              */\n#define SMOTOR_PG1_CTRL_REG_GENSTART_IRQ_EN_Msk (0x4000UL)          /*!< GENSTART_IRQ_EN (Bitfield-Mask: 0x01)                 */\n#define SMOTOR_PG1_CTRL_REG_PG_START_MODE_Pos (13UL)                /*!< PG_START_MODE (Bit 13)                                */\n#define SMOTOR_PG1_CTRL_REG_PG_START_MODE_Msk (0x2000UL)            /*!< PG_START_MODE (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG1_CTRL_REG_PG_MODE_Pos   (12UL)                    /*!< PG_MODE (Bit 12)                                      */\n#define SMOTOR_PG1_CTRL_REG_PG_MODE_Msk   (0x1000UL)                /*!< PG_MODE (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG1_CTRL_REG_SIG3_EN_Pos   (11UL)                    /*!< SIG3_EN (Bit 11)                                      */\n#define SMOTOR_PG1_CTRL_REG_SIG3_EN_Msk   (0x800UL)                 /*!< SIG3_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG1_CTRL_REG_SIG2_EN_Pos   (10UL)                    /*!< SIG2_EN (Bit 10)                                      */\n#define SMOTOR_PG1_CTRL_REG_SIG2_EN_Msk   (0x400UL)                 /*!< SIG2_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG1_CTRL_REG_SIG1_EN_Pos   (9UL)                     /*!< SIG1_EN (Bit 9)                                       */\n#define SMOTOR_PG1_CTRL_REG_SIG1_EN_Msk   (0x200UL)                 /*!< SIG1_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG1_CTRL_REG_SIG0_EN_Pos   (8UL)                     /*!< SIG0_EN (Bit 8)                                       */\n#define SMOTOR_PG1_CTRL_REG_SIG0_EN_Msk   (0x100UL)                 /*!< SIG0_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG1_CTRL_REG_OUT3_SIG_Pos  (6UL)                     /*!< OUT3_SIG (Bit 6)                                      */\n#define SMOTOR_PG1_CTRL_REG_OUT3_SIG_Msk  (0xc0UL)                  /*!< OUT3_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG1_CTRL_REG_OUT2_SIG_Pos  (4UL)                     /*!< OUT2_SIG (Bit 4)                                      */\n#define SMOTOR_PG1_CTRL_REG_OUT2_SIG_Msk  (0x30UL)                  /*!< OUT2_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG1_CTRL_REG_OUT1_SIG_Pos  (2UL)                     /*!< OUT1_SIG (Bit 2)                                      */\n#define SMOTOR_PG1_CTRL_REG_OUT1_SIG_Msk  (0xcUL)                   /*!< OUT1_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG1_CTRL_REG_OUT0_SIG_Pos  (0UL)                     /*!< OUT0_SIG (Bit 0)                                      */\n#define SMOTOR_PG1_CTRL_REG_OUT0_SIG_Msk  (0x3UL)                   /*!< OUT0_SIG (Bitfield-Mask: 0x03)                        */\n/* =====================================================  PG2_CTRL_REG  ====================================================== */\n#define SMOTOR_PG2_CTRL_REG_GENEND_IRQ_EN_Pos (15UL)                /*!< GENEND_IRQ_EN (Bit 15)                                */\n#define SMOTOR_PG2_CTRL_REG_GENEND_IRQ_EN_Msk (0x8000UL)            /*!< GENEND_IRQ_EN (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG2_CTRL_REG_GENSTART_IRQ_EN_Pos (14UL)              /*!< GENSTART_IRQ_EN (Bit 14)                              */\n#define SMOTOR_PG2_CTRL_REG_GENSTART_IRQ_EN_Msk (0x4000UL)          /*!< GENSTART_IRQ_EN (Bitfield-Mask: 0x01)                 */\n#define SMOTOR_PG2_CTRL_REG_PG_START_MODE_Pos (13UL)                /*!< PG_START_MODE (Bit 13)                                */\n#define SMOTOR_PG2_CTRL_REG_PG_START_MODE_Msk (0x2000UL)            /*!< PG_START_MODE (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG2_CTRL_REG_PG_MODE_Pos   (12UL)                    /*!< PG_MODE (Bit 12)                                      */\n#define SMOTOR_PG2_CTRL_REG_PG_MODE_Msk   (0x1000UL)                /*!< PG_MODE (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG2_CTRL_REG_SIG3_EN_Pos   (11UL)                    /*!< SIG3_EN (Bit 11)                                      */\n#define SMOTOR_PG2_CTRL_REG_SIG3_EN_Msk   (0x800UL)                 /*!< SIG3_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG2_CTRL_REG_SIG2_EN_Pos   (10UL)                    /*!< SIG2_EN (Bit 10)                                      */\n#define SMOTOR_PG2_CTRL_REG_SIG2_EN_Msk   (0x400UL)                 /*!< SIG2_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG2_CTRL_REG_SIG1_EN_Pos   (9UL)                     /*!< SIG1_EN (Bit 9)                                       */\n#define SMOTOR_PG2_CTRL_REG_SIG1_EN_Msk   (0x200UL)                 /*!< SIG1_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG2_CTRL_REG_SIG0_EN_Pos   (8UL)                     /*!< SIG0_EN (Bit 8)                                       */\n#define SMOTOR_PG2_CTRL_REG_SIG0_EN_Msk   (0x100UL)                 /*!< SIG0_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG2_CTRL_REG_OUT3_SIG_Pos  (6UL)                     /*!< OUT3_SIG (Bit 6)                                      */\n#define SMOTOR_PG2_CTRL_REG_OUT3_SIG_Msk  (0xc0UL)                  /*!< OUT3_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG2_CTRL_REG_OUT2_SIG_Pos  (4UL)                     /*!< OUT2_SIG (Bit 4)                                      */\n#define SMOTOR_PG2_CTRL_REG_OUT2_SIG_Msk  (0x30UL)                  /*!< OUT2_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG2_CTRL_REG_OUT1_SIG_Pos  (2UL)                     /*!< OUT1_SIG (Bit 2)                                      */\n#define SMOTOR_PG2_CTRL_REG_OUT1_SIG_Msk  (0xcUL)                   /*!< OUT1_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG2_CTRL_REG_OUT0_SIG_Pos  (0UL)                     /*!< OUT0_SIG (Bit 0)                                      */\n#define SMOTOR_PG2_CTRL_REG_OUT0_SIG_Msk  (0x3UL)                   /*!< OUT0_SIG (Bitfield-Mask: 0x03)                        */\n/* =====================================================  PG3_CTRL_REG  ====================================================== */\n#define SMOTOR_PG3_CTRL_REG_GENEND_IRQ_EN_Pos (15UL)                /*!< GENEND_IRQ_EN (Bit 15)                                */\n#define SMOTOR_PG3_CTRL_REG_GENEND_IRQ_EN_Msk (0x8000UL)            /*!< GENEND_IRQ_EN (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG3_CTRL_REG_GENSTART_IRQ_EN_Pos (14UL)              /*!< GENSTART_IRQ_EN (Bit 14)                              */\n#define SMOTOR_PG3_CTRL_REG_GENSTART_IRQ_EN_Msk (0x4000UL)          /*!< GENSTART_IRQ_EN (Bitfield-Mask: 0x01)                 */\n#define SMOTOR_PG3_CTRL_REG_PG_START_MODE_Pos (13UL)                /*!< PG_START_MODE (Bit 13)                                */\n#define SMOTOR_PG3_CTRL_REG_PG_START_MODE_Msk (0x2000UL)            /*!< PG_START_MODE (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG3_CTRL_REG_PG_MODE_Pos   (12UL)                    /*!< PG_MODE (Bit 12)                                      */\n#define SMOTOR_PG3_CTRL_REG_PG_MODE_Msk   (0x1000UL)                /*!< PG_MODE (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG3_CTRL_REG_SIG3_EN_Pos   (11UL)                    /*!< SIG3_EN (Bit 11)                                      */\n#define SMOTOR_PG3_CTRL_REG_SIG3_EN_Msk   (0x800UL)                 /*!< SIG3_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG3_CTRL_REG_SIG2_EN_Pos   (10UL)                    /*!< SIG2_EN (Bit 10)                                      */\n#define SMOTOR_PG3_CTRL_REG_SIG2_EN_Msk   (0x400UL)                 /*!< SIG2_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG3_CTRL_REG_SIG1_EN_Pos   (9UL)                     /*!< SIG1_EN (Bit 9)                                       */\n#define SMOTOR_PG3_CTRL_REG_SIG1_EN_Msk   (0x200UL)                 /*!< SIG1_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG3_CTRL_REG_SIG0_EN_Pos   (8UL)                     /*!< SIG0_EN (Bit 8)                                       */\n#define SMOTOR_PG3_CTRL_REG_SIG0_EN_Msk   (0x100UL)                 /*!< SIG0_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG3_CTRL_REG_OUT3_SIG_Pos  (6UL)                     /*!< OUT3_SIG (Bit 6)                                      */\n#define SMOTOR_PG3_CTRL_REG_OUT3_SIG_Msk  (0xc0UL)                  /*!< OUT3_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG3_CTRL_REG_OUT2_SIG_Pos  (4UL)                     /*!< OUT2_SIG (Bit 4)                                      */\n#define SMOTOR_PG3_CTRL_REG_OUT2_SIG_Msk  (0x30UL)                  /*!< OUT2_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG3_CTRL_REG_OUT1_SIG_Pos  (2UL)                     /*!< OUT1_SIG (Bit 2)                                      */\n#define SMOTOR_PG3_CTRL_REG_OUT1_SIG_Msk  (0xcUL)                   /*!< OUT1_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG3_CTRL_REG_OUT0_SIG_Pos  (0UL)                     /*!< OUT0_SIG (Bit 0)                                      */\n#define SMOTOR_PG3_CTRL_REG_OUT0_SIG_Msk  (0x3UL)                   /*!< OUT0_SIG (Bitfield-Mask: 0x03)                        */\n/* =====================================================  PG4_CTRL_REG  ====================================================== */\n#define SMOTOR_PG4_CTRL_REG_GENEND_IRQ_EN_Pos (15UL)                /*!< GENEND_IRQ_EN (Bit 15)                                */\n#define SMOTOR_PG4_CTRL_REG_GENEND_IRQ_EN_Msk (0x8000UL)            /*!< GENEND_IRQ_EN (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG4_CTRL_REG_GENSTART_IRQ_EN_Pos (14UL)              /*!< GENSTART_IRQ_EN (Bit 14)                              */\n#define SMOTOR_PG4_CTRL_REG_GENSTART_IRQ_EN_Msk (0x4000UL)          /*!< GENSTART_IRQ_EN (Bitfield-Mask: 0x01)                 */\n#define SMOTOR_PG4_CTRL_REG_PG_START_MODE_Pos (13UL)                /*!< PG_START_MODE (Bit 13)                                */\n#define SMOTOR_PG4_CTRL_REG_PG_START_MODE_Msk (0x2000UL)            /*!< PG_START_MODE (Bitfield-Mask: 0x01)                   */\n#define SMOTOR_PG4_CTRL_REG_PG_MODE_Pos   (12UL)                    /*!< PG_MODE (Bit 12)                                      */\n#define SMOTOR_PG4_CTRL_REG_PG_MODE_Msk   (0x1000UL)                /*!< PG_MODE (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG4_CTRL_REG_SIG3_EN_Pos   (11UL)                    /*!< SIG3_EN (Bit 11)                                      */\n#define SMOTOR_PG4_CTRL_REG_SIG3_EN_Msk   (0x800UL)                 /*!< SIG3_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG4_CTRL_REG_SIG2_EN_Pos   (10UL)                    /*!< SIG2_EN (Bit 10)                                      */\n#define SMOTOR_PG4_CTRL_REG_SIG2_EN_Msk   (0x400UL)                 /*!< SIG2_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG4_CTRL_REG_SIG1_EN_Pos   (9UL)                     /*!< SIG1_EN (Bit 9)                                       */\n#define SMOTOR_PG4_CTRL_REG_SIG1_EN_Msk   (0x200UL)                 /*!< SIG1_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG4_CTRL_REG_SIG0_EN_Pos   (8UL)                     /*!< SIG0_EN (Bit 8)                                       */\n#define SMOTOR_PG4_CTRL_REG_SIG0_EN_Msk   (0x100UL)                 /*!< SIG0_EN (Bitfield-Mask: 0x01)                         */\n#define SMOTOR_PG4_CTRL_REG_OUT3_SIG_Pos  (6UL)                     /*!< OUT3_SIG (Bit 6)                                      */\n#define SMOTOR_PG4_CTRL_REG_OUT3_SIG_Msk  (0xc0UL)                  /*!< OUT3_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG4_CTRL_REG_OUT2_SIG_Pos  (4UL)                     /*!< OUT2_SIG (Bit 4)                                      */\n#define SMOTOR_PG4_CTRL_REG_OUT2_SIG_Msk  (0x30UL)                  /*!< OUT2_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG4_CTRL_REG_OUT1_SIG_Pos  (2UL)                     /*!< OUT1_SIG (Bit 2)                                      */\n#define SMOTOR_PG4_CTRL_REG_OUT1_SIG_Msk  (0xcUL)                   /*!< OUT1_SIG (Bitfield-Mask: 0x03)                        */\n#define SMOTOR_PG4_CTRL_REG_OUT0_SIG_Pos  (0UL)                     /*!< OUT0_SIG (Bit 0)                                      */\n#define SMOTOR_PG4_CTRL_REG_OUT0_SIG_Msk  (0x3UL)                   /*!< OUT0_SIG (Bitfield-Mask: 0x03)                        */\n/* ==================================================  SMOTOR_CMD_FIFO_REG  ================================================== */\n#define SMOTOR_SMOTOR_CMD_FIFO_REG_SMOTOR_CMD_FIFO_Pos (0UL)        /*!< SMOTOR_CMD_FIFO (Bit 0)                               */\n#define SMOTOR_SMOTOR_CMD_FIFO_REG_SMOTOR_CMD_FIFO_Msk (0xffffUL)   /*!< SMOTOR_CMD_FIFO (Bitfield-Mask: 0xffff)               */\n/* ================================================  SMOTOR_CMD_READ_PTR_REG  ================================================ */\n#define SMOTOR_SMOTOR_CMD_READ_PTR_REG_SMOTOR_CMD_READ_PTR_Pos (0UL) /*!< SMOTOR_CMD_READ_PTR (Bit 0)                          */\n#define SMOTOR_SMOTOR_CMD_READ_PTR_REG_SMOTOR_CMD_READ_PTR_Msk (0x3fUL) /*!< SMOTOR_CMD_READ_PTR (Bitfield-Mask: 0x3f)         */\n/* ===============================================  SMOTOR_CMD_WRITE_PTR_REG  ================================================ */\n#define SMOTOR_SMOTOR_CMD_WRITE_PTR_REG_SMOTOR_CMD_WRITE_PTR_Pos (0UL) /*!< SMOTOR_CMD_WRITE_PTR (Bit 0)                       */\n#define SMOTOR_SMOTOR_CMD_WRITE_PTR_REG_SMOTOR_CMD_WRITE_PTR_Msk (0x3fUL) /*!< SMOTOR_CMD_WRITE_PTR (Bitfield-Mask: 0x3f)      */\n/* ====================================================  SMOTOR_CTRL_REG  ==================================================== */\n#define SMOTOR_SMOTOR_CTRL_REG_TRIG_RTC_EVENT_EN_Pos (28UL)         /*!< TRIG_RTC_EVENT_EN (Bit 28)                            */\n#define SMOTOR_SMOTOR_CTRL_REG_TRIG_RTC_EVENT_EN_Msk (0x10000000UL) /*!< TRIG_RTC_EVENT_EN (Bitfield-Mask: 0x01)               */\n#define SMOTOR_SMOTOR_CTRL_REG_MC_LP_CLK_TRIG_EN_Pos (27UL)         /*!< MC_LP_CLK_TRIG_EN (Bit 27)                            */\n#define SMOTOR_SMOTOR_CTRL_REG_MC_LP_CLK_TRIG_EN_Msk (0x8000000UL)  /*!< MC_LP_CLK_TRIG_EN (Bitfield-Mask: 0x01)               */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_THRESHOLD_IRQ_EN_Pos (26UL)   /*!< SMOTOR_THRESHOLD_IRQ_EN (Bit 26)                      */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_THRESHOLD_IRQ_EN_Msk (0x4000000UL) /*!< SMOTOR_THRESHOLD_IRQ_EN (Bitfield-Mask: 0x01)    */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_THRESHOLD_Pos (21UL)          /*!< SMOTOR_THRESHOLD (Bit 21)                             */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_THRESHOLD_Msk (0x3e00000UL)   /*!< SMOTOR_THRESHOLD (Bitfield-Mask: 0x1f)                */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_FIFO_UNR_IRQ_EN_Pos (20UL)    /*!< SMOTOR_FIFO_UNR_IRQ_EN (Bit 20)                       */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_FIFO_UNR_IRQ_EN_Msk (0x100000UL) /*!< SMOTOR_FIFO_UNR_IRQ_EN (Bitfield-Mask: 0x01)       */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_FIFO_OVF_IRQ_EN_Pos (19UL)    /*!< SMOTOR_FIFO_OVF_IRQ_EN (Bit 19)                       */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_FIFO_OVF_IRQ_EN_Msk (0x80000UL) /*!< SMOTOR_FIFO_OVF_IRQ_EN (Bitfield-Mask: 0x01)        */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_GENEND_IRQ_EN_Pos (18UL)      /*!< SMOTOR_GENEND_IRQ_EN (Bit 18)                         */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_GENEND_IRQ_EN_Msk (0x40000UL) /*!< SMOTOR_GENEND_IRQ_EN (Bitfield-Mask: 0x01)            */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_GENSTART_IRQ_EN_Pos (17UL)    /*!< SMOTOR_GENSTART_IRQ_EN (Bit 17)                       */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_GENSTART_IRQ_EN_Msk (0x20000UL) /*!< SMOTOR_GENSTART_IRQ_EN (Bitfield-Mask: 0x01)        */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_MOI_Pos (7UL)                 /*!< SMOTOR_MOI (Bit 7)                                    */\n#define SMOTOR_SMOTOR_CTRL_REG_SMOTOR_MOI_Msk (0x1ff80UL)           /*!< SMOTOR_MOI (Bitfield-Mask: 0x3ff)                     */\n#define SMOTOR_SMOTOR_CTRL_REG_CYCLIC_SIZE_Pos (1UL)                /*!< CYCLIC_SIZE (Bit 1)                                   */\n#define SMOTOR_SMOTOR_CTRL_REG_CYCLIC_SIZE_Msk (0x7eUL)             /*!< CYCLIC_SIZE (Bitfield-Mask: 0x3f)                     */\n#define SMOTOR_SMOTOR_CTRL_REG_CYCLIC_MODE_Pos (0UL)                /*!< CYCLIC_MODE (Bit 0)                                   */\n#define SMOTOR_SMOTOR_CTRL_REG_CYCLIC_MODE_Msk (0x1UL)              /*!< CYCLIC_MODE (Bitfield-Mask: 0x01)                     */\n/* =================================================  SMOTOR_IRQ_CLEAR_REG  ================================================== */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_THRESHOLD_IRQ_CLEAR_Pos (4UL)   /*!< THRESHOLD_IRQ_CLEAR (Bit 4)                           */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_THRESHOLD_IRQ_CLEAR_Msk (0x10UL) /*!< THRESHOLD_IRQ_CLEAR (Bitfield-Mask: 0x01)            */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_FIFO_UNR_IRQ_CLEAR_Pos (3UL)    /*!< FIFO_UNR_IRQ_CLEAR (Bit 3)                            */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_FIFO_UNR_IRQ_CLEAR_Msk (0x8UL)  /*!< FIFO_UNR_IRQ_CLEAR (Bitfield-Mask: 0x01)              */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_FIFO_OVF_IRQ_CLEAR_Pos (2UL)    /*!< FIFO_OVF_IRQ_CLEAR (Bit 2)                            */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_FIFO_OVF_IRQ_CLEAR_Msk (0x4UL)  /*!< FIFO_OVF_IRQ_CLEAR (Bitfield-Mask: 0x01)              */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_GENEND_IRQ_CLEAR_Pos (1UL)      /*!< GENEND_IRQ_CLEAR (Bit 1)                              */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_GENEND_IRQ_CLEAR_Msk (0x2UL)    /*!< GENEND_IRQ_CLEAR (Bitfield-Mask: 0x01)                */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_GENSTART_IRQ_CLEAR_Pos (0UL)    /*!< GENSTART_IRQ_CLEAR (Bit 0)                            */\n#define SMOTOR_SMOTOR_IRQ_CLEAR_REG_GENSTART_IRQ_CLEAR_Msk (0x1UL)  /*!< GENSTART_IRQ_CLEAR (Bitfield-Mask: 0x01)              */\n/* ===================================================  SMOTOR_STATUS_REG  =================================================== */\n#define SMOTOR_SMOTOR_STATUS_REG_PG4_BUSY_Pos (9UL)                 /*!< PG4_BUSY (Bit 9)                                      */\n#define SMOTOR_SMOTOR_STATUS_REG_PG4_BUSY_Msk (0x200UL)             /*!< PG4_BUSY (Bitfield-Mask: 0x01)                        */\n#define SMOTOR_SMOTOR_STATUS_REG_PG3_BUSY_Pos (8UL)                 /*!< PG3_BUSY (Bit 8)                                      */\n#define SMOTOR_SMOTOR_STATUS_REG_PG3_BUSY_Msk (0x100UL)             /*!< PG3_BUSY (Bitfield-Mask: 0x01)                        */\n#define SMOTOR_SMOTOR_STATUS_REG_PG2_BUSY_Pos (7UL)                 /*!< PG2_BUSY (Bit 7)                                      */\n#define SMOTOR_SMOTOR_STATUS_REG_PG2_BUSY_Msk (0x80UL)              /*!< PG2_BUSY (Bitfield-Mask: 0x01)                        */\n#define SMOTOR_SMOTOR_STATUS_REG_PG1_BUSY_Pos (6UL)                 /*!< PG1_BUSY (Bit 6)                                      */\n#define SMOTOR_SMOTOR_STATUS_REG_PG1_BUSY_Msk (0x40UL)              /*!< PG1_BUSY (Bitfield-Mask: 0x01)                        */\n#define SMOTOR_SMOTOR_STATUS_REG_PG0_BUSY_Pos (5UL)                 /*!< PG0_BUSY (Bit 5)                                      */\n#define SMOTOR_SMOTOR_STATUS_REG_PG0_BUSY_Msk (0x20UL)              /*!< PG0_BUSY (Bitfield-Mask: 0x01)                        */\n#define SMOTOR_SMOTOR_STATUS_REG_THRESHOLD_IRQ_STATUS_Pos (4UL)     /*!< THRESHOLD_IRQ_STATUS (Bit 4)                          */\n#define SMOTOR_SMOTOR_STATUS_REG_THRESHOLD_IRQ_STATUS_Msk (0x10UL)  /*!< THRESHOLD_IRQ_STATUS (Bitfield-Mask: 0x01)            */\n#define SMOTOR_SMOTOR_STATUS_REG_FIFO_UNR_IRQ_STATUS_Pos (3UL)      /*!< FIFO_UNR_IRQ_STATUS (Bit 3)                           */\n#define SMOTOR_SMOTOR_STATUS_REG_FIFO_UNR_IRQ_STATUS_Msk (0x8UL)    /*!< FIFO_UNR_IRQ_STATUS (Bitfield-Mask: 0x01)             */\n#define SMOTOR_SMOTOR_STATUS_REG_FIFO_OVF_IRQ_STATUS_Pos (2UL)      /*!< FIFO_OVF_IRQ_STATUS (Bit 2)                           */\n#define SMOTOR_SMOTOR_STATUS_REG_FIFO_OVF_IRQ_STATUS_Msk (0x4UL)    /*!< FIFO_OVF_IRQ_STATUS (Bitfield-Mask: 0x01)             */\n#define SMOTOR_SMOTOR_STATUS_REG_GENEND_IRQ_STATUS_Pos (1UL)        /*!< GENEND_IRQ_STATUS (Bit 1)                             */\n#define SMOTOR_SMOTOR_STATUS_REG_GENEND_IRQ_STATUS_Msk (0x2UL)      /*!< GENEND_IRQ_STATUS (Bitfield-Mask: 0x01)               */\n#define SMOTOR_SMOTOR_STATUS_REG_GENSTART_IRQ_STATUS_Pos (0UL)      /*!< GENSTART_IRQ_STATUS (Bit 0)                           */\n#define SMOTOR_SMOTOR_STATUS_REG_GENSTART_IRQ_STATUS_Msk (0x1UL)    /*!< GENSTART_IRQ_STATUS (Bitfield-Mask: 0x01)             */\n/* ==================================================  SMOTOR_TRIGGER_REG  =================================================== */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG4_START_Pos (5UL)               /*!< PG4_START (Bit 5)                                     */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG4_START_Msk (0x20UL)            /*!< PG4_START (Bitfield-Mask: 0x01)                       */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG3_START_Pos (4UL)               /*!< PG3_START (Bit 4)                                     */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG3_START_Msk (0x10UL)            /*!< PG3_START (Bitfield-Mask: 0x01)                       */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG2_START_Pos (3UL)               /*!< PG2_START (Bit 3)                                     */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG2_START_Msk (0x8UL)             /*!< PG2_START (Bitfield-Mask: 0x01)                       */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG1_START_Pos (2UL)               /*!< PG1_START (Bit 2)                                     */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG1_START_Msk (0x4UL)             /*!< PG1_START (Bitfield-Mask: 0x01)                       */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG0_START_Pos (1UL)               /*!< PG0_START (Bit 1)                                     */\n#define SMOTOR_SMOTOR_TRIGGER_REG_PG0_START_Msk (0x2UL)             /*!< PG0_START (Bitfield-Mask: 0x01)                       */\n#define SMOTOR_SMOTOR_TRIGGER_REG_POP_CMD_Pos (0UL)                 /*!< POP_CMD (Bit 0)                                       */\n#define SMOTOR_SMOTOR_TRIGGER_REG_POP_CMD_Msk (0x1UL)               /*!< POP_CMD (Bitfield-Mask: 0x01)                         */\n/* ====================================================  WAVETABLE_BASE  ===================================================== */\n\n\n/* =========================================================================================================================== */\n/* ================                                            SNC                                            ================ */\n/* =========================================================================================================================== */\n\n/* =====================================================  SNC_CTRL_REG  ====================================================== */\n#define SNC_SNC_CTRL_REG_SNC_IRQ_ACK_Pos  (8UL)                     /*!< SNC_IRQ_ACK (Bit 8)                                   */\n#define SNC_SNC_CTRL_REG_SNC_IRQ_ACK_Msk  (0x100UL)                 /*!< SNC_IRQ_ACK (Bitfield-Mask: 0x01)                     */\n#define SNC_SNC_CTRL_REG_SNC_IRQ_CONFIG_Pos (6UL)                   /*!< SNC_IRQ_CONFIG (Bit 6)                                */\n#define SNC_SNC_CTRL_REG_SNC_IRQ_CONFIG_Msk (0xc0UL)                /*!< SNC_IRQ_CONFIG (Bitfield-Mask: 0x03)                  */\n#define SNC_SNC_CTRL_REG_SNC_IRQ_EN_Pos   (5UL)                     /*!< SNC_IRQ_EN (Bit 5)                                    */\n#define SNC_SNC_CTRL_REG_SNC_IRQ_EN_Msk   (0x20UL)                  /*!< SNC_IRQ_EN (Bitfield-Mask: 0x01)                      */\n#define SNC_SNC_CTRL_REG_SNC_BRANCH_LOOP_INIT_Pos (4UL)             /*!< SNC_BRANCH_LOOP_INIT (Bit 4)                          */\n#define SNC_SNC_CTRL_REG_SNC_BRANCH_LOOP_INIT_Msk (0x10UL)          /*!< SNC_BRANCH_LOOP_INIT (Bitfield-Mask: 0x01)            */\n#define SNC_SNC_CTRL_REG_SNC_RESET_Pos    (3UL)                     /*!< SNC_RESET (Bit 3)                                     */\n#define SNC_SNC_CTRL_REG_SNC_RESET_Msk    (0x8UL)                   /*!< SNC_RESET (Bitfield-Mask: 0x01)                       */\n#define SNC_SNC_CTRL_REG_BUS_ERROR_DETECT_EN_Pos (2UL)              /*!< BUS_ERROR_DETECT_EN (Bit 2)                           */\n#define SNC_SNC_CTRL_REG_BUS_ERROR_DETECT_EN_Msk (0x4UL)            /*!< BUS_ERROR_DETECT_EN (Bitfield-Mask: 0x01)             */\n#define SNC_SNC_CTRL_REG_SNC_SW_CTRL_Pos  (1UL)                     /*!< SNC_SW_CTRL (Bit 1)                                   */\n#define SNC_SNC_CTRL_REG_SNC_SW_CTRL_Msk  (0x2UL)                   /*!< SNC_SW_CTRL (Bitfield-Mask: 0x01)                     */\n#define SNC_SNC_CTRL_REG_SNC_EN_Pos       (0UL)                     /*!< SNC_EN (Bit 0)                                        */\n#define SNC_SNC_CTRL_REG_SNC_EN_Msk       (0x1UL)                   /*!< SNC_EN (Bitfield-Mask: 0x01)                          */\n/* ===================================================  SNC_LP_TIMER_REG  ==================================================== */\n#define SNC_SNC_LP_TIMER_REG_LP_TIMER_Pos (0UL)                     /*!< LP_TIMER (Bit 0)                                      */\n#define SNC_SNC_LP_TIMER_REG_LP_TIMER_Msk (0xffUL)                  /*!< LP_TIMER (Bitfield-Mask: 0xff)                        */\n/* ======================================================  SNC_PC_REG  ======================================================= */\n#define SNC_SNC_PC_REG_PC_REG_Pos         (2UL)                     /*!< PC_REG (Bit 2)                                        */\n#define SNC_SNC_PC_REG_PC_REG_Msk         (0x7fffcUL)               /*!< PC_REG (Bitfield-Mask: 0x1ffff)                       */\n/* ======================================================  SNC_R1_REG  ======================================================= */\n#define SNC_SNC_R1_REG_R1_REG_Pos         (0UL)                     /*!< R1_REG (Bit 0)                                        */\n#define SNC_SNC_R1_REG_R1_REG_Msk         (0xffffffffUL)            /*!< R1_REG (Bitfield-Mask: 0xffffffff)                    */\n/* ======================================================  SNC_R2_REG  ======================================================= */\n#define SNC_SNC_R2_REG_R2_REG_Pos         (0UL)                     /*!< R2_REG (Bit 0)                                        */\n#define SNC_SNC_R2_REG_R2_REG_Msk         (0xffffffffUL)            /*!< R2_REG (Bitfield-Mask: 0xffffffff)                    */\n/* ====================================================  SNC_STATUS_REG  ===================================================== */\n#define SNC_SNC_STATUS_REG_SNC_PC_LOADED_Pos (6UL)                  /*!< SNC_PC_LOADED (Bit 6)                                 */\n#define SNC_SNC_STATUS_REG_SNC_PC_LOADED_Msk (0x40UL)               /*!< SNC_PC_LOADED (Bitfield-Mask: 0x01)                   */\n#define SNC_SNC_STATUS_REG_SNC_IS_STOPPED_Pos (5UL)                 /*!< SNC_IS_STOPPED (Bit 5)                                */\n#define SNC_SNC_STATUS_REG_SNC_IS_STOPPED_Msk (0x20UL)              /*!< SNC_IS_STOPPED (Bitfield-Mask: 0x01)                  */\n#define SNC_SNC_STATUS_REG_HARD_FAULT_STATUS_Pos (4UL)              /*!< HARD_FAULT_STATUS (Bit 4)                             */\n#define SNC_SNC_STATUS_REG_HARD_FAULT_STATUS_Msk (0x10UL)           /*!< HARD_FAULT_STATUS (Bitfield-Mask: 0x01)               */\n#define SNC_SNC_STATUS_REG_BUS_ERROR_STATUS_Pos (3UL)               /*!< BUS_ERROR_STATUS (Bit 3)                              */\n#define SNC_SNC_STATUS_REG_BUS_ERROR_STATUS_Msk (0x8UL)             /*!< BUS_ERROR_STATUS (Bitfield-Mask: 0x01)                */\n#define SNC_SNC_STATUS_REG_SNC_DONE_STATUS_Pos (2UL)                /*!< SNC_DONE_STATUS (Bit 2)                               */\n#define SNC_SNC_STATUS_REG_SNC_DONE_STATUS_Msk (0x4UL)              /*!< SNC_DONE_STATUS (Bitfield-Mask: 0x01)                 */\n#define SNC_SNC_STATUS_REG_GR_FLAG_Pos    (1UL)                     /*!< GR_FLAG (Bit 1)                                       */\n#define SNC_SNC_STATUS_REG_GR_FLAG_Msk    (0x2UL)                   /*!< GR_FLAG (Bitfield-Mask: 0x01)                         */\n#define SNC_SNC_STATUS_REG_EQ_FLAG_Pos    (0UL)                     /*!< EQ_FLAG (Bit 0)                                       */\n#define SNC_SNC_STATUS_REG_EQ_FLAG_Msk    (0x1UL)                   /*!< EQ_FLAG (Bitfield-Mask: 0x01)                         */\n/* =====================================================  SNC_TMP1_REG  ====================================================== */\n#define SNC_SNC_TMP1_REG_TMP1_REG_Pos     (0UL)                     /*!< TMP1_REG (Bit 0)                                      */\n#define SNC_SNC_TMP1_REG_TMP1_REG_Msk     (0xffffffffUL)            /*!< TMP1_REG (Bitfield-Mask: 0xffffffff)                  */\n/* =====================================================  SNC_TMP2_REG  ====================================================== */\n#define SNC_SNC_TMP2_REG_TMP2_REG_Pos     (0UL)                     /*!< TMP2_REG (Bit 0)                                      */\n#define SNC_SNC_TMP2_REG_TMP2_REG_Msk     (0xffffffffUL)            /*!< TMP2_REG (Bitfield-Mask: 0xffffffff)                  */\n\n\n/* =========================================================================================================================== */\n/* ================                                            SPI                                            ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  SPI_CLEAR_INT_REG  =================================================== */\n#define SPI_SPI_CLEAR_INT_REG_SPI_CLEAR_INT_Pos (0UL)               /*!< SPI_CLEAR_INT (Bit 0)                                 */\n#define SPI_SPI_CLEAR_INT_REG_SPI_CLEAR_INT_Msk (0xffffffffUL)      /*!< SPI_CLEAR_INT (Bitfield-Mask: 0xffffffff)             */\n/* =====================================================  SPI_CTRL_REG  ====================================================== */\n#define SPI_SPI_CTRL_REG_SPI_TX_FIFO_NOTFULL_MASK_Pos (25UL)        /*!< SPI_TX_FIFO_NOTFULL_MASK (Bit 25)                     */\n#define SPI_SPI_CTRL_REG_SPI_TX_FIFO_NOTFULL_MASK_Msk (0x2000000UL) /*!< SPI_TX_FIFO_NOTFULL_MASK (Bitfield-Mask: 0x01)        */\n#define SPI_SPI_CTRL_REG_SPI_DMA_TXREQ_MODE_Pos (24UL)              /*!< SPI_DMA_TXREQ_MODE (Bit 24)                           */\n#define SPI_SPI_CTRL_REG_SPI_DMA_TXREQ_MODE_Msk (0x1000000UL)       /*!< SPI_DMA_TXREQ_MODE (Bitfield-Mask: 0x01)              */\n#define SPI_SPI_CTRL_REG_SPI_TX_FIFO_EMPTY_Pos (23UL)               /*!< SPI_TX_FIFO_EMPTY (Bit 23)                            */\n#define SPI_SPI_CTRL_REG_SPI_TX_FIFO_EMPTY_Msk (0x800000UL)         /*!< SPI_TX_FIFO_EMPTY (Bitfield-Mask: 0x01)               */\n#define SPI_SPI_CTRL_REG_SPI_RX_FIFO_FULL_Pos (22UL)                /*!< SPI_RX_FIFO_FULL (Bit 22)                             */\n#define SPI_SPI_CTRL_REG_SPI_RX_FIFO_FULL_Msk (0x400000UL)          /*!< SPI_RX_FIFO_FULL (Bitfield-Mask: 0x01)                */\n#define SPI_SPI_CTRL_REG_SPI_RX_FIFO_EMPTY_Pos (21UL)               /*!< SPI_RX_FIFO_EMPTY (Bit 21)                            */\n#define SPI_SPI_CTRL_REG_SPI_RX_FIFO_EMPTY_Msk (0x200000UL)         /*!< SPI_RX_FIFO_EMPTY (Bitfield-Mask: 0x01)               */\n#define SPI_SPI_CTRL_REG_SPI_9BIT_VAL_Pos (20UL)                    /*!< SPI_9BIT_VAL (Bit 20)                                 */\n#define SPI_SPI_CTRL_REG_SPI_9BIT_VAL_Msk (0x100000UL)              /*!< SPI_9BIT_VAL (Bitfield-Mask: 0x01)                    */\n#define SPI_SPI_CTRL_REG_SPI_BUSY_Pos     (19UL)                    /*!< SPI_BUSY (Bit 19)                                     */\n#define SPI_SPI_CTRL_REG_SPI_BUSY_Msk     (0x80000UL)               /*!< SPI_BUSY (Bitfield-Mask: 0x01)                        */\n#define SPI_SPI_CTRL_REG_SPI_PRIORITY_Pos (18UL)                    /*!< SPI_PRIORITY (Bit 18)                                 */\n#define SPI_SPI_CTRL_REG_SPI_PRIORITY_Msk (0x40000UL)               /*!< SPI_PRIORITY (Bitfield-Mask: 0x01)                    */\n#define SPI_SPI_CTRL_REG_SPI_FIFO_MODE_Pos (16UL)                   /*!< SPI_FIFO_MODE (Bit 16)                                */\n#define SPI_SPI_CTRL_REG_SPI_FIFO_MODE_Msk (0x30000UL)              /*!< SPI_FIFO_MODE (Bitfield-Mask: 0x03)                   */\n#define SPI_SPI_CTRL_REG_SPI_EN_CTRL_Pos  (15UL)                    /*!< SPI_EN_CTRL (Bit 15)                                  */\n#define SPI_SPI_CTRL_REG_SPI_EN_CTRL_Msk  (0x8000UL)                /*!< SPI_EN_CTRL (Bitfield-Mask: 0x01)                     */\n#define SPI_SPI_CTRL_REG_SPI_MINT_Pos     (14UL)                    /*!< SPI_MINT (Bit 14)                                     */\n#define SPI_SPI_CTRL_REG_SPI_MINT_Msk     (0x4000UL)                /*!< SPI_MINT (Bitfield-Mask: 0x01)                        */\n#define SPI_SPI_CTRL_REG_SPI_INT_BIT_Pos  (13UL)                    /*!< SPI_INT_BIT (Bit 13)                                  */\n#define SPI_SPI_CTRL_REG_SPI_INT_BIT_Msk  (0x2000UL)                /*!< SPI_INT_BIT (Bitfield-Mask: 0x01)                     */\n#define SPI_SPI_CTRL_REG_SPI_DI_Pos       (12UL)                    /*!< SPI_DI (Bit 12)                                       */\n#define SPI_SPI_CTRL_REG_SPI_DI_Msk       (0x1000UL)                /*!< SPI_DI (Bitfield-Mask: 0x01)                          */\n#define SPI_SPI_CTRL_REG_SPI_TXH_Pos      (11UL)                    /*!< SPI_TXH (Bit 11)                                      */\n#define SPI_SPI_CTRL_REG_SPI_TXH_Msk      (0x800UL)                 /*!< SPI_TXH (Bitfield-Mask: 0x01)                         */\n#define SPI_SPI_CTRL_REG_SPI_FORCE_DO_Pos (10UL)                    /*!< SPI_FORCE_DO (Bit 10)                                 */\n#define SPI_SPI_CTRL_REG_SPI_FORCE_DO_Msk (0x400UL)                 /*!< SPI_FORCE_DO (Bitfield-Mask: 0x01)                    */\n#define SPI_SPI_CTRL_REG_SPI_WORD_Pos     (8UL)                     /*!< SPI_WORD (Bit 8)                                      */\n#define SPI_SPI_CTRL_REG_SPI_WORD_Msk     (0x300UL)                 /*!< SPI_WORD (Bitfield-Mask: 0x03)                        */\n#define SPI_SPI_CTRL_REG_SPI_RST_Pos      (7UL)                     /*!< SPI_RST (Bit 7)                                       */\n#define SPI_SPI_CTRL_REG_SPI_RST_Msk      (0x80UL)                  /*!< SPI_RST (Bitfield-Mask: 0x01)                         */\n#define SPI_SPI_CTRL_REG_SPI_SMN_Pos      (6UL)                     /*!< SPI_SMN (Bit 6)                                       */\n#define SPI_SPI_CTRL_REG_SPI_SMN_Msk      (0x40UL)                  /*!< SPI_SMN (Bitfield-Mask: 0x01)                         */\n#define SPI_SPI_CTRL_REG_SPI_DO_Pos       (5UL)                     /*!< SPI_DO (Bit 5)                                        */\n#define SPI_SPI_CTRL_REG_SPI_DO_Msk       (0x20UL)                  /*!< SPI_DO (Bitfield-Mask: 0x01)                          */\n#define SPI_SPI_CTRL_REG_SPI_CLK_Pos      (3UL)                     /*!< SPI_CLK (Bit 3)                                       */\n#define SPI_SPI_CTRL_REG_SPI_CLK_Msk      (0x18UL)                  /*!< SPI_CLK (Bitfield-Mask: 0x03)                         */\n#define SPI_SPI_CTRL_REG_SPI_POL_Pos      (2UL)                     /*!< SPI_POL (Bit 2)                                       */\n#define SPI_SPI_CTRL_REG_SPI_POL_Msk      (0x4UL)                   /*!< SPI_POL (Bitfield-Mask: 0x01)                         */\n#define SPI_SPI_CTRL_REG_SPI_PHA_Pos      (1UL)                     /*!< SPI_PHA (Bit 1)                                       */\n#define SPI_SPI_CTRL_REG_SPI_PHA_Msk      (0x2UL)                   /*!< SPI_PHA (Bitfield-Mask: 0x01)                         */\n#define SPI_SPI_CTRL_REG_SPI_ON_Pos       (0UL)                     /*!< SPI_ON (Bit 0)                                        */\n#define SPI_SPI_CTRL_REG_SPI_ON_Msk       (0x1UL)                   /*!< SPI_ON (Bitfield-Mask: 0x01)                          */\n/* =====================================================  SPI_RX_TX_REG  ===================================================== */\n#define SPI_SPI_RX_TX_REG_SPI_DATA_Pos    (0UL)                     /*!< SPI_DATA (Bit 0)                                      */\n#define SPI_SPI_RX_TX_REG_SPI_DATA_Msk    (0xffffffffUL)            /*!< SPI_DATA (Bitfield-Mask: 0xffffffff)                  */\n\n\n/* =========================================================================================================================== */\n/* ================                                           SPI2                                            ================ */\n/* =========================================================================================================================== */\n\n/* ==================================================  SPI2_CLEAR_INT_REG  =================================================== */\n#define SPI2_SPI2_CLEAR_INT_REG_SPI_CLEAR_INT_Pos (0UL)             /*!< SPI_CLEAR_INT (Bit 0)                                 */\n#define SPI2_SPI2_CLEAR_INT_REG_SPI_CLEAR_INT_Msk (0xffffffffUL)    /*!< SPI_CLEAR_INT (Bitfield-Mask: 0xffffffff)             */\n/* =====================================================  SPI2_CTRL_REG  ===================================================== */\n#define SPI2_SPI2_CTRL_REG_SPI_TX_FIFO_NOTFULL_MASK_Pos (25UL)      /*!< SPI_TX_FIFO_NOTFULL_MASK (Bit 25)                     */\n#define SPI2_SPI2_CTRL_REG_SPI_TX_FIFO_NOTFULL_MASK_Msk (0x2000000UL) /*!< SPI_TX_FIFO_NOTFULL_MASK (Bitfield-Mask: 0x01)      */\n#define SPI2_SPI2_CTRL_REG_SPI_DMA_TXREQ_MODE_Pos (24UL)            /*!< SPI_DMA_TXREQ_MODE (Bit 24)                           */\n#define SPI2_SPI2_CTRL_REG_SPI_DMA_TXREQ_MODE_Msk (0x1000000UL)     /*!< SPI_DMA_TXREQ_MODE (Bitfield-Mask: 0x01)              */\n#define SPI2_SPI2_CTRL_REG_SPI_TX_FIFO_EMPTY_Pos (23UL)             /*!< SPI_TX_FIFO_EMPTY (Bit 23)                            */\n#define SPI2_SPI2_CTRL_REG_SPI_TX_FIFO_EMPTY_Msk (0x800000UL)       /*!< SPI_TX_FIFO_EMPTY (Bitfield-Mask: 0x01)               */\n#define SPI2_SPI2_CTRL_REG_SPI_RX_FIFO_FULL_Pos (22UL)              /*!< SPI_RX_FIFO_FULL (Bit 22)                             */\n#define SPI2_SPI2_CTRL_REG_SPI_RX_FIFO_FULL_Msk (0x400000UL)        /*!< SPI_RX_FIFO_FULL (Bitfield-Mask: 0x01)                */\n#define SPI2_SPI2_CTRL_REG_SPI_RX_FIFO_EMPTY_Pos (21UL)             /*!< SPI_RX_FIFO_EMPTY (Bit 21)                            */\n#define SPI2_SPI2_CTRL_REG_SPI_RX_FIFO_EMPTY_Msk (0x200000UL)       /*!< SPI_RX_FIFO_EMPTY (Bitfield-Mask: 0x01)               */\n#define SPI2_SPI2_CTRL_REG_SPI_9BIT_VAL_Pos (20UL)                  /*!< SPI_9BIT_VAL (Bit 20)                                 */\n#define SPI2_SPI2_CTRL_REG_SPI_9BIT_VAL_Msk (0x100000UL)            /*!< SPI_9BIT_VAL (Bitfield-Mask: 0x01)                    */\n#define SPI2_SPI2_CTRL_REG_SPI_BUSY_Pos   (19UL)                    /*!< SPI_BUSY (Bit 19)                                     */\n#define SPI2_SPI2_CTRL_REG_SPI_BUSY_Msk   (0x80000UL)               /*!< SPI_BUSY (Bitfield-Mask: 0x01)                        */\n#define SPI2_SPI2_CTRL_REG_SPI_PRIORITY_Pos (18UL)                  /*!< SPI_PRIORITY (Bit 18)                                 */\n#define SPI2_SPI2_CTRL_REG_SPI_PRIORITY_Msk (0x40000UL)             /*!< SPI_PRIORITY (Bitfield-Mask: 0x01)                    */\n#define SPI2_SPI2_CTRL_REG_SPI_FIFO_MODE_Pos (16UL)                 /*!< SPI_FIFO_MODE (Bit 16)                                */\n#define SPI2_SPI2_CTRL_REG_SPI_FIFO_MODE_Msk (0x30000UL)            /*!< SPI_FIFO_MODE (Bitfield-Mask: 0x03)                   */\n#define SPI2_SPI2_CTRL_REG_SPI_EN_CTRL_Pos (15UL)                   /*!< SPI_EN_CTRL (Bit 15)                                  */\n#define SPI2_SPI2_CTRL_REG_SPI_EN_CTRL_Msk (0x8000UL)               /*!< SPI_EN_CTRL (Bitfield-Mask: 0x01)                     */\n#define SPI2_SPI2_CTRL_REG_SPI_MINT_Pos   (14UL)                    /*!< SPI_MINT (Bit 14)                                     */\n#define SPI2_SPI2_CTRL_REG_SPI_MINT_Msk   (0x4000UL)                /*!< SPI_MINT (Bitfield-Mask: 0x01)                        */\n#define SPI2_SPI2_CTRL_REG_SPI_INT_BIT_Pos (13UL)                   /*!< SPI_INT_BIT (Bit 13)                                  */\n#define SPI2_SPI2_CTRL_REG_SPI_INT_BIT_Msk (0x2000UL)               /*!< SPI_INT_BIT (Bitfield-Mask: 0x01)                     */\n#define SPI2_SPI2_CTRL_REG_SPI_DI_Pos     (12UL)                    /*!< SPI_DI (Bit 12)                                       */\n#define SPI2_SPI2_CTRL_REG_SPI_DI_Msk     (0x1000UL)                /*!< SPI_DI (Bitfield-Mask: 0x01)                          */\n#define SPI2_SPI2_CTRL_REG_SPI_TXH_Pos    (11UL)                    /*!< SPI_TXH (Bit 11)                                      */\n#define SPI2_SPI2_CTRL_REG_SPI_TXH_Msk    (0x800UL)                 /*!< SPI_TXH (Bitfield-Mask: 0x01)                         */\n#define SPI2_SPI2_CTRL_REG_SPI_FORCE_DO_Pos (10UL)                  /*!< SPI_FORCE_DO (Bit 10)                                 */\n#define SPI2_SPI2_CTRL_REG_SPI_FORCE_DO_Msk (0x400UL)               /*!< SPI_FORCE_DO (Bitfield-Mask: 0x01)                    */\n#define SPI2_SPI2_CTRL_REG_SPI_WORD_Pos   (8UL)                     /*!< SPI_WORD (Bit 8)                                      */\n#define SPI2_SPI2_CTRL_REG_SPI_WORD_Msk   (0x300UL)                 /*!< SPI_WORD (Bitfield-Mask: 0x03)                        */\n#define SPI2_SPI2_CTRL_REG_SPI_RST_Pos    (7UL)                     /*!< SPI_RST (Bit 7)                                       */\n#define SPI2_SPI2_CTRL_REG_SPI_RST_Msk    (0x80UL)                  /*!< SPI_RST (Bitfield-Mask: 0x01)                         */\n#define SPI2_SPI2_CTRL_REG_SPI_SMN_Pos    (6UL)                     /*!< SPI_SMN (Bit 6)                                       */\n#define SPI2_SPI2_CTRL_REG_SPI_SMN_Msk    (0x40UL)                  /*!< SPI_SMN (Bitfield-Mask: 0x01)                         */\n#define SPI2_SPI2_CTRL_REG_SPI_DO_Pos     (5UL)                     /*!< SPI_DO (Bit 5)                                        */\n#define SPI2_SPI2_CTRL_REG_SPI_DO_Msk     (0x20UL)                  /*!< SPI_DO (Bitfield-Mask: 0x01)                          */\n#define SPI2_SPI2_CTRL_REG_SPI_CLK_Pos    (3UL)                     /*!< SPI_CLK (Bit 3)                                       */\n#define SPI2_SPI2_CTRL_REG_SPI_CLK_Msk    (0x18UL)                  /*!< SPI_CLK (Bitfield-Mask: 0x03)                         */\n#define SPI2_SPI2_CTRL_REG_SPI_POL_Pos    (2UL)                     /*!< SPI_POL (Bit 2)                                       */\n#define SPI2_SPI2_CTRL_REG_SPI_POL_Msk    (0x4UL)                   /*!< SPI_POL (Bitfield-Mask: 0x01)                         */\n#define SPI2_SPI2_CTRL_REG_SPI_PHA_Pos    (1UL)                     /*!< SPI_PHA (Bit 1)                                       */\n#define SPI2_SPI2_CTRL_REG_SPI_PHA_Msk    (0x2UL)                   /*!< SPI_PHA (Bitfield-Mask: 0x01)                         */\n#define SPI2_SPI2_CTRL_REG_SPI_ON_Pos     (0UL)                     /*!< SPI_ON (Bit 0)                                        */\n#define SPI2_SPI2_CTRL_REG_SPI_ON_Msk     (0x1UL)                   /*!< SPI_ON (Bitfield-Mask: 0x01)                          */\n/* ====================================================  SPI2_RX_TX_REG  ===================================================== */\n#define SPI2_SPI2_RX_TX_REG_SPI_DATA_Pos  (0UL)                     /*!< SPI_DATA (Bit 0)                                      */\n#define SPI2_SPI2_RX_TX_REG_SPI_DATA_Msk  (0xffffffffUL)            /*!< SPI_DATA (Bitfield-Mask: 0xffffffff)                  */\n\n\n/* =========================================================================================================================== */\n/* ================                                         SYS_WDOG                                          ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  WATCHDOG_CTRL_REG  =================================================== */\n#define SYS_WDOG_WATCHDOG_CTRL_REG_WRITE_BUSY_Pos (3UL)             /*!< WRITE_BUSY (Bit 3)                                    */\n#define SYS_WDOG_WATCHDOG_CTRL_REG_WRITE_BUSY_Msk (0x8UL)           /*!< WRITE_BUSY (Bitfield-Mask: 0x01)                      */\n#define SYS_WDOG_WATCHDOG_CTRL_REG_WDOG_FREEZE_EN_Pos (2UL)         /*!< WDOG_FREEZE_EN (Bit 2)                                */\n#define SYS_WDOG_WATCHDOG_CTRL_REG_WDOG_FREEZE_EN_Msk (0x4UL)       /*!< WDOG_FREEZE_EN (Bitfield-Mask: 0x01)                  */\n#define SYS_WDOG_WATCHDOG_CTRL_REG_NMI_RST_Pos (0UL)                /*!< NMI_RST (Bit 0)                                       */\n#define SYS_WDOG_WATCHDOG_CTRL_REG_NMI_RST_Msk (0x1UL)              /*!< NMI_RST (Bitfield-Mask: 0x01)                         */\n/* =====================================================  WATCHDOG_REG  ====================================================== */\n#define SYS_WDOG_WATCHDOG_REG_WDOG_WEN_Pos (14UL)                   /*!< WDOG_WEN (Bit 14)                                     */\n#define SYS_WDOG_WATCHDOG_REG_WDOG_WEN_Msk (0xffffc000UL)           /*!< WDOG_WEN (Bitfield-Mask: 0x3ffff)                     */\n#define SYS_WDOG_WATCHDOG_REG_WDOG_VAL_NEG_Pos (13UL)               /*!< WDOG_VAL_NEG (Bit 13)                                 */\n#define SYS_WDOG_WATCHDOG_REG_WDOG_VAL_NEG_Msk (0x2000UL)           /*!< WDOG_VAL_NEG (Bitfield-Mask: 0x01)                    */\n#define SYS_WDOG_WATCHDOG_REG_WDOG_VAL_Pos (0UL)                    /*!< WDOG_VAL (Bit 0)                                      */\n#define SYS_WDOG_WATCHDOG_REG_WDOG_VAL_Msk (0x1fffUL)               /*!< WDOG_VAL (Bitfield-Mask: 0x1fff)                      */\n\n\n/* =========================================================================================================================== */\n/* ================                                           TIMER                                           ================ */\n/* =========================================================================================================================== */\n\n/* ================================================  TIMER_CAPTURE_GPIO1_REG  ================================================ */\n#define TIMER_TIMER_CAPTURE_GPIO1_REG_TIM_CAPTURE_GPIO1_Pos (0UL)   /*!< TIM_CAPTURE_GPIO1 (Bit 0)                             */\n#define TIMER_TIMER_CAPTURE_GPIO1_REG_TIM_CAPTURE_GPIO1_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO1 (Bitfield-Mask: 0xffffff)      */\n/* ================================================  TIMER_CAPTURE_GPIO2_REG  ================================================ */\n#define TIMER_TIMER_CAPTURE_GPIO2_REG_TIM_CAPTURE_GPIO2_Pos (0UL)   /*!< TIM_CAPTURE_GPIO2 (Bit 0)                             */\n#define TIMER_TIMER_CAPTURE_GPIO2_REG_TIM_CAPTURE_GPIO2_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO2 (Bitfield-Mask: 0xffffff)      */\n/* ================================================  TIMER_CAPTURE_GPIO3_REG  ================================================ */\n#define TIMER_TIMER_CAPTURE_GPIO3_REG_TIM_CAPTURE_GPIO3_Pos (0UL)   /*!< TIM_CAPTURE_GPIO3 (Bit 0)                             */\n#define TIMER_TIMER_CAPTURE_GPIO3_REG_TIM_CAPTURE_GPIO3_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO3 (Bitfield-Mask: 0xffffff)      */\n/* ================================================  TIMER_CAPTURE_GPIO4_REG  ================================================ */\n#define TIMER_TIMER_CAPTURE_GPIO4_REG_TIM_CAPTURE_GPIO4_Pos (0UL)   /*!< TIM_CAPTURE_GPIO4 (Bit 0)                             */\n#define TIMER_TIMER_CAPTURE_GPIO4_REG_TIM_CAPTURE_GPIO4_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO4 (Bitfield-Mask: 0xffffff)      */\n/* ==============================================  TIMER_CLEAR_GPIO_EVENT_REG  =============================================== */\n#define TIMER_TIMER_CLEAR_GPIO_EVENT_REG_TIM_CLEAR_GPIO4_EVENT_Pos (3UL) /*!< TIM_CLEAR_GPIO4_EVENT (Bit 3)                    */\n#define TIMER_TIMER_CLEAR_GPIO_EVENT_REG_TIM_CLEAR_GPIO4_EVENT_Msk (0x8UL) /*!< TIM_CLEAR_GPIO4_EVENT (Bitfield-Mask: 0x01)    */\n#define TIMER_TIMER_CLEAR_GPIO_EVENT_REG_TIM_CLEAR_GPIO3_EVENT_Pos (2UL) /*!< TIM_CLEAR_GPIO3_EVENT (Bit 2)                    */\n#define TIMER_TIMER_CLEAR_GPIO_EVENT_REG_TIM_CLEAR_GPIO3_EVENT_Msk (0x4UL) /*!< TIM_CLEAR_GPIO3_EVENT (Bitfield-Mask: 0x01)    */\n#define TIMER_TIMER_CLEAR_GPIO_EVENT_REG_TIM_CLEAR_GPIO2_EVENT_Pos (1UL) /*!< TIM_CLEAR_GPIO2_EVENT (Bit 1)                    */\n#define TIMER_TIMER_CLEAR_GPIO_EVENT_REG_TIM_CLEAR_GPIO2_EVENT_Msk (0x2UL) /*!< TIM_CLEAR_GPIO2_EVENT (Bitfield-Mask: 0x01)    */\n#define TIMER_TIMER_CLEAR_GPIO_EVENT_REG_TIM_CLEAR_GPIO1_EVENT_Pos (0UL) /*!< TIM_CLEAR_GPIO1_EVENT (Bit 0)                    */\n#define TIMER_TIMER_CLEAR_GPIO_EVENT_REG_TIM_CLEAR_GPIO1_EVENT_Msk (0x1UL) /*!< TIM_CLEAR_GPIO1_EVENT (Bitfield-Mask: 0x01)    */\n/* ==================================================  TIMER_CLEAR_IRQ_REG  ================================================== */\n#define TIMER_TIMER_CLEAR_IRQ_REG_TIM_CLEAR_IRQ_Pos (0UL)           /*!< TIM_CLEAR_IRQ (Bit 0)                                 */\n#define TIMER_TIMER_CLEAR_IRQ_REG_TIM_CLEAR_IRQ_Msk (0x1UL)         /*!< TIM_CLEAR_IRQ (Bitfield-Mask: 0x01)                   */\n/* ====================================================  TIMER_CTRL_REG  ===================================================== */\n#define TIMER_TIMER_CTRL_REG_TIM_CAP_GPIO4_IRQ_EN_Pos (14UL)        /*!< TIM_CAP_GPIO4_IRQ_EN (Bit 14)                         */\n#define TIMER_TIMER_CTRL_REG_TIM_CAP_GPIO4_IRQ_EN_Msk (0x4000UL)    /*!< TIM_CAP_GPIO4_IRQ_EN (Bitfield-Mask: 0x01)            */\n#define TIMER_TIMER_CTRL_REG_TIM_CAP_GPIO3_IRQ_EN_Pos (13UL)        /*!< TIM_CAP_GPIO3_IRQ_EN (Bit 13)                         */\n#define TIMER_TIMER_CTRL_REG_TIM_CAP_GPIO3_IRQ_EN_Msk (0x2000UL)    /*!< TIM_CAP_GPIO3_IRQ_EN (Bitfield-Mask: 0x01)            */\n#define TIMER_TIMER_CTRL_REG_TIM_CAP_GPIO2_IRQ_EN_Pos (12UL)        /*!< TIM_CAP_GPIO2_IRQ_EN (Bit 12)                         */\n#define TIMER_TIMER_CTRL_REG_TIM_CAP_GPIO2_IRQ_EN_Msk (0x1000UL)    /*!< TIM_CAP_GPIO2_IRQ_EN (Bitfield-Mask: 0x01)            */\n#define TIMER_TIMER_CTRL_REG_TIM_CAP_GPIO1_IRQ_EN_Pos (11UL)        /*!< TIM_CAP_GPIO1_IRQ_EN (Bit 11)                         */\n#define TIMER_TIMER_CTRL_REG_TIM_CAP_GPIO1_IRQ_EN_Msk (0x800UL)     /*!< TIM_CAP_GPIO1_IRQ_EN (Bitfield-Mask: 0x01)            */\n#define TIMER_TIMER_CTRL_REG_TIM_IN4_EVENT_FALL_EN_Pos (10UL)       /*!< TIM_IN4_EVENT_FALL_EN (Bit 10)                        */\n#define TIMER_TIMER_CTRL_REG_TIM_IN4_EVENT_FALL_EN_Msk (0x400UL)    /*!< TIM_IN4_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER_TIMER_CTRL_REG_TIM_IN3_EVENT_FALL_EN_Pos (9UL)        /*!< TIM_IN3_EVENT_FALL_EN (Bit 9)                         */\n#define TIMER_TIMER_CTRL_REG_TIM_IN3_EVENT_FALL_EN_Msk (0x200UL)    /*!< TIM_IN3_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER_TIMER_CTRL_REG_TIM_CLK_EN_Pos (8UL)                   /*!< TIM_CLK_EN (Bit 8)                                    */\n#define TIMER_TIMER_CTRL_REG_TIM_CLK_EN_Msk (0x100UL)               /*!< TIM_CLK_EN (Bitfield-Mask: 0x01)                      */\n#define TIMER_TIMER_CTRL_REG_TIM_SYS_CLK_EN_Pos (7UL)               /*!< TIM_SYS_CLK_EN (Bit 7)                                */\n#define TIMER_TIMER_CTRL_REG_TIM_SYS_CLK_EN_Msk (0x80UL)            /*!< TIM_SYS_CLK_EN (Bitfield-Mask: 0x01)                  */\n#define TIMER_TIMER_CTRL_REG_TIM_FREE_RUN_MODE_EN_Pos (6UL)         /*!< TIM_FREE_RUN_MODE_EN (Bit 6)                          */\n#define TIMER_TIMER_CTRL_REG_TIM_FREE_RUN_MODE_EN_Msk (0x40UL)      /*!< TIM_FREE_RUN_MODE_EN (Bitfield-Mask: 0x01)            */\n#define TIMER_TIMER_CTRL_REG_TIM_IRQ_EN_Pos (5UL)                   /*!< TIM_IRQ_EN (Bit 5)                                    */\n#define TIMER_TIMER_CTRL_REG_TIM_IRQ_EN_Msk (0x20UL)                /*!< TIM_IRQ_EN (Bitfield-Mask: 0x01)                      */\n#define TIMER_TIMER_CTRL_REG_TIM_IN2_EVENT_FALL_EN_Pos (4UL)        /*!< TIM_IN2_EVENT_FALL_EN (Bit 4)                         */\n#define TIMER_TIMER_CTRL_REG_TIM_IN2_EVENT_FALL_EN_Msk (0x10UL)     /*!< TIM_IN2_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER_TIMER_CTRL_REG_TIM_IN1_EVENT_FALL_EN_Pos (3UL)        /*!< TIM_IN1_EVENT_FALL_EN (Bit 3)                         */\n#define TIMER_TIMER_CTRL_REG_TIM_IN1_EVENT_FALL_EN_Msk (0x8UL)      /*!< TIM_IN1_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER_TIMER_CTRL_REG_TIM_COUNT_DOWN_EN_Pos (2UL)            /*!< TIM_COUNT_DOWN_EN (Bit 2)                             */\n#define TIMER_TIMER_CTRL_REG_TIM_COUNT_DOWN_EN_Msk (0x4UL)          /*!< TIM_COUNT_DOWN_EN (Bitfield-Mask: 0x01)               */\n#define TIMER_TIMER_CTRL_REG_TIM_ONESHOT_MODE_EN_Pos (1UL)          /*!< TIM_ONESHOT_MODE_EN (Bit 1)                           */\n#define TIMER_TIMER_CTRL_REG_TIM_ONESHOT_MODE_EN_Msk (0x2UL)        /*!< TIM_ONESHOT_MODE_EN (Bitfield-Mask: 0x01)             */\n#define TIMER_TIMER_CTRL_REG_TIM_EN_Pos   (0UL)                     /*!< TIM_EN (Bit 0)                                        */\n#define TIMER_TIMER_CTRL_REG_TIM_EN_Msk   (0x1UL)                   /*!< TIM_EN (Bitfield-Mask: 0x01)                          */\n/* =================================================  TIMER_GPIO1_CONF_REG  ================================================== */\n#define TIMER_TIMER_GPIO1_CONF_REG_TIM_GPIO1_CONF_Pos (0UL)         /*!< TIM_GPIO1_CONF (Bit 0)                                */\n#define TIMER_TIMER_GPIO1_CONF_REG_TIM_GPIO1_CONF_Msk (0x3fUL)      /*!< TIM_GPIO1_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER_GPIO2_CONF_REG  ================================================== */\n#define TIMER_TIMER_GPIO2_CONF_REG_TIM_GPIO2_CONF_Pos (0UL)         /*!< TIM_GPIO2_CONF (Bit 0)                                */\n#define TIMER_TIMER_GPIO2_CONF_REG_TIM_GPIO2_CONF_Msk (0x3fUL)      /*!< TIM_GPIO2_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER_GPIO3_CONF_REG  ================================================== */\n#define TIMER_TIMER_GPIO3_CONF_REG_TIM_GPIO3_CONF_Pos (0UL)         /*!< TIM_GPIO3_CONF (Bit 0)                                */\n#define TIMER_TIMER_GPIO3_CONF_REG_TIM_GPIO3_CONF_Msk (0x3fUL)      /*!< TIM_GPIO3_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER_GPIO4_CONF_REG  ================================================== */\n#define TIMER_TIMER_GPIO4_CONF_REG_TIM_GPIO4_CONF_Pos (0UL)         /*!< TIM_GPIO4_CONF (Bit 0)                                */\n#define TIMER_TIMER_GPIO4_CONF_REG_TIM_GPIO4_CONF_Msk (0x3fUL)      /*!< TIM_GPIO4_CONF (Bitfield-Mask: 0x3f)                  */\n/* ==================================================  TIMER_PRESCALER_REG  ================================================== */\n#define TIMER_TIMER_PRESCALER_REG_TIM_PRESCALER_Pos (0UL)           /*!< TIM_PRESCALER (Bit 0)                                 */\n#define TIMER_TIMER_PRESCALER_REG_TIM_PRESCALER_Msk (0x1fUL)        /*!< TIM_PRESCALER (Bitfield-Mask: 0x1f)                   */\n/* ================================================  TIMER_PRESCALER_VAL_REG  ================================================ */\n#define TIMER_TIMER_PRESCALER_VAL_REG_TIM_PRESCALER_VAL_Pos (0UL)   /*!< TIM_PRESCALER_VAL (Bit 0)                             */\n#define TIMER_TIMER_PRESCALER_VAL_REG_TIM_PRESCALER_VAL_Msk (0x1fUL) /*!< TIM_PRESCALER_VAL (Bitfield-Mask: 0x1f)              */\n/* ===================================================  TIMER_PWM_DC_REG  ==================================================== */\n#define TIMER_TIMER_PWM_DC_REG_TIM_PWM_DC_Pos (0UL)                 /*!< TIM_PWM_DC (Bit 0)                                    */\n#define TIMER_TIMER_PWM_DC_REG_TIM_PWM_DC_Msk (0xffffUL)            /*!< TIM_PWM_DC (Bitfield-Mask: 0xffff)                    */\n/* ==================================================  TIMER_PWM_FREQ_REG  =================================================== */\n#define TIMER_TIMER_PWM_FREQ_REG_TIM_PWM_FREQ_Pos (0UL)             /*!< TIM_PWM_FREQ (Bit 0)                                  */\n#define TIMER_TIMER_PWM_FREQ_REG_TIM_PWM_FREQ_Msk (0xffffUL)        /*!< TIM_PWM_FREQ (Bitfield-Mask: 0xffff)                  */\n/* ===================================================  TIMER_RELOAD_REG  ==================================================== */\n#define TIMER_TIMER_RELOAD_REG_TIM_RELOAD_Pos (0UL)                 /*!< TIM_RELOAD (Bit 0)                                    */\n#define TIMER_TIMER_RELOAD_REG_TIM_RELOAD_Msk (0xffffffUL)          /*!< TIM_RELOAD (Bitfield-Mask: 0xffffff)                  */\n/* ==================================================  TIMER_SHOTWIDTH_REG  ================================================== */\n#define TIMER_TIMER_SHOTWIDTH_REG_TIM_SHOTWIDTH_Pos (0UL)           /*!< TIM_SHOTWIDTH (Bit 0)                                 */\n#define TIMER_TIMER_SHOTWIDTH_REG_TIM_SHOTWIDTH_Msk (0xffffffUL)    /*!< TIM_SHOTWIDTH (Bitfield-Mask: 0xffffff)               */\n/* ===================================================  TIMER_STATUS_REG  ==================================================== */\n#define TIMER_TIMER_STATUS_REG_TIM_GPIO4_EVENT_PENDING_Pos (7UL)    /*!< TIM_GPIO4_EVENT_PENDING (Bit 7)                       */\n#define TIMER_TIMER_STATUS_REG_TIM_GPIO4_EVENT_PENDING_Msk (0x80UL) /*!< TIM_GPIO4_EVENT_PENDING (Bitfield-Mask: 0x01)         */\n#define TIMER_TIMER_STATUS_REG_TIM_GPIO3_EVENT_PENDING_Pos (6UL)    /*!< TIM_GPIO3_EVENT_PENDING (Bit 6)                       */\n#define TIMER_TIMER_STATUS_REG_TIM_GPIO3_EVENT_PENDING_Msk (0x40UL) /*!< TIM_GPIO3_EVENT_PENDING (Bitfield-Mask: 0x01)         */\n#define TIMER_TIMER_STATUS_REG_TIM_GPIO2_EVENT_PENDING_Pos (5UL)    /*!< TIM_GPIO2_EVENT_PENDING (Bit 5)                       */\n#define TIMER_TIMER_STATUS_REG_TIM_GPIO2_EVENT_PENDING_Msk (0x20UL) /*!< TIM_GPIO2_EVENT_PENDING (Bitfield-Mask: 0x01)         */\n#define TIMER_TIMER_STATUS_REG_TIM_GPIO1_EVENT_PENDING_Pos (4UL)    /*!< TIM_GPIO1_EVENT_PENDING (Bit 4)                       */\n#define TIMER_TIMER_STATUS_REG_TIM_GPIO1_EVENT_PENDING_Msk (0x10UL) /*!< TIM_GPIO1_EVENT_PENDING (Bitfield-Mask: 0x01)         */\n#define TIMER_TIMER_STATUS_REG_TIM_ONESHOT_PHASE_Pos (2UL)          /*!< TIM_ONESHOT_PHASE (Bit 2)                             */\n#define TIMER_TIMER_STATUS_REG_TIM_ONESHOT_PHASE_Msk (0xcUL)        /*!< TIM_ONESHOT_PHASE (Bitfield-Mask: 0x03)               */\n#define TIMER_TIMER_STATUS_REG_TIM_IN2_STATE_Pos (1UL)              /*!< TIM_IN2_STATE (Bit 1)                                 */\n#define TIMER_TIMER_STATUS_REG_TIM_IN2_STATE_Msk (0x2UL)            /*!< TIM_IN2_STATE (Bitfield-Mask: 0x01)                   */\n#define TIMER_TIMER_STATUS_REG_TIM_IN1_STATE_Pos (0UL)              /*!< TIM_IN1_STATE (Bit 0)                                 */\n#define TIMER_TIMER_STATUS_REG_TIM_IN1_STATE_Msk (0x1UL)            /*!< TIM_IN1_STATE (Bitfield-Mask: 0x01)                   */\n/* ==================================================  TIMER_TIMER_VAL_REG  ================================================== */\n#define TIMER_TIMER_TIMER_VAL_REG_TIM_TIMER_VALUE_Pos (0UL)         /*!< TIM_TIMER_VALUE (Bit 0)                               */\n#define TIMER_TIMER_TIMER_VAL_REG_TIM_TIMER_VALUE_Msk (0xffffffUL)  /*!< TIM_TIMER_VALUE (Bitfield-Mask: 0xffffff)             */\n\n\n/* =========================================================================================================================== */\n/* ================                                          TIMER2                                           ================ */\n/* =========================================================================================================================== */\n\n/* ===============================================  TIMER2_CAPTURE_GPIO1_REG  ================================================ */\n#define TIMER2_TIMER2_CAPTURE_GPIO1_REG_TIM_CAPTURE_GPIO1_Pos (0UL) /*!< TIM_CAPTURE_GPIO1 (Bit 0)                             */\n#define TIMER2_TIMER2_CAPTURE_GPIO1_REG_TIM_CAPTURE_GPIO1_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO1 (Bitfield-Mask: 0xffffff)    */\n/* ===============================================  TIMER2_CAPTURE_GPIO2_REG  ================================================ */\n#define TIMER2_TIMER2_CAPTURE_GPIO2_REG_TIM_CAPTURE_GPIO2_Pos (0UL) /*!< TIM_CAPTURE_GPIO2 (Bit 0)                             */\n#define TIMER2_TIMER2_CAPTURE_GPIO2_REG_TIM_CAPTURE_GPIO2_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO2 (Bitfield-Mask: 0xffffff)    */\n/* =================================================  TIMER2_CLEAR_IRQ_REG  ================================================== */\n#define TIMER2_TIMER2_CLEAR_IRQ_REG_TIM_CLEAR_IRQ_Pos (0UL)         /*!< TIM_CLEAR_IRQ (Bit 0)                                 */\n#define TIMER2_TIMER2_CLEAR_IRQ_REG_TIM_CLEAR_IRQ_Msk (0x1UL)       /*!< TIM_CLEAR_IRQ (Bitfield-Mask: 0x01)                   */\n/* ====================================================  TIMER2_CTRL_REG  ==================================================== */\n#define TIMER2_TIMER2_CTRL_REG_TIM_CLK_EN_Pos (8UL)                 /*!< TIM_CLK_EN (Bit 8)                                    */\n#define TIMER2_TIMER2_CTRL_REG_TIM_CLK_EN_Msk (0x100UL)             /*!< TIM_CLK_EN (Bitfield-Mask: 0x01)                      */\n#define TIMER2_TIMER2_CTRL_REG_TIM_SYS_CLK_EN_Pos (7UL)             /*!< TIM_SYS_CLK_EN (Bit 7)                                */\n#define TIMER2_TIMER2_CTRL_REG_TIM_SYS_CLK_EN_Msk (0x80UL)          /*!< TIM_SYS_CLK_EN (Bitfield-Mask: 0x01)                  */\n#define TIMER2_TIMER2_CTRL_REG_TIM_FREE_RUN_MODE_EN_Pos (6UL)       /*!< TIM_FREE_RUN_MODE_EN (Bit 6)                          */\n#define TIMER2_TIMER2_CTRL_REG_TIM_FREE_RUN_MODE_EN_Msk (0x40UL)    /*!< TIM_FREE_RUN_MODE_EN (Bitfield-Mask: 0x01)            */\n#define TIMER2_TIMER2_CTRL_REG_TIM_IRQ_EN_Pos (5UL)                 /*!< TIM_IRQ_EN (Bit 5)                                    */\n#define TIMER2_TIMER2_CTRL_REG_TIM_IRQ_EN_Msk (0x20UL)              /*!< TIM_IRQ_EN (Bitfield-Mask: 0x01)                      */\n#define TIMER2_TIMER2_CTRL_REG_TIM_IN2_EVENT_FALL_EN_Pos (4UL)      /*!< TIM_IN2_EVENT_FALL_EN (Bit 4)                         */\n#define TIMER2_TIMER2_CTRL_REG_TIM_IN2_EVENT_FALL_EN_Msk (0x10UL)   /*!< TIM_IN2_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER2_TIMER2_CTRL_REG_TIM_IN1_EVENT_FALL_EN_Pos (3UL)      /*!< TIM_IN1_EVENT_FALL_EN (Bit 3)                         */\n#define TIMER2_TIMER2_CTRL_REG_TIM_IN1_EVENT_FALL_EN_Msk (0x8UL)    /*!< TIM_IN1_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER2_TIMER2_CTRL_REG_TIM_COUNT_DOWN_EN_Pos (2UL)          /*!< TIM_COUNT_DOWN_EN (Bit 2)                             */\n#define TIMER2_TIMER2_CTRL_REG_TIM_COUNT_DOWN_EN_Msk (0x4UL)        /*!< TIM_COUNT_DOWN_EN (Bitfield-Mask: 0x01)               */\n#define TIMER2_TIMER2_CTRL_REG_TIM_ONESHOT_MODE_EN_Pos (1UL)        /*!< TIM_ONESHOT_MODE_EN (Bit 1)                           */\n#define TIMER2_TIMER2_CTRL_REG_TIM_ONESHOT_MODE_EN_Msk (0x2UL)      /*!< TIM_ONESHOT_MODE_EN (Bitfield-Mask: 0x01)             */\n#define TIMER2_TIMER2_CTRL_REG_TIM_EN_Pos (0UL)                     /*!< TIM_EN (Bit 0)                                        */\n#define TIMER2_TIMER2_CTRL_REG_TIM_EN_Msk (0x1UL)                   /*!< TIM_EN (Bitfield-Mask: 0x01)                          */\n/* =================================================  TIMER2_GPIO1_CONF_REG  ================================================= */\n#define TIMER2_TIMER2_GPIO1_CONF_REG_TIM_GPIO1_CONF_Pos (0UL)       /*!< TIM_GPIO1_CONF (Bit 0)                                */\n#define TIMER2_TIMER2_GPIO1_CONF_REG_TIM_GPIO1_CONF_Msk (0x3fUL)    /*!< TIM_GPIO1_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER2_GPIO2_CONF_REG  ================================================= */\n#define TIMER2_TIMER2_GPIO2_CONF_REG_TIM_GPIO2_CONF_Pos (0UL)       /*!< TIM_GPIO2_CONF (Bit 0)                                */\n#define TIMER2_TIMER2_GPIO2_CONF_REG_TIM_GPIO2_CONF_Msk (0x3fUL)    /*!< TIM_GPIO2_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER2_PRESCALER_REG  ================================================== */\n#define TIMER2_TIMER2_PRESCALER_REG_TIM_PRESCALER_Pos (0UL)         /*!< TIM_PRESCALER (Bit 0)                                 */\n#define TIMER2_TIMER2_PRESCALER_REG_TIM_PRESCALER_Msk (0x1fUL)      /*!< TIM_PRESCALER (Bitfield-Mask: 0x1f)                   */\n/* ===============================================  TIMER2_PRESCALER_VAL_REG  ================================================ */\n#define TIMER2_TIMER2_PRESCALER_VAL_REG_TIM_PRESCALER_VAL_Pos (0UL) /*!< TIM_PRESCALER_VAL (Bit 0)                             */\n#define TIMER2_TIMER2_PRESCALER_VAL_REG_TIM_PRESCALER_VAL_Msk (0x1fUL) /*!< TIM_PRESCALER_VAL (Bitfield-Mask: 0x1f)            */\n/* ===================================================  TIMER2_PWM_DC_REG  =================================================== */\n#define TIMER2_TIMER2_PWM_DC_REG_TIM_PWM_DC_Pos (0UL)               /*!< TIM_PWM_DC (Bit 0)                                    */\n#define TIMER2_TIMER2_PWM_DC_REG_TIM_PWM_DC_Msk (0xffffUL)          /*!< TIM_PWM_DC (Bitfield-Mask: 0xffff)                    */\n/* ==================================================  TIMER2_PWM_FREQ_REG  ================================================== */\n#define TIMER2_TIMER2_PWM_FREQ_REG_TIM_PWM_FREQ_Pos (0UL)           /*!< TIM_PWM_FREQ (Bit 0)                                  */\n#define TIMER2_TIMER2_PWM_FREQ_REG_TIM_PWM_FREQ_Msk (0xffffUL)      /*!< TIM_PWM_FREQ (Bitfield-Mask: 0xffff)                  */\n/* ===================================================  TIMER2_RELOAD_REG  =================================================== */\n#define TIMER2_TIMER2_RELOAD_REG_TIM_RELOAD_Pos (0UL)               /*!< TIM_RELOAD (Bit 0)                                    */\n#define TIMER2_TIMER2_RELOAD_REG_TIM_RELOAD_Msk (0xffffffUL)        /*!< TIM_RELOAD (Bitfield-Mask: 0xffffff)                  */\n/* =================================================  TIMER2_SHOTWIDTH_REG  ================================================== */\n#define TIMER2_TIMER2_SHOTWIDTH_REG_TIM_SHOTWIDTH_Pos (0UL)         /*!< TIM_SHOTWIDTH (Bit 0)                                 */\n#define TIMER2_TIMER2_SHOTWIDTH_REG_TIM_SHOTWIDTH_Msk (0xffffffUL)  /*!< TIM_SHOTWIDTH (Bitfield-Mask: 0xffffff)               */\n/* ===================================================  TIMER2_STATUS_REG  =================================================== */\n#define TIMER2_TIMER2_STATUS_REG_TIM_ONESHOT_PHASE_Pos (2UL)        /*!< TIM_ONESHOT_PHASE (Bit 2)                             */\n#define TIMER2_TIMER2_STATUS_REG_TIM_ONESHOT_PHASE_Msk (0xcUL)      /*!< TIM_ONESHOT_PHASE (Bitfield-Mask: 0x03)               */\n#define TIMER2_TIMER2_STATUS_REG_TIM_IN2_STATE_Pos (1UL)            /*!< TIM_IN2_STATE (Bit 1)                                 */\n#define TIMER2_TIMER2_STATUS_REG_TIM_IN2_STATE_Msk (0x2UL)          /*!< TIM_IN2_STATE (Bitfield-Mask: 0x01)                   */\n#define TIMER2_TIMER2_STATUS_REG_TIM_IN1_STATE_Pos (0UL)            /*!< TIM_IN1_STATE (Bit 0)                                 */\n#define TIMER2_TIMER2_STATUS_REG_TIM_IN1_STATE_Msk (0x1UL)          /*!< TIM_IN1_STATE (Bitfield-Mask: 0x01)                   */\n/* =================================================  TIMER2_TIMER_VAL_REG  ================================================== */\n#define TIMER2_TIMER2_TIMER_VAL_REG_TIM_TIMER_VALUE_Pos (0UL)       /*!< TIM_TIMER_VALUE (Bit 0)                               */\n#define TIMER2_TIMER2_TIMER_VAL_REG_TIM_TIMER_VALUE_Msk (0xffffffUL) /*!< TIM_TIMER_VALUE (Bitfield-Mask: 0xffffff)            */\n\n\n/* =========================================================================================================================== */\n/* ================                                          TIMER3                                           ================ */\n/* =========================================================================================================================== */\n\n/* ===============================================  TIMER3_CAPTURE_GPIO1_REG  ================================================ */\n#define TIMER3_TIMER3_CAPTURE_GPIO1_REG_TIM_CAPTURE_GPIO1_Pos (0UL) /*!< TIM_CAPTURE_GPIO1 (Bit 0)                             */\n#define TIMER3_TIMER3_CAPTURE_GPIO1_REG_TIM_CAPTURE_GPIO1_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO1 (Bitfield-Mask: 0xffffff)    */\n/* ===============================================  TIMER3_CAPTURE_GPIO2_REG  ================================================ */\n#define TIMER3_TIMER3_CAPTURE_GPIO2_REG_TIM_CAPTURE_GPIO2_Pos (0UL) /*!< TIM_CAPTURE_GPIO2 (Bit 0)                             */\n#define TIMER3_TIMER3_CAPTURE_GPIO2_REG_TIM_CAPTURE_GPIO2_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO2 (Bitfield-Mask: 0xffffff)    */\n/* =================================================  TIMER3_CLEAR_IRQ_REG  ================================================== */\n#define TIMER3_TIMER3_CLEAR_IRQ_REG_TIM_CLEAR_IRQ_Pos (0UL)         /*!< TIM_CLEAR_IRQ (Bit 0)                                 */\n#define TIMER3_TIMER3_CLEAR_IRQ_REG_TIM_CLEAR_IRQ_Msk (0x1UL)       /*!< TIM_CLEAR_IRQ (Bitfield-Mask: 0x01)                   */\n/* ====================================================  TIMER3_CTRL_REG  ==================================================== */\n#define TIMER3_TIMER3_CTRL_REG_TIM_CLK_EN_Pos (8UL)                 /*!< TIM_CLK_EN (Bit 8)                                    */\n#define TIMER3_TIMER3_CTRL_REG_TIM_CLK_EN_Msk (0x100UL)             /*!< TIM_CLK_EN (Bitfield-Mask: 0x01)                      */\n#define TIMER3_TIMER3_CTRL_REG_TIM_SYS_CLK_EN_Pos (7UL)             /*!< TIM_SYS_CLK_EN (Bit 7)                                */\n#define TIMER3_TIMER3_CTRL_REG_TIM_SYS_CLK_EN_Msk (0x80UL)          /*!< TIM_SYS_CLK_EN (Bitfield-Mask: 0x01)                  */\n#define TIMER3_TIMER3_CTRL_REG_TIM_FREE_RUN_MODE_EN_Pos (6UL)       /*!< TIM_FREE_RUN_MODE_EN (Bit 6)                          */\n#define TIMER3_TIMER3_CTRL_REG_TIM_FREE_RUN_MODE_EN_Msk (0x40UL)    /*!< TIM_FREE_RUN_MODE_EN (Bitfield-Mask: 0x01)            */\n#define TIMER3_TIMER3_CTRL_REG_TIM_IRQ_EN_Pos (5UL)                 /*!< TIM_IRQ_EN (Bit 5)                                    */\n#define TIMER3_TIMER3_CTRL_REG_TIM_IRQ_EN_Msk (0x20UL)              /*!< TIM_IRQ_EN (Bitfield-Mask: 0x01)                      */\n#define TIMER3_TIMER3_CTRL_REG_TIM_IN2_EVENT_FALL_EN_Pos (4UL)      /*!< TIM_IN2_EVENT_FALL_EN (Bit 4)                         */\n#define TIMER3_TIMER3_CTRL_REG_TIM_IN2_EVENT_FALL_EN_Msk (0x10UL)   /*!< TIM_IN2_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER3_TIMER3_CTRL_REG_TIM_IN1_EVENT_FALL_EN_Pos (3UL)      /*!< TIM_IN1_EVENT_FALL_EN (Bit 3)                         */\n#define TIMER3_TIMER3_CTRL_REG_TIM_IN1_EVENT_FALL_EN_Msk (0x8UL)    /*!< TIM_IN1_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER3_TIMER3_CTRL_REG_TIM_COUNT_DOWN_EN_Pos (2UL)          /*!< TIM_COUNT_DOWN_EN (Bit 2)                             */\n#define TIMER3_TIMER3_CTRL_REG_TIM_COUNT_DOWN_EN_Msk (0x4UL)        /*!< TIM_COUNT_DOWN_EN (Bitfield-Mask: 0x01)               */\n#define TIMER3_TIMER3_CTRL_REG_TIM_EN_Pos (0UL)                     /*!< TIM_EN (Bit 0)                                        */\n#define TIMER3_TIMER3_CTRL_REG_TIM_EN_Msk (0x1UL)                   /*!< TIM_EN (Bitfield-Mask: 0x01)                          */\n/* =================================================  TIMER3_GPIO1_CONF_REG  ================================================= */\n#define TIMER3_TIMER3_GPIO1_CONF_REG_TIM_GPIO1_CONF_Pos (0UL)       /*!< TIM_GPIO1_CONF (Bit 0)                                */\n#define TIMER3_TIMER3_GPIO1_CONF_REG_TIM_GPIO1_CONF_Msk (0x3fUL)    /*!< TIM_GPIO1_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER3_GPIO2_CONF_REG  ================================================= */\n#define TIMER3_TIMER3_GPIO2_CONF_REG_TIM_GPIO2_CONF_Pos (0UL)       /*!< TIM_GPIO2_CONF (Bit 0)                                */\n#define TIMER3_TIMER3_GPIO2_CONF_REG_TIM_GPIO2_CONF_Msk (0x3fUL)    /*!< TIM_GPIO2_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER3_PRESCALER_REG  ================================================== */\n#define TIMER3_TIMER3_PRESCALER_REG_TIM_PRESCALER_Pos (0UL)         /*!< TIM_PRESCALER (Bit 0)                                 */\n#define TIMER3_TIMER3_PRESCALER_REG_TIM_PRESCALER_Msk (0x1fUL)      /*!< TIM_PRESCALER (Bitfield-Mask: 0x1f)                   */\n/* ===============================================  TIMER3_PRESCALER_VAL_REG  ================================================ */\n#define TIMER3_TIMER3_PRESCALER_VAL_REG_TIM_PRESCALER_VAL_Pos (0UL) /*!< TIM_PRESCALER_VAL (Bit 0)                             */\n#define TIMER3_TIMER3_PRESCALER_VAL_REG_TIM_PRESCALER_VAL_Msk (0x1fUL) /*!< TIM_PRESCALER_VAL (Bitfield-Mask: 0x1f)            */\n/* ===================================================  TIMER3_PWM_DC_REG  =================================================== */\n#define TIMER3_TIMER3_PWM_DC_REG_TIM_PWM_DC_Pos (0UL)               /*!< TIM_PWM_DC (Bit 0)                                    */\n#define TIMER3_TIMER3_PWM_DC_REG_TIM_PWM_DC_Msk (0xffffUL)          /*!< TIM_PWM_DC (Bitfield-Mask: 0xffff)                    */\n/* ==================================================  TIMER3_PWM_FREQ_REG  ================================================== */\n#define TIMER3_TIMER3_PWM_FREQ_REG_TIM_PWM_FREQ_Pos (0UL)           /*!< TIM_PWM_FREQ (Bit 0)                                  */\n#define TIMER3_TIMER3_PWM_FREQ_REG_TIM_PWM_FREQ_Msk (0xffffUL)      /*!< TIM_PWM_FREQ (Bitfield-Mask: 0xffff)                  */\n/* ===================================================  TIMER3_RELOAD_REG  =================================================== */\n#define TIMER3_TIMER3_RELOAD_REG_TIM_RELOAD_Pos (0UL)               /*!< TIM_RELOAD (Bit 0)                                    */\n#define TIMER3_TIMER3_RELOAD_REG_TIM_RELOAD_Msk (0xffffffUL)        /*!< TIM_RELOAD (Bitfield-Mask: 0xffffff)                  */\n/* ===================================================  TIMER3_STATUS_REG  =================================================== */\n#define TIMER3_TIMER3_STATUS_REG_TIM_ONESHOT_PHASE_Pos (2UL)        /*!< TIM_ONESHOT_PHASE (Bit 2)                             */\n#define TIMER3_TIMER3_STATUS_REG_TIM_ONESHOT_PHASE_Msk (0xcUL)      /*!< TIM_ONESHOT_PHASE (Bitfield-Mask: 0x03)               */\n#define TIMER3_TIMER3_STATUS_REG_TIM_IN2_STATE_Pos (1UL)            /*!< TIM_IN2_STATE (Bit 1)                                 */\n#define TIMER3_TIMER3_STATUS_REG_TIM_IN2_STATE_Msk (0x2UL)          /*!< TIM_IN2_STATE (Bitfield-Mask: 0x01)                   */\n#define TIMER3_TIMER3_STATUS_REG_TIM_IN1_STATE_Pos (0UL)            /*!< TIM_IN1_STATE (Bit 0)                                 */\n#define TIMER3_TIMER3_STATUS_REG_TIM_IN1_STATE_Msk (0x1UL)          /*!< TIM_IN1_STATE (Bitfield-Mask: 0x01)                   */\n/* =================================================  TIMER3_TIMER_VAL_REG  ================================================== */\n#define TIMER3_TIMER3_TIMER_VAL_REG_TIM_TIMER_VALUE_Pos (0UL)       /*!< TIM_TIMER_VALUE (Bit 0)                               */\n#define TIMER3_TIMER3_TIMER_VAL_REG_TIM_TIMER_VALUE_Msk (0xffffffUL) /*!< TIM_TIMER_VALUE (Bitfield-Mask: 0xffffff)            */\n\n\n/* =========================================================================================================================== */\n/* ================                                          TIMER4                                           ================ */\n/* =========================================================================================================================== */\n\n/* ===============================================  TIMER4_CAPTURE_GPIO1_REG  ================================================ */\n#define TIMER4_TIMER4_CAPTURE_GPIO1_REG_TIM_CAPTURE_GPIO1_Pos (0UL) /*!< TIM_CAPTURE_GPIO1 (Bit 0)                             */\n#define TIMER4_TIMER4_CAPTURE_GPIO1_REG_TIM_CAPTURE_GPIO1_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO1 (Bitfield-Mask: 0xffffff)    */\n/* ===============================================  TIMER4_CAPTURE_GPIO2_REG  ================================================ */\n#define TIMER4_TIMER4_CAPTURE_GPIO2_REG_TIM_CAPTURE_GPIO2_Pos (0UL) /*!< TIM_CAPTURE_GPIO2 (Bit 0)                             */\n#define TIMER4_TIMER4_CAPTURE_GPIO2_REG_TIM_CAPTURE_GPIO2_Msk (0xffffffUL) /*!< TIM_CAPTURE_GPIO2 (Bitfield-Mask: 0xffffff)    */\n/* =================================================  TIMER4_CLEAR_IRQ_REG  ================================================== */\n#define TIMER4_TIMER4_CLEAR_IRQ_REG_TIM_CLEAR_IRQ_Pos (0UL)         /*!< TIM_CLEAR_IRQ (Bit 0)                                 */\n#define TIMER4_TIMER4_CLEAR_IRQ_REG_TIM_CLEAR_IRQ_Msk (0x1UL)       /*!< TIM_CLEAR_IRQ (Bitfield-Mask: 0x01)                   */\n/* ====================================================  TIMER4_CTRL_REG  ==================================================== */\n#define TIMER4_TIMER4_CTRL_REG_TIM_CLK_EN_Pos (8UL)                 /*!< TIM_CLK_EN (Bit 8)                                    */\n#define TIMER4_TIMER4_CTRL_REG_TIM_CLK_EN_Msk (0x100UL)             /*!< TIM_CLK_EN (Bitfield-Mask: 0x01)                      */\n#define TIMER4_TIMER4_CTRL_REG_TIM_SYS_CLK_EN_Pos (7UL)             /*!< TIM_SYS_CLK_EN (Bit 7)                                */\n#define TIMER4_TIMER4_CTRL_REG_TIM_SYS_CLK_EN_Msk (0x80UL)          /*!< TIM_SYS_CLK_EN (Bitfield-Mask: 0x01)                  */\n#define TIMER4_TIMER4_CTRL_REG_TIM_FREE_RUN_MODE_EN_Pos (6UL)       /*!< TIM_FREE_RUN_MODE_EN (Bit 6)                          */\n#define TIMER4_TIMER4_CTRL_REG_TIM_FREE_RUN_MODE_EN_Msk (0x40UL)    /*!< TIM_FREE_RUN_MODE_EN (Bitfield-Mask: 0x01)            */\n#define TIMER4_TIMER4_CTRL_REG_TIM_IRQ_EN_Pos (5UL)                 /*!< TIM_IRQ_EN (Bit 5)                                    */\n#define TIMER4_TIMER4_CTRL_REG_TIM_IRQ_EN_Msk (0x20UL)              /*!< TIM_IRQ_EN (Bitfield-Mask: 0x01)                      */\n#define TIMER4_TIMER4_CTRL_REG_TIM_IN2_EVENT_FALL_EN_Pos (4UL)      /*!< TIM_IN2_EVENT_FALL_EN (Bit 4)                         */\n#define TIMER4_TIMER4_CTRL_REG_TIM_IN2_EVENT_FALL_EN_Msk (0x10UL)   /*!< TIM_IN2_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER4_TIMER4_CTRL_REG_TIM_IN1_EVENT_FALL_EN_Pos (3UL)      /*!< TIM_IN1_EVENT_FALL_EN (Bit 3)                         */\n#define TIMER4_TIMER4_CTRL_REG_TIM_IN1_EVENT_FALL_EN_Msk (0x8UL)    /*!< TIM_IN1_EVENT_FALL_EN (Bitfield-Mask: 0x01)           */\n#define TIMER4_TIMER4_CTRL_REG_TIM_COUNT_DOWN_EN_Pos (2UL)          /*!< TIM_COUNT_DOWN_EN (Bit 2)                             */\n#define TIMER4_TIMER4_CTRL_REG_TIM_COUNT_DOWN_EN_Msk (0x4UL)        /*!< TIM_COUNT_DOWN_EN (Bitfield-Mask: 0x01)               */\n#define TIMER4_TIMER4_CTRL_REG_TIM_EN_Pos (0UL)                     /*!< TIM_EN (Bit 0)                                        */\n#define TIMER4_TIMER4_CTRL_REG_TIM_EN_Msk (0x1UL)                   /*!< TIM_EN (Bitfield-Mask: 0x01)                          */\n/* =================================================  TIMER4_GPIO1_CONF_REG  ================================================= */\n#define TIMER4_TIMER4_GPIO1_CONF_REG_TIM_GPIO1_CONF_Pos (0UL)       /*!< TIM_GPIO1_CONF (Bit 0)                                */\n#define TIMER4_TIMER4_GPIO1_CONF_REG_TIM_GPIO1_CONF_Msk (0x3fUL)    /*!< TIM_GPIO1_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER4_GPIO2_CONF_REG  ================================================= */\n#define TIMER4_TIMER4_GPIO2_CONF_REG_TIM_GPIO2_CONF_Pos (0UL)       /*!< TIM_GPIO2_CONF (Bit 0)                                */\n#define TIMER4_TIMER4_GPIO2_CONF_REG_TIM_GPIO2_CONF_Msk (0x3fUL)    /*!< TIM_GPIO2_CONF (Bitfield-Mask: 0x3f)                  */\n/* =================================================  TIMER4_PRESCALER_REG  ================================================== */\n#define TIMER4_TIMER4_PRESCALER_REG_TIM_PRESCALER_Pos (0UL)         /*!< TIM_PRESCALER (Bit 0)                                 */\n#define TIMER4_TIMER4_PRESCALER_REG_TIM_PRESCALER_Msk (0x1fUL)      /*!< TIM_PRESCALER (Bitfield-Mask: 0x1f)                   */\n/* ===============================================  TIMER4_PRESCALER_VAL_REG  ================================================ */\n#define TIMER4_TIMER4_PRESCALER_VAL_REG_TIM_PRESCALER_VAL_Pos (0UL) /*!< TIM_PRESCALER_VAL (Bit 0)                             */\n#define TIMER4_TIMER4_PRESCALER_VAL_REG_TIM_PRESCALER_VAL_Msk (0x1fUL) /*!< TIM_PRESCALER_VAL (Bitfield-Mask: 0x1f)            */\n/* ===================================================  TIMER4_PWM_DC_REG  =================================================== */\n#define TIMER4_TIMER4_PWM_DC_REG_TIM_PWM_DC_Pos (0UL)               /*!< TIM_PWM_DC (Bit 0)                                    */\n#define TIMER4_TIMER4_PWM_DC_REG_TIM_PWM_DC_Msk (0xffffUL)          /*!< TIM_PWM_DC (Bitfield-Mask: 0xffff)                    */\n/* ==================================================  TIMER4_PWM_FREQ_REG  ================================================== */\n#define TIMER4_TIMER4_PWM_FREQ_REG_TIM_PWM_FREQ_Pos (0UL)           /*!< TIM_PWM_FREQ (Bit 0)                                  */\n#define TIMER4_TIMER4_PWM_FREQ_REG_TIM_PWM_FREQ_Msk (0xffffUL)      /*!< TIM_PWM_FREQ (Bitfield-Mask: 0xffff)                  */\n/* ===================================================  TIMER4_RELOAD_REG  =================================================== */\n#define TIMER4_TIMER4_RELOAD_REG_TIM_RELOAD_Pos (0UL)               /*!< TIM_RELOAD (Bit 0)                                    */\n#define TIMER4_TIMER4_RELOAD_REG_TIM_RELOAD_Msk (0xffffffUL)        /*!< TIM_RELOAD (Bitfield-Mask: 0xffffff)                  */\n/* ===================================================  TIMER4_STATUS_REG  =================================================== */\n#define TIMER4_TIMER4_STATUS_REG_TIM_ONESHOT_PHASE_Pos (2UL)        /*!< TIM_ONESHOT_PHASE (Bit 2)                             */\n#define TIMER4_TIMER4_STATUS_REG_TIM_ONESHOT_PHASE_Msk (0xcUL)      /*!< TIM_ONESHOT_PHASE (Bitfield-Mask: 0x03)               */\n#define TIMER4_TIMER4_STATUS_REG_TIM_IN2_STATE_Pos (1UL)            /*!< TIM_IN2_STATE (Bit 1)                                 */\n#define TIMER4_TIMER4_STATUS_REG_TIM_IN2_STATE_Msk (0x2UL)          /*!< TIM_IN2_STATE (Bitfield-Mask: 0x01)                   */\n#define TIMER4_TIMER4_STATUS_REG_TIM_IN1_STATE_Pos (0UL)            /*!< TIM_IN1_STATE (Bit 0)                                 */\n#define TIMER4_TIMER4_STATUS_REG_TIM_IN1_STATE_Msk (0x1UL)          /*!< TIM_IN1_STATE (Bitfield-Mask: 0x01)                   */\n/* =================================================  TIMER4_TIMER_VAL_REG  ================================================== */\n#define TIMER4_TIMER4_TIMER_VAL_REG_TIM_TIMER_VALUE_Pos (0UL)       /*!< TIM_TIMER_VALUE (Bit 0)                               */\n#define TIMER4_TIMER4_TIMER_VAL_REG_TIM_TIMER_VALUE_Msk (0xffffffUL) /*!< TIM_TIMER_VALUE (Bitfield-Mask: 0xffffff)            */\n\n\n/* =========================================================================================================================== */\n/* ================                                           TRNG                                            ================ */\n/* =========================================================================================================================== */\n\n/* =====================================================  TRNG_CTRL_REG  ===================================================== */\n#define TRNG_TRNG_CTRL_REG_TRNG_ENABLE_Pos (0UL)                    /*!< TRNG_ENABLE (Bit 0)                                   */\n#define TRNG_TRNG_CTRL_REG_TRNG_ENABLE_Msk (0x1UL)                  /*!< TRNG_ENABLE (Bitfield-Mask: 0x01)                     */\n/* ===================================================  TRNG_FIFOLVL_REG  ==================================================== */\n#define TRNG_TRNG_FIFOLVL_REG_TRNG_FIFOFULL_Pos (5UL)               /*!< TRNG_FIFOFULL (Bit 5)                                 */\n#define TRNG_TRNG_FIFOLVL_REG_TRNG_FIFOFULL_Msk (0x20UL)            /*!< TRNG_FIFOFULL (Bitfield-Mask: 0x01)                   */\n#define TRNG_TRNG_FIFOLVL_REG_TRNG_FIFOLVL_Pos (0UL)                /*!< TRNG_FIFOLVL (Bit 0)                                  */\n#define TRNG_TRNG_FIFOLVL_REG_TRNG_FIFOLVL_Msk (0x1fUL)             /*!< TRNG_FIFOLVL (Bitfield-Mask: 0x1f)                    */\n/* =====================================================  TRNG_VER_REG  ====================================================== */\n#define TRNG_TRNG_VER_REG_TRNG_MAJ_Pos    (24UL)                    /*!< TRNG_MAJ (Bit 24)                                     */\n#define TRNG_TRNG_VER_REG_TRNG_MAJ_Msk    (0xff000000UL)            /*!< TRNG_MAJ (Bitfield-Mask: 0xff)                        */\n#define TRNG_TRNG_VER_REG_TRNG_MIN_Pos    (16UL)                    /*!< TRNG_MIN (Bit 16)                                     */\n#define TRNG_TRNG_VER_REG_TRNG_MIN_Msk    (0xff0000UL)              /*!< TRNG_MIN (Bitfield-Mask: 0xff)                        */\n#define TRNG_TRNG_VER_REG_TRNG_SVN_Pos    (0UL)                     /*!< TRNG_SVN (Bit 0)                                      */\n#define TRNG_TRNG_VER_REG_TRNG_SVN_Msk    (0xffffUL)                /*!< TRNG_SVN (Bitfield-Mask: 0xffff)                      */\n\n\n/* =========================================================================================================================== */\n/* ================                                           UART                                            ================ */\n/* =========================================================================================================================== */\n\n/* =====================================================  UART_CTR_REG  ====================================================== */\n#define UART_UART_CTR_REG_UART_CTR_Pos    (0UL)                     /*!< UART_CTR (Bit 0)                                      */\n#define UART_UART_CTR_REG_UART_CTR_Msk    (0xffffffffUL)            /*!< UART_CTR (Bitfield-Mask: 0xffffffff)                  */\n/* =====================================================  UART_DLF_REG  ====================================================== */\n#define UART_UART_DLF_REG_UART_DLF_Pos    (0UL)                     /*!< UART_DLF (Bit 0)                                      */\n#define UART_UART_DLF_REG_UART_DLF_Msk    (0xfUL)                   /*!< UART_DLF (Bitfield-Mask: 0x0f)                        */\n/* ====================================================  UART_DMASA_REG  ===================================================== */\n#define UART_UART_DMASA_REG_UART_DMASA_Pos (0UL)                    /*!< UART_DMASA (Bit 0)                                    */\n#define UART_UART_DMASA_REG_UART_DMASA_Msk (0x1UL)                  /*!< UART_DMASA (Bitfield-Mask: 0x01)                      */\n/* =====================================================  UART_HTX_REG  ====================================================== */\n#define UART_UART_HTX_REG_UART_HALT_TX_Pos (0UL)                    /*!< UART_HALT_TX (Bit 0)                                  */\n#define UART_UART_HTX_REG_UART_HALT_TX_Msk (0x1UL)                  /*!< UART_HALT_TX (Bitfield-Mask: 0x01)                    */\n/* ===================================================  UART_IER_DLH_REG  ==================================================== */\n#define UART_UART_IER_DLH_REG_PTIME_DLH7_Pos (7UL)                  /*!< PTIME_DLH7 (Bit 7)                                    */\n#define UART_UART_IER_DLH_REG_PTIME_DLH7_Msk (0x80UL)               /*!< PTIME_DLH7 (Bitfield-Mask: 0x01)                      */\n#define UART_UART_IER_DLH_REG_DLH6_5_Pos  (5UL)                     /*!< DLH6_5 (Bit 5)                                        */\n#define UART_UART_IER_DLH_REG_DLH6_5_Msk  (0x60UL)                  /*!< DLH6_5 (Bitfield-Mask: 0x03)                          */\n#define UART_UART_IER_DLH_REG_ELCOLR_DLH4_Pos (4UL)                 /*!< ELCOLR_DLH4 (Bit 4)                                   */\n#define UART_UART_IER_DLH_REG_ELCOLR_DLH4_Msk (0x10UL)              /*!< ELCOLR_DLH4 (Bitfield-Mask: 0x01)                     */\n#define UART_UART_IER_DLH_REG_EDSSI_DLH3_Pos (3UL)                  /*!< EDSSI_DLH3 (Bit 3)                                    */\n#define UART_UART_IER_DLH_REG_EDSSI_DLH3_Msk (0x8UL)                /*!< EDSSI_DLH3 (Bitfield-Mask: 0x01)                      */\n#define UART_UART_IER_DLH_REG_ELSI_DLH2_Pos (2UL)                   /*!< ELSI_DLH2 (Bit 2)                                     */\n#define UART_UART_IER_DLH_REG_ELSI_DLH2_Msk (0x4UL)                 /*!< ELSI_DLH2 (Bitfield-Mask: 0x01)                       */\n#define UART_UART_IER_DLH_REG_ETBEI_DLH1_Pos (1UL)                  /*!< ETBEI_DLH1 (Bit 1)                                    */\n#define UART_UART_IER_DLH_REG_ETBEI_DLH1_Msk (0x2UL)                /*!< ETBEI_DLH1 (Bitfield-Mask: 0x01)                      */\n#define UART_UART_IER_DLH_REG_ERBFI_DLH0_Pos (0UL)                  /*!< ERBFI_DLH0 (Bit 0)                                    */\n#define UART_UART_IER_DLH_REG_ERBFI_DLH0_Msk (0x1UL)                /*!< ERBFI_DLH0 (Bitfield-Mask: 0x01)                      */\n/* ===================================================  UART_IIR_FCR_REG  ==================================================== */\n#define UART_UART_IIR_FCR_REG_IIR_FCR_Pos (0UL)                     /*!< IIR_FCR (Bit 0)                                       */\n#define UART_UART_IIR_FCR_REG_IIR_FCR_Msk (0xffUL)                  /*!< IIR_FCR (Bitfield-Mask: 0xff)                         */\n/* =====================================================  UART_LCR_REG  ====================================================== */\n#define UART_UART_LCR_REG_UART_DLAB_Pos   (7UL)                     /*!< UART_DLAB (Bit 7)                                     */\n#define UART_UART_LCR_REG_UART_DLAB_Msk   (0x80UL)                  /*!< UART_DLAB (Bitfield-Mask: 0x01)                       */\n#define UART_UART_LCR_REG_UART_BC_Pos     (6UL)                     /*!< UART_BC (Bit 6)                                       */\n#define UART_UART_LCR_REG_UART_BC_Msk     (0x40UL)                  /*!< UART_BC (Bitfield-Mask: 0x01)                         */\n#define UART_UART_LCR_REG_UART_EPS_Pos    (4UL)                     /*!< UART_EPS (Bit 4)                                      */\n#define UART_UART_LCR_REG_UART_EPS_Msk    (0x10UL)                  /*!< UART_EPS (Bitfield-Mask: 0x01)                        */\n#define UART_UART_LCR_REG_UART_PEN_Pos    (3UL)                     /*!< UART_PEN (Bit 3)                                      */\n#define UART_UART_LCR_REG_UART_PEN_Msk    (0x8UL)                   /*!< UART_PEN (Bitfield-Mask: 0x01)                        */\n#define UART_UART_LCR_REG_UART_STOP_Pos   (2UL)                     /*!< UART_STOP (Bit 2)                                     */\n#define UART_UART_LCR_REG_UART_STOP_Msk   (0x4UL)                   /*!< UART_STOP (Bitfield-Mask: 0x01)                       */\n#define UART_UART_LCR_REG_UART_DLS_Pos    (0UL)                     /*!< UART_DLS (Bit 0)                                      */\n#define UART_UART_LCR_REG_UART_DLS_Msk    (0x3UL)                   /*!< UART_DLS (Bitfield-Mask: 0x03)                        */\n/* =====================================================  UART_LSR_REG  ====================================================== */\n#define UART_UART_LSR_REG_UART_RFE_Pos    (7UL)                     /*!< UART_RFE (Bit 7)                                      */\n#define UART_UART_LSR_REG_UART_RFE_Msk    (0x80UL)                  /*!< UART_RFE (Bitfield-Mask: 0x01)                        */\n#define UART_UART_LSR_REG_UART_TEMT_Pos   (6UL)                     /*!< UART_TEMT (Bit 6)                                     */\n#define UART_UART_LSR_REG_UART_TEMT_Msk   (0x40UL)                  /*!< UART_TEMT (Bitfield-Mask: 0x01)                       */\n#define UART_UART_LSR_REG_UART_THRE_Pos   (5UL)                     /*!< UART_THRE (Bit 5)                                     */\n#define UART_UART_LSR_REG_UART_THRE_Msk   (0x20UL)                  /*!< UART_THRE (Bitfield-Mask: 0x01)                       */\n#define UART_UART_LSR_REG_UART_BI_Pos     (4UL)                     /*!< UART_BI (Bit 4)                                       */\n#define UART_UART_LSR_REG_UART_BI_Msk     (0x10UL)                  /*!< UART_BI (Bitfield-Mask: 0x01)                         */\n#define UART_UART_LSR_REG_UART_FE_Pos     (3UL)                     /*!< UART_FE (Bit 3)                                       */\n#define UART_UART_LSR_REG_UART_FE_Msk     (0x8UL)                   /*!< UART_FE (Bitfield-Mask: 0x01)                         */\n#define UART_UART_LSR_REG_UART_PE_Pos     (2UL)                     /*!< UART_PE (Bit 2)                                       */\n#define UART_UART_LSR_REG_UART_PE_Msk     (0x4UL)                   /*!< UART_PE (Bitfield-Mask: 0x01)                         */\n#define UART_UART_LSR_REG_UART_OE_Pos     (1UL)                     /*!< UART_OE (Bit 1)                                       */\n#define UART_UART_LSR_REG_UART_OE_Msk     (0x2UL)                   /*!< UART_OE (Bitfield-Mask: 0x01)                         */\n#define UART_UART_LSR_REG_UART_DR_Pos     (0UL)                     /*!< UART_DR (Bit 0)                                       */\n#define UART_UART_LSR_REG_UART_DR_Msk     (0x1UL)                   /*!< UART_DR (Bitfield-Mask: 0x01)                         */\n/* =====================================================  UART_MCR_REG  ====================================================== */\n#define UART_UART_MCR_REG_UART_LB_Pos     (4UL)                     /*!< UART_LB (Bit 4)                                       */\n#define UART_UART_MCR_REG_UART_LB_Msk     (0x10UL)                  /*!< UART_LB (Bitfield-Mask: 0x01)                         */\n/* =================================================  UART_RBR_THR_DLL_REG  ================================================== */\n#define UART_UART_RBR_THR_DLL_REG_RBR_THR_DLL_Pos (0UL)             /*!< RBR_THR_DLL (Bit 0)                                   */\n#define UART_UART_RBR_THR_DLL_REG_RBR_THR_DLL_Msk (0xffUL)          /*!< RBR_THR_DLL (Bitfield-Mask: 0xff)                     */\n/* =====================================================  UART_RFL_REG  ====================================================== */\n#define UART_UART_RFL_REG_UART_RECEIVE_FIFO_LEVEL_Pos (0UL)         /*!< UART_RECEIVE_FIFO_LEVEL (Bit 0)                       */\n#define UART_UART_RFL_REG_UART_RECEIVE_FIFO_LEVEL_Msk (0x1fUL)      /*!< UART_RECEIVE_FIFO_LEVEL (Bitfield-Mask: 0x1f)         */\n/* =====================================================  UART_SBCR_REG  ===================================================== */\n#define UART_UART_SBCR_REG_UART_SHADOW_BREAK_CONTROL_Pos (0UL)      /*!< UART_SHADOW_BREAK_CONTROL (Bit 0)                     */\n#define UART_UART_SBCR_REG_UART_SHADOW_BREAK_CONTROL_Msk (0x1UL)    /*!< UART_SHADOW_BREAK_CONTROL (Bitfield-Mask: 0x01)       */\n/* =====================================================  UART_SCR_REG  ====================================================== */\n#define UART_UART_SCR_REG_UART_SCRATCH_PAD_Pos (0UL)                /*!< UART_SCRATCH_PAD (Bit 0)                              */\n#define UART_UART_SCR_REG_UART_SCRATCH_PAD_Msk (0xffUL)             /*!< UART_SCRATCH_PAD (Bitfield-Mask: 0xff)                */\n/* ====================================================  UART_SDMAM_REG  ===================================================== */\n#define UART_UART_SDMAM_REG_UART_SHADOW_DMA_MODE_Pos (0UL)          /*!< UART_SHADOW_DMA_MODE (Bit 0)                          */\n#define UART_UART_SDMAM_REG_UART_SHADOW_DMA_MODE_Msk (0x1UL)        /*!< UART_SHADOW_DMA_MODE (Bitfield-Mask: 0x01)            */\n/* =====================================================  UART_SFE_REG  ====================================================== */\n#define UART_UART_SFE_REG_UART_SHADOW_FIFO_ENABLE_Pos (0UL)         /*!< UART_SHADOW_FIFO_ENABLE (Bit 0)                       */\n#define UART_UART_SFE_REG_UART_SHADOW_FIFO_ENABLE_Msk (0x1UL)       /*!< UART_SHADOW_FIFO_ENABLE (Bitfield-Mask: 0x01)         */\n/* ==================================================  UART_SRBR_STHR0_REG  ================================================== */\n#define UART_UART_SRBR_STHR0_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR0_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART_SRBR_STHR10_REG  ================================================== */\n#define UART_UART_SRBR_STHR10_REG_SRBR_STHRx_Pos (0UL)              /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR10_REG_SRBR_STHRx_Msk (0xffUL)           /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART_SRBR_STHR11_REG  ================================================== */\n#define UART_UART_SRBR_STHR11_REG_SRBR_STHRx_Pos (0UL)              /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR11_REG_SRBR_STHRx_Msk (0xffUL)           /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART_SRBR_STHR12_REG  ================================================== */\n#define UART_UART_SRBR_STHR12_REG_SRBR_STHRx_Pos (0UL)              /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR12_REG_SRBR_STHRx_Msk (0xffUL)           /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART_SRBR_STHR13_REG  ================================================== */\n#define UART_UART_SRBR_STHR13_REG_SRBR_STHRx_Pos (0UL)              /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR13_REG_SRBR_STHRx_Msk (0xffUL)           /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART_SRBR_STHR14_REG  ================================================== */\n#define UART_UART_SRBR_STHR14_REG_SRBR_STHRx_Pos (0UL)              /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR14_REG_SRBR_STHRx_Msk (0xffUL)           /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART_SRBR_STHR15_REG  ================================================== */\n#define UART_UART_SRBR_STHR15_REG_SRBR_STHRx_Pos (0UL)              /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR15_REG_SRBR_STHRx_Msk (0xffUL)           /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR1_REG  ================================================== */\n#define UART_UART_SRBR_STHR1_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR1_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR2_REG  ================================================== */\n#define UART_UART_SRBR_STHR2_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR2_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR3_REG  ================================================== */\n#define UART_UART_SRBR_STHR3_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR3_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR4_REG  ================================================== */\n#define UART_UART_SRBR_STHR4_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR4_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR5_REG  ================================================== */\n#define UART_UART_SRBR_STHR5_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR5_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR6_REG  ================================================== */\n#define UART_UART_SRBR_STHR6_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR6_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR7_REG  ================================================== */\n#define UART_UART_SRBR_STHR7_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR7_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR8_REG  ================================================== */\n#define UART_UART_SRBR_STHR8_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR8_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* ==================================================  UART_SRBR_STHR9_REG  ================================================== */\n#define UART_UART_SRBR_STHR9_REG_SRBR_STHRx_Pos (0UL)               /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART_UART_SRBR_STHR9_REG_SRBR_STHRx_Msk (0xffUL)            /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =====================================================  UART_SRR_REG  ====================================================== */\n#define UART_UART_SRR_REG_UART_XFR_Pos    (2UL)                     /*!< UART_XFR (Bit 2)                                      */\n#define UART_UART_SRR_REG_UART_XFR_Msk    (0x4UL)                   /*!< UART_XFR (Bitfield-Mask: 0x01)                        */\n#define UART_UART_SRR_REG_UART_RFR_Pos    (1UL)                     /*!< UART_RFR (Bit 1)                                      */\n#define UART_UART_SRR_REG_UART_RFR_Msk    (0x2UL)                   /*!< UART_RFR (Bitfield-Mask: 0x01)                        */\n#define UART_UART_SRR_REG_UART_UR_Pos     (0UL)                     /*!< UART_UR (Bit 0)                                       */\n#define UART_UART_SRR_REG_UART_UR_Msk     (0x1UL)                   /*!< UART_UR (Bitfield-Mask: 0x01)                         */\n/* =====================================================  UART_SRT_REG  ====================================================== */\n#define UART_UART_SRT_REG_UART_SHADOW_RCVR_TRIGGER_Pos (0UL)        /*!< UART_SHADOW_RCVR_TRIGGER (Bit 0)                      */\n#define UART_UART_SRT_REG_UART_SHADOW_RCVR_TRIGGER_Msk (0x3UL)      /*!< UART_SHADOW_RCVR_TRIGGER (Bitfield-Mask: 0x03)        */\n/* =====================================================  UART_STET_REG  ===================================================== */\n#define UART_UART_STET_REG_UART_SHADOW_TX_EMPTY_TRIGGER_Pos (0UL)   /*!< UART_SHADOW_TX_EMPTY_TRIGGER (Bit 0)                  */\n#define UART_UART_STET_REG_UART_SHADOW_TX_EMPTY_TRIGGER_Msk (0x3UL) /*!< UART_SHADOW_TX_EMPTY_TRIGGER (Bitfield-Mask: 0x03)    */\n/* =====================================================  UART_TFL_REG  ====================================================== */\n#define UART_UART_TFL_REG_UART_TRANSMIT_FIFO_LEVEL_Pos (0UL)        /*!< UART_TRANSMIT_FIFO_LEVEL (Bit 0)                      */\n#define UART_UART_TFL_REG_UART_TRANSMIT_FIFO_LEVEL_Msk (0x1fUL)     /*!< UART_TRANSMIT_FIFO_LEVEL (Bitfield-Mask: 0x1f)        */\n/* =====================================================  UART_UCV_REG  ====================================================== */\n#define UART_UART_UCV_REG_UART_UCV_Pos    (0UL)                     /*!< UART_UCV (Bit 0)                                      */\n#define UART_UART_UCV_REG_UART_UCV_Msk    (0xffffffffUL)            /*!< UART_UCV (Bitfield-Mask: 0xffffffff)                  */\n/* =====================================================  UART_USR_REG  ====================================================== */\n#define UART_UART_USR_REG_UART_RFF_Pos    (4UL)                     /*!< UART_RFF (Bit 4)                                      */\n#define UART_UART_USR_REG_UART_RFF_Msk    (0x10UL)                  /*!< UART_RFF (Bitfield-Mask: 0x01)                        */\n#define UART_UART_USR_REG_UART_RFNE_Pos   (3UL)                     /*!< UART_RFNE (Bit 3)                                     */\n#define UART_UART_USR_REG_UART_RFNE_Msk   (0x8UL)                   /*!< UART_RFNE (Bitfield-Mask: 0x01)                       */\n#define UART_UART_USR_REG_UART_TFE_Pos    (2UL)                     /*!< UART_TFE (Bit 2)                                      */\n#define UART_UART_USR_REG_UART_TFE_Msk    (0x4UL)                   /*!< UART_TFE (Bitfield-Mask: 0x01)                        */\n#define UART_UART_USR_REG_UART_TFNF_Pos   (1UL)                     /*!< UART_TFNF (Bit 1)                                     */\n#define UART_UART_USR_REG_UART_TFNF_Msk   (0x2UL)                   /*!< UART_TFNF (Bitfield-Mask: 0x01)                       */\n#define UART_UART_USR_REG_UART_BUSY_Pos   (0UL)                     /*!< UART_BUSY (Bit 0)                                     */\n#define UART_UART_USR_REG_UART_BUSY_Msk   (0x1UL)                   /*!< UART_BUSY (Bitfield-Mask: 0x01)                       */\n\n\n/* =========================================================================================================================== */\n/* ================                                           UART2                                           ================ */\n/* =========================================================================================================================== */\n\n/* =====================================================  UART2_CTR_REG  ===================================================== */\n#define UART2_UART2_CTR_REG_UART_CTR_Pos  (0UL)                     /*!< UART_CTR (Bit 0)                                      */\n#define UART2_UART2_CTR_REG_UART_CTR_Msk  (0xffffffffUL)            /*!< UART_CTR (Bitfield-Mask: 0xffffffff)                  */\n/* =====================================================  UART2_DLF_REG  ===================================================== */\n#define UART2_UART2_DLF_REG_UART_DLF_Pos  (0UL)                     /*!< UART_DLF (Bit 0)                                      */\n#define UART2_UART2_DLF_REG_UART_DLF_Msk  (0xfUL)                   /*!< UART_DLF (Bitfield-Mask: 0x0f)                        */\n/* ====================================================  UART2_DMASA_REG  ==================================================== */\n#define UART2_UART2_DMASA_REG_UART_DMASA_Pos (0UL)                  /*!< UART_DMASA (Bit 0)                                    */\n#define UART2_UART2_DMASA_REG_UART_DMASA_Msk (0x1UL)                /*!< UART_DMASA (Bitfield-Mask: 0x01)                      */\n/* =====================================================  UART2_HTX_REG  ===================================================== */\n#define UART2_UART2_HTX_REG_UART_HALT_TX_Pos (0UL)                  /*!< UART_HALT_TX (Bit 0)                                  */\n#define UART2_UART2_HTX_REG_UART_HALT_TX_Msk (0x1UL)                /*!< UART_HALT_TX (Bitfield-Mask: 0x01)                    */\n/* ===================================================  UART2_IER_DLH_REG  =================================================== */\n#define UART2_UART2_IER_DLH_REG_PTIME_DLH7_Pos (7UL)                /*!< PTIME_DLH7 (Bit 7)                                    */\n#define UART2_UART2_IER_DLH_REG_PTIME_DLH7_Msk (0x80UL)             /*!< PTIME_DLH7 (Bitfield-Mask: 0x01)                      */\n#define UART2_UART2_IER_DLH_REG_DLH6_5_Pos (5UL)                    /*!< DLH6_5 (Bit 5)                                        */\n#define UART2_UART2_IER_DLH_REG_DLH6_5_Msk (0x60UL)                 /*!< DLH6_5 (Bitfield-Mask: 0x03)                          */\n#define UART2_UART2_IER_DLH_REG_ELCOLR_DLH4_Pos (4UL)               /*!< ELCOLR_DLH4 (Bit 4)                                   */\n#define UART2_UART2_IER_DLH_REG_ELCOLR_DLH4_Msk (0x10UL)            /*!< ELCOLR_DLH4 (Bitfield-Mask: 0x01)                     */\n#define UART2_UART2_IER_DLH_REG_EDSSI_DLH3_Pos (3UL)                /*!< EDSSI_DLH3 (Bit 3)                                    */\n#define UART2_UART2_IER_DLH_REG_EDSSI_DLH3_Msk (0x8UL)              /*!< EDSSI_DLH3 (Bitfield-Mask: 0x01)                      */\n#define UART2_UART2_IER_DLH_REG_ELSI_DLH2_Pos (2UL)                 /*!< ELSI_DLH2 (Bit 2)                                     */\n#define UART2_UART2_IER_DLH_REG_ELSI_DLH2_Msk (0x4UL)               /*!< ELSI_DLH2 (Bitfield-Mask: 0x01)                       */\n#define UART2_UART2_IER_DLH_REG_ETBEI_DLH1_Pos (1UL)                /*!< ETBEI_DLH1 (Bit 1)                                    */\n#define UART2_UART2_IER_DLH_REG_ETBEI_DLH1_Msk (0x2UL)              /*!< ETBEI_DLH1 (Bitfield-Mask: 0x01)                      */\n#define UART2_UART2_IER_DLH_REG_ERBFI_DLH0_Pos (0UL)                /*!< ERBFI_DLH0 (Bit 0)                                    */\n#define UART2_UART2_IER_DLH_REG_ERBFI_DLH0_Msk (0x1UL)              /*!< ERBFI_DLH0 (Bitfield-Mask: 0x01)                      */\n/* ===================================================  UART2_IIR_FCR_REG  =================================================== */\n#define UART2_UART2_IIR_FCR_REG_IIR_FCR_Pos (0UL)                   /*!< IIR_FCR (Bit 0)                                       */\n#define UART2_UART2_IIR_FCR_REG_IIR_FCR_Msk (0xffUL)                /*!< IIR_FCR (Bitfield-Mask: 0xff)                         */\n/* =====================================================  UART2_LCR_EXT  ===================================================== */\n#define UART2_UART2_LCR_EXT_UART_TRANSMIT_MODE_Pos (3UL)            /*!< UART_TRANSMIT_MODE (Bit 3)                            */\n#define UART2_UART2_LCR_EXT_UART_TRANSMIT_MODE_Msk (0x8UL)          /*!< UART_TRANSMIT_MODE (Bitfield-Mask: 0x01)              */\n#define UART2_UART2_LCR_EXT_UART_SEND_ADDR_Pos (2UL)                /*!< UART_SEND_ADDR (Bit 2)                                */\n#define UART2_UART2_LCR_EXT_UART_SEND_ADDR_Msk (0x4UL)              /*!< UART_SEND_ADDR (Bitfield-Mask: 0x01)                  */\n#define UART2_UART2_LCR_EXT_UART_ADDR_MATCH_Pos (1UL)               /*!< UART_ADDR_MATCH (Bit 1)                               */\n#define UART2_UART2_LCR_EXT_UART_ADDR_MATCH_Msk (0x2UL)             /*!< UART_ADDR_MATCH (Bitfield-Mask: 0x01)                 */\n#define UART2_UART2_LCR_EXT_UART_DLS_E_Pos (0UL)                    /*!< UART_DLS_E (Bit 0)                                    */\n#define UART2_UART2_LCR_EXT_UART_DLS_E_Msk (0x1UL)                  /*!< UART_DLS_E (Bitfield-Mask: 0x01)                      */\n/* =====================================================  UART2_LCR_REG  ===================================================== */\n#define UART2_UART2_LCR_REG_UART_DLAB_Pos (7UL)                     /*!< UART_DLAB (Bit 7)                                     */\n#define UART2_UART2_LCR_REG_UART_DLAB_Msk (0x80UL)                  /*!< UART_DLAB (Bitfield-Mask: 0x01)                       */\n#define UART2_UART2_LCR_REG_UART_BC_Pos   (6UL)                     /*!< UART_BC (Bit 6)                                       */\n#define UART2_UART2_LCR_REG_UART_BC_Msk   (0x40UL)                  /*!< UART_BC (Bitfield-Mask: 0x01)                         */\n#define UART2_UART2_LCR_REG_UART_SP_Pos   (5UL)                     /*!< UART_SP (Bit 5)                                       */\n#define UART2_UART2_LCR_REG_UART_SP_Msk   (0x20UL)                  /*!< UART_SP (Bitfield-Mask: 0x01)                         */\n#define UART2_UART2_LCR_REG_UART_EPS_Pos  (4UL)                     /*!< UART_EPS (Bit 4)                                      */\n#define UART2_UART2_LCR_REG_UART_EPS_Msk  (0x10UL)                  /*!< UART_EPS (Bitfield-Mask: 0x01)                        */\n#define UART2_UART2_LCR_REG_UART_PEN_Pos  (3UL)                     /*!< UART_PEN (Bit 3)                                      */\n#define UART2_UART2_LCR_REG_UART_PEN_Msk  (0x8UL)                   /*!< UART_PEN (Bitfield-Mask: 0x01)                        */\n#define UART2_UART2_LCR_REG_UART_STOP_Pos (2UL)                     /*!< UART_STOP (Bit 2)                                     */\n#define UART2_UART2_LCR_REG_UART_STOP_Msk (0x4UL)                   /*!< UART_STOP (Bitfield-Mask: 0x01)                       */\n#define UART2_UART2_LCR_REG_UART_DLS_Pos  (0UL)                     /*!< UART_DLS (Bit 0)                                      */\n#define UART2_UART2_LCR_REG_UART_DLS_Msk  (0x3UL)                   /*!< UART_DLS (Bitfield-Mask: 0x03)                        */\n/* =====================================================  UART2_LSR_REG  ===================================================== */\n#define UART2_UART2_LSR_REG_UART_ADDR_RCVD_Pos (8UL)                /*!< UART_ADDR_RCVD (Bit 8)                                */\n#define UART2_UART2_LSR_REG_UART_ADDR_RCVD_Msk (0x100UL)            /*!< UART_ADDR_RCVD (Bitfield-Mask: 0x01)                  */\n#define UART2_UART2_LSR_REG_UART_RFE_Pos  (7UL)                     /*!< UART_RFE (Bit 7)                                      */\n#define UART2_UART2_LSR_REG_UART_RFE_Msk  (0x80UL)                  /*!< UART_RFE (Bitfield-Mask: 0x01)                        */\n#define UART2_UART2_LSR_REG_UART_TEMT_Pos (6UL)                     /*!< UART_TEMT (Bit 6)                                     */\n#define UART2_UART2_LSR_REG_UART_TEMT_Msk (0x40UL)                  /*!< UART_TEMT (Bitfield-Mask: 0x01)                       */\n#define UART2_UART2_LSR_REG_UART_THRE_Pos (5UL)                     /*!< UART_THRE (Bit 5)                                     */\n#define UART2_UART2_LSR_REG_UART_THRE_Msk (0x20UL)                  /*!< UART_THRE (Bitfield-Mask: 0x01)                       */\n#define UART2_UART2_LSR_REG_UART_BI_Pos   (4UL)                     /*!< UART_BI (Bit 4)                                       */\n#define UART2_UART2_LSR_REG_UART_BI_Msk   (0x10UL)                  /*!< UART_BI (Bitfield-Mask: 0x01)                         */\n#define UART2_UART2_LSR_REG_UART_FE_Pos   (3UL)                     /*!< UART_FE (Bit 3)                                       */\n#define UART2_UART2_LSR_REG_UART_FE_Msk   (0x8UL)                   /*!< UART_FE (Bitfield-Mask: 0x01)                         */\n#define UART2_UART2_LSR_REG_UART_PE_Pos   (2UL)                     /*!< UART_PE (Bit 2)                                       */\n#define UART2_UART2_LSR_REG_UART_PE_Msk   (0x4UL)                   /*!< UART_PE (Bitfield-Mask: 0x01)                         */\n#define UART2_UART2_LSR_REG_UART_OE_Pos   (1UL)                     /*!< UART_OE (Bit 1)                                       */\n#define UART2_UART2_LSR_REG_UART_OE_Msk   (0x2UL)                   /*!< UART_OE (Bitfield-Mask: 0x01)                         */\n#define UART2_UART2_LSR_REG_UART_DR_Pos   (0UL)                     /*!< UART_DR (Bit 0)                                       */\n#define UART2_UART2_LSR_REG_UART_DR_Msk   (0x1UL)                   /*!< UART_DR (Bitfield-Mask: 0x01)                         */\n/* =====================================================  UART2_MCR_REG  ===================================================== */\n#define UART2_UART2_MCR_REG_UART_AFCE_Pos (5UL)                     /*!< UART_AFCE (Bit 5)                                     */\n#define UART2_UART2_MCR_REG_UART_AFCE_Msk (0x20UL)                  /*!< UART_AFCE (Bitfield-Mask: 0x01)                       */\n#define UART2_UART2_MCR_REG_UART_LB_Pos   (4UL)                     /*!< UART_LB (Bit 4)                                       */\n#define UART2_UART2_MCR_REG_UART_LB_Msk   (0x10UL)                  /*!< UART_LB (Bitfield-Mask: 0x01)                         */\n#define UART2_UART2_MCR_REG_UART_RTS_Pos  (1UL)                     /*!< UART_RTS (Bit 1)                                      */\n#define UART2_UART2_MCR_REG_UART_RTS_Msk  (0x2UL)                   /*!< UART_RTS (Bitfield-Mask: 0x01)                        */\n/* =====================================================  UART2_MSR_REG  ===================================================== */\n#define UART2_UART2_MSR_REG_UART_CTS_Pos  (4UL)                     /*!< UART_CTS (Bit 4)                                      */\n#define UART2_UART2_MSR_REG_UART_CTS_Msk  (0x10UL)                  /*!< UART_CTS (Bitfield-Mask: 0x01)                        */\n#define UART2_UART2_MSR_REG_UART_DCTS_Pos (0UL)                     /*!< UART_DCTS (Bit 0)                                     */\n#define UART2_UART2_MSR_REG_UART_DCTS_Msk (0x1UL)                   /*!< UART_DCTS (Bitfield-Mask: 0x01)                       */\n/* =====================================================  UART2_RAR_REG  ===================================================== */\n#define UART2_UART2_RAR_REG_UART_RAR_Pos  (0UL)                     /*!< UART_RAR (Bit 0)                                      */\n#define UART2_UART2_RAR_REG_UART_RAR_Msk  (0xffUL)                  /*!< UART_RAR (Bitfield-Mask: 0xff)                        */\n/* =================================================  UART2_RBR_THR_DLL_REG  ================================================= */\n#define UART2_UART2_RBR_THR_DLL_REG_RBR_THR_9BIT_Pos (8UL)          /*!< RBR_THR_9BIT (Bit 8)                                  */\n#define UART2_UART2_RBR_THR_DLL_REG_RBR_THR_9BIT_Msk (0x100UL)      /*!< RBR_THR_9BIT (Bitfield-Mask: 0x01)                    */\n#define UART2_UART2_RBR_THR_DLL_REG_RBR_THR_DLL_Pos (0UL)           /*!< RBR_THR_DLL (Bit 0)                                   */\n#define UART2_UART2_RBR_THR_DLL_REG_RBR_THR_DLL_Msk (0xffUL)        /*!< RBR_THR_DLL (Bitfield-Mask: 0xff)                     */\n/* =====================================================  UART2_RFL_REG  ===================================================== */\n#define UART2_UART2_RFL_REG_UART_RECEIVE_FIFO_LEVEL_Pos (0UL)       /*!< UART_RECEIVE_FIFO_LEVEL (Bit 0)                       */\n#define UART2_UART2_RFL_REG_UART_RECEIVE_FIFO_LEVEL_Msk (0x1fUL)    /*!< UART_RECEIVE_FIFO_LEVEL (Bitfield-Mask: 0x1f)         */\n/* ====================================================  UART2_SBCR_REG  ===================================================== */\n#define UART2_UART2_SBCR_REG_UART_SHADOW_BREAK_CONTROL_Pos (0UL)    /*!< UART_SHADOW_BREAK_CONTROL (Bit 0)                     */\n#define UART2_UART2_SBCR_REG_UART_SHADOW_BREAK_CONTROL_Msk (0x1UL)  /*!< UART_SHADOW_BREAK_CONTROL (Bitfield-Mask: 0x01)       */\n/* =====================================================  UART2_SCR_REG  ===================================================== */\n#define UART2_UART2_SCR_REG_UART_SCRATCH_PAD_Pos (0UL)              /*!< UART_SCRATCH_PAD (Bit 0)                              */\n#define UART2_UART2_SCR_REG_UART_SCRATCH_PAD_Msk (0xffUL)           /*!< UART_SCRATCH_PAD (Bitfield-Mask: 0xff)                */\n/* ====================================================  UART2_SDMAM_REG  ==================================================== */\n#define UART2_UART2_SDMAM_REG_UART_SHADOW_DMA_MODE_Pos (0UL)        /*!< UART_SHADOW_DMA_MODE (Bit 0)                          */\n#define UART2_UART2_SDMAM_REG_UART_SHADOW_DMA_MODE_Msk (0x1UL)      /*!< UART_SHADOW_DMA_MODE (Bitfield-Mask: 0x01)            */\n/* =====================================================  UART2_SFE_REG  ===================================================== */\n#define UART2_UART2_SFE_REG_UART_SHADOW_FIFO_ENABLE_Pos (0UL)       /*!< UART_SHADOW_FIFO_ENABLE (Bit 0)                       */\n#define UART2_UART2_SFE_REG_UART_SHADOW_FIFO_ENABLE_Msk (0x1UL)     /*!< UART_SHADOW_FIFO_ENABLE (Bitfield-Mask: 0x01)         */\n/* =================================================  UART2_SRBR_STHR0_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR0_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR0_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR10_REG  ================================================= */\n#define UART2_UART2_SRBR_STHR10_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR10_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR11_REG  ================================================= */\n#define UART2_UART2_SRBR_STHR11_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR11_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR12_REG  ================================================= */\n#define UART2_UART2_SRBR_STHR12_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR12_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR13_REG  ================================================= */\n#define UART2_UART2_SRBR_STHR13_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR13_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR14_REG  ================================================= */\n#define UART2_UART2_SRBR_STHR14_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR14_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR15_REG  ================================================= */\n#define UART2_UART2_SRBR_STHR15_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR15_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR1_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR1_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR1_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR2_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR2_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR2_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR3_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR3_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR3_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR4_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR4_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR4_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR5_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR5_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR5_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR6_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR6_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR6_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR7_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR7_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR7_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR8_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR8_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR8_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART2_SRBR_STHR9_REG  ================================================== */\n#define UART2_UART2_SRBR_STHR9_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART2_UART2_SRBR_STHR9_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =====================================================  UART2_SRR_REG  ===================================================== */\n#define UART2_UART2_SRR_REG_UART_XFR_Pos  (2UL)                     /*!< UART_XFR (Bit 2)                                      */\n#define UART2_UART2_SRR_REG_UART_XFR_Msk  (0x4UL)                   /*!< UART_XFR (Bitfield-Mask: 0x01)                        */\n#define UART2_UART2_SRR_REG_UART_RFR_Pos  (1UL)                     /*!< UART_RFR (Bit 1)                                      */\n#define UART2_UART2_SRR_REG_UART_RFR_Msk  (0x2UL)                   /*!< UART_RFR (Bitfield-Mask: 0x01)                        */\n#define UART2_UART2_SRR_REG_UART_UR_Pos   (0UL)                     /*!< UART_UR (Bit 0)                                       */\n#define UART2_UART2_SRR_REG_UART_UR_Msk   (0x1UL)                   /*!< UART_UR (Bitfield-Mask: 0x01)                         */\n/* ====================================================  UART2_SRTS_REG  ===================================================== */\n#define UART2_UART2_SRTS_REG_UART_SHADOW_REQUEST_TO_SEND_Pos (0UL)  /*!< UART_SHADOW_REQUEST_TO_SEND (Bit 0)                   */\n#define UART2_UART2_SRTS_REG_UART_SHADOW_REQUEST_TO_SEND_Msk (0x1UL) /*!< UART_SHADOW_REQUEST_TO_SEND (Bitfield-Mask: 0x01)    */\n/* =====================================================  UART2_SRT_REG  ===================================================== */\n#define UART2_UART2_SRT_REG_UART_SHADOW_RCVR_TRIGGER_Pos (0UL)      /*!< UART_SHADOW_RCVR_TRIGGER (Bit 0)                      */\n#define UART2_UART2_SRT_REG_UART_SHADOW_RCVR_TRIGGER_Msk (0x3UL)    /*!< UART_SHADOW_RCVR_TRIGGER (Bitfield-Mask: 0x03)        */\n/* ====================================================  UART2_STET_REG  ===================================================== */\n#define UART2_UART2_STET_REG_UART_SHADOW_TX_EMPTY_TRIGGER_Pos (0UL) /*!< UART_SHADOW_TX_EMPTY_TRIGGER (Bit 0)                  */\n#define UART2_UART2_STET_REG_UART_SHADOW_TX_EMPTY_TRIGGER_Msk (0x3UL) /*!< UART_SHADOW_TX_EMPTY_TRIGGER (Bitfield-Mask: 0x03)  */\n/* =====================================================  UART2_TAR_REG  ===================================================== */\n#define UART2_UART2_TAR_REG_UART_TAR_Pos  (0UL)                     /*!< UART_TAR (Bit 0)                                      */\n#define UART2_UART2_TAR_REG_UART_TAR_Msk  (0xffUL)                  /*!< UART_TAR (Bitfield-Mask: 0xff)                        */\n/* =====================================================  UART2_TFL_REG  ===================================================== */\n#define UART2_UART2_TFL_REG_UART_TRANSMIT_FIFO_LEVEL_Pos (0UL)      /*!< UART_TRANSMIT_FIFO_LEVEL (Bit 0)                      */\n#define UART2_UART2_TFL_REG_UART_TRANSMIT_FIFO_LEVEL_Msk (0x1fUL)   /*!< UART_TRANSMIT_FIFO_LEVEL (Bitfield-Mask: 0x1f)        */\n/* =====================================================  UART2_UCV_REG  ===================================================== */\n#define UART2_UART2_UCV_REG_UART_UCV_Pos  (0UL)                     /*!< UART_UCV (Bit 0)                                      */\n#define UART2_UART2_UCV_REG_UART_UCV_Msk  (0xffffffffUL)            /*!< UART_UCV (Bitfield-Mask: 0xffffffff)                  */\n/* =====================================================  UART2_USR_REG  ===================================================== */\n#define UART2_UART2_USR_REG_UART_RFF_Pos  (4UL)                     /*!< UART_RFF (Bit 4)                                      */\n#define UART2_UART2_USR_REG_UART_RFF_Msk  (0x10UL)                  /*!< UART_RFF (Bitfield-Mask: 0x01)                        */\n#define UART2_UART2_USR_REG_UART_RFNE_Pos (3UL)                     /*!< UART_RFNE (Bit 3)                                     */\n#define UART2_UART2_USR_REG_UART_RFNE_Msk (0x8UL)                   /*!< UART_RFNE (Bitfield-Mask: 0x01)                       */\n#define UART2_UART2_USR_REG_UART_TFE_Pos  (2UL)                     /*!< UART_TFE (Bit 2)                                      */\n#define UART2_UART2_USR_REG_UART_TFE_Msk  (0x4UL)                   /*!< UART_TFE (Bitfield-Mask: 0x01)                        */\n#define UART2_UART2_USR_REG_UART_TFNF_Pos (1UL)                     /*!< UART_TFNF (Bit 1)                                     */\n#define UART2_UART2_USR_REG_UART_TFNF_Msk (0x2UL)                   /*!< UART_TFNF (Bitfield-Mask: 0x01)                       */\n#define UART2_UART2_USR_REG_UART_BUSY_Pos (0UL)                     /*!< UART_BUSY (Bit 0)                                     */\n#define UART2_UART2_USR_REG_UART_BUSY_Msk (0x1UL)                   /*!< UART_BUSY (Bitfield-Mask: 0x01)                       */\n\n\n/* =========================================================================================================================== */\n/* ================                                           UART3                                           ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  UART3_CONFIG_REG  ==================================================== */\n#define UART3_UART3_CONFIG_REG_ISO7816_SCRATCH_PAD_Pos (3UL)        /*!< ISO7816_SCRATCH_PAD (Bit 3)                           */\n#define UART3_UART3_CONFIG_REG_ISO7816_SCRATCH_PAD_Msk (0xf8UL)     /*!< ISO7816_SCRATCH_PAD (Bitfield-Mask: 0x1f)             */\n#define UART3_UART3_CONFIG_REG_ISO7816_ENABLE_Pos (2UL)             /*!< ISO7816_ENABLE (Bit 2)                                */\n#define UART3_UART3_CONFIG_REG_ISO7816_ENABLE_Msk (0x4UL)           /*!< ISO7816_ENABLE (Bitfield-Mask: 0x01)                  */\n#define UART3_UART3_CONFIG_REG_ISO7816_ERR_SIG_EN_Pos (1UL)         /*!< ISO7816_ERR_SIG_EN (Bit 1)                            */\n#define UART3_UART3_CONFIG_REG_ISO7816_ERR_SIG_EN_Msk (0x2UL)       /*!< ISO7816_ERR_SIG_EN (Bitfield-Mask: 0x01)              */\n#define UART3_UART3_CONFIG_REG_ISO7816_CONVENTION_Pos (0UL)         /*!< ISO7816_CONVENTION (Bit 0)                            */\n#define UART3_UART3_CONFIG_REG_ISO7816_CONVENTION_Msk (0x1UL)       /*!< ISO7816_CONVENTION (Bitfield-Mask: 0x01)              */\n/* ====================================================  UART3_CTRL_REG  ===================================================== */\n#define UART3_UART3_CTRL_REG_ISO7816_AUTO_GT_Pos (11UL)             /*!< ISO7816_AUTO_GT (Bit 11)                              */\n#define UART3_UART3_CTRL_REG_ISO7816_AUTO_GT_Msk (0x800UL)          /*!< ISO7816_AUTO_GT (Bitfield-Mask: 0x01)                 */\n#define UART3_UART3_CTRL_REG_ISO7816_ERR_TX_VALUE_IRQMASK_Pos (10UL) /*!< ISO7816_ERR_TX_VALUE_IRQMASK (Bit 10)                */\n#define UART3_UART3_CTRL_REG_ISO7816_ERR_TX_VALUE_IRQMASK_Msk (0x400UL) /*!< ISO7816_ERR_TX_VALUE_IRQMASK (Bitfield-Mask: 0x01) */\n#define UART3_UART3_CTRL_REG_ISO7816_ERR_TX_TIME_IRQMASK_Pos (9UL)  /*!< ISO7816_ERR_TX_TIME_IRQMASK (Bit 9)                   */\n#define UART3_UART3_CTRL_REG_ISO7816_ERR_TX_TIME_IRQMASK_Msk (0x200UL) /*!< ISO7816_ERR_TX_TIME_IRQMASK (Bitfield-Mask: 0x01)  */\n#define UART3_UART3_CTRL_REG_ISO7816_TIM_EXPIRED_IRQMASK_Pos (8UL)  /*!< ISO7816_TIM_EXPIRED_IRQMASK (Bit 8)                   */\n#define UART3_UART3_CTRL_REG_ISO7816_TIM_EXPIRED_IRQMASK_Msk (0x100UL) /*!< ISO7816_TIM_EXPIRED_IRQMASK (Bitfield-Mask: 0x01)  */\n#define UART3_UART3_CTRL_REG_ISO7816_CLK_STATUS_Pos (7UL)           /*!< ISO7816_CLK_STATUS (Bit 7)                            */\n#define UART3_UART3_CTRL_REG_ISO7816_CLK_STATUS_Msk (0x80UL)        /*!< ISO7816_CLK_STATUS (Bitfield-Mask: 0x01)              */\n#define UART3_UART3_CTRL_REG_ISO7816_CLK_LEVEL_Pos (6UL)            /*!< ISO7816_CLK_LEVEL (Bit 6)                             */\n#define UART3_UART3_CTRL_REG_ISO7816_CLK_LEVEL_Msk (0x40UL)         /*!< ISO7816_CLK_LEVEL (Bitfield-Mask: 0x01)               */\n#define UART3_UART3_CTRL_REG_ISO7816_CLK_EN_Pos (5UL)               /*!< ISO7816_CLK_EN (Bit 5)                                */\n#define UART3_UART3_CTRL_REG_ISO7816_CLK_EN_Msk (0x20UL)            /*!< ISO7816_CLK_EN (Bitfield-Mask: 0x01)                  */\n#define UART3_UART3_CTRL_REG_ISO7816_CLK_DIV_Pos (0UL)              /*!< ISO7816_CLK_DIV (Bit 0)                               */\n#define UART3_UART3_CTRL_REG_ISO7816_CLK_DIV_Msk (0x1fUL)           /*!< ISO7816_CLK_DIV (Bitfield-Mask: 0x1f)                 */\n/* =====================================================  UART3_CTR_REG  ===================================================== */\n#define UART3_UART3_CTR_REG_UART_CTR_Pos  (0UL)                     /*!< UART_CTR (Bit 0)                                      */\n#define UART3_UART3_CTR_REG_UART_CTR_Msk  (0xffffffffUL)            /*!< UART_CTR (Bitfield-Mask: 0xffffffff)                  */\n/* =====================================================  UART3_DLF_REG  ===================================================== */\n#define UART3_UART3_DLF_REG_UART_DLF_Pos  (0UL)                     /*!< UART_DLF (Bit 0)                                      */\n#define UART3_UART3_DLF_REG_UART_DLF_Msk  (0xfUL)                   /*!< UART_DLF (Bitfield-Mask: 0x0f)                        */\n/* ====================================================  UART3_DMASA_REG  ==================================================== */\n#define UART3_UART3_DMASA_REG_UART_DMASA_Pos (0UL)                  /*!< UART_DMASA (Bit 0)                                    */\n#define UART3_UART3_DMASA_REG_UART_DMASA_Msk (0x1UL)                /*!< UART_DMASA (Bitfield-Mask: 0x01)                      */\n/* ==================================================  UART3_ERR_CTRL_REG  =================================================== */\n#define UART3_UART3_ERR_CTRL_REG_ISO7816_ERR_PULSE_WIDTH_Pos (4UL)  /*!< ISO7816_ERR_PULSE_WIDTH (Bit 4)                       */\n#define UART3_UART3_ERR_CTRL_REG_ISO7816_ERR_PULSE_WIDTH_Msk (0x1f0UL) /*!< ISO7816_ERR_PULSE_WIDTH (Bitfield-Mask: 0x1f)      */\n#define UART3_UART3_ERR_CTRL_REG_ISO7816_ERR_PULSE_OFFSET_Pos (0UL) /*!< ISO7816_ERR_PULSE_OFFSET (Bit 0)                      */\n#define UART3_UART3_ERR_CTRL_REG_ISO7816_ERR_PULSE_OFFSET_Msk (0xfUL) /*!< ISO7816_ERR_PULSE_OFFSET (Bitfield-Mask: 0x0f)      */\n/* =====================================================  UART3_HTX_REG  ===================================================== */\n#define UART3_UART3_HTX_REG_UART_HALT_TX_Pos (0UL)                  /*!< UART_HALT_TX (Bit 0)                                  */\n#define UART3_UART3_HTX_REG_UART_HALT_TX_Msk (0x1UL)                /*!< UART_HALT_TX (Bitfield-Mask: 0x01)                    */\n/* ===================================================  UART3_IER_DLH_REG  =================================================== */\n#define UART3_UART3_IER_DLH_REG_PTIME_DLH7_Pos (7UL)                /*!< PTIME_DLH7 (Bit 7)                                    */\n#define UART3_UART3_IER_DLH_REG_PTIME_DLH7_Msk (0x80UL)             /*!< PTIME_DLH7 (Bitfield-Mask: 0x01)                      */\n#define UART3_UART3_IER_DLH_REG_DLH6_5_Pos (5UL)                    /*!< DLH6_5 (Bit 5)                                        */\n#define UART3_UART3_IER_DLH_REG_DLH6_5_Msk (0x60UL)                 /*!< DLH6_5 (Bitfield-Mask: 0x03)                          */\n#define UART3_UART3_IER_DLH_REG_ELCOLR_DLH4_Pos (4UL)               /*!< ELCOLR_DLH4 (Bit 4)                                   */\n#define UART3_UART3_IER_DLH_REG_ELCOLR_DLH4_Msk (0x10UL)            /*!< ELCOLR_DLH4 (Bitfield-Mask: 0x01)                     */\n#define UART3_UART3_IER_DLH_REG_EDSSI_DLH3_Pos (3UL)                /*!< EDSSI_DLH3 (Bit 3)                                    */\n#define UART3_UART3_IER_DLH_REG_EDSSI_DLH3_Msk (0x8UL)              /*!< EDSSI_DLH3 (Bitfield-Mask: 0x01)                      */\n#define UART3_UART3_IER_DLH_REG_ELSI_DLH2_Pos (2UL)                 /*!< ELSI_DLH2 (Bit 2)                                     */\n#define UART3_UART3_IER_DLH_REG_ELSI_DLH2_Msk (0x4UL)               /*!< ELSI_DLH2 (Bitfield-Mask: 0x01)                       */\n#define UART3_UART3_IER_DLH_REG_ETBEI_DLH1_Pos (1UL)                /*!< ETBEI_DLH1 (Bit 1)                                    */\n#define UART3_UART3_IER_DLH_REG_ETBEI_DLH1_Msk (0x2UL)              /*!< ETBEI_DLH1 (Bitfield-Mask: 0x01)                      */\n#define UART3_UART3_IER_DLH_REG_ERBFI_DLH0_Pos (0UL)                /*!< ERBFI_DLH0 (Bit 0)                                    */\n#define UART3_UART3_IER_DLH_REG_ERBFI_DLH0_Msk (0x1UL)              /*!< ERBFI_DLH0 (Bitfield-Mask: 0x01)                      */\n/* ===================================================  UART3_IIR_FCR_REG  =================================================== */\n#define UART3_UART3_IIR_FCR_REG_IIR_FCR_Pos (0UL)                   /*!< IIR_FCR (Bit 0)                                       */\n#define UART3_UART3_IIR_FCR_REG_IIR_FCR_Msk (0xffUL)                /*!< IIR_FCR (Bitfield-Mask: 0xff)                         */\n/* =================================================  UART3_IRQ_STATUS_REG  ================================================== */\n#define UART3_UART3_IRQ_STATUS_REG_ISO7816_ERR_TX_VALUE_IRQ_Pos (2UL) /*!< ISO7816_ERR_TX_VALUE_IRQ (Bit 2)                    */\n#define UART3_UART3_IRQ_STATUS_REG_ISO7816_ERR_TX_VALUE_IRQ_Msk (0x4UL) /*!< ISO7816_ERR_TX_VALUE_IRQ (Bitfield-Mask: 0x01)    */\n#define UART3_UART3_IRQ_STATUS_REG_ISO7816_ERR_TX_TIME_IRQ_Pos (1UL) /*!< ISO7816_ERR_TX_TIME_IRQ (Bit 1)                      */\n#define UART3_UART3_IRQ_STATUS_REG_ISO7816_ERR_TX_TIME_IRQ_Msk (0x2UL) /*!< ISO7816_ERR_TX_TIME_IRQ (Bitfield-Mask: 0x01)      */\n#define UART3_UART3_IRQ_STATUS_REG_ISO7816_TIM_EXPIRED_IRQ_Pos (0UL) /*!< ISO7816_TIM_EXPIRED_IRQ (Bit 0)                      */\n#define UART3_UART3_IRQ_STATUS_REG_ISO7816_TIM_EXPIRED_IRQ_Msk (0x1UL) /*!< ISO7816_TIM_EXPIRED_IRQ (Bitfield-Mask: 0x01)      */\n/* =====================================================  UART3_LCR_EXT  ===================================================== */\n#define UART3_UART3_LCR_EXT_UART_TRANSMIT_MODE_Pos (3UL)            /*!< UART_TRANSMIT_MODE (Bit 3)                            */\n#define UART3_UART3_LCR_EXT_UART_TRANSMIT_MODE_Msk (0x8UL)          /*!< UART_TRANSMIT_MODE (Bitfield-Mask: 0x01)              */\n#define UART3_UART3_LCR_EXT_UART_SEND_ADDR_Pos (2UL)                /*!< UART_SEND_ADDR (Bit 2)                                */\n#define UART3_UART3_LCR_EXT_UART_SEND_ADDR_Msk (0x4UL)              /*!< UART_SEND_ADDR (Bitfield-Mask: 0x01)                  */\n#define UART3_UART3_LCR_EXT_UART_ADDR_MATCH_Pos (1UL)               /*!< UART_ADDR_MATCH (Bit 1)                               */\n#define UART3_UART3_LCR_EXT_UART_ADDR_MATCH_Msk (0x2UL)             /*!< UART_ADDR_MATCH (Bitfield-Mask: 0x01)                 */\n#define UART3_UART3_LCR_EXT_UART_DLS_E_Pos (0UL)                    /*!< UART_DLS_E (Bit 0)                                    */\n#define UART3_UART3_LCR_EXT_UART_DLS_E_Msk (0x1UL)                  /*!< UART_DLS_E (Bitfield-Mask: 0x01)                      */\n/* =====================================================  UART3_LCR_REG  ===================================================== */\n#define UART3_UART3_LCR_REG_UART_DLAB_Pos (7UL)                     /*!< UART_DLAB (Bit 7)                                     */\n#define UART3_UART3_LCR_REG_UART_DLAB_Msk (0x80UL)                  /*!< UART_DLAB (Bitfield-Mask: 0x01)                       */\n#define UART3_UART3_LCR_REG_UART_BC_Pos   (6UL)                     /*!< UART_BC (Bit 6)                                       */\n#define UART3_UART3_LCR_REG_UART_BC_Msk   (0x40UL)                  /*!< UART_BC (Bitfield-Mask: 0x01)                         */\n#define UART3_UART3_LCR_REG_UART_SP_Pos   (5UL)                     /*!< UART_SP (Bit 5)                                       */\n#define UART3_UART3_LCR_REG_UART_SP_Msk   (0x20UL)                  /*!< UART_SP (Bitfield-Mask: 0x01)                         */\n#define UART3_UART3_LCR_REG_UART_EPS_Pos  (4UL)                     /*!< UART_EPS (Bit 4)                                      */\n#define UART3_UART3_LCR_REG_UART_EPS_Msk  (0x10UL)                  /*!< UART_EPS (Bitfield-Mask: 0x01)                        */\n#define UART3_UART3_LCR_REG_UART_PEN_Pos  (3UL)                     /*!< UART_PEN (Bit 3)                                      */\n#define UART3_UART3_LCR_REG_UART_PEN_Msk  (0x8UL)                   /*!< UART_PEN (Bitfield-Mask: 0x01)                        */\n#define UART3_UART3_LCR_REG_UART_STOP_Pos (2UL)                     /*!< UART_STOP (Bit 2)                                     */\n#define UART3_UART3_LCR_REG_UART_STOP_Msk (0x4UL)                   /*!< UART_STOP (Bitfield-Mask: 0x01)                       */\n#define UART3_UART3_LCR_REG_UART_DLS_Pos  (0UL)                     /*!< UART_DLS (Bit 0)                                      */\n#define UART3_UART3_LCR_REG_UART_DLS_Msk  (0x3UL)                   /*!< UART_DLS (Bitfield-Mask: 0x03)                        */\n/* =====================================================  UART3_LSR_REG  ===================================================== */\n#define UART3_UART3_LSR_REG_UART_ADDR_RCVD_Pos (8UL)                /*!< UART_ADDR_RCVD (Bit 8)                                */\n#define UART3_UART3_LSR_REG_UART_ADDR_RCVD_Msk (0x100UL)            /*!< UART_ADDR_RCVD (Bitfield-Mask: 0x01)                  */\n#define UART3_UART3_LSR_REG_UART_RFE_Pos  (7UL)                     /*!< UART_RFE (Bit 7)                                      */\n#define UART3_UART3_LSR_REG_UART_RFE_Msk  (0x80UL)                  /*!< UART_RFE (Bitfield-Mask: 0x01)                        */\n#define UART3_UART3_LSR_REG_UART_TEMT_Pos (6UL)                     /*!< UART_TEMT (Bit 6)                                     */\n#define UART3_UART3_LSR_REG_UART_TEMT_Msk (0x40UL)                  /*!< UART_TEMT (Bitfield-Mask: 0x01)                       */\n#define UART3_UART3_LSR_REG_UART_THRE_Pos (5UL)                     /*!< UART_THRE (Bit 5)                                     */\n#define UART3_UART3_LSR_REG_UART_THRE_Msk (0x20UL)                  /*!< UART_THRE (Bitfield-Mask: 0x01)                       */\n#define UART3_UART3_LSR_REG_UART_BI_Pos   (4UL)                     /*!< UART_BI (Bit 4)                                       */\n#define UART3_UART3_LSR_REG_UART_BI_Msk   (0x10UL)                  /*!< UART_BI (Bitfield-Mask: 0x01)                         */\n#define UART3_UART3_LSR_REG_UART_FE_Pos   (3UL)                     /*!< UART_FE (Bit 3)                                       */\n#define UART3_UART3_LSR_REG_UART_FE_Msk   (0x8UL)                   /*!< UART_FE (Bitfield-Mask: 0x01)                         */\n#define UART3_UART3_LSR_REG_UART_PE_Pos   (2UL)                     /*!< UART_PE (Bit 2)                                       */\n#define UART3_UART3_LSR_REG_UART_PE_Msk   (0x4UL)                   /*!< UART_PE (Bitfield-Mask: 0x01)                         */\n#define UART3_UART3_LSR_REG_UART_OE_Pos   (1UL)                     /*!< UART_OE (Bit 1)                                       */\n#define UART3_UART3_LSR_REG_UART_OE_Msk   (0x2UL)                   /*!< UART_OE (Bitfield-Mask: 0x01)                         */\n#define UART3_UART3_LSR_REG_UART_DR_Pos   (0UL)                     /*!< UART_DR (Bit 0)                                       */\n#define UART3_UART3_LSR_REG_UART_DR_Msk   (0x1UL)                   /*!< UART_DR (Bitfield-Mask: 0x01)                         */\n/* =====================================================  UART3_MCR_REG  ===================================================== */\n#define UART3_UART3_MCR_REG_UART_AFCE_Pos (5UL)                     /*!< UART_AFCE (Bit 5)                                     */\n#define UART3_UART3_MCR_REG_UART_AFCE_Msk (0x20UL)                  /*!< UART_AFCE (Bitfield-Mask: 0x01)                       */\n#define UART3_UART3_MCR_REG_UART_LB_Pos   (4UL)                     /*!< UART_LB (Bit 4)                                       */\n#define UART3_UART3_MCR_REG_UART_LB_Msk   (0x10UL)                  /*!< UART_LB (Bitfield-Mask: 0x01)                         */\n#define UART3_UART3_MCR_REG_UART_RTS_Pos  (1UL)                     /*!< UART_RTS (Bit 1)                                      */\n#define UART3_UART3_MCR_REG_UART_RTS_Msk  (0x2UL)                   /*!< UART_RTS (Bitfield-Mask: 0x01)                        */\n/* =====================================================  UART3_MSR_REG  ===================================================== */\n#define UART3_UART3_MSR_REG_UART_CTS_Pos  (4UL)                     /*!< UART_CTS (Bit 4)                                      */\n#define UART3_UART3_MSR_REG_UART_CTS_Msk  (0x10UL)                  /*!< UART_CTS (Bitfield-Mask: 0x01)                        */\n#define UART3_UART3_MSR_REG_UART_DCTS_Pos (0UL)                     /*!< UART_DCTS (Bit 0)                                     */\n#define UART3_UART3_MSR_REG_UART_DCTS_Msk (0x1UL)                   /*!< UART_DCTS (Bitfield-Mask: 0x01)                       */\n/* =====================================================  UART3_RAR_REG  ===================================================== */\n#define UART3_UART3_RAR_REG_UART_RAR_Pos  (0UL)                     /*!< UART_RAR (Bit 0)                                      */\n#define UART3_UART3_RAR_REG_UART_RAR_Msk  (0xffUL)                  /*!< UART_RAR (Bitfield-Mask: 0xff)                        */\n/* =================================================  UART3_RBR_THR_DLL_REG  ================================================= */\n#define UART3_UART3_RBR_THR_DLL_REG_RBR_THR_9BIT_Pos (8UL)          /*!< RBR_THR_9BIT (Bit 8)                                  */\n#define UART3_UART3_RBR_THR_DLL_REG_RBR_THR_9BIT_Msk (0x100UL)      /*!< RBR_THR_9BIT (Bitfield-Mask: 0x01)                    */\n#define UART3_UART3_RBR_THR_DLL_REG_RBR_THR_DLL_Pos (0UL)           /*!< RBR_THR_DLL (Bit 0)                                   */\n#define UART3_UART3_RBR_THR_DLL_REG_RBR_THR_DLL_Msk (0xffUL)        /*!< RBR_THR_DLL (Bitfield-Mask: 0xff)                     */\n/* =====================================================  UART3_RFL_REG  ===================================================== */\n#define UART3_UART3_RFL_REG_UART_RECEIVE_FIFO_LEVEL_Pos (0UL)       /*!< UART_RECEIVE_FIFO_LEVEL (Bit 0)                       */\n#define UART3_UART3_RFL_REG_UART_RECEIVE_FIFO_LEVEL_Msk (0x1fUL)    /*!< UART_RECEIVE_FIFO_LEVEL (Bitfield-Mask: 0x1f)         */\n/* ====================================================  UART3_SBCR_REG  ===================================================== */\n#define UART3_UART3_SBCR_REG_UART_SHADOW_BREAK_CONTROL_Pos (0UL)    /*!< UART_SHADOW_BREAK_CONTROL (Bit 0)                     */\n#define UART3_UART3_SBCR_REG_UART_SHADOW_BREAK_CONTROL_Msk (0x1UL)  /*!< UART_SHADOW_BREAK_CONTROL (Bitfield-Mask: 0x01)       */\n/* ====================================================  UART3_SDMAM_REG  ==================================================== */\n#define UART3_UART3_SDMAM_REG_UART_SHADOW_DMA_MODE_Pos (0UL)        /*!< UART_SHADOW_DMA_MODE (Bit 0)                          */\n#define UART3_UART3_SDMAM_REG_UART_SHADOW_DMA_MODE_Msk (0x1UL)      /*!< UART_SHADOW_DMA_MODE (Bitfield-Mask: 0x01)            */\n/* =====================================================  UART3_SFE_REG  ===================================================== */\n#define UART3_UART3_SFE_REG_UART_SHADOW_FIFO_ENABLE_Pos (0UL)       /*!< UART_SHADOW_FIFO_ENABLE (Bit 0)                       */\n#define UART3_UART3_SFE_REG_UART_SHADOW_FIFO_ENABLE_Msk (0x1UL)     /*!< UART_SHADOW_FIFO_ENABLE (Bitfield-Mask: 0x01)         */\n/* =================================================  UART3_SRBR_STHR0_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR0_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR0_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR10_REG  ================================================= */\n#define UART3_UART3_SRBR_STHR10_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR10_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR11_REG  ================================================= */\n#define UART3_UART3_SRBR_STHR11_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR11_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR12_REG  ================================================= */\n#define UART3_UART3_SRBR_STHR12_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR12_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR13_REG  ================================================= */\n#define UART3_UART3_SRBR_STHR13_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR13_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR14_REG  ================================================= */\n#define UART3_UART3_SRBR_STHR14_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR14_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR15_REG  ================================================= */\n#define UART3_UART3_SRBR_STHR15_REG_SRBR_STHRx_Pos (0UL)            /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR15_REG_SRBR_STHRx_Msk (0xffUL)         /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR1_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR1_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR1_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR2_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR2_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR2_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR3_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR3_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR3_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR4_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR4_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR4_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR5_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR5_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR5_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR6_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR6_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR6_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR7_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR7_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR7_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR8_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR8_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR8_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =================================================  UART3_SRBR_STHR9_REG  ================================================== */\n#define UART3_UART3_SRBR_STHR9_REG_SRBR_STHRx_Pos (0UL)             /*!< SRBR_STHRx (Bit 0)                                    */\n#define UART3_UART3_SRBR_STHR9_REG_SRBR_STHRx_Msk (0xffUL)          /*!< SRBR_STHRx (Bitfield-Mask: 0xff)                      */\n/* =====================================================  UART3_SRR_REG  ===================================================== */\n#define UART3_UART3_SRR_REG_UART_XFR_Pos  (2UL)                     /*!< UART_XFR (Bit 2)                                      */\n#define UART3_UART3_SRR_REG_UART_XFR_Msk  (0x4UL)                   /*!< UART_XFR (Bitfield-Mask: 0x01)                        */\n#define UART3_UART3_SRR_REG_UART_RFR_Pos  (1UL)                     /*!< UART_RFR (Bit 1)                                      */\n#define UART3_UART3_SRR_REG_UART_RFR_Msk  (0x2UL)                   /*!< UART_RFR (Bitfield-Mask: 0x01)                        */\n#define UART3_UART3_SRR_REG_UART_UR_Pos   (0UL)                     /*!< UART_UR (Bit 0)                                       */\n#define UART3_UART3_SRR_REG_UART_UR_Msk   (0x1UL)                   /*!< UART_UR (Bitfield-Mask: 0x01)                         */\n/* ====================================================  UART3_SRTS_REG  ===================================================== */\n#define UART3_UART3_SRTS_REG_UART_SHADOW_REQUEST_TO_SEND_Pos (0UL)  /*!< UART_SHADOW_REQUEST_TO_SEND (Bit 0)                   */\n#define UART3_UART3_SRTS_REG_UART_SHADOW_REQUEST_TO_SEND_Msk (0x1UL) /*!< UART_SHADOW_REQUEST_TO_SEND (Bitfield-Mask: 0x01)    */\n/* =====================================================  UART3_SRT_REG  ===================================================== */\n#define UART3_UART3_SRT_REG_UART_SHADOW_RCVR_TRIGGER_Pos (0UL)      /*!< UART_SHADOW_RCVR_TRIGGER (Bit 0)                      */\n#define UART3_UART3_SRT_REG_UART_SHADOW_RCVR_TRIGGER_Msk (0x3UL)    /*!< UART_SHADOW_RCVR_TRIGGER (Bitfield-Mask: 0x03)        */\n/* ====================================================  UART3_STET_REG  ===================================================== */\n#define UART3_UART3_STET_REG_UART_SHADOW_TX_EMPTY_TRIGGER_Pos (0UL) /*!< UART_SHADOW_TX_EMPTY_TRIGGER (Bit 0)                  */\n#define UART3_UART3_STET_REG_UART_SHADOW_TX_EMPTY_TRIGGER_Msk (0x3UL) /*!< UART_SHADOW_TX_EMPTY_TRIGGER (Bitfield-Mask: 0x03)  */\n/* =====================================================  UART3_TAR_REG  ===================================================== */\n#define UART3_UART3_TAR_REG_UART_TAR_Pos  (0UL)                     /*!< UART_TAR (Bit 0)                                      */\n#define UART3_UART3_TAR_REG_UART_TAR_Msk  (0xffUL)                  /*!< UART_TAR (Bitfield-Mask: 0xff)                        */\n/* =====================================================  UART3_TFL_REG  ===================================================== */\n#define UART3_UART3_TFL_REG_UART_TRANSMIT_FIFO_LEVEL_Pos (0UL)      /*!< UART_TRANSMIT_FIFO_LEVEL (Bit 0)                      */\n#define UART3_UART3_TFL_REG_UART_TRANSMIT_FIFO_LEVEL_Msk (0x1fUL)   /*!< UART_TRANSMIT_FIFO_LEVEL (Bitfield-Mask: 0x1f)        */\n/* ====================================================  UART3_TIMER_REG  ==================================================== */\n#define UART3_UART3_TIMER_REG_ISO7816_TIM_MODE_Pos (17UL)           /*!< ISO7816_TIM_MODE (Bit 17)                             */\n#define UART3_UART3_TIMER_REG_ISO7816_TIM_MODE_Msk (0x20000UL)      /*!< ISO7816_TIM_MODE (Bitfield-Mask: 0x01)                */\n#define UART3_UART3_TIMER_REG_ISO7816_TIM_EN_Pos (16UL)             /*!< ISO7816_TIM_EN (Bit 16)                               */\n#define UART3_UART3_TIMER_REG_ISO7816_TIM_EN_Msk (0x10000UL)        /*!< ISO7816_TIM_EN (Bitfield-Mask: 0x01)                  */\n#define UART3_UART3_TIMER_REG_ISO7816_TIM_MAX_Pos (0UL)             /*!< ISO7816_TIM_MAX (Bit 0)                               */\n#define UART3_UART3_TIMER_REG_ISO7816_TIM_MAX_Msk (0xffffUL)        /*!< ISO7816_TIM_MAX (Bitfield-Mask: 0xffff)               */\n/* =====================================================  UART3_UCV_REG  ===================================================== */\n#define UART3_UART3_UCV_REG_UART_UCV_Pos  (0UL)                     /*!< UART_UCV (Bit 0)                                      */\n#define UART3_UART3_UCV_REG_UART_UCV_Msk  (0xffffffffUL)            /*!< UART_UCV (Bitfield-Mask: 0xffffffff)                  */\n/* =====================================================  UART3_USR_REG  ===================================================== */\n#define UART3_UART3_USR_REG_UART_RFF_Pos  (4UL)                     /*!< UART_RFF (Bit 4)                                      */\n#define UART3_UART3_USR_REG_UART_RFF_Msk  (0x10UL)                  /*!< UART_RFF (Bitfield-Mask: 0x01)                        */\n#define UART3_UART3_USR_REG_UART_RFNE_Pos (3UL)                     /*!< UART_RFNE (Bit 3)                                     */\n#define UART3_UART3_USR_REG_UART_RFNE_Msk (0x8UL)                   /*!< UART_RFNE (Bitfield-Mask: 0x01)                       */\n#define UART3_UART3_USR_REG_UART_TFE_Pos  (2UL)                     /*!< UART_TFE (Bit 2)                                      */\n#define UART3_UART3_USR_REG_UART_TFE_Msk  (0x4UL)                   /*!< UART_TFE (Bitfield-Mask: 0x01)                        */\n#define UART3_UART3_USR_REG_UART_TFNF_Pos (1UL)                     /*!< UART_TFNF (Bit 1)                                     */\n#define UART3_UART3_USR_REG_UART_TFNF_Msk (0x2UL)                   /*!< UART_TFNF (Bitfield-Mask: 0x01)                       */\n#define UART3_UART3_USR_REG_UART_BUSY_Pos (0UL)                     /*!< UART_BUSY (Bit 0)                                     */\n#define UART3_UART3_USR_REG_UART_BUSY_Msk (0x1UL)                   /*!< UART_BUSY (Bitfield-Mask: 0x01)                       */\n\n\n/* =========================================================================================================================== */\n/* ================                                            USB                                            ================ */\n/* =========================================================================================================================== */\n\n/* =====================================================  USB_ALTEV_REG  ===================================================== */\n#define USB_USB_ALTEV_REG_USB_RESUME_Pos  (7UL)                     /*!< USB_RESUME (Bit 7)                                    */\n#define USB_USB_ALTEV_REG_USB_RESUME_Msk  (0x80UL)                  /*!< USB_RESUME (Bitfield-Mask: 0x01)                      */\n#define USB_USB_ALTEV_REG_USB_RESET_Pos   (6UL)                     /*!< USB_RESET (Bit 6)                                     */\n#define USB_USB_ALTEV_REG_USB_RESET_Msk   (0x40UL)                  /*!< USB_RESET (Bitfield-Mask: 0x01)                       */\n#define USB_USB_ALTEV_REG_USB_SD5_Pos     (5UL)                     /*!< USB_SD5 (Bit 5)                                       */\n#define USB_USB_ALTEV_REG_USB_SD5_Msk     (0x20UL)                  /*!< USB_SD5 (Bitfield-Mask: 0x01)                         */\n#define USB_USB_ALTEV_REG_USB_SD3_Pos     (4UL)                     /*!< USB_SD3 (Bit 4)                                       */\n#define USB_USB_ALTEV_REG_USB_SD3_Msk     (0x10UL)                  /*!< USB_SD3 (Bitfield-Mask: 0x01)                         */\n#define USB_USB_ALTEV_REG_USB_EOP_Pos     (3UL)                     /*!< USB_EOP (Bit 3)                                       */\n#define USB_USB_ALTEV_REG_USB_EOP_Msk     (0x8UL)                   /*!< USB_EOP (Bitfield-Mask: 0x01)                         */\n/* ====================================================  USB_ALTMSK_REG  ===================================================== */\n#define USB_USB_ALTMSK_REG_USB_M_RESUME_Pos (7UL)                   /*!< USB_M_RESUME (Bit 7)                                  */\n#define USB_USB_ALTMSK_REG_USB_M_RESUME_Msk (0x80UL)                /*!< USB_M_RESUME (Bitfield-Mask: 0x01)                    */\n#define USB_USB_ALTMSK_REG_USB_M_RESET_Pos (6UL)                    /*!< USB_M_RESET (Bit 6)                                   */\n#define USB_USB_ALTMSK_REG_USB_M_RESET_Msk (0x40UL)                 /*!< USB_M_RESET (Bitfield-Mask: 0x01)                     */\n#define USB_USB_ALTMSK_REG_USB_M_SD5_Pos  (5UL)                     /*!< USB_M_SD5 (Bit 5)                                     */\n#define USB_USB_ALTMSK_REG_USB_M_SD5_Msk  (0x20UL)                  /*!< USB_M_SD5 (Bitfield-Mask: 0x01)                       */\n#define USB_USB_ALTMSK_REG_USB_M_SD3_Pos  (4UL)                     /*!< USB_M_SD3 (Bit 4)                                     */\n#define USB_USB_ALTMSK_REG_USB_M_SD3_Msk  (0x10UL)                  /*!< USB_M_SD3 (Bitfield-Mask: 0x01)                       */\n#define USB_USB_ALTMSK_REG_USB_M_EOP_Pos  (3UL)                     /*!< USB_M_EOP (Bit 3)                                     */\n#define USB_USB_ALTMSK_REG_USB_M_EOP_Msk  (0x8UL)                   /*!< USB_M_EOP (Bitfield-Mask: 0x01)                       */\n/* =================================================  USB_CHARGER_CTRL_REG  ================================================== */\n#define USB_USB_CHARGER_CTRL_REG_IDM_SINK_ON_Pos (5UL)              /*!< IDM_SINK_ON (Bit 5)                                   */\n#define USB_USB_CHARGER_CTRL_REG_IDM_SINK_ON_Msk (0x20UL)           /*!< IDM_SINK_ON (Bitfield-Mask: 0x01)                     */\n#define USB_USB_CHARGER_CTRL_REG_IDP_SINK_ON_Pos (4UL)              /*!< IDP_SINK_ON (Bit 4)                                   */\n#define USB_USB_CHARGER_CTRL_REG_IDP_SINK_ON_Msk (0x10UL)           /*!< IDP_SINK_ON (Bitfield-Mask: 0x01)                     */\n#define USB_USB_CHARGER_CTRL_REG_VDM_SRC_ON_Pos (3UL)               /*!< VDM_SRC_ON (Bit 3)                                    */\n#define USB_USB_CHARGER_CTRL_REG_VDM_SRC_ON_Msk (0x8UL)             /*!< VDM_SRC_ON (Bitfield-Mask: 0x01)                      */\n#define USB_USB_CHARGER_CTRL_REG_VDP_SRC_ON_Pos (2UL)               /*!< VDP_SRC_ON (Bit 2)                                    */\n#define USB_USB_CHARGER_CTRL_REG_VDP_SRC_ON_Msk (0x4UL)             /*!< VDP_SRC_ON (Bitfield-Mask: 0x01)                      */\n#define USB_USB_CHARGER_CTRL_REG_IDP_SRC_ON_Pos (1UL)               /*!< IDP_SRC_ON (Bit 1)                                    */\n#define USB_USB_CHARGER_CTRL_REG_IDP_SRC_ON_Msk (0x2UL)             /*!< IDP_SRC_ON (Bitfield-Mask: 0x01)                      */\n#define USB_USB_CHARGER_CTRL_REG_USB_CHARGE_ON_Pos (0UL)            /*!< USB_CHARGE_ON (Bit 0)                                 */\n#define USB_USB_CHARGER_CTRL_REG_USB_CHARGE_ON_Msk (0x1UL)          /*!< USB_CHARGE_ON (Bitfield-Mask: 0x01)                   */\n/* =================================================  USB_CHARGER_STAT_REG  ================================================== */\n#define USB_USB_CHARGER_STAT_REG_USB_DM_VAL2_Pos (5UL)              /*!< USB_DM_VAL2 (Bit 5)                                   */\n#define USB_USB_CHARGER_STAT_REG_USB_DM_VAL2_Msk (0x20UL)           /*!< USB_DM_VAL2 (Bitfield-Mask: 0x01)                     */\n#define USB_USB_CHARGER_STAT_REG_USB_DP_VAL2_Pos (4UL)              /*!< USB_DP_VAL2 (Bit 4)                                   */\n#define USB_USB_CHARGER_STAT_REG_USB_DP_VAL2_Msk (0x10UL)           /*!< USB_DP_VAL2 (Bitfield-Mask: 0x01)                     */\n#define USB_USB_CHARGER_STAT_REG_USB_DM_VAL_Pos (3UL)               /*!< USB_DM_VAL (Bit 3)                                    */\n#define USB_USB_CHARGER_STAT_REG_USB_DM_VAL_Msk (0x8UL)             /*!< USB_DM_VAL (Bitfield-Mask: 0x01)                      */\n#define USB_USB_CHARGER_STAT_REG_USB_DP_VAL_Pos (2UL)               /*!< USB_DP_VAL (Bit 2)                                    */\n#define USB_USB_CHARGER_STAT_REG_USB_DP_VAL_Msk (0x4UL)             /*!< USB_DP_VAL (Bitfield-Mask: 0x01)                      */\n#define USB_USB_CHARGER_STAT_REG_USB_CHG_DET_Pos (1UL)              /*!< USB_CHG_DET (Bit 1)                                   */\n#define USB_USB_CHARGER_STAT_REG_USB_CHG_DET_Msk (0x2UL)            /*!< USB_CHG_DET (Bitfield-Mask: 0x01)                     */\n#define USB_USB_CHARGER_STAT_REG_USB_DCP_DET_Pos (0UL)              /*!< USB_DCP_DET (Bit 0)                                   */\n#define USB_USB_CHARGER_STAT_REG_USB_DCP_DET_Msk (0x1UL)            /*!< USB_DCP_DET (Bitfield-Mask: 0x01)                     */\n/* ===================================================  USB_DMA_CTRL_REG  ==================================================== */\n#define USB_USB_DMA_CTRL_REG_USB_DMA_EN_Pos (6UL)                   /*!< USB_DMA_EN (Bit 6)                                    */\n#define USB_USB_DMA_CTRL_REG_USB_DMA_EN_Msk (0x40UL)                /*!< USB_DMA_EN (Bitfield-Mask: 0x01)                      */\n#define USB_USB_DMA_CTRL_REG_USB_DMA_TX_Pos (3UL)                   /*!< USB_DMA_TX (Bit 3)                                    */\n#define USB_USB_DMA_CTRL_REG_USB_DMA_TX_Msk (0x38UL)                /*!< USB_DMA_TX (Bitfield-Mask: 0x07)                      */\n#define USB_USB_DMA_CTRL_REG_USB_DMA_RX_Pos (0UL)                   /*!< USB_DMA_RX (Bit 0)                                    */\n#define USB_USB_DMA_CTRL_REG_USB_DMA_RX_Msk (0x7UL)                 /*!< USB_DMA_RX (Bitfield-Mask: 0x07)                      */\n/* ====================================================  USB_EP0_NAK_REG  ==================================================== */\n#define USB_USB_EP0_NAK_REG_USB_EP0_OUTNAK_Pos (1UL)                /*!< USB_EP0_OUTNAK (Bit 1)                                */\n#define USB_USB_EP0_NAK_REG_USB_EP0_OUTNAK_Msk (0x2UL)              /*!< USB_EP0_OUTNAK (Bitfield-Mask: 0x01)                  */\n#define USB_USB_EP0_NAK_REG_USB_EP0_INNAK_Pos (0UL)                 /*!< USB_EP0_INNAK (Bit 0)                                 */\n#define USB_USB_EP0_NAK_REG_USB_EP0_INNAK_Msk (0x1UL)               /*!< USB_EP0_INNAK (Bitfield-Mask: 0x01)                   */\n/* =====================================================  USB_EPC0_REG  ====================================================== */\n#define USB_USB_EPC0_REG_USB_STALL_Pos    (7UL)                     /*!< USB_STALL (Bit 7)                                     */\n#define USB_USB_EPC0_REG_USB_STALL_Msk    (0x80UL)                  /*!< USB_STALL (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC0_REG_USB_DEF_Pos      (6UL)                     /*!< USB_DEF (Bit 6)                                       */\n#define USB_USB_EPC0_REG_USB_DEF_Msk      (0x40UL)                  /*!< USB_DEF (Bitfield-Mask: 0x01)                         */\n#define USB_USB_EPC0_REG_USB_EP_Pos       (0UL)                     /*!< USB_EP (Bit 0)                                        */\n#define USB_USB_EPC0_REG_USB_EP_Msk       (0xfUL)                   /*!< USB_EP (Bitfield-Mask: 0x0f)                          */\n/* =====================================================  USB_EPC1_REG  ====================================================== */\n#define USB_USB_EPC1_REG_USB_STALL_Pos    (7UL)                     /*!< USB_STALL (Bit 7)                                     */\n#define USB_USB_EPC1_REG_USB_STALL_Msk    (0x80UL)                  /*!< USB_STALL (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC1_REG_USB_ISO_Pos      (5UL)                     /*!< USB_ISO (Bit 5)                                       */\n#define USB_USB_EPC1_REG_USB_ISO_Msk      (0x20UL)                  /*!< USB_ISO (Bitfield-Mask: 0x01)                         */\n#define USB_USB_EPC1_REG_USB_EP_EN_Pos    (4UL)                     /*!< USB_EP_EN (Bit 4)                                     */\n#define USB_USB_EPC1_REG_USB_EP_EN_Msk    (0x10UL)                  /*!< USB_EP_EN (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC1_REG_USB_EP_Pos       (0UL)                     /*!< USB_EP (Bit 0)                                        */\n#define USB_USB_EPC1_REG_USB_EP_Msk       (0xfUL)                   /*!< USB_EP (Bitfield-Mask: 0x0f)                          */\n/* =====================================================  USB_EPC2_REG  ====================================================== */\n#define USB_USB_EPC2_REG_USB_STALL_Pos    (7UL)                     /*!< USB_STALL (Bit 7)                                     */\n#define USB_USB_EPC2_REG_USB_STALL_Msk    (0x80UL)                  /*!< USB_STALL (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC2_REG_USB_ISO_Pos      (5UL)                     /*!< USB_ISO (Bit 5)                                       */\n#define USB_USB_EPC2_REG_USB_ISO_Msk      (0x20UL)                  /*!< USB_ISO (Bitfield-Mask: 0x01)                         */\n#define USB_USB_EPC2_REG_USB_EP_EN_Pos    (4UL)                     /*!< USB_EP_EN (Bit 4)                                     */\n#define USB_USB_EPC2_REG_USB_EP_EN_Msk    (0x10UL)                  /*!< USB_EP_EN (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC2_REG_USB_EP_Pos       (0UL)                     /*!< USB_EP (Bit 0)                                        */\n#define USB_USB_EPC2_REG_USB_EP_Msk       (0xfUL)                   /*!< USB_EP (Bitfield-Mask: 0x0f)                          */\n/* =====================================================  USB_EPC3_REG  ====================================================== */\n#define USB_USB_EPC3_REG_USB_STALL_Pos    (7UL)                     /*!< USB_STALL (Bit 7)                                     */\n#define USB_USB_EPC3_REG_USB_STALL_Msk    (0x80UL)                  /*!< USB_STALL (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC3_REG_USB_ISO_Pos      (5UL)                     /*!< USB_ISO (Bit 5)                                       */\n#define USB_USB_EPC3_REG_USB_ISO_Msk      (0x20UL)                  /*!< USB_ISO (Bitfield-Mask: 0x01)                         */\n#define USB_USB_EPC3_REG_USB_EP_EN_Pos    (4UL)                     /*!< USB_EP_EN (Bit 4)                                     */\n#define USB_USB_EPC3_REG_USB_EP_EN_Msk    (0x10UL)                  /*!< USB_EP_EN (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC3_REG_USB_EP_Pos       (0UL)                     /*!< USB_EP (Bit 0)                                        */\n#define USB_USB_EPC3_REG_USB_EP_Msk       (0xfUL)                   /*!< USB_EP (Bitfield-Mask: 0x0f)                          */\n/* =====================================================  USB_EPC4_REG  ====================================================== */\n#define USB_USB_EPC4_REG_USB_STALL_Pos    (7UL)                     /*!< USB_STALL (Bit 7)                                     */\n#define USB_USB_EPC4_REG_USB_STALL_Msk    (0x80UL)                  /*!< USB_STALL (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC4_REG_USB_ISO_Pos      (5UL)                     /*!< USB_ISO (Bit 5)                                       */\n#define USB_USB_EPC4_REG_USB_ISO_Msk      (0x20UL)                  /*!< USB_ISO (Bitfield-Mask: 0x01)                         */\n#define USB_USB_EPC4_REG_USB_EP_EN_Pos    (4UL)                     /*!< USB_EP_EN (Bit 4)                                     */\n#define USB_USB_EPC4_REG_USB_EP_EN_Msk    (0x10UL)                  /*!< USB_EP_EN (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC4_REG_USB_EP_Pos       (0UL)                     /*!< USB_EP (Bit 0)                                        */\n#define USB_USB_EPC4_REG_USB_EP_Msk       (0xfUL)                   /*!< USB_EP (Bitfield-Mask: 0x0f)                          */\n/* =====================================================  USB_EPC5_REG  ====================================================== */\n#define USB_USB_EPC5_REG_USB_STALL_Pos    (7UL)                     /*!< USB_STALL (Bit 7)                                     */\n#define USB_USB_EPC5_REG_USB_STALL_Msk    (0x80UL)                  /*!< USB_STALL (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC5_REG_USB_ISO_Pos      (5UL)                     /*!< USB_ISO (Bit 5)                                       */\n#define USB_USB_EPC5_REG_USB_ISO_Msk      (0x20UL)                  /*!< USB_ISO (Bitfield-Mask: 0x01)                         */\n#define USB_USB_EPC5_REG_USB_EP_EN_Pos    (4UL)                     /*!< USB_EP_EN (Bit 4)                                     */\n#define USB_USB_EPC5_REG_USB_EP_EN_Msk    (0x10UL)                  /*!< USB_EP_EN (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC5_REG_USB_EP_Pos       (0UL)                     /*!< USB_EP (Bit 0)                                        */\n#define USB_USB_EPC5_REG_USB_EP_Msk       (0xfUL)                   /*!< USB_EP (Bitfield-Mask: 0x0f)                          */\n/* =====================================================  USB_EPC6_REG  ====================================================== */\n#define USB_USB_EPC6_REG_USB_STALL_Pos    (7UL)                     /*!< USB_STALL (Bit 7)                                     */\n#define USB_USB_EPC6_REG_USB_STALL_Msk    (0x80UL)                  /*!< USB_STALL (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC6_REG_USB_ISO_Pos      (5UL)                     /*!< USB_ISO (Bit 5)                                       */\n#define USB_USB_EPC6_REG_USB_ISO_Msk      (0x20UL)                  /*!< USB_ISO (Bitfield-Mask: 0x01)                         */\n#define USB_USB_EPC6_REG_USB_EP_EN_Pos    (4UL)                     /*!< USB_EP_EN (Bit 4)                                     */\n#define USB_USB_EPC6_REG_USB_EP_EN_Msk    (0x10UL)                  /*!< USB_EP_EN (Bitfield-Mask: 0x01)                       */\n#define USB_USB_EPC6_REG_USB_EP_Pos       (0UL)                     /*!< USB_EP (Bit 0)                                        */\n#define USB_USB_EPC6_REG_USB_EP_Msk       (0xfUL)                   /*!< USB_EP (Bitfield-Mask: 0x0f)                          */\n/* ======================================================  USB_FAR_REG  ====================================================== */\n#define USB_USB_FAR_REG_USB_AD_EN_Pos     (7UL)                     /*!< USB_AD_EN (Bit 7)                                     */\n#define USB_USB_FAR_REG_USB_AD_EN_Msk     (0x80UL)                  /*!< USB_AD_EN (Bitfield-Mask: 0x01)                       */\n#define USB_USB_FAR_REG_USB_AD_Pos        (0UL)                     /*!< USB_AD (Bit 0)                                        */\n#define USB_USB_FAR_REG_USB_AD_Msk        (0x7fUL)                  /*!< USB_AD (Bitfield-Mask: 0x7f)                          */\n/* ======================================================  USB_FNH_REG  ====================================================== */\n#define USB_USB_FNH_REG_USB_MF_Pos        (7UL)                     /*!< USB_MF (Bit 7)                                        */\n#define USB_USB_FNH_REG_USB_MF_Msk        (0x80UL)                  /*!< USB_MF (Bitfield-Mask: 0x01)                          */\n#define USB_USB_FNH_REG_USB_UL_Pos        (6UL)                     /*!< USB_UL (Bit 6)                                        */\n#define USB_USB_FNH_REG_USB_UL_Msk        (0x40UL)                  /*!< USB_UL (Bitfield-Mask: 0x01)                          */\n#define USB_USB_FNH_REG_USB_RFC_Pos       (5UL)                     /*!< USB_RFC (Bit 5)                                       */\n#define USB_USB_FNH_REG_USB_RFC_Msk       (0x20UL)                  /*!< USB_RFC (Bitfield-Mask: 0x01)                         */\n#define USB_USB_FNH_REG_USB_FN_10_8_Pos   (0UL)                     /*!< USB_FN_10_8 (Bit 0)                                   */\n#define USB_USB_FNH_REG_USB_FN_10_8_Msk   (0x7UL)                   /*!< USB_FN_10_8 (Bitfield-Mask: 0x07)                     */\n/* ======================================================  USB_FNL_REG  ====================================================== */\n#define USB_USB_FNL_REG_USB_FN_Pos        (0UL)                     /*!< USB_FN (Bit 0)                                        */\n#define USB_USB_FNL_REG_USB_FN_Msk        (0xffUL)                  /*!< USB_FN (Bitfield-Mask: 0xff)                          */\n/* =====================================================  USB_FWEV_REG  ====================================================== */\n#define USB_USB_FWEV_REG_USB_RXWARN31_Pos (4UL)                     /*!< USB_RXWARN31 (Bit 4)                                  */\n#define USB_USB_FWEV_REG_USB_RXWARN31_Msk (0x70UL)                  /*!< USB_RXWARN31 (Bitfield-Mask: 0x07)                    */\n#define USB_USB_FWEV_REG_USB_TXWARN31_Pos (0UL)                     /*!< USB_TXWARN31 (Bit 0)                                  */\n#define USB_USB_FWEV_REG_USB_TXWARN31_Msk (0x7UL)                   /*!< USB_TXWARN31 (Bitfield-Mask: 0x07)                    */\n/* =====================================================  USB_FWMSK_REG  ===================================================== */\n#define USB_USB_FWMSK_REG_USB_M_RXWARN31_Pos (4UL)                  /*!< USB_M_RXWARN31 (Bit 4)                                */\n#define USB_USB_FWMSK_REG_USB_M_RXWARN31_Msk (0x70UL)               /*!< USB_M_RXWARN31 (Bitfield-Mask: 0x07)                  */\n#define USB_USB_FWMSK_REG_USB_M_TXWARN31_Pos (0UL)                  /*!< USB_M_TXWARN31 (Bit 0)                                */\n#define USB_USB_FWMSK_REG_USB_M_TXWARN31_Msk (0x7UL)                /*!< USB_M_TXWARN31 (Bitfield-Mask: 0x07)                  */\n/* =====================================================  USB_MAEV_REG  ====================================================== */\n#define USB_USB_MAEV_REG_USB_CH_EV_Pos    (11UL)                    /*!< USB_CH_EV (Bit 11)                                    */\n#define USB_USB_MAEV_REG_USB_CH_EV_Msk    (0x800UL)                 /*!< USB_CH_EV (Bitfield-Mask: 0x01)                       */\n#define USB_USB_MAEV_REG_USB_EP0_NAK_Pos  (10UL)                    /*!< USB_EP0_NAK (Bit 10)                                  */\n#define USB_USB_MAEV_REG_USB_EP0_NAK_Msk  (0x400UL)                 /*!< USB_EP0_NAK (Bitfield-Mask: 0x01)                     */\n#define USB_USB_MAEV_REG_USB_EP0_RX_Pos   (9UL)                     /*!< USB_EP0_RX (Bit 9)                                    */\n#define USB_USB_MAEV_REG_USB_EP0_RX_Msk   (0x200UL)                 /*!< USB_EP0_RX (Bitfield-Mask: 0x01)                      */\n#define USB_USB_MAEV_REG_USB_EP0_TX_Pos   (8UL)                     /*!< USB_EP0_TX (Bit 8)                                    */\n#define USB_USB_MAEV_REG_USB_EP0_TX_Msk   (0x100UL)                 /*!< USB_EP0_TX (Bitfield-Mask: 0x01)                      */\n#define USB_USB_MAEV_REG_USB_INTR_Pos     (7UL)                     /*!< USB_INTR (Bit 7)                                      */\n#define USB_USB_MAEV_REG_USB_INTR_Msk     (0x80UL)                  /*!< USB_INTR (Bitfield-Mask: 0x01)                        */\n#define USB_USB_MAEV_REG_USB_RX_EV_Pos    (6UL)                     /*!< USB_RX_EV (Bit 6)                                     */\n#define USB_USB_MAEV_REG_USB_RX_EV_Msk    (0x40UL)                  /*!< USB_RX_EV (Bitfield-Mask: 0x01)                       */\n#define USB_USB_MAEV_REG_USB_ULD_Pos      (5UL)                     /*!< USB_ULD (Bit 5)                                       */\n#define USB_USB_MAEV_REG_USB_ULD_Msk      (0x20UL)                  /*!< USB_ULD (Bitfield-Mask: 0x01)                         */\n#define USB_USB_MAEV_REG_USB_NAK_Pos      (4UL)                     /*!< USB_NAK (Bit 4)                                       */\n#define USB_USB_MAEV_REG_USB_NAK_Msk      (0x10UL)                  /*!< USB_NAK (Bitfield-Mask: 0x01)                         */\n#define USB_USB_MAEV_REG_USB_FRAME_Pos    (3UL)                     /*!< USB_FRAME (Bit 3)                                     */\n#define USB_USB_MAEV_REG_USB_FRAME_Msk    (0x8UL)                   /*!< USB_FRAME (Bitfield-Mask: 0x01)                       */\n#define USB_USB_MAEV_REG_USB_TX_EV_Pos    (2UL)                     /*!< USB_TX_EV (Bit 2)                                     */\n#define USB_USB_MAEV_REG_USB_TX_EV_Msk    (0x4UL)                   /*!< USB_TX_EV (Bitfield-Mask: 0x01)                       */\n#define USB_USB_MAEV_REG_USB_ALT_Pos      (1UL)                     /*!< USB_ALT (Bit 1)                                       */\n#define USB_USB_MAEV_REG_USB_ALT_Msk      (0x2UL)                   /*!< USB_ALT (Bitfield-Mask: 0x01)                         */\n#define USB_USB_MAEV_REG_USB_WARN_Pos     (0UL)                     /*!< USB_WARN (Bit 0)                                      */\n#define USB_USB_MAEV_REG_USB_WARN_Msk     (0x1UL)                   /*!< USB_WARN (Bitfield-Mask: 0x01)                        */\n/* =====================================================  USB_MAMSK_REG  ===================================================== */\n#define USB_USB_MAMSK_REG_USB_M_CH_EV_Pos (11UL)                    /*!< USB_M_CH_EV (Bit 11)                                  */\n#define USB_USB_MAMSK_REG_USB_M_CH_EV_Msk (0x800UL)                 /*!< USB_M_CH_EV (Bitfield-Mask: 0x01)                     */\n#define USB_USB_MAMSK_REG_USB_M_EP0_NAK_Pos (10UL)                  /*!< USB_M_EP0_NAK (Bit 10)                                */\n#define USB_USB_MAMSK_REG_USB_M_EP0_NAK_Msk (0x400UL)               /*!< USB_M_EP0_NAK (Bitfield-Mask: 0x01)                   */\n#define USB_USB_MAMSK_REG_USB_M_EP0_RX_Pos (9UL)                    /*!< USB_M_EP0_RX (Bit 9)                                  */\n#define USB_USB_MAMSK_REG_USB_M_EP0_RX_Msk (0x200UL)                /*!< USB_M_EP0_RX (Bitfield-Mask: 0x01)                    */\n#define USB_USB_MAMSK_REG_USB_M_EP0_TX_Pos (8UL)                    /*!< USB_M_EP0_TX (Bit 8)                                  */\n#define USB_USB_MAMSK_REG_USB_M_EP0_TX_Msk (0x100UL)                /*!< USB_M_EP0_TX (Bitfield-Mask: 0x01)                    */\n#define USB_USB_MAMSK_REG_USB_M_INTR_Pos  (7UL)                     /*!< USB_M_INTR (Bit 7)                                    */\n#define USB_USB_MAMSK_REG_USB_M_INTR_Msk  (0x80UL)                  /*!< USB_M_INTR (Bitfield-Mask: 0x01)                      */\n#define USB_USB_MAMSK_REG_USB_M_RX_EV_Pos (6UL)                     /*!< USB_M_RX_EV (Bit 6)                                   */\n#define USB_USB_MAMSK_REG_USB_M_RX_EV_Msk (0x40UL)                  /*!< USB_M_RX_EV (Bitfield-Mask: 0x01)                     */\n#define USB_USB_MAMSK_REG_USB_M_ULD_Pos   (5UL)                     /*!< USB_M_ULD (Bit 5)                                     */\n#define USB_USB_MAMSK_REG_USB_M_ULD_Msk   (0x20UL)                  /*!< USB_M_ULD (Bitfield-Mask: 0x01)                       */\n#define USB_USB_MAMSK_REG_USB_M_NAK_Pos   (4UL)                     /*!< USB_M_NAK (Bit 4)                                     */\n#define USB_USB_MAMSK_REG_USB_M_NAK_Msk   (0x10UL)                  /*!< USB_M_NAK (Bitfield-Mask: 0x01)                       */\n#define USB_USB_MAMSK_REG_USB_M_FRAME_Pos (3UL)                     /*!< USB_M_FRAME (Bit 3)                                   */\n#define USB_USB_MAMSK_REG_USB_M_FRAME_Msk (0x8UL)                   /*!< USB_M_FRAME (Bitfield-Mask: 0x01)                     */\n#define USB_USB_MAMSK_REG_USB_M_TX_EV_Pos (2UL)                     /*!< USB_M_TX_EV (Bit 2)                                   */\n#define USB_USB_MAMSK_REG_USB_M_TX_EV_Msk (0x4UL)                   /*!< USB_M_TX_EV (Bitfield-Mask: 0x01)                     */\n#define USB_USB_MAMSK_REG_USB_M_ALT_Pos   (1UL)                     /*!< USB_M_ALT (Bit 1)                                     */\n#define USB_USB_MAMSK_REG_USB_M_ALT_Msk   (0x2UL)                   /*!< USB_M_ALT (Bitfield-Mask: 0x01)                       */\n#define USB_USB_MAMSK_REG_USB_M_WARN_Pos  (0UL)                     /*!< USB_M_WARN (Bit 0)                                    */\n#define USB_USB_MAMSK_REG_USB_M_WARN_Msk  (0x1UL)                   /*!< USB_M_WARN (Bitfield-Mask: 0x01)                      */\n/* =====================================================  USB_MCTRL_REG  ===================================================== */\n#define USB_USB_MCTRL_REG_LSMODE_Pos      (4UL)                     /*!< LSMODE (Bit 4)                                        */\n#define USB_USB_MCTRL_REG_LSMODE_Msk      (0x10UL)                  /*!< LSMODE (Bitfield-Mask: 0x01)                          */\n#define USB_USB_MCTRL_REG_USB_NAT_Pos     (3UL)                     /*!< USB_NAT (Bit 3)                                       */\n#define USB_USB_MCTRL_REG_USB_NAT_Msk     (0x8UL)                   /*!< USB_NAT (Bitfield-Mask: 0x01)                         */\n#define USB_USB_MCTRL_REG_USB_DBG_Pos     (1UL)                     /*!< USB_DBG (Bit 1)                                       */\n#define USB_USB_MCTRL_REG_USB_DBG_Msk     (0x2UL)                   /*!< USB_DBG (Bitfield-Mask: 0x01)                         */\n#define USB_USB_MCTRL_REG_USBEN_Pos       (0UL)                     /*!< USBEN (Bit 0)                                         */\n#define USB_USB_MCTRL_REG_USBEN_Msk       (0x1UL)                   /*!< USBEN (Bitfield-Mask: 0x01)                           */\n/* =====================================================  USB_NAKEV_REG  ===================================================== */\n#define USB_USB_NAKEV_REG_USB_OUT31_Pos   (4UL)                     /*!< USB_OUT31 (Bit 4)                                     */\n#define USB_USB_NAKEV_REG_USB_OUT31_Msk   (0x70UL)                  /*!< USB_OUT31 (Bitfield-Mask: 0x07)                       */\n#define USB_USB_NAKEV_REG_USB_IN31_Pos    (0UL)                     /*!< USB_IN31 (Bit 0)                                      */\n#define USB_USB_NAKEV_REG_USB_IN31_Msk    (0x7UL)                   /*!< USB_IN31 (Bitfield-Mask: 0x07)                        */\n/* ====================================================  USB_NAKMSK_REG  ===================================================== */\n#define USB_USB_NAKMSK_REG_USB_M_OUT31_Pos (4UL)                    /*!< USB_M_OUT31 (Bit 4)                                   */\n#define USB_USB_NAKMSK_REG_USB_M_OUT31_Msk (0x70UL)                 /*!< USB_M_OUT31 (Bitfield-Mask: 0x07)                     */\n#define USB_USB_NAKMSK_REG_USB_M_IN31_Pos (0UL)                     /*!< USB_M_IN31 (Bit 0)                                    */\n#define USB_USB_NAKMSK_REG_USB_M_IN31_Msk (0x7UL)                   /*!< USB_M_IN31 (Bitfield-Mask: 0x07)                      */\n/* =====================================================  USB_NFSR_REG  ====================================================== */\n#define USB_USB_NFSR_REG_USB_NFS_Pos      (0UL)                     /*!< USB_NFS (Bit 0)                                       */\n#define USB_USB_NFSR_REG_USB_NFS_Msk      (0x3UL)                   /*!< USB_NFS (Bitfield-Mask: 0x03)                         */\n/* =====================================================  USB_RXC0_REG  ====================================================== */\n#define USB_USB_RXC0_REG_USB_FLUSH_Pos    (3UL)                     /*!< USB_FLUSH (Bit 3)                                     */\n#define USB_USB_RXC0_REG_USB_FLUSH_Msk    (0x8UL)                   /*!< USB_FLUSH (Bitfield-Mask: 0x01)                       */\n#define USB_USB_RXC0_REG_USB_IGN_SETUP_Pos (2UL)                    /*!< USB_IGN_SETUP (Bit 2)                                 */\n#define USB_USB_RXC0_REG_USB_IGN_SETUP_Msk (0x4UL)                  /*!< USB_IGN_SETUP (Bitfield-Mask: 0x01)                   */\n#define USB_USB_RXC0_REG_USB_IGN_OUT_Pos  (1UL)                     /*!< USB_IGN_OUT (Bit 1)                                   */\n#define USB_USB_RXC0_REG_USB_IGN_OUT_Msk  (0x2UL)                   /*!< USB_IGN_OUT (Bitfield-Mask: 0x01)                     */\n#define USB_USB_RXC0_REG_USB_RX_EN_Pos    (0UL)                     /*!< USB_RX_EN (Bit 0)                                     */\n#define USB_USB_RXC0_REG_USB_RX_EN_Msk    (0x1UL)                   /*!< USB_RX_EN (Bitfield-Mask: 0x01)                       */\n/* =====================================================  USB_RXC1_REG  ====================================================== */\n#define USB_USB_RXC1_REG_USB_RFWL_Pos     (5UL)                     /*!< USB_RFWL (Bit 5)                                      */\n#define USB_USB_RXC1_REG_USB_RFWL_Msk     (0x60UL)                  /*!< USB_RFWL (Bitfield-Mask: 0x03)                        */\n#define USB_USB_RXC1_REG_USB_FLUSH_Pos    (3UL)                     /*!< USB_FLUSH (Bit 3)                                     */\n#define USB_USB_RXC1_REG_USB_FLUSH_Msk    (0x8UL)                   /*!< USB_FLUSH (Bitfield-Mask: 0x01)                       */\n#define USB_USB_RXC1_REG_USB_IGN_SETUP_Pos (2UL)                    /*!< USB_IGN_SETUP (Bit 2)                                 */\n#define USB_USB_RXC1_REG_USB_IGN_SETUP_Msk (0x4UL)                  /*!< USB_IGN_SETUP (Bitfield-Mask: 0x01)                   */\n#define USB_USB_RXC1_REG_USB_RX_EN_Pos    (0UL)                     /*!< USB_RX_EN (Bit 0)                                     */\n#define USB_USB_RXC1_REG_USB_RX_EN_Msk    (0x1UL)                   /*!< USB_RX_EN (Bitfield-Mask: 0x01)                       */\n/* =====================================================  USB_RXC2_REG  ====================================================== */\n#define USB_USB_RXC2_REG_USB_RFWL_Pos     (5UL)                     /*!< USB_RFWL (Bit 5)                                      */\n#define USB_USB_RXC2_REG_USB_RFWL_Msk     (0x60UL)                  /*!< USB_RFWL (Bitfield-Mask: 0x03)                        */\n#define USB_USB_RXC2_REG_USB_FLUSH_Pos    (3UL)                     /*!< USB_FLUSH (Bit 3)                                     */\n#define USB_USB_RXC2_REG_USB_FLUSH_Msk    (0x8UL)                   /*!< USB_FLUSH (Bitfield-Mask: 0x01)                       */\n#define USB_USB_RXC2_REG_USB_IGN_SETUP_Pos (2UL)                    /*!< USB_IGN_SETUP (Bit 2)                                 */\n#define USB_USB_RXC2_REG_USB_IGN_SETUP_Msk (0x4UL)                  /*!< USB_IGN_SETUP (Bitfield-Mask: 0x01)                   */\n#define USB_USB_RXC2_REG_USB_RX_EN_Pos    (0UL)                     /*!< USB_RX_EN (Bit 0)                                     */\n#define USB_USB_RXC2_REG_USB_RX_EN_Msk    (0x1UL)                   /*!< USB_RX_EN (Bitfield-Mask: 0x01)                       */\n/* =====================================================  USB_RXC3_REG  ====================================================== */\n#define USB_USB_RXC3_REG_USB_RFWL_Pos     (5UL)                     /*!< USB_RFWL (Bit 5)                                      */\n#define USB_USB_RXC3_REG_USB_RFWL_Msk     (0x60UL)                  /*!< USB_RFWL (Bitfield-Mask: 0x03)                        */\n#define USB_USB_RXC3_REG_USB_FLUSH_Pos    (3UL)                     /*!< USB_FLUSH (Bit 3)                                     */\n#define USB_USB_RXC3_REG_USB_FLUSH_Msk    (0x8UL)                   /*!< USB_FLUSH (Bitfield-Mask: 0x01)                       */\n#define USB_USB_RXC3_REG_USB_IGN_SETUP_Pos (2UL)                    /*!< USB_IGN_SETUP (Bit 2)                                 */\n#define USB_USB_RXC3_REG_USB_IGN_SETUP_Msk (0x4UL)                  /*!< USB_IGN_SETUP (Bitfield-Mask: 0x01)                   */\n#define USB_USB_RXC3_REG_USB_RX_EN_Pos    (0UL)                     /*!< USB_RX_EN (Bit 0)                                     */\n#define USB_USB_RXC3_REG_USB_RX_EN_Msk    (0x1UL)                   /*!< USB_RX_EN (Bitfield-Mask: 0x01)                       */\n/* =====================================================  USB_RXD0_REG  ====================================================== */\n#define USB_USB_RXD0_REG_USB_RXFD_Pos     (0UL)                     /*!< USB_RXFD (Bit 0)                                      */\n#define USB_USB_RXD0_REG_USB_RXFD_Msk     (0xffUL)                  /*!< USB_RXFD (Bitfield-Mask: 0xff)                        */\n/* =====================================================  USB_RXD1_REG  ====================================================== */\n#define USB_USB_RXD1_REG_USB_RXFD_Pos     (0UL)                     /*!< USB_RXFD (Bit 0)                                      */\n#define USB_USB_RXD1_REG_USB_RXFD_Msk     (0xffUL)                  /*!< USB_RXFD (Bitfield-Mask: 0xff)                        */\n/* =====================================================  USB_RXD2_REG  ====================================================== */\n#define USB_USB_RXD2_REG_USB_RXFD_Pos     (0UL)                     /*!< USB_RXFD (Bit 0)                                      */\n#define USB_USB_RXD2_REG_USB_RXFD_Msk     (0xffUL)                  /*!< USB_RXFD (Bitfield-Mask: 0xff)                        */\n/* =====================================================  USB_RXD3_REG  ====================================================== */\n#define USB_USB_RXD3_REG_USB_RXFD_Pos     (0UL)                     /*!< USB_RXFD (Bit 0)                                      */\n#define USB_USB_RXD3_REG_USB_RXFD_Msk     (0xffUL)                  /*!< USB_RXFD (Bitfield-Mask: 0xff)                        */\n/* =====================================================  USB_RXEV_REG  ====================================================== */\n#define USB_USB_RXEV_REG_USB_RXOVRRN31_Pos (4UL)                    /*!< USB_RXOVRRN31 (Bit 4)                                 */\n#define USB_USB_RXEV_REG_USB_RXOVRRN31_Msk (0x70UL)                 /*!< USB_RXOVRRN31 (Bitfield-Mask: 0x07)                   */\n#define USB_USB_RXEV_REG_USB_RXFIFO31_Pos (0UL)                     /*!< USB_RXFIFO31 (Bit 0)                                  */\n#define USB_USB_RXEV_REG_USB_RXFIFO31_Msk (0x7UL)                   /*!< USB_RXFIFO31 (Bitfield-Mask: 0x07)                    */\n/* =====================================================  USB_RXMSK_REG  ===================================================== */\n#define USB_USB_RXMSK_REG_USB_M_RXOVRRN31_Pos (4UL)                 /*!< USB_M_RXOVRRN31 (Bit 4)                               */\n#define USB_USB_RXMSK_REG_USB_M_RXOVRRN31_Msk (0x70UL)              /*!< USB_M_RXOVRRN31 (Bitfield-Mask: 0x07)                 */\n#define USB_USB_RXMSK_REG_USB_M_RXFIFO31_Pos (0UL)                  /*!< USB_M_RXFIFO31 (Bit 0)                                */\n#define USB_USB_RXMSK_REG_USB_M_RXFIFO31_Msk (0x7UL)                /*!< USB_M_RXFIFO31 (Bitfield-Mask: 0x07)                  */\n/* =====================================================  USB_RXS0_REG  ====================================================== */\n#define USB_USB_RXS0_REG_USB_SETUP_Pos    (6UL)                     /*!< USB_SETUP (Bit 6)                                     */\n#define USB_USB_RXS0_REG_USB_SETUP_Msk    (0x40UL)                  /*!< USB_SETUP (Bitfield-Mask: 0x01)                       */\n#define USB_USB_RXS0_REG_USB_TOGGLE_RX0_Pos (5UL)                   /*!< USB_TOGGLE_RX0 (Bit 5)                                */\n#define USB_USB_RXS0_REG_USB_TOGGLE_RX0_Msk (0x20UL)                /*!< USB_TOGGLE_RX0 (Bitfield-Mask: 0x01)                  */\n#define USB_USB_RXS0_REG_USB_RX_LAST_Pos  (4UL)                     /*!< USB_RX_LAST (Bit 4)                                   */\n#define USB_USB_RXS0_REG_USB_RX_LAST_Msk  (0x10UL)                  /*!< USB_RX_LAST (Bitfield-Mask: 0x01)                     */\n#define USB_USB_RXS0_REG_USB_RCOUNT_Pos   (0UL)                     /*!< USB_RCOUNT (Bit 0)                                    */\n#define USB_USB_RXS0_REG_USB_RCOUNT_Msk   (0xfUL)                   /*!< USB_RCOUNT (Bitfield-Mask: 0x0f)                      */\n/* =====================================================  USB_RXS1_REG  ====================================================== */\n#define USB_USB_RXS1_REG_USB_RXCOUNT_Pos  (8UL)                     /*!< USB_RXCOUNT (Bit 8)                                   */\n#define USB_USB_RXS1_REG_USB_RXCOUNT_Msk  (0x7f00UL)                /*!< USB_RXCOUNT (Bitfield-Mask: 0x7f)                     */\n#define USB_USB_RXS1_REG_USB_RX_ERR_Pos   (7UL)                     /*!< USB_RX_ERR (Bit 7)                                    */\n#define USB_USB_RXS1_REG_USB_RX_ERR_Msk   (0x80UL)                  /*!< USB_RX_ERR (Bitfield-Mask: 0x01)                      */\n#define USB_USB_RXS1_REG_USB_SETUP_Pos    (6UL)                     /*!< USB_SETUP (Bit 6)                                     */\n#define USB_USB_RXS1_REG_USB_SETUP_Msk    (0x40UL)                  /*!< USB_SETUP (Bitfield-Mask: 0x01)                       */\n#define USB_USB_RXS1_REG_USB_TOGGLE_RX_Pos (5UL)                    /*!< USB_TOGGLE_RX (Bit 5)                                 */\n#define USB_USB_RXS1_REG_USB_TOGGLE_RX_Msk (0x20UL)                 /*!< USB_TOGGLE_RX (Bitfield-Mask: 0x01)                   */\n#define USB_USB_RXS1_REG_USB_RX_LAST_Pos  (4UL)                     /*!< USB_RX_LAST (Bit 4)                                   */\n#define USB_USB_RXS1_REG_USB_RX_LAST_Msk  (0x10UL)                  /*!< USB_RX_LAST (Bitfield-Mask: 0x01)                     */\n#define USB_USB_RXS1_REG_USB_RCOUNT_Pos   (0UL)                     /*!< USB_RCOUNT (Bit 0)                                    */\n#define USB_USB_RXS1_REG_USB_RCOUNT_Msk   (0xfUL)                   /*!< USB_RCOUNT (Bitfield-Mask: 0x0f)                      */\n/* =====================================================  USB_RXS2_REG  ====================================================== */\n#define USB_USB_RXS2_REG_USB_RXCOUNT_Pos  (8UL)                     /*!< USB_RXCOUNT (Bit 8)                                   */\n#define USB_USB_RXS2_REG_USB_RXCOUNT_Msk  (0x7f00UL)                /*!< USB_RXCOUNT (Bitfield-Mask: 0x7f)                     */\n#define USB_USB_RXS2_REG_USB_RX_ERR_Pos   (7UL)                     /*!< USB_RX_ERR (Bit 7)                                    */\n#define USB_USB_RXS2_REG_USB_RX_ERR_Msk   (0x80UL)                  /*!< USB_RX_ERR (Bitfield-Mask: 0x01)                      */\n#define USB_USB_RXS2_REG_USB_SETUP_Pos    (6UL)                     /*!< USB_SETUP (Bit 6)                                     */\n#define USB_USB_RXS2_REG_USB_SETUP_Msk    (0x40UL)                  /*!< USB_SETUP (Bitfield-Mask: 0x01)                       */\n#define USB_USB_RXS2_REG_USB_TOGGLE_RX_Pos (5UL)                    /*!< USB_TOGGLE_RX (Bit 5)                                 */\n#define USB_USB_RXS2_REG_USB_TOGGLE_RX_Msk (0x20UL)                 /*!< USB_TOGGLE_RX (Bitfield-Mask: 0x01)                   */\n#define USB_USB_RXS2_REG_USB_RX_LAST_Pos  (4UL)                     /*!< USB_RX_LAST (Bit 4)                                   */\n#define USB_USB_RXS2_REG_USB_RX_LAST_Msk  (0x10UL)                  /*!< USB_RX_LAST (Bitfield-Mask: 0x01)                     */\n#define USB_USB_RXS2_REG_USB_RCOUNT_Pos   (0UL)                     /*!< USB_RCOUNT (Bit 0)                                    */\n#define USB_USB_RXS2_REG_USB_RCOUNT_Msk   (0xfUL)                   /*!< USB_RCOUNT (Bitfield-Mask: 0x0f)                      */\n/* =====================================================  USB_RXS3_REG  ====================================================== */\n#define USB_USB_RXS3_REG_USB_RXCOUNT_Pos  (8UL)                     /*!< USB_RXCOUNT (Bit 8)                                   */\n#define USB_USB_RXS3_REG_USB_RXCOUNT_Msk  (0x7f00UL)                /*!< USB_RXCOUNT (Bitfield-Mask: 0x7f)                     */\n#define USB_USB_RXS3_REG_USB_RX_ERR_Pos   (7UL)                     /*!< USB_RX_ERR (Bit 7)                                    */\n#define USB_USB_RXS3_REG_USB_RX_ERR_Msk   (0x80UL)                  /*!< USB_RX_ERR (Bitfield-Mask: 0x01)                      */\n#define USB_USB_RXS3_REG_USB_SETUP_Pos    (6UL)                     /*!< USB_SETUP (Bit 6)                                     */\n#define USB_USB_RXS3_REG_USB_SETUP_Msk    (0x40UL)                  /*!< USB_SETUP (Bitfield-Mask: 0x01)                       */\n#define USB_USB_RXS3_REG_USB_TOGGLE_RX_Pos (5UL)                    /*!< USB_TOGGLE_RX (Bit 5)                                 */\n#define USB_USB_RXS3_REG_USB_TOGGLE_RX_Msk (0x20UL)                 /*!< USB_TOGGLE_RX (Bitfield-Mask: 0x01)                   */\n#define USB_USB_RXS3_REG_USB_RX_LAST_Pos  (4UL)                     /*!< USB_RX_LAST (Bit 4)                                   */\n#define USB_USB_RXS3_REG_USB_RX_LAST_Msk  (0x10UL)                  /*!< USB_RX_LAST (Bitfield-Mask: 0x01)                     */\n#define USB_USB_RXS3_REG_USB_RCOUNT_Pos   (0UL)                     /*!< USB_RCOUNT (Bit 0)                                    */\n#define USB_USB_RXS3_REG_USB_RCOUNT_Msk   (0xfUL)                   /*!< USB_RCOUNT (Bitfield-Mask: 0x0f)                      */\n/* ======================================================  USB_TCR_REG  ====================================================== */\n#define USB_USB_TCR_REG_USB_VADJ_Pos      (5UL)                     /*!< USB_VADJ (Bit 5)                                      */\n#define USB_USB_TCR_REG_USB_VADJ_Msk      (0xe0UL)                  /*!< USB_VADJ (Bitfield-Mask: 0x07)                        */\n#define USB_USB_TCR_REG_USB_CADJ_Pos      (0UL)                     /*!< USB_CADJ (Bit 0)                                      */\n#define USB_USB_TCR_REG_USB_CADJ_Msk      (0x1fUL)                  /*!< USB_CADJ (Bitfield-Mask: 0x1f)                        */\n/* =====================================================  USB_TXC0_REG  ====================================================== */\n#define USB_USB_TXC0_REG_USB_IGN_IN_Pos   (4UL)                     /*!< USB_IGN_IN (Bit 4)                                    */\n#define USB_USB_TXC0_REG_USB_IGN_IN_Msk   (0x10UL)                  /*!< USB_IGN_IN (Bitfield-Mask: 0x01)                      */\n#define USB_USB_TXC0_REG_USB_FLUSH_Pos    (3UL)                     /*!< USB_FLUSH (Bit 3)                                     */\n#define USB_USB_TXC0_REG_USB_FLUSH_Msk    (0x8UL)                   /*!< USB_FLUSH (Bitfield-Mask: 0x01)                       */\n#define USB_USB_TXC0_REG_USB_TOGGLE_TX0_Pos (2UL)                   /*!< USB_TOGGLE_TX0 (Bit 2)                                */\n#define USB_USB_TXC0_REG_USB_TOGGLE_TX0_Msk (0x4UL)                 /*!< USB_TOGGLE_TX0 (Bitfield-Mask: 0x01)                  */\n#define USB_USB_TXC0_REG_USB_TX_EN_Pos    (0UL)                     /*!< USB_TX_EN (Bit 0)                                     */\n#define USB_USB_TXC0_REG_USB_TX_EN_Msk    (0x1UL)                   /*!< USB_TX_EN (Bitfield-Mask: 0x01)                       */\n/* =====================================================  USB_TXC1_REG  ====================================================== */\n#define USB_USB_TXC1_REG_USB_IGN_ISOMSK_Pos (7UL)                   /*!< USB_IGN_ISOMSK (Bit 7)                                */\n#define USB_USB_TXC1_REG_USB_IGN_ISOMSK_Msk (0x80UL)                /*!< USB_IGN_ISOMSK (Bitfield-Mask: 0x01)                  */\n#define USB_USB_TXC1_REG_USB_TFWL_Pos     (5UL)                     /*!< USB_TFWL (Bit 5)                                      */\n#define USB_USB_TXC1_REG_USB_TFWL_Msk     (0x60UL)                  /*!< USB_TFWL (Bitfield-Mask: 0x03)                        */\n#define USB_USB_TXC1_REG_USB_RFF_Pos      (4UL)                     /*!< USB_RFF (Bit 4)                                       */\n#define USB_USB_TXC1_REG_USB_RFF_Msk      (0x10UL)                  /*!< USB_RFF (Bitfield-Mask: 0x01)                         */\n#define USB_USB_TXC1_REG_USB_FLUSH_Pos    (3UL)                     /*!< USB_FLUSH (Bit 3)                                     */\n#define USB_USB_TXC1_REG_USB_FLUSH_Msk    (0x8UL)                   /*!< USB_FLUSH (Bitfield-Mask: 0x01)                       */\n#define USB_USB_TXC1_REG_USB_TOGGLE_TX_Pos (2UL)                    /*!< USB_TOGGLE_TX (Bit 2)                                 */\n#define USB_USB_TXC1_REG_USB_TOGGLE_TX_Msk (0x4UL)                  /*!< USB_TOGGLE_TX (Bitfield-Mask: 0x01)                   */\n#define USB_USB_TXC1_REG_USB_LAST_Pos     (1UL)                     /*!< USB_LAST (Bit 1)                                      */\n#define USB_USB_TXC1_REG_USB_LAST_Msk     (0x2UL)                   /*!< USB_LAST (Bitfield-Mask: 0x01)                        */\n#define USB_USB_TXC1_REG_USB_TX_EN_Pos    (0UL)                     /*!< USB_TX_EN (Bit 0)                                     */\n#define USB_USB_TXC1_REG_USB_TX_EN_Msk    (0x1UL)                   /*!< USB_TX_EN (Bitfield-Mask: 0x01)                       */\n/* =====================================================  USB_TXC2_REG  ====================================================== */\n#define USB_USB_TXC2_REG_USB_IGN_ISOMSK_Pos (7UL)                   /*!< USB_IGN_ISOMSK (Bit 7)                                */\n#define USB_USB_TXC2_REG_USB_IGN_ISOMSK_Msk (0x80UL)                /*!< USB_IGN_ISOMSK (Bitfield-Mask: 0x01)                  */\n#define USB_USB_TXC2_REG_USB_TFWL_Pos     (5UL)                     /*!< USB_TFWL (Bit 5)                                      */\n#define USB_USB_TXC2_REG_USB_TFWL_Msk     (0x60UL)                  /*!< USB_TFWL (Bitfield-Mask: 0x03)                        */\n#define USB_USB_TXC2_REG_USB_RFF_Pos      (4UL)                     /*!< USB_RFF (Bit 4)                                       */\n#define USB_USB_TXC2_REG_USB_RFF_Msk      (0x10UL)                  /*!< USB_RFF (Bitfield-Mask: 0x01)                         */\n#define USB_USB_TXC2_REG_USB_FLUSH_Pos    (3UL)                     /*!< USB_FLUSH (Bit 3)                                     */\n#define USB_USB_TXC2_REG_USB_FLUSH_Msk    (0x8UL)                   /*!< USB_FLUSH (Bitfield-Mask: 0x01)                       */\n#define USB_USB_TXC2_REG_USB_TOGGLE_TX_Pos (2UL)                    /*!< USB_TOGGLE_TX (Bit 2)                                 */\n#define USB_USB_TXC2_REG_USB_TOGGLE_TX_Msk (0x4UL)                  /*!< USB_TOGGLE_TX (Bitfield-Mask: 0x01)                   */\n#define USB_USB_TXC2_REG_USB_LAST_Pos     (1UL)                     /*!< USB_LAST (Bit 1)                                      */\n#define USB_USB_TXC2_REG_USB_LAST_Msk     (0x2UL)                   /*!< USB_LAST (Bitfield-Mask: 0x01)                        */\n#define USB_USB_TXC2_REG_USB_TX_EN_Pos    (0UL)                     /*!< USB_TX_EN (Bit 0)                                     */\n#define USB_USB_TXC2_REG_USB_TX_EN_Msk    (0x1UL)                   /*!< USB_TX_EN (Bitfield-Mask: 0x01)                       */\n/* =====================================================  USB_TXC3_REG  ====================================================== */\n#define USB_USB_TXC3_REG_USB_IGN_ISOMSK_Pos (7UL)                   /*!< USB_IGN_ISOMSK (Bit 7)                                */\n#define USB_USB_TXC3_REG_USB_IGN_ISOMSK_Msk (0x80UL)                /*!< USB_IGN_ISOMSK (Bitfield-Mask: 0x01)                  */\n#define USB_USB_TXC3_REG_USB_TFWL_Pos     (5UL)                     /*!< USB_TFWL (Bit 5)                                      */\n#define USB_USB_TXC3_REG_USB_TFWL_Msk     (0x60UL)                  /*!< USB_TFWL (Bitfield-Mask: 0x03)                        */\n#define USB_USB_TXC3_REG_USB_RFF_Pos      (4UL)                     /*!< USB_RFF (Bit 4)                                       */\n#define USB_USB_TXC3_REG_USB_RFF_Msk      (0x10UL)                  /*!< USB_RFF (Bitfield-Mask: 0x01)                         */\n#define USB_USB_TXC3_REG_USB_FLUSH_Pos    (3UL)                     /*!< USB_FLUSH (Bit 3)                                     */\n#define USB_USB_TXC3_REG_USB_FLUSH_Msk    (0x8UL)                   /*!< USB_FLUSH (Bitfield-Mask: 0x01)                       */\n#define USB_USB_TXC3_REG_USB_TOGGLE_TX_Pos (2UL)                    /*!< USB_TOGGLE_TX (Bit 2)                                 */\n#define USB_USB_TXC3_REG_USB_TOGGLE_TX_Msk (0x4UL)                  /*!< USB_TOGGLE_TX (Bitfield-Mask: 0x01)                   */\n#define USB_USB_TXC3_REG_USB_LAST_Pos     (1UL)                     /*!< USB_LAST (Bit 1)                                      */\n#define USB_USB_TXC3_REG_USB_LAST_Msk     (0x2UL)                   /*!< USB_LAST (Bitfield-Mask: 0x01)                        */\n#define USB_USB_TXC3_REG_USB_TX_EN_Pos    (0UL)                     /*!< USB_TX_EN (Bit 0)                                     */\n#define USB_USB_TXC3_REG_USB_TX_EN_Msk    (0x1UL)                   /*!< USB_TX_EN (Bitfield-Mask: 0x01)                       */\n/* =====================================================  USB_TXD0_REG  ====================================================== */\n#define USB_USB_TXD0_REG_USB_TXFD_Pos     (0UL)                     /*!< USB_TXFD (Bit 0)                                      */\n#define USB_USB_TXD0_REG_USB_TXFD_Msk     (0xffUL)                  /*!< USB_TXFD (Bitfield-Mask: 0xff)                        */\n/* =====================================================  USB_TXD1_REG  ====================================================== */\n#define USB_USB_TXD1_REG_USB_TXFD_Pos     (0UL)                     /*!< USB_TXFD (Bit 0)                                      */\n#define USB_USB_TXD1_REG_USB_TXFD_Msk     (0xffUL)                  /*!< USB_TXFD (Bitfield-Mask: 0xff)                        */\n/* =====================================================  USB_TXD2_REG  ====================================================== */\n#define USB_USB_TXD2_REG_USB_TXFD_Pos     (0UL)                     /*!< USB_TXFD (Bit 0)                                      */\n#define USB_USB_TXD2_REG_USB_TXFD_Msk     (0xffUL)                  /*!< USB_TXFD (Bitfield-Mask: 0xff)                        */\n/* =====================================================  USB_TXD3_REG  ====================================================== */\n#define USB_USB_TXD3_REG_USB_TXFD_Pos     (0UL)                     /*!< USB_TXFD (Bit 0)                                      */\n#define USB_USB_TXD3_REG_USB_TXFD_Msk     (0xffUL)                  /*!< USB_TXFD (Bitfield-Mask: 0xff)                        */\n/* =====================================================  USB_TXEV_REG  ====================================================== */\n#define USB_USB_TXEV_REG_USB_TXUDRRN31_Pos (4UL)                    /*!< USB_TXUDRRN31 (Bit 4)                                 */\n#define USB_USB_TXEV_REG_USB_TXUDRRN31_Msk (0x70UL)                 /*!< USB_TXUDRRN31 (Bitfield-Mask: 0x07)                   */\n#define USB_USB_TXEV_REG_USB_TXFIFO31_Pos (0UL)                     /*!< USB_TXFIFO31 (Bit 0)                                  */\n#define USB_USB_TXEV_REG_USB_TXFIFO31_Msk (0x7UL)                   /*!< USB_TXFIFO31 (Bitfield-Mask: 0x07)                    */\n/* =====================================================  USB_TXMSK_REG  ===================================================== */\n#define USB_USB_TXMSK_REG_USB_M_TXUDRRN31_Pos (4UL)                 /*!< USB_M_TXUDRRN31 (Bit 4)                               */\n#define USB_USB_TXMSK_REG_USB_M_TXUDRRN31_Msk (0x70UL)              /*!< USB_M_TXUDRRN31 (Bitfield-Mask: 0x07)                 */\n#define USB_USB_TXMSK_REG_USB_M_TXFIFO31_Pos (0UL)                  /*!< USB_M_TXFIFO31 (Bit 0)                                */\n#define USB_USB_TXMSK_REG_USB_M_TXFIFO31_Msk (0x7UL)                /*!< USB_M_TXFIFO31 (Bitfield-Mask: 0x07)                  */\n/* =====================================================  USB_TXS0_REG  ====================================================== */\n#define USB_USB_TXS0_REG_USB_ACK_STAT_Pos (6UL)                     /*!< USB_ACK_STAT (Bit 6)                                  */\n#define USB_USB_TXS0_REG_USB_ACK_STAT_Msk (0x40UL)                  /*!< USB_ACK_STAT (Bitfield-Mask: 0x01)                    */\n#define USB_USB_TXS0_REG_USB_TX_DONE_Pos  (5UL)                     /*!< USB_TX_DONE (Bit 5)                                   */\n#define USB_USB_TXS0_REG_USB_TX_DONE_Msk  (0x20UL)                  /*!< USB_TX_DONE (Bitfield-Mask: 0x01)                     */\n#define USB_USB_TXS0_REG_USB_TCOUNT_Pos   (0UL)                     /*!< USB_TCOUNT (Bit 0)                                    */\n#define USB_USB_TXS0_REG_USB_TCOUNT_Msk   (0x1fUL)                  /*!< USB_TCOUNT (Bitfield-Mask: 0x1f)                      */\n/* =====================================================  USB_TXS1_REG  ====================================================== */\n#define USB_USB_TXS1_REG_USB_TX_URUN_Pos  (7UL)                     /*!< USB_TX_URUN (Bit 7)                                   */\n#define USB_USB_TXS1_REG_USB_TX_URUN_Msk  (0x80UL)                  /*!< USB_TX_URUN (Bitfield-Mask: 0x01)                     */\n#define USB_USB_TXS1_REG_USB_ACK_STAT_Pos (6UL)                     /*!< USB_ACK_STAT (Bit 6)                                  */\n#define USB_USB_TXS1_REG_USB_ACK_STAT_Msk (0x40UL)                  /*!< USB_ACK_STAT (Bitfield-Mask: 0x01)                    */\n#define USB_USB_TXS1_REG_USB_TX_DONE_Pos  (5UL)                     /*!< USB_TX_DONE (Bit 5)                                   */\n#define USB_USB_TXS1_REG_USB_TX_DONE_Msk  (0x20UL)                  /*!< USB_TX_DONE (Bitfield-Mask: 0x01)                     */\n#define USB_USB_TXS1_REG_USB_TCOUNT_Pos   (0UL)                     /*!< USB_TCOUNT (Bit 0)                                    */\n#define USB_USB_TXS1_REG_USB_TCOUNT_Msk   (0x1fUL)                  /*!< USB_TCOUNT (Bitfield-Mask: 0x1f)                      */\n/* =====================================================  USB_TXS2_REG  ====================================================== */\n#define USB_USB_TXS2_REG_USB_TX_URUN_Pos  (7UL)                     /*!< USB_TX_URUN (Bit 7)                                   */\n#define USB_USB_TXS2_REG_USB_TX_URUN_Msk  (0x80UL)                  /*!< USB_TX_URUN (Bitfield-Mask: 0x01)                     */\n#define USB_USB_TXS2_REG_USB_ACK_STAT_Pos (6UL)                     /*!< USB_ACK_STAT (Bit 6)                                  */\n#define USB_USB_TXS2_REG_USB_ACK_STAT_Msk (0x40UL)                  /*!< USB_ACK_STAT (Bitfield-Mask: 0x01)                    */\n#define USB_USB_TXS2_REG_USB_TX_DONE_Pos  (5UL)                     /*!< USB_TX_DONE (Bit 5)                                   */\n#define USB_USB_TXS2_REG_USB_TX_DONE_Msk  (0x20UL)                  /*!< USB_TX_DONE (Bitfield-Mask: 0x01)                     */\n#define USB_USB_TXS2_REG_USB_TCOUNT_Pos   (0UL)                     /*!< USB_TCOUNT (Bit 0)                                    */\n#define USB_USB_TXS2_REG_USB_TCOUNT_Msk   (0x1fUL)                  /*!< USB_TCOUNT (Bitfield-Mask: 0x1f)                      */\n/* =====================================================  USB_TXS3_REG  ====================================================== */\n#define USB_USB_TXS3_REG_USB_TX_URUN_Pos  (7UL)                     /*!< USB_TX_URUN (Bit 7)                                   */\n#define USB_USB_TXS3_REG_USB_TX_URUN_Msk  (0x80UL)                  /*!< USB_TX_URUN (Bitfield-Mask: 0x01)                     */\n#define USB_USB_TXS3_REG_USB_ACK_STAT_Pos (6UL)                     /*!< USB_ACK_STAT (Bit 6)                                  */\n#define USB_USB_TXS3_REG_USB_ACK_STAT_Msk (0x40UL)                  /*!< USB_ACK_STAT (Bitfield-Mask: 0x01)                    */\n#define USB_USB_TXS3_REG_USB_TX_DONE_Pos  (5UL)                     /*!< USB_TX_DONE (Bit 5)                                   */\n#define USB_USB_TXS3_REG_USB_TX_DONE_Msk  (0x20UL)                  /*!< USB_TX_DONE (Bitfield-Mask: 0x01)                     */\n#define USB_USB_TXS3_REG_USB_TCOUNT_Pos   (0UL)                     /*!< USB_TCOUNT (Bit 0)                                    */\n#define USB_USB_TXS3_REG_USB_TCOUNT_Msk   (0x1fUL)                  /*!< USB_TCOUNT (Bitfield-Mask: 0x1f)                      */\n/* ======================================================  USB_UTR_REG  ====================================================== */\n#define USB_USB_UTR_REG_USB_DIAG_Pos      (7UL)                     /*!< USB_DIAG (Bit 7)                                      */\n#define USB_USB_UTR_REG_USB_DIAG_Msk      (0x80UL)                  /*!< USB_DIAG (Bitfield-Mask: 0x01)                        */\n#define USB_USB_UTR_REG_USB_NCRC_Pos      (6UL)                     /*!< USB_NCRC (Bit 6)                                      */\n#define USB_USB_UTR_REG_USB_NCRC_Msk      (0x40UL)                  /*!< USB_NCRC (Bitfield-Mask: 0x01)                        */\n#define USB_USB_UTR_REG_USB_SF_Pos        (5UL)                     /*!< USB_SF (Bit 5)                                        */\n#define USB_USB_UTR_REG_USB_SF_Msk        (0x20UL)                  /*!< USB_SF (Bitfield-Mask: 0x01)                          */\n#define USB_USB_UTR_REG_USB_UTR_RES_Pos   (0UL)                     /*!< USB_UTR_RES (Bit 0)                                   */\n#define USB_USB_UTR_REG_USB_UTR_RES_Msk   (0x1fUL)                  /*!< USB_UTR_RES (Bitfield-Mask: 0x1f)                     */\n/* ====================================================  USB_UX20CDR_REG  ==================================================== */\n#define USB_USB_UX20CDR_REG_RPU_TEST7_Pos (7UL)                     /*!< RPU_TEST7 (Bit 7)                                     */\n#define USB_USB_UX20CDR_REG_RPU_TEST7_Msk (0x80UL)                  /*!< RPU_TEST7 (Bitfield-Mask: 0x01)                       */\n#define USB_USB_UX20CDR_REG_RPU_TEST_SW2_Pos (6UL)                  /*!< RPU_TEST_SW2 (Bit 6)                                  */\n#define USB_USB_UX20CDR_REG_RPU_TEST_SW2_Msk (0x40UL)               /*!< RPU_TEST_SW2 (Bitfield-Mask: 0x01)                    */\n#define USB_USB_UX20CDR_REG_RPU_TEST_SW1_Pos (5UL)                  /*!< RPU_TEST_SW1 (Bit 5)                                  */\n#define USB_USB_UX20CDR_REG_RPU_TEST_SW1_Msk (0x20UL)               /*!< RPU_TEST_SW1 (Bitfield-Mask: 0x01)                    */\n#define USB_USB_UX20CDR_REG_RPU_TEST_EN_Pos (4UL)                   /*!< RPU_TEST_EN (Bit 4)                                   */\n#define USB_USB_UX20CDR_REG_RPU_TEST_EN_Msk (0x10UL)                /*!< RPU_TEST_EN (Bitfield-Mask: 0x01)                     */\n#define USB_USB_UX20CDR_REG_RPU_TEST_SW1DM_Pos (2UL)                /*!< RPU_TEST_SW1DM (Bit 2)                                */\n#define USB_USB_UX20CDR_REG_RPU_TEST_SW1DM_Msk (0x4UL)              /*!< RPU_TEST_SW1DM (Bitfield-Mask: 0x01)                  */\n#define USB_USB_UX20CDR_REG_RPU_RCDELAY_Pos (1UL)                   /*!< RPU_RCDELAY (Bit 1)                                   */\n#define USB_USB_UX20CDR_REG_RPU_RCDELAY_Msk (0x2UL)                 /*!< RPU_RCDELAY (Bitfield-Mask: 0x01)                     */\n#define USB_USB_UX20CDR_REG_RPU_SSPROTEN_Pos (0UL)                  /*!< RPU_SSPROTEN (Bit 0)                                  */\n#define USB_USB_UX20CDR_REG_RPU_SSPROTEN_Msk (0x1UL)                /*!< RPU_SSPROTEN (Bitfield-Mask: 0x01)                    */\n/* ====================================================  USB_XCVDIAG_REG  ==================================================== */\n#define USB_USB_XCVDIAG_REG_USB_VPIN_Pos  (7UL)                     /*!< USB_VPIN (Bit 7)                                      */\n#define USB_USB_XCVDIAG_REG_USB_VPIN_Msk  (0x80UL)                  /*!< USB_VPIN (Bitfield-Mask: 0x01)                        */\n#define USB_USB_XCVDIAG_REG_USB_VMIN_Pos  (6UL)                     /*!< USB_VMIN (Bit 6)                                      */\n#define USB_USB_XCVDIAG_REG_USB_VMIN_Msk  (0x40UL)                  /*!< USB_VMIN (Bitfield-Mask: 0x01)                        */\n#define USB_USB_XCVDIAG_REG_USB_RCV_Pos   (5UL)                     /*!< USB_RCV (Bit 5)                                       */\n#define USB_USB_XCVDIAG_REG_USB_RCV_Msk   (0x20UL)                  /*!< USB_RCV (Bitfield-Mask: 0x01)                         */\n#define USB_USB_XCVDIAG_REG_USB_XCV_TXEN_Pos (3UL)                  /*!< USB_XCV_TXEN (Bit 3)                                  */\n#define USB_USB_XCVDIAG_REG_USB_XCV_TXEN_Msk (0x8UL)                /*!< USB_XCV_TXEN (Bitfield-Mask: 0x01)                    */\n#define USB_USB_XCVDIAG_REG_USB_XCV_TXn_Pos (2UL)                   /*!< USB_XCV_TXn (Bit 2)                                   */\n#define USB_USB_XCVDIAG_REG_USB_XCV_TXn_Msk (0x4UL)                 /*!< USB_XCV_TXn (Bitfield-Mask: 0x01)                     */\n#define USB_USB_XCVDIAG_REG_USB_XCV_TXp_Pos (1UL)                   /*!< USB_XCV_TXp (Bit 1)                                   */\n#define USB_USB_XCVDIAG_REG_USB_XCV_TXp_Msk (0x2UL)                 /*!< USB_XCV_TXp (Bitfield-Mask: 0x01)                     */\n#define USB_USB_XCVDIAG_REG_USB_XCV_TEST_Pos (0UL)                  /*!< USB_XCV_TEST (Bit 0)                                  */\n#define USB_USB_XCVDIAG_REG_USB_XCV_TEST_Msk (0x1UL)                /*!< USB_XCV_TEST (Bitfield-Mask: 0x01)                    */\n\n\n/* =========================================================================================================================== */\n/* ================                                          WAKEUP                                           ================ */\n/* =========================================================================================================================== */\n\n/* ===================================================  WKUP_CLEAR_P0_REG  =================================================== */\n#define WAKEUP_WKUP_CLEAR_P0_REG_WKUP_CLEAR_P0_Pos (0UL)            /*!< WKUP_CLEAR_P0 (Bit 0)                                 */\n#define WAKEUP_WKUP_CLEAR_P0_REG_WKUP_CLEAR_P0_Msk (0xffffffffUL)   /*!< WKUP_CLEAR_P0 (Bitfield-Mask: 0xffffffff)             */\n/* ===================================================  WKUP_CLEAR_P1_REG  =================================================== */\n#define WAKEUP_WKUP_CLEAR_P1_REG_WKUP_CLEAR_P1_Pos (0UL)            /*!< WKUP_CLEAR_P1 (Bit 0)                                 */\n#define WAKEUP_WKUP_CLEAR_P1_REG_WKUP_CLEAR_P1_Msk (0x7fffffUL)     /*!< WKUP_CLEAR_P1 (Bitfield-Mask: 0x7fffff)               */\n/* =====================================================  WKUP_CTRL_REG  ===================================================== */\n#define WAKEUP_WKUP_CTRL_REG_WKUP_ENABLE_IRQ_Pos (7UL)              /*!< WKUP_ENABLE_IRQ (Bit 7)                               */\n#define WAKEUP_WKUP_CTRL_REG_WKUP_ENABLE_IRQ_Msk (0x80UL)           /*!< WKUP_ENABLE_IRQ (Bitfield-Mask: 0x01)                 */\n#define WAKEUP_WKUP_CTRL_REG_WKUP_SFT_KEYHIT_Pos (6UL)              /*!< WKUP_SFT_KEYHIT (Bit 6)                               */\n#define WAKEUP_WKUP_CTRL_REG_WKUP_SFT_KEYHIT_Msk (0x40UL)           /*!< WKUP_SFT_KEYHIT (Bitfield-Mask: 0x01)                 */\n#define WAKEUP_WKUP_CTRL_REG_WKUP_DEB_VALUE_Pos (0UL)               /*!< WKUP_DEB_VALUE (Bit 0)                                */\n#define WAKEUP_WKUP_CTRL_REG_WKUP_DEB_VALUE_Msk (0x3fUL)            /*!< WKUP_DEB_VALUE (Bitfield-Mask: 0x3f)                  */\n/* ====================================================  WKUP_POL_P0_REG  ==================================================== */\n#define WAKEUP_WKUP_POL_P0_REG_WKUP_POL_P0_Pos (0UL)                /*!< WKUP_POL_P0 (Bit 0)                                   */\n#define WAKEUP_WKUP_POL_P0_REG_WKUP_POL_P0_Msk (0xffffffffUL)       /*!< WKUP_POL_P0 (Bitfield-Mask: 0xffffffff)               */\n/* ====================================================  WKUP_POL_P1_REG  ==================================================== */\n#define WAKEUP_WKUP_POL_P1_REG_WKUP_POL_P1_Pos (0UL)                /*!< WKUP_POL_P1 (Bit 0)                                   */\n#define WAKEUP_WKUP_POL_P1_REG_WKUP_POL_P1_Msk (0x7fffffUL)         /*!< WKUP_POL_P1 (Bitfield-Mask: 0x7fffff)                 */\n/* ==================================================  WKUP_RESET_IRQ_REG  =================================================== */\n#define WAKEUP_WKUP_RESET_IRQ_REG_WKUP_IRQ_RST_Pos (0UL)            /*!< WKUP_IRQ_RST (Bit 0)                                  */\n#define WAKEUP_WKUP_RESET_IRQ_REG_WKUP_IRQ_RST_Msk (0xffffUL)       /*!< WKUP_IRQ_RST (Bitfield-Mask: 0xffff)                  */\n/* ==================================================  WKUP_SELECT_P0_REG  =================================================== */\n#define WAKEUP_WKUP_SELECT_P0_REG_WKUP_SELECT_P0_Pos (0UL)          /*!< WKUP_SELECT_P0 (Bit 0)                                */\n#define WAKEUP_WKUP_SELECT_P0_REG_WKUP_SELECT_P0_Msk (0xffffffffUL) /*!< WKUP_SELECT_P0 (Bitfield-Mask: 0xffffffff)            */\n/* ==================================================  WKUP_SELECT_P1_REG  =================================================== */\n#define WAKEUP_WKUP_SELECT_P1_REG_WKUP_SELECT_P1_Pos (0UL)          /*!< WKUP_SELECT_P1 (Bit 0)                                */\n#define WAKEUP_WKUP_SELECT_P1_REG_WKUP_SELECT_P1_Msk (0x7fffffUL)   /*!< WKUP_SELECT_P1 (Bitfield-Mask: 0x7fffff)              */\n/* =================================================  WKUP_SEL_GPIO_P0_REG  ================================================== */\n#define WAKEUP_WKUP_SEL_GPIO_P0_REG_WKUP_SEL_GPIO_P0_Pos (0UL)      /*!< WKUP_SEL_GPIO_P0 (Bit 0)                              */\n#define WAKEUP_WKUP_SEL_GPIO_P0_REG_WKUP_SEL_GPIO_P0_Msk (0xffffffffUL) /*!< WKUP_SEL_GPIO_P0 (Bitfield-Mask: 0xffffffff)      */\n/* =================================================  WKUP_SEL_GPIO_P1_REG  ================================================== */\n#define WAKEUP_WKUP_SEL_GPIO_P1_REG_WKUP_SEL_GPIO_P1_Pos (0UL)      /*!< WKUP_SEL_GPIO_P1 (Bit 0)                              */\n#define WAKEUP_WKUP_SEL_GPIO_P1_REG_WKUP_SEL_GPIO_P1_Msk (0x7fffffUL) /*!< WKUP_SEL_GPIO_P1 (Bitfield-Mask: 0x7fffff)          */\n/* ==================================================  WKUP_STATUS_P0_REG  =================================================== */\n#define WAKEUP_WKUP_STATUS_P0_REG_WKUP_STAT_P0_Pos (0UL)            /*!< WKUP_STAT_P0 (Bit 0)                                  */\n#define WAKEUP_WKUP_STATUS_P0_REG_WKUP_STAT_P0_Msk (0xffffffffUL)   /*!< WKUP_STAT_P0 (Bitfield-Mask: 0xffffffff)              */\n/* ==================================================  WKUP_STATUS_P1_REG  =================================================== */\n#define WAKEUP_WKUP_STATUS_P1_REG_WKUP_STAT_P1_Pos (0UL)            /*!< WKUP_STAT_P1 (Bit 0)                                  */\n#define WAKEUP_WKUP_STATUS_P1_REG_WKUP_STAT_P1_Msk (0x7fffffUL)     /*!< WKUP_STAT_P1 (Bitfield-Mask: 0x7fffff)                */\n\n/** @} */ /* End of group PosMask_peripherals */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* DA1469X_H */\n\n\n/** @} */ /* End of group DA1469x */\n\n/** @} */ /* End of group PLA_BSP_REGISTERS */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/cmsis_compiler.h",
    "content": "/**************************************************************************//**\n * @file     cmsis_compiler.h\n * @brief    CMSIS compiler generic header file\n * @version  V5.1.0\n * @date     09. October 2018\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2018 Arm Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef __CMSIS_COMPILER_H\n#define __CMSIS_COMPILER_H\n\n#include <stdint.h>\n\n/*\n * Arm Compiler 4/5\n */\n#if   defined ( __CC_ARM )\n  #include \"cmsis_armcc.h\"\n\n\n/*\n * Arm Compiler 6.6 LTM (armclang)\n */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100)\n  #include \"cmsis_armclang_ltm.h\"\n\n  /*\n * Arm Compiler above 6.10.1 (armclang)\n */\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)\n  #include \"cmsis_armclang.h\"\n\n\n/*\n * GNU Compiler\n */\n#elif defined ( __GNUC__ )\n  #include \"cmsis_gcc.h\"\n\n\n/*\n * IAR Compiler\n */\n#elif defined ( __ICCARM__ )\n  #include <cmsis_iccarm.h>\n\n\n/*\n * TI Arm Compiler\n */\n#elif defined ( __TI_ARM__ )\n  #include <cmsis_ccs.h>\n\n  #ifndef   __ASM\n    #define __ASM                                  __asm\n  #endif\n  #ifndef   __INLINE\n    #define __INLINE                               inline\n  #endif\n  #ifndef   __STATIC_INLINE\n    #define __STATIC_INLINE                        static inline\n  #endif\n  #ifndef   __STATIC_FORCEINLINE\n    #define __STATIC_FORCEINLINE                   __STATIC_INLINE\n  #endif\n  #ifndef   __NO_RETURN\n    #define __NO_RETURN                            __attribute__((noreturn))\n  #endif\n  #ifndef   __USED\n    #define __USED                                 __attribute__((used))\n  #endif\n  #ifndef   __WEAK\n    #define __WEAK                                 __attribute__((weak))\n  #endif\n  #ifndef   __PACKED\n    #define __PACKED                               __attribute__((packed))\n  #endif\n  #ifndef   __PACKED_STRUCT\n    #define __PACKED_STRUCT                        struct __attribute__((packed))\n  #endif\n  #ifndef   __PACKED_UNION\n    #define __PACKED_UNION                         union __attribute__((packed))\n  #endif\n  #ifndef   __UNALIGNED_UINT32        /* deprecated */\n    struct __attribute__((packed)) T_UINT32 { uint32_t v; };\n    #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v)\n  #endif\n  #ifndef   __UNALIGNED_UINT16_WRITE\n    __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };\n    #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val))\n  #endif\n  #ifndef   __UNALIGNED_UINT16_READ\n    __PACKED_STRUCT T_UINT16_READ { uint16_t v; };\n    #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v)\n  #endif\n  #ifndef   __UNALIGNED_UINT32_WRITE\n    __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };\n    #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))\n  #endif\n  #ifndef   __UNALIGNED_UINT32_READ\n    __PACKED_STRUCT T_UINT32_READ { uint32_t v; };\n    #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v)\n  #endif\n  #ifndef   __ALIGNED\n    #define __ALIGNED(x)                           __attribute__((aligned(x)))\n  #endif\n  #ifndef   __RESTRICT\n    #define __RESTRICT                             __restrict\n  #endif\n\n\n/*\n * TASKING Compiler\n */\n#elif defined ( __TASKING__ )\n  /*\n   * The CMSIS functions have been implemented as intrinsics in the compiler.\n   * Please use \"carm -?i\" to get an up to date list of all intrinsics,\n   * Including the CMSIS ones.\n   */\n\n  #ifndef   __ASM\n    #define __ASM                                  __asm\n  #endif\n  #ifndef   __INLINE\n    #define __INLINE                               inline\n  #endif\n  #ifndef   __STATIC_INLINE\n    #define __STATIC_INLINE                        static inline\n  #endif\n  #ifndef   __STATIC_FORCEINLINE\n    #define __STATIC_FORCEINLINE                   __STATIC_INLINE\n  #endif\n  #ifndef   __NO_RETURN\n    #define __NO_RETURN                            __attribute__((noreturn))\n  #endif\n  #ifndef   __USED\n    #define __USED                                 __attribute__((used))\n  #endif\n  #ifndef   __WEAK\n    #define __WEAK                                 __attribute__((weak))\n  #endif\n  #ifndef   __PACKED\n    #define __PACKED                               __packed__\n  #endif\n  #ifndef   __PACKED_STRUCT\n    #define __PACKED_STRUCT                        struct __packed__\n  #endif\n  #ifndef   __PACKED_UNION\n    #define __PACKED_UNION                         union __packed__\n  #endif\n  #ifndef   __UNALIGNED_UINT32        /* deprecated */\n    struct __packed__ T_UINT32 { uint32_t v; };\n    #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v)\n  #endif\n  #ifndef   __UNALIGNED_UINT16_WRITE\n    __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };\n    #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))\n  #endif\n  #ifndef   __UNALIGNED_UINT16_READ\n    __PACKED_STRUCT T_UINT16_READ { uint16_t v; };\n    #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v)\n  #endif\n  #ifndef   __UNALIGNED_UINT32_WRITE\n    __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };\n    #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))\n  #endif\n  #ifndef   __UNALIGNED_UINT32_READ\n    __PACKED_STRUCT T_UINT32_READ { uint32_t v; };\n    #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v)\n  #endif\n  #ifndef   __ALIGNED\n    #define __ALIGNED(x)              __align(x)\n  #endif\n  #ifndef   __RESTRICT\n    #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.\n    #define __RESTRICT\n  #endif\n\n\n/*\n * COSMIC Compiler\n */\n#elif defined ( __CSMC__ )\n   #include <cmsis_csm.h>\n\n #ifndef   __ASM\n    #define __ASM                                  _asm\n  #endif\n  #ifndef   __INLINE\n    #define __INLINE                               inline\n  #endif\n  #ifndef   __STATIC_INLINE\n    #define __STATIC_INLINE                        static inline\n  #endif\n  #ifndef   __STATIC_FORCEINLINE\n    #define __STATIC_FORCEINLINE                   __STATIC_INLINE\n  #endif\n  #ifndef   __NO_RETURN\n    // NO RETURN is automatically detected hence no warning here\n    #define __NO_RETURN\n  #endif\n  #ifndef   __USED\n    #warning No compiler specific solution for __USED. __USED is ignored.\n    #define __USED\n  #endif\n  #ifndef   __WEAK\n    #define __WEAK                                 __weak\n  #endif\n  #ifndef   __PACKED\n    #define __PACKED                               @packed\n  #endif\n  #ifndef   __PACKED_STRUCT\n    #define __PACKED_STRUCT                        @packed struct\n  #endif\n  #ifndef   __PACKED_UNION\n    #define __PACKED_UNION                         @packed union\n  #endif\n  #ifndef   __UNALIGNED_UINT32        /* deprecated */\n    @packed struct T_UINT32 { uint32_t v; };\n    #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v)\n  #endif\n  #ifndef   __UNALIGNED_UINT16_WRITE\n    __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };\n    #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))\n  #endif\n  #ifndef   __UNALIGNED_UINT16_READ\n    __PACKED_STRUCT T_UINT16_READ { uint16_t v; };\n    #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v)\n  #endif\n  #ifndef   __UNALIGNED_UINT32_WRITE\n    __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };\n    #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))\n  #endif\n  #ifndef   __UNALIGNED_UINT32_READ\n    __PACKED_STRUCT T_UINT32_READ { uint32_t v; };\n    #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v)\n  #endif\n  #ifndef   __ALIGNED\n    #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.\n    #define __ALIGNED(x)\n  #endif\n  #ifndef   __RESTRICT\n    #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.\n    #define __RESTRICT\n  #endif\n\n\n#else\n  #error Unknown compiler.\n#endif\n\n\n#endif /* __CMSIS_COMPILER_H */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/cmsis_gcc.h",
    "content": "/**************************************************************************//**\n * @file     cmsis_gcc.h\n * @brief    CMSIS compiler GCC header file\n * @version  V5.1.0\n * @date     20. December 2018\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2018 Arm Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /* Copyright (c) 2019 Modified by Dialog Semiconductor */\n\n#ifndef __CMSIS_GCC_H\n#define __CMSIS_GCC_H\n\n/* ignore some GCC warnings */\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n#pragma GCC diagnostic ignored \"-Wconversion\"\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n\n/* Fallback for __has_builtin */\n#ifndef __has_builtin\n  #define __has_builtin(x) (0)\n#endif\n\n/* CMSIS compiler specific defines */\n#ifndef   __ASM\n  #define __ASM                                  __asm\n#endif\n#ifndef   __INLINE\n  #define __INLINE                               inline\n#endif\n#ifndef   __STATIC_INLINE\n  #define __STATIC_INLINE                        static inline\n#endif\n#ifndef   __STATIC_FORCEINLINE\n  #define __STATIC_FORCEINLINE                   __attribute__((always_inline)) static inline\n#endif\n#ifndef   __NO_RETURN\n  #define __NO_RETURN                            __attribute__((__noreturn__))\n#endif\n#ifndef   __USED\n  #define __USED                                 __attribute__((used))\n#endif\n#ifndef   __WEAK\n  #define __WEAK                                 __attribute__((weak))\n#endif\n#ifndef   __PACKED\n  #define __PACKED                               __attribute__((packed, aligned(1)))\n#endif\n#ifndef   __PACKED_STRUCT\n  #define __PACKED_STRUCT                        struct __attribute__((packed, aligned(1)))\n#endif\n#ifndef   __PACKED_UNION\n  #define __PACKED_UNION                         union __attribute__((packed, aligned(1)))\n#endif\n#ifndef   __UNALIGNED_UINT32        /* deprecated */\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wpacked\"\n  #pragma GCC diagnostic ignored \"-Wattributes\"\n  struct __attribute__((packed)) T_UINT32 { uint32_t v; };\n  #pragma GCC diagnostic pop\n  #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v)\n#endif\n#ifndef   __UNALIGNED_UINT16_WRITE\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wpacked\"\n  #pragma GCC diagnostic ignored \"-Wattributes\"\n  __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };\n  #pragma GCC diagnostic pop\n  #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))\n#endif\n#ifndef   __UNALIGNED_UINT16_READ\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wpacked\"\n  #pragma GCC diagnostic ignored \"-Wattributes\"\n  __PACKED_STRUCT T_UINT16_READ { uint16_t v; };\n  #pragma GCC diagnostic pop\n  #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v)\n#endif\n#ifndef   __UNALIGNED_UINT32_WRITE\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wpacked\"\n  #pragma GCC diagnostic ignored \"-Wattributes\"\n  __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };\n  #pragma GCC diagnostic pop\n  #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))\n#endif\n#ifndef   __UNALIGNED_UINT32_READ\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wpacked\"\n  #pragma GCC diagnostic ignored \"-Wattributes\"\n  __PACKED_STRUCT T_UINT32_READ { uint32_t v; };\n  #pragma GCC diagnostic pop\n  #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v)\n#endif\n#ifndef   __ALIGNED\n  #define __ALIGNED(x)                           __attribute__((aligned(x)))\n#endif\n#ifndef   __RESTRICT\n  #define __RESTRICT                             __restrict\n#endif\n\n\n/* ###########################  Core Function Access  ########################### */\n/** \\ingroup  CMSIS_Core_FunctionInterface\n    \\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions\n  @{\n */\n\n/**\n  \\brief   Enable IRQ Interrupts\n  \\details Enables IRQ interrupts by clearing the I-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n__STATIC_FORCEINLINE void __enable_irq(void)\n{\n  __ASM volatile (\"cpsie i\" : : : \"memory\");\n}\n\n\n/**\n  \\brief   Disable IRQ Interrupts\n  \\details Disables IRQ interrupts by setting the I-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n__STATIC_FORCEINLINE void __disable_irq(void)\n{\n  __ASM volatile (\"cpsid i\" : : : \"memory\");\n}\n\n\n/**\n  \\brief   Get Control Register\n  \\details Returns the content of the Control Register.\n  \\return               Control Register value\n */\n__STATIC_FORCEINLINE uint32_t __get_CONTROL(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, control\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Control Register (non-secure)\n  \\details Returns the content of the non-secure Control Register when in secure mode.\n  \\return               non-secure Control Register value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, control_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Control Register\n  \\details Writes the given value to the Control Register.\n  \\param [in]    control  Control Register value to set\n */\n__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control)\n{\n  __ASM volatile (\"MSR control, %0\" : : \"r\" (control) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Control Register (non-secure)\n  \\details Writes the given value to the non-secure Control Register when in secure state.\n  \\param [in]    control  Control Register value to set\n */\n__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control)\n{\n  __ASM volatile (\"MSR control_ns, %0\" : : \"r\" (control) : \"memory\");\n}\n#endif\n\n\n/**\n  \\brief   Get IPSR Register\n  \\details Returns the content of the IPSR Register.\n  \\return               IPSR Register value\n */\n__STATIC_FORCEINLINE uint32_t __get_IPSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, ipsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get APSR Register\n  \\details Returns the content of the APSR Register.\n  \\return               APSR Register value\n */\n__STATIC_FORCEINLINE uint32_t __get_APSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, apsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get xPSR Register\n  \\details Returns the content of the xPSR Register.\n  \\return               xPSR Register value\n */\n__STATIC_FORCEINLINE uint32_t __get_xPSR(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, xpsr\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Get Process Stack Pointer\n  \\details Returns the current value of the Process Stack Pointer (PSP).\n  \\return               PSP Register value\n */\n__STATIC_FORCEINLINE uint32_t __get_PSP(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, psp\"  : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Process Stack Pointer (non-secure)\n  \\details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.\n  \\return               PSP Register value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, psp_ns\"  : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Process Stack Pointer\n  \\details Assigns the given value to the Process Stack Pointer (PSP).\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\n */\n__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack)\n{\n  __ASM volatile (\"MSR psp, %0\" : : \"r\" (topOfProcStack) : );\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Process Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\n */\n__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack)\n{\n  __ASM volatile (\"MSR psp_ns, %0\" : : \"r\" (topOfProcStack) : );\n}\n#endif\n\n\n/**\n  \\brief   Get Main Stack Pointer\n  \\details Returns the current value of the Main Stack Pointer (MSP).\n  \\return               MSP Register value\n */\n__STATIC_FORCEINLINE uint32_t __get_MSP(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, msp\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Main Stack Pointer (non-secure)\n  \\details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.\n  \\return               MSP Register value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, msp_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Main Stack Pointer\n  \\details Assigns the given value to the Main Stack Pointer (MSP).\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\n */\n__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack)\n{\n  __ASM volatile (\"MSR msp, %0\" : : \"r\" (topOfMainStack) : );\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Main Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\n */\n__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack)\n{\n  __ASM volatile (\"MSR msp_ns, %0\" : : \"r\" (topOfMainStack) : );\n}\n#endif\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Stack Pointer (non-secure)\n  \\details Returns the current value of the non-secure Stack Pointer (SP) when in secure state.\n  \\return               SP Register value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, sp_ns\" : \"=r\" (result) );\n  return(result);\n}\n\n\n/**\n  \\brief   Set Stack Pointer (non-secure)\n  \\details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state.\n  \\param [in]    topOfStack  Stack Pointer value to set\n */\n__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack)\n{\n  __ASM volatile (\"MSR sp_ns, %0\" : : \"r\" (topOfStack) : );\n}\n#endif\n\n\n/**\n  \\brief   Get Priority Mask\n  \\details Returns the current state of the priority mask bit from the Priority Mask Register.\n  \\return               Priority Mask value\n */\n__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, primask\" : \"=r\" (result) :: \"memory\");\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Priority Mask (non-secure)\n  \\details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.\n  \\return               Priority Mask value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, primask_ns\" : \"=r\" (result) :: \"memory\");\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Priority Mask\n  \\details Assigns the given value to the Priority Mask Register.\n  \\param [in]    priMask  Priority Mask\n */\n__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask)\n{\n  __ASM volatile (\"MSR primask, %0\" : : \"r\" (priMask) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Priority Mask (non-secure)\n  \\details Assigns the given value to the non-secure Priority Mask Register when in secure state.\n  \\param [in]    priMask  Priority Mask\n */\n__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask)\n{\n  __ASM volatile (\"MSR primask_ns, %0\" : : \"r\" (priMask) : \"memory\");\n}\n#endif\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Enable FIQ\n  \\details Enables FIQ interrupts by clearing the F-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n__STATIC_FORCEINLINE void __enable_fault_irq(void)\n{\n  __ASM volatile (\"cpsie f\" : : : \"memory\");\n}\n\n\n/**\n  \\brief   Disable FIQ\n  \\details Disables FIQ interrupts by setting the F-bit in the CPSR.\n           Can only be executed in Privileged modes.\n */\n__STATIC_FORCEINLINE void __disable_fault_irq(void)\n{\n  __ASM volatile (\"cpsid f\" : : : \"memory\");\n}\n\n\n/**\n  \\brief   Get Base Priority\n  \\details Returns the current value of the Base Priority register.\n  \\return               Base Priority register value\n */\n__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, basepri\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Base Priority (non-secure)\n  \\details Returns the current value of the non-secure Base Priority register when in secure state.\n  \\return               Base Priority register value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, basepri_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Base Priority\n  \\details Assigns the given value to the Base Priority register.\n  \\param [in]    basePri  Base Priority value to set\n */\n__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri, %0\" : : \"r\" (basePri) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Base Priority (non-secure)\n  \\details Assigns the given value to the non-secure Base Priority register when in secure state.\n  \\param [in]    basePri  Base Priority value to set\n */\n__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri_ns, %0\" : : \"r\" (basePri) : \"memory\");\n}\n#endif\n\n\n/**\n  \\brief   Set Base Priority with condition\n  \\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,\n           or the new value increases the BASEPRI priority level.\n  \\param [in]    basePri  Base Priority value to set\n */\n__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri)\n{\n  __ASM volatile (\"MSR basepri_max, %0\" : : \"r\" (basePri) : \"memory\");\n}\n\n\n/**\n  \\brief   Get Fault Mask\n  \\details Returns the current value of the Fault Mask register.\n  \\return               Fault Mask register value\n */\n__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, faultmask\" : \"=r\" (result) );\n  return(result);\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Fault Mask (non-secure)\n  \\details Returns the current value of the non-secure Fault Mask register when in secure state.\n  \\return               Fault Mask register value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void)\n{\n  uint32_t result;\n\n  __ASM volatile (\"MRS %0, faultmask_ns\" : \"=r\" (result) );\n  return(result);\n}\n#endif\n\n\n/**\n  \\brief   Set Fault Mask\n  \\details Assigns the given value to the Fault Mask register.\n  \\param [in]    faultMask  Fault Mask value to set\n */\n__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask)\n{\n  __ASM volatile (\"MSR faultmask, %0\" : : \"r\" (faultMask) : \"memory\");\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Set Fault Mask (non-secure)\n  \\details Assigns the given value to the non-secure Fault Mask register when in secure state.\n  \\param [in]    faultMask  Fault Mask value to set\n */\n__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask)\n{\n  __ASM volatile (\"MSR faultmask_ns, %0\" : : \"r\" (faultMask) : \"memory\");\n}\n#endif\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n\n/**\n  \\brief   Get Process Stack Pointer Limit\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\n  Stack Pointer Limit register hence zero is returned always in non-secure\n  mode.\n\n  \\details Returns the current value of the Process Stack Pointer Limit (PSPLIM).\n  \\return               PSPLIM Register value\n */\n__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void)\n{\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \\\n    (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))\n    // without main extensions, the non-secure PSPLIM is RAZ/WI\n  return 0U;\n#else\n  uint32_t result;\n  __ASM volatile (\"MRS %0, psplim\"  : \"=r\" (result) );\n  return result;\n#endif\n}\n\n#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3))\n/**\n  \\brief   Get Process Stack Pointer Limit (non-secure)\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\n  Stack Pointer Limit register hence zero is returned always.\n\n  \\details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\n  \\return               PSPLIM Register value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void)\n{\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))\n  // without main extensions, the non-secure PSPLIM is RAZ/WI\n  return 0U;\n#else\n  uint32_t result;\n  __ASM volatile (\"MRS %0, psplim_ns\"  : \"=r\" (result) );\n  return result;\n#endif\n}\n#endif\n\n\n/**\n  \\brief   Set Process Stack Pointer Limit\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\n  Stack Pointer Limit register hence the write is silently ignored in non-secure\n  mode.\n\n  \\details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).\n  \\param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\n */\n__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit)\n{\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \\\n    (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))\n  // without main extensions, the non-secure PSPLIM is RAZ/WI\n  (void)ProcStackPtrLimit;\n#else\n  __ASM volatile (\"MSR psplim, %0\" : : \"r\" (ProcStackPtrLimit));\n#endif\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3))\n/**\n  \\brief   Set Process Stack Pointer (non-secure)\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\n  Stack Pointer Limit register hence the write is silently ignored.\n\n  \\details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\n  \\param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\n */\n__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit)\n{\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))\n  // without main extensions, the non-secure PSPLIM is RAZ/WI\n  (void)ProcStackPtrLimit;\n#else\n  __ASM volatile (\"MSR psplim_ns, %0\\n\" : : \"r\" (ProcStackPtrLimit));\n#endif\n}\n#endif\n\n\n/**\n  \\brief   Get Main Stack Pointer Limit\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\n  Stack Pointer Limit register hence zero is returned always in non-secure\n  mode.\n\n  \\details Returns the current value of the Main Stack Pointer Limit (MSPLIM).\n  \\return               MSPLIM Register value\n */\n__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void)\n{\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \\\n    (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))\n  // without main extensions, the non-secure MSPLIM is RAZ/WI\n  return 0U;\n#else\n  uint32_t result;\n  __ASM volatile (\"MRS %0, msplim\" : \"=r\" (result) );\n  return result;\n#endif\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3))\n/**\n  \\brief   Get Main Stack Pointer Limit (non-secure)\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\n  Stack Pointer Limit register hence zero is returned always.\n\n  \\details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.\n  \\return               MSPLIM Register value\n */\n__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void)\n{\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))\n  // without main extensions, the non-secure MSPLIM is RAZ/WI\n  return 0U;\n#else\n  uint32_t result;\n  __ASM volatile (\"MRS %0, msplim_ns\" : \"=r\" (result) );\n  return result;\n#endif\n}\n#endif\n\n\n/**\n  \\brief   Set Main Stack Pointer Limit\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\n  Stack Pointer Limit register hence the write is silently ignored in non-secure\n  mode.\n\n  \\details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).\n  \\param [in]    MainStackPtrLimit  Main Stack Pointer Limit value to set\n */\n__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit)\n{\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \\\n    (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))\n  // without main extensions, the non-secure MSPLIM is RAZ/WI\n  (void)MainStackPtrLimit;\n#else\n  __ASM volatile (\"MSR msplim, %0\" : : \"r\" (MainStackPtrLimit));\n#endif\n}\n\n\n#if (defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3))\n/**\n  \\brief   Set Main Stack Pointer Limit (non-secure)\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\n  Stack Pointer Limit register hence the write is silently ignored.\n\n  \\details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.\n  \\param [in]    MainStackPtrLimit  Main Stack Pointer value to set\n */\n__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit)\n{\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))\n  // without main extensions, the non-secure MSPLIM is RAZ/WI\n  (void)MainStackPtrLimit;\n#else\n  __ASM volatile (\"MSR msplim_ns, %0\" : : \"r\" (MainStackPtrLimit));\n#endif\n}\n#endif\n\n#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n\n/**\n  \\brief   Get FPSCR\n  \\details Returns the current value of the Floating Point Status/Control register.\n  \\return               Floating Point Status/Control register value\n */\n__STATIC_FORCEINLINE uint32_t __get_FPSCR(void)\n{\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\n#if __has_builtin(__builtin_arm_get_fpscr)\n// Re-enable using built-in when GCC has been fixed\n// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2)\n  /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */\n  return __builtin_arm_get_fpscr();\n#else\n  uint32_t result;\n\n  __ASM volatile (\"VMRS %0, fpscr\" : \"=r\" (result) );\n  return(result);\n#endif\n#else\n  return(0U);\n#endif\n}\n\n\n/**\n  \\brief   Set FPSCR\n  \\details Assigns the given value to the Floating Point Status/Control register.\n  \\param [in]    fpscr  Floating Point Status/Control value to set\n */\n__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr)\n{\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\n#if __has_builtin(__builtin_arm_set_fpscr)\n// Re-enable using built-in when GCC has been fixed\n// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2)\n  /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */\n  __builtin_arm_set_fpscr(fpscr);\n#else\n  __ASM volatile (\"VMSR fpscr, %0\" : : \"r\" (fpscr) : \"vfpcc\", \"memory\");\n#endif\n#else\n  (void)fpscr;\n#endif\n}\n\n\n/*@} end of CMSIS_Core_RegAccFunctions */\n\n\n/* ##########################  Core Instruction Access  ######################### */\n/** \\defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface\n  Access to dedicated instructions\n  @{\n*/\n\n/* Define macros for porting to both thumb1 and thumb2.\n * For thumb1, use low register (r0-r7), specified by constraint \"l\"\n * Otherwise, use general registers, specified by constraint \"r\" */\n#if defined (__thumb__) && !defined (__thumb2__)\n#define __CMSIS_GCC_OUT_REG(r) \"=l\" (r)\n#define __CMSIS_GCC_RW_REG(r) \"+l\" (r)\n#define __CMSIS_GCC_USE_REG(r) \"l\" (r)\n#else\n#define __CMSIS_GCC_OUT_REG(r) \"=r\" (r)\n#define __CMSIS_GCC_RW_REG(r) \"+r\" (r)\n#define __CMSIS_GCC_USE_REG(r) \"r\" (r)\n#endif\n\n/**\n  \\brief   No Operation\n  \\details No Operation does nothing. This instruction can be used for code alignment purposes.\n */\n#define __NOP()                             __ASM volatile (\"nop\")\n\n/**\n  \\brief   Wait For Interrupt\n  \\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.\n */\n#define __WFI()                             __ASM volatile (\"wfi\")\n\n\n/**\n  \\brief   Wait For Event\n  \\details Wait For Event is a hint instruction that permits the processor to enter\n           a low-power state until one of a number of events occurs.\n */\n#define __WFE()                             __ASM volatile (\"wfe\")\n\n\n/**\n  \\brief   Send Event\n  \\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.\n */\n#define __SEV()                             __ASM volatile (\"sev\")\n\n\n/**\n  \\brief   Instruction Synchronization Barrier\n  \\details Instruction Synchronization Barrier flushes the pipeline in the processor,\n           so that all instructions following the ISB are fetched from cache or memory,\n           after the instruction has been completed.\n */\n__STATIC_FORCEINLINE void __ISB(void)\n{\n  __ASM volatile (\"isb 0xF\":::\"memory\");\n}\n\n\n/**\n  \\brief   Data Synchronization Barrier\n  \\details Acts as a special kind of Data Memory Barrier.\n           It completes when all explicit memory accesses before this instruction complete.\n */\n__STATIC_FORCEINLINE void __DSB(void)\n{\n  __ASM volatile (\"dsb 0xF\":::\"memory\");\n}\n\n\n/**\n  \\brief   Data Memory Barrier\n  \\details Ensures the apparent order of the explicit memory operations before\n           and after the instruction, without ensuring their completion.\n */\n__STATIC_FORCEINLINE void __DMB(void)\n{\n  __ASM volatile (\"dmb 0xF\":::\"memory\");\n}\n\n\n/**\n  \\brief   Reverse byte order (32 bit)\n  \\details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n__STATIC_FORCEINLINE uint32_t __REV(uint32_t value)\n{\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)\n  return __builtin_bswap32(value);\n#else\n  uint32_t result;\n\n  __ASM volatile (\"rev %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return result;\n#endif\n}\n\n\n/**\n  \\brief   Reverse byte order (16 bit)\n  \\details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value)\n{\n  uint32_t result;\n\n  __ASM volatile (\"rev16 %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return result;\n}\n\n\n/**\n  \\brief   Reverse byte order (16 bit)\n  \\details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n__STATIC_FORCEINLINE int16_t __REVSH(int16_t value)\n{\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n  return (int16_t)__builtin_bswap16(value);\n#else\n  int16_t result;\n\n  __ASM volatile (\"revsh %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return result;\n#endif\n}\n\n\n/**\n  \\brief   Rotate Right in unsigned value (32 bit)\n  \\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.\n  \\param [in]    op1  Value to rotate\n  \\param [in]    op2  Number of Bits to rotate\n  \\return               Rotated value\n */\n__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2)\n{\n  op2 %= 32U;\n  if (op2 == 0U)\n  {\n    return op1;\n  }\n  return (op1 >> op2) | (op1 << (32U - op2));\n}\n\n\n/**\n  \\brief   Breakpoint\n  \\details Causes the processor to enter Debug state.\n           Debug tools can use this to investigate system state when the instruction at a particular address is reached.\n  \\param [in]    value  is ignored by the processor.\n                 If required, a debugger can use it to store additional information about the breakpoint.\n */\n#define __BKPT(value)                       __ASM volatile (\"bkpt \"#value)\n\n\n/**\n  \\brief   Reverse bit order of value\n  \\details Reverses the bit order of the given value.\n  \\param [in]    value  Value to reverse\n  \\return               Reversed value\n */\n__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value)\n{\n  uint32_t result;\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n   __ASM volatile (\"rbit %0, %1\" : \"=r\" (result) : \"r\" (value) );\n#else\n  uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */\n\n  result = value;                      /* r will be reversed bits of v; first get LSB of v */\n  for (value >>= 1U; value != 0U; value >>= 1U)\n  {\n    result <<= 1U;\n    result |= value & 1U;\n    s--;\n  }\n  result <<= s;                        /* shift when v's highest bits are zero */\n#endif\n  return result;\n}\n\n\n/**\n  \\brief   Count leading zeros\n  \\details Counts the number of leading zeros of a data value.\n  \\param [in]  value  Value to count the leading zeros\n  \\return             number of leading zeros in value\n */\n__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value)\n{\n  /* Even though __builtin_clz produces a CLZ instruction on ARM, formally\n     __builtin_clz(0) is undefined behaviour, so handle this case specially.\n     This guarantees ARM-compatible results if happening to compile on a non-ARM\n     target, and ensures the compiler doesn't decide to activate any\n     optimisations using the logic \"value was passed to __builtin_clz, so it\n     is non-zero\".\n     ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a\n     single CLZ instruction.\n   */\n  if (value == 0U)\n  {\n    return 32U;\n  }\n  return __builtin_clz(value);\n}\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n/**\n  \\brief   LDR Exclusive (8 bit)\n  \\details Executes a exclusive LDR instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr)\n{\n    uint32_t result;\n\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n   __ASM volatile (\"ldrexb %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\n#else\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\n       accepted by assembler. So has to use following less efficient pattern.\n    */\n   __ASM volatile (\"ldrexb %0, [%1]\" : \"=r\" (result) : \"r\" (addr) : \"memory\" );\n#endif\n   return ((uint8_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDR Exclusive (16 bit)\n  \\details Executes a exclusive LDR instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr)\n{\n    uint32_t result;\n\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n   __ASM volatile (\"ldrexh %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\n#else\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\n       accepted by assembler. So has to use following less efficient pattern.\n    */\n   __ASM volatile (\"ldrexh %0, [%1]\" : \"=r\" (result) : \"r\" (addr) : \"memory\" );\n#endif\n   return ((uint16_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDR Exclusive (32 bit)\n  \\details Executes a exclusive LDR instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldrex %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\n   return(result);\n}\n\n\n/**\n  \\brief   STR Exclusive (8 bit)\n  \\details Executes a exclusive STR instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"strexb %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n\n/**\n  \\brief   STR Exclusive (16 bit)\n  \\details Executes a exclusive STR instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"strexh %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n\n/**\n  \\brief   STR Exclusive (32 bit)\n  \\details Executes a exclusive STR instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"strex %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" (value) );\n   return(result);\n}\n\n\n/**\n  \\brief   Remove the exclusive lock\n  \\details Removes the exclusive lock which is created by LDREX.\n */\n__STATIC_FORCEINLINE void __CLREX(void)\n{\n  __ASM volatile (\"clrex\" ::: \"memory\");\n}\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\n/**\n  \\brief   Signed Saturate\n  \\details Saturates a signed value.\n  \\param [in]  ARG1  Value to be saturated\n  \\param [in]  ARG2  Bit position to saturate to (1..32)\n  \\return             Saturated value\n */\n#define __SSAT(ARG1,ARG2) \\\n__extension__ \\\n({                          \\\n  int32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"ssat %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n\n/**\n  \\brief   Unsigned Saturate\n  \\details Saturates an unsigned value.\n  \\param [in]  ARG1  Value to be saturated\n  \\param [in]  ARG2  Bit position to saturate to (0..31)\n  \\return             Saturated value\n */\n#define __USAT(ARG1,ARG2) \\\n __extension__ \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"usat %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n\n/**\n  \\brief   Rotate Right with Extend (32 bit)\n  \\details Moves each bit of a bitstring right by one bit.\n           The carry input is shifted in at the left end of the bitstring.\n  \\param [in]    value  Value to rotate\n  \\return               Rotated value\n */\n__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value)\n{\n  uint32_t result;\n\n  __ASM volatile (\"rrx %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\n  return(result);\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (8 bit)\n  \\details Executes a Unprivileged LDRT instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr)\n{\n    uint32_t result;\n\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n   __ASM volatile (\"ldrbt %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n#else\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\n       accepted by assembler. So has to use following less efficient pattern.\n    */\n   __ASM volatile (\"ldrbt %0, [%1]\" : \"=r\" (result) : \"r\" (ptr) : \"memory\" );\n#endif\n   return ((uint8_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (16 bit)\n  \\details Executes a Unprivileged LDRT instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr)\n{\n    uint32_t result;\n\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\n   __ASM volatile (\"ldrht %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n#else\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\n       accepted by assembler. So has to use following less efficient pattern.\n    */\n   __ASM volatile (\"ldrht %0, [%1]\" : \"=r\" (result) : \"r\" (ptr) : \"memory\" );\n#endif\n   return ((uint16_t) result);    /* Add explicit type cast here */\n}\n\n\n/**\n  \\brief   LDRT Unprivileged (32 bit)\n  \\details Executes a Unprivileged LDRT instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldrt %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return(result);\n}\n\n\n/**\n  \\brief   STRT Unprivileged (8 bit)\n  \\details Executes a Unprivileged STRT instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr)\n{\n   __ASM volatile (\"strbt %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   STRT Unprivileged (16 bit)\n  \\details Executes a Unprivileged STRT instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr)\n{\n   __ASM volatile (\"strht %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   STRT Unprivileged (32 bit)\n  \\details Executes a Unprivileged STRT instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr)\n{\n   __ASM volatile (\"strt %1, %0\" : \"=Q\" (*ptr) : \"r\" (value) );\n}\n\n#else  /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n/**\n  \\brief   Signed Saturate\n  \\details Saturates a signed value.\n  \\param [in]    val  Value to be saturated\n  \\param [in]    sat  Bit position to saturate to (1..32)\n  \\return             Saturated value\n */\n__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat)\n{\n  if ((sat >= 1U) && (sat <= 32U))\n  {\n    const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);\n    const int32_t min = -1 - max ;\n    if (val > max)\n    {\n      return max;\n    }\n    else if (val < min)\n    {\n      return min;\n    }\n  }\n  return val;\n}\n\n/**\n  \\brief   Unsigned Saturate\n  \\details Saturates an unsigned value.\n  \\param [in]    val  Value to be saturated\n  \\param [in]    sat  Bit position to saturate to (0..31)\n  \\return             Saturated value\n */\n__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat)\n{\n  if (sat <= 31U)\n  {\n    const uint32_t max = ((1U << sat) - 1U);\n    if (val > (int32_t)max)\n    {\n      return max;\n    }\n    else if (val < 0)\n    {\n      return 0U;\n    }\n  }\n  return (uint32_t)val;\n}\n\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\n\n\n#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\n/**\n  \\brief   Load-Acquire (8 bit)\n  \\details Executes a LDAB instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldab %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return ((uint8_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire (16 bit)\n  \\details Executes a LDAH instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldah %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return ((uint16_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire (32 bit)\n  \\details Executes a LDA instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"lda %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return(result);\n}\n\n\n/**\n  \\brief   Store-Release (8 bit)\n  \\details Executes a STLB instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr)\n{\n   __ASM volatile (\"stlb %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Store-Release (16 bit)\n  \\details Executes a STLH instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr)\n{\n   __ASM volatile (\"stlh %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Store-Release (32 bit)\n  \\details Executes a STL instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n */\n__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr)\n{\n   __ASM volatile (\"stl %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n}\n\n\n/**\n  \\brief   Load-Acquire Exclusive (8 bit)\n  \\details Executes a LDAB exclusive instruction for 8 bit value.\n  \\param [in]    ptr  Pointer to data\n  \\return             value of type uint8_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldaexb %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return ((uint8_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire Exclusive (16 bit)\n  \\details Executes a LDAH exclusive instruction for 16 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint16_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldaexh %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return ((uint16_t) result);\n}\n\n\n/**\n  \\brief   Load-Acquire Exclusive (32 bit)\n  \\details Executes a LDA exclusive instruction for 32 bit values.\n  \\param [in]    ptr  Pointer to data\n  \\return        value of type uint32_t at (*ptr)\n */\n__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr)\n{\n    uint32_t result;\n\n   __ASM volatile (\"ldaex %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\n   return(result);\n}\n\n\n/**\n  \\brief   Store-Release Exclusive (8 bit)\n  \\details Executes a STLB exclusive instruction for 8 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"stlexb %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n\n/**\n  \\brief   Store-Release Exclusive (16 bit)\n  \\details Executes a STLH exclusive instruction for 16 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"stlexh %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n\n/**\n  \\brief   Store-Release Exclusive (32 bit)\n  \\details Executes a STL exclusive instruction for 32 bit values.\n  \\param [in]  value  Value to store\n  \\param [in]    ptr  Pointer to location\n  \\return          0  Function succeeded\n  \\return          1  Function failed\n */\n__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)\n{\n   uint32_t result;\n\n   __ASM volatile (\"stlex %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\n   return(result);\n}\n\n#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\n\n/*@}*/ /* end of group CMSIS_Core_InstructionInterface */\n\n\n/* ###################  Compiler specific Intrinsics  ########################### */\n/** \\defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics\n  Access to dedicated SIMD instructions\n  @{\n*/\n\n#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))\n\n__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n\n__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n\n__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"ssax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"qsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"shsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uqsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uhsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usad8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"usada8 %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n#define __SSAT16(ARG1,ARG2) \\\n({                          \\\n  int32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"ssat16 %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n#define __USAT16(ARG1,ARG2) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1); \\\n  __ASM (\"usat16 %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) ); \\\n  __RES; \\\n })\n\n__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uxtb16 %0, %1\" : \"=r\" (result) : \"r\" (op1));\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"uxtab16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sxtb16 %0, %1\" : \"=r\" (result) : \"r\" (op1));\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sxtab16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smuad %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smuadx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlad %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smladx %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\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]) );\n#else               /* Big endian */\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]) );\n#endif\n\n  return(llr.w64);\n}\n\n__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\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]) );\n#else               /* Big endian */\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]) );\n#endif\n\n  return(llr.w64);\n}\n\n__STATIC_FORCEINLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smusd %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smusdx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlsd %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)\n{\n  uint32_t result;\n\n  __ASM volatile (\"smlsdx %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\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]) );\n#else               /* Big endian */\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]) );\n#endif\n\n  return(llr.w64);\n}\n\n__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)\n{\n  union llreg_u{\n    uint32_t w32[2];\n    uint64_t w64;\n  } llr;\n  llr.w64 = acc;\n\n#ifndef __ARMEB__   /* Little endian */\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]) );\n#else               /* Big endian */\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]) );\n#endif\n\n  return(llr.w64);\n}\n\n__STATIC_FORCEINLINE uint32_t __SEL  (uint32_t op1, uint32_t op2)\n{\n  uint32_t result;\n\n  __ASM volatile (\"sel %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE  int32_t __QADD( int32_t op1,  int32_t op2)\n{\n  int32_t result;\n\n  __ASM volatile (\"qadd %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n__STATIC_FORCEINLINE  int32_t __QSUB( int32_t op1,  int32_t op2)\n{\n  int32_t result;\n\n  __ASM volatile (\"qsub %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\n  return(result);\n}\n\n#if 0\n#define __PKHBT(ARG1,ARG2,ARG3) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\\n  __ASM (\"pkhbt %0, %1, %2, lsl %3\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2), \"I\" (ARG3)  ); \\\n  __RES; \\\n })\n\n#define __PKHTB(ARG1,ARG2,ARG3) \\\n({                          \\\n  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\\n  if (ARG3 == 0) \\\n    __ASM (\"pkhtb %0, %1, %2\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2)  ); \\\n  else \\\n    __ASM (\"pkhtb %0, %1, %2, asr %3\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2), \"I\" (ARG3)  ); \\\n  __RES; \\\n })\n#endif\n\n#define __PKHBT(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0x0000FFFFUL) |  \\\n                                           ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL)  )\n\n#define __PKHTB(ARG1,ARG2,ARG3)          ( ((((uint32_t)(ARG1))          ) & 0xFFFF0000UL) |  \\\n                                           ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL)  )\n\n__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)\n{\n int32_t result;\n\n __ASM volatile (\"smmla %0, %1, %2, %3\" : \"=r\" (result): \"r\"  (op1), \"r\" (op2), \"r\" (op3) );\n return(result);\n}\n\n#endif /* (__ARM_FEATURE_DSP == 1) */\n/*@} end of group CMSIS_SIMD_intrinsics */\n\n\n#pragma GCC diagnostic pop\n\n#endif /* __CMSIS_GCC_H */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/cmsis_version.h",
    "content": "/**************************************************************************//**\n * @file     cmsis_version.h\n * @brief    CMSIS Core(M) Version definitions\n * @version  V5.0.2\n * @date     19. April 2017\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2017 ARM Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#if   defined ( __ICCARM__ )\n  #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__clang__)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CMSIS_VERSION_H\n#define __CMSIS_VERSION_H\n\n/*  CMSIS Version definitions */\n#define __CM_CMSIS_VERSION_MAIN  ( 5U)                                      /*!< [31:16] CMSIS Core(M) main version */\n#define __CM_CMSIS_VERSION_SUB   ( 1U)                                      /*!< [15:0]  CMSIS Core(M) sub version */\n#define __CM_CMSIS_VERSION       ((__CM_CMSIS_VERSION_MAIN << 16U) | \\\n                                   __CM_CMSIS_VERSION_SUB           )       /*!< CMSIS Core(M) version number */\n#endif\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/core_cm0.h",
    "content": "/**************************************************************************//**\n * @file     core_cm0.h\n * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File\n * @version  V5.0.6\n * @date     13. March 2019\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2019 Arm Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /* Copyright (c) 2019 Modified by Dialog Semiconductor */\n\n#if   defined ( __ICCARM__ )\n  #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__clang__)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM0_H_GENERIC\n#define __CORE_CM0_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_M0\n  @{\n */\n\n#include \"cmsis_version.h\"\n\n/*  CMSIS CM0 definitions */\n#define __CM0_CMSIS_VERSION_MAIN  (__CM_CMSIS_VERSION_MAIN)              /*!< \\deprecated [31:16] CMSIS HAL main version */\n#define __CM0_CMSIS_VERSION_SUB   (__CM_CMSIS_VERSION_SUB)               /*!< \\deprecated [15:0]  CMSIS HAL sub version */\n#define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16U) | \\\n                                    __CM0_CMSIS_VERSION_SUB           )  /*!< \\deprecated CMSIS HAL version number */\n\n#define __CORTEX_M                (0U)                                   /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    This core does not support an FPU at all\n*/\n#define __FPU_USED       0U\n\n#if defined ( __CC_ARM )\n  #if defined __TARGET_FPU_VFP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined __ARM_FP\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined __ARMVFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined __TI_VFP_SUPPORT__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined __FPU_VFP__\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM0_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM0_H_DEPENDANT\n#define __CORE_CM0_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM0_REV\n    #define __CM0_REV               0x0000U\n    #warning \"__CM0_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          2U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex_M0 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:28;              /*!< bit:  0..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t _reserved1:3;               /*!< bit: 25..27  Reserved */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:1;               /*!< bit:      0  Reserved */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used */\n    uint32_t _reserved1:30;              /*!< bit:  2..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[1U];               /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[31U];\n  __IOM uint32_t ICER[1U];               /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RESERVED1[31U];\n  __IOM uint32_t ISPR[1U];               /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[31U];\n  __IOM uint32_t ICPR[1U];               /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[31U];\n        uint32_t RESERVED4[64U];\n  __IOM uint32_t IP[8U];                 /*!< Offset: 0x300 (R/W)  Interrupt Priority Register */\n}  NVIC_Type;\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n        uint32_t RESERVED0;\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n        uint32_t RESERVED1;\n  __IOM uint32_t SHP[2U];                /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_NMIPENDSET_Pos            31U                                            /*!< SCB ICSR: NMIPENDSET Position */\n#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_STKALIGN_Pos                9U                                            /*!< SCB CCR: STKALIGN Position */\n#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR) are only accessible over DAP and not via processor.\n            Therefore they are not covered by the Cortex-M0 header file.\n  @{\n */\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */\n#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address */\n#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address */\n#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */\n\n#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct */\n#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct */\n#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct */\n\n\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifdef CMSIS_NVIC_VIRTUAL\n  #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE\n    #define CMSIS_NVIC_VIRTUAL_HEADER_FILE \"cmsis_nvic_virtual.h\"\n  #endif\n  #include CMSIS_NVIC_VIRTUAL_HEADER_FILE\n#else\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n/*#define NVIC_GetActive              __NVIC_GetActive             not available for Cortex-M0 */\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n  #define NVIC_SystemReset            __NVIC_SystemReset\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifdef CMSIS_VECTAB_VIRTUAL\n  #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE\n    #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE \"cmsis_vectab_virtual.h\"\n  #endif\n  #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE\n#else\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n/* The following EXC_RETURN values are saved the LR on exception entry */\n#define EXC_RETURN_HANDLER         (0xFFFFFFF1UL)     /* return to Handler mode, uses MSP after return                               */\n#define EXC_RETURN_THREAD_MSP      (0xFFFFFFF9UL)     /* return to Thread mode, uses MSP after return                                */\n#define EXC_RETURN_THREAD_PSP      (0xFFFFFFFDUL)     /* return to Thread mode, uses PSP after return                                */\n\n\n/* Interrupt Priorities are WORD accessible only under Armv6-M                  */\n/* The following MACROS handle generation of the register offset and byte masks */\n#define _BIT_SHIFT(IRQn)         (  ((((uint32_t)(int32_t)(IRQn))         )      &  0x03UL) * 8UL)\n#define _SHP_IDX(IRQn)           ( (((((uint32_t)(int32_t)(IRQn)) & 0x0FUL)-8UL) >>    2UL)      )\n#define _IP_IDX(IRQn)            (   (((uint32_t)(int32_t)(IRQn))                >>    2UL)      )\n\n#define __NVIC_SetPriorityGrouping(X) (void)(X)\n#define __NVIC_GetPriorityGrouping()  (0U)\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[0U] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[0U] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IP[_IP_IDX(IRQn)]  = ((uint32_t)(NVIC->IP[_IP_IDX(IRQn)]  & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n  else\n  {\n    SCB->SHP[_SHP_IDX(IRQn)] = ((uint32_t)(SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFFUL << _BIT_SHIFT(IRQn))) |\n       (((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL) << _BIT_SHIFT(IRQn)));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & (uint32_t)0xFFUL) >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Encode Priority\n  \\details Encodes the priority for an interrupt with the given priority group,\n           preemptive priority value, and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\n  \\return                        Encoded priority. Value can be used in the function \\ref __NVIC_SetPriority().\n */\n__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  return (\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\n         );\n}\n\n\n/**\n  \\brief   Decode Priority\n  \\details Decodes an interrupt priority value with a given priority group to\n           preemptive priority value and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\n  \\param [in]          Priority  Priority value, which can be retrieved with the function \\ref __NVIC_GetPriority().\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\n */\n__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\n}\n\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           Address 0 must be mapped to SRAM.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t vectors = 0x0U;\n  (* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4)) = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t vectors = 0x0U;\n  return (uint32_t)(* (int *) (vectors + ((int32_t)IRQn + NVIC_USER_IRQ_OFFSET) * 4));\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = ((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                 SCB_AIRCR_SYSRESETREQ_Msk);\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n    return 0U;           /* No FPU */\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM0_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/core_cm33.h",
    "content": "/**************************************************************************//**\n * @file     core_cm33.h\n * @brief    CMSIS Cortex-M33 Core Peripheral Access Layer Header File\n * @version  V5.1.0\n * @date     12. November 2018\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2018 Arm Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /* Copyright (c) 2019 Modified by Dialog Semiconductor */\n\n#if   defined ( __ICCARM__ )\n  #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__clang__)\n  #pragma clang system_header   /* treat file as system include file */\n#endif\n\n#ifndef __CORE_CM33_H_GENERIC\n#define __CORE_CM33_H_GENERIC\n\n#include <stdint.h>\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/**\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\n  CMSIS violates the following MISRA-C:2004 rules:\n\n   \\li Required Rule 8.5, object/function definition in header file.<br>\n     Function definitions in header files are used to allow 'inlining'.\n\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\n     Unions are used for effective representation of core registers.\n\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\n     Function-like macros are used to allow more efficient code.\n */\n\n\n/*******************************************************************************\n *                 CMSIS definitions\n ******************************************************************************/\n/**\n  \\ingroup Cortex_M33\n  @{\n */\n\n#include \"cmsis_version.h\"\n\n/*  CMSIS CM33 definitions */\n#define __CM33_CMSIS_VERSION_MAIN  (__CM_CMSIS_VERSION_MAIN)                   /*!< \\deprecated [31:16] CMSIS HAL main version */\n#define __CM33_CMSIS_VERSION_SUB   (__CM_CMSIS_VERSION_SUB)                    /*!< \\deprecated [15:0]  CMSIS HAL sub version */\n#define __CM33_CMSIS_VERSION       ((__CM33_CMSIS_VERSION_MAIN << 16U) | \\\n                                     __CM33_CMSIS_VERSION_SUB           )      /*!< \\deprecated CMSIS HAL version number */\n\n#define __CORTEX_M                 (33U)                                       /*!< Cortex-M Core */\n\n/** __FPU_USED indicates whether an FPU is used or not.\n    For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions.\n*/\n#if defined ( __CC_ARM )\n  #if defined (__TARGET_FPU_VFP)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n  #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U)\n    #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U)\n      #define __DSP_USED       1U\n    #else\n      #error \"Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)\"\n      #define __DSP_USED         0U\n    #endif\n  #else\n    #define __DSP_USED         0U\n  #endif\n\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\n  #if defined (__ARM_FP)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #warning \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n  #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U)\n    #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U)\n      #define __DSP_USED       1U\n    #else\n      #error \"Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)\"\n      #define __DSP_USED         0U\n    #endif\n  #else\n    #define __DSP_USED         0U\n  #endif\n\n#elif defined ( __GNUC__ )\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n  #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U)\n    #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U)\n      #define __DSP_USED       1U\n    #else\n      #error \"Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)\"\n      #define __DSP_USED         0U\n    #endif\n  #else\n    #define __DSP_USED         0U\n  #endif\n\n#elif defined ( __ICCARM__ )\n  #if defined (__ARMVFP__)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n  #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U)\n    #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U)\n      #define __DSP_USED       1U\n    #else\n      #error \"Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)\"\n      #define __DSP_USED         0U\n    #endif\n  #else\n    #define __DSP_USED         0U\n  #endif\n\n#elif defined ( __TI_ARM__ )\n  #if defined (__TI_VFP_SUPPORT__)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __TASKING__ )\n  #if defined (__FPU_VFP__)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#elif defined ( __CSMC__ )\n  #if ( __CSMC__ & 0x400U)\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\n      #define __FPU_USED       1U\n    #else\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\n      #define __FPU_USED       0U\n    #endif\n  #else\n    #define __FPU_USED         0U\n  #endif\n\n#endif\n\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM33_H_GENERIC */\n\n#ifndef __CMSIS_GENERIC\n\n#ifndef __CORE_CM33_H_DEPENDANT\n#define __CORE_CM33_H_DEPENDANT\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/* check device defines and use defaults */\n#if defined __CHECK_DEVICE_DEFINES\n  #ifndef __CM33_REV\n    #define __CM33_REV                0x0000U\n    #warning \"__CM33_REV not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __FPU_PRESENT\n    #define __FPU_PRESENT             0U\n    #warning \"__FPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __MPU_PRESENT\n    #define __MPU_PRESENT             0U\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __SAUREGION_PRESENT\n    #define __SAUREGION_PRESENT       0U\n    #warning \"__SAUREGION_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __DSP_PRESENT\n    #define __DSP_PRESENT             0U\n    #warning \"__DSP_PRESENT not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __NVIC_PRIO_BITS\n    #define __NVIC_PRIO_BITS          3U\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\n  #endif\n\n  #ifndef __Vendor_SysTickConfig\n    #define __Vendor_SysTickConfig    0U\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\n  #endif\n#endif\n\n/* IO definitions (access restrictions to peripheral registers) */\n/**\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\n\n    <strong>IO Type Qualifiers</strong> are used\n    \\li to specify the access to peripheral variables.\n    \\li for automatic generation of peripheral register debug information.\n*/\n#ifdef __cplusplus\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\n#else\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\n#endif\n#define     __O     volatile             /*!< Defines 'write only' permissions */\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\n\n/* following defines should be used for structure members */\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\n\n/*@} end of group Cortex_M33 */\n\n\n\n/*******************************************************************************\n *                 Register Abstraction\n  Core Register contain:\n  - Core Register\n  - Core NVIC Register\n  - Core SCB Register\n  - Core SysTick Register\n  - Core Debug Register\n  - Core MPU Register\n  - Core SAU Register\n  - Core FPU Register\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_core_register Defines and Type Definitions\n  \\brief Type definitions and defines for Cortex-M processor based devices.\n*/\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_CORE  Status and Control Registers\n  \\brief      Core Register type definitions.\n  @{\n */\n\n/**\n  \\brief  Union type to access the Application Program Status Register (APSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} APSR_Type;\n\n/* APSR Register Definitions */\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\n\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\n\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\n\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\n\n#define APSR_Q_Pos                         27U                                            /*!< APSR: Q Position */\n#define APSR_Q_Msk                         (1UL << APSR_Q_Pos)                            /*!< APSR: Q Mask */\n\n#define APSR_GE_Pos                        16U                                            /*!< APSR: GE Position */\n#define APSR_GE_Msk                        (0xFUL << APSR_GE_Pos)                         /*!< APSR: GE Mask */\n\n\n/**\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} IPSR_Type;\n\n/* IPSR Register Definitions */\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\n    uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved */\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\n    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved */\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\n    uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0) */\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} xPSR_Type;\n\n/* xPSR Register Definitions */\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\n\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\n\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\n\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\n\n#define xPSR_Q_Pos                         27U                                            /*!< xPSR: Q Position */\n#define xPSR_Q_Msk                         (1UL << xPSR_Q_Pos)                            /*!< xPSR: Q Mask */\n\n#define xPSR_IT_Pos                        25U                                            /*!< xPSR: IT Position */\n#define xPSR_IT_Msk                        (3UL << xPSR_IT_Pos)                           /*!< xPSR: IT Mask */\n\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\n\n#define xPSR_GE_Pos                        16U                                            /*!< xPSR: GE Position */\n#define xPSR_GE_Msk                        (0xFUL << xPSR_GE_Pos)                         /*!< xPSR: GE Mask */\n\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\n\n\n/**\n  \\brief  Union type to access the Control Registers (CONTROL).\n */\ntypedef union\n{\n  struct\n  {\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack-pointer select */\n    uint32_t FPCA:1;                     /*!< bit:      2  Floating-point context active */\n    uint32_t SFPA:1;                     /*!< bit:      3  Secure floating-point active */\n    uint32_t _reserved1:28;              /*!< bit:  4..31  Reserved */\n  } b;                                   /*!< Structure used for bit  access */\n  uint32_t w;                            /*!< Type      used for word access */\n} CONTROL_Type;\n\n/* CONTROL Register Definitions */\n#define CONTROL_SFPA_Pos                    3U                                            /*!< CONTROL: SFPA Position */\n#define CONTROL_SFPA_Msk                   (1UL << CONTROL_SFPA_Pos)                      /*!< CONTROL: SFPA Mask */\n\n#define CONTROL_FPCA_Pos                    2U                                            /*!< CONTROL: FPCA Position */\n#define CONTROL_FPCA_Msk                   (1UL << CONTROL_FPCA_Pos)                      /*!< CONTROL: FPCA Mask */\n\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\n\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\n\n/*@} end of group CMSIS_CORE */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\n  \\brief      Type definitions for the NVIC Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\n */\ntypedef struct\n{\n  __IOM uint32_t ISER[16U];              /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\n        uint32_t RESERVED0[16U];\n  __IOM uint32_t ICER[16U];              /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\n        uint32_t RSERVED1[16U];\n  __IOM uint32_t ISPR[16U];              /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\n        uint32_t RESERVED2[16U];\n  __IOM uint32_t ICPR[16U];              /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\n        uint32_t RESERVED3[16U];\n  __IOM uint32_t IABR[16U];              /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\n        uint32_t RESERVED4[16U];\n  __IOM uint32_t ITNS[16U];              /*!< Offset: 0x280 (R/W)  Interrupt Non-Secure State Register */\n        uint32_t RESERVED5[16U];\n  __IOM uint8_t  IPR[496U];              /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */\n        uint32_t RESERVED6[580U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */\n}  NVIC_Type;\n\n/* Software Triggered Interrupt Register Definitions */\n#define NVIC_STIR_INTID_Pos                 0U                                         /*!< STIR: INTLINESNUM Position */\n#define NVIC_STIR_INTID_Msk                (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/)        /*!< STIR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_NVIC */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\n  \\brief    Type definitions for the System Control Block Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control Block (SCB).\n */\ntypedef struct\n{\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\n  __IOM uint8_t  SHPR[12U];              /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\n  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */\n  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */\n  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */\n  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */\n  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */\n  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */\n  __IM  uint32_t ID_PFR[2U];             /*!< Offset: 0x040 (R/ )  Processor Feature Register */\n  __IM  uint32_t ID_DFR;                 /*!< Offset: 0x048 (R/ )  Debug Feature Register */\n  __IM  uint32_t ID_ADR;                 /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */\n  __IM  uint32_t ID_MMFR[4U];            /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */\n  __IM  uint32_t ID_ISAR[6U];            /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */\n  __IM  uint32_t CLIDR;                  /*!< Offset: 0x078 (R/ )  Cache Level ID register */\n  __IM  uint32_t CTR;                    /*!< Offset: 0x07C (R/ )  Cache Type register */\n  __IM  uint32_t CCSIDR;                 /*!< Offset: 0x080 (R/ )  Cache Size ID Register */\n  __IOM uint32_t CSSELR;                 /*!< Offset: 0x084 (R/W)  Cache Size Selection Register */\n  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */\n  __IOM uint32_t NSACR;                  /*!< Offset: 0x08C (R/W)  Non-Secure Access Control Register */\n        uint32_t RESERVED3[92U];\n  __OM  uint32_t STIR;                   /*!< Offset: 0x200 ( /W)  Software Triggered Interrupt Register */\n        uint32_t RESERVED4[15U];\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x240 (R/ )  Media and VFP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x244 (R/ )  Media and VFP Feature Register 1 */\n  __IM  uint32_t MVFR2;                  /*!< Offset: 0x248 (R/ )  Media and VFP Feature Register 2 */\n        uint32_t RESERVED5[1U];\n  __OM  uint32_t ICIALLU;                /*!< Offset: 0x250 ( /W)  I-Cache Invalidate All to PoU */\n        uint32_t RESERVED6[1U];\n  __OM  uint32_t ICIMVAU;                /*!< Offset: 0x258 ( /W)  I-Cache Invalidate by MVA to PoU */\n  __OM  uint32_t DCIMVAC;                /*!< Offset: 0x25C ( /W)  D-Cache Invalidate by MVA to PoC */\n  __OM  uint32_t DCISW;                  /*!< Offset: 0x260 ( /W)  D-Cache Invalidate by Set-way */\n  __OM  uint32_t DCCMVAU;                /*!< Offset: 0x264 ( /W)  D-Cache Clean by MVA to PoU */\n  __OM  uint32_t DCCMVAC;                /*!< Offset: 0x268 ( /W)  D-Cache Clean by MVA to PoC */\n  __OM  uint32_t DCCSW;                  /*!< Offset: 0x26C ( /W)  D-Cache Clean by Set-way */\n  __OM  uint32_t DCCIMVAC;               /*!< Offset: 0x270 ( /W)  D-Cache Clean and Invalidate by MVA to PoC */\n  __OM  uint32_t DCCISW;                 /*!< Offset: 0x274 ( /W)  D-Cache Clean and Invalidate by Set-way */\n} SCB_Type;\n\n/* SCB CPUID Register Definitions */\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\n\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\n\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\n\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\n\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\n\n/* SCB Interrupt Control State Register Definitions */\n#define SCB_ICSR_PENDNMISET_Pos            31U                                            /*!< SCB ICSR: PENDNMISET Position */\n#define SCB_ICSR_PENDNMISET_Msk            (1UL << SCB_ICSR_PENDNMISET_Pos)               /*!< SCB ICSR: PENDNMISET Mask */\n\n#define SCB_ICSR_NMIPENDSET_Pos            SCB_ICSR_PENDNMISET_Pos                        /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */\n#define SCB_ICSR_NMIPENDSET_Msk            SCB_ICSR_PENDNMISET_Msk                        /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */\n\n#define SCB_ICSR_PENDNMICLR_Pos            30U                                            /*!< SCB ICSR: PENDNMICLR Position */\n#define SCB_ICSR_PENDNMICLR_Msk            (1UL << SCB_ICSR_PENDNMICLR_Pos)               /*!< SCB ICSR: PENDNMICLR Mask */\n\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\n\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\n\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\n\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\n\n#define SCB_ICSR_STTNS_Pos                 24U                                            /*!< SCB ICSR: STTNS Position (Security Extension) */\n#define SCB_ICSR_STTNS_Msk                 (1UL << SCB_ICSR_STTNS_Pos)                    /*!< SCB ICSR: STTNS Mask (Security Extension) */\n\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\n\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\n\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\n\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\n\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\n\n/* SCB Vector Table Offset Register Definitions */\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\n\n/* SCB Application Interrupt and Reset Control Register Definitions */\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\n\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\n\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\n\n#define SCB_AIRCR_PRIS_Pos                 14U                                            /*!< SCB AIRCR: PRIS Position */\n#define SCB_AIRCR_PRIS_Msk                 (1UL << SCB_AIRCR_PRIS_Pos)                    /*!< SCB AIRCR: PRIS Mask */\n\n#define SCB_AIRCR_BFHFNMINS_Pos            13U                                            /*!< SCB AIRCR: BFHFNMINS Position */\n#define SCB_AIRCR_BFHFNMINS_Msk            (1UL << SCB_AIRCR_BFHFNMINS_Pos)               /*!< SCB AIRCR: BFHFNMINS Mask */\n\n#define SCB_AIRCR_PRIGROUP_Pos              8U                                            /*!< SCB AIRCR: PRIGROUP Position */\n#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */\n\n#define SCB_AIRCR_SYSRESETREQS_Pos          3U                                            /*!< SCB AIRCR: SYSRESETREQS Position */\n#define SCB_AIRCR_SYSRESETREQS_Msk         (1UL << SCB_AIRCR_SYSRESETREQS_Pos)            /*!< SCB AIRCR: SYSRESETREQS Mask */\n\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\n\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\n\n/* SCB System Control Register Definitions */\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\n\n#define SCB_SCR_SLEEPDEEPS_Pos              3U                                            /*!< SCB SCR: SLEEPDEEPS Position */\n#define SCB_SCR_SLEEPDEEPS_Msk             (1UL << SCB_SCR_SLEEPDEEPS_Pos)                /*!< SCB SCR: SLEEPDEEPS Mask */\n\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\n\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\n\n/* SCB Configuration Control Register Definitions */\n#define SCB_CCR_BP_Pos                     18U                                            /*!< SCB CCR: BP Position */\n#define SCB_CCR_BP_Msk                     (1UL << SCB_CCR_BP_Pos)                        /*!< SCB CCR: BP Mask */\n\n#define SCB_CCR_IC_Pos                     17U                                            /*!< SCB CCR: IC Position */\n#define SCB_CCR_IC_Msk                     (1UL << SCB_CCR_IC_Pos)                        /*!< SCB CCR: IC Mask */\n\n#define SCB_CCR_DC_Pos                     16U                                            /*!< SCB CCR: DC Position */\n#define SCB_CCR_DC_Msk                     (1UL << SCB_CCR_DC_Pos)                        /*!< SCB CCR: DC Mask */\n\n#define SCB_CCR_STKOFHFNMIGN_Pos           10U                                            /*!< SCB CCR: STKOFHFNMIGN Position */\n#define SCB_CCR_STKOFHFNMIGN_Msk           (1UL << SCB_CCR_STKOFHFNMIGN_Pos)              /*!< SCB CCR: STKOFHFNMIGN Mask */\n\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\n\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\n\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\n\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\n\n/* SCB System Handler Control and State Register Definitions */\n#define SCB_SHCSR_HARDFAULTPENDED_Pos      21U                                            /*!< SCB SHCSR: HARDFAULTPENDED Position */\n#define SCB_SHCSR_HARDFAULTPENDED_Msk      (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos)         /*!< SCB SHCSR: HARDFAULTPENDED Mask */\n\n#define SCB_SHCSR_SECUREFAULTPENDED_Pos    20U                                            /*!< SCB SHCSR: SECUREFAULTPENDED Position */\n#define SCB_SHCSR_SECUREFAULTPENDED_Msk    (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos)       /*!< SCB SHCSR: SECUREFAULTPENDED Mask */\n\n#define SCB_SHCSR_SECUREFAULTENA_Pos       19U                                            /*!< SCB SHCSR: SECUREFAULTENA Position */\n#define SCB_SHCSR_SECUREFAULTENA_Msk       (1UL << SCB_SHCSR_SECUREFAULTENA_Pos)          /*!< SCB SHCSR: SECUREFAULTENA Mask */\n\n#define SCB_SHCSR_USGFAULTENA_Pos          18U                                            /*!< SCB SHCSR: USGFAULTENA Position */\n#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */\n\n#define SCB_SHCSR_BUSFAULTENA_Pos          17U                                            /*!< SCB SHCSR: BUSFAULTENA Position */\n#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */\n\n#define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */\n#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */\n\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\n\n#define SCB_SHCSR_BUSFAULTPENDED_Pos       14U                                            /*!< SCB SHCSR: BUSFAULTPENDED Position */\n#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */\n\n#define SCB_SHCSR_MEMFAULTPENDED_Pos       13U                                            /*!< SCB SHCSR: MEMFAULTPENDED Position */\n#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */\n\n#define SCB_SHCSR_USGFAULTPENDED_Pos       12U                                            /*!< SCB SHCSR: USGFAULTPENDED Position */\n#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */\n\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\n\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\n\n#define SCB_SHCSR_MONITORACT_Pos            8U                                            /*!< SCB SHCSR: MONITORACT Position */\n#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */\n\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\n\n#define SCB_SHCSR_NMIACT_Pos                5U                                            /*!< SCB SHCSR: NMIACT Position */\n#define SCB_SHCSR_NMIACT_Msk               (1UL << SCB_SHCSR_NMIACT_Pos)                  /*!< SCB SHCSR: NMIACT Mask */\n\n#define SCB_SHCSR_SECUREFAULTACT_Pos        4U                                            /*!< SCB SHCSR: SECUREFAULTACT Position */\n#define SCB_SHCSR_SECUREFAULTACT_Msk       (1UL << SCB_SHCSR_SECUREFAULTACT_Pos)          /*!< SCB SHCSR: SECUREFAULTACT Mask */\n\n#define SCB_SHCSR_USGFAULTACT_Pos           3U                                            /*!< SCB SHCSR: USGFAULTACT Position */\n#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */\n\n#define SCB_SHCSR_HARDFAULTACT_Pos          2U                                            /*!< SCB SHCSR: HARDFAULTACT Position */\n#define SCB_SHCSR_HARDFAULTACT_Msk         (1UL << SCB_SHCSR_HARDFAULTACT_Pos)            /*!< SCB SHCSR: HARDFAULTACT Mask */\n\n#define SCB_SHCSR_BUSFAULTACT_Pos           1U                                            /*!< SCB SHCSR: BUSFAULTACT Position */\n#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */\n\n#define SCB_SHCSR_MEMFAULTACT_Pos           0U                                            /*!< SCB SHCSR: MEMFAULTACT Position */\n#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/)         /*!< SCB SHCSR: MEMFAULTACT Mask */\n\n/* SCB Configurable Fault Status Register Definitions */\n#define SCB_CFSR_USGFAULTSR_Pos            16U                                            /*!< SCB CFSR: Usage Fault Status Register Position */\n#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */\n\n#define SCB_CFSR_BUSFAULTSR_Pos             8U                                            /*!< SCB CFSR: Bus Fault Status Register Position */\n#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */\n\n#define SCB_CFSR_MEMFAULTSR_Pos             0U                                            /*!< SCB CFSR: Memory Manage Fault Status Register Position */\n#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/)        /*!< SCB CFSR: Memory Manage Fault Status Register Mask */\n\n/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_MMARVALID_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 7U)               /*!< SCB CFSR (MMFSR): MMARVALID Position */\n#define SCB_CFSR_MMARVALID_Msk             (1UL << SCB_CFSR_MMARVALID_Pos)                /*!< SCB CFSR (MMFSR): MMARVALID Mask */\n\n#define SCB_CFSR_MLSPERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 5U)               /*!< SCB CFSR (MMFSR): MLSPERR Position */\n#define SCB_CFSR_MLSPERR_Msk               (1UL << SCB_CFSR_MLSPERR_Pos)                  /*!< SCB CFSR (MMFSR): MLSPERR Mask */\n\n#define SCB_CFSR_MSTKERR_Pos               (SCB_SHCSR_MEMFAULTACT_Pos + 4U)               /*!< SCB CFSR (MMFSR): MSTKERR Position */\n#define SCB_CFSR_MSTKERR_Msk               (1UL << SCB_CFSR_MSTKERR_Pos)                  /*!< SCB CFSR (MMFSR): MSTKERR Mask */\n\n#define SCB_CFSR_MUNSTKERR_Pos             (SCB_SHCSR_MEMFAULTACT_Pos + 3U)               /*!< SCB CFSR (MMFSR): MUNSTKERR Position */\n#define SCB_CFSR_MUNSTKERR_Msk             (1UL << SCB_CFSR_MUNSTKERR_Pos)                /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */\n\n#define SCB_CFSR_DACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 1U)               /*!< SCB CFSR (MMFSR): DACCVIOL Position */\n#define SCB_CFSR_DACCVIOL_Msk              (1UL << SCB_CFSR_DACCVIOL_Pos)                 /*!< SCB CFSR (MMFSR): DACCVIOL Mask */\n\n#define SCB_CFSR_IACCVIOL_Pos              (SCB_SHCSR_MEMFAULTACT_Pos + 0U)               /*!< SCB CFSR (MMFSR): IACCVIOL Position */\n#define SCB_CFSR_IACCVIOL_Msk              (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/)             /*!< SCB CFSR (MMFSR): IACCVIOL Mask */\n\n/* BusFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_BFARVALID_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 7U)                  /*!< SCB CFSR (BFSR): BFARVALID Position */\n#define SCB_CFSR_BFARVALID_Msk            (1UL << SCB_CFSR_BFARVALID_Pos)                 /*!< SCB CFSR (BFSR): BFARVALID Mask */\n\n#define SCB_CFSR_LSPERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 5U)                  /*!< SCB CFSR (BFSR): LSPERR Position */\n#define SCB_CFSR_LSPERR_Msk               (1UL << SCB_CFSR_LSPERR_Pos)                    /*!< SCB CFSR (BFSR): LSPERR Mask */\n\n#define SCB_CFSR_STKERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 4U)                  /*!< SCB CFSR (BFSR): STKERR Position */\n#define SCB_CFSR_STKERR_Msk               (1UL << SCB_CFSR_STKERR_Pos)                    /*!< SCB CFSR (BFSR): STKERR Mask */\n\n#define SCB_CFSR_UNSTKERR_Pos             (SCB_CFSR_BUSFAULTSR_Pos + 3U)                  /*!< SCB CFSR (BFSR): UNSTKERR Position */\n#define SCB_CFSR_UNSTKERR_Msk             (1UL << SCB_CFSR_UNSTKERR_Pos)                  /*!< SCB CFSR (BFSR): UNSTKERR Mask */\n\n#define SCB_CFSR_IMPRECISERR_Pos          (SCB_CFSR_BUSFAULTSR_Pos + 2U)                  /*!< SCB CFSR (BFSR): IMPRECISERR Position */\n#define SCB_CFSR_IMPRECISERR_Msk          (1UL << SCB_CFSR_IMPRECISERR_Pos)               /*!< SCB CFSR (BFSR): IMPRECISERR Mask */\n\n#define SCB_CFSR_PRECISERR_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 1U)                  /*!< SCB CFSR (BFSR): PRECISERR Position */\n#define SCB_CFSR_PRECISERR_Msk            (1UL << SCB_CFSR_PRECISERR_Pos)                 /*!< SCB CFSR (BFSR): PRECISERR Mask */\n\n#define SCB_CFSR_IBUSERR_Pos              (SCB_CFSR_BUSFAULTSR_Pos + 0U)                  /*!< SCB CFSR (BFSR): IBUSERR Position */\n#define SCB_CFSR_IBUSERR_Msk              (1UL << SCB_CFSR_IBUSERR_Pos)                   /*!< SCB CFSR (BFSR): IBUSERR Mask */\n\n/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */\n#define SCB_CFSR_DIVBYZERO_Pos            (SCB_CFSR_USGFAULTSR_Pos + 9U)                  /*!< SCB CFSR (UFSR): DIVBYZERO Position */\n#define SCB_CFSR_DIVBYZERO_Msk            (1UL << SCB_CFSR_DIVBYZERO_Pos)                 /*!< SCB CFSR (UFSR): DIVBYZERO Mask */\n\n#define SCB_CFSR_UNALIGNED_Pos            (SCB_CFSR_USGFAULTSR_Pos + 8U)                  /*!< SCB CFSR (UFSR): UNALIGNED Position */\n#define SCB_CFSR_UNALIGNED_Msk            (1UL << SCB_CFSR_UNALIGNED_Pos)                 /*!< SCB CFSR (UFSR): UNALIGNED Mask */\n\n#define SCB_CFSR_STKOF_Pos                (SCB_CFSR_USGFAULTSR_Pos + 4U)                  /*!< SCB CFSR (UFSR): STKOF Position */\n#define SCB_CFSR_STKOF_Msk                (1UL << SCB_CFSR_STKOF_Pos)                     /*!< SCB CFSR (UFSR): STKOF Mask */\n\n#define SCB_CFSR_NOCP_Pos                 (SCB_CFSR_USGFAULTSR_Pos + 3U)                  /*!< SCB CFSR (UFSR): NOCP Position */\n#define SCB_CFSR_NOCP_Msk                 (1UL << SCB_CFSR_NOCP_Pos)                      /*!< SCB CFSR (UFSR): NOCP Mask */\n\n#define SCB_CFSR_INVPC_Pos                (SCB_CFSR_USGFAULTSR_Pos + 2U)                  /*!< SCB CFSR (UFSR): INVPC Position */\n#define SCB_CFSR_INVPC_Msk                (1UL << SCB_CFSR_INVPC_Pos)                     /*!< SCB CFSR (UFSR): INVPC Mask */\n\n#define SCB_CFSR_INVSTATE_Pos             (SCB_CFSR_USGFAULTSR_Pos + 1U)                  /*!< SCB CFSR (UFSR): INVSTATE Position */\n#define SCB_CFSR_INVSTATE_Msk             (1UL << SCB_CFSR_INVSTATE_Pos)                  /*!< SCB CFSR (UFSR): INVSTATE Mask */\n\n#define SCB_CFSR_UNDEFINSTR_Pos           (SCB_CFSR_USGFAULTSR_Pos + 0U)                  /*!< SCB CFSR (UFSR): UNDEFINSTR Position */\n#define SCB_CFSR_UNDEFINSTR_Msk           (1UL << SCB_CFSR_UNDEFINSTR_Pos)                /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */\n\n/* SCB Hard Fault Status Register Definitions */\n#define SCB_HFSR_DEBUGEVT_Pos              31U                                            /*!< SCB HFSR: DEBUGEVT Position */\n#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */\n\n#define SCB_HFSR_FORCED_Pos                30U                                            /*!< SCB HFSR: FORCED Position */\n#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */\n\n#define SCB_HFSR_VECTTBL_Pos                1U                                            /*!< SCB HFSR: VECTTBL Position */\n#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */\n\n/* SCB Debug Fault Status Register Definitions */\n#define SCB_DFSR_EXTERNAL_Pos               4U                                            /*!< SCB DFSR: EXTERNAL Position */\n#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */\n\n#define SCB_DFSR_VCATCH_Pos                 3U                                            /*!< SCB DFSR: VCATCH Position */\n#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */\n\n#define SCB_DFSR_DWTTRAP_Pos                2U                                            /*!< SCB DFSR: DWTTRAP Position */\n#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */\n\n#define SCB_DFSR_BKPT_Pos                   1U                                            /*!< SCB DFSR: BKPT Position */\n#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */\n\n#define SCB_DFSR_HALTED_Pos                 0U                                            /*!< SCB DFSR: HALTED Position */\n#define SCB_DFSR_HALTED_Msk                (1UL /*<< SCB_DFSR_HALTED_Pos*/)               /*!< SCB DFSR: HALTED Mask */\n\n/* SCB Non-Secure Access Control Register Definitions */\n#define SCB_NSACR_CP11_Pos                 11U                                            /*!< SCB NSACR: CP11 Position */\n#define SCB_NSACR_CP11_Msk                 (1UL << SCB_NSACR_CP11_Pos)                    /*!< SCB NSACR: CP11 Mask */\n\n#define SCB_NSACR_CP10_Pos                 10U                                            /*!< SCB NSACR: CP10 Position */\n#define SCB_NSACR_CP10_Msk                 (1UL << SCB_NSACR_CP10_Pos)                    /*!< SCB NSACR: CP10 Mask */\n\n#define SCB_NSACR_CPn_Pos                   0U                                            /*!< SCB NSACR: CPn Position */\n#define SCB_NSACR_CPn_Msk                  (1UL /*<< SCB_NSACR_CPn_Pos*/)                 /*!< SCB NSACR: CPn Mask */\n\n/* SCB Cache Level ID Register Definitions */\n#define SCB_CLIDR_LOUU_Pos                 27U                                            /*!< SCB CLIDR: LoUU Position */\n#define SCB_CLIDR_LOUU_Msk                 (7UL << SCB_CLIDR_LOUU_Pos)                    /*!< SCB CLIDR: LoUU Mask */\n\n#define SCB_CLIDR_LOC_Pos                  24U                                            /*!< SCB CLIDR: LoC Position */\n#define SCB_CLIDR_LOC_Msk                  (7UL << SCB_CLIDR_LOC_Pos)                     /*!< SCB CLIDR: LoC Mask */\n\n/* SCB Cache Type Register Definitions */\n#define SCB_CTR_FORMAT_Pos                 29U                                            /*!< SCB CTR: Format Position */\n#define SCB_CTR_FORMAT_Msk                 (7UL << SCB_CTR_FORMAT_Pos)                    /*!< SCB CTR: Format Mask */\n\n#define SCB_CTR_CWG_Pos                    24U                                            /*!< SCB CTR: CWG Position */\n#define SCB_CTR_CWG_Msk                    (0xFUL << SCB_CTR_CWG_Pos)                     /*!< SCB CTR: CWG Mask */\n\n#define SCB_CTR_ERG_Pos                    20U                                            /*!< SCB CTR: ERG Position */\n#define SCB_CTR_ERG_Msk                    (0xFUL << SCB_CTR_ERG_Pos)                     /*!< SCB CTR: ERG Mask */\n\n#define SCB_CTR_DMINLINE_Pos               16U                                            /*!< SCB CTR: DminLine Position */\n#define SCB_CTR_DMINLINE_Msk               (0xFUL << SCB_CTR_DMINLINE_Pos)                /*!< SCB CTR: DminLine Mask */\n\n#define SCB_CTR_IMINLINE_Pos                0U                                            /*!< SCB CTR: ImInLine Position */\n#define SCB_CTR_IMINLINE_Msk               (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/)            /*!< SCB CTR: ImInLine Mask */\n\n/* SCB Cache Size ID Register Definitions */\n#define SCB_CCSIDR_WT_Pos                  31U                                            /*!< SCB CCSIDR: WT Position */\n#define SCB_CCSIDR_WT_Msk                  (1UL << SCB_CCSIDR_WT_Pos)                     /*!< SCB CCSIDR: WT Mask */\n\n#define SCB_CCSIDR_WB_Pos                  30U                                            /*!< SCB CCSIDR: WB Position */\n#define SCB_CCSIDR_WB_Msk                  (1UL << SCB_CCSIDR_WB_Pos)                     /*!< SCB CCSIDR: WB Mask */\n\n#define SCB_CCSIDR_RA_Pos                  29U                                            /*!< SCB CCSIDR: RA Position */\n#define SCB_CCSIDR_RA_Msk                  (1UL << SCB_CCSIDR_RA_Pos)                     /*!< SCB CCSIDR: RA Mask */\n\n#define SCB_CCSIDR_WA_Pos                  28U                                            /*!< SCB CCSIDR: WA Position */\n#define SCB_CCSIDR_WA_Msk                  (1UL << SCB_CCSIDR_WA_Pos)                     /*!< SCB CCSIDR: WA Mask */\n\n#define SCB_CCSIDR_NUMSETS_Pos             13U                                            /*!< SCB CCSIDR: NumSets Position */\n#define SCB_CCSIDR_NUMSETS_Msk             (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos)           /*!< SCB CCSIDR: NumSets Mask */\n\n#define SCB_CCSIDR_ASSOCIATIVITY_Pos        3U                                            /*!< SCB CCSIDR: Associativity Position */\n#define SCB_CCSIDR_ASSOCIATIVITY_Msk       (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos)      /*!< SCB CCSIDR: Associativity Mask */\n\n#define SCB_CCSIDR_LINESIZE_Pos             0U                                            /*!< SCB CCSIDR: LineSize Position */\n#define SCB_CCSIDR_LINESIZE_Msk            (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/)           /*!< SCB CCSIDR: LineSize Mask */\n\n/* SCB Cache Size Selection Register Definitions */\n#define SCB_CSSELR_LEVEL_Pos                1U                                            /*!< SCB CSSELR: Level Position */\n#define SCB_CSSELR_LEVEL_Msk               (7UL << SCB_CSSELR_LEVEL_Pos)                  /*!< SCB CSSELR: Level Mask */\n\n#define SCB_CSSELR_IND_Pos                  0U                                            /*!< SCB CSSELR: InD Position */\n#define SCB_CSSELR_IND_Msk                 (1UL /*<< SCB_CSSELR_IND_Pos*/)                /*!< SCB CSSELR: InD Mask */\n\n/* SCB Software Triggered Interrupt Register Definitions */\n#define SCB_STIR_INTID_Pos                  0U                                            /*!< SCB STIR: INTID Position */\n#define SCB_STIR_INTID_Msk                 (0x1FFUL /*<< SCB_STIR_INTID_Pos*/)            /*!< SCB STIR: INTID Mask */\n\n/* SCB D-Cache Invalidate by Set-way Register Definitions */\n#define SCB_DCISW_WAY_Pos                  30U                                            /*!< SCB DCISW: Way Position */\n#define SCB_DCISW_WAY_Msk                  (3UL << SCB_DCISW_WAY_Pos)                     /*!< SCB DCISW: Way Mask */\n\n#define SCB_DCISW_SET_Pos                   5U                                            /*!< SCB DCISW: Set Position */\n#define SCB_DCISW_SET_Msk                  (0x1FFUL << SCB_DCISW_SET_Pos)                 /*!< SCB DCISW: Set Mask */\n\n/* SCB D-Cache Clean by Set-way Register Definitions */\n#define SCB_DCCSW_WAY_Pos                  30U                                            /*!< SCB DCCSW: Way Position */\n#define SCB_DCCSW_WAY_Msk                  (3UL << SCB_DCCSW_WAY_Pos)                     /*!< SCB DCCSW: Way Mask */\n\n#define SCB_DCCSW_SET_Pos                   5U                                            /*!< SCB DCCSW: Set Position */\n#define SCB_DCCSW_SET_Msk                  (0x1FFUL << SCB_DCCSW_SET_Pos)                 /*!< SCB DCCSW: Set Mask */\n\n/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */\n#define SCB_DCCISW_WAY_Pos                 30U                                            /*!< SCB DCCISW: Way Position */\n#define SCB_DCCISW_WAY_Msk                 (3UL << SCB_DCCISW_WAY_Pos)                    /*!< SCB DCCISW: Way Mask */\n\n#define SCB_DCCISW_SET_Pos                  5U                                            /*!< SCB DCCISW: Set Position */\n#define SCB_DCCISW_SET_Msk                 (0x1FFUL << SCB_DCCISW_SET_Pos)                /*!< SCB DCCISW: Set Mask */\n\n/*@} end of group CMSIS_SCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IM  uint32_t ICTR;                   /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register */\n  __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */\n  __IOM uint32_t CPPWR;                  /*!< Offset: 0x00C (R/W)  Coprocessor Power Control  Register */\n} SCnSCB_Type;\n\n/* Interrupt Controller Type Register Definitions */\n#define SCnSCB_ICTR_INTLINESNUM_Pos         0U                                         /*!< ICTR: INTLINESNUM Position */\n#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/)  /*!< ICTR: INTLINESNUM Mask */\n\n/*@} end of group CMSIS_SCnotSCB */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\n  \\brief    Type definitions for the System Timer Registers.\n  @{\n */\n\n/**\n  \\brief  Structure type to access the System Timer (SysTick).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\n} SysTick_Type;\n\n/* SysTick Control / Status Register Definitions */\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\n\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\n\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\n\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\n\n/* SysTick Reload Register Definitions */\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\n\n/* SysTick Current Register Definitions */\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\n\n/* SysTick Calibration Register Definitions */\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\n\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\n\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\n\n/*@} end of group CMSIS_SysTick */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)\n  \\brief    Type definitions for the Instrumentation Trace Macrocell (ITM)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).\n */\ntypedef struct\n{\n  __OM  union\n  {\n    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */\n    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */\n    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */\n  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */\n        uint32_t RESERVED0[864U];\n  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */\n        uint32_t RESERVED1[15U];\n  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */\n        uint32_t RESERVED2[15U];\n  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */\n        uint32_t RESERVED3[32U];\n        uint32_t RESERVED4[43U];\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */\n        uint32_t RESERVED5[1U];\n  __IM  uint32_t DEVARCH;                /*!< Offset: 0xFBC (R/ )  ITM Device Architecture Register */\n        uint32_t RESERVED6[4U];\n  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */\n  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */\n  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */\n  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */\n  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */\n  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */\n  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */\n  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */\n  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */\n  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */\n  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */\n  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */\n} ITM_Type;\n\n/* ITM Stimulus Port Register Definitions */\n#define ITM_STIM_DISABLED_Pos               1U                                            /*!< ITM STIM: DISABLED Position */\n#define ITM_STIM_DISABLED_Msk              (0x1UL << ITM_STIM_DISABLED_Pos)               /*!< ITM STIM: DISABLED Mask */\n\n#define ITM_STIM_FIFOREADY_Pos              0U                                            /*!< ITM STIM: FIFOREADY Position */\n#define ITM_STIM_FIFOREADY_Msk             (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/)          /*!< ITM STIM: FIFOREADY Mask */\n\n/* ITM Trace Privilege Register Definitions */\n#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */\n#define ITM_TPR_PRIVMASK_Msk               (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/)     /*!< ITM TPR: PRIVMASK Mask */\n\n/* ITM Trace Control Register Definitions */\n#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */\n#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */\n\n#define ITM_TCR_TRACEBUSID_Pos             16U                                            /*!< ITM TCR: ATBID Position */\n#define ITM_TCR_TRACEBUSID_Msk             (0x7FUL << ITM_TCR_TRACEBUSID_Pos)             /*!< ITM TCR: ATBID Mask */\n\n#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */\n#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */\n\n#define ITM_TCR_TSPRESCALE_Pos              8U                                            /*!< ITM TCR: TSPRESCALE Position */\n#define ITM_TCR_TSPRESCALE_Msk             (3UL << ITM_TCR_TSPRESCALE_Pos)                /*!< ITM TCR: TSPRESCALE Mask */\n\n#define ITM_TCR_STALLENA_Pos                5U                                            /*!< ITM TCR: STALLENA Position */\n#define ITM_TCR_STALLENA_Msk               (1UL << ITM_TCR_STALLENA_Pos)                  /*!< ITM TCR: STALLENA Mask */\n\n#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */\n#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */\n\n#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */\n#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */\n\n#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */\n#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */\n\n#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */\n#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */\n\n#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */\n#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */\n\n/* ITM Lock Status Register Definitions */\n#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */\n#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */\n\n#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */\n#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */\n\n#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */\n#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */\n\n/*@}*/ /* end of group CMSIS_ITM */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\n  __IOM uint32_t CYCCNT;                 /*!< Offset: 0x004 (R/W)  Cycle Count Register */\n  __IOM uint32_t CPICNT;                 /*!< Offset: 0x008 (R/W)  CPI Count Register */\n  __IOM uint32_t EXCCNT;                 /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register */\n  __IOM uint32_t SLEEPCNT;               /*!< Offset: 0x010 (R/W)  Sleep Count Register */\n  __IOM uint32_t LSUCNT;                 /*!< Offset: 0x014 (R/W)  LSU Count Register */\n  __IOM uint32_t FOLDCNT;                /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register */\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\n        uint32_t RESERVED1[1U];\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\n        uint32_t RESERVED2[1U];\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\n        uint32_t RESERVED3[1U];\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\n        uint32_t RESERVED5[1U];\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\n        uint32_t RESERVED6[1U];\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\n        uint32_t RESERVED7[1U];\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\n        uint32_t RESERVED8[1U];\n  __IOM uint32_t COMP4;                  /*!< Offset: 0x060 (R/W)  Comparator Register 4 */\n        uint32_t RESERVED9[1U];\n  __IOM uint32_t FUNCTION4;              /*!< Offset: 0x068 (R/W)  Function Register 4 */\n        uint32_t RESERVED10[1U];\n  __IOM uint32_t COMP5;                  /*!< Offset: 0x070 (R/W)  Comparator Register 5 */\n        uint32_t RESERVED11[1U];\n  __IOM uint32_t FUNCTION5;              /*!< Offset: 0x078 (R/W)  Function Register 5 */\n        uint32_t RESERVED12[1U];\n  __IOM uint32_t COMP6;                  /*!< Offset: 0x080 (R/W)  Comparator Register 6 */\n        uint32_t RESERVED13[1U];\n  __IOM uint32_t FUNCTION6;              /*!< Offset: 0x088 (R/W)  Function Register 6 */\n        uint32_t RESERVED14[1U];\n  __IOM uint32_t COMP7;                  /*!< Offset: 0x090 (R/W)  Comparator Register 7 */\n        uint32_t RESERVED15[1U];\n  __IOM uint32_t FUNCTION7;              /*!< Offset: 0x098 (R/W)  Function Register 7 */\n        uint32_t RESERVED16[1U];\n  __IOM uint32_t COMP8;                  /*!< Offset: 0x0A0 (R/W)  Comparator Register 8 */\n        uint32_t RESERVED17[1U];\n  __IOM uint32_t FUNCTION8;              /*!< Offset: 0x0A8 (R/W)  Function Register 8 */\n        uint32_t RESERVED18[1U];\n  __IOM uint32_t COMP9;                  /*!< Offset: 0x0B0 (R/W)  Comparator Register 9 */\n        uint32_t RESERVED19[1U];\n  __IOM uint32_t FUNCTION9;              /*!< Offset: 0x0B8 (R/W)  Function Register 9 */\n        uint32_t RESERVED20[1U];\n  __IOM uint32_t COMP10;                 /*!< Offset: 0x0C0 (R/W)  Comparator Register 10 */\n        uint32_t RESERVED21[1U];\n  __IOM uint32_t FUNCTION10;             /*!< Offset: 0x0C8 (R/W)  Function Register 10 */\n        uint32_t RESERVED22[1U];\n  __IOM uint32_t COMP11;                 /*!< Offset: 0x0D0 (R/W)  Comparator Register 11 */\n        uint32_t RESERVED23[1U];\n  __IOM uint32_t FUNCTION11;             /*!< Offset: 0x0D8 (R/W)  Function Register 11 */\n        uint32_t RESERVED24[1U];\n  __IOM uint32_t COMP12;                 /*!< Offset: 0x0E0 (R/W)  Comparator Register 12 */\n        uint32_t RESERVED25[1U];\n  __IOM uint32_t FUNCTION12;             /*!< Offset: 0x0E8 (R/W)  Function Register 12 */\n        uint32_t RESERVED26[1U];\n  __IOM uint32_t COMP13;                 /*!< Offset: 0x0F0 (R/W)  Comparator Register 13 */\n        uint32_t RESERVED27[1U];\n  __IOM uint32_t FUNCTION13;             /*!< Offset: 0x0F8 (R/W)  Function Register 13 */\n        uint32_t RESERVED28[1U];\n  __IOM uint32_t COMP14;                 /*!< Offset: 0x100 (R/W)  Comparator Register 14 */\n        uint32_t RESERVED29[1U];\n  __IOM uint32_t FUNCTION14;             /*!< Offset: 0x108 (R/W)  Function Register 14 */\n        uint32_t RESERVED30[1U];\n  __IOM uint32_t COMP15;                 /*!< Offset: 0x110 (R/W)  Comparator Register 15 */\n        uint32_t RESERVED31[1U];\n  __IOM uint32_t FUNCTION15;             /*!< Offset: 0x118 (R/W)  Function Register 15 */\n        uint32_t RESERVED32[934U];\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R  )  Lock Status Register */\n        uint32_t RESERVED33[1U];\n  __IM  uint32_t DEVARCH;                /*!< Offset: 0xFBC (R/ )  Device Architecture Register */\n} DWT_Type;\n\n/* DWT Control Register Definitions */\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\n\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\n\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\n\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\n\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\n\n#define DWT_CTRL_CYCDISS_Pos               23U                                         /*!< DWT CTRL: CYCDISS Position */\n#define DWT_CTRL_CYCDISS_Msk               (0x1UL << DWT_CTRL_CYCDISS_Pos)             /*!< DWT CTRL: CYCDISS Mask */\n\n#define DWT_CTRL_CYCEVTENA_Pos             22U                                         /*!< DWT CTRL: CYCEVTENA Position */\n#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */\n\n#define DWT_CTRL_FOLDEVTENA_Pos            21U                                         /*!< DWT CTRL: FOLDEVTENA Position */\n#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */\n\n#define DWT_CTRL_LSUEVTENA_Pos             20U                                         /*!< DWT CTRL: LSUEVTENA Position */\n#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */\n\n#define DWT_CTRL_SLEEPEVTENA_Pos           19U                                         /*!< DWT CTRL: SLEEPEVTENA Position */\n#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */\n\n#define DWT_CTRL_EXCEVTENA_Pos             18U                                         /*!< DWT CTRL: EXCEVTENA Position */\n#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */\n\n#define DWT_CTRL_CPIEVTENA_Pos             17U                                         /*!< DWT CTRL: CPIEVTENA Position */\n#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */\n\n#define DWT_CTRL_EXCTRCENA_Pos             16U                                         /*!< DWT CTRL: EXCTRCENA Position */\n#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */\n\n#define DWT_CTRL_PCSAMPLENA_Pos            12U                                         /*!< DWT CTRL: PCSAMPLENA Position */\n#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */\n\n#define DWT_CTRL_SYNCTAP_Pos               10U                                         /*!< DWT CTRL: SYNCTAP Position */\n#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */\n\n#define DWT_CTRL_CYCTAP_Pos                 9U                                         /*!< DWT CTRL: CYCTAP Position */\n#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */\n\n#define DWT_CTRL_POSTINIT_Pos               5U                                         /*!< DWT CTRL: POSTINIT Position */\n#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */\n\n#define DWT_CTRL_POSTPRESET_Pos             1U                                         /*!< DWT CTRL: POSTPRESET Position */\n#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */\n\n#define DWT_CTRL_CYCCNTENA_Pos              0U                                         /*!< DWT CTRL: CYCCNTENA Position */\n#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/)       /*!< DWT CTRL: CYCCNTENA Mask */\n\n/* DWT CPI Count Register Definitions */\n#define DWT_CPICNT_CPICNT_Pos               0U                                         /*!< DWT CPICNT: CPICNT Position */\n#define DWT_CPICNT_CPICNT_Msk              (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/)       /*!< DWT CPICNT: CPICNT Mask */\n\n/* DWT Exception Overhead Count Register Definitions */\n#define DWT_EXCCNT_EXCCNT_Pos               0U                                         /*!< DWT EXCCNT: EXCCNT Position */\n#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/)       /*!< DWT EXCCNT: EXCCNT Mask */\n\n/* DWT Sleep Count Register Definitions */\n#define DWT_SLEEPCNT_SLEEPCNT_Pos           0U                                         /*!< DWT SLEEPCNT: SLEEPCNT Position */\n#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/)   /*!< DWT SLEEPCNT: SLEEPCNT Mask */\n\n/* DWT LSU Count Register Definitions */\n#define DWT_LSUCNT_LSUCNT_Pos               0U                                         /*!< DWT LSUCNT: LSUCNT Position */\n#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/)       /*!< DWT LSUCNT: LSUCNT Mask */\n\n/* DWT Folded-instruction Count Register Definitions */\n#define DWT_FOLDCNT_FOLDCNT_Pos             0U                                         /*!< DWT FOLDCNT: FOLDCNT Position */\n#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/)     /*!< DWT FOLDCNT: FOLDCNT Mask */\n\n/* DWT Comparator Function Register Definitions */\n#define DWT_FUNCTION_ID_Pos                27U                                         /*!< DWT FUNCTION: ID Position */\n#define DWT_FUNCTION_ID_Msk                (0x1FUL << DWT_FUNCTION_ID_Pos)             /*!< DWT FUNCTION: ID Mask */\n\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\n\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\n\n#define DWT_FUNCTION_ACTION_Pos             4U                                         /*!< DWT FUNCTION: ACTION Position */\n#define DWT_FUNCTION_ACTION_Msk            (0x1UL << DWT_FUNCTION_ACTION_Pos)          /*!< DWT FUNCTION: ACTION Mask */\n\n#define DWT_FUNCTION_MATCH_Pos              0U                                         /*!< DWT FUNCTION: MATCH Position */\n#define DWT_FUNCTION_MATCH_Msk             (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/)       /*!< DWT FUNCTION: MATCH Mask */\n\n/*@}*/ /* end of group CMSIS_DWT */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\n  \\brief    Type definitions for the Trace Port Interface (TPI)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\n */\ntypedef struct\n{\n  __IM  uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\n        uint32_t RESERVED0[2U];\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\n        uint32_t RESERVED1[55U];\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\n        uint32_t RESERVED2[131U];\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\n  __IOM uint32_t PSCR;                   /*!< Offset: 0x308 (R/W)  Periodic Synchronization Control Register */\n        uint32_t RESERVED3[759U];\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER Register */\n  __IM  uint32_t ITFTTD0;                /*!< Offset: 0xEEC (R/ )  Integration Test FIFO Test Data 0 Register */\n  __IOM uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/W)  Integration Test ATB Control Register 2 */\n        uint32_t RESERVED4[1U];\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  Integration Test ATB Control Register 0 */\n  __IM  uint32_t ITFTTD1;                /*!< Offset: 0xEFC (R/ )  Integration Test FIFO Test Data 1 Register */\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\n        uint32_t RESERVED5[39U];\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\n        uint32_t RESERVED7[8U];\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  Device Configuration Register */\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  Device Type Identifier Register */\n} TPI_Type;\n\n/* TPI Asynchronous Clock Prescaler Register Definitions */\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\n\n/* TPI Selected Pin Protocol Register Definitions */\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\n\n/* TPI Formatter and Flush Status Register Definitions */\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\n\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\n\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\n\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\n\n/* TPI Formatter and Flush Control Register Definitions */\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\n\n#define TPI_FFCR_FOnMan_Pos                 6U                                         /*!< TPI FFCR: FOnMan Position */\n#define TPI_FFCR_FOnMan_Msk                (0x1UL << TPI_FFCR_FOnMan_Pos)              /*!< TPI FFCR: FOnMan Mask */\n\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\n\n/* TPI TRIGGER Register Definitions */\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\n\n/* TPI Integration Test FIFO Test Data 0 Register Definitions */\n#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos    29U                                         /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */\n#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk    (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos)  /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */\n\n#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos  27U                                         /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */\n#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk  (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */\n\n#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos    26U                                         /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */\n#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk    (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos)  /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */\n\n#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos  24U                                         /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */\n#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk  (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */\n\n#define TPI_ITFTTD0_ATB_IF1_data2_Pos      16U                                         /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */\n#define TPI_ITFTTD0_ATB_IF1_data2_Msk      (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos)   /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */\n\n#define TPI_ITFTTD0_ATB_IF1_data1_Pos       8U                                         /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */\n#define TPI_ITFTTD0_ATB_IF1_data1_Msk      (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos)   /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */\n\n#define TPI_ITFTTD0_ATB_IF1_data0_Pos       0U                                          /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */\n#define TPI_ITFTTD0_ATB_IF1_data0_Msk      (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */\n\n/* TPI Integration Test ATB Control Register 2 Register Definitions */\n#define TPI_ITATBCTR2_AFVALID2S_Pos         1U                                         /*!< TPI ITATBCTR2: AFVALID2S Position */\n#define TPI_ITATBCTR2_AFVALID2S_Msk        (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos)      /*!< TPI ITATBCTR2: AFVALID2SS Mask */\n\n#define TPI_ITATBCTR2_AFVALID1S_Pos         1U                                         /*!< TPI ITATBCTR2: AFVALID1S Position */\n#define TPI_ITATBCTR2_AFVALID1S_Msk        (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos)      /*!< TPI ITATBCTR2: AFVALID1SS Mask */\n\n#define TPI_ITATBCTR2_ATREADY2S_Pos         0U                                         /*!< TPI ITATBCTR2: ATREADY2S Position */\n#define TPI_ITATBCTR2_ATREADY2S_Msk        (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/)  /*!< TPI ITATBCTR2: ATREADY2S Mask */\n\n#define TPI_ITATBCTR2_ATREADY1S_Pos         0U                                         /*!< TPI ITATBCTR2: ATREADY1S Position */\n#define TPI_ITATBCTR2_ATREADY1S_Msk        (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/)  /*!< TPI ITATBCTR2: ATREADY1S Mask */\n\n/* TPI Integration Test FIFO Test Data 1 Register Definitions */\n#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos    29U                                         /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */\n#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk    (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos)  /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */\n\n#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos  27U                                         /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */\n#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk  (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */\n\n#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos    26U                                         /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */\n#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk    (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos)  /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */\n\n#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos  24U                                         /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */\n#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk  (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */\n\n#define TPI_ITFTTD1_ATB_IF2_data2_Pos      16U                                         /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */\n#define TPI_ITFTTD1_ATB_IF2_data2_Msk      (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos)   /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */\n\n#define TPI_ITFTTD1_ATB_IF2_data1_Pos       8U                                         /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */\n#define TPI_ITFTTD1_ATB_IF2_data1_Msk      (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos)   /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */\n\n#define TPI_ITFTTD1_ATB_IF2_data0_Pos       0U                                          /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */\n#define TPI_ITFTTD1_ATB_IF2_data0_Msk      (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */\n\n/* TPI Integration Test ATB Control Register 0 Definitions */\n#define TPI_ITATBCTR0_AFVALID2S_Pos         1U                                         /*!< TPI ITATBCTR0: AFVALID2S Position */\n#define TPI_ITATBCTR0_AFVALID2S_Msk        (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos)      /*!< TPI ITATBCTR0: AFVALID2SS Mask */\n\n#define TPI_ITATBCTR0_AFVALID1S_Pos         1U                                         /*!< TPI ITATBCTR0: AFVALID1S Position */\n#define TPI_ITATBCTR0_AFVALID1S_Msk        (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos)      /*!< TPI ITATBCTR0: AFVALID1SS Mask */\n\n#define TPI_ITATBCTR0_ATREADY2S_Pos         0U                                         /*!< TPI ITATBCTR0: ATREADY2S Position */\n#define TPI_ITATBCTR0_ATREADY2S_Msk        (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/)  /*!< TPI ITATBCTR0: ATREADY2S Mask */\n\n#define TPI_ITATBCTR0_ATREADY1S_Pos         0U                                         /*!< TPI ITATBCTR0: ATREADY1S Position */\n#define TPI_ITATBCTR0_ATREADY1S_Msk        (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/)  /*!< TPI ITATBCTR0: ATREADY1S Mask */\n\n/* TPI Integration Mode Control Register Definitions */\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\n#define TPI_ITCTRL_Mode_Msk                (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\n\n/* TPI DEVID Register Definitions */\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\n\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\n\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\n\n#define TPI_DEVID_FIFOSZ_Pos                6U                                         /*!< TPI DEVID: FIFOSZ Position */\n#define TPI_DEVID_FIFOSZ_Msk               (0x7UL << TPI_DEVID_FIFOSZ_Pos)             /*!< TPI DEVID: FIFOSZ Mask */\n\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\n#define TPI_DEVID_NrTraceInput_Msk         (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\n\n/* TPI DEVTYPE Register Definitions */\n#define TPI_DEVTYPE_SubType_Pos             4U                                         /*!< TPI DEVTYPE: SubType Position */\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\n\n#define TPI_DEVTYPE_MajorType_Pos           0U                                         /*!< TPI DEVTYPE: MajorType Position */\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\n\n/*@}*/ /* end of group CMSIS_TPI */\n\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\n */\ntypedef struct\n{\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  MPU Region Limit Address Register */\n  __IOM uint32_t RBAR_A1;                /*!< Offset: 0x014 (R/W)  MPU Region Base Address Register Alias 1 */\n  __IOM uint32_t RLAR_A1;                /*!< Offset: 0x018 (R/W)  MPU Region Limit Address Register Alias 1 */\n  __IOM uint32_t RBAR_A2;                /*!< Offset: 0x01C (R/W)  MPU Region Base Address Register Alias 2 */\n  __IOM uint32_t RLAR_A2;                /*!< Offset: 0x020 (R/W)  MPU Region Limit Address Register Alias 2 */\n  __IOM uint32_t RBAR_A3;                /*!< Offset: 0x024 (R/W)  MPU Region Base Address Register Alias 3 */\n  __IOM uint32_t RLAR_A3;                /*!< Offset: 0x028 (R/W)  MPU Region Limit Address Register Alias 3 */\n        uint32_t RESERVED0[1];\n  union {\n  __IOM uint32_t MAIR[2];\n  struct {\n  __IOM uint32_t MAIR0;                  /*!< Offset: 0x030 (R/W)  MPU Memory Attribute Indirection Register 0 */\n  __IOM uint32_t MAIR1;                  /*!< Offset: 0x034 (R/W)  MPU Memory Attribute Indirection Register 1 */\n  };\n  };\n} MPU_Type;\n\n#define MPU_TYPE_RALIASES                  4U\n\n/* MPU Type Register Definitions */\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\n\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\n\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\n\n/* MPU Control Register Definitions */\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\n\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\n\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\n\n/* MPU Region Number Register Definitions */\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\n\n/* MPU Region Base Address Register Definitions */\n#define MPU_RBAR_BASE_Pos                   5U                                            /*!< MPU RBAR: BASE Position */\n#define MPU_RBAR_BASE_Msk                  (0x7FFFFFFUL << MPU_RBAR_BASE_Pos)             /*!< MPU RBAR: BASE Mask */\n\n#define MPU_RBAR_SH_Pos                     3U                                            /*!< MPU RBAR: SH Position */\n#define MPU_RBAR_SH_Msk                    (0x3UL << MPU_RBAR_SH_Pos)                     /*!< MPU RBAR: SH Mask */\n\n#define MPU_RBAR_AP_Pos                     1U                                            /*!< MPU RBAR: AP Position */\n#define MPU_RBAR_AP_Msk                    (0x3UL << MPU_RBAR_AP_Pos)                     /*!< MPU RBAR: AP Mask */\n\n#define MPU_RBAR_XN_Pos                     0U                                            /*!< MPU RBAR: XN Position */\n#define MPU_RBAR_XN_Msk                    (01UL /*<< MPU_RBAR_XN_Pos*/)                  /*!< MPU RBAR: XN Mask */\n\n/* MPU Region Limit Address Register Definitions */\n#define MPU_RLAR_LIMIT_Pos                  5U                                            /*!< MPU RLAR: LIMIT Position */\n#define MPU_RLAR_LIMIT_Msk                 (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos)            /*!< MPU RLAR: LIMIT Mask */\n\n#define MPU_RLAR_AttrIndx_Pos               1U                                            /*!< MPU RLAR: AttrIndx Position */\n#define MPU_RLAR_AttrIndx_Msk              (0x7UL << MPU_RLAR_AttrIndx_Pos)               /*!< MPU RLAR: AttrIndx Mask */\n\n#define MPU_RLAR_EN_Pos                     0U                                            /*!< MPU RLAR: Region enable bit Position */\n#define MPU_RLAR_EN_Msk                    (1UL /*<< MPU_RLAR_EN_Pos*/)                   /*!< MPU RLAR: Region enable bit Disable Mask */\n\n/* MPU Memory Attribute Indirection Register 0 Definitions */\n#define MPU_MAIR0_Attr3_Pos                24U                                            /*!< MPU MAIR0: Attr3 Position */\n#define MPU_MAIR0_Attr3_Msk                (0xFFUL << MPU_MAIR0_Attr3_Pos)                /*!< MPU MAIR0: Attr3 Mask */\n\n#define MPU_MAIR0_Attr2_Pos                16U                                            /*!< MPU MAIR0: Attr2 Position */\n#define MPU_MAIR0_Attr2_Msk                (0xFFUL << MPU_MAIR0_Attr2_Pos)                /*!< MPU MAIR0: Attr2 Mask */\n\n#define MPU_MAIR0_Attr1_Pos                 8U                                            /*!< MPU MAIR0: Attr1 Position */\n#define MPU_MAIR0_Attr1_Msk                (0xFFUL << MPU_MAIR0_Attr1_Pos)                /*!< MPU MAIR0: Attr1 Mask */\n\n#define MPU_MAIR0_Attr0_Pos                 0U                                            /*!< MPU MAIR0: Attr0 Position */\n#define MPU_MAIR0_Attr0_Msk                (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/)            /*!< MPU MAIR0: Attr0 Mask */\n\n/* MPU Memory Attribute Indirection Register 1 Definitions */\n#define MPU_MAIR1_Attr7_Pos                24U                                            /*!< MPU MAIR1: Attr7 Position */\n#define MPU_MAIR1_Attr7_Msk                (0xFFUL << MPU_MAIR1_Attr7_Pos)                /*!< MPU MAIR1: Attr7 Mask */\n\n#define MPU_MAIR1_Attr6_Pos                16U                                            /*!< MPU MAIR1: Attr6 Position */\n#define MPU_MAIR1_Attr6_Msk                (0xFFUL << MPU_MAIR1_Attr6_Pos)                /*!< MPU MAIR1: Attr6 Mask */\n\n#define MPU_MAIR1_Attr5_Pos                 8U                                            /*!< MPU MAIR1: Attr5 Position */\n#define MPU_MAIR1_Attr5_Msk                (0xFFUL << MPU_MAIR1_Attr5_Pos)                /*!< MPU MAIR1: Attr5 Mask */\n\n#define MPU_MAIR1_Attr4_Pos                 0U                                            /*!< MPU MAIR1: Attr4 Position */\n#define MPU_MAIR1_Attr4_Msk                (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/)            /*!< MPU MAIR1: Attr4 Mask */\n\n/*@} end of group CMSIS_MPU */\n#endif\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_SAU     Security Attribution Unit (SAU)\n  \\brief    Type definitions for the Security Attribution Unit (SAU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Security Attribution Unit (SAU).\n */\ntypedef struct\n{\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SAU Control Register */\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x004 (R/ )  SAU Type Register */\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  SAU Region Number Register */\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  SAU Region Base Address Register */\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  SAU Region Limit Address Register */\n#else\n        uint32_t RESERVED0[3];\n#endif\n  __IOM uint32_t SFSR;                   /*!< Offset: 0x014 (R/W)  Secure Fault Status Register */\n  __IOM uint32_t SFAR;                   /*!< Offset: 0x018 (R/W)  Secure Fault Address Register */\n} SAU_Type;\n\n/* SAU Control Register Definitions */\n#define SAU_CTRL_ALLNS_Pos                  1U                                            /*!< SAU CTRL: ALLNS Position */\n#define SAU_CTRL_ALLNS_Msk                 (1UL << SAU_CTRL_ALLNS_Pos)                    /*!< SAU CTRL: ALLNS Mask */\n\n#define SAU_CTRL_ENABLE_Pos                 0U                                            /*!< SAU CTRL: ENABLE Position */\n#define SAU_CTRL_ENABLE_Msk                (1UL /*<< SAU_CTRL_ENABLE_Pos*/)               /*!< SAU CTRL: ENABLE Mask */\n\n/* SAU Type Register Definitions */\n#define SAU_TYPE_SREGION_Pos                0U                                            /*!< SAU TYPE: SREGION Position */\n#define SAU_TYPE_SREGION_Msk               (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/)           /*!< SAU TYPE: SREGION Mask */\n\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\n/* SAU Region Number Register Definitions */\n#define SAU_RNR_REGION_Pos                  0U                                            /*!< SAU RNR: REGION Position */\n#define SAU_RNR_REGION_Msk                 (0xFFUL /*<< SAU_RNR_REGION_Pos*/)             /*!< SAU RNR: REGION Mask */\n\n/* SAU Region Base Address Register Definitions */\n#define SAU_RBAR_BADDR_Pos                  5U                                            /*!< SAU RBAR: BADDR Position */\n#define SAU_RBAR_BADDR_Msk                 (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos)            /*!< SAU RBAR: BADDR Mask */\n\n/* SAU Region Limit Address Register Definitions */\n#define SAU_RLAR_LADDR_Pos                  5U                                            /*!< SAU RLAR: LADDR Position */\n#define SAU_RLAR_LADDR_Msk                 (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos)            /*!< SAU RLAR: LADDR Mask */\n\n#define SAU_RLAR_NSC_Pos                    1U                                            /*!< SAU RLAR: NSC Position */\n#define SAU_RLAR_NSC_Msk                   (1UL << SAU_RLAR_NSC_Pos)                      /*!< SAU RLAR: NSC Mask */\n\n#define SAU_RLAR_ENABLE_Pos                 0U                                            /*!< SAU RLAR: ENABLE Position */\n#define SAU_RLAR_ENABLE_Msk                (1UL /*<< SAU_RLAR_ENABLE_Pos*/)               /*!< SAU RLAR: ENABLE Mask */\n\n#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */\n\n/* Secure Fault Status Register Definitions */\n#define SAU_SFSR_LSERR_Pos                  7U                                            /*!< SAU SFSR: LSERR Position */\n#define SAU_SFSR_LSERR_Msk                 (1UL << SAU_SFSR_LSERR_Pos)                    /*!< SAU SFSR: LSERR Mask */\n\n#define SAU_SFSR_SFARVALID_Pos              6U                                            /*!< SAU SFSR: SFARVALID Position */\n#define SAU_SFSR_SFARVALID_Msk             (1UL << SAU_SFSR_SFARVALID_Pos)                /*!< SAU SFSR: SFARVALID Mask */\n\n#define SAU_SFSR_LSPERR_Pos                 5U                                            /*!< SAU SFSR: LSPERR Position */\n#define SAU_SFSR_LSPERR_Msk                (1UL << SAU_SFSR_LSPERR_Pos)                   /*!< SAU SFSR: LSPERR Mask */\n\n#define SAU_SFSR_INVTRAN_Pos                4U                                            /*!< SAU SFSR: INVTRAN Position */\n#define SAU_SFSR_INVTRAN_Msk               (1UL << SAU_SFSR_INVTRAN_Pos)                  /*!< SAU SFSR: INVTRAN Mask */\n\n#define SAU_SFSR_AUVIOL_Pos                 3U                                            /*!< SAU SFSR: AUVIOL Position */\n#define SAU_SFSR_AUVIOL_Msk                (1UL << SAU_SFSR_AUVIOL_Pos)                   /*!< SAU SFSR: AUVIOL Mask */\n\n#define SAU_SFSR_INVER_Pos                  2U                                            /*!< SAU SFSR: INVER Position */\n#define SAU_SFSR_INVER_Msk                 (1UL << SAU_SFSR_INVER_Pos)                    /*!< SAU SFSR: INVER Mask */\n\n#define SAU_SFSR_INVIS_Pos                  1U                                            /*!< SAU SFSR: INVIS Position */\n#define SAU_SFSR_INVIS_Msk                 (1UL << SAU_SFSR_INVIS_Pos)                    /*!< SAU SFSR: INVIS Mask */\n\n#define SAU_SFSR_INVEP_Pos                  0U                                            /*!< SAU SFSR: INVEP Position */\n#define SAU_SFSR_INVEP_Msk                 (1UL /*<< SAU_SFSR_INVEP_Pos*/)                /*!< SAU SFSR: INVEP Mask */\n\n/*@} end of group CMSIS_SAU */\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_FPU     Floating Point Unit (FPU)\n  \\brief    Type definitions for the Floating Point Unit (FPU)\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Floating Point Unit (FPU).\n */\ntypedef struct\n{\n        uint32_t RESERVED0[1U];\n  __IOM uint32_t FPCCR;                  /*!< Offset: 0x004 (R/W)  Floating-Point Context Control Register */\n  __IOM uint32_t FPCAR;                  /*!< Offset: 0x008 (R/W)  Floating-Point Context Address Register */\n  __IOM uint32_t FPDSCR;                 /*!< Offset: 0x00C (R/W)  Floating-Point Default Status Control Register */\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x010 (R/ )  Media and FP Feature Register 0 */\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x014 (R/ )  Media and FP Feature Register 1 */\n} FPU_Type;\n\n/* Floating-Point Context Control Register Definitions */\n#define FPU_FPCCR_ASPEN_Pos                31U                                            /*!< FPCCR: ASPEN bit Position */\n#define FPU_FPCCR_ASPEN_Msk                (1UL << FPU_FPCCR_ASPEN_Pos)                   /*!< FPCCR: ASPEN bit Mask */\n\n#define FPU_FPCCR_LSPEN_Pos                30U                                            /*!< FPCCR: LSPEN Position */\n#define FPU_FPCCR_LSPEN_Msk                (1UL << FPU_FPCCR_LSPEN_Pos)                   /*!< FPCCR: LSPEN bit Mask */\n\n#define FPU_FPCCR_LSPENS_Pos               29U                                            /*!< FPCCR: LSPENS Position */\n#define FPU_FPCCR_LSPENS_Msk               (1UL << FPU_FPCCR_LSPENS_Pos)                  /*!< FPCCR: LSPENS bit Mask */\n\n#define FPU_FPCCR_CLRONRET_Pos             28U                                            /*!< FPCCR: CLRONRET Position */\n#define FPU_FPCCR_CLRONRET_Msk             (1UL << FPU_FPCCR_CLRONRET_Pos)                /*!< FPCCR: CLRONRET bit Mask */\n\n#define FPU_FPCCR_CLRONRETS_Pos            27U                                            /*!< FPCCR: CLRONRETS Position */\n#define FPU_FPCCR_CLRONRETS_Msk            (1UL << FPU_FPCCR_CLRONRETS_Pos)               /*!< FPCCR: CLRONRETS bit Mask */\n\n#define FPU_FPCCR_TS_Pos                   26U                                            /*!< FPCCR: TS Position */\n#define FPU_FPCCR_TS_Msk                   (1UL << FPU_FPCCR_TS_Pos)                      /*!< FPCCR: TS bit Mask */\n\n#define FPU_FPCCR_UFRDY_Pos                10U                                            /*!< FPCCR: UFRDY Position */\n#define FPU_FPCCR_UFRDY_Msk                (1UL << FPU_FPCCR_UFRDY_Pos)                   /*!< FPCCR: UFRDY bit Mask */\n\n#define FPU_FPCCR_SPLIMVIOL_Pos             9U                                            /*!< FPCCR: SPLIMVIOL Position */\n#define FPU_FPCCR_SPLIMVIOL_Msk            (1UL << FPU_FPCCR_SPLIMVIOL_Pos)               /*!< FPCCR: SPLIMVIOL bit Mask */\n\n#define FPU_FPCCR_MONRDY_Pos                8U                                            /*!< FPCCR: MONRDY Position */\n#define FPU_FPCCR_MONRDY_Msk               (1UL << FPU_FPCCR_MONRDY_Pos)                  /*!< FPCCR: MONRDY bit Mask */\n\n#define FPU_FPCCR_SFRDY_Pos                 7U                                            /*!< FPCCR: SFRDY Position */\n#define FPU_FPCCR_SFRDY_Msk                (1UL << FPU_FPCCR_SFRDY_Pos)                   /*!< FPCCR: SFRDY bit Mask */\n\n#define FPU_FPCCR_BFRDY_Pos                 6U                                            /*!< FPCCR: BFRDY Position */\n#define FPU_FPCCR_BFRDY_Msk                (1UL << FPU_FPCCR_BFRDY_Pos)                   /*!< FPCCR: BFRDY bit Mask */\n\n#define FPU_FPCCR_MMRDY_Pos                 5U                                            /*!< FPCCR: MMRDY Position */\n#define FPU_FPCCR_MMRDY_Msk                (1UL << FPU_FPCCR_MMRDY_Pos)                   /*!< FPCCR: MMRDY bit Mask */\n\n#define FPU_FPCCR_HFRDY_Pos                 4U                                            /*!< FPCCR: HFRDY Position */\n#define FPU_FPCCR_HFRDY_Msk                (1UL << FPU_FPCCR_HFRDY_Pos)                   /*!< FPCCR: HFRDY bit Mask */\n\n#define FPU_FPCCR_THREAD_Pos                3U                                            /*!< FPCCR: processor mode bit Position */\n#define FPU_FPCCR_THREAD_Msk               (1UL << FPU_FPCCR_THREAD_Pos)                  /*!< FPCCR: processor mode active bit Mask */\n\n#define FPU_FPCCR_S_Pos                     2U                                            /*!< FPCCR: Security status of the FP context bit Position */\n#define FPU_FPCCR_S_Msk                    (1UL << FPU_FPCCR_S_Pos)                       /*!< FPCCR: Security status of the FP context bit Mask */\n\n#define FPU_FPCCR_USER_Pos                  1U                                            /*!< FPCCR: privilege level bit Position */\n#define FPU_FPCCR_USER_Msk                 (1UL << FPU_FPCCR_USER_Pos)                    /*!< FPCCR: privilege level bit Mask */\n\n#define FPU_FPCCR_LSPACT_Pos                0U                                            /*!< FPCCR: Lazy state preservation active bit Position */\n#define FPU_FPCCR_LSPACT_Msk               (1UL /*<< FPU_FPCCR_LSPACT_Pos*/)              /*!< FPCCR: Lazy state preservation active bit Mask */\n\n/* Floating-Point Context Address Register Definitions */\n#define FPU_FPCAR_ADDRESS_Pos               3U                                            /*!< FPCAR: ADDRESS bit Position */\n#define FPU_FPCAR_ADDRESS_Msk              (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos)        /*!< FPCAR: ADDRESS bit Mask */\n\n/* Floating-Point Default Status Control Register Definitions */\n#define FPU_FPDSCR_AHP_Pos                 26U                                            /*!< FPDSCR: AHP bit Position */\n#define FPU_FPDSCR_AHP_Msk                 (1UL << FPU_FPDSCR_AHP_Pos)                    /*!< FPDSCR: AHP bit Mask */\n\n#define FPU_FPDSCR_DN_Pos                  25U                                            /*!< FPDSCR: DN bit Position */\n#define FPU_FPDSCR_DN_Msk                  (1UL << FPU_FPDSCR_DN_Pos)                     /*!< FPDSCR: DN bit Mask */\n\n#define FPU_FPDSCR_FZ_Pos                  24U                                            /*!< FPDSCR: FZ bit Position */\n#define FPU_FPDSCR_FZ_Msk                  (1UL << FPU_FPDSCR_FZ_Pos)                     /*!< FPDSCR: FZ bit Mask */\n\n#define FPU_FPDSCR_RMode_Pos               22U                                            /*!< FPDSCR: RMode bit Position */\n#define FPU_FPDSCR_RMode_Msk               (3UL << FPU_FPDSCR_RMode_Pos)                  /*!< FPDSCR: RMode bit Mask */\n\n/* Media and FP Feature Register 0 Definitions */\n#define FPU_MVFR0_FP_rounding_modes_Pos    28U                                            /*!< MVFR0: FP rounding modes bits Position */\n#define FPU_MVFR0_FP_rounding_modes_Msk    (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos)     /*!< MVFR0: FP rounding modes bits Mask */\n\n#define FPU_MVFR0_Short_vectors_Pos        24U                                            /*!< MVFR0: Short vectors bits Position */\n#define FPU_MVFR0_Short_vectors_Msk        (0xFUL << FPU_MVFR0_Short_vectors_Pos)         /*!< MVFR0: Short vectors bits Mask */\n\n#define FPU_MVFR0_Square_root_Pos          20U                                            /*!< MVFR0: Square root bits Position */\n#define FPU_MVFR0_Square_root_Msk          (0xFUL << FPU_MVFR0_Square_root_Pos)           /*!< MVFR0: Square root bits Mask */\n\n#define FPU_MVFR0_Divide_Pos               16U                                            /*!< MVFR0: Divide bits Position */\n#define FPU_MVFR0_Divide_Msk               (0xFUL << FPU_MVFR0_Divide_Pos)                /*!< MVFR0: Divide bits Mask */\n\n#define FPU_MVFR0_FP_excep_trapping_Pos    12U                                            /*!< MVFR0: FP exception trapping bits Position */\n#define FPU_MVFR0_FP_excep_trapping_Msk    (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos)     /*!< MVFR0: FP exception trapping bits Mask */\n\n#define FPU_MVFR0_Double_precision_Pos      8U                                            /*!< MVFR0: Double-precision bits Position */\n#define FPU_MVFR0_Double_precision_Msk     (0xFUL << FPU_MVFR0_Double_precision_Pos)      /*!< MVFR0: Double-precision bits Mask */\n\n#define FPU_MVFR0_Single_precision_Pos      4U                                            /*!< MVFR0: Single-precision bits Position */\n#define FPU_MVFR0_Single_precision_Msk     (0xFUL << FPU_MVFR0_Single_precision_Pos)      /*!< MVFR0: Single-precision bits Mask */\n\n#define FPU_MVFR0_A_SIMD_registers_Pos      0U                                            /*!< MVFR0: A_SIMD registers bits Position */\n#define FPU_MVFR0_A_SIMD_registers_Msk     (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/)  /*!< MVFR0: A_SIMD registers bits Mask */\n\n/* Media and FP Feature Register 1 Definitions */\n#define FPU_MVFR1_FP_fused_MAC_Pos         28U                                            /*!< MVFR1: FP fused MAC bits Position */\n#define FPU_MVFR1_FP_fused_MAC_Msk         (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos)          /*!< MVFR1: FP fused MAC bits Mask */\n\n#define FPU_MVFR1_FP_HPFP_Pos              24U                                            /*!< MVFR1: FP HPFP bits Position */\n#define FPU_MVFR1_FP_HPFP_Msk              (0xFUL << FPU_MVFR1_FP_HPFP_Pos)               /*!< MVFR1: FP HPFP bits Mask */\n\n#define FPU_MVFR1_D_NaN_mode_Pos            4U                                            /*!< MVFR1: D_NaN mode bits Position */\n#define FPU_MVFR1_D_NaN_mode_Msk           (0xFUL << FPU_MVFR1_D_NaN_mode_Pos)            /*!< MVFR1: D_NaN mode bits Mask */\n\n#define FPU_MVFR1_FtZ_mode_Pos              0U                                            /*!< MVFR1: FtZ mode bits Position */\n#define FPU_MVFR1_FtZ_mode_Msk             (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/)          /*!< MVFR1: FtZ mode bits Mask */\n\n/*@} end of group CMSIS_FPU */\n\n\n/**\n  \\ingroup  CMSIS_core_register\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\n  \\brief    Type definitions for the Core Debug Registers\n  @{\n */\n\n/**\n  \\brief  Structure type to access the Core Debug Register (CoreDebug).\n */\ntypedef struct\n{\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\n        uint32_t RESERVED4[1U];\n  __IOM uint32_t DAUTHCTRL;              /*!< Offset: 0x014 (R/W)  Debug Authentication Control Register */\n  __IOM uint32_t DSCSR;                  /*!< Offset: 0x018 (R/W)  Debug Security Control and Status Register */\n} CoreDebug_Type;\n\n/* Debug Halting Control and Status Register Definitions */\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< CoreDebug DHCSR: DBGKEY Position */\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< CoreDebug DHCSR: DBGKEY Mask */\n\n#define CoreDebug_DHCSR_S_RESTART_ST_Pos   26U                                            /*!< CoreDebug DHCSR: S_RESTART_ST Position */\n#define CoreDebug_DHCSR_S_RESTART_ST_Msk   (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos)      /*!< CoreDebug DHCSR: S_RESTART_ST Mask */\n\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< CoreDebug DHCSR: S_RESET_ST Position */\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< CoreDebug DHCSR: S_RESET_ST Mask */\n\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< CoreDebug DHCSR: S_RETIRE_ST Position */\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */\n\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< CoreDebug DHCSR: S_LOCKUP Position */\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< CoreDebug DHCSR: S_LOCKUP Mask */\n\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< CoreDebug DHCSR: S_SLEEP Position */\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< CoreDebug DHCSR: S_SLEEP Mask */\n\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< CoreDebug DHCSR: S_HALT Position */\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< CoreDebug DHCSR: S_HALT Mask */\n\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< CoreDebug DHCSR: S_REGRDY Position */\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< CoreDebug DHCSR: S_REGRDY Mask */\n\n#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5U                                            /*!< CoreDebug DHCSR: C_SNAPSTALL Position */\n#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */\n\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< CoreDebug DHCSR: C_MASKINTS Position */\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< CoreDebug DHCSR: C_MASKINTS Mask */\n\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< CoreDebug DHCSR: C_STEP Position */\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< CoreDebug DHCSR: C_STEP Mask */\n\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< CoreDebug DHCSR: C_HALT Position */\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< CoreDebug DHCSR: C_HALT Mask */\n\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< CoreDebug DHCSR: C_DEBUGEN Position */\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< CoreDebug DHCSR: C_DEBUGEN Mask */\n\n/* Debug Core Register Selector Register Definitions */\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< CoreDebug DCRSR: REGWnR Position */\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< CoreDebug DCRSR: REGWnR Mask */\n\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< CoreDebug DCRSR: REGSEL Position */\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< CoreDebug DCRSR: REGSEL Mask */\n\n/* Debug Exception and Monitor Control Register Definitions */\n#define CoreDebug_DEMCR_TRCENA_Pos         24U                                            /*!< CoreDebug DEMCR: TRCENA Position */\n#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< CoreDebug DEMCR: TRCENA Mask */\n\n#define CoreDebug_DEMCR_MON_REQ_Pos        19U                                            /*!< CoreDebug DEMCR: MON_REQ Position */\n#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< CoreDebug DEMCR: MON_REQ Mask */\n\n#define CoreDebug_DEMCR_MON_STEP_Pos       18U                                            /*!< CoreDebug DEMCR: MON_STEP Position */\n#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< CoreDebug DEMCR: MON_STEP Mask */\n\n#define CoreDebug_DEMCR_MON_PEND_Pos       17U                                            /*!< CoreDebug DEMCR: MON_PEND Position */\n#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< CoreDebug DEMCR: MON_PEND Mask */\n\n#define CoreDebug_DEMCR_MON_EN_Pos         16U                                            /*!< CoreDebug DEMCR: MON_EN Position */\n#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< CoreDebug DEMCR: MON_EN Mask */\n\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< CoreDebug DEMCR: VC_HARDERR Position */\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< CoreDebug DEMCR: VC_HARDERR Mask */\n\n#define CoreDebug_DEMCR_VC_INTERR_Pos       9U                                            /*!< CoreDebug DEMCR: VC_INTERR Position */\n#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< CoreDebug DEMCR: VC_INTERR Mask */\n\n#define CoreDebug_DEMCR_VC_BUSERR_Pos       8U                                            /*!< CoreDebug DEMCR: VC_BUSERR Position */\n#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< CoreDebug DEMCR: VC_BUSERR Mask */\n\n#define CoreDebug_DEMCR_VC_STATERR_Pos      7U                                            /*!< CoreDebug DEMCR: VC_STATERR Position */\n#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< CoreDebug DEMCR: VC_STATERR Mask */\n\n#define CoreDebug_DEMCR_VC_CHKERR_Pos       6U                                            /*!< CoreDebug DEMCR: VC_CHKERR Position */\n#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< CoreDebug DEMCR: VC_CHKERR Mask */\n\n#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5U                                            /*!< CoreDebug DEMCR: VC_NOCPERR Position */\n#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< CoreDebug DEMCR: VC_NOCPERR Mask */\n\n#define CoreDebug_DEMCR_VC_MMERR_Pos        4U                                            /*!< CoreDebug DEMCR: VC_MMERR Position */\n#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< CoreDebug DEMCR: VC_MMERR Mask */\n\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< CoreDebug DEMCR: VC_CORERESET Position */\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< CoreDebug DEMCR: VC_CORERESET Mask */\n\n/* Debug Authentication Control Register Definitions */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos  3U                                            /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Position */\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos)    /*!< CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */\n\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos  2U                                            /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos)    /*!< CoreDebug DAUTHCTRL: SPNIDENSEL Mask */\n\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos   1U                                            /*!< CoreDebug DAUTHCTRL: INTSPIDEN Position */\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk  (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos)     /*!< CoreDebug DAUTHCTRL: INTSPIDEN Mask */\n\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos   0U                                            /*!< CoreDebug DAUTHCTRL: SPIDENSEL Position */\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk  (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< CoreDebug DAUTHCTRL: SPIDENSEL Mask */\n\n/* Debug Security Control and Status Register Definitions */\n#define CoreDebug_DSCSR_CDS_Pos            16U                                            /*!< CoreDebug DSCSR: CDS Position */\n#define CoreDebug_DSCSR_CDS_Msk            (1UL << CoreDebug_DSCSR_CDS_Pos)               /*!< CoreDebug DSCSR: CDS Mask */\n\n#define CoreDebug_DSCSR_SBRSEL_Pos          1U                                            /*!< CoreDebug DSCSR: SBRSEL Position */\n#define CoreDebug_DSCSR_SBRSEL_Msk         (1UL << CoreDebug_DSCSR_SBRSEL_Pos)            /*!< CoreDebug DSCSR: SBRSEL Mask */\n\n#define CoreDebug_DSCSR_SBRSELEN_Pos        0U                                            /*!< CoreDebug DSCSR: SBRSELEN Position */\n#define CoreDebug_DSCSR_SBRSELEN_Msk       (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/)      /*!< CoreDebug DSCSR: SBRSELEN Mask */\n\n/*@} end of group CMSIS_CoreDebug */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\n  @{\n */\n\n/**\n  \\brief   Mask and shift a bit field value for use in a register bit range.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted value.\n*/\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\n\n/**\n  \\brief     Mask and shift a register value to extract a bit filed value.\n  \\param[in] field  Name of the register bit field.\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\n  \\return           Masked and shifted bit field value.\n*/\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\n\n/*@} end of group CMSIS_core_bitfield */\n\n\n/**\n  \\ingroup    CMSIS_core_register\n  \\defgroup   CMSIS_core_base     Core Definitions\n  \\brief      Definitions for base addresses, unions, and structures.\n  @{\n */\n\n/* Memory mapping of Core Hardware */\n  #define SCS_BASE            (0xE000E000UL)                             /*!< System Control Space Base Address */\n  #define ITM_BASE            (0xE0000000UL)                             /*!< ITM Base Address */\n  #define DWT_BASE            (0xE0001000UL)                             /*!< DWT Base Address */\n  #define TPI_BASE            (0xE0040000UL)                             /*!< TPI Base Address */\n  #define CoreDebug_BASE      (0xE000EDF0UL)                             /*!< Core Debug Base Address */\n  #define SysTick_BASE        (SCS_BASE +  0x0010UL)                     /*!< SysTick Base Address */\n  #define NVIC_BASE           (SCS_BASE +  0x0100UL)                     /*!< NVIC Base Address */\n  #define SCB_BASE            (SCS_BASE +  0x0D00UL)                     /*!< System Control Block Base Address */\n\n  #define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE         ) /*!< System control Register not in SCB */\n  #define SCB                 ((SCB_Type       *)     SCB_BASE         ) /*!< SCB configuration struct */\n  #define SysTick             ((SysTick_Type   *)     SysTick_BASE     ) /*!< SysTick configuration struct */\n  #define NVIC                ((NVIC_Type      *)     NVIC_BASE        ) /*!< NVIC configuration struct */\n  #define ITM                 ((ITM_Type       *)     ITM_BASE         ) /*!< ITM configuration struct */\n  #define DWT                 ((DWT_Type       *)     DWT_BASE         ) /*!< DWT configuration struct */\n  #define TPI                 ((TPI_Type       *)     TPI_BASE         ) /*!< TPI configuration struct */\n  #define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE   ) /*!< Core Debug configuration struct */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE          (SCS_BASE +  0x0D90UL)                     /*!< Memory Protection Unit */\n    #define MPU               ((MPU_Type       *)     MPU_BASE         ) /*!< Memory Protection Unit */\n  #endif\n\n  #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n    #define SAU_BASE          (SCS_BASE +  0x0DD0UL)                     /*!< Security Attribution Unit */\n    #define SAU               ((SAU_Type       *)     SAU_BASE         ) /*!< Security Attribution Unit */\n  #endif\n\n  #define FPU_BASE            (SCS_BASE +  0x0F30UL)                     /*!< Floating Point Unit */\n  #define FPU                 ((FPU_Type       *)     FPU_BASE         ) /*!< Floating Point Unit */\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n  #define SCS_BASE_NS         (0xE002E000UL)                             /*!< System Control Space Base Address (non-secure address space) */\n  #define CoreDebug_BASE_NS   (0xE002EDF0UL)                             /*!< Core Debug Base Address           (non-secure address space) */\n  #define SysTick_BASE_NS     (SCS_BASE_NS +  0x0010UL)                  /*!< SysTick Base Address              (non-secure address space) */\n  #define NVIC_BASE_NS        (SCS_BASE_NS +  0x0100UL)                  /*!< NVIC Base Address                 (non-secure address space) */\n  #define SCB_BASE_NS         (SCS_BASE_NS +  0x0D00UL)                  /*!< System Control Block Base Address (non-secure address space) */\n\n  #define SCnSCB_NS           ((SCnSCB_Type    *)     SCS_BASE_NS      ) /*!< System control Register not in SCB(non-secure address space) */\n  #define SCB_NS              ((SCB_Type       *)     SCB_BASE_NS      ) /*!< SCB configuration struct          (non-secure address space) */\n  #define SysTick_NS          ((SysTick_Type   *)     SysTick_BASE_NS  ) /*!< SysTick configuration struct      (non-secure address space) */\n  #define NVIC_NS             ((NVIC_Type      *)     NVIC_BASE_NS     ) /*!< NVIC configuration struct         (non-secure address space) */\n  #define CoreDebug_NS        ((CoreDebug_Type *)     CoreDebug_BASE_NS) /*!< Core Debug configuration struct   (non-secure address space) */\n\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n    #define MPU_BASE_NS       (SCS_BASE_NS +  0x0D90UL)                  /*!< Memory Protection Unit            (non-secure address space) */\n    #define MPU_NS            ((MPU_Type       *)     MPU_BASE_NS      ) /*!< Memory Protection Unit            (non-secure address space) */\n  #endif\n\n  #define FPU_BASE_NS         (SCS_BASE_NS +  0x0F30UL)                  /*!< Floating Point Unit               (non-secure address space) */\n  #define FPU_NS              ((FPU_Type       *)     FPU_BASE_NS      ) /*!< Floating Point Unit               (non-secure address space) */\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n/*@} */\n\n\n\n/*******************************************************************************\n *                Hardware Abstraction Layer\n  Core Function Interface contains:\n  - Core NVIC Functions\n  - Core SysTick Functions\n  - Core Debug Functions\n  - Core Register Access Functions\n ******************************************************************************/\n/**\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\n*/\n\n\n\n/* ##########################   NVIC functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\n  @{\n */\n\n#ifdef CMSIS_NVIC_VIRTUAL\n  #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE\n    #define CMSIS_NVIC_VIRTUAL_HEADER_FILE \"cmsis_nvic_virtual.h\"\n  #endif\n  #include CMSIS_NVIC_VIRTUAL_HEADER_FILE\n#else\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\n  #define NVIC_GetActive              __NVIC_GetActive\n  #define NVIC_SetPriority            __NVIC_SetPriority\n  #define NVIC_GetPriority            __NVIC_GetPriority\n  #define NVIC_SystemReset            __NVIC_SystemReset\n#endif /* CMSIS_NVIC_VIRTUAL */\n\n#ifdef CMSIS_VECTAB_VIRTUAL\n  #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE\n    #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE \"cmsis_vectab_virtual.h\"\n  #endif\n  #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE\n#else\n  #define NVIC_SetVector              __NVIC_SetVector\n  #define NVIC_GetVector              __NVIC_GetVector\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\n\n#define NVIC_USER_IRQ_OFFSET          16\n\n\n/* Special LR values for Secure/Non-Secure call handling and exception handling                                               */\n\n/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS                   */\n#define FNC_RETURN                 (0xFEFFFFFFUL)     /* bit [0] ignored when processing a branch                             */\n\n/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */\n#define EXC_RETURN_PREFIX          (0xFF000000UL)     /* bits [31:24] set to indicate an EXC_RETURN value                     */\n#define EXC_RETURN_S               (0x00000040UL)     /* bit [6] stack used to push registers: 0=Non-secure 1=Secure          */\n#define EXC_RETURN_DCRS            (0x00000020UL)     /* bit [5] stacking rules for called registers: 0=skipped 1=saved       */\n#define EXC_RETURN_FTYPE           (0x00000010UL)     /* bit [4] allocate stack for floating-point context: 0=done 1=skipped  */\n#define EXC_RETURN_MODE            (0x00000008UL)     /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode      */\n#define EXC_RETURN_SPSEL           (0x00000004UL)     /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP           */\n#define EXC_RETURN_ES              (0x00000001UL)     /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */\n\n/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking                            */\n#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)  /* Value for processors with floating-point extension:                  */\n#define EXC_INTEGRITY_SIGNATURE     (0xFEFA125AUL)     /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE                   */\n#else\n#define EXC_INTEGRITY_SIGNATURE     (0xFEFA125BUL)     /* Value for processors without floating-point extension                */\n#endif\n\n\n/**\n  \\brief   Set Priority Grouping\n  \\details Sets the priority grouping field using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos)  );              /* Insert write key and priority group */\n  SCB->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping\n  \\details Reads the priority grouping field from the NVIC Interrupt Controller.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)\n{\n  return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n    __DSB();\n    __ISB();\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Get Interrupt Target State\n  \\details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n  \\return             1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Target State\n  \\details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |=  ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Clear Interrupt Target State\n  \\details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  if interrupt is assigned to Secure\n                      1  if interrupt is assigned to Non Secure\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)));\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n\n/**\n  \\brief   Set Interrupt Priority\n  \\details Sets the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every processor exception.\n */\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC->IPR[((uint32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority\n  \\details Reads the priority of a device specific interrupt or a processor exception.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority.\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n\n\n/**\n  \\brief   Encode Priority\n  \\details Encodes the priority for an interrupt with the given priority group,\n           preemptive priority value, and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\n  \\return                        Encoded priority. Value can be used in the function \\ref __NVIC_SetPriority().\n */\n__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  return (\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\n         );\n}\n\n\n/**\n  \\brief   Decode Priority\n  \\details Decodes an interrupt priority value with a given priority group to\n           preemptive priority value and subpriority value.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\n  \\param [in]         Priority   Priority value, which can be retrieved with \\ref __NVIC_GetPriority().\n  \\param [in]     PriorityGroup  Used priority group.\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\n */\n__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\n{\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\n  uint32_t PreemptPriorityBits;\n  uint32_t SubPriorityBits;\n\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\n\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\n}\n\n\n/**\n  \\brief   Set Interrupt Vector\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n           VTOR must been relocated to SRAM before.\n  \\param [in]   IRQn      Interrupt number\n  \\param [in]   vector    Address of interrupt handler function\n */\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\n}\n\n\n/**\n  \\brief   Get Interrupt Vector\n  \\details Reads an interrupt vector from interrupt vector table.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn      Interrupt number.\n  \\return                 Address of interrupt handler function\n */\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\n{\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\n}\n\n\n/**\n  \\brief   System Reset\n  \\details Initiates a system reset request to reset the MCU.\n */\n__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)\n{\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\n                                                                       buffered write are completed before reset */\n  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |\n                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |\n                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */\n  __DSB();                                                          /* Ensure completion of memory access */\n\n  for(;;)                                                           /* wait until reset */\n  {\n    __NOP();\n  }\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   Set Priority Grouping (non-secure)\n  \\details Sets the non-secure priority grouping field when in secure state using the required unlock sequence.\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\n           Only values from 0..7 are used.\n           In case of a conflict between priority grouping and available\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\n  \\param [in]      PriorityGroup  Priority grouping field.\n */\n__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup)\n{\n  uint32_t reg_value;\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\n\n  reg_value  =  SCB_NS->AIRCR;                                                /* read old register configuration    */\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\n  reg_value  =  (reg_value                                   |\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\n                (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos)  );              /* Insert write key and priority group */\n  SCB_NS->AIRCR =  reg_value;\n}\n\n\n/**\n  \\brief   Get Priority Grouping (non-secure)\n  \\details Reads the priority grouping field from the non-secure NVIC when in secure state.\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void)\n{\n  return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\n}\n\n\n/**\n  \\brief   Enable Interrupt (non-secure)\n  \\details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Enable status (non-secure)\n  \\details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt is not enabled.\n  \\return             1  Interrupt is enabled.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Disable Interrupt (non-secure)\n  \\details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Pending Interrupt (non-secure)\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.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not pending.\n  \\return             1  Interrupt status is pending.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Pending Interrupt (non-secure)\n  \\details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Clear Pending Interrupt (non-secure)\n  \\details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\n  }\n}\n\n\n/**\n  \\brief   Get Active Interrupt (non-secure)\n  \\details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt.\n  \\param [in]      IRQn  Device specific interrupt number.\n  \\return             0  Interrupt status is not active.\n  \\return             1  Interrupt status is active.\n  \\note    IRQn must not be negative.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\n  }\n  else\n  {\n    return(0U);\n  }\n}\n\n\n/**\n  \\brief   Set Interrupt Priority (non-secure)\n  \\details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]      IRQn  Interrupt number.\n  \\param [in]  priority  Priority to set.\n  \\note    The priority cannot be set for every non-secure processor exception.\n */\n__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority)\n{\n  if ((int32_t)(IRQn) >= 0)\n  {\n    NVIC_NS->IPR[((uint32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n  else\n  {\n    SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\n  }\n}\n\n\n/**\n  \\brief   Get Interrupt Priority (non-secure)\n  \\details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\n           The interrupt number can be positive to specify a device specific interrupt,\n           or negative to specify a processor exception.\n  \\param [in]   IRQn  Interrupt number.\n  \\return             Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller.\n */\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn)\n{\n\n  if ((int32_t)(IRQn) >= 0)\n  {\n    return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\n  }\n  else\n  {\n    return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\n  }\n}\n#endif /*  defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_NVICFunctions */\n\n/* ##########################  MPU functions  #################################### */\n\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\n\n#include \"mpu_armv8.h\"\n\n#endif\n\n/* ##########################  FPU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\n  \\brief    Function that provides FPU type.\n  @{\n */\n\n/**\n  \\brief   get FPU type\n  \\details returns the FPU type\n  \\returns\n   - \\b  0: No FPU\n   - \\b  1: Single precision FPU\n   - \\b  2: Double + Single precision FPU\n */\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\n{\n  uint32_t mvfr0;\n\n  mvfr0 = FPU->MVFR0;\n  if      ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U)\n  {\n    return 2U;           /* Double + Single precision FPU */\n  }\n  else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U)\n  {\n    return 1U;           /* Single precision FPU */\n  }\n  else\n  {\n    return 0U;           /* No FPU */\n  }\n}\n\n\n/*@} end of CMSIS_Core_FpuFunctions */\n\n\n\n/* ##########################   SAU functions  #################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SAUFunctions SAU Functions\n  \\brief    Functions that configure the SAU.\n  @{\n */\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n\n/**\n  \\brief   Enable SAU\n  \\details Enables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Enable(void)\n{\n    SAU->CTRL |=  (SAU_CTRL_ENABLE_Msk);\n}\n\n\n\n/**\n  \\brief   Disable SAU\n  \\details Disables the Security Attribution Unit (SAU).\n */\n__STATIC_INLINE void TZ_SAU_Disable(void)\n{\n    SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk);\n}\n\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n/*@} end of CMSIS_Core_SAUFunctions */\n\n\n\n\n/* ##################################    SysTick function  ############################################ */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\n  \\brief    Functions that configure the System.\n  @{\n */\n\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\n\n/**\n  \\brief   System Tick Configuration\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n */\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                   /* Reload value impossible */\n  }\n\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                   SysTick_CTRL_TICKINT_Msk   |\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                     /* Function successful */\n}\n\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\n/**\n  \\brief   System Tick Configuration (non-secure)\n  \\details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer.\n           Counter is in free running mode to generate periodic interrupts.\n  \\param [in]  ticks  Number of ticks between two interrupts.\n  \\return          0  Function succeeded.\n  \\return          1  Function failed.\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\n           function <b>TZ_SysTick_Config_NS</b> is not included. In this case, the file <b><i>device</i>.h</b>\n           must contain a vendor-specific implementation of this function.\n\n */\n__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks)\n{\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\n  {\n    return (1UL);                                                         /* Reload value impossible */\n  }\n\n  SysTick_NS->LOAD  = (uint32_t)(ticks - 1UL);                            /* set reload register */\n  TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\n  SysTick_NS->VAL   = 0UL;                                                /* Load the SysTick Counter Value */\n  SysTick_NS->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\n                      SysTick_CTRL_TICKINT_Msk   |\n                      SysTick_CTRL_ENABLE_Msk;                            /* Enable SysTick IRQ and SysTick Timer */\n  return (0UL);                                                           /* Function successful */\n}\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\n\n#endif\n\n/*@} end of CMSIS_Core_SysTickFunctions */\n\n\n\n/* ##################################### Debug In/Output function ########################################### */\n/**\n  \\ingroup  CMSIS_Core_FunctionInterface\n  \\defgroup CMSIS_core_DebugFunctions ITM Functions\n  \\brief    Functions that access the ITM debug interface.\n  @{\n */\n\nextern volatile int32_t ITM_RxBuffer;                              /*!< External variable to receive characters. */\n#define                 ITM_RXBUFFER_EMPTY  ((int32_t)0x5AA55AA5U) /*!< Value identifying \\ref ITM_RxBuffer is ready for next character. */\n\n\n/**\n  \\brief   ITM Send Character\n  \\details Transmits a character via the ITM channel 0, and\n           \\li Just returns when no debugger is connected that has booked the output.\n           \\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.\n  \\param [in]     ch  Character to transmit.\n  \\returns            Character to transmit.\n */\n__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)\n{\n  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */\n      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */\n  {\n    while (ITM->PORT[0U].u32 == 0UL)\n    {\n      __NOP();\n    }\n    ITM->PORT[0U].u8 = (uint8_t)ch;\n  }\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Receive Character\n  \\details Inputs a character via the external variable \\ref ITM_RxBuffer.\n  \\return             Received character.\n  \\return         -1  No character pending.\n */\n__STATIC_INLINE int32_t ITM_ReceiveChar (void)\n{\n  int32_t ch = -1;                           /* no character available */\n\n  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)\n  {\n    ch = ITM_RxBuffer;\n    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */\n  }\n\n  return (ch);\n}\n\n\n/**\n  \\brief   ITM Check Character\n  \\details Checks whether a character is pending for reading in the variable \\ref ITM_RxBuffer.\n  \\return          0  No character available.\n  \\return          1  Character available.\n */\n__STATIC_INLINE int32_t ITM_CheckChar (void)\n{\n\n  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)\n  {\n    return (0);                              /* no character available */\n  }\n  else\n  {\n    return (1);                              /*    character available */\n  }\n}\n\n/*@} end of CMSIS_core_DebugFunctions */\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __CORE_CM33_H_DEPENDANT */\n\n#endif /* __CMSIS_GENERIC */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/mpu_armv8.h",
    "content": "/******************************************************************************\n * @file     mpu_armv8.h\n * @brief    CMSIS MPU API for Armv8-M and Armv8.1-M MPU\n * @version  V5.1.0\n * @date     08. March 2019\n ******************************************************************************/\n/*\n * Copyright (c) 2017-2019 Arm Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n /* Copyright (c) 2019 Modified by Dialog Semiconductor */\n\n#if   defined ( __ICCARM__ )\n  #pragma system_include         /* treat file as system include file for MISRA check */\n#elif defined (__clang__)\n  #pragma clang system_header    /* treat file as system include file */\n#endif\n\n#ifndef ARM_MPU_ARMV8_H\n#define ARM_MPU_ARMV8_H\n\n/** \\brief Attribute for device memory (outer only) */\n#define ARM_MPU_ATTR_DEVICE                           ( 0U )\n\n/** \\brief Attribute for non-cacheable, normal memory */\n#define ARM_MPU_ATTR_NON_CACHEABLE                    ( 4U )\n\n/** \\brief Attribute for normal memory (outer and inner)\n* \\param NT Non-Transient: Set to 1 for non-transient data.\n* \\param WB Write-Back: Set to 1 to use write-back update policy.\n* \\param RA Read Allocation: Set to 1 to use cache allocation on read miss.\n* \\param WA Write Allocation: Set to 1 to use cache allocation on write miss.\n*/\n#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \\\n  (((NT & 1U) << 3U) | ((WB & 1U) << 2U) | ((RA & 1U) << 1U) | (WA & 1U))\n\n/** \\brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */\n#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U)\n\n/** \\brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */\n#define ARM_MPU_ATTR_DEVICE_nGnRE  (1U)\n\n/** \\brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */\n#define ARM_MPU_ATTR_DEVICE_nGRE   (2U)\n\n/** \\brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */\n#define ARM_MPU_ATTR_DEVICE_GRE    (3U)\n\n/** \\brief Memory Attribute\n* \\param O Outer memory attributes\n* \\param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes\n*/\n#define ARM_MPU_ATTR(O, I) (((O & 0xFU) << 4U) | (((O & 0xFU) != 0U) ? (I & 0xFU) : ((I & 0x3U) << 2U)))\n\n/** \\brief Normal memory non-shareable  */\n#define ARM_MPU_SH_NON   (0U)\n\n/** \\brief Normal memory outer shareable  */\n#define ARM_MPU_SH_OUTER (2U)\n\n/** \\brief Normal memory inner shareable  */\n#define ARM_MPU_SH_INNER (3U)\n\n/** \\brief Memory access permissions\n* \\param RO Read-Only: Set to 1 for read-only memory.\n* \\param NP Non-Privileged: Set to 1 for non-privileged memory.\n*/\n#define ARM_MPU_AP_(RO, NP) (((RO & 1U) << 1U) | (NP & 1U))\n\n/** \\brief Region Base Address Register value\n* \\param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned.\n* \\param SH Defines the Shareability domain for this memory region.\n* \\param RO Read-Only: Set to 1 for a read-only memory region.\n* \\param NP Non-Privileged: Set to 1 for a non-privileged memory region.\n* \\param XN eXecute Never: Set to 1 for a non-executable memory region.\n*/\n#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \\\n  ((BASE & MPU_RBAR_BASE_Msk) | \\\n  ((SH << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \\\n  ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \\\n  ((XN << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk))\n\n/** \\brief Region Limit Address Register value\n* \\param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.\n* \\param IDX The attribute index to be associated with this memory region.\n*/\n#define ARM_MPU_RLAR(LIMIT, IDX) \\\n  ((LIMIT & MPU_RLAR_LIMIT_Msk) | \\\n  ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \\\n  (MPU_RLAR_EN_Msk))\n\n#if defined(MPU_RLAR_PXN_Pos)\n\n/** \\brief Region Limit Address Register with PXN value\n* \\param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.\n* \\param PXN Privileged execute never. Defines whether code can be executed from this privileged region.\n* \\param IDX The attribute index to be associated with this memory region.\n*/\n#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \\\n  ((LIMIT & MPU_RLAR_LIMIT_Msk) | \\\n  ((PXN << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \\\n  ((IDX << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \\\n  (MPU_RLAR_EN_Msk))\n\n#endif\n\n/**\n* Struct for a single MPU Region\n*/\ntypedef struct {\n  uint32_t RBAR;                   /*!< Region Base Address Register value */\n  uint32_t RLAR;                   /*!< Region Limit Address Register value */\n} ARM_MPU_Region_t;\n\n/** Enable the MPU.\n* \\param MPU_Control Default access permissions for unconfigured regions.\n*/\n__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)\n{\n  MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;\n#ifdef SCB_SHCSR_MEMFAULTENA_Msk\n  SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;\n#endif\n  __DSB();\n  __ISB();\n}\n\n/** Disable the MPU.\n*/\n__STATIC_INLINE void ARM_MPU_Disable(void)\n{\n  __DMB();\n#ifdef SCB_SHCSR_MEMFAULTENA_Msk\n  SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;\n#endif\n  MPU->CTRL  &= ~MPU_CTRL_ENABLE_Msk;\n}\n\n#ifdef MPU_NS\n/** Enable the Non-secure MPU.\n* \\param MPU_Control Default access permissions for unconfigured regions.\n*/\n__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control)\n{\n  MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;\n#ifdef SCB_SHCSR_MEMFAULTENA_Msk\n  SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;\n#endif\n  __DSB();\n  __ISB();\n}\n\n/** Disable the Non-secure MPU.\n*/\n__STATIC_INLINE void ARM_MPU_Disable_NS(void)\n{\n  __DMB();\n#ifdef SCB_SHCSR_MEMFAULTENA_Msk\n  SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;\n#endif\n  MPU_NS->CTRL  &= ~MPU_CTRL_ENABLE_Msk;\n}\n#endif\n\n/** Set the memory attribute encoding to the given MPU.\n* \\param mpu Pointer to the MPU to be configured.\n* \\param idx The attribute index to be set [0-7]\n* \\param attr The attribute value to be set.\n*/\n__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr)\n{\n  const uint8_t reg = idx / 4U;\n  const uint32_t pos = ((idx % 4U) * 8U);\n  const uint32_t mask = 0xFFU << pos;\n\n  if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) {\n    return; // invalid index\n  }\n\n  mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask));\n}\n\n/** Set the memory attribute encoding.\n* \\param idx The attribute index to be set [0-7]\n* \\param attr The attribute value to be set.\n*/\n__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr)\n{\n  ARM_MPU_SetMemAttrEx(MPU, idx, attr);\n}\n\n#ifdef MPU_NS\n/** Set the memory attribute encoding to the Non-secure MPU.\n* \\param idx The attribute index to be set [0-7]\n* \\param attr The attribute value to be set.\n*/\n__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr)\n{\n  ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr);\n}\n#endif\n\n/** Clear and disable the given MPU region of the given MPU.\n* \\param mpu Pointer to MPU to be used.\n* \\param rnr Region number to be cleared.\n*/\n__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr)\n{\n  mpu->RNR = rnr;\n  mpu->RLAR = 0U;\n}\n\n/** Clear and disable the given MPU region.\n* \\param rnr Region number to be cleared.\n*/\n__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)\n{\n  ARM_MPU_ClrRegionEx(MPU, rnr);\n}\n\n#ifdef MPU_NS\n/** Clear and disable the given Non-secure MPU region.\n* \\param rnr Region number to be cleared.\n*/\n__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr)\n{\n  ARM_MPU_ClrRegionEx(MPU_NS, rnr);\n}\n#endif\n\n/** Configure the given MPU region of the given MPU.\n* \\param mpu Pointer to MPU to be used.\n* \\param rnr Region number to be configured.\n* \\param rbar Value for RBAR register.\n* \\param rlar Value for RLAR register.\n*/\n__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar)\n{\n  mpu->RNR = rnr;\n  mpu->RBAR = rbar;\n  mpu->RLAR = rlar;\n}\n\n/** Configure the given MPU region.\n* \\param rnr Region number to be configured.\n* \\param rbar Value for RBAR register.\n* \\param rlar Value for RLAR register.\n*/\n__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar)\n{\n  ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar);\n}\n\n#ifdef MPU_NS\n/** Configure the given Non-secure MPU region.\n* \\param rnr Region number to be configured.\n* \\param rbar Value for RBAR register.\n* \\param rlar Value for RLAR register.\n*/\n__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar)\n{\n  ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar);\n}\n#endif\n\n/** Memcopy with strictly ordered memory access, e.g. for register targets.\n* \\param dst Destination data is copied to.\n* \\param src Source data is copied from.\n* \\param len Amount of data words to be copied.\n*/\n__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)\n{\n  uint32_t i;\n  for (i = 0U; i < len; ++i)\n  {\n    dst[i] = src[i];\n  }\n}\n\n/** Load the given number of MPU regions from a table to the given MPU.\n* \\param mpu Pointer to the MPU registers to be used.\n* \\param rnr First region number to be configured.\n* \\param table Pointer to the MPU configuration table.\n* \\param cnt Amount of regions to be configured.\n*/\n__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)\n{\n  const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;\n  if (cnt == 1U) {\n    mpu->RNR = rnr;\n    ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize);\n  } else {\n    uint32_t rnrBase   = rnr & ~(MPU_TYPE_RALIASES-1U);\n    uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES;\n\n    mpu->RNR = rnrBase;\n    while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) {\n      uint32_t c = MPU_TYPE_RALIASES - rnrOffset;\n      ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize);\n      table += c;\n      cnt -= c;\n      rnrOffset = 0U;\n      rnrBase += MPU_TYPE_RALIASES;\n      mpu->RNR = rnrBase;\n    }\n\n    ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize);\n  }\n}\n\n/** Load the given number of MPU regions from a table.\n* \\param rnr First region number to be configured.\n* \\param table Pointer to the MPU configuration table.\n* \\param cnt Amount of regions to be configured.\n*/\n__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)\n{\n  ARM_MPU_LoadEx(MPU, rnr, table, cnt);\n}\n\n#ifdef MPU_NS\n/** Load the given number of MPU regions from a table to the Non-secure MPU.\n* \\param rnr First region number to be configured.\n* \\param table Pointer to the MPU configuration table.\n* \\param cnt Amount of regions to be configured.\n*/\n__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt)\n{\n  ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt);\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/system_ARMCM0.h",
    "content": "/**************************************************************************//**\n * @file     system_ARMCM0.h\n * @brief    CMSIS Device System Header File for\n *           ARMCM0 Device\n * @version  V5.3.1\n * @date     09. July 2018\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2018 Arm Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SYSTEM_ARMCM0_H\n#define SYSTEM_ARMCM0_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nextern uint32_t SystemCoreClock;     /*!< System Clock Frequency (Core Clock) */\n\n\n/**\n  \\brief Setup the microcontroller system.\n\n   Initialize the System and update the SystemCoreClock variable.\n */\nextern void SystemInit (void);\n\n\n/**\n  \\brief  Update SystemCoreClock variable.\n\n   Updates the SystemCoreClock with current core Clock retrieved from cpu registers.\n */\nextern void SystemCoreClockUpdate (void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* SYSTEM_ARMCM0_H */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/SDK_10.0.8.105/sdk/bsp/include/system_DA1469x.h",
    "content": "/**************************************************************************//**\n * @file     system_DA1469x.h\n * @brief    CMSIS Device System Header File for DA1469x Device\n * @version  V5.3.1\n * @date     17. May 2019\n ******************************************************************************/\n/*\n * Copyright (c) 2009-2018 Arm Limited. All rights reserved.\n *\n * SPDX-License-Identifier: Apache-2.0\n *\n * Licensed under the Apache License, Version 2.0 (the License); you may\n * not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/* Copyright (c) 2017 Modified by Dialog Semiconductor */\n\n\n#ifndef SYSTEM_DA1469x_H\n#define SYSTEM_DA1469x_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdint.h>\n#include <stdbool.h>\n\nextern uint32_t SystemCoreClock;     /*!< System Clock Frequency (Core Clock) */\n\n\n/**\n  \\brief Setup the microcontroller system.\n\n   Initialize the System and update the SystemCoreClock variable.\n */\nextern void SystemInit (void);\n\n\n/**\n  \\brief  Update SystemCoreClock variable.\n   Updates the SystemCoreClock with current core Clock retrieved from cpu registers.\n */\nextern void SystemCoreClockUpdate (void);\n\n/**\n * \\brief Convert a CPU address to a physical address\n *\n * To calculate the physical address, the current remapping (SYS_CTRL_REG.REMAP_ADR0)\n * is used.\n *\n * \\param [in] addr address seen by CPU\n *\n * \\return physical address (for DMA, AES/HASH etc.) -- can be same or different as addr\n *\n */\nextern uint32_t black_orca_phy_addr(uint32_t addr);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* SYSTEM_DA1469x_H */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/da1469x.ld",
    "content": "/* Linker script for Dialog DA1469x devices\n *\n * Version: Sourcery G++ 4.5-1\n * Support: https://support.codesourcery.com/GNUToolchain/\n *\n * Copyright (c) 2007, 2008, 2009, 2010 CodeSourcery, Inc.\n *\n * The authors hereby grant permission to use, copy, modify, distribute,\n * and license this software and its documentation for any purpose, provided\n * that existing copyright notices are retained in all copies and that this\n * notice is included verbatim in any distributions.  No written agreement,\n * license, or royalty fee is required for any of the authorized uses.\n * Modifications to this software may be copyrighted by their authors\n * and need not follow the licensing terms described here, provided that\n * the new terms are clearly indicated on the first page of each file where\n * they apply.\n */\nOUTPUT_FORMAT (\"elf32-littlearm\", \"elf32-bigarm\", \"elf32-littlearm\")\n\n/* Linker script to place sections and symbol values. Should be used together\n * with other linker script that defines memory regions FLASH and RAM.\n * It references following symbols, which must be defined in code:\n *   Reset_Handler : Entry of reset handler\n *\n * It defines following symbols, which code can use without definition:\n *   __exidx_start\n *   __exidx_end\n *   __etext\n *   __data_start__\n *   __preinit_array_start\n *   __preinit_array_end\n *   __init_array_start\n *   __init_array_end\n *   __fini_array_start\n *   __fini_array_end\n *   __data_end__\n *   __bss_start__\n *   __bss_end__\n *   __HeapBase\n *   __HeapLimit\n *   __StackLimit\n *   __StackTop\n *   __stack\n *   __bssnz_start__\n *   __bssnz_end__\n */\nENTRY(Reset_Handler)\n\nSECTIONS\n{\n    .imghdr (NOLOAD):\n    {\n        . = . + _imghdr_size;\n    } > FLASH\n\n    __text = .;\n\n    .text :\n    {\n        __isr_vector_start = .;\n        KEEP(*(.isr_vector))\n        /* ISR vector shall have exactly 512 bytes */\n        . = __isr_vector_start + 0x200;\n        __isr_vector_end = .;\n\n        *(.text)\n        *(.text.*)\n\n        KEEP(*(.init))\n        KEEP(*(.fini))\n\n        /* .ctors */\n        *crtbegin.o(.ctors)\n        *crtbegin?.o(.ctors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)\n        *(SORT(.ctors.*))\n        *(.ctors)\n\n        /* .dtors */\n        *crtbegin.o(.dtors)\n        *crtbegin?.o(.dtors)\n        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)\n        *(SORT(.dtors.*))\n        *(.dtors)\n\n        *(.rodata*)\n\n        *(.eh_frame*)\n        . = ALIGN(4);\n    } > FLASH\n\n    .ARM.extab :\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n        . = ALIGN(4);\n    } > FLASH\n\n    __exidx_start = .;\n    .ARM.exidx :\n    {\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        . = ALIGN(4);\n    } > FLASH\n    __exidx_end = .;\n\n    .intvect :\n    {\n        . = ALIGN(4);\n        __intvect_start__ = .;\n        . = . + (__isr_vector_end - __isr_vector_start);\n        . = ALIGN(4);\n    } > RAM\n\n    .sleep_state (NOLOAD) :\n    {\n        . = ALIGN(4);\n        *(sleep_state)\n    } > RAM\n\n    /* This section will be zeroed by RTT package init */\n    .rtt (NOLOAD):\n    {\n        . = ALIGN(4);\n        *(.rtt)\n        . = ALIGN(4);\n    } > RAM\n\n    __text_ram_addr = LOADADDR(.text_ram);\n\n    .text_ram :\n    {\n        . = ALIGN(4);\n        __text_ram_start__ = .;\n        *(.text_ram*)\n        . = ALIGN(4);\n        __text_ram_end__ = .;\n    } > RAM AT > FLASH\n\n    __etext = LOADADDR(.data);\n\n    .data :\n    {\n        __data_start__ = .;\n        *(vtable)\n        *(.data*)\n\n        . = ALIGN(4);\n        /* preinit data */\n        PROVIDE_HIDDEN (__preinit_array_start = .);\n        *(.preinit_array)\n        PROVIDE_HIDDEN (__preinit_array_end = .);\n\n        . = ALIGN(4);\n        /* init data */\n        PROVIDE_HIDDEN (__init_array_start = .);\n        *(SORT(.init_array.*))\n        *(.init_array)\n        PROVIDE_HIDDEN (__init_array_end = .);\n\n\n        . = ALIGN(4);\n        /* finit data */\n        PROVIDE_HIDDEN (__fini_array_start = .);\n        *(SORT(.fini_array.*))\n        *(.fini_array)\n        PROVIDE_HIDDEN (__fini_array_end = .);\n\n        *(.jcr)\n        . = ALIGN(4);\n        /* All data end */\n        __data_end__ = .;\n    } > RAM AT > FLASH\n\n    .bssnz :\n    {\n        . = ALIGN(4);\n        __bssnz_start__ = .;\n        *(.bss.core.nz*)\n        . = ALIGN(4);\n        __bssnz_end__ = .;\n    } > RAM\n\n    .bss :\n    {\n        . = ALIGN(4);\n        __bss_start__ = .;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4);\n        __bss_end__ = .;\n    } > RAM\n\n    .cmac (NOLOAD) :\n    {\n        . = ALIGN(0x400);\n        *(.libcmac.ram)\n    } > RAM\n\n    /* Heap starts after BSS */\n    . = ALIGN(8);\n    __HeapBase = .;\n\n    /* .stack_dummy section doesn't contains any symbols. It is only\n     * used for linker to calculate size of stack sections, and assign\n     * values to stack symbols later */\n    .stack_dummy (COPY):\n    {\n        *(.stack*)\n    } > RAM\n\n    _ram_start = ORIGIN(RAM);\n\n    /* Set stack top to end of RAM, and stack limit move down by\n     * size of stack_dummy section */\n    __StackTop = ORIGIN(RAM) + LENGTH(RAM);\n    __StackLimit = __StackTop - SIZEOF(.stack_dummy);\n    PROVIDE(__stack = __StackTop);\n\n    /* Top of head is the bottom of the stack */\n    __HeapLimit = __StackLimit;\n\n    /* Check if data + heap + stack exceeds RAM limit */\n    ASSERT(__HeapBase <= __HeapLimit, \"region RAM overflowed with stack\")\n\n    /* Check that intvect is at the beginning of RAM */\n    ASSERT(__intvect_start__ == ORIGIN(RAM), \"intvect is not at beginning of RAM\")\n}\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/include/hal/hal_gpio.h",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n\n/**\n * @addtogroup HAL\n * @{\n *   @defgroup HALGpio HAL GPIO\n *   @{\n */\n\n#ifndef H_HAL_GPIO_\n#define H_HAL_GPIO_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * The \"mode\" of the gpio. The gpio is either an input, output, or it is\n * \"not connected\" (the pin specified is not functioning as a gpio)\n */\nenum hal_gpio_mode_e {\n    /** Not connected */\n    HAL_GPIO_MODE_NC = -1,\n    /** Input */\n    HAL_GPIO_MODE_IN = 0,\n    /** Output */\n    HAL_GPIO_MODE_OUT = 1\n};\ntypedef enum hal_gpio_mode_e hal_gpio_mode_t;\n\n/*\n * The \"pull\" of the gpio. This is either an input or an output.\n */\nenum hal_gpio_pull {\n    /** Pull-up/down not enabled */\n    HAL_GPIO_PULL_NONE = 0,\n    /** Pull-up enabled */\n    HAL_GPIO_PULL_UP = 1,\n    /** Pull-down enabled */\n    HAL_GPIO_PULL_DOWN = 2\n};\ntypedef enum hal_gpio_pull hal_gpio_pull_t;\n\n/*\n * IRQ trigger type.\n */\nenum hal_gpio_irq_trigger {\n    HAL_GPIO_TRIG_NONE = 0,\n    /** IRQ occurs on rising edge */\n    HAL_GPIO_TRIG_RISING = 1,\n    /** IRQ occurs on falling edge */\n    HAL_GPIO_TRIG_FALLING = 2,\n    /** IRQ occurs on either edge */\n    HAL_GPIO_TRIG_BOTH = 3,\n    /** IRQ occurs when line is low */\n    HAL_GPIO_TRIG_LOW = 4,\n    /** IRQ occurs when line is high */\n    HAL_GPIO_TRIG_HIGH = 5\n};\ntypedef enum hal_gpio_irq_trigger hal_gpio_irq_trig_t;\n\n/* Function proto for GPIO irq handler functions */\ntypedef void (*hal_gpio_irq_handler_t)(void *arg);\n\n/**\n * Initializes the specified pin as an input\n *\n * @param pin   Pin number to set as input\n * @param pull  pull type\n *\n * @return int  0: no error; -1 otherwise.\n */\nint hal_gpio_init_in(int pin, hal_gpio_pull_t pull);\n\n/**\n * Initialize the specified pin as an output, setting the pin to the specified\n * value.\n *\n * @param pin Pin number to set as output\n * @param val Value to set pin\n *\n * @return int  0: no error; -1 otherwise.\n */\nint hal_gpio_init_out(int pin, int val);\n\n/**\n * Deinitialize the specified pin to revert the previous initialization\n *\n * @param pin Pin number to unset\n *\n * @return int  0: no error; -1 otherwise.\n */\nint hal_gpio_deinit(int pin);\n\n/**\n * Write a value (either high or low) to the specified pin.\n *\n * @param pin Pin to set\n * @param val Value to set pin (0:low 1:high)\n */\nvoid hal_gpio_write(int pin, int val);\n\n/**\n * Reads the specified pin.\n *\n * @param pin Pin number to read\n *\n * @return int 0: low, 1: high\n */\nint hal_gpio_read(int pin);\n\n/**\n * Toggles the specified pin\n *\n * @param pin Pin number to toggle\n *\n * @return current gpio state int 0: low, 1: high\n */\nint hal_gpio_toggle(int pin);\n\n/**\n * Initialize a given pin to trigger a GPIO IRQ callback.\n *\n * @param pin     The pin to trigger GPIO interrupt on\n * @param handler The handler function to call\n * @param arg     The argument to provide to the IRQ handler\n * @param trig    The trigger mode (e.g. rising, falling)\n * @param pull    The mode of the pin (e.g. pullup, pulldown)\n *\n * @return 0 on success, non-zero error code on failure.\n */\nint hal_gpio_irq_init(int pin, hal_gpio_irq_handler_t handler, void *arg,\n                      hal_gpio_irq_trig_t trig, hal_gpio_pull_t pull);\n\n/**\n * Release a pin from being configured to trigger IRQ on state change.\n *\n * @param pin The pin to release\n */\nvoid hal_gpio_irq_release(int pin);\n\n/**\n * Enable IRQs on the passed pin\n *\n * @param pin The pin to enable IRQs on\n */\nvoid hal_gpio_irq_enable(int pin);\n\n/**\n * Disable IRQs on the passed pin\n *\n * @param pin The pin to disable IRQs on\n */\nvoid hal_gpio_irq_disable(int pin);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* H_HAL_GPIO_ */\n\n/**\n *   @} HALGpio\n * @} HAL\n */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/include/mcu/da1469x_clock.h",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef __MCU_DA1469X_CLOCK_H_\n#define __MCU_DA1469X_CLOCK_H_\n\n#include <stdint.h>\n#include \"mcu/da1469x_hal.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * Initialize XTAL32M\n */\nvoid da1469x_clock_sys_xtal32m_init(void);\n\n/**\n * Enable XTAL32M\n */\nvoid da1469x_clock_sys_xtal32m_enable(void);\n\n/**\n * Wait for XTAL32M to settle\n */\nvoid da1469x_clock_sys_xtal32m_wait_to_settle(void);\n\n/**\n * Switch sys_clk to XTAL32M\n *\n * Caller shall ensure that XTAL32M is already settled.\n */\nvoid da1469x_clock_sys_xtal32m_switch(void);\n\n/**\n * Switch sys_clk to XTAL32M\n *\n * Waits for XTAL32M to settle before switching.\n */\nvoid da1469x_clock_sys_xtal32m_switch_safe(void);\n\n/**\n * Disable RC32M\n */\nvoid da1469x_clock_sys_rc32m_disable(void);\n\n/**\n * Enable AMBA clock(s)\n *\n * @param mask\n */\nstatic inline void\nda1469x_clock_amba_enable(uint32_t mask)\n{\n    uint32_t primask;\n\n    __HAL_DISABLE_INTERRUPTS(primask);\n    CRG_TOP->CLK_AMBA_REG |= mask;\n    __HAL_ENABLE_INTERRUPTS(primask);\n}\n\n/**\n * Disable AMBA clock(s)\n *\n * @param uint32_t mask\n */\nstatic inline void\nda1469x_clock_amba_disable(uint32_t mask)\n{\n    uint32_t primask;\n\n    __HAL_DISABLE_INTERRUPTS(primask);\n    CRG_TOP->CLK_AMBA_REG &= ~mask;\n    __HAL_ENABLE_INTERRUPTS(primask);\n}\n\n/**\n * Enable PLL96\n */\nstatic inline void\nda1469x_clock_sys_pll_enable(void)\n{\n    CRG_XTAL->PLL_SYS_CTRL1_REG |= CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_EN_Msk |\n                                   CRG_XTAL_PLL_SYS_CTRL1_REG_LDO_PLL_ENABLE_Msk;\n}\n\n/**\n * Disable PLL96\n *\n * If PLL was used as SYS_CLOCK switches to XTAL32M.\n */\nvoid da1469x_clock_sys_pll_disable(void);\n\n/**\n * Checks whether PLL96 is locked and can be use as system clock or USB clock\n *\n * @return 0 if PLL is off, non-0 it its running\n */\nstatic inline int\nda1469x_clock_is_pll_locked(void)\n{\n    return 0 != (CRG_XTAL->PLL_SYS_STATUS_REG & CRG_XTAL_PLL_SYS_STATUS_REG_PLL_LOCK_FINE_Msk);\n}\n\n/**\n * Waits for PLL96 to lock.\n */\nvoid da1469x_clock_pll_wait_to_lock(void);\n\n/**\n * Switches system clock to PLL96\n *\n * Caller shall ensure that PLL is already locked.\n */\nvoid da1469x_clock_sys_pll_switch(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __MCU_DA1469X_CLOCK_H_ */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/include/mcu/da1469x_hal.h",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef __MCU_DA1469X_HAL_H_\n#define __MCU_DA1469X_HAL_H_\n\n#include <assert.h>\n#include \"mcu/mcu.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Helper functions to enable/disable interrupts. */\n#define __HAL_DISABLE_INTERRUPTS(x)                     \\\n    do {                                                \\\n        x = __get_PRIMASK();                            \\\n        __disable_irq();                                \\\n    } while (0)\n\n#define __HAL_ENABLE_INTERRUPTS(x)                      \\\n    do {                                                \\\n        if (!x) {                                       \\\n            __enable_irq();                             \\\n        }                                               \\\n    } while (0)\n\n#define __HAL_ASSERT_CRITICAL()                         \\\n    do {                                                \\\n        assert(__get_PRIMASK() & 1);                    \\\n    } while (0)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  /* __MCU_DA1469X_HAL_H_ */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/include/mcu/mcu.h",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n#ifndef __MCU_MCU_H_\n#define __MCU_MCU_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"DA1469xAB.h\"\n\n#define sec_text_ram_core   __attribute__((section(\".text_ram\"))) __attribute__((noinline))\n\n#define MCU_SYSVIEW_INTERRUPTS \\\n    \"I#1=Reset,I#2=MNI,I#3=HardFault,I#4=MemoryMgmt,I#5=BusFault,I#6=UsageFault,\" \\\n    \"I#7=SecureFault,I#11=SVCall,I#12=DebugMonitor,I#14=PendSV,I#15=SysTick,\" \\\n    \"I#16=SENSOR_NODE,I#17=DMA,I#18=CHARGER_STATE,I#19=CHARGER_ERROR,\" \\\n    \"I#20=CMAC2SYS,I#21=UART,I#22=UART2,I#23=UART3,I#24=I2C,I#25=I2C2,I#26=SPI,\" \\\n    \"I#27=SPI2,I#28=PCM,I#29=SRC_IN,I#30=SRC_OUT,I#31=USB,I#32=TIMER,\" \\\n    \"I#33=TIMER2,I#34=RTC,I#35=KEY_WKUP_GPIO,I#36=PDC,I#37=VBUS,I#38=MRM,\" \\\n    \"I#39=MOTOR_CONTROLLER,I#40=TRNG,I#41=DCDC,I#42=XTAL32M_RDY,I#43=ADC,\" \\\n    \"I#44=ADC2,I#45=CRYPTO,I#46=CAPTIMER1,I#47=RFDIAG,I#48=LCD_CONTROLLER,\" \\\n    \"I#49=PLL_LOCK,I#50=TIMER3,I#51=TIMER4,I#52=LRA,I#53=RTC_EVENT,\" \\\n    \"I#54=GPIO_P0,I#55=GPIO_P1\"\n\n/**\n* \\brief GPIO function\n*\n*/\ntypedef enum {\n    MCU_GPIO_FUNC_GPIO = 0,                  /**< GPIO */\n    MCU_GPIO_FUNC_UART_RX = 1,               /**< GPIO as UART RX */\n    MCU_GPIO_FUNC_UART_TX = 2,               /**< GPIO as UART TX */\n    MCU_GPIO_FUNC_UART2_RX = 3,              /**< GPIO as UART2 RX */\n    MCU_GPIO_FUNC_UART2_TX = 4,              /**< GPIO as UART2 TX */\n    MCU_GPIO_FUNC_UART2_CTSN = 5,            /**< GPIO as UART2 CTSN */\n    MCU_GPIO_FUNC_UART2_RTSN = 6,            /**< GPIO as UART2 RTSN */\n    MCU_GPIO_FUNC_UART3_RX = 7,              /**< GPIO as UART3 RX */\n    MCU_GPIO_FUNC_UART3_TX = 8,              /**< GPIO as UART3 TX */\n    MCU_GPIO_FUNC_UART3_CTSN = 9,            /**< GPIO as UART3 CTSN */\n    MCU_GPIO_FUNC_UART3_RTSN = 10,           /**< GPIO as UART3 RTSN */\n    MCU_GPIO_FUNC_ISO_CLK = 11,              /**< GPIO as ISO CLK */\n    MCU_GPIO_FUNC_ISO_DATA = 12,             /**< GPIO as ISO DATA */\n    MCU_GPIO_FUNC_SPI_DI = 13,               /**< GPIO as SPI DI */\n    MCU_GPIO_FUNC_SPI_DO = 14,               /**< GPIO as SPI DO */\n    MCU_GPIO_FUNC_SPI_CLK = 15,              /**< GPIO as SPI CLK */\n    MCU_GPIO_FUNC_SPI_EN = 16,               /**< GPIO as SPI EN */\n    MCU_GPIO_FUNC_SPI2_DI = 17,              /**< GPIO as SPI2 DI */\n    MCU_GPIO_FUNC_SPI2_DO = 18,              /**< GPIO as SPI2 DO */\n    MCU_GPIO_FUNC_SPI2_CLK = 19,             /**< GPIO as SPI2 CLK */\n    MCU_GPIO_FUNC_SPI2_EN = 20,              /**< GPIO as SPI2 EN */\n    MCU_GPIO_FUNC_I2C_SCL = 21,              /**< GPIO as I2C SCL */\n    MCU_GPIO_FUNC_I2C_SDA = 22,              /**< GPIO as I2C SDA */\n    MCU_GPIO_FUNC_I2C2_SCL = 23,             /**< GPIO as I2C2 SCL */\n    MCU_GPIO_FUNC_I2C2_SDA = 24,             /**< GPIO as I2C2 SDA */\n    MCU_GPIO_FUNC_USB_SOF = 25,              /**< GPIO as USB SOF */\n    MCU_GPIO_FUNC_ADC = 26,                  /**< GPIO as ADC (dedicated pin) */\n    MCU_GPIO_FUNC_USB = 27,                  /**< GPIO as USB */\n    MCU_GPIO_FUNC_PCM_DI = 28,               /**< GPIO as PCM DI */\n    MCU_GPIO_FUNC_PCM_DO = 29,               /**< GPIO as PCM DO */\n    MCU_GPIO_FUNC_PCM_FSC = 30,              /**< GPIO as PCM FSC */\n    MCU_GPIO_FUNC_PCM_CLK = 31,              /**< GPIO as PCM CLK */\n    MCU_GPIO_FUNC_PDM_DATA = 32,             /**< GPIO as PDM DATA */\n    MCU_GPIO_FUNC_PDM_CLK = 33,              /**< GPIO as PDM CLK */\n    MCU_GPIO_FUNC_COEX_EXT_ACT = 34,         /**< GPIO as COEX EXT ACT0 */\n    MCU_GPIO_FUNC_COEX_SMART_ACT = 35,       /**< GPIO as COEX SMART ACT */\n    MCU_GPIO_FUNC_COEX_SMART_PRI = 36,       /**< GPIO as COEX SMART PRI */\n    MCU_GPIO_FUNC_PORT0_DCF = 37,            /**< GPIO as PORT0 DCF */\n    MCU_GPIO_FUNC_PORT1_DCF = 38,            /**< GPIO as PORT1 DCF */\n    MCU_GPIO_FUNC_PORT2_DCF = 39,            /**< GPIO as PORT2 DCF */\n    MCU_GPIO_FUNC_PORT3_DCF = 40,            /**< GPIO as PORT3 DCF */\n    MCU_GPIO_FUNC_PORT4_DCF = 41,            /**< GPIO as PORT4 DCF */\n    MCU_GPIO_FUNC_CLOCK = 42,                /**< GPIO as CLOCK */\n    MCU_GPIO_FUNC_PG = 43,                   /**< GPIO as PG */\n    MCU_GPIO_FUNC_LCD = 44,                  /**< GPIO as LCD */\n    MCU_GPIO_FUNC_LCD_SPI_DC = 45,           /**< GPIO as LCD SPI DC */\n    MCU_GPIO_FUNC_LCD_SPI_DO = 46,           /**< GPIO as LCD SPI DO */\n    MCU_GPIO_FUNC_LCD_SPI_CLK = 47,          /**< GPIO as LCD SPI CLK */\n    MCU_GPIO_FUNC_LCD_SPI_EN = 48,           /**< GPIO as LCD SPI EN */\n    MCU_GPIO_FUNC_TIM_PWM = 49,              /**< GPIO as TIM PWM */\n    MCU_GPIO_FUNC_TIM2_PWM = 50,             /**< GPIO as TIM2 PWM */\n    MCU_GPIO_FUNC_TIM_1SHOT = 51,            /**< GPIO as TIM 1SHOT */\n    MCU_GPIO_FUNC_TIM2_1SHOT = 52,           /**< GPIO as TIM2 1SHOT */\n    MCU_GPIO_FUNC_TIM3_PWM = 53,             /**< GPIO as TIM3 PWM */\n    MCU_GPIO_FUNC_TIM4_PWM = 54,             /**< GPIO as TIM4 PWM */\n    MCU_GPIO_FUNC_AGC_EXT = 55,              /**< GPIO as AGC EXT */\n    MCU_GPIO_FUNC_CMAC_DIAG0 = 56,           /**< GPIO as CMAC DIAG0 */\n    MCU_GPIO_FUNC_CMAC_DIAG1 = 57,           /**< GPIO as CMAC DIAG1 */\n    MCU_GPIO_FUNC_CMAC_DIAG2 = 58,           /**< GPIO as CMAC DIAG2 */\n    MCU_GPIO_FUNC_CMAC_DIAGX = 59,           /**< GPIO as CMAC DIAGX */\n    MCU_GPIO_FUNC_LAST,\n} mcu_gpio_func;\n\n#define MCU_GPIO_MODE_INPUT                 0x000    /**< GPIO as an input */\n#define MCU_GPIO_MODE_INPUT_PULLUP          0x100    /**< GPIO as an input with pull-up */\n#define MCU_GPIO_MODE_INPUT_PULLDOWN        0x200    /**< GPIO as an input with pull-down */\n#define MCU_GPIO_MODE_OUTPUT                0x300    /**< GPIO as an output */\n#define MCU_GPIO_MODE_OUTPUT_OPEN_DRAIN     0x700    /**< GPIO as an open-drain output */\n\n#define MCU_GPIO_PORT0_PIN_COUNT            32\n#define MCU_GPIO_PORT0(pin)\t\t((0 * 32) + (pin))\n#define MCU_GPIO_PORT1(pin)\t\t((1 * 32) + (pin))\n#define MCU_DMA_CHAN_MAX                    8\n\n#define MCU_PIN_GPADC_SEL0               MCU_GPIO_PORT1(9)\n#define MCU_PIN_GPADC_SEL1               MCU_GPIO_PORT0(25)\n#define MCU_PIN_GPADC_SEL2               MCU_GPIO_PORT0(8)\n#define MCU_PIN_GPADC_SEL3               MCU_GPIO_PORT0(9)\n#define MCU_PIN_GPADC_SEL16              MCU_GPIO_PORT1(13)\n#define MCU_PIN_GPADC_SEL17              MCU_GPIO_PORT1(12)\n#define MCU_PIN_GPADC_SEL18              MCU_GPIO_PORT1(18)\n#define MCU_PIN_GPADC_SEL19              MCU_GPIO_PORT1(19)\n#define MCU_PIN_GPADC_DIFF0_P0           MCU_GPIO_PORT1(9)\n#define MCU_PIN_GPADC_DIFF0_P1           MCU_GPIO_PORT0(25)\n#define MCU_PIN_GPADC_DIFF1_P0           MCU_GPIO_PORT0(8)\n#define MCU_PIN_GPADC_DIFF1_P1           MCU_GPIO_PORT0(9)\n\n#define MCU_PIN_SDADC0               MCU_GPIO_PORT1(9)\n#define MCU_PIN_SDADC1               MCU_GPIO_PORT0(25)\n#define MCU_PIN_SDADC2               MCU_GPIO_PORT0(8)\n#define MCU_PIN_SDADC3               MCU_GPIO_PORT0(9)\n#define MCU_PIN_SDADC4               MCU_GPIO_PORT1(14)\n#define MCU_PIN_SDADC5               MCU_GPIO_PORT1(20)\n#define MCU_PIN_SDADC6               MCU_GPIO_PORT1(21)\n#define MCU_PIN_SDADC7               MCU_GPIO_PORT1(22)\n\nvoid mcu_gpio_set_pin_function(int pin, int mode, mcu_gpio_func func);\nvoid mcu_gpio_enter_sleep(void);\nvoid mcu_gpio_exit_sleep(void);\n\n#define MCU_MEM_QSPIF_M_END_REMAP_ADDRESS (0x800000)\n#define MCU_MEM_QSPIF_M_START_ADDRESS   (0x16000000)\n#define MCU_MEM_QSPIF_M_END_ADDRESS     (0x18000000)\n#define MCU_MEM_SYSRAM_START_ADDRESS    (0x20000000)\n#define MCU_MEM_SYSRAM_END_ADDRESS      (0x20080000)\n\n#define MCU_OTPM_BASE 0x30080000UL\n#define MCU_OTPM_SIZE 4096\n\n/* Largest group id seen on a DA14699 was 18 so far */\n#define MCU_TRIMV_GROUP_ID_MAX          (18)\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* __MCU_MCU_H_ */\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/src/da1469x_clock.c",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n#include <assert.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include \"syscfg/syscfg.h\"\n#include \"mcu/da1469x_hal.h\"\n#include \"mcu/da1469x_clock.h\"\n\nstatic inline bool\nda1469x_clock_is_xtal32m_settled(void)\n{\n    return ((*(uint32_t *)0x5001001c & 0xff00) == 0) &&\n           ((*(uint32_t *)0x50010054 & 0x000f) != 0xb);\n}\n\nvoid\nda1469x_clock_sys_xtal32m_init(void)\n{\n    uint32_t reg;\n    int xtalrdy_cnt;\n\n    /* Number of lp_clk cycles (~30.5us) */\n    xtalrdy_cnt = MYNEWT_VAL(MCU_CLOCK_XTAL32M_SETTLE_TIME_US) * 10 / 305;\n\n    reg = CRG_XTAL->XTALRDY_CTRL_REG;\n    reg &= ~(CRG_XTAL_XTALRDY_CTRL_REG_XTALRDY_CLK_SEL_Msk |\n             CRG_XTAL_XTALRDY_CTRL_REG_XTALRDY_CNT_Msk);\n    reg |= xtalrdy_cnt;\n    CRG_XTAL->XTALRDY_CTRL_REG = reg;\n}\n\nvoid\nda1469x_clock_sys_xtal32m_enable(void)\n{\n  PDC->PDC_CTRL0_REG = (2 << PDC_PDC_CTRL0_REG_TRIG_SELECT_Pos) |\n                       (15 << PDC_PDC_CTRL0_REG_TRIG_ID_Pos) |\n                       (1 << PDC_PDC_CTRL0_REG_PDC_MASTER_Pos) |\n                       (1 << PDC_PDC_CTRL0_REG_EN_XTAL_Pos);\n\n  PDC->PDC_SET_PENDING_REG = 0;\n  PDC->PDC_ACKNOWLEDGE_REG = 0;\n}\n\nvoid\nda1469x_clock_sys_xtal32m_switch(void)\n{\n    if (CRG_TOP->CLK_CTRL_REG & CRG_TOP_CLK_CTRL_REG_RUNNING_AT_RC32M_Msk) {\n        CRG_TOP->CLK_SWITCH2XTAL_REG = CRG_TOP_CLK_SWITCH2XTAL_REG_SWITCH2XTAL_Msk;\n    } else {\n        CRG_TOP->CLK_CTRL_REG &= ~CRG_TOP_CLK_CTRL_REG_SYS_CLK_SEL_Msk;\n    }\n\n    while (!(CRG_TOP->CLK_CTRL_REG & CRG_TOP_CLK_CTRL_REG_RUNNING_AT_XTAL32M_Msk));\n}\n\nvoid\nda1469x_clock_sys_xtal32m_wait_to_settle(void)\n{\n    uint32_t primask;\n\n    __HAL_DISABLE_INTERRUPTS(primask);\n\n    NVIC_ClearPendingIRQ(XTAL32M_RDY_IRQn);\n\n    if (!da1469x_clock_is_xtal32m_settled()) {\n        NVIC_EnableIRQ(XTAL32M_RDY_IRQn);\n        while (!NVIC_GetPendingIRQ(XTAL32M_RDY_IRQn)) {\n            __WFI();\n        }\n        NVIC_DisableIRQ(XTAL32M_RDY_IRQn);\n    }\n\n    __HAL_ENABLE_INTERRUPTS(primask);\n}\n\nvoid\nda1469x_clock_sys_xtal32m_switch_safe(void)\n{\n    da1469x_clock_sys_xtal32m_wait_to_settle();\n\n    da1469x_clock_sys_xtal32m_switch();\n}\n\nvoid\nda1469x_clock_sys_rc32m_disable(void)\n{\n    CRG_TOP->CLK_RC32M_REG &= ~CRG_TOP_CLK_RC32M_REG_RC32M_ENABLE_Msk;\n}\n\nvoid\nda1469x_clock_lp_xtal32k_enable(void)\n{\n    CRG_TOP->CLK_XTAL32K_REG |= CRG_TOP_CLK_XTAL32K_REG_XTAL32K_ENABLE_Msk;\n}\n\nvoid\nda1469x_clock_lp_xtal32k_switch(void)\n{\n    CRG_TOP->CLK_CTRL_REG = (CRG_TOP->CLK_CTRL_REG &\n                             ~CRG_TOP_CLK_CTRL_REG_LP_CLK_SEL_Msk) |\n                            (2 << CRG_TOP_CLK_CTRL_REG_LP_CLK_SEL_Pos);\n}\n\nvoid\nda1469x_clock_pll_disable(void)\n{\n    while (CRG_TOP->CLK_CTRL_REG & CRG_TOP_CLK_CTRL_REG_RUNNING_AT_PLL96M_Msk) {\n        CRG_TOP->CLK_SWITCH2XTAL_REG = CRG_TOP_CLK_SWITCH2XTAL_REG_SWITCH2XTAL_Msk;\n    }\n\n    CRG_XTAL->PLL_SYS_CTRL1_REG &= ~CRG_XTAL_PLL_SYS_CTRL1_REG_PLL_EN_Msk;\n}\n\nvoid\nda1469x_clock_pll_wait_to_lock(void)\n{\n    uint32_t primask;\n\n    __HAL_DISABLE_INTERRUPTS(primask);\n\n    NVIC_ClearPendingIRQ(PLL_LOCK_IRQn);\n\n    if (!da1469x_clock_is_pll_locked()) {\n        NVIC_EnableIRQ(PLL_LOCK_IRQn);\n        while (!NVIC_GetPendingIRQ(PLL_LOCK_IRQn)) {\n            __WFI();\n        }\n        NVIC_DisableIRQ(PLL_LOCK_IRQn);\n    }\n\n    __HAL_ENABLE_INTERRUPTS(primask);\n}\n\nvoid\nda1469x_clock_sys_pll_switch(void)\n{\n    /* CLK_SEL_Msk == 3 means PLL */\n    CRG_TOP->CLK_CTRL_REG |= CRG_TOP_CLK_CTRL_REG_SYS_CLK_SEL_Msk;\n\n    while (!(CRG_TOP->CLK_CTRL_REG & CRG_TOP_CLK_CTRL_REG_RUNNING_AT_PLL96M_Msk));\n}\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/src/hal_gpio.c",
    "content": "\n/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n#include <assert.h>\n#include <stddef.h>\n#include \"syscfg/syscfg.h\"\n#include \"mcu/da1469x_hal.h\"\n#include <mcu/mcu.h>\n#include \"hal/hal_gpio.h\"\n\n/* GPIO interrupts */\n#define HAL_GPIO_MAX_IRQ        MYNEWT_VAL(MCU_GPIO_MAX_IRQ)\n\n#define GPIO_REG(name) ((__IO uint32_t *)(GPIO_BASE + offsetof(GPIO_Type, name)))\n#define WAKEUP_REG(name) ((__IO uint32_t *)(WAKEUP_BASE + offsetof(WAKEUP_Type, name)))\n#define CRG_TOP_REG(name) ((__IO uint32_t *)(CRG_TOP_BASE + offsetof(CRG_TOP_Type, name)))\n\n#ifndef MCU_GPIO_PORT0_PIN_COUNT\n#define MCU_GPIO_PORT0_PIN_COUNT 32\n#endif\n\n#if (MCU_GPIO_PORT0_PIN_COUNT) == 32\n#define GPIO_PORT(pin)          (((unsigned)(pin)) >> 5U)\n#define GPIO_PORT_PIN(pin)      (((unsigned)(pin)) & 31U)\n#else\n#define GPIO_PORT(pin)          (((unsigned)(pin)) < MCU_GPIO_PORT0_PIN_COUNT ? 0 : 1)\n#define GPIO_PORT_PIN(pin)      ((unsigned)(pin) < MCU_GPIO_PORT0_PIN_COUNT ? \\\n                                (pin) : (pin) - MCU_GPIO_PORT0_PIN_COUNT)\n#endif\n\n#define GPIO_PIN_BIT(pin)       (1 << GPIO_PORT_PIN(pin))\n\n#define GPIO_PIN_DATA_REG_ADDR(pin)        (GPIO_REG(P0_DATA_REG) + GPIO_PORT(pin))\n#define GPIO_PIN_DATA_REG(pin)             *GPIO_PIN_DATA_REG_ADDR(pin)\n#define GPIO_PIN_SET_DATA_REG_ADDR(pin)    (GPIO_REG(P0_SET_DATA_REG) + GPIO_PORT(pin))\n#define GPIO_PIN_SET_DATA_REG(pin)         *GPIO_PIN_SET_DATA_REG_ADDR(pin)\n#define GPIO_PIN_RESET_DATA_REG_ADDR(pin)  (GPIO_REG(P0_RESET_DATA_REG) + GPIO_PORT(pin))\n#define GPIO_PIN_RESET_DATA_REG(pin)       *GPIO_PIN_RESET_DATA_REG_ADDR(pin)\n#define GPIO_PIN_MODE_REG_ADDR(pin)        (GPIO_REG(P0_00_MODE_REG) + (pin))\n#define GPIO_PIN_MODE_REG(pin)             *GPIO_PIN_MODE_REG_ADDR(pin)\n#define GPIO_PIN_PADPWR_CTRL_REG_ADDR(pin) (GPIO_REG(P0_PADPWR_CTRL_REG) + GPIO_PORT(pin))\n#define GPIO_PIN_PADPWR_CTRL_REG(pin)      *GPIO_PIN_PADPWR_CTRL_REG_ADDR(pin)\n#define GPIO_PIN_UNLATCH_ADDR(pin)         (CRG_TOP_REG(P0_SET_PAD_LATCH_REG) + GPIO_PORT(pin) * 3)\n#define GPIO_PIN_LATCH_ADDR(pin)           (CRG_TOP_REG(P0_RESET_PAD_LATCH_REG) + GPIO_PORT(pin) * 3)\n\n#define WKUP_CTRL_REG_ADDR              (WAKEUP_REG(WKUP_CTRL_REG))\n#define WKUP_RESET_IRQ_REG_ADDR         (WAKEUP_REG(WKUP_RESET_IRQ_REG))\n#define WKUP_SELECT_PX_REG_ADDR(pin)    (WAKEUP_REG(WKUP_SELECT_P0_REG) + GPIO_PORT(pin))\n#define WKUP_SELECT_PX_REG(pin)         *(WKUP_SELECT_PX_REG_ADDR(pin))\n#define WKUP_POL_PX_REG_ADDR(pin)       (WAKEUP_REG(WKUP_POL_P0_REG) + GPIO_PORT(pin))\n#define WKUP_POL_PX_SET_FALLING(pin)    do { *(WKUP_POL_PX_REG_ADDR(pin)) |= GPIO_PIN_BIT(pin); } while (0)\n#define WKUP_POL_PX_SET_RISING(pin)     do { *(WKUP_POL_PX_REG_ADDR(pin)) &= ~GPIO_PIN_BIT(pin); } while (0)\n#define WKUP_STAT_PX_REG_ADDR(pin)      (WAKEUP_REG(WKUP_STATUS_P0_REG) + GPIO_PORT(pin))\n#define WKUP_STAT(pin)                  ((*(WKUP_STAT_PX_REG_ADDR(pin)) >> GPIO_PORT_PIN(pin)) & 1)\n#define WKUP_CLEAR_PX_REG_ADDR(pin)     (WAKEUP_REG(WKUP_CLEAR_P0_REG) + GPIO_PORT(pin))\n#define WKUP_CLEAR_PX(pin)              do { (*(WKUP_CLEAR_PX_REG_ADDR(pin)) = GPIO_PIN_BIT(pin)); } while (0)\n#define WKUP_SEL_GPIO_PX_REG_ADDR(pin)  (WAKEUP_REG(WKUP_SEL_GPIO_P0_REG) + GPIO_PORT(pin))\n#define WKUP_SEL_GPIO_PX_REG(pin)       *(WKUP_SEL_GPIO_PX_REG_ADDR(pin))\n\n/* Storage for GPIO callbacks. */\nstruct hal_gpio_irq {\n    int pin;\n    hal_gpio_irq_handler_t func;\n    void *arg;\n};\n\nstatic struct hal_gpio_irq hal_gpio_irqs[HAL_GPIO_MAX_IRQ];\n\n#if MYNEWT_VAL(MCU_GPIO_RETAINABLE_NUM) >= 0\nstatic uint32_t g_mcu_gpio_latch_state[2];\nstatic uint8_t g_mcu_gpio_retained_num;\nstatic struct da1469x_retreg g_mcu_gpio_retained[MYNEWT_VAL(MCU_GPIO_RETAINABLE_NUM)];\n#endif\n\n/*\n * We assume that any latched pin has default configuration, i.e. was either\n * not configured or was deinited. Any unlatched pin is considered to be used\n * by someone.\n *\n * By default, all pins are assumed to have default configuration and are\n * latched. This allows PD_COM to be disabled (if no other peripheral needs\n * it) since we do not need GPIO mux to be active.\n *\n * Configuration of any pin shall be done as follows, with interrupts disabled:\n * 1. call mcu_gpio_unlatch_prepare() to enable PD_COM if needed\n * 2. configure pin\n * 3. call mcu_gpio_unlatch() to actually unlatch pin\n *\n * Once pin is restored to default configuration it shall be latched again by\n * calling mcu_gpio_latch().\n */\n\n#if MYNEWT_VAL(MCU_GPIO_RETAINABLE_NUM) >= 0\nstatic void\nmcu_gpio_retained_add_port(uint32_t latch_val, volatile uint32_t *base_reg)\n{\n    struct da1469x_retreg *retreg;\n    int pin;\n\n    retreg = &g_mcu_gpio_retained[g_mcu_gpio_retained_num];\n\n    while (latch_val) {\n        assert(g_mcu_gpio_retained_num < MYNEWT_VAL(MCU_GPIO_RETAINABLE_NUM));\n\n        pin = __builtin_ctz(latch_val);\n        latch_val &= ~(1 << pin);\n\n        da1469x_retreg_assign(retreg, &base_reg[pin]);\n\n        g_mcu_gpio_retained_num++;\n        retreg++;\n    }\n}\n#endif\n\nstatic void\nmcu_gpio_retained_refresh(void)\n{\n#if MYNEWT_VAL(MCU_GPIO_RETAINABLE_NUM) >= 0\n    g_mcu_gpio_retained_num = 0;\n\n    mcu_gpio_retained_add_port(CRG_TOP->P0_PAD_LATCH_REG, &GPIO->P0_00_MODE_REG);\n    mcu_gpio_retained_add_port(CRG_TOP->P1_PAD_LATCH_REG, &GPIO->P1_00_MODE_REG);\n#endif\n}\n\nstatic inline void\nmcu_gpio_unlatch_prepare(int pin)\n{\n    __HAL_ASSERT_CRITICAL();\n    (void)pin;\n\n    /* Acquire PD_COM if first pin will be unlatched */\n//    if ((CRG_TOP->P0_PAD_LATCH_REG | CRG_TOP->P1_PAD_LATCH_REG) == 0) {\n//        da1469x_pd_acquire(MCU_PD_DOMAIN_COM);\n//    }\n}\n\nstatic inline void\nmcu_gpio_unlatch(int pin)\n{\n    __HAL_ASSERT_CRITICAL();\n\n    *GPIO_PIN_UNLATCH_ADDR(pin) = GPIO_PIN_BIT(pin);\n    mcu_gpio_retained_refresh();\n}\n\nstatic inline void\nmcu_gpio_latch(int pin)\n{\n    (void)pin;\n//    uint32_t primask;\n//    uint32_t latch_pre;\n//    uint32_t latch_post;\n//\n//    __HAL_DISABLE_INTERRUPTS(primask);\n//\n//    latch_pre = CRG_TOP->P0_PAD_LATCH_REG | CRG_TOP->P1_PAD_LATCH_REG;\n//\n//    *GPIO_PIN_LATCH_ADDR(pin) = GPIO_PIN_BIT(pin);\n//    mcu_gpio_retained_refresh();\n//\n//    latch_post = CRG_TOP->P0_PAD_LATCH_REG | CRG_TOP->P1_PAD_LATCH_REG;\n//\n//    /* Release PD_COM if last pin was latched */\n//    if (latch_pre && !latch_post) {\n//        da1469x_pd_release(MCU_PD_DOMAIN_COM);\n//    }\n//\n//    __HAL_ENABLE_INTERRUPTS(primask);\n}\n\nint\nhal_gpio_init_in(int pin, hal_gpio_pull_t pull)\n{\n    volatile uint32_t *px_xx_mod_reg = GPIO_PIN_MODE_REG_ADDR(pin);\n    uint32_t regval;\n    uint32_t primask;\n\n    switch (pull) {\n    case HAL_GPIO_PULL_UP:\n        regval = MCU_GPIO_FUNC_GPIO | MCU_GPIO_MODE_INPUT_PULLUP;\n        break;\n    case HAL_GPIO_PULL_DOWN:\n        regval = MCU_GPIO_FUNC_GPIO | MCU_GPIO_MODE_INPUT_PULLDOWN;\n        break;\n    case HAL_GPIO_PULL_NONE:\n        regval = MCU_GPIO_FUNC_GPIO | MCU_GPIO_MODE_INPUT;\n        break;\n    default:\n        return -1;\n    }\n\n    __HAL_DISABLE_INTERRUPTS(primask);\n\n    mcu_gpio_unlatch_prepare(pin);\n\n    *px_xx_mod_reg = regval;\n\n    mcu_gpio_unlatch(pin);\n\n    __HAL_ENABLE_INTERRUPTS(primask);\n\n    return 0;\n}\n\nint\nhal_gpio_init_out(int pin, int val)\n{\n    uint32_t primask;\n\n    __HAL_DISABLE_INTERRUPTS(primask);\n\n    mcu_gpio_unlatch_prepare(pin);\n\n    GPIO_PIN_MODE_REG(pin) = MCU_GPIO_MODE_OUTPUT;\n\n    if (val) {\n        GPIO_PIN_SET_DATA_REG(pin) = GPIO_PIN_BIT(pin);\n    } else {\n        GPIO_PIN_RESET_DATA_REG(pin) = GPIO_PIN_BIT(pin);\n    }\n\n    mcu_gpio_unlatch(pin);\n\n    __HAL_ENABLE_INTERRUPTS(primask);\n\n    return 0;\n}\n\nint\nhal_gpio_deinit(int pin)\n{\n    /* Reset mode to default value and latch pin */\n    GPIO_PIN_MODE_REG(pin) = 0x200;\n    GPIO_PIN_RESET_DATA_REG(pin) = GPIO_PIN_BIT(pin);\n\n    mcu_gpio_latch(pin);\n\n    return 0;\n}\n\nvoid\nhal_gpio_write(int pin, int val)\n{\n    if (val) {\n        GPIO_PIN_SET_DATA_REG(pin) = GPIO_PIN_BIT(pin);\n    } else {\n        GPIO_PIN_RESET_DATA_REG(pin) = GPIO_PIN_BIT(pin);\n    }\n}\n\nint\nhal_gpio_read(int pin)\n{\n    return (GPIO_PIN_DATA_REG(pin) >> GPIO_PORT_PIN(pin)) & 1;\n}\n\nint\nhal_gpio_toggle(int pin)\n{\n    int new_value = hal_gpio_read(pin) == 0;\n\n    hal_gpio_write(pin, new_value);\n\n    return new_value;\n}\n\nstatic void\nhal_gpio_irq_handler(void)\n{\n    struct hal_gpio_irq *irq;\n    uint32_t stat;\n    int i;\n\n    *WKUP_RESET_IRQ_REG_ADDR = 1;\n    NVIC_ClearPendingIRQ(KEY_WKUP_GPIO_IRQn);\n\n    for (i = 0; i < HAL_GPIO_MAX_IRQ; i++) {\n        irq = &hal_gpio_irqs[i];\n\n        /* Read latched status value from relevant GPIO port */\n        stat = WKUP_STAT(irq->pin);\n\n        if (irq->func && stat) {\n            irq->func(irq->arg);\n        }\n\n        WKUP_CLEAR_PX(irq->pin);\n    }\n}\n\nstatic void\nhal_gpio_irq_setup(void)\n{\n    static uint8_t irq_setup;\n    int sr;\n\n    if (!irq_setup) {\n        __HAL_DISABLE_INTERRUPTS(sr);\n\n        irq_setup = 1;\n\n        NVIC_ClearPendingIRQ(GPIO_P0_IRQn);\n        NVIC_ClearPendingIRQ(GPIO_P1_IRQn);\n        NVIC_SetVector(GPIO_P0_IRQn, (uint32_t)hal_gpio_irq_handler);\n        NVIC_SetVector(GPIO_P1_IRQn, (uint32_t)hal_gpio_irq_handler);\n        WAKEUP->WKUP_CTRL_REG = 0;\n        WAKEUP->WKUP_CLEAR_P0_REG = 0xFFFFFFFF;\n        WAKEUP->WKUP_CLEAR_P1_REG = 0x007FFFFF;\n        WAKEUP->WKUP_SELECT_P0_REG = 0;\n        WAKEUP->WKUP_SELECT_P1_REG = 0;\n        WAKEUP->WKUP_SEL_GPIO_P0_REG = 0;\n        WAKEUP->WKUP_SEL_GPIO_P1_REG = 0;\n        WAKEUP->WKUP_RESET_IRQ_REG = 0;\n\n        CRG_TOP->CLK_TMR_REG |= CRG_TOP_CLK_TMR_REG_WAKEUPCT_ENABLE_Msk;\n\n        __HAL_ENABLE_INTERRUPTS(sr);\n        NVIC_EnableIRQ(GPIO_P0_IRQn);\n        NVIC_EnableIRQ(GPIO_P1_IRQn);\n    }\n}\n\nstatic int\nhal_gpio_find_empty_slot(void)\n{\n    int i;\n\n    for (i = 0; i < HAL_GPIO_MAX_IRQ; i++) {\n        if (hal_gpio_irqs[i].func == NULL) {\n            return i;\n        }\n    }\n\n    return -1;\n}\n\nint\nhal_gpio_irq_init(int pin, hal_gpio_irq_handler_t handler, void *arg,\n                  hal_gpio_irq_trig_t trig, hal_gpio_pull_t pull)\n{\n    int i;\n\n    hal_gpio_irq_setup();\n\n    i = hal_gpio_find_empty_slot();\n    /* If assert failed increase syscfg value MCU_GPIO_MAX_IRQ */\n    assert(i >= 0);\n    if (i < 0) {\n        return -1;\n    }\n\n    hal_gpio_init_in(pin, pull);\n\n    switch (trig) {\n    case HAL_GPIO_TRIG_RISING:\n        WKUP_POL_PX_SET_RISING(pin);\n        break;\n    case HAL_GPIO_TRIG_FALLING:\n        WKUP_POL_PX_SET_FALLING(pin);\n        break;\n    case HAL_GPIO_TRIG_BOTH:\n        /* Not supported */\n    default:\n        return -1;\n    }\n\n    hal_gpio_irqs[i].pin = pin;\n    hal_gpio_irqs[i].func = handler;\n    hal_gpio_irqs[i].arg = arg;\n\n    return 0;\n}\n\nvoid\nhal_gpio_irq_release(int pin)\n{\n    int i;\n\n    hal_gpio_irq_disable(pin);\n\n    for (i = 0; i < HAL_GPIO_MAX_IRQ; i++) {\n        if (hal_gpio_irqs[i].pin == pin && hal_gpio_irqs[i].func) {\n            hal_gpio_irqs[i].pin = -1;\n            hal_gpio_irqs[i].arg = NULL;\n            hal_gpio_irqs[i].func = NULL;\n        }\n    }\n}\n\nvoid\nhal_gpio_irq_enable(int pin)\n{\n    WKUP_SEL_GPIO_PX_REG(pin) |= GPIO_PIN_BIT(pin);\n}\n\nvoid\nhal_gpio_irq_disable(int pin)\n{\n    WKUP_SEL_GPIO_PX_REG(pin) &= ~GPIO_PIN_BIT(pin);\n    WKUP_CLEAR_PX(pin);\n}\n\nvoid\nmcu_gpio_set_pin_function(int pin, int mode, mcu_gpio_func func)\n{\n    uint32_t primask;\n\n    __HAL_DISABLE_INTERRUPTS(primask);\n\n    mcu_gpio_unlatch_prepare(pin);\n\n    GPIO_PIN_MODE_REG(pin) = (func & GPIO_P0_00_MODE_REG_PID_Msk) |\n        (mode & (GPIO_P0_00_MODE_REG_PUPD_Msk | GPIO_P0_00_MODE_REG_PPOD_Msk));\n\n    mcu_gpio_unlatch(pin);\n\n    __HAL_ENABLE_INTERRUPTS(primask);\n}\n\nvoid\nmcu_gpio_enter_sleep(void)\n{\n#if MYNEWT_VAL(MCU_GPIO_RETAINABLE_NUM) >= 0\n    if (g_mcu_gpio_retained_num == 0) {\n        return;\n    }\n\n    g_mcu_gpio_latch_state[0] = CRG_TOP->P0_PAD_LATCH_REG;\n    g_mcu_gpio_latch_state[1] = CRG_TOP->P1_PAD_LATCH_REG;\n\n    da1469x_retreg_update(g_mcu_gpio_retained, g_mcu_gpio_retained_num);\n\n    CRG_TOP->P0_RESET_PAD_LATCH_REG = CRG_TOP_P0_PAD_LATCH_REG_P0_LATCH_EN_Msk;\n    CRG_TOP->P1_RESET_PAD_LATCH_REG = CRG_TOP_P1_PAD_LATCH_REG_P1_LATCH_EN_Msk;\n\n    da1469x_pd_release(MCU_PD_DOMAIN_COM);\n#endif\n}\n\nvoid\nmcu_gpio_exit_sleep(void)\n{\n#if MYNEWT_VAL(MCU_GPIO_RETAINABLE_NUM) >= 0\n    if (g_mcu_gpio_retained_num == 0) {\n        return;\n    }\n\n    da1469x_pd_acquire(MCU_PD_DOMAIN_COM);\n\n    da1469x_retreg_restore(g_mcu_gpio_retained, g_mcu_gpio_retained_num);\n\n    /* Set pins states to their latched values */\n    GPIO->P0_DATA_REG = GPIO->P0_DATA_REG;\n    GPIO->P1_DATA_REG = GPIO->P1_DATA_REG;\n\n    CRG_TOP->P0_PAD_LATCH_REG = g_mcu_gpio_latch_state[0];\n    CRG_TOP->P1_PAD_LATCH_REG = g_mcu_gpio_latch_state[1];\n#endif\n}\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/src/hal_system.c",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n#include <assert.h>\n#include \"syscfg/syscfg.h\"\n#include \"mcu/da1469x_clock.h\"\n#include \"mcu/da1469x_lpclk.h\"\n#include \"mcu/da1469x_pd.h\"\n#include \"mcu/da1469x_pdc.h\"\n#include \"mcu/da1469x_prail.h\"\n#include \"hal/hal_system.h\"\n#include \"os/os_cputime.h\"\n\n#if !MYNEWT_VAL(BOOT_LOADER)\nstatic enum hal_reset_reason g_hal_reset_reason;\n#endif\n\nvoid\nhal_system_init(void)\n{\n#if MYNEWT_VAL(MCU_DCDC_ENABLE)\n    da1469x_prail_dcdc_enable();\n#endif\n\n    /*\n     * RESET_STAT_REG has to be cleared to allow HW set bits during next reset\n     * so we should read it now and keep result for application to check at any\n     * time. This does not happen for bootloader since reading reset reason in\n     * bootloader would prevent application from reading it.\n     */\n\n#if !MYNEWT_VAL(BOOT_LOADER)\n    uint32_t reg;\n\n    reg = CRG_TOP->RESET_STAT_REG;\n    CRG_TOP->RESET_STAT_REG = 0;\n\n    if (reg & CRG_TOP_RESET_STAT_REG_PORESET_STAT_Msk) {\n        g_hal_reset_reason = HAL_RESET_POR;\n    } else if (reg & CRG_TOP_RESET_STAT_REG_WDOGRESET_STAT_Msk) {\n        g_hal_reset_reason = HAL_RESET_WATCHDOG;\n    } else if (reg & CRG_TOP_RESET_STAT_REG_SWRESET_STAT_Msk) {\n        g_hal_reset_reason = HAL_RESET_SOFT;\n    } else if (reg & CRG_TOP_RESET_STAT_REG_HWRESET_STAT_Msk) {\n        g_hal_reset_reason = HAL_RESET_PIN;\n    } else {\n        g_hal_reset_reason = 0;\n    }\n#endif\n}\n\nvoid\nhal_system_reset(void)\n{\n\n#if MYNEWT_VAL(HAL_SYSTEM_RESET_CB)\n    hal_system_reset_cb();\n#endif\n\n    while (1) {\n        HAL_DEBUG_BREAK();\n        CRG_TOP->SYS_CTRL_REG = 0x20;\n        NVIC_SystemReset();\n    }\n}\n\nint\nhal_debugger_connected(void)\n{\n    return CRG_TOP->SYS_STAT_REG & CRG_TOP_SYS_STAT_REG_DBG_IS_ACTIVE_Msk;\n}\n\nvoid\nhal_system_clock_start(void)\n{\n    /* Reset clock dividers to 0 */\n    CRG_TOP->CLK_AMBA_REG &= ~(CRG_TOP_CLK_AMBA_REG_HCLK_DIV_Msk | CRG_TOP_CLK_AMBA_REG_PCLK_DIV_Msk);\n\n    /* PD_TIM is already started in SystemInit */\n\n    da1469x_clock_sys_xtal32m_init();\n    da1469x_clock_sys_xtal32m_enable();\n#if MYNEWT_VAL(MCU_PLL_ENABLE)\n    da1469x_clock_sys_pll_enable();\n#endif\n#if MYNEWT_VAL_CHOICE(MCU_SYSCLK_SOURCE, PLL96)\n    da1469x_clock_pll_wait_to_lock();\n    da1469x_clock_sys_pll_switch();\n#endif\n#if MYNEWT_VAL_CHOICE(MCU_SYSCLK_SOURCE, XTAL32M)\n    /* Switch to XTAL32M and disable RC32M */\n    da1469x_clock_sys_xtal32m_switch_safe();\n#endif\n    da1469x_clock_sys_rc32m_disable();\n\n#if MYNEWT_VAL_CHOICE(MCU_LPCLK_SOURCE, RCX)\n    /* Switch to RCX and calibrate it */\n    da1469x_clock_lp_rcx_enable();\n    da1469x_clock_lp_rcx_switch();\n    da1469x_clock_lp_rcx_calibrate();\n    da1469x_lpclk_enabled();\n#else\n    /*\n     * We cannot switch lp_clk to XTAL32K here since it needs some time to\n     * settle, so we just disable RCX (we don't need it) and then we'll handle\n     * switch to XTAL32K from sysinit since we need os_cputime for this.\n     */\n    da1469x_clock_lp_rcx_disable();\n#endif\n}\n\nenum hal_reset_reason\nhal_reset_cause(void)\n{\n#if MYNEWT_VAL(BOOT_LOADER)\n    return 0;\n#else\n    return g_hal_reset_reason;\n#endif\n}\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/src/hal_system_start.c",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n#include <assert.h>\n#include <stdint.h>\n#include \"mcu/mcu.h\"\n#include \"mcu/da1469x_hal.h\"\n#include <flash_map/flash_map.h>\n#include <mcu/da1469x_clock.h>\n#if MCUBOOT_MYNEWT\n#include \"bootutil/bootutil.h\"\n#include \"bootutil/image.h\"\n#include \"bootutil/bootutil_log.h\"\n#include \"mcu/da1469x_dma.h\"\n#include \"mcu/da1469x_otp.h\"\n#endif\n\n#if MYNEWT_VAL(BOOT_CUSTOM_START) && MCUBOOT_MYNEWT\nsec_text_ram_core\n#endif\nvoid __attribute__((naked))\nhal_system_start(void *img_start)\n{\n    uint32_t img_data_addr;\n    uint32_t *img_data;\n\n    img_data_addr = MCU_MEM_QSPIF_M_START_ADDRESS + (uint32_t)img_start;\n\n    assert(img_data_addr < MCU_MEM_QSPIF_M_END_ADDRESS);\n\n    img_data = (uint32_t *)img_data_addr;\n\n    asm volatile (\".syntax unified        \\n\"\n                  /* 1st word is stack pointer */\n                  \"    msr  msp, %0       \\n\"\n                  /* 2nd word is a reset handler (image entry) */\n                  \"    bx   %1            \\n\"\n                  : /* no output */\n                  : \"r\" (img_data[0]), \"r\" (img_data[1]));\n}\n\nvoid\nhal_system_restart(void *img_start)\n{\n    uint32_t primask __attribute__((unused));\n    int i;\n\n    /*\n     * Disable interrupts, and leave them disabled.\n     * They get re-enabled when system starts coming back again.\n     */\n    __HAL_DISABLE_INTERRUPTS(primask);\n\n    for (i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++) {\n        NVIC->ICER[i] = 0xffffffff;\n    }\n\n    hal_system_start(img_start);\n}\n\n#if MYNEWT_VAL(BOOT_CUSTOM_START) && MCUBOOT_MYNEWT\n#define IMAGE_TLV_AES_NONCE   0x50\n#define IMAGE_TLV_SECRET_ID   0x60\n\nsec_text_ram_core void\nboot_custom_start(uintptr_t flash_base, struct boot_rsp *rsp)\n{\n    int rc;\n    struct image_tlv_iter it;\n    const struct flash_area *fap;\n    uint32_t off;\n    uint16_t len;\n    uint16_t type;\n    uint8_t buf[8];\n    uint8_t key;\n    uint32_t nonce[2];\n    bool has_aes_nonce;\n    bool has_secret_id;\n    DMA_Type *dma_regs = DMA;\n    uint32_t  jump_offset = rsp->br_image_off + rsp->br_hdr->ih_hdr_size;\n\n    BOOT_LOG_INF(\"Custom initialization\");\n\n    /* skip to booting if we are running nonsecure mode */\n    if (!(CRG_TOP->SECURE_BOOT_REG & 0x1)) {\n        hal_system_start((void *)(flash_base + jump_offset));\n    }\n\n    rc = flash_area_open(flash_area_id_from_image_slot(0), &fap);\n    assert(rc == 0);\n\n    rc = bootutil_tlv_iter_begin(&it, rsp->br_hdr, fap, IMAGE_TLV_ANY, true);\n    assert(rc == 0);\n\n    has_aes_nonce = has_secret_id = false;\n    while (true) {\n        rc = bootutil_tlv_iter_next(&it, &off, &len, &type);\n        assert(rc >= 0);\n\n        if (rc > 0) {\n            break;\n        }\n\n        if (type == IMAGE_TLV_AES_NONCE) {\n            assert(len == 8);\n\n            rc = flash_area_read(fap, off, buf, len);\n            assert(rc == 0);\n\n            nonce[0] = __builtin_bswap32(*(uint32_t *)buf);\n            nonce[1] = __builtin_bswap32(*(uint32_t *)(buf + 4));\n            has_aes_nonce = true;\n        } else if (type == IMAGE_TLV_SECRET_ID) {\n            assert(len == 4);\n\n            rc = flash_area_read(fap, off, buf, len);\n            assert(rc == 0);\n\n            key = buf[0];\n            has_secret_id = true;\n        }\n    }\n\n    assert(has_aes_nonce && has_secret_id && key <= 7);\n\n    /* enable OTP clock and set in read mode */\n    da1469x_clock_amba_enable(CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk);\n    da1469x_otp_set_mode(OTPC_MODE_READ);\n\n    /* disable decrypt on the fly and program start and end addresses */\n    QSPIC->QSPIC_CTR_CTRL_REG = 0;\n    QSPIC->QSPIC_CTR_SADDR_REG = jump_offset;\n    QSPIC->QSPIC_CTR_EADDR_REG = QSPIC->QSPIC_CTR_SADDR_REG +\n                                 rsp->br_hdr->ih_img_size - 1;\n\n    /* securely DMA hardware key from secret storage to QSPI decrypt engine */\n    dma_regs->DMA_REQ_MUX_REG |= 0xf000;\n    dma_regs->DMA7_LEN_REG = 8;\n    dma_regs->DMA7_A_START_REG = MCU_OTPM_BASE + OTP_SEGMENT_QSPI_FW_KEYS +\n                                 (32 * key);\n    dma_regs->DMA7_B_START_REG = (uint32_t)&QSPIC->QSPIC_CTR_KEY_0_3_REG;\n    dma_regs->DMA7_CTRL_REG = DMA_DMA7_CTRL_REG_AINC_Msk |\n                              DMA_DMA7_CTRL_REG_BINC_Msk |\n                              (MCU_DMA_BUS_WIDTH_4B << DMA_DMA7_CTRL_REG_BW_Pos) |\n                              DMA_DMA7_CTRL_REG_DMA_ON_Msk;\n    while (dma_regs->DMA7_IDX_REG != 8);\n\n    /* program NONCE */\n    QSPIC->QSPIC_CTR_NONCE_0_3_REG = nonce[0];\n    QSPIC->QSPIC_CTR_NONCE_4_7_REG = nonce[1];\n\n    /* turn back on decrypt on the fly */\n    QSPIC->QSPIC_CTR_CTRL_REG = 1;\n\n    /* set OTP to standby and turn off clock */\n    da1469x_otp_set_mode(OTPC_MODE_STBY);\n    da1469x_clock_amba_disable(CRG_TOP_CLK_AMBA_REG_OTP_ENABLE_Msk);\n\n    hal_system_start((void *)(flash_base + jump_offset));\n}\n#endif\n"
  },
  {
    "path": "hw/mcu/dialog/da1469x/src/system_da1469x.c",
    "content": "/*\n * Licensed to the Apache Software Foundation (ASF) under one\n * or more contributor license agreements.  See the NOTICE file\n * distributed with this work for additional information\n * regarding copyright ownership.  The ASF licenses this file\n * to you under the Apache License, Version 2.0 (the\n * \"License\"); you may not use this file except in compliance\n * with the License.  You may obtain a copy of the License at\n *\n *  http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing,\n * software distributed under the License is distributed on an\n * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n * KIND, either express or implied.  See the License for the\n * specific language governing permissions and limitations\n * under the License.\n */\n\n#include \"mcu/mcu.h\"\n#include <mcu/da1469x_clock.h>\n\nextern uint8_t __StackLimit;\n\nuint32_t SystemCoreClock = 32000000;\n\nvoid\nSystemInit(void)\n{\n  /* Enable FPU when using hard-float */\n#if (__FPU_USED == 1)\n  SCB->CPACR |= (3UL << 20) | (3UL << 22);\n  __DSB();\n  __ISB();\n#endif\n\n  /* Freeze watchdog */\n  GPREG->SET_FREEZE_REG |= GPREG_SET_FREEZE_REG_FRZ_SYS_WDOG_Msk;\n  /* Initialize power domains (disable radio only) */\n  CRG_TOP->PMU_CTRL_REG = CRG_TOP_PMU_CTRL_REG_RADIO_SLEEP_Msk;\n\n  CRG_TOP->P0_SET_PAD_LATCH_REG = CRG_TOP_P0_PAD_LATCH_REG_P0_LATCH_EN_Msk;\n  CRG_TOP->P1_SET_PAD_LATCH_REG = CRG_TOP_P1_PAD_LATCH_REG_P1_LATCH_EN_Msk;\n\n  /* Reset clock dividers to 0 */\n  CRG_TOP->CLK_AMBA_REG &= ~(CRG_TOP_CLK_AMBA_REG_HCLK_DIV_Msk | CRG_TOP_CLK_AMBA_REG_PCLK_DIV_Msk);\n\n  /* PD_TIM is already started in SystemInit */\n\n  da1469x_clock_sys_xtal32m_init();\n  da1469x_clock_sys_xtal32m_enable();\n  da1469x_clock_sys_pll_enable();\n  da1469x_clock_pll_wait_to_lock();\n  /* Switch to XTAL32M and disable RC32M */\n  da1469x_clock_sys_xtal32m_switch_safe();\n  da1469x_clock_sys_rc32m_disable();\n}\n\nvoid _init(void)\n{\n}\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble.h",
    "content": "/*\n * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_COMMON BLE SoftDevice Common\n  @{\n  @defgroup ble_api Events, type definitions and API calls\n  @{\n\n  @brief Module independent events, type definitions and API calls for the BLE SoftDevice.\n\n */\n\n#ifndef BLE_H__\n#define BLE_H__\n\n#include <stdint.h>\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"ble_err.h\"\n#include \"ble_gap.h\"\n#include \"ble_l2cap.h\"\n#include \"ble_gatt.h\"\n#include \"ble_gattc.h\"\n#include \"ble_gatts.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @addtogroup BLE_COMMON_ENUMERATIONS Enumerations\n * @{ */\n\n/**\n * @brief Common API SVC numbers.\n */\nenum BLE_COMMON_SVCS\n{\n  SD_BLE_ENABLE = BLE_SVC_BASE,         /**< Enable and initialize the BLE stack */\n  SD_BLE_EVT_GET,                       /**< Get an event from the pending events queue. */\n  SD_BLE_UUID_VS_ADD,                   /**< Add a Vendor Specific base UUID. */\n  SD_BLE_UUID_DECODE,                   /**< Decode UUID bytes. */\n  SD_BLE_UUID_ENCODE,                   /**< Encode UUID bytes. */\n  SD_BLE_VERSION_GET,                   /**< Get the local version information (company ID, Link Layer Version, Link Layer Subversion). */\n  SD_BLE_USER_MEM_REPLY,                /**< User Memory Reply. */\n  SD_BLE_OPT_SET,                       /**< Set a BLE option. */\n  SD_BLE_OPT_GET,                       /**< Get a BLE option. */\n  SD_BLE_CFG_SET,                       /**< Add a configuration to the BLE stack. */\n  SD_BLE_UUID_VS_REMOVE,                /**< Remove a Vendor Specific base UUID. */\n};\n\n/**\n * @brief BLE Module Independent Event IDs.\n */\nenum BLE_COMMON_EVTS\n{\n  BLE_EVT_USER_MEM_REQUEST = BLE_EVT_BASE + 0,   /**< User Memory request. @ref ble_evt_user_mem_request_t */\n  BLE_EVT_USER_MEM_RELEASE = BLE_EVT_BASE + 1,   /**< User Memory release. @ref ble_evt_user_mem_release_t */\n};\n\n/**@brief BLE Connection Configuration IDs.\n *\n * IDs that uniquely identify a connection configuration.\n */\nenum BLE_CONN_CFGS\n{\n    BLE_CONN_CFG_GAP   = BLE_CONN_CFG_BASE + 0, /**< BLE GAP specific connection configuration. */\n    BLE_CONN_CFG_GATTC = BLE_CONN_CFG_BASE + 1, /**< BLE GATTC specific connection configuration. */\n    BLE_CONN_CFG_GATTS = BLE_CONN_CFG_BASE + 2, /**< BLE GATTS specific connection configuration. */\n    BLE_CONN_CFG_GATT  = BLE_CONN_CFG_BASE + 3, /**< BLE GATT specific connection configuration. */\n    BLE_CONN_CFG_L2CAP = BLE_CONN_CFG_BASE + 4, /**< BLE L2CAP specific connection configuration. */\n};\n\n/**@brief BLE Common Configuration IDs.\n *\n * IDs that uniquely identify a common configuration.\n */\nenum BLE_COMMON_CFGS\n{\n  BLE_COMMON_CFG_VS_UUID = BLE_CFG_BASE, /**< Vendor specific base UUID configuration */\n};\n\n/**@brief Common Option IDs.\n * IDs that uniquely identify a common option.\n */\nenum BLE_COMMON_OPTS\n{\n  BLE_COMMON_OPT_PA_LNA          = BLE_OPT_BASE + 0, /**< PA and LNA options */\n  BLE_COMMON_OPT_CONN_EVT_EXT    = BLE_OPT_BASE + 1, /**< Extended connection events option */\n  BLE_COMMON_OPT_EXTENDED_RC_CAL = BLE_OPT_BASE + 2, /**< Extended RC calibration option */\n  BLE_COMMON_OPT_ADV_SCHED_CFG   = BLE_OPT_BASE + 3, /**< Advertiser role scheduling configuration option */\n};\n\n/** @} */\n\n/** @addtogroup BLE_COMMON_DEFINES Defines\n * @{ */\n\n/** @brief  Required pointer alignment for BLE Events.\n*/\n#define BLE_EVT_PTR_ALIGNMENT    4\n\n/** @brief  Leaves the maximum of the two arguments.\n*/\n#define BLE_MAX(a, b) ((a) < (b) ? (b) : (a))\n\n/** @brief  Maximum possible length for BLE Events.\n * @note The highest value used for @ref ble_gatt_conn_cfg_t::att_mtu in any connection configuration shall be used as a parameter.\n * If that value has not been configured for any connections then @ref BLE_GATT_ATT_MTU_DEFAULT must be used instead.\n*/\n#define BLE_EVT_LEN_MAX(ATT_MTU) ( \\\n    offsetof(ble_evt_t, evt.gattc_evt.params.prim_srvc_disc_rsp.services) + ((ATT_MTU) - 1) / 4 * sizeof(ble_gattc_service_t) \\\n)\n\n/** @defgroup ADV_SCHED_CFG Advertiser Role Scheduling Configuration\n * @{ */\n#define ADV_SCHED_CFG_DEFAULT  0  /**< Default advertiser role scheduling configuration. */\n#define ADV_SCHED_CFG_IMPROVED 1  /**< Improved advertiser role scheduling configuration in which the housekeeping time is reduced. */\n/** @} */\n\n/** @defgroup BLE_USER_MEM_TYPES User Memory Types\n * @{ */\n#define BLE_USER_MEM_TYPE_INVALID               0x00  /**< Invalid User Memory Types. */\n#define BLE_USER_MEM_TYPE_GATTS_QUEUED_WRITES   0x01  /**< User Memory for GATTS queued writes. */\n/** @} */\n\n/** @defgroup BLE_UUID_VS_COUNTS Vendor Specific base UUID counts\n * @{\n */\n#define BLE_UUID_VS_COUNT_DEFAULT 10  /**< Default VS UUID count. */\n#define BLE_UUID_VS_COUNT_MAX     254 /**< Maximum VS UUID count. */\n/** @} */\n\n/** @defgroup BLE_COMMON_CFG_DEFAULTS Configuration defaults.\n * @{\n */\n#define BLE_CONN_CFG_TAG_DEFAULT  0    /**< Default configuration tag, SoftDevice default connection configuration. */\n\n/** @} */\n\n/** @} */\n\n/** @addtogroup BLE_COMMON_STRUCTURES Structures\n * @{ */\n\n/**@brief User Memory Block. */\ntypedef struct\n{\n  uint8_t          *p_mem;      /**< Pointer to the start of the user memory block. */\n  uint16_t          len;        /**< Length in bytes of the user memory block. */\n} ble_user_mem_block_t;\n\n/**@brief Event structure for @ref BLE_EVT_USER_MEM_REQUEST. */\ntypedef struct\n{\n  uint8_t                     type;     /**< User memory type, see @ref BLE_USER_MEM_TYPES. */\n} ble_evt_user_mem_request_t;\n\n/**@brief Event structure for @ref BLE_EVT_USER_MEM_RELEASE. */\ntypedef struct\n{\n  uint8_t                     type;       /**< User memory type, see @ref BLE_USER_MEM_TYPES. */\n  ble_user_mem_block_t        mem_block;  /**< User memory block */\n} ble_evt_user_mem_release_t;\n\n/**@brief Event structure for events not associated with a specific function module. */\ntypedef struct\n{\n  uint16_t conn_handle;                                 /**< Connection Handle on which this event occurred. */\n  union\n  {\n    ble_evt_user_mem_request_t      user_mem_request;    /**< User Memory Request Event Parameters. */\n    ble_evt_user_mem_release_t      user_mem_release;    /**< User Memory Release Event Parameters. */\n  } params;                                              /**< Event parameter union. */\n} ble_common_evt_t;\n\n/**@brief BLE Event header. */\ntypedef struct\n{\n  uint16_t evt_id;                /**< Value from a BLE_<module>_EVT series. */\n  uint16_t evt_len;               /**< Length in octets including this header. */\n} ble_evt_hdr_t;\n\n/**@brief Common BLE Event type, wrapping the module specific event reports. */\ntypedef struct\n{\n  ble_evt_hdr_t header;           /**< Event header. */\n  union\n  {\n    ble_common_evt_t  common_evt; /**< Common Event, evt_id in BLE_EVT_* series. */\n    ble_gap_evt_t     gap_evt;    /**< GAP originated event, evt_id in BLE_GAP_EVT_* series. */\n    ble_gattc_evt_t   gattc_evt;  /**< GATT client originated event, evt_id in BLE_GATTC_EVT* series. */\n    ble_gatts_evt_t   gatts_evt;  /**< GATT server originated event, evt_id in BLE_GATTS_EVT* series. */\n    ble_l2cap_evt_t   l2cap_evt;  /**< L2CAP originated event, evt_id in BLE_L2CAP_EVT* series. */\n  } evt;                          /**< Event union. */\n} ble_evt_t;\n\n\n/**\n * @brief Version Information.\n */\ntypedef struct\n{\n  uint8_t   version_number;    /**< Link Layer Version number. See https://www.bluetooth.org/en-us/specification/assigned-numbers/link-layer for assigned values. */\n  uint16_t  company_id;        /**< Company ID, Nordic Semiconductor's company ID is 89 (0x0059) (https://www.bluetooth.org/apps/content/Default.aspx?doc_id=49708). */\n  uint16_t  subversion_number; /**< Link Layer Sub Version number, corresponds to the SoftDevice Config ID or Firmware ID (FWID). */\n} ble_version_t;\n\n/**\n * @brief Configuration parameters for the PA and LNA.\n */\ntypedef struct\n{\n     uint8_t enable :1;      /**< Enable toggling for this amplifier */\n     uint8_t active_high :1; /**< Set the pin to be active high */\n     uint8_t gpio_pin :6;    /**< The GPIO pin to toggle for this amplifier */\n} ble_pa_lna_cfg_t;\n\n/**\n * @brief PA & LNA GPIO toggle configuration\n *\n * This option configures the SoftDevice to toggle pins when the radio is active for use with a power amplifier and/or\n * a low noise amplifier.\n *\n * Toggling the pins is achieved by using two PPI channels and a GPIOTE channel. The hardware channel IDs are provided\n * by the application and should be regarded as reserved as long as any PA/LNA toggling is enabled.\n *\n * @note  @ref sd_ble_opt_get is not supported for this option.\n * @note  Setting this option while the radio is in use (i.e. any of the roles are active) may have undefined consequences\n * and must be avoided by the application.\n */\ntypedef struct\n{\n   ble_pa_lna_cfg_t pa_cfg;   /**< Power Amplifier configuration */\n   ble_pa_lna_cfg_t lna_cfg;  /**< Low Noise Amplifier configuration */\n\n   uint8_t ppi_ch_id_set;     /**< PPI channel used for radio pin setting */\n   uint8_t ppi_ch_id_clr;     /**< PPI channel used for radio pin clearing */\n   uint8_t gpiote_ch_id;      /**< GPIOTE channel used for radio pin toggling */\n} ble_common_opt_pa_lna_t;\n\n/**\n * @brief Configuration of extended BLE connection events.\n *\n * When enabled the SoftDevice will dynamically extend the connection event when possible.\n *\n * The connection event length is controlled by the connection configuration as set by @ref ble_gap_conn_cfg_t::event_length.\n * The connection event can be extended if there is time to send another packet pair before the start of the next connection interval,\n * and if there are no conflicts with other BLE roles requesting radio time.\n *\n * @note @ref sd_ble_opt_get is not supported for this option.\n */\ntypedef struct\n{\n   uint8_t enable : 1; /**< Enable extended BLE connection events, disabled by default. */\n} ble_common_opt_conn_evt_ext_t;\n\n/**\n * @brief Enable/disable extended RC calibration.\n *\n * If extended RC calibration is enabled and the internal RC oscillator (@ref NRF_CLOCK_LF_SRC_RC) is used as the SoftDevice\n * LFCLK source, the SoftDevice as a peripheral will by default try to increase the receive window if two consecutive packets\n * are not received. If it turns out that the packets were not received due to clock drift, the RC calibration is started.\n * This calibration comes in addition to the periodic calibration that is configured by @ref sd_softdevice_enable(). When\n * using only peripheral connections, the periodic calibration can therefore be configured with a much longer interval as the\n * peripheral will be able to detect and adjust automatically to clock drift, and calibrate on demand.\n *\n * If extended RC calibration is disabled and the internal RC oscillator is used as the SoftDevice LFCLK source, the\n * RC oscillator is calibrated periodically as configured by @ref sd_softdevice_enable().\n *\n * @note @ref sd_ble_opt_get is not supported for this option.\n */\ntypedef struct\n{\n   uint8_t enable : 1; /**< Enable extended RC calibration, enabled by default. */\n} ble_common_opt_extended_rc_cal_t;\n\n/**\n * @brief Configuration of BLE advertiser role scheduling.\n *\n * @note @ref sd_ble_opt_get is not supported for this option.\n */\ntypedef struct\n{\n  uint8_t sched_cfg;  /**< See @ref ADV_SCHED_CFG. */\n} ble_common_opt_adv_sched_cfg_t;\n\n/**@brief Option structure for common options. */\ntypedef union\n{\n  ble_common_opt_pa_lna_t          pa_lna;          /**< Parameters for controlling PA and LNA pin toggling. */\n  ble_common_opt_conn_evt_ext_t    conn_evt_ext;    /**< Parameters for enabling extended connection events. */\n  ble_common_opt_extended_rc_cal_t extended_rc_cal; /**< Parameters for enabling extended RC calibration. */\n  ble_common_opt_adv_sched_cfg_t   adv_sched_cfg;   /**< Parameters for configuring advertiser role scheduling. */\n} ble_common_opt_t;\n\n/**@brief Common BLE Option type, wrapping the module specific options. */\ntypedef union\n{\n  ble_common_opt_t  common_opt;         /**< COMMON options, opt_id in @ref BLE_COMMON_OPTS series. */\n  ble_gap_opt_t     gap_opt;            /**< GAP option, opt_id in @ref BLE_GAP_OPTS series. */\n} ble_opt_t;\n\n/**@brief BLE connection configuration type, wrapping the module specific configurations, set with\n * @ref sd_ble_cfg_set.\n *\n * @note Connection configurations don't have to be set.\n * In the case that no configurations has been set, or fewer connection configurations has been set than enabled connections,\n * the default connection configuration will be automatically added for the remaining connections.\n * When creating connections with the default configuration, @ref BLE_CONN_CFG_TAG_DEFAULT should be used in\n * place of @ref ble_conn_cfg_t::conn_cfg_tag.\n *\n * @sa sd_ble_gap_adv_start()\n * @sa sd_ble_gap_connect()\n *\n * @mscs\n * @mmsc{@ref BLE_CONN_CFG}\n * @endmscs\n\n */\ntypedef struct\n{\n  uint8_t              conn_cfg_tag;        /**< The application chosen tag it can use with the\n                                                 @ref sd_ble_gap_adv_start() and @ref sd_ble_gap_connect() calls\n                                                 to select this configuration when creating a connection.\n                                                 Must be different for all connection configurations added and not @ref BLE_CONN_CFG_TAG_DEFAULT. */\n  union {\n    ble_gap_conn_cfg_t   gap_conn_cfg;      /**< GAP connection configuration, cfg_id is @ref BLE_CONN_CFG_GAP. */\n    ble_gattc_conn_cfg_t gattc_conn_cfg;    /**< GATTC connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTC. */\n    ble_gatts_conn_cfg_t gatts_conn_cfg;    /**< GATTS connection configuration, cfg_id is @ref BLE_CONN_CFG_GATTS. */\n    ble_gatt_conn_cfg_t  gatt_conn_cfg;     /**< GATT connection configuration, cfg_id is @ref BLE_CONN_CFG_GATT. */\n    ble_l2cap_conn_cfg_t l2cap_conn_cfg;    /**< L2CAP connection configuration, cfg_id is @ref BLE_CONN_CFG_L2CAP. */\n  } params;                                 /**< Connection configuration union. */\n} ble_conn_cfg_t;\n\n/**\n * @brief Configuration of Vendor Specific base UUIDs, set with @ref sd_ble_cfg_set.\n *\n * @retval ::NRF_ERROR_INVALID_PARAM Too many UUIDs configured.\n */\ntypedef struct\n{\n  uint8_t vs_uuid_count; /**< Number of 128-bit Vendor Specific base UUID bases to allocate memory for.\n                              Default value is @ref BLE_UUID_VS_COUNT_DEFAULT. Maximum value is\n                              @ref BLE_UUID_VS_COUNT_MAX. */\n} ble_common_cfg_vs_uuid_t;\n\n/**@brief Common BLE Configuration type, wrapping the common configurations. */\ntypedef union\n{\n  ble_common_cfg_vs_uuid_t  vs_uuid_cfg;  /**< Vendor Specific base UUID configuration, cfg_id is @ref BLE_COMMON_CFG_VS_UUID. */\n} ble_common_cfg_t;\n\n/**@brief BLE Configuration type, wrapping the module specific configurations. */\ntypedef union\n{\n  ble_conn_cfg_t    conn_cfg;   /**< Connection specific configurations, cfg_id in @ref BLE_CONN_CFGS series. */\n  ble_common_cfg_t  common_cfg; /**< Global common configurations, cfg_id in @ref BLE_COMMON_CFGS series. */\n  ble_gap_cfg_t     gap_cfg;    /**< Global GAP configurations, cfg_id in @ref BLE_GAP_CFGS series. */\n  ble_gatts_cfg_t   gatts_cfg;  /**< Global GATTS configuration, cfg_id in @ref BLE_GATTS_CFGS series. */\n} ble_cfg_t;\n\n/** @} */\n\n/** @addtogroup BLE_COMMON_FUNCTIONS Functions\n * @{ */\n\n/**@brief Enable the BLE stack\n *\n * @param[in, out] p_app_ram_base   Pointer to a variable containing the start address of the\n *                                  application RAM region (APP_RAM_BASE). On return, this will\n *                                  contain the minimum start address of the application RAM region\n *                                  required by the SoftDevice for this configuration.\n *\n * @note The memory requirement for a specific configuration will not increase between SoftDevices\n *       with the same major version number.\n *\n * @note At runtime the IC's RAM is split into 2 regions: The SoftDevice RAM region is located\n *       between 0x20000000 and APP_RAM_BASE-1 and the application's RAM region is located between\n *       APP_RAM_BASE and the start of the call stack.\n *\n * @details This call initializes the BLE stack, no BLE related function other than @ref\n *          sd_ble_cfg_set can be called before this one.\n *\n * @mscs\n * @mmsc{@ref BLE_COMMON_ENABLE}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS              The BLE stack has been initialized successfully.\n * @retval ::NRF_ERROR_INVALID_STATE  The BLE stack had already been initialized and cannot be reinitialized.\n * @retval ::NRF_ERROR_INVALID_ADDR   Invalid or not sufficiently aligned pointer supplied.\n * @retval ::NRF_ERROR_NO_MEM         One or more of the following is true:\n *                                    - The amount of memory assigned to the SoftDevice by *p_app_ram_base is not\n *                                      large enough to fit this configuration's memory requirement. Check *p_app_ram_base\n *                                      and set the start address of the application RAM region accordingly.\n *                                    - Dynamic part of the SoftDevice RAM region is larger then 64 kB which\n *                                      is currently not supported.\n * @retval ::NRF_ERROR_RESOURCES      The total number of L2CAP Channels configured using @ref sd_ble_cfg_set is too large.\n */\nSVCALL(SD_BLE_ENABLE, uint32_t, sd_ble_enable(uint32_t * p_app_ram_base));\n\n/**@brief Add configurations for the BLE stack\n *\n * @param[in] cfg_id              Config ID, see @ref BLE_CONN_CFGS, @ref BLE_COMMON_CFGS, @ref\n *                                BLE_GAP_CFGS or @ref BLE_GATTS_CFGS.\n * @param[in] p_cfg               Pointer to a ble_cfg_t structure containing the configuration value.\n * @param[in] app_ram_base        The start address of the application RAM region (APP_RAM_BASE).\n *                                See @ref sd_ble_enable for details about APP_RAM_BASE.\n *\n * @note The memory requirement for a specific configuration will not increase between SoftDevices\n *       with the same major version number.\n *\n * @note If a configuration is set more than once, the last one set is the one that takes effect on\n *       @ref sd_ble_enable.\n *\n * @note Any part of the BLE stack that is NOT configured with @ref sd_ble_cfg_set will have default\n *       configuration.\n *\n * @note @ref sd_ble_cfg_set may be called at any time when the SoftDevice is enabled (see @ref\n *       sd_softdevice_enable) while the BLE part of the SoftDevice is not enabled (see @ref\n *       sd_ble_enable).\n *\n * @note Error codes for the configurations are described in the configuration structs.\n *\n * @mscs\n * @mmsc{@ref BLE_COMMON_ENABLE}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS              The configuration has been added successfully.\n * @retval ::NRF_ERROR_INVALID_STATE  The BLE stack had already been initialized.\n * @retval ::NRF_ERROR_INVALID_ADDR   Invalid or not sufficiently aligned pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM  Invalid cfg_id supplied.\n * @retval ::NRF_ERROR_NO_MEM         The amount of memory assigned to the SoftDevice by app_ram_base is not\n *                                    large enough to fit this configuration's memory requirement.\n */\nSVCALL(SD_BLE_CFG_SET, uint32_t, sd_ble_cfg_set(uint32_t cfg_id, ble_cfg_t const * p_cfg, uint32_t app_ram_base));\n\n/**@brief Get an event from the pending events queue.\n *\n * @param[out] p_dest Pointer to buffer to be filled in with an event, or NULL to retrieve the event length.\n *                    This buffer <b>must be aligned to the extend defined by @ref BLE_EVT_PTR_ALIGNMENT</b>.\n *                    The buffer should be interpreted as a @ref ble_evt_t struct.\n * @param[in, out] p_len Pointer the length of the buffer, on return it is filled with the event length.\n *\n * @details This call allows the application to pull a BLE event from the BLE stack. The application is signaled that\n * an event is available from the BLE stack by the triggering of the SD_EVT_IRQn interrupt.\n * The application is free to choose whether to call this function from thread mode (main context) or directly from the\n * Interrupt Service Routine that maps to SD_EVT_IRQn. In any case however, and because the BLE stack runs at a higher\n * priority than the application, this function should be called in a loop (until @ref NRF_ERROR_NOT_FOUND is returned)\n * every time SD_EVT_IRQn is raised to ensure that all available events are pulled from the BLE stack. Failure to do so\n * could potentially leave events in the internal queue without the application being aware of this fact.\n *\n * Sizing the p_dest buffer is equally important, since the application needs to provide all the memory necessary for the event to\n * be copied into application memory. If the buffer provided is not large enough to fit the entire contents of the event,\n * @ref NRF_ERROR_DATA_SIZE will be returned and the application can then call again with a larger buffer size.\n * The maximum possible event length is defined by @ref BLE_EVT_LEN_MAX. The application may also \"peek\" the event length\n * by providing p_dest as a NULL pointer and inspecting the value of *p_len upon return:\n *\n *     \\code\n *     uint16_t len;\n *     errcode = sd_ble_evt_get(NULL, &len);\n *     \\endcode\n *\n * @mscs\n * @mmsc{@ref BLE_COMMON_IRQ_EVT_MSC}\n * @mmsc{@ref BLE_COMMON_THREAD_EVT_MSC}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS Event pulled and stored into the supplied buffer.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid or not sufficiently aligned pointer supplied.\n * @retval ::NRF_ERROR_NOT_FOUND No events ready to be pulled.\n * @retval ::NRF_ERROR_DATA_SIZE Event ready but could not fit into the supplied buffer.\n */\nSVCALL(SD_BLE_EVT_GET, uint32_t, sd_ble_evt_get(uint8_t *p_dest, uint16_t *p_len));\n\n\n/**@brief Add a Vendor Specific base UUID.\n *\n * @details This call enables the application to add a Vendor Specific base UUID to the BLE stack's table, for later\n * use with all other modules and APIs. This then allows the application to use the shorter, 24-bit @ref ble_uuid_t\n * format when dealing with both 16-bit and 128-bit UUIDs without having to check for lengths and having split code\n * paths. This is accomplished by extending the grouping mechanism that the Bluetooth SIG standard base UUID uses\n * for all other 128-bit UUIDs. The type field in the @ref ble_uuid_t structure is an index (relative to\n * @ref BLE_UUID_TYPE_VENDOR_BEGIN) to the table populated by multiple calls to this function, and the UUID field\n * in the same structure contains the 2 bytes at indexes 12 and 13. The number of possible 128-bit UUIDs available to\n * the application is therefore the number of Vendor Specific UUIDs added with the help of this function times 65536,\n * although restricted to modifying bytes 12 and 13 for each of the entries in the supplied array.\n *\n * @note Bytes 12 and 13 of the provided UUID will not be used internally, since those are always replaced by\n * the 16-bit uuid field in @ref ble_uuid_t.\n *\n * @note If a UUID is already present in the BLE stack's internal table, the corresponding index will be returned in\n * p_uuid_type along with an @ref NRF_SUCCESS error code.\n *\n * @param[in]  p_vs_uuid    Pointer to a 16-octet (128-bit) little endian Vendor Specific base UUID disregarding\n *                          bytes 12 and 13.\n * @param[out] p_uuid_type  Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponding to this UUID will be stored.\n *\n * @retval ::NRF_SUCCESS Successfully added the Vendor Specific base UUID.\n * @retval ::NRF_ERROR_INVALID_ADDR If p_vs_uuid or p_uuid_type is NULL or invalid.\n * @retval ::NRF_ERROR_NO_MEM If there are no more free slots for VS UUIDs.\n */\nSVCALL(SD_BLE_UUID_VS_ADD, uint32_t, sd_ble_uuid_vs_add(ble_uuid128_t const *p_vs_uuid, uint8_t *p_uuid_type));\n\n\n/**@brief Remove a Vendor Specific base UUID.\n *\n * @details This call removes a Vendor Specific base UUID that has been added with @ref sd_ble_uuid_vs_add. This function allows\n * the application to reuse memory allocated for Vendor Specific base UUIDs.\n *\n * @note Currently this function can only be called with a p_uuid_type set to @ref BLE_UUID_TYPE_UNKNOWN or the last added UUID type.\n *\n * @param[in]  p_uuid_type  Pointer to a uint8_t where the type field in @ref ble_uuid_t::type corresponds to the UUID type that\n *                          shall be removed. If the type is set to @ref BLE_UUID_TYPE_UNKNOWN, or the pointer is NULL, the last\n *                          Vendor Specific base UUID will be removed.\n * @param[out] p_uuid_type  Pointer to a uint8_t where the type field in @ref ble_uuid_t corresponds to the UUID type that was\n *                          removed. If function returns with a failure, it contains the last type that is in use by the ATT Server.\n *\n * @retval ::NRF_SUCCESS Successfully removed the Vendor Specific base UUID.\n * @retval ::NRF_ERROR_INVALID_ADDR If p_uuid_type is invalid.\n * @retval ::NRF_ERROR_INVALID_PARAM If p_uuid_type points to a non-valid UUID type.\n * @retval ::NRF_ERROR_FORBIDDEN If the Vendor Specific base UUID is in use by the ATT Server.\n */\n\nSVCALL(SD_BLE_UUID_VS_REMOVE, uint32_t, sd_ble_uuid_vs_remove(uint8_t *p_uuid_type));\n\n\n/** @brief Decode little endian raw UUID bytes (16-bit or 128-bit) into a 24 bit @ref ble_uuid_t structure.\n *\n * @details The raw UUID bytes excluding bytes 12 and 13 (i.e. bytes 0-11 and 14-15) of p_uuid_le are compared\n * to the corresponding ones in each entry of the table of Vendor Specific base UUIDs populated with @ref sd_ble_uuid_vs_add\n * to look for a match. If there is such a match, bytes 12 and 13 are returned as p_uuid->uuid and the index\n * relative to @ref BLE_UUID_TYPE_VENDOR_BEGIN as p_uuid->type.\n *\n * @note If the UUID length supplied is 2, then the type set by this call will always be @ref BLE_UUID_TYPE_BLE.\n *\n * @param[in]   uuid_le_len Length in bytes of the buffer pointed to by p_uuid_le (must be 2 or 16 bytes).\n * @param[in]   p_uuid_le   Pointer pointing to little endian raw UUID bytes.\n * @param[out]  p_uuid      Pointer to a @ref ble_uuid_t structure to be filled in.\n *\n * @retval ::NRF_SUCCESS Successfully decoded into the @ref ble_uuid_t structure.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_LENGTH Invalid UUID length.\n * @retval ::NRF_ERROR_NOT_FOUND For a 128-bit UUID, no match in the populated table of UUIDs.\n */\nSVCALL(SD_BLE_UUID_DECODE, uint32_t, sd_ble_uuid_decode(uint8_t uuid_le_len, uint8_t const *p_uuid_le, ble_uuid_t *p_uuid));\n\n\n/** @brief Encode a @ref ble_uuid_t structure into little endian raw UUID bytes (16-bit or 128-bit).\n *\n * @note The pointer to the destination buffer p_uuid_le may be NULL, in which case only the validity and size of p_uuid is computed.\n *\n * @param[in]   p_uuid        Pointer to a @ref ble_uuid_t structure that will be encoded into bytes.\n * @param[out]  p_uuid_le_len Pointer to a uint8_t that will be filled with the encoded length (2 or 16 bytes).\n * @param[out]  p_uuid_le     Pointer to a buffer where the little endian raw UUID bytes (2 or 16) will be stored.\n *\n * @retval ::NRF_SUCCESS Successfully encoded into the buffer.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid UUID type.\n */\nSVCALL(SD_BLE_UUID_ENCODE, uint32_t, sd_ble_uuid_encode(ble_uuid_t const *p_uuid, uint8_t *p_uuid_le_len, uint8_t *p_uuid_le));\n\n\n/**@brief Get Version Information.\n *\n * @details This call allows the application to get the BLE stack version information.\n *\n * @param[out] p_version Pointer to a ble_version_t structure to be filled in.\n *\n * @retval ::NRF_SUCCESS  Version information stored successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_BUSY The BLE stack is busy (typically doing a locally-initiated disconnection procedure).\n */\nSVCALL(SD_BLE_VERSION_GET, uint32_t, sd_ble_version_get(ble_version_t *p_version));\n\n\n/**@brief Provide a user memory block.\n *\n * @note This call can only be used as a response to a @ref BLE_EVT_USER_MEM_REQUEST event issued to the application.\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] p_block Pointer to a user memory block structure or NULL if memory is managed by the application.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_NOAUTH_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS Successfully queued a response to the peer.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_LENGTH Invalid user memory block length supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection state or no user memory request pending.\n */\nSVCALL(SD_BLE_USER_MEM_REPLY, uint32_t, sd_ble_user_mem_reply(uint16_t conn_handle, ble_user_mem_block_t const *p_block));\n\n/**@brief Set a BLE option.\n *\n * @details This call allows the application to set the value of an option.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC}\n * @endmscs\n *\n * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS.\n * @param[in] p_opt Pointer to a ble_opt_t structure containing the option value.\n *\n * @retval ::NRF_SUCCESS  Option set successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints.\n * @retval ::NRF_ERROR_INVALID_STATE Unable to set the parameter at this time.\n * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed.\n */\nSVCALL(SD_BLE_OPT_SET, uint32_t, sd_ble_opt_set(uint32_t opt_id, ble_opt_t const *p_opt));\n\n\n/**@brief Get a BLE option.\n *\n * @details This call allows the application to retrieve the value of an option.\n *\n * @param[in] opt_id Option ID, see @ref BLE_COMMON_OPTS and @ref BLE_GAP_OPTS.\n * @param[out] p_opt Pointer to a ble_opt_t structure to be filled in.\n *\n * @retval ::NRF_SUCCESS  Option retrieved successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints.\n * @retval ::NRF_ERROR_INVALID_STATE Unable to retrieve the parameter at this time.\n * @retval ::NRF_ERROR_BUSY The BLE stack is busy or the previous procedure has not completed.\n * @retval ::NRF_ERROR_NOT_SUPPORTED This option is not supported.\n *\n */\nSVCALL(SD_BLE_OPT_GET, uint32_t, sd_ble_opt_get(uint32_t opt_id, ble_opt_t *p_opt));\n\n/** @} */\n#ifdef __cplusplus\n}\n#endif\n#endif /* BLE_H__ */\n\n/**\n  @}\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_err.h",
    "content": "/*\n * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_COMMON\n  @{\n  @addtogroup  nrf_error\n  @{\n    @ingroup BLE_COMMON\n  @}\n\n  @defgroup ble_err General error codes\n  @{\n\n  @brief General error code definitions for the BLE API.\n\n  @ingroup BLE_COMMON\n*/\n#ifndef NRF_BLE_ERR_H__\n#define NRF_BLE_ERR_H__\n\n#include \"nrf_error.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* @defgroup BLE_ERRORS Error Codes\n * @{ */\n#define BLE_ERROR_NOT_ENABLED            (NRF_ERROR_STK_BASE_NUM+0x001) /**< @ref sd_ble_enable has not been called. */\n#define BLE_ERROR_INVALID_CONN_HANDLE    (NRF_ERROR_STK_BASE_NUM+0x002) /**< Invalid connection handle. */\n#define BLE_ERROR_INVALID_ATTR_HANDLE    (NRF_ERROR_STK_BASE_NUM+0x003) /**< Invalid attribute handle. */\n#define BLE_ERROR_INVALID_ADV_HANDLE     (NRF_ERROR_STK_BASE_NUM+0x004) /**< Invalid advertising handle. */\n#define BLE_ERROR_INVALID_ROLE           (NRF_ERROR_STK_BASE_NUM+0x005) /**< Invalid role. */\n#define BLE_ERROR_BLOCKED_BY_OTHER_LINKS (NRF_ERROR_STK_BASE_NUM+0x006) /**< The attempt to change link settings failed due to the scheduling of other links. */\n/** @} */\n\n\n/** @defgroup BLE_ERROR_SUBRANGES Module specific error code subranges\n *  @brief Assignment of subranges for module specific error codes.\n *  @note For specific error codes, see ble_<module>.h or ble_error_<module>.h.\n * @{ */\n#define NRF_L2CAP_ERR_BASE             (NRF_ERROR_STK_BASE_NUM+0x100) /**< L2CAP specific errors. */\n#define NRF_GAP_ERR_BASE               (NRF_ERROR_STK_BASE_NUM+0x200) /**< GAP specific errors. */\n#define NRF_GATTC_ERR_BASE             (NRF_ERROR_STK_BASE_NUM+0x300) /**< GATT client specific errors. */\n#define NRF_GATTS_ERR_BASE             (NRF_ERROR_STK_BASE_NUM+0x400) /**< GATT server specific errors. */\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n#endif\n\n\n/**\n  @}\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_gap.h",
    "content": "/*\n * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_GAP Generic Access Profile (GAP)\n  @{\n  @brief Definitions and prototypes for the GAP interface.\n */\n\n#ifndef BLE_GAP_H__\n#define BLE_GAP_H__\n\n#include <stdint.h>\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"ble_hci.h\"\n#include \"ble_ranges.h\"\n#include \"ble_types.h\"\n#include \"ble_err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**@addtogroup BLE_GAP_ENUMERATIONS Enumerations\n * @{ */\n\n/**@brief GAP API SVC numbers.\n */\nenum BLE_GAP_SVCS\n{\n  SD_BLE_GAP_ADDR_SET              = BLE_GAP_SVC_BASE,       /**< Set own Bluetooth Address. */\n  SD_BLE_GAP_ADDR_GET              = BLE_GAP_SVC_BASE + 1,   /**< Get own Bluetooth Address. */\n  SD_BLE_GAP_WHITELIST_SET         = BLE_GAP_SVC_BASE + 2,   /**< Set active whitelist. */\n  SD_BLE_GAP_DEVICE_IDENTITIES_SET = BLE_GAP_SVC_BASE + 3,   /**< Set device identity list. */\n  SD_BLE_GAP_PRIVACY_SET           = BLE_GAP_SVC_BASE + 4,   /**< Set Privacy settings*/\n  SD_BLE_GAP_PRIVACY_GET           = BLE_GAP_SVC_BASE + 5,   /**< Get Privacy settings*/\n  SD_BLE_GAP_ADV_SET_CONFIGURE     = BLE_GAP_SVC_BASE + 6,   /**< Configure an advertising set. */\n  SD_BLE_GAP_ADV_START             = BLE_GAP_SVC_BASE + 7,   /**< Start Advertising. */\n  SD_BLE_GAP_ADV_STOP              = BLE_GAP_SVC_BASE + 8,   /**< Stop Advertising. */\n  SD_BLE_GAP_CONN_PARAM_UPDATE     = BLE_GAP_SVC_BASE + 9,   /**< Connection Parameter Update. */\n  SD_BLE_GAP_DISCONNECT            = BLE_GAP_SVC_BASE + 10,  /**< Disconnect. */\n  SD_BLE_GAP_TX_POWER_SET          = BLE_GAP_SVC_BASE + 11,  /**< Set TX Power. */\n  SD_BLE_GAP_APPEARANCE_SET        = BLE_GAP_SVC_BASE + 12,  /**< Set Appearance. */\n  SD_BLE_GAP_APPEARANCE_GET        = BLE_GAP_SVC_BASE + 13,  /**< Get Appearance. */\n  SD_BLE_GAP_PPCP_SET              = BLE_GAP_SVC_BASE + 14,  /**< Set PPCP. */\n  SD_BLE_GAP_PPCP_GET              = BLE_GAP_SVC_BASE + 15,  /**< Get PPCP. */\n  SD_BLE_GAP_DEVICE_NAME_SET       = BLE_GAP_SVC_BASE + 16,  /**< Set Device Name. */\n  SD_BLE_GAP_DEVICE_NAME_GET       = BLE_GAP_SVC_BASE + 17,  /**< Get Device Name. */\n  SD_BLE_GAP_AUTHENTICATE          = BLE_GAP_SVC_BASE + 18,  /**< Initiate Pairing/Bonding. */\n  SD_BLE_GAP_SEC_PARAMS_REPLY      = BLE_GAP_SVC_BASE + 19,  /**< Reply with Security Parameters. */\n  SD_BLE_GAP_AUTH_KEY_REPLY        = BLE_GAP_SVC_BASE + 20,  /**< Reply with an authentication key. */\n  SD_BLE_GAP_LESC_DHKEY_REPLY      = BLE_GAP_SVC_BASE + 21,  /**< Reply with an LE Secure Connections DHKey. */\n  SD_BLE_GAP_KEYPRESS_NOTIFY       = BLE_GAP_SVC_BASE + 22,  /**< Notify of a keypress during an authentication procedure. */\n  SD_BLE_GAP_LESC_OOB_DATA_GET     = BLE_GAP_SVC_BASE + 23,  /**< Get the local LE Secure Connections OOB data. */\n  SD_BLE_GAP_LESC_OOB_DATA_SET     = BLE_GAP_SVC_BASE + 24,  /**< Set the remote LE Secure Connections OOB data. */\n  SD_BLE_GAP_ENCRYPT               = BLE_GAP_SVC_BASE + 25,  /**< Initiate encryption procedure. */\n  SD_BLE_GAP_SEC_INFO_REPLY        = BLE_GAP_SVC_BASE + 26,  /**< Reply with Security Information. */\n  SD_BLE_GAP_CONN_SEC_GET          = BLE_GAP_SVC_BASE + 27,  /**< Obtain connection security level. */\n  SD_BLE_GAP_RSSI_START            = BLE_GAP_SVC_BASE + 28,  /**< Start reporting of changes in RSSI. */\n  SD_BLE_GAP_RSSI_STOP             = BLE_GAP_SVC_BASE + 29,  /**< Stop reporting of changes in RSSI. */\n  SD_BLE_GAP_SCAN_START            = BLE_GAP_SVC_BASE + 30,  /**< Start Scanning. */\n  SD_BLE_GAP_SCAN_STOP             = BLE_GAP_SVC_BASE + 31,  /**< Stop Scanning. */\n  SD_BLE_GAP_CONNECT               = BLE_GAP_SVC_BASE + 32,  /**< Connect. */\n  SD_BLE_GAP_CONNECT_CANCEL        = BLE_GAP_SVC_BASE + 33,  /**< Cancel ongoing connection procedure. */\n  SD_BLE_GAP_RSSI_GET              = BLE_GAP_SVC_BASE + 34,  /**< Get the last RSSI sample. */\n  SD_BLE_GAP_PHY_UPDATE            = BLE_GAP_SVC_BASE + 35,  /**< Initiate or respond to a PHY Update Procedure. */\n  SD_BLE_GAP_DATA_LENGTH_UPDATE    = BLE_GAP_SVC_BASE + 36,  /**< Initiate or respond to a Data Length Update Procedure. */\n  SD_BLE_GAP_QOS_CHANNEL_SURVEY_START  = BLE_GAP_SVC_BASE + 37, /**< Start Quality of Service (QoS) channel survey module. */\n  SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP   = BLE_GAP_SVC_BASE + 38, /**< Stop Quality of Service (QoS) channel survey module. */\n  SD_BLE_GAP_ADV_ADDR_GET          = BLE_GAP_SVC_BASE + 39, /**< Get the Address used on air while Advertising. */\n};\n\n/**@brief GAP Event IDs.\n * IDs that uniquely identify an event coming from the stack to the application.\n */\nenum BLE_GAP_EVTS\n{\n  BLE_GAP_EVT_CONNECTED                   = BLE_GAP_EVT_BASE,       /**< Connected to peer.                              \\n See @ref ble_gap_evt_connected_t             */\n  BLE_GAP_EVT_DISCONNECTED                = BLE_GAP_EVT_BASE + 1,   /**< Disconnected from peer.                         \\n See @ref ble_gap_evt_disconnected_t.         */\n  BLE_GAP_EVT_CONN_PARAM_UPDATE           = BLE_GAP_EVT_BASE + 2,   /**< Connection Parameters updated.                  \\n See @ref ble_gap_evt_conn_param_update_t.    */\n  BLE_GAP_EVT_SEC_PARAMS_REQUEST          = BLE_GAP_EVT_BASE + 3,   /**< Request to provide security parameters.         \\n Reply with @ref sd_ble_gap_sec_params_reply.  \\n See @ref ble_gap_evt_sec_params_request_t. */\n  BLE_GAP_EVT_SEC_INFO_REQUEST            = BLE_GAP_EVT_BASE + 4,   /**< Request to provide security information.        \\n Reply with @ref sd_ble_gap_sec_info_reply.    \\n See @ref ble_gap_evt_sec_info_request_t.   */\n  BLE_GAP_EVT_PASSKEY_DISPLAY             = BLE_GAP_EVT_BASE + 5,   /**< Request to display a passkey to the user.       \\n In LESC Numeric Comparison, reply with @ref sd_ble_gap_auth_key_reply. \\n See @ref ble_gap_evt_passkey_display_t. */\n  BLE_GAP_EVT_KEY_PRESSED                 = BLE_GAP_EVT_BASE + 6,   /**< Notification of a keypress on the remote device.\\n See @ref ble_gap_evt_key_pressed_t           */\n  BLE_GAP_EVT_AUTH_KEY_REQUEST            = BLE_GAP_EVT_BASE + 7,   /**< Request to provide an authentication key.       \\n Reply with @ref sd_ble_gap_auth_key_reply.    \\n See @ref ble_gap_evt_auth_key_request_t.   */\n  BLE_GAP_EVT_LESC_DHKEY_REQUEST          = BLE_GAP_EVT_BASE + 8,   /**< Request to calculate an LE Secure Connections DHKey. \\n Reply with @ref sd_ble_gap_lesc_dhkey_reply.  \\n See @ref ble_gap_evt_lesc_dhkey_request_t */\n  BLE_GAP_EVT_AUTH_STATUS                 = BLE_GAP_EVT_BASE + 9,   /**< Authentication procedure completed with status. \\n See @ref ble_gap_evt_auth_status_t.          */\n  BLE_GAP_EVT_CONN_SEC_UPDATE             = BLE_GAP_EVT_BASE + 10,  /**< Connection security updated.                    \\n See @ref ble_gap_evt_conn_sec_update_t.      */\n  BLE_GAP_EVT_TIMEOUT                     = BLE_GAP_EVT_BASE + 11,  /**< Timeout expired.                                \\n See @ref ble_gap_evt_timeout_t.              */\n  BLE_GAP_EVT_RSSI_CHANGED                = BLE_GAP_EVT_BASE + 12,  /**< RSSI report.                                    \\n See @ref ble_gap_evt_rssi_changed_t.         */\n  BLE_GAP_EVT_ADV_REPORT                  = BLE_GAP_EVT_BASE + 13,  /**< Advertising report.                             \\n See @ref ble_gap_evt_adv_report_t.           */\n  BLE_GAP_EVT_SEC_REQUEST                 = BLE_GAP_EVT_BASE + 14,  /**< Security Request.                               \\n See @ref ble_gap_evt_sec_request_t.          */\n  BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST   = BLE_GAP_EVT_BASE + 15,  /**< Connection Parameter Update Request.            \\n Reply with @ref sd_ble_gap_conn_param_update. \\n See @ref ble_gap_evt_conn_param_update_request_t. */\n  BLE_GAP_EVT_SCAN_REQ_REPORT             = BLE_GAP_EVT_BASE + 16,  /**< Scan request report.                            \\n See @ref ble_gap_evt_scan_req_report_t. */\n  BLE_GAP_EVT_PHY_UPDATE_REQUEST          = BLE_GAP_EVT_BASE + 17,  /**< PHY Update Request.                             \\n Reply with @ref sd_ble_gap_phy_update. \\n See @ref ble_gap_evt_phy_update_request_t. */\n  BLE_GAP_EVT_PHY_UPDATE                  = BLE_GAP_EVT_BASE + 18,  /**< PHY Update Procedure is complete.               \\n See @ref ble_gap_evt_phy_update_t.           */\n  BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST = BLE_GAP_EVT_BASE + 19,   /**< Data Length Update Request.                     \\n Reply with @ref sd_ble_gap_data_length_update.\\n See @ref ble_gap_evt_data_length_update_request_t. */\n  BLE_GAP_EVT_DATA_LENGTH_UPDATE         = BLE_GAP_EVT_BASE + 20,   /**< LL Data Channel PDU payload length updated.     \\n See @ref ble_gap_evt_data_length_update_t. */\n  BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT  = BLE_GAP_EVT_BASE + 21,   /**< Channel survey report.                          \\n See @ref ble_gap_evt_qos_channel_survey_report_t. */\n  BLE_GAP_EVT_ADV_SET_TERMINATED         = BLE_GAP_EVT_BASE + 22,   /**< Advertising set terminated.                     \\n See @ref ble_gap_evt_adv_set_terminated_t. */\n};\n\n/**@brief GAP Option IDs.\n * IDs that uniquely identify a GAP option.\n */\nenum BLE_GAP_OPTS\n{\n  BLE_GAP_OPT_CH_MAP                 = BLE_GAP_OPT_BASE,       /**< Channel Map. @ref ble_gap_opt_ch_map_t  */\n  BLE_GAP_OPT_LOCAL_CONN_LATENCY     = BLE_GAP_OPT_BASE + 1,   /**< Local connection latency. @ref ble_gap_opt_local_conn_latency_t */\n  BLE_GAP_OPT_PASSKEY                = BLE_GAP_OPT_BASE + 2,   /**< Set passkey. @ref ble_gap_opt_passkey_t */\n  BLE_GAP_OPT_COMPAT_MODE_1          = BLE_GAP_OPT_BASE + 3,   /**< Compatibility mode. @ref ble_gap_opt_compat_mode_1_t */\n  BLE_GAP_OPT_AUTH_PAYLOAD_TIMEOUT   = BLE_GAP_OPT_BASE + 4,   /**< Set Authenticated payload timeout. @ref ble_gap_opt_auth_payload_timeout_t */\n  BLE_GAP_OPT_SLAVE_LATENCY_DISABLE  = BLE_GAP_OPT_BASE + 5,   /**< Disable slave latency. @ref ble_gap_opt_slave_latency_disable_t */\n};\n\n/**@brief GAP Configuration IDs.\n *\n * IDs that uniquely identify a GAP configuration.\n */\nenum BLE_GAP_CFGS\n{\n  BLE_GAP_CFG_ROLE_COUNT    = BLE_GAP_CFG_BASE,     /**< Role count configuration.  */\n  BLE_GAP_CFG_DEVICE_NAME   = BLE_GAP_CFG_BASE + 1, /**< Device name configuration. */\n};\n\n/**@brief GAP TX Power roles.\n */\nenum BLE_GAP_TX_POWER_ROLES\n{\n  BLE_GAP_TX_POWER_ROLE_ADV       = 1,           /**< Advertiser role. */\n  BLE_GAP_TX_POWER_ROLE_SCAN_INIT = 2,           /**< Scanner and initiator role. */\n  BLE_GAP_TX_POWER_ROLE_CONN      = 3,           /**< Connection role. */\n};\n\n/** @} */\n\n/**@addtogroup BLE_GAP_DEFINES Defines\n * @{ */\n\n/**@defgroup BLE_ERRORS_GAP SVC return values specific to GAP\n * @{ */\n#define BLE_ERROR_GAP_UUID_LIST_MISMATCH            (NRF_GAP_ERR_BASE + 0x000)  /**< UUID list does not contain an integral number of UUIDs. */\n#define BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST   (NRF_GAP_ERR_BASE + 0x001)  /**< Use of Whitelist not permitted with discoverable advertising. */\n#define BLE_ERROR_GAP_INVALID_BLE_ADDR              (NRF_GAP_ERR_BASE + 0x002)  /**< The upper two bits of the address do not correspond to the specified address type. */\n#define BLE_ERROR_GAP_WHITELIST_IN_USE              (NRF_GAP_ERR_BASE + 0x003)  /**< Attempt to modify the whitelist while already in use by another operation. */\n#define BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE      (NRF_GAP_ERR_BASE + 0x004)  /**< Attempt to modify the device identity list while already in use by another operation. */\n#define BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE   (NRF_GAP_ERR_BASE + 0x005)  /**< The device identity list contains entries with duplicate identity addresses. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_ROLES GAP Roles\n * @{ */\n#define BLE_GAP_ROLE_INVALID     0x0            /**< Invalid Role. */\n#define BLE_GAP_ROLE_PERIPH      0x1            /**< Peripheral Role. */\n#define BLE_GAP_ROLE_CENTRAL     0x2            /**< Central Role. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_TIMEOUT_SOURCES GAP Timeout sources\n * @{ */\n#define BLE_GAP_TIMEOUT_SRC_SCAN                       0x01 /**< Scanning timeout. */\n#define BLE_GAP_TIMEOUT_SRC_CONN                       0x02 /**< Connection timeout. */\n#define BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD               0x03 /**< Authenticated payload timeout. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_ADDR_TYPES GAP Address types\n * @{ */\n#define BLE_GAP_ADDR_TYPE_PUBLIC                        0x00 /**< Public (identity) address.*/\n#define BLE_GAP_ADDR_TYPE_RANDOM_STATIC                 0x01 /**< Random static (identity) address. */\n#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE     0x02 /**< Random private resolvable address. */\n#define BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE 0x03 /**< Random private non-resolvable address. */\n#define BLE_GAP_ADDR_TYPE_ANONYMOUS                     0x7F /**< An advertiser may advertise without its address.\n                                                                  This type of advertising is called anonymous. */\n/**@} */\n\n\n/**@brief The default interval in seconds at which a private address is refreshed.  */\n#define BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S (900) /* 15 minutes. */\n/**@brief The maximum interval in seconds at which a private address can be refreshed.  */\n#define BLE_GAP_MAX_PRIVATE_ADDR_CYCLE_INTERVAL_S     (41400) /* 11 hours 30 minutes. */\n\n\n/** @brief BLE address length. */\n#define BLE_GAP_ADDR_LEN (6)\n\n/**@defgroup BLE_GAP_PRIVACY_MODES Privacy modes\n * @{ */\n#define BLE_GAP_PRIVACY_MODE_OFF                       0x00 /**< Device will send and accept its identity address for its own address. */\n#define BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY            0x01 /**< Device will send and accept only private addresses for its own address. */\n#define BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY           0x02 /**< Device will send and accept only private addresses for its own address,\n                                                                 and will not accept a peer using identity address as sender address when\n                                                                 the peer IRK is exchanged, non-zero and added to the identity list. */\n/**@} */\n\n/** @brief Invalid power level. */\n#define BLE_GAP_POWER_LEVEL_INVALID     127\n\n/** @brief Advertising set handle not set. */\n#define BLE_GAP_ADV_SET_HANDLE_NOT_SET (0xFF)\n\n/** @brief The default number of advertising sets. */\n#define BLE_GAP_ADV_SET_COUNT_DEFAULT   (1)\n\n/** @brief The maximum number of advertising sets supported by this SoftDevice. */\n#define BLE_GAP_ADV_SET_COUNT_MAX       (1)\n\n/**@defgroup BLE_GAP_ADV_SET_DATA_SIZES Advertising data sizes.\n * @{ */\n#define BLE_GAP_ADV_SET_DATA_SIZE_MAX                    (31)   /**< Maximum data length for an advertising set.\n                                                                     If more advertising data is required, use extended advertising instead. */\n#define BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED (255)  /**< Maximum supported data length for an extended advertising set. */\n\n#define BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_CONNECTABLE_MAX_SUPPORTED (238) /**< Maximum supported data length for an extended connectable advertising set. */\n/**@}. */\n\n/** @brief Set ID not available in advertising report. */\n#define BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE                    0xFF\n\n/**@defgroup BLE_GAP_EVT_ADV_SET_TERMINATED_REASON GAP Advertising Set Terminated reasons\n * @{ */\n#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_TIMEOUT              0x01  /**< Timeout value reached. */\n#define BLE_GAP_EVT_ADV_SET_TERMINATED_REASON_LIMIT_REACHED        0x02  /**< @ref ble_gap_adv_params_t::max_adv_evts was reached. */\n/**@} */\n\n/**@defgroup BLE_GAP_AD_TYPE_DEFINITIONS GAP Advertising and Scan Response Data format\n * @note Found at https://www.bluetooth.org/Technical/AssignedNumbers/generic_access_profile.htm\n * @{ */\n#define BLE_GAP_AD_TYPE_FLAGS                               0x01 /**< Flags for discoverability. */\n#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_MORE_AVAILABLE   0x02 /**< Partial list of 16 bit service UUIDs. */\n#define BLE_GAP_AD_TYPE_16BIT_SERVICE_UUID_COMPLETE         0x03 /**< Complete list of 16 bit service UUIDs. */\n#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_MORE_AVAILABLE   0x04 /**< Partial list of 32 bit service UUIDs. */\n#define BLE_GAP_AD_TYPE_32BIT_SERVICE_UUID_COMPLETE         0x05 /**< Complete list of 32 bit service UUIDs. */\n#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_MORE_AVAILABLE  0x06 /**< Partial list of 128 bit service UUIDs. */\n#define BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE        0x07 /**< Complete list of 128 bit service UUIDs. */\n#define BLE_GAP_AD_TYPE_SHORT_LOCAL_NAME                    0x08 /**< Short local device name. */\n#define BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME                 0x09 /**< Complete local device name. */\n#define BLE_GAP_AD_TYPE_TX_POWER_LEVEL                      0x0A /**< Transmit power level. */\n#define BLE_GAP_AD_TYPE_CLASS_OF_DEVICE                     0x0D /**< Class of device. */\n#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C               0x0E /**< Simple Pairing Hash C. */\n#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R         0x0F /**< Simple Pairing Randomizer R. */\n#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_TK_VALUE           0x10 /**< Security Manager TK Value. */\n#define BLE_GAP_AD_TYPE_SECURITY_MANAGER_OOB_FLAGS          0x11 /**< Security Manager Out Of Band Flags. */\n#define BLE_GAP_AD_TYPE_SLAVE_CONNECTION_INTERVAL_RANGE     0x12 /**< Slave Connection Interval Range. */\n#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_16BIT       0x14 /**< List of 16-bit Service Solicitation UUIDs. */\n#define BLE_GAP_AD_TYPE_SOLICITED_SERVICE_UUIDS_128BIT      0x15 /**< List of 128-bit Service Solicitation UUIDs. */\n#define BLE_GAP_AD_TYPE_SERVICE_DATA                        0x16 /**< Service Data - 16-bit UUID. */\n#define BLE_GAP_AD_TYPE_PUBLIC_TARGET_ADDRESS               0x17 /**< Public Target Address. */\n#define BLE_GAP_AD_TYPE_RANDOM_TARGET_ADDRESS               0x18 /**< Random Target Address. */\n#define BLE_GAP_AD_TYPE_APPEARANCE                          0x19 /**< Appearance. */\n#define BLE_GAP_AD_TYPE_ADVERTISING_INTERVAL                0x1A /**< Advertising Interval. */\n#define BLE_GAP_AD_TYPE_LE_BLUETOOTH_DEVICE_ADDRESS         0x1B /**< LE Bluetooth Device Address. */\n#define BLE_GAP_AD_TYPE_LE_ROLE                             0x1C /**< LE Role. */\n#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_HASH_C256            0x1D /**< Simple Pairing Hash C-256. */\n#define BLE_GAP_AD_TYPE_SIMPLE_PAIRING_RANDOMIZER_R256      0x1E /**< Simple Pairing Randomizer R-256. */\n#define BLE_GAP_AD_TYPE_SERVICE_DATA_32BIT_UUID             0x20 /**< Service Data - 32-bit UUID. */\n#define BLE_GAP_AD_TYPE_SERVICE_DATA_128BIT_UUID            0x21 /**< Service Data - 128-bit UUID. */\n#define BLE_GAP_AD_TYPE_LESC_CONFIRMATION_VALUE             0x22 /**< LE Secure Connections Confirmation Value */\n#define BLE_GAP_AD_TYPE_LESC_RANDOM_VALUE                   0x23 /**< LE Secure Connections Random Value */\n#define BLE_GAP_AD_TYPE_URI                                 0x24 /**< URI */\n#define BLE_GAP_AD_TYPE_3D_INFORMATION_DATA                 0x3D /**< 3D Information Data. */\n#define BLE_GAP_AD_TYPE_MANUFACTURER_SPECIFIC_DATA          0xFF /**< Manufacturer Specific Data. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_ADV_FLAGS GAP Advertisement Flags\n * @{ */\n#define BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE         (0x01)   /**< LE Limited Discoverable Mode. */\n#define BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE         (0x02)   /**< LE General Discoverable Mode. */\n#define BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED         (0x04)   /**< BR/EDR not supported. */\n#define BLE_GAP_ADV_FLAG_LE_BR_EDR_CONTROLLER         (0x08)   /**< Simultaneous LE and BR/EDR, Controller. */\n#define BLE_GAP_ADV_FLAG_LE_BR_EDR_HOST               (0x10)   /**< Simultaneous LE and BR/EDR, Host. */\n#define BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE   (BLE_GAP_ADV_FLAG_LE_LIMITED_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED)   /**< LE Limited Discoverable Mode, BR/EDR not supported. */\n#define BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE   (BLE_GAP_ADV_FLAG_LE_GENERAL_DISC_MODE | BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED)   /**< LE General Discoverable Mode, BR/EDR not supported. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_ADV_INTERVALS GAP Advertising interval max and min\n * @{ */\n#define BLE_GAP_ADV_INTERVAL_MIN        0x000020 /**< Minimum Advertising interval in 625 us units, i.e. 20 ms. */\n#define BLE_GAP_ADV_INTERVAL_MAX        0x004000 /**< Maximum Advertising interval in 625 us units, i.e. 10.24 s. */\n /**@}  */\n\n\n/**@defgroup BLE_GAP_SCAN_INTERVALS GAP Scan interval max and min\n * @{ */\n#define BLE_GAP_SCAN_INTERVAL_MIN       0x0004 /**< Minimum Scan interval in 625 us units, i.e. 2.5 ms. */\n#define BLE_GAP_SCAN_INTERVAL_MAX       0xFFFF /**< Maximum Scan interval in 625 us units, i.e. 40,959.375 s. */\n /** @}  */\n\n\n/**@defgroup BLE_GAP_SCAN_WINDOW GAP Scan window max and min\n * @{ */\n#define BLE_GAP_SCAN_WINDOW_MIN         0x0004 /**< Minimum Scan window in 625 us units, i.e. 2.5 ms. */\n#define BLE_GAP_SCAN_WINDOW_MAX         0xFFFF /**< Maximum Scan window in 625 us units, i.e. 40,959.375 s. */\n /** @}  */\n\n\n/**@defgroup BLE_GAP_SCAN_TIMEOUT GAP Scan timeout max and min\n * @{ */\n#define BLE_GAP_SCAN_TIMEOUT_MIN        0x0001 /**< Minimum Scan timeout in 10 ms units, i.e 10 ms. */\n#define BLE_GAP_SCAN_TIMEOUT_UNLIMITED  0x0000 /**< Continue to scan forever. */\n /** @}  */\n\n/**@defgroup BLE_GAP_SCAN_BUFFER_SIZE GAP Minimum scanner buffer size\n *\n * Scan buffers are used for storing advertising data received from an advertiser.\n * If ble_gap_scan_params_t::extended is set to 0, @ref BLE_GAP_SCAN_BUFFER_MIN is the minimum scan buffer length.\n * else the minimum scan buffer size is @ref BLE_GAP_SCAN_BUFFER_EXTENDED_MIN.\n * @{ */\n#define BLE_GAP_SCAN_BUFFER_MIN                    (31)                             /**< Minimum data length for an\n                                                                                         advertising set. */\n#define BLE_GAP_SCAN_BUFFER_MAX                    (31)                             /**< Maximum data length for an\n                                                                                         advertising set. */\n#define BLE_GAP_SCAN_BUFFER_EXTENDED_MIN           (255)                            /**< Minimum data length for an\n                                                                                         extended advertising set. */\n#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX           (1650)                           /**< Maximum data length for an\n                                                                                         extended advertising set. */\n#define BLE_GAP_SCAN_BUFFER_EXTENDED_MAX_SUPPORTED (255)                            /**< Maximum supported data length for\n                                                                                         an extended advertising set. */\n/** @}  */\n\n/**@defgroup BLE_GAP_ADV_TYPES GAP Advertising types\n *\n * Advertising types defined in Bluetooth Core Specification v5.0, Vol 6, Part B, Section 4.4.2.\n *\n * The maximum advertising data length is defined by @ref BLE_GAP_ADV_SET_DATA_SIZE_MAX.\n * The maximum supported data length for an extended advertiser is defined by\n * @ref BLE_GAP_ADV_SET_DATA_SIZE_EXTENDED_MAX_SUPPORTED\n * Note that some of the advertising types do not support advertising data. Non-scannable types do not support\n * scan response data.\n *\n * @{ */\n#define BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED                   0x01   /**< Connectable and scannable undirected\n                                                                                        advertising events. */\n#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE  0x02   /**< Connectable non-scannable directed advertising\n                                                                                        events. Advertising interval is less that 3.75 ms.\n                                                                                        Use this type for fast reconnections.\n                                                                                        @note Advertising data is not supported. */\n#define BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED                  0x03   /**< Connectable non-scannable directed advertising\n                                                                                        events.\n                                                                                        @note Advertising data is not supported. */\n#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_SCANNABLE_UNDIRECTED                0x04   /**< Non-connectable scannable undirected\n                                                                                        advertising events. */\n#define BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED             0x05   /**< Non-connectable non-scannable undirected\n                                                                                        advertising events. */\n#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_UNDIRECTED       0x06   /**< Connectable non-scannable undirected advertising\n                                                                                        events using extended advertising PDUs. */\n#define BLE_GAP_ADV_TYPE_EXTENDED_CONNECTABLE_NONSCANNABLE_DIRECTED         0x07   /**< Connectable non-scannable directed advertising\n                                                                                        events using extended advertising PDUs. */\n#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_UNDIRECTED       0x08   /**< Non-connectable scannable undirected advertising\n                                                                                        events using extended advertising PDUs.\n                                                                                        @note Only scan response data is supported. */\n#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_SCANNABLE_DIRECTED         0x09   /**< Non-connectable scannable directed advertising\n                                                                                        events using extended advertising PDUs.\n                                                                                        @note Only scan response data is supported. */\n#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED    0x0A   /**< Non-connectable non-scannable undirected advertising\n                                                                                        events using extended advertising PDUs. */\n#define BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED      0x0B   /**< Non-connectable non-scannable directed advertising\n                                                                                        events using extended advertising PDUs. */\n/**@} */\n\n/**@defgroup BLE_GAP_ADV_FILTER_POLICIES GAP Advertising filter policies\n * @{ */\n#define BLE_GAP_ADV_FP_ANY                0x00   /**< Allow scan requests and connect requests from any device. */\n#define BLE_GAP_ADV_FP_FILTER_SCANREQ     0x01   /**< Filter scan requests with whitelist. */\n#define BLE_GAP_ADV_FP_FILTER_CONNREQ     0x02   /**< Filter connect requests with whitelist. */\n#define BLE_GAP_ADV_FP_FILTER_BOTH        0x03   /**< Filter both scan and connect requests with whitelist. */\n/**@} */\n\n/**@defgroup BLE_GAP_ADV_DATA_STATUS GAP Advertising data status\n * @{ */\n#define BLE_GAP_ADV_DATA_STATUS_COMPLETE             0x00 /**< All data in the advertising event have been received. */\n#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA 0x01 /**< More data to be received.\n                                                               @note This value will only be used if\n                                                               @ref ble_gap_scan_params_t::report_incomplete_evts and\n                                                               @ref ble_gap_adv_report_type_t::extended_pdu are set to true. */\n#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED 0x02 /**< Incomplete data. Buffer size insufficient to receive more.\n                                                               @note This value will only be used if\n                                                               @ref ble_gap_adv_report_type_t::extended_pdu is set to true. */\n#define BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MISSED    0x03 /**< Failed to receive the remaining data.\n                                                               @note This value will only be used if\n                                                               @ref ble_gap_adv_report_type_t::extended_pdu is set to true. */\n/**@} */\n\n/**@defgroup BLE_GAP_SCAN_FILTER_POLICIES GAP Scanner filter policies\n * @{ */\n#define BLE_GAP_SCAN_FP_ACCEPT_ALL                      0x00  /**< Accept all advertising packets except directed advertising packets\n                                                                   not addressed to this device. */\n#define BLE_GAP_SCAN_FP_WHITELIST                       0x01  /**< Accept advertising packets from devices in the whitelist except directed\n                                                                   packets not addressed to this device. */\n#define BLE_GAP_SCAN_FP_ALL_NOT_RESOLVED_DIRECTED       0x02  /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_ACCEPT_ALL.\n                                                                   In addition, accept directed advertising packets, where the advertiser's\n                                                                   address is a resolvable private address that cannot be resolved. */\n#define BLE_GAP_SCAN_FP_WHITELIST_NOT_RESOLVED_DIRECTED 0x03  /**< Accept all advertising packets specified in @ref BLE_GAP_SCAN_FP_WHITELIST.\n                                                                   In addition, accept directed advertising packets, where the advertiser's\n                                                                   address is a resolvable private address that cannot be resolved. */\n/**@} */\n\n/**@defgroup BLE_GAP_ADV_TIMEOUT_VALUES GAP Advertising timeout values in 10 ms units\n * @{ */\n#define BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX     (128)   /**< Maximum high duty advertising time in 10 ms units. Corresponds to 1.28 s. */\n#define BLE_GAP_ADV_TIMEOUT_LIMITED_MAX       (18000) /**< Maximum advertising time in 10 ms units corresponding to TGAP(lim_adv_timeout) = 180 s in limited discoverable mode. */\n#define BLE_GAP_ADV_TIMEOUT_GENERAL_UNLIMITED (0)     /**< Unlimited advertising in general discoverable mode.\n                                                           For high duty cycle advertising, this corresponds to @ref BLE_GAP_ADV_TIMEOUT_HIGH_DUTY_MAX. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_DISC_MODES GAP Discovery modes\n * @{ */\n#define BLE_GAP_DISC_MODE_NOT_DISCOVERABLE  0x00   /**< Not discoverable discovery Mode. */\n#define BLE_GAP_DISC_MODE_LIMITED           0x01   /**< Limited Discovery Mode. */\n#define BLE_GAP_DISC_MODE_GENERAL           0x02   /**< General Discovery Mode. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_IO_CAPS GAP IO Capabilities\n * @{ */\n#define BLE_GAP_IO_CAPS_DISPLAY_ONLY      0x00   /**< Display Only. */\n#define BLE_GAP_IO_CAPS_DISPLAY_YESNO     0x01   /**< Display and Yes/No entry. */\n#define BLE_GAP_IO_CAPS_KEYBOARD_ONLY     0x02   /**< Keyboard Only. */\n#define BLE_GAP_IO_CAPS_NONE              0x03   /**< No I/O capabilities. */\n#define BLE_GAP_IO_CAPS_KEYBOARD_DISPLAY  0x04   /**< Keyboard and Display. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_AUTH_KEY_TYPES GAP Authentication Key Types\n * @{ */\n#define BLE_GAP_AUTH_KEY_TYPE_NONE        0x00   /**< No key (may be used to reject). */\n#define BLE_GAP_AUTH_KEY_TYPE_PASSKEY     0x01   /**< 6-digit Passkey. */\n#define BLE_GAP_AUTH_KEY_TYPE_OOB         0x02   /**< Out Of Band data. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_KP_NOT_TYPES GAP Keypress Notification Types\n * @{ */\n#define BLE_GAP_KP_NOT_TYPE_PASSKEY_START       0x00   /**< Passkey entry started. */\n#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_IN    0x01   /**< Passkey digit entered. */\n#define BLE_GAP_KP_NOT_TYPE_PASSKEY_DIGIT_OUT   0x02   /**< Passkey digit erased. */\n#define BLE_GAP_KP_NOT_TYPE_PASSKEY_CLEAR       0x03   /**< Passkey cleared. */\n#define BLE_GAP_KP_NOT_TYPE_PASSKEY_END         0x04   /**< Passkey entry completed. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_SEC_STATUS GAP Security status\n * @{ */\n#define BLE_GAP_SEC_STATUS_SUCCESS                0x00  /**< Procedure completed with success. */\n#define BLE_GAP_SEC_STATUS_TIMEOUT                0x01  /**< Procedure timed out. */\n#define BLE_GAP_SEC_STATUS_PDU_INVALID            0x02  /**< Invalid PDU received. */\n#define BLE_GAP_SEC_STATUS_RFU_RANGE1_BEGIN       0x03  /**< Reserved for Future Use range #1 begin. */\n#define BLE_GAP_SEC_STATUS_RFU_RANGE1_END         0x80  /**< Reserved for Future Use range #1 end. */\n#define BLE_GAP_SEC_STATUS_PASSKEY_ENTRY_FAILED   0x81  /**< Passkey entry failed (user canceled or other). */\n#define BLE_GAP_SEC_STATUS_OOB_NOT_AVAILABLE      0x82  /**< Out of Band Key not available. */\n#define BLE_GAP_SEC_STATUS_AUTH_REQ               0x83  /**< Authentication requirements not met. */\n#define BLE_GAP_SEC_STATUS_CONFIRM_VALUE          0x84  /**< Confirm value failed. */\n#define BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP       0x85  /**< Pairing not supported.  */\n#define BLE_GAP_SEC_STATUS_ENC_KEY_SIZE           0x86  /**< Encryption key size. */\n#define BLE_GAP_SEC_STATUS_SMP_CMD_UNSUPPORTED    0x87  /**< Unsupported SMP command. */\n#define BLE_GAP_SEC_STATUS_UNSPECIFIED            0x88  /**< Unspecified reason. */\n#define BLE_GAP_SEC_STATUS_REPEATED_ATTEMPTS      0x89  /**< Too little time elapsed since last attempt. */\n#define BLE_GAP_SEC_STATUS_INVALID_PARAMS         0x8A  /**< Invalid parameters. */\n#define BLE_GAP_SEC_STATUS_DHKEY_FAILURE          0x8B  /**< DHKey check failure. */\n#define BLE_GAP_SEC_STATUS_NUM_COMP_FAILURE       0x8C  /**< Numeric Comparison failure. */\n#define BLE_GAP_SEC_STATUS_BR_EDR_IN_PROG         0x8D  /**< BR/EDR pairing in progress. */\n#define BLE_GAP_SEC_STATUS_X_TRANS_KEY_DISALLOWED 0x8E  /**< BR/EDR Link Key cannot be used for LE keys. */\n#define BLE_GAP_SEC_STATUS_RFU_RANGE2_BEGIN       0x8F  /**< Reserved for Future Use range #2 begin. */\n#define BLE_GAP_SEC_STATUS_RFU_RANGE2_END         0xFF  /**< Reserved for Future Use range #2 end. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_SEC_STATUS_SOURCES GAP Security status sources\n * @{ */\n#define BLE_GAP_SEC_STATUS_SOURCE_LOCAL           0x00  /**< Local failure. */\n#define BLE_GAP_SEC_STATUS_SOURCE_REMOTE          0x01  /**< Remote failure. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_CP_LIMITS GAP Connection Parameters Limits\n * @{ */\n#define BLE_GAP_CP_MIN_CONN_INTVL_NONE           0xFFFF  /**< No new minimum connection interval specified in connect parameters. */\n#define BLE_GAP_CP_MIN_CONN_INTVL_MIN            0x0006  /**< Lowest minimum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */\n#define BLE_GAP_CP_MIN_CONN_INTVL_MAX            0x0C80  /**< Highest minimum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */\n#define BLE_GAP_CP_MAX_CONN_INTVL_NONE           0xFFFF  /**< No new maximum connection interval specified in connect parameters. */\n#define BLE_GAP_CP_MAX_CONN_INTVL_MIN            0x0006  /**< Lowest maximum connection interval permitted, in units of 1.25 ms, i.e. 7.5 ms. */\n#define BLE_GAP_CP_MAX_CONN_INTVL_MAX            0x0C80  /**< Highest maximum connection interval permitted, in units of 1.25 ms, i.e. 4 s. */\n#define BLE_GAP_CP_SLAVE_LATENCY_MAX             0x01F3  /**< Highest slave latency permitted, in connection events. */\n#define BLE_GAP_CP_CONN_SUP_TIMEOUT_NONE         0xFFFF  /**< No new supervision timeout specified in connect parameters. */\n#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MIN          0x000A  /**< Lowest supervision timeout permitted, in units of 10 ms, i.e. 100 ms. */\n#define BLE_GAP_CP_CONN_SUP_TIMEOUT_MAX          0x0C80  /**< Highest supervision timeout permitted, in units of 10 ms, i.e. 32 s. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_DEVNAME GAP device name defines.\n * @{ */\n#define BLE_GAP_DEVNAME_DEFAULT                  \"nRF5x\" /**< Default device name value. */\n#define BLE_GAP_DEVNAME_DEFAULT_LEN              31      /**< Default number of octets in device name. */\n#define BLE_GAP_DEVNAME_MAX_LEN                  248     /**< Maximum number of octets in device name. */\n/**@} */\n\n\n/**@brief Disable RSSI events for connections */\n#define BLE_GAP_RSSI_THRESHOLD_INVALID 0xFF\n\n/**@defgroup BLE_GAP_PHYS GAP PHYs\n * @{ */\n#define BLE_GAP_PHY_AUTO                         0x00    /**< Automatic PHY selection. Refer @ref sd_ble_gap_phy_update for more information.*/\n#define BLE_GAP_PHY_1MBPS                        0x01    /**< 1 Mbps PHY. */\n#define BLE_GAP_PHY_2MBPS                        0x02    /**< 2 Mbps PHY. */\n#define BLE_GAP_PHY_CODED                        0x04    /**< Coded PHY. */\n#define BLE_GAP_PHY_NOT_SET                      0xFF    /**< PHY is not configured. */\n\n/**@brief Supported PHYs in connections, for scanning, and for advertising. */\n#define BLE_GAP_PHYS_SUPPORTED  (BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS | BLE_GAP_PHY_CODED) /**< All PHYs are supported. */\n\n/**@} */\n\n/**@defgroup BLE_GAP_CONN_SEC_MODE_SET_MACROS GAP attribute security requirement setters\n *\n * See @ref ble_gap_conn_sec_mode_t.\n * @{ */\n/**@brief Set sec_mode pointed to by ptr to have no access rights.*/\n#define BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(ptr)          do {(ptr)->sm = 0; (ptr)->lv = 0;} while(0)\n/**@brief Set sec_mode pointed to by ptr to require no protection, open link.*/\n#define BLE_GAP_CONN_SEC_MODE_SET_OPEN(ptr)               do {(ptr)->sm = 1; (ptr)->lv = 1;} while(0)\n/**@brief Set sec_mode pointed to by ptr to require encryption, but no MITM protection.*/\n#define BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(ptr)        do {(ptr)->sm = 1; (ptr)->lv = 2;} while(0)\n/**@brief Set sec_mode pointed to by ptr to require encryption and MITM protection.*/\n#define BLE_GAP_CONN_SEC_MODE_SET_ENC_WITH_MITM(ptr)      do {(ptr)->sm = 1; (ptr)->lv = 3;} while(0)\n/**@brief Set sec_mode pointed to by ptr to require LESC encryption and MITM protection.*/\n#define BLE_GAP_CONN_SEC_MODE_SET_LESC_ENC_WITH_MITM(ptr) do {(ptr)->sm = 1; (ptr)->lv = 4;} while(0)\n/**@brief Set sec_mode pointed to by ptr to require signing or encryption, no MITM protection needed.*/\n#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_NO_MITM(ptr)     do {(ptr)->sm = 2; (ptr)->lv = 1;} while(0)\n/**@brief Set sec_mode pointed to by ptr to require signing or encryption with MITM protection.*/\n#define BLE_GAP_CONN_SEC_MODE_SET_SIGNED_WITH_MITM(ptr)   do {(ptr)->sm = 2; (ptr)->lv = 2;} while(0)\n/**@} */\n\n\n/**@brief GAP Security Random Number Length. */\n#define BLE_GAP_SEC_RAND_LEN 8\n\n\n/**@brief GAP Security Key Length. */\n#define BLE_GAP_SEC_KEY_LEN 16\n\n\n/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key Length. */\n#define BLE_GAP_LESC_P256_PK_LEN 64\n\n\n/**@brief GAP LE Secure Connections Elliptic Curve Diffie-Hellman DHKey Length. */\n#define BLE_GAP_LESC_DHKEY_LEN   32\n\n\n/**@brief GAP Passkey Length. */\n#define BLE_GAP_PASSKEY_LEN 6\n\n\n/**@brief Maximum amount of addresses in the whitelist. */\n#define BLE_GAP_WHITELIST_ADDR_MAX_COUNT (8)\n\n\n/**@brief Maximum amount of identities in the device identities list. */\n#define BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT (8)\n\n\n/**@brief Default connection count for a configuration. */\n#define BLE_GAP_CONN_COUNT_DEFAULT (1)\n\n\n/**@defgroup BLE_GAP_EVENT_LENGTH GAP event length defines.\n * @{ */\n#define BLE_GAP_EVENT_LENGTH_MIN            (2)  /**< Minimum event length, in 1.25 ms units. */\n#define BLE_GAP_EVENT_LENGTH_CODED_PHY_MIN  (6)  /**< The shortest event length in 1.25 ms units supporting LE Coded PHY. */\n#define BLE_GAP_EVENT_LENGTH_DEFAULT        (3)  /**< Default event length, in 1.25 ms units. */\n/**@} */\n\n\n/**@defgroup BLE_GAP_ROLE_COUNT GAP concurrent connection count defines.\n * @{ */\n#define BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT      (1)   /**< Default maximum number of connections concurrently acting as peripherals. */\n#define BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT     (3)   /**< Default maximum number of connections concurrently acting as centrals. */\n#define BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT (1)   /**< Default number of SMP instances shared between all connections acting as centrals. */\n#define BLE_GAP_ROLE_COUNT_COMBINED_MAX        (20)  /**< Maximum supported number of concurrent connections in the peripheral and central roles combined. */\n\n/**@} */\n\n/**@brief Automatic data length parameter. */\n#define BLE_GAP_DATA_LENGTH_AUTO 0\n\n/**@defgroup BLE_GAP_AUTH_PAYLOAD_TIMEOUT Authenticated payload timeout defines.\n  * @{ */\n#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX (48000) /**< Maximum authenticated payload timeout in 10 ms units, i.e. 8 minutes. */\n#define BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MIN (1)     /**< Minimum authenticated payload timeout in 10 ms units, i.e. 10 ms. */\n/**@} */\n\n/**@defgroup GAP_SEC_MODES GAP Security Modes\n * @{ */\n#define BLE_GAP_SEC_MODE 0x00 /**< No key (may be used to reject). */\n/**@} */\n\n/**@brief The total number of channels in Bluetooth Low Energy. */\n#define BLE_GAP_CHANNEL_COUNT      (40)\n\n/**@defgroup BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS Quality of Service (QoS) Channel survey interval defines\n * @{ */\n#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS  (0)       /**< Continuous channel survey. */\n#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MIN_US      (7500)    /**< Minimum channel survey interval in microseconds (7.5 ms). */\n#define BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_MAX_US      (4000000) /**< Maximum channel survey interval in microseconds (4 s). */\n /**@}  */\n\n/** @} */\n\n\n/**@addtogroup BLE_GAP_STRUCTURES Structures\n * @{ */\n\n/**@brief Advertising event properties. */\ntypedef struct\n{\n  uint8_t type;                 /**< Advertising type. See @ref BLE_GAP_ADV_TYPES. */\n  uint8_t anonymous        : 1; /**< Omit advertiser's address from all PDUs.\n                                     @note Anonymous advertising is only available for\n                                     @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED and\n                                     @ref BLE_GAP_ADV_TYPE_EXTENDED_NONCONNECTABLE_NONSCANNABLE_DIRECTED. */\n  uint8_t include_tx_power : 1; /**< This feature is not supported on this SoftDevice. */\n} ble_gap_adv_properties_t;\n\n\n/**@brief Advertising report type. */\ntypedef struct\n{\n  uint16_t connectable   : 1; /**< Connectable advertising event type. */\n  uint16_t scannable     : 1; /**< Scannable advertising event type. */\n  uint16_t directed      : 1; /**< Directed advertising event type. */\n  uint16_t scan_response : 1; /**< Received a scan response. */\n  uint16_t extended_pdu  : 1; /**< Received an extended advertising set. */\n  uint16_t status        : 2; /**< Data status. See @ref BLE_GAP_ADV_DATA_STATUS. */\n  uint16_t reserved      : 9; /**< Reserved for future use. */\n} ble_gap_adv_report_type_t;\n\n/**@brief Advertising Auxiliary Pointer. */\ntypedef struct\n{\n  uint16_t  aux_offset;   /**< Time offset from the beginning of advertising packet to the auxiliary packet in 100 us units. */\n  uint8_t   aux_phy;      /**< Indicates the PHY on which the auxiliary advertising packet is sent. See @ref BLE_GAP_PHYS. */\n} ble_gap_aux_pointer_t;\n\n/**@brief Bluetooth Low Energy address. */\ntypedef struct\n{\n  uint8_t addr_id_peer : 1;       /**< Only valid for peer addresses.\n                                       This bit is set by the SoftDevice to indicate whether the address has been resolved from\n                                       a Resolvable Private Address (when the peer is using privacy).\n                                       If set to 1, @ref addr and @ref addr_type refer to the identity address of the resolved address.\n\n                                       This bit is ignored when a variable of type @ref ble_gap_addr_t is used as input to API functions. */\n  uint8_t addr_type    : 7;       /**< See @ref BLE_GAP_ADDR_TYPES. */\n  uint8_t addr[BLE_GAP_ADDR_LEN]; /**< 48-bit address, LSB format.\n                                       @ref addr is not used if @ref addr_type is @ref BLE_GAP_ADDR_TYPE_ANONYMOUS. */\n} ble_gap_addr_t;\n\n\n/**@brief GAP connection parameters.\n *\n * @note  When ble_conn_params_t is received in an event, both min_conn_interval and\n *        max_conn_interval will be equal to the connection interval set by the central.\n *\n * @note  If both conn_sup_timeout and max_conn_interval are specified, then the following constraint applies:\n *        conn_sup_timeout * 4 > (1 + slave_latency) * max_conn_interval\n *        that corresponds to the following Bluetooth Spec requirement:\n *        The Supervision_Timeout in milliseconds shall be larger than\n *        (1 + Conn_Latency) * Conn_Interval_Max * 2, where Conn_Interval_Max is given in milliseconds.\n */\ntypedef struct\n{\n  uint16_t min_conn_interval;         /**< Minimum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/\n  uint16_t max_conn_interval;         /**< Maximum Connection Interval in 1.25 ms units, see @ref BLE_GAP_CP_LIMITS.*/\n  uint16_t slave_latency;             /**< Slave Latency in number of connection events, see @ref BLE_GAP_CP_LIMITS.*/\n  uint16_t conn_sup_timeout;          /**< Connection Supervision Timeout in 10 ms units, see @ref BLE_GAP_CP_LIMITS.*/\n} ble_gap_conn_params_t;\n\n\n/**@brief GAP connection security modes.\n *\n * Security Mode 0 Level 0: No access permissions at all (this level is not defined by the Bluetooth Core specification).\\n\n * Security Mode 1 Level 1: No security is needed (aka open link).\\n\n * Security Mode 1 Level 2: Encrypted link required, MITM protection not necessary.\\n\n * Security Mode 1 Level 3: MITM protected encrypted link required.\\n\n * Security Mode 1 Level 4: LESC MITM protected encrypted link using a 128-bit strength encryption key required.\\n\n * Security Mode 2 Level 1: Signing or encryption required, MITM protection not necessary.\\n\n * Security Mode 2 Level 2: MITM protected signing required, unless link is MITM protected encrypted.\\n\n */\ntypedef struct\n{\n  uint8_t sm : 4;                     /**< Security Mode (1 or 2), 0 for no permissions at all. */\n  uint8_t lv : 4;                     /**< Level (1, 2, 3 or 4), 0 for no permissions at all. */\n\n} ble_gap_conn_sec_mode_t;\n\n\n/**@brief GAP connection security status.*/\ntypedef struct\n{\n  ble_gap_conn_sec_mode_t sec_mode;           /**< Currently active security mode for this connection.*/\n  uint8_t                 encr_key_size;      /**< Length of currently active encryption key, 7 to 16 octets (only applicable for bonding procedures). */\n} ble_gap_conn_sec_t;\n\n/**@brief Identity Resolving Key. */\ntypedef struct\n{\n  uint8_t irk[BLE_GAP_SEC_KEY_LEN];   /**< Array containing IRK. */\n} ble_gap_irk_t;\n\n\n/**@brief Channel mask (40 bits).\n * Every channel is represented with a bit positioned as per channel index defined in Bluetooth Core Specification v5.0,\n * Vol 6, Part B, Section 1.4.1. The LSB contained in array element 0 represents channel index 0, and bit 39 represents\n * channel index 39. If a bit is set to 1, the channel is not used.\n */\ntypedef uint8_t ble_gap_ch_mask_t[5];\n\n\n/**@brief GAP advertising parameters. */\ntypedef struct\n{\n  ble_gap_adv_properties_t properties;              /**< The properties of the advertising events. */\n  ble_gap_addr_t const    *p_peer_addr;             /**< Address of a known peer.\n                                                         @note ble_gap_addr_t::addr_type cannot be\n                                                               @ref BLE_GAP_ADDR_TYPE_ANONYMOUS.\n                                                         - When privacy is enabled and the local device uses\n                                                           @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE addresses,\n                                                           the device identity list is searched for a matching entry. If\n                                                           the local IRK for that device identity is set, the local IRK\n                                                           for that device will be used to generate the advertiser address\n                                                           field in the advertising packet.\n                                                         - If @ref ble_gap_adv_properties_t::type is directed, this must be\n                                                           set to the targeted scanner or initiator. If the peer address is\n                                                           in the device identity list, the peer IRK for that device will be\n                                                           used to generate @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE\n                                                           target addresses used in the advertising event PDUs. */\n  uint32_t                 interval;                /**< Advertising interval in 625 us units. @sa BLE_GAP_ADV_INTERVALS.\n                                                         @note If @ref ble_gap_adv_properties_t::type is set to\n                                                               @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE\n                                                               advertising, this parameter is ignored. */\n  uint16_t                 duration;                /**< Advertising duration in 10 ms units. When timeout is reached,\n                                                         an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised.\n                                                         @sa BLE_GAP_ADV_TIMEOUT_VALUES.\n                                                         @note The SoftDevice will always complete at least one advertising\n                                                               event even if the duration is set too low. */\n  uint8_t                  max_adv_evts;            /**< Maximum advertising events that shall be sent prior to disabling\n                                                         advertising. Setting the value to 0 disables the limitation. When\n                                                         the count of advertising events specified by this parameter\n                                                         (if not 0) is reached, advertising will be automatically stopped\n                                                         and an event of type @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised\n                                                         @note If @ref ble_gap_adv_properties_t::type is set to\n                                                               @ref BLE_GAP_ADV_TYPE_CONNECTABLE_NONSCANNABLE_DIRECTED_HIGH_DUTY_CYCLE,\n                                                               this parameter is ignored. */\n  ble_gap_ch_mask_t        channel_mask;            /**< Channel mask for primary and secondary advertising channels.\n                                                         At least one of the primary channels, that is channel index 37-39, must be used.\n                                                         Masking away secondary advertising channels is not supported. */\n  uint8_t                  filter_policy;           /**< Filter Policy. @sa BLE_GAP_ADV_FILTER_POLICIES. */\n  uint8_t                  primary_phy;             /**< Indicates the PHY on which the primary advertising channel packets\n                                                         are transmitted. If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS\n                                                         will be used.\n                                                         Valid values are @ref BLE_GAP_PHY_1MBPS and @ref BLE_GAP_PHY_CODED.\n                                                         @note The primary_phy shall indicate @ref BLE_GAP_PHY_1MBPS if\n                                                               @ref ble_gap_adv_properties_t::type is not an extended advertising type. */\n  uint8_t                  secondary_phy;           /**< Indicates the PHY on which the secondary advertising channel packets\n                                                         are transmitted.\n                                                         If set to @ref BLE_GAP_PHY_AUTO, @ref BLE_GAP_PHY_1MBPS will be used.\n                                                         Valid values are\n                                                         @ref BLE_GAP_PHY_1MBPS, @ref BLE_GAP_PHY_2MBPS, and @ref BLE_GAP_PHY_CODED.\n                                                         If @ref ble_gap_adv_properties_t::type is an extended advertising type\n                                                         and connectable, this is the PHY that will be used to establish a\n                                                         connection and send AUX_ADV_IND packets on.\n                                                         @note This parameter will be ignored when\n                                                               @ref ble_gap_adv_properties_t::type is not an extended advertising type. */\n  uint8_t                  set_id:4;                /**< The advertising set identifier distinguishes this advertising set from other\n                                                         advertising sets transmitted by this and other devices.\n                                                         @note This parameter will be ignored when\n                                                               @ref ble_gap_adv_properties_t::type is not an extended advertising type. */\n  uint8_t                  scan_req_notification:1; /**< Enable scan request notifications for this advertising set. When a\n                                                         scan request is received and the scanner address is allowed\n                                                         by the filter policy, @ref BLE_GAP_EVT_SCAN_REQ_REPORT is raised.\n                                                         @note This parameter will be ignored when\n                                                               @ref ble_gap_adv_properties_t::type is a non-scannable\n                                                               advertising type. */\n} ble_gap_adv_params_t;\n\n\n/**@brief GAP advertising data buffers.\n *\n * The application must provide the buffers for advertisement. The memory shall reside in application RAM, and\n * shall never be modified while advertising. The data shall be kept alive until either:\n *  - @ref BLE_GAP_EVT_ADV_SET_TERMINATED is raised.\n *  - @ref BLE_GAP_EVT_CONNECTED is raised with @ref ble_gap_evt_connected_t::adv_handle set to the corresponding\n *    advertising handle.\n *  - Advertising is stopped.\n *  - Advertising data is changed.\n * To update advertising data while advertising, provide new buffers to @ref sd_ble_gap_adv_set_configure. */\ntypedef struct\n{\n  ble_data_t       adv_data;                     /**< Advertising data.\n                                                      @note\n                                                      Advertising data can only be specified for a @ref ble_gap_adv_properties_t::type\n                                                      that is allowed to contain advertising data. */\n  ble_data_t       scan_rsp_data;                /**< Scan response data.\n                                                      @note\n                                                      Scan response data can only be specified for a @ref ble_gap_adv_properties_t::type\n                                                      that is scannable. */\n} ble_gap_adv_data_t;\n\n\n/**@brief GAP scanning parameters. */\ntypedef struct\n{\n  uint8_t               extended               : 1; /**< If 1, the scanner will accept extended advertising packets.\n                                                         If set to 0, the scanner will not receive advertising packets\n                                                         on secondary advertising channels, and will not be able\n                                                         to receive long advertising PDUs. */\n  uint8_t               report_incomplete_evts : 1; /**< If 1, events of type @ref ble_gap_evt_adv_report_t may have\n                                                         @ref ble_gap_adv_report_type_t::status set to\n                                                         @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA.\n                                                         This parameter is ignored when used with @ref sd_ble_gap_connect\n                                                         @note This may be used to abort receiving more packets from an extended\n                                                               advertising event, and is only available for extended\n                                                               scanning, see @ref sd_ble_gap_scan_start.\n                                                         @note This feature is not supported by this SoftDevice. */\n  uint8_t               active                 : 1; /**< If 1, perform active scanning by sending scan requests.\n                                                         This parameter is ignored when used with @ref sd_ble_gap_connect. */\n  uint8_t               filter_policy          : 2; /**< Scanning filter policy. @sa BLE_GAP_SCAN_FILTER_POLICIES.\n                                                         @note Only @ref BLE_GAP_SCAN_FP_ACCEPT_ALL and\n                                                               @ref BLE_GAP_SCAN_FP_WHITELIST are valid when used with\n                                                               @ref sd_ble_gap_connect */\n  uint8_t               scan_phys;                  /**< Bitfield of PHYs to scan on. If set to @ref BLE_GAP_PHY_AUTO,\n                                                         scan_phys will default to @ref BLE_GAP_PHY_1MBPS.\n                                                         - If @ref ble_gap_scan_params_t::extended is set to 0, the only\n                                                           supported PHY is @ref BLE_GAP_PHY_1MBPS.\n                                                         - When used with @ref sd_ble_gap_scan_start,\n                                                           the bitfield indicates the PHYs the scanner will use for scanning\n                                                           on primary advertising channels. The scanner will accept\n                                                           @ref BLE_GAP_PHYS_SUPPORTED as secondary advertising channel PHYs.\n                                                         - When used with @ref sd_ble_gap_connect, the bitfield indicates\n                                                           the PHYs the initiator will use for scanning on primary advertising\n                                                           channels. The initiator will accept connections initiated on either\n                                                           of the @ref BLE_GAP_PHYS_SUPPORTED PHYs.\n                                                           If scan_phys contains @ref BLE_GAP_PHY_1MBPS and/or @ref BLE_GAP_PHY_2MBPS,\n                                                           the primary scan PHY is @ref BLE_GAP_PHY_1MBPS.\n                                                           If scan_phys also contains @ref BLE_GAP_PHY_CODED, the primary scan\n                                                           PHY will also contain @ref BLE_GAP_PHY_CODED. If the only scan PHY is\n                                                           @ref BLE_GAP_PHY_CODED, the primary scan PHY is\n                                                           @ref BLE_GAP_PHY_CODED only. */\n  uint16_t              interval;                   /**< Scan interval in 625 us units. @sa BLE_GAP_SCAN_INTERVALS. */\n  uint16_t              window;                     /**< Scan window in 625 us units. @sa BLE_GAP_SCAN_WINDOW.\n                                                         If scan_phys contains both @ref BLE_GAP_PHY_1MBPS and\n                                                         @ref BLE_GAP_PHY_CODED interval shall be larger than or\n                                                         equal to twice the scan window. */\n  uint16_t              timeout;                    /**< Scan timeout in 10 ms units. @sa BLE_GAP_SCAN_TIMEOUT. */\n  ble_gap_ch_mask_t     channel_mask;               /**< Channel mask for primary and secondary advertising channels.\n                                                         At least one of the primary channels, that is channel index 37-39, must be\n                                                         set to 0.\n                                                         Masking away secondary channels is not supported. */\n} ble_gap_scan_params_t;\n\n\n/**@brief Privacy.\n *\n *        The privacy feature provides a way for the device to avoid being tracked over a period of time.\n *        The privacy feature, when enabled, hides the local device identity and replaces it with a private address\n *        that is automatically refreshed at a specified interval.\n *\n *        If a device still wants to be recognized by other peers, it needs to share it's Identity Resolving Key (IRK).\n *        With this key, a device can generate a random private address that can only be recognized by peers in possession of that key,\n *        and devices can establish connections without revealing their real identities.\n *\n *        Both network privacy (@ref BLE_GAP_PRIVACY_MODE_NETWORK_PRIVACY) and device privacy (@ref BLE_GAP_PRIVACY_MODE_DEVICE_PRIVACY)\n *        are supported.\n *\n * @note  If the device IRK is updated, the new IRK becomes the one to be distributed in all\n *        bonding procedures performed after @ref sd_ble_gap_privacy_set returns.\n *        The IRK distributed during bonding procedure is the device IRK that is active when @ref sd_ble_gap_sec_params_reply is called.\n */\ntypedef struct\n{\n  uint8_t        privacy_mode;         /**< Privacy mode, see @ref BLE_GAP_PRIVACY_MODES. Default is @ref BLE_GAP_PRIVACY_MODE_OFF. */\n  uint8_t        private_addr_type;    /**< The private address type must be either @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE or @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_NON_RESOLVABLE. */\n  uint16_t       private_addr_cycle_s; /**< Private address cycle interval in seconds. Providing an address cycle value of 0 will use the default value defined by @ref BLE_GAP_DEFAULT_PRIVATE_ADDR_CYCLE_INTERVAL_S. */\n  ble_gap_irk_t *p_device_irk;         /**< When used as input, pointer to IRK structure that will be used as the default IRK. If NULL, the device default IRK will be used.\n                                            When used as output, pointer to IRK structure where the current default IRK will be written to. If NULL, this argument is ignored.\n                                            By default, the default IRK is used to generate random private resolvable addresses for the local device unless instructed otherwise. */\n} ble_gap_privacy_params_t;\n\n\n/**@brief PHY preferences for TX and RX\n * @note  tx_phys and rx_phys are bit fields. Multiple bits can be set in them to indicate multiple preferred PHYs for each direction.\n * @code\n * p_gap_phys->tx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS;\n * p_gap_phys->rx_phys = BLE_GAP_PHY_1MBPS | BLE_GAP_PHY_2MBPS;\n * @endcode\n *\n */\ntypedef struct\n{\n  uint8_t tx_phys;     /**< Preferred transmit PHYs, see @ref BLE_GAP_PHYS. */\n  uint8_t rx_phys;     /**< Preferred receive PHYs, see @ref BLE_GAP_PHYS. */\n} ble_gap_phys_t;\n\n/** @brief Keys that can be exchanged during a bonding procedure. */\ntypedef struct\n{\n  uint8_t enc     : 1;                        /**< Long Term Key and Master Identification. */\n  uint8_t id      : 1;                        /**< Identity Resolving Key and Identity Address Information. */\n  uint8_t sign    : 1;                        /**< Connection Signature Resolving Key. */\n  uint8_t link    : 1;                        /**< Derive the Link Key from the LTK. */\n} ble_gap_sec_kdist_t;\n\n\n/**@brief GAP security parameters. */\ntypedef struct\n{\n  uint8_t               bond      : 1;             /**< Perform bonding. */\n  uint8_t               mitm      : 1;             /**< Enable Man In The Middle protection. */\n  uint8_t               lesc      : 1;             /**< Enable LE Secure Connection pairing. */\n  uint8_t               keypress  : 1;             /**< Enable generation of keypress notifications. */\n  uint8_t               io_caps   : 3;             /**< IO capabilities, see @ref BLE_GAP_IO_CAPS. */\n  uint8_t               oob       : 1;             /**< The OOB data flag.\n                                                        - In LE legacy pairing, this flag is set if a device has out of band authentication data.\n                                                          The OOB method is used if both of the devices have out of band authentication data.\n                                                        - In LE Secure Connections pairing, this flag is set if a device has the peer device's out of band authentication data.\n                                                          The OOB method is used if at least one device has the peer device's OOB data available. */\n  uint8_t               min_key_size;              /**< Minimum encryption key size in octets between 7 and 16. If 0 then not applicable in this instance. */\n  uint8_t               max_key_size;              /**< Maximum encryption key size in octets between min_key_size and 16. */\n  ble_gap_sec_kdist_t   kdist_own;                 /**< Key distribution bitmap: keys that the local device will distribute. */\n  ble_gap_sec_kdist_t   kdist_peer;                /**< Key distribution bitmap: keys that the remote device will distribute. */\n} ble_gap_sec_params_t;\n\n\n/**@brief GAP Encryption Information. */\ntypedef struct\n{\n  uint8_t   ltk[BLE_GAP_SEC_KEY_LEN];   /**< Long Term Key. */\n  uint8_t   lesc : 1;                   /**< Key generated using LE Secure Connections. */\n  uint8_t   auth : 1;                   /**< Authenticated Key. */\n  uint8_t   ltk_len : 6;                /**< LTK length in octets. */\n} ble_gap_enc_info_t;\n\n\n/**@brief GAP Master Identification. */\ntypedef struct\n{\n  uint16_t  ediv;                       /**< Encrypted Diversifier. */\n  uint8_t   rand[BLE_GAP_SEC_RAND_LEN]; /**< Random Number. */\n} ble_gap_master_id_t;\n\n\n/**@brief GAP Signing Information. */\ntypedef struct\n{\n  uint8_t   csrk[BLE_GAP_SEC_KEY_LEN];        /**< Connection Signature Resolving Key. */\n} ble_gap_sign_info_t;\n\n\n/**@brief GAP LE Secure Connections P-256 Public Key. */\ntypedef struct\n{\n  uint8_t   pk[BLE_GAP_LESC_P256_PK_LEN];        /**< LE Secure Connections Elliptic Curve Diffie-Hellman P-256 Public Key. Stored in the standard SMP protocol format: {X,Y} both in little-endian. */\n} ble_gap_lesc_p256_pk_t;\n\n\n/**@brief GAP LE Secure Connections DHKey. */\ntypedef struct\n{\n  uint8_t   key[BLE_GAP_LESC_DHKEY_LEN];        /**< LE Secure Connections Elliptic Curve Diffie-Hellman Key. Stored in little-endian. */\n} ble_gap_lesc_dhkey_t;\n\n\n/**@brief GAP LE Secure Connections OOB data. */\ntypedef struct\n{\n  ble_gap_addr_t  addr;                          /**< Bluetooth address of the device. */\n  uint8_t         r[BLE_GAP_SEC_KEY_LEN];        /**< Random Number. */\n  uint8_t         c[BLE_GAP_SEC_KEY_LEN];        /**< Confirm Value. */\n} ble_gap_lesc_oob_data_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_CONNECTED. */\ntypedef struct\n{\n  ble_gap_addr_t        peer_addr;              /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1\n                                                     and the address is the device's identity address. */\n  uint8_t               role;                   /**< BLE role for this connection, see @ref BLE_GAP_ROLES */\n  ble_gap_conn_params_t conn_params;            /**< GAP Connection Parameters. */\n  uint8_t               adv_handle;             /**< Advertising handle in which advertising has ended.\n                                                     This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */\n  ble_gap_adv_data_t    adv_data;               /**< Advertising buffers corresponding to the terminated\n                                                     advertising set. The advertising buffers provided in\n                                                     @ref sd_ble_gap_adv_set_configure are now released.\n                                                     This variable is only set if role is set to @ref BLE_GAP_ROLE_PERIPH. */\n} ble_gap_evt_connected_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_DISCONNECTED. */\ntypedef struct\n{\n  uint8_t reason;                               /**< HCI error code, see @ref BLE_HCI_STATUS_CODES. */\n} ble_gap_evt_disconnected_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE. */\ntypedef struct\n{\n  ble_gap_conn_params_t conn_params;            /**<  GAP Connection Parameters. */\n} ble_gap_evt_conn_param_update_t;\n\n/**@brief Event structure for @ref BLE_GAP_EVT_PHY_UPDATE_REQUEST. */\ntypedef struct\n{\n  ble_gap_phys_t peer_preferred_phys;            /**< The PHYs the peer prefers to use. */\n} ble_gap_evt_phy_update_request_t;\n\n/**@brief Event Structure for @ref BLE_GAP_EVT_PHY_UPDATE. */\ntypedef struct\n{\n  uint8_t status;                               /**< Status of the procedure, see @ref BLE_HCI_STATUS_CODES.*/\n  uint8_t tx_phy;                               /**< TX PHY for this connection, see @ref BLE_GAP_PHYS. */\n  uint8_t rx_phy;                               /**< RX PHY for this connection, see @ref BLE_GAP_PHYS. */\n} ble_gap_evt_phy_update_t;\n\n/**@brief Event structure for @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST. */\ntypedef struct\n{\n  ble_gap_sec_params_t peer_params;             /**< Initiator Security Parameters. */\n} ble_gap_evt_sec_params_request_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_SEC_INFO_REQUEST. */\ntypedef struct\n{\n  ble_gap_addr_t      peer_addr;                     /**< Bluetooth address of the peer device. */\n  ble_gap_master_id_t master_id;                     /**< Master Identification for LTK lookup. */\n  uint8_t             enc_info  : 1;                 /**< If 1, Encryption Information required. */\n  uint8_t             id_info   : 1;                 /**< If 1, Identity Information required. */\n  uint8_t             sign_info : 1;                 /**< If 1, Signing Information required. */\n} ble_gap_evt_sec_info_request_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_PASSKEY_DISPLAY. */\ntypedef struct\n{\n  uint8_t passkey[BLE_GAP_PASSKEY_LEN];         /**< 6-digit passkey in ASCII ('0'-'9' digits only). */\n  uint8_t match_request : 1;                    /**< If 1 requires the application to report the match using @ref sd_ble_gap_auth_key_reply\n                                                     with either @ref BLE_GAP_AUTH_KEY_TYPE_NONE if there is no match or\n                                                     @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY if there is a match. */\n} ble_gap_evt_passkey_display_t;\n\n/**@brief Event structure for @ref BLE_GAP_EVT_KEY_PRESSED. */\ntypedef struct\n{\n  uint8_t kp_not;         /**< Keypress notification type, see @ref BLE_GAP_KP_NOT_TYPES. */\n} ble_gap_evt_key_pressed_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_KEY_REQUEST. */\ntypedef struct\n{\n  uint8_t key_type;                             /**< See @ref BLE_GAP_AUTH_KEY_TYPES. */\n} ble_gap_evt_auth_key_request_t;\n\n/**@brief Event structure for @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST. */\ntypedef struct\n{\n  ble_gap_lesc_p256_pk_t *p_pk_peer;  /**< LE Secure Connections remote P-256 Public Key. This will point to the application-supplied memory\n                                           inside the keyset during the call to @ref sd_ble_gap_sec_params_reply. */\n  uint8_t oobd_req       :1;          /**< LESC OOB data required. A call to @ref sd_ble_gap_lesc_oob_data_set is required to complete the procedure. */\n} ble_gap_evt_lesc_dhkey_request_t;\n\n\n/**@brief Security levels supported.\n * @note  See Bluetooth Specification Version 4.2 Volume 3, Part C, Chapter 10, Section 10.2.1.\n*/\ntypedef struct\n{\n  uint8_t lv1 : 1;                              /**< If 1: Level 1 is supported. */\n  uint8_t lv2 : 1;                              /**< If 1: Level 2 is supported. */\n  uint8_t lv3 : 1;                              /**< If 1: Level 3 is supported. */\n  uint8_t lv4 : 1;                              /**< If 1: Level 4 is supported. */\n} ble_gap_sec_levels_t;\n\n\n/**@brief Encryption Key. */\ntypedef struct\n{\n  ble_gap_enc_info_t    enc_info;             /**< Encryption Information. */\n  ble_gap_master_id_t   master_id;            /**< Master Identification. */\n} ble_gap_enc_key_t;\n\n\n/**@brief Identity Key. */\ntypedef struct\n{\n  ble_gap_irk_t         id_info;              /**< Identity Resolving Key. */\n  ble_gap_addr_t        id_addr_info;         /**< Identity Address. */\n} ble_gap_id_key_t;\n\n\n/**@brief Security Keys. */\ntypedef struct\n{\n  ble_gap_enc_key_t      *p_enc_key;           /**< Encryption Key, or NULL. */\n  ble_gap_id_key_t       *p_id_key;            /**< Identity Key, or NULL. */\n  ble_gap_sign_info_t    *p_sign_key;          /**< Signing Key, or NULL. */\n  ble_gap_lesc_p256_pk_t *p_pk;                /**< LE Secure Connections P-256 Public Key. When in debug mode the application must use the value defined\n                                                    in the Core Bluetooth Specification v4.2 Vol.3, Part H, Section 2.3.5.6.1 */\n} ble_gap_sec_keys_t;\n\n\n/**@brief Security key set for both local and peer keys. */\ntypedef struct\n{\n  ble_gap_sec_keys_t            keys_own;     /**< Keys distributed by the local device. For LE Secure Connections the encryption key will be generated locally and will always be stored if bonding. */\n  ble_gap_sec_keys_t            keys_peer;    /**< Keys distributed by the remote device. For LE Secure Connections, p_enc_key must always be NULL. */\n} ble_gap_sec_keyset_t;\n\n\n/**@brief Data Length Update Procedure parameters. */\ntypedef struct\n{\n  uint16_t max_tx_octets;   /**< Maximum number of payload octets that a Controller supports for transmission of a single Link Layer Data Channel PDU. */\n  uint16_t max_rx_octets;   /**< Maximum number of payload octets that a Controller supports for reception of a single Link Layer Data Channel PDU. */\n  uint16_t max_tx_time_us;  /**< Maximum time, in microseconds, that a Controller supports for transmission of a single Link Layer Data Channel PDU. */\n  uint16_t max_rx_time_us;  /**< Maximum time, in microseconds, that a Controller supports for reception of a single Link Layer Data Channel PDU. */\n} ble_gap_data_length_params_t;\n\n\n/**@brief Data Length Update Procedure local limitation. */\ntypedef struct\n{\n  uint16_t tx_payload_limited_octets; /**< If > 0, the requested TX packet length is too long by this many octets. */\n  uint16_t rx_payload_limited_octets; /**< If > 0, the requested RX packet length is too long by this many octets. */\n  uint16_t tx_rx_time_limited_us;     /**< If > 0, the requested combination of TX and RX packet lengths is too long by this many microseconds. */\n} ble_gap_data_length_limitation_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_AUTH_STATUS. */\ntypedef struct\n{\n  uint8_t               auth_status;            /**< Authentication status, see @ref BLE_GAP_SEC_STATUS. */\n  uint8_t               error_src : 2;          /**< On error, source that caused the failure, see @ref BLE_GAP_SEC_STATUS_SOURCES. */\n  uint8_t               bonded : 1;             /**< Procedure resulted in a bond. */\n  uint8_t               lesc : 1;               /**< Procedure resulted in a LE Secure Connection. */\n  ble_gap_sec_levels_t  sm1_levels;             /**< Levels supported in Security Mode 1. */\n  ble_gap_sec_levels_t  sm2_levels;             /**< Levels supported in Security Mode 2. */\n  ble_gap_sec_kdist_t   kdist_own;              /**< Bitmap stating which keys were exchanged (distributed) by the local device. If bonding with LE Secure Connections, the enc bit will be always set. */\n  ble_gap_sec_kdist_t   kdist_peer;             /**< Bitmap stating which keys were exchanged (distributed) by the remote device. If bonding with LE Secure Connections, the enc bit will never be set. */\n} ble_gap_evt_auth_status_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_CONN_SEC_UPDATE. */\ntypedef struct\n{\n  ble_gap_conn_sec_t conn_sec;                  /**< Connection security level. */\n} ble_gap_evt_conn_sec_update_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_TIMEOUT. */\ntypedef struct\n{\n  uint8_t src;                                  /**< Source of timeout event, see @ref BLE_GAP_TIMEOUT_SOURCES. */\n  union\n  {\n    ble_data_t adv_report_buffer;               /**< If source is set to @ref BLE_GAP_TIMEOUT_SRC_SCAN, the released\n                                                     scan buffer is contained in this field. */\n  } params;                                     /**< Event Parameters. */\n} ble_gap_evt_timeout_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_RSSI_CHANGED. */\ntypedef struct\n{\n  int8_t  rssi;                                 /**< Received Signal Strength Indication in dBm.\n                                                     @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */\n  uint8_t ch_index;                             /**< Data Channel Index on which the Signal Strength is measured (0-36). */\n} ble_gap_evt_rssi_changed_t;\n\n/**@brief Event structure for @ref BLE_GAP_EVT_ADV_SET_TERMINATED */\ntypedef struct\n{\n  uint8_t             reason;                         /**< Reason for why the advertising set terminated. See\n                                                           @ref BLE_GAP_EVT_ADV_SET_TERMINATED_REASON. */\n  uint8_t             adv_handle;                     /**< Advertising handle in which advertising has ended. */\n  uint8_t             num_completed_adv_events;       /**< If @ref ble_gap_adv_params_t::max_adv_evts was not set to 0,\n                                                           this field indicates the number of completed advertising events. */\n  ble_gap_adv_data_t  adv_data;                       /**< Advertising buffers corresponding to the terminated\n                                                           advertising set. The advertising buffers provided in\n                                                           @ref sd_ble_gap_adv_set_configure are now released. */\n} ble_gap_evt_adv_set_terminated_t;\n\n/**@brief Event structure for @ref BLE_GAP_EVT_ADV_REPORT.\n *\n * @note If @ref ble_gap_adv_report_type_t::status is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA,\n *       not all fields in the advertising report may be available.\n *\n * @note When ble_gap_adv_report_type_t::status is not set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA,\n *       scanning will be paused. To continue scanning, call @ref sd_ble_gap_scan_start.\n */\ntypedef struct\n{\n  ble_gap_adv_report_type_t type;                  /**< Advertising report type. See @ref ble_gap_adv_report_type_t. */\n  ble_gap_addr_t            peer_addr;             /**< Bluetooth address of the peer device. If the peer_addr is resolved:\n                                                        @ref ble_gap_addr_t::addr_id_peer is set to 1 and the address is the\n                                                        peer's identity address. */\n  ble_gap_addr_t            direct_addr;           /**< Contains the target address of the advertising event if\n                                                        @ref ble_gap_adv_report_type_t::directed is set to 1. If the\n                                                        SoftDevice was able to resolve the address,\n                                                        @ref ble_gap_addr_t::addr_id_peer is set to 1 and the direct_addr\n                                                        contains the local identity address. If the target address of the\n                                                        advertising event is @ref BLE_GAP_ADDR_TYPE_RANDOM_PRIVATE_RESOLVABLE,\n                                                        and the SoftDevice was unable to resolve it, the application may try\n                                                        to resolve this address to find out if the advertising event was\n                                                        directed to us. */\n  uint8_t                   primary_phy;           /**< Indicates the PHY on which the primary advertising packet was received.\n                                                        See @ref BLE_GAP_PHYS. */\n  uint8_t                   secondary_phy;         /**< Indicates the PHY on which the secondary advertising packet was received.\n                                                        See @ref BLE_GAP_PHYS. This field is set to @ref BLE_GAP_PHY_NOT_SET if no packets\n                                                        were received on a secondary advertising channel. */\n  int8_t                    tx_power;              /**< TX Power reported by the advertiser in the last packet header received.\n                                                        This field is set to @ref BLE_GAP_POWER_LEVEL_INVALID if the\n                                                        last received packet did not contain the Tx Power field.\n                                                        @note TX Power is only included in extended advertising packets. */\n  int8_t                    rssi;                  /**< Received Signal Strength Indication in dBm of the last packet received.\n                                                        @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */\n  uint8_t                   ch_index;              /**< Channel Index on which the last advertising packet is received (0-39). */\n  uint8_t                   set_id;                /**< Set ID of the received advertising data. Set ID is not present\n                                                        if set to @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */\n  uint16_t                  data_id:12;            /**< The advertising data ID of the received advertising data. Data ID\n                                                        is not present if @ref ble_gap_evt_adv_report_t::set_id is set to\n                                                        @ref BLE_GAP_ADV_REPORT_SET_ID_NOT_AVAILABLE. */\n  ble_data_t                data;                  /**< Received advertising or scan response data. If\n                                                        @ref ble_gap_adv_report_type_t::status is not set to\n                                                        @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the data buffer provided\n                                                        in @ref sd_ble_gap_scan_start is now released. */\n  ble_gap_aux_pointer_t     aux_pointer;           /**< The offset and PHY of the next advertising packet in this extended advertising\n                                                        event. @note This field is only set if @ref ble_gap_adv_report_type_t::status\n                                                        is set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. */\n} ble_gap_evt_adv_report_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_SEC_REQUEST. */\ntypedef struct\n{\n  uint8_t    bond       : 1;                       /**< Perform bonding. */\n  uint8_t    mitm       : 1;                       /**< Man In The Middle protection requested. */\n  uint8_t    lesc       : 1;                       /**< LE Secure Connections requested. */\n  uint8_t    keypress   : 1;                       /**< Generation of keypress notifications requested. */\n} ble_gap_evt_sec_request_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST. */\ntypedef struct\n{\n  ble_gap_conn_params_t conn_params;            /**<  GAP Connection Parameters. */\n} ble_gap_evt_conn_param_update_request_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_SCAN_REQ_REPORT. */\ntypedef struct\n{\n  uint8_t                 adv_handle;        /**< Advertising handle for the advertising set which received the Scan Request */\n  int8_t                  rssi;              /**< Received Signal Strength Indication in dBm.\n                                                  @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement. */\n  ble_gap_addr_t          peer_addr;         /**< Bluetooth address of the peer device. If the peer_addr resolved: @ref ble_gap_addr_t::addr_id_peer is set to 1\n                                                  and the address is the device's identity address. */\n} ble_gap_evt_scan_req_report_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST. */\ntypedef struct\n{\n  ble_gap_data_length_params_t peer_params; /**< Peer data length parameters. */\n} ble_gap_evt_data_length_update_request_t;\n\n/**@brief Event structure for @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE. */\ntypedef struct\n{\n  ble_gap_data_length_params_t effective_params;  /**< The effective data length parameters. */\n} ble_gap_evt_data_length_update_t;\n\n\n/**@brief Event structure for @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT. */\ntypedef struct\n{\n  int8_t channel_energy[BLE_GAP_CHANNEL_COUNT]; /**< The measured energy on the Bluetooth Low Energy\n                                                     channels, in dBm, indexed by Channel Index.\n                                                     If no measurement is available for the given channel, channel_energy is set to\n                                                     @ref BLE_GAP_POWER_LEVEL_INVALID. */\n} ble_gap_evt_qos_channel_survey_report_t;\n\n/**@brief GAP event structure. */\ntypedef struct\n{\n  uint16_t conn_handle;                                     /**< Connection Handle on which event occurred. */\n  union                                                     /**< union alternative identified by evt_id in enclosing struct. */\n  {\n    ble_gap_evt_connected_t                   connected;                    /**< Connected Event Parameters. */\n    ble_gap_evt_disconnected_t                disconnected;                 /**< Disconnected Event Parameters. */\n    ble_gap_evt_conn_param_update_t           conn_param_update;            /**< Connection Parameter Update Parameters. */\n    ble_gap_evt_sec_params_request_t          sec_params_request;           /**< Security Parameters Request Event Parameters. */\n    ble_gap_evt_sec_info_request_t            sec_info_request;             /**< Security Information Request Event Parameters. */\n    ble_gap_evt_passkey_display_t             passkey_display;              /**< Passkey Display Event Parameters. */\n    ble_gap_evt_key_pressed_t                 key_pressed;                  /**< Key Pressed Event Parameters. */\n    ble_gap_evt_auth_key_request_t            auth_key_request;             /**< Authentication Key Request Event Parameters. */\n    ble_gap_evt_lesc_dhkey_request_t          lesc_dhkey_request;           /**< LE Secure Connections DHKey calculation request. */\n    ble_gap_evt_auth_status_t                 auth_status;                  /**< Authentication Status Event Parameters. */\n    ble_gap_evt_conn_sec_update_t             conn_sec_update;              /**< Connection Security Update Event Parameters. */\n    ble_gap_evt_timeout_t                     timeout;                      /**< Timeout Event Parameters. */\n    ble_gap_evt_rssi_changed_t                rssi_changed;                 /**< RSSI Event Parameters. */\n    ble_gap_evt_adv_report_t                  adv_report;                   /**< Advertising Report Event Parameters. */\n    ble_gap_evt_adv_set_terminated_t          adv_set_terminated;           /**< Advertising Set Terminated Event Parameters. */\n    ble_gap_evt_sec_request_t                 sec_request;                  /**< Security Request Event Parameters. */\n    ble_gap_evt_conn_param_update_request_t   conn_param_update_request;    /**< Connection Parameter Update Parameters. */\n    ble_gap_evt_scan_req_report_t             scan_req_report;              /**< Scan Request Report Parameters. */\n    ble_gap_evt_phy_update_request_t          phy_update_request;           /**< PHY Update Request Event Parameters. */\n    ble_gap_evt_phy_update_t                  phy_update;                   /**< PHY Update Parameters. */\n    ble_gap_evt_data_length_update_request_t  data_length_update_request;   /**< Data Length Update Request Event Parameters. */\n    ble_gap_evt_data_length_update_t          data_length_update;           /**< Data Length Update Event Parameters. */\n    ble_gap_evt_qos_channel_survey_report_t   qos_channel_survey_report;    /**< Quality of Service (QoS) Channel Survey Report Parameters. */\n  } params;                                                                 /**< Event Parameters. */\n} ble_gap_evt_t;\n\n\n/**\n * @brief BLE GAP connection configuration parameters, set with @ref sd_ble_cfg_set.\n *\n * @retval ::NRF_ERROR_CONN_COUNT     The connection count for the connection configurations is zero.\n * @retval ::NRF_ERROR_INVALID_PARAM  One or more of the following is true:\n *                                    - The sum of conn_count for all connection configurations combined exceeds UINT8_MAX.\n *                                    - The event length is smaller than @ref BLE_GAP_EVENT_LENGTH_MIN.\n */\ntypedef struct\n{\n  uint8_t  conn_count;     /**< The number of concurrent connections the application can create with this configuration.\n                                The default and minimum value is @ref BLE_GAP_CONN_COUNT_DEFAULT. */\n  uint16_t event_length;   /**< The time set aside for this connection on every connection interval in 1.25 ms units.\n                                The default value is @ref BLE_GAP_EVENT_LENGTH_DEFAULT, the minimum value is @ref BLE_GAP_EVENT_LENGTH_MIN.\n                                The event length and the connection interval are the primary parameters\n                                for setting the throughput of a connection.\n                                See the SoftDevice Specification for details on throughput. */\n} ble_gap_conn_cfg_t;\n\n\n/**\n * @brief Configuration of maximum concurrent connections in the different connected roles, set with\n * @ref sd_ble_cfg_set.\n *\n * @retval ::NRF_ERROR_CONN_COUNT     The sum of periph_role_count and central_role_count is too\n *                                    large. The maximum supported sum of concurrent connections is\n *                                    @ref BLE_GAP_ROLE_COUNT_COMBINED_MAX.\n * @retval ::NRF_ERROR_INVALID_PARAM  central_sec_count is larger than central_role_count.\n * @retval ::NRF_ERROR_RESOURCES      The adv_set_count is too large. The maximum\n *                                    supported advertising handles is\n *                                    @ref BLE_GAP_ADV_SET_COUNT_MAX.\n */\ntypedef struct\n{\n  uint8_t adv_set_count;      /**< Maximum number of advertising sets. Default value is @ref BLE_GAP_ADV_SET_COUNT_DEFAULT. */\n  uint8_t periph_role_count;  /**< Maximum number of connections concurrently acting as a peripheral. Default value is @ref BLE_GAP_ROLE_COUNT_PERIPH_DEFAULT. */\n  uint8_t central_role_count; /**< Maximum number of connections concurrently acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_DEFAULT. */\n  uint8_t central_sec_count;  /**< Number of SMP instances shared between all connections acting as a central. Default value is @ref BLE_GAP_ROLE_COUNT_CENTRAL_SEC_DEFAULT. */\n  uint8_t qos_channel_survey_role_available:1; /**< If set, the Quality of Service (QoS) channel survey module is available to the\n                                                    application using @ref sd_ble_gap_qos_channel_survey_start. */\n} ble_gap_cfg_role_count_t;\n\n\n/**\n * @brief Device name and its properties, set with @ref sd_ble_cfg_set.\n *\n * @note  If the device name is not configured, the default device name will be\n *        @ref BLE_GAP_DEVNAME_DEFAULT, the maximum device name length will be\n *        @ref BLE_GAP_DEVNAME_DEFAULT_LEN, vloc will be set to @ref BLE_GATTS_VLOC_STACK and the device name\n *        will have no write access.\n *\n * @note  If @ref max_len is more than @ref BLE_GAP_DEVNAME_DEFAULT_LEN and vloc is set to @ref BLE_GATTS_VLOC_STACK,\n *        the attribute table size must be increased to have room for the longer device name (see\n *        @ref sd_ble_cfg_set and @ref ble_gatts_cfg_attr_tab_size_t).\n *\n * @note  If vloc is @ref BLE_GATTS_VLOC_STACK :\n *        - p_value must point to non-volatile memory (flash) or be NULL.\n *        - If p_value is NULL, the device name will initially be empty.\n *\n * @note  If vloc is @ref BLE_GATTS_VLOC_USER :\n *        - p_value cannot be NULL.\n *        - If the device name is writable, p_value must point to volatile memory (RAM).\n *\n * @retval ::NRF_ERROR_INVALID_PARAM  One or more of the following is true:\n *                                    - Invalid device name location (vloc).\n *                                    - Invalid device name security mode.\n * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true:\n *                                    - The device name length is invalid (must be between 0 and @ref BLE_GAP_DEVNAME_MAX_LEN).\n *                                    - The device name length is too long for the given Attribute Table.\n * @retval ::NRF_ERROR_NOT_SUPPORTED  Device name security mode is not supported.\n */\ntypedef struct\n{\n  ble_gap_conn_sec_mode_t  write_perm;   /**< Write permissions. */\n  uint8_t                  vloc:2;       /**< Value location, see @ref BLE_GATTS_VLOCS.*/\n  uint8_t                 *p_value;      /**< Pointer to where the value (device name) is stored or will be stored. */\n  uint16_t                 current_len;  /**< Current length in bytes of the memory pointed to by p_value.*/\n  uint16_t                 max_len;      /**< Maximum length in bytes of the memory pointed to by p_value.*/\n} ble_gap_cfg_device_name_t;\n\n\n/**@brief Configuration structure for GAP configurations. */\ntypedef union\n{\n  ble_gap_cfg_role_count_t  role_count_cfg;  /**< Role count configuration, cfg_id is @ref BLE_GAP_CFG_ROLE_COUNT. */\n  ble_gap_cfg_device_name_t device_name_cfg; /**< Device name configuration, cfg_id is @ref BLE_GAP_CFG_DEVICE_NAME. */\n} ble_gap_cfg_t;\n\n\n/**@brief Channel Map option.\n *\n * @details Used with @ref sd_ble_opt_get to get the current channel map\n *          or @ref sd_ble_opt_set to set a new channel map. When setting the\n *          channel map, it applies to all current and future connections. When getting the\n *          current channel map, it applies to a single connection and the connection handle\n *          must be supplied.\n *\n * @note Setting the channel map may take some time, depending on connection parameters.\n *       The time taken may be different for each connection and the get operation will\n *       return the previous channel map until the new one has taken effect.\n *\n * @note After setting the channel map, by spec it can not be set again until at least 1 s has passed.\n *       See Bluetooth Specification Version 4.1 Volume 2, Part E, Section 7.3.46.\n *\n * @retval ::NRF_SUCCESS Get or set successful.\n * @retval ::NRF_ERROR_INVALID_PARAM One or more of the following is true:\n *                                   - Less then two bits in @ref ch_map are set.\n *                                   - Bits for primary advertising channels (37-39) are set.\n * @retval ::NRF_ERROR_BUSY Channel map was set again before enough time had passed.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied for get.\n *\n */\ntypedef struct\n{\n  uint16_t conn_handle;                   /**< Connection Handle (only applicable for get) */\n  uint8_t ch_map[5];                      /**< Channel Map (37-bit). */\n} ble_gap_opt_ch_map_t;\n\n\n/**@brief Local connection latency option.\n *\n * @details Local connection latency is a feature which enables the slave to improve\n *          current consumption by ignoring the slave latency set by the peer. The\n *          local connection latency can only be set to a multiple of the slave latency,\n *          and cannot be longer than half of the supervision timeout.\n *\n * @details Used with @ref sd_ble_opt_set to set the local connection latency. The\n *          @ref sd_ble_opt_get is not supported for this option, but the actual\n *          local connection latency (unless set to NULL) is set as a return parameter\n *          when setting the option.\n *\n * @note The latency set will be truncated down to the closest slave latency event\n *       multiple, or the nearest multiple before half of the supervision timeout.\n *\n * @note The local connection latency is disabled by default, and needs to be enabled for new\n *       connections and whenever the connection is updated.\n *\n * @retval ::NRF_SUCCESS Set successfully.\n * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter.\n */\ntypedef struct\n{\n  uint16_t   conn_handle;                       /**< Connection Handle */\n  uint16_t   requested_latency;                 /**< Requested local connection latency. */\n  uint16_t * p_actual_latency;                  /**< Pointer to storage for the actual local connection latency (can be set to NULL to skip return value). */\n} ble_gap_opt_local_conn_latency_t;\n\n/**@brief Disable slave latency\n *\n * @details Used with @ref sd_ble_opt_set to temporarily disable slave latency of a peripheral connection\n *          (see @ref ble_gap_conn_params_t::slave_latency). And to re-enable it again. When disabled, the\n *          peripheral will ignore the slave_latency set by the central.\n *\n * @note  Shall only be called on peripheral links.\n *\n * @retval ::NRF_SUCCESS Set successfully.\n * @retval ::NRF_ERROR_NOT_SUPPORTED Get is not supported.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter.\n */\ntypedef struct\n{\n  uint16_t   conn_handle;    /**< Connection Handle */\n  uint8_t    disable : 1;    /**< Set to 1 to disable slave latency. Set to 0 enable it again.*/\n} ble_gap_opt_slave_latency_disable_t;\n\n/**@brief Passkey Option.\n *\n * @details Structure containing the passkey to be used during pairing. This can be used with @ref\n *          sd_ble_opt_set to make the SoftDevice use a preprogrammed passkey for authentication\n *          instead of generating a random one.\n *\n * @note Repeated pairing attempts using the same preprogrammed passkey makes pairing vulnerable to MITM attacks.\n *\n * @note @ref sd_ble_opt_get is not supported for this option.\n *\n */\ntypedef struct\n{\n  uint8_t const * p_passkey;                    /**< Pointer to 6-digit ASCII string (digit 0..9 only, no NULL termination) passkey to be used during pairing. If this is NULL, the SoftDevice will generate a random passkey if required.*/\n} ble_gap_opt_passkey_t;\n\n\n/**@brief Compatibility mode 1 option.\n *\n * @details This can be used with @ref sd_ble_opt_set to enable and disable\n *          compatibility mode 1. Compatibility mode 1 is disabled by default.\n *\n * @note Compatibility mode 1 enables interoperability with devices that do not support a value of\n *       0 for the WinOffset parameter in the Link Layer CONNECT_IND packet. This applies to a\n *       limited set of legacy peripheral devices from another vendor. Enabling this compatibility\n *       mode will only have an effect if the local device will act as a central device and\n *       initiate a connection to a peripheral device. In that case it may lead to the connection\n *       creation taking up to one connection interval longer to complete for all connections.\n *\n *  @retval ::NRF_SUCCESS Set successfully.\n *  @retval ::NRF_ERROR_INVALID_STATE When connection creation is ongoing while mode 1 is set.\n */\ntypedef struct\n{\n   uint8_t enable : 1;                           /**< Enable compatibility mode 1.*/\n} ble_gap_opt_compat_mode_1_t;\n\n\n/**@brief Authenticated payload timeout option.\n *\n * @details This can be used with @ref sd_ble_opt_set to change the Authenticated payload timeout to a value other\n *          than the default of @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT_MAX.\n *\n * @note The authenticated payload timeout event ::BLE_GAP_TIMEOUT_SRC_AUTH_PAYLOAD will be generated\n *       if auth_payload_timeout time has elapsed without receiving a packet with a valid MIC on an encrypted\n *       link.\n *\n * @note The LE ping procedure will be initiated before the timer expires to give the peer a chance\n *       to reset the timer. In addition the stack will try to prioritize running of LE ping over other\n *       activities to increase chances of finishing LE ping before timer expires. To avoid side-effects\n *       on other activities, it is recommended to use high timeout values.\n *       Recommended timeout > 2*(connInterval * (6 + connSlaveLatency)).\n *\n * @retval ::NRF_SUCCESS Set successfully.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. auth_payload_timeout was outside of allowed range.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter.\n */\ntypedef struct\n{\n  uint16_t   conn_handle;                       /**< Connection Handle */\n  uint16_t   auth_payload_timeout;              /**< Requested timeout in 10 ms unit, see @ref BLE_GAP_AUTH_PAYLOAD_TIMEOUT. */\n} ble_gap_opt_auth_payload_timeout_t;\n\n/**@brief Option structure for GAP options. */\ntypedef union\n{\n  ble_gap_opt_ch_map_t                  ch_map;                    /**< Parameters for the Channel Map option. */\n  ble_gap_opt_local_conn_latency_t      local_conn_latency;        /**< Parameters for the Local connection latency option */\n  ble_gap_opt_passkey_t                 passkey;                   /**< Parameters for the Passkey option.*/\n  ble_gap_opt_compat_mode_1_t           compat_mode_1;             /**< Parameters for the compatibility mode 1 option.*/\n  ble_gap_opt_auth_payload_timeout_t    auth_payload_timeout;      /**< Parameters for the authenticated payload timeout option.*/\n  ble_gap_opt_slave_latency_disable_t   slave_latency_disable;     /**< Parameters for the Disable slave latency option */\n} ble_gap_opt_t;\n/**@} */\n\n\n/**@addtogroup BLE_GAP_FUNCTIONS Functions\n * @{ */\n\n/**@brief Set the local Bluetooth identity address.\n *\n *        The local Bluetooth identity address is the address that identifies this device to other peers.\n *        The address type must be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC.\n *\n * @note  The identity address cannot be changed while advertising, scanning or creating a connection.\n *\n * @note  This address will be distributed to the peer during bonding.\n *        If the address changes, the address stored in the peer device will not be valid and the ability to\n *        reconnect using the old address will be lost.\n *\n * @note  By default the SoftDevice will set an address of type @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC upon being\n *        enabled. The address is a random number populated during the IC manufacturing process and remains unchanged\n *        for the lifetime of each IC.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_ADV_MSC}\n * @endmscs\n *\n * @param[in] p_addr Pointer to address structure.\n *\n * @retval ::NRF_SUCCESS Address successfully set.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address.\n * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry.\n * @retval ::NRF_ERROR_INVALID_STATE The identity address cannot be changed while advertising,\n *                                   scanning or creating a connection.\n */\nSVCALL(SD_BLE_GAP_ADDR_SET, uint32_t, sd_ble_gap_addr_set(ble_gap_addr_t const *p_addr));\n\n\n/**@brief Get local Bluetooth identity address.\n *\n * @note  This will always return the identity address irrespective of the privacy settings,\n *        i.e. the address type will always be either @ref BLE_GAP_ADDR_TYPE_PUBLIC or @ref BLE_GAP_ADDR_TYPE_RANDOM_STATIC.\n *\n * @param[out] p_addr Pointer to address structure to be filled in.\n *\n * @retval ::NRF_SUCCESS Address successfully retrieved.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid or NULL pointer supplied.\n */\nSVCALL(SD_BLE_GAP_ADDR_GET, uint32_t, sd_ble_gap_addr_get(ble_gap_addr_t *p_addr));\n\n\n/**@brief Get the Bluetooth device address used by the advertiser.\n *\n * @note  This function will return the local Bluetooth address used in advertising PDUs. When\n *        using privacy, the SoftDevice will generate a new private address every\n *        @ref ble_gap_privacy_params_t::private_addr_cycle_s configured using\n *        @ref sd_ble_gap_privacy_set. Hence depending on when the application calls this API, the\n *        address returned may not be the latest address that is used in the advertising PDUs.\n *\n * @param[in]  adv_handle The advertising handle to get the address from.\n * @param[out] p_addr     Pointer to address structure to be filled in.\n *\n * @retval ::NRF_SUCCESS                  Address successfully retrieved.\n * @retval ::NRF_ERROR_INVALID_ADDR       Invalid or NULL pointer supplied.\n * @retval ::BLE_ERROR_INVALID_ADV_HANDLE The provided advertising handle was not found.\n * @retval ::NRF_ERROR_INVALID_STATE      The advertising set is currently not advertising.\n */\nSVCALL(SD_BLE_GAP_ADV_ADDR_GET, uint32_t, sd_ble_gap_adv_addr_get(uint8_t adv_handle, ble_gap_addr_t *p_addr));\n\n\n/**@brief Set the active whitelist in the SoftDevice.\n *\n * @note  Only one whitelist can be used at a time and the whitelist is shared between the BLE roles.\n *        The whitelist cannot be set if a BLE role is using the whitelist.\n *\n * @note  If an address is resolved using the information in the device identity list, then the whitelist\n *        filter policy applies to the peer identity address and not the resolvable address sent on air.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_WL_SHARE_MSC}\n * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC}\n * @endmscs\n *\n * @param[in] pp_wl_addrs Pointer to a whitelist of peer addresses, if NULL the whitelist will be cleared.\n * @param[in] len         Length of the whitelist, maximum @ref BLE_GAP_WHITELIST_ADDR_MAX_COUNT.\n *\n * @retval ::NRF_SUCCESS The whitelist is successfully set/cleared.\n * @retval ::NRF_ERROR_INVALID_ADDR The whitelist (or one of its entries) provided is invalid.\n * @retval ::BLE_ERROR_GAP_WHITELIST_IN_USE The whitelist is in use by a BLE role and cannot be set or cleared.\n * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied.\n * @retval ::NRF_ERROR_DATA_SIZE The given whitelist size is invalid (zero or too large); this can only return when\n *                               pp_wl_addrs is not NULL.\n */\nSVCALL(SD_BLE_GAP_WHITELIST_SET, uint32_t, sd_ble_gap_whitelist_set(ble_gap_addr_t const * const * pp_wl_addrs, uint8_t len));\n\n\n/**@brief Set device identity list.\n *\n * @note  Only one device identity list can be used at a time and the list is shared between the BLE roles.\n *        The device identity list cannot be set if a BLE role is using the list.\n *\n * @param[in] pp_id_keys     Pointer to an array of peer identity addresses and peer IRKs, if NULL the device identity list will be cleared.\n * @param[in] pp_local_irks  Pointer to an array of local IRKs. Each entry in the array maps to the entry in pp_id_keys at the same index.\n *                           To fill in the list with the currently set device IRK for all peers, set to NULL.\n * @param[in] len            Length of the device identity list, maximum @ref BLE_GAP_DEVICE_IDENTITIES_MAX_COUNT.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC}\n * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC}\n * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_PRIVATE_SCAN_MSC}\n * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS The device identity list successfully set/cleared.\n * @retval ::NRF_ERROR_INVALID_ADDR The device identity list (or one of its entries) provided is invalid.\n *                                  This code may be returned if the local IRK list also has an invalid entry.\n * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_IN_USE The device identity list is in use and cannot be set or cleared.\n * @retval ::BLE_ERROR_GAP_DEVICE_IDENTITIES_DUPLICATE The device identity list contains multiple entries with the same identity address.\n * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied.\n * @retval ::NRF_ERROR_DATA_SIZE The given device identity list size invalid (zero or too large); this can\n *                               only return when pp_id_keys is not NULL.\n */\nSVCALL(SD_BLE_GAP_DEVICE_IDENTITIES_SET, uint32_t, sd_ble_gap_device_identities_set(ble_gap_id_key_t const * const * pp_id_keys, ble_gap_irk_t const * const * pp_local_irks, uint8_t len));\n\n\n/**@brief Set privacy settings.\n *\n * @note  Privacy settings cannot be changed while advertising, scanning or creating a connection.\n *\n * @param[in] p_privacy_params Privacy settings.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PRIVACY_ADV_MSC}\n * @mmsc{@ref BLE_GAP_PRIVACY_SCAN_MSC}\n * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS Set successfully.\n * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry.\n * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid address type is supplied.\n * @retval ::NRF_ERROR_INVALID_ADDR The pointer to privacy settings is NULL or invalid.\n *                                  Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer.\n * @retval ::NRF_ERROR_INVALID_PARAM Out of range parameters are provided.\n * @retval ::NRF_ERROR_INVALID_STATE Privacy settings cannot be changed while advertising, scanning\n *                                   or creating a connection.\n */\nSVCALL(SD_BLE_GAP_PRIVACY_SET, uint32_t, sd_ble_gap_privacy_set(ble_gap_privacy_params_t const *p_privacy_params));\n\n\n/**@brief Get privacy settings.\n *\n * @note ::ble_gap_privacy_params_t::p_device_irk must be initialized to NULL or a valid address before this function is called.\n *       If it is initialized to a valid address, the address pointed to will contain the current device IRK on return.\n *\n * @param[in,out] p_privacy_params Privacy settings.\n *\n * @retval ::NRF_SUCCESS            Privacy settings read.\n * @retval ::NRF_ERROR_INVALID_ADDR The pointer given for returning the privacy settings may be NULL or invalid.\n *                                  Otherwise, the p_device_irk pointer in privacy parameter is an invalid pointer.\n */\nSVCALL(SD_BLE_GAP_PRIVACY_GET, uint32_t, sd_ble_gap_privacy_get(ble_gap_privacy_params_t *p_privacy_params));\n\n\n/**@brief Configure an advertising set. Set, clear or update advertising and scan response data.\n *\n * @note  The format of the advertising data will be checked by this call to ensure interoperability.\n *        Limitations imposed by this API call to the data provided include having a flags data type in the scan response data and\n *        duplicating the local name in the advertising data and scan response data.\n *\n * @note In order to update advertising data while advertising, new advertising buffers must be provided.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_ADV_MSC}\n * @mmsc{@ref BLE_GAP_WL_SHARE_MSC}\n * @endmscs\n *\n * @param[in,out] p_adv_handle                         Provide a pointer to a handle containing @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to configure\n *                                                     a new advertising set. On success, a new handle is then returned through the pointer.\n *                                                     Provide a pointer to an existing advertising handle to configure an existing advertising set.\n * @param[in]     p_adv_data                           Advertising data. If set to NULL, no advertising data will be used. See @ref ble_gap_adv_data_t.\n * @param[in]     p_adv_params                         Advertising parameters. When this function is used to update advertising data while advertising,\n *                                                     this parameter must be NULL. See @ref ble_gap_adv_params_t.\n *\n * @retval ::NRF_SUCCESS                               Advertising set successfully configured.\n * @retval ::NRF_ERROR_INVALID_PARAM                   Invalid parameter(s) supplied:\n *                                                      - Invalid advertising data configuration specified. See @ref ble_gap_adv_data_t.\n *                                                      - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t.\n *                                                      - Use of whitelist requested but whitelist has not been set,\n *                                                        see @ref sd_ble_gap_whitelist_set.\n * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR            ble_gap_adv_params_t::p_peer_addr is invalid.\n * @retval ::NRF_ERROR_INVALID_STATE                   Invalid state to perform operation. Either:\n *                                                     - It is invalid to provide non-NULL advertising set parameters while advertising.\n *                                                     - It is invalid to provide the same data buffers while advertising. To update\n *                                                       advertising data, provide new advertising buffers.\n * @retval ::BLE_ERROR_GAP_DISCOVERABLE_WITH_WHITELIST Discoverable mode and whitelist incompatible.\n * @retval ::BLE_ERROR_INVALID_ADV_HANDLE              The provided advertising handle was not found. Use @ref BLE_GAP_ADV_SET_HANDLE_NOT_SET to\n *                                                     configure a new advertising handle.\n * @retval ::NRF_ERROR_INVALID_ADDR                    Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_FLAGS                   Invalid combination of advertising flags supplied.\n * @retval ::NRF_ERROR_INVALID_DATA                    Invalid data type(s) supplied. Check the advertising data format specification\n *                                                     given in Bluetooth Specification Version 5.0, Volume 3, Part C, Chapter 11.\n * @retval ::NRF_ERROR_INVALID_LENGTH                  Invalid data length(s) supplied.\n * @retval ::NRF_ERROR_NOT_SUPPORTED                   Unsupported data length or advertising parameter configuration.\n * @retval ::NRF_ERROR_NO_MEM                          Not enough memory to configure a new advertising handle. Update an\n *                                                     existing advertising handle instead.\n * @retval ::BLE_ERROR_GAP_UUID_LIST_MISMATCH Invalid UUID list supplied.\n */\nSVCALL(SD_BLE_GAP_ADV_SET_CONFIGURE, uint32_t, sd_ble_gap_adv_set_configure(uint8_t *p_adv_handle, ble_gap_adv_data_t const *p_adv_data, ble_gap_adv_params_t const *p_adv_params));\n\n\n/**@brief Start advertising (GAP Discoverable, Connectable modes, Broadcast Procedure).\n *\n * @note Only one advertiser may be active at any time.\n *\n * @events\n * @event{@ref BLE_GAP_EVT_CONNECTED, Generated after connection has been established through connectable advertising.}\n * @event{@ref BLE_GAP_EVT_ADV_SET_TERMINATED, Advertising set has terminated.}\n * @event{@ref BLE_GAP_EVT_SCAN_REQ_REPORT, A scan request was received.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_ADV_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_CONN_PRIV_MSC}\n * @mmsc{@ref BLE_GAP_PRIVACY_ADV_DIR_PRIV_MSC}\n * @mmsc{@ref BLE_GAP_WL_SHARE_MSC}\n * @endmscs\n *\n * @param[in] adv_handle   Advertising handle to advertise on, received from @ref sd_ble_gap_adv_set_configure.\n * @param[in] conn_cfg_tag Tag identifying a configuration set by @ref sd_ble_cfg_set or\n *                         @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration. For non-connectable\n *                         advertising, this is ignored.\n *\n * @retval ::NRF_SUCCESS                  The BLE stack has started advertising.\n * @retval ::NRF_ERROR_INVALID_STATE      adv_handle is not configured or already advertising.\n * @retval ::NRF_ERROR_CONN_COUNT         The limit of available connections has been reached; connectable advertiser cannot be started.\n * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found. Configure a new adveriting handle with @ref sd_ble_gap_adv_set_configure.\n * @retval ::NRF_ERROR_NOT_FOUND          conn_cfg_tag not found.\n * @retval ::NRF_ERROR_INVALID_PARAM      Invalid parameter(s) supplied:\n *                                        - Invalid configuration of p_adv_params. See @ref ble_gap_adv_params_t.\n *                                        - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set.\n * @retval ::NRF_ERROR_RESOURCES          Either:\n *                                        - adv_handle is configured with connectable advertising, but the event_length parameter\n *                                          associated with conn_cfg_tag is too small to be able to establish a connection on\n *                                          the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length.\n *                                        - Not enough BLE role slots available.\n                                            Stop one or more currently active roles (Central, Peripheral, Broadcaster or Observer) and try again.\n *                                        - p_adv_params is configured with connectable advertising, but the event_length parameter\n *                                          associated with conn_cfg_tag is too small to be able to establish a connection on\n *                                          the selected advertising phys. Use @ref sd_ble_cfg_set to increase the event length.\n */\nSVCALL(SD_BLE_GAP_ADV_START, uint32_t, sd_ble_gap_adv_start(uint8_t adv_handle, uint8_t conn_cfg_tag));\n\n\n/**@brief Stop advertising (GAP Discoverable, Connectable modes, Broadcast Procedure).\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_ADV_MSC}\n * @mmsc{@ref BLE_GAP_WL_SHARE_MSC}\n * @endmscs\n *\n * @param[in] adv_handle The advertising handle that should stop advertising.\n *\n * @retval ::NRF_SUCCESS The BLE stack has stopped advertising.\n * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Invalid advertising handle.\n * @retval ::NRF_ERROR_INVALID_STATE The advertising handle is not advertising.\n */\nSVCALL(SD_BLE_GAP_ADV_STOP, uint32_t, sd_ble_gap_adv_stop(uint8_t adv_handle));\n\n\n\n/**@brief Update connection parameters.\n *\n * @details In the central role this will initiate a Link Layer connection parameter update procedure,\n *          otherwise in the peripheral role, this will send the corresponding L2CAP request and wait for\n *          the central to perform the procedure. In both cases, and regardless of success or failure, the application\n *          will be informed of the result with a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE event.\n *\n * @details This function can be used as a central both to reply to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST or to start the procedure unrequested.\n *\n * @events\n * @event{@ref BLE_GAP_EVT_CONN_PARAM_UPDATE, Result of the connection parameter update procedure.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_CPU_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC}\n * @mmsc{@ref BLE_GAP_MULTILINK_CPU_MSC}\n * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_CPU_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] p_conn_params  Pointer to desired connection parameters. If NULL is provided on a peripheral role,\n *                           the parameters in the PPCP characteristic of the GAP service will be used instead.\n *                           If NULL is provided on a central role and in response to a @ref BLE_GAP_EVT_CONN_PARAM_UPDATE_REQUEST, the peripheral request will be rejected\n *\n * @retval ::NRF_SUCCESS The Connection Update procedure has been started successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, check parameter limits and constraints.\n * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established.\n * @retval ::NRF_ERROR_BUSY Procedure already in progress, wait for pending procedures to complete and retry.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation.\n */\nSVCALL(SD_BLE_GAP_CONN_PARAM_UPDATE, uint32_t, sd_ble_gap_conn_param_update(uint16_t conn_handle, ble_gap_conn_params_t const *p_conn_params));\n\n\n/**@brief Disconnect (GAP Link Termination).\n *\n * @details This call initiates the disconnection procedure, and its completion will be communicated to the application\n *          with a @ref BLE_GAP_EVT_DISCONNECTED event.\n *\n * @events\n * @event{@ref BLE_GAP_EVT_DISCONNECTED, Generated when disconnection procedure is complete.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_CONN_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] hci_status_code HCI status code, see @ref BLE_HCI_STATUS_CODES (accepted values are @ref BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION and @ref BLE_HCI_CONN_INTERVAL_UNACCEPTABLE).\n *\n * @retval ::NRF_SUCCESS The disconnection procedure has been started successfully.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Disconnection in progress or link has not been established.\n */\nSVCALL(SD_BLE_GAP_DISCONNECT, uint32_t, sd_ble_gap_disconnect(uint16_t conn_handle, uint8_t hci_status_code));\n\n\n/**@brief Set the radio's transmit power.\n *\n * @param[in] role The role to set the transmit power for, see @ref BLE_GAP_TX_POWER_ROLES for\n *                 possible roles.\n * @param[in] handle   The handle parameter is interpreted depending on role:\n *                     - If role is @ref BLE_GAP_TX_POWER_ROLE_CONN, this value is the specific connection handle.\n *                     - If role is @ref BLE_GAP_TX_POWER_ROLE_ADV, the advertising set identified with the advertising handle,\n *                       will use the specified transmit power, and include it in the advertising packet headers if\n *                       @ref ble_gap_adv_properties_t::include_tx_power set.\n *                     - For all other roles handle is ignored.\n * @param[in] tx_power Radio transmit power in dBm (see note for accepted values).\n *\n  * @note Supported tx_power values: -40dBm, -20dBm, -16dBm, -12dBm, -8dBm, -4dBm, 0dBm, +2dBm, +3dBm, +4dBm, +5dBm, +6dBm, +7dBm and +8dBm.\n  * @note The initiator will have the same transmit power as the scanner.\n * @note When a connection is created it will inherit the transmit power from the initiator or\n *       advertiser leading to the connection.\n *\n * @retval ::NRF_SUCCESS Successfully changed the transmit power.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::BLE_ERROR_INVALID_ADV_HANDLE Advertising handle not found.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_TX_POWER_SET, uint32_t, sd_ble_gap_tx_power_set(uint8_t role, uint16_t handle, int8_t tx_power));\n\n\n/**@brief Set GAP Appearance value.\n *\n * @param[in] appearance Appearance (16-bit), see @ref BLE_APPEARANCES.\n *\n * @retval ::NRF_SUCCESS  Appearance value set successfully.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n */\nSVCALL(SD_BLE_GAP_APPEARANCE_SET, uint32_t, sd_ble_gap_appearance_set(uint16_t appearance));\n\n\n/**@brief Get GAP Appearance value.\n *\n * @param[out] p_appearance Pointer to appearance (16-bit) to be filled in, see @ref BLE_APPEARANCES.\n *\n * @retval ::NRF_SUCCESS Appearance value retrieved successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n */\nSVCALL(SD_BLE_GAP_APPEARANCE_GET, uint32_t, sd_ble_gap_appearance_get(uint16_t *p_appearance));\n\n\n/**@brief Set GAP Peripheral Preferred Connection Parameters.\n *\n * @param[in] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure with the desired parameters.\n *\n * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters set successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n */\nSVCALL(SD_BLE_GAP_PPCP_SET, uint32_t, sd_ble_gap_ppcp_set(ble_gap_conn_params_t const *p_conn_params));\n\n\n/**@brief Get GAP Peripheral Preferred Connection Parameters.\n *\n * @param[out] p_conn_params Pointer to a @ref ble_gap_conn_params_t structure where the parameters will be stored.\n *\n * @retval ::NRF_SUCCESS Peripheral Preferred Connection Parameters retrieved successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n */\nSVCALL(SD_BLE_GAP_PPCP_GET, uint32_t, sd_ble_gap_ppcp_get(ble_gap_conn_params_t *p_conn_params));\n\n\n/**@brief Set GAP device name.\n *\n * @note  If the device name is located in application flash memory (see @ref ble_gap_cfg_device_name_t),\n *        it cannot be changed. Then @ref NRF_ERROR_FORBIDDEN will be returned.\n *\n * @param[in] p_write_perm Write permissions for the Device Name characteristic, see @ref ble_gap_conn_sec_mode_t.\n * @param[in] p_dev_name Pointer to a UTF-8 encoded, <b>non NULL-terminated</b> string.\n * @param[in] len Length of the UTF-8, <b>non NULL-terminated</b> string pointed to by p_dev_name in octets (must be smaller or equal than @ref BLE_GAP_DEVNAME_MAX_LEN).\n *\n * @retval ::NRF_SUCCESS GAP device name and permissions set successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied.\n * @retval ::NRF_ERROR_FORBIDDEN Device name is not writable.\n */\nSVCALL(SD_BLE_GAP_DEVICE_NAME_SET, uint32_t, sd_ble_gap_device_name_set(ble_gap_conn_sec_mode_t const *p_write_perm, uint8_t const *p_dev_name, uint16_t len));\n\n\n/**@brief Get GAP device name.\n *\n * @note  If the device name is longer than the size of the supplied buffer,\n *        p_len will return the complete device name length,\n *        and not the number of bytes actually returned in p_dev_name.\n *        The application may use this information to allocate a suitable buffer size.\n *\n * @param[out]    p_dev_name Pointer to an empty buffer where the UTF-8 <b>non NULL-terminated</b> string will be placed. Set to NULL to obtain the complete device name length.\n * @param[in,out] p_len      Length of the buffer pointed by p_dev_name, complete device name length on output.\n *\n * @retval ::NRF_SUCCESS GAP device name retrieved successfully.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied.\n */\nSVCALL(SD_BLE_GAP_DEVICE_NAME_GET, uint32_t, sd_ble_gap_device_name_get(uint8_t *p_dev_name, uint16_t *p_len));\n\n\n/**@brief Initiate the GAP Authentication procedure.\n *\n * @details In the central role, this function will send an SMP Pairing Request (or an SMP Pairing Failed if rejected),\n *          otherwise in the peripheral role, an SMP Security Request will be sent.\n *\n * @events\n * @event{Depending on the security parameters set and the packet exchanges with the peer\\, the following events may be generated:}\n * @event{@ref BLE_GAP_EVT_SEC_PARAMS_REQUEST}\n * @event{@ref BLE_GAP_EVT_SEC_INFO_REQUEST}\n * @event{@ref BLE_GAP_EVT_PASSKEY_DISPLAY}\n * @event{@ref BLE_GAP_EVT_KEY_PRESSED}\n * @event{@ref BLE_GAP_EVT_AUTH_KEY_REQUEST}\n * @event{@ref BLE_GAP_EVT_LESC_DHKEY_REQUEST}\n * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE}\n * @event{@ref BLE_GAP_EVT_AUTH_STATUS}\n * @event{@ref BLE_GAP_EVT_TIMEOUT}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_SEC_REQ_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] p_sec_params Pointer to the @ref ble_gap_sec_params_t structure with the security parameters to be used during the pairing or bonding procedure.\n *                         In the peripheral role, only the bond, mitm, lesc and keypress fields of this structure are used.\n *                         In the central role, this pointer may be NULL to reject a Security Request.\n *\n * @retval ::NRF_SUCCESS Successfully initiated authentication procedure.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either:\n *                                   - No link has been established.\n *                                   - An encryption is already executing or queued.\n * @retval ::NRF_ERROR_NO_MEM The maximum number of authentication procedures that can run in parallel for the given role is reached.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported.\n * @retval ::NRF_ERROR_TIMEOUT A SMP timeout has occurred, and further SMP operations on this link is prohibited.\n */\nSVCALL(SD_BLE_GAP_AUTHENTICATE, uint32_t, sd_ble_gap_authenticate(uint16_t conn_handle, ble_gap_sec_params_t const *p_sec_params));\n\n\n/**@brief Reply with GAP security parameters.\n *\n * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE.\n * @note    If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters.\n *\n * @events\n * @event{This function is used during authentication procedures\\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_JW_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_BONDING_JW_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_PERIPH_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_BONDING_STATIC_PK_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_CONFIRM_FAIL_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_KS_TOO_SMALL_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_APP_ERROR_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_REMOTE_PAIRING_FAIL_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_PAIRING_TIMEOUT_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_PAIRING_JW_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_JW_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] sec_status Security status, see @ref BLE_GAP_SEC_STATUS.\n * @param[in] p_sec_params Pointer to a @ref ble_gap_sec_params_t security parameters structure. In the central role this must be set to NULL, as the parameters have\n *                         already been provided during a previous call to @ref sd_ble_gap_authenticate.\n * @param[in,out] p_sec_keyset Pointer to a @ref ble_gap_sec_keyset_t security keyset structure. Any keys generated and/or distributed as a result of the ongoing security procedure\n *                         will be stored into the memory referenced by the pointers inside this structure. The keys will be stored and available to the application\n *                         upon reception of a @ref BLE_GAP_EVT_AUTH_STATUS event.\n *                         Note that the SoftDevice expects the application to provide memory for storing the\n *                         peer's keys. So it must be ensured that the relevant pointers inside this structure are not NULL. The pointers to the local key\n *                         can, however, be NULL, in which case, the local key data will not be available to the application upon reception of the\n *                         @ref BLE_GAP_EVT_AUTH_STATUS event.\n *\n * @retval ::NRF_SUCCESS Successfully accepted security parameter from the application.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_BUSY The stack is busy, process pending events and retry.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Security parameters has not been requested.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n * @retval ::NRF_ERROR_NOT_SUPPORTED Setting of sign or link fields in @ref ble_gap_sec_kdist_t not supported.\n */\nSVCALL(SD_BLE_GAP_SEC_PARAMS_REPLY, uint32_t, sd_ble_gap_sec_params_reply(uint16_t conn_handle, uint8_t sec_status, ble_gap_sec_params_t const *p_sec_params, ble_gap_sec_keyset_t const *p_sec_keyset));\n\n\n/**@brief Reply with an authentication key.\n *\n * @details This function is only used to reply to a @ref BLE_GAP_EVT_AUTH_KEY_REQUEST or a @ref BLE_GAP_EVT_PASSKEY_DISPLAY, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE.\n * @note    If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters.\n *\n * @events\n * @event{This function is used during authentication procedures\\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_BONDING_PK_CENTRAL_OOB_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_BONDING_PK_PERIPH_OOB_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] key_type See @ref BLE_GAP_AUTH_KEY_TYPES.\n * @param[in] p_key If key type is @ref BLE_GAP_AUTH_KEY_TYPE_NONE, then NULL.\n *                  If key type is @ref BLE_GAP_AUTH_KEY_TYPE_PASSKEY, then a 6-byte ASCII string (digit 0..9 only, no NULL termination)\n *                     or NULL when confirming LE Secure Connections Numeric Comparison.\n *                  If key type is @ref BLE_GAP_AUTH_KEY_TYPE_OOB, then a 16-byte OOB key value in little-endian format.\n *\n * @retval ::NRF_SUCCESS Authentication key successfully set.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Authentication key has not been requested.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_AUTH_KEY_REPLY, uint32_t, sd_ble_gap_auth_key_reply(uint16_t conn_handle, uint8_t key_type, uint8_t const *p_key));\n\n\n/**@brief Reply with an LE Secure connections DHKey.\n *\n * @details This function is only used to reply to a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST, calling it at other times will result in an @ref NRF_ERROR_INVALID_STATE.\n * @note    If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters.\n *\n * @events\n * @event{This function is used during authentication procedures\\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_PAIRING_JW_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_NC_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_PD_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC}\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_PAIRING_JW_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_NC_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_PD_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] p_dhkey LE Secure Connections DHKey.\n *\n * @retval ::NRF_SUCCESS DHKey successfully set.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either:\n *                                   - The peer is not authenticated.\n *                                   - The application has not pulled a @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_LESC_DHKEY_REPLY, uint32_t, sd_ble_gap_lesc_dhkey_reply(uint16_t conn_handle, ble_gap_lesc_dhkey_t const *p_dhkey));\n\n\n/**@brief Notify the peer of a local keypress.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_PKE_CD_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_PKE_CD_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] kp_not See @ref BLE_GAP_KP_NOT_TYPES.\n *\n * @retval ::NRF_SUCCESS Keypress notification successfully queued for transmission.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either:\n *                                   - Authentication key not requested.\n *                                   - Passkey has not been entered.\n *                                   - Keypresses have not been enabled by both peers.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n * @retval ::NRF_ERROR_BUSY The BLE stack is busy. Retry at later time.\n */\nSVCALL(SD_BLE_GAP_KEYPRESS_NOTIFY, uint32_t, sd_ble_gap_keypress_notify(uint16_t conn_handle, uint8_t kp_not));\n\n\n/**@brief Generate a set of OOB data to send to a peer out of band.\n *\n * @note  The @ref ble_gap_addr_t included in the OOB data returned will be the currently active one (or, if a connection has already been established,\n *        the one used during connection setup). The application may manually overwrite it with an updated value.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle. Can be @ref BLE_CONN_HANDLE_INVALID if a BLE connection has not been established yet.\n * @param[in] p_pk_own LE Secure Connections local P-256 Public Key.\n * @param[out] p_oobd_own The OOB data to be sent out of band to a peer.\n *\n * @retval ::NRF_SUCCESS OOB data successfully generated.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_LESC_OOB_DATA_GET, uint32_t, sd_ble_gap_lesc_oob_data_get(uint16_t conn_handle, ble_gap_lesc_p256_pk_t const *p_pk_own, ble_gap_lesc_oob_data_t *p_oobd_own));\n\n/**@brief Provide the OOB data sent/received out of band.\n *\n * @note  An authentication procedure with OOB selected as an algorithm must be in progress when calling this function.\n * @note  A @ref BLE_GAP_EVT_LESC_DHKEY_REQUEST event with the oobd_req set to 1 must have been received prior to calling this function.\n *\n * @events\n * @event{This function is used during authentication procedures\\, see the list of events in the documentation of @ref sd_ble_gap_authenticate.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_LESC_BONDING_OOB_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_LESC_BONDING_OOB_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] p_oobd_own The OOB data sent out of band to a peer or NULL if the peer has not received OOB data.\n *                       Must correspond to @ref ble_gap_sec_params_t::oob flag in @ref BLE_GAP_EVT_SEC_PARAMS_REQUEST.\n * @param[in] p_oobd_peer The OOB data received out of band from a peer or NULL if none received.\n *                        Must correspond to @ref ble_gap_sec_params_t::oob flag\n *                        in @ref sd_ble_gap_authenticate in the central role or\n *                        in @ref sd_ble_gap_sec_params_reply in the peripheral role.\n *\n * @retval ::NRF_SUCCESS OOB data accepted.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either:\n *                                   - Authentication key not requested\n *                                   - Not expecting LESC OOB data\n *                                   - Have not actually exchanged passkeys.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_LESC_OOB_DATA_SET, uint32_t, sd_ble_gap_lesc_oob_data_set(uint16_t conn_handle, ble_gap_lesc_oob_data_t const *p_oobd_own, ble_gap_lesc_oob_data_t const *p_oobd_peer));\n\n\n/**@brief Initiate GAP Encryption procedure.\n *\n * @details In the central role, this function will initiate the encryption procedure using the encryption information provided.\n *\n * @events\n * @event{@ref BLE_GAP_EVT_CONN_SEC_UPDATE, The connection security has been updated.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_CENTRAL_ENC_AUTH_MUTEX_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_ENC_MSC}\n * @mmsc{@ref BLE_GAP_MULTILINK_CTRL_PROC_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_SEC_REQ_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] p_master_id Pointer to a @ref ble_gap_master_id_t master identification structure.\n * @param[in] p_enc_info  Pointer to a @ref ble_gap_enc_info_t encryption information structure.\n *\n * @retval ::NRF_SUCCESS Successfully initiated authentication procedure.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_STATE No link has been established.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n * @retval ::BLE_ERROR_INVALID_ROLE Operation is not supported in the Peripheral role.\n * @retval ::NRF_ERROR_BUSY Procedure already in progress or not allowed at this time, wait for pending procedures to complete and retry.\n */\nSVCALL(SD_BLE_GAP_ENCRYPT, uint32_t, sd_ble_gap_encrypt(uint16_t conn_handle, ble_gap_master_id_t const *p_master_id, ble_gap_enc_info_t const *p_enc_info));\n\n\n/**@brief Reply with GAP security information.\n *\n * @details This function is only used to reply to a @ref BLE_GAP_EVT_SEC_INFO_REQUEST, calling it at other times will result in @ref NRF_ERROR_INVALID_STATE.\n * @note    If the call returns an error code, the request is still pending, and the reply call may be repeated with corrected parameters.\n * @note    Data signing is not yet supported, and p_sign_info must therefore be NULL.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_PERIPH_ENC_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n * @param[in] p_enc_info Pointer to a @ref ble_gap_enc_info_t encryption information structure. May be NULL to signal none is available.\n * @param[in] p_id_info Pointer to a @ref ble_gap_irk_t identity information structure. May be NULL to signal none is available.\n * @param[in] p_sign_info Pointer to a @ref ble_gap_sign_info_t signing information structure. May be NULL to signal none is available.\n *\n * @retval ::NRF_SUCCESS Successfully accepted security information.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either:\n *                                   - No link has been established.\n *                                   - No @ref BLE_GAP_EVT_SEC_REQUEST pending.\n *                                   - LE long term key requested command not allowed.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_SEC_INFO_REPLY, uint32_t, sd_ble_gap_sec_info_reply(uint16_t conn_handle, ble_gap_enc_info_t const *p_enc_info, ble_gap_irk_t const *p_id_info, ble_gap_sign_info_t const *p_sign_info));\n\n\n/**@brief Get the current connection security.\n *\n * @param[in]  conn_handle Connection handle.\n * @param[out] p_conn_sec  Pointer to a @ref ble_gap_conn_sec_t structure to be filled in.\n *\n * @retval ::NRF_SUCCESS Current connection security successfully retrieved.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_CONN_SEC_GET, uint32_t, sd_ble_gap_conn_sec_get(uint16_t conn_handle, ble_gap_conn_sec_t *p_conn_sec));\n\n\n/**@brief Start reporting the received signal strength to the application.\n *\n *        A new event is reported whenever the RSSI value changes, until @ref sd_ble_gap_rssi_stop is called.\n *\n * @events\n * @event{@ref BLE_GAP_EVT_RSSI_CHANGED, New RSSI data available. How often the event is generated is\n *                                       dependent on the settings of the <code>threshold_dbm</code>\n *                                       and <code>skip_count</code> input parameters.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC}\n * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC}\n * @endmscs\n *\n * @param[in] conn_handle        Connection handle.\n * @param[in] threshold_dbm      Minimum change in dBm before triggering the @ref BLE_GAP_EVT_RSSI_CHANGED event. Events are disabled if threshold_dbm equals @ref BLE_GAP_RSSI_THRESHOLD_INVALID.\n * @param[in] skip_count         Number of RSSI samples with a change of threshold_dbm or more before sending a new @ref BLE_GAP_EVT_RSSI_CHANGED event.\n *\n * @retval ::NRF_SUCCESS                   Successfully activated RSSI reporting.\n * @retval ::NRF_ERROR_INVALID_STATE       RSSI reporting is already ongoing.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_RSSI_START, uint32_t, sd_ble_gap_rssi_start(uint16_t conn_handle, uint8_t threshold_dbm, uint8_t skip_count));\n\n\n/**@brief Stop reporting the received signal strength.\n *\n * @note  An RSSI change detected before the call but not yet received by the application\n *        may be reported after @ref sd_ble_gap_rssi_stop has been called.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC}\n * @mmsc{@ref BLE_GAP_RSSI_FILT_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection handle.\n *\n * @retval ::NRF_SUCCESS                   Successfully deactivated RSSI reporting.\n * @retval ::NRF_ERROR_INVALID_STATE       RSSI reporting is not ongoing.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n */\nSVCALL(SD_BLE_GAP_RSSI_STOP, uint32_t, sd_ble_gap_rssi_stop(uint16_t conn_handle));\n\n\n/**@brief Get the received signal strength for the last connection event.\n *\n *        @ref sd_ble_gap_rssi_start must be called to start reporting RSSI before using this function. @ref NRF_ERROR_NOT_FOUND\n *        will be returned until RSSI was sampled for the first time after calling @ref sd_ble_gap_rssi_start.\n * @note ERRATA-153 requires the rssi sample to be compensated based on a temperature measurement.\n * @mscs\n * @mmsc{@ref BLE_GAP_CENTRAL_RSSI_READ_MSC}\n * @endmscs\n *\n * @param[in]  conn_handle Connection handle.\n * @param[out] p_rssi      Pointer to the location where the RSSI measurement shall be stored.\n * @param[out] p_ch_index  Pointer to the location where Channel Index for the RSSI measurement shall be stored.\n *\n * @retval ::NRF_SUCCESS                   Successfully read the RSSI.\n * @retval ::NRF_ERROR_NOT_FOUND           No sample is available.\n * @retval ::NRF_ERROR_INVALID_ADDR        Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n * @retval ::NRF_ERROR_INVALID_STATE       RSSI reporting is not ongoing.\n */\nSVCALL(SD_BLE_GAP_RSSI_GET, uint32_t, sd_ble_gap_rssi_get(uint16_t conn_handle, int8_t *p_rssi, uint8_t *p_ch_index));\n\n\n/**@brief Start or continue scanning (GAP Discovery procedure, Observer Procedure).\n *\n * @note    A call to this function will require the application to keep the memory pointed by\n *          p_adv_report_buffer alive until the buffer is released. The buffer is released when the scanner is stopped\n *          or when this function is called with another buffer.\n *\n * @note    The scanner will automatically stop in the following cases:\n *           - @ref sd_ble_gap_scan_stop is called.\n *           - @ref sd_ble_gap_connect is called.\n *           - A @ref BLE_GAP_EVT_TIMEOUT with source set to @ref BLE_GAP_TIMEOUT_SRC_SCAN is received.\n *           - When a @ref BLE_GAP_EVT_ADV_REPORT event is received and @ref ble_gap_adv_report_type_t::status is not set to\n *             @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA. In this case scanning is only paused to let the application\n *             access received data. The application must call this function to continue scanning, or call @ref sd_ble_gap_scan_stop\n *             to stop scanning.\n *\n * @note    If a @ref BLE_GAP_EVT_ADV_REPORT event is received with @ref ble_gap_adv_report_type_t::status set to\n *          @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_MORE_DATA, the scanner will continue scanning, and the application will\n *          receive more reports from this advertising event. The following reports will include the old and new received data.\n *\n * @events\n * @event{@ref BLE_GAP_EVT_ADV_REPORT, An advertising or scan response packet has been received.}\n * @event{@ref BLE_GAP_EVT_TIMEOUT, Scanner has timed out.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_SCAN_MSC}\n * @mmsc{@ref BLE_GAP_WL_SHARE_MSC}\n * @endmscs\n *\n * @param[in] p_scan_params       Pointer to scan parameters structure. When this function is used to continue\n *                                scanning, this parameter must be NULL.\n * @param[in] p_adv_report_buffer Pointer to buffer used to store incoming advertising data.\n *                                The memory pointed to should be kept alive until the scanning is stopped.\n *                                See @ref BLE_GAP_SCAN_BUFFER_SIZE for minimum and maximum buffer size.\n *                                If the scanner receives advertising data larger than can be stored in the buffer,\n *                                a @ref BLE_GAP_EVT_ADV_REPORT will be raised with @ref ble_gap_adv_report_type_t::status\n *                                set to @ref BLE_GAP_ADV_DATA_STATUS_INCOMPLETE_TRUNCATED.\n *\n * @retval ::NRF_SUCCESS Successfully initiated scanning procedure.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation. Either:\n *                                   - Scanning is already ongoing and p_scan_params was not NULL\n *                                   - Scanning is not running and p_scan_params was NULL.\n *                                   - The scanner has timed out when this function is called to continue scanning.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied. See @ref ble_gap_scan_params_t.\n * @retval ::NRF_ERROR_NOT_SUPPORTED Unsupported parameters supplied. See @ref ble_gap_scan_params_t.\n * @retval ::NRF_ERROR_INVALID_LENGTH The provided buffer length is invalid. See @ref BLE_GAP_SCAN_BUFFER_MIN.\n * @retval ::NRF_ERROR_RESOURCES Not enough BLE role slots available.\n *                               Stop one or more currently active roles (Central, Peripheral or Broadcaster) and try again\n */\nSVCALL(SD_BLE_GAP_SCAN_START, uint32_t, sd_ble_gap_scan_start(ble_gap_scan_params_t const *p_scan_params, ble_data_t const * p_adv_report_buffer));\n\n\n/**@brief Stop scanning (GAP Discovery procedure, Observer Procedure).\n *\n * @note The buffer provided in @ref sd_ble_gap_scan_start is released.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_SCAN_MSC}\n * @mmsc{@ref BLE_GAP_WL_SHARE_MSC}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS Successfully stopped scanning procedure.\n * @retval ::NRF_ERROR_INVALID_STATE Not in the scanning state.\n */\nSVCALL(SD_BLE_GAP_SCAN_STOP, uint32_t, sd_ble_gap_scan_stop(void));\n\n\n/**@brief Create a connection (GAP Link Establishment).\n *\n * @note If a scanning procedure is currently in progress it will be automatically stopped when calling this function.\n *       The scanning procedure will be stopped even if the function returns an error.\n *\n * @events\n * @event{@ref BLE_GAP_EVT_CONNECTED, A connection was established.}\n * @event{@ref BLE_GAP_EVT_TIMEOUT, Failed to establish a connection.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_WL_SHARE_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_CONN_PRIV_MSC}\n * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC}\n * @endmscs\n *\n * @param[in] p_peer_addr   Pointer to peer identity address. If @ref ble_gap_scan_params_t::filter_policy is set to use\n *                          whitelist, then p_peer_addr is ignored.\n * @param[in] p_scan_params Pointer to scan parameters structure.\n * @param[in] p_conn_params Pointer to desired connection parameters.\n * @param[in] conn_cfg_tag  Tag identifying a configuration set by @ref sd_ble_cfg_set or\n *                          @ref BLE_CONN_CFG_TAG_DEFAULT to use the default connection configuration.\n *\n * @retval ::NRF_SUCCESS Successfully initiated connection procedure.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid parameter(s) pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n *                                   - Invalid parameter(s) in p_scan_params or p_conn_params.\n *                                   - Use of whitelist requested but whitelist has not been set, see @ref sd_ble_gap_whitelist_set.\n *                                   - Peer address was not present in the device identity list, see @ref sd_ble_gap_device_identities_set.\n * @retval ::NRF_ERROR_NOT_FOUND conn_cfg_tag not found.\n * @retval ::NRF_ERROR_INVALID_STATE The SoftDevice is in an invalid state to perform this operation. This may be due to an\n *                                   existing locally initiated connect procedure, which must complete before initiating again.\n * @retval ::BLE_ERROR_GAP_INVALID_BLE_ADDR Invalid Peer address.\n * @retval ::NRF_ERROR_CONN_COUNT The limit of available connections has been reached.\n * @retval ::NRF_ERROR_RESOURCES Either:\n *                                 - Not enough BLE role slots available.\n *                                   Stop one or more currently active roles (Central, Peripheral or Observer) and try again.\n *                                 - The event_length parameter associated with conn_cfg_tag is too small to be able to\n *                                   establish a connection on the selected @ref ble_gap_scan_params_t::scan_phys.\n *                                   Use @ref sd_ble_cfg_set to increase the event length.\n */\nSVCALL(SD_BLE_GAP_CONNECT, uint32_t, sd_ble_gap_connect(ble_gap_addr_t const *p_peer_addr, ble_gap_scan_params_t const *p_scan_params, ble_gap_conn_params_t const *p_conn_params, uint8_t conn_cfg_tag));\n\n\n/**@brief Cancel a connection establishment.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_CENTRAL_CONN_MSC}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS Successfully canceled an ongoing connection procedure.\n * @retval ::NRF_ERROR_INVALID_STATE No locally initiated connect procedure started or connection\n *                                   completed occurred.\n */\nSVCALL(SD_BLE_GAP_CONNECT_CANCEL, uint32_t, sd_ble_gap_connect_cancel(void));\n\n\n/**@brief Initiate or respond to a PHY Update Procedure\n *\n * @details   This function is used to initiate or respond to a PHY Update Procedure. It will always\n *            generate a @ref BLE_GAP_EVT_PHY_UPDATE event if successfully executed.\n *            If this function is used to initiate a PHY Update procedure and the only option\n *            provided in @ref ble_gap_phys_t::tx_phys and @ref ble_gap_phys_t::rx_phys is the\n *            currently active PHYs in the respective directions, the SoftDevice will generate a\n *            @ref BLE_GAP_EVT_PHY_UPDATE with the current PHYs set and will not initiate the\n *            procedure in the Link Layer.\n *\n *            If @ref ble_gap_phys_t::tx_phys or @ref ble_gap_phys_t::rx_phys is @ref BLE_GAP_PHY_AUTO,\n *            then the stack will select PHYs based on the peer's PHY preferences and the local link\n *            configuration. The PHY Update procedure will for this case result in a PHY combination\n *            that respects the time constraints configured with @ref sd_ble_cfg_set and the current\n *            link layer data length.\n *\n *            When acting as a central, the SoftDevice will select the fastest common PHY in each direction.\n *\n *            If the peer does not support the PHY Update Procedure, then the resulting\n *            @ref BLE_GAP_EVT_PHY_UPDATE event will have a status set to\n *            @ref BLE_HCI_UNSUPPORTED_REMOTE_FEATURE.\n *\n *            If the PHY procedure was rejected by the peer due to a procedure collision, the status\n *            will be @ref BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION or\n *            @ref BLE_HCI_DIFFERENT_TRANSACTION_COLLISION.\n *            If the peer responds to the PHY Update procedure with invalid parameters, the status\n *            will be @ref BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS.\n *            If the PHY procedure was rejected by the peer for a different reason, the status will\n *            contain the reason as specified by the peer.\n *\n * @events\n * @event{@ref BLE_GAP_EVT_PHY_UPDATE, Result of the PHY Update Procedure.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_CENTRAL_PHY_UPDATE}\n * @mmsc{@ref BLE_GAP_PERIPHERAL_PHY_UPDATE}\n * @endmscs\n *\n * @param[in] conn_handle   Connection handle to indicate the connection for which the PHY Update is requested.\n * @param[in] p_gap_phys    Pointer to PHY structure.\n *\n * @retval ::NRF_SUCCESS Successfully requested a PHY Update.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_INVALID_STATE No link has been established.\n * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the combination of\n *                               @ref ble_gap_phys_t::tx_phys, @ref ble_gap_phys_t::rx_phys, and @ref ble_gap_data_length_params_t.\n *                               The connection event length is configured with @ref BLE_CONN_CFG_GAP using @ref sd_ble_cfg_set.\n * @retval ::NRF_ERROR_BUSY Procedure is already in progress or not allowed at this time. Process pending events and wait for the pending procedure to complete and retry.\n *\n */\nSVCALL(SD_BLE_GAP_PHY_UPDATE, uint32_t, sd_ble_gap_phy_update(uint16_t conn_handle, ble_gap_phys_t const *p_gap_phys));\n\n\n/**@brief Initiate or respond to a Data Length Update Procedure.\n *\n * @note If the application uses @ref BLE_GAP_DATA_LENGTH_AUTO for one or more members of\n *       p_dl_params, the SoftDevice will choose the highest value supported in current\n *       configuration and connection parameters.\n * @note  If the link PHY is Coded, the SoftDevice will ensure that the MaxTxTime and/or MaxRxTime\n *        used in the Data Length Update procedure is at least 2704 us. Otherwise, MaxTxTime and\n *        MaxRxTime will be limited to maximum 2120 us.\n *\n * @param[in]   conn_handle       Connection handle.\n * @param[in]   p_dl_params       Pointer to local parameters to be used in Data Length Update\n *                                Procedure. Set any member to @ref BLE_GAP_DATA_LENGTH_AUTO to let\n *                                the SoftDevice automatically decide the value for that member.\n *                                Set to NULL to use automatic values for all members.\n * @param[out]  p_dl_limitation   Pointer to limitation to be written when local device does not\n *                                have enough resources or does not support the requested Data Length\n *                                Update parameters. Ignored if NULL.\n *\n * @mscs\n * @mmsc{@ref BLE_GAP_DATA_LENGTH_UPDATE_PROCEDURE_MSC}\n * @endmscs\n *\n * @retval ::NRF_SUCCESS Successfully set Data Length Extension initiation/response parameters.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle parameter supplied.\n * @retval ::NRF_ERROR_INVALID_STATE No link has been established.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied.\n * @retval ::NRF_ERROR_NOT_SUPPORTED The requested parameters are not supported by the SoftDevice. Inspect\n *                                   p_dl_limitation to see which parameter is not supported.\n * @retval ::NRF_ERROR_RESOURCES The connection event length configured for this link is not sufficient for the requested parameters.\n *                               Use @ref sd_ble_cfg_set with @ref BLE_CONN_CFG_GAP to increase the connection event length.\n *                               Inspect p_dl_limitation to see where the limitation is.\n * @retval ::NRF_ERROR_BUSY Peer has already initiated a Data Length Update Procedure. Process the\n *                          pending @ref BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST event to respond.\n */\nSVCALL(SD_BLE_GAP_DATA_LENGTH_UPDATE, uint32_t, sd_ble_gap_data_length_update(uint16_t conn_handle, ble_gap_data_length_params_t const *p_dl_params, ble_gap_data_length_limitation_t *p_dl_limitation));\n\n/**@brief   Start the Quality of Service (QoS) channel survey module.\n *\n * @details The channel survey module provides measurements of the energy levels on\n *          the Bluetooth Low Energy channels. When the module is enabled, @ref BLE_GAP_EVT_QOS_CHANNEL_SURVEY_REPORT\n *          events will periodically report the measured energy levels for each channel.\n *\n * @note    The measurements are scheduled with lower priority than other Bluetooth Low Energy roles,\n *          Radio Timeslot API events and Flash API events.\n *\n * @note    The channel survey module will attempt to do measurements so that the average interval\n *          between measurements will be interval_us. However due to the channel survey module\n *          having the lowest priority of all roles and modules, this may not be possible. In that\n *          case fewer than expected channel survey reports may be given.\n *\n * @note    In order to use the channel survey module, @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available\n *          must be set. This is done using @ref sd_ble_cfg_set.\n *\n * @param[in]   interval_us      Requested average interval for the measurements and reports. See\n *                               @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVALS for valid ranges. If set\n *                               to @ref BLE_GAP_QOS_CHANNEL_SURVEY_INTERVAL_CONTINUOUS, the channel\n *                               survey role will be scheduled at every available opportunity.\n *\n * @retval ::NRF_SUCCESS             The module is successfully started.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter supplied. interval_us is out of the\n *                                   allowed range.\n * @retval ::NRF_ERROR_INVALID_STATE Trying to start the module when already running.\n * @retval ::NRF_ERROR_RESOURCES     The channel survey module is not available to the application.\n *                                   Set @ref ble_gap_cfg_role_count_t::qos_channel_survey_role_available using\n *                                   @ref sd_ble_cfg_set.\n */\nSVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_START, uint32_t, sd_ble_gap_qos_channel_survey_start(uint32_t interval_us));\n\n/**@brief   Stop the Quality of Service (QoS) channel survey module.\n *\n * @retval ::NRF_SUCCESS             The module is successfully stopped.\n * @retval ::NRF_ERROR_INVALID_STATE Trying to stop the module when it is not running.\n */\nSVCALL(SD_BLE_GAP_QOS_CHANNEL_SURVEY_STOP, uint32_t, sd_ble_gap_qos_channel_survey_stop(void));\n\n\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n#endif // BLE_GAP_H__\n\n/**\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_gatt.h",
    "content": "/*\n * Copyright (c) 2013 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_GATT Generic Attribute Profile (GATT) Common\n  @{\n  @brief  Common definitions and prototypes for the GATT interfaces.\n */\n\n#ifndef BLE_GATT_H__\n#define BLE_GATT_H__\n\n#include <stdint.h>\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"ble_hci.h\"\n#include \"ble_ranges.h\"\n#include \"ble_types.h\"\n#include \"ble_err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @addtogroup BLE_GATT_DEFINES Defines\n * @{ */\n\n/** @brief Default ATT MTU, in bytes. */\n#define BLE_GATT_ATT_MTU_DEFAULT          23\n\n/**@brief Invalid Attribute Handle. */\n#define BLE_GATT_HANDLE_INVALID            0x0000\n\n/**@brief First Attribute Handle. */\n#define BLE_GATT_HANDLE_START              0x0001\n\n/**@brief Last Attribute Handle. */\n#define BLE_GATT_HANDLE_END                0xFFFF\n\n/** @defgroup BLE_GATT_TIMEOUT_SOURCES GATT Timeout sources\n * @{ */\n#define BLE_GATT_TIMEOUT_SRC_PROTOCOL      0x00  /**< ATT Protocol timeout. */\n/** @} */\n\n/** @defgroup BLE_GATT_WRITE_OPS GATT Write operations\n * @{ */\n#define BLE_GATT_OP_INVALID                0x00  /**< Invalid Operation. */\n#define BLE_GATT_OP_WRITE_REQ              0x01  /**< Write Request. */\n#define BLE_GATT_OP_WRITE_CMD              0x02  /**< Write Command. */\n#define BLE_GATT_OP_SIGN_WRITE_CMD         0x03  /**< Signed Write Command. */\n#define BLE_GATT_OP_PREP_WRITE_REQ         0x04  /**< Prepare Write Request. */\n#define BLE_GATT_OP_EXEC_WRITE_REQ         0x05  /**< Execute Write Request. */\n/** @} */\n\n/** @defgroup BLE_GATT_EXEC_WRITE_FLAGS GATT Execute Write flags\n * @{ */\n#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_CANCEL 0x00   /**< Cancel prepared write. */\n#define BLE_GATT_EXEC_WRITE_FLAG_PREPARED_WRITE  0x01   /**< Execute prepared write. */\n/** @} */\n\n/** @defgroup BLE_GATT_HVX_TYPES GATT Handle Value operations\n * @{ */\n#define BLE_GATT_HVX_INVALID               0x00  /**< Invalid Operation. */\n#define BLE_GATT_HVX_NOTIFICATION          0x01  /**< Handle Value Notification. */\n#define BLE_GATT_HVX_INDICATION            0x02  /**< Handle Value Indication. */\n/** @} */\n\n/** @defgroup BLE_GATT_STATUS_CODES GATT Status Codes\n * @{ */\n#define BLE_GATT_STATUS_SUCCESS                           0x0000  /**< Success. */\n#define BLE_GATT_STATUS_UNKNOWN                           0x0001  /**< Unknown or not applicable status. */\n#define BLE_GATT_STATUS_ATTERR_INVALID                    0x0100  /**< ATT Error: Invalid Error Code. */\n#define BLE_GATT_STATUS_ATTERR_INVALID_HANDLE             0x0101  /**< ATT Error: Invalid Attribute Handle. */\n#define BLE_GATT_STATUS_ATTERR_READ_NOT_PERMITTED         0x0102  /**< ATT Error: Read not permitted. */\n#define BLE_GATT_STATUS_ATTERR_WRITE_NOT_PERMITTED        0x0103  /**< ATT Error: Write not permitted. */\n#define BLE_GATT_STATUS_ATTERR_INVALID_PDU                0x0104  /**< ATT Error: Used in ATT as Invalid PDU. */\n#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHENTICATION       0x0105  /**< ATT Error: Authenticated link required. */\n#define BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED      0x0106  /**< ATT Error: Used in ATT as Request Not Supported. */\n#define BLE_GATT_STATUS_ATTERR_INVALID_OFFSET             0x0107  /**< ATT Error: Offset specified was past the end of the attribute. */\n#define BLE_GATT_STATUS_ATTERR_INSUF_AUTHORIZATION        0x0108  /**< ATT Error: Used in ATT as Insufficient Authorization. */\n#define BLE_GATT_STATUS_ATTERR_PREPARE_QUEUE_FULL         0x0109  /**< ATT Error: Used in ATT as Prepare Queue Full. */\n#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_FOUND        0x010A  /**< ATT Error: Used in ATT as Attribute not found. */\n#define BLE_GATT_STATUS_ATTERR_ATTRIBUTE_NOT_LONG         0x010B  /**< ATT Error: Attribute cannot be read or written using read/write blob requests. */\n#define BLE_GATT_STATUS_ATTERR_INSUF_ENC_KEY_SIZE         0x010C  /**< ATT Error: Encryption key size used is insufficient. */\n#define BLE_GATT_STATUS_ATTERR_INVALID_ATT_VAL_LENGTH     0x010D  /**< ATT Error: Invalid value size. */\n#define BLE_GATT_STATUS_ATTERR_UNLIKELY_ERROR             0x010E  /**< ATT Error: Very unlikely error. */\n#define BLE_GATT_STATUS_ATTERR_INSUF_ENCRYPTION           0x010F  /**< ATT Error: Encrypted link required. */\n#define BLE_GATT_STATUS_ATTERR_UNSUPPORTED_GROUP_TYPE     0x0110  /**< ATT Error: Attribute type is not a supported grouping attribute. */\n#define BLE_GATT_STATUS_ATTERR_INSUF_RESOURCES            0x0111  /**< ATT Error: Encrypted link required. */\n#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_BEGIN           0x0112  /**< ATT Error: Reserved for Future Use range #1 begin. */\n#define BLE_GATT_STATUS_ATTERR_RFU_RANGE1_END             0x017F  /**< ATT Error: Reserved for Future Use range #1 end. */\n#define BLE_GATT_STATUS_ATTERR_APP_BEGIN                  0x0180  /**< ATT Error: Application range begin. */\n#define BLE_GATT_STATUS_ATTERR_APP_END                    0x019F  /**< ATT Error: Application range end. */\n#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_BEGIN           0x01A0  /**< ATT Error: Reserved for Future Use range #2 begin. */\n#define BLE_GATT_STATUS_ATTERR_RFU_RANGE2_END             0x01DF  /**< ATT Error: Reserved for Future Use range #2 end. */\n#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_BEGIN           0x01E0  /**< ATT Error: Reserved for Future Use range #3 begin. */\n#define BLE_GATT_STATUS_ATTERR_RFU_RANGE3_END             0x01FC  /**< ATT Error: Reserved for Future Use range #3 end. */\n#define BLE_GATT_STATUS_ATTERR_CPS_WRITE_REQ_REJECTED     0x01FC  /**< ATT Common Profile and Service Error: Write request rejected. */\n#define BLE_GATT_STATUS_ATTERR_CPS_CCCD_CONFIG_ERROR      0x01FD  /**< ATT Common Profile and Service Error: Client Characteristic Configuration Descriptor improperly configured. */\n#define BLE_GATT_STATUS_ATTERR_CPS_PROC_ALR_IN_PROG       0x01FE  /**< ATT Common Profile and Service Error: Procedure Already in Progress. */\n#define BLE_GATT_STATUS_ATTERR_CPS_OUT_OF_RANGE           0x01FF  /**< ATT Common Profile and Service Error: Out Of Range. */\n/** @} */\n\n\n/** @defgroup BLE_GATT_CPF_FORMATS Characteristic Presentation Formats\n *  @note Found at http://developer.bluetooth.org/gatt/descriptors/Pages/DescriptorViewer.aspx?u=org.bluetooth.descriptor.gatt.characteristic_presentation_format.xml\n * @{ */\n#define BLE_GATT_CPF_FORMAT_RFU                 0x00 /**< Reserved For Future Use. */\n#define BLE_GATT_CPF_FORMAT_BOOLEAN             0x01 /**< Boolean. */\n#define BLE_GATT_CPF_FORMAT_2BIT                0x02 /**< Unsigned 2-bit integer. */\n#define BLE_GATT_CPF_FORMAT_NIBBLE              0x03 /**< Unsigned 4-bit integer. */\n#define BLE_GATT_CPF_FORMAT_UINT8               0x04 /**< Unsigned 8-bit integer. */\n#define BLE_GATT_CPF_FORMAT_UINT12              0x05 /**< Unsigned 12-bit integer. */\n#define BLE_GATT_CPF_FORMAT_UINT16              0x06 /**< Unsigned 16-bit integer. */\n#define BLE_GATT_CPF_FORMAT_UINT24              0x07 /**< Unsigned 24-bit integer. */\n#define BLE_GATT_CPF_FORMAT_UINT32              0x08 /**< Unsigned 32-bit integer. */\n#define BLE_GATT_CPF_FORMAT_UINT48              0x09 /**< Unsigned 48-bit integer. */\n#define BLE_GATT_CPF_FORMAT_UINT64              0x0A /**< Unsigned 64-bit integer. */\n#define BLE_GATT_CPF_FORMAT_UINT128             0x0B /**< Unsigned 128-bit integer. */\n#define BLE_GATT_CPF_FORMAT_SINT8               0x0C /**< Signed 2-bit integer. */\n#define BLE_GATT_CPF_FORMAT_SINT12              0x0D /**< Signed 12-bit integer. */\n#define BLE_GATT_CPF_FORMAT_SINT16              0x0E /**< Signed 16-bit integer. */\n#define BLE_GATT_CPF_FORMAT_SINT24              0x0F /**< Signed 24-bit integer. */\n#define BLE_GATT_CPF_FORMAT_SINT32              0x10 /**< Signed 32-bit integer. */\n#define BLE_GATT_CPF_FORMAT_SINT48              0x11 /**< Signed 48-bit integer. */\n#define BLE_GATT_CPF_FORMAT_SINT64              0x12 /**< Signed 64-bit integer. */\n#define BLE_GATT_CPF_FORMAT_SINT128             0x13 /**< Signed 128-bit integer. */\n#define BLE_GATT_CPF_FORMAT_FLOAT32             0x14 /**< IEEE-754 32-bit floating point. */\n#define BLE_GATT_CPF_FORMAT_FLOAT64             0x15 /**< IEEE-754 64-bit floating point. */\n#define BLE_GATT_CPF_FORMAT_SFLOAT              0x16 /**< IEEE-11073 16-bit SFLOAT. */\n#define BLE_GATT_CPF_FORMAT_FLOAT               0x17 /**< IEEE-11073 32-bit FLOAT. */\n#define BLE_GATT_CPF_FORMAT_DUINT16             0x18 /**< IEEE-20601 format. */\n#define BLE_GATT_CPF_FORMAT_UTF8S               0x19 /**< UTF-8 string. */\n#define BLE_GATT_CPF_FORMAT_UTF16S              0x1A /**< UTF-16 string. */\n#define BLE_GATT_CPF_FORMAT_STRUCT              0x1B /**< Opaque Structure. */\n/** @} */\n\n/** @defgroup BLE_GATT_CPF_NAMESPACES GATT Bluetooth Namespaces\n * @{\n */\n#define BLE_GATT_CPF_NAMESPACE_BTSIG            0x01 /**< Bluetooth SIG defined Namespace. */\n#define BLE_GATT_CPF_NAMESPACE_DESCRIPTION_UNKNOWN 0x0000 /**< Namespace Description Unknown. */\n/** @} */\n\n/** @} */\n\n/** @addtogroup BLE_GATT_STRUCTURES Structures\n * @{ */\n\n/**\n * @brief BLE GATT connection configuration parameters, set with @ref sd_ble_cfg_set.\n *\n * @retval ::NRF_ERROR_INVALID_PARAM att_mtu is smaller than @ref BLE_GATT_ATT_MTU_DEFAULT.\n */\ntypedef struct\n{\n  uint16_t  att_mtu;          /**< Maximum size of ATT packet the SoftDevice can send or receive.\n                                   The default and minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT.\n                                   @mscs\n                                   @mmsc{@ref BLE_GATTC_MTU_EXCHANGE}\n                                   @mmsc{@ref BLE_GATTS_MTU_EXCHANGE}\n                                   @endmscs\n                              */\n} ble_gatt_conn_cfg_t;\n\n/**@brief GATT Characteristic Properties. */\ntypedef struct\n{\n  /* Standard properties */\n  uint8_t broadcast       :1; /**< Broadcasting of the value permitted. */\n  uint8_t read            :1; /**< Reading the value permitted. */\n  uint8_t write_wo_resp   :1; /**< Writing the value with Write Command permitted. */\n  uint8_t write           :1; /**< Writing the value with Write Request permitted. */\n  uint8_t notify          :1; /**< Notification of the value permitted. */\n  uint8_t indicate        :1; /**< Indications of the value permitted. */\n  uint8_t auth_signed_wr  :1; /**< Writing the value with Signed Write Command permitted. */\n} ble_gatt_char_props_t;\n\n/**@brief GATT Characteristic Extended Properties. */\ntypedef struct\n{\n  /* Extended properties */\n  uint8_t reliable_wr     :1; /**< Writing the value with Queued Write operations permitted. */\n  uint8_t wr_aux          :1; /**< Writing the Characteristic User Description descriptor permitted. */\n} ble_gatt_char_ext_props_t;\n\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n#endif // BLE_GATT_H__\n\n/** @} */\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_gattc.h",
    "content": "/*\n * Copyright (c) 2011 - 2017, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_GATTC Generic Attribute Profile (GATT) Client\n  @{\n  @brief  Definitions and prototypes for the GATT Client interface.\n */\n\n#ifndef BLE_GATTC_H__\n#define BLE_GATTC_H__\n\n#include <stdint.h>\n#include \"nrf.h\"\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"ble_ranges.h\"\n#include \"ble_types.h\"\n#include \"ble_err.h\"\n#include \"ble_gatt.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @addtogroup BLE_GATTC_ENUMERATIONS Enumerations\n * @{ */\n\n/**@brief GATTC API SVC numbers. */\nenum BLE_GATTC_SVCS\n{\n  SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER = BLE_GATTC_SVC_BASE, /**< Primary Service Discovery. */\n  SD_BLE_GATTC_RELATIONSHIPS_DISCOVER,                         /**< Relationship Discovery. */\n  SD_BLE_GATTC_CHARACTERISTICS_DISCOVER,                       /**< Characteristic Discovery. */\n  SD_BLE_GATTC_DESCRIPTORS_DISCOVER,                           /**< Characteristic Descriptor Discovery. */\n  SD_BLE_GATTC_ATTR_INFO_DISCOVER,                             /**< Attribute Information Discovery. */\n  SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ,                        /**< Read Characteristic Value by UUID. */\n  SD_BLE_GATTC_READ,                                           /**< Generic read. */\n  SD_BLE_GATTC_CHAR_VALUES_READ,                               /**< Read multiple Characteristic Values. */\n  SD_BLE_GATTC_WRITE,                                          /**< Generic write. */\n  SD_BLE_GATTC_HV_CONFIRM,                                     /**< Handle Value Confirmation. */\n  SD_BLE_GATTC_EXCHANGE_MTU_REQUEST,                           /**< Exchange MTU Request. */\n};\n\n/**\n * @brief GATT Client Event IDs.\n */\nenum BLE_GATTC_EVTS\n{\n  BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP = BLE_GATTC_EVT_BASE,  /**< Primary Service Discovery Response event.          \\n See @ref ble_gattc_evt_prim_srvc_disc_rsp_t.          */\n  BLE_GATTC_EVT_REL_DISC_RSP,                             /**< Relationship Discovery Response event.             \\n See @ref ble_gattc_evt_rel_disc_rsp_t.                */\n  BLE_GATTC_EVT_CHAR_DISC_RSP,                            /**< Characteristic Discovery Response event.           \\n See @ref ble_gattc_evt_char_disc_rsp_t.               */\n  BLE_GATTC_EVT_DESC_DISC_RSP,                            /**< Descriptor Discovery Response event.               \\n See @ref ble_gattc_evt_desc_disc_rsp_t.               */\n  BLE_GATTC_EVT_ATTR_INFO_DISC_RSP,                       /**< Attribute Information Response event.              \\n See @ref ble_gattc_evt_attr_info_disc_rsp_t. */\n  BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP,                /**< Read By UUID Response event.                       \\n See @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t.   */\n  BLE_GATTC_EVT_READ_RSP,                                 /**< Read Response event.                               \\n See @ref ble_gattc_evt_read_rsp_t.                    */\n  BLE_GATTC_EVT_CHAR_VALS_READ_RSP,                       /**< Read multiple Response event.                      \\n See @ref ble_gattc_evt_char_vals_read_rsp_t.          */\n  BLE_GATTC_EVT_WRITE_RSP,                                /**< Write Response event.                              \\n See @ref ble_gattc_evt_write_rsp_t.                   */\n  BLE_GATTC_EVT_HVX,                                      /**< Handle Value Notification or Indication event.     \\n Confirm indication with @ref sd_ble_gattc_hv_confirm.  \\n See @ref ble_gattc_evt_hvx_t. */\n  BLE_GATTC_EVT_EXCHANGE_MTU_RSP,                         /**< Exchange MTU Response event.                       \\n See @ref ble_gattc_evt_exchange_mtu_rsp_t.            */\n  BLE_GATTC_EVT_TIMEOUT,                                  /**< Timeout event.                                     \\n See @ref ble_gattc_evt_timeout_t.                     */\n  BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE                     /**< Write without Response transmission complete.      \\n See @ref ble_gattc_evt_write_cmd_tx_complete_t.       */\n};\n\n/** @} */\n\n/** @addtogroup BLE_GATTC_DEFINES Defines\n * @{ */\n\n/** @defgroup BLE_ERRORS_GATTC SVC return values specific to GATTC\n * @{ */\n#define BLE_ERROR_GATTC_PROC_NOT_PERMITTED    (NRF_GATTC_ERR_BASE + 0x000) /**< Procedure not Permitted. */\n/** @} */\n\n/** @defgroup BLE_GATTC_ATTR_INFO_FORMAT Attribute Information Formats\n * @{ */\n#define BLE_GATTC_ATTR_INFO_FORMAT_16BIT    1 /**< 16-bit Attribute Information Format. */\n#define BLE_GATTC_ATTR_INFO_FORMAT_128BIT   2 /**< 128-bit Attribute Information Format. */\n/** @} */\n\n/** @defgroup BLE_GATTC_DEFAULTS GATT Client defaults\n * @{ */\n#define BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT  1 /**< Default number of Write without Response that can be queued for transmission. */\n/** @} */\n\n/** @} */\n\n/** @addtogroup BLE_GATTC_STRUCTURES Structures\n * @{ */\n\n/**\n * @brief BLE GATTC connection configuration parameters, set with @ref sd_ble_cfg_set.\n */\ntypedef struct\n{\n  uint8_t  write_cmd_tx_queue_size; /**< The guaranteed minimum number of Write without Response that can be queued for transmission.\n                                          The default value is @ref BLE_GATTC_WRITE_CMD_TX_QUEUE_SIZE_DEFAULT */\n} ble_gattc_conn_cfg_t;\n\n/**@brief Operation Handle Range. */\ntypedef struct\n{\n  uint16_t          start_handle; /**< Start Handle. */\n  uint16_t          end_handle;   /**< End Handle. */\n} ble_gattc_handle_range_t;\n\n\n/**@brief GATT service. */\ntypedef struct\n{\n  ble_uuid_t               uuid;          /**< Service UUID. */\n  ble_gattc_handle_range_t handle_range;  /**< Service Handle Range. */\n} ble_gattc_service_t;\n\n\n/**@brief  GATT include. */\ntypedef struct\n{\n  uint16_t            handle;           /**< Include Handle. */\n  ble_gattc_service_t included_srvc;    /**< Handle of the included service. */\n} ble_gattc_include_t;\n\n\n/**@brief GATT characteristic. */\ntypedef struct\n{\n  ble_uuid_t              uuid;                 /**< Characteristic UUID. */\n  ble_gatt_char_props_t   char_props;           /**< Characteristic Properties. */\n  uint8_t                 char_ext_props : 1;   /**< Extended properties present. */\n  uint16_t                handle_decl;          /**< Handle of the Characteristic Declaration. */\n  uint16_t                handle_value;         /**< Handle of the Characteristic Value. */\n} ble_gattc_char_t;\n\n\n/**@brief GATT descriptor. */\ntypedef struct\n{\n  uint16_t          handle;         /**< Descriptor Handle. */\n  ble_uuid_t        uuid;           /**< Descriptor UUID. */\n} ble_gattc_desc_t;\n\n\n/**@brief Write Parameters. */\ntypedef struct\n{\n  uint8_t        write_op;             /**< Write Operation to be performed, see @ref BLE_GATT_WRITE_OPS. */\n  uint8_t        flags;                /**< Flags, see @ref BLE_GATT_EXEC_WRITE_FLAGS. */\n  uint16_t       handle;               /**< Handle to the attribute to be written. */\n  uint16_t       offset;               /**< Offset in bytes. @note For WRITE_CMD and WRITE_REQ, offset must be 0. */\n  uint16_t       len;                  /**< Length of data in bytes. */\n  uint8_t const *p_value;              /**< Pointer to the value data. */\n} ble_gattc_write_params_t;\n\n/**@brief Attribute Information for 16-bit Attribute UUID. */\ntypedef struct\n{\n  uint16_t       handle;               /**< Attribute handle. */\n  ble_uuid_t     uuid;                 /**< 16-bit Attribute UUID. */\n} ble_gattc_attr_info16_t;\n\n/**@brief Attribute Information for 128-bit Attribute UUID. */\ntypedef struct\n{\n  uint16_t       handle;               /**< Attribute handle. */\n  ble_uuid128_t  uuid;                 /**< 128-bit Attribute UUID. */\n} ble_gattc_attr_info128_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP. */\ntypedef struct\n{\n  uint16_t             count;           /**< Service count. */\n  ble_gattc_service_t services[1];      /**< Service data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                             See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_prim_srvc_disc_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_REL_DISC_RSP. */\ntypedef struct\n{\n  uint16_t             count;           /**< Include count. */\n  ble_gattc_include_t includes[1];      /**< Include data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                             See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_rel_disc_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_DISC_RSP. */\ntypedef struct\n{\n  uint16_t            count;          /**< Characteristic count. */\n  ble_gattc_char_t    chars[1];       /**< Characteristic data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                           See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_char_disc_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_DESC_DISC_RSP. */\ntypedef struct\n{\n  uint16_t            count;          /**< Descriptor count. */\n  ble_gattc_desc_t    descs[1];       /**< Descriptor data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                           See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_desc_disc_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP. */\ntypedef struct\n{\n  uint16_t                     count;            /**< Attribute count. */\n  uint8_t                      format;           /**< Attribute information format, see @ref BLE_GATTC_ATTR_INFO_FORMAT. */\n  union {\n    ble_gattc_attr_info16_t  attr_info16[1];     /**< Attribute information for 16-bit Attribute UUID.\n                                                      @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                                      See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n    ble_gattc_attr_info128_t attr_info128[1];    /**< Attribute information for 128-bit Attribute UUID.\n                                                      @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                                      See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n  } info;                                        /**< Attribute information union. */\n} ble_gattc_evt_attr_info_disc_rsp_t;\n\n/**@brief GATT read by UUID handle value pair. */\ntypedef struct\n{\n  uint16_t            handle;          /**< Attribute Handle. */\n  uint8_t            *p_value;         /**< Pointer to the Attribute Value, length is available in @ref ble_gattc_evt_char_val_by_uuid_read_rsp_t::value_len. */\n} ble_gattc_handle_value_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP. */\ntypedef struct\n{\n  uint16_t                  count;            /**< Handle-Value Pair Count. */\n  uint16_t                  value_len;        /**< Length of the value in Handle-Value(s) list. */\n  uint8_t                   handle_value[1];  /**< Handle-Value(s) list. To iterate through the list use @ref sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter.\n                                                   @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                                   See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_char_val_by_uuid_read_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_READ_RSP. */\ntypedef struct\n{\n  uint16_t            handle;         /**< Attribute Handle. */\n  uint16_t            offset;         /**< Offset of the attribute data. */\n  uint16_t            len;            /**< Attribute data length. */\n  uint8_t             data[1];        /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                           See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_read_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP. */\ntypedef struct\n{\n  uint16_t            len;            /**< Concatenated Attribute values length. */\n  uint8_t             values[1];      /**< Attribute values. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                           See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_char_vals_read_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_RSP. */\ntypedef struct\n{\n  uint16_t            handle;           /**< Attribute Handle. */\n  uint8_t             write_op;         /**< Type of write operation, see @ref BLE_GATT_WRITE_OPS. */\n  uint16_t            offset;           /**< Data offset. */\n  uint16_t            len;              /**< Data length. */\n  uint8_t             data[1];          /**< Data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                             See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_write_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_HVX. */\ntypedef struct\n{\n  uint16_t            handle;         /**< Handle to which the HVx operation applies. */\n  uint8_t             type;           /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */\n  uint16_t            len;            /**< Attribute data length. */\n  uint8_t             data[1];        /**< Attribute data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                           See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gattc_evt_hvx_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP. */\ntypedef struct\n{\n  uint16_t          server_rx_mtu;            /**< Server RX MTU size. */\n} ble_gattc_evt_exchange_mtu_rsp_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_TIMEOUT. */\ntypedef struct\n{\n  uint8_t          src;                       /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */\n} ble_gattc_evt_timeout_t;\n\n/**@brief Event structure for @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE. */\ntypedef struct\n{\n  uint8_t             count;            /**< Number of write without response transmissions completed. */\n} ble_gattc_evt_write_cmd_tx_complete_t;\n\n/**@brief GATTC event structure. */\ntypedef struct\n{\n  uint16_t            conn_handle;                /**< Connection Handle on which event occurred. */\n  uint16_t            gatt_status;                /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */\n  uint16_t            error_handle;               /**< In case of error: The handle causing the error. In all other cases @ref BLE_GATT_HANDLE_INVALID. */\n  union\n  {\n    ble_gattc_evt_prim_srvc_disc_rsp_t          prim_srvc_disc_rsp;         /**< Primary Service Discovery Response Event Parameters. */\n    ble_gattc_evt_rel_disc_rsp_t                rel_disc_rsp;               /**< Relationship Discovery Response Event Parameters. */\n    ble_gattc_evt_char_disc_rsp_t               char_disc_rsp;              /**< Characteristic Discovery Response Event Parameters. */\n    ble_gattc_evt_desc_disc_rsp_t               desc_disc_rsp;              /**< Descriptor Discovery Response Event Parameters. */\n    ble_gattc_evt_char_val_by_uuid_read_rsp_t   char_val_by_uuid_read_rsp;  /**< Characteristic Value Read by UUID Response Event Parameters. */\n    ble_gattc_evt_read_rsp_t                    read_rsp;                   /**< Read Response Event Parameters. */\n    ble_gattc_evt_char_vals_read_rsp_t          char_vals_read_rsp;         /**< Characteristic Values Read Response Event Parameters. */\n    ble_gattc_evt_write_rsp_t                   write_rsp;                  /**< Write Response Event Parameters. */\n    ble_gattc_evt_hvx_t                         hvx;                        /**< Handle Value Notification/Indication Event Parameters. */\n    ble_gattc_evt_exchange_mtu_rsp_t            exchange_mtu_rsp;           /**< Exchange MTU Response Event Parameters. */\n    ble_gattc_evt_timeout_t                     timeout;                    /**< Timeout Event Parameters. */\n    ble_gattc_evt_attr_info_disc_rsp_t          attr_info_disc_rsp;         /**< Attribute Information Discovery Event Parameters. */\n    ble_gattc_evt_write_cmd_tx_complete_t       write_cmd_tx_complete;      /**< Write without Response transmission complete Event Parameters. */\n  } params;                                                                 /**< Event Parameters. @note Only valid if @ref gatt_status == @ref BLE_GATT_STATUS_SUCCESS. */\n} ble_gattc_evt_t;\n/** @} */\n\n/** @addtogroup BLE_GATTC_FUNCTIONS Functions\n * @{ */\n\n/**@brief Initiate or continue a GATT Primary Service Discovery procedure.\n *\n * @details This function initiates or resumes a Primary Service discovery procedure, starting from the supplied handle.\n *          If the last service has not been reached, this function must be called again with an updated start handle value to continue the search.\n *\n * @note If any of the discovered services have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with\n *       type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_PRIM_SRVC_DISC_RSP}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_PRIM_SRVC_DISC_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] start_handle Handle to start searching from.\n * @param[in] p_srvc_uuid Pointer to the service UUID to be found. If it is NULL, all primary services will be returned.\n *\n * @retval ::NRF_SUCCESS Successfully started or resumed the Primary Service Discovery procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_PRIMARY_SERVICES_DISCOVER, uint32_t, sd_ble_gattc_primary_services_discover(uint16_t conn_handle, uint16_t start_handle, ble_uuid_t const *p_srvc_uuid));\n\n\n/**@brief Initiate or continue a GATT Relationship Discovery procedure.\n *\n * @details This function initiates or resumes the Find Included Services sub-procedure. If the last included service has not been reached,\n *          this must be called again with an updated handle range to continue the search.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_REL_DISC_RSP}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_REL_DISC_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on.\n *\n * @retval ::NRF_SUCCESS Successfully started or resumed the Relationship Discovery procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_RELATIONSHIPS_DISCOVER, uint32_t, sd_ble_gattc_relationships_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range));\n\n\n/**@brief Initiate or continue a GATT Characteristic Discovery procedure.\n *\n * @details This function initiates or resumes a Characteristic discovery procedure. If the last Characteristic has not been reached,\n *          this must be called again with an updated handle range to continue the discovery.\n *\n * @note If any of the discovered characteristics have 128-bit UUIDs which are not present in the table provided to ble_vs_uuids_assign, a UUID structure with\n *       type @ref BLE_UUID_TYPE_UNKNOWN will be received in the corresponding event.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_CHAR_DISC_RSP}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_CHAR_DISC_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] p_handle_range A pointer to the range of handles of the Service to perform this procedure on.\n *\n * @retval ::NRF_SUCCESS Successfully started or resumed the Characteristic Discovery procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_CHARACTERISTICS_DISCOVER, uint32_t, sd_ble_gattc_characteristics_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range));\n\n\n/**@brief Initiate or continue a GATT Characteristic Descriptor Discovery procedure.\n *\n * @details This function initiates or resumes a Characteristic Descriptor discovery procedure. If the last Descriptor has not been reached,\n *          this must be called again with an updated handle range to continue the discovery.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_DESC_DISC_RSP}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_DESC_DISC_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] p_handle_range A pointer to the range of handles of the Characteristic to perform this procedure on.\n *\n * @retval ::NRF_SUCCESS Successfully started or resumed the Descriptor Discovery procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_DESCRIPTORS_DISCOVER, uint32_t, sd_ble_gattc_descriptors_discover(uint16_t conn_handle, ble_gattc_handle_range_t const *p_handle_range));\n\n\n/**@brief Initiate or continue a GATT Read using Characteristic UUID procedure.\n *\n * @details This function initiates or resumes a Read using Characteristic UUID procedure. If the last Characteristic has not been reached,\n *          this must be called again with an updated handle range to continue the discovery.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_READ_UUID_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] p_uuid Pointer to a Characteristic value UUID to read.\n * @param[in] p_handle_range A pointer to the range of handles to perform this procedure on.\n *\n * @retval ::NRF_SUCCESS Successfully started or resumed the Read using Characteristic UUID procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_CHAR_VALUE_BY_UUID_READ, uint32_t, sd_ble_gattc_char_value_by_uuid_read(uint16_t conn_handle, ble_uuid_t const *p_uuid, ble_gattc_handle_range_t const *p_handle_range));\n\n\n/**@brief Initiate or continue a GATT Read (Long) Characteristic or Descriptor procedure.\n *\n * @details This function initiates or resumes a GATT Read (Long) Characteristic or Descriptor procedure. If the Characteristic or Descriptor\n *          to be read is longer than ATT_MTU - 1, this function must be called multiple times with appropriate offset to read the\n *          complete value.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_READ_RSP}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_VALUE_READ_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] handle The handle of the attribute to be read.\n * @param[in] offset Offset into the attribute value to be read.\n *\n * @retval ::NRF_SUCCESS Successfully started or resumed the Read (Long) procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_READ, uint32_t, sd_ble_gattc_read(uint16_t conn_handle, uint16_t handle, uint16_t offset));\n\n\n/**@brief Initiate a GATT Read Multiple Characteristic Values procedure.\n *\n * @details This function initiates a GATT Read Multiple Characteristic Values procedure.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_CHAR_VALS_READ_RSP}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_READ_MULT_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] p_handles A pointer to the handle(s) of the attribute(s) to be read.\n * @param[in] handle_count The number of handles in p_handles.\n *\n * @retval ::NRF_SUCCESS Successfully started the Read Multiple Characteristic Values procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_CHAR_VALUES_READ, uint32_t, sd_ble_gattc_char_values_read(uint16_t conn_handle, uint16_t const *p_handles, uint16_t handle_count));\n\n\n/**@brief Perform a Write (Characteristic Value or Descriptor, with or without response, signed or not, long or reliable) procedure.\n *\n * @details This function can perform all write procedures described in GATT.\n *\n * @note    Only one write with response procedure can be ongoing per connection at a time.\n *          If the application tries to write with response while another write with response procedure is ongoing,\n *          the function call will return @ref NRF_ERROR_BUSY.\n *          A @ref BLE_GATTC_EVT_WRITE_RSP event will be issued as soon as the write response arrives from the peer.\n *\n * @note    The number of Write without Response that can be queued is configured by @ref ble_gattc_conn_cfg_t::write_cmd_tx_queue_size\n *          When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES.\n *          A @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event will be issued as soon as the transmission of the write without response is complete.\n *\n * @note    The application can keep track of the available queue element count for writes without responses by following the procedure below:\n *          - Store initial queue element count in a variable.\n *          - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS.\n *          - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE, Write without response transmission complete.}\n * @event{@ref BLE_GATTC_EVT_WRITE_RSP, Write response received from the peer.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_VALUE_WRITE_WITHOUT_RESP_MSC}\n * @mmsc{@ref BLE_GATTC_VALUE_WRITE_MSC}\n * @mmsc{@ref BLE_GATTC_VALUE_LONG_WRITE_MSC}\n * @mmsc{@ref BLE_GATTC_VALUE_RELIABLE_WRITE_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] p_write_params A pointer to a write parameters structure.\n *\n * @retval ::NRF_SUCCESS Successfully started the Write procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied.\n * @retval ::NRF_ERROR_BUSY For write with response, procedure already in progress. Wait for a @ref BLE_GATTC_EVT_WRITE_RSP event and retry.\n * @retval ::NRF_ERROR_RESOURCES Too many writes without responses queued.\n *                               Wait for a @ref BLE_GATTC_EVT_WRITE_CMD_TX_COMPLETE event and retry.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_WRITE, uint32_t, sd_ble_gattc_write(uint16_t conn_handle, ble_gattc_write_params_t const *p_write_params));\n\n\n/**@brief Send a Handle Value Confirmation to the GATT Server.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_HVI_MSC}\n * @endmscs\n *\n * @param[in] conn_handle The connection handle identifying the connection to perform this procedure on.\n * @param[in] handle The handle of the attribute in the indication.\n *\n * @retval ::NRF_SUCCESS Successfully queued the Handle Value Confirmation for transmission.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no Indication pending to be confirmed.\n * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_HV_CONFIRM, uint32_t, sd_ble_gattc_hv_confirm(uint16_t conn_handle, uint16_t handle));\n\n/**@brief Discovers information about a range of attributes on a GATT server.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_ATTR_INFO_DISC_RSP, Generated when information about a range of attributes has been received.}\n * @endevents\n *\n * @param[in] conn_handle    The connection handle identifying the connection to perform this procedure on.\n * @param[in] p_handle_range The range of handles to request information about.\n *\n * @retval ::NRF_SUCCESS Successfully started an attribute information discovery procedure.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state\n * @retval ::NRF_ERROR_INVALID_ADDR  Invalid pointer supplied.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_ATTR_INFO_DISCOVER, uint32_t, sd_ble_gattc_attr_info_discover(uint16_t conn_handle, ble_gattc_handle_range_t const * p_handle_range));\n\n/**@brief Start an ATT_MTU exchange by sending an Exchange MTU Request to the server.\n *\n * @details The SoftDevice sets ATT_MTU to the minimum of:\n *          - The Client RX MTU value, and\n *          - The Server RX MTU value from @ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP.\n *\n *          However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT.\n *\n * @events\n * @event{@ref BLE_GATTC_EVT_EXCHANGE_MTU_RSP}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTC_MTU_EXCHANGE}\n * @endmscs\n *\n * @param[in] conn_handle    The connection handle identifying the connection to perform this procedure on.\n * @param[in] client_rx_mtu  Client RX MTU size.\n *                           - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT.\n *                           - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration\n                               used for this connection.\n *                           - The value must be equal to Server RX MTU size given in @ref sd_ble_gatts_exchange_mtu_reply\n *                             if an ATT_MTU exchange has already been performed in the other direction.\n *\n * @retval ::NRF_SUCCESS Successfully sent request to the server.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid connection state or an ATT_MTU exchange was already requested once.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid Client RX MTU size supplied.\n * @retval ::NRF_ERROR_BUSY Client procedure already in progress.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTC_EXCHANGE_MTU_REQUEST, uint32_t, sd_ble_gattc_exchange_mtu_request(uint16_t conn_handle, uint16_t client_rx_mtu));\n\n/**@brief Iterate through Handle-Value(s) list in @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event.\n *\n * @param[in] p_gattc_evt  Pointer to event buffer containing @ref BLE_GATTC_EVT_CHAR_VAL_BY_UUID_READ_RSP event.\n *                         @note If the buffer contains different event, behavior is undefined.\n * @param[in,out] p_iter   Iterator, points to @ref ble_gattc_handle_value_t structure that will be filled in with\n *                         the next Handle-Value pair in each iteration. If the function returns other than\n *                         @ref NRF_SUCCESS, it will not be changed.\n *                         - To start iteration, initialize the structure to zero.\n *                         - To continue, pass the value from previous iteration.\n *\n * \\code\n * ble_gattc_handle_value_t iter;\n * memset(&iter, 0, sizeof(ble_gattc_handle_value_t));\n * while (sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(&ble_evt.evt.gattc_evt, &iter) == NRF_SUCCESS)\n * {\n *   app_handle = iter.handle;\n *   memcpy(app_value, iter.p_value, ble_evt.evt.gattc_evt.params.char_val_by_uuid_read_rsp.value_len);\n * }\n * \\endcode\n *\n * @retval ::NRF_SUCCESS Successfully retrieved the next Handle-Value pair.\n * @retval ::NRF_ERROR_NOT_FOUND No more Handle-Value pairs available in the list.\n */\n__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter);\n\n/** @} */\n\n#ifndef SUPPRESS_INLINE_IMPLEMENTATION\n\n__STATIC_INLINE uint32_t sd_ble_gattc_evt_char_val_by_uuid_read_rsp_iter(ble_gattc_evt_t *p_gattc_evt, ble_gattc_handle_value_t *p_iter)\n{\n  uint32_t value_len = p_gattc_evt->params.char_val_by_uuid_read_rsp.value_len;\n  uint8_t *p_first = p_gattc_evt->params.char_val_by_uuid_read_rsp.handle_value;\n  uint8_t *p_next = p_iter->p_value ? p_iter->p_value + value_len : p_first;\n\n  if ((p_next - p_first) / (sizeof(uint16_t) + value_len) < p_gattc_evt->params.char_val_by_uuid_read_rsp.count)\n  {\n    p_iter->handle = (uint16_t)p_next[1] << 8 | p_next[0];\n    p_iter->p_value = p_next + sizeof(uint16_t);\n    return NRF_SUCCESS;\n  }\n  else\n  {\n    return NRF_ERROR_NOT_FOUND;\n  }\n}\n\n#endif /* SUPPRESS_INLINE_IMPLEMENTATION */\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* BLE_GATTC_H__ */\n\n/**\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_gatts.h",
    "content": "/*\n * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_GATTS Generic Attribute Profile (GATT) Server\n  @{\n  @brief  Definitions and prototypes for the GATTS interface.\n */\n\n#ifndef BLE_GATTS_H__\n#define BLE_GATTS_H__\n\n#include <stdint.h>\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"ble_hci.h\"\n#include \"ble_ranges.h\"\n#include \"ble_types.h\"\n#include \"ble_err.h\"\n#include \"ble_gatt.h\"\n#include \"ble_gap.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @addtogroup BLE_GATTS_ENUMERATIONS Enumerations\n * @{ */\n\n/**\n * @brief GATTS API SVC numbers.\n */\nenum BLE_GATTS_SVCS\n{\n  SD_BLE_GATTS_SERVICE_ADD = BLE_GATTS_SVC_BASE, /**< Add a service. */\n  SD_BLE_GATTS_INCLUDE_ADD,                      /**< Add an included service. */\n  SD_BLE_GATTS_CHARACTERISTIC_ADD,               /**< Add a characteristic. */\n  SD_BLE_GATTS_DESCRIPTOR_ADD,                   /**< Add a generic attribute. */\n  SD_BLE_GATTS_VALUE_SET,                        /**< Set an attribute value. */\n  SD_BLE_GATTS_VALUE_GET,                        /**< Get an attribute value. */\n  SD_BLE_GATTS_HVX,                              /**< Handle Value Notification or Indication. */\n  SD_BLE_GATTS_SERVICE_CHANGED,                  /**< Perform a Service Changed Indication to one or more peers. */\n  SD_BLE_GATTS_RW_AUTHORIZE_REPLY,               /**< Reply to an authorization request for a read or write operation on one or more attributes. */\n  SD_BLE_GATTS_SYS_ATTR_SET,                     /**< Set the persistent system attributes for a connection. */\n  SD_BLE_GATTS_SYS_ATTR_GET,                     /**< Retrieve the persistent system attributes. */\n  SD_BLE_GATTS_INITIAL_USER_HANDLE_GET,          /**< Retrieve the first valid user handle. */\n  SD_BLE_GATTS_ATTR_GET,                         /**< Retrieve the UUID and/or metadata of an attribute. */\n  SD_BLE_GATTS_EXCHANGE_MTU_REPLY                /**< Reply to Exchange MTU Request. */\n};\n\n/**\n * @brief GATT Server Event IDs.\n */\nenum BLE_GATTS_EVTS\n{\n  BLE_GATTS_EVT_WRITE = BLE_GATTS_EVT_BASE,       /**< Write operation performed.                                           \\n See @ref ble_gatts_evt_write_t.                 */\n  BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST,             /**< Read/Write Authorization request.                                    \\n Reply with @ref sd_ble_gatts_rw_authorize_reply. \\n See @ref ble_gatts_evt_rw_authorize_request_t. */\n  BLE_GATTS_EVT_SYS_ATTR_MISSING,                 /**< A persistent system attribute access is pending.                     \\n Respond with @ref sd_ble_gatts_sys_attr_set.     \\n See @ref ble_gatts_evt_sys_attr_missing_t.     */\n  BLE_GATTS_EVT_HVC,                              /**< Handle Value Confirmation.                                           \\n See @ref ble_gatts_evt_hvc_t.                   */\n  BLE_GATTS_EVT_SC_CONFIRM,                       /**< Service Changed Confirmation.                                        \\n No additional event structure applies.          */\n  BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST,             /**< Exchange MTU Request.                                                \\n Reply with @ref sd_ble_gatts_exchange_mtu_reply. \\n See @ref ble_gatts_evt_exchange_mtu_request_t. */\n  BLE_GATTS_EVT_TIMEOUT,                          /**< Peer failed to respond to an ATT request in time.                    \\n See @ref ble_gatts_evt_timeout_t.               */\n  BLE_GATTS_EVT_HVN_TX_COMPLETE                   /**< Handle Value Notification transmission complete.                     \\n See @ref ble_gatts_evt_hvn_tx_complete_t.       */\n};\n\n/**@brief GATTS Configuration IDs.\n *\n * IDs that uniquely identify a GATTS configuration.\n */\nenum BLE_GATTS_CFGS\n{\n  BLE_GATTS_CFG_SERVICE_CHANGED = BLE_GATTS_CFG_BASE, /**< Service changed configuration. */\n  BLE_GATTS_CFG_ATTR_TAB_SIZE,                        /**< Attribute table size configuration. */\n};\n\n/** @} */\n\n/** @addtogroup BLE_GATTS_DEFINES Defines\n * @{ */\n\n/** @defgroup BLE_ERRORS_GATTS SVC return values specific to GATTS\n * @{ */\n#define BLE_ERROR_GATTS_INVALID_ATTR_TYPE   (NRF_GATTS_ERR_BASE + 0x000) /**< Invalid attribute type. */\n#define BLE_ERROR_GATTS_SYS_ATTR_MISSING    (NRF_GATTS_ERR_BASE + 0x001) /**< System Attributes missing. */\n/** @} */\n\n/** @defgroup BLE_GATTS_ATTR_LENS_MAX Maximum attribute lengths\n * @{ */\n#define BLE_GATTS_FIX_ATTR_LEN_MAX (510)  /**< Maximum length for fixed length Attribute Values. */\n#define BLE_GATTS_VAR_ATTR_LEN_MAX (512)  /**< Maximum length for variable length Attribute Values. */\n/** @} */\n\n/** @defgroup BLE_GATTS_SRVC_TYPES GATT Server Service Types\n * @{ */\n#define BLE_GATTS_SRVC_TYPE_INVALID          0x00  /**< Invalid Service Type. */\n#define BLE_GATTS_SRVC_TYPE_PRIMARY          0x01  /**< Primary Service. */\n#define BLE_GATTS_SRVC_TYPE_SECONDARY        0x02  /**< Secondary Type. */\n/** @} */\n\n\n/** @defgroup BLE_GATTS_ATTR_TYPES GATT Server Attribute Types\n * @{ */\n#define BLE_GATTS_ATTR_TYPE_INVALID         0x00  /**< Invalid Attribute Type. */\n#define BLE_GATTS_ATTR_TYPE_PRIM_SRVC_DECL  0x01  /**< Primary Service Declaration. */\n#define BLE_GATTS_ATTR_TYPE_SEC_SRVC_DECL   0x02  /**< Secondary Service Declaration. */\n#define BLE_GATTS_ATTR_TYPE_INC_DECL        0x03  /**< Include Declaration. */\n#define BLE_GATTS_ATTR_TYPE_CHAR_DECL       0x04  /**< Characteristic Declaration. */\n#define BLE_GATTS_ATTR_TYPE_CHAR_VAL        0x05  /**< Characteristic Value. */\n#define BLE_GATTS_ATTR_TYPE_DESC            0x06  /**< Descriptor. */\n#define BLE_GATTS_ATTR_TYPE_OTHER           0x07  /**< Other, non-GATT specific type. */\n/** @} */\n\n\n/** @defgroup BLE_GATTS_OPS GATT Server Operations\n * @{ */\n#define BLE_GATTS_OP_INVALID                0x00  /**< Invalid Operation. */\n#define BLE_GATTS_OP_WRITE_REQ              0x01  /**< Write Request. */\n#define BLE_GATTS_OP_WRITE_CMD              0x02  /**< Write Command. */\n#define BLE_GATTS_OP_SIGN_WRITE_CMD         0x03  /**< Signed Write Command. */\n#define BLE_GATTS_OP_PREP_WRITE_REQ         0x04  /**< Prepare Write Request. */\n#define BLE_GATTS_OP_EXEC_WRITE_REQ_CANCEL  0x05  /**< Execute Write Request: Cancel all prepared writes. */\n#define BLE_GATTS_OP_EXEC_WRITE_REQ_NOW     0x06  /**< Execute Write Request: Immediately execute all prepared writes. */\n/** @} */\n\n/** @defgroup BLE_GATTS_VLOCS GATT Value Locations\n * @{ */\n#define BLE_GATTS_VLOC_INVALID       0x00  /**< Invalid Location. */\n#define BLE_GATTS_VLOC_STACK         0x01  /**< Attribute Value is located in stack memory, no user memory is required. */\n#define BLE_GATTS_VLOC_USER          0x02  /**< Attribute Value is located in user memory. This requires the user to maintain a valid buffer through the lifetime of the attribute, since the stack\n                                                will read and write directly to the memory using the pointer provided in the APIs. There are no alignment requirements for the buffer. */\n/** @} */\n\n/** @defgroup BLE_GATTS_AUTHORIZE_TYPES GATT Server Authorization Types\n * @{ */\n#define BLE_GATTS_AUTHORIZE_TYPE_INVALID    0x00  /**< Invalid Type. */\n#define BLE_GATTS_AUTHORIZE_TYPE_READ       0x01  /**< Authorize a Read Operation. */\n#define BLE_GATTS_AUTHORIZE_TYPE_WRITE      0x02  /**< Authorize a Write Request Operation. */\n/** @} */\n\n/** @defgroup BLE_GATTS_SYS_ATTR_FLAGS System Attribute Flags\n * @{ */\n#define BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS (1 << 0)  /**< Restrict system attributes to system services only. */\n#define BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS (1 << 1)  /**< Restrict system attributes to user services only. */\n/** @} */\n\n/** @defgroup BLE_GATTS_SERVICE_CHANGED Service Changed Inclusion Values\n * @{\n */\n#define BLE_GATTS_SERVICE_CHANGED_DEFAULT   (1)   /**< Default is to include the Service Changed characteristic in the Attribute Table. */\n/** @} */\n\n/** @defgroup BLE_GATTS_ATTR_TAB_SIZE Attribute Table size\n * @{\n */\n#define BLE_GATTS_ATTR_TAB_SIZE_MIN         (248)  /**< Minimum Attribute Table size */\n#define BLE_GATTS_ATTR_TAB_SIZE_DEFAULT     (1408) /**< Default Attribute Table size. */\n/** @} */\n\n/** @defgroup BLE_GATTS_DEFAULTS GATT Server defaults\n * @{\n */\n#define BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT  1 /**< Default number of Handle Value Notifications that can be queued for transmission. */\n/** @} */\n\n/** @} */\n\n/** @addtogroup BLE_GATTS_STRUCTURES Structures\n * @{ */\n\n/**\n * @brief BLE GATTS connection configuration parameters, set with @ref sd_ble_cfg_set.\n */\ntypedef struct\n{\n  uint8_t  hvn_tx_queue_size; /**< Minimum guaranteed number of Handle Value Notifications that can be queued for transmission.\n                                    The default value is @ref BLE_GATTS_HVN_TX_QUEUE_SIZE_DEFAULT */\n} ble_gatts_conn_cfg_t;\n\n/**@brief Attribute metadata. */\ntypedef struct\n{\n  ble_gap_conn_sec_mode_t read_perm;       /**< Read permissions. */\n  ble_gap_conn_sec_mode_t write_perm;      /**< Write permissions. */\n  uint8_t                 vlen       :1;   /**< Variable length attribute. */\n  uint8_t                 vloc       :2;   /**< Value location, see @ref BLE_GATTS_VLOCS.*/\n  uint8_t                 rd_auth    :1;   /**< Read authorization and value will be requested from the application on every read operation. */\n  uint8_t                 wr_auth    :1;   /**< Write authorization will be requested from the application on every Write Request operation (but not Write Command). */\n} ble_gatts_attr_md_t;\n\n\n/**@brief GATT Attribute. */\ntypedef struct\n{\n  ble_uuid_t const          *p_uuid;        /**< Pointer to the attribute UUID. */\n  ble_gatts_attr_md_t const *p_attr_md;     /**< Pointer to the attribute metadata structure. */\n  uint16_t                   init_len;      /**< Initial attribute value length in bytes. */\n  uint16_t                   init_offs;     /**< Initial attribute value offset in bytes. If different from zero, the first init_offs bytes of the attribute value will be left uninitialized. */\n  uint16_t                   max_len;       /**< Maximum attribute value length in bytes, see @ref BLE_GATTS_ATTR_LENS_MAX for maximum values. */\n  uint8_t                   *p_value;       /**< Pointer to the attribute data. Please note that if the @ref BLE_GATTS_VLOC_USER value location is selected in the attribute metadata, this will have to point to a buffer\n                                                 that remains valid through the lifetime of the attribute. This excludes usage of automatic variables that may go out of scope or any other temporary location.\n                                                 The stack may access that memory directly without the application's knowledge. For writable characteristics, this value must not be a location in flash memory.*/\n} ble_gatts_attr_t;\n\n/**@brief GATT Attribute Value. */\ntypedef struct\n{\n  uint16_t  len;        /**< Length in bytes to be written or read. Length in bytes written or read after successful return.*/\n  uint16_t  offset;     /**< Attribute value offset. */\n  uint8_t  *p_value;    /**< Pointer to where value is stored or will be stored.\n                             If value is stored in user memory, only the attribute length is updated when p_value == NULL.\n                             Set to NULL when reading to obtain the complete length of the attribute value */\n} ble_gatts_value_t;\n\n\n/**@brief GATT Characteristic Presentation Format. */\ntypedef struct\n{\n  uint8_t          format;      /**< Format of the value, see @ref BLE_GATT_CPF_FORMATS. */\n  int8_t           exponent;    /**< Exponent for integer data types. */\n  uint16_t         unit;        /**< Unit from Bluetooth Assigned Numbers. */\n  uint8_t          name_space;  /**< Namespace from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */\n  uint16_t         desc;        /**< Namespace description from Bluetooth Assigned Numbers, see @ref BLE_GATT_CPF_NAMESPACES. */\n} ble_gatts_char_pf_t;\n\n\n/**@brief GATT Characteristic metadata. */\ntypedef struct\n{\n  ble_gatt_char_props_t       char_props;               /**< Characteristic Properties. */\n  ble_gatt_char_ext_props_t   char_ext_props;           /**< Characteristic Extended Properties. */\n  uint8_t const              *p_char_user_desc;         /**< Pointer to a UTF-8 encoded string (non-NULL terminated), NULL if the descriptor is not required. */\n  uint16_t                    char_user_desc_max_size;  /**< The maximum size in bytes of the user description descriptor. */\n  uint16_t                    char_user_desc_size;      /**< The size of the user description, must be smaller or equal to char_user_desc_max_size. */\n  ble_gatts_char_pf_t const  *p_char_pf;                /**< Pointer to a presentation format structure or NULL if the CPF descriptor is not required. */\n  ble_gatts_attr_md_t const  *p_user_desc_md;           /**< Attribute metadata for the User Description descriptor, or NULL for default values. */\n  ble_gatts_attr_md_t const  *p_cccd_md;                /**< Attribute metadata for the Client Characteristic Configuration Descriptor, or NULL for default values. */\n  ble_gatts_attr_md_t const  *p_sccd_md;                /**< Attribute metadata for the Server Characteristic Configuration Descriptor, or NULL for default values. */\n} ble_gatts_char_md_t;\n\n\n/**@brief GATT Characteristic Definition Handles. */\ntypedef struct\n{\n  uint16_t          value_handle;       /**< Handle to the characteristic value. */\n  uint16_t          user_desc_handle;   /**< Handle to the User Description descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */\n  uint16_t          cccd_handle;        /**< Handle to the Client Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */\n  uint16_t          sccd_handle;        /**< Handle to the Server Characteristic Configuration Descriptor, or @ref BLE_GATT_HANDLE_INVALID if not present. */\n} ble_gatts_char_handles_t;\n\n\n/**@brief GATT HVx parameters. */\ntypedef struct\n{\n  uint16_t          handle;             /**< Characteristic Value Handle. */\n  uint8_t           type;               /**< Indication or Notification, see @ref BLE_GATT_HVX_TYPES. */\n  uint16_t          offset;             /**< Offset within the attribute value. */\n  uint16_t         *p_len;              /**< Length in bytes to be written, length in bytes written after return. */\n  uint8_t const    *p_data;             /**< Actual data content, use NULL to use the current attribute value. */\n} ble_gatts_hvx_params_t;\n\n/**@brief GATT Authorization parameters. */\ntypedef struct\n{\n  uint16_t          gatt_status;        /**< GATT status code for the operation, see @ref BLE_GATT_STATUS_CODES. */\n  uint8_t           update : 1;         /**< If set, data supplied in p_data will be used to update the attribute value.\n                                             Please note that for @ref BLE_GATTS_AUTHORIZE_TYPE_WRITE operations this bit must always be set,\n                                             as the data to be written needs to be stored and later provided by the application. */\n  uint16_t          offset;             /**< Offset of the attribute value being updated. */\n  uint16_t          len;                /**< Length in bytes of the value in p_data pointer, see @ref BLE_GATTS_ATTR_LENS_MAX. */\n  uint8_t const    *p_data;             /**< Pointer to new value used to update the attribute value. */\n} ble_gatts_authorize_params_t;\n\n/**@brief GATT Read or Write Authorize Reply parameters. */\ntypedef struct\n{\n  uint8_t                               type;   /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */\n  union {\n    ble_gatts_authorize_params_t        read;   /**< Read authorization parameters. */\n    ble_gatts_authorize_params_t        write;  /**< Write authorization parameters. */\n  } params;                                     /**< Reply Parameters. */\n} ble_gatts_rw_authorize_reply_params_t;\n\n/**@brief Service Changed Inclusion configuration parameters, set with @ref sd_ble_cfg_set. */\ntypedef struct\n{\n  uint8_t service_changed : 1;       /**< If 1, include the Service Changed characteristic in the Attribute Table. Default is @ref BLE_GATTS_SERVICE_CHANGED_DEFAULT. */\n} ble_gatts_cfg_service_changed_t;\n\n/**@brief Attribute table size configuration parameters, set with @ref sd_ble_cfg_set.\n *\n * @retval ::NRF_ERROR_INVALID_LENGTH One or more of the following is true:\n *                                    - The specified Attribute Table size is too small.\n *                                      The minimum acceptable size is defined by @ref BLE_GATTS_ATTR_TAB_SIZE_MIN.\n *                                    - The specified Attribute Table size is not a multiple of 4.\n */\ntypedef struct\n{\n  uint32_t attr_tab_size; /**< Attribute table size. Default is @ref BLE_GATTS_ATTR_TAB_SIZE_DEFAULT, minimum is @ref BLE_GATTS_ATTR_TAB_SIZE_MIN. */\n} ble_gatts_cfg_attr_tab_size_t;\n\n/**@brief Config structure for GATTS configurations. */\ntypedef union\n{\n  ble_gatts_cfg_service_changed_t service_changed;  /**< Include service changed characteristic, cfg_id is @ref BLE_GATTS_CFG_SERVICE_CHANGED. */\n  ble_gatts_cfg_attr_tab_size_t attr_tab_size;      /**< Attribute table size, cfg_id is @ref BLE_GATTS_CFG_ATTR_TAB_SIZE. */\n} ble_gatts_cfg_t;\n\n\n/**@brief Event structure for @ref BLE_GATTS_EVT_WRITE. */\ntypedef struct\n{\n  uint16_t                    handle;             /**< Attribute Handle. */\n  ble_uuid_t                  uuid;               /**< Attribute UUID. */\n  uint8_t                     op;                 /**< Type of write operation, see @ref BLE_GATTS_OPS. */\n  uint8_t                     auth_required;      /**< Writing operation deferred due to authorization requirement. Application may use @ref sd_ble_gatts_value_set to finalize the writing operation. */\n  uint16_t                    offset;             /**< Offset for the write operation. */\n  uint16_t                    len;                /**< Length of the received data. */\n  uint8_t                     data[1];            /**< Received data. @note This is a variable length array. The size of 1 indicated is only a placeholder for compilation.\n                                                       See @ref sd_ble_evt_get for more information on how to use event structures with variable length array members. */\n} ble_gatts_evt_write_t;\n\n/**@brief Event substructure for authorized read requests, see @ref ble_gatts_evt_rw_authorize_request_t. */\ntypedef struct\n{\n  uint16_t                    handle;             /**< Attribute Handle. */\n  ble_uuid_t                  uuid;               /**< Attribute UUID. */\n  uint16_t                    offset;             /**< Offset for the read operation. */\n} ble_gatts_evt_read_t;\n\n/**@brief Event structure for @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST. */\ntypedef struct\n{\n  uint8_t                     type;             /**< Type of authorize operation, see @ref BLE_GATTS_AUTHORIZE_TYPES. */\n  union {\n    ble_gatts_evt_read_t      read;             /**< Attribute Read Parameters. */\n    ble_gatts_evt_write_t     write;            /**< Attribute Write Parameters. */\n  } request;                                    /**< Request Parameters. */\n} ble_gatts_evt_rw_authorize_request_t;\n\n/**@brief Event structure for @ref BLE_GATTS_EVT_SYS_ATTR_MISSING. */\ntypedef struct\n{\n  uint8_t hint;                                 /**< Hint (currently unused). */\n} ble_gatts_evt_sys_attr_missing_t;\n\n\n/**@brief Event structure for @ref BLE_GATTS_EVT_HVC. */\ntypedef struct\n{\n  uint16_t          handle;                       /**< Attribute Handle. */\n} ble_gatts_evt_hvc_t;\n\n/**@brief Event structure for @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST. */\ntypedef struct\n{\n  uint16_t          client_rx_mtu;              /**< Client RX MTU size. */\n} ble_gatts_evt_exchange_mtu_request_t;\n\n/**@brief Event structure for @ref BLE_GATTS_EVT_TIMEOUT. */\ntypedef struct\n{\n  uint8_t          src;                       /**< Timeout source, see @ref BLE_GATT_TIMEOUT_SOURCES. */\n} ble_gatts_evt_timeout_t;\n\n/**@brief Event structure for @ref BLE_GATTS_EVT_HVN_TX_COMPLETE. */\ntypedef struct\n{\n  uint8_t          count;                     /**< Number of notification transmissions completed. */\n} ble_gatts_evt_hvn_tx_complete_t;\n\n/**@brief GATTS event structure. */\ntypedef struct\n{\n  uint16_t conn_handle;                                       /**< Connection Handle on which the event occurred. */\n  union\n  {\n    ble_gatts_evt_write_t                 write;                 /**< Write Event Parameters. */\n    ble_gatts_evt_rw_authorize_request_t  authorize_request;     /**< Read or Write Authorize Request Parameters. */\n    ble_gatts_evt_sys_attr_missing_t      sys_attr_missing;      /**< System attributes missing. */\n    ble_gatts_evt_hvc_t                   hvc;                   /**< Handle Value Confirmation Event Parameters. */\n    ble_gatts_evt_exchange_mtu_request_t  exchange_mtu_request;  /**< Exchange MTU Request Event Parameters. */\n    ble_gatts_evt_timeout_t               timeout;               /**< Timeout Event. */\n    ble_gatts_evt_hvn_tx_complete_t       hvn_tx_complete;       /**< Handle Value Notification transmission complete Event Parameters. */\n  } params;                                                      /**< Event Parameters. */\n} ble_gatts_evt_t;\n\n/** @} */\n\n/** @addtogroup BLE_GATTS_FUNCTIONS Functions\n * @{ */\n\n/**@brief Add a service declaration to the Attribute Table.\n *\n * @note Secondary Services are only relevant in the context of the entity that references them, it is therefore forbidden to\n *       add a secondary service declaration that is not referenced by another service later in the Attribute Table.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC}\n * @endmscs\n *\n * @param[in] type      Toggles between primary and secondary services, see @ref BLE_GATTS_SRVC_TYPES.\n * @param[in] p_uuid    Pointer to service UUID.\n * @param[out] p_handle Pointer to a 16-bit word where the assigned handle will be stored.\n *\n * @retval ::NRF_SUCCESS Successfully added a service declaration.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, Vendor Specific UUIDs need to be present in the table.\n * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack.\n * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation.\n */\nSVCALL(SD_BLE_GATTS_SERVICE_ADD, uint32_t, sd_ble_gatts_service_add(uint8_t type, ble_uuid_t const *p_uuid, uint16_t *p_handle));\n\n\n/**@brief Add an include declaration to the Attribute Table.\n *\n * @note It is currently only possible to add an include declaration to the last added service (i.e. only sequential population is supported at this time).\n *\n * @note The included service must already be present in the Attribute Table prior to this call.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC}\n * @endmscs\n *\n * @param[in] service_handle    Handle of the service where the included service is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially.\n * @param[in] inc_srvc_handle   Handle of the included service.\n * @param[out] p_include_handle Pointer to a 16-bit word where the assigned handle will be stored.\n *\n * @retval ::NRF_SUCCESS Successfully added an include declaration.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, handle values need to match previously added services.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required.\n * @retval ::NRF_ERROR_NOT_SUPPORTED Feature is not supported, service_handle must be that of the last added service.\n * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, self inclusions are not allowed.\n * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation.\n * @retval ::NRF_ERROR_NOT_FOUND Attribute not found.\n */\nSVCALL(SD_BLE_GATTS_INCLUDE_ADD, uint32_t, sd_ble_gatts_include_add(uint16_t service_handle, uint16_t inc_srvc_handle, uint16_t *p_include_handle));\n\n\n/**@brief Add a characteristic declaration, a characteristic value declaration and optional characteristic descriptor declarations to the Attribute Table.\n *\n * @note It is currently only possible to add a characteristic to the last added service (i.e. only sequential population is supported at this time).\n *\n * @note Several restrictions apply to the parameters, such as matching permissions between the user description descriptor and the writable auxiliaries bits,\n *       readable (no security) and writable (selectable) CCCDs and SCCDs and valid presentation format values.\n *\n * @note If no metadata is provided for the optional descriptors, their permissions will be derived from the characteristic permissions.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC}\n * @endmscs\n *\n * @param[in] service_handle    Handle of the service where the characteristic is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially.\n * @param[in] p_char_md         Characteristic metadata.\n * @param[in] p_attr_char_value Pointer to the attribute structure corresponding to the characteristic value.\n * @param[out] p_handles        Pointer to the structure where the assigned handles will be stored.\n *\n * @retval ::NRF_SUCCESS Successfully added a characteristic.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, service handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a service context is required.\n * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack.\n * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation.\n * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX.\n */\nSVCALL(SD_BLE_GATTS_CHARACTERISTIC_ADD, uint32_t, sd_ble_gatts_characteristic_add(uint16_t service_handle, ble_gatts_char_md_t const *p_char_md, ble_gatts_attr_t const *p_attr_char_value, ble_gatts_char_handles_t *p_handles));\n\n\n/**@brief Add a descriptor to the Attribute Table.\n *\n * @note It is currently only possible to add a descriptor to the last added characteristic (i.e. only sequential population is supported at this time).\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_ATT_TABLE_POP_MSC}\n * @endmscs\n *\n * @param[in] char_handle   Handle of the characteristic where the descriptor is to be placed, if @ref BLE_GATT_HANDLE_INVALID is used, it will be placed sequentially.\n * @param[in] p_attr        Pointer to the attribute structure.\n * @param[out] p_handle     Pointer to a 16-bit word where the assigned handle will be stored.\n *\n * @retval ::NRF_SUCCESS Successfully added a descriptor.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied, characteristic handle, Vendor Specific UUIDs, lengths, and permissions need to adhere to the constraints.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid state to perform operation, a characteristic context is required.\n * @retval ::NRF_ERROR_FORBIDDEN Forbidden value supplied, certain UUIDs are reserved for the stack.\n * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation.\n * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX.\n */\nSVCALL(SD_BLE_GATTS_DESCRIPTOR_ADD, uint32_t, sd_ble_gatts_descriptor_add(uint16_t char_handle, ble_gatts_attr_t const *p_attr, uint16_t *p_handle));\n\n/**@brief Set the value of a given attribute.\n *\n * @note Values other than system attributes can be set at any time, regardless of whether any active connections exist.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC}\n * @endmscs\n *\n * @param[in] conn_handle  Connection handle. Ignored if the value does not belong to a system attribute.\n * @param[in] handle       Attribute handle.\n * @param[in,out] p_value  Attribute value information.\n *\n * @retval ::NRF_SUCCESS Successfully set the value of the attribute.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_NOT_FOUND Attribute not found.\n * @retval ::NRF_ERROR_FORBIDDEN Forbidden handle supplied, certain attributes are not modifiable by the application.\n * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied, attribute lengths are restricted by @ref BLE_GATTS_ATTR_LENS_MAX.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute.\n */\nSVCALL(SD_BLE_GATTS_VALUE_SET, uint32_t, sd_ble_gatts_value_set(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value));\n\n/**@brief Get the value of a given attribute.\n *\n * @note                 If the attribute value is longer than the size of the supplied buffer,\n *                       @ref ble_gatts_value_t::len will return the total attribute value length (excluding offset),\n *                       and not the number of bytes actually returned in @ref ble_gatts_value_t::p_value.\n *                       The application may use this information to allocate a suitable buffer size.\n *\n * @note                 When retrieving system attribute values with this function, the connection handle\n *                       may refer to an already disconnected connection. Refer to the documentation of\n *                       @ref sd_ble_gatts_sys_attr_get for further information.\n *\n * @param[in] conn_handle  Connection handle. Ignored if the value does not belong to a system attribute.\n * @param[in] handle       Attribute handle.\n * @param[in,out] p_value  Attribute value information.\n *\n * @retval ::NRF_SUCCESS Successfully retrieved the value of the attribute.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_NOT_FOUND Attribute not found.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid attribute offset supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid connection handle supplied on a system attribute.\n * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value.\n */\nSVCALL(SD_BLE_GATTS_VALUE_GET, uint32_t, sd_ble_gatts_value_get(uint16_t conn_handle, uint16_t handle, ble_gatts_value_t *p_value));\n\n/**@brief Notify or Indicate an attribute value.\n *\n * @details This function checks for the relevant Client Characteristic Configuration descriptor value to verify that the relevant operation\n *          (notification or indication) has been enabled by the client. It is also able to update the attribute value before issuing the PDU, so that\n *          the application can atomically perform a value update and a server initiated transaction with a single API call.\n *\n * @note    The local attribute value may be updated even if an outgoing packet is not sent to the peer due to an error during execution.\n *          The Attribute Table has been updated if one of the following error codes is returned: @ref NRF_ERROR_INVALID_STATE, @ref NRF_ERROR_BUSY,\n *          @ref NRF_ERROR_FORBIDDEN, @ref BLE_ERROR_GATTS_SYS_ATTR_MISSING and @ref NRF_ERROR_RESOURCES.\n *          The caller can check whether the value has been updated by looking at the contents of *(@ref ble_gatts_hvx_params_t::p_len).\n *\n * @note    Only one indication procedure can be ongoing per connection at a time.\n *          If the application tries to indicate an attribute value while another indication procedure is ongoing,\n *          the function call will return @ref NRF_ERROR_BUSY.\n *          A @ref BLE_GATTS_EVT_HVC event will be issued as soon as the confirmation arrives from the peer.\n *\n * @note    The number of Handle Value Notifications that can be queued is configured by @ref ble_gatts_conn_cfg_t::hvn_tx_queue_size\n *          When the queue is full, the function call will return @ref NRF_ERROR_RESOURCES.\n *          A @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event will be issued as soon as the transmission of the notification is complete.\n *\n * @note    The application can keep track of the available queue element count for notifications by following the procedure below:\n *          - Store initial queue element count in a variable.\n *          - Decrement the variable, which stores the currently available queue element count, by one when a call to this function returns @ref NRF_SUCCESS.\n *          - Increment the variable, which stores the current available queue element count, by the count variable in @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event.\n *\n * @events\n * @event{@ref BLE_GATTS_EVT_HVN_TX_COMPLETE, Notification transmission complete.}\n * @event{@ref BLE_GATTS_EVT_HVC, Confirmation received from the peer.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC}\n * @mmsc{@ref BLE_GATTS_HVN_MSC}\n * @mmsc{@ref BLE_GATTS_HVI_MSC}\n * @mmsc{@ref BLE_GATTS_HVX_DISABLED_MSC}\n * @endmscs\n *\n * @param[in] conn_handle      Connection handle.\n * @param[in,out] p_hvx_params Pointer to an HVx parameters structure. If @ref ble_gatts_hvx_params_t::p_data\n *                             contains a non-NULL pointer the attribute value will be updated with the contents\n *                             pointed by it before sending the notification or indication. If the attribute value\n *                             is updated, @ref ble_gatts_hvx_params_t::p_len is updated by the SoftDevice to\n *                             contain the number of actual bytes written, else it will be set to 0.\n *\n * @retval ::NRF_SUCCESS Successfully queued a notification or indication for transmission, and optionally updated the attribute value.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true:\n *                                   - Invalid Connection State\n *                                   - Notifications and/or indications not enabled in the CCCD\n *                                   - An ATT_MTU exchange is ongoing\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied. Only attributes added directly by the application are available to notify and indicate.\n * @retval ::BLE_ERROR_GATTS_INVALID_ATTR_TYPE Invalid attribute type(s) supplied, only characteristic values may be notified and indicated.\n * @retval ::NRF_ERROR_NOT_FOUND Attribute not found.\n * @retval ::NRF_ERROR_FORBIDDEN The connection's current security level is lower than the one required by the write permissions of the CCCD associated with this characteristic.\n * @retval ::NRF_ERROR_DATA_SIZE Invalid data size(s) supplied.\n * @retval ::NRF_ERROR_BUSY For @ref BLE_GATT_HVX_INDICATION Procedure already in progress. Wait for a @ref BLE_GATTS_EVT_HVC event and retry.\n * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value.\n * @retval ::NRF_ERROR_RESOURCES Too many notifications queued.\n *                               Wait for a @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event and retry.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTS_HVX, uint32_t, sd_ble_gatts_hvx(uint16_t conn_handle, ble_gatts_hvx_params_t const *p_hvx_params));\n\n/**@brief Indicate the Service Changed attribute value.\n *\n * @details This call will send a Handle Value Indication to one or more peers connected to inform them that the Attribute\n *          Table layout has changed. As soon as the peer has confirmed the indication, a @ref BLE_GATTS_EVT_SC_CONFIRM event will\n *          be issued.\n *\n * @note    Some of the restrictions and limitations that apply to @ref sd_ble_gatts_hvx also apply here.\n *\n * @events\n * @event{@ref BLE_GATTS_EVT_SC_CONFIRM, Confirmation of attribute table change received from peer.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_SC_MSC}\n * @endmscs\n *\n * @param[in] conn_handle  Connection handle.\n * @param[in] start_handle Start of affected attribute handle range.\n * @param[in] end_handle   End of affected attribute handle range.\n *\n * @retval ::NRF_SUCCESS Successfully queued the Service Changed indication for transmission.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_NOT_SUPPORTED Service Changed not enabled at initialization. See @ref\n *                                   sd_ble_cfg_set and @ref ble_gatts_cfg_service_changed_t.\n * @retval ::NRF_ERROR_INVALID_STATE One or more of the following is true:\n *                                   - Invalid Connection State\n *                                   - Notifications and/or indications not enabled in the CCCD\n *                                   - An ATT_MTU exchange is ongoing\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameter(s) supplied.\n * @retval ::BLE_ERROR_INVALID_ATTR_HANDLE Invalid attribute handle(s) supplied, handles must be in the range populated by the application.\n * @retval ::NRF_ERROR_BUSY Procedure already in progress.\n * @retval ::BLE_ERROR_GATTS_SYS_ATTR_MISSING System attributes missing, use @ref sd_ble_gatts_sys_attr_set to set them to a known value.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTS_SERVICE_CHANGED, uint32_t, sd_ble_gatts_service_changed(uint16_t conn_handle, uint16_t start_handle, uint16_t end_handle));\n\n/**@brief Respond to a Read/Write authorization request.\n *\n * @note This call should only be used as a response to a @ref BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event issued to the application.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_AUTH_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_BUF_AUTH_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_NOBUF_NOAUTH_MSC}\n * @mmsc{@ref BLE_GATTS_READ_REQ_AUTH_MSC}\n * @mmsc{@ref BLE_GATTS_WRITE_REQ_AUTH_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_QUEUE_FULL_MSC}\n * @mmsc{@ref BLE_GATTS_QUEUED_WRITE_PEER_CANCEL_MSC}\n * @endmscs\n *\n * @param[in] conn_handle                 Connection handle.\n * @param[in] p_rw_authorize_reply_params Pointer to a structure with the attribute provided by the application.\n *\n * @note @ref ble_gatts_authorize_params_t::p_data is ignored when this function is used to respond\n *       to a @ref BLE_GATTS_AUTHORIZE_TYPE_READ event if @ref ble_gatts_authorize_params_t::update\n *       is set to 0.\n *\n * @retval ::NRF_SUCCESS               Successfully queued a response to the peer, and in the case of a write operation, Attribute Table updated.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_BUSY            The stack is busy, process pending events and retry.\n * @retval ::NRF_ERROR_INVALID_ADDR    Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_STATE   Invalid Connection State or no authorization request pending.\n * @retval ::NRF_ERROR_INVALID_PARAM   Authorization op invalid,\n *                                         handle supplied does not match requested handle,\n *                                         or invalid data to be written provided by the application.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTS_RW_AUTHORIZE_REPLY, uint32_t, sd_ble_gatts_rw_authorize_reply(uint16_t conn_handle, ble_gatts_rw_authorize_reply_params_t const *p_rw_authorize_reply_params));\n\n\n/**@brief Update persistent system attribute information.\n *\n * @details Supply information about persistent system attributes to the stack,\n *          previously obtained using @ref sd_ble_gatts_sys_attr_get.\n *          This call is only allowed for active connections, and is usually\n *          made immediately after a connection is established with an known bonded device,\n *          often as a response to a @ref BLE_GATTS_EVT_SYS_ATTR_MISSING.\n *\n *          p_sysattrs may point directly to the application's stored copy of the system attributes\n *          obtained using @ref sd_ble_gatts_sys_attr_get.\n *          If the pointer is NULL, the system attribute info is initialized, assuming that\n *          the application does not have any previously saved system attribute data for this device.\n *\n * @note The state of persistent system attributes is reset upon connection establishment and then remembered for its duration.\n *\n * @note If this call returns with an error code different from @ref NRF_SUCCESS, the storage of persistent system attributes may have been completed only partially.\n *       This means that the state of the attribute table is undefined, and the application should either provide a new set of attributes using this same call or\n *       reset the SoftDevice to return to a known state.\n *\n * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be modified.\n * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be modified.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_HVX_SYS_ATTRS_MISSING_MSC}\n * @mmsc{@ref BLE_GATTS_SYS_ATTRS_UNK_PEER_MSC}\n * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC}\n * @endmscs\n *\n * @param[in]  conn_handle        Connection handle.\n * @param[in]  p_sys_attr_data    Pointer to a saved copy of system attributes supplied to the stack, or NULL.\n * @param[in]  len                Size of data pointed by p_sys_attr_data, in octets.\n * @param[in]  flags              Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS\n *\n * @retval ::NRF_SUCCESS Successfully set the system attribute information.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied.\n * @retval ::NRF_ERROR_INVALID_DATA Invalid data supplied, the data should be exactly the same as retrieved with @ref sd_ble_gatts_sys_attr_get.\n * @retval ::NRF_ERROR_NO_MEM Not enough memory to complete operation.\n */\nSVCALL(SD_BLE_GATTS_SYS_ATTR_SET, uint32_t, sd_ble_gatts_sys_attr_set(uint16_t conn_handle, uint8_t const *p_sys_attr_data, uint16_t len, uint32_t flags));\n\n\n/**@brief Retrieve persistent system attribute information from the stack.\n *\n * @details This call is used to retrieve information about values to be stored persistently by the application\n *          during the lifetime of a connection or after it has been terminated. When a new connection is established with the same bonded device,\n *          the system attribute information retrieved with this function should be restored using using @ref sd_ble_gatts_sys_attr_set.\n *          If retrieved after disconnection, the data should be read before a new connection established. The connection handle for\n *          the previous, now disconnected, connection will remain valid until a new one is created to allow this API call to refer to it.\n *          Connection handles belonging to active connections can be used as well, but care should be taken since the system attributes\n *          may be written to at any time by the peer during a connection's lifetime.\n *\n * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_SYS_SRVCS is used with this function, only the system attributes included in system services will be returned.\n * @note When the @ref BLE_GATTS_SYS_ATTR_FLAG_USR_SRVCS is used with this function, only the system attributes included in user services will be returned.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_SYS_ATTRS_BONDED_PEER_MSC}\n * @endmscs\n *\n * @param[in]     conn_handle       Connection handle of the recently terminated connection.\n * @param[out]    p_sys_attr_data   Pointer to a buffer where updated information about system attributes will be filled in. The format of the data is described\n *                                  in @ref BLE_GATTS_SYS_ATTRS_FORMAT. NULL can be provided to obtain the length of the data.\n * @param[in,out] p_len             Size of application buffer if p_sys_attr_data is not NULL. Unconditionally updated to actual length of system attribute data.\n * @param[in]     flags             Optional additional flags, see @ref BLE_GATTS_SYS_ATTR_FLAGS\n *\n * @retval ::NRF_SUCCESS Successfully retrieved the system attribute information.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid flags supplied.\n * @retval ::NRF_ERROR_DATA_SIZE The system attribute information did not fit into the provided buffer.\n * @retval ::NRF_ERROR_NOT_FOUND No system attributes found.\n */\nSVCALL(SD_BLE_GATTS_SYS_ATTR_GET, uint32_t, sd_ble_gatts_sys_attr_get(uint16_t conn_handle, uint8_t *p_sys_attr_data, uint16_t *p_len, uint32_t flags));\n\n\n/**@brief Retrieve the first valid user attribute handle.\n *\n * @param[out] p_handle   Pointer to an integer where the handle will be stored.\n *\n * @retval ::NRF_SUCCESS Successfully retrieved the handle.\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n */\nSVCALL(SD_BLE_GATTS_INITIAL_USER_HANDLE_GET, uint32_t, sd_ble_gatts_initial_user_handle_get(uint16_t *p_handle));\n\n/**@brief Retrieve the attribute UUID and/or metadata.\n *\n * @param[in]  handle Attribute handle\n * @param[out] p_uuid UUID of the attribute. Use NULL to omit this field.\n * @param[out] p_md Metadata of the attribute. Use NULL to omit this field.\n *\n * @retval ::NRF_SUCCESS Successfully retrieved the attribute metadata,\n * @retval ::NRF_ERROR_INVALID_ADDR Invalid pointer supplied.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid parameters supplied. Returned when both @c p_uuid and @c p_md are NULL.\n * @retval ::NRF_ERROR_NOT_FOUND Attribute was not found.\n */\nSVCALL(SD_BLE_GATTS_ATTR_GET, uint32_t, sd_ble_gatts_attr_get(uint16_t handle, ble_uuid_t * p_uuid, ble_gatts_attr_md_t * p_md));\n\n/**@brief Reply to an ATT_MTU exchange request by sending an Exchange MTU Response to the client.\n *\n * @details This function is only used to reply to a @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST event.\n *\n * @details The SoftDevice sets ATT_MTU to the minimum of:\n *          - The Client RX MTU value from @ref BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST, and\n *          - The Server RX MTU value.\n *\n *          However, the SoftDevice never sets ATT_MTU lower than @ref BLE_GATT_ATT_MTU_DEFAULT.\n *\n * @mscs\n * @mmsc{@ref BLE_GATTS_MTU_EXCHANGE}\n * @endmscs\n *\n * @param[in] conn_handle    The connection handle identifying the connection to perform this procedure on.\n * @param[in] server_rx_mtu  Server RX MTU size.\n *                           - The minimum value is @ref BLE_GATT_ATT_MTU_DEFAULT.\n *                           - The maximum value is @ref ble_gatt_conn_cfg_t::att_mtu in the connection configuration\n *                             used for this connection.\n *                           - The value must be equal to Client RX MTU size given in @ref sd_ble_gattc_exchange_mtu_request\n *                             if an ATT_MTU exchange has already been performed in the other direction.\n *\n * @retval ::NRF_SUCCESS Successfully sent response to the client.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE Invalid Connection State or no ATT_MTU exchange request pending.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid Server RX MTU size supplied.\n * @retval ::NRF_ERROR_TIMEOUT There has been a GATT procedure timeout. No new GATT procedure can be performed without reestablishing the connection.\n */\nSVCALL(SD_BLE_GATTS_EXCHANGE_MTU_REPLY, uint32_t, sd_ble_gatts_exchange_mtu_reply(uint16_t conn_handle, uint16_t server_rx_mtu));\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n#endif // BLE_GATTS_H__\n\n/**\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_hci.h",
    "content": "/*\n * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_COMMON\n  @{\n*/\n\n\n#ifndef BLE_HCI_H__\n#define BLE_HCI_H__\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @defgroup BLE_HCI_STATUS_CODES Bluetooth status codes\n * @{ */\n\n#define BLE_HCI_STATUS_CODE_SUCCESS                        0x00   /**< Success. */\n#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND           0x01   /**< Unknown BLE Command. */\n#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER  0x02   /**< Unknown Connection Identifier. */\n/*0x03 Hardware Failure\n0x04 Page Timeout\n*/\n#define BLE_HCI_AUTHENTICATION_FAILURE                     0x05   /**< Authentication Failure. */\n#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING             0x06   /**< Pin or Key missing. */\n#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED                   0x07   /**< Memory Capacity Exceeded. */\n#define BLE_HCI_CONNECTION_TIMEOUT                         0x08   /**< Connection Timeout. */\n/*0x09 Connection Limit Exceeded\n0x0A Synchronous Connection Limit To A Device Exceeded\n0x0B ACL Connection Already Exists*/\n#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED             0x0C   /**< Command Disallowed. */\n/*0x0D Connection Rejected due to Limited Resources\n0x0E Connection Rejected Due To Security Reasons\n0x0F Connection Rejected due to Unacceptable BD_ADDR\n0x10 Connection Accept Timeout Exceeded\n0x11 Unsupported Feature or Parameter Value*/\n#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12  /**< Invalid BLE Command Parameters. */\n#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION           0x13  /**< Remote User Terminated Connection. */\n#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14  /**< Remote Device Terminated Connection due to low resources.*/\n#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF     0x15  /**< Remote Device Terminated Connection due to power off. */\n#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION            0x16  /**< Local Host Terminated Connection. */\n/*\n0x17 Repeated Attempts\n0x18 Pairing Not Allowed\n0x19 Unknown LMP PDU\n*/\n#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A                   /**< Unsupported Remote Feature. */\n/*\n0x1B SCO Offset Rejected\n0x1C SCO Interval Rejected\n0x1D SCO Air Mode Rejected*/\n#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS     0x1E       /**< Invalid LMP Parameters. */\n#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR          0x1F       /**< Unspecified Error. */\n/*0x20 Unsupported LMP Parameter Value\n0x21 Role Change Not Allowed\n*/\n#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT            0x22       /**< LMP Response Timeout. */\n#define BLE_HCI_STATUS_CODE_LMP_ERROR_TRANSACTION_COLLISION 0x23  /**< LMP Error Transaction Collision/LL Procedure Collision. */\n#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED             0x24       /**< LMP PDU Not Allowed. */\n/*0x25 Encryption Mode Not Acceptable\n0x26 Link Key Can Not be Changed\n0x27 Requested QoS Not Supported\n*/\n#define BLE_HCI_INSTANT_PASSED                         0x28       /**< Instant Passed. */\n#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED      0x29       /**< Pairing with Unit Key Unsupported. */\n#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION        0x2A       /**< Different Transaction Collision. */\n/*\n0x2B Reserved\n0x2C QoS Unacceptable Parameter\n0x2D QoS Rejected\n0x2E Channel Classification Not Supported\n0x2F Insufficient Security\n*/\n#define BLE_HCI_PARAMETER_OUT_OF_MANDATORY_RANGE       0x30            /**< Parameter Out Of Mandatory Range. */\n/*\n0x31 Reserved\n0x32 Role Switch Pending\n0x33 Reserved\n0x34 Reserved Slot Violation\n0x35 Role Switch Failed\n0x36 Extended Inquiry Response Too Large\n0x37 Secure Simple Pairing Not Supported By Host.\n0x38 Host Busy - Pairing\n0x39 Connection Rejected due to No Suitable Channel Found*/\n#define BLE_HCI_CONTROLLER_BUSY                        0x3A       /**< Controller Busy. */\n#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE             0x3B       /**< Connection Interval Unacceptable. */\n#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT            0x3C       /**< Directed Advertisement Timeout. */\n#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE     0x3D       /**< Connection Terminated due to MIC Failure. */\n#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED          0x3E       /**< Connection Failed to be Established. */\n\n/** @} */\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif // BLE_HCI_H__\n\n/** @} */\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_l2cap.h",
    "content": "/*\n * Copyright (c) 2011 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_L2CAP Logical Link Control and Adaptation Protocol (L2CAP)\n  @{\n  @brief Definitions and prototypes for the L2CAP interface.\n */\n\n#ifndef BLE_L2CAP_H__\n#define BLE_L2CAP_H__\n\n#include <stdint.h>\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"ble_ranges.h\"\n#include \"ble_types.h\"\n#include \"ble_err.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**@addtogroup BLE_L2CAP_TERMINOLOGY Terminology\n * @{\n * @details\n *\n * L2CAP SDU\n * - A data unit that the application can send/receive to/from a peer.\n *\n * L2CAP PDU\n * - A data unit that is exchanged between local and remote L2CAP entities.\n *   It consists of L2CAP protocol control information and payload fields.\n *   The payload field can contain an L2CAP SDU or a part of an L2CAP SDU.\n *\n * L2CAP MTU\n * - The maximum length of an L2CAP SDU.\n *\n * L2CAP MPS\n * - The maximum length of an L2CAP PDU payload field.\n *\n * Credits\n * - A value indicating the number of L2CAP PDUs that the receiver of the credit can send to the peer.\n * @} */\n\n/**@addtogroup BLE_L2CAP_ENUMERATIONS Enumerations\n * @{ */\n\n/**@brief L2CAP API SVC numbers. */\nenum BLE_L2CAP_SVCS\n{\n  SD_BLE_L2CAP_CH_SETUP        = BLE_L2CAP_SVC_BASE + 0, /**< Set up an L2CAP channel. */\n  SD_BLE_L2CAP_CH_RELEASE      = BLE_L2CAP_SVC_BASE + 1, /**< Release an L2CAP channel. */\n  SD_BLE_L2CAP_CH_RX           = BLE_L2CAP_SVC_BASE + 2, /**< Receive an SDU on an L2CAP channel. */\n  SD_BLE_L2CAP_CH_TX           = BLE_L2CAP_SVC_BASE + 3, /**< Transmit an SDU on an L2CAP channel. */\n  SD_BLE_L2CAP_CH_FLOW_CONTROL = BLE_L2CAP_SVC_BASE + 4, /**< Advanced SDU reception flow control. */\n};\n\n/**@brief L2CAP Event IDs. */\nenum BLE_L2CAP_EVTS\n{\n  BLE_L2CAP_EVT_CH_SETUP_REQUEST    = BLE_L2CAP_EVT_BASE + 0,    /**< L2CAP Channel Setup Request event.\n                                                                   \\n See @ref ble_l2cap_evt_ch_setup_request_t. */\n  BLE_L2CAP_EVT_CH_SETUP_REFUSED    = BLE_L2CAP_EVT_BASE + 1,    /**< L2CAP Channel Setup Refused event.\n                                                                   \\n See @ref ble_l2cap_evt_ch_setup_refused_t. */\n  BLE_L2CAP_EVT_CH_SETUP            = BLE_L2CAP_EVT_BASE + 2,    /**< L2CAP Channel Setup Completed event.\n                                                                   \\n See @ref ble_l2cap_evt_ch_setup_t. */\n  BLE_L2CAP_EVT_CH_RELEASED         = BLE_L2CAP_EVT_BASE + 3,    /**< L2CAP Channel Released event.\n                                                                   \\n No additional event structure applies. */\n  BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED = BLE_L2CAP_EVT_BASE + 4,    /**< L2CAP Channel SDU data buffer released event.\n                                                                   \\n See @ref ble_l2cap_evt_ch_sdu_buf_released_t. */\n  BLE_L2CAP_EVT_CH_CREDIT           = BLE_L2CAP_EVT_BASE + 5,    /**< L2CAP Channel Credit received.\n                                                                   \\n See @ref ble_l2cap_evt_ch_credit_t. */\n  BLE_L2CAP_EVT_CH_RX               = BLE_L2CAP_EVT_BASE + 6,    /**< L2CAP Channel SDU received.\n                                                                   \\n See @ref ble_l2cap_evt_ch_rx_t. */\n  BLE_L2CAP_EVT_CH_TX               = BLE_L2CAP_EVT_BASE + 7,   /**< L2CAP Channel SDU transmitted.\n                                                                   \\n See @ref ble_l2cap_evt_ch_tx_t. */\n};\n\n/** @} */\n\n/**@addtogroup BLE_L2CAP_DEFINES Defines\n * @{ */\n\n/**@brief Maximum number of L2CAP channels per connection. */\n#define BLE_L2CAP_CH_COUNT_MAX    (64)\n\n/**@brief Minimum L2CAP MTU, in bytes. */\n#define BLE_L2CAP_MTU_MIN         (23)\n\n/**@brief Minimum L2CAP MPS, in bytes. */\n#define BLE_L2CAP_MPS_MIN         (23)\n\n/**@brief Invalid CID. */\n#define BLE_L2CAP_CID_INVALID     (0x0000)\n\n/**@brief Default number of credits for @ref sd_ble_l2cap_ch_flow_control. */\n#define BLE_L2CAP_CREDITS_DEFAULT (1)\n\n/**@defgroup BLE_L2CAP_CH_SETUP_REFUSED_SRCS L2CAP channel setup refused sources\n * @{ */\n#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_LOCAL            (0x01)    /**< Local. */\n#define BLE_L2CAP_CH_SETUP_REFUSED_SRC_REMOTE           (0x02)    /**< Remote. */\n /** @}  */\n\n /** @defgroup BLE_L2CAP_CH_STATUS_CODES L2CAP channel status codes\n * @{ */\n#define BLE_L2CAP_CH_STATUS_CODE_SUCCESS                (0x0000)  /**< Success. */\n#define BLE_L2CAP_CH_STATUS_CODE_LE_PSM_NOT_SUPPORTED   (0x0002)  /**< LE_PSM not supported. */\n#define BLE_L2CAP_CH_STATUS_CODE_NO_RESOURCES           (0x0004)  /**< No resources available. */\n#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHENTICATION  (0x0005)  /**< Insufficient authentication. */\n#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_AUTHORIZATION   (0x0006)  /**< Insufficient authorization. */\n#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC_KEY_SIZE    (0x0007)  /**< Insufficient encryption key size. */\n#define BLE_L2CAP_CH_STATUS_CODE_INSUFF_ENC             (0x0008)  /**< Insufficient encryption. */\n#define BLE_L2CAP_CH_STATUS_CODE_INVALID_SCID           (0x0009)  /**< Invalid Source CID. */\n#define BLE_L2CAP_CH_STATUS_CODE_SCID_ALLOCATED         (0x000A)  /**< Source CID already allocated. */\n#define BLE_L2CAP_CH_STATUS_CODE_UNACCEPTABLE_PARAMS    (0x000B)  /**< Unacceptable parameters. */\n#define BLE_L2CAP_CH_STATUS_CODE_NOT_UNDERSTOOD         (0x8000)  /**< Command Reject received instead of LE Credit Based Connection Response. */\n#define BLE_L2CAP_CH_STATUS_CODE_TIMEOUT                (0xC000)  /**< Operation timed out. */\n/** @} */\n\n/** @} */\n\n/**@addtogroup BLE_L2CAP_STRUCTURES Structures\n * @{ */\n\n/**\n * @brief BLE L2CAP connection configuration parameters, set with @ref sd_ble_cfg_set.\n *\n * @note  These parameters are set per connection, so all L2CAP channels created on this connection\n *        will have the same parameters.\n *\n * @retval ::NRF_ERROR_INVALID_PARAM  One or more of the following is true:\n *                                    - rx_mps is smaller than @ref BLE_L2CAP_MPS_MIN.\n *                                    - tx_mps is smaller than @ref BLE_L2CAP_MPS_MIN.\n *                                    - ch_count is greater than @ref BLE_L2CAP_CH_COUNT_MAX.\n * @retval ::NRF_ERROR_NO_MEM         rx_mps or tx_mps is set too high.\n */\ntypedef struct\n{\n  uint16_t    rx_mps;        /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall\n                                  be able to receive on L2CAP channels on connections with this\n                                  configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */\n  uint16_t    tx_mps;        /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall\n                                  be able to transmit on L2CAP channels on connections with this\n                                  configuration. The minimum value is @ref BLE_L2CAP_MPS_MIN. */\n  uint8_t     rx_queue_size; /**< Number of SDU data buffers that can be queued for reception per\n                                  L2CAP channel. The minimum value is one. */\n  uint8_t     tx_queue_size; /**< Number of SDU data buffers that can be queued for transmission\n                                  per L2CAP channel. The minimum value is one. */\n  uint8_t     ch_count;      /**< Number of L2CAP channels the application can create per connection\n                                  with this configuration. The default value is zero, the maximum\n                                  value is @ref BLE_L2CAP_CH_COUNT_MAX.\n                                  @note if this parameter is set to zero, all other parameters in\n                                  @ref ble_l2cap_conn_cfg_t are ignored. */\n} ble_l2cap_conn_cfg_t;\n\n/**@brief L2CAP channel RX parameters. */\ntypedef struct\n{\n  uint16_t    rx_mtu;        /**< The maximum L2CAP SDU size, in bytes, that L2CAP shall be able to\n                                  receive on this L2CAP channel.\n                                  - Must be equal to or greater than @ref BLE_L2CAP_MTU_MIN. */\n  uint16_t    rx_mps;        /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP shall be\n                                  able to receive on this L2CAP channel.\n                                  - Must be equal to or greater than @ref BLE_L2CAP_MPS_MIN.\n                                  - Must be equal to or less than @ref ble_l2cap_conn_cfg_t::rx_mps. */\n  ble_data_t  sdu_buf;       /**< SDU data buffer for reception.\n                                  - If @ref ble_data_t::p_data is non-NULL, initial credits are\n                                    issued to the peer.\n                                  - If @ref ble_data_t::p_data is NULL, no initial credits are\n                                    issued to the peer. */\n} ble_l2cap_ch_rx_params_t;\n\n/**@brief L2CAP channel setup parameters. */\ntypedef struct\n{\n  ble_l2cap_ch_rx_params_t      rx_params;  /**< L2CAP channel RX parameters. */\n  uint16_t                      le_psm;     /**< LE Protocol/Service Multiplexer. Used when requesting\n                                                 setup of an L2CAP channel, ignored otherwise. */\n  uint16_t                      status;     /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES.\n                                                 Used when replying to a setup request of an L2CAP\n                                                 channel, ignored otherwise. */\n} ble_l2cap_ch_setup_params_t;\n\n/**@brief L2CAP channel TX parameters. */\ntypedef struct\n{\n  uint16_t    tx_mtu;        /**< The maximum L2CAP SDU size, in bytes, that L2CAP is able to\n                                  transmit on this L2CAP channel. */\n  uint16_t    peer_mps;      /**< The maximum L2CAP PDU payload size, in bytes, that the peer is\n                                  able to receive on this L2CAP channel. */\n  uint16_t    tx_mps;        /**< The maximum L2CAP PDU payload size, in bytes, that L2CAP is able\n                                  to transmit on this L2CAP channel. This is effective tx_mps,\n                                  selected by the SoftDevice as\n                                  MIN( @ref ble_l2cap_ch_tx_params_t::peer_mps, @ref ble_l2cap_conn_cfg_t::tx_mps ) */\n  uint16_t    credits;       /**< Initial credits given by the peer. */\n} ble_l2cap_ch_tx_params_t;\n\n/**@brief L2CAP Channel Setup Request event. */\ntypedef struct\n{\n  ble_l2cap_ch_tx_params_t  tx_params;  /**< L2CAP channel TX parameters. */\n  uint16_t                  le_psm;     /**< LE Protocol/Service Multiplexer. */\n} ble_l2cap_evt_ch_setup_request_t;\n\n/**@brief L2CAP Channel Setup Refused event. */\ntypedef struct\n{\n  uint8_t  source;           /**< Source, see @ref BLE_L2CAP_CH_SETUP_REFUSED_SRCS */\n  uint16_t status;           /**< Status code, see @ref BLE_L2CAP_CH_STATUS_CODES */\n} ble_l2cap_evt_ch_setup_refused_t;\n\n/**@brief L2CAP Channel Setup Completed event. */\ntypedef struct\n{\n  ble_l2cap_ch_tx_params_t tx_params;  /**< L2CAP channel TX parameters. */\n} ble_l2cap_evt_ch_setup_t;\n\n/**@brief L2CAP Channel SDU Data Buffer Released event. */\ntypedef struct\n{\n  ble_data_t  sdu_buf;       /**< Returned reception or transmission SDU data buffer. The SoftDevice\n                                  returns SDU data buffers supplied by the application, which have\n                                  not yet been returned previously via a @ref BLE_L2CAP_EVT_CH_RX or\n                                  @ref BLE_L2CAP_EVT_CH_TX event. */\n} ble_l2cap_evt_ch_sdu_buf_released_t;\n\n/**@brief L2CAP Channel Credit received event. */\ntypedef struct\n{\n  uint16_t  credits;         /**< Additional credits given by the peer. */\n} ble_l2cap_evt_ch_credit_t;\n\n/**@brief L2CAP Channel received SDU event. */\ntypedef struct\n{\n  uint16_t    sdu_len;       /**< Total SDU length, in bytes. */\n  ble_data_t  sdu_buf;       /**< SDU data buffer.\n                                  @note If there is not enough space in the buffer\n                                        (sdu_buf.len < sdu_len) then the rest of the SDU will be\n                                        silently discarded by the SoftDevice. */\n} ble_l2cap_evt_ch_rx_t;\n\n/**@brief L2CAP Channel transmitted SDU event. */\ntypedef struct\n{\n  ble_data_t  sdu_buf;       /**< SDU data buffer. */\n} ble_l2cap_evt_ch_tx_t;\n\n/**@brief L2CAP event structure. */\ntypedef struct\n{\n  uint16_t conn_handle;                                     /**< Connection Handle on which the event occurred. */\n  uint16_t local_cid;                                       /**< Local Channel ID of the L2CAP channel, or\n                                                                 @ref BLE_L2CAP_CID_INVALID if not present. */\n  union\n  {\n    ble_l2cap_evt_ch_setup_request_t    ch_setup_request;   /**< L2CAP Channel Setup Request Event Parameters. */\n    ble_l2cap_evt_ch_setup_refused_t    ch_setup_refused;   /**< L2CAP Channel Setup Refused Event Parameters. */\n    ble_l2cap_evt_ch_setup_t            ch_setup;           /**< L2CAP Channel Setup Completed Event Parameters. */\n    ble_l2cap_evt_ch_sdu_buf_released_t ch_sdu_buf_released;/**< L2CAP Channel SDU Data Buffer Released Event Parameters. */\n    ble_l2cap_evt_ch_credit_t           credit;             /**< L2CAP Channel Credit Received Event Parameters. */\n    ble_l2cap_evt_ch_rx_t               rx;                 /**< L2CAP Channel SDU Received Event Parameters. */\n    ble_l2cap_evt_ch_tx_t               tx;                 /**< L2CAP Channel SDU Transmitted Event Parameters. */\n  } params;                                                 /**< Event Parameters. */\n} ble_l2cap_evt_t;\n\n/** @} */\n\n/**@addtogroup BLE_L2CAP_FUNCTIONS Functions\n * @{ */\n\n/**@brief Set up an L2CAP channel.\n *\n * @details This function is used to:\n *          - Request setup of an L2CAP channel: sends an LE Credit Based Connection Request packet to a peer.\n *          - Reply to a setup request of an L2CAP channel (if called in response to a\n *            @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST event): sends an LE Credit Based Connection\n *            Response packet to a peer.\n *\n * @note    A call to this function will require the application to keep the SDU data buffer alive\n *          until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX or\n *          @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event.\n *\n * @events\n * @event{@ref BLE_L2CAP_EVT_CH_SETUP, Setup successful.}\n * @event{@ref BLE_L2CAP_EVT_CH_SETUP_REFUSED, Setup failed.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_L2CAP_CH_SETUP_MSC}\n * @endmscs\n *\n * @param[in] conn_handle      Connection Handle.\n * @param[in,out] p_local_cid  Pointer to a uint16_t containing Local Channel ID of the L2CAP channel:\n *                             - As input: @ref BLE_L2CAP_CID_INVALID when requesting setup of an L2CAP\n *                               channel or local_cid provided in the @ref BLE_L2CAP_EVT_CH_SETUP_REQUEST\n *                               event when replying to a setup request of an L2CAP channel.\n *                             - As output: local_cid for this channel.\n * @param[in] p_params         L2CAP channel parameters.\n *\n * @retval ::NRF_SUCCESS                    Successfully queued request or response for transmission.\n * @retval ::NRF_ERROR_BUSY                 The stack is busy, process pending events and retry.\n * @retval ::NRF_ERROR_INVALID_ADDR         Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE  Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_PARAM        Invalid parameter(s) supplied.\n * @retval ::NRF_ERROR_INVALID_LENGTH       Supplied higher rx_mps than has been configured on this link.\n * @retval ::NRF_ERROR_INVALID_STATE        Invalid State to perform operation (L2CAP channel already set up).\n * @retval ::NRF_ERROR_NOT_FOUND            CID not found.\n * @retval ::NRF_ERROR_RESOURCES            The limit has been reached for available L2CAP channels,\n *                                          see @ref ble_l2cap_conn_cfg_t::ch_count.\n */\nSVCALL(SD_BLE_L2CAP_CH_SETUP, uint32_t, sd_ble_l2cap_ch_setup(uint16_t conn_handle, uint16_t *p_local_cid, ble_l2cap_ch_setup_params_t const *p_params));\n\n/**@brief Release an L2CAP channel.\n *\n * @details This sends a Disconnection Request packet to a peer.\n *\n * @events\n * @event{@ref BLE_L2CAP_EVT_CH_RELEASED, Release complete.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_L2CAP_CH_RELEASE_MSC}\n * @endmscs\n *\n * @param[in] conn_handle   Connection Handle.\n * @param[in] local_cid     Local Channel ID of the L2CAP channel.\n *\n * @retval ::NRF_SUCCESS                    Successfully queued request for transmission.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE  Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE        Invalid State to perform operation (Setup or release is\n *                                          in progress for the L2CAP channel).\n * @retval ::NRF_ERROR_NOT_FOUND            CID not found.\n */\nSVCALL(SD_BLE_L2CAP_CH_RELEASE, uint32_t, sd_ble_l2cap_ch_release(uint16_t conn_handle, uint16_t local_cid));\n\n/**@brief Receive an SDU on an L2CAP channel.\n *\n * @details This may issue additional credits to the peer using an LE Flow Control Credit packet.\n *\n * @note    A call to this function will require the application to keep the memory pointed by\n *          @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_RX\n *          or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event.\n *\n * @note    The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::rx_queue_size SDU data buffers\n *          for reception per L2CAP channel.\n *\n * @events\n * @event{@ref BLE_L2CAP_EVT_CH_RX, The SDU is received.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_L2CAP_CH_RX_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection Handle.\n * @param[in] local_cid   Local Channel ID of the L2CAP channel.\n * @param[in] p_sdu_buf   Pointer to the SDU data buffer.\n *\n * @retval ::NRF_SUCCESS                    Buffer accepted.\n * @retval ::NRF_ERROR_INVALID_ADDR         Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE  Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE        Invalid State to perform operation (Setup or release is\n *                                          in progress for an L2CAP channel).\n * @retval ::NRF_ERROR_NOT_FOUND            CID not found.\n * @retval ::NRF_ERROR_RESOURCES            Too many SDU data buffers supplied. Wait for a\n *                                          @ref BLE_L2CAP_EVT_CH_RX event and retry.\n */\nSVCALL(SD_BLE_L2CAP_CH_RX, uint32_t, sd_ble_l2cap_ch_rx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf));\n\n/**@brief Transmit an SDU on an L2CAP channel.\n *\n * @note    A call to this function will require the application to keep the memory pointed by\n *          @ref ble_data_t::p_data alive until the SDU data buffer is returned in @ref BLE_L2CAP_EVT_CH_TX\n *          or @ref BLE_L2CAP_EVT_CH_SDU_BUF_RELEASED event.\n *\n * @note    The SoftDevice can queue up to @ref ble_l2cap_conn_cfg_t::tx_queue_size SDUs for\n *          transmission per L2CAP channel.\n *\n * @note    The application can keep track of the available credits for transmission by following\n *          the procedure below:\n *          - Store initial credits given by the peer in a variable.\n *            (Initial credits are provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.)\n *          - Decrement the variable, which stores the currently available credits, by\n *            ceiling((@ref ble_data_t::len + 2) / tx_mps) when a call to this function returns\n *            @ref NRF_SUCCESS. (tx_mps is provided in a @ref BLE_L2CAP_EVT_CH_SETUP event.)\n *          - Increment the variable, which stores the currently available credits, by additional\n *            credits given by the peer in a @ref BLE_L2CAP_EVT_CH_CREDIT event.\n *\n * @events\n * @event{@ref BLE_L2CAP_EVT_CH_TX, The SDU is transmitted.}\n * @endevents\n *\n * @mscs\n * @mmsc{@ref BLE_L2CAP_CH_TX_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection Handle.\n * @param[in] local_cid   Local Channel ID of the L2CAP channel.\n * @param[in] p_sdu_buf   Pointer to the SDU data buffer.\n *\n * @retval ::NRF_SUCCESS                    Successfully queued L2CAP SDU for transmission.\n * @retval ::NRF_ERROR_INVALID_ADDR         Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE  Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE        Invalid State to perform operation (Setup or release is\n *                                          in progress for the L2CAP channel).\n * @retval ::NRF_ERROR_NOT_FOUND            CID not found.\n * @retval ::NRF_ERROR_DATA_SIZE            Invalid SDU length supplied, must not be more than\n *                                          @ref ble_l2cap_ch_tx_params_t::tx_mtu provided in\n *                                          @ref BLE_L2CAP_EVT_CH_SETUP event.\n * @retval ::NRF_ERROR_RESOURCES            Too many SDUs queued for transmission. Wait for a\n *                                          @ref BLE_L2CAP_EVT_CH_TX event and retry.\n */\nSVCALL(SD_BLE_L2CAP_CH_TX, uint32_t, sd_ble_l2cap_ch_tx(uint16_t conn_handle, uint16_t local_cid, ble_data_t const *p_sdu_buf));\n\n/**@brief Advanced SDU reception flow control.\n *\n * @details Adjust the way the SoftDevice issues credits to the peer.\n *          This may issue additional credits to the peer using an LE Flow Control Credit packet.\n *\n * @mscs\n * @mmsc{@ref BLE_L2CAP_CH_FLOW_CONTROL_MSC}\n * @endmscs\n *\n * @param[in] conn_handle Connection Handle.\n * @param[in] local_cid   Local Channel ID of the L2CAP channel or @ref BLE_L2CAP_CID_INVALID to set\n *                        the value that will be used for newly created channels.\n * @param[in] credits     Number of credits that the SoftDevice will make sure the peer has every\n *                        time it starts using a new reception buffer.\n *                        - @ref BLE_L2CAP_CREDITS_DEFAULT is the default value the SoftDevice will\n *                          use if this function is not called.\n *                        - If set to zero, the SoftDevice will stop issuing credits for new reception\n *                          buffers the application provides or has provided. SDU reception that is\n *                          currently ongoing will be allowed to complete.\n * @param[out] p_credits  NULL or pointer to a uint16_t. If a valid pointer is provided, it will be\n *                        written by the SoftDevice with the number of credits that is or will be\n *                        available to the peer. If the value written by the SoftDevice is 0 when\n *                        credits parameter was set to 0, the peer will not be able to send more\n *                        data until more credits are provided by calling this function again with\n *                        credits > 0. This parameter is ignored when local_cid is set to\n *                        @ref BLE_L2CAP_CID_INVALID.\n *\n * @note Application should take care when setting number of credits higher than default value. In\n *       this case the application must make sure that the SoftDevice always has reception buffers\n *       available (see @ref sd_ble_l2cap_ch_rx) for that channel. If the SoftDevice does not have\n *       such buffers available, packets may be NACKed on the Link Layer and all Bluetooth traffic\n *       on the connection handle may be stalled until the SoftDevice again has an available\n *       reception buffer. This applies even if the application has used this call to set the\n *       credits back to default, or zero.\n *\n * @retval ::NRF_SUCCESS                    Flow control parameters accepted.\n * @retval ::NRF_ERROR_INVALID_ADDR         Invalid pointer supplied.\n * @retval ::BLE_ERROR_INVALID_CONN_HANDLE  Invalid Connection Handle.\n * @retval ::NRF_ERROR_INVALID_STATE        Invalid State to perform operation (Setup or release is\n *                                          in progress for an L2CAP channel).\n * @retval ::NRF_ERROR_NOT_FOUND            CID not found.\n */\nSVCALL(SD_BLE_L2CAP_CH_FLOW_CONTROL, uint32_t, sd_ble_l2cap_ch_flow_control(uint16_t conn_handle, uint16_t local_cid, uint16_t credits, uint16_t *p_credits));\n\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n#endif // BLE_L2CAP_H__\n\n/**\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_ranges.h",
    "content": "/*\n * Copyright (c) 2012 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_COMMON\n  @{\n  @defgroup ble_ranges Module specific SVC, event and option number subranges\n  @{\n\n  @brief Definition of SVC, event and option number subranges for each API module.\n\n  @note\n  SVCs, event and option numbers are split into subranges for each API module.\n  Each module receives its entire allocated range of SVC calls, whether implemented or not,\n  but return BLE_ERROR_NOT_SUPPORTED for unimplemented or undefined calls in its range.\n\n  Note that the symbols BLE_<module>_SVC_LAST is the end of the allocated SVC range,\n  rather than the last SVC function call actually defined and implemented.\n\n  Specific SVC, event and option values are defined in each module's ble_<module>.h file,\n  which defines names of each individual SVC code based on the range start value.\n*/\n\n#ifndef BLE_RANGES_H__\n#define BLE_RANGES_H__\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define BLE_SVC_BASE           0x60       /**< Common BLE SVC base. */\n#define BLE_SVC_LAST           0x6B       /**< Common BLE SVC last. */\n\n#define BLE_GAP_SVC_BASE       0x6C       /**< GAP BLE SVC base. */\n#define BLE_GAP_SVC_LAST       0x9A       /**< GAP BLE SVC last. */\n\n#define BLE_GATTC_SVC_BASE     0x9B       /**< GATTC BLE SVC base. */\n#define BLE_GATTC_SVC_LAST     0xA7       /**< GATTC BLE SVC last. */\n\n#define BLE_GATTS_SVC_BASE     0xA8       /**< GATTS BLE SVC base. */\n#define BLE_GATTS_SVC_LAST     0xB7       /**< GATTS BLE SVC last. */\n\n#define BLE_L2CAP_SVC_BASE     0xB8       /**< L2CAP BLE SVC base. */\n#define BLE_L2CAP_SVC_LAST     0xBF       /**< L2CAP BLE SVC last. */\n\n\n#define BLE_EVT_INVALID        0x00       /**< Invalid BLE Event. */\n\n#define BLE_EVT_BASE           0x01       /**< Common BLE Event base. */\n#define BLE_EVT_LAST           0x0F       /**< Common BLE Event last. */\n\n#define BLE_GAP_EVT_BASE       0x10       /**< GAP BLE Event base. */\n#define BLE_GAP_EVT_LAST       0x2F       /**< GAP BLE Event last. */\n\n#define BLE_GATTC_EVT_BASE     0x30       /**< GATTC BLE Event base. */\n#define BLE_GATTC_EVT_LAST     0x4F       /**< GATTC BLE Event last. */\n\n#define BLE_GATTS_EVT_BASE     0x50       /**< GATTS BLE Event base. */\n#define BLE_GATTS_EVT_LAST     0x6F       /**< GATTS BLE Event last. */\n\n#define BLE_L2CAP_EVT_BASE     0x70       /**< L2CAP BLE Event base. */\n#define BLE_L2CAP_EVT_LAST     0x8F       /**< L2CAP BLE Event last. */\n\n\n#define BLE_OPT_INVALID        0x00       /**< Invalid BLE Option. */\n\n#define BLE_OPT_BASE           0x01       /**< Common BLE Option base. */\n#define BLE_OPT_LAST           0x1F       /**< Common BLE Option last. */\n\n#define BLE_GAP_OPT_BASE       0x20       /**< GAP BLE Option base. */\n#define BLE_GAP_OPT_LAST       0x3F       /**< GAP BLE Option last. */\n\n#define BLE_GATT_OPT_BASE      0x40       /**< GATT BLE Option base. */\n#define BLE_GATT_OPT_LAST      0x5F       /**< GATT BLE Option last. */\n\n#define BLE_GATTC_OPT_BASE     0x60       /**< GATTC BLE Option base. */\n#define BLE_GATTC_OPT_LAST     0x7F       /**< GATTC BLE Option last. */\n\n#define BLE_GATTS_OPT_BASE     0x80       /**< GATTS BLE Option base. */\n#define BLE_GATTS_OPT_LAST     0x9F       /**< GATTS BLE Option last. */\n\n#define BLE_L2CAP_OPT_BASE     0xA0       /**< L2CAP BLE Option base. */\n#define BLE_L2CAP_OPT_LAST     0xBF       /**< L2CAP BLE Option last. */\n\n\n#define BLE_CFG_INVALID        0x00       /**< Invalid BLE configuration. */\n\n#define BLE_CFG_BASE           0x01       /**< Common BLE configuration base. */\n#define BLE_CFG_LAST           0x1F       /**< Common BLE configuration last. */\n\n#define BLE_CONN_CFG_BASE      0x20       /**< BLE connection configuration base. */\n#define BLE_CONN_CFG_LAST      0x3F       /**< BLE connection configuration last. */\n\n#define BLE_GAP_CFG_BASE       0x40       /**< GAP BLE configuration base. */\n#define BLE_GAP_CFG_LAST       0x5F       /**< GAP BLE configuration last. */\n\n#define BLE_GATT_CFG_BASE      0x60       /**< GATT BLE configuration base. */\n#define BLE_GATT_CFG_LAST      0x7F       /**< GATT BLE configuration last. */\n\n#define BLE_GATTC_CFG_BASE     0x80       /**< GATTC BLE configuration base. */\n#define BLE_GATTC_CFG_LAST     0x9F       /**< GATTC BLE configuration last. */\n\n#define BLE_GATTS_CFG_BASE     0xA0       /**< GATTS BLE configuration base. */\n#define BLE_GATTS_CFG_LAST     0xBF       /**< GATTS BLE configuration last. */\n\n#define BLE_L2CAP_CFG_BASE     0xC0       /**< L2CAP BLE configuration base. */\n#define BLE_L2CAP_CFG_LAST     0xDF       /**< L2CAP BLE configuration last. */\n\n\n\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* BLE_RANGES_H__ */\n\n/**\n  @}\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/ble_types.h",
    "content": "/*\n * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup BLE_COMMON\n  @{\n  @defgroup ble_types Common types and macro definitions\n  @{\n\n  @brief Common types and macro definitions for the BLE SoftDevice.\n */\n\n#ifndef BLE_TYPES_H__\n#define BLE_TYPES_H__\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @addtogroup BLE_TYPES_DEFINES Defines\n * @{ */\n\n/** @defgroup BLE_CONN_HANDLES BLE Connection Handles\n * @{ */\n#define BLE_CONN_HANDLE_INVALID 0xFFFF  /**< Invalid Connection Handle. */\n#define BLE_CONN_HANDLE_ALL     0xFFFE  /**< Applies to all Connection Handles. */\n/** @} */\n\n\n/** @defgroup BLE_UUID_VALUES Assigned Values for BLE UUIDs\n * @{ */\n/* Generic UUIDs, applicable to all services */\n#define BLE_UUID_UNKNOWN                              0x0000 /**< Reserved UUID. */\n#define BLE_UUID_SERVICE_PRIMARY                      0x2800 /**< Primary Service. */\n#define BLE_UUID_SERVICE_SECONDARY                    0x2801 /**< Secondary Service. */\n#define BLE_UUID_SERVICE_INCLUDE                      0x2802 /**< Include. */\n#define BLE_UUID_CHARACTERISTIC                       0x2803 /**< Characteristic. */\n#define BLE_UUID_DESCRIPTOR_CHAR_EXT_PROP             0x2900 /**< Characteristic Extended Properties Descriptor. */\n#define BLE_UUID_DESCRIPTOR_CHAR_USER_DESC            0x2901 /**< Characteristic User Description Descriptor. */\n#define BLE_UUID_DESCRIPTOR_CLIENT_CHAR_CONFIG        0x2902 /**< Client Characteristic Configuration Descriptor. */\n#define BLE_UUID_DESCRIPTOR_SERVER_CHAR_CONFIG        0x2903 /**< Server Characteristic Configuration Descriptor. */\n#define BLE_UUID_DESCRIPTOR_CHAR_PRESENTATION_FORMAT  0x2904 /**< Characteristic Presentation Format Descriptor. */\n#define BLE_UUID_DESCRIPTOR_CHAR_AGGREGATE_FORMAT     0x2905 /**< Characteristic Aggregate Format Descriptor. */\n/* GATT specific UUIDs */\n#define BLE_UUID_GATT                                 0x1801 /**< Generic Attribute Profile. */\n#define BLE_UUID_GATT_CHARACTERISTIC_SERVICE_CHANGED  0x2A05 /**< Service Changed Characteristic. */\n/* GAP specific UUIDs */\n#define BLE_UUID_GAP                                  0x1800 /**< Generic Access Profile. */\n#define BLE_UUID_GAP_CHARACTERISTIC_DEVICE_NAME       0x2A00 /**< Device Name Characteristic. */\n#define BLE_UUID_GAP_CHARACTERISTIC_APPEARANCE        0x2A01 /**< Appearance Characteristic. */\n#define BLE_UUID_GAP_CHARACTERISTIC_RECONN_ADDR       0x2A03 /**< Reconnection Address Characteristic. */\n#define BLE_UUID_GAP_CHARACTERISTIC_PPCP              0x2A04 /**< Peripheral Preferred Connection Parameters Characteristic. */\n#define BLE_UUID_GAP_CHARACTERISTIC_CAR               0x2AA6 /**< Central Address Resolution Characteristic. */\n#define BLE_UUID_GAP_CHARACTERISTIC_RPA_ONLY          0x2AC9 /**< Resolvable Private Address Only Characteristic. */\n/** @} */\n\n\n/** @defgroup BLE_UUID_TYPES Types of UUID\n * @{ */\n#define BLE_UUID_TYPE_UNKNOWN       0x00 /**< Invalid UUID type. */\n#define BLE_UUID_TYPE_BLE           0x01 /**< Bluetooth SIG UUID (16-bit). */\n#define BLE_UUID_TYPE_VENDOR_BEGIN  0x02 /**< Vendor UUID types start at this index (128-bit). */\n/** @} */\n\n\n/** @defgroup BLE_APPEARANCES Bluetooth Appearance values\n *  @note Retrieved from http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.gap.appearance.xml\n * @{ */\n#define BLE_APPEARANCE_UNKNOWN                                0 /**< Unknown. */\n#define BLE_APPEARANCE_GENERIC_PHONE                         64 /**< Generic Phone. */\n#define BLE_APPEARANCE_GENERIC_COMPUTER                     128 /**< Generic Computer. */\n#define BLE_APPEARANCE_GENERIC_WATCH                        192 /**< Generic Watch. */\n#define BLE_APPEARANCE_WATCH_SPORTS_WATCH                   193 /**< Watch: Sports Watch. */\n#define BLE_APPEARANCE_GENERIC_CLOCK                        256 /**< Generic Clock. */\n#define BLE_APPEARANCE_GENERIC_DISPLAY                      320 /**< Generic Display. */\n#define BLE_APPEARANCE_GENERIC_REMOTE_CONTROL               384 /**< Generic Remote Control. */\n#define BLE_APPEARANCE_GENERIC_EYE_GLASSES                  448 /**< Generic Eye-glasses. */\n#define BLE_APPEARANCE_GENERIC_TAG                          512 /**< Generic Tag. */\n#define BLE_APPEARANCE_GENERIC_KEYRING                      576 /**< Generic Keyring. */\n#define BLE_APPEARANCE_GENERIC_MEDIA_PLAYER                 640 /**< Generic Media Player. */\n#define BLE_APPEARANCE_GENERIC_BARCODE_SCANNER              704 /**< Generic Barcode Scanner. */\n#define BLE_APPEARANCE_GENERIC_THERMOMETER                  768 /**< Generic Thermometer. */\n#define BLE_APPEARANCE_THERMOMETER_EAR                      769 /**< Thermometer: Ear. */\n#define BLE_APPEARANCE_GENERIC_HEART_RATE_SENSOR            832 /**< Generic Heart rate Sensor. */\n#define BLE_APPEARANCE_HEART_RATE_SENSOR_HEART_RATE_BELT    833 /**< Heart Rate Sensor: Heart Rate Belt. */\n#define BLE_APPEARANCE_GENERIC_BLOOD_PRESSURE               896 /**< Generic Blood Pressure. */\n#define BLE_APPEARANCE_BLOOD_PRESSURE_ARM                   897 /**< Blood Pressure: Arm. */\n#define BLE_APPEARANCE_BLOOD_PRESSURE_WRIST                 898 /**< Blood Pressure: Wrist. */\n#define BLE_APPEARANCE_GENERIC_HID                          960 /**< Human Interface Device (HID). */\n#define BLE_APPEARANCE_HID_KEYBOARD                         961 /**< Keyboard (HID Subtype). */\n#define BLE_APPEARANCE_HID_MOUSE                            962 /**< Mouse (HID Subtype). */\n#define BLE_APPEARANCE_HID_JOYSTICK                         963 /**< Joystick (HID Subtype). */\n#define BLE_APPEARANCE_HID_GAMEPAD                          964 /**< Gamepad (HID Subtype). */\n#define BLE_APPEARANCE_HID_DIGITIZERSUBTYPE                 965 /**< Digitizer Tablet (HID Subtype). */\n#define BLE_APPEARANCE_HID_CARD_READER                      966 /**< Card Reader (HID Subtype). */\n#define BLE_APPEARANCE_HID_DIGITAL_PEN                      967 /**< Digital Pen (HID Subtype). */\n#define BLE_APPEARANCE_HID_BARCODE                          968 /**< Barcode Scanner (HID Subtype). */\n#define BLE_APPEARANCE_GENERIC_GLUCOSE_METER               1024 /**< Generic Glucose Meter. */\n#define BLE_APPEARANCE_GENERIC_RUNNING_WALKING_SENSOR      1088 /**< Generic Running Walking Sensor. */\n#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_IN_SHOE      1089 /**< Running Walking Sensor: In-Shoe. */\n#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_SHOE      1090 /**< Running Walking Sensor: On-Shoe. */\n#define BLE_APPEARANCE_RUNNING_WALKING_SENSOR_ON_HIP       1091 /**< Running Walking Sensor: On-Hip. */\n#define BLE_APPEARANCE_GENERIC_CYCLING                     1152 /**< Generic Cycling. */\n#define BLE_APPEARANCE_CYCLING_CYCLING_COMPUTER            1153 /**< Cycling: Cycling Computer. */\n#define BLE_APPEARANCE_CYCLING_SPEED_SENSOR                1154 /**< Cycling: Speed Sensor. */\n#define BLE_APPEARANCE_CYCLING_CADENCE_SENSOR              1155 /**< Cycling: Cadence Sensor. */\n#define BLE_APPEARANCE_CYCLING_POWER_SENSOR                1156 /**< Cycling: Power Sensor. */\n#define BLE_APPEARANCE_CYCLING_SPEED_CADENCE_SENSOR        1157 /**< Cycling: Speed and Cadence Sensor. */\n#define BLE_APPEARANCE_GENERIC_PULSE_OXIMETER              3136 /**< Generic Pulse Oximeter. */\n#define BLE_APPEARANCE_PULSE_OXIMETER_FINGERTIP            3137 /**< Fingertip (Pulse Oximeter subtype). */\n#define BLE_APPEARANCE_PULSE_OXIMETER_WRIST_WORN           3138 /**< Wrist Worn(Pulse Oximeter subtype). */\n#define BLE_APPEARANCE_GENERIC_WEIGHT_SCALE                3200 /**< Generic Weight Scale. */\n#define BLE_APPEARANCE_GENERIC_OUTDOOR_SPORTS_ACT          5184 /**< Generic Outdoor Sports Activity. */\n#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_DISP         5185 /**< Location Display Device (Outdoor Sports Activity subtype). */\n#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_DISP 5186 /**< Location and Navigation Display Device (Outdoor Sports Activity subtype). */\n#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_POD          5187 /**< Location Pod (Outdoor Sports Activity subtype). */\n#define BLE_APPEARANCE_OUTDOOR_SPORTS_ACT_LOC_AND_NAV_POD  5188 /**< Location and Navigation Pod (Outdoor Sports Activity subtype). */\n/** @} */\n\n/** @brief Set .type and .uuid fields of ble_uuid_struct to specified UUID value. */\n#define BLE_UUID_BLE_ASSIGN(instance, value) do {\\\n            instance.type = BLE_UUID_TYPE_BLE; \\\n            instance.uuid = value;} while(0)\n\n/** @brief Copy type and uuid members from src to dst ble_uuid_t pointer. Both pointers must be valid/non-null. */\n#define BLE_UUID_COPY_PTR(dst, src) do {\\\n            (dst)->type = (src)->type; \\\n            (dst)->uuid = (src)->uuid;} while(0)\n\n/** @brief Copy type and uuid members from src to dst ble_uuid_t struct. */\n#define BLE_UUID_COPY_INST(dst, src) do {\\\n            (dst).type = (src).type; \\\n            (dst).uuid = (src).uuid;} while(0)\n\n/** @brief Compare for equality both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */\n#define BLE_UUID_EQ(p_uuid1, p_uuid2) \\\n            (((p_uuid1)->type == (p_uuid2)->type) && ((p_uuid1)->uuid == (p_uuid2)->uuid))\n\n/** @brief Compare for difference both type and uuid members of two (valid, non-null) ble_uuid_t pointers. */\n#define BLE_UUID_NEQ(p_uuid1, p_uuid2) \\\n            (((p_uuid1)->type != (p_uuid2)->type) || ((p_uuid1)->uuid != (p_uuid2)->uuid))\n\n/** @} */\n\n/** @addtogroup BLE_TYPES_STRUCTURES Structures\n * @{ */\n\n/** @brief 128 bit UUID values. */\ntypedef struct\n{\n  uint8_t uuid128[16]; /**< Little-Endian UUID bytes. */\n} ble_uuid128_t;\n\n/** @brief  Bluetooth Low Energy UUID type, encapsulates both 16-bit and 128-bit UUIDs. */\ntypedef struct\n{\n  uint16_t    uuid; /**< 16-bit UUID value or octets 12-13 of 128-bit UUID. */\n  uint8_t     type; /**< UUID type, see @ref BLE_UUID_TYPES. If type is @ref BLE_UUID_TYPE_UNKNOWN, the value of uuid is undefined. */\n} ble_uuid_t;\n\n/**@brief Data structure. */\ntypedef struct\n{\n  uint8_t     *p_data;  /**< Pointer to the data buffer provided to/from the application. */\n  uint16_t     len;     /**< Length of the data buffer, in bytes. */\n} ble_data_t;\n\n/** @} */\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BLE_TYPES_H__ */\n\n/**\n  @}\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/nrf52/nrf_mbr.h",
    "content": "/*\n * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @defgroup nrf_mbr_api Master Boot Record API\n  @{\n\n  @brief APIs for updating SoftDevice and BootLoader\n\n*/\n\n#ifndef NRF_MBR_H__\n#define NRF_MBR_H__\n\n#include \"nrf_svc.h\"\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @addtogroup NRF_MBR_DEFINES Defines\n * @{ */\n\n/**@brief MBR SVC Base number. */\n#define MBR_SVC_BASE            (0x18)\n\n/**@brief Page size in words. */\n#define MBR_PAGE_SIZE_IN_WORDS  (1024)\n\n/** @brief The size that must be reserved for the MBR when a SoftDevice is written to flash.\nThis is the offset where the first byte of the SoftDevice hex file is written. */\n#define MBR_SIZE                (0x1000)\n\n/** @brief Location (in the flash memory) of the bootloader address. */\n#define MBR_BOOTLOADER_ADDR      (0xFF8)\n\n/** @brief Location (in UICR) of the bootloader address. */\n#define MBR_UICR_BOOTLOADER_ADDR (&(NRF_UICR->NRFFW[0]))\n\n/** @brief Location (in the flash memory) of the address of the MBR parameter page. */\n#define MBR_PARAM_PAGE_ADDR      (0xFFC)\n\n/** @brief Location (in UICR) of the address of the MBR parameter page. */\n#define MBR_UICR_PARAM_PAGE_ADDR (&(NRF_UICR->NRFFW[1]))\n\n\n/** @} */\n\n/** @addtogroup NRF_MBR_ENUMS Enumerations\n * @{ */\n\n/**@brief nRF Master Boot Record API SVC numbers. */\nenum NRF_MBR_SVCS\n{\n  SD_MBR_COMMAND = MBR_SVC_BASE, /**< ::sd_mbr_command */\n};\n\n/**@brief Possible values for ::sd_mbr_command_t.command */\nenum NRF_MBR_COMMANDS\n{\n  SD_MBR_COMMAND_COPY_BL,                 /**< Copy a new BootLoader. @see ::sd_mbr_command_copy_bl_t*/\n  SD_MBR_COMMAND_COPY_SD,                 /**< Copy a new SoftDevice. @see ::sd_mbr_command_copy_sd_t*/\n  SD_MBR_COMMAND_INIT_SD,                 /**< Initialize forwarding interrupts to SD, and run reset function in SD. Does not require any parameters in ::sd_mbr_command_t params.*/\n  SD_MBR_COMMAND_COMPARE,                 /**< This command works like memcmp. @see ::sd_mbr_command_compare_t*/\n  SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET,   /**< Change the address the MBR starts after a reset. @see ::sd_mbr_command_vector_table_base_set_t*/\n  SD_MBR_COMMAND_RESERVED,\n  SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET, /**< Start forwarding all interrupts to this address. @see ::sd_mbr_command_irq_forward_address_set_t*/\n};\n\n/** @} */\n\n/** @addtogroup NRF_MBR_TYPES Types\n * @{ */\n\n/**@brief This command copies part of a new SoftDevice\n *\n * The destination area is erased before copying.\n * If dst is in the middle of a flash page, that whole flash page will be erased.\n * If (dst+len) is in the middle of a flash page, that whole flash page will be erased.\n *\n * The user of this function is responsible for setting the BPROT registers.\n *\n * @retval ::NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly.\n * @retval ::NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying.\n */\ntypedef struct\n{\n  uint32_t *src;  /**< Pointer to the source of data to be copied.*/\n  uint32_t *dst;  /**< Pointer to the destination where the content is to be copied.*/\n  uint32_t len;   /**< Number of 32 bit words to copy. Must be a multiple of @ref MBR_PAGE_SIZE_IN_WORDS words.*/\n} sd_mbr_command_copy_sd_t;\n\n\n/**@brief This command works like memcmp, but takes the length in words.\n *\n * @retval ::NRF_SUCCESS indicates that the contents of both memory blocks are equal.\n * @retval ::NRF_ERROR_NULL indicates that the contents of the memory blocks are not equal.\n */\ntypedef struct\n{\n  uint32_t *ptr1; /**< Pointer to block of memory. */\n  uint32_t *ptr2; /**< Pointer to block of memory. */\n  uint32_t len;   /**< Number of 32 bit words to compare.*/\n} sd_mbr_command_compare_t;\n\n\n/**@brief This command copies a new BootLoader.\n *\n * The MBR assumes that either @ref MBR_BOOTLOADER_ADDR or @ref MBR_UICR_BOOTLOADER_ADDR is set to\n * the address where the bootloader will be copied. If both addresses are set, the MBR will prioritize\n * @ref MBR_BOOTLOADER_ADDR.\n *\n * The bootloader destination is erased by this function.\n * If (destination+bl_len) is in the middle of a flash page, that whole flash page will be erased.\n *\n * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set,\n * see @ref sd_mbr_command.\n *\n * This command will use the flash protect peripheral (BPROT or ACL) to protect the flash that is\n * not intended to be written.\n *\n * On success, this function will not return. It will start the new bootloader from reset-vector as normal.\n *\n * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen.\n * @retval ::NRF_ERROR_FORBIDDEN if the bootloader address is not set.\n * @retval ::NRF_ERROR_INVALID_LENGTH if parameters attempts to read or write outside flash area.\n * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command.\n */\ntypedef struct\n{\n  uint32_t *bl_src;  /**< Pointer to the source of the bootloader to be be copied.*/\n  uint32_t bl_len;   /**< Number of 32 bit words to copy for BootLoader. */\n} sd_mbr_command_copy_bl_t;\n\n/**@brief Change the address the MBR starts after a reset\n *\n * Once this function has been called, this address is where the MBR will start to forward\n * interrupts to after a reset.\n *\n * To restore default forwarding, this function should be called with @ref address set to 0. If a\n * bootloader is present, interrupts will be forwarded to the bootloader. If not, interrupts will\n * be forwarded to the SoftDevice.\n *\n * The location of a bootloader can be specified in @ref MBR_BOOTLOADER_ADDR or\n * @ref MBR_UICR_BOOTLOADER_ADDR. If both addresses are set, the MBR will prioritize\n * @ref MBR_BOOTLOADER_ADDR.\n *\n * This command requires that @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR is set,\n * see @ref sd_mbr_command.\n *\n * On success, this function will not return. It will reset the device.\n *\n * @retval ::NRF_ERROR_INTERNAL indicates an internal error that should not happen.\n * @retval ::NRF_ERROR_INVALID_ADDR if parameter address is outside of the flash size.\n * @retval ::NRF_ERROR_NO_MEM No MBR parameter page is provided. See @ref sd_mbr_command.\n */\ntypedef struct\n{\n  uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/\n} sd_mbr_command_vector_table_base_set_t;\n\n/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the MBR\n *\n * Unlike sd_mbr_command_vector_table_base_set_t, this function does not reset, and it does not\n * change where the MBR starts after reset.\n *\n * @retval ::NRF_SUCCESS\n */\ntypedef struct\n{\n  uint32_t address; /**< The base address of the interrupt vector table for forwarded interrupts.*/\n} sd_mbr_command_irq_forward_address_set_t;\n\n/**@brief Input structure containing data used when calling ::sd_mbr_command\n *\n * Depending on what command value that is set, the corresponding params value type must also be\n * set. See @ref NRF_MBR_COMMANDS for command types and corresponding params value type. If command\n * @ref SD_MBR_COMMAND_INIT_SD is set, it is not necessary to set any values under params.\n */\ntypedef struct\n{\n  uint32_t command;  /**< Type of command to be issued. See @ref NRF_MBR_COMMANDS. */\n  union\n  {\n    sd_mbr_command_copy_sd_t copy_sd;  /**< Parameters for copy SoftDevice.*/\n    sd_mbr_command_compare_t compare;  /**< Parameters for verify.*/\n    sd_mbr_command_copy_bl_t copy_bl;  /**< Parameters for copy BootLoader. Requires parameter page. */\n    sd_mbr_command_vector_table_base_set_t base_set; /**< Parameters for vector table base set. Requires parameter page.*/\n    sd_mbr_command_irq_forward_address_set_t irq_forward_address_set; /**< Parameters for irq forward address set*/\n  } params; /**< Command parameters. */\n} sd_mbr_command_t;\n\n/** @} */\n\n/** @addtogroup NRF_MBR_FUNCTIONS Functions\n * @{ */\n\n/**@brief Issue Master Boot Record commands\n *\n * Commands used when updating a SoftDevice and bootloader.\n *\n * The @ref SD_MBR_COMMAND_COPY_BL and @ref SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET requires\n * parameters to be retained by the MBR when resetting the IC. This is done in a separate flash\n * page. The location of the flash page should be provided by the application in either\n * @ref MBR_PARAM_PAGE_ADDR or @ref MBR_UICR_PARAM_PAGE_ADDR. If both addresses are set, the MBR\n * will prioritize @ref MBR_PARAM_PAGE_ADDR. This page will be cleared by the MBR and is used to\n * store the command before reset. When an address is specified, the page it refers to must not be\n * used by the application. If no address is provided by the application, i.e. both\n * @ref MBR_PARAM_PAGE_ADDR and @ref MBR_UICR_PARAM_PAGE_ADDR is 0xFFFFFFFF, MBR commands which use\n * flash will be unavailable and return @ref NRF_ERROR_NO_MEM.\n *\n * @param[in]  param Pointer to a struct describing the command.\n *\n * @note For a complete set of return values, see ::sd_mbr_command_copy_sd_t,\n *       ::sd_mbr_command_copy_bl_t, ::sd_mbr_command_compare_t,\n *       ::sd_mbr_command_vector_table_base_set_t, ::sd_mbr_command_irq_forward_address_set_t\n *\n * @retval ::NRF_ERROR_NO_MEM No MBR parameter page provided\n * @retval ::NRF_ERROR_INVALID_PARAM if an invalid command is given.\n*/\nSVCALL(SD_MBR_COMMAND, uint32_t, sd_mbr_command(sd_mbr_command_t* param));\n\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n#endif // NRF_MBR_H__\n\n/**\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/nrf_error.h",
    "content": "/*\n * Copyright (c) 2014 - 2017, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n /**\n  @defgroup nrf_error SoftDevice Global Error Codes\n  @{\n\n  @brief Global Error definitions\n*/\n\n/* Header guard */\n#ifndef NRF_ERROR_H__\n#define NRF_ERROR_H__\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @defgroup NRF_ERRORS_BASE Error Codes Base number definitions\n * @{ */\n#define NRF_ERROR_BASE_NUM      (0x0)       ///< Global error base\n#define NRF_ERROR_SDM_BASE_NUM  (0x1000)    ///< SDM error base\n#define NRF_ERROR_SOC_BASE_NUM  (0x2000)    ///< SoC error base\n#define NRF_ERROR_STK_BASE_NUM  (0x3000)    ///< STK error base\n/** @} */\n\n#define NRF_SUCCESS                           (NRF_ERROR_BASE_NUM + 0)  ///< Successful command\n#define NRF_ERROR_SVC_HANDLER_MISSING         (NRF_ERROR_BASE_NUM + 1)  ///< SVC handler is missing\n#define NRF_ERROR_SOFTDEVICE_NOT_ENABLED      (NRF_ERROR_BASE_NUM + 2)  ///< SoftDevice has not been enabled\n#define NRF_ERROR_INTERNAL                    (NRF_ERROR_BASE_NUM + 3)  ///< Internal Error\n#define NRF_ERROR_NO_MEM                      (NRF_ERROR_BASE_NUM + 4)  ///< No Memory for operation\n#define NRF_ERROR_NOT_FOUND                   (NRF_ERROR_BASE_NUM + 5)  ///< Not found\n#define NRF_ERROR_NOT_SUPPORTED               (NRF_ERROR_BASE_NUM + 6)  ///< Not supported\n#define NRF_ERROR_INVALID_PARAM               (NRF_ERROR_BASE_NUM + 7)  ///< Invalid Parameter\n#define NRF_ERROR_INVALID_STATE               (NRF_ERROR_BASE_NUM + 8)  ///< Invalid state, operation disallowed in this state\n#define NRF_ERROR_INVALID_LENGTH              (NRF_ERROR_BASE_NUM + 9)  ///< Invalid Length\n#define NRF_ERROR_INVALID_FLAGS               (NRF_ERROR_BASE_NUM + 10) ///< Invalid Flags\n#define NRF_ERROR_INVALID_DATA                (NRF_ERROR_BASE_NUM + 11) ///< Invalid Data\n#define NRF_ERROR_DATA_SIZE                   (NRF_ERROR_BASE_NUM + 12) ///< Invalid Data size\n#define NRF_ERROR_TIMEOUT                     (NRF_ERROR_BASE_NUM + 13) ///< Operation timed out\n#define NRF_ERROR_NULL                        (NRF_ERROR_BASE_NUM + 14) ///< Null Pointer\n#define NRF_ERROR_FORBIDDEN                   (NRF_ERROR_BASE_NUM + 15) ///< Forbidden Operation\n#define NRF_ERROR_INVALID_ADDR                (NRF_ERROR_BASE_NUM + 16) ///< Bad Memory Address\n#define NRF_ERROR_BUSY                        (NRF_ERROR_BASE_NUM + 17) ///< Busy\n#define NRF_ERROR_CONN_COUNT                  (NRF_ERROR_BASE_NUM + 18) ///< Maximum connection count exceeded.\n#define NRF_ERROR_RESOURCES                   (NRF_ERROR_BASE_NUM + 19) ///< Not enough resources for operation\n\n#ifdef __cplusplus\n}\n#endif\n#endif // NRF_ERROR_H__\n\n/**\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/nrf_error_sdm.h",
    "content": "/*\n * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n /**\n  @addtogroup nrf_sdm_api\n  @{\n  @defgroup nrf_sdm_error SoftDevice Manager Error Codes\n  @{\n\n  @brief Error definitions for the SDM API\n*/\n\n/* Header guard */\n#ifndef NRF_ERROR_SDM_H__\n#define NRF_ERROR_SDM_H__\n\n#include \"nrf_error.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN              (NRF_ERROR_SDM_BASE_NUM + 0)  ///< Unknown LFCLK source.\n#define NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION (NRF_ERROR_SDM_BASE_NUM + 1)  ///< Incorrect interrupt configuration (can be caused by using illegal priority levels, or having enabled SoftDevice interrupts).\n#define NRF_ERROR_SDM_INCORRECT_CLENR0                  (NRF_ERROR_SDM_BASE_NUM + 2)  ///< Incorrect CLENR0 (can be caused by erroneous SoftDevice flashing).\n\n#ifdef __cplusplus\n}\n#endif\n#endif // NRF_ERROR_SDM_H__\n\n/**\n  @}\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/nrf_error_soc.h",
    "content": "/*\n * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @addtogroup nrf_soc_api\n  @{\n  @defgroup nrf_soc_error SoC Library Error Codes\n  @{\n\n  @brief Error definitions for the SoC library\n\n*/\n\n/* Header guard */\n#ifndef NRF_ERROR_SOC_H__\n#define NRF_ERROR_SOC_H__\n\n#include \"nrf_error.h\"\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Mutex Errors */\n#define NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN                 (NRF_ERROR_SOC_BASE_NUM + 0)  ///< Mutex already taken\n\n/* NVIC errors */\n#define NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE        (NRF_ERROR_SOC_BASE_NUM + 1)  ///< NVIC interrupt not available\n#define NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED (NRF_ERROR_SOC_BASE_NUM + 2)  ///< NVIC interrupt priority not allowed\n#define NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN              (NRF_ERROR_SOC_BASE_NUM + 3)  ///< NVIC should not return\n\n/* Power errors */\n#define NRF_ERROR_SOC_POWER_MODE_UNKNOWN                  (NRF_ERROR_SOC_BASE_NUM + 4)  ///< Power mode unknown\n#define NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN         (NRF_ERROR_SOC_BASE_NUM + 5)  ///< Power POF threshold unknown\n#define NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN         (NRF_ERROR_SOC_BASE_NUM + 6)  ///< Power off should not return\n\n/* Rand errors */\n#define NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES              (NRF_ERROR_SOC_BASE_NUM + 7)  ///< RAND not enough values\n\n/* PPI errors */\n#define NRF_ERROR_SOC_PPI_INVALID_CHANNEL                 (NRF_ERROR_SOC_BASE_NUM + 8)  ///< Invalid PPI Channel\n#define NRF_ERROR_SOC_PPI_INVALID_GROUP                   (NRF_ERROR_SOC_BASE_NUM + 9)  ///< Invalid PPI Group\n\n#ifdef __cplusplus\n}\n#endif\n#endif // NRF_ERROR_SOC_H__\n/**\n  @}\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/nrf_nvic.h",
    "content": "/*\n * Copyright (c) 2016 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @defgroup nrf_nvic_api SoftDevice NVIC API\n * @{\n *\n * @note In order to use this module, the following code has to be added to a .c file:\n *     \\code\n *     nrf_nvic_state_t nrf_nvic_state = {0};\n *     \\endcode\n *\n * @note Definitions and declarations starting with __ (double underscore) in this header file are\n * not intended for direct use by the application.\n *\n * @brief APIs for the accessing NVIC when using a SoftDevice.\n *\n */\n\n#ifndef NRF_NVIC_H__\n#define NRF_NVIC_H__\n\n#include <stdint.h>\n#include \"nrf.h\"\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"nrf_error_soc.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**@addtogroup NRF_NVIC_DEFINES Defines\n * @{ */\n\n/**@defgroup NRF_NVIC_ISER_DEFINES SoftDevice NVIC internal definitions\n * @{ */\n\n#define __NRF_NVIC_NVMC_IRQn (30) /**< The peripheral ID of the NVMC. IRQ numbers are used to identify peripherals, but the NVMC doesn't have an IRQ number in the MDK. */\n\n#define __NRF_NVIC_ISER_COUNT (2) /**< The number of ISER/ICER registers in the NVIC that are used. */\n\n/**@brief Interrupt priority levels used by the SoftDevice. */\n#define __NRF_NVIC_SD_IRQ_PRIOS ((uint8_t)( \\\n      (1U << 0)  /**< Priority level high .*/   \\\n    | (1U << 1)  /**< Priority level medium. */ \\\n    | (1U << 4)  /**< Priority level low. */    \\\n  ))\n\n/**@brief Interrupt priority levels available to the application. */\n#define __NRF_NVIC_APP_IRQ_PRIOS ((uint8_t)~__NRF_NVIC_SD_IRQ_PRIOS)\n\n/**@brief Interrupts used by the SoftDevice, with IRQn in the range 0-31. */\n#define __NRF_NVIC_SD_IRQS_0 ((uint32_t)( \\\n      (1U << POWER_CLOCK_IRQn) \\\n    | (1U << RADIO_IRQn) \\\n    | (1U << RTC0_IRQn) \\\n    | (1U << TIMER0_IRQn) \\\n    | (1U << RNG_IRQn) \\\n    | (1U << ECB_IRQn) \\\n    | (1U << CCM_AAR_IRQn) \\\n    | (1U << TEMP_IRQn) \\\n    | (1U << __NRF_NVIC_NVMC_IRQn) \\\n    | (1U << (uint32_t)SWI5_IRQn) \\\n  ))\n\n/**@brief Interrupts used by the SoftDevice, with IRQn in the range 32-63. */\n#define __NRF_NVIC_SD_IRQS_1 ((uint32_t)0)\n\n/**@brief Interrupts available for to application, with IRQn in the range 0-31. */\n#define __NRF_NVIC_APP_IRQS_0 (~__NRF_NVIC_SD_IRQS_0)\n\n/**@brief Interrupts available for to application, with IRQn in the range 32-63. */\n#define __NRF_NVIC_APP_IRQS_1 (~__NRF_NVIC_SD_IRQS_1)\n\n/**@} */\n\n/**@} */\n\n/**@addtogroup NRF_NVIC_VARIABLES Variables\n * @{ */\n\n/**@brief Type representing the state struct for the SoftDevice NVIC module. */\ntypedef struct\n{\n  uint32_t volatile __irq_masks[__NRF_NVIC_ISER_COUNT]; /**< IRQs enabled by the application in the NVIC. */\n  uint32_t volatile __cr_flag;                          /**< Non-zero if already in a critical region */\n} nrf_nvic_state_t;\n\n/**@brief Variable keeping the state for the SoftDevice NVIC module. This must be declared in an\n * application source file. */\nextern nrf_nvic_state_t nrf_nvic_state;\n\n/**@} */\n\n/**@addtogroup NRF_NVIC_INTERNAL_FUNCTIONS SoftDevice NVIC internal functions\n * @{ */\n\n/**@brief Disables IRQ interrupts globally, including the SoftDevice's interrupts.\n *\n * @retval  The value of PRIMASK prior to disabling the interrupts.\n */\n__STATIC_INLINE int __sd_nvic_irq_disable(void);\n\n/**@brief Enables IRQ interrupts globally, including the SoftDevice's interrupts.\n */\n__STATIC_INLINE void __sd_nvic_irq_enable(void);\n\n/**@brief Checks if IRQn is available to application\n * @param[in]  IRQn  IRQ to check\n *\n * @retval  1 (true) if the IRQ to check is available to the application\n */\n__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn);\n\n/**@brief Checks if priority is available to application\n * @param[in]  priority  priority to check\n *\n * @retval  1 (true) if the priority to check is available to the application\n */\n__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority);\n\n/**@} */\n\n/**@addtogroup NRF_NVIC_FUNCTIONS SoftDevice NVIC public functions\n * @{ */\n\n/**@brief Enable External Interrupt.\n * @note Corresponds to NVIC_EnableIRQ in CMSIS.\n *\n * @pre IRQn is valid and not reserved by the stack.\n *\n * @param[in] IRQn See the NVIC_EnableIRQ documentation in CMSIS.\n *\n * @retval ::NRF_SUCCESS The interrupt was enabled.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt has a priority not available for the application.\n */\n__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn);\n\n/**@brief  Disable External Interrupt.\n * @note Corresponds to NVIC_DisableIRQ in CMSIS.\n *\n * @pre IRQn is valid and not reserved by the stack.\n *\n * @param[in] IRQn See the NVIC_DisableIRQ documentation in CMSIS.\n *\n * @retval ::NRF_SUCCESS The interrupt was disabled.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE The interrupt is not available for the application.\n */\n__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn);\n\n/**@brief  Get Pending Interrupt.\n * @note Corresponds to NVIC_GetPendingIRQ in CMSIS.\n *\n * @pre IRQn is valid and not reserved by the stack.\n *\n * @param[in]   IRQn          See the NVIC_GetPendingIRQ documentation in CMSIS.\n * @param[out]  p_pending_irq Return value from NVIC_GetPendingIRQ.\n *\n * @retval ::NRF_SUCCESS The interrupt is available for the application.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application.\n */\n__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq);\n\n/**@brief  Set Pending Interrupt.\n * @note Corresponds to NVIC_SetPendingIRQ in CMSIS.\n *\n * @pre IRQn is valid and not reserved by the stack.\n *\n * @param[in] IRQn See the NVIC_SetPendingIRQ documentation in CMSIS.\n *\n * @retval ::NRF_SUCCESS The interrupt is set pending.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application.\n */\n__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn);\n\n/**@brief  Clear Pending Interrupt.\n * @note Corresponds to NVIC_ClearPendingIRQ in CMSIS.\n *\n * @pre IRQn is valid and not reserved by the stack.\n *\n * @param[in] IRQn See the NVIC_ClearPendingIRQ documentation in CMSIS.\n *\n * @retval ::NRF_SUCCESS The interrupt pending flag is cleared.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application.\n */\n__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn);\n\n/**@brief Set Interrupt Priority.\n * @note Corresponds to NVIC_SetPriority in CMSIS.\n *\n * @pre IRQn is valid and not reserved by the stack.\n * @pre Priority is valid and not reserved by the stack.\n *\n * @param[in] IRQn      See the NVIC_SetPriority documentation in CMSIS.\n * @param[in] priority  A valid IRQ priority for use by the application.\n *\n * @retval ::NRF_SUCCESS The interrupt and priority level is available for the application.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE IRQn is not available for the application.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED The interrupt priority is not available for the application.\n */\n__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority);\n\n/**@brief Get Interrupt Priority.\n * @note Corresponds to NVIC_GetPriority in CMSIS.\n *\n * @pre IRQn is valid and not reserved by the stack.\n *\n * @param[in]  IRQn         See the NVIC_GetPriority documentation in CMSIS.\n * @param[out] p_priority   Return value from NVIC_GetPriority.\n *\n * @retval ::NRF_SUCCESS The interrupt priority is returned in p_priority.\n * @retval ::NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE - IRQn is not available for the application.\n */\n__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority);\n\n/**@brief System Reset.\n * @note Corresponds to NVIC_SystemReset in CMSIS.\n *\n * @retval ::NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN\n */\n__STATIC_INLINE uint32_t sd_nvic_SystemReset(void);\n\n/**@brief Enter critical region.\n *\n * @post Application interrupts will be disabled.\n * @note sd_nvic_critical_region_enter() and ::sd_nvic_critical_region_exit() must be called in matching pairs inside each\n * execution context\n * @sa sd_nvic_critical_region_exit\n *\n * @param[out] p_is_nested_critical_region If 1, the application is now in a nested critical region.\n *\n * @retval ::NRF_SUCCESS\n */\n__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region);\n\n/**@brief Exit critical region.\n *\n * @pre Application has entered a critical region using ::sd_nvic_critical_region_enter.\n * @post If not in a nested critical region, the application interrupts will restored to the state before ::sd_nvic_critical_region_enter was called.\n *\n * @param[in] is_nested_critical_region If this is set to 1, the critical region won't be exited. @sa sd_nvic_critical_region_enter.\n *\n * @retval ::NRF_SUCCESS\n */\n__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region);\n\n/**@} */\n\n#ifndef SUPPRESS_INLINE_IMPLEMENTATION\n\n__STATIC_INLINE int __sd_nvic_irq_disable(void)\n{\n  int pm = __get_PRIMASK();\n  __disable_irq();\n  return pm;\n}\n\n__STATIC_INLINE void __sd_nvic_irq_enable(void)\n{\n  __enable_irq();\n}\n\n__STATIC_INLINE uint32_t __sd_nvic_app_accessible_irq(IRQn_Type IRQn)\n{\n  if (IRQn < 32)\n  {\n    return ((1UL<<IRQn) & __NRF_NVIC_APP_IRQS_0) != 0;\n  }\n  else if (IRQn < 64)\n  {\n    return ((1UL<<(IRQn-32)) & __NRF_NVIC_APP_IRQS_1) != 0;\n  }\n  else\n  {\n    return 1;\n  }\n}\n\n__STATIC_INLINE uint32_t __sd_nvic_is_app_accessible_priority(uint32_t priority)\n{\n  if( (priority >= (1 << __NVIC_PRIO_BITS))\n   || (((1 << priority) & __NRF_NVIC_APP_IRQ_PRIOS) == 0)\n    )\n  {\n    return 0;\n  }\n  return 1;\n}\n\n\n__STATIC_INLINE uint32_t sd_nvic_EnableIRQ(IRQn_Type IRQn)\n{\n  if (!__sd_nvic_app_accessible_irq(IRQn))\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE;\n  }\n  if (!__sd_nvic_is_app_accessible_priority(NVIC_GetPriority(IRQn)))\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED;\n  }\n\n  if (nrf_nvic_state.__cr_flag)\n  {\n    nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] |= (uint32_t)(1 << ((uint32_t)((int32_t)IRQn) & (uint32_t)0x1F));\n  }\n  else\n  {\n    NVIC_EnableIRQ(IRQn);\n  }\n  return NRF_SUCCESS;\n}\n\n__STATIC_INLINE uint32_t sd_nvic_DisableIRQ(IRQn_Type IRQn)\n{\n  if (!__sd_nvic_app_accessible_irq(IRQn))\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE;\n  }\n\n  if (nrf_nvic_state.__cr_flag)\n  {\n    nrf_nvic_state.__irq_masks[(uint32_t)((int32_t)IRQn) >> 5] &= ~(1UL << ((uint32_t)(IRQn) & 0x1F));\n  }\n  else\n  {\n    NVIC_DisableIRQ(IRQn);\n  }\n\n  return NRF_SUCCESS;\n}\n\n__STATIC_INLINE uint32_t sd_nvic_GetPendingIRQ(IRQn_Type IRQn, uint32_t * p_pending_irq)\n{\n  if (__sd_nvic_app_accessible_irq(IRQn))\n  {\n    *p_pending_irq = NVIC_GetPendingIRQ(IRQn);\n    return NRF_SUCCESS;\n  }\n  else\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE;\n  }\n}\n\n__STATIC_INLINE uint32_t sd_nvic_SetPendingIRQ(IRQn_Type IRQn)\n{\n  if (__sd_nvic_app_accessible_irq(IRQn))\n  {\n    NVIC_SetPendingIRQ(IRQn);\n    return NRF_SUCCESS;\n  }\n  else\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE;\n  }\n}\n\n__STATIC_INLINE uint32_t sd_nvic_ClearPendingIRQ(IRQn_Type IRQn)\n{\n  if (__sd_nvic_app_accessible_irq(IRQn))\n  {\n    NVIC_ClearPendingIRQ(IRQn);\n    return NRF_SUCCESS;\n  }\n  else\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE;\n  }\n}\n\n__STATIC_INLINE uint32_t sd_nvic_SetPriority(IRQn_Type IRQn, uint32_t priority)\n{\n  if (!__sd_nvic_app_accessible_irq(IRQn))\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE;\n  }\n\n  if (!__sd_nvic_is_app_accessible_priority(priority))\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_PRIORITY_NOT_ALLOWED;\n  }\n\n  NVIC_SetPriority(IRQn, (uint32_t)priority);\n  return NRF_SUCCESS;\n}\n\n__STATIC_INLINE uint32_t sd_nvic_GetPriority(IRQn_Type IRQn, uint32_t * p_priority)\n{\n  if (__sd_nvic_app_accessible_irq(IRQn))\n  {\n    *p_priority = (NVIC_GetPriority(IRQn) & 0xFF);\n    return NRF_SUCCESS;\n  }\n  else\n  {\n    return NRF_ERROR_SOC_NVIC_INTERRUPT_NOT_AVAILABLE;\n  }\n}\n\n__STATIC_INLINE uint32_t sd_nvic_SystemReset(void)\n{\n  NVIC_SystemReset();\n  return NRF_ERROR_SOC_NVIC_SHOULD_NOT_RETURN;\n}\n\n__STATIC_INLINE uint32_t sd_nvic_critical_region_enter(uint8_t * p_is_nested_critical_region)\n{\n  int was_masked = __sd_nvic_irq_disable();\n  if (!nrf_nvic_state.__cr_flag)\n  {\n    nrf_nvic_state.__cr_flag = 1;\n    nrf_nvic_state.__irq_masks[0] = ( NVIC->ICER[0] & __NRF_NVIC_APP_IRQS_0 );\n    NVIC->ICER[0] = __NRF_NVIC_APP_IRQS_0;\n    nrf_nvic_state.__irq_masks[1] = ( NVIC->ICER[1] & __NRF_NVIC_APP_IRQS_1 );\n    NVIC->ICER[1] = __NRF_NVIC_APP_IRQS_1;\n    *p_is_nested_critical_region = 0;\n  }\n  else\n  {\n    *p_is_nested_critical_region = 1;\n  }\n  if (!was_masked)\n  {\n    __sd_nvic_irq_enable();\n  }\n  return NRF_SUCCESS;\n}\n\n__STATIC_INLINE uint32_t sd_nvic_critical_region_exit(uint8_t is_nested_critical_region)\n{\n  if (nrf_nvic_state.__cr_flag && (is_nested_critical_region == 0))\n  {\n    int was_masked = __sd_nvic_irq_disable();\n    NVIC->ISER[0] = nrf_nvic_state.__irq_masks[0];\n    NVIC->ISER[1] = nrf_nvic_state.__irq_masks[1];\n    nrf_nvic_state.__cr_flag = 0;\n    if (!was_masked)\n    {\n      __sd_nvic_irq_enable();\n    }\n  }\n\n  return NRF_SUCCESS;\n}\n\n#endif /* SUPPRESS_INLINE_IMPLEMENTATION */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // NRF_NVIC_H__\n\n/**@} */\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/nrf_sdm.h",
    "content": "/*\n * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n  @defgroup nrf_sdm_api SoftDevice Manager API\n  @{\n\n  @brief APIs for SoftDevice management.\n\n*/\n\n#ifndef NRF_SDM_H__\n#define NRF_SDM_H__\n\n#include <stdint.h>\n#include \"nrf.h\"\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"nrf_error_sdm.h\"\n#include \"nrf_soc.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @addtogroup NRF_SDM_DEFINES Defines\n * @{ */\n#ifdef NRFSOC_DOXYGEN\n/// Declared in nrf_mbr.h\n#define MBR_SIZE 0\n#warning test\n#endif\n\n/** @brief The major version for the SoftDevice binary distributed with this header file. */\n#define SD_MAJOR_VERSION  (6)\n\n/** @brief The minor version for the SoftDevice binary distributed with this header file. */\n#define SD_MINOR_VERSION  (1)\n\n/** @brief The bugfix version for the SoftDevice binary distributed with this header file. */\n#define SD_BUGFIX_VERSION (1)\n\n/** @brief The SoftDevice variant of this firmware. */\n#define SD_VARIANT_ID 140\n\n/** @brief The full version number for the SoftDevice binary this header file was distributed\n *         with, as a decimal number in the form Mmmmbbb, where:\n *           - M is major version (one or more digits)\n *           - mmm is minor version (three digits)\n *           - bbb is bugfix version (three digits). */\n#define SD_VERSION (SD_MAJOR_VERSION * 1000000 + SD_MINOR_VERSION * 1000 + SD_BUGFIX_VERSION)\n\n/** @brief SoftDevice Manager SVC Base number. */\n#define SDM_SVC_BASE 0x10\n\n/** @brief SoftDevice unique string size in bytes. */\n#define SD_UNIQUE_STR_SIZE 20\n\n/** @brief Invalid info field. Returned when an info field does not exist. */\n#define SDM_INFO_FIELD_INVALID (0)\n\n/** @brief Defines the SoftDevice Information Structure location (address) as an offset from\nthe start of the SoftDevice (without MBR)*/\n#define SOFTDEVICE_INFO_STRUCT_OFFSET (0x2000)\n\n/** @brief Defines the absolute SoftDevice Information Structure location (address) when the\n *         SoftDevice is installed just above the MBR (the usual case). */\n#define SOFTDEVICE_INFO_STRUCT_ADDRESS (SOFTDEVICE_INFO_STRUCT_OFFSET + MBR_SIZE)\n\n/** @brief Defines the offset for the SoftDevice Information Structure size value relative to the\n *         SoftDevice base address. The size value is of type uint8_t. */\n#define SD_INFO_STRUCT_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET)\n\n/** @brief Defines the offset for the SoftDevice size value relative to the SoftDevice base address.\n *         The size value is of type uint32_t. */\n#define SD_SIZE_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x08)\n\n/** @brief Defines the offset for FWID value relative to the SoftDevice base address. The FWID value\n *         is of type uint16_t.  */\n#define SD_FWID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x0C)\n\n/** @brief Defines the offset for the SoftDevice ID relative to the SoftDevice base address. The ID\n *         is of type uint32_t. */\n#define SD_ID_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x10)\n\n/** @brief Defines the offset for the SoftDevice version relative to the SoftDevice base address in\n *         the same format as @ref SD_VERSION, stored as an uint32_t. */\n#define SD_VERSION_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x14)\n\n/** @brief Defines the offset for the SoftDevice unique string relative to the SoftDevice base address.\n *         The SD_UNIQUE_STR is stored as an array of uint8_t. The size of array is @ref SD_UNIQUE_STR_SIZE.\n */\n#define SD_UNIQUE_STR_OFFSET (SOFTDEVICE_INFO_STRUCT_OFFSET + 0x18)\n\n/** @brief Defines a macro for retrieving the actual SoftDevice Information Structure size value\n *         from a given base address. Use @ref MBR_SIZE as the argument when the SoftDevice is\n *         installed just above the MBR (the usual case). */\n#define SD_INFO_STRUCT_SIZE_GET(baseaddr) (*((uint8_t *) ((baseaddr) + SD_INFO_STRUCT_SIZE_OFFSET)))\n\n/** @brief Defines a macro for retrieving the actual SoftDevice size value from a given base\n *         address. Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above\n *         the MBR (the usual case). */\n#define SD_SIZE_GET(baseaddr) (*((uint32_t *) ((baseaddr) + SD_SIZE_OFFSET)))\n\n/** @brief Defines the amount of flash that is used by the SoftDevice.\n *         Add @ref MBR_SIZE to find the first available flash address when the SoftDevice is installed\n *         just above the MBR (the usual case).\n */\n#define SD_FLASH_SIZE 0x25000\n\n/** @brief Defines a macro for retrieving the actual FWID value from a given base address. Use\n *         @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the usual\n *         case). */\n#define SD_FWID_GET(baseaddr) (*((uint16_t *) ((baseaddr) + SD_FWID_OFFSET)))\n\n/** @brief Defines a macro for retrieving the actual SoftDevice ID from a given base address. Use\n *         @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR (the\n *         usual case). */\n#define SD_ID_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_ID_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \\\n        ? (*((uint32_t *) ((baseaddr) + SD_ID_OFFSET))) : SDM_INFO_FIELD_INVALID)\n\n/** @brief Defines a macro for retrieving the actual SoftDevice version from a given base address.\n *         Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR\n *         (the usual case). */\n#define SD_VERSION_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_VERSION_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \\\n        ? (*((uint32_t *) ((baseaddr) + SD_VERSION_OFFSET))) : SDM_INFO_FIELD_INVALID)\n\n/** @brief Defines a macro for retrieving the address of SoftDevice unique str based on a given base address.\n *         Use @ref MBR_SIZE as the argument when the SoftDevice is installed just above the MBR\n *         (the usual case). */\n#define SD_UNIQUE_STR_ADDR_GET(baseaddr) ((SD_INFO_STRUCT_SIZE_GET(baseaddr) > (SD_UNIQUE_STR_OFFSET - SOFTDEVICE_INFO_STRUCT_OFFSET)) \\\n        ? (((uint8_t *) ((baseaddr) + SD_UNIQUE_STR_OFFSET))) : SDM_INFO_FIELD_INVALID)\n\n/**@defgroup NRF_FAULT_ID_RANGES Fault ID ranges\n * @{ */\n#define NRF_FAULT_ID_SD_RANGE_START     0x00000000            /**< SoftDevice ID range start. */\n#define NRF_FAULT_ID_APP_RANGE_START    0x00001000            /**< Application ID range start. */\n/**@} */\n\n/**@defgroup NRF_FAULT_IDS Fault ID types\n * @{ */\n#define NRF_FAULT_ID_SD_ASSERT    (NRF_FAULT_ID_SD_RANGE_START  + 1)          /**< SoftDevice assertion. The info parameter is reserved for future used. */\n#define NRF_FAULT_ID_APP_MEMACC   (NRF_FAULT_ID_APP_RANGE_START + 1)          /**< Application invalid memory access. The info parameter will contain 0x00000000,\n                                                                                   in case of SoftDevice RAM access violation. In case of SoftDevice peripheral\n                                                                                   register violation the info parameter will contain the sub-region number of\n                                                                                   PREGION[0], on whose address range the disallowed write access caused the\n                                                                                   memory access fault. */\n/**@} */\n\n/** @} */\n\n/** @addtogroup NRF_SDM_ENUMS Enumerations\n * @{ */\n\n/**@brief nRF SoftDevice Manager API SVC numbers. */\nenum NRF_SD_SVCS\n{\n  SD_SOFTDEVICE_ENABLE = SDM_SVC_BASE, /**< ::sd_softdevice_enable */\n  SD_SOFTDEVICE_DISABLE,               /**< ::sd_softdevice_disable */\n  SD_SOFTDEVICE_IS_ENABLED,            /**< ::sd_softdevice_is_enabled */\n  SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, /**< ::sd_softdevice_vector_table_base_set */\n  SVC_SDM_LAST                         /**< Placeholder for last SDM SVC */\n};\n\n/** @} */\n\n/** @addtogroup NRF_SDM_DEFINES Defines\n * @{ */\n\n/**@defgroup NRF_CLOCK_LF_ACCURACY Clock accuracy\n * @{ */\n\n#define NRF_CLOCK_LF_ACCURACY_250_PPM (0) /**< Default: 250 ppm */\n#define NRF_CLOCK_LF_ACCURACY_500_PPM (1) /**< 500 ppm */\n#define NRF_CLOCK_LF_ACCURACY_150_PPM (2) /**< 150 ppm */\n#define NRF_CLOCK_LF_ACCURACY_100_PPM (3) /**< 100 ppm */\n#define NRF_CLOCK_LF_ACCURACY_75_PPM  (4) /**< 75 ppm */\n#define NRF_CLOCK_LF_ACCURACY_50_PPM  (5) /**< 50 ppm */\n#define NRF_CLOCK_LF_ACCURACY_30_PPM  (6) /**< 30 ppm */\n#define NRF_CLOCK_LF_ACCURACY_20_PPM  (7) /**< 20 ppm */\n#define NRF_CLOCK_LF_ACCURACY_10_PPM  (8) /**< 10 ppm */\n#define NRF_CLOCK_LF_ACCURACY_5_PPM   (9) /**<  5 ppm */\n#define NRF_CLOCK_LF_ACCURACY_2_PPM  (10) /**<  2 ppm */\n#define NRF_CLOCK_LF_ACCURACY_1_PPM  (11) /**<  1 ppm */\n\n/** @} */\n\n/**@defgroup NRF_CLOCK_LF_SRC Possible LFCLK oscillator sources\n * @{ */\n\n#define NRF_CLOCK_LF_SRC_RC      (0)                        /**< LFCLK RC oscillator. */\n#define NRF_CLOCK_LF_SRC_XTAL    (1)                        /**< LFCLK crystal oscillator. */\n#define NRF_CLOCK_LF_SRC_SYNTH   (2)                        /**< LFCLK Synthesized from HFCLK. */\n\n/** @} */\n\n/** @} */\n\n/** @addtogroup NRF_SDM_TYPES Types\n * @{ */\n\n/**@brief Type representing LFCLK oscillator source. */\ntypedef struct\n{\n  uint8_t source;         /**< LF oscillator clock source, see @ref NRF_CLOCK_LF_SRC. */\n  uint8_t rc_ctiv;        /**< Only for ::NRF_CLOCK_LF_SRC_RC: Calibration timer interval in 1/4 second\n                               units (nRF52: 1-32).\n                               @note To avoid excessive clock drift, 0.5 degrees Celsius is the\n                                     maximum temperature change allowed in one calibration timer\n                                     interval. The interval should be selected to ensure this.\n\n                                  @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC.  */\n  uint8_t rc_temp_ctiv;   /**<  Only for ::NRF_CLOCK_LF_SRC_RC: How often (in number of calibration\n                                intervals) the RC oscillator shall be calibrated if the temperature\n                                hasn't changed.\n                                     0: Always calibrate even if the temperature hasn't changed.\n                                     1: Only calibrate if the temperature has changed (legacy - nRF51 only).\n                                     2-33: Check the temperature and only calibrate if it has changed,\n                                           however calibration will take place every rc_temp_ctiv\n                                           intervals in any case.\n\n                                @note Must be 0 if source is not ::NRF_CLOCK_LF_SRC_RC.\n\n                                @note For nRF52, the application must ensure calibration at least once\n                                      every 8 seconds to ensure +/-500 ppm clock stability. The\n                                      recommended configuration for ::NRF_CLOCK_LF_SRC_RC on nRF52 is\n                                      rc_ctiv=16 and rc_temp_ctiv=2. This will ensure calibration at\n                                      least once every 8 seconds and for temperature changes of 0.5\n                                      degrees Celsius every 4 seconds. See the Product Specification\n                                      for the nRF52 device being used for more information.*/\n  uint8_t accuracy;       /**< External clock accuracy used in the LL to compute timing\n                               windows, see @ref NRF_CLOCK_LF_ACCURACY.*/\n} nrf_clock_lf_cfg_t;\n\n/**@brief Fault Handler type.\n *\n * When certain unrecoverable errors occur within the application or SoftDevice the fault handler will be called back.\n * The protocol stack will be in an undefined state when this happens and the only way to recover will be to\n * perform a reset, using e.g. CMSIS NVIC_SystemReset().\n * If the application returns from the fault handler the SoftDevice will call NVIC_SystemReset().\n *\n * @note This callback is executed in HardFault context, thus SVC functions cannot be called from the fault callback.\n *\n * @param[in] id Fault identifier. See @ref NRF_FAULT_IDS.\n * @param[in] pc The program counter of the instruction that triggered the fault.\n * @param[in] info Optional additional information regarding the fault. Refer to each Fault identifier for details.\n *\n * @note When id is set to @ref NRF_FAULT_ID_APP_MEMACC, pc will contain the address of the instruction being executed at the time when\n * the fault is detected by the CPU. The CPU program counter may have advanced up to 2 instructions (no branching) after the one that triggered the fault.\n */\ntypedef void (*nrf_fault_handler_t)(uint32_t id, uint32_t pc, uint32_t info);\n\n/** @} */\n\n/** @addtogroup NRF_SDM_FUNCTIONS Functions\n * @{ */\n\n/**@brief Enables the SoftDevice and by extension the protocol stack.\n *\n * @note Some care must be taken if a low frequency clock source is already running when calling this function:\n *       If the LF clock has a different source then the one currently running, it will be stopped. Then, the new\n *       clock source will be started.\n *\n * @note This function has no effect when returning with an error.\n *\n * @post If return code is ::NRF_SUCCESS\n *       - SoC library and protocol stack APIs are made available.\n *       - A portion of RAM will be unavailable (see relevant SDS documentation).\n *       - Some peripherals will be unavailable or available only through the SoC API (see relevant SDS documentation).\n *       - Interrupts will not arrive from protected peripherals or interrupts.\n *       - nrf_nvic_ functions must be used instead of CMSIS NVIC_ functions for reliable usage of the SoftDevice.\n *       - Interrupt latency may be affected by the SoftDevice  (see relevant SDS documentation).\n *       - Chosen low frequency clock source will be running.\n *\n * @param p_clock_lf_cfg Low frequency clock source and accuracy.\n                         If NULL the clock will be configured as an RC source with rc_ctiv = 16 and .rc_temp_ctiv = 2\n                         In the case of XTAL source, the PPM accuracy of the chosen clock source must be greater than or equal to the actual characteristics of your XTAL clock.\n * @param fault_handler Callback to be invoked in case of fault, cannot be NULL.\n *\n * @retval ::NRF_SUCCESS\n * @retval ::NRF_ERROR_INVALID_ADDR  Invalid or NULL pointer supplied.\n * @retval ::NRF_ERROR_INVALID_STATE SoftDevice is already enabled, and the clock source and fault handler cannot be updated.\n * @retval ::NRF_ERROR_SDM_INCORRECT_INTERRUPT_CONFIGURATION SoftDevice interrupt is already enabled, or an enabled interrupt has an illegal priority level.\n * @retval ::NRF_ERROR_SDM_LFCLK_SOURCE_UNKNOWN Unknown low frequency clock source selected.\n * @retval ::NRF_ERROR_INVALID_PARAM Invalid clock source configuration supplied in p_clock_lf_cfg.\n */\nSVCALL(SD_SOFTDEVICE_ENABLE, uint32_t, sd_softdevice_enable(nrf_clock_lf_cfg_t const * p_clock_lf_cfg, nrf_fault_handler_t fault_handler));\n\n\n/**@brief Disables the SoftDevice and by extension the protocol stack.\n *\n * Idempotent function to disable the SoftDevice.\n *\n * @post SoC library and protocol stack APIs are made unavailable.\n * @post All interrupts that was protected by the SoftDevice will be disabled and initialized to priority 0 (highest).\n * @post All peripherals used by the SoftDevice will be reset to default values.\n * @post All of RAM become available.\n * @post All interrupts are forwarded to the application.\n * @post LFCLK source chosen in ::sd_softdevice_enable will be left running.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_SOFTDEVICE_DISABLE, uint32_t, sd_softdevice_disable(void));\n\n/**@brief Check if the SoftDevice is enabled.\n *\n * @param[out]  p_softdevice_enabled If the SoftDevice is enabled: 1 else 0.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_SOFTDEVICE_IS_ENABLED, uint32_t, sd_softdevice_is_enabled(uint8_t * p_softdevice_enabled));\n\n/**@brief Sets the base address of the interrupt vector table for interrupts forwarded from the SoftDevice\n *\n * This function is only intended to be called when a bootloader is enabled.\n *\n * @param[in] address The base address of the interrupt vector table for forwarded interrupts.\n\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_SOFTDEVICE_VECTOR_TABLE_BASE_SET, uint32_t, sd_softdevice_vector_table_base_set(uint32_t address));\n\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n#endif // NRF_SDM_H__\n\n/**\n  @}\n*/\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/nrf_soc.h",
    "content": "/*\n * Copyright (c) 2015 - 2018, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @defgroup nrf_soc_api SoC Library API\n * @{\n *\n * @brief APIs for the SoC library.\n *\n */\n\n#ifndef NRF_SOC_H__\n#define NRF_SOC_H__\n\n#include <stdint.h>\n#include \"nrf.h\"\n#include \"nrf_svc.h\"\n#include \"nrf_error.h\"\n#include \"nrf_error_soc.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**@addtogroup NRF_SOC_DEFINES Defines\n * @{ */\n\n/**@brief The number of the lowest SVC number reserved for the SoC library. */\n#define SOC_SVC_BASE               (0x20)                   /**< Base value for SVCs that are available when the SoftDevice is disabled. */\n#define SOC_SVC_BASE_NOT_AVAILABLE (0x2C)                   /**< Base value for SVCs that are not available when the SoftDevice is disabled. */\n\n/**@brief Guaranteed time for application to process radio inactive notification. */\n#define NRF_RADIO_NOTIFICATION_INACTIVE_GUARANTEED_TIME_US  (62)\n\n/**@brief The minimum allowed timeslot extension time. */\n#define NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US (200)\n\n/**@brief The maximum processing time to handle a timeslot extension. */\n#define NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US           (17)\n\n/**@brief The latest time before the end of a timeslot the timeslot can be extended. */\n#define NRF_RADIO_MIN_EXTENSION_MARGIN_US                    (79)\n\n#define SOC_ECB_KEY_LENGTH                (16)                       /**< ECB key length. */\n#define SOC_ECB_CLEARTEXT_LENGTH          (16)                       /**< ECB cleartext length. */\n#define SOC_ECB_CIPHERTEXT_LENGTH         (SOC_ECB_CLEARTEXT_LENGTH) /**< ECB ciphertext length. */\n\n#define SD_EVT_IRQn                       (SWI2_IRQn)        /**< SoftDevice Event IRQ number. Used for both protocol events and SoC events. */\n#define SD_EVT_IRQHandler                 (SWI2_IRQHandler)  /**< SoftDevice Event IRQ handler. Used for both protocol events and SoC events.\n                                                                       The default interrupt priority for this handler is set to 6 */\n#define RADIO_NOTIFICATION_IRQn           (SWI1_IRQn)        /**< The radio notification IRQ number. */\n#define RADIO_NOTIFICATION_IRQHandler     (SWI1_IRQHandler)  /**< The radio notification IRQ handler.\n                                                                       The default interrupt priority for this handler is set to 6 */\n#define NRF_RADIO_LENGTH_MIN_US           (100)               /**< The shortest allowed radio timeslot, in microseconds. */\n#define NRF_RADIO_LENGTH_MAX_US           (100000)            /**< The longest allowed radio timeslot, in microseconds. */\n\n#define NRF_RADIO_DISTANCE_MAX_US         (128000000UL - 1UL) /**< The longest timeslot distance, in microseconds, allowed for the distance parameter (see @ref nrf_radio_request_normal_t) in the request. */\n\n#define NRF_RADIO_EARLIEST_TIMEOUT_MAX_US (128000000UL - 1UL) /**< The longest timeout, in microseconds, allowed when requesting the earliest possible timeslot. */\n\n#define NRF_RADIO_START_JITTER_US         (2)                 /**< The maximum jitter in @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START relative to the requested start time. */\n\n/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is disabled. */\n#define NRF_SOC_SD_PPI_CHANNELS_SD_DISABLED_MSK ((uint32_t)(0))\n\n/**@brief Mask of PPI channels reserved by the SoftDevice when the SoftDevice is enabled. */\n#define NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK  ((uint32_t)( \\\n      (1U << 17) \\\n    | (1U << 18) \\\n    | (1U << 19) \\\n    | (1U << 20) \\\n    | (1U << 21) \\\n    | (1U << 22) \\\n    | (1U << 23) \\\n    | (1U << 24) \\\n    | (1U << 25) \\\n    | (1U << 26) \\\n    | (1U << 27) \\\n    | (1U << 28) \\\n    | (1U << 29) \\\n    | (1U << 30) \\\n    | (1U << 31) \\\n  ))\n\n/**@brief Mask of PPI channels available to the application when the SoftDevice is disabled. */\n#define NRF_SOC_APP_PPI_CHANNELS_SD_DISABLED_MSK (~NRF_SOC_SD_PPI_CHANNELS_SD_DISABLED_MSK)\n\n/**@brief Mask of PPI channels available to the application when the SoftDevice is enabled. */\n#define NRF_SOC_APP_PPI_CHANNELS_SD_ENABLED_MSK  (~NRF_SOC_SD_PPI_CHANNELS_SD_ENABLED_MSK)\n\n/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is disabled. */\n#define NRF_SOC_SD_PPI_GROUPS_SD_DISABLED_MSK    ((uint32_t)(0))\n\n/**@brief Mask of PPI groups reserved by the SoftDevice when the SoftDevice is enabled. */\n#define NRF_SOC_SD_PPI_GROUPS_SD_ENABLED_MSK     ((uint32_t)( \\\n      (1U << 4) \\\n    | (1U << 5) \\\n  ))\n\n/**@brief Mask of PPI groups available to the application when the SoftDevice is disabled. */\n#define NRF_SOC_APP_PPI_GROUPS_SD_DISABLED_MSK   (~NRF_SOC_SD_PPI_GROUPS_SD_DISABLED_MSK)\n\n/**@brief Mask of PPI groups available to the application when the SoftDevice is enabled. */\n#define NRF_SOC_APP_PPI_GROUPS_SD_ENABLED_MSK    (~NRF_SOC_SD_PPI_GROUPS_SD_ENABLED_MSK)\n\n/**@} */\n\n/**@addtogroup NRF_SOC_ENUMS Enumerations\n * @{ */\n\n/**@brief The SVC numbers used by the SVC functions in the SoC library. */\nenum NRF_SOC_SVCS\n{\n  SD_PPI_CHANNEL_ENABLE_GET   = SOC_SVC_BASE,\n  SD_PPI_CHANNEL_ENABLE_SET   = SOC_SVC_BASE + 1,\n  SD_PPI_CHANNEL_ENABLE_CLR   = SOC_SVC_BASE + 2,\n  SD_PPI_CHANNEL_ASSIGN       = SOC_SVC_BASE + 3,\n  SD_PPI_GROUP_TASK_ENABLE    = SOC_SVC_BASE + 4,\n  SD_PPI_GROUP_TASK_DISABLE   = SOC_SVC_BASE + 5,\n  SD_PPI_GROUP_ASSIGN         = SOC_SVC_BASE + 6,\n  SD_PPI_GROUP_GET            = SOC_SVC_BASE + 7,\n  SD_FLASH_PAGE_ERASE         = SOC_SVC_BASE + 8,\n  SD_FLASH_WRITE              = SOC_SVC_BASE + 9,\n  SD_PROTECTED_REGISTER_WRITE = SOC_SVC_BASE + 11,\n  SD_MUTEX_NEW                            = SOC_SVC_BASE_NOT_AVAILABLE,\n  SD_MUTEX_ACQUIRE                        = SOC_SVC_BASE_NOT_AVAILABLE + 1,\n  SD_MUTEX_RELEASE                        = SOC_SVC_BASE_NOT_AVAILABLE + 2,\n  SD_RAND_APPLICATION_POOL_CAPACITY_GET   = SOC_SVC_BASE_NOT_AVAILABLE + 3,\n  SD_RAND_APPLICATION_BYTES_AVAILABLE_GET = SOC_SVC_BASE_NOT_AVAILABLE + 4,\n  SD_RAND_APPLICATION_VECTOR_GET          = SOC_SVC_BASE_NOT_AVAILABLE + 5,\n  SD_POWER_MODE_SET                       = SOC_SVC_BASE_NOT_AVAILABLE + 6,\n  SD_POWER_SYSTEM_OFF                     = SOC_SVC_BASE_NOT_AVAILABLE + 7,\n  SD_POWER_RESET_REASON_GET               = SOC_SVC_BASE_NOT_AVAILABLE + 8,\n  SD_POWER_RESET_REASON_CLR               = SOC_SVC_BASE_NOT_AVAILABLE + 9,\n  SD_POWER_POF_ENABLE                     = SOC_SVC_BASE_NOT_AVAILABLE + 10,\n  SD_POWER_POF_THRESHOLD_SET              = SOC_SVC_BASE_NOT_AVAILABLE + 11,\n  SD_POWER_POF_THRESHOLDVDDH_SET          = SOC_SVC_BASE_NOT_AVAILABLE + 12,\n  SD_POWER_RAM_POWER_SET                  = SOC_SVC_BASE_NOT_AVAILABLE + 13,\n  SD_POWER_RAM_POWER_CLR                  = SOC_SVC_BASE_NOT_AVAILABLE + 14,\n  SD_POWER_RAM_POWER_GET                  = SOC_SVC_BASE_NOT_AVAILABLE + 15,\n  SD_POWER_GPREGRET_SET                   = SOC_SVC_BASE_NOT_AVAILABLE + 16,\n  SD_POWER_GPREGRET_CLR                   = SOC_SVC_BASE_NOT_AVAILABLE + 17,\n  SD_POWER_GPREGRET_GET                   = SOC_SVC_BASE_NOT_AVAILABLE + 18,\n  SD_POWER_DCDC_MODE_SET                  = SOC_SVC_BASE_NOT_AVAILABLE + 19,\n  SD_POWER_DCDC0_MODE_SET                 = SOC_SVC_BASE_NOT_AVAILABLE + 20,\n  SD_APP_EVT_WAIT                         = SOC_SVC_BASE_NOT_AVAILABLE + 21,\n  SD_CLOCK_HFCLK_REQUEST                  = SOC_SVC_BASE_NOT_AVAILABLE + 22,\n  SD_CLOCK_HFCLK_RELEASE                  = SOC_SVC_BASE_NOT_AVAILABLE + 23,\n  SD_CLOCK_HFCLK_IS_RUNNING               = SOC_SVC_BASE_NOT_AVAILABLE + 24,\n  SD_RADIO_NOTIFICATION_CFG_SET           = SOC_SVC_BASE_NOT_AVAILABLE + 25,\n  SD_ECB_BLOCK_ENCRYPT                    = SOC_SVC_BASE_NOT_AVAILABLE + 26,\n  SD_ECB_BLOCKS_ENCRYPT                   = SOC_SVC_BASE_NOT_AVAILABLE + 27,\n  SD_RADIO_SESSION_OPEN                   = SOC_SVC_BASE_NOT_AVAILABLE + 28,\n  SD_RADIO_SESSION_CLOSE                  = SOC_SVC_BASE_NOT_AVAILABLE + 29,\n  SD_RADIO_REQUEST                        = SOC_SVC_BASE_NOT_AVAILABLE + 30,\n  SD_EVT_GET                              = SOC_SVC_BASE_NOT_AVAILABLE + 31,\n  SD_TEMP_GET                             = SOC_SVC_BASE_NOT_AVAILABLE + 32,\n  SD_POWER_USBPWRRDY_ENABLE               = SOC_SVC_BASE_NOT_AVAILABLE + 33,\n  SD_POWER_USBDETECTED_ENABLE             = SOC_SVC_BASE_NOT_AVAILABLE + 34,\n  SD_POWER_USBREMOVED_ENABLE              = SOC_SVC_BASE_NOT_AVAILABLE + 35,\n  SD_POWER_USBREGSTATUS_GET               = SOC_SVC_BASE_NOT_AVAILABLE + 36,\n  SVC_SOC_LAST                            = SOC_SVC_BASE_NOT_AVAILABLE + 37\n};\n\n/**@brief Possible values of a ::nrf_mutex_t. */\nenum NRF_MUTEX_VALUES\n{\n  NRF_MUTEX_FREE,\n  NRF_MUTEX_TAKEN\n};\n\n/**@brief Power modes. */\nenum NRF_POWER_MODES\n{\n  NRF_POWER_MODE_CONSTLAT,  /**< Constant latency mode. See power management in the reference manual. */\n  NRF_POWER_MODE_LOWPWR     /**< Low power mode. See power management in the reference manual. */\n};\n\n\n/**@brief Power failure thresholds */\nenum NRF_POWER_THRESHOLDS\n{\n  NRF_POWER_THRESHOLD_V17 = 4UL, /**< 1.7 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V18,       /**< 1.8 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V19,       /**< 1.9 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V20,       /**< 2.0 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V21,       /**< 2.1 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V22,       /**< 2.2 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V23,       /**< 2.3 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V24,       /**< 2.4 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V25,       /**< 2.5 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V26,       /**< 2.6 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V27,       /**< 2.7 Volts power failure threshold. */\n  NRF_POWER_THRESHOLD_V28        /**< 2.8 Volts power failure threshold. */\n};\n\n/**@brief Power failure thresholds for high voltage */\nenum NRF_POWER_THRESHOLDVDDHS\n{\n  NRF_POWER_THRESHOLDVDDH_V27,       /**< 2.7 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V28,       /**< 2.8 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V29,       /**< 2.9 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V30,       /**< 3.0 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V31,       /**< 3.1 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V32,       /**< 3.2 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V33,       /**< 3.3 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V34,       /**< 3.4 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V35,       /**< 3.5 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V36,       /**< 3.6 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V37,       /**< 3.7 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V38,       /**< 3.8 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V39,       /**< 3.9 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V40,       /**< 4.0 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V41,       /**< 4.1 Volts power failure threshold. */\n  NRF_POWER_THRESHOLDVDDH_V42        /**< 4.2 Volts power failure threshold. */\n};\n\n\n/**@brief DC/DC converter modes. */\nenum NRF_POWER_DCDC_MODES\n{\n  NRF_POWER_DCDC_DISABLE,          /**< The DCDC is disabled. */\n  NRF_POWER_DCDC_ENABLE            /**< The DCDC is enabled.  */\n};\n\n/**@brief Radio notification distances. */\nenum NRF_RADIO_NOTIFICATION_DISTANCES\n{\n  NRF_RADIO_NOTIFICATION_DISTANCE_NONE = 0, /**< The event does not have a notification. */\n  NRF_RADIO_NOTIFICATION_DISTANCE_800US,    /**< The distance from the active notification to start of radio activity. */\n  NRF_RADIO_NOTIFICATION_DISTANCE_1740US,   /**< The distance from the active notification to start of radio activity. */\n  NRF_RADIO_NOTIFICATION_DISTANCE_2680US,   /**< The distance from the active notification to start of radio activity. */\n  NRF_RADIO_NOTIFICATION_DISTANCE_3620US,   /**< The distance from the active notification to start of radio activity. */\n  NRF_RADIO_NOTIFICATION_DISTANCE_4560US,   /**< The distance from the active notification to start of radio activity. */\n  NRF_RADIO_NOTIFICATION_DISTANCE_5500US    /**< The distance from the active notification to start of radio activity. */\n};\n\n\n/**@brief Radio notification types. */\nenum NRF_RADIO_NOTIFICATION_TYPES\n{\n  NRF_RADIO_NOTIFICATION_TYPE_NONE = 0,        /**< The event does not have a radio notification signal. */\n  NRF_RADIO_NOTIFICATION_TYPE_INT_ON_ACTIVE,   /**< Using interrupt for notification when the radio will be enabled. */\n  NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE, /**< Using interrupt for notification when the radio has been disabled. */\n  NRF_RADIO_NOTIFICATION_TYPE_INT_ON_BOTH,     /**< Using interrupt for notification both when the radio will be enabled and disabled. */\n};\n\n/**@brief The Radio signal callback types. */\nenum NRF_RADIO_CALLBACK_SIGNAL_TYPE\n{\n  NRF_RADIO_CALLBACK_SIGNAL_TYPE_START,             /**< This signal indicates the start of the radio timeslot. */\n  NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0,            /**< This signal indicates the NRF_TIMER0 interrupt. */\n  NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO,             /**< This signal indicates the NRF_RADIO interrupt. */\n  NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_FAILED,     /**< This signal indicates extend action failed. */\n  NRF_RADIO_CALLBACK_SIGNAL_TYPE_EXTEND_SUCCEEDED   /**< This signal indicates extend action succeeded. */\n};\n\n/**@brief The actions requested by the signal callback.\n *\n *  This code gives the SOC instructions about what action to take when the signal callback has\n *  returned.\n */\nenum NRF_RADIO_SIGNAL_CALLBACK_ACTION\n{\n  NRF_RADIO_SIGNAL_CALLBACK_ACTION_NONE,            /**< Return without action. */\n  NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND,          /**< Request an extension of the current\n                                                         timeslot. Maximum execution time for this action:\n                                                         @ref NRF_RADIO_MAX_EXTENSION_PROCESSING_TIME_US.\n                                                         This action must be started at least\n                                                         @ref NRF_RADIO_MIN_EXTENSION_MARGIN_US before\n                                                         the end of the timeslot. */\n  NRF_RADIO_SIGNAL_CALLBACK_ACTION_END,             /**< End the current radio timeslot. */\n  NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END  /**< Request a new radio timeslot and end the current timeslot. */\n};\n\n/**@brief Radio timeslot high frequency clock source configuration. */\nenum NRF_RADIO_HFCLK_CFG\n{\n  NRF_RADIO_HFCLK_CFG_XTAL_GUARANTEED, /**< The SoftDevice will guarantee that the high frequency clock source is the\n                                           external crystal for the whole duration of the timeslot. This should be the\n                                           preferred option for events that use the radio or require high timing accuracy.\n                                           @note The SoftDevice will automatically turn on and off the external crystal,\n                                           at the beginning and end of the timeslot, respectively. The crystal may also\n                                           intentionally be left running after the timeslot, in cases where it is needed\n                                           by the SoftDevice shortly after the end of the timeslot. */\n  NRF_RADIO_HFCLK_CFG_NO_GUARANTEE    /**< This configuration allows for earlier and tighter scheduling of timeslots.\n                                           The RC oscillator may be the clock source in part or for the whole duration of the timeslot.\n                                           The RC oscillator's accuracy must therefore be taken into consideration.\n                                           @note If the application will use the radio peripheral in timeslots with this configuration,\n                                           it must make sure that the crystal is running and stable before starting the radio. */\n};\n\n/**@brief Radio timeslot priorities. */\nenum NRF_RADIO_PRIORITY\n{\n  NRF_RADIO_PRIORITY_HIGH,                          /**< High (equal priority as the normal connection priority of the SoftDevice stack(s)). */\n  NRF_RADIO_PRIORITY_NORMAL,                        /**< Normal (equal priority as the priority of secondary activities of the SoftDevice stack(s)). */\n};\n\n/**@brief Radio timeslot request type. */\nenum NRF_RADIO_REQUEST_TYPE\n{\n  NRF_RADIO_REQ_TYPE_EARLIEST,                      /**< Request radio timeslot as early as possible. This should always be used for the first request in a session. */\n  NRF_RADIO_REQ_TYPE_NORMAL                         /**< Normal radio timeslot request. */\n};\n\n/**@brief SoC Events. */\nenum NRF_SOC_EVTS\n{\n  NRF_EVT_HFCLKSTARTED,                         /**< Event indicating that the HFCLK has started. */\n  NRF_EVT_POWER_FAILURE_WARNING,                /**< Event indicating that a power failure warning has occurred. */\n  NRF_EVT_FLASH_OPERATION_SUCCESS,              /**< Event indicating that the ongoing flash operation has completed successfully. */\n  NRF_EVT_FLASH_OPERATION_ERROR,                /**< Event indicating that the ongoing flash operation has timed out with an error. */\n  NRF_EVT_RADIO_BLOCKED,                        /**< Event indicating that a radio timeslot was blocked. */\n  NRF_EVT_RADIO_CANCELED,                       /**< Event indicating that a radio timeslot was canceled by SoftDevice. */\n  NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN, /**< Event indicating that a radio timeslot signal callback handler return was invalid. */\n  NRF_EVT_RADIO_SESSION_IDLE,                   /**< Event indicating that a radio timeslot session is idle. */\n  NRF_EVT_RADIO_SESSION_CLOSED,                 /**< Event indicating that a radio timeslot session is closed. */\n  NRF_EVT_POWER_USB_POWER_READY,                /**< Event indicating that a USB 3.3 V supply is ready. */\n  NRF_EVT_POWER_USB_DETECTED,                   /**< Event indicating that voltage supply is detected on VBUS. */\n  NRF_EVT_POWER_USB_REMOVED,                    /**< Event indicating that voltage supply is removed from VBUS. */\n  NRF_EVT_NUMBER_OF_EVTS\n};\n\n/**@} */\n\n\n/**@addtogroup NRF_SOC_STRUCTURES Structures\n * @{ */\n\n/**@brief Represents a mutex for use with the nrf_mutex functions.\n * @note Accessing the value directly is not safe, use the mutex functions!\n */\ntypedef volatile uint8_t nrf_mutex_t;\n\n/**@brief Parameters for a request for a timeslot as early as possible. */\ntypedef struct\n{\n  uint8_t       hfclk;                              /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */\n  uint8_t       priority;                           /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */\n  uint32_t      length_us;                          /**< The radio timeslot length (in the range 100 to 100,000] microseconds). */\n  uint32_t      timeout_us;                         /**< Longest acceptable delay until the start of the requested timeslot (up to @ref NRF_RADIO_EARLIEST_TIMEOUT_MAX_US microseconds). */\n} nrf_radio_request_earliest_t;\n\n/**@brief Parameters for a normal radio timeslot request. */\ntypedef struct\n{\n  uint8_t       hfclk;                              /**< High frequency clock source, see @ref NRF_RADIO_HFCLK_CFG. */\n  uint8_t       priority;                           /**< The radio timeslot priority, see @ref NRF_RADIO_PRIORITY. */\n  uint32_t      distance_us;                        /**< Distance from the start of the previous radio timeslot (up to @ref NRF_RADIO_DISTANCE_MAX_US microseconds). */\n  uint32_t      length_us;                          /**< The radio timeslot length (in the range [100..100,000] microseconds). */\n} nrf_radio_request_normal_t;\n\n/**@brief Radio timeslot request parameters. */\ntypedef struct\n{\n  uint8_t                         request_type;     /**< Type of request, see @ref NRF_RADIO_REQUEST_TYPE. */\n  union\n  {\n    nrf_radio_request_earliest_t  earliest;         /**< Parameters for requesting a radio timeslot as early as possible. */\n    nrf_radio_request_normal_t    normal;           /**< Parameters for requesting a normal radio timeslot. */\n  } params;                                         /**< Parameter union. */\n} nrf_radio_request_t;\n\n/**@brief Return parameters of the radio timeslot signal callback. */\ntypedef struct\n{\n  uint8_t               callback_action;            /**< The action requested by the application when returning from the signal callback, see @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION. */\n  union\n  {\n    struct\n    {\n      nrf_radio_request_t * p_next;                 /**< The request parameters for the next radio timeslot. */\n    } request;                                      /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_REQUEST_AND_END. */\n    struct\n    {\n      uint32_t              length_us;              /**< Requested extension of the radio timeslot duration (microseconds) (for minimum time see @ref NRF_RADIO_MINIMUM_TIMESLOT_LENGTH_EXTENSION_TIME_US). */\n    } extend;                                       /**< Additional parameters for return_code @ref NRF_RADIO_SIGNAL_CALLBACK_ACTION_EXTEND. */\n  } params;                                         /**< Parameter union. */\n} nrf_radio_signal_callback_return_param_t;\n\n/**@brief The radio timeslot signal callback type.\n *\n * @note In case of invalid return parameters, the radio timeslot will automatically end\n *       immediately after returning from the signal callback and the\n *       @ref NRF_EVT_RADIO_SIGNAL_CALLBACK_INVALID_RETURN event will be sent.\n * @note The returned struct pointer must remain valid after the signal callback\n *       function returns. For instance, this means that it must not point to a stack variable.\n *\n * @param[in] signal_type Type of signal, see @ref NRF_RADIO_CALLBACK_SIGNAL_TYPE.\n *\n * @return Pointer to structure containing action requested by the application.\n */\ntypedef nrf_radio_signal_callback_return_param_t * (*nrf_radio_signal_callback_t) (uint8_t signal_type);\n\n/**@brief AES ECB parameter typedefs */\ntypedef uint8_t soc_ecb_key_t[SOC_ECB_KEY_LENGTH];                /**< Encryption key type. */\ntypedef uint8_t soc_ecb_cleartext_t[SOC_ECB_CLEARTEXT_LENGTH];    /**< Cleartext data type. */\ntypedef uint8_t soc_ecb_ciphertext_t[SOC_ECB_CIPHERTEXT_LENGTH];  /**< Ciphertext data type. */\n\n/**@brief AES ECB data structure */\ntypedef struct\n{\n  soc_ecb_key_t        key;            /**< Encryption key. */\n  soc_ecb_cleartext_t  cleartext;      /**< Cleartext data. */\n  soc_ecb_ciphertext_t ciphertext;     /**< Ciphertext data. */\n} nrf_ecb_hal_data_t;\n\n/**@brief AES ECB block. Used to provide multiple blocks in a single call\n          to @ref sd_ecb_blocks_encrypt.*/\ntypedef struct\n{\n  soc_ecb_key_t const *       p_key;           /**< Pointer to the Encryption key. */\n  soc_ecb_cleartext_t const * p_cleartext;     /**< Pointer to the Cleartext data. */\n  soc_ecb_ciphertext_t *      p_ciphertext;    /**< Pointer to the Ciphertext data. */\n} nrf_ecb_hal_data_block_t;\n\n/**@} */\n\n/**@addtogroup NRF_SOC_FUNCTIONS Functions\n * @{ */\n\n/**@brief Initialize a mutex.\n *\n * @param[in] p_mutex Pointer to the mutex to initialize.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_MUTEX_NEW, uint32_t, sd_mutex_new(nrf_mutex_t * p_mutex));\n\n/**@brief Attempt to acquire a mutex.\n *\n * @param[in] p_mutex Pointer to the mutex to acquire.\n *\n * @retval ::NRF_SUCCESS The mutex was successfully acquired.\n * @retval ::NRF_ERROR_SOC_MUTEX_ALREADY_TAKEN The mutex could not be acquired.\n */\nSVCALL(SD_MUTEX_ACQUIRE, uint32_t, sd_mutex_acquire(nrf_mutex_t * p_mutex));\n\n/**@brief Release a mutex.\n *\n * @param[in] p_mutex Pointer to the mutex to release.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_MUTEX_RELEASE, uint32_t, sd_mutex_release(nrf_mutex_t * p_mutex));\n\n/**@brief Query the capacity of the application random pool.\n *\n * @param[out] p_pool_capacity The capacity of the pool.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_RAND_APPLICATION_POOL_CAPACITY_GET, uint32_t, sd_rand_application_pool_capacity_get(uint8_t * p_pool_capacity));\n\n/**@brief Get number of random bytes available to the application.\n *\n * @param[out] p_bytes_available The number of bytes currently available in the pool.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_RAND_APPLICATION_BYTES_AVAILABLE_GET, uint32_t, sd_rand_application_bytes_available_get(uint8_t * p_bytes_available));\n\n/**@brief Get random bytes from the application pool.\n *\n * @param[out]  p_buff  Pointer to unit8_t buffer for storing the bytes.\n * @param[in]   length  Number of bytes to take from pool and place in p_buff.\n *\n * @retval ::NRF_SUCCESS The requested bytes were written to p_buff.\n * @retval ::NRF_ERROR_SOC_RAND_NOT_ENOUGH_VALUES No bytes were written to the buffer, because there were not enough bytes available.\n*/\nSVCALL(SD_RAND_APPLICATION_VECTOR_GET, uint32_t, sd_rand_application_vector_get(uint8_t * p_buff, uint8_t length));\n\n/**@brief Gets the reset reason register.\n *\n * @param[out]  p_reset_reason  Contents of the NRF_POWER->RESETREAS register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_RESET_REASON_GET, uint32_t, sd_power_reset_reason_get(uint32_t * p_reset_reason));\n\n/**@brief Clears the bits of the reset reason register.\n *\n * @param[in] reset_reason_clr_msk Contains the bits to clear from the reset reason register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_RESET_REASON_CLR, uint32_t, sd_power_reset_reason_clr(uint32_t reset_reason_clr_msk));\n\n/**@brief Sets the power mode when in CPU sleep.\n *\n * @param[in] power_mode The power mode to use when in CPU sleep, see @ref NRF_POWER_MODES. @sa sd_app_evt_wait\n *\n * @retval ::NRF_SUCCESS The power mode was set.\n * @retval ::NRF_ERROR_SOC_POWER_MODE_UNKNOWN The power mode was unknown.\n */\nSVCALL(SD_POWER_MODE_SET, uint32_t, sd_power_mode_set(uint8_t power_mode));\n\n/**@brief Puts the chip in System OFF mode.\n *\n * @retval ::NRF_ERROR_SOC_POWER_OFF_SHOULD_NOT_RETURN\n */\nSVCALL(SD_POWER_SYSTEM_OFF, uint32_t, sd_power_system_off(void));\n\n/**@brief Enables or disables the power-fail comparator.\n *\n * Enabling this will give a SoftDevice event (NRF_EVT_POWER_FAILURE_WARNING) when the power failure warning occurs.\n * The event can be retrieved with sd_evt_get();\n *\n * @param[in] pof_enable    True if the power-fail comparator should be enabled, false if it should be disabled.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_POF_ENABLE, uint32_t, sd_power_pof_enable(uint8_t pof_enable));\n\n/**@brief Enables or disables the USB power ready event.\n *\n * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_POWER_READY) when a USB 3.3 V supply is ready.\n * The event can be retrieved with sd_evt_get();\n *\n * @param[in] usbpwrrdy_enable    True if the power ready event should be enabled, false if it should be disabled.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_USBPWRRDY_ENABLE, uint32_t, sd_power_usbpwrrdy_enable(uint8_t usbpwrrdy_enable));\n\n/**@brief Enables or disables the power USB-detected event.\n *\n * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_DETECTED) when a voltage supply is detected on VBUS.\n * The event can be retrieved with sd_evt_get();\n *\n * @param[in] usbdetected_enable    True if the power ready event should be enabled, false if it should be disabled.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_USBDETECTED_ENABLE, uint32_t, sd_power_usbdetected_enable(uint8_t usbdetected_enable));\n\n/**@brief Enables or disables the power USB-removed event.\n *\n * Enabling this will give a SoftDevice event (NRF_EVT_POWER_USB_REMOVED) when a voltage supply is removed from VBUS.\n * The event can be retrieved with sd_evt_get();\n *\n * @param[in] usbremoved_enable    True if the power ready event should be enabled, false if it should be disabled.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_USBREMOVED_ENABLE, uint32_t, sd_power_usbremoved_enable(uint8_t usbremoved_enable));\n\n/**@brief Get USB supply status register content.\n *\n * @param[out] usbregstatus    The content of USBREGSTATUS register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_USBREGSTATUS_GET, uint32_t, sd_power_usbregstatus_get(uint32_t * usbregstatus));\n\n/**@brief Sets the power failure comparator threshold value.\n *\n * @note: Power failure comparator threshold setting. This setting applies both for normal voltage\n *        mode (supply connected to both VDD and VDDH) and high voltage mode (supply connected to\n *        VDDH only).\n *\n * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDS.\n *\n * @retval ::NRF_SUCCESS The power failure threshold was set.\n * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown.\n */\nSVCALL(SD_POWER_POF_THRESHOLD_SET, uint32_t, sd_power_pof_threshold_set(uint8_t threshold));\n\n/**@brief Sets the power failure comparator threshold value for high voltage.\n *\n * @note: Power failure comparator threshold setting for high voltage mode (supply connected to\n *        VDDH only). This setting does not apply for normal voltage mode (supply connected to both\n *        VDD and VDDH).\n *\n * @param[in] threshold The power-fail threshold value to use, see @ref NRF_POWER_THRESHOLDVDDHS.\n *\n * @retval ::NRF_SUCCESS The power failure threshold was set.\n * @retval ::NRF_ERROR_SOC_POWER_POF_THRESHOLD_UNKNOWN The power failure threshold is unknown.\n */\nSVCALL(SD_POWER_POF_THRESHOLDVDDH_SET, uint32_t, sd_power_pof_thresholdvddh_set(uint8_t threshold));\n\n/**@brief Writes the NRF_POWER->RAM[index].POWERSET register.\n *\n * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERSET register to write to.\n * @param[in] ram_powerset Contains the word to write to the NRF_POWER->RAM[index].POWERSET register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_RAM_POWER_SET, uint32_t, sd_power_ram_power_set(uint8_t index, uint32_t ram_powerset));\n\n/**@brief Writes the NRF_POWER->RAM[index].POWERCLR register.\n *\n * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWERCLR register to write to.\n * @param[in] ram_powerclr Contains the word to write to the NRF_POWER->RAM[index].POWERCLR register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_RAM_POWER_CLR, uint32_t, sd_power_ram_power_clr(uint8_t index, uint32_t ram_powerclr));\n\n/**@brief Get contents of NRF_POWER->RAM[index].POWER register, indicates power status of RAM[index] blocks.\n *\n * @param[in] index Contains the index in the NRF_POWER->RAM[index].POWER register to read from.\n * @param[out] p_ram_power Content of NRF_POWER->RAM[index].POWER register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_RAM_POWER_GET, uint32_t, sd_power_ram_power_get(uint8_t index, uint32_t * p_ram_power));\n\n/**@brief Set bits in the general purpose retention registers (NRF_POWER->GPREGRET*).\n *\n * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2.\n * @param[in] gpregret_msk Bits to be set in the GPREGRET register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_GPREGRET_SET, uint32_t, sd_power_gpregret_set(uint32_t gpregret_id, uint32_t gpregret_msk));\n\n/**@brief Clear bits in the general purpose retention registers (NRF_POWER->GPREGRET*).\n *\n * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2.\n * @param[in] gpregret_msk Bits to be clear in the GPREGRET register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_GPREGRET_CLR, uint32_t, sd_power_gpregret_clr(uint32_t gpregret_id, uint32_t gpregret_msk));\n\n/**@brief Get contents of the general purpose retention registers (NRF_POWER->GPREGRET*).\n *\n * @param[in] gpregret_id 0 for GPREGRET, 1 for GPREGRET2.\n * @param[out] p_gpregret Contents of the GPREGRET register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_POWER_GPREGRET_GET, uint32_t, sd_power_gpregret_get(uint32_t gpregret_id, uint32_t *p_gpregret));\n\n/**@brief Enable or disable the DC/DC regulator for the regulator stage 1 (REG1).\n *\n * @param[in] dcdc_mode The mode of the DCDC, see @ref NRF_POWER_DCDC_MODES.\n *\n * @retval ::NRF_SUCCESS\n * @retval ::NRF_ERROR_INVALID_PARAM The DCDC mode is invalid.\n */\nSVCALL(SD_POWER_DCDC_MODE_SET, uint32_t, sd_power_dcdc_mode_set(uint8_t dcdc_mode));\n\n/**@brief Enable or disable the DC/DC regulator for the regulator stage 0 (REG0).\n *\n * For more details on the REG0 stage, please see product specification.\n *\n * @param[in] dcdc_mode The mode of the DCDC0, see @ref NRF_POWER_DCDC_MODES.\n *\n * @retval ::NRF_SUCCESS\n * @retval ::NRF_ERROR_INVALID_PARAM The dcdc_mode is invalid.\n */\nSVCALL(SD_POWER_DCDC0_MODE_SET, uint32_t, sd_power_dcdc0_mode_set(uint8_t dcdc_mode));\n\n/**@brief Request the high frequency crystal oscillator.\n *\n * Will start the high frequency crystal oscillator, the startup time of the crystal varies\n * and the ::sd_clock_hfclk_is_running function can be polled to check if it has started.\n *\n * @see sd_clock_hfclk_is_running\n * @see sd_clock_hfclk_release\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_CLOCK_HFCLK_REQUEST, uint32_t, sd_clock_hfclk_request(void));\n\n/**@brief Releases the high frequency crystal oscillator.\n *\n * Will stop the high frequency crystal oscillator, this happens immediately.\n *\n * @see sd_clock_hfclk_is_running\n * @see sd_clock_hfclk_request\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_CLOCK_HFCLK_RELEASE, uint32_t, sd_clock_hfclk_release(void));\n\n/**@brief Checks if the high frequency crystal oscillator is running.\n *\n * @see sd_clock_hfclk_request\n * @see sd_clock_hfclk_release\n *\n * @param[out] p_is_running 1 if the external crystal oscillator is running, 0 if not.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_CLOCK_HFCLK_IS_RUNNING, uint32_t, sd_clock_hfclk_is_running(uint32_t * p_is_running));\n\n/**@brief Waits for an application event.\n *\n * An application event is either an application interrupt or a pended interrupt when the interrupt\n * is disabled.\n *\n * When the application waits for an application event by calling this function, an interrupt that\n * is enabled will be taken immediately on pending since this function will wait in thread mode,\n * then the execution will return in the application's main thread.\n *\n * In order to wake up from disabled interrupts, the SEVONPEND flag has to be set in the Cortex-M\n * MCU's System Control Register (SCR), CMSIS_SCB. In that case, when a disabled interrupt gets\n * pended, this function will return to the application's main thread.\n *\n * @note The application must ensure that the pended flag is cleared using ::sd_nvic_ClearPendingIRQ\n *       in order to sleep using this function. This is only necessary for disabled interrupts, as\n *       the interrupt handler will clear the pending flag automatically for enabled interrupts.\n *\n * @note If an application interrupt has happened since the last time sd_app_evt_wait was\n *       called this function will return immediately and not go to sleep. This is to avoid race\n *       conditions that can occur when a flag is updated in the interrupt handler and processed\n *       in the main loop.\n *\n * @post An application interrupt has happened or a interrupt pending flag is set.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_APP_EVT_WAIT, uint32_t, sd_app_evt_wait(void));\n\n/**@brief Get PPI channel enable register contents.\n *\n * @param[out] p_channel_enable The contents of the PPI CHEN register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_PPI_CHANNEL_ENABLE_GET, uint32_t, sd_ppi_channel_enable_get(uint32_t * p_channel_enable));\n\n/**@brief Set PPI channel enable register.\n *\n * @param[in] channel_enable_set_msk Mask containing the bits to set in the PPI CHEN register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_PPI_CHANNEL_ENABLE_SET, uint32_t, sd_ppi_channel_enable_set(uint32_t channel_enable_set_msk));\n\n/**@brief Clear PPI channel enable register.\n *\n * @param[in] channel_enable_clr_msk Mask containing the bits to clear in the PPI CHEN register.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_PPI_CHANNEL_ENABLE_CLR, uint32_t, sd_ppi_channel_enable_clr(uint32_t channel_enable_clr_msk));\n\n/**@brief Assign endpoints to a PPI channel.\n *\n * @param[in] channel_num Number of the PPI channel to assign.\n * @param[in] evt_endpoint Event endpoint of the PPI channel.\n * @param[in] task_endpoint Task endpoint of the PPI channel.\n *\n * @retval ::NRF_ERROR_SOC_PPI_INVALID_CHANNEL The channel number is invalid.\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_PPI_CHANNEL_ASSIGN, uint32_t, sd_ppi_channel_assign(uint8_t channel_num, const volatile void * evt_endpoint, const volatile void * task_endpoint));\n\n/**@brief Task to enable a channel group.\n *\n * @param[in] group_num Number of the channel group.\n *\n * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_PPI_GROUP_TASK_ENABLE, uint32_t, sd_ppi_group_task_enable(uint8_t group_num));\n\n/**@brief Task to disable a channel group.\n *\n * @param[in] group_num Number of the PPI group.\n *\n * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid.\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_PPI_GROUP_TASK_DISABLE, uint32_t, sd_ppi_group_task_disable(uint8_t group_num));\n\n/**@brief Assign PPI channels to a channel group.\n *\n * @param[in] group_num Number of the channel group.\n * @param[in] channel_msk Mask of the channels to assign to the group.\n *\n * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid.\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_PPI_GROUP_ASSIGN, uint32_t, sd_ppi_group_assign(uint8_t group_num, uint32_t channel_msk));\n\n/**@brief Gets the PPI channels of a channel group.\n *\n * @param[in]   group_num Number of the channel group.\n * @param[out]  p_channel_msk Mask of the channels assigned to the group.\n *\n * @retval ::NRF_ERROR_SOC_PPI_INVALID_GROUP The group number is invalid.\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_PPI_GROUP_GET, uint32_t, sd_ppi_group_get(uint8_t group_num, uint32_t * p_channel_msk));\n\n/**@brief Configures the Radio Notification signal.\n *\n * @note\n *      - The notification signal latency depends on the interrupt priority settings of SWI used\n *        for notification signal.\n *      - To ensure that the radio notification signal behaves in a consistent way, the radio\n *        notifications must be configured when there is no protocol stack or other SoftDevice\n *        activity in progress. It is recommended that the radio notification signal is\n *        configured directly after the SoftDevice has been enabled.\n *      - In the period between the ACTIVE signal and the start of the Radio Event, the SoftDevice\n *        will interrupt the application to do Radio Event preparation.\n *      - Using the Radio Notification feature may limit the bandwidth, as the SoftDevice may have\n *        to shorten the connection events to have time for the Radio Notification signals.\n *\n * @param[in]  type      Type of notification signal, see @ref NRF_RADIO_NOTIFICATION_TYPES.\n *                       @ref NRF_RADIO_NOTIFICATION_TYPE_NONE shall be used to turn off radio\n *                       notification. Using @ref NRF_RADIO_NOTIFICATION_DISTANCE_NONE is\n *                       recommended (but not required) to be used with\n *                       @ref NRF_RADIO_NOTIFICATION_TYPE_NONE.\n *\n * @param[in]  distance  Distance between the notification signal and start of radio activity, see @ref NRF_RADIO_NOTIFICATION_DISTANCES.\n *                       This parameter is ignored when @ref NRF_RADIO_NOTIFICATION_TYPE_NONE or\n *                       @ref NRF_RADIO_NOTIFICATION_TYPE_INT_ON_INACTIVE is used.\n *\n * @retval ::NRF_ERROR_INVALID_PARAM The group number is invalid.\n * @retval ::NRF_ERROR_INVALID_STATE A protocol stack or other SoftDevice is running. Stop all\n *                                   running activities and retry.\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_RADIO_NOTIFICATION_CFG_SET, uint32_t, sd_radio_notification_cfg_set(uint8_t type, uint8_t distance));\n\n/**@brief Encrypts a block according to the specified parameters.\n *\n * 128-bit AES encryption.\n *\n * @note:\n *    - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while\n *      the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application\n *      main or low interrupt level.\n *\n * @param[in, out] p_ecb_data Pointer to the ECB parameters' struct (two input\n *                            parameters and one output parameter).\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_ECB_BLOCK_ENCRYPT, uint32_t, sd_ecb_block_encrypt(nrf_ecb_hal_data_t * p_ecb_data));\n\n/**@brief Encrypts multiple data blocks provided as an array of data block structures.\n *\n * @details: Performs 128-bit AES encryption on multiple data blocks\n *\n * @note:\n *    - The application may set the SEVONPEND bit in the SCR to 1 to make the SoftDevice sleep while\n *      the ECB is running. The SEVONPEND bit should only be cleared (set to 0) from application\n *      main or low interrupt level.\n *\n * @param[in]     block_count     Count of blocks in the p_data_blocks array.\n * @param[in,out] p_data_blocks   Pointer to the first entry in a contiguous array of\n *                                @ref nrf_ecb_hal_data_block_t structures.\n *\n * @retval ::NRF_SUCCESS\n */\nSVCALL(SD_ECB_BLOCKS_ENCRYPT, uint32_t, sd_ecb_blocks_encrypt(uint8_t block_count, nrf_ecb_hal_data_block_t * p_data_blocks));\n\n/**@brief Gets any pending events generated by the SoC API.\n *\n * The application should keep calling this function to get events, until ::NRF_ERROR_NOT_FOUND is returned.\n *\n * @param[out] p_evt_id Set to one of the values in @ref NRF_SOC_EVTS, if any events are pending.\n *\n * @retval ::NRF_SUCCESS An event was pending. The event id is written in the p_evt_id parameter.\n * @retval ::NRF_ERROR_NOT_FOUND No pending events.\n */\nSVCALL(SD_EVT_GET, uint32_t, sd_evt_get(uint32_t * p_evt_id));\n\n/**@brief Get the temperature measured on the chip\n *\n * This function will block until the temperature measurement is done.\n * It takes around 50 us from call to return.\n *\n * @param[out] p_temp Result of temperature measurement. Die temperature in 0.25 degrees Celsius.\n *\n * @retval ::NRF_SUCCESS A temperature measurement was done, and the temperature was written to temp\n */\nSVCALL(SD_TEMP_GET, uint32_t, sd_temp_get(int32_t * p_temp));\n\n/**@brief Flash Write\n*\n* Commands to write a buffer to flash\n*\n* If the SoftDevice is enabled:\n*  This call initiates the flash access command, and its completion will be communicated to the\n*  application with exactly one of the following events:\n*      - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed.\n*      - @ref NRF_EVT_FLASH_OPERATION_ERROR   - The command could not be started.\n*\n* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the\n * write has been completed\n*\n* @note\n*      - This call takes control over the radio and the CPU during flash erase and write to make sure that\n*        they will not interfere with the flash access. This means that all interrupts will be blocked\n*        for a predictable time (depending on the NVMC specification in the device's Product Specification\n*        and the command parameters).\n*      - The data in the p_src buffer should not be modified before the @ref NRF_EVT_FLASH_OPERATION_SUCCESS\n*        or the @ref NRF_EVT_FLASH_OPERATION_ERROR have been received if the SoftDevice is enabled.\n*      - This call will make the SoftDevice trigger a hardfault when the page is written, if it is\n*        protected.\n*\n*\n* @param[in]  p_dst Pointer to start of flash location to be written.\n* @param[in]  p_src Pointer to buffer with data to be written.\n* @param[in]  size  Number of 32-bit words to write. Maximum size is the number of words in one\n*                   flash page. See the device's Product Specification for details.\n*\n* @retval ::NRF_ERROR_INVALID_ADDR   Tried to write to a non existing flash address, or p_dst or p_src was unaligned.\n* @retval ::NRF_ERROR_BUSY           The previous command has not yet completed.\n* @retval ::NRF_ERROR_INVALID_LENGTH Size was 0, or higher than the maximum allowed size.\n* @retval ::NRF_ERROR_FORBIDDEN      Tried to write to an address outside the application flash area.\n* @retval ::NRF_SUCCESS              The command was accepted.\n*/\nSVCALL(SD_FLASH_WRITE, uint32_t, sd_flash_write(uint32_t * p_dst, uint32_t const * p_src, uint32_t size));\n\n\n/**@brief Flash Erase page\n*\n* Commands to erase a flash page\n* If the SoftDevice is enabled:\n*  This call initiates the flash access command, and its completion will be communicated to the\n*  application with exactly one of the following events:\n*      - @ref NRF_EVT_FLASH_OPERATION_SUCCESS - The command was successfully completed.\n*      - @ref NRF_EVT_FLASH_OPERATION_ERROR   - The command could not be started.\n*\n* If the SoftDevice is not enabled no event will be generated, and this call will return @ref NRF_SUCCESS when the\n* erase has been completed\n*\n* @note\n*      - This call takes control over the radio and the CPU during flash erase and write to make sure that\n*        they will not interfere with the flash access. This means that all interrupts will be blocked\n*        for a predictable time (depending on the NVMC specification in the device's Product Specification\n*        and the command parameters).\n*      - This call will make the SoftDevice trigger a hardfault when the page is erased, if it is\n*        protected.\n*\n*\n* @param[in]  page_number           Page number of the page to erase\n*\n* @retval ::NRF_ERROR_INTERNAL      If a new session could not be opened due to an internal error.\n* @retval ::NRF_ERROR_INVALID_ADDR  Tried to erase to a non existing flash page.\n* @retval ::NRF_ERROR_BUSY          The previous command has not yet completed.\n* @retval ::NRF_ERROR_FORBIDDEN     Tried to erase a page outside the application flash area.\n* @retval ::NRF_SUCCESS             The command was accepted.\n*/\nSVCALL(SD_FLASH_PAGE_ERASE, uint32_t, sd_flash_page_erase(uint32_t page_number));\n\n\n\n/**@brief Opens a session for radio timeslot requests.\n *\n * @note Only one session can be open at a time.\n * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) will be called when the radio timeslot\n *       starts. From this point the NRF_RADIO and NRF_TIMER0 peripherals can be freely accessed\n *       by the application.\n * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_TIMER0) is called whenever the NRF_TIMER0\n *       interrupt occurs.\n * @note p_radio_signal_callback(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_RADIO) is called whenever the NRF_RADIO\n *       interrupt occurs.\n * @note p_radio_signal_callback() will be called at ARM interrupt priority level 0. This\n *       implies that none of the sd_* API calls can be used from p_radio_signal_callback().\n *\n * @param[in] p_radio_signal_callback The signal callback.\n *\n * @retval ::NRF_ERROR_INVALID_ADDR p_radio_signal_callback is an invalid function pointer.\n * @retval ::NRF_ERROR_BUSY If session cannot be opened.\n * @retval ::NRF_ERROR_INTERNAL If a new session could not be opened due to an internal error.\n * @retval ::NRF_SUCCESS Otherwise.\n */\n SVCALL(SD_RADIO_SESSION_OPEN, uint32_t, sd_radio_session_open(nrf_radio_signal_callback_t p_radio_signal_callback));\n\n/**@brief Closes a session for radio timeslot requests.\n *\n * @note Any current radio timeslot will be finished before the session is closed.\n * @note If a radio timeslot is scheduled when the session is closed, it will be canceled.\n * @note The application cannot consider the session closed until the @ref NRF_EVT_RADIO_SESSION_CLOSED\n *       event is received.\n *\n * @retval ::NRF_ERROR_FORBIDDEN If session not opened.\n * @retval ::NRF_ERROR_BUSY If session is currently being closed.\n * @retval ::NRF_SUCCESS Otherwise.\n */\n SVCALL(SD_RADIO_SESSION_CLOSE, uint32_t, sd_radio_session_close(void));\n\n/**@brief Requests a radio timeslot.\n *\n * @note The request type is determined by p_request->request_type, and can be one of @ref NRF_RADIO_REQ_TYPE_EARLIEST\n *       and @ref NRF_RADIO_REQ_TYPE_NORMAL. The first request in a session must always be of type @ref NRF_RADIO_REQ_TYPE_EARLIEST.\n * @note For a normal request (@ref NRF_RADIO_REQ_TYPE_NORMAL), the start time of a radio timeslot is specified by\n *       p_request->distance_us and is given relative to the start of the previous timeslot.\n * @note A too small p_request->distance_us will lead to a @ref NRF_EVT_RADIO_BLOCKED event.\n * @note Timeslots scheduled too close will lead to a @ref NRF_EVT_RADIO_BLOCKED event.\n * @note See the SoftDevice Specification for more on radio timeslot scheduling, distances and lengths.\n * @note If an opportunity for the first radio timeslot is not found before 100 ms after the call to this\n *       function, it is not scheduled, and instead a @ref NRF_EVT_RADIO_BLOCKED event is sent.\n *       The application may then try to schedule the first radio timeslot again.\n * @note Successful requests will result in nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START).\n *       Unsuccessful requests will result in a @ref NRF_EVT_RADIO_BLOCKED event, see @ref NRF_SOC_EVTS.\n * @note The jitter in the start time of the radio timeslots is +/- @ref NRF_RADIO_START_JITTER_US us.\n * @note The nrf_radio_signal_callback_t(@ref NRF_RADIO_CALLBACK_SIGNAL_TYPE_START) call has a latency relative to the\n *       specified radio timeslot start, but this does not affect the actual start time of the timeslot.\n * @note NRF_TIMER0 is reset at the start of the radio timeslot, and is clocked at 1MHz from the high frequency\n *       (16 MHz) clock source. If p_request->hfclk_force_xtal is true, the high frequency clock is\n *       guaranteed to be clocked from the external crystal.\n * @note The SoftDevice will neither access the NRF_RADIO peripheral nor the NRF_TIMER0 peripheral\n *       during the radio timeslot.\n *\n * @param[in] p_request Pointer to the request parameters.\n *\n * @retval ::NRF_ERROR_FORBIDDEN If session not opened or the session is not IDLE.\n * @retval ::NRF_ERROR_INVALID_ADDR If the p_request pointer is invalid.\n * @retval ::NRF_ERROR_INVALID_PARAM If the parameters of p_request are not valid.\n * @retval ::NRF_SUCCESS Otherwise.\n */\n SVCALL(SD_RADIO_REQUEST, uint32_t, sd_radio_request(nrf_radio_request_t const * p_request));\n\n/**@brief Write register protected by the SoftDevice\n *\n * This function writes to a register that is write-protected by the SoftDevice. Please refer to your\n * SoftDevice Specification for more details about which registers that are protected by SoftDevice.\n * This function can write to the following protected peripheral:\n *  - ACL\n *\n * @note Protected registers may be read directly.\n * @note Register that are write-once will return @ref NRF_SUCCESS on second set, even the value in\n *       the register has not changed. See the Product Specification for more details about register\n *       properties.\n *\n * @param[in]  p_register Pointer to register to be written.\n * @param[in]  value Value to be written to the register.\n *\n * @retval ::NRF_ERROR_INVALID_ADDR This function can not write to the reguested register.\n * @retval ::NRF_SUCCESS Value successfully written to register.\n *\n */\nSVCALL(SD_PROTECTED_REGISTER_WRITE, uint32_t, sd_protected_register_write(volatile uint32_t * p_register, uint32_t value));\n\n/**@} */\n\n#ifdef __cplusplus\n}\n#endif\n#endif // NRF_SOC_H__\n\n/**@} */\n"
  },
  {
    "path": "hw/mcu/nordic/nrf5x/s140_nrf52_6.1.1_API/include/nrf_svc.h",
    "content": "/*\n * Copyright (c) 2012 - 2017, Nordic Semiconductor ASA\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice, this\n *    list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form, except as embedded into a Nordic\n *    Semiconductor ASA integrated circuit in a product or a software update for\n *    such product, must reproduce the above copyright notice, this list of\n *    conditions and the following disclaimer in the documentation and/or other\n *    materials provided with the distribution.\n *\n * 3. Neither the name of Nordic Semiconductor ASA nor the names of its\n *    contributors may be used to endorse or promote products derived from this\n *    software without specific prior written permission.\n *\n * 4. This software, with or without modification, must only be used with a\n *    Nordic Semiconductor ASA integrated circuit.\n *\n * 5. Any software provided in binary form under this license must not be reverse\n *    engineered, decompiled, modified and/or disassembled.\n *\n * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA \"AS IS\" AND ANY EXPRESS\n * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\n * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT\n * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef NRF_SVC__\n#define NRF_SVC__\n\n#include \"stdint.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef SVCALL_AS_NORMAL_FUNCTION\n#define SVCALL(number, return_type, signature) return_type signature\n#else\n\n#ifndef SVCALL\n#if defined (__CC_ARM)\n#define SVCALL(number, return_type, signature) return_type __svc(number) signature\n#elif defined (__GNUC__)\n#ifdef __cplusplus\n#define GCC_CAST_CPP (uint16_t)\n#else\n#define GCC_CAST_CPP\n#endif\n#define SVCALL(number, return_type, signature)          \\\n  _Pragma(\"GCC diagnostic push\")                        \\\n  _Pragma(\"GCC diagnostic ignored \\\"-Wreturn-type\\\"\")   \\\n  __attribute__((naked))                                \\\n  __attribute__((unused))                               \\\n  static return_type signature                          \\\n  {                                                     \\\n    __asm(                                              \\\n        \"svc %0\\n\"                                      \\\n        \"bx r14\" : : \"I\" (GCC_CAST_CPP number) : \"r0\"   \\\n    );                                                  \\\n  }                                                     \\\n  _Pragma(\"GCC diagnostic pop\")\n\n#elif defined (__ICCARM__)\n#define PRAGMA(x) _Pragma(#x)\n#define SVCALL(number, return_type, signature)          \\\nPRAGMA(swi_number = (number))                           \\\n __swi return_type signature;\n#else\n#define SVCALL(number, return_type, signature) return_type signature\n#endif\n#endif  // SVCALL\n\n#endif  // SVCALL_AS_NORMAL_FUNCTION\n\n#ifdef __cplusplus\n}\n#endif\n#endif  // NRF_SVC__\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/mkspk/.gitignore",
    "content": "/mkspk\n/mkspk.exe\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/mkspk/Makefile",
    "content": "############################################################################\n# tools/mkspk/Makefile\n#\n#   Copyright (C) 2011-2012 Gregory Nutt. All rights reserved.\n#   Author: Gregory Nutt <gnutt@nuttx.org>\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions\n# are met:\n#\n# 1. Redistributions of source code must retain the above copyright\n#    notice, this list of conditions and the following disclaimer.\n# 2. Redistributions in binary form must reproduce the above copyright\n#    notice, this list of conditions and the following disclaimer in\n#    the documentation and/or other materials provided with the\n#    distribution.\n# 3. Neither the name NuttX nor the names of its contributors may be\n#    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\n# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n# POSSIBILITY OF SUCH DAMAGE.\n#\n############################################################################\n\nall: mkspk\ndefault: mkspk\n.PHONY: clean\n\n# Add CFLAGS=-g on the make command line to build debug versions\n\nCFLAGS = -O2 -Wall -I.\n\n# mkspk - Convert nuttx.hex image to nuttx.spk image\n\nmkspk:\n\t@gcc $(CFLAGS) -o mkspk mkspk.c clefia.c\n\nclean:\n\t@rm -f *.o *.a *.dSYM *~ .*.swp\n\t@rm -f mkspk mkspk.exe\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/mkspk/clefia.c",
    "content": "/****************************************************************************\n * tools/cxd56/clefia.c\n *\n * Copyright (C) 2007, 2008 Sony Corporation\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n * 3. Neither the name NuttX nor the names of its contributors may be\n *    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\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n/****************************************************************************\n * Included Files\n ****************************************************************************/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdint.h>\n#include <assert.h>\n\n#include \"clefia.h\"\n\n/****************************************************************************\n * Pre-processor Definitions\n ****************************************************************************/\n\n#define clefiamul4(_x) (clefiamul2(clefiamul2((_x))))\n#define clefiamul6(_x) (clefiamul2((_x)) ^ clefiamul4((_x)))\n#define clefiamul8(_x) (clefiamul2(clefiamul4((_x))))\n#define clefiamula(_x) (clefiamul2((_x)) ^ clefiamul8((_x)))\n\n/****************************************************************************\n * Private Data\n ****************************************************************************/\n\n/* S0 (8-bit S-box based on four 4-bit S-boxes) */\n\nstatic const unsigned char clefia_s0[256] =\n{\n  0x57u, 0x49u, 0xd1u, 0xc6u, 0x2fu, 0x33u, 0x74u, 0xfbu,\n  0x95u, 0x6du, 0x82u, 0xeau, 0x0eu, 0xb0u, 0xa8u, 0x1cu,\n  0x28u, 0xd0u, 0x4bu, 0x92u, 0x5cu, 0xeeu, 0x85u, 0xb1u,\n  0xc4u, 0x0au, 0x76u, 0x3du, 0x63u, 0xf9u, 0x17u, 0xafu,\n  0xbfu, 0xa1u, 0x19u, 0x65u, 0xf7u, 0x7au, 0x32u, 0x20u,\n  0x06u, 0xceu, 0xe4u, 0x83u, 0x9du, 0x5bu, 0x4cu, 0xd8u,\n  0x42u, 0x5du, 0x2eu, 0xe8u, 0xd4u, 0x9bu, 0x0fu, 0x13u,\n  0x3cu, 0x89u, 0x67u, 0xc0u, 0x71u, 0xaau, 0xb6u, 0xf5u,\n  0xa4u, 0xbeu, 0xfdu, 0x8cu, 0x12u, 0x00u, 0x97u, 0xdau,\n  0x78u, 0xe1u, 0xcfu, 0x6bu, 0x39u, 0x43u, 0x55u, 0x26u,\n  0x30u, 0x98u, 0xccu, 0xddu, 0xebu, 0x54u, 0xb3u, 0x8fu,\n  0x4eu, 0x16u, 0xfau, 0x22u, 0xa5u, 0x77u, 0x09u, 0x61u,\n  0xd6u, 0x2au, 0x53u, 0x37u, 0x45u, 0xc1u, 0x6cu, 0xaeu,\n  0xefu, 0x70u, 0x08u, 0x99u, 0x8bu, 0x1du, 0xf2u, 0xb4u,\n  0xe9u, 0xc7u, 0x9fu, 0x4au, 0x31u, 0x25u, 0xfeu, 0x7cu,\n  0xd3u, 0xa2u, 0xbdu, 0x56u, 0x14u, 0x88u, 0x60u, 0x0bu,\n  0xcdu, 0xe2u, 0x34u, 0x50u, 0x9eu, 0xdcu, 0x11u, 0x05u,\n  0x2bu, 0xb7u, 0xa9u, 0x48u, 0xffu, 0x66u, 0x8au, 0x73u,\n  0x03u, 0x75u, 0x86u, 0xf1u, 0x6au, 0xa7u, 0x40u, 0xc2u,\n  0xb9u, 0x2cu, 0xdbu, 0x1fu, 0x58u, 0x94u, 0x3eu, 0xedu,\n  0xfcu, 0x1bu, 0xa0u, 0x04u, 0xb8u, 0x8du, 0xe6u, 0x59u,\n  0x62u, 0x93u, 0x35u, 0x7eu, 0xcau, 0x21u, 0xdfu, 0x47u,\n  0x15u, 0xf3u, 0xbau, 0x7fu, 0xa6u, 0x69u, 0xc8u, 0x4du,\n  0x87u, 0x3bu, 0x9cu, 0x01u, 0xe0u, 0xdeu, 0x24u, 0x52u,\n  0x7bu, 0x0cu, 0x68u, 0x1eu, 0x80u, 0xb2u, 0x5au, 0xe7u,\n  0xadu, 0xd5u, 0x23u, 0xf4u, 0x46u, 0x3fu, 0x91u, 0xc9u,\n  0x6eu, 0x84u, 0x72u, 0xbbu, 0x0du, 0x18u, 0xd9u, 0x96u,\n  0xf0u, 0x5fu, 0x41u, 0xacu, 0x27u, 0xc5u, 0xe3u, 0x3au,\n  0x81u, 0x6fu, 0x07u, 0xa3u, 0x79u, 0xf6u, 0x2du, 0x38u,\n  0x1au, 0x44u, 0x5eu, 0xb5u, 0xd2u, 0xecu, 0xcbu, 0x90u,\n  0x9au, 0x36u, 0xe5u, 0x29u, 0xc3u, 0x4fu, 0xabu, 0x64u,\n  0x51u, 0xf8u, 0x10u, 0xd7u, 0xbcu, 0x02u, 0x7du, 0x8eu\n};\n\n/* S1 (8-bit S-box based on inverse function) */\n\nstatic const unsigned char clefia_s1[256] =\n{\n  0x6cu, 0xdau, 0xc3u, 0xe9u, 0x4eu, 0x9du, 0x0au, 0x3du,\n  0xb8u, 0x36u, 0xb4u, 0x38u, 0x13u, 0x34u, 0x0cu, 0xd9u,\n  0xbfu, 0x74u, 0x94u, 0x8fu, 0xb7u, 0x9cu, 0xe5u, 0xdcu,\n  0x9eu, 0x07u, 0x49u, 0x4fu, 0x98u, 0x2cu, 0xb0u, 0x93u,\n  0x12u, 0xebu, 0xcdu, 0xb3u, 0x92u, 0xe7u, 0x41u, 0x60u,\n  0xe3u, 0x21u, 0x27u, 0x3bu, 0xe6u, 0x19u, 0xd2u, 0x0eu,\n  0x91u, 0x11u, 0xc7u, 0x3fu, 0x2au, 0x8eu, 0xa1u, 0xbcu,\n  0x2bu, 0xc8u, 0xc5u, 0x0fu, 0x5bu, 0xf3u, 0x87u, 0x8bu,\n  0xfbu, 0xf5u, 0xdeu, 0x20u, 0xc6u, 0xa7u, 0x84u, 0xceu,\n  0xd8u, 0x65u, 0x51u, 0xc9u, 0xa4u, 0xefu, 0x43u, 0x53u,\n  0x25u, 0x5du, 0x9bu, 0x31u, 0xe8u, 0x3eu, 0x0du, 0xd7u,\n  0x80u, 0xffu, 0x69u, 0x8au, 0xbau, 0x0bu, 0x73u, 0x5cu,\n  0x6eu, 0x54u, 0x15u, 0x62u, 0xf6u, 0x35u, 0x30u, 0x52u,\n  0xa3u, 0x16u, 0xd3u, 0x28u, 0x32u, 0xfau, 0xaau, 0x5eu,\n  0xcfu, 0xeau, 0xedu, 0x78u, 0x33u, 0x58u, 0x09u, 0x7bu,\n  0x63u, 0xc0u, 0xc1u, 0x46u, 0x1eu, 0xdfu, 0xa9u, 0x99u,\n  0x55u, 0x04u, 0xc4u, 0x86u, 0x39u, 0x77u, 0x82u, 0xecu,\n  0x40u, 0x18u, 0x90u, 0x97u, 0x59u, 0xddu, 0x83u, 0x1fu,\n  0x9au, 0x37u, 0x06u, 0x24u, 0x64u, 0x7cu, 0xa5u, 0x56u,\n  0x48u, 0x08u, 0x85u, 0xd0u, 0x61u, 0x26u, 0xcau, 0x6fu,\n  0x7eu, 0x6au, 0xb6u, 0x71u, 0xa0u, 0x70u, 0x05u, 0xd1u,\n  0x45u, 0x8cu, 0x23u, 0x1cu, 0xf0u, 0xeeu, 0x89u, 0xadu,\n  0x7au, 0x4bu, 0xc2u, 0x2fu, 0xdbu, 0x5au, 0x4du, 0x76u,\n  0x67u, 0x17u, 0x2du, 0xf4u, 0xcbu, 0xb1u, 0x4au, 0xa8u,\n  0xb5u, 0x22u, 0x47u, 0x3au, 0xd5u, 0x10u, 0x4cu, 0x72u,\n  0xccu, 0x00u, 0xf9u, 0xe0u, 0xfdu, 0xe2u, 0xfeu, 0xaeu,\n  0xf8u, 0x5fu, 0xabu, 0xf1u, 0x1bu, 0x42u, 0x81u, 0xd6u,\n  0xbeu, 0x44u, 0x29u, 0xa6u, 0x57u, 0xb9u, 0xafu, 0xf2u,\n  0xd4u, 0x75u, 0x66u, 0xbbu, 0x68u, 0x9fu, 0x50u, 0x02u,\n  0x01u, 0x3cu, 0x7fu, 0x8du, 0x1au, 0x88u, 0xbdu, 0xacu,\n  0xf7u, 0xe4u, 0x79u, 0x96u, 0xa2u, 0xfcu, 0x6du, 0xb2u,\n  0x6bu, 0x03u, 0xe1u, 0x2eu, 0x7du, 0x14u, 0x95u, 0x1du\n};\n\n/****************************************************************************\n * Private Functions\n ****************************************************************************/\n\nstatic void bytecpy(unsigned char *dst, const unsigned char *src, int bytelen)\n{\n  while (bytelen-- > 0)\n    {\n      *dst++ = *src++;\n    }\n}\n\nstatic unsigned char clefiamul2(unsigned char x)\n{\n  /* multiplication over GF(2^8) (p(x) = '11d') */\n\n  if (x & 0x80u)\n    {\n      x ^= 0x0eu;\n    }\n\n  return ((x << 1) | (x >> 7));\n}\n\nstatic void clefiaf0xor(unsigned char *dst, const unsigned char *src,\n                        const unsigned char *rk)\n{\n  unsigned char x[4];\n  unsigned char y[4];\n  unsigned char z[4];\n\n  /* F0 */\n\n  /* Key addition */\n\n  bytexor(x, src, rk, 4);\n\n  /* Substitution layer */\n\n  z[0] = clefia_s0[x[0]];\n  z[1] = clefia_s1[x[1]];\n  z[2] = clefia_s0[x[2]];\n  z[3] = clefia_s1[x[3]];\n\n  /* Diffusion layer (M0) */\n\n  y[0] = z[0] ^ clefiamul2(z[1]) ^ clefiamul4(z[2]) ^ clefiamul6(z[3]);\n  y[1] = clefiamul2(z[0]) ^ z[1] ^ clefiamul6(z[2]) ^ clefiamul4(z[3]);\n  y[2] = clefiamul4(z[0]) ^ clefiamul6(z[1]) ^ z[2] ^ clefiamul2(z[3]);\n  y[3] = clefiamul6(z[0]) ^ clefiamul4(z[1]) ^ clefiamul2(z[2]) ^ z[3];\n\n  /* Xoring after F0 */\n\n  bytecpy(dst + 0, src + 0, 4);\n  bytexor(dst + 4, src + 4, y, 4);\n}\n\nstatic void clefiaf1xor(unsigned char *dst, const unsigned char *src,\n                        const unsigned char *rk)\n{\n  unsigned char x[4];\n  unsigned char y[4];\n  unsigned char z[4];\n\n  /* F1 */\n\n  /* Key addition */\n\n  bytexor(x, src, rk, 4);\n\n  /* Substitution layer */\n\n  z[0] = clefia_s1[x[0]];\n  z[1] = clefia_s0[x[1]];\n  z[2] = clefia_s1[x[2]];\n  z[3] = clefia_s0[x[3]];\n\n  /* Diffusion layer (M1) */\n\n  y[0] = z[0] ^ clefiamul8(z[1]) ^ clefiamul2(z[2]) ^ clefiamula(z[3]);\n  y[1] = clefiamul8(z[0]) ^ z[1] ^ clefiamula(z[2]) ^ clefiamul2(z[3]);\n  y[2] = clefiamul2(z[0]) ^ clefiamula(z[1]) ^ z[2] ^ clefiamul8(z[3]);\n  y[3] = clefiamula(z[0]) ^ clefiamul2(z[1]) ^ clefiamul8(z[2]) ^ z[3];\n\n  /* Xoring after F1 */\n\n  bytecpy(dst + 0, src + 0, 4);\n  bytexor(dst + 4, src + 4, y, 4);\n}\n\nstatic void clefiagfn4(unsigned char *y, const unsigned char *x,\n                       const unsigned char *rk, int r)\n{\n  unsigned char fin[16];\n  unsigned char fout[16];\n\n  bytecpy(fin, x, 16);\n  while (r-- > 0)\n    {\n      clefiaf0xor(fout + 0, fin + 0, rk + 0);\n      clefiaf1xor(fout + 8, fin + 8, rk + 4);\n      rk += 8;\n      if (r)\n        {\n          /* swapping for encryption */\n\n          bytecpy(fin + 0, fout + 4, 12);\n          bytecpy(fin + 12, fout + 0, 4);\n        }\n    }\n\n  bytecpy(y, fout, 16);\n}\n\n#if 0 /* Not used */\nstatic void clefiagfn8(unsigned char *y, const unsigned char *x,\n                       const unsigned char *rk, int r)\n{\n  unsigned char fin[32];\n  unsigned char fout[32];\n\n  bytecpy(fin, x, 32);\n  while (r-- > 0)\n    {\n      clefiaf0xor(fout + 0, fin + 0, rk + 0);\n      clefiaf1xor(fout + 8, fin + 8, rk + 4);\n      clefiaf0xor(fout + 16, fin + 16, rk + 8);\n      clefiaf1xor(fout + 24, fin + 24, rk + 12);\n      rk += 16;\n      if (r)\n        {\n          /* swapping for encryption */\n\n          bytecpy(fin + 0, fout + 4, 28);\n          bytecpy(fin + 28, fout + 0, 4);\n        }\n    }\n\n  bytecpy(y, fout, 32);\n}\n#endif\n\n#if 0 /* Not used */\nstatic void clefiagfn4inv(unsigned char *y, const unsigned char *x,\n                          const unsigned char *rk, int r)\n{\n  unsigned char fin[16];\n  unsigned char fout[16];\n\n  rk += (r - 1) * 8;\n  bytecpy(fin, x, 16);\n  while (r-- > 0)\n    {\n      clefiaf0xor(fout + 0, fin + 0, rk + 0);\n      clefiaf1xor(fout + 8, fin + 8, rk + 4);\n      rk -= 8;\n      if (r)\n        {\n          /* swapping for decryption */\n\n          bytecpy(fin + 0, fout + 12, 4);\n          bytecpy(fin + 4, fout + 0, 12);\n        }\n    }\n\n  bytecpy(y, fout, 16);\n}\n#endif\n\nstatic void clefiadoubleswap(unsigned char *lk)\n{\n  unsigned char t[16];\n\n  t[0] = (lk[0] << 7) | (lk[1] >> 1);\n  t[1] = (lk[1] << 7) | (lk[2] >> 1);\n  t[2] = (lk[2] << 7) | (lk[3] >> 1);\n  t[3] = (lk[3] << 7) | (lk[4] >> 1);\n  t[4] = (lk[4] << 7) | (lk[5] >> 1);\n  t[5] = (lk[5] << 7) | (lk[6] >> 1);\n  t[6] = (lk[6] << 7) | (lk[7] >> 1);\n  t[7] = (lk[7] << 7) | (lk[15] & 0x7fu);\n\n  t[8] = (lk[8] >> 7) | (lk[0] & 0xfeu);\n  t[9] = (lk[9] >> 7) | (lk[8] << 1);\n  t[10] = (lk[10] >> 7) | (lk[9] << 1);\n  t[11] = (lk[11] >> 7) | (lk[10] << 1);\n  t[12] = (lk[12] >> 7) | (lk[11] << 1);\n  t[13] = (lk[13] >> 7) | (lk[12] << 1);\n  t[14] = (lk[14] >> 7) | (lk[13] << 1);\n  t[15] = (lk[15] >> 7) | (lk[14] << 1);\n\n  bytecpy(lk, t, 16);\n}\n\nstatic void clefiaconset(unsigned char *con, const unsigned char *iv, int lk)\n{\n  unsigned char t[2];\n  unsigned char tmp;\n\n  bytecpy(t, iv, 2);\n  while (lk-- > 0)\n    {\n      con[0] = t[0] ^ 0xb7u;    /* P_16 = 0xb7e1 (natural logarithm) */\n      con[1] = t[1] ^ 0xe1u;\n      con[2] = ~((t[0] << 1) | (t[1] >> 7));\n      con[3] = ~((t[1] << 1) | (t[0] >> 7));\n      con[4] = ~t[0] ^ 0x24u;   /* Q_16 = 0x243f (circle ratio) */\n      con[5] = ~t[1] ^ 0x3fu;\n      con[6] = t[1];\n      con[7] = t[0];\n      con += 8;\n\n      /* updating T */\n\n      if (t[1] & 0x01u)\n        {\n          t[0] ^= 0xa8u;\n          t[1] ^= 0x30u;\n        }\n\n      tmp = t[0] << 7;\n      t[0] = (t[0] >> 1) | (t[1] << 7);\n      t[1] = (t[1] >> 1) | tmp;\n    }\n}\n\nstatic void left_shift_one(uint8_t * in, uint8_t * out)\n{\n  int i;\n  int overflow;\n\n  overflow = 0;\n  for (i = 15; i >= 0; i--)\n    {\n      out[i] = in[i] << 1;\n      out[i] |= overflow;\n      overflow = (in[i] >> 7) & 1;\n    }\n}\n\nstatic void gen_subkey(struct cipher *c)\n{\n  uint8_t L[16];\n\n  memset(L, 0, 16);\n  clefiaencrypt(L, L, c->rk, c->round);\n\n  left_shift_one(L, c->k1);\n  if (L[0] & 0x80)\n    {\n      c->k1[15] = c->k1[15] ^ 0x87;\n    }\n\n  left_shift_one(c->k1, c->k2);\n  if (c->k1[0] & 0x80)\n    {\n      c->k2[15] = c->k2[15] ^ 0x87;\n    }\n\n  memset(L, 0, 16);\n}\n\n/****************************************************************************\n * Public Functions\n ****************************************************************************/\n\nstruct cipher *cipher_init(uint8_t * key, uint8_t * iv)\n{\n  struct cipher *c;\n\n  c = (struct cipher *)malloc(sizeof(*c));\n  if (!c)\n    {\n      return NULL;\n    }\n\n  c->round = clefiakeyset(c->rk, key);\n\n  gen_subkey(c);\n  memset(c->vector, 0, 16);\n\n  return c;\n}\n\nvoid cipher_deinit(struct cipher *c)\n{\n  memset(c, 0, sizeof(*c));\n  free(c);\n}\n\nint cipher_calc_cmac(struct cipher *c, void *data, int size, void *cmac)\n{\n  uint8_t m[16];\n  uint8_t *p;\n\n  if (size & 0xf)\n    {\n      return -1;\n    }\n\n  p = (uint8_t *) data;\n  while (size)\n    {\n      bytexor(m, c->vector, p, 16);\n      clefiaencrypt(c->vector, m, c->rk, c->round);\n      size -= 16;\n      p += 16;\n    }\n\n  bytexor(cmac, m, c->k1, 16);\n  clefiaencrypt(cmac, cmac, c->rk, c->round);\n  memset(m, 0, 16);\n\n  return 0;\n}\n\nvoid bytexor(unsigned char *dst, const unsigned char *a,\n             const unsigned char *b, int bytelen)\n{\n  while (bytelen-- > 0)\n    {\n      *dst++ = *a++ ^ *b++;\n    }\n}\n\nint clefiakeyset(unsigned char *rk, const unsigned char *skey)\n{\n  const unsigned char iv[2] =\n  {\n    0x42u, 0x8au  /* cubic root of 2 */\n  };\n\n  unsigned char lk[16];\n  unsigned char con128[4 * 60];\n  int i;\n\n  /* generating CONi^(128) (0 <= i < 60, lk = 30) */\n\n  clefiaconset(con128, iv, 30);\n\n  /* GFN_{4,12} (generating L from K) */\n\n  clefiagfn4(lk, skey, con128, 12);\n\n  bytecpy(rk, skey, 8);    /* initial whitening key (WK0, WK1) */\n  rk += 8;\n  for (i = 0; i < 9; i++)\n    {\n      /* round key (RKi (0 <= i < 36)) */\n\n      bytexor(rk, lk, con128 + i * 16 + (4 * 24), 16);\n      if (i % 2)\n        {\n          bytexor(rk, rk, skey, 16);    /* Xoring K */\n        }\n\n      clefiadoubleswap(lk);     /* Updating L (DoubleSwap function) */\n      rk += 16;\n    }\n\n  bytecpy(rk, skey + 8, 8);     /* final whitening key (WK2, WK3) */\n\n  return 18;\n}\n\nvoid clefiaencrypt(unsigned char *ct, const unsigned char *pt,\n                   const unsigned char *rk, const int r)\n{\n  unsigned char rin[16];\n  unsigned char  rout[16];\n\n  bytecpy(rin, pt, 16);\n\n  bytexor(rin + 4, rin + 4, rk + 0, 4); /* initial key whitening */\n  bytexor(rin + 12, rin + 12, rk + 4, 4);\n  rk += 8;\n\n  clefiagfn4(rout, rin, rk, r); /* GFN_{4,r} */\n\n  bytecpy(ct, rout, 16);\n  bytexor(ct + 4, ct + 4, rk + r * 8 + 0, 4);   /* final key whitening */\n  bytexor(ct + 12, ct + 12, rk + r * 8 + 4, 4);\n}\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/mkspk/clefia.h",
    "content": "/****************************************************************************\n * tools/cxd56/clefia.h\n *\n * Copyright (C) 2007, 2008 Sony Corporation\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n * 3. Neither the name NuttX nor the names of its contributors may be\n *    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\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n#ifndef _TOOLS_CXD56_CLEFIA_H_\n#define _TOOLS_CXD56_CLEFIA_H_\n\n/****************************************************************************\n * Public Types\n ****************************************************************************/\n\nstruct cipher\n  {\n    int mode;\n    int dir;\n    uint8_t rk[8 * 26 + 16];\n    uint8_t vector[16];\n    int round;\n    uint8_t k1[16];\n    uint8_t k2[16];\n  };\n\n/****************************************************************************\n * Public Function Prototypes\n ****************************************************************************/\n\nstruct cipher *cipher_init(uint8_t * key, uint8_t * iv);\nvoid cipher_deinit(struct cipher *c);\nint cipher_calc_cmac(struct cipher *c, void *data, int size, void *cmac);\nvoid bytexor(unsigned char *dst, const unsigned char *a,\n             const unsigned char *b, int bytelen);\nint clefiakeyset(unsigned char *rk, const unsigned char *skey);\nvoid clefiaencrypt(unsigned char *ct, const unsigned char *pt,\n                   const unsigned char *rk, const int r);\n\n#endif\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/mkspk/elf32.h",
    "content": "/****************************************************************************\n * include/elf32.h\n *\n *   Copyright (C) 2012 Gregory Nutt. All rights reserved.\n *   Author: Gregory Nutt <gnutt@nuttx.org>\n *\n * Reference: System V Application Binary Interface, Edition 4.1, March 18,\n * 1997, The Santa Cruz Operation, Inc.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n * 3. Neither the name NuttX nor the names of its contributors may be\n *    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\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *\n ****************************************************************************/\n\n#ifndef __INCLUDE_ELF32_H\n#define __INCLUDE_ELF32_H\n\n/****************************************************************************\n * Included Files\n ****************************************************************************/\n\n#include <stdint.h>\n\n/****************************************************************************\n * Pre-processor Definitions\n ****************************************************************************/\n\n#define EI_NIDENT          16     /* Size of e_ident[] */\n\n#define ELF32_ST_BIND(i)   ((i) >> 4)\n#define ELF32_ST_TYPE(i)   ((i) & 0xf)\n#define ELF32_ST_INFO(b,t) (((b) << 4) | ((t) & 0xf))\n\n/* Definitions for Elf32_Rel*::r_info */\n\n#define ELF32_R_SYM(i)    ((i) >> 8)\n#define ELF32_R_TYPE(i)   ((i) & 0xff)\n#define ELF32_R_INFO(s,t) (((s)<< 8) | ((t) & 0xff))\n\n#define ELF_R_SYM(i)      ELF32_R_SYM(i)\n\n/****************************************************************************\n * Public Type Definitions\n ****************************************************************************/\n\n/* Figure 4.2: 32-Bit Data Types */\n\ntypedef uint32_t  Elf32_Addr;  /* Unsigned program address */\ntypedef uint16_t  Elf32_Half;  /* Unsigned medium integer */\ntypedef uint32_t  Elf32_Off;   /* Unsigned file offset */\ntypedef int32_t   Elf32_Sword; /* Signed large integer */\ntypedef uint32_t  Elf32_Word;  /* Unsigned large integer */\n\n/* Figure 4-3: ELF Header */\n\ntypedef struct\n{\n  unsigned char e_ident[EI_NIDENT];\n  Elf32_Half    e_type;\n  Elf32_Half    e_machine;\n  Elf32_Word    e_version;\n  Elf32_Addr    e_entry;\n  Elf32_Off     e_phoff;\n  Elf32_Off     e_shoff;\n  Elf32_Word    e_flags;\n  Elf32_Half    e_ehsize;\n  Elf32_Half    e_phentsize;\n  Elf32_Half    e_phnum;\n  Elf32_Half    e_shentsize;\n  Elf32_Half    e_shnum;\n  Elf32_Half    e_shstrndx;\n} Elf32_Ehdr;\n\n/* Figure 4-8: Section Header */\n\ntypedef struct\n{\n  Elf32_Word    sh_name;\n  Elf32_Word    sh_type;\n  Elf32_Word    sh_flags;\n  Elf32_Addr    sh_addr;\n  Elf32_Off     sh_offset;\n  Elf32_Word    sh_size;\n  Elf32_Word    sh_link;\n  Elf32_Word    sh_info;\n  Elf32_Word    sh_addralign;\n  Elf32_Word    sh_entsize;\n} Elf32_Shdr;\n\n/* Figure 4-15: Symbol Table Entry */\n\ntypedef struct\n{\n  Elf32_Word    st_name;\n  Elf32_Addr    st_value;\n  Elf32_Word    st_size;\n  unsigned char st_info;\n  unsigned char st_other;\n  Elf32_Half    st_shndx;\n} Elf32_Sym;\n\n/* Figure 4-19: Relocation Entries */\n\ntypedef struct\n{\n  Elf32_Addr   r_offset;\n  Elf32_Word   r_info;\n} Elf32_Rel;\n\ntypedef struct\n{\n  Elf32_Addr   r_offset;\n  Elf32_Word   r_info;\n  Elf32_Sword  r_addend;\n} Elf32_Rela;\n\n/* Figure 5-1: Program Header */\n\ntypedef struct\n{\n  Elf32_Word   p_type;\n  Elf32_Off    p_offset;\n  Elf32_Addr   p_vaddr;\n  Elf32_Addr   p_paddr;\n  Elf32_Word   p_filesz;\n  Elf32_Word   p_memsz;\n  Elf32_Word   p_flags;\n  Elf32_Word   p_align;\n} Elf32_Phdr;\n\n/* Figure 5-9: Dynamic Structure */\n\ntypedef struct\n{\n  Elf32_Sword  d_tag;\n  union\n  {\n    Elf32_Word d_val;\n    Elf32_Addr d_ptr;\n  } d_un;\n} Elf32_Dyn;\n\ntypedef Elf32_Addr  Elf_Addr;\ntypedef Elf32_Ehdr  Elf_Ehdr;\ntypedef Elf32_Rel   Elf_Rel;\ntypedef Elf32_Rela  Elf_Rela;\ntypedef Elf32_Sym   Elf_Sym;\ntypedef Elf32_Shdr  Elf_Shdr;\ntypedef Elf32_Word  Elf_Word;\n\n#endif /* __INCLUDE_ELF32_H */\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/mkspk/mkspk.c",
    "content": "/****************************************************************************\n * tools/cxd56/mkspk.c\n *\n * Copyright (C) 2007, 2008 Sony Corporation\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n * 3. Neither the name NuttX nor the names of its contributors may be\n *    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\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n/****************************************************************************\n * Included Files\n ****************************************************************************/\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <stdint.h>\n#include <stdbool.h>\n#include <assert.h>\n\n#include \"mkspk.h\"\n\n/****************************************************************************\n * Private Types\n ****************************************************************************/\n\nstruct args\n{\n  int core;\n  char *elffile;\n  char *savename;\n  char *outputfile;\n};\n\n/****************************************************************************\n * Private Data\n ****************************************************************************/\n\nstatic uint8_t vmk[16] =\n  \"\\x27\\xc0\\xaf\\x1b\\x5d\\xcb\\xc6\\xc5\\x58\\x22\\x1c\\xdd\\xaf\\xf3\\x20\\x21\";\n\nstatic struct args g_options =\n{\n  0\n};\n\n/****************************************************************************\n * Private Functions\n ****************************************************************************/\n\nstatic struct args *parse_args(int argc, char **argv)\n{\n  int opt;\n  int show_help;\n  struct args *args = &g_options;\n  char *endp;\n\n  show_help = 0;\n\n  if (argc < 2)\n    {\n      show_help = 1;\n    }\n\n  memset(args, 0, sizeof(*args));\n  args->core = -1;\n\n  while ((opt = getopt(argc, argv, \"h:c:\")) != -1)\n    {\n      switch (opt)\n        {\n        case 'c':\n          args->core = strtol(optarg, &endp, 0);\n          if (*endp)\n            {\n              fprintf(stderr, \"Invalid core number \\\"%s\\\"\\n\", optarg);\n              show_help = 1;\n            }\n          break;\n\n        case 'h':\n        default:\n          show_help = 1;\n        }\n    }\n\n  argc -= optind;\n  argv += optind;\n\n  args->elffile = argv[0];\n  args->savename = argv[1];\n  argc -= 2;\n  argv += 2;\n\n  if (argc > 0)\n    {\n      args->outputfile = strdup(argv[0]);\n    }\n  else\n    {\n      show_help = 1;\n    }\n\n  /* Sanity checks for options */\n\n  if (show_help == 1)\n    {\n      fprintf(stderr,\n              \"mkspk [-c <number>] <filename> <save name> [<output file>]\\n\");\n      exit(EXIT_FAILURE);\n    }\n\n  if (args->core < 0)\n    {\n      fprintf(stderr, \"Core number is not set. Please use -c option.\\n\");\n      exit(EXIT_FAILURE);\n    }\n\n  if (strlen(args->savename) > 63)\n    {\n      fprintf(stderr, \"savename too long.\\n\");\n      exit(EXIT_FAILURE);\n    }\n\n  return args;\n}\n\nstatic struct elf_file *load_elf(const char *filename)\n{\n  size_t fsize;\n  int pos;\n  char *buf;\n  FILE *fp;\n  struct elf_file *ef;\n  Elf32_Shdr *sh;\n  uint16_t i;\n  int ret;\n\n  fp = fopen(filename, \"rb\");\n  if (!fp)\n    {\n      return NULL;\n    }\n\n  ef = (struct elf_file *)malloc(sizeof(*ef));\n  if (!ef)\n    {\n      fclose(fp);\n      return NULL;\n    }\n\n  pos = fseek(fp, 0, SEEK_END);\n  fsize = (size_t) ftell(fp);\n  fseek(fp, pos, SEEK_SET);\n\n  buf = (char *)malloc(fsize);\n  if (!buf)\n    {\n      free(ef);\n      fclose(fp);\n      return NULL;\n    }\n\n  ret = fread(buf, fsize, 1, fp);\n  fclose(fp);\n  if (ret != 1)\n    {\n      free(ef);\n      free(buf);\n      return NULL;\n    }\n\n  ef->data = buf;\n\n  ef->ehdr = (Elf32_Ehdr *) buf;\n\n  Elf32_Ehdr *h = (Elf32_Ehdr *) buf;\n\n  if (!(h->e_ident[EI_MAG0] == 0x7f &&\n        h->e_ident[EI_MAG1] == 'E' &&\n        h->e_ident[EI_MAG2] == 'L' && h->e_ident[EI_MAG3] == 'F'))\n    {\n      free(ef);\n      free(buf);\n      return NULL;\n    }\n\n  ef->phdr = (Elf32_Phdr *) (buf + ef->ehdr->e_phoff);\n  ef->shdr = (Elf32_Shdr *) (buf + ef->ehdr->e_shoff);\n  ef->shstring = buf + ef->shdr[ef->ehdr->e_shstrndx].sh_offset;\n\n  for (i = 0, sh = ef->shdr; i < ef->ehdr->e_shnum; i++, sh++)\n    {\n      if (sh->sh_type == SHT_SYMTAB)\n        {\n          ef->symtab = (Elf32_Sym *) (buf + sh->sh_offset);\n          ef->nsyms = sh->sh_size / sh->sh_entsize;\n          continue;\n        }\n\n      if (sh->sh_type == SHT_STRTAB)\n        {\n          if (!strcmp(\".strtab\", ef->shstring + sh->sh_name))\n            {\n              ef->string = buf + sh->sh_offset;\n            }\n        }\n    }\n\n  return ef;\n}\n\nstatic void *create_image(struct elf_file *elf, int core, char *savename,\n                         int *image_size)\n{\n  char *img;\n  struct spk_header *header;\n  struct spk_prog_info *pi;\n  Elf32_Phdr *ph;\n  Elf32_Sym *sym;\n  char *name;\n  int snlen;\n  int nphs, psize, imgsize;\n  int i;\n  int j;\n  uint32_t offset;\n  uint32_t sp;\n\n  snlen = alignup(strlen(savename) + 1, 16);\n\n  nphs = 0;\n  psize = 0;\n  for (i = 0, ph = elf->phdr; i < elf->ehdr->e_phnum; i++, ph++)\n    {\n      if (ph->p_type != PT_LOAD || ph->p_filesz == 0)\n        {\n          continue;\n        }\n\n      nphs++;\n      psize += alignup(ph->p_filesz, 16);\n    }\n\n  imgsize = sizeof(*header) + snlen + (nphs * 16) + psize;\n\n  img = (char *)malloc(imgsize + 32);\n  if (!img)\n    {\n      return NULL;\n    }\n\n  *image_size = imgsize;\n  sym = elf->symtab;\n  name = elf->string;\n  sp = 0;\n\n  for (j = 0; j < elf->nsyms; j++, sym++)\n    {\n      if (!strcmp(\"__stack\", name + sym->st_name))\n        {\n          sp = sym->st_value;\n        }\n    }\n\n  memset(img, 0, imgsize);\n\n  header = (struct spk_header *)img;\n  header->magic[0] = 0xef;\n  header->magic[1] = 'M';\n  header->magic[2] = 'O';\n  header->magic[3] = 'D';\n  header->cpu = core;\n\n  header->entry = elf->ehdr->e_entry;\n  header->stack = sp;\n  header->core = core;\n\n  header->binaries = nphs;\n  header->phoffs = sizeof(*header) + snlen;\n  header->mode = 0777;\n\n  strncpy(img + sizeof(*header), savename, 63);\n\n  ph = elf->phdr;\n  pi = (struct spk_prog_info *)(img + header->phoffs);\n  offset = ((char *)pi - img) + (nphs * sizeof(*pi));\n  for (i = 0; i < elf->ehdr->e_phnum; i++, ph++)\n    {\n      if (ph->p_type != PT_LOAD || ph->p_filesz == 0)\n        continue;\n      pi->load_address = ph->p_paddr;\n      pi->offset = offset;\n      pi->size = alignup(ph->p_filesz, 16);     /* need 16 bytes align for\n                                                 * decryption */\n      pi->memsize = ph->p_memsz;\n\n      memcpy(img + pi->offset, elf->data + ph->p_offset, ph->p_filesz);\n\n      offset += alignup(ph->p_filesz, 16);\n      pi++;\n    }\n\n  return img;\n}\n\n/****************************************************************************\n * Public Functions\n ****************************************************************************/\n\nint main(int argc, char **argv)\n{\n  struct args *args;\n  struct elf_file *elf;\n  struct cipher *c;\n  uint8_t *spkimage;\n  int size = 0;\n  FILE *fp;\n  char footer[16];\n\n  args = parse_args(argc, argv);\n\n  elf = load_elf(args->elffile);\n  if (!elf)\n    {\n      fprintf(stderr, \"Loading ELF %s failure.\\n\", args->elffile);\n      exit(EXIT_FAILURE);\n    }\n\n  spkimage = create_image(elf, args->core, args->savename, &size);\n  if(elf->data) {\n      free(elf->data);\n  }\n  free(elf);\n\n\n  c = cipher_init(vmk, NULL);\n  cipher_calc_cmac(c, spkimage, size, (uint8_t *) spkimage + size);\n  cipher_deinit(c);\n\n  size += 16;                   /* Extend CMAC size */\n\n  snprintf(footer, 16, \"MKSPK_BN_HOOTER\");\n  footer[15] = '\\0';\n\n  fp = fopen(args->outputfile, \"wb\");\n  if (!fp)\n    {\n      fprintf(stderr, \"Output file open error.\\n\");\n      free(spkimage);\n      exit(EXIT_FAILURE);\n    }\n\n  fwrite(spkimage, size, 1, fp);\n  fwrite(footer, 16, 1, fp);\n\n  fclose(fp);\n\n  printf(\"File %s is successfully created.\\n\", args->outputfile);\n  free(args->outputfile);\n\n  memset(spkimage, 0, size);\n  free(spkimage);\n\n  exit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/mkspk/mkspk.h",
    "content": "/****************************************************************************\n * tools/cxd56/mkspk.h\n *\n * Copyright (C) 2007, 2008 Sony Corporation\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in\n *    the documentation and/or other materials provided with the\n *    distribution.\n * 3. Neither the name NuttX nor the names of its contributors may be\n *    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\n * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n *****************************************************************************/\n\n/****************************************************************************\n * Included Files\n ****************************************************************************/\n\n#include \"clefia.h\"\n#include \"elf32.h\"\n\n/****************************************************************************\n * Pre-processor Definitions\n ****************************************************************************/\n\n#define EI_MAG0            0      /* File identification */\n#define EI_MAG1            1\n#define EI_MAG2            2\n#define EI_MAG3            3\n\n#define SHT_SYMTAB         2\n#define SHT_STRTAB         3\n\n#define PT_LOAD            1\n\n#define alignup(x, a) (((x) + ((a) - 1)) & ~((a) - 1))\n#define swap(a, b) { (a) ^= (b); (b) ^= (a); (a) ^= (b); }\n\n/****************************************************************************\n * Public Types\n ****************************************************************************/\n\nstruct spk_header\n  {\n    uint8_t magic[4];\n    uint8_t cpu;\n    uint8_t reserved[11];\n    uint32_t entry;\n    uint32_t stack;\n    uint16_t core;\n    uint16_t binaries;\n    uint16_t phoffs;\n    uint16_t mode;\n  };\n\nstruct spk_prog_info\n  {\n    uint32_t load_address;\n    uint32_t offset;\n    uint32_t size;\n    uint32_t memsize;\n  };\n\nstruct elf_file\n  {\n    Elf32_Ehdr *ehdr;\n    Elf32_Phdr *phdr;\n    Elf32_Shdr *shdr;\n    Elf32_Sym *symtab;\n    int nsyms;\n    char *shstring;\n    char *string;\n    char *data;\n  };\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/tools/flash_writer.py",
    "content": "#!/usr/bin/env python3\n\n# Copyright (C) 2018 Sony Semiconductor Solutions Corp.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions\n# are met:\n#\n# 1. Redistributions of source code must retain the above copyright\n#    notice, this list of conditions and the following disclaimer.\n# 2. Redistributions in binary form must reproduce the above copyright\n#    notice, this list of conditions and the following disclaimer in\n#    the documentation and/or other materials provided with the\n#    distribution.\n# 3. Neither the name NuttX nor the names of its contributors may be\n#    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\n# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS\n# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED\n# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n# POSSIBILITY OF SUCH DAMAGE.\n#\n\nimport time\nimport sys\nimport os\nimport struct\nimport glob\nimport fnmatch\nimport errno\nimport telnetlib\nimport argparse\nimport shutil\nimport subprocess\nimport re\nimport xmodem\n\nimport_serial_module = True\n\n# When SDK release, please set SDK_RELEASE as True.\nSDK_RELEASE = False\n\nif SDK_RELEASE :\n\tPRINT_RAW_COMMAND = False\n\tREBOOT_AT_END = True\nelse :\n\tPRINT_RAW_COMMAND = True\n\tREBOOT_AT_END = True\n\ntry:\n\timport serial\nexcept:\n\timport_serial_module = False\n\n# supported environment various\n# CXD56_PORT\n# CXD56_TELNETSRV_PORT\n# CXD56_TELNETSRV_IP\n\nPROTOCOL_SERIAL = 0\nPROTOCOL_TELNET = 1\n\nMAX_DOT_COUNT = 70\n\n# configure parameters and default value\nclass ConfigArgs:\n\tPROTOCOL_TYPE = None\n\tSERIAL_PORT = \"COM1\"\n\tSERVER_PORT = 4569\n\tSERVER_IP = \"localhost\"\n\tEOL = bytes([10])\n\tWAIT_RESET = True\n\tAUTO_RESET = False\n\tDTR_RESET = False\n\tXMODEM_BAUD = 0\n\tNO_SET_BOOTABLE = False\n\tPACKAGE_NAME = []\n\tFILE_NAME = []\n\tERASE_NAME = []\n\tPKGSYS_NAME = []\n\tPKGAPP_NAME = []\n\tPKGUPD_NAME = []\n\nROM_MSG = [b\"Welcome to nash\"]\nXMDM_MSG = \"Waiting for XMODEM (CRC or 1K) transfer. Ctrl-X to cancel.\"\n\nclass ConfigArgsLoader():\n\tdef __init__(self):\n\t\tself.parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter)\n\t\tself.parser.add_argument(\"package_name\", help=\"the name of the package to install\", nargs='*')\n\t\tself.parser.add_argument(\"-f\", \"--file\", dest=\"file_name\", help=\"save file\", action='append')\n\t\tself.parser.add_argument(\"-e\", \"--erase\", dest=\"erase_name\", help=\"erase file\", action='append')\n\n\t\tself.parser.add_argument(\"-S\", \"--sys\", dest=\"pkgsys_name\", help=\"the name of the system package to install\", action='append')\n\t\tself.parser.add_argument(\"-A\", \"--app\", dest=\"pkgapp_name\", help=\"the name of the application package to install\", action='append')\n\t\tself.parser.add_argument(\"-U\", \"--upd\", dest=\"pkgupd_name\", help=\"the name of the updater package to install\", action='append')\n\n\t\tself.parser.add_argument(\"-a\", \"--auto-reset\", dest=\"auto_reset\",\n\t\t\t\t\t\t\t\t\taction=\"store_true\", default=None,\n\t\t\t\t\t\t\t\t\thelp=\"try to auto reset develop board if possible\")\n\t\tself.parser.add_argument(\"-d\", \"--dtr-reset\", dest=\"dtr_reset\",\n\t\t\t\t\t\t\t\t\taction=\"store_true\", default=None,\n\t\t\t\t\t\t\t\t\thelp=\"try to auto reset develop board if possible\")\n\t\tself.parser.add_argument(\"-n\", \"--no-set-bootable\", dest=\"no_set_bootable\",\n\t\t\t\t\t\t\t\t\taction=\"store_true\", default=None,\n\t\t\t\t\t\t\t\t\thelp=\"not to set bootable\")\n\n\t\tgroup = self.parser.add_argument_group()\n\t\tgroup.add_argument(\"-i\", \"--server-ip\", dest=\"server_ip\",\n\t\t\t\t\t\t   help=\"the ip address connected to the telnet server\")\n\t\tgroup.add_argument(\"-p\", \"--server-port\", dest=\"server_port\", type=int,\n\t\t\t\t\t\t   help=\"the port connected to the telnet server\")\n\n\t\tgroup = self.parser.add_argument_group()\n\t\tgroup.add_argument(\"-c\", \"--serial-port\", dest=\"serial_port\", help=\"the serial port\")\n\t\tgroup.add_argument(\"-b\", \"--xmodem-baudrate\", dest=\"xmodem_baud\", help=\"Use the faster baudrate in xmodem\")\n\n\t\tmutually_group = self.parser.add_mutually_exclusive_group()\n\t\tmutually_group.add_argument(\"-t\", \"--telnet-protocol\", dest=\"telnet_protocol\",\n\t\t\t\t\t\t\t\t\taction=\"store_true\", default=None,\n\t\t\t\t\t\t\t\t\thelp=\"use the telnet protocol for binary transmission\")\n\t\tmutually_group.add_argument(\"-s\", \"--serial-protocol\", dest=\"serial_protocol\",\n\t\t\t\t\t\t\t\t\taction=\"store_true\", default=None,\n\t\t\t\t\t\t\t\t\thelp=\"use the serial port for binary transmission, default options\")\n\n\t\tmutually_group2 = self.parser.add_mutually_exclusive_group()\n\t\tmutually_group2.add_argument(\"-F\", \"--force-wait-reset\", dest=\"wait_reset\",\n\t\t\t\t\t\t\t\t\taction=\"store_true\", default=None,\n\t\t\t\t\t\t\t\t\thelp=\"force wait for pressing RESET button\")\n\t\tmutually_group2.add_argument(\"-N\", \"--no-wait-reset\", dest=\"wait_reset\",\n\t\t\t\t\t\t\t\t\taction=\"store_false\", default=None,\n\t\t\t\t\t\t\t\t\thelp=\"if possible, skip to wait for pressing RESET button\")\n\n\tdef update_config(self):\n\t\targs = self.parser.parse_args()\n\n\t\tConfigArgs.PACKAGE_NAME = args.package_name\n\t\tConfigArgs.FILE_NAME = args.file_name\n\t\tConfigArgs.ERASE_NAME = args.erase_name\n\t\tConfigArgs.PKGSYS_NAME = args.pkgsys_name\n\t\tConfigArgs.PKGAPP_NAME = args.pkgapp_name\n\t\tConfigArgs.PKGUPD_NAME = args.pkgupd_name\n\n\t\t# Get serial port or telnet server ip etc\n\t\tif args.serial_protocol == True:\n\t\t\tConfigArgs.PROTOCOL_TYPE = PROTOCOL_SERIAL\n\t\telif args.telnet_protocol == True:\n\t\t\tConfigArgs.PROTOCOL_TYPE = PROTOCOL_TELNET\n\n\t\tif ConfigArgs.PROTOCOL_TYPE == None:\n\t\t\tproto = os.environ.get(\"CXD56_PROTOCOL\")\n\t\t\tif proto is not None:\n\t\t\t\tif 's' in proto:\n\t\t\t\t\tConfigArgs.PROTOCOL_TYPE = PROTOCOL_SERIAL\n\t\t\t\telif 't' in proto:\n\t\t\t\t\tConfigArgs.PROTOCOL_TYPE = PROTOCOL_TELNET\n\n\t\tif ConfigArgs.PROTOCOL_TYPE == None:\n\t\t\tConfigArgs.PROTOCOL_TYPE = PROTOCOL_SERIAL\n\n\t\tif ConfigArgs.PROTOCOL_TYPE == PROTOCOL_SERIAL:\n\t\t\tif args.serial_port is not None:\n\t\t\t\tConfigArgs.SERIAL_PORT = args.serial_port\n\t\t\telse:\n\t\t\t\t# Get serial port from the environment\n\t\t\t\tport = os.environ.get(\"CXD56_PORT\")\n\t\t\t\tif port is not None:\n\t\t\t\t\tConfigArgs.SERIAL_PORT = port\n\t\t\t\telse:\n\t\t\t\t\tprint(\"CXD56_PORT is not set, Use \" + ConfigArgs.SERIAL_PORT + \".\")\n\t\telse:\n\t\t\tConfigArgs.PROTOCOL_TYPE = PROTOCOL_TELNET\n\t\t\tif args.server_port is not None:\n\t\t\t\tConfigArgs.SERVER_PORT = args.server_port\n\t\t\telse:\n\t\t\t\tport = os.environ.get(\"CXD56_TELNETSRV_PORT\")\n\t\t\t\tif port is not None:\n\t\t\t\t\tConfigArgs.SERVER_PORT = port\n\t\t\t\telse:\n\t\t\t\t\tprint(\"CXD56_TELNETSRV_PORT is not set, Use \" + str(ConfigArgs.SERVER_PORT) + \".\")\n\t\t\tif args.server_ip is not None:\n\t\t\t\tConfigArgs.SERVER_IP = args.server_ip\n\t\t\telse:\n\t\t\t\tip = os.environ.get(\"CXD56_TELNETSRV_IP\")\n\t\t\t\tif ip is not None:\n\t\t\t\t\tConfigArgs.SERVER_IP = ip\n\t\t\t\telse:\n\t\t\t\t\tprint(\"CXD56_TELNETSRV_IP is not set, Use \" + ConfigArgs.SERVER_IP + \".\")\n\n\t\tif args.xmodem_baud is not None:\n\t\t\tConfigArgs.XMODEM_BAUD = args.xmodem_baud\n\n\t\tif args.auto_reset is not None:\n\t\t\tConfigArgs.AUTO_RESET = args.auto_reset\n\n\t\tif args.dtr_reset is not None:\n\t\t\tConfigArgs.DTR_RESET = args.dtr_reset\n\n\t\tif args.no_set_bootable is not None:\n\t\t\tConfigArgs.NO_SET_BOOTABLE = args.no_set_bootable\n\n\t\tif args.wait_reset is not None:\n\t\t\tConfigArgs.WAIT_RESET = args.wait_reset\n\nclass TelnetDev:\n\tdef __init__(self):\n\t\tsrv_ipaddr = ConfigArgs.SERVER_IP\n\t\tsrv_port = ConfigArgs.SERVER_PORT\n\t\tself.recvbuf = b'';\n\t\ttry:\n\t\t\tself.telnet = telnetlib.Telnet(host=srv_ipaddr, port=srv_port, timeout=10)\n\t\t\t# There is a ack to be sent after connecting to the telnet server.\n\t\t\tself.telnet.write(b\"\\xff\")\n\t\texcept Exception as e:\n\t\t\tprint(\"Cannot connect to the server %s:%d\" % (srv_ipaddr, srv_port))\n\t\t\tsys.exit(e.args[0])\n\n\tdef readline(self, size=None):\n\t\tres = b''\n\t\tch = b''\n\t\twhile ch != ConfigArgs.EOL:\n\t\t\tch = self.getc_raw(1, timeout=0.1)\n\t\t\tif ch == b'':\n\t\t\t\treturn res\n\t\t\tres += ch\n\t\treturn res\n\n\tdef getc_raw(self, size, timeout=1):\n\t\tres = b''\n\t\ttm = time.monotonic()\n\t\twhile size > 0:\n\t\t\twhile self.recvbuf == b'':\n\t\t\t\tself.recvbuf = self.telnet.read_eager()\n\t\t\t\tif self.recvbuf == b'':\n\t\t\t\t\tif (time.monotonic() - tm) > timeout:\n\t\t\t\t\t\treturn res\n\t\t\t\t\ttime.sleep(0.1)\n\t\t\tres += self.recvbuf[0:1]\n\t\t\tself.recvbuf = self.recvbuf[1:]\n\t\t\tsize -= 1\n\t\treturn res\n\n\tdef write(self, buffer):\n\t\tself.telnet.write(buffer)\n\n\tdef discard_inputs(self, timeout=1.0):\n\t\twhile True:\n\t\t\tch = self.getc_raw(1, timeout=timeout)\n\t\t\tif ch == b'':\n\t\t\t\tbreak\n\n\tdef getc(self, size, timeout=1):\n\t\tc = self.getc_raw(size, timeout)\n\t\treturn c\n\n\tdef putc(self, buffer, timeout=1):\n\t\tself.telnet.write(buffer)\n\t\tself.show_progress(len(buffer))\n\n\tdef reboot(self):\n\t\t# no-op\n\t\tpass\n\n\tdef set_file_size(self, filesize):\n\t\tself.bytes_transfered = 0\n\t\tself.filesize = filesize\n\t\tself.count = 0\n\n\tdef show_progress(self, sendsize):\n\t\tif PRINT_RAW_COMMAND:\n\t\t\tif self.count < MAX_DOT_COUNT:\n\t\t\t\tself.bytes_transfered = self.bytes_transfered + sendsize\n\t\t\t\tcur_count = int(self.bytes_transfered * MAX_DOT_COUNT / self.filesize)\n\t\t\t\tif MAX_DOT_COUNT < cur_count:\n\t\t\t\t\tcur_count = MAX_DOT_COUNT\n\t\t\t\tfor idx in range(cur_count - self.count):\n\t\t\t\t\tprint('#',end='')\n\t\t\t\t\tsys.stdout.flush()\n\t\t\t\tself.count = cur_count\n\t\t\t\tif self.count == MAX_DOT_COUNT:\n\t\t\t\t\tprint(\"\\n\")\n\nclass SerialDev:\n\tdef __init__(self):\n\t\tif import_serial_module is False:\n\t\t\tprint(\"Cannot import serial module, maybe it's not install yet.\")\n\t\t\tprint(\"\\n\", end=\"\")\n\t\t\tprint(\"Please install python-setuptool by Cygwin installer.\")\n\t\t\tprint(\"After that use easy_intall command to install serial module\")\n\t\t\tprint(\"    $ cd tool/\")\n\t\t\tprint(\"    $ python3 -m easy_install pyserial-2.7.tar.gz\")\n\t\t\tquit()\n\t\telse:\n\t\t\tport = ConfigArgs.SERIAL_PORT\n\t\t\ttry:\n\t\t\t\tself.serial = serial.Serial(port, baudrate=115200,\n\t\t\t\t\tparity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE,\n\t\t\t\t\tbytesize=serial.EIGHTBITS, timeout=0.1)\n\t\t\texcept Exception as e:\n\t\t\t\tprint(\"Cannot open port : \" + port)\n\t\t\t\tsys.exit(e.args[0])\n\n\tdef readline(self, size=None):\n\t\treturn self.serial.readline(size)\n\n\tdef write(self, buffer):\n\t\tself.serial.write(buffer)\n\t\tself.serial.flush()\n\n\tdef discard_inputs(self, timeout=1.0):\n\t\ttime.sleep(timeout)\n\t\tself.serial.flushInput()\n\n\tdef getc(self, size, timeout=1):\n\t\tself.serial.timeout = timeout\n\t\tc = self.serial.read(size)\n\t\tself.serial.timeout = 0.1\n\t\treturn c\n\n\tdef putc(self, buffer, timeout=1):\n\t\tself.serial.timeout = timeout\n\t\tself.serial.write(buffer)\n\t\tself.serial.flush()\n\t\tself.serial.timeout = 0.1\n\t\tself.show_progress(len(buffer))\n\n\t# Note: windows platform dependent code\n\tdef putc_win(self, buffer, timeout=1):\n\t\tself.serial.write(buffer)\n\t\tself.show_progress(len(buffer))\n\t\twhile True:\n\t\t\tif self.serial.out_waiting == 0:\n\t\t\t\tbreak\n\n\tdef setBaudrate(self, baudrate):\n#\t\tself.serial.setBaudrate(baudrate)\n\t\tself.serial.baudrate = baudrate\n\n\tdef reboot(self):\n\t\t# Target Reset by DTR\n\t\tself.serial.setDTR(False)\n\t\tself.serial.setDTR(True)\n\t\tself.serial.setDTR(False)\n\n\tdef set_file_size(self, filesize):\n\t\tself.bytes_transfered = 0\n\t\tself.filesize = filesize\n\t\tself.count = 0\n\n\tdef show_progress(self, sendsize):\n\t\tif PRINT_RAW_COMMAND:\n\t\t\tif self.count < MAX_DOT_COUNT:\n\t\t\t\tself.bytes_transfered = self.bytes_transfered + sendsize\n\t\t\t\tcur_count = int(self.bytes_transfered * MAX_DOT_COUNT / self.filesize)\n\t\t\t\tif MAX_DOT_COUNT < cur_count:\n\t\t\t\t\tcur_count = MAX_DOT_COUNT\n\t\t\t\tfor idx in range(cur_count - self.count):\n\t\t\t\t\tprint('#',end='')\n\t\t\t\t\tsys.stdout.flush()\n\t\t\t\tself.count = cur_count\n\t\t\t\tif self.count == MAX_DOT_COUNT:\n\t\t\t\t\tprint(\"\\n\")\n\nclass FlashWriter:\n\tdef __init__(self, protocol_sel=PROTOCOL_SERIAL):\n\t\tif protocol_sel == PROTOCOL_TELNET:\n\t\t\tself.serial = TelnetDev()\n\t\telse:\n\t\t\tself.serial = SerialDev()\n\n\tdef cancel_autoboot(self) :\n\t\tboot_msg = ''\n\t\tself.serial.reboot()  # Target reboot before send 'r'\n\t\twhile boot_msg == '' :\n\t\t\trx = self.serial.readline().strip()\n\t\t\tself.serial.write(b\"r\")  # Send \"r\" key to avoid auto boot\n\t\t\tfor msg in ROM_MSG :\n\t\t\t\tif msg in rx :\n\t\t\t\t\tboot_msg = msg\n\t\t\t\t\tbreak\n\t\twhile True :\n\t\t\trx = self.serial.readline().decode(errors=\"replace\").strip()\n\t\t\tif \"updater\" in rx :\n\t\t\t\t# Workaround : Sometime first character is dropped.\n\t\t\t\t# Send line feed as air shot before actual command.\n\t\t\t\tself.serial.write(b\"\\n\")    # Send line feed\n\t\t\t\tself.serial.discard_inputs()# Clear input buffer to sync\n\t\t\t\treturn boot_msg.decode(errors=\"ignore\")\n\n\tdef recv(self):\n\t\trx = self.serial.readline()\n\t\tif PRINT_RAW_COMMAND :\n\t\t\tserial_line = rx.decode(errors=\"replace\")\n\t\t\tif serial_line.strip() != \"\" and not serial_line.startswith(XMDM_MSG):\n\t\t\t\tprint(serial_line, end=\"\")\n\t\treturn rx\n\n\tdef wait(self, string):\n\t\twhile True:\n\t\t\trx = self.recv()\n\t\t\tif string.encode() in rx:\n\t\t\t\ttime.sleep(0.1)\n\t\t\t\tbreak\n\n\tdef wait_for_prompt(self):\n\t\tprompt_pat = re.compile(b\"updater\")\n\t\twhile True:\n\t\t\trx = self.recv()\n\t\t\tif prompt_pat.search(rx):\n\t\t\t\ttime.sleep(0.1)\n\t\t\t\tbreak\n\n\tdef send(self, string):\n\t\tself.serial.write(str(string).encode() + b\"\\n\")\n\t\trx = self.serial.readline()\n\t\tif PRINT_RAW_COMMAND :\n\t\t\tprint(rx.decode(errors=\"replace\"), end=\"\")\n\n\tdef read_output(self, prompt_text) :\n\t\toutput = []\n\t\twhile True :\n\t\t\trx = self.serial.readline()\n\t\t\tif prompt_text.encode() in rx :\n\t\t\t\ttime.sleep(0.1)\n\t\t\t\tbreak\n\t\t\tif rx != \"\" :\n\t\t\t\toutput.append(rx.decode(errors=\"ignore\").rstrip())\n\t\treturn output\n\n\tdef install_files(self, files, command) :\n\t\tif ConfigArgs.XMODEM_BAUD:\n\t\t\tcommand += \" -b \" + ConfigArgs.XMODEM_BAUD\n\t\tif os.name == 'nt':\n\t\t\tmodem = xmodem.XMODEM(self.serial.getc, self.serial.putc_win, 'xmodem1k')\n\t\telse:\n\t\t\tmodem = xmodem.XMODEM(self.serial.getc, self.serial.putc, 'xmodem1k')\n\t\tfor file in files:\n\t\t\twith open(file, \"rb\") as bin :\n\t\t\t\tself.send(command)\n\t\t\t\tprint(\"Install \" + file)\n\t\t\t\tself.wait(XMDM_MSG)\n\t\t\t\tprint(\"|0%\" +\n\t\t\t\t\t\t\"-\" * (int(MAX_DOT_COUNT / 2) - 6) +\n\t\t\t\t\t\t\"50%\" +\n\t\t\t\t\t\t\"-\" * (MAX_DOT_COUNT - int(MAX_DOT_COUNT / 2) - 5) +\n\t\t\t\t\t\t\"100%|\")\n\t\t\t\tif ConfigArgs.XMODEM_BAUD:\n\t\t\t\t\tself.serial.setBaudrate(ConfigArgs.XMODEM_BAUD)\n\t\t\t\t\tself.serial.discard_inputs() # Clear input buffer to sync\n\t\t\t\tself.serial.set_file_size(os.path.getsize(file))\n\t\t\t\tmodem.send(bin)\n\t\t\t\tif ConfigArgs.XMODEM_BAUD:\n\t\t\t\t\tself.serial.setBaudrate(115200)\n\t\t\tself.wait_for_prompt()\n\n\tdef save_files(self, files) :\n\t\tif ConfigArgs.XMODEM_BAUD:\n\t\t\tcommand = \"save_file -b \" + ConfigArgs.XMODEM_BAUD + \" -x \"\n\t\telse:\n\t\t\tcommand = \"save_file -x \"\n\t\tif os.name == 'nt':\n\t\t\tmodem = xmodem.XMODEM(self.serial.getc, self.serial.putc_win, 'xmodem1k')\n\t\telse:\n\t\t\tmodem = xmodem.XMODEM(self.serial.getc, self.serial.putc, 'xmodem1k')\n\t\tfor file in files:\n\t\t\twith open(file, \"rb\") as bin :\n\t\t\t\tself.send(command + os.path.basename(file))\n\t\t\t\tprint(\"Save \" + file)\n\t\t\t\tself.wait(XMDM_MSG)\n\t\t\t\tif ConfigArgs.XMODEM_BAUD:\n\t\t\t\t\tself.serial.setBaudrate(ConfigArgs.XMODEM_BAUD)\n\t\t\t\t\tself.serial.discard_inputs() # Clear input buffer to sync\n\t\t\t\tself.serial.set_file_size(os.path.getsize(file))\n\t\t\t\tmodem.send(bin)\n\t\t\t\tif ConfigArgs.XMODEM_BAUD:\n\t\t\t\t\tself.serial.setBaudrate(115200)\n\t\t\t\tself.wait_for_prompt()\n\t\t\t\tself.send(\"chmod d+rw \" + os.path.basename(file))\n\t\t\t\tself.wait_for_prompt()\n\n\tdef delete_files(self, files) :\n\t\tfor file in files :\n\t\t\tself.delete_binary(file)\n\n\tdef delete_binary(self, bin_name) :\n\t\tself.send(\"rm \" + bin_name)\n\t\tself.wait_for_prompt()\n\ndef main():\n\ttry:\n\t\tconfig_loader = ConfigArgsLoader()\n\t\tconfig_loader.update_config()\n\texcept:\n\t\treturn errno.EINVAL\n\n\t# Wait to reset the board\n\twriter = FlashWriter(ConfigArgs.PROTOCOL_TYPE)\n\n\tdo_wait_reset = True\n\tif ConfigArgs.AUTO_RESET:\n\t\tif subprocess.call(\"cd \" + sys.path[0] + \"; ./reset_board.sh\", shell=True) == 0:\n\t\t\tprint(\"auto reset board success!!\")\n\t\t\tdo_wait_reset = False\n\t\t\tbootrom_msg = writer.cancel_autoboot()\n\n\tif ConfigArgs.DTR_RESET:\n\t\tdo_wait_reset = False\n\t\tbootrom_msg = writer.cancel_autoboot()\n\n\tif ConfigArgs.WAIT_RESET == False and do_wait_reset == True:\n\t\trx = writer.recv()\n\t\ttime.sleep(1)\n\t\tfor i in range(3):\n\t\t\twriter.send(\"\")\n\t\t\trx = writer.recv()\n\t\t\tif \"updater\".encode() in rx:\n\t\t\t\t# No need to wait for reset\n\t\t\t\tdo_wait_reset = False\n\t\t\t\tbreak\n\t\t\ttime.sleep(1)\n\n\tif do_wait_reset:\n\t\t# Wait to reset the board\n\t\tprint('Please press RESET button on target board')\n\t\tsys.stdout.flush()\n\t\tbootrom_msg = writer.cancel_autoboot()\n\n\t# Remove files\n\tif ConfigArgs.ERASE_NAME :\n\t\tprint(\">>> Remove existing files ...\")\n\t\twriter.delete_files(ConfigArgs.ERASE_NAME)\n\n\t# Install files\n\tif ConfigArgs.PACKAGE_NAME or ConfigArgs.PKGSYS_NAME or ConfigArgs.PKGAPP_NAME or ConfigArgs.PKGUPD_NAME:\n\t\tprint(\">>> Install files ...\")\n\tif ConfigArgs.PACKAGE_NAME :\n\t\twriter.install_files(ConfigArgs.PACKAGE_NAME, \"install\")\n\tif ConfigArgs.PKGSYS_NAME :\n\t\twriter.install_files(ConfigArgs.PKGSYS_NAME, \"install\")\n\tif ConfigArgs.PKGAPP_NAME :\n\t\twriter.install_files(ConfigArgs.PKGAPP_NAME, \"install\")\n\tif ConfigArgs.PKGUPD_NAME :\n\t\twriter.install_files(ConfigArgs.PKGUPD_NAME, \"install -k updater.key\")\n\n\t# Save files\n\tif ConfigArgs.FILE_NAME :\n\t\tprint(\">>> Save files ...\")\n\t\twriter.save_files(ConfigArgs.FILE_NAME)\n\n\t# Set auto boot\n\tif not ConfigArgs.NO_SET_BOOTABLE:\n\t\tprint(\">>> Save Configuration to FlashROM ...\")\n\t\twriter.send(\"set bootable M0P\")\n\t\twriter.wait_for_prompt()\n\n\t# Sync all cached data to flash\n\twriter.send(\"sync\")\n\twriter.wait_for_prompt()\n\n\tif REBOOT_AT_END :\n\t\tprint(\"Restarting the board ...\")\n\t\twriter.send(\"reboot\")\n\n\treturn 0\n\nif __name__ == \"__main__\":\n\ttry:\n\t\tsys.exit(main())\n\texcept KeyboardInterrupt:\n\t\tprint(\"Canceled by keyboard interrupt.\")\n\t\tpass\n"
  },
  {
    "path": "hw/mcu/sony/cxd56/tools/xmodem.py",
    "content": "#!/usr/bin/env python3\n'''\n===============================\n XMODEM file transfer protocol\n===============================\n\n.. $Id$\n\nThis is a literal implementation of XMODEM.TXT_, XMODEM1K.TXT_ and\nXMODMCRC.TXT_, support for YMODEM and ZMODEM is pending. YMODEM should\nbe fairly easy to implement as it is a hack on top of the XMODEM\nprotocol using sequence bytes ``0x00`` for sending file names (and some\nmeta data).\n\n.. _XMODEM.TXT: doc/XMODEM.TXT\n.. _XMODEM1K.TXT: doc/XMODEM1K.TXT\n.. _XMODMCRC.TXT: doc/XMODMCRC.TXT\n\nData flow example including error recovery\n==========================================\n\nHere is a sample of the data flow, sending a 3-block message.\nIt includes the two most common line hits - a garbaged block,\nand an ``ACK`` reply getting garbaged. ``CRC`` or ``CSUM`` represents\nthe checksum bytes.\n\nXMODEM 128 byte blocks\n----------------------\n\n::\n\n    SENDER                                      RECEIVER\n\n                                            <-- NAK\n    SOH 01 FE Data[128] CSUM                -->\n                                            <-- ACK\n    SOH 02 FD Data[128] CSUM                -->\n                                            <-- ACK\n    SOH 03 FC Data[128] CSUM                -->\n                                            <-- ACK\n    SOH 04 FB Data[128] CSUM                -->\n                                            <-- ACK\n    SOH 05 FA Data[100] CPMEOF[28] CSUM     -->\n                                            <-- ACK\n    EOT                                     -->\n                                            <-- ACK\n\nXMODEM-1k blocks, CRC mode\n--------------------------\n\n::\n\n    SENDER                                      RECEIVER\n\n                                            <-- C\n    STX 01 FE Data[1024] CRC CRC            -->\n                                            <-- ACK\n    STX 02 FD Data[1024] CRC CRC            -->\n                                            <-- ACK\n    STX 03 FC Data[1000] CPMEOF[24] CRC CRC -->\n                                            <-- ACK\n    EOT                                     -->\n                                            <-- ACK\n\nMixed 1024 and 128 byte Blocks\n------------------------------\n\n::\n\n    SENDER                                      RECEIVER\n\n                                            <-- C\n    STX 01 FE Data[1024] CRC CRC            -->\n                                            <-- ACK\n    STX 02 FD Data[1024] CRC CRC            -->\n                                            <-- ACK\n    SOH 03 FC Data[128] CRC CRC             -->\n                                            <-- ACK\n    SOH 04 FB Data[100] CPMEOF[28] CRC CRC  -->\n                                            <-- ACK\n    EOT                                     -->\n                                            <-- ACK\n\nYMODEM Batch Transmission Session (1 file)\n------------------------------------------\n\n::\n\n    SENDER                                      RECEIVER\n                                            <-- C (command:rb)\n    SOH 00 FF foo.c NUL[123] CRC CRC        -->\n                                            <-- ACK\n                                            <-- C\n    SOH 01 FE Data[128] CRC CRC             -->\n                                            <-- ACK\n    SOH 02 FC Data[128] CRC CRC             -->\n                                            <-- ACK\n    SOH 03 FB Data[100] CPMEOF[28] CRC CRC  -->\n                                            <-- ACK\n    EOT                                     -->\n                                            <-- NAK\n    EOT                                     -->\n                                            <-- ACK\n                                            <-- C\n    SOH 00 FF NUL[128] CRC CRC              -->\n                                            <-- ACK\n\n\n'''\n\n__author__ = 'Wijnand Modderman <maze@pyth0n.org>'\n__copyright__ = ['Copyright (c) 2010 Wijnand Modderman',\n                 'Copyright (c) 1981 Chuck Forsberg']\n__license__ = 'MIT'\n__version__ = '0.3.2'\n\nimport logging\nimport time\nimport sys\nfrom functools import partial\nimport collections\n\n# Loggerr\nlog = logging.getLogger('xmodem')\n\n# Protocol bytes\nSOH = bytes([0x01])\nSTX = bytes([0x02])\nEOT = bytes([0x04])\nACK = bytes([0x06])\nDLE = bytes([0x10])\nNAK = bytes([0x15])\nCAN = bytes([0x18])\nCRC = bytes([0x43]) # C\n\n\nclass XMODEM(object):\n    '''\n    XMODEM Protocol handler, expects an object to read from and an object to\n    write to.\n\n    >>> def getc(size, timeout=1):\n    ...     return data or None\n    ...\n    >>> def putc(data, timeout=1):\n    ...     return size or None\n    ...\n    >>> modem = XMODEM(getc, putc)\n\n\n    :param getc: Function to retrieve bytes from a stream\n    :type getc: callable\n    :param putc: Function to transmit bytes to a stream\n    :type putc: callable\n    :param mode: XMODEM protocol mode\n    :type mode: string\n    :param pad: Padding character to make the packets match the packet size\n    :type pad: char\n\n    '''\n\n    # crctab calculated by Mark G. Mendel, Network Systems Corporation\n    crctable = [\n        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\n        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\n        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\n        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\n        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\n        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\n        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\n        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\n        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\n        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\n        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\n        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\n        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\n        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\n        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\n        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\n        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\n        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\n        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\n        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\n        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\n        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\n        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\n        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\n        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\n        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\n        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\n        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\n        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\n        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\n        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\n        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\n    ]\n\n    def __init__(self, getc, putc, mode='xmodem', pad=b'\\x1a'):\n        self.getc = getc\n        self.putc = putc\n        self.mode = mode\n        self.pad = pad\n\n    def abort(self, count=2, timeout=60):\n        '''\n        Send an abort sequence using CAN bytes.\n        '''\n        for counter in range(0, count):\n            self.putc(CAN, timeout)\n\n    def send(self, stream, retry=32, timeout=360, quiet=0, callback=None):\n        '''\n        Send a stream via the XMODEM protocol.\n\n            >>> stream = file('/etc/issue', 'rb')\n            >>> print modem.send(stream)\n            True\n\n        Returns ``True`` upon successful transmission or ``False`` in case of\n        failure.\n\n        :param stream: The stream object to send data from.\n        :type stream: stream (file, etc.)\n        :param retry: The maximum number of times to try to resend a failed\n                      packet before failing.\n        :type retry: int\n        :param timeout: The number of seconds to wait for a response before\n                        timing out.\n        :type timeout: int\n        :param quiet: If 0, it prints info to stderr.  If 1, it does not print any info.\n        :type quiet: int\n        :param callback: Reference to a callback function that has the\n                         following signature.  This is useful for\n                         getting status updates while a xmodem\n                         transfer is underway.\n                         Expected callback signature:\n                         def callback(total_packets, success_count, error_count)\n        :type callback: callable\n        '''\n\n        # initialize protocol\n        try:\n            packet_size = dict(\n                xmodem    = 128,\n                xmodem1k  = 1024,\n            )[self.mode]\n        except AttributeError:\n            raise ValueError(\"An invalid mode was supplied\")\n\n        error_count = 0\n        crc_mode = 0\n        cancel = 0\n        while True:\n            char = self.getc(1)\n            if char:\n                if char == NAK:\n                    crc_mode = 0\n                    break\n                elif char == CRC:\n                    crc_mode = 1\n                    break\n                elif char == CAN:\n                    if not quiet:\n                        print('received CAN', file=sys.stderr)\n                    if cancel:\n                        return False\n                    else:\n                        cancel = 1\n                else:\n                    log.error('send ERROR expected NAK/CRC, got %s' % \\\n                        (ord(char),))\n\n            error_count += 1\n            if error_count >= retry:\n                self.abort(timeout=timeout)\n                return False\n\n        # send data\n        error_count = 0\n        success_count = 0\n        total_packets = 0\n        sequence = 1\n        while True:\n            data = stream.read(packet_size)\n            if not data:\n                log.info('sending EOT')\n                # end of stream\n                break\n            total_packets += 1\n            data = data.ljust(packet_size, self.pad)\n            if crc_mode:\n                crc = self.calc_crc(data)\n            else:\n                crc = self.calc_checksum(data)\n\n            # emit packet\n            while True:\n                if packet_size == 128:\n                    self.putc(SOH)\n                else:  # packet_size == 1024\n                    self.putc(STX)\n                self.putc(bytes([sequence]))\n                self.putc(bytes([0xff - sequence]))\n                self.putc(data)\n                if crc_mode:\n                    self.putc(bytes([crc >> 8]))\n                    self.putc(bytes([crc & 0xff]))\n                else:\n                    self.putc(bytes([crc]))\n\n                char = self.getc(1, timeout)\n                if char == ACK:\n                    success_count += 1\n                    if isinstance(callback, collections.Callable):\n                        callback(total_packets, success_count, error_count)\n                    break\n                if char == NAK:\n                    error_count += 1\n                    if isinstance(callback, collections.Callable):\n                        callback(total_packets, success_count, error_count)\n                    if error_count >= retry:\n                        # excessive amounts of retransmissions requested,\n                        # abort transfer\n                        self.abort(timeout=timeout)\n                        log.warning('excessive NAKs, transfer aborted')\n                        return False\n\n                    # return to loop and resend\n                    continue\n                else:\n                    log.error('Not ACK, Not NAK')\n                    error_count += 1\n                    if isinstance(callback, collections.Callable):\n                        callback(total_packets, success_count, error_count)\n                    if error_count >= retry:\n                        # excessive amounts of retransmissions requested,\n                        # abort transfer\n                        self.abort(timeout=timeout)\n                        log.warning('excessive protocol errors, transfer aborted')\n                        return False\n\n                    # return to loop and resend\n                    continue\n\n                # protocol error\n                self.abort(timeout=timeout)\n                log.error('protocol error')\n                return False\n\n            # keep track of sequence\n            sequence = (sequence + 1) % 0x100\n\n        while True:\n            # end of transmission\n            self.putc(EOT)\n\n            #An ACK should be returned\n            char = self.getc(1, timeout)\n            if char == ACK:\n                break\n            else:\n                error_count += 1\n                if error_count >= retry:\n                    self.abort(timeout=timeout)\n                    log.warning('EOT was not ACKd, transfer aborted')\n                    return False\n\n        return True\n\n    def recv(self, stream, crc_mode=1, retry=16, timeout=60, delay=1, quiet=0):\n        '''\n        Receive a stream via the XMODEM protocol.\n\n            >>> stream = file('/etc/issue', 'wb')\n            >>> print modem.recv(stream)\n            2342\n\n        Returns the number of bytes received on success or ``None`` in case of\n        failure.\n        '''\n\n        # initiate protocol\n        error_count = 0\n        char = 0\n        cancel = 0\n        while True:\n            # first try CRC mode, if this fails,\n            # fall back to checksum mode\n            if error_count >= retry:\n                self.abort(timeout=timeout)\n                return None\n            elif crc_mode and error_count < (retry / 2):\n                if not self.putc(CRC):\n                    time.sleep(delay)\n                    error_count += 1\n            else:\n                crc_mode = 0\n                if not self.putc(NAK):\n                    time.sleep(delay)\n                    error_count += 1\n\n            char = self.getc(1, timeout)\n            if not char:\n                error_count += 1\n                continue\n            elif char == SOH:\n                #crc_mode = 0\n                break\n            elif char == STX:\n                break\n            elif char == CAN:\n                if cancel:\n                    return None\n                else:\n                    cancel = 1\n            else:\n                error_count += 1\n\n        # read data\n        error_count = 0\n        income_size = 0\n        packet_size = 128\n        sequence = 1\n        cancel = 0\n        while True:\n            while True:\n                if char == SOH:\n                    packet_size = 128\n                    break\n                elif char == STX:\n                    packet_size = 1024\n                    break\n                elif char == EOT:\n                    # We received an EOT, so send an ACK and return the received\n                    # data length\n                    self.putc(ACK)\n                    return income_size\n                elif char == CAN:\n                    # cancel at two consecutive cancels\n                    if cancel:\n                        return None\n                    else:\n                        cancel = 1\n                else:\n                    if not quiet:\n                        print('recv ERROR expected SOH/EOT, got', ord(char), file=sys.stderr)\n                    error_count += 1\n                    if error_count >= retry:\n                        self.abort()\n                        return None\n            # read sequence\n            error_count = 0\n            cancel = 0\n            seq1 = ord(self.getc(1))\n            seq2 = 0xff - ord(self.getc(1))\n            if seq1 == sequence and seq2 == sequence:\n                # sequence is ok, read packet\n                # packet_size + checksum\n                data = self.getc(packet_size + 1 + crc_mode, timeout)\n                if crc_mode:\n                    csum = (ord(data[-2]) << 8) + ord(data[-1])\n                    data = data[:-2]\n                    log.debug('CRC (%04x <> %04x)' % \\\n                        (csum, self.calc_crc(data)))\n                    valid = csum == self.calc_crc(data)\n                else:\n                    csum = data[-1]\n                    data = data[:-1]\n                    log.debug('checksum (checksum(%02x <> %02x)' % \\\n                        (ord(csum), self.calc_checksum(data)))\n                    valid = ord(csum) == self.calc_checksum(data)\n\n                # valid data, append chunk\n                if valid:\n                    income_size += len(data)\n                    stream.write(data)\n                    self.putc(ACK)\n                    sequence = (sequence + 1) % 0x100\n                    char = self.getc(1, timeout)\n                    continue\n            else:\n                # consume data\n                self.getc(packet_size + 1 + crc_mode)\n                self.debug('expecting sequence %d, got %d/%d' % \\\n                    (sequence, seq1, seq2))\n\n            # something went wrong, request retransmission\n            self.putc(NAK)\n\n    def calc_checksum(self, data, checksum=0):\n        '''\n        Calculate the checksum for a given block of data, can also be used to\n        update a checksum.\n\n            >>> csum = modem.calc_checksum('hello')\n            >>> csum = modem.calc_checksum('world', csum)\n            >>> hex(csum)\n            '0x3c'\n\n        '''\n        return (sum(map(ord, data)) + checksum) % 256\n\n    def calc_crc(self, data, crc=0):\n        '''\n        Calculate the Cyclic Redundancy Check for a given block of data, can\n        also be used to update a CRC.\n\n            >>> crc = modem.calc_crc('hello')\n            >>> crc = modem.calc_crc('world', crc)\n            >>> hex(crc)\n            '0xd5e3'\n\n        '''\n        for char in data:\n            crc = (crc << 8) ^ self.crctable[((crc >> 8) ^ int(char)) & 0xff]\n        return crc & 0xffff\n\n\nXMODEM1k  = partial(XMODEM, mode='xmodem1k')\n\n\ndef run():\n    import optparse\n    import subprocess\n\n    parser = optparse.OptionParser(usage='%prog [<options>] <send|recv> filename filename')\n    parser.add_option('-m', '--mode', default='xmodem',\n        help='XMODEM mode (xmodem, xmodem1k)')\n\n    options, args = parser.parse_args()\n    if len(args) != 3:\n        parser.error('invalid arguments')\n        return 1\n\n    elif args[0] not in ('send', 'recv'):\n        parser.error('invalid mode')\n        return 1\n\n    def _func(so, si):\n        import select\n        import subprocess\n\n        print('si', si)\n        print('so', so)\n\n        def getc(size, timeout=3):\n            w,t,f = select.select([so], [], [], timeout)\n            if w:\n                data = so.read(size)\n            else:\n                data = None\n\n            print('getc(', repr(data), ')')\n            return data\n\n        def putc(data, timeout=3):\n            w,t,f = select.select([], [si], [], timeout)\n            if t:\n                si.write(data)\n                si.flush()\n                size = len(data)\n            else:\n                size = None\n\n            print('putc(', repr(data), repr(size), ')')\n            return size\n\n        return getc, putc\n\n    def _pipe(*command):\n        pipe = subprocess.Popen(command,\n            stdout=subprocess.PIPE, stdin=subprocess.PIPE)\n        return pipe.stdout, pipe.stdin\n\n    if args[0] == 'recv':\n        import io\n        getc, putc = _func(*_pipe('sz', '--xmodem', args[2]))\n        stream = open(args[1], 'wb')\n        xmodem = XMODEM(getc, putc, mode=options.mode)\n        status = xmodem.recv(stream, retry=8)\n        stream.close()\n\n    elif args[0] == 'send':\n        getc, putc = _func(*_pipe('rz', '--xmodem', args[2]))\n        stream = open(args[1], 'rb')\n        xmodem = XMODEM(getc, putc, mode=options.mode)\n        status = xmodem.send(stream, retry=8)\n        stream.close()\n\nif __name__ == '__main__':\n    sys.exit(run())\n"
  },
  {
    "path": "lib/SEGGER_RTT/Config/SEGGER_RTT_Conf.h",
    "content": "/*********************************************************************\n*                    SEGGER Microcontroller GmbH                     *\n*                        The Embedded Experts                        *\n**********************************************************************\n*                                                                    *\n*            (c) 1995 - 2020 SEGGER Microcontroller GmbH             *\n*                                                                    *\n*       www.segger.com     Support: support@segger.com               *\n*                                                                    *\n**********************************************************************\n*                                                                    *\n*       SEGGER RTT * Real Time Transfer for embedded targets         *\n*                                                                    *\n**********************************************************************\n*                                                                    *\n* All rights reserved.                                               *\n*                                                                    *\n* SEGGER strongly recommends to not make any changes                 *\n* to or modify the source code of this software in order to stay     *\n* compatible with the RTT protocol and J-Link.                       *\n*                                                                    *\n* Redistribution and use in source and binary forms, with or         *\n* without modification, are permitted provided that the following    *\n* condition is met:                                                  *\n*                                                                    *\n* o Redistributions of source code must retain the above copyright   *\n*   notice, this condition and the following disclaimer.             *\n*                                                                    *\n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             *\n* CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,        *\n* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           *\n* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           *\n* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *\n* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR           *\n* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  *\n* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;    *\n* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF      *\n* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT          *\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE  *\n* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH   *\n* DAMAGE.                                                            *\n*                                                                    *\n**********************************************************************\n---------------------------END-OF-HEADER------------------------------\nFile    : SEGGER_RTT_Conf.h\nPurpose : Implementation of SEGGER real-time transfer (RTT) which\n          allows real-time communication on targets which support\n          debugger memory accesses while the CPU is running.\nRevision: $Rev: 24316 $\n\n*/\n\n#ifndef SEGGER_RTT_CONF_H\n#define SEGGER_RTT_CONF_H\n\n#ifdef __IAR_SYSTEMS_ICC__\n  #include <intrinsics.h>\n#endif\n\n/*********************************************************************\n*\n*       Defines, configurable\n*\n**********************************************************************\n*/\n\n//\n// Take in and set to correct values for Cortex-A systems with CPU cache\n//\n//#define SEGGER_RTT_CPU_CACHE_LINE_SIZE            (32)          // Largest cache line size (in bytes) in the current system\n//#define SEGGER_RTT_UNCACHED_OFF                   (0xFB000000)  // Address alias where RTT CB and buffers can be accessed uncached\n//\n// Most common case:\n// Up-channel 0: RTT\n// Up-channel 1: SystemView\n//\n#ifndef   SEGGER_RTT_MAX_NUM_UP_BUFFERS\n  #define SEGGER_RTT_MAX_NUM_UP_BUFFERS             (3)     // Max. number of up-buffers (T->H) available on this target    (Default: 3)\n#endif\n//\n// Most common case:\n// Down-channel 0: RTT\n// Down-channel 1: SystemView\n//\n#ifndef   SEGGER_RTT_MAX_NUM_DOWN_BUFFERS\n  #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS           (3)     // Max. number of down-buffers (H->T) available on this target  (Default: 3)\n#endif\n\n#ifndef   BUFFER_SIZE_UP\n  #define BUFFER_SIZE_UP                            (1024)  // Size of the buffer for terminal output of target, up to host (Default: 1k)\n#endif\n\n#ifndef   BUFFER_SIZE_DOWN\n  #define BUFFER_SIZE_DOWN                          (16)    // Size of the buffer for terminal input to target from host (Usually keyboard input) (Default: 16)\n#endif\n\n#ifndef   SEGGER_RTT_PRINTF_BUFFER_SIZE\n  #define SEGGER_RTT_PRINTF_BUFFER_SIZE             (64u)    // Size of buffer for RTT printf to bulk-send chars via RTT     (Default: 64)\n#endif\n\n#ifndef   SEGGER_RTT_MODE_DEFAULT\n  #define SEGGER_RTT_MODE_DEFAULT                   SEGGER_RTT_MODE_NO_BLOCK_SKIP // Mode for pre-initialized terminal channel (buffer 0)\n#endif\n\n/*********************************************************************\n*\n*       RTT memcpy configuration\n*\n*       memcpy() is good for large amounts of data,\n*       but the overhead is big for small amounts, which are usually stored via RTT.\n*       With SEGGER_RTT_MEMCPY_USE_BYTELOOP a simple byte loop can be used instead.\n*\n*       SEGGER_RTT_MEMCPY() can be used to replace standard memcpy() in RTT functions.\n*       This is may be required with memory access restrictions,\n*       such as on Cortex-A devices with MMU.\n*/\n#ifndef   SEGGER_RTT_MEMCPY_USE_BYTELOOP\n  #define SEGGER_RTT_MEMCPY_USE_BYTELOOP              0 // 0: Use memcpy/SEGGER_RTT_MEMCPY, 1: Use a simple byte-loop\n#endif\n//\n// Example definition of SEGGER_RTT_MEMCPY to external memcpy with GCC toolchains and Cortex-A targets\n//\n//#if ((defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)) && (defined (__ARM_ARCH_7A__))\n//  #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes)      SEGGER_memcpy((pDest), (pSrc), (NumBytes))\n//#endif\n\n//\n// Target is not allowed to perform other RTT operations while string still has not been stored completely.\n// Otherwise we would probably end up with a mixed string in the buffer.\n// If using  RTT from within interrupts, multiple tasks or multi processors, define the SEGGER_RTT_LOCK() and SEGGER_RTT_UNLOCK() function here.\n//\n// SEGGER_RTT_MAX_INTERRUPT_PRIORITY can be used in the sample lock routines on Cortex-M3/4.\n// Make sure to mask all interrupts which can send RTT data, i.e. generate SystemView events, or cause task switches.\n// When high-priority interrupts must not be masked while sending RTT data, SEGGER_RTT_MAX_INTERRUPT_PRIORITY needs to be adjusted accordingly.\n// (Higher priority = lower priority number)\n// Default value for embOS: 128u\n// Default configuration in FreeRTOS: configMAX_SYSCALL_INTERRUPT_PRIORITY: ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )\n// In case of doubt mask all interrupts: 1 << (8 - BASEPRI_PRIO_BITS) i.e. 1 << 5 when 3 bits are implemented in NVIC\n// or define SEGGER_RTT_LOCK() to completely disable interrupts.\n//\n#ifndef   SEGGER_RTT_MAX_INTERRUPT_PRIORITY\n  #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY         (0x20)   // Interrupt priority to lock on SEGGER_RTT_LOCK on Cortex-M3/4 (Default: 0x20)\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration for SEGGER Embedded Studio,\n*       Rowley CrossStudio and GCC\n*/\n#if ((defined(__SES_ARM) || defined(__SES_RISCV) || defined(__CROSSWORKS_ARM) || defined(__GNUC__) || defined(__clang__)) && !defined (__CC_ARM) && !defined(WIN32))\n  #if (defined(__ARM_ARCH_6M__) || defined(__ARM_ARCH_8M_BASE__))\n    #define SEGGER_RTT_LOCK()   {                                                                   \\\n                                    unsigned int _SEGGER_RTT__LockState;                                         \\\n                                  __asm volatile (\"mrs   %0, primask  \\n\\t\"                         \\\n                                                  \"movs  r1, #1       \\n\\t\"                         \\\n                                                  \"msr   primask, r1  \\n\\t\"                         \\\n                                                  : \"=r\" (_SEGGER_RTT__LockState)                                \\\n                                                  :                                                 \\\n                                                  : \"r1\", \"cc\"                                      \\\n                                                  );\n\n    #define SEGGER_RTT_UNLOCK()   __asm volatile (\"msr   primask, %0  \\n\\t\"                         \\\n                                                  :                                                 \\\n                                                  : \"r\" (_SEGGER_RTT__LockState)                                 \\\n                                                  :                                                 \\\n                                                  );                                                \\\n                                }\n  #elif (defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__))\n    #ifndef   SEGGER_RTT_MAX_INTERRUPT_PRIORITY\n      #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY   (0x20)\n    #endif\n    #define SEGGER_RTT_LOCK()   {                                                                   \\\n                                    unsigned int _SEGGER_RTT__LockState;                                         \\\n                                  __asm volatile (\"mrs   %0, basepri  \\n\\t\"                         \\\n                                                  \"mov   r1, %1       \\n\\t\"                         \\\n                                                  \"msr   basepri, r1  \\n\\t\"                         \\\n                                                  : \"=r\" (_SEGGER_RTT__LockState)                                \\\n                                                  : \"i\"(SEGGER_RTT_MAX_INTERRUPT_PRIORITY)          \\\n                                                  : \"r1\", \"cc\"                                      \\\n                                                  );\n\n    #define SEGGER_RTT_UNLOCK()   __asm volatile (\"msr   basepri, %0  \\n\\t\"                         \\\n                                                  :                                                 \\\n                                                  : \"r\" (_SEGGER_RTT__LockState)                                 \\\n                                                  :                                                 \\\n                                                  );                                                \\\n                                }\n\n  #elif (defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__))\n    #define SEGGER_RTT_LOCK() {                                                \\\n                                 unsigned int _SEGGER_RTT__LockState;                       \\\n                                 __asm volatile (\"mrs r1, CPSR \\n\\t\"           \\\n                                                 \"mov %0, r1 \\n\\t\"             \\\n                                                 \"orr r1, r1, #0xC0 \\n\\t\"      \\\n                                                 \"msr CPSR_c, r1 \\n\\t\"         \\\n                                                 : \"=r\" (_SEGGER_RTT__LockState)            \\\n                                                 :                             \\\n                                                 : \"r1\", \"cc\"                  \\\n                                                 );\n\n    #define SEGGER_RTT_UNLOCK() __asm volatile (\"mov r0, %0 \\n\\t\"              \\\n                                                \"mrs r1, CPSR \\n\\t\"            \\\n                                                \"bic r1, r1, #0xC0 \\n\\t\"       \\\n                                                \"and r0, r0, #0xC0 \\n\\t\"       \\\n                                                \"orr r1, r1, r0 \\n\\t\"          \\\n                                                \"msr CPSR_c, r1 \\n\\t\"          \\\n                                                :                              \\\n                                                : \"r\" (_SEGGER_RTT__LockState)              \\\n                                                : \"r0\", \"r1\", \"cc\"             \\\n                                                );                             \\\n                            }\n  #elif defined(__riscv) || defined(__riscv_xlen)\n    #define SEGGER_RTT_LOCK()  {                                               \\\n                                 unsigned int _SEGGER_RTT__LockState;                       \\\n                                 __asm volatile (\"csrr  %0, mstatus  \\n\\t\"     \\\n                                                 \"csrci mstatus, 8   \\n\\t\"     \\\n                                                 \"andi  %0, %0,  8   \\n\\t\"     \\\n                                                 : \"=r\" (_SEGGER_RTT__LockState)            \\\n                                                 :                             \\\n                                                 :                             \\\n                                                );\n\n  #define SEGGER_RTT_UNLOCK()    __asm volatile (\"csrr  a1, mstatus  \\n\\t\"     \\\n                                                 \"or    %0, %0, a1   \\n\\t\"     \\\n                                                 \"csrs  mstatus, %0  \\n\\t\"     \\\n                                                 :                             \\\n                                                 : \"r\"  (_SEGGER_RTT__LockState)            \\\n                                                 : \"a1\"                        \\\n                                                );                             \\\n                               }\n  #else\n    #define SEGGER_RTT_LOCK()\n    #define SEGGER_RTT_UNLOCK()\n  #endif\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration for IAR EWARM\n*/\n#ifdef __ICCARM__\n  #if (defined (__ARM6M__)          && (__CORE__ == __ARM6M__))             ||                      \\\n      (defined (__ARM8M_BASELINE__) && (__CORE__ == __ARM8M_BASELINE__))\n    #define SEGGER_RTT_LOCK()   {                                                                   \\\n                                  unsigned int _SEGGER_RTT__LockState;                                           \\\n                                  _SEGGER_RTT__LockState = __get_PRIMASK();                                      \\\n                                  __set_PRIMASK(1);\n\n    #define SEGGER_RTT_UNLOCK()   __set_PRIMASK(_SEGGER_RTT__LockState);                                         \\\n                                }\n  #elif (defined (__ARM7EM__)         && (__CORE__ == __ARM7EM__))          ||                      \\\n        (defined (__ARM7M__)          && (__CORE__ == __ARM7M__))           ||                      \\\n        (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__))  ||                      \\\n        (defined (__ARM8M_MAINLINE__) && (__CORE__ == __ARM8M_MAINLINE__))\n    #ifndef   SEGGER_RTT_MAX_INTERRUPT_PRIORITY\n      #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY   (0x20)\n    #endif\n    #define SEGGER_RTT_LOCK()   {                                                                   \\\n                                  unsigned int _SEGGER_RTT__LockState;                                           \\\n                                  _SEGGER_RTT__LockState = __get_BASEPRI();                                      \\\n                                  __set_BASEPRI(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);\n\n    #define SEGGER_RTT_UNLOCK()   __set_BASEPRI(_SEGGER_RTT__LockState);                                         \\\n                                }\n  #elif (defined (__ARM7A__) && (__CORE__ == __ARM7A__))                    ||                      \\\n        (defined (__ARM7R__) && (__CORE__ == __ARM7R__))\n    #define SEGGER_RTT_LOCK() {                                                                     \\\n                                 unsigned int _SEGGER_RTT__LockState;                                            \\\n                                 __asm volatile (\"mrs r1, CPSR \\n\\t\"                                \\\n                                                 \"mov %0, r1 \\n\\t\"                                  \\\n                                                 \"orr r1, r1, #0xC0 \\n\\t\"                           \\\n                                                 \"msr CPSR_c, r1 \\n\\t\"                              \\\n                                                 : \"=r\" (_SEGGER_RTT__LockState)                                 \\\n                                                 :                                                  \\\n                                                 : \"r1\", \"cc\"                                       \\\n                                                 );\n\n    #define SEGGER_RTT_UNLOCK() __asm volatile (\"mov r0, %0 \\n\\t\"                                   \\\n                                                \"mrs r1, CPSR \\n\\t\"                                 \\\n                                                \"bic r1, r1, #0xC0 \\n\\t\"                            \\\n                                                \"and r0, r0, #0xC0 \\n\\t\"                            \\\n                                                \"orr r1, r1, r0 \\n\\t\"                               \\\n                                                \"msr CPSR_c, r1 \\n\\t\"                               \\\n                                                :                                                   \\\n                                                : \"r\" (_SEGGER_RTT__LockState)                                   \\\n                                                : \"r0\", \"r1\", \"cc\"                                  \\\n                                                );                                                  \\\n                            }\n  #endif\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration for IAR RX\n*/\n#ifdef __ICCRX__\n  #define SEGGER_RTT_LOCK()   {                                                                     \\\n                                unsigned long _SEGGER_RTT__LockState;                                            \\\n                                _SEGGER_RTT__LockState = __get_interrupt_state();                                \\\n                                __disable_interrupt();\n\n  #define SEGGER_RTT_UNLOCK()   __set_interrupt_state(_SEGGER_RTT__LockState);                                   \\\n                              }\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration for IAR RL78\n*/\n#ifdef __ICCRL78__\n  #define SEGGER_RTT_LOCK()   {                                                                     \\\n                                __istate_t _SEGGER_RTT__LockState;                                               \\\n                                _SEGGER_RTT__LockState = __get_interrupt_state();                                \\\n                                __disable_interrupt();\n\n  #define SEGGER_RTT_UNLOCK()   __set_interrupt_state(_SEGGER_RTT__LockState);                                   \\\n                              }\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration for KEIL ARM\n*/\n#ifdef __CC_ARM\n  #if (defined __TARGET_ARCH_6S_M)\n    #define SEGGER_RTT_LOCK()   {                                                                   \\\n                                  unsigned int _SEGGER_RTT__LockState;                                           \\\n                                  register unsigned char _SEGGER_RTT__PRIMASK __asm( \"primask\");                 \\\n                                  _SEGGER_RTT__LockState = _SEGGER_RTT__PRIMASK;                                              \\\n                                  _SEGGER_RTT__PRIMASK = 1u;                                                     \\\n                                  __schedule_barrier();\n\n    #define SEGGER_RTT_UNLOCK()   _SEGGER_RTT__PRIMASK = _SEGGER_RTT__LockState;                                              \\\n                                  __schedule_barrier();                                             \\\n                                }\n  #elif (defined(__TARGET_ARCH_7_M) || defined(__TARGET_ARCH_7E_M))\n    #ifndef   SEGGER_RTT_MAX_INTERRUPT_PRIORITY\n      #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY   (0x20)\n    #endif\n    #define SEGGER_RTT_LOCK()   {                                                                   \\\n                                  unsigned int _SEGGER_RTT__LockState;                                           \\\n                                  register unsigned char BASEPRI __asm( \"basepri\");                 \\\n                                  _SEGGER_RTT__LockState = BASEPRI;                                              \\\n                                  BASEPRI = SEGGER_RTT_MAX_INTERRUPT_PRIORITY;                      \\\n                                  __schedule_barrier();\n\n    #define SEGGER_RTT_UNLOCK()   BASEPRI = _SEGGER_RTT__LockState;                                              \\\n                                  __schedule_barrier();                                             \\\n                                }\n  #endif\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration for TI ARM\n*/\n#ifdef __TI_ARM__\n  #if defined (__TI_ARM_V6M0__)\n    #define SEGGER_RTT_LOCK()   {                                                                   \\\n                                  unsigned int _SEGGER_RTT__LockState;                                           \\\n                                  _SEGGER_RTT__LockState = __get_PRIMASK();                                      \\\n                                  __set_PRIMASK(1);\n\n    #define SEGGER_RTT_UNLOCK()   __set_PRIMASK(_SEGGER_RTT__LockState);                                         \\\n                                }\n  #elif (defined (__TI_ARM_V7M3__) || defined (__TI_ARM_V7M4__))\n    #ifndef   SEGGER_RTT_MAX_INTERRUPT_PRIORITY\n      #define SEGGER_RTT_MAX_INTERRUPT_PRIORITY   (0x20)\n    #endif\n    #define SEGGER_RTT_LOCK()   {                                                                   \\\n                                  unsigned int _SEGGER_RTT__LockState;                                           \\\n                                  _SEGGER_RTT__LockState = _set_interrupt_priority(SEGGER_RTT_MAX_INTERRUPT_PRIORITY);\n\n    #define SEGGER_RTT_UNLOCK()   _set_interrupt_priority(_SEGGER_RTT__LockState);                               \\\n                                }\n  #endif\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration for CCRX\n*/\n#ifdef __RX\n  #include <machine.h>\n  #define SEGGER_RTT_LOCK()   {                                                                     \\\n                                unsigned long _SEGGER_RTT__LockState;                                            \\\n                                _SEGGER_RTT__LockState = get_psw() & 0x010000;                                   \\\n                                clrpsw_i();\n\n  #define SEGGER_RTT_UNLOCK()   set_psw(get_psw() | _SEGGER_RTT__LockState);                                     \\\n                              }\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration for embOS Simulation on Windows\n*       (Can also be used for generic RTT locking with embOS)\n*/\n#if defined(WIN32) || defined(SEGGER_RTT_LOCK_EMBOS)\n\nvoid OS_SIM_EnterCriticalSection(void);\nvoid OS_SIM_LeaveCriticalSection(void);\n\n#define SEGGER_RTT_LOCK()       {                                                                   \\\n                                  OS_SIM_EnterCriticalSection();\n\n#define SEGGER_RTT_UNLOCK()       OS_SIM_LeaveCriticalSection();                                    \\\n                                }\n#endif\n\n/*********************************************************************\n*\n*       RTT lock configuration fallback\n*/\n#ifndef   SEGGER_RTT_LOCK\n  #define SEGGER_RTT_LOCK()                // Lock RTT (nestable)   (i.e. disable interrupts)\n#endif\n\n#ifndef   SEGGER_RTT_UNLOCK\n  #define SEGGER_RTT_UNLOCK()              // Unlock RTT (nestable) (i.e. enable previous interrupt lock state)\n#endif\n\n#endif\n/*************************** End of file ****************************/\n"
  },
  {
    "path": "lib/SEGGER_RTT/LICENSE.md",
    "content": "\n                    SEGGER Microcontroller GmbH\n                       The Embedded Experts\n\n           (c) 1995 - 2021 SEGGER Microcontroller GmbH\n          www.segger.com     Support: support@segger.com\n\n        SEGGER RTT  Real Time Transfer for embedded targets\n\n\n    All rights reserved.\n\n    SEGGER strongly recommends to not make any changes\n    to or modify the source code of this software in order to stay\n    compatible with the RTT protocol and J-Link.\n\n    Redistribution and use in source and binary forms, with or\n    without modification, are permitted provided that the following\n    condition is met:\n\n    - Redistributions of source code must retain the above copyright\n     notice, this condition and the following disclaimer.\n\n    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND\n    CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,\n    INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n    MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n    DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR\n    ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n    OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n    OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE\n    USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n    DAMAGE.\n"
  },
  {
    "path": "lib/SEGGER_RTT/README.md",
    "content": "RTT\n===\n\nSEGGER RTT Sources\n\nhttps://www.segger.com/products/debug-probes/j-link/technology/about-real-time-transfer\nhttps://wiki.segger.com/RTT\n\n## Included files\n\n  * `RTT/`\n    * `SEGGER_RTT.c`               - Main module for RTT.\n    * `SEGGER_RTT.h`               - Main header for RTT.\n    * `SEGGER_RTT_ASM_ARMv7M.S`    - Assembly-optimized implementation of RTT functions for ARMv7M processors.\n    * `SEGGER_RTT_Printf.c`        - Simple implementation of printf (`SEGGER_RTT_Printf()`) to write formatted strings via RTT.\n  * `Syscalls/`\n    * `SEGGER_RTT_Syscalls_*.c`    - Low-level syscalls to retarget `printf()` to RTT with different toolchains.\n  * `Config/`\n    * `SEGGER_RTT_Conf.h`          - RTT configuration file.\n  * `Examples/`\n    * `Main_RTT_InputEchoApp.c`    - Example application which echoes input on Channel 0.\n    * `Main_RTT_MenuApp.c`         - Example application to demonstrate RTT bi-directional functionality.\n    * `Main_RTT_PrintfTest.c`      - Example application to test RTT's simple printf implementation.\n    * `Main_RTT_SpeedTestApp.c`    - Example application to measure RTT performance. (Requires embOS)\n"
  },
  {
    "path": "lib/SEGGER_RTT/RTT/SEGGER_RTT.c",
    "content": "/*********************************************************************\n*                    SEGGER Microcontroller GmbH                     *\n*                        The Embedded Experts                        *\n**********************************************************************\n*                                                                    *\n*            (c) 1995 - 2019 SEGGER Microcontroller GmbH             *\n*                                                                    *\n*       www.segger.com     Support: support@segger.com               *\n*                                                                    *\n**********************************************************************\n*                                                                    *\n*       SEGGER RTT * Real Time Transfer for embedded targets         *\n*                                                                    *\n**********************************************************************\n*                                                                    *\n* All rights reserved.                                               *\n*                                                                    *\n* SEGGER strongly recommends to not make any changes                 *\n* to or modify the source code of this software in order to stay     *\n* compatible with the RTT protocol and J-Link.                       *\n*                                                                    *\n* Redistribution and use in source and binary forms, with or         *\n* without modification, are permitted provided that the following    *\n* condition is met:                                                  *\n*                                                                    *\n* o Redistributions of source code must retain the above copyright   *\n*   notice, this condition and the following disclaimer.             *\n*                                                                    *\n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             *\n* CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,        *\n* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           *\n* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           *\n* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *\n* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR           *\n* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  *\n* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;    *\n* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF      *\n* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT          *\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE  *\n* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH   *\n* DAMAGE.                                                            *\n*                                                                    *\n**********************************************************************\n---------------------------END-OF-HEADER------------------------------\nFile    : SEGGER_RTT.c\nPurpose : Implementation of SEGGER real-time transfer (RTT) which\n          allows real-time communication on targets which support\n          debugger memory accesses while the CPU is running.\nRevision: $Rev: 29668 $\n\nAdditional information:\n          Type \"int\" is assumed to be 32-bits in size\n          H->T    Host to target communication\n          T->H    Target to host communication\n\n          RTT channel 0 is always present and reserved for Terminal usage.\n          Name is fixed to \"Terminal\"\n\n          Effective buffer size: SizeOfBuffer - 1\n\n          WrOff == RdOff:       Buffer is empty\n          WrOff == (RdOff - 1): Buffer is full\n          WrOff >  RdOff:       Free space includes wrap-around\n          WrOff <  RdOff:       Used space includes wrap-around\n          (WrOff == (SizeOfBuffer - 1)) && (RdOff == 0):\n                                Buffer full and wrap-around after next byte\n\n\n----------------------------------------------------------------------\n*/\n\n#include \"SEGGER_RTT.h\"\n\n#include <string.h>                 // for memcpy\n\n/*********************************************************************\n*\n*       Configuration, default values\n*\n**********************************************************************\n*/\n\n#if SEGGER_RTT_CPU_CACHE_LINE_SIZE\n  #ifdef SEGGER_RTT_CB_ALIGN\n    #error \"Custom SEGGER_RTT_CB_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0\"\n  #endif\n  #ifdef SEGGER_RTT_BUFFER_ALIGN\n    #error \"Custom SEGGER_RTT_BUFFER_ALIGN() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0\"\n  #endif\n  #ifdef SEGGER_RTT_PUT_CB_SECTION\n    #error \"Custom SEGGER_RTT_PUT_CB_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0\"\n  #endif\n  #ifdef SEGGER_RTT_PUT_BUFFER_SECTION\n    #error \"Custom SEGGER_RTT_PUT_BUFFER_SECTION() is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0\"\n  #endif\n  #ifdef SEGGER_RTT_BUFFER_ALIGNMENT\n    #error \"Custom SEGGER_RTT_BUFFER_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0\"\n  #endif\n  #ifdef SEGGER_RTT_ALIGNMENT\n    #error \"Custom SEGGER_RTT_ALIGNMENT is not supported for SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0\"\n  #endif\n#endif\n\n#ifndef   BUFFER_SIZE_UP\n  #define BUFFER_SIZE_UP                                  1024  // Size of the buffer for terminal output of target, up to host\n#endif\n\n#ifndef   BUFFER_SIZE_DOWN\n  #define BUFFER_SIZE_DOWN                                16    // Size of the buffer for terminal input to target from host (Usually keyboard input)\n#endif\n\n#ifndef   SEGGER_RTT_MAX_NUM_UP_BUFFERS\n  #define SEGGER_RTT_MAX_NUM_UP_BUFFERS                    2    // Number of up-buffers (T->H) available on this target\n#endif\n\n#ifndef   SEGGER_RTT_MAX_NUM_DOWN_BUFFERS\n  #define SEGGER_RTT_MAX_NUM_DOWN_BUFFERS                  2    // Number of down-buffers (H->T) available on this target\n#endif\n\n#ifndef SEGGER_RTT_BUFFER_SECTION\n  #if defined(SEGGER_RTT_SECTION)\n    #define SEGGER_RTT_BUFFER_SECTION SEGGER_RTT_SECTION\n  #endif\n#endif\n\n#ifndef   SEGGER_RTT_ALIGNMENT\n  #define SEGGER_RTT_ALIGNMENT                            SEGGER_RTT_CPU_CACHE_LINE_SIZE\n#endif\n\n#ifndef   SEGGER_RTT_BUFFER_ALIGNMENT\n  #define SEGGER_RTT_BUFFER_ALIGNMENT                     SEGGER_RTT_CPU_CACHE_LINE_SIZE\n#endif\n\n#ifndef   SEGGER_RTT_MODE_DEFAULT\n  #define SEGGER_RTT_MODE_DEFAULT                         SEGGER_RTT_MODE_NO_BLOCK_SKIP\n#endif\n\n#ifndef   SEGGER_RTT_LOCK\n  #define SEGGER_RTT_LOCK()\n#endif\n\n#ifndef   SEGGER_RTT_UNLOCK\n  #define SEGGER_RTT_UNLOCK()\n#endif\n\n#ifndef   STRLEN\n  #define STRLEN(a)                                       strlen((a))\n#endif\n\n#ifndef   STRCPY\n  #define STRCPY(pDest, pSrc)                             strcpy((pDest), (pSrc))\n#endif\n\n#ifndef   SEGGER_RTT_MEMCPY_USE_BYTELOOP\n  #define SEGGER_RTT_MEMCPY_USE_BYTELOOP                  0\n#endif\n\n#ifndef   SEGGER_RTT_MEMCPY\n  #ifdef  MEMCPY\n    #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes)      MEMCPY((pDest), (pSrc), (NumBytes))\n  #else\n    #define SEGGER_RTT_MEMCPY(pDest, pSrc, NumBytes)      memcpy((pDest), (pSrc), (NumBytes))\n  #endif\n#endif\n\n#ifndef   MIN\n  #define MIN(a, b)                                       (((a) < (b)) ? (a) : (b))\n#endif\n\n#ifndef   MAX\n  #define MAX(a, b)                                       (((a) > (b)) ? (a) : (b))\n#endif\n//\n// For some environments, NULL may not be defined until certain headers are included\n//\n#ifndef NULL\n  #define NULL                                            0\n#endif\n\n/*********************************************************************\n*\n*       Defines, fixed\n*\n**********************************************************************\n*/\n#ifdef __GNUC__\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#pragma GCC diagnostic ignored \"-Wcast-align\"\n#endif\n\n#if (defined __ICCARM__) || (defined __ICCRX__)\n  #define RTT_PRAGMA(P) _Pragma(#P)\n#endif\n\n#if SEGGER_RTT_ALIGNMENT || SEGGER_RTT_BUFFER_ALIGNMENT\n  #if ((defined __GNUC__) || (defined __clang__))\n    #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment)))\n  #elif (defined __ICCARM__) || (defined __ICCRX__)\n    #define PRAGMA(A) _Pragma(#A)\n#define SEGGER_RTT_ALIGN(Var, Alignment) RTT_PRAGMA(data_alignment=Alignment) \\\n                                  Var\n  #elif (defined __CC_ARM)\n    #define SEGGER_RTT_ALIGN(Var, Alignment) Var __attribute__ ((aligned (Alignment)))\n  #else\n    #error \"Alignment not supported for this compiler.\"\n  #endif\n#else\n  #define SEGGER_RTT_ALIGN(Var, Alignment) Var\n#endif\n\n#if defined(SEGGER_RTT_SECTION) || defined (SEGGER_RTT_BUFFER_SECTION)\n  #if ((defined __GNUC__) || (defined __clang__))\n    #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section))) Var\n  #elif (defined __ICCARM__) || (defined __ICCRX__)\n#define SEGGER_RTT_PUT_SECTION(Var, Section) RTT_PRAGMA(location=Section) \\\n                                        Var\n  #elif (defined __CC_ARM)\n    #define SEGGER_RTT_PUT_SECTION(Var, Section) __attribute__ ((section (Section), zero_init))  Var\n  #else\n    #error \"Section placement not supported for this compiler.\"\n  #endif\n#else\n  #define SEGGER_RTT_PUT_SECTION(Var, Section) Var\n#endif\n\n#if SEGGER_RTT_ALIGNMENT\n  #define SEGGER_RTT_CB_ALIGN(Var)  SEGGER_RTT_ALIGN(Var, SEGGER_RTT_ALIGNMENT)\n#else\n  #define SEGGER_RTT_CB_ALIGN(Var)  Var\n#endif\n\n#if SEGGER_RTT_BUFFER_ALIGNMENT\n  #define SEGGER_RTT_BUFFER_ALIGN(Var)  SEGGER_RTT_ALIGN(Var, SEGGER_RTT_BUFFER_ALIGNMENT)\n#else\n  #define SEGGER_RTT_BUFFER_ALIGN(Var)  Var\n#endif\n\n\n#if defined(SEGGER_RTT_SECTION)\n  #define SEGGER_RTT_PUT_CB_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_SECTION)\n#else\n  #define SEGGER_RTT_PUT_CB_SECTION(Var) Var\n#endif\n\n#if defined(SEGGER_RTT_BUFFER_SECTION)\n  #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) SEGGER_RTT_PUT_SECTION(Var, SEGGER_RTT_BUFFER_SECTION)\n#else\n  #define SEGGER_RTT_PUT_BUFFER_SECTION(Var) Var\n#endif\n\n/*********************************************************************\n*\n*       Static const data\n*\n**********************************************************************\n*/\n\nstatic const unsigned char _aTerminalId[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };\n\n/*********************************************************************\n*\n*       Static data\n*\n**********************************************************************\n*/\n\n//\n// RTT Control Block and allocate buffers for channel 0\n//\n#if SEGGER_RTT_CPU_CACHE_LINE_SIZE\n  #if ((defined __GNUC__) || (defined __clang__))\n    SEGGER_RTT_CB _SEGGER_RTT                                                             __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE)));\n    static char   _acUpBuffer  [SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_UP)]   __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE)));\n    static char   _acDownBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_DOWN)] __attribute__ ((aligned (SEGGER_RTT_CPU_CACHE_LINE_SIZE)));\n  #elif (defined __ICCARM__)\n    #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE\n    SEGGER_RTT_CB _SEGGER_RTT;\n    #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE\n    static char   _acUpBuffer  [SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_UP)];\n    #pragma data_alignment=SEGGER_RTT_CPU_CACHE_LINE_SIZE\n    static char   _acDownBuffer[SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(BUFFER_SIZE_DOWN)];\n  #else\n    #error \"Don't know how to place _SEGGER_RTT, _acUpBuffer, _acDownBuffer cache-line aligned\"\n  #endif\n#else\n  SEGGER_RTT_PUT_CB_SECTION(SEGGER_RTT_CB_ALIGN(SEGGER_RTT_CB _SEGGER_RTT));\n  SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acUpBuffer  [BUFFER_SIZE_UP]));\n  SEGGER_RTT_PUT_BUFFER_SECTION(SEGGER_RTT_BUFFER_ALIGN(static char _acDownBuffer[BUFFER_SIZE_DOWN]));\n#endif\n\nstatic unsigned char _ActiveTerminal;\n\n/*********************************************************************\n*\n*       Static functions\n*\n**********************************************************************\n*/\n\n/*********************************************************************\n*\n*       _DoInit()\n*\n*  Function description\n*    Initializes the control block an buffers.\n*\n*  Notes\n*    (1) May only be called via INIT() to avoid overriding settings.\n*        The only exception is SEGGER_RTT_Init(), to make an intentional override possible.\n*/\n  #define INIT()                                                                             \\\n    do {                                                                                     \\\n      volatile SEGGER_RTT_CB* pRTTCBInit;                                                    \\\n      pRTTCBInit = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF); \\\n      if (pRTTCBInit->acID[0] != 'S') {                                                      \\\n        _DoInit();                                                                           \\\n      }                                                                                      \\\n    } while (0)\n\nstatic void _DoInit(void) {\n  volatile SEGGER_RTT_CB* p;   // Volatile to make sure that compiler cannot change the order of accesses to the control block\n  static const char _aInitStr[] = \"\\0\\0\\0\\0\\0\\0TTR REGGES\";  // Init complete ID string to make sure that things also work if RTT is linked to a no-init memory area\n  unsigned i;\n  //\n  // Initialize control block\n  //\n  p                     = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access control block uncached so that nothing in the cache ever becomes dirty and all changes are visible in HW directly\n  memset((SEGGER_RTT_CB*)p, 0, sizeof(_SEGGER_RTT));         // Make sure that the RTT CB is always zero initialized.\n  p->MaxNumUpBuffers    = SEGGER_RTT_MAX_NUM_UP_BUFFERS;\n  p->MaxNumDownBuffers  = SEGGER_RTT_MAX_NUM_DOWN_BUFFERS;\n  //\n  // Initialize up buffer 0\n  //\n  p->aUp[0].sName         = \"Terminal\";\n  p->aUp[0].pBuffer       = _acUpBuffer;\n  p->aUp[0].SizeOfBuffer  = BUFFER_SIZE_UP;\n  p->aUp[0].RdOff         = 0u;\n  p->aUp[0].WrOff         = 0u;\n  p->aUp[0].Flags         = SEGGER_RTT_MODE_DEFAULT;\n  //\n  // Initialize down buffer 0\n  //\n  p->aDown[0].sName         = \"Terminal\";\n  p->aDown[0].pBuffer       = _acDownBuffer;\n  p->aDown[0].SizeOfBuffer  = BUFFER_SIZE_DOWN;\n  p->aDown[0].RdOff         = 0u;\n  p->aDown[0].WrOff         = 0u;\n  p->aDown[0].Flags         = SEGGER_RTT_MODE_DEFAULT;\n  //\n  // Finish initialization of the control block.\n  // Copy Id string backwards to make sure that \"SEGGER RTT\" is not found in initializer memory (usually flash),\n  // as this would cause J-Link to \"find\" the control block at a wrong address.\n  //\n  RTT__DMB();                       // Force order of memory accesses for cores that may perform out-of-order memory accesses\n  for (i = 0; i < sizeof(_aInitStr) - 1; ++i) {\n    p->acID[i] = _aInitStr[sizeof(_aInitStr) - 2 - i];  // Skip terminating \\0 at the end of the array\n  }\n  RTT__DMB();                       // Force order of memory accesses for cores that may perform out-of-order memory accesses\n}\n\n/*********************************************************************\n*\n*       _WriteBlocking()\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT ring buffer\n*    and updates the associated write pointer which is periodically\n*    read by the host.\n*    The caller is responsible for managing the write chunk sizes as\n*    _WriteBlocking() will block until all data has been posted successfully.\n*\n*  Parameters\n*    pRing        Ring buffer to post to.\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*\n*  Return value\n*    >= 0 - Number of bytes written into buffer.\n*/\nstatic unsigned _WriteBlocking(SEGGER_RTT_BUFFER_UP* pRing, const char* pBuffer, unsigned NumBytes) {\n  unsigned NumBytesToWrite;\n  unsigned NumBytesWritten;\n  unsigned RdOff;\n  unsigned WrOff;\n  volatile char* pDst;\n  //\n  // Write data to buffer and handle wrap-around if necessary\n  //\n  NumBytesWritten = 0u;\n  WrOff = pRing->WrOff;\n  do {\n    RdOff = pRing->RdOff;                         // May be changed by host (debug probe) in the meantime\n    if (RdOff > WrOff) {\n      NumBytesToWrite = RdOff - WrOff - 1u;\n    } else {\n      NumBytesToWrite = pRing->SizeOfBuffer - (WrOff - RdOff + 1u);\n    }\n    NumBytesToWrite = MIN(NumBytesToWrite, (pRing->SizeOfBuffer - WrOff));      // Number of bytes that can be written until buffer wrap-around\n    NumBytesToWrite = MIN(NumBytesToWrite, NumBytes);\n    pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF;\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n    NumBytesWritten += NumBytesToWrite;\n    NumBytes        -= NumBytesToWrite;\n    WrOff           += NumBytesToWrite;\n    while (NumBytesToWrite--) {\n      *pDst++ = *pBuffer++;\n    };\n#else\n    SEGGER_RTT_MEMCPY((void*)pDst, pBuffer, NumBytesToWrite);\n    NumBytesWritten += NumBytesToWrite;\n    pBuffer         += NumBytesToWrite;\n    NumBytes        -= NumBytesToWrite;\n    WrOff           += NumBytesToWrite;\n#endif\n    if (WrOff == pRing->SizeOfBuffer) {\n      WrOff = 0u;\n    }\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    pRing->WrOff = WrOff;\n  } while (NumBytes);\n  return NumBytesWritten;\n}\n\n/*********************************************************************\n*\n*       _WriteNoCheck()\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT ring buffer\n*    and updates the associated write pointer which is periodically\n*    read by the host.\n*    It is callers responsibility to make sure data actually fits in buffer.\n*\n*  Parameters\n*    pRing        Ring buffer to post to.\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*\n*  Notes\n*    (1) If there might not be enough space in the \"Up\"-buffer, call _WriteBlocking\n*/\nstatic void _WriteNoCheck(SEGGER_RTT_BUFFER_UP* pRing, const char* pData, unsigned NumBytes) {\n  unsigned NumBytesAtOnce;\n  unsigned WrOff;\n  unsigned Rem;\n  volatile char* pDst;\n\n  WrOff = pRing->WrOff;\n  Rem = pRing->SizeOfBuffer - WrOff;\n  if (Rem > NumBytes) {\n    //\n    // All data fits before wrap around\n    //\n    pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF;\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n    WrOff += NumBytes;\n    while (NumBytes--) {\n      *pDst++ = *pData++;\n    };\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    pRing->WrOff = WrOff;\n#else\n    SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes);\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    pRing->WrOff = WrOff + NumBytes;\n#endif\n  } else {\n    //\n    // We reach the end of the buffer, so need to wrap around\n    //\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n    pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF;\n    NumBytesAtOnce = Rem;\n    while (NumBytesAtOnce--) {\n      *pDst++ = *pData++;\n    };\n    pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF;\n    NumBytesAtOnce = NumBytes - Rem;\n    while (NumBytesAtOnce--) {\n      *pDst++ = *pData++;\n    };\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    pRing->WrOff = NumBytes - Rem;\n#else\n    NumBytesAtOnce = Rem;\n    pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF;\n    SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytesAtOnce);\n    NumBytesAtOnce = NumBytes - Rem;\n    pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF;\n    SEGGER_RTT_MEMCPY((void*)pDst, pData + Rem, NumBytesAtOnce);\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    pRing->WrOff = NumBytesAtOnce;\n#endif\n  }\n}\n\n/*********************************************************************\n*\n*       _PostTerminalSwitch()\n*\n*  Function description\n*    Switch terminal to the given terminal ID.  It is the caller's\n*    responsibility to ensure the terminal ID is correct and there is\n*    enough space in the buffer for this to complete successfully.\n*\n*  Parameters\n*    pRing        Ring buffer to post to.\n*    TerminalId   Terminal ID to switch to.\n*/\nstatic void _PostTerminalSwitch(SEGGER_RTT_BUFFER_UP* pRing, unsigned char TerminalId) {\n  unsigned char ac[2];\n\n  ac[0] = 0xFFu;\n  ac[1] = _aTerminalId[TerminalId];  // Caller made already sure that TerminalId does not exceed our terminal limit\n  _WriteBlocking(pRing, (const char*)ac, 2u);\n}\n\n/*********************************************************************\n*\n*       _GetAvailWriteSpace()\n*\n*  Function description\n*    Returns the number of bytes that can be written to the ring\n*    buffer without blocking.\n*\n*  Parameters\n*    pRing        Ring buffer to check.\n*\n*  Return value\n*    Number of bytes that are free in the buffer.\n*/\nstatic unsigned _GetAvailWriteSpace(SEGGER_RTT_BUFFER_UP* pRing) {\n  unsigned RdOff;\n  unsigned WrOff;\n  unsigned r;\n  //\n  // Avoid warnings regarding volatile access order.  It's not a problem\n  // in this case, but dampen compiler enthusiasm.\n  //\n  RdOff = pRing->RdOff;\n  WrOff = pRing->WrOff;\n  if (RdOff <= WrOff) {\n    r = pRing->SizeOfBuffer - 1u - WrOff + RdOff;\n  } else {\n    r = RdOff - WrOff - 1u;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       Public code\n*\n**********************************************************************\n*/\n\n/*********************************************************************\n*\n*       SEGGER_RTT_ReadUpBufferNoLock()\n*\n*  Function description\n*    Reads characters from SEGGER real-time-terminal control block\n*    which have been previously stored by the application.\n*    Do not lock against interrupts and multiple access.\n*    Used to do the same operation that J-Link does, to transfer\n*    RTT data via other channels, such as TCP/IP or UART.\n*\n*  Parameters\n*    BufferIndex  Index of Up-buffer to be used.\n*    pBuffer      Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to.\n*    BufferSize   Size of the target application buffer.\n*\n*  Return value\n*    Number of bytes that have been read.\n*\n*  Additional information\n*    This function must not be called when J-Link might also do RTT.\n*/\nunsigned SEGGER_RTT_ReadUpBufferNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) {\n  unsigned                NumBytesRem;\n  unsigned                NumBytesRead;\n  unsigned                RdOff;\n  unsigned                WrOff;\n  unsigned char*          pBuffer;\n  SEGGER_RTT_BUFFER_UP*   pRing;\n  volatile char*          pSrc;\n\n  INIT();\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  pBuffer = (unsigned char*)pData;\n  RdOff = pRing->RdOff;\n  WrOff = pRing->WrOff;\n  NumBytesRead = 0u;\n  //\n  // Read from current read position to wrap-around of buffer, first\n  //\n  if (RdOff > WrOff) {\n    NumBytesRem = pRing->SizeOfBuffer - RdOff;\n    NumBytesRem = MIN(NumBytesRem, BufferSize);\n    pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF;\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n    NumBytesRead += NumBytesRem;\n    BufferSize   -= NumBytesRem;\n    RdOff        += NumBytesRem;\n    while (NumBytesRem--) {\n      *pBuffer++ = *pSrc++;\n    };\n#else\n    SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem);\n    NumBytesRead += NumBytesRem;\n    pBuffer      += NumBytesRem;\n    BufferSize   -= NumBytesRem;\n    RdOff        += NumBytesRem;\n#endif\n    //\n    // Handle wrap-around of buffer\n    //\n    if (RdOff == pRing->SizeOfBuffer) {\n      RdOff = 0u;\n    }\n  }\n  //\n  // Read remaining items of buffer\n  //\n  NumBytesRem = WrOff - RdOff;\n  NumBytesRem = MIN(NumBytesRem, BufferSize);\n  if (NumBytesRem > 0u) {\n    pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF;\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n    NumBytesRead += NumBytesRem;\n    BufferSize   -= NumBytesRem;\n    RdOff        += NumBytesRem;\n    while (NumBytesRem--) {\n      *pBuffer++ = *pSrc++;\n    };\n#else\n    SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem);\n    NumBytesRead += NumBytesRem;\n    pBuffer      += NumBytesRem;\n    BufferSize   -= NumBytesRem;\n    RdOff        += NumBytesRem;\n#endif\n  }\n  //\n  // Update read offset of buffer\n  //\n  if (NumBytesRead) {\n    pRing->RdOff = RdOff;\n  }\n  //\n  return NumBytesRead;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_ReadNoLock()\n*\n*  Function description\n*    Reads characters from SEGGER real-time-terminal control block\n*    which have been previously stored by the host.\n*    Do not lock against interrupts and multiple access.\n*\n*  Parameters\n*    BufferIndex  Index of Down-buffer to be used (e.g. 0 for \"Terminal\").\n*    pBuffer      Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to.\n*    BufferSize   Size of the target application buffer.\n*\n*  Return value\n*    Number of bytes that have been read.\n*/\nunsigned SEGGER_RTT_ReadNoLock(unsigned BufferIndex, void* pData, unsigned BufferSize) {\n  unsigned                NumBytesRem;\n  unsigned                NumBytesRead;\n  unsigned                RdOff;\n  unsigned                WrOff;\n  unsigned char*          pBuffer;\n  SEGGER_RTT_BUFFER_DOWN* pRing;\n  volatile char*          pSrc;\n  //\n  INIT();\n  pRing = (SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  pBuffer = (unsigned char*)pData;\n  RdOff = pRing->RdOff;\n  WrOff = pRing->WrOff;\n  NumBytesRead = 0u;\n  //\n  // Read from current read position to wrap-around of buffer, first\n  //\n  if (RdOff > WrOff) {\n    NumBytesRem = pRing->SizeOfBuffer - RdOff;\n    NumBytesRem = MIN(NumBytesRem, BufferSize);\n    pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF;\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n    NumBytesRead += NumBytesRem;\n    BufferSize   -= NumBytesRem;\n    RdOff        += NumBytesRem;\n    while (NumBytesRem--) {\n      *pBuffer++ = *pSrc++;\n    };\n#else\n    SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem);\n    NumBytesRead += NumBytesRem;\n    pBuffer      += NumBytesRem;\n    BufferSize   -= NumBytesRem;\n    RdOff        += NumBytesRem;\n#endif\n    //\n    // Handle wrap-around of buffer\n    //\n    if (RdOff == pRing->SizeOfBuffer) {\n      RdOff = 0u;\n    }\n  }\n  //\n  // Read remaining items of buffer\n  //\n  NumBytesRem = WrOff - RdOff;\n  NumBytesRem = MIN(NumBytesRem, BufferSize);\n  if (NumBytesRem > 0u) {\n    pSrc = (pRing->pBuffer + RdOff) + SEGGER_RTT_UNCACHED_OFF;\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n    NumBytesRead += NumBytesRem;\n    BufferSize   -= NumBytesRem;\n    RdOff        += NumBytesRem;\n    while (NumBytesRem--) {\n      *pBuffer++ = *pSrc++;\n    };\n#else\n    SEGGER_RTT_MEMCPY(pBuffer, (void*)pSrc, NumBytesRem);\n    NumBytesRead += NumBytesRem;\n    pBuffer      += NumBytesRem;\n    BufferSize   -= NumBytesRem;\n    RdOff        += NumBytesRem;\n#endif\n  }\n  if (NumBytesRead) {\n    pRing->RdOff = RdOff;\n  }\n  //\n  return NumBytesRead;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_ReadUpBuffer\n*\n*  Function description\n*    Reads characters from SEGGER real-time-terminal control block\n*    which have been previously stored by the application.\n*    Used to do the same operation that J-Link does, to transfer\n*    RTT data via other channels, such as TCP/IP or UART.\n*\n*  Parameters\n*    BufferIndex  Index of Up-buffer to be used.\n*    pBuffer      Pointer to buffer provided by target application, to copy characters from RTT-up-buffer to.\n*    BufferSize   Size of the target application buffer.\n*\n*  Return value\n*    Number of bytes that have been read.\n*\n*  Additional information\n*    This function must not be called when J-Link might also do RTT.\n*    This function locks against all other RTT operations. I.e. during\n*    the read operation, writing is also locked.\n*    If only one consumer reads from the up buffer,\n*    call sEGGER_RTT_ReadUpBufferNoLock() instead.\n*/\nunsigned SEGGER_RTT_ReadUpBuffer(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) {\n  unsigned NumBytesRead;\n\n  SEGGER_RTT_LOCK();\n  //\n  // Call the non-locking read function\n  //\n  NumBytesRead = SEGGER_RTT_ReadUpBufferNoLock(BufferIndex, pBuffer, BufferSize);\n  //\n  // Finish up.\n  //\n  SEGGER_RTT_UNLOCK();\n  //\n  return NumBytesRead;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_Read\n*\n*  Function description\n*    Reads characters from SEGGER real-time-terminal control block\n*    which have been previously stored by the host.\n*\n*  Parameters\n*    BufferIndex  Index of Down-buffer to be used (e.g. 0 for \"Terminal\").\n*    pBuffer      Pointer to buffer provided by target application, to copy characters from RTT-down-buffer to.\n*    BufferSize   Size of the target application buffer.\n*\n*  Return value\n*    Number of bytes that have been read.\n*/\nunsigned SEGGER_RTT_Read(unsigned BufferIndex, void* pBuffer, unsigned BufferSize) {\n  unsigned NumBytesRead;\n\n  SEGGER_RTT_LOCK();\n  //\n  // Call the non-locking read function\n  //\n  NumBytesRead = SEGGER_RTT_ReadNoLock(BufferIndex, pBuffer, BufferSize);\n  //\n  // Finish up.\n  //\n  SEGGER_RTT_UNLOCK();\n  //\n  return NumBytesRead;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_WriteWithOverwriteNoLock\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT\n*    control block.\n*    SEGGER_RTT_WriteWithOverwriteNoLock does not lock the application\n*    and overwrites data if the data does not fit into the buffer.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*\n*  Notes\n*    (1) If there is not enough space in the \"Up\"-buffer, data is overwritten.\n*    (2) For performance reasons this function does not call Init()\n*        and may only be called after RTT has been initialized.\n*        Either by calling SEGGER_RTT_Init() or calling another RTT API function first.\n*    (3) Do not use SEGGER_RTT_WriteWithOverwriteNoLock if a J-Link\n*        connection reads RTT data.\n*/\nvoid SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {\n  const char*           pData;\n  SEGGER_RTT_BUFFER_UP* pRing;\n  unsigned              Avail;\n  volatile char*        pDst;\n  //\n  // Get \"to-host\" ring buffer and copy some elements into local variables.\n  //\n  pData = (const char *)pBuffer;\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  //\n  // Check if we will overwrite data and need to adjust the RdOff.\n  //\n  if (pRing->WrOff == pRing->RdOff) {\n    Avail = pRing->SizeOfBuffer - 1u;\n  } else if ( pRing->WrOff < pRing->RdOff) {\n    Avail = pRing->RdOff - pRing->WrOff - 1u;\n  } else {\n    Avail = pRing->RdOff - pRing->WrOff - 1u + pRing->SizeOfBuffer;\n  }\n  if (NumBytes > Avail) {\n    pRing->RdOff += (NumBytes - Avail);\n    while (pRing->RdOff >= pRing->SizeOfBuffer) {\n      pRing->RdOff -= pRing->SizeOfBuffer;\n    }\n  }\n  //\n  // Write all data, no need to check the RdOff, but possibly handle multiple wrap-arounds\n  //\n  Avail = pRing->SizeOfBuffer - pRing->WrOff;\n  do {\n    if (Avail > NumBytes) {\n      //\n      // Last round\n      //\n      pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF;\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n      Avail = NumBytes;\n      while (NumBytes--) {\n        *pDst++ = *pData++;\n      };\n      RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n      pRing->WrOff += Avail;\n#else\n      SEGGER_RTT_MEMCPY((void*)pDst, pData, NumBytes);\n      RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n      pRing->WrOff += NumBytes;\n#endif\n      break;\n    } else {\n      //\n      //  Wrap-around necessary, write until wrap-around and reset WrOff\n      //\n      pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF;\n#if SEGGER_RTT_MEMCPY_USE_BYTELOOP\n      NumBytes -= Avail;\n      while (Avail--) {\n        *pDst++ = *pData++;\n      };\n      RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n      pRing->WrOff = 0;\n#else\n      SEGGER_RTT_MEMCPY((void*)pDst, pData, Avail);\n      pData += Avail;\n      RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n      pRing->WrOff = 0;\n      NumBytes -= Avail;\n#endif\n      Avail = (pRing->SizeOfBuffer - 1);\n    }\n  } while (NumBytes);\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_WriteSkipNoLock\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT\n*    control block which is then read by the host.\n*    SEGGER_RTT_WriteSkipNoLock does not lock the application and\n*    skips all data, if the data does not fit into the buffer.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*                 MUST be > 0!!!\n*                 This is done for performance reasons, so no initial check has do be done.\n*\n*  Return value\n*    1: Data has been copied\n*    0: No space, data has not been copied\n*\n*  Notes\n*    (1) If there is not enough space in the \"Up\"-buffer, all data is dropped.\n*    (2) For performance reasons this function does not call Init()\n*        and may only be called after RTT has been initialized.\n*        Either by calling SEGGER_RTT_Init() or calling another RTT API function first.\n*/\n#if (RTT_USE_ASM == 0)\nunsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {\n  const char*           pData;\n  SEGGER_RTT_BUFFER_UP* pRing;\n  unsigned              Avail;\n  unsigned              RdOff;\n  unsigned              WrOff;\n  unsigned              Rem;\n  volatile char*        pDst;\n  //\n  // Cases:\n  //   1) RdOff <= WrOff => Space until wrap-around is sufficient\n  //   2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks)\n  //   3) RdOff <  WrOff => No space in buf\n  //   4) RdOff >  WrOff => Space is sufficient\n  //   5) RdOff >  WrOff => No space in buf\n  //\n  // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough\n  //\n  pData = (const char *)pBuffer;\n  pRing = (SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  RdOff = pRing->RdOff;\n  WrOff = pRing->WrOff;\n  pDst = (pRing->pBuffer + WrOff) + SEGGER_RTT_UNCACHED_OFF;\n  if (RdOff <= WrOff) {                                 // Case 1), 2) or 3)\n    Avail = pRing->SizeOfBuffer - WrOff - 1u;           // Space until wrap-around (assume 1 byte not usable for case that RdOff == 0)\n    if (Avail >= NumBytes) {                            // Case 1)?\n      memcpy((void*)pDst, pData, NumBytes);\n      RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n      pRing->WrOff = WrOff + NumBytes;\n      return 1;\n    }\n    Avail += RdOff;                                     // Space incl. wrap-around\n    if (Avail >= NumBytes) {                            // Case 2? => If not, we have case 3) (does not fit)\n      Rem = pRing->SizeOfBuffer - WrOff;                // Space until end of buffer\n      memcpy((void*)pDst, pData, Rem);                  // Copy 1st chunk\n      NumBytes -= Rem;\n      //\n      // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used\n      // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element\n      // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks\n      // Therefore, check if 2nd memcpy is necessary at all\n      //\n      if (NumBytes) {\n        pDst = pRing->pBuffer + SEGGER_RTT_UNCACHED_OFF;\n        memcpy((void*)pDst, pData + Rem, NumBytes);\n      }\n      RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n      pRing->WrOff = NumBytes;\n      return 1;\n    }\n  } else {                                             // Potential case 4)\n    Avail = RdOff - WrOff - 1u;\n    if (Avail >= NumBytes) {                           // Case 4)? => If not, we have case 5) (does not fit)\n      memcpy((void*)pDst, pData, NumBytes);\n      RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n      pRing->WrOff = WrOff + NumBytes;\n      return 1;\n    }\n  }\n  return 0;     // No space in buffer\n}\n#endif\n\n/*********************************************************************\n*\n*       SEGGER_RTT_WriteDownBufferNoLock\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT\n*    control block inside a <Down> buffer.\n*    SEGGER_RTT_WriteDownBufferNoLock does not lock the application.\n*    Used to do the same operation that J-Link does, to transfer\n*    RTT data from other channels, such as TCP/IP or UART.\n*\n*  Parameters\n*    BufferIndex  Index of \"Down\"-buffer to be used.\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*\n*  Return value\n*    Number of bytes which have been stored in the \"Down\"-buffer.\n*\n*  Notes\n*    (1) Data is stored according to buffer flags.\n*    (2) For performance reasons this function does not call Init()\n*        and may only be called after RTT has been initialized.\n*        Either by calling SEGGER_RTT_Init() or calling another RTT API function first.\n*\n*  Additional information\n*    This function must not be called when J-Link might also do RTT.\n*/\nunsigned SEGGER_RTT_WriteDownBufferNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {\n  unsigned                Status;\n  unsigned                Avail;\n  const char*             pData;\n  SEGGER_RTT_BUFFER_UP*   pRing;\n  //\n  // Get \"to-target\" ring buffer.\n  // It is save to cast that to a \"to-host\" buffer. Up and Down buffer differ in volatility of offsets that might be modified by J-Link.\n  //\n  pData = (const char *)pBuffer;\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  //\n  // How we output depends upon the mode...\n  //\n  switch (pRing->Flags) {\n  case SEGGER_RTT_MODE_NO_BLOCK_SKIP:\n    //\n    // If we are in skip mode and there is no space for the whole\n    // of this output, don't bother.\n    //\n    Avail = _GetAvailWriteSpace(pRing);\n    if (Avail < NumBytes) {\n      Status = 0u;\n    } else {\n      Status = NumBytes;\n      _WriteNoCheck(pRing, pData, NumBytes);\n    }\n    break;\n  case SEGGER_RTT_MODE_NO_BLOCK_TRIM:\n    //\n    // If we are in trim mode, trim to what we can output without blocking.\n    //\n    Avail = _GetAvailWriteSpace(pRing);\n    Status = Avail < NumBytes ? Avail : NumBytes;\n    _WriteNoCheck(pRing, pData, Status);\n    break;\n  case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL:\n    //\n    // If we are in blocking mode, output everything.\n    //\n    Status = _WriteBlocking(pRing, pData, NumBytes);\n    break;\n  default:\n    Status = 0u;\n    break;\n  }\n  //\n  // Finish up.\n  //\n  return Status;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_WriteNoLock\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT\n*    control block which is then read by the host.\n*    SEGGER_RTT_WriteNoLock does not lock the application.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*\n*  Return value\n*    Number of bytes which have been stored in the \"Up\"-buffer.\n*\n*  Notes\n*    (1) Data is stored according to buffer flags.\n*    (2) For performance reasons this function does not call Init()\n*        and may only be called after RTT has been initialized.\n*        Either by calling SEGGER_RTT_Init() or calling another RTT API function first.\n*/\nunsigned SEGGER_RTT_WriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {\n  unsigned              Status;\n  unsigned              Avail;\n  const char*           pData;\n  SEGGER_RTT_BUFFER_UP* pRing;\n  //\n  // Get \"to-host\" ring buffer.\n  //\n  pData = (const char *)pBuffer;\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  //\n  // How we output depends upon the mode...\n  //\n  switch (pRing->Flags) {\n  case SEGGER_RTT_MODE_NO_BLOCK_SKIP:\n    //\n    // If we are in skip mode and there is no space for the whole\n    // of this output, don't bother.\n    //\n    Avail = _GetAvailWriteSpace(pRing);\n    if (Avail < NumBytes) {\n      Status = 0u;\n    } else {\n      Status = NumBytes;\n      _WriteNoCheck(pRing, pData, NumBytes);\n    }\n    break;\n  case SEGGER_RTT_MODE_NO_BLOCK_TRIM:\n    //\n    // If we are in trim mode, trim to what we can output without blocking.\n    //\n    Avail = _GetAvailWriteSpace(pRing);\n    Status = Avail < NumBytes ? Avail : NumBytes;\n    _WriteNoCheck(pRing, pData, Status);\n    break;\n  case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL:\n    //\n    // If we are in blocking mode, output everything.\n    //\n    Status = _WriteBlocking(pRing, pData, NumBytes);\n    break;\n  default:\n    Status = 0u;\n    break;\n  }\n  //\n  // Finish up.\n  //\n  return Status;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_WriteDownBuffer\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT control block in a <Down> buffer.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*\n*  Return value\n*    Number of bytes which have been stored in the \"Down\"-buffer.\n*\n*  Notes\n*    (1) Data is stored according to buffer flags.\n*\n*  Additional information\n*    This function must not be called when J-Link might also do RTT.\n*    This function locks against all other RTT operations. I.e. during\n*    the write operation, writing from the application is also locked.\n*    If only one consumer writes to the down buffer,\n*    call SEGGER_RTT_WriteDownBufferNoLock() instead.\n*/\nunsigned SEGGER_RTT_WriteDownBuffer(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {\n  unsigned Status;\n\n  INIT();\n  SEGGER_RTT_LOCK();\n  Status = SEGGER_RTT_WriteDownBufferNoLock(BufferIndex, pBuffer, NumBytes);  // Call the non-locking write function\n  SEGGER_RTT_UNLOCK();\n  return Status;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_Write\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT\n*    control block which is then read by the host.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*\n*  Return value\n*    Number of bytes which have been stored in the \"Up\"-buffer.\n*\n*  Notes\n*    (1) Data is stored according to buffer flags.\n*/\nunsigned SEGGER_RTT_Write(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes) {\n  unsigned Status;\n\n  INIT();\n  SEGGER_RTT_LOCK();\n  Status = SEGGER_RTT_WriteNoLock(BufferIndex, pBuffer, NumBytes);  // Call the non-locking write function\n  SEGGER_RTT_UNLOCK();\n  return Status;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_WriteString\n*\n*  Function description\n*    Stores string in SEGGER RTT control block.\n*    This data is read by the host.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    s            Pointer to string.\n*\n*  Return value\n*    Number of bytes which have been stored in the \"Up\"-buffer.\n*\n*  Notes\n*    (1) Data is stored according to buffer flags.\n*    (2) String passed to this function has to be \\0 terminated\n*    (3) \\0 termination character is *not* stored in RTT buffer\n*/\nunsigned SEGGER_RTT_WriteString(unsigned BufferIndex, const char* s) {\n  unsigned Len;\n\n  Len = STRLEN(s);\n  return SEGGER_RTT_Write(BufferIndex, s, Len);\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_PutCharSkipNoLock\n*\n*  Function description\n*    Stores a single character/byte in SEGGER RTT buffer.\n*    SEGGER_RTT_PutCharSkipNoLock does not lock the application and\n*    skips the byte, if it does not fit into the buffer.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    c            Byte to be stored.\n*\n*  Return value\n*    Number of bytes which have been stored in the \"Up\"-buffer.\n*\n*  Notes\n*    (1) If there is not enough space in the \"Up\"-buffer, the character is dropped.\n*    (2) For performance reasons this function does not call Init()\n*        and may only be called after RTT has been initialized.\n*        Either by calling SEGGER_RTT_Init() or calling another RTT API function first.\n*/\n\nunsigned SEGGER_RTT_PutCharSkipNoLock(unsigned BufferIndex, char c) {\n  SEGGER_RTT_BUFFER_UP* pRing;\n  unsigned              WrOff;\n  unsigned              Status;\n  volatile char*        pDst;\n  //\n  // Get \"to-host\" ring buffer.\n  //\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  //\n  // Get write position and handle wrap-around if necessary\n  //\n  WrOff = pRing->WrOff + 1;\n  if (WrOff == pRing->SizeOfBuffer) {\n    WrOff = 0;\n  }\n  //\n  // Output byte if free space is available\n  //\n  if (WrOff != pRing->RdOff) {\n    pDst = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF;\n    *pDst = c;\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    pRing->WrOff = WrOff;\n    Status = 1;\n  } else {\n    Status = 0;\n  }\n  //\n  return Status;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_PutCharSkip\n*\n*  Function description\n*    Stores a single character/byte in SEGGER RTT buffer.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    c            Byte to be stored.\n*\n*  Return value\n*    Number of bytes which have been stored in the \"Up\"-buffer.\n*\n*  Notes\n*    (1) If there is not enough space in the \"Up\"-buffer, the character is dropped.\n*/\n\nunsigned SEGGER_RTT_PutCharSkip(unsigned BufferIndex, char c) {\n  SEGGER_RTT_BUFFER_UP* pRing;\n  unsigned              WrOff;\n  unsigned              Status;\n  volatile char*        pDst;\n  //\n  // Prepare\n  //\n  INIT();\n  SEGGER_RTT_LOCK();\n  //\n  // Get \"to-host\" ring buffer.\n  //\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  //\n  // Get write position and handle wrap-around if necessary\n  //\n  WrOff = pRing->WrOff + 1;\n  if (WrOff == pRing->SizeOfBuffer) {\n    WrOff = 0;\n  }\n  //\n  // Output byte if free space is available\n  //\n  if (WrOff != pRing->RdOff) {\n    pDst  = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF;\n    *pDst = c;\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    pRing->WrOff = WrOff;\n    Status = 1;\n  } else {\n    Status = 0;\n  }\n  //\n  // Finish up.\n  //\n  SEGGER_RTT_UNLOCK();\n  //\n  return Status;\n}\n\n /*********************************************************************\n*\n*       SEGGER_RTT_PutChar\n*\n*  Function description\n*    Stores a single character/byte in SEGGER RTT buffer.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    c            Byte to be stored.\n*\n*  Return value\n*    Number of bytes which have been stored in the \"Up\"-buffer.\n*\n*  Notes\n*    (1) Data is stored according to buffer flags.\n*/\n\nunsigned SEGGER_RTT_PutChar(unsigned BufferIndex, char c) {\n  SEGGER_RTT_BUFFER_UP* pRing;\n  unsigned              WrOff;\n  unsigned              Status;\n  volatile char*        pDst;\n  //\n  // Prepare\n  //\n  INIT();\n  SEGGER_RTT_LOCK();\n  //\n  // Get \"to-host\" ring buffer.\n  //\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  //\n  // Get write position and handle wrap-around if necessary\n  //\n  WrOff = pRing->WrOff + 1;\n  if (WrOff == pRing->SizeOfBuffer) {\n    WrOff = 0;\n  }\n  //\n  // Wait for free space if mode is set to blocking\n  //\n  if (pRing->Flags == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) {\n    while (WrOff == pRing->RdOff) {\n      ;\n    }\n  }\n  //\n  // Output byte if free space is available\n  //\n  if (WrOff != pRing->RdOff) {\n    pDst  = (pRing->pBuffer + pRing->WrOff) + SEGGER_RTT_UNCACHED_OFF;\n    *pDst = c;\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    pRing->WrOff = WrOff;\n    Status = 1;\n  } else {\n    Status = 0;\n  }\n  //\n  // Finish up.\n  //\n  SEGGER_RTT_UNLOCK();\n  return Status;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_GetKey\n*\n*  Function description\n*    Reads one character from the SEGGER RTT buffer.\n*    Host has previously stored data there.\n*\n*  Return value\n*    <  0 -   No character available (buffer empty).\n*    >= 0 -   Character which has been read. (Possible values: 0 - 255)\n*\n*  Notes\n*    (1) This function is only specified for accesses to RTT buffer 0.\n*/\nint SEGGER_RTT_GetKey(void) {\n  char c;\n  int r;\n\n  r = (int)SEGGER_RTT_Read(0u, &c, 1u);\n  if (r == 1) {\n    r = (int)(unsigned char)c;\n  } else {\n    r = -1;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_WaitKey\n*\n*  Function description\n*    Waits until at least one character is avaible in the SEGGER RTT buffer.\n*    Once a character is available, it is read and this function returns.\n*\n*  Return value\n*    >=0 -   Character which has been read.\n*\n*  Notes\n*    (1) This function is only specified for accesses to RTT buffer 0\n*    (2) This function is blocking if no character is present in RTT buffer\n*/\nint SEGGER_RTT_WaitKey(void) {\n  int r;\n\n  do {\n    r = SEGGER_RTT_GetKey();\n  } while (r < 0);\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_HasKey\n*\n*  Function description\n*    Checks if at least one character for reading is available in the SEGGER RTT buffer.\n*\n*  Return value\n*    == 0 -     No characters are available to read.\n*    == 1 -     At least one character is available.\n*\n*  Notes\n*    (1) This function is only specified for accesses to RTT buffer 0\n*/\nint SEGGER_RTT_HasKey(void) {\n  SEGGER_RTT_BUFFER_DOWN* pRing;\n  unsigned RdOff;\n  int r;\n\n  INIT();\n  pRing = (SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[0] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  RdOff = pRing->RdOff;\n  if (RdOff != pRing->WrOff) {\n    r = 1;\n  } else {\n    r = 0;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_HasData\n*\n*  Function description\n*    Check if there is data from the host in the given buffer.\n*\n*  Return value:\n*  ==0:  No data\n*  !=0:  Data in buffer\n*\n*/\nunsigned SEGGER_RTT_HasData(unsigned BufferIndex) {\n  SEGGER_RTT_BUFFER_DOWN* pRing;\n  unsigned                v;\n\n  pRing = (SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  v = pRing->WrOff;\n  return v - pRing->RdOff;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_HasDataUp\n*\n*  Function description\n*    Check if there is data remaining to be sent in the given buffer.\n*\n*  Return value:\n*  ==0:  No data\n*  !=0:  Data in buffer\n*\n*/\nunsigned SEGGER_RTT_HasDataUp(unsigned BufferIndex) {\n  SEGGER_RTT_BUFFER_UP* pRing;\n  unsigned                v;\n\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  v = pRing->RdOff;\n  return pRing->WrOff - v;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_AllocDownBuffer\n*\n*  Function description\n*    Run-time configuration of the next down-buffer (H->T).\n*    The next buffer, which is not used yet is configured.\n*    This includes: Buffer address, size, name, flags, ...\n*\n*  Parameters\n*    sName        Pointer to a constant name string.\n*    pBuffer      Pointer to a buffer to be used.\n*    BufferSize   Size of the buffer.\n*    Flags        Operating modes. Define behavior if buffer is full (not enough space for entire message).\n*                 Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode.\n*\n*  Return value\n*    >= 0 - O.K. Buffer Index\n*     < 0 - Error\n*/\nint SEGGER_RTT_AllocDownBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) {\n  int BufferIndex;\n  volatile SEGGER_RTT_CB* pRTTCB;\n\n  INIT();\n  SEGGER_RTT_LOCK();\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  BufferIndex = 0;\n  do {\n    if (pRTTCB->aDown[BufferIndex].pBuffer == NULL) {\n      break;\n    }\n    BufferIndex++;\n  } while (BufferIndex < pRTTCB->MaxNumDownBuffers);\n  if (BufferIndex < pRTTCB->MaxNumDownBuffers) {\n    pRTTCB->aDown[BufferIndex].sName        = sName;\n    pRTTCB->aDown[BufferIndex].pBuffer      = (char*)pBuffer;\n    pRTTCB->aDown[BufferIndex].SizeOfBuffer = BufferSize;\n    pRTTCB->aDown[BufferIndex].RdOff        = 0u;\n    pRTTCB->aDown[BufferIndex].WrOff        = 0u;\n    pRTTCB->aDown[BufferIndex].Flags        = Flags;\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n  } else {\n    BufferIndex = -1;\n  }\n  SEGGER_RTT_UNLOCK();\n  return BufferIndex;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_AllocUpBuffer\n*\n*  Function description\n*    Run-time configuration of the next up-buffer (T->H).\n*    The next buffer, which is not used yet is configured.\n*    This includes: Buffer address, size, name, flags, ...\n*\n*  Parameters\n*    sName        Pointer to a constant name string.\n*    pBuffer      Pointer to a buffer to be used.\n*    BufferSize   Size of the buffer.\n*    Flags        Operating modes. Define behavior if buffer is full (not enough space for entire message).\n*                 Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode.\n*\n*  Return value\n*    >= 0 - O.K. Buffer Index\n*     < 0 - Error\n*/\nint SEGGER_RTT_AllocUpBuffer(const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) {\n  int BufferIndex;\n  volatile SEGGER_RTT_CB* pRTTCB;\n\n  INIT();\n  SEGGER_RTT_LOCK();\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  BufferIndex = 0;\n  do {\n    if (pRTTCB->aUp[BufferIndex].pBuffer == NULL) {\n      break;\n    }\n    BufferIndex++;\n  } while (BufferIndex < pRTTCB->MaxNumUpBuffers);\n  if (BufferIndex < pRTTCB->MaxNumUpBuffers) {\n    pRTTCB->aUp[BufferIndex].sName        = sName;\n    pRTTCB->aUp[BufferIndex].pBuffer      = (char*)pBuffer;\n    pRTTCB->aUp[BufferIndex].SizeOfBuffer = BufferSize;\n    pRTTCB->aUp[BufferIndex].RdOff        = 0u;\n    pRTTCB->aUp[BufferIndex].WrOff        = 0u;\n    pRTTCB->aUp[BufferIndex].Flags        = Flags;\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n  } else {\n    BufferIndex = -1;\n  }\n  SEGGER_RTT_UNLOCK();\n  return BufferIndex;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_ConfigUpBuffer\n*\n*  Function description\n*    Run-time configuration of a specific up-buffer (T->H).\n*    Buffer to be configured is specified by index.\n*    This includes: Buffer address, size, name, flags, ...\n*\n*  Parameters\n*    BufferIndex  Index of the buffer to configure.\n*    sName        Pointer to a constant name string.\n*    pBuffer      Pointer to a buffer to be used.\n*    BufferSize   Size of the buffer.\n*    Flags        Operating modes. Define behavior if buffer is full (not enough space for entire message).\n*                 Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode.\n*\n*  Return value\n*    >= 0 - O.K.\n*     < 0 - Error\n*\n*  Additional information\n*    Buffer 0 is configured on compile-time.\n*    May only be called once per buffer.\n*    Buffer name and flags can be reconfigured using the appropriate functions.\n*/\nint SEGGER_RTT_ConfigUpBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) {\n  int r;\n  volatile SEGGER_RTT_CB* pRTTCB;\n  volatile SEGGER_RTT_BUFFER_UP* pUp;\n\n  INIT();\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) {\n    SEGGER_RTT_LOCK();\n    pUp = &pRTTCB->aUp[BufferIndex];\n    if (BufferIndex) {\n      pUp->sName        = sName;\n      pUp->pBuffer      = (char*)pBuffer;\n      pUp->SizeOfBuffer = BufferSize;\n      pUp->RdOff        = 0u;\n      pUp->WrOff        = 0u;\n    }\n    pUp->Flags          = Flags;\n    SEGGER_RTT_UNLOCK();\n    r =  0;\n  } else {\n    r = -1;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_ConfigDownBuffer\n*\n*  Function description\n*    Run-time configuration of a specific down-buffer (H->T).\n*    Buffer to be configured is specified by index.\n*    This includes: Buffer address, size, name, flags, ...\n*\n*  Parameters\n*    BufferIndex  Index of the buffer to configure.\n*    sName        Pointer to a constant name string.\n*    pBuffer      Pointer to a buffer to be used.\n*    BufferSize   Size of the buffer.\n*    Flags        Operating modes. Define behavior if buffer is full (not enough space for entire message).\n*                 Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode.\n*\n*  Return value\n*    >= 0  O.K.\n*     < 0  Error\n*\n*  Additional information\n*    Buffer 0 is configured on compile-time.\n*    May only be called once per buffer.\n*    Buffer name and flags can be reconfigured using the appropriate functions.\n*/\nint SEGGER_RTT_ConfigDownBuffer(unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags) {\n  int r;\n  volatile SEGGER_RTT_CB* pRTTCB;\n  volatile SEGGER_RTT_BUFFER_DOWN* pDown;\n\n  INIT();\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) {\n    SEGGER_RTT_LOCK();\n    pDown = &pRTTCB->aDown[BufferIndex];\n    if (BufferIndex) {\n      pDown->sName        = sName;\n      pDown->pBuffer      = (char*)pBuffer;\n      pDown->SizeOfBuffer = BufferSize;\n      pDown->RdOff        = 0u;\n      pDown->WrOff        = 0u;\n    }\n    pDown->Flags          = Flags;\n    RTT__DMB();                     // Force data write to be complete before writing the <WrOff>, in case CPU is allowed to change the order of memory accesses\n    SEGGER_RTT_UNLOCK();\n    r =  0;\n  } else {\n    r = -1;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_SetNameUpBuffer\n*\n*  Function description\n*    Run-time configuration of a specific up-buffer name (T->H).\n*    Buffer to be configured is specified by index.\n*\n*  Parameters\n*    BufferIndex  Index of the buffer to renamed.\n*    sName        Pointer to a constant name string.\n*\n*  Return value\n*    >= 0  O.K.\n*     < 0  Error\n*/\nint SEGGER_RTT_SetNameUpBuffer(unsigned BufferIndex, const char* sName) {\n  int r;\n  volatile SEGGER_RTT_CB* pRTTCB;\n  volatile SEGGER_RTT_BUFFER_UP* pUp;\n\n  INIT();\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) {\n    SEGGER_RTT_LOCK();\n    pUp = &pRTTCB->aUp[BufferIndex];\n    pUp->sName = sName;\n    SEGGER_RTT_UNLOCK();\n    r =  0;\n  } else {\n    r = -1;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_SetNameDownBuffer\n*\n*  Function description\n*    Run-time configuration of a specific Down-buffer name (T->H).\n*    Buffer to be configured is specified by index.\n*\n*  Parameters\n*    BufferIndex  Index of the buffer to renamed.\n*    sName        Pointer to a constant name string.\n*\n*  Return value\n*    >= 0  O.K.\n*     < 0  Error\n*/\nint SEGGER_RTT_SetNameDownBuffer(unsigned BufferIndex, const char* sName) {\n  int r;\n  volatile SEGGER_RTT_CB* pRTTCB;\n  volatile SEGGER_RTT_BUFFER_DOWN* pDown;\n\n  INIT();\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) {\n    SEGGER_RTT_LOCK();\n    pDown = &pRTTCB->aDown[BufferIndex];\n    pDown->sName = sName;\n    SEGGER_RTT_UNLOCK();\n    r =  0;\n  } else {\n    r = -1;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_SetFlagsUpBuffer\n*\n*  Function description\n*    Run-time configuration of specific up-buffer flags (T->H).\n*    Buffer to be configured is specified by index.\n*\n*  Parameters\n*    BufferIndex  Index of the buffer.\n*    Flags        Flags to set for the buffer.\n*                 Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode.\n*\n*  Return value\n*    >= 0  O.K.\n*     < 0  Error\n*/\nint SEGGER_RTT_SetFlagsUpBuffer(unsigned BufferIndex, unsigned Flags) {\n  int r;\n  volatile SEGGER_RTT_CB* pRTTCB;\n  volatile SEGGER_RTT_BUFFER_UP* pUp;\n\n  INIT();\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  if (BufferIndex < SEGGER_RTT_MAX_NUM_UP_BUFFERS) {\n    SEGGER_RTT_LOCK();\n    pUp = &pRTTCB->aUp[BufferIndex];\n    pUp->Flags = Flags;\n    SEGGER_RTT_UNLOCK();\n    r =  0;\n  } else {\n    r = -1;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_SetFlagsDownBuffer\n*\n*  Function description\n*    Run-time configuration of specific Down-buffer flags (T->H).\n*    Buffer to be configured is specified by index.\n*\n*  Parameters\n*    BufferIndex  Index of the buffer to renamed.\n*    Flags        Flags to set for the buffer.\n*                 Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode.\n*\n*  Return value\n*    >= 0  O.K.\n*     < 0  Error\n*/\nint SEGGER_RTT_SetFlagsDownBuffer(unsigned BufferIndex, unsigned Flags) {\n  int r;\n  volatile SEGGER_RTT_CB* pRTTCB;\n  volatile SEGGER_RTT_BUFFER_DOWN* pDown;\n\n  INIT();\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  if (BufferIndex < SEGGER_RTT_MAX_NUM_DOWN_BUFFERS) {\n    SEGGER_RTT_LOCK();\n    pDown = &pRTTCB->aDown[BufferIndex];\n    pDown->Flags = Flags;\n    SEGGER_RTT_UNLOCK();\n    r =  0;\n  } else {\n    r = -1;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_Init\n*\n*  Function description\n*    Initializes the RTT Control Block.\n*    Should be used in RAM targets, at start of the application.\n*\n*/\nvoid SEGGER_RTT_Init (void) {\n  _DoInit();\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_SetTerminal\n*\n*  Function description\n*    Sets the terminal to be used for output on channel 0.\n*\n*  Parameters\n*    TerminalId  Index of the terminal.\n*\n*  Return value\n*    >= 0  O.K.\n*     < 0  Error (e.g. if RTT is configured for non-blocking mode and there was no space in the buffer to set the new terminal Id)\n*\n*  Notes\n*    (1) Buffer 0 is always reserved for terminal I/O, so we can use index 0 here, fixed\n*/\nint SEGGER_RTT_SetTerminal (unsigned char TerminalId) {\n  unsigned char         ac[2];\n  SEGGER_RTT_BUFFER_UP* pRing;\n  unsigned Avail;\n  int r;\n\n  INIT();\n  r = 0;\n  ac[0] = 0xFFu;\n  if (TerminalId < sizeof(_aTerminalId)) { // We only support a certain number of channels\n    ac[1] = _aTerminalId[TerminalId];\n    pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n    SEGGER_RTT_LOCK();                     // Lock to make sure that no other task is writing into buffer, while we are and number of free bytes in buffer does not change downwards after checking and before writing\n    if ((pRing->Flags & SEGGER_RTT_MODE_MASK) == SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL) {\n      _ActiveTerminal = TerminalId;\n      _WriteBlocking(pRing, (const char*)ac, 2u);\n    } else {                                                                            // Skipping mode or trim mode? => We cannot trim this command so handling is the same for both modes\n      Avail = _GetAvailWriteSpace(pRing);\n      if (Avail >= 2) {\n        _ActiveTerminal = TerminalId;    // Only change active terminal in case of success\n        _WriteNoCheck(pRing, (const char*)ac, 2u);\n      } else {\n        r = -1;\n      }\n    }\n    SEGGER_RTT_UNLOCK();\n  } else {\n    r = -1;\n  }\n  return r;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_TerminalOut\n*\n*  Function description\n*    Writes a string to the given terminal\n*     without changing the terminal for channel 0.\n*\n*  Parameters\n*    TerminalId   Index of the terminal.\n*    s            String to be printed on the terminal.\n*\n*  Return value\n*    >= 0 - Number of bytes written.\n*     < 0 - Error.\n*\n*/\nint SEGGER_RTT_TerminalOut (unsigned char TerminalId, const char* s) {\n  int                   Status;\n  unsigned              FragLen;\n  unsigned              Avail;\n  SEGGER_RTT_BUFFER_UP* pRing;\n  //\n  INIT();\n  //\n  // Validate terminal ID.\n  //\n  if (TerminalId < (char)sizeof(_aTerminalId)) { // We only support a certain number of channels\n    //\n    // Get \"to-host\" ring buffer.\n    //\n    pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[0] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n    //\n    // Need to be able to change terminal, write data, change back.\n    // Compute the fixed and variable sizes.\n    //\n    FragLen = STRLEN(s);\n    //\n    // How we output depends upon the mode...\n    //\n    SEGGER_RTT_LOCK();\n    Avail = _GetAvailWriteSpace(pRing);\n    switch (pRing->Flags & SEGGER_RTT_MODE_MASK) {\n    case SEGGER_RTT_MODE_NO_BLOCK_SKIP:\n      //\n      // If we are in skip mode and there is no space for the whole\n      // of this output, don't bother switching terminals at all.\n      //\n      if (Avail < (FragLen + 4u)) {\n        Status = 0;\n      } else {\n        _PostTerminalSwitch(pRing, TerminalId);\n        Status = (int)_WriteBlocking(pRing, s, FragLen);\n        _PostTerminalSwitch(pRing, _ActiveTerminal);\n      }\n      break;\n    case SEGGER_RTT_MODE_NO_BLOCK_TRIM:\n      //\n      // If we are in trim mode and there is not enough space for everything,\n      // trim the output but always include the terminal switch.  If no room\n      // for terminal switch, skip that totally.\n      //\n      if (Avail < 4u) {\n        Status = -1;\n      } else {\n        _PostTerminalSwitch(pRing, TerminalId);\n        Status = (int)_WriteBlocking(pRing, s, (FragLen < (Avail - 4u)) ? FragLen : (Avail - 4u));\n        _PostTerminalSwitch(pRing, _ActiveTerminal);\n      }\n      break;\n    case SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL:\n      //\n      // If we are in blocking mode, output everything.\n      //\n      _PostTerminalSwitch(pRing, TerminalId);\n      Status = (int)_WriteBlocking(pRing, s, FragLen);\n      _PostTerminalSwitch(pRing, _ActiveTerminal);\n      break;\n    default:\n      Status = -1;\n      break;\n    }\n    //\n    // Finish up.\n    //\n    SEGGER_RTT_UNLOCK();\n  } else {\n    Status = -1;\n  }\n  return Status;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_GetAvailWriteSpace\n*\n*  Function description\n*    Returns the number of bytes available in the ring buffer.\n*\n*  Parameters\n*    BufferIndex  Index of the up buffer.\n*\n*  Return value\n*    Number of bytes that are free in the selected up buffer.\n*/\nunsigned SEGGER_RTT_GetAvailWriteSpace (unsigned BufferIndex) {\n  SEGGER_RTT_BUFFER_UP* pRing;\n\n  pRing = (SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[BufferIndex] + SEGGER_RTT_UNCACHED_OFF);  // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  return _GetAvailWriteSpace(pRing);\n}\n\n\n/*********************************************************************\n*\n*       SEGGER_RTT_GetBytesInBuffer()\n*\n*  Function description\n*    Returns the number of bytes currently used in the up buffer.\n*\n*  Parameters\n*    BufferIndex  Index of the up buffer.\n*\n*  Return value\n*    Number of bytes that are used in the buffer.\n*/\nunsigned SEGGER_RTT_GetBytesInBuffer(unsigned BufferIndex) {\n  unsigned RdOff;\n  unsigned WrOff;\n  unsigned r;\n  volatile SEGGER_RTT_CB* pRTTCB;\n  //\n  // Avoid warnings regarding volatile access order.  It's not a problem\n  // in this case, but dampen compiler enthusiasm.\n  //\n  pRTTCB = (volatile SEGGER_RTT_CB*)((uintptr_t)&_SEGGER_RTT + SEGGER_RTT_UNCACHED_OFF);  // Access RTTCB uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n  RdOff = pRTTCB->aUp[BufferIndex].RdOff;\n  WrOff = pRTTCB->aUp[BufferIndex].WrOff;\n  if (RdOff <= WrOff) {\n    r = WrOff - RdOff;\n  } else {\n    r = pRTTCB->aUp[BufferIndex].SizeOfBuffer - (WrOff - RdOff);\n  }\n  return r;\n}\n\n/*************************** End of file ****************************/\n"
  },
  {
    "path": "lib/SEGGER_RTT/RTT/SEGGER_RTT.h",
    "content": "/*********************************************************************\n*                    SEGGER Microcontroller GmbH                     *\n*                        The Embedded Experts                        *\n**********************************************************************\n*                                                                    *\n*            (c) 1995 - 2019 SEGGER Microcontroller GmbH             *\n*                                                                    *\n*       www.segger.com     Support: support@segger.com               *\n*                                                                    *\n**********************************************************************\n*                                                                    *\n*       SEGGER RTT * Real Time Transfer for embedded targets         *\n*                                                                    *\n**********************************************************************\n*                                                                    *\n* All rights reserved.                                               *\n*                                                                    *\n* SEGGER strongly recommends to not make any changes                 *\n* to or modify the source code of this software in order to stay     *\n* compatible with the RTT protocol and J-Link.                       *\n*                                                                    *\n* Redistribution and use in source and binary forms, with or         *\n* without modification, are permitted provided that the following    *\n* condition is met:                                                  *\n*                                                                    *\n* o Redistributions of source code must retain the above copyright   *\n*   notice, this condition and the following disclaimer.             *\n*                                                                    *\n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             *\n* CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,        *\n* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           *\n* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           *\n* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *\n* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR           *\n* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  *\n* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;    *\n* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF      *\n* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT          *\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE  *\n* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH   *\n* DAMAGE.                                                            *\n*                                                                    *\n**********************************************************************\n---------------------------END-OF-HEADER------------------------------\nFile    : SEGGER_RTT.h\nPurpose : Implementation of SEGGER real-time transfer which allows\n          real-time communication on targets which support debugger\n          memory accesses while the CPU is running.\nRevision: $Rev: 25842 $\n----------------------------------------------------------------------\n*/\n\n#ifndef SEGGER_RTT_H\n#define SEGGER_RTT_H\n\n#include \"../Config/SEGGER_RTT_Conf.h\"\n\n/*********************************************************************\n*\n*       Defines, defaults\n*\n**********************************************************************\n*/\n\n#ifndef RTT_USE_ASM\n  //\n  // Some cores support out-of-order memory accesses (reordering of memory accesses in the core)\n  // For such cores, we need to define a memory barrier to guarantee the order of certain accesses to the RTT ring buffers.\n  // Needed for:\n  //   Cortex-M7 (ARMv7-M)\n  //   Cortex-M23 (ARM-v8M)\n  //   Cortex-M33 (ARM-v8M)\n  //   Cortex-A/R (ARM-v7A/R)\n  //\n  // We do not explicitly check for \"Embedded Studio\" as the compiler in use determines what we support.\n  // You can use an external toolchain like IAR inside ES. So there is no point in checking for \"Embedded Studio\"\n  //\n  #if (defined __CROSSWORKS_ARM)                  // Rowley Crossworks\n    #define _CC_HAS_RTT_ASM_SUPPORT 1\n    #if (defined __ARM_ARCH_7M__)                 // Cortex-M3\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n    #elif (defined __ARM_ARCH_7EM__)              // Cortex-M4/M7\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined __ARM_ARCH_8M_BASE__)          // Cortex-M23\n      #define _CORE_HAS_RTT_ASM_SUPPORT 0\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined __ARM_ARCH_8M_MAIN__)          // Cortex-M33\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined(__ARM_ARCH_8_1M_MAIN__))       // Cortex-M85\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #else\n      #define _CORE_HAS_RTT_ASM_SUPPORT 0\n    #endif\n  #elif (defined __ARMCC_VERSION)\n    //\n    // ARM compiler\n    // ARM compiler V6.0 and later is clang based.\n    // Our ASM part is compatible to clang.\n    //\n    #if (__ARMCC_VERSION >= 6000000)\n      #define _CC_HAS_RTT_ASM_SUPPORT 1\n    #else\n      #define _CC_HAS_RTT_ASM_SUPPORT 0\n    #endif\n    #if (defined __ARM_ARCH_6M__)                 // Cortex-M0 / M1\n      #define _CORE_HAS_RTT_ASM_SUPPORT 0         // No ASM support for this architecture\n    #elif (defined __ARM_ARCH_7M__)               // Cortex-M3\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n    #elif (defined __ARM_ARCH_7EM__)              // Cortex-M4/M7\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined __ARM_ARCH_8M_BASE__)          // Cortex-M23\n      #define _CORE_HAS_RTT_ASM_SUPPORT 0\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined __ARM_ARCH_8M_MAIN__)          // Cortex-M33\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined __ARM_ARCH_8_1M_MAIN__)        // Cortex-M85\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__))  // Cortex-A/R 32-bit ARMv7-A/R\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #else\n      #define _CORE_HAS_RTT_ASM_SUPPORT 0\n    #endif\n  #elif ((defined __GNUC__) || (defined __clang__))\n    //\n    // GCC / Clang\n    //\n    #define _CC_HAS_RTT_ASM_SUPPORT 1\n    // ARM 7/9: __ARM_ARCH_5__ / __ARM_ARCH_5E__ / __ARM_ARCH_5T__ / __ARM_ARCH_5T__ / __ARM_ARCH_5TE__\n    #if (defined __ARM_ARCH_7M__)                 // Cortex-M3\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n    #elif (defined __ARM_ARCH_7EM__)              // Cortex-M4/M7\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1         // Only Cortex-M7 needs a DMB but we cannot distinguish M4 and M7 here...\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined __ARM_ARCH_8M_BASE__)          // Cortex-M23\n      #define _CORE_HAS_RTT_ASM_SUPPORT 0\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined __ARM_ARCH_8M_MAIN__)          // Cortex-M33\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif (defined __ARM_ARCH_8_1M_MAIN__)        // Cortex-M85\n      #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #elif ((defined __ARM_ARCH_7A__) || (defined __ARM_ARCH_7R__))  // Cortex-A/R 32-bit ARMv7-A/R\n      #define _CORE_NEEDS_DMB           1\n      #define RTT__DMB() __asm volatile (\"dmb\\n\" : : :);\n    #else\n      #define _CORE_HAS_RTT_ASM_SUPPORT 0\n    #endif\n  #elif ((defined __IASMARM__) || (defined __ICCARM__))\n    //\n    // IAR assembler/compiler\n    //\n    #define _CC_HAS_RTT_ASM_SUPPORT 1\n    #if (__VER__ < 6300000)\n      #define VOLATILE\n    #else\n      #define VOLATILE volatile\n    #endif\n    #if (defined __ARM7M__)                            // Needed for old versions that do not know the define yet\n      #if (__CORE__ == __ARM7M__)                      // Cortex-M3\n        #define _CORE_HAS_RTT_ASM_SUPPORT 1\n      #endif\n    #endif\n    #if (defined __ARM7EM__)\n      #if (__CORE__ == __ARM7EM__)                     // Cortex-M4/M7\n        #define _CORE_HAS_RTT_ASM_SUPPORT 1\n        #define _CORE_NEEDS_DMB 1\n        #define RTT__DMB() asm VOLATILE (\"DMB\");\n      #endif\n    #endif\n    #if (defined __ARM8M_BASELINE__)\n      #if (__CORE__ == __ARM8M_BASELINE__)             // Cortex-M23\n        #define _CORE_HAS_RTT_ASM_SUPPORT 0\n        #define _CORE_NEEDS_DMB 1\n        #define RTT__DMB() asm VOLATILE (\"DMB\");\n      #endif\n    #endif\n    #if (defined __ARM8M_MAINLINE__)\n      #if (__CORE__ == __ARM8M_MAINLINE__)             // Cortex-M33\n        #define _CORE_HAS_RTT_ASM_SUPPORT 1\n        #define _CORE_NEEDS_DMB 1\n        #define RTT__DMB() asm VOLATILE (\"DMB\");\n      #endif\n    #endif\n    #if (defined __ARM8EM_MAINLINE__)\n      #if (__CORE__ == __ARM8EM_MAINLINE__)            // Cortex-???\n        #define _CORE_HAS_RTT_ASM_SUPPORT 1\n        #define _CORE_NEEDS_DMB 1\n        #define RTT__DMB() asm VOLATILE (\"DMB\");\n      #endif\n    #endif\n    #if (defined __ARM7A__)\n      #if (__CORE__ == __ARM7A__)                      // Cortex-A 32-bit ARMv7-A\n        #define _CORE_NEEDS_DMB 1\n        #define RTT__DMB() asm VOLATILE (\"DMB\");\n      #endif\n    #endif\n    #if (defined __ARM7R__)\n      #if (__CORE__ == __ARM7R__)                      // Cortex-R 32-bit ARMv7-R\n        #define _CORE_NEEDS_DMB 1\n        #define RTT__DMB() asm VOLATILE (\"DMB\");\n      #endif\n    #endif\n// TBD: __ARM8A__ => Cortex-A 64-bit ARMv8-A\n// TBD: __ARM8R__ => Cortex-R 64-bit ARMv8-R\n  #else\n    //\n    // Other compilers\n    //\n    #define _CC_HAS_RTT_ASM_SUPPORT   0\n    #define _CORE_HAS_RTT_ASM_SUPPORT 0\n  #endif\n  //\n  // If IDE and core support the ASM version, enable ASM version by default\n  //\n  #ifndef _CORE_HAS_RTT_ASM_SUPPORT\n    #define _CORE_HAS_RTT_ASM_SUPPORT 0              // Default for unknown cores\n  #endif\n  #if (_CC_HAS_RTT_ASM_SUPPORT && _CORE_HAS_RTT_ASM_SUPPORT)\n    #define RTT_USE_ASM                           (1)\n  #else\n    #define RTT_USE_ASM                           (0)\n  #endif\n#endif\n\n#ifndef _CORE_NEEDS_DMB\n  #define _CORE_NEEDS_DMB 0\n#endif\n\n#ifndef RTT__DMB\n  #if _CORE_NEEDS_DMB\n    #error \"Don't know how to place inline assembly for DMB\"\n  #else\n    #define RTT__DMB()\n  #endif\n#endif\n\n#ifndef SEGGER_RTT_CPU_CACHE_LINE_SIZE\n  #define SEGGER_RTT_CPU_CACHE_LINE_SIZE (0)   // On most target systems where RTT is used, we do not have a CPU cache, therefore 0 is a good default here\n#endif\n\n#ifndef SEGGER_RTT_UNCACHED_OFF\n  #if SEGGER_RTT_CPU_CACHE_LINE_SIZE\n    #error \"SEGGER_RTT_UNCACHED_OFF must be defined when setting SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0\"\n  #else\n    #define SEGGER_RTT_UNCACHED_OFF (0)\n  #endif\n#endif\n#if RTT_USE_ASM\n  #if SEGGER_RTT_CPU_CACHE_LINE_SIZE\n    #error \"RTT_USE_ASM is not available if SEGGER_RTT_CPU_CACHE_LINE_SIZE != 0\"\n  #endif\n#endif\n\n#ifndef SEGGER_RTT_ASM  // defined when SEGGER_RTT.h is included from assembly file\n#include <stdlib.h>\n#include <stdarg.h>\n#include <stdint.h>\n\n/*********************************************************************\n*\n*       Defines, fixed\n*\n**********************************************************************\n*/\n\n//\n// Determine how much we must pad the control block to make it a multiple of a cache line in size\n// Assuming: U8 = 1B\n//           U16 = 2B\n//           U32 = 4B\n//           U8/U16/U32* = 4B\n//\n#if SEGGER_RTT_CPU_CACHE_LINE_SIZE    // Avoid division by zero in case we do not have any cache\n  #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (((NumBytes + SEGGER_RTT_CPU_CACHE_LINE_SIZE - 1) / SEGGER_RTT_CPU_CACHE_LINE_SIZE) * SEGGER_RTT_CPU_CACHE_LINE_SIZE)\n#else\n  #define SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(NumBytes) (NumBytes)\n#endif\n#define SEGGER_RTT__CB_SIZE                              (16 + 4 + 4 + (SEGGER_RTT_MAX_NUM_UP_BUFFERS * 24) + (SEGGER_RTT_MAX_NUM_DOWN_BUFFERS * 24))\n#define SEGGER_RTT__CB_PADDING                           (SEGGER_RTT__ROUND_UP_2_CACHE_LINE_SIZE(SEGGER_RTT__CB_SIZE) - SEGGER_RTT__CB_SIZE)\n\n/*********************************************************************\n*\n*       Types\n*\n**********************************************************************\n*/\n\n//\n// Description for a circular buffer (also called \"ring buffer\")\n// which is used as up-buffer (T->H)\n//\ntypedef struct {\n  const     char*    sName;         // Optional name. Standard names so far are: \"Terminal\", \"SysView\", \"J-Scope_t4i4\"\n            char*    pBuffer;       // Pointer to start of buffer\n            unsigned SizeOfBuffer;  // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty.\n            unsigned WrOff;         // Position of next item to be written by either target.\n  volatile  unsigned RdOff;         // Position of next item to be read by host. Must be volatile since it may be modified by host.\n            unsigned Flags;         // Contains configuration flags. Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode.\n} SEGGER_RTT_BUFFER_UP;\n\n//\n// Description for a circular buffer (also called \"ring buffer\")\n// which is used as down-buffer (H->T)\n//\ntypedef struct {\n  const     char*    sName;         // Optional name. Standard names so far are: \"Terminal\", \"SysView\", \"J-Scope_t4i4\"\n            char*    pBuffer;       // Pointer to start of buffer\n            unsigned SizeOfBuffer;  // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty.\n  volatile  unsigned WrOff;         // Position of next item to be written by host. Must be volatile since it may be modified by host.\n            unsigned RdOff;         // Position of next item to be read by target (down-buffer).\n            unsigned Flags;         // Contains configuration flags. Flags[31:24] are used for validity check and must be zero. Flags[23:2] are reserved for future use. Flags[1:0] = RTT operating mode.\n} SEGGER_RTT_BUFFER_DOWN;\n\n//\n// RTT control block which describes the number of buffers available\n// as well as the configuration for each buffer\n//\n//\ntypedef struct {\n  char                    acID[16];                                 // Initialized to \"SEGGER RTT\"\n  int                     MaxNumUpBuffers;                          // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2)\n  int                     MaxNumDownBuffers;                        // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2)\n  SEGGER_RTT_BUFFER_UP    aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS];       // Up buffers, transferring information up from target via debug probe to host\n  SEGGER_RTT_BUFFER_DOWN  aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS];   // Down buffers, transferring information down from host via debug probe to target\n#if SEGGER_RTT__CB_PADDING\n  unsigned char           aDummy[SEGGER_RTT__CB_PADDING];\n#endif\n} SEGGER_RTT_CB;\n\n/*********************************************************************\n*\n*       Global data\n*\n**********************************************************************\n*/\nextern SEGGER_RTT_CB _SEGGER_RTT;\n\n/*********************************************************************\n*\n*       RTT API functions\n*\n**********************************************************************\n*/\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\nint          SEGGER_RTT_AllocDownBuffer         (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);\nint          SEGGER_RTT_AllocUpBuffer           (const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);\nint          SEGGER_RTT_ConfigUpBuffer          (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);\nint          SEGGER_RTT_ConfigDownBuffer        (unsigned BufferIndex, const char* sName, void* pBuffer, unsigned BufferSize, unsigned Flags);\nint          SEGGER_RTT_GetKey                  (void);\nunsigned     SEGGER_RTT_HasData                 (unsigned BufferIndex);\nint          SEGGER_RTT_HasKey                  (void);\nunsigned     SEGGER_RTT_HasDataUp               (unsigned BufferIndex);\nvoid         SEGGER_RTT_Init                    (void);\nunsigned     SEGGER_RTT_Read                    (unsigned BufferIndex,       void* pBuffer, unsigned BufferSize);\nunsigned     SEGGER_RTT_ReadNoLock              (unsigned BufferIndex,       void* pData,   unsigned BufferSize);\nint          SEGGER_RTT_SetNameDownBuffer       (unsigned BufferIndex, const char* sName);\nint          SEGGER_RTT_SetNameUpBuffer         (unsigned BufferIndex, const char* sName);\nint          SEGGER_RTT_SetFlagsDownBuffer      (unsigned BufferIndex, unsigned Flags);\nint          SEGGER_RTT_SetFlagsUpBuffer        (unsigned BufferIndex, unsigned Flags);\nint          SEGGER_RTT_WaitKey                 (void);\nunsigned     SEGGER_RTT_Write                   (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);\nunsigned     SEGGER_RTT_WriteNoLock             (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);\nunsigned     SEGGER_RTT_WriteSkipNoLock         (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);\nunsigned     SEGGER_RTT_ASM_WriteSkipNoLock     (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);\nunsigned     SEGGER_RTT_WriteString             (unsigned BufferIndex, const char* s);\nvoid         SEGGER_RTT_WriteWithOverwriteNoLock(unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);\nunsigned     SEGGER_RTT_PutChar                 (unsigned BufferIndex, char c);\nunsigned     SEGGER_RTT_PutCharSkip             (unsigned BufferIndex, char c);\nunsigned     SEGGER_RTT_PutCharSkipNoLock       (unsigned BufferIndex, char c);\nunsigned     SEGGER_RTT_GetAvailWriteSpace      (unsigned BufferIndex);\nunsigned     SEGGER_RTT_GetBytesInBuffer        (unsigned BufferIndex);\n//\n// Function macro for performance optimization\n//\n#define      SEGGER_RTT_HASDATA(n)       (((SEGGER_RTT_BUFFER_DOWN*)((uintptr_t)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_DOWN*)((char*)&_SEGGER_RTT.aDown[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff)\n\n#if RTT_USE_ASM\n  #define SEGGER_RTT_WriteSkipNoLock  SEGGER_RTT_ASM_WriteSkipNoLock\n#endif\n\n/*********************************************************************\n*\n*       RTT transfer functions to send RTT data via other channels.\n*\n**********************************************************************\n*/\nunsigned     SEGGER_RTT_ReadUpBuffer            (unsigned BufferIndex, void* pBuffer, unsigned BufferSize);\nunsigned     SEGGER_RTT_ReadUpBufferNoLock      (unsigned BufferIndex, void* pData, unsigned BufferSize);\nunsigned     SEGGER_RTT_WriteDownBuffer         (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);\nunsigned     SEGGER_RTT_WriteDownBufferNoLock   (unsigned BufferIndex, const void* pBuffer, unsigned NumBytes);\n\n#define      SEGGER_RTT_HASDATA_UP(n)    (((SEGGER_RTT_BUFFER_UP*)((uintptr_t)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->WrOff - ((SEGGER_RTT_BUFFER_UP*)((char*)&_SEGGER_RTT.aUp[n] + SEGGER_RTT_UNCACHED_OFF))->RdOff)   // Access uncached to make sure we see changes made by the J-Link side and all of our changes go into HW directly\n\n/*********************************************************************\n*\n*       RTT \"Terminal\" API functions\n*\n**********************************************************************\n*/\nint     SEGGER_RTT_SetTerminal        (unsigned char TerminalId);\nint     SEGGER_RTT_TerminalOut        (unsigned char TerminalId, const char* s);\n\n/*********************************************************************\n*\n*       RTT printf functions (require SEGGER_RTT_printf.c)\n*\n**********************************************************************\n*/\nint SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...);\nint SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList);\n\n#ifdef __cplusplus\n  }\n#endif\n\n#endif // ifndef(SEGGER_RTT_ASM)\n\n/*********************************************************************\n*\n*       Defines\n*\n**********************************************************************\n*/\n\n//\n// Operating modes. Define behavior if buffer is full (not enough space for entire message)\n//\n#define SEGGER_RTT_MODE_NO_BLOCK_SKIP         (0)     // Skip. Do not block, output nothing. (Default)\n#define SEGGER_RTT_MODE_NO_BLOCK_TRIM         (1)     // Trim: Do not block, output as much as fits.\n#define SEGGER_RTT_MODE_BLOCK_IF_FIFO_FULL    (2)     // Block: Wait until there is space in the buffer.\n#define SEGGER_RTT_MODE_MASK                  (3)\n\n//\n// Control sequences, based on ANSI.\n// Can be used to control color, and clear the screen\n//\n#define RTT_CTRL_RESET                \"\\x1B[0m\"         // Reset to default colors\n#define RTT_CTRL_CLEAR                \"\\x1B[2J\"         // Clear screen, reposition cursor to top left\n\n#define RTT_CTRL_TEXT_BLACK           \"\\x1B[2;30m\"\n#define RTT_CTRL_TEXT_RED             \"\\x1B[2;31m\"\n#define RTT_CTRL_TEXT_GREEN           \"\\x1B[2;32m\"\n#define RTT_CTRL_TEXT_YELLOW          \"\\x1B[2;33m\"\n#define RTT_CTRL_TEXT_BLUE            \"\\x1B[2;34m\"\n#define RTT_CTRL_TEXT_MAGENTA         \"\\x1B[2;35m\"\n#define RTT_CTRL_TEXT_CYAN            \"\\x1B[2;36m\"\n#define RTT_CTRL_TEXT_WHITE           \"\\x1B[2;37m\"\n\n#define RTT_CTRL_TEXT_BRIGHT_BLACK    \"\\x1B[1;30m\"\n#define RTT_CTRL_TEXT_BRIGHT_RED      \"\\x1B[1;31m\"\n#define RTT_CTRL_TEXT_BRIGHT_GREEN    \"\\x1B[1;32m\"\n#define RTT_CTRL_TEXT_BRIGHT_YELLOW   \"\\x1B[1;33m\"\n#define RTT_CTRL_TEXT_BRIGHT_BLUE     \"\\x1B[1;34m\"\n#define RTT_CTRL_TEXT_BRIGHT_MAGENTA  \"\\x1B[1;35m\"\n#define RTT_CTRL_TEXT_BRIGHT_CYAN     \"\\x1B[1;36m\"\n#define RTT_CTRL_TEXT_BRIGHT_WHITE    \"\\x1B[1;37m\"\n\n#define RTT_CTRL_BG_BLACK             \"\\x1B[24;40m\"\n#define RTT_CTRL_BG_RED               \"\\x1B[24;41m\"\n#define RTT_CTRL_BG_GREEN             \"\\x1B[24;42m\"\n#define RTT_CTRL_BG_YELLOW            \"\\x1B[24;43m\"\n#define RTT_CTRL_BG_BLUE              \"\\x1B[24;44m\"\n#define RTT_CTRL_BG_MAGENTA           \"\\x1B[24;45m\"\n#define RTT_CTRL_BG_CYAN              \"\\x1B[24;46m\"\n#define RTT_CTRL_BG_WHITE             \"\\x1B[24;47m\"\n\n#define RTT_CTRL_BG_BRIGHT_BLACK      \"\\x1B[4;40m\"\n#define RTT_CTRL_BG_BRIGHT_RED        \"\\x1B[4;41m\"\n#define RTT_CTRL_BG_BRIGHT_GREEN      \"\\x1B[4;42m\"\n#define RTT_CTRL_BG_BRIGHT_YELLOW     \"\\x1B[4;43m\"\n#define RTT_CTRL_BG_BRIGHT_BLUE       \"\\x1B[4;44m\"\n#define RTT_CTRL_BG_BRIGHT_MAGENTA    \"\\x1B[4;45m\"\n#define RTT_CTRL_BG_BRIGHT_CYAN       \"\\x1B[4;46m\"\n#define RTT_CTRL_BG_BRIGHT_WHITE      \"\\x1B[4;47m\"\n\n\n#endif\n\n/*************************** End of file ****************************/\n"
  },
  {
    "path": "lib/SEGGER_RTT/RTT/SEGGER_RTT_ASM_ARMv7M.S",
    "content": "/*********************************************************************\n*                   (c) SEGGER Microcontroller GmbH                  *\n*                        The Embedded Experts                        *\n*                           www.segger.com                           *\n**********************************************************************\n\n-------------------------- END-OF-HEADER -----------------------------\n\nFile    : SEGGER_RTT_ASM_ARMv7M.S\nPurpose : Assembler implementation of RTT functions for ARMv7M\n\nAdditional information:\n  This module is written to be assembler-independent and works with\n  GCC and clang (Embedded Studio) and IAR.\n*/\n\n#define SEGGER_RTT_ASM      // Used to control processed input from header file\n#include \"SEGGER_RTT.h\"\n\n/*********************************************************************\n*\n*       Defines, fixed\n*\n**********************************************************************\n*/\n\n#define _CCIAR   0\n#define _CCCLANG 1\n\n#if (defined __SES_ARM) || (defined __GNUC__) || (defined __clang__)\n  #define _CC_TYPE             _CCCLANG\n  #define _PUB_SYM             .global\n  #define _EXT_SYM             .extern\n  #define _END                 .end\n  #define _WEAK                .weak\n  #define _THUMB_FUNC          .thumb_func\n  #define _THUMB_CODE          .code 16\n  #define _WORD                .word\n  #define _SECTION(Sect, Type, AlignExp) .section Sect ##, \"ax\"\n  #define _ALIGN(Exp)          .align Exp\n  #define _PLACE_LITS          .ltorg\n  #define _DATA_SECT_START\n  #define _C_STARTUP           _start\n  #define _STACK_END           __stack_end__\n  #define _RAMFUNC\n  //\n  // .text     => Link to flash\n  // .fast     => Link to RAM\n  // OtherSect => Usually link to RAM\n  // Alignment is 2^x\n  //\n#elif defined (__IASMARM__)\n  #define _CC_TYPE             _CCIAR\n  #define _PUB_SYM             PUBLIC\n  #define _EXT_SYM             EXTERN\n  #define _END                 END\n  #define _WEAK                _WEAK\n  #define _THUMB_FUNC\n  #define _THUMB_CODE          THUMB\n  #define _WORD                DCD\n  #define _SECTION(Sect, Type, AlignExp) SECTION Sect ## : ## Type ## :REORDER:NOROOT ## (AlignExp)\n  #define _ALIGN(Exp)          alignrom Exp\n  #define _PLACE_LITS\n  #define _DATA_SECT_START     DATA\n  #define _C_STARTUP           __iar_program_start\n  #define _STACK_END           sfe(CSTACK)\n  #define _RAMFUNC             SECTION_TYPE SHT_PROGBITS, SHF_WRITE | SHF_EXECINSTR\n  //\n  // .text     => Link to flash\n  // .textrw   => Link to RAM\n  // OtherSect => Usually link to RAM\n  // NOROOT    => Allows linker to throw away the function, if not referenced\n  // Alignment is 2^x\n  //\n#endif\n\n#if (_CC_TYPE == _CCIAR)\n        NAME SEGGER_RTT_ASM_ARMv7M\n#else\n        .syntax unified\n#endif\n\n#if defined (RTT_USE_ASM) && (RTT_USE_ASM == 1)\n        #define SHT_PROGBITS 0x1\n\n/*********************************************************************\n*\n*       Public / external symbols\n*\n**********************************************************************\n*/\n\n        _EXT_SYM __aeabi_memcpy\n        _EXT_SYM __aeabi_memcpy4\n        _EXT_SYM _SEGGER_RTT\n\n        _PUB_SYM SEGGER_RTT_ASM_WriteSkipNoLock\n\n/*********************************************************************\n*\n*       SEGGER_RTT_WriteSkipNoLock\n*\n*  Function description\n*    Stores a specified number of characters in SEGGER RTT\n*    control block which is then read by the host.\n*    SEGGER_RTT_WriteSkipNoLock does not lock the application and\n*    skips all data, if the data does not fit into the buffer.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used (e.g. 0 for \"Terminal\").\n*    pBuffer      Pointer to character array. Does not need to point to a \\0 terminated string.\n*    NumBytes     Number of bytes to be stored in the SEGGER RTT control block.\n*                 MUST be > 0!!!\n*                 This is done for performance reasons, so no initial check has do be done.\n*\n*  Return value\n*    1: Data has been copied\n*    0: No space, data has not been copied\n*\n*  Notes\n*    (1) If there is not enough space in the \"Up\"-buffer, all data is dropped.\n*    (2) For performance reasons this function does not call Init()\n*        and may only be called after RTT has been initialized.\n*        Either by calling SEGGER_RTT_Init() or calling another RTT API function first.\n*/\n        _SECTION(.text, CODE, 2)\n        _ALIGN(2)\n        _THUMB_FUNC\nSEGGER_RTT_ASM_WriteSkipNoLock:   // unsigned SEGGER_RTT_WriteSkipNoLock(unsigned BufferIndex, const void* pData, unsigned NumBytes) {\n        //\n        // Cases:\n        //   1) RdOff <= WrOff => Space until wrap-around is sufficient\n        //   2) RdOff <= WrOff => Space after wrap-around needed (copy in 2 chunks)\n        //   3) RdOff <  WrOff => No space in buf\n        //   4) RdOff >  WrOff => Space is sufficient\n        //   5) RdOff >  WrOff => No space in buf\n        //\n        // 1) is the most common case for large buffers and assuming that J-Link reads the data fast enough\n        //\n        // Register usage:\n        //   R0 Temporary needed as RdOff, <Tmp> register later on\n        //   R1 pData\n        //   R2 <NumBytes>\n        //   R3 <Tmp> register. Hold free for subroutine calls\n        //   R4 <Rem>\n        //   R5 pRing->pBuffer\n        //   R6 pRing (Points to active struct SEGGER_RTT_BUFFER_DOWN)\n        //   R7 WrOff\n        //\n        PUSH     {R4-R7}\n        ADD      R3,R0,R0, LSL #+1\n        LDR.W    R0,=_SEGGER_RTT                 // pRing = &_SEGGER_RTT.aUp[BufferIndex];\n        ADD      R0,R0,R3, LSL #+3\n        ADD      R6,R0,#+24\n        LDR      R0,[R6, #+16]                   // RdOff = pRing->RdOff;\n        LDR      R7,[R6, #+12]                   // WrOff = pRing->WrOff;\n        LDR      R5,[R6, #+4]                    // pRing->pBuffer\n        CMP      R7,R0\n        BCC.N    _CheckCase4                     // if (RdOff <= WrOff) {                           => Case 1), 2) or 3)\n        //\n        // Handling for case 1, later on identical to case 4\n        //\n        LDR      R3,[R6, #+8]                    //  Avail = pRing->SizeOfBuffer - WrOff - 1u;      => Space until wrap-around (assume 1 byte not usable for case that RdOff == 0)\n        SUBS     R4,R3,R7                        // <Rem> (Used in case we jump into case 2 afterwards)\n        SUBS     R3,R4,#+1                       // <Avail>\n        CMP      R3,R2\n        BCC.N    _CheckCase2                     // if (Avail >= NumBytes) {  => Case 1)?\n_Case4:\n        ADDS     R5,R7,R5                        // pBuffer += WrOff\n        ADDS     R0,R2,R7                        // v = WrOff + NumBytes\n        //\n        // 2x unrolling for the copy loop that is used most of the time\n        // This is a special optimization for small SystemView packets and makes them even faster\n        //\n        _ALIGN(2)\n_LoopCopyStraight:                               // memcpy(pRing->pBuffer + WrOff, pData, NumBytes);\n        LDRB     R3,[R1], #+1\n        STRB     R3,[R5], #+1                    // *pDest++ = *pSrc++\n        SUBS     R2,R2,#+1\n        BEQ      _CSDone\n        LDRB     R3,[R1], #+1\n        STRB     R3,[R5], #+1                    // *pDest++ = *pSrc++\n        SUBS     R2,R2,#+1\n        BNE      _LoopCopyStraight\n_CSDone:\n#if _CORE_NEEDS_DMB                              // Do not slow down cores that do not need a DMB instruction here\n        DMB                                      // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the <WrOff> in the struct\n#endif\n        STR      R0,[R6, #+12]                   // pRing->WrOff = WrOff + NumBytes;\n        MOVS     R0,#+1\n        POP      {R4-R7}\n        BX       LR                              // Return 1\n_CheckCase2:\n        ADDS     R0,R0,R3                        // Avail += RdOff; => Space incl. wrap-around\n        CMP      R0,R2\n        BCC.N    _Case3                          // if (Avail >= NumBytes) {           => Case 2? => If not, we have case 3) (does not fit)\n        //\n        // Handling for case 2\n        //\n        ADDS     R0,R7,R5                        // v = pRing->pBuffer + WrOff => Do not change pRing->pBuffer here because 2nd chunk needs org. value\n        SUBS     R2,R2,R4                        // NumBytes -= Rem;  (Rem = pRing->SizeOfBuffer - WrOff; => Space until end of buffer)\n_LoopCopyBeforeWrapAround:                       // memcpy(pRing->pBuffer + WrOff, pData, Rem); => Copy 1st chunk\n        LDRB     R3,[R1], #+1\n        STRB     R3,[R0], #+1                    // *pDest++ = *pSrc++\n        SUBS     R4,R4,#+1\n        BNE      _LoopCopyBeforeWrapAround\n        //\n        // Special case: First check that assumed RdOff == 0 calculated that last element before wrap-around could not be used\n        // But 2nd check (considering space until wrap-around and until RdOff) revealed that RdOff is not 0, so we can use the last element\n        // In this case, we may use a copy straight until buffer end anyway without needing to copy 2 chunks\n        // Therefore, check if 2nd memcpy is necessary at all\n        //\n        ADDS     R4,R2,#+0                       // Save <NumBytes> (needed as counter in loop but must be written to <WrOff> after the loop). Also use this inst to update the flags to skip 2nd loop if possible\n        BEQ.N    _No2ChunkNeeded                 // if (NumBytes) {\n_LoopCopyAfterWrapAround:                        // memcpy(pRing->pBuffer, pData + Rem, NumBytes);\n        LDRB     R3,[R1], #+1                    // pData already points to the next src byte due to copy loop increment before this loop\n        STRB     R3,[R5], #+1                    // *pDest++ = *pSrc++\n        SUBS     R2,R2,#+1\n        BNE      _LoopCopyAfterWrapAround\n_No2ChunkNeeded:\n#if _CORE_NEEDS_DMB                              // Do not slow down cores that do not need a DMB instruction here\n        DMB                                      // Cortex-M7 may delay memory writes and also change the order in which the writes happen. Therefore, make sure that all buffer writes are finished, before updating the <WrOff> in the struct\n#endif\n        STR      R4,[R6, #+12]                   // pRing->WrOff = NumBytes; => Must be written after copying data because J-Link may read control block asynchronously while writing into buffer\n        MOVS     R0,#+1\n        POP      {R4-R7}\n        BX       LR                              // Return 1\n_CheckCase4:\n        SUBS     R0,R0,R7\n        SUBS     R0,R0,#+1                       // Avail = RdOff - WrOff - 1u;\n        CMP      R0,R2\n        BCS.N    _Case4                          // if (Avail >= NumBytes) {      => Case 4) == 1) ? => If not, we have case 5) == 3) (does not fit)\n_Case3:\n        MOVS     R0,#+0\n        POP      {R4-R7}\n        BX       LR                              // Return 0\n        _PLACE_LITS\n\n#endif  // defined (RTT_USE_ASM) && (RTT_USE_ASM == 1)\n        _END\n\n/*************************** End of file ****************************/\n"
  },
  {
    "path": "lib/SEGGER_RTT/RTT/SEGGER_RTT_printf.c",
    "content": "/*********************************************************************\n*                    SEGGER Microcontroller GmbH                     *\n*                        The Embedded Experts                        *\n**********************************************************************\n*                                                                    *\n*            (c) 1995 - 2019 SEGGER Microcontroller GmbH             *\n*                                                                    *\n*       www.segger.com     Support: support@segger.com               *\n*                                                                    *\n**********************************************************************\n*                                                                    *\n*       SEGGER RTT * Real Time Transfer for embedded targets         *\n*                                                                    *\n**********************************************************************\n*                                                                    *\n* All rights reserved.                                               *\n*                                                                    *\n* SEGGER strongly recommends to not make any changes                 *\n* to or modify the source code of this software in order to stay     *\n* compatible with the RTT protocol and J-Link.                       *\n*                                                                    *\n* Redistribution and use in source and binary forms, with or         *\n* without modification, are permitted provided that the following    *\n* condition is met:                                                  *\n*                                                                    *\n* o Redistributions of source code must retain the above copyright   *\n*   notice, this condition and the following disclaimer.             *\n*                                                                    *\n* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             *\n* CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,        *\n* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           *\n* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           *\n* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *\n* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR           *\n* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT  *\n* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;    *\n* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF      *\n* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT          *\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE  *\n* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH   *\n* DAMAGE.                                                            *\n*                                                                    *\n**********************************************************************\n---------------------------END-OF-HEADER------------------------------\nFile    : SEGGER_RTT_printf.c\nPurpose : Replacement for printf to write formatted data via RTT\nRevision: $Rev: 17697 $\n----------------------------------------------------------------------\n*/\n#include \"SEGGER_RTT.h\"\n#include \"SEGGER_RTT_Conf.h\"\n\n/*********************************************************************\n*\n*       Defines, configurable\n*\n**********************************************************************\n*/\n\n#ifndef SEGGER_RTT_PRINTF_BUFFER_SIZE\n  #define SEGGER_RTT_PRINTF_BUFFER_SIZE (64)\n#endif\n\n#include <stdlib.h>\n#include <stdarg.h>\n\n\n#define FORMAT_FLAG_LEFT_JUSTIFY   (1u << 0)\n#define FORMAT_FLAG_PAD_ZERO       (1u << 1)\n#define FORMAT_FLAG_PRINT_SIGN     (1u << 2)\n#define FORMAT_FLAG_ALTERNATE      (1u << 3)\n\n/*********************************************************************\n*\n*       Types\n*\n**********************************************************************\n*/\n\ntypedef struct {\n  char*     pBuffer;\n  unsigned  BufferSize;\n  unsigned  Cnt;\n\n  int   ReturnValue;\n\n  unsigned RTTBufferIndex;\n} SEGGER_RTT_PRINTF_DESC;\n\n/*********************************************************************\n*\n*       Function prototypes\n*\n**********************************************************************\n*/\n\n/*********************************************************************\n*\n*       Static code\n*\n**********************************************************************\n*/\n/*********************************************************************\n*\n*       _StoreChar\n*/\nstatic void _StoreChar(SEGGER_RTT_PRINTF_DESC * p, char c) {\n  unsigned Cnt;\n\n  Cnt = p->Cnt;\n  if ((Cnt + 1u) <= p->BufferSize) {\n    *(p->pBuffer + Cnt) = c;\n    p->Cnt = Cnt + 1u;\n    p->ReturnValue++;\n  }\n  //\n  // Write part of string, when the buffer is full\n  //\n  if (p->Cnt == p->BufferSize) {\n    if (SEGGER_RTT_Write(p->RTTBufferIndex, p->pBuffer, p->Cnt) != p->Cnt) {\n      p->ReturnValue = -1;\n    } else {\n      p->Cnt = 0u;\n    }\n  }\n}\n\n/*********************************************************************\n*\n*       _PrintUnsigned\n*/\nstatic void _PrintUnsigned(SEGGER_RTT_PRINTF_DESC * pBufferDesc, unsigned v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) {\n  static const char _aV2C[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };\n  unsigned Div;\n  unsigned Digit;\n  unsigned Number;\n  unsigned Width;\n  char c;\n\n  Number = v;\n  Digit = 1u;\n  //\n  // Get actual field width\n  //\n  Width = 1u;\n  while (Number >= Base) {\n    Number = (Number / Base);\n    Width++;\n  }\n  if (NumDigits > Width) {\n    Width = NumDigits;\n  }\n  //\n  // Print leading chars if necessary\n  //\n  if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) {\n    if (FieldWidth != 0u) {\n      if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && (NumDigits == 0u)) {\n        c = '0';\n      } else {\n        c = ' ';\n      }\n      while ((FieldWidth != 0u) && (Width < FieldWidth)) {\n        FieldWidth--;\n        _StoreChar(pBufferDesc, c);\n        if (pBufferDesc->ReturnValue < 0) {\n          break;\n        }\n      }\n    }\n  }\n  if (pBufferDesc->ReturnValue >= 0) {\n    //\n    // Compute Digit.\n    // Loop until Digit has the value of the highest digit required.\n    // Example: If the output is 345 (Base 10), loop 2 times until Digit is 100.\n    //\n    while (1) {\n      if (NumDigits > 1u) {       // User specified a min number of digits to print? => Make sure we loop at least that often, before checking anything else (> 1 check avoids problems with NumDigits being signed / unsigned)\n        NumDigits--;\n      } else {\n        Div = v / Digit;\n        if (Div < Base) {        // Is our divider big enough to extract the highest digit from value? => Done\n          break;\n        }\n      }\n      Digit *= Base;\n    }\n    //\n    // Output digits\n    //\n    do {\n      Div = v / Digit;\n      v -= Div * Digit;\n      _StoreChar(pBufferDesc, _aV2C[Div]);\n      if (pBufferDesc->ReturnValue < 0) {\n        break;\n      }\n      Digit /= Base;\n    } while (Digit);\n    //\n    // Print trailing spaces if necessary\n    //\n    if ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == FORMAT_FLAG_LEFT_JUSTIFY) {\n      if (FieldWidth != 0u) {\n        while ((FieldWidth != 0u) && (Width < FieldWidth)) {\n          FieldWidth--;\n          _StoreChar(pBufferDesc, ' ');\n          if (pBufferDesc->ReturnValue < 0) {\n            break;\n          }\n        }\n      }\n    }\n  }\n}\n\n/*********************************************************************\n*\n*       _PrintInt\n*/\nstatic void _PrintInt(SEGGER_RTT_PRINTF_DESC * pBufferDesc, int v, unsigned Base, unsigned NumDigits, unsigned FieldWidth, unsigned FormatFlags) {\n  unsigned Width;\n  int Number;\n\n  Number = (v < 0) ? -v : v;\n\n  //\n  // Get actual field width\n  //\n  Width = 1u;\n  while (Number >= (int)Base) {\n    Number = (Number / (int)Base);\n    Width++;\n  }\n  if (NumDigits > Width) {\n    Width = NumDigits;\n  }\n  if ((FieldWidth > 0u) && ((v < 0) || ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN))) {\n    FieldWidth--;\n  }\n\n  //\n  // Print leading spaces if necessary\n  //\n  if ((((FormatFlags & FORMAT_FLAG_PAD_ZERO) == 0u) || (NumDigits != 0u)) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u)) {\n    if (FieldWidth != 0u) {\n      while ((FieldWidth != 0u) && (Width < FieldWidth)) {\n        FieldWidth--;\n        _StoreChar(pBufferDesc, ' ');\n        if (pBufferDesc->ReturnValue < 0) {\n          break;\n        }\n      }\n    }\n  }\n  //\n  // Print sign if necessary\n  //\n  if (pBufferDesc->ReturnValue >= 0) {\n    if (v < 0) {\n      v = -v;\n      _StoreChar(pBufferDesc, '-');\n    } else if ((FormatFlags & FORMAT_FLAG_PRINT_SIGN) == FORMAT_FLAG_PRINT_SIGN) {\n      _StoreChar(pBufferDesc, '+');\n    } else {\n\n    }\n    if (pBufferDesc->ReturnValue >= 0) {\n      //\n      // Print leading zeros if necessary\n      //\n      if (((FormatFlags & FORMAT_FLAG_PAD_ZERO) == FORMAT_FLAG_PAD_ZERO) && ((FormatFlags & FORMAT_FLAG_LEFT_JUSTIFY) == 0u) && (NumDigits == 0u)) {\n        if (FieldWidth != 0u) {\n          while ((FieldWidth != 0u) && (Width < FieldWidth)) {\n            FieldWidth--;\n            _StoreChar(pBufferDesc, '0');\n            if (pBufferDesc->ReturnValue < 0) {\n              break;\n            }\n          }\n        }\n      }\n      if (pBufferDesc->ReturnValue >= 0) {\n        //\n        // Print number without sign\n        //\n        _PrintUnsigned(pBufferDesc, (unsigned)v, Base, NumDigits, FieldWidth, FormatFlags);\n      }\n    }\n  }\n}\n\n/*********************************************************************\n*\n*       Public code\n*\n**********************************************************************\n*/\n/*********************************************************************\n*\n*       SEGGER_RTT_vprintf\n*\n*  Function description\n*    Stores a formatted string in SEGGER RTT control block.\n*    This data is read by the host.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used. (e.g. 0 for \"Terminal\")\n*    sFormat      Pointer to format string\n*    pParamList   Pointer to the list of arguments for the format string\n*\n*  Return values\n*    >= 0:  Number of bytes which have been stored in the \"Up\"-buffer.\n*     < 0:  Error\n*/\nint SEGGER_RTT_vprintf(unsigned BufferIndex, const char * sFormat, va_list * pParamList) {\n  char c;\n  SEGGER_RTT_PRINTF_DESC BufferDesc;\n  int v;\n  unsigned NumDigits;\n  unsigned FormatFlags;\n  unsigned FieldWidth;\n  char acBuffer[SEGGER_RTT_PRINTF_BUFFER_SIZE];\n\n  BufferDesc.pBuffer        = acBuffer;\n  BufferDesc.BufferSize     = SEGGER_RTT_PRINTF_BUFFER_SIZE;\n  BufferDesc.Cnt            = 0u;\n  BufferDesc.RTTBufferIndex = BufferIndex;\n  BufferDesc.ReturnValue    = 0;\n\n  do {\n    c = *sFormat;\n    sFormat++;\n    if (c == 0u) {\n      break;\n    }\n    if (c == '%') {\n      //\n      // Filter out flags\n      //\n      FormatFlags = 0u;\n      v = 1;\n      do {\n        c = *sFormat;\n        switch (c) {\n        case '-': FormatFlags |= FORMAT_FLAG_LEFT_JUSTIFY; sFormat++; break;\n        case '0': FormatFlags |= FORMAT_FLAG_PAD_ZERO;     sFormat++; break;\n        case '+': FormatFlags |= FORMAT_FLAG_PRINT_SIGN;   sFormat++; break;\n        case '#': FormatFlags |= FORMAT_FLAG_ALTERNATE;    sFormat++; break;\n        default:  v = 0; break;\n        }\n      } while (v);\n      //\n      // filter out field with\n      //\n      FieldWidth = 0u;\n      do {\n        c = *sFormat;\n        if ((c < '0') || (c > '9')) {\n          break;\n        }\n        sFormat++;\n        FieldWidth = (FieldWidth * 10u) + ((unsigned)c - '0');\n      } while (1);\n\n      //\n      // Filter out precision (number of digits to display)\n      //\n      NumDigits = 0u;\n      c = *sFormat;\n      if (c == '.') {\n        sFormat++;\n        do {\n          c = *sFormat;\n          if ((c < '0') || (c > '9')) {\n            break;\n          }\n          sFormat++;\n          NumDigits = NumDigits * 10u + ((unsigned)c - '0');\n        } while (1);\n      }\n      //\n      // Filter out length modifier\n      //\n      c = *sFormat;\n      do {\n        if ((c == 'l') || (c == 'h')) {\n          sFormat++;\n          c = *sFormat;\n        } else {\n          break;\n        }\n      } while (1);\n      //\n      // Handle specifiers\n      //\n      switch (c) {\n      case 'c': {\n        char c0;\n        v = va_arg(*pParamList, int);\n        c0 = (char)v;\n        _StoreChar(&BufferDesc, c0);\n        break;\n      }\n      case 'd':\n        v = va_arg(*pParamList, int);\n        _PrintInt(&BufferDesc, v, 10u, NumDigits, FieldWidth, FormatFlags);\n        break;\n      case 'u':\n        v = va_arg(*pParamList, int);\n        _PrintUnsigned(&BufferDesc, (unsigned)v, 10u, NumDigits, FieldWidth, FormatFlags);\n        break;\n      case 'x':\n      case 'X':\n        v = va_arg(*pParamList, int);\n        _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, NumDigits, FieldWidth, FormatFlags);\n        break;\n      case 's':\n        {\n          const char * s = va_arg(*pParamList, const char *);\n          do {\n            c = *s;\n            s++;\n            if (c == '\\0') {\n              break;\n            }\n           _StoreChar(&BufferDesc, c);\n          } while (BufferDesc.ReturnValue >= 0);\n        }\n        break;\n      case 'p':\n        v = va_arg(*pParamList, int);\n        _PrintUnsigned(&BufferDesc, (unsigned)v, 16u, 8u, 8u, 0u);\n        break;\n      case '%':\n        _StoreChar(&BufferDesc, '%');\n        break;\n      default:\n        break;\n      }\n      sFormat++;\n    } else {\n      _StoreChar(&BufferDesc, c);\n    }\n  } while (BufferDesc.ReturnValue >= 0);\n\n  if (BufferDesc.ReturnValue > 0) {\n    //\n    // Write remaining data, if any\n    //\n    if (BufferDesc.Cnt != 0u) {\n      SEGGER_RTT_Write(BufferIndex, acBuffer, BufferDesc.Cnt);\n    }\n    BufferDesc.ReturnValue += (int)BufferDesc.Cnt;\n  }\n  return BufferDesc.ReturnValue;\n}\n\n/*********************************************************************\n*\n*       SEGGER_RTT_printf\n*\n*  Function description\n*    Stores a formatted string in SEGGER RTT control block.\n*    This data is read by the host.\n*\n*  Parameters\n*    BufferIndex  Index of \"Up\"-buffer to be used. (e.g. 0 for \"Terminal\")\n*    sFormat      Pointer to format string, followed by the arguments for conversion\n*\n*  Return values\n*    >= 0:  Number of bytes which have been stored in the \"Up\"-buffer.\n*     < 0:  Error\n*\n*  Notes\n*    (1) Conversion specifications have following syntax:\n*          %[flags][FieldWidth][.Precision]ConversionSpecifier\n*    (2) Supported flags:\n*          -: Left justify within the field width\n*          +: Always print sign extension for signed conversions\n*          0: Pad with 0 instead of spaces. Ignored when using '-'-flag or precision\n*        Supported conversion specifiers:\n*          c: Print the argument as one char\n*          d: Print the argument as a signed integer\n*          u: Print the argument as an unsigned integer\n*          x: Print the argument as an hexadecimal integer\n*          s: Print the string pointed to by the argument\n*          p: Print the argument as an 8-digit hexadecimal integer. (Argument shall be a pointer to void.)\n*/\nint SEGGER_RTT_printf(unsigned BufferIndex, const char * sFormat, ...) {\n  int r;\n  va_list ParamList;\n\n  va_start(ParamList, sFormat);\n  r = SEGGER_RTT_vprintf(BufferIndex, sFormat, &ParamList);\n  va_end(ParamList);\n  return r;\n}\n/*************************** End of file ****************************/\n"
  },
  {
    "path": "lib/embedded-cli/embedded_cli.h",
    "content": "/**\n * This header was automatically built using\n * embedded_cli.h and embedded_cli.c\n * @date 2022-11-03\n *\n * MIT License\n *\n * Copyright (c) 2021 Sviatoslav Kokurin (funbiscuit)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n#ifndef EMBEDDED_CLI_H\n#define EMBEDDED_CLI_H\n\n\n#ifdef __cplusplus\n\nextern \"C\" {\n#else\n\n#include <stdbool.h>\n\n#endif\n\n// cstdint is available only since C++11, so use C header\n#include <stdint.h>\n\n// used for proper alignment of cli buffer\n#if UINTPTR_MAX == 0xFFFF\n#define CLI_UINT uint16_t\n#elif UINTPTR_MAX == 0xFFFFFFFF\n#define CLI_UINT uint32_t\n#elif UINTPTR_MAX == 0xFFFFFFFFFFFFFFFFu\n#define CLI_UINT uint64_t\n#else\n#error unsupported pointer size\n#endif\n\n#define CLI_UINT_SIZE (sizeof(CLI_UINT))\n// convert size in bytes to size in terms of CLI_UINTs (rounded up\n// if bytes is not divisible by size of single CLI_UINT)\n#define BYTES_TO_CLI_UINTS(bytes) \\\n  (((bytes) + CLI_UINT_SIZE - 1)/CLI_UINT_SIZE)\n\ntypedef struct CliCommand CliCommand;\ntypedef struct CliCommandBinding CliCommandBinding;\ntypedef struct EmbeddedCli EmbeddedCli;\ntypedef struct EmbeddedCliConfig EmbeddedCliConfig;\n\n\nstruct CliCommand {\n    /**\n     * Name of the command.\n     * In command \"set led 1 1\" \"set\" is name\n     */\n    const char *name;\n\n    /**\n     * String of arguments of the command.\n     * In command \"set led 1 1\" \"led 1 1\" is string of arguments\n     * Is ended with double 0x00 char\n     * Use tokenize functions to easily get individual tokens\n     */\n    char *args;\n};\n\n/**\n * Struct to describe binding of command to function and\n */\nstruct CliCommandBinding {\n    /**\n     * Name of command to bind. Should not be NULL.\n     */\n    const char *name;\n\n    /**\n     * Help string that will be displayed when \"help <cmd>\" is executed.\n     * Can have multiple lines separated with \"\\r\\n\"\n     * Can be NULL if no help is provided.\n     */\n    const char *help;\n\n    /**\n     * Flag to perform tokenization before calling binding function.\n     */\n    bool tokenizeArgs;\n\n    /**\n     * Pointer to any specific app context that is required for this binding.\n     * It will be provided in binding callback.\n     */\n    void *context;\n\n    /**\n     * Binding function for when command is received.\n     * If null, default callback (onCommand) will be called.\n     * @param cli - pointer to cli that is calling this binding\n     * @param args - string of args (if tokenizeArgs is false) or tokens otherwise\n     * @param context\n     */\n    void (*binding)(EmbeddedCli *cli, char *args, void *context);\n};\n\nstruct EmbeddedCli {\n    /**\n     * Should write char to connection\n     * @param cli - pointer to cli that executed this function\n     * @param c   - actual character to write\n     */\n    void (*writeChar)(EmbeddedCli *cli, char c);\n\n    /**\n     * Called when command is received and command not found in list of\n     * command bindings (or binding function is null).\n     * @param cli     - pointer to cli that executed this function\n     * @param command - pointer to received command\n     */\n    void (*onCommand)(EmbeddedCli *cli, CliCommand *command);\n\n    /**\n     * Can be used by for any application context\n     */\n    void *appContext;\n\n    /**\n     * Pointer to actual implementation, do not use.\n     */\n    void *_impl;\n};\n\n/**\n * Configuration to create CLI\n */\nstruct EmbeddedCliConfig {\n    /**\n     * Size of buffer that is used to store characters until they're processed\n     */\n    uint16_t rxBufferSize;\n\n    /**\n     * Size of buffer that is used to store current input that is not yet\n     * sended as command (return not pressed yet)\n     */\n    uint16_t cmdBufferSize;\n\n    /**\n     * Size of buffer that is used to store previously entered commands\n     * Only unique commands are stored in buffer. If buffer is smaller than\n     * entered command (including arguments), command is discarded from history\n     */\n    uint16_t historyBufferSize;\n\n    /**\n     * Maximum amount of bindings that can be added via addBinding function.\n     * Cli increases takes extra bindings for internal commands:\n     * - help\n     */\n    uint16_t maxBindingCount;\n\n    /**\n     * Buffer to use for cli and all internal structures. If NULL, memory will\n     * be allocated dynamically. Otherwise this buffer is used and no\n     * allocations are made\n     */\n    CLI_UINT *cliBuffer;\n\n    /**\n     * Size of buffer for cli and internal structures (in bytes).\n     */\n    uint16_t cliBufferSize;\n\n    /**\n     * Whether autocompletion should be enabled.\n     * If false, autocompletion is disabled but you still can use 'tab' to\n     * complete current command manually.\n     */\n    bool enableAutoComplete;\n};\n\n/**\n * Returns pointer to default configuration for cli creation. It is safe to\n * modify it and then send to embeddedCliNew().\n * Returned structure is always the same so do not free and try to use it\n * immediately.\n * Default values:\n * <ul>\n * <li>rxBufferSize = 64</li>\n * <li>cmdBufferSize = 64</li>\n * <li>historyBufferSize = 128</li>\n * <li>cliBuffer = NULL (use dynamic allocation)</li>\n * <li>cliBufferSize = 0</li>\n * <li>maxBindingCount = 8</li>\n * <li>enableAutoComplete = true</li>\n * </ul>\n * @return configuration for cli creation\n */\nEmbeddedCliConfig *embeddedCliDefaultConfig(void);\n\n/**\n * Returns how many space in config buffer is required for cli creation\n * If you provide buffer with less space, embeddedCliNew will return NULL\n * This amount will always be divisible by CLI_UINT_SIZE so allocated buffer\n * and internal structures can be properly aligned\n * @param config\n * @return\n */\nuint16_t embeddedCliRequiredSize(EmbeddedCliConfig *config);\n\n/**\n * Create new CLI.\n * Memory is allocated dynamically if cliBuffer in config is NULL.\n * After CLI is created, override function pointers to start using it\n * @param config - config for cli creation\n * @return pointer to created CLI\n */\nEmbeddedCli *embeddedCliNew(EmbeddedCliConfig *config);\n\n/**\n * Same as calling embeddedCliNew with default config.\n * @return\n */\nEmbeddedCli *embeddedCliNewDefault(void);\n\n/**\n * Receive character and put it to internal buffer\n * Actual processing is done inside embeddedCliProcess\n * You can call this function from something like interrupt service routine,\n * just make sure that you call it only from single place. Otherwise input\n * might get corrupted\n * @param cli\n * @param c   - received char\n */\nvoid embeddedCliReceiveChar(EmbeddedCli *cli, char c);\n\n/**\n * Process rx/tx buffers. Command callbacks are called from here\n * @param cli\n */\nvoid embeddedCliProcess(EmbeddedCli *cli);\n\n/**\n * Add specified binding to list of bindings. If list is already full, binding\n * is not added and false is returned\n * @param cli\n * @param binding\n * @return true if binding was added, false otherwise\n */\nbool embeddedCliAddBinding(EmbeddedCli *cli, CliCommandBinding binding);\n\n/**\n * Print specified string and account for currently entered but not submitted\n * command.\n * Current command is deleted, provided string is printed (with new line) after\n * that current command is printed again, so user can continue typing it.\n * @param cli\n * @param string\n */\nvoid embeddedCliPrint(EmbeddedCli *cli, const char *string);\n\n/**\n * Free allocated for cli memory\n * @param cli\n */\nvoid embeddedCliFree(EmbeddedCli *cli);\n\n/**\n * Perform tokenization of arguments string. Original string is modified and\n * should not be used directly (only inside other token functions).\n * Individual tokens are separated by single 0x00 char, double 0x00 is put at\n * the end of token list. After calling this function, you can use other\n * token functions to get individual tokens and token count.\n *\n * Important: Call this function only once. Otherwise information will be lost if\n * more than one token existed\n * @param args - string to tokenize (must have extra writable char after 0x00)\n * @return\n */\nvoid embeddedCliTokenizeArgs(char *args);\n\n/**\n * Return specific token from tokenized string\n * @param tokenizedStr\n * @param pos (counted from 1)\n * @return token\n */\nconst char *embeddedCliGetToken(const char *tokenizedStr, uint16_t pos);\n\n/**\n * Same as embeddedCliGetToken but works on non-const buffer\n * @param tokenizedStr\n * @param pos (counted from 1)\n * @return token\n */\nchar *embeddedCliGetTokenVariable(char *tokenizedStr, uint16_t pos);\n\n/**\n * Find token in provided tokens string and return its position (counted from 1)\n * If no such token is found - 0 is returned.\n * @param tokenizedStr\n * @param token - token to find\n * @return position (increased by 1) or zero if no such token found\n */\nuint16_t embeddedCliFindToken(const char *tokenizedStr, const char *token);\n\n/**\n * Return number of tokens in tokenized string\n * @param tokenizedStr\n * @return number of tokens\n */\nuint16_t embeddedCliGetTokenCount(const char *tokenizedStr);\n\n#ifdef __cplusplus\n}\n#endif\n\n\n#endif //EMBEDDED_CLI_H\n\n\n#ifdef EMBEDDED_CLI_IMPL\n#ifndef EMBEDDED_CLI_IMPL_GUARD\n#define EMBEDDED_CLI_IMPL_GUARD\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#include <stdlib.h>\n#include <string.h>\n\n\n#define CLI_TOKEN_NPOS 0xffff\n\n#define UNUSED(x) (void)x\n\n#define PREPARE_IMPL(t) \\\n  EmbeddedCliImpl* impl = (EmbeddedCliImpl*)t->_impl\n\n#define IS_FLAG_SET(flags, flag) (((flags) & (flag)) != 0)\n\n#define SET_FLAG(flags, flag) ((flags) |= (flag))\n\n#define UNSET_U8FLAG(flags, flag) ((flags) &= (uint8_t) ~(flag))\n\n/**\n * Marks binding as candidate for autocompletion\n * This flag is updated each time getAutocompletedCommand is called\n */\n#define BINDING_FLAG_AUTOCOMPLETE 1u\n\n/**\n * Indicates that rx buffer overflow happened. In such case last command\n * that wasn't finished (no \\r or \\n were received) will be discarded\n */\n#define CLI_FLAG_OVERFLOW 0x01u\n\n/**\n * Indicates that initialization is completed. Initialization is completed in\n * first call to process and needed, for example, to print invitation message.\n */\n#define CLI_FLAG_INIT_COMPLETE 0x02u\n\n/**\n * Indicates that CLI structure and internal structures were allocated with\n * malloc and should bre freed\n */\n#define CLI_FLAG_ALLOCATED 0x04u\n\n/**\n * Indicates that CLI structure and internal structures were allocated with\n * malloc and should bre freed\n */\n#define CLI_FLAG_ESCAPE_MODE 0x08u\n\n/**\n * Indicates that CLI in mode when it will print directly to output without\n * clear of current command and printing it back\n */\n#define CLI_FLAG_DIRECT_PRINT 0x10u\n\n/**\n * Indicates that live autocompletion is enabled\n */\n#define CLI_FLAG_AUTOCOMPLETE_ENABLED 0x20u\n\ntypedef struct EmbeddedCliImpl EmbeddedCliImpl;\ntypedef struct AutocompletedCommand AutocompletedCommand;\ntypedef struct FifoBuf FifoBuf;\ntypedef struct CliHistory CliHistory;\n\nstruct FifoBuf {\n    char *buf;\n    /**\n     * Position of first element in buffer. From this position elements are taken\n     */\n    uint16_t front;\n    /**\n     * Position after last element. At this position new elements are inserted\n     */\n    uint16_t back;\n    /**\n     * Size of buffer\n     */\n    uint16_t size;\n};\n\nstruct CliHistory {\n    /**\n     * Items in buffer are separated by null-chars\n     */\n    char *buf;\n\n    /**\n     * Total size of buffer\n     */\n    uint16_t bufferSize;\n\n    /**\n     * Index of currently selected element. This allows to navigate history\n     * After command is sent, current element is reset to 0 (no element)\n     */\n    uint16_t current;\n\n    /**\n     * Number of items in buffer\n     * Items are counted from top to bottom (and are 1 based).\n     * So the most recent item is 1 and the oldest is itemCount.\n     */\n    uint16_t itemsCount;\n};\n\nstruct EmbeddedCliImpl {\n    /**\n     * Invitation string. Is printed at the beginning of each line with user\n     * input\n     */\n    const char *invitation;\n\n    CliHistory history;\n\n    /**\n     * Buffer for storing received chars.\n     * Chars are stored in FIFO mode.\n     */\n    FifoBuf rxBuffer;\n\n    /**\n     * Buffer for current command\n     */\n    char *cmdBuffer;\n\n    /**\n     * Size of current command\n     */\n    uint16_t cmdSize;\n\n    /**\n     * Total size of command buffer\n     */\n    uint16_t cmdMaxSize;\n\n    CliCommandBinding *bindings;\n\n    /**\n     * Flags for each binding. Sizes are the same as for bindings array\n     */\n    uint8_t *bindingsFlags;\n\n    uint16_t bindingsCount;\n\n    uint16_t maxBindingsCount;\n\n    /**\n     * Total length of input line. This doesn't include invitation but\n     * includes current command and its live autocompletion\n     */\n    uint16_t inputLineLength;\n\n    /**\n     * Stores last character that was processed.\n     */\n    char lastChar;\n\n    /**\n     * Flags are defined as CLI_FLAG_*\n     */\n    uint8_t flags;\n};\n\nstruct AutocompletedCommand {\n    /**\n     * Name of autocompleted command (or first candidate for autocompletion if\n     * there are multiple candidates).\n     * NULL if autocomplete not possible.\n     */\n    const char *firstCandidate;\n\n    /**\n     * Number of characters that can be completed safely. For example, if there\n     * are two possible commands \"get-led\" and \"get-adc\", then for prefix \"g\"\n     * autocompletedLen will be 4. If there are only one candidate, this number\n     * is always equal to length of the command.\n     */\n    uint16_t autocompletedLen;\n\n    /**\n     * Total number of candidates for autocompletion\n     */\n    uint16_t candidateCount;\n};\n\nstatic EmbeddedCliConfig defaultConfig;\n\n/**\n * Number of commands that cli adds. Commands:\n * - help\n */\nstatic const uint16_t cliInternalBindingCount = 1;\n\nstatic const char *lineBreak = \"\\r\\n\";\n\n/**\n * Navigate through command history back and forth. If navigateUp is true,\n * navigate to older commands, otherwise navigate to newer.\n * When history end is reached, nothing happens.\n * @param cli\n * @param navigateUp\n */\nstatic void navigateHistory(EmbeddedCli *cli, bool navigateUp);\n\n/**\n * Process escaped character. After receiving ESC+[ sequence, all chars up to\n * ending character are sent to this function\n * @param cli\n * @param c\n */\nstatic void onEscapedInput(EmbeddedCli *cli, char c);\n\n/**\n * Process input character. Character is valid displayable char and should be\n * added to current command string and displayed to client.\n * @param cli\n * @param c\n */\nstatic void onCharInput(EmbeddedCli *cli, char c);\n\n/**\n * Process control character (like \\r or \\n) possibly altering state of current\n * command or executing onCommand callback.\n * @param cli\n * @param c\n */\nstatic void onControlInput(EmbeddedCli *cli, char c);\n\n/**\n * Parse command in buffer and execute callback\n * @param cli\n */\nstatic void parseCommand(EmbeddedCli *cli);\n\n/**\n * Setup bindings for internal commands, like help\n * @param cli\n */\nstatic void initInternalBindings(EmbeddedCli *cli);\n\n/**\n * Show help for given tokens (or default help if no tokens)\n * @param cli\n * @param tokens\n * @param context - not used\n */\nstatic void onHelp(EmbeddedCli *cli, char *tokens, void *context);\n\n/**\n * Show error about unknown command\n * @param cli\n * @param name\n */\nstatic void onUnknownCommand(EmbeddedCli *cli, const char *name);\n\n/**\n * Return autocompleted command for given prefix.\n * Prefix is compared to all known command bindings and autocompleted result\n * is returned\n * @param cli\n * @param prefix\n * @return\n */\nstatic AutocompletedCommand getAutocompletedCommand(EmbeddedCli *cli, const char *prefix);\n\n/**\n * Prints autocompletion result while keeping current command unchanged\n * Prints only if autocompletion is present and only one candidate exists.\n * @param cli\n */\nstatic void printLiveAutocompletion(EmbeddedCli *cli);\n\n/**\n * Handles autocomplete request. If autocomplete possible - fills current\n * command with autocompleted command. When multiple commands satisfy entered\n * prefix, they are printed to output.\n * @param cli\n */\nstatic void onAutocompleteRequest(EmbeddedCli *cli);\n\n/**\n * Removes all input from current line (replaces it with whitespaces)\n * And places cursor at the beginning of the line\n * @param cli\n */\nstatic void clearCurrentLine(EmbeddedCli *cli);\n\n/**\n * Write given string to cli output\n * @param cli\n * @param str\n */\nstatic void writeToOutput(EmbeddedCli *cli, const char *str);\n\n/**\n * Returns true if provided char is a supported control char:\n * \\r, \\n, \\b or 0x7F (treated as \\b)\n * @param c\n * @return\n */\nstatic bool isControlChar(char c);\n\n/**\n * Returns true if provided char is a valid displayable character:\n * a-z, A-Z, 0-9, whitespace, punctuation, etc.\n * Currently only ASCII is supported\n * @param c\n * @return\n */\nstatic bool isDisplayableChar(char c);\n\n/**\n * How many elements are currently available in buffer\n * @param buffer\n * @return number of elements\n */\nstatic uint16_t fifoBufAvailable(FifoBuf *buffer);\n\n/**\n * Return first character from buffer and remove it from buffer\n * Buffer must be non-empty, otherwise 0 is returned\n * @param buffer\n * @return\n */\nstatic char fifoBufPop(FifoBuf *buffer);\n\n/**\n * Push character into fifo buffer. If there is no space left, character is\n * discarded and false is returned\n * @param buffer\n * @param a - character to add\n * @return true if char was added to buffer, false otherwise\n */\nstatic bool fifoBufPush(FifoBuf *buffer, char a);\n\n/**\n * Copy provided string to the history buffer.\n * If it is already inside history, it will be removed from it and added again.\n * So after addition, it will always be on top\n * If available size is not enough (and total size is enough) old elements will\n * be removed from history so this item can be put to it\n * @param history\n * @param str\n * @return true if string was put in history\n */\nstatic bool historyPut(CliHistory *history, const char *str);\n\n/**\n * Get item from history. Items are counted from 1 so if item is 0 or greater\n * than itemCount, NULL is returned\n * @param history\n * @param item\n * @return true if string was put in history\n */\nstatic const char *historyGet(CliHistory *history, uint16_t item);\n\n/**\n * Remove specific item from history\n * @param history\n * @param str - string to remove\n * @return\n */\nstatic void historyRemove(CliHistory *history, const char *str);\n\n/**\n * Return position (index of first char) of specified token\n * @param tokenizedStr - tokenized string (separated by \\0 with\n * \\0\\0 at the end)\n * @param pos - token position (counted from 1)\n * @return index of first char of specified token\n */\nstatic uint16_t getTokenPosition(const char *tokenizedStr, uint16_t pos);\n\nEmbeddedCliConfig *embeddedCliDefaultConfig(void) {\n    defaultConfig.rxBufferSize = 64;\n    defaultConfig.cmdBufferSize = 64;\n    defaultConfig.historyBufferSize = 128;\n    defaultConfig.cliBuffer = NULL;\n    defaultConfig.cliBufferSize = 0;\n    defaultConfig.maxBindingCount = 8;\n    defaultConfig.enableAutoComplete = true;\n    return &defaultConfig;\n}\n\nuint16_t embeddedCliRequiredSize(EmbeddedCliConfig *config) {\n    uint16_t bindingCount = (uint16_t) (config->maxBindingCount + cliInternalBindingCount);\n    return (uint16_t) (CLI_UINT_SIZE * (\n            BYTES_TO_CLI_UINTS(sizeof(EmbeddedCli)) +\n            BYTES_TO_CLI_UINTS(sizeof(EmbeddedCliImpl)) +\n            BYTES_TO_CLI_UINTS(config->rxBufferSize * sizeof(char)) +\n            BYTES_TO_CLI_UINTS(config->cmdBufferSize * sizeof(char)) +\n            BYTES_TO_CLI_UINTS(config->historyBufferSize * sizeof(char)) +\n            BYTES_TO_CLI_UINTS(bindingCount * sizeof(CliCommandBinding)) +\n            BYTES_TO_CLI_UINTS(bindingCount * sizeof(uint8_t))));\n}\n\nEmbeddedCli *embeddedCliNew(EmbeddedCliConfig *config) {\n    EmbeddedCli *cli = NULL;\n\n    uint16_t bindingCount = (uint16_t) (config->maxBindingCount + cliInternalBindingCount);\n\n    size_t totalSize = embeddedCliRequiredSize(config);\n\n    bool allocated = false;\n    if (config->cliBuffer == NULL) {\n//        config->cliBuffer = (CLI_UINT *) malloc(totalSize); // malloc guarantees alignment.\n        if (config->cliBuffer == NULL)\n            return NULL;\n        allocated = true;\n    } else if (config->cliBufferSize < totalSize) {\n        return NULL;\n    }\n\n    CLI_UINT *buf = config->cliBuffer;\n\n    memset(buf, 0, totalSize);\n\n    cli = (EmbeddedCli *) buf;\n    buf += BYTES_TO_CLI_UINTS(sizeof(EmbeddedCli));\n\n    cli->_impl = (EmbeddedCliImpl *) buf;\n    buf += BYTES_TO_CLI_UINTS(sizeof(EmbeddedCliImpl));\n\n    PREPARE_IMPL(cli);\n    impl->rxBuffer.buf = (char *) buf;\n    buf += BYTES_TO_CLI_UINTS(config->rxBufferSize * sizeof(char));\n\n    impl->cmdBuffer = (char *) buf;\n    buf += BYTES_TO_CLI_UINTS(config->cmdBufferSize * sizeof(char));\n\n    impl->bindings = (CliCommandBinding *) buf;\n    buf += BYTES_TO_CLI_UINTS(bindingCount * sizeof(CliCommandBinding));\n\n    impl->bindingsFlags = (uint8_t *) buf;\n    buf += BYTES_TO_CLI_UINTS(bindingCount);\n\n    impl->history.buf = (char *) buf;\n    impl->history.bufferSize = config->historyBufferSize;\n\n    if (allocated)\n        SET_FLAG(impl->flags, CLI_FLAG_ALLOCATED);\n\n    if (config->enableAutoComplete)\n        SET_FLAG(impl->flags, CLI_FLAG_AUTOCOMPLETE_ENABLED);\n\n    impl->rxBuffer.size = config->rxBufferSize;\n    impl->rxBuffer.front = 0;\n    impl->rxBuffer.back = 0;\n    impl->cmdMaxSize = config->cmdBufferSize;\n    impl->bindingsCount = 0;\n    impl->maxBindingsCount = (uint16_t) (config->maxBindingCount + cliInternalBindingCount);\n    impl->lastChar = '\\0';\n    impl->invitation = \"> \";\n\n    initInternalBindings(cli);\n\n    return cli;\n}\n\nEmbeddedCli *embeddedCliNewDefault(void) {\n    return embeddedCliNew(embeddedCliDefaultConfig());\n}\n\nvoid embeddedCliReceiveChar(EmbeddedCli *cli, char c) {\n    PREPARE_IMPL(cli);\n\n    if (!fifoBufPush(&impl->rxBuffer, c)) {\n        SET_FLAG(impl->flags, CLI_FLAG_OVERFLOW);\n    }\n}\n\nvoid embeddedCliProcess(EmbeddedCli *cli) {\n    if (cli->writeChar == NULL)\n        return;\n\n    PREPARE_IMPL(cli);\n\n\n    if (!IS_FLAG_SET(impl->flags, CLI_FLAG_INIT_COMPLETE)) {\n        SET_FLAG(impl->flags, CLI_FLAG_INIT_COMPLETE);\n        writeToOutput(cli, impl->invitation);\n    }\n\n    while (fifoBufAvailable(&impl->rxBuffer)) {\n        char c = fifoBufPop(&impl->rxBuffer);\n\n        if (IS_FLAG_SET(impl->flags, CLI_FLAG_ESCAPE_MODE)) {\n            onEscapedInput(cli, c);\n        } else if (impl->lastChar == 0x1B && c == '[') {\n            //enter escape mode\n            SET_FLAG(impl->flags, CLI_FLAG_ESCAPE_MODE);\n        } else if (isControlChar(c)) {\n            onControlInput(cli, c);\n        } else if (isDisplayableChar(c)) {\n            onCharInput(cli, c);\n        }\n\n        printLiveAutocompletion(cli);\n\n        impl->lastChar = c;\n    }\n\n    // discard unfinished command if overflow happened\n    if (IS_FLAG_SET(impl->flags, CLI_FLAG_OVERFLOW)) {\n        impl->cmdSize = 0;\n        impl->cmdBuffer[impl->cmdSize] = '\\0';\n        UNSET_U8FLAG(impl->flags, CLI_FLAG_OVERFLOW);\n    }\n}\n\nbool embeddedCliAddBinding(EmbeddedCli *cli, CliCommandBinding binding) {\n    PREPARE_IMPL(cli);\n    if (impl->bindingsCount == impl->maxBindingsCount)\n        return false;\n\n    impl->bindings[impl->bindingsCount] = binding;\n\n    ++impl->bindingsCount;\n    return true;\n}\n\nvoid embeddedCliPrint(EmbeddedCli *cli, const char *string) {\n    if (cli->writeChar == NULL)\n        return;\n\n    PREPARE_IMPL(cli);\n\n    // remove chars for autocompletion and live command\n    if (!IS_FLAG_SET(impl->flags, CLI_FLAG_DIRECT_PRINT))\n        clearCurrentLine(cli);\n\n    // print provided string\n    writeToOutput(cli, string);\n    writeToOutput(cli, lineBreak);\n\n    // print current command back to screen\n    if (!IS_FLAG_SET(impl->flags, CLI_FLAG_DIRECT_PRINT)) {\n        writeToOutput(cli, impl->invitation);\n        writeToOutput(cli, impl->cmdBuffer);\n        impl->inputLineLength = impl->cmdSize;\n\n        printLiveAutocompletion(cli);\n    }\n}\n\nvoid embeddedCliFree(EmbeddedCli *cli) {\n    PREPARE_IMPL(cli);\n    if (IS_FLAG_SET(impl->flags, CLI_FLAG_ALLOCATED)) {\n        // allocation is done in single call to malloc, so need only single free\n//        free(cli);\n    }\n}\n\nvoid embeddedCliTokenizeArgs(char *args) {\n    if (args == NULL)\n        return;\n\n    // for now only space, but can add more later\n    const char *separators = \" \";\n\n    // indicates that arg is quoted so separators are copied as is\n    bool quotesEnabled = false;\n    // indicates that previous char was a slash, so next char is copied as is\n    bool escapeActivated = false;\n    int insertPos = 0;\n\n    int i = 0;\n    char currentChar;\n    while ((currentChar = args[i]) != '\\0') {\n        ++i;\n\n        if (escapeActivated) {\n            escapeActivated = false;\n        } else if (currentChar == '\\\\') {\n            escapeActivated = true;\n            continue;\n        } else if (currentChar == '\"') {\n            quotesEnabled = !quotesEnabled;\n            currentChar = '\\0';\n        } else if (!quotesEnabled && strchr(separators, currentChar) != NULL) {\n            currentChar = '\\0';\n        }\n\n        // null chars are only copied once and not copied to the beginning\n        if (currentChar != '\\0' || (insertPos > 0 && args[insertPos - 1] != '\\0')) {\n            args[insertPos] = currentChar;\n            ++insertPos;\n        }\n    }\n\n    // make args double null-terminated source buffer must be big enough to contain extra spaces\n    args[insertPos] = '\\0';\n    args[insertPos + 1] = '\\0';\n}\n\nconst char *embeddedCliGetToken(const char *tokenizedStr, uint16_t pos) {\n    uint16_t i = getTokenPosition(tokenizedStr, pos);\n\n    if (i != CLI_TOKEN_NPOS)\n        return &tokenizedStr[i];\n    else\n        return NULL;\n}\n\nchar *embeddedCliGetTokenVariable(char *tokenizedStr, uint16_t pos) {\n    uint16_t i = getTokenPosition(tokenizedStr, pos);\n\n    if (i != CLI_TOKEN_NPOS)\n        return &tokenizedStr[i];\n    else\n        return NULL;\n}\n\nuint16_t embeddedCliFindToken(const char *tokenizedStr, const char *token) {\n    if (tokenizedStr == NULL || token == NULL)\n        return 0;\n\n    uint16_t size = embeddedCliGetTokenCount(tokenizedStr);\n    for (uint16_t i = 1; i <= size; ++i) {\n        if (strcmp(embeddedCliGetToken(tokenizedStr, i), token) == 0)\n            return i;\n    }\n\n    return 0;\n}\n\nuint16_t embeddedCliGetTokenCount(const char *tokenizedStr) {\n    if (tokenizedStr == NULL || tokenizedStr[0] == '\\0')\n        return 0;\n\n    int i = 0;\n    uint16_t tokenCount = 1;\n    while (true) {\n        if (tokenizedStr[i] == '\\0') {\n            if (tokenizedStr[i + 1] == '\\0')\n                break;\n            ++tokenCount;\n        }\n        ++i;\n    }\n\n    return tokenCount;\n}\n\nstatic void navigateHistory(EmbeddedCli *cli, bool navigateUp) {\n    PREPARE_IMPL(cli);\n    if (impl->history.itemsCount == 0 ||\n        (navigateUp && impl->history.current == impl->history.itemsCount) ||\n        (!navigateUp && impl->history.current == 0))\n        return;\n\n    clearCurrentLine(cli);\n\n    writeToOutput(cli, impl->invitation);\n\n    if (navigateUp)\n        ++impl->history.current;\n    else\n        --impl->history.current;\n\n    const char *item = historyGet(&impl->history, impl->history.current);\n    // simple way to handle empty command the same way as others\n    if (item == NULL)\n        item = \"\";\n    uint16_t len = (uint16_t) strlen(item);\n    memcpy(impl->cmdBuffer, item, len);\n    impl->cmdBuffer[len] = '\\0';\n    impl->cmdSize = len;\n\n    writeToOutput(cli, impl->cmdBuffer);\n    impl->inputLineLength = impl->cmdSize;\n\n    printLiveAutocompletion(cli);\n}\n\nstatic void onEscapedInput(EmbeddedCli *cli, char c) {\n    PREPARE_IMPL(cli);\n\n    if (c >= 64 && c <= 126) {\n        // handle escape sequence\n        UNSET_U8FLAG(impl->flags, CLI_FLAG_ESCAPE_MODE);\n\n        if (c == 'A' || c == 'B') {\n            // treat \\e[..A as cursor up and \\e[..B as cursor down\n            // there might be extra chars between [ and A/B, just ignore them\n            navigateHistory(cli, c == 'A');\n        }\n    }\n}\n\nstatic void onCharInput(EmbeddedCli *cli, char c) {\n    PREPARE_IMPL(cli);\n\n    // have to reserve two extra chars for command ending (used in tokenization)\n    if (impl->cmdSize + 2 >= impl->cmdMaxSize)\n        return;\n\n    impl->cmdBuffer[impl->cmdSize] = c;\n    ++impl->cmdSize;\n    impl->cmdBuffer[impl->cmdSize] = '\\0';\n\n    cli->writeChar(cli, c);\n}\n\nstatic void onControlInput(EmbeddedCli *cli, char c) {\n    PREPARE_IMPL(cli);\n\n    // process \\r\\n and \\n\\r as single \\r\\n command\n    if ((impl->lastChar == '\\r' && c == '\\n') ||\n        (impl->lastChar == '\\n' && c == '\\r'))\n        return;\n\n    if (c == '\\r' || c == '\\n') {\n        // try to autocomplete command and then process it\n        onAutocompleteRequest(cli);\n\n        writeToOutput(cli, lineBreak);\n\n        if (impl->cmdSize > 0)\n            parseCommand(cli);\n        impl->cmdSize = 0;\n        impl->cmdBuffer[impl->cmdSize] = '\\0';\n        impl->inputLineLength = 0;\n        impl->history.current = 0;\n\n        writeToOutput(cli, impl->invitation);\n    } else if ((c == '\\b' || c == 0x7F) && impl->cmdSize > 0) {\n        // remove char from screen\n        cli->writeChar(cli, '\\b');\n        cli->writeChar(cli, ' ');\n        cli->writeChar(cli, '\\b');\n        // and from buffer\n        --impl->cmdSize;\n        impl->cmdBuffer[impl->cmdSize] = '\\0';\n    } else if (c == '\\t') {\n        onAutocompleteRequest(cli);\n    }\n\n}\n\nstatic void parseCommand(EmbeddedCli *cli) {\n    PREPARE_IMPL(cli);\n\n    bool isEmpty = true;\n\n    for (int i = 0; i < impl->cmdSize; ++i) {\n        if (impl->cmdBuffer[i] != ' ') {\n            isEmpty = false;\n            break;\n        }\n    }\n    // do not process empty commands\n    if (isEmpty)\n        return;\n    // push command to history before buffer is modified\n    historyPut(&impl->history, impl->cmdBuffer);\n\n    char *cmdName = NULL;\n    char *cmdArgs = NULL;\n    bool nameFinished = false;\n\n    // find command name and command args inside command buffer\n    for (int i = 0; i < impl->cmdSize; ++i) {\n        char c = impl->cmdBuffer[i];\n\n        if (c == ' ') {\n            // all spaces between name and args are filled with zeros\n            // so name is a correct null-terminated string\n            if (cmdArgs == NULL)\n                impl->cmdBuffer[i] = '\\0';\n            if (cmdName != NULL)\n                nameFinished = true;\n\n        } else if (cmdName == NULL) {\n            cmdName = &impl->cmdBuffer[i];\n        } else if (cmdArgs == NULL && nameFinished) {\n            cmdArgs = &impl->cmdBuffer[i];\n        }\n    }\n\n    // we keep two last bytes in cmd buffer reserved so cmdSize is always by 2\n    // less than cmdMaxSize\n    impl->cmdBuffer[impl->cmdSize + 1] = '\\0';\n\n    if (cmdName == NULL)\n        return;\n\n    // try to find command in bindings\n    for (int i = 0; i < impl->bindingsCount; ++i) {\n        if (strcmp(cmdName, impl->bindings[i].name) == 0) {\n            if (impl->bindings[i].binding == NULL)\n                break;\n\n            if (impl->bindings[i].tokenizeArgs)\n                embeddedCliTokenizeArgs(cmdArgs);\n            // currently, output is blank line, so we can just print directly\n            SET_FLAG(impl->flags, CLI_FLAG_DIRECT_PRINT);\n            impl->bindings[i].binding(cli, cmdArgs, impl->bindings[i].context);\n            UNSET_U8FLAG(impl->flags, CLI_FLAG_DIRECT_PRINT);\n            return;\n        }\n    }\n\n    // command not found in bindings or binding was null\n    // try to call default callback\n    if (cli->onCommand != NULL) {\n        CliCommand command;\n        command.name = cmdName;\n        command.args = cmdArgs;\n\n        // currently, output is blank line, so we can just print directly\n        SET_FLAG(impl->flags, CLI_FLAG_DIRECT_PRINT);\n        cli->onCommand(cli, &command);\n        UNSET_U8FLAG(impl->flags, CLI_FLAG_DIRECT_PRINT);\n    } else {\n        onUnknownCommand(cli, cmdName);\n    }\n}\n\nstatic void initInternalBindings(EmbeddedCli *cli) {\n    CliCommandBinding b = {\n            \"help\",\n            \"Print list of commands\",\n            true,\n            NULL,\n            onHelp\n    };\n    embeddedCliAddBinding(cli, b);\n}\n\nstatic void onHelp(EmbeddedCli *cli, char *tokens, void *context) {\n    UNUSED(context);\n    PREPARE_IMPL(cli);\n\n    if (impl->bindingsCount == 0) {\n        writeToOutput(cli, \"Help is not available\");\n        writeToOutput(cli, lineBreak);\n        return;\n    }\n\n    uint16_t tokenCount = embeddedCliGetTokenCount(tokens);\n    if (tokenCount == 0) {\n        for (int i = 0; i < impl->bindingsCount; ++i) {\n            writeToOutput(cli, \" * \");\n            writeToOutput(cli, impl->bindings[i].name);\n            writeToOutput(cli, lineBreak);\n            if (impl->bindings[i].help != NULL) {\n                cli->writeChar(cli, '\\t');\n                writeToOutput(cli, impl->bindings[i].help);\n                writeToOutput(cli, lineBreak);\n            }\n        }\n    } else if (tokenCount == 1) {\n        // try find command\n        const char *helpStr = NULL;\n        const char *cmdName = embeddedCliGetToken(tokens, 1);\n        bool found = false;\n        for (int i = 0; i < impl->bindingsCount; ++i) {\n            if (strcmp(impl->bindings[i].name, cmdName) == 0) {\n                helpStr = impl->bindings[i].help;\n                found = true;\n                break;\n            }\n        }\n        if (found && helpStr != NULL) {\n            writeToOutput(cli, \" * \");\n            writeToOutput(cli, cmdName);\n            writeToOutput(cli, lineBreak);\n            cli->writeChar(cli, '\\t');\n            writeToOutput(cli, helpStr);\n            writeToOutput(cli, lineBreak);\n        } else if (found) {\n            writeToOutput(cli, \"Help is not available\");\n            writeToOutput(cli, lineBreak);\n        } else {\n            onUnknownCommand(cli, cmdName);\n        }\n    } else {\n        writeToOutput(cli, \"Command \\\"help\\\" receives one or zero arguments\");\n        writeToOutput(cli, lineBreak);\n    }\n}\n\nstatic void onUnknownCommand(EmbeddedCli *cli, const char *name) {\n    writeToOutput(cli, \"Unknown command: \\\"\");\n    writeToOutput(cli, name);\n    writeToOutput(cli, \"\\\". Write \\\"help\\\" for a list of available commands\");\n    writeToOutput(cli, lineBreak);\n}\n\nstatic AutocompletedCommand getAutocompletedCommand(EmbeddedCli *cli, const char *prefix) {\n    AutocompletedCommand cmd = {NULL, 0, 0};\n\n    size_t prefixLen = strlen(prefix);\n\n    PREPARE_IMPL(cli);\n    if (impl->bindingsCount == 0 || prefixLen == 0)\n        return cmd;\n\n\n    for (int i = 0; i < impl->bindingsCount; ++i) {\n        const char *name = impl->bindings[i].name;\n        size_t len = strlen(name);\n\n        // unset autocomplete flag\n        UNSET_U8FLAG(impl->bindingsFlags[i], BINDING_FLAG_AUTOCOMPLETE);\n\n        if (len < prefixLen)\n            continue;\n\n        // check if this command is candidate for autocomplete\n        bool isCandidate = true;\n        for (size_t j = 0; j < prefixLen; ++j) {\n            if (prefix[j] != name[j]) {\n                isCandidate = false;\n                break;\n            }\n        }\n        if (!isCandidate)\n            continue;\n\n        impl->bindingsFlags[i] |= BINDING_FLAG_AUTOCOMPLETE;\n\n        if (cmd.candidateCount == 0 || len < cmd.autocompletedLen)\n            cmd.autocompletedLen = (uint16_t) len;\n\n        ++cmd.candidateCount;\n\n        if (cmd.candidateCount == 1) {\n            cmd.firstCandidate = name;\n            continue;\n        }\n\n        for (size_t j = impl->cmdSize; j < cmd.autocompletedLen; ++j) {\n            if (cmd.firstCandidate[j] != name[j]) {\n                cmd.autocompletedLen = (uint16_t) j;\n                break;\n            }\n        }\n    }\n\n    return cmd;\n}\n\nstatic void printLiveAutocompletion(EmbeddedCli *cli) {\n    PREPARE_IMPL(cli);\n\n    if (!IS_FLAG_SET(impl->flags, CLI_FLAG_AUTOCOMPLETE_ENABLED))\n        return;\n\n    AutocompletedCommand cmd = getAutocompletedCommand(cli, impl->cmdBuffer);\n\n    if (cmd.candidateCount == 0) {\n        cmd.autocompletedLen = impl->cmdSize;\n    }\n\n    // print live autocompletion (or nothing, if it doesn't exist)\n    for (size_t i = impl->cmdSize; i < cmd.autocompletedLen; ++i) {\n        cli->writeChar(cli, cmd.firstCandidate[i]);\n    }\n    // replace with spaces previous autocompletion\n    for (size_t i = cmd.autocompletedLen; i < impl->inputLineLength; ++i) {\n        cli->writeChar(cli, ' ');\n    }\n    impl->inputLineLength = cmd.autocompletedLen;\n    cli->writeChar(cli, '\\r');\n    // print current command again so cursor is moved to initial place\n    writeToOutput(cli, impl->invitation);\n    writeToOutput(cli, impl->cmdBuffer);\n}\n\nstatic void onAutocompleteRequest(EmbeddedCli *cli) {\n    PREPARE_IMPL(cli);\n\n    AutocompletedCommand cmd = getAutocompletedCommand(cli, impl->cmdBuffer);\n\n    if (cmd.candidateCount == 0)\n        return;\n\n    if (cmd.candidateCount == 1 || cmd.autocompletedLen > impl->cmdSize) {\n        // can copy from index cmdSize, but prefix is the same, so copy everything\n        memcpy(impl->cmdBuffer, cmd.firstCandidate, cmd.autocompletedLen);\n        if (cmd.candidateCount == 1) {\n            impl->cmdBuffer[cmd.autocompletedLen] = ' ';\n            ++cmd.autocompletedLen;\n        }\n        impl->cmdBuffer[cmd.autocompletedLen] = '\\0';\n\n        writeToOutput(cli, &impl->cmdBuffer[impl->cmdSize]);\n        impl->cmdSize = cmd.autocompletedLen;\n        impl->inputLineLength = impl->cmdSize;\n        return;\n    }\n\n    // with multiple candidates when we already completed to common prefix\n    // we show all candidates and print input again\n    // we need to completely clear current line since it begins with invitation\n    clearCurrentLine(cli);\n\n    for (int i = 0; i < impl->bindingsCount; ++i) {\n        // autocomplete flag is set for all candidates by last call to\n        // getAutocompletedCommand\n        if (!(impl->bindingsFlags[i] & BINDING_FLAG_AUTOCOMPLETE))\n            continue;\n\n        const char *name = impl->bindings[i].name;\n\n        writeToOutput(cli, name);\n        writeToOutput(cli, lineBreak);\n    }\n\n    writeToOutput(cli, impl->invitation);\n    writeToOutput(cli, impl->cmdBuffer);\n\n    impl->inputLineLength = impl->cmdSize;\n}\n\nstatic void clearCurrentLine(EmbeddedCli *cli) {\n    PREPARE_IMPL(cli);\n    size_t len = impl->inputLineLength + strlen(impl->invitation);\n\n    cli->writeChar(cli, '\\r');\n    for (size_t i = 0; i < len; ++i) {\n        cli->writeChar(cli, ' ');\n    }\n    cli->writeChar(cli, '\\r');\n    impl->inputLineLength = 0;\n}\n\nstatic void writeToOutput(EmbeddedCli *cli, const char *str) {\n    size_t len = strlen(str);\n\n    for (size_t i = 0; i < len; ++i) {\n        cli->writeChar(cli, str[i]);\n    }\n}\n\nstatic bool isControlChar(char c) {\n    return c == '\\r' || c == '\\n' || c == '\\b' || c == '\\t' || c == 0x7F;\n}\n\nstatic bool isDisplayableChar(char c) {\n    return (c >= 32 && c <= 126);\n}\n\nstatic uint16_t fifoBufAvailable(FifoBuf *buffer) {\n    if (buffer->back >= buffer->front)\n        return (uint16_t) (buffer->back - buffer->front);\n    else\n        return (uint16_t) (buffer->size - buffer->front + buffer->back);\n}\n\nstatic char fifoBufPop(FifoBuf *buffer) {\n    char a = '\\0';\n    if (buffer->front != buffer->back) {\n        a = buffer->buf[buffer->front];\n        buffer->front = (uint16_t) (buffer->front + 1) % buffer->size;\n    }\n    return a;\n}\n\nstatic bool fifoBufPush(FifoBuf *buffer, char a) {\n    uint16_t newBack = (uint16_t) (buffer->back + 1) % buffer->size;\n    if (newBack != buffer->front) {\n        buffer->buf[buffer->back] = a;\n        buffer->back = newBack;\n        return true;\n    }\n    return false;\n}\n\nstatic bool historyPut(CliHistory *history, const char *str) {\n    size_t len = strlen(str);\n    // each item is ended with \\0 so, need to have that much space at least\n    if (history->bufferSize < len + 1)\n        return false;\n\n    // remove str from history (if it's present) so we don't get duplicates\n    historyRemove(history, str);\n\n    size_t usedSize;\n    // remove old items if new one can't fit into buffer\n    while (history->itemsCount > 0) {\n        const char *item = historyGet(history, history->itemsCount);\n        size_t itemLen = strlen(item);\n        usedSize = ((size_t) (item - history->buf)) + itemLen + 1;\n\n        size_t freeSpace = history->bufferSize - usedSize;\n\n        if (freeSpace >= len + 1)\n            break;\n\n        // space not enough, remove last element\n        --history->itemsCount;\n    }\n    if (history->itemsCount > 0) {\n        // when history not empty, shift elements so new item is first\n        memmove(&history->buf[len + 1], history->buf, usedSize);\n    }\n    memcpy(history->buf, str, len + 1);\n    ++history->itemsCount;\n\n    return true;\n}\n\nstatic const char *historyGet(CliHistory *history, uint16_t item) {\n    if (item == 0 || item > history->itemsCount)\n        return NULL;\n\n    // items are stored in the same way (separated by \\0 and counted from 1),\n    // so can use this call\n    return embeddedCliGetToken(history->buf, item);\n}\n\nstatic void historyRemove(CliHistory *history, const char *str) {\n    if (str == NULL || history->itemsCount == 0)\n        return;\n    char *item = NULL;\n    uint16_t itemPosition;\n    for (itemPosition = 1; itemPosition <= history->itemsCount; ++itemPosition) {\n        // items are stored in the same way (separated by \\0 and counted from 1),\n        // so can use this call\n        item = embeddedCliGetTokenVariable(history->buf, itemPosition);\n        if (strcmp(item, str) == 0) {\n            break;\n        }\n        item = NULL;\n    }\n    if (item == NULL)\n        return;\n\n    --history->itemsCount;\n    if (itemPosition == (history->itemsCount + 1)) {\n        // if this is a last element, nothing is remaining to move\n        return;\n    }\n\n    size_t len = strlen(item);\n    size_t remaining = (size_t) (history->bufferSize - (item + len + 1 - history->buf));\n    // move everything to the right of found item\n    memmove(item, &item[len + 1], remaining);\n}\n\nstatic uint16_t getTokenPosition(const char *tokenizedStr, uint16_t pos) {\n    if (tokenizedStr == NULL || pos == 0)\n        return CLI_TOKEN_NPOS;\n    uint16_t i = 0;\n    uint16_t tokenCount = 1;\n    while (true) {\n        if (tokenCount == pos)\n            break;\n\n        if (tokenizedStr[i] == '\\0') {\n            ++tokenCount;\n            if (tokenizedStr[i + 1] == '\\0')\n                break;\n        }\n\n        ++i;\n    }\n\n    if (tokenizedStr[i] != '\\0')\n        return i;\n    else\n        return CLI_TOKEN_NPOS;\n}\n#ifdef __cplusplus\n}\n#endif\n#endif // EMBEDDED_CLI_IMPL_GUARD\n#endif // EMBEDDED_CLI_IMPL\n"
  },
  {
    "path": "lib/fatfs/LICENSE.txt",
    "content": "FatFs License\n\nFatFs has being developped as a personal project of the author, ChaN. It is free from the code anyone else wrote at current release. Following code block shows a copy of the FatFs license document that heading the source files.\n\n/*----------------------------------------------------------------------------/\n/  FatFs - Generic FAT Filesystem Module  Rx.xx                               /\n/-----------------------------------------------------------------------------/\n/\n/ Copyright (C) 20xx, ChaN, all right reserved.\n/\n/ FatFs module is an open source software. Redistribution and use of FatFs in\n/ source and binary forms, with or without modification, are permitted provided\n/ that the following condition is met:\n/\n/ 1. Redistributions of source code must retain the above copyright notice,\n/    this condition and the following disclaimer.\n/\n/ This software is provided by the copyright holder and contributors \"AS IS\"\n/ and any warranties related to this software are DISCLAIMED.\n/ The copyright owner or contributors be NOT LIABLE for any damages caused\n/ by use of this software.\n/----------------------------------------------------------------------------*/\n\nTherefore FatFs license is one of the BSD-style licenses, but there is a significant feature. FatFs is mainly intended for embedded systems. In order to extend the usability for commercial products, the redistributions of FatFs in binary form, such as embedded code, binary library and any forms without source code, do not need to include about FatFs in the documentations. This is equivalent to the 1-clause BSD license. Of course FatFs is compatible with the most of open source software licenses include GNU GPL. When you redistribute the FatFs source code with changes or create a fork, the license can also be changed to GNU GPL, BSD-style license or any open source software license that not conflict with FatFs license.\n"
  },
  {
    "path": "lib/fatfs/source/00history.txt",
    "content": "----------------------------------------------------------------------------\n  Revision history of FatFs module\n----------------------------------------------------------------------------\n\nR0.00 (February 26, 2006)\n\n  Prototype.\n\n\n\nR0.01 (April 29, 2006)\n\n  The first release.\n\n\n\nR0.02 (June 01, 2006)\n\n  Added FAT12 support.\n  Removed unbuffered mode.\n  Fixed a problem on small (<32M) partition.\n\n\n\nR0.02a (June 10, 2006)\n\n  Added a configuration option (_FS_MINIMUM).\n\n\n\nR0.03 (September 22, 2006)\n\n  Added f_rename().\n  Changed option _FS_MINIMUM to _FS_MINIMIZE.\n\n\n\nR0.03a (December 11, 2006)\n\n  Improved cluster scan algorithm to write files fast.\n  Fixed f_mkdir() creates incorrect directory on FAT32.\n\n\n\nR0.04 (February 04, 2007)\n\n  Added f_mkfs().\n  Supported multiple drive system.\n  Changed some interfaces for multiple drive system.\n  Changed f_mountdrv() to f_mount().\n\n\n\nR0.04a (April 01, 2007)\n\n  Supported multiple partitions on a physical drive.\n  Added a capability of extending file size to f_lseek().\n  Added minimization level 3.\n  Fixed an endian sensitive code in f_mkfs().\n\n\n\nR0.04b (May 05, 2007)\n\n  Added a configuration option _USE_NTFLAG.\n  Added FSINFO support.\n  Fixed DBCS name can result FR_INVALID_NAME.\n  Fixed short seek (<= csize) collapses the file object.\n\n\n\nR0.05 (August 25, 2007)\n\n  Changed arguments of f_read(), f_write() and f_mkfs().\n  Fixed f_mkfs() on FAT32 creates incorrect FSINFO.\n  Fixed f_mkdir() on FAT32 creates incorrect directory.\n\n\n\nR0.05a (February 03, 2008)\n\n  Added f_truncate() and f_utime().\n  Fixed off by one error at FAT sub-type determination.\n  Fixed btr in f_read() can be mistruncated.\n  Fixed cached sector is not flushed when create and close without write.\n\n\n\nR0.06 (April 01, 2008)\n\n  Added fputc(), fputs(), fprintf() and fgets().\n  Improved performance of f_lseek() on moving to the same or following cluster.\n\n\n\nR0.07 (April 01, 2009)\n\n  Merged Tiny-FatFs as a configuration option. (_FS_TINY)\n  Added long file name feature. (_USE_LFN)\n  Added multiple code page feature. (_CODE_PAGE)\n  Added re-entrancy for multitask operation. (_FS_REENTRANT)\n  Added auto cluster size selection to f_mkfs().\n  Added rewind option to f_readdir().\n  Changed result code of critical errors.\n  Renamed string functions to avoid name collision.\n\n\n\nR0.07a (April 14, 2009)\n\n  Septemberarated out OS dependent code on reentrant cfg.\n  Added multiple sector size feature.\n\n\n\nR0.07c (June 21, 2009)\n\n  Fixed f_unlink() can return FR_OK on error.\n  Fixed wrong cache control in f_lseek().\n  Added relative path feature.\n  Added f_chdir() and f_chdrive().\n  Added proper case conversion to extended character.\n\n\n\nR0.07e (November 03, 2009)\n\n  Septemberarated out configuration options from ff.h to ffconf.h.\n  Fixed f_unlink() fails to remove a sub-directory on _FS_RPATH.\n  Fixed name matching error on the 13 character boundary.\n  Added a configuration option, _LFN_UNICODE.\n  Changed f_readdir() to return the SFN with always upper case on non-LFN cfg.\n\n\n\nR0.08 (May 15, 2010)\n\n  Added a memory configuration option. (_USE_LFN = 3)\n  Added file lock feature. (_FS_SHARE)\n  Added fast seek feature. (_USE_FASTSEEK)\n  Changed some types on the API, XCHAR->TCHAR.\n  Changed .fname in the FILINFO structure on Unicode cfg.\n  String functions support UTF-8 encoding files on Unicode cfg.\n\n\n\nR0.08a (August 16, 2010)\n\n  Added f_getcwd(). (_FS_RPATH = 2)\n  Added sector erase feature. (_USE_ERASE)\n  Moved file lock semaphore table from fs object to the bss.\n  Fixed f_mkfs() creates wrong FAT32 volume.\n\n\n\nR0.08b (January 15, 2011)\n\n  Fast seek feature is also applied to f_read() and f_write().\n  f_lseek() reports required table size on creating CLMP.\n  Extended format syntax of f_printf().\n  Ignores duplicated directory separators in given path name.\n\n\n\nR0.09 (September 06, 2011)\n\n  f_mkfs() supports multiple partition to complete the multiple partition feature.\n  Added f_fdisk().\n\n\n\nR0.09a (August 27, 2012)\n\n  Changed f_open() and f_opendir() reject null object pointer to avoid crash.\n  Changed option name _FS_SHARE to _FS_LOCK.\n  Fixed assertion failure due to OS/2 EA on FAT12/16 volume.\n\n\n\nR0.09b (January 24, 2013)\n\n  Added f_setlabel() and f_getlabel().\n\n\n\nR0.10 (October 02, 2013)\n\n  Added selection of character encoding on the file. (_STRF_ENCODE)\n  Added f_closedir().\n  Added forced full FAT scan for f_getfree(). (_FS_NOFSINFO)\n  Added forced mount feature with changes of f_mount().\n  Improved behavior of volume auto detection.\n  Improved write throughput of f_puts() and f_printf().\n  Changed argument of f_chdrive(), f_mkfs(), disk_read() and disk_write().\n  Fixed f_write() can be truncated when the file size is close to 4GB.\n  Fixed f_open(), f_mkdir() and f_setlabel() can return incorrect value on error.\n\n\n\nR0.10a (January 15, 2014)\n\n  Added arbitrary strings as drive number in the path name. (_STR_VOLUME_ID)\n  Added a configuration option of minimum sector size. (_MIN_SS)\n  2nd argument of f_rename() can have a drive number and it will be ignored.\n  Fixed f_mount() with forced mount fails when drive number is >= 1. (appeared at R0.10)\n  Fixed f_close() invalidates the file object without volume lock.\n  Fixed f_closedir() returns but the volume lock is left acquired. (appeared at R0.10)\n  Fixed creation of an entry with LFN fails on too many SFN collisions. (appeared at R0.07)\n\n\n\nR0.10b (May 19, 2014)\n\n  Fixed a hard error in the disk I/O layer can collapse the directory entry.\n  Fixed LFN entry is not deleted when delete/rename an object with lossy converted SFN. (appeared at R0.07)\n\n\n\nR0.10c (November 09, 2014)\n\n  Added a configuration option for the platforms without RTC. (_FS_NORTC)\n  Changed option name _USE_ERASE to _USE_TRIM.\n  Fixed volume label created by Mac OS X cannot be retrieved with f_getlabel(). (appeared at R0.09b)\n  Fixed a potential problem of FAT access that can appear on disk error.\n  Fixed null pointer dereference on attempting to delete the root direcotry. (appeared at R0.08)\n\n\n\nR0.11 (February 09, 2015)\n\n  Added f_findfirst(), f_findnext() and f_findclose(). (_USE_FIND)\n  Fixed f_unlink() does not remove cluster chain of the file. (appeared at R0.10c)\n  Fixed _FS_NORTC option does not work properly. (appeared at R0.10c)\n\n\n\nR0.11a (September 05, 2015)\n\n  Fixed wrong media change can lead a deadlock at thread-safe configuration.\n  Added code page 771, 860, 861, 863, 864, 865 and 869. (_CODE_PAGE)\n  Removed some code pages actually not exist on the standard systems. (_CODE_PAGE)\n  Fixed errors in the case conversion teble of code page 437 and 850 (ff.c).\n  Fixed errors in the case conversion teble of Unicode (cc*.c).\n\n\n\nR0.12 (April 12, 2016)\n\n  Added support for exFAT file system. (_FS_EXFAT)\n  Added f_expand(). (_USE_EXPAND)\n  Changed some members in FINFO structure and behavior of f_readdir().\n  Added an option _USE_CHMOD.\n  Removed an option _WORD_ACCESS.\n  Fixed errors in the case conversion table of Unicode (cc*.c).\n\n\n\nR0.12a (July 10, 2016)\n\n  Added support for creating exFAT volume with some changes of f_mkfs().\n  Added a file open method FA_OPEN_APPEND. An f_lseek() following f_open() is no longer needed.\n  f_forward() is available regardless of _FS_TINY.\n  Fixed f_mkfs() creates wrong volume. (appeared at R0.12)\n  Fixed wrong memory read in create_name(). (appeared at R0.12)\n  Fixed compilation fails at some configurations, _USE_FASTSEEK and _USE_FORWARD.\n\n\n\nR0.12b (September 04, 2016)\n\n  Made f_rename() be able to rename objects with the same name but case.\n  Fixed an error in the case conversion teble of code page 866. (ff.c)\n  Fixed writing data is truncated at the file offset 4GiB on the exFAT volume. (appeared at R0.12)\n  Fixed creating a file in the root directory of exFAT volume can fail. (appeared at R0.12)\n  Fixed f_mkfs() creating exFAT volume with too small cluster size can collapse unallocated memory. (appeared at R0.12)\n  Fixed wrong object name can be returned when read directory at Unicode cfg. (appeared at R0.12)\n  Fixed large file allocation/removing on the exFAT volume collapses allocation bitmap. (appeared at R0.12)\n  Fixed some internal errors in f_expand() and f_lseek(). (appeared at R0.12)\n\n\n\nR0.12c (March 04, 2017)\n\n  Improved write throughput at the fragmented file on the exFAT volume.\n  Made memory usage for exFAT be able to be reduced as decreasing _MAX_LFN.\n  Fixed successive f_getfree() can return wrong count on the FAT12/16 volume. (appeared at R0.12)\n  Fixed configuration option _VOLUMES cannot be set 10. (appeared at R0.10c)\n\n\n\nR0.13 (May 21, 2017)\n\n  Changed heading character of configuration keywords \"_\" to \"FF_\".\n  Removed ASCII-only configuration, FF_CODE_PAGE = 1. Use FF_CODE_PAGE = 437 instead.\n  Added f_setcp(), run-time code page configuration. (FF_CODE_PAGE = 0)\n  Improved cluster allocation time on stretch a deep buried cluster chain.\n  Improved processing time of f_mkdir() with large cluster size by using FF_USE_LFN = 3.\n  Improved NoFatChain flag of the fragmented file to be set after it is truncated and got contiguous.\n  Fixed archive attribute is left not set when a file on the exFAT volume is renamed. (appeared at R0.12)\n  Fixed exFAT FAT entry can be collapsed when write or lseek operation to the existing file is done. (appeared at R0.12c)\n  Fixed creating a file can fail when a new cluster allocation to the exFAT directory occures. (appeared at R0.12c)\n\n\n\nR0.13a (October 14, 2017)\n\n  Added support for UTF-8 encoding on the API. (FF_LFN_UNICODE = 2)\n  Added options for file name output buffer. (FF_LFN_BUF, FF_SFN_BUF).\n  Added dynamic memory allocation option for working buffer of f_mkfs() and f_fdisk().\n  Fixed f_fdisk() and f_mkfs() create the partition table with wrong CHS parameters. (appeared at R0.09)\n  Fixed f_unlink() can cause lost clusters at fragmented file on the exFAT volume. (appeared at R0.12c)\n  Fixed f_setlabel() rejects some valid characters for exFAT volume. (appeared at R0.12)\n\n\n\nR0.13b (April 07, 2018)\n\n  Added support for UTF-32 encoding on the API. (FF_LFN_UNICODE = 3)\n  Added support for Unix style volume ID. (FF_STR_VOLUME_ID = 2)\n  Fixed accesing any object on the exFAT root directory beyond the cluster boundary can fail. (appeared at R0.12c)\n  Fixed f_setlabel() does not reject some invalid characters. (appeared at R0.09b)\n\n\n\nR0.13c (October 14, 2018)\n  Supported stdint.h for C99 and later. (integer.h was included in ff.h)\n  Fixed reading a directory gets infinite loop when the last directory entry is not empty. (appeared at R0.12)\n  Fixed creating a sub-directory in the fragmented sub-directory on the exFAT volume collapses FAT chain of the parent directory. (appeared at R0.12)\n  Fixed f_getcwd() cause output buffer overrun when the buffer has a valid drive number. (appeared at R0.13b)\n\n\n\nR0.14 (October 14, 2019)\n  Added support for 64-bit LBA and GUID partition table (FF_LBA64 = 1)\n  Changed some API functions, f_mkfs() and f_fdisk().\n  Fixed f_open() function cannot find the file with file name in length of FF_MAX_LFN characters.\n  Fixed f_readdir() function cannot retrieve long file names in length of FF_MAX_LFN - 1 characters.\n  Fixed f_readdir() function returns file names with wrong case conversion. (appeared at R0.12)\n  Fixed f_mkfs() function can fail to create exFAT volume in the second partition. (appeared at R0.12)\n\n\nR0.14a (December 5, 2020)\n  Limited number of recursive calls in f_findnext().\n  Fixed old floppy disks formatted with MS-DOS 2.x and 3.x cannot be mounted.\n  Fixed some compiler warnings.\n\n\n\nR0.14b (April 17, 2021)\n  Made FatFs uses standard library <string.h> for copy, compare and search instead of built-in string functions.\n  Added support for long long integer and floating point to f_printf(). (FF_STRF_LLI and FF_STRF_FP)\n  Made path name parser ignore the terminating separator to allow \"dir/\".\n  Improved the compatibility in Unix style path name feature.\n  Fixed the file gets dead-locked when f_open() failed with some conditions. (appeared at R0.12a)\n  Fixed f_mkfs() can create wrong exFAT volume due to a timing dependent error. (appeared at R0.12)\n  Fixed code page 855 cannot be set by f_setcp().\n  Fixed some compiler warnings.\n\n\n\nR0.15 (November 6, 2022)\n  Changed user provided synchronization functions in order to completely eliminate the platform dependency from FatFs code.\n  FF_SYNC_t is removed from the configuration options.\n  Fixed a potential error in f_mount when FF_FS_REENTRANT.\n  Fixed file lock control FF_FS_LOCK is not mutal excluded when FF_FS_REENTRANT && FF_VOLUMES > 1 is true.\n  Fixed f_mkfs() creates broken exFAT volume when the size of volume is >= 2^32 sectors.\n  Fixed string functions cannot write the unicode characters not in BMP when FF_LFN_UNICODE == 2 (UTF-8).\n  Fixed a compatibility issue in identification of GPT header.\n"
  },
  {
    "path": "lib/fatfs/source/00readme.txt",
    "content": "FatFs Module Source Files R0.15\n\n\nFILES\n\n  00readme.txt   This file.\n  00history.txt  Revision history.\n  ff.c           FatFs module.\n  ffconf.h       Configuration file of FatFs module.\n  ff.h           Common include file for FatFs and application module.\n  diskio.h       Common include file for FatFs and disk I/O module.\n  diskio.c       An example of glue function to attach existing disk I/O module to FatFs.\n  ffunicode.c    Optional Unicode utility functions.\n  ffsystem.c     An example of optional O/S related functions.\n\n\n  Low level disk I/O module is not included in this archive because the FatFs\n  module is only a generic file system layer and it does not depend on any specific\n  storage device. You need to provide a low level disk I/O module written to\n  control the storage device that attached to the target system.\n"
  },
  {
    "path": "lib/fatfs/source/diskio.c",
    "content": "/*-----------------------------------------------------------------------*/\n/* Low level disk I/O module SKELETON for FatFs     (C)ChaN, 2019        */\n/*-----------------------------------------------------------------------*/\n/* If a working storage control module is available, it should be        */\n/* attached to the FatFs via a glue function rather than modifying it.   */\n/* This is an example of glue functions to attach various exsisting      */\n/* storage control modules to the FatFs module with a defined API.       */\n/*-----------------------------------------------------------------------*/\n\n#include \"ff.h\"\t\t\t/* Obtains integer types */\n#include \"diskio.h\"\t\t/* Declarations of disk functions */\n\n/* Definitions of physical drive number for each drive */\n#define DEV_RAM\t\t0\t/* Example: Map Ramdisk to physical drive 0 */\n#define DEV_MMC\t\t1\t/* Example: Map MMC/SD card to physical drive 1 */\n#define DEV_USB\t\t2\t/* Example: Map USB MSD to physical drive 2 */\n\n\n/*-----------------------------------------------------------------------*/\n/* Get Drive Status                                                      */\n/*-----------------------------------------------------------------------*/\n\nDSTATUS disk_status (\n\tBYTE pdrv\t\t/* Physical drive nmuber to identify the drive */\n)\n{\n\tDSTATUS stat;\n\tint result;\n\n\tswitch (pdrv) {\n\tcase DEV_RAM :\n\t\tresult = RAM_disk_status();\n\n\t\t// translate the reslut code here\n\n\t\treturn stat;\n\n\tcase DEV_MMC :\n\t\tresult = MMC_disk_status();\n\n\t\t// translate the reslut code here\n\n\t\treturn stat;\n\n\tcase DEV_USB :\n\t\tresult = USB_disk_status();\n\n\t\t// translate the reslut code here\n\n\t\treturn stat;\n\t}\n\treturn STA_NOINIT;\n}\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Inidialize a Drive                                                    */\n/*-----------------------------------------------------------------------*/\n\nDSTATUS disk_initialize (\n\tBYTE pdrv\t\t\t\t/* Physical drive nmuber to identify the drive */\n)\n{\n\tDSTATUS stat;\n\tint result;\n\n\tswitch (pdrv) {\n\tcase DEV_RAM :\n\t\tresult = RAM_disk_initialize();\n\n\t\t// translate the reslut code here\n\n\t\treturn stat;\n\n\tcase DEV_MMC :\n\t\tresult = MMC_disk_initialize();\n\n\t\t// translate the reslut code here\n\n\t\treturn stat;\n\n\tcase DEV_USB :\n\t\tresult = USB_disk_initialize();\n\n\t\t// translate the reslut code here\n\n\t\treturn stat;\n\t}\n\treturn STA_NOINIT;\n}\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Read Sector(s)                                                        */\n/*-----------------------------------------------------------------------*/\n\nDRESULT disk_read (\n\tBYTE pdrv,\t\t/* Physical drive nmuber to identify the drive */\n\tBYTE *buff,\t\t/* Data buffer to store read data */\n\tLBA_t sector,\t/* Start sector in LBA */\n\tUINT count\t\t/* Number of sectors to read */\n)\n{\n\tDRESULT res;\n\tint result;\n\n\tswitch (pdrv) {\n\tcase DEV_RAM :\n\t\t// translate the arguments here\n\n\t\tresult = RAM_disk_read(buff, sector, count);\n\n\t\t// translate the reslut code here\n\n\t\treturn res;\n\n\tcase DEV_MMC :\n\t\t// translate the arguments here\n\n\t\tresult = MMC_disk_read(buff, sector, count);\n\n\t\t// translate the reslut code here\n\n\t\treturn res;\n\n\tcase DEV_USB :\n\t\t// translate the arguments here\n\n\t\tresult = USB_disk_read(buff, sector, count);\n\n\t\t// translate the reslut code here\n\n\t\treturn res;\n\t}\n\n\treturn RES_PARERR;\n}\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Write Sector(s)                                                       */\n/*-----------------------------------------------------------------------*/\n\n#if FF_FS_READONLY == 0\n\nDRESULT disk_write (\n\tBYTE pdrv,\t\t\t/* Physical drive nmuber to identify the drive */\n\tconst BYTE *buff,\t/* Data to be written */\n\tLBA_t sector,\t\t/* Start sector in LBA */\n\tUINT count\t\t\t/* Number of sectors to write */\n)\n{\n\tDRESULT res;\n\tint result;\n\n\tswitch (pdrv) {\n\tcase DEV_RAM :\n\t\t// translate the arguments here\n\n\t\tresult = RAM_disk_write(buff, sector, count);\n\n\t\t// translate the reslut code here\n\n\t\treturn res;\n\n\tcase DEV_MMC :\n\t\t// translate the arguments here\n\n\t\tresult = MMC_disk_write(buff, sector, count);\n\n\t\t// translate the reslut code here\n\n\t\treturn res;\n\n\tcase DEV_USB :\n\t\t// translate the arguments here\n\n\t\tresult = USB_disk_write(buff, sector, count);\n\n\t\t// translate the reslut code here\n\n\t\treturn res;\n\t}\n\n\treturn RES_PARERR;\n}\n\n#endif\n\n\n/*-----------------------------------------------------------------------*/\n/* Miscellaneous Functions                                               */\n/*-----------------------------------------------------------------------*/\n\nDRESULT disk_ioctl (\n\tBYTE pdrv,\t\t/* Physical drive nmuber (0..) */\n\tBYTE cmd,\t\t/* Control code */\n\tvoid *buff\t\t/* Buffer to send/receive control data */\n)\n{\n\tDRESULT res;\n\tint result;\n\n\tswitch (pdrv) {\n\tcase DEV_RAM :\n\n\t\t// Process of the command for the RAM drive\n\n\t\treturn res;\n\n\tcase DEV_MMC :\n\n\t\t// Process of the command for the MMC/SD card\n\n\t\treturn res;\n\n\tcase DEV_USB :\n\n\t\t// Process of the command the USB drive\n\n\t\treturn res;\n\t}\n\n\treturn RES_PARERR;\n}\n"
  },
  {
    "path": "lib/fatfs/source/diskio.h",
    "content": "/*-----------------------------------------------------------------------/\n/  Low level disk interface modlue include file   (C)ChaN, 2019          /\n/-----------------------------------------------------------------------*/\n\n#ifndef _DISKIO_DEFINED\n#define _DISKIO_DEFINED\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* Status of Disk Functions */\ntypedef BYTE\tDSTATUS;\n\n/* Results of Disk Functions */\ntypedef enum {\n\tRES_OK = 0,\t\t/* 0: Successful */\n\tRES_ERROR,\t\t/* 1: R/W Error */\n\tRES_WRPRT,\t\t/* 2: Write Protected */\n\tRES_NOTRDY,\t\t/* 3: Not Ready */\n\tRES_PARERR\t\t/* 4: Invalid Parameter */\n} DRESULT;\n\n\n/*---------------------------------------*/\n/* Prototypes for disk control functions */\n\n\nDSTATUS disk_initialize (BYTE pdrv);\nDSTATUS disk_status (BYTE pdrv);\nDRESULT disk_read (BYTE pdrv, BYTE* buff, LBA_t sector, UINT count);\nDRESULT disk_write (BYTE pdrv, const BYTE* buff, LBA_t sector, UINT count);\nDRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);\n\n\n/* Disk Status Bits (DSTATUS) */\n\n#define STA_NOINIT\t\t0x01\t/* Drive not initialized */\n#define STA_NODISK\t\t0x02\t/* No medium in the drive */\n#define STA_PROTECT\t\t0x04\t/* Write protected */\n\n\n/* Command code for disk_ioctrl fucntion */\n\n/* Generic command (Used by FatFs) */\n#define CTRL_SYNC\t\t\t0\t/* Complete pending write process (needed at FF_FS_READONLY == 0) */\n#define GET_SECTOR_COUNT\t1\t/* Get media size (needed at FF_USE_MKFS == 1) */\n#define GET_SECTOR_SIZE\t\t2\t/* Get sector size (needed at FF_MAX_SS != FF_MIN_SS) */\n#define GET_BLOCK_SIZE\t\t3\t/* Get erase block size (needed at FF_USE_MKFS == 1) */\n#define CTRL_TRIM\t\t\t4\t/* Inform device that the data on the block of sectors is no longer used (needed at FF_USE_TRIM == 1) */\n\n/* Generic command (Not used by FatFs) */\n#define CTRL_POWER\t\t\t5\t/* Get/Set power status */\n#define CTRL_LOCK\t\t\t6\t/* Lock/Unlock media removal */\n#define CTRL_EJECT\t\t\t7\t/* Eject media */\n#define CTRL_FORMAT\t\t\t8\t/* Create physical format on the media */\n\n/* MMC/SDC specific ioctl command */\n#define MMC_GET_TYPE\t\t10\t/* Get card type */\n#define MMC_GET_CSD\t\t\t11\t/* Get CSD */\n#define MMC_GET_CID\t\t\t12\t/* Get CID */\n#define MMC_GET_OCR\t\t\t13\t/* Get OCR */\n#define MMC_GET_SDSTAT\t\t14\t/* Get SD status */\n#define ISDIO_READ\t\t\t55\t/* Read data form SD iSDIO register */\n#define ISDIO_WRITE\t\t\t56\t/* Write data to SD iSDIO register */\n#define ISDIO_MRITE\t\t\t57\t/* Masked write data to SD iSDIO register */\n\n/* ATA/CF specific ioctl command */\n#define ATA_GET_REV\t\t\t20\t/* Get F/W revision */\n#define ATA_GET_MODEL\t\t21\t/* Get model name */\n#define ATA_GET_SN\t\t\t22\t/* Get serial number */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "lib/fatfs/source/ff.c",
    "content": "/*----------------------------------------------------------------------------/\n/  FatFs - Generic FAT Filesystem Module  R0.15 w/patch1                      /\n/-----------------------------------------------------------------------------/\n/\n/ Copyright (C) 2022, ChaN, all right reserved.\n/\n/ FatFs module is an open source software. Redistribution and use of FatFs in\n/ source and binary forms, with or without modification, are permitted provided\n/ that the following condition is met:\n/\n/ 1. Redistributions of source code must retain the above copyright notice,\n/    this condition and the following disclaimer.\n/\n/ This software is provided by the copyright holder and contributors \"AS IS\"\n/ and any warranties related to this software are DISCLAIMED.\n/ The copyright owner or contributors be NOT LIABLE for any damages caused\n/ by use of this software.\n/\n/----------------------------------------------------------------------------*/\n\n\n#include <string.h>\n#include \"ff.h\"\t\t\t/* Declarations of FatFs API */\n#include \"diskio.h\"\t\t/* Declarations of device I/O functions */\n\n\n/*--------------------------------------------------------------------------\n\n   Module Private Definitions\n\n---------------------------------------------------------------------------*/\n\n#if FF_DEFINED != 80286\t/* Revision ID */\n#error Wrong include file (ff.h).\n#endif\n\n\n/* Limits and boundaries */\n#define MAX_DIR\t\t0x200000\t\t/* Max size of FAT directory */\n#define MAX_DIR_EX\t0x10000000\t\t/* Max size of exFAT directory */\n#define MAX_FAT12\t0xFF5\t\t\t/* Max FAT12 clusters (differs from specs, but right for real DOS/Windows behavior) */\n#define MAX_FAT16\t0xFFF5\t\t\t/* Max FAT16 clusters (differs from specs, but right for real DOS/Windows behavior) */\n#define MAX_FAT32\t0x0FFFFFF5\t\t/* Max FAT32 clusters (not specified, practical limit) */\n#define MAX_EXFAT\t0x7FFFFFFD\t\t/* Max exFAT clusters (differs from specs, implementation limit) */\n\n\n/* Character code support macros */\n#define IsUpper(c)\t\t((c) >= 'A' && (c) <= 'Z')\n#define IsLower(c)\t\t((c) >= 'a' && (c) <= 'z')\n#define IsDigit(c)\t\t((c) >= '0' && (c) <= '9')\n#define IsSeparator(c)\t((c) == '/' || (c) == '\\\\')\n#define IsTerminator(c)\t((UINT)(c) < (FF_USE_LFN ? ' ' : '!'))\n#define IsSurrogate(c)\t((c) >= 0xD800 && (c) <= 0xDFFF)\n#define IsSurrogateH(c)\t((c) >= 0xD800 && (c) <= 0xDBFF)\n#define IsSurrogateL(c)\t((c) >= 0xDC00 && (c) <= 0xDFFF)\n\n\n/* Additional file access control and file status flags for internal use */\n#define FA_SEEKEND\t0x20\t/* Seek to end of the file on file open */\n#define FA_MODIFIED\t0x40\t/* File has been modified */\n#define FA_DIRTY\t0x80\t/* FIL.buf[] needs to be written-back */\n\n\n/* Additional file attribute bits for internal use */\n#define AM_VOL\t\t0x08\t/* Volume label */\n#define AM_LFN\t\t0x0F\t/* LFN entry */\n#define AM_MASK\t\t0x3F\t/* Mask of defined bits in FAT */\n#define AM_MASKX\t0x37\t/* Mask of defined bits in exFAT */\n\n\n/* Name status flags in fn[11] */\n#define NSFLAG\t\t11\t\t/* Index of the name status byte */\n#define NS_LOSS\t\t0x01\t/* Out of 8.3 format */\n#define NS_LFN\t\t0x02\t/* Force to create LFN entry */\n#define NS_LAST\t\t0x04\t/* Last segment */\n#define NS_BODY\t\t0x08\t/* Lower case flag (body) */\n#define NS_EXT\t\t0x10\t/* Lower case flag (ext) */\n#define NS_DOT\t\t0x20\t/* Dot entry */\n#define NS_NOLFN\t0x40\t/* Do not find LFN */\n#define NS_NONAME\t0x80\t/* Not followed */\n\n\n/* exFAT directory entry types */\n#define\tET_BITMAP\t0x81\t/* Allocation bitmap */\n#define\tET_UPCASE\t0x82\t/* Up-case table */\n#define\tET_VLABEL\t0x83\t/* Volume label */\n#define\tET_FILEDIR\t0x85\t/* File and directory */\n#define\tET_STREAM\t0xC0\t/* Stream extension */\n#define\tET_FILENAME\t0xC1\t/* Name extension */\n\n\n/* FatFs refers the FAT structure as simple byte array instead of structure member\n/ because the C structure is not binary compatible between different platforms */\n\n#define BS_JmpBoot\t\t\t0\t\t/* x86 jump instruction (3-byte) */\n#define BS_OEMName\t\t\t3\t\t/* OEM name (8-byte) */\n#define BPB_BytsPerSec\t\t11\t\t/* Sector size [byte] (WORD) */\n#define BPB_SecPerClus\t\t13\t\t/* Cluster size [sector] (BYTE) */\n#define BPB_RsvdSecCnt\t\t14\t\t/* Size of reserved area [sector] (WORD) */\n#define BPB_NumFATs\t\t\t16\t\t/* Number of FATs (BYTE) */\n#define BPB_RootEntCnt\t\t17\t\t/* Size of root directory area for FAT [entry] (WORD) */\n#define BPB_TotSec16\t\t19\t\t/* Volume size (16-bit) [sector] (WORD) */\n#define BPB_Media\t\t\t21\t\t/* Media descriptor byte (BYTE) */\n#define BPB_FATSz16\t\t\t22\t\t/* FAT size (16-bit) [sector] (WORD) */\n#define BPB_SecPerTrk\t\t24\t\t/* Number of sectors per track for int13h [sector] (WORD) */\n#define BPB_NumHeads\t\t26\t\t/* Number of heads for int13h (WORD) */\n#define BPB_HiddSec\t\t\t28\t\t/* Volume offset from top of the drive (DWORD) */\n#define BPB_TotSec32\t\t32\t\t/* Volume size (32-bit) [sector] (DWORD) */\n#define BS_DrvNum\t\t\t36\t\t/* Physical drive number for int13h (BYTE) */\n#define BS_NTres\t\t\t37\t\t/* WindowsNT error flag (BYTE) */\n#define BS_BootSig\t\t\t38\t\t/* Extended boot signature (BYTE) */\n#define BS_VolID\t\t\t39\t\t/* Volume serial number (DWORD) */\n#define BS_VolLab\t\t\t43\t\t/* Volume label string (8-byte) */\n#define BS_FilSysType\t\t54\t\t/* Filesystem type string (8-byte) */\n#define BS_BootCode\t\t\t62\t\t/* Boot code (448-byte) */\n#define BS_55AA\t\t\t\t510\t\t/* Signature word (WORD) */\n\n#define BPB_FATSz32\t\t\t36\t\t/* FAT32: FAT size [sector] (DWORD) */\n#define BPB_ExtFlags32\t\t40\t\t/* FAT32: Extended flags (WORD) */\n#define BPB_FSVer32\t\t\t42\t\t/* FAT32: Filesystem version (WORD) */\n#define BPB_RootClus32\t\t44\t\t/* FAT32: Root directory cluster (DWORD) */\n#define BPB_FSInfo32\t\t48\t\t/* FAT32: Offset of FSINFO sector (WORD) */\n#define BPB_BkBootSec32\t\t50\t\t/* FAT32: Offset of backup boot sector (WORD) */\n#define BS_DrvNum32\t\t\t64\t\t/* FAT32: Physical drive number for int13h (BYTE) */\n#define BS_NTres32\t\t\t65\t\t/* FAT32: Error flag (BYTE) */\n#define BS_BootSig32\t\t66\t\t/* FAT32: Extended boot signature (BYTE) */\n#define BS_VolID32\t\t\t67\t\t/* FAT32: Volume serial number (DWORD) */\n#define BS_VolLab32\t\t\t71\t\t/* FAT32: Volume label string (8-byte) */\n#define BS_FilSysType32\t\t82\t\t/* FAT32: Filesystem type string (8-byte) */\n#define BS_BootCode32\t\t90\t\t/* FAT32: Boot code (420-byte) */\n\n#define BPB_ZeroedEx\t\t11\t\t/* exFAT: MBZ field (53-byte) */\n#define BPB_VolOfsEx\t\t64\t\t/* exFAT: Volume offset from top of the drive [sector] (QWORD) */\n#define BPB_TotSecEx\t\t72\t\t/* exFAT: Volume size [sector] (QWORD) */\n#define BPB_FatOfsEx\t\t80\t\t/* exFAT: FAT offset from top of the volume [sector] (DWORD) */\n#define BPB_FatSzEx\t\t\t84\t\t/* exFAT: FAT size [sector] (DWORD) */\n#define BPB_DataOfsEx\t\t88\t\t/* exFAT: Data offset from top of the volume [sector] (DWORD) */\n#define BPB_NumClusEx\t\t92\t\t/* exFAT: Number of clusters (DWORD) */\n#define BPB_RootClusEx\t\t96\t\t/* exFAT: Root directory start cluster (DWORD) */\n#define BPB_VolIDEx\t\t\t100\t\t/* exFAT: Volume serial number (DWORD) */\n#define BPB_FSVerEx\t\t\t104\t\t/* exFAT: Filesystem version (WORD) */\n#define BPB_VolFlagEx\t\t106\t\t/* exFAT: Volume flags (WORD) */\n#define BPB_BytsPerSecEx\t108\t\t/* exFAT: Log2 of sector size in unit of byte (BYTE) */\n#define BPB_SecPerClusEx\t109\t\t/* exFAT: Log2 of cluster size in unit of sector (BYTE) */\n#define BPB_NumFATsEx\t\t110\t\t/* exFAT: Number of FATs (BYTE) */\n#define BPB_DrvNumEx\t\t111\t\t/* exFAT: Physical drive number for int13h (BYTE) */\n#define BPB_PercInUseEx\t\t112\t\t/* exFAT: Percent in use (BYTE) */\n#define BPB_RsvdEx\t\t\t113\t\t/* exFAT: Reserved (7-byte) */\n#define BS_BootCodeEx\t\t120\t\t/* exFAT: Boot code (390-byte) */\n\n#define DIR_Name\t\t\t0\t\t/* Short file name (11-byte) */\n#define DIR_Attr\t\t\t11\t\t/* Attribute (BYTE) */\n#define DIR_NTres\t\t\t12\t\t/* Lower case flag (BYTE) */\n#define DIR_CrtTime10\t\t13\t\t/* Created time sub-second (BYTE) */\n#define DIR_CrtTime\t\t\t14\t\t/* Created time (DWORD) */\n#define DIR_LstAccDate\t\t18\t\t/* Last accessed date (WORD) */\n#define DIR_FstClusHI\t\t20\t\t/* Higher 16-bit of first cluster (WORD) */\n#define DIR_ModTime\t\t\t22\t\t/* Modified time (DWORD) */\n#define DIR_FstClusLO\t\t26\t\t/* Lower 16-bit of first cluster (WORD) */\n#define DIR_FileSize\t\t28\t\t/* File size (DWORD) */\n#define LDIR_Ord\t\t\t0\t\t/* LFN: LFN order and LLE flag (BYTE) */\n#define LDIR_Attr\t\t\t11\t\t/* LFN: LFN attribute (BYTE) */\n#define LDIR_Type\t\t\t12\t\t/* LFN: Entry type (BYTE) */\n#define LDIR_Chksum\t\t\t13\t\t/* LFN: Checksum of the SFN (BYTE) */\n#define LDIR_FstClusLO\t\t26\t\t/* LFN: MBZ field (WORD) */\n#define XDIR_Type\t\t\t0\t\t/* exFAT: Type of exFAT directory entry (BYTE) */\n#define XDIR_NumLabel\t\t1\t\t/* exFAT: Number of volume label characters (BYTE) */\n#define XDIR_Label\t\t\t2\t\t/* exFAT: Volume label (11-WORD) */\n#define XDIR_CaseSum\t\t4\t\t/* exFAT: Sum of case conversion table (DWORD) */\n#define XDIR_NumSec\t\t\t1\t\t/* exFAT: Number of secondary entries (BYTE) */\n#define XDIR_SetSum\t\t\t2\t\t/* exFAT: Sum of the set of directory entries (WORD) */\n#define XDIR_Attr\t\t\t4\t\t/* exFAT: File attribute (WORD) */\n#define XDIR_CrtTime\t\t8\t\t/* exFAT: Created time (DWORD) */\n#define XDIR_ModTime\t\t12\t\t/* exFAT: Modified time (DWORD) */\n#define XDIR_AccTime\t\t16\t\t/* exFAT: Last accessed time (DWORD) */\n#define XDIR_CrtTime10\t\t20\t\t/* exFAT: Created time subsecond (BYTE) */\n#define XDIR_ModTime10\t\t21\t\t/* exFAT: Modified time subsecond (BYTE) */\n#define XDIR_CrtTZ\t\t\t22\t\t/* exFAT: Created timezone (BYTE) */\n#define XDIR_ModTZ\t\t\t23\t\t/* exFAT: Modified timezone (BYTE) */\n#define XDIR_AccTZ\t\t\t24\t\t/* exFAT: Last accessed timezone (BYTE) */\n#define XDIR_GenFlags\t\t33\t\t/* exFAT: General secondary flags (BYTE) */\n#define XDIR_NumName\t\t35\t\t/* exFAT: Number of file name characters (BYTE) */\n#define XDIR_NameHash\t\t36\t\t/* exFAT: Hash of file name (WORD) */\n#define XDIR_ValidFileSize\t40\t\t/* exFAT: Valid file size (QWORD) */\n#define XDIR_FstClus\t\t52\t\t/* exFAT: First cluster of the file data (DWORD) */\n#define XDIR_FileSize\t\t56\t\t/* exFAT: File/Directory size (QWORD) */\n\n#define SZDIRE\t\t\t\t32\t\t/* Size of a directory entry */\n#define DDEM\t\t\t\t0xE5\t/* Deleted directory entry mark set to DIR_Name[0] */\n#define RDDEM\t\t\t\t0x05\t/* Replacement of the character collides with DDEM */\n#define LLEF\t\t\t\t0x40\t/* Last long entry flag in LDIR_Ord */\n\n#define FSI_LeadSig\t\t\t0\t\t/* FAT32 FSI: Leading signature (DWORD) */\n#define FSI_StrucSig\t\t484\t\t/* FAT32 FSI: Structure signature (DWORD) */\n#define FSI_Free_Count\t\t488\t\t/* FAT32 FSI: Number of free clusters (DWORD) */\n#define FSI_Nxt_Free\t\t492\t\t/* FAT32 FSI: Last allocated cluster (DWORD) */\n\n#define MBR_Table\t\t\t446\t\t/* MBR: Offset of partition table in the MBR */\n#define SZ_PTE\t\t\t\t16\t\t/* MBR: Size of a partition table entry */\n#define PTE_Boot\t\t\t0\t\t/* MBR PTE: Boot indicator */\n#define PTE_StHead\t\t\t1\t\t/* MBR PTE: Start head */\n#define PTE_StSec\t\t\t2\t\t/* MBR PTE: Start sector */\n#define PTE_StCyl\t\t\t3\t\t/* MBR PTE: Start cylinder */\n#define PTE_System\t\t\t4\t\t/* MBR PTE: System ID */\n#define PTE_EdHead\t\t\t5\t\t/* MBR PTE: End head */\n#define PTE_EdSec\t\t\t6\t\t/* MBR PTE: End sector */\n#define PTE_EdCyl\t\t\t7\t\t/* MBR PTE: End cylinder */\n#define PTE_StLba\t\t\t8\t\t/* MBR PTE: Start in LBA */\n#define PTE_SizLba\t\t\t12\t\t/* MBR PTE: Size in LBA */\n\n#define GPTH_Sign\t\t\t0\t\t/* GPT HDR: Signature (8-byte) */\n#define GPTH_Rev\t\t\t8\t\t/* GPT HDR: Revision (DWORD) */\n#define GPTH_Size\t\t\t12\t\t/* GPT HDR: Header size (DWORD) */\n#define GPTH_Bcc\t\t\t16\t\t/* GPT HDR: Header BCC (DWORD) */\n#define GPTH_CurLba\t\t\t24\t\t/* GPT HDR: This header LBA (QWORD) */\n#define GPTH_BakLba\t\t\t32\t\t/* GPT HDR: Another header LBA (QWORD) */\n#define GPTH_FstLba\t\t\t40\t\t/* GPT HDR: First LBA for partition data (QWORD) */\n#define GPTH_LstLba\t\t\t48\t\t/* GPT HDR: Last LBA for partition data (QWORD) */\n#define GPTH_DskGuid\t\t56\t\t/* GPT HDR: Disk GUID (16-byte) */\n#define GPTH_PtOfs\t\t\t72\t\t/* GPT HDR: Partition table LBA (QWORD) */\n#define GPTH_PtNum\t\t\t80\t\t/* GPT HDR: Number of table entries (DWORD) */\n#define GPTH_PteSize\t\t84\t\t/* GPT HDR: Size of table entry (DWORD) */\n#define GPTH_PtBcc\t\t\t88\t\t/* GPT HDR: Partition table BCC (DWORD) */\n#define SZ_GPTE\t\t\t\t128\t\t/* GPT PTE: Size of partition table entry */\n#define GPTE_PtGuid\t\t\t0\t\t/* GPT PTE: Partition type GUID (16-byte) */\n#define GPTE_UpGuid\t\t\t16\t\t/* GPT PTE: Partition unique GUID (16-byte) */\n#define GPTE_FstLba\t\t\t32\t\t/* GPT PTE: First LBA of partition (QWORD) */\n#define GPTE_LstLba\t\t\t40\t\t/* GPT PTE: Last LBA of partition (QWORD) */\n#define GPTE_Flags\t\t\t48\t\t/* GPT PTE: Partition flags (QWORD) */\n#define GPTE_Name\t\t\t56\t\t/* GPT PTE: Partition name */\n\n\n/* Post process on fatal error in the file operations */\n#define ABORT(fs, res)\t\t{ fp->err = (BYTE)(res); LEAVE_FF(fs, res); }\n\n\n/* Re-entrancy related */\n#if FF_FS_REENTRANT\n#if FF_USE_LFN == 1\n#error Static LFN work area cannot be used in thread-safe configuration\n#endif\n#define LEAVE_FF(fs, res)\t{ unlock_volume(fs, res); return res; }\n#else\n#define LEAVE_FF(fs, res)\treturn res\n#endif\n\n\n/* Definitions of logical drive - physical location conversion */\n#if FF_MULTI_PARTITION\n#define LD2PD(vol) VolToPart[vol].pd\t/* Get physical drive number */\n#define LD2PT(vol) VolToPart[vol].pt\t/* Get partition number (0:auto search, 1..:forced partition number) */\n#else\n#define LD2PD(vol) (BYTE)(vol)\t/* Each logical drive is associated with the same physical drive number */\n#define LD2PT(vol) 0\t\t\t/* Auto partition search */\n#endif\n\n\n/* Definitions of sector size */\n#if (FF_MAX_SS < FF_MIN_SS) || (FF_MAX_SS != 512 && FF_MAX_SS != 1024 && FF_MAX_SS != 2048 && FF_MAX_SS != 4096) || (FF_MIN_SS != 512 && FF_MIN_SS != 1024 && FF_MIN_SS != 2048 && FF_MIN_SS != 4096)\n#error Wrong sector size configuration\n#endif\n#if FF_MAX_SS == FF_MIN_SS\n#define SS(fs)\t((UINT)FF_MAX_SS)\t/* Fixed sector size */\n#else\n#define SS(fs)\t((fs)->ssize)\t/* Variable sector size */\n#endif\n\n\n/* Timestamp */\n#if FF_FS_NORTC == 1\n#if FF_NORTC_YEAR < 1980 || FF_NORTC_YEAR > 2107 || FF_NORTC_MON < 1 || FF_NORTC_MON > 12 || FF_NORTC_MDAY < 1 || FF_NORTC_MDAY > 31\n#error Invalid FF_FS_NORTC settings\n#endif\n#define GET_FATTIME()\t((DWORD)(FF_NORTC_YEAR - 1980) << 25 | (DWORD)FF_NORTC_MON << 21 | (DWORD)FF_NORTC_MDAY << 16)\n#else\n#define GET_FATTIME()\tget_fattime()\n#endif\n\n\n/* File lock controls */\n#if FF_FS_LOCK\n#if FF_FS_READONLY\n#error FF_FS_LOCK must be 0 at read-only configuration\n#endif\ntypedef struct {\n\tFATFS* fs;\t\t/* Object ID 1, volume (NULL:blank entry) */\n\tDWORD clu;\t\t/* Object ID 2, containing directory (0:root) */\n\tDWORD ofs;\t\t/* Object ID 3, offset in the directory */\n\tUINT ctr;\t\t/* Object open counter, 0:none, 0x01..0xFF:read mode open count, 0x100:write mode */\n} FILESEM;\n#endif\n\n\n/* SBCS up-case tables (\\x80-\\xFF) */\n#define TBL_CT437  {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT720  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT737  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \\\n\t\t\t\t\t0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xEF,0xF5,0xF0,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT771  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDC,0xDE,0xDE, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFE,0xFF}\n#define TBL_CT775  {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT850  {0x43,0x55,0x45,0x41,0x41,0x41,0x41,0x43,0x45,0x45,0x45,0x49,0x49,0x49,0x41,0x41, \\\n\t\t\t\t\t0x45,0x92,0x92,0x4F,0x4F,0x4F,0x55,0x55,0x59,0x4F,0x55,0x4F,0x9C,0x4F,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0x41,0x41,0x41,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0x41,0x41,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD1,0xD1,0x45,0x45,0x45,0x49,0x49,0x49,0x49,0xD9,0xDA,0xDB,0xDC,0xDD,0x49,0xDF, \\\n\t\t\t\t\t0x4F,0xE1,0x4F,0x4F,0x4F,0x4F,0xE6,0xE8,0xE8,0x55,0x55,0x55,0x59,0x59,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT852  {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0xAC, \\\n\t\t\t\t\t0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF}\n#define TBL_CT855  {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F, \\\n\t\t\t\t\t0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \\\n\t\t\t\t\t0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \\\n\t\t\t\t\t0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT857  {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x49,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \\\n\t\t\t\t\t0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0x49,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT860  {0x80,0x9A,0x90,0x8F,0x8E,0x91,0x86,0x80,0x89,0x89,0x92,0x8B,0x8C,0x98,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x8C,0x99,0xA9,0x96,0x9D,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x86,0x8B,0x9F,0x96,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT861  {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x8B,0x8B,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x4F,0x99,0x8D,0x55,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xA4,0xA5,0xA6,0xA7,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT862  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT863  {0x43,0x55,0x45,0x41,0x41,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x41,0x8F, \\\n\t\t\t\t\t0x45,0x45,0x45,0x4F,0x45,0x49,0x55,0x55,0x98,0x4F,0x55,0x9B,0x9C,0x55,0x55,0x9F, \\\n\t\t\t\t\t0xA0,0xA1,0x4F,0x55,0xA4,0xA5,0xA6,0xA7,0x49,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT864  {0x80,0x9A,0x45,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT865  {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT866  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \\\n\t\t\t\t\t0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF}\n#define TBL_CT869  {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, \\\n\t\t\t\t\t0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x86,0x9C,0x8D,0x8F,0x90, \\\n\t\t\t\t\t0x91,0x90,0x92,0x95,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, \\\n\t\t\t\t\t0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \\\n\t\t\t\t\t0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, \\\n\t\t\t\t\t0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xA4,0xA5,0xA6,0xD9,0xDA,0xDB,0xDC,0xA7,0xA8,0xDF, \\\n\t\t\t\t\t0xA9,0xAA,0xAC,0xAD,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xCF,0xCF,0xD0,0xEF, \\\n\t\t\t\t\t0xF0,0xF1,0xD1,0xD2,0xD3,0xF5,0xD4,0xF7,0xF8,0xF9,0xD5,0x96,0x95,0x98,0xFE,0xFF}\n\n\n/* DBCS code range |----- 1st byte -----|  |----------- 2nd byte -----------| */\n/*                  <------>    <------>    <------>    <------>    <------>  */\n#define TBL_DC932 {0x81, 0x9F, 0xE0, 0xFC, 0x40, 0x7E, 0x80, 0xFC, 0x00, 0x00}\n#define TBL_DC936 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0x80, 0xFE, 0x00, 0x00}\n#define TBL_DC949 {0x81, 0xFE, 0x00, 0x00, 0x41, 0x5A, 0x61, 0x7A, 0x81, 0xFE}\n#define TBL_DC950 {0x81, 0xFE, 0x00, 0x00, 0x40, 0x7E, 0xA1, 0xFE, 0x00, 0x00}\n\n\n/* Macros for table definitions */\n#define MERGE_2STR(a, b) a ## b\n#define MKCVTBL(hd, cp) MERGE_2STR(hd, cp)\n\n\n\n\n/*--------------------------------------------------------------------------\n\n   Module Private Work Area\n\n---------------------------------------------------------------------------*/\n/* Remark: Variables defined here without initial value shall be guaranteed\n/  zero/null at start-up. If not, the linker option or start-up routine is\n/  not compliance with C standard. */\n\n/*--------------------------------*/\n/* File/Volume controls           */\n/*--------------------------------*/\n\n#if FF_VOLUMES < 1 || FF_VOLUMES > 10\n#error Wrong FF_VOLUMES setting\n#endif\nstatic FATFS *FatFs[FF_VOLUMES];\t/* Pointer to the filesystem objects (logical drives) */\nstatic WORD Fsid;\t\t\t\t\t/* Filesystem mount ID */\n\n#if FF_FS_RPATH != 0\nstatic BYTE CurrVol;\t\t\t\t/* Current drive set by f_chdrive() */\n#endif\n\n#if FF_FS_LOCK != 0\nstatic FILESEM Files[FF_FS_LOCK];\t/* Open object lock semaphores */\n#if FF_FS_REENTRANT\nstatic BYTE SysLock;\t\t\t\t/* System lock flag (0:no mutex, 1:unlocked, 2:locked) */\n#endif\n#endif\n\n#if FF_STR_VOLUME_ID\n#ifdef FF_VOLUME_STRS\nstatic const char *const VolumeStr[FF_VOLUMES] = {FF_VOLUME_STRS};\t/* Pre-defined volume ID */\n#endif\n#endif\n\n#if FF_LBA64\n#if FF_MIN_GPT > 0x100000000\n#error Wrong FF_MIN_GPT setting\n#endif\nstatic const BYTE GUID_MS_Basic[16] = {0xA2,0xA0,0xD0,0xEB,0xE5,0xB9,0x33,0x44,0x87,0xC0,0x68,0xB6,0xB7,0x26,0x99,0xC7};\n#endif\n\n\n\n/*--------------------------------*/\n/* LFN/Directory working buffer   */\n/*--------------------------------*/\n\n#if FF_USE_LFN == 0\t\t/* Non-LFN configuration */\n#if FF_FS_EXFAT\n#error LFN must be enabled when enable exFAT\n#endif\n#define DEF_NAMBUF\n#define INIT_NAMBUF(fs)\n#define FREE_NAMBUF()\n#define LEAVE_MKFS(res)\treturn res\n\n#else\t\t\t\t\t/* LFN configurations */\n#if FF_MAX_LFN < 12 || FF_MAX_LFN > 255\n#error Wrong setting of FF_MAX_LFN\n#endif\n#if FF_LFN_BUF < FF_SFN_BUF || FF_SFN_BUF < 12\n#error Wrong setting of FF_LFN_BUF or FF_SFN_BUF\n#endif\n#if FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3\n#error Wrong setting of FF_LFN_UNICODE\n#endif\nstatic const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30};\t/* FAT: Offset of LFN characters in the directory entry */\n#define MAXDIRB(nc)\t((nc + 44U) / 15 * SZDIRE)\t/* exFAT: Size of directory entry block scratchpad buffer needed for the name length */\n\n#if FF_USE_LFN == 1\t\t/* LFN enabled with static working buffer */\n#if FF_FS_EXFAT\nstatic BYTE\tDirBuf[MAXDIRB(FF_MAX_LFN)];\t/* Directory entry block scratchpad buffer */\n#endif\nstatic WCHAR LfnBuf[FF_MAX_LFN + 1];\t\t/* LFN working buffer */\n#define DEF_NAMBUF\n#define INIT_NAMBUF(fs)\n#define FREE_NAMBUF()\n#define LEAVE_MKFS(res)\treturn res\n\n#elif FF_USE_LFN == 2 \t/* LFN enabled with dynamic working buffer on the stack */\n#if FF_FS_EXFAT\n#define DEF_NAMBUF\t\tWCHAR lbuf[FF_MAX_LFN+1]; BYTE dbuf[MAXDIRB(FF_MAX_LFN)];\t/* LFN working buffer and directory entry block scratchpad buffer */\n#define INIT_NAMBUF(fs)\t{ (fs)->lfnbuf = lbuf; (fs)->dirbuf = dbuf; }\n#define FREE_NAMBUF()\n#else\n#define DEF_NAMBUF\t\tWCHAR lbuf[FF_MAX_LFN+1];\t/* LFN working buffer */\n#define INIT_NAMBUF(fs)\t{ (fs)->lfnbuf = lbuf; }\n#define FREE_NAMBUF()\n#endif\n#define LEAVE_MKFS(res)\treturn res\n\n#elif FF_USE_LFN == 3 \t/* LFN enabled with dynamic working buffer on the heap */\n#if FF_FS_EXFAT\n#define DEF_NAMBUF\t\tWCHAR *lfn;\t/* Pointer to LFN working buffer and directory entry block scratchpad buffer */\n#define INIT_NAMBUF(fs)\t{ lfn = ff_memalloc((FF_MAX_LFN+1)*2 + MAXDIRB(FF_MAX_LFN)); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; (fs)->dirbuf = (BYTE*)(lfn+FF_MAX_LFN+1); }\n#define FREE_NAMBUF()\tff_memfree(lfn)\n#else\n#define DEF_NAMBUF\t\tWCHAR *lfn;\t/* Pointer to LFN working buffer */\n#define INIT_NAMBUF(fs)\t{ lfn = ff_memalloc((FF_MAX_LFN+1)*2); if (!lfn) LEAVE_FF(fs, FR_NOT_ENOUGH_CORE); (fs)->lfnbuf = lfn; }\n#define FREE_NAMBUF()\tff_memfree(lfn)\n#endif\n#define LEAVE_MKFS(res)\t{ if (!work) ff_memfree(buf); return res; }\n#define MAX_MALLOC\t0x8000\t/* Must be >=FF_MAX_SS */\n\n#else\n#error Wrong setting of FF_USE_LFN\n\n#endif\t/* FF_USE_LFN == 1 */\n#endif\t/* FF_USE_LFN == 0 */\n\n\n\n/*--------------------------------*/\n/* Code conversion tables         */\n/*--------------------------------*/\n\n#if FF_CODE_PAGE == 0\t/* Run-time code page configuration */\n#define CODEPAGE CodePage\nstatic WORD CodePage;\t/* Current code page */\nstatic const BYTE* ExCvt;\t/* Ptr to SBCS up-case table Ct???[] (null:not used) */\nstatic const BYTE* DbcTbl;\t/* Ptr to DBCS code range table Dc???[] (null:not used) */\n\nstatic const BYTE Ct437[] = TBL_CT437;\nstatic const BYTE Ct720[] = TBL_CT720;\nstatic const BYTE Ct737[] = TBL_CT737;\nstatic const BYTE Ct771[] = TBL_CT771;\nstatic const BYTE Ct775[] = TBL_CT775;\nstatic const BYTE Ct850[] = TBL_CT850;\nstatic const BYTE Ct852[] = TBL_CT852;\nstatic const BYTE Ct855[] = TBL_CT855;\nstatic const BYTE Ct857[] = TBL_CT857;\nstatic const BYTE Ct860[] = TBL_CT860;\nstatic const BYTE Ct861[] = TBL_CT861;\nstatic const BYTE Ct862[] = TBL_CT862;\nstatic const BYTE Ct863[] = TBL_CT863;\nstatic const BYTE Ct864[] = TBL_CT864;\nstatic const BYTE Ct865[] = TBL_CT865;\nstatic const BYTE Ct866[] = TBL_CT866;\nstatic const BYTE Ct869[] = TBL_CT869;\nstatic const BYTE Dc932[] = TBL_DC932;\nstatic const BYTE Dc936[] = TBL_DC936;\nstatic const BYTE Dc949[] = TBL_DC949;\nstatic const BYTE Dc950[] = TBL_DC950;\n\n#elif FF_CODE_PAGE < 900\t/* Static code page configuration (SBCS) */\n#define CODEPAGE FF_CODE_PAGE\nstatic const BYTE ExCvt[] = MKCVTBL(TBL_CT, FF_CODE_PAGE);\n\n#else\t\t\t\t\t/* Static code page configuration (DBCS) */\n#define CODEPAGE FF_CODE_PAGE\nstatic const BYTE DbcTbl[] = MKCVTBL(TBL_DC, FF_CODE_PAGE);\n\n#endif\n\n\n\n\n/*--------------------------------------------------------------------------\n\n   Module Private Functions\n\n---------------------------------------------------------------------------*/\n\n\n/*-----------------------------------------------------------------------*/\n/* Load/Store multi-byte word in the FAT structure                       */\n/*-----------------------------------------------------------------------*/\n\nstatic WORD ld_word (const BYTE* ptr)\t/*\t Load a 2-byte little-endian word */\n{\n\tWORD rv;\n\n\trv = ptr[1];\n\trv = rv << 8 | ptr[0];\n\treturn rv;\n}\n\nstatic DWORD ld_dword (const BYTE* ptr)\t/* Load a 4-byte little-endian word */\n{\n\tDWORD rv;\n\n\trv = ptr[3];\n\trv = rv << 8 | ptr[2];\n\trv = rv << 8 | ptr[1];\n\trv = rv << 8 | ptr[0];\n\treturn rv;\n}\n\n#if FF_FS_EXFAT\nstatic QWORD ld_qword (const BYTE* ptr)\t/* Load an 8-byte little-endian word */\n{\n\tQWORD rv;\n\n\trv = ptr[7];\n\trv = rv << 8 | ptr[6];\n\trv = rv << 8 | ptr[5];\n\trv = rv << 8 | ptr[4];\n\trv = rv << 8 | ptr[3];\n\trv = rv << 8 | ptr[2];\n\trv = rv << 8 | ptr[1];\n\trv = rv << 8 | ptr[0];\n\treturn rv;\n}\n#endif\n\n#if !FF_FS_READONLY\nstatic void st_word (BYTE* ptr, WORD val)\t/* Store a 2-byte word in little-endian */\n{\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val;\n}\n\nstatic void st_dword (BYTE* ptr, DWORD val)\t/* Store a 4-byte word in little-endian */\n{\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val;\n}\n\n#if FF_FS_EXFAT\nstatic void st_qword (BYTE* ptr, QWORD val)\t/* Store an 8-byte word in little-endian */\n{\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val; val >>= 8;\n\t*ptr++ = (BYTE)val;\n}\n#endif\n#endif\t/* !FF_FS_READONLY */\n\n\n\n/*-----------------------------------------------------------------------*/\n/* String functions                                                      */\n/*-----------------------------------------------------------------------*/\n\n/* Test if the byte is DBC 1st byte */\nstatic int dbc_1st (BYTE c)\n{\n#if FF_CODE_PAGE == 0\t\t/* Variable code page */\n\tif (DbcTbl && c >= DbcTbl[0]) {\n\t\tif (c <= DbcTbl[1]) return 1;\t\t\t\t\t/* 1st byte range 1 */\n\t\tif (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1;\t/* 1st byte range 2 */\n\t}\n#elif FF_CODE_PAGE >= 900\t/* DBCS fixed code page */\n\tif (c >= DbcTbl[0]) {\n\t\tif (c <= DbcTbl[1]) return 1;\n\t\tif (c >= DbcTbl[2] && c <= DbcTbl[3]) return 1;\n\t}\n#else\t\t\t\t\t\t/* SBCS fixed code page */\n\tif (c != 0) return 0;\t/* Always false */\n#endif\n\treturn 0;\n}\n\n\n/* Test if the byte is DBC 2nd byte */\nstatic int dbc_2nd (BYTE c)\n{\n#if FF_CODE_PAGE == 0\t\t/* Variable code page */\n\tif (DbcTbl && c >= DbcTbl[4]) {\n\t\tif (c <= DbcTbl[5]) return 1;\t\t\t\t\t/* 2nd byte range 1 */\n\t\tif (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1;\t/* 2nd byte range 2 */\n\t\tif (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1;\t/* 2nd byte range 3 */\n\t}\n#elif FF_CODE_PAGE >= 900\t/* DBCS fixed code page */\n\tif (c >= DbcTbl[4]) {\n\t\tif (c <= DbcTbl[5]) return 1;\n\t\tif (c >= DbcTbl[6] && c <= DbcTbl[7]) return 1;\n\t\tif (c >= DbcTbl[8] && c <= DbcTbl[9]) return 1;\n\t}\n#else\t\t\t\t\t\t/* SBCS fixed code page */\n\tif (c != 0) return 0;\t/* Always false */\n#endif\n\treturn 0;\n}\n\n\n#if FF_USE_LFN\n\n/* Get a Unicode code point from the TCHAR string in defined API encodeing */\nstatic DWORD tchar2uni (\t/* Returns a character in UTF-16 encoding (>=0x10000 on surrogate pair, 0xFFFFFFFF on decode error) */\n\tconst TCHAR** str\t\t/* Pointer to pointer to TCHAR string in configured encoding */\n)\n{\n\tDWORD uc;\n\tconst TCHAR *p = *str;\n\n#if FF_LFN_UNICODE == 1\t\t/* UTF-16 input */\n\tWCHAR wc;\n\n\tuc = *p++;\t/* Get a unit */\n\tif (IsSurrogate(uc)) {\t/* Surrogate? */\n\t\twc = *p++;\t\t/* Get low surrogate */\n\t\tif (!IsSurrogateH(uc) || !IsSurrogateL(wc)) return 0xFFFFFFFF;\t/* Wrong surrogate? */\n\t\tuc = uc << 16 | wc;\n\t}\n\n#elif FF_LFN_UNICODE == 2\t/* UTF-8 input */\n\tBYTE b;\n\tint nf;\n\n\tuc = (BYTE)*p++;\t/* Get an encoding unit */\n\tif (uc & 0x80) {\t/* Multiple byte code? */\n\t\tif        ((uc & 0xE0) == 0xC0) {\t/* 2-byte sequence? */\n\t\t\tuc &= 0x1F; nf = 1;\n\t\t} else if ((uc & 0xF0) == 0xE0) {\t/* 3-byte sequence? */\n\t\t\tuc &= 0x0F; nf = 2;\n\t\t} else if ((uc & 0xF8) == 0xF0) {\t/* 4-byte sequence? */\n\t\t\tuc &= 0x07; nf = 3;\n\t\t} else {\t\t\t\t\t\t\t/* Wrong sequence */\n\t\t\treturn 0xFFFFFFFF;\n\t\t}\n\t\tdo {\t/* Get trailing bytes */\n\t\t\tb = (BYTE)*p++;\n\t\t\tif ((b & 0xC0) != 0x80) return 0xFFFFFFFF;\t/* Wrong sequence? */\n\t\t\tuc = uc << 6 | (b & 0x3F);\n\t\t} while (--nf != 0);\n\t\tif (uc < 0x80 || IsSurrogate(uc) || uc >= 0x110000) return 0xFFFFFFFF;\t/* Wrong code? */\n\t\tif (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF);\t/* Make a surrogate pair if needed */\n\t}\n\n#elif FF_LFN_UNICODE == 3\t/* UTF-32 input */\n\tuc = (TCHAR)*p++;\t/* Get a unit */\n\tif (uc >= 0x110000 || IsSurrogate(uc)) return 0xFFFFFFFF;\t/* Wrong code? */\n\tif (uc >= 0x010000) uc = 0xD800DC00 | ((uc - 0x10000) << 6 & 0x3FF0000) | (uc & 0x3FF);\t/* Make a surrogate pair if needed */\n\n#else\t\t/* ANSI/OEM input */\n\tBYTE b;\n\tWCHAR wc;\n\n\twc = (BYTE)*p++;\t\t\t/* Get a byte */\n\tif (dbc_1st((BYTE)wc)) {\t/* Is it a DBC 1st byte? */\n\t\tb = (BYTE)*p++;\t\t\t/* Get 2nd byte */\n\t\tif (!dbc_2nd(b)) return 0xFFFFFFFF;\t/* Invalid code? */\n\t\twc = (wc << 8) + b;\t\t/* Make a DBC */\n\t}\n\tif (wc != 0) {\n\t\twc = ff_oem2uni(wc, CODEPAGE);\t/* ANSI/OEM ==> Unicode */\n\t\tif (wc == 0) return 0xFFFFFFFF;\t/* Invalid code? */\n\t}\n\tuc = wc;\n\n#endif\n\t*str = p;\t/* Next read pointer */\n\treturn uc;\n}\n\n\n/* Store a Unicode char in defined API encoding */\nstatic UINT put_utf (\t/* Returns number of encoding units written (0:buffer overflow or wrong encoding) */\n\tDWORD chr,\t/* UTF-16 encoded character (Surrogate pair if >=0x10000) */\n\tTCHAR* buf,\t/* Output buffer */\n\tUINT szb\t/* Size of the buffer */\n)\n{\n#if FF_LFN_UNICODE == 1\t/* UTF-16 output */\n\tWCHAR hs, wc;\n\n\ths = (WCHAR)(chr >> 16);\n\twc = (WCHAR)chr;\n\tif (hs == 0) {\t/* Single encoding unit? */\n\t\tif (szb < 1 || IsSurrogate(wc)) return 0;\t/* Buffer overflow or wrong code? */\n\t\t*buf = wc;\n\t\treturn 1;\n\t}\n\tif (szb < 2 || !IsSurrogateH(hs) || !IsSurrogateL(wc)) return 0;\t/* Buffer overflow or wrong surrogate? */\n\t*buf++ = hs;\n\t*buf++ = wc;\n\treturn 2;\n\n#elif FF_LFN_UNICODE == 2\t/* UTF-8 output */\n\tDWORD hc;\n\n\tif (chr < 0x80) {\t/* Single byte code? */\n\t\tif (szb < 1) return 0;\t/* Buffer overflow? */\n\t\t*buf = (TCHAR)chr;\n\t\treturn 1;\n\t}\n\tif (chr < 0x800) {\t/* 2-byte sequence? */\n\t\tif (szb < 2) return 0;\t/* Buffer overflow? */\n\t\t*buf++ = (TCHAR)(0xC0 | (chr >> 6 & 0x1F));\n\t\t*buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F));\n\t\treturn 2;\n\t}\n\tif (chr < 0x10000) {\t/* 3-byte sequence? */\n\t\tif (szb < 3 || IsSurrogate(chr)) return 0;\t/* Buffer overflow or wrong code? */\n\t\t*buf++ = (TCHAR)(0xE0 | (chr >> 12 & 0x0F));\n\t\t*buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F));\n\t\t*buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F));\n\t\treturn 3;\n\t}\n\t/* 4-byte sequence */\n\tif (szb < 4) return 0;\t/* Buffer overflow? */\n\thc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6;\t/* Get high 10 bits */\n\tchr = (chr & 0xFFFF) - 0xDC00;\t\t\t\t\t/* Get low 10 bits */\n\tif (hc >= 0x100000 || chr >= 0x400) return 0;\t/* Wrong surrogate? */\n\tchr = (hc | chr) + 0x10000;\n\t*buf++ = (TCHAR)(0xF0 | (chr >> 18 & 0x07));\n\t*buf++ = (TCHAR)(0x80 | (chr >> 12 & 0x3F));\n\t*buf++ = (TCHAR)(0x80 | (chr >> 6 & 0x3F));\n\t*buf++ = (TCHAR)(0x80 | (chr >> 0 & 0x3F));\n\treturn 4;\n\n#elif FF_LFN_UNICODE == 3\t/* UTF-32 output */\n\tDWORD hc;\n\n\tif (szb < 1) return 0;\t/* Buffer overflow? */\n\tif (chr >= 0x10000) {\t/* Out of BMP? */\n\t\thc = ((chr & 0xFFFF0000) - 0xD8000000) >> 6;\t/* Get high 10 bits */\n\t\tchr = (chr & 0xFFFF) - 0xDC00;\t\t\t\t\t/* Get low 10 bits */\n\t\tif (hc >= 0x100000 || chr >= 0x400) return 0;\t/* Wrong surrogate? */\n\t\tchr = (hc | chr) + 0x10000;\n\t}\n\t*buf++ = (TCHAR)chr;\n\treturn 1;\n\n#else\t\t\t\t\t\t/* ANSI/OEM output */\n\tWCHAR wc;\n\n\twc = ff_uni2oem(chr, CODEPAGE);\n\tif (wc >= 0x100) {\t/* Is this a DBC? */\n\t\tif (szb < 2) return 0;\n\t\t*buf++ = (char)(wc >> 8);\t/* Store DBC 1st byte */\n\t\t*buf++ = (TCHAR)wc;\t\t\t/* Store DBC 2nd byte */\n\t\treturn 2;\n\t}\n\tif (wc == 0 || szb < 1) return 0;\t/* Invalid char or buffer overflow? */\n\t*buf++ = (TCHAR)wc;\t\t\t\t\t/* Store the character */\n\treturn 1;\n#endif\n}\n#endif\t/* FF_USE_LFN */\n\n\n#if FF_FS_REENTRANT\n/*-----------------------------------------------------------------------*/\n/* Request/Release grant to access the volume                            */\n/*-----------------------------------------------------------------------*/\n\nstatic int lock_volume (\t/* 1:Ok, 0:timeout */\n\tFATFS* fs,\t\t\t\t/* Filesystem object to lock */\n\tint syslock\t\t\t\t/* System lock required */\n)\n{\n\tint rv;\n\n\n#if FF_FS_LOCK\n\trv = ff_mutex_take(fs->ldrv);\t/* Lock the volume */\n\tif (rv && syslock) {\t\t\t/* System lock reqiered? */\n\t\trv = ff_mutex_take(FF_VOLUMES);\t/* Lock the system */\n\t\tif (rv) {\n\t\t\tSysLock = 2;\t\t\t\t/* System lock succeeded */\n\t\t} else {\n\t\t\tff_mutex_give(fs->ldrv);\t/* Failed system lock */\n\t\t}\n\t}\n#else\n\trv = syslock ? ff_mutex_take(fs->ldrv) : ff_mutex_take(fs->ldrv);\t/* Lock the volume (this is to prevent compiler warning) */\n#endif\n\treturn rv;\n}\n\n\nstatic void unlock_volume (\n\tFATFS* fs,\t\t/* Filesystem object */\n\tFRESULT res\t\t/* Result code to be returned */\n)\n{\n\tif (fs && res != FR_NOT_ENABLED && res != FR_INVALID_DRIVE && res != FR_TIMEOUT) {\n#if FF_FS_LOCK\n\t\tif (SysLock == 2) {\t/* Is the system locked? */\n\t\t\tSysLock = 1;\n\t\t\tff_mutex_give(FF_VOLUMES);\n\t\t}\n#endif\n\t\tff_mutex_give(fs->ldrv);\t/* Unlock the volume */\n\t}\n}\n\n#endif\n\n\n\n#if FF_FS_LOCK\n/*-----------------------------------------------------------------------*/\n/* File shareing control functions                                       */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT chk_share (\t/* Check if the file can be accessed */\n\tDIR* dp,\t\t/* Directory object pointing the file to be checked */\n\tint acc\t\t\t/* Desired access type (0:Read mode open, 1:Write mode open, 2:Delete or rename) */\n)\n{\n\tUINT i, be;\n\n\t/* Search open object table for the object */\n\tbe = 0;\n\tfor (i = 0; i < FF_FS_LOCK; i++) {\n\t\tif (Files[i].fs) {\t/* Existing entry */\n\t\t\tif (Files[i].fs == dp->obj.fs &&\t \t/* Check if the object matches with an open object */\n\t\t\t\tFiles[i].clu == dp->obj.sclust &&\n\t\t\t\tFiles[i].ofs == dp->dptr) break;\n\t\t} else {\t\t\t/* Blank entry */\n\t\t\tbe = 1;\n\t\t}\n\t}\n\tif (i == FF_FS_LOCK) {\t/* The object has not been opened */\n\t\treturn (!be && acc != 2) ? FR_TOO_MANY_OPEN_FILES : FR_OK;\t/* Is there a blank entry for new object? */\n\t}\n\n\t/* The object was opened. Reject any open against writing file and all write mode open */\n\treturn (acc != 0 || Files[i].ctr == 0x100) ? FR_LOCKED : FR_OK;\n}\n\n\nstatic int enq_share (void)\t/* Check if an entry is available for a new object */\n{\n\tUINT i;\n\n\tfor (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ;\t/* Find a free entry */\n\treturn (i == FF_FS_LOCK) ? 0 : 1;\n}\n\n\nstatic UINT inc_share (\t/* Increment object open counter and returns its index (0:Internal error) */\n\tDIR* dp,\t/* Directory object pointing the file to register or increment */\n\tint acc\t\t/* Desired access (0:Read, 1:Write, 2:Delete/Rename) */\n)\n{\n\tUINT i;\n\n\n\tfor (i = 0; i < FF_FS_LOCK; i++) {\t/* Find the object */\n\t\tif (Files[i].fs == dp->obj.fs\n\t\t && Files[i].clu == dp->obj.sclust\n\t\t && Files[i].ofs == dp->dptr) break;\n\t}\n\n\tif (i == FF_FS_LOCK) {\t\t\t/* Not opened. Register it as new. */\n\t\tfor (i = 0; i < FF_FS_LOCK && Files[i].fs; i++) ;\t/* Find a free entry */\n\t\tif (i == FF_FS_LOCK) return 0;\t/* No free entry to register (int err) */\n\t\tFiles[i].fs = dp->obj.fs;\n\t\tFiles[i].clu = dp->obj.sclust;\n\t\tFiles[i].ofs = dp->dptr;\n\t\tFiles[i].ctr = 0;\n\t}\n\n\tif (acc >= 1 && Files[i].ctr) return 0;\t/* Access violation (int err) */\n\n\tFiles[i].ctr = acc ? 0x100 : Files[i].ctr + 1;\t/* Set semaphore value */\n\n\treturn i + 1;\t/* Index number origin from 1 */\n}\n\n\nstatic FRESULT dec_share (\t/* Decrement object open counter */\n\tUINT i\t\t\t/* Semaphore index (1..) */\n)\n{\n\tUINT n;\n\tFRESULT res;\n\n\n\tif (--i < FF_FS_LOCK) {\t/* Index number origin from 0 */\n\t\tn = Files[i].ctr;\n\t\tif (n == 0x100) n = 0;\t/* If write mode open, delete the object semaphore */\n\t\tif (n > 0) n--;\t\t\t/* Decrement read mode open count */\n\t\tFiles[i].ctr = n;\n\t\tif (n == 0) {\t\t\t/* Delete the object semaphore if open count becomes zero */\n\t\t\tFiles[i].fs = 0;\t/* Free the entry <<<If this memory write operation is not in atomic, FF_FS_REENTRANT == 1 and FF_VOLUMES > 1, there is a potential error in this process >>> */\n\t\t}\n\t\tres = FR_OK;\n\t} else {\n\t\tres = FR_INT_ERR;\t\t/* Invalid index number */\n\t}\n\treturn res;\n}\n\n\nstatic void clear_share (\t/* Clear all lock entries of the volume */\n\tFATFS* fs\n)\n{\n\tUINT i;\n\n\tfor (i = 0; i < FF_FS_LOCK; i++) {\n\t\tif (Files[i].fs == fs) Files[i].fs = 0;\n\t}\n}\n\n#endif\t/* FF_FS_LOCK */\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Move/Flush disk access window in the filesystem object                */\n/*-----------------------------------------------------------------------*/\n#if !FF_FS_READONLY\nstatic FRESULT sync_window (\t/* Returns FR_OK or FR_DISK_ERR */\n\tFATFS* fs\t\t\t/* Filesystem object */\n)\n{\n\tFRESULT res = FR_OK;\n\n\n\tif (fs->wflag) {\t/* Is the disk access window dirty? */\n\t\tif (disk_write(fs->pdrv, fs->win, fs->winsect, 1) == RES_OK) {\t/* Write it back into the volume */\n\t\t\tfs->wflag = 0;\t/* Clear window dirty flag */\n\t\t\tif (fs->winsect - fs->fatbase < fs->fsize) {\t/* Is it in the 1st FAT? */\n\t\t\t\tif (fs->n_fats == 2) disk_write(fs->pdrv, fs->win, fs->winsect + fs->fsize, 1);\t/* Reflect it to 2nd FAT if needed */\n\t\t\t}\n\t\t} else {\n\t\t\tres = FR_DISK_ERR;\n\t\t}\n\t}\n\treturn res;\n}\n#endif\n\n\nstatic FRESULT move_window (\t/* Returns FR_OK or FR_DISK_ERR */\n\tFATFS* fs,\t\t/* Filesystem object */\n\tLBA_t sect\t\t/* Sector LBA to make appearance in the fs->win[] */\n)\n{\n\tFRESULT res = FR_OK;\n\n\n\tif (sect != fs->winsect) {\t/* Window offset changed? */\n#if !FF_FS_READONLY\n\t\tres = sync_window(fs);\t\t/* Flush the window */\n#endif\n\t\tif (res == FR_OK) {\t\t\t/* Fill sector window with new data */\n\t\t\tif (disk_read(fs->pdrv, fs->win, sect, 1) != RES_OK) {\n\t\t\t\tsect = (LBA_t)0 - 1;\t/* Invalidate window if read data is not valid */\n\t\t\t\tres = FR_DISK_ERR;\n\t\t\t}\n\t\t\tfs->winsect = sect;\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Synchronize filesystem and data on the storage                        */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT sync_fs (\t/* Returns FR_OK or FR_DISK_ERR */\n\tFATFS* fs\t\t/* Filesystem object */\n)\n{\n\tFRESULT res;\n\n\n\tres = sync_window(fs);\n\tif (res == FR_OK) {\n\t\tif (fs->fs_type == FS_FAT32 && fs->fsi_flag == 1) {\t/* FAT32: Update FSInfo sector if needed */\n\t\t\t/* Create FSInfo structure */\n\t\t\tmemset(fs->win, 0, sizeof fs->win);\n\t\t\tst_word(fs->win + BS_55AA, 0xAA55);\t\t\t\t\t/* Boot signature */\n\t\t\tst_dword(fs->win + FSI_LeadSig, 0x41615252);\t\t/* Leading signature */\n\t\t\tst_dword(fs->win + FSI_StrucSig, 0x61417272);\t\t/* Structure signature */\n\t\t\tst_dword(fs->win + FSI_Free_Count, fs->free_clst);\t/* Number of free clusters */\n\t\t\tst_dword(fs->win + FSI_Nxt_Free, fs->last_clst);\t/* Last allocated culuster */\n\t\t\tfs->winsect = fs->volbase + 1;\t\t\t\t\t\t/* Write it into the FSInfo sector (Next to VBR) */\n\t\t\tdisk_write(fs->pdrv, fs->win, fs->winsect, 1);\n\t\t\tfs->fsi_flag = 0;\n\t\t}\n\t\t/* Make sure that no pending write process in the lower layer */\n\t\tif (disk_ioctl(fs->pdrv, CTRL_SYNC, 0) != RES_OK) res = FR_DISK_ERR;\n\t}\n\n\treturn res;\n}\n\n#endif\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Get physical sector number from cluster number                        */\n/*-----------------------------------------------------------------------*/\n\nstatic LBA_t clst2sect (\t/* !=0:Sector number, 0:Failed (invalid cluster#) */\n\tFATFS* fs,\t\t/* Filesystem object */\n\tDWORD clst\t\t/* Cluster# to be converted */\n)\n{\n\tclst -= 2;\t\t/* Cluster number is origin from 2 */\n\tif (clst >= fs->n_fatent - 2) return 0;\t\t/* Is it invalid cluster number? */\n\treturn fs->database + (LBA_t)fs->csize * clst;\t/* Start sector number of the cluster */\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* FAT access - Read value of an FAT entry                               */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD get_fat (\t\t/* 0xFFFFFFFF:Disk error, 1:Internal error, 2..0x7FFFFFFF:Cluster status */\n\tFFOBJID* obj,\t/* Corresponding object */\n\tDWORD clst\t\t/* Cluster number to get the value */\n)\n{\n\tUINT wc, bc;\n\tDWORD val;\n\tFATFS *fs = obj->fs;\n\n\n\tif (clst < 2 || clst >= fs->n_fatent) {\t/* Check if in valid range */\n\t\tval = 1;\t/* Internal error */\n\n\t} else {\n\t\tval = 0xFFFFFFFF;\t/* Default value falls on disk error */\n\n\t\tswitch (fs->fs_type) {\n\t\tcase FS_FAT12 :\n\t\t\tbc = (UINT)clst; bc += bc / 2;\n\t\t\tif (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break;\n\t\t\twc = fs->win[bc++ % SS(fs)];\t\t/* Get 1st byte of the entry */\n\t\t\tif (move_window(fs, fs->fatbase + (bc / SS(fs))) != FR_OK) break;\n\t\t\twc |= fs->win[bc % SS(fs)] << 8;\t/* Merge 2nd byte of the entry */\n\t\t\tval = (clst & 1) ? (wc >> 4) : (wc & 0xFFF);\t/* Adjust bit position */\n\t\t\tbreak;\n\n\t\tcase FS_FAT16 :\n\t\t\tif (move_window(fs, fs->fatbase + (clst / (SS(fs) / 2))) != FR_OK) break;\n\t\t\tval = ld_word(fs->win + clst * 2 % SS(fs));\t\t/* Simple WORD array */\n\t\t\tbreak;\n\n\t\tcase FS_FAT32 :\n\t\t\tif (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break;\n\t\t\tval = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x0FFFFFFF;\t/* Simple DWORD array but mask out upper 4 bits */\n\t\t\tbreak;\n#if FF_FS_EXFAT\n\t\tcase FS_EXFAT :\n\t\t\tif ((obj->objsize != 0 && obj->sclust != 0) || obj->stat == 0) {\t/* Object except root dir must have valid data length */\n\t\t\t\tDWORD cofs = clst - obj->sclust;\t/* Offset from start cluster */\n\t\t\t\tDWORD clen = (DWORD)((LBA_t)((obj->objsize - 1) / SS(fs)) / fs->csize);\t/* Number of clusters - 1 */\n\n\t\t\t\tif (obj->stat == 2 && cofs <= clen) {\t/* Is it a contiguous chain? */\n\t\t\t\t\tval = (cofs == clen) ? 0x7FFFFFFF : clst + 1;\t/* No data on the FAT, generate the value */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (obj->stat == 3 && cofs < obj->n_cont) {\t/* Is it in the 1st fragment? */\n\t\t\t\t\tval = clst + 1; \t/* Generate the value */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (obj->stat != 2) {\t/* Get value from FAT if FAT chain is valid */\n\t\t\t\t\tif (obj->n_frag != 0) {\t/* Is it on the growing edge? */\n\t\t\t\t\t\tval = 0x7FFFFFFF;\t/* Generate EOC */\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (move_window(fs, fs->fatbase + (clst / (SS(fs) / 4))) != FR_OK) break;\n\t\t\t\t\t\tval = ld_dword(fs->win + clst * 4 % SS(fs)) & 0x7FFFFFFF;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tval = 1;\t/* Internal error */\n\t\t\tbreak;\n#endif\n\t\tdefault:\n\t\t\tval = 1;\t/* Internal error */\n\t\t}\n\t}\n\n\treturn val;\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* FAT access - Change value of an FAT entry                             */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT put_fat (\t/* FR_OK(0):succeeded, !=0:error */\n\tFATFS* fs,\t\t/* Corresponding filesystem object */\n\tDWORD clst,\t\t/* FAT index number (cluster number) to be changed */\n\tDWORD val\t\t/* New value to be set to the entry */\n)\n{\n\tUINT bc;\n\tBYTE *p;\n\tFRESULT res = FR_INT_ERR;\n\n\n\tif (clst >= 2 && clst < fs->n_fatent) {\t/* Check if in valid range */\n\t\tswitch (fs->fs_type) {\n\t\tcase FS_FAT12:\n\t\t\tbc = (UINT)clst; bc += bc / 2;\t/* bc: byte offset of the entry */\n\t\t\tres = move_window(fs, fs->fatbase + (bc / SS(fs)));\n\t\t\tif (res != FR_OK) break;\n\t\t\tp = fs->win + bc++ % SS(fs);\n\t\t\t*p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val;\t/* Update 1st byte */\n\t\t\tfs->wflag = 1;\n\t\t\tres = move_window(fs, fs->fatbase + (bc / SS(fs)));\n\t\t\tif (res != FR_OK) break;\n\t\t\tp = fs->win + bc % SS(fs);\n\t\t\t*p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F));\t/* Update 2nd byte */\n\t\t\tfs->wflag = 1;\n\t\t\tbreak;\n\n\t\tcase FS_FAT16:\n\t\t\tres = move_window(fs, fs->fatbase + (clst / (SS(fs) / 2)));\n\t\t\tif (res != FR_OK) break;\n\t\t\tst_word(fs->win + clst * 2 % SS(fs), (WORD)val);\t/* Simple WORD array */\n\t\t\tfs->wflag = 1;\n\t\t\tbreak;\n\n\t\tcase FS_FAT32:\n#if FF_FS_EXFAT\n\t\tcase FS_EXFAT:\n#endif\n\t\t\tres = move_window(fs, fs->fatbase + (clst / (SS(fs) / 4)));\n\t\t\tif (res != FR_OK) break;\n\t\t\tif (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) {\n\t\t\t\tval = (val & 0x0FFFFFFF) | (ld_dword(fs->win + clst * 4 % SS(fs)) & 0xF0000000);\n\t\t\t}\n\t\t\tst_dword(fs->win + clst * 4 % SS(fs), val);\n\t\t\tfs->wflag = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn res;\n}\n\n#endif /* !FF_FS_READONLY */\n\n\n\n\n#if FF_FS_EXFAT && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* exFAT: Accessing FAT and Allocation Bitmap                            */\n/*-----------------------------------------------------------------------*/\n\n/*--------------------------------------*/\n/* Find a contiguous free cluster block */\n/*--------------------------------------*/\n\nstatic DWORD find_bitmap (\t/* 0:Not found, 2..:Cluster block found, 0xFFFFFFFF:Disk error */\n\tFATFS* fs,\t/* Filesystem object */\n\tDWORD clst,\t/* Cluster number to scan from */\n\tDWORD ncl\t/* Number of contiguous clusters to find (1..) */\n)\n{\n\tBYTE bm, bv;\n\tUINT i;\n\tDWORD val, scl, ctr;\n\n\n\tclst -= 2;\t/* The first bit in the bitmap corresponds to cluster #2 */\n\tif (clst >= fs->n_fatent - 2) clst = 0;\n\tscl = val = clst; ctr = 0;\n\tfor (;;) {\n\t\tif (move_window(fs, fs->bitbase + val / 8 / SS(fs)) != FR_OK) return 0xFFFFFFFF;\n\t\ti = val / 8 % SS(fs); bm = 1 << (val % 8);\n\t\tdo {\n\t\t\tdo {\n\t\t\t\tbv = fs->win[i] & bm; bm <<= 1;\t\t/* Get bit value */\n\t\t\t\tif (++val >= fs->n_fatent - 2) {\t/* Next cluster (with wrap-around) */\n\t\t\t\t\tval = 0; bm = 0; i = SS(fs);\n\t\t\t\t}\n\t\t\t\tif (bv == 0) {\t/* Is it a free cluster? */\n\t\t\t\t\tif (++ctr == ncl) return scl + 2;\t/* Check if run length is sufficient for required */\n\t\t\t\t} else {\n\t\t\t\t\tscl = val; ctr = 0;\t\t/* Encountered a cluster in-use, restart to scan */\n\t\t\t\t}\n\t\t\t\tif (val == clst) return 0;\t/* All cluster scanned? */\n\t\t\t} while (bm != 0);\n\t\t\tbm = 1;\n\t\t} while (++i < SS(fs));\n\t}\n}\n\n\n/*----------------------------------------*/\n/* Set/Clear a block of allocation bitmap */\n/*----------------------------------------*/\n\nstatic FRESULT change_bitmap (\n\tFATFS* fs,\t/* Filesystem object */\n\tDWORD clst,\t/* Cluster number to change from */\n\tDWORD ncl,\t/* Number of clusters to be changed */\n\tint bv\t\t/* bit value to be set (0 or 1) */\n)\n{\n\tBYTE bm;\n\tUINT i;\n\tLBA_t sect;\n\n\n\tclst -= 2;\t/* The first bit corresponds to cluster #2 */\n\tsect = fs->bitbase + clst / 8 / SS(fs);\t/* Sector address */\n\ti = clst / 8 % SS(fs);\t\t\t\t\t/* Byte offset in the sector */\n\tbm = 1 << (clst % 8);\t\t\t\t\t/* Bit mask in the byte */\n\tfor (;;) {\n\t\tif (move_window(fs, sect++) != FR_OK) return FR_DISK_ERR;\n\t\tdo {\n\t\t\tdo {\n\t\t\t\tif (bv == (int)((fs->win[i] & bm) != 0)) return FR_INT_ERR;\t/* Is the bit expected value? */\n\t\t\t\tfs->win[i] ^= bm;\t/* Flip the bit */\n\t\t\t\tfs->wflag = 1;\n\t\t\t\tif (--ncl == 0) return FR_OK;\t/* All bits processed? */\n\t\t\t} while (bm <<= 1);\t\t/* Next bit */\n\t\t\tbm = 1;\n\t\t} while (++i < SS(fs));\t\t/* Next byte */\n\t\ti = 0;\n\t}\n}\n\n\n/*---------------------------------------------*/\n/* Fill the first fragment of the FAT chain    */\n/*---------------------------------------------*/\n\nstatic FRESULT fill_first_frag (\n\tFFOBJID* obj\t/* Pointer to the corresponding object */\n)\n{\n\tFRESULT res;\n\tDWORD cl, n;\n\n\n\tif (obj->stat == 3) {\t/* Has the object been changed 'fragmented' in this session? */\n\t\tfor (cl = obj->sclust, n = obj->n_cont; n; cl++, n--) {\t/* Create cluster chain on the FAT */\n\t\t\tres = put_fat(obj->fs, cl, cl + 1);\n\t\t\tif (res != FR_OK) return res;\n\t\t}\n\t\tobj->stat = 0;\t/* Change status 'FAT chain is valid' */\n\t}\n\treturn FR_OK;\n}\n\n\n/*---------------------------------------------*/\n/* Fill the last fragment of the FAT chain     */\n/*---------------------------------------------*/\n\nstatic FRESULT fill_last_frag (\n\tFFOBJID* obj,\t/* Pointer to the corresponding object */\n\tDWORD lcl,\t\t/* Last cluster of the fragment */\n\tDWORD term\t\t/* Value to set the last FAT entry */\n)\n{\n\tFRESULT res;\n\n\n\twhile (obj->n_frag > 0) {\t/* Create the chain of last fragment */\n\t\tres = put_fat(obj->fs, lcl - obj->n_frag + 1, (obj->n_frag > 1) ? lcl - obj->n_frag + 2 : term);\n\t\tif (res != FR_OK) return res;\n\t\tobj->n_frag--;\n\t}\n\treturn FR_OK;\n}\n\n#endif\t/* FF_FS_EXFAT && !FF_FS_READONLY */\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* FAT handling - Remove a cluster chain                                 */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT remove_chain (\t/* FR_OK(0):succeeded, !=0:error */\n\tFFOBJID* obj,\t\t/* Corresponding object */\n\tDWORD clst,\t\t\t/* Cluster to remove a chain from */\n\tDWORD pclst\t\t\t/* Previous cluster of clst (0 if entire chain) */\n)\n{\n\tFRESULT res = FR_OK;\n\tDWORD nxt;\n\tFATFS *fs = obj->fs;\n#if FF_FS_EXFAT || FF_USE_TRIM\n\tDWORD scl = clst, ecl = clst;\n#endif\n#if FF_USE_TRIM\n\tLBA_t rt[2];\n#endif\n\n\tif (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR;\t/* Check if in valid range */\n\n\t/* Mark the previous cluster 'EOC' on the FAT if it exists */\n\tif (pclst != 0 && (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT || obj->stat != 2)) {\n\t\tres = put_fat(fs, pclst, 0xFFFFFFFF);\n\t\tif (res != FR_OK) return res;\n\t}\n\n\t/* Remove the chain */\n\tdo {\n\t\tnxt = get_fat(obj, clst);\t\t\t/* Get cluster status */\n\t\tif (nxt == 0) break;\t\t\t\t/* Empty cluster? */\n\t\tif (nxt == 1) return FR_INT_ERR;\t/* Internal error? */\n\t\tif (nxt == 0xFFFFFFFF) return FR_DISK_ERR;\t/* Disk error? */\n\t\tif (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) {\n\t\t\tres = put_fat(fs, clst, 0);\t\t/* Mark the cluster 'free' on the FAT */\n\t\t\tif (res != FR_OK) return res;\n\t\t}\n\t\tif (fs->free_clst < fs->n_fatent - 2) {\t/* Update FSINFO */\n\t\t\tfs->free_clst++;\n\t\t\tfs->fsi_flag |= 1;\n\t\t}\n#if FF_FS_EXFAT || FF_USE_TRIM\n\t\tif (ecl + 1 == nxt) {\t/* Is next cluster contiguous? */\n\t\t\tecl = nxt;\n\t\t} else {\t\t\t\t/* End of contiguous cluster block */\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tres = change_bitmap(fs, scl, ecl - scl + 1, 0);\t/* Mark the cluster block 'free' on the bitmap */\n\t\t\t\tif (res != FR_OK) return res;\n\t\t\t}\n#endif\n#if FF_USE_TRIM\n\t\t\trt[0] = clst2sect(fs, scl);\t\t\t\t\t/* Start of data area to be freed */\n\t\t\trt[1] = clst2sect(fs, ecl) + fs->csize - 1;\t/* End of data area to be freed */\n\t\t\tdisk_ioctl(fs->pdrv, CTRL_TRIM, rt);\t\t/* Inform storage device that the data in the block may be erased */\n#endif\n\t\t\tscl = ecl = nxt;\n\t\t}\n#endif\n\t\tclst = nxt;\t\t\t\t\t/* Next cluster */\n\t} while (clst < fs->n_fatent);\t/* Repeat while not the last link */\n\n#if FF_FS_EXFAT\n\t/* Some post processes for chain status */\n\tif (fs->fs_type == FS_EXFAT) {\n\t\tif (pclst == 0) {\t/* Has the entire chain been removed? */\n\t\t\tobj->stat = 0;\t\t/* Change the chain status 'initial' */\n\t\t} else {\n\t\t\tif (obj->stat == 0) {\t/* Is it a fragmented chain from the beginning of this session? */\n\t\t\t\tclst = obj->sclust;\t\t/* Follow the chain to check if it gets contiguous */\n\t\t\t\twhile (clst != pclst) {\n\t\t\t\t\tnxt = get_fat(obj, clst);\n\t\t\t\t\tif (nxt < 2) return FR_INT_ERR;\n\t\t\t\t\tif (nxt == 0xFFFFFFFF) return FR_DISK_ERR;\n\t\t\t\t\tif (nxt != clst + 1) break;\t/* Not contiguous? */\n\t\t\t\t\tclst++;\n\t\t\t\t}\n\t\t\t\tif (clst == pclst) {\t/* Has the chain got contiguous again? */\n\t\t\t\t\tobj->stat = 2;\t\t/* Change the chain status 'contiguous' */\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (obj->stat == 3 && pclst >= obj->sclust && pclst <= obj->sclust + obj->n_cont) {\t/* Was the chain fragmented in this session and got contiguous again? */\n\t\t\t\t\tobj->stat = 2;\t/* Change the chain status 'contiguous' */\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n#endif\n\treturn FR_OK;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* FAT handling - Stretch a chain or Create a new chain                  */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD create_chain (\t/* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */\n\tFFOBJID* obj,\t\t/* Corresponding object */\n\tDWORD clst\t\t\t/* Cluster# to stretch, 0:Create a new chain */\n)\n{\n\tDWORD cs, ncl, scl;\n\tFRESULT res;\n\tFATFS *fs = obj->fs;\n\n\n\tif (clst == 0) {\t/* Create a new chain */\n\t\tscl = fs->last_clst;\t\t\t\t/* Suggested cluster to start to find */\n\t\tif (scl == 0 || scl >= fs->n_fatent) scl = 1;\n\t}\n\telse {\t\t\t\t/* Stretch a chain */\n\t\tcs = get_fat(obj, clst);\t\t\t/* Check the cluster status */\n\t\tif (cs < 2) return 1;\t\t\t\t/* Test for insanity */\n\t\tif (cs == 0xFFFFFFFF) return cs;\t/* Test for disk error */\n\t\tif (cs < fs->n_fatent) return cs;\t/* It is already followed by next cluster */\n\t\tscl = clst;\t\t\t\t\t\t\t/* Cluster to start to find */\n\t}\n\tif (fs->free_clst == 0) return 0;\t\t/* No free cluster */\n\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tncl = find_bitmap(fs, scl, 1);\t\t\t\t/* Find a free cluster */\n\t\tif (ncl == 0 || ncl == 0xFFFFFFFF) return ncl;\t/* No free cluster or hard error? */\n\t\tres = change_bitmap(fs, ncl, 1, 1);\t\t\t/* Mark the cluster 'in use' */\n\t\tif (res == FR_INT_ERR) return 1;\n\t\tif (res == FR_DISK_ERR) return 0xFFFFFFFF;\n\t\tif (clst == 0) {\t\t\t\t\t\t\t/* Is it a new chain? */\n\t\t\tobj->stat = 2;\t\t\t\t\t\t\t/* Set status 'contiguous' */\n\t\t} else {\t\t\t\t\t\t\t\t\t/* It is a stretched chain */\n\t\t\tif (obj->stat == 2 && ncl != scl + 1) {\t/* Is the chain got fragmented? */\n\t\t\t\tobj->n_cont = scl - obj->sclust;\t/* Set size of the contiguous part */\n\t\t\t\tobj->stat = 3;\t\t\t\t\t\t/* Change status 'just fragmented' */\n\t\t\t}\n\t\t}\n\t\tif (obj->stat != 2) {\t/* Is the file non-contiguous? */\n\t\t\tif (ncl == clst + 1) {\t/* Is the cluster next to previous one? */\n\t\t\t\tobj->n_frag = obj->n_frag ? obj->n_frag + 1 : 2;\t/* Increment size of last framgent */\n\t\t\t} else {\t\t\t\t/* New fragment */\n\t\t\t\tif (obj->n_frag == 0) obj->n_frag = 1;\n\t\t\t\tres = fill_last_frag(obj, clst, ncl);\t/* Fill last fragment on the FAT and link it to new one */\n\t\t\t\tif (res == FR_OK) obj->n_frag = 1;\n\t\t\t}\n\t\t}\n\t} else\n#endif\n\t{\t/* On the FAT/FAT32 volume */\n\t\tncl = 0;\n\t\tif (scl == clst) {\t\t\t\t\t\t/* Stretching an existing chain? */\n\t\t\tncl = scl + 1;\t\t\t\t\t\t/* Test if next cluster is free */\n\t\t\tif (ncl >= fs->n_fatent) ncl = 2;\n\t\t\tcs = get_fat(obj, ncl);\t\t\t\t/* Get next cluster status */\n\t\t\tif (cs == 1 || cs == 0xFFFFFFFF) return cs;\t/* Test for error */\n\t\t\tif (cs != 0) {\t\t\t\t\t\t/* Not free? */\n\t\t\t\tcs = fs->last_clst;\t\t\t\t/* Start at suggested cluster if it is valid */\n\t\t\t\tif (cs >= 2 && cs < fs->n_fatent) scl = cs;\n\t\t\t\tncl = 0;\n\t\t\t}\n\t\t}\n\t\tif (ncl == 0) {\t/* The new cluster cannot be contiguous and find another fragment */\n\t\t\tncl = scl;\t/* Start cluster */\n\t\t\tfor (;;) {\n\t\t\t\tncl++;\t\t\t\t\t\t\t/* Next cluster */\n\t\t\t\tif (ncl >= fs->n_fatent) {\t\t/* Check wrap-around */\n\t\t\t\t\tncl = 2;\n\t\t\t\t\tif (ncl > scl) return 0;\t/* No free cluster found? */\n\t\t\t\t}\n\t\t\t\tcs = get_fat(obj, ncl);\t\t\t/* Get the cluster status */\n\t\t\t\tif (cs == 0) break;\t\t\t\t/* Found a free cluster? */\n\t\t\t\tif (cs == 1 || cs == 0xFFFFFFFF) return cs;\t/* Test for error */\n\t\t\t\tif (ncl == scl) return 0;\t\t/* No free cluster found? */\n\t\t\t}\n\t\t}\n\t\tres = put_fat(fs, ncl, 0xFFFFFFFF);\t\t/* Mark the new cluster 'EOC' */\n\t\tif (res == FR_OK && clst != 0) {\n\t\t\tres = put_fat(fs, clst, ncl);\t\t/* Link it from the previous one if needed */\n\t\t}\n\t}\n\n\tif (res == FR_OK) {\t\t\t/* Update FSINFO if function succeeded. */\n\t\tfs->last_clst = ncl;\n\t\tif (fs->free_clst <= fs->n_fatent - 2) fs->free_clst--;\n\t\tfs->fsi_flag |= 1;\n\t} else {\n\t\tncl = (res == FR_DISK_ERR) ? 0xFFFFFFFF : 1;\t/* Failed. Generate error status */\n\t}\n\n\treturn ncl;\t\t/* Return new cluster number or error status */\n}\n\n#endif /* !FF_FS_READONLY */\n\n\n\n\n#if FF_USE_FASTSEEK\n/*-----------------------------------------------------------------------*/\n/* FAT handling - Convert offset into cluster with link map table        */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD clmt_clust (\t/* <2:Error, >=2:Cluster number */\n\tFIL* fp,\t\t/* Pointer to the file object */\n\tFSIZE_t ofs\t\t/* File offset to be converted to cluster# */\n)\n{\n\tDWORD cl, ncl;\n\tDWORD *tbl;\n\tFATFS *fs = fp->obj.fs;\n\n\n\ttbl = fp->cltbl + 1;\t/* Top of CLMT */\n\tcl = (DWORD)(ofs / SS(fs) / fs->csize);\t/* Cluster order from top of the file */\n\tfor (;;) {\n\t\tncl = *tbl++;\t\t\t/* Number of cluters in the fragment */\n\t\tif (ncl == 0) return 0;\t/* End of table? (error) */\n\t\tif (cl < ncl) break;\t/* In this fragment? */\n\t\tcl -= ncl; tbl++;\t\t/* Next fragment */\n\t}\n\treturn cl + *tbl;\t/* Return the cluster number */\n}\n\n#endif\t/* FF_USE_FASTSEEK */\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Fill a cluster with zeros                        */\n/*-----------------------------------------------------------------------*/\n\n#if !FF_FS_READONLY\nstatic FRESULT dir_clear (\t/* Returns FR_OK or FR_DISK_ERR */\n\tFATFS *fs,\t\t/* Filesystem object */\n\tDWORD clst\t\t/* Directory table to clear */\n)\n{\n\tLBA_t sect;\n\tUINT n, szb;\n\tBYTE *ibuf;\n\n\n\tif (sync_window(fs) != FR_OK) return FR_DISK_ERR;\t/* Flush disk access window */\n\tsect = clst2sect(fs, clst);\t\t/* Top of the cluster */\n\tfs->winsect = sect;\t\t\t\t/* Set window to top of the cluster */\n\tmemset(fs->win, 0, sizeof fs->win);\t/* Clear window buffer */\n#if FF_USE_LFN == 3\t\t/* Quick table clear by using multi-secter write */\n\t/* Allocate a temporary buffer */\n\tfor (szb = ((DWORD)fs->csize * SS(fs) >= MAX_MALLOC) ? MAX_MALLOC : fs->csize * SS(fs), ibuf = 0; szb > SS(fs) && (ibuf = ff_memalloc(szb)) == 0; szb /= 2) ;\n\tif (szb > SS(fs)) {\t\t/* Buffer allocated? */\n\t\tmemset(ibuf, 0, szb);\n\t\tszb /= SS(fs);\t\t/* Bytes -> Sectors */\n\t\tfor (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ;\t/* Fill the cluster with 0 */\n\t\tff_memfree(ibuf);\n\t} else\n#endif\n\t{\n\t\tibuf = fs->win; szb = 1;\t/* Use window buffer (many single-sector writes may take a time) */\n\t\tfor (n = 0; n < fs->csize && disk_write(fs->pdrv, ibuf, sect + n, szb) == RES_OK; n += szb) ;\t/* Fill the cluster with 0 */\n\t}\n\treturn (n == fs->csize) ? FR_OK : FR_DISK_ERR;\n}\n#endif\t/* !FF_FS_READONLY */\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Set directory index                              */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_sdi (\t/* FR_OK(0):succeeded, !=0:error */\n\tDIR* dp,\t\t/* Pointer to directory object */\n\tDWORD ofs\t\t/* Offset of directory table */\n)\n{\n\tDWORD csz, clst;\n\tFATFS *fs = dp->obj.fs;\n\n\n\tif (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR) || ofs % SZDIRE) {\t/* Check range of offset and alignment */\n\t\treturn FR_INT_ERR;\n\t}\n\tdp->dptr = ofs;\t\t\t\t/* Set current offset */\n\tclst = dp->obj.sclust;\t\t/* Table start cluster (0:root) */\n\tif (clst == 0 && fs->fs_type >= FS_FAT32) {\t/* Replace cluster# 0 with root cluster# */\n\t\tclst = (DWORD)fs->dirbase;\n\t\tif (FF_FS_EXFAT) dp->obj.stat = 0;\t/* exFAT: Root dir has an FAT chain */\n\t}\n\n\tif (clst == 0) {\t/* Static table (root-directory on the FAT volume) */\n\t\tif (ofs / SZDIRE >= fs->n_rootdir) return FR_INT_ERR;\t/* Is index out of range? */\n\t\tdp->sect = fs->dirbase;\n\n\t} else {\t\t\t/* Dynamic table (sub-directory or root-directory on the FAT32/exFAT volume) */\n\t\tcsz = (DWORD)fs->csize * SS(fs);\t/* Bytes per cluster */\n\t\twhile (ofs >= csz) {\t\t\t\t/* Follow cluster chain */\n\t\t\tclst = get_fat(&dp->obj, clst);\t\t\t\t/* Get next cluster */\n\t\t\tif (clst == 0xFFFFFFFF) return FR_DISK_ERR;\t/* Disk error */\n\t\t\tif (clst < 2 || clst >= fs->n_fatent) return FR_INT_ERR;\t/* Reached to end of table or internal error */\n\t\t\tofs -= csz;\n\t\t}\n\t\tdp->sect = clst2sect(fs, clst);\n\t}\n\tdp->clust = clst;\t\t\t\t\t/* Current cluster# */\n\tif (dp->sect == 0) return FR_INT_ERR;\n\tdp->sect += ofs / SS(fs);\t\t\t/* Sector# of the directory entry */\n\tdp->dir = fs->win + (ofs % SS(fs));\t/* Pointer to the entry in the win[] */\n\n\treturn FR_OK;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Move directory table index next                  */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_next (\t/* FR_OK(0):succeeded, FR_NO_FILE:End of table, FR_DENIED:Could not stretch */\n\tDIR* dp,\t\t\t\t/* Pointer to the directory object */\n\tint stretch\t\t\t\t/* 0: Do not stretch table, 1: Stretch table if needed */\n)\n{\n\tDWORD ofs, clst;\n\tFATFS *fs = dp->obj.fs;\n\n\n\tofs = dp->dptr + SZDIRE;\t/* Next entry */\n\tif (ofs >= (DWORD)((FF_FS_EXFAT && fs->fs_type == FS_EXFAT) ? MAX_DIR_EX : MAX_DIR)) dp->sect = 0;\t/* Disable it if the offset reached the max value */\n\tif (dp->sect == 0) return FR_NO_FILE;\t/* Report EOT if it has been disabled */\n\n\tif (ofs % SS(fs) == 0) {\t/* Sector changed? */\n\t\tdp->sect++;\t\t\t\t/* Next sector */\n\n\t\tif (dp->clust == 0) {\t/* Static table */\n\t\t\tif (ofs / SZDIRE >= fs->n_rootdir) {\t/* Report EOT if it reached end of static table */\n\t\t\t\tdp->sect = 0; return FR_NO_FILE;\n\t\t\t}\n\t\t}\n\t\telse {\t\t\t\t\t/* Dynamic table */\n\t\t\tif ((ofs / SS(fs) & (fs->csize - 1)) == 0) {\t/* Cluster changed? */\n\t\t\t\tclst = get_fat(&dp->obj, dp->clust);\t\t/* Get next cluster */\n\t\t\t\tif (clst <= 1) return FR_INT_ERR;\t\t\t/* Internal error */\n\t\t\t\tif (clst == 0xFFFFFFFF) return FR_DISK_ERR;\t/* Disk error */\n\t\t\t\tif (clst >= fs->n_fatent) {\t\t\t\t\t/* It reached end of dynamic table */\n#if !FF_FS_READONLY\n\t\t\t\t\tif (!stretch) {\t\t\t\t\t\t\t\t/* If no stretch, report EOT */\n\t\t\t\t\t\tdp->sect = 0; return FR_NO_FILE;\n\t\t\t\t\t}\n\t\t\t\t\tclst = create_chain(&dp->obj, dp->clust);\t/* Allocate a cluster */\n\t\t\t\t\tif (clst == 0) return FR_DENIED;\t\t\t/* No free cluster */\n\t\t\t\t\tif (clst == 1) return FR_INT_ERR;\t\t\t/* Internal error */\n\t\t\t\t\tif (clst == 0xFFFFFFFF) return FR_DISK_ERR;\t/* Disk error */\n\t\t\t\t\tif (dir_clear(fs, clst) != FR_OK) return FR_DISK_ERR;\t/* Clean up the stretched table */\n\t\t\t\t\tif (FF_FS_EXFAT) dp->obj.stat |= 4;\t\t\t/* exFAT: The directory has been stretched */\n#else\n\t\t\t\t\tif (!stretch) dp->sect = 0;\t\t\t\t\t/* (this line is to suppress compiler warning) */\n\t\t\t\t\tdp->sect = 0; return FR_NO_FILE;\t\t\t/* Report EOT */\n#endif\n\t\t\t\t}\n\t\t\t\tdp->clust = clst;\t\t/* Initialize data for new cluster */\n\t\t\t\tdp->sect = clst2sect(fs, clst);\n\t\t\t}\n\t\t}\n\t}\n\tdp->dptr = ofs;\t\t\t\t\t\t/* Current entry */\n\tdp->dir = fs->win + ofs % SS(fs);\t/* Pointer to the entry in the win[] */\n\n\treturn FR_OK;\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Reserve a block of directory entries             */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_alloc (\t/* FR_OK(0):succeeded, !=0:error */\n\tDIR* dp,\t\t\t\t/* Pointer to the directory object */\n\tUINT n_ent\t\t\t\t/* Number of contiguous entries to allocate */\n)\n{\n\tFRESULT res;\n\tUINT n;\n\tFATFS *fs = dp->obj.fs;\n\n\n\tres = dir_sdi(dp, 0);\n\tif (res == FR_OK) {\n\t\tn = 0;\n\t\tdo {\n\t\t\tres = move_window(fs, dp->sect);\n\t\t\tif (res != FR_OK) break;\n#if FF_FS_EXFAT\n\t\t\tif ((fs->fs_type == FS_EXFAT) ? (int)((dp->dir[XDIR_Type] & 0x80) == 0) : (int)(dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0)) {\t/* Is the entry free? */\n#else\n\t\t\tif (dp->dir[DIR_Name] == DDEM || dp->dir[DIR_Name] == 0) {\t/* Is the entry free? */\n#endif\n\t\t\t\tif (++n == n_ent) break;\t/* Is a block of contiguous free entries found? */\n\t\t\t} else {\n\t\t\t\tn = 0;\t\t\t\t/* Not a free entry, restart to search */\n\t\t\t}\n\t\t\tres = dir_next(dp, 1);\t/* Next entry with table stretch enabled */\n\t\t} while (res == FR_OK);\n\t}\n\n\tif (res == FR_NO_FILE) res = FR_DENIED;\t/* No directory entry to allocate */\n\treturn res;\n}\n\n#endif\t/* !FF_FS_READONLY */\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* FAT: Directory handling - Load/Store start cluster number             */\n/*-----------------------------------------------------------------------*/\n\nstatic DWORD ld_clust (\t/* Returns the top cluster value of the SFN entry */\n\tFATFS* fs,\t\t\t/* Pointer to the fs object */\n\tconst BYTE* dir\t\t/* Pointer to the key entry */\n)\n{\n\tDWORD cl;\n\n\tcl = ld_word(dir + DIR_FstClusLO);\n\tif (fs->fs_type == FS_FAT32) {\n\t\tcl |= (DWORD)ld_word(dir + DIR_FstClusHI) << 16;\n\t}\n\n\treturn cl;\n}\n\n\n#if !FF_FS_READONLY\nstatic void st_clust (\n\tFATFS* fs,\t/* Pointer to the fs object */\n\tBYTE* dir,\t/* Pointer to the key entry */\n\tDWORD cl\t/* Value to be set */\n)\n{\n\tst_word(dir + DIR_FstClusLO, (WORD)cl);\n\tif (fs->fs_type == FS_FAT32) {\n\t\tst_word(dir + DIR_FstClusHI, (WORD)(cl >> 16));\n\t}\n}\n#endif\n\n\n\n#if FF_USE_LFN\n/*--------------------------------------------------------*/\n/* FAT-LFN: Compare a part of file name with an LFN entry */\n/*--------------------------------------------------------*/\n\nstatic int cmp_lfn (\t\t/* 1:matched, 0:not matched */\n\tconst WCHAR* lfnbuf,\t/* Pointer to the LFN working buffer to be compared */\n\tBYTE* dir\t\t\t\t/* Pointer to the directory entry containing the part of LFN */\n)\n{\n\tUINT i, s;\n\tWCHAR wc, uc;\n\n\n\tif (ld_word(dir + LDIR_FstClusLO) != 0) return 0;\t/* Check LDIR_FstClusLO */\n\n\ti = ((dir[LDIR_Ord] & 0x3F) - 1) * 13;\t/* Offset in the LFN buffer */\n\n\tfor (wc = 1, s = 0; s < 13; s++) {\t\t/* Process all characters in the entry */\n\t\tuc = ld_word(dir + LfnOfs[s]);\t\t/* Pick an LFN character */\n\t\tif (wc != 0) {\n\t\t\tif (i >= FF_MAX_LFN + 1 || ff_wtoupper(uc) != ff_wtoupper(lfnbuf[i++])) {\t/* Compare it */\n\t\t\t\treturn 0;\t\t\t\t\t/* Not matched */\n\t\t\t}\n\t\t\twc = uc;\n\t\t} else {\n\t\t\tif (uc != 0xFFFF) return 0;\t\t/* Check filler */\n\t\t}\n\t}\n\n\tif ((dir[LDIR_Ord] & LLEF) && wc && lfnbuf[i]) return 0;\t/* Last segment matched but different length */\n\n\treturn 1;\t\t/* The part of LFN matched */\n}\n\n\n#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT\n/*-----------------------------------------------------*/\n/* FAT-LFN: Pick a part of file name from an LFN entry */\n/*-----------------------------------------------------*/\n\nstatic int pick_lfn (\t/* 1:succeeded, 0:buffer overflow or invalid LFN entry */\n\tWCHAR* lfnbuf,\t\t/* Pointer to the LFN working buffer */\n\tBYTE* dir\t\t\t/* Pointer to the LFN entry */\n)\n{\n\tUINT i, s;\n\tWCHAR wc, uc;\n\n\n\tif (ld_word(dir + LDIR_FstClusLO) != 0) return 0;\t/* Check LDIR_FstClusLO is 0 */\n\n\ti = ((dir[LDIR_Ord] & ~LLEF) - 1) * 13;\t/* Offset in the LFN buffer */\n\n\tfor (wc = 1, s = 0; s < 13; s++) {\t\t/* Process all characters in the entry */\n\t\tuc = ld_word(dir + LfnOfs[s]);\t\t/* Pick an LFN character */\n\t\tif (wc != 0) {\n\t\t\tif (i >= FF_MAX_LFN + 1) return 0;\t/* Buffer overflow? */\n\t\t\tlfnbuf[i++] = wc = uc;\t\t\t/* Store it */\n\t\t} else {\n\t\t\tif (uc != 0xFFFF) return 0;\t\t/* Check filler */\n\t\t}\n\t}\n\n\tif (dir[LDIR_Ord] & LLEF && wc != 0) {\t/* Put terminator if it is the last LFN part and not terminated */\n\t\tif (i >= FF_MAX_LFN + 1) return 0;\t/* Buffer overflow? */\n\t\tlfnbuf[i] = 0;\n\t}\n\n\treturn 1;\t\t/* The part of LFN is valid */\n}\n#endif\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------*/\n/* FAT-LFN: Create an entry of LFN entries */\n/*-----------------------------------------*/\n\nstatic void put_lfn (\n\tconst WCHAR* lfn,\t/* Pointer to the LFN */\n\tBYTE* dir,\t\t\t/* Pointer to the LFN entry to be created */\n\tBYTE ord,\t\t\t/* LFN order (1-20) */\n\tBYTE sum\t\t\t/* Checksum of the corresponding SFN */\n)\n{\n\tUINT i, s;\n\tWCHAR wc;\n\n\n\tdir[LDIR_Chksum] = sum;\t\t\t/* Set checksum */\n\tdir[LDIR_Attr] = AM_LFN;\t\t/* Set attribute. LFN entry */\n\tdir[LDIR_Type] = 0;\n\tst_word(dir + LDIR_FstClusLO, 0);\n\n\ti = (ord - 1) * 13;\t\t\t\t/* Get offset in the LFN working buffer */\n\ts = wc = 0;\n\tdo {\n\t\tif (wc != 0xFFFF) wc = lfn[i++];\t/* Get an effective character */\n\t\tst_word(dir + LfnOfs[s], wc);\t\t/* Put it */\n\t\tif (wc == 0) wc = 0xFFFF;\t\t\t/* Padding characters for following items */\n\t} while (++s < 13);\n\tif (wc == 0xFFFF || !lfn[i]) ord |= LLEF;\t/* Last LFN part is the start of LFN sequence */\n\tdir[LDIR_Ord] = ord;\t\t\t/* Set the LFN order */\n}\n\n#endif\t/* !FF_FS_READONLY */\n#endif\t/* FF_USE_LFN */\n\n\n\n#if FF_USE_LFN && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* FAT-LFN: Create a Numbered SFN                                        */\n/*-----------------------------------------------------------------------*/\n\nstatic void gen_numname (\n\tBYTE* dst,\t\t\t/* Pointer to the buffer to store numbered SFN */\n\tconst BYTE* src,\t/* Pointer to SFN in directory form */\n\tconst WCHAR* lfn,\t/* Pointer to LFN */\n\tUINT seq\t\t\t/* Sequence number */\n)\n{\n\tBYTE ns[8], c;\n\tUINT i, j;\n\tWCHAR wc;\n\tDWORD sreg;\n\n\n\tmemcpy(dst, src, 11);\t/* Prepare the SFN to be modified */\n\n\tif (seq > 5) {\t/* In case of many collisions, generate a hash number instead of sequential number */\n\t\tsreg = seq;\n\t\twhile (*lfn) {\t/* Create a CRC as hash value */\n\t\t\twc = *lfn++;\n\t\t\tfor (i = 0; i < 16; i++) {\n\t\t\t\tsreg = (sreg << 1) + (wc & 1);\n\t\t\t\twc >>= 1;\n\t\t\t\tif (sreg & 0x10000) sreg ^= 0x11021;\n\t\t\t}\n\t\t}\n\t\tseq = (UINT)sreg;\n\t}\n\n\t/* Make suffix (~ + hexadecimal) */\n\ti = 7;\n\tdo {\n\t\tc = (BYTE)((seq % 16) + '0'); seq /= 16;\n\t\tif (c > '9') c += 7;\n\t\tns[i--] = c;\n\t} while (i && seq);\n\tns[i] = '~';\n\n\t/* Append the suffix to the SFN body */\n\tfor (j = 0; j < i && dst[j] != ' '; j++) {\t/* Find the offset to append */\n\t\tif (dbc_1st(dst[j])) {\t/* To avoid DBC break up */\n\t\t\tif (j == i - 1) break;\n\t\t\tj++;\n\t\t}\n\t}\n\tdo {\t/* Append the suffix */\n\t\tdst[j++] = (i < 8) ? ns[i++] : ' ';\n\t} while (j < 8);\n}\n#endif\t/* FF_USE_LFN && !FF_FS_READONLY */\n\n\n\n#if FF_USE_LFN\n/*-----------------------------------------------------------------------*/\n/* FAT-LFN: Calculate checksum of an SFN entry                           */\n/*-----------------------------------------------------------------------*/\n\nstatic BYTE sum_sfn (\n\tconst BYTE* dir\t\t/* Pointer to the SFN entry */\n)\n{\n\tBYTE sum = 0;\n\tUINT n = 11;\n\n\tdo {\n\t\tsum = (sum >> 1) + (sum << 7) + *dir++;\n\t} while (--n);\n\treturn sum;\n}\n\n#endif\t/* FF_USE_LFN */\n\n\n\n#if FF_FS_EXFAT\n/*-----------------------------------------------------------------------*/\n/* exFAT: Checksum                                                       */\n/*-----------------------------------------------------------------------*/\n\nstatic WORD xdir_sum (\t/* Get checksum of the directoly entry block */\n\tconst BYTE* dir\t\t/* Directory entry block to be calculated */\n)\n{\n\tUINT i, szblk;\n\tWORD sum;\n\n\n\tszblk = (dir[XDIR_NumSec] + 1) * SZDIRE;\t/* Number of bytes of the entry block */\n\tfor (i = sum = 0; i < szblk; i++) {\n\t\tif (i == XDIR_SetSum) {\t/* Skip 2-byte sum field */\n\t\t\ti++;\n\t\t} else {\n\t\t\tsum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + dir[i];\n\t\t}\n\t}\n\treturn sum;\n}\n\n\n\nstatic WORD xname_sum (\t/* Get check sum (to be used as hash) of the file name */\n\tconst WCHAR* name\t/* File name to be calculated */\n)\n{\n\tWCHAR chr;\n\tWORD sum = 0;\n\n\n\twhile ((chr = *name++) != 0) {\n\t\tchr = (WCHAR)ff_wtoupper(chr);\t\t/* File name needs to be up-case converted */\n\t\tsum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr & 0xFF);\n\t\tsum = ((sum & 1) ? 0x8000 : 0) + (sum >> 1) + (chr >> 8);\n\t}\n\treturn sum;\n}\n\n\n#if !FF_FS_READONLY && FF_USE_MKFS\nstatic DWORD xsum32 (\t/* Returns 32-bit checksum */\n\tBYTE  dat,\t\t\t/* Byte to be calculated (byte-by-byte processing) */\n\tDWORD sum\t\t\t/* Previous sum value */\n)\n{\n\tsum = ((sum & 1) ? 0x80000000 : 0) + (sum >> 1) + dat;\n\treturn sum;\n}\n#endif\n\n\n\n/*------------------------------------*/\n/* exFAT: Get a directory entry block */\n/*------------------------------------*/\n\nstatic FRESULT load_xdir (\t/* FR_INT_ERR: invalid entry block */\n\tDIR* dp\t\t\t\t\t/* Reading directory object pointing top of the entry block to load */\n)\n{\n\tFRESULT res;\n\tUINT i, sz_ent;\n\tBYTE *dirb = dp->obj.fs->dirbuf;\t/* Pointer to the on-memory directory entry block 85+C0+C1s */\n\n\n\t/* Load file directory entry */\n\tres = move_window(dp->obj.fs, dp->sect);\n\tif (res != FR_OK) return res;\n\tif (dp->dir[XDIR_Type] != ET_FILEDIR) return FR_INT_ERR;\t/* Invalid order */\n\tmemcpy(dirb + 0 * SZDIRE, dp->dir, SZDIRE);\n\tsz_ent = (dirb[XDIR_NumSec] + 1) * SZDIRE;\n\tif (sz_ent < 3 * SZDIRE || sz_ent > 19 * SZDIRE) return FR_INT_ERR;\n\n\t/* Load stream extension entry */\n\tres = dir_next(dp, 0);\n\tif (res == FR_NO_FILE) res = FR_INT_ERR;\t/* It cannot be */\n\tif (res != FR_OK) return res;\n\tres = move_window(dp->obj.fs, dp->sect);\n\tif (res != FR_OK) return res;\n\tif (dp->dir[XDIR_Type] != ET_STREAM) return FR_INT_ERR;\t/* Invalid order */\n\tmemcpy(dirb + 1 * SZDIRE, dp->dir, SZDIRE);\n\tif (MAXDIRB(dirb[XDIR_NumName]) > sz_ent) return FR_INT_ERR;\n\n\t/* Load file name entries */\n\ti = 2 * SZDIRE;\t/* Name offset to load */\n\tdo {\n\t\tres = dir_next(dp, 0);\n\t\tif (res == FR_NO_FILE) res = FR_INT_ERR;\t/* It cannot be */\n\t\tif (res != FR_OK) return res;\n\t\tres = move_window(dp->obj.fs, dp->sect);\n\t\tif (res != FR_OK) return res;\n\t\tif (dp->dir[XDIR_Type] != ET_FILENAME) return FR_INT_ERR;\t/* Invalid order */\n\t\tif (i < MAXDIRB(FF_MAX_LFN)) memcpy(dirb + i, dp->dir, SZDIRE);\n\t} while ((i += SZDIRE) < sz_ent);\n\n\t/* Sanity check (do it for only accessible object) */\n\tif (i <= MAXDIRB(FF_MAX_LFN)) {\n\t\tif (xdir_sum(dirb) != ld_word(dirb + XDIR_SetSum)) return FR_INT_ERR;\n\t}\n\treturn FR_OK;\n}\n\n\n/*------------------------------------------------------------------*/\n/* exFAT: Initialize object allocation info with loaded entry block */\n/*------------------------------------------------------------------*/\n\nstatic void init_alloc_info (\n\tFATFS* fs,\t\t/* Filesystem object */\n\tFFOBJID* obj\t/* Object allocation information to be initialized */\n)\n{\n\tobj->sclust = ld_dword(fs->dirbuf + XDIR_FstClus);\t\t/* Start cluster */\n\tobj->objsize = ld_qword(fs->dirbuf + XDIR_FileSize);\t/* Size */\n\tobj->stat = fs->dirbuf[XDIR_GenFlags] & 2;\t\t\t\t/* Allocation status */\n\tobj->n_frag = 0;\t\t\t\t\t\t\t\t\t\t/* No last fragment info */\n}\n\n\n\n#if !FF_FS_READONLY || FF_FS_RPATH != 0\n/*------------------------------------------------*/\n/* exFAT: Load the object's directory entry block */\n/*------------------------------------------------*/\n\nstatic FRESULT load_obj_xdir (\n\tDIR* dp,\t\t\t/* Blank directory object to be used to access containing directory */\n\tconst FFOBJID* obj\t/* Object with its containing directory information */\n)\n{\n\tFRESULT res;\n\n\t/* Open object containing directory */\n\tdp->obj.fs = obj->fs;\n\tdp->obj.sclust = obj->c_scl;\n\tdp->obj.stat = (BYTE)obj->c_size;\n\tdp->obj.objsize = obj->c_size & 0xFFFFFF00;\n\tdp->obj.n_frag = 0;\n\tdp->blk_ofs = obj->c_ofs;\n\n\tres = dir_sdi(dp, dp->blk_ofs);\t/* Goto object's entry block */\n\tif (res == FR_OK) {\n\t\tres = load_xdir(dp);\t\t/* Load the object's entry block */\n\t}\n\treturn res;\n}\n#endif\n\n\n#if !FF_FS_READONLY\n/*----------------------------------------*/\n/* exFAT: Store the directory entry block */\n/*----------------------------------------*/\n\nstatic FRESULT store_xdir (\n\tDIR* dp\t\t\t\t/* Pointer to the directory object */\n)\n{\n\tFRESULT res;\n\tUINT nent;\n\tBYTE *dirb = dp->obj.fs->dirbuf;\t/* Pointer to the directory entry block 85+C0+C1s */\n\n\t/* Create set sum */\n\tst_word(dirb + XDIR_SetSum, xdir_sum(dirb));\n\tnent = dirb[XDIR_NumSec] + 1;\n\n\t/* Store the directory entry block to the directory */\n\tres = dir_sdi(dp, dp->blk_ofs);\n\twhile (res == FR_OK) {\n\t\tres = move_window(dp->obj.fs, dp->sect);\n\t\tif (res != FR_OK) break;\n\t\tmemcpy(dp->dir, dirb, SZDIRE);\n\t\tdp->obj.fs->wflag = 1;\n\t\tif (--nent == 0) break;\n\t\tdirb += SZDIRE;\n\t\tres = dir_next(dp, 0);\n\t}\n\treturn (res == FR_OK || res == FR_DISK_ERR) ? res : FR_INT_ERR;\n}\n\n\n\n/*-------------------------------------------*/\n/* exFAT: Create a new directory entry block */\n/*-------------------------------------------*/\n\nstatic void create_xdir (\n\tBYTE* dirb,\t\t\t/* Pointer to the directory entry block buffer */\n\tconst WCHAR* lfn\t/* Pointer to the object name */\n)\n{\n\tUINT i;\n\tBYTE nc1, nlen;\n\tWCHAR wc;\n\n\n\t/* Create file-directory and stream-extension entry */\n\tmemset(dirb, 0, 2 * SZDIRE);\n\tdirb[0 * SZDIRE + XDIR_Type] = ET_FILEDIR;\n\tdirb[1 * SZDIRE + XDIR_Type] = ET_STREAM;\n\n\t/* Create file-name entries */\n\ti = SZDIRE * 2;\t/* Top of file_name entries */\n\tnlen = nc1 = 0; wc = 1;\n\tdo {\n\t\tdirb[i++] = ET_FILENAME; dirb[i++] = 0;\n\t\tdo {\t/* Fill name field */\n\t\t\tif (wc != 0 && (wc = lfn[nlen]) != 0) nlen++;\t/* Get a character if exist */\n\t\t\tst_word(dirb + i, wc); \t/* Store it */\n\t\t\ti += 2;\n\t\t} while (i % SZDIRE != 0);\n\t\tnc1++;\n\t} while (lfn[nlen]);\t/* Fill next entry if any char follows */\n\n\tdirb[XDIR_NumName] = nlen;\t\t/* Set name length */\n\tdirb[XDIR_NumSec] = 1 + nc1;\t/* Set secondary count (C0 + C1s) */\n\tst_word(dirb + XDIR_NameHash, xname_sum(lfn));\t/* Set name hash */\n}\n\n#endif\t/* !FF_FS_READONLY */\n#endif\t/* FF_FS_EXFAT */\n\n\n\n#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 || FF_USE_LABEL || FF_FS_EXFAT\n/*-----------------------------------------------------------------------*/\n/* Read an object from the directory                                     */\n/*-----------------------------------------------------------------------*/\n\n#define DIR_READ_FILE(dp) dir_read(dp, 0)\n#define DIR_READ_LABEL(dp) dir_read(dp, 1)\n\nstatic FRESULT dir_read (\n\tDIR* dp,\t\t/* Pointer to the directory object */\n\tint vol\t\t\t/* Filtered by 0:file/directory or 1:volume label */\n)\n{\n\tFRESULT res = FR_NO_FILE;\n\tFATFS *fs = dp->obj.fs;\n\tBYTE attr, b;\n#if FF_USE_LFN\n\tBYTE ord = 0xFF, sum = 0xFF;\n#endif\n\n\twhile (dp->sect) {\n\t\tres = move_window(fs, dp->sect);\n\t\tif (res != FR_OK) break;\n\t\tb = dp->dir[DIR_Name];\t/* Test for the entry type */\n\t\tif (b == 0) {\n\t\t\tres = FR_NO_FILE; break; /* Reached to end of the directory */\n\t\t}\n#if FF_FS_EXFAT\n\t\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\t\tif (FF_USE_LABEL && vol) {\n\t\t\t\tif (b == ET_VLABEL) break;\t/* Volume label entry? */\n\t\t\t} else {\n\t\t\t\tif (b == ET_FILEDIR) {\t\t/* Start of the file entry block? */\n\t\t\t\t\tdp->blk_ofs = dp->dptr;\t/* Get location of the block */\n\t\t\t\t\tres = load_xdir(dp);\t/* Load the entry block */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tdp->obj.attr = fs->dirbuf[XDIR_Attr] & AM_MASK;\t/* Get attribute */\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else\n#endif\n\t\t{\t/* On the FAT/FAT32 volume */\n\t\t\tdp->obj.attr = attr = dp->dir[DIR_Attr] & AM_MASK;\t/* Get attribute */\n#if FF_USE_LFN\t\t/* LFN configuration */\n\t\t\tif (b == DDEM || b == '.' || (int)((attr & ~AM_ARC) == AM_VOL) != vol) {\t/* An entry without valid data */\n\t\t\t\tord = 0xFF;\n\t\t\t} else {\n\t\t\t\tif (attr == AM_LFN) {\t/* An LFN entry is found */\n\t\t\t\t\tif (b & LLEF) {\t\t/* Is it start of an LFN sequence? */\n\t\t\t\t\t\tsum = dp->dir[LDIR_Chksum];\n\t\t\t\t\t\tb &= (BYTE)~LLEF; ord = b;\n\t\t\t\t\t\tdp->blk_ofs = dp->dptr;\n\t\t\t\t\t}\n\t\t\t\t\t/* Check LFN validity and capture it */\n\t\t\t\t\tord = (b == ord && sum == dp->dir[LDIR_Chksum] && pick_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF;\n\t\t\t\t} else {\t\t\t\t/* An SFN entry is found */\n\t\t\t\t\tif (ord != 0 || sum != sum_sfn(dp->dir)) {\t/* Is there a valid LFN? */\n\t\t\t\t\t\tdp->blk_ofs = 0xFFFFFFFF;\t/* It has no LFN. */\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n#else\t\t/* Non LFN configuration */\n\t\t\tif (b != DDEM && b != '.' && attr != AM_LFN && (int)((attr & ~AM_ARC) == AM_VOL) == vol) {\t/* Is it a valid entry? */\n\t\t\t\tbreak;\n\t\t\t}\n#endif\n\t\t}\n\t\tres = dir_next(dp, 0);\t\t/* Next entry */\n\t\tif (res != FR_OK) break;\n\t}\n\n\tif (res != FR_OK) dp->sect = 0;\t\t/* Terminate the read operation on error or EOT */\n\treturn res;\n}\n\n#endif\t/* FF_FS_MINIMIZE <= 1 || FF_USE_LABEL || FF_FS_RPATH >= 2 */\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Directory handling - Find an object in the directory                  */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_find (\t/* FR_OK(0):succeeded, !=0:error */\n\tDIR* dp\t\t\t\t\t/* Pointer to the directory object with the file name */\n)\n{\n\tFRESULT res;\n\tFATFS *fs = dp->obj.fs;\n\tBYTE c;\n#if FF_USE_LFN\n\tBYTE a, ord, sum;\n#endif\n\n\tres = dir_sdi(dp, 0);\t\t\t/* Rewind directory object */\n\tif (res != FR_OK) return res;\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tBYTE nc;\n\t\tUINT di, ni;\n\t\tWORD hash = xname_sum(fs->lfnbuf);\t\t/* Hash value of the name to find */\n\n\t\twhile ((res = DIR_READ_FILE(dp)) == FR_OK) {\t/* Read an item */\n#if FF_MAX_LFN < 255\n\t\t\tif (fs->dirbuf[XDIR_NumName] > FF_MAX_LFN) continue;\t\t/* Skip comparison if inaccessible object name */\n#endif\n\t\t\tif (ld_word(fs->dirbuf + XDIR_NameHash) != hash) continue;\t/* Skip comparison if hash mismatched */\n\t\t\tfor (nc = fs->dirbuf[XDIR_NumName], di = SZDIRE * 2, ni = 0; nc; nc--, di += 2, ni++) {\t/* Compare the name */\n\t\t\t\tif ((di % SZDIRE) == 0) di += 2;\n\t\t\t\tif (ff_wtoupper(ld_word(fs->dirbuf + di)) != ff_wtoupper(fs->lfnbuf[ni])) break;\n\t\t\t}\n\t\t\tif (nc == 0 && !fs->lfnbuf[ni]) break;\t/* Name matched? */\n\t\t}\n\t\treturn res;\n\t}\n#endif\n\t/* On the FAT/FAT32 volume */\n#if FF_USE_LFN\n\tord = sum = 0xFF; dp->blk_ofs = 0xFFFFFFFF;\t/* Reset LFN sequence */\n#endif\n\tdo {\n\t\tres = move_window(fs, dp->sect);\n\t\tif (res != FR_OK) break;\n\t\tc = dp->dir[DIR_Name];\n\t\tif (c == 0) { res = FR_NO_FILE; break; }\t/* Reached to end of table */\n#if FF_USE_LFN\t\t/* LFN configuration */\n\t\tdp->obj.attr = a = dp->dir[DIR_Attr] & AM_MASK;\n\t\tif (c == DDEM || ((a & AM_VOL) && a != AM_LFN)) {\t/* An entry without valid data */\n\t\t\tord = 0xFF; dp->blk_ofs = 0xFFFFFFFF;\t/* Reset LFN sequence */\n\t\t} else {\n\t\t\tif (a == AM_LFN) {\t\t\t/* An LFN entry is found */\n\t\t\t\tif (!(dp->fn[NSFLAG] & NS_NOLFN)) {\n\t\t\t\t\tif (c & LLEF) {\t\t/* Is it start of LFN sequence? */\n\t\t\t\t\t\tsum = dp->dir[LDIR_Chksum];\n\t\t\t\t\t\tc &= (BYTE)~LLEF; ord = c;\t/* LFN start order */\n\t\t\t\t\t\tdp->blk_ofs = dp->dptr;\t/* Start offset of LFN */\n\t\t\t\t\t}\n\t\t\t\t\t/* Check validity of the LFN entry and compare it with given name */\n\t\t\t\t\tord = (c == ord && sum == dp->dir[LDIR_Chksum] && cmp_lfn(fs->lfnbuf, dp->dir)) ? ord - 1 : 0xFF;\n\t\t\t\t}\n\t\t\t} else {\t\t\t\t\t/* An SFN entry is found */\n\t\t\t\tif (ord == 0 && sum == sum_sfn(dp->dir)) break;\t/* LFN matched? */\n\t\t\t\tif (!(dp->fn[NSFLAG] & NS_LOSS) && !memcmp(dp->dir, dp->fn, 11)) break;\t/* SFN matched? */\n\t\t\t\tord = 0xFF; dp->blk_ofs = 0xFFFFFFFF;\t/* Reset LFN sequence */\n\t\t\t}\n\t\t}\n#else\t\t/* Non LFN configuration */\n\t\tdp->obj.attr = dp->dir[DIR_Attr] & AM_MASK;\n\t\tif (!(dp->dir[DIR_Attr] & AM_VOL) && !memcmp(dp->dir, dp->fn, 11)) break;\t/* Is it a valid entry? */\n#endif\n\t\tres = dir_next(dp, 0);\t/* Next entry */\n\t} while (res == FR_OK);\n\n\treturn res;\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Register an object to the directory                                   */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_register (\t/* FR_OK:succeeded, FR_DENIED:no free entry or too many SFN collision, FR_DISK_ERR:disk error */\n\tDIR* dp\t\t\t\t\t\t/* Target directory with object name to be created */\n)\n{\n\tFRESULT res;\n\tFATFS *fs = dp->obj.fs;\n#if FF_USE_LFN\t\t/* LFN configuration */\n\tUINT n, len, n_ent;\n\tBYTE sn[12], sum;\n\n\n\tif (dp->fn[NSFLAG] & (NS_DOT | NS_NONAME)) return FR_INVALID_NAME;\t/* Check name validity */\n\tfor (len = 0; fs->lfnbuf[len]; len++) ;\t/* Get lfn length */\n\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tn_ent = (len + 14) / 15 + 2;\t/* Number of entries to allocate (85+C0+C1s) */\n\t\tres = dir_alloc(dp, n_ent);\t\t/* Allocate directory entries */\n\t\tif (res != FR_OK) return res;\n\t\tdp->blk_ofs = dp->dptr - SZDIRE * (n_ent - 1);\t/* Set the allocated entry block offset */\n\n\t\tif (dp->obj.stat & 4) {\t\t\t/* Has the directory been stretched by new allocation? */\n\t\t\tdp->obj.stat &= ~4;\n\t\t\tres = fill_first_frag(&dp->obj);\t/* Fill the first fragment on the FAT if needed */\n\t\t\tif (res != FR_OK) return res;\n\t\t\tres = fill_last_frag(&dp->obj, dp->clust, 0xFFFFFFFF);\t/* Fill the last fragment on the FAT if needed */\n\t\t\tif (res != FR_OK) return res;\n\t\t\tif (dp->obj.sclust != 0) {\t\t/* Is it a sub-directory? */\n\t\t\t\tDIR dj;\n\n\t\t\t\tres = load_obj_xdir(&dj, &dp->obj);\t/* Load the object status */\n\t\t\t\tif (res != FR_OK) return res;\n\t\t\t\tdp->obj.objsize += (DWORD)fs->csize * SS(fs);\t\t/* Increase the directory size by cluster size */\n\t\t\t\tst_qword(fs->dirbuf + XDIR_FileSize, dp->obj.objsize);\n\t\t\t\tst_qword(fs->dirbuf + XDIR_ValidFileSize, dp->obj.objsize);\n\t\t\t\tfs->dirbuf[XDIR_GenFlags] = dp->obj.stat | 1;\t\t/* Update the allocation status */\n\t\t\t\tres = store_xdir(&dj);\t\t\t\t/* Store the object status */\n\t\t\t\tif (res != FR_OK) return res;\n\t\t\t}\n\t\t}\n\n\t\tcreate_xdir(fs->dirbuf, fs->lfnbuf);\t/* Create on-memory directory block to be written later */\n\t\treturn FR_OK;\n\t}\n#endif\n\t/* On the FAT/FAT32 volume */\n\tmemcpy(sn, dp->fn, 12);\n\tif (sn[NSFLAG] & NS_LOSS) {\t\t\t/* When LFN is out of 8.3 format, generate a numbered name */\n\t\tdp->fn[NSFLAG] = NS_NOLFN;\t\t/* Find only SFN */\n\t\tfor (n = 1; n < 100; n++) {\n\t\t\tgen_numname(dp->fn, sn, fs->lfnbuf, n);\t/* Generate a numbered name */\n\t\t\tres = dir_find(dp);\t\t\t\t/* Check if the name collides with existing SFN */\n\t\t\tif (res != FR_OK) break;\n\t\t}\n\t\tif (n == 100) return FR_DENIED;\t\t/* Abort if too many collisions */\n\t\tif (res != FR_NO_FILE) return res;\t/* Abort if the result is other than 'not collided' */\n\t\tdp->fn[NSFLAG] = sn[NSFLAG];\n\t}\n\n\t/* Create an SFN with/without LFNs. */\n\tn_ent = (sn[NSFLAG] & NS_LFN) ? (len + 12) / 13 + 1 : 1;\t/* Number of entries to allocate */\n\tres = dir_alloc(dp, n_ent);\t\t/* Allocate entries */\n\tif (res == FR_OK && --n_ent) {\t/* Set LFN entry if needed */\n\t\tres = dir_sdi(dp, dp->dptr - n_ent * SZDIRE);\n\t\tif (res == FR_OK) {\n\t\t\tsum = sum_sfn(dp->fn);\t/* Checksum value of the SFN tied to the LFN */\n\t\t\tdo {\t\t\t\t\t/* Store LFN entries in bottom first */\n\t\t\t\tres = move_window(fs, dp->sect);\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tput_lfn(fs->lfnbuf, dp->dir, (BYTE)n_ent, sum);\n\t\t\t\tfs->wflag = 1;\n\t\t\t\tres = dir_next(dp, 0);\t/* Next entry */\n\t\t\t} while (res == FR_OK && --n_ent);\n\t\t}\n\t}\n\n#else\t/* Non LFN configuration */\n\tres = dir_alloc(dp, 1);\t\t/* Allocate an entry for SFN */\n\n#endif\n\n\t/* Set SFN entry */\n\tif (res == FR_OK) {\n\t\tres = move_window(fs, dp->sect);\n\t\tif (res == FR_OK) {\n\t\t\tmemset(dp->dir, 0, SZDIRE);\t/* Clean the entry */\n\t\t\tmemcpy(dp->dir + DIR_Name, dp->fn, 11);\t/* Put SFN */\n#if FF_USE_LFN\n\t\t\tdp->dir[DIR_NTres] = dp->fn[NSFLAG] & (NS_BODY | NS_EXT);\t/* Put NT flag */\n#endif\n\t\t\tfs->wflag = 1;\n\t\t}\n\t}\n\n\treturn res;\n}\n\n#endif /* !FF_FS_READONLY */\n\n\n\n#if !FF_FS_READONLY && FF_FS_MINIMIZE == 0\n/*-----------------------------------------------------------------------*/\n/* Remove an object from the directory                                   */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT dir_remove (\t/* FR_OK:Succeeded, FR_DISK_ERR:A disk error */\n\tDIR* dp\t\t\t\t\t/* Directory object pointing the entry to be removed */\n)\n{\n\tFRESULT res;\n\tFATFS *fs = dp->obj.fs;\n#if FF_USE_LFN\t\t/* LFN configuration */\n\tDWORD last = dp->dptr;\n\n\tres = (dp->blk_ofs == 0xFFFFFFFF) ? FR_OK : dir_sdi(dp, dp->blk_ofs);\t/* Goto top of the entry block if LFN is exist */\n\tif (res == FR_OK) {\n\t\tdo {\n\t\t\tres = move_window(fs, dp->sect);\n\t\t\tif (res != FR_OK) break;\n\t\t\tif (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\t\t\tdp->dir[XDIR_Type] &= 0x7F;\t/* Clear the entry InUse flag. */\n\t\t\t} else {\t\t\t\t\t\t\t\t\t\t/* On the FAT/FAT32 volume */\n\t\t\t\tdp->dir[DIR_Name] = DDEM;\t/* Mark the entry 'deleted'. */\n\t\t\t}\n\t\t\tfs->wflag = 1;\n\t\t\tif (dp->dptr >= last) break;\t/* If reached last entry then all entries of the object has been deleted. */\n\t\t\tres = dir_next(dp, 0);\t/* Next entry */\n\t\t} while (res == FR_OK);\n\t\tif (res == FR_NO_FILE) res = FR_INT_ERR;\n\t}\n#else\t\t\t/* Non LFN configuration */\n\n\tres = move_window(fs, dp->sect);\n\tif (res == FR_OK) {\n\t\tdp->dir[DIR_Name] = DDEM;\t/* Mark the entry 'deleted'.*/\n\t\tfs->wflag = 1;\n\t}\n#endif\n\n\treturn res;\n}\n\n#endif /* !FF_FS_READONLY && FF_FS_MINIMIZE == 0 */\n\n\n\n#if FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2\n/*-----------------------------------------------------------------------*/\n/* Get file information from directory entry                             */\n/*-----------------------------------------------------------------------*/\n\nstatic void get_fileinfo (\n\tDIR* dp,\t\t\t/* Pointer to the directory object */\n\tFILINFO* fno\t\t/* Pointer to the file information to be filled */\n)\n{\n\tUINT si, di;\n#if FF_USE_LFN\n\tBYTE lcf;\n\tWCHAR wc, hs;\n\tFATFS *fs = dp->obj.fs;\n\tUINT nw;\n#else\n\tTCHAR c;\n#endif\n\n\n\tfno->fname[0] = 0;\t\t\t/* Invaidate file info */\n\tif (dp->sect == 0) return;\t/* Exit if read pointer has reached end of directory */\n\n#if FF_USE_LFN\t\t/* LFN configuration */\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* exFAT volume */\n\t\tUINT nc = 0;\n\n\t\tsi = SZDIRE * 2; di = 0;\t/* 1st C1 entry in the entry block */\n\t\ths = 0;\n\t\twhile (nc < fs->dirbuf[XDIR_NumName]) {\n\t\t\tif (si >= MAXDIRB(FF_MAX_LFN)) {\t/* Truncated directory block? */\n\t\t\t\tdi = 0; break;\n\t\t\t}\n\t\t\tif ((si % SZDIRE) == 0) si += 2;\t/* Skip entry type field */\n\t\t\twc = ld_word(fs->dirbuf + si); si += 2; nc++;\t/* Get a character */\n\t\t\tif (hs == 0 && IsSurrogate(wc)) {\t/* Is it a surrogate? */\n\t\t\t\ths = wc; continue;\t\t\t\t/* Get low surrogate */\n\t\t\t}\n\t\t\tnw = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di);\t/* Store it in API encoding */\n\t\t\tif (nw == 0) {\t\t\t\t\t\t/* Buffer overflow or wrong char? */\n\t\t\t\tdi = 0; break;\n\t\t\t}\n\t\t\tdi += nw;\n\t\t\ths = 0;\n\t\t}\n\t\tif (hs != 0) di = 0;\t\t\t\t\t/* Broken surrogate pair? */\n\t\tif (di == 0) fno->fname[di++] = '\\?';\t/* Inaccessible object name? */\n\t\tfno->fname[di] = 0;\t\t\t\t\t\t/* Terminate the name */\n\t\tfno->altname[0] = 0;\t\t\t\t\t/* exFAT does not support SFN */\n\n\t\tfno->fattrib = fs->dirbuf[XDIR_Attr] & AM_MASKX;\t\t/* Attribute */\n\t\tfno->fsize = (fno->fattrib & AM_DIR) ? 0 : ld_qword(fs->dirbuf + XDIR_FileSize);\t/* Size */\n\t\tfno->ftime = ld_word(fs->dirbuf + XDIR_ModTime + 0);\t/* Time */\n\t\tfno->fdate = ld_word(fs->dirbuf + XDIR_ModTime + 2);\t/* Date */\n\t\treturn;\n\t} else\n#endif\n\t{\t/* FAT/FAT32 volume */\n\t\tif (dp->blk_ofs != 0xFFFFFFFF) {\t/* Get LFN if available */\n\t\t\tsi = di = 0;\n\t\t\ths = 0;\n\t\t\twhile (fs->lfnbuf[si] != 0) {\n\t\t\t\twc = fs->lfnbuf[si++];\t\t/* Get an LFN character (UTF-16) */\n\t\t\t\tif (hs == 0 && IsSurrogate(wc)) {\t/* Is it a surrogate? */\n\t\t\t\t\ths = wc; continue;\t\t/* Get low surrogate */\n\t\t\t\t}\n\t\t\t\tnw = put_utf((DWORD)hs << 16 | wc, &fno->fname[di], FF_LFN_BUF - di);\t/* Store it in API encoding */\n\t\t\t\tif (nw == 0) {\t\t\t\t/* Buffer overflow or wrong char? */\n\t\t\t\t\tdi = 0; break;\n\t\t\t\t}\n\t\t\t\tdi += nw;\n\t\t\t\ths = 0;\n\t\t\t}\n\t\t\tif (hs != 0) di = 0;\t/* Broken surrogate pair? */\n\t\t\tfno->fname[di] = 0;\t\t/* Terminate the LFN (null string means LFN is invalid) */\n\t\t}\n\t}\n\n\tsi = di = 0;\n\twhile (si < 11) {\t\t/* Get SFN from SFN entry */\n\t\twc = dp->dir[si++];\t\t\t/* Get a char */\n\t\tif (wc == ' ') continue;\t/* Skip padding spaces */\n\t\tif (wc == RDDEM) wc = DDEM;\t/* Restore replaced DDEM character */\n\t\tif (si == 9 && di < FF_SFN_BUF) fno->altname[di++] = '.';\t/* Insert a . if extension is exist */\n#if FF_LFN_UNICODE >= 1\t/* Unicode output */\n\t\tif (dbc_1st((BYTE)wc) && si != 8 && si != 11 && dbc_2nd(dp->dir[si])) {\t/* Make a DBC if needed */\n\t\t\twc = wc << 8 | dp->dir[si++];\n\t\t}\n\t\twc = ff_oem2uni(wc, CODEPAGE);\t\t/* ANSI/OEM -> Unicode */\n\t\tif (wc == 0) {\t\t\t\t/* Wrong char in the current code page? */\n\t\t\tdi = 0; break;\n\t\t}\n\t\tnw = put_utf(wc, &fno->altname[di], FF_SFN_BUF - di);\t/* Store it in API encoding */\n\t\tif (nw == 0) {\t\t\t\t/* Buffer overflow? */\n\t\t\tdi = 0; break;\n\t\t}\n\t\tdi += nw;\n#else\t\t\t\t\t/* ANSI/OEM output */\n\t\tfno->altname[di++] = (TCHAR)wc;\t/* Store it without any conversion */\n#endif\n\t}\n\tfno->altname[di] = 0;\t/* Terminate the SFN  (null string means SFN is invalid) */\n\n\tif (fno->fname[0] == 0) {\t/* If LFN is invalid, altname[] needs to be copied to fname[] */\n\t\tif (di == 0) {\t/* If LFN and SFN both are invalid, this object is inaccessible */\n\t\t\tfno->fname[di++] = '\\?';\n\t\t} else {\n\t\t\tfor (si = di = 0, lcf = NS_BODY; fno->altname[si]; si++, di++) {\t/* Copy altname[] to fname[] with case information */\n\t\t\t\twc = (WCHAR)fno->altname[si];\n\t\t\t\tif (wc == '.') lcf = NS_EXT;\n\t\t\t\tif (IsUpper(wc) && (dp->dir[DIR_NTres] & lcf)) wc += 0x20;\n\t\t\t\tfno->fname[di] = (TCHAR)wc;\n\t\t\t}\n\t\t}\n\t\tfno->fname[di] = 0;\t/* Terminate the LFN */\n\t\tif (!dp->dir[DIR_NTres]) fno->altname[0] = 0;\t/* Altname is not needed if neither LFN nor case info is exist. */\n\t}\n\n#else\t/* Non-LFN configuration */\n\tsi = di = 0;\n\twhile (si < 11) {\t\t/* Copy name body and extension */\n\t\tc = (TCHAR)dp->dir[si++];\n\t\tif (c == ' ') continue;\t\t/* Skip padding spaces */\n\t\tif (c == RDDEM) c = DDEM;\t/* Restore replaced DDEM character */\n\t\tif (si == 9) fno->fname[di++] = '.';/* Insert a . if extension is exist */\n\t\tfno->fname[di++] = c;\n\t}\n\tfno->fname[di] = 0;\t\t/* Terminate the SFN */\n#endif\n\n\tfno->fattrib = dp->dir[DIR_Attr] & AM_MASK;\t\t\t/* Attribute */\n\tfno->fsize = ld_dword(dp->dir + DIR_FileSize);\t\t/* Size */\n\tfno->ftime = ld_word(dp->dir + DIR_ModTime + 0);\t/* Time */\n\tfno->fdate = ld_word(dp->dir + DIR_ModTime + 2);\t/* Date */\n}\n\n#endif /* FF_FS_MINIMIZE <= 1 || FF_FS_RPATH >= 2 */\n\n\n\n#if FF_USE_FIND && FF_FS_MINIMIZE <= 1\n/*-----------------------------------------------------------------------*/\n/* Pattern matching                                                      */\n/*-----------------------------------------------------------------------*/\n\n#define FIND_RECURS\t4\t/* Maximum number of wildcard terms in the pattern to limit recursion */\n\n\nstatic DWORD get_achar (\t/* Get a character and advance ptr */\n\tconst TCHAR** ptr\t\t/* Pointer to pointer to the ANSI/OEM or Unicode string */\n)\n{\n\tDWORD chr;\n\n\n#if FF_USE_LFN && FF_LFN_UNICODE >= 1\t/* Unicode input */\n\tchr = tchar2uni(ptr);\n\tif (chr == 0xFFFFFFFF) chr = 0;\t\t/* Wrong UTF encoding is recognized as end of the string */\n\tchr = ff_wtoupper(chr);\n\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM input */\n\tchr = (BYTE)*(*ptr)++;\t\t\t\t/* Get a byte */\n\tif (IsLower(chr)) chr -= 0x20;\t\t/* To upper ASCII char */\n#if FF_CODE_PAGE == 0\n\tif (ExCvt && chr >= 0x80) chr = ExCvt[chr - 0x80];\t/* To upper SBCS extended char */\n#elif FF_CODE_PAGE < 900\n\tif (chr >= 0x80) chr = ExCvt[chr - 0x80];\t/* To upper SBCS extended char */\n#endif\n#if FF_CODE_PAGE == 0 || FF_CODE_PAGE >= 900\n\tif (dbc_1st((BYTE)chr)) {\t/* Get DBC 2nd byte if needed */\n\t\tchr = dbc_2nd((BYTE)**ptr) ? chr << 8 | (BYTE)*(*ptr)++ : 0;\n\t}\n#endif\n\n#endif\n\treturn chr;\n}\n\n\nstatic int pattern_match (\t/* 0:mismatched, 1:matched */\n\tconst TCHAR* pat,\t/* Matching pattern */\n\tconst TCHAR* nam,\t/* String to be tested */\n\tUINT skip,\t\t\t/* Number of pre-skip chars (number of ?s, b8:infinite (* specified)) */\n\tUINT recur\t\t\t/* Recursion count */\n)\n{\n\tconst TCHAR *pptr;\n\tconst TCHAR *nptr;\n\tDWORD pchr, nchr;\n\tUINT sk;\n\n\n\twhile ((skip & 0xFF) != 0) {\t\t/* Pre-skip name chars */\n\t\tif (!get_achar(&nam)) return 0;\t/* Branch mismatched if less name chars */\n\t\tskip--;\n\t}\n\tif (*pat == 0 && skip) return 1;\t/* Matched? (short circuit) */\n\n\tdo {\n\t\tpptr = pat; nptr = nam;\t\t\t/* Top of pattern and name to match */\n\t\tfor (;;) {\n\t\t\tif (*pptr == '\\?' || *pptr == '*') {\t/* Wildcard term? */\n\t\t\t\tif (recur == 0) return 0;\t/* Too many wildcard terms? */\n\t\t\t\tsk = 0;\n\t\t\t\tdo {\t/* Analyze the wildcard term */\n\t\t\t\t\tif (*pptr++ == '\\?') {\n\t\t\t\t\t\tsk++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsk |= 0x100;\n\t\t\t\t\t}\n\t\t\t\t} while (*pptr == '\\?' || *pptr == '*');\n\t\t\t\tif (pattern_match(pptr, nptr, sk, recur - 1)) return 1;\t/* Test new branch (recursive call) */\n\t\t\t\tnchr = *nptr; break;\t/* Branch mismatched */\n\t\t\t}\n\t\t\tpchr = get_achar(&pptr);\t/* Get a pattern char */\n\t\t\tnchr = get_achar(&nptr);\t/* Get a name char */\n\t\t\tif (pchr != nchr) break;\t/* Branch mismatched? */\n\t\t\tif (pchr == 0) return 1;\t/* Branch matched? (matched at end of both strings) */\n\t\t}\n\t\tget_achar(&nam);\t\t\t/* nam++ */\n\t} while (skip && nchr);\t\t/* Retry until end of name if infinite search is specified */\n\n\treturn 0;\n}\n\n#endif /* FF_USE_FIND && FF_FS_MINIMIZE <= 1 */\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Pick a top segment and create the object name in directory form       */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT create_name (\t/* FR_OK: successful, FR_INVALID_NAME: could not create */\n\tDIR* dp,\t\t\t\t\t/* Pointer to the directory object */\n\tconst TCHAR** path\t\t\t/* Pointer to pointer to the segment in the path string */\n)\n{\n#if FF_USE_LFN\t\t/* LFN configuration */\n\tBYTE b, cf;\n\tWCHAR wc;\n\tWCHAR *lfn;\n\tconst TCHAR* p;\n\tDWORD uc;\n\tUINT i, ni, si, di;\n\n\n\t/* Create LFN into LFN working buffer */\n\tp = *path; lfn = dp->obj.fs->lfnbuf; di = 0;\n\tfor (;;) {\n\t\tuc = tchar2uni(&p);\t\t\t/* Get a character */\n\t\tif (uc == 0xFFFFFFFF) return FR_INVALID_NAME;\t\t/* Invalid code or UTF decode error */\n\t\tif (uc >= 0x10000) lfn[di++] = (WCHAR)(uc >> 16);\t/* Store high surrogate if needed */\n\t\twc = (WCHAR)uc;\n\t\tif (wc < ' ' || IsSeparator(wc)) break;\t/* Break if end of the path or a separator is found */\n\t\tif (wc < 0x80 && strchr(\"*:<>|\\\"\\?\\x7F\", (int)wc)) return FR_INVALID_NAME;\t/* Reject illegal characters for LFN */\n\t\tif (di >= FF_MAX_LFN) return FR_INVALID_NAME;\t/* Reject too long name */\n\t\tlfn[di++] = wc;\t\t\t\t/* Store the Unicode character */\n\t}\n\tif (wc < ' ') {\t\t\t\t/* Stopped at end of the path? */\n\t\tcf = NS_LAST;\t\t\t/* Last segment */\n\t} else {\t\t\t\t\t/* Stopped at a separator */\n\t\twhile (IsSeparator(*p)) p++;\t/* Skip duplicated separators if exist */\n\t\tcf = 0;\t\t\t\t\t/* Next segment may follow */\n\t\tif (IsTerminator(*p)) cf = NS_LAST;\t/* Ignore terminating separator */\n\t}\n\t*path = p;\t\t\t\t\t/* Return pointer to the next segment */\n\n#if FF_FS_RPATH != 0\n\tif ((di == 1 && lfn[di - 1] == '.') ||\n\t\t(di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) {\t/* Is this segment a dot name? */\n\t\tlfn[di] = 0;\n\t\tfor (i = 0; i < 11; i++) {\t/* Create dot name for SFN entry */\n\t\t\tdp->fn[i] = (i < di) ? '.' : ' ';\n\t\t}\n\t\tdp->fn[i] = cf | NS_DOT;\t/* This is a dot entry */\n\t\treturn FR_OK;\n\t}\n#endif\n\twhile (di) {\t\t\t\t\t/* Snip off trailing spaces and dots if exist */\n\t\twc = lfn[di - 1];\n\t\tif (wc != ' ' && wc != '.') break;\n\t\tdi--;\n\t}\n\tlfn[di] = 0;\t\t\t\t\t\t\t/* LFN is created into the working buffer */\n\tif (di == 0) return FR_INVALID_NAME;\t/* Reject null name */\n\n\t/* Create SFN in directory form */\n\tfor (si = 0; lfn[si] == ' '; si++) ;\t/* Remove leading spaces */\n\tif (si > 0 || lfn[si] == '.') cf |= NS_LOSS | NS_LFN;\t/* Is there any leading space or dot? */\n\twhile (di > 0 && lfn[di - 1] != '.') di--;\t/* Find last dot (di<=si: no extension) */\n\n\tmemset(dp->fn, ' ', 11);\n\ti = b = 0; ni = 8;\n\tfor (;;) {\n\t\twc = lfn[si++];\t\t\t\t\t/* Get an LFN character */\n\t\tif (wc == 0) break;\t\t\t\t/* Break on end of the LFN */\n\t\tif (wc == ' ' || (wc == '.' && si != di)) {\t/* Remove embedded spaces and dots */\n\t\t\tcf |= NS_LOSS | NS_LFN;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (i >= ni || si == di) {\t\t/* End of field? */\n\t\t\tif (ni == 11) {\t\t\t\t/* Name extension overflow? */\n\t\t\t\tcf |= NS_LOSS | NS_LFN;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (si != di) cf |= NS_LOSS | NS_LFN;\t/* Name body overflow? */\n\t\t\tif (si > di) break;\t\t\t\t\t\t/* No name extension? */\n\t\t\tsi = di; i = 8; ni = 11; b <<= 2;\t\t/* Enter name extension */\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (wc >= 0x80) {\t/* Is this an extended character? */\n\t\t\tcf |= NS_LFN;\t/* LFN entry needs to be created */\n#if FF_CODE_PAGE == 0\n\t\t\tif (ExCvt) {\t/* In SBCS cfg */\n\t\t\t\twc = ff_uni2oem(wc, CODEPAGE);\t\t\t/* Unicode ==> ANSI/OEM code */\n\t\t\t\tif (wc & 0x80) wc = ExCvt[wc & 0x7F];\t/* Convert extended character to upper (SBCS) */\n\t\t\t} else {\t\t/* In DBCS cfg */\n\t\t\t\twc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE);\t/* Unicode ==> Up-convert ==> ANSI/OEM code */\n\t\t\t}\n#elif FF_CODE_PAGE < 900\t/* In SBCS cfg */\n\t\t\twc = ff_uni2oem(wc, CODEPAGE);\t\t\t/* Unicode ==> ANSI/OEM code */\n\t\t\tif (wc & 0x80) wc = ExCvt[wc & 0x7F];\t/* Convert extended character to upper (SBCS) */\n#else\t\t\t\t\t\t/* In DBCS cfg */\n\t\t\twc = ff_uni2oem(ff_wtoupper(wc), CODEPAGE);\t/* Unicode ==> Up-convert ==> ANSI/OEM code */\n#endif\n\t\t}\n\n\t\tif (wc >= 0x100) {\t\t\t\t/* Is this a DBC? */\n\t\t\tif (i >= ni - 1) {\t\t\t/* Field overflow? */\n\t\t\t\tcf |= NS_LOSS | NS_LFN;\n\t\t\t\ti = ni; continue;\t\t/* Next field */\n\t\t\t}\n\t\t\tdp->fn[i++] = (BYTE)(wc >> 8);\t/* Put 1st byte */\n\t\t} else {\t\t\t\t\t\t/* SBC */\n\t\t\tif (wc == 0 || strchr(\"+,;=[]\", (int)wc)) {\t/* Replace illegal characters for SFN */\n\t\t\t\twc = '_'; cf |= NS_LOSS | NS_LFN;/* Lossy conversion */\n\t\t\t} else {\n\t\t\t\tif (IsUpper(wc)) {\t\t/* ASCII upper case? */\n\t\t\t\t\tb |= 2;\n\t\t\t\t}\n\t\t\t\tif (IsLower(wc)) {\t\t/* ASCII lower case? */\n\t\t\t\t\tb |= 1; wc -= 0x20;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdp->fn[i++] = (BYTE)wc;\n\t}\n\n\tif (dp->fn[0] == DDEM) dp->fn[0] = RDDEM;\t/* If the first character collides with DDEM, replace it with RDDEM */\n\n\tif (ni == 8) b <<= 2;\t\t\t\t/* Shift capital flags if no extension */\n\tif ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) cf |= NS_LFN;\t/* LFN entry needs to be created if composite capitals */\n\tif (!(cf & NS_LFN)) {\t\t\t\t/* When LFN is in 8.3 format without extended character, NT flags are created */\n\t\tif (b & 0x01) cf |= NS_EXT;\t\t/* NT flag (Extension has small capital letters only) */\n\t\tif (b & 0x04) cf |= NS_BODY;\t/* NT flag (Body has small capital letters only) */\n\t}\n\n\tdp->fn[NSFLAG] = cf;\t/* SFN is created into dp->fn[] */\n\n\treturn FR_OK;\n\n\n#else\t/* FF_USE_LFN : Non-LFN configuration */\n\tBYTE c, d;\n\tBYTE *sfn;\n\tUINT ni, si, i;\n\tconst char *p;\n\n\t/* Create file name in directory form */\n\tp = *path; sfn = dp->fn;\n\tmemset(sfn, ' ', 11);\n\tsi = i = 0; ni = 8;\n#if FF_FS_RPATH != 0\n\tif (p[si] == '.') { /* Is this a dot entry? */\n\t\tfor (;;) {\n\t\t\tc = (BYTE)p[si++];\n\t\t\tif (c != '.' || si >= 3) break;\n\t\t\tsfn[i++] = c;\n\t\t}\n\t\tif (!IsSeparator(c) && c > ' ') return FR_INVALID_NAME;\n\t\t*path = p + si;\t\t\t\t\t/* Return pointer to the next segment */\n\t\tsfn[NSFLAG] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT;\t/* Set last segment flag if end of the path */\n\t\treturn FR_OK;\n\t}\n#endif\n\tfor (;;) {\n\t\tc = (BYTE)p[si++];\t\t\t\t/* Get a byte */\n\t\tif (c <= ' ') break; \t\t\t/* Break if end of the path name */\n\t\tif (IsSeparator(c)) {\t\t\t/* Break if a separator is found */\n\t\t\twhile (IsSeparator(p[si])) si++;\t/* Skip duplicated separator if exist */\n\t\t\tbreak;\n\t\t}\n\t\tif (c == '.' || i >= ni) {\t\t/* End of body or field overflow? */\n\t\t\tif (ni == 11 || c != '.') return FR_INVALID_NAME;\t/* Field overflow or invalid dot? */\n\t\t\ti = 8; ni = 11;\t\t\t\t/* Enter file extension field */\n\t\t\tcontinue;\n\t\t}\n#if FF_CODE_PAGE == 0\n\t\tif (ExCvt && c >= 0x80) {\t\t/* Is SBC extended character? */\n\t\t\tc = ExCvt[c & 0x7F];\t\t/* To upper SBC extended character */\n\t\t}\n#elif FF_CODE_PAGE < 900\n\t\tif (c >= 0x80) {\t\t\t\t/* Is SBC extended character? */\n\t\t\tc = ExCvt[c & 0x7F];\t\t/* To upper SBC extended character */\n\t\t}\n#endif\n\t\tif (dbc_1st(c)) {\t\t\t\t/* Check if it is a DBC 1st byte */\n\t\t\td = (BYTE)p[si++];\t\t\t/* Get 2nd byte */\n\t\t\tif (!dbc_2nd(d) || i >= ni - 1) return FR_INVALID_NAME;\t/* Reject invalid DBC */\n\t\t\tsfn[i++] = c;\n\t\t\tsfn[i++] = d;\n\t\t} else {\t\t\t\t\t\t/* SBC */\n\t\t\tif (strchr(\"*+,:;<=>[]|\\\"\\?\\x7F\", (int)c)) return FR_INVALID_NAME;\t/* Reject illegal chrs for SFN */\n\t\t\tif (IsLower(c)) c -= 0x20;\t/* To upper */\n\t\t\tsfn[i++] = c;\n\t\t}\n\t}\n\t*path = &p[si];\t\t\t\t\t\t/* Return pointer to the next segment */\n\tif (i == 0) return FR_INVALID_NAME;\t/* Reject nul string */\n\n\tif (sfn[0] == DDEM) sfn[0] = RDDEM;\t/* If the first character collides with DDEM, replace it with RDDEM */\n\tsfn[NSFLAG] = (c <= ' ' || p[si] <= ' ') ? NS_LAST : 0;\t/* Set last segment flag if end of the path */\n\n\treturn FR_OK;\n#endif /* FF_USE_LFN */\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Follow a file path                                                    */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT follow_path (\t/* FR_OK(0): successful, !=0: error code */\n\tDIR* dp,\t\t\t\t\t/* Directory object to return last directory and found object */\n\tconst TCHAR* path\t\t\t/* Full-path string to find a file or directory */\n)\n{\n\tFRESULT res;\n\tBYTE ns;\n\tFATFS *fs = dp->obj.fs;\n\n\n#if FF_FS_RPATH != 0\n\tif (!IsSeparator(*path) && (FF_STR_VOLUME_ID != 2 || !IsTerminator(*path))) {\t/* Without heading separator */\n\t\tdp->obj.sclust = fs->cdir;\t\t\t/* Start at the current directory */\n\t} else\n#endif\n\t{\t\t\t\t\t\t\t\t\t\t/* With heading separator */\n\t\twhile (IsSeparator(*path)) path++;\t/* Strip separators */\n\t\tdp->obj.sclust = 0;\t\t\t\t\t/* Start from the root directory */\n\t}\n#if FF_FS_EXFAT\n\tdp->obj.n_frag = 0;\t/* Invalidate last fragment counter of the object */\n#if FF_FS_RPATH != 0\n\tif (fs->fs_type == FS_EXFAT && dp->obj.sclust) {\t/* exFAT: Retrieve the sub-directory's status */\n\t\tDIR dj;\n\n\t\tdp->obj.c_scl = fs->cdc_scl;\n\t\tdp->obj.c_size = fs->cdc_size;\n\t\tdp->obj.c_ofs = fs->cdc_ofs;\n\t\tres = load_obj_xdir(&dj, &dp->obj);\n\t\tif (res != FR_OK) return res;\n\t\tdp->obj.objsize = ld_dword(fs->dirbuf + XDIR_FileSize);\n\t\tdp->obj.stat = fs->dirbuf[XDIR_GenFlags] & 2;\n\t}\n#endif\n#endif\n\n\tif ((UINT)*path < ' ') {\t\t\t\t/* Null path name is the origin directory itself */\n\t\tdp->fn[NSFLAG] = NS_NONAME;\n\t\tres = dir_sdi(dp, 0);\n\n\t} else {\t\t\t\t\t\t\t\t/* Follow path */\n\t\tfor (;;) {\n\t\t\tres = create_name(dp, &path);\t/* Get a segment name of the path */\n\t\t\tif (res != FR_OK) break;\n\t\t\tres = dir_find(dp);\t\t\t\t/* Find an object with the segment name */\n\t\t\tns = dp->fn[NSFLAG];\n\t\t\tif (res != FR_OK) {\t\t\t\t/* Failed to find the object */\n\t\t\t\tif (res == FR_NO_FILE) {\t/* Object is not found */\n\t\t\t\t\tif (FF_FS_RPATH && (ns & NS_DOT)) {\t/* If dot entry is not exist, stay there */\n\t\t\t\t\t\tif (!(ns & NS_LAST)) continue;\t/* Continue to follow if not last segment */\n\t\t\t\t\t\tdp->fn[NSFLAG] = NS_NONAME;\n\t\t\t\t\t\tres = FR_OK;\n\t\t\t\t\t} else {\t\t\t\t\t\t\t/* Could not find the object */\n\t\t\t\t\t\tif (!(ns & NS_LAST)) res = FR_NO_PATH;\t/* Adjust error code if not last segment */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (ns & NS_LAST) break;\t\t/* Last segment matched. Function completed. */\n\t\t\t/* Get into the sub-directory */\n\t\t\tif (!(dp->obj.attr & AM_DIR)) {\t/* It is not a sub-directory and cannot follow */\n\t\t\t\tres = FR_NO_PATH; break;\n\t\t\t}\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\t/* Save containing directory information for next dir */\n\t\t\t\tdp->obj.c_scl = dp->obj.sclust;\n\t\t\t\tdp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat;\n\t\t\t\tdp->obj.c_ofs = dp->blk_ofs;\n\t\t\t\tinit_alloc_info(fs, &dp->obj);\t/* Open next directory */\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tdp->obj.sclust = ld_clust(fs, fs->win + dp->dptr % SS(fs));\t/* Open next directory */\n\t\t\t}\n\t\t}\n\t}\n\n\treturn res;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Get logical drive number from path name                               */\n/*-----------------------------------------------------------------------*/\n\nstatic int get_ldnumber (\t/* Returns logical drive number (-1:invalid drive number or null pointer) */\n\tconst TCHAR** path\t\t/* Pointer to pointer to the path name */\n)\n{\n\tconst TCHAR *tp;\n\tconst TCHAR *tt;\n\tTCHAR tc;\n\tint i;\n\tint vol = -1;\n#if FF_STR_VOLUME_ID\t\t/* Find string volume ID */\n\tconst char *sp;\n\tchar c;\n#endif\n\n\ttt = tp = *path;\n\tif (!tp) return vol;\t/* Invalid path name? */\n\tdo {\t\t\t\t\t/* Find a colon in the path */\n\t\ttc = *tt++;\n\t} while (!IsTerminator(tc) && tc != ':');\n\n\tif (tc == ':') {\t/* DOS/Windows style volume ID? */\n\t\ti = FF_VOLUMES;\n\t\tif (IsDigit(*tp) && tp + 2 == tt) {\t/* Is there a numeric volume ID + colon? */\n\t\t\ti = (int)*tp - '0';\t/* Get the LD number */\n\t\t}\n#if FF_STR_VOLUME_ID == 1\t/* Arbitrary string is enabled */\n\t\telse {\n\t\t\ti = 0;\n\t\t\tdo {\n\t\t\t\tsp = VolumeStr[i]; tp = *path;\t/* This string volume ID and path name */\n\t\t\t\tdo {\t/* Compare the volume ID with path name */\n\t\t\t\t\tc = *sp++; tc = *tp++;\n\t\t\t\t\tif (IsLower(c)) c -= 0x20;\n\t\t\t\t\tif (IsLower(tc)) tc -= 0x20;\n\t\t\t\t} while (c && (TCHAR)c == tc);\n\t\t\t} while ((c || tp != tt) && ++i < FF_VOLUMES);\t/* Repeat for each id until pattern match */\n\t\t}\n#endif\n\t\tif (i < FF_VOLUMES) {\t/* If a volume ID is found, get the drive number and strip it */\n\t\t\tvol = i;\t\t/* Drive number */\n\t\t\t*path = tt;\t\t/* Snip the drive prefix off */\n\t\t}\n\t\treturn vol;\n\t}\n#if FF_STR_VOLUME_ID == 2\t\t/* Unix style volume ID is enabled */\n\tif (*tp == '/') {\t\t\t/* Is there a volume ID? */\n\t\twhile (*(tp + 1) == '/') tp++;\t/* Skip duplicated separator */\n\t\ti = 0;\n\t\tdo {\n\t\t\ttt = tp; sp = VolumeStr[i]; /* Path name and this string volume ID */\n\t\t\tdo {\t/* Compare the volume ID with path name */\n\t\t\t\tc = *sp++; tc = *(++tt);\n\t\t\t\tif (IsLower(c)) c -= 0x20;\n\t\t\t\tif (IsLower(tc)) tc -= 0x20;\n\t\t\t} while (c && (TCHAR)c == tc);\n\t\t} while ((c || (tc != '/' && !IsTerminator(tc))) && ++i < FF_VOLUMES);\t/* Repeat for each ID until pattern match */\n\t\tif (i < FF_VOLUMES) {\t/* If a volume ID is found, get the drive number and strip it */\n\t\t\tvol = i;\t\t/* Drive number */\n\t\t\t*path = tt;\t\t/* Snip the drive prefix off */\n\t\t}\n\t\treturn vol;\n\t}\n#endif\n\t/* No drive prefix is found */\n#if FF_FS_RPATH != 0\n\tvol = CurrVol;\t/* Default drive is current drive */\n#else\n\tvol = 0;\t\t/* Default drive is 0 */\n#endif\n\treturn vol;\t\t/* Return the default drive */\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* GPT support functions                                                 */\n/*-----------------------------------------------------------------------*/\n\n#if FF_LBA64\n\n/* Calculate CRC32 in byte-by-byte */\n\nstatic DWORD crc32 (\t/* Returns next CRC value */\n\tDWORD crc,\t\t\t/* Current CRC value */\n\tBYTE d\t\t\t\t/* A byte to be processed */\n)\n{\n\tBYTE b;\n\n\n\tfor (b = 1; b; b <<= 1) {\n\t\tcrc ^= (d & b) ? 1 : 0;\n\t\tcrc = (crc & 1) ? crc >> 1 ^ 0xEDB88320 : crc >> 1;\n\t}\n\treturn crc;\n}\n\n\n/* Check validity of GPT header */\n\nstatic int test_gpt_header (\t/* 0:Invalid, 1:Valid */\n\tconst BYTE* gpth\t\t\t/* Pointer to the GPT header */\n)\n{\n\tUINT i;\n\tDWORD bcc, hlen;\n\n\n\tif (memcmp(gpth + GPTH_Sign, \"EFI PART\" \"\\0\\0\\1\", 12)) return 0;\t/* Check signature and version (1.0) */\n\thlen = ld_dword(gpth + GPTH_Size);\t\t\t\t\t\t/* Check header size */\n\tif (hlen < 92 || hlen > FF_MIN_SS) return 0;\n\tfor (i = 0, bcc = 0xFFFFFFFF; i < hlen; i++) {\t\t\t/* Check header BCC */\n\t\tbcc = crc32(bcc, i - GPTH_Bcc < 4 ? 0 : gpth[i]);\n\t}\n\tif (~bcc != ld_dword(gpth + GPTH_Bcc)) return 0;\n\tif (ld_dword(gpth + GPTH_PteSize) != SZ_GPTE) return 0;\t/* Table entry size (must be SZ_GPTE bytes) */\n\tif (ld_dword(gpth + GPTH_PtNum) > 128) return 0;\t\t/* Table size (must be 128 entries or less) */\n\n\treturn 1;\n}\n\n#if !FF_FS_READONLY && FF_USE_MKFS\n\n/* Generate random value */\nstatic DWORD make_rand (\n\tDWORD seed,\t\t/* Seed value */\n\tBYTE *buff,\t\t/* Output buffer */\n\tUINT n\t\t\t/* Data length */\n)\n{\n\tUINT r;\n\n\n\tif (seed == 0) seed = 1;\n\tdo {\n\t\tfor (r = 0; r < 8; r++) seed = seed & 1 ? seed >> 1 ^ 0xA3000000 : seed >> 1;\t/* Shift 8 bits the 32-bit LFSR */\n\t\t*buff++ = (BYTE)seed;\n\t} while (--n);\n\treturn seed;\n}\n\n#endif\n#endif\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Load a sector and check if it is an FAT VBR                           */\n/*-----------------------------------------------------------------------*/\n\n/* Check what the sector is */\n\nstatic UINT check_fs (\t/* 0:FAT/FAT32 VBR, 1:exFAT VBR, 2:Not FAT and valid BS, 3:Not FAT and invalid BS, 4:Disk error */\n\tFATFS* fs,\t\t\t/* Filesystem object */\n\tLBA_t sect\t\t\t/* Sector to load and check if it is an FAT-VBR or not */\n)\n{\n\tWORD w, sign;\n\tBYTE b;\n\n\n\tfs->wflag = 0; fs->winsect = (LBA_t)0 - 1;\t\t/* Invaidate window */\n\tif (move_window(fs, sect) != FR_OK) return 4;\t/* Load the boot sector */\n\tsign = ld_word(fs->win + BS_55AA);\n#if FF_FS_EXFAT\n\tif (sign == 0xAA55 && !memcmp(fs->win + BS_JmpBoot, \"\\xEB\\x76\\x90\" \"EXFAT   \", 11)) return 1;\t/* It is an exFAT VBR */\n#endif\n\tb = fs->win[BS_JmpBoot];\n\tif (b == 0xEB || b == 0xE9 || b == 0xE8) {\t/* Valid JumpBoot code? (short jump, near jump or near call) */\n\t\tif (sign == 0xAA55 && !memcmp(fs->win + BS_FilSysType32, \"FAT32   \", 8)) {\n\t\t\treturn 0;\t/* It is an FAT32 VBR */\n\t\t}\n\t\t/* FAT volumes formatted with early MS-DOS lack BS_55AA and BS_FilSysType, so FAT VBR needs to be identified without them. */\n\t\tw = ld_word(fs->win + BPB_BytsPerSec);\n\t\tb = fs->win[BPB_SecPerClus];\n\t\tif ((w & (w - 1)) == 0 && w >= FF_MIN_SS && w <= FF_MAX_SS\t/* Properness of sector size (512-4096 and 2^n) */\n\t\t\t&& b != 0 && (b & (b - 1)) == 0\t\t\t\t/* Properness of cluster size (2^n) */\n\t\t\t&& ld_word(fs->win + BPB_RsvdSecCnt) != 0\t/* Properness of reserved sectors (MNBZ) */\n\t\t\t&& (UINT)fs->win[BPB_NumFATs] - 1 <= 1\t\t/* Properness of FATs (1 or 2) */\n\t\t\t&& ld_word(fs->win + BPB_RootEntCnt) != 0\t/* Properness of root dir entries (MNBZ) */\n\t\t\t&& (ld_word(fs->win + BPB_TotSec16) >= 128 || ld_dword(fs->win + BPB_TotSec32) >= 0x10000)\t/* Properness of volume sectors (>=128) */\n\t\t\t&& ld_word(fs->win + BPB_FATSz16) != 0) {\t/* Properness of FAT size (MNBZ) */\n\t\t\t\treturn 0;\t/* It can be presumed an FAT VBR */\n\t\t}\n\t}\n\treturn sign == 0xAA55 ? 2 : 3;\t/* Not an FAT VBR (valid or invalid BS) */\n}\n\n\n/* Find an FAT volume */\n/* (It supports only generic partitioning rules, MBR, GPT and SFD) */\n\nstatic UINT find_volume (\t/* Returns BS status found in the hosting drive */\n\tFATFS* fs,\t\t/* Filesystem object */\n\tUINT part\t\t/* Partition to fined = 0:find as SFD and partitions, >0:forced partition number */\n)\n{\n\tUINT fmt, i;\n\tDWORD mbr_pt[4];\n\n\n\tfmt = check_fs(fs, 0);\t\t\t\t/* Load sector 0 and check if it is an FAT VBR as SFD format */\n\tif (fmt != 2 && (fmt >= 3 || part == 0)) return fmt;\t/* Returns if it is an FAT VBR as auto scan, not a BS or disk error */\n\n\t/* Sector 0 is not an FAT VBR or forced partition number wants a partition */\n\n#if FF_LBA64\n\tif (fs->win[MBR_Table + PTE_System] == 0xEE) {\t/* GPT protective MBR? */\n\t\tDWORD n_ent, v_ent, ofs;\n\t\tQWORD pt_lba;\n\n\t\tif (move_window(fs, 1) != FR_OK) return 4;\t/* Load GPT header sector (next to MBR) */\n\t\tif (!test_gpt_header(fs->win)) return 3;\t/* Check if GPT header is valid */\n\t\tn_ent = ld_dword(fs->win + GPTH_PtNum);\t\t/* Number of entries */\n\t\tpt_lba = ld_qword(fs->win + GPTH_PtOfs);\t/* Table location */\n\t\tfor (v_ent = i = 0; i < n_ent; i++) {\t\t/* Find FAT partition */\n\t\t\tif (move_window(fs, pt_lba + i * SZ_GPTE / SS(fs)) != FR_OK) return 4;\t/* PT sector */\n\t\t\tofs = i * SZ_GPTE % SS(fs);\t\t\t\t\t\t\t\t\t\t\t\t/* Offset in the sector */\n\t\t\tif (!memcmp(fs->win + ofs + GPTE_PtGuid, GUID_MS_Basic, 16)) {\t/* MS basic data partition? */\n\t\t\t\tv_ent++;\n\t\t\t\tfmt = check_fs(fs, ld_qword(fs->win + ofs + GPTE_FstLba));\t/* Load VBR and check status */\n\t\t\t\tif (part == 0 && fmt <= 1) return fmt;\t\t\t/* Auto search (valid FAT volume found first) */\n\t\t\t\tif (part != 0 && v_ent == part) return fmt;\t\t/* Forced partition order (regardless of it is valid or not) */\n\t\t\t}\n\t\t}\n\t\treturn 3;\t/* Not found */\n\t}\n#endif\n\tif (FF_MULTI_PARTITION && part > 4) return 3;\t/* MBR has 4 partitions max */\n\tfor (i = 0; i < 4; i++) {\t\t/* Load partition offset in the MBR */\n\t\tmbr_pt[i] = ld_dword(fs->win + MBR_Table + i * SZ_PTE + PTE_StLba);\n\t}\n\ti = part ? part - 1 : 0;\t\t/* Table index to find first */\n\tdo {\t\t\t\t\t\t\t/* Find an FAT volume */\n\t\tfmt = mbr_pt[i] ? check_fs(fs, mbr_pt[i]) : 3;\t/* Check if the partition is FAT */\n\t} while (part == 0 && fmt >= 2 && ++i < 4);\n\treturn fmt;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Determine logical drive number and mount the volume if needed         */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT mount_volume (\t/* FR_OK(0): successful, !=0: an error occurred */\n\tconst TCHAR** path,\t\t\t/* Pointer to pointer to the path name (drive number) */\n\tFATFS** rfs,\t\t\t\t/* Pointer to pointer to the found filesystem object */\n\tBYTE mode\t\t\t\t\t/* Desiered access mode to check write protection */\n)\n{\n\tint vol;\n\tFATFS *fs;\n\tDSTATUS stat;\n\tLBA_t bsect;\n\tDWORD tsect, sysect, fasize, nclst, szbfat;\n\tWORD nrsv;\n\tUINT fmt;\n\n\n\t/* Get logical drive number */\n\t*rfs = 0;\n\tvol = get_ldnumber(path);\n\tif (vol < 0) return FR_INVALID_DRIVE;\n\n\t/* Check if the filesystem object is valid or not */\n\tfs = FatFs[vol];\t\t\t\t\t/* Get pointer to the filesystem object */\n\tif (!fs) return FR_NOT_ENABLED;\t\t/* Is the filesystem object available? */\n#if FF_FS_REENTRANT\n\tif (!lock_volume(fs, 1)) return FR_TIMEOUT;\t/* Lock the volume, and system if needed */\n#endif\n\t*rfs = fs;\t\t\t\t\t\t\t/* Return pointer to the filesystem object */\n\n\tmode &= (BYTE)~FA_READ;\t\t\t\t/* Desired access mode, write access or not */\n\tif (fs->fs_type != 0) {\t\t\t\t/* If the volume has been mounted */\n\t\tstat = disk_status(fs->pdrv);\n\t\tif (!(stat & STA_NOINIT)) {\t\t/* and the physical drive is kept initialized */\n\t\t\tif (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) {\t/* Check write protection if needed */\n\t\t\t\treturn FR_WRITE_PROTECTED;\n\t\t\t}\n\t\t\treturn FR_OK;\t\t\t\t/* The filesystem object is already valid */\n\t\t}\n\t}\n\n\t/* The filesystem object is not valid. */\n\t/* Following code attempts to mount the volume. (find an FAT volume, analyze the BPB and initialize the filesystem object) */\n\n\tfs->fs_type = 0;\t\t\t\t\t/* Invalidate the filesystem object */\n\tstat = disk_initialize(fs->pdrv);\t/* Initialize the volume hosting physical drive */\n\tif (stat & STA_NOINIT) { \t\t\t/* Check if the initialization succeeded */\n\t\treturn FR_NOT_READY;\t\t\t/* Failed to initialize due to no medium or hard error */\n\t}\n\tif (!FF_FS_READONLY && mode && (stat & STA_PROTECT)) { /* Check disk write protection if needed */\n\t\treturn FR_WRITE_PROTECTED;\n\t}\n#if FF_MAX_SS != FF_MIN_SS\t\t\t\t/* Get sector size (multiple sector size cfg only) */\n\tif (disk_ioctl(fs->pdrv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK) return FR_DISK_ERR;\n\tif (SS(fs) > FF_MAX_SS || SS(fs) < FF_MIN_SS || (SS(fs) & (SS(fs) - 1))) return FR_DISK_ERR;\n#endif\n\n\t/* Find an FAT volume on the hosting drive */\n\tfmt = find_volume(fs, LD2PT(vol));\n\tif (fmt == 4) return FR_DISK_ERR;\t\t/* An error occurred in the disk I/O layer */\n\tif (fmt >= 2) return FR_NO_FILESYSTEM;\t/* No FAT volume is found */\n\tbsect = fs->winsect;\t\t\t\t\t/* Volume offset in the hosting physical drive */\n\n\t/* An FAT volume is found (bsect). Following code initializes the filesystem object */\n\n#if FF_FS_EXFAT\n\tif (fmt == 1) {\n\t\tQWORD maxlba;\n\t\tDWORD so, cv, bcl, i;\n\n\t\tfor (i = BPB_ZeroedEx; i < BPB_ZeroedEx + 53 && fs->win[i] == 0; i++) ;\t/* Check zero filler */\n\t\tif (i < BPB_ZeroedEx + 53) return FR_NO_FILESYSTEM;\n\n\t\tif (ld_word(fs->win + BPB_FSVerEx) != 0x100) return FR_NO_FILESYSTEM;\t/* Check exFAT version (must be version 1.0) */\n\n\t\tif (1 << fs->win[BPB_BytsPerSecEx] != SS(fs)) {\t/* (BPB_BytsPerSecEx must be equal to the physical sector size) */\n\t\t\treturn FR_NO_FILESYSTEM;\n\t\t}\n\n\t\tmaxlba = ld_qword(fs->win + BPB_TotSecEx) + bsect;\t/* Last LBA of the volume + 1 */\n\t\tif (!FF_LBA64 && maxlba >= 0x100000000) return FR_NO_FILESYSTEM;\t/* (It cannot be accessed in 32-bit LBA) */\n\n\t\tfs->fsize = ld_dword(fs->win + BPB_FatSzEx);\t/* Number of sectors per FAT */\n\n\t\tfs->n_fats = fs->win[BPB_NumFATsEx];\t\t\t/* Number of FATs */\n\t\tif (fs->n_fats != 1) return FR_NO_FILESYSTEM;\t/* (Supports only 1 FAT) */\n\n\t\tfs->csize = 1 << fs->win[BPB_SecPerClusEx];\t\t/* Cluster size */\n\t\tif (fs->csize == 0)\treturn FR_NO_FILESYSTEM;\t/* (Must be 1..32768 sectors) */\n\n\t\tnclst = ld_dword(fs->win + BPB_NumClusEx);\t\t/* Number of clusters */\n\t\tif (nclst > MAX_EXFAT) return FR_NO_FILESYSTEM;\t/* (Too many clusters) */\n\t\tfs->n_fatent = nclst + 2;\n\n\t\t/* Boundaries and Limits */\n\t\tfs->volbase = bsect;\n\t\tfs->database = bsect + ld_dword(fs->win + BPB_DataOfsEx);\n\t\tfs->fatbase = bsect + ld_dword(fs->win + BPB_FatOfsEx);\n\t\tif (maxlba < (QWORD)fs->database + nclst * fs->csize) return FR_NO_FILESYSTEM;\t/* (Volume size must not be smaller than the size required) */\n\t\tfs->dirbase = ld_dword(fs->win + BPB_RootClusEx);\n\n\t\t/* Get bitmap location and check if it is contiguous (implementation assumption) */\n\t\tso = i = 0;\n\t\tfor (;;) {\t/* Find the bitmap entry in the root directory (in only first cluster) */\n\t\t\tif (i == 0) {\n\t\t\t\tif (so >= fs->csize) return FR_NO_FILESYSTEM;\t/* Not found? */\n\t\t\t\tif (move_window(fs, clst2sect(fs, (DWORD)fs->dirbase) + so) != FR_OK) return FR_DISK_ERR;\n\t\t\t\tso++;\n\t\t\t}\n\t\t\tif (fs->win[i] == ET_BITMAP) break;\t\t\t/* Is it a bitmap entry? */\n\t\t\ti = (i + SZDIRE) % SS(fs);\t/* Next entry */\n\t\t}\n\t\tbcl = ld_dword(fs->win + i + 20);\t\t\t\t/* Bitmap cluster */\n\t\tif (bcl < 2 || bcl >= fs->n_fatent) return FR_NO_FILESYSTEM;\t/* (Wrong cluster#) */\n\t\tfs->bitbase = fs->database + fs->csize * (bcl - 2);\t/* Bitmap sector */\n\t\tfor (;;) {\t/* Check if bitmap is contiguous */\n\t\t\tif (move_window(fs, fs->fatbase + bcl / (SS(fs) / 4)) != FR_OK) return FR_DISK_ERR;\n\t\t\tcv = ld_dword(fs->win + bcl % (SS(fs) / 4) * 4);\n\t\t\tif (cv == 0xFFFFFFFF) break;\t\t\t\t/* Last link? */\n\t\t\tif (cv != ++bcl) return FR_NO_FILESYSTEM;\t/* Fragmented bitmap? */\n\t\t}\n\n#if !FF_FS_READONLY\n\t\tfs->last_clst = fs->free_clst = 0xFFFFFFFF;\t\t/* Initialize cluster allocation information */\n#endif\n\t\tfmt = FS_EXFAT;\t\t\t/* FAT sub-type */\n\t} else\n#endif\t/* FF_FS_EXFAT */\n\t{\n\t\tif (ld_word(fs->win + BPB_BytsPerSec) != SS(fs)) return FR_NO_FILESYSTEM;\t/* (BPB_BytsPerSec must be equal to the physical sector size) */\n\n\t\tfasize = ld_word(fs->win + BPB_FATSz16);\t\t/* Number of sectors per FAT */\n\t\tif (fasize == 0) fasize = ld_dword(fs->win + BPB_FATSz32);\n\t\tfs->fsize = fasize;\n\n\t\tfs->n_fats = fs->win[BPB_NumFATs];\t\t\t\t/* Number of FATs */\n\t\tif (fs->n_fats != 1 && fs->n_fats != 2) return FR_NO_FILESYSTEM;\t/* (Must be 1 or 2) */\n\t\tfasize *= fs->n_fats;\t\t\t\t\t\t\t/* Number of sectors for FAT area */\n\n\t\tfs->csize = fs->win[BPB_SecPerClus];\t\t\t/* Cluster size */\n\t\tif (fs->csize == 0 || (fs->csize & (fs->csize - 1))) return FR_NO_FILESYSTEM;\t/* (Must be power of 2) */\n\n\t\tfs->n_rootdir = ld_word(fs->win + BPB_RootEntCnt);\t/* Number of root directory entries */\n\t\tif (fs->n_rootdir % (SS(fs) / SZDIRE)) return FR_NO_FILESYSTEM;\t/* (Must be sector aligned) */\n\n\t\ttsect = ld_word(fs->win + BPB_TotSec16);\t\t/* Number of sectors on the volume */\n\t\tif (tsect == 0) tsect = ld_dword(fs->win + BPB_TotSec32);\n\n\t\tnrsv = ld_word(fs->win + BPB_RsvdSecCnt);\t\t/* Number of reserved sectors */\n\t\tif (nrsv == 0) return FR_NO_FILESYSTEM;\t\t\t/* (Must not be 0) */\n\n\t\t/* Determine the FAT sub type */\n\t\tsysect = nrsv + fasize + fs->n_rootdir / (SS(fs) / SZDIRE);\t/* RSV + FAT + DIR */\n\t\tif (tsect < sysect) return FR_NO_FILESYSTEM;\t/* (Invalid volume size) */\n\t\tnclst = (tsect - sysect) / fs->csize;\t\t\t/* Number of clusters */\n\t\tif (nclst == 0) return FR_NO_FILESYSTEM;\t\t/* (Invalid volume size) */\n\t\tfmt = 0;\n\t\tif (nclst <= MAX_FAT32) fmt = FS_FAT32;\n\t\tif (nclst <= MAX_FAT16) fmt = FS_FAT16;\n\t\tif (nclst <= MAX_FAT12) fmt = FS_FAT12;\n\t\tif (fmt == 0) return FR_NO_FILESYSTEM;\n\n\t\t/* Boundaries and Limits */\n\t\tfs->n_fatent = nclst + 2;\t\t\t\t\t\t/* Number of FAT entries */\n\t\tfs->volbase = bsect;\t\t\t\t\t\t\t/* Volume start sector */\n\t\tfs->fatbase = bsect + nrsv; \t\t\t\t\t/* FAT start sector */\n\t\tfs->database = bsect + sysect;\t\t\t\t\t/* Data start sector */\n\t\tif (fmt == FS_FAT32) {\n\t\t\tif (ld_word(fs->win + BPB_FSVer32) != 0) return FR_NO_FILESYSTEM;\t/* (Must be FAT32 revision 0.0) */\n\t\t\tif (fs->n_rootdir != 0) return FR_NO_FILESYSTEM;\t/* (BPB_RootEntCnt must be 0) */\n\t\t\tfs->dirbase = ld_dword(fs->win + BPB_RootClus32);\t/* Root directory start cluster */\n\t\t\tszbfat = fs->n_fatent * 4;\t\t\t\t\t/* (Needed FAT size) */\n\t\t} else {\n\t\t\tif (fs->n_rootdir == 0)\treturn FR_NO_FILESYSTEM;\t/* (BPB_RootEntCnt must not be 0) */\n\t\t\tfs->dirbase = fs->fatbase + fasize;\t\t\t/* Root directory start sector */\n\t\t\tszbfat = (fmt == FS_FAT16) ?\t\t\t\t/* (Needed FAT size) */\n\t\t\t\tfs->n_fatent * 2 : fs->n_fatent * 3 / 2 + (fs->n_fatent & 1);\n\t\t}\n\t\tif (fs->fsize < (szbfat + (SS(fs) - 1)) / SS(fs)) return FR_NO_FILESYSTEM;\t/* (BPB_FATSz must not be less than the size needed) */\n\n#if !FF_FS_READONLY\n\t\t/* Get FSInfo if available */\n\t\tfs->last_clst = fs->free_clst = 0xFFFFFFFF;\t\t/* Initialize cluster allocation information */\n\t\tfs->fsi_flag = 0x80;\n#if (FF_FS_NOFSINFO & 3) != 3\n\t\tif (fmt == FS_FAT32\t\t\t\t/* Allow to update FSInfo only if BPB_FSInfo32 == 1 */\n\t\t\t&& ld_word(fs->win + BPB_FSInfo32) == 1\n\t\t\t&& move_window(fs, bsect + 1) == FR_OK)\n\t\t{\n\t\t\tfs->fsi_flag = 0;\n\t\t\tif (ld_word(fs->win + BS_55AA) == 0xAA55\t/* Load FSInfo data if available */\n\t\t\t\t&& ld_dword(fs->win + FSI_LeadSig) == 0x41615252\n\t\t\t\t&& ld_dword(fs->win + FSI_StrucSig) == 0x61417272)\n\t\t\t{\n#if (FF_FS_NOFSINFO & 1) == 0\n\t\t\t\tfs->free_clst = ld_dword(fs->win + FSI_Free_Count);\n#endif\n#if (FF_FS_NOFSINFO & 2) == 0\n\t\t\t\tfs->last_clst = ld_dword(fs->win + FSI_Nxt_Free);\n#endif\n\t\t\t}\n\t\t}\n#endif\t/* (FF_FS_NOFSINFO & 3) != 3 */\n#endif\t/* !FF_FS_READONLY */\n\t}\n\n\tfs->fs_type = (BYTE)fmt;/* FAT sub-type (the filesystem object gets valid) */\n\tfs->id = ++Fsid;\t\t/* Volume mount ID */\n#if FF_USE_LFN == 1\n\tfs->lfnbuf = LfnBuf;\t/* Static LFN working buffer */\n#if FF_FS_EXFAT\n\tfs->dirbuf = DirBuf;\t/* Static directory block scratchpad buuffer */\n#endif\n#endif\n#if FF_FS_RPATH != 0\n\tfs->cdir = 0;\t\t\t/* Initialize current directory */\n#endif\n#if FF_FS_LOCK\t\t\t\t/* Clear file lock semaphores */\n\tclear_share(fs);\n#endif\n\treturn FR_OK;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Check if the file/directory object is valid or not                    */\n/*-----------------------------------------------------------------------*/\n\nstatic FRESULT validate (\t/* Returns FR_OK or FR_INVALID_OBJECT */\n\tFFOBJID* obj,\t\t\t/* Pointer to the FFOBJID, the 1st member in the FIL/DIR structure, to check validity */\n\tFATFS** rfs\t\t\t\t/* Pointer to pointer to the owner filesystem object to return */\n)\n{\n\tFRESULT res = FR_INVALID_OBJECT;\n\n\n\tif (obj && obj->fs && obj->fs->fs_type && obj->id == obj->fs->id) {\t/* Test if the object is valid */\n#if FF_FS_REENTRANT\n\t\tif (lock_volume(obj->fs, 0)) {\t/* Take a grant to access the volume */\n\t\t\tif (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the hosting phsical drive is kept initialized */\n\t\t\t\tres = FR_OK;\n\t\t\t} else {\n\t\t\t\tunlock_volume(obj->fs, FR_OK);\t/* Invalidated volume, abort to access */\n\t\t\t}\n\t\t} else {\t/* Could not take */\n\t\t\tres = FR_TIMEOUT;\n\t\t}\n#else\n\t\tif (!(disk_status(obj->fs->pdrv) & STA_NOINIT)) { /* Test if the hosting phsical drive is kept initialized */\n\t\t\tres = FR_OK;\n\t\t}\n#endif\n\t}\n\t*rfs = (res == FR_OK) ? obj->fs : 0;\t/* Return corresponding filesystem object if it is valid */\n\treturn res;\n}\n\n\n\n\n/*---------------------------------------------------------------------------\n\n   Public Functions (FatFs API)\n\n----------------------------------------------------------------------------*/\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Mount/Unmount a Logical Drive                                         */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_mount (\n\tFATFS* fs,\t\t\t/* Pointer to the filesystem object to be registered (NULL:unmount)*/\n\tconst TCHAR* path,\t/* Logical drive number to be mounted/unmounted */\n\tBYTE opt\t\t\t/* Mount option: 0=Do not mount (delayed mount), 1=Mount immediately */\n)\n{\n\tFATFS *cfs;\n\tint vol;\n\tFRESULT res;\n\tconst TCHAR *rp = path;\n\n\n\t/* Get volume ID (logical drive number) */\n\tvol = get_ldnumber(&rp);\n\tif (vol < 0) return FR_INVALID_DRIVE;\n\tcfs = FatFs[vol];\t\t\t/* Pointer to the filesystem object of the volume */\n\n\tif (cfs) {\t\t\t\t\t/* Unregister current filesystem object if regsitered */\n\t\tFatFs[vol] = 0;\n#if FF_FS_LOCK\n\t\tclear_share(cfs);\n#endif\n#if FF_FS_REENTRANT\t\t\t\t/* Discard mutex of the current volume */\n\t\tff_mutex_delete(vol);\n#endif\n\t\tcfs->fs_type = 0;\t\t/* Invalidate the filesystem object to be unregistered */\n\t}\n\n\tif (fs) {\t\t\t\t\t/* Register new filesystem object */\n\t\tfs->pdrv = LD2PD(vol);\t/* Volume hosting physical drive */\n#if FF_FS_REENTRANT\t\t\t\t/* Create a volume mutex */\n\t\tfs->ldrv = (BYTE)vol;\t/* Owner volume ID */\n\t\tif (!ff_mutex_create(vol)) return FR_INT_ERR;\n#if FF_FS_LOCK\n\t\tif (SysLock == 0) {\t\t/* Create a system mutex if needed */\n\t\t\tif (!ff_mutex_create(FF_VOLUMES)) {\n\t\t\t\tff_mutex_delete(vol);\n\t\t\t\treturn FR_INT_ERR;\n\t\t\t}\n\t\t\tSysLock = 1;\t\t/* System mutex is ready */\n\t\t}\n#endif\n#endif\n\t\tfs->fs_type = 0;\t\t/* Invalidate the new filesystem object */\n\t\tFatFs[vol] = fs;\t\t/* Register new fs object */\n\t}\n\n\tif (opt == 0) return FR_OK;\t/* Do not mount now, it will be mounted in subsequent file functions */\n\n\tres = mount_volume(&path, &fs, 0);\t/* Force mounted the volume */\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Open or Create a File                                                 */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_open (\n\tFIL* fp,\t\t\t/* Pointer to the blank file object */\n\tconst TCHAR* path,\t/* Pointer to the file name */\n\tBYTE mode\t\t\t/* Access mode and open mode flags */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n#if !FF_FS_READONLY\n\tDWORD cl, bcs, clst, tm;\n\tLBA_t sc;\n\tFSIZE_t ofs;\n#endif\n\tDEF_NAMBUF\n\n\n\tif (!fp) return FR_INVALID_OBJECT;\n\n\t/* Get logical drive number */\n\tmode &= FF_FS_READONLY ? FA_READ : FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_CREATE_NEW | FA_OPEN_ALWAYS | FA_OPEN_APPEND;\n\tres = mount_volume(&path, &fs, mode);\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t/* Follow the file path */\n#if !FF_FS_READONLY\t/* Read/Write configuration */\n\t\tif (res == FR_OK) {\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\t/* Origin directory itself? */\n\t\t\t\tres = FR_INVALID_NAME;\n\t\t\t}\n#if FF_FS_LOCK\n\t\t\telse {\n\t\t\t\tres = chk_share(&dj, (mode & ~FA_READ) ? 1 : 0);\t/* Check if the file can be used */\n\t\t\t}\n#endif\n\t\t}\n\t\t/* Create or Open a file */\n\t\tif (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) {\n\t\t\tif (res != FR_OK) {\t\t\t\t\t/* No file, create new */\n\t\t\t\tif (res == FR_NO_FILE) {\t\t/* There is no file to open, create a new entry */\n#if FF_FS_LOCK\n\t\t\t\t\tres = enq_share() ? dir_register(&dj) : FR_TOO_MANY_OPEN_FILES;\n#else\n\t\t\t\t\tres = dir_register(&dj);\n#endif\n\t\t\t\t}\n\t\t\t\tmode |= FA_CREATE_ALWAYS;\t\t/* File is created */\n\t\t\t}\n\t\t\telse {\t\t\t\t\t\t\t\t/* Any object with the same name is already existing */\n\t\t\t\tif (dj.obj.attr & (AM_RDO | AM_DIR)) {\t/* Cannot overwrite it (R/O or DIR) */\n\t\t\t\t\tres = FR_DENIED;\n\t\t\t\t} else {\n\t\t\t\t\tif (mode & FA_CREATE_NEW) res = FR_EXIST;\t/* Cannot create as new file */\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK && (mode & FA_CREATE_ALWAYS)) {\t/* Truncate the file if overwrite mode */\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t/* Get current allocation info */\n\t\t\t\t\tfp->obj.fs = fs;\n\t\t\t\t\tinit_alloc_info(fs, &fp->obj);\n\t\t\t\t\t/* Set directory entry block initial state */\n\t\t\t\t\tmemset(fs->dirbuf + 2, 0, 30);\t/* Clear 85 entry except for NumSec */\n\t\t\t\t\tmemset(fs->dirbuf + 38, 0, 26);\t/* Clear C0 entry except for NumName and NameHash */\n\t\t\t\t\tfs->dirbuf[XDIR_Attr] = AM_ARC;\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_CrtTime, GET_FATTIME());\n\t\t\t\t\tfs->dirbuf[XDIR_GenFlags] = 1;\n\t\t\t\t\tres = store_xdir(&dj);\n\t\t\t\t\tif (res == FR_OK && fp->obj.sclust != 0) {\t/* Remove the cluster chain if exist */\n\t\t\t\t\t\tres = remove_chain(&fp->obj, fp->obj.sclust, 0);\n\t\t\t\t\t\tfs->last_clst = fp->obj.sclust - 1;\t\t/* Reuse the cluster hole */\n\t\t\t\t\t}\n\t\t\t\t} else\n#endif\n\t\t\t\t{\n\t\t\t\t\t/* Set directory entry initial state */\n\t\t\t\t\ttm = GET_FATTIME();\t\t\t\t\t/* Set created time */\n\t\t\t\t\tst_dword(dj.dir + DIR_CrtTime, tm);\n\t\t\t\t\tst_dword(dj.dir + DIR_ModTime, tm);\n\t\t\t\t\tcl = ld_clust(fs, dj.dir);\t\t\t/* Get current cluster chain */\n\t\t\t\t\tdj.dir[DIR_Attr] = AM_ARC;\t\t\t/* Reset attribute */\n\t\t\t\t\tst_clust(fs, dj.dir, 0);\t\t\t/* Reset file allocation info */\n\t\t\t\t\tst_dword(dj.dir + DIR_FileSize, 0);\n\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\tif (cl != 0) {\t\t\t\t\t\t/* Remove the cluster chain if exist */\n\t\t\t\t\t\tsc = fs->winsect;\n\t\t\t\t\t\tres = remove_chain(&dj.obj, cl, 0);\n\t\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\t\tres = move_window(fs, sc);\n\t\t\t\t\t\t\tfs->last_clst = cl - 1;\t\t/* Reuse the cluster hole */\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\t/* Open an existing file */\n\t\t\tif (res == FR_OK) {\t\t\t\t\t/* Is the object exsiting? */\n\t\t\t\tif (dj.obj.attr & AM_DIR) {\t\t/* File open against a directory */\n\t\t\t\t\tres = FR_NO_FILE;\n\t\t\t\t} else {\n\t\t\t\t\tif ((mode & FA_WRITE) && (dj.obj.attr & AM_RDO)) { /* Write mode open against R/O file */\n\t\t\t\t\t\tres = FR_DENIED;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (res == FR_OK) {\n\t\t\tif (mode & FA_CREATE_ALWAYS) mode |= FA_MODIFIED;\t/* Set file change flag if created or overwritten */\n\t\t\tfp->dir_sect = fs->winsect;\t\t\t/* Pointer to the directory entry */\n\t\t\tfp->dir_ptr = dj.dir;\n#if FF_FS_LOCK\n\t\t\tfp->obj.lockid = inc_share(&dj, (mode & ~FA_READ) ? 1 : 0);\t/* Lock the file for this session */\n\t\t\tif (fp->obj.lockid == 0) res = FR_INT_ERR;\n#endif\n\t\t}\n#else\t\t/* R/O configuration */\n\t\tif (res == FR_OK) {\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\t/* Is it origin directory itself? */\n\t\t\t\tres = FR_INVALID_NAME;\n\t\t\t} else {\n\t\t\t\tif (dj.obj.attr & AM_DIR) {\t\t/* Is it a directory? */\n\t\t\t\t\tres = FR_NO_FILE;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n#endif\n\n\t\tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tfp->obj.c_scl = dj.obj.sclust;\t\t\t\t\t\t\t/* Get containing directory info */\n\t\t\t\tfp->obj.c_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat;\n\t\t\t\tfp->obj.c_ofs = dj.blk_ofs;\n\t\t\t\tinit_alloc_info(fs, &fp->obj);\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tfp->obj.sclust = ld_clust(fs, dj.dir);\t\t\t\t\t/* Get object allocation info */\n\t\t\t\tfp->obj.objsize = ld_dword(dj.dir + DIR_FileSize);\n\t\t\t}\n#if FF_USE_FASTSEEK\n\t\t\tfp->cltbl = 0;\t\t/* Disable fast seek mode */\n#endif\n\t\t\tfp->obj.fs = fs;\t/* Validate the file object */\n\t\t\tfp->obj.id = fs->id;\n\t\t\tfp->flag = mode;\t/* Set file access mode */\n\t\t\tfp->err = 0;\t\t/* Clear error flag */\n\t\t\tfp->sect = 0;\t\t/* Invalidate current data sector */\n\t\t\tfp->fptr = 0;\t\t/* Set file pointer top of the file */\n#if !FF_FS_READONLY\n#if !FF_FS_TINY\n\t\t\tmemset(fp->buf, 0, sizeof fp->buf);\t/* Clear sector buffer */\n#endif\n\t\t\tif ((mode & FA_SEEKEND) && fp->obj.objsize > 0) {\t/* Seek to end of file if FA_OPEN_APPEND is specified */\n\t\t\t\tfp->fptr = fp->obj.objsize;\t\t\t/* Offset to seek */\n\t\t\t\tbcs = (DWORD)fs->csize * SS(fs);\t/* Cluster size in byte */\n\t\t\t\tclst = fp->obj.sclust;\t\t\t\t/* Follow the cluster chain */\n\t\t\t\tfor (ofs = fp->obj.objsize; res == FR_OK && ofs > bcs; ofs -= bcs) {\n\t\t\t\t\tclst = get_fat(&fp->obj, clst);\n\t\t\t\t\tif (clst <= 1) res = FR_INT_ERR;\n\t\t\t\t\tif (clst == 0xFFFFFFFF) res = FR_DISK_ERR;\n\t\t\t\t}\n\t\t\t\tfp->clust = clst;\n\t\t\t\tif (res == FR_OK && ofs % SS(fs)) {\t/* Fill sector buffer if not on the sector boundary */\n\t\t\t\t\tsc = clst2sect(fs, clst);\n\t\t\t\t\tif (sc == 0) {\n\t\t\t\t\t\tres = FR_INT_ERR;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfp->sect = sc + (DWORD)(ofs / SS(fs));\n#if !FF_FS_TINY\n\t\t\t\t\t\tif (disk_read(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) res = FR_DISK_ERR;\n#endif\n\t\t\t\t\t}\n\t\t\t\t}\n#if FF_FS_LOCK\n\t\t\t\tif (res != FR_OK) dec_share(fp->obj.lockid); /* Decrement file open counter if seek failed */\n#endif\n\t\t\t}\n#endif\n\t\t}\n\n\t\tFREE_NAMBUF();\n\t}\n\n\tif (res != FR_OK) fp->obj.fs = 0;\t/* Invalidate file object on error */\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Read File                                                             */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_read (\n\tFIL* fp, \t/* Open file to be read */\n\tvoid* buff,\t/* Data buffer to store the read data */\n\tUINT btr,\t/* Number of bytes to read */\n\tUINT* br\t/* Number of bytes read */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD clst;\n\tLBA_t sect;\n\tFSIZE_t remain;\n\tUINT rcnt, cc, csect;\n\tBYTE *rbuff = (BYTE*)buff;\n\n\n\t*br = 0;\t/* Clear read byte counter */\n\tres = validate(&fp->obj, &fs);\t\t\t\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\t/* Check validity */\n\tif (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED); /* Check access mode */\n\tremain = fp->obj.objsize - fp->fptr;\n\tif (btr > remain) btr = (UINT)remain;\t\t/* Truncate btr by remaining bytes */\n\n\tfor ( ; btr > 0; btr -= rcnt, *br += rcnt, rbuff += rcnt, fp->fptr += rcnt) {\t/* Repeat until btr bytes read */\n\t\tif (fp->fptr % SS(fs) == 0) {\t\t\t/* On the sector boundary? */\n\t\t\tcsect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1));\t/* Sector offset in the cluster */\n\t\t\tif (csect == 0) {\t\t\t\t\t/* On the cluster boundary? */\n\t\t\t\tif (fp->fptr == 0) {\t\t\t/* On the top of the file? */\n\t\t\t\t\tclst = fp->obj.sclust;\t\t/* Follow cluster chain from the origin */\n\t\t\t\t} else {\t\t\t\t\t\t/* Middle or end of the file */\n#if FF_USE_FASTSEEK\n\t\t\t\t\tif (fp->cltbl) {\n\t\t\t\t\t\tclst = clmt_clust(fp, fp->fptr);\t/* Get cluster# from the CLMT */\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tclst = get_fat(&fp->obj, fp->clust);\t/* Follow cluster chain on the FAT */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (clst < 2) ABORT(fs, FR_INT_ERR);\n\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->clust = clst;\t\t\t\t/* Update current cluster */\n\t\t\t}\n\t\t\tsect = clst2sect(fs, fp->clust);\t/* Get current sector */\n\t\t\tif (sect == 0) ABORT(fs, FR_INT_ERR);\n\t\t\tsect += csect;\n\t\t\tcc = btr / SS(fs);\t\t\t\t\t/* When remaining bytes >= sector size, */\n\t\t\tif (cc > 0) {\t\t\t\t\t\t/* Read maximum contiguous sectors directly */\n\t\t\t\tif (csect + cc > fs->csize) {\t/* Clip at cluster boundary */\n\t\t\t\t\tcc = fs->csize - csect;\n\t\t\t\t}\n\t\t\t\tif (disk_read(fs->pdrv, rbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR);\n#if !FF_FS_READONLY && FF_FS_MINIMIZE <= 2\t\t/* Replace one of the read sectors with cached data if it contains a dirty sector */\n#if FF_FS_TINY\n\t\t\t\tif (fs->wflag && fs->winsect - sect < cc) {\n\t\t\t\t\tmemcpy(rbuff + ((fs->winsect - sect) * SS(fs)), fs->win, SS(fs));\n\t\t\t\t}\n#else\n\t\t\t\tif ((fp->flag & FA_DIRTY) && fp->sect - sect < cc) {\n\t\t\t\t\tmemcpy(rbuff + ((fp->sect - sect) * SS(fs)), fp->buf, SS(fs));\n\t\t\t\t}\n#endif\n#endif\n\t\t\t\trcnt = SS(fs) * cc;\t\t\t\t/* Number of bytes transferred */\n\t\t\t\tcontinue;\n\t\t\t}\n#if !FF_FS_TINY\n\t\t\tif (fp->sect != sect) {\t\t\t/* Load data sector if not in cache */\n#if !FF_FS_READONLY\n\t\t\t\tif (fp->flag & FA_DIRTY) {\t\t/* Write-back dirty sector cache */\n\t\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t\t}\n#endif\n\t\t\t\tif (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\t/* Fill sector cache */\n\t\t\t}\n#endif\n\t\t\tfp->sect = sect;\n\t\t}\n\t\trcnt = SS(fs) - (UINT)fp->fptr % SS(fs);\t/* Number of bytes remains in the sector */\n\t\tif (rcnt > btr) rcnt = btr;\t\t\t\t\t/* Clip it by btr if needed */\n#if FF_FS_TINY\n\t\tif (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR);\t/* Move sector window */\n\t\tmemcpy(rbuff, fs->win + fp->fptr % SS(fs), rcnt);\t/* Extract partial sector */\n#else\n\t\tmemcpy(rbuff, fp->buf + fp->fptr % SS(fs), rcnt);\t/* Extract partial sector */\n#endif\n\t}\n\n\tLEAVE_FF(fs, FR_OK);\n}\n\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Write File                                                            */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_write (\n\tFIL* fp,\t\t\t/* Open file to be written */\n\tconst void* buff,\t/* Data to be written */\n\tUINT btw,\t\t\t/* Number of bytes to write */\n\tUINT* bw\t\t\t/* Number of bytes written */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD clst;\n\tLBA_t sect;\n\tUINT wcnt, cc, csect;\n\tconst BYTE *wbuff = (const BYTE*)buff;\n\n\n\t*bw = 0;\t/* Clear write byte counter */\n\tres = validate(&fp->obj, &fs);\t\t\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\t/* Check validity */\n\tif (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED);\t/* Check access mode */\n\n\t/* Check fptr wrap-around (file size cannot reach 4 GiB at FAT volume) */\n\tif ((!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) && (DWORD)(fp->fptr + btw) < (DWORD)fp->fptr) {\n\t\tbtw = (UINT)(0xFFFFFFFF - (DWORD)fp->fptr);\n\t}\n\n\tfor ( ; btw > 0; btw -= wcnt, *bw += wcnt, wbuff += wcnt, fp->fptr += wcnt, fp->obj.objsize = (fp->fptr > fp->obj.objsize) ? fp->fptr : fp->obj.objsize) {\t/* Repeat until all data written */\n\t\tif (fp->fptr % SS(fs) == 0) {\t\t/* On the sector boundary? */\n\t\t\tcsect = (UINT)(fp->fptr / SS(fs)) & (fs->csize - 1);\t/* Sector offset in the cluster */\n\t\t\tif (csect == 0) {\t\t\t\t/* On the cluster boundary? */\n\t\t\t\tif (fp->fptr == 0) {\t\t/* On the top of the file? */\n\t\t\t\t\tclst = fp->obj.sclust;\t/* Follow from the origin */\n\t\t\t\t\tif (clst == 0) {\t\t/* If no cluster is allocated, */\n\t\t\t\t\t\tclst = create_chain(&fp->obj, 0);\t/* create a new cluster chain */\n\t\t\t\t\t}\n\t\t\t\t} else {\t\t\t\t\t/* On the middle or end of the file */\n#if FF_USE_FASTSEEK\n\t\t\t\t\tif (fp->cltbl) {\n\t\t\t\t\t\tclst = clmt_clust(fp, fp->fptr);\t/* Get cluster# from the CLMT */\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tclst = create_chain(&fp->obj, fp->clust);\t/* Follow or stretch cluster chain on the FAT */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (clst == 0) break;\t\t/* Could not allocate a new cluster (disk full) */\n\t\t\t\tif (clst == 1) ABORT(fs, FR_INT_ERR);\n\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->clust = clst;\t\t\t/* Update current cluster */\n\t\t\t\tif (fp->obj.sclust == 0) fp->obj.sclust = clst;\t/* Set start cluster if the first write */\n\t\t\t}\n#if FF_FS_TINY\n\t\t\tif (fs->winsect == fp->sect && sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR);\t/* Write-back sector cache */\n#else\n\t\t\tif (fp->flag & FA_DIRTY) {\t\t/* Write-back sector cache */\n\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n#endif\n\t\t\tsect = clst2sect(fs, fp->clust);\t/* Get current sector */\n\t\t\tif (sect == 0) ABORT(fs, FR_INT_ERR);\n\t\t\tsect += csect;\n\t\t\tcc = btw / SS(fs);\t\t\t\t/* When remaining bytes >= sector size, */\n\t\t\tif (cc > 0) {\t\t\t\t\t/* Write maximum contiguous sectors directly */\n\t\t\t\tif (csect + cc > fs->csize) {\t/* Clip at cluster boundary */\n\t\t\t\t\tcc = fs->csize - csect;\n\t\t\t\t}\n\t\t\t\tif (disk_write(fs->pdrv, wbuff, sect, cc) != RES_OK) ABORT(fs, FR_DISK_ERR);\n#if FF_FS_MINIMIZE <= 2\n#if FF_FS_TINY\n\t\t\t\tif (fs->winsect - sect < cc) {\t/* Refill sector cache if it gets invalidated by the direct write */\n\t\t\t\t\tmemcpy(fs->win, wbuff + ((fs->winsect - sect) * SS(fs)), SS(fs));\n\t\t\t\t\tfs->wflag = 0;\n\t\t\t\t}\n#else\n\t\t\t\tif (fp->sect - sect < cc) { /* Refill sector cache if it gets invalidated by the direct write */\n\t\t\t\t\tmemcpy(fp->buf, wbuff + ((fp->sect - sect) * SS(fs)), SS(fs));\n\t\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t\t}\n#endif\n#endif\n\t\t\t\twcnt = SS(fs) * cc;\t\t/* Number of bytes transferred */\n\t\t\t\tcontinue;\n\t\t\t}\n#if FF_FS_TINY\n\t\t\tif (fp->fptr >= fp->obj.objsize) {\t/* Avoid silly cache filling on the growing edge */\n\t\t\t\tif (sync_window(fs) != FR_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfs->winsect = sect;\n\t\t\t}\n#else\n\t\t\tif (fp->sect != sect && \t\t/* Fill sector cache with file data */\n\t\t\t\tfp->fptr < fp->obj.objsize &&\n\t\t\t\tdisk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) {\n\t\t\t\t\tABORT(fs, FR_DISK_ERR);\n\t\t\t}\n#endif\n\t\t\tfp->sect = sect;\n\t\t}\n\t\twcnt = SS(fs) - (UINT)fp->fptr % SS(fs);\t/* Number of bytes remains in the sector */\n\t\tif (wcnt > btw) wcnt = btw;\t\t\t\t\t/* Clip it by btw if needed */\n#if FF_FS_TINY\n\t\tif (move_window(fs, fp->sect) != FR_OK) ABORT(fs, FR_DISK_ERR);\t/* Move sector window */\n\t\tmemcpy(fs->win + fp->fptr % SS(fs), wbuff, wcnt);\t/* Fit data to the sector */\n\t\tfs->wflag = 1;\n#else\n\t\tmemcpy(fp->buf + fp->fptr % SS(fs), wbuff, wcnt);\t/* Fit data to the sector */\n\t\tfp->flag |= FA_DIRTY;\n#endif\n\t}\n\n\tfp->flag |= FA_MODIFIED;\t\t\t\t/* Set file change flag */\n\n\tLEAVE_FF(fs, FR_OK);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Synchronize the File                                                  */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_sync (\n\tFIL* fp\t\t/* Open file to be synced */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD tm;\n\tBYTE *dir;\n\n\n\tres = validate(&fp->obj, &fs);\t/* Check validity of the file object */\n\tif (res == FR_OK) {\n\t\tif (fp->flag & FA_MODIFIED) {\t/* Is there any change to the file? */\n#if !FF_FS_TINY\n\t\t\tif (fp->flag & FA_DIRTY) {\t/* Write-back cached data if needed */\n\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) LEAVE_FF(fs, FR_DISK_ERR);\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n#endif\n\t\t\t/* Update the directory entry */\n\t\t\ttm = GET_FATTIME();\t\t\t\t/* Modified time */\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tres = fill_first_frag(&fp->obj);\t/* Fill first fragment on the FAT if needed */\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tres = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF);\t/* Fill last fragment on the FAT if needed */\n\t\t\t\t}\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tDIR dj;\n\t\t\t\t\tDEF_NAMBUF\n\n\t\t\t\t\tINIT_NAMBUF(fs);\n\t\t\t\t\tres = load_obj_xdir(&dj, &fp->obj);\t/* Load directory entry block */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tfs->dirbuf[XDIR_Attr] |= AM_ARC;\t\t\t\t/* Set archive attribute to indicate that the file has been changed */\n\t\t\t\t\t\tfs->dirbuf[XDIR_GenFlags] = fp->obj.stat | 1;\t/* Update file allocation information */\n\t\t\t\t\t\tst_dword(fs->dirbuf + XDIR_FstClus, fp->obj.sclust);\t\t/* Update start cluster */\n\t\t\t\t\t\tst_qword(fs->dirbuf + XDIR_FileSize, fp->obj.objsize);\t\t/* Update file size */\n\t\t\t\t\t\tst_qword(fs->dirbuf + XDIR_ValidFileSize, fp->obj.objsize);\t/* (FatFs does not support Valid File Size feature) */\n\t\t\t\t\t\tst_dword(fs->dirbuf + XDIR_ModTime, tm);\t\t/* Update modified time */\n\t\t\t\t\t\tfs->dirbuf[XDIR_ModTime10] = 0;\n\t\t\t\t\t\tst_dword(fs->dirbuf + XDIR_AccTime, 0);\n\t\t\t\t\t\tres = store_xdir(&dj);\t/* Restore it to the directory */\n\t\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\t\tres = sync_fs(fs);\n\t\t\t\t\t\t\tfp->flag &= (BYTE)~FA_MODIFIED;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tFREE_NAMBUF();\n\t\t\t\t}\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tres = move_window(fs, fp->dir_sect);\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tdir = fp->dir_ptr;\n\t\t\t\t\tdir[DIR_Attr] |= AM_ARC;\t\t\t\t\t\t/* Set archive attribute to indicate that the file has been changed */\n\t\t\t\t\tst_clust(fp->obj.fs, dir, fp->obj.sclust);\t\t/* Update file allocation information  */\n\t\t\t\t\tst_dword(dir + DIR_FileSize, (DWORD)fp->obj.objsize);\t/* Update file size */\n\t\t\t\t\tst_dword(dir + DIR_ModTime, tm);\t\t\t\t/* Update modified time */\n\t\t\t\t\tst_word(dir + DIR_LstAccDate, 0);\n\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\tres = sync_fs(fs);\t\t\t\t\t/* Restore it to the directory */\n\t\t\t\t\tfp->flag &= (BYTE)~FA_MODIFIED;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* !FF_FS_READONLY */\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Close File                                                            */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_close (\n\tFIL* fp\t\t/* Open file to be closed */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\n#if !FF_FS_READONLY\n\tres = f_sync(fp);\t\t\t\t\t/* Flush cached data */\n\tif (res == FR_OK)\n#endif\n\t{\n\t\tres = validate(&fp->obj, &fs);\t/* Lock volume */\n\t\tif (res == FR_OK) {\n#if FF_FS_LOCK\n\t\t\tres = dec_share(fp->obj.lockid);\t\t/* Decrement file open counter */\n\t\t\tif (res == FR_OK) fp->obj.fs = 0;\t/* Invalidate file object */\n#else\n\t\t\tfp->obj.fs = 0;\t/* Invalidate file object */\n#endif\n#if FF_FS_REENTRANT\n\t\t\tunlock_volume(fs, FR_OK);\t\t/* Unlock volume */\n#endif\n\t\t}\n\t}\n\treturn res;\n}\n\n\n\n\n#if FF_FS_RPATH >= 1\n/*-----------------------------------------------------------------------*/\n/* Change Current Directory or Current Drive, Get Current Directory      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_chdrive (\n\tconst TCHAR* path\t\t/* Drive number to set */\n)\n{\n\tint vol;\n\n\n\t/* Get logical drive number */\n\tvol = get_ldnumber(&path);\n\tif (vol < 0) return FR_INVALID_DRIVE;\n\tCurrVol = (BYTE)vol;\t/* Set it as current volume */\n\n\treturn FR_OK;\n}\n\n\n\nFRESULT f_chdir (\n\tconst TCHAR* path\t/* Pointer to the directory path */\n)\n{\n#if FF_STR_VOLUME_ID == 2\n\tUINT i;\n#endif\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tres = mount_volume(&path, &fs, 0);\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t\t/* Follow the path */\n\t\tif (res == FR_OK) {\t\t\t\t\t/* Follow completed */\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\t/* Is it the start directory itself? */\n\t\t\t\tfs->cdir = dj.obj.sclust;\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\tfs->cdc_scl = dj.obj.c_scl;\n\t\t\t\t\tfs->cdc_size = dj.obj.c_size;\n\t\t\t\t\tfs->cdc_ofs = dj.obj.c_ofs;\n\t\t\t\t}\n#endif\n\t\t\t} else {\n\t\t\t\tif (dj.obj.attr & AM_DIR) {\t/* It is a sub-directory */\n#if FF_FS_EXFAT\n\t\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t\tfs->cdir = ld_dword(fs->dirbuf + XDIR_FstClus);\t\t/* Sub-directory cluster */\n\t\t\t\t\t\tfs->cdc_scl = dj.obj.sclust;\t\t\t\t\t\t/* Save containing directory information */\n\t\t\t\t\t\tfs->cdc_size = ((DWORD)dj.obj.objsize & 0xFFFFFF00) | dj.obj.stat;\n\t\t\t\t\t\tfs->cdc_ofs = dj.blk_ofs;\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tfs->cdir = ld_clust(fs, dj.dir);\t\t\t\t\t/* Sub-directory cluster */\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tres = FR_NO_PATH;\t\t/* Reached but a file */\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t\tif (res == FR_NO_FILE) res = FR_NO_PATH;\n#if FF_STR_VOLUME_ID == 2\t/* Also current drive is changed if in Unix style volume ID */\n\t\tif (res == FR_OK) {\n\t\t\tfor (i = FF_VOLUMES - 1; i && fs != FatFs[i]; i--) ;\t/* Set current drive */\n\t\t\tCurrVol = (BYTE)i;\n\t\t}\n#endif\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n#if FF_FS_RPATH >= 2\nFRESULT f_getcwd (\n\tTCHAR* buff,\t/* Pointer to the directory path */\n\tUINT len\t\t/* Size of buff in unit of TCHAR */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tFATFS *fs;\n\tUINT i, n;\n\tDWORD ccl;\n\tTCHAR *tp = buff;\n#if FF_VOLUMES >= 2\n\tUINT vl;\n#if FF_STR_VOLUME_ID\n\tconst char *vp;\n#endif\n#endif\n\tFILINFO fno;\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tbuff[0] = 0;\t/* Set null string to get current volume */\n\tres = mount_volume((const TCHAR**)&buff, &fs, 0);\t/* Get current volume */\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\n\t\t/* Follow parent directories and create the path */\n\t\ti = len;\t\t\t/* Bottom of buffer (directory stack base) */\n\t\tif (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) {\t/* (Cannot do getcwd on exFAT and returns root path) */\n\t\t\tdj.obj.sclust = fs->cdir;\t\t\t\t/* Start to follow upper directory from current directory */\n\t\t\twhile ((ccl = dj.obj.sclust) != 0) {\t/* Repeat while current directory is a sub-directory */\n\t\t\t\tres = dir_sdi(&dj, 1 * SZDIRE);\t/* Get parent directory */\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tres = move_window(fs, dj.sect);\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tdj.obj.sclust = ld_clust(fs, dj.dir);\t/* Goto parent directory */\n\t\t\t\tres = dir_sdi(&dj, 0);\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tdo {\t\t\t\t\t\t\t/* Find the entry links to the child directory */\n\t\t\t\t\tres = DIR_READ_FILE(&dj);\n\t\t\t\t\tif (res != FR_OK) break;\n\t\t\t\t\tif (ccl == ld_clust(fs, dj.dir)) break;\t/* Found the entry */\n\t\t\t\t\tres = dir_next(&dj, 0);\n\t\t\t\t} while (res == FR_OK);\n\t\t\t\tif (res == FR_NO_FILE) res = FR_INT_ERR;/* It cannot be 'not found'. */\n\t\t\t\tif (res != FR_OK) break;\n\t\t\t\tget_fileinfo(&dj, &fno);\t\t/* Get the directory name and push it to the buffer */\n\t\t\t\tfor (n = 0; fno.fname[n]; n++) ;\t/* Name length */\n\t\t\t\tif (i < n + 1) {\t/* Insufficient space to store the path name? */\n\t\t\t\t\tres = FR_NOT_ENOUGH_CORE; break;\n\t\t\t\t}\n\t\t\t\twhile (n) buff[--i] = fno.fname[--n];\t/* Stack the name */\n\t\t\t\tbuff[--i] = '/';\n\t\t\t}\n\t\t}\n\t\tif (res == FR_OK) {\n\t\t\tif (i == len) buff[--i] = '/';\t/* Is it the root-directory? */\n#if FF_VOLUMES >= 2\t\t\t/* Put drive prefix */\n\t\t\tvl = 0;\n#if FF_STR_VOLUME_ID >= 1\t/* String volume ID */\n\t\t\tfor (n = 0, vp = (const char*)VolumeStr[CurrVol]; vp[n]; n++) ;\n\t\t\tif (i >= n + 2) {\n\t\t\t\tif (FF_STR_VOLUME_ID == 2) *tp++ = (TCHAR)'/';\n\t\t\t\tfor (vl = 0; vl < n; *tp++ = (TCHAR)vp[vl], vl++) ;\n\t\t\t\tif (FF_STR_VOLUME_ID == 1) *tp++ = (TCHAR)':';\n\t\t\t\tvl++;\n\t\t\t}\n#else\t\t\t\t\t\t/* Numeric volume ID */\n\t\t\tif (i >= 3) {\n\t\t\t\t*tp++ = (TCHAR)'0' + CurrVol;\n\t\t\t\t*tp++ = (TCHAR)':';\n\t\t\t\tvl = 2;\n\t\t\t}\n#endif\n\t\t\tif (vl == 0) res = FR_NOT_ENOUGH_CORE;\n#endif\n\t\t\t/* Add current directory path */\n\t\t\tif (res == FR_OK) {\n\t\t\t\tdo {\t/* Copy stacked path string */\n\t\t\t\t\t*tp++ = buff[i++];\n\t\t\t\t} while (i < len);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\t*tp = 0;\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* FF_FS_RPATH >= 2 */\n#endif /* FF_FS_RPATH >= 1 */\n\n\n\n#if FF_FS_MINIMIZE <= 2\n/*-----------------------------------------------------------------------*/\n/* Seek File Read/Write Pointer                                          */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_lseek (\n\tFIL* fp,\t\t/* Pointer to the file object */\n\tFSIZE_t ofs\t\t/* File pointer from top of file */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD clst, bcs;\n\tLBA_t nsect;\n\tFSIZE_t ifptr;\n#if FF_USE_FASTSEEK\n\tDWORD cl, pcl, ncl, tcl, tlen, ulen;\n\tDWORD *tbl;\n\tLBA_t dsc;\n#endif\n\n\tres = validate(&fp->obj, &fs);\t\t/* Check validity of the file object */\n\tif (res == FR_OK) res = (FRESULT)fp->err;\n#if FF_FS_EXFAT && !FF_FS_READONLY\n\tif (res == FR_OK && fs->fs_type == FS_EXFAT) {\n\t\tres = fill_last_frag(&fp->obj, fp->clust, 0xFFFFFFFF);\t/* Fill last fragment on the FAT if needed */\n\t}\n#endif\n\tif (res != FR_OK) LEAVE_FF(fs, res);\n\n#if FF_USE_FASTSEEK\n\tif (fp->cltbl) {\t/* Fast seek */\n\t\tif (ofs == CREATE_LINKMAP) {\t/* Create CLMT */\n\t\t\ttbl = fp->cltbl;\n\t\t\ttlen = *tbl++; ulen = 2;\t/* Given table size and required table size */\n\t\t\tcl = fp->obj.sclust;\t\t/* Origin of the chain */\n\t\t\tif (cl != 0) {\n\t\t\t\tdo {\n\t\t\t\t\t/* Get a fragment */\n\t\t\t\t\ttcl = cl; ncl = 0; ulen += 2;\t/* Top, length and used items */\n\t\t\t\t\tdo {\n\t\t\t\t\t\tpcl = cl; ncl++;\n\t\t\t\t\t\tcl = get_fat(&fp->obj, cl);\n\t\t\t\t\t\tif (cl <= 1) ABORT(fs, FR_INT_ERR);\n\t\t\t\t\t\tif (cl == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\t} while (cl == pcl + 1);\n\t\t\t\t\tif (ulen <= tlen) {\t\t/* Store the length and top of the fragment */\n\t\t\t\t\t\t*tbl++ = ncl; *tbl++ = tcl;\n\t\t\t\t\t}\n\t\t\t\t} while (cl < fs->n_fatent);\t/* Repeat until end of chain */\n\t\t\t}\n\t\t\t*fp->cltbl = ulen;\t/* Number of items used */\n\t\t\tif (ulen <= tlen) {\n\t\t\t\t*tbl = 0;\t\t/* Terminate table */\n\t\t\t} else {\n\t\t\t\tres = FR_NOT_ENOUGH_CORE;\t/* Given table size is smaller than required */\n\t\t\t}\n\t\t} else {\t\t\t\t\t\t/* Fast seek */\n\t\t\tif (ofs > fp->obj.objsize) ofs = fp->obj.objsize;\t/* Clip offset at the file size */\n\t\t\tfp->fptr = ofs;\t\t\t\t/* Set file pointer */\n\t\t\tif (ofs > 0) {\n\t\t\t\tfp->clust = clmt_clust(fp, ofs - 1);\n\t\t\t\tdsc = clst2sect(fs, fp->clust);\n\t\t\t\tif (dsc == 0) ABORT(fs, FR_INT_ERR);\n\t\t\t\tdsc += (DWORD)((ofs - 1) / SS(fs)) & (fs->csize - 1);\n\t\t\t\tif (fp->fptr % SS(fs) && dsc != fp->sect) {\t/* Refill sector cache if needed */\n#if !FF_FS_TINY\n#if !FF_FS_READONLY\n\t\t\t\t\tif (fp->flag & FA_DIRTY) {\t\t/* Write-back dirty sector cache */\n\t\t\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t\t\t}\n#endif\n\t\t\t\t\tif (disk_read(fs->pdrv, fp->buf, dsc, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\t/* Load current sector */\n#endif\n\t\t\t\t\tfp->sect = dsc;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else\n#endif\n\n\t/* Normal Seek */\n\t{\n#if FF_FS_EXFAT\n\t\tif (fs->fs_type != FS_EXFAT && ofs >= 0x100000000) ofs = 0xFFFFFFFF;\t/* Clip at 4 GiB - 1 if at FATxx */\n#endif\n\t\tif (ofs > fp->obj.objsize && (FF_FS_READONLY || !(fp->flag & FA_WRITE))) {\t/* In read-only mode, clip offset with the file size */\n\t\t\tofs = fp->obj.objsize;\n\t\t}\n\t\tifptr = fp->fptr;\n\t\tfp->fptr = nsect = 0;\n\t\tif (ofs > 0) {\n\t\t\tbcs = (DWORD)fs->csize * SS(fs);\t/* Cluster size (byte) */\n\t\t\tif (ifptr > 0 &&\n\t\t\t\t(ofs - 1) / bcs >= (ifptr - 1) / bcs) {\t/* When seek to same or following cluster, */\n\t\t\t\tfp->fptr = (ifptr - 1) & ~(FSIZE_t)(bcs - 1);\t/* start from the current cluster */\n\t\t\t\tofs -= fp->fptr;\n\t\t\t\tclst = fp->clust;\n\t\t\t} else {\t\t\t\t\t\t\t\t\t/* When seek to back cluster, */\n\t\t\t\tclst = fp->obj.sclust;\t\t\t\t\t/* start from the first cluster */\n#if !FF_FS_READONLY\n\t\t\t\tif (clst == 0) {\t\t\t\t\t\t/* If no cluster chain, create a new chain */\n\t\t\t\t\tclst = create_chain(&fp->obj, 0);\n\t\t\t\t\tif (clst == 1) ABORT(fs, FR_INT_ERR);\n\t\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\tfp->obj.sclust = clst;\n\t\t\t\t}\n#endif\n\t\t\t\tfp->clust = clst;\n\t\t\t}\n\t\t\tif (clst != 0) {\n\t\t\t\twhile (ofs > bcs) {\t\t\t\t\t\t/* Cluster following loop */\n\t\t\t\t\tofs -= bcs; fp->fptr += bcs;\n#if !FF_FS_READONLY\n\t\t\t\t\tif (fp->flag & FA_WRITE) {\t\t\t/* Check if in write mode or not */\n\t\t\t\t\t\tif (FF_FS_EXFAT && fp->fptr > fp->obj.objsize) {\t/* No FAT chain object needs correct objsize to generate FAT value */\n\t\t\t\t\t\t\tfp->obj.objsize = fp->fptr;\n\t\t\t\t\t\t\tfp->flag |= FA_MODIFIED;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tclst = create_chain(&fp->obj, clst);\t/* Follow chain with forceed stretch */\n\t\t\t\t\t\tif (clst == 0) {\t\t\t\t/* Clip file size in case of disk full */\n\t\t\t\t\t\t\tofs = 0; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tclst = get_fat(&fp->obj, clst);\t/* Follow cluster chain if not in write mode */\n\t\t\t\t\t}\n\t\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\t\tif (clst <= 1 || clst >= fs->n_fatent) ABORT(fs, FR_INT_ERR);\n\t\t\t\t\tfp->clust = clst;\n\t\t\t\t}\n\t\t\t\tfp->fptr += ofs;\n\t\t\t\tif (ofs % SS(fs)) {\n\t\t\t\t\tnsect = clst2sect(fs, clst);\t/* Current sector */\n\t\t\t\t\tif (nsect == 0) ABORT(fs, FR_INT_ERR);\n\t\t\t\t\tnsect += (DWORD)(ofs / SS(fs));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!FF_FS_READONLY && fp->fptr > fp->obj.objsize) {\t/* Set file change flag if the file size is extended */\n\t\t\tfp->obj.objsize = fp->fptr;\n\t\t\tfp->flag |= FA_MODIFIED;\n\t\t}\n\t\tif (fp->fptr % SS(fs) && nsect != fp->sect) {\t/* Fill sector cache if needed */\n#if !FF_FS_TINY\n#if !FF_FS_READONLY\n\t\t\tif (fp->flag & FA_DIRTY) {\t\t\t/* Write-back dirty sector cache */\n\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n#endif\n\t\t\tif (disk_read(fs->pdrv, fp->buf, nsect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\t/* Fill sector cache */\n#endif\n\t\t\tfp->sect = nsect;\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n#if FF_FS_MINIMIZE <= 1\n/*-----------------------------------------------------------------------*/\n/* Create a Directory Object                                             */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_opendir (\n\tDIR* dp,\t\t\t/* Pointer to directory object to create */\n\tconst TCHAR* path\t/* Pointer to the directory path */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDEF_NAMBUF\n\n\n\tif (!dp) return FR_INVALID_OBJECT;\n\n\t/* Get logical drive */\n\tres = mount_volume(&path, &fs, 0);\n\tif (res == FR_OK) {\n\t\tdp->obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(dp, path);\t\t\t/* Follow the path to the directory */\n\t\tif (res == FR_OK) {\t\t\t\t\t\t/* Follow completed */\n\t\t\tif (!(dp->fn[NSFLAG] & NS_NONAME)) {\t/* It is not the origin directory itself */\n\t\t\t\tif (dp->obj.attr & AM_DIR) {\t\t/* This object is a sub-directory */\n#if FF_FS_EXFAT\n\t\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t\tdp->obj.c_scl = dp->obj.sclust;\t/* Get containing directory inforamation */\n\t\t\t\t\t\tdp->obj.c_size = ((DWORD)dp->obj.objsize & 0xFFFFFF00) | dp->obj.stat;\n\t\t\t\t\t\tdp->obj.c_ofs = dp->blk_ofs;\n\t\t\t\t\t\tinit_alloc_info(fs, &dp->obj);\t/* Get object allocation info */\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tdp->obj.sclust = ld_clust(fs, dp->dir);\t/* Get object allocation info */\n\t\t\t\t\t}\n\t\t\t\t} else {\t\t\t\t\t\t/* This object is a file */\n\t\t\t\t\tres = FR_NO_PATH;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tdp->obj.id = fs->id;\n\t\t\t\tres = dir_sdi(dp, 0);\t\t\t/* Rewind directory */\n#if FF_FS_LOCK\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tif (dp->obj.sclust != 0) {\n\t\t\t\t\t\tdp->obj.lockid = inc_share(dp, 0);\t/* Lock the sub directory */\n\t\t\t\t\t\tif (!dp->obj.lockid) res = FR_TOO_MANY_OPEN_FILES;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdp->obj.lockid = 0;\t/* Root directory need not to be locked */\n\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t\tif (res == FR_NO_FILE) res = FR_NO_PATH;\n\t}\n\tif (res != FR_OK) dp->obj.fs = 0;\t\t/* Invalidate the directory object if function failed */\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Close Directory                                                       */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_closedir (\n\tDIR *dp\t\t/* Pointer to the directory object to be closed */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\n\n\tres = validate(&dp->obj, &fs);\t/* Check validity of the file object */\n\tif (res == FR_OK) {\n#if FF_FS_LOCK\n\t\tif (dp->obj.lockid) res = dec_share(dp->obj.lockid);\t/* Decrement sub-directory open counter */\n\t\tif (res == FR_OK) dp->obj.fs = 0;\t/* Invalidate directory object */\n#else\n\t\tdp->obj.fs = 0;\t/* Invalidate directory object */\n#endif\n#if FF_FS_REENTRANT\n\t\tunlock_volume(fs, FR_OK);\t/* Unlock volume */\n#endif\n\t}\n\treturn res;\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Read Directory Entries in Sequence                                    */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_readdir (\n\tDIR* dp,\t\t\t/* Pointer to the open directory object */\n\tFILINFO* fno\t\t/* Pointer to file information to return */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDEF_NAMBUF\n\n\n\tres = validate(&dp->obj, &fs);\t/* Check validity of the directory object */\n\tif (res == FR_OK) {\n\t\tif (!fno) {\n\t\t\tres = dir_sdi(dp, 0);\t\t/* Rewind the directory object */\n\t\t} else {\n\t\t\tINIT_NAMBUF(fs);\n\t\t\tres = DIR_READ_FILE(dp);\t\t/* Read an item */\n\t\t\tif (res == FR_NO_FILE) res = FR_OK;\t/* Ignore end of directory */\n\t\t\tif (res == FR_OK) {\t\t\t\t/* A valid entry is found */\n\t\t\t\tget_fileinfo(dp, fno);\t\t/* Get the object information */\n\t\t\t\tres = dir_next(dp, 0);\t\t/* Increment index for next */\n\t\t\t\tif (res == FR_NO_FILE) res = FR_OK;\t/* Ignore end of directory now */\n\t\t\t}\n\t\t\tFREE_NAMBUF();\n\t\t}\n\t}\n\tLEAVE_FF(fs, res);\n}\n\n\n\n#if FF_USE_FIND\n/*-----------------------------------------------------------------------*/\n/* Find Next File                                                        */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_findnext (\n\tDIR* dp,\t\t/* Pointer to the open directory object */\n\tFILINFO* fno\t/* Pointer to the file information structure */\n)\n{\n\tFRESULT res;\n\n\n\tfor (;;) {\n\t\tres = f_readdir(dp, fno);\t\t/* Get a directory item */\n\t\tif (res != FR_OK || !fno || !fno->fname[0]) break;\t/* Terminate if any error or end of directory */\n\t\tif (pattern_match(dp->pat, fno->fname, 0, FIND_RECURS)) break;\t\t/* Test for the file name */\n#if FF_USE_LFN && FF_USE_FIND == 2\n\t\tif (pattern_match(dp->pat, fno->altname, 0, FIND_RECURS)) break;\t/* Test for alternative name if exist */\n#endif\n\t}\n\treturn res;\n}\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Find First File                                                       */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_findfirst (\n\tDIR* dp,\t\t\t\t/* Pointer to the blank directory object */\n\tFILINFO* fno,\t\t\t/* Pointer to the file information structure */\n\tconst TCHAR* path,\t\t/* Pointer to the directory to open */\n\tconst TCHAR* pattern\t/* Pointer to the matching pattern */\n)\n{\n\tFRESULT res;\n\n\n\tdp->pat = pattern;\t\t/* Save pointer to pattern string */\n\tres = f_opendir(dp, path);\t\t/* Open the target directory */\n\tif (res == FR_OK) {\n\t\tres = f_findnext(dp, fno);\t/* Find the first item */\n\t}\n\treturn res;\n}\n\n#endif\t/* FF_USE_FIND */\n\n\n\n#if FF_FS_MINIMIZE == 0\n/*-----------------------------------------------------------------------*/\n/* Get File Status                                                       */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_stat (\n\tconst TCHAR* path,\t/* Pointer to the file path */\n\tFILINFO* fno\t\t/* Pointer to file information to return */\n)\n{\n\tFRESULT res;\n\tDIR dj;\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tres = mount_volume(&path, &dj.obj.fs, 0);\n\tif (res == FR_OK) {\n\t\tINIT_NAMBUF(dj.obj.fs);\n\t\tres = follow_path(&dj, path);\t/* Follow the file path */\n\t\tif (res == FR_OK) {\t\t\t\t/* Follow completed */\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\t/* It is origin directory */\n\t\t\t\tres = FR_INVALID_NAME;\n\t\t\t} else {\t\t\t\t\t\t\t/* Found an object */\n\t\t\t\tif (fno) get_fileinfo(&dj, fno);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(dj.obj.fs, res);\n}\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Get Number of Free Clusters                                           */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_getfree (\n\tconst TCHAR* path,\t/* Logical drive number */\n\tDWORD* nclst,\t\t/* Pointer to a variable to return number of free clusters */\n\tFATFS** fatfs\t\t/* Pointer to return pointer to corresponding filesystem object */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD nfree, clst, stat;\n\tLBA_t sect;\n\tUINT i;\n\tFFOBJID obj;\n\n\n\t/* Get logical drive */\n\tres = mount_volume(&path, &fs, 0);\n\tif (res == FR_OK) {\n\t\t*fatfs = fs;\t\t\t\t/* Return ptr to the fs object */\n\t\t/* If free_clst is valid, return it without full FAT scan */\n\t\tif (fs->free_clst <= fs->n_fatent - 2) {\n\t\t\t*nclst = fs->free_clst;\n\t\t} else {\n\t\t\t/* Scan FAT to obtain number of free clusters */\n\t\t\tnfree = 0;\n\t\t\tif (fs->fs_type == FS_FAT12) {\t/* FAT12: Scan bit field FAT entries */\n\t\t\t\tclst = 2; obj.fs = fs;\n\t\t\t\tdo {\n\t\t\t\t\tstat = get_fat(&obj, clst);\n\t\t\t\t\tif (stat == 0xFFFFFFFF) {\n\t\t\t\t\t\tres = FR_DISK_ERR; break;\n\t\t\t\t\t}\n\t\t\t\t\tif (stat == 1) {\n\t\t\t\t\t\tres = FR_INT_ERR; break;\n\t\t\t\t\t}\n\t\t\t\t\tif (stat == 0) nfree++;\n\t\t\t\t} while (++clst < fs->n_fatent);\n\t\t\t} else {\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\t/* exFAT: Scan allocation bitmap */\n\t\t\t\t\tBYTE bm;\n\t\t\t\t\tUINT b;\n\n\t\t\t\t\tclst = fs->n_fatent - 2;\t/* Number of clusters */\n\t\t\t\t\tsect = fs->bitbase;\t\t\t/* Bitmap sector */\n\t\t\t\t\ti = 0;\t\t\t\t\t\t/* Offset in the sector */\n\t\t\t\t\tdo {\t/* Counts numbuer of bits with zero in the bitmap */\n\t\t\t\t\t\tif (i == 0) {\t/* New sector? */\n\t\t\t\t\t\t\tres = move_window(fs, sect++);\n\t\t\t\t\t\t\tif (res != FR_OK) break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfor (b = 8, bm = ~fs->win[i]; b && clst; b--, clst--) {\n\t\t\t\t\t\t\tnfree += bm & 1;\n\t\t\t\t\t\t\tbm >>= 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti = (i + 1) % SS(fs);\n\t\t\t\t\t} while (clst);\n\t\t\t\t} else\n#endif\n\t\t\t\t{\t/* FAT16/32: Scan WORD/DWORD FAT entries */\n\t\t\t\t\tclst = fs->n_fatent;\t/* Number of entries */\n\t\t\t\t\tsect = fs->fatbase;\t\t/* Top of the FAT */\n\t\t\t\t\ti = 0;\t\t\t\t\t/* Offset in the sector */\n\t\t\t\t\tdo {\t/* Counts numbuer of entries with zero in the FAT */\n\t\t\t\t\t\tif (i == 0) {\t/* New sector? */\n\t\t\t\t\t\t\tres = move_window(fs, sect++);\n\t\t\t\t\t\t\tif (res != FR_OK) break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (fs->fs_type == FS_FAT16) {\n\t\t\t\t\t\t\tif (ld_word(fs->win + i) == 0) nfree++;\n\t\t\t\t\t\t\ti += 2;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif ((ld_dword(fs->win + i) & 0x0FFFFFFF) == 0) nfree++;\n\t\t\t\t\t\t\ti += 4;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ti %= SS(fs);\n\t\t\t\t\t} while (--clst);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\t\t/* Update parameters if succeeded */\n\t\t\t\t*nclst = nfree;\t\t\t/* Return the free clusters */\n\t\t\t\tfs->free_clst = nfree;\t/* Now free_clst is valid */\n\t\t\t\tfs->fsi_flag |= 1;\t\t/* FAT32: FSInfo is to be updated */\n\t\t\t}\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Truncate File                                                         */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_truncate (\n\tFIL* fp\t\t/* Pointer to the file object */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD ncl;\n\n\n\tres = validate(&fp->obj, &fs);\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\n\tif (!(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED);\t/* Check access mode */\n\n\tif (fp->fptr < fp->obj.objsize) {\t/* Process when fptr is not on the eof */\n\t\tif (fp->fptr == 0) {\t/* When set file size to zero, remove entire cluster chain */\n\t\t\tres = remove_chain(&fp->obj, fp->obj.sclust, 0);\n\t\t\tfp->obj.sclust = 0;\n\t\t} else {\t\t\t\t/* When truncate a part of the file, remove remaining clusters */\n\t\t\tncl = get_fat(&fp->obj, fp->clust);\n\t\t\tres = FR_OK;\n\t\t\tif (ncl == 0xFFFFFFFF) res = FR_DISK_ERR;\n\t\t\tif (ncl == 1) res = FR_INT_ERR;\n\t\t\tif (res == FR_OK && ncl < fs->n_fatent) {\n\t\t\t\tres = remove_chain(&fp->obj, ncl, fp->clust);\n\t\t\t}\n\t\t}\n\t\tfp->obj.objsize = fp->fptr;\t/* Set file size to current read/write point */\n\t\tfp->flag |= FA_MODIFIED;\n#if !FF_FS_TINY\n\t\tif (res == FR_OK && (fp->flag & FA_DIRTY)) {\n\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) {\n\t\t\t\tres = FR_DISK_ERR;\n\t\t\t} else {\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n\t\t}\n#endif\n\t\tif (res != FR_OK) ABORT(fs, res);\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Delete a File/Directory                                               */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_unlink (\n\tconst TCHAR* path\t\t/* Pointer to the file or directory path */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDIR dj, sdj;\n\tDWORD dclst = 0;\n#if FF_FS_EXFAT\n\tFFOBJID obj;\n#endif\n\tDEF_NAMBUF\n\n\n\t/* Get logical drive */\n\tres = mount_volume(&path, &fs, FA_WRITE);\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t\t/* Follow the file path */\n\t\tif (FF_FS_RPATH && res == FR_OK && (dj.fn[NSFLAG] & NS_DOT)) {\n\t\t\tres = FR_INVALID_NAME;\t\t\t/* Cannot remove dot entry */\n\t\t}\n#if FF_FS_LOCK\n\t\tif (res == FR_OK) res = chk_share(&dj, 2);\t/* Check if it is an open object */\n#endif\n\t\tif (res == FR_OK) {\t\t\t\t\t/* The object is accessible */\n\t\t\tif (dj.fn[NSFLAG] & NS_NONAME) {\n\t\t\t\tres = FR_INVALID_NAME;\t\t/* Cannot remove the origin directory */\n\t\t\t} else {\n\t\t\t\tif (dj.obj.attr & AM_RDO) {\n\t\t\t\t\tres = FR_DENIED;\t\t/* Cannot remove R/O object */\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\t\tobj.fs = fs;\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\tinit_alloc_info(fs, &obj);\n\t\t\t\t\tdclst = obj.sclust;\n\t\t\t\t} else\n#endif\n\t\t\t\t{\n\t\t\t\t\tdclst = ld_clust(fs, dj.dir);\n\t\t\t\t}\n\t\t\t\tif (dj.obj.attr & AM_DIR) {\t\t\t/* Is it a sub-directory? */\n#if FF_FS_RPATH != 0\n\t\t\t\t\tif (dclst == fs->cdir) {\t \t/* Is it the current directory? */\n\t\t\t\t\t\tres = FR_DENIED;\n\t\t\t\t\t} else\n#endif\n\t\t\t\t\t{\n\t\t\t\t\t\tsdj.obj.fs = fs;\t\t\t/* Open the sub-directory */\n\t\t\t\t\t\tsdj.obj.sclust = dclst;\n#if FF_FS_EXFAT\n\t\t\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t\t\tsdj.obj.objsize = obj.objsize;\n\t\t\t\t\t\t\tsdj.obj.stat = obj.stat;\n\t\t\t\t\t\t}\n#endif\n\t\t\t\t\t\tres = dir_sdi(&sdj, 0);\n\t\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\t\tres = DIR_READ_FILE(&sdj);\t\t\t/* Test if the directory is empty */\n\t\t\t\t\t\t\tif (res == FR_OK) res = FR_DENIED;\t/* Not empty? */\n\t\t\t\t\t\t\tif (res == FR_NO_FILE) res = FR_OK;\t/* Empty? */\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = dir_remove(&dj);\t\t\t/* Remove the directory entry */\n\t\t\t\tif (res == FR_OK && dclst != 0) {\t/* Remove the cluster chain if exist */\n#if FF_FS_EXFAT\n\t\t\t\t\tres = remove_chain(&obj, dclst, 0);\n#else\n\t\t\t\t\tres = remove_chain(&dj.obj, dclst, 0);\n#endif\n\t\t\t\t}\n\t\t\t\tif (res == FR_OK) res = sync_fs(fs);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Create a Directory                                                    */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_mkdir (\n\tconst TCHAR* path\t\t/* Pointer to the directory path */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDIR dj;\n\tFFOBJID sobj;\n\tDWORD dcl, pcl, tm;\n\tDEF_NAMBUF\n\n\n\tres = mount_volume(&path, &fs, FA_WRITE);\t/* Get logical drive */\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t\t\t/* Follow the file path */\n\t\tif (res == FR_OK) res = FR_EXIST;\t\t/* Name collision? */\n\t\tif (FF_FS_RPATH && res == FR_NO_FILE && (dj.fn[NSFLAG] & NS_DOT)) {\t/* Invalid name? */\n\t\t\tres = FR_INVALID_NAME;\n\t\t}\n\t\tif (res == FR_NO_FILE) {\t\t\t\t/* It is clear to create a new directory */\n\t\t\tsobj.fs = fs;\t\t\t\t\t\t/* New object id to create a new chain */\n\t\t\tdcl = create_chain(&sobj, 0);\t\t/* Allocate a cluster for the new directory */\n\t\t\tres = FR_OK;\n\t\t\tif (dcl == 0) res = FR_DENIED;\t\t/* No space to allocate a new cluster? */\n\t\t\tif (dcl == 1) res = FR_INT_ERR;\t\t/* Any insanity? */\n\t\t\tif (dcl == 0xFFFFFFFF) res = FR_DISK_ERR;\t/* Disk error? */\n\t\t\ttm = GET_FATTIME();\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = dir_clear(fs, dcl);\t\t/* Clean up the new table */\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tif (!FF_FS_EXFAT || fs->fs_type != FS_EXFAT) {\t/* Create dot entries (FAT only) */\n\t\t\t\t\t\tmemset(fs->win + DIR_Name, ' ', 11);\t/* Create \".\" entry */\n\t\t\t\t\t\tfs->win[DIR_Name] = '.';\n\t\t\t\t\t\tfs->win[DIR_Attr] = AM_DIR;\n\t\t\t\t\t\tst_dword(fs->win + DIR_ModTime, tm);\n\t\t\t\t\t\tst_clust(fs, fs->win, dcl);\n\t\t\t\t\t\tmemcpy(fs->win + SZDIRE, fs->win, SZDIRE);\t/* Create \"..\" entry */\n\t\t\t\t\t\tfs->win[SZDIRE + 1] = '.'; pcl = dj.obj.sclust;\n\t\t\t\t\t\tst_clust(fs, fs->win + SZDIRE, pcl);\n\t\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\t}\n\t\t\t\t\tres = dir_register(&dj);\t/* Register the object to the parent directoy */\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\t/* Initialize directory entry block */\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_ModTime, tm);\t/* Created time */\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_FstClus, dcl);\t/* Table start cluster */\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_FileSize, (DWORD)fs->csize * SS(fs));\t/* Directory size needs to be valid */\n\t\t\t\t\tst_dword(fs->dirbuf + XDIR_ValidFileSize, (DWORD)fs->csize * SS(fs));\n\t\t\t\t\tfs->dirbuf[XDIR_GenFlags] = 3;\t\t\t\t/* Initialize the object flag */\n\t\t\t\t\tfs->dirbuf[XDIR_Attr] = AM_DIR;\t\t\t\t/* Attribute */\n\t\t\t\t\tres = store_xdir(&dj);\n\t\t\t\t} else\n#endif\n\t\t\t\t{\n\t\t\t\t\tst_dword(dj.dir + DIR_ModTime, tm);\t/* Created time */\n\t\t\t\t\tst_clust(fs, dj.dir, dcl);\t\t\t/* Table start cluster */\n\t\t\t\t\tdj.dir[DIR_Attr] = AM_DIR;\t\t\t/* Attribute */\n\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t}\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tres = sync_fs(fs);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tremove_chain(&sobj, dcl, 0);\t\t/* Could not register, remove the allocated cluster */\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Rename a File/Directory                                               */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_rename (\n\tconst TCHAR* path_old,\t/* Pointer to the object name to be renamed */\n\tconst TCHAR* path_new\t/* Pointer to the new name */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDIR djo, djn;\n\tBYTE buf[FF_FS_EXFAT ? SZDIRE * 2 : SZDIRE], *dir;\n\tLBA_t sect;\n\tDEF_NAMBUF\n\n\n\tget_ldnumber(&path_new);\t\t\t\t\t\t/* Snip the drive number of new name off */\n\tres = mount_volume(&path_old, &fs, FA_WRITE);\t/* Get logical drive of the old object */\n\tif (res == FR_OK) {\n\t\tdjo.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&djo, path_old);\t\t\t/* Check old object */\n\t\tif (res == FR_OK && (djo.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME;\t/* Check validity of name */\n#if FF_FS_LOCK\n\t\tif (res == FR_OK) {\n\t\t\tres = chk_share(&djo, 2);\n\t\t}\n#endif\n\t\tif (res == FR_OK) {\t\t\t\t\t/* Object to be renamed is found */\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\t/* At exFAT volume */\n\t\t\t\tBYTE nf, nn;\n\t\t\t\tWORD nh;\n\n\t\t\t\tmemcpy(buf, fs->dirbuf, SZDIRE * 2);\t/* Save 85+C0 entry of old object */\n\t\t\t\tmemcpy(&djn, &djo, sizeof djo);\n\t\t\t\tres = follow_path(&djn, path_new);\t\t/* Make sure if new object name is not in use */\n\t\t\t\tif (res == FR_OK) {\t\t\t\t\t\t/* Is new name already in use by any other object? */\n\t\t\t\t\tres = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST;\n\t\t\t\t}\n\t\t\t\tif (res == FR_NO_FILE) { \t\t\t\t/* It is a valid path and no name collision */\n\t\t\t\t\tres = dir_register(&djn);\t\t\t/* Register the new entry */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tnf = fs->dirbuf[XDIR_NumSec]; nn = fs->dirbuf[XDIR_NumName];\n\t\t\t\t\t\tnh = ld_word(fs->dirbuf + XDIR_NameHash);\n\t\t\t\t\t\tmemcpy(fs->dirbuf, buf, SZDIRE * 2);\t/* Restore 85+C0 entry */\n\t\t\t\t\t\tfs->dirbuf[XDIR_NumSec] = nf; fs->dirbuf[XDIR_NumName] = nn;\n\t\t\t\t\t\tst_word(fs->dirbuf + XDIR_NameHash, nh);\n\t\t\t\t\t\tif (!(fs->dirbuf[XDIR_Attr] & AM_DIR)) fs->dirbuf[XDIR_Attr] |= AM_ARC;\t/* Set archive attribute if it is a file */\n/* Start of critical section where an interruption can cause a cross-link */\n\t\t\t\t\t\tres = store_xdir(&djn);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else\n#endif\n\t\t\t{\t/* At FAT/FAT32 volume */\n\t\t\t\tmemcpy(buf, djo.dir, SZDIRE);\t\t\t/* Save directory entry of the object */\n\t\t\t\tmemcpy(&djn, &djo, sizeof (DIR));\t\t/* Duplicate the directory object */\n\t\t\t\tres = follow_path(&djn, path_new);\t\t/* Make sure if new object name is not in use */\n\t\t\t\tif (res == FR_OK) {\t\t\t\t\t\t/* Is new name already in use by any other object? */\n\t\t\t\t\tres = (djn.obj.sclust == djo.obj.sclust && djn.dptr == djo.dptr) ? FR_NO_FILE : FR_EXIST;\n\t\t\t\t}\n\t\t\t\tif (res == FR_NO_FILE) { \t\t\t\t/* It is a valid path and no name collision */\n\t\t\t\t\tres = dir_register(&djn);\t\t\t/* Register the new entry */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tdir = djn.dir;\t\t\t\t\t/* Copy directory entry of the object except name */\n\t\t\t\t\t\tmemcpy(dir + 13, buf + 13, SZDIRE - 13);\n\t\t\t\t\t\tdir[DIR_Attr] = buf[DIR_Attr];\n\t\t\t\t\t\tif (!(dir[DIR_Attr] & AM_DIR)) dir[DIR_Attr] |= AM_ARC;\t/* Set archive attribute if it is a file */\n\t\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\t\tif ((dir[DIR_Attr] & AM_DIR) && djo.obj.sclust != djn.obj.sclust) {\t/* Update .. entry in the sub-directory if needed */\n\t\t\t\t\t\t\tsect = clst2sect(fs, ld_clust(fs, dir));\n\t\t\t\t\t\t\tif (sect == 0) {\n\t\t\t\t\t\t\t\tres = FR_INT_ERR;\n\t\t\t\t\t\t\t} else {\n/* Start of critical section where an interruption can cause a cross-link */\n\t\t\t\t\t\t\t\tres = move_window(fs, sect);\n\t\t\t\t\t\t\t\tdir = fs->win + SZDIRE * 1;\t/* Ptr to .. entry */\n\t\t\t\t\t\t\t\tif (res == FR_OK && dir[1] == '.') {\n\t\t\t\t\t\t\t\t\tst_clust(fs, dir, djn.obj.sclust);\n\t\t\t\t\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = dir_remove(&djo);\t\t/* Remove old entry */\n\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\tres = sync_fs(fs);\n\t\t\t\t}\n\t\t\t}\n/* End of the critical section */\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* !FF_FS_READONLY */\n#endif /* FF_FS_MINIMIZE == 0 */\n#endif /* FF_FS_MINIMIZE <= 1 */\n#endif /* FF_FS_MINIMIZE <= 2 */\n\n\n\n#if FF_USE_CHMOD && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Change Attribute                                                      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_chmod (\n\tconst TCHAR* path,\t/* Pointer to the file path */\n\tBYTE attr,\t\t\t/* Attribute bits */\n\tBYTE mask\t\t\t/* Attribute mask to change */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDIR dj;\n\tDEF_NAMBUF\n\n\n\tres = mount_volume(&path, &fs, FA_WRITE);\t/* Get logical drive */\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t/* Follow the file path */\n\t\tif (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME;\t/* Check object validity */\n\t\tif (res == FR_OK) {\n\t\t\tmask &= AM_RDO|AM_HID|AM_SYS|AM_ARC;\t/* Valid attribute mask */\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tfs->dirbuf[XDIR_Attr] = (attr & mask) | (fs->dirbuf[XDIR_Attr] & (BYTE)~mask);\t/* Apply attribute change */\n\t\t\t\tres = store_xdir(&dj);\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tdj.dir[DIR_Attr] = (attr & mask) | (dj.dir[DIR_Attr] & (BYTE)~mask);\t/* Apply attribute change */\n\t\t\t\tfs->wflag = 1;\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = sync_fs(fs);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Change Timestamp                                                      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_utime (\n\tconst TCHAR* path,\t/* Pointer to the file/directory name */\n\tconst FILINFO* fno\t/* Pointer to the timestamp to be set */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDIR dj;\n\tDEF_NAMBUF\n\n\n\tres = mount_volume(&path, &fs, FA_WRITE);\t/* Get logical drive */\n\tif (res == FR_OK) {\n\t\tdj.obj.fs = fs;\n\t\tINIT_NAMBUF(fs);\n\t\tres = follow_path(&dj, path);\t/* Follow the file path */\n\t\tif (res == FR_OK && (dj.fn[NSFLAG] & (NS_DOT | NS_NONAME))) res = FR_INVALID_NAME;\t/* Check object validity */\n\t\tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\tst_dword(fs->dirbuf + XDIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime);\n\t\t\t\tres = store_xdir(&dj);\n\t\t\t} else\n#endif\n\t\t\t{\n\t\t\t\tst_dword(dj.dir + DIR_ModTime, (DWORD)fno->fdate << 16 | fno->ftime);\n\t\t\t\tfs->wflag = 1;\n\t\t\t}\n\t\t\tif (res == FR_OK) {\n\t\t\t\tres = sync_fs(fs);\n\t\t\t}\n\t\t}\n\t\tFREE_NAMBUF();\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif\t/* FF_USE_CHMOD && !FF_FS_READONLY */\n\n\n\n#if FF_USE_LABEL\n/*-----------------------------------------------------------------------*/\n/* Get Volume Label                                                      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_getlabel (\n\tconst TCHAR* path,\t/* Logical drive number */\n\tTCHAR* label,\t\t/* Buffer to store the volume label */\n\tDWORD* vsn\t\t\t/* Variable to store the volume serial number */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDIR dj;\n\tUINT si, di;\n\tWCHAR wc;\n\n\t/* Get logical drive */\n\tres = mount_volume(&path, &fs, 0);\n\n\t/* Get volume label */\n\tif (res == FR_OK && label) {\n\t\tdj.obj.fs = fs; dj.obj.sclust = 0;\t/* Open root directory */\n\t\tres = dir_sdi(&dj, 0);\n\t\tif (res == FR_OK) {\n\t\t \tres = DIR_READ_LABEL(&dj);\t\t/* Find a volume label entry */\n\t\t \tif (res == FR_OK) {\n#if FF_FS_EXFAT\n\t\t\t\tif (fs->fs_type == FS_EXFAT) {\n\t\t\t\t\tWCHAR hs;\n\t\t\t\t\tUINT nw;\n\n\t\t\t\t\tfor (si = di = hs = 0; si < dj.dir[XDIR_NumLabel]; si++) {\t/* Extract volume label from 83 entry */\n\t\t\t\t\t\twc = ld_word(dj.dir + XDIR_Label + si * 2);\n\t\t\t\t\t\tif (hs == 0 && IsSurrogate(wc)) {\t/* Is the code a surrogate? */\n\t\t\t\t\t\t\ths = wc; continue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnw = put_utf((DWORD)hs << 16 | wc, &label[di], 4);\t/* Store it in API encoding */\n\t\t\t\t\t\tif (nw == 0) {\t\t/* Encode error? */\n\t\t\t\t\t\t\tdi = 0; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdi += nw;\n\t\t\t\t\t\ths = 0;\n\t\t\t\t\t}\n\t\t\t\t\tif (hs != 0) di = 0;\t/* Broken surrogate pair? */\n\t\t\t\t\tlabel[di] = 0;\n\t\t\t\t} else\n#endif\n\t\t\t\t{\n\t\t\t\t\tsi = di = 0;\t\t/* Extract volume label from AM_VOL entry */\n\t\t\t\t\twhile (si < 11) {\n\t\t\t\t\t\twc = dj.dir[si++];\n#if FF_USE_LFN && FF_LFN_UNICODE >= 1 \t/* Unicode output */\n\t\t\t\t\t\tif (dbc_1st((BYTE)wc) && si < 11) wc = wc << 8 | dj.dir[si++];\t/* Is it a DBC? */\n\t\t\t\t\t\twc = ff_oem2uni(wc, CODEPAGE);\t\t/* Convert it into Unicode */\n\t\t\t\t\t\tif (wc == 0) {\t\t/* Invalid char in current code page? */\n\t\t\t\t\t\t\tdi = 0; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdi += put_utf(wc, &label[di], 4);\t/* Store it in Unicode */\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM output */\n\t\t\t\t\t\tlabel[di++] = (TCHAR)wc;\n#endif\n\t\t\t\t\t}\n\t\t\t\t\tdo {\t\t\t\t/* Truncate trailing spaces */\n\t\t\t\t\t\tlabel[di] = 0;\n\t\t\t\t\t\tif (di == 0) break;\n\t\t\t\t\t} while (label[--di] == ' ');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (res == FR_NO_FILE) {\t/* No label entry and return nul string */\n\t\t\tlabel[0] = 0;\n\t\t\tres = FR_OK;\n\t\t}\n\t}\n\n\t/* Get volume serial number */\n\tif (res == FR_OK && vsn) {\n\t\tres = move_window(fs, fs->volbase);\n\t\tif (res == FR_OK) {\n\t\t\tswitch (fs->fs_type) {\n\t\t\tcase FS_EXFAT:\n\t\t\t\tdi = BPB_VolIDEx;\n\t\t\t\tbreak;\n\n\t\t\tcase FS_FAT32:\n\t\t\t\tdi = BS_VolID32;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tdi = BS_VolID;\n\t\t\t}\n\t\t\t*vsn = ld_dword(fs->win + di);\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n\n\n#if !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Set Volume Label                                                      */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_setlabel (\n\tconst TCHAR* label\t/* Volume label to set with heading logical drive number */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDIR dj;\n\tBYTE dirvn[22];\n\tUINT di;\n\tWCHAR wc;\n\tstatic const char badchr[18] = \"+.,;=[]\" \"/*:<>|\\\\\\\"\\?\\x7F\";\t/* [0..16] for FAT, [7..16] for exFAT */\n#if FF_USE_LFN\n\tDWORD dc;\n#endif\n\n\t/* Get logical drive */\n\tres = mount_volume(&label, &fs, FA_WRITE);\n\tif (res != FR_OK) LEAVE_FF(fs, res);\n\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\t/* On the exFAT volume */\n\t\tmemset(dirvn, 0, 22);\n\t\tdi = 0;\n\t\twhile ((UINT)*label >= ' ') {\t/* Create volume label */\n\t\t\tdc = tchar2uni(&label);\t/* Get a Unicode character */\n\t\t\tif (dc >= 0x10000) {\n\t\t\t\tif (dc == 0xFFFFFFFF || di >= 10) {\t/* Wrong surrogate or buffer overflow */\n\t\t\t\t\tdc = 0;\n\t\t\t\t} else {\n\t\t\t\t\tst_word(dirvn + di * 2, (WCHAR)(dc >> 16)); di++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (dc == 0 || strchr(&badchr[7], (int)dc) || di >= 11) {\t/* Check validity of the volume label */\n\t\t\t\tLEAVE_FF(fs, FR_INVALID_NAME);\n\t\t\t}\n\t\t\tst_word(dirvn + di * 2, (WCHAR)dc); di++;\n\t\t}\n\t} else\n#endif\n\t{\t/* On the FAT/FAT32 volume */\n\t\tmemset(dirvn, ' ', 11);\n\t\tdi = 0;\n\t\twhile ((UINT)*label >= ' ') {\t/* Create volume label */\n#if FF_USE_LFN\n\t\t\tdc = tchar2uni(&label);\n\t\t\twc = (dc < 0x10000) ? ff_uni2oem(ff_wtoupper(dc), CODEPAGE) : 0;\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM input */\n\t\t\twc = (BYTE)*label++;\n\t\t\tif (dbc_1st((BYTE)wc)) wc = dbc_2nd((BYTE)*label) ? wc << 8 | (BYTE)*label++ : 0;\n\t\t\tif (IsLower(wc)) wc -= 0x20;\t\t/* To upper ASCII characters */\n#if FF_CODE_PAGE == 0\n\t\t\tif (ExCvt && wc >= 0x80) wc = ExCvt[wc - 0x80];\t/* To upper extended characters (SBCS cfg) */\n#elif FF_CODE_PAGE < 900\n\t\t\tif (wc >= 0x80) wc = ExCvt[wc - 0x80];\t/* To upper extended characters (SBCS cfg) */\n#endif\n#endif\n\t\t\tif (wc == 0 || strchr(&badchr[0], (int)wc) || di >= (UINT)((wc >= 0x100) ? 10 : 11)) {\t/* Reject invalid characters for volume label */\n\t\t\t\tLEAVE_FF(fs, FR_INVALID_NAME);\n\t\t\t}\n\t\t\tif (wc >= 0x100) dirvn[di++] = (BYTE)(wc >> 8);\n\t\t\tdirvn[di++] = (BYTE)wc;\n\t\t}\n\t\tif (dirvn[0] == DDEM) LEAVE_FF(fs, FR_INVALID_NAME);\t/* Reject illegal name (heading DDEM) */\n\t\twhile (di && dirvn[di - 1] == ' ') di--;\t\t\t\t/* Snip trailing spaces */\n\t}\n\n\t/* Set volume label */\n\tdj.obj.fs = fs; dj.obj.sclust = 0;\t/* Open root directory */\n\tres = dir_sdi(&dj, 0);\n\tif (res == FR_OK) {\n\t\tres = DIR_READ_LABEL(&dj);\t/* Get volume label entry */\n\t\tif (res == FR_OK) {\n\t\t\tif (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) {\n\t\t\t\tdj.dir[XDIR_NumLabel] = (BYTE)di;\t/* Change the volume label */\n\t\t\t\tmemcpy(dj.dir + XDIR_Label, dirvn, 22);\n\t\t\t} else {\n\t\t\t\tif (di != 0) {\n\t\t\t\t\tmemcpy(dj.dir, dirvn, 11);\t/* Change the volume label */\n\t\t\t\t} else {\n\t\t\t\t\tdj.dir[DIR_Name] = DDEM;\t/* Remove the volume label */\n\t\t\t\t}\n\t\t\t}\n\t\t\tfs->wflag = 1;\n\t\t\tres = sync_fs(fs);\n\t\t} else {\t\t\t/* No volume label entry or an error */\n\t\t\tif (res == FR_NO_FILE) {\n\t\t\t\tres = FR_OK;\n\t\t\t\tif (di != 0) {\t/* Create a volume label entry */\n\t\t\t\t\tres = dir_alloc(&dj, 1);\t/* Allocate an entry */\n\t\t\t\t\tif (res == FR_OK) {\n\t\t\t\t\t\tmemset(dj.dir, 0, SZDIRE);\t/* Clean the entry */\n\t\t\t\t\t\tif (FF_FS_EXFAT && fs->fs_type == FS_EXFAT) {\n\t\t\t\t\t\t\tdj.dir[XDIR_Type] = ET_VLABEL;\t/* Create volume label entry */\n\t\t\t\t\t\t\tdj.dir[XDIR_NumLabel] = (BYTE)di;\n\t\t\t\t\t\t\tmemcpy(dj.dir + XDIR_Label, dirvn, 22);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdj.dir[DIR_Attr] = AM_VOL;\t\t/* Create volume label entry */\n\t\t\t\t\t\t\tmemcpy(dj.dir, dirvn, 11);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfs->wflag = 1;\n\t\t\t\t\t\tres = sync_fs(fs);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* !FF_FS_READONLY */\n#endif /* FF_USE_LABEL */\n\n\n\n#if FF_USE_EXPAND && !FF_FS_READONLY\n/*-----------------------------------------------------------------------*/\n/* Allocate a Contiguous Blocks to the File                              */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_expand (\n\tFIL* fp,\t\t/* Pointer to the file object */\n\tFSIZE_t fsz,\t/* File size to be expanded to */\n\tBYTE opt\t\t/* Operation mode 0:Find and prepare or 1:Find and allocate */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD n, clst, stcl, scl, ncl, tcl, lclst;\n\n\n\tres = validate(&fp->obj, &fs);\t\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\n\tif (fsz == 0 || fp->obj.objsize != 0 || !(fp->flag & FA_WRITE)) LEAVE_FF(fs, FR_DENIED);\n#if FF_FS_EXFAT\n\tif (fs->fs_type != FS_EXFAT && fsz >= 0x100000000) LEAVE_FF(fs, FR_DENIED);\t/* Check if in size limit */\n#endif\n\tn = (DWORD)fs->csize * SS(fs);\t/* Cluster size */\n\ttcl = (DWORD)(fsz / n) + ((fsz & (n - 1)) ? 1 : 0);\t/* Number of clusters required */\n\tstcl = fs->last_clst; lclst = 0;\n\tif (stcl < 2 || stcl >= fs->n_fatent) stcl = 2;\n\n#if FF_FS_EXFAT\n\tif (fs->fs_type == FS_EXFAT) {\n\t\tscl = find_bitmap(fs, stcl, tcl);\t\t\t/* Find a contiguous cluster block */\n\t\tif (scl == 0) res = FR_DENIED;\t\t\t\t/* No contiguous cluster block was found */\n\t\tif (scl == 0xFFFFFFFF) res = FR_DISK_ERR;\n\t\tif (res == FR_OK) {\t/* A contiguous free area is found */\n\t\t\tif (opt) {\t\t/* Allocate it now */\n\t\t\t\tres = change_bitmap(fs, scl, tcl, 1);\t/* Mark the cluster block 'in use' */\n\t\t\t\tlclst = scl + tcl - 1;\n\t\t\t} else {\t\t/* Set it as suggested point for next allocation */\n\t\t\t\tlclst = scl - 1;\n\t\t\t}\n\t\t}\n\t} else\n#endif\n\t{\n\t\tscl = clst = stcl; ncl = 0;\n\t\tfor (;;) {\t/* Find a contiguous cluster block */\n\t\t\tn = get_fat(&fp->obj, clst);\n\t\t\tif (++clst >= fs->n_fatent) clst = 2;\n\t\t\tif (n == 1) {\n\t\t\t\tres = FR_INT_ERR; break;\n\t\t\t}\n\t\t\tif (n == 0xFFFFFFFF) {\n\t\t\t\tres = FR_DISK_ERR; break;\n\t\t\t}\n\t\t\tif (n == 0) {\t/* Is it a free cluster? */\n\t\t\t\tif (++ncl == tcl) break;\t/* Break if a contiguous cluster block is found */\n\t\t\t} else {\n\t\t\t\tscl = clst; ncl = 0;\t\t/* Not a free cluster */\n\t\t\t}\n\t\t\tif (clst == stcl) {\t\t/* No contiguous cluster? */\n\t\t\t\tres = FR_DENIED; break;\n\t\t\t}\n\t\t}\n\t\tif (res == FR_OK) {\t/* A contiguous free area is found */\n\t\t\tif (opt) {\t\t/* Allocate it now */\n\t\t\t\tfor (clst = scl, n = tcl; n; clst++, n--) {\t/* Create a cluster chain on the FAT */\n\t\t\t\t\tres = put_fat(fs, clst, (n == 1) ? 0xFFFFFFFF : clst + 1);\n\t\t\t\t\tif (res != FR_OK) break;\n\t\t\t\t\tlclst = clst;\n\t\t\t\t}\n\t\t\t} else {\t\t/* Set it as suggested point for next allocation */\n\t\t\t\tlclst = scl - 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (res == FR_OK) {\n\t\tfs->last_clst = lclst;\t\t/* Set suggested start cluster to start next */\n\t\tif (opt) {\t/* Is it allocated now? */\n\t\t\tfp->obj.sclust = scl;\t\t/* Update object allocation information */\n\t\t\tfp->obj.objsize = fsz;\n\t\t\tif (FF_FS_EXFAT) fp->obj.stat = 2;\t/* Set status 'contiguous chain' */\n\t\t\tfp->flag |= FA_MODIFIED;\n\t\t\tif (fs->free_clst <= fs->n_fatent - 2) {\t/* Update FSINFO */\n\t\t\t\tfs->free_clst -= tcl;\n\t\t\t\tfs->fsi_flag |= 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tLEAVE_FF(fs, res);\n}\n\n#endif /* FF_USE_EXPAND && !FF_FS_READONLY */\n\n\n\n#if FF_USE_FORWARD\n/*-----------------------------------------------------------------------*/\n/* Forward Data to the Stream Directly                                   */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_forward (\n\tFIL* fp, \t\t\t\t\t\t/* Pointer to the file object */\n\tUINT (*func)(const BYTE*,UINT),\t/* Pointer to the streaming function */\n\tUINT btf,\t\t\t\t\t\t/* Number of bytes to forward */\n\tUINT* bf\t\t\t\t\t\t/* Pointer to number of bytes forwarded */\n)\n{\n\tFRESULT res;\n\tFATFS *fs;\n\tDWORD clst;\n\tLBA_t sect;\n\tFSIZE_t remain;\n\tUINT rcnt, csect;\n\tBYTE *dbuf;\n\n\n\t*bf = 0;\t/* Clear transfer byte counter */\n\tres = validate(&fp->obj, &fs);\t\t/* Check validity of the file object */\n\tif (res != FR_OK || (res = (FRESULT)fp->err) != FR_OK) LEAVE_FF(fs, res);\n\tif (!(fp->flag & FA_READ)) LEAVE_FF(fs, FR_DENIED);\t/* Check access mode */\n\n\tremain = fp->obj.objsize - fp->fptr;\n\tif (btf > remain) btf = (UINT)remain;\t\t\t/* Truncate btf by remaining bytes */\n\n\tfor ( ; btf > 0 && (*func)(0, 0); fp->fptr += rcnt, *bf += rcnt, btf -= rcnt) {\t/* Repeat until all data transferred or stream goes busy */\n\t\tcsect = (UINT)(fp->fptr / SS(fs) & (fs->csize - 1));\t/* Sector offset in the cluster */\n\t\tif (fp->fptr % SS(fs) == 0) {\t\t\t\t/* On the sector boundary? */\n\t\t\tif (csect == 0) {\t\t\t\t\t\t/* On the cluster boundary? */\n\t\t\t\tclst = (fp->fptr == 0) ?\t\t\t/* On the top of the file? */\n\t\t\t\t\tfp->obj.sclust : get_fat(&fp->obj, fp->clust);\n\t\t\t\tif (clst <= 1) ABORT(fs, FR_INT_ERR);\n\t\t\t\tif (clst == 0xFFFFFFFF) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->clust = clst;\t\t\t\t\t/* Update current cluster */\n\t\t\t}\n\t\t}\n\t\tsect = clst2sect(fs, fp->clust);\t\t\t/* Get current data sector */\n\t\tif (sect == 0) ABORT(fs, FR_INT_ERR);\n\t\tsect += csect;\n#if FF_FS_TINY\n\t\tif (move_window(fs, sect) != FR_OK) ABORT(fs, FR_DISK_ERR);\t/* Move sector window to the file data */\n\t\tdbuf = fs->win;\n#else\n\t\tif (fp->sect != sect) {\t\t/* Fill sector cache with file data */\n#if !FF_FS_READONLY\n\t\t\tif (fp->flag & FA_DIRTY) {\t\t/* Write-back dirty sector cache */\n\t\t\t\tif (disk_write(fs->pdrv, fp->buf, fp->sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t\t\tfp->flag &= (BYTE)~FA_DIRTY;\n\t\t\t}\n#endif\n\t\t\tif (disk_read(fs->pdrv, fp->buf, sect, 1) != RES_OK) ABORT(fs, FR_DISK_ERR);\n\t\t}\n\t\tdbuf = fp->buf;\n#endif\n\t\tfp->sect = sect;\n\t\trcnt = SS(fs) - (UINT)fp->fptr % SS(fs);\t/* Number of bytes remains in the sector */\n\t\tif (rcnt > btf) rcnt = btf;\t\t\t\t\t/* Clip it by btr if needed */\n\t\trcnt = (*func)(dbuf + ((UINT)fp->fptr % SS(fs)), rcnt);\t/* Forward the file data */\n\t\tif (rcnt == 0) ABORT(fs, FR_INT_ERR);\n\t}\n\n\tLEAVE_FF(fs, FR_OK);\n}\n#endif /* FF_USE_FORWARD */\n\n\n\n#if !FF_FS_READONLY && FF_USE_MKFS\n/*-----------------------------------------------------------------------*/\n/* Create FAT/exFAT volume (with sub-functions)                          */\n/*-----------------------------------------------------------------------*/\n\n#define N_SEC_TRACK 63\t\t\t/* Sectors per track for determination of drive CHS */\n#define\tGPT_ALIGN\t0x100000\t/* Alignment of partitions in GPT [byte] (>=128KB) */\n#define GPT_ITEMS\t128\t\t\t/* Number of GPT table size (>=128, sector aligned) */\n\n\n/* Create partitions on the physical drive in format of MBR or GPT */\n\nstatic FRESULT create_partition (\n\tBYTE drv,\t\t\t/* Physical drive number */\n\tconst LBA_t plst[],\t/* Partition list */\n\tBYTE sys,\t\t\t/* System ID for each partition (for only MBR) */\n\tBYTE *buf\t\t\t/* Working buffer for a sector */\n)\n{\n\tUINT i, cy;\n\tLBA_t sz_drv;\n\tDWORD sz_drv32, nxt_alloc32, sz_part32;\n\tBYTE *pte;\n\tBYTE hd, n_hd, sc, n_sc;\n\n\t/* Get physical drive size */\n\tif (disk_ioctl(drv, GET_SECTOR_COUNT, &sz_drv) != RES_OK) return FR_DISK_ERR;\n\n#if FF_LBA64\n\tif (sz_drv >= FF_MIN_GPT) {\t/* Create partitions in GPT format */\n\t\tWORD ss;\n\t\tUINT sz_ptbl, pi, si, ofs;\n\t\tDWORD bcc, rnd, align;\n\t\tQWORD nxt_alloc, sz_part, sz_pool, top_bpt;\n\t\tstatic const BYTE gpt_mbr[16] = {0x00, 0x00, 0x02, 0x00, 0xEE, 0xFE, 0xFF, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF};\n\n#if FF_MAX_SS != FF_MIN_SS\n\t\tif (disk_ioctl(drv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR;\t/* Get sector size */\n\t\tif (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR;\n#else\n\t\tss = FF_MAX_SS;\n#endif\n\t\trnd = (DWORD)sz_drv + GET_FATTIME();\t/* Random seed */\n\t\talign = GPT_ALIGN / ss;\t\t\t\t/* Partition alignment for GPT [sector] */\n\t\tsz_ptbl = GPT_ITEMS * SZ_GPTE / ss;\t/* Size of partition table [sector] */\n\t\ttop_bpt = sz_drv - sz_ptbl - 1;\t\t/* Backup partition table start sector */\n\t\tnxt_alloc = 2 + sz_ptbl;\t\t\t/* First allocatable sector */\n\t\tsz_pool = top_bpt - nxt_alloc;\t\t/* Size of allocatable area */\n\t\tbcc = 0xFFFFFFFF; sz_part = 1;\n\t\tpi = si = 0;\t/* partition table index, size table index */\n\t\tdo {\n\t\t\tif (pi * SZ_GPTE % ss == 0) memset(buf, 0, ss);\t/* Clean the buffer if needed */\n\t\t\tif (sz_part != 0) {\t\t\t\t/* Is the size table not termintated? */\n\t\t\t\tnxt_alloc = (nxt_alloc + align - 1) & ((QWORD)0 - align);\t/* Align partition start */\n\t\t\t\tsz_part = plst[si++];\t\t/* Get a partition size */\n\t\t\t\tif (sz_part <= 100) {\t\t/* Is the size in percentage? */\n\t\t\t\t\tsz_part = sz_pool * sz_part / 100;\n\t\t\t\t\tsz_part = (sz_part + align - 1) & ((QWORD)0 - align);\t/* Align partition end (only if in percentage) */\n\t\t\t\t}\n\t\t\t\tif (nxt_alloc + sz_part > top_bpt) {\t/* Clip the size at end of the pool */\n\t\t\t\t\tsz_part = (nxt_alloc < top_bpt) ? top_bpt - nxt_alloc : 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (sz_part != 0) {\t\t\t\t/* Add a partition? */\n\t\t\t\tofs = pi * SZ_GPTE % ss;\n\t\t\t\tmemcpy(buf + ofs + GPTE_PtGuid, GUID_MS_Basic, 16);\t/* Set partition GUID (Microsoft Basic Data) */\n\t\t\t\trnd = make_rand(rnd, buf + ofs + GPTE_UpGuid, 16);\t/* Set unique partition GUID */\n\t\t\t\tst_qword(buf + ofs + GPTE_FstLba, nxt_alloc);\t\t/* Set partition start sector */\n\t\t\t\tst_qword(buf + ofs + GPTE_LstLba, nxt_alloc + sz_part - 1);\t/* Set partition end sector */\n\t\t\t\tnxt_alloc += sz_part;\t\t\t\t\t\t\t\t/* Next allocatable sector */\n\t\t\t}\n\t\t\tif ((pi + 1) * SZ_GPTE % ss == 0) {\t\t/* Write the buffer if it is filled up */\n\t\t\t\tfor (i = 0; i < ss; bcc = crc32(bcc, buf[i++])) ;\t/* Calculate table check sum */\n\t\t\t\tif (disk_write(drv, buf, 2 + pi * SZ_GPTE / ss, 1) != RES_OK) return FR_DISK_ERR;\t\t/* Write to primary table */\n\t\t\t\tif (disk_write(drv, buf, top_bpt + pi * SZ_GPTE / ss, 1) != RES_OK) return FR_DISK_ERR;\t/* Write to secondary table */\n\t\t\t}\n\t\t} while (++pi < GPT_ITEMS);\n\n\t\t/* Create primary GPT header */\n\t\tmemset(buf, 0, ss);\n\t\tmemcpy(buf + GPTH_Sign, \"EFI PART\" \"\\0\\0\\1\\0\" \"\\x5C\\0\\0\", 16);\t/* Signature, version (1.0) and size (92) */\n\t\tst_dword(buf + GPTH_PtBcc, ~bcc);\t\t\t/* Table check sum */\n\t\tst_qword(buf + GPTH_CurLba, 1);\t\t\t\t/* LBA of this header */\n\t\tst_qword(buf + GPTH_BakLba, sz_drv - 1);\t/* LBA of secondary header */\n\t\tst_qword(buf + GPTH_FstLba, 2 + sz_ptbl);\t/* LBA of first allocatable sector */\n\t\tst_qword(buf + GPTH_LstLba, top_bpt - 1);\t/* LBA of last allocatable sector */\n\t\tst_dword(buf + GPTH_PteSize, SZ_GPTE);\t\t/* Size of a table entry */\n\t\tst_dword(buf + GPTH_PtNum, GPT_ITEMS);\t\t/* Number of table entries */\n\t\tst_dword(buf + GPTH_PtOfs, 2);\t\t\t\t/* LBA of this table */\n\t\trnd = make_rand(rnd, buf + GPTH_DskGuid, 16);\t/* Disk GUID */\n\t\tfor (i = 0, bcc= 0xFFFFFFFF; i < 92; bcc = crc32(bcc, buf[i++])) ;\t/* Calculate header check sum */\n\t\tst_dword(buf + GPTH_Bcc, ~bcc);\t\t\t\t/* Header check sum */\n\t\tif (disk_write(drv, buf, 1, 1) != RES_OK) return FR_DISK_ERR;\n\n\t\t/* Create secondary GPT header */\n\t\tst_qword(buf + GPTH_CurLba, sz_drv - 1);\t/* LBA of this header */\n\t\tst_qword(buf + GPTH_BakLba, 1);\t\t\t\t/* LBA of primary header */\n\t\tst_qword(buf + GPTH_PtOfs, top_bpt);\t\t/* LBA of this table */\n\t\tst_dword(buf + GPTH_Bcc, 0);\n\t\tfor (i = 0, bcc= 0xFFFFFFFF; i < 92; bcc = crc32(bcc, buf[i++])) ;\t/* Calculate header check sum */\n\t\tst_dword(buf + GPTH_Bcc, ~bcc);\t\t\t\t/* Header check sum */\n\t\tif (disk_write(drv, buf, sz_drv - 1, 1) != RES_OK) return FR_DISK_ERR;\n\n\t\t/* Create protective MBR */\n\t\tmemset(buf, 0, ss);\n\t\tmemcpy(buf + MBR_Table, gpt_mbr, 16);\t\t/* Create a GPT partition */\n\t\tst_word(buf + BS_55AA, 0xAA55);\n\t\tif (disk_write(drv, buf, 0, 1) != RES_OK) return FR_DISK_ERR;\n\n\t} else\n#endif\n\t{\t/* Create partitions in MBR format */\n\t\tsz_drv32 = (DWORD)sz_drv;\n\t\tn_sc = N_SEC_TRACK;\t\t\t\t/* Determine drive CHS without any consideration of the drive geometry */\n\t\tfor (n_hd = 8; n_hd != 0 && sz_drv32 / n_hd / n_sc > 1024; n_hd *= 2) ;\n\t\tif (n_hd == 0) n_hd = 255;\t\t/* Number of heads needs to be <256 */\n\n\t\tmemset(buf, 0, FF_MAX_SS);\t\t/* Clear MBR */\n\t\tpte = buf + MBR_Table;\t/* Partition table in the MBR */\n\t\tfor (i = 0, nxt_alloc32 = n_sc; i < 4 && nxt_alloc32 != 0 && nxt_alloc32 < sz_drv32; i++, nxt_alloc32 += sz_part32) {\n\t\t\tsz_part32 = (DWORD)plst[i];\t/* Get partition size */\n\t\t\tif (sz_part32 <= 100) sz_part32 = (sz_part32 == 100) ? sz_drv32 : sz_drv32 / 100 * sz_part32;\t/* Size in percentage? */\n\t\t\tif (nxt_alloc32 + sz_part32 > sz_drv32 || nxt_alloc32 + sz_part32 < nxt_alloc32) sz_part32 = sz_drv32 - nxt_alloc32;\t/* Clip at drive size */\n\t\t\tif (sz_part32 == 0) break;\t/* End of table or no sector to allocate? */\n\n\t\t\tst_dword(pte + PTE_StLba, nxt_alloc32);\t/* Start LBA */\n\t\t\tst_dword(pte + PTE_SizLba, sz_part32);\t/* Number of sectors */\n\t\t\tpte[PTE_System] = sys;\t\t\t\t\t/* System type */\n\n\t\t\tcy = (UINT)(nxt_alloc32 / n_sc / n_hd);\t/* Start cylinder */\n\t\t\thd = (BYTE)(nxt_alloc32 / n_sc % n_hd);\t/* Start head */\n\t\t\tsc = (BYTE)(nxt_alloc32 % n_sc + 1);\t/* Start sector */\n\t\t\tpte[PTE_StHead] = hd;\n\t\t\tpte[PTE_StSec] = (BYTE)((cy >> 2 & 0xC0) | sc);\n\t\t\tpte[PTE_StCyl] = (BYTE)cy;\n\n\t\t\tcy = (UINT)((nxt_alloc32 + sz_part32 - 1) / n_sc / n_hd);\t/* End cylinder */\n\t\t\thd = (BYTE)((nxt_alloc32 + sz_part32 - 1) / n_sc % n_hd);\t/* End head */\n\t\t\tsc = (BYTE)((nxt_alloc32 + sz_part32 - 1) % n_sc + 1);\t\t/* End sector */\n\t\t\tpte[PTE_EdHead] = hd;\n\t\t\tpte[PTE_EdSec] = (BYTE)((cy >> 2 & 0xC0) | sc);\n\t\t\tpte[PTE_EdCyl] = (BYTE)cy;\n\n\t\t\tpte += SZ_PTE;\t\t/* Next entry */\n\t\t}\n\n\t\tst_word(buf + BS_55AA, 0xAA55);\t\t/* MBR signature */\n\t\tif (disk_write(drv, buf, 0, 1) != RES_OK) return FR_DISK_ERR;\t/* Write it to the MBR */\n\t}\n\n\treturn FR_OK;\n}\n\n\n\nFRESULT f_mkfs (\n\tconst TCHAR* path,\t\t/* Logical drive number */\n\tconst MKFS_PARM* opt,\t/* Format options */\n\tvoid* work,\t\t\t\t/* Pointer to working buffer (null: use len bytes of heap memory) */\n\tUINT len\t\t\t\t/* Size of working buffer [byte] */\n)\n{\n\tstatic const WORD cst[] = {1, 4, 16, 64, 256, 512, 0};\t/* Cluster size boundary for FAT volume (4Ks unit) */\n\tstatic const WORD cst32[] = {1, 2, 4, 8, 16, 32, 0};\t/* Cluster size boundary for FAT32 volume (128Ks unit) */\n\tstatic const MKFS_PARM defopt = {FM_ANY, 0, 0, 0, 0};\t/* Default parameter */\n\tBYTE fsopt, fsty, sys, pdrv, ipart;\n\tBYTE *buf;\n\tBYTE *pte;\n\tWORD ss;\t/* Sector size */\n\tDWORD sz_buf, sz_blk, n_clst, pau, nsect, n, vsn;\n\tLBA_t sz_vol, b_vol, b_fat, b_data;\t\t/* Size of volume, Base LBA of volume, fat, data */\n\tLBA_t sect, lba[2];\n\tDWORD sz_rsv, sz_fat, sz_dir, sz_au;\t/* Size of reserved, fat, dir, data, cluster */\n\tUINT n_fat, n_root, i;\t\t\t\t\t/* Index, Number of FATs and Number of roor dir entries */\n\tint vol;\n\tDSTATUS ds;\n\tFRESULT res;\n\n\n\t/* Check mounted drive and clear work area */\n\tvol = get_ldnumber(&path);\t\t\t\t\t/* Get target logical drive */\n\tif (vol < 0) return FR_INVALID_DRIVE;\n\tif (FatFs[vol]) FatFs[vol]->fs_type = 0;\t/* Clear the fs object if mounted */\n\tpdrv = LD2PD(vol);\t\t/* Hosting physical drive */\n\tipart = LD2PT(vol);\t\t/* Hosting partition (0:create as new, 1..:existing partition) */\n\n\t/* Initialize the hosting physical drive */\n\tds = disk_initialize(pdrv);\n\tif (ds & STA_NOINIT) return FR_NOT_READY;\n\tif (ds & STA_PROTECT) return FR_WRITE_PROTECTED;\n\n\t/* Get physical drive parameters (sz_drv, sz_blk and ss) */\n\tif (!opt) opt = &defopt;\t/* Use default parameter if it is not given */\n\tsz_blk = opt->align;\n\tif (sz_blk == 0) disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_blk);\t\t\t\t\t/* Block size from the paramter or lower layer */\n \tif (sz_blk == 0 || sz_blk > 0x8000 || (sz_blk & (sz_blk - 1))) sz_blk = 1;\t/* Use default if the block size is invalid */\n#if FF_MAX_SS != FF_MIN_SS\n\tif (disk_ioctl(pdrv, GET_SECTOR_SIZE, &ss) != RES_OK) return FR_DISK_ERR;\n\tif (ss > FF_MAX_SS || ss < FF_MIN_SS || (ss & (ss - 1))) return FR_DISK_ERR;\n#else\n\tss = FF_MAX_SS;\n#endif\n\n\t/* Options for FAT sub-type and FAT parameters */\n\tfsopt = opt->fmt & (FM_ANY | FM_SFD);\n\tn_fat = (opt->n_fat >= 1 && opt->n_fat <= 2) ? opt->n_fat : 1;\n\tn_root = (opt->n_root >= 1 && opt->n_root <= 32768 && (opt->n_root % (ss / SZDIRE)) == 0) ? opt->n_root : 512;\n\tsz_au = (opt->au_size <= 0x1000000 && (opt->au_size & (opt->au_size - 1)) == 0) ? opt->au_size : 0;\n\tsz_au /= ss;\t/* Byte --> Sector */\n\n\t/* Get working buffer */\n\tsz_buf = len / ss;\t\t/* Size of working buffer [sector] */\n\tif (sz_buf == 0) return FR_NOT_ENOUGH_CORE;\n\tbuf = (BYTE*)work;\t\t/* Working buffer */\n#if FF_USE_LFN == 3\n\tif (!buf) buf = ff_memalloc(sz_buf * ss);\t/* Use heap memory for working buffer */\n#endif\n\tif (!buf) return FR_NOT_ENOUGH_CORE;\n\n\t/* Determine where the volume to be located (b_vol, sz_vol) */\n\tb_vol = sz_vol = 0;\n\tif (FF_MULTI_PARTITION && ipart != 0) {\t/* Is the volume associated with any specific partition? */\n\t\t/* Get partition location from the existing partition table */\n\t\tif (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Load MBR */\n\t\tif (ld_word(buf + BS_55AA) != 0xAA55) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Check if MBR is valid */\n#if FF_LBA64\n\t\tif (buf[MBR_Table + PTE_System] == 0xEE) {\t/* GPT protective MBR? */\n\t\t\tDWORD n_ent, ofs;\n\t\t\tQWORD pt_lba;\n\n\t\t\t/* Get the partition location from GPT */\n\t\t\tif (disk_read(pdrv, buf, 1, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Load GPT header sector (next to MBR) */\n\t\t\tif (!test_gpt_header(buf)) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Check if GPT header is valid */\n\t\t\tn_ent = ld_dword(buf + GPTH_PtNum);\t\t/* Number of entries */\n\t\t\tpt_lba = ld_qword(buf + GPTH_PtOfs);\t/* Table start sector */\n\t\t\tofs = i = 0;\n\t\t\twhile (n_ent) {\t\t/* Find MS Basic partition with order of ipart */\n\t\t\t\tif (ofs == 0 && disk_read(pdrv, buf, pt_lba++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Get PT sector */\n\t\t\t\tif (!memcmp(buf + ofs + GPTE_PtGuid, GUID_MS_Basic, 16) && ++i == ipart) {\t/* MS basic data partition? */\n\t\t\t\t\tb_vol = ld_qword(buf + ofs + GPTE_FstLba);\n\t\t\t\t\tsz_vol = ld_qword(buf + ofs + GPTE_LstLba) - b_vol + 1;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tn_ent--; ofs = (ofs + SZ_GPTE) % ss;\t/* Next entry */\n\t\t\t}\n\t\t\tif (n_ent == 0) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Partition not found */\n\t\t\tfsopt |= 0x80;\t/* Partitioning is in GPT */\n\t\t} else\n#endif\n\t\t{\t/* Get the partition location from MBR partition table */\n\t\t\tpte = buf + (MBR_Table + (ipart - 1) * SZ_PTE);\n\t\t\tif (ipart > 4 || pte[PTE_System] == 0) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* No partition? */\n\t\t\tb_vol = ld_dword(pte + PTE_StLba);\t\t/* Get volume start sector */\n\t\t\tsz_vol = ld_dword(pte + PTE_SizLba);\t/* Get volume size */\n\t\t}\n\t} else {\t/* The volume is associated with a physical drive */\n\t\tif (disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_vol) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\tif (!(fsopt & FM_SFD)) {\t/* To be partitioned? */\n\t\t\t/* Create a single-partition on the drive in this function */\n#if FF_LBA64\n\t\t\tif (sz_vol >= FF_MIN_GPT) {\t/* Which partition type to create, MBR or GPT? */\n\t\t\t\tfsopt |= 0x80;\t\t/* Partitioning is in GPT */\n\t\t\t\tb_vol = GPT_ALIGN / ss; sz_vol -= b_vol + GPT_ITEMS * SZ_GPTE / ss + 1;\t/* Estimated partition offset and size */\n\t\t\t} else\n#endif\n\t\t\t{\t/* Partitioning is in MBR */\n\t\t\t\tif (sz_vol > N_SEC_TRACK) {\n\t\t\t\t\tb_vol = N_SEC_TRACK; sz_vol -= b_vol;\t/* Estimated partition offset and size */\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif (sz_vol < 128) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Check if volume size is >=128s */\n\n\t/* Now start to create an FAT volume at b_vol and sz_vol */\n\n\tdo {\t/* Pre-determine the FAT type */\n\t\tif (FF_FS_EXFAT && (fsopt & FM_EXFAT)) {\t/* exFAT possible? */\n\t\t\tif ((fsopt & FM_ANY) == FM_EXFAT || sz_vol >= 0x4000000 || sz_au > 128) {\t/* exFAT only, vol >= 64MS or sz_au > 128S ? */\n\t\t\t\tfsty = FS_EXFAT; break;\n\t\t\t}\n\t\t}\n#if FF_LBA64\n\t\tif (sz_vol >= 0x100000000) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too large volume for FAT/FAT32 */\n#endif\n\t\tif (sz_au > 128) sz_au = 128;\t/* Invalid AU for FAT/FAT32? */\n\t\tif (fsopt & FM_FAT32) {\t/* FAT32 possible? */\n\t\t\tif (!(fsopt & FM_FAT)) {\t/* no-FAT? */\n\t\t\t\tfsty = FS_FAT32; break;\n\t\t\t}\n\t\t}\n\t\tif (!(fsopt & FM_FAT)) LEAVE_MKFS(FR_INVALID_PARAMETER);\t/* no-FAT? */\n\t\tfsty = FS_FAT16;\n\t} while (0);\n\n\tvsn = (DWORD)sz_vol + GET_FATTIME();\t/* VSN generated from current time and partitiion size */\n\n#if FF_FS_EXFAT\n\tif (fsty == FS_EXFAT) {\t/* Create an exFAT volume */\n\t\tDWORD szb_bit, szb_case, sum, nbit, clu, clen[3];\n\t\tWCHAR ch, si;\n\t\tUINT j, st;\n\n\t\tif (sz_vol < 0x1000) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too small volume for exFAT? */\n#if FF_USE_TRIM\n\t\tlba[0] = b_vol; lba[1] = b_vol + sz_vol - 1;\t/* Inform storage device that the volume area may be erased */\n\t\tdisk_ioctl(pdrv, CTRL_TRIM, lba);\n#endif\n\t\t/* Determine FAT location, data location and number of clusters */\n\t\tif (sz_au == 0) {\t/* AU auto-selection */\n\t\t\tsz_au = 8;\n\t\t\tif (sz_vol >= 0x80000) sz_au = 64;\t\t/* >= 512Ks */\n\t\t\tif (sz_vol >= 0x4000000) sz_au = 256;\t/* >= 64Ms */\n\t\t}\n\t\tb_fat = b_vol + 32;\t\t\t\t\t\t\t\t\t\t/* FAT start at offset 32 */\n\t\tsz_fat = (DWORD)((sz_vol / sz_au + 2) * 4 + ss - 1) / ss;\t/* Number of FAT sectors */\n\t\tb_data = (b_fat + sz_fat + sz_blk - 1) & ~((LBA_t)sz_blk - 1);\t/* Align data area to the erase block boundary */\n\t\tif (b_data - b_vol >= sz_vol / 2) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too small volume? */\n\t\tn_clst = (DWORD)((sz_vol - (b_data - b_vol)) / sz_au);\t/* Number of clusters */\n\t\tif (n_clst <16) LEAVE_MKFS(FR_MKFS_ABORTED);\t\t\t/* Too few clusters? */\n\t\tif (n_clst > MAX_EXFAT) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too many clusters? */\n\n\t\tszb_bit = (n_clst + 7) / 8;\t\t\t\t\t\t\t\t/* Size of allocation bitmap */\n\t\tclen[0] = (szb_bit + sz_au * ss - 1) / (sz_au * ss);\t/* Number of allocation bitmap clusters */\n\n\t\t/* Create a compressed up-case table */\n\t\tsect = b_data + sz_au * clen[0];\t/* Table start sector */\n\t\tsum = 0;\t\t\t\t\t\t\t/* Table checksum to be stored in the 82 entry */\n\t\tst = 0; si = 0; i = 0; j = 0; szb_case = 0;\n\t\tdo {\n\t\t\tswitch (st) {\n\t\t\tcase 0:\n\t\t\t\tch = (WCHAR)ff_wtoupper(si);\t/* Get an up-case char */\n\t\t\t\tif (ch != si) {\n\t\t\t\t\tsi++; break;\t\t/* Store the up-case char if exist */\n\t\t\t\t}\n\t\t\t\tfor (j = 1; (WCHAR)(si + j) && (WCHAR)(si + j) == ff_wtoupper((WCHAR)(si + j)); j++) ;\t/* Get run length of no-case block */\n\t\t\t\tif (j >= 128) {\n\t\t\t\t\tch = 0xFFFF; st = 2; break;\t/* Compress the no-case block if run is >= 128 chars */\n\t\t\t\t}\n\t\t\t\tst = 1;\t\t\t/* Do not compress short run */\n\t\t\t\t/* FALLTHROUGH */\n\t\t\tcase 1:\n\t\t\t\tch = si++;\t\t/* Fill the short run */\n\t\t\t\tif (--j == 0) st = 0;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tch = (WCHAR)j; si += (WCHAR)j;\t/* Number of chars to skip */\n\t\t\t\tst = 0;\n\t\t\t}\n\t\t\tsum = xsum32(buf[i + 0] = (BYTE)ch, sum);\t/* Put it into the write buffer */\n\t\t\tsum = xsum32(buf[i + 1] = (BYTE)(ch >> 8), sum);\n\t\t\ti += 2; szb_case += 2;\n\t\t\tif (si == 0 || i == sz_buf * ss) {\t\t/* Write buffered data when buffer full or end of process */\n\t\t\t\tn = (i + ss - 1) / ss;\n\t\t\t\tif (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t\tsect += n; i = 0;\n\t\t\t}\n\t\t} while (si);\n\t\tclen[1] = (szb_case + sz_au * ss - 1) / (sz_au * ss);\t/* Number of up-case table clusters */\n\t\tclen[2] = 1;\t/* Number of root dir clusters */\n\n\t\t/* Initialize the allocation bitmap */\n\t\tsect = b_data; nsect = (szb_bit + ss - 1) / ss;\t/* Start of bitmap and number of bitmap sectors */\n\t\tnbit = clen[0] + clen[1] + clen[2];\t\t\t\t/* Number of clusters in-use by system (bitmap, up-case and root-dir) */\n\t\tdo {\n\t\t\tmemset(buf, 0, sz_buf * ss);\t\t\t\t/* Initialize bitmap buffer */\n\t\t\tfor (i = 0; nbit != 0 && i / 8 < sz_buf * ss; buf[i / 8] |= 1 << (i % 8), i++, nbit--) ;\t/* Mark used clusters */\n\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\t\t/* Write the buffered data */\n\t\t\tif (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\tsect += n; nsect -= n;\n\t\t} while (nsect);\n\n\t\t/* Initialize the FAT */\n\t\tsect = b_fat; nsect = sz_fat;\t/* Start of FAT and number of FAT sectors */\n\t\tj = nbit = clu = 0;\n\t\tdo {\n\t\t\tmemset(buf, 0, sz_buf * ss); i = 0;\t/* Clear work area and reset write offset */\n\t\t\tif (clu == 0) {\t/* Initialize FAT [0] and FAT[1] */\n\t\t\t\tst_dword(buf + i, 0xFFFFFFF8); i += 4; clu++;\n\t\t\t\tst_dword(buf + i, 0xFFFFFFFF); i += 4; clu++;\n\t\t\t}\n\t\t\tdo {\t\t\t/* Create chains of bitmap, up-case and root dir */\n\t\t\t\twhile (nbit != 0 && i < sz_buf * ss) {\t/* Create a chain */\n\t\t\t\t\tst_dword(buf + i, (nbit > 1) ? clu + 1 : 0xFFFFFFFF);\n\t\t\t\t\ti += 4; clu++; nbit--;\n\t\t\t\t}\n\t\t\t\tif (nbit == 0 && j < 3) nbit = clen[j++];\t/* Get next chain length */\n\t\t\t} while (nbit != 0 && i < sz_buf * ss);\n\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\t/* Write the buffered data */\n\t\t\tif (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\tsect += n; nsect -= n;\n\t\t} while (nsect);\n\n\t\t/* Initialize the root directory */\n\t\tmemset(buf, 0, sz_buf * ss);\n\t\tbuf[SZDIRE * 0 + 0] = ET_VLABEL;\t\t\t\t/* Volume label entry (no label) */\n\t\tbuf[SZDIRE * 1 + 0] = ET_BITMAP;\t\t\t\t/* Bitmap entry */\n\t\tst_dword(buf + SZDIRE * 1 + 20, 2);\t\t\t\t/*  cluster */\n\t\tst_dword(buf + SZDIRE * 1 + 24, szb_bit);\t\t/*  size */\n\t\tbuf[SZDIRE * 2 + 0] = ET_UPCASE;\t\t\t\t/* Up-case table entry */\n\t\tst_dword(buf + SZDIRE * 2 + 4, sum);\t\t\t/*  sum */\n\t\tst_dword(buf + SZDIRE * 2 + 20, 2 + clen[0]);\t/*  cluster */\n\t\tst_dword(buf + SZDIRE * 2 + 24, szb_case);\t\t/*  size */\n\t\tsect = b_data + sz_au * (clen[0] + clen[1]); nsect = sz_au;\t/* Start of the root directory and number of sectors */\n\t\tdo {\t/* Fill root directory sectors */\n\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\n\t\t\tif (disk_write(pdrv, buf, sect, n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\tmemset(buf, 0, ss);\t/* Rest of entries are filled with zero */\n\t\t\tsect += n; nsect -= n;\n\t\t} while (nsect);\n\n\t\t/* Create two set of the exFAT VBR blocks */\n\t\tsect = b_vol;\n\t\tfor (n = 0; n < 2; n++) {\n\t\t\t/* Main record (+0) */\n\t\t\tmemset(buf, 0, ss);\n\t\t\tmemcpy(buf + BS_JmpBoot, \"\\xEB\\x76\\x90\" \"EXFAT   \", 11);\t/* Boot jump code (x86), OEM name */\n\t\t\tst_qword(buf + BPB_VolOfsEx, b_vol);\t\t\t\t\t/* Volume offset in the physical drive [sector] */\n\t\t\tst_qword(buf + BPB_TotSecEx, sz_vol);\t\t\t\t\t/* Volume size [sector] */\n\t\t\tst_dword(buf + BPB_FatOfsEx, (DWORD)(b_fat - b_vol));\t/* FAT offset [sector] */\n\t\t\tst_dword(buf + BPB_FatSzEx, sz_fat);\t\t\t\t\t/* FAT size [sector] */\n\t\t\tst_dword(buf + BPB_DataOfsEx, (DWORD)(b_data - b_vol));\t/* Data offset [sector] */\n\t\t\tst_dword(buf + BPB_NumClusEx, n_clst);\t\t\t\t\t/* Number of clusters */\n\t\t\tst_dword(buf + BPB_RootClusEx, 2 + clen[0] + clen[1]);\t/* Root dir cluster # */\n\t\t\tst_dword(buf + BPB_VolIDEx, vsn);\t\t\t\t\t\t/* VSN */\n\t\t\tst_word(buf + BPB_FSVerEx, 0x100);\t\t\t\t\t\t/* Filesystem version (1.00) */\n\t\t\tfor (buf[BPB_BytsPerSecEx] = 0, i = ss; i >>= 1; buf[BPB_BytsPerSecEx]++) ;\t/* Log2 of sector size [byte] */\n\t\t\tfor (buf[BPB_SecPerClusEx] = 0, i = sz_au; i >>= 1; buf[BPB_SecPerClusEx]++) ;\t/* Log2 of cluster size [sector] */\n\t\t\tbuf[BPB_NumFATsEx] = 1;\t\t\t\t\t/* Number of FATs */\n\t\t\tbuf[BPB_DrvNumEx] = 0x80;\t\t\t\t/* Drive number (for int13) */\n\t\t\tst_word(buf + BS_BootCodeEx, 0xFEEB);\t/* Boot code (x86) */\n\t\t\tst_word(buf + BS_55AA, 0xAA55);\t\t\t/* Signature (placed here regardless of sector size) */\n\t\t\tfor (i = sum = 0; i < ss; i++) {\t\t/* VBR checksum */\n\t\t\t\tif (i != BPB_VolFlagEx && i != BPB_VolFlagEx + 1 && i != BPB_PercInUseEx) sum = xsum32(buf[i], sum);\n\t\t\t}\n\t\t\tif (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t/* Extended bootstrap record (+1..+8) */\n\t\t\tmemset(buf, 0, ss);\n\t\t\tst_word(buf + ss - 2, 0xAA55);\t/* Signature (placed at end of sector) */\n\t\t\tfor (j = 1; j < 9; j++) {\n\t\t\t\tfor (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ;\t/* VBR checksum */\n\t\t\t\tif (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t}\n\t\t\t/* OEM/Reserved record (+9..+10) */\n\t\t\tmemset(buf, 0, ss);\n\t\t\tfor ( ; j < 11; j++) {\n\t\t\t\tfor (i = 0; i < ss; sum = xsum32(buf[i++], sum)) ;\t/* VBR checksum */\n\t\t\t\tif (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t}\n\t\t\t/* Sum record (+11) */\n\t\t\tfor (i = 0; i < ss; i += 4) st_dword(buf + i, sum);\t\t/* Fill with checksum value */\n\t\t\tif (disk_write(pdrv, buf, sect++, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t}\n\n\t} else\n#endif\t/* FF_FS_EXFAT */\n\t{\t/* Create an FAT/FAT32 volume */\n\t\tdo {\n\t\t\tpau = sz_au;\n\t\t\t/* Pre-determine number of clusters and FAT sub-type */\n\t\t\tif (fsty == FS_FAT32) {\t/* FAT32 volume */\n\t\t\t\tif (pau == 0) {\t/* AU auto-selection */\n\t\t\t\t\tn = (DWORD)sz_vol / 0x20000;\t/* Volume size in unit of 128KS */\n\t\t\t\t\tfor (i = 0, pau = 1; cst32[i] && cst32[i] <= n; i++, pau <<= 1) ;\t/* Get from table */\n\t\t\t\t}\n\t\t\t\tn_clst = (DWORD)sz_vol / pau;\t/* Number of clusters */\n\t\t\t\tsz_fat = (n_clst * 4 + 8 + ss - 1) / ss;\t/* FAT size [sector] */\n\t\t\t\tsz_rsv = 32;\t/* Number of reserved sectors */\n\t\t\t\tsz_dir = 0;\t\t/* No static directory */\n\t\t\t\tif (n_clst <= MAX_FAT16 || n_clst > MAX_FAT32) LEAVE_MKFS(FR_MKFS_ABORTED);\n\t\t\t} else {\t\t\t\t/* FAT volume */\n\t\t\t\tif (pau == 0) {\t/* au auto-selection */\n\t\t\t\t\tn = (DWORD)sz_vol / 0x1000;\t/* Volume size in unit of 4KS */\n\t\t\t\t\tfor (i = 0, pau = 1; cst[i] && cst[i] <= n; i++, pau <<= 1) ;\t/* Get from table */\n\t\t\t\t}\n\t\t\t\tn_clst = (DWORD)sz_vol / pau;\n\t\t\t\tif (n_clst > MAX_FAT12) {\n\t\t\t\t\tn = n_clst * 2 + 4;\t\t/* FAT size [byte] */\n\t\t\t\t} else {\n\t\t\t\t\tfsty = FS_FAT12;\n\t\t\t\t\tn = (n_clst * 3 + 1) / 2 + 3;\t/* FAT size [byte] */\n\t\t\t\t}\n\t\t\t\tsz_fat = (n + ss - 1) / ss;\t\t/* FAT size [sector] */\n\t\t\t\tsz_rsv = 1;\t\t\t\t\t\t/* Number of reserved sectors */\n\t\t\t\tsz_dir = (DWORD)n_root * SZDIRE / ss;\t/* Root dir size [sector] */\n\t\t\t}\n\t\t\tb_fat = b_vol + sz_rsv;\t\t\t\t\t\t/* FAT base */\n\t\t\tb_data = b_fat + sz_fat * n_fat + sz_dir;\t/* Data base */\n\n\t\t\t/* Align data area to erase block boundary (for flash memory media) */\n\t\t\tn = (DWORD)(((b_data + sz_blk - 1) & ~(sz_blk - 1)) - b_data);\t/* Sectors to next nearest from current data base */\n\t\t\tif (fsty == FS_FAT32) {\t\t/* FAT32: Move FAT */\n\t\t\t\tsz_rsv += n; b_fat += n;\n\t\t\t} else {\t\t\t\t\t/* FAT: Expand FAT */\n\t\t\t\tif (n % n_fat) {\t/* Adjust fractional error if needed */\n\t\t\t\t\tn--; sz_rsv++; b_fat++;\n\t\t\t\t}\n\t\t\t\tsz_fat += n / n_fat;\n\t\t\t}\n\n\t\t\t/* Determine number of clusters and final check of validity of the FAT sub-type */\n\t\t\tif (sz_vol < b_data + pau * 16 - b_vol) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too small volume? */\n\t\t\tn_clst = ((DWORD)sz_vol - sz_rsv - sz_fat * n_fat - sz_dir) / pau;\n\t\t\tif (fsty == FS_FAT32) {\n\t\t\t\tif (n_clst <= MAX_FAT16) {\t/* Too few clusters for FAT32? */\n\t\t\t\t\tif (sz_au == 0 && (sz_au = pau / 2) != 0) continue;\t/* Adjust cluster size and retry */\n\t\t\t\t\tLEAVE_MKFS(FR_MKFS_ABORTED);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (fsty == FS_FAT16) {\n\t\t\t\tif (n_clst > MAX_FAT16) {\t/* Too many clusters for FAT16 */\n\t\t\t\t\tif (sz_au == 0 && (pau * 2) <= 64) {\n\t\t\t\t\t\tsz_au = pau * 2; continue;\t/* Adjust cluster size and retry */\n\t\t\t\t\t}\n\t\t\t\t\tif ((fsopt & FM_FAT32)) {\n\t\t\t\t\t\tfsty = FS_FAT32; continue;\t/* Switch type to FAT32 and retry */\n\t\t\t\t\t}\n\t\t\t\t\tif (sz_au == 0 && (sz_au = pau * 2) <= 128) continue;\t/* Adjust cluster size and retry */\n\t\t\t\t\tLEAVE_MKFS(FR_MKFS_ABORTED);\n\t\t\t\t}\n\t\t\t\tif  (n_clst <= MAX_FAT12) {\t/* Too few clusters for FAT16 */\n\t\t\t\t\tif (sz_au == 0 && (sz_au = pau * 2) <= 128) continue;\t/* Adjust cluster size and retry */\n\t\t\t\t\tLEAVE_MKFS(FR_MKFS_ABORTED);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (fsty == FS_FAT12 && n_clst > MAX_FAT12) LEAVE_MKFS(FR_MKFS_ABORTED);\t/* Too many clusters for FAT12 */\n\n\t\t\t/* Ok, it is the valid cluster configuration */\n\t\t\tbreak;\n\t\t} while (1);\n\n#if FF_USE_TRIM\n\t\tlba[0] = b_vol; lba[1] = b_vol + sz_vol - 1;\t/* Inform storage device that the volume area may be erased */\n\t\tdisk_ioctl(pdrv, CTRL_TRIM, lba);\n#endif\n\t\t/* Create FAT VBR */\n\t\tmemset(buf, 0, ss);\n\t\tmemcpy(buf + BS_JmpBoot, \"\\xEB\\xFE\\x90\" \"MSDOS5.0\", 11);\t/* Boot jump code (x86), OEM name */\n\t\tst_word(buf + BPB_BytsPerSec, ss);\t\t\t\t/* Sector size [byte] */\n\t\tbuf[BPB_SecPerClus] = (BYTE)pau;\t\t\t\t/* Cluster size [sector] */\n\t\tst_word(buf + BPB_RsvdSecCnt, (WORD)sz_rsv);\t/* Size of reserved area */\n\t\tbuf[BPB_NumFATs] = (BYTE)n_fat;\t\t\t\t\t/* Number of FATs */\n\t\tst_word(buf + BPB_RootEntCnt, (WORD)((fsty == FS_FAT32) ? 0 : n_root));\t/* Number of root directory entries */\n\t\tif (sz_vol < 0x10000) {\n\t\t\tst_word(buf + BPB_TotSec16, (WORD)sz_vol);\t/* Volume size in 16-bit LBA */\n\t\t} else {\n\t\t\tst_dword(buf + BPB_TotSec32, (DWORD)sz_vol);\t/* Volume size in 32-bit LBA */\n\t\t}\n\t\tbuf[BPB_Media] = 0xF8;\t\t\t\t\t\t\t/* Media descriptor byte */\n\t\tst_word(buf + BPB_SecPerTrk, 63);\t\t\t\t/* Number of sectors per track (for int13) */\n\t\tst_word(buf + BPB_NumHeads, 255);\t\t\t\t/* Number of heads (for int13) */\n\t\tst_dword(buf + BPB_HiddSec, (DWORD)b_vol);\t\t/* Volume offset in the physical drive [sector] */\n\t\tif (fsty == FS_FAT32) {\n\t\t\tst_dword(buf + BS_VolID32, vsn);\t\t\t/* VSN */\n\t\t\tst_dword(buf + BPB_FATSz32, sz_fat);\t\t/* FAT size [sector] */\n\t\t\tst_dword(buf + BPB_RootClus32, 2);\t\t\t/* Root directory cluster # (2) */\n\t\t\tst_word(buf + BPB_FSInfo32, 1);\t\t\t\t/* Offset of FSINFO sector (VBR + 1) */\n\t\t\tst_word(buf + BPB_BkBootSec32, 6);\t\t\t/* Offset of backup VBR (VBR + 6) */\n\t\t\tbuf[BS_DrvNum32] = 0x80;\t\t\t\t\t/* Drive number (for int13) */\n\t\t\tbuf[BS_BootSig32] = 0x29;\t\t\t\t\t/* Extended boot signature */\n\t\t\tmemcpy(buf + BS_VolLab32, \"NO NAME    \" \"FAT32   \", 19);\t/* Volume label, FAT signature */\n\t\t} else {\n\t\t\tst_dword(buf + BS_VolID, vsn);\t\t\t\t/* VSN */\n\t\t\tst_word(buf + BPB_FATSz16, (WORD)sz_fat);\t/* FAT size [sector] */\n\t\t\tbuf[BS_DrvNum] = 0x80;\t\t\t\t\t\t/* Drive number (for int13) */\n\t\t\tbuf[BS_BootSig] = 0x29;\t\t\t\t\t\t/* Extended boot signature */\n\t\t\tmemcpy(buf + BS_VolLab, \"NO NAME    \" \"FAT     \", 19);\t/* Volume label, FAT signature */\n\t\t}\n\t\tst_word(buf + BS_55AA, 0xAA55);\t\t\t\t\t/* Signature (offset is fixed here regardless of sector size) */\n\t\tif (disk_write(pdrv, buf, b_vol, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Write it to the VBR sector */\n\n\t\t/* Create FSINFO record if needed */\n\t\tif (fsty == FS_FAT32) {\n\t\t\tdisk_write(pdrv, buf, b_vol + 6, 1);\t\t/* Write backup VBR (VBR + 6) */\n\t\t\tmemset(buf, 0, ss);\n\t\t\tst_dword(buf + FSI_LeadSig, 0x41615252);\n\t\t\tst_dword(buf + FSI_StrucSig, 0x61417272);\n\t\t\tst_dword(buf + FSI_Free_Count, n_clst - 1);\t/* Number of free clusters */\n\t\t\tst_dword(buf + FSI_Nxt_Free, 2);\t\t\t/* Last allocated cluster# */\n\t\t\tst_word(buf + BS_55AA, 0xAA55);\n\t\t\tdisk_write(pdrv, buf, b_vol + 7, 1);\t\t/* Write backup FSINFO (VBR + 7) */\n\t\t\tdisk_write(pdrv, buf, b_vol + 1, 1);\t\t/* Write original FSINFO (VBR + 1) */\n\t\t}\n\n\t\t/* Initialize FAT area */\n\t\tmemset(buf, 0, sz_buf * ss);\n\t\tsect = b_fat;\t\t/* FAT start sector */\n\t\tfor (i = 0; i < n_fat; i++) {\t\t\t/* Initialize FATs each */\n\t\t\tif (fsty == FS_FAT32) {\n\t\t\t\tst_dword(buf + 0, 0xFFFFFFF8);\t/* FAT[0] */\n\t\t\t\tst_dword(buf + 4, 0xFFFFFFFF);\t/* FAT[1] */\n\t\t\t\tst_dword(buf + 8, 0x0FFFFFFF);\t/* FAT[2] (root directory) */\n\t\t\t} else {\n\t\t\t\tst_dword(buf + 0, (fsty == FS_FAT12) ? 0xFFFFF8 : 0xFFFFFFF8);\t/* FAT[0] and FAT[1] */\n\t\t\t}\n\t\t\tnsect = sz_fat;\t\t/* Number of FAT sectors */\n\t\t\tdo {\t/* Fill FAT sectors */\n\t\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\n\t\t\t\tif (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\t\tmemset(buf, 0, ss);\t/* Rest of FAT all are cleared */\n\t\t\t\tsect += n; nsect -= n;\n\t\t\t} while (nsect);\n\t\t}\n\n\t\t/* Initialize root directory (fill with zero) */\n\t\tnsect = (fsty == FS_FAT32) ? pau : sz_dir;\t/* Number of root directory sectors */\n\t\tdo {\n\t\t\tn = (nsect > sz_buf) ? sz_buf : nsect;\n\t\t\tif (disk_write(pdrv, buf, sect, (UINT)n) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\t\t\tsect += n; nsect -= n;\n\t\t} while (nsect);\n\t}\n\n\t/* A FAT volume has been created here */\n\n\t/* Determine system ID in the MBR partition table */\n\tif (FF_FS_EXFAT && fsty == FS_EXFAT) {\n\t\tsys = 0x07;\t\t/* exFAT */\n\t} else if (fsty == FS_FAT32) {\n\t\tsys = 0x0C;\t\t/* FAT32X */\n\t} else if (sz_vol >= 0x10000) {\n\t\tsys = 0x06;\t\t/* FAT12/16 (large) */\n\t} else if (fsty == FS_FAT16) {\n\t\tsys = 0x04;\t\t/* FAT16 */\n\t} else {\n\t\tsys = 0x01;\t\t/* FAT12 */\n\t}\n\n\t/* Update partition information */\n\tif (FF_MULTI_PARTITION && ipart != 0) {\t/* Volume is in the existing partition */\n\t\tif (!FF_LBA64 || !(fsopt & 0x80)) {\t/* Is the partition in MBR? */\n\t\t\t/* Update system ID in the partition table */\n\t\t\tif (disk_read(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Read the MBR */\n\t\t\tbuf[MBR_Table + (ipart - 1) * SZ_PTE + PTE_System] = sys;\t\t\t/* Set system ID */\n\t\t\tif (disk_write(pdrv, buf, 0, 1) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\t/* Write it back to the MBR */\n\t\t}\n\t} else {\t\t\t\t\t\t\t\t/* Volume as a new single partition */\n\t\tif (!(fsopt & FM_SFD)) {\t\t\t/* Create partition table if not in SFD format */\n\t\t\tlba[0] = sz_vol; lba[1] = 0;\n\t\t\tres = create_partition(pdrv, lba, sys, buf);\n\t\t\tif (res != FR_OK) LEAVE_MKFS(res);\n\t\t}\n\t}\n\n\tif (disk_ioctl(pdrv, CTRL_SYNC, 0) != RES_OK) LEAVE_MKFS(FR_DISK_ERR);\n\n\tLEAVE_MKFS(FR_OK);\n}\n\n\n\n\n#if FF_MULTI_PARTITION\n/*-----------------------------------------------------------------------*/\n/* Create Partition Table on the Physical Drive                          */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_fdisk (\n\tBYTE pdrv,\t\t\t/* Physical drive number */\n\tconst LBA_t ptbl[],\t/* Pointer to the size table for each partitions */\n\tvoid* work\t\t\t/* Pointer to the working buffer (null: use heap memory) */\n)\n{\n\tBYTE *buf = (BYTE*)work;\n\tDSTATUS stat;\n\tFRESULT res;\n\n\n\t/* Initialize the physical drive */\n\tstat = disk_initialize(pdrv);\n\tif (stat & STA_NOINIT) return FR_NOT_READY;\n\tif (stat & STA_PROTECT) return FR_WRITE_PROTECTED;\n\n#if FF_USE_LFN == 3\n\tif (!buf) buf = ff_memalloc(FF_MAX_SS);\t/* Use heap memory for working buffer */\n#endif\n\tif (!buf) return FR_NOT_ENOUGH_CORE;\n\n\tres = create_partition(pdrv, ptbl, 0x07, buf);\t/* Create partitions (system ID is temporary setting and determined by f_mkfs) */\n\n\tLEAVE_MKFS(res);\n}\n\n#endif /* FF_MULTI_PARTITION */\n#endif /* !FF_FS_READONLY && FF_USE_MKFS */\n\n\n\n\n#if FF_USE_STRFUNC\n#if FF_USE_LFN && FF_LFN_UNICODE && (FF_STRF_ENCODE < 0 || FF_STRF_ENCODE > 3)\n#error Wrong FF_STRF_ENCODE setting\n#endif\n/*-----------------------------------------------------------------------*/\n/* Get a String from the File                                            */\n/*-----------------------------------------------------------------------*/\n\nTCHAR* f_gets (\n\tTCHAR* buff,\t/* Pointer to the buffer to store read string */\n\tint len,\t\t/* Size of string buffer (items) */\n\tFIL* fp\t\t\t/* Pointer to the file object */\n)\n{\n\tint nc = 0;\n\tTCHAR *p = buff;\n\tBYTE s[4];\n\tUINT rc;\n\tDWORD dc;\n#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE <= 2\n\tWCHAR wc;\n#endif\n#if FF_USE_LFN && FF_LFN_UNICODE && FF_STRF_ENCODE == 3\n\tUINT ct;\n#endif\n\n#if FF_USE_LFN && FF_LFN_UNICODE\t\t\t/* With code conversion (Unicode API) */\n\t/* Make a room for the character and terminator  */\n\tif (FF_LFN_UNICODE == 1) len -= (FF_STRF_ENCODE == 0) ? 1 : 2;\n\tif (FF_LFN_UNICODE == 2) len -= (FF_STRF_ENCODE == 0) ? 3 : 4;\n\tif (FF_LFN_UNICODE == 3) len -= 1;\n\twhile (nc < len) {\n#if FF_STRF_ENCODE == 0\t\t\t\t/* Read a character in ANSI/OEM */\n\t\tf_read(fp, s, 1, &rc);\t\t/* Get a code unit */\n\t\tif (rc != 1) break;\t\t\t/* EOF? */\n\t\twc = s[0];\n\t\tif (dbc_1st((BYTE)wc)) {\t/* DBC 1st byte? */\n\t\t\tf_read(fp, s, 1, &rc);\t/* Get 2nd byte */\n\t\t\tif (rc != 1 || !dbc_2nd(s[0])) continue;\t/* Wrong code? */\n\t\t\twc = wc << 8 | s[0];\n\t\t}\n\t\tdc = ff_oem2uni(wc, CODEPAGE);\t/* Convert ANSI/OEM into Unicode */\n\t\tif (dc == 0) continue;\t\t/* Conversion error? */\n#elif FF_STRF_ENCODE == 1 || FF_STRF_ENCODE == 2 \t/* Read a character in UTF-16LE/BE */\n\t\tf_read(fp, s, 2, &rc);\t\t/* Get a code unit */\n\t\tif (rc != 2) break;\t\t\t/* EOF? */\n\t\tdc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1];\n\t\tif (IsSurrogateL(dc)) continue;\t/* Broken surrogate pair? */\n\t\tif (IsSurrogateH(dc)) {\t\t/* High surrogate? */\n\t\t\tf_read(fp, s, 2, &rc);\t/* Get low surrogate */\n\t\t\tif (rc != 2) break;\t\t/* EOF? */\n\t\t\twc = (FF_STRF_ENCODE == 1) ? ld_word(s) : s[0] << 8 | s[1];\n\t\t\tif (!IsSurrogateL(wc)) continue;\t/* Broken surrogate pair? */\n\t\t\tdc = ((dc & 0x3FF) + 0x40) << 10 | (wc & 0x3FF);\t/* Merge surrogate pair */\n\t\t}\n#else\t/* Read a character in UTF-8 */\n\t\tf_read(fp, s, 1, &rc);\t\t/* Get a code unit */\n\t\tif (rc != 1) break;\t\t\t/* EOF? */\n\t\tdc = s[0];\n\t\tif (dc >= 0x80) {\t\t\t/* Multi-byte sequence? */\n\t\t\tct = 0;\n\t\t\tif ((dc & 0xE0) == 0xC0) {\t/* 2-byte sequence? */\n\t\t\t\tdc &= 0x1F; ct = 1;\n\t\t\t}\n\t\t\tif ((dc & 0xF0) == 0xE0) {\t/* 3-byte sequence? */\n\t\t\t\tdc &= 0x0F; ct = 2;\n\t\t\t}\n\t\t\tif ((dc & 0xF8) == 0xF0) {\t/* 4-byte sequence? */\n\t\t\t\tdc &= 0x07; ct = 3;\n\t\t\t}\n\t\t\tif (ct == 0) continue;\n\t\t\tf_read(fp, s, ct, &rc);\t/* Get trailing bytes */\n\t\t\tif (rc != ct) break;\n\t\t\trc = 0;\n\t\t\tdo {\t/* Merge the byte sequence */\n\t\t\t\tif ((s[rc] & 0xC0) != 0x80) break;\n\t\t\t\tdc = dc << 6 | (s[rc] & 0x3F);\n\t\t\t} while (++rc < ct);\n\t\t\tif (rc != ct || dc < 0x80 || IsSurrogate(dc) || dc >= 0x110000) continue;\t/* Wrong encoding? */\n\t\t}\n#endif\n\t\t/* A code point is avaialble in dc to be output */\n\n\t\tif (FF_USE_STRFUNC == 2 && dc == '\\r') continue;\t/* Strip \\r off if needed */\n#if FF_LFN_UNICODE == 1\t|| FF_LFN_UNICODE == 3\t/* Output it in UTF-16/32 encoding */\n\t\tif (FF_LFN_UNICODE == 1 && dc >= 0x10000) {\t/* Out of BMP at UTF-16? */\n\t\t\t*p++ = (TCHAR)(0xD800 | ((dc >> 10) - 0x40)); nc++;\t/* Make and output high surrogate */\n\t\t\tdc = 0xDC00 | (dc & 0x3FF);\t\t/* Make low surrogate */\n\t\t}\n\t\t*p++ = (TCHAR)dc; nc++;\n\t\tif (dc == '\\n') break;\t/* End of line? */\n#elif FF_LFN_UNICODE == 2\t\t/* Output it in UTF-8 encoding */\n\t\tif (dc < 0x80) {\t/* Single byte? */\n\t\t\t*p++ = (TCHAR)dc;\n\t\t\tnc++;\n\t\t\tif (dc == '\\n') break;\t/* End of line? */\n\t\t} else if (dc < 0x800) {\t/* 2-byte sequence? */\n\t\t\t*p++ = (TCHAR)(0xC0 | (dc >> 6 & 0x1F));\n\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F));\n\t\t\tnc += 2;\n\t\t} else if (dc < 0x10000) {\t/* 3-byte sequence? */\n\t\t\t*p++ = (TCHAR)(0xE0 | (dc >> 12 & 0x0F));\n\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F));\n\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F));\n\t\t\tnc += 3;\n\t\t} else {\t\t\t\t\t/* 4-byte sequence */\n\t\t\t*p++ = (TCHAR)(0xF0 | (dc >> 18 & 0x07));\n\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 12 & 0x3F));\n\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 6 & 0x3F));\n\t\t\t*p++ = (TCHAR)(0x80 | (dc >> 0 & 0x3F));\n\t\t\tnc += 4;\n\t\t}\n#endif\n\t}\n\n#else\t\t\t/* Byte-by-byte read without any conversion (ANSI/OEM API) */\n\tlen -= 1;\t/* Make a room for the terminator */\n\twhile (nc < len) {\n\t\tf_read(fp, s, 1, &rc);\t/* Get a byte */\n\t\tif (rc != 1) break;\t\t/* EOF? */\n\t\tdc = s[0];\n\t\tif (FF_USE_STRFUNC == 2 && dc == '\\r') continue;\n\t\t*p++ = (TCHAR)dc; nc++;\n\t\tif (dc == '\\n') break;\n\t}\n#endif\n\n\t*p = 0;\t\t/* Terminate the string */\n\treturn nc ? buff : 0;\t/* When no data read due to EOF or error, return with error. */\n}\n\n\n\n\n#if !FF_FS_READONLY\n#include <stdarg.h>\n#define SZ_PUTC_BUF\t64\n#define SZ_NUM_BUF\t32\n\n/*-----------------------------------------------------------------------*/\n/* Put a Character to the File (with sub-functions)                      */\n/*-----------------------------------------------------------------------*/\n\n/* Output buffer and work area */\n\ntypedef struct {\n\tFIL *fp;\t\t/* Ptr to the writing file */\n\tint idx, nchr;\t/* Write index of buf[] (-1:error), number of encoding units written */\n#if FF_USE_LFN && FF_LFN_UNICODE == 1\n\tWCHAR hs;\n#elif FF_USE_LFN && FF_LFN_UNICODE == 2\n\tBYTE bs[4];\n\tUINT wi, ct;\n#endif\n\tBYTE buf[SZ_PUTC_BUF];\t/* Write buffer */\n} putbuff;\n\n\n/* Buffered file write with code conversion */\n\nstatic void putc_bfd (putbuff* pb, TCHAR c)\n{\n\tUINT n;\n\tint i, nc;\n#if FF_USE_LFN && FF_LFN_UNICODE\n\tWCHAR hs, wc;\n#if FF_LFN_UNICODE == 2\n\tDWORD dc;\n\tconst TCHAR* tp;\n#endif\n#endif\n\n\tif (FF_USE_STRFUNC == 2 && c == '\\n') {\t /* LF -> CRLF conversion */\n\t\tputc_bfd(pb, '\\r');\n\t}\n\n\ti = pb->idx;\t\t\t/* Write index of pb->buf[] */\n\tif (i < 0) return;\t\t/* In write error? */\n\tnc = pb->nchr;\t\t\t/* Write unit counter */\n\n#if FF_USE_LFN && FF_LFN_UNICODE\n#if FF_LFN_UNICODE == 1\t\t/* UTF-16 input */\n\tif (IsSurrogateH(c)) {\t/* Is this a high-surrogate? */\n\t\tpb->hs = c; return;\t/* Save it for next */\n\t}\n\ths = pb->hs; pb->hs = 0;\n\tif (hs != 0) {\t\t\t/* Is there a leading high-surrogate? */\n\t\tif (!IsSurrogateL(c)) hs = 0;\t/* Discard high-surrogate if not a surrogate pair */\n\t} else {\n\t\tif (IsSurrogateL(c)) return;\t/* Discard stray low-surrogate */\n\t}\n\twc = c;\n#elif FF_LFN_UNICODE == 2\t/* UTF-8 input */\n\tfor (;;) {\n\t\tif (pb->ct == 0) {\t/* Out of multi-byte sequence? */\n\t\t\tpb->bs[pb->wi = 0] = (BYTE)c;\t/* Save 1st byte */\n\t\t\tif ((BYTE)c < 0x80) break;\t\t\t\t\t/* Single byte code? */\n\t\t\tif (((BYTE)c & 0xE0) == 0xC0) pb->ct = 1;\t/* 2-byte sequence? */\n\t\t\tif (((BYTE)c & 0xF0) == 0xE0) pb->ct = 2;\t/* 3-byte sequence? */\n\t\t\tif (((BYTE)c & 0xF8) == 0xF0) pb->ct = 3;\t/* 4-byte sequence? */\n\t\t\treturn;\t\t\t\t\t\t\t\t\t\t/* Wrong leading byte (discard it) */\n\t\t} else {\t\t\t\t/* In the multi-byte sequence */\n\t\t\tif (((BYTE)c & 0xC0) != 0x80) {\t/* Broken sequence? */\n\t\t\t\tpb->ct = 0; continue;\t\t/* Discard the sequense */\n\t\t\t}\n\t\t\tpb->bs[++pb->wi] = (BYTE)c;\t/* Save the trailing byte */\n\t\t\tif (--pb->ct == 0) break;\t/* End of the sequence? */\n\t\t\treturn;\n\t\t}\n\t}\n\ttp = (const TCHAR*)pb->bs;\n\tdc = tchar2uni(&tp);\t\t\t/* UTF-8 ==> UTF-16 */\n\tif (dc == 0xFFFFFFFF) return;\t/* Wrong code? */\n\ths = (WCHAR)(dc >> 16);\n\twc = (WCHAR)dc;\n#elif FF_LFN_UNICODE == 3\t/* UTF-32 input */\n\tif (IsSurrogate(c) || c >= 0x110000) return;\t/* Discard invalid code */\n\tif (c >= 0x10000) {\t\t/* Out of BMP? */\n\t\ths = (WCHAR)(0xD800 | ((c >> 10) - 0x40)); \t/* Make high surrogate */\n\t\twc = 0xDC00 | (c & 0x3FF);\t\t\t\t\t/* Make low surrogate */\n\t} else {\n\t\ths = 0;\n\t\twc = (WCHAR)c;\n\t}\n#endif\n\t/* A code point in UTF-16 is available in hs and wc */\n\n#if FF_STRF_ENCODE == 1\t\t/* Write a code point in UTF-16LE */\n\tif (hs != 0) {\t/* Surrogate pair? */\n\t\tst_word(&pb->buf[i], hs);\n\t\ti += 2;\n\t\tnc++;\n\t}\n\tst_word(&pb->buf[i], wc);\n\ti += 2;\n#elif FF_STRF_ENCODE == 2\t/* Write a code point in UTF-16BE */\n\tif (hs != 0) {\t/* Surrogate pair? */\n\t\tpb->buf[i++] = (BYTE)(hs >> 8);\n\t\tpb->buf[i++] = (BYTE)hs;\n\t\tnc++;\n\t}\n\tpb->buf[i++] = (BYTE)(wc >> 8);\n\tpb->buf[i++] = (BYTE)wc;\n#elif FF_STRF_ENCODE == 3\t/* Write a code point in UTF-8 */\n\tif (hs != 0) {\t/* 4-byte sequence? */\n\t\tnc += 3;\n\t\ths = (hs & 0x3FF) + 0x40;\n\t\tpb->buf[i++] = (BYTE)(0xF0 | hs >> 8);\n\t\tpb->buf[i++] = (BYTE)(0x80 | (hs >> 2 & 0x3F));\n\t\tpb->buf[i++] = (BYTE)(0x80 | (hs & 3) << 4 | (wc >> 6 & 0x0F));\n\t\tpb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F));\n\t} else {\n\t\tif (wc < 0x80) {\t/* Single byte? */\n\t\t\tpb->buf[i++] = (BYTE)wc;\n\t\t} else {\n\t\t\tif (wc < 0x800) {\t/* 2-byte sequence? */\n\t\t\t\tnc += 1;\n\t\t\t\tpb->buf[i++] = (BYTE)(0xC0 | wc >> 6);\n\t\t\t} else {\t\t\t/* 3-byte sequence */\n\t\t\t\tnc += 2;\n\t\t\t\tpb->buf[i++] = (BYTE)(0xE0 | wc >> 12);\n\t\t\t\tpb->buf[i++] = (BYTE)(0x80 | (wc >> 6 & 0x3F));\n\t\t\t}\n\t\t\tpb->buf[i++] = (BYTE)(0x80 | (wc & 0x3F));\n\t\t}\n\t}\n#else\t\t\t\t\t\t/* Write a code point in ANSI/OEM */\n\tif (hs != 0) return;\n\twc = ff_uni2oem(wc, CODEPAGE);\t/* UTF-16 ==> ANSI/OEM */\n\tif (wc == 0) return;\n\tif (wc >= 0x100) {\n\t\tpb->buf[i++] = (BYTE)(wc >> 8); nc++;\n\t}\n\tpb->buf[i++] = (BYTE)wc;\n#endif\n\n#else\t\t\t\t\t\t\t/* ANSI/OEM input (without re-encoding) */\n\tpb->buf[i++] = (BYTE)c;\n#endif\n\n\tif (i >= (int)(sizeof pb->buf) - 4) {\t/* Write buffered characters to the file */\n\t\tf_write(pb->fp, pb->buf, (UINT)i, &n);\n\t\ti = (n == (UINT)i) ? 0 : -1;\n\t}\n\tpb->idx = i;\n\tpb->nchr = nc + 1;\n}\n\n\n/* Flush remaining characters in the buffer */\n\nstatic int putc_flush (putbuff* pb)\n{\n\tUINT nw;\n\n\tif (   pb->idx >= 0\t/* Flush buffered characters to the file */\n\t\t&& f_write(pb->fp, pb->buf, (UINT)pb->idx, &nw) == FR_OK\n\t\t&& (UINT)pb->idx == nw) return pb->nchr;\n\treturn -1;\n}\n\n\n/* Initialize write buffer */\n\nstatic void putc_init (putbuff* pb, FIL* fp)\n{\n\tmemset(pb, 0, sizeof (putbuff));\n\tpb->fp = fp;\n}\n\n\n\nint f_putc (\n\tTCHAR c,\t/* A character to be output */\n\tFIL* fp\t\t/* Pointer to the file object */\n)\n{\n\tputbuff pb;\n\n\n\tputc_init(&pb, fp);\n\tputc_bfd(&pb, c);\t/* Put the character */\n\treturn putc_flush(&pb);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Put a String to the File                                              */\n/*-----------------------------------------------------------------------*/\n\nint f_puts (\n\tconst TCHAR* str,\t/* Pointer to the string to be output */\n\tFIL* fp\t\t\t\t/* Pointer to the file object */\n)\n{\n\tputbuff pb;\n\n\n\tputc_init(&pb, fp);\n\twhile (*str) putc_bfd(&pb, *str++);\t\t/* Put the string */\n\treturn putc_flush(&pb);\n}\n\n\n\n\n/*-----------------------------------------------------------------------*/\n/* Put a Formatted String to the File (with sub-functions)               */\n/*-----------------------------------------------------------------------*/\n#if FF_PRINT_FLOAT && FF_INTDEF == 2\n#include <math.h>\n\nstatic int ilog10 (double n)\t/* Calculate log10(n) in integer output */\n{\n\tint rv = 0;\n\n\twhile (n >= 10) {\t/* Decimate digit in right shift */\n\t\tif (n >= 100000) {\n\t\t\tn /= 100000; rv += 5;\n\t\t} else {\n\t\t\tn /= 10; rv++;\n\t\t}\n\t}\n\twhile (n < 1) {\t\t/* Decimate digit in left shift */\n\t\tif (n < 0.00001) {\n\t\t\tn *= 100000; rv -= 5;\n\t\t} else {\n\t\t\tn *= 10; rv--;\n\t\t}\n\t}\n\treturn rv;\n}\n\n\nstatic double i10x (int n)\t/* Calculate 10^n in integer input */\n{\n\tdouble rv = 1;\n\n\twhile (n > 0) {\t\t/* Left shift */\n\t\tif (n >= 5) {\n\t\t\trv *= 100000; n -= 5;\n\t\t} else {\n\t\t\trv *= 10; n--;\n\t\t}\n\t}\n\twhile (n < 0) {\t\t/* Right shift */\n\t\tif (n <= -5) {\n\t\t\trv /= 100000; n += 5;\n\t\t} else {\n\t\t\trv /= 10; n++;\n\t\t}\n\t}\n\treturn rv;\n}\n\n\nstatic void ftoa (\n\tchar* buf,\t/* Buffer to output the floating point string */\n\tdouble val,\t/* Value to output */\n\tint prec,\t/* Number of fractional digits */\n\tTCHAR fmt\t/* Notation */\n)\n{\n\tint d;\n\tint e = 0, m = 0;\n\tchar sign = 0;\n\tdouble w;\n\tconst char *er = 0;\n\tconst char ds = FF_PRINT_FLOAT == 2 ? ',' : '.';\n\n\n\tif (isnan(val)) {\t\t\t/* Not a number? */\n\t\ter = \"NaN\";\n\t} else {\n\t\tif (prec < 0) prec = 6;\t/* Default precision? (6 fractional digits) */\n\t\tif (val < 0) {\t\t\t/* Negative? */\n\t\t\tval = 0 - val; sign = '-';\n\t\t} else {\n\t\t\tsign = '+';\n\t\t}\n\t\tif (isinf(val)) {\t\t/* Infinite? */\n\t\t\ter = \"INF\";\n\t\t} else {\n\t\t\tif (fmt == 'f') {\t/* Decimal notation? */\n\t\t\t\tval += i10x(0 - prec) / 2;\t/* Round (nearest) */\n\t\t\t\tm = ilog10(val);\n\t\t\t\tif (m < 0) m = 0;\n\t\t\t\tif (m + prec + 3 >= SZ_NUM_BUF) er = \"OV\";\t/* Buffer overflow? */\n\t\t\t} else {\t\t\t/* E notation */\n\t\t\t\tif (val != 0) {\t\t/* Not a true zero? */\n\t\t\t\t\tval += i10x(ilog10(val) - prec) / 2;\t/* Round (nearest) */\n\t\t\t\t\te = ilog10(val);\n\t\t\t\t\tif (e > 99 || prec + 7 >= SZ_NUM_BUF) {\t/* Buffer overflow or E > +99? */\n\t\t\t\t\t\ter = \"OV\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (e < -99) e = -99;\n\t\t\t\t\t\tval /= i10x(e);\t/* Normalize */\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!er) {\t/* Not error condition */\n\t\t\tif (sign == '-') *buf++ = sign;\t/* Add a - if negative value */\n\t\t\tdo {\t\t\t\t/* Put decimal number */\n\t\t\t\tif (m == -1) *buf++ = ds;\t/* Insert a decimal separator when get into fractional part */\n\t\t\t\tw = i10x(m);\t\t\t\t/* Snip the highest digit d */\n\t\t\t\td = (int)(val / w); val -= d * w;\n\t\t\t\t*buf++ = (char)('0' + d);\t/* Put the digit */\n\t\t\t} while (--m >= -prec);\t\t\t/* Output all digits specified by prec */\n\t\t\tif (fmt != 'f') {\t/* Put exponent if needed */\n\t\t\t\t*buf++ = (char)fmt;\n\t\t\t\tif (e < 0) {\n\t\t\t\t\te = 0 - e; *buf++ = '-';\n\t\t\t\t} else {\n\t\t\t\t\t*buf++ = '+';\n\t\t\t\t}\n\t\t\t\t*buf++ = (char)('0' + e / 10);\n\t\t\t\t*buf++ = (char)('0' + e % 10);\n\t\t\t}\n\t\t}\n\t}\n\tif (er) {\t/* Error condition */\n\t\tif (sign) *buf++ = sign;\t\t/* Add sign if needed */\n\t\tdo {\t\t/* Put error symbol */\n\t\t\t*buf++ = *er++;\n\t\t} while (*er);\n\t}\n\t*buf = 0;\t/* Term */\n}\n#endif\t/* FF_PRINT_FLOAT && FF_INTDEF == 2 */\n\n\n\nint f_printf (\n\tFIL* fp,\t\t\t/* Pointer to the file object */\n\tconst TCHAR* fmt,\t/* Pointer to the format string */\n\t...\t\t\t\t\t/* Optional arguments... */\n)\n{\n\tva_list arp;\n\tputbuff pb;\n\tUINT i, j, w, f, r;\n\tint prec;\n#if FF_PRINT_LLI && FF_INTDEF == 2\n\tQWORD v;\n#else\n\tDWORD v;\n#endif\n\tTCHAR *tp;\n\tTCHAR tc, pad;\n\tTCHAR nul = 0;\n\tchar d, str[SZ_NUM_BUF];\n\n\n\tputc_init(&pb, fp);\n\n\tva_start(arp, fmt);\n\n\tfor (;;) {\n\t\ttc = *fmt++;\n\t\tif (tc == 0) break;\t\t\t/* End of format string */\n\t\tif (tc != '%') {\t\t\t/* Not an escape character (pass-through) */\n\t\t\tputc_bfd(&pb, tc);\n\t\t\tcontinue;\n\t\t}\n\t\tf = w = 0; pad = ' '; prec = -1;\t/* Initialize parms */\n\t\ttc = *fmt++;\n\t\tif (tc == '0') {\t\t\t/* Flag: '0' padded */\n\t\t\tpad = '0'; tc = *fmt++;\n\t\t} else if (tc == '-') {\t\t/* Flag: Left aligned */\n\t\t\tf = 2; tc = *fmt++;\n\t\t}\n\t\tif (tc == '*') {\t\t\t/* Minimum width from an argument */\n\t\t\tw = va_arg(arp, int);\n\t\t\ttc = *fmt++;\n\t\t} else {\n\t\t\twhile (IsDigit(tc)) {\t/* Minimum width */\n\t\t\t\tw = w * 10 + tc - '0';\n\t\t\t\ttc = *fmt++;\n\t\t\t}\n\t\t}\n\t\tif (tc == '.') {\t\t\t/* Precision */\n\t\t\ttc = *fmt++;\n\t\t\tif (tc == '*') {\t\t/* Precision from an argument */\n\t\t\t\tprec = va_arg(arp, int);\n\t\t\t\ttc = *fmt++;\n\t\t\t} else {\n\t\t\t\tprec = 0;\n\t\t\t\twhile (IsDigit(tc)) {\t/* Precision */\n\t\t\t\t\tprec = prec * 10 + tc - '0';\n\t\t\t\t\ttc = *fmt++;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (tc == 'l') {\t\t\t/* Size: long int */\n\t\t\tf |= 4; tc = *fmt++;\n#if FF_PRINT_LLI && FF_INTDEF == 2\n\t\t\tif (tc == 'l') {\t\t/* Size: long long int */\n\t\t\t\tf |= 8; tc = *fmt++;\n\t\t\t}\n#endif\n\t\t}\n\t\tif (tc == 0) break;\t\t\t/* End of format string */\n\t\tswitch (tc) {\t\t\t\t/* Atgument type is... */\n\t\tcase 'b':\t\t\t\t\t/* Unsigned binary */\n\t\t\tr = 2; break;\n\n\t\tcase 'o':\t\t\t\t\t/* Unsigned octal */\n\t\t\tr = 8; break;\n\n\t\tcase 'd':\t\t\t\t\t/* Signed decimal */\n\t\tcase 'u': \t\t\t\t\t/* Unsigned decimal */\n\t\t\tr = 10; break;\n\n\t\tcase 'x':\t\t\t\t\t/* Unsigned hexadecimal (lower case) */\n\t\tcase 'X': \t\t\t\t\t/* Unsigned hexadecimal (upper case) */\n\t\t\tr = 16; break;\n\n\t\tcase 'c':\t\t\t\t\t/* Character */\n\t\t\tputc_bfd(&pb, (TCHAR)va_arg(arp, int));\n\t\t\tcontinue;\n\n\t\tcase 's':\t\t\t\t\t/* String */\n\t\t\ttp = va_arg(arp, TCHAR*);\t/* Get a pointer argument */\n\t\t\tif (!tp) tp = &nul;\t\t/* Null ptr generates a null string */\n\t\t\tfor (j = 0; tp[j]; j++) ;\t/* j = tcslen(tp) */\n\t\t\tif (prec >= 0 && j > (UINT)prec) j = prec;\t/* Limited length of string body */\n\t\t\tfor ( ; !(f & 2) && j < w; j++) putc_bfd(&pb, pad);\t/* Left pads */\n\t\t\twhile (*tp && prec--) putc_bfd(&pb, *tp++);\t/* Body */\n\t\t\twhile (j++ < w) putc_bfd(&pb, ' ');\t\t\t/* Right pads */\n\t\t\tcontinue;\n#if FF_PRINT_FLOAT && FF_INTDEF == 2\n\t\tcase 'f':\t\t\t\t\t/* Floating point (decimal) */\n\t\tcase 'e':\t\t\t\t\t/* Floating point (e) */\n\t\tcase 'E':\t\t\t\t\t/* Floating point (E) */\n\t\t\tftoa(str, va_arg(arp, double), prec, tc);\t/* Make a floating point string */\n\t\t\tfor (j = strlen(str); !(f & 2) && j < w; j++) putc_bfd(&pb, pad);\t/* Left pads */\n\t\t\tfor (i = 0; str[i]; putc_bfd(&pb, str[i++])) ;\t/* Body */\n\t\t\twhile (j++ < w) putc_bfd(&pb, ' ');\t/* Right pads */\n\t\t\tcontinue;\n#endif\n\t\tdefault:\t\t\t\t\t/* Unknown type (pass-through) */\n\t\t\tputc_bfd(&pb, tc); continue;\n\t\t}\n\n\t\t/* Get an integer argument and put it in numeral */\n#if FF_PRINT_LLI && FF_INTDEF == 2\n\t\tif (f & 8) {\t\t/* long long argument? */\n\t\t\tv = (QWORD)va_arg(arp, long long);\n\t\t} else if (f & 4) {\t/* long argument? */\n\t\t\tv = (tc == 'd') ? (QWORD)(long long)va_arg(arp, long) : (QWORD)va_arg(arp, unsigned long);\n\t\t} else {\t\t\t/* int/short/char argument */\n\t\t\tv = (tc == 'd') ? (QWORD)(long long)va_arg(arp, int) : (QWORD)va_arg(arp, unsigned int);\n\t\t}\n\t\tif (tc == 'd' && (v & 0x8000000000000000)) {\t/* Negative value? */\n\t\t\tv = 0 - v; f |= 1;\n\t\t}\n#else\n\t\tif (f & 4) {\t/* long argument? */\n\t\t\tv = (DWORD)va_arg(arp, long);\n\t\t} else {\t\t/* int/short/char argument */\n\t\t\tv = (tc == 'd') ? (DWORD)(long)va_arg(arp, int) : (DWORD)va_arg(arp, unsigned int);\n\t\t}\n\t\tif (tc == 'd' && (v & 0x80000000)) {\t/* Negative value? */\n\t\t\tv = 0 - v; f |= 1;\n\t\t}\n#endif\n\t\ti = 0;\n\t\tdo {\t/* Make an integer number string */\n\t\t\td = (char)(v % r); v /= r;\n\t\t\tif (d > 9) d += (tc == 'x') ? 0x27 : 0x07;\n\t\t\tstr[i++] = d + '0';\n\t\t} while (v && i < SZ_NUM_BUF);\n\t\tif (f & 1) str[i++] = '-';\t/* Sign */\n\t\t/* Write it */\n\t\tfor (j = i; !(f & 2) && j < w; j++) {\t/* Left pads */\n\t\t\tputc_bfd(&pb, pad);\n\t\t}\n\t\tdo {\t\t\t\t/* Body */\n\t\t\tputc_bfd(&pb, (TCHAR)str[--i]);\n\t\t} while (i);\n\t\twhile (j++ < w) {\t/* Right pads */\n\t\t\tputc_bfd(&pb, ' ');\n\t\t}\n\t}\n\n\tva_end(arp);\n\n\treturn putc_flush(&pb);\n}\n\n#endif /* !FF_FS_READONLY */\n#endif /* FF_USE_STRFUNC */\n\n\n\n#if FF_CODE_PAGE == 0\n/*-----------------------------------------------------------------------*/\n/* Set Active Codepage for the Path Name                                 */\n/*-----------------------------------------------------------------------*/\n\nFRESULT f_setcp (\n\tWORD cp\t\t/* Value to be set as active code page */\n)\n{\n\tstatic const WORD       validcp[22] = {  437,   720,   737,   771,   775,   850,   852,   855,   857,   860,   861,   862,   863,   864,   865,   866,   869,   932,   936,   949,   950, 0};\n\tstatic const BYTE *const tables[22] = {Ct437, Ct720, Ct737, Ct771, Ct775, Ct850, Ct852, Ct855, Ct857, Ct860, Ct861, Ct862, Ct863, Ct864, Ct865, Ct866, Ct869, Dc932, Dc936, Dc949, Dc950, 0};\n\tUINT i;\n\n\n\tfor (i = 0; validcp[i] != 0 && validcp[i] != cp; i++) ;\t/* Find the code page */\n\tif (validcp[i] != cp) return FR_INVALID_PARAMETER;\t\t/* Not found? */\n\n\tCodePage = cp;\n\tif (cp >= 900) {\t/* DBCS */\n\t\tExCvt = 0;\n\t\tDbcTbl = tables[i];\n\t} else {\t\t\t/* SBCS */\n\t\tExCvt = tables[i];\n\t\tDbcTbl = 0;\n\t}\n\treturn FR_OK;\n}\n#endif\t/* FF_CODE_PAGE == 0 */\n"
  },
  {
    "path": "lib/fatfs/source/ff.h",
    "content": "/*----------------------------------------------------------------------------/\n/  FatFs - Generic FAT Filesystem module  R0.15                               /\n/-----------------------------------------------------------------------------/\n/\n/ Copyright (C) 2022, ChaN, all right reserved.\n/\n/ FatFs module is an open source software. Redistribution and use of FatFs in\n/ source and binary forms, with or without modification, are permitted provided\n/ that the following condition is met:\n\n/ 1. Redistributions of source code must retain the above copyright notice,\n/    this condition and the following disclaimer.\n/\n/ This software is provided by the copyright holder and contributors \"AS IS\"\n/ and any warranties related to this software are DISCLAIMED.\n/ The copyright owner or contributors be NOT LIABLE for any damages caused\n/ by use of this software.\n/\n/----------------------------------------------------------------------------*/\n\n\n#ifndef FF_DEFINED\n#define FF_DEFINED\t80286\t/* Revision ID */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"ffconf.h\"\t\t/* FatFs configuration options */\n\n#if FF_DEFINED != FFCONF_DEF\n#error Wrong configuration file (ffconf.h).\n#endif\n\n\n/* Integer types used for FatFs API */\n\n#if defined(_WIN32)\t\t/* Windows VC++ (for development only) */\n#define FF_INTDEF 2\n#include <windows.h>\ntypedef unsigned __int64 QWORD;\n#include <float.h>\n#define isnan(v) _isnan(v)\n#define isinf(v) (!_finite(v))\n\n#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus)\t/* C99 or later */\n#define FF_INTDEF 2\n#include <stdint.h>\ntypedef unsigned int\tUINT;\t/* int must be 16-bit or 32-bit */\ntypedef unsigned char\tBYTE;\t/* char must be 8-bit */\ntypedef uint16_t\t\tWORD;\t/* 16-bit unsigned integer */\ntypedef uint32_t\t\tDWORD;\t/* 32-bit unsigned integer */\ntypedef uint64_t\t\tQWORD;\t/* 64-bit unsigned integer */\ntypedef WORD\t\t\tWCHAR;\t/* UTF-16 character type */\n\n#else  \t/* Earlier than C99 */\n#define FF_INTDEF 1\ntypedef unsigned int\tUINT;\t/* int must be 16-bit or 32-bit */\ntypedef unsigned char\tBYTE;\t/* char must be 8-bit */\ntypedef unsigned short\tWORD;\t/* 16-bit unsigned integer */\ntypedef unsigned long\tDWORD;\t/* 32-bit unsigned integer */\ntypedef WORD\t\t\tWCHAR;\t/* UTF-16 character type */\n#endif\n\n\n/* Type of file size and LBA variables */\n\n#if FF_FS_EXFAT\n#if FF_INTDEF != 2\n#error exFAT feature wants C99 or later\n#endif\ntypedef QWORD FSIZE_t;\n#if FF_LBA64\ntypedef QWORD LBA_t;\n#else\ntypedef DWORD LBA_t;\n#endif\n#else\n#if FF_LBA64\n#error exFAT needs to be enabled when enable 64-bit LBA\n#endif\ntypedef DWORD FSIZE_t;\ntypedef DWORD LBA_t;\n#endif\n\n\n\n/* Type of path name strings on FatFs API (TCHAR) */\n\n#if FF_USE_LFN && FF_LFN_UNICODE == 1 \t/* Unicode in UTF-16 encoding */\ntypedef WCHAR TCHAR;\n#define _T(x) L ## x\n#define _TEXT(x) L ## x\n#elif FF_USE_LFN && FF_LFN_UNICODE == 2\t/* Unicode in UTF-8 encoding */\ntypedef char TCHAR;\n#define _T(x) u8 ## x\n#define _TEXT(x) u8 ## x\n#elif FF_USE_LFN && FF_LFN_UNICODE == 3\t/* Unicode in UTF-32 encoding */\ntypedef DWORD TCHAR;\n#define _T(x) U ## x\n#define _TEXT(x) U ## x\n#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3)\n#error Wrong FF_LFN_UNICODE setting\n#else\t\t\t\t\t\t\t\t\t/* ANSI/OEM code in SBCS/DBCS */\ntypedef char TCHAR;\n#define _T(x) x\n#define _TEXT(x) x\n#endif\n\n\n\n/* Definitions of volume management */\n\n#if FF_MULTI_PARTITION\t\t/* Multiple partition configuration */\ntypedef struct {\n\tBYTE pd;\t/* Physical drive number */\n\tBYTE pt;\t/* Partition: 0:Auto detect, 1-4:Forced partition) */\n} PARTITION;\nextern PARTITION VolToPart[];\t/* Volume - Partition mapping table */\n#endif\n\n#if FF_STR_VOLUME_ID\n#ifndef FF_VOLUME_STRS\nextern const char* VolumeStr[FF_VOLUMES];\t/* User defied volume ID */\n#endif\n#endif\n\n\n\n/* Filesystem object structure (FATFS) */\n\ntypedef struct {\n\tBYTE\tfs_type;\t\t/* Filesystem type (0:not mounted) */\n\tBYTE\tpdrv;\t\t\t/* Volume hosting physical drive */\n\tBYTE\tldrv;\t\t\t/* Logical drive number (used only when FF_FS_REENTRANT) */\n\tBYTE\tn_fats;\t\t\t/* Number of FATs (1 or 2) */\n\tBYTE\twflag;\t\t\t/* win[] status (b0:dirty) */\n\tBYTE\tfsi_flag;\t\t/* FSINFO status (b7:disabled, b0:dirty) */\n\tWORD\tid;\t\t\t\t/* Volume mount ID */\n\tWORD\tn_rootdir;\t\t/* Number of root directory entries (FAT12/16) */\n\tWORD\tcsize;\t\t\t/* Cluster size [sectors] */\n#if FF_MAX_SS != FF_MIN_SS\n\tWORD\tssize;\t\t\t/* Sector size (512, 1024, 2048 or 4096) */\n#endif\n#if FF_USE_LFN\n\tWCHAR*\tlfnbuf;\t\t\t/* LFN working buffer */\n#endif\n#if FF_FS_EXFAT\n\tBYTE*\tdirbuf;\t\t\t/* Directory entry block scratchpad buffer for exFAT */\n#endif\n#if !FF_FS_READONLY\n\tDWORD\tlast_clst;\t\t/* Last allocated cluster */\n\tDWORD\tfree_clst;\t\t/* Number of free clusters */\n#endif\n#if FF_FS_RPATH\n\tDWORD\tcdir;\t\t\t/* Current directory start cluster (0:root) */\n#if FF_FS_EXFAT\n\tDWORD\tcdc_scl;\t\t/* Containing directory start cluster (invalid when cdir is 0) */\n\tDWORD\tcdc_size;\t\t/* b31-b8:Size of containing directory, b7-b0: Chain status */\n\tDWORD\tcdc_ofs;\t\t/* Offset in the containing directory (invalid when cdir is 0) */\n#endif\n#endif\n\tDWORD\tn_fatent;\t\t/* Number of FAT entries (number of clusters + 2) */\n\tDWORD\tfsize;\t\t\t/* Number of sectors per FAT */\n\tLBA_t\tvolbase;\t\t/* Volume base sector */\n\tLBA_t\tfatbase;\t\t/* FAT base sector */\n\tLBA_t\tdirbase;\t\t/* Root directory base sector (FAT12/16) or cluster (FAT32/exFAT) */\n\tLBA_t\tdatabase;\t\t/* Data base sector */\n#if FF_FS_EXFAT\n\tLBA_t\tbitbase;\t\t/* Allocation bitmap base sector */\n#endif\n\tLBA_t\twinsect;\t\t/* Current sector appearing in the win[] */\n\tBYTE\twin[FF_MAX_SS];\t/* Disk access window for Directory, FAT (and file data at tiny cfg) */\n} FATFS;\n\n\n\n/* Object ID and allocation information (FFOBJID) */\n\ntypedef struct {\n\tFATFS*\tfs;\t\t\t\t/* Pointer to the hosting volume of this object */\n\tWORD\tid;\t\t\t\t/* Hosting volume's mount ID */\n\tBYTE\tattr;\t\t\t/* Object attribute */\n\tBYTE\tstat;\t\t\t/* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:fragmented in this session, b2:sub-directory stretched) */\n\tDWORD\tsclust;\t\t\t/* Object data start cluster (0:no cluster or root directory) */\n\tFSIZE_t\tobjsize;\t\t/* Object size (valid when sclust != 0) */\n#if FF_FS_EXFAT\n\tDWORD\tn_cont;\t\t\t/* Size of first fragment - 1 (valid when stat == 3) */\n\tDWORD\tn_frag;\t\t\t/* Size of last fragment needs to be written to FAT (valid when not zero) */\n\tDWORD\tc_scl;\t\t\t/* Containing directory start cluster (valid when sclust != 0) */\n\tDWORD\tc_size;\t\t\t/* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */\n\tDWORD\tc_ofs;\t\t\t/* Offset in the containing directory (valid when file object and sclust != 0) */\n#endif\n#if FF_FS_LOCK\n\tUINT\tlockid;\t\t\t/* File lock ID origin from 1 (index of file semaphore table Files[]) */\n#endif\n} FFOBJID;\n\n\n\n/* File object structure (FIL) */\n\ntypedef struct {\n\tFFOBJID\tobj;\t\t\t/* Object identifier (must be the 1st member to detect invalid object pointer) */\n\tBYTE\tflag;\t\t\t/* File status flags */\n\tBYTE\terr;\t\t\t/* Abort flag (error code) */\n\tFSIZE_t\tfptr;\t\t\t/* File read/write pointer (Zeroed on file open) */\n\tDWORD\tclust;\t\t\t/* Current cluster of fpter (invalid when fptr is 0) */\n\tLBA_t\tsect;\t\t\t/* Sector number appearing in buf[] (0:invalid) */\n#if !FF_FS_READONLY\n\tLBA_t\tdir_sect;\t\t/* Sector number containing the directory entry (not used at exFAT) */\n\tBYTE*\tdir_ptr;\t\t/* Pointer to the directory entry in the win[] (not used at exFAT) */\n#endif\n#if FF_USE_FASTSEEK\n\tDWORD*\tcltbl;\t\t\t/* Pointer to the cluster link map table (nulled on open, set by application) */\n#endif\n#if !FF_FS_TINY\n\tBYTE\tbuf[FF_MAX_SS];\t/* File private data read/write window */\n#endif\n} FIL;\n\n\n\n/* Directory object structure (DIR) */\n\ntypedef struct {\n\tFFOBJID\tobj;\t\t\t/* Object identifier */\n\tDWORD\tdptr;\t\t\t/* Current read/write offset */\n\tDWORD\tclust;\t\t\t/* Current cluster */\n\tLBA_t\tsect;\t\t\t/* Current sector (0:Read operation has terminated) */\n\tBYTE*\tdir;\t\t\t/* Pointer to the directory item in the win[] */\n\tBYTE\tfn[12];\t\t\t/* SFN (in/out) {body[8],ext[3],status[1]} */\n#if FF_USE_LFN\n\tDWORD\tblk_ofs;\t\t/* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */\n#endif\n#if FF_USE_FIND\n\tconst TCHAR* pat;\t\t/* Pointer to the name matching pattern */\n#endif\n} DIR;\n\n\n\n/* File information structure (FILINFO) */\n\ntypedef struct {\n\tFSIZE_t\tfsize;\t\t\t/* File size */\n\tWORD\tfdate;\t\t\t/* Modified date */\n\tWORD\tftime;\t\t\t/* Modified time */\n\tBYTE\tfattrib;\t\t/* File attribute */\n#if FF_USE_LFN\n\tTCHAR\taltname[FF_SFN_BUF + 1];/* Alternative file name */\n\tTCHAR\tfname[FF_LFN_BUF + 1];\t/* Primary file name */\n#else\n\tTCHAR\tfname[12 + 1];\t/* File name */\n#endif\n} FILINFO;\n\n\n\n/* Format parameter structure (MKFS_PARM) */\n\ntypedef struct {\n\tBYTE fmt;\t\t\t/* Format option (FM_FAT, FM_FAT32, FM_EXFAT and FM_SFD) */\n\tBYTE n_fat;\t\t\t/* Number of FATs */\n\tUINT align;\t\t\t/* Data area alignment (sector) */\n\tUINT n_root;\t\t/* Number of root directory entries */\n\tDWORD au_size;\t\t/* Cluster size (byte) */\n} MKFS_PARM;\n\n\n\n/* File function return code (FRESULT) */\n\ntypedef enum {\n\tFR_OK = 0,\t\t\t\t/* (0) Succeeded */\n\tFR_DISK_ERR,\t\t\t/* (1) A hard error occurred in the low level disk I/O layer */\n\tFR_INT_ERR,\t\t\t\t/* (2) Assertion failed */\n\tFR_NOT_READY,\t\t\t/* (3) The physical drive cannot work */\n\tFR_NO_FILE,\t\t\t\t/* (4) Could not find the file */\n\tFR_NO_PATH,\t\t\t\t/* (5) Could not find the path */\n\tFR_INVALID_NAME,\t\t/* (6) The path name format is invalid */\n\tFR_DENIED,\t\t\t\t/* (7) Access denied due to prohibited access or directory full */\n\tFR_EXIST,\t\t\t\t/* (8) Access denied due to prohibited access */\n\tFR_INVALID_OBJECT,\t\t/* (9) The file/directory object is invalid */\n\tFR_WRITE_PROTECTED,\t\t/* (10) The physical drive is write protected */\n\tFR_INVALID_DRIVE,\t\t/* (11) The logical drive number is invalid */\n\tFR_NOT_ENABLED,\t\t\t/* (12) The volume has no work area */\n\tFR_NO_FILESYSTEM,\t\t/* (13) There is no valid FAT volume */\n\tFR_MKFS_ABORTED,\t\t/* (14) The f_mkfs() aborted due to any problem */\n\tFR_TIMEOUT,\t\t\t\t/* (15) Could not get a grant to access the volume within defined period */\n\tFR_LOCKED,\t\t\t\t/* (16) The operation is rejected according to the file sharing policy */\n\tFR_NOT_ENOUGH_CORE,\t\t/* (17) LFN working buffer could not be allocated */\n\tFR_TOO_MANY_OPEN_FILES,\t/* (18) Number of open files > FF_FS_LOCK */\n\tFR_INVALID_PARAMETER\t/* (19) Given parameter is invalid */\n} FRESULT;\n\n\n\n\n/*--------------------------------------------------------------*/\n/* FatFs Module Application Interface                           */\n/*--------------------------------------------------------------*/\n\nFRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode);\t\t\t\t/* Open or create a file */\nFRESULT f_close (FIL* fp);\t\t\t\t\t\t\t\t\t\t\t/* Close an open file object */\nFRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br);\t\t\t/* Read data from the file */\nFRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw);\t/* Write data to the file */\nFRESULT f_lseek (FIL* fp, FSIZE_t ofs);\t\t\t\t\t\t\t\t/* Move file pointer of the file object */\nFRESULT f_truncate (FIL* fp);\t\t\t\t\t\t\t\t\t\t/* Truncate the file */\nFRESULT f_sync (FIL* fp);\t\t\t\t\t\t\t\t\t\t\t/* Flush cached data of the writing file */\nFRESULT f_opendir (DIR* dp, const TCHAR* path);\t\t\t\t\t\t/* Open a directory */\nFRESULT f_closedir (DIR* dp);\t\t\t\t\t\t\t\t\t\t/* Close an open directory */\nFRESULT f_readdir (DIR* dp, FILINFO* fno);\t\t\t\t\t\t\t/* Read a directory item */\nFRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern);\t/* Find first file */\nFRESULT f_findnext (DIR* dp, FILINFO* fno);\t\t\t\t\t\t\t/* Find next file */\nFRESULT f_mkdir (const TCHAR* path);\t\t\t\t\t\t\t\t/* Create a sub directory */\nFRESULT f_unlink (const TCHAR* path);\t\t\t\t\t\t\t\t/* Delete an existing file or directory */\nFRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new);\t/* Rename/Move a file or directory */\nFRESULT f_stat (const TCHAR* path, FILINFO* fno);\t\t\t\t\t/* Get file status */\nFRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask);\t\t\t/* Change attribute of a file/dir */\nFRESULT f_utime (const TCHAR* path, const FILINFO* fno);\t\t\t/* Change timestamp of a file/dir */\nFRESULT f_chdir (const TCHAR* path);\t\t\t\t\t\t\t\t/* Change current directory */\nFRESULT f_chdrive (const TCHAR* path);\t\t\t\t\t\t\t\t/* Change current drive */\nFRESULT f_getcwd (TCHAR* buff, UINT len);\t\t\t\t\t\t\t/* Get current directory */\nFRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs);\t/* Get number of free clusters on the drive */\nFRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn);\t/* Get volume label */\nFRESULT f_setlabel (const TCHAR* label);\t\t\t\t\t\t\t/* Set volume label */\nFRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);\t/* Forward data to the stream */\nFRESULT f_expand (FIL* fp, FSIZE_t fsz, BYTE opt);\t\t\t\t\t/* Allocate a contiguous block to the file */\nFRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);\t\t\t/* Mount/Unmount a logical drive */\nFRESULT f_mkfs (const TCHAR* path, const MKFS_PARM* opt, void* work, UINT len);\t/* Create a FAT volume */\nFRESULT f_fdisk (BYTE pdrv, const LBA_t ptbl[], void* work);\t\t/* Divide a physical drive into some partitions */\nFRESULT f_setcp (WORD cp);\t\t\t\t\t\t\t\t\t\t\t/* Set current code page */\nint f_putc (TCHAR c, FIL* fp);\t\t\t\t\t\t\t\t\t\t/* Put a character to the file */\nint f_puts (const TCHAR* str, FIL* cp);\t\t\t\t\t\t\t\t/* Put a string to the file */\nint f_printf (FIL* fp, const TCHAR* str, ...);\t\t\t\t\t\t/* Put a formatted string to the file */\nTCHAR* f_gets (TCHAR* buff, int len, FIL* fp);\t\t\t\t\t\t/* Get a string from the file */\n\n/* Some API fucntions are implemented as macro */\n\n#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))\n#define f_error(fp) ((fp)->err)\n#define f_tell(fp) ((fp)->fptr)\n#define f_size(fp) ((fp)->obj.objsize)\n#define f_rewind(fp) f_lseek((fp), 0)\n#define f_rewinddir(dp) f_readdir((dp), 0)\n#define f_rmdir(path) f_unlink(path)\n#define f_unmount(path) f_mount(0, path, 0)\n\n\n\n\n/*--------------------------------------------------------------*/\n/* Additional Functions                                         */\n/*--------------------------------------------------------------*/\n\n/* RTC function (provided by user) */\n#if !FF_FS_READONLY && !FF_FS_NORTC\nDWORD get_fattime (void);\t/* Get current time */\n#endif\n\n\n/* LFN support functions (defined in ffunicode.c) */\n\n#if FF_USE_LFN >= 1\nWCHAR ff_oem2uni (WCHAR oem, WORD cp);\t/* OEM code to Unicode conversion */\nWCHAR ff_uni2oem (DWORD uni, WORD cp);\t/* Unicode to OEM code conversion */\nDWORD ff_wtoupper (DWORD uni);\t\t\t/* Unicode upper-case conversion */\n#endif\n\n\n/* O/S dependent functions (samples available in ffsystem.c) */\n\n#if FF_USE_LFN == 3\t\t/* Dynamic memory allocation */\nvoid* ff_memalloc (UINT msize);\t\t/* Allocate memory block */\nvoid ff_memfree (void* mblock);\t\t/* Free memory block */\n#endif\n#if FF_FS_REENTRANT\t/* Sync functions */\nint ff_mutex_create (int vol);\t\t/* Create a sync object */\nvoid ff_mutex_delete (int vol);\t\t/* Delete a sync object */\nint ff_mutex_take (int vol);\t\t/* Lock sync object */\nvoid ff_mutex_give (int vol);\t\t/* Unlock sync object */\n#endif\n\n\n\n\n/*--------------------------------------------------------------*/\n/* Flags and Offset Address                                     */\n/*--------------------------------------------------------------*/\n\n/* File access mode and open method flags (3rd argument of f_open) */\n#define\tFA_READ\t\t\t\t0x01\n#define\tFA_WRITE\t\t\t0x02\n#define\tFA_OPEN_EXISTING\t0x00\n#define\tFA_CREATE_NEW\t\t0x04\n#define\tFA_CREATE_ALWAYS\t0x08\n#define\tFA_OPEN_ALWAYS\t\t0x10\n#define\tFA_OPEN_APPEND\t\t0x30\n\n/* Fast seek controls (2nd argument of f_lseek) */\n#define CREATE_LINKMAP\t((FSIZE_t)0 - 1)\n\n/* Format options (2nd argument of f_mkfs) */\n#define FM_FAT\t\t0x01\n#define FM_FAT32\t0x02\n#define FM_EXFAT\t0x04\n#define FM_ANY\t\t0x07\n#define FM_SFD\t\t0x08\n\n/* Filesystem type (FATFS.fs_type) */\n#define FS_FAT12\t1\n#define FS_FAT16\t2\n#define FS_FAT32\t3\n#define FS_EXFAT\t4\n\n/* File attribute bits for directory entry (FILINFO.fattrib) */\n#define\tAM_RDO\t0x01\t/* Read only */\n#define\tAM_HID\t0x02\t/* Hidden */\n#define\tAM_SYS\t0x04\t/* System */\n#define AM_DIR\t0x10\t/* Directory */\n#define AM_ARC\t0x20\t/* Archive */\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* FF_DEFINED */\n"
  },
  {
    "path": "lib/fatfs/source/ffconf.h",
    "content": "/*---------------------------------------------------------------------------/\n/  Configurations of FatFs Module\n/---------------------------------------------------------------------------*/\n\n#define FFCONF_DEF\t80286\t/* Revision ID */\n\n/*---------------------------------------------------------------------------/\n/ Function Configurations\n/---------------------------------------------------------------------------*/\n\n#define FF_FS_READONLY\t0\n/* This option switches read-only configuration. (0:Read/Write or 1:Read-only)\n/  Read-only configuration removes writing API functions, f_write(), f_sync(),\n/  f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree()\n/  and optional writing functions as well. */\n\n\n#define FF_FS_MINIMIZE\t0\n/* This option defines minimization level to remove some basic API functions.\n/\n/   0: Basic functions are fully enabled.\n/   1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename()\n/      are removed.\n/   2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1.\n/   3: f_lseek() function is removed in addition to 2. */\n\n\n#define FF_USE_FIND\t\t0\n/* This option switches filtered directory read functions, f_findfirst() and\n/  f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */\n\n\n#define FF_USE_MKFS\t\t0\n/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */\n\n\n#define FF_USE_FASTSEEK\t0\n/* This option switches fast seek function. (0:Disable or 1:Enable) */\n\n\n#define FF_USE_EXPAND\t0\n/* This option switches f_expand function. (0:Disable or 1:Enable) */\n\n\n#define FF_USE_CHMOD\t0\n/* This option switches attribute manipulation functions, f_chmod() and f_utime().\n/  (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */\n\n\n#define FF_USE_LABEL\t0\n/* This option switches volume label functions, f_getlabel() and f_setlabel().\n/  (0:Disable or 1:Enable) */\n\n\n#define FF_USE_FORWARD\t0\n/* This option switches f_forward() function. (0:Disable or 1:Enable) */\n\n\n#define FF_USE_STRFUNC\t0\n#define FF_PRINT_LLI\t1\n#define FF_PRINT_FLOAT\t1\n#define FF_STRF_ENCODE\t3\n/* FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() and\n/  f_printf().\n/\n/   0: Disable. FF_PRINT_LLI, FF_PRINT_FLOAT and FF_STRF_ENCODE have no effect.\n/   1: Enable without LF-CRLF conversion.\n/   2: Enable with LF-CRLF conversion.\n/\n/  FF_PRINT_LLI = 1 makes f_printf() support long long argument and FF_PRINT_FLOAT = 1/2\n/  makes f_printf() support floating point argument. These features want C99 or later.\n/  When FF_LFN_UNICODE >= 1 with LFN enabled, string functions convert the character\n/  encoding in it. FF_STRF_ENCODE selects assumption of character encoding ON THE FILE\n/  to be read/written via those functions.\n/\n/   0: ANSI/OEM in current CP\n/   1: Unicode in UTF-16LE\n/   2: Unicode in UTF-16BE\n/   3: Unicode in UTF-8\n*/\n\n\n/*---------------------------------------------------------------------------/\n/ Locale and Namespace Configurations\n/---------------------------------------------------------------------------*/\n\n#define FF_CODE_PAGE\t437\n/* This option specifies the OEM code page to be used on the target system.\n/  Incorrect code page setting can cause a file open failure.\n/\n/   437 - U.S.\n/   720 - Arabic\n/   737 - Greek\n/   771 - KBL\n/   775 - Baltic\n/   850 - Latin 1\n/   852 - Latin 2\n/   855 - Cyrillic\n/   857 - Turkish\n/   860 - Portuguese\n/   861 - Icelandic\n/   862 - Hebrew\n/   863 - Canadian French\n/   864 - Arabic\n/   865 - Nordic\n/   866 - Russian\n/   869 - Greek 2\n/   932 - Japanese (DBCS)\n/   936 - Simplified Chinese (DBCS)\n/   949 - Korean (DBCS)\n/   950 - Traditional Chinese (DBCS)\n/     0 - Include all code pages above and configured by f_setcp()\n*/\n\n\n#define FF_USE_LFN\t\t1\n#define FF_MAX_LFN\t\t255\n/* The FF_USE_LFN switches the support for LFN (long file name).\n/\n/   0: Disable LFN. FF_MAX_LFN has no effect.\n/   1: Enable LFN with static  working buffer on the BSS. Always NOT thread-safe.\n/   2: Enable LFN with dynamic working buffer on the STACK.\n/   3: Enable LFN with dynamic working buffer on the HEAP.\n/\n/  To enable the LFN, ffunicode.c needs to be added to the project. The LFN function\n/  requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and\n/  additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled.\n/  The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can\n/  be in range of 12 to 255. It is recommended to be set it 255 to fully support LFN\n/  specification.\n/  When use stack for the working buffer, take care on stack overflow. When use heap\n/  memory for the working buffer, memory management functions, ff_memalloc() and\n/  ff_memfree() exemplified in ffsystem.c, need to be added to the project. */\n\n\n#define FF_LFN_UNICODE\t0\n/* This option switches the character encoding on the API when LFN is enabled.\n/\n/   0: ANSI/OEM in current CP (TCHAR = char)\n/   1: Unicode in UTF-16 (TCHAR = WCHAR)\n/   2: Unicode in UTF-8 (TCHAR = char)\n/   3: Unicode in UTF-32 (TCHAR = DWORD)\n/\n/  Also behavior of string I/O functions will be affected by this option.\n/  When LFN is not enabled, this option has no effect. */\n\n\n#define FF_LFN_BUF\t\t255\n#define FF_SFN_BUF\t\t12\n/* This set of options defines size of file name members in the FILINFO structure\n/  which is used to read out directory items. These values should be suffcient for\n/  the file names to read. The maximum possible length of the read file name depends\n/  on character encoding. When LFN is not enabled, these options have no effect. */\n\n\n#define FF_FS_RPATH\t\t2\n/* This option configures support for relative path.\n/\n/   0: Disable relative path and remove related functions.\n/   1: Enable relative path. f_chdir() and f_chdrive() are available.\n/   2: f_getcwd() function is available in addition to 1.\n*/\n\n\n/*---------------------------------------------------------------------------/\n/ Drive/Volume Configurations\n/---------------------------------------------------------------------------*/\n\n#define FF_VOLUMES\t\t4\n/* Number of volumes (logical drives) to be used. (1-10) */\n\n\n#define FF_STR_VOLUME_ID\t0\n#define FF_VOLUME_STRS\t\t\"RAM\",\"NAND\",\"CF\",\"SD\",\"SD2\",\"USB\",\"USB2\",\"USB3\"\n/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings.\n/  When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive\n/  number in the path name. FF_VOLUME_STRS defines the volume ID strings for each\n/  logical drives. Number of items must not be less than FF_VOLUMES. Valid\n/  characters for the volume ID strings are A-Z, a-z and 0-9, however, they are\n/  compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is\n/  not defined, a user defined volume string table is needed as:\n/\n/  const char* VolumeStr[FF_VOLUMES] = {\"ram\",\"flash\",\"sd\",\"usb\",...\n*/\n\n\n#define FF_MULTI_PARTITION\t0\n/* This option switches support for multiple volumes on the physical drive.\n/  By default (0), each logical drive number is bound to the same physical drive\n/  number and only an FAT volume found on the physical drive will be mounted.\n/  When this function is enabled (1), each logical drive number can be bound to\n/  arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk()\n/  function will be available. */\n\n\n#define FF_MIN_SS\t\t512\n#define FF_MAX_SS\t\t512\n/* This set of options configures the range of sector size to be supported. (512,\n/  1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and\n/  harddisk, but a larger value may be required for on-board flash memory and some\n/  type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured\n/  for variable sector size mode and disk_ioctl() function needs to implement\n/  GET_SECTOR_SIZE command. */\n\n\n#define FF_LBA64\t\t0\n/* This option switches support for 64-bit LBA. (0:Disable or 1:Enable)\n/  To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) */\n\n\n#define FF_MIN_GPT\t\t0x10000000\n/* Minimum number of sectors to switch GPT as partitioning format in f_mkfs and\n/  f_fdisk function. 0x100000000 max. This option has no effect when FF_LBA64 == 0. */\n\n\n#define FF_USE_TRIM\t\t0\n/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable)\n/  To enable Trim function, also CTRL_TRIM command should be implemented to the\n/  disk_ioctl() function. */\n\n\n\n/*---------------------------------------------------------------------------/\n/ System Configurations\n/---------------------------------------------------------------------------*/\n\n#define FF_FS_TINY\t\t0\n/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny)\n/  At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes.\n/  Instead of private sector buffer eliminated from the file object, common sector\n/  buffer in the filesystem object (FATFS) is used for the file data transfer. */\n\n\n#define FF_FS_EXFAT\t\t0\n/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable)\n/  To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1)\n/  Note that enabling exFAT discards ANSI C (C89) compatibility. */\n\n\n#define FF_FS_NORTC\t\t1\n#define FF_NORTC_MON\t1\n#define FF_NORTC_MDAY\t1\n#define FF_NORTC_YEAR\t2022\n/* The option FF_FS_NORTC switches timestamp feature. If the system does not have\n/  an RTC or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable the\n/  timestamp feature. Every object modified by FatFs will have a fixed timestamp\n/  defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time.\n/  To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be\n/  added to the project to read current time form real-time clock. FF_NORTC_MON,\n/  FF_NORTC_MDAY and FF_NORTC_YEAR have no effect.\n/  These options have no effect in read-only configuration (FF_FS_READONLY = 1). */\n\n\n#define FF_FS_NOFSINFO\t0\n/* If you need to know correct free space on the FAT32 volume, set bit 0 of this\n/  option, and f_getfree() function at the first time after volume mount will force\n/  a full FAT scan. Bit 1 controls the use of last allocated cluster number.\n/\n/  bit0=0: Use free cluster count in the FSINFO if available.\n/  bit0=1: Do not trust free cluster count in the FSINFO.\n/  bit1=0: Use last allocated cluster number in the FSINFO if available.\n/  bit1=1: Do not trust last allocated cluster number in the FSINFO.\n*/\n\n\n#define FF_FS_LOCK\t\t0\n/* The option FF_FS_LOCK switches file lock function to control duplicated file open\n/  and illegal operation to open objects. This option must be 0 when FF_FS_READONLY\n/  is 1.\n/\n/  0:  Disable file lock function. To avoid volume corruption, application program\n/      should avoid illegal open, remove and rename to the open objects.\n/  >0: Enable file lock function. The value defines how many files/sub-directories\n/      can be opened simultaneously under file lock control. Note that the file\n/      lock control is independent of re-entrancy. */\n\n\n#define FF_FS_REENTRANT\t0\n#define FF_FS_TIMEOUT\t1000\n/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs\n/  module itself. Note that regardless of this option, file access to different\n/  volume is always re-entrant and volume control functions, f_mount(), f_mkfs()\n/  and f_fdisk() function, are always not re-entrant. Only file/directory access\n/  to the same volume is under control of this featuer.\n/\n/   0: Disable re-entrancy. FF_FS_TIMEOUT have no effect.\n/   1: Enable re-entrancy. Also user provided synchronization handlers,\n/      ff_mutex_create(), ff_mutex_delete(), ff_mutex_take() and ff_mutex_give()\n/      function, must be added to the project. Samples are available in ffsystem.c.\n/\n/  The FF_FS_TIMEOUT defines timeout period in unit of O/S time tick.\n*/\n\n\n\n/*--- End of configuration options ---*/\n"
  },
  {
    "path": "lib/fatfs/source/ffsystem.c",
    "content": "/*------------------------------------------------------------------------*/\n/* A Sample Code of User Provided OS Dependent Functions for FatFs        */\n/*------------------------------------------------------------------------*/\n\n#include \"ff.h\"\n\n\n#if FF_USE_LFN == 3\t/* Use dynamic memory allocation */\n\n/*------------------------------------------------------------------------*/\n/* Allocate/Free a Memory Block                                           */\n/*------------------------------------------------------------------------*/\n\n#include <stdlib.h>\t\t/* with POSIX API */\n\n\nvoid* ff_memalloc (\t/* Returns pointer to the allocated memory block (null if not enough core) */\n\tUINT msize\t\t/* Number of bytes to allocate */\n)\n{\n\treturn malloc((size_t)msize);\t/* Allocate a new memory block */\n}\n\n\nvoid ff_memfree (\n\tvoid* mblock\t/* Pointer to the memory block to free (no effect if null) */\n)\n{\n\tfree(mblock);\t/* Free the memory block */\n}\n\n#endif\n\n\n\n\n#if FF_FS_REENTRANT\t/* Mutal exclusion */\n/*------------------------------------------------------------------------*/\n/* Definitions of Mutex                                                   */\n/*------------------------------------------------------------------------*/\n\n#define OS_TYPE\t0\t/* 0:Win32, 1:uITRON4.0, 2:uC/OS-II, 3:FreeRTOS, 4:CMSIS-RTOS */\n\n\n#if   OS_TYPE == 0\t/* Win32 */\n#include <windows.h>\nstatic HANDLE Mutex[FF_VOLUMES + 1];\t/* Table of mutex handle */\n\n#elif OS_TYPE == 1\t/* uITRON */\n#include \"itron.h\"\n#include \"kernel.h\"\nstatic mtxid Mutex[FF_VOLUMES + 1];\t\t/* Table of mutex ID */\n\n#elif OS_TYPE == 2\t/* uc/OS-II */\n#include \"includes.h\"\nstatic OS_EVENT *Mutex[FF_VOLUMES + 1];\t/* Table of mutex pinter */\n\n#elif OS_TYPE == 3\t/* FreeRTOS */\n#include \"FreeRTOS.h\"\n#include \"semphr.h\"\nstatic SemaphoreHandle_t Mutex[FF_VOLUMES + 1];\t/* Table of mutex handle */\n\n#elif OS_TYPE == 4\t/* CMSIS-RTOS */\n#include \"cmsis_os.h\"\nstatic osMutexId Mutex[FF_VOLUMES + 1];\t/* Table of mutex ID */\n\n#endif\n\n\n\n/*------------------------------------------------------------------------*/\n/* Create a Mutex                                                         */\n/*------------------------------------------------------------------------*/\n/* This function is called in f_mount function to create a new mutex\n/  or semaphore for the volume. When a 0 is returned, the f_mount function\n/  fails with FR_INT_ERR.\n*/\n\nint ff_mutex_create (\t/* Returns 1:Function succeeded or 0:Could not create the mutex */\n\tint vol\t\t\t\t/* Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES) */\n)\n{\n#if OS_TYPE == 0\t/* Win32 */\n\tMutex[vol] = CreateMutex(NULL, FALSE, NULL);\n\treturn (int)(Mutex[vol] != INVALID_HANDLE_VALUE);\n\n#elif OS_TYPE == 1\t/* uITRON */\n\tT_CMTX cmtx = {TA_TPRI,1};\n\n\tMutex[vol] = acre_mtx(&cmtx);\n\treturn (int)(Mutex[vol] > 0);\n\n#elif OS_TYPE == 2\t/* uC/OS-II */\n\tOS_ERR err;\n\n\tMutex[vol] = OSMutexCreate(0, &err);\n\treturn (int)(err == OS_NO_ERR);\n\n#elif OS_TYPE == 3\t/* FreeRTOS */\n\tMutex[vol] = xSemaphoreCreateMutex();\n\treturn (int)(Mutex[vol] != NULL);\n\n#elif OS_TYPE == 4\t/* CMSIS-RTOS */\n\tosMutexDef(cmsis_os_mutex);\n\n\tMutex[vol] = osMutexCreate(osMutex(cmsis_os_mutex));\n\treturn (int)(Mutex[vol] != NULL);\n\n#endif\n}\n\n\n/*------------------------------------------------------------------------*/\n/* Delete a Mutex                                                         */\n/*------------------------------------------------------------------------*/\n/* This function is called in f_mount function to delete a mutex or\n/  semaphore of the volume created with ff_mutex_create function.\n*/\n\nvoid ff_mutex_delete (\t/* Returns 1:Function succeeded or 0:Could not delete due to an error */\n\tint vol\t\t\t\t/* Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES) */\n)\n{\n#if OS_TYPE == 0\t/* Win32 */\n\tCloseHandle(Mutex[vol]);\n\n#elif OS_TYPE == 1\t/* uITRON */\n\tdel_mtx(Mutex[vol]);\n\n#elif OS_TYPE == 2\t/* uC/OS-II */\n\tOS_ERR err;\n\n\tOSMutexDel(Mutex[vol], OS_DEL_ALWAYS, &err);\n\n#elif OS_TYPE == 3\t/* FreeRTOS */\n\tvSemaphoreDelete(Mutex[vol]);\n\n#elif OS_TYPE == 4\t/* CMSIS-RTOS */\n\tosMutexDelete(Mutex[vol]);\n\n#endif\n}\n\n\n/*------------------------------------------------------------------------*/\n/* Request a Grant to Access the Volume                                   */\n/*------------------------------------------------------------------------*/\n/* This function is called on enter file functions to lock the volume.\n/  When a 0 is returned, the file function fails with FR_TIMEOUT.\n*/\n\nint ff_mutex_take (\t/* Returns 1:Succeeded or 0:Timeout */\n\tint vol\t\t\t/* Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES) */\n)\n{\n#if OS_TYPE == 0\t/* Win32 */\n\treturn (int)(WaitForSingleObject(Mutex[vol], FF_FS_TIMEOUT) == WAIT_OBJECT_0);\n\n#elif OS_TYPE == 1\t/* uITRON */\n\treturn (int)(tloc_mtx(Mutex[vol], FF_FS_TIMEOUT) == E_OK);\n\n#elif OS_TYPE == 2\t/* uC/OS-II */\n\tOS_ERR err;\n\n\tOSMutexPend(Mutex[vol], FF_FS_TIMEOUT, &err));\n\treturn (int)(err == OS_NO_ERR);\n\n#elif OS_TYPE == 3\t/* FreeRTOS */\n\treturn (int)(xSemaphoreTake(Mutex[vol], FF_FS_TIMEOUT) == pdTRUE);\n\n#elif OS_TYPE == 4\t/* CMSIS-RTOS */\n\treturn (int)(osMutexWait(Mutex[vol], FF_FS_TIMEOUT) == osOK);\n\n#endif\n}\n\n\n\n/*------------------------------------------------------------------------*/\n/* Release a Grant to Access the Volume                                   */\n/*------------------------------------------------------------------------*/\n/* This function is called on leave file functions to unlock the volume.\n*/\n\nvoid ff_mutex_give (\n\tint vol\t\t\t/* Mutex ID: Volume mutex (0 to FF_VOLUMES - 1) or system mutex (FF_VOLUMES) */\n)\n{\n#if OS_TYPE == 0\t/* Win32 */\n\tReleaseMutex(Mutex[vol]);\n\n#elif OS_TYPE == 1\t/* uITRON */\n\tunl_mtx(Mutex[vol]);\n\n#elif OS_TYPE == 2\t/* uC/OS-II */\n\tOSMutexPost(Mutex[vol]);\n\n#elif OS_TYPE == 3\t/* FreeRTOS */\n\txSemaphoreGive(Mutex[vol]);\n\n#elif OS_TYPE == 4\t/* CMSIS-RTOS */\n\tosMutexRelease(Mutex[vol]);\n\n#endif\n}\n\n#endif\t/* FF_FS_REENTRANT */\n"
  },
  {
    "path": "lib/fatfs/source/ffunicode.c",
    "content": "/*------------------------------------------------------------------------*/\n/* Unicode Handling Functions for FatFs R0.13 and Later                   */\n/*------------------------------------------------------------------------*/\n/* This module will occupy a huge memory in the .rodata section when the  */\n/* FatFs is configured for LFN with DBCS. If the system has a Unicode     */\n/* library for the code conversion, this module should be modified to use */\n/* it to avoid silly memory consumption.                                  */\n/*------------------------------------------------------------------------*/\n/*\n/ Copyright (C) 2022, ChaN, all right reserved.\n/\n/ FatFs module is an open source software. Redistribution and use of FatFs in\n/ source and binary forms, with or without modification, are permitted provided\n/ that the following condition is met:\n/\n/ 1. Redistributions of source code must retain the above copyright notice,\n/    this condition and the following disclaimer.\n/\n/ This software is provided by the copyright holder and contributors \"AS IS\"\n/ and any warranties related to this software are DISCLAIMED.\n/ The copyright owner or contributors be NOT LIABLE for any damages caused\n/ by use of this software.\n*/\n\n\n#include \"ff.h\"\n\n#if FF_USE_LFN != 0\t/* This module will be blanked if in non-LFN configuration */\n\n#define MERGE2(a, b) a ## b\n#define CVTBL(tbl, cp) MERGE2(tbl, cp)\n\n\n/*------------------------------------------------------------------------*/\n/* Code Conversion Tables                                                 */\n/*------------------------------------------------------------------------*/\n\n#if FF_CODE_PAGE == 932 || FF_CODE_PAGE == 0\t/* Japanese */\nstatic const WCHAR uni2oem932[] = {\t/* Unicode --> Shift_JIS pairs */\n\t0x00A7, 0x8198, 0x00A8, 0x814E, 0x00B0, 0x818B, 0x00B1, 0x817D,\t0x00B4, 0x814C, 0x00B6, 0x81F7, 0x00D7, 0x817E, 0x00F7, 0x8180,\n\t0x0391, 0x839F, 0x0392, 0x83A0, 0x0393, 0x83A1, 0x0394, 0x83A2,\t0x0395, 0x83A3, 0x0396, 0x83A4, 0x0397, 0x83A5, 0x0398, 0x83A6,\n\t0x0399, 0x83A7, 0x039A, 0x83A8, 0x039B, 0x83A9, 0x039C, 0x83AA,\t0x039D, 0x83AB, 0x039E, 0x83AC, 0x039F, 0x83AD, 0x03A0, 0x83AE,\n\t0x03A1, 0x83AF, 0x03A3, 0x83B0, 0x03A4, 0x83B1, 0x03A5, 0x83B2,\t0x03A6, 0x83B3, 0x03A7, 0x83B4, 0x03A8, 0x83B5, 0x03A9, 0x83B6,\n\t0x03B1, 0x83BF, 0x03B2, 0x83C0, 0x03B3, 0x83C1, 0x03B4, 0x83C2,\t0x03B5, 0x83C3, 0x03B6, 0x83C4, 0x03B7, 0x83C5, 0x03B8, 0x83C6,\n\t0x03B9, 0x83C7, 0x03BA, 0x83C8, 0x03BB, 0x83C9, 0x03BC, 0x83CA,\t0x03BD, 0x83CB, 0x03BE, 0x83CC, 0x03BF, 0x83CD, 0x03C0, 0x83CE,\n\t0x03C1, 0x83CF, 0x03C3, 0x83D0, 0x03C4, 0x83D1, 0x03C5, 0x83D2,\t0x03C6, 0x83D3, 0x03C7, 0x83D4, 0x03C8, 0x83D5, 0x03C9, 0x83D6,\n\t0x0401, 0x8446, 0x0410, 0x8440, 0x0411, 0x8441, 0x0412, 0x8442,\t0x0413, 0x8443, 0x0414, 0x8444, 0x0415, 0x8445, 0x0416, 0x8447,\n\t0x0417, 0x8448, 0x0418, 0x8449, 0x0419, 0x844A, 0x041A, 0x844B,\t0x041B, 0x844C, 0x041C, 0x844D, 0x041D, 0x844E, 0x041E, 0x844F,\n\t0x041F, 0x8450, 0x0420, 0x8451, 0x0421, 0x8452, 0x0422, 0x8453,\t0x0423, 0x8454, 0x0424, 0x8455, 0x0425, 0x8456, 0x0426, 0x8457,\n\t0x0427, 0x8458, 0x0428, 0x8459, 0x0429, 0x845A, 0x042A, 0x845B,\t0x042B, 0x845C, 0x042C, 0x845D, 0x042D, 0x845E, 0x042E, 0x845F,\n\t0x042F, 0x8460, 0x0430, 0x8470, 0x0431, 0x8471, 0x0432, 0x8472,\t0x0433, 0x8473, 0x0434, 0x8474, 0x0435, 0x8475, 0x0436, 0x8477,\n\t0x0437, 0x8478, 0x0438, 0x8479, 0x0439, 0x847A, 0x043A, 0x847B,\t0x043B, 0x847C, 0x043C, 0x847D, 0x043D, 0x847E, 0x043E, 0x8480,\n\t0x043F, 0x8481, 0x0440, 0x8482, 0x0441, 0x8483, 0x0442, 0x8484,\t0x0443, 0x8485, 0x0444, 0x8486, 0x0445, 0x8487, 0x0446, 0x8488,\n\t0x0447, 0x8489, 0x0448, 0x848A, 0x0449, 0x848B, 0x044A, 0x848C,\t0x044B, 0x848D, 0x044C, 0x848E, 0x044D, 0x848F, 0x044E, 0x8490,\n\t0x044F, 0x8491, 0x0451, 0x8476, 0x2010, 0x815D, 0x2015, 0x815C,\t0x2018, 0x8165, 0x2019, 0x8166, 0x201C, 0x8167, 0x201D, 0x8168,\n\t0x2020, 0x81F5, 0x2021, 0x81F6, 0x2025, 0x8164, 0x2026, 0x8163,\t0x2030, 0x81F1, 0x2032, 0x818C, 0x2033, 0x818D, 0x203B, 0x81A6,\n\t0x2103, 0x818E, 0x2116, 0x8782, 0x2121, 0x8784, 0x212B, 0x81F0,\t0x2160, 0x8754, 0x2161, 0x8755, 0x2162, 0x8756, 0x2163, 0x8757,\n\t0x2164, 0x8758, 0x2165, 0x8759, 0x2166, 0x875A, 0x2167, 0x875B,\t0x2168, 0x875C, 0x2169, 0x875D, 0x2170, 0xFA40, 0x2171, 0xFA41,\n\t0x2172, 0xFA42, 0x2173, 0xFA43, 0x2174, 0xFA44, 0x2175, 0xFA45,\t0x2176, 0xFA46, 0x2177, 0xFA47, 0x2178, 0xFA48, 0x2179, 0xFA49,\n\t0x2190, 0x81A9, 0x2191, 0x81AA, 0x2192, 0x81A8, 0x2193, 0x81AB,\t0x21D2, 0x81CB, 0x21D4, 0x81CC, 0x2200, 0x81CD, 0x2202, 0x81DD,\n\t0x2203, 0x81CE, 0x2207, 0x81DE, 0x2208, 0x81B8, 0x220B, 0x81B9,\t0x2211, 0x8794, 0x221A, 0x81E3, 0x221D, 0x81E5, 0x221E, 0x8187,\n\t0x221F, 0x8798, 0x2220, 0x81DA, 0x2225, 0x8161, 0x2227, 0x81C8,\t0x2228, 0x81C9, 0x2229, 0x81BF, 0x222A, 0x81BE, 0x222B, 0x81E7,\n\t0x222C, 0x81E8, 0x222E, 0x8793, 0x2234, 0x8188, 0x2235, 0x81E6,\t0x223D, 0x81E4, 0x2252, 0x81E0, 0x2260, 0x8182, 0x2261, 0x81DF,\n\t0x2266, 0x8185, 0x2267, 0x8186, 0x226A, 0x81E1, 0x226B, 0x81E2,\t0x2282, 0x81BC, 0x2283, 0x81BD, 0x2286, 0x81BA, 0x2287, 0x81BB,\n\t0x22A5, 0x81DB, 0x22BF, 0x8799, 0x2312, 0x81DC, 0x2460, 0x8740,\t0x2461, 0x8741, 0x2462, 0x8742, 0x2463, 0x8743, 0x2464, 0x8744,\n\t0x2465, 0x8745, 0x2466, 0x8746, 0x2467, 0x8747, 0x2468, 0x8748,\t0x2469, 0x8749, 0x246A, 0x874A, 0x246B, 0x874B, 0x246C, 0x874C,\n\t0x246D, 0x874D, 0x246E, 0x874E, 0x246F, 0x874F, 0x2470, 0x8750,\t0x2471, 0x8751, 0x2472, 0x8752, 0x2473, 0x8753, 0x2500, 0x849F,\n\t0x2501, 0x84AA, 0x2502, 0x84A0, 0x2503, 0x84AB, 0x250C, 0x84A1,\t0x250F, 0x84AC, 0x2510, 0x84A2, 0x2513, 0x84AD, 0x2514, 0x84A4,\n\t0x2517, 0x84AF, 0x2518, 0x84A3, 0x251B, 0x84AE, 0x251C, 0x84A5,\t0x251D, 0x84BA, 0x2520, 0x84B5, 0x2523, 0x84B0, 0x2524, 0x84A7,\n\t0x2525, 0x84BC, 0x2528, 0x84B7, 0x252B, 0x84B2, 0x252C, 0x84A6,\t0x252F, 0x84B6, 0x2530, 0x84BB, 0x2533, 0x84B1, 0x2534, 0x84A8,\n\t0x2537, 0x84B8, 0x2538, 0x84BD, 0x253B, 0x84B3, 0x253C, 0x84A9,\t0x253F, 0x84B9, 0x2542, 0x84BE, 0x254B, 0x84B4, 0x25A0, 0x81A1,\n\t0x25A1, 0x81A0, 0x25B2, 0x81A3, 0x25B3, 0x81A2, 0x25BC, 0x81A5,\t0x25BD, 0x81A4, 0x25C6, 0x819F, 0x25C7, 0x819E, 0x25CB, 0x819B,\n\t0x25CE, 0x819D, 0x25CF, 0x819C, 0x25EF, 0x81FC, 0x2605, 0x819A,\t0x2606, 0x8199, 0x2640, 0x818A, 0x2642, 0x8189, 0x266A, 0x81F4,\n\t0x266D, 0x81F3, 0x266F, 0x81F2, 0x3000, 0x8140, 0x3001, 0x8141,\t0x3002, 0x8142, 0x3003, 0x8156, 0x3005, 0x8158, 0x3006, 0x8159,\n\t0x3007, 0x815A, 0x3008, 0x8171, 0x3009, 0x8172, 0x300A, 0x8173,\t0x300B, 0x8174, 0x300C, 0x8175, 0x300D, 0x8176, 0x300E, 0x8177,\n\t0x300F, 0x8178, 0x3010, 0x8179, 0x3011, 0x817A, 0x3012, 0x81A7,\t0x3013, 0x81AC, 0x3014, 0x816B, 0x3015, 0x816C, 0x301D, 0x8780,\n\t0x301F, 0x8781, 0x3041, 0x829F, 0x3042, 0x82A0, 0x3043, 0x82A1,\t0x3044, 0x82A2, 0x3045, 0x82A3, 0x3046, 0x82A4, 0x3047, 0x82A5,\n\t0x3048, 0x82A6, 0x3049, 0x82A7, 0x304A, 0x82A8, 0x304B, 0x82A9,\t0x304C, 0x82AA, 0x304D, 0x82AB, 0x304E, 0x82AC, 0x304F, 0x82AD,\n\t0x3050, 0x82AE, 0x3051, 0x82AF, 0x3052, 0x82B0, 0x3053, 0x82B1,\t0x3054, 0x82B2, 0x3055, 0x82B3, 0x3056, 0x82B4, 0x3057, 0x82B5,\n\t0x3058, 0x82B6, 0x3059, 0x82B7, 0x305A, 0x82B8, 0x305B, 0x82B9,\t0x305C, 0x82BA, 0x305D, 0x82BB, 0x305E, 0x82BC, 0x305F, 0x82BD,\n\t0x3060, 0x82BE, 0x3061, 0x82BF, 0x3062, 0x82C0, 0x3063, 0x82C1,\t0x3064, 0x82C2, 0x3065, 0x82C3, 0x3066, 0x82C4, 0x3067, 0x82C5,\n\t0x3068, 0x82C6, 0x3069, 0x82C7, 0x306A, 0x82C8, 0x306B, 0x82C9,\t0x306C, 0x82CA, 0x306D, 0x82CB, 0x306E, 0x82CC, 0x306F, 0x82CD,\n\t0x3070, 0x82CE, 0x3071, 0x82CF, 0x3072, 0x82D0, 0x3073, 0x82D1,\t0x3074, 0x82D2, 0x3075, 0x82D3, 0x3076, 0x82D4, 0x3077, 0x82D5,\n\t0x3078, 0x82D6, 0x3079, 0x82D7, 0x307A, 0x82D8, 0x307B, 0x82D9,\t0x307C, 0x82DA, 0x307D, 0x82DB, 0x307E, 0x82DC, 0x307F, 0x82DD,\n\t0x3080, 0x82DE, 0x3081, 0x82DF, 0x3082, 0x82E0, 0x3083, 0x82E1,\t0x3084, 0x82E2, 0x3085, 0x82E3, 0x3086, 0x82E4, 0x3087, 0x82E5,\n\t0x3088, 0x82E6, 0x3089, 0x82E7, 0x308A, 0x82E8, 0x308B, 0x82E9,\t0x308C, 0x82EA, 0x308D, 0x82EB, 0x308E, 0x82EC, 0x308F, 0x82ED,\n\t0x3090, 0x82EE, 0x3091, 0x82EF, 0x3092, 0x82F0, 0x3093, 0x82F1,\t0x309B, 0x814A, 0x309C, 0x814B, 0x309D, 0x8154, 0x309E, 0x8155,\n\t0x30A1, 0x8340, 0x30A2, 0x8341, 0x30A3, 0x8342, 0x30A4, 0x8343,\t0x30A5, 0x8344, 0x30A6, 0x8345, 0x30A7, 0x8346, 0x30A8, 0x8347,\n\t0x30A9, 0x8348, 0x30AA, 0x8349, 0x30AB, 0x834A, 0x30AC, 0x834B,\t0x30AD, 0x834C, 0x30AE, 0x834D, 0x30AF, 0x834E, 0x30B0, 0x834F,\n\t0x30B1, 0x8350, 0x30B2, 0x8351, 0x30B3, 0x8352, 0x30B4, 0x8353,\t0x30B5, 0x8354, 0x30B6, 0x8355, 0x30B7, 0x8356, 0x30B8, 0x8357,\n\t0x30B9, 0x8358, 0x30BA, 0x8359, 0x30BB, 0x835A, 0x30BC, 0x835B,\t0x30BD, 0x835C, 0x30BE, 0x835D, 0x30BF, 0x835E, 0x30C0, 0x835F,\n\t0x30C1, 0x8360, 0x30C2, 0x8361, 0x30C3, 0x8362, 0x30C4, 0x8363,\t0x30C5, 0x8364, 0x30C6, 0x8365, 0x30C7, 0x8366, 0x30C8, 0x8367,\n\t0x30C9, 0x8368, 0x30CA, 0x8369, 0x30CB, 0x836A, 0x30CC, 0x836B,\t0x30CD, 0x836C, 0x30CE, 0x836D, 0x30CF, 0x836E, 0x30D0, 0x836F,\n\t0x30D1, 0x8370, 0x30D2, 0x8371, 0x30D3, 0x8372, 0x30D4, 0x8373,\t0x30D5, 0x8374, 0x30D6, 0x8375, 0x30D7, 0x8376, 0x30D8, 0x8377,\n\t0x30D9, 0x8378, 0x30DA, 0x8379, 0x30DB, 0x837A, 0x30DC, 0x837B,\t0x30DD, 0x837C, 0x30DE, 0x837D, 0x30DF, 0x837E, 0x30E0, 0x8380,\n\t0x30E1, 0x8381, 0x30E2, 0x8382, 0x30E3, 0x8383, 0x30E4, 0x8384,\t0x30E5, 0x8385, 0x30E6, 0x8386, 0x30E7, 0x8387, 0x30E8, 0x8388,\n\t0x30E9, 0x8389, 0x30EA, 0x838A, 0x30EB, 0x838B, 0x30EC, 0x838C,\t0x30ED, 0x838D, 0x30EE, 0x838E, 0x30EF, 0x838F, 0x30F0, 0x8390,\n\t0x30F1, 0x8391, 0x30F2, 0x8392, 0x30F3, 0x8393, 0x30F4, 0x8394,\t0x30F5, 0x8395, 0x30F6, 0x8396, 0x30FB, 0x8145, 0x30FC, 0x815B,\n\t0x30FD, 0x8152, 0x30FE, 0x8153, 0x3231, 0x878A, 0x3232, 0x878B,\t0x3239, 0x878C, 0x32A4, 0x8785, 0x32A5, 0x8786, 0x32A6, 0x8787,\n\t0x32A7, 0x8788, 0x32A8, 0x8789, 0x3303, 0x8765, 0x330D, 0x8769,\t0x3314, 0x8760, 0x3318, 0x8763, 0x3322, 0x8761, 0x3323, 0x876B,\n\t0x3326, 0x876A, 0x3327, 0x8764, 0x332B, 0x876C, 0x3336, 0x8766,\t0x333B, 0x876E, 0x3349, 0x875F, 0x334A, 0x876D, 0x334D, 0x8762,\n\t0x3351, 0x8767, 0x3357, 0x8768, 0x337B, 0x877E, 0x337C, 0x878F,\t0x337D, 0x878E, 0x337E, 0x878D, 0x338E, 0x8772, 0x338F, 0x8773,\n\t0x339C, 0x876F, 0x339D, 0x8770, 0x339E, 0x8771, 0x33A1, 0x8775,\t0x33C4, 0x8774, 0x33CD, 0x8783, 0x4E00, 0x88EA, 0x4E01, 0x929A,\n\t0x4E03, 0x8EB5, 0x4E07, 0x969C, 0x4E08, 0x8FE4, 0x4E09, 0x8E4F,\t0x4E0A, 0x8FE3, 0x4E0B, 0x89BA, 0x4E0D, 0x9573, 0x4E0E, 0x975E,\n\t0x4E10, 0x98A0, 0x4E11, 0x894E, 0x4E14, 0x8A8E, 0x4E15, 0x98A1,\t0x4E16, 0x90A2, 0x4E17, 0x99C0, 0x4E18, 0x8B75, 0x4E19, 0x95B8,\n\t0x4E1E, 0x8FE5, 0x4E21, 0x97BC, 0x4E26, 0x95C0, 0x4E28, 0xFA68,\t0x4E2A, 0x98A2, 0x4E2D, 0x9286, 0x4E31, 0x98A3, 0x4E32, 0x8BF8,\n\t0x4E36, 0x98A4, 0x4E38, 0x8ADB, 0x4E39, 0x924F, 0x4E3B, 0x8EE5,\t0x4E3C, 0x98A5, 0x4E3F, 0x98A6, 0x4E42, 0x98A7, 0x4E43, 0x9454,\n\t0x4E45, 0x8B76, 0x4E4B, 0x9456, 0x4E4D, 0x93E1, 0x4E4E, 0x8CC1,\t0x4E4F, 0x9652, 0x4E55, 0xE568, 0x4E56, 0x98A8, 0x4E57, 0x8FE6,\n\t0x4E58, 0x98A9, 0x4E59, 0x89B3, 0x4E5D, 0x8BE3, 0x4E5E, 0x8CEE,\t0x4E5F, 0x96E7, 0x4E62, 0x9BA4, 0x4E71, 0x9790, 0x4E73, 0x93FB,\n\t0x4E7E, 0x8AA3, 0x4E80, 0x8B54, 0x4E82, 0x98AA, 0x4E85, 0x98AB,\t0x4E86, 0x97B9, 0x4E88, 0x975C, 0x4E89, 0x9188, 0x4E8A, 0x98AD,\n\t0x4E8B, 0x8E96, 0x4E8C, 0x93F1, 0x4E8E, 0x98B0, 0x4E91, 0x895D,\t0x4E92, 0x8CDD, 0x4E94, 0x8CDC, 0x4E95, 0x88E4, 0x4E98, 0x986A,\n\t0x4E99, 0x9869, 0x4E9B, 0x8DB1, 0x4E9C, 0x889F, 0x4E9E, 0x98B1,\t0x4E9F, 0x98B2, 0x4EA0, 0x98B3, 0x4EA1, 0x9653, 0x4EA2, 0x98B4,\n\t0x4EA4, 0x8CF0, 0x4EA5, 0x88E5, 0x4EA6, 0x9692, 0x4EA8, 0x8B9C,\t0x4EAB, 0x8B9D, 0x4EAC, 0x8B9E, 0x4EAD, 0x92E0, 0x4EAE, 0x97BA,\n\t0x4EB0, 0x98B5, 0x4EB3, 0x98B6, 0x4EB6, 0x98B7, 0x4EBA, 0x906C,\t0x4EC0, 0x8F59, 0x4EC1, 0x906D, 0x4EC2, 0x98BC, 0x4EC4, 0x98BA,\n\t0x4EC6, 0x98BB, 0x4EC7, 0x8B77, 0x4ECA, 0x8DA1, 0x4ECB, 0x89EE,\t0x4ECD, 0x98B9, 0x4ECE, 0x98B8, 0x4ECF, 0x95A7, 0x4ED4, 0x8E65,\n\t0x4ED5, 0x8E64, 0x4ED6, 0x91BC, 0x4ED7, 0x98BD, 0x4ED8, 0x9574,\t0x4ED9, 0x90E5, 0x4EDD, 0x8157, 0x4EDE, 0x98BE, 0x4EDF, 0x98C0,\n\t0x4EE1, 0xFA69, 0x4EE3, 0x91E3, 0x4EE4, 0x97DF, 0x4EE5, 0x88C8,\t0x4EED, 0x98BF, 0x4EEE, 0x89BC, 0x4EF0, 0x8BC2, 0x4EF2, 0x9287,\n\t0x4EF6, 0x8C8F, 0x4EF7, 0x98C1, 0x4EFB, 0x9443, 0x4EFC, 0xFA6A,\t0x4F00, 0xFA6B, 0x4F01, 0x8AE9, 0x4F03, 0xFA6C, 0x4F09, 0x98C2,\n\t0x4F0A, 0x88C9, 0x4F0D, 0x8CDE, 0x4F0E, 0x8AEA, 0x4F0F, 0x959A,\t0x4F10, 0x94B0, 0x4F11, 0x8B78, 0x4F1A, 0x89EF, 0x4F1C, 0x98E5,\n\t0x4F1D, 0x9360, 0x4F2F, 0x948C, 0x4F30, 0x98C4, 0x4F34, 0x94BA,\t0x4F36, 0x97E0, 0x4F38, 0x904C, 0x4F39, 0xFA6D, 0x4F3A, 0x8E66,\n\t0x4F3C, 0x8E97, 0x4F3D, 0x89BE, 0x4F43, 0x92CF, 0x4F46, 0x9241,\t0x4F47, 0x98C8, 0x4F4D, 0x88CA, 0x4F4E, 0x92E1, 0x4F4F, 0x8F5A,\n\t0x4F50, 0x8DB2, 0x4F51, 0x9743, 0x4F53, 0x91CC, 0x4F55, 0x89BD,\t0x4F56, 0xFA6E, 0x4F57, 0x98C7, 0x4F59, 0x975D, 0x4F5A, 0x98C3,\n\t0x4F5B, 0x98C5, 0x4F5C, 0x8DEC, 0x4F5D, 0x98C6, 0x4F5E, 0x9B43,\t0x4F69, 0x98CE, 0x4F6F, 0x98D1, 0x4F70, 0x98CF, 0x4F73, 0x89C0,\n\t0x4F75, 0x95B9, 0x4F76, 0x98C9, 0x4F7B, 0x98CD, 0x4F7C, 0x8CF1,\t0x4F7F, 0x8E67, 0x4F83, 0x8AA4, 0x4F86, 0x98D2, 0x4F88, 0x98CA,\n\t0x4F8A, 0xFA70, 0x4F8B, 0x97E1, 0x4F8D, 0x8E98, 0x4F8F, 0x98CB,\t0x4F91, 0x98D0, 0x4F92, 0xFA6F, 0x4F94, 0xFA72, 0x4F96, 0x98D3,\n\t0x4F98, 0x98CC, 0x4F9A, 0xFA71, 0x4F9B, 0x8B9F, 0x4F9D, 0x88CB,\t0x4FA0, 0x8BA0, 0x4FA1, 0x89BF, 0x4FAB, 0x9B44, 0x4FAD, 0x9699,\n\t0x4FAE, 0x958E, 0x4FAF, 0x8CF2, 0x4FB5, 0x904E, 0x4FB6, 0x97B5,\t0x4FBF, 0x95D6, 0x4FC2, 0x8C57, 0x4FC3, 0x91A3, 0x4FC4, 0x89E2,\n\t0x4FC9, 0xFA61, 0x4FCA, 0x8F72, 0x4FCD, 0xFA73, 0x4FCE, 0x98D7,\t0x4FD0, 0x98DC, 0x4FD1, 0x98DA, 0x4FD4, 0x98D5, 0x4FD7, 0x91AD,\n\t0x4FD8, 0x98D8, 0x4FDA, 0x98DB, 0x4FDB, 0x98D9, 0x4FDD, 0x95DB,\t0x4FDF, 0x98D6, 0x4FE1, 0x904D, 0x4FE3, 0x9693, 0x4FE4, 0x98DD,\n\t0x4FE5, 0x98DE, 0x4FEE, 0x8F43, 0x4FEF, 0x98EB, 0x4FF3, 0x946F,\t0x4FF5, 0x9555, 0x4FF6, 0x98E6, 0x4FF8, 0x95EE, 0x4FFA, 0x89B4,\n\t0x4FFE, 0x98EA, 0x4FFF, 0xFA76, 0x5005, 0x98E4, 0x5006, 0x98ED,\t0x5009, 0x9171, 0x500B, 0x8CC2, 0x500D, 0x947B, 0x500F, 0xE0C5,\n\t0x5011, 0x98EC, 0x5012, 0x937C, 0x5014, 0x98E1, 0x5016, 0x8CF4,\t0x5019, 0x8CF3, 0x501A, 0x98DF, 0x501E, 0xFA77, 0x501F, 0x8ED8,\n\t0x5021, 0x98E7, 0x5022, 0xFA75, 0x5023, 0x95ED, 0x5024, 0x926C,\t0x5025, 0x98E3, 0x5026, 0x8C91, 0x5028, 0x98E0, 0x5029, 0x98E8,\n\t0x502A, 0x98E2, 0x502B, 0x97CF, 0x502C, 0x98E9, 0x502D, 0x9860,\t0x5036, 0x8BE4, 0x5039, 0x8C90, 0x5040, 0xFA74, 0x5042, 0xFA7A,\n\t0x5043, 0x98EE, 0x5046, 0xFA78, 0x5047, 0x98EF, 0x5048, 0x98F3,\t0x5049, 0x88CC, 0x504F, 0x95CE, 0x5050, 0x98F2, 0x5055, 0x98F1,\n\t0x5056, 0x98F5, 0x505A, 0x98F4, 0x505C, 0x92E2, 0x5065, 0x8C92,\t0x506C, 0x98F6, 0x5070, 0xFA79, 0x5072, 0x8EC3, 0x5074, 0x91A4,\n\t0x5075, 0x92E3, 0x5076, 0x8BF4, 0x5078, 0x98F7, 0x507D, 0x8B55,\t0x5080, 0x98F8, 0x5085, 0x98FA, 0x508D, 0x9654, 0x5091, 0x8C86,\n\t0x5094, 0xFA7B, 0x5098, 0x8E50, 0x5099, 0x94F5, 0x509A, 0x98F9,\t0x50AC, 0x8DC3, 0x50AD, 0x9762, 0x50B2, 0x98FC, 0x50B3, 0x9942,\n\t0x50B4, 0x98FB, 0x50B5, 0x8DC2, 0x50B7, 0x8F9D, 0x50BE, 0x8C58,\t0x50C2, 0x9943, 0x50C5, 0x8BCD, 0x50C9, 0x9940, 0x50CA, 0x9941,\n\t0x50CD, 0x93AD, 0x50CF, 0x919C, 0x50D1, 0x8BA1, 0x50D5, 0x966C,\t0x50D6, 0x9944, 0x50D8, 0xFA7D, 0x50DA, 0x97BB, 0x50DE, 0x9945,\n\t0x50E3, 0x9948, 0x50E5, 0x9946, 0x50E7, 0x916D, 0x50ED, 0x9947,\t0x50EE, 0x9949, 0x50F4, 0xFA7C, 0x50F5, 0x994B, 0x50F9, 0x994A,\n\t0x50FB, 0x95C6, 0x5100, 0x8B56, 0x5101, 0x994D, 0x5102, 0x994E,\t0x5104, 0x89AD, 0x5109, 0x994C, 0x5112, 0x8EF2, 0x5114, 0x9951,\n\t0x5115, 0x9950, 0x5116, 0x994F, 0x5118, 0x98D4, 0x511A, 0x9952,\t0x511F, 0x8F9E, 0x5121, 0x9953, 0x512A, 0x9744, 0x5132, 0x96D7,\n\t0x5137, 0x9955, 0x513A, 0x9954, 0x513B, 0x9957, 0x513C, 0x9956,\t0x513F, 0x9958, 0x5140, 0x9959, 0x5141, 0x88F2, 0x5143, 0x8CB3,\n\t0x5144, 0x8C5A, 0x5145, 0x8F5B, 0x5146, 0x929B, 0x5147, 0x8BA2,\t0x5148, 0x90E6, 0x5149, 0x8CF5, 0x514A, 0xFA7E, 0x514B, 0x8D8E,\n\t0x514C, 0x995B, 0x514D, 0x96C6, 0x514E, 0x9365, 0x5150, 0x8E99,\t0x5152, 0x995A, 0x5154, 0x995C, 0x515A, 0x937D, 0x515C, 0x8A95,\n\t0x5162, 0x995D, 0x5164, 0xFA80, 0x5165, 0x93FC, 0x5168, 0x9153,\t0x5169, 0x995F, 0x516A, 0x9960, 0x516B, 0x94AA, 0x516C, 0x8CF6,\n\t0x516D, 0x985A, 0x516E, 0x9961, 0x5171, 0x8BA4, 0x5175, 0x95BA,\t0x5176, 0x91B4, 0x5177, 0x8BEF, 0x5178, 0x9354, 0x517C, 0x8C93,\n\t0x5180, 0x9962, 0x5182, 0x9963, 0x5185, 0x93E0, 0x5186, 0x897E,\t0x5189, 0x9966, 0x518A, 0x8DFB, 0x518C, 0x9965, 0x518D, 0x8DC4,\n\t0x518F, 0x9967, 0x5190, 0xE3EC, 0x5191, 0x9968, 0x5192, 0x9660,\t0x5193, 0x9969, 0x5195, 0x996A, 0x5196, 0x996B, 0x5197, 0x8FE7,\n\t0x5199, 0x8ECA, 0x519D, 0xFA81, 0x51A0, 0x8AA5, 0x51A2, 0x996E,\t0x51A4, 0x996C, 0x51A5, 0x96BB, 0x51A6, 0x996D, 0x51A8, 0x9579,\n\t0x51A9, 0x996F, 0x51AA, 0x9970, 0x51AB, 0x9971, 0x51AC, 0x937E,\t0x51B0, 0x9975, 0x51B1, 0x9973, 0x51B2, 0x9974, 0x51B3, 0x9972,\n\t0x51B4, 0x8DE1, 0x51B5, 0x9976, 0x51B6, 0x96E8, 0x51B7, 0x97E2,\t0x51BD, 0x9977, 0x51BE, 0xFA82, 0x51C4, 0x90A6, 0x51C5, 0x9978,\n\t0x51C6, 0x8F79, 0x51C9, 0x9979, 0x51CB, 0x929C, 0x51CC, 0x97BD,\t0x51CD, 0x9380, 0x51D6, 0x99C3, 0x51DB, 0x997A, 0x51DC, 0xEAA3,\n\t0x51DD, 0x8BC3, 0x51E0, 0x997B, 0x51E1, 0x967D, 0x51E6, 0x8F88,\t0x51E7, 0x91FA, 0x51E9, 0x997D, 0x51EA, 0x93E2, 0x51EC, 0xFA83,\n\t0x51ED, 0x997E, 0x51F0, 0x9980, 0x51F1, 0x8A4D, 0x51F5, 0x9981,\t0x51F6, 0x8BA5, 0x51F8, 0x93CA, 0x51F9, 0x899A, 0x51FA, 0x8F6F,\n\t0x51FD, 0x949F, 0x51FE, 0x9982, 0x5200, 0x9381, 0x5203, 0x906E,\t0x5204, 0x9983, 0x5206, 0x95AA, 0x5207, 0x90D8, 0x5208, 0x8AA0,\n\t0x520A, 0x8AA7, 0x520B, 0x9984, 0x520E, 0x9986, 0x5211, 0x8C59,\t0x5214, 0x9985, 0x5215, 0xFA84, 0x5217, 0x97F1, 0x521D, 0x8F89,\n\t0x5224, 0x94BB, 0x5225, 0x95CA, 0x5227, 0x9987, 0x5229, 0x9798,\t0x522A, 0x9988, 0x522E, 0x9989, 0x5230, 0x939E, 0x5233, 0x998A,\n\t0x5236, 0x90A7, 0x5237, 0x8DFC, 0x5238, 0x8C94, 0x5239, 0x998B,\t0x523A, 0x8E68, 0x523B, 0x8D8F, 0x5243, 0x92E4, 0x5244, 0x998D,\n\t0x5247, 0x91A5, 0x524A, 0x8DED, 0x524B, 0x998E, 0x524C, 0x998F,\t0x524D, 0x914F, 0x524F, 0x998C, 0x5254, 0x9991, 0x5256, 0x9655,\n\t0x525B, 0x8D84, 0x525E, 0x9990, 0x5263, 0x8C95, 0x5264, 0x8DDC,\t0x5265, 0x948D, 0x5269, 0x9994, 0x526A, 0x9992, 0x526F, 0x959B,\n\t0x5270, 0x8FE8, 0x5271, 0x999B, 0x5272, 0x8A84, 0x5273, 0x9995,\t0x5274, 0x9993, 0x5275, 0x916E, 0x527D, 0x9997, 0x527F, 0x9996,\n\t0x5283, 0x8A63, 0x5287, 0x8C80, 0x5288, 0x999C, 0x5289, 0x97AB,\t0x528D, 0x9998, 0x5291, 0x999D, 0x5292, 0x999A, 0x5294, 0x9999,\n\t0x529B, 0x97CD, 0x529C, 0xFA85, 0x529F, 0x8CF7, 0x52A0, 0x89C1,\t0x52A3, 0x97F2, 0x52A6, 0xFA86, 0x52A9, 0x8F95, 0x52AA, 0x9377,\n\t0x52AB, 0x8D85, 0x52AC, 0x99A0, 0x52AD, 0x99A1, 0x52AF, 0xFB77,\t0x52B1, 0x97E3, 0x52B4, 0x984A, 0x52B5, 0x99A3, 0x52B9, 0x8CF8,\n\t0x52BC, 0x99A2, 0x52BE, 0x8A4E, 0x52C0, 0xFA87, 0x52C1, 0x99A4,\t0x52C3, 0x9675, 0x52C5, 0x92BA, 0x52C7, 0x9745, 0x52C9, 0x95D7,\n\t0x52CD, 0x99A5, 0x52D2, 0xE8D3, 0x52D5, 0x93AE, 0x52D7, 0x99A6,\t0x52D8, 0x8AA8, 0x52D9, 0x96B1, 0x52DB, 0xFA88, 0x52DD, 0x8F9F,\n\t0x52DE, 0x99A7, 0x52DF, 0x95E5, 0x52E0, 0x99AB, 0x52E2, 0x90A8,\t0x52E3, 0x99A8, 0x52E4, 0x8BCE, 0x52E6, 0x99A9, 0x52E7, 0x8AA9,\n\t0x52F2, 0x8C4D, 0x52F3, 0x99AC, 0x52F5, 0x99AD, 0x52F8, 0x99AE,\t0x52F9, 0x99AF, 0x52FA, 0x8ED9, 0x52FE, 0x8CF9, 0x52FF, 0x96DC,\n\t0x5300, 0xFA89, 0x5301, 0x96E6, 0x5302, 0x93F5, 0x5305, 0x95EF,\t0x5306, 0x99B0, 0x5307, 0xFA8A, 0x5308, 0x99B1, 0x530D, 0x99B3,\n\t0x530F, 0x99B5, 0x5310, 0x99B4, 0x5315, 0x99B6, 0x5316, 0x89BB,\t0x5317, 0x966B, 0x5319, 0x8DFA, 0x531A, 0x99B7, 0x531D, 0x9178,\n\t0x5320, 0x8FA0, 0x5321, 0x8BA7, 0x5323, 0x99B8, 0x5324, 0xFA8B,\t0x532A, 0x94D9, 0x532F, 0x99B9, 0x5331, 0x99BA, 0x5333, 0x99BB,\n\t0x5338, 0x99BC, 0x5339, 0x9543, 0x533A, 0x8BE6, 0x533B, 0x88E3,\t0x533F, 0x93BD, 0x5340, 0x99BD, 0x5341, 0x8F5C, 0x5343, 0x90E7,\n\t0x5345, 0x99BF, 0x5346, 0x99BE, 0x5347, 0x8FA1, 0x5348, 0x8CDF,\t0x5349, 0x99C1, 0x534A, 0x94BC, 0x534D, 0x99C2, 0x5351, 0x94DA,\n\t0x5352, 0x91B2, 0x5353, 0x91EC, 0x5354, 0x8BA6, 0x5357, 0x93EC,\t0x5358, 0x9250, 0x535A, 0x948E, 0x535C, 0x966D, 0x535E, 0x99C4,\n\t0x5360, 0x90E8, 0x5366, 0x8C54, 0x5369, 0x99C5, 0x536E, 0x99C6,\t0x536F, 0x894B, 0x5370, 0x88F3, 0x5371, 0x8AEB, 0x5372, 0xFA8C,\n\t0x5373, 0x91A6, 0x5374, 0x8B70, 0x5375, 0x9791, 0x5377, 0x99C9,\t0x5378, 0x89B5, 0x537B, 0x99C8, 0x537F, 0x8BA8, 0x5382, 0x99CA,\n\t0x5384, 0x96EF, 0x5393, 0xFA8D, 0x5396, 0x99CB, 0x5398, 0x97D0,\t0x539A, 0x8CFA, 0x539F, 0x8CB4, 0x53A0, 0x99CC, 0x53A5, 0x99CE,\n\t0x53A6, 0x99CD, 0x53A8, 0x907E, 0x53A9, 0x8958, 0x53AD, 0x897D,\t0x53AE, 0x99CF, 0x53B0, 0x99D0, 0x53B2, 0xFA8E, 0x53B3, 0x8CB5,\n\t0x53B6, 0x99D1, 0x53BB, 0x8B8E, 0x53C2, 0x8E51, 0x53C3, 0x99D2,\t0x53C8, 0x9694, 0x53C9, 0x8DB3, 0x53CA, 0x8B79, 0x53CB, 0x9746,\n\t0x53CC, 0x916F, 0x53CD, 0x94BD, 0x53CE, 0x8EFB, 0x53D4, 0x8F66,\t0x53D6, 0x8EE6, 0x53D7, 0x8EF3, 0x53D9, 0x8F96, 0x53DB, 0x94BE,\n\t0x53DD, 0xFA8F, 0x53DF, 0x99D5, 0x53E1, 0x8962, 0x53E2, 0x9170,\t0x53E3, 0x8CFB, 0x53E4, 0x8CC3, 0x53E5, 0x8BE5, 0x53E8, 0x99D9,\n\t0x53E9, 0x9240, 0x53EA, 0x91FC, 0x53EB, 0x8BA9, 0x53EC, 0x8FA2,\t0x53ED, 0x99DA, 0x53EE, 0x99D8, 0x53EF, 0x89C2, 0x53F0, 0x91E4,\n\t0x53F1, 0x8EB6, 0x53F2, 0x8E6A, 0x53F3, 0x8945, 0x53F6, 0x8A90,\t0x53F7, 0x8D86, 0x53F8, 0x8E69, 0x53FA, 0x99DB, 0x5401, 0x99DC,\n\t0x5403, 0x8B68, 0x5404, 0x8A65, 0x5408, 0x8D87, 0x5409, 0x8B67,\t0x540A, 0x92DD, 0x540B, 0x8944, 0x540C, 0x93AF, 0x540D, 0x96BC,\n\t0x540E, 0x8D40, 0x540F, 0x9799, 0x5410, 0x9366, 0x5411, 0x8CFC,\t0x541B, 0x8C4E, 0x541D, 0x99E5, 0x541F, 0x8BE1, 0x5420, 0x9669,\n\t0x5426, 0x94DB, 0x5429, 0x99E4, 0x542B, 0x8ADC, 0x542C, 0x99DF,\t0x542D, 0x99E0, 0x542E, 0x99E2, 0x5436, 0x99E3, 0x5438, 0x8B7A,\n\t0x5439, 0x9081, 0x543B, 0x95AB, 0x543C, 0x99E1, 0x543D, 0x99DD,\t0x543E, 0x8CE1, 0x5440, 0x99DE, 0x5442, 0x9843, 0x5446, 0x95F0,\n\t0x5448, 0x92E6, 0x5449, 0x8CE0, 0x544A, 0x8D90, 0x544E, 0x99E6,\t0x5451, 0x93DB, 0x545F, 0x99EA, 0x5468, 0x8EFC, 0x546A, 0x8EF4,\n\t0x5470, 0x99ED, 0x5471, 0x99EB, 0x5473, 0x96A1, 0x5475, 0x99E8,\t0x5476, 0x99F1, 0x5477, 0x99EC, 0x547B, 0x99EF, 0x547C, 0x8CC4,\n\t0x547D, 0x96BD, 0x5480, 0x99F0, 0x5484, 0x99F2, 0x5486, 0x99F4,\t0x548A, 0xFA92, 0x548B, 0x8DEE, 0x548C, 0x9861, 0x548E, 0x99E9,\n\t0x548F, 0x99E7, 0x5490, 0x99F3, 0x5492, 0x99EE, 0x549C, 0xFA91,\t0x54A2, 0x99F6, 0x54A4, 0x9A42, 0x54A5, 0x99F8, 0x54A8, 0x99FC,\n\t0x54A9, 0xFA93, 0x54AB, 0x9A40, 0x54AC, 0x99F9, 0x54AF, 0x9A5D,\t0x54B2, 0x8DE7, 0x54B3, 0x8A50, 0x54B8, 0x99F7, 0x54BC, 0x9A44,\n\t0x54BD, 0x88F4, 0x54BE, 0x9A43, 0x54C0, 0x88A3, 0x54C1, 0x9569,\t0x54C2, 0x9A41, 0x54C4, 0x99FA, 0x54C7, 0x99F5, 0x54C8, 0x99FB,\n\t0x54C9, 0x8DC6, 0x54D8, 0x9A45, 0x54E1, 0x88F5, 0x54E2, 0x9A4E,\t0x54E5, 0x9A46, 0x54E6, 0x9A47, 0x54E8, 0x8FA3, 0x54E9, 0x9689,\n\t0x54ED, 0x9A4C, 0x54EE, 0x9A4B, 0x54F2, 0x934E, 0x54FA, 0x9A4D,\t0x54FD, 0x9A4A, 0x54FF, 0xFA94, 0x5504, 0x8953, 0x5506, 0x8DB4,\n\t0x5507, 0x904F, 0x550F, 0x9A48, 0x5510, 0x9382, 0x5514, 0x9A49,\t0x5516, 0x88A0, 0x552E, 0x9A53, 0x552F, 0x9742, 0x5531, 0x8FA5,\n\t0x5533, 0x9A59, 0x5538, 0x9A58, 0x5539, 0x9A4F, 0x553E, 0x91C1,\t0x5540, 0x9A50, 0x5544, 0x91ED, 0x5545, 0x9A55, 0x5546, 0x8FA4,\n\t0x554C, 0x9A52, 0x554F, 0x96E2, 0x5553, 0x8C5B, 0x5556, 0x9A56,\t0x5557, 0x9A57, 0x555C, 0x9A54, 0x555D, 0x9A5A, 0x5563, 0x9A51,\n\t0x557B, 0x9A60, 0x557C, 0x9A65, 0x557E, 0x9A61, 0x5580, 0x9A5C,\t0x5583, 0x9A66, 0x5584, 0x9150, 0x5586, 0xFA95, 0x5587, 0x9A68,\n\t0x5589, 0x8D41, 0x558A, 0x9A5E, 0x558B, 0x929D, 0x5598, 0x9A62,\t0x5599, 0x9A5B, 0x559A, 0x8AAB, 0x559C, 0x8AEC, 0x559D, 0x8A85,\n\t0x559E, 0x9A63, 0x559F, 0x9A5F, 0x55A7, 0x8C96, 0x55A8, 0x9A69,\t0x55A9, 0x9A67, 0x55AA, 0x9172, 0x55AB, 0x8B69, 0x55AC, 0x8BAA,\n\t0x55AE, 0x9A64, 0x55B0, 0x8BF2, 0x55B6, 0x8963, 0x55C4, 0x9A6D,\t0x55C5, 0x9A6B, 0x55C7, 0x9AA5, 0x55D4, 0x9A70, 0x55DA, 0x9A6A,\n\t0x55DC, 0x9A6E, 0x55DF, 0x9A6C, 0x55E3, 0x8E6B, 0x55E4, 0x9A6F,\t0x55F7, 0x9A72, 0x55F9, 0x9A77, 0x55FD, 0x9A75, 0x55FE, 0x9A74,\n\t0x5606, 0x9251, 0x5609, 0x89C3, 0x5614, 0x9A71, 0x5616, 0x9A73,\t0x5617, 0x8FA6, 0x5618, 0x8952, 0x561B, 0x9A76, 0x5629, 0x89DC,\n\t0x562F, 0x9A82, 0x5631, 0x8FFA, 0x5632, 0x9A7D, 0x5634, 0x9A7B,\t0x5636, 0x9A7C, 0x5638, 0x9A7E, 0x5642, 0x895C, 0x564C, 0x9158,\n\t0x564E, 0x9A78, 0x5650, 0x9A79, 0x565B, 0x8A9A, 0x5664, 0x9A81,\t0x5668, 0x8AED, 0x566A, 0x9A84, 0x566B, 0x9A80, 0x566C, 0x9A83,\n\t0x5674, 0x95AC, 0x5678, 0x93D3, 0x567A, 0x94B6, 0x5680, 0x9A86,\t0x5686, 0x9A85, 0x5687, 0x8A64, 0x568A, 0x9A87, 0x568F, 0x9A8A,\n\t0x5694, 0x9A89, 0x56A0, 0x9A88, 0x56A2, 0x9458, 0x56A5, 0x9A8B,\t0x56AE, 0x9A8C, 0x56B4, 0x9A8E, 0x56B6, 0x9A8D, 0x56BC, 0x9A90,\n\t0x56C0, 0x9A93, 0x56C1, 0x9A91, 0x56C2, 0x9A8F, 0x56C3, 0x9A92,\t0x56C8, 0x9A94, 0x56CE, 0x9A95, 0x56D1, 0x9A96, 0x56D3, 0x9A97,\n\t0x56D7, 0x9A98, 0x56D8, 0x9964, 0x56DA, 0x8EFA, 0x56DB, 0x8E6C,\t0x56DE, 0x89F1, 0x56E0, 0x88F6, 0x56E3, 0x9263, 0x56EE, 0x9A99,\n\t0x56F0, 0x8DA2, 0x56F2, 0x88CD, 0x56F3, 0x907D, 0x56F9, 0x9A9A,\t0x56FA, 0x8CC5, 0x56FD, 0x8D91, 0x56FF, 0x9A9C, 0x5700, 0x9A9B,\n\t0x5703, 0x95DE, 0x5704, 0x9A9D, 0x5708, 0x9A9F, 0x5709, 0x9A9E,\t0x570B, 0x9AA0, 0x570D, 0x9AA1, 0x570F, 0x8C97, 0x5712, 0x8980,\n\t0x5713, 0x9AA2, 0x5716, 0x9AA4, 0x5718, 0x9AA3, 0x571C, 0x9AA6,\t0x571F, 0x9379, 0x5726, 0x9AA7, 0x5727, 0x88B3, 0x5728, 0x8DDD,\n\t0x572D, 0x8C5C, 0x5730, 0x926E, 0x5737, 0x9AA8, 0x5738, 0x9AA9,\t0x573B, 0x9AAB, 0x5740, 0x9AAC, 0x5742, 0x8DE2, 0x5747, 0x8BCF,\n\t0x574A, 0x9656, 0x574E, 0x9AAA, 0x574F, 0x9AAD, 0x5750, 0x8DBF,\t0x5751, 0x8D42, 0x5759, 0xFA96, 0x5761, 0x9AB1, 0x5764, 0x8DA3,\n\t0x5765, 0xFA97, 0x5766, 0x9252, 0x5769, 0x9AAE, 0x576A, 0x92D8,\t0x577F, 0x9AB2, 0x5782, 0x9082, 0x5788, 0x9AB0, 0x5789, 0x9AB3,\n\t0x578B, 0x8C5E, 0x5793, 0x9AB4, 0x57A0, 0x9AB5, 0x57A2, 0x8D43,\t0x57A3, 0x8A5F, 0x57A4, 0x9AB7, 0x57AA, 0x9AB8, 0x57AC, 0xFA98,\n\t0x57B0, 0x9AB9, 0x57B3, 0x9AB6, 0x57C0, 0x9AAF, 0x57C3, 0x9ABA,\t0x57C6, 0x9ABB, 0x57C7, 0xFA9A, 0x57C8, 0xFA99, 0x57CB, 0x9684,\n\t0x57CE, 0x8FE9, 0x57D2, 0x9ABD, 0x57D3, 0x9ABE, 0x57D4, 0x9ABC,\t0x57D6, 0x9AC0, 0x57DC, 0x9457, 0x57DF, 0x88E6, 0x57E0, 0x9575,\n\t0x57E3, 0x9AC1, 0x57F4, 0x8FFB, 0x57F7, 0x8EB7, 0x57F9, 0x947C,\t0x57FA, 0x8AEE, 0x57FC, 0x8DE9, 0x5800, 0x9678, 0x5802, 0x93B0,\n\t0x5805, 0x8C98, 0x5806, 0x91CD, 0x580A, 0x9ABF, 0x580B, 0x9AC2,\t0x5815, 0x91C2, 0x5819, 0x9AC3, 0x581D, 0x9AC4, 0x5821, 0x9AC6,\n\t0x5824, 0x92E7, 0x582A, 0x8AAC, 0x582F, 0xEA9F, 0x5830, 0x8981,\t0x5831, 0x95F1, 0x5834, 0x8FEA, 0x5835, 0x9367, 0x583A, 0x8DE4,\n\t0x583D, 0x9ACC, 0x5840, 0x95BB, 0x5841, 0x97DB, 0x584A, 0x89F2,\t0x584B, 0x9AC8, 0x5851, 0x9159, 0x5852, 0x9ACB, 0x5854, 0x9383,\n\t0x5857, 0x9368, 0x5858, 0x9384, 0x5859, 0x94B7, 0x585A, 0x92CB,\t0x585E, 0x8DC7, 0x5862, 0x9AC7, 0x5869, 0x8996, 0x586B, 0x9355,\n\t0x5870, 0x9AC9, 0x5872, 0x9AC5, 0x5875, 0x906F, 0x5879, 0x9ACD,\t0x587E, 0x8F6D, 0x5883, 0x8BAB, 0x5885, 0x9ACE, 0x5893, 0x95E6,\n\t0x5897, 0x919D, 0x589C, 0x92C4, 0x589E, 0xFA9D, 0x589F, 0x9AD0,\t0x58A8, 0x966E, 0x58AB, 0x9AD1, 0x58AE, 0x9AD6, 0x58B2, 0xFA9E,\n\t0x58B3, 0x95AD, 0x58B8, 0x9AD5, 0x58B9, 0x9ACF, 0x58BA, 0x9AD2,\t0x58BB, 0x9AD4, 0x58BE, 0x8DA4, 0x58C1, 0x95C7, 0x58C5, 0x9AD7,\n\t0x58C7, 0x9264, 0x58CA, 0x89F3, 0x58CC, 0x8FEB, 0x58D1, 0x9AD9,\t0x58D3, 0x9AD8, 0x58D5, 0x8D88, 0x58D7, 0x9ADA, 0x58D8, 0x9ADC,\n\t0x58D9, 0x9ADB, 0x58DC, 0x9ADE, 0x58DE, 0x9AD3, 0x58DF, 0x9AE0,\t0x58E4, 0x9ADF, 0x58E5, 0x9ADD, 0x58EB, 0x8E6D, 0x58EC, 0x9070,\n\t0x58EE, 0x9173, 0x58EF, 0x9AE1, 0x58F0, 0x90BA, 0x58F1, 0x88EB,\t0x58F2, 0x9484, 0x58F7, 0x92D9, 0x58F9, 0x9AE3, 0x58FA, 0x9AE2,\n\t0x58FB, 0x9AE4, 0x58FC, 0x9AE5, 0x58FD, 0x9AE6, 0x5902, 0x9AE7,\t0x5909, 0x95CF, 0x590A, 0x9AE8, 0x590B, 0xFA9F, 0x590F, 0x89C4,\n\t0x5910, 0x9AE9, 0x5915, 0x975B, 0x5916, 0x8A4F, 0x5918, 0x99C7,\t0x5919, 0x8F67, 0x591A, 0x91BD, 0x591B, 0x9AEA, 0x591C, 0x96E9,\n\t0x5922, 0x96B2, 0x5925, 0x9AEC, 0x5927, 0x91E5, 0x5929, 0x9356,\t0x592A, 0x91BE, 0x592B, 0x9576, 0x592C, 0x9AED, 0x592D, 0x9AEE,\n\t0x592E, 0x899B, 0x5931, 0x8EB8, 0x5932, 0x9AEF, 0x5937, 0x88CE,\t0x5938, 0x9AF0, 0x593E, 0x9AF1, 0x5944, 0x8982, 0x5947, 0x8AEF,\n\t0x5948, 0x93DE, 0x5949, 0x95F2, 0x594E, 0x9AF5, 0x594F, 0x9174,\t0x5950, 0x9AF4, 0x5951, 0x8C5F, 0x5953, 0xFAA0, 0x5954, 0x967A,\n\t0x5955, 0x9AF3, 0x5957, 0x9385, 0x5958, 0x9AF7, 0x595A, 0x9AF6,\t0x595B, 0xFAA1, 0x595D, 0xFAA2, 0x5960, 0x9AF9, 0x5962, 0x9AF8,\n\t0x5963, 0xFAA3, 0x5965, 0x899C, 0x5967, 0x9AFA, 0x5968, 0x8FA7,\t0x5969, 0x9AFC, 0x596A, 0x9244, 0x596C, 0x9AFB, 0x596E, 0x95B1,\n\t0x5973, 0x8F97, 0x5974, 0x937A, 0x5978, 0x9B40, 0x597D, 0x8D44,\t0x5981, 0x9B41, 0x5982, 0x9440, 0x5983, 0x94DC, 0x5984, 0x96CF,\n\t0x598A, 0x9444, 0x598D, 0x9B4A, 0x5993, 0x8B57, 0x5996, 0x9764,\t0x5999, 0x96AD, 0x599B, 0x9BAA, 0x599D, 0x9B42, 0x59A3, 0x9B45,\n\t0x59A4, 0xFAA4, 0x59A5, 0x91C3, 0x59A8, 0x9657, 0x59AC, 0x9369,\t0x59B2, 0x9B46, 0x59B9, 0x9685, 0x59BA, 0xFAA5, 0x59BB, 0x8DC8,\n\t0x59BE, 0x8FA8, 0x59C6, 0x9B47, 0x59C9, 0x8E6F, 0x59CB, 0x8E6E,\t0x59D0, 0x88B7, 0x59D1, 0x8CC6, 0x59D3, 0x90A9, 0x59D4, 0x88CF,\n\t0x59D9, 0x9B4B, 0x59DA, 0x9B4C, 0x59DC, 0x9B49, 0x59E5, 0x8957,\t0x59E6, 0x8AAD, 0x59E8, 0x9B48, 0x59EA, 0x96C3, 0x59EB, 0x9550,\n\t0x59F6, 0x88A6, 0x59FB, 0x88F7, 0x59FF, 0x8E70, 0x5A01, 0x88D0,\t0x5A03, 0x88A1, 0x5A09, 0x9B51, 0x5A11, 0x9B4F, 0x5A18, 0x96BA,\n\t0x5A1A, 0x9B52, 0x5A1C, 0x9B50, 0x5A1F, 0x9B4E, 0x5A20, 0x9050,\t0x5A25, 0x9B4D, 0x5A29, 0x95D8, 0x5A2F, 0x8CE2, 0x5A35, 0x9B56,\n\t0x5A36, 0x9B57, 0x5A3C, 0x8FA9, 0x5A40, 0x9B53, 0x5A41, 0x984B,\t0x5A46, 0x946B, 0x5A49, 0x9B55, 0x5A5A, 0x8DA5, 0x5A62, 0x9B58,\n\t0x5A66, 0x9577, 0x5A6A, 0x9B59, 0x5A6C, 0x9B54, 0x5A7F, 0x96B9,\t0x5A92, 0x947D, 0x5A9A, 0x9B5A, 0x5A9B, 0x9551, 0x5ABC, 0x9B5B,\n\t0x5ABD, 0x9B5F, 0x5ABE, 0x9B5C, 0x5AC1, 0x89C5, 0x5AC2, 0x9B5E,\t0x5AC9, 0x8EB9, 0x5ACB, 0x9B5D, 0x5ACC, 0x8C99, 0x5AD0, 0x9B6B,\n\t0x5AD6, 0x9B64, 0x5AD7, 0x9B61, 0x5AE1, 0x9284, 0x5AE3, 0x9B60,\t0x5AE6, 0x9B62, 0x5AE9, 0x9B63, 0x5AFA, 0x9B65, 0x5AFB, 0x9B66,\n\t0x5B09, 0x8AF0, 0x5B0B, 0x9B68, 0x5B0C, 0x9B67, 0x5B16, 0x9B69,\t0x5B22, 0x8FEC, 0x5B2A, 0x9B6C, 0x5B2C, 0x92DA, 0x5B30, 0x8964,\n\t0x5B32, 0x9B6A, 0x5B36, 0x9B6D, 0x5B3E, 0x9B6E, 0x5B40, 0x9B71,\t0x5B43, 0x9B6F, 0x5B45, 0x9B70, 0x5B50, 0x8E71, 0x5B51, 0x9B72,\n\t0x5B54, 0x8D45, 0x5B55, 0x9B73, 0x5B56, 0xFAA6, 0x5B57, 0x8E9A,\t0x5B58, 0x91B6, 0x5B5A, 0x9B74, 0x5B5B, 0x9B75, 0x5B5C, 0x8E79,\n\t0x5B5D, 0x8D46, 0x5B5F, 0x96D0, 0x5B63, 0x8B47, 0x5B64, 0x8CC7,\t0x5B65, 0x9B76, 0x5B66, 0x8A77, 0x5B69, 0x9B77, 0x5B6B, 0x91B7,\n\t0x5B70, 0x9B78, 0x5B71, 0x9BA1, 0x5B73, 0x9B79, 0x5B75, 0x9B7A,\t0x5B78, 0x9B7B, 0x5B7A, 0x9B7D, 0x5B80, 0x9B7E, 0x5B83, 0x9B80,\n\t0x5B85, 0x91EE, 0x5B87, 0x8946, 0x5B88, 0x8EE7, 0x5B89, 0x88C0,\t0x5B8B, 0x9176, 0x5B8C, 0x8AAE, 0x5B8D, 0x8EB3, 0x5B8F, 0x8D47,\n\t0x5B95, 0x9386, 0x5B97, 0x8F40, 0x5B98, 0x8AAF, 0x5B99, 0x9288,\t0x5B9A, 0x92E8, 0x5B9B, 0x88B6, 0x5B9C, 0x8B58, 0x5B9D, 0x95F3,\n\t0x5B9F, 0x8EC0, 0x5BA2, 0x8B71, 0x5BA3, 0x90E9, 0x5BA4, 0x8EBA,\t0x5BA5, 0x9747, 0x5BA6, 0x9B81, 0x5BAE, 0x8B7B, 0x5BB0, 0x8DC9,\n\t0x5BB3, 0x8A51, 0x5BB4, 0x8983, 0x5BB5, 0x8FAA, 0x5BB6, 0x89C6,\t0x5BB8, 0x9B82, 0x5BB9, 0x9765, 0x5BBF, 0x8F68, 0x5BC0, 0xFAA7,\n\t0x5BC2, 0x8EE2, 0x5BC3, 0x9B83, 0x5BC4, 0x8AF1, 0x5BC5, 0x93D0,\t0x5BC6, 0x96A7, 0x5BC7, 0x9B84, 0x5BC9, 0x9B85, 0x5BCC, 0x9578,\n\t0x5BD0, 0x9B87, 0x5BD2, 0x8AA6, 0x5BD3, 0x8BF5, 0x5BD4, 0x9B86,\t0x5BD8, 0xFAA9, 0x5BDB, 0x8AB0, 0x5BDD, 0x9051, 0x5BDE, 0x9B8B,\n\t0x5BDF, 0x8E40, 0x5BE1, 0x89C7, 0x5BE2, 0x9B8A, 0x5BE4, 0x9B88,\t0x5BE5, 0x9B8C, 0x5BE6, 0x9B89, 0x5BE7, 0x944A, 0x5BE8, 0x9ECB,\n\t0x5BE9, 0x9052, 0x5BEB, 0x9B8D, 0x5BEC, 0xFAAA, 0x5BEE, 0x97BE,\t0x5BF0, 0x9B8E, 0x5BF3, 0x9B90, 0x5BF5, 0x929E, 0x5BF6, 0x9B8F,\n\t0x5BF8, 0x90A1, 0x5BFA, 0x8E9B, 0x5BFE, 0x91CE, 0x5BFF, 0x8EF5,\t0x5C01, 0x9595, 0x5C02, 0x90EA, 0x5C04, 0x8ECB, 0x5C05, 0x9B91,\n\t0x5C06, 0x8FAB, 0x5C07, 0x9B92, 0x5C08, 0x9B93, 0x5C09, 0x88D1,\t0x5C0A, 0x91B8, 0x5C0B, 0x9071, 0x5C0D, 0x9B94, 0x5C0E, 0x93B1,\n\t0x5C0F, 0x8FAC, 0x5C11, 0x8FAD, 0x5C13, 0x9B95, 0x5C16, 0x90EB,\t0x5C1A, 0x8FAE, 0x5C1E, 0xFAAB, 0x5C20, 0x9B96, 0x5C22, 0x9B97,\n\t0x5C24, 0x96DE, 0x5C28, 0x9B98, 0x5C2D, 0x8BC4, 0x5C31, 0x8F41,\t0x5C38, 0x9B99, 0x5C39, 0x9B9A, 0x5C3A, 0x8EDA, 0x5C3B, 0x904B,\n\t0x5C3C, 0x93F2, 0x5C3D, 0x9073, 0x5C3E, 0x94F6, 0x5C3F, 0x9441,\t0x5C40, 0x8BC7, 0x5C41, 0x9B9B, 0x5C45, 0x8B8F, 0x5C46, 0x9B9C,\n\t0x5C48, 0x8BFC, 0x5C4A, 0x93CD, 0x5C4B, 0x89AE, 0x5C4D, 0x8E72,\t0x5C4E, 0x9B9D, 0x5C4F, 0x9BA0, 0x5C50, 0x9B9F, 0x5C51, 0x8BFB,\n\t0x5C53, 0x9B9E, 0x5C55, 0x9357, 0x5C5E, 0x91AE, 0x5C60, 0x936A,\t0x5C61, 0x8EC6, 0x5C64, 0x9177, 0x5C65, 0x979A, 0x5C6C, 0x9BA2,\n\t0x5C6E, 0x9BA3, 0x5C6F, 0x93D4, 0x5C71, 0x8E52, 0x5C76, 0x9BA5,\t0x5C79, 0x9BA6, 0x5C8C, 0x9BA7, 0x5C90, 0x8AF2, 0x5C91, 0x9BA8,\n\t0x5C94, 0x9BA9, 0x5CA1, 0x89AA, 0x5CA6, 0xFAAC, 0x5CA8, 0x915A,\t0x5CA9, 0x8AE2, 0x5CAB, 0x9BAB, 0x5CAC, 0x96A6, 0x5CB1, 0x91D0,\n\t0x5CB3, 0x8A78, 0x5CB6, 0x9BAD, 0x5CB7, 0x9BAF, 0x5CB8, 0x8ADD,\t0x5CBA, 0xFAAD, 0x5CBB, 0x9BAC, 0x5CBC, 0x9BAE, 0x5CBE, 0x9BB1,\n\t0x5CC5, 0x9BB0, 0x5CC7, 0x9BB2, 0x5CD9, 0x9BB3, 0x5CE0, 0x93BB,\t0x5CE1, 0x8BAC, 0x5CE8, 0x89E3, 0x5CE9, 0x9BB4, 0x5CEA, 0x9BB9,\n\t0x5CED, 0x9BB7, 0x5CEF, 0x95F5, 0x5CF0, 0x95F4, 0x5CF5, 0xFAAE,\t0x5CF6, 0x9387, 0x5CFA, 0x9BB6, 0x5CFB, 0x8F73, 0x5CFD, 0x9BB5,\n\t0x5D07, 0x9092, 0x5D0B, 0x9BBA, 0x5D0E, 0x8DE8, 0x5D11, 0x9BC0,\t0x5D14, 0x9BC1, 0x5D15, 0x9BBB, 0x5D16, 0x8A52, 0x5D17, 0x9BBC,\n\t0x5D18, 0x9BC5, 0x5D19, 0x9BC4, 0x5D1A, 0x9BC3, 0x5D1B, 0x9BBF,\t0x5D1F, 0x9BBE, 0x5D22, 0x9BC2, 0x5D27, 0xFAAF, 0x5D29, 0x95F6,\n\t0x5D42, 0xFAB2, 0x5D4B, 0x9BC9, 0x5D4C, 0x9BC6, 0x5D4E, 0x9BC8,\t0x5D50, 0x9792, 0x5D52, 0x9BC7, 0x5D53, 0xFAB0, 0x5D5C, 0x9BBD,\n\t0x5D69, 0x9093, 0x5D6C, 0x9BCA, 0x5D6D, 0xFAB3, 0x5D6F, 0x8DB5,\t0x5D73, 0x9BCB, 0x5D76, 0x9BCC, 0x5D82, 0x9BCF, 0x5D84, 0x9BCE,\n\t0x5D87, 0x9BCD, 0x5D8B, 0x9388, 0x5D8C, 0x9BB8, 0x5D90, 0x9BD5,\t0x5D9D, 0x9BD1, 0x5DA2, 0x9BD0, 0x5DAC, 0x9BD2, 0x5DAE, 0x9BD3,\n\t0x5DB7, 0x9BD6, 0x5DB8, 0xFAB4, 0x5DB9, 0xFAB5, 0x5DBA, 0x97E4,\t0x5DBC, 0x9BD7, 0x5DBD, 0x9BD4, 0x5DC9, 0x9BD8, 0x5DCC, 0x8ADE,\n\t0x5DCD, 0x9BD9, 0x5DD0, 0xFAB6, 0x5DD2, 0x9BDB, 0x5DD3, 0x9BDA,\t0x5DD6, 0x9BDC, 0x5DDB, 0x9BDD, 0x5DDD, 0x90EC, 0x5DDE, 0x8F42,\n\t0x5DE1, 0x8F84, 0x5DE3, 0x9183, 0x5DE5, 0x8D48, 0x5DE6, 0x8DB6,\t0x5DE7, 0x8D49, 0x5DE8, 0x8B90, 0x5DEB, 0x9BDE, 0x5DEE, 0x8DB7,\n\t0x5DF1, 0x8CC8, 0x5DF2, 0x9BDF, 0x5DF3, 0x96A4, 0x5DF4, 0x9462,\t0x5DF5, 0x9BE0, 0x5DF7, 0x8D4A, 0x5DFB, 0x8AAA, 0x5DFD, 0x9246,\n\t0x5DFE, 0x8BD0, 0x5E02, 0x8E73, 0x5E03, 0x957A, 0x5E06, 0x94BF,\t0x5E0B, 0x9BE1, 0x5E0C, 0x8AF3, 0x5E11, 0x9BE4, 0x5E16, 0x929F,\n\t0x5E19, 0x9BE3, 0x5E1A, 0x9BE2, 0x5E1B, 0x9BE5, 0x5E1D, 0x92E9,\t0x5E25, 0x9083, 0x5E2B, 0x8E74, 0x5E2D, 0x90C8, 0x5E2F, 0x91D1,\n\t0x5E30, 0x8B41, 0x5E33, 0x92A0, 0x5E36, 0x9BE6, 0x5E37, 0x9BE7,\t0x5E38, 0x8FED, 0x5E3D, 0x9658, 0x5E40, 0x9BEA, 0x5E43, 0x9BE9,\n\t0x5E44, 0x9BE8, 0x5E45, 0x959D, 0x5E47, 0x9BF1, 0x5E4C, 0x9679,\t0x5E4E, 0x9BEB, 0x5E54, 0x9BED, 0x5E55, 0x968B, 0x5E57, 0x9BEC,\n\t0x5E5F, 0x9BEE, 0x5E61, 0x94A6, 0x5E62, 0x9BEF, 0x5E63, 0x95BC,\t0x5E64, 0x9BF0, 0x5E72, 0x8AB1, 0x5E73, 0x95BD, 0x5E74, 0x944E,\n\t0x5E75, 0x9BF2, 0x5E76, 0x9BF3, 0x5E78, 0x8D4B, 0x5E79, 0x8AB2,\t0x5E7A, 0x9BF4, 0x5E7B, 0x8CB6, 0x5E7C, 0x9763, 0x5E7D, 0x9748,\n\t0x5E7E, 0x8AF4, 0x5E7F, 0x9BF6, 0x5E81, 0x92A1, 0x5E83, 0x8D4C,\t0x5E84, 0x8FAF, 0x5E87, 0x94DD, 0x5E8A, 0x8FB0, 0x5E8F, 0x8F98,\n\t0x5E95, 0x92EA, 0x5E96, 0x95F7, 0x5E97, 0x9358, 0x5E9A, 0x8D4D,\t0x5E9C, 0x957B, 0x5EA0, 0x9BF7, 0x5EA6, 0x9378, 0x5EA7, 0x8DC0,\n\t0x5EAB, 0x8CC9, 0x5EAD, 0x92EB, 0x5EB5, 0x88C1, 0x5EB6, 0x8F8E,\t0x5EB7, 0x8D4E, 0x5EB8, 0x9766, 0x5EC1, 0x9BF8, 0x5EC2, 0x9BF9,\n\t0x5EC3, 0x9470, 0x5EC8, 0x9BFA, 0x5EC9, 0x97F5, 0x5ECA, 0x984C,\t0x5ECF, 0x9BFC, 0x5ED0, 0x9BFB, 0x5ED3, 0x8A66, 0x5ED6, 0x9C40,\n\t0x5EDA, 0x9C43, 0x5EDB, 0x9C44, 0x5EDD, 0x9C42, 0x5EDF, 0x955F,\t0x5EE0, 0x8FB1, 0x5EE1, 0x9C46, 0x5EE2, 0x9C45, 0x5EE3, 0x9C41,\n\t0x5EE8, 0x9C47, 0x5EE9, 0x9C48, 0x5EEC, 0x9C49, 0x5EF0, 0x9C4C,\t0x5EF1, 0x9C4A, 0x5EF3, 0x9C4B, 0x5EF4, 0x9C4D, 0x5EF6, 0x8984,\n\t0x5EF7, 0x92EC, 0x5EF8, 0x9C4E, 0x5EFA, 0x8C9A, 0x5EFB, 0x89F4,\t0x5EFC, 0x9455, 0x5EFE, 0x9C4F, 0x5EFF, 0x93F9, 0x5F01, 0x95D9,\n\t0x5F03, 0x9C50, 0x5F04, 0x984D, 0x5F09, 0x9C51, 0x5F0A, 0x95BE,\t0x5F0B, 0x9C54, 0x5F0C, 0x989F, 0x5F0D, 0x98AF, 0x5F0F, 0x8EAE,\n\t0x5F10, 0x93F3, 0x5F11, 0x9C55, 0x5F13, 0x8B7C, 0x5F14, 0x92A2,\t0x5F15, 0x88F8, 0x5F16, 0x9C56, 0x5F17, 0x95A4, 0x5F18, 0x8D4F,\n\t0x5F1B, 0x926F, 0x5F1F, 0x92ED, 0x5F21, 0xFAB7, 0x5F25, 0x96ED,\t0x5F26, 0x8CB7, 0x5F27, 0x8CCA, 0x5F29, 0x9C57, 0x5F2D, 0x9C58,\n\t0x5F2F, 0x9C5E, 0x5F31, 0x8EE3, 0x5F34, 0xFAB8, 0x5F35, 0x92A3,\t0x5F37, 0x8BAD, 0x5F38, 0x9C59, 0x5F3C, 0x954A, 0x5F3E, 0x9265,\n\t0x5F41, 0x9C5A, 0x5F45, 0xFA67, 0x5F48, 0x9C5B, 0x5F4A, 0x8BAE,\t0x5F4C, 0x9C5C, 0x5F4E, 0x9C5D, 0x5F51, 0x9C5F, 0x5F53, 0x9396,\n\t0x5F56, 0x9C60, 0x5F57, 0x9C61, 0x5F59, 0x9C62, 0x5F5C, 0x9C53,\t0x5F5D, 0x9C52, 0x5F61, 0x9C63, 0x5F62, 0x8C60, 0x5F66, 0x9546,\n\t0x5F67, 0xFAB9, 0x5F69, 0x8DCA, 0x5F6A, 0x9556, 0x5F6B, 0x92A4,\t0x5F6C, 0x956A, 0x5F6D, 0x9C64, 0x5F70, 0x8FB2, 0x5F71, 0x8965,\n\t0x5F73, 0x9C65, 0x5F77, 0x9C66, 0x5F79, 0x96F0, 0x5F7C, 0x94DE,\t0x5F7F, 0x9C69, 0x5F80, 0x899D, 0x5F81, 0x90AA, 0x5F82, 0x9C68,\n\t0x5F83, 0x9C67, 0x5F84, 0x8C61, 0x5F85, 0x91D2, 0x5F87, 0x9C6D,\t0x5F88, 0x9C6B, 0x5F8A, 0x9C6A, 0x5F8B, 0x97A5, 0x5F8C, 0x8CE3,\n\t0x5F90, 0x8F99, 0x5F91, 0x9C6C, 0x5F92, 0x936B, 0x5F93, 0x8F5D,\t0x5F97, 0x93BE, 0x5F98, 0x9C70, 0x5F99, 0x9C6F, 0x5F9E, 0x9C6E,\n\t0x5FA0, 0x9C71, 0x5FA1, 0x8CE4, 0x5FA8, 0x9C72, 0x5FA9, 0x959C,\t0x5FAA, 0x8F7A, 0x5FAD, 0x9C73, 0x5FAE, 0x94F7, 0x5FB3, 0x93BF,\n\t0x5FB4, 0x92A5, 0x5FB7, 0xFABA, 0x5FB9, 0x934F, 0x5FBC, 0x9C74,\t0x5FBD, 0x8B4A, 0x5FC3, 0x9053, 0x5FC5, 0x954B, 0x5FCC, 0x8AF5,\n\t0x5FCD, 0x9445, 0x5FD6, 0x9C75, 0x5FD7, 0x8E75, 0x5FD8, 0x9659,\t0x5FD9, 0x965A, 0x5FDC, 0x899E, 0x5FDD, 0x9C7A, 0x5FDE, 0xFABB,\n\t0x5FE0, 0x9289, 0x5FE4, 0x9C77, 0x5FEB, 0x89F5, 0x5FF0, 0x9CAB,\t0x5FF1, 0x9C79, 0x5FF5, 0x944F, 0x5FF8, 0x9C78, 0x5FFB, 0x9C76,\n\t0x5FFD, 0x8D9A, 0x5FFF, 0x9C7C, 0x600E, 0x9C83, 0x600F, 0x9C89,\t0x6010, 0x9C81, 0x6012, 0x937B, 0x6015, 0x9C86, 0x6016, 0x957C,\n\t0x6019, 0x9C80, 0x601B, 0x9C85, 0x601C, 0x97E5, 0x601D, 0x8E76,\t0x6020, 0x91D3, 0x6021, 0x9C7D, 0x6025, 0x8B7D, 0x6026, 0x9C88,\n\t0x6027, 0x90AB, 0x6028, 0x8985, 0x6029, 0x9C82, 0x602A, 0x89F6,\t0x602B, 0x9C87, 0x602F, 0x8BAF, 0x6031, 0x9C84, 0x603A, 0x9C8A,\n\t0x6041, 0x9C8C, 0x6042, 0x9C96, 0x6043, 0x9C94, 0x6046, 0x9C91,\t0x604A, 0x9C90, 0x604B, 0x97F6, 0x604D, 0x9C92, 0x6050, 0x8BB0,\n\t0x6052, 0x8D50, 0x6055, 0x8F9A, 0x6059, 0x9C99, 0x605A, 0x9C8B,\t0x605D, 0xFABC, 0x605F, 0x9C8F, 0x6060, 0x9C7E, 0x6062, 0x89F8,\n\t0x6063, 0x9C93, 0x6064, 0x9C95, 0x6065, 0x9270, 0x6068, 0x8DA6,\t0x6069, 0x89B6, 0x606A, 0x9C8D, 0x606B, 0x9C98, 0x606C, 0x9C97,\n\t0x606D, 0x8BB1, 0x606F, 0x91A7, 0x6070, 0x8A86, 0x6075, 0x8C62,\t0x6077, 0x9C8E, 0x6081, 0x9C9A, 0x6083, 0x9C9D, 0x6084, 0x9C9F,\n\t0x6085, 0xFABD, 0x6089, 0x8EBB, 0x608A, 0xFABE, 0x608B, 0x9CA5,\t0x608C, 0x92EE, 0x608D, 0x9C9B, 0x6092, 0x9CA3, 0x6094, 0x89F7,\n\t0x6096, 0x9CA1, 0x6097, 0x9CA2, 0x609A, 0x9C9E, 0x609B, 0x9CA0,\t0x609F, 0x8CE5, 0x60A0, 0x9749, 0x60A3, 0x8AB3, 0x60A6, 0x8978,\n\t0x60A7, 0x9CA4, 0x60A9, 0x9459, 0x60AA, 0x88AB, 0x60B2, 0x94DF,\t0x60B3, 0x9C7B, 0x60B4, 0x9CAA, 0x60B5, 0x9CAE, 0x60B6, 0x96E3,\n\t0x60B8, 0x9CA7, 0x60BC, 0x9389, 0x60BD, 0x9CAC, 0x60C5, 0x8FEE,\t0x60C6, 0x9CAD, 0x60C7, 0x93D5, 0x60D1, 0x9866, 0x60D3, 0x9CA9,\n\t0x60D5, 0xFAC0, 0x60D8, 0x9CAF, 0x60DA, 0x8D9B, 0x60DC, 0x90C9,\t0x60DE, 0xFABF, 0x60DF, 0x88D2, 0x60E0, 0x9CA8, 0x60E1, 0x9CA6,\n\t0x60E3, 0x9179, 0x60E7, 0x9C9C, 0x60E8, 0x8E53, 0x60F0, 0x91C4,\t0x60F1, 0x9CBB, 0x60F2, 0xFAC2, 0x60F3, 0x917A, 0x60F4, 0x9CB6,\n\t0x60F6, 0x9CB3, 0x60F7, 0x9CB4, 0x60F9, 0x8EE4, 0x60FA, 0x9CB7,\t0x60FB, 0x9CBA, 0x6100, 0x9CB5, 0x6101, 0x8F44, 0x6103, 0x9CB8,\n\t0x6106, 0x9CB2, 0x6108, 0x96FA, 0x6109, 0x96F9, 0x610D, 0x9CBC,\t0x610E, 0x9CBD, 0x610F, 0x88D3, 0x6111, 0xFAC3, 0x6115, 0x9CB1,\n\t0x611A, 0x8BF0, 0x611B, 0x88A4, 0x611F, 0x8AB4, 0x6120, 0xFAC1,\t0x6121, 0x9CB9, 0x6127, 0x9CC1, 0x6128, 0x9CC0, 0x612C, 0x9CC5,\n\t0x6130, 0xFAC5, 0x6134, 0x9CC6, 0x6137, 0xFAC4, 0x613C, 0x9CC4,\t0x613D, 0x9CC7, 0x613E, 0x9CBF, 0x613F, 0x9CC3, 0x6142, 0x9CC8,\n\t0x6144, 0x9CC9, 0x6147, 0x9CBE, 0x6148, 0x8E9C, 0x614A, 0x9CC2,\t0x614B, 0x91D4, 0x614C, 0x8D51, 0x614D, 0x9CB0, 0x614E, 0x9054,\n\t0x6153, 0x9CD6, 0x6155, 0x95E7, 0x6158, 0x9CCC, 0x6159, 0x9CCD,\t0x615A, 0x9CCE, 0x615D, 0x9CD5, 0x615F, 0x9CD4, 0x6162, 0x969D,\n\t0x6163, 0x8AB5, 0x6165, 0x9CD2, 0x6167, 0x8C64, 0x6168, 0x8A53,\t0x616B, 0x9CCF, 0x616E, 0x97B6, 0x616F, 0x9CD1, 0x6170, 0x88D4,\n\t0x6171, 0x9CD3, 0x6173, 0x9CCA, 0x6174, 0x9CD0, 0x6175, 0x9CD7,\t0x6176, 0x8C63, 0x6177, 0x9CCB, 0x617E, 0x977C, 0x6182, 0x974A,\n\t0x6187, 0x9CDA, 0x618A, 0x9CDE, 0x618E, 0x919E, 0x6190, 0x97F7,\t0x6191, 0x9CDF, 0x6194, 0x9CDC, 0x6196, 0x9CD9, 0x6198, 0xFAC6,\n\t0x6199, 0x9CD8, 0x619A, 0x9CDD, 0x61A4, 0x95AE, 0x61A7, 0x93B2,\t0x61A9, 0x8C65, 0x61AB, 0x9CE0, 0x61AC, 0x9CDB, 0x61AE, 0x9CE1,\n\t0x61B2, 0x8C9B, 0x61B6, 0x89AF, 0x61BA, 0x9CE9, 0x61BE, 0x8AB6,\t0x61C3, 0x9CE7, 0x61C6, 0x9CE8, 0x61C7, 0x8DA7, 0x61C8, 0x9CE6,\n\t0x61C9, 0x9CE4, 0x61CA, 0x9CE3, 0x61CB, 0x9CEA, 0x61CC, 0x9CE2,\t0x61CD, 0x9CEC, 0x61D0, 0x89F9, 0x61E3, 0x9CEE, 0x61E6, 0x9CED,\n\t0x61F2, 0x92A6, 0x61F4, 0x9CF1, 0x61F6, 0x9CEF, 0x61F7, 0x9CE5,\t0x61F8, 0x8C9C, 0x61FA, 0x9CF0, 0x61FC, 0x9CF4, 0x61FD, 0x9CF3,\n\t0x61FE, 0x9CF5, 0x61FF, 0x9CF2, 0x6200, 0x9CF6, 0x6208, 0x9CF7,\t0x6209, 0x9CF8, 0x620A, 0x95E8, 0x620C, 0x9CFA, 0x620D, 0x9CF9,\n\t0x620E, 0x8F5E, 0x6210, 0x90AC, 0x6211, 0x89E4, 0x6212, 0x89FA,\t0x6213, 0xFAC7, 0x6214, 0x9CFB, 0x6216, 0x88BD, 0x621A, 0x90CA,\n\t0x621B, 0x9CFC, 0x621D, 0xE6C1, 0x621E, 0x9D40, 0x621F, 0x8C81,\t0x6221, 0x9D41, 0x6226, 0x90ED, 0x622A, 0x9D42, 0x622E, 0x9D43,\n\t0x622F, 0x8B59, 0x6230, 0x9D44, 0x6232, 0x9D45, 0x6233, 0x9D46,\t0x6234, 0x91D5, 0x6238, 0x8CCB, 0x623B, 0x96DF, 0x623F, 0x965B,\n\t0x6240, 0x8F8A, 0x6241, 0x9D47, 0x6247, 0x90EE, 0x6248, 0xE7BB,\t0x6249, 0x94E0, 0x624B, 0x8EE8, 0x624D, 0x8DCB, 0x624E, 0x9D48,\n\t0x6253, 0x91C5, 0x6255, 0x95A5, 0x6258, 0x91EF, 0x625B, 0x9D4B,\t0x625E, 0x9D49, 0x6260, 0x9D4C, 0x6263, 0x9D4A, 0x6268, 0x9D4D,\n\t0x626E, 0x95AF, 0x6271, 0x88B5, 0x6276, 0x957D, 0x6279, 0x94E1,\t0x627C, 0x9D4E, 0x627E, 0x9D51, 0x627F, 0x8FB3, 0x6280, 0x8B5A,\n\t0x6282, 0x9D4F, 0x6283, 0x9D56, 0x6284, 0x8FB4, 0x6289, 0x9D50,\t0x628A, 0x9463, 0x6291, 0x977D, 0x6292, 0x9D52, 0x6293, 0x9D53,\n\t0x6294, 0x9D57, 0x6295, 0x938A, 0x6296, 0x9D54, 0x6297, 0x8D52,\t0x6298, 0x90DC, 0x629B, 0x9D65, 0x629C, 0x94B2, 0x629E, 0x91F0,\n\t0x62A6, 0xFAC8, 0x62AB, 0x94E2, 0x62AC, 0x9DAB, 0x62B1, 0x95F8,\t0x62B5, 0x92EF, 0x62B9, 0x9695, 0x62BB, 0x9D5A, 0x62BC, 0x899F,\n\t0x62BD, 0x928A, 0x62C2, 0x9D63, 0x62C5, 0x9253, 0x62C6, 0x9D5D,\t0x62C7, 0x9D64, 0x62C8, 0x9D5F, 0x62C9, 0x9D66, 0x62CA, 0x9D62,\n\t0x62CC, 0x9D61, 0x62CD, 0x948F, 0x62CF, 0x9D5B, 0x62D0, 0x89FB,\t0x62D1, 0x9D59, 0x62D2, 0x8B91, 0x62D3, 0x91F1, 0x62D4, 0x9D55,\n\t0x62D7, 0x9D58, 0x62D8, 0x8D53, 0x62D9, 0x90D9, 0x62DB, 0x8FB5,\t0x62DC, 0x9D60, 0x62DD, 0x9471, 0x62E0, 0x8B92, 0x62E1, 0x8A67,\n\t0x62EC, 0x8A87, 0x62ED, 0x9040, 0x62EE, 0x9D68, 0x62EF, 0x9D6D,\t0x62F1, 0x9D69, 0x62F3, 0x8C9D, 0x62F5, 0x9D6E, 0x62F6, 0x8E41,\n\t0x62F7, 0x8D89, 0x62FE, 0x8F45, 0x62FF, 0x9D5C, 0x6301, 0x8E9D,\t0x6302, 0x9D6B, 0x6307, 0x8E77, 0x6308, 0x9D6C, 0x6309, 0x88C2,\n\t0x630C, 0x9D67, 0x6311, 0x92A7, 0x6319, 0x8B93, 0x631F, 0x8BB2,\t0x6327, 0x9D6A, 0x6328, 0x88A5, 0x632B, 0x8DC1, 0x632F, 0x9055,\n\t0x633A, 0x92F0, 0x633D, 0x94D2, 0x633E, 0x9D70, 0x633F, 0x917D,\t0x6349, 0x91A8, 0x634C, 0x8E4A, 0x634D, 0x9D71, 0x634F, 0x9D73,\n\t0x6350, 0x9D6F, 0x6355, 0x95DF, 0x6357, 0x92BB, 0x635C, 0x917B,\t0x6367, 0x95F9, 0x6368, 0x8ECC, 0x6369, 0x9D80, 0x636B, 0x9D7E,\n\t0x636E, 0x9098, 0x6372, 0x8C9E, 0x6376, 0x9D78, 0x6377, 0x8FB7,\t0x637A, 0x93E6, 0x637B, 0x9450, 0x6380, 0x9D76, 0x6383, 0x917C,\n\t0x6388, 0x8EF6, 0x6389, 0x9D7B, 0x638C, 0x8FB6, 0x638E, 0x9D75,\t0x638F, 0x9D7A, 0x6392, 0x9472, 0x6396, 0x9D74, 0x6398, 0x8C40,\n\t0x639B, 0x8A7C, 0x639F, 0x9D7C, 0x63A0, 0x97A9, 0x63A1, 0x8DCC,\t0x63A2, 0x9254, 0x63A3, 0x9D79, 0x63A5, 0x90DA, 0x63A7, 0x8D54,\n\t0x63A8, 0x9084, 0x63A9, 0x8986, 0x63AA, 0x915B, 0x63AB, 0x9D77,\t0x63AC, 0x8B64, 0x63B2, 0x8C66, 0x63B4, 0x92CD, 0x63B5, 0x9D7D,\n\t0x63BB, 0x917E, 0x63BE, 0x9D81, 0x63C0, 0x9D83, 0x63C3, 0x91B5,\t0x63C4, 0x9D89, 0x63C6, 0x9D84, 0x63C9, 0x9D86, 0x63CF, 0x9560,\n\t0x63D0, 0x92F1, 0x63D2, 0x9D87, 0x63D6, 0x974B, 0x63DA, 0x9767,\t0x63DB, 0x8AB7, 0x63E1, 0x88AC, 0x63E3, 0x9D85, 0x63E9, 0x9D82,\n\t0x63EE, 0x8AF6, 0x63F4, 0x8987, 0x63F5, 0xFAC9, 0x63F6, 0x9D88,\t0x63FA, 0x9768, 0x6406, 0x9D8C, 0x640D, 0x91B9, 0x640F, 0x9D93,\n\t0x6413, 0x9D8D, 0x6416, 0x9D8A, 0x6417, 0x9D91, 0x641C, 0x9D72,\t0x6426, 0x9D8E, 0x6428, 0x9D92, 0x642C, 0x94C0, 0x642D, 0x938B,\n\t0x6434, 0x9D8B, 0x6436, 0x9D8F, 0x643A, 0x8C67, 0x643E, 0x8DEF,\t0x6442, 0x90DB, 0x644E, 0x9D97, 0x6458, 0x9345, 0x6460, 0xFACA,\n\t0x6467, 0x9D94, 0x6469, 0x9680, 0x646F, 0x9D95, 0x6476, 0x9D96,\t0x6478, 0x96CC, 0x647A, 0x90A0, 0x6483, 0x8C82, 0x6488, 0x9D9D,\n\t0x6492, 0x8E54, 0x6493, 0x9D9A, 0x6495, 0x9D99, 0x649A, 0x9451,\t0x649D, 0xFACB, 0x649E, 0x93B3, 0x64A4, 0x9350, 0x64A5, 0x9D9B,\n\t0x64A9, 0x9D9C, 0x64AB, 0x958F, 0x64AD, 0x9464, 0x64AE, 0x8E42,\t0x64B0, 0x90EF, 0x64B2, 0x966F, 0x64B9, 0x8A68, 0x64BB, 0x9DA3,\n\t0x64BC, 0x9D9E, 0x64C1, 0x9769, 0x64C2, 0x9DA5, 0x64C5, 0x9DA1,\t0x64C7, 0x9DA2, 0x64CD, 0x9180, 0x64CE, 0xFACC, 0x64D2, 0x9DA0,\n\t0x64D4, 0x9D5E, 0x64D8, 0x9DA4, 0x64DA, 0x9D9F, 0x64E0, 0x9DA9,\t0x64E1, 0x9DAA, 0x64E2, 0x9346, 0x64E3, 0x9DAC, 0x64E6, 0x8E43,\n\t0x64E7, 0x9DA7, 0x64EC, 0x8B5B, 0x64EF, 0x9DAD, 0x64F1, 0x9DA6,\t0x64F2, 0x9DB1, 0x64F4, 0x9DB0, 0x64F6, 0x9DAF, 0x64FA, 0x9DB2,\n\t0x64FD, 0x9DB4, 0x64FE, 0x8FEF, 0x6500, 0x9DB3, 0x6505, 0x9DB7,\t0x6518, 0x9DB5, 0x651C, 0x9DB6, 0x651D, 0x9D90, 0x6523, 0x9DB9,\n\t0x6524, 0x9DB8, 0x652A, 0x9D98, 0x652B, 0x9DBA, 0x652C, 0x9DAE,\t0x652F, 0x8E78, 0x6534, 0x9DBB, 0x6535, 0x9DBC, 0x6536, 0x9DBE,\n\t0x6537, 0x9DBD, 0x6538, 0x9DBF, 0x6539, 0x89FC, 0x653B, 0x8D55,\t0x653E, 0x95FA, 0x653F, 0x90AD, 0x6545, 0x8CCC, 0x6548, 0x9DC1,\n\t0x654D, 0x9DC4, 0x654E, 0xFACD, 0x654F, 0x9571, 0x6551, 0x8B7E,\t0x6555, 0x9DC3, 0x6556, 0x9DC2, 0x6557, 0x9473, 0x6558, 0x9DC5,\n\t0x6559, 0x8BB3, 0x655D, 0x9DC7, 0x655E, 0x9DC6, 0x6562, 0x8AB8,\t0x6563, 0x8E55, 0x6566, 0x93D6, 0x656C, 0x8C68, 0x6570, 0x9094,\n\t0x6572, 0x9DC8, 0x6574, 0x90AE, 0x6575, 0x9347, 0x6577, 0x957E,\t0x6578, 0x9DC9, 0x6582, 0x9DCA, 0x6583, 0x9DCB, 0x6587, 0x95B6,\n\t0x6588, 0x9B7C, 0x6589, 0x90C4, 0x658C, 0x956B, 0x658E, 0x8DD6,\t0x6590, 0x94E3, 0x6591, 0x94C1, 0x6597, 0x936C, 0x6599, 0x97BF,\n\t0x659B, 0x9DCD, 0x659C, 0x8ECE, 0x659F, 0x9DCE, 0x65A1, 0x88B4,\t0x65A4, 0x8BD2, 0x65A5, 0x90CB, 0x65A7, 0x9580, 0x65AB, 0x9DCF,\n\t0x65AC, 0x8E61, 0x65AD, 0x9266, 0x65AF, 0x8E7A, 0x65B0, 0x9056,\t0x65B7, 0x9DD0, 0x65B9, 0x95FB, 0x65BC, 0x8997, 0x65BD, 0x8E7B,\n\t0x65C1, 0x9DD3, 0x65C3, 0x9DD1, 0x65C4, 0x9DD4, 0x65C5, 0x97B7,\t0x65C6, 0x9DD2, 0x65CB, 0x90F9, 0x65CC, 0x9DD5, 0x65CF, 0x91B0,\n\t0x65D2, 0x9DD6, 0x65D7, 0x8AF8, 0x65D9, 0x9DD8, 0x65DB, 0x9DD7,\t0x65E0, 0x9DD9, 0x65E1, 0x9DDA, 0x65E2, 0x8AF9, 0x65E5, 0x93FA,\n\t0x65E6, 0x9255, 0x65E7, 0x8B8C, 0x65E8, 0x8E7C, 0x65E9, 0x9181,\t0x65EC, 0x8F7B, 0x65ED, 0x88AE, 0x65F1, 0x9DDB, 0x65FA, 0x89A0,\n\t0x65FB, 0x9DDF, 0x6600, 0xFACE, 0x6602, 0x8D56, 0x6603, 0x9DDE,\t0x6606, 0x8DA9, 0x6607, 0x8FB8, 0x6609, 0xFAD1, 0x660A, 0x9DDD,\n\t0x660C, 0x8FB9, 0x660E, 0x96BE, 0x660F, 0x8DA8, 0x6613, 0x88D5,\t0x6614, 0x90CC, 0x6615, 0xFACF, 0x661C, 0x9DE4, 0x661E, 0xFAD3,\n\t0x661F, 0x90AF, 0x6620, 0x8966, 0x6624, 0xFAD4, 0x6625, 0x8F74,\t0x6627, 0x9686, 0x6628, 0x8DF0, 0x662D, 0x8FBA, 0x662E, 0xFAD2,\n\t0x662F, 0x90A5, 0x6631, 0xFA63, 0x6634, 0x9DE3, 0x6635, 0x9DE1,\t0x6636, 0x9DE2, 0x663B, 0xFAD0, 0x663C, 0x928B, 0x663F, 0x9E45,\n\t0x6641, 0x9DE8, 0x6642, 0x8E9E, 0x6643, 0x8D57, 0x6644, 0x9DE6,\t0x6649, 0x9DE7, 0x664B, 0x9057, 0x664F, 0x9DE5, 0x6652, 0x8E4E,\n\t0x6657, 0xFAD6, 0x6659, 0xFAD7, 0x665D, 0x9DEA, 0x665E, 0x9DE9,\t0x665F, 0x9DEE, 0x6662, 0x9DEF, 0x6664, 0x9DEB, 0x6665, 0xFAD5,\n\t0x6666, 0x8A41, 0x6667, 0x9DEC, 0x6668, 0x9DED, 0x6669, 0x94D3,\t0x666E, 0x9581, 0x666F, 0x8C69, 0x6670, 0x9DF0, 0x6673, 0xFAD9,\n\t0x6674, 0x90B0, 0x6676, 0x8FBB, 0x667A, 0x9271, 0x6681, 0x8BC5,\t0x6683, 0x9DF1, 0x6684, 0x9DF5, 0x6687, 0x89C9, 0x6688, 0x9DF2,\n\t0x6689, 0x9DF4, 0x668E, 0x9DF3, 0x6691, 0x8F8B, 0x6696, 0x9267,\t0x6697, 0x88C3, 0x6698, 0x9DF6, 0x6699, 0xFADA, 0x669D, 0x9DF7,\n\t0x66A0, 0xFADB, 0x66A2, 0x92A8, 0x66A6, 0x97EF, 0x66AB, 0x8E62,\t0x66AE, 0x95E9, 0x66B2, 0xFADC, 0x66B4, 0x965C, 0x66B8, 0x9E41,\n\t0x66B9, 0x9DF9, 0x66BC, 0x9DFC, 0x66BE, 0x9DFB, 0x66BF, 0xFADD,\t0x66C1, 0x9DF8, 0x66C4, 0x9E40, 0x66C7, 0x93DC, 0x66C9, 0x9DFA,\n\t0x66D6, 0x9E42, 0x66D9, 0x8F8C, 0x66DA, 0x9E43, 0x66DC, 0x976A,\t0x66DD, 0x9498, 0x66E0, 0x9E44, 0x66E6, 0x9E46, 0x66E9, 0x9E47,\n\t0x66F0, 0x9E48, 0x66F2, 0x8BC8, 0x66F3, 0x8967, 0x66F4, 0x8D58,\t0x66F5, 0x9E49, 0x66F7, 0x9E4A, 0x66F8, 0x8F91, 0x66F9, 0x9182,\n\t0x66FA, 0xFADE, 0x66FB, 0xFA66, 0x66FC, 0x99D6, 0x66FD, 0x915D,\t0x66FE, 0x915C, 0x66FF, 0x91D6, 0x6700, 0x8DC5, 0x6703, 0x98F0,\n\t0x6708, 0x8C8E, 0x6709, 0x974C, 0x670B, 0x95FC, 0x670D, 0x959E,\t0x670E, 0xFADF, 0x670F, 0x9E4B, 0x6714, 0x8DF1, 0x6715, 0x92BD,\n\t0x6716, 0x9E4C, 0x6717, 0x984E, 0x671B, 0x965D, 0x671D, 0x92A9,\t0x671E, 0x9E4D, 0x671F, 0x8AFA, 0x6726, 0x9E4E, 0x6727, 0x9E4F,\n\t0x6728, 0x96D8, 0x672A, 0x96A2, 0x672B, 0x9696, 0x672C, 0x967B,\t0x672D, 0x8E44, 0x672E, 0x9E51, 0x6731, 0x8EE9, 0x6734, 0x9670,\n\t0x6736, 0x9E53, 0x6737, 0x9E56, 0x6738, 0x9E55, 0x673A, 0x8AF7,\t0x673D, 0x8B80, 0x673F, 0x9E52, 0x6741, 0x9E54, 0x6746, 0x9E57,\n\t0x6749, 0x9099, 0x674E, 0x979B, 0x674F, 0x88C7, 0x6750, 0x8DDE,\t0x6751, 0x91BA, 0x6753, 0x8EDB, 0x6756, 0x8FF1, 0x6759, 0x9E5A,\n\t0x675C, 0x936D, 0x675E, 0x9E58, 0x675F, 0x91A9, 0x6760, 0x9E59,\t0x6761, 0x8FF0, 0x6762, 0x96DB, 0x6763, 0x9E5B, 0x6764, 0x9E5C,\n\t0x6765, 0x9788, 0x6766, 0xFAE1, 0x676A, 0x9E61, 0x676D, 0x8D59,\t0x676F, 0x9474, 0x6770, 0x9E5E, 0x6771, 0x938C, 0x6772, 0x9DDC,\n\t0x6773, 0x9DE0, 0x6775, 0x8B6E, 0x6777, 0x9466, 0x677C, 0x9E60,\t0x677E, 0x8FBC, 0x677F, 0x94C2, 0x6785, 0x9E66, 0x6787, 0x94F8,\n\t0x6789, 0x9E5D, 0x678B, 0x9E63, 0x678C, 0x9E62, 0x6790, 0x90CD,\t0x6795, 0x968D, 0x6797, 0x97D1, 0x679A, 0x9687, 0x679C, 0x89CA,\n\t0x679D, 0x8E7D, 0x67A0, 0x9867, 0x67A1, 0x9E65, 0x67A2, 0x9095,\t0x67A6, 0x9E64, 0x67A9, 0x9E5F, 0x67AF, 0x8CCD, 0x67B3, 0x9E6B,\n\t0x67B4, 0x9E69, 0x67B6, 0x89CB, 0x67B7, 0x9E67, 0x67B8, 0x9E6D,\t0x67B9, 0x9E73, 0x67BB, 0xFAE2, 0x67C0, 0xFAE4, 0x67C1, 0x91C6,\n\t0x67C4, 0x95BF, 0x67C6, 0x9E75, 0x67CA, 0x9541, 0x67CE, 0x9E74,\t0x67CF, 0x9490, 0x67D0, 0x965E, 0x67D1, 0x8AB9, 0x67D3, 0x90F5,\n\t0x67D4, 0x8F5F, 0x67D8, 0x92D1, 0x67DA, 0x974D, 0x67DD, 0x9E70,\t0x67DE, 0x9E6F, 0x67E2, 0x9E71, 0x67E4, 0x9E6E, 0x67E7, 0x9E76,\n\t0x67E9, 0x9E6C, 0x67EC, 0x9E6A, 0x67EE, 0x9E72, 0x67EF, 0x9E68,\t0x67F1, 0x928C, 0x67F3, 0x96F6, 0x67F4, 0x8EC4, 0x67F5, 0x8DF2,\n\t0x67FB, 0x8DB8, 0x67FE, 0x968F, 0x67FF, 0x8A60, 0x6801, 0xFAE5,\t0x6802, 0x92CC, 0x6803, 0x93C8, 0x6804, 0x8968, 0x6813, 0x90F0,\n\t0x6816, 0x90B2, 0x6817, 0x8C49, 0x681E, 0x9E78, 0x6821, 0x8D5A,\t0x6822, 0x8A9C, 0x6829, 0x9E7A, 0x682A, 0x8A94, 0x682B, 0x9E81,\n\t0x6832, 0x9E7D, 0x6834, 0x90F1, 0x6838, 0x8A6A, 0x6839, 0x8DAA,\t0x683C, 0x8A69, 0x683D, 0x8DCD, 0x6840, 0x9E7B, 0x6841, 0x8C85,\n\t0x6842, 0x8C6A, 0x6843, 0x938D, 0x6844, 0xFAE6, 0x6846, 0x9E79,\t0x6848, 0x88C4, 0x684D, 0x9E7C, 0x684E, 0x9E7E, 0x6850, 0x8BCB,\n\t0x6851, 0x8C4B, 0x6852, 0xFAE3, 0x6853, 0x8ABA, 0x6854, 0x8B6A,\t0x6859, 0x9E82, 0x685C, 0x8DF7, 0x685D, 0x9691, 0x685F, 0x8E56,\n\t0x6863, 0x9E83, 0x6867, 0x954F, 0x6874, 0x9E8F, 0x6876, 0x89B1,\t0x6877, 0x9E84, 0x687E, 0x9E95, 0x687F, 0x9E85, 0x6881, 0x97C0,\n\t0x6883, 0x9E8C, 0x6885, 0x947E, 0x688D, 0x9E94, 0x688F, 0x9E87,\t0x6893, 0x88B2, 0x6894, 0x9E89, 0x6897, 0x8D5B, 0x689B, 0x9E8B,\n\t0x689D, 0x9E8A, 0x689F, 0x9E86, 0x68A0, 0x9E91, 0x68A2, 0x8FBD,\t0x68A6, 0x9AEB, 0x68A7, 0x8CE6, 0x68A8, 0x979C, 0x68AD, 0x9E88,\n\t0x68AF, 0x92F2, 0x68B0, 0x8A42, 0x68B1, 0x8DAB, 0x68B3, 0x9E80,\t0x68B5, 0x9E90, 0x68B6, 0x8A81, 0x68B9, 0x9E8E, 0x68BA, 0x9E92,\n\t0x68BC, 0x938E, 0x68C4, 0x8AFC, 0x68C6, 0x9EB0, 0x68C8, 0xFA64,\t0x68C9, 0x96C7, 0x68CA, 0x9E97, 0x68CB, 0x8AFB, 0x68CD, 0x9E9E,\n\t0x68CF, 0xFAE7, 0x68D2, 0x965F, 0x68D4, 0x9E9F, 0x68D5, 0x9EA1,\t0x68D7, 0x9EA5, 0x68D8, 0x9E99, 0x68DA, 0x9249, 0x68DF, 0x938F,\n\t0x68E0, 0x9EA9, 0x68E1, 0x9E9C, 0x68E3, 0x9EA6, 0x68E7, 0x9EA0,\t0x68EE, 0x9058, 0x68EF, 0x9EAA, 0x68F2, 0x90B1, 0x68F9, 0x9EA8,\n\t0x68FA, 0x8ABB, 0x6900, 0x986F, 0x6901, 0x9E96, 0x6904, 0x9EA4,\t0x6905, 0x88D6, 0x6908, 0x9E98, 0x690B, 0x96B8, 0x690C, 0x9E9D,\n\t0x690D, 0x9041, 0x690E, 0x92C5, 0x690F, 0x9E93, 0x6912, 0x9EA3,\t0x6919, 0x909A, 0x691A, 0x9EAD, 0x691B, 0x8A91, 0x691C, 0x8C9F,\n\t0x6921, 0x9EAF, 0x6922, 0x9E9A, 0x6923, 0x9EAE, 0x6925, 0x9EA7,\t0x6926, 0x9E9B, 0x6928, 0x9EAB, 0x692A, 0x9EAC, 0x6930, 0x9EBD,\n\t0x6934, 0x93CC, 0x6936, 0x9EA2, 0x6939, 0x9EB9, 0x693D, 0x9EBB,\t0x693F, 0x92D6, 0x694A, 0x976B, 0x6953, 0x9596, 0x6954, 0x9EB6,\n\t0x6955, 0x91C8, 0x6959, 0x9EBC, 0x695A, 0x915E, 0x695C, 0x9EB3,\t0x695D, 0x9EC0, 0x695E, 0x9EBF, 0x6960, 0x93ED, 0x6961, 0x9EBE,\n\t0x6962, 0x93E8, 0x6968, 0xFAE9, 0x696A, 0x9EC2, 0x696B, 0x9EB5,\t0x696D, 0x8BC6, 0x696E, 0x9EB8, 0x696F, 0x8F7C, 0x6973, 0x9480,\n\t0x6974, 0x9EBA, 0x6975, 0x8BC9, 0x6977, 0x9EB2, 0x6978, 0x9EB4,\t0x6979, 0x9EB1, 0x697C, 0x984F, 0x697D, 0x8A79, 0x697E, 0x9EB7,\n\t0x6981, 0x9EC1, 0x6982, 0x8A54, 0x698A, 0x8DE5, 0x698E, 0x897C,\t0x6991, 0x9ED2, 0x6994, 0x9850, 0x6995, 0x9ED5, 0x6998, 0xFAEB,\n\t0x699B, 0x9059, 0x699C, 0x9ED4, 0x69A0, 0x9ED3, 0x69A7, 0x9ED0,\t0x69AE, 0x9EC4, 0x69B1, 0x9EE1, 0x69B2, 0x9EC3, 0x69B4, 0x9ED6,\n\t0x69BB, 0x9ECE, 0x69BE, 0x9EC9, 0x69BF, 0x9EC6, 0x69C1, 0x9EC7,\t0x69C3, 0x9ECF, 0x69C7, 0xEAA0, 0x69CA, 0x9ECC, 0x69CB, 0x8D5C,\n\t0x69CC, 0x92C6, 0x69CD, 0x9184, 0x69CE, 0x9ECA, 0x69D0, 0x9EC5,\t0x69D3, 0x9EC8, 0x69D8, 0x976C, 0x69D9, 0x968A, 0x69DD, 0x9ECD,\n\t0x69DE, 0x9ED7, 0x69E2, 0xFAEC, 0x69E7, 0x9EDF, 0x69E8, 0x9ED8,\t0x69EB, 0x9EE5, 0x69ED, 0x9EE3, 0x69F2, 0x9EDE, 0x69F9, 0x9EDD,\n\t0x69FB, 0x92CE, 0x69FD, 0x9185, 0x69FF, 0x9EDB, 0x6A02, 0x9ED9,\t0x6A05, 0x9EE0, 0x6A0A, 0x9EE6, 0x6A0B, 0x94F3, 0x6A0C, 0x9EEC,\n\t0x6A12, 0x9EE7, 0x6A13, 0x9EEA, 0x6A14, 0x9EE4, 0x6A17, 0x9294,\t0x6A19, 0x9557, 0x6A1B, 0x9EDA, 0x6A1E, 0x9EE2, 0x6A1F, 0x8FBE,\n\t0x6A21, 0x96CD, 0x6A22, 0x9EF6, 0x6A23, 0x9EE9, 0x6A29, 0x8CA0,\t0x6A2A, 0x89A1, 0x6A2B, 0x8A7E, 0x6A2E, 0x9ED1, 0x6A30, 0xFAED,\n\t0x6A35, 0x8FBF, 0x6A36, 0x9EEE, 0x6A38, 0x9EF5, 0x6A39, 0x8EF7,\t0x6A3A, 0x8A92, 0x6A3D, 0x924D, 0x6A44, 0x9EEB, 0x6A46, 0xFAEF,\n\t0x6A47, 0x9EF0, 0x6A48, 0x9EF4, 0x6A4B, 0x8BB4, 0x6A58, 0x8B6B,\t0x6A59, 0x9EF2, 0x6A5F, 0x8B40, 0x6A61, 0x93C9, 0x6A62, 0x9EF1,\n\t0x6A66, 0x9EF3, 0x6A6B, 0xFAEE, 0x6A72, 0x9EED, 0x6A73, 0xFAF0,\t0x6A78, 0x9EEF, 0x6A7E, 0xFAF1, 0x6A7F, 0x8A80, 0x6A80, 0x9268,\n\t0x6A84, 0x9EFA, 0x6A8D, 0x9EF8, 0x6A8E, 0x8CE7, 0x6A90, 0x9EF7,\t0x6A97, 0x9F40, 0x6A9C, 0x9E77, 0x6AA0, 0x9EF9, 0x6AA2, 0x9EFB,\n\t0x6AA3, 0x9EFC, 0x6AAA, 0x9F4B, 0x6AAC, 0x9F47, 0x6AAE, 0x9E8D,\t0x6AB3, 0x9F46, 0x6AB8, 0x9F45, 0x6ABB, 0x9F42, 0x6AC1, 0x9EE8,\n\t0x6AC2, 0x9F44, 0x6AC3, 0x9F43, 0x6AD1, 0x9F49, 0x6AD3, 0x9845,\t0x6ADA, 0x9F4C, 0x6ADB, 0x8BF9, 0x6ADE, 0x9F48, 0x6ADF, 0x9F4A,\n\t0x6AE2, 0xFAF2, 0x6AE4, 0xFAF3, 0x6AE8, 0x94A5, 0x6AEA, 0x9F4D,\t0x6AFA, 0x9F51, 0x6AFB, 0x9F4E, 0x6B04, 0x9793, 0x6B05, 0x9F4F,\n\t0x6B0A, 0x9EDC, 0x6B12, 0x9F52, 0x6B16, 0x9F53, 0x6B1D, 0x8954,\t0x6B1F, 0x9F55, 0x6B20, 0x8C87, 0x6B21, 0x8E9F, 0x6B23, 0x8BD3,\n\t0x6B27, 0x89A2, 0x6B32, 0x977E, 0x6B37, 0x9F57, 0x6B38, 0x9F56,\t0x6B39, 0x9F59, 0x6B3A, 0x8B5C, 0x6B3D, 0x8BD4, 0x6B3E, 0x8ABC,\n\t0x6B43, 0x9F5C, 0x6B47, 0x9F5B, 0x6B49, 0x9F5D, 0x6B4C, 0x89CC,\t0x6B4E, 0x9256, 0x6B50, 0x9F5E, 0x6B53, 0x8ABD, 0x6B54, 0x9F60,\n\t0x6B59, 0x9F5F, 0x6B5B, 0x9F61, 0x6B5F, 0x9F62, 0x6B61, 0x9F63,\t0x6B62, 0x8E7E, 0x6B63, 0x90B3, 0x6B64, 0x8D9F, 0x6B66, 0x9590,\n\t0x6B69, 0x95E0, 0x6B6A, 0x9863, 0x6B6F, 0x8E95, 0x6B73, 0x8DCE,\t0x6B74, 0x97F0, 0x6B78, 0x9F64, 0x6B79, 0x9F65, 0x6B7B, 0x8E80,\n\t0x6B7F, 0x9F66, 0x6B80, 0x9F67, 0x6B83, 0x9F69, 0x6B84, 0x9F68,\t0x6B86, 0x9677, 0x6B89, 0x8F7D, 0x6B8A, 0x8EEA, 0x6B8B, 0x8E63,\n\t0x6B8D, 0x9F6A, 0x6B95, 0x9F6C, 0x6B96, 0x9042, 0x6B98, 0x9F6B,\t0x6B9E, 0x9F6D, 0x6BA4, 0x9F6E, 0x6BAA, 0x9F6F, 0x6BAB, 0x9F70,\n\t0x6BAF, 0x9F71, 0x6BB1, 0x9F73, 0x6BB2, 0x9F72, 0x6BB3, 0x9F74,\t0x6BB4, 0x89A3, 0x6BB5, 0x9269, 0x6BB7, 0x9F75, 0x6BBA, 0x8E45,\n\t0x6BBB, 0x8A6B, 0x6BBC, 0x9F76, 0x6BBF, 0x9361, 0x6BC0, 0x9ACA,\t0x6BC5, 0x8B42, 0x6BC6, 0x9F77, 0x6BCB, 0x9F78, 0x6BCD, 0x95EA,\n\t0x6BCE, 0x9688, 0x6BD2, 0x93C5, 0x6BD3, 0x9F79, 0x6BD4, 0x94E4,\t0x6BD6, 0xFAF4, 0x6BD8, 0x94F9, 0x6BDB, 0x96D1, 0x6BDF, 0x9F7A,\n\t0x6BEB, 0x9F7C, 0x6BEC, 0x9F7B, 0x6BEF, 0x9F7E, 0x6BF3, 0x9F7D,\t0x6C08, 0x9F81, 0x6C0F, 0x8E81, 0x6C11, 0x96AF, 0x6C13, 0x9F82,\n\t0x6C14, 0x9F83, 0x6C17, 0x8B43, 0x6C1B, 0x9F84, 0x6C23, 0x9F86,\t0x6C24, 0x9F85, 0x6C34, 0x9085, 0x6C37, 0x9558, 0x6C38, 0x8969,\n\t0x6C3E, 0x94C3, 0x6C3F, 0xFAF5, 0x6C40, 0x92F3, 0x6C41, 0x8F60,\t0x6C42, 0x8B81, 0x6C4E, 0x94C4, 0x6C50, 0x8EAC, 0x6C55, 0x9F88,\n\t0x6C57, 0x8ABE, 0x6C5A, 0x8998, 0x6C5C, 0xFAF6, 0x6C5D, 0x93F0,\t0x6C5E, 0x9F87, 0x6C5F, 0x8D5D, 0x6C60, 0x9272, 0x6C62, 0x9F89,\n\t0x6C68, 0x9F91, 0x6C6A, 0x9F8A, 0x6C6F, 0xFAF8, 0x6C70, 0x91BF,\t0x6C72, 0x8B82, 0x6C73, 0x9F92, 0x6C7A, 0x8C88, 0x6C7D, 0x8B44,\n\t0x6C7E, 0x9F90, 0x6C81, 0x9F8E, 0x6C82, 0x9F8B, 0x6C83, 0x9780,\t0x6C86, 0xFAF7, 0x6C88, 0x92BE, 0x6C8C, 0x93D7, 0x6C8D, 0x9F8C,\n\t0x6C90, 0x9F94, 0x6C92, 0x9F93, 0x6C93, 0x8C42, 0x6C96, 0x89AB,\t0x6C99, 0x8DB9, 0x6C9A, 0x9F8D, 0x6C9B, 0x9F8F, 0x6CA1, 0x9676,\n\t0x6CA2, 0x91F2, 0x6CAB, 0x9697, 0x6CAE, 0x9F9C, 0x6CB1, 0x9F9D,\t0x6CB3, 0x89CD, 0x6CB8, 0x95A6, 0x6CB9, 0x96FB, 0x6CBA, 0x9F9F,\n\t0x6CBB, 0x8EA1, 0x6CBC, 0x8FC0, 0x6CBD, 0x9F98, 0x6CBE, 0x9F9E,\t0x6CBF, 0x8988, 0x6CC1, 0x8BB5, 0x6CC4, 0x9F95, 0x6CC5, 0x9F9A,\n\t0x6CC9, 0x90F2, 0x6CCA, 0x9491, 0x6CCC, 0x94E5, 0x6CD3, 0x9F97,\t0x6CD5, 0x9640, 0x6CD7, 0x9F99, 0x6CD9, 0x9FA2, 0x6CDA, 0xFAF9,\n\t0x6CDB, 0x9FA0, 0x6CDD, 0x9F9B, 0x6CE1, 0x9641, 0x6CE2, 0x9467,\t0x6CE3, 0x8B83, 0x6CE5, 0x9344, 0x6CE8, 0x928D, 0x6CEA, 0x9FA3,\n\t0x6CEF, 0x9FA1, 0x6CF0, 0x91D7, 0x6CF1, 0x9F96, 0x6CF3, 0x896A,\t0x6D04, 0xFAFA, 0x6D0B, 0x976D, 0x6D0C, 0x9FAE, 0x6D12, 0x9FAD,\n\t0x6D17, 0x90F4, 0x6D19, 0x9FAA, 0x6D1B, 0x978C, 0x6D1E, 0x93B4,\t0x6D1F, 0x9FA4, 0x6D25, 0x92C3, 0x6D29, 0x896B, 0x6D2A, 0x8D5E,\n\t0x6D2B, 0x9FA7, 0x6D32, 0x8F46, 0x6D33, 0x9FAC, 0x6D35, 0x9FAB,\t0x6D36, 0x9FA6, 0x6D38, 0x9FA9, 0x6D3B, 0x8A88, 0x6D3D, 0x9FA8,\n\t0x6D3E, 0x9468, 0x6D41, 0x97AC, 0x6D44, 0x8FF2, 0x6D45, 0x90F3,\t0x6D59, 0x9FB4, 0x6D5A, 0x9FB2, 0x6D5C, 0x956C, 0x6D63, 0x9FAF,\n\t0x6D64, 0x9FB1, 0x6D66, 0x8959, 0x6D69, 0x8D5F, 0x6D6A, 0x9851,\t0x6D6C, 0x8A5C, 0x6D6E, 0x9582, 0x6D6F, 0xFAFC, 0x6D74, 0x9781,\n\t0x6D77, 0x8A43, 0x6D78, 0x905A, 0x6D79, 0x9FB3, 0x6D85, 0x9FB8,\t0x6D87, 0xFAFB, 0x6D88, 0x8FC1, 0x6D8C, 0x974F, 0x6D8E, 0x9FB5,\n\t0x6D93, 0x9FB0, 0x6D95, 0x9FB6, 0x6D96, 0xFB40, 0x6D99, 0x97DC,\t0x6D9B, 0x9393, 0x6D9C, 0x93C0, 0x6DAC, 0xFB41, 0x6DAF, 0x8A55,\n\t0x6DB2, 0x8974, 0x6DB5, 0x9FBC, 0x6DB8, 0x9FBF, 0x6DBC, 0x97C1,\t0x6DC0, 0x9784, 0x6DC5, 0x9FC6, 0x6DC6, 0x9FC0, 0x6DC7, 0x9FBD,\n\t0x6DCB, 0x97D2, 0x6DCC, 0x9FC3, 0x6DCF, 0xFB42, 0x6DD1, 0x8F69,\t0x6DD2, 0x9FC5, 0x6DD5, 0x9FCA, 0x6DD8, 0x9391, 0x6DD9, 0x9FC8,\n\t0x6DDE, 0x9FC2, 0x6DE1, 0x9257, 0x6DE4, 0x9FC9, 0x6DE6, 0x9FBE,\t0x6DE8, 0x9FC4, 0x6DEA, 0x9FCB, 0x6DEB, 0x88FA, 0x6DEC, 0x9FC1,\n\t0x6DEE, 0x9FCC, 0x6DF1, 0x905B, 0x6DF2, 0xFB44, 0x6DF3, 0x8F7E,\t0x6DF5, 0x95A3, 0x6DF7, 0x8DAC, 0x6DF8, 0xFB43, 0x6DF9, 0x9FB9,\n\t0x6DFA, 0x9FC7, 0x6DFB, 0x9359, 0x6DFC, 0xFB45, 0x6E05, 0x90B4,\t0x6E07, 0x8A89, 0x6E08, 0x8DCF, 0x6E09, 0x8FC2, 0x6E0A, 0x9FBB,\n\t0x6E0B, 0x8F61, 0x6E13, 0x8C6B, 0x6E15, 0x9FBA, 0x6E19, 0x9FD0,\t0x6E1A, 0x8F8D, 0x6E1B, 0x8CB8, 0x6E1D, 0x9FDF, 0x6E1F, 0x9FD9,\n\t0x6E20, 0x8B94, 0x6E21, 0x936E, 0x6E23, 0x9FD4, 0x6E24, 0x9FDD,\t0x6E25, 0x88AD, 0x6E26, 0x8951, 0x6E27, 0xFB48, 0x6E29, 0x89B7,\n\t0x6E2B, 0x9FD6, 0x6E2C, 0x91AA, 0x6E2D, 0x9FCD, 0x6E2E, 0x9FCF,\t0x6E2F, 0x8D60, 0x6E38, 0x9FE0, 0x6E39, 0xFB46, 0x6E3A, 0x9FDB,\n\t0x6E3C, 0xFB49, 0x6E3E, 0x9FD3, 0x6E43, 0x9FDA, 0x6E4A, 0x96A9,\t0x6E4D, 0x9FD8, 0x6E4E, 0x9FDC, 0x6E56, 0x8CCE, 0x6E58, 0x8FC3,\n\t0x6E5B, 0x9258, 0x6E5C, 0xFB47, 0x6E5F, 0x9FD2, 0x6E67, 0x974E,\t0x6E6B, 0x9FD5, 0x6E6E, 0x9FCE, 0x6E6F, 0x9392, 0x6E72, 0x9FD1,\n\t0x6E76, 0x9FD7, 0x6E7E, 0x9870, 0x6E7F, 0x8EBC, 0x6E80, 0x969E,\t0x6E82, 0x9FE1, 0x6E8C, 0x94AC, 0x6E8F, 0x9FED, 0x6E90, 0x8CB9,\n\t0x6E96, 0x8F80, 0x6E98, 0x9FE3, 0x6E9C, 0x97AD, 0x6E9D, 0x8D61,\t0x6E9F, 0x9FF0, 0x6EA2, 0x88EC, 0x6EA5, 0x9FEE, 0x6EAA, 0x9FE2,\n\t0x6EAF, 0x9FE8, 0x6EB2, 0x9FEA, 0x6EB6, 0x976E, 0x6EB7, 0x9FE5,\t0x6EBA, 0x934D, 0x6EBD, 0x9FE7, 0x6EBF, 0xFB4A, 0x6EC2, 0x9FEF,\n\t0x6EC4, 0x9FE9, 0x6EC5, 0x96C5, 0x6EC9, 0x9FE4, 0x6ECB, 0x8EA0,\t0x6ECC, 0x9FFC, 0x6ED1, 0x8A8A, 0x6ED3, 0x9FE6, 0x6ED4, 0x9FEB,\n\t0x6ED5, 0x9FEC, 0x6EDD, 0x91EA, 0x6EDE, 0x91D8, 0x6EEC, 0x9FF4,\t0x6EEF, 0x9FFA, 0x6EF2, 0x9FF8, 0x6EF4, 0x9348, 0x6EF7, 0xE042,\n\t0x6EF8, 0x9FF5, 0x6EFE, 0x9FF6, 0x6EFF, 0x9FDE, 0x6F01, 0x8B99,\t0x6F02, 0x9559, 0x6F06, 0x8EBD, 0x6F09, 0x8D97, 0x6F0F, 0x9852,\n\t0x6F11, 0x9FF2, 0x6F13, 0xE041, 0x6F14, 0x8989, 0x6F15, 0x9186,\t0x6F20, 0x9499, 0x6F22, 0x8ABF, 0x6F23, 0x97F8, 0x6F2B, 0x969F,\n\t0x6F2C, 0x92D0, 0x6F31, 0x9FF9, 0x6F32, 0x9FFB, 0x6F38, 0x9151,\t0x6F3E, 0xE040, 0x6F3F, 0x9FF7, 0x6F41, 0x9FF1, 0x6F45, 0x8AC1,\n\t0x6F54, 0x8C89, 0x6F58, 0xE04E, 0x6F5B, 0xE049, 0x6F5C, 0x90F6,\t0x6F5F, 0x8A83, 0x6F64, 0x8F81, 0x6F66, 0xE052, 0x6F6D, 0xE04B,\n\t0x6F6E, 0x92AA, 0x6F6F, 0xE048, 0x6F70, 0x92D7, 0x6F74, 0xE06B,\t0x6F78, 0xE045, 0x6F7A, 0xE044, 0x6F7C, 0xE04D, 0x6F80, 0xE047,\n\t0x6F81, 0xE046, 0x6F82, 0xE04C, 0x6F84, 0x909F, 0x6F86, 0xE043,\t0x6F88, 0xFB4B, 0x6F8E, 0xE04F, 0x6F91, 0xE050, 0x6F97, 0x8AC0,\n\t0x6FA1, 0xE055, 0x6FA3, 0xE054, 0x6FA4, 0xE056, 0x6FAA, 0xE059,\t0x6FB1, 0x9362, 0x6FB3, 0xE053, 0x6FB5, 0xFB4C, 0x6FB9, 0xE057,\n\t0x6FC0, 0x8C83, 0x6FC1, 0x91F7, 0x6FC2, 0xE051, 0x6FC3, 0x945A,\t0x6FC6, 0xE058, 0x6FD4, 0xE05D, 0x6FD5, 0xE05B, 0x6FD8, 0xE05E,\n\t0x6FDB, 0xE061, 0x6FDF, 0xE05A, 0x6FE0, 0x8D8A, 0x6FE1, 0x9447,\t0x6FE4, 0x9FB7, 0x6FEB, 0x9794, 0x6FEC, 0xE05C, 0x6FEE, 0xE060,\n\t0x6FEF, 0x91F3, 0x6FF1, 0xE05F, 0x6FF3, 0xE04A, 0x6FF5, 0xFB4D,\t0x6FF6, 0xE889, 0x6FFA, 0xE064, 0x6FFE, 0xE068, 0x7001, 0xE066,\n\t0x7005, 0xFB4E, 0x7007, 0xFB4F, 0x7009, 0xE062, 0x700B, 0xE063,\t0x700F, 0xE067, 0x7011, 0xE065, 0x7015, 0x956D, 0x7018, 0xE06D,\n\t0x701A, 0xE06A, 0x701B, 0xE069, 0x701D, 0xE06C, 0x701E, 0x93D2,\t0x701F, 0xE06E, 0x7026, 0x9295, 0x7027, 0x91EB, 0x7028, 0xFB50,\n\t0x702C, 0x90A3, 0x7030, 0xE06F, 0x7032, 0xE071, 0x703E, 0xE070,\t0x704C, 0x9FF3, 0x7051, 0xE072, 0x7058, 0x93E5, 0x7063, 0xE073,\n\t0x706B, 0x89CE, 0x706F, 0x9394, 0x7070, 0x8A44, 0x7078, 0x8B84,\t0x707C, 0x8EDC, 0x707D, 0x8DD0, 0x7085, 0xFB51, 0x7089, 0x9846,\n\t0x708A, 0x9086, 0x708E, 0x898A, 0x7092, 0xE075, 0x7099, 0xE074,\t0x70AB, 0xFB52, 0x70AC, 0xE078, 0x70AD, 0x9259, 0x70AE, 0xE07B,\n\t0x70AF, 0xE076, 0x70B3, 0xE07A, 0x70B8, 0xE079, 0x70B9, 0x935F,\t0x70BA, 0x88D7, 0x70BB, 0xFA62, 0x70C8, 0x97F3, 0x70CB, 0xE07D,\n\t0x70CF, 0x8947, 0x70D9, 0xE080, 0x70DD, 0xE07E, 0x70DF, 0xE07C,\t0x70F1, 0xE077, 0x70F9, 0x9642, 0x70FD, 0xE082, 0x7104, 0xFB54,\n\t0x7109, 0xE081, 0x710F, 0xFB53, 0x7114, 0x898B, 0x7119, 0xE084,\t0x711A, 0x95B0, 0x711C, 0xE083, 0x7121, 0x96B3, 0x7126, 0x8FC5,\n\t0x7136, 0x9152, 0x713C, 0x8FC4, 0x7146, 0xFB56, 0x7147, 0xFB57,\t0x7149, 0x97F9, 0x714C, 0xE08A, 0x714E, 0x90F7, 0x7155, 0xE086,\n\t0x7156, 0xE08B, 0x7159, 0x898C, 0x715C, 0xFB55, 0x7162, 0xE089,\t0x7164, 0x9481, 0x7165, 0xE085, 0x7166, 0xE088, 0x7167, 0x8FC6,\n\t0x7169, 0x94CF, 0x716C, 0xE08C, 0x716E, 0x8ECF, 0x717D, 0x90F8,\t0x7184, 0xE08F, 0x7188, 0xE087, 0x718A, 0x8C46, 0x718F, 0xE08D,\n\t0x7194, 0x976F, 0x7195, 0xE090, 0x7199, 0xEAA4, 0x719F, 0x8F6E,\t0x71A8, 0xE091, 0x71AC, 0xE092, 0x71B1, 0x944D, 0x71B9, 0xE094,\n\t0x71BE, 0xE095, 0x71C1, 0xFB59, 0x71C3, 0x9452, 0x71C8, 0x9395,\t0x71C9, 0xE097, 0x71CE, 0xE099, 0x71D0, 0x97D3, 0x71D2, 0xE096,\n\t0x71D4, 0xE098, 0x71D5, 0x898D, 0x71D7, 0xE093, 0x71DF, 0x9A7A,\t0x71E0, 0xE09A, 0x71E5, 0x9187, 0x71E6, 0x8E57, 0x71E7, 0xE09C,\n\t0x71EC, 0xE09B, 0x71ED, 0x9043, 0x71EE, 0x99D7, 0x71F5, 0xE09D,\t0x71F9, 0xE09F, 0x71FB, 0xE08E, 0x71FC, 0xE09E, 0x71FE, 0xFB5A,\n\t0x71FF, 0xE0A0, 0x7206, 0x949A, 0x720D, 0xE0A1, 0x7210, 0xE0A2,\t0x721B, 0xE0A3, 0x7228, 0xE0A4, 0x722A, 0x92DC, 0x722C, 0xE0A6,\n\t0x722D, 0xE0A5, 0x7230, 0xE0A7, 0x7232, 0xE0A8, 0x7235, 0x8EDD,\t0x7236, 0x9583, 0x723A, 0x96EA, 0x723B, 0xE0A9, 0x723C, 0xE0AA,\n\t0x723D, 0x9175, 0x723E, 0x8EA2, 0x723F, 0xE0AB, 0x7240, 0xE0AC,\t0x7246, 0xE0AD, 0x7247, 0x95D0, 0x7248, 0x94C5, 0x724B, 0xE0AE,\n\t0x724C, 0x9476, 0x7252, 0x92AB, 0x7258, 0xE0AF, 0x7259, 0x89E5,\t0x725B, 0x8B8D, 0x725D, 0x96C4, 0x725F, 0x96B4, 0x7261, 0x89B2,\n\t0x7262, 0x9853, 0x7267, 0x9671, 0x7269, 0x95A8, 0x7272, 0x90B5,\t0x7274, 0xE0B0, 0x7279, 0x93C1, 0x727D, 0x8CA1, 0x727E, 0xE0B1,\n\t0x7280, 0x8DD2, 0x7281, 0xE0B3, 0x7282, 0xE0B2, 0x7287, 0xE0B4,\t0x7292, 0xE0B5, 0x7296, 0xE0B6, 0x72A0, 0x8B5D, 0x72A2, 0xE0B7,\n\t0x72A7, 0xE0B8, 0x72AC, 0x8CA2, 0x72AF, 0x94C6, 0x72B1, 0xFB5B,\t0x72B2, 0xE0BA, 0x72B6, 0x8FF3, 0x72B9, 0xE0B9, 0x72BE, 0xFB5C,\n\t0x72C2, 0x8BB6, 0x72C3, 0xE0BB, 0x72C4, 0xE0BD, 0x72C6, 0xE0BC,\t0x72CE, 0xE0BE, 0x72D0, 0x8CCF, 0x72D2, 0xE0BF, 0x72D7, 0x8BE7,\n\t0x72D9, 0x915F, 0x72DB, 0x8D9D, 0x72E0, 0xE0C1, 0x72E1, 0xE0C2,\t0x72E2, 0xE0C0, 0x72E9, 0x8EEB, 0x72EC, 0x93C6, 0x72ED, 0x8BB7,\n\t0x72F7, 0xE0C4, 0x72F8, 0x924B, 0x72F9, 0xE0C3, 0x72FC, 0x9854,\t0x72FD, 0x9482, 0x730A, 0xE0C7, 0x7316, 0xE0C9, 0x7317, 0xE0C6,\n\t0x731B, 0x96D2, 0x731C, 0xE0C8, 0x731D, 0xE0CA, 0x731F, 0x97C2,\t0x7324, 0xFB5D, 0x7325, 0xE0CE, 0x7329, 0xE0CD, 0x732A, 0x9296,\n\t0x732B, 0x944C, 0x732E, 0x8CA3, 0x732F, 0xE0CC, 0x7334, 0xE0CB,\t0x7336, 0x9750, 0x7337, 0x9751, 0x733E, 0xE0CF, 0x733F, 0x898E,\n\t0x7344, 0x8D96, 0x7345, 0x8E82, 0x734E, 0xE0D0, 0x734F, 0xE0D1,\t0x7357, 0xE0D3, 0x7363, 0x8F62, 0x7368, 0xE0D5, 0x736A, 0xE0D4,\n\t0x7370, 0xE0D6, 0x7372, 0x8A6C, 0x7375, 0xE0D8, 0x7377, 0xFB5F,\t0x7378, 0xE0D7, 0x737A, 0xE0DA, 0x737B, 0xE0D9, 0x7384, 0x8CBA,\n\t0x7387, 0x97A6, 0x7389, 0x8BCA, 0x738B, 0x89A4, 0x7396, 0x8BE8,\t0x73A9, 0x8ADF, 0x73B2, 0x97E6, 0x73B3, 0xE0DC, 0x73BB, 0xE0DE,\n\t0x73BD, 0xFB60, 0x73C0, 0xE0DF, 0x73C2, 0x89CF, 0x73C8, 0xE0DB,\t0x73C9, 0xFB61, 0x73CA, 0x8E58, 0x73CD, 0x92BF, 0x73CE, 0xE0DD,\n\t0x73D2, 0xFB64, 0x73D6, 0xFB62, 0x73DE, 0xE0E2, 0x73E0, 0x8EEC,\t0x73E3, 0xFB63, 0x73E5, 0xE0E0, 0x73EA, 0x8C5D, 0x73ED, 0x94C7,\n\t0x73EE, 0xE0E1, 0x73F1, 0xE0FC, 0x73F5, 0xFB66, 0x73F8, 0xE0E7,\t0x73FE, 0x8CBB, 0x7403, 0x8B85, 0x7405, 0xE0E4, 0x7406, 0x979D,\n\t0x7407, 0xFB65, 0x7409, 0x97AE, 0x7422, 0x91F4, 0x7425, 0xE0E6,\t0x7426, 0xFB67, 0x7429, 0xFB69, 0x742A, 0xFB68, 0x742E, 0xFB6A,\n\t0x7432, 0xE0E8, 0x7433, 0x97D4, 0x7434, 0x8BD5, 0x7435, 0x94FA,\t0x7436, 0x9469, 0x743A, 0xE0E9, 0x743F, 0xE0EB, 0x7441, 0xE0EE,\n\t0x7455, 0xE0EA, 0x7459, 0xE0ED, 0x745A, 0x8CE8, 0x745B, 0x896C,\t0x745C, 0xE0EF, 0x745E, 0x9090, 0x745F, 0xE0EC, 0x7460, 0x97DA,\n\t0x7462, 0xFB6B, 0x7463, 0xE0F2, 0x7464, 0xEAA2, 0x7469, 0xE0F0,\t0x746A, 0xE0F3, 0x746F, 0xE0E5, 0x7470, 0xE0F1, 0x7473, 0x8DBA,\n\t0x7476, 0xE0F4, 0x747E, 0xE0F5, 0x7483, 0x979E, 0x7489, 0xFB6C,\t0x748B, 0xE0F6, 0x749E, 0xE0F7, 0x749F, 0xFB6D, 0x74A2, 0xE0E3,\n\t0x74A7, 0xE0F8, 0x74B0, 0x8AC2, 0x74BD, 0x8EA3, 0x74CA, 0xE0F9,\t0x74CF, 0xE0FA, 0x74D4, 0xE0FB, 0x74DC, 0x895A, 0x74E0, 0xE140,\n\t0x74E2, 0x955A, 0x74E3, 0xE141, 0x74E6, 0x8AA2, 0x74E7, 0xE142,\t0x74E9, 0xE143, 0x74EE, 0xE144, 0x74F0, 0xE146, 0x74F1, 0xE147,\n\t0x74F2, 0xE145, 0x74F6, 0x9572, 0x74F7, 0xE149, 0x74F8, 0xE148,\t0x7501, 0xFB6E, 0x7503, 0xE14B, 0x7504, 0xE14A, 0x7505, 0xE14C,\n\t0x750C, 0xE14D, 0x750D, 0xE14F, 0x750E, 0xE14E, 0x7511, 0x8D99,\t0x7513, 0xE151, 0x7515, 0xE150, 0x7518, 0x8AC3, 0x751A, 0x9072,\n\t0x751C, 0x935B, 0x751E, 0xE152, 0x751F, 0x90B6, 0x7523, 0x8E59,\t0x7525, 0x8999, 0x7526, 0xE153, 0x7528, 0x9770, 0x752B, 0x95E1,\n\t0x752C, 0xE154, 0x752F, 0xFAA8, 0x7530, 0x9363, 0x7531, 0x9752,\t0x7532, 0x8D62, 0x7533, 0x905C, 0x7537, 0x926A, 0x7538, 0x99B2,\n\t0x753A, 0x92AC, 0x753B, 0x89E6, 0x753C, 0xE155, 0x7544, 0xE156,\t0x7546, 0xE15B, 0x7549, 0xE159, 0x754A, 0xE158, 0x754B, 0x9DC0,\n\t0x754C, 0x8A45, 0x754D, 0xE157, 0x754F, 0x88D8, 0x7551, 0x94A8,\t0x7554, 0x94C8, 0x7559, 0x97AF, 0x755A, 0xE15C, 0x755B, 0xE15A,\n\t0x755C, 0x927B, 0x755D, 0x90A4, 0x7560, 0x94A9, 0x7562, 0x954C,\t0x7564, 0xE15E, 0x7565, 0x97AA, 0x7566, 0x8C6C, 0x7567, 0xE15F,\n\t0x7569, 0xE15D, 0x756A, 0x94D4, 0x756B, 0xE160, 0x756D, 0xE161,\t0x756F, 0xFB6F, 0x7570, 0x88D9, 0x7573, 0x8FF4, 0x7574, 0xE166,\n\t0x7576, 0xE163, 0x7577, 0x93EB, 0x7578, 0xE162, 0x757F, 0x8B45,\t0x7582, 0xE169, 0x7586, 0xE164, 0x7587, 0xE165, 0x7589, 0xE168,\n\t0x758A, 0xE167, 0x758B, 0x9544, 0x758E, 0x9161, 0x758F, 0x9160,\t0x7591, 0x8B5E, 0x7594, 0xE16A, 0x759A, 0xE16B, 0x759D, 0xE16C,\n\t0x75A3, 0xE16E, 0x75A5, 0xE16D, 0x75AB, 0x8975, 0x75B1, 0xE176,\t0x75B2, 0x94E6, 0x75B3, 0xE170, 0x75B5, 0xE172, 0x75B8, 0xE174,\n\t0x75B9, 0x905D, 0x75BC, 0xE175, 0x75BD, 0xE173, 0x75BE, 0x8EBE,\t0x75C2, 0xE16F, 0x75C3, 0xE171, 0x75C5, 0x9561, 0x75C7, 0x8FC7,\n\t0x75CA, 0xE178, 0x75CD, 0xE177, 0x75D2, 0xE179, 0x75D4, 0x8EA4,\t0x75D5, 0x8DAD, 0x75D8, 0x9397, 0x75D9, 0xE17A, 0x75DB, 0x92C9,\n\t0x75DE, 0xE17C, 0x75E2, 0x979F, 0x75E3, 0xE17B, 0x75E9, 0x9189,\t0x75F0, 0xE182, 0x75F2, 0xE184, 0x75F3, 0xE185, 0x75F4, 0x9273,\n\t0x75FA, 0xE183, 0x75FC, 0xE180, 0x75FE, 0xE17D, 0x75FF, 0xE17E,\t0x7601, 0xE181, 0x7609, 0xE188, 0x760B, 0xE186, 0x760D, 0xE187,\n\t0x761F, 0xE189, 0x7620, 0xE18B, 0x7621, 0xE18C, 0x7622, 0xE18D,\t0x7624, 0xE18E, 0x7627, 0xE18A, 0x7630, 0xE190, 0x7634, 0xE18F,\n\t0x763B, 0xE191, 0x7642, 0x97C3, 0x7646, 0xE194, 0x7647, 0xE192,\t0x7648, 0xE193, 0x764C, 0x8AE0, 0x7652, 0x96FC, 0x7656, 0x95C8,\n\t0x7658, 0xE196, 0x765C, 0xE195, 0x7661, 0xE197, 0x7662, 0xE198,\t0x7667, 0xE19C, 0x7668, 0xE199, 0x7669, 0xE19A, 0x766A, 0xE19B,\n\t0x766C, 0xE19D, 0x7670, 0xE19E, 0x7672, 0xE19F, 0x7676, 0xE1A0,\t0x7678, 0xE1A1, 0x767A, 0x94AD, 0x767B, 0x936F, 0x767C, 0xE1A2,\n\t0x767D, 0x9492, 0x767E, 0x9553, 0x7680, 0xE1A3, 0x7682, 0xFB70,\t0x7683, 0xE1A4, 0x7684, 0x9349, 0x7686, 0x8A46, 0x7687, 0x8D63,\n\t0x7688, 0xE1A5, 0x768B, 0xE1A6, 0x768E, 0xE1A7, 0x7690, 0x8E48,\t0x7693, 0xE1A9, 0x7696, 0xE1A8, 0x7699, 0xE1AA, 0x769A, 0xE1AB,\n\t0x769B, 0xFB73, 0x769C, 0xFB71, 0x769E, 0xFB72, 0x76A6, 0xFB74,\t0x76AE, 0x94E7, 0x76B0, 0xE1AC, 0x76B4, 0xE1AD, 0x76B7, 0xEA89,\n\t0x76B8, 0xE1AE, 0x76B9, 0xE1AF, 0x76BA, 0xE1B0, 0x76BF, 0x8E4D,\t0x76C2, 0xE1B1, 0x76C3, 0x9475, 0x76C6, 0x967E, 0x76C8, 0x896D,\n\t0x76CA, 0x8976, 0x76CD, 0xE1B2, 0x76D2, 0xE1B4, 0x76D6, 0xE1B3,\t0x76D7, 0x9390, 0x76DB, 0x90B7, 0x76DC, 0x9F58, 0x76DE, 0xE1B5,\n\t0x76DF, 0x96BF, 0x76E1, 0xE1B6, 0x76E3, 0x8AC4, 0x76E4, 0x94D5,\t0x76E5, 0xE1B7, 0x76E7, 0xE1B8, 0x76EA, 0xE1B9, 0x76EE, 0x96DA,\n\t0x76F2, 0x96D3, 0x76F4, 0x92BC, 0x76F8, 0x918A, 0x76FB, 0xE1BB,\t0x76FE, 0x8F82, 0x7701, 0x8FC8, 0x7704, 0xE1BE, 0x7707, 0xE1BD,\n\t0x7708, 0xE1BC, 0x7709, 0x94FB, 0x770B, 0x8AC5, 0x770C, 0x8CA7,\t0x771B, 0xE1C4, 0x771E, 0xE1C1, 0x771F, 0x905E, 0x7720, 0x96B0,\n\t0x7724, 0xE1C0, 0x7725, 0xE1C2, 0x7726, 0xE1C3, 0x7729, 0xE1BF,\t0x7737, 0xE1C5, 0x7738, 0xE1C6, 0x773A, 0x92AD, 0x773C, 0x8AE1,\n\t0x7740, 0x9285, 0x7746, 0xFB76, 0x7747, 0xE1C7, 0x775A, 0xE1C8,\t0x775B, 0xE1CB, 0x7761, 0x9087, 0x7763, 0x93C2, 0x7765, 0xE1CC,\n\t0x7766, 0x9672, 0x7768, 0xE1C9, 0x776B, 0xE1CA, 0x7779, 0xE1CF,\t0x777E, 0xE1CE, 0x777F, 0xE1CD, 0x778B, 0xE1D1, 0x778E, 0xE1D0,\n\t0x7791, 0xE1D2, 0x779E, 0xE1D4, 0x77A0, 0xE1D3, 0x77A5, 0x95CB,\t0x77AC, 0x8F75, 0x77AD, 0x97C4, 0x77B0, 0xE1D5, 0x77B3, 0x93B5,\n\t0x77B6, 0xE1D6, 0x77B9, 0xE1D7, 0x77BB, 0xE1DB, 0x77BC, 0xE1D9,\t0x77BD, 0xE1DA, 0x77BF, 0xE1D8, 0x77C7, 0xE1DC, 0x77CD, 0xE1DD,\n\t0x77D7, 0xE1DE, 0x77DA, 0xE1DF, 0x77DB, 0x96B5, 0x77DC, 0xE1E0,\t0x77E2, 0x96EE, 0x77E3, 0xE1E1, 0x77E5, 0x926D, 0x77E7, 0x948A,\n\t0x77E9, 0x8BE9, 0x77ED, 0x925A, 0x77EE, 0xE1E2, 0x77EF, 0x8BB8,\t0x77F3, 0x90CE, 0x77FC, 0xE1E3, 0x7802, 0x8DBB, 0x780C, 0xE1E4,\n\t0x7812, 0xE1E5, 0x7814, 0x8CA4, 0x7815, 0x8DD3, 0x7820, 0xE1E7,\t0x7821, 0xFB78, 0x7825, 0x9375, 0x7826, 0x8DD4, 0x7827, 0x8B6D,\n\t0x7832, 0x9643, 0x7834, 0x946A, 0x783A, 0x9376, 0x783F, 0x8D7B,\t0x7845, 0xE1E9, 0x784E, 0xFB79, 0x785D, 0x8FC9, 0x7864, 0xFB7A,\n\t0x786B, 0x97B0, 0x786C, 0x8D64, 0x786F, 0x8CA5, 0x7872, 0x94A1,\t0x7874, 0xE1EB, 0x787A, 0xFB7B, 0x787C, 0xE1ED, 0x7881, 0x8CE9,\n\t0x7886, 0xE1EC, 0x7887, 0x92F4, 0x788C, 0xE1EF, 0x788D, 0x8A56,\t0x788E, 0xE1EA, 0x7891, 0x94E8, 0x7893, 0x894F, 0x7895, 0x8DEA,\n\t0x7897, 0x9871, 0x789A, 0xE1EE, 0x78A3, 0xE1F0, 0x78A7, 0x95C9,\t0x78A9, 0x90D7, 0x78AA, 0xE1F2, 0x78AF, 0xE1F3, 0x78B5, 0xE1F1,\n\t0x78BA, 0x8A6D, 0x78BC, 0xE1F9, 0x78BE, 0xE1F8, 0x78C1, 0x8EA5,\t0x78C5, 0xE1FA, 0x78C6, 0xE1F5, 0x78CA, 0xE1FB, 0x78CB, 0xE1F6,\n\t0x78D0, 0x94D6, 0x78D1, 0xE1F4, 0x78D4, 0xE1F7, 0x78DA, 0xE241,\t0x78E7, 0xE240, 0x78E8, 0x9681, 0x78EC, 0xE1FC, 0x78EF, 0x88E9,\n\t0x78F4, 0xE243, 0x78FD, 0xE242, 0x7901, 0x8FCA, 0x7907, 0xE244,\t0x790E, 0x9162, 0x7911, 0xE246, 0x7912, 0xE245, 0x7919, 0xE247,\n\t0x7926, 0xE1E6, 0x792A, 0xE1E8, 0x792B, 0xE249, 0x792C, 0xE248,\t0x7930, 0xFB7C, 0x793A, 0x8EA6, 0x793C, 0x97E7, 0x793E, 0x8ED0,\n\t0x7940, 0xE24A, 0x7941, 0x8C56, 0x7947, 0x8B5F, 0x7948, 0x8B46,\t0x7949, 0x8E83, 0x7950, 0x9753, 0x7953, 0xE250, 0x7955, 0xE24F,\n\t0x7956, 0x9163, 0x7957, 0xE24C, 0x795A, 0xE24E, 0x795D, 0x8F6A,\t0x795E, 0x905F, 0x795F, 0xE24D, 0x7960, 0xE24B, 0x7962, 0x9449,\n\t0x7965, 0x8FCB, 0x7968, 0x955B, 0x796D, 0x8DD5, 0x7977, 0x9398,\t0x797A, 0xE251, 0x797F, 0xE252, 0x7980, 0xE268, 0x7981, 0x8BD6,\n\t0x7984, 0x985C, 0x7985, 0x9154, 0x798A, 0xE253, 0x798D, 0x89D0,\t0x798E, 0x92F5, 0x798F, 0x959F, 0x7994, 0xFB81, 0x799B, 0xFB83,\n\t0x799D, 0xE254, 0x79A6, 0x8B9A, 0x79A7, 0xE255, 0x79AA, 0xE257,\t0x79AE, 0xE258, 0x79B0, 0x9448, 0x79B3, 0xE259, 0x79B9, 0xE25A,\n\t0x79BA, 0xE25B, 0x79BD, 0x8BD7, 0x79BE, 0x89D1, 0x79BF, 0x93C3,\t0x79C0, 0x8F47, 0x79C1, 0x8E84, 0x79C9, 0xE25C, 0x79CB, 0x8F48,\n\t0x79D1, 0x89C8, 0x79D2, 0x9562, 0x79D5, 0xE25D, 0x79D8, 0x94E9,\t0x79DF, 0x9164, 0x79E1, 0xE260, 0x79E3, 0xE261, 0x79E4, 0x9489,\n\t0x79E6, 0x9060, 0x79E7, 0xE25E, 0x79E9, 0x9281, 0x79EC, 0xE25F,\t0x79F0, 0x8FCC, 0x79FB, 0x88DA, 0x7A00, 0x8B48, 0x7A08, 0xE262,\n\t0x7A0B, 0x92F6, 0x7A0D, 0xE263, 0x7A0E, 0x90C5, 0x7A14, 0x96AB,\t0x7A17, 0x9542, 0x7A18, 0xE264, 0x7A19, 0xE265, 0x7A1A, 0x9274,\n\t0x7A1C, 0x97C5, 0x7A1F, 0xE267, 0x7A20, 0xE266, 0x7A2E, 0x8EED,\t0x7A31, 0xE269, 0x7A32, 0x88EE, 0x7A37, 0xE26C, 0x7A3B, 0xE26A,\n\t0x7A3C, 0x89D2, 0x7A3D, 0x8C6D, 0x7A3E, 0xE26B, 0x7A3F, 0x8D65,\t0x7A40, 0x8D92, 0x7A42, 0x95E4, 0x7A43, 0xE26D, 0x7A46, 0x9673,\n\t0x7A49, 0xE26F, 0x7A4D, 0x90CF, 0x7A4E, 0x896E, 0x7A4F, 0x89B8,\t0x7A50, 0x88AA, 0x7A57, 0xE26E, 0x7A61, 0xE270, 0x7A62, 0xE271,\n\t0x7A63, 0x8FF5, 0x7A69, 0xE272, 0x7A6B, 0x8A6E, 0x7A70, 0xE274,\t0x7A74, 0x8C8A, 0x7A76, 0x8B86, 0x7A79, 0xE275, 0x7A7A, 0x8BF3,\n\t0x7A7D, 0xE276, 0x7A7F, 0x90FA, 0x7A81, 0x93CB, 0x7A83, 0x90DE,\t0x7A84, 0x8DF3, 0x7A88, 0xE277, 0x7A92, 0x9282, 0x7A93, 0x918B,\n\t0x7A95, 0xE279, 0x7A96, 0xE27B, 0x7A97, 0xE278, 0x7A98, 0xE27A,\t0x7A9F, 0x8C41, 0x7AA9, 0xE27C, 0x7AAA, 0x8C45, 0x7AAE, 0x8B87,\n\t0x7AAF, 0x9771, 0x7AB0, 0xE27E, 0x7AB6, 0xE280, 0x7ABA, 0x894D,\t0x7ABF, 0xE283, 0x7AC3, 0x8A96, 0x7AC4, 0xE282, 0x7AC5, 0xE281,\n\t0x7AC7, 0xE285, 0x7AC8, 0xE27D, 0x7ACA, 0xE286, 0x7ACB, 0x97A7,\t0x7ACD, 0xE287, 0x7ACF, 0xE288, 0x7AD1, 0xFB84, 0x7AD2, 0x9AF2,\n\t0x7AD3, 0xE28A, 0x7AD5, 0xE289, 0x7AD9, 0xE28B, 0x7ADA, 0xE28C,\t0x7ADC, 0x97B3, 0x7ADD, 0xE28D, 0x7ADF, 0xE8ED, 0x7AE0, 0x8FCD,\n\t0x7AE1, 0xE28E, 0x7AE2, 0xE28F, 0x7AE3, 0x8F76, 0x7AE5, 0x93B6,\t0x7AE6, 0xE290, 0x7AE7, 0xFB85, 0x7AEA, 0x9247, 0x7AEB, 0xFB87,\n\t0x7AED, 0xE291, 0x7AEF, 0x925B, 0x7AF0, 0xE292, 0x7AF6, 0x8BA3,\t0x7AF8, 0x995E, 0x7AF9, 0x927C, 0x7AFA, 0x8EB1, 0x7AFF, 0x8AC6,\n\t0x7B02, 0xE293, 0x7B04, 0xE2A0, 0x7B06, 0xE296, 0x7B08, 0x8B88,\t0x7B0A, 0xE295, 0x7B0B, 0xE2A2, 0x7B0F, 0xE294, 0x7B11, 0x8FCE,\n\t0x7B18, 0xE298, 0x7B19, 0xE299, 0x7B1B, 0x934A, 0x7B1E, 0xE29A,\t0x7B20, 0x8A7D, 0x7B25, 0x9079, 0x7B26, 0x9584, 0x7B28, 0xE29C,\n\t0x7B2C, 0x91E6, 0x7B33, 0xE297, 0x7B35, 0xE29B, 0x7B36, 0xE29D,\t0x7B39, 0x8DF9, 0x7B45, 0xE2A4, 0x7B46, 0x954D, 0x7B48, 0x94A4,\n\t0x7B49, 0x9399, 0x7B4B, 0x8BD8, 0x7B4C, 0xE2A3, 0x7B4D, 0xE2A1,\t0x7B4F, 0x94B3, 0x7B50, 0xE29E, 0x7B51, 0x927D, 0x7B52, 0x939B,\n\t0x7B54, 0x939A, 0x7B56, 0x8DF4, 0x7B5D, 0xE2B6, 0x7B65, 0xE2A6,\t0x7B67, 0xE2A8, 0x7B6C, 0xE2AB, 0x7B6E, 0xE2AC, 0x7B70, 0xE2A9,\n\t0x7B71, 0xE2AA, 0x7B74, 0xE2A7, 0x7B75, 0xE2A5, 0x7B7A, 0xE29F,\t0x7B86, 0x95CD, 0x7B87, 0x89D3, 0x7B8B, 0xE2B3, 0x7B8D, 0xE2B0,\n\t0x7B8F, 0xE2B5, 0x7B92, 0xE2B4, 0x7B94, 0x9493, 0x7B95, 0x96A5,\t0x7B97, 0x8E5A, 0x7B98, 0xE2AE, 0x7B99, 0xE2B7, 0x7B9A, 0xE2B2,\n\t0x7B9C, 0xE2B1, 0x7B9D, 0xE2AD, 0x7B9E, 0xFB88, 0x7B9F, 0xE2AF,\t0x7BA1, 0x8AC7, 0x7BAA, 0x925C, 0x7BAD, 0x90FB, 0x7BB1, 0x94A0,\n\t0x7BB4, 0xE2BC, 0x7BB8, 0x94A2, 0x7BC0, 0x90DF, 0x7BC1, 0xE2B9,\t0x7BC4, 0x94CD, 0x7BC6, 0xE2BD, 0x7BC7, 0x95D1, 0x7BC9, 0x927A,\n\t0x7BCB, 0xE2B8, 0x7BCC, 0xE2BA, 0x7BCF, 0xE2BB, 0x7BDD, 0xE2BE,\t0x7BE0, 0x8EC2, 0x7BE4, 0x93C4, 0x7BE5, 0xE2C3, 0x7BE6, 0xE2C2,\n\t0x7BE9, 0xE2BF, 0x7BED, 0x9855, 0x7BF3, 0xE2C8, 0x7BF6, 0xE2CC,\t0x7BF7, 0xE2C9, 0x7C00, 0xE2C5, 0x7C07, 0xE2C6, 0x7C0D, 0xE2CB,\n\t0x7C11, 0xE2C0, 0x7C12, 0x99D3, 0x7C13, 0xE2C7, 0x7C14, 0xE2C1,\t0x7C17, 0xE2CA, 0x7C1F, 0xE2D0, 0x7C21, 0x8AC8, 0x7C23, 0xE2CD,\n\t0x7C27, 0xE2CE, 0x7C2A, 0xE2CF, 0x7C2B, 0xE2D2, 0x7C37, 0xE2D1,\t0x7C38, 0x94F4, 0x7C3D, 0xE2D3, 0x7C3E, 0x97FA, 0x7C3F, 0x95EB,\n\t0x7C40, 0xE2D8, 0x7C43, 0xE2D5, 0x7C4C, 0xE2D4, 0x7C4D, 0x90D0,\t0x7C4F, 0xE2D7, 0x7C50, 0xE2D9, 0x7C54, 0xE2D6, 0x7C56, 0xE2DD,\n\t0x7C58, 0xE2DA, 0x7C5F, 0xE2DB, 0x7C60, 0xE2C4, 0x7C64, 0xE2DC,\t0x7C65, 0xE2DE, 0x7C6C, 0xE2DF, 0x7C73, 0x95C4, 0x7C75, 0xE2E0,\n\t0x7C7E, 0x96E0, 0x7C81, 0x8BCC, 0x7C82, 0x8C48, 0x7C83, 0xE2E1,\t0x7C89, 0x95B2, 0x7C8B, 0x9088, 0x7C8D, 0x96AE, 0x7C90, 0xE2E2,\n\t0x7C92, 0x97B1, 0x7C95, 0x9494, 0x7C97, 0x9165, 0x7C98, 0x9453,\t0x7C9B, 0x8F6C, 0x7C9F, 0x88BE, 0x7CA1, 0xE2E7, 0x7CA2, 0xE2E5,\n\t0x7CA4, 0xE2E3, 0x7CA5, 0x8A9F, 0x7CA7, 0x8FCF, 0x7CA8, 0xE2E8,\t0x7CAB, 0xE2E6, 0x7CAD, 0xE2E4, 0x7CAE, 0xE2EC, 0x7CB1, 0xE2EB,\n\t0x7CB2, 0xE2EA, 0x7CB3, 0xE2E9, 0x7CB9, 0xE2ED, 0x7CBD, 0xE2EE,\t0x7CBE, 0x90B8, 0x7CC0, 0xE2EF, 0x7CC2, 0xE2F1, 0x7CC5, 0xE2F0,\n\t0x7CCA, 0x8CD0, 0x7CCE, 0x9157, 0x7CD2, 0xE2F3, 0x7CD6, 0x939C,\t0x7CD8, 0xE2F2, 0x7CDC, 0xE2F4, 0x7CDE, 0x95B3, 0x7CDF, 0x918C,\n\t0x7CE0, 0x8D66, 0x7CE2, 0xE2F5, 0x7CE7, 0x97C6, 0x7CEF, 0xE2F7,\t0x7CF2, 0xE2F8, 0x7CF4, 0xE2F9, 0x7CF6, 0xE2FA, 0x7CF8, 0x8E85,\n\t0x7CFA, 0xE2FB, 0x7CFB, 0x8C6E, 0x7CFE, 0x8B8A, 0x7D00, 0x8B49,\t0x7D02, 0xE340, 0x7D04, 0x96F1, 0x7D05, 0x8D67, 0x7D06, 0xE2FC,\n\t0x7D0A, 0xE343, 0x7D0B, 0x96E4, 0x7D0D, 0x945B, 0x7D10, 0x9552,\t0x7D14, 0x8F83, 0x7D15, 0xE342, 0x7D17, 0x8ED1, 0x7D18, 0x8D68,\n\t0x7D19, 0x8E86, 0x7D1A, 0x8B89, 0x7D1B, 0x95B4, 0x7D1C, 0xE341,\t0x7D20, 0x9166, 0x7D21, 0x9661, 0x7D22, 0x8DF5, 0x7D2B, 0x8E87,\n\t0x7D2C, 0x92DB, 0x7D2E, 0xE346, 0x7D2F, 0x97DD, 0x7D30, 0x8DD7,\t0x7D32, 0xE347, 0x7D33, 0x9061, 0x7D35, 0xE349, 0x7D39, 0x8FD0,\n\t0x7D3A, 0x8DAE, 0x7D3F, 0xE348, 0x7D42, 0x8F49, 0x7D43, 0x8CBC,\t0x7D44, 0x9167, 0x7D45, 0xE344, 0x7D46, 0xE34A, 0x7D48, 0xFB8A,\n\t0x7D4B, 0xE345, 0x7D4C, 0x8C6F, 0x7D4E, 0xE34D, 0x7D4F, 0xE351,\t0x7D50, 0x8C8B, 0x7D56, 0xE34C, 0x7D5B, 0xE355, 0x7D5C, 0xFB8B,\n\t0x7D5E, 0x8D69, 0x7D61, 0x978D, 0x7D62, 0x88BA, 0x7D63, 0xE352,\t0x7D66, 0x8B8B, 0x7D68, 0xE34F, 0x7D6E, 0xE350, 0x7D71, 0x939D,\n\t0x7D72, 0xE34E, 0x7D73, 0xE34B, 0x7D75, 0x8A47, 0x7D76, 0x90E2,\t0x7D79, 0x8CA6, 0x7D7D, 0xE357, 0x7D89, 0xE354, 0x7D8F, 0xE356,\n\t0x7D93, 0xE353, 0x7D99, 0x8C70, 0x7D9A, 0x91B1, 0x7D9B, 0xE358,\t0x7D9C, 0x918E, 0x7D9F, 0xE365, 0x7DA0, 0xFB8D, 0x7DA2, 0xE361,\n\t0x7DA3, 0xE35B, 0x7DAB, 0xE35F, 0x7DAC, 0x8EF8, 0x7DAD, 0x88DB,\t0x7DAE, 0xE35A, 0x7DAF, 0xE362, 0x7DB0, 0xE366, 0x7DB1, 0x8D6A,\n\t0x7DB2, 0x96D4, 0x7DB4, 0x92D4, 0x7DB5, 0xE35C, 0x7DB7, 0xFB8C,\t0x7DB8, 0xE364, 0x7DBA, 0xE359, 0x7DBB, 0x925D, 0x7DBD, 0xE35E,\n\t0x7DBE, 0x88BB, 0x7DBF, 0x96C8, 0x7DC7, 0xE35D, 0x7DCA, 0x8BD9,\t0x7DCB, 0x94EA, 0x7DCF, 0x918D, 0x7DD1, 0x97CE, 0x7DD2, 0x8F8F,\n\t0x7DD5, 0xE38E, 0x7DD6, 0xFB8E, 0x7DD8, 0xE367, 0x7DDA, 0x90FC,\t0x7DDC, 0xE363, 0x7DDD, 0xE368, 0x7DDE, 0xE36A, 0x7DE0, 0x92F7,\n\t0x7DE1, 0xE36D, 0x7DE4, 0xE369, 0x7DE8, 0x95D2, 0x7DE9, 0x8AC9,\t0x7DEC, 0x96C9, 0x7DEF, 0x88DC, 0x7DF2, 0xE36C, 0x7DF4, 0x97FB,\n\t0x7DFB, 0xE36B, 0x7E01, 0x898F, 0x7E04, 0x93EA, 0x7E05, 0xE36E,\t0x7E09, 0xE375, 0x7E0A, 0xE36F, 0x7E0B, 0xE376, 0x7E12, 0xE372,\n\t0x7E1B, 0x949B, 0x7E1E, 0x8EC8, 0x7E1F, 0xE374, 0x7E21, 0xE371,\t0x7E22, 0xE377, 0x7E23, 0xE370, 0x7E26, 0x8F63, 0x7E2B, 0x9644,\n\t0x7E2E, 0x8F6B, 0x7E31, 0xE373, 0x7E32, 0xE380, 0x7E35, 0xE37B,\t0x7E37, 0xE37E, 0x7E39, 0xE37C, 0x7E3A, 0xE381, 0x7E3B, 0xE37A,\n\t0x7E3D, 0xE360, 0x7E3E, 0x90D1, 0x7E41, 0x94C9, 0x7E43, 0xE37D,\t0x7E46, 0xE378, 0x7E4A, 0x9140, 0x7E4B, 0x8C71, 0x7E4D, 0x8F4A,\n\t0x7E52, 0xFB8F, 0x7E54, 0x9044, 0x7E55, 0x9155, 0x7E56, 0xE384,\t0x7E59, 0xE386, 0x7E5A, 0xE387, 0x7E5D, 0xE383, 0x7E5E, 0xE385,\n\t0x7E66, 0xE379, 0x7E67, 0xE382, 0x7E69, 0xE38A, 0x7E6A, 0xE389,\t0x7E6D, 0x969A, 0x7E70, 0x8C4A, 0x7E79, 0xE388, 0x7E7B, 0xE38C,\n\t0x7E7C, 0xE38B, 0x7E7D, 0xE38F, 0x7E7F, 0xE391, 0x7E82, 0x8E5B,\t0x7E83, 0xE38D, 0x7E88, 0xE392, 0x7E89, 0xE393, 0x7E8A, 0xFA5C,\n\t0x7E8C, 0xE394, 0x7E8E, 0xE39A, 0x7E8F, 0x935A, 0x7E90, 0xE396,\t0x7E92, 0xE395, 0x7E93, 0xE397, 0x7E94, 0xE398, 0x7E96, 0xE399,\n\t0x7E9B, 0xE39B, 0x7E9C, 0xE39C, 0x7F36, 0x8ACA, 0x7F38, 0xE39D,\t0x7F3A, 0xE39E, 0x7F45, 0xE39F, 0x7F47, 0xFB90, 0x7F4C, 0xE3A0,\n\t0x7F4D, 0xE3A1, 0x7F4E, 0xE3A2, 0x7F50, 0xE3A3, 0x7F51, 0xE3A4,\t0x7F54, 0xE3A6, 0x7F55, 0xE3A5, 0x7F58, 0xE3A7, 0x7F5F, 0xE3A8,\n\t0x7F60, 0xE3A9, 0x7F67, 0xE3AC, 0x7F68, 0xE3AA, 0x7F69, 0xE3AB,\t0x7F6A, 0x8DDF, 0x7F6B, 0x8C72, 0x7F6E, 0x9275, 0x7F70, 0x94B1,\n\t0x7F72, 0x8F90, 0x7F75, 0x946C, 0x7F77, 0x94EB, 0x7F78, 0xE3AD,\t0x7F79, 0x9CEB, 0x7F82, 0xE3AE, 0x7F83, 0xE3B0, 0x7F85, 0x9785,\n\t0x7F86, 0xE3AF, 0x7F87, 0xE3B2, 0x7F88, 0xE3B1, 0x7F8A, 0x9772,\t0x7F8C, 0xE3B3, 0x7F8E, 0x94FC, 0x7F94, 0xE3B4, 0x7F9A, 0xE3B7,\n\t0x7F9D, 0xE3B6, 0x7F9E, 0xE3B5, 0x7FA1, 0xFB91, 0x7FA3, 0xE3B8,\t0x7FA4, 0x8C51, 0x7FA8, 0x9141, 0x7FA9, 0x8B60, 0x7FAE, 0xE3BC,\n\t0x7FAF, 0xE3B9, 0x7FB2, 0xE3BA, 0x7FB6, 0xE3BD, 0x7FB8, 0xE3BE,\t0x7FB9, 0xE3BB, 0x7FBD, 0x8948, 0x7FC1, 0x89A5, 0x7FC5, 0xE3C0,\n\t0x7FC6, 0xE3C1, 0x7FCA, 0xE3C2, 0x7FCC, 0x9782, 0x7FD2, 0x8F4B,\t0x7FD4, 0xE3C4, 0x7FD5, 0xE3C3, 0x7FE0, 0x9089, 0x7FE1, 0xE3C5,\n\t0x7FE6, 0xE3C6, 0x7FE9, 0xE3C7, 0x7FEB, 0x8AE3, 0x7FF0, 0x8ACB,\t0x7FF3, 0xE3C8, 0x7FF9, 0xE3C9, 0x7FFB, 0x967C, 0x7FFC, 0x9783,\n\t0x8000, 0x9773, 0x8001, 0x9856, 0x8003, 0x8D6C, 0x8004, 0xE3CC,\t0x8005, 0x8ED2, 0x8006, 0xE3CB, 0x800B, 0xE3CD, 0x800C, 0x8EA7,\n\t0x8010, 0x91CF, 0x8012, 0xE3CE, 0x8015, 0x8D6B, 0x8017, 0x96D5,\t0x8018, 0xE3CF, 0x8019, 0xE3D0, 0x801C, 0xE3D1, 0x8021, 0xE3D2,\n\t0x8028, 0xE3D3, 0x8033, 0x8EA8, 0x8036, 0x96EB, 0x803B, 0xE3D5,\t0x803D, 0x925E, 0x803F, 0xE3D4, 0x8046, 0xE3D7, 0x804A, 0xE3D6,\n\t0x8052, 0xE3D8, 0x8056, 0x90B9, 0x8058, 0xE3D9, 0x805A, 0xE3DA,\t0x805E, 0x95B7, 0x805F, 0xE3DB, 0x8061, 0x918F, 0x8062, 0xE3DC,\n\t0x8068, 0xE3DD, 0x806F, 0x97FC, 0x8070, 0xE3E0, 0x8072, 0xE3DF,\t0x8073, 0xE3DE, 0x8074, 0x92AE, 0x8076, 0xE3E1, 0x8077, 0x9045,\n\t0x8079, 0xE3E2, 0x807D, 0xE3E3, 0x807E, 0x9857, 0x807F, 0xE3E4,\t0x8084, 0xE3E5, 0x8085, 0xE3E7, 0x8086, 0xE3E6, 0x8087, 0x94A3,\n\t0x8089, 0x93F7, 0x808B, 0x985D, 0x808C, 0x94A7, 0x8093, 0xE3E9,\t0x8096, 0x8FD1, 0x8098, 0x9549, 0x809A, 0xE3EA, 0x809B, 0xE3E8,\n\t0x809D, 0x8ACC, 0x80A1, 0x8CD2, 0x80A2, 0x8E88, 0x80A5, 0x94EC,\t0x80A9, 0x8CA8, 0x80AA, 0x9662, 0x80AC, 0xE3ED, 0x80AD, 0xE3EB,\n\t0x80AF, 0x8D6D, 0x80B1, 0x8D6E, 0x80B2, 0x88E7, 0x80B4, 0x8DE6,\t0x80BA, 0x9478, 0x80C3, 0x88DD, 0x80C4, 0xE3F2, 0x80C6, 0x925F,\n\t0x80CC, 0x9477, 0x80CE, 0x91D9, 0x80D6, 0xE3F4, 0x80D9, 0xE3F0,\t0x80DA, 0xE3F3, 0x80DB, 0xE3EE, 0x80DD, 0xE3F1, 0x80DE, 0x9645,\n\t0x80E1, 0x8CD3, 0x80E4, 0x88FB, 0x80E5, 0xE3EF, 0x80EF, 0xE3F6,\t0x80F1, 0xE3F7, 0x80F4, 0x93B7, 0x80F8, 0x8BB9, 0x80FC, 0xE445,\n\t0x80FD, 0x945C, 0x8102, 0x8E89, 0x8105, 0x8BBA, 0x8106, 0x90C6,\t0x8107, 0x9865, 0x8108, 0x96AC, 0x8109, 0xE3F5, 0x810A, 0x90D2,\n\t0x811A, 0x8B72, 0x811B, 0xE3F8, 0x8123, 0xE3FA, 0x8129, 0xE3F9,\t0x812F, 0xE3FB, 0x8131, 0x9245, 0x8133, 0x945D, 0x8139, 0x92AF,\n\t0x813E, 0xE442, 0x8146, 0xE441, 0x814B, 0xE3FC, 0x814E, 0x9074,\t0x8150, 0x9585, 0x8151, 0xE444, 0x8153, 0xE443, 0x8154, 0x8D6F,\n\t0x8155, 0x9872, 0x815F, 0xE454, 0x8165, 0xE448, 0x8166, 0xE449,\t0x816B, 0x8EEE, 0x816E, 0xE447, 0x8170, 0x8D98, 0x8171, 0xE446,\n\t0x8174, 0xE44A, 0x8178, 0x92B0, 0x8179, 0x95A0, 0x817A, 0x9142,\t0x817F, 0x91DA, 0x8180, 0xE44E, 0x8182, 0xE44F, 0x8183, 0xE44B,\n\t0x8188, 0xE44C, 0x818A, 0xE44D, 0x818F, 0x8D70, 0x8193, 0xE455,\t0x8195, 0xE451, 0x819A, 0x9586, 0x819C, 0x968C, 0x819D, 0x9547,\n\t0x81A0, 0xE450, 0x81A3, 0xE453, 0x81A4, 0xE452, 0x81A8, 0x9663,\t0x81A9, 0xE456, 0x81B0, 0xE457, 0x81B3, 0x9156, 0x81B5, 0xE458,\n\t0x81B8, 0xE45A, 0x81BA, 0xE45E, 0x81BD, 0xE45B, 0x81BE, 0xE459,\t0x81BF, 0x945E, 0x81C0, 0xE45C, 0x81C2, 0xE45D, 0x81C6, 0x89B0,\n\t0x81C8, 0xE464, 0x81C9, 0xE45F, 0x81CD, 0xE460, 0x81D1, 0xE461,\t0x81D3, 0x919F, 0x81D8, 0xE463, 0x81D9, 0xE462, 0x81DA, 0xE465,\n\t0x81DF, 0xE466, 0x81E0, 0xE467, 0x81E3, 0x9062, 0x81E5, 0x89E7,\t0x81E7, 0xE468, 0x81E8, 0x97D5, 0x81EA, 0x8EA9, 0x81ED, 0x8F4C,\n\t0x81F3, 0x8E8A, 0x81F4, 0x9276, 0x81FA, 0xE469, 0x81FB, 0xE46A,\t0x81FC, 0x8950, 0x81FE, 0xE46B, 0x8201, 0xE46C, 0x8202, 0xE46D,\n\t0x8205, 0xE46E, 0x8207, 0xE46F, 0x8208, 0x8BBB, 0x8209, 0x9DA8,\t0x820A, 0xE470, 0x820C, 0x90E3, 0x820D, 0xE471, 0x820E, 0x8EC9,\n\t0x8210, 0xE472, 0x8212, 0x98AE, 0x8216, 0xE473, 0x8217, 0x95DC,\t0x8218, 0x8ADA, 0x821B, 0x9143, 0x821C, 0x8F77, 0x821E, 0x9591,\n\t0x821F, 0x8F4D, 0x8229, 0xE474, 0x822A, 0x8D71, 0x822B, 0xE475,\t0x822C, 0x94CA, 0x822E, 0xE484, 0x8233, 0xE477, 0x8235, 0x91C7,\n\t0x8236, 0x9495, 0x8237, 0x8CBD, 0x8238, 0xE476, 0x8239, 0x9144,\t0x8240, 0xE478, 0x8247, 0x92F8, 0x8258, 0xE47A, 0x8259, 0xE479,\n\t0x825A, 0xE47C, 0x825D, 0xE47B, 0x825F, 0xE47D, 0x8262, 0xE480,\t0x8264, 0xE47E, 0x8266, 0x8ACD, 0x8268, 0xE481, 0x826A, 0xE482,\n\t0x826B, 0xE483, 0x826E, 0x8DAF, 0x826F, 0x97C7, 0x8271, 0xE485,\t0x8272, 0x9046, 0x8276, 0x8990, 0x8277, 0xE486, 0x8278, 0xE487,\n\t0x827E, 0xE488, 0x828B, 0x88F0, 0x828D, 0xE489, 0x8292, 0xE48A,\t0x8299, 0x9587, 0x829D, 0x8EC5, 0x829F, 0xE48C, 0x82A5, 0x8A48,\n\t0x82A6, 0x88B0, 0x82AB, 0xE48B, 0x82AC, 0xE48E, 0x82AD, 0x946D,\t0x82AF, 0x9063, 0x82B1, 0x89D4, 0x82B3, 0x9646, 0x82B8, 0x8C7C,\n\t0x82B9, 0x8BDA, 0x82BB, 0xE48D, 0x82BD, 0x89E8, 0x82C5, 0x8AA1,\t0x82D1, 0x8991, 0x82D2, 0xE492, 0x82D3, 0x97E8, 0x82D4, 0x91DB,\n\t0x82D7, 0x9563, 0x82D9, 0xE49E, 0x82DB, 0x89D5, 0x82DC, 0xE49C,\t0x82DE, 0xE49A, 0x82DF, 0xE491, 0x82E1, 0xE48F, 0x82E3, 0xE490,\n\t0x82E5, 0x8EE1, 0x82E6, 0x8BEA, 0x82E7, 0x9297, 0x82EB, 0x93CF,\t0x82F1, 0x8970, 0x82F3, 0xE494, 0x82F4, 0xE493, 0x82F9, 0xE499,\n\t0x82FA, 0xE495, 0x82FB, 0xE498, 0x8301, 0xFB93, 0x8302, 0x96CE,\t0x8303, 0xE497, 0x8304, 0x89D6, 0x8305, 0x8A9D, 0x8306, 0xE49B,\n\t0x8309, 0xE49D, 0x830E, 0x8C73, 0x8316, 0xE4A1, 0x8317, 0xE4AA,\t0x8318, 0xE4AB, 0x831C, 0x88A9, 0x8323, 0xE4B2, 0x8328, 0x88EF,\n\t0x832B, 0xE4A9, 0x832F, 0xE4A8, 0x8331, 0xE4A3, 0x8332, 0xE4A2,\t0x8334, 0xE4A0, 0x8335, 0xE49F, 0x8336, 0x9283, 0x8338, 0x91F9,\n\t0x8339, 0xE4A5, 0x8340, 0xE4A4, 0x8345, 0xE4A7, 0x8349, 0x9190,\t0x834A, 0x8C74, 0x834F, 0x8960, 0x8350, 0xE4A6, 0x8352, 0x8D72,\n\t0x8358, 0x9191, 0x8362, 0xFB94, 0x8373, 0xE4B8, 0x8375, 0xE4B9,\t0x8377, 0x89D7, 0x837B, 0x89AC, 0x837C, 0xE4B6, 0x837F, 0xFB95,\n\t0x8385, 0xE4AC, 0x8387, 0xE4B4, 0x8389, 0xE4BB, 0x838A, 0xE4B5,\t0x838E, 0xE4B3, 0x8393, 0xE496, 0x8396, 0xE4B1, 0x839A, 0xE4AD,\n\t0x839E, 0x8ACE, 0x839F, 0xE4AF, 0x83A0, 0xE4BA, 0x83A2, 0xE4B0,\t0x83A8, 0xE4BC, 0x83AA, 0xE4AE, 0x83AB, 0x949C, 0x83B1, 0x9789,\n\t0x83B5, 0xE4B7, 0x83BD, 0xE4CD, 0x83C1, 0xE4C5, 0x83C5, 0x909B,\t0x83C7, 0xFB96, 0x83CA, 0x8B65, 0x83CC, 0x8BDB, 0x83CE, 0xE4C0,\n\t0x83D3, 0x89D9, 0x83D6, 0x8FD2, 0x83D8, 0xE4C3, 0x83DC, 0x8DD8,\t0x83DF, 0x9370, 0x83E0, 0xE4C8, 0x83E9, 0x95EC, 0x83EB, 0xE4BF,\n\t0x83EF, 0x89D8, 0x83F0, 0x8CD4, 0x83F1, 0x9548, 0x83F2, 0xE4C9,\t0x83F4, 0xE4BD, 0x83F6, 0xFB97, 0x83F7, 0xE4C6, 0x83FB, 0xE4D0,\n\t0x83FD, 0xE4C1, 0x8403, 0xE4C2, 0x8404, 0x93B8, 0x8407, 0xE4C7,\t0x840B, 0xE4C4, 0x840C, 0x9647, 0x840D, 0xE4CA, 0x840E, 0x88DE,\n\t0x8413, 0xE4BE, 0x8420, 0xE4CC, 0x8422, 0xE4CB, 0x8429, 0x948B,\t0x842A, 0xE4D2, 0x842C, 0xE4DD, 0x8431, 0x8A9E, 0x8435, 0xE4E0,\n\t0x8438, 0xE4CE, 0x843C, 0xE4D3, 0x843D, 0x978E, 0x8446, 0xE4DC,\t0x8448, 0xFB98, 0x8449, 0x9774, 0x844E, 0x97A8, 0x8457, 0x9298,\n\t0x845B, 0x8A8B, 0x8461, 0x9592, 0x8462, 0xE4E2, 0x8463, 0x939F,\t0x8466, 0x88AF, 0x8469, 0xE4DB, 0x846B, 0xE4D7, 0x846C, 0x9192,\n\t0x846D, 0xE4D1, 0x846E, 0xE4D9, 0x846F, 0xE4DE, 0x8471, 0x944B,\t0x8475, 0x88A8, 0x8477, 0xE4D6, 0x8479, 0xE4DF, 0x847A, 0x9598,\n\t0x8482, 0xE4DA, 0x8484, 0xE4D5, 0x848B, 0x8FD3, 0x8490, 0x8F4E,\t0x8494, 0x8EAA, 0x8499, 0x96D6, 0x849C, 0x9566, 0x849F, 0xE4E5,\n\t0x84A1, 0xE4EE, 0x84AD, 0xE4D8, 0x84B2, 0x8A97, 0x84B4, 0xFB99,\t0x84B8, 0x8FF6, 0x84B9, 0xE4E3, 0x84BB, 0xE4E8, 0x84BC, 0x9193,\n\t0x84BF, 0xE4E4, 0x84C1, 0xE4EB, 0x84C4, 0x927E, 0x84C6, 0xE4EC,\t0x84C9, 0x9775, 0x84CA, 0xE4E1, 0x84CB, 0x8A57, 0x84CD, 0xE4E7,\n\t0x84D0, 0xE4EA, 0x84D1, 0x96AA, 0x84D6, 0xE4ED, 0x84D9, 0xE4E6,\t0x84DA, 0xE4E9, 0x84DC, 0xFA60, 0x84EC, 0x9648, 0x84EE, 0x9840,\n\t0x84F4, 0xE4F1, 0x84FC, 0xE4F8, 0x84FF, 0xE4F0, 0x8500, 0x8EC1,\t0x8506, 0xE4CF, 0x8511, 0x95CC, 0x8513, 0x96A0, 0x8514, 0xE4F7,\n\t0x8515, 0xE4F6, 0x8517, 0xE4F2, 0x8518, 0xE4F3, 0x851A, 0x8955,\t0x851F, 0xE4F5, 0x8521, 0xE4EF, 0x8526, 0x92D3, 0x852C, 0xE4F4,\n\t0x852D, 0x88FC, 0x8535, 0x91A0, 0x853D, 0x95C1, 0x8540, 0xE4F9,\t0x8541, 0xE540, 0x8543, 0x94D7, 0x8548, 0xE4FC, 0x8549, 0x8FD4,\n\t0x854A, 0x8EC7, 0x854B, 0xE542, 0x854E, 0x8BBC, 0x8553, 0xFB9A,\t0x8555, 0xE543, 0x8557, 0x9599, 0x8558, 0xE4FB, 0x8559, 0xFB9B,\n\t0x855A, 0xE4D4, 0x8563, 0xE4FA, 0x8568, 0x986E, 0x8569, 0x93A0,\t0x856A, 0x9593, 0x856B, 0xFB9C, 0x856D, 0xE54A, 0x8577, 0xE550,\n\t0x857E, 0xE551, 0x8580, 0xE544, 0x8584, 0x9496, 0x8587, 0xE54E,\t0x8588, 0xE546, 0x858A, 0xE548, 0x8590, 0xE552, 0x8591, 0xE547,\n\t0x8594, 0xE54B, 0x8597, 0x8992, 0x8599, 0x93E3, 0x859B, 0xE54C,\t0x859C, 0xE54F, 0x85A4, 0xE545, 0x85A6, 0x9145, 0x85A8, 0xE549,\n\t0x85A9, 0x8E46, 0x85AA, 0x9064, 0x85AB, 0x8C4F, 0x85AC, 0x96F2,\t0x85AE, 0x96F7, 0x85AF, 0x8F92, 0x85B0, 0xFB9E, 0x85B9, 0xE556,\n\t0x85BA, 0xE554, 0x85C1, 0x986D, 0x85C9, 0xE553, 0x85CD, 0x9795,\t0x85CF, 0xE555, 0x85D0, 0xE557, 0x85D5, 0xE558, 0x85DC, 0xE55B,\n\t0x85DD, 0xE559, 0x85E4, 0x93A1, 0x85E5, 0xE55A, 0x85E9, 0x94CB,\t0x85EA, 0xE54D, 0x85F7, 0x8F93, 0x85F9, 0xE55C, 0x85FA, 0xE561,\n\t0x85FB, 0x9194, 0x85FE, 0xE560, 0x8602, 0xE541, 0x8606, 0xE562,\t0x8607, 0x9168, 0x860A, 0xE55D, 0x860B, 0xE55F, 0x8613, 0xE55E,\n\t0x8616, 0x9F50, 0x8617, 0x9F41, 0x861A, 0xE564, 0x8622, 0xE563,\t0x862D, 0x9796, 0x862F, 0xE1BA, 0x8630, 0xE565, 0x863F, 0xE566,\n\t0x864D, 0xE567, 0x864E, 0x8CD5, 0x8650, 0x8B73, 0x8654, 0xE569,\t0x8655, 0x997C, 0x865A, 0x8B95, 0x865C, 0x97B8, 0x865E, 0x8BF1,\n\t0x865F, 0xE56A, 0x8667, 0xE56B, 0x866B, 0x928E, 0x8671, 0xE56C,\t0x8679, 0x93F8, 0x867B, 0x88B8, 0x868A, 0x89E1, 0x868B, 0xE571,\n\t0x868C, 0xE572, 0x8693, 0xE56D, 0x8695, 0x8E5C, 0x86A3, 0xE56E,\t0x86A4, 0x9461, 0x86A9, 0xE56F, 0x86AA, 0xE570, 0x86AB, 0xE57A,\n\t0x86AF, 0xE574, 0x86B0, 0xE577, 0x86B6, 0xE573, 0x86C4, 0xE575,\t0x86C6, 0xE576, 0x86C7, 0x8ED6, 0x86C9, 0xE578, 0x86CB, 0x9260,\n\t0x86CD, 0x8C75, 0x86CE, 0x8A61, 0x86D4, 0xE57B, 0x86D9, 0x8A5E,\t0x86DB, 0xE581, 0x86DE, 0xE57C, 0x86DF, 0xE580, 0x86E4, 0x94B8,\n\t0x86E9, 0xE57D, 0x86EC, 0xE57E, 0x86ED, 0x9567, 0x86EE, 0x94D8,\t0x86EF, 0xE582, 0x86F8, 0x91FB, 0x86F9, 0xE58C, 0x86FB, 0xE588,\n\t0x86FE, 0x89E9, 0x8700, 0xE586, 0x8702, 0x9649, 0x8703, 0xE587,\t0x8706, 0xE584, 0x8708, 0xE585, 0x8709, 0xE58A, 0x870A, 0xE58D,\n\t0x870D, 0xE58B, 0x8711, 0xE589, 0x8712, 0xE583, 0x8718, 0x9277,\t0x871A, 0xE594, 0x871C, 0x96A8, 0x8725, 0xE592, 0x8729, 0xE593,\n\t0x8734, 0xE58E, 0x8737, 0xE590, 0x873B, 0xE591, 0x873F, 0xE58F,\t0x8749, 0x90E4, 0x874B, 0x9858, 0x874C, 0xE598, 0x874E, 0xE599,\n\t0x8753, 0xE59F, 0x8755, 0x9049, 0x8757, 0xE59B, 0x8759, 0xE59E,\t0x875F, 0xE596, 0x8760, 0xE595, 0x8763, 0xE5A0, 0x8766, 0x89DA,\n\t0x8768, 0xE59C, 0x876A, 0xE5A1, 0x876E, 0xE59D, 0x8774, 0xE59A,\t0x8776, 0x92B1, 0x8778, 0xE597, 0x877F, 0x9488, 0x8782, 0xE5A5,\n\t0x878D, 0x975A, 0x879F, 0xE5A4, 0x87A2, 0xE5A3, 0x87AB, 0xE5AC,\t0x87AF, 0xE5A6, 0x87B3, 0xE5AE, 0x87BA, 0x9786, 0x87BB, 0xE5B1,\n\t0x87BD, 0xE5A8, 0x87C0, 0xE5A9, 0x87C4, 0xE5AD, 0x87C6, 0xE5B0,\t0x87C7, 0xE5AF, 0x87CB, 0xE5A7, 0x87D0, 0xE5AA, 0x87D2, 0xE5BB,\n\t0x87E0, 0xE5B4, 0x87EF, 0xE5B2, 0x87F2, 0xE5B3, 0x87F6, 0xE5B8,\t0x87F7, 0xE5B9, 0x87F9, 0x8A49, 0x87FB, 0x8B61, 0x87FE, 0xE5B7,\n\t0x8805, 0xE5A2, 0x8807, 0xFBA1, 0x880D, 0xE5B6, 0x880E, 0xE5BA,\t0x880F, 0xE5B5, 0x8811, 0xE5BC, 0x8815, 0xE5BE, 0x8816, 0xE5BD,\n\t0x8821, 0xE5C0, 0x8822, 0xE5BF, 0x8823, 0xE579, 0x8827, 0xE5C4,\t0x8831, 0xE5C1, 0x8836, 0xE5C2, 0x8839, 0xE5C3, 0x883B, 0xE5C5,\n\t0x8840, 0x8C8C, 0x8842, 0xE5C7, 0x8844, 0xE5C6, 0x8846, 0x8F4F,\t0x884C, 0x8D73, 0x884D, 0x9FA5, 0x8852, 0xE5C8, 0x8853, 0x8F70,\n\t0x8857, 0x8A58, 0x8859, 0xE5C9, 0x885B, 0x8971, 0x885D, 0x8FD5,\t0x885E, 0xE5CA, 0x8861, 0x8D74, 0x8862, 0xE5CB, 0x8863, 0x88DF,\n\t0x8868, 0x955C, 0x886B, 0xE5CC, 0x8870, 0x908A, 0x8872, 0xE5D3,\t0x8875, 0xE5D0, 0x8877, 0x928F, 0x887D, 0xE5D1, 0x887E, 0xE5CE,\n\t0x887F, 0x8BDC, 0x8881, 0xE5CD, 0x8882, 0xE5D4, 0x8888, 0x8C55,\t0x888B, 0x91DC, 0x888D, 0xE5DA, 0x8892, 0xE5D6, 0x8896, 0x91B3,\n\t0x8897, 0xE5D5, 0x8899, 0xE5D8, 0x889E, 0xE5CF, 0x88A2, 0xE5D9,\t0x88A4, 0xE5DB, 0x88AB, 0x94ED, 0x88AE, 0xE5D7, 0x88B0, 0xE5DC,\n\t0x88B1, 0xE5DE, 0x88B4, 0x8CD1, 0x88B5, 0xE5D2, 0x88B7, 0x88BF,\t0x88BF, 0xE5DD, 0x88C1, 0x8DD9, 0x88C2, 0x97F4, 0x88C3, 0xE5DF,\n\t0x88C4, 0xE5E0, 0x88C5, 0x9195, 0x88CF, 0x97A0, 0x88D4, 0xE5E1,\t0x88D5, 0x9754, 0x88D8, 0xE5E2, 0x88D9, 0xE5E3, 0x88DC, 0x95E2,\n\t0x88DD, 0xE5E4, 0x88DF, 0x8DBE, 0x88E1, 0x97A1, 0x88E8, 0xE5E9,\t0x88F2, 0xE5EA, 0x88F3, 0x8FD6, 0x88F4, 0xE5E8, 0x88F5, 0xFBA2,\n\t0x88F8, 0x9787, 0x88F9, 0xE5E5, 0x88FC, 0xE5E7, 0x88FD, 0x90BB,\t0x88FE, 0x909E, 0x8902, 0xE5E6, 0x8904, 0xE5EB, 0x8907, 0x95A1,\n\t0x890A, 0xE5ED, 0x890C, 0xE5EC, 0x8910, 0x8A8C, 0x8912, 0x964A,\t0x8913, 0xE5EE, 0x891C, 0xFA5D, 0x891D, 0xE5FA, 0x891E, 0xE5F0,\n\t0x8925, 0xE5F1, 0x892A, 0xE5F2, 0x892B, 0xE5F3, 0x8936, 0xE5F7,\t0x8938, 0xE5F8, 0x893B, 0xE5F6, 0x8941, 0xE5F4, 0x8943, 0xE5EF,\n\t0x8944, 0xE5F5, 0x894C, 0xE5F9, 0x894D, 0xE8B5, 0x8956, 0x89A6,\t0x895E, 0xE5FC, 0x895F, 0x8BDD, 0x8960, 0xE5FB, 0x8964, 0xE641,\n\t0x8966, 0xE640, 0x896A, 0xE643, 0x896D, 0xE642, 0x896F, 0xE644,\t0x8972, 0x8F50, 0x8974, 0xE645, 0x8977, 0xE646, 0x897E, 0xE647,\n\t0x897F, 0x90BC, 0x8981, 0x9776, 0x8983, 0xE648, 0x8986, 0x95A2,\t0x8987, 0x9465, 0x8988, 0xE649, 0x898A, 0xE64A, 0x898B, 0x8CA9,\n\t0x898F, 0x8B4B, 0x8993, 0xE64B, 0x8996, 0x8E8B, 0x8997, 0x9460,\t0x8998, 0xE64C, 0x899A, 0x8A6F, 0x89A1, 0xE64D, 0x89A6, 0xE64F,\n\t0x89A7, 0x9797, 0x89A9, 0xE64E, 0x89AA, 0x9065, 0x89AC, 0xE650,\t0x89AF, 0xE651, 0x89B2, 0xE652, 0x89B3, 0x8ACF, 0x89BA, 0xE653,\n\t0x89BD, 0xE654, 0x89BF, 0xE655, 0x89C0, 0xE656, 0x89D2, 0x8A70,\t0x89DA, 0xE657, 0x89DC, 0xE658, 0x89DD, 0xE659, 0x89E3, 0x89F0,\n\t0x89E6, 0x9047, 0x89E7, 0xE65A, 0x89F4, 0xE65B, 0x89F8, 0xE65C,\t0x8A00, 0x8CBE, 0x8A02, 0x92F9, 0x8A03, 0xE65D, 0x8A08, 0x8C76,\n\t0x8A0A, 0x9075, 0x8A0C, 0xE660, 0x8A0E, 0x93A2, 0x8A10, 0xE65F,\t0x8A12, 0xFBA3, 0x8A13, 0x8C50, 0x8A16, 0xE65E, 0x8A17, 0x91F5,\n\t0x8A18, 0x8B4C, 0x8A1B, 0xE661, 0x8A1D, 0xE662, 0x8A1F, 0x8FD7,\t0x8A23, 0x8C8D, 0x8A25, 0xE663, 0x8A2A, 0x964B, 0x8A2D, 0x90DD,\n\t0x8A31, 0x8B96, 0x8A33, 0x96F3, 0x8A34, 0x9169, 0x8A36, 0xE664,\t0x8A37, 0xFBA4, 0x8A3A, 0x9066, 0x8A3B, 0x9290, 0x8A3C, 0x8FD8,\n\t0x8A41, 0xE665, 0x8A46, 0xE668, 0x8A48, 0xE669, 0x8A50, 0x8DBC,\t0x8A51, 0x91C0, 0x8A52, 0xE667, 0x8A54, 0x8FD9, 0x8A55, 0x955D,\n\t0x8A5B, 0xE666, 0x8A5E, 0x8E8C, 0x8A60, 0x8972, 0x8A62, 0xE66D,\t0x8A63, 0x8C77, 0x8A66, 0x8E8E, 0x8A69, 0x8E8D, 0x8A6B, 0x986C,\n\t0x8A6C, 0xE66C, 0x8A6D, 0xE66B, 0x8A6E, 0x9146, 0x8A70, 0x8B6C,\t0x8A71, 0x9862, 0x8A72, 0x8A59, 0x8A73, 0x8FDA, 0x8A79, 0xFBA5,\n\t0x8A7C, 0xE66A, 0x8A82, 0xE66F, 0x8A84, 0xE670, 0x8A85, 0xE66E,\t0x8A87, 0x8CD6, 0x8A89, 0x975F, 0x8A8C, 0x8E8F, 0x8A8D, 0x9446,\n\t0x8A91, 0xE673, 0x8A93, 0x90BE, 0x8A95, 0x9261, 0x8A98, 0x9755,\t0x8A9A, 0xE676, 0x8A9E, 0x8CEA, 0x8AA0, 0x90BD, 0x8AA1, 0xE672,\n\t0x8AA3, 0xE677, 0x8AA4, 0x8CEB, 0x8AA5, 0xE674, 0x8AA6, 0xE675,\t0x8AA7, 0xFBA6, 0x8AA8, 0xE671, 0x8AAC, 0x90E0, 0x8AAD, 0x93C7,\n\t0x8AB0, 0x924E, 0x8AB2, 0x89DB, 0x8AB9, 0x94EE, 0x8ABC, 0x8B62,\t0x8ABE, 0xFBA7, 0x8ABF, 0x92B2, 0x8AC2, 0xE67A, 0x8AC4, 0xE678,\n\t0x8AC7, 0x926B, 0x8ACB, 0x90BF, 0x8ACC, 0x8AD0, 0x8ACD, 0xE679,\t0x8ACF, 0x907A, 0x8AD2, 0x97C8, 0x8AD6, 0x985F, 0x8ADA, 0xE67B,\n\t0x8ADB, 0xE687, 0x8ADC, 0x92B3, 0x8ADE, 0xE686, 0x8ADF, 0xFBA8,\t0x8AE0, 0xE683, 0x8AE1, 0xE68B, 0x8AE2, 0xE684, 0x8AE4, 0xE680,\n\t0x8AE6, 0x92FA, 0x8AE7, 0xE67E, 0x8AEB, 0xE67C, 0x8AED, 0x9740,\t0x8AEE, 0x8E90, 0x8AF1, 0xE681, 0x8AF3, 0xE67D, 0x8AF6, 0xFBAA,\n\t0x8AF7, 0xE685, 0x8AF8, 0x8F94, 0x8AFA, 0x8CBF, 0x8AFE, 0x91F8,\t0x8B00, 0x9664, 0x8B01, 0x8979, 0x8B02, 0x88E0, 0x8B04, 0x93A3,\n\t0x8B07, 0xE689, 0x8B0C, 0xE688, 0x8B0E, 0x93E4, 0x8B10, 0xE68D,\t0x8B14, 0xE682, 0x8B16, 0xE68C, 0x8B17, 0xE68E, 0x8B19, 0x8CAA,\n\t0x8B1A, 0xE68A, 0x8B1B, 0x8D75, 0x8B1D, 0x8ED3, 0x8B20, 0xE68F,\t0x8B21, 0x9777, 0x8B26, 0xE692, 0x8B28, 0xE695, 0x8B2B, 0xE693,\n\t0x8B2C, 0x9554, 0x8B33, 0xE690, 0x8B39, 0x8BDE, 0x8B3E, 0xE694,\t0x8B41, 0xE696, 0x8B49, 0xE69A, 0x8B4C, 0xE697, 0x8B4E, 0xE699,\n\t0x8B4F, 0xE698, 0x8B53, 0xFBAB, 0x8B56, 0xE69B, 0x8B58, 0x8EAF,\t0x8B5A, 0xE69D, 0x8B5B, 0xE69C, 0x8B5C, 0x9588, 0x8B5F, 0xE69F,\n\t0x8B66, 0x8C78, 0x8B6B, 0xE69E, 0x8B6C, 0xE6A0, 0x8B6F, 0xE6A1,\t0x8B70, 0x8B63, 0x8B71, 0xE3BF, 0x8B72, 0x8FF7, 0x8B74, 0xE6A2,\n\t0x8B77, 0x8CEC, 0x8B7D, 0xE6A3, 0x8B7F, 0xFBAC, 0x8B80, 0xE6A4,\t0x8B83, 0x8E5D, 0x8B8A, 0x9DCC, 0x8B8C, 0xE6A5, 0x8B8E, 0xE6A6,\n\t0x8B90, 0x8F51, 0x8B92, 0xE6A7, 0x8B93, 0xE6A8, 0x8B96, 0xE6A9,\t0x8B99, 0xE6AA, 0x8B9A, 0xE6AB, 0x8C37, 0x924A, 0x8C3A, 0xE6AC,\n\t0x8C3F, 0xE6AE, 0x8C41, 0xE6AD, 0x8C46, 0x93A4, 0x8C48, 0xE6AF,\t0x8C4A, 0x964C, 0x8C4C, 0xE6B0, 0x8C4E, 0xE6B1, 0x8C50, 0xE6B2,\n\t0x8C55, 0xE6B3, 0x8C5A, 0x93D8, 0x8C61, 0x8FDB, 0x8C62, 0xE6B4,\t0x8C6A, 0x8D8B, 0x8C6B, 0x98AC, 0x8C6C, 0xE6B5, 0x8C78, 0xE6B6,\n\t0x8C79, 0x955E, 0x8C7A, 0xE6B7, 0x8C7C, 0xE6BF, 0x8C82, 0xE6B8,\t0x8C85, 0xE6BA, 0x8C89, 0xE6B9, 0x8C8A, 0xE6BB, 0x8C8C, 0x9665,\n\t0x8C8D, 0xE6BC, 0x8C8E, 0xE6BD, 0x8C94, 0xE6BE, 0x8C98, 0xE6C0,\t0x8C9D, 0x8A4C, 0x8C9E, 0x92E5, 0x8CA0, 0x9589, 0x8CA1, 0x8DE0,\n\t0x8CA2, 0x8D76, 0x8CA7, 0x956E, 0x8CA8, 0x89DD, 0x8CA9, 0x94CC,\t0x8CAA, 0xE6C3, 0x8CAB, 0x8AD1, 0x8CAC, 0x90D3, 0x8CAD, 0xE6C2,\n\t0x8CAE, 0xE6C7, 0x8CAF, 0x9299, 0x8CB0, 0x96E1, 0x8CB2, 0xE6C5,\t0x8CB3, 0xE6C6, 0x8CB4, 0x8B4D, 0x8CB6, 0xE6C8, 0x8CB7, 0x9483,\n\t0x8CB8, 0x91DD, 0x8CBB, 0x94EF, 0x8CBC, 0x935C, 0x8CBD, 0xE6C4,\t0x8CBF, 0x9666, 0x8CC0, 0x89EA, 0x8CC1, 0xE6CA, 0x8CC2, 0x9847,\n\t0x8CC3, 0x92C0, 0x8CC4, 0x9864, 0x8CC7, 0x8E91, 0x8CC8, 0xE6C9,\t0x8CCA, 0x91AF, 0x8CCD, 0xE6DA, 0x8CCE, 0x9147, 0x8CD1, 0x93F6,\n\t0x8CD3, 0x956F, 0x8CDA, 0xE6CD, 0x8CDB, 0x8E5E, 0x8CDC, 0x8E92,\t0x8CDE, 0x8FDC, 0x8CE0, 0x9485, 0x8CE2, 0x8CAB, 0x8CE3, 0xE6CC,\n\t0x8CE4, 0xE6CB, 0x8CE6, 0x958A, 0x8CEA, 0x8EBF, 0x8CED, 0x9371,\t0x8CF0, 0xFBAD, 0x8CF4, 0xFBAE, 0x8CFA, 0xE6CF, 0x8CFB, 0xE6D0,\n\t0x8CFC, 0x8D77, 0x8CFD, 0xE6CE, 0x8D04, 0xE6D1, 0x8D05, 0xE6D2,\t0x8D07, 0xE6D4, 0x8D08, 0x91A1, 0x8D0A, 0xE6D3, 0x8D0B, 0x8AE4,\n\t0x8D0D, 0xE6D6, 0x8D0F, 0xE6D5, 0x8D10, 0xE6D7, 0x8D12, 0xFBAF,\t0x8D13, 0xE6D9, 0x8D14, 0xE6DB, 0x8D16, 0xE6DC, 0x8D64, 0x90D4,\n\t0x8D66, 0x8ECD, 0x8D67, 0xE6DD, 0x8D6B, 0x8A71, 0x8D6D, 0xE6DE,\t0x8D70, 0x9196, 0x8D71, 0xE6DF, 0x8D73, 0xE6E0, 0x8D74, 0x958B,\n\t0x8D76, 0xFBB0, 0x8D77, 0x8B4E, 0x8D81, 0xE6E1, 0x8D85, 0x92B4,\t0x8D8A, 0x897A, 0x8D99, 0xE6E2, 0x8DA3, 0x8EEF, 0x8DA8, 0x9096,\n\t0x8DB3, 0x91AB, 0x8DBA, 0xE6E5, 0x8DBE, 0xE6E4, 0x8DC2, 0xE6E3,\t0x8DCB, 0xE6EB, 0x8DCC, 0xE6E9, 0x8DCF, 0xE6E6, 0x8DD6, 0xE6E8,\n\t0x8DDA, 0xE6E7, 0x8DDB, 0xE6EA, 0x8DDD, 0x8B97, 0x8DDF, 0xE6EE,\t0x8DE1, 0x90D5, 0x8DE3, 0xE6EF, 0x8DE8, 0x8CD7, 0x8DEA, 0xE6EC,\n\t0x8DEB, 0xE6ED, 0x8DEF, 0x9848, 0x8DF3, 0x92B5, 0x8DF5, 0x9148,\t0x8DFC, 0xE6F0, 0x8DFF, 0xE6F3, 0x8E08, 0xE6F1, 0x8E09, 0xE6F2,\n\t0x8E0A, 0x9778, 0x8E0F, 0x93A5, 0x8E10, 0xE6F6, 0x8E1D, 0xE6F4,\t0x8E1E, 0xE6F5, 0x8E1F, 0xE6F7, 0x8E2A, 0xE748, 0x8E30, 0xE6FA,\n\t0x8E34, 0xE6FB, 0x8E35, 0xE6F9, 0x8E42, 0xE6F8, 0x8E44, 0x92FB,\t0x8E47, 0xE740, 0x8E48, 0xE744, 0x8E49, 0xE741, 0x8E4A, 0xE6FC,\n\t0x8E4C, 0xE742, 0x8E50, 0xE743, 0x8E55, 0xE74A, 0x8E59, 0xE745,\t0x8E5F, 0x90D6, 0x8E60, 0xE747, 0x8E63, 0xE749, 0x8E64, 0xE746,\n\t0x8E72, 0xE74C, 0x8E74, 0x8F52, 0x8E76, 0xE74B, 0x8E7C, 0xE74D,\t0x8E81, 0xE74E, 0x8E84, 0xE751, 0x8E85, 0xE750, 0x8E87, 0xE74F,\n\t0x8E8A, 0xE753, 0x8E8B, 0xE752, 0x8E8D, 0x96F4, 0x8E91, 0xE755,\t0x8E93, 0xE754, 0x8E94, 0xE756, 0x8E99, 0xE757, 0x8EA1, 0xE759,\n\t0x8EAA, 0xE758, 0x8EAB, 0x9067, 0x8EAC, 0xE75A, 0x8EAF, 0x8BEB,\t0x8EB0, 0xE75B, 0x8EB1, 0xE75D, 0x8EBE, 0xE75E, 0x8EC5, 0xE75F,\n\t0x8EC6, 0xE75C, 0x8EC8, 0xE760, 0x8ECA, 0x8ED4, 0x8ECB, 0xE761,\t0x8ECC, 0x8B4F, 0x8ECD, 0x8C52, 0x8ECF, 0xFBB2, 0x8ED2, 0x8CAC,\n\t0x8EDB, 0xE762, 0x8EDF, 0x93EE, 0x8EE2, 0x935D, 0x8EE3, 0xE763,\t0x8EEB, 0xE766, 0x8EF8, 0x8EB2, 0x8EFB, 0xE765, 0x8EFC, 0xE764,\n\t0x8EFD, 0x8C79, 0x8EFE, 0xE767, 0x8F03, 0x8A72, 0x8F05, 0xE769,\t0x8F09, 0x8DDA, 0x8F0A, 0xE768, 0x8F0C, 0xE771, 0x8F12, 0xE76B,\n\t0x8F13, 0xE76D, 0x8F14, 0x95E3, 0x8F15, 0xE76A, 0x8F19, 0xE76C,\t0x8F1B, 0xE770, 0x8F1C, 0xE76E, 0x8F1D, 0x8B50, 0x8F1F, 0xE76F,\n\t0x8F26, 0xE772, 0x8F29, 0x9479, 0x8F2A, 0x97D6, 0x8F2F, 0x8F53,\t0x8F33, 0xE773, 0x8F38, 0x9741, 0x8F39, 0xE775, 0x8F3B, 0xE774,\n\t0x8F3E, 0xE778, 0x8F3F, 0x9760, 0x8F42, 0xE777, 0x8F44, 0x8A8D,\t0x8F45, 0xE776, 0x8F46, 0xE77B, 0x8F49, 0xE77A, 0x8F4C, 0xE779,\n\t0x8F4D, 0x9351, 0x8F4E, 0xE77C, 0x8F57, 0xE77D, 0x8F5C, 0xE77E,\t0x8F5F, 0x8D8C, 0x8F61, 0x8C44, 0x8F62, 0xE780, 0x8F63, 0xE781,\n\t0x8F64, 0xE782, 0x8F9B, 0x9068, 0x8F9C, 0xE783, 0x8F9E, 0x8EAB,\t0x8F9F, 0xE784, 0x8FA3, 0xE785, 0x8FA7, 0x999F, 0x8FA8, 0x999E,\n\t0x8FAD, 0xE786, 0x8FAE, 0xE390, 0x8FAF, 0xE787, 0x8FB0, 0x9243,\t0x8FB1, 0x904A, 0x8FB2, 0x945F, 0x8FB7, 0xE788, 0x8FBA, 0x95D3,\n\t0x8FBB, 0x92D2, 0x8FBC, 0x8D9E, 0x8FBF, 0x9248, 0x8FC2, 0x8949,\t0x8FC4, 0x9698, 0x8FC5, 0x9076, 0x8FCE, 0x8C7D, 0x8FD1, 0x8BDF,\n\t0x8FD4, 0x95D4, 0x8FDA, 0xE789, 0x8FE2, 0xE78B, 0x8FE5, 0xE78A,\t0x8FE6, 0x89DE, 0x8FE9, 0x93F4, 0x8FEA, 0xE78C, 0x8FEB, 0x9497,\n\t0x8FED, 0x9352, 0x8FEF, 0xE78D, 0x8FF0, 0x8F71, 0x8FF4, 0xE78F,\t0x8FF7, 0x96C0, 0x8FF8, 0xE79E, 0x8FF9, 0xE791, 0x8FFA, 0xE792,\n\t0x8FFD, 0x92C7, 0x9000, 0x91DE, 0x9001, 0x9197, 0x9003, 0x93A6,\t0x9005, 0xE790, 0x9006, 0x8B74, 0x900B, 0xE799, 0x900D, 0xE796,\n\t0x900E, 0xE7A3, 0x900F, 0x93A7, 0x9010, 0x9280, 0x9011, 0xE793,\t0x9013, 0x92FC, 0x9014, 0x9372, 0x9015, 0xE794, 0x9016, 0xE798,\n\t0x9017, 0x9080, 0x9019, 0x9487, 0x901A, 0x92CA, 0x901D, 0x90C0,\t0x901E, 0xE797, 0x901F, 0x91AC, 0x9020, 0x91A2, 0x9021, 0xE795,\n\t0x9022, 0x88A7, 0x9023, 0x9841, 0x9027, 0xE79A, 0x902E, 0x91DF,\t0x9031, 0x8F54, 0x9032, 0x9069, 0x9035, 0xE79C, 0x9036, 0xE79B,\n\t0x9038, 0x88ED, 0x9039, 0xE79D, 0x903C, 0x954E, 0x903E, 0xE7A5,\t0x9041, 0x93D9, 0x9042, 0x908B, 0x9045, 0x9278, 0x9047, 0x8BF6,\n\t0x9049, 0xE7A4, 0x904A, 0x9756, 0x904B, 0x895E, 0x904D, 0x95D5,\t0x904E, 0x89DF, 0x904F, 0xE79F, 0x9050, 0xE7A0, 0x9051, 0xE7A1,\n\t0x9052, 0xE7A2, 0x9053, 0x93B9, 0x9054, 0x9242, 0x9055, 0x88E1,\t0x9056, 0xE7A6, 0x9058, 0xE7A7, 0x9059, 0xEAA1, 0x905C, 0x91BB,\n\t0x905E, 0xE7A8, 0x9060, 0x8993, 0x9061, 0x916B, 0x9063, 0x8CAD,\t0x9065, 0x9779, 0x9067, 0xFBB5, 0x9068, 0xE7A9, 0x9069, 0x934B,\n\t0x906D, 0x9198, 0x906E, 0x8ED5, 0x906F, 0xE7AA, 0x9072, 0xE7AD,\t0x9075, 0x8F85, 0x9076, 0xE7AB, 0x9077, 0x914A, 0x9078, 0x9149,\n\t0x907A, 0x88E2, 0x907C, 0x97C9, 0x907D, 0xE7AF, 0x907F, 0x94F0,\t0x9080, 0xE7B1, 0x9081, 0xE7B0, 0x9082, 0xE7AE, 0x9083, 0xE284,\n\t0x9084, 0x8AD2, 0x9087, 0xE78E, 0x9089, 0xE7B3, 0x908A, 0xE7B2,\t0x908F, 0xE7B4, 0x9091, 0x9757, 0x90A3, 0x93DF, 0x90A6, 0x964D,\n\t0x90A8, 0xE7B5, 0x90AA, 0x8ED7, 0x90AF, 0xE7B6, 0x90B1, 0xE7B7,\t0x90B5, 0xE7B8, 0x90B8, 0x9340, 0x90C1, 0x88E8, 0x90CA, 0x8D78,\n\t0x90CE, 0x9859, 0x90DB, 0xE7BC, 0x90DE, 0xFBB6, 0x90E1, 0x8C53,\t0x90E2, 0xE7B9, 0x90E4, 0xE7BA, 0x90E8, 0x9594, 0x90ED, 0x8A73,\n\t0x90F5, 0x9758, 0x90F7, 0x8BBD, 0x90FD, 0x9373, 0x9102, 0xE7BD,\t0x9112, 0xE7BE, 0x9115, 0xFBB8, 0x9119, 0xE7BF, 0x9127, 0xFBB9,\n\t0x912D, 0x9341, 0x9130, 0xE7C1, 0x9132, 0xE7C0, 0x9149, 0x93D1,\t0x914A, 0xE7C2, 0x914B, 0x8F55, 0x914C, 0x8EDE, 0x914D, 0x947A,\n\t0x914E, 0x9291, 0x9152, 0x8EF0, 0x9154, 0x908C, 0x9156, 0xE7C3,\t0x9158, 0xE7C4, 0x9162, 0x907C, 0x9163, 0xE7C5, 0x9165, 0xE7C6,\n\t0x9169, 0xE7C7, 0x916A, 0x978F, 0x916C, 0x8F56, 0x9172, 0xE7C9,\t0x9173, 0xE7C8, 0x9175, 0x8D79, 0x9177, 0x8D93, 0x9178, 0x8E5F,\n\t0x9182, 0xE7CC, 0x9187, 0x8F86, 0x9189, 0xE7CB, 0x918B, 0xE7CA,\t0x918D, 0x91E7, 0x9190, 0x8CED, 0x9192, 0x90C1, 0x9197, 0x94AE,\n\t0x919C, 0x8F58, 0x91A2, 0xE7CD, 0x91A4, 0x8FDD, 0x91AA, 0xE7D0,\t0x91AB, 0xE7CE, 0x91AF, 0xE7CF, 0x91B4, 0xE7D2, 0x91B5, 0xE7D1,\n\t0x91B8, 0x8FF8, 0x91BA, 0xE7D3, 0x91C0, 0xE7D4, 0x91C1, 0xE7D5,\t0x91C6, 0x94CE, 0x91C7, 0x8DD1, 0x91C8, 0x8EDF, 0x91C9, 0xE7D6,\n\t0x91CB, 0xE7D7, 0x91CC, 0x97A2, 0x91CD, 0x8F64, 0x91CE, 0x96EC,\t0x91CF, 0x97CA, 0x91D0, 0xE7D8, 0x91D1, 0x8BE0, 0x91D6, 0xE7D9,\n\t0x91D7, 0xFBBB, 0x91D8, 0x9342, 0x91DA, 0xFBBA, 0x91DB, 0xE7DC,\t0x91DC, 0x8A98, 0x91DD, 0x906A, 0x91DE, 0xFBBC, 0x91DF, 0xE7DA,\n\t0x91E1, 0xE7DB, 0x91E3, 0x92DE, 0x91E4, 0xFBBF, 0x91E5, 0xFBC0,\t0x91E6, 0x9674, 0x91E7, 0x8BFA, 0x91ED, 0xFBBD, 0x91EE, 0xFBBE,\n\t0x91F5, 0xE7DE, 0x91F6, 0xE7DF, 0x91FC, 0xE7DD, 0x91FF, 0xE7E1,\t0x9206, 0xFBC1, 0x920A, 0xFBC3, 0x920D, 0x93DD, 0x920E, 0x8A62,\n\t0x9210, 0xFBC2, 0x9211, 0xE7E5, 0x9214, 0xE7E2, 0x9215, 0xE7E4,\t0x921E, 0xE7E0, 0x9229, 0xE86E, 0x922C, 0xE7E3, 0x9234, 0x97E9,\n\t0x9237, 0x8CD8, 0x9239, 0xFBCA, 0x923A, 0xFBC4, 0x923C, 0xFBC6,\t0x923F, 0xE7ED, 0x9240, 0xFBC5, 0x9244, 0x9353, 0x9245, 0xE7E8,\n\t0x9248, 0xE7EB, 0x9249, 0xE7E9, 0x924B, 0xE7EE, 0x924E, 0xFBC7,\t0x9250, 0xE7EF, 0x9251, 0xFBC9, 0x9257, 0xE7E7, 0x9259, 0xFBC8,\n\t0x925A, 0xE7F4, 0x925B, 0x8994, 0x925E, 0xE7E6, 0x9262, 0x94AB,\t0x9264, 0xE7EA, 0x9266, 0x8FDE, 0x9267, 0xFBCB, 0x9271, 0x8D7A,\n\t0x9277, 0xFBCD, 0x9278, 0xFBCE, 0x927E, 0x9667, 0x9280, 0x8BE2,\t0x9283, 0x8F65, 0x9285, 0x93BA, 0x9288, 0xFA5F, 0x9291, 0x914C,\n\t0x9293, 0xE7F2, 0x9295, 0xE7EC, 0x9296, 0xE7F1, 0x9298, 0x96C1,\t0x929A, 0x92B6, 0x929B, 0xE7F3, 0x929C, 0xE7F0, 0x92A7, 0xFBCC,\n\t0x92AD, 0x914B, 0x92B7, 0xE7F7, 0x92B9, 0xE7F6, 0x92CF, 0xE7F5,\t0x92D0, 0xFBD2, 0x92D2, 0x964E, 0x92D3, 0xFBD6, 0x92D5, 0xFBD4,\n\t0x92D7, 0xFBD0, 0x92D9, 0xFBD1, 0x92E0, 0xFBD5, 0x92E4, 0x8F9B,\t0x92E7, 0xFBCF, 0x92E9, 0xE7F8, 0x92EA, 0x95DD, 0x92ED, 0x8973,\n\t0x92F2, 0x9565, 0x92F3, 0x9292, 0x92F8, 0x8B98, 0x92F9, 0xFA65,\t0x92FA, 0xE7FA, 0x92FB, 0xFBD9, 0x92FC, 0x8D7C, 0x92FF, 0xFBDC,\n\t0x9302, 0xFBDE, 0x9306, 0x8E4B, 0x930F, 0xE7F9, 0x9310, 0x908D,\t0x9318, 0x908E, 0x9319, 0xE840, 0x931A, 0xE842, 0x931D, 0xFBDD,\n\t0x931E, 0xFBDB, 0x9320, 0x8FF9, 0x9321, 0xFBD8, 0x9322, 0xE841,\t0x9323, 0xE843, 0x9325, 0xFBD7, 0x9326, 0x8BD1, 0x9328, 0x9564,\n\t0x932B, 0x8EE0, 0x932C, 0x9842, 0x932E, 0xE7FC, 0x932F, 0x8DF6,\t0x9332, 0x985E, 0x9335, 0xE845, 0x933A, 0xE844, 0x933B, 0xE846,\n\t0x9344, 0xE7FB, 0x9348, 0xFA5E, 0x934B, 0x93E7, 0x934D, 0x9374,\t0x9354, 0x92D5, 0x9356, 0xE84B, 0x9357, 0xFBE0, 0x935B, 0x9262,\n\t0x935C, 0xE847, 0x9360, 0xE848, 0x936C, 0x8C4C, 0x936E, 0xE84A,\t0x9370, 0xFBDF, 0x9375, 0x8CAE, 0x937C, 0xE849, 0x937E, 0x8FDF,\n\t0x938C, 0x8A99, 0x9394, 0xE84F, 0x9396, 0x8DBD, 0x9397, 0x9199,\t0x939A, 0x92C8, 0x93A4, 0xFBE1, 0x93A7, 0x8A5A, 0x93AC, 0xE84D,\n\t0x93AD, 0xE84E, 0x93AE, 0x92C1, 0x93B0, 0xE84C, 0x93B9, 0xE850,\t0x93C3, 0xE856, 0x93C6, 0xFBE2, 0x93C8, 0xE859, 0x93D0, 0xE858,\n\t0x93D1, 0x934C, 0x93D6, 0xE851, 0x93D7, 0xE852, 0x93D8, 0xE855,\t0x93DD, 0xE857, 0x93DE, 0xFBE3, 0x93E1, 0x8BBE, 0x93E4, 0xE85A,\n\t0x93E5, 0xE854, 0x93E8, 0xE853, 0x93F8, 0xFBE4, 0x9403, 0xE85E,\t0x9407, 0xE85F, 0x9410, 0xE860, 0x9413, 0xE85D, 0x9414, 0xE85C,\n\t0x9418, 0x8FE0, 0x9419, 0x93A8, 0x941A, 0xE85B, 0x9421, 0xE864,\t0x942B, 0xE862, 0x9431, 0xFBE5, 0x9435, 0xE863, 0x9436, 0xE861,\n\t0x9438, 0x91F6, 0x943A, 0xE865, 0x9441, 0xE866, 0x9444, 0xE868,\t0x9445, 0xFBE6, 0x9448, 0xFBE7, 0x9451, 0x8AD3, 0x9452, 0xE867,\n\t0x9453, 0x96F8, 0x945A, 0xE873, 0x945B, 0xE869, 0x945E, 0xE86C,\t0x9460, 0xE86A, 0x9462, 0xE86B, 0x946A, 0xE86D, 0x9470, 0xE86F,\n\t0x9475, 0xE870, 0x9477, 0xE871, 0x947C, 0xE874, 0x947D, 0xE872,\t0x947E, 0xE875, 0x947F, 0xE877, 0x9481, 0xE876, 0x9577, 0x92B7,\n\t0x9580, 0x96E5, 0x9582, 0xE878, 0x9583, 0x914D, 0x9587, 0xE879,\t0x9589, 0x95C2, 0x958A, 0xE87A, 0x958B, 0x8A4A, 0x958F, 0x895B,\n\t0x9591, 0x8AD5, 0x9592, 0xFBE8, 0x9593, 0x8AD4, 0x9594, 0xE87B,\t0x9596, 0xE87C, 0x9598, 0xE87D, 0x9599, 0xE87E, 0x95A0, 0xE880,\n\t0x95A2, 0x8AD6, 0x95A3, 0x8A74, 0x95A4, 0x8D7D, 0x95A5, 0x94B4,\t0x95A7, 0xE882, 0x95A8, 0xE881, 0x95AD, 0xE883, 0x95B2, 0x897B,\n\t0x95B9, 0xE886, 0x95BB, 0xE885, 0x95BC, 0xE884, 0x95BE, 0xE887,\t0x95C3, 0xE88A, 0x95C7, 0x88C5, 0x95CA, 0xE888, 0x95CC, 0xE88C,\n\t0x95CD, 0xE88B, 0x95D4, 0xE88E, 0x95D5, 0xE88D, 0x95D6, 0xE88F,\t0x95D8, 0x93AC, 0x95DC, 0xE890, 0x95E1, 0xE891, 0x95E2, 0xE893,\n\t0x95E5, 0xE892, 0x961C, 0x958C, 0x9621, 0xE894, 0x9628, 0xE895,\t0x962A, 0x8DE3, 0x962E, 0xE896, 0x962F, 0xE897, 0x9632, 0x9668,\n\t0x963B, 0x916A, 0x963F, 0x88A2, 0x9640, 0x91C9, 0x9642, 0xE898,\t0x9644, 0x958D, 0x964B, 0xE89B, 0x964C, 0xE899, 0x964D, 0x8D7E,\n\t0x964F, 0xE89A, 0x9650, 0x8CC0, 0x965B, 0x95C3, 0x965C, 0xE89D,\t0x965D, 0xE89F, 0x965E, 0xE89E, 0x965F, 0xE8A0, 0x9662, 0x8940,\n\t0x9663, 0x9077, 0x9664, 0x8F9C, 0x9665, 0x8AD7, 0x9666, 0xE8A1,\t0x966A, 0x9486, 0x966C, 0xE8A3, 0x9670, 0x8941, 0x9672, 0xE8A2,\n\t0x9673, 0x92C2, 0x9675, 0x97CB, 0x9676, 0x93A9, 0x9677, 0xE89C,\t0x9678, 0x97A4, 0x967A, 0x8CAF, 0x967D, 0x977A, 0x9685, 0x8BF7,\n\t0x9686, 0x97B2, 0x9688, 0x8C47, 0x968A, 0x91E0, 0x968B, 0xE440,\t0x968D, 0xE8A4, 0x968E, 0x8A4B, 0x968F, 0x908F, 0x9694, 0x8A75,\n\t0x9695, 0xE8A6, 0x9697, 0xE8A7, 0x9698, 0xE8A5, 0x9699, 0x8C84,\t0x969B, 0x8DDB, 0x969C, 0x8FE1, 0x969D, 0xFBEB, 0x96A0, 0x8942,\n\t0x96A3, 0x97D7, 0x96A7, 0xE8A9, 0x96A8, 0xE7AC, 0x96AA, 0xE8A8,\t0x96AF, 0xFBEC, 0x96B0, 0xE8AC, 0x96B1, 0xE8AA, 0x96B2, 0xE8AB,\n\t0x96B4, 0xE8AD, 0x96B6, 0xE8AE, 0x96B7, 0x97EA, 0x96B8, 0xE8AF,\t0x96B9, 0xE8B0, 0x96BB, 0x90C7, 0x96BC, 0x94B9, 0x96C0, 0x909D,\n\t0x96C1, 0x8AE5, 0x96C4, 0x9759, 0x96C5, 0x89EB, 0x96C6, 0x8F57,\t0x96C7, 0x8CD9, 0x96C9, 0xE8B3, 0x96CB, 0xE8B2, 0x96CC, 0x8E93,\n\t0x96CD, 0xE8B4, 0x96CE, 0xE8B1, 0x96D1, 0x8E47, 0x96D5, 0xE8B8,\t0x96D6, 0xE5AB, 0x96D9, 0x99D4, 0x96DB, 0x9097, 0x96DC, 0xE8B6,\n\t0x96E2, 0x97A3, 0x96E3, 0x93EF, 0x96E8, 0x894A, 0x96EA, 0x90E1,\t0x96EB, 0x8EB4, 0x96F0, 0x95B5, 0x96F2, 0x895F, 0x96F6, 0x97EB,\n\t0x96F7, 0x978B, 0x96F9, 0xE8B9, 0x96FB, 0x9364, 0x9700, 0x8EF9,\t0x9704, 0xE8BA, 0x9706, 0xE8BB, 0x9707, 0x906B, 0x9708, 0xE8BC,\n\t0x970A, 0x97EC, 0x970D, 0xE8B7, 0x970E, 0xE8BE, 0x970F, 0xE8C0,\t0x9711, 0xE8BF, 0x9713, 0xE8BD, 0x9716, 0xE8C1, 0x9719, 0xE8C2,\n\t0x971C, 0x919A, 0x971E, 0x89E0, 0x9724, 0xE8C3, 0x9727, 0x96B6,\t0x972A, 0xE8C4, 0x9730, 0xE8C5, 0x9732, 0x9849, 0x9733, 0xFBED,\n\t0x9738, 0x9E50, 0x9739, 0xE8C6, 0x973B, 0xFBEE, 0x973D, 0xE8C7,\t0x973E, 0xE8C8, 0x9742, 0xE8CC, 0x9743, 0xFBEF, 0x9744, 0xE8C9,\n\t0x9746, 0xE8CA, 0x9748, 0xE8CB, 0x9749, 0xE8CD, 0x974D, 0xFBF0,\t0x974F, 0xFBF1, 0x9751, 0xFBF2, 0x9752, 0x90C2, 0x9755, 0xFBF3,\n\t0x9756, 0x96F5, 0x9759, 0x90C3, 0x975C, 0xE8CE, 0x975E, 0x94F1,\t0x9760, 0xE8CF, 0x9761, 0xEA72, 0x9762, 0x96CA, 0x9764, 0xE8D0,\n\t0x9766, 0xE8D1, 0x9768, 0xE8D2, 0x9769, 0x8A76, 0x976B, 0xE8D4,\t0x976D, 0x9078, 0x9771, 0xE8D5, 0x9774, 0x8C43, 0x9779, 0xE8D6,\n\t0x977A, 0xE8DA, 0x977C, 0xE8D8, 0x9781, 0xE8D9, 0x9784, 0x8A93,\t0x9785, 0xE8D7, 0x9786, 0xE8DB, 0x978B, 0xE8DC, 0x978D, 0x88C6,\n\t0x978F, 0xE8DD, 0x9790, 0xE8DE, 0x9798, 0x8FE2, 0x979C, 0xE8DF,\t0x97A0, 0x8B66, 0x97A3, 0xE8E2, 0x97A6, 0xE8E1, 0x97A8, 0xE8E0,\n\t0x97AB, 0xE691, 0x97AD, 0x95DA, 0x97B3, 0xE8E3, 0x97B4, 0xE8E4,\t0x97C3, 0xE8E5, 0x97C6, 0xE8E6, 0x97C8, 0xE8E7, 0x97CB, 0xE8E8,\n\t0x97D3, 0x8AD8, 0x97DC, 0xE8E9, 0x97ED, 0xE8EA, 0x97EE, 0x9442,\t0x97F2, 0xE8EC, 0x97F3, 0x89B9, 0x97F5, 0xE8EF, 0x97F6, 0xE8EE,\n\t0x97FB, 0x8943, 0x97FF, 0x8BBF, 0x9801, 0x95C5, 0x9802, 0x92B8,\t0x9803, 0x8DA0, 0x9805, 0x8D80, 0x9806, 0x8F87, 0x9808, 0x907B,\n\t0x980C, 0xE8F1, 0x980F, 0xE8F0, 0x9810, 0x9761, 0x9811, 0x8AE6,\t0x9812, 0x94D0, 0x9813, 0x93DA, 0x9817, 0x909C, 0x9818, 0x97CC,\n\t0x981A, 0x8C7A, 0x9821, 0xE8F4, 0x9824, 0xE8F3, 0x982C, 0x966A,\t0x982D, 0x93AA, 0x9834, 0x896F, 0x9837, 0xE8F5, 0x9838, 0xE8F2,\n\t0x983B, 0x9570, 0x983C, 0x978A, 0x983D, 0xE8F6, 0x9846, 0xE8F7,\t0x984B, 0xE8F9, 0x984C, 0x91E8, 0x984D, 0x8A7A, 0x984E, 0x8A7B,\n\t0x984F, 0xE8F8, 0x9854, 0x8AE7, 0x9855, 0x8CB0, 0x9857, 0xFBF4,\t0x9858, 0x8AE8, 0x985B, 0x935E, 0x985E, 0x97DE, 0x9865, 0xFBF5,\n\t0x9867, 0x8CDA, 0x986B, 0xE8FA, 0x986F, 0xE8FB, 0x9870, 0xE8FC,\t0x9871, 0xE940, 0x9873, 0xE942, 0x9874, 0xE941, 0x98A8, 0x9597,\n\t0x98AA, 0xE943, 0x98AF, 0xE944, 0x98B1, 0xE945, 0x98B6, 0xE946,\t0x98C3, 0xE948, 0x98C4, 0xE947, 0x98C6, 0xE949, 0x98DB, 0x94F2,\n\t0x98DC, 0xE3CA, 0x98DF, 0x9048, 0x98E2, 0x8B51, 0x98E9, 0xE94A,\t0x98EB, 0xE94B, 0x98ED, 0x99AA, 0x98EE, 0x9F5A, 0x98EF, 0x94D1,\n\t0x98F2, 0x88F9, 0x98F4, 0x88B9, 0x98FC, 0x8E94, 0x98FD, 0x964F,\t0x98FE, 0x8FFC, 0x9903, 0xE94C, 0x9905, 0x96DD, 0x9909, 0xE94D,\n\t0x990A, 0x977B, 0x990C, 0x8961, 0x9910, 0x8E60, 0x9912, 0xE94E,\t0x9913, 0x89EC, 0x9914, 0xE94F, 0x9918, 0xE950, 0x991D, 0xE952,\n\t0x991E, 0xE953, 0x9920, 0xE955, 0x9921, 0xE951, 0x9924, 0xE954,\t0x9927, 0xFBF8, 0x9928, 0x8AD9, 0x992C, 0xE956, 0x992E, 0xE957,\n\t0x993D, 0xE958, 0x993E, 0xE959, 0x9942, 0xE95A, 0x9945, 0xE95C,\t0x9949, 0xE95B, 0x994B, 0xE95E, 0x994C, 0xE961, 0x9950, 0xE95D,\n\t0x9951, 0xE95F, 0x9952, 0xE960, 0x9955, 0xE962, 0x9957, 0x8BC0,\t0x9996, 0x8EF1, 0x9997, 0xE963, 0x9998, 0xE964, 0x9999, 0x8D81,\n\t0x999E, 0xFBFA, 0x99A5, 0xE965, 0x99A8, 0x8A5D, 0x99AC, 0x946E,\t0x99AD, 0xE966, 0x99AE, 0xE967, 0x99B3, 0x9279, 0x99B4, 0x93E9,\n\t0x99BC, 0xE968, 0x99C1, 0x949D, 0x99C4, 0x91CA, 0x99C5, 0x8977,\t0x99C6, 0x8BEC, 0x99C8, 0x8BED, 0x99D0, 0x9293, 0x99D1, 0xE96D,\n\t0x99D2, 0x8BEE, 0x99D5, 0x89ED, 0x99D8, 0xE96C, 0x99DB, 0xE96A,\t0x99DD, 0xE96B, 0x99DF, 0xE969, 0x99E2, 0xE977, 0x99ED, 0xE96E,\n\t0x99EE, 0xE96F, 0x99F1, 0xE970, 0x99F2, 0xE971, 0x99F8, 0xE973,\t0x99FB, 0xE972, 0x99FF, 0x8F78, 0x9A01, 0xE974, 0x9A05, 0xE976,\n\t0x9A0E, 0x8B52, 0x9A0F, 0xE975, 0x9A12, 0x919B, 0x9A13, 0x8CB1,\t0x9A19, 0xE978, 0x9A28, 0x91CB, 0x9A2B, 0xE979, 0x9A30, 0x93AB,\n\t0x9A37, 0xE97A, 0x9A3E, 0xE980, 0x9A40, 0xE97D, 0x9A42, 0xE97C,\t0x9A43, 0xE97E, 0x9A45, 0xE97B, 0x9A4D, 0xE982, 0x9A4E, 0xFBFB,\n\t0x9A55, 0xE981, 0x9A57, 0xE984, 0x9A5A, 0x8BC1, 0x9A5B, 0xE983,\t0x9A5F, 0xE985, 0x9A62, 0xE986, 0x9A64, 0xE988, 0x9A65, 0xE987,\n\t0x9A69, 0xE989, 0x9A6A, 0xE98B, 0x9A6B, 0xE98A, 0x9AA8, 0x8D9C,\t0x9AAD, 0xE98C, 0x9AB0, 0xE98D, 0x9AB8, 0x8A5B, 0x9ABC, 0xE98E,\n\t0x9AC0, 0xE98F, 0x9AC4, 0x9091, 0x9ACF, 0xE990, 0x9AD1, 0xE991,\t0x9AD3, 0xE992, 0x9AD4, 0xE993, 0x9AD8, 0x8D82, 0x9AD9, 0xFBFC,\n\t0x9ADC, 0xFC40, 0x9ADE, 0xE994, 0x9ADF, 0xE995, 0x9AE2, 0xE996,\t0x9AE3, 0xE997, 0x9AE6, 0xE998, 0x9AEA, 0x94AF, 0x9AEB, 0xE99A,\n\t0x9AED, 0x9545, 0x9AEE, 0xE99B, 0x9AEF, 0xE999, 0x9AF1, 0xE99D,\t0x9AF4, 0xE99C, 0x9AF7, 0xE99E, 0x9AFB, 0xE99F, 0x9B06, 0xE9A0,\n\t0x9B18, 0xE9A1, 0x9B1A, 0xE9A2, 0x9B1F, 0xE9A3, 0x9B22, 0xE9A4,\t0x9B23, 0xE9A5, 0x9B25, 0xE9A6, 0x9B27, 0xE9A7, 0x9B28, 0xE9A8,\n\t0x9B29, 0xE9A9, 0x9B2A, 0xE9AA, 0x9B2E, 0xE9AB, 0x9B2F, 0xE9AC,\t0x9B31, 0x9F54, 0x9B32, 0xE9AD, 0x9B3B, 0xE2F6, 0x9B3C, 0x8B53,\n\t0x9B41, 0x8A40, 0x9B42, 0x8DB0, 0x9B43, 0xE9AF, 0x9B44, 0xE9AE,\t0x9B45, 0x96A3, 0x9B4D, 0xE9B1, 0x9B4E, 0xE9B2, 0x9B4F, 0xE9B0,\n\t0x9B51, 0xE9B3, 0x9B54, 0x9682, 0x9B58, 0xE9B4, 0x9B5A, 0x8B9B,\t0x9B6F, 0x9844, 0x9B72, 0xFC42, 0x9B74, 0xE9B5, 0x9B75, 0xFC41,\n\t0x9B83, 0xE9B7, 0x9B8E, 0x88BC, 0x9B8F, 0xFC43, 0x9B91, 0xE9B8,\t0x9B92, 0x95A9, 0x9B93, 0xE9B6, 0x9B96, 0xE9B9, 0x9B97, 0xE9BA,\n\t0x9B9F, 0xE9BB, 0x9BA0, 0xE9BC, 0x9BA8, 0xE9BD, 0x9BAA, 0x968E,\t0x9BAB, 0x8E4C, 0x9BAD, 0x8DF8, 0x9BAE, 0x914E, 0x9BB1, 0xFC44,\n\t0x9BB4, 0xE9BE, 0x9BB9, 0xE9C1, 0x9BBB, 0xFC45, 0x9BC0, 0xE9BF,\t0x9BC6, 0xE9C2, 0x9BC9, 0x8CEF, 0x9BCA, 0xE9C0, 0x9BCF, 0xE9C3,\n\t0x9BD1, 0xE9C4, 0x9BD2, 0xE9C5, 0x9BD4, 0xE9C9, 0x9BD6, 0x8E49,\t0x9BDB, 0x91E2, 0x9BE1, 0xE9CA, 0x9BE2, 0xE9C7, 0x9BE3, 0xE9C6,\n\t0x9BE4, 0xE9C8, 0x9BE8, 0x8C7E, 0x9BF0, 0xE9CE, 0x9BF1, 0xE9CD,\t0x9BF2, 0xE9CC, 0x9BF5, 0x88B1, 0x9C00, 0xFC46, 0x9C04, 0xE9D8,\n\t0x9C06, 0xE9D4, 0x9C08, 0xE9D5, 0x9C09, 0xE9D1, 0x9C0A, 0xE9D7,\t0x9C0C, 0xE9D3, 0x9C0D, 0x8A82, 0x9C10, 0x986B, 0x9C12, 0xE9D6,\n\t0x9C13, 0xE9D2, 0x9C14, 0xE9D0, 0x9C15, 0xE9CF, 0x9C1B, 0xE9DA,\t0x9C21, 0xE9DD, 0x9C24, 0xE9DC, 0x9C25, 0xE9DB, 0x9C2D, 0x9568,\n\t0x9C2E, 0xE9D9, 0x9C2F, 0x88F1, 0x9C30, 0xE9DE, 0x9C32, 0xE9E0,\t0x9C39, 0x8A8F, 0x9C3A, 0xE9CB, 0x9C3B, 0x8956, 0x9C3E, 0xE9E2,\n\t0x9C46, 0xE9E1, 0x9C47, 0xE9DF, 0x9C48, 0x924C, 0x9C52, 0x9690,\t0x9C57, 0x97D8, 0x9C5A, 0xE9E3, 0x9C60, 0xE9E4, 0x9C67, 0xE9E5,\n\t0x9C76, 0xE9E6, 0x9C78, 0xE9E7, 0x9CE5, 0x92B9, 0x9CE7, 0xE9E8,\t0x9CE9, 0x94B5, 0x9CEB, 0xE9ED, 0x9CEC, 0xE9E9, 0x9CF0, 0xE9EA,\n\t0x9CF3, 0x9650, 0x9CF4, 0x96C2, 0x9CF6, 0x93CE, 0x9D03, 0xE9EE,\t0x9D06, 0xE9EF, 0x9D07, 0x93BC, 0x9D08, 0xE9EC, 0x9D09, 0xE9EB,\n\t0x9D0E, 0x89A8, 0x9D12, 0xE9F7, 0x9D15, 0xE9F6, 0x9D1B, 0x8995,\t0x9D1F, 0xE9F4, 0x9D23, 0xE9F3, 0x9D26, 0xE9F1, 0x9D28, 0x8A9B,\n\t0x9D2A, 0xE9F0, 0x9D2B, 0x8EB0, 0x9D2C, 0x89A7, 0x9D3B, 0x8D83,\t0x9D3E, 0xE9FA, 0x9D3F, 0xE9F9, 0x9D41, 0xE9F8, 0x9D44, 0xE9F5,\n\t0x9D46, 0xE9FB, 0x9D48, 0xE9FC, 0x9D50, 0xEA44, 0x9D51, 0xEA43,\t0x9D59, 0xEA45, 0x9D5C, 0x894C, 0x9D5D, 0xEA40, 0x9D5E, 0xEA41,\n\t0x9D60, 0x8D94, 0x9D61, 0x96B7, 0x9D64, 0xEA42, 0x9D6B, 0xFC48,\t0x9D6C, 0x9651, 0x9D6F, 0xEA4A, 0x9D70, 0xFC47, 0x9D72, 0xEA46,\n\t0x9D7A, 0xEA4B, 0x9D87, 0xEA48, 0x9D89, 0xEA47, 0x9D8F, 0x8C7B,\t0x9D9A, 0xEA4C, 0x9DA4, 0xEA4D, 0x9DA9, 0xEA4E, 0x9DAB, 0xEA49,\n\t0x9DAF, 0xE9F2, 0x9DB2, 0xEA4F, 0x9DB4, 0x92DF, 0x9DB8, 0xEA53,\t0x9DBA, 0xEA54, 0x9DBB, 0xEA52, 0x9DC1, 0xEA51, 0x9DC2, 0xEA57,\n\t0x9DC4, 0xEA50, 0x9DC6, 0xEA55, 0x9DCF, 0xEA56, 0x9DD3, 0xEA59,\t0x9DD9, 0xEA58, 0x9DE6, 0xEA5B, 0x9DED, 0xEA5C, 0x9DEF, 0xEA5D,\n\t0x9DF2, 0x9868, 0x9DF8, 0xEA5A, 0x9DF9, 0x91E9, 0x9DFA, 0x8DEB,\t0x9DFD, 0xEA5E, 0x9E19, 0xFC4A, 0x9E1A, 0xEA5F, 0x9E1B, 0xEA60,\n\t0x9E1E, 0xEA61, 0x9E75, 0xEA62, 0x9E78, 0x8CB2, 0x9E79, 0xEA63,\t0x9E7D, 0xEA64, 0x9E7F, 0x8EAD, 0x9E81, 0xEA65, 0x9E88, 0xEA66,\n\t0x9E8B, 0xEA67, 0x9E8C, 0xEA68, 0x9E91, 0xEA6B, 0x9E92, 0xEA69,\t0x9E93, 0x985B, 0x9E95, 0xEA6A, 0x9E97, 0x97ED, 0x9E9D, 0xEA6C,\n\t0x9E9F, 0x97D9, 0x9EA5, 0xEA6D, 0x9EA6, 0x949E, 0x9EA9, 0xEA6E,\t0x9EAA, 0xEA70, 0x9EAD, 0xEA71, 0x9EB8, 0xEA6F, 0x9EB9, 0x8D8D,\n\t0x9EBA, 0x96CB, 0x9EBB, 0x9683, 0x9EBC, 0x9BF5, 0x9EBE, 0x9F80,\t0x9EBF, 0x969B, 0x9EC4, 0x89A9, 0x9ECC, 0xEA73, 0x9ECD, 0x8B6F,\n\t0x9ECE, 0xEA74, 0x9ECF, 0xEA75, 0x9ED0, 0xEA76, 0x9ED1, 0xFC4B,\t0x9ED2, 0x8D95, 0x9ED4, 0xEA77, 0x9ED8, 0xE0D2, 0x9ED9, 0x96D9,\n\t0x9EDB, 0x91E1, 0x9EDC, 0xEA78, 0x9EDD, 0xEA7A, 0x9EDE, 0xEA79,\t0x9EE0, 0xEA7B, 0x9EE5, 0xEA7C, 0x9EE8, 0xEA7D, 0x9EEF, 0xEA7E,\n\t0x9EF4, 0xEA80, 0x9EF6, 0xEA81, 0x9EF7, 0xEA82, 0x9EF9, 0xEA83,\t0x9EFB, 0xEA84, 0x9EFC, 0xEA85, 0x9EFD, 0xEA86, 0x9F07, 0xEA87,\n\t0x9F08, 0xEA88, 0x9F0E, 0x9343, 0x9F13, 0x8CDB, 0x9F15, 0xEA8A,\t0x9F20, 0x916C, 0x9F21, 0xEA8B, 0x9F2C, 0xEA8C, 0x9F3B, 0x9540,\n\t0x9F3E, 0xEA8D, 0x9F4A, 0xEA8E, 0x9F4B, 0xE256, 0x9F4E, 0xE6D8,\t0x9F4F, 0xE8EB, 0x9F52, 0xEA8F, 0x9F54, 0xEA90, 0x9F5F, 0xEA92,\n\t0x9F60, 0xEA93, 0x9F61, 0xEA94, 0x9F62, 0x97EE, 0x9F63, 0xEA91,\t0x9F66, 0xEA95, 0x9F67, 0xEA96, 0x9F6A, 0xEA98, 0x9F6C, 0xEA97,\n\t0x9F72, 0xEA9A, 0x9F76, 0xEA9B, 0x9F77, 0xEA99, 0x9F8D, 0x97B4,\t0x9F95, 0xEA9C, 0x9F9C, 0xEA9D, 0x9F9D, 0xE273, 0x9FA0, 0xEA9E,\n\t0xF929, 0xFAE0, 0xF9DC, 0xFBE9, 0xFA0E, 0xFA90, 0xFA0F, 0xFA9B,\t0xFA10, 0xFA9C, 0xFA11, 0xFAB1, 0xFA12, 0xFAD8, 0xFA13, 0xFAE8,\n\t0xFA14, 0xFAEA, 0xFA15, 0xFB58, 0xFA16, 0xFB5E, 0xFA17, 0xFB75,\t0xFA18, 0xFB7D, 0xFA19, 0xFB7E, 0xFA1A, 0xFB80, 0xFA1B, 0xFB82,\n\t0xFA1C, 0xFB86, 0xFA1D, 0xFB89, 0xFA1E, 0xFB92, 0xFA1F, 0xFB9D,\t0xFA20, 0xFB9F, 0xFA21, 0xFBA0, 0xFA22, 0xFBA9, 0xFA23, 0xFBB1,\n\t0xFA24, 0xFBB3, 0xFA25, 0xFBB4, 0xFA26, 0xFBB7, 0xFA27, 0xFBD3,\t0xFA28, 0xFBDA, 0xFA29, 0xFBEA, 0xFA2A, 0xFBF6, 0xFA2B, 0xFBF7,\n\t0xFA2C, 0xFBF9, 0xFA2D, 0xFC49, 0xFF01, 0x8149, 0xFF02, 0xFA57,\t0xFF03, 0x8194, 0xFF04, 0x8190, 0xFF05, 0x8193, 0xFF06, 0x8195,\n\t0xFF07, 0xFA56, 0xFF08, 0x8169, 0xFF09, 0x816A, 0xFF0A, 0x8196,\t0xFF0B, 0x817B, 0xFF0C, 0x8143, 0xFF0D, 0x817C, 0xFF0E, 0x8144,\n\t0xFF0F, 0x815E, 0xFF10, 0x824F, 0xFF11, 0x8250, 0xFF12, 0x8251,\t0xFF13, 0x8252, 0xFF14, 0x8253, 0xFF15, 0x8254, 0xFF16, 0x8255,\n\t0xFF17, 0x8256, 0xFF18, 0x8257, 0xFF19, 0x8258, 0xFF1A, 0x8146,\t0xFF1B, 0x8147, 0xFF1C, 0x8183, 0xFF1D, 0x8181, 0xFF1E, 0x8184,\n\t0xFF1F, 0x8148, 0xFF20, 0x8197, 0xFF21, 0x8260, 0xFF22, 0x8261,\t0xFF23, 0x8262, 0xFF24, 0x8263, 0xFF25, 0x8264, 0xFF26, 0x8265,\n\t0xFF27, 0x8266, 0xFF28, 0x8267, 0xFF29, 0x8268, 0xFF2A, 0x8269,\t0xFF2B, 0x826A, 0xFF2C, 0x826B, 0xFF2D, 0x826C, 0xFF2E, 0x826D,\n\t0xFF2F, 0x826E, 0xFF30, 0x826F, 0xFF31, 0x8270, 0xFF32, 0x8271,\t0xFF33, 0x8272, 0xFF34, 0x8273, 0xFF35, 0x8274, 0xFF36, 0x8275,\n\t0xFF37, 0x8276, 0xFF38, 0x8277, 0xFF39, 0x8278, 0xFF3A, 0x8279,\t0xFF3B, 0x816D, 0xFF3C, 0x815F, 0xFF3D, 0x816E, 0xFF3E, 0x814F,\n\t0xFF3F, 0x8151, 0xFF40, 0x814D, 0xFF41, 0x8281, 0xFF42, 0x8282,\t0xFF43, 0x8283, 0xFF44, 0x8284, 0xFF45, 0x8285, 0xFF46, 0x8286,\n\t0xFF47, 0x8287, 0xFF48, 0x8288, 0xFF49, 0x8289, 0xFF4A, 0x828A,\t0xFF4B, 0x828B, 0xFF4C, 0x828C, 0xFF4D, 0x828D, 0xFF4E, 0x828E,\n\t0xFF4F, 0x828F, 0xFF50, 0x8290, 0xFF51, 0x8291, 0xFF52, 0x8292,\t0xFF53, 0x8293, 0xFF54, 0x8294, 0xFF55, 0x8295, 0xFF56, 0x8296,\n\t0xFF57, 0x8297, 0xFF58, 0x8298, 0xFF59, 0x8299, 0xFF5A, 0x829A,\t0xFF5B, 0x816F, 0xFF5C, 0x8162, 0xFF5D, 0x8170, 0xFF5E, 0x8160,\n\t0xFF61, 0x00A1, 0xFF62, 0x00A2, 0xFF63, 0x00A3, 0xFF64, 0x00A4,\t0xFF65, 0x00A5, 0xFF66, 0x00A6, 0xFF67, 0x00A7, 0xFF68, 0x00A8,\n\t0xFF69, 0x00A9, 0xFF6A, 0x00AA, 0xFF6B, 0x00AB, 0xFF6C, 0x00AC,\t0xFF6D, 0x00AD, 0xFF6E, 0x00AE, 0xFF6F, 0x00AF, 0xFF70, 0x00B0,\n\t0xFF71, 0x00B1, 0xFF72, 0x00B2, 0xFF73, 0x00B3, 0xFF74, 0x00B4,\t0xFF75, 0x00B5, 0xFF76, 0x00B6, 0xFF77, 0x00B7, 0xFF78, 0x00B8,\n\t0xFF79, 0x00B9, 0xFF7A, 0x00BA, 0xFF7B, 0x00BB, 0xFF7C, 0x00BC,\t0xFF7D, 0x00BD, 0xFF7E, 0x00BE, 0xFF7F, 0x00BF, 0xFF80, 0x00C0,\n\t0xFF81, 0x00C1, 0xFF82, 0x00C2, 0xFF83, 0x00C3, 0xFF84, 0x00C4,\t0xFF85, 0x00C5, 0xFF86, 0x00C6, 0xFF87, 0x00C7, 0xFF88, 0x00C8,\n\t0xFF89, 0x00C9, 0xFF8A, 0x00CA, 0xFF8B, 0x00CB, 0xFF8C, 0x00CC,\t0xFF8D, 0x00CD, 0xFF8E, 0x00CE, 0xFF8F, 0x00CF, 0xFF90, 0x00D0,\n\t0xFF91, 0x00D1, 0xFF92, 0x00D2, 0xFF93, 0x00D3, 0xFF94, 0x00D4,\t0xFF95, 0x00D5, 0xFF96, 0x00D6, 0xFF97, 0x00D7, 0xFF98, 0x00D8,\n\t0xFF99, 0x00D9, 0xFF9A, 0x00DA, 0xFF9B, 0x00DB, 0xFF9C, 0x00DC,\t0xFF9D, 0x00DD, 0xFF9E, 0x00DE, 0xFF9F, 0x00DF, 0xFFE0, 0x8191,\n\t0xFFE1, 0x8192, 0xFFE2, 0x81CA, 0xFFE3, 0x8150, 0xFFE4, 0xFA55,\t0xFFE5, 0x818F, 0, 0\n};\n\nstatic const WCHAR oem2uni932[] = {\t/* Shift_JIS --> Unicode pairs */\n\t0x00A1, 0xFF61, 0x00A2, 0xFF62, 0x00A3, 0xFF63, 0x00A4, 0xFF64,\t0x00A5, 0xFF65, 0x00A6, 0xFF66, 0x00A7, 0xFF67, 0x00A8, 0xFF68,\n\t0x00A9, 0xFF69, 0x00AA, 0xFF6A, 0x00AB, 0xFF6B, 0x00AC, 0xFF6C,\t0x00AD, 0xFF6D, 0x00AE, 0xFF6E, 0x00AF, 0xFF6F, 0x00B0, 0xFF70,\n\t0x00B1, 0xFF71, 0x00B2, 0xFF72, 0x00B3, 0xFF73, 0x00B4, 0xFF74,\t0x00B5, 0xFF75, 0x00B6, 0xFF76, 0x00B7, 0xFF77, 0x00B8, 0xFF78,\n\t0x00B9, 0xFF79, 0x00BA, 0xFF7A, 0x00BB, 0xFF7B, 0x00BC, 0xFF7C,\t0x00BD, 0xFF7D, 0x00BE, 0xFF7E, 0x00BF, 0xFF7F, 0x00C0, 0xFF80,\n\t0x00C1, 0xFF81, 0x00C2, 0xFF82, 0x00C3, 0xFF83, 0x00C4, 0xFF84,\t0x00C5, 0xFF85, 0x00C6, 0xFF86, 0x00C7, 0xFF87, 0x00C8, 0xFF88,\n\t0x00C9, 0xFF89, 0x00CA, 0xFF8A, 0x00CB, 0xFF8B, 0x00CC, 0xFF8C,\t0x00CD, 0xFF8D, 0x00CE, 0xFF8E, 0x00CF, 0xFF8F, 0x00D0, 0xFF90,\n\t0x00D1, 0xFF91, 0x00D2, 0xFF92, 0x00D3, 0xFF93, 0x00D4, 0xFF94,\t0x00D5, 0xFF95, 0x00D6, 0xFF96, 0x00D7, 0xFF97, 0x00D8, 0xFF98,\n\t0x00D9, 0xFF99, 0x00DA, 0xFF9A, 0x00DB, 0xFF9B, 0x00DC, 0xFF9C,\t0x00DD, 0xFF9D, 0x00DE, 0xFF9E, 0x00DF, 0xFF9F, 0x8140, 0x3000,\n\t0x8141, 0x3001, 0x8142, 0x3002, 0x8143, 0xFF0C, 0x8144, 0xFF0E,\t0x8145, 0x30FB, 0x8146, 0xFF1A, 0x8147, 0xFF1B, 0x8148, 0xFF1F,\n\t0x8149, 0xFF01, 0x814A, 0x309B, 0x814B, 0x309C, 0x814C, 0x00B4,\t0x814D, 0xFF40, 0x814E, 0x00A8, 0x814F, 0xFF3E, 0x8150, 0xFFE3,\n\t0x8151, 0xFF3F, 0x8152, 0x30FD, 0x8153, 0x30FE, 0x8154, 0x309D,\t0x8155, 0x309E, 0x8156, 0x3003, 0x8157, 0x4EDD, 0x8158, 0x3005,\n\t0x8159, 0x3006, 0x815A, 0x3007, 0x815B, 0x30FC, 0x815C, 0x2015,\t0x815D, 0x2010, 0x815E, 0xFF0F, 0x815F, 0xFF3C, 0x8160, 0xFF5E,\n\t0x8161, 0x2225, 0x8162, 0xFF5C, 0x8163, 0x2026, 0x8164, 0x2025,\t0x8165, 0x2018, 0x8166, 0x2019, 0x8167, 0x201C, 0x8168, 0x201D,\n\t0x8169, 0xFF08, 0x816A, 0xFF09, 0x816B, 0x3014, 0x816C, 0x3015,\t0x816D, 0xFF3B, 0x816E, 0xFF3D, 0x816F, 0xFF5B, 0x8170, 0xFF5D,\n\t0x8171, 0x3008, 0x8172, 0x3009, 0x8173, 0x300A, 0x8174, 0x300B,\t0x8175, 0x300C, 0x8176, 0x300D, 0x8177, 0x300E, 0x8178, 0x300F,\n\t0x8179, 0x3010, 0x817A, 0x3011, 0x817B, 0xFF0B, 0x817C, 0xFF0D,\t0x817D, 0x00B1, 0x817E, 0x00D7, 0x8180, 0x00F7, 0x8181, 0xFF1D,\n\t0x8182, 0x2260, 0x8183, 0xFF1C, 0x8184, 0xFF1E, 0x8185, 0x2266,\t0x8186, 0x2267, 0x8187, 0x221E, 0x8188, 0x2234, 0x8189, 0x2642,\n\t0x818A, 0x2640, 0x818B, 0x00B0, 0x818C, 0x2032, 0x818D, 0x2033,\t0x818E, 0x2103, 0x818F, 0xFFE5, 0x8190, 0xFF04, 0x8191, 0xFFE0,\n\t0x8192, 0xFFE1, 0x8193, 0xFF05, 0x8194, 0xFF03, 0x8195, 0xFF06,\t0x8196, 0xFF0A, 0x8197, 0xFF20, 0x8198, 0x00A7, 0x8199, 0x2606,\n\t0x819A, 0x2605, 0x819B, 0x25CB, 0x819C, 0x25CF, 0x819D, 0x25CE,\t0x819E, 0x25C7, 0x819F, 0x25C6, 0x81A0, 0x25A1, 0x81A1, 0x25A0,\n\t0x81A2, 0x25B3, 0x81A3, 0x25B2, 0x81A4, 0x25BD, 0x81A5, 0x25BC,\t0x81A6, 0x203B, 0x81A7, 0x3012, 0x81A8, 0x2192, 0x81A9, 0x2190,\n\t0x81AA, 0x2191, 0x81AB, 0x2193, 0x81AC, 0x3013, 0x81B8, 0x2208,\t0x81B9, 0x220B, 0x81BA, 0x2286, 0x81BB, 0x2287, 0x81BC, 0x2282,\n\t0x81BD, 0x2283, 0x81BE, 0x222A, 0x81BF, 0x2229, 0x81C8, 0x2227,\t0x81C9, 0x2228, 0x81CA, 0xFFE2, 0x81CB, 0x21D2, 0x81CC, 0x21D4,\n\t0x81CD, 0x2200, 0x81CE, 0x2203, 0x81DA, 0x2220, 0x81DB, 0x22A5,\t0x81DC, 0x2312, 0x81DD, 0x2202, 0x81DE, 0x2207, 0x81DF, 0x2261,\n\t0x81E0, 0x2252, 0x81E1, 0x226A, 0x81E2, 0x226B, 0x81E3, 0x221A,\t0x81E4, 0x223D, 0x81E5, 0x221D, 0x81E6, 0x2235, 0x81E7, 0x222B,\n\t0x81E8, 0x222C, 0x81F0, 0x212B, 0x81F1, 0x2030, 0x81F2, 0x266F,\t0x81F3, 0x266D, 0x81F4, 0x266A, 0x81F5, 0x2020, 0x81F6, 0x2021,\n\t0x81F7, 0x00B6, 0x81FC, 0x25EF, 0x824F, 0xFF10, 0x8250, 0xFF11,\t0x8251, 0xFF12, 0x8252, 0xFF13, 0x8253, 0xFF14, 0x8254, 0xFF15,\n\t0x8255, 0xFF16, 0x8256, 0xFF17, 0x8257, 0xFF18, 0x8258, 0xFF19,\t0x8260, 0xFF21, 0x8261, 0xFF22, 0x8262, 0xFF23, 0x8263, 0xFF24,\n\t0x8264, 0xFF25, 0x8265, 0xFF26, 0x8266, 0xFF27, 0x8267, 0xFF28,\t0x8268, 0xFF29, 0x8269, 0xFF2A, 0x826A, 0xFF2B, 0x826B, 0xFF2C,\n\t0x826C, 0xFF2D, 0x826D, 0xFF2E, 0x826E, 0xFF2F, 0x826F, 0xFF30,\t0x8270, 0xFF31, 0x8271, 0xFF32, 0x8272, 0xFF33, 0x8273, 0xFF34,\n\t0x8274, 0xFF35, 0x8275, 0xFF36, 0x8276, 0xFF37, 0x8277, 0xFF38,\t0x8278, 0xFF39, 0x8279, 0xFF3A, 0x8281, 0xFF41, 0x8282, 0xFF42,\n\t0x8283, 0xFF43, 0x8284, 0xFF44, 0x8285, 0xFF45, 0x8286, 0xFF46,\t0x8287, 0xFF47, 0x8288, 0xFF48, 0x8289, 0xFF49, 0x828A, 0xFF4A,\n\t0x828B, 0xFF4B, 0x828C, 0xFF4C, 0x828D, 0xFF4D, 0x828E, 0xFF4E,\t0x828F, 0xFF4F, 0x8290, 0xFF50, 0x8291, 0xFF51, 0x8292, 0xFF52,\n\t0x8293, 0xFF53, 0x8294, 0xFF54, 0x8295, 0xFF55, 0x8296, 0xFF56,\t0x8297, 0xFF57, 0x8298, 0xFF58, 0x8299, 0xFF59, 0x829A, 0xFF5A,\n\t0x829F, 0x3041, 0x82A0, 0x3042, 0x82A1, 0x3043, 0x82A2, 0x3044,\t0x82A3, 0x3045, 0x82A4, 0x3046, 0x82A5, 0x3047, 0x82A6, 0x3048,\n\t0x82A7, 0x3049, 0x82A8, 0x304A, 0x82A9, 0x304B, 0x82AA, 0x304C,\t0x82AB, 0x304D, 0x82AC, 0x304E, 0x82AD, 0x304F, 0x82AE, 0x3050,\n\t0x82AF, 0x3051, 0x82B0, 0x3052, 0x82B1, 0x3053, 0x82B2, 0x3054,\t0x82B3, 0x3055, 0x82B4, 0x3056, 0x82B5, 0x3057, 0x82B6, 0x3058,\n\t0x82B7, 0x3059, 0x82B8, 0x305A, 0x82B9, 0x305B, 0x82BA, 0x305C,\t0x82BB, 0x305D, 0x82BC, 0x305E, 0x82BD, 0x305F, 0x82BE, 0x3060,\n\t0x82BF, 0x3061, 0x82C0, 0x3062, 0x82C1, 0x3063, 0x82C2, 0x3064,\t0x82C3, 0x3065, 0x82C4, 0x3066, 0x82C5, 0x3067, 0x82C6, 0x3068,\n\t0x82C7, 0x3069, 0x82C8, 0x306A, 0x82C9, 0x306B, 0x82CA, 0x306C,\t0x82CB, 0x306D, 0x82CC, 0x306E, 0x82CD, 0x306F, 0x82CE, 0x3070,\n\t0x82CF, 0x3071, 0x82D0, 0x3072, 0x82D1, 0x3073, 0x82D2, 0x3074,\t0x82D3, 0x3075, 0x82D4, 0x3076, 0x82D5, 0x3077, 0x82D6, 0x3078,\n\t0x82D7, 0x3079, 0x82D8, 0x307A, 0x82D9, 0x307B, 0x82DA, 0x307C,\t0x82DB, 0x307D, 0x82DC, 0x307E, 0x82DD, 0x307F, 0x82DE, 0x3080,\n\t0x82DF, 0x3081, 0x82E0, 0x3082, 0x82E1, 0x3083, 0x82E2, 0x3084,\t0x82E3, 0x3085, 0x82E4, 0x3086, 0x82E5, 0x3087, 0x82E6, 0x3088,\n\t0x82E7, 0x3089, 0x82E8, 0x308A, 0x82E9, 0x308B, 0x82EA, 0x308C,\t0x82EB, 0x308D, 0x82EC, 0x308E, 0x82ED, 0x308F, 0x82EE, 0x3090,\n\t0x82EF, 0x3091, 0x82F0, 0x3092, 0x82F1, 0x3093, 0x8340, 0x30A1,\t0x8341, 0x30A2, 0x8342, 0x30A3, 0x8343, 0x30A4, 0x8344, 0x30A5,\n\t0x8345, 0x30A6, 0x8346, 0x30A7, 0x8347, 0x30A8, 0x8348, 0x30A9,\t0x8349, 0x30AA, 0x834A, 0x30AB, 0x834B, 0x30AC, 0x834C, 0x30AD,\n\t0x834D, 0x30AE, 0x834E, 0x30AF, 0x834F, 0x30B0, 0x8350, 0x30B1,\t0x8351, 0x30B2, 0x8352, 0x30B3, 0x8353, 0x30B4, 0x8354, 0x30B5,\n\t0x8355, 0x30B6, 0x8356, 0x30B7, 0x8357, 0x30B8, 0x8358, 0x30B9,\t0x8359, 0x30BA, 0x835A, 0x30BB, 0x835B, 0x30BC, 0x835C, 0x30BD,\n\t0x835D, 0x30BE, 0x835E, 0x30BF, 0x835F, 0x30C0, 0x8360, 0x30C1,\t0x8361, 0x30C2, 0x8362, 0x30C3, 0x8363, 0x30C4, 0x8364, 0x30C5,\n\t0x8365, 0x30C6, 0x8366, 0x30C7, 0x8367, 0x30C8, 0x8368, 0x30C9,\t0x8369, 0x30CA, 0x836A, 0x30CB, 0x836B, 0x30CC, 0x836C, 0x30CD,\n\t0x836D, 0x30CE, 0x836E, 0x30CF, 0x836F, 0x30D0, 0x8370, 0x30D1,\t0x8371, 0x30D2, 0x8372, 0x30D3, 0x8373, 0x30D4, 0x8374, 0x30D5,\n\t0x8375, 0x30D6, 0x8376, 0x30D7, 0x8377, 0x30D8, 0x8378, 0x30D9,\t0x8379, 0x30DA, 0x837A, 0x30DB, 0x837B, 0x30DC, 0x837C, 0x30DD,\n\t0x837D, 0x30DE, 0x837E, 0x30DF, 0x8380, 0x30E0, 0x8381, 0x30E1,\t0x8382, 0x30E2, 0x8383, 0x30E3, 0x8384, 0x30E4, 0x8385, 0x30E5,\n\t0x8386, 0x30E6, 0x8387, 0x30E7, 0x8388, 0x30E8, 0x8389, 0x30E9,\t0x838A, 0x30EA, 0x838B, 0x30EB, 0x838C, 0x30EC, 0x838D, 0x30ED,\n\t0x838E, 0x30EE, 0x838F, 0x30EF, 0x8390, 0x30F0, 0x8391, 0x30F1,\t0x8392, 0x30F2, 0x8393, 0x30F3, 0x8394, 0x30F4, 0x8395, 0x30F5,\n\t0x8396, 0x30F6, 0x839F, 0x0391, 0x83A0, 0x0392, 0x83A1, 0x0393,\t0x83A2, 0x0394, 0x83A3, 0x0395, 0x83A4, 0x0396, 0x83A5, 0x0397,\n\t0x83A6, 0x0398, 0x83A7, 0x0399, 0x83A8, 0x039A, 0x83A9, 0x039B,\t0x83AA, 0x039C, 0x83AB, 0x039D, 0x83AC, 0x039E, 0x83AD, 0x039F,\n\t0x83AE, 0x03A0, 0x83AF, 0x03A1, 0x83B0, 0x03A3, 0x83B1, 0x03A4,\t0x83B2, 0x03A5, 0x83B3, 0x03A6, 0x83B4, 0x03A7, 0x83B5, 0x03A8,\n\t0x83B6, 0x03A9, 0x83BF, 0x03B1, 0x83C0, 0x03B2, 0x83C1, 0x03B3,\t0x83C2, 0x03B4, 0x83C3, 0x03B5, 0x83C4, 0x03B6, 0x83C5, 0x03B7,\n\t0x83C6, 0x03B8, 0x83C7, 0x03B9, 0x83C8, 0x03BA, 0x83C9, 0x03BB,\t0x83CA, 0x03BC, 0x83CB, 0x03BD, 0x83CC, 0x03BE, 0x83CD, 0x03BF,\n\t0x83CE, 0x03C0, 0x83CF, 0x03C1, 0x83D0, 0x03C3, 0x83D1, 0x03C4,\t0x83D2, 0x03C5, 0x83D3, 0x03C6, 0x83D4, 0x03C7, 0x83D5, 0x03C8,\n\t0x83D6, 0x03C9, 0x8440, 0x0410, 0x8441, 0x0411, 0x8442, 0x0412,\t0x8443, 0x0413, 0x8444, 0x0414, 0x8445, 0x0415, 0x8446, 0x0401,\n\t0x8447, 0x0416, 0x8448, 0x0417, 0x8449, 0x0418, 0x844A, 0x0419,\t0x844B, 0x041A, 0x844C, 0x041B, 0x844D, 0x041C, 0x844E, 0x041D,\n\t0x844F, 0x041E, 0x8450, 0x041F, 0x8451, 0x0420, 0x8452, 0x0421,\t0x8453, 0x0422, 0x8454, 0x0423, 0x8455, 0x0424, 0x8456, 0x0425,\n\t0x8457, 0x0426, 0x8458, 0x0427, 0x8459, 0x0428, 0x845A, 0x0429,\t0x845B, 0x042A, 0x845C, 0x042B, 0x845D, 0x042C, 0x845E, 0x042D,\n\t0x845F, 0x042E, 0x8460, 0x042F, 0x8470, 0x0430, 0x8471, 0x0431,\t0x8472, 0x0432, 0x8473, 0x0433, 0x8474, 0x0434, 0x8475, 0x0435,\n\t0x8476, 0x0451, 0x8477, 0x0436, 0x8478, 0x0437, 0x8479, 0x0438,\t0x847A, 0x0439, 0x847B, 0x043A, 0x847C, 0x043B, 0x847D, 0x043C,\n\t0x847E, 0x043D, 0x8480, 0x043E, 0x8481, 0x043F, 0x8482, 0x0440,\t0x8483, 0x0441, 0x8484, 0x0442, 0x8485, 0x0443, 0x8486, 0x0444,\n\t0x8487, 0x0445, 0x8488, 0x0446, 0x8489, 0x0447, 0x848A, 0x0448,\t0x848B, 0x0449, 0x848C, 0x044A, 0x848D, 0x044B, 0x848E, 0x044C,\n\t0x848F, 0x044D, 0x8490, 0x044E, 0x8491, 0x044F, 0x849F, 0x2500,\t0x84A0, 0x2502, 0x84A1, 0x250C, 0x84A2, 0x2510, 0x84A3, 0x2518,\n\t0x84A4, 0x2514, 0x84A5, 0x251C, 0x84A6, 0x252C, 0x84A7, 0x2524,\t0x84A8, 0x2534, 0x84A9, 0x253C, 0x84AA, 0x2501, 0x84AB, 0x2503,\n\t0x84AC, 0x250F, 0x84AD, 0x2513, 0x84AE, 0x251B, 0x84AF, 0x2517,\t0x84B0, 0x2523, 0x84B1, 0x2533, 0x84B2, 0x252B, 0x84B3, 0x253B,\n\t0x84B4, 0x254B, 0x84B5, 0x2520, 0x84B6, 0x252F, 0x84B7, 0x2528,\t0x84B8, 0x2537, 0x84B9, 0x253F, 0x84BA, 0x251D, 0x84BB, 0x2530,\n\t0x84BC, 0x2525, 0x84BD, 0x2538, 0x84BE, 0x2542, 0x8740, 0x2460,\t0x8741, 0x2461, 0x8742, 0x2462, 0x8743, 0x2463, 0x8744, 0x2464,\n\t0x8745, 0x2465, 0x8746, 0x2466, 0x8747, 0x2467, 0x8748, 0x2468,\t0x8749, 0x2469, 0x874A, 0x246A, 0x874B, 0x246B, 0x874C, 0x246C,\n\t0x874D, 0x246D, 0x874E, 0x246E, 0x874F, 0x246F, 0x8750, 0x2470,\t0x8751, 0x2471, 0x8752, 0x2472, 0x8753, 0x2473, 0x8754, 0x2160,\n\t0x8755, 0x2161, 0x8756, 0x2162, 0x8757, 0x2163, 0x8758, 0x2164,\t0x8759, 0x2165, 0x875A, 0x2166, 0x875B, 0x2167, 0x875C, 0x2168,\n\t0x875D, 0x2169, 0x875F, 0x3349, 0x8760, 0x3314, 0x8761, 0x3322,\t0x8762, 0x334D, 0x8763, 0x3318, 0x8764, 0x3327, 0x8765, 0x3303,\n\t0x8766, 0x3336, 0x8767, 0x3351, 0x8768, 0x3357, 0x8769, 0x330D,\t0x876A, 0x3326, 0x876B, 0x3323, 0x876C, 0x332B, 0x876D, 0x334A,\n\t0x876E, 0x333B, 0x876F, 0x339C, 0x8770, 0x339D, 0x8771, 0x339E,\t0x8772, 0x338E, 0x8773, 0x338F, 0x8774, 0x33C4, 0x8775, 0x33A1,\n\t0x877E, 0x337B, 0x8780, 0x301D, 0x8781, 0x301F, 0x8782, 0x2116,\t0x8783, 0x33CD, 0x8784, 0x2121, 0x8785, 0x32A4, 0x8786, 0x32A5,\n\t0x8787, 0x32A6, 0x8788, 0x32A7, 0x8789, 0x32A8, 0x878A, 0x3231,\t0x878B, 0x3232, 0x878C, 0x3239, 0x878D, 0x337E, 0x878E, 0x337D,\n\t0x878F, 0x337C, 0x8793, 0x222E, 0x8794, 0x2211, 0x8798, 0x221F,\t0x8799, 0x22BF, 0x889F, 0x4E9C, 0x88A0, 0x5516, 0x88A1, 0x5A03,\n\t0x88A2, 0x963F, 0x88A3, 0x54C0, 0x88A4, 0x611B, 0x88A5, 0x6328,\t0x88A6, 0x59F6, 0x88A7, 0x9022, 0x88A8, 0x8475, 0x88A9, 0x831C,\n\t0x88AA, 0x7A50, 0x88AB, 0x60AA, 0x88AC, 0x63E1, 0x88AD, 0x6E25,\t0x88AE, 0x65ED, 0x88AF, 0x8466, 0x88B0, 0x82A6, 0x88B1, 0x9BF5,\n\t0x88B2, 0x6893, 0x88B3, 0x5727, 0x88B4, 0x65A1, 0x88B5, 0x6271,\t0x88B6, 0x5B9B, 0x88B7, 0x59D0, 0x88B8, 0x867B, 0x88B9, 0x98F4,\n\t0x88BA, 0x7D62, 0x88BB, 0x7DBE, 0x88BC, 0x9B8E, 0x88BD, 0x6216,\t0x88BE, 0x7C9F, 0x88BF, 0x88B7, 0x88C0, 0x5B89, 0x88C1, 0x5EB5,\n\t0x88C2, 0x6309, 0x88C3, 0x6697, 0x88C4, 0x6848, 0x88C5, 0x95C7,\t0x88C6, 0x978D, 0x88C7, 0x674F, 0x88C8, 0x4EE5, 0x88C9, 0x4F0A,\n\t0x88CA, 0x4F4D, 0x88CB, 0x4F9D, 0x88CC, 0x5049, 0x88CD, 0x56F2,\t0x88CE, 0x5937, 0x88CF, 0x59D4, 0x88D0, 0x5A01, 0x88D1, 0x5C09,\n\t0x88D2, 0x60DF, 0x88D3, 0x610F, 0x88D4, 0x6170, 0x88D5, 0x6613,\t0x88D6, 0x6905, 0x88D7, 0x70BA, 0x88D8, 0x754F, 0x88D9, 0x7570,\n\t0x88DA, 0x79FB, 0x88DB, 0x7DAD, 0x88DC, 0x7DEF, 0x88DD, 0x80C3,\t0x88DE, 0x840E, 0x88DF, 0x8863, 0x88E0, 0x8B02, 0x88E1, 0x9055,\n\t0x88E2, 0x907A, 0x88E3, 0x533B, 0x88E4, 0x4E95, 0x88E5, 0x4EA5,\t0x88E6, 0x57DF, 0x88E7, 0x80B2, 0x88E8, 0x90C1, 0x88E9, 0x78EF,\n\t0x88EA, 0x4E00, 0x88EB, 0x58F1, 0x88EC, 0x6EA2, 0x88ED, 0x9038,\t0x88EE, 0x7A32, 0x88EF, 0x8328, 0x88F0, 0x828B, 0x88F1, 0x9C2F,\n\t0x88F2, 0x5141, 0x88F3, 0x5370, 0x88F4, 0x54BD, 0x88F5, 0x54E1,\t0x88F6, 0x56E0, 0x88F7, 0x59FB, 0x88F8, 0x5F15, 0x88F9, 0x98F2,\n\t0x88FA, 0x6DEB, 0x88FB, 0x80E4, 0x88FC, 0x852D, 0x8940, 0x9662,\t0x8941, 0x9670, 0x8942, 0x96A0, 0x8943, 0x97FB, 0x8944, 0x540B,\n\t0x8945, 0x53F3, 0x8946, 0x5B87, 0x8947, 0x70CF, 0x8948, 0x7FBD,\t0x8949, 0x8FC2, 0x894A, 0x96E8, 0x894B, 0x536F, 0x894C, 0x9D5C,\n\t0x894D, 0x7ABA, 0x894E, 0x4E11, 0x894F, 0x7893, 0x8950, 0x81FC,\t0x8951, 0x6E26, 0x8952, 0x5618, 0x8953, 0x5504, 0x8954, 0x6B1D,\n\t0x8955, 0x851A, 0x8956, 0x9C3B, 0x8957, 0x59E5, 0x8958, 0x53A9,\t0x8959, 0x6D66, 0x895A, 0x74DC, 0x895B, 0x958F, 0x895C, 0x5642,\n\t0x895D, 0x4E91, 0x895E, 0x904B, 0x895F, 0x96F2, 0x8960, 0x834F,\t0x8961, 0x990C, 0x8962, 0x53E1, 0x8963, 0x55B6, 0x8964, 0x5B30,\n\t0x8965, 0x5F71, 0x8966, 0x6620, 0x8967, 0x66F3, 0x8968, 0x6804,\t0x8969, 0x6C38, 0x896A, 0x6CF3, 0x896B, 0x6D29, 0x896C, 0x745B,\n\t0x896D, 0x76C8, 0x896E, 0x7A4E, 0x896F, 0x9834, 0x8970, 0x82F1,\t0x8971, 0x885B, 0x8972, 0x8A60, 0x8973, 0x92ED, 0x8974, 0x6DB2,\n\t0x8975, 0x75AB, 0x8976, 0x76CA, 0x8977, 0x99C5, 0x8978, 0x60A6,\t0x8979, 0x8B01, 0x897A, 0x8D8A, 0x897B, 0x95B2, 0x897C, 0x698E,\n\t0x897D, 0x53AD, 0x897E, 0x5186, 0x8980, 0x5712, 0x8981, 0x5830,\t0x8982, 0x5944, 0x8983, 0x5BB4, 0x8984, 0x5EF6, 0x8985, 0x6028,\n\t0x8986, 0x63A9, 0x8987, 0x63F4, 0x8988, 0x6CBF, 0x8989, 0x6F14,\t0x898A, 0x708E, 0x898B, 0x7114, 0x898C, 0x7159, 0x898D, 0x71D5,\n\t0x898E, 0x733F, 0x898F, 0x7E01, 0x8990, 0x8276, 0x8991, 0x82D1,\t0x8992, 0x8597, 0x8993, 0x9060, 0x8994, 0x925B, 0x8995, 0x9D1B,\n\t0x8996, 0x5869, 0x8997, 0x65BC, 0x8998, 0x6C5A, 0x8999, 0x7525,\t0x899A, 0x51F9, 0x899B, 0x592E, 0x899C, 0x5965, 0x899D, 0x5F80,\n\t0x899E, 0x5FDC, 0x899F, 0x62BC, 0x89A0, 0x65FA, 0x89A1, 0x6A2A,\t0x89A2, 0x6B27, 0x89A3, 0x6BB4, 0x89A4, 0x738B, 0x89A5, 0x7FC1,\n\t0x89A6, 0x8956, 0x89A7, 0x9D2C, 0x89A8, 0x9D0E, 0x89A9, 0x9EC4,\t0x89AA, 0x5CA1, 0x89AB, 0x6C96, 0x89AC, 0x837B, 0x89AD, 0x5104,\n\t0x89AE, 0x5C4B, 0x89AF, 0x61B6, 0x89B0, 0x81C6, 0x89B1, 0x6876,\t0x89B2, 0x7261, 0x89B3, 0x4E59, 0x89B4, 0x4FFA, 0x89B5, 0x5378,\n\t0x89B6, 0x6069, 0x89B7, 0x6E29, 0x89B8, 0x7A4F, 0x89B9, 0x97F3,\t0x89BA, 0x4E0B, 0x89BB, 0x5316, 0x89BC, 0x4EEE, 0x89BD, 0x4F55,\n\t0x89BE, 0x4F3D, 0x89BF, 0x4FA1, 0x89C0, 0x4F73, 0x89C1, 0x52A0,\t0x89C2, 0x53EF, 0x89C3, 0x5609, 0x89C4, 0x590F, 0x89C5, 0x5AC1,\n\t0x89C6, 0x5BB6, 0x89C7, 0x5BE1, 0x89C8, 0x79D1, 0x89C9, 0x6687,\t0x89CA, 0x679C, 0x89CB, 0x67B6, 0x89CC, 0x6B4C, 0x89CD, 0x6CB3,\n\t0x89CE, 0x706B, 0x89CF, 0x73C2, 0x89D0, 0x798D, 0x89D1, 0x79BE,\t0x89D2, 0x7A3C, 0x89D3, 0x7B87, 0x89D4, 0x82B1, 0x89D5, 0x82DB,\n\t0x89D6, 0x8304, 0x89D7, 0x8377, 0x89D8, 0x83EF, 0x89D9, 0x83D3,\t0x89DA, 0x8766, 0x89DB, 0x8AB2, 0x89DC, 0x5629, 0x89DD, 0x8CA8,\n\t0x89DE, 0x8FE6, 0x89DF, 0x904E, 0x89E0, 0x971E, 0x89E1, 0x868A,\t0x89E2, 0x4FC4, 0x89E3, 0x5CE8, 0x89E4, 0x6211, 0x89E5, 0x7259,\n\t0x89E6, 0x753B, 0x89E7, 0x81E5, 0x89E8, 0x82BD, 0x89E9, 0x86FE,\t0x89EA, 0x8CC0, 0x89EB, 0x96C5, 0x89EC, 0x9913, 0x89ED, 0x99D5,\n\t0x89EE, 0x4ECB, 0x89EF, 0x4F1A, 0x89F0, 0x89E3, 0x89F1, 0x56DE,\t0x89F2, 0x584A, 0x89F3, 0x58CA, 0x89F4, 0x5EFB, 0x89F5, 0x5FEB,\n\t0x89F6, 0x602A, 0x89F7, 0x6094, 0x89F8, 0x6062, 0x89F9, 0x61D0,\t0x89FA, 0x6212, 0x89FB, 0x62D0, 0x89FC, 0x6539, 0x8A40, 0x9B41,\n\t0x8A41, 0x6666, 0x8A42, 0x68B0, 0x8A43, 0x6D77, 0x8A44, 0x7070,\t0x8A45, 0x754C, 0x8A46, 0x7686, 0x8A47, 0x7D75, 0x8A48, 0x82A5,\n\t0x8A49, 0x87F9, 0x8A4A, 0x958B, 0x8A4B, 0x968E, 0x8A4C, 0x8C9D,\t0x8A4D, 0x51F1, 0x8A4E, 0x52BE, 0x8A4F, 0x5916, 0x8A50, 0x54B3,\n\t0x8A51, 0x5BB3, 0x8A52, 0x5D16, 0x8A53, 0x6168, 0x8A54, 0x6982,\t0x8A55, 0x6DAF, 0x8A56, 0x788D, 0x8A57, 0x84CB, 0x8A58, 0x8857,\n\t0x8A59, 0x8A72, 0x8A5A, 0x93A7, 0x8A5B, 0x9AB8, 0x8A5C, 0x6D6C,\t0x8A5D, 0x99A8, 0x8A5E, 0x86D9, 0x8A5F, 0x57A3, 0x8A60, 0x67FF,\n\t0x8A61, 0x86CE, 0x8A62, 0x920E, 0x8A63, 0x5283, 0x8A64, 0x5687,\t0x8A65, 0x5404, 0x8A66, 0x5ED3, 0x8A67, 0x62E1, 0x8A68, 0x64B9,\n\t0x8A69, 0x683C, 0x8A6A, 0x6838, 0x8A6B, 0x6BBB, 0x8A6C, 0x7372,\t0x8A6D, 0x78BA, 0x8A6E, 0x7A6B, 0x8A6F, 0x899A, 0x8A70, 0x89D2,\n\t0x8A71, 0x8D6B, 0x8A72, 0x8F03, 0x8A73, 0x90ED, 0x8A74, 0x95A3,\t0x8A75, 0x9694, 0x8A76, 0x9769, 0x8A77, 0x5B66, 0x8A78, 0x5CB3,\n\t0x8A79, 0x697D, 0x8A7A, 0x984D, 0x8A7B, 0x984E, 0x8A7C, 0x639B,\t0x8A7D, 0x7B20, 0x8A7E, 0x6A2B, 0x8A80, 0x6A7F, 0x8A81, 0x68B6,\n\t0x8A82, 0x9C0D, 0x8A83, 0x6F5F, 0x8A84, 0x5272, 0x8A85, 0x559D,\t0x8A86, 0x6070, 0x8A87, 0x62EC, 0x8A88, 0x6D3B, 0x8A89, 0x6E07,\n\t0x8A8A, 0x6ED1, 0x8A8B, 0x845B, 0x8A8C, 0x8910, 0x8A8D, 0x8F44,\t0x8A8E, 0x4E14, 0x8A8F, 0x9C39, 0x8A90, 0x53F6, 0x8A91, 0x691B,\n\t0x8A92, 0x6A3A, 0x8A93, 0x9784, 0x8A94, 0x682A, 0x8A95, 0x515C,\t0x8A96, 0x7AC3, 0x8A97, 0x84B2, 0x8A98, 0x91DC, 0x8A99, 0x938C,\n\t0x8A9A, 0x565B, 0x8A9B, 0x9D28, 0x8A9C, 0x6822, 0x8A9D, 0x8305,\t0x8A9E, 0x8431, 0x8A9F, 0x7CA5, 0x8AA0, 0x5208, 0x8AA1, 0x82C5,\n\t0x8AA2, 0x74E6, 0x8AA3, 0x4E7E, 0x8AA4, 0x4F83, 0x8AA5, 0x51A0,\t0x8AA6, 0x5BD2, 0x8AA7, 0x520A, 0x8AA8, 0x52D8, 0x8AA9, 0x52E7,\n\t0x8AAA, 0x5DFB, 0x8AAB, 0x559A, 0x8AAC, 0x582A, 0x8AAD, 0x59E6,\t0x8AAE, 0x5B8C, 0x8AAF, 0x5B98, 0x8AB0, 0x5BDB, 0x8AB1, 0x5E72,\n\t0x8AB2, 0x5E79, 0x8AB3, 0x60A3, 0x8AB4, 0x611F, 0x8AB5, 0x6163,\t0x8AB6, 0x61BE, 0x8AB7, 0x63DB, 0x8AB8, 0x6562, 0x8AB9, 0x67D1,\n\t0x8ABA, 0x6853, 0x8ABB, 0x68FA, 0x8ABC, 0x6B3E, 0x8ABD, 0x6B53,\t0x8ABE, 0x6C57, 0x8ABF, 0x6F22, 0x8AC0, 0x6F97, 0x8AC1, 0x6F45,\n\t0x8AC2, 0x74B0, 0x8AC3, 0x7518, 0x8AC4, 0x76E3, 0x8AC5, 0x770B,\t0x8AC6, 0x7AFF, 0x8AC7, 0x7BA1, 0x8AC8, 0x7C21, 0x8AC9, 0x7DE9,\n\t0x8ACA, 0x7F36, 0x8ACB, 0x7FF0, 0x8ACC, 0x809D, 0x8ACD, 0x8266,\t0x8ACE, 0x839E, 0x8ACF, 0x89B3, 0x8AD0, 0x8ACC, 0x8AD1, 0x8CAB,\n\t0x8AD2, 0x9084, 0x8AD3, 0x9451, 0x8AD4, 0x9593, 0x8AD5, 0x9591,\t0x8AD6, 0x95A2, 0x8AD7, 0x9665, 0x8AD8, 0x97D3, 0x8AD9, 0x9928,\n\t0x8ADA, 0x8218, 0x8ADB, 0x4E38, 0x8ADC, 0x542B, 0x8ADD, 0x5CB8,\t0x8ADE, 0x5DCC, 0x8ADF, 0x73A9, 0x8AE0, 0x764C, 0x8AE1, 0x773C,\n\t0x8AE2, 0x5CA9, 0x8AE3, 0x7FEB, 0x8AE4, 0x8D0B, 0x8AE5, 0x96C1,\t0x8AE6, 0x9811, 0x8AE7, 0x9854, 0x8AE8, 0x9858, 0x8AE9, 0x4F01,\n\t0x8AEA, 0x4F0E, 0x8AEB, 0x5371, 0x8AEC, 0x559C, 0x8AED, 0x5668,\t0x8AEE, 0x57FA, 0x8AEF, 0x5947, 0x8AF0, 0x5B09, 0x8AF1, 0x5BC4,\n\t0x8AF2, 0x5C90, 0x8AF3, 0x5E0C, 0x8AF4, 0x5E7E, 0x8AF5, 0x5FCC,\t0x8AF6, 0x63EE, 0x8AF7, 0x673A, 0x8AF8, 0x65D7, 0x8AF9, 0x65E2,\n\t0x8AFA, 0x671F, 0x8AFB, 0x68CB, 0x8AFC, 0x68C4, 0x8B40, 0x6A5F,\t0x8B41, 0x5E30, 0x8B42, 0x6BC5, 0x8B43, 0x6C17, 0x8B44, 0x6C7D,\n\t0x8B45, 0x757F, 0x8B46, 0x7948, 0x8B47, 0x5B63, 0x8B48, 0x7A00,\t0x8B49, 0x7D00, 0x8B4A, 0x5FBD, 0x8B4B, 0x898F, 0x8B4C, 0x8A18,\n\t0x8B4D, 0x8CB4, 0x8B4E, 0x8D77, 0x8B4F, 0x8ECC, 0x8B50, 0x8F1D,\t0x8B51, 0x98E2, 0x8B52, 0x9A0E, 0x8B53, 0x9B3C, 0x8B54, 0x4E80,\n\t0x8B55, 0x507D, 0x8B56, 0x5100, 0x8B57, 0x5993, 0x8B58, 0x5B9C,\t0x8B59, 0x622F, 0x8B5A, 0x6280, 0x8B5B, 0x64EC, 0x8B5C, 0x6B3A,\n\t0x8B5D, 0x72A0, 0x8B5E, 0x7591, 0x8B5F, 0x7947, 0x8B60, 0x7FA9,\t0x8B61, 0x87FB, 0x8B62, 0x8ABC, 0x8B63, 0x8B70, 0x8B64, 0x63AC,\n\t0x8B65, 0x83CA, 0x8B66, 0x97A0, 0x8B67, 0x5409, 0x8B68, 0x5403,\t0x8B69, 0x55AB, 0x8B6A, 0x6854, 0x8B6B, 0x6A58, 0x8B6C, 0x8A70,\n\t0x8B6D, 0x7827, 0x8B6E, 0x6775, 0x8B6F, 0x9ECD, 0x8B70, 0x5374,\t0x8B71, 0x5BA2, 0x8B72, 0x811A, 0x8B73, 0x8650, 0x8B74, 0x9006,\n\t0x8B75, 0x4E18, 0x8B76, 0x4E45, 0x8B77, 0x4EC7, 0x8B78, 0x4F11,\t0x8B79, 0x53CA, 0x8B7A, 0x5438, 0x8B7B, 0x5BAE, 0x8B7C, 0x5F13,\n\t0x8B7D, 0x6025, 0x8B7E, 0x6551, 0x8B80, 0x673D, 0x8B81, 0x6C42,\t0x8B82, 0x6C72, 0x8B83, 0x6CE3, 0x8B84, 0x7078, 0x8B85, 0x7403,\n\t0x8B86, 0x7A76, 0x8B87, 0x7AAE, 0x8B88, 0x7B08, 0x8B89, 0x7D1A,\t0x8B8A, 0x7CFE, 0x8B8B, 0x7D66, 0x8B8C, 0x65E7, 0x8B8D, 0x725B,\n\t0x8B8E, 0x53BB, 0x8B8F, 0x5C45, 0x8B90, 0x5DE8, 0x8B91, 0x62D2,\t0x8B92, 0x62E0, 0x8B93, 0x6319, 0x8B94, 0x6E20, 0x8B95, 0x865A,\n\t0x8B96, 0x8A31, 0x8B97, 0x8DDD, 0x8B98, 0x92F8, 0x8B99, 0x6F01,\t0x8B9A, 0x79A6, 0x8B9B, 0x9B5A, 0x8B9C, 0x4EA8, 0x8B9D, 0x4EAB,\n\t0x8B9E, 0x4EAC, 0x8B9F, 0x4F9B, 0x8BA0, 0x4FA0, 0x8BA1, 0x50D1,\t0x8BA2, 0x5147, 0x8BA3, 0x7AF6, 0x8BA4, 0x5171, 0x8BA5, 0x51F6,\n\t0x8BA6, 0x5354, 0x8BA7, 0x5321, 0x8BA8, 0x537F, 0x8BA9, 0x53EB,\t0x8BAA, 0x55AC, 0x8BAB, 0x5883, 0x8BAC, 0x5CE1, 0x8BAD, 0x5F37,\n\t0x8BAE, 0x5F4A, 0x8BAF, 0x602F, 0x8BB0, 0x6050, 0x8BB1, 0x606D,\t0x8BB2, 0x631F, 0x8BB3, 0x6559, 0x8BB4, 0x6A4B, 0x8BB5, 0x6CC1,\n\t0x8BB6, 0x72C2, 0x8BB7, 0x72ED, 0x8BB8, 0x77EF, 0x8BB9, 0x80F8,\t0x8BBA, 0x8105, 0x8BBB, 0x8208, 0x8BBC, 0x854E, 0x8BBD, 0x90F7,\n\t0x8BBE, 0x93E1, 0x8BBF, 0x97FF, 0x8BC0, 0x9957, 0x8BC1, 0x9A5A,\t0x8BC2, 0x4EF0, 0x8BC3, 0x51DD, 0x8BC4, 0x5C2D, 0x8BC5, 0x6681,\n\t0x8BC6, 0x696D, 0x8BC7, 0x5C40, 0x8BC8, 0x66F2, 0x8BC9, 0x6975,\t0x8BCA, 0x7389, 0x8BCB, 0x6850, 0x8BCC, 0x7C81, 0x8BCD, 0x50C5,\n\t0x8BCE, 0x52E4, 0x8BCF, 0x5747, 0x8BD0, 0x5DFE, 0x8BD1, 0x9326,\t0x8BD2, 0x65A4, 0x8BD3, 0x6B23, 0x8BD4, 0x6B3D, 0x8BD5, 0x7434,\n\t0x8BD6, 0x7981, 0x8BD7, 0x79BD, 0x8BD8, 0x7B4B, 0x8BD9, 0x7DCA,\t0x8BDA, 0x82B9, 0x8BDB, 0x83CC, 0x8BDC, 0x887F, 0x8BDD, 0x895F,\n\t0x8BDE, 0x8B39, 0x8BDF, 0x8FD1, 0x8BE0, 0x91D1, 0x8BE1, 0x541F,\t0x8BE2, 0x9280, 0x8BE3, 0x4E5D, 0x8BE4, 0x5036, 0x8BE5, 0x53E5,\n\t0x8BE6, 0x533A, 0x8BE7, 0x72D7, 0x8BE8, 0x7396, 0x8BE9, 0x77E9,\t0x8BEA, 0x82E6, 0x8BEB, 0x8EAF, 0x8BEC, 0x99C6, 0x8BED, 0x99C8,\n\t0x8BEE, 0x99D2, 0x8BEF, 0x5177, 0x8BF0, 0x611A, 0x8BF1, 0x865E,\t0x8BF2, 0x55B0, 0x8BF3, 0x7A7A, 0x8BF4, 0x5076, 0x8BF5, 0x5BD3,\n\t0x8BF6, 0x9047, 0x8BF7, 0x9685, 0x8BF8, 0x4E32, 0x8BF9, 0x6ADB,\t0x8BFA, 0x91E7, 0x8BFB, 0x5C51, 0x8BFC, 0x5C48, 0x8C40, 0x6398,\n\t0x8C41, 0x7A9F, 0x8C42, 0x6C93, 0x8C43, 0x9774, 0x8C44, 0x8F61,\t0x8C45, 0x7AAA, 0x8C46, 0x718A, 0x8C47, 0x9688, 0x8C48, 0x7C82,\n\t0x8C49, 0x6817, 0x8C4A, 0x7E70, 0x8C4B, 0x6851, 0x8C4C, 0x936C,\t0x8C4D, 0x52F2, 0x8C4E, 0x541B, 0x8C4F, 0x85AB, 0x8C50, 0x8A13,\n\t0x8C51, 0x7FA4, 0x8C52, 0x8ECD, 0x8C53, 0x90E1, 0x8C54, 0x5366,\t0x8C55, 0x8888, 0x8C56, 0x7941, 0x8C57, 0x4FC2, 0x8C58, 0x50BE,\n\t0x8C59, 0x5211, 0x8C5A, 0x5144, 0x8C5B, 0x5553, 0x8C5C, 0x572D,\t0x8C5D, 0x73EA, 0x8C5E, 0x578B, 0x8C5F, 0x5951, 0x8C60, 0x5F62,\n\t0x8C61, 0x5F84, 0x8C62, 0x6075, 0x8C63, 0x6176, 0x8C64, 0x6167,\t0x8C65, 0x61A9, 0x8C66, 0x63B2, 0x8C67, 0x643A, 0x8C68, 0x656C,\n\t0x8C69, 0x666F, 0x8C6A, 0x6842, 0x8C6B, 0x6E13, 0x8C6C, 0x7566,\t0x8C6D, 0x7A3D, 0x8C6E, 0x7CFB, 0x8C6F, 0x7D4C, 0x8C70, 0x7D99,\n\t0x8C71, 0x7E4B, 0x8C72, 0x7F6B, 0x8C73, 0x830E, 0x8C74, 0x834A,\t0x8C75, 0x86CD, 0x8C76, 0x8A08, 0x8C77, 0x8A63, 0x8C78, 0x8B66,\n\t0x8C79, 0x8EFD, 0x8C7A, 0x981A, 0x8C7B, 0x9D8F, 0x8C7C, 0x82B8,\t0x8C7D, 0x8FCE, 0x8C7E, 0x9BE8, 0x8C80, 0x5287, 0x8C81, 0x621F,\n\t0x8C82, 0x6483, 0x8C83, 0x6FC0, 0x8C84, 0x9699, 0x8C85, 0x6841,\t0x8C86, 0x5091, 0x8C87, 0x6B20, 0x8C88, 0x6C7A, 0x8C89, 0x6F54,\n\t0x8C8A, 0x7A74, 0x8C8B, 0x7D50, 0x8C8C, 0x8840, 0x8C8D, 0x8A23,\t0x8C8E, 0x6708, 0x8C8F, 0x4EF6, 0x8C90, 0x5039, 0x8C91, 0x5026,\n\t0x8C92, 0x5065, 0x8C93, 0x517C, 0x8C94, 0x5238, 0x8C95, 0x5263,\t0x8C96, 0x55A7, 0x8C97, 0x570F, 0x8C98, 0x5805, 0x8C99, 0x5ACC,\n\t0x8C9A, 0x5EFA, 0x8C9B, 0x61B2, 0x8C9C, 0x61F8, 0x8C9D, 0x62F3,\t0x8C9E, 0x6372, 0x8C9F, 0x691C, 0x8CA0, 0x6A29, 0x8CA1, 0x727D,\n\t0x8CA2, 0x72AC, 0x8CA3, 0x732E, 0x8CA4, 0x7814, 0x8CA5, 0x786F,\t0x8CA6, 0x7D79, 0x8CA7, 0x770C, 0x8CA8, 0x80A9, 0x8CA9, 0x898B,\n\t0x8CAA, 0x8B19, 0x8CAB, 0x8CE2, 0x8CAC, 0x8ED2, 0x8CAD, 0x9063,\t0x8CAE, 0x9375, 0x8CAF, 0x967A, 0x8CB0, 0x9855, 0x8CB1, 0x9A13,\n\t0x8CB2, 0x9E78, 0x8CB3, 0x5143, 0x8CB4, 0x539F, 0x8CB5, 0x53B3,\t0x8CB6, 0x5E7B, 0x8CB7, 0x5F26, 0x8CB8, 0x6E1B, 0x8CB9, 0x6E90,\n\t0x8CBA, 0x7384, 0x8CBB, 0x73FE, 0x8CBC, 0x7D43, 0x8CBD, 0x8237,\t0x8CBE, 0x8A00, 0x8CBF, 0x8AFA, 0x8CC0, 0x9650, 0x8CC1, 0x4E4E,\n\t0x8CC2, 0x500B, 0x8CC3, 0x53E4, 0x8CC4, 0x547C, 0x8CC5, 0x56FA,\t0x8CC6, 0x59D1, 0x8CC7, 0x5B64, 0x8CC8, 0x5DF1, 0x8CC9, 0x5EAB,\n\t0x8CCA, 0x5F27, 0x8CCB, 0x6238, 0x8CCC, 0x6545, 0x8CCD, 0x67AF,\t0x8CCE, 0x6E56, 0x8CCF, 0x72D0, 0x8CD0, 0x7CCA, 0x8CD1, 0x88B4,\n\t0x8CD2, 0x80A1, 0x8CD3, 0x80E1, 0x8CD4, 0x83F0, 0x8CD5, 0x864E,\t0x8CD6, 0x8A87, 0x8CD7, 0x8DE8, 0x8CD8, 0x9237, 0x8CD9, 0x96C7,\n\t0x8CDA, 0x9867, 0x8CDB, 0x9F13, 0x8CDC, 0x4E94, 0x8CDD, 0x4E92,\t0x8CDE, 0x4F0D, 0x8CDF, 0x5348, 0x8CE0, 0x5449, 0x8CE1, 0x543E,\n\t0x8CE2, 0x5A2F, 0x8CE3, 0x5F8C, 0x8CE4, 0x5FA1, 0x8CE5, 0x609F,\t0x8CE6, 0x68A7, 0x8CE7, 0x6A8E, 0x8CE8, 0x745A, 0x8CE9, 0x7881,\n\t0x8CEA, 0x8A9E, 0x8CEB, 0x8AA4, 0x8CEC, 0x8B77, 0x8CED, 0x9190,\t0x8CEE, 0x4E5E, 0x8CEF, 0x9BC9, 0x8CF0, 0x4EA4, 0x8CF1, 0x4F7C,\n\t0x8CF2, 0x4FAF, 0x8CF3, 0x5019, 0x8CF4, 0x5016, 0x8CF5, 0x5149,\t0x8CF6, 0x516C, 0x8CF7, 0x529F, 0x8CF8, 0x52B9, 0x8CF9, 0x52FE,\n\t0x8CFA, 0x539A, 0x8CFB, 0x53E3, 0x8CFC, 0x5411, 0x8D40, 0x540E,\t0x8D41, 0x5589, 0x8D42, 0x5751, 0x8D43, 0x57A2, 0x8D44, 0x597D,\n\t0x8D45, 0x5B54, 0x8D46, 0x5B5D, 0x8D47, 0x5B8F, 0x8D48, 0x5DE5,\t0x8D49, 0x5DE7, 0x8D4A, 0x5DF7, 0x8D4B, 0x5E78, 0x8D4C, 0x5E83,\n\t0x8D4D, 0x5E9A, 0x8D4E, 0x5EB7, 0x8D4F, 0x5F18, 0x8D50, 0x6052,\t0x8D51, 0x614C, 0x8D52, 0x6297, 0x8D53, 0x62D8, 0x8D54, 0x63A7,\n\t0x8D55, 0x653B, 0x8D56, 0x6602, 0x8D57, 0x6643, 0x8D58, 0x66F4,\t0x8D59, 0x676D, 0x8D5A, 0x6821, 0x8D5B, 0x6897, 0x8D5C, 0x69CB,\n\t0x8D5D, 0x6C5F, 0x8D5E, 0x6D2A, 0x8D5F, 0x6D69, 0x8D60, 0x6E2F,\t0x8D61, 0x6E9D, 0x8D62, 0x7532, 0x8D63, 0x7687, 0x8D64, 0x786C,\n\t0x8D65, 0x7A3F, 0x8D66, 0x7CE0, 0x8D67, 0x7D05, 0x8D68, 0x7D18,\t0x8D69, 0x7D5E, 0x8D6A, 0x7DB1, 0x8D6B, 0x8015, 0x8D6C, 0x8003,\n\t0x8D6D, 0x80AF, 0x8D6E, 0x80B1, 0x8D6F, 0x8154, 0x8D70, 0x818F,\t0x8D71, 0x822A, 0x8D72, 0x8352, 0x8D73, 0x884C, 0x8D74, 0x8861,\n\t0x8D75, 0x8B1B, 0x8D76, 0x8CA2, 0x8D77, 0x8CFC, 0x8D78, 0x90CA,\t0x8D79, 0x9175, 0x8D7A, 0x9271, 0x8D7B, 0x783F, 0x8D7C, 0x92FC,\n\t0x8D7D, 0x95A4, 0x8D7E, 0x964D, 0x8D80, 0x9805, 0x8D81, 0x9999,\t0x8D82, 0x9AD8, 0x8D83, 0x9D3B, 0x8D84, 0x525B, 0x8D85, 0x52AB,\n\t0x8D86, 0x53F7, 0x8D87, 0x5408, 0x8D88, 0x58D5, 0x8D89, 0x62F7,\t0x8D8A, 0x6FE0, 0x8D8B, 0x8C6A, 0x8D8C, 0x8F5F, 0x8D8D, 0x9EB9,\n\t0x8D8E, 0x514B, 0x8D8F, 0x523B, 0x8D90, 0x544A, 0x8D91, 0x56FD,\t0x8D92, 0x7A40, 0x8D93, 0x9177, 0x8D94, 0x9D60, 0x8D95, 0x9ED2,\n\t0x8D96, 0x7344, 0x8D97, 0x6F09, 0x8D98, 0x8170, 0x8D99, 0x7511,\t0x8D9A, 0x5FFD, 0x8D9B, 0x60DA, 0x8D9C, 0x9AA8, 0x8D9D, 0x72DB,\n\t0x8D9E, 0x8FBC, 0x8D9F, 0x6B64, 0x8DA0, 0x9803, 0x8DA1, 0x4ECA,\t0x8DA2, 0x56F0, 0x8DA3, 0x5764, 0x8DA4, 0x58BE, 0x8DA5, 0x5A5A,\n\t0x8DA6, 0x6068, 0x8DA7, 0x61C7, 0x8DA8, 0x660F, 0x8DA9, 0x6606,\t0x8DAA, 0x6839, 0x8DAB, 0x68B1, 0x8DAC, 0x6DF7, 0x8DAD, 0x75D5,\n\t0x8DAE, 0x7D3A, 0x8DAF, 0x826E, 0x8DB0, 0x9B42, 0x8DB1, 0x4E9B,\t0x8DB2, 0x4F50, 0x8DB3, 0x53C9, 0x8DB4, 0x5506, 0x8DB5, 0x5D6F,\n\t0x8DB6, 0x5DE6, 0x8DB7, 0x5DEE, 0x8DB8, 0x67FB, 0x8DB9, 0x6C99,\t0x8DBA, 0x7473, 0x8DBB, 0x7802, 0x8DBC, 0x8A50, 0x8DBD, 0x9396,\n\t0x8DBE, 0x88DF, 0x8DBF, 0x5750, 0x8DC0, 0x5EA7, 0x8DC1, 0x632B,\t0x8DC2, 0x50B5, 0x8DC3, 0x50AC, 0x8DC4, 0x518D, 0x8DC5, 0x6700,\n\t0x8DC6, 0x54C9, 0x8DC7, 0x585E, 0x8DC8, 0x59BB, 0x8DC9, 0x5BB0,\t0x8DCA, 0x5F69, 0x8DCB, 0x624D, 0x8DCC, 0x63A1, 0x8DCD, 0x683D,\n\t0x8DCE, 0x6B73, 0x8DCF, 0x6E08, 0x8DD0, 0x707D, 0x8DD1, 0x91C7,\t0x8DD2, 0x7280, 0x8DD3, 0x7815, 0x8DD4, 0x7826, 0x8DD5, 0x796D,\n\t0x8DD6, 0x658E, 0x8DD7, 0x7D30, 0x8DD8, 0x83DC, 0x8DD9, 0x88C1,\t0x8DDA, 0x8F09, 0x8DDB, 0x969B, 0x8DDC, 0x5264, 0x8DDD, 0x5728,\n\t0x8DDE, 0x6750, 0x8DDF, 0x7F6A, 0x8DE0, 0x8CA1, 0x8DE1, 0x51B4,\t0x8DE2, 0x5742, 0x8DE3, 0x962A, 0x8DE4, 0x583A, 0x8DE5, 0x698A,\n\t0x8DE6, 0x80B4, 0x8DE7, 0x54B2, 0x8DE8, 0x5D0E, 0x8DE9, 0x57FC,\t0x8DEA, 0x7895, 0x8DEB, 0x9DFA, 0x8DEC, 0x4F5C, 0x8DED, 0x524A,\n\t0x8DEE, 0x548B, 0x8DEF, 0x643E, 0x8DF0, 0x6628, 0x8DF1, 0x6714,\t0x8DF2, 0x67F5, 0x8DF3, 0x7A84, 0x8DF4, 0x7B56, 0x8DF5, 0x7D22,\n\t0x8DF6, 0x932F, 0x8DF7, 0x685C, 0x8DF8, 0x9BAD, 0x8DF9, 0x7B39,\t0x8DFA, 0x5319, 0x8DFB, 0x518A, 0x8DFC, 0x5237, 0x8E40, 0x5BDF,\n\t0x8E41, 0x62F6, 0x8E42, 0x64AE, 0x8E43, 0x64E6, 0x8E44, 0x672D,\t0x8E45, 0x6BBA, 0x8E46, 0x85A9, 0x8E47, 0x96D1, 0x8E48, 0x7690,\n\t0x8E49, 0x9BD6, 0x8E4A, 0x634C, 0x8E4B, 0x9306, 0x8E4C, 0x9BAB,\t0x8E4D, 0x76BF, 0x8E4E, 0x6652, 0x8E4F, 0x4E09, 0x8E50, 0x5098,\n\t0x8E51, 0x53C2, 0x8E52, 0x5C71, 0x8E53, 0x60E8, 0x8E54, 0x6492,\t0x8E55, 0x6563, 0x8E56, 0x685F, 0x8E57, 0x71E6, 0x8E58, 0x73CA,\n\t0x8E59, 0x7523, 0x8E5A, 0x7B97, 0x8E5B, 0x7E82, 0x8E5C, 0x8695,\t0x8E5D, 0x8B83, 0x8E5E, 0x8CDB, 0x8E5F, 0x9178, 0x8E60, 0x9910,\n\t0x8E61, 0x65AC, 0x8E62, 0x66AB, 0x8E63, 0x6B8B, 0x8E64, 0x4ED5,\t0x8E65, 0x4ED4, 0x8E66, 0x4F3A, 0x8E67, 0x4F7F, 0x8E68, 0x523A,\n\t0x8E69, 0x53F8, 0x8E6A, 0x53F2, 0x8E6B, 0x55E3, 0x8E6C, 0x56DB,\t0x8E6D, 0x58EB, 0x8E6E, 0x59CB, 0x8E6F, 0x59C9, 0x8E70, 0x59FF,\n\t0x8E71, 0x5B50, 0x8E72, 0x5C4D, 0x8E73, 0x5E02, 0x8E74, 0x5E2B,\t0x8E75, 0x5FD7, 0x8E76, 0x601D, 0x8E77, 0x6307, 0x8E78, 0x652F,\n\t0x8E79, 0x5B5C, 0x8E7A, 0x65AF, 0x8E7B, 0x65BD, 0x8E7C, 0x65E8,\t0x8E7D, 0x679D, 0x8E7E, 0x6B62, 0x8E80, 0x6B7B, 0x8E81, 0x6C0F,\n\t0x8E82, 0x7345, 0x8E83, 0x7949, 0x8E84, 0x79C1, 0x8E85, 0x7CF8,\t0x8E86, 0x7D19, 0x8E87, 0x7D2B, 0x8E88, 0x80A2, 0x8E89, 0x8102,\n\t0x8E8A, 0x81F3, 0x8E8B, 0x8996, 0x8E8C, 0x8A5E, 0x8E8D, 0x8A69,\t0x8E8E, 0x8A66, 0x8E8F, 0x8A8C, 0x8E90, 0x8AEE, 0x8E91, 0x8CC7,\n\t0x8E92, 0x8CDC, 0x8E93, 0x96CC, 0x8E94, 0x98FC, 0x8E95, 0x6B6F,\t0x8E96, 0x4E8B, 0x8E97, 0x4F3C, 0x8E98, 0x4F8D, 0x8E99, 0x5150,\n\t0x8E9A, 0x5B57, 0x8E9B, 0x5BFA, 0x8E9C, 0x6148, 0x8E9D, 0x6301,\t0x8E9E, 0x6642, 0x8E9F, 0x6B21, 0x8EA0, 0x6ECB, 0x8EA1, 0x6CBB,\n\t0x8EA2, 0x723E, 0x8EA3, 0x74BD, 0x8EA4, 0x75D4, 0x8EA5, 0x78C1,\t0x8EA6, 0x793A, 0x8EA7, 0x800C, 0x8EA8, 0x8033, 0x8EA9, 0x81EA,\n\t0x8EAA, 0x8494, 0x8EAB, 0x8F9E, 0x8EAC, 0x6C50, 0x8EAD, 0x9E7F,\t0x8EAE, 0x5F0F, 0x8EAF, 0x8B58, 0x8EB0, 0x9D2B, 0x8EB1, 0x7AFA,\n\t0x8EB2, 0x8EF8, 0x8EB3, 0x5B8D, 0x8EB4, 0x96EB, 0x8EB5, 0x4E03,\t0x8EB6, 0x53F1, 0x8EB7, 0x57F7, 0x8EB8, 0x5931, 0x8EB9, 0x5AC9,\n\t0x8EBA, 0x5BA4, 0x8EBB, 0x6089, 0x8EBC, 0x6E7F, 0x8EBD, 0x6F06,\t0x8EBE, 0x75BE, 0x8EBF, 0x8CEA, 0x8EC0, 0x5B9F, 0x8EC1, 0x8500,\n\t0x8EC2, 0x7BE0, 0x8EC3, 0x5072, 0x8EC4, 0x67F4, 0x8EC5, 0x829D,\t0x8EC6, 0x5C61, 0x8EC7, 0x854A, 0x8EC8, 0x7E1E, 0x8EC9, 0x820E,\n\t0x8ECA, 0x5199, 0x8ECB, 0x5C04, 0x8ECC, 0x6368, 0x8ECD, 0x8D66,\t0x8ECE, 0x659C, 0x8ECF, 0x716E, 0x8ED0, 0x793E, 0x8ED1, 0x7D17,\n\t0x8ED2, 0x8005, 0x8ED3, 0x8B1D, 0x8ED4, 0x8ECA, 0x8ED5, 0x906E,\t0x8ED6, 0x86C7, 0x8ED7, 0x90AA, 0x8ED8, 0x501F, 0x8ED9, 0x52FA,\n\t0x8EDA, 0x5C3A, 0x8EDB, 0x6753, 0x8EDC, 0x707C, 0x8EDD, 0x7235,\t0x8EDE, 0x914C, 0x8EDF, 0x91C8, 0x8EE0, 0x932B, 0x8EE1, 0x82E5,\n\t0x8EE2, 0x5BC2, 0x8EE3, 0x5F31, 0x8EE4, 0x60F9, 0x8EE5, 0x4E3B,\t0x8EE6, 0x53D6, 0x8EE7, 0x5B88, 0x8EE8, 0x624B, 0x8EE9, 0x6731,\n\t0x8EEA, 0x6B8A, 0x8EEB, 0x72E9, 0x8EEC, 0x73E0, 0x8EED, 0x7A2E,\t0x8EEE, 0x816B, 0x8EEF, 0x8DA3, 0x8EF0, 0x9152, 0x8EF1, 0x9996,\n\t0x8EF2, 0x5112, 0x8EF3, 0x53D7, 0x8EF4, 0x546A, 0x8EF5, 0x5BFF,\t0x8EF6, 0x6388, 0x8EF7, 0x6A39, 0x8EF8, 0x7DAC, 0x8EF9, 0x9700,\n\t0x8EFA, 0x56DA, 0x8EFB, 0x53CE, 0x8EFC, 0x5468, 0x8F40, 0x5B97,\t0x8F41, 0x5C31, 0x8F42, 0x5DDE, 0x8F43, 0x4FEE, 0x8F44, 0x6101,\n\t0x8F45, 0x62FE, 0x8F46, 0x6D32, 0x8F47, 0x79C0, 0x8F48, 0x79CB,\t0x8F49, 0x7D42, 0x8F4A, 0x7E4D, 0x8F4B, 0x7FD2, 0x8F4C, 0x81ED,\n\t0x8F4D, 0x821F, 0x8F4E, 0x8490, 0x8F4F, 0x8846, 0x8F50, 0x8972,\t0x8F51, 0x8B90, 0x8F52, 0x8E74, 0x8F53, 0x8F2F, 0x8F54, 0x9031,\n\t0x8F55, 0x914B, 0x8F56, 0x916C, 0x8F57, 0x96C6, 0x8F58, 0x919C,\t0x8F59, 0x4EC0, 0x8F5A, 0x4F4F, 0x8F5B, 0x5145, 0x8F5C, 0x5341,\n\t0x8F5D, 0x5F93, 0x8F5E, 0x620E, 0x8F5F, 0x67D4, 0x8F60, 0x6C41,\t0x8F61, 0x6E0B, 0x8F62, 0x7363, 0x8F63, 0x7E26, 0x8F64, 0x91CD,\n\t0x8F65, 0x9283, 0x8F66, 0x53D4, 0x8F67, 0x5919, 0x8F68, 0x5BBF,\t0x8F69, 0x6DD1, 0x8F6A, 0x795D, 0x8F6B, 0x7E2E, 0x8F6C, 0x7C9B,\n\t0x8F6D, 0x587E, 0x8F6E, 0x719F, 0x8F6F, 0x51FA, 0x8F70, 0x8853,\t0x8F71, 0x8FF0, 0x8F72, 0x4FCA, 0x8F73, 0x5CFB, 0x8F74, 0x6625,\n\t0x8F75, 0x77AC, 0x8F76, 0x7AE3, 0x8F77, 0x821C, 0x8F78, 0x99FF,\t0x8F79, 0x51C6, 0x8F7A, 0x5FAA, 0x8F7B, 0x65EC, 0x8F7C, 0x696F,\n\t0x8F7D, 0x6B89, 0x8F7E, 0x6DF3, 0x8F80, 0x6E96, 0x8F81, 0x6F64,\t0x8F82, 0x76FE, 0x8F83, 0x7D14, 0x8F84, 0x5DE1, 0x8F85, 0x9075,\n\t0x8F86, 0x9187, 0x8F87, 0x9806, 0x8F88, 0x51E6, 0x8F89, 0x521D,\t0x8F8A, 0x6240, 0x8F8B, 0x6691, 0x8F8C, 0x66D9, 0x8F8D, 0x6E1A,\n\t0x8F8E, 0x5EB6, 0x8F8F, 0x7DD2, 0x8F90, 0x7F72, 0x8F91, 0x66F8,\t0x8F92, 0x85AF, 0x8F93, 0x85F7, 0x8F94, 0x8AF8, 0x8F95, 0x52A9,\n\t0x8F96, 0x53D9, 0x8F97, 0x5973, 0x8F98, 0x5E8F, 0x8F99, 0x5F90,\t0x8F9A, 0x6055, 0x8F9B, 0x92E4, 0x8F9C, 0x9664, 0x8F9D, 0x50B7,\n\t0x8F9E, 0x511F, 0x8F9F, 0x52DD, 0x8FA0, 0x5320, 0x8FA1, 0x5347,\t0x8FA2, 0x53EC, 0x8FA3, 0x54E8, 0x8FA4, 0x5546, 0x8FA5, 0x5531,\n\t0x8FA6, 0x5617, 0x8FA7, 0x5968, 0x8FA8, 0x59BE, 0x8FA9, 0x5A3C,\t0x8FAA, 0x5BB5, 0x8FAB, 0x5C06, 0x8FAC, 0x5C0F, 0x8FAD, 0x5C11,\n\t0x8FAE, 0x5C1A, 0x8FAF, 0x5E84, 0x8FB0, 0x5E8A, 0x8FB1, 0x5EE0,\t0x8FB2, 0x5F70, 0x8FB3, 0x627F, 0x8FB4, 0x6284, 0x8FB5, 0x62DB,\n\t0x8FB6, 0x638C, 0x8FB7, 0x6377, 0x8FB8, 0x6607, 0x8FB9, 0x660C,\t0x8FBA, 0x662D, 0x8FBB, 0x6676, 0x8FBC, 0x677E, 0x8FBD, 0x68A2,\n\t0x8FBE, 0x6A1F, 0x8FBF, 0x6A35, 0x8FC0, 0x6CBC, 0x8FC1, 0x6D88,\t0x8FC2, 0x6E09, 0x8FC3, 0x6E58, 0x8FC4, 0x713C, 0x8FC5, 0x7126,\n\t0x8FC6, 0x7167, 0x8FC7, 0x75C7, 0x8FC8, 0x7701, 0x8FC9, 0x785D,\t0x8FCA, 0x7901, 0x8FCB, 0x7965, 0x8FCC, 0x79F0, 0x8FCD, 0x7AE0,\n\t0x8FCE, 0x7B11, 0x8FCF, 0x7CA7, 0x8FD0, 0x7D39, 0x8FD1, 0x8096,\t0x8FD2, 0x83D6, 0x8FD3, 0x848B, 0x8FD4, 0x8549, 0x8FD5, 0x885D,\n\t0x8FD6, 0x88F3, 0x8FD7, 0x8A1F, 0x8FD8, 0x8A3C, 0x8FD9, 0x8A54,\t0x8FDA, 0x8A73, 0x8FDB, 0x8C61, 0x8FDC, 0x8CDE, 0x8FDD, 0x91A4,\n\t0x8FDE, 0x9266, 0x8FDF, 0x937E, 0x8FE0, 0x9418, 0x8FE1, 0x969C,\t0x8FE2, 0x9798, 0x8FE3, 0x4E0A, 0x8FE4, 0x4E08, 0x8FE5, 0x4E1E,\n\t0x8FE6, 0x4E57, 0x8FE7, 0x5197, 0x8FE8, 0x5270, 0x8FE9, 0x57CE,\t0x8FEA, 0x5834, 0x8FEB, 0x58CC, 0x8FEC, 0x5B22, 0x8FED, 0x5E38,\n\t0x8FEE, 0x60C5, 0x8FEF, 0x64FE, 0x8FF0, 0x6761, 0x8FF1, 0x6756,\t0x8FF2, 0x6D44, 0x8FF3, 0x72B6, 0x8FF4, 0x7573, 0x8FF5, 0x7A63,\n\t0x8FF6, 0x84B8, 0x8FF7, 0x8B72, 0x8FF8, 0x91B8, 0x8FF9, 0x9320,\t0x8FFA, 0x5631, 0x8FFB, 0x57F4, 0x8FFC, 0x98FE, 0x9040, 0x62ED,\n\t0x9041, 0x690D, 0x9042, 0x6B96, 0x9043, 0x71ED, 0x9044, 0x7E54,\t0x9045, 0x8077, 0x9046, 0x8272, 0x9047, 0x89E6, 0x9048, 0x98DF,\n\t0x9049, 0x8755, 0x904A, 0x8FB1, 0x904B, 0x5C3B, 0x904C, 0x4F38,\t0x904D, 0x4FE1, 0x904E, 0x4FB5, 0x904F, 0x5507, 0x9050, 0x5A20,\n\t0x9051, 0x5BDD, 0x9052, 0x5BE9, 0x9053, 0x5FC3, 0x9054, 0x614E,\t0x9055, 0x632F, 0x9056, 0x65B0, 0x9057, 0x664B, 0x9058, 0x68EE,\n\t0x9059, 0x699B, 0x905A, 0x6D78, 0x905B, 0x6DF1, 0x905C, 0x7533,\t0x905D, 0x75B9, 0x905E, 0x771F, 0x905F, 0x795E, 0x9060, 0x79E6,\n\t0x9061, 0x7D33, 0x9062, 0x81E3, 0x9063, 0x82AF, 0x9064, 0x85AA,\t0x9065, 0x89AA, 0x9066, 0x8A3A, 0x9067, 0x8EAB, 0x9068, 0x8F9B,\n\t0x9069, 0x9032, 0x906A, 0x91DD, 0x906B, 0x9707, 0x906C, 0x4EBA,\t0x906D, 0x4EC1, 0x906E, 0x5203, 0x906F, 0x5875, 0x9070, 0x58EC,\n\t0x9071, 0x5C0B, 0x9072, 0x751A, 0x9073, 0x5C3D, 0x9074, 0x814E,\t0x9075, 0x8A0A, 0x9076, 0x8FC5, 0x9077, 0x9663, 0x9078, 0x976D,\n\t0x9079, 0x7B25, 0x907A, 0x8ACF, 0x907B, 0x9808, 0x907C, 0x9162,\t0x907D, 0x56F3, 0x907E, 0x53A8, 0x9080, 0x9017, 0x9081, 0x5439,\n\t0x9082, 0x5782, 0x9083, 0x5E25, 0x9084, 0x63A8, 0x9085, 0x6C34,\t0x9086, 0x708A, 0x9087, 0x7761, 0x9088, 0x7C8B, 0x9089, 0x7FE0,\n\t0x908A, 0x8870, 0x908B, 0x9042, 0x908C, 0x9154, 0x908D, 0x9310,\t0x908E, 0x9318, 0x908F, 0x968F, 0x9090, 0x745E, 0x9091, 0x9AC4,\n\t0x9092, 0x5D07, 0x9093, 0x5D69, 0x9094, 0x6570, 0x9095, 0x67A2,\t0x9096, 0x8DA8, 0x9097, 0x96DB, 0x9098, 0x636E, 0x9099, 0x6749,\n\t0x909A, 0x6919, 0x909B, 0x83C5, 0x909C, 0x9817, 0x909D, 0x96C0,\t0x909E, 0x88FE, 0x909F, 0x6F84, 0x90A0, 0x647A, 0x90A1, 0x5BF8,\n\t0x90A2, 0x4E16, 0x90A3, 0x702C, 0x90A4, 0x755D, 0x90A5, 0x662F,\t0x90A6, 0x51C4, 0x90A7, 0x5236, 0x90A8, 0x52E2, 0x90A9, 0x59D3,\n\t0x90AA, 0x5F81, 0x90AB, 0x6027, 0x90AC, 0x6210, 0x90AD, 0x653F,\t0x90AE, 0x6574, 0x90AF, 0x661F, 0x90B0, 0x6674, 0x90B1, 0x68F2,\n\t0x90B2, 0x6816, 0x90B3, 0x6B63, 0x90B4, 0x6E05, 0x90B5, 0x7272,\t0x90B6, 0x751F, 0x90B7, 0x76DB, 0x90B8, 0x7CBE, 0x90B9, 0x8056,\n\t0x90BA, 0x58F0, 0x90BB, 0x88FD, 0x90BC, 0x897F, 0x90BD, 0x8AA0,\t0x90BE, 0x8A93, 0x90BF, 0x8ACB, 0x90C0, 0x901D, 0x90C1, 0x9192,\n\t0x90C2, 0x9752, 0x90C3, 0x9759, 0x90C4, 0x6589, 0x90C5, 0x7A0E,\t0x90C6, 0x8106, 0x90C7, 0x96BB, 0x90C8, 0x5E2D, 0x90C9, 0x60DC,\n\t0x90CA, 0x621A, 0x90CB, 0x65A5, 0x90CC, 0x6614, 0x90CD, 0x6790,\t0x90CE, 0x77F3, 0x90CF, 0x7A4D, 0x90D0, 0x7C4D, 0x90D1, 0x7E3E,\n\t0x90D2, 0x810A, 0x90D3, 0x8CAC, 0x90D4, 0x8D64, 0x90D5, 0x8DE1,\t0x90D6, 0x8E5F, 0x90D7, 0x78A9, 0x90D8, 0x5207, 0x90D9, 0x62D9,\n\t0x90DA, 0x63A5, 0x90DB, 0x6442, 0x90DC, 0x6298, 0x90DD, 0x8A2D,\t0x90DE, 0x7A83, 0x90DF, 0x7BC0, 0x90E0, 0x8AAC, 0x90E1, 0x96EA,\n\t0x90E2, 0x7D76, 0x90E3, 0x820C, 0x90E4, 0x8749, 0x90E5, 0x4ED9,\t0x90E6, 0x5148, 0x90E7, 0x5343, 0x90E8, 0x5360, 0x90E9, 0x5BA3,\n\t0x90EA, 0x5C02, 0x90EB, 0x5C16, 0x90EC, 0x5DDD, 0x90ED, 0x6226,\t0x90EE, 0x6247, 0x90EF, 0x64B0, 0x90F0, 0x6813, 0x90F1, 0x6834,\n\t0x90F2, 0x6CC9, 0x90F3, 0x6D45, 0x90F4, 0x6D17, 0x90F5, 0x67D3,\t0x90F6, 0x6F5C, 0x90F7, 0x714E, 0x90F8, 0x717D, 0x90F9, 0x65CB,\n\t0x90FA, 0x7A7F, 0x90FB, 0x7BAD, 0x90FC, 0x7DDA, 0x9140, 0x7E4A,\t0x9141, 0x7FA8, 0x9142, 0x817A, 0x9143, 0x821B, 0x9144, 0x8239,\n\t0x9145, 0x85A6, 0x9146, 0x8A6E, 0x9147, 0x8CCE, 0x9148, 0x8DF5,\t0x9149, 0x9078, 0x914A, 0x9077, 0x914B, 0x92AD, 0x914C, 0x9291,\n\t0x914D, 0x9583, 0x914E, 0x9BAE, 0x914F, 0x524D, 0x9150, 0x5584,\t0x9151, 0x6F38, 0x9152, 0x7136, 0x9153, 0x5168, 0x9154, 0x7985,\n\t0x9155, 0x7E55, 0x9156, 0x81B3, 0x9157, 0x7CCE, 0x9158, 0x564C,\t0x9159, 0x5851, 0x915A, 0x5CA8, 0x915B, 0x63AA, 0x915C, 0x66FE,\n\t0x915D, 0x66FD, 0x915E, 0x695A, 0x915F, 0x72D9, 0x9160, 0x758F,\t0x9161, 0x758E, 0x9162, 0x790E, 0x9163, 0x7956, 0x9164, 0x79DF,\n\t0x9165, 0x7C97, 0x9166, 0x7D20, 0x9167, 0x7D44, 0x9168, 0x8607,\t0x9169, 0x8A34, 0x916A, 0x963B, 0x916B, 0x9061, 0x916C, 0x9F20,\n\t0x916D, 0x50E7, 0x916E, 0x5275, 0x916F, 0x53CC, 0x9170, 0x53E2,\t0x9171, 0x5009, 0x9172, 0x55AA, 0x9173, 0x58EE, 0x9174, 0x594F,\n\t0x9175, 0x723D, 0x9176, 0x5B8B, 0x9177, 0x5C64, 0x9178, 0x531D,\t0x9179, 0x60E3, 0x917A, 0x60F3, 0x917B, 0x635C, 0x917C, 0x6383,\n\t0x917D, 0x633F, 0x917E, 0x63BB, 0x9180, 0x64CD, 0x9181, 0x65E9,\t0x9182, 0x66F9, 0x9183, 0x5DE3, 0x9184, 0x69CD, 0x9185, 0x69FD,\n\t0x9186, 0x6F15, 0x9187, 0x71E5, 0x9188, 0x4E89, 0x9189, 0x75E9,\t0x918A, 0x76F8, 0x918B, 0x7A93, 0x918C, 0x7CDF, 0x918D, 0x7DCF,\n\t0x918E, 0x7D9C, 0x918F, 0x8061, 0x9190, 0x8349, 0x9191, 0x8358,\t0x9192, 0x846C, 0x9193, 0x84BC, 0x9194, 0x85FB, 0x9195, 0x88C5,\n\t0x9196, 0x8D70, 0x9197, 0x9001, 0x9198, 0x906D, 0x9199, 0x9397,\t0x919A, 0x971C, 0x919B, 0x9A12, 0x919C, 0x50CF, 0x919D, 0x5897,\n\t0x919E, 0x618E, 0x919F, 0x81D3, 0x91A0, 0x8535, 0x91A1, 0x8D08,\t0x91A2, 0x9020, 0x91A3, 0x4FC3, 0x91A4, 0x5074, 0x91A5, 0x5247,\n\t0x91A6, 0x5373, 0x91A7, 0x606F, 0x91A8, 0x6349, 0x91A9, 0x675F,\t0x91AA, 0x6E2C, 0x91AB, 0x8DB3, 0x91AC, 0x901F, 0x91AD, 0x4FD7,\n\t0x91AE, 0x5C5E, 0x91AF, 0x8CCA, 0x91B0, 0x65CF, 0x91B1, 0x7D9A,\t0x91B2, 0x5352, 0x91B3, 0x8896, 0x91B4, 0x5176, 0x91B5, 0x63C3,\n\t0x91B6, 0x5B58, 0x91B7, 0x5B6B, 0x91B8, 0x5C0A, 0x91B9, 0x640D,\t0x91BA, 0x6751, 0x91BB, 0x905C, 0x91BC, 0x4ED6, 0x91BD, 0x591A,\n\t0x91BE, 0x592A, 0x91BF, 0x6C70, 0x91C0, 0x8A51, 0x91C1, 0x553E,\t0x91C2, 0x5815, 0x91C3, 0x59A5, 0x91C4, 0x60F0, 0x91C5, 0x6253,\n\t0x91C6, 0x67C1, 0x91C7, 0x8235, 0x91C8, 0x6955, 0x91C9, 0x9640,\t0x91CA, 0x99C4, 0x91CB, 0x9A28, 0x91CC, 0x4F53, 0x91CD, 0x5806,\n\t0x91CE, 0x5BFE, 0x91CF, 0x8010, 0x91D0, 0x5CB1, 0x91D1, 0x5E2F,\t0x91D2, 0x5F85, 0x91D3, 0x6020, 0x91D4, 0x614B, 0x91D5, 0x6234,\n\t0x91D6, 0x66FF, 0x91D7, 0x6CF0, 0x91D8, 0x6EDE, 0x91D9, 0x80CE,\t0x91DA, 0x817F, 0x91DB, 0x82D4, 0x91DC, 0x888B, 0x91DD, 0x8CB8,\n\t0x91DE, 0x9000, 0x91DF, 0x902E, 0x91E0, 0x968A, 0x91E1, 0x9EDB,\t0x91E2, 0x9BDB, 0x91E3, 0x4EE3, 0x91E4, 0x53F0, 0x91E5, 0x5927,\n\t0x91E6, 0x7B2C, 0x91E7, 0x918D, 0x91E8, 0x984C, 0x91E9, 0x9DF9,\t0x91EA, 0x6EDD, 0x91EB, 0x7027, 0x91EC, 0x5353, 0x91ED, 0x5544,\n\t0x91EE, 0x5B85, 0x91EF, 0x6258, 0x91F0, 0x629E, 0x91F1, 0x62D3,\t0x91F2, 0x6CA2, 0x91F3, 0x6FEF, 0x91F4, 0x7422, 0x91F5, 0x8A17,\n\t0x91F6, 0x9438, 0x91F7, 0x6FC1, 0x91F8, 0x8AFE, 0x91F9, 0x8338,\t0x91FA, 0x51E7, 0x91FB, 0x86F8, 0x91FC, 0x53EA, 0x9240, 0x53E9,\n\t0x9241, 0x4F46, 0x9242, 0x9054, 0x9243, 0x8FB0, 0x9244, 0x596A,\t0x9245, 0x8131, 0x9246, 0x5DFD, 0x9247, 0x7AEA, 0x9248, 0x8FBF,\n\t0x9249, 0x68DA, 0x924A, 0x8C37, 0x924B, 0x72F8, 0x924C, 0x9C48,\t0x924D, 0x6A3D, 0x924E, 0x8AB0, 0x924F, 0x4E39, 0x9250, 0x5358,\n\t0x9251, 0x5606, 0x9252, 0x5766, 0x9253, 0x62C5, 0x9254, 0x63A2,\t0x9255, 0x65E6, 0x9256, 0x6B4E, 0x9257, 0x6DE1, 0x9258, 0x6E5B,\n\t0x9259, 0x70AD, 0x925A, 0x77ED, 0x925B, 0x7AEF, 0x925C, 0x7BAA,\t0x925D, 0x7DBB, 0x925E, 0x803D, 0x925F, 0x80C6, 0x9260, 0x86CB,\n\t0x9261, 0x8A95, 0x9262, 0x935B, 0x9263, 0x56E3, 0x9264, 0x58C7,\t0x9265, 0x5F3E, 0x9266, 0x65AD, 0x9267, 0x6696, 0x9268, 0x6A80,\n\t0x9269, 0x6BB5, 0x926A, 0x7537, 0x926B, 0x8AC7, 0x926C, 0x5024,\t0x926D, 0x77E5, 0x926E, 0x5730, 0x926F, 0x5F1B, 0x9270, 0x6065,\n\t0x9271, 0x667A, 0x9272, 0x6C60, 0x9273, 0x75F4, 0x9274, 0x7A1A,\t0x9275, 0x7F6E, 0x9276, 0x81F4, 0x9277, 0x8718, 0x9278, 0x9045,\n\t0x9279, 0x99B3, 0x927A, 0x7BC9, 0x927B, 0x755C, 0x927C, 0x7AF9,\t0x927D, 0x7B51, 0x927E, 0x84C4, 0x9280, 0x9010, 0x9281, 0x79E9,\n\t0x9282, 0x7A92, 0x9283, 0x8336, 0x9284, 0x5AE1, 0x9285, 0x7740,\t0x9286, 0x4E2D, 0x9287, 0x4EF2, 0x9288, 0x5B99, 0x9289, 0x5FE0,\n\t0x928A, 0x62BD, 0x928B, 0x663C, 0x928C, 0x67F1, 0x928D, 0x6CE8,\t0x928E, 0x866B, 0x928F, 0x8877, 0x9290, 0x8A3B, 0x9291, 0x914E,\n\t0x9292, 0x92F3, 0x9293, 0x99D0, 0x9294, 0x6A17, 0x9295, 0x7026,\t0x9296, 0x732A, 0x9297, 0x82E7, 0x9298, 0x8457, 0x9299, 0x8CAF,\n\t0x929A, 0x4E01, 0x929B, 0x5146, 0x929C, 0x51CB, 0x929D, 0x558B,\t0x929E, 0x5BF5, 0x929F, 0x5E16, 0x92A0, 0x5E33, 0x92A1, 0x5E81,\n\t0x92A2, 0x5F14, 0x92A3, 0x5F35, 0x92A4, 0x5F6B, 0x92A5, 0x5FB4,\t0x92A6, 0x61F2, 0x92A7, 0x6311, 0x92A8, 0x66A2, 0x92A9, 0x671D,\n\t0x92AA, 0x6F6E, 0x92AB, 0x7252, 0x92AC, 0x753A, 0x92AD, 0x773A,\t0x92AE, 0x8074, 0x92AF, 0x8139, 0x92B0, 0x8178, 0x92B1, 0x8776,\n\t0x92B2, 0x8ABF, 0x92B3, 0x8ADC, 0x92B4, 0x8D85, 0x92B5, 0x8DF3,\t0x92B6, 0x929A, 0x92B7, 0x9577, 0x92B8, 0x9802, 0x92B9, 0x9CE5,\n\t0x92BA, 0x52C5, 0x92BB, 0x6357, 0x92BC, 0x76F4, 0x92BD, 0x6715,\t0x92BE, 0x6C88, 0x92BF, 0x73CD, 0x92C0, 0x8CC3, 0x92C1, 0x93AE,\n\t0x92C2, 0x9673, 0x92C3, 0x6D25, 0x92C4, 0x589C, 0x92C5, 0x690E,\t0x92C6, 0x69CC, 0x92C7, 0x8FFD, 0x92C8, 0x939A, 0x92C9, 0x75DB,\n\t0x92CA, 0x901A, 0x92CB, 0x585A, 0x92CC, 0x6802, 0x92CD, 0x63B4,\t0x92CE, 0x69FB, 0x92CF, 0x4F43, 0x92D0, 0x6F2C, 0x92D1, 0x67D8,\n\t0x92D2, 0x8FBB, 0x92D3, 0x8526, 0x92D4, 0x7DB4, 0x92D5, 0x9354,\t0x92D6, 0x693F, 0x92D7, 0x6F70, 0x92D8, 0x576A, 0x92D9, 0x58F7,\n\t0x92DA, 0x5B2C, 0x92DB, 0x7D2C, 0x92DC, 0x722A, 0x92DD, 0x540A,\t0x92DE, 0x91E3, 0x92DF, 0x9DB4, 0x92E0, 0x4EAD, 0x92E1, 0x4F4E,\n\t0x92E2, 0x505C, 0x92E3, 0x5075, 0x92E4, 0x5243, 0x92E5, 0x8C9E,\t0x92E6, 0x5448, 0x92E7, 0x5824, 0x92E8, 0x5B9A, 0x92E9, 0x5E1D,\n\t0x92EA, 0x5E95, 0x92EB, 0x5EAD, 0x92EC, 0x5EF7, 0x92ED, 0x5F1F,\t0x92EE, 0x608C, 0x92EF, 0x62B5, 0x92F0, 0x633A, 0x92F1, 0x63D0,\n\t0x92F2, 0x68AF, 0x92F3, 0x6C40, 0x92F4, 0x7887, 0x92F5, 0x798E,\t0x92F6, 0x7A0B, 0x92F7, 0x7DE0, 0x92F8, 0x8247, 0x92F9, 0x8A02,\n\t0x92FA, 0x8AE6, 0x92FB, 0x8E44, 0x92FC, 0x9013, 0x9340, 0x90B8,\t0x9341, 0x912D, 0x9342, 0x91D8, 0x9343, 0x9F0E, 0x9344, 0x6CE5,\n\t0x9345, 0x6458, 0x9346, 0x64E2, 0x9347, 0x6575, 0x9348, 0x6EF4,\t0x9349, 0x7684, 0x934A, 0x7B1B, 0x934B, 0x9069, 0x934C, 0x93D1,\n\t0x934D, 0x6EBA, 0x934E, 0x54F2, 0x934F, 0x5FB9, 0x9350, 0x64A4,\t0x9351, 0x8F4D, 0x9352, 0x8FED, 0x9353, 0x9244, 0x9354, 0x5178,\n\t0x9355, 0x586B, 0x9356, 0x5929, 0x9357, 0x5C55, 0x9358, 0x5E97,\t0x9359, 0x6DFB, 0x935A, 0x7E8F, 0x935B, 0x751C, 0x935C, 0x8CBC,\n\t0x935D, 0x8EE2, 0x935E, 0x985B, 0x935F, 0x70B9, 0x9360, 0x4F1D,\t0x9361, 0x6BBF, 0x9362, 0x6FB1, 0x9363, 0x7530, 0x9364, 0x96FB,\n\t0x9365, 0x514E, 0x9366, 0x5410, 0x9367, 0x5835, 0x9368, 0x5857,\t0x9369, 0x59AC, 0x936A, 0x5C60, 0x936B, 0x5F92, 0x936C, 0x6597,\n\t0x936D, 0x675C, 0x936E, 0x6E21, 0x936F, 0x767B, 0x9370, 0x83DF,\t0x9371, 0x8CED, 0x9372, 0x9014, 0x9373, 0x90FD, 0x9374, 0x934D,\n\t0x9375, 0x7825, 0x9376, 0x783A, 0x9377, 0x52AA, 0x9378, 0x5EA6,\t0x9379, 0x571F, 0x937A, 0x5974, 0x937B, 0x6012, 0x937C, 0x5012,\n\t0x937D, 0x515A, 0x937E, 0x51AC, 0x9380, 0x51CD, 0x9381, 0x5200,\t0x9382, 0x5510, 0x9383, 0x5854, 0x9384, 0x5858, 0x9385, 0x5957,\n\t0x9386, 0x5B95, 0x9387, 0x5CF6, 0x9388, 0x5D8B, 0x9389, 0x60BC,\t0x938A, 0x6295, 0x938B, 0x642D, 0x938C, 0x6771, 0x938D, 0x6843,\n\t0x938E, 0x68BC, 0x938F, 0x68DF, 0x9390, 0x76D7, 0x9391, 0x6DD8,\t0x9392, 0x6E6F, 0x9393, 0x6D9B, 0x9394, 0x706F, 0x9395, 0x71C8,\n\t0x9396, 0x5F53, 0x9397, 0x75D8, 0x9398, 0x7977, 0x9399, 0x7B49,\t0x939A, 0x7B54, 0x939B, 0x7B52, 0x939C, 0x7CD6, 0x939D, 0x7D71,\n\t0x939E, 0x5230, 0x939F, 0x8463, 0x93A0, 0x8569, 0x93A1, 0x85E4,\t0x93A2, 0x8A0E, 0x93A3, 0x8B04, 0x93A4, 0x8C46, 0x93A5, 0x8E0F,\n\t0x93A6, 0x9003, 0x93A7, 0x900F, 0x93A8, 0x9419, 0x93A9, 0x9676,\t0x93AA, 0x982D, 0x93AB, 0x9A30, 0x93AC, 0x95D8, 0x93AD, 0x50CD,\n\t0x93AE, 0x52D5, 0x93AF, 0x540C, 0x93B0, 0x5802, 0x93B1, 0x5C0E,\t0x93B2, 0x61A7, 0x93B3, 0x649E, 0x93B4, 0x6D1E, 0x93B5, 0x77B3,\n\t0x93B6, 0x7AE5, 0x93B7, 0x80F4, 0x93B8, 0x8404, 0x93B9, 0x9053,\t0x93BA, 0x9285, 0x93BB, 0x5CE0, 0x93BC, 0x9D07, 0x93BD, 0x533F,\n\t0x93BE, 0x5F97, 0x93BF, 0x5FB3, 0x93C0, 0x6D9C, 0x93C1, 0x7279,\t0x93C2, 0x7763, 0x93C3, 0x79BF, 0x93C4, 0x7BE4, 0x93C5, 0x6BD2,\n\t0x93C6, 0x72EC, 0x93C7, 0x8AAD, 0x93C8, 0x6803, 0x93C9, 0x6A61,\t0x93CA, 0x51F8, 0x93CB, 0x7A81, 0x93CC, 0x6934, 0x93CD, 0x5C4A,\n\t0x93CE, 0x9CF6, 0x93CF, 0x82EB, 0x93D0, 0x5BC5, 0x93D1, 0x9149,\t0x93D2, 0x701E, 0x93D3, 0x5678, 0x93D4, 0x5C6F, 0x93D5, 0x60C7,\n\t0x93D6, 0x6566, 0x93D7, 0x6C8C, 0x93D8, 0x8C5A, 0x93D9, 0x9041,\t0x93DA, 0x9813, 0x93DB, 0x5451, 0x93DC, 0x66C7, 0x93DD, 0x920D,\n\t0x93DE, 0x5948, 0x93DF, 0x90A3, 0x93E0, 0x5185, 0x93E1, 0x4E4D,\t0x93E2, 0x51EA, 0x93E3, 0x8599, 0x93E4, 0x8B0E, 0x93E5, 0x7058,\n\t0x93E6, 0x637A, 0x93E7, 0x934B, 0x93E8, 0x6962, 0x93E9, 0x99B4,\t0x93EA, 0x7E04, 0x93EB, 0x7577, 0x93EC, 0x5357, 0x93ED, 0x6960,\n\t0x93EE, 0x8EDF, 0x93EF, 0x96E3, 0x93F0, 0x6C5D, 0x93F1, 0x4E8C,\t0x93F2, 0x5C3C, 0x93F3, 0x5F10, 0x93F4, 0x8FE9, 0x93F5, 0x5302,\n\t0x93F6, 0x8CD1, 0x93F7, 0x8089, 0x93F8, 0x8679, 0x93F9, 0x5EFF,\t0x93FA, 0x65E5, 0x93FB, 0x4E73, 0x93FC, 0x5165, 0x9440, 0x5982,\n\t0x9441, 0x5C3F, 0x9442, 0x97EE, 0x9443, 0x4EFB, 0x9444, 0x598A,\t0x9445, 0x5FCD, 0x9446, 0x8A8D, 0x9447, 0x6FE1, 0x9448, 0x79B0,\n\t0x9449, 0x7962, 0x944A, 0x5BE7, 0x944B, 0x8471, 0x944C, 0x732B,\t0x944D, 0x71B1, 0x944E, 0x5E74, 0x944F, 0x5FF5, 0x9450, 0x637B,\n\t0x9451, 0x649A, 0x9452, 0x71C3, 0x9453, 0x7C98, 0x9454, 0x4E43,\t0x9455, 0x5EFC, 0x9456, 0x4E4B, 0x9457, 0x57DC, 0x9458, 0x56A2,\n\t0x9459, 0x60A9, 0x945A, 0x6FC3, 0x945B, 0x7D0D, 0x945C, 0x80FD,\t0x945D, 0x8133, 0x945E, 0x81BF, 0x945F, 0x8FB2, 0x9460, 0x8997,\n\t0x9461, 0x86A4, 0x9462, 0x5DF4, 0x9463, 0x628A, 0x9464, 0x64AD,\t0x9465, 0x8987, 0x9466, 0x6777, 0x9467, 0x6CE2, 0x9468, 0x6D3E,\n\t0x9469, 0x7436, 0x946A, 0x7834, 0x946B, 0x5A46, 0x946C, 0x7F75,\t0x946D, 0x82AD, 0x946E, 0x99AC, 0x946F, 0x4FF3, 0x9470, 0x5EC3,\n\t0x9471, 0x62DD, 0x9472, 0x6392, 0x9473, 0x6557, 0x9474, 0x676F,\t0x9475, 0x76C3, 0x9476, 0x724C, 0x9477, 0x80CC, 0x9478, 0x80BA,\n\t0x9479, 0x8F29, 0x947A, 0x914D, 0x947B, 0x500D, 0x947C, 0x57F9,\t0x947D, 0x5A92, 0x947E, 0x6885, 0x9480, 0x6973, 0x9481, 0x7164,\n\t0x9482, 0x72FD, 0x9483, 0x8CB7, 0x9484, 0x58F2, 0x9485, 0x8CE0,\t0x9486, 0x966A, 0x9487, 0x9019, 0x9488, 0x877F, 0x9489, 0x79E4,\n\t0x948A, 0x77E7, 0x948B, 0x8429, 0x948C, 0x4F2F, 0x948D, 0x5265,\t0x948E, 0x535A, 0x948F, 0x62CD, 0x9490, 0x67CF, 0x9491, 0x6CCA,\n\t0x9492, 0x767D, 0x9493, 0x7B94, 0x9494, 0x7C95, 0x9495, 0x8236,\t0x9496, 0x8584, 0x9497, 0x8FEB, 0x9498, 0x66DD, 0x9499, 0x6F20,\n\t0x949A, 0x7206, 0x949B, 0x7E1B, 0x949C, 0x83AB, 0x949D, 0x99C1,\t0x949E, 0x9EA6, 0x949F, 0x51FD, 0x94A0, 0x7BB1, 0x94A1, 0x7872,\n\t0x94A2, 0x7BB8, 0x94A3, 0x8087, 0x94A4, 0x7B48, 0x94A5, 0x6AE8,\t0x94A6, 0x5E61, 0x94A7, 0x808C, 0x94A8, 0x7551, 0x94A9, 0x7560,\n\t0x94AA, 0x516B, 0x94AB, 0x9262, 0x94AC, 0x6E8C, 0x94AD, 0x767A,\t0x94AE, 0x9197, 0x94AF, 0x9AEA, 0x94B0, 0x4F10, 0x94B1, 0x7F70,\n\t0x94B2, 0x629C, 0x94B3, 0x7B4F, 0x94B4, 0x95A5, 0x94B5, 0x9CE9,\t0x94B6, 0x567A, 0x94B7, 0x5859, 0x94B8, 0x86E4, 0x94B9, 0x96BC,\n\t0x94BA, 0x4F34, 0x94BB, 0x5224, 0x94BC, 0x534A, 0x94BD, 0x53CD,\t0x94BE, 0x53DB, 0x94BF, 0x5E06, 0x94C0, 0x642C, 0x94C1, 0x6591,\n\t0x94C2, 0x677F, 0x94C3, 0x6C3E, 0x94C4, 0x6C4E, 0x94C5, 0x7248,\t0x94C6, 0x72AF, 0x94C7, 0x73ED, 0x94C8, 0x7554, 0x94C9, 0x7E41,\n\t0x94CA, 0x822C, 0x94CB, 0x85E9, 0x94CC, 0x8CA9, 0x94CD, 0x7BC4,\t0x94CE, 0x91C6, 0x94CF, 0x7169, 0x94D0, 0x9812, 0x94D1, 0x98EF,\n\t0x94D2, 0x633D, 0x94D3, 0x6669, 0x94D4, 0x756A, 0x94D5, 0x76E4,\t0x94D6, 0x78D0, 0x94D7, 0x8543, 0x94D8, 0x86EE, 0x94D9, 0x532A,\n\t0x94DA, 0x5351, 0x94DB, 0x5426, 0x94DC, 0x5983, 0x94DD, 0x5E87,\t0x94DE, 0x5F7C, 0x94DF, 0x60B2, 0x94E0, 0x6249, 0x94E1, 0x6279,\n\t0x94E2, 0x62AB, 0x94E3, 0x6590, 0x94E4, 0x6BD4, 0x94E5, 0x6CCC,\t0x94E6, 0x75B2, 0x94E7, 0x76AE, 0x94E8, 0x7891, 0x94E9, 0x79D8,\n\t0x94EA, 0x7DCB, 0x94EB, 0x7F77, 0x94EC, 0x80A5, 0x94ED, 0x88AB,\t0x94EE, 0x8AB9, 0x94EF, 0x8CBB, 0x94F0, 0x907F, 0x94F1, 0x975E,\n\t0x94F2, 0x98DB, 0x94F3, 0x6A0B, 0x94F4, 0x7C38, 0x94F5, 0x5099,\t0x94F6, 0x5C3E, 0x94F7, 0x5FAE, 0x94F8, 0x6787, 0x94F9, 0x6BD8,\n\t0x94FA, 0x7435, 0x94FB, 0x7709, 0x94FC, 0x7F8E, 0x9540, 0x9F3B,\t0x9541, 0x67CA, 0x9542, 0x7A17, 0x9543, 0x5339, 0x9544, 0x758B,\n\t0x9545, 0x9AED, 0x9546, 0x5F66, 0x9547, 0x819D, 0x9548, 0x83F1,\t0x9549, 0x8098, 0x954A, 0x5F3C, 0x954B, 0x5FC5, 0x954C, 0x7562,\n\t0x954D, 0x7B46, 0x954E, 0x903C, 0x954F, 0x6867, 0x9550, 0x59EB,\t0x9551, 0x5A9B, 0x9552, 0x7D10, 0x9553, 0x767E, 0x9554, 0x8B2C,\n\t0x9555, 0x4FF5, 0x9556, 0x5F6A, 0x9557, 0x6A19, 0x9558, 0x6C37,\t0x9559, 0x6F02, 0x955A, 0x74E2, 0x955B, 0x7968, 0x955C, 0x8868,\n\t0x955D, 0x8A55, 0x955E, 0x8C79, 0x955F, 0x5EDF, 0x9560, 0x63CF,\t0x9561, 0x75C5, 0x9562, 0x79D2, 0x9563, 0x82D7, 0x9564, 0x9328,\n\t0x9565, 0x92F2, 0x9566, 0x849C, 0x9567, 0x86ED, 0x9568, 0x9C2D,\t0x9569, 0x54C1, 0x956A, 0x5F6C, 0x956B, 0x658C, 0x956C, 0x6D5C,\n\t0x956D, 0x7015, 0x956E, 0x8CA7, 0x956F, 0x8CD3, 0x9570, 0x983B,\t0x9571, 0x654F, 0x9572, 0x74F6, 0x9573, 0x4E0D, 0x9574, 0x4ED8,\n\t0x9575, 0x57E0, 0x9576, 0x592B, 0x9577, 0x5A66, 0x9578, 0x5BCC,\t0x9579, 0x51A8, 0x957A, 0x5E03, 0x957B, 0x5E9C, 0x957C, 0x6016,\n\t0x957D, 0x6276, 0x957E, 0x6577, 0x9580, 0x65A7, 0x9581, 0x666E,\t0x9582, 0x6D6E, 0x9583, 0x7236, 0x9584, 0x7B26, 0x9585, 0x8150,\n\t0x9586, 0x819A, 0x9587, 0x8299, 0x9588, 0x8B5C, 0x9589, 0x8CA0,\t0x958A, 0x8CE6, 0x958B, 0x8D74, 0x958C, 0x961C, 0x958D, 0x9644,\n\t0x958E, 0x4FAE, 0x958F, 0x64AB, 0x9590, 0x6B66, 0x9591, 0x821E,\t0x9592, 0x8461, 0x9593, 0x856A, 0x9594, 0x90E8, 0x9595, 0x5C01,\n\t0x9596, 0x6953, 0x9597, 0x98A8, 0x9598, 0x847A, 0x9599, 0x8557,\t0x959A, 0x4F0F, 0x959B, 0x526F, 0x959C, 0x5FA9, 0x959D, 0x5E45,\n\t0x959E, 0x670D, 0x959F, 0x798F, 0x95A0, 0x8179, 0x95A1, 0x8907,\t0x95A2, 0x8986, 0x95A3, 0x6DF5, 0x95A4, 0x5F17, 0x95A5, 0x6255,\n\t0x95A6, 0x6CB8, 0x95A7, 0x4ECF, 0x95A8, 0x7269, 0x95A9, 0x9B92,\t0x95AA, 0x5206, 0x95AB, 0x543B, 0x95AC, 0x5674, 0x95AD, 0x58B3,\n\t0x95AE, 0x61A4, 0x95AF, 0x626E, 0x95B0, 0x711A, 0x95B1, 0x596E,\t0x95B2, 0x7C89, 0x95B3, 0x7CDE, 0x95B4, 0x7D1B, 0x95B5, 0x96F0,\n\t0x95B6, 0x6587, 0x95B7, 0x805E, 0x95B8, 0x4E19, 0x95B9, 0x4F75,\t0x95BA, 0x5175, 0x95BB, 0x5840, 0x95BC, 0x5E63, 0x95BD, 0x5E73,\n\t0x95BE, 0x5F0A, 0x95BF, 0x67C4, 0x95C0, 0x4E26, 0x95C1, 0x853D,\t0x95C2, 0x9589, 0x95C3, 0x965B, 0x95C4, 0x7C73, 0x95C5, 0x9801,\n\t0x95C6, 0x50FB, 0x95C7, 0x58C1, 0x95C8, 0x7656, 0x95C9, 0x78A7,\t0x95CA, 0x5225, 0x95CB, 0x77A5, 0x95CC, 0x8511, 0x95CD, 0x7B86,\n\t0x95CE, 0x504F, 0x95CF, 0x5909, 0x95D0, 0x7247, 0x95D1, 0x7BC7,\t0x95D2, 0x7DE8, 0x95D3, 0x8FBA, 0x95D4, 0x8FD4, 0x95D5, 0x904D,\n\t0x95D6, 0x4FBF, 0x95D7, 0x52C9, 0x95D8, 0x5A29, 0x95D9, 0x5F01,\t0x95DA, 0x97AD, 0x95DB, 0x4FDD, 0x95DC, 0x8217, 0x95DD, 0x92EA,\n\t0x95DE, 0x5703, 0x95DF, 0x6355, 0x95E0, 0x6B69, 0x95E1, 0x752B,\t0x95E2, 0x88DC, 0x95E3, 0x8F14, 0x95E4, 0x7A42, 0x95E5, 0x52DF,\n\t0x95E6, 0x5893, 0x95E7, 0x6155, 0x95E8, 0x620A, 0x95E9, 0x66AE,\t0x95EA, 0x6BCD, 0x95EB, 0x7C3F, 0x95EC, 0x83E9, 0x95ED, 0x5023,\n\t0x95EE, 0x4FF8, 0x95EF, 0x5305, 0x95F0, 0x5446, 0x95F1, 0x5831,\t0x95F2, 0x5949, 0x95F3, 0x5B9D, 0x95F4, 0x5CF0, 0x95F5, 0x5CEF,\n\t0x95F6, 0x5D29, 0x95F7, 0x5E96, 0x95F8, 0x62B1, 0x95F9, 0x6367,\t0x95FA, 0x653E, 0x95FB, 0x65B9, 0x95FC, 0x670B, 0x9640, 0x6CD5,\n\t0x9641, 0x6CE1, 0x9642, 0x70F9, 0x9643, 0x7832, 0x9644, 0x7E2B,\t0x9645, 0x80DE, 0x9646, 0x82B3, 0x9647, 0x840C, 0x9648, 0x84EC,\n\t0x9649, 0x8702, 0x964A, 0x8912, 0x964B, 0x8A2A, 0x964C, 0x8C4A,\t0x964D, 0x90A6, 0x964E, 0x92D2, 0x964F, 0x98FD, 0x9650, 0x9CF3,\n\t0x9651, 0x9D6C, 0x9652, 0x4E4F, 0x9653, 0x4EA1, 0x9654, 0x508D,\t0x9655, 0x5256, 0x9656, 0x574A, 0x9657, 0x59A8, 0x9658, 0x5E3D,\n\t0x9659, 0x5FD8, 0x965A, 0x5FD9, 0x965B, 0x623F, 0x965C, 0x66B4,\t0x965D, 0x671B, 0x965E, 0x67D0, 0x965F, 0x68D2, 0x9660, 0x5192,\n\t0x9661, 0x7D21, 0x9662, 0x80AA, 0x9663, 0x81A8, 0x9664, 0x8B00,\t0x9665, 0x8C8C, 0x9666, 0x8CBF, 0x9667, 0x927E, 0x9668, 0x9632,\n\t0x9669, 0x5420, 0x966A, 0x982C, 0x966B, 0x5317, 0x966C, 0x50D5,\t0x966D, 0x535C, 0x966E, 0x58A8, 0x966F, 0x64B2, 0x9670, 0x6734,\n\t0x9671, 0x7267, 0x9672, 0x7766, 0x9673, 0x7A46, 0x9674, 0x91E6,\t0x9675, 0x52C3, 0x9676, 0x6CA1, 0x9677, 0x6B86, 0x9678, 0x5800,\n\t0x9679, 0x5E4C, 0x967A, 0x5954, 0x967B, 0x672C, 0x967C, 0x7FFB,\t0x967D, 0x51E1, 0x967E, 0x76C6, 0x9680, 0x6469, 0x9681, 0x78E8,\n\t0x9682, 0x9B54, 0x9683, 0x9EBB, 0x9684, 0x57CB, 0x9685, 0x59B9,\t0x9686, 0x6627, 0x9687, 0x679A, 0x9688, 0x6BCE, 0x9689, 0x54E9,\n\t0x968A, 0x69D9, 0x968B, 0x5E55, 0x968C, 0x819C, 0x968D, 0x6795,\t0x968E, 0x9BAA, 0x968F, 0x67FE, 0x9690, 0x9C52, 0x9691, 0x685D,\n\t0x9692, 0x4EA6, 0x9693, 0x4FE3, 0x9694, 0x53C8, 0x9695, 0x62B9,\t0x9696, 0x672B, 0x9697, 0x6CAB, 0x9698, 0x8FC4, 0x9699, 0x4FAD,\n\t0x969A, 0x7E6D, 0x969B, 0x9EBF, 0x969C, 0x4E07, 0x969D, 0x6162,\t0x969E, 0x6E80, 0x969F, 0x6F2B, 0x96A0, 0x8513, 0x96A1, 0x5473,\n\t0x96A2, 0x672A, 0x96A3, 0x9B45, 0x96A4, 0x5DF3, 0x96A5, 0x7B95,\t0x96A6, 0x5CAC, 0x96A7, 0x5BC6, 0x96A8, 0x871C, 0x96A9, 0x6E4A,\n\t0x96AA, 0x84D1, 0x96AB, 0x7A14, 0x96AC, 0x8108, 0x96AD, 0x5999,\t0x96AE, 0x7C8D, 0x96AF, 0x6C11, 0x96B0, 0x7720, 0x96B1, 0x52D9,\n\t0x96B2, 0x5922, 0x96B3, 0x7121, 0x96B4, 0x725F, 0x96B5, 0x77DB,\t0x96B6, 0x9727, 0x96B7, 0x9D61, 0x96B8, 0x690B, 0x96B9, 0x5A7F,\n\t0x96BA, 0x5A18, 0x96BB, 0x51A5, 0x96BC, 0x540D, 0x96BD, 0x547D,\t0x96BE, 0x660E, 0x96BF, 0x76DF, 0x96C0, 0x8FF7, 0x96C1, 0x9298,\n\t0x96C2, 0x9CF4, 0x96C3, 0x59EA, 0x96C4, 0x725D, 0x96C5, 0x6EC5,\t0x96C6, 0x514D, 0x96C7, 0x68C9, 0x96C8, 0x7DBF, 0x96C9, 0x7DEC,\n\t0x96CA, 0x9762, 0x96CB, 0x9EBA, 0x96CC, 0x6478, 0x96CD, 0x6A21,\t0x96CE, 0x8302, 0x96CF, 0x5984, 0x96D0, 0x5B5F, 0x96D1, 0x6BDB,\n\t0x96D2, 0x731B, 0x96D3, 0x76F2, 0x96D4, 0x7DB2, 0x96D5, 0x8017,\t0x96D6, 0x8499, 0x96D7, 0x5132, 0x96D8, 0x6728, 0x96D9, 0x9ED9,\n\t0x96DA, 0x76EE, 0x96DB, 0x6762, 0x96DC, 0x52FF, 0x96DD, 0x9905,\t0x96DE, 0x5C24, 0x96DF, 0x623B, 0x96E0, 0x7C7E, 0x96E1, 0x8CB0,\n\t0x96E2, 0x554F, 0x96E3, 0x60B6, 0x96E4, 0x7D0B, 0x96E5, 0x9580,\t0x96E6, 0x5301, 0x96E7, 0x4E5F, 0x96E8, 0x51B6, 0x96E9, 0x591C,\n\t0x96EA, 0x723A, 0x96EB, 0x8036, 0x96EC, 0x91CE, 0x96ED, 0x5F25,\t0x96EE, 0x77E2, 0x96EF, 0x5384, 0x96F0, 0x5F79, 0x96F1, 0x7D04,\n\t0x96F2, 0x85AC, 0x96F3, 0x8A33, 0x96F4, 0x8E8D, 0x96F5, 0x9756,\t0x96F6, 0x67F3, 0x96F7, 0x85AE, 0x96F8, 0x9453, 0x96F9, 0x6109,\n\t0x96FA, 0x6108, 0x96FB, 0x6CB9, 0x96FC, 0x7652, 0x9740, 0x8AED,\t0x9741, 0x8F38, 0x9742, 0x552F, 0x9743, 0x4F51, 0x9744, 0x512A,\n\t0x9745, 0x52C7, 0x9746, 0x53CB, 0x9747, 0x5BA5, 0x9748, 0x5E7D,\t0x9749, 0x60A0, 0x974A, 0x6182, 0x974B, 0x63D6, 0x974C, 0x6709,\n\t0x974D, 0x67DA, 0x974E, 0x6E67, 0x974F, 0x6D8C, 0x9750, 0x7336,\t0x9751, 0x7337, 0x9752, 0x7531, 0x9753, 0x7950, 0x9754, 0x88D5,\n\t0x9755, 0x8A98, 0x9756, 0x904A, 0x9757, 0x9091, 0x9758, 0x90F5,\t0x9759, 0x96C4, 0x975A, 0x878D, 0x975B, 0x5915, 0x975C, 0x4E88,\n\t0x975D, 0x4F59, 0x975E, 0x4E0E, 0x975F, 0x8A89, 0x9760, 0x8F3F,\t0x9761, 0x9810, 0x9762, 0x50AD, 0x9763, 0x5E7C, 0x9764, 0x5996,\n\t0x9765, 0x5BB9, 0x9766, 0x5EB8, 0x9767, 0x63DA, 0x9768, 0x63FA,\t0x9769, 0x64C1, 0x976A, 0x66DC, 0x976B, 0x694A, 0x976C, 0x69D8,\n\t0x976D, 0x6D0B, 0x976E, 0x6EB6, 0x976F, 0x7194, 0x9770, 0x7528,\t0x9771, 0x7AAF, 0x9772, 0x7F8A, 0x9773, 0x8000, 0x9774, 0x8449,\n\t0x9775, 0x84C9, 0x9776, 0x8981, 0x9777, 0x8B21, 0x9778, 0x8E0A,\t0x9779, 0x9065, 0x977A, 0x967D, 0x977B, 0x990A, 0x977C, 0x617E,\n\t0x977D, 0x6291, 0x977E, 0x6B32, 0x9780, 0x6C83, 0x9781, 0x6D74,\t0x9782, 0x7FCC, 0x9783, 0x7FFC, 0x9784, 0x6DC0, 0x9785, 0x7F85,\n\t0x9786, 0x87BA, 0x9787, 0x88F8, 0x9788, 0x6765, 0x9789, 0x83B1,\t0x978A, 0x983C, 0x978B, 0x96F7, 0x978C, 0x6D1B, 0x978D, 0x7D61,\n\t0x978E, 0x843D, 0x978F, 0x916A, 0x9790, 0x4E71, 0x9791, 0x5375,\t0x9792, 0x5D50, 0x9793, 0x6B04, 0x9794, 0x6FEB, 0x9795, 0x85CD,\n\t0x9796, 0x862D, 0x9797, 0x89A7, 0x9798, 0x5229, 0x9799, 0x540F,\t0x979A, 0x5C65, 0x979B, 0x674E, 0x979C, 0x68A8, 0x979D, 0x7406,\n\t0x979E, 0x7483, 0x979F, 0x75E2, 0x97A0, 0x88CF, 0x97A1, 0x88E1,\t0x97A2, 0x91CC, 0x97A3, 0x96E2, 0x97A4, 0x9678, 0x97A5, 0x5F8B,\n\t0x97A6, 0x7387, 0x97A7, 0x7ACB, 0x97A8, 0x844E, 0x97A9, 0x63A0,\t0x97AA, 0x7565, 0x97AB, 0x5289, 0x97AC, 0x6D41, 0x97AD, 0x6E9C,\n\t0x97AE, 0x7409, 0x97AF, 0x7559, 0x97B0, 0x786B, 0x97B1, 0x7C92,\t0x97B2, 0x9686, 0x97B3, 0x7ADC, 0x97B4, 0x9F8D, 0x97B5, 0x4FB6,\n\t0x97B6, 0x616E, 0x97B7, 0x65C5, 0x97B8, 0x865C, 0x97B9, 0x4E86,\t0x97BA, 0x4EAE, 0x97BB, 0x50DA, 0x97BC, 0x4E21, 0x97BD, 0x51CC,\n\t0x97BE, 0x5BEE, 0x97BF, 0x6599, 0x97C0, 0x6881, 0x97C1, 0x6DBC,\t0x97C2, 0x731F, 0x97C3, 0x7642, 0x97C4, 0x77AD, 0x97C5, 0x7A1C,\n\t0x97C6, 0x7CE7, 0x97C7, 0x826F, 0x97C8, 0x8AD2, 0x97C9, 0x907C,\t0x97CA, 0x91CF, 0x97CB, 0x9675, 0x97CC, 0x9818, 0x97CD, 0x529B,\n\t0x97CE, 0x7DD1, 0x97CF, 0x502B, 0x97D0, 0x5398, 0x97D1, 0x6797,\t0x97D2, 0x6DCB, 0x97D3, 0x71D0, 0x97D4, 0x7433, 0x97D5, 0x81E8,\n\t0x97D6, 0x8F2A, 0x97D7, 0x96A3, 0x97D8, 0x9C57, 0x97D9, 0x9E9F,\t0x97DA, 0x7460, 0x97DB, 0x5841, 0x97DC, 0x6D99, 0x97DD, 0x7D2F,\n\t0x97DE, 0x985E, 0x97DF, 0x4EE4, 0x97E0, 0x4F36, 0x97E1, 0x4F8B,\t0x97E2, 0x51B7, 0x97E3, 0x52B1, 0x97E4, 0x5DBA, 0x97E5, 0x601C,\n\t0x97E6, 0x73B2, 0x97E7, 0x793C, 0x97E8, 0x82D3, 0x97E9, 0x9234,\t0x97EA, 0x96B7, 0x97EB, 0x96F6, 0x97EC, 0x970A, 0x97ED, 0x9E97,\n\t0x97EE, 0x9F62, 0x97EF, 0x66A6, 0x97F0, 0x6B74, 0x97F1, 0x5217,\t0x97F2, 0x52A3, 0x97F3, 0x70C8, 0x97F4, 0x88C2, 0x97F5, 0x5EC9,\n\t0x97F6, 0x604B, 0x97F7, 0x6190, 0x97F8, 0x6F23, 0x97F9, 0x7149,\t0x97FA, 0x7C3E, 0x97FB, 0x7DF4, 0x97FC, 0x806F, 0x9840, 0x84EE,\n\t0x9841, 0x9023, 0x9842, 0x932C, 0x9843, 0x5442, 0x9844, 0x9B6F,\t0x9845, 0x6AD3, 0x9846, 0x7089, 0x9847, 0x8CC2, 0x9848, 0x8DEF,\n\t0x9849, 0x9732, 0x984A, 0x52B4, 0x984B, 0x5A41, 0x984C, 0x5ECA,\t0x984D, 0x5F04, 0x984E, 0x6717, 0x984F, 0x697C, 0x9850, 0x6994,\n\t0x9851, 0x6D6A, 0x9852, 0x6F0F, 0x9853, 0x7262, 0x9854, 0x72FC,\t0x9855, 0x7BED, 0x9856, 0x8001, 0x9857, 0x807E, 0x9858, 0x874B,\n\t0x9859, 0x90CE, 0x985A, 0x516D, 0x985B, 0x9E93, 0x985C, 0x7984,\t0x985D, 0x808B, 0x985E, 0x9332, 0x985F, 0x8AD6, 0x9860, 0x502D,\n\t0x9861, 0x548C, 0x9862, 0x8A71, 0x9863, 0x6B6A, 0x9864, 0x8CC4,\t0x9865, 0x8107, 0x9866, 0x60D1, 0x9867, 0x67A0, 0x9868, 0x9DF2,\n\t0x9869, 0x4E99, 0x986A, 0x4E98, 0x986B, 0x9C10, 0x986C, 0x8A6B,\t0x986D, 0x85C1, 0x986E, 0x8568, 0x986F, 0x6900, 0x9870, 0x6E7E,\n\t0x9871, 0x7897, 0x9872, 0x8155, 0x989F, 0x5F0C, 0x98A0, 0x4E10,\t0x98A1, 0x4E15, 0x98A2, 0x4E2A, 0x98A3, 0x4E31, 0x98A4, 0x4E36,\n\t0x98A5, 0x4E3C, 0x98A6, 0x4E3F, 0x98A7, 0x4E42, 0x98A8, 0x4E56,\t0x98A9, 0x4E58, 0x98AA, 0x4E82, 0x98AB, 0x4E85, 0x98AC, 0x8C6B,\n\t0x98AD, 0x4E8A, 0x98AE, 0x8212, 0x98AF, 0x5F0D, 0x98B0, 0x4E8E,\t0x98B1, 0x4E9E, 0x98B2, 0x4E9F, 0x98B3, 0x4EA0, 0x98B4, 0x4EA2,\n\t0x98B5, 0x4EB0, 0x98B6, 0x4EB3, 0x98B7, 0x4EB6, 0x98B8, 0x4ECE,\t0x98B9, 0x4ECD, 0x98BA, 0x4EC4, 0x98BB, 0x4EC6, 0x98BC, 0x4EC2,\n\t0x98BD, 0x4ED7, 0x98BE, 0x4EDE, 0x98BF, 0x4EED, 0x98C0, 0x4EDF,\t0x98C1, 0x4EF7, 0x98C2, 0x4F09, 0x98C3, 0x4F5A, 0x98C4, 0x4F30,\n\t0x98C5, 0x4F5B, 0x98C6, 0x4F5D, 0x98C7, 0x4F57, 0x98C8, 0x4F47,\t0x98C9, 0x4F76, 0x98CA, 0x4F88, 0x98CB, 0x4F8F, 0x98CC, 0x4F98,\n\t0x98CD, 0x4F7B, 0x98CE, 0x4F69, 0x98CF, 0x4F70, 0x98D0, 0x4F91,\t0x98D1, 0x4F6F, 0x98D2, 0x4F86, 0x98D3, 0x4F96, 0x98D4, 0x5118,\n\t0x98D5, 0x4FD4, 0x98D6, 0x4FDF, 0x98D7, 0x4FCE, 0x98D8, 0x4FD8,\t0x98D9, 0x4FDB, 0x98DA, 0x4FD1, 0x98DB, 0x4FDA, 0x98DC, 0x4FD0,\n\t0x98DD, 0x4FE4, 0x98DE, 0x4FE5, 0x98DF, 0x501A, 0x98E0, 0x5028,\t0x98E1, 0x5014, 0x98E2, 0x502A, 0x98E3, 0x5025, 0x98E4, 0x5005,\n\t0x98E5, 0x4F1C, 0x98E6, 0x4FF6, 0x98E7, 0x5021, 0x98E8, 0x5029,\t0x98E9, 0x502C, 0x98EA, 0x4FFE, 0x98EB, 0x4FEF, 0x98EC, 0x5011,\n\t0x98ED, 0x5006, 0x98EE, 0x5043, 0x98EF, 0x5047, 0x98F0, 0x6703,\t0x98F1, 0x5055, 0x98F2, 0x5050, 0x98F3, 0x5048, 0x98F4, 0x505A,\n\t0x98F5, 0x5056, 0x98F6, 0x506C, 0x98F7, 0x5078, 0x98F8, 0x5080,\t0x98F9, 0x509A, 0x98FA, 0x5085, 0x98FB, 0x50B4, 0x98FC, 0x50B2,\n\t0x9940, 0x50C9, 0x9941, 0x50CA, 0x9942, 0x50B3, 0x9943, 0x50C2,\t0x9944, 0x50D6, 0x9945, 0x50DE, 0x9946, 0x50E5, 0x9947, 0x50ED,\n\t0x9948, 0x50E3, 0x9949, 0x50EE, 0x994A, 0x50F9, 0x994B, 0x50F5,\t0x994C, 0x5109, 0x994D, 0x5101, 0x994E, 0x5102, 0x994F, 0x5116,\n\t0x9950, 0x5115, 0x9951, 0x5114, 0x9952, 0x511A, 0x9953, 0x5121,\t0x9954, 0x513A, 0x9955, 0x5137, 0x9956, 0x513C, 0x9957, 0x513B,\n\t0x9958, 0x513F, 0x9959, 0x5140, 0x995A, 0x5152, 0x995B, 0x514C,\t0x995C, 0x5154, 0x995D, 0x5162, 0x995E, 0x7AF8, 0x995F, 0x5169,\n\t0x9960, 0x516A, 0x9961, 0x516E, 0x9962, 0x5180, 0x9963, 0x5182,\t0x9964, 0x56D8, 0x9965, 0x518C, 0x9966, 0x5189, 0x9967, 0x518F,\n\t0x9968, 0x5191, 0x9969, 0x5193, 0x996A, 0x5195, 0x996B, 0x5196,\t0x996C, 0x51A4, 0x996D, 0x51A6, 0x996E, 0x51A2, 0x996F, 0x51A9,\n\t0x9970, 0x51AA, 0x9971, 0x51AB, 0x9972, 0x51B3, 0x9973, 0x51B1,\t0x9974, 0x51B2, 0x9975, 0x51B0, 0x9976, 0x51B5, 0x9977, 0x51BD,\n\t0x9978, 0x51C5, 0x9979, 0x51C9, 0x997A, 0x51DB, 0x997B, 0x51E0,\t0x997C, 0x8655, 0x997D, 0x51E9, 0x997E, 0x51ED, 0x9980, 0x51F0,\n\t0x9981, 0x51F5, 0x9982, 0x51FE, 0x9983, 0x5204, 0x9984, 0x520B,\t0x9985, 0x5214, 0x9986, 0x520E, 0x9987, 0x5227, 0x9988, 0x522A,\n\t0x9989, 0x522E, 0x998A, 0x5233, 0x998B, 0x5239, 0x998C, 0x524F,\t0x998D, 0x5244, 0x998E, 0x524B, 0x998F, 0x524C, 0x9990, 0x525E,\n\t0x9991, 0x5254, 0x9992, 0x526A, 0x9993, 0x5274, 0x9994, 0x5269,\t0x9995, 0x5273, 0x9996, 0x527F, 0x9997, 0x527D, 0x9998, 0x528D,\n\t0x9999, 0x5294, 0x999A, 0x5292, 0x999B, 0x5271, 0x999C, 0x5288,\t0x999D, 0x5291, 0x999E, 0x8FA8, 0x999F, 0x8FA7, 0x99A0, 0x52AC,\n\t0x99A1, 0x52AD, 0x99A2, 0x52BC, 0x99A3, 0x52B5, 0x99A4, 0x52C1,\t0x99A5, 0x52CD, 0x99A6, 0x52D7, 0x99A7, 0x52DE, 0x99A8, 0x52E3,\n\t0x99A9, 0x52E6, 0x99AA, 0x98ED, 0x99AB, 0x52E0, 0x99AC, 0x52F3,\t0x99AD, 0x52F5, 0x99AE, 0x52F8, 0x99AF, 0x52F9, 0x99B0, 0x5306,\n\t0x99B1, 0x5308, 0x99B2, 0x7538, 0x99B3, 0x530D, 0x99B4, 0x5310,\t0x99B5, 0x530F, 0x99B6, 0x5315, 0x99B7, 0x531A, 0x99B8, 0x5323,\n\t0x99B9, 0x532F, 0x99BA, 0x5331, 0x99BB, 0x5333, 0x99BC, 0x5338,\t0x99BD, 0x5340, 0x99BE, 0x5346, 0x99BF, 0x5345, 0x99C0, 0x4E17,\n\t0x99C1, 0x5349, 0x99C2, 0x534D, 0x99C3, 0x51D6, 0x99C4, 0x535E,\t0x99C5, 0x5369, 0x99C6, 0x536E, 0x99C7, 0x5918, 0x99C8, 0x537B,\n\t0x99C9, 0x5377, 0x99CA, 0x5382, 0x99CB, 0x5396, 0x99CC, 0x53A0,\t0x99CD, 0x53A6, 0x99CE, 0x53A5, 0x99CF, 0x53AE, 0x99D0, 0x53B0,\n\t0x99D1, 0x53B6, 0x99D2, 0x53C3, 0x99D3, 0x7C12, 0x99D4, 0x96D9,\t0x99D5, 0x53DF, 0x99D6, 0x66FC, 0x99D7, 0x71EE, 0x99D8, 0x53EE,\n\t0x99D9, 0x53E8, 0x99DA, 0x53ED, 0x99DB, 0x53FA, 0x99DC, 0x5401,\t0x99DD, 0x543D, 0x99DE, 0x5440, 0x99DF, 0x542C, 0x99E0, 0x542D,\n\t0x99E1, 0x543C, 0x99E2, 0x542E, 0x99E3, 0x5436, 0x99E4, 0x5429,\t0x99E5, 0x541D, 0x99E6, 0x544E, 0x99E7, 0x548F, 0x99E8, 0x5475,\n\t0x99E9, 0x548E, 0x99EA, 0x545F, 0x99EB, 0x5471, 0x99EC, 0x5477,\t0x99ED, 0x5470, 0x99EE, 0x5492, 0x99EF, 0x547B, 0x99F0, 0x5480,\n\t0x99F1, 0x5476, 0x99F2, 0x5484, 0x99F3, 0x5490, 0x99F4, 0x5486,\t0x99F5, 0x54C7, 0x99F6, 0x54A2, 0x99F7, 0x54B8, 0x99F8, 0x54A5,\n\t0x99F9, 0x54AC, 0x99FA, 0x54C4, 0x99FB, 0x54C8, 0x99FC, 0x54A8,\t0x9A40, 0x54AB, 0x9A41, 0x54C2, 0x9A42, 0x54A4, 0x9A43, 0x54BE,\n\t0x9A44, 0x54BC, 0x9A45, 0x54D8, 0x9A46, 0x54E5, 0x9A47, 0x54E6,\t0x9A48, 0x550F, 0x9A49, 0x5514, 0x9A4A, 0x54FD, 0x9A4B, 0x54EE,\n\t0x9A4C, 0x54ED, 0x9A4D, 0x54FA, 0x9A4E, 0x54E2, 0x9A4F, 0x5539,\t0x9A50, 0x5540, 0x9A51, 0x5563, 0x9A52, 0x554C, 0x9A53, 0x552E,\n\t0x9A54, 0x555C, 0x9A55, 0x5545, 0x9A56, 0x5556, 0x9A57, 0x5557,\t0x9A58, 0x5538, 0x9A59, 0x5533, 0x9A5A, 0x555D, 0x9A5B, 0x5599,\n\t0x9A5C, 0x5580, 0x9A5D, 0x54AF, 0x9A5E, 0x558A, 0x9A5F, 0x559F,\t0x9A60, 0x557B, 0x9A61, 0x557E, 0x9A62, 0x5598, 0x9A63, 0x559E,\n\t0x9A64, 0x55AE, 0x9A65, 0x557C, 0x9A66, 0x5583, 0x9A67, 0x55A9,\t0x9A68, 0x5587, 0x9A69, 0x55A8, 0x9A6A, 0x55DA, 0x9A6B, 0x55C5,\n\t0x9A6C, 0x55DF, 0x9A6D, 0x55C4, 0x9A6E, 0x55DC, 0x9A6F, 0x55E4,\t0x9A70, 0x55D4, 0x9A71, 0x5614, 0x9A72, 0x55F7, 0x9A73, 0x5616,\n\t0x9A74, 0x55FE, 0x9A75, 0x55FD, 0x9A76, 0x561B, 0x9A77, 0x55F9,\t0x9A78, 0x564E, 0x9A79, 0x5650, 0x9A7A, 0x71DF, 0x9A7B, 0x5634,\n\t0x9A7C, 0x5636, 0x9A7D, 0x5632, 0x9A7E, 0x5638, 0x9A80, 0x566B,\t0x9A81, 0x5664, 0x9A82, 0x562F, 0x9A83, 0x566C, 0x9A84, 0x566A,\n\t0x9A85, 0x5686, 0x9A86, 0x5680, 0x9A87, 0x568A, 0x9A88, 0x56A0,\t0x9A89, 0x5694, 0x9A8A, 0x568F, 0x9A8B, 0x56A5, 0x9A8C, 0x56AE,\n\t0x9A8D, 0x56B6, 0x9A8E, 0x56B4, 0x9A8F, 0x56C2, 0x9A90, 0x56BC,\t0x9A91, 0x56C1, 0x9A92, 0x56C3, 0x9A93, 0x56C0, 0x9A94, 0x56C8,\n\t0x9A95, 0x56CE, 0x9A96, 0x56D1, 0x9A97, 0x56D3, 0x9A98, 0x56D7,\t0x9A99, 0x56EE, 0x9A9A, 0x56F9, 0x9A9B, 0x5700, 0x9A9C, 0x56FF,\n\t0x9A9D, 0x5704, 0x9A9E, 0x5709, 0x9A9F, 0x5708, 0x9AA0, 0x570B,\t0x9AA1, 0x570D, 0x9AA2, 0x5713, 0x9AA3, 0x5718, 0x9AA4, 0x5716,\n\t0x9AA5, 0x55C7, 0x9AA6, 0x571C, 0x9AA7, 0x5726, 0x9AA8, 0x5737,\t0x9AA9, 0x5738, 0x9AAA, 0x574E, 0x9AAB, 0x573B, 0x9AAC, 0x5740,\n\t0x9AAD, 0x574F, 0x9AAE, 0x5769, 0x9AAF, 0x57C0, 0x9AB0, 0x5788,\t0x9AB1, 0x5761, 0x9AB2, 0x577F, 0x9AB3, 0x5789, 0x9AB4, 0x5793,\n\t0x9AB5, 0x57A0, 0x9AB6, 0x57B3, 0x9AB7, 0x57A4, 0x9AB8, 0x57AA,\t0x9AB9, 0x57B0, 0x9ABA, 0x57C3, 0x9ABB, 0x57C6, 0x9ABC, 0x57D4,\n\t0x9ABD, 0x57D2, 0x9ABE, 0x57D3, 0x9ABF, 0x580A, 0x9AC0, 0x57D6,\t0x9AC1, 0x57E3, 0x9AC2, 0x580B, 0x9AC3, 0x5819, 0x9AC4, 0x581D,\n\t0x9AC5, 0x5872, 0x9AC6, 0x5821, 0x9AC7, 0x5862, 0x9AC8, 0x584B,\t0x9AC9, 0x5870, 0x9ACA, 0x6BC0, 0x9ACB, 0x5852, 0x9ACC, 0x583D,\n\t0x9ACD, 0x5879, 0x9ACE, 0x5885, 0x9ACF, 0x58B9, 0x9AD0, 0x589F,\t0x9AD1, 0x58AB, 0x9AD2, 0x58BA, 0x9AD3, 0x58DE, 0x9AD4, 0x58BB,\n\t0x9AD5, 0x58B8, 0x9AD6, 0x58AE, 0x9AD7, 0x58C5, 0x9AD8, 0x58D3,\t0x9AD9, 0x58D1, 0x9ADA, 0x58D7, 0x9ADB, 0x58D9, 0x9ADC, 0x58D8,\n\t0x9ADD, 0x58E5, 0x9ADE, 0x58DC, 0x9ADF, 0x58E4, 0x9AE0, 0x58DF,\t0x9AE1, 0x58EF, 0x9AE2, 0x58FA, 0x9AE3, 0x58F9, 0x9AE4, 0x58FB,\n\t0x9AE5, 0x58FC, 0x9AE6, 0x58FD, 0x9AE7, 0x5902, 0x9AE8, 0x590A,\t0x9AE9, 0x5910, 0x9AEA, 0x591B, 0x9AEB, 0x68A6, 0x9AEC, 0x5925,\n\t0x9AED, 0x592C, 0x9AEE, 0x592D, 0x9AEF, 0x5932, 0x9AF0, 0x5938,\t0x9AF1, 0x593E, 0x9AF2, 0x7AD2, 0x9AF3, 0x5955, 0x9AF4, 0x5950,\n\t0x9AF5, 0x594E, 0x9AF6, 0x595A, 0x9AF7, 0x5958, 0x9AF8, 0x5962,\t0x9AF9, 0x5960, 0x9AFA, 0x5967, 0x9AFB, 0x596C, 0x9AFC, 0x5969,\n\t0x9B40, 0x5978, 0x9B41, 0x5981, 0x9B42, 0x599D, 0x9B43, 0x4F5E,\t0x9B44, 0x4FAB, 0x9B45, 0x59A3, 0x9B46, 0x59B2, 0x9B47, 0x59C6,\n\t0x9B48, 0x59E8, 0x9B49, 0x59DC, 0x9B4A, 0x598D, 0x9B4B, 0x59D9,\t0x9B4C, 0x59DA, 0x9B4D, 0x5A25, 0x9B4E, 0x5A1F, 0x9B4F, 0x5A11,\n\t0x9B50, 0x5A1C, 0x9B51, 0x5A09, 0x9B52, 0x5A1A, 0x9B53, 0x5A40,\t0x9B54, 0x5A6C, 0x9B55, 0x5A49, 0x9B56, 0x5A35, 0x9B57, 0x5A36,\n\t0x9B58, 0x5A62, 0x9B59, 0x5A6A, 0x9B5A, 0x5A9A, 0x9B5B, 0x5ABC,\t0x9B5C, 0x5ABE, 0x9B5D, 0x5ACB, 0x9B5E, 0x5AC2, 0x9B5F, 0x5ABD,\n\t0x9B60, 0x5AE3, 0x9B61, 0x5AD7, 0x9B62, 0x5AE6, 0x9B63, 0x5AE9,\t0x9B64, 0x5AD6, 0x9B65, 0x5AFA, 0x9B66, 0x5AFB, 0x9B67, 0x5B0C,\n\t0x9B68, 0x5B0B, 0x9B69, 0x5B16, 0x9B6A, 0x5B32, 0x9B6B, 0x5AD0,\t0x9B6C, 0x5B2A, 0x9B6D, 0x5B36, 0x9B6E, 0x5B3E, 0x9B6F, 0x5B43,\n\t0x9B70, 0x5B45, 0x9B71, 0x5B40, 0x9B72, 0x5B51, 0x9B73, 0x5B55,\t0x9B74, 0x5B5A, 0x9B75, 0x5B5B, 0x9B76, 0x5B65, 0x9B77, 0x5B69,\n\t0x9B78, 0x5B70, 0x9B79, 0x5B73, 0x9B7A, 0x5B75, 0x9B7B, 0x5B78,\t0x9B7C, 0x6588, 0x9B7D, 0x5B7A, 0x9B7E, 0x5B80, 0x9B80, 0x5B83,\n\t0x9B81, 0x5BA6, 0x9B82, 0x5BB8, 0x9B83, 0x5BC3, 0x9B84, 0x5BC7,\t0x9B85, 0x5BC9, 0x9B86, 0x5BD4, 0x9B87, 0x5BD0, 0x9B88, 0x5BE4,\n\t0x9B89, 0x5BE6, 0x9B8A, 0x5BE2, 0x9B8B, 0x5BDE, 0x9B8C, 0x5BE5,\t0x9B8D, 0x5BEB, 0x9B8E, 0x5BF0, 0x9B8F, 0x5BF6, 0x9B90, 0x5BF3,\n\t0x9B91, 0x5C05, 0x9B92, 0x5C07, 0x9B93, 0x5C08, 0x9B94, 0x5C0D,\t0x9B95, 0x5C13, 0x9B96, 0x5C20, 0x9B97, 0x5C22, 0x9B98, 0x5C28,\n\t0x9B99, 0x5C38, 0x9B9A, 0x5C39, 0x9B9B, 0x5C41, 0x9B9C, 0x5C46,\t0x9B9D, 0x5C4E, 0x9B9E, 0x5C53, 0x9B9F, 0x5C50, 0x9BA0, 0x5C4F,\n\t0x9BA1, 0x5B71, 0x9BA2, 0x5C6C, 0x9BA3, 0x5C6E, 0x9BA4, 0x4E62,\t0x9BA5, 0x5C76, 0x9BA6, 0x5C79, 0x9BA7, 0x5C8C, 0x9BA8, 0x5C91,\n\t0x9BA9, 0x5C94, 0x9BAA, 0x599B, 0x9BAB, 0x5CAB, 0x9BAC, 0x5CBB,\t0x9BAD, 0x5CB6, 0x9BAE, 0x5CBC, 0x9BAF, 0x5CB7, 0x9BB0, 0x5CC5,\n\t0x9BB1, 0x5CBE, 0x9BB2, 0x5CC7, 0x9BB3, 0x5CD9, 0x9BB4, 0x5CE9,\t0x9BB5, 0x5CFD, 0x9BB6, 0x5CFA, 0x9BB7, 0x5CED, 0x9BB8, 0x5D8C,\n\t0x9BB9, 0x5CEA, 0x9BBA, 0x5D0B, 0x9BBB, 0x5D15, 0x9BBC, 0x5D17,\t0x9BBD, 0x5D5C, 0x9BBE, 0x5D1F, 0x9BBF, 0x5D1B, 0x9BC0, 0x5D11,\n\t0x9BC1, 0x5D14, 0x9BC2, 0x5D22, 0x9BC3, 0x5D1A, 0x9BC4, 0x5D19,\t0x9BC5, 0x5D18, 0x9BC6, 0x5D4C, 0x9BC7, 0x5D52, 0x9BC8, 0x5D4E,\n\t0x9BC9, 0x5D4B, 0x9BCA, 0x5D6C, 0x9BCB, 0x5D73, 0x9BCC, 0x5D76,\t0x9BCD, 0x5D87, 0x9BCE, 0x5D84, 0x9BCF, 0x5D82, 0x9BD0, 0x5DA2,\n\t0x9BD1, 0x5D9D, 0x9BD2, 0x5DAC, 0x9BD3, 0x5DAE, 0x9BD4, 0x5DBD,\t0x9BD5, 0x5D90, 0x9BD6, 0x5DB7, 0x9BD7, 0x5DBC, 0x9BD8, 0x5DC9,\n\t0x9BD9, 0x5DCD, 0x9BDA, 0x5DD3, 0x9BDB, 0x5DD2, 0x9BDC, 0x5DD6,\t0x9BDD, 0x5DDB, 0x9BDE, 0x5DEB, 0x9BDF, 0x5DF2, 0x9BE0, 0x5DF5,\n\t0x9BE1, 0x5E0B, 0x9BE2, 0x5E1A, 0x9BE3, 0x5E19, 0x9BE4, 0x5E11,\t0x9BE5, 0x5E1B, 0x9BE6, 0x5E36, 0x9BE7, 0x5E37, 0x9BE8, 0x5E44,\n\t0x9BE9, 0x5E43, 0x9BEA, 0x5E40, 0x9BEB, 0x5E4E, 0x9BEC, 0x5E57,\t0x9BED, 0x5E54, 0x9BEE, 0x5E5F, 0x9BEF, 0x5E62, 0x9BF0, 0x5E64,\n\t0x9BF1, 0x5E47, 0x9BF2, 0x5E75, 0x9BF3, 0x5E76, 0x9BF4, 0x5E7A,\t0x9BF5, 0x9EBC, 0x9BF6, 0x5E7F, 0x9BF7, 0x5EA0, 0x9BF8, 0x5EC1,\n\t0x9BF9, 0x5EC2, 0x9BFA, 0x5EC8, 0x9BFB, 0x5ED0, 0x9BFC, 0x5ECF,\t0x9C40, 0x5ED6, 0x9C41, 0x5EE3, 0x9C42, 0x5EDD, 0x9C43, 0x5EDA,\n\t0x9C44, 0x5EDB, 0x9C45, 0x5EE2, 0x9C46, 0x5EE1, 0x9C47, 0x5EE8,\t0x9C48, 0x5EE9, 0x9C49, 0x5EEC, 0x9C4A, 0x5EF1, 0x9C4B, 0x5EF3,\n\t0x9C4C, 0x5EF0, 0x9C4D, 0x5EF4, 0x9C4E, 0x5EF8, 0x9C4F, 0x5EFE,\t0x9C50, 0x5F03, 0x9C51, 0x5F09, 0x9C52, 0x5F5D, 0x9C53, 0x5F5C,\n\t0x9C54, 0x5F0B, 0x9C55, 0x5F11, 0x9C56, 0x5F16, 0x9C57, 0x5F29,\t0x9C58, 0x5F2D, 0x9C59, 0x5F38, 0x9C5A, 0x5F41, 0x9C5B, 0x5F48,\n\t0x9C5C, 0x5F4C, 0x9C5D, 0x5F4E, 0x9C5E, 0x5F2F, 0x9C5F, 0x5F51,\t0x9C60, 0x5F56, 0x9C61, 0x5F57, 0x9C62, 0x5F59, 0x9C63, 0x5F61,\n\t0x9C64, 0x5F6D, 0x9C65, 0x5F73, 0x9C66, 0x5F77, 0x9C67, 0x5F83,\t0x9C68, 0x5F82, 0x9C69, 0x5F7F, 0x9C6A, 0x5F8A, 0x9C6B, 0x5F88,\n\t0x9C6C, 0x5F91, 0x9C6D, 0x5F87, 0x9C6E, 0x5F9E, 0x9C6F, 0x5F99,\t0x9C70, 0x5F98, 0x9C71, 0x5FA0, 0x9C72, 0x5FA8, 0x9C73, 0x5FAD,\n\t0x9C74, 0x5FBC, 0x9C75, 0x5FD6, 0x9C76, 0x5FFB, 0x9C77, 0x5FE4,\t0x9C78, 0x5FF8, 0x9C79, 0x5FF1, 0x9C7A, 0x5FDD, 0x9C7B, 0x60B3,\n\t0x9C7C, 0x5FFF, 0x9C7D, 0x6021, 0x9C7E, 0x6060, 0x9C80, 0x6019,\t0x9C81, 0x6010, 0x9C82, 0x6029, 0x9C83, 0x600E, 0x9C84, 0x6031,\n\t0x9C85, 0x601B, 0x9C86, 0x6015, 0x9C87, 0x602B, 0x9C88, 0x6026,\t0x9C89, 0x600F, 0x9C8A, 0x603A, 0x9C8B, 0x605A, 0x9C8C, 0x6041,\n\t0x9C8D, 0x606A, 0x9C8E, 0x6077, 0x9C8F, 0x605F, 0x9C90, 0x604A,\t0x9C91, 0x6046, 0x9C92, 0x604D, 0x9C93, 0x6063, 0x9C94, 0x6043,\n\t0x9C95, 0x6064, 0x9C96, 0x6042, 0x9C97, 0x606C, 0x9C98, 0x606B,\t0x9C99, 0x6059, 0x9C9A, 0x6081, 0x9C9B, 0x608D, 0x9C9C, 0x60E7,\n\t0x9C9D, 0x6083, 0x9C9E, 0x609A, 0x9C9F, 0x6084, 0x9CA0, 0x609B,\t0x9CA1, 0x6096, 0x9CA2, 0x6097, 0x9CA3, 0x6092, 0x9CA4, 0x60A7,\n\t0x9CA5, 0x608B, 0x9CA6, 0x60E1, 0x9CA7, 0x60B8, 0x9CA8, 0x60E0,\t0x9CA9, 0x60D3, 0x9CAA, 0x60B4, 0x9CAB, 0x5FF0, 0x9CAC, 0x60BD,\n\t0x9CAD, 0x60C6, 0x9CAE, 0x60B5, 0x9CAF, 0x60D8, 0x9CB0, 0x614D,\t0x9CB1, 0x6115, 0x9CB2, 0x6106, 0x9CB3, 0x60F6, 0x9CB4, 0x60F7,\n\t0x9CB5, 0x6100, 0x9CB6, 0x60F4, 0x9CB7, 0x60FA, 0x9CB8, 0x6103,\t0x9CB9, 0x6121, 0x9CBA, 0x60FB, 0x9CBB, 0x60F1, 0x9CBC, 0x610D,\n\t0x9CBD, 0x610E, 0x9CBE, 0x6147, 0x9CBF, 0x613E, 0x9CC0, 0x6128,\t0x9CC1, 0x6127, 0x9CC2, 0x614A, 0x9CC3, 0x613F, 0x9CC4, 0x613C,\n\t0x9CC5, 0x612C, 0x9CC6, 0x6134, 0x9CC7, 0x613D, 0x9CC8, 0x6142,\t0x9CC9, 0x6144, 0x9CCA, 0x6173, 0x9CCB, 0x6177, 0x9CCC, 0x6158,\n\t0x9CCD, 0x6159, 0x9CCE, 0x615A, 0x9CCF, 0x616B, 0x9CD0, 0x6174,\t0x9CD1, 0x616F, 0x9CD2, 0x6165, 0x9CD3, 0x6171, 0x9CD4, 0x615F,\n\t0x9CD5, 0x615D, 0x9CD6, 0x6153, 0x9CD7, 0x6175, 0x9CD8, 0x6199,\t0x9CD9, 0x6196, 0x9CDA, 0x6187, 0x9CDB, 0x61AC, 0x9CDC, 0x6194,\n\t0x9CDD, 0x619A, 0x9CDE, 0x618A, 0x9CDF, 0x6191, 0x9CE0, 0x61AB,\t0x9CE1, 0x61AE, 0x9CE2, 0x61CC, 0x9CE3, 0x61CA, 0x9CE4, 0x61C9,\n\t0x9CE5, 0x61F7, 0x9CE6, 0x61C8, 0x9CE7, 0x61C3, 0x9CE8, 0x61C6,\t0x9CE9, 0x61BA, 0x9CEA, 0x61CB, 0x9CEB, 0x7F79, 0x9CEC, 0x61CD,\n\t0x9CED, 0x61E6, 0x9CEE, 0x61E3, 0x9CEF, 0x61F6, 0x9CF0, 0x61FA,\t0x9CF1, 0x61F4, 0x9CF2, 0x61FF, 0x9CF3, 0x61FD, 0x9CF4, 0x61FC,\n\t0x9CF5, 0x61FE, 0x9CF6, 0x6200, 0x9CF7, 0x6208, 0x9CF8, 0x6209,\t0x9CF9, 0x620D, 0x9CFA, 0x620C, 0x9CFB, 0x6214, 0x9CFC, 0x621B,\n\t0x9D40, 0x621E, 0x9D41, 0x6221, 0x9D42, 0x622A, 0x9D43, 0x622E,\t0x9D44, 0x6230, 0x9D45, 0x6232, 0x9D46, 0x6233, 0x9D47, 0x6241,\n\t0x9D48, 0x624E, 0x9D49, 0x625E, 0x9D4A, 0x6263, 0x9D4B, 0x625B,\t0x9D4C, 0x6260, 0x9D4D, 0x6268, 0x9D4E, 0x627C, 0x9D4F, 0x6282,\n\t0x9D50, 0x6289, 0x9D51, 0x627E, 0x9D52, 0x6292, 0x9D53, 0x6293,\t0x9D54, 0x6296, 0x9D55, 0x62D4, 0x9D56, 0x6283, 0x9D57, 0x6294,\n\t0x9D58, 0x62D7, 0x9D59, 0x62D1, 0x9D5A, 0x62BB, 0x9D5B, 0x62CF,\t0x9D5C, 0x62FF, 0x9D5D, 0x62C6, 0x9D5E, 0x64D4, 0x9D5F, 0x62C8,\n\t0x9D60, 0x62DC, 0x9D61, 0x62CC, 0x9D62, 0x62CA, 0x9D63, 0x62C2,\t0x9D64, 0x62C7, 0x9D65, 0x629B, 0x9D66, 0x62C9, 0x9D67, 0x630C,\n\t0x9D68, 0x62EE, 0x9D69, 0x62F1, 0x9D6A, 0x6327, 0x9D6B, 0x6302,\t0x9D6C, 0x6308, 0x9D6D, 0x62EF, 0x9D6E, 0x62F5, 0x9D6F, 0x6350,\n\t0x9D70, 0x633E, 0x9D71, 0x634D, 0x9D72, 0x641C, 0x9D73, 0x634F,\t0x9D74, 0x6396, 0x9D75, 0x638E, 0x9D76, 0x6380, 0x9D77, 0x63AB,\n\t0x9D78, 0x6376, 0x9D79, 0x63A3, 0x9D7A, 0x638F, 0x9D7B, 0x6389,\t0x9D7C, 0x639F, 0x9D7D, 0x63B5, 0x9D7E, 0x636B, 0x9D80, 0x6369,\n\t0x9D81, 0x63BE, 0x9D82, 0x63E9, 0x9D83, 0x63C0, 0x9D84, 0x63C6,\t0x9D85, 0x63E3, 0x9D86, 0x63C9, 0x9D87, 0x63D2, 0x9D88, 0x63F6,\n\t0x9D89, 0x63C4, 0x9D8A, 0x6416, 0x9D8B, 0x6434, 0x9D8C, 0x6406,\t0x9D8D, 0x6413, 0x9D8E, 0x6426, 0x9D8F, 0x6436, 0x9D90, 0x651D,\n\t0x9D91, 0x6417, 0x9D92, 0x6428, 0x9D93, 0x640F, 0x9D94, 0x6467,\t0x9D95, 0x646F, 0x9D96, 0x6476, 0x9D97, 0x644E, 0x9D98, 0x652A,\n\t0x9D99, 0x6495, 0x9D9A, 0x6493, 0x9D9B, 0x64A5, 0x9D9C, 0x64A9,\t0x9D9D, 0x6488, 0x9D9E, 0x64BC, 0x9D9F, 0x64DA, 0x9DA0, 0x64D2,\n\t0x9DA1, 0x64C5, 0x9DA2, 0x64C7, 0x9DA3, 0x64BB, 0x9DA4, 0x64D8,\t0x9DA5, 0x64C2, 0x9DA6, 0x64F1, 0x9DA7, 0x64E7, 0x9DA8, 0x8209,\n\t0x9DA9, 0x64E0, 0x9DAA, 0x64E1, 0x9DAB, 0x62AC, 0x9DAC, 0x64E3,\t0x9DAD, 0x64EF, 0x9DAE, 0x652C, 0x9DAF, 0x64F6, 0x9DB0, 0x64F4,\n\t0x9DB1, 0x64F2, 0x9DB2, 0x64FA, 0x9DB3, 0x6500, 0x9DB4, 0x64FD,\t0x9DB5, 0x6518, 0x9DB6, 0x651C, 0x9DB7, 0x6505, 0x9DB8, 0x6524,\n\t0x9DB9, 0x6523, 0x9DBA, 0x652B, 0x9DBB, 0x6534, 0x9DBC, 0x6535,\t0x9DBD, 0x6537, 0x9DBE, 0x6536, 0x9DBF, 0x6538, 0x9DC0, 0x754B,\n\t0x9DC1, 0x6548, 0x9DC2, 0x6556, 0x9DC3, 0x6555, 0x9DC4, 0x654D,\t0x9DC5, 0x6558, 0x9DC6, 0x655E, 0x9DC7, 0x655D, 0x9DC8, 0x6572,\n\t0x9DC9, 0x6578, 0x9DCA, 0x6582, 0x9DCB, 0x6583, 0x9DCC, 0x8B8A,\t0x9DCD, 0x659B, 0x9DCE, 0x659F, 0x9DCF, 0x65AB, 0x9DD0, 0x65B7,\n\t0x9DD1, 0x65C3, 0x9DD2, 0x65C6, 0x9DD3, 0x65C1, 0x9DD4, 0x65C4,\t0x9DD5, 0x65CC, 0x9DD6, 0x65D2, 0x9DD7, 0x65DB, 0x9DD8, 0x65D9,\n\t0x9DD9, 0x65E0, 0x9DDA, 0x65E1, 0x9DDB, 0x65F1, 0x9DDC, 0x6772,\t0x9DDD, 0x660A, 0x9DDE, 0x6603, 0x9DDF, 0x65FB, 0x9DE0, 0x6773,\n\t0x9DE1, 0x6635, 0x9DE2, 0x6636, 0x9DE3, 0x6634, 0x9DE4, 0x661C,\t0x9DE5, 0x664F, 0x9DE6, 0x6644, 0x9DE7, 0x6649, 0x9DE8, 0x6641,\n\t0x9DE9, 0x665E, 0x9DEA, 0x665D, 0x9DEB, 0x6664, 0x9DEC, 0x6667,\t0x9DED, 0x6668, 0x9DEE, 0x665F, 0x9DEF, 0x6662, 0x9DF0, 0x6670,\n\t0x9DF1, 0x6683, 0x9DF2, 0x6688, 0x9DF3, 0x668E, 0x9DF4, 0x6689,\t0x9DF5, 0x6684, 0x9DF6, 0x6698, 0x9DF7, 0x669D, 0x9DF8, 0x66C1,\n\t0x9DF9, 0x66B9, 0x9DFA, 0x66C9, 0x9DFB, 0x66BE, 0x9DFC, 0x66BC,\t0x9E40, 0x66C4, 0x9E41, 0x66B8, 0x9E42, 0x66D6, 0x9E43, 0x66DA,\n\t0x9E44, 0x66E0, 0x9E45, 0x663F, 0x9E46, 0x66E6, 0x9E47, 0x66E9,\t0x9E48, 0x66F0, 0x9E49, 0x66F5, 0x9E4A, 0x66F7, 0x9E4B, 0x670F,\n\t0x9E4C, 0x6716, 0x9E4D, 0x671E, 0x9E4E, 0x6726, 0x9E4F, 0x6727,\t0x9E50, 0x9738, 0x9E51, 0x672E, 0x9E52, 0x673F, 0x9E53, 0x6736,\n\t0x9E54, 0x6741, 0x9E55, 0x6738, 0x9E56, 0x6737, 0x9E57, 0x6746,\t0x9E58, 0x675E, 0x9E59, 0x6760, 0x9E5A, 0x6759, 0x9E5B, 0x6763,\n\t0x9E5C, 0x6764, 0x9E5D, 0x6789, 0x9E5E, 0x6770, 0x9E5F, 0x67A9,\t0x9E60, 0x677C, 0x9E61, 0x676A, 0x9E62, 0x678C, 0x9E63, 0x678B,\n\t0x9E64, 0x67A6, 0x9E65, 0x67A1, 0x9E66, 0x6785, 0x9E67, 0x67B7,\t0x9E68, 0x67EF, 0x9E69, 0x67B4, 0x9E6A, 0x67EC, 0x9E6B, 0x67B3,\n\t0x9E6C, 0x67E9, 0x9E6D, 0x67B8, 0x9E6E, 0x67E4, 0x9E6F, 0x67DE,\t0x9E70, 0x67DD, 0x9E71, 0x67E2, 0x9E72, 0x67EE, 0x9E73, 0x67B9,\n\t0x9E74, 0x67CE, 0x9E75, 0x67C6, 0x9E76, 0x67E7, 0x9E77, 0x6A9C,\t0x9E78, 0x681E, 0x9E79, 0x6846, 0x9E7A, 0x6829, 0x9E7B, 0x6840,\n\t0x9E7C, 0x684D, 0x9E7D, 0x6832, 0x9E7E, 0x684E, 0x9E80, 0x68B3,\t0x9E81, 0x682B, 0x9E82, 0x6859, 0x9E83, 0x6863, 0x9E84, 0x6877,\n\t0x9E85, 0x687F, 0x9E86, 0x689F, 0x9E87, 0x688F, 0x9E88, 0x68AD,\t0x9E89, 0x6894, 0x9E8A, 0x689D, 0x9E8B, 0x689B, 0x9E8C, 0x6883,\n\t0x9E8D, 0x6AAE, 0x9E8E, 0x68B9, 0x9E8F, 0x6874, 0x9E90, 0x68B5,\t0x9E91, 0x68A0, 0x9E92, 0x68BA, 0x9E93, 0x690F, 0x9E94, 0x688D,\n\t0x9E95, 0x687E, 0x9E96, 0x6901, 0x9E97, 0x68CA, 0x9E98, 0x6908,\t0x9E99, 0x68D8, 0x9E9A, 0x6922, 0x9E9B, 0x6926, 0x9E9C, 0x68E1,\n\t0x9E9D, 0x690C, 0x9E9E, 0x68CD, 0x9E9F, 0x68D4, 0x9EA0, 0x68E7,\t0x9EA1, 0x68D5, 0x9EA2, 0x6936, 0x9EA3, 0x6912, 0x9EA4, 0x6904,\n\t0x9EA5, 0x68D7, 0x9EA6, 0x68E3, 0x9EA7, 0x6925, 0x9EA8, 0x68F9,\t0x9EA9, 0x68E0, 0x9EAA, 0x68EF, 0x9EAB, 0x6928, 0x9EAC, 0x692A,\n\t0x9EAD, 0x691A, 0x9EAE, 0x6923, 0x9EAF, 0x6921, 0x9EB0, 0x68C6,\t0x9EB1, 0x6979, 0x9EB2, 0x6977, 0x9EB3, 0x695C, 0x9EB4, 0x6978,\n\t0x9EB5, 0x696B, 0x9EB6, 0x6954, 0x9EB7, 0x697E, 0x9EB8, 0x696E,\t0x9EB9, 0x6939, 0x9EBA, 0x6974, 0x9EBB, 0x693D, 0x9EBC, 0x6959,\n\t0x9EBD, 0x6930, 0x9EBE, 0x6961, 0x9EBF, 0x695E, 0x9EC0, 0x695D,\t0x9EC1, 0x6981, 0x9EC2, 0x696A, 0x9EC3, 0x69B2, 0x9EC4, 0x69AE,\n\t0x9EC5, 0x69D0, 0x9EC6, 0x69BF, 0x9EC7, 0x69C1, 0x9EC8, 0x69D3,\t0x9EC9, 0x69BE, 0x9ECA, 0x69CE, 0x9ECB, 0x5BE8, 0x9ECC, 0x69CA,\n\t0x9ECD, 0x69DD, 0x9ECE, 0x69BB, 0x9ECF, 0x69C3, 0x9ED0, 0x69A7,\t0x9ED1, 0x6A2E, 0x9ED2, 0x6991, 0x9ED3, 0x69A0, 0x9ED4, 0x699C,\n\t0x9ED5, 0x6995, 0x9ED6, 0x69B4, 0x9ED7, 0x69DE, 0x9ED8, 0x69E8,\t0x9ED9, 0x6A02, 0x9EDA, 0x6A1B, 0x9EDB, 0x69FF, 0x9EDC, 0x6B0A,\n\t0x9EDD, 0x69F9, 0x9EDE, 0x69F2, 0x9EDF, 0x69E7, 0x9EE0, 0x6A05,\t0x9EE1, 0x69B1, 0x9EE2, 0x6A1E, 0x9EE3, 0x69ED, 0x9EE4, 0x6A14,\n\t0x9EE5, 0x69EB, 0x9EE6, 0x6A0A, 0x9EE7, 0x6A12, 0x9EE8, 0x6AC1,\t0x9EE9, 0x6A23, 0x9EEA, 0x6A13, 0x9EEB, 0x6A44, 0x9EEC, 0x6A0C,\n\t0x9EED, 0x6A72, 0x9EEE, 0x6A36, 0x9EEF, 0x6A78, 0x9EF0, 0x6A47,\t0x9EF1, 0x6A62, 0x9EF2, 0x6A59, 0x9EF3, 0x6A66, 0x9EF4, 0x6A48,\n\t0x9EF5, 0x6A38, 0x9EF6, 0x6A22, 0x9EF7, 0x6A90, 0x9EF8, 0x6A8D,\t0x9EF9, 0x6AA0, 0x9EFA, 0x6A84, 0x9EFB, 0x6AA2, 0x9EFC, 0x6AA3,\n\t0x9F40, 0x6A97, 0x9F41, 0x8617, 0x9F42, 0x6ABB, 0x9F43, 0x6AC3,\t0x9F44, 0x6AC2, 0x9F45, 0x6AB8, 0x9F46, 0x6AB3, 0x9F47, 0x6AAC,\n\t0x9F48, 0x6ADE, 0x9F49, 0x6AD1, 0x9F4A, 0x6ADF, 0x9F4B, 0x6AAA,\t0x9F4C, 0x6ADA, 0x9F4D, 0x6AEA, 0x9F4E, 0x6AFB, 0x9F4F, 0x6B05,\n\t0x9F50, 0x8616, 0x9F51, 0x6AFA, 0x9F52, 0x6B12, 0x9F53, 0x6B16,\t0x9F54, 0x9B31, 0x9F55, 0x6B1F, 0x9F56, 0x6B38, 0x9F57, 0x6B37,\n\t0x9F58, 0x76DC, 0x9F59, 0x6B39, 0x9F5A, 0x98EE, 0x9F5B, 0x6B47,\t0x9F5C, 0x6B43, 0x9F5D, 0x6B49, 0x9F5E, 0x6B50, 0x9F5F, 0x6B59,\n\t0x9F60, 0x6B54, 0x9F61, 0x6B5B, 0x9F62, 0x6B5F, 0x9F63, 0x6B61,\t0x9F64, 0x6B78, 0x9F65, 0x6B79, 0x9F66, 0x6B7F, 0x9F67, 0x6B80,\n\t0x9F68, 0x6B84, 0x9F69, 0x6B83, 0x9F6A, 0x6B8D, 0x9F6B, 0x6B98,\t0x9F6C, 0x6B95, 0x9F6D, 0x6B9E, 0x9F6E, 0x6BA4, 0x9F6F, 0x6BAA,\n\t0x9F70, 0x6BAB, 0x9F71, 0x6BAF, 0x9F72, 0x6BB2, 0x9F73, 0x6BB1,\t0x9F74, 0x6BB3, 0x9F75, 0x6BB7, 0x9F76, 0x6BBC, 0x9F77, 0x6BC6,\n\t0x9F78, 0x6BCB, 0x9F79, 0x6BD3, 0x9F7A, 0x6BDF, 0x9F7B, 0x6BEC,\t0x9F7C, 0x6BEB, 0x9F7D, 0x6BF3, 0x9F7E, 0x6BEF, 0x9F80, 0x9EBE,\n\t0x9F81, 0x6C08, 0x9F82, 0x6C13, 0x9F83, 0x6C14, 0x9F84, 0x6C1B,\t0x9F85, 0x6C24, 0x9F86, 0x6C23, 0x9F87, 0x6C5E, 0x9F88, 0x6C55,\n\t0x9F89, 0x6C62, 0x9F8A, 0x6C6A, 0x9F8B, 0x6C82, 0x9F8C, 0x6C8D,\t0x9F8D, 0x6C9A, 0x9F8E, 0x6C81, 0x9F8F, 0x6C9B, 0x9F90, 0x6C7E,\n\t0x9F91, 0x6C68, 0x9F92, 0x6C73, 0x9F93, 0x6C92, 0x9F94, 0x6C90,\t0x9F95, 0x6CC4, 0x9F96, 0x6CF1, 0x9F97, 0x6CD3, 0x9F98, 0x6CBD,\n\t0x9F99, 0x6CD7, 0x9F9A, 0x6CC5, 0x9F9B, 0x6CDD, 0x9F9C, 0x6CAE,\t0x9F9D, 0x6CB1, 0x9F9E, 0x6CBE, 0x9F9F, 0x6CBA, 0x9FA0, 0x6CDB,\n\t0x9FA1, 0x6CEF, 0x9FA2, 0x6CD9, 0x9FA3, 0x6CEA, 0x9FA4, 0x6D1F,\t0x9FA5, 0x884D, 0x9FA6, 0x6D36, 0x9FA7, 0x6D2B, 0x9FA8, 0x6D3D,\n\t0x9FA9, 0x6D38, 0x9FAA, 0x6D19, 0x9FAB, 0x6D35, 0x9FAC, 0x6D33,\t0x9FAD, 0x6D12, 0x9FAE, 0x6D0C, 0x9FAF, 0x6D63, 0x9FB0, 0x6D93,\n\t0x9FB1, 0x6D64, 0x9FB2, 0x6D5A, 0x9FB3, 0x6D79, 0x9FB4, 0x6D59,\t0x9FB5, 0x6D8E, 0x9FB6, 0x6D95, 0x9FB7, 0x6FE4, 0x9FB8, 0x6D85,\n\t0x9FB9, 0x6DF9, 0x9FBA, 0x6E15, 0x9FBB, 0x6E0A, 0x9FBC, 0x6DB5,\t0x9FBD, 0x6DC7, 0x9FBE, 0x6DE6, 0x9FBF, 0x6DB8, 0x9FC0, 0x6DC6,\n\t0x9FC1, 0x6DEC, 0x9FC2, 0x6DDE, 0x9FC3, 0x6DCC, 0x9FC4, 0x6DE8,\t0x9FC5, 0x6DD2, 0x9FC6, 0x6DC5, 0x9FC7, 0x6DFA, 0x9FC8, 0x6DD9,\n\t0x9FC9, 0x6DE4, 0x9FCA, 0x6DD5, 0x9FCB, 0x6DEA, 0x9FCC, 0x6DEE,\t0x9FCD, 0x6E2D, 0x9FCE, 0x6E6E, 0x9FCF, 0x6E2E, 0x9FD0, 0x6E19,\n\t0x9FD1, 0x6E72, 0x9FD2, 0x6E5F, 0x9FD3, 0x6E3E, 0x9FD4, 0x6E23,\t0x9FD5, 0x6E6B, 0x9FD6, 0x6E2B, 0x9FD7, 0x6E76, 0x9FD8, 0x6E4D,\n\t0x9FD9, 0x6E1F, 0x9FDA, 0x6E43, 0x9FDB, 0x6E3A, 0x9FDC, 0x6E4E,\t0x9FDD, 0x6E24, 0x9FDE, 0x6EFF, 0x9FDF, 0x6E1D, 0x9FE0, 0x6E38,\n\t0x9FE1, 0x6E82, 0x9FE2, 0x6EAA, 0x9FE3, 0x6E98, 0x9FE4, 0x6EC9,\t0x9FE5, 0x6EB7, 0x9FE6, 0x6ED3, 0x9FE7, 0x6EBD, 0x9FE8, 0x6EAF,\n\t0x9FE9, 0x6EC4, 0x9FEA, 0x6EB2, 0x9FEB, 0x6ED4, 0x9FEC, 0x6ED5,\t0x9FED, 0x6E8F, 0x9FEE, 0x6EA5, 0x9FEF, 0x6EC2, 0x9FF0, 0x6E9F,\n\t0x9FF1, 0x6F41, 0x9FF2, 0x6F11, 0x9FF3, 0x704C, 0x9FF4, 0x6EEC,\t0x9FF5, 0x6EF8, 0x9FF6, 0x6EFE, 0x9FF7, 0x6F3F, 0x9FF8, 0x6EF2,\n\t0x9FF9, 0x6F31, 0x9FFA, 0x6EEF, 0x9FFB, 0x6F32, 0x9FFC, 0x6ECC,\t0xE040, 0x6F3E, 0xE041, 0x6F13, 0xE042, 0x6EF7, 0xE043, 0x6F86,\n\t0xE044, 0x6F7A, 0xE045, 0x6F78, 0xE046, 0x6F81, 0xE047, 0x6F80,\t0xE048, 0x6F6F, 0xE049, 0x6F5B, 0xE04A, 0x6FF3, 0xE04B, 0x6F6D,\n\t0xE04C, 0x6F82, 0xE04D, 0x6F7C, 0xE04E, 0x6F58, 0xE04F, 0x6F8E,\t0xE050, 0x6F91, 0xE051, 0x6FC2, 0xE052, 0x6F66, 0xE053, 0x6FB3,\n\t0xE054, 0x6FA3, 0xE055, 0x6FA1, 0xE056, 0x6FA4, 0xE057, 0x6FB9,\t0xE058, 0x6FC6, 0xE059, 0x6FAA, 0xE05A, 0x6FDF, 0xE05B, 0x6FD5,\n\t0xE05C, 0x6FEC, 0xE05D, 0x6FD4, 0xE05E, 0x6FD8, 0xE05F, 0x6FF1,\t0xE060, 0x6FEE, 0xE061, 0x6FDB, 0xE062, 0x7009, 0xE063, 0x700B,\n\t0xE064, 0x6FFA, 0xE065, 0x7011, 0xE066, 0x7001, 0xE067, 0x700F,\t0xE068, 0x6FFE, 0xE069, 0x701B, 0xE06A, 0x701A, 0xE06B, 0x6F74,\n\t0xE06C, 0x701D, 0xE06D, 0x7018, 0xE06E, 0x701F, 0xE06F, 0x7030,\t0xE070, 0x703E, 0xE071, 0x7032, 0xE072, 0x7051, 0xE073, 0x7063,\n\t0xE074, 0x7099, 0xE075, 0x7092, 0xE076, 0x70AF, 0xE077, 0x70F1,\t0xE078, 0x70AC, 0xE079, 0x70B8, 0xE07A, 0x70B3, 0xE07B, 0x70AE,\n\t0xE07C, 0x70DF, 0xE07D, 0x70CB, 0xE07E, 0x70DD, 0xE080, 0x70D9,\t0xE081, 0x7109, 0xE082, 0x70FD, 0xE083, 0x711C, 0xE084, 0x7119,\n\t0xE085, 0x7165, 0xE086, 0x7155, 0xE087, 0x7188, 0xE088, 0x7166,\t0xE089, 0x7162, 0xE08A, 0x714C, 0xE08B, 0x7156, 0xE08C, 0x716C,\n\t0xE08D, 0x718F, 0xE08E, 0x71FB, 0xE08F, 0x7184, 0xE090, 0x7195,\t0xE091, 0x71A8, 0xE092, 0x71AC, 0xE093, 0x71D7, 0xE094, 0x71B9,\n\t0xE095, 0x71BE, 0xE096, 0x71D2, 0xE097, 0x71C9, 0xE098, 0x71D4,\t0xE099, 0x71CE, 0xE09A, 0x71E0, 0xE09B, 0x71EC, 0xE09C, 0x71E7,\n\t0xE09D, 0x71F5, 0xE09E, 0x71FC, 0xE09F, 0x71F9, 0xE0A0, 0x71FF,\t0xE0A1, 0x720D, 0xE0A2, 0x7210, 0xE0A3, 0x721B, 0xE0A4, 0x7228,\n\t0xE0A5, 0x722D, 0xE0A6, 0x722C, 0xE0A7, 0x7230, 0xE0A8, 0x7232,\t0xE0A9, 0x723B, 0xE0AA, 0x723C, 0xE0AB, 0x723F, 0xE0AC, 0x7240,\n\t0xE0AD, 0x7246, 0xE0AE, 0x724B, 0xE0AF, 0x7258, 0xE0B0, 0x7274,\t0xE0B1, 0x727E, 0xE0B2, 0x7282, 0xE0B3, 0x7281, 0xE0B4, 0x7287,\n\t0xE0B5, 0x7292, 0xE0B6, 0x7296, 0xE0B7, 0x72A2, 0xE0B8, 0x72A7,\t0xE0B9, 0x72B9, 0xE0BA, 0x72B2, 0xE0BB, 0x72C3, 0xE0BC, 0x72C6,\n\t0xE0BD, 0x72C4, 0xE0BE, 0x72CE, 0xE0BF, 0x72D2, 0xE0C0, 0x72E2,\t0xE0C1, 0x72E0, 0xE0C2, 0x72E1, 0xE0C3, 0x72F9, 0xE0C4, 0x72F7,\n\t0xE0C5, 0x500F, 0xE0C6, 0x7317, 0xE0C7, 0x730A, 0xE0C8, 0x731C,\t0xE0C9, 0x7316, 0xE0CA, 0x731D, 0xE0CB, 0x7334, 0xE0CC, 0x732F,\n\t0xE0CD, 0x7329, 0xE0CE, 0x7325, 0xE0CF, 0x733E, 0xE0D0, 0x734E,\t0xE0D1, 0x734F, 0xE0D2, 0x9ED8, 0xE0D3, 0x7357, 0xE0D4, 0x736A,\n\t0xE0D5, 0x7368, 0xE0D6, 0x7370, 0xE0D7, 0x7378, 0xE0D8, 0x7375,\t0xE0D9, 0x737B, 0xE0DA, 0x737A, 0xE0DB, 0x73C8, 0xE0DC, 0x73B3,\n\t0xE0DD, 0x73CE, 0xE0DE, 0x73BB, 0xE0DF, 0x73C0, 0xE0E0, 0x73E5,\t0xE0E1, 0x73EE, 0xE0E2, 0x73DE, 0xE0E3, 0x74A2, 0xE0E4, 0x7405,\n\t0xE0E5, 0x746F, 0xE0E6, 0x7425, 0xE0E7, 0x73F8, 0xE0E8, 0x7432,\t0xE0E9, 0x743A, 0xE0EA, 0x7455, 0xE0EB, 0x743F, 0xE0EC, 0x745F,\n\t0xE0ED, 0x7459, 0xE0EE, 0x7441, 0xE0EF, 0x745C, 0xE0F0, 0x7469,\t0xE0F1, 0x7470, 0xE0F2, 0x7463, 0xE0F3, 0x746A, 0xE0F4, 0x7476,\n\t0xE0F5, 0x747E, 0xE0F6, 0x748B, 0xE0F7, 0x749E, 0xE0F8, 0x74A7,\t0xE0F9, 0x74CA, 0xE0FA, 0x74CF, 0xE0FB, 0x74D4, 0xE0FC, 0x73F1,\n\t0xE140, 0x74E0, 0xE141, 0x74E3, 0xE142, 0x74E7, 0xE143, 0x74E9,\t0xE144, 0x74EE, 0xE145, 0x74F2, 0xE146, 0x74F0, 0xE147, 0x74F1,\n\t0xE148, 0x74F8, 0xE149, 0x74F7, 0xE14A, 0x7504, 0xE14B, 0x7503,\t0xE14C, 0x7505, 0xE14D, 0x750C, 0xE14E, 0x750E, 0xE14F, 0x750D,\n\t0xE150, 0x7515, 0xE151, 0x7513, 0xE152, 0x751E, 0xE153, 0x7526,\t0xE154, 0x752C, 0xE155, 0x753C, 0xE156, 0x7544, 0xE157, 0x754D,\n\t0xE158, 0x754A, 0xE159, 0x7549, 0xE15A, 0x755B, 0xE15B, 0x7546,\t0xE15C, 0x755A, 0xE15D, 0x7569, 0xE15E, 0x7564, 0xE15F, 0x7567,\n\t0xE160, 0x756B, 0xE161, 0x756D, 0xE162, 0x7578, 0xE163, 0x7576,\t0xE164, 0x7586, 0xE165, 0x7587, 0xE166, 0x7574, 0xE167, 0x758A,\n\t0xE168, 0x7589, 0xE169, 0x7582, 0xE16A, 0x7594, 0xE16B, 0x759A,\t0xE16C, 0x759D, 0xE16D, 0x75A5, 0xE16E, 0x75A3, 0xE16F, 0x75C2,\n\t0xE170, 0x75B3, 0xE171, 0x75C3, 0xE172, 0x75B5, 0xE173, 0x75BD,\t0xE174, 0x75B8, 0xE175, 0x75BC, 0xE176, 0x75B1, 0xE177, 0x75CD,\n\t0xE178, 0x75CA, 0xE179, 0x75D2, 0xE17A, 0x75D9, 0xE17B, 0x75E3,\t0xE17C, 0x75DE, 0xE17D, 0x75FE, 0xE17E, 0x75FF, 0xE180, 0x75FC,\n\t0xE181, 0x7601, 0xE182, 0x75F0, 0xE183, 0x75FA, 0xE184, 0x75F2,\t0xE185, 0x75F3, 0xE186, 0x760B, 0xE187, 0x760D, 0xE188, 0x7609,\n\t0xE189, 0x761F, 0xE18A, 0x7627, 0xE18B, 0x7620, 0xE18C, 0x7621,\t0xE18D, 0x7622, 0xE18E, 0x7624, 0xE18F, 0x7634, 0xE190, 0x7630,\n\t0xE191, 0x763B, 0xE192, 0x7647, 0xE193, 0x7648, 0xE194, 0x7646,\t0xE195, 0x765C, 0xE196, 0x7658, 0xE197, 0x7661, 0xE198, 0x7662,\n\t0xE199, 0x7668, 0xE19A, 0x7669, 0xE19B, 0x766A, 0xE19C, 0x7667,\t0xE19D, 0x766C, 0xE19E, 0x7670, 0xE19F, 0x7672, 0xE1A0, 0x7676,\n\t0xE1A1, 0x7678, 0xE1A2, 0x767C, 0xE1A3, 0x7680, 0xE1A4, 0x7683,\t0xE1A5, 0x7688, 0xE1A6, 0x768B, 0xE1A7, 0x768E, 0xE1A8, 0x7696,\n\t0xE1A9, 0x7693, 0xE1AA, 0x7699, 0xE1AB, 0x769A, 0xE1AC, 0x76B0,\t0xE1AD, 0x76B4, 0xE1AE, 0x76B8, 0xE1AF, 0x76B9, 0xE1B0, 0x76BA,\n\t0xE1B1, 0x76C2, 0xE1B2, 0x76CD, 0xE1B3, 0x76D6, 0xE1B4, 0x76D2,\t0xE1B5, 0x76DE, 0xE1B6, 0x76E1, 0xE1B7, 0x76E5, 0xE1B8, 0x76E7,\n\t0xE1B9, 0x76EA, 0xE1BA, 0x862F, 0xE1BB, 0x76FB, 0xE1BC, 0x7708,\t0xE1BD, 0x7707, 0xE1BE, 0x7704, 0xE1BF, 0x7729, 0xE1C0, 0x7724,\n\t0xE1C1, 0x771E, 0xE1C2, 0x7725, 0xE1C3, 0x7726, 0xE1C4, 0x771B,\t0xE1C5, 0x7737, 0xE1C6, 0x7738, 0xE1C7, 0x7747, 0xE1C8, 0x775A,\n\t0xE1C9, 0x7768, 0xE1CA, 0x776B, 0xE1CB, 0x775B, 0xE1CC, 0x7765,\t0xE1CD, 0x777F, 0xE1CE, 0x777E, 0xE1CF, 0x7779, 0xE1D0, 0x778E,\n\t0xE1D1, 0x778B, 0xE1D2, 0x7791, 0xE1D3, 0x77A0, 0xE1D4, 0x779E,\t0xE1D5, 0x77B0, 0xE1D6, 0x77B6, 0xE1D7, 0x77B9, 0xE1D8, 0x77BF,\n\t0xE1D9, 0x77BC, 0xE1DA, 0x77BD, 0xE1DB, 0x77BB, 0xE1DC, 0x77C7,\t0xE1DD, 0x77CD, 0xE1DE, 0x77D7, 0xE1DF, 0x77DA, 0xE1E0, 0x77DC,\n\t0xE1E1, 0x77E3, 0xE1E2, 0x77EE, 0xE1E3, 0x77FC, 0xE1E4, 0x780C,\t0xE1E5, 0x7812, 0xE1E6, 0x7926, 0xE1E7, 0x7820, 0xE1E8, 0x792A,\n\t0xE1E9, 0x7845, 0xE1EA, 0x788E, 0xE1EB, 0x7874, 0xE1EC, 0x7886,\t0xE1ED, 0x787C, 0xE1EE, 0x789A, 0xE1EF, 0x788C, 0xE1F0, 0x78A3,\n\t0xE1F1, 0x78B5, 0xE1F2, 0x78AA, 0xE1F3, 0x78AF, 0xE1F4, 0x78D1,\t0xE1F5, 0x78C6, 0xE1F6, 0x78CB, 0xE1F7, 0x78D4, 0xE1F8, 0x78BE,\n\t0xE1F9, 0x78BC, 0xE1FA, 0x78C5, 0xE1FB, 0x78CA, 0xE1FC, 0x78EC,\t0xE240, 0x78E7, 0xE241, 0x78DA, 0xE242, 0x78FD, 0xE243, 0x78F4,\n\t0xE244, 0x7907, 0xE245, 0x7912, 0xE246, 0x7911, 0xE247, 0x7919,\t0xE248, 0x792C, 0xE249, 0x792B, 0xE24A, 0x7940, 0xE24B, 0x7960,\n\t0xE24C, 0x7957, 0xE24D, 0x795F, 0xE24E, 0x795A, 0xE24F, 0x7955,\t0xE250, 0x7953, 0xE251, 0x797A, 0xE252, 0x797F, 0xE253, 0x798A,\n\t0xE254, 0x799D, 0xE255, 0x79A7, 0xE256, 0x9F4B, 0xE257, 0x79AA,\t0xE258, 0x79AE, 0xE259, 0x79B3, 0xE25A, 0x79B9, 0xE25B, 0x79BA,\n\t0xE25C, 0x79C9, 0xE25D, 0x79D5, 0xE25E, 0x79E7, 0xE25F, 0x79EC,\t0xE260, 0x79E1, 0xE261, 0x79E3, 0xE262, 0x7A08, 0xE263, 0x7A0D,\n\t0xE264, 0x7A18, 0xE265, 0x7A19, 0xE266, 0x7A20, 0xE267, 0x7A1F,\t0xE268, 0x7980, 0xE269, 0x7A31, 0xE26A, 0x7A3B, 0xE26B, 0x7A3E,\n\t0xE26C, 0x7A37, 0xE26D, 0x7A43, 0xE26E, 0x7A57, 0xE26F, 0x7A49,\t0xE270, 0x7A61, 0xE271, 0x7A62, 0xE272, 0x7A69, 0xE273, 0x9F9D,\n\t0xE274, 0x7A70, 0xE275, 0x7A79, 0xE276, 0x7A7D, 0xE277, 0x7A88,\t0xE278, 0x7A97, 0xE279, 0x7A95, 0xE27A, 0x7A98, 0xE27B, 0x7A96,\n\t0xE27C, 0x7AA9, 0xE27D, 0x7AC8, 0xE27E, 0x7AB0, 0xE280, 0x7AB6,\t0xE281, 0x7AC5, 0xE282, 0x7AC4, 0xE283, 0x7ABF, 0xE284, 0x9083,\n\t0xE285, 0x7AC7, 0xE286, 0x7ACA, 0xE287, 0x7ACD, 0xE288, 0x7ACF,\t0xE289, 0x7AD5, 0xE28A, 0x7AD3, 0xE28B, 0x7AD9, 0xE28C, 0x7ADA,\n\t0xE28D, 0x7ADD, 0xE28E, 0x7AE1, 0xE28F, 0x7AE2, 0xE290, 0x7AE6,\t0xE291, 0x7AED, 0xE292, 0x7AF0, 0xE293, 0x7B02, 0xE294, 0x7B0F,\n\t0xE295, 0x7B0A, 0xE296, 0x7B06, 0xE297, 0x7B33, 0xE298, 0x7B18,\t0xE299, 0x7B19, 0xE29A, 0x7B1E, 0xE29B, 0x7B35, 0xE29C, 0x7B28,\n\t0xE29D, 0x7B36, 0xE29E, 0x7B50, 0xE29F, 0x7B7A, 0xE2A0, 0x7B04,\t0xE2A1, 0x7B4D, 0xE2A2, 0x7B0B, 0xE2A3, 0x7B4C, 0xE2A4, 0x7B45,\n\t0xE2A5, 0x7B75, 0xE2A6, 0x7B65, 0xE2A7, 0x7B74, 0xE2A8, 0x7B67,\t0xE2A9, 0x7B70, 0xE2AA, 0x7B71, 0xE2AB, 0x7B6C, 0xE2AC, 0x7B6E,\n\t0xE2AD, 0x7B9D, 0xE2AE, 0x7B98, 0xE2AF, 0x7B9F, 0xE2B0, 0x7B8D,\t0xE2B1, 0x7B9C, 0xE2B2, 0x7B9A, 0xE2B3, 0x7B8B, 0xE2B4, 0x7B92,\n\t0xE2B5, 0x7B8F, 0xE2B6, 0x7B5D, 0xE2B7, 0x7B99, 0xE2B8, 0x7BCB,\t0xE2B9, 0x7BC1, 0xE2BA, 0x7BCC, 0xE2BB, 0x7BCF, 0xE2BC, 0x7BB4,\n\t0xE2BD, 0x7BC6, 0xE2BE, 0x7BDD, 0xE2BF, 0x7BE9, 0xE2C0, 0x7C11,\t0xE2C1, 0x7C14, 0xE2C2, 0x7BE6, 0xE2C3, 0x7BE5, 0xE2C4, 0x7C60,\n\t0xE2C5, 0x7C00, 0xE2C6, 0x7C07, 0xE2C7, 0x7C13, 0xE2C8, 0x7BF3,\t0xE2C9, 0x7BF7, 0xE2CA, 0x7C17, 0xE2CB, 0x7C0D, 0xE2CC, 0x7BF6,\n\t0xE2CD, 0x7C23, 0xE2CE, 0x7C27, 0xE2CF, 0x7C2A, 0xE2D0, 0x7C1F,\t0xE2D1, 0x7C37, 0xE2D2, 0x7C2B, 0xE2D3, 0x7C3D, 0xE2D4, 0x7C4C,\n\t0xE2D5, 0x7C43, 0xE2D6, 0x7C54, 0xE2D7, 0x7C4F, 0xE2D8, 0x7C40,\t0xE2D9, 0x7C50, 0xE2DA, 0x7C58, 0xE2DB, 0x7C5F, 0xE2DC, 0x7C64,\n\t0xE2DD, 0x7C56, 0xE2DE, 0x7C65, 0xE2DF, 0x7C6C, 0xE2E0, 0x7C75,\t0xE2E1, 0x7C83, 0xE2E2, 0x7C90, 0xE2E3, 0x7CA4, 0xE2E4, 0x7CAD,\n\t0xE2E5, 0x7CA2, 0xE2E6, 0x7CAB, 0xE2E7, 0x7CA1, 0xE2E8, 0x7CA8,\t0xE2E9, 0x7CB3, 0xE2EA, 0x7CB2, 0xE2EB, 0x7CB1, 0xE2EC, 0x7CAE,\n\t0xE2ED, 0x7CB9, 0xE2EE, 0x7CBD, 0xE2EF, 0x7CC0, 0xE2F0, 0x7CC5,\t0xE2F1, 0x7CC2, 0xE2F2, 0x7CD8, 0xE2F3, 0x7CD2, 0xE2F4, 0x7CDC,\n\t0xE2F5, 0x7CE2, 0xE2F6, 0x9B3B, 0xE2F7, 0x7CEF, 0xE2F8, 0x7CF2,\t0xE2F9, 0x7CF4, 0xE2FA, 0x7CF6, 0xE2FB, 0x7CFA, 0xE2FC, 0x7D06,\n\t0xE340, 0x7D02, 0xE341, 0x7D1C, 0xE342, 0x7D15, 0xE343, 0x7D0A,\t0xE344, 0x7D45, 0xE345, 0x7D4B, 0xE346, 0x7D2E, 0xE347, 0x7D32,\n\t0xE348, 0x7D3F, 0xE349, 0x7D35, 0xE34A, 0x7D46, 0xE34B, 0x7D73,\t0xE34C, 0x7D56, 0xE34D, 0x7D4E, 0xE34E, 0x7D72, 0xE34F, 0x7D68,\n\t0xE350, 0x7D6E, 0xE351, 0x7D4F, 0xE352, 0x7D63, 0xE353, 0x7D93,\t0xE354, 0x7D89, 0xE355, 0x7D5B, 0xE356, 0x7D8F, 0xE357, 0x7D7D,\n\t0xE358, 0x7D9B, 0xE359, 0x7DBA, 0xE35A, 0x7DAE, 0xE35B, 0x7DA3,\t0xE35C, 0x7DB5, 0xE35D, 0x7DC7, 0xE35E, 0x7DBD, 0xE35F, 0x7DAB,\n\t0xE360, 0x7E3D, 0xE361, 0x7DA2, 0xE362, 0x7DAF, 0xE363, 0x7DDC,\t0xE364, 0x7DB8, 0xE365, 0x7D9F, 0xE366, 0x7DB0, 0xE367, 0x7DD8,\n\t0xE368, 0x7DDD, 0xE369, 0x7DE4, 0xE36A, 0x7DDE, 0xE36B, 0x7DFB,\t0xE36C, 0x7DF2, 0xE36D, 0x7DE1, 0xE36E, 0x7E05, 0xE36F, 0x7E0A,\n\t0xE370, 0x7E23, 0xE371, 0x7E21, 0xE372, 0x7E12, 0xE373, 0x7E31,\t0xE374, 0x7E1F, 0xE375, 0x7E09, 0xE376, 0x7E0B, 0xE377, 0x7E22,\n\t0xE378, 0x7E46, 0xE379, 0x7E66, 0xE37A, 0x7E3B, 0xE37B, 0x7E35,\t0xE37C, 0x7E39, 0xE37D, 0x7E43, 0xE37E, 0x7E37, 0xE380, 0x7E32,\n\t0xE381, 0x7E3A, 0xE382, 0x7E67, 0xE383, 0x7E5D, 0xE384, 0x7E56,\t0xE385, 0x7E5E, 0xE386, 0x7E59, 0xE387, 0x7E5A, 0xE388, 0x7E79,\n\t0xE389, 0x7E6A, 0xE38A, 0x7E69, 0xE38B, 0x7E7C, 0xE38C, 0x7E7B,\t0xE38D, 0x7E83, 0xE38E, 0x7DD5, 0xE38F, 0x7E7D, 0xE390, 0x8FAE,\n\t0xE391, 0x7E7F, 0xE392, 0x7E88, 0xE393, 0x7E89, 0xE394, 0x7E8C,\t0xE395, 0x7E92, 0xE396, 0x7E90, 0xE397, 0x7E93, 0xE398, 0x7E94,\n\t0xE399, 0x7E96, 0xE39A, 0x7E8E, 0xE39B, 0x7E9B, 0xE39C, 0x7E9C,\t0xE39D, 0x7F38, 0xE39E, 0x7F3A, 0xE39F, 0x7F45, 0xE3A0, 0x7F4C,\n\t0xE3A1, 0x7F4D, 0xE3A2, 0x7F4E, 0xE3A3, 0x7F50, 0xE3A4, 0x7F51,\t0xE3A5, 0x7F55, 0xE3A6, 0x7F54, 0xE3A7, 0x7F58, 0xE3A8, 0x7F5F,\n\t0xE3A9, 0x7F60, 0xE3AA, 0x7F68, 0xE3AB, 0x7F69, 0xE3AC, 0x7F67,\t0xE3AD, 0x7F78, 0xE3AE, 0x7F82, 0xE3AF, 0x7F86, 0xE3B0, 0x7F83,\n\t0xE3B1, 0x7F88, 0xE3B2, 0x7F87, 0xE3B3, 0x7F8C, 0xE3B4, 0x7F94,\t0xE3B5, 0x7F9E, 0xE3B6, 0x7F9D, 0xE3B7, 0x7F9A, 0xE3B8, 0x7FA3,\n\t0xE3B9, 0x7FAF, 0xE3BA, 0x7FB2, 0xE3BB, 0x7FB9, 0xE3BC, 0x7FAE,\t0xE3BD, 0x7FB6, 0xE3BE, 0x7FB8, 0xE3BF, 0x8B71, 0xE3C0, 0x7FC5,\n\t0xE3C1, 0x7FC6, 0xE3C2, 0x7FCA, 0xE3C3, 0x7FD5, 0xE3C4, 0x7FD4,\t0xE3C5, 0x7FE1, 0xE3C6, 0x7FE6, 0xE3C7, 0x7FE9, 0xE3C8, 0x7FF3,\n\t0xE3C9, 0x7FF9, 0xE3CA, 0x98DC, 0xE3CB, 0x8006, 0xE3CC, 0x8004,\t0xE3CD, 0x800B, 0xE3CE, 0x8012, 0xE3CF, 0x8018, 0xE3D0, 0x8019,\n\t0xE3D1, 0x801C, 0xE3D2, 0x8021, 0xE3D3, 0x8028, 0xE3D4, 0x803F,\t0xE3D5, 0x803B, 0xE3D6, 0x804A, 0xE3D7, 0x8046, 0xE3D8, 0x8052,\n\t0xE3D9, 0x8058, 0xE3DA, 0x805A, 0xE3DB, 0x805F, 0xE3DC, 0x8062,\t0xE3DD, 0x8068, 0xE3DE, 0x8073, 0xE3DF, 0x8072, 0xE3E0, 0x8070,\n\t0xE3E1, 0x8076, 0xE3E2, 0x8079, 0xE3E3, 0x807D, 0xE3E4, 0x807F,\t0xE3E5, 0x8084, 0xE3E6, 0x8086, 0xE3E7, 0x8085, 0xE3E8, 0x809B,\n\t0xE3E9, 0x8093, 0xE3EA, 0x809A, 0xE3EB, 0x80AD, 0xE3EC, 0x5190,\t0xE3ED, 0x80AC, 0xE3EE, 0x80DB, 0xE3EF, 0x80E5, 0xE3F0, 0x80D9,\n\t0xE3F1, 0x80DD, 0xE3F2, 0x80C4, 0xE3F3, 0x80DA, 0xE3F4, 0x80D6,\t0xE3F5, 0x8109, 0xE3F6, 0x80EF, 0xE3F7, 0x80F1, 0xE3F8, 0x811B,\n\t0xE3F9, 0x8129, 0xE3FA, 0x8123, 0xE3FB, 0x812F, 0xE3FC, 0x814B,\t0xE440, 0x968B, 0xE441, 0x8146, 0xE442, 0x813E, 0xE443, 0x8153,\n\t0xE444, 0x8151, 0xE445, 0x80FC, 0xE446, 0x8171, 0xE447, 0x816E,\t0xE448, 0x8165, 0xE449, 0x8166, 0xE44A, 0x8174, 0xE44B, 0x8183,\n\t0xE44C, 0x8188, 0xE44D, 0x818A, 0xE44E, 0x8180, 0xE44F, 0x8182,\t0xE450, 0x81A0, 0xE451, 0x8195, 0xE452, 0x81A4, 0xE453, 0x81A3,\n\t0xE454, 0x815F, 0xE455, 0x8193, 0xE456, 0x81A9, 0xE457, 0x81B0,\t0xE458, 0x81B5, 0xE459, 0x81BE, 0xE45A, 0x81B8, 0xE45B, 0x81BD,\n\t0xE45C, 0x81C0, 0xE45D, 0x81C2, 0xE45E, 0x81BA, 0xE45F, 0x81C9,\t0xE460, 0x81CD, 0xE461, 0x81D1, 0xE462, 0x81D9, 0xE463, 0x81D8,\n\t0xE464, 0x81C8, 0xE465, 0x81DA, 0xE466, 0x81DF, 0xE467, 0x81E0,\t0xE468, 0x81E7, 0xE469, 0x81FA, 0xE46A, 0x81FB, 0xE46B, 0x81FE,\n\t0xE46C, 0x8201, 0xE46D, 0x8202, 0xE46E, 0x8205, 0xE46F, 0x8207,\t0xE470, 0x820A, 0xE471, 0x820D, 0xE472, 0x8210, 0xE473, 0x8216,\n\t0xE474, 0x8229, 0xE475, 0x822B, 0xE476, 0x8238, 0xE477, 0x8233,\t0xE478, 0x8240, 0xE479, 0x8259, 0xE47A, 0x8258, 0xE47B, 0x825D,\n\t0xE47C, 0x825A, 0xE47D, 0x825F, 0xE47E, 0x8264, 0xE480, 0x8262,\t0xE481, 0x8268, 0xE482, 0x826A, 0xE483, 0x826B, 0xE484, 0x822E,\n\t0xE485, 0x8271, 0xE486, 0x8277, 0xE487, 0x8278, 0xE488, 0x827E,\t0xE489, 0x828D, 0xE48A, 0x8292, 0xE48B, 0x82AB, 0xE48C, 0x829F,\n\t0xE48D, 0x82BB, 0xE48E, 0x82AC, 0xE48F, 0x82E1, 0xE490, 0x82E3,\t0xE491, 0x82DF, 0xE492, 0x82D2, 0xE493, 0x82F4, 0xE494, 0x82F3,\n\t0xE495, 0x82FA, 0xE496, 0x8393, 0xE497, 0x8303, 0xE498, 0x82FB,\t0xE499, 0x82F9, 0xE49A, 0x82DE, 0xE49B, 0x8306, 0xE49C, 0x82DC,\n\t0xE49D, 0x8309, 0xE49E, 0x82D9, 0xE49F, 0x8335, 0xE4A0, 0x8334,\t0xE4A1, 0x8316, 0xE4A2, 0x8332, 0xE4A3, 0x8331, 0xE4A4, 0x8340,\n\t0xE4A5, 0x8339, 0xE4A6, 0x8350, 0xE4A7, 0x8345, 0xE4A8, 0x832F,\t0xE4A9, 0x832B, 0xE4AA, 0x8317, 0xE4AB, 0x8318, 0xE4AC, 0x8385,\n\t0xE4AD, 0x839A, 0xE4AE, 0x83AA, 0xE4AF, 0x839F, 0xE4B0, 0x83A2,\t0xE4B1, 0x8396, 0xE4B2, 0x8323, 0xE4B3, 0x838E, 0xE4B4, 0x8387,\n\t0xE4B5, 0x838A, 0xE4B6, 0x837C, 0xE4B7, 0x83B5, 0xE4B8, 0x8373,\t0xE4B9, 0x8375, 0xE4BA, 0x83A0, 0xE4BB, 0x8389, 0xE4BC, 0x83A8,\n\t0xE4BD, 0x83F4, 0xE4BE, 0x8413, 0xE4BF, 0x83EB, 0xE4C0, 0x83CE,\t0xE4C1, 0x83FD, 0xE4C2, 0x8403, 0xE4C3, 0x83D8, 0xE4C4, 0x840B,\n\t0xE4C5, 0x83C1, 0xE4C6, 0x83F7, 0xE4C7, 0x8407, 0xE4C8, 0x83E0,\t0xE4C9, 0x83F2, 0xE4CA, 0x840D, 0xE4CB, 0x8422, 0xE4CC, 0x8420,\n\t0xE4CD, 0x83BD, 0xE4CE, 0x8438, 0xE4CF, 0x8506, 0xE4D0, 0x83FB,\t0xE4D1, 0x846D, 0xE4D2, 0x842A, 0xE4D3, 0x843C, 0xE4D4, 0x855A,\n\t0xE4D5, 0x8484, 0xE4D6, 0x8477, 0xE4D7, 0x846B, 0xE4D8, 0x84AD,\t0xE4D9, 0x846E, 0xE4DA, 0x8482, 0xE4DB, 0x8469, 0xE4DC, 0x8446,\n\t0xE4DD, 0x842C, 0xE4DE, 0x846F, 0xE4DF, 0x8479, 0xE4E0, 0x8435,\t0xE4E1, 0x84CA, 0xE4E2, 0x8462, 0xE4E3, 0x84B9, 0xE4E4, 0x84BF,\n\t0xE4E5, 0x849F, 0xE4E6, 0x84D9, 0xE4E7, 0x84CD, 0xE4E8, 0x84BB,\t0xE4E9, 0x84DA, 0xE4EA, 0x84D0, 0xE4EB, 0x84C1, 0xE4EC, 0x84C6,\n\t0xE4ED, 0x84D6, 0xE4EE, 0x84A1, 0xE4EF, 0x8521, 0xE4F0, 0x84FF,\t0xE4F1, 0x84F4, 0xE4F2, 0x8517, 0xE4F3, 0x8518, 0xE4F4, 0x852C,\n\t0xE4F5, 0x851F, 0xE4F6, 0x8515, 0xE4F7, 0x8514, 0xE4F8, 0x84FC,\t0xE4F9, 0x8540, 0xE4FA, 0x8563, 0xE4FB, 0x8558, 0xE4FC, 0x8548,\n\t0xE540, 0x8541, 0xE541, 0x8602, 0xE542, 0x854B, 0xE543, 0x8555,\t0xE544, 0x8580, 0xE545, 0x85A4, 0xE546, 0x8588, 0xE547, 0x8591,\n\t0xE548, 0x858A, 0xE549, 0x85A8, 0xE54A, 0x856D, 0xE54B, 0x8594,\t0xE54C, 0x859B, 0xE54D, 0x85EA, 0xE54E, 0x8587, 0xE54F, 0x859C,\n\t0xE550, 0x8577, 0xE551, 0x857E, 0xE552, 0x8590, 0xE553, 0x85C9,\t0xE554, 0x85BA, 0xE555, 0x85CF, 0xE556, 0x85B9, 0xE557, 0x85D0,\n\t0xE558, 0x85D5, 0xE559, 0x85DD, 0xE55A, 0x85E5, 0xE55B, 0x85DC,\t0xE55C, 0x85F9, 0xE55D, 0x860A, 0xE55E, 0x8613, 0xE55F, 0x860B,\n\t0xE560, 0x85FE, 0xE561, 0x85FA, 0xE562, 0x8606, 0xE563, 0x8622,\t0xE564, 0x861A, 0xE565, 0x8630, 0xE566, 0x863F, 0xE567, 0x864D,\n\t0xE568, 0x4E55, 0xE569, 0x8654, 0xE56A, 0x865F, 0xE56B, 0x8667,\t0xE56C, 0x8671, 0xE56D, 0x8693, 0xE56E, 0x86A3, 0xE56F, 0x86A9,\n\t0xE570, 0x86AA, 0xE571, 0x868B, 0xE572, 0x868C, 0xE573, 0x86B6,\t0xE574, 0x86AF, 0xE575, 0x86C4, 0xE576, 0x86C6, 0xE577, 0x86B0,\n\t0xE578, 0x86C9, 0xE579, 0x8823, 0xE57A, 0x86AB, 0xE57B, 0x86D4,\t0xE57C, 0x86DE, 0xE57D, 0x86E9, 0xE57E, 0x86EC, 0xE580, 0x86DF,\n\t0xE581, 0x86DB, 0xE582, 0x86EF, 0xE583, 0x8712, 0xE584, 0x8706,\t0xE585, 0x8708, 0xE586, 0x8700, 0xE587, 0x8703, 0xE588, 0x86FB,\n\t0xE589, 0x8711, 0xE58A, 0x8709, 0xE58B, 0x870D, 0xE58C, 0x86F9,\t0xE58D, 0x870A, 0xE58E, 0x8734, 0xE58F, 0x873F, 0xE590, 0x8737,\n\t0xE591, 0x873B, 0xE592, 0x8725, 0xE593, 0x8729, 0xE594, 0x871A,\t0xE595, 0x8760, 0xE596, 0x875F, 0xE597, 0x8778, 0xE598, 0x874C,\n\t0xE599, 0x874E, 0xE59A, 0x8774, 0xE59B, 0x8757, 0xE59C, 0x8768,\t0xE59D, 0x876E, 0xE59E, 0x8759, 0xE59F, 0x8753, 0xE5A0, 0x8763,\n\t0xE5A1, 0x876A, 0xE5A2, 0x8805, 0xE5A3, 0x87A2, 0xE5A4, 0x879F,\t0xE5A5, 0x8782, 0xE5A6, 0x87AF, 0xE5A7, 0x87CB, 0xE5A8, 0x87BD,\n\t0xE5A9, 0x87C0, 0xE5AA, 0x87D0, 0xE5AB, 0x96D6, 0xE5AC, 0x87AB,\t0xE5AD, 0x87C4, 0xE5AE, 0x87B3, 0xE5AF, 0x87C7, 0xE5B0, 0x87C6,\n\t0xE5B1, 0x87BB, 0xE5B2, 0x87EF, 0xE5B3, 0x87F2, 0xE5B4, 0x87E0,\t0xE5B5, 0x880F, 0xE5B6, 0x880D, 0xE5B7, 0x87FE, 0xE5B8, 0x87F6,\n\t0xE5B9, 0x87F7, 0xE5BA, 0x880E, 0xE5BB, 0x87D2, 0xE5BC, 0x8811,\t0xE5BD, 0x8816, 0xE5BE, 0x8815, 0xE5BF, 0x8822, 0xE5C0, 0x8821,\n\t0xE5C1, 0x8831, 0xE5C2, 0x8836, 0xE5C3, 0x8839, 0xE5C4, 0x8827,\t0xE5C5, 0x883B, 0xE5C6, 0x8844, 0xE5C7, 0x8842, 0xE5C8, 0x8852,\n\t0xE5C9, 0x8859, 0xE5CA, 0x885E, 0xE5CB, 0x8862, 0xE5CC, 0x886B,\t0xE5CD, 0x8881, 0xE5CE, 0x887E, 0xE5CF, 0x889E, 0xE5D0, 0x8875,\n\t0xE5D1, 0x887D, 0xE5D2, 0x88B5, 0xE5D3, 0x8872, 0xE5D4, 0x8882,\t0xE5D5, 0x8897, 0xE5D6, 0x8892, 0xE5D7, 0x88AE, 0xE5D8, 0x8899,\n\t0xE5D9, 0x88A2, 0xE5DA, 0x888D, 0xE5DB, 0x88A4, 0xE5DC, 0x88B0,\t0xE5DD, 0x88BF, 0xE5DE, 0x88B1, 0xE5DF, 0x88C3, 0xE5E0, 0x88C4,\n\t0xE5E1, 0x88D4, 0xE5E2, 0x88D8, 0xE5E3, 0x88D9, 0xE5E4, 0x88DD,\t0xE5E5, 0x88F9, 0xE5E6, 0x8902, 0xE5E7, 0x88FC, 0xE5E8, 0x88F4,\n\t0xE5E9, 0x88E8, 0xE5EA, 0x88F2, 0xE5EB, 0x8904, 0xE5EC, 0x890C,\t0xE5ED, 0x890A, 0xE5EE, 0x8913, 0xE5EF, 0x8943, 0xE5F0, 0x891E,\n\t0xE5F1, 0x8925, 0xE5F2, 0x892A, 0xE5F3, 0x892B, 0xE5F4, 0x8941,\t0xE5F5, 0x8944, 0xE5F6, 0x893B, 0xE5F7, 0x8936, 0xE5F8, 0x8938,\n\t0xE5F9, 0x894C, 0xE5FA, 0x891D, 0xE5FB, 0x8960, 0xE5FC, 0x895E,\t0xE640, 0x8966, 0xE641, 0x8964, 0xE642, 0x896D, 0xE643, 0x896A,\n\t0xE644, 0x896F, 0xE645, 0x8974, 0xE646, 0x8977, 0xE647, 0x897E,\t0xE648, 0x8983, 0xE649, 0x8988, 0xE64A, 0x898A, 0xE64B, 0x8993,\n\t0xE64C, 0x8998, 0xE64D, 0x89A1, 0xE64E, 0x89A9, 0xE64F, 0x89A6,\t0xE650, 0x89AC, 0xE651, 0x89AF, 0xE652, 0x89B2, 0xE653, 0x89BA,\n\t0xE654, 0x89BD, 0xE655, 0x89BF, 0xE656, 0x89C0, 0xE657, 0x89DA,\t0xE658, 0x89DC, 0xE659, 0x89DD, 0xE65A, 0x89E7, 0xE65B, 0x89F4,\n\t0xE65C, 0x89F8, 0xE65D, 0x8A03, 0xE65E, 0x8A16, 0xE65F, 0x8A10,\t0xE660, 0x8A0C, 0xE661, 0x8A1B, 0xE662, 0x8A1D, 0xE663, 0x8A25,\n\t0xE664, 0x8A36, 0xE665, 0x8A41, 0xE666, 0x8A5B, 0xE667, 0x8A52,\t0xE668, 0x8A46, 0xE669, 0x8A48, 0xE66A, 0x8A7C, 0xE66B, 0x8A6D,\n\t0xE66C, 0x8A6C, 0xE66D, 0x8A62, 0xE66E, 0x8A85, 0xE66F, 0x8A82,\t0xE670, 0x8A84, 0xE671, 0x8AA8, 0xE672, 0x8AA1, 0xE673, 0x8A91,\n\t0xE674, 0x8AA5, 0xE675, 0x8AA6, 0xE676, 0x8A9A, 0xE677, 0x8AA3,\t0xE678, 0x8AC4, 0xE679, 0x8ACD, 0xE67A, 0x8AC2, 0xE67B, 0x8ADA,\n\t0xE67C, 0x8AEB, 0xE67D, 0x8AF3, 0xE67E, 0x8AE7, 0xE680, 0x8AE4,\t0xE681, 0x8AF1, 0xE682, 0x8B14, 0xE683, 0x8AE0, 0xE684, 0x8AE2,\n\t0xE685, 0x8AF7, 0xE686, 0x8ADE, 0xE687, 0x8ADB, 0xE688, 0x8B0C,\t0xE689, 0x8B07, 0xE68A, 0x8B1A, 0xE68B, 0x8AE1, 0xE68C, 0x8B16,\n\t0xE68D, 0x8B10, 0xE68E, 0x8B17, 0xE68F, 0x8B20, 0xE690, 0x8B33,\t0xE691, 0x97AB, 0xE692, 0x8B26, 0xE693, 0x8B2B, 0xE694, 0x8B3E,\n\t0xE695, 0x8B28, 0xE696, 0x8B41, 0xE697, 0x8B4C, 0xE698, 0x8B4F,\t0xE699, 0x8B4E, 0xE69A, 0x8B49, 0xE69B, 0x8B56, 0xE69C, 0x8B5B,\n\t0xE69D, 0x8B5A, 0xE69E, 0x8B6B, 0xE69F, 0x8B5F, 0xE6A0, 0x8B6C,\t0xE6A1, 0x8B6F, 0xE6A2, 0x8B74, 0xE6A3, 0x8B7D, 0xE6A4, 0x8B80,\n\t0xE6A5, 0x8B8C, 0xE6A6, 0x8B8E, 0xE6A7, 0x8B92, 0xE6A8, 0x8B93,\t0xE6A9, 0x8B96, 0xE6AA, 0x8B99, 0xE6AB, 0x8B9A, 0xE6AC, 0x8C3A,\n\t0xE6AD, 0x8C41, 0xE6AE, 0x8C3F, 0xE6AF, 0x8C48, 0xE6B0, 0x8C4C,\t0xE6B1, 0x8C4E, 0xE6B2, 0x8C50, 0xE6B3, 0x8C55, 0xE6B4, 0x8C62,\n\t0xE6B5, 0x8C6C, 0xE6B6, 0x8C78, 0xE6B7, 0x8C7A, 0xE6B8, 0x8C82,\t0xE6B9, 0x8C89, 0xE6BA, 0x8C85, 0xE6BB, 0x8C8A, 0xE6BC, 0x8C8D,\n\t0xE6BD, 0x8C8E, 0xE6BE, 0x8C94, 0xE6BF, 0x8C7C, 0xE6C0, 0x8C98,\t0xE6C1, 0x621D, 0xE6C2, 0x8CAD, 0xE6C3, 0x8CAA, 0xE6C4, 0x8CBD,\n\t0xE6C5, 0x8CB2, 0xE6C6, 0x8CB3, 0xE6C7, 0x8CAE, 0xE6C8, 0x8CB6,\t0xE6C9, 0x8CC8, 0xE6CA, 0x8CC1, 0xE6CB, 0x8CE4, 0xE6CC, 0x8CE3,\n\t0xE6CD, 0x8CDA, 0xE6CE, 0x8CFD, 0xE6CF, 0x8CFA, 0xE6D0, 0x8CFB,\t0xE6D1, 0x8D04, 0xE6D2, 0x8D05, 0xE6D3, 0x8D0A, 0xE6D4, 0x8D07,\n\t0xE6D5, 0x8D0F, 0xE6D6, 0x8D0D, 0xE6D7, 0x8D10, 0xE6D8, 0x9F4E,\t0xE6D9, 0x8D13, 0xE6DA, 0x8CCD, 0xE6DB, 0x8D14, 0xE6DC, 0x8D16,\n\t0xE6DD, 0x8D67, 0xE6DE, 0x8D6D, 0xE6DF, 0x8D71, 0xE6E0, 0x8D73,\t0xE6E1, 0x8D81, 0xE6E2, 0x8D99, 0xE6E3, 0x8DC2, 0xE6E4, 0x8DBE,\n\t0xE6E5, 0x8DBA, 0xE6E6, 0x8DCF, 0xE6E7, 0x8DDA, 0xE6E8, 0x8DD6,\t0xE6E9, 0x8DCC, 0xE6EA, 0x8DDB, 0xE6EB, 0x8DCB, 0xE6EC, 0x8DEA,\n\t0xE6ED, 0x8DEB, 0xE6EE, 0x8DDF, 0xE6EF, 0x8DE3, 0xE6F0, 0x8DFC,\t0xE6F1, 0x8E08, 0xE6F2, 0x8E09, 0xE6F3, 0x8DFF, 0xE6F4, 0x8E1D,\n\t0xE6F5, 0x8E1E, 0xE6F6, 0x8E10, 0xE6F7, 0x8E1F, 0xE6F8, 0x8E42,\t0xE6F9, 0x8E35, 0xE6FA, 0x8E30, 0xE6FB, 0x8E34, 0xE6FC, 0x8E4A,\n\t0xE740, 0x8E47, 0xE741, 0x8E49, 0xE742, 0x8E4C, 0xE743, 0x8E50,\t0xE744, 0x8E48, 0xE745, 0x8E59, 0xE746, 0x8E64, 0xE747, 0x8E60,\n\t0xE748, 0x8E2A, 0xE749, 0x8E63, 0xE74A, 0x8E55, 0xE74B, 0x8E76,\t0xE74C, 0x8E72, 0xE74D, 0x8E7C, 0xE74E, 0x8E81, 0xE74F, 0x8E87,\n\t0xE750, 0x8E85, 0xE751, 0x8E84, 0xE752, 0x8E8B, 0xE753, 0x8E8A,\t0xE754, 0x8E93, 0xE755, 0x8E91, 0xE756, 0x8E94, 0xE757, 0x8E99,\n\t0xE758, 0x8EAA, 0xE759, 0x8EA1, 0xE75A, 0x8EAC, 0xE75B, 0x8EB0,\t0xE75C, 0x8EC6, 0xE75D, 0x8EB1, 0xE75E, 0x8EBE, 0xE75F, 0x8EC5,\n\t0xE760, 0x8EC8, 0xE761, 0x8ECB, 0xE762, 0x8EDB, 0xE763, 0x8EE3,\t0xE764, 0x8EFC, 0xE765, 0x8EFB, 0xE766, 0x8EEB, 0xE767, 0x8EFE,\n\t0xE768, 0x8F0A, 0xE769, 0x8F05, 0xE76A, 0x8F15, 0xE76B, 0x8F12,\t0xE76C, 0x8F19, 0xE76D, 0x8F13, 0xE76E, 0x8F1C, 0xE76F, 0x8F1F,\n\t0xE770, 0x8F1B, 0xE771, 0x8F0C, 0xE772, 0x8F26, 0xE773, 0x8F33,\t0xE774, 0x8F3B, 0xE775, 0x8F39, 0xE776, 0x8F45, 0xE777, 0x8F42,\n\t0xE778, 0x8F3E, 0xE779, 0x8F4C, 0xE77A, 0x8F49, 0xE77B, 0x8F46,\t0xE77C, 0x8F4E, 0xE77D, 0x8F57, 0xE77E, 0x8F5C, 0xE780, 0x8F62,\n\t0xE781, 0x8F63, 0xE782, 0x8F64, 0xE783, 0x8F9C, 0xE784, 0x8F9F,\t0xE785, 0x8FA3, 0xE786, 0x8FAD, 0xE787, 0x8FAF, 0xE788, 0x8FB7,\n\t0xE789, 0x8FDA, 0xE78A, 0x8FE5, 0xE78B, 0x8FE2, 0xE78C, 0x8FEA,\t0xE78D, 0x8FEF, 0xE78E, 0x9087, 0xE78F, 0x8FF4, 0xE790, 0x9005,\n\t0xE791, 0x8FF9, 0xE792, 0x8FFA, 0xE793, 0x9011, 0xE794, 0x9015,\t0xE795, 0x9021, 0xE796, 0x900D, 0xE797, 0x901E, 0xE798, 0x9016,\n\t0xE799, 0x900B, 0xE79A, 0x9027, 0xE79B, 0x9036, 0xE79C, 0x9035,\t0xE79D, 0x9039, 0xE79E, 0x8FF8, 0xE79F, 0x904F, 0xE7A0, 0x9050,\n\t0xE7A1, 0x9051, 0xE7A2, 0x9052, 0xE7A3, 0x900E, 0xE7A4, 0x9049,\t0xE7A5, 0x903E, 0xE7A6, 0x9056, 0xE7A7, 0x9058, 0xE7A8, 0x905E,\n\t0xE7A9, 0x9068, 0xE7AA, 0x906F, 0xE7AB, 0x9076, 0xE7AC, 0x96A8,\t0xE7AD, 0x9072, 0xE7AE, 0x9082, 0xE7AF, 0x907D, 0xE7B0, 0x9081,\n\t0xE7B1, 0x9080, 0xE7B2, 0x908A, 0xE7B3, 0x9089, 0xE7B4, 0x908F,\t0xE7B5, 0x90A8, 0xE7B6, 0x90AF, 0xE7B7, 0x90B1, 0xE7B8, 0x90B5,\n\t0xE7B9, 0x90E2, 0xE7BA, 0x90E4, 0xE7BB, 0x6248, 0xE7BC, 0x90DB,\t0xE7BD, 0x9102, 0xE7BE, 0x9112, 0xE7BF, 0x9119, 0xE7C0, 0x9132,\n\t0xE7C1, 0x9130, 0xE7C2, 0x914A, 0xE7C3, 0x9156, 0xE7C4, 0x9158,\t0xE7C5, 0x9163, 0xE7C6, 0x9165, 0xE7C7, 0x9169, 0xE7C8, 0x9173,\n\t0xE7C9, 0x9172, 0xE7CA, 0x918B, 0xE7CB, 0x9189, 0xE7CC, 0x9182,\t0xE7CD, 0x91A2, 0xE7CE, 0x91AB, 0xE7CF, 0x91AF, 0xE7D0, 0x91AA,\n\t0xE7D1, 0x91B5, 0xE7D2, 0x91B4, 0xE7D3, 0x91BA, 0xE7D4, 0x91C0,\t0xE7D5, 0x91C1, 0xE7D6, 0x91C9, 0xE7D7, 0x91CB, 0xE7D8, 0x91D0,\n\t0xE7D9, 0x91D6, 0xE7DA, 0x91DF, 0xE7DB, 0x91E1, 0xE7DC, 0x91DB,\t0xE7DD, 0x91FC, 0xE7DE, 0x91F5, 0xE7DF, 0x91F6, 0xE7E0, 0x921E,\n\t0xE7E1, 0x91FF, 0xE7E2, 0x9214, 0xE7E3, 0x922C, 0xE7E4, 0x9215,\t0xE7E5, 0x9211, 0xE7E6, 0x925E, 0xE7E7, 0x9257, 0xE7E8, 0x9245,\n\t0xE7E9, 0x9249, 0xE7EA, 0x9264, 0xE7EB, 0x9248, 0xE7EC, 0x9295,\t0xE7ED, 0x923F, 0xE7EE, 0x924B, 0xE7EF, 0x9250, 0xE7F0, 0x929C,\n\t0xE7F1, 0x9296, 0xE7F2, 0x9293, 0xE7F3, 0x929B, 0xE7F4, 0x925A,\t0xE7F5, 0x92CF, 0xE7F6, 0x92B9, 0xE7F7, 0x92B7, 0xE7F8, 0x92E9,\n\t0xE7F9, 0x930F, 0xE7FA, 0x92FA, 0xE7FB, 0x9344, 0xE7FC, 0x932E,\t0xE840, 0x9319, 0xE841, 0x9322, 0xE842, 0x931A, 0xE843, 0x9323,\n\t0xE844, 0x933A, 0xE845, 0x9335, 0xE846, 0x933B, 0xE847, 0x935C,\t0xE848, 0x9360, 0xE849, 0x937C, 0xE84A, 0x936E, 0xE84B, 0x9356,\n\t0xE84C, 0x93B0, 0xE84D, 0x93AC, 0xE84E, 0x93AD, 0xE84F, 0x9394,\t0xE850, 0x93B9, 0xE851, 0x93D6, 0xE852, 0x93D7, 0xE853, 0x93E8,\n\t0xE854, 0x93E5, 0xE855, 0x93D8, 0xE856, 0x93C3, 0xE857, 0x93DD,\t0xE858, 0x93D0, 0xE859, 0x93C8, 0xE85A, 0x93E4, 0xE85B, 0x941A,\n\t0xE85C, 0x9414, 0xE85D, 0x9413, 0xE85E, 0x9403, 0xE85F, 0x9407,\t0xE860, 0x9410, 0xE861, 0x9436, 0xE862, 0x942B, 0xE863, 0x9435,\n\t0xE864, 0x9421, 0xE865, 0x943A, 0xE866, 0x9441, 0xE867, 0x9452,\t0xE868, 0x9444, 0xE869, 0x945B, 0xE86A, 0x9460, 0xE86B, 0x9462,\n\t0xE86C, 0x945E, 0xE86D, 0x946A, 0xE86E, 0x9229, 0xE86F, 0x9470,\t0xE870, 0x9475, 0xE871, 0x9477, 0xE872, 0x947D, 0xE873, 0x945A,\n\t0xE874, 0x947C, 0xE875, 0x947E, 0xE876, 0x9481, 0xE877, 0x947F,\t0xE878, 0x9582, 0xE879, 0x9587, 0xE87A, 0x958A, 0xE87B, 0x9594,\n\t0xE87C, 0x9596, 0xE87D, 0x9598, 0xE87E, 0x9599, 0xE880, 0x95A0,\t0xE881, 0x95A8, 0xE882, 0x95A7, 0xE883, 0x95AD, 0xE884, 0x95BC,\n\t0xE885, 0x95BB, 0xE886, 0x95B9, 0xE887, 0x95BE, 0xE888, 0x95CA,\t0xE889, 0x6FF6, 0xE88A, 0x95C3, 0xE88B, 0x95CD, 0xE88C, 0x95CC,\n\t0xE88D, 0x95D5, 0xE88E, 0x95D4, 0xE88F, 0x95D6, 0xE890, 0x95DC,\t0xE891, 0x95E1, 0xE892, 0x95E5, 0xE893, 0x95E2, 0xE894, 0x9621,\n\t0xE895, 0x9628, 0xE896, 0x962E, 0xE897, 0x962F, 0xE898, 0x9642,\t0xE899, 0x964C, 0xE89A, 0x964F, 0xE89B, 0x964B, 0xE89C, 0x9677,\n\t0xE89D, 0x965C, 0xE89E, 0x965E, 0xE89F, 0x965D, 0xE8A0, 0x965F,\t0xE8A1, 0x9666, 0xE8A2, 0x9672, 0xE8A3, 0x966C, 0xE8A4, 0x968D,\n\t0xE8A5, 0x9698, 0xE8A6, 0x9695, 0xE8A7, 0x9697, 0xE8A8, 0x96AA,\t0xE8A9, 0x96A7, 0xE8AA, 0x96B1, 0xE8AB, 0x96B2, 0xE8AC, 0x96B0,\n\t0xE8AD, 0x96B4, 0xE8AE, 0x96B6, 0xE8AF, 0x96B8, 0xE8B0, 0x96B9,\t0xE8B1, 0x96CE, 0xE8B2, 0x96CB, 0xE8B3, 0x96C9, 0xE8B4, 0x96CD,\n\t0xE8B5, 0x894D, 0xE8B6, 0x96DC, 0xE8B7, 0x970D, 0xE8B8, 0x96D5,\t0xE8B9, 0x96F9, 0xE8BA, 0x9704, 0xE8BB, 0x9706, 0xE8BC, 0x9708,\n\t0xE8BD, 0x9713, 0xE8BE, 0x970E, 0xE8BF, 0x9711, 0xE8C0, 0x970F,\t0xE8C1, 0x9716, 0xE8C2, 0x9719, 0xE8C3, 0x9724, 0xE8C4, 0x972A,\n\t0xE8C5, 0x9730, 0xE8C6, 0x9739, 0xE8C7, 0x973D, 0xE8C8, 0x973E,\t0xE8C9, 0x9744, 0xE8CA, 0x9746, 0xE8CB, 0x9748, 0xE8CC, 0x9742,\n\t0xE8CD, 0x9749, 0xE8CE, 0x975C, 0xE8CF, 0x9760, 0xE8D0, 0x9764,\t0xE8D1, 0x9766, 0xE8D2, 0x9768, 0xE8D3, 0x52D2, 0xE8D4, 0x976B,\n\t0xE8D5, 0x9771, 0xE8D6, 0x9779, 0xE8D7, 0x9785, 0xE8D8, 0x977C,\t0xE8D9, 0x9781, 0xE8DA, 0x977A, 0xE8DB, 0x9786, 0xE8DC, 0x978B,\n\t0xE8DD, 0x978F, 0xE8DE, 0x9790, 0xE8DF, 0x979C, 0xE8E0, 0x97A8,\t0xE8E1, 0x97A6, 0xE8E2, 0x97A3, 0xE8E3, 0x97B3, 0xE8E4, 0x97B4,\n\t0xE8E5, 0x97C3, 0xE8E6, 0x97C6, 0xE8E7, 0x97C8, 0xE8E8, 0x97CB,\t0xE8E9, 0x97DC, 0xE8EA, 0x97ED, 0xE8EB, 0x9F4F, 0xE8EC, 0x97F2,\n\t0xE8ED, 0x7ADF, 0xE8EE, 0x97F6, 0xE8EF, 0x97F5, 0xE8F0, 0x980F,\t0xE8F1, 0x980C, 0xE8F2, 0x9838, 0xE8F3, 0x9824, 0xE8F4, 0x9821,\n\t0xE8F5, 0x9837, 0xE8F6, 0x983D, 0xE8F7, 0x9846, 0xE8F8, 0x984F,\t0xE8F9, 0x984B, 0xE8FA, 0x986B, 0xE8FB, 0x986F, 0xE8FC, 0x9870,\n\t0xE940, 0x9871, 0xE941, 0x9874, 0xE942, 0x9873, 0xE943, 0x98AA,\t0xE944, 0x98AF, 0xE945, 0x98B1, 0xE946, 0x98B6, 0xE947, 0x98C4,\n\t0xE948, 0x98C3, 0xE949, 0x98C6, 0xE94A, 0x98E9, 0xE94B, 0x98EB,\t0xE94C, 0x9903, 0xE94D, 0x9909, 0xE94E, 0x9912, 0xE94F, 0x9914,\n\t0xE950, 0x9918, 0xE951, 0x9921, 0xE952, 0x991D, 0xE953, 0x991E,\t0xE954, 0x9924, 0xE955, 0x9920, 0xE956, 0x992C, 0xE957, 0x992E,\n\t0xE958, 0x993D, 0xE959, 0x993E, 0xE95A, 0x9942, 0xE95B, 0x9949,\t0xE95C, 0x9945, 0xE95D, 0x9950, 0xE95E, 0x994B, 0xE95F, 0x9951,\n\t0xE960, 0x9952, 0xE961, 0x994C, 0xE962, 0x9955, 0xE963, 0x9997,\t0xE964, 0x9998, 0xE965, 0x99A5, 0xE966, 0x99AD, 0xE967, 0x99AE,\n\t0xE968, 0x99BC, 0xE969, 0x99DF, 0xE96A, 0x99DB, 0xE96B, 0x99DD,\t0xE96C, 0x99D8, 0xE96D, 0x99D1, 0xE96E, 0x99ED, 0xE96F, 0x99EE,\n\t0xE970, 0x99F1, 0xE971, 0x99F2, 0xE972, 0x99FB, 0xE973, 0x99F8,\t0xE974, 0x9A01, 0xE975, 0x9A0F, 0xE976, 0x9A05, 0xE977, 0x99E2,\n\t0xE978, 0x9A19, 0xE979, 0x9A2B, 0xE97A, 0x9A37, 0xE97B, 0x9A45,\t0xE97C, 0x9A42, 0xE97D, 0x9A40, 0xE97E, 0x9A43, 0xE980, 0x9A3E,\n\t0xE981, 0x9A55, 0xE982, 0x9A4D, 0xE983, 0x9A5B, 0xE984, 0x9A57,\t0xE985, 0x9A5F, 0xE986, 0x9A62, 0xE987, 0x9A65, 0xE988, 0x9A64,\n\t0xE989, 0x9A69, 0xE98A, 0x9A6B, 0xE98B, 0x9A6A, 0xE98C, 0x9AAD,\t0xE98D, 0x9AB0, 0xE98E, 0x9ABC, 0xE98F, 0x9AC0, 0xE990, 0x9ACF,\n\t0xE991, 0x9AD1, 0xE992, 0x9AD3, 0xE993, 0x9AD4, 0xE994, 0x9ADE,\t0xE995, 0x9ADF, 0xE996, 0x9AE2, 0xE997, 0x9AE3, 0xE998, 0x9AE6,\n\t0xE999, 0x9AEF, 0xE99A, 0x9AEB, 0xE99B, 0x9AEE, 0xE99C, 0x9AF4,\t0xE99D, 0x9AF1, 0xE99E, 0x9AF7, 0xE99F, 0x9AFB, 0xE9A0, 0x9B06,\n\t0xE9A1, 0x9B18, 0xE9A2, 0x9B1A, 0xE9A3, 0x9B1F, 0xE9A4, 0x9B22,\t0xE9A5, 0x9B23, 0xE9A6, 0x9B25, 0xE9A7, 0x9B27, 0xE9A8, 0x9B28,\n\t0xE9A9, 0x9B29, 0xE9AA, 0x9B2A, 0xE9AB, 0x9B2E, 0xE9AC, 0x9B2F,\t0xE9AD, 0x9B32, 0xE9AE, 0x9B44, 0xE9AF, 0x9B43, 0xE9B0, 0x9B4F,\n\t0xE9B1, 0x9B4D, 0xE9B2, 0x9B4E, 0xE9B3, 0x9B51, 0xE9B4, 0x9B58,\t0xE9B5, 0x9B74, 0xE9B6, 0x9B93, 0xE9B7, 0x9B83, 0xE9B8, 0x9B91,\n\t0xE9B9, 0x9B96, 0xE9BA, 0x9B97, 0xE9BB, 0x9B9F, 0xE9BC, 0x9BA0,\t0xE9BD, 0x9BA8, 0xE9BE, 0x9BB4, 0xE9BF, 0x9BC0, 0xE9C0, 0x9BCA,\n\t0xE9C1, 0x9BB9, 0xE9C2, 0x9BC6, 0xE9C3, 0x9BCF, 0xE9C4, 0x9BD1,\t0xE9C5, 0x9BD2, 0xE9C6, 0x9BE3, 0xE9C7, 0x9BE2, 0xE9C8, 0x9BE4,\n\t0xE9C9, 0x9BD4, 0xE9CA, 0x9BE1, 0xE9CB, 0x9C3A, 0xE9CC, 0x9BF2,\t0xE9CD, 0x9BF1, 0xE9CE, 0x9BF0, 0xE9CF, 0x9C15, 0xE9D0, 0x9C14,\n\t0xE9D1, 0x9C09, 0xE9D2, 0x9C13, 0xE9D3, 0x9C0C, 0xE9D4, 0x9C06,\t0xE9D5, 0x9C08, 0xE9D6, 0x9C12, 0xE9D7, 0x9C0A, 0xE9D8, 0x9C04,\n\t0xE9D9, 0x9C2E, 0xE9DA, 0x9C1B, 0xE9DB, 0x9C25, 0xE9DC, 0x9C24,\t0xE9DD, 0x9C21, 0xE9DE, 0x9C30, 0xE9DF, 0x9C47, 0xE9E0, 0x9C32,\n\t0xE9E1, 0x9C46, 0xE9E2, 0x9C3E, 0xE9E3, 0x9C5A, 0xE9E4, 0x9C60,\t0xE9E5, 0x9C67, 0xE9E6, 0x9C76, 0xE9E7, 0x9C78, 0xE9E8, 0x9CE7,\n\t0xE9E9, 0x9CEC, 0xE9EA, 0x9CF0, 0xE9EB, 0x9D09, 0xE9EC, 0x9D08,\t0xE9ED, 0x9CEB, 0xE9EE, 0x9D03, 0xE9EF, 0x9D06, 0xE9F0, 0x9D2A,\n\t0xE9F1, 0x9D26, 0xE9F2, 0x9DAF, 0xE9F3, 0x9D23, 0xE9F4, 0x9D1F,\t0xE9F5, 0x9D44, 0xE9F6, 0x9D15, 0xE9F7, 0x9D12, 0xE9F8, 0x9D41,\n\t0xE9F9, 0x9D3F, 0xE9FA, 0x9D3E, 0xE9FB, 0x9D46, 0xE9FC, 0x9D48,\t0xEA40, 0x9D5D, 0xEA41, 0x9D5E, 0xEA42, 0x9D64, 0xEA43, 0x9D51,\n\t0xEA44, 0x9D50, 0xEA45, 0x9D59, 0xEA46, 0x9D72, 0xEA47, 0x9D89,\t0xEA48, 0x9D87, 0xEA49, 0x9DAB, 0xEA4A, 0x9D6F, 0xEA4B, 0x9D7A,\n\t0xEA4C, 0x9D9A, 0xEA4D, 0x9DA4, 0xEA4E, 0x9DA9, 0xEA4F, 0x9DB2,\t0xEA50, 0x9DC4, 0xEA51, 0x9DC1, 0xEA52, 0x9DBB, 0xEA53, 0x9DB8,\n\t0xEA54, 0x9DBA, 0xEA55, 0x9DC6, 0xEA56, 0x9DCF, 0xEA57, 0x9DC2,\t0xEA58, 0x9DD9, 0xEA59, 0x9DD3, 0xEA5A, 0x9DF8, 0xEA5B, 0x9DE6,\n\t0xEA5C, 0x9DED, 0xEA5D, 0x9DEF, 0xEA5E, 0x9DFD, 0xEA5F, 0x9E1A,\t0xEA60, 0x9E1B, 0xEA61, 0x9E1E, 0xEA62, 0x9E75, 0xEA63, 0x9E79,\n\t0xEA64, 0x9E7D, 0xEA65, 0x9E81, 0xEA66, 0x9E88, 0xEA67, 0x9E8B,\t0xEA68, 0x9E8C, 0xEA69, 0x9E92, 0xEA6A, 0x9E95, 0xEA6B, 0x9E91,\n\t0xEA6C, 0x9E9D, 0xEA6D, 0x9EA5, 0xEA6E, 0x9EA9, 0xEA6F, 0x9EB8,\t0xEA70, 0x9EAA, 0xEA71, 0x9EAD, 0xEA72, 0x9761, 0xEA73, 0x9ECC,\n\t0xEA74, 0x9ECE, 0xEA75, 0x9ECF, 0xEA76, 0x9ED0, 0xEA77, 0x9ED4,\t0xEA78, 0x9EDC, 0xEA79, 0x9EDE, 0xEA7A, 0x9EDD, 0xEA7B, 0x9EE0,\n\t0xEA7C, 0x9EE5, 0xEA7D, 0x9EE8, 0xEA7E, 0x9EEF, 0xEA80, 0x9EF4,\t0xEA81, 0x9EF6, 0xEA82, 0x9EF7, 0xEA83, 0x9EF9, 0xEA84, 0x9EFB,\n\t0xEA85, 0x9EFC, 0xEA86, 0x9EFD, 0xEA87, 0x9F07, 0xEA88, 0x9F08,\t0xEA89, 0x76B7, 0xEA8A, 0x9F15, 0xEA8B, 0x9F21, 0xEA8C, 0x9F2C,\n\t0xEA8D, 0x9F3E, 0xEA8E, 0x9F4A, 0xEA8F, 0x9F52, 0xEA90, 0x9F54,\t0xEA91, 0x9F63, 0xEA92, 0x9F5F, 0xEA93, 0x9F60, 0xEA94, 0x9F61,\n\t0xEA95, 0x9F66, 0xEA96, 0x9F67, 0xEA97, 0x9F6C, 0xEA98, 0x9F6A,\t0xEA99, 0x9F77, 0xEA9A, 0x9F72, 0xEA9B, 0x9F76, 0xEA9C, 0x9F95,\n\t0xEA9D, 0x9F9C, 0xEA9E, 0x9FA0, 0xEA9F, 0x582F, 0xEAA0, 0x69C7,\t0xEAA1, 0x9059, 0xEAA2, 0x7464, 0xEAA3, 0x51DC, 0xEAA4, 0x7199,\n\t0xFA40, 0x2170, 0xFA41, 0x2171, 0xFA42, 0x2172, 0xFA43, 0x2173,\t0xFA44, 0x2174, 0xFA45, 0x2175, 0xFA46, 0x2176, 0xFA47, 0x2177,\n\t0xFA48, 0x2178, 0xFA49, 0x2179, 0xFA55, 0xFFE4, 0xFA56, 0xFF07,\t0xFA57, 0xFF02, 0xFA5C, 0x7E8A, 0xFA5D, 0x891C, 0xFA5E, 0x9348,\n\t0xFA5F, 0x9288, 0xFA60, 0x84DC, 0xFA61, 0x4FC9, 0xFA62, 0x70BB,\t0xFA63, 0x6631, 0xFA64, 0x68C8, 0xFA65, 0x92F9, 0xFA66, 0x66FB,\n\t0xFA67, 0x5F45, 0xFA68, 0x4E28, 0xFA69, 0x4EE1, 0xFA6A, 0x4EFC,\t0xFA6B, 0x4F00, 0xFA6C, 0x4F03, 0xFA6D, 0x4F39, 0xFA6E, 0x4F56,\n\t0xFA6F, 0x4F92, 0xFA70, 0x4F8A, 0xFA71, 0x4F9A, 0xFA72, 0x4F94,\t0xFA73, 0x4FCD, 0xFA74, 0x5040, 0xFA75, 0x5022, 0xFA76, 0x4FFF,\n\t0xFA77, 0x501E, 0xFA78, 0x5046, 0xFA79, 0x5070, 0xFA7A, 0x5042,\t0xFA7B, 0x5094, 0xFA7C, 0x50F4, 0xFA7D, 0x50D8, 0xFA7E, 0x514A,\n\t0xFA80, 0x5164, 0xFA81, 0x519D, 0xFA82, 0x51BE, 0xFA83, 0x51EC,\t0xFA84, 0x5215, 0xFA85, 0x529C, 0xFA86, 0x52A6, 0xFA87, 0x52C0,\n\t0xFA88, 0x52DB, 0xFA89, 0x5300, 0xFA8A, 0x5307, 0xFA8B, 0x5324,\t0xFA8C, 0x5372, 0xFA8D, 0x5393, 0xFA8E, 0x53B2, 0xFA8F, 0x53DD,\n\t0xFA90, 0xFA0E, 0xFA91, 0x549C, 0xFA92, 0x548A, 0xFA93, 0x54A9,\t0xFA94, 0x54FF, 0xFA95, 0x5586, 0xFA96, 0x5759, 0xFA97, 0x5765,\n\t0xFA98, 0x57AC, 0xFA99, 0x57C8, 0xFA9A, 0x57C7, 0xFA9B, 0xFA0F,\t0xFA9C, 0xFA10, 0xFA9D, 0x589E, 0xFA9E, 0x58B2, 0xFA9F, 0x590B,\n\t0xFAA0, 0x5953, 0xFAA1, 0x595B, 0xFAA2, 0x595D, 0xFAA3, 0x5963,\t0xFAA4, 0x59A4, 0xFAA5, 0x59BA, 0xFAA6, 0x5B56, 0xFAA7, 0x5BC0,\n\t0xFAA8, 0x752F, 0xFAA9, 0x5BD8, 0xFAAA, 0x5BEC, 0xFAAB, 0x5C1E,\t0xFAAC, 0x5CA6, 0xFAAD, 0x5CBA, 0xFAAE, 0x5CF5, 0xFAAF, 0x5D27,\n\t0xFAB0, 0x5D53, 0xFAB1, 0xFA11, 0xFAB2, 0x5D42, 0xFAB3, 0x5D6D,\t0xFAB4, 0x5DB8, 0xFAB5, 0x5DB9, 0xFAB6, 0x5DD0, 0xFAB7, 0x5F21,\n\t0xFAB8, 0x5F34, 0xFAB9, 0x5F67, 0xFABA, 0x5FB7, 0xFABB, 0x5FDE,\t0xFABC, 0x605D, 0xFABD, 0x6085, 0xFABE, 0x608A, 0xFABF, 0x60DE,\n\t0xFAC0, 0x60D5, 0xFAC1, 0x6120, 0xFAC2, 0x60F2, 0xFAC3, 0x6111,\t0xFAC4, 0x6137, 0xFAC5, 0x6130, 0xFAC6, 0x6198, 0xFAC7, 0x6213,\n\t0xFAC8, 0x62A6, 0xFAC9, 0x63F5, 0xFACA, 0x6460, 0xFACB, 0x649D,\t0xFACC, 0x64CE, 0xFACD, 0x654E, 0xFACE, 0x6600, 0xFACF, 0x6615,\n\t0xFAD0, 0x663B, 0xFAD1, 0x6609, 0xFAD2, 0x662E, 0xFAD3, 0x661E,\t0xFAD4, 0x6624, 0xFAD5, 0x6665, 0xFAD6, 0x6657, 0xFAD7, 0x6659,\n\t0xFAD8, 0xFA12, 0xFAD9, 0x6673, 0xFADA, 0x6699, 0xFADB, 0x66A0,\t0xFADC, 0x66B2, 0xFADD, 0x66BF, 0xFADE, 0x66FA, 0xFADF, 0x670E,\n\t0xFAE0, 0xF929, 0xFAE1, 0x6766, 0xFAE2, 0x67BB, 0xFAE3, 0x6852,\t0xFAE4, 0x67C0, 0xFAE5, 0x6801, 0xFAE6, 0x6844, 0xFAE7, 0x68CF,\n\t0xFAE8, 0xFA13, 0xFAE9, 0x6968, 0xFAEA, 0xFA14, 0xFAEB, 0x6998,\t0xFAEC, 0x69E2, 0xFAED, 0x6A30, 0xFAEE, 0x6A6B, 0xFAEF, 0x6A46,\n\t0xFAF0, 0x6A73, 0xFAF1, 0x6A7E, 0xFAF2, 0x6AE2, 0xFAF3, 0x6AE4,\t0xFAF4, 0x6BD6, 0xFAF5, 0x6C3F, 0xFAF6, 0x6C5C, 0xFAF7, 0x6C86,\n\t0xFAF8, 0x6C6F, 0xFAF9, 0x6CDA, 0xFAFA, 0x6D04, 0xFAFB, 0x6D87,\t0xFAFC, 0x6D6F, 0xFB40, 0x6D96, 0xFB41, 0x6DAC, 0xFB42, 0x6DCF,\n\t0xFB43, 0x6DF8, 0xFB44, 0x6DF2, 0xFB45, 0x6DFC, 0xFB46, 0x6E39,\t0xFB47, 0x6E5C, 0xFB48, 0x6E27, 0xFB49, 0x6E3C, 0xFB4A, 0x6EBF,\n\t0xFB4B, 0x6F88, 0xFB4C, 0x6FB5, 0xFB4D, 0x6FF5, 0xFB4E, 0x7005,\t0xFB4F, 0x7007, 0xFB50, 0x7028, 0xFB51, 0x7085, 0xFB52, 0x70AB,\n\t0xFB53, 0x710F, 0xFB54, 0x7104, 0xFB55, 0x715C, 0xFB56, 0x7146,\t0xFB57, 0x7147, 0xFB58, 0xFA15, 0xFB59, 0x71C1, 0xFB5A, 0x71FE,\n\t0xFB5B, 0x72B1, 0xFB5C, 0x72BE, 0xFB5D, 0x7324, 0xFB5E, 0xFA16,\t0xFB5F, 0x7377, 0xFB60, 0x73BD, 0xFB61, 0x73C9, 0xFB62, 0x73D6,\n\t0xFB63, 0x73E3, 0xFB64, 0x73D2, 0xFB65, 0x7407, 0xFB66, 0x73F5,\t0xFB67, 0x7426, 0xFB68, 0x742A, 0xFB69, 0x7429, 0xFB6A, 0x742E,\n\t0xFB6B, 0x7462, 0xFB6C, 0x7489, 0xFB6D, 0x749F, 0xFB6E, 0x7501,\t0xFB6F, 0x756F, 0xFB70, 0x7682, 0xFB71, 0x769C, 0xFB72, 0x769E,\n\t0xFB73, 0x769B, 0xFB74, 0x76A6, 0xFB75, 0xFA17, 0xFB76, 0x7746,\t0xFB77, 0x52AF, 0xFB78, 0x7821, 0xFB79, 0x784E, 0xFB7A, 0x7864,\n\t0xFB7B, 0x787A, 0xFB7C, 0x7930, 0xFB7D, 0xFA18, 0xFB7E, 0xFA19,\t0xFB80, 0xFA1A, 0xFB81, 0x7994, 0xFB82, 0xFA1B, 0xFB83, 0x799B,\n\t0xFB84, 0x7AD1, 0xFB85, 0x7AE7, 0xFB86, 0xFA1C, 0xFB87, 0x7AEB,\t0xFB88, 0x7B9E, 0xFB89, 0xFA1D, 0xFB8A, 0x7D48, 0xFB8B, 0x7D5C,\n\t0xFB8C, 0x7DB7, 0xFB8D, 0x7DA0, 0xFB8E, 0x7DD6, 0xFB8F, 0x7E52,\t0xFB90, 0x7F47, 0xFB91, 0x7FA1, 0xFB92, 0xFA1E, 0xFB93, 0x8301,\n\t0xFB94, 0x8362, 0xFB95, 0x837F, 0xFB96, 0x83C7, 0xFB97, 0x83F6,\t0xFB98, 0x8448, 0xFB99, 0x84B4, 0xFB9A, 0x8553, 0xFB9B, 0x8559,\n\t0xFB9C, 0x856B, 0xFB9D, 0xFA1F, 0xFB9E, 0x85B0, 0xFB9F, 0xFA20,\t0xFBA0, 0xFA21, 0xFBA1, 0x8807, 0xFBA2, 0x88F5, 0xFBA3, 0x8A12,\n\t0xFBA4, 0x8A37, 0xFBA5, 0x8A79, 0xFBA6, 0x8AA7, 0xFBA7, 0x8ABE,\t0xFBA8, 0x8ADF, 0xFBA9, 0xFA22, 0xFBAA, 0x8AF6, 0xFBAB, 0x8B53,\n\t0xFBAC, 0x8B7F, 0xFBAD, 0x8CF0, 0xFBAE, 0x8CF4, 0xFBAF, 0x8D12,\t0xFBB0, 0x8D76, 0xFBB1, 0xFA23, 0xFBB2, 0x8ECF, 0xFBB3, 0xFA24,\n\t0xFBB4, 0xFA25, 0xFBB5, 0x9067, 0xFBB6, 0x90DE, 0xFBB7, 0xFA26,\t0xFBB8, 0x9115, 0xFBB9, 0x9127, 0xFBBA, 0x91DA, 0xFBBB, 0x91D7,\n\t0xFBBC, 0x91DE, 0xFBBD, 0x91ED, 0xFBBE, 0x91EE, 0xFBBF, 0x91E4,\t0xFBC0, 0x91E5, 0xFBC1, 0x9206, 0xFBC2, 0x9210, 0xFBC3, 0x920A,\n\t0xFBC4, 0x923A, 0xFBC5, 0x9240, 0xFBC6, 0x923C, 0xFBC7, 0x924E,\t0xFBC8, 0x9259, 0xFBC9, 0x9251, 0xFBCA, 0x9239, 0xFBCB, 0x9267,\n\t0xFBCC, 0x92A7, 0xFBCD, 0x9277, 0xFBCE, 0x9278, 0xFBCF, 0x92E7,\t0xFBD0, 0x92D7, 0xFBD1, 0x92D9, 0xFBD2, 0x92D0, 0xFBD3, 0xFA27,\n\t0xFBD4, 0x92D5, 0xFBD5, 0x92E0, 0xFBD6, 0x92D3, 0xFBD7, 0x9325,\t0xFBD8, 0x9321, 0xFBD9, 0x92FB, 0xFBDA, 0xFA28, 0xFBDB, 0x931E,\n\t0xFBDC, 0x92FF, 0xFBDD, 0x931D, 0xFBDE, 0x9302, 0xFBDF, 0x9370,\t0xFBE0, 0x9357, 0xFBE1, 0x93A4, 0xFBE2, 0x93C6, 0xFBE3, 0x93DE,\n\t0xFBE4, 0x93F8, 0xFBE5, 0x9431, 0xFBE6, 0x9445, 0xFBE7, 0x9448,\t0xFBE8, 0x9592, 0xFBE9, 0xF9DC, 0xFBEA, 0xFA29, 0xFBEB, 0x969D,\n\t0xFBEC, 0x96AF, 0xFBED, 0x9733, 0xFBEE, 0x973B, 0xFBEF, 0x9743,\t0xFBF0, 0x974D, 0xFBF1, 0x974F, 0xFBF2, 0x9751, 0xFBF3, 0x9755,\n\t0xFBF4, 0x9857, 0xFBF5, 0x9865, 0xFBF6, 0xFA2A, 0xFBF7, 0xFA2B,\t0xFBF8, 0x9927, 0xFBF9, 0xFA2C, 0xFBFA, 0x999E, 0xFBFB, 0x9A4E,\n\t0xFBFC, 0x9AD9, 0xFC40, 0x9ADC, 0xFC41, 0x9B75, 0xFC42, 0x9B72,\t0xFC43, 0x9B8F, 0xFC44, 0x9BB1, 0xFC45, 0x9BBB, 0xFC46, 0x9C00,\n\t0xFC47, 0x9D70, 0xFC48, 0x9D6B, 0xFC49, 0xFA2D, 0xFC4A, 0x9E19,\t0xFC4B, 0x9ED1, 0, 0\n};\n#endif\n\n#if FF_CODE_PAGE == 936 || FF_CODE_PAGE == 0\t/* Simplified Chinese */\nstatic const WCHAR uni2oem936[] = {\t/* Unicode --> GBK pairs */\n\t0x00A4, 0xA1E8, 0x00A7, 0xA1EC, 0x00A8, 0xA1A7, 0x00B0, 0xA1E3,\t0x00B1, 0xA1C0, 0x00B7, 0xA1A4, 0x00D7, 0xA1C1, 0x00E0, 0xA8A4,\n\t0x00E1, 0xA8A2, 0x00E8, 0xA8A8, 0x00E9, 0xA8A6, 0x00EA, 0xA8BA,\t0x00EC, 0xA8AC, 0x00ED, 0xA8AA, 0x00F2, 0xA8B0, 0x00F3, 0xA8AE,\n\t0x00F7, 0xA1C2, 0x00F9, 0xA8B4, 0x00FA, 0xA8B2, 0x00FC, 0xA8B9,\t0x0101, 0xA8A1, 0x0113, 0xA8A5, 0x011B, 0xA8A7, 0x012B, 0xA8A9,\n\t0x0144, 0xA8BD, 0x0148, 0xA8BE, 0x014D, 0xA8AD, 0x016B, 0xA8B1,\t0x01CE, 0xA8A3, 0x01D0, 0xA8AB, 0x01D2, 0xA8AF, 0x01D4, 0xA8B3,\n\t0x01D6, 0xA8B5, 0x01D8, 0xA8B6, 0x01DA, 0xA8B7, 0x01DC, 0xA8B8,\t0x0251, 0xA8BB, 0x0261, 0xA8C0, 0x02C7, 0xA1A6, 0x02C9, 0xA1A5,\n\t0x02CA, 0xA840, 0x02CB, 0xA841, 0x02D9, 0xA842, 0x0391, 0xA6A1,\t0x0392, 0xA6A2, 0x0393, 0xA6A3, 0x0394, 0xA6A4, 0x0395, 0xA6A5,\n\t0x0396, 0xA6A6, 0x0397, 0xA6A7, 0x0398, 0xA6A8, 0x0399, 0xA6A9,\t0x039A, 0xA6AA, 0x039B, 0xA6AB, 0x039C, 0xA6AC, 0x039D, 0xA6AD,\n\t0x039E, 0xA6AE, 0x039F, 0xA6AF, 0x03A0, 0xA6B0, 0x03A1, 0xA6B1,\t0x03A3, 0xA6B2, 0x03A4, 0xA6B3, 0x03A5, 0xA6B4, 0x03A6, 0xA6B5,\n\t0x03A7, 0xA6B6, 0x03A8, 0xA6B7, 0x03A9, 0xA6B8, 0x03B1, 0xA6C1,\t0x03B2, 0xA6C2, 0x03B3, 0xA6C3, 0x03B4, 0xA6C4, 0x03B5, 0xA6C5,\n\t0x03B6, 0xA6C6, 0x03B7, 0xA6C7, 0x03B8, 0xA6C8, 0x03B9, 0xA6C9,\t0x03BA, 0xA6CA, 0x03BB, 0xA6CB, 0x03BC, 0xA6CC, 0x03BD, 0xA6CD,\n\t0x03BE, 0xA6CE, 0x03BF, 0xA6CF, 0x03C0, 0xA6D0, 0x03C1, 0xA6D1,\t0x03C3, 0xA6D2, 0x03C4, 0xA6D3, 0x03C5, 0xA6D4, 0x03C6, 0xA6D5,\n\t0x03C7, 0xA6D6, 0x03C8, 0xA6D7, 0x03C9, 0xA6D8, 0x0401, 0xA7A7,\t0x0410, 0xA7A1, 0x0411, 0xA7A2, 0x0412, 0xA7A3, 0x0413, 0xA7A4,\n\t0x0414, 0xA7A5, 0x0415, 0xA7A6, 0x0416, 0xA7A8, 0x0417, 0xA7A9,\t0x0418, 0xA7AA, 0x0419, 0xA7AB, 0x041A, 0xA7AC, 0x041B, 0xA7AD,\n\t0x041C, 0xA7AE, 0x041D, 0xA7AF, 0x041E, 0xA7B0, 0x041F, 0xA7B1,\t0x0420, 0xA7B2, 0x0421, 0xA7B3, 0x0422, 0xA7B4, 0x0423, 0xA7B5,\n\t0x0424, 0xA7B6, 0x0425, 0xA7B7, 0x0426, 0xA7B8, 0x0427, 0xA7B9,\t0x0428, 0xA7BA, 0x0429, 0xA7BB, 0x042A, 0xA7BC, 0x042B, 0xA7BD,\n\t0x042C, 0xA7BE, 0x042D, 0xA7BF, 0x042E, 0xA7C0, 0x042F, 0xA7C1,\t0x0430, 0xA7D1, 0x0431, 0xA7D2, 0x0432, 0xA7D3, 0x0433, 0xA7D4,\n\t0x0434, 0xA7D5, 0x0435, 0xA7D6, 0x0436, 0xA7D8, 0x0437, 0xA7D9,\t0x0438, 0xA7DA, 0x0439, 0xA7DB, 0x043A, 0xA7DC, 0x043B, 0xA7DD,\n\t0x043C, 0xA7DE, 0x043D, 0xA7DF, 0x043E, 0xA7E0, 0x043F, 0xA7E1,\t0x0440, 0xA7E2, 0x0441, 0xA7E3, 0x0442, 0xA7E4, 0x0443, 0xA7E5,\n\t0x0444, 0xA7E6, 0x0445, 0xA7E7, 0x0446, 0xA7E8, 0x0447, 0xA7E9,\t0x0448, 0xA7EA, 0x0449, 0xA7EB, 0x044A, 0xA7EC, 0x044B, 0xA7ED,\n\t0x044C, 0xA7EE, 0x044D, 0xA7EF, 0x044E, 0xA7F0, 0x044F, 0xA7F1,\t0x0451, 0xA7D7, 0x2010, 0xA95C, 0x2013, 0xA843, 0x2014, 0xA1AA,\n\t0x2015, 0xA844, 0x2016, 0xA1AC, 0x2018, 0xA1AE, 0x2019, 0xA1AF,\t0x201C, 0xA1B0, 0x201D, 0xA1B1, 0x2025, 0xA845, 0x2026, 0xA1AD,\n\t0x2030, 0xA1EB, 0x2032, 0xA1E4, 0x2033, 0xA1E5, 0x2035, 0xA846,\t0x203B, 0xA1F9, 0x20AC, 0x0080, 0x2103, 0xA1E6, 0x2105, 0xA847,\n\t0x2109, 0xA848, 0x2116, 0xA1ED, 0x2121, 0xA959, 0x2160, 0xA2F1,\t0x2161, 0xA2F2, 0x2162, 0xA2F3, 0x2163, 0xA2F4, 0x2164, 0xA2F5,\n\t0x2165, 0xA2F6, 0x2166, 0xA2F7, 0x2167, 0xA2F8, 0x2168, 0xA2F9,\t0x2169, 0xA2FA, 0x216A, 0xA2FB, 0x216B, 0xA2FC, 0x2170, 0xA2A1,\n\t0x2171, 0xA2A2, 0x2172, 0xA2A3, 0x2173, 0xA2A4, 0x2174, 0xA2A5,\t0x2175, 0xA2A6, 0x2176, 0xA2A7, 0x2177, 0xA2A8, 0x2178, 0xA2A9,\n\t0x2179, 0xA2AA, 0x2190, 0xA1FB, 0x2191, 0xA1FC, 0x2192, 0xA1FA,\t0x2193, 0xA1FD, 0x2196, 0xA849, 0x2197, 0xA84A, 0x2198, 0xA84B,\n\t0x2199, 0xA84C, 0x2208, 0xA1CA, 0x220F, 0xA1C7, 0x2211, 0xA1C6,\t0x2215, 0xA84D, 0x221A, 0xA1CC, 0x221D, 0xA1D8, 0x221E, 0xA1DE,\n\t0x221F, 0xA84E, 0x2220, 0xA1CF, 0x2223, 0xA84F, 0x2225, 0xA1CE,\t0x2227, 0xA1C4, 0x2228, 0xA1C5, 0x2229, 0xA1C9, 0x222A, 0xA1C8,\n\t0x222B, 0xA1D2, 0x222E, 0xA1D3, 0x2234, 0xA1E0, 0x2235, 0xA1DF,\t0x2236, 0xA1C3, 0x2237, 0xA1CB, 0x223D, 0xA1D7, 0x2248, 0xA1D6,\n\t0x224C, 0xA1D5, 0x2252, 0xA850, 0x2260, 0xA1D9, 0x2261, 0xA1D4,\t0x2264, 0xA1DC, 0x2265, 0xA1DD, 0x2266, 0xA851, 0x2267, 0xA852,\n\t0x226E, 0xA1DA, 0x226F, 0xA1DB, 0x2295, 0xA892, 0x2299, 0xA1D1,\t0x22A5, 0xA1CD, 0x22BF, 0xA853, 0x2312, 0xA1D0, 0x2460, 0xA2D9,\n\t0x2461, 0xA2DA, 0x2462, 0xA2DB, 0x2463, 0xA2DC, 0x2464, 0xA2DD,\t0x2465, 0xA2DE, 0x2466, 0xA2DF, 0x2467, 0xA2E0, 0x2468, 0xA2E1,\n\t0x2469, 0xA2E2, 0x2474, 0xA2C5, 0x2475, 0xA2C6, 0x2476, 0xA2C7,\t0x2477, 0xA2C8, 0x2478, 0xA2C9, 0x2479, 0xA2CA, 0x247A, 0xA2CB,\n\t0x247B, 0xA2CC, 0x247C, 0xA2CD, 0x247D, 0xA2CE, 0x247E, 0xA2CF,\t0x247F, 0xA2D0, 0x2480, 0xA2D1, 0x2481, 0xA2D2, 0x2482, 0xA2D3,\n\t0x2483, 0xA2D4, 0x2484, 0xA2D5, 0x2485, 0xA2D6, 0x2486, 0xA2D7,\t0x2487, 0xA2D8, 0x2488, 0xA2B1, 0x2489, 0xA2B2, 0x248A, 0xA2B3,\n\t0x248B, 0xA2B4, 0x248C, 0xA2B5, 0x248D, 0xA2B6, 0x248E, 0xA2B7,\t0x248F, 0xA2B8, 0x2490, 0xA2B9, 0x2491, 0xA2BA, 0x2492, 0xA2BB,\n\t0x2493, 0xA2BC, 0x2494, 0xA2BD, 0x2495, 0xA2BE, 0x2496, 0xA2BF,\t0x2497, 0xA2C0, 0x2498, 0xA2C1, 0x2499, 0xA2C2, 0x249A, 0xA2C3,\n\t0x249B, 0xA2C4, 0x2500, 0xA9A4, 0x2501, 0xA9A5, 0x2502, 0xA9A6,\t0x2503, 0xA9A7, 0x2504, 0xA9A8, 0x2505, 0xA9A9, 0x2506, 0xA9AA,\n\t0x2507, 0xA9AB, 0x2508, 0xA9AC, 0x2509, 0xA9AD, 0x250A, 0xA9AE,\t0x250B, 0xA9AF, 0x250C, 0xA9B0, 0x250D, 0xA9B1, 0x250E, 0xA9B2,\n\t0x250F, 0xA9B3, 0x2510, 0xA9B4, 0x2511, 0xA9B5, 0x2512, 0xA9B6,\t0x2513, 0xA9B7, 0x2514, 0xA9B8, 0x2515, 0xA9B9, 0x2516, 0xA9BA,\n\t0x2517, 0xA9BB, 0x2518, 0xA9BC, 0x2519, 0xA9BD, 0x251A, 0xA9BE,\t0x251B, 0xA9BF, 0x251C, 0xA9C0, 0x251D, 0xA9C1, 0x251E, 0xA9C2,\n\t0x251F, 0xA9C3, 0x2520, 0xA9C4, 0x2521, 0xA9C5, 0x2522, 0xA9C6,\t0x2523, 0xA9C7, 0x2524, 0xA9C8, 0x2525, 0xA9C9, 0x2526, 0xA9CA,\n\t0x2527, 0xA9CB, 0x2528, 0xA9CC, 0x2529, 0xA9CD, 0x252A, 0xA9CE,\t0x252B, 0xA9CF, 0x252C, 0xA9D0, 0x252D, 0xA9D1, 0x252E, 0xA9D2,\n\t0x252F, 0xA9D3, 0x2530, 0xA9D4, 0x2531, 0xA9D5, 0x2532, 0xA9D6,\t0x2533, 0xA9D7, 0x2534, 0xA9D8, 0x2535, 0xA9D9, 0x2536, 0xA9DA,\n\t0x2537, 0xA9DB, 0x2538, 0xA9DC, 0x2539, 0xA9DD, 0x253A, 0xA9DE,\t0x253B, 0xA9DF, 0x253C, 0xA9E0, 0x253D, 0xA9E1, 0x253E, 0xA9E2,\n\t0x253F, 0xA9E3, 0x2540, 0xA9E4, 0x2541, 0xA9E5, 0x2542, 0xA9E6,\t0x2543, 0xA9E7, 0x2544, 0xA9E8, 0x2545, 0xA9E9, 0x2546, 0xA9EA,\n\t0x2547, 0xA9EB, 0x2548, 0xA9EC, 0x2549, 0xA9ED, 0x254A, 0xA9EE,\t0x254B, 0xA9EF, 0x2550, 0xA854, 0x2551, 0xA855, 0x2552, 0xA856,\n\t0x2553, 0xA857, 0x2554, 0xA858, 0x2555, 0xA859, 0x2556, 0xA85A,\t0x2557, 0xA85B, 0x2558, 0xA85C, 0x2559, 0xA85D, 0x255A, 0xA85E,\n\t0x255B, 0xA85F, 0x255C, 0xA860, 0x255D, 0xA861, 0x255E, 0xA862,\t0x255F, 0xA863, 0x2560, 0xA864, 0x2561, 0xA865, 0x2562, 0xA866,\n\t0x2563, 0xA867, 0x2564, 0xA868, 0x2565, 0xA869, 0x2566, 0xA86A,\t0x2567, 0xA86B, 0x2568, 0xA86C, 0x2569, 0xA86D, 0x256A, 0xA86E,\n\t0x256B, 0xA86F, 0x256C, 0xA870, 0x256D, 0xA871, 0x256E, 0xA872,\t0x256F, 0xA873, 0x2570, 0xA874, 0x2571, 0xA875, 0x2572, 0xA876,\n\t0x2573, 0xA877, 0x2581, 0xA878, 0x2582, 0xA879, 0x2583, 0xA87A,\t0x2584, 0xA87B, 0x2585, 0xA87C, 0x2586, 0xA87D, 0x2587, 0xA87E,\n\t0x2588, 0xA880, 0x2589, 0xA881, 0x258A, 0xA882, 0x258B, 0xA883,\t0x258C, 0xA884, 0x258D, 0xA885, 0x258E, 0xA886, 0x258F, 0xA887,\n\t0x2593, 0xA888, 0x2594, 0xA889, 0x2595, 0xA88A, 0x25A0, 0xA1F6,\t0x25A1, 0xA1F5, 0x25B2, 0xA1F8, 0x25B3, 0xA1F7, 0x25BC, 0xA88B,\n\t0x25BD, 0xA88C, 0x25C6, 0xA1F4, 0x25C7, 0xA1F3, 0x25CB, 0xA1F0,\t0x25CE, 0xA1F2, 0x25CF, 0xA1F1, 0x25E2, 0xA88D, 0x25E3, 0xA88E,\n\t0x25E4, 0xA88F, 0x25E5, 0xA890, 0x2605, 0xA1EF, 0x2606, 0xA1EE,\t0x2609, 0xA891, 0x2640, 0xA1E2, 0x2642, 0xA1E1, 0x3000, 0xA1A1,\n\t0x3001, 0xA1A2, 0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3005, 0xA1A9,\t0x3006, 0xA965, 0x3007, 0xA996, 0x3008, 0xA1B4, 0x3009, 0xA1B5,\n\t0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9,\t0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BE, 0x3011, 0xA1BF,\n\t0x3012, 0xA893, 0x3013, 0xA1FE, 0x3014, 0xA1B2, 0x3015, 0xA1B3,\t0x3016, 0xA1BC, 0x3017, 0xA1BD, 0x301D, 0xA894, 0x301E, 0xA895,\n\t0x3021, 0xA940, 0x3022, 0xA941, 0x3023, 0xA942, 0x3024, 0xA943,\t0x3025, 0xA944, 0x3026, 0xA945, 0x3027, 0xA946, 0x3028, 0xA947,\n\t0x3029, 0xA948, 0x3041, 0xA4A1, 0x3042, 0xA4A2, 0x3043, 0xA4A3,\t0x3044, 0xA4A4, 0x3045, 0xA4A5, 0x3046, 0xA4A6, 0x3047, 0xA4A7,\n\t0x3048, 0xA4A8, 0x3049, 0xA4A9, 0x304A, 0xA4AA, 0x304B, 0xA4AB,\t0x304C, 0xA4AC, 0x304D, 0xA4AD, 0x304E, 0xA4AE, 0x304F, 0xA4AF,\n\t0x3050, 0xA4B0, 0x3051, 0xA4B1, 0x3052, 0xA4B2, 0x3053, 0xA4B3,\t0x3054, 0xA4B4, 0x3055, 0xA4B5, 0x3056, 0xA4B6, 0x3057, 0xA4B7,\n\t0x3058, 0xA4B8, 0x3059, 0xA4B9, 0x305A, 0xA4BA, 0x305B, 0xA4BB,\t0x305C, 0xA4BC, 0x305D, 0xA4BD, 0x305E, 0xA4BE, 0x305F, 0xA4BF,\n\t0x3060, 0xA4C0, 0x3061, 0xA4C1, 0x3062, 0xA4C2, 0x3063, 0xA4C3,\t0x3064, 0xA4C4, 0x3065, 0xA4C5, 0x3066, 0xA4C6, 0x3067, 0xA4C7,\n\t0x3068, 0xA4C8, 0x3069, 0xA4C9, 0x306A, 0xA4CA, 0x306B, 0xA4CB,\t0x306C, 0xA4CC, 0x306D, 0xA4CD, 0x306E, 0xA4CE, 0x306F, 0xA4CF,\n\t0x3070, 0xA4D0, 0x3071, 0xA4D1, 0x3072, 0xA4D2, 0x3073, 0xA4D3,\t0x3074, 0xA4D4, 0x3075, 0xA4D5, 0x3076, 0xA4D6, 0x3077, 0xA4D7,\n\t0x3078, 0xA4D8, 0x3079, 0xA4D9, 0x307A, 0xA4DA, 0x307B, 0xA4DB,\t0x307C, 0xA4DC, 0x307D, 0xA4DD, 0x307E, 0xA4DE, 0x307F, 0xA4DF,\n\t0x3080, 0xA4E0, 0x3081, 0xA4E1, 0x3082, 0xA4E2, 0x3083, 0xA4E3,\t0x3084, 0xA4E4, 0x3085, 0xA4E5, 0x3086, 0xA4E6, 0x3087, 0xA4E7,\n\t0x3088, 0xA4E8, 0x3089, 0xA4E9, 0x308A, 0xA4EA, 0x308B, 0xA4EB,\t0x308C, 0xA4EC, 0x308D, 0xA4ED, 0x308E, 0xA4EE, 0x308F, 0xA4EF,\n\t0x3090, 0xA4F0, 0x3091, 0xA4F1, 0x3092, 0xA4F2, 0x3093, 0xA4F3,\t0x309B, 0xA961, 0x309C, 0xA962, 0x309D, 0xA966, 0x309E, 0xA967,\n\t0x30A1, 0xA5A1, 0x30A2, 0xA5A2, 0x30A3, 0xA5A3, 0x30A4, 0xA5A4,\t0x30A5, 0xA5A5, 0x30A6, 0xA5A6, 0x30A7, 0xA5A7, 0x30A8, 0xA5A8,\n\t0x30A9, 0xA5A9, 0x30AA, 0xA5AA, 0x30AB, 0xA5AB, 0x30AC, 0xA5AC,\t0x30AD, 0xA5AD, 0x30AE, 0xA5AE, 0x30AF, 0xA5AF, 0x30B0, 0xA5B0,\n\t0x30B1, 0xA5B1, 0x30B2, 0xA5B2, 0x30B3, 0xA5B3, 0x30B4, 0xA5B4,\t0x30B5, 0xA5B5, 0x30B6, 0xA5B6, 0x30B7, 0xA5B7, 0x30B8, 0xA5B8,\n\t0x30B9, 0xA5B9, 0x30BA, 0xA5BA, 0x30BB, 0xA5BB, 0x30BC, 0xA5BC,\t0x30BD, 0xA5BD, 0x30BE, 0xA5BE, 0x30BF, 0xA5BF, 0x30C0, 0xA5C0,\n\t0x30C1, 0xA5C1, 0x30C2, 0xA5C2, 0x30C3, 0xA5C3, 0x30C4, 0xA5C4,\t0x30C5, 0xA5C5, 0x30C6, 0xA5C6, 0x30C7, 0xA5C7, 0x30C8, 0xA5C8,\n\t0x30C9, 0xA5C9, 0x30CA, 0xA5CA, 0x30CB, 0xA5CB, 0x30CC, 0xA5CC,\t0x30CD, 0xA5CD, 0x30CE, 0xA5CE, 0x30CF, 0xA5CF, 0x30D0, 0xA5D0,\n\t0x30D1, 0xA5D1, 0x30D2, 0xA5D2, 0x30D3, 0xA5D3, 0x30D4, 0xA5D4,\t0x30D5, 0xA5D5, 0x30D6, 0xA5D6, 0x30D7, 0xA5D7, 0x30D8, 0xA5D8,\n\t0x30D9, 0xA5D9, 0x30DA, 0xA5DA, 0x30DB, 0xA5DB, 0x30DC, 0xA5DC,\t0x30DD, 0xA5DD, 0x30DE, 0xA5DE, 0x30DF, 0xA5DF, 0x30E0, 0xA5E0,\n\t0x30E1, 0xA5E1, 0x30E2, 0xA5E2, 0x30E3, 0xA5E3, 0x30E4, 0xA5E4,\t0x30E5, 0xA5E5, 0x30E6, 0xA5E6, 0x30E7, 0xA5E7, 0x30E8, 0xA5E8,\n\t0x30E9, 0xA5E9, 0x30EA, 0xA5EA, 0x30EB, 0xA5EB, 0x30EC, 0xA5EC,\t0x30ED, 0xA5ED, 0x30EE, 0xA5EE, 0x30EF, 0xA5EF, 0x30F0, 0xA5F0,\n\t0x30F1, 0xA5F1, 0x30F2, 0xA5F2, 0x30F3, 0xA5F3, 0x30F4, 0xA5F4,\t0x30F5, 0xA5F5, 0x30F6, 0xA5F6, 0x30FC, 0xA960, 0x30FD, 0xA963,\n\t0x30FE, 0xA964, 0x3105, 0xA8C5, 0x3106, 0xA8C6, 0x3107, 0xA8C7,\t0x3108, 0xA8C8, 0x3109, 0xA8C9, 0x310A, 0xA8CA, 0x310B, 0xA8CB,\n\t0x310C, 0xA8CC, 0x310D, 0xA8CD, 0x310E, 0xA8CE, 0x310F, 0xA8CF,\t0x3110, 0xA8D0, 0x3111, 0xA8D1, 0x3112, 0xA8D2, 0x3113, 0xA8D3,\n\t0x3114, 0xA8D4, 0x3115, 0xA8D5, 0x3116, 0xA8D6, 0x3117, 0xA8D7,\t0x3118, 0xA8D8, 0x3119, 0xA8D9, 0x311A, 0xA8DA, 0x311B, 0xA8DB,\n\t0x311C, 0xA8DC, 0x311D, 0xA8DD, 0x311E, 0xA8DE, 0x311F, 0xA8DF,\t0x3120, 0xA8E0, 0x3121, 0xA8E1, 0x3122, 0xA8E2, 0x3123, 0xA8E3,\n\t0x3124, 0xA8E4, 0x3125, 0xA8E5, 0x3126, 0xA8E6, 0x3127, 0xA8E7,\t0x3128, 0xA8E8, 0x3129, 0xA8E9, 0x3220, 0xA2E5, 0x3221, 0xA2E6,\n\t0x3222, 0xA2E7, 0x3223, 0xA2E8, 0x3224, 0xA2E9, 0x3225, 0xA2EA,\t0x3226, 0xA2EB, 0x3227, 0xA2EC, 0x3228, 0xA2ED, 0x3229, 0xA2EE,\n\t0x3231, 0xA95A, 0x32A3, 0xA949, 0x338E, 0xA94A, 0x338F, 0xA94B,\t0x339C, 0xA94C, 0x339D, 0xA94D, 0x339E, 0xA94E, 0x33A1, 0xA94F,\n\t0x33C4, 0xA950, 0x33CE, 0xA951, 0x33D1, 0xA952, 0x33D2, 0xA953,\t0x33D5, 0xA954, 0x4E00, 0xD2BB, 0x4E01, 0xB6A1, 0x4E02, 0x8140,\n\t0x4E03, 0xC6DF, 0x4E04, 0x8141, 0x4E05, 0x8142, 0x4E06, 0x8143,\t0x4E07, 0xCDF2, 0x4E08, 0xD5C9, 0x4E09, 0xC8FD, 0x4E0A, 0xC9CF,\n\t0x4E0B, 0xCFC2, 0x4E0C, 0xD8A2, 0x4E0D, 0xB2BB, 0x4E0E, 0xD3EB,\t0x4E0F, 0x8144, 0x4E10, 0xD8A4, 0x4E11, 0xB3F3, 0x4E12, 0x8145,\n\t0x4E13, 0xD7A8, 0x4E14, 0xC7D2, 0x4E15, 0xD8A7, 0x4E16, 0xCAC0,\t0x4E17, 0x8146, 0x4E18, 0xC7F0, 0x4E19, 0xB1FB, 0x4E1A, 0xD2B5,\n\t0x4E1B, 0xB4D4, 0x4E1C, 0xB6AB, 0x4E1D, 0xCBBF, 0x4E1E, 0xD8A9,\t0x4E1F, 0x8147, 0x4E20, 0x8148, 0x4E21, 0x8149, 0x4E22, 0xB6AA,\n\t0x4E23, 0x814A, 0x4E24, 0xC1BD, 0x4E25, 0xD1CF, 0x4E26, 0x814B,\t0x4E27, 0xC9A5, 0x4E28, 0xD8AD, 0x4E29, 0x814C, 0x4E2A, 0xB8F6,\n\t0x4E2B, 0xD1BE, 0x4E2C, 0xE3DC, 0x4E2D, 0xD6D0, 0x4E2E, 0x814D,\t0x4E2F, 0x814E, 0x4E30, 0xB7E1, 0x4E31, 0x814F, 0x4E32, 0xB4AE,\n\t0x4E33, 0x8150, 0x4E34, 0xC1D9, 0x4E35, 0x8151, 0x4E36, 0xD8BC,\t0x4E37, 0x8152, 0x4E38, 0xCDE8, 0x4E39, 0xB5A4, 0x4E3A, 0xCEAA,\n\t0x4E3B, 0xD6F7, 0x4E3C, 0x8153, 0x4E3D, 0xC0F6, 0x4E3E, 0xBED9,\t0x4E3F, 0xD8AF, 0x4E40, 0x8154, 0x4E41, 0x8155, 0x4E42, 0x8156,\n\t0x4E43, 0xC4CB, 0x4E44, 0x8157, 0x4E45, 0xBEC3, 0x4E46, 0x8158,\t0x4E47, 0xD8B1, 0x4E48, 0xC3B4, 0x4E49, 0xD2E5, 0x4E4A, 0x8159,\n\t0x4E4B, 0xD6AE, 0x4E4C, 0xCEDA, 0x4E4D, 0xD5A7, 0x4E4E, 0xBAF5,\t0x4E4F, 0xB7A6, 0x4E50, 0xC0D6, 0x4E51, 0x815A, 0x4E52, 0xC6B9,\n\t0x4E53, 0xC5D2, 0x4E54, 0xC7C7, 0x4E55, 0x815B, 0x4E56, 0xB9D4,\t0x4E57, 0x815C, 0x4E58, 0xB3CB, 0x4E59, 0xD2D2, 0x4E5A, 0x815D,\n\t0x4E5B, 0x815E, 0x4E5C, 0xD8BF, 0x4E5D, 0xBEC5, 0x4E5E, 0xC6F2,\t0x4E5F, 0xD2B2, 0x4E60, 0xCFB0, 0x4E61, 0xCFE7, 0x4E62, 0x815F,\n\t0x4E63, 0x8160, 0x4E64, 0x8161, 0x4E65, 0x8162, 0x4E66, 0xCAE9,\t0x4E67, 0x8163, 0x4E68, 0x8164, 0x4E69, 0xD8C0, 0x4E6A, 0x8165,\n\t0x4E6B, 0x8166, 0x4E6C, 0x8167, 0x4E6D, 0x8168, 0x4E6E, 0x8169,\t0x4E6F, 0x816A, 0x4E70, 0xC2F2, 0x4E71, 0xC2D2, 0x4E72, 0x816B,\n\t0x4E73, 0xC8E9, 0x4E74, 0x816C, 0x4E75, 0x816D, 0x4E76, 0x816E,\t0x4E77, 0x816F, 0x4E78, 0x8170, 0x4E79, 0x8171, 0x4E7A, 0x8172,\n\t0x4E7B, 0x8173, 0x4E7C, 0x8174, 0x4E7D, 0x8175, 0x4E7E, 0xC7AC,\t0x4E7F, 0x8176, 0x4E80, 0x8177, 0x4E81, 0x8178, 0x4E82, 0x8179,\n\t0x4E83, 0x817A, 0x4E84, 0x817B, 0x4E85, 0x817C, 0x4E86, 0xC1CB,\t0x4E87, 0x817D, 0x4E88, 0xD3E8, 0x4E89, 0xD5F9, 0x4E8A, 0x817E,\n\t0x4E8B, 0xCAC2, 0x4E8C, 0xB6FE, 0x4E8D, 0xD8A1, 0x4E8E, 0xD3DA,\t0x4E8F, 0xBFF7, 0x4E90, 0x8180, 0x4E91, 0xD4C6, 0x4E92, 0xBBA5,\n\t0x4E93, 0xD8C1, 0x4E94, 0xCEE5, 0x4E95, 0xBEAE, 0x4E96, 0x8181,\t0x4E97, 0x8182, 0x4E98, 0xD8A8, 0x4E99, 0x8183, 0x4E9A, 0xD1C7,\n\t0x4E9B, 0xD0A9, 0x4E9C, 0x8184, 0x4E9D, 0x8185, 0x4E9E, 0x8186,\t0x4E9F, 0xD8BD, 0x4EA0, 0xD9EF, 0x4EA1, 0xCDF6, 0x4EA2, 0xBFBA,\n\t0x4EA3, 0x8187, 0x4EA4, 0xBDBB, 0x4EA5, 0xBAA5, 0x4EA6, 0xD2E0,\t0x4EA7, 0xB2FA, 0x4EA8, 0xBAE0, 0x4EA9, 0xC4B6, 0x4EAA, 0x8188,\n\t0x4EAB, 0xCFED, 0x4EAC, 0xBEA9, 0x4EAD, 0xCDA4, 0x4EAE, 0xC1C1,\t0x4EAF, 0x8189, 0x4EB0, 0x818A, 0x4EB1, 0x818B, 0x4EB2, 0xC7D7,\n\t0x4EB3, 0xD9F1, 0x4EB4, 0x818C, 0x4EB5, 0xD9F4, 0x4EB6, 0x818D,\t0x4EB7, 0x818E, 0x4EB8, 0x818F, 0x4EB9, 0x8190, 0x4EBA, 0xC8CB,\n\t0x4EBB, 0xD8E9, 0x4EBC, 0x8191, 0x4EBD, 0x8192, 0x4EBE, 0x8193,\t0x4EBF, 0xD2DA, 0x4EC0, 0xCAB2, 0x4EC1, 0xC8CA, 0x4EC2, 0xD8EC,\n\t0x4EC3, 0xD8EA, 0x4EC4, 0xD8C6, 0x4EC5, 0xBDF6, 0x4EC6, 0xC6CD,\t0x4EC7, 0xB3F0, 0x4EC8, 0x8194, 0x4EC9, 0xD8EB, 0x4ECA, 0xBDF1,\n\t0x4ECB, 0xBDE9, 0x4ECC, 0x8195, 0x4ECD, 0xC8D4, 0x4ECE, 0xB4D3,\t0x4ECF, 0x8196, 0x4ED0, 0x8197, 0x4ED1, 0xC2D8, 0x4ED2, 0x8198,\n\t0x4ED3, 0xB2D6, 0x4ED4, 0xD7D0, 0x4ED5, 0xCACB, 0x4ED6, 0xCBFB,\t0x4ED7, 0xD5CC, 0x4ED8, 0xB8B6, 0x4ED9, 0xCFC9, 0x4EDA, 0x8199,\n\t0x4EDB, 0x819A, 0x4EDC, 0x819B, 0x4EDD, 0xD9DA, 0x4EDE, 0xD8F0,\t0x4EDF, 0xC7AA, 0x4EE0, 0x819C, 0x4EE1, 0xD8EE, 0x4EE2, 0x819D,\n\t0x4EE3, 0xB4FA, 0x4EE4, 0xC1EE, 0x4EE5, 0xD2D4, 0x4EE6, 0x819E,\t0x4EE7, 0x819F, 0x4EE8, 0xD8ED, 0x4EE9, 0x81A0, 0x4EEA, 0xD2C7,\n\t0x4EEB, 0xD8EF, 0x4EEC, 0xC3C7, 0x4EED, 0x81A1, 0x4EEE, 0x81A2,\t0x4EEF, 0x81A3, 0x4EF0, 0xD1F6, 0x4EF1, 0x81A4, 0x4EF2, 0xD6D9,\n\t0x4EF3, 0xD8F2, 0x4EF4, 0x81A5, 0x4EF5, 0xD8F5, 0x4EF6, 0xBCFE,\t0x4EF7, 0xBCDB, 0x4EF8, 0x81A6, 0x4EF9, 0x81A7, 0x4EFA, 0x81A8,\n\t0x4EFB, 0xC8CE, 0x4EFC, 0x81A9, 0x4EFD, 0xB7DD, 0x4EFE, 0x81AA,\t0x4EFF, 0xB7C2, 0x4F00, 0x81AB, 0x4F01, 0xC6F3, 0x4F02, 0x81AC,\n\t0x4F03, 0x81AD, 0x4F04, 0x81AE, 0x4F05, 0x81AF, 0x4F06, 0x81B0,\t0x4F07, 0x81B1, 0x4F08, 0x81B2, 0x4F09, 0xD8F8, 0x4F0A, 0xD2C1,\n\t0x4F0B, 0x81B3, 0x4F0C, 0x81B4, 0x4F0D, 0xCEE9, 0x4F0E, 0xBCBF,\t0x4F0F, 0xB7FC, 0x4F10, 0xB7A5, 0x4F11, 0xD0DD, 0x4F12, 0x81B5,\n\t0x4F13, 0x81B6, 0x4F14, 0x81B7, 0x4F15, 0x81B8, 0x4F16, 0x81B9,\t0x4F17, 0xD6DA, 0x4F18, 0xD3C5, 0x4F19, 0xBBEF, 0x4F1A, 0xBBE1,\n\t0x4F1B, 0xD8F1, 0x4F1C, 0x81BA, 0x4F1D, 0x81BB, 0x4F1E, 0xC9A1,\t0x4F1F, 0xCEB0, 0x4F20, 0xB4AB, 0x4F21, 0x81BC, 0x4F22, 0xD8F3,\n\t0x4F23, 0x81BD, 0x4F24, 0xC9CB, 0x4F25, 0xD8F6, 0x4F26, 0xC2D7,\t0x4F27, 0xD8F7, 0x4F28, 0x81BE, 0x4F29, 0x81BF, 0x4F2A, 0xCEB1,\n\t0x4F2B, 0xD8F9, 0x4F2C, 0x81C0, 0x4F2D, 0x81C1, 0x4F2E, 0x81C2,\t0x4F2F, 0xB2AE, 0x4F30, 0xB9C0, 0x4F31, 0x81C3, 0x4F32, 0xD9A3,\n\t0x4F33, 0x81C4, 0x4F34, 0xB0E9, 0x4F35, 0x81C5, 0x4F36, 0xC1E6,\t0x4F37, 0x81C6, 0x4F38, 0xC9EC, 0x4F39, 0x81C7, 0x4F3A, 0xCBC5,\n\t0x4F3B, 0x81C8, 0x4F3C, 0xCBC6, 0x4F3D, 0xD9A4, 0x4F3E, 0x81C9,\t0x4F3F, 0x81CA, 0x4F40, 0x81CB, 0x4F41, 0x81CC, 0x4F42, 0x81CD,\n\t0x4F43, 0xB5E8, 0x4F44, 0x81CE, 0x4F45, 0x81CF, 0x4F46, 0xB5AB,\t0x4F47, 0x81D0, 0x4F48, 0x81D1, 0x4F49, 0x81D2, 0x4F4A, 0x81D3,\n\t0x4F4B, 0x81D4, 0x4F4C, 0x81D5, 0x4F4D, 0xCEBB, 0x4F4E, 0xB5CD,\t0x4F4F, 0xD7A1, 0x4F50, 0xD7F4, 0x4F51, 0xD3D3, 0x4F52, 0x81D6,\n\t0x4F53, 0xCCE5, 0x4F54, 0x81D7, 0x4F55, 0xBACE, 0x4F56, 0x81D8,\t0x4F57, 0xD9A2, 0x4F58, 0xD9DC, 0x4F59, 0xD3E0, 0x4F5A, 0xD8FD,\n\t0x4F5B, 0xB7F0, 0x4F5C, 0xD7F7, 0x4F5D, 0xD8FE, 0x4F5E, 0xD8FA,\t0x4F5F, 0xD9A1, 0x4F60, 0xC4E3, 0x4F61, 0x81D9, 0x4F62, 0x81DA,\n\t0x4F63, 0xD3B6, 0x4F64, 0xD8F4, 0x4F65, 0xD9DD, 0x4F66, 0x81DB,\t0x4F67, 0xD8FB, 0x4F68, 0x81DC, 0x4F69, 0xC5E5, 0x4F6A, 0x81DD,\n\t0x4F6B, 0x81DE, 0x4F6C, 0xC0D0, 0x4F6D, 0x81DF, 0x4F6E, 0x81E0,\t0x4F6F, 0xD1F0, 0x4F70, 0xB0DB, 0x4F71, 0x81E1, 0x4F72, 0x81E2,\n\t0x4F73, 0xBCD1, 0x4F74, 0xD9A6, 0x4F75, 0x81E3, 0x4F76, 0xD9A5,\t0x4F77, 0x81E4, 0x4F78, 0x81E5, 0x4F79, 0x81E6, 0x4F7A, 0x81E7,\n\t0x4F7B, 0xD9AC, 0x4F7C, 0xD9AE, 0x4F7D, 0x81E8, 0x4F7E, 0xD9AB,\t0x4F7F, 0xCAB9, 0x4F80, 0x81E9, 0x4F81, 0x81EA, 0x4F82, 0x81EB,\n\t0x4F83, 0xD9A9, 0x4F84, 0xD6B6, 0x4F85, 0x81EC, 0x4F86, 0x81ED,\t0x4F87, 0x81EE, 0x4F88, 0xB3DE, 0x4F89, 0xD9A8, 0x4F8A, 0x81EF,\n\t0x4F8B, 0xC0FD, 0x4F8C, 0x81F0, 0x4F8D, 0xCACC, 0x4F8E, 0x81F1,\t0x4F8F, 0xD9AA, 0x4F90, 0x81F2, 0x4F91, 0xD9A7, 0x4F92, 0x81F3,\n\t0x4F93, 0x81F4, 0x4F94, 0xD9B0, 0x4F95, 0x81F5, 0x4F96, 0x81F6,\t0x4F97, 0xB6B1, 0x4F98, 0x81F7, 0x4F99, 0x81F8, 0x4F9A, 0x81F9,\n\t0x4F9B, 0xB9A9, 0x4F9C, 0x81FA, 0x4F9D, 0xD2C0, 0x4F9E, 0x81FB,\t0x4F9F, 0x81FC, 0x4FA0, 0xCFC0, 0x4FA1, 0x81FD, 0x4FA2, 0x81FE,\n\t0x4FA3, 0xC2C2, 0x4FA4, 0x8240, 0x4FA5, 0xBDC4, 0x4FA6, 0xD5EC,\t0x4FA7, 0xB2E0, 0x4FA8, 0xC7C8, 0x4FA9, 0xBFEB, 0x4FAA, 0xD9AD,\n\t0x4FAB, 0x8241, 0x4FAC, 0xD9AF, 0x4FAD, 0x8242, 0x4FAE, 0xCEEA,\t0x4FAF, 0xBAEE, 0x4FB0, 0x8243, 0x4FB1, 0x8244, 0x4FB2, 0x8245,\n\t0x4FB3, 0x8246, 0x4FB4, 0x8247, 0x4FB5, 0xC7D6, 0x4FB6, 0x8248,\t0x4FB7, 0x8249, 0x4FB8, 0x824A, 0x4FB9, 0x824B, 0x4FBA, 0x824C,\n\t0x4FBB, 0x824D, 0x4FBC, 0x824E, 0x4FBD, 0x824F, 0x4FBE, 0x8250,\t0x4FBF, 0xB1E3, 0x4FC0, 0x8251, 0x4FC1, 0x8252, 0x4FC2, 0x8253,\n\t0x4FC3, 0xB4D9, 0x4FC4, 0xB6ED, 0x4FC5, 0xD9B4, 0x4FC6, 0x8254,\t0x4FC7, 0x8255, 0x4FC8, 0x8256, 0x4FC9, 0x8257, 0x4FCA, 0xBFA1,\n\t0x4FCB, 0x8258, 0x4FCC, 0x8259, 0x4FCD, 0x825A, 0x4FCE, 0xD9DE,\t0x4FCF, 0xC7CE, 0x4FD0, 0xC0FE, 0x4FD1, 0xD9B8, 0x4FD2, 0x825B,\n\t0x4FD3, 0x825C, 0x4FD4, 0x825D, 0x4FD5, 0x825E, 0x4FD6, 0x825F,\t0x4FD7, 0xCBD7, 0x4FD8, 0xB7FD, 0x4FD9, 0x8260, 0x4FDA, 0xD9B5,\n\t0x4FDB, 0x8261, 0x4FDC, 0xD9B7, 0x4FDD, 0xB1A3, 0x4FDE, 0xD3E1,\t0x4FDF, 0xD9B9, 0x4FE0, 0x8262, 0x4FE1, 0xD0C5, 0x4FE2, 0x8263,\n\t0x4FE3, 0xD9B6, 0x4FE4, 0x8264, 0x4FE5, 0x8265, 0x4FE6, 0xD9B1,\t0x4FE7, 0x8266, 0x4FE8, 0xD9B2, 0x4FE9, 0xC1A9, 0x4FEA, 0xD9B3,\n\t0x4FEB, 0x8267, 0x4FEC, 0x8268, 0x4FED, 0xBCF3, 0x4FEE, 0xD0DE,\t0x4FEF, 0xB8A9, 0x4FF0, 0x8269, 0x4FF1, 0xBEE3, 0x4FF2, 0x826A,\n\t0x4FF3, 0xD9BD, 0x4FF4, 0x826B, 0x4FF5, 0x826C, 0x4FF6, 0x826D,\t0x4FF7, 0x826E, 0x4FF8, 0xD9BA, 0x4FF9, 0x826F, 0x4FFA, 0xB0B3,\n\t0x4FFB, 0x8270, 0x4FFC, 0x8271, 0x4FFD, 0x8272, 0x4FFE, 0xD9C2,\t0x4FFF, 0x8273, 0x5000, 0x8274, 0x5001, 0x8275, 0x5002, 0x8276,\n\t0x5003, 0x8277, 0x5004, 0x8278, 0x5005, 0x8279, 0x5006, 0x827A,\t0x5007, 0x827B, 0x5008, 0x827C, 0x5009, 0x827D, 0x500A, 0x827E,\n\t0x500B, 0x8280, 0x500C, 0xD9C4, 0x500D, 0xB1B6, 0x500E, 0x8281,\t0x500F, 0xD9BF, 0x5010, 0x8282, 0x5011, 0x8283, 0x5012, 0xB5B9,\n\t0x5013, 0x8284, 0x5014, 0xBEF3, 0x5015, 0x8285, 0x5016, 0x8286,\t0x5017, 0x8287, 0x5018, 0xCCC8, 0x5019, 0xBAF2, 0x501A, 0xD2D0,\n\t0x501B, 0x8288, 0x501C, 0xD9C3, 0x501D, 0x8289, 0x501E, 0x828A,\t0x501F, 0xBDE8, 0x5020, 0x828B, 0x5021, 0xB3AB, 0x5022, 0x828C,\n\t0x5023, 0x828D, 0x5024, 0x828E, 0x5025, 0xD9C5, 0x5026, 0xBEEB,\t0x5027, 0x828F, 0x5028, 0xD9C6, 0x5029, 0xD9BB, 0x502A, 0xC4DF,\n\t0x502B, 0x8290, 0x502C, 0xD9BE, 0x502D, 0xD9C1, 0x502E, 0xD9C0,\t0x502F, 0x8291, 0x5030, 0x8292, 0x5031, 0x8293, 0x5032, 0x8294,\n\t0x5033, 0x8295, 0x5034, 0x8296, 0x5035, 0x8297, 0x5036, 0x8298,\t0x5037, 0x8299, 0x5038, 0x829A, 0x5039, 0x829B, 0x503A, 0xD5AE,\n\t0x503B, 0x829C, 0x503C, 0xD6B5, 0x503D, 0x829D, 0x503E, 0xC7E3,\t0x503F, 0x829E, 0x5040, 0x829F, 0x5041, 0x82A0, 0x5042, 0x82A1,\n\t0x5043, 0xD9C8, 0x5044, 0x82A2, 0x5045, 0x82A3, 0x5046, 0x82A4,\t0x5047, 0xBCD9, 0x5048, 0xD9CA, 0x5049, 0x82A5, 0x504A, 0x82A6,\n\t0x504B, 0x82A7, 0x504C, 0xD9BC, 0x504D, 0x82A8, 0x504E, 0xD9CB,\t0x504F, 0xC6AB, 0x5050, 0x82A9, 0x5051, 0x82AA, 0x5052, 0x82AB,\n\t0x5053, 0x82AC, 0x5054, 0x82AD, 0x5055, 0xD9C9, 0x5056, 0x82AE,\t0x5057, 0x82AF, 0x5058, 0x82B0, 0x5059, 0x82B1, 0x505A, 0xD7F6,\n\t0x505B, 0x82B2, 0x505C, 0xCDA3, 0x505D, 0x82B3, 0x505E, 0x82B4,\t0x505F, 0x82B5, 0x5060, 0x82B6, 0x5061, 0x82B7, 0x5062, 0x82B8,\n\t0x5063, 0x82B9, 0x5064, 0x82BA, 0x5065, 0xBDA1, 0x5066, 0x82BB,\t0x5067, 0x82BC, 0x5068, 0x82BD, 0x5069, 0x82BE, 0x506A, 0x82BF,\n\t0x506B, 0x82C0, 0x506C, 0xD9CC, 0x506D, 0x82C1, 0x506E, 0x82C2,\t0x506F, 0x82C3, 0x5070, 0x82C4, 0x5071, 0x82C5, 0x5072, 0x82C6,\n\t0x5073, 0x82C7, 0x5074, 0x82C8, 0x5075, 0x82C9, 0x5076, 0xC5BC,\t0x5077, 0xCDB5, 0x5078, 0x82CA, 0x5079, 0x82CB, 0x507A, 0x82CC,\n\t0x507B, 0xD9CD, 0x507C, 0x82CD, 0x507D, 0x82CE, 0x507E, 0xD9C7,\t0x507F, 0xB3A5, 0x5080, 0xBFFE, 0x5081, 0x82CF, 0x5082, 0x82D0,\n\t0x5083, 0x82D1, 0x5084, 0x82D2, 0x5085, 0xB8B5, 0x5086, 0x82D3,\t0x5087, 0x82D4, 0x5088, 0xC0FC, 0x5089, 0x82D5, 0x508A, 0x82D6,\n\t0x508B, 0x82D7, 0x508C, 0x82D8, 0x508D, 0xB0F8, 0x508E, 0x82D9,\t0x508F, 0x82DA, 0x5090, 0x82DB, 0x5091, 0x82DC, 0x5092, 0x82DD,\n\t0x5093, 0x82DE, 0x5094, 0x82DF, 0x5095, 0x82E0, 0x5096, 0x82E1,\t0x5097, 0x82E2, 0x5098, 0x82E3, 0x5099, 0x82E4, 0x509A, 0x82E5,\n\t0x509B, 0x82E6, 0x509C, 0x82E7, 0x509D, 0x82E8, 0x509E, 0x82E9,\t0x509F, 0x82EA, 0x50A0, 0x82EB, 0x50A1, 0x82EC, 0x50A2, 0x82ED,\n\t0x50A3, 0xB4F6, 0x50A4, 0x82EE, 0x50A5, 0xD9CE, 0x50A6, 0x82EF,\t0x50A7, 0xD9CF, 0x50A8, 0xB4A2, 0x50A9, 0xD9D0, 0x50AA, 0x82F0,\n\t0x50AB, 0x82F1, 0x50AC, 0xB4DF, 0x50AD, 0x82F2, 0x50AE, 0x82F3,\t0x50AF, 0x82F4, 0x50B0, 0x82F5, 0x50B1, 0x82F6, 0x50B2, 0xB0C1,\n\t0x50B3, 0x82F7, 0x50B4, 0x82F8, 0x50B5, 0x82F9, 0x50B6, 0x82FA,\t0x50B7, 0x82FB, 0x50B8, 0x82FC, 0x50B9, 0x82FD, 0x50BA, 0xD9D1,\n\t0x50BB, 0xC9B5, 0x50BC, 0x82FE, 0x50BD, 0x8340, 0x50BE, 0x8341,\t0x50BF, 0x8342, 0x50C0, 0x8343, 0x50C1, 0x8344, 0x50C2, 0x8345,\n\t0x50C3, 0x8346, 0x50C4, 0x8347, 0x50C5, 0x8348, 0x50C6, 0x8349,\t0x50C7, 0x834A, 0x50C8, 0x834B, 0x50C9, 0x834C, 0x50CA, 0x834D,\n\t0x50CB, 0x834E, 0x50CC, 0x834F, 0x50CD, 0x8350, 0x50CE, 0x8351,\t0x50CF, 0xCFF1, 0x50D0, 0x8352, 0x50D1, 0x8353, 0x50D2, 0x8354,\n\t0x50D3, 0x8355, 0x50D4, 0x8356, 0x50D5, 0x8357, 0x50D6, 0xD9D2,\t0x50D7, 0x8358, 0x50D8, 0x8359, 0x50D9, 0x835A, 0x50DA, 0xC1C5,\n\t0x50DB, 0x835B, 0x50DC, 0x835C, 0x50DD, 0x835D, 0x50DE, 0x835E,\t0x50DF, 0x835F, 0x50E0, 0x8360, 0x50E1, 0x8361, 0x50E2, 0x8362,\n\t0x50E3, 0x8363, 0x50E4, 0x8364, 0x50E5, 0x8365, 0x50E6, 0xD9D6,\t0x50E7, 0xC9AE, 0x50E8, 0x8366, 0x50E9, 0x8367, 0x50EA, 0x8368,\n\t0x50EB, 0x8369, 0x50EC, 0xD9D5, 0x50ED, 0xD9D4, 0x50EE, 0xD9D7,\t0x50EF, 0x836A, 0x50F0, 0x836B, 0x50F1, 0x836C, 0x50F2, 0x836D,\n\t0x50F3, 0xCBDB, 0x50F4, 0x836E, 0x50F5, 0xBDA9, 0x50F6, 0x836F,\t0x50F7, 0x8370, 0x50F8, 0x8371, 0x50F9, 0x8372, 0x50FA, 0x8373,\n\t0x50FB, 0xC6A7, 0x50FC, 0x8374, 0x50FD, 0x8375, 0x50FE, 0x8376,\t0x50FF, 0x8377, 0x5100, 0x8378, 0x5101, 0x8379, 0x5102, 0x837A,\n\t0x5103, 0x837B, 0x5104, 0x837C, 0x5105, 0x837D, 0x5106, 0xD9D3,\t0x5107, 0xD9D8, 0x5108, 0x837E, 0x5109, 0x8380, 0x510A, 0x8381,\n\t0x510B, 0xD9D9, 0x510C, 0x8382, 0x510D, 0x8383, 0x510E, 0x8384,\t0x510F, 0x8385, 0x5110, 0x8386, 0x5111, 0x8387, 0x5112, 0xC8E5,\n\t0x5113, 0x8388, 0x5114, 0x8389, 0x5115, 0x838A, 0x5116, 0x838B,\t0x5117, 0x838C, 0x5118, 0x838D, 0x5119, 0x838E, 0x511A, 0x838F,\n\t0x511B, 0x8390, 0x511C, 0x8391, 0x511D, 0x8392, 0x511E, 0x8393,\t0x511F, 0x8394, 0x5120, 0x8395, 0x5121, 0xC0DC, 0x5122, 0x8396,\n\t0x5123, 0x8397, 0x5124, 0x8398, 0x5125, 0x8399, 0x5126, 0x839A,\t0x5127, 0x839B, 0x5128, 0x839C, 0x5129, 0x839D, 0x512A, 0x839E,\n\t0x512B, 0x839F, 0x512C, 0x83A0, 0x512D, 0x83A1, 0x512E, 0x83A2,\t0x512F, 0x83A3, 0x5130, 0x83A4, 0x5131, 0x83A5, 0x5132, 0x83A6,\n\t0x5133, 0x83A7, 0x5134, 0x83A8, 0x5135, 0x83A9, 0x5136, 0x83AA,\t0x5137, 0x83AB, 0x5138, 0x83AC, 0x5139, 0x83AD, 0x513A, 0x83AE,\n\t0x513B, 0x83AF, 0x513C, 0x83B0, 0x513D, 0x83B1, 0x513E, 0x83B2,\t0x513F, 0xB6F9, 0x5140, 0xD8A3, 0x5141, 0xD4CA, 0x5142, 0x83B3,\n\t0x5143, 0xD4AA, 0x5144, 0xD0D6, 0x5145, 0xB3E4, 0x5146, 0xD5D7,\t0x5147, 0x83B4, 0x5148, 0xCFC8, 0x5149, 0xB9E2, 0x514A, 0x83B5,\n\t0x514B, 0xBFCB, 0x514C, 0x83B6, 0x514D, 0xC3E2, 0x514E, 0x83B7,\t0x514F, 0x83B8, 0x5150, 0x83B9, 0x5151, 0xB6D2, 0x5152, 0x83BA,\n\t0x5153, 0x83BB, 0x5154, 0xCDC3, 0x5155, 0xD9EE, 0x5156, 0xD9F0,\t0x5157, 0x83BC, 0x5158, 0x83BD, 0x5159, 0x83BE, 0x515A, 0xB5B3,\n\t0x515B, 0x83BF, 0x515C, 0xB6B5, 0x515D, 0x83C0, 0x515E, 0x83C1,\t0x515F, 0x83C2, 0x5160, 0x83C3, 0x5161, 0x83C4, 0x5162, 0xBEA4,\n\t0x5163, 0x83C5, 0x5164, 0x83C6, 0x5165, 0xC8EB, 0x5166, 0x83C7,\t0x5167, 0x83C8, 0x5168, 0xC8AB, 0x5169, 0x83C9, 0x516A, 0x83CA,\n\t0x516B, 0xB0CB, 0x516C, 0xB9AB, 0x516D, 0xC1F9, 0x516E, 0xD9E2,\t0x516F, 0x83CB, 0x5170, 0xC0BC, 0x5171, 0xB9B2, 0x5172, 0x83CC,\n\t0x5173, 0xB9D8, 0x5174, 0xD0CB, 0x5175, 0xB1F8, 0x5176, 0xC6E4,\t0x5177, 0xBEDF, 0x5178, 0xB5E4, 0x5179, 0xD7C8, 0x517A, 0x83CD,\n\t0x517B, 0xD1F8, 0x517C, 0xBCE6, 0x517D, 0xCADE, 0x517E, 0x83CE,\t0x517F, 0x83CF, 0x5180, 0xBCBD, 0x5181, 0xD9E6, 0x5182, 0xD8E7,\n\t0x5183, 0x83D0, 0x5184, 0x83D1, 0x5185, 0xC4DA, 0x5186, 0x83D2,\t0x5187, 0x83D3, 0x5188, 0xB8D4, 0x5189, 0xC8BD, 0x518A, 0x83D4,\n\t0x518B, 0x83D5, 0x518C, 0xB2E1, 0x518D, 0xD4D9, 0x518E, 0x83D6,\t0x518F, 0x83D7, 0x5190, 0x83D8, 0x5191, 0x83D9, 0x5192, 0xC3B0,\n\t0x5193, 0x83DA, 0x5194, 0x83DB, 0x5195, 0xC3E1, 0x5196, 0xDAA2,\t0x5197, 0xC8DF, 0x5198, 0x83DC, 0x5199, 0xD0B4, 0x519A, 0x83DD,\n\t0x519B, 0xBEFC, 0x519C, 0xC5A9, 0x519D, 0x83DE, 0x519E, 0x83DF,\t0x519F, 0x83E0, 0x51A0, 0xB9DA, 0x51A1, 0x83E1, 0x51A2, 0xDAA3,\n\t0x51A3, 0x83E2, 0x51A4, 0xD4A9, 0x51A5, 0xDAA4, 0x51A6, 0x83E3,\t0x51A7, 0x83E4, 0x51A8, 0x83E5, 0x51A9, 0x83E6, 0x51AA, 0x83E7,\n\t0x51AB, 0xD9FB, 0x51AC, 0xB6AC, 0x51AD, 0x83E8, 0x51AE, 0x83E9,\t0x51AF, 0xB7EB, 0x51B0, 0xB1F9, 0x51B1, 0xD9FC, 0x51B2, 0xB3E5,\n\t0x51B3, 0xBEF6, 0x51B4, 0x83EA, 0x51B5, 0xBFF6, 0x51B6, 0xD2B1,\t0x51B7, 0xC0E4, 0x51B8, 0x83EB, 0x51B9, 0x83EC, 0x51BA, 0x83ED,\n\t0x51BB, 0xB6B3, 0x51BC, 0xD9FE, 0x51BD, 0xD9FD, 0x51BE, 0x83EE,\t0x51BF, 0x83EF, 0x51C0, 0xBEBB, 0x51C1, 0x83F0, 0x51C2, 0x83F1,\n\t0x51C3, 0x83F2, 0x51C4, 0xC6E0, 0x51C5, 0x83F3, 0x51C6, 0xD7BC,\t0x51C7, 0xDAA1, 0x51C8, 0x83F4, 0x51C9, 0xC1B9, 0x51CA, 0x83F5,\n\t0x51CB, 0xB5F2, 0x51CC, 0xC1E8, 0x51CD, 0x83F6, 0x51CE, 0x83F7,\t0x51CF, 0xBCF5, 0x51D0, 0x83F8, 0x51D1, 0xB4D5, 0x51D2, 0x83F9,\n\t0x51D3, 0x83FA, 0x51D4, 0x83FB, 0x51D5, 0x83FC, 0x51D6, 0x83FD,\t0x51D7, 0x83FE, 0x51D8, 0x8440, 0x51D9, 0x8441, 0x51DA, 0x8442,\n\t0x51DB, 0xC1DD, 0x51DC, 0x8443, 0x51DD, 0xC4FD, 0x51DE, 0x8444,\t0x51DF, 0x8445, 0x51E0, 0xBCB8, 0x51E1, 0xB7B2, 0x51E2, 0x8446,\n\t0x51E3, 0x8447, 0x51E4, 0xB7EF, 0x51E5, 0x8448, 0x51E6, 0x8449,\t0x51E7, 0x844A, 0x51E8, 0x844B, 0x51E9, 0x844C, 0x51EA, 0x844D,\n\t0x51EB, 0xD9EC, 0x51EC, 0x844E, 0x51ED, 0xC6BE, 0x51EE, 0x844F,\t0x51EF, 0xBFAD, 0x51F0, 0xBBCB, 0x51F1, 0x8450, 0x51F2, 0x8451,\n\t0x51F3, 0xB5CA, 0x51F4, 0x8452, 0x51F5, 0xDBC9, 0x51F6, 0xD0D7,\t0x51F7, 0x8453, 0x51F8, 0xCDB9, 0x51F9, 0xB0BC, 0x51FA, 0xB3F6,\n\t0x51FB, 0xBBF7, 0x51FC, 0xDBCA, 0x51FD, 0xBAAF, 0x51FE, 0x8454,\t0x51FF, 0xD4E4, 0x5200, 0xB5B6, 0x5201, 0xB5F3, 0x5202, 0xD8D6,\n\t0x5203, 0xC8D0, 0x5204, 0x8455, 0x5205, 0x8456, 0x5206, 0xB7D6,\t0x5207, 0xC7D0, 0x5208, 0xD8D7, 0x5209, 0x8457, 0x520A, 0xBFAF,\n\t0x520B, 0x8458, 0x520C, 0x8459, 0x520D, 0xDBBB, 0x520E, 0xD8D8,\t0x520F, 0x845A, 0x5210, 0x845B, 0x5211, 0xD0CC, 0x5212, 0xBBAE,\n\t0x5213, 0x845C, 0x5214, 0x845D, 0x5215, 0x845E, 0x5216, 0xEBBE,\t0x5217, 0xC1D0, 0x5218, 0xC1F5, 0x5219, 0xD4F2, 0x521A, 0xB8D5,\n\t0x521B, 0xB4B4, 0x521C, 0x845F, 0x521D, 0xB3F5, 0x521E, 0x8460,\t0x521F, 0x8461, 0x5220, 0xC9BE, 0x5221, 0x8462, 0x5222, 0x8463,\n\t0x5223, 0x8464, 0x5224, 0xC5D0, 0x5225, 0x8465, 0x5226, 0x8466,\t0x5227, 0x8467, 0x5228, 0xC5D9, 0x5229, 0xC0FB, 0x522A, 0x8468,\n\t0x522B, 0xB1F0, 0x522C, 0x8469, 0x522D, 0xD8D9, 0x522E, 0xB9CE,\t0x522F, 0x846A, 0x5230, 0xB5BD, 0x5231, 0x846B, 0x5232, 0x846C,\n\t0x5233, 0xD8DA, 0x5234, 0x846D, 0x5235, 0x846E, 0x5236, 0xD6C6,\t0x5237, 0xCBA2, 0x5238, 0xC8AF, 0x5239, 0xC9B2, 0x523A, 0xB4CC,\n\t0x523B, 0xBFCC, 0x523C, 0x846F, 0x523D, 0xB9F4, 0x523E, 0x8470,\t0x523F, 0xD8DB, 0x5240, 0xD8DC, 0x5241, 0xB6E7, 0x5242, 0xBCC1,\n\t0x5243, 0xCCEA, 0x5244, 0x8471, 0x5245, 0x8472, 0x5246, 0x8473,\t0x5247, 0x8474, 0x5248, 0x8475, 0x5249, 0x8476, 0x524A, 0xCFF7,\n\t0x524B, 0x8477, 0x524C, 0xD8DD, 0x524D, 0xC7B0, 0x524E, 0x8478,\t0x524F, 0x8479, 0x5250, 0xB9D0, 0x5251, 0xBDA3, 0x5252, 0x847A,\n\t0x5253, 0x847B, 0x5254, 0xCCDE, 0x5255, 0x847C, 0x5256, 0xC6CA,\t0x5257, 0x847D, 0x5258, 0x847E, 0x5259, 0x8480, 0x525A, 0x8481,\n\t0x525B, 0x8482, 0x525C, 0xD8E0, 0x525D, 0x8483, 0x525E, 0xD8DE,\t0x525F, 0x8484, 0x5260, 0x8485, 0x5261, 0xD8DF, 0x5262, 0x8486,\n\t0x5263, 0x8487, 0x5264, 0x8488, 0x5265, 0xB0FE, 0x5266, 0x8489,\t0x5267, 0xBEE7, 0x5268, 0x848A, 0x5269, 0xCAA3, 0x526A, 0xBCF4,\n\t0x526B, 0x848B, 0x526C, 0x848C, 0x526D, 0x848D, 0x526E, 0x848E,\t0x526F, 0xB8B1, 0x5270, 0x848F, 0x5271, 0x8490, 0x5272, 0xB8EE,\n\t0x5273, 0x8491, 0x5274, 0x8492, 0x5275, 0x8493, 0x5276, 0x8494,\t0x5277, 0x8495, 0x5278, 0x8496, 0x5279, 0x8497, 0x527A, 0x8498,\n\t0x527B, 0x8499, 0x527C, 0x849A, 0x527D, 0xD8E2, 0x527E, 0x849B,\t0x527F, 0xBDCB, 0x5280, 0x849C, 0x5281, 0xD8E4, 0x5282, 0xD8E3,\n\t0x5283, 0x849D, 0x5284, 0x849E, 0x5285, 0x849F, 0x5286, 0x84A0,\t0x5287, 0x84A1, 0x5288, 0xC5FC, 0x5289, 0x84A2, 0x528A, 0x84A3,\n\t0x528B, 0x84A4, 0x528C, 0x84A5, 0x528D, 0x84A6, 0x528E, 0x84A7,\t0x528F, 0x84A8, 0x5290, 0xD8E5, 0x5291, 0x84A9, 0x5292, 0x84AA,\n\t0x5293, 0xD8E6, 0x5294, 0x84AB, 0x5295, 0x84AC, 0x5296, 0x84AD,\t0x5297, 0x84AE, 0x5298, 0x84AF, 0x5299, 0x84B0, 0x529A, 0x84B1,\n\t0x529B, 0xC1A6, 0x529C, 0x84B2, 0x529D, 0xC8B0, 0x529E, 0xB0EC,\t0x529F, 0xB9A6, 0x52A0, 0xBCD3, 0x52A1, 0xCEF1, 0x52A2, 0xDBBD,\n\t0x52A3, 0xC1D3, 0x52A4, 0x84B3, 0x52A5, 0x84B4, 0x52A6, 0x84B5,\t0x52A7, 0x84B6, 0x52A8, 0xB6AF, 0x52A9, 0xD6FA, 0x52AA, 0xC5AC,\n\t0x52AB, 0xBDD9, 0x52AC, 0xDBBE, 0x52AD, 0xDBBF, 0x52AE, 0x84B7,\t0x52AF, 0x84B8, 0x52B0, 0x84B9, 0x52B1, 0xC0F8, 0x52B2, 0xBEA2,\n\t0x52B3, 0xC0CD, 0x52B4, 0x84BA, 0x52B5, 0x84BB, 0x52B6, 0x84BC,\t0x52B7, 0x84BD, 0x52B8, 0x84BE, 0x52B9, 0x84BF, 0x52BA, 0x84C0,\n\t0x52BB, 0x84C1, 0x52BC, 0x84C2, 0x52BD, 0x84C3, 0x52BE, 0xDBC0,\t0x52BF, 0xCAC6, 0x52C0, 0x84C4, 0x52C1, 0x84C5, 0x52C2, 0x84C6,\n\t0x52C3, 0xB2AA, 0x52C4, 0x84C7, 0x52C5, 0x84C8, 0x52C6, 0x84C9,\t0x52C7, 0xD3C2, 0x52C8, 0x84CA, 0x52C9, 0xC3E3, 0x52CA, 0x84CB,\n\t0x52CB, 0xD1AB, 0x52CC, 0x84CC, 0x52CD, 0x84CD, 0x52CE, 0x84CE,\t0x52CF, 0x84CF, 0x52D0, 0xDBC2, 0x52D1, 0x84D0, 0x52D2, 0xC0D5,\n\t0x52D3, 0x84D1, 0x52D4, 0x84D2, 0x52D5, 0x84D3, 0x52D6, 0xDBC3,\t0x52D7, 0x84D4, 0x52D8, 0xBFB1, 0x52D9, 0x84D5, 0x52DA, 0x84D6,\n\t0x52DB, 0x84D7, 0x52DC, 0x84D8, 0x52DD, 0x84D9, 0x52DE, 0x84DA,\t0x52DF, 0xC4BC, 0x52E0, 0x84DB, 0x52E1, 0x84DC, 0x52E2, 0x84DD,\n\t0x52E3, 0x84DE, 0x52E4, 0xC7DA, 0x52E5, 0x84DF, 0x52E6, 0x84E0,\t0x52E7, 0x84E1, 0x52E8, 0x84E2, 0x52E9, 0x84E3, 0x52EA, 0x84E4,\n\t0x52EB, 0x84E5, 0x52EC, 0x84E6, 0x52ED, 0x84E7, 0x52EE, 0x84E8,\t0x52EF, 0x84E9, 0x52F0, 0xDBC4, 0x52F1, 0x84EA, 0x52F2, 0x84EB,\n\t0x52F3, 0x84EC, 0x52F4, 0x84ED, 0x52F5, 0x84EE, 0x52F6, 0x84EF,\t0x52F7, 0x84F0, 0x52F8, 0x84F1, 0x52F9, 0xD9E8, 0x52FA, 0xC9D7,\n\t0x52FB, 0x84F2, 0x52FC, 0x84F3, 0x52FD, 0x84F4, 0x52FE, 0xB9B4,\t0x52FF, 0xCEF0, 0x5300, 0xD4C8, 0x5301, 0x84F5, 0x5302, 0x84F6,\n\t0x5303, 0x84F7, 0x5304, 0x84F8, 0x5305, 0xB0FC, 0x5306, 0xB4D2,\t0x5307, 0x84F9, 0x5308, 0xD0D9, 0x5309, 0x84FA, 0x530A, 0x84FB,\n\t0x530B, 0x84FC, 0x530C, 0x84FD, 0x530D, 0xD9E9, 0x530E, 0x84FE,\t0x530F, 0xDECB, 0x5310, 0xD9EB, 0x5311, 0x8540, 0x5312, 0x8541,\n\t0x5313, 0x8542, 0x5314, 0x8543, 0x5315, 0xD8B0, 0x5316, 0xBBAF,\t0x5317, 0xB1B1, 0x5318, 0x8544, 0x5319, 0xB3D7, 0x531A, 0xD8CE,\n\t0x531B, 0x8545, 0x531C, 0x8546, 0x531D, 0xD4D1, 0x531E, 0x8547,\t0x531F, 0x8548, 0x5320, 0xBDB3, 0x5321, 0xBFEF, 0x5322, 0x8549,\n\t0x5323, 0xCFBB, 0x5324, 0x854A, 0x5325, 0x854B, 0x5326, 0xD8D0,\t0x5327, 0x854C, 0x5328, 0x854D, 0x5329, 0x854E, 0x532A, 0xB7CB,\n\t0x532B, 0x854F, 0x532C, 0x8550, 0x532D, 0x8551, 0x532E, 0xD8D1,\t0x532F, 0x8552, 0x5330, 0x8553, 0x5331, 0x8554, 0x5332, 0x8555,\n\t0x5333, 0x8556, 0x5334, 0x8557, 0x5335, 0x8558, 0x5336, 0x8559,\t0x5337, 0x855A, 0x5338, 0x855B, 0x5339, 0xC6A5, 0x533A, 0xC7F8,\n\t0x533B, 0xD2BD, 0x533C, 0x855C, 0x533D, 0x855D, 0x533E, 0xD8D2,\t0x533F, 0xC4E4, 0x5340, 0x855E, 0x5341, 0xCAAE, 0x5342, 0x855F,\n\t0x5343, 0xC7A7, 0x5344, 0x8560, 0x5345, 0xD8A6, 0x5346, 0x8561,\t0x5347, 0xC9FD, 0x5348, 0xCEE7, 0x5349, 0xBBDC, 0x534A, 0xB0EB,\n\t0x534B, 0x8562, 0x534C, 0x8563, 0x534D, 0x8564, 0x534E, 0xBBAA,\t0x534F, 0xD0AD, 0x5350, 0x8565, 0x5351, 0xB1B0, 0x5352, 0xD7E4,\n\t0x5353, 0xD7BF, 0x5354, 0x8566, 0x5355, 0xB5A5, 0x5356, 0xC2F4,\t0x5357, 0xC4CF, 0x5358, 0x8567, 0x5359, 0x8568, 0x535A, 0xB2A9,\n\t0x535B, 0x8569, 0x535C, 0xB2B7, 0x535D, 0x856A, 0x535E, 0xB1E5,\t0x535F, 0xDFB2, 0x5360, 0xD5BC, 0x5361, 0xBFA8, 0x5362, 0xC2AC,\n\t0x5363, 0xD8D5, 0x5364, 0xC2B1, 0x5365, 0x856B, 0x5366, 0xD8D4,\t0x5367, 0xCED4, 0x5368, 0x856C, 0x5369, 0xDAE0, 0x536A, 0x856D,\n\t0x536B, 0xCEC0, 0x536C, 0x856E, 0x536D, 0x856F, 0x536E, 0xD8B4,\t0x536F, 0xC3AE, 0x5370, 0xD3A1, 0x5371, 0xCEA3, 0x5372, 0x8570,\n\t0x5373, 0xBCB4, 0x5374, 0xC8B4, 0x5375, 0xC2D1, 0x5376, 0x8571,\t0x5377, 0xBEED, 0x5378, 0xD0B6, 0x5379, 0x8572, 0x537A, 0xDAE1,\n\t0x537B, 0x8573, 0x537C, 0x8574, 0x537D, 0x8575, 0x537E, 0x8576,\t0x537F, 0xC7E4, 0x5380, 0x8577, 0x5381, 0x8578, 0x5382, 0xB3A7,\n\t0x5383, 0x8579, 0x5384, 0xB6F2, 0x5385, 0xCCFC, 0x5386, 0xC0FA,\t0x5387, 0x857A, 0x5388, 0x857B, 0x5389, 0xC0F7, 0x538A, 0x857C,\n\t0x538B, 0xD1B9, 0x538C, 0xD1E1, 0x538D, 0xD8C7, 0x538E, 0x857D,\t0x538F, 0x857E, 0x5390, 0x8580, 0x5391, 0x8581, 0x5392, 0x8582,\n\t0x5393, 0x8583, 0x5394, 0x8584, 0x5395, 0xB2DE, 0x5396, 0x8585,\t0x5397, 0x8586, 0x5398, 0xC0E5, 0x5399, 0x8587, 0x539A, 0xBAF1,\n\t0x539B, 0x8588, 0x539C, 0x8589, 0x539D, 0xD8C8, 0x539E, 0x858A,\t0x539F, 0xD4AD, 0x53A0, 0x858B, 0x53A1, 0x858C, 0x53A2, 0xCFE1,\n\t0x53A3, 0xD8C9, 0x53A4, 0x858D, 0x53A5, 0xD8CA, 0x53A6, 0xCFC3,\t0x53A7, 0x858E, 0x53A8, 0xB3F8, 0x53A9, 0xBEC7, 0x53AA, 0x858F,\n\t0x53AB, 0x8590, 0x53AC, 0x8591, 0x53AD, 0x8592, 0x53AE, 0xD8CB,\t0x53AF, 0x8593, 0x53B0, 0x8594, 0x53B1, 0x8595, 0x53B2, 0x8596,\n\t0x53B3, 0x8597, 0x53B4, 0x8598, 0x53B5, 0x8599, 0x53B6, 0xDBCC,\t0x53B7, 0x859A, 0x53B8, 0x859B, 0x53B9, 0x859C, 0x53BA, 0x859D,\n\t0x53BB, 0xC8A5, 0x53BC, 0x859E, 0x53BD, 0x859F, 0x53BE, 0x85A0,\t0x53BF, 0xCFD8, 0x53C0, 0x85A1, 0x53C1, 0xC8FE, 0x53C2, 0xB2CE,\n\t0x53C3, 0x85A2, 0x53C4, 0x85A3, 0x53C5, 0x85A4, 0x53C6, 0x85A5,\t0x53C7, 0x85A6, 0x53C8, 0xD3D6, 0x53C9, 0xB2E6, 0x53CA, 0xBCB0,\n\t0x53CB, 0xD3D1, 0x53CC, 0xCBAB, 0x53CD, 0xB7B4, 0x53CE, 0x85A7,\t0x53CF, 0x85A8, 0x53D0, 0x85A9, 0x53D1, 0xB7A2, 0x53D2, 0x85AA,\n\t0x53D3, 0x85AB, 0x53D4, 0xCAE5, 0x53D5, 0x85AC, 0x53D6, 0xC8A1,\t0x53D7, 0xCADC, 0x53D8, 0xB1E4, 0x53D9, 0xD0F0, 0x53DA, 0x85AD,\n\t0x53DB, 0xC5D1, 0x53DC, 0x85AE, 0x53DD, 0x85AF, 0x53DE, 0x85B0,\t0x53DF, 0xDBC5, 0x53E0, 0xB5FE, 0x53E1, 0x85B1, 0x53E2, 0x85B2,\n\t0x53E3, 0xBFDA, 0x53E4, 0xB9C5, 0x53E5, 0xBEE4, 0x53E6, 0xC1ED,\t0x53E7, 0x85B3, 0x53E8, 0xDFB6, 0x53E9, 0xDFB5, 0x53EA, 0xD6BB,\n\t0x53EB, 0xBDD0, 0x53EC, 0xD5D9, 0x53ED, 0xB0C8, 0x53EE, 0xB6A3,\t0x53EF, 0xBFC9, 0x53F0, 0xCCA8, 0x53F1, 0xDFB3, 0x53F2, 0xCAB7,\n\t0x53F3, 0xD3D2, 0x53F4, 0x85B4, 0x53F5, 0xD8CF, 0x53F6, 0xD2B6,\t0x53F7, 0xBAC5, 0x53F8, 0xCBBE, 0x53F9, 0xCCBE, 0x53FA, 0x85B5,\n\t0x53FB, 0xDFB7, 0x53FC, 0xB5F0, 0x53FD, 0xDFB4, 0x53FE, 0x85B6,\t0x53FF, 0x85B7, 0x5400, 0x85B8, 0x5401, 0xD3F5, 0x5402, 0x85B9,\n\t0x5403, 0xB3D4, 0x5404, 0xB8F7, 0x5405, 0x85BA, 0x5406, 0xDFBA,\t0x5407, 0x85BB, 0x5408, 0xBACF, 0x5409, 0xBCAA, 0x540A, 0xB5F5,\n\t0x540B, 0x85BC, 0x540C, 0xCDAC, 0x540D, 0xC3FB, 0x540E, 0xBAF3,\t0x540F, 0xC0F4, 0x5410, 0xCDC2, 0x5411, 0xCFF2, 0x5412, 0xDFB8,\n\t0x5413, 0xCFC5, 0x5414, 0x85BD, 0x5415, 0xC2C0, 0x5416, 0xDFB9,\t0x5417, 0xC2F0, 0x5418, 0x85BE, 0x5419, 0x85BF, 0x541A, 0x85C0,\n\t0x541B, 0xBEFD, 0x541C, 0x85C1, 0x541D, 0xC1DF, 0x541E, 0xCDCC,\t0x541F, 0xD2F7, 0x5420, 0xB7CD, 0x5421, 0xDFC1, 0x5422, 0x85C2,\n\t0x5423, 0xDFC4, 0x5424, 0x85C3, 0x5425, 0x85C4, 0x5426, 0xB7F1,\t0x5427, 0xB0C9, 0x5428, 0xB6D6, 0x5429, 0xB7D4, 0x542A, 0x85C5,\n\t0x542B, 0xBAAC, 0x542C, 0xCCFD, 0x542D, 0xBFD4, 0x542E, 0xCBB1,\t0x542F, 0xC6F4, 0x5430, 0x85C6, 0x5431, 0xD6A8, 0x5432, 0xDFC5,\n\t0x5433, 0x85C7, 0x5434, 0xCEE2, 0x5435, 0xB3B3, 0x5436, 0x85C8,\t0x5437, 0x85C9, 0x5438, 0xCEFC, 0x5439, 0xB4B5, 0x543A, 0x85CA,\n\t0x543B, 0xCEC7, 0x543C, 0xBAF0, 0x543D, 0x85CB, 0x543E, 0xCEE1,\t0x543F, 0x85CC, 0x5440, 0xD1BD, 0x5441, 0x85CD, 0x5442, 0x85CE,\n\t0x5443, 0xDFC0, 0x5444, 0x85CF, 0x5445, 0x85D0, 0x5446, 0xB4F4,\t0x5447, 0x85D1, 0x5448, 0xB3CA, 0x5449, 0x85D2, 0x544A, 0xB8E6,\n\t0x544B, 0xDFBB, 0x544C, 0x85D3, 0x544D, 0x85D4, 0x544E, 0x85D5,\t0x544F, 0x85D6, 0x5450, 0xC4C5, 0x5451, 0x85D7, 0x5452, 0xDFBC,\n\t0x5453, 0xDFBD, 0x5454, 0xDFBE, 0x5455, 0xC5BB, 0x5456, 0xDFBF,\t0x5457, 0xDFC2, 0x5458, 0xD4B1, 0x5459, 0xDFC3, 0x545A, 0x85D8,\n\t0x545B, 0xC7BA, 0x545C, 0xCED8, 0x545D, 0x85D9, 0x545E, 0x85DA,\t0x545F, 0x85DB, 0x5460, 0x85DC, 0x5461, 0x85DD, 0x5462, 0xC4D8,\n\t0x5463, 0x85DE, 0x5464, 0xDFCA, 0x5465, 0x85DF, 0x5466, 0xDFCF,\t0x5467, 0x85E0, 0x5468, 0xD6DC, 0x5469, 0x85E1, 0x546A, 0x85E2,\n\t0x546B, 0x85E3, 0x546C, 0x85E4, 0x546D, 0x85E5, 0x546E, 0x85E6,\t0x546F, 0x85E7, 0x5470, 0x85E8, 0x5471, 0xDFC9, 0x5472, 0xDFDA,\n\t0x5473, 0xCEB6, 0x5474, 0x85E9, 0x5475, 0xBAC7, 0x5476, 0xDFCE,\t0x5477, 0xDFC8, 0x5478, 0xC5DE, 0x5479, 0x85EA, 0x547A, 0x85EB,\n\t0x547B, 0xC9EB, 0x547C, 0xBAF4, 0x547D, 0xC3FC, 0x547E, 0x85EC,\t0x547F, 0x85ED, 0x5480, 0xBED7, 0x5481, 0x85EE, 0x5482, 0xDFC6,\n\t0x5483, 0x85EF, 0x5484, 0xDFCD, 0x5485, 0x85F0, 0x5486, 0xC5D8,\t0x5487, 0x85F1, 0x5488, 0x85F2, 0x5489, 0x85F3, 0x548A, 0x85F4,\n\t0x548B, 0xD5A6, 0x548C, 0xBACD, 0x548D, 0x85F5, 0x548E, 0xBECC,\t0x548F, 0xD3BD, 0x5490, 0xB8C0, 0x5491, 0x85F6, 0x5492, 0xD6E4,\n\t0x5493, 0x85F7, 0x5494, 0xDFC7, 0x5495, 0xB9BE, 0x5496, 0xBFA7,\t0x5497, 0x85F8, 0x5498, 0x85F9, 0x5499, 0xC1FC, 0x549A, 0xDFCB,\n\t0x549B, 0xDFCC, 0x549C, 0x85FA, 0x549D, 0xDFD0, 0x549E, 0x85FB,\t0x549F, 0x85FC, 0x54A0, 0x85FD, 0x54A1, 0x85FE, 0x54A2, 0x8640,\n\t0x54A3, 0xDFDB, 0x54A4, 0xDFE5, 0x54A5, 0x8641, 0x54A6, 0xDFD7,\t0x54A7, 0xDFD6, 0x54A8, 0xD7C9, 0x54A9, 0xDFE3, 0x54AA, 0xDFE4,\n\t0x54AB, 0xE5EB, 0x54AC, 0xD2A7, 0x54AD, 0xDFD2, 0x54AE, 0x8642,\t0x54AF, 0xBFA9, 0x54B0, 0x8643, 0x54B1, 0xD4DB, 0x54B2, 0x8644,\n\t0x54B3, 0xBFC8, 0x54B4, 0xDFD4, 0x54B5, 0x8645, 0x54B6, 0x8646,\t0x54B7, 0x8647, 0x54B8, 0xCFCC, 0x54B9, 0x8648, 0x54BA, 0x8649,\n\t0x54BB, 0xDFDD, 0x54BC, 0x864A, 0x54BD, 0xD1CA, 0x54BE, 0x864B,\t0x54BF, 0xDFDE, 0x54C0, 0xB0A7, 0x54C1, 0xC6B7, 0x54C2, 0xDFD3,\n\t0x54C3, 0x864C, 0x54C4, 0xBAE5, 0x54C5, 0x864D, 0x54C6, 0xB6DF,\t0x54C7, 0xCDDB, 0x54C8, 0xB9FE, 0x54C9, 0xD4D5, 0x54CA, 0x864E,\n\t0x54CB, 0x864F, 0x54CC, 0xDFDF, 0x54CD, 0xCFEC, 0x54CE, 0xB0A5,\t0x54CF, 0xDFE7, 0x54D0, 0xDFD1, 0x54D1, 0xD1C6, 0x54D2, 0xDFD5,\n\t0x54D3, 0xDFD8, 0x54D4, 0xDFD9, 0x54D5, 0xDFDC, 0x54D6, 0x8650,\t0x54D7, 0xBBA9, 0x54D8, 0x8651, 0x54D9, 0xDFE0, 0x54DA, 0xDFE1,\n\t0x54DB, 0x8652, 0x54DC, 0xDFE2, 0x54DD, 0xDFE6, 0x54DE, 0xDFE8,\t0x54DF, 0xD3B4, 0x54E0, 0x8653, 0x54E1, 0x8654, 0x54E2, 0x8655,\n\t0x54E3, 0x8656, 0x54E4, 0x8657, 0x54E5, 0xB8E7, 0x54E6, 0xC5B6,\t0x54E7, 0xDFEA, 0x54E8, 0xC9DA, 0x54E9, 0xC1A8, 0x54EA, 0xC4C4,\n\t0x54EB, 0x8658, 0x54EC, 0x8659, 0x54ED, 0xBFDE, 0x54EE, 0xCFF8,\t0x54EF, 0x865A, 0x54F0, 0x865B, 0x54F1, 0x865C, 0x54F2, 0xD5DC,\n\t0x54F3, 0xDFEE, 0x54F4, 0x865D, 0x54F5, 0x865E, 0x54F6, 0x865F,\t0x54F7, 0x8660, 0x54F8, 0x8661, 0x54F9, 0x8662, 0x54FA, 0xB2B8,\n\t0x54FB, 0x8663, 0x54FC, 0xBADF, 0x54FD, 0xDFEC, 0x54FE, 0x8664,\t0x54FF, 0xDBC1, 0x5500, 0x8665, 0x5501, 0xD1E4, 0x5502, 0x8666,\n\t0x5503, 0x8667, 0x5504, 0x8668, 0x5505, 0x8669, 0x5506, 0xCBF4,\t0x5507, 0xB4BD, 0x5508, 0x866A, 0x5509, 0xB0A6, 0x550A, 0x866B,\n\t0x550B, 0x866C, 0x550C, 0x866D, 0x550D, 0x866E, 0x550E, 0x866F,\t0x550F, 0xDFF1, 0x5510, 0xCCC6, 0x5511, 0xDFF2, 0x5512, 0x8670,\n\t0x5513, 0x8671, 0x5514, 0xDFED, 0x5515, 0x8672, 0x5516, 0x8673,\t0x5517, 0x8674, 0x5518, 0x8675, 0x5519, 0x8676, 0x551A, 0x8677,\n\t0x551B, 0xDFE9, 0x551C, 0x8678, 0x551D, 0x8679, 0x551E, 0x867A,\t0x551F, 0x867B, 0x5520, 0xDFEB, 0x5521, 0x867C, 0x5522, 0xDFEF,\n\t0x5523, 0xDFF0, 0x5524, 0xBBBD, 0x5525, 0x867D, 0x5526, 0x867E,\t0x5527, 0xDFF3, 0x5528, 0x8680, 0x5529, 0x8681, 0x552A, 0xDFF4,\n\t0x552B, 0x8682, 0x552C, 0xBBA3, 0x552D, 0x8683, 0x552E, 0xCADB,\t0x552F, 0xCEA8, 0x5530, 0xE0A7, 0x5531, 0xB3AA, 0x5532, 0x8684,\n\t0x5533, 0xE0A6, 0x5534, 0x8685, 0x5535, 0x8686, 0x5536, 0x8687,\t0x5537, 0xE0A1, 0x5538, 0x8688, 0x5539, 0x8689, 0x553A, 0x868A,\n\t0x553B, 0x868B, 0x553C, 0xDFFE, 0x553D, 0x868C, 0x553E, 0xCDD9,\t0x553F, 0xDFFC, 0x5540, 0x868D, 0x5541, 0xDFFA, 0x5542, 0x868E,\n\t0x5543, 0xBFD0, 0x5544, 0xD7C4, 0x5545, 0x868F, 0x5546, 0xC9CC,\t0x5547, 0x8690, 0x5548, 0x8691, 0x5549, 0xDFF8, 0x554A, 0xB0A1,\n\t0x554B, 0x8692, 0x554C, 0x8693, 0x554D, 0x8694, 0x554E, 0x8695,\t0x554F, 0x8696, 0x5550, 0xDFFD, 0x5551, 0x8697, 0x5552, 0x8698,\n\t0x5553, 0x8699, 0x5554, 0x869A, 0x5555, 0xDFFB, 0x5556, 0xE0A2,\t0x5557, 0x869B, 0x5558, 0x869C, 0x5559, 0x869D, 0x555A, 0x869E,\n\t0x555B, 0x869F, 0x555C, 0xE0A8, 0x555D, 0x86A0, 0x555E, 0x86A1,\t0x555F, 0x86A2, 0x5560, 0x86A3, 0x5561, 0xB7C8, 0x5562, 0x86A4,\n\t0x5563, 0x86A5, 0x5564, 0xC6A1, 0x5565, 0xC9B6, 0x5566, 0xC0B2,\t0x5567, 0xDFF5, 0x5568, 0x86A6, 0x5569, 0x86A7, 0x556A, 0xC5BE,\n\t0x556B, 0x86A8, 0x556C, 0xD8C4, 0x556D, 0xDFF9, 0x556E, 0xC4F6,\t0x556F, 0x86A9, 0x5570, 0x86AA, 0x5571, 0x86AB, 0x5572, 0x86AC,\n\t0x5573, 0x86AD, 0x5574, 0x86AE, 0x5575, 0xE0A3, 0x5576, 0xE0A4,\t0x5577, 0xE0A5, 0x5578, 0xD0A5, 0x5579, 0x86AF, 0x557A, 0x86B0,\n\t0x557B, 0xE0B4, 0x557C, 0xCCE4, 0x557D, 0x86B1, 0x557E, 0xE0B1,\t0x557F, 0x86B2, 0x5580, 0xBFA6, 0x5581, 0xE0AF, 0x5582, 0xCEB9,\n\t0x5583, 0xE0AB, 0x5584, 0xC9C6, 0x5585, 0x86B3, 0x5586, 0x86B4,\t0x5587, 0xC0AE, 0x5588, 0xE0AE, 0x5589, 0xBAED, 0x558A, 0xBAB0,\n\t0x558B, 0xE0A9, 0x558C, 0x86B5, 0x558D, 0x86B6, 0x558E, 0x86B7,\t0x558F, 0xDFF6, 0x5590, 0x86B8, 0x5591, 0xE0B3, 0x5592, 0x86B9,\n\t0x5593, 0x86BA, 0x5594, 0xE0B8, 0x5595, 0x86BB, 0x5596, 0x86BC,\t0x5597, 0x86BD, 0x5598, 0xB4AD, 0x5599, 0xE0B9, 0x559A, 0x86BE,\n\t0x559B, 0x86BF, 0x559C, 0xCFB2, 0x559D, 0xBAC8, 0x559E, 0x86C0,\t0x559F, 0xE0B0, 0x55A0, 0x86C1, 0x55A1, 0x86C2, 0x55A2, 0x86C3,\n\t0x55A3, 0x86C4, 0x55A4, 0x86C5, 0x55A5, 0x86C6, 0x55A6, 0x86C7,\t0x55A7, 0xD0FA, 0x55A8, 0x86C8, 0x55A9, 0x86C9, 0x55AA, 0x86CA,\n\t0x55AB, 0x86CB, 0x55AC, 0x86CC, 0x55AD, 0x86CD, 0x55AE, 0x86CE,\t0x55AF, 0x86CF, 0x55B0, 0x86D0, 0x55B1, 0xE0AC, 0x55B2, 0x86D1,\n\t0x55B3, 0xD4FB, 0x55B4, 0x86D2, 0x55B5, 0xDFF7, 0x55B6, 0x86D3,\t0x55B7, 0xC5E7, 0x55B8, 0x86D4, 0x55B9, 0xE0AD, 0x55BA, 0x86D5,\n\t0x55BB, 0xD3F7, 0x55BC, 0x86D6, 0x55BD, 0xE0B6, 0x55BE, 0xE0B7,\t0x55BF, 0x86D7, 0x55C0, 0x86D8, 0x55C1, 0x86D9, 0x55C2, 0x86DA,\n\t0x55C3, 0x86DB, 0x55C4, 0xE0C4, 0x55C5, 0xD0E1, 0x55C6, 0x86DC,\t0x55C7, 0x86DD, 0x55C8, 0x86DE, 0x55C9, 0xE0BC, 0x55CA, 0x86DF,\n\t0x55CB, 0x86E0, 0x55CC, 0xE0C9, 0x55CD, 0xE0CA, 0x55CE, 0x86E1,\t0x55CF, 0x86E2, 0x55D0, 0x86E3, 0x55D1, 0xE0BE, 0x55D2, 0xE0AA,\n\t0x55D3, 0xC9A4, 0x55D4, 0xE0C1, 0x55D5, 0x86E4, 0x55D6, 0xE0B2,\t0x55D7, 0x86E5, 0x55D8, 0x86E6, 0x55D9, 0x86E7, 0x55DA, 0x86E8,\n\t0x55DB, 0x86E9, 0x55DC, 0xCAC8, 0x55DD, 0xE0C3, 0x55DE, 0x86EA,\t0x55DF, 0xE0B5, 0x55E0, 0x86EB, 0x55E1, 0xCECB, 0x55E2, 0x86EC,\n\t0x55E3, 0xCBC3, 0x55E4, 0xE0CD, 0x55E5, 0xE0C6, 0x55E6, 0xE0C2,\t0x55E7, 0x86ED, 0x55E8, 0xE0CB, 0x55E9, 0x86EE, 0x55EA, 0xE0BA,\n\t0x55EB, 0xE0BF, 0x55EC, 0xE0C0, 0x55ED, 0x86EF, 0x55EE, 0x86F0,\t0x55EF, 0xE0C5, 0x55F0, 0x86F1, 0x55F1, 0x86F2, 0x55F2, 0xE0C7,\n\t0x55F3, 0xE0C8, 0x55F4, 0x86F3, 0x55F5, 0xE0CC, 0x55F6, 0x86F4,\t0x55F7, 0xE0BB, 0x55F8, 0x86F5, 0x55F9, 0x86F6, 0x55FA, 0x86F7,\n\t0x55FB, 0x86F8, 0x55FC, 0x86F9, 0x55FD, 0xCBD4, 0x55FE, 0xE0D5,\t0x55FF, 0x86FA, 0x5600, 0xE0D6, 0x5601, 0xE0D2, 0x5602, 0x86FB,\n\t0x5603, 0x86FC, 0x5604, 0x86FD, 0x5605, 0x86FE, 0x5606, 0x8740,\t0x5607, 0x8741, 0x5608, 0xE0D0, 0x5609, 0xBCCE, 0x560A, 0x8742,\n\t0x560B, 0x8743, 0x560C, 0xE0D1, 0x560D, 0x8744, 0x560E, 0xB8C2,\t0x560F, 0xD8C5, 0x5610, 0x8745, 0x5611, 0x8746, 0x5612, 0x8747,\n\t0x5613, 0x8748, 0x5614, 0x8749, 0x5615, 0x874A, 0x5616, 0x874B,\t0x5617, 0x874C, 0x5618, 0xD0EA, 0x5619, 0x874D, 0x561A, 0x874E,\n\t0x561B, 0xC2EF, 0x561C, 0x874F, 0x561D, 0x8750, 0x561E, 0xE0CF,\t0x561F, 0xE0BD, 0x5620, 0x8751, 0x5621, 0x8752, 0x5622, 0x8753,\n\t0x5623, 0xE0D4, 0x5624, 0xE0D3, 0x5625, 0x8754, 0x5626, 0x8755,\t0x5627, 0xE0D7, 0x5628, 0x8756, 0x5629, 0x8757, 0x562A, 0x8758,\n\t0x562B, 0x8759, 0x562C, 0xE0DC, 0x562D, 0xE0D8, 0x562E, 0x875A,\t0x562F, 0x875B, 0x5630, 0x875C, 0x5631, 0xD6F6, 0x5632, 0xB3B0,\n\t0x5633, 0x875D, 0x5634, 0xD7EC, 0x5635, 0x875E, 0x5636, 0xCBBB,\t0x5637, 0x875F, 0x5638, 0x8760, 0x5639, 0xE0DA, 0x563A, 0x8761,\n\t0x563B, 0xCEFB, 0x563C, 0x8762, 0x563D, 0x8763, 0x563E, 0x8764,\t0x563F, 0xBAD9, 0x5640, 0x8765, 0x5641, 0x8766, 0x5642, 0x8767,\n\t0x5643, 0x8768, 0x5644, 0x8769, 0x5645, 0x876A, 0x5646, 0x876B,\t0x5647, 0x876C, 0x5648, 0x876D, 0x5649, 0x876E, 0x564A, 0x876F,\n\t0x564B, 0x8770, 0x564C, 0xE0E1, 0x564D, 0xE0DD, 0x564E, 0xD2AD,\t0x564F, 0x8771, 0x5650, 0x8772, 0x5651, 0x8773, 0x5652, 0x8774,\n\t0x5653, 0x8775, 0x5654, 0xE0E2, 0x5655, 0x8776, 0x5656, 0x8777,\t0x5657, 0xE0DB, 0x5658, 0xE0D9, 0x5659, 0xE0DF, 0x565A, 0x8778,\n\t0x565B, 0x8779, 0x565C, 0xE0E0, 0x565D, 0x877A, 0x565E, 0x877B,\t0x565F, 0x877C, 0x5660, 0x877D, 0x5661, 0x877E, 0x5662, 0xE0DE,\n\t0x5663, 0x8780, 0x5664, 0xE0E4, 0x5665, 0x8781, 0x5666, 0x8782,\t0x5667, 0x8783, 0x5668, 0xC6F7, 0x5669, 0xD8AC, 0x566A, 0xD4EB,\n\t0x566B, 0xE0E6, 0x566C, 0xCAC9, 0x566D, 0x8784, 0x566E, 0x8785,\t0x566F, 0x8786, 0x5670, 0x8787, 0x5671, 0xE0E5, 0x5672, 0x8788,\n\t0x5673, 0x8789, 0x5674, 0x878A, 0x5675, 0x878B, 0x5676, 0xB8C1,\t0x5677, 0x878C, 0x5678, 0x878D, 0x5679, 0x878E, 0x567A, 0x878F,\n\t0x567B, 0xE0E7, 0x567C, 0xE0E8, 0x567D, 0x8790, 0x567E, 0x8791,\t0x567F, 0x8792, 0x5680, 0x8793, 0x5681, 0x8794, 0x5682, 0x8795,\n\t0x5683, 0x8796, 0x5684, 0x8797, 0x5685, 0xE0E9, 0x5686, 0xE0E3,\t0x5687, 0x8798, 0x5688, 0x8799, 0x5689, 0x879A, 0x568A, 0x879B,\n\t0x568B, 0x879C, 0x568C, 0x879D, 0x568D, 0x879E, 0x568E, 0xBABF,\t0x568F, 0xCCE7, 0x5690, 0x879F, 0x5691, 0x87A0, 0x5692, 0x87A1,\n\t0x5693, 0xE0EA, 0x5694, 0x87A2, 0x5695, 0x87A3, 0x5696, 0x87A4,\t0x5697, 0x87A5, 0x5698, 0x87A6, 0x5699, 0x87A7, 0x569A, 0x87A8,\n\t0x569B, 0x87A9, 0x569C, 0x87AA, 0x569D, 0x87AB, 0x569E, 0x87AC,\t0x569F, 0x87AD, 0x56A0, 0x87AE, 0x56A1, 0x87AF, 0x56A2, 0x87B0,\n\t0x56A3, 0xCFF9, 0x56A4, 0x87B1, 0x56A5, 0x87B2, 0x56A6, 0x87B3,\t0x56A7, 0x87B4, 0x56A8, 0x87B5, 0x56A9, 0x87B6, 0x56AA, 0x87B7,\n\t0x56AB, 0x87B8, 0x56AC, 0x87B9, 0x56AD, 0x87BA, 0x56AE, 0x87BB,\t0x56AF, 0xE0EB, 0x56B0, 0x87BC, 0x56B1, 0x87BD, 0x56B2, 0x87BE,\n\t0x56B3, 0x87BF, 0x56B4, 0x87C0, 0x56B5, 0x87C1, 0x56B6, 0x87C2,\t0x56B7, 0xC8C2, 0x56B8, 0x87C3, 0x56B9, 0x87C4, 0x56BA, 0x87C5,\n\t0x56BB, 0x87C6, 0x56BC, 0xBDC0, 0x56BD, 0x87C7, 0x56BE, 0x87C8,\t0x56BF, 0x87C9, 0x56C0, 0x87CA, 0x56C1, 0x87CB, 0x56C2, 0x87CC,\n\t0x56C3, 0x87CD, 0x56C4, 0x87CE, 0x56C5, 0x87CF, 0x56C6, 0x87D0,\t0x56C7, 0x87D1, 0x56C8, 0x87D2, 0x56C9, 0x87D3, 0x56CA, 0xC4D2,\n\t0x56CB, 0x87D4, 0x56CC, 0x87D5, 0x56CD, 0x87D6, 0x56CE, 0x87D7,\t0x56CF, 0x87D8, 0x56D0, 0x87D9, 0x56D1, 0x87DA, 0x56D2, 0x87DB,\n\t0x56D3, 0x87DC, 0x56D4, 0xE0EC, 0x56D5, 0x87DD, 0x56D6, 0x87DE,\t0x56D7, 0xE0ED, 0x56D8, 0x87DF, 0x56D9, 0x87E0, 0x56DA, 0xC7F4,\n\t0x56DB, 0xCBC4, 0x56DC, 0x87E1, 0x56DD, 0xE0EE, 0x56DE, 0xBBD8,\t0x56DF, 0xD8B6, 0x56E0, 0xD2F2, 0x56E1, 0xE0EF, 0x56E2, 0xCDC5,\n\t0x56E3, 0x87E2, 0x56E4, 0xB6DA, 0x56E5, 0x87E3, 0x56E6, 0x87E4,\t0x56E7, 0x87E5, 0x56E8, 0x87E6, 0x56E9, 0x87E7, 0x56EA, 0x87E8,\n\t0x56EB, 0xE0F1, 0x56EC, 0x87E9, 0x56ED, 0xD4B0, 0x56EE, 0x87EA,\t0x56EF, 0x87EB, 0x56F0, 0xC0A7, 0x56F1, 0xB4D1, 0x56F2, 0x87EC,\n\t0x56F3, 0x87ED, 0x56F4, 0xCEA7, 0x56F5, 0xE0F0, 0x56F6, 0x87EE,\t0x56F7, 0x87EF, 0x56F8, 0x87F0, 0x56F9, 0xE0F2, 0x56FA, 0xB9CC,\n\t0x56FB, 0x87F1, 0x56FC, 0x87F2, 0x56FD, 0xB9FA, 0x56FE, 0xCDBC,\t0x56FF, 0xE0F3, 0x5700, 0x87F3, 0x5701, 0x87F4, 0x5702, 0x87F5,\n\t0x5703, 0xC6D4, 0x5704, 0xE0F4, 0x5705, 0x87F6, 0x5706, 0xD4B2,\t0x5707, 0x87F7, 0x5708, 0xC8A6, 0x5709, 0xE0F6, 0x570A, 0xE0F5,\n\t0x570B, 0x87F8, 0x570C, 0x87F9, 0x570D, 0x87FA, 0x570E, 0x87FB,\t0x570F, 0x87FC, 0x5710, 0x87FD, 0x5711, 0x87FE, 0x5712, 0x8840,\n\t0x5713, 0x8841, 0x5714, 0x8842, 0x5715, 0x8843, 0x5716, 0x8844,\t0x5717, 0x8845, 0x5718, 0x8846, 0x5719, 0x8847, 0x571A, 0x8848,\n\t0x571B, 0x8849, 0x571C, 0xE0F7, 0x571D, 0x884A, 0x571E, 0x884B,\t0x571F, 0xCDC1, 0x5720, 0x884C, 0x5721, 0x884D, 0x5722, 0x884E,\n\t0x5723, 0xCAA5, 0x5724, 0x884F, 0x5725, 0x8850, 0x5726, 0x8851,\t0x5727, 0x8852, 0x5728, 0xD4DA, 0x5729, 0xDBD7, 0x572A, 0xDBD9,\n\t0x572B, 0x8853, 0x572C, 0xDBD8, 0x572D, 0xB9E7, 0x572E, 0xDBDC,\t0x572F, 0xDBDD, 0x5730, 0xB5D8, 0x5731, 0x8854, 0x5732, 0x8855,\n\t0x5733, 0xDBDA, 0x5734, 0x8856, 0x5735, 0x8857, 0x5736, 0x8858,\t0x5737, 0x8859, 0x5738, 0x885A, 0x5739, 0xDBDB, 0x573A, 0xB3A1,\n\t0x573B, 0xDBDF, 0x573C, 0x885B, 0x573D, 0x885C, 0x573E, 0xBBF8,\t0x573F, 0x885D, 0x5740, 0xD6B7, 0x5741, 0x885E, 0x5742, 0xDBE0,\n\t0x5743, 0x885F, 0x5744, 0x8860, 0x5745, 0x8861, 0x5746, 0x8862,\t0x5747, 0xBEF9, 0x5748, 0x8863, 0x5749, 0x8864, 0x574A, 0xB7BB,\n\t0x574B, 0x8865, 0x574C, 0xDBD0, 0x574D, 0xCCAE, 0x574E, 0xBFB2,\t0x574F, 0xBBB5, 0x5750, 0xD7F8, 0x5751, 0xBFD3, 0x5752, 0x8866,\n\t0x5753, 0x8867, 0x5754, 0x8868, 0x5755, 0x8869, 0x5756, 0x886A,\t0x5757, 0xBFE9, 0x5758, 0x886B, 0x5759, 0x886C, 0x575A, 0xBCE1,\n\t0x575B, 0xCCB3, 0x575C, 0xDBDE, 0x575D, 0xB0D3, 0x575E, 0xCEEB,\t0x575F, 0xB7D8, 0x5760, 0xD7B9, 0x5761, 0xC6C2, 0x5762, 0x886D,\n\t0x5763, 0x886E, 0x5764, 0xC0A4, 0x5765, 0x886F, 0x5766, 0xCCB9,\t0x5767, 0x8870, 0x5768, 0xDBE7, 0x5769, 0xDBE1, 0x576A, 0xC6BA,\n\t0x576B, 0xDBE3, 0x576C, 0x8871, 0x576D, 0xDBE8, 0x576E, 0x8872,\t0x576F, 0xC5F7, 0x5770, 0x8873, 0x5771, 0x8874, 0x5772, 0x8875,\n\t0x5773, 0xDBEA, 0x5774, 0x8876, 0x5775, 0x8877, 0x5776, 0xDBE9,\t0x5777, 0xBFC0, 0x5778, 0x8878, 0x5779, 0x8879, 0x577A, 0x887A,\n\t0x577B, 0xDBE6, 0x577C, 0xDBE5, 0x577D, 0x887B, 0x577E, 0x887C,\t0x577F, 0x887D, 0x5780, 0x887E, 0x5781, 0x8880, 0x5782, 0xB4B9,\n\t0x5783, 0xC0AC, 0x5784, 0xC2A2, 0x5785, 0xDBE2, 0x5786, 0xDBE4,\t0x5787, 0x8881, 0x5788, 0x8882, 0x5789, 0x8883, 0x578A, 0x8884,\n\t0x578B, 0xD0CD, 0x578C, 0xDBED, 0x578D, 0x8885, 0x578E, 0x8886,\t0x578F, 0x8887, 0x5790, 0x8888, 0x5791, 0x8889, 0x5792, 0xC0DD,\n\t0x5793, 0xDBF2, 0x5794, 0x888A, 0x5795, 0x888B, 0x5796, 0x888C,\t0x5797, 0x888D, 0x5798, 0x888E, 0x5799, 0x888F, 0x579A, 0x8890,\n\t0x579B, 0xB6E2, 0x579C, 0x8891, 0x579D, 0x8892, 0x579E, 0x8893,\t0x579F, 0x8894, 0x57A0, 0xDBF3, 0x57A1, 0xDBD2, 0x57A2, 0xB9B8,\n\t0x57A3, 0xD4AB, 0x57A4, 0xDBEC, 0x57A5, 0x8895, 0x57A6, 0xBFD1,\t0x57A7, 0xDBF0, 0x57A8, 0x8896, 0x57A9, 0xDBD1, 0x57AA, 0x8897,\n\t0x57AB, 0xB5E6, 0x57AC, 0x8898, 0x57AD, 0xDBEB, 0x57AE, 0xBFE5,\t0x57AF, 0x8899, 0x57B0, 0x889A, 0x57B1, 0x889B, 0x57B2, 0xDBEE,\n\t0x57B3, 0x889C, 0x57B4, 0xDBF1, 0x57B5, 0x889D, 0x57B6, 0x889E,\t0x57B7, 0x889F, 0x57B8, 0xDBF9, 0x57B9, 0x88A0, 0x57BA, 0x88A1,\n\t0x57BB, 0x88A2, 0x57BC, 0x88A3, 0x57BD, 0x88A4, 0x57BE, 0x88A5,\t0x57BF, 0x88A6, 0x57C0, 0x88A7, 0x57C1, 0x88A8, 0x57C2, 0xB9A1,\n\t0x57C3, 0xB0A3, 0x57C4, 0x88A9, 0x57C5, 0x88AA, 0x57C6, 0x88AB,\t0x57C7, 0x88AC, 0x57C8, 0x88AD, 0x57C9, 0x88AE, 0x57CA, 0x88AF,\n\t0x57CB, 0xC2F1, 0x57CC, 0x88B0, 0x57CD, 0x88B1, 0x57CE, 0xB3C7,\t0x57CF, 0xDBEF, 0x57D0, 0x88B2, 0x57D1, 0x88B3, 0x57D2, 0xDBF8,\n\t0x57D3, 0x88B4, 0x57D4, 0xC6D2, 0x57D5, 0xDBF4, 0x57D6, 0x88B5,\t0x57D7, 0x88B6, 0x57D8, 0xDBF5, 0x57D9, 0xDBF7, 0x57DA, 0xDBF6,\n\t0x57DB, 0x88B7, 0x57DC, 0x88B8, 0x57DD, 0xDBFE, 0x57DE, 0x88B9,\t0x57DF, 0xD3F2, 0x57E0, 0xB2BA, 0x57E1, 0x88BA, 0x57E2, 0x88BB,\n\t0x57E3, 0x88BC, 0x57E4, 0xDBFD, 0x57E5, 0x88BD, 0x57E6, 0x88BE,\t0x57E7, 0x88BF, 0x57E8, 0x88C0, 0x57E9, 0x88C1, 0x57EA, 0x88C2,\n\t0x57EB, 0x88C3, 0x57EC, 0x88C4, 0x57ED, 0xDCA4, 0x57EE, 0x88C5,\t0x57EF, 0xDBFB, 0x57F0, 0x88C6, 0x57F1, 0x88C7, 0x57F2, 0x88C8,\n\t0x57F3, 0x88C9, 0x57F4, 0xDBFA, 0x57F5, 0x88CA, 0x57F6, 0x88CB,\t0x57F7, 0x88CC, 0x57F8, 0xDBFC, 0x57F9, 0xC5E0, 0x57FA, 0xBBF9,\n\t0x57FB, 0x88CD, 0x57FC, 0x88CE, 0x57FD, 0xDCA3, 0x57FE, 0x88CF,\t0x57FF, 0x88D0, 0x5800, 0xDCA5, 0x5801, 0x88D1, 0x5802, 0xCCC3,\n\t0x5803, 0x88D2, 0x5804, 0x88D3, 0x5805, 0x88D4, 0x5806, 0xB6D1,\t0x5807, 0xDDC0, 0x5808, 0x88D5, 0x5809, 0x88D6, 0x580A, 0x88D7,\n\t0x580B, 0xDCA1, 0x580C, 0x88D8, 0x580D, 0xDCA2, 0x580E, 0x88D9,\t0x580F, 0x88DA, 0x5810, 0x88DB, 0x5811, 0xC7B5, 0x5812, 0x88DC,\n\t0x5813, 0x88DD, 0x5814, 0x88DE, 0x5815, 0xB6E9, 0x5816, 0x88DF,\t0x5817, 0x88E0, 0x5818, 0x88E1, 0x5819, 0xDCA7, 0x581A, 0x88E2,\n\t0x581B, 0x88E3, 0x581C, 0x88E4, 0x581D, 0x88E5, 0x581E, 0xDCA6,\t0x581F, 0x88E6, 0x5820, 0xDCA9, 0x5821, 0xB1A4, 0x5822, 0x88E7,\n\t0x5823, 0x88E8, 0x5824, 0xB5CC, 0x5825, 0x88E9, 0x5826, 0x88EA,\t0x5827, 0x88EB, 0x5828, 0x88EC, 0x5829, 0x88ED, 0x582A, 0xBFB0,\n\t0x582B, 0x88EE, 0x582C, 0x88EF, 0x582D, 0x88F0, 0x582E, 0x88F1,\t0x582F, 0x88F2, 0x5830, 0xD1DF, 0x5831, 0x88F3, 0x5832, 0x88F4,\n\t0x5833, 0x88F5, 0x5834, 0x88F6, 0x5835, 0xB6C2, 0x5836, 0x88F7,\t0x5837, 0x88F8, 0x5838, 0x88F9, 0x5839, 0x88FA, 0x583A, 0x88FB,\n\t0x583B, 0x88FC, 0x583C, 0x88FD, 0x583D, 0x88FE, 0x583E, 0x8940,\t0x583F, 0x8941, 0x5840, 0x8942, 0x5841, 0x8943, 0x5842, 0x8944,\n\t0x5843, 0x8945, 0x5844, 0xDCA8, 0x5845, 0x8946, 0x5846, 0x8947,\t0x5847, 0x8948, 0x5848, 0x8949, 0x5849, 0x894A, 0x584A, 0x894B,\n\t0x584B, 0x894C, 0x584C, 0xCBFA, 0x584D, 0xEBF3, 0x584E, 0x894D,\t0x584F, 0x894E, 0x5850, 0x894F, 0x5851, 0xCBDC, 0x5852, 0x8950,\n\t0x5853, 0x8951, 0x5854, 0xCBFE, 0x5855, 0x8952, 0x5856, 0x8953,\t0x5857, 0x8954, 0x5858, 0xCCC1, 0x5859, 0x8955, 0x585A, 0x8956,\n\t0x585B, 0x8957, 0x585C, 0x8958, 0x585D, 0x8959, 0x585E, 0xC8FB,\t0x585F, 0x895A, 0x5860, 0x895B, 0x5861, 0x895C, 0x5862, 0x895D,\n\t0x5863, 0x895E, 0x5864, 0x895F, 0x5865, 0xDCAA, 0x5866, 0x8960,\t0x5867, 0x8961, 0x5868, 0x8962, 0x5869, 0x8963, 0x586A, 0x8964,\n\t0x586B, 0xCCEE, 0x586C, 0xDCAB, 0x586D, 0x8965, 0x586E, 0x8966,\t0x586F, 0x8967, 0x5870, 0x8968, 0x5871, 0x8969, 0x5872, 0x896A,\n\t0x5873, 0x896B, 0x5874, 0x896C, 0x5875, 0x896D, 0x5876, 0x896E,\t0x5877, 0x896F, 0x5878, 0x8970, 0x5879, 0x8971, 0x587A, 0x8972,\n\t0x587B, 0x8973, 0x587C, 0x8974, 0x587D, 0x8975, 0x587E, 0xDBD3,\t0x587F, 0x8976, 0x5880, 0xDCAF, 0x5881, 0xDCAC, 0x5882, 0x8977,\n\t0x5883, 0xBEB3, 0x5884, 0x8978, 0x5885, 0xCAFB, 0x5886, 0x8979,\t0x5887, 0x897A, 0x5888, 0x897B, 0x5889, 0xDCAD, 0x588A, 0x897C,\n\t0x588B, 0x897D, 0x588C, 0x897E, 0x588D, 0x8980, 0x588E, 0x8981,\t0x588F, 0x8982, 0x5890, 0x8983, 0x5891, 0x8984, 0x5892, 0xC9CA,\n\t0x5893, 0xC4B9, 0x5894, 0x8985, 0x5895, 0x8986, 0x5896, 0x8987,\t0x5897, 0x8988, 0x5898, 0x8989, 0x5899, 0xC7BD, 0x589A, 0xDCAE,\n\t0x589B, 0x898A, 0x589C, 0x898B, 0x589D, 0x898C, 0x589E, 0xD4F6,\t0x589F, 0xD0E6, 0x58A0, 0x898D, 0x58A1, 0x898E, 0x58A2, 0x898F,\n\t0x58A3, 0x8990, 0x58A4, 0x8991, 0x58A5, 0x8992, 0x58A6, 0x8993,\t0x58A7, 0x8994, 0x58A8, 0xC4AB, 0x58A9, 0xB6D5, 0x58AA, 0x8995,\n\t0x58AB, 0x8996, 0x58AC, 0x8997, 0x58AD, 0x8998, 0x58AE, 0x8999,\t0x58AF, 0x899A, 0x58B0, 0x899B, 0x58B1, 0x899C, 0x58B2, 0x899D,\n\t0x58B3, 0x899E, 0x58B4, 0x899F, 0x58B5, 0x89A0, 0x58B6, 0x89A1,\t0x58B7, 0x89A2, 0x58B8, 0x89A3, 0x58B9, 0x89A4, 0x58BA, 0x89A5,\n\t0x58BB, 0x89A6, 0x58BC, 0xDBD4, 0x58BD, 0x89A7, 0x58BE, 0x89A8,\t0x58BF, 0x89A9, 0x58C0, 0x89AA, 0x58C1, 0xB1DA, 0x58C2, 0x89AB,\n\t0x58C3, 0x89AC, 0x58C4, 0x89AD, 0x58C5, 0xDBD5, 0x58C6, 0x89AE,\t0x58C7, 0x89AF, 0x58C8, 0x89B0, 0x58C9, 0x89B1, 0x58CA, 0x89B2,\n\t0x58CB, 0x89B3, 0x58CC, 0x89B4, 0x58CD, 0x89B5, 0x58CE, 0x89B6,\t0x58CF, 0x89B7, 0x58D0, 0x89B8, 0x58D1, 0xDBD6, 0x58D2, 0x89B9,\n\t0x58D3, 0x89BA, 0x58D4, 0x89BB, 0x58D5, 0xBABE, 0x58D6, 0x89BC,\t0x58D7, 0x89BD, 0x58D8, 0x89BE, 0x58D9, 0x89BF, 0x58DA, 0x89C0,\n\t0x58DB, 0x89C1, 0x58DC, 0x89C2, 0x58DD, 0x89C3, 0x58DE, 0x89C4,\t0x58DF, 0x89C5, 0x58E0, 0x89C6, 0x58E1, 0x89C7, 0x58E2, 0x89C8,\n\t0x58E3, 0x89C9, 0x58E4, 0xC8C0, 0x58E5, 0x89CA, 0x58E6, 0x89CB,\t0x58E7, 0x89CC, 0x58E8, 0x89CD, 0x58E9, 0x89CE, 0x58EA, 0x89CF,\n\t0x58EB, 0xCABF, 0x58EC, 0xC8C9, 0x58ED, 0x89D0, 0x58EE, 0xD7B3,\t0x58EF, 0x89D1, 0x58F0, 0xC9F9, 0x58F1, 0x89D2, 0x58F2, 0x89D3,\n\t0x58F3, 0xBFC7, 0x58F4, 0x89D4, 0x58F5, 0x89D5, 0x58F6, 0xBAF8,\t0x58F7, 0x89D6, 0x58F8, 0x89D7, 0x58F9, 0xD2BC, 0x58FA, 0x89D8,\n\t0x58FB, 0x89D9, 0x58FC, 0x89DA, 0x58FD, 0x89DB, 0x58FE, 0x89DC,\t0x58FF, 0x89DD, 0x5900, 0x89DE, 0x5901, 0x89DF, 0x5902, 0xE2BA,\n\t0x5903, 0x89E0, 0x5904, 0xB4A6, 0x5905, 0x89E1, 0x5906, 0x89E2,\t0x5907, 0xB1B8, 0x5908, 0x89E3, 0x5909, 0x89E4, 0x590A, 0x89E5,\n\t0x590B, 0x89E6, 0x590C, 0x89E7, 0x590D, 0xB8B4, 0x590E, 0x89E8,\t0x590F, 0xCFC4, 0x5910, 0x89E9, 0x5911, 0x89EA, 0x5912, 0x89EB,\n\t0x5913, 0x89EC, 0x5914, 0xD9E7, 0x5915, 0xCFA6, 0x5916, 0xCDE2,\t0x5917, 0x89ED, 0x5918, 0x89EE, 0x5919, 0xD9ED, 0x591A, 0xB6E0,\n\t0x591B, 0x89EF, 0x591C, 0xD2B9, 0x591D, 0x89F0, 0x591E, 0x89F1,\t0x591F, 0xB9BB, 0x5920, 0x89F2, 0x5921, 0x89F3, 0x5922, 0x89F4,\n\t0x5923, 0x89F5, 0x5924, 0xE2B9, 0x5925, 0xE2B7, 0x5926, 0x89F6,\t0x5927, 0xB4F3, 0x5928, 0x89F7, 0x5929, 0xCCEC, 0x592A, 0xCCAB,\n\t0x592B, 0xB7F2, 0x592C, 0x89F8, 0x592D, 0xD8B2, 0x592E, 0xD1EB,\t0x592F, 0xBABB, 0x5930, 0x89F9, 0x5931, 0xCAA7, 0x5932, 0x89FA,\n\t0x5933, 0x89FB, 0x5934, 0xCDB7, 0x5935, 0x89FC, 0x5936, 0x89FD,\t0x5937, 0xD2C4, 0x5938, 0xBFE4, 0x5939, 0xBCD0, 0x593A, 0xB6E1,\n\t0x593B, 0x89FE, 0x593C, 0xDEC5, 0x593D, 0x8A40, 0x593E, 0x8A41,\t0x593F, 0x8A42, 0x5940, 0x8A43, 0x5941, 0xDEC6, 0x5942, 0xDBBC,\n\t0x5943, 0x8A44, 0x5944, 0xD1D9, 0x5945, 0x8A45, 0x5946, 0x8A46,\t0x5947, 0xC6E6, 0x5948, 0xC4CE, 0x5949, 0xB7EE, 0x594A, 0x8A47,\n\t0x594B, 0xB7DC, 0x594C, 0x8A48, 0x594D, 0x8A49, 0x594E, 0xBFFC,\t0x594F, 0xD7E0, 0x5950, 0x8A4A, 0x5951, 0xC6F5, 0x5952, 0x8A4B,\n\t0x5953, 0x8A4C, 0x5954, 0xB1BC, 0x5955, 0xDEC8, 0x5956, 0xBDB1,\t0x5957, 0xCCD7, 0x5958, 0xDECA, 0x5959, 0x8A4D, 0x595A, 0xDEC9,\n\t0x595B, 0x8A4E, 0x595C, 0x8A4F, 0x595D, 0x8A50, 0x595E, 0x8A51,\t0x595F, 0x8A52, 0x5960, 0xB5EC, 0x5961, 0x8A53, 0x5962, 0xC9DD,\n\t0x5963, 0x8A54, 0x5964, 0x8A55, 0x5965, 0xB0C2, 0x5966, 0x8A56,\t0x5967, 0x8A57, 0x5968, 0x8A58, 0x5969, 0x8A59, 0x596A, 0x8A5A,\n\t0x596B, 0x8A5B, 0x596C, 0x8A5C, 0x596D, 0x8A5D, 0x596E, 0x8A5E,\t0x596F, 0x8A5F, 0x5970, 0x8A60, 0x5971, 0x8A61, 0x5972, 0x8A62,\n\t0x5973, 0xC5AE, 0x5974, 0xC5AB, 0x5975, 0x8A63, 0x5976, 0xC4CC,\t0x5977, 0x8A64, 0x5978, 0xBCE9, 0x5979, 0xCBFD, 0x597A, 0x8A65,\n\t0x597B, 0x8A66, 0x597C, 0x8A67, 0x597D, 0xBAC3, 0x597E, 0x8A68,\t0x597F, 0x8A69, 0x5980, 0x8A6A, 0x5981, 0xE5F9, 0x5982, 0xC8E7,\n\t0x5983, 0xE5FA, 0x5984, 0xCDFD, 0x5985, 0x8A6B, 0x5986, 0xD7B1,\t0x5987, 0xB8BE, 0x5988, 0xC2E8, 0x5989, 0x8A6C, 0x598A, 0xC8D1,\n\t0x598B, 0x8A6D, 0x598C, 0x8A6E, 0x598D, 0xE5FB, 0x598E, 0x8A6F,\t0x598F, 0x8A70, 0x5990, 0x8A71, 0x5991, 0x8A72, 0x5992, 0xB6CA,\n\t0x5993, 0xBCCB, 0x5994, 0x8A73, 0x5995, 0x8A74, 0x5996, 0xD1FD,\t0x5997, 0xE6A1, 0x5998, 0x8A75, 0x5999, 0xC3EE, 0x599A, 0x8A76,\n\t0x599B, 0x8A77, 0x599C, 0x8A78, 0x599D, 0x8A79, 0x599E, 0xE6A4,\t0x599F, 0x8A7A, 0x59A0, 0x8A7B, 0x59A1, 0x8A7C, 0x59A2, 0x8A7D,\n\t0x59A3, 0xE5FE, 0x59A4, 0xE6A5, 0x59A5, 0xCDD7, 0x59A6, 0x8A7E,\t0x59A7, 0x8A80, 0x59A8, 0xB7C1, 0x59A9, 0xE5FC, 0x59AA, 0xE5FD,\n\t0x59AB, 0xE6A3, 0x59AC, 0x8A81, 0x59AD, 0x8A82, 0x59AE, 0xC4DD,\t0x59AF, 0xE6A8, 0x59B0, 0x8A83, 0x59B1, 0x8A84, 0x59B2, 0xE6A7,\n\t0x59B3, 0x8A85, 0x59B4, 0x8A86, 0x59B5, 0x8A87, 0x59B6, 0x8A88,\t0x59B7, 0x8A89, 0x59B8, 0x8A8A, 0x59B9, 0xC3C3, 0x59BA, 0x8A8B,\n\t0x59BB, 0xC6DE, 0x59BC, 0x8A8C, 0x59BD, 0x8A8D, 0x59BE, 0xE6AA,\t0x59BF, 0x8A8E, 0x59C0, 0x8A8F, 0x59C1, 0x8A90, 0x59C2, 0x8A91,\n\t0x59C3, 0x8A92, 0x59C4, 0x8A93, 0x59C5, 0x8A94, 0x59C6, 0xC4B7,\t0x59C7, 0x8A95, 0x59C8, 0x8A96, 0x59C9, 0x8A97, 0x59CA, 0xE6A2,\n\t0x59CB, 0xCABC, 0x59CC, 0x8A98, 0x59CD, 0x8A99, 0x59CE, 0x8A9A,\t0x59CF, 0x8A9B, 0x59D0, 0xBDE3, 0x59D1, 0xB9C3, 0x59D2, 0xE6A6,\n\t0x59D3, 0xD0D5, 0x59D4, 0xCEAF, 0x59D5, 0x8A9C, 0x59D6, 0x8A9D,\t0x59D7, 0xE6A9, 0x59D8, 0xE6B0, 0x59D9, 0x8A9E, 0x59DA, 0xD2A6,\n\t0x59DB, 0x8A9F, 0x59DC, 0xBDAA, 0x59DD, 0xE6AD, 0x59DE, 0x8AA0,\t0x59DF, 0x8AA1, 0x59E0, 0x8AA2, 0x59E1, 0x8AA3, 0x59E2, 0x8AA4,\n\t0x59E3, 0xE6AF, 0x59E4, 0x8AA5, 0x59E5, 0xC0D1, 0x59E6, 0x8AA6,\t0x59E7, 0x8AA7, 0x59E8, 0xD2CC, 0x59E9, 0x8AA8, 0x59EA, 0x8AA9,\n\t0x59EB, 0x8AAA, 0x59EC, 0xBCA7, 0x59ED, 0x8AAB, 0x59EE, 0x8AAC,\t0x59EF, 0x8AAD, 0x59F0, 0x8AAE, 0x59F1, 0x8AAF, 0x59F2, 0x8AB0,\n\t0x59F3, 0x8AB1, 0x59F4, 0x8AB2, 0x59F5, 0x8AB3, 0x59F6, 0x8AB4,\t0x59F7, 0x8AB5, 0x59F8, 0x8AB6, 0x59F9, 0xE6B1, 0x59FA, 0x8AB7,\n\t0x59FB, 0xD2F6, 0x59FC, 0x8AB8, 0x59FD, 0x8AB9, 0x59FE, 0x8ABA,\t0x59FF, 0xD7CB, 0x5A00, 0x8ABB, 0x5A01, 0xCDFE, 0x5A02, 0x8ABC,\n\t0x5A03, 0xCDDE, 0x5A04, 0xC2A6, 0x5A05, 0xE6AB, 0x5A06, 0xE6AC,\t0x5A07, 0xBDBF, 0x5A08, 0xE6AE, 0x5A09, 0xE6B3, 0x5A0A, 0x8ABD,\n\t0x5A0B, 0x8ABE, 0x5A0C, 0xE6B2, 0x5A0D, 0x8ABF, 0x5A0E, 0x8AC0,\t0x5A0F, 0x8AC1, 0x5A10, 0x8AC2, 0x5A11, 0xE6B6, 0x5A12, 0x8AC3,\n\t0x5A13, 0xE6B8, 0x5A14, 0x8AC4, 0x5A15, 0x8AC5, 0x5A16, 0x8AC6,\t0x5A17, 0x8AC7, 0x5A18, 0xC4EF, 0x5A19, 0x8AC8, 0x5A1A, 0x8AC9,\n\t0x5A1B, 0x8ACA, 0x5A1C, 0xC4C8, 0x5A1D, 0x8ACB, 0x5A1E, 0x8ACC,\t0x5A1F, 0xBEEA, 0x5A20, 0xC9EF, 0x5A21, 0x8ACD, 0x5A22, 0x8ACE,\n\t0x5A23, 0xE6B7, 0x5A24, 0x8ACF, 0x5A25, 0xB6F0, 0x5A26, 0x8AD0,\t0x5A27, 0x8AD1, 0x5A28, 0x8AD2, 0x5A29, 0xC3E4, 0x5A2A, 0x8AD3,\n\t0x5A2B, 0x8AD4, 0x5A2C, 0x8AD5, 0x5A2D, 0x8AD6, 0x5A2E, 0x8AD7,\t0x5A2F, 0x8AD8, 0x5A30, 0x8AD9, 0x5A31, 0xD3E9, 0x5A32, 0xE6B4,\n\t0x5A33, 0x8ADA, 0x5A34, 0xE6B5, 0x5A35, 0x8ADB, 0x5A36, 0xC8A2,\t0x5A37, 0x8ADC, 0x5A38, 0x8ADD, 0x5A39, 0x8ADE, 0x5A3A, 0x8ADF,\n\t0x5A3B, 0x8AE0, 0x5A3C, 0xE6BD, 0x5A3D, 0x8AE1, 0x5A3E, 0x8AE2,\t0x5A3F, 0x8AE3, 0x5A40, 0xE6B9, 0x5A41, 0x8AE4, 0x5A42, 0x8AE5,\n\t0x5A43, 0x8AE6, 0x5A44, 0x8AE7, 0x5A45, 0x8AE8, 0x5A46, 0xC6C5,\t0x5A47, 0x8AE9, 0x5A48, 0x8AEA, 0x5A49, 0xCDF1, 0x5A4A, 0xE6BB,\n\t0x5A4B, 0x8AEB, 0x5A4C, 0x8AEC, 0x5A4D, 0x8AED, 0x5A4E, 0x8AEE,\t0x5A4F, 0x8AEF, 0x5A50, 0x8AF0, 0x5A51, 0x8AF1, 0x5A52, 0x8AF2,\n\t0x5A53, 0x8AF3, 0x5A54, 0x8AF4, 0x5A55, 0xE6BC, 0x5A56, 0x8AF5,\t0x5A57, 0x8AF6, 0x5A58, 0x8AF7, 0x5A59, 0x8AF8, 0x5A5A, 0xBBE9,\n\t0x5A5B, 0x8AF9, 0x5A5C, 0x8AFA, 0x5A5D, 0x8AFB, 0x5A5E, 0x8AFC,\t0x5A5F, 0x8AFD, 0x5A60, 0x8AFE, 0x5A61, 0x8B40, 0x5A62, 0xE6BE,\n\t0x5A63, 0x8B41, 0x5A64, 0x8B42, 0x5A65, 0x8B43, 0x5A66, 0x8B44,\t0x5A67, 0xE6BA, 0x5A68, 0x8B45, 0x5A69, 0x8B46, 0x5A6A, 0xC0B7,\n\t0x5A6B, 0x8B47, 0x5A6C, 0x8B48, 0x5A6D, 0x8B49, 0x5A6E, 0x8B4A,\t0x5A6F, 0x8B4B, 0x5A70, 0x8B4C, 0x5A71, 0x8B4D, 0x5A72, 0x8B4E,\n\t0x5A73, 0x8B4F, 0x5A74, 0xD3A4, 0x5A75, 0xE6BF, 0x5A76, 0xC9F4,\t0x5A77, 0xE6C3, 0x5A78, 0x8B50, 0x5A79, 0x8B51, 0x5A7A, 0xE6C4,\n\t0x5A7B, 0x8B52, 0x5A7C, 0x8B53, 0x5A7D, 0x8B54, 0x5A7E, 0x8B55,\t0x5A7F, 0xD0F6, 0x5A80, 0x8B56, 0x5A81, 0x8B57, 0x5A82, 0x8B58,\n\t0x5A83, 0x8B59, 0x5A84, 0x8B5A, 0x5A85, 0x8B5B, 0x5A86, 0x8B5C,\t0x5A87, 0x8B5D, 0x5A88, 0x8B5E, 0x5A89, 0x8B5F, 0x5A8A, 0x8B60,\n\t0x5A8B, 0x8B61, 0x5A8C, 0x8B62, 0x5A8D, 0x8B63, 0x5A8E, 0x8B64,\t0x5A8F, 0x8B65, 0x5A90, 0x8B66, 0x5A91, 0x8B67, 0x5A92, 0xC3BD,\n\t0x5A93, 0x8B68, 0x5A94, 0x8B69, 0x5A95, 0x8B6A, 0x5A96, 0x8B6B,\t0x5A97, 0x8B6C, 0x5A98, 0x8B6D, 0x5A99, 0x8B6E, 0x5A9A, 0xC3C4,\n\t0x5A9B, 0xE6C2, 0x5A9C, 0x8B6F, 0x5A9D, 0x8B70, 0x5A9E, 0x8B71,\t0x5A9F, 0x8B72, 0x5AA0, 0x8B73, 0x5AA1, 0x8B74, 0x5AA2, 0x8B75,\n\t0x5AA3, 0x8B76, 0x5AA4, 0x8B77, 0x5AA5, 0x8B78, 0x5AA6, 0x8B79,\t0x5AA7, 0x8B7A, 0x5AA8, 0x8B7B, 0x5AA9, 0x8B7C, 0x5AAA, 0xE6C1,\n\t0x5AAB, 0x8B7D, 0x5AAC, 0x8B7E, 0x5AAD, 0x8B80, 0x5AAE, 0x8B81,\t0x5AAF, 0x8B82, 0x5AB0, 0x8B83, 0x5AB1, 0x8B84, 0x5AB2, 0xE6C7,\n\t0x5AB3, 0xCFB1, 0x5AB4, 0x8B85, 0x5AB5, 0xEBF4, 0x5AB6, 0x8B86,\t0x5AB7, 0x8B87, 0x5AB8, 0xE6CA, 0x5AB9, 0x8B88, 0x5ABA, 0x8B89,\n\t0x5ABB, 0x8B8A, 0x5ABC, 0x8B8B, 0x5ABD, 0x8B8C, 0x5ABE, 0xE6C5,\t0x5ABF, 0x8B8D, 0x5AC0, 0x8B8E, 0x5AC1, 0xBCDE, 0x5AC2, 0xC9A9,\n\t0x5AC3, 0x8B8F, 0x5AC4, 0x8B90, 0x5AC5, 0x8B91, 0x5AC6, 0x8B92,\t0x5AC7, 0x8B93, 0x5AC8, 0x8B94, 0x5AC9, 0xBCB5, 0x5ACA, 0x8B95,\n\t0x5ACB, 0x8B96, 0x5ACC, 0xCFD3, 0x5ACD, 0x8B97, 0x5ACE, 0x8B98,\t0x5ACF, 0x8B99, 0x5AD0, 0x8B9A, 0x5AD1, 0x8B9B, 0x5AD2, 0xE6C8,\n\t0x5AD3, 0x8B9C, 0x5AD4, 0xE6C9, 0x5AD5, 0x8B9D, 0x5AD6, 0xE6CE,\t0x5AD7, 0x8B9E, 0x5AD8, 0xE6D0, 0x5AD9, 0x8B9F, 0x5ADA, 0x8BA0,\n\t0x5ADB, 0x8BA1, 0x5ADC, 0xE6D1, 0x5ADD, 0x8BA2, 0x5ADE, 0x8BA3,\t0x5ADF, 0x8BA4, 0x5AE0, 0xE6CB, 0x5AE1, 0xB5D5, 0x5AE2, 0x8BA5,\n\t0x5AE3, 0xE6CC, 0x5AE4, 0x8BA6, 0x5AE5, 0x8BA7, 0x5AE6, 0xE6CF,\t0x5AE7, 0x8BA8, 0x5AE8, 0x8BA9, 0x5AE9, 0xC4DB, 0x5AEA, 0x8BAA,\n\t0x5AEB, 0xE6C6, 0x5AEC, 0x8BAB, 0x5AED, 0x8BAC, 0x5AEE, 0x8BAD,\t0x5AEF, 0x8BAE, 0x5AF0, 0x8BAF, 0x5AF1, 0xE6CD, 0x5AF2, 0x8BB0,\n\t0x5AF3, 0x8BB1, 0x5AF4, 0x8BB2, 0x5AF5, 0x8BB3, 0x5AF6, 0x8BB4,\t0x5AF7, 0x8BB5, 0x5AF8, 0x8BB6, 0x5AF9, 0x8BB7, 0x5AFA, 0x8BB8,\n\t0x5AFB, 0x8BB9, 0x5AFC, 0x8BBA, 0x5AFD, 0x8BBB, 0x5AFE, 0x8BBC,\t0x5AFF, 0x8BBD, 0x5B00, 0x8BBE, 0x5B01, 0x8BBF, 0x5B02, 0x8BC0,\n\t0x5B03, 0x8BC1, 0x5B04, 0x8BC2, 0x5B05, 0x8BC3, 0x5B06, 0x8BC4,\t0x5B07, 0x8BC5, 0x5B08, 0x8BC6, 0x5B09, 0xE6D2, 0x5B0A, 0x8BC7,\n\t0x5B0B, 0x8BC8, 0x5B0C, 0x8BC9, 0x5B0D, 0x8BCA, 0x5B0E, 0x8BCB,\t0x5B0F, 0x8BCC, 0x5B10, 0x8BCD, 0x5B11, 0x8BCE, 0x5B12, 0x8BCF,\n\t0x5B13, 0x8BD0, 0x5B14, 0x8BD1, 0x5B15, 0x8BD2, 0x5B16, 0xE6D4,\t0x5B17, 0xE6D3, 0x5B18, 0x8BD3, 0x5B19, 0x8BD4, 0x5B1A, 0x8BD5,\n\t0x5B1B, 0x8BD6, 0x5B1C, 0x8BD7, 0x5B1D, 0x8BD8, 0x5B1E, 0x8BD9,\t0x5B1F, 0x8BDA, 0x5B20, 0x8BDB, 0x5B21, 0x8BDC, 0x5B22, 0x8BDD,\n\t0x5B23, 0x8BDE, 0x5B24, 0x8BDF, 0x5B25, 0x8BE0, 0x5B26, 0x8BE1,\t0x5B27, 0x8BE2, 0x5B28, 0x8BE3, 0x5B29, 0x8BE4, 0x5B2A, 0x8BE5,\n\t0x5B2B, 0x8BE6, 0x5B2C, 0x8BE7, 0x5B2D, 0x8BE8, 0x5B2E, 0x8BE9,\t0x5B2F, 0x8BEA, 0x5B30, 0x8BEB, 0x5B31, 0x8BEC, 0x5B32, 0xE6D5,\n\t0x5B33, 0x8BED, 0x5B34, 0xD9F8, 0x5B35, 0x8BEE, 0x5B36, 0x8BEF,\t0x5B37, 0xE6D6, 0x5B38, 0x8BF0, 0x5B39, 0x8BF1, 0x5B3A, 0x8BF2,\n\t0x5B3B, 0x8BF3, 0x5B3C, 0x8BF4, 0x5B3D, 0x8BF5, 0x5B3E, 0x8BF6,\t0x5B3F, 0x8BF7, 0x5B40, 0xE6D7, 0x5B41, 0x8BF8, 0x5B42, 0x8BF9,\n\t0x5B43, 0x8BFA, 0x5B44, 0x8BFB, 0x5B45, 0x8BFC, 0x5B46, 0x8BFD,\t0x5B47, 0x8BFE, 0x5B48, 0x8C40, 0x5B49, 0x8C41, 0x5B4A, 0x8C42,\n\t0x5B4B, 0x8C43, 0x5B4C, 0x8C44, 0x5B4D, 0x8C45, 0x5B4E, 0x8C46,\t0x5B4F, 0x8C47, 0x5B50, 0xD7D3, 0x5B51, 0xE6DD, 0x5B52, 0x8C48,\n\t0x5B53, 0xE6DE, 0x5B54, 0xBFD7, 0x5B55, 0xD4D0, 0x5B56, 0x8C49,\t0x5B57, 0xD7D6, 0x5B58, 0xB4E6, 0x5B59, 0xCBEF, 0x5B5A, 0xE6DA,\n\t0x5B5B, 0xD8C3, 0x5B5C, 0xD7CE, 0x5B5D, 0xD0A2, 0x5B5E, 0x8C4A,\t0x5B5F, 0xC3CF, 0x5B60, 0x8C4B, 0x5B61, 0x8C4C, 0x5B62, 0xE6DF,\n\t0x5B63, 0xBCBE, 0x5B64, 0xB9C2, 0x5B65, 0xE6DB, 0x5B66, 0xD1A7,\t0x5B67, 0x8C4D, 0x5B68, 0x8C4E, 0x5B69, 0xBAA2, 0x5B6A, 0xC2CF,\n\t0x5B6B, 0x8C4F, 0x5B6C, 0xD8AB, 0x5B6D, 0x8C50, 0x5B6E, 0x8C51,\t0x5B6F, 0x8C52, 0x5B70, 0xCAEB, 0x5B71, 0xE5EE, 0x5B72, 0x8C53,\n\t0x5B73, 0xE6DC, 0x5B74, 0x8C54, 0x5B75, 0xB7F5, 0x5B76, 0x8C55,\t0x5B77, 0x8C56, 0x5B78, 0x8C57, 0x5B79, 0x8C58, 0x5B7A, 0xC8E6,\n\t0x5B7B, 0x8C59, 0x5B7C, 0x8C5A, 0x5B7D, 0xC4F5, 0x5B7E, 0x8C5B,\t0x5B7F, 0x8C5C, 0x5B80, 0xE5B2, 0x5B81, 0xC4FE, 0x5B82, 0x8C5D,\n\t0x5B83, 0xCBFC, 0x5B84, 0xE5B3, 0x5B85, 0xD5AC, 0x5B86, 0x8C5E,\t0x5B87, 0xD3EE, 0x5B88, 0xCAD8, 0x5B89, 0xB0B2, 0x5B8A, 0x8C5F,\n\t0x5B8B, 0xCBCE, 0x5B8C, 0xCDEA, 0x5B8D, 0x8C60, 0x5B8E, 0x8C61,\t0x5B8F, 0xBAEA, 0x5B90, 0x8C62, 0x5B91, 0x8C63, 0x5B92, 0x8C64,\n\t0x5B93, 0xE5B5, 0x5B94, 0x8C65, 0x5B95, 0xE5B4, 0x5B96, 0x8C66,\t0x5B97, 0xD7DA, 0x5B98, 0xB9D9, 0x5B99, 0xD6E6, 0x5B9A, 0xB6A8,\n\t0x5B9B, 0xCDF0, 0x5B9C, 0xD2CB, 0x5B9D, 0xB1A6, 0x5B9E, 0xCAB5,\t0x5B9F, 0x8C67, 0x5BA0, 0xB3E8, 0x5BA1, 0xC9F3, 0x5BA2, 0xBFCD,\n\t0x5BA3, 0xD0FB, 0x5BA4, 0xCAD2, 0x5BA5, 0xE5B6, 0x5BA6, 0xBBC2,\t0x5BA7, 0x8C68, 0x5BA8, 0x8C69, 0x5BA9, 0x8C6A, 0x5BAA, 0xCFDC,\n\t0x5BAB, 0xB9AC, 0x5BAC, 0x8C6B, 0x5BAD, 0x8C6C, 0x5BAE, 0x8C6D,\t0x5BAF, 0x8C6E, 0x5BB0, 0xD4D7, 0x5BB1, 0x8C6F, 0x5BB2, 0x8C70,\n\t0x5BB3, 0xBAA6, 0x5BB4, 0xD1E7, 0x5BB5, 0xCFFC, 0x5BB6, 0xBCD2,\t0x5BB7, 0x8C71, 0x5BB8, 0xE5B7, 0x5BB9, 0xC8DD, 0x5BBA, 0x8C72,\n\t0x5BBB, 0x8C73, 0x5BBC, 0x8C74, 0x5BBD, 0xBFED, 0x5BBE, 0xB1F6,\t0x5BBF, 0xCBDE, 0x5BC0, 0x8C75, 0x5BC1, 0x8C76, 0x5BC2, 0xBCC5,\n\t0x5BC3, 0x8C77, 0x5BC4, 0xBCC4, 0x5BC5, 0xD2FA, 0x5BC6, 0xC3DC,\t0x5BC7, 0xBFDC, 0x5BC8, 0x8C78, 0x5BC9, 0x8C79, 0x5BCA, 0x8C7A,\n\t0x5BCB, 0x8C7B, 0x5BCC, 0xB8BB, 0x5BCD, 0x8C7C, 0x5BCE, 0x8C7D,\t0x5BCF, 0x8C7E, 0x5BD0, 0xC3C2, 0x5BD1, 0x8C80, 0x5BD2, 0xBAAE,\n\t0x5BD3, 0xD4A2, 0x5BD4, 0x8C81, 0x5BD5, 0x8C82, 0x5BD6, 0x8C83,\t0x5BD7, 0x8C84, 0x5BD8, 0x8C85, 0x5BD9, 0x8C86, 0x5BDA, 0x8C87,\n\t0x5BDB, 0x8C88, 0x5BDC, 0x8C89, 0x5BDD, 0xC7DE, 0x5BDE, 0xC4AF,\t0x5BDF, 0xB2EC, 0x5BE0, 0x8C8A, 0x5BE1, 0xB9D1, 0x5BE2, 0x8C8B,\n\t0x5BE3, 0x8C8C, 0x5BE4, 0xE5BB, 0x5BE5, 0xC1C8, 0x5BE6, 0x8C8D,\t0x5BE7, 0x8C8E, 0x5BE8, 0xD5AF, 0x5BE9, 0x8C8F, 0x5BEA, 0x8C90,\n\t0x5BEB, 0x8C91, 0x5BEC, 0x8C92, 0x5BED, 0x8C93, 0x5BEE, 0xE5BC,\t0x5BEF, 0x8C94, 0x5BF0, 0xE5BE, 0x5BF1, 0x8C95, 0x5BF2, 0x8C96,\n\t0x5BF3, 0x8C97, 0x5BF4, 0x8C98, 0x5BF5, 0x8C99, 0x5BF6, 0x8C9A,\t0x5BF7, 0x8C9B, 0x5BF8, 0xB4E7, 0x5BF9, 0xB6D4, 0x5BFA, 0xCBC2,\n\t0x5BFB, 0xD1B0, 0x5BFC, 0xB5BC, 0x5BFD, 0x8C9C, 0x5BFE, 0x8C9D,\t0x5BFF, 0xCAD9, 0x5C00, 0x8C9E, 0x5C01, 0xB7E2, 0x5C02, 0x8C9F,\n\t0x5C03, 0x8CA0, 0x5C04, 0xC9E4, 0x5C05, 0x8CA1, 0x5C06, 0xBDAB,\t0x5C07, 0x8CA2, 0x5C08, 0x8CA3, 0x5C09, 0xCEBE, 0x5C0A, 0xD7F0,\n\t0x5C0B, 0x8CA4, 0x5C0C, 0x8CA5, 0x5C0D, 0x8CA6, 0x5C0E, 0x8CA7,\t0x5C0F, 0xD0A1, 0x5C10, 0x8CA8, 0x5C11, 0xC9D9, 0x5C12, 0x8CA9,\n\t0x5C13, 0x8CAA, 0x5C14, 0xB6FB, 0x5C15, 0xE6D8, 0x5C16, 0xBCE2,\t0x5C17, 0x8CAB, 0x5C18, 0xB3BE, 0x5C19, 0x8CAC, 0x5C1A, 0xC9D0,\n\t0x5C1B, 0x8CAD, 0x5C1C, 0xE6D9, 0x5C1D, 0xB3A2, 0x5C1E, 0x8CAE,\t0x5C1F, 0x8CAF, 0x5C20, 0x8CB0, 0x5C21, 0x8CB1, 0x5C22, 0xDECC,\n\t0x5C23, 0x8CB2, 0x5C24, 0xD3C8, 0x5C25, 0xDECD, 0x5C26, 0x8CB3,\t0x5C27, 0xD2A2, 0x5C28, 0x8CB4, 0x5C29, 0x8CB5, 0x5C2A, 0x8CB6,\n\t0x5C2B, 0x8CB7, 0x5C2C, 0xDECE, 0x5C2D, 0x8CB8, 0x5C2E, 0x8CB9,\t0x5C2F, 0x8CBA, 0x5C30, 0x8CBB, 0x5C31, 0xBECD, 0x5C32, 0x8CBC,\n\t0x5C33, 0x8CBD, 0x5C34, 0xDECF, 0x5C35, 0x8CBE, 0x5C36, 0x8CBF,\t0x5C37, 0x8CC0, 0x5C38, 0xCAAC, 0x5C39, 0xD2FC, 0x5C3A, 0xB3DF,\n\t0x5C3B, 0xE5EA, 0x5C3C, 0xC4E1, 0x5C3D, 0xBEA1, 0x5C3E, 0xCEB2,\t0x5C3F, 0xC4F2, 0x5C40, 0xBED6, 0x5C41, 0xC6A8, 0x5C42, 0xB2E3,\n\t0x5C43, 0x8CC1, 0x5C44, 0x8CC2, 0x5C45, 0xBED3, 0x5C46, 0x8CC3,\t0x5C47, 0x8CC4, 0x5C48, 0xC7FC, 0x5C49, 0xCCEB, 0x5C4A, 0xBDEC,\n\t0x5C4B, 0xCEDD, 0x5C4C, 0x8CC5, 0x5C4D, 0x8CC6, 0x5C4E, 0xCABA,\t0x5C4F, 0xC6C1, 0x5C50, 0xE5EC, 0x5C51, 0xD0BC, 0x5C52, 0x8CC7,\n\t0x5C53, 0x8CC8, 0x5C54, 0x8CC9, 0x5C55, 0xD5B9, 0x5C56, 0x8CCA,\t0x5C57, 0x8CCB, 0x5C58, 0x8CCC, 0x5C59, 0xE5ED, 0x5C5A, 0x8CCD,\n\t0x5C5B, 0x8CCE, 0x5C5C, 0x8CCF, 0x5C5D, 0x8CD0, 0x5C5E, 0xCAF4,\t0x5C5F, 0x8CD1, 0x5C60, 0xCDC0, 0x5C61, 0xC2C5, 0x5C62, 0x8CD2,\n\t0x5C63, 0xE5EF, 0x5C64, 0x8CD3, 0x5C65, 0xC2C4, 0x5C66, 0xE5F0,\t0x5C67, 0x8CD4, 0x5C68, 0x8CD5, 0x5C69, 0x8CD6, 0x5C6A, 0x8CD7,\n\t0x5C6B, 0x8CD8, 0x5C6C, 0x8CD9, 0x5C6D, 0x8CDA, 0x5C6E, 0xE5F8,\t0x5C6F, 0xCDCD, 0x5C70, 0x8CDB, 0x5C71, 0xC9BD, 0x5C72, 0x8CDC,\n\t0x5C73, 0x8CDD, 0x5C74, 0x8CDE, 0x5C75, 0x8CDF, 0x5C76, 0x8CE0,\t0x5C77, 0x8CE1, 0x5C78, 0x8CE2, 0x5C79, 0xD2D9, 0x5C7A, 0xE1A8,\n\t0x5C7B, 0x8CE3, 0x5C7C, 0x8CE4, 0x5C7D, 0x8CE5, 0x5C7E, 0x8CE6,\t0x5C7F, 0xD3EC, 0x5C80, 0x8CE7, 0x5C81, 0xCBEA, 0x5C82, 0xC6F1,\n\t0x5C83, 0x8CE8, 0x5C84, 0x8CE9, 0x5C85, 0x8CEA, 0x5C86, 0x8CEB,\t0x5C87, 0x8CEC, 0x5C88, 0xE1AC, 0x5C89, 0x8CED, 0x5C8A, 0x8CEE,\n\t0x5C8B, 0x8CEF, 0x5C8C, 0xE1A7, 0x5C8D, 0xE1A9, 0x5C8E, 0x8CF0,\t0x5C8F, 0x8CF1, 0x5C90, 0xE1AA, 0x5C91, 0xE1AF, 0x5C92, 0x8CF2,\n\t0x5C93, 0x8CF3, 0x5C94, 0xB2ED, 0x5C95, 0x8CF4, 0x5C96, 0xE1AB,\t0x5C97, 0xB8DA, 0x5C98, 0xE1AD, 0x5C99, 0xE1AE, 0x5C9A, 0xE1B0,\n\t0x5C9B, 0xB5BA, 0x5C9C, 0xE1B1, 0x5C9D, 0x8CF5, 0x5C9E, 0x8CF6,\t0x5C9F, 0x8CF7, 0x5CA0, 0x8CF8, 0x5CA1, 0x8CF9, 0x5CA2, 0xE1B3,\n\t0x5CA3, 0xE1B8, 0x5CA4, 0x8CFA, 0x5CA5, 0x8CFB, 0x5CA6, 0x8CFC,\t0x5CA7, 0x8CFD, 0x5CA8, 0x8CFE, 0x5CA9, 0xD1D2, 0x5CAA, 0x8D40,\n\t0x5CAB, 0xE1B6, 0x5CAC, 0xE1B5, 0x5CAD, 0xC1EB, 0x5CAE, 0x8D41,\t0x5CAF, 0x8D42, 0x5CB0, 0x8D43, 0x5CB1, 0xE1B7, 0x5CB2, 0x8D44,\n\t0x5CB3, 0xD4C0, 0x5CB4, 0x8D45, 0x5CB5, 0xE1B2, 0x5CB6, 0x8D46,\t0x5CB7, 0xE1BA, 0x5CB8, 0xB0B6, 0x5CB9, 0x8D47, 0x5CBA, 0x8D48,\n\t0x5CBB, 0x8D49, 0x5CBC, 0x8D4A, 0x5CBD, 0xE1B4, 0x5CBE, 0x8D4B,\t0x5CBF, 0xBFF9, 0x5CC0, 0x8D4C, 0x5CC1, 0xE1B9, 0x5CC2, 0x8D4D,\n\t0x5CC3, 0x8D4E, 0x5CC4, 0xE1BB, 0x5CC5, 0x8D4F, 0x5CC6, 0x8D50,\t0x5CC7, 0x8D51, 0x5CC8, 0x8D52, 0x5CC9, 0x8D53, 0x5CCA, 0x8D54,\n\t0x5CCB, 0xE1BE, 0x5CCC, 0x8D55, 0x5CCD, 0x8D56, 0x5CCE, 0x8D57,\t0x5CCF, 0x8D58, 0x5CD0, 0x8D59, 0x5CD1, 0x8D5A, 0x5CD2, 0xE1BC,\n\t0x5CD3, 0x8D5B, 0x5CD4, 0x8D5C, 0x5CD5, 0x8D5D, 0x5CD6, 0x8D5E,\t0x5CD7, 0x8D5F, 0x5CD8, 0x8D60, 0x5CD9, 0xD6C5, 0x5CDA, 0x8D61,\n\t0x5CDB, 0x8D62, 0x5CDC, 0x8D63, 0x5CDD, 0x8D64, 0x5CDE, 0x8D65,\t0x5CDF, 0x8D66, 0x5CE0, 0x8D67, 0x5CE1, 0xCFBF, 0x5CE2, 0x8D68,\n\t0x5CE3, 0x8D69, 0x5CE4, 0xE1BD, 0x5CE5, 0xE1BF, 0x5CE6, 0xC2CD,\t0x5CE7, 0x8D6A, 0x5CE8, 0xB6EB, 0x5CE9, 0x8D6B, 0x5CEA, 0xD3F8,\n\t0x5CEB, 0x8D6C, 0x5CEC, 0x8D6D, 0x5CED, 0xC7CD, 0x5CEE, 0x8D6E,\t0x5CEF, 0x8D6F, 0x5CF0, 0xB7E5, 0x5CF1, 0x8D70, 0x5CF2, 0x8D71,\n\t0x5CF3, 0x8D72, 0x5CF4, 0x8D73, 0x5CF5, 0x8D74, 0x5CF6, 0x8D75,\t0x5CF7, 0x8D76, 0x5CF8, 0x8D77, 0x5CF9, 0x8D78, 0x5CFA, 0x8D79,\n\t0x5CFB, 0xBEFE, 0x5CFC, 0x8D7A, 0x5CFD, 0x8D7B, 0x5CFE, 0x8D7C,\t0x5CFF, 0x8D7D, 0x5D00, 0x8D7E, 0x5D01, 0x8D80, 0x5D02, 0xE1C0,\n\t0x5D03, 0xE1C1, 0x5D04, 0x8D81, 0x5D05, 0x8D82, 0x5D06, 0xE1C7,\t0x5D07, 0xB3E7, 0x5D08, 0x8D83, 0x5D09, 0x8D84, 0x5D0A, 0x8D85,\n\t0x5D0B, 0x8D86, 0x5D0C, 0x8D87, 0x5D0D, 0x8D88, 0x5D0E, 0xC6E9,\t0x5D0F, 0x8D89, 0x5D10, 0x8D8A, 0x5D11, 0x8D8B, 0x5D12, 0x8D8C,\n\t0x5D13, 0x8D8D, 0x5D14, 0xB4DE, 0x5D15, 0x8D8E, 0x5D16, 0xD1C2,\t0x5D17, 0x8D8F, 0x5D18, 0x8D90, 0x5D19, 0x8D91, 0x5D1A, 0x8D92,\n\t0x5D1B, 0xE1C8, 0x5D1C, 0x8D93, 0x5D1D, 0x8D94, 0x5D1E, 0xE1C6,\t0x5D1F, 0x8D95, 0x5D20, 0x8D96, 0x5D21, 0x8D97, 0x5D22, 0x8D98,\n\t0x5D23, 0x8D99, 0x5D24, 0xE1C5, 0x5D25, 0x8D9A, 0x5D26, 0xE1C3,\t0x5D27, 0xE1C2, 0x5D28, 0x8D9B, 0x5D29, 0xB1C0, 0x5D2A, 0x8D9C,\n\t0x5D2B, 0x8D9D, 0x5D2C, 0x8D9E, 0x5D2D, 0xD5B8, 0x5D2E, 0xE1C4,\t0x5D2F, 0x8D9F, 0x5D30, 0x8DA0, 0x5D31, 0x8DA1, 0x5D32, 0x8DA2,\n\t0x5D33, 0x8DA3, 0x5D34, 0xE1CB, 0x5D35, 0x8DA4, 0x5D36, 0x8DA5,\t0x5D37, 0x8DA6, 0x5D38, 0x8DA7, 0x5D39, 0x8DA8, 0x5D3A, 0x8DA9,\n\t0x5D3B, 0x8DAA, 0x5D3C, 0x8DAB, 0x5D3D, 0xE1CC, 0x5D3E, 0xE1CA,\t0x5D3F, 0x8DAC, 0x5D40, 0x8DAD, 0x5D41, 0x8DAE, 0x5D42, 0x8DAF,\n\t0x5D43, 0x8DB0, 0x5D44, 0x8DB1, 0x5D45, 0x8DB2, 0x5D46, 0x8DB3,\t0x5D47, 0xEFFA, 0x5D48, 0x8DB4, 0x5D49, 0x8DB5, 0x5D4A, 0xE1D3,\n\t0x5D4B, 0xE1D2, 0x5D4C, 0xC7B6, 0x5D4D, 0x8DB6, 0x5D4E, 0x8DB7,\t0x5D4F, 0x8DB8, 0x5D50, 0x8DB9, 0x5D51, 0x8DBA, 0x5D52, 0x8DBB,\n\t0x5D53, 0x8DBC, 0x5D54, 0x8DBD, 0x5D55, 0x8DBE, 0x5D56, 0x8DBF,\t0x5D57, 0x8DC0, 0x5D58, 0xE1C9, 0x5D59, 0x8DC1, 0x5D5A, 0x8DC2,\n\t0x5D5B, 0xE1CE, 0x5D5C, 0x8DC3, 0x5D5D, 0xE1D0, 0x5D5E, 0x8DC4,\t0x5D5F, 0x8DC5, 0x5D60, 0x8DC6, 0x5D61, 0x8DC7, 0x5D62, 0x8DC8,\n\t0x5D63, 0x8DC9, 0x5D64, 0x8DCA, 0x5D65, 0x8DCB, 0x5D66, 0x8DCC,\t0x5D67, 0x8DCD, 0x5D68, 0x8DCE, 0x5D69, 0xE1D4, 0x5D6A, 0x8DCF,\n\t0x5D6B, 0xE1D1, 0x5D6C, 0xE1CD, 0x5D6D, 0x8DD0, 0x5D6E, 0x8DD1,\t0x5D6F, 0xE1CF, 0x5D70, 0x8DD2, 0x5D71, 0x8DD3, 0x5D72, 0x8DD4,\n\t0x5D73, 0x8DD5, 0x5D74, 0xE1D5, 0x5D75, 0x8DD6, 0x5D76, 0x8DD7,\t0x5D77, 0x8DD8, 0x5D78, 0x8DD9, 0x5D79, 0x8DDA, 0x5D7A, 0x8DDB,\n\t0x5D7B, 0x8DDC, 0x5D7C, 0x8DDD, 0x5D7D, 0x8DDE, 0x5D7E, 0x8DDF,\t0x5D7F, 0x8DE0, 0x5D80, 0x8DE1, 0x5D81, 0x8DE2, 0x5D82, 0xE1D6,\n\t0x5D83, 0x8DE3, 0x5D84, 0x8DE4, 0x5D85, 0x8DE5, 0x5D86, 0x8DE6,\t0x5D87, 0x8DE7, 0x5D88, 0x8DE8, 0x5D89, 0x8DE9, 0x5D8A, 0x8DEA,\n\t0x5D8B, 0x8DEB, 0x5D8C, 0x8DEC, 0x5D8D, 0x8DED, 0x5D8E, 0x8DEE,\t0x5D8F, 0x8DEF, 0x5D90, 0x8DF0, 0x5D91, 0x8DF1, 0x5D92, 0x8DF2,\n\t0x5D93, 0x8DF3, 0x5D94, 0x8DF4, 0x5D95, 0x8DF5, 0x5D96, 0x8DF6,\t0x5D97, 0x8DF7, 0x5D98, 0x8DF8, 0x5D99, 0xE1D7, 0x5D9A, 0x8DF9,\n\t0x5D9B, 0x8DFA, 0x5D9C, 0x8DFB, 0x5D9D, 0xE1D8, 0x5D9E, 0x8DFC,\t0x5D9F, 0x8DFD, 0x5DA0, 0x8DFE, 0x5DA1, 0x8E40, 0x5DA2, 0x8E41,\n\t0x5DA3, 0x8E42, 0x5DA4, 0x8E43, 0x5DA5, 0x8E44, 0x5DA6, 0x8E45,\t0x5DA7, 0x8E46, 0x5DA8, 0x8E47, 0x5DA9, 0x8E48, 0x5DAA, 0x8E49,\n\t0x5DAB, 0x8E4A, 0x5DAC, 0x8E4B, 0x5DAD, 0x8E4C, 0x5DAE, 0x8E4D,\t0x5DAF, 0x8E4E, 0x5DB0, 0x8E4F, 0x5DB1, 0x8E50, 0x5DB2, 0x8E51,\n\t0x5DB3, 0x8E52, 0x5DB4, 0x8E53, 0x5DB5, 0x8E54, 0x5DB6, 0x8E55,\t0x5DB7, 0xE1DA, 0x5DB8, 0x8E56, 0x5DB9, 0x8E57, 0x5DBA, 0x8E58,\n\t0x5DBB, 0x8E59, 0x5DBC, 0x8E5A, 0x5DBD, 0x8E5B, 0x5DBE, 0x8E5C,\t0x5DBF, 0x8E5D, 0x5DC0, 0x8E5E, 0x5DC1, 0x8E5F, 0x5DC2, 0x8E60,\n\t0x5DC3, 0x8E61, 0x5DC4, 0x8E62, 0x5DC5, 0xE1DB, 0x5DC6, 0x8E63,\t0x5DC7, 0x8E64, 0x5DC8, 0x8E65, 0x5DC9, 0x8E66, 0x5DCA, 0x8E67,\n\t0x5DCB, 0x8E68, 0x5DCC, 0x8E69, 0x5DCD, 0xCEA1, 0x5DCE, 0x8E6A,\t0x5DCF, 0x8E6B, 0x5DD0, 0x8E6C, 0x5DD1, 0x8E6D, 0x5DD2, 0x8E6E,\n\t0x5DD3, 0x8E6F, 0x5DD4, 0x8E70, 0x5DD5, 0x8E71, 0x5DD6, 0x8E72,\t0x5DD7, 0x8E73, 0x5DD8, 0x8E74, 0x5DD9, 0x8E75, 0x5DDA, 0x8E76,\n\t0x5DDB, 0xE7DD, 0x5DDC, 0x8E77, 0x5DDD, 0xB4A8, 0x5DDE, 0xD6DD,\t0x5DDF, 0x8E78, 0x5DE0, 0x8E79, 0x5DE1, 0xD1B2, 0x5DE2, 0xB3B2,\n\t0x5DE3, 0x8E7A, 0x5DE4, 0x8E7B, 0x5DE5, 0xB9A4, 0x5DE6, 0xD7F3,\t0x5DE7, 0xC7C9, 0x5DE8, 0xBEDE, 0x5DE9, 0xB9AE, 0x5DEA, 0x8E7C,\n\t0x5DEB, 0xCED7, 0x5DEC, 0x8E7D, 0x5DED, 0x8E7E, 0x5DEE, 0xB2EE,\t0x5DEF, 0xDBCF, 0x5DF0, 0x8E80, 0x5DF1, 0xBCBA, 0x5DF2, 0xD2D1,\n\t0x5DF3, 0xCBC8, 0x5DF4, 0xB0CD, 0x5DF5, 0x8E81, 0x5DF6, 0x8E82,\t0x5DF7, 0xCFEF, 0x5DF8, 0x8E83, 0x5DF9, 0x8E84, 0x5DFA, 0x8E85,\n\t0x5DFB, 0x8E86, 0x5DFC, 0x8E87, 0x5DFD, 0xD9E3, 0x5DFE, 0xBDED,\t0x5DFF, 0x8E88, 0x5E00, 0x8E89, 0x5E01, 0xB1D2, 0x5E02, 0xCAD0,\n\t0x5E03, 0xB2BC, 0x5E04, 0x8E8A, 0x5E05, 0xCBA7, 0x5E06, 0xB7AB,\t0x5E07, 0x8E8B, 0x5E08, 0xCAA6, 0x5E09, 0x8E8C, 0x5E0A, 0x8E8D,\n\t0x5E0B, 0x8E8E, 0x5E0C, 0xCFA3, 0x5E0D, 0x8E8F, 0x5E0E, 0x8E90,\t0x5E0F, 0xE0F8, 0x5E10, 0xD5CA, 0x5E11, 0xE0FB, 0x5E12, 0x8E91,\n\t0x5E13, 0x8E92, 0x5E14, 0xE0FA, 0x5E15, 0xC5C1, 0x5E16, 0xCCFB,\t0x5E17, 0x8E93, 0x5E18, 0xC1B1, 0x5E19, 0xE0F9, 0x5E1A, 0xD6E3,\n\t0x5E1B, 0xB2AF, 0x5E1C, 0xD6C4, 0x5E1D, 0xB5DB, 0x5E1E, 0x8E94,\t0x5E1F, 0x8E95, 0x5E20, 0x8E96, 0x5E21, 0x8E97, 0x5E22, 0x8E98,\n\t0x5E23, 0x8E99, 0x5E24, 0x8E9A, 0x5E25, 0x8E9B, 0x5E26, 0xB4F8,\t0x5E27, 0xD6A1, 0x5E28, 0x8E9C, 0x5E29, 0x8E9D, 0x5E2A, 0x8E9E,\n\t0x5E2B, 0x8E9F, 0x5E2C, 0x8EA0, 0x5E2D, 0xCFAF, 0x5E2E, 0xB0EF,\t0x5E2F, 0x8EA1, 0x5E30, 0x8EA2, 0x5E31, 0xE0FC, 0x5E32, 0x8EA3,\n\t0x5E33, 0x8EA4, 0x5E34, 0x8EA5, 0x5E35, 0x8EA6, 0x5E36, 0x8EA7,\t0x5E37, 0xE1A1, 0x5E38, 0xB3A3, 0x5E39, 0x8EA8, 0x5E3A, 0x8EA9,\n\t0x5E3B, 0xE0FD, 0x5E3C, 0xE0FE, 0x5E3D, 0xC3B1, 0x5E3E, 0x8EAA,\t0x5E3F, 0x8EAB, 0x5E40, 0x8EAC, 0x5E41, 0x8EAD, 0x5E42, 0xC3DD,\n\t0x5E43, 0x8EAE, 0x5E44, 0xE1A2, 0x5E45, 0xB7F9, 0x5E46, 0x8EAF,\t0x5E47, 0x8EB0, 0x5E48, 0x8EB1, 0x5E49, 0x8EB2, 0x5E4A, 0x8EB3,\n\t0x5E4B, 0x8EB4, 0x5E4C, 0xBBCF, 0x5E4D, 0x8EB5, 0x5E4E, 0x8EB6,\t0x5E4F, 0x8EB7, 0x5E50, 0x8EB8, 0x5E51, 0x8EB9, 0x5E52, 0x8EBA,\n\t0x5E53, 0x8EBB, 0x5E54, 0xE1A3, 0x5E55, 0xC4BB, 0x5E56, 0x8EBC,\t0x5E57, 0x8EBD, 0x5E58, 0x8EBE, 0x5E59, 0x8EBF, 0x5E5A, 0x8EC0,\n\t0x5E5B, 0xE1A4, 0x5E5C, 0x8EC1, 0x5E5D, 0x8EC2, 0x5E5E, 0xE1A5,\t0x5E5F, 0x8EC3, 0x5E60, 0x8EC4, 0x5E61, 0xE1A6, 0x5E62, 0xB4B1,\n\t0x5E63, 0x8EC5, 0x5E64, 0x8EC6, 0x5E65, 0x8EC7, 0x5E66, 0x8EC8,\t0x5E67, 0x8EC9, 0x5E68, 0x8ECA, 0x5E69, 0x8ECB, 0x5E6A, 0x8ECC,\n\t0x5E6B, 0x8ECD, 0x5E6C, 0x8ECE, 0x5E6D, 0x8ECF, 0x5E6E, 0x8ED0,\t0x5E6F, 0x8ED1, 0x5E70, 0x8ED2, 0x5E71, 0x8ED3, 0x5E72, 0xB8C9,\n\t0x5E73, 0xC6BD, 0x5E74, 0xC4EA, 0x5E75, 0x8ED4, 0x5E76, 0xB2A2,\t0x5E77, 0x8ED5, 0x5E78, 0xD0D2, 0x5E79, 0x8ED6, 0x5E7A, 0xE7DB,\n\t0x5E7B, 0xBBC3, 0x5E7C, 0xD3D7, 0x5E7D, 0xD3C4, 0x5E7E, 0x8ED7,\t0x5E7F, 0xB9E3, 0x5E80, 0xE2CF, 0x5E81, 0x8ED8, 0x5E82, 0x8ED9,\n\t0x5E83, 0x8EDA, 0x5E84, 0xD7AF, 0x5E85, 0x8EDB, 0x5E86, 0xC7EC,\t0x5E87, 0xB1D3, 0x5E88, 0x8EDC, 0x5E89, 0x8EDD, 0x5E8A, 0xB4B2,\n\t0x5E8B, 0xE2D1, 0x5E8C, 0x8EDE, 0x5E8D, 0x8EDF, 0x5E8E, 0x8EE0,\t0x5E8F, 0xD0F2, 0x5E90, 0xC2AE, 0x5E91, 0xE2D0, 0x5E92, 0x8EE1,\n\t0x5E93, 0xBFE2, 0x5E94, 0xD3A6, 0x5E95, 0xB5D7, 0x5E96, 0xE2D2,\t0x5E97, 0xB5EA, 0x5E98, 0x8EE2, 0x5E99, 0xC3ED, 0x5E9A, 0xB8FD,\n\t0x5E9B, 0x8EE3, 0x5E9C, 0xB8AE, 0x5E9D, 0x8EE4, 0x5E9E, 0xC5D3,\t0x5E9F, 0xB7CF, 0x5EA0, 0xE2D4, 0x5EA1, 0x8EE5, 0x5EA2, 0x8EE6,\n\t0x5EA3, 0x8EE7, 0x5EA4, 0x8EE8, 0x5EA5, 0xE2D3, 0x5EA6, 0xB6C8,\t0x5EA7, 0xD7F9, 0x5EA8, 0x8EE9, 0x5EA9, 0x8EEA, 0x5EAA, 0x8EEB,\n\t0x5EAB, 0x8EEC, 0x5EAC, 0x8EED, 0x5EAD, 0xCDA5, 0x5EAE, 0x8EEE,\t0x5EAF, 0x8EEF, 0x5EB0, 0x8EF0, 0x5EB1, 0x8EF1, 0x5EB2, 0x8EF2,\n\t0x5EB3, 0xE2D8, 0x5EB4, 0x8EF3, 0x5EB5, 0xE2D6, 0x5EB6, 0xCAFC,\t0x5EB7, 0xBFB5, 0x5EB8, 0xD3B9, 0x5EB9, 0xE2D5, 0x5EBA, 0x8EF4,\n\t0x5EBB, 0x8EF5, 0x5EBC, 0x8EF6, 0x5EBD, 0x8EF7, 0x5EBE, 0xE2D7,\t0x5EBF, 0x8EF8, 0x5EC0, 0x8EF9, 0x5EC1, 0x8EFA, 0x5EC2, 0x8EFB,\n\t0x5EC3, 0x8EFC, 0x5EC4, 0x8EFD, 0x5EC5, 0x8EFE, 0x5EC6, 0x8F40,\t0x5EC7, 0x8F41, 0x5EC8, 0x8F42, 0x5EC9, 0xC1AE, 0x5ECA, 0xC0C8,\n\t0x5ECB, 0x8F43, 0x5ECC, 0x8F44, 0x5ECD, 0x8F45, 0x5ECE, 0x8F46,\t0x5ECF, 0x8F47, 0x5ED0, 0x8F48, 0x5ED1, 0xE2DB, 0x5ED2, 0xE2DA,\n\t0x5ED3, 0xC0AA, 0x5ED4, 0x8F49, 0x5ED5, 0x8F4A, 0x5ED6, 0xC1CE,\t0x5ED7, 0x8F4B, 0x5ED8, 0x8F4C, 0x5ED9, 0x8F4D, 0x5EDA, 0x8F4E,\n\t0x5EDB, 0xE2DC, 0x5EDC, 0x8F4F, 0x5EDD, 0x8F50, 0x5EDE, 0x8F51,\t0x5EDF, 0x8F52, 0x5EE0, 0x8F53, 0x5EE1, 0x8F54, 0x5EE2, 0x8F55,\n\t0x5EE3, 0x8F56, 0x5EE4, 0x8F57, 0x5EE5, 0x8F58, 0x5EE6, 0x8F59,\t0x5EE7, 0x8F5A, 0x5EE8, 0xE2DD, 0x5EE9, 0x8F5B, 0x5EEA, 0xE2DE,\n\t0x5EEB, 0x8F5C, 0x5EEC, 0x8F5D, 0x5EED, 0x8F5E, 0x5EEE, 0x8F5F,\t0x5EEF, 0x8F60, 0x5EF0, 0x8F61, 0x5EF1, 0x8F62, 0x5EF2, 0x8F63,\n\t0x5EF3, 0x8F64, 0x5EF4, 0xDBC8, 0x5EF5, 0x8F65, 0x5EF6, 0xD1D3,\t0x5EF7, 0xCDA2, 0x5EF8, 0x8F66, 0x5EF9, 0x8F67, 0x5EFA, 0xBDA8,\n\t0x5EFB, 0x8F68, 0x5EFC, 0x8F69, 0x5EFD, 0x8F6A, 0x5EFE, 0xDEC3,\t0x5EFF, 0xD8A5, 0x5F00, 0xBFAA, 0x5F01, 0xDBCD, 0x5F02, 0xD2EC,\n\t0x5F03, 0xC6FA, 0x5F04, 0xC5AA, 0x5F05, 0x8F6B, 0x5F06, 0x8F6C,\t0x5F07, 0x8F6D, 0x5F08, 0xDEC4, 0x5F09, 0x8F6E, 0x5F0A, 0xB1D7,\n\t0x5F0B, 0xDFAE, 0x5F0C, 0x8F6F, 0x5F0D, 0x8F70, 0x5F0E, 0x8F71,\t0x5F0F, 0xCABD, 0x5F10, 0x8F72, 0x5F11, 0xDFB1, 0x5F12, 0x8F73,\n\t0x5F13, 0xB9AD, 0x5F14, 0x8F74, 0x5F15, 0xD2FD, 0x5F16, 0x8F75,\t0x5F17, 0xB8A5, 0x5F18, 0xBAEB, 0x5F19, 0x8F76, 0x5F1A, 0x8F77,\n\t0x5F1B, 0xB3DA, 0x5F1C, 0x8F78, 0x5F1D, 0x8F79, 0x5F1E, 0x8F7A,\t0x5F1F, 0xB5DC, 0x5F20, 0xD5C5, 0x5F21, 0x8F7B, 0x5F22, 0x8F7C,\n\t0x5F23, 0x8F7D, 0x5F24, 0x8F7E, 0x5F25, 0xC3D6, 0x5F26, 0xCFD2,\t0x5F27, 0xBBA1, 0x5F28, 0x8F80, 0x5F29, 0xE5F3, 0x5F2A, 0xE5F2,\n\t0x5F2B, 0x8F81, 0x5F2C, 0x8F82, 0x5F2D, 0xE5F4, 0x5F2E, 0x8F83,\t0x5F2F, 0xCDE4, 0x5F30, 0x8F84, 0x5F31, 0xC8F5, 0x5F32, 0x8F85,\n\t0x5F33, 0x8F86, 0x5F34, 0x8F87, 0x5F35, 0x8F88, 0x5F36, 0x8F89,\t0x5F37, 0x8F8A, 0x5F38, 0x8F8B, 0x5F39, 0xB5AF, 0x5F3A, 0xC7BF,\n\t0x5F3B, 0x8F8C, 0x5F3C, 0xE5F6, 0x5F3D, 0x8F8D, 0x5F3E, 0x8F8E,\t0x5F3F, 0x8F8F, 0x5F40, 0xECB0, 0x5F41, 0x8F90, 0x5F42, 0x8F91,\n\t0x5F43, 0x8F92, 0x5F44, 0x8F93, 0x5F45, 0x8F94, 0x5F46, 0x8F95,\t0x5F47, 0x8F96, 0x5F48, 0x8F97, 0x5F49, 0x8F98, 0x5F4A, 0x8F99,\n\t0x5F4B, 0x8F9A, 0x5F4C, 0x8F9B, 0x5F4D, 0x8F9C, 0x5F4E, 0x8F9D,\t0x5F4F, 0x8F9E, 0x5F50, 0xE5E6, 0x5F51, 0x8F9F, 0x5F52, 0xB9E9,\n\t0x5F53, 0xB5B1, 0x5F54, 0x8FA0, 0x5F55, 0xC2BC, 0x5F56, 0xE5E8,\t0x5F57, 0xE5E7, 0x5F58, 0xE5E9, 0x5F59, 0x8FA1, 0x5F5A, 0x8FA2,\n\t0x5F5B, 0x8FA3, 0x5F5C, 0x8FA4, 0x5F5D, 0xD2CD, 0x5F5E, 0x8FA5,\t0x5F5F, 0x8FA6, 0x5F60, 0x8FA7, 0x5F61, 0xE1EA, 0x5F62, 0xD0CE,\n\t0x5F63, 0x8FA8, 0x5F64, 0xCDAE, 0x5F65, 0x8FA9, 0x5F66, 0xD1E5,\t0x5F67, 0x8FAA, 0x5F68, 0x8FAB, 0x5F69, 0xB2CA, 0x5F6A, 0xB1EB,\n\t0x5F6B, 0x8FAC, 0x5F6C, 0xB1F2, 0x5F6D, 0xC5ED, 0x5F6E, 0x8FAD,\t0x5F6F, 0x8FAE, 0x5F70, 0xD5C3, 0x5F71, 0xD3B0, 0x5F72, 0x8FAF,\n\t0x5F73, 0xE1DC, 0x5F74, 0x8FB0, 0x5F75, 0x8FB1, 0x5F76, 0x8FB2,\t0x5F77, 0xE1DD, 0x5F78, 0x8FB3, 0x5F79, 0xD2DB, 0x5F7A, 0x8FB4,\n\t0x5F7B, 0xB3B9, 0x5F7C, 0xB1CB, 0x5F7D, 0x8FB5, 0x5F7E, 0x8FB6,\t0x5F7F, 0x8FB7, 0x5F80, 0xCDF9, 0x5F81, 0xD5F7, 0x5F82, 0xE1DE,\n\t0x5F83, 0x8FB8, 0x5F84, 0xBEB6, 0x5F85, 0xB4FD, 0x5F86, 0x8FB9,\t0x5F87, 0xE1DF, 0x5F88, 0xBADC, 0x5F89, 0xE1E0, 0x5F8A, 0xBBB2,\n\t0x5F8B, 0xC2C9, 0x5F8C, 0xE1E1, 0x5F8D, 0x8FBA, 0x5F8E, 0x8FBB,\t0x5F8F, 0x8FBC, 0x5F90, 0xD0EC, 0x5F91, 0x8FBD, 0x5F92, 0xCDBD,\n\t0x5F93, 0x8FBE, 0x5F94, 0x8FBF, 0x5F95, 0xE1E2, 0x5F96, 0x8FC0,\t0x5F97, 0xB5C3, 0x5F98, 0xC5C7, 0x5F99, 0xE1E3, 0x5F9A, 0x8FC1,\n\t0x5F9B, 0x8FC2, 0x5F9C, 0xE1E4, 0x5F9D, 0x8FC3, 0x5F9E, 0x8FC4,\t0x5F9F, 0x8FC5, 0x5FA0, 0x8FC6, 0x5FA1, 0xD3F9, 0x5FA2, 0x8FC7,\n\t0x5FA3, 0x8FC8, 0x5FA4, 0x8FC9, 0x5FA5, 0x8FCA, 0x5FA6, 0x8FCB,\t0x5FA7, 0x8FCC, 0x5FA8, 0xE1E5, 0x5FA9, 0x8FCD, 0x5FAA, 0xD1AD,\n\t0x5FAB, 0x8FCE, 0x5FAC, 0x8FCF, 0x5FAD, 0xE1E6, 0x5FAE, 0xCEA2,\t0x5FAF, 0x8FD0, 0x5FB0, 0x8FD1, 0x5FB1, 0x8FD2, 0x5FB2, 0x8FD3,\n\t0x5FB3, 0x8FD4, 0x5FB4, 0x8FD5, 0x5FB5, 0xE1E7, 0x5FB6, 0x8FD6,\t0x5FB7, 0xB5C2, 0x5FB8, 0x8FD7, 0x5FB9, 0x8FD8, 0x5FBA, 0x8FD9,\n\t0x5FBB, 0x8FDA, 0x5FBC, 0xE1E8, 0x5FBD, 0xBBD5, 0x5FBE, 0x8FDB,\t0x5FBF, 0x8FDC, 0x5FC0, 0x8FDD, 0x5FC1, 0x8FDE, 0x5FC2, 0x8FDF,\n\t0x5FC3, 0xD0C4, 0x5FC4, 0xE2E0, 0x5FC5, 0xB1D8, 0x5FC6, 0xD2E4,\t0x5FC7, 0x8FE0, 0x5FC8, 0x8FE1, 0x5FC9, 0xE2E1, 0x5FCA, 0x8FE2,\n\t0x5FCB, 0x8FE3, 0x5FCC, 0xBCC9, 0x5FCD, 0xC8CC, 0x5FCE, 0x8FE4,\t0x5FCF, 0xE2E3, 0x5FD0, 0xECFE, 0x5FD1, 0xECFD, 0x5FD2, 0xDFAF,\n\t0x5FD3, 0x8FE5, 0x5FD4, 0x8FE6, 0x5FD5, 0x8FE7, 0x5FD6, 0xE2E2,\t0x5FD7, 0xD6BE, 0x5FD8, 0xCDFC, 0x5FD9, 0xC3A6, 0x5FDA, 0x8FE8,\n\t0x5FDB, 0x8FE9, 0x5FDC, 0x8FEA, 0x5FDD, 0xE3C3, 0x5FDE, 0x8FEB,\t0x5FDF, 0x8FEC, 0x5FE0, 0xD6D2, 0x5FE1, 0xE2E7, 0x5FE2, 0x8FED,\n\t0x5FE3, 0x8FEE, 0x5FE4, 0xE2E8, 0x5FE5, 0x8FEF, 0x5FE6, 0x8FF0,\t0x5FE7, 0xD3C7, 0x5FE8, 0x8FF1, 0x5FE9, 0x8FF2, 0x5FEA, 0xE2EC,\n\t0x5FEB, 0xBFEC, 0x5FEC, 0x8FF3, 0x5FED, 0xE2ED, 0x5FEE, 0xE2E5,\t0x5FEF, 0x8FF4, 0x5FF0, 0x8FF5, 0x5FF1, 0xB3C0, 0x5FF2, 0x8FF6,\n\t0x5FF3, 0x8FF7, 0x5FF4, 0x8FF8, 0x5FF5, 0xC4EE, 0x5FF6, 0x8FF9,\t0x5FF7, 0x8FFA, 0x5FF8, 0xE2EE, 0x5FF9, 0x8FFB, 0x5FFA, 0x8FFC,\n\t0x5FFB, 0xD0C3, 0x5FFC, 0x8FFD, 0x5FFD, 0xBAF6, 0x5FFE, 0xE2E9,\t0x5FFF, 0xB7DE, 0x6000, 0xBBB3, 0x6001, 0xCCAC, 0x6002, 0xCBCB,\n\t0x6003, 0xE2E4, 0x6004, 0xE2E6, 0x6005, 0xE2EA, 0x6006, 0xE2EB,\t0x6007, 0x8FFE, 0x6008, 0x9040, 0x6009, 0x9041, 0x600A, 0xE2F7,\n\t0x600B, 0x9042, 0x600C, 0x9043, 0x600D, 0xE2F4, 0x600E, 0xD4F5,\t0x600F, 0xE2F3, 0x6010, 0x9044, 0x6011, 0x9045, 0x6012, 0xC5AD,\n\t0x6013, 0x9046, 0x6014, 0xD5FA, 0x6015, 0xC5C2, 0x6016, 0xB2C0,\t0x6017, 0x9047, 0x6018, 0x9048, 0x6019, 0xE2EF, 0x601A, 0x9049,\n\t0x601B, 0xE2F2, 0x601C, 0xC1AF, 0x601D, 0xCBBC, 0x601E, 0x904A,\t0x601F, 0x904B, 0x6020, 0xB5A1, 0x6021, 0xE2F9, 0x6022, 0x904C,\n\t0x6023, 0x904D, 0x6024, 0x904E, 0x6025, 0xBCB1, 0x6026, 0xE2F1,\t0x6027, 0xD0D4, 0x6028, 0xD4B9, 0x6029, 0xE2F5, 0x602A, 0xB9D6,\n\t0x602B, 0xE2F6, 0x602C, 0x904F, 0x602D, 0x9050, 0x602E, 0x9051,\t0x602F, 0xC7D3, 0x6030, 0x9052, 0x6031, 0x9053, 0x6032, 0x9054,\n\t0x6033, 0x9055, 0x6034, 0x9056, 0x6035, 0xE2F0, 0x6036, 0x9057,\t0x6037, 0x9058, 0x6038, 0x9059, 0x6039, 0x905A, 0x603A, 0x905B,\n\t0x603B, 0xD7DC, 0x603C, 0xEDA1, 0x603D, 0x905C, 0x603E, 0x905D,\t0x603F, 0xE2F8, 0x6040, 0x905E, 0x6041, 0xEDA5, 0x6042, 0xE2FE,\n\t0x6043, 0xCAD1, 0x6044, 0x905F, 0x6045, 0x9060, 0x6046, 0x9061,\t0x6047, 0x9062, 0x6048, 0x9063, 0x6049, 0x9064, 0x604A, 0x9065,\n\t0x604B, 0xC1B5, 0x604C, 0x9066, 0x604D, 0xBBD0, 0x604E, 0x9067,\t0x604F, 0x9068, 0x6050, 0xBFD6, 0x6051, 0x9069, 0x6052, 0xBAE3,\n\t0x6053, 0x906A, 0x6054, 0x906B, 0x6055, 0xCBA1, 0x6056, 0x906C,\t0x6057, 0x906D, 0x6058, 0x906E, 0x6059, 0xEDA6, 0x605A, 0xEDA3,\n\t0x605B, 0x906F, 0x605C, 0x9070, 0x605D, 0xEDA2, 0x605E, 0x9071,\t0x605F, 0x9072, 0x6060, 0x9073, 0x6061, 0x9074, 0x6062, 0xBBD6,\n\t0x6063, 0xEDA7, 0x6064, 0xD0F4, 0x6065, 0x9075, 0x6066, 0x9076,\t0x6067, 0xEDA4, 0x6068, 0xBADE, 0x6069, 0xB6F7, 0x606A, 0xE3A1,\n\t0x606B, 0xB6B2, 0x606C, 0xCCF1, 0x606D, 0xB9A7, 0x606E, 0x9077,\t0x606F, 0xCFA2, 0x6070, 0xC7A1, 0x6071, 0x9078, 0x6072, 0x9079,\n\t0x6073, 0xBFD2, 0x6074, 0x907A, 0x6075, 0x907B, 0x6076, 0xB6F1,\t0x6077, 0x907C, 0x6078, 0xE2FA, 0x6079, 0xE2FB, 0x607A, 0xE2FD,\n\t0x607B, 0xE2FC, 0x607C, 0xC4D5, 0x607D, 0xE3A2, 0x607E, 0x907D,\t0x607F, 0xD3C1, 0x6080, 0x907E, 0x6081, 0x9080, 0x6082, 0x9081,\n\t0x6083, 0xE3A7, 0x6084, 0xC7C4, 0x6085, 0x9082, 0x6086, 0x9083,\t0x6087, 0x9084, 0x6088, 0x9085, 0x6089, 0xCFA4, 0x608A, 0x9086,\n\t0x608B, 0x9087, 0x608C, 0xE3A9, 0x608D, 0xBAB7, 0x608E, 0x9088,\t0x608F, 0x9089, 0x6090, 0x908A, 0x6091, 0x908B, 0x6092, 0xE3A8,\n\t0x6093, 0x908C, 0x6094, 0xBBDA, 0x6095, 0x908D, 0x6096, 0xE3A3,\t0x6097, 0x908E, 0x6098, 0x908F, 0x6099, 0x9090, 0x609A, 0xE3A4,\n\t0x609B, 0xE3AA, 0x609C, 0x9091, 0x609D, 0xE3A6, 0x609E, 0x9092,\t0x609F, 0xCEF2, 0x60A0, 0xD3C6, 0x60A1, 0x9093, 0x60A2, 0x9094,\n\t0x60A3, 0xBBBC, 0x60A4, 0x9095, 0x60A5, 0x9096, 0x60A6, 0xD4C3,\t0x60A7, 0x9097, 0x60A8, 0xC4FA, 0x60A9, 0x9098, 0x60AA, 0x9099,\n\t0x60AB, 0xEDA8, 0x60AC, 0xD0FC, 0x60AD, 0xE3A5, 0x60AE, 0x909A,\t0x60AF, 0xC3F5, 0x60B0, 0x909B, 0x60B1, 0xE3AD, 0x60B2, 0xB1AF,\n\t0x60B3, 0x909C, 0x60B4, 0xE3B2, 0x60B5, 0x909D, 0x60B6, 0x909E,\t0x60B7, 0x909F, 0x60B8, 0xBCC2, 0x60B9, 0x90A0, 0x60BA, 0x90A1,\n\t0x60BB, 0xE3AC, 0x60BC, 0xB5BF, 0x60BD, 0x90A2, 0x60BE, 0x90A3,\t0x60BF, 0x90A4, 0x60C0, 0x90A5, 0x60C1, 0x90A6, 0x60C2, 0x90A7,\n\t0x60C3, 0x90A8, 0x60C4, 0x90A9, 0x60C5, 0xC7E9, 0x60C6, 0xE3B0,\t0x60C7, 0x90AA, 0x60C8, 0x90AB, 0x60C9, 0x90AC, 0x60CA, 0xBEAA,\n\t0x60CB, 0xCDEF, 0x60CC, 0x90AD, 0x60CD, 0x90AE, 0x60CE, 0x90AF,\t0x60CF, 0x90B0, 0x60D0, 0x90B1, 0x60D1, 0xBBF3, 0x60D2, 0x90B2,\n\t0x60D3, 0x90B3, 0x60D4, 0x90B4, 0x60D5, 0xCCE8, 0x60D6, 0x90B5,\t0x60D7, 0x90B6, 0x60D8, 0xE3AF, 0x60D9, 0x90B7, 0x60DA, 0xE3B1,\n\t0x60DB, 0x90B8, 0x60DC, 0xCFA7, 0x60DD, 0xE3AE, 0x60DE, 0x90B9,\t0x60DF, 0xCEA9, 0x60E0, 0xBBDD, 0x60E1, 0x90BA, 0x60E2, 0x90BB,\n\t0x60E3, 0x90BC, 0x60E4, 0x90BD, 0x60E5, 0x90BE, 0x60E6, 0xB5EB,\t0x60E7, 0xBEE5, 0x60E8, 0xB2D2, 0x60E9, 0xB3CD, 0x60EA, 0x90BF,\n\t0x60EB, 0xB1B9, 0x60EC, 0xE3AB, 0x60ED, 0xB2D1, 0x60EE, 0xB5AC,\t0x60EF, 0xB9DF, 0x60F0, 0xB6E8, 0x60F1, 0x90C0, 0x60F2, 0x90C1,\n\t0x60F3, 0xCFEB, 0x60F4, 0xE3B7, 0x60F5, 0x90C2, 0x60F6, 0xBBCC,\t0x60F7, 0x90C3, 0x60F8, 0x90C4, 0x60F9, 0xC8C7, 0x60FA, 0xD0CA,\n\t0x60FB, 0x90C5, 0x60FC, 0x90C6, 0x60FD, 0x90C7, 0x60FE, 0x90C8,\t0x60FF, 0x90C9, 0x6100, 0xE3B8, 0x6101, 0xB3EE, 0x6102, 0x90CA,\n\t0x6103, 0x90CB, 0x6104, 0x90CC, 0x6105, 0x90CD, 0x6106, 0xEDA9,\t0x6107, 0x90CE, 0x6108, 0xD3FA, 0x6109, 0xD3E4, 0x610A, 0x90CF,\n\t0x610B, 0x90D0, 0x610C, 0x90D1, 0x610D, 0xEDAA, 0x610E, 0xE3B9,\t0x610F, 0xD2E2, 0x6110, 0x90D2, 0x6111, 0x90D3, 0x6112, 0x90D4,\n\t0x6113, 0x90D5, 0x6114, 0x90D6, 0x6115, 0xE3B5, 0x6116, 0x90D7,\t0x6117, 0x90D8, 0x6118, 0x90D9, 0x6119, 0x90DA, 0x611A, 0xD3DE,\n\t0x611B, 0x90DB, 0x611C, 0x90DC, 0x611D, 0x90DD, 0x611E, 0x90DE,\t0x611F, 0xB8D0, 0x6120, 0xE3B3, 0x6121, 0x90DF, 0x6122, 0x90E0,\n\t0x6123, 0xE3B6, 0x6124, 0xB7DF, 0x6125, 0x90E1, 0x6126, 0xE3B4,\t0x6127, 0xC0A2, 0x6128, 0x90E2, 0x6129, 0x90E3, 0x612A, 0x90E4,\n\t0x612B, 0xE3BA, 0x612C, 0x90E5, 0x612D, 0x90E6, 0x612E, 0x90E7,\t0x612F, 0x90E8, 0x6130, 0x90E9, 0x6131, 0x90EA, 0x6132, 0x90EB,\n\t0x6133, 0x90EC, 0x6134, 0x90ED, 0x6135, 0x90EE, 0x6136, 0x90EF,\t0x6137, 0x90F0, 0x6138, 0x90F1, 0x6139, 0x90F2, 0x613A, 0x90F3,\n\t0x613B, 0x90F4, 0x613C, 0x90F5, 0x613D, 0x90F6, 0x613E, 0x90F7,\t0x613F, 0xD4B8, 0x6140, 0x90F8, 0x6141, 0x90F9, 0x6142, 0x90FA,\n\t0x6143, 0x90FB, 0x6144, 0x90FC, 0x6145, 0x90FD, 0x6146, 0x90FE,\t0x6147, 0x9140, 0x6148, 0xB4C8, 0x6149, 0x9141, 0x614A, 0xE3BB,\n\t0x614B, 0x9142, 0x614C, 0xBBC5, 0x614D, 0x9143, 0x614E, 0xC9F7,\t0x614F, 0x9144, 0x6150, 0x9145, 0x6151, 0xC9E5, 0x6152, 0x9146,\n\t0x6153, 0x9147, 0x6154, 0x9148, 0x6155, 0xC4BD, 0x6156, 0x9149,\t0x6157, 0x914A, 0x6158, 0x914B, 0x6159, 0x914C, 0x615A, 0x914D,\n\t0x615B, 0x914E, 0x615C, 0x914F, 0x615D, 0xEDAB, 0x615E, 0x9150,\t0x615F, 0x9151, 0x6160, 0x9152, 0x6161, 0x9153, 0x6162, 0xC2FD,\n\t0x6163, 0x9154, 0x6164, 0x9155, 0x6165, 0x9156, 0x6166, 0x9157,\t0x6167, 0xBBDB, 0x6168, 0xBFAE, 0x6169, 0x9158, 0x616A, 0x9159,\n\t0x616B, 0x915A, 0x616C, 0x915B, 0x616D, 0x915C, 0x616E, 0x915D,\t0x616F, 0x915E, 0x6170, 0xCEBF, 0x6171, 0x915F, 0x6172, 0x9160,\n\t0x6173, 0x9161, 0x6174, 0x9162, 0x6175, 0xE3BC, 0x6176, 0x9163,\t0x6177, 0xBFB6, 0x6178, 0x9164, 0x6179, 0x9165, 0x617A, 0x9166,\n\t0x617B, 0x9167, 0x617C, 0x9168, 0x617D, 0x9169, 0x617E, 0x916A,\t0x617F, 0x916B, 0x6180, 0x916C, 0x6181, 0x916D, 0x6182, 0x916E,\n\t0x6183, 0x916F, 0x6184, 0x9170, 0x6185, 0x9171, 0x6186, 0x9172,\t0x6187, 0x9173, 0x6188, 0x9174, 0x6189, 0x9175, 0x618A, 0x9176,\n\t0x618B, 0xB1EF, 0x618C, 0x9177, 0x618D, 0x9178, 0x618E, 0xD4F7,\t0x618F, 0x9179, 0x6190, 0x917A, 0x6191, 0x917B, 0x6192, 0x917C,\n\t0x6193, 0x917D, 0x6194, 0xE3BE, 0x6195, 0x917E, 0x6196, 0x9180,\t0x6197, 0x9181, 0x6198, 0x9182, 0x6199, 0x9183, 0x619A, 0x9184,\n\t0x619B, 0x9185, 0x619C, 0x9186, 0x619D, 0xEDAD, 0x619E, 0x9187,\t0x619F, 0x9188, 0x61A0, 0x9189, 0x61A1, 0x918A, 0x61A2, 0x918B,\n\t0x61A3, 0x918C, 0x61A4, 0x918D, 0x61A5, 0x918E, 0x61A6, 0x918F,\t0x61A7, 0xE3BF, 0x61A8, 0xBAA9, 0x61A9, 0xEDAC, 0x61AA, 0x9190,\n\t0x61AB, 0x9191, 0x61AC, 0xE3BD, 0x61AD, 0x9192, 0x61AE, 0x9193,\t0x61AF, 0x9194, 0x61B0, 0x9195, 0x61B1, 0x9196, 0x61B2, 0x9197,\n\t0x61B3, 0x9198, 0x61B4, 0x9199, 0x61B5, 0x919A, 0x61B6, 0x919B,\t0x61B7, 0xE3C0, 0x61B8, 0x919C, 0x61B9, 0x919D, 0x61BA, 0x919E,\n\t0x61BB, 0x919F, 0x61BC, 0x91A0, 0x61BD, 0x91A1, 0x61BE, 0xBAB6,\t0x61BF, 0x91A2, 0x61C0, 0x91A3, 0x61C1, 0x91A4, 0x61C2, 0xB6AE,\n\t0x61C3, 0x91A5, 0x61C4, 0x91A6, 0x61C5, 0x91A7, 0x61C6, 0x91A8,\t0x61C7, 0x91A9, 0x61C8, 0xD0B8, 0x61C9, 0x91AA, 0x61CA, 0xB0C3,\n\t0x61CB, 0xEDAE, 0x61CC, 0x91AB, 0x61CD, 0x91AC, 0x61CE, 0x91AD,\t0x61CF, 0x91AE, 0x61D0, 0x91AF, 0x61D1, 0xEDAF, 0x61D2, 0xC0C1,\n\t0x61D3, 0x91B0, 0x61D4, 0xE3C1, 0x61D5, 0x91B1, 0x61D6, 0x91B2,\t0x61D7, 0x91B3, 0x61D8, 0x91B4, 0x61D9, 0x91B5, 0x61DA, 0x91B6,\n\t0x61DB, 0x91B7, 0x61DC, 0x91B8, 0x61DD, 0x91B9, 0x61DE, 0x91BA,\t0x61DF, 0x91BB, 0x61E0, 0x91BC, 0x61E1, 0x91BD, 0x61E2, 0x91BE,\n\t0x61E3, 0x91BF, 0x61E4, 0x91C0, 0x61E5, 0x91C1, 0x61E6, 0xC5B3,\t0x61E7, 0x91C2, 0x61E8, 0x91C3, 0x61E9, 0x91C4, 0x61EA, 0x91C5,\n\t0x61EB, 0x91C6, 0x61EC, 0x91C7, 0x61ED, 0x91C8, 0x61EE, 0x91C9,\t0x61EF, 0x91CA, 0x61F0, 0x91CB, 0x61F1, 0x91CC, 0x61F2, 0x91CD,\n\t0x61F3, 0x91CE, 0x61F4, 0x91CF, 0x61F5, 0xE3C2, 0x61F6, 0x91D0,\t0x61F7, 0x91D1, 0x61F8, 0x91D2, 0x61F9, 0x91D3, 0x61FA, 0x91D4,\n\t0x61FB, 0x91D5, 0x61FC, 0x91D6, 0x61FD, 0x91D7, 0x61FE, 0x91D8,\t0x61FF, 0xDCB2, 0x6200, 0x91D9, 0x6201, 0x91DA, 0x6202, 0x91DB,\n\t0x6203, 0x91DC, 0x6204, 0x91DD, 0x6205, 0x91DE, 0x6206, 0xEDB0,\t0x6207, 0x91DF, 0x6208, 0xB8EA, 0x6209, 0x91E0, 0x620A, 0xCEEC,\n\t0x620B, 0xEAA7, 0x620C, 0xD0E7, 0x620D, 0xCAF9, 0x620E, 0xC8D6,\t0x620F, 0xCFB7, 0x6210, 0xB3C9, 0x6211, 0xCED2, 0x6212, 0xBDE4,\n\t0x6213, 0x91E1, 0x6214, 0x91E2, 0x6215, 0xE3DE, 0x6216, 0xBBF2,\t0x6217, 0xEAA8, 0x6218, 0xD5BD, 0x6219, 0x91E3, 0x621A, 0xC6DD,\n\t0x621B, 0xEAA9, 0x621C, 0x91E4, 0x621D, 0x91E5, 0x621E, 0x91E6,\t0x621F, 0xEAAA, 0x6220, 0x91E7, 0x6221, 0xEAAC, 0x6222, 0xEAAB,\n\t0x6223, 0x91E8, 0x6224, 0xEAAE, 0x6225, 0xEAAD, 0x6226, 0x91E9,\t0x6227, 0x91EA, 0x6228, 0x91EB, 0x6229, 0x91EC, 0x622A, 0xBDD8,\n\t0x622B, 0x91ED, 0x622C, 0xEAAF, 0x622D, 0x91EE, 0x622E, 0xC2BE,\t0x622F, 0x91EF, 0x6230, 0x91F0, 0x6231, 0x91F1, 0x6232, 0x91F2,\n\t0x6233, 0xB4C1, 0x6234, 0xB4F7, 0x6235, 0x91F3, 0x6236, 0x91F4,\t0x6237, 0xBBA7, 0x6238, 0x91F5, 0x6239, 0x91F6, 0x623A, 0x91F7,\n\t0x623B, 0x91F8, 0x623C, 0x91F9, 0x623D, 0xECE6, 0x623E, 0xECE5,\t0x623F, 0xB7BF, 0x6240, 0xCBF9, 0x6241, 0xB1E2, 0x6242, 0x91FA,\n\t0x6243, 0xECE7, 0x6244, 0x91FB, 0x6245, 0x91FC, 0x6246, 0x91FD,\t0x6247, 0xC9C8, 0x6248, 0xECE8, 0x6249, 0xECE9, 0x624A, 0x91FE,\n\t0x624B, 0xCAD6, 0x624C, 0xDED0, 0x624D, 0xB2C5, 0x624E, 0xD4FA,\t0x624F, 0x9240, 0x6250, 0x9241, 0x6251, 0xC6CB, 0x6252, 0xB0C7,\n\t0x6253, 0xB4F2, 0x6254, 0xC8D3, 0x6255, 0x9242, 0x6256, 0x9243,\t0x6257, 0x9244, 0x6258, 0xCDD0, 0x6259, 0x9245, 0x625A, 0x9246,\n\t0x625B, 0xBFB8, 0x625C, 0x9247, 0x625D, 0x9248, 0x625E, 0x9249,\t0x625F, 0x924A, 0x6260, 0x924B, 0x6261, 0x924C, 0x6262, 0x924D,\n\t0x6263, 0xBFDB, 0x6264, 0x924E, 0x6265, 0x924F, 0x6266, 0xC7A4,\t0x6267, 0xD6B4, 0x6268, 0x9250, 0x6269, 0xC0A9, 0x626A, 0xDED1,\n\t0x626B, 0xC9A8, 0x626C, 0xD1EF, 0x626D, 0xC5A4, 0x626E, 0xB0E7,\t0x626F, 0xB3B6, 0x6270, 0xC8C5, 0x6271, 0x9251, 0x6272, 0x9252,\n\t0x6273, 0xB0E2, 0x6274, 0x9253, 0x6275, 0x9254, 0x6276, 0xB7F6,\t0x6277, 0x9255, 0x6278, 0x9256, 0x6279, 0xC5FA, 0x627A, 0x9257,\n\t0x627B, 0x9258, 0x627C, 0xB6F3, 0x627D, 0x9259, 0x627E, 0xD5D2,\t0x627F, 0xB3D0, 0x6280, 0xBCBC, 0x6281, 0x925A, 0x6282, 0x925B,\n\t0x6283, 0x925C, 0x6284, 0xB3AD, 0x6285, 0x925D, 0x6286, 0x925E,\t0x6287, 0x925F, 0x6288, 0x9260, 0x6289, 0xBEF1, 0x628A, 0xB0D1,\n\t0x628B, 0x9261, 0x628C, 0x9262, 0x628D, 0x9263, 0x628E, 0x9264,\t0x628F, 0x9265, 0x6290, 0x9266, 0x6291, 0xD2D6, 0x6292, 0xCAE3,\n\t0x6293, 0xD7A5, 0x6294, 0x9267, 0x6295, 0xCDB6, 0x6296, 0xB6B6,\t0x6297, 0xBFB9, 0x6298, 0xD5DB, 0x6299, 0x9268, 0x629A, 0xB8A7,\n\t0x629B, 0xC5D7, 0x629C, 0x9269, 0x629D, 0x926A, 0x629E, 0x926B,\t0x629F, 0xDED2, 0x62A0, 0xBFD9, 0x62A1, 0xC2D5, 0x62A2, 0xC7C0,\n\t0x62A3, 0x926C, 0x62A4, 0xBBA4, 0x62A5, 0xB1A8, 0x62A6, 0x926D,\t0x62A7, 0x926E, 0x62A8, 0xC5EA, 0x62A9, 0x926F, 0x62AA, 0x9270,\n\t0x62AB, 0xC5FB, 0x62AC, 0xCCA7, 0x62AD, 0x9271, 0x62AE, 0x9272,\t0x62AF, 0x9273, 0x62B0, 0x9274, 0x62B1, 0xB1A7, 0x62B2, 0x9275,\n\t0x62B3, 0x9276, 0x62B4, 0x9277, 0x62B5, 0xB5D6, 0x62B6, 0x9278,\t0x62B7, 0x9279, 0x62B8, 0x927A, 0x62B9, 0xC4A8, 0x62BA, 0x927B,\n\t0x62BB, 0xDED3, 0x62BC, 0xD1BA, 0x62BD, 0xB3E9, 0x62BE, 0x927C,\t0x62BF, 0xC3F2, 0x62C0, 0x927D, 0x62C1, 0x927E, 0x62C2, 0xB7F7,\n\t0x62C3, 0x9280, 0x62C4, 0xD6F4, 0x62C5, 0xB5A3, 0x62C6, 0xB2F0,\t0x62C7, 0xC4B4, 0x62C8, 0xC4E9, 0x62C9, 0xC0AD, 0x62CA, 0xDED4,\n\t0x62CB, 0x9281, 0x62CC, 0xB0E8, 0x62CD, 0xC5C4, 0x62CE, 0xC1E0,\t0x62CF, 0x9282, 0x62D0, 0xB9D5, 0x62D1, 0x9283, 0x62D2, 0xBEDC,\n\t0x62D3, 0xCDD8, 0x62D4, 0xB0CE, 0x62D5, 0x9284, 0x62D6, 0xCDCF,\t0x62D7, 0xDED6, 0x62D8, 0xBED0, 0x62D9, 0xD7BE, 0x62DA, 0xDED5,\n\t0x62DB, 0xD5D0, 0x62DC, 0xB0DD, 0x62DD, 0x9285, 0x62DE, 0x9286,\t0x62DF, 0xC4E2, 0x62E0, 0x9287, 0x62E1, 0x9288, 0x62E2, 0xC2A3,\n\t0x62E3, 0xBCF0, 0x62E4, 0x9289, 0x62E5, 0xD3B5, 0x62E6, 0xC0B9,\t0x62E7, 0xC5A1, 0x62E8, 0xB2A6, 0x62E9, 0xD4F1, 0x62EA, 0x928A,\n\t0x62EB, 0x928B, 0x62EC, 0xC0A8, 0x62ED, 0xCAC3, 0x62EE, 0xDED7,\t0x62EF, 0xD5FC, 0x62F0, 0x928C, 0x62F1, 0xB9B0, 0x62F2, 0x928D,\n\t0x62F3, 0xC8AD, 0x62F4, 0xCBA9, 0x62F5, 0x928E, 0x62F6, 0xDED9,\t0x62F7, 0xBFBD, 0x62F8, 0x928F, 0x62F9, 0x9290, 0x62FA, 0x9291,\n\t0x62FB, 0x9292, 0x62FC, 0xC6B4, 0x62FD, 0xD7A7, 0x62FE, 0xCAB0,\t0x62FF, 0xC4C3, 0x6300, 0x9293, 0x6301, 0xB3D6, 0x6302, 0xB9D2,\n\t0x6303, 0x9294, 0x6304, 0x9295, 0x6305, 0x9296, 0x6306, 0x9297,\t0x6307, 0xD6B8, 0x6308, 0xEAFC, 0x6309, 0xB0B4, 0x630A, 0x9298,\n\t0x630B, 0x9299, 0x630C, 0x929A, 0x630D, 0x929B, 0x630E, 0xBFE6,\t0x630F, 0x929C, 0x6310, 0x929D, 0x6311, 0xCCF4, 0x6312, 0x929E,\n\t0x6313, 0x929F, 0x6314, 0x92A0, 0x6315, 0x92A1, 0x6316, 0xCDDA,\t0x6317, 0x92A2, 0x6318, 0x92A3, 0x6319, 0x92A4, 0x631A, 0xD6BF,\n\t0x631B, 0xC2CE, 0x631C, 0x92A5, 0x631D, 0xCECE, 0x631E, 0xCCA2,\t0x631F, 0xD0AE, 0x6320, 0xC4D3, 0x6321, 0xB5B2, 0x6322, 0xDED8,\n\t0x6323, 0xD5F5, 0x6324, 0xBCB7, 0x6325, 0xBBD3, 0x6326, 0x92A6,\t0x6327, 0x92A7, 0x6328, 0xB0A4, 0x6329, 0x92A8, 0x632A, 0xC5B2,\n\t0x632B, 0xB4EC, 0x632C, 0x92A9, 0x632D, 0x92AA, 0x632E, 0x92AB,\t0x632F, 0xD5F1, 0x6330, 0x92AC, 0x6331, 0x92AD, 0x6332, 0xEAFD,\n\t0x6333, 0x92AE, 0x6334, 0x92AF, 0x6335, 0x92B0, 0x6336, 0x92B1,\t0x6337, 0x92B2, 0x6338, 0x92B3, 0x6339, 0xDEDA, 0x633A, 0xCDA6,\n\t0x633B, 0x92B4, 0x633C, 0x92B5, 0x633D, 0xCDEC, 0x633E, 0x92B6,\t0x633F, 0x92B7, 0x6340, 0x92B8, 0x6341, 0x92B9, 0x6342, 0xCEE6,\n\t0x6343, 0xDEDC, 0x6344, 0x92BA, 0x6345, 0xCDB1, 0x6346, 0xC0A6,\t0x6347, 0x92BB, 0x6348, 0x92BC, 0x6349, 0xD7BD, 0x634A, 0x92BD,\n\t0x634B, 0xDEDB, 0x634C, 0xB0C6, 0x634D, 0xBAB4, 0x634E, 0xC9D3,\t0x634F, 0xC4F3, 0x6350, 0xBEE8, 0x6351, 0x92BE, 0x6352, 0x92BF,\n\t0x6353, 0x92C0, 0x6354, 0x92C1, 0x6355, 0xB2B6, 0x6356, 0x92C2,\t0x6357, 0x92C3, 0x6358, 0x92C4, 0x6359, 0x92C5, 0x635A, 0x92C6,\n\t0x635B, 0x92C7, 0x635C, 0x92C8, 0x635D, 0x92C9, 0x635E, 0xC0CC,\t0x635F, 0xCBF0, 0x6360, 0x92CA, 0x6361, 0xBCF1, 0x6362, 0xBBBB,\n\t0x6363, 0xB5B7, 0x6364, 0x92CB, 0x6365, 0x92CC, 0x6366, 0x92CD,\t0x6367, 0xC5F5, 0x6368, 0x92CE, 0x6369, 0xDEE6, 0x636A, 0x92CF,\n\t0x636B, 0x92D0, 0x636C, 0x92D1, 0x636D, 0xDEE3, 0x636E, 0xBEDD,\t0x636F, 0x92D2, 0x6370, 0x92D3, 0x6371, 0xDEDF, 0x6372, 0x92D4,\n\t0x6373, 0x92D5, 0x6374, 0x92D6, 0x6375, 0x92D7, 0x6376, 0xB4B7,\t0x6377, 0xBDDD, 0x6378, 0x92D8, 0x6379, 0x92D9, 0x637A, 0xDEE0,\n\t0x637B, 0xC4ED, 0x637C, 0x92DA, 0x637D, 0x92DB, 0x637E, 0x92DC,\t0x637F, 0x92DD, 0x6380, 0xCFC6, 0x6381, 0x92DE, 0x6382, 0xB5E0,\n\t0x6383, 0x92DF, 0x6384, 0x92E0, 0x6385, 0x92E1, 0x6386, 0x92E2,\t0x6387, 0xB6DE, 0x6388, 0xCADA, 0x6389, 0xB5F4, 0x638A, 0xDEE5,\n\t0x638B, 0x92E3, 0x638C, 0xD5C6, 0x638D, 0x92E4, 0x638E, 0xDEE1,\t0x638F, 0xCCCD, 0x6390, 0xC6FE, 0x6391, 0x92E5, 0x6392, 0xC5C5,\n\t0x6393, 0x92E6, 0x6394, 0x92E7, 0x6395, 0x92E8, 0x6396, 0xD2B4,\t0x6397, 0x92E9, 0x6398, 0xBEF2, 0x6399, 0x92EA, 0x639A, 0x92EB,\n\t0x639B, 0x92EC, 0x639C, 0x92ED, 0x639D, 0x92EE, 0x639E, 0x92EF,\t0x639F, 0x92F0, 0x63A0, 0xC2D3, 0x63A1, 0x92F1, 0x63A2, 0xCCBD,\n\t0x63A3, 0xB3B8, 0x63A4, 0x92F2, 0x63A5, 0xBDD3, 0x63A6, 0x92F3,\t0x63A7, 0xBFD8, 0x63A8, 0xCDC6, 0x63A9, 0xD1DA, 0x63AA, 0xB4EB,\n\t0x63AB, 0x92F4, 0x63AC, 0xDEE4, 0x63AD, 0xDEDD, 0x63AE, 0xDEE7,\t0x63AF, 0x92F5, 0x63B0, 0xEAFE, 0x63B1, 0x92F6, 0x63B2, 0x92F7,\n\t0x63B3, 0xC2B0, 0x63B4, 0xDEE2, 0x63B5, 0x92F8, 0x63B6, 0x92F9,\t0x63B7, 0xD6C0, 0x63B8, 0xB5A7, 0x63B9, 0x92FA, 0x63BA, 0xB2F4,\n\t0x63BB, 0x92FB, 0x63BC, 0xDEE8, 0x63BD, 0x92FC, 0x63BE, 0xDEF2,\t0x63BF, 0x92FD, 0x63C0, 0x92FE, 0x63C1, 0x9340, 0x63C2, 0x9341,\n\t0x63C3, 0x9342, 0x63C4, 0xDEED, 0x63C5, 0x9343, 0x63C6, 0xDEF1,\t0x63C7, 0x9344, 0x63C8, 0x9345, 0x63C9, 0xC8E0, 0x63CA, 0x9346,\n\t0x63CB, 0x9347, 0x63CC, 0x9348, 0x63CD, 0xD7E1, 0x63CE, 0xDEEF,\t0x63CF, 0xC3E8, 0x63D0, 0xCCE1, 0x63D1, 0x9349, 0x63D2, 0xB2E5,\n\t0x63D3, 0x934A, 0x63D4, 0x934B, 0x63D5, 0x934C, 0x63D6, 0xD2BE,\t0x63D7, 0x934D, 0x63D8, 0x934E, 0x63D9, 0x934F, 0x63DA, 0x9350,\n\t0x63DB, 0x9351, 0x63DC, 0x9352, 0x63DD, 0x9353, 0x63DE, 0xDEEE,\t0x63DF, 0x9354, 0x63E0, 0xDEEB, 0x63E1, 0xCED5, 0x63E2, 0x9355,\n\t0x63E3, 0xB4A7, 0x63E4, 0x9356, 0x63E5, 0x9357, 0x63E6, 0x9358,\t0x63E7, 0x9359, 0x63E8, 0x935A, 0x63E9, 0xBFAB, 0x63EA, 0xBEBE,\n\t0x63EB, 0x935B, 0x63EC, 0x935C, 0x63ED, 0xBDD2, 0x63EE, 0x935D,\t0x63EF, 0x935E, 0x63F0, 0x935F, 0x63F1, 0x9360, 0x63F2, 0xDEE9,\n\t0x63F3, 0x9361, 0x63F4, 0xD4AE, 0x63F5, 0x9362, 0x63F6, 0xDEDE,\t0x63F7, 0x9363, 0x63F8, 0xDEEA, 0x63F9, 0x9364, 0x63FA, 0x9365,\n\t0x63FB, 0x9366, 0x63FC, 0x9367, 0x63FD, 0xC0BF, 0x63FE, 0x9368,\t0x63FF, 0xDEEC, 0x6400, 0xB2F3, 0x6401, 0xB8E9, 0x6402, 0xC2A7,\n\t0x6403, 0x9369, 0x6404, 0x936A, 0x6405, 0xBDC1, 0x6406, 0x936B,\t0x6407, 0x936C, 0x6408, 0x936D, 0x6409, 0x936E, 0x640A, 0x936F,\n\t0x640B, 0xDEF5, 0x640C, 0xDEF8, 0x640D, 0x9370, 0x640E, 0x9371,\t0x640F, 0xB2AB, 0x6410, 0xB4A4, 0x6411, 0x9372, 0x6412, 0x9373,\n\t0x6413, 0xB4EA, 0x6414, 0xC9A6, 0x6415, 0x9374, 0x6416, 0x9375,\t0x6417, 0x9376, 0x6418, 0x9377, 0x6419, 0x9378, 0x641A, 0x9379,\n\t0x641B, 0xDEF6, 0x641C, 0xCBD1, 0x641D, 0x937A, 0x641E, 0xB8E3,\t0x641F, 0x937B, 0x6420, 0xDEF7, 0x6421, 0xDEFA, 0x6422, 0x937C,\n\t0x6423, 0x937D, 0x6424, 0x937E, 0x6425, 0x9380, 0x6426, 0xDEF9,\t0x6427, 0x9381, 0x6428, 0x9382, 0x6429, 0x9383, 0x642A, 0xCCC2,\n\t0x642B, 0x9384, 0x642C, 0xB0E1, 0x642D, 0xB4EE, 0x642E, 0x9385,\t0x642F, 0x9386, 0x6430, 0x9387, 0x6431, 0x9388, 0x6432, 0x9389,\n\t0x6433, 0x938A, 0x6434, 0xE5BA, 0x6435, 0x938B, 0x6436, 0x938C,\t0x6437, 0x938D, 0x6438, 0x938E, 0x6439, 0x938F, 0x643A, 0xD0AF,\n\t0x643B, 0x9390, 0x643C, 0x9391, 0x643D, 0xB2EB, 0x643E, 0x9392,\t0x643F, 0xEBA1, 0x6440, 0x9393, 0x6441, 0xDEF4, 0x6442, 0x9394,\n\t0x6443, 0x9395, 0x6444, 0xC9E3, 0x6445, 0xDEF3, 0x6446, 0xB0DA,\t0x6447, 0xD2A1, 0x6448, 0xB1F7, 0x6449, 0x9396, 0x644A, 0xCCAF,\n\t0x644B, 0x9397, 0x644C, 0x9398, 0x644D, 0x9399, 0x644E, 0x939A,\t0x644F, 0x939B, 0x6450, 0x939C, 0x6451, 0x939D, 0x6452, 0xDEF0,\n\t0x6453, 0x939E, 0x6454, 0xCBA4, 0x6455, 0x939F, 0x6456, 0x93A0,\t0x6457, 0x93A1, 0x6458, 0xD5AA, 0x6459, 0x93A2, 0x645A, 0x93A3,\n\t0x645B, 0x93A4, 0x645C, 0x93A5, 0x645D, 0x93A6, 0x645E, 0xDEFB,\t0x645F, 0x93A7, 0x6460, 0x93A8, 0x6461, 0x93A9, 0x6462, 0x93AA,\n\t0x6463, 0x93AB, 0x6464, 0x93AC, 0x6465, 0x93AD, 0x6466, 0x93AE,\t0x6467, 0xB4DD, 0x6468, 0x93AF, 0x6469, 0xC4A6, 0x646A, 0x93B0,\n\t0x646B, 0x93B1, 0x646C, 0x93B2, 0x646D, 0xDEFD, 0x646E, 0x93B3,\t0x646F, 0x93B4, 0x6470, 0x93B5, 0x6471, 0x93B6, 0x6472, 0x93B7,\n\t0x6473, 0x93B8, 0x6474, 0x93B9, 0x6475, 0x93BA, 0x6476, 0x93BB,\t0x6477, 0x93BC, 0x6478, 0xC3FE, 0x6479, 0xC4A1, 0x647A, 0xDFA1,\n\t0x647B, 0x93BD, 0x647C, 0x93BE, 0x647D, 0x93BF, 0x647E, 0x93C0,\t0x647F, 0x93C1, 0x6480, 0x93C2, 0x6481, 0x93C3, 0x6482, 0xC1CC,\n\t0x6483, 0x93C4, 0x6484, 0xDEFC, 0x6485, 0xBEEF, 0x6486, 0x93C5,\t0x6487, 0xC6B2, 0x6488, 0x93C6, 0x6489, 0x93C7, 0x648A, 0x93C8,\n\t0x648B, 0x93C9, 0x648C, 0x93CA, 0x648D, 0x93CB, 0x648E, 0x93CC,\t0x648F, 0x93CD, 0x6490, 0x93CE, 0x6491, 0xB3C5, 0x6492, 0xC8F6,\n\t0x6493, 0x93CF, 0x6494, 0x93D0, 0x6495, 0xCBBA, 0x6496, 0xDEFE,\t0x6497, 0x93D1, 0x6498, 0x93D2, 0x6499, 0xDFA4, 0x649A, 0x93D3,\n\t0x649B, 0x93D4, 0x649C, 0x93D5, 0x649D, 0x93D6, 0x649E, 0xD7B2,\t0x649F, 0x93D7, 0x64A0, 0x93D8, 0x64A1, 0x93D9, 0x64A2, 0x93DA,\n\t0x64A3, 0x93DB, 0x64A4, 0xB3B7, 0x64A5, 0x93DC, 0x64A6, 0x93DD,\t0x64A7, 0x93DE, 0x64A8, 0x93DF, 0x64A9, 0xC1C3, 0x64AA, 0x93E0,\n\t0x64AB, 0x93E1, 0x64AC, 0xC7CB, 0x64AD, 0xB2A5, 0x64AE, 0xB4E9,\t0x64AF, 0x93E2, 0x64B0, 0xD7AB, 0x64B1, 0x93E3, 0x64B2, 0x93E4,\n\t0x64B3, 0x93E5, 0x64B4, 0x93E6, 0x64B5, 0xC4EC, 0x64B6, 0x93E7,\t0x64B7, 0xDFA2, 0x64B8, 0xDFA3, 0x64B9, 0x93E8, 0x64BA, 0xDFA5,\n\t0x64BB, 0x93E9, 0x64BC, 0xBAB3, 0x64BD, 0x93EA, 0x64BE, 0x93EB,\t0x64BF, 0x93EC, 0x64C0, 0xDFA6, 0x64C1, 0x93ED, 0x64C2, 0xC0DE,\n\t0x64C3, 0x93EE, 0x64C4, 0x93EF, 0x64C5, 0xC9C3, 0x64C6, 0x93F0,\t0x64C7, 0x93F1, 0x64C8, 0x93F2, 0x64C9, 0x93F3, 0x64CA, 0x93F4,\n\t0x64CB, 0x93F5, 0x64CC, 0x93F6, 0x64CD, 0xB2D9, 0x64CE, 0xC7E6,\t0x64CF, 0x93F7, 0x64D0, 0xDFA7, 0x64D1, 0x93F8, 0x64D2, 0xC7DC,\n\t0x64D3, 0x93F9, 0x64D4, 0x93FA, 0x64D5, 0x93FB, 0x64D6, 0x93FC,\t0x64D7, 0xDFA8, 0x64D8, 0xEBA2, 0x64D9, 0x93FD, 0x64DA, 0x93FE,\n\t0x64DB, 0x9440, 0x64DC, 0x9441, 0x64DD, 0x9442, 0x64DE, 0xCBD3,\t0x64DF, 0x9443, 0x64E0, 0x9444, 0x64E1, 0x9445, 0x64E2, 0xDFAA,\n\t0x64E3, 0x9446, 0x64E4, 0xDFA9, 0x64E5, 0x9447, 0x64E6, 0xB2C1,\t0x64E7, 0x9448, 0x64E8, 0x9449, 0x64E9, 0x944A, 0x64EA, 0x944B,\n\t0x64EB, 0x944C, 0x64EC, 0x944D, 0x64ED, 0x944E, 0x64EE, 0x944F,\t0x64EF, 0x9450, 0x64F0, 0x9451, 0x64F1, 0x9452, 0x64F2, 0x9453,\n\t0x64F3, 0x9454, 0x64F4, 0x9455, 0x64F5, 0x9456, 0x64F6, 0x9457,\t0x64F7, 0x9458, 0x64F8, 0x9459, 0x64F9, 0x945A, 0x64FA, 0x945B,\n\t0x64FB, 0x945C, 0x64FC, 0x945D, 0x64FD, 0x945E, 0x64FE, 0x945F,\t0x64FF, 0x9460, 0x6500, 0xC5CA, 0x6501, 0x9461, 0x6502, 0x9462,\n\t0x6503, 0x9463, 0x6504, 0x9464, 0x6505, 0x9465, 0x6506, 0x9466,\t0x6507, 0x9467, 0x6508, 0x9468, 0x6509, 0xDFAB, 0x650A, 0x9469,\n\t0x650B, 0x946A, 0x650C, 0x946B, 0x650D, 0x946C, 0x650E, 0x946D,\t0x650F, 0x946E, 0x6510, 0x946F, 0x6511, 0x9470, 0x6512, 0xD4DC,\n\t0x6513, 0x9471, 0x6514, 0x9472, 0x6515, 0x9473, 0x6516, 0x9474,\t0x6517, 0x9475, 0x6518, 0xC8C1, 0x6519, 0x9476, 0x651A, 0x9477,\n\t0x651B, 0x9478, 0x651C, 0x9479, 0x651D, 0x947A, 0x651E, 0x947B,\t0x651F, 0x947C, 0x6520, 0x947D, 0x6521, 0x947E, 0x6522, 0x9480,\n\t0x6523, 0x9481, 0x6524, 0x9482, 0x6525, 0xDFAC, 0x6526, 0x9483,\t0x6527, 0x9484, 0x6528, 0x9485, 0x6529, 0x9486, 0x652A, 0x9487,\n\t0x652B, 0xBEF0, 0x652C, 0x9488, 0x652D, 0x9489, 0x652E, 0xDFAD,\t0x652F, 0xD6A7, 0x6530, 0x948A, 0x6531, 0x948B, 0x6532, 0x948C,\n\t0x6533, 0x948D, 0x6534, 0xEAB7, 0x6535, 0xEBB6, 0x6536, 0xCAD5,\t0x6537, 0x948E, 0x6538, 0xD8FC, 0x6539, 0xB8C4, 0x653A, 0x948F,\n\t0x653B, 0xB9A5, 0x653C, 0x9490, 0x653D, 0x9491, 0x653E, 0xB7C5,\t0x653F, 0xD5FE, 0x6540, 0x9492, 0x6541, 0x9493, 0x6542, 0x9494,\n\t0x6543, 0x9495, 0x6544, 0x9496, 0x6545, 0xB9CA, 0x6546, 0x9497,\t0x6547, 0x9498, 0x6548, 0xD0A7, 0x6549, 0xF4CD, 0x654A, 0x9499,\n\t0x654B, 0x949A, 0x654C, 0xB5D0, 0x654D, 0x949B, 0x654E, 0x949C,\t0x654F, 0xC3F4, 0x6550, 0x949D, 0x6551, 0xBEC8, 0x6552, 0x949E,\n\t0x6553, 0x949F, 0x6554, 0x94A0, 0x6555, 0xEBB7, 0x6556, 0xB0BD,\t0x6557, 0x94A1, 0x6558, 0x94A2, 0x6559, 0xBDCC, 0x655A, 0x94A3,\n\t0x655B, 0xC1B2, 0x655C, 0x94A4, 0x655D, 0xB1D6, 0x655E, 0xB3A8,\t0x655F, 0x94A5, 0x6560, 0x94A6, 0x6561, 0x94A7, 0x6562, 0xB8D2,\n\t0x6563, 0xC9A2, 0x6564, 0x94A8, 0x6565, 0x94A9, 0x6566, 0xB6D8,\t0x6567, 0x94AA, 0x6568, 0x94AB, 0x6569, 0x94AC, 0x656A, 0x94AD,\n\t0x656B, 0xEBB8, 0x656C, 0xBEB4, 0x656D, 0x94AE, 0x656E, 0x94AF,\t0x656F, 0x94B0, 0x6570, 0xCAFD, 0x6571, 0x94B1, 0x6572, 0xC7C3,\n\t0x6573, 0x94B2, 0x6574, 0xD5FB, 0x6575, 0x94B3, 0x6576, 0x94B4,\t0x6577, 0xB7F3, 0x6578, 0x94B5, 0x6579, 0x94B6, 0x657A, 0x94B7,\n\t0x657B, 0x94B8, 0x657C, 0x94B9, 0x657D, 0x94BA, 0x657E, 0x94BB,\t0x657F, 0x94BC, 0x6580, 0x94BD, 0x6581, 0x94BE, 0x6582, 0x94BF,\n\t0x6583, 0x94C0, 0x6584, 0x94C1, 0x6585, 0x94C2, 0x6586, 0x94C3,\t0x6587, 0xCEC4, 0x6588, 0x94C4, 0x6589, 0x94C5, 0x658A, 0x94C6,\n\t0x658B, 0xD5AB, 0x658C, 0xB1F3, 0x658D, 0x94C7, 0x658E, 0x94C8,\t0x658F, 0x94C9, 0x6590, 0xECB3, 0x6591, 0xB0DF, 0x6592, 0x94CA,\n\t0x6593, 0xECB5, 0x6594, 0x94CB, 0x6595, 0x94CC, 0x6596, 0x94CD,\t0x6597, 0xB6B7, 0x6598, 0x94CE, 0x6599, 0xC1CF, 0x659A, 0x94CF,\n\t0x659B, 0xF5FA, 0x659C, 0xD0B1, 0x659D, 0x94D0, 0x659E, 0x94D1,\t0x659F, 0xD5E5, 0x65A0, 0x94D2, 0x65A1, 0xCED3, 0x65A2, 0x94D3,\n\t0x65A3, 0x94D4, 0x65A4, 0xBDEF, 0x65A5, 0xB3E2, 0x65A6, 0x94D5,\t0x65A7, 0xB8AB, 0x65A8, 0x94D6, 0x65A9, 0xD5B6, 0x65AA, 0x94D7,\n\t0x65AB, 0xEDBD, 0x65AC, 0x94D8, 0x65AD, 0xB6CF, 0x65AE, 0x94D9,\t0x65AF, 0xCBB9, 0x65B0, 0xD0C2, 0x65B1, 0x94DA, 0x65B2, 0x94DB,\n\t0x65B3, 0x94DC, 0x65B4, 0x94DD, 0x65B5, 0x94DE, 0x65B6, 0x94DF,\t0x65B7, 0x94E0, 0x65B8, 0x94E1, 0x65B9, 0xB7BD, 0x65BA, 0x94E2,\n\t0x65BB, 0x94E3, 0x65BC, 0xECB6, 0x65BD, 0xCAA9, 0x65BE, 0x94E4,\t0x65BF, 0x94E5, 0x65C0, 0x94E6, 0x65C1, 0xC5D4, 0x65C2, 0x94E7,\n\t0x65C3, 0xECB9, 0x65C4, 0xECB8, 0x65C5, 0xC2C3, 0x65C6, 0xECB7,\t0x65C7, 0x94E8, 0x65C8, 0x94E9, 0x65C9, 0x94EA, 0x65CA, 0x94EB,\n\t0x65CB, 0xD0FD, 0x65CC, 0xECBA, 0x65CD, 0x94EC, 0x65CE, 0xECBB,\t0x65CF, 0xD7E5, 0x65D0, 0x94ED, 0x65D1, 0x94EE, 0x65D2, 0xECBC,\n\t0x65D3, 0x94EF, 0x65D4, 0x94F0, 0x65D5, 0x94F1, 0x65D6, 0xECBD,\t0x65D7, 0xC6EC, 0x65D8, 0x94F2, 0x65D9, 0x94F3, 0x65DA, 0x94F4,\n\t0x65DB, 0x94F5, 0x65DC, 0x94F6, 0x65DD, 0x94F7, 0x65DE, 0x94F8,\t0x65DF, 0x94F9, 0x65E0, 0xCEDE, 0x65E1, 0x94FA, 0x65E2, 0xBCC8,\n\t0x65E3, 0x94FB, 0x65E4, 0x94FC, 0x65E5, 0xC8D5, 0x65E6, 0xB5A9,\t0x65E7, 0xBEC9, 0x65E8, 0xD6BC, 0x65E9, 0xD4E7, 0x65EA, 0x94FD,\n\t0x65EB, 0x94FE, 0x65EC, 0xD1AE, 0x65ED, 0xD0F1, 0x65EE, 0xEAB8,\t0x65EF, 0xEAB9, 0x65F0, 0xEABA, 0x65F1, 0xBAB5, 0x65F2, 0x9540,\n\t0x65F3, 0x9541, 0x65F4, 0x9542, 0x65F5, 0x9543, 0x65F6, 0xCAB1,\t0x65F7, 0xBFF5, 0x65F8, 0x9544, 0x65F9, 0x9545, 0x65FA, 0xCDFA,\n\t0x65FB, 0x9546, 0x65FC, 0x9547, 0x65FD, 0x9548, 0x65FE, 0x9549,\t0x65FF, 0x954A, 0x6600, 0xEAC0, 0x6601, 0x954B, 0x6602, 0xB0BA,\n\t0x6603, 0xEABE, 0x6604, 0x954C, 0x6605, 0x954D, 0x6606, 0xC0A5,\t0x6607, 0x954E, 0x6608, 0x954F, 0x6609, 0x9550, 0x660A, 0xEABB,\n\t0x660B, 0x9551, 0x660C, 0xB2FD, 0x660D, 0x9552, 0x660E, 0xC3F7,\t0x660F, 0xBBE8, 0x6610, 0x9553, 0x6611, 0x9554, 0x6612, 0x9555,\n\t0x6613, 0xD2D7, 0x6614, 0xCEF4, 0x6615, 0xEABF, 0x6616, 0x9556,\t0x6617, 0x9557, 0x6618, 0x9558, 0x6619, 0xEABC, 0x661A, 0x9559,\n\t0x661B, 0x955A, 0x661C, 0x955B, 0x661D, 0xEAC3, 0x661E, 0x955C,\t0x661F, 0xD0C7, 0x6620, 0xD3B3, 0x6621, 0x955D, 0x6622, 0x955E,\n\t0x6623, 0x955F, 0x6624, 0x9560, 0x6625, 0xB4BA, 0x6626, 0x9561,\t0x6627, 0xC3C1, 0x6628, 0xD7F2, 0x6629, 0x9562, 0x662A, 0x9563,\n\t0x662B, 0x9564, 0x662C, 0x9565, 0x662D, 0xD5D1, 0x662E, 0x9566,\t0x662F, 0xCAC7, 0x6630, 0x9567, 0x6631, 0xEAC5, 0x6632, 0x9568,\n\t0x6633, 0x9569, 0x6634, 0xEAC4, 0x6635, 0xEAC7, 0x6636, 0xEAC6,\t0x6637, 0x956A, 0x6638, 0x956B, 0x6639, 0x956C, 0x663A, 0x956D,\n\t0x663B, 0x956E, 0x663C, 0xD6E7, 0x663D, 0x956F, 0x663E, 0xCFD4,\t0x663F, 0x9570, 0x6640, 0x9571, 0x6641, 0xEACB, 0x6642, 0x9572,\n\t0x6643, 0xBBCE, 0x6644, 0x9573, 0x6645, 0x9574, 0x6646, 0x9575,\t0x6647, 0x9576, 0x6648, 0x9577, 0x6649, 0x9578, 0x664A, 0x9579,\n\t0x664B, 0xBDFA, 0x664C, 0xC9CE, 0x664D, 0x957A, 0x664E, 0x957B,\t0x664F, 0xEACC, 0x6650, 0x957C, 0x6651, 0x957D, 0x6652, 0xC9B9,\n\t0x6653, 0xCFFE, 0x6654, 0xEACA, 0x6655, 0xD4CE, 0x6656, 0xEACD,\t0x6657, 0xEACF, 0x6658, 0x957E, 0x6659, 0x9580, 0x665A, 0xCDED,\n\t0x665B, 0x9581, 0x665C, 0x9582, 0x665D, 0x9583, 0x665E, 0x9584,\t0x665F, 0xEAC9, 0x6660, 0x9585, 0x6661, 0xEACE, 0x6662, 0x9586,\n\t0x6663, 0x9587, 0x6664, 0xCEEE, 0x6665, 0x9588, 0x6666, 0xBBDE,\t0x6667, 0x9589, 0x6668, 0xB3BF, 0x6669, 0x958A, 0x666A, 0x958B,\n\t0x666B, 0x958C, 0x666C, 0x958D, 0x666D, 0x958E, 0x666E, 0xC6D5,\t0x666F, 0xBEB0, 0x6670, 0xCEFA, 0x6671, 0x958F, 0x6672, 0x9590,\n\t0x6673, 0x9591, 0x6674, 0xC7E7, 0x6675, 0x9592, 0x6676, 0xBEA7,\t0x6677, 0xEAD0, 0x6678, 0x9593, 0x6679, 0x9594, 0x667A, 0xD6C7,\n\t0x667B, 0x9595, 0x667C, 0x9596, 0x667D, 0x9597, 0x667E, 0xC1C0,\t0x667F, 0x9598, 0x6680, 0x9599, 0x6681, 0x959A, 0x6682, 0xD4DD,\n\t0x6683, 0x959B, 0x6684, 0xEAD1, 0x6685, 0x959C, 0x6686, 0x959D,\t0x6687, 0xCFBE, 0x6688, 0x959E, 0x6689, 0x959F, 0x668A, 0x95A0,\n\t0x668B, 0x95A1, 0x668C, 0xEAD2, 0x668D, 0x95A2, 0x668E, 0x95A3,\t0x668F, 0x95A4, 0x6690, 0x95A5, 0x6691, 0xCAEE, 0x6692, 0x95A6,\n\t0x6693, 0x95A7, 0x6694, 0x95A8, 0x6695, 0x95A9, 0x6696, 0xC5AF,\t0x6697, 0xB0B5, 0x6698, 0x95AA, 0x6699, 0x95AB, 0x669A, 0x95AC,\n\t0x669B, 0x95AD, 0x669C, 0x95AE, 0x669D, 0xEAD4, 0x669E, 0x95AF,\t0x669F, 0x95B0, 0x66A0, 0x95B1, 0x66A1, 0x95B2, 0x66A2, 0x95B3,\n\t0x66A3, 0x95B4, 0x66A4, 0x95B5, 0x66A5, 0x95B6, 0x66A6, 0x95B7,\t0x66A7, 0xEAD3, 0x66A8, 0xF4DF, 0x66A9, 0x95B8, 0x66AA, 0x95B9,\n\t0x66AB, 0x95BA, 0x66AC, 0x95BB, 0x66AD, 0x95BC, 0x66AE, 0xC4BA,\t0x66AF, 0x95BD, 0x66B0, 0x95BE, 0x66B1, 0x95BF, 0x66B2, 0x95C0,\n\t0x66B3, 0x95C1, 0x66B4, 0xB1A9, 0x66B5, 0x95C2, 0x66B6, 0x95C3,\t0x66B7, 0x95C4, 0x66B8, 0x95C5, 0x66B9, 0xE5DF, 0x66BA, 0x95C6,\n\t0x66BB, 0x95C7, 0x66BC, 0x95C8, 0x66BD, 0x95C9, 0x66BE, 0xEAD5,\t0x66BF, 0x95CA, 0x66C0, 0x95CB, 0x66C1, 0x95CC, 0x66C2, 0x95CD,\n\t0x66C3, 0x95CE, 0x66C4, 0x95CF, 0x66C5, 0x95D0, 0x66C6, 0x95D1,\t0x66C7, 0x95D2, 0x66C8, 0x95D3, 0x66C9, 0x95D4, 0x66CA, 0x95D5,\n\t0x66CB, 0x95D6, 0x66CC, 0x95D7, 0x66CD, 0x95D8, 0x66CE, 0x95D9,\t0x66CF, 0x95DA, 0x66D0, 0x95DB, 0x66D1, 0x95DC, 0x66D2, 0x95DD,\n\t0x66D3, 0x95DE, 0x66D4, 0x95DF, 0x66D5, 0x95E0, 0x66D6, 0x95E1,\t0x66D7, 0x95E2, 0x66D8, 0x95E3, 0x66D9, 0xCAEF, 0x66DA, 0x95E4,\n\t0x66DB, 0xEAD6, 0x66DC, 0xEAD7, 0x66DD, 0xC6D8, 0x66DE, 0x95E5,\t0x66DF, 0x95E6, 0x66E0, 0x95E7, 0x66E1, 0x95E8, 0x66E2, 0x95E9,\n\t0x66E3, 0x95EA, 0x66E4, 0x95EB, 0x66E5, 0x95EC, 0x66E6, 0xEAD8,\t0x66E7, 0x95ED, 0x66E8, 0x95EE, 0x66E9, 0xEAD9, 0x66EA, 0x95EF,\n\t0x66EB, 0x95F0, 0x66EC, 0x95F1, 0x66ED, 0x95F2, 0x66EE, 0x95F3,\t0x66EF, 0x95F4, 0x66F0, 0xD4BB, 0x66F1, 0x95F5, 0x66F2, 0xC7FA,\n\t0x66F3, 0xD2B7, 0x66F4, 0xB8FC, 0x66F5, 0x95F6, 0x66F6, 0x95F7,\t0x66F7, 0xEAC2, 0x66F8, 0x95F8, 0x66F9, 0xB2DC, 0x66FA, 0x95F9,\n\t0x66FB, 0x95FA, 0x66FC, 0xC2FC, 0x66FD, 0x95FB, 0x66FE, 0xD4F8,\t0x66FF, 0xCCE6, 0x6700, 0xD7EE, 0x6701, 0x95FC, 0x6702, 0x95FD,\n\t0x6703, 0x95FE, 0x6704, 0x9640, 0x6705, 0x9641, 0x6706, 0x9642,\t0x6707, 0x9643, 0x6708, 0xD4C2, 0x6709, 0xD3D0, 0x670A, 0xEBC3,\n\t0x670B, 0xC5F3, 0x670C, 0x9644, 0x670D, 0xB7FE, 0x670E, 0x9645,\t0x670F, 0x9646, 0x6710, 0xEBD4, 0x6711, 0x9647, 0x6712, 0x9648,\n\t0x6713, 0x9649, 0x6714, 0xCBB7, 0x6715, 0xEBDE, 0x6716, 0x964A,\t0x6717, 0xC0CA, 0x6718, 0x964B, 0x6719, 0x964C, 0x671A, 0x964D,\n\t0x671B, 0xCDFB, 0x671C, 0x964E, 0x671D, 0xB3AF, 0x671E, 0x964F,\t0x671F, 0xC6DA, 0x6720, 0x9650, 0x6721, 0x9651, 0x6722, 0x9652,\n\t0x6723, 0x9653, 0x6724, 0x9654, 0x6725, 0x9655, 0x6726, 0xEBFC,\t0x6727, 0x9656, 0x6728, 0xC4BE, 0x6729, 0x9657, 0x672A, 0xCEB4,\n\t0x672B, 0xC4A9, 0x672C, 0xB1BE, 0x672D, 0xD4FD, 0x672E, 0x9658,\t0x672F, 0xCAF5, 0x6730, 0x9659, 0x6731, 0xD6EC, 0x6732, 0x965A,\n\t0x6733, 0x965B, 0x6734, 0xC6D3, 0x6735, 0xB6E4, 0x6736, 0x965C,\t0x6737, 0x965D, 0x6738, 0x965E, 0x6739, 0x965F, 0x673A, 0xBBFA,\n\t0x673B, 0x9660, 0x673C, 0x9661, 0x673D, 0xD0E0, 0x673E, 0x9662,\t0x673F, 0x9663, 0x6740, 0xC9B1, 0x6741, 0x9664, 0x6742, 0xD4D3,\n\t0x6743, 0xC8A8, 0x6744, 0x9665, 0x6745, 0x9666, 0x6746, 0xB8CB,\t0x6747, 0x9667, 0x6748, 0xE8BE, 0x6749, 0xC9BC, 0x674A, 0x9668,\n\t0x674B, 0x9669, 0x674C, 0xE8BB, 0x674D, 0x966A, 0x674E, 0xC0EE,\t0x674F, 0xD0D3, 0x6750, 0xB2C4, 0x6751, 0xB4E5, 0x6752, 0x966B,\n\t0x6753, 0xE8BC, 0x6754, 0x966C, 0x6755, 0x966D, 0x6756, 0xD5C8,\t0x6757, 0x966E, 0x6758, 0x966F, 0x6759, 0x9670, 0x675A, 0x9671,\n\t0x675B, 0x9672, 0x675C, 0xB6C5, 0x675D, 0x9673, 0x675E, 0xE8BD,\t0x675F, 0xCAF8, 0x6760, 0xB8DC, 0x6761, 0xCCF5, 0x6762, 0x9674,\n\t0x6763, 0x9675, 0x6764, 0x9676, 0x6765, 0xC0B4, 0x6766, 0x9677,\t0x6767, 0x9678, 0x6768, 0xD1EE, 0x6769, 0xE8BF, 0x676A, 0xE8C2,\n\t0x676B, 0x9679, 0x676C, 0x967A, 0x676D, 0xBABC, 0x676E, 0x967B,\t0x676F, 0xB1AD, 0x6770, 0xBDDC, 0x6771, 0x967C, 0x6772, 0xEABD,\n\t0x6773, 0xE8C3, 0x6774, 0x967D, 0x6775, 0xE8C6, 0x6776, 0x967E,\t0x6777, 0xE8CB, 0x6778, 0x9680, 0x6779, 0x9681, 0x677A, 0x9682,\n\t0x677B, 0x9683, 0x677C, 0xE8CC, 0x677D, 0x9684, 0x677E, 0xCBC9,\t0x677F, 0xB0E5, 0x6780, 0x9685, 0x6781, 0xBCAB, 0x6782, 0x9686,\n\t0x6783, 0x9687, 0x6784, 0xB9B9, 0x6785, 0x9688, 0x6786, 0x9689,\t0x6787, 0xE8C1, 0x6788, 0x968A, 0x6789, 0xCDF7, 0x678A, 0x968B,\n\t0x678B, 0xE8CA, 0x678C, 0x968C, 0x678D, 0x968D, 0x678E, 0x968E,\t0x678F, 0x968F, 0x6790, 0xCEF6, 0x6791, 0x9690, 0x6792, 0x9691,\n\t0x6793, 0x9692, 0x6794, 0x9693, 0x6795, 0xD5ED, 0x6796, 0x9694,\t0x6797, 0xC1D6, 0x6798, 0xE8C4, 0x6799, 0x9695, 0x679A, 0xC3B6,\n\t0x679B, 0x9696, 0x679C, 0xB9FB, 0x679D, 0xD6A6, 0x679E, 0xE8C8,\t0x679F, 0x9697, 0x67A0, 0x9698, 0x67A1, 0x9699, 0x67A2, 0xCAE0,\n\t0x67A3, 0xD4E6, 0x67A4, 0x969A, 0x67A5, 0xE8C0, 0x67A6, 0x969B,\t0x67A7, 0xE8C5, 0x67A8, 0xE8C7, 0x67A9, 0x969C, 0x67AA, 0xC7B9,\n\t0x67AB, 0xB7E3, 0x67AC, 0x969D, 0x67AD, 0xE8C9, 0x67AE, 0x969E,\t0x67AF, 0xBFDD, 0x67B0, 0xE8D2, 0x67B1, 0x969F, 0x67B2, 0x96A0,\n\t0x67B3, 0xE8D7, 0x67B4, 0x96A1, 0x67B5, 0xE8D5, 0x67B6, 0xBCDC,\t0x67B7, 0xBCCF, 0x67B8, 0xE8DB, 0x67B9, 0x96A2, 0x67BA, 0x96A3,\n\t0x67BB, 0x96A4, 0x67BC, 0x96A5, 0x67BD, 0x96A6, 0x67BE, 0x96A7,\t0x67BF, 0x96A8, 0x67C0, 0x96A9, 0x67C1, 0xE8DE, 0x67C2, 0x96AA,\n\t0x67C3, 0xE8DA, 0x67C4, 0xB1FA, 0x67C5, 0x96AB, 0x67C6, 0x96AC,\t0x67C7, 0x96AD, 0x67C8, 0x96AE, 0x67C9, 0x96AF, 0x67CA, 0x96B0,\n\t0x67CB, 0x96B1, 0x67CC, 0x96B2, 0x67CD, 0x96B3, 0x67CE, 0x96B4,\t0x67CF, 0xB0D8, 0x67D0, 0xC4B3, 0x67D1, 0xB8CC, 0x67D2, 0xC6E2,\n\t0x67D3, 0xC8BE, 0x67D4, 0xC8E1, 0x67D5, 0x96B5, 0x67D6, 0x96B6,\t0x67D7, 0x96B7, 0x67D8, 0xE8CF, 0x67D9, 0xE8D4, 0x67DA, 0xE8D6,\n\t0x67DB, 0x96B8, 0x67DC, 0xB9F1, 0x67DD, 0xE8D8, 0x67DE, 0xD7F5,\t0x67DF, 0x96B9, 0x67E0, 0xC4FB, 0x67E1, 0x96BA, 0x67E2, 0xE8DC,\n\t0x67E3, 0x96BB, 0x67E4, 0x96BC, 0x67E5, 0xB2E9, 0x67E6, 0x96BD,\t0x67E7, 0x96BE, 0x67E8, 0x96BF, 0x67E9, 0xE8D1, 0x67EA, 0x96C0,\n\t0x67EB, 0x96C1, 0x67EC, 0xBCED, 0x67ED, 0x96C2, 0x67EE, 0x96C3,\t0x67EF, 0xBFC2, 0x67F0, 0xE8CD, 0x67F1, 0xD6F9, 0x67F2, 0x96C4,\n\t0x67F3, 0xC1F8, 0x67F4, 0xB2F1, 0x67F5, 0x96C5, 0x67F6, 0x96C6,\t0x67F7, 0x96C7, 0x67F8, 0x96C8, 0x67F9, 0x96C9, 0x67FA, 0x96CA,\n\t0x67FB, 0x96CB, 0x67FC, 0x96CC, 0x67FD, 0xE8DF, 0x67FE, 0x96CD,\t0x67FF, 0xCAC1, 0x6800, 0xE8D9, 0x6801, 0x96CE, 0x6802, 0x96CF,\n\t0x6803, 0x96D0, 0x6804, 0x96D1, 0x6805, 0xD5A4, 0x6806, 0x96D2,\t0x6807, 0xB1EA, 0x6808, 0xD5BB, 0x6809, 0xE8CE, 0x680A, 0xE8D0,\n\t0x680B, 0xB6B0, 0x680C, 0xE8D3, 0x680D, 0x96D3, 0x680E, 0xE8DD,\t0x680F, 0xC0B8, 0x6810, 0x96D4, 0x6811, 0xCAF7, 0x6812, 0x96D5,\n\t0x6813, 0xCBA8, 0x6814, 0x96D6, 0x6815, 0x96D7, 0x6816, 0xC6DC,\t0x6817, 0xC0F5, 0x6818, 0x96D8, 0x6819, 0x96D9, 0x681A, 0x96DA,\n\t0x681B, 0x96DB, 0x681C, 0x96DC, 0x681D, 0xE8E9, 0x681E, 0x96DD,\t0x681F, 0x96DE, 0x6820, 0x96DF, 0x6821, 0xD0A3, 0x6822, 0x96E0,\n\t0x6823, 0x96E1, 0x6824, 0x96E2, 0x6825, 0x96E3, 0x6826, 0x96E4,\t0x6827, 0x96E5, 0x6828, 0x96E6, 0x6829, 0xE8F2, 0x682A, 0xD6EA,\n\t0x682B, 0x96E7, 0x682C, 0x96E8, 0x682D, 0x96E9, 0x682E, 0x96EA,\t0x682F, 0x96EB, 0x6830, 0x96EC, 0x6831, 0x96ED, 0x6832, 0xE8E0,\n\t0x6833, 0xE8E1, 0x6834, 0x96EE, 0x6835, 0x96EF, 0x6836, 0x96F0,\t0x6837, 0xD1F9, 0x6838, 0xBACB, 0x6839, 0xB8F9, 0x683A, 0x96F1,\n\t0x683B, 0x96F2, 0x683C, 0xB8F1, 0x683D, 0xD4D4, 0x683E, 0xE8EF,\t0x683F, 0x96F3, 0x6840, 0xE8EE, 0x6841, 0xE8EC, 0x6842, 0xB9F0,\n\t0x6843, 0xCCD2, 0x6844, 0xE8E6, 0x6845, 0xCEA6, 0x6846, 0xBFF2,\t0x6847, 0x96F4, 0x6848, 0xB0B8, 0x6849, 0xE8F1, 0x684A, 0xE8F0,\n\t0x684B, 0x96F5, 0x684C, 0xD7C0, 0x684D, 0x96F6, 0x684E, 0xE8E4,\t0x684F, 0x96F7, 0x6850, 0xCDA9, 0x6851, 0xC9A3, 0x6852, 0x96F8,\n\t0x6853, 0xBBB8, 0x6854, 0xBDDB, 0x6855, 0xE8EA, 0x6856, 0x96F9,\t0x6857, 0x96FA, 0x6858, 0x96FB, 0x6859, 0x96FC, 0x685A, 0x96FD,\n\t0x685B, 0x96FE, 0x685C, 0x9740, 0x685D, 0x9741, 0x685E, 0x9742,\t0x685F, 0x9743, 0x6860, 0xE8E2, 0x6861, 0xE8E3, 0x6862, 0xE8E5,\n\t0x6863, 0xB5B5, 0x6864, 0xE8E7, 0x6865, 0xC7C5, 0x6866, 0xE8EB,\t0x6867, 0xE8ED, 0x6868, 0xBDB0, 0x6869, 0xD7AE, 0x686A, 0x9744,\n\t0x686B, 0xE8F8, 0x686C, 0x9745, 0x686D, 0x9746, 0x686E, 0x9747,\t0x686F, 0x9748, 0x6870, 0x9749, 0x6871, 0x974A, 0x6872, 0x974B,\n\t0x6873, 0x974C, 0x6874, 0xE8F5, 0x6875, 0x974D, 0x6876, 0xCDB0,\t0x6877, 0xE8F6, 0x6878, 0x974E, 0x6879, 0x974F, 0x687A, 0x9750,\n\t0x687B, 0x9751, 0x687C, 0x9752, 0x687D, 0x9753, 0x687E, 0x9754,\t0x687F, 0x9755, 0x6880, 0x9756, 0x6881, 0xC1BA, 0x6882, 0x9757,\n\t0x6883, 0xE8E8, 0x6884, 0x9758, 0x6885, 0xC3B7, 0x6886, 0xB0F0,\t0x6887, 0x9759, 0x6888, 0x975A, 0x6889, 0x975B, 0x688A, 0x975C,\n\t0x688B, 0x975D, 0x688C, 0x975E, 0x688D, 0x975F, 0x688E, 0x9760,\t0x688F, 0xE8F4, 0x6890, 0x9761, 0x6891, 0x9762, 0x6892, 0x9763,\n\t0x6893, 0xE8F7, 0x6894, 0x9764, 0x6895, 0x9765, 0x6896, 0x9766,\t0x6897, 0xB9A3, 0x6898, 0x9767, 0x6899, 0x9768, 0x689A, 0x9769,\n\t0x689B, 0x976A, 0x689C, 0x976B, 0x689D, 0x976C, 0x689E, 0x976D,\t0x689F, 0x976E, 0x68A0, 0x976F, 0x68A1, 0x9770, 0x68A2, 0xC9D2,\n\t0x68A3, 0x9771, 0x68A4, 0x9772, 0x68A5, 0x9773, 0x68A6, 0xC3CE,\t0x68A7, 0xCEE0, 0x68A8, 0xC0E6, 0x68A9, 0x9774, 0x68AA, 0x9775,\n\t0x68AB, 0x9776, 0x68AC, 0x9777, 0x68AD, 0xCBF3, 0x68AE, 0x9778,\t0x68AF, 0xCCDD, 0x68B0, 0xD0B5, 0x68B1, 0x9779, 0x68B2, 0x977A,\n\t0x68B3, 0xCAE1, 0x68B4, 0x977B, 0x68B5, 0xE8F3, 0x68B6, 0x977C,\t0x68B7, 0x977D, 0x68B8, 0x977E, 0x68B9, 0x9780, 0x68BA, 0x9781,\n\t0x68BB, 0x9782, 0x68BC, 0x9783, 0x68BD, 0x9784, 0x68BE, 0x9785,\t0x68BF, 0x9786, 0x68C0, 0xBCEC, 0x68C1, 0x9787, 0x68C2, 0xE8F9,\n\t0x68C3, 0x9788, 0x68C4, 0x9789, 0x68C5, 0x978A, 0x68C6, 0x978B,\t0x68C7, 0x978C, 0x68C8, 0x978D, 0x68C9, 0xC3DE, 0x68CA, 0x978E,\n\t0x68CB, 0xC6E5, 0x68CC, 0x978F, 0x68CD, 0xB9F7, 0x68CE, 0x9790,\t0x68CF, 0x9791, 0x68D0, 0x9792, 0x68D1, 0x9793, 0x68D2, 0xB0F4,\n\t0x68D3, 0x9794, 0x68D4, 0x9795, 0x68D5, 0xD7D8, 0x68D6, 0x9796,\t0x68D7, 0x9797, 0x68D8, 0xBCAC, 0x68D9, 0x9798, 0x68DA, 0xC5EF,\n\t0x68DB, 0x9799, 0x68DC, 0x979A, 0x68DD, 0x979B, 0x68DE, 0x979C,\t0x68DF, 0x979D, 0x68E0, 0xCCC4, 0x68E1, 0x979E, 0x68E2, 0x979F,\n\t0x68E3, 0xE9A6, 0x68E4, 0x97A0, 0x68E5, 0x97A1, 0x68E6, 0x97A2,\t0x68E7, 0x97A3, 0x68E8, 0x97A4, 0x68E9, 0x97A5, 0x68EA, 0x97A6,\n\t0x68EB, 0x97A7, 0x68EC, 0x97A8, 0x68ED, 0x97A9, 0x68EE, 0xC9AD,\t0x68EF, 0x97AA, 0x68F0, 0xE9A2, 0x68F1, 0xC0E2, 0x68F2, 0x97AB,\n\t0x68F3, 0x97AC, 0x68F4, 0x97AD, 0x68F5, 0xBFC3, 0x68F6, 0x97AE,\t0x68F7, 0x97AF, 0x68F8, 0x97B0, 0x68F9, 0xE8FE, 0x68FA, 0xB9D7,\n\t0x68FB, 0x97B1, 0x68FC, 0xE8FB, 0x68FD, 0x97B2, 0x68FE, 0x97B3,\t0x68FF, 0x97B4, 0x6900, 0x97B5, 0x6901, 0xE9A4, 0x6902, 0x97B6,\n\t0x6903, 0x97B7, 0x6904, 0x97B8, 0x6905, 0xD2CE, 0x6906, 0x97B9,\t0x6907, 0x97BA, 0x6908, 0x97BB, 0x6909, 0x97BC, 0x690A, 0x97BD,\n\t0x690B, 0xE9A3, 0x690C, 0x97BE, 0x690D, 0xD6B2, 0x690E, 0xD7B5,\t0x690F, 0x97BF, 0x6910, 0xE9A7, 0x6911, 0x97C0, 0x6912, 0xBDB7,\n\t0x6913, 0x97C1, 0x6914, 0x97C2, 0x6915, 0x97C3, 0x6916, 0x97C4,\t0x6917, 0x97C5, 0x6918, 0x97C6, 0x6919, 0x97C7, 0x691A, 0x97C8,\n\t0x691B, 0x97C9, 0x691C, 0x97CA, 0x691D, 0x97CB, 0x691E, 0x97CC,\t0x691F, 0xE8FC, 0x6920, 0xE8FD, 0x6921, 0x97CD, 0x6922, 0x97CE,\n\t0x6923, 0x97CF, 0x6924, 0xE9A1, 0x6925, 0x97D0, 0x6926, 0x97D1,\t0x6927, 0x97D2, 0x6928, 0x97D3, 0x6929, 0x97D4, 0x692A, 0x97D5,\n\t0x692B, 0x97D6, 0x692C, 0x97D7, 0x692D, 0xCDD6, 0x692E, 0x97D8,\t0x692F, 0x97D9, 0x6930, 0xD2AC, 0x6931, 0x97DA, 0x6932, 0x97DB,\n\t0x6933, 0x97DC, 0x6934, 0xE9B2, 0x6935, 0x97DD, 0x6936, 0x97DE,\t0x6937, 0x97DF, 0x6938, 0x97E0, 0x6939, 0xE9A9, 0x693A, 0x97E1,\n\t0x693B, 0x97E2, 0x693C, 0x97E3, 0x693D, 0xB4AA, 0x693E, 0x97E4,\t0x693F, 0xB4BB, 0x6940, 0x97E5, 0x6941, 0x97E6, 0x6942, 0xE9AB,\n\t0x6943, 0x97E7, 0x6944, 0x97E8, 0x6945, 0x97E9, 0x6946, 0x97EA,\t0x6947, 0x97EB, 0x6948, 0x97EC, 0x6949, 0x97ED, 0x694A, 0x97EE,\n\t0x694B, 0x97EF, 0x694C, 0x97F0, 0x694D, 0x97F1, 0x694E, 0x97F2,\t0x694F, 0x97F3, 0x6950, 0x97F4, 0x6951, 0x97F5, 0x6952, 0x97F6,\n\t0x6953, 0x97F7, 0x6954, 0xD0A8, 0x6955, 0x97F8, 0x6956, 0x97F9,\t0x6957, 0xE9A5, 0x6958, 0x97FA, 0x6959, 0x97FB, 0x695A, 0xB3FE,\n\t0x695B, 0x97FC, 0x695C, 0x97FD, 0x695D, 0xE9AC, 0x695E, 0xC0E3,\t0x695F, 0x97FE, 0x6960, 0xE9AA, 0x6961, 0x9840, 0x6962, 0x9841,\n\t0x6963, 0xE9B9, 0x6964, 0x9842, 0x6965, 0x9843, 0x6966, 0xE9B8,\t0x6967, 0x9844, 0x6968, 0x9845, 0x6969, 0x9846, 0x696A, 0x9847,\n\t0x696B, 0xE9AE, 0x696C, 0x9848, 0x696D, 0x9849, 0x696E, 0xE8FA,\t0x696F, 0x984A, 0x6970, 0x984B, 0x6971, 0xE9A8, 0x6972, 0x984C,\n\t0x6973, 0x984D, 0x6974, 0x984E, 0x6975, 0x984F, 0x6976, 0x9850,\t0x6977, 0xBFAC, 0x6978, 0xE9B1, 0x6979, 0xE9BA, 0x697A, 0x9851,\n\t0x697B, 0x9852, 0x697C, 0xC2A5, 0x697D, 0x9853, 0x697E, 0x9854,\t0x697F, 0x9855, 0x6980, 0xE9AF, 0x6981, 0x9856, 0x6982, 0xB8C5,\n\t0x6983, 0x9857, 0x6984, 0xE9AD, 0x6985, 0x9858, 0x6986, 0xD3DC,\t0x6987, 0xE9B4, 0x6988, 0xE9B5, 0x6989, 0xE9B7, 0x698A, 0x9859,\n\t0x698B, 0x985A, 0x698C, 0x985B, 0x698D, 0xE9C7, 0x698E, 0x985C,\t0x698F, 0x985D, 0x6990, 0x985E, 0x6991, 0x985F, 0x6992, 0x9860,\n\t0x6993, 0x9861, 0x6994, 0xC0C6, 0x6995, 0xE9C5, 0x6996, 0x9862,\t0x6997, 0x9863, 0x6998, 0xE9B0, 0x6999, 0x9864, 0x699A, 0x9865,\n\t0x699B, 0xE9BB, 0x699C, 0xB0F1, 0x699D, 0x9866, 0x699E, 0x9867,\t0x699F, 0x9868, 0x69A0, 0x9869, 0x69A1, 0x986A, 0x69A2, 0x986B,\n\t0x69A3, 0x986C, 0x69A4, 0x986D, 0x69A5, 0x986E, 0x69A6, 0x986F,\t0x69A7, 0xE9BC, 0x69A8, 0xD5A5, 0x69A9, 0x9870, 0x69AA, 0x9871,\n\t0x69AB, 0xE9BE, 0x69AC, 0x9872, 0x69AD, 0xE9BF, 0x69AE, 0x9873,\t0x69AF, 0x9874, 0x69B0, 0x9875, 0x69B1, 0xE9C1, 0x69B2, 0x9876,\n\t0x69B3, 0x9877, 0x69B4, 0xC1F1, 0x69B5, 0x9878, 0x69B6, 0x9879,\t0x69B7, 0xC8B6, 0x69B8, 0x987A, 0x69B9, 0x987B, 0x69BA, 0x987C,\n\t0x69BB, 0xE9BD, 0x69BC, 0x987D, 0x69BD, 0x987E, 0x69BE, 0x9880,\t0x69BF, 0x9881, 0x69C0, 0x9882, 0x69C1, 0xE9C2, 0x69C2, 0x9883,\n\t0x69C3, 0x9884, 0x69C4, 0x9885, 0x69C5, 0x9886, 0x69C6, 0x9887,\t0x69C7, 0x9888, 0x69C8, 0x9889, 0x69C9, 0x988A, 0x69CA, 0xE9C3,\n\t0x69CB, 0x988B, 0x69CC, 0xE9B3, 0x69CD, 0x988C, 0x69CE, 0xE9B6,\t0x69CF, 0x988D, 0x69D0, 0xBBB1, 0x69D1, 0x988E, 0x69D2, 0x988F,\n\t0x69D3, 0x9890, 0x69D4, 0xE9C0, 0x69D5, 0x9891, 0x69D6, 0x9892,\t0x69D7, 0x9893, 0x69D8, 0x9894, 0x69D9, 0x9895, 0x69DA, 0x9896,\n\t0x69DB, 0xBCF7, 0x69DC, 0x9897, 0x69DD, 0x9898, 0x69DE, 0x9899,\t0x69DF, 0xE9C4, 0x69E0, 0xE9C6, 0x69E1, 0x989A, 0x69E2, 0x989B,\n\t0x69E3, 0x989C, 0x69E4, 0x989D, 0x69E5, 0x989E, 0x69E6, 0x989F,\t0x69E7, 0x98A0, 0x69E8, 0x98A1, 0x69E9, 0x98A2, 0x69EA, 0x98A3,\n\t0x69EB, 0x98A4, 0x69EC, 0x98A5, 0x69ED, 0xE9CA, 0x69EE, 0x98A6,\t0x69EF, 0x98A7, 0x69F0, 0x98A8, 0x69F1, 0x98A9, 0x69F2, 0xE9CE,\n\t0x69F3, 0x98AA, 0x69F4, 0x98AB, 0x69F5, 0x98AC, 0x69F6, 0x98AD,\t0x69F7, 0x98AE, 0x69F8, 0x98AF, 0x69F9, 0x98B0, 0x69FA, 0x98B1,\n\t0x69FB, 0x98B2, 0x69FC, 0x98B3, 0x69FD, 0xB2DB, 0x69FE, 0x98B4,\t0x69FF, 0xE9C8, 0x6A00, 0x98B5, 0x6A01, 0x98B6, 0x6A02, 0x98B7,\n\t0x6A03, 0x98B8, 0x6A04, 0x98B9, 0x6A05, 0x98BA, 0x6A06, 0x98BB,\t0x6A07, 0x98BC, 0x6A08, 0x98BD, 0x6A09, 0x98BE, 0x6A0A, 0xB7AE,\n\t0x6A0B, 0x98BF, 0x6A0C, 0x98C0, 0x6A0D, 0x98C1, 0x6A0E, 0x98C2,\t0x6A0F, 0x98C3, 0x6A10, 0x98C4, 0x6A11, 0x98C5, 0x6A12, 0x98C6,\n\t0x6A13, 0x98C7, 0x6A14, 0x98C8, 0x6A15, 0x98C9, 0x6A16, 0x98CA,\t0x6A17, 0xE9CB, 0x6A18, 0xE9CC, 0x6A19, 0x98CB, 0x6A1A, 0x98CC,\n\t0x6A1B, 0x98CD, 0x6A1C, 0x98CE, 0x6A1D, 0x98CF, 0x6A1E, 0x98D0,\t0x6A1F, 0xD5C1, 0x6A20, 0x98D1, 0x6A21, 0xC4A3, 0x6A22, 0x98D2,\n\t0x6A23, 0x98D3, 0x6A24, 0x98D4, 0x6A25, 0x98D5, 0x6A26, 0x98D6,\t0x6A27, 0x98D7, 0x6A28, 0xE9D8, 0x6A29, 0x98D8, 0x6A2A, 0xBAE1,\n\t0x6A2B, 0x98D9, 0x6A2C, 0x98DA, 0x6A2D, 0x98DB, 0x6A2E, 0x98DC,\t0x6A2F, 0xE9C9, 0x6A30, 0x98DD, 0x6A31, 0xD3A3, 0x6A32, 0x98DE,\n\t0x6A33, 0x98DF, 0x6A34, 0x98E0, 0x6A35, 0xE9D4, 0x6A36, 0x98E1,\t0x6A37, 0x98E2, 0x6A38, 0x98E3, 0x6A39, 0x98E4, 0x6A3A, 0x98E5,\n\t0x6A3B, 0x98E6, 0x6A3C, 0x98E7, 0x6A3D, 0xE9D7, 0x6A3E, 0xE9D0,\t0x6A3F, 0x98E8, 0x6A40, 0x98E9, 0x6A41, 0x98EA, 0x6A42, 0x98EB,\n\t0x6A43, 0x98EC, 0x6A44, 0xE9CF, 0x6A45, 0x98ED, 0x6A46, 0x98EE,\t0x6A47, 0xC7C1, 0x6A48, 0x98EF, 0x6A49, 0x98F0, 0x6A4A, 0x98F1,\n\t0x6A4B, 0x98F2, 0x6A4C, 0x98F3, 0x6A4D, 0x98F4, 0x6A4E, 0x98F5,\t0x6A4F, 0x98F6, 0x6A50, 0xE9D2, 0x6A51, 0x98F7, 0x6A52, 0x98F8,\n\t0x6A53, 0x98F9, 0x6A54, 0x98FA, 0x6A55, 0x98FB, 0x6A56, 0x98FC,\t0x6A57, 0x98FD, 0x6A58, 0xE9D9, 0x6A59, 0xB3C8, 0x6A5A, 0x98FE,\n\t0x6A5B, 0xE9D3, 0x6A5C, 0x9940, 0x6A5D, 0x9941, 0x6A5E, 0x9942,\t0x6A5F, 0x9943, 0x6A60, 0x9944, 0x6A61, 0xCFF0, 0x6A62, 0x9945,\n\t0x6A63, 0x9946, 0x6A64, 0x9947, 0x6A65, 0xE9CD, 0x6A66, 0x9948,\t0x6A67, 0x9949, 0x6A68, 0x994A, 0x6A69, 0x994B, 0x6A6A, 0x994C,\n\t0x6A6B, 0x994D, 0x6A6C, 0x994E, 0x6A6D, 0x994F, 0x6A6E, 0x9950,\t0x6A6F, 0x9951, 0x6A70, 0x9952, 0x6A71, 0xB3F7, 0x6A72, 0x9953,\n\t0x6A73, 0x9954, 0x6A74, 0x9955, 0x6A75, 0x9956, 0x6A76, 0x9957,\t0x6A77, 0x9958, 0x6A78, 0x9959, 0x6A79, 0xE9D6, 0x6A7A, 0x995A,\n\t0x6A7B, 0x995B, 0x6A7C, 0xE9DA, 0x6A7D, 0x995C, 0x6A7E, 0x995D,\t0x6A7F, 0x995E, 0x6A80, 0xCCB4, 0x6A81, 0x995F, 0x6A82, 0x9960,\n\t0x6A83, 0x9961, 0x6A84, 0xCFAD, 0x6A85, 0x9962, 0x6A86, 0x9963,\t0x6A87, 0x9964, 0x6A88, 0x9965, 0x6A89, 0x9966, 0x6A8A, 0x9967,\n\t0x6A8B, 0x9968, 0x6A8C, 0x9969, 0x6A8D, 0x996A, 0x6A8E, 0xE9D5,\t0x6A8F, 0x996B, 0x6A90, 0xE9DC, 0x6A91, 0xE9DB, 0x6A92, 0x996C,\n\t0x6A93, 0x996D, 0x6A94, 0x996E, 0x6A95, 0x996F, 0x6A96, 0x9970,\t0x6A97, 0xE9DE, 0x6A98, 0x9971, 0x6A99, 0x9972, 0x6A9A, 0x9973,\n\t0x6A9B, 0x9974, 0x6A9C, 0x9975, 0x6A9D, 0x9976, 0x6A9E, 0x9977,\t0x6A9F, 0x9978, 0x6AA0, 0xE9D1, 0x6AA1, 0x9979, 0x6AA2, 0x997A,\n\t0x6AA3, 0x997B, 0x6AA4, 0x997C, 0x6AA5, 0x997D, 0x6AA6, 0x997E,\t0x6AA7, 0x9980, 0x6AA8, 0x9981, 0x6AA9, 0xE9DD, 0x6AAA, 0x9982,\n\t0x6AAB, 0xE9DF, 0x6AAC, 0xC3CA, 0x6AAD, 0x9983, 0x6AAE, 0x9984,\t0x6AAF, 0x9985, 0x6AB0, 0x9986, 0x6AB1, 0x9987, 0x6AB2, 0x9988,\n\t0x6AB3, 0x9989, 0x6AB4, 0x998A, 0x6AB5, 0x998B, 0x6AB6, 0x998C,\t0x6AB7, 0x998D, 0x6AB8, 0x998E, 0x6AB9, 0x998F, 0x6ABA, 0x9990,\n\t0x6ABB, 0x9991, 0x6ABC, 0x9992, 0x6ABD, 0x9993, 0x6ABE, 0x9994,\t0x6ABF, 0x9995, 0x6AC0, 0x9996, 0x6AC1, 0x9997, 0x6AC2, 0x9998,\n\t0x6AC3, 0x9999, 0x6AC4, 0x999A, 0x6AC5, 0x999B, 0x6AC6, 0x999C,\t0x6AC7, 0x999D, 0x6AC8, 0x999E, 0x6AC9, 0x999F, 0x6ACA, 0x99A0,\n\t0x6ACB, 0x99A1, 0x6ACC, 0x99A2, 0x6ACD, 0x99A3, 0x6ACE, 0x99A4,\t0x6ACF, 0x99A5, 0x6AD0, 0x99A6, 0x6AD1, 0x99A7, 0x6AD2, 0x99A8,\n\t0x6AD3, 0x99A9, 0x6AD4, 0x99AA, 0x6AD5, 0x99AB, 0x6AD6, 0x99AC,\t0x6AD7, 0x99AD, 0x6AD8, 0x99AE, 0x6AD9, 0x99AF, 0x6ADA, 0x99B0,\n\t0x6ADB, 0x99B1, 0x6ADC, 0x99B2, 0x6ADD, 0x99B3, 0x6ADE, 0x99B4,\t0x6ADF, 0x99B5, 0x6AE0, 0x99B6, 0x6AE1, 0x99B7, 0x6AE2, 0x99B8,\n\t0x6AE3, 0x99B9, 0x6AE4, 0x99BA, 0x6AE5, 0x99BB, 0x6AE6, 0x99BC,\t0x6AE7, 0x99BD, 0x6AE8, 0x99BE, 0x6AE9, 0x99BF, 0x6AEA, 0x99C0,\n\t0x6AEB, 0x99C1, 0x6AEC, 0x99C2, 0x6AED, 0x99C3, 0x6AEE, 0x99C4,\t0x6AEF, 0x99C5, 0x6AF0, 0x99C6, 0x6AF1, 0x99C7, 0x6AF2, 0x99C8,\n\t0x6AF3, 0x99C9, 0x6AF4, 0x99CA, 0x6AF5, 0x99CB, 0x6AF6, 0x99CC,\t0x6AF7, 0x99CD, 0x6AF8, 0x99CE, 0x6AF9, 0x99CF, 0x6AFA, 0x99D0,\n\t0x6AFB, 0x99D1, 0x6AFC, 0x99D2, 0x6AFD, 0x99D3, 0x6AFE, 0x99D4,\t0x6AFF, 0x99D5, 0x6B00, 0x99D6, 0x6B01, 0x99D7, 0x6B02, 0x99D8,\n\t0x6B03, 0x99D9, 0x6B04, 0x99DA, 0x6B05, 0x99DB, 0x6B06, 0x99DC,\t0x6B07, 0x99DD, 0x6B08, 0x99DE, 0x6B09, 0x99DF, 0x6B0A, 0x99E0,\n\t0x6B0B, 0x99E1, 0x6B0C, 0x99E2, 0x6B0D, 0x99E3, 0x6B0E, 0x99E4,\t0x6B0F, 0x99E5, 0x6B10, 0x99E6, 0x6B11, 0x99E7, 0x6B12, 0x99E8,\n\t0x6B13, 0x99E9, 0x6B14, 0x99EA, 0x6B15, 0x99EB, 0x6B16, 0x99EC,\t0x6B17, 0x99ED, 0x6B18, 0x99EE, 0x6B19, 0x99EF, 0x6B1A, 0x99F0,\n\t0x6B1B, 0x99F1, 0x6B1C, 0x99F2, 0x6B1D, 0x99F3, 0x6B1E, 0x99F4,\t0x6B1F, 0x99F5, 0x6B20, 0xC7B7, 0x6B21, 0xB4CE, 0x6B22, 0xBBB6,\n\t0x6B23, 0xD0C0, 0x6B24, 0xECA3, 0x6B25, 0x99F6, 0x6B26, 0x99F7,\t0x6B27, 0xC5B7, 0x6B28, 0x99F8, 0x6B29, 0x99F9, 0x6B2A, 0x99FA,\n\t0x6B2B, 0x99FB, 0x6B2C, 0x99FC, 0x6B2D, 0x99FD, 0x6B2E, 0x99FE,\t0x6B2F, 0x9A40, 0x6B30, 0x9A41, 0x6B31, 0x9A42, 0x6B32, 0xD3FB,\n\t0x6B33, 0x9A43, 0x6B34, 0x9A44, 0x6B35, 0x9A45, 0x6B36, 0x9A46,\t0x6B37, 0xECA4, 0x6B38, 0x9A47, 0x6B39, 0xECA5, 0x6B3A, 0xC6DB,\n\t0x6B3B, 0x9A48, 0x6B3C, 0x9A49, 0x6B3D, 0x9A4A, 0x6B3E, 0xBFEE,\t0x6B3F, 0x9A4B, 0x6B40, 0x9A4C, 0x6B41, 0x9A4D, 0x6B42, 0x9A4E,\n\t0x6B43, 0xECA6, 0x6B44, 0x9A4F, 0x6B45, 0x9A50, 0x6B46, 0xECA7,\t0x6B47, 0xD0AA, 0x6B48, 0x9A51, 0x6B49, 0xC7B8, 0x6B4A, 0x9A52,\n\t0x6B4B, 0x9A53, 0x6B4C, 0xB8E8, 0x6B4D, 0x9A54, 0x6B4E, 0x9A55,\t0x6B4F, 0x9A56, 0x6B50, 0x9A57, 0x6B51, 0x9A58, 0x6B52, 0x9A59,\n\t0x6B53, 0x9A5A, 0x6B54, 0x9A5B, 0x6B55, 0x9A5C, 0x6B56, 0x9A5D,\t0x6B57, 0x9A5E, 0x6B58, 0x9A5F, 0x6B59, 0xECA8, 0x6B5A, 0x9A60,\n\t0x6B5B, 0x9A61, 0x6B5C, 0x9A62, 0x6B5D, 0x9A63, 0x6B5E, 0x9A64,\t0x6B5F, 0x9A65, 0x6B60, 0x9A66, 0x6B61, 0x9A67, 0x6B62, 0xD6B9,\n\t0x6B63, 0xD5FD, 0x6B64, 0xB4CB, 0x6B65, 0xB2BD, 0x6B66, 0xCEE4,\t0x6B67, 0xC6E7, 0x6B68, 0x9A68, 0x6B69, 0x9A69, 0x6B6A, 0xCDE1,\n\t0x6B6B, 0x9A6A, 0x6B6C, 0x9A6B, 0x6B6D, 0x9A6C, 0x6B6E, 0x9A6D,\t0x6B6F, 0x9A6E, 0x6B70, 0x9A6F, 0x6B71, 0x9A70, 0x6B72, 0x9A71,\n\t0x6B73, 0x9A72, 0x6B74, 0x9A73, 0x6B75, 0x9A74, 0x6B76, 0x9A75,\t0x6B77, 0x9A76, 0x6B78, 0x9A77, 0x6B79, 0xB4F5, 0x6B7A, 0x9A78,\n\t0x6B7B, 0xCBC0, 0x6B7C, 0xBCDF, 0x6B7D, 0x9A79, 0x6B7E, 0x9A7A,\t0x6B7F, 0x9A7B, 0x6B80, 0x9A7C, 0x6B81, 0xE9E2, 0x6B82, 0xE9E3,\n\t0x6B83, 0xD1EA, 0x6B84, 0xE9E5, 0x6B85, 0x9A7D, 0x6B86, 0xB4F9,\t0x6B87, 0xE9E4, 0x6B88, 0x9A7E, 0x6B89, 0xD1B3, 0x6B8A, 0xCAE2,\n\t0x6B8B, 0xB2D0, 0x6B8C, 0x9A80, 0x6B8D, 0xE9E8, 0x6B8E, 0x9A81,\t0x6B8F, 0x9A82, 0x6B90, 0x9A83, 0x6B91, 0x9A84, 0x6B92, 0xE9E6,\n\t0x6B93, 0xE9E7, 0x6B94, 0x9A85, 0x6B95, 0x9A86, 0x6B96, 0xD6B3,\t0x6B97, 0x9A87, 0x6B98, 0x9A88, 0x6B99, 0x9A89, 0x6B9A, 0xE9E9,\n\t0x6B9B, 0xE9EA, 0x6B9C, 0x9A8A, 0x6B9D, 0x9A8B, 0x6B9E, 0x9A8C,\t0x6B9F, 0x9A8D, 0x6BA0, 0x9A8E, 0x6BA1, 0xE9EB, 0x6BA2, 0x9A8F,\n\t0x6BA3, 0x9A90, 0x6BA4, 0x9A91, 0x6BA5, 0x9A92, 0x6BA6, 0x9A93,\t0x6BA7, 0x9A94, 0x6BA8, 0x9A95, 0x6BA9, 0x9A96, 0x6BAA, 0xE9EC,\n\t0x6BAB, 0x9A97, 0x6BAC, 0x9A98, 0x6BAD, 0x9A99, 0x6BAE, 0x9A9A,\t0x6BAF, 0x9A9B, 0x6BB0, 0x9A9C, 0x6BB1, 0x9A9D, 0x6BB2, 0x9A9E,\n\t0x6BB3, 0xECAF, 0x6BB4, 0xC5B9, 0x6BB5, 0xB6CE, 0x6BB6, 0x9A9F,\t0x6BB7, 0xD2F3, 0x6BB8, 0x9AA0, 0x6BB9, 0x9AA1, 0x6BBA, 0x9AA2,\n\t0x6BBB, 0x9AA3, 0x6BBC, 0x9AA4, 0x6BBD, 0x9AA5, 0x6BBE, 0x9AA6,\t0x6BBF, 0xB5EE, 0x6BC0, 0x9AA7, 0x6BC1, 0xBBD9, 0x6BC2, 0xECB1,\n\t0x6BC3, 0x9AA8, 0x6BC4, 0x9AA9, 0x6BC5, 0xD2E3, 0x6BC6, 0x9AAA,\t0x6BC7, 0x9AAB, 0x6BC8, 0x9AAC, 0x6BC9, 0x9AAD, 0x6BCA, 0x9AAE,\n\t0x6BCB, 0xCEE3, 0x6BCC, 0x9AAF, 0x6BCD, 0xC4B8, 0x6BCE, 0x9AB0,\t0x6BCF, 0xC3BF, 0x6BD0, 0x9AB1, 0x6BD1, 0x9AB2, 0x6BD2, 0xB6BE,\n\t0x6BD3, 0xD8B9, 0x6BD4, 0xB1C8, 0x6BD5, 0xB1CF, 0x6BD6, 0xB1D1,\t0x6BD7, 0xC5FE, 0x6BD8, 0x9AB3, 0x6BD9, 0xB1D0, 0x6BDA, 0x9AB4,\n\t0x6BDB, 0xC3AB, 0x6BDC, 0x9AB5, 0x6BDD, 0x9AB6, 0x6BDE, 0x9AB7,\t0x6BDF, 0x9AB8, 0x6BE0, 0x9AB9, 0x6BE1, 0xD5B1, 0x6BE2, 0x9ABA,\n\t0x6BE3, 0x9ABB, 0x6BE4, 0x9ABC, 0x6BE5, 0x9ABD, 0x6BE6, 0x9ABE,\t0x6BE7, 0x9ABF, 0x6BE8, 0x9AC0, 0x6BE9, 0x9AC1, 0x6BEA, 0xEBA4,\n\t0x6BEB, 0xBAC1, 0x6BEC, 0x9AC2, 0x6BED, 0x9AC3, 0x6BEE, 0x9AC4,\t0x6BEF, 0xCCBA, 0x6BF0, 0x9AC5, 0x6BF1, 0x9AC6, 0x6BF2, 0x9AC7,\n\t0x6BF3, 0xEBA5, 0x6BF4, 0x9AC8, 0x6BF5, 0xEBA7, 0x6BF6, 0x9AC9,\t0x6BF7, 0x9ACA, 0x6BF8, 0x9ACB, 0x6BF9, 0xEBA8, 0x6BFA, 0x9ACC,\n\t0x6BFB, 0x9ACD, 0x6BFC, 0x9ACE, 0x6BFD, 0xEBA6, 0x6BFE, 0x9ACF,\t0x6BFF, 0x9AD0, 0x6C00, 0x9AD1, 0x6C01, 0x9AD2, 0x6C02, 0x9AD3,\n\t0x6C03, 0x9AD4, 0x6C04, 0x9AD5, 0x6C05, 0xEBA9, 0x6C06, 0xEBAB,\t0x6C07, 0xEBAA, 0x6C08, 0x9AD6, 0x6C09, 0x9AD7, 0x6C0A, 0x9AD8,\n\t0x6C0B, 0x9AD9, 0x6C0C, 0x9ADA, 0x6C0D, 0xEBAC, 0x6C0E, 0x9ADB,\t0x6C0F, 0xCACF, 0x6C10, 0xD8B5, 0x6C11, 0xC3F1, 0x6C12, 0x9ADC,\n\t0x6C13, 0xC3A5, 0x6C14, 0xC6F8, 0x6C15, 0xEBAD, 0x6C16, 0xC4CA,\t0x6C17, 0x9ADD, 0x6C18, 0xEBAE, 0x6C19, 0xEBAF, 0x6C1A, 0xEBB0,\n\t0x6C1B, 0xB7D5, 0x6C1C, 0x9ADE, 0x6C1D, 0x9ADF, 0x6C1E, 0x9AE0,\t0x6C1F, 0xB7FA, 0x6C20, 0x9AE1, 0x6C21, 0xEBB1, 0x6C22, 0xC7E2,\n\t0x6C23, 0x9AE2, 0x6C24, 0xEBB3, 0x6C25, 0x9AE3, 0x6C26, 0xBAA4,\t0x6C27, 0xD1F5, 0x6C28, 0xB0B1, 0x6C29, 0xEBB2, 0x6C2A, 0xEBB4,\n\t0x6C2B, 0x9AE4, 0x6C2C, 0x9AE5, 0x6C2D, 0x9AE6, 0x6C2E, 0xB5AA,\t0x6C2F, 0xC2C8, 0x6C30, 0xC7E8, 0x6C31, 0x9AE7, 0x6C32, 0xEBB5,\n\t0x6C33, 0x9AE8, 0x6C34, 0xCBAE, 0x6C35, 0xE3DF, 0x6C36, 0x9AE9,\t0x6C37, 0x9AEA, 0x6C38, 0xD3C0, 0x6C39, 0x9AEB, 0x6C3A, 0x9AEC,\n\t0x6C3B, 0x9AED, 0x6C3C, 0x9AEE, 0x6C3D, 0xD9DB, 0x6C3E, 0x9AEF,\t0x6C3F, 0x9AF0, 0x6C40, 0xCDA1, 0x6C41, 0xD6AD, 0x6C42, 0xC7F3,\n\t0x6C43, 0x9AF1, 0x6C44, 0x9AF2, 0x6C45, 0x9AF3, 0x6C46, 0xD9E0,\t0x6C47, 0xBBE3, 0x6C48, 0x9AF4, 0x6C49, 0xBABA, 0x6C4A, 0xE3E2,\n\t0x6C4B, 0x9AF5, 0x6C4C, 0x9AF6, 0x6C4D, 0x9AF7, 0x6C4E, 0x9AF8,\t0x6C4F, 0x9AF9, 0x6C50, 0xCFAB, 0x6C51, 0x9AFA, 0x6C52, 0x9AFB,\n\t0x6C53, 0x9AFC, 0x6C54, 0xE3E0, 0x6C55, 0xC9C7, 0x6C56, 0x9AFD,\t0x6C57, 0xBAB9, 0x6C58, 0x9AFE, 0x6C59, 0x9B40, 0x6C5A, 0x9B41,\n\t0x6C5B, 0xD1B4, 0x6C5C, 0xE3E1, 0x6C5D, 0xC8EA, 0x6C5E, 0xB9AF,\t0x6C5F, 0xBDAD, 0x6C60, 0xB3D8, 0x6C61, 0xCEDB, 0x6C62, 0x9B42,\n\t0x6C63, 0x9B43, 0x6C64, 0xCCC0, 0x6C65, 0x9B44, 0x6C66, 0x9B45,\t0x6C67, 0x9B46, 0x6C68, 0xE3E8, 0x6C69, 0xE3E9, 0x6C6A, 0xCDF4,\n\t0x6C6B, 0x9B47, 0x6C6C, 0x9B48, 0x6C6D, 0x9B49, 0x6C6E, 0x9B4A,\t0x6C6F, 0x9B4B, 0x6C70, 0xCCAD, 0x6C71, 0x9B4C, 0x6C72, 0xBCB3,\n\t0x6C73, 0x9B4D, 0x6C74, 0xE3EA, 0x6C75, 0x9B4E, 0x6C76, 0xE3EB,\t0x6C77, 0x9B4F, 0x6C78, 0x9B50, 0x6C79, 0xD0DA, 0x6C7A, 0x9B51,\n\t0x6C7B, 0x9B52, 0x6C7C, 0x9B53, 0x6C7D, 0xC6FB, 0x6C7E, 0xB7DA,\t0x6C7F, 0x9B54, 0x6C80, 0x9B55, 0x6C81, 0xC7DF, 0x6C82, 0xD2CA,\n\t0x6C83, 0xCED6, 0x6C84, 0x9B56, 0x6C85, 0xE3E4, 0x6C86, 0xE3EC,\t0x6C87, 0x9B57, 0x6C88, 0xC9F2, 0x6C89, 0xB3C1, 0x6C8A, 0x9B58,\n\t0x6C8B, 0x9B59, 0x6C8C, 0xE3E7, 0x6C8D, 0x9B5A, 0x6C8E, 0x9B5B,\t0x6C8F, 0xC6E3, 0x6C90, 0xE3E5, 0x6C91, 0x9B5C, 0x6C92, 0x9B5D,\n\t0x6C93, 0xEDB3, 0x6C94, 0xE3E6, 0x6C95, 0x9B5E, 0x6C96, 0x9B5F,\t0x6C97, 0x9B60, 0x6C98, 0x9B61, 0x6C99, 0xC9B3, 0x6C9A, 0x9B62,\n\t0x6C9B, 0xC5E6, 0x6C9C, 0x9B63, 0x6C9D, 0x9B64, 0x6C9E, 0x9B65,\t0x6C9F, 0xB9B5, 0x6CA0, 0x9B66, 0x6CA1, 0xC3BB, 0x6CA2, 0x9B67,\n\t0x6CA3, 0xE3E3, 0x6CA4, 0xC5BD, 0x6CA5, 0xC1A4, 0x6CA6, 0xC2D9,\t0x6CA7, 0xB2D7, 0x6CA8, 0x9B68, 0x6CA9, 0xE3ED, 0x6CAA, 0xBBA6,\n\t0x6CAB, 0xC4AD, 0x6CAC, 0x9B69, 0x6CAD, 0xE3F0, 0x6CAE, 0xBEDA,\t0x6CAF, 0x9B6A, 0x6CB0, 0x9B6B, 0x6CB1, 0xE3FB, 0x6CB2, 0xE3F5,\n\t0x6CB3, 0xBAD3, 0x6CB4, 0x9B6C, 0x6CB5, 0x9B6D, 0x6CB6, 0x9B6E,\t0x6CB7, 0x9B6F, 0x6CB8, 0xB7D0, 0x6CB9, 0xD3CD, 0x6CBA, 0x9B70,\n\t0x6CBB, 0xD6CE, 0x6CBC, 0xD5D3, 0x6CBD, 0xB9C1, 0x6CBE, 0xD5B4,\t0x6CBF, 0xD1D8, 0x6CC0, 0x9B71, 0x6CC1, 0x9B72, 0x6CC2, 0x9B73,\n\t0x6CC3, 0x9B74, 0x6CC4, 0xD0B9, 0x6CC5, 0xC7F6, 0x6CC6, 0x9B75,\t0x6CC7, 0x9B76, 0x6CC8, 0x9B77, 0x6CC9, 0xC8AA, 0x6CCA, 0xB2B4,\n\t0x6CCB, 0x9B78, 0x6CCC, 0xC3DA, 0x6CCD, 0x9B79, 0x6CCE, 0x9B7A,\t0x6CCF, 0x9B7B, 0x6CD0, 0xE3EE, 0x6CD1, 0x9B7C, 0x6CD2, 0x9B7D,\n\t0x6CD3, 0xE3FC, 0x6CD4, 0xE3EF, 0x6CD5, 0xB7A8, 0x6CD6, 0xE3F7,\t0x6CD7, 0xE3F4, 0x6CD8, 0x9B7E, 0x6CD9, 0x9B80, 0x6CDA, 0x9B81,\n\t0x6CDB, 0xB7BA, 0x6CDC, 0x9B82, 0x6CDD, 0x9B83, 0x6CDE, 0xC5A2,\t0x6CDF, 0x9B84, 0x6CE0, 0xE3F6, 0x6CE1, 0xC5DD, 0x6CE2, 0xB2A8,\n\t0x6CE3, 0xC6FC, 0x6CE4, 0x9B85, 0x6CE5, 0xC4E0, 0x6CE6, 0x9B86,\t0x6CE7, 0x9B87, 0x6CE8, 0xD7A2, 0x6CE9, 0x9B88, 0x6CEA, 0xC0E1,\n\t0x6CEB, 0xE3F9, 0x6CEC, 0x9B89, 0x6CED, 0x9B8A, 0x6CEE, 0xE3FA,\t0x6CEF, 0xE3FD, 0x6CF0, 0xCCA9, 0x6CF1, 0xE3F3, 0x6CF2, 0x9B8B,\n\t0x6CF3, 0xD3BE, 0x6CF4, 0x9B8C, 0x6CF5, 0xB1C3, 0x6CF6, 0xEDB4,\t0x6CF7, 0xE3F1, 0x6CF8, 0xE3F2, 0x6CF9, 0x9B8D, 0x6CFA, 0xE3F8,\n\t0x6CFB, 0xD0BA, 0x6CFC, 0xC6C3, 0x6CFD, 0xD4F3, 0x6CFE, 0xE3FE,\t0x6CFF, 0x9B8E, 0x6D00, 0x9B8F, 0x6D01, 0xBDE0, 0x6D02, 0x9B90,\n\t0x6D03, 0x9B91, 0x6D04, 0xE4A7, 0x6D05, 0x9B92, 0x6D06, 0x9B93,\t0x6D07, 0xE4A6, 0x6D08, 0x9B94, 0x6D09, 0x9B95, 0x6D0A, 0x9B96,\n\t0x6D0B, 0xD1F3, 0x6D0C, 0xE4A3, 0x6D0D, 0x9B97, 0x6D0E, 0xE4A9,\t0x6D0F, 0x9B98, 0x6D10, 0x9B99, 0x6D11, 0x9B9A, 0x6D12, 0xC8F7,\n\t0x6D13, 0x9B9B, 0x6D14, 0x9B9C, 0x6D15, 0x9B9D, 0x6D16, 0x9B9E,\t0x6D17, 0xCFB4, 0x6D18, 0x9B9F, 0x6D19, 0xE4A8, 0x6D1A, 0xE4AE,\n\t0x6D1B, 0xC2E5, 0x6D1C, 0x9BA0, 0x6D1D, 0x9BA1, 0x6D1E, 0xB6B4,\t0x6D1F, 0x9BA2, 0x6D20, 0x9BA3, 0x6D21, 0x9BA4, 0x6D22, 0x9BA5,\n\t0x6D23, 0x9BA6, 0x6D24, 0x9BA7, 0x6D25, 0xBDF2, 0x6D26, 0x9BA8,\t0x6D27, 0xE4A2, 0x6D28, 0x9BA9, 0x6D29, 0x9BAA, 0x6D2A, 0xBAE9,\n\t0x6D2B, 0xE4AA, 0x6D2C, 0x9BAB, 0x6D2D, 0x9BAC, 0x6D2E, 0xE4AC,\t0x6D2F, 0x9BAD, 0x6D30, 0x9BAE, 0x6D31, 0xB6FD, 0x6D32, 0xD6DE,\n\t0x6D33, 0xE4B2, 0x6D34, 0x9BAF, 0x6D35, 0xE4AD, 0x6D36, 0x9BB0,\t0x6D37, 0x9BB1, 0x6D38, 0x9BB2, 0x6D39, 0xE4A1, 0x6D3A, 0x9BB3,\n\t0x6D3B, 0xBBEE, 0x6D3C, 0xCDDD, 0x6D3D, 0xC7A2, 0x6D3E, 0xC5C9,\t0x6D3F, 0x9BB4, 0x6D40, 0x9BB5, 0x6D41, 0xC1F7, 0x6D42, 0x9BB6,\n\t0x6D43, 0xE4A4, 0x6D44, 0x9BB7, 0x6D45, 0xC7B3, 0x6D46, 0xBDAC,\t0x6D47, 0xBDBD, 0x6D48, 0xE4A5, 0x6D49, 0x9BB8, 0x6D4A, 0xD7C7,\n\t0x6D4B, 0xB2E2, 0x6D4C, 0x9BB9, 0x6D4D, 0xE4AB, 0x6D4E, 0xBCC3,\t0x6D4F, 0xE4AF, 0x6D50, 0x9BBA, 0x6D51, 0xBBEB, 0x6D52, 0xE4B0,\n\t0x6D53, 0xC5A8, 0x6D54, 0xE4B1, 0x6D55, 0x9BBB, 0x6D56, 0x9BBC,\t0x6D57, 0x9BBD, 0x6D58, 0x9BBE, 0x6D59, 0xD5E3, 0x6D5A, 0xBFA3,\n\t0x6D5B, 0x9BBF, 0x6D5C, 0xE4BA, 0x6D5D, 0x9BC0, 0x6D5E, 0xE4B7,\t0x6D5F, 0x9BC1, 0x6D60, 0xE4BB, 0x6D61, 0x9BC2, 0x6D62, 0x9BC3,\n\t0x6D63, 0xE4BD, 0x6D64, 0x9BC4, 0x6D65, 0x9BC5, 0x6D66, 0xC6D6,\t0x6D67, 0x9BC6, 0x6D68, 0x9BC7, 0x6D69, 0xBAC6, 0x6D6A, 0xC0CB,\n\t0x6D6B, 0x9BC8, 0x6D6C, 0x9BC9, 0x6D6D, 0x9BCA, 0x6D6E, 0xB8A1,\t0x6D6F, 0xE4B4, 0x6D70, 0x9BCB, 0x6D71, 0x9BCC, 0x6D72, 0x9BCD,\n\t0x6D73, 0x9BCE, 0x6D74, 0xD4A1, 0x6D75, 0x9BCF, 0x6D76, 0x9BD0,\t0x6D77, 0xBAA3, 0x6D78, 0xBDFE, 0x6D79, 0x9BD1, 0x6D7A, 0x9BD2,\n\t0x6D7B, 0x9BD3, 0x6D7C, 0xE4BC, 0x6D7D, 0x9BD4, 0x6D7E, 0x9BD5,\t0x6D7F, 0x9BD6, 0x6D80, 0x9BD7, 0x6D81, 0x9BD8, 0x6D82, 0xCDBF,\n\t0x6D83, 0x9BD9, 0x6D84, 0x9BDA, 0x6D85, 0xC4F9, 0x6D86, 0x9BDB,\t0x6D87, 0x9BDC, 0x6D88, 0xCFFB, 0x6D89, 0xC9E6, 0x6D8A, 0x9BDD,\n\t0x6D8B, 0x9BDE, 0x6D8C, 0xD3BF, 0x6D8D, 0x9BDF, 0x6D8E, 0xCFD1,\t0x6D8F, 0x9BE0, 0x6D90, 0x9BE1, 0x6D91, 0xE4B3, 0x6D92, 0x9BE2,\n\t0x6D93, 0xE4B8, 0x6D94, 0xE4B9, 0x6D95, 0xCCE9, 0x6D96, 0x9BE3,\t0x6D97, 0x9BE4, 0x6D98, 0x9BE5, 0x6D99, 0x9BE6, 0x6D9A, 0x9BE7,\n\t0x6D9B, 0xCCCE, 0x6D9C, 0x9BE8, 0x6D9D, 0xC0D4, 0x6D9E, 0xE4B5,\t0x6D9F, 0xC1B0, 0x6DA0, 0xE4B6, 0x6DA1, 0xCED0, 0x6DA2, 0x9BE9,\n\t0x6DA3, 0xBBC1, 0x6DA4, 0xB5D3, 0x6DA5, 0x9BEA, 0x6DA6, 0xC8F3,\t0x6DA7, 0xBDA7, 0x6DA8, 0xD5C7, 0x6DA9, 0xC9AC, 0x6DAA, 0xB8A2,\n\t0x6DAB, 0xE4CA, 0x6DAC, 0x9BEB, 0x6DAD, 0x9BEC, 0x6DAE, 0xE4CC,\t0x6DAF, 0xD1C4, 0x6DB0, 0x9BED, 0x6DB1, 0x9BEE, 0x6DB2, 0xD2BA,\n\t0x6DB3, 0x9BEF, 0x6DB4, 0x9BF0, 0x6DB5, 0xBAAD, 0x6DB6, 0x9BF1,\t0x6DB7, 0x9BF2, 0x6DB8, 0xBAD4, 0x6DB9, 0x9BF3, 0x6DBA, 0x9BF4,\n\t0x6DBB, 0x9BF5, 0x6DBC, 0x9BF6, 0x6DBD, 0x9BF7, 0x6DBE, 0x9BF8,\t0x6DBF, 0xE4C3, 0x6DC0, 0xB5ED, 0x6DC1, 0x9BF9, 0x6DC2, 0x9BFA,\n\t0x6DC3, 0x9BFB, 0x6DC4, 0xD7CD, 0x6DC5, 0xE4C0, 0x6DC6, 0xCFFD,\t0x6DC7, 0xE4BF, 0x6DC8, 0x9BFC, 0x6DC9, 0x9BFD, 0x6DCA, 0x9BFE,\n\t0x6DCB, 0xC1DC, 0x6DCC, 0xCCCA, 0x6DCD, 0x9C40, 0x6DCE, 0x9C41,\t0x6DCF, 0x9C42, 0x6DD0, 0x9C43, 0x6DD1, 0xCAE7, 0x6DD2, 0x9C44,\n\t0x6DD3, 0x9C45, 0x6DD4, 0x9C46, 0x6DD5, 0x9C47, 0x6DD6, 0xC4D7,\t0x6DD7, 0x9C48, 0x6DD8, 0xCCD4, 0x6DD9, 0xE4C8, 0x6DDA, 0x9C49,\n\t0x6DDB, 0x9C4A, 0x6DDC, 0x9C4B, 0x6DDD, 0xE4C7, 0x6DDE, 0xE4C1,\t0x6DDF, 0x9C4C, 0x6DE0, 0xE4C4, 0x6DE1, 0xB5AD, 0x6DE2, 0x9C4D,\n\t0x6DE3, 0x9C4E, 0x6DE4, 0xD3D9, 0x6DE5, 0x9C4F, 0x6DE6, 0xE4C6,\t0x6DE7, 0x9C50, 0x6DE8, 0x9C51, 0x6DE9, 0x9C52, 0x6DEA, 0x9C53,\n\t0x6DEB, 0xD2F9, 0x6DEC, 0xB4E3, 0x6DED, 0x9C54, 0x6DEE, 0xBBB4,\t0x6DEF, 0x9C55, 0x6DF0, 0x9C56, 0x6DF1, 0xC9EE, 0x6DF2, 0x9C57,\n\t0x6DF3, 0xB4BE, 0x6DF4, 0x9C58, 0x6DF5, 0x9C59, 0x6DF6, 0x9C5A,\t0x6DF7, 0xBBEC, 0x6DF8, 0x9C5B, 0x6DF9, 0xD1CD, 0x6DFA, 0x9C5C,\n\t0x6DFB, 0xCCED, 0x6DFC, 0xEDB5, 0x6DFD, 0x9C5D, 0x6DFE, 0x9C5E,\t0x6DFF, 0x9C5F, 0x6E00, 0x9C60, 0x6E01, 0x9C61, 0x6E02, 0x9C62,\n\t0x6E03, 0x9C63, 0x6E04, 0x9C64, 0x6E05, 0xC7E5, 0x6E06, 0x9C65,\t0x6E07, 0x9C66, 0x6E08, 0x9C67, 0x6E09, 0x9C68, 0x6E0A, 0xD4A8,\n\t0x6E0B, 0x9C69, 0x6E0C, 0xE4CB, 0x6E0D, 0xD7D5, 0x6E0E, 0xE4C2,\t0x6E0F, 0x9C6A, 0x6E10, 0xBDA5, 0x6E11, 0xE4C5, 0x6E12, 0x9C6B,\n\t0x6E13, 0x9C6C, 0x6E14, 0xD3E6, 0x6E15, 0x9C6D, 0x6E16, 0xE4C9,\t0x6E17, 0xC9F8, 0x6E18, 0x9C6E, 0x6E19, 0x9C6F, 0x6E1A, 0xE4BE,\n\t0x6E1B, 0x9C70, 0x6E1C, 0x9C71, 0x6E1D, 0xD3E5, 0x6E1E, 0x9C72,\t0x6E1F, 0x9C73, 0x6E20, 0xC7FE, 0x6E21, 0xB6C9, 0x6E22, 0x9C74,\n\t0x6E23, 0xD4FC, 0x6E24, 0xB2B3, 0x6E25, 0xE4D7, 0x6E26, 0x9C75,\t0x6E27, 0x9C76, 0x6E28, 0x9C77, 0x6E29, 0xCEC2, 0x6E2A, 0x9C78,\n\t0x6E2B, 0xE4CD, 0x6E2C, 0x9C79, 0x6E2D, 0xCEBC, 0x6E2E, 0x9C7A,\t0x6E2F, 0xB8DB, 0x6E30, 0x9C7B, 0x6E31, 0x9C7C, 0x6E32, 0xE4D6,\n\t0x6E33, 0x9C7D, 0x6E34, 0xBFCA, 0x6E35, 0x9C7E, 0x6E36, 0x9C80,\t0x6E37, 0x9C81, 0x6E38, 0xD3CE, 0x6E39, 0x9C82, 0x6E3A, 0xC3EC,\n\t0x6E3B, 0x9C83, 0x6E3C, 0x9C84, 0x6E3D, 0x9C85, 0x6E3E, 0x9C86,\t0x6E3F, 0x9C87, 0x6E40, 0x9C88, 0x6E41, 0x9C89, 0x6E42, 0x9C8A,\n\t0x6E43, 0xC5C8, 0x6E44, 0xE4D8, 0x6E45, 0x9C8B, 0x6E46, 0x9C8C,\t0x6E47, 0x9C8D, 0x6E48, 0x9C8E, 0x6E49, 0x9C8F, 0x6E4A, 0x9C90,\n\t0x6E4B, 0x9C91, 0x6E4C, 0x9C92, 0x6E4D, 0xCDC4, 0x6E4E, 0xE4CF,\t0x6E4F, 0x9C93, 0x6E50, 0x9C94, 0x6E51, 0x9C95, 0x6E52, 0x9C96,\n\t0x6E53, 0xE4D4, 0x6E54, 0xE4D5, 0x6E55, 0x9C97, 0x6E56, 0xBAFE,\t0x6E57, 0x9C98, 0x6E58, 0xCFE6, 0x6E59, 0x9C99, 0x6E5A, 0x9C9A,\n\t0x6E5B, 0xD5BF, 0x6E5C, 0x9C9B, 0x6E5D, 0x9C9C, 0x6E5E, 0x9C9D,\t0x6E5F, 0xE4D2, 0x6E60, 0x9C9E, 0x6E61, 0x9C9F, 0x6E62, 0x9CA0,\n\t0x6E63, 0x9CA1, 0x6E64, 0x9CA2, 0x6E65, 0x9CA3, 0x6E66, 0x9CA4,\t0x6E67, 0x9CA5, 0x6E68, 0x9CA6, 0x6E69, 0x9CA7, 0x6E6A, 0x9CA8,\n\t0x6E6B, 0xE4D0, 0x6E6C, 0x9CA9, 0x6E6D, 0x9CAA, 0x6E6E, 0xE4CE,\t0x6E6F, 0x9CAB, 0x6E70, 0x9CAC, 0x6E71, 0x9CAD, 0x6E72, 0x9CAE,\n\t0x6E73, 0x9CAF, 0x6E74, 0x9CB0, 0x6E75, 0x9CB1, 0x6E76, 0x9CB2,\t0x6E77, 0x9CB3, 0x6E78, 0x9CB4, 0x6E79, 0x9CB5, 0x6E7A, 0x9CB6,\n\t0x6E7B, 0x9CB7, 0x6E7C, 0x9CB8, 0x6E7D, 0x9CB9, 0x6E7E, 0xCDE5,\t0x6E7F, 0xCAAA, 0x6E80, 0x9CBA, 0x6E81, 0x9CBB, 0x6E82, 0x9CBC,\n\t0x6E83, 0xC0A3, 0x6E84, 0x9CBD, 0x6E85, 0xBDA6, 0x6E86, 0xE4D3,\t0x6E87, 0x9CBE, 0x6E88, 0x9CBF, 0x6E89, 0xB8C8, 0x6E8A, 0x9CC0,\n\t0x6E8B, 0x9CC1, 0x6E8C, 0x9CC2, 0x6E8D, 0x9CC3, 0x6E8E, 0x9CC4,\t0x6E8F, 0xE4E7, 0x6E90, 0xD4B4, 0x6E91, 0x9CC5, 0x6E92, 0x9CC6,\n\t0x6E93, 0x9CC7, 0x6E94, 0x9CC8, 0x6E95, 0x9CC9, 0x6E96, 0x9CCA,\t0x6E97, 0x9CCB, 0x6E98, 0xE4DB, 0x6E99, 0x9CCC, 0x6E9A, 0x9CCD,\n\t0x6E9B, 0x9CCE, 0x6E9C, 0xC1EF, 0x6E9D, 0x9CCF, 0x6E9E, 0x9CD0,\t0x6E9F, 0xE4E9, 0x6EA0, 0x9CD1, 0x6EA1, 0x9CD2, 0x6EA2, 0xD2E7,\n\t0x6EA3, 0x9CD3, 0x6EA4, 0x9CD4, 0x6EA5, 0xE4DF, 0x6EA6, 0x9CD5,\t0x6EA7, 0xE4E0, 0x6EA8, 0x9CD6, 0x6EA9, 0x9CD7, 0x6EAA, 0xCFAA,\n\t0x6EAB, 0x9CD8, 0x6EAC, 0x9CD9, 0x6EAD, 0x9CDA, 0x6EAE, 0x9CDB,\t0x6EAF, 0xCBDD, 0x6EB0, 0x9CDC, 0x6EB1, 0xE4DA, 0x6EB2, 0xE4D1,\n\t0x6EB3, 0x9CDD, 0x6EB4, 0xE4E5, 0x6EB5, 0x9CDE, 0x6EB6, 0xC8DC,\t0x6EB7, 0xE4E3, 0x6EB8, 0x9CDF, 0x6EB9, 0x9CE0, 0x6EBA, 0xC4E7,\n\t0x6EBB, 0xE4E2, 0x6EBC, 0x9CE1, 0x6EBD, 0xE4E1, 0x6EBE, 0x9CE2,\t0x6EBF, 0x9CE3, 0x6EC0, 0x9CE4, 0x6EC1, 0xB3FC, 0x6EC2, 0xE4E8,\n\t0x6EC3, 0x9CE5, 0x6EC4, 0x9CE6, 0x6EC5, 0x9CE7, 0x6EC6, 0x9CE8,\t0x6EC7, 0xB5E1, 0x6EC8, 0x9CE9, 0x6EC9, 0x9CEA, 0x6ECA, 0x9CEB,\n\t0x6ECB, 0xD7CC, 0x6ECC, 0x9CEC, 0x6ECD, 0x9CED, 0x6ECE, 0x9CEE,\t0x6ECF, 0xE4E6, 0x6ED0, 0x9CEF, 0x6ED1, 0xBBAC, 0x6ED2, 0x9CF0,\n\t0x6ED3, 0xD7D2, 0x6ED4, 0xCCCF, 0x6ED5, 0xEBF8, 0x6ED6, 0x9CF1,\t0x6ED7, 0xE4E4, 0x6ED8, 0x9CF2, 0x6ED9, 0x9CF3, 0x6EDA, 0xB9F6,\n\t0x6EDB, 0x9CF4, 0x6EDC, 0x9CF5, 0x6EDD, 0x9CF6, 0x6EDE, 0xD6CD,\t0x6EDF, 0xE4D9, 0x6EE0, 0xE4DC, 0x6EE1, 0xC2FA, 0x6EE2, 0xE4DE,\n\t0x6EE3, 0x9CF7, 0x6EE4, 0xC2CB, 0x6EE5, 0xC0C4, 0x6EE6, 0xC2D0,\t0x6EE7, 0x9CF8, 0x6EE8, 0xB1F5, 0x6EE9, 0xCCB2, 0x6EEA, 0x9CF9,\n\t0x6EEB, 0x9CFA, 0x6EEC, 0x9CFB, 0x6EED, 0x9CFC, 0x6EEE, 0x9CFD,\t0x6EEF, 0x9CFE, 0x6EF0, 0x9D40, 0x6EF1, 0x9D41, 0x6EF2, 0x9D42,\n\t0x6EF3, 0x9D43, 0x6EF4, 0xB5CE, 0x6EF5, 0x9D44, 0x6EF6, 0x9D45,\t0x6EF7, 0x9D46, 0x6EF8, 0x9D47, 0x6EF9, 0xE4EF, 0x6EFA, 0x9D48,\n\t0x6EFB, 0x9D49, 0x6EFC, 0x9D4A, 0x6EFD, 0x9D4B, 0x6EFE, 0x9D4C,\t0x6EFF, 0x9D4D, 0x6F00, 0x9D4E, 0x6F01, 0x9D4F, 0x6F02, 0xC6AF,\n\t0x6F03, 0x9D50, 0x6F04, 0x9D51, 0x6F05, 0x9D52, 0x6F06, 0xC6E1,\t0x6F07, 0x9D53, 0x6F08, 0x9D54, 0x6F09, 0xE4F5, 0x6F0A, 0x9D55,\n\t0x6F0B, 0x9D56, 0x6F0C, 0x9D57, 0x6F0D, 0x9D58, 0x6F0E, 0x9D59,\t0x6F0F, 0xC2A9, 0x6F10, 0x9D5A, 0x6F11, 0x9D5B, 0x6F12, 0x9D5C,\n\t0x6F13, 0xC0EC, 0x6F14, 0xD1DD, 0x6F15, 0xE4EE, 0x6F16, 0x9D5D,\t0x6F17, 0x9D5E, 0x6F18, 0x9D5F, 0x6F19, 0x9D60, 0x6F1A, 0x9D61,\n\t0x6F1B, 0x9D62, 0x6F1C, 0x9D63, 0x6F1D, 0x9D64, 0x6F1E, 0x9D65,\t0x6F1F, 0x9D66, 0x6F20, 0xC4AE, 0x6F21, 0x9D67, 0x6F22, 0x9D68,\n\t0x6F23, 0x9D69, 0x6F24, 0xE4ED, 0x6F25, 0x9D6A, 0x6F26, 0x9D6B,\t0x6F27, 0x9D6C, 0x6F28, 0x9D6D, 0x6F29, 0xE4F6, 0x6F2A, 0xE4F4,\n\t0x6F2B, 0xC2FE, 0x6F2C, 0x9D6E, 0x6F2D, 0xE4DD, 0x6F2E, 0x9D6F,\t0x6F2F, 0xE4F0, 0x6F30, 0x9D70, 0x6F31, 0xCAFE, 0x6F32, 0x9D71,\n\t0x6F33, 0xD5C4, 0x6F34, 0x9D72, 0x6F35, 0x9D73, 0x6F36, 0xE4F1,\t0x6F37, 0x9D74, 0x6F38, 0x9D75, 0x6F39, 0x9D76, 0x6F3A, 0x9D77,\n\t0x6F3B, 0x9D78, 0x6F3C, 0x9D79, 0x6F3D, 0x9D7A, 0x6F3E, 0xD1FA,\t0x6F3F, 0x9D7B, 0x6F40, 0x9D7C, 0x6F41, 0x9D7D, 0x6F42, 0x9D7E,\n\t0x6F43, 0x9D80, 0x6F44, 0x9D81, 0x6F45, 0x9D82, 0x6F46, 0xE4EB,\t0x6F47, 0xE4EC, 0x6F48, 0x9D83, 0x6F49, 0x9D84, 0x6F4A, 0x9D85,\n\t0x6F4B, 0xE4F2, 0x6F4C, 0x9D86, 0x6F4D, 0xCEAB, 0x6F4E, 0x9D87,\t0x6F4F, 0x9D88, 0x6F50, 0x9D89, 0x6F51, 0x9D8A, 0x6F52, 0x9D8B,\n\t0x6F53, 0x9D8C, 0x6F54, 0x9D8D, 0x6F55, 0x9D8E, 0x6F56, 0x9D8F,\t0x6F57, 0x9D90, 0x6F58, 0xC5CB, 0x6F59, 0x9D91, 0x6F5A, 0x9D92,\n\t0x6F5B, 0x9D93, 0x6F5C, 0xC7B1, 0x6F5D, 0x9D94, 0x6F5E, 0xC2BA,\t0x6F5F, 0x9D95, 0x6F60, 0x9D96, 0x6F61, 0x9D97, 0x6F62, 0xE4EA,\n\t0x6F63, 0x9D98, 0x6F64, 0x9D99, 0x6F65, 0x9D9A, 0x6F66, 0xC1CA,\t0x6F67, 0x9D9B, 0x6F68, 0x9D9C, 0x6F69, 0x9D9D, 0x6F6A, 0x9D9E,\n\t0x6F6B, 0x9D9F, 0x6F6C, 0x9DA0, 0x6F6D, 0xCCB6, 0x6F6E, 0xB3B1,\t0x6F6F, 0x9DA1, 0x6F70, 0x9DA2, 0x6F71, 0x9DA3, 0x6F72, 0xE4FB,\n\t0x6F73, 0x9DA4, 0x6F74, 0xE4F3, 0x6F75, 0x9DA5, 0x6F76, 0x9DA6,\t0x6F77, 0x9DA7, 0x6F78, 0xE4FA, 0x6F79, 0x9DA8, 0x6F7A, 0xE4FD,\n\t0x6F7B, 0x9DA9, 0x6F7C, 0xE4FC, 0x6F7D, 0x9DAA, 0x6F7E, 0x9DAB,\t0x6F7F, 0x9DAC, 0x6F80, 0x9DAD, 0x6F81, 0x9DAE, 0x6F82, 0x9DAF,\n\t0x6F83, 0x9DB0, 0x6F84, 0xB3CE, 0x6F85, 0x9DB1, 0x6F86, 0x9DB2,\t0x6F87, 0x9DB3, 0x6F88, 0xB3BA, 0x6F89, 0xE4F7, 0x6F8A, 0x9DB4,\n\t0x6F8B, 0x9DB5, 0x6F8C, 0xE4F9, 0x6F8D, 0xE4F8, 0x6F8E, 0xC5EC,\t0x6F8F, 0x9DB6, 0x6F90, 0x9DB7, 0x6F91, 0x9DB8, 0x6F92, 0x9DB9,\n\t0x6F93, 0x9DBA, 0x6F94, 0x9DBB, 0x6F95, 0x9DBC, 0x6F96, 0x9DBD,\t0x6F97, 0x9DBE, 0x6F98, 0x9DBF, 0x6F99, 0x9DC0, 0x6F9A, 0x9DC1,\n\t0x6F9B, 0x9DC2, 0x6F9C, 0xC0BD, 0x6F9D, 0x9DC3, 0x6F9E, 0x9DC4,\t0x6F9F, 0x9DC5, 0x6FA0, 0x9DC6, 0x6FA1, 0xD4E8, 0x6FA2, 0x9DC7,\n\t0x6FA3, 0x9DC8, 0x6FA4, 0x9DC9, 0x6FA5, 0x9DCA, 0x6FA6, 0x9DCB,\t0x6FA7, 0xE5A2, 0x6FA8, 0x9DCC, 0x6FA9, 0x9DCD, 0x6FAA, 0x9DCE,\n\t0x6FAB, 0x9DCF, 0x6FAC, 0x9DD0, 0x6FAD, 0x9DD1, 0x6FAE, 0x9DD2,\t0x6FAF, 0x9DD3, 0x6FB0, 0x9DD4, 0x6FB1, 0x9DD5, 0x6FB2, 0x9DD6,\n\t0x6FB3, 0xB0C4, 0x6FB4, 0x9DD7, 0x6FB5, 0x9DD8, 0x6FB6, 0xE5A4,\t0x6FB7, 0x9DD9, 0x6FB8, 0x9DDA, 0x6FB9, 0xE5A3, 0x6FBA, 0x9DDB,\n\t0x6FBB, 0x9DDC, 0x6FBC, 0x9DDD, 0x6FBD, 0x9DDE, 0x6FBE, 0x9DDF,\t0x6FBF, 0x9DE0, 0x6FC0, 0xBCA4, 0x6FC1, 0x9DE1, 0x6FC2, 0xE5A5,\n\t0x6FC3, 0x9DE2, 0x6FC4, 0x9DE3, 0x6FC5, 0x9DE4, 0x6FC6, 0x9DE5,\t0x6FC7, 0x9DE6, 0x6FC8, 0x9DE7, 0x6FC9, 0xE5A1, 0x6FCA, 0x9DE8,\n\t0x6FCB, 0x9DE9, 0x6FCC, 0x9DEA, 0x6FCD, 0x9DEB, 0x6FCE, 0x9DEC,\t0x6FCF, 0x9DED, 0x6FD0, 0x9DEE, 0x6FD1, 0xE4FE, 0x6FD2, 0xB1F4,\n\t0x6FD3, 0x9DEF, 0x6FD4, 0x9DF0, 0x6FD5, 0x9DF1, 0x6FD6, 0x9DF2,\t0x6FD7, 0x9DF3, 0x6FD8, 0x9DF4, 0x6FD9, 0x9DF5, 0x6FDA, 0x9DF6,\n\t0x6FDB, 0x9DF7, 0x6FDC, 0x9DF8, 0x6FDD, 0x9DF9, 0x6FDE, 0xE5A8,\t0x6FDF, 0x9DFA, 0x6FE0, 0xE5A9, 0x6FE1, 0xE5A6, 0x6FE2, 0x9DFB,\n\t0x6FE3, 0x9DFC, 0x6FE4, 0x9DFD, 0x6FE5, 0x9DFE, 0x6FE6, 0x9E40,\t0x6FE7, 0x9E41, 0x6FE8, 0x9E42, 0x6FE9, 0x9E43, 0x6FEA, 0x9E44,\n\t0x6FEB, 0x9E45, 0x6FEC, 0x9E46, 0x6FED, 0x9E47, 0x6FEE, 0xE5A7,\t0x6FEF, 0xE5AA, 0x6FF0, 0x9E48, 0x6FF1, 0x9E49, 0x6FF2, 0x9E4A,\n\t0x6FF3, 0x9E4B, 0x6FF4, 0x9E4C, 0x6FF5, 0x9E4D, 0x6FF6, 0x9E4E,\t0x6FF7, 0x9E4F, 0x6FF8, 0x9E50, 0x6FF9, 0x9E51, 0x6FFA, 0x9E52,\n\t0x6FFB, 0x9E53, 0x6FFC, 0x9E54, 0x6FFD, 0x9E55, 0x6FFE, 0x9E56,\t0x6FFF, 0x9E57, 0x7000, 0x9E58, 0x7001, 0x9E59, 0x7002, 0x9E5A,\n\t0x7003, 0x9E5B, 0x7004, 0x9E5C, 0x7005, 0x9E5D, 0x7006, 0x9E5E,\t0x7007, 0x9E5F, 0x7008, 0x9E60, 0x7009, 0x9E61, 0x700A, 0x9E62,\n\t0x700B, 0x9E63, 0x700C, 0x9E64, 0x700D, 0x9E65, 0x700E, 0x9E66,\t0x700F, 0x9E67, 0x7010, 0x9E68, 0x7011, 0xC6D9, 0x7012, 0x9E69,\n\t0x7013, 0x9E6A, 0x7014, 0x9E6B, 0x7015, 0x9E6C, 0x7016, 0x9E6D,\t0x7017, 0x9E6E, 0x7018, 0x9E6F, 0x7019, 0x9E70, 0x701A, 0xE5AB,\n\t0x701B, 0xE5AD, 0x701C, 0x9E71, 0x701D, 0x9E72, 0x701E, 0x9E73,\t0x701F, 0x9E74, 0x7020, 0x9E75, 0x7021, 0x9E76, 0x7022, 0x9E77,\n\t0x7023, 0xE5AC, 0x7024, 0x9E78, 0x7025, 0x9E79, 0x7026, 0x9E7A,\t0x7027, 0x9E7B, 0x7028, 0x9E7C, 0x7029, 0x9E7D, 0x702A, 0x9E7E,\n\t0x702B, 0x9E80, 0x702C, 0x9E81, 0x702D, 0x9E82, 0x702E, 0x9E83,\t0x702F, 0x9E84, 0x7030, 0x9E85, 0x7031, 0x9E86, 0x7032, 0x9E87,\n\t0x7033, 0x9E88, 0x7034, 0x9E89, 0x7035, 0xE5AF, 0x7036, 0x9E8A,\t0x7037, 0x9E8B, 0x7038, 0x9E8C, 0x7039, 0xE5AE, 0x703A, 0x9E8D,\n\t0x703B, 0x9E8E, 0x703C, 0x9E8F, 0x703D, 0x9E90, 0x703E, 0x9E91,\t0x703F, 0x9E92, 0x7040, 0x9E93, 0x7041, 0x9E94, 0x7042, 0x9E95,\n\t0x7043, 0x9E96, 0x7044, 0x9E97, 0x7045, 0x9E98, 0x7046, 0x9E99,\t0x7047, 0x9E9A, 0x7048, 0x9E9B, 0x7049, 0x9E9C, 0x704A, 0x9E9D,\n\t0x704B, 0x9E9E, 0x704C, 0xB9E0, 0x704D, 0x9E9F, 0x704E, 0x9EA0,\t0x704F, 0xE5B0, 0x7050, 0x9EA1, 0x7051, 0x9EA2, 0x7052, 0x9EA3,\n\t0x7053, 0x9EA4, 0x7054, 0x9EA5, 0x7055, 0x9EA6, 0x7056, 0x9EA7,\t0x7057, 0x9EA8, 0x7058, 0x9EA9, 0x7059, 0x9EAA, 0x705A, 0x9EAB,\n\t0x705B, 0x9EAC, 0x705C, 0x9EAD, 0x705D, 0x9EAE, 0x705E, 0xE5B1,\t0x705F, 0x9EAF, 0x7060, 0x9EB0, 0x7061, 0x9EB1, 0x7062, 0x9EB2,\n\t0x7063, 0x9EB3, 0x7064, 0x9EB4, 0x7065, 0x9EB5, 0x7066, 0x9EB6,\t0x7067, 0x9EB7, 0x7068, 0x9EB8, 0x7069, 0x9EB9, 0x706A, 0x9EBA,\n\t0x706B, 0xBBF0, 0x706C, 0xECE1, 0x706D, 0xC3F0, 0x706E, 0x9EBB,\t0x706F, 0xB5C6, 0x7070, 0xBBD2, 0x7071, 0x9EBC, 0x7072, 0x9EBD,\n\t0x7073, 0x9EBE, 0x7074, 0x9EBF, 0x7075, 0xC1E9, 0x7076, 0xD4EE,\t0x7077, 0x9EC0, 0x7078, 0xBEC4, 0x7079, 0x9EC1, 0x707A, 0x9EC2,\n\t0x707B, 0x9EC3, 0x707C, 0xD7C6, 0x707D, 0x9EC4, 0x707E, 0xD4D6,\t0x707F, 0xB2D3, 0x7080, 0xECBE, 0x7081, 0x9EC5, 0x7082, 0x9EC6,\n\t0x7083, 0x9EC7, 0x7084, 0x9EC8, 0x7085, 0xEAC1, 0x7086, 0x9EC9,\t0x7087, 0x9ECA, 0x7088, 0x9ECB, 0x7089, 0xC2AF, 0x708A, 0xB4B6,\n\t0x708B, 0x9ECC, 0x708C, 0x9ECD, 0x708D, 0x9ECE, 0x708E, 0xD1D7,\t0x708F, 0x9ECF, 0x7090, 0x9ED0, 0x7091, 0x9ED1, 0x7092, 0xB3B4,\n\t0x7093, 0x9ED2, 0x7094, 0xC8B2, 0x7095, 0xBFBB, 0x7096, 0xECC0,\t0x7097, 0x9ED3, 0x7098, 0x9ED4, 0x7099, 0xD6CB, 0x709A, 0x9ED5,\n\t0x709B, 0x9ED6, 0x709C, 0xECBF, 0x709D, 0xECC1, 0x709E, 0x9ED7,\t0x709F, 0x9ED8, 0x70A0, 0x9ED9, 0x70A1, 0x9EDA, 0x70A2, 0x9EDB,\n\t0x70A3, 0x9EDC, 0x70A4, 0x9EDD, 0x70A5, 0x9EDE, 0x70A6, 0x9EDF,\t0x70A7, 0x9EE0, 0x70A8, 0x9EE1, 0x70A9, 0x9EE2, 0x70AA, 0x9EE3,\n\t0x70AB, 0xECC5, 0x70AC, 0xBEE6, 0x70AD, 0xCCBF, 0x70AE, 0xC5DA,\t0x70AF, 0xBEBC, 0x70B0, 0x9EE4, 0x70B1, 0xECC6, 0x70B2, 0x9EE5,\n\t0x70B3, 0xB1FE, 0x70B4, 0x9EE6, 0x70B5, 0x9EE7, 0x70B6, 0x9EE8,\t0x70B7, 0xECC4, 0x70B8, 0xD5A8, 0x70B9, 0xB5E3, 0x70BA, 0x9EE9,\n\t0x70BB, 0xECC2, 0x70BC, 0xC1B6, 0x70BD, 0xB3E3, 0x70BE, 0x9EEA,\t0x70BF, 0x9EEB, 0x70C0, 0xECC3, 0x70C1, 0xCBB8, 0x70C2, 0xC0C3,\n\t0x70C3, 0xCCFE, 0x70C4, 0x9EEC, 0x70C5, 0x9EED, 0x70C6, 0x9EEE,\t0x70C7, 0x9EEF, 0x70C8, 0xC1D2, 0x70C9, 0x9EF0, 0x70CA, 0xECC8,\n\t0x70CB, 0x9EF1, 0x70CC, 0x9EF2, 0x70CD, 0x9EF3, 0x70CE, 0x9EF4,\t0x70CF, 0x9EF5, 0x70D0, 0x9EF6, 0x70D1, 0x9EF7, 0x70D2, 0x9EF8,\n\t0x70D3, 0x9EF9, 0x70D4, 0x9EFA, 0x70D5, 0x9EFB, 0x70D6, 0x9EFC,\t0x70D7, 0x9EFD, 0x70D8, 0xBAE6, 0x70D9, 0xC0D3, 0x70DA, 0x9EFE,\n\t0x70DB, 0xD6F2, 0x70DC, 0x9F40, 0x70DD, 0x9F41, 0x70DE, 0x9F42,\t0x70DF, 0xD1CC, 0x70E0, 0x9F43, 0x70E1, 0x9F44, 0x70E2, 0x9F45,\n\t0x70E3, 0x9F46, 0x70E4, 0xBFBE, 0x70E5, 0x9F47, 0x70E6, 0xB7B3,\t0x70E7, 0xC9D5, 0x70E8, 0xECC7, 0x70E9, 0xBBE2, 0x70EA, 0x9F48,\n\t0x70EB, 0xCCCC, 0x70EC, 0xBDFD, 0x70ED, 0xC8C8, 0x70EE, 0x9F49,\t0x70EF, 0xCFA9, 0x70F0, 0x9F4A, 0x70F1, 0x9F4B, 0x70F2, 0x9F4C,\n\t0x70F3, 0x9F4D, 0x70F4, 0x9F4E, 0x70F5, 0x9F4F, 0x70F6, 0x9F50,\t0x70F7, 0xCDE9, 0x70F8, 0x9F51, 0x70F9, 0xC5EB, 0x70FA, 0x9F52,\n\t0x70FB, 0x9F53, 0x70FC, 0x9F54, 0x70FD, 0xB7E9, 0x70FE, 0x9F55,\t0x70FF, 0x9F56, 0x7100, 0x9F57, 0x7101, 0x9F58, 0x7102, 0x9F59,\n\t0x7103, 0x9F5A, 0x7104, 0x9F5B, 0x7105, 0x9F5C, 0x7106, 0x9F5D,\t0x7107, 0x9F5E, 0x7108, 0x9F5F, 0x7109, 0xD1C9, 0x710A, 0xBAB8,\n\t0x710B, 0x9F60, 0x710C, 0x9F61, 0x710D, 0x9F62, 0x710E, 0x9F63,\t0x710F, 0x9F64, 0x7110, 0xECC9, 0x7111, 0x9F65, 0x7112, 0x9F66,\n\t0x7113, 0xECCA, 0x7114, 0x9F67, 0x7115, 0xBBC0, 0x7116, 0xECCB,\t0x7117, 0x9F68, 0x7118, 0xECE2, 0x7119, 0xB1BA, 0x711A, 0xB7D9,\n\t0x711B, 0x9F69, 0x711C, 0x9F6A, 0x711D, 0x9F6B, 0x711E, 0x9F6C,\t0x711F, 0x9F6D, 0x7120, 0x9F6E, 0x7121, 0x9F6F, 0x7122, 0x9F70,\n\t0x7123, 0x9F71, 0x7124, 0x9F72, 0x7125, 0x9F73, 0x7126, 0xBDB9,\t0x7127, 0x9F74, 0x7128, 0x9F75, 0x7129, 0x9F76, 0x712A, 0x9F77,\n\t0x712B, 0x9F78, 0x712C, 0x9F79, 0x712D, 0x9F7A, 0x712E, 0x9F7B,\t0x712F, 0xECCC, 0x7130, 0xD1E6, 0x7131, 0xECCD, 0x7132, 0x9F7C,\n\t0x7133, 0x9F7D, 0x7134, 0x9F7E, 0x7135, 0x9F80, 0x7136, 0xC8BB,\t0x7137, 0x9F81, 0x7138, 0x9F82, 0x7139, 0x9F83, 0x713A, 0x9F84,\n\t0x713B, 0x9F85, 0x713C, 0x9F86, 0x713D, 0x9F87, 0x713E, 0x9F88,\t0x713F, 0x9F89, 0x7140, 0x9F8A, 0x7141, 0x9F8B, 0x7142, 0x9F8C,\n\t0x7143, 0x9F8D, 0x7144, 0x9F8E, 0x7145, 0xECD1, 0x7146, 0x9F8F,\t0x7147, 0x9F90, 0x7148, 0x9F91, 0x7149, 0x9F92, 0x714A, 0xECD3,\n\t0x714B, 0x9F93, 0x714C, 0xBBCD, 0x714D, 0x9F94, 0x714E, 0xBCE5,\t0x714F, 0x9F95, 0x7150, 0x9F96, 0x7151, 0x9F97, 0x7152, 0x9F98,\n\t0x7153, 0x9F99, 0x7154, 0x9F9A, 0x7155, 0x9F9B, 0x7156, 0x9F9C,\t0x7157, 0x9F9D, 0x7158, 0x9F9E, 0x7159, 0x9F9F, 0x715A, 0x9FA0,\n\t0x715B, 0x9FA1, 0x715C, 0xECCF, 0x715D, 0x9FA2, 0x715E, 0xC9B7,\t0x715F, 0x9FA3, 0x7160, 0x9FA4, 0x7161, 0x9FA5, 0x7162, 0x9FA6,\n\t0x7163, 0x9FA7, 0x7164, 0xC3BA, 0x7165, 0x9FA8, 0x7166, 0xECE3,\t0x7167, 0xD5D5, 0x7168, 0xECD0, 0x7169, 0x9FA9, 0x716A, 0x9FAA,\n\t0x716B, 0x9FAB, 0x716C, 0x9FAC, 0x716D, 0x9FAD, 0x716E, 0xD6F3,\t0x716F, 0x9FAE, 0x7170, 0x9FAF, 0x7171, 0x9FB0, 0x7172, 0xECD2,\n\t0x7173, 0xECCE, 0x7174, 0x9FB1, 0x7175, 0x9FB2, 0x7176, 0x9FB3,\t0x7177, 0x9FB4, 0x7178, 0xECD4, 0x7179, 0x9FB5, 0x717A, 0xECD5,\n\t0x717B, 0x9FB6, 0x717C, 0x9FB7, 0x717D, 0xC9BF, 0x717E, 0x9FB8,\t0x717F, 0x9FB9, 0x7180, 0x9FBA, 0x7181, 0x9FBB, 0x7182, 0x9FBC,\n\t0x7183, 0x9FBD, 0x7184, 0xCFA8, 0x7185, 0x9FBE, 0x7186, 0x9FBF,\t0x7187, 0x9FC0, 0x7188, 0x9FC1, 0x7189, 0x9FC2, 0x718A, 0xD0DC,\n\t0x718B, 0x9FC3, 0x718C, 0x9FC4, 0x718D, 0x9FC5, 0x718E, 0x9FC6,\t0x718F, 0xD1AC, 0x7190, 0x9FC7, 0x7191, 0x9FC8, 0x7192, 0x9FC9,\n\t0x7193, 0x9FCA, 0x7194, 0xC8DB, 0x7195, 0x9FCB, 0x7196, 0x9FCC,\t0x7197, 0x9FCD, 0x7198, 0xECD6, 0x7199, 0xCEF5, 0x719A, 0x9FCE,\n\t0x719B, 0x9FCF, 0x719C, 0x9FD0, 0x719D, 0x9FD1, 0x719E, 0x9FD2,\t0x719F, 0xCAEC, 0x71A0, 0xECDA, 0x71A1, 0x9FD3, 0x71A2, 0x9FD4,\n\t0x71A3, 0x9FD5, 0x71A4, 0x9FD6, 0x71A5, 0x9FD7, 0x71A6, 0x9FD8,\t0x71A7, 0x9FD9, 0x71A8, 0xECD9, 0x71A9, 0x9FDA, 0x71AA, 0x9FDB,\n\t0x71AB, 0x9FDC, 0x71AC, 0xB0BE, 0x71AD, 0x9FDD, 0x71AE, 0x9FDE,\t0x71AF, 0x9FDF, 0x71B0, 0x9FE0, 0x71B1, 0x9FE1, 0x71B2, 0x9FE2,\n\t0x71B3, 0xECD7, 0x71B4, 0x9FE3, 0x71B5, 0xECD8, 0x71B6, 0x9FE4,\t0x71B7, 0x9FE5, 0x71B8, 0x9FE6, 0x71B9, 0xECE4, 0x71BA, 0x9FE7,\n\t0x71BB, 0x9FE8, 0x71BC, 0x9FE9, 0x71BD, 0x9FEA, 0x71BE, 0x9FEB,\t0x71BF, 0x9FEC, 0x71C0, 0x9FED, 0x71C1, 0x9FEE, 0x71C2, 0x9FEF,\n\t0x71C3, 0xC8BC, 0x71C4, 0x9FF0, 0x71C5, 0x9FF1, 0x71C6, 0x9FF2,\t0x71C7, 0x9FF3, 0x71C8, 0x9FF4, 0x71C9, 0x9FF5, 0x71CA, 0x9FF6,\n\t0x71CB, 0x9FF7, 0x71CC, 0x9FF8, 0x71CD, 0x9FF9, 0x71CE, 0xC1C7,\t0x71CF, 0x9FFA, 0x71D0, 0x9FFB, 0x71D1, 0x9FFC, 0x71D2, 0x9FFD,\n\t0x71D3, 0x9FFE, 0x71D4, 0xECDC, 0x71D5, 0xD1E0, 0x71D6, 0xA040,\t0x71D7, 0xA041, 0x71D8, 0xA042, 0x71D9, 0xA043, 0x71DA, 0xA044,\n\t0x71DB, 0xA045, 0x71DC, 0xA046, 0x71DD, 0xA047, 0x71DE, 0xA048,\t0x71DF, 0xA049, 0x71E0, 0xECDB, 0x71E1, 0xA04A, 0x71E2, 0xA04B,\n\t0x71E3, 0xA04C, 0x71E4, 0xA04D, 0x71E5, 0xD4EF, 0x71E6, 0xA04E,\t0x71E7, 0xECDD, 0x71E8, 0xA04F, 0x71E9, 0xA050, 0x71EA, 0xA051,\n\t0x71EB, 0xA052, 0x71EC, 0xA053, 0x71ED, 0xA054, 0x71EE, 0xDBC6,\t0x71EF, 0xA055, 0x71F0, 0xA056, 0x71F1, 0xA057, 0x71F2, 0xA058,\n\t0x71F3, 0xA059, 0x71F4, 0xA05A, 0x71F5, 0xA05B, 0x71F6, 0xA05C,\t0x71F7, 0xA05D, 0x71F8, 0xA05E, 0x71F9, 0xECDE, 0x71FA, 0xA05F,\n\t0x71FB, 0xA060, 0x71FC, 0xA061, 0x71FD, 0xA062, 0x71FE, 0xA063,\t0x71FF, 0xA064, 0x7200, 0xA065, 0x7201, 0xA066, 0x7202, 0xA067,\n\t0x7203, 0xA068, 0x7204, 0xA069, 0x7205, 0xA06A, 0x7206, 0xB1AC,\t0x7207, 0xA06B, 0x7208, 0xA06C, 0x7209, 0xA06D, 0x720A, 0xA06E,\n\t0x720B, 0xA06F, 0x720C, 0xA070, 0x720D, 0xA071, 0x720E, 0xA072,\t0x720F, 0xA073, 0x7210, 0xA074, 0x7211, 0xA075, 0x7212, 0xA076,\n\t0x7213, 0xA077, 0x7214, 0xA078, 0x7215, 0xA079, 0x7216, 0xA07A,\t0x7217, 0xA07B, 0x7218, 0xA07C, 0x7219, 0xA07D, 0x721A, 0xA07E,\n\t0x721B, 0xA080, 0x721C, 0xA081, 0x721D, 0xECDF, 0x721E, 0xA082,\t0x721F, 0xA083, 0x7220, 0xA084, 0x7221, 0xA085, 0x7222, 0xA086,\n\t0x7223, 0xA087, 0x7224, 0xA088, 0x7225, 0xA089, 0x7226, 0xA08A,\t0x7227, 0xA08B, 0x7228, 0xECE0, 0x7229, 0xA08C, 0x722A, 0xD7A6,\n\t0x722B, 0xA08D, 0x722C, 0xC5C0, 0x722D, 0xA08E, 0x722E, 0xA08F,\t0x722F, 0xA090, 0x7230, 0xEBBC, 0x7231, 0xB0AE, 0x7232, 0xA091,\n\t0x7233, 0xA092, 0x7234, 0xA093, 0x7235, 0xBEF4, 0x7236, 0xB8B8,\t0x7237, 0xD2AF, 0x7238, 0xB0D6, 0x7239, 0xB5F9, 0x723A, 0xA094,\n\t0x723B, 0xD8B3, 0x723C, 0xA095, 0x723D, 0xCBAC, 0x723E, 0xA096,\t0x723F, 0xE3DD, 0x7240, 0xA097, 0x7241, 0xA098, 0x7242, 0xA099,\n\t0x7243, 0xA09A, 0x7244, 0xA09B, 0x7245, 0xA09C, 0x7246, 0xA09D,\t0x7247, 0xC6AC, 0x7248, 0xB0E6, 0x7249, 0xA09E, 0x724A, 0xA09F,\n\t0x724B, 0xA0A0, 0x724C, 0xC5C6, 0x724D, 0xEBB9, 0x724E, 0xA0A1,\t0x724F, 0xA0A2, 0x7250, 0xA0A3, 0x7251, 0xA0A4, 0x7252, 0xEBBA,\n\t0x7253, 0xA0A5, 0x7254, 0xA0A6, 0x7255, 0xA0A7, 0x7256, 0xEBBB,\t0x7257, 0xA0A8, 0x7258, 0xA0A9, 0x7259, 0xD1C0, 0x725A, 0xA0AA,\n\t0x725B, 0xC5A3, 0x725C, 0xA0AB, 0x725D, 0xEAF2, 0x725E, 0xA0AC,\t0x725F, 0xC4B2, 0x7260, 0xA0AD, 0x7261, 0xC4B5, 0x7262, 0xC0CE,\n\t0x7263, 0xA0AE, 0x7264, 0xA0AF, 0x7265, 0xA0B0, 0x7266, 0xEAF3,\t0x7267, 0xC4C1, 0x7268, 0xA0B1, 0x7269, 0xCEEF, 0x726A, 0xA0B2,\n\t0x726B, 0xA0B3, 0x726C, 0xA0B4, 0x726D, 0xA0B5, 0x726E, 0xEAF0,\t0x726F, 0xEAF4, 0x7270, 0xA0B6, 0x7271, 0xA0B7, 0x7272, 0xC9FC,\n\t0x7273, 0xA0B8, 0x7274, 0xA0B9, 0x7275, 0xC7A3, 0x7276, 0xA0BA,\t0x7277, 0xA0BB, 0x7278, 0xA0BC, 0x7279, 0xCCD8, 0x727A, 0xCEFE,\n\t0x727B, 0xA0BD, 0x727C, 0xA0BE, 0x727D, 0xA0BF, 0x727E, 0xEAF5,\t0x727F, 0xEAF6, 0x7280, 0xCFAC, 0x7281, 0xC0E7, 0x7282, 0xA0C0,\n\t0x7283, 0xA0C1, 0x7284, 0xEAF7, 0x7285, 0xA0C2, 0x7286, 0xA0C3,\t0x7287, 0xA0C4, 0x7288, 0xA0C5, 0x7289, 0xA0C6, 0x728A, 0xB6BF,\n\t0x728B, 0xEAF8, 0x728C, 0xA0C7, 0x728D, 0xEAF9, 0x728E, 0xA0C8,\t0x728F, 0xEAFA, 0x7290, 0xA0C9, 0x7291, 0xA0CA, 0x7292, 0xEAFB,\n\t0x7293, 0xA0CB, 0x7294, 0xA0CC, 0x7295, 0xA0CD, 0x7296, 0xA0CE,\t0x7297, 0xA0CF, 0x7298, 0xA0D0, 0x7299, 0xA0D1, 0x729A, 0xA0D2,\n\t0x729B, 0xA0D3, 0x729C, 0xA0D4, 0x729D, 0xA0D5, 0x729E, 0xA0D6,\t0x729F, 0xEAF1, 0x72A0, 0xA0D7, 0x72A1, 0xA0D8, 0x72A2, 0xA0D9,\n\t0x72A3, 0xA0DA, 0x72A4, 0xA0DB, 0x72A5, 0xA0DC, 0x72A6, 0xA0DD,\t0x72A7, 0xA0DE, 0x72A8, 0xA0DF, 0x72A9, 0xA0E0, 0x72AA, 0xA0E1,\n\t0x72AB, 0xA0E2, 0x72AC, 0xC8AE, 0x72AD, 0xE1EB, 0x72AE, 0xA0E3,\t0x72AF, 0xB7B8, 0x72B0, 0xE1EC, 0x72B1, 0xA0E4, 0x72B2, 0xA0E5,\n\t0x72B3, 0xA0E6, 0x72B4, 0xE1ED, 0x72B5, 0xA0E7, 0x72B6, 0xD7B4,\t0x72B7, 0xE1EE, 0x72B8, 0xE1EF, 0x72B9, 0xD3CC, 0x72BA, 0xA0E8,\n\t0x72BB, 0xA0E9, 0x72BC, 0xA0EA, 0x72BD, 0xA0EB, 0x72BE, 0xA0EC,\t0x72BF, 0xA0ED, 0x72C0, 0xA0EE, 0x72C1, 0xE1F1, 0x72C2, 0xBFF1,\n\t0x72C3, 0xE1F0, 0x72C4, 0xB5D2, 0x72C5, 0xA0EF, 0x72C6, 0xA0F0,\t0x72C7, 0xA0F1, 0x72C8, 0xB1B7, 0x72C9, 0xA0F2, 0x72CA, 0xA0F3,\n\t0x72CB, 0xA0F4, 0x72CC, 0xA0F5, 0x72CD, 0xE1F3, 0x72CE, 0xE1F2,\t0x72CF, 0xA0F6, 0x72D0, 0xBAFC, 0x72D1, 0xA0F7, 0x72D2, 0xE1F4,\n\t0x72D3, 0xA0F8, 0x72D4, 0xA0F9, 0x72D5, 0xA0FA, 0x72D6, 0xA0FB,\t0x72D7, 0xB9B7, 0x72D8, 0xA0FC, 0x72D9, 0xBED1, 0x72DA, 0xA0FD,\n\t0x72DB, 0xA0FE, 0x72DC, 0xAA40, 0x72DD, 0xAA41, 0x72DE, 0xC4FC,\t0x72DF, 0xAA42, 0x72E0, 0xBADD, 0x72E1, 0xBDC6, 0x72E2, 0xAA43,\n\t0x72E3, 0xAA44, 0x72E4, 0xAA45, 0x72E5, 0xAA46, 0x72E6, 0xAA47,\t0x72E7, 0xAA48, 0x72E8, 0xE1F5, 0x72E9, 0xE1F7, 0x72EA, 0xAA49,\n\t0x72EB, 0xAA4A, 0x72EC, 0xB6C0, 0x72ED, 0xCFC1, 0x72EE, 0xCAA8,\t0x72EF, 0xE1F6, 0x72F0, 0xD5F8, 0x72F1, 0xD3FC, 0x72F2, 0xE1F8,\n\t0x72F3, 0xE1FC, 0x72F4, 0xE1F9, 0x72F5, 0xAA4B, 0x72F6, 0xAA4C,\t0x72F7, 0xE1FA, 0x72F8, 0xC0EA, 0x72F9, 0xAA4D, 0x72FA, 0xE1FE,\n\t0x72FB, 0xE2A1, 0x72FC, 0xC0C7, 0x72FD, 0xAA4E, 0x72FE, 0xAA4F,\t0x72FF, 0xAA50, 0x7300, 0xAA51, 0x7301, 0xE1FB, 0x7302, 0xAA52,\n\t0x7303, 0xE1FD, 0x7304, 0xAA53, 0x7305, 0xAA54, 0x7306, 0xAA55,\t0x7307, 0xAA56, 0x7308, 0xAA57, 0x7309, 0xAA58, 0x730A, 0xE2A5,\n\t0x730B, 0xAA59, 0x730C, 0xAA5A, 0x730D, 0xAA5B, 0x730E, 0xC1D4,\t0x730F, 0xAA5C, 0x7310, 0xAA5D, 0x7311, 0xAA5E, 0x7312, 0xAA5F,\n\t0x7313, 0xE2A3, 0x7314, 0xAA60, 0x7315, 0xE2A8, 0x7316, 0xB2FE,\t0x7317, 0xE2A2, 0x7318, 0xAA61, 0x7319, 0xAA62, 0x731A, 0xAA63,\n\t0x731B, 0xC3CD, 0x731C, 0xB2C2, 0x731D, 0xE2A7, 0x731E, 0xE2A6,\t0x731F, 0xAA64, 0x7320, 0xAA65, 0x7321, 0xE2A4, 0x7322, 0xE2A9,\n\t0x7323, 0xAA66, 0x7324, 0xAA67, 0x7325, 0xE2AB, 0x7326, 0xAA68,\t0x7327, 0xAA69, 0x7328, 0xAA6A, 0x7329, 0xD0C9, 0x732A, 0xD6ED,\n\t0x732B, 0xC3A8, 0x732C, 0xE2AC, 0x732D, 0xAA6B, 0x732E, 0xCFD7,\t0x732F, 0xAA6C, 0x7330, 0xAA6D, 0x7331, 0xE2AE, 0x7332, 0xAA6E,\n\t0x7333, 0xAA6F, 0x7334, 0xBAEF, 0x7335, 0xAA70, 0x7336, 0xAA71,\t0x7337, 0xE9E0, 0x7338, 0xE2AD, 0x7339, 0xE2AA, 0x733A, 0xAA72,\n\t0x733B, 0xAA73, 0x733C, 0xAA74, 0x733D, 0xAA75, 0x733E, 0xBBAB,\t0x733F, 0xD4B3, 0x7340, 0xAA76, 0x7341, 0xAA77, 0x7342, 0xAA78,\n\t0x7343, 0xAA79, 0x7344, 0xAA7A, 0x7345, 0xAA7B, 0x7346, 0xAA7C,\t0x7347, 0xAA7D, 0x7348, 0xAA7E, 0x7349, 0xAA80, 0x734A, 0xAA81,\n\t0x734B, 0xAA82, 0x734C, 0xAA83, 0x734D, 0xE2B0, 0x734E, 0xAA84,\t0x734F, 0xAA85, 0x7350, 0xE2AF, 0x7351, 0xAA86, 0x7352, 0xE9E1,\n\t0x7353, 0xAA87, 0x7354, 0xAA88, 0x7355, 0xAA89, 0x7356, 0xAA8A,\t0x7357, 0xE2B1, 0x7358, 0xAA8B, 0x7359, 0xAA8C, 0x735A, 0xAA8D,\n\t0x735B, 0xAA8E, 0x735C, 0xAA8F, 0x735D, 0xAA90, 0x735E, 0xAA91,\t0x735F, 0xAA92, 0x7360, 0xE2B2, 0x7361, 0xAA93, 0x7362, 0xAA94,\n\t0x7363, 0xAA95, 0x7364, 0xAA96, 0x7365, 0xAA97, 0x7366, 0xAA98,\t0x7367, 0xAA99, 0x7368, 0xAA9A, 0x7369, 0xAA9B, 0x736A, 0xAA9C,\n\t0x736B, 0xAA9D, 0x736C, 0xE2B3, 0x736D, 0xCCA1, 0x736E, 0xAA9E,\t0x736F, 0xE2B4, 0x7370, 0xAA9F, 0x7371, 0xAAA0, 0x7372, 0xAB40,\n\t0x7373, 0xAB41, 0x7374, 0xAB42, 0x7375, 0xAB43, 0x7376, 0xAB44,\t0x7377, 0xAB45, 0x7378, 0xAB46, 0x7379, 0xAB47, 0x737A, 0xAB48,\n\t0x737B, 0xAB49, 0x737C, 0xAB4A, 0x737D, 0xAB4B, 0x737E, 0xE2B5,\t0x737F, 0xAB4C, 0x7380, 0xAB4D, 0x7381, 0xAB4E, 0x7382, 0xAB4F,\n\t0x7383, 0xAB50, 0x7384, 0xD0FE, 0x7385, 0xAB51, 0x7386, 0xAB52,\t0x7387, 0xC2CA, 0x7388, 0xAB53, 0x7389, 0xD3F1, 0x738A, 0xAB54,\n\t0x738B, 0xCDF5, 0x738C, 0xAB55, 0x738D, 0xAB56, 0x738E, 0xE7E0,\t0x738F, 0xAB57, 0x7390, 0xAB58, 0x7391, 0xE7E1, 0x7392, 0xAB59,\n\t0x7393, 0xAB5A, 0x7394, 0xAB5B, 0x7395, 0xAB5C, 0x7396, 0xBEC1,\t0x7397, 0xAB5D, 0x7398, 0xAB5E, 0x7399, 0xAB5F, 0x739A, 0xAB60,\n\t0x739B, 0xC2EA, 0x739C, 0xAB61, 0x739D, 0xAB62, 0x739E, 0xAB63,\t0x739F, 0xE7E4, 0x73A0, 0xAB64, 0x73A1, 0xAB65, 0x73A2, 0xE7E3,\n\t0x73A3, 0xAB66, 0x73A4, 0xAB67, 0x73A5, 0xAB68, 0x73A6, 0xAB69,\t0x73A7, 0xAB6A, 0x73A8, 0xAB6B, 0x73A9, 0xCDE6, 0x73AA, 0xAB6C,\n\t0x73AB, 0xC3B5, 0x73AC, 0xAB6D, 0x73AD, 0xAB6E, 0x73AE, 0xE7E2,\t0x73AF, 0xBBB7, 0x73B0, 0xCFD6, 0x73B1, 0xAB6F, 0x73B2, 0xC1E1,\n\t0x73B3, 0xE7E9, 0x73B4, 0xAB70, 0x73B5, 0xAB71, 0x73B6, 0xAB72,\t0x73B7, 0xE7E8, 0x73B8, 0xAB73, 0x73B9, 0xAB74, 0x73BA, 0xE7F4,\n\t0x73BB, 0xB2A3, 0x73BC, 0xAB75, 0x73BD, 0xAB76, 0x73BE, 0xAB77,\t0x73BF, 0xAB78, 0x73C0, 0xE7EA, 0x73C1, 0xAB79, 0x73C2, 0xE7E6,\n\t0x73C3, 0xAB7A, 0x73C4, 0xAB7B, 0x73C5, 0xAB7C, 0x73C6, 0xAB7D,\t0x73C7, 0xAB7E, 0x73C8, 0xE7EC, 0x73C9, 0xE7EB, 0x73CA, 0xC9BA,\n\t0x73CB, 0xAB80, 0x73CC, 0xAB81, 0x73CD, 0xD5E4, 0x73CE, 0xAB82,\t0x73CF, 0xE7E5, 0x73D0, 0xB7A9, 0x73D1, 0xE7E7, 0x73D2, 0xAB83,\n\t0x73D3, 0xAB84, 0x73D4, 0xAB85, 0x73D5, 0xAB86, 0x73D6, 0xAB87,\t0x73D7, 0xAB88, 0x73D8, 0xAB89, 0x73D9, 0xE7EE, 0x73DA, 0xAB8A,\n\t0x73DB, 0xAB8B, 0x73DC, 0xAB8C, 0x73DD, 0xAB8D, 0x73DE, 0xE7F3,\t0x73DF, 0xAB8E, 0x73E0, 0xD6E9, 0x73E1, 0xAB8F, 0x73E2, 0xAB90,\n\t0x73E3, 0xAB91, 0x73E4, 0xAB92, 0x73E5, 0xE7ED, 0x73E6, 0xAB93,\t0x73E7, 0xE7F2, 0x73E8, 0xAB94, 0x73E9, 0xE7F1, 0x73EA, 0xAB95,\n\t0x73EB, 0xAB96, 0x73EC, 0xAB97, 0x73ED, 0xB0E0, 0x73EE, 0xAB98,\t0x73EF, 0xAB99, 0x73F0, 0xAB9A, 0x73F1, 0xAB9B, 0x73F2, 0xE7F5,\n\t0x73F3, 0xAB9C, 0x73F4, 0xAB9D, 0x73F5, 0xAB9E, 0x73F6, 0xAB9F,\t0x73F7, 0xABA0, 0x73F8, 0xAC40, 0x73F9, 0xAC41, 0x73FA, 0xAC42,\n\t0x73FB, 0xAC43, 0x73FC, 0xAC44, 0x73FD, 0xAC45, 0x73FE, 0xAC46,\t0x73FF, 0xAC47, 0x7400, 0xAC48, 0x7401, 0xAC49, 0x7402, 0xAC4A,\n\t0x7403, 0xC7F2, 0x7404, 0xAC4B, 0x7405, 0xC0C5, 0x7406, 0xC0ED,\t0x7407, 0xAC4C, 0x7408, 0xAC4D, 0x7409, 0xC1F0, 0x740A, 0xE7F0,\n\t0x740B, 0xAC4E, 0x740C, 0xAC4F, 0x740D, 0xAC50, 0x740E, 0xAC51,\t0x740F, 0xE7F6, 0x7410, 0xCBF6, 0x7411, 0xAC52, 0x7412, 0xAC53,\n\t0x7413, 0xAC54, 0x7414, 0xAC55, 0x7415, 0xAC56, 0x7416, 0xAC57,\t0x7417, 0xAC58, 0x7418, 0xAC59, 0x7419, 0xAC5A, 0x741A, 0xE8A2,\n\t0x741B, 0xE8A1, 0x741C, 0xAC5B, 0x741D, 0xAC5C, 0x741E, 0xAC5D,\t0x741F, 0xAC5E, 0x7420, 0xAC5F, 0x7421, 0xAC60, 0x7422, 0xD7C1,\n\t0x7423, 0xAC61, 0x7424, 0xAC62, 0x7425, 0xE7FA, 0x7426, 0xE7F9,\t0x7427, 0xAC63, 0x7428, 0xE7FB, 0x7429, 0xAC64, 0x742A, 0xE7F7,\n\t0x742B, 0xAC65, 0x742C, 0xE7FE, 0x742D, 0xAC66, 0x742E, 0xE7FD,\t0x742F, 0xAC67, 0x7430, 0xE7FC, 0x7431, 0xAC68, 0x7432, 0xAC69,\n\t0x7433, 0xC1D5, 0x7434, 0xC7D9, 0x7435, 0xC5FD, 0x7436, 0xC5C3,\t0x7437, 0xAC6A, 0x7438, 0xAC6B, 0x7439, 0xAC6C, 0x743A, 0xAC6D,\n\t0x743B, 0xAC6E, 0x743C, 0xC7ED, 0x743D, 0xAC6F, 0x743E, 0xAC70,\t0x743F, 0xAC71, 0x7440, 0xAC72, 0x7441, 0xE8A3, 0x7442, 0xAC73,\n\t0x7443, 0xAC74, 0x7444, 0xAC75, 0x7445, 0xAC76, 0x7446, 0xAC77,\t0x7447, 0xAC78, 0x7448, 0xAC79, 0x7449, 0xAC7A, 0x744A, 0xAC7B,\n\t0x744B, 0xAC7C, 0x744C, 0xAC7D, 0x744D, 0xAC7E, 0x744E, 0xAC80,\t0x744F, 0xAC81, 0x7450, 0xAC82, 0x7451, 0xAC83, 0x7452, 0xAC84,\n\t0x7453, 0xAC85, 0x7454, 0xAC86, 0x7455, 0xE8A6, 0x7456, 0xAC87,\t0x7457, 0xE8A5, 0x7458, 0xAC88, 0x7459, 0xE8A7, 0x745A, 0xBAF7,\n\t0x745B, 0xE7F8, 0x745C, 0xE8A4, 0x745D, 0xAC89, 0x745E, 0xC8F0,\t0x745F, 0xC9AA, 0x7460, 0xAC8A, 0x7461, 0xAC8B, 0x7462, 0xAC8C,\n\t0x7463, 0xAC8D, 0x7464, 0xAC8E, 0x7465, 0xAC8F, 0x7466, 0xAC90,\t0x7467, 0xAC91, 0x7468, 0xAC92, 0x7469, 0xAC93, 0x746A, 0xAC94,\n\t0x746B, 0xAC95, 0x746C, 0xAC96, 0x746D, 0xE8A9, 0x746E, 0xAC97,\t0x746F, 0xAC98, 0x7470, 0xB9E5, 0x7471, 0xAC99, 0x7472, 0xAC9A,\n\t0x7473, 0xAC9B, 0x7474, 0xAC9C, 0x7475, 0xAC9D, 0x7476, 0xD1FE,\t0x7477, 0xE8A8, 0x7478, 0xAC9E, 0x7479, 0xAC9F, 0x747A, 0xACA0,\n\t0x747B, 0xAD40, 0x747C, 0xAD41, 0x747D, 0xAD42, 0x747E, 0xE8AA,\t0x747F, 0xAD43, 0x7480, 0xE8AD, 0x7481, 0xE8AE, 0x7482, 0xAD44,\n\t0x7483, 0xC1A7, 0x7484, 0xAD45, 0x7485, 0xAD46, 0x7486, 0xAD47,\t0x7487, 0xE8AF, 0x7488, 0xAD48, 0x7489, 0xAD49, 0x748A, 0xAD4A,\n\t0x748B, 0xE8B0, 0x748C, 0xAD4B, 0x748D, 0xAD4C, 0x748E, 0xE8AC,\t0x748F, 0xAD4D, 0x7490, 0xE8B4, 0x7491, 0xAD4E, 0x7492, 0xAD4F,\n\t0x7493, 0xAD50, 0x7494, 0xAD51, 0x7495, 0xAD52, 0x7496, 0xAD53,\t0x7497, 0xAD54, 0x7498, 0xAD55, 0x7499, 0xAD56, 0x749A, 0xAD57,\n\t0x749B, 0xAD58, 0x749C, 0xE8AB, 0x749D, 0xAD59, 0x749E, 0xE8B1,\t0x749F, 0xAD5A, 0x74A0, 0xAD5B, 0x74A1, 0xAD5C, 0x74A2, 0xAD5D,\n\t0x74A3, 0xAD5E, 0x74A4, 0xAD5F, 0x74A5, 0xAD60, 0x74A6, 0xAD61,\t0x74A7, 0xE8B5, 0x74A8, 0xE8B2, 0x74A9, 0xE8B3, 0x74AA, 0xAD62,\n\t0x74AB, 0xAD63, 0x74AC, 0xAD64, 0x74AD, 0xAD65, 0x74AE, 0xAD66,\t0x74AF, 0xAD67, 0x74B0, 0xAD68, 0x74B1, 0xAD69, 0x74B2, 0xAD6A,\n\t0x74B3, 0xAD6B, 0x74B4, 0xAD6C, 0x74B5, 0xAD6D, 0x74B6, 0xAD6E,\t0x74B7, 0xAD6F, 0x74B8, 0xAD70, 0x74B9, 0xAD71, 0x74BA, 0xE8B7,\n\t0x74BB, 0xAD72, 0x74BC, 0xAD73, 0x74BD, 0xAD74, 0x74BE, 0xAD75,\t0x74BF, 0xAD76, 0x74C0, 0xAD77, 0x74C1, 0xAD78, 0x74C2, 0xAD79,\n\t0x74C3, 0xAD7A, 0x74C4, 0xAD7B, 0x74C5, 0xAD7C, 0x74C6, 0xAD7D,\t0x74C7, 0xAD7E, 0x74C8, 0xAD80, 0x74C9, 0xAD81, 0x74CA, 0xAD82,\n\t0x74CB, 0xAD83, 0x74CC, 0xAD84, 0x74CD, 0xAD85, 0x74CE, 0xAD86,\t0x74CF, 0xAD87, 0x74D0, 0xAD88, 0x74D1, 0xAD89, 0x74D2, 0xE8B6,\n\t0x74D3, 0xAD8A, 0x74D4, 0xAD8B, 0x74D5, 0xAD8C, 0x74D6, 0xAD8D,\t0x74D7, 0xAD8E, 0x74D8, 0xAD8F, 0x74D9, 0xAD90, 0x74DA, 0xAD91,\n\t0x74DB, 0xAD92, 0x74DC, 0xB9CF, 0x74DD, 0xAD93, 0x74DE, 0xF0AC,\t0x74DF, 0xAD94, 0x74E0, 0xF0AD, 0x74E1, 0xAD95, 0x74E2, 0xC6B0,\n\t0x74E3, 0xB0EA, 0x74E4, 0xC8BF, 0x74E5, 0xAD96, 0x74E6, 0xCDDF,\t0x74E7, 0xAD97, 0x74E8, 0xAD98, 0x74E9, 0xAD99, 0x74EA, 0xAD9A,\n\t0x74EB, 0xAD9B, 0x74EC, 0xAD9C, 0x74ED, 0xAD9D, 0x74EE, 0xCECD,\t0x74EF, 0xEAB1, 0x74F0, 0xAD9E, 0x74F1, 0xAD9F, 0x74F2, 0xADA0,\n\t0x74F3, 0xAE40, 0x74F4, 0xEAB2, 0x74F5, 0xAE41, 0x74F6, 0xC6BF,\t0x74F7, 0xB4C9, 0x74F8, 0xAE42, 0x74F9, 0xAE43, 0x74FA, 0xAE44,\n\t0x74FB, 0xAE45, 0x74FC, 0xAE46, 0x74FD, 0xAE47, 0x74FE, 0xAE48,\t0x74FF, 0xEAB3, 0x7500, 0xAE49, 0x7501, 0xAE4A, 0x7502, 0xAE4B,\n\t0x7503, 0xAE4C, 0x7504, 0xD5E7, 0x7505, 0xAE4D, 0x7506, 0xAE4E,\t0x7507, 0xAE4F, 0x7508, 0xAE50, 0x7509, 0xAE51, 0x750A, 0xAE52,\n\t0x750B, 0xAE53, 0x750C, 0xAE54, 0x750D, 0xDDF9, 0x750E, 0xAE55,\t0x750F, 0xEAB4, 0x7510, 0xAE56, 0x7511, 0xEAB5, 0x7512, 0xAE57,\n\t0x7513, 0xEAB6, 0x7514, 0xAE58, 0x7515, 0xAE59, 0x7516, 0xAE5A,\t0x7517, 0xAE5B, 0x7518, 0xB8CA, 0x7519, 0xDFB0, 0x751A, 0xC9F5,\n\t0x751B, 0xAE5C, 0x751C, 0xCCF0, 0x751D, 0xAE5D, 0x751E, 0xAE5E,\t0x751F, 0xC9FA, 0x7520, 0xAE5F, 0x7521, 0xAE60, 0x7522, 0xAE61,\n\t0x7523, 0xAE62, 0x7524, 0xAE63, 0x7525, 0xC9FB, 0x7526, 0xAE64,\t0x7527, 0xAE65, 0x7528, 0xD3C3, 0x7529, 0xCBA6, 0x752A, 0xAE66,\n\t0x752B, 0xB8A6, 0x752C, 0xF0AE, 0x752D, 0xB1C2, 0x752E, 0xAE67,\t0x752F, 0xE5B8, 0x7530, 0xCCEF, 0x7531, 0xD3C9, 0x7532, 0xBCD7,\n\t0x7533, 0xC9EA, 0x7534, 0xAE68, 0x7535, 0xB5E7, 0x7536, 0xAE69,\t0x7537, 0xC4D0, 0x7538, 0xB5E9, 0x7539, 0xAE6A, 0x753A, 0xEEAE,\n\t0x753B, 0xBBAD, 0x753C, 0xAE6B, 0x753D, 0xAE6C, 0x753E, 0xE7DE,\t0x753F, 0xAE6D, 0x7540, 0xEEAF, 0x7541, 0xAE6E, 0x7542, 0xAE6F,\n\t0x7543, 0xAE70, 0x7544, 0xAE71, 0x7545, 0xB3A9, 0x7546, 0xAE72,\t0x7547, 0xAE73, 0x7548, 0xEEB2, 0x7549, 0xAE74, 0x754A, 0xAE75,\n\t0x754B, 0xEEB1, 0x754C, 0xBDE7, 0x754D, 0xAE76, 0x754E, 0xEEB0,\t0x754F, 0xCEB7, 0x7550, 0xAE77, 0x7551, 0xAE78, 0x7552, 0xAE79,\n\t0x7553, 0xAE7A, 0x7554, 0xC5CF, 0x7555, 0xAE7B, 0x7556, 0xAE7C,\t0x7557, 0xAE7D, 0x7558, 0xAE7E, 0x7559, 0xC1F4, 0x755A, 0xDBCE,\n\t0x755B, 0xEEB3, 0x755C, 0xD0F3, 0x755D, 0xAE80, 0x755E, 0xAE81,\t0x755F, 0xAE82, 0x7560, 0xAE83, 0x7561, 0xAE84, 0x7562, 0xAE85,\n\t0x7563, 0xAE86, 0x7564, 0xAE87, 0x7565, 0xC2D4, 0x7566, 0xC6E8,\t0x7567, 0xAE88, 0x7568, 0xAE89, 0x7569, 0xAE8A, 0x756A, 0xB7AC,\n\t0x756B, 0xAE8B, 0x756C, 0xAE8C, 0x756D, 0xAE8D, 0x756E, 0xAE8E,\t0x756F, 0xAE8F, 0x7570, 0xAE90, 0x7571, 0xAE91, 0x7572, 0xEEB4,\n\t0x7573, 0xAE92, 0x7574, 0xB3EB, 0x7575, 0xAE93, 0x7576, 0xAE94,\t0x7577, 0xAE95, 0x7578, 0xBBFB, 0x7579, 0xEEB5, 0x757A, 0xAE96,\n\t0x757B, 0xAE97, 0x757C, 0xAE98, 0x757D, 0xAE99, 0x757E, 0xAE9A,\t0x757F, 0xE7DC, 0x7580, 0xAE9B, 0x7581, 0xAE9C, 0x7582, 0xAE9D,\n\t0x7583, 0xEEB6, 0x7584, 0xAE9E, 0x7585, 0xAE9F, 0x7586, 0xBDAE,\t0x7587, 0xAEA0, 0x7588, 0xAF40, 0x7589, 0xAF41, 0x758A, 0xAF42,\n\t0x758B, 0xF1E2, 0x758C, 0xAF43, 0x758D, 0xAF44, 0x758E, 0xAF45,\t0x758F, 0xCAE8, 0x7590, 0xAF46, 0x7591, 0xD2C9, 0x7592, 0xF0DA,\n\t0x7593, 0xAF47, 0x7594, 0xF0DB, 0x7595, 0xAF48, 0x7596, 0xF0DC,\t0x7597, 0xC1C6, 0x7598, 0xAF49, 0x7599, 0xB8ED, 0x759A, 0xBECE,\n\t0x759B, 0xAF4A, 0x759C, 0xAF4B, 0x759D, 0xF0DE, 0x759E, 0xAF4C,\t0x759F, 0xC5B1, 0x75A0, 0xF0DD, 0x75A1, 0xD1F1, 0x75A2, 0xAF4D,\n\t0x75A3, 0xF0E0, 0x75A4, 0xB0CC, 0x75A5, 0xBDEA, 0x75A6, 0xAF4E,\t0x75A7, 0xAF4F, 0x75A8, 0xAF50, 0x75A9, 0xAF51, 0x75AA, 0xAF52,\n\t0x75AB, 0xD2DF, 0x75AC, 0xF0DF, 0x75AD, 0xAF53, 0x75AE, 0xB4AF,\t0x75AF, 0xB7E8, 0x75B0, 0xF0E6, 0x75B1, 0xF0E5, 0x75B2, 0xC6A3,\n\t0x75B3, 0xF0E1, 0x75B4, 0xF0E2, 0x75B5, 0xB4C3, 0x75B6, 0xAF54,\t0x75B7, 0xAF55, 0x75B8, 0xF0E3, 0x75B9, 0xD5EE, 0x75BA, 0xAF56,\n\t0x75BB, 0xAF57, 0x75BC, 0xCCDB, 0x75BD, 0xBED2, 0x75BE, 0xBCB2,\t0x75BF, 0xAF58, 0x75C0, 0xAF59, 0x75C1, 0xAF5A, 0x75C2, 0xF0E8,\n\t0x75C3, 0xF0E7, 0x75C4, 0xF0E4, 0x75C5, 0xB2A1, 0x75C6, 0xAF5B,\t0x75C7, 0xD6A2, 0x75C8, 0xD3B8, 0x75C9, 0xBEB7, 0x75CA, 0xC8AC,\n\t0x75CB, 0xAF5C, 0x75CC, 0xAF5D, 0x75CD, 0xF0EA, 0x75CE, 0xAF5E,\t0x75CF, 0xAF5F, 0x75D0, 0xAF60, 0x75D1, 0xAF61, 0x75D2, 0xD1F7,\n\t0x75D3, 0xAF62, 0x75D4, 0xD6CC, 0x75D5, 0xBADB, 0x75D6, 0xF0E9,\t0x75D7, 0xAF63, 0x75D8, 0xB6BB, 0x75D9, 0xAF64, 0x75DA, 0xAF65,\n\t0x75DB, 0xCDB4, 0x75DC, 0xAF66, 0x75DD, 0xAF67, 0x75DE, 0xC6A6,\t0x75DF, 0xAF68, 0x75E0, 0xAF69, 0x75E1, 0xAF6A, 0x75E2, 0xC1A1,\n\t0x75E3, 0xF0EB, 0x75E4, 0xF0EE, 0x75E5, 0xAF6B, 0x75E6, 0xF0ED,\t0x75E7, 0xF0F0, 0x75E8, 0xF0EC, 0x75E9, 0xAF6C, 0x75EA, 0xBBBE,\n\t0x75EB, 0xF0EF, 0x75EC, 0xAF6D, 0x75ED, 0xAF6E, 0x75EE, 0xAF6F,\t0x75EF, 0xAF70, 0x75F0, 0xCCB5, 0x75F1, 0xF0F2, 0x75F2, 0xAF71,\n\t0x75F3, 0xAF72, 0x75F4, 0xB3D5, 0x75F5, 0xAF73, 0x75F6, 0xAF74,\t0x75F7, 0xAF75, 0x75F8, 0xAF76, 0x75F9, 0xB1D4, 0x75FA, 0xAF77,\n\t0x75FB, 0xAF78, 0x75FC, 0xF0F3, 0x75FD, 0xAF79, 0x75FE, 0xAF7A,\t0x75FF, 0xF0F4, 0x7600, 0xF0F6, 0x7601, 0xB4E1, 0x7602, 0xAF7B,\n\t0x7603, 0xF0F1, 0x7604, 0xAF7C, 0x7605, 0xF0F7, 0x7606, 0xAF7D,\t0x7607, 0xAF7E, 0x7608, 0xAF80, 0x7609, 0xAF81, 0x760A, 0xF0FA,\n\t0x760B, 0xAF82, 0x760C, 0xF0F8, 0x760D, 0xAF83, 0x760E, 0xAF84,\t0x760F, 0xAF85, 0x7610, 0xF0F5, 0x7611, 0xAF86, 0x7612, 0xAF87,\n\t0x7613, 0xAF88, 0x7614, 0xAF89, 0x7615, 0xF0FD, 0x7616, 0xAF8A,\t0x7617, 0xF0F9, 0x7618, 0xF0FC, 0x7619, 0xF0FE, 0x761A, 0xAF8B,\n\t0x761B, 0xF1A1, 0x761C, 0xAF8C, 0x761D, 0xAF8D, 0x761E, 0xAF8E,\t0x761F, 0xCEC1, 0x7620, 0xF1A4, 0x7621, 0xAF8F, 0x7622, 0xF1A3,\n\t0x7623, 0xAF90, 0x7624, 0xC1F6, 0x7625, 0xF0FB, 0x7626, 0xCADD,\t0x7627, 0xAF91, 0x7628, 0xAF92, 0x7629, 0xB4F1, 0x762A, 0xB1F1,\n\t0x762B, 0xCCB1, 0x762C, 0xAF93, 0x762D, 0xF1A6, 0x762E, 0xAF94,\t0x762F, 0xAF95, 0x7630, 0xF1A7, 0x7631, 0xAF96, 0x7632, 0xAF97,\n\t0x7633, 0xF1AC, 0x7634, 0xD5CE, 0x7635, 0xF1A9, 0x7636, 0xAF98,\t0x7637, 0xAF99, 0x7638, 0xC8B3, 0x7639, 0xAF9A, 0x763A, 0xAF9B,\n\t0x763B, 0xAF9C, 0x763C, 0xF1A2, 0x763D, 0xAF9D, 0x763E, 0xF1AB,\t0x763F, 0xF1A8, 0x7640, 0xF1A5, 0x7641, 0xAF9E, 0x7642, 0xAF9F,\n\t0x7643, 0xF1AA, 0x7644, 0xAFA0, 0x7645, 0xB040, 0x7646, 0xB041,\t0x7647, 0xB042, 0x7648, 0xB043, 0x7649, 0xB044, 0x764A, 0xB045,\n\t0x764B, 0xB046, 0x764C, 0xB0A9, 0x764D, 0xF1AD, 0x764E, 0xB047,\t0x764F, 0xB048, 0x7650, 0xB049, 0x7651, 0xB04A, 0x7652, 0xB04B,\n\t0x7653, 0xB04C, 0x7654, 0xF1AF, 0x7655, 0xB04D, 0x7656, 0xF1B1,\t0x7657, 0xB04E, 0x7658, 0xB04F, 0x7659, 0xB050, 0x765A, 0xB051,\n\t0x765B, 0xB052, 0x765C, 0xF1B0, 0x765D, 0xB053, 0x765E, 0xF1AE,\t0x765F, 0xB054, 0x7660, 0xB055, 0x7661, 0xB056, 0x7662, 0xB057,\n\t0x7663, 0xD1A2, 0x7664, 0xB058, 0x7665, 0xB059, 0x7666, 0xB05A,\t0x7667, 0xB05B, 0x7668, 0xB05C, 0x7669, 0xB05D, 0x766A, 0xB05E,\n\t0x766B, 0xF1B2, 0x766C, 0xB05F, 0x766D, 0xB060, 0x766E, 0xB061,\t0x766F, 0xF1B3, 0x7670, 0xB062, 0x7671, 0xB063, 0x7672, 0xB064,\n\t0x7673, 0xB065, 0x7674, 0xB066, 0x7675, 0xB067, 0x7676, 0xB068,\t0x7677, 0xB069, 0x7678, 0xB9EF, 0x7679, 0xB06A, 0x767A, 0xB06B,\n\t0x767B, 0xB5C7, 0x767C, 0xB06C, 0x767D, 0xB0D7, 0x767E, 0xB0D9,\t0x767F, 0xB06D, 0x7680, 0xB06E, 0x7681, 0xB06F, 0x7682, 0xD4ED,\n\t0x7683, 0xB070, 0x7684, 0xB5C4, 0x7685, 0xB071, 0x7686, 0xBDD4,\t0x7687, 0xBBCA, 0x7688, 0xF0A7, 0x7689, 0xB072, 0x768A, 0xB073,\n\t0x768B, 0xB8DE, 0x768C, 0xB074, 0x768D, 0xB075, 0x768E, 0xF0A8,\t0x768F, 0xB076, 0x7690, 0xB077, 0x7691, 0xB0A8, 0x7692, 0xB078,\n\t0x7693, 0xF0A9, 0x7694, 0xB079, 0x7695, 0xB07A, 0x7696, 0xCDEE,\t0x7697, 0xB07B, 0x7698, 0xB07C, 0x7699, 0xF0AA, 0x769A, 0xB07D,\n\t0x769B, 0xB07E, 0x769C, 0xB080, 0x769D, 0xB081, 0x769E, 0xB082,\t0x769F, 0xB083, 0x76A0, 0xB084, 0x76A1, 0xB085, 0x76A2, 0xB086,\n\t0x76A3, 0xB087, 0x76A4, 0xF0AB, 0x76A5, 0xB088, 0x76A6, 0xB089,\t0x76A7, 0xB08A, 0x76A8, 0xB08B, 0x76A9, 0xB08C, 0x76AA, 0xB08D,\n\t0x76AB, 0xB08E, 0x76AC, 0xB08F, 0x76AD, 0xB090, 0x76AE, 0xC6A4,\t0x76AF, 0xB091, 0x76B0, 0xB092, 0x76B1, 0xD6E5, 0x76B2, 0xF1E4,\n\t0x76B3, 0xB093, 0x76B4, 0xF1E5, 0x76B5, 0xB094, 0x76B6, 0xB095,\t0x76B7, 0xB096, 0x76B8, 0xB097, 0x76B9, 0xB098, 0x76BA, 0xB099,\n\t0x76BB, 0xB09A, 0x76BC, 0xB09B, 0x76BD, 0xB09C, 0x76BE, 0xB09D,\t0x76BF, 0xC3F3, 0x76C0, 0xB09E, 0x76C1, 0xB09F, 0x76C2, 0xD3DB,\n\t0x76C3, 0xB0A0, 0x76C4, 0xB140, 0x76C5, 0xD6D1, 0x76C6, 0xC5E8,\t0x76C7, 0xB141, 0x76C8, 0xD3AF, 0x76C9, 0xB142, 0x76CA, 0xD2E6,\n\t0x76CB, 0xB143, 0x76CC, 0xB144, 0x76CD, 0xEEC1, 0x76CE, 0xB0BB,\t0x76CF, 0xD5B5, 0x76D0, 0xD1CE, 0x76D1, 0xBCE0, 0x76D2, 0xBAD0,\n\t0x76D3, 0xB145, 0x76D4, 0xBFF8, 0x76D5, 0xB146, 0x76D6, 0xB8C7,\t0x76D7, 0xB5C1, 0x76D8, 0xC5CC, 0x76D9, 0xB147, 0x76DA, 0xB148,\n\t0x76DB, 0xCAA2, 0x76DC, 0xB149, 0x76DD, 0xB14A, 0x76DE, 0xB14B,\t0x76DF, 0xC3CB, 0x76E0, 0xB14C, 0x76E1, 0xB14D, 0x76E2, 0xB14E,\n\t0x76E3, 0xB14F, 0x76E4, 0xB150, 0x76E5, 0xEEC2, 0x76E6, 0xB151,\t0x76E7, 0xB152, 0x76E8, 0xB153, 0x76E9, 0xB154, 0x76EA, 0xB155,\n\t0x76EB, 0xB156, 0x76EC, 0xB157, 0x76ED, 0xB158, 0x76EE, 0xC4BF,\t0x76EF, 0xB6A2, 0x76F0, 0xB159, 0x76F1, 0xEDEC, 0x76F2, 0xC3A4,\n\t0x76F3, 0xB15A, 0x76F4, 0xD6B1, 0x76F5, 0xB15B, 0x76F6, 0xB15C,\t0x76F7, 0xB15D, 0x76F8, 0xCFE0, 0x76F9, 0xEDEF, 0x76FA, 0xB15E,\n\t0x76FB, 0xB15F, 0x76FC, 0xC5CE, 0x76FD, 0xB160, 0x76FE, 0xB6DC,\t0x76FF, 0xB161, 0x7700, 0xB162, 0x7701, 0xCAA1, 0x7702, 0xB163,\n\t0x7703, 0xB164, 0x7704, 0xEDED, 0x7705, 0xB165, 0x7706, 0xB166,\t0x7707, 0xEDF0, 0x7708, 0xEDF1, 0x7709, 0xC3BC, 0x770A, 0xB167,\n\t0x770B, 0xBFB4, 0x770C, 0xB168, 0x770D, 0xEDEE, 0x770E, 0xB169,\t0x770F, 0xB16A, 0x7710, 0xB16B, 0x7711, 0xB16C, 0x7712, 0xB16D,\n\t0x7713, 0xB16E, 0x7714, 0xB16F, 0x7715, 0xB170, 0x7716, 0xB171,\t0x7717, 0xB172, 0x7718, 0xB173, 0x7719, 0xEDF4, 0x771A, 0xEDF2,\n\t0x771B, 0xB174, 0x771C, 0xB175, 0x771D, 0xB176, 0x771E, 0xB177,\t0x771F, 0xD5E6, 0x7720, 0xC3DF, 0x7721, 0xB178, 0x7722, 0xEDF3,\n\t0x7723, 0xB179, 0x7724, 0xB17A, 0x7725, 0xB17B, 0x7726, 0xEDF6,\t0x7727, 0xB17C, 0x7728, 0xD5A3, 0x7729, 0xD1A3, 0x772A, 0xB17D,\n\t0x772B, 0xB17E, 0x772C, 0xB180, 0x772D, 0xEDF5, 0x772E, 0xB181,\t0x772F, 0xC3D0, 0x7730, 0xB182, 0x7731, 0xB183, 0x7732, 0xB184,\n\t0x7733, 0xB185, 0x7734, 0xB186, 0x7735, 0xEDF7, 0x7736, 0xBFF4,\t0x7737, 0xBEEC, 0x7738, 0xEDF8, 0x7739, 0xB187, 0x773A, 0xCCF7,\n\t0x773B, 0xB188, 0x773C, 0xD1DB, 0x773D, 0xB189, 0x773E, 0xB18A,\t0x773F, 0xB18B, 0x7740, 0xD7C5, 0x7741, 0xD5F6, 0x7742, 0xB18C,\n\t0x7743, 0xEDFC, 0x7744, 0xB18D, 0x7745, 0xB18E, 0x7746, 0xB18F,\t0x7747, 0xEDFB, 0x7748, 0xB190, 0x7749, 0xB191, 0x774A, 0xB192,\n\t0x774B, 0xB193, 0x774C, 0xB194, 0x774D, 0xB195, 0x774E, 0xB196,\t0x774F, 0xB197, 0x7750, 0xEDF9, 0x7751, 0xEDFA, 0x7752, 0xB198,\n\t0x7753, 0xB199, 0x7754, 0xB19A, 0x7755, 0xB19B, 0x7756, 0xB19C,\t0x7757, 0xB19D, 0x7758, 0xB19E, 0x7759, 0xB19F, 0x775A, 0xEDFD,\n\t0x775B, 0xBEA6, 0x775C, 0xB1A0, 0x775D, 0xB240, 0x775E, 0xB241,\t0x775F, 0xB242, 0x7760, 0xB243, 0x7761, 0xCBAF, 0x7762, 0xEEA1,\n\t0x7763, 0xB6BD, 0x7764, 0xB244, 0x7765, 0xEEA2, 0x7766, 0xC4C0,\t0x7767, 0xB245, 0x7768, 0xEDFE, 0x7769, 0xB246, 0x776A, 0xB247,\n\t0x776B, 0xBDDE, 0x776C, 0xB2C7, 0x776D, 0xB248, 0x776E, 0xB249,\t0x776F, 0xB24A, 0x7770, 0xB24B, 0x7771, 0xB24C, 0x7772, 0xB24D,\n\t0x7773, 0xB24E, 0x7774, 0xB24F, 0x7775, 0xB250, 0x7776, 0xB251,\t0x7777, 0xB252, 0x7778, 0xB253, 0x7779, 0xB6C3, 0x777A, 0xB254,\n\t0x777B, 0xB255, 0x777C, 0xB256, 0x777D, 0xEEA5, 0x777E, 0xD8BA,\t0x777F, 0xEEA3, 0x7780, 0xEEA6, 0x7781, 0xB257, 0x7782, 0xB258,\n\t0x7783, 0xB259, 0x7784, 0xC3E9, 0x7785, 0xB3F2, 0x7786, 0xB25A,\t0x7787, 0xB25B, 0x7788, 0xB25C, 0x7789, 0xB25D, 0x778A, 0xB25E,\n\t0x778B, 0xB25F, 0x778C, 0xEEA7, 0x778D, 0xEEA4, 0x778E, 0xCFB9,\t0x778F, 0xB260, 0x7790, 0xB261, 0x7791, 0xEEA8, 0x7792, 0xC2F7,\n\t0x7793, 0xB262, 0x7794, 0xB263, 0x7795, 0xB264, 0x7796, 0xB265,\t0x7797, 0xB266, 0x7798, 0xB267, 0x7799, 0xB268, 0x779A, 0xB269,\n\t0x779B, 0xB26A, 0x779C, 0xB26B, 0x779D, 0xB26C, 0x779E, 0xB26D,\t0x779F, 0xEEA9, 0x77A0, 0xEEAA, 0x77A1, 0xB26E, 0x77A2, 0xDEAB,\n\t0x77A3, 0xB26F, 0x77A4, 0xB270, 0x77A5, 0xC6B3, 0x77A6, 0xB271,\t0x77A7, 0xC7C6, 0x77A8, 0xB272, 0x77A9, 0xD6F5, 0x77AA, 0xB5C9,\n\t0x77AB, 0xB273, 0x77AC, 0xCBB2, 0x77AD, 0xB274, 0x77AE, 0xB275,\t0x77AF, 0xB276, 0x77B0, 0xEEAB, 0x77B1, 0xB277, 0x77B2, 0xB278,\n\t0x77B3, 0xCDAB, 0x77B4, 0xB279, 0x77B5, 0xEEAC, 0x77B6, 0xB27A,\t0x77B7, 0xB27B, 0x77B8, 0xB27C, 0x77B9, 0xB27D, 0x77BA, 0xB27E,\n\t0x77BB, 0xD5B0, 0x77BC, 0xB280, 0x77BD, 0xEEAD, 0x77BE, 0xB281,\t0x77BF, 0xF6C4, 0x77C0, 0xB282, 0x77C1, 0xB283, 0x77C2, 0xB284,\n\t0x77C3, 0xB285, 0x77C4, 0xB286, 0x77C5, 0xB287, 0x77C6, 0xB288,\t0x77C7, 0xB289, 0x77C8, 0xB28A, 0x77C9, 0xB28B, 0x77CA, 0xB28C,\n\t0x77CB, 0xB28D, 0x77CC, 0xB28E, 0x77CD, 0xDBC7, 0x77CE, 0xB28F,\t0x77CF, 0xB290, 0x77D0, 0xB291, 0x77D1, 0xB292, 0x77D2, 0xB293,\n\t0x77D3, 0xB294, 0x77D4, 0xB295, 0x77D5, 0xB296, 0x77D6, 0xB297,\t0x77D7, 0xB4A3, 0x77D8, 0xB298, 0x77D9, 0xB299, 0x77DA, 0xB29A,\n\t0x77DB, 0xC3AC, 0x77DC, 0xF1E6, 0x77DD, 0xB29B, 0x77DE, 0xB29C,\t0x77DF, 0xB29D, 0x77E0, 0xB29E, 0x77E1, 0xB29F, 0x77E2, 0xCAB8,\n\t0x77E3, 0xD2D3, 0x77E4, 0xB2A0, 0x77E5, 0xD6AA, 0x77E6, 0xB340,\t0x77E7, 0xEFF2, 0x77E8, 0xB341, 0x77E9, 0xBED8, 0x77EA, 0xB342,\n\t0x77EB, 0xBDC3, 0x77EC, 0xEFF3, 0x77ED, 0xB6CC, 0x77EE, 0xB0AB,\t0x77EF, 0xB343, 0x77F0, 0xB344, 0x77F1, 0xB345, 0x77F2, 0xB346,\n\t0x77F3, 0xCAAF, 0x77F4, 0xB347, 0x77F5, 0xB348, 0x77F6, 0xEDB6,\t0x77F7, 0xB349, 0x77F8, 0xEDB7, 0x77F9, 0xB34A, 0x77FA, 0xB34B,\n\t0x77FB, 0xB34C, 0x77FC, 0xB34D, 0x77FD, 0xCEF9, 0x77FE, 0xB7AF,\t0x77FF, 0xBFF3, 0x7800, 0xEDB8, 0x7801, 0xC2EB, 0x7802, 0xC9B0,\n\t0x7803, 0xB34E, 0x7804, 0xB34F, 0x7805, 0xB350, 0x7806, 0xB351,\t0x7807, 0xB352, 0x7808, 0xB353, 0x7809, 0xEDB9, 0x780A, 0xB354,\n\t0x780B, 0xB355, 0x780C, 0xC6F6, 0x780D, 0xBFB3, 0x780E, 0xB356,\t0x780F, 0xB357, 0x7810, 0xB358, 0x7811, 0xEDBC, 0x7812, 0xC5F8,\n\t0x7813, 0xB359, 0x7814, 0xD1D0, 0x7815, 0xB35A, 0x7816, 0xD7A9,\t0x7817, 0xEDBA, 0x7818, 0xEDBB, 0x7819, 0xB35B, 0x781A, 0xD1E2,\n\t0x781B, 0xB35C, 0x781C, 0xEDBF, 0x781D, 0xEDC0, 0x781E, 0xB35D,\t0x781F, 0xEDC4, 0x7820, 0xB35E, 0x7821, 0xB35F, 0x7822, 0xB360,\n\t0x7823, 0xEDC8, 0x7824, 0xB361, 0x7825, 0xEDC6, 0x7826, 0xEDCE,\t0x7827, 0xD5E8, 0x7828, 0xB362, 0x7829, 0xEDC9, 0x782A, 0xB363,\n\t0x782B, 0xB364, 0x782C, 0xEDC7, 0x782D, 0xEDBE, 0x782E, 0xB365,\t0x782F, 0xB366, 0x7830, 0xC5E9, 0x7831, 0xB367, 0x7832, 0xB368,\n\t0x7833, 0xB369, 0x7834, 0xC6C6, 0x7835, 0xB36A, 0x7836, 0xB36B,\t0x7837, 0xC9E9, 0x7838, 0xD4D2, 0x7839, 0xEDC1, 0x783A, 0xEDC2,\n\t0x783B, 0xEDC3, 0x783C, 0xEDC5, 0x783D, 0xB36C, 0x783E, 0xC0F9,\t0x783F, 0xB36D, 0x7840, 0xB4A1, 0x7841, 0xB36E, 0x7842, 0xB36F,\n\t0x7843, 0xB370, 0x7844, 0xB371, 0x7845, 0xB9E8, 0x7846, 0xB372,\t0x7847, 0xEDD0, 0x7848, 0xB373, 0x7849, 0xB374, 0x784A, 0xB375,\n\t0x784B, 0xB376, 0x784C, 0xEDD1, 0x784D, 0xB377, 0x784E, 0xEDCA,\t0x784F, 0xB378, 0x7850, 0xEDCF, 0x7851, 0xB379, 0x7852, 0xCEF8,\n\t0x7853, 0xB37A, 0x7854, 0xB37B, 0x7855, 0xCBB6, 0x7856, 0xEDCC,\t0x7857, 0xEDCD, 0x7858, 0xB37C, 0x7859, 0xB37D, 0x785A, 0xB37E,\n\t0x785B, 0xB380, 0x785C, 0xB381, 0x785D, 0xCFF5, 0x785E, 0xB382,\t0x785F, 0xB383, 0x7860, 0xB384, 0x7861, 0xB385, 0x7862, 0xB386,\n\t0x7863, 0xB387, 0x7864, 0xB388, 0x7865, 0xB389, 0x7866, 0xB38A,\t0x7867, 0xB38B, 0x7868, 0xB38C, 0x7869, 0xB38D, 0x786A, 0xEDD2,\n\t0x786B, 0xC1F2, 0x786C, 0xD3B2, 0x786D, 0xEDCB, 0x786E, 0xC8B7,\t0x786F, 0xB38E, 0x7870, 0xB38F, 0x7871, 0xB390, 0x7872, 0xB391,\n\t0x7873, 0xB392, 0x7874, 0xB393, 0x7875, 0xB394, 0x7876, 0xB395,\t0x7877, 0xBCEF, 0x7878, 0xB396, 0x7879, 0xB397, 0x787A, 0xB398,\n\t0x787B, 0xB399, 0x787C, 0xC5F0, 0x787D, 0xB39A, 0x787E, 0xB39B,\t0x787F, 0xB39C, 0x7880, 0xB39D, 0x7881, 0xB39E, 0x7882, 0xB39F,\n\t0x7883, 0xB3A0, 0x7884, 0xB440, 0x7885, 0xB441, 0x7886, 0xB442,\t0x7887, 0xEDD6, 0x7888, 0xB443, 0x7889, 0xB5EF, 0x788A, 0xB444,\n\t0x788B, 0xB445, 0x788C, 0xC2B5, 0x788D, 0xB0AD, 0x788E, 0xCBE9,\t0x788F, 0xB446, 0x7890, 0xB447, 0x7891, 0xB1AE, 0x7892, 0xB448,\n\t0x7893, 0xEDD4, 0x7894, 0xB449, 0x7895, 0xB44A, 0x7896, 0xB44B,\t0x7897, 0xCDEB, 0x7898, 0xB5E2, 0x7899, 0xB44C, 0x789A, 0xEDD5,\n\t0x789B, 0xEDD3, 0x789C, 0xEDD7, 0x789D, 0xB44D, 0x789E, 0xB44E,\t0x789F, 0xB5FA, 0x78A0, 0xB44F, 0x78A1, 0xEDD8, 0x78A2, 0xB450,\n\t0x78A3, 0xEDD9, 0x78A4, 0xB451, 0x78A5, 0xEDDC, 0x78A6, 0xB452,\t0x78A7, 0xB1CC, 0x78A8, 0xB453, 0x78A9, 0xB454, 0x78AA, 0xB455,\n\t0x78AB, 0xB456, 0x78AC, 0xB457, 0x78AD, 0xB458, 0x78AE, 0xB459,\t0x78AF, 0xB45A, 0x78B0, 0xC5F6, 0x78B1, 0xBCEE, 0x78B2, 0xEDDA,\n\t0x78B3, 0xCCBC, 0x78B4, 0xB2EA, 0x78B5, 0xB45B, 0x78B6, 0xB45C,\t0x78B7, 0xB45D, 0x78B8, 0xB45E, 0x78B9, 0xEDDB, 0x78BA, 0xB45F,\n\t0x78BB, 0xB460, 0x78BC, 0xB461, 0x78BD, 0xB462, 0x78BE, 0xC4EB,\t0x78BF, 0xB463, 0x78C0, 0xB464, 0x78C1, 0xB4C5, 0x78C2, 0xB465,\n\t0x78C3, 0xB466, 0x78C4, 0xB467, 0x78C5, 0xB0F5, 0x78C6, 0xB468,\t0x78C7, 0xB469, 0x78C8, 0xB46A, 0x78C9, 0xEDDF, 0x78CA, 0xC0DA,\n\t0x78CB, 0xB4E8, 0x78CC, 0xB46B, 0x78CD, 0xB46C, 0x78CE, 0xB46D,\t0x78CF, 0xB46E, 0x78D0, 0xC5CD, 0x78D1, 0xB46F, 0x78D2, 0xB470,\n\t0x78D3, 0xB471, 0x78D4, 0xEDDD, 0x78D5, 0xBFC4, 0x78D6, 0xB472,\t0x78D7, 0xB473, 0x78D8, 0xB474, 0x78D9, 0xEDDE, 0x78DA, 0xB475,\n\t0x78DB, 0xB476, 0x78DC, 0xB477, 0x78DD, 0xB478, 0x78DE, 0xB479,\t0x78DF, 0xB47A, 0x78E0, 0xB47B, 0x78E1, 0xB47C, 0x78E2, 0xB47D,\n\t0x78E3, 0xB47E, 0x78E4, 0xB480, 0x78E5, 0xB481, 0x78E6, 0xB482,\t0x78E7, 0xB483, 0x78E8, 0xC4A5, 0x78E9, 0xB484, 0x78EA, 0xB485,\n\t0x78EB, 0xB486, 0x78EC, 0xEDE0, 0x78ED, 0xB487, 0x78EE, 0xB488,\t0x78EF, 0xB489, 0x78F0, 0xB48A, 0x78F1, 0xB48B, 0x78F2, 0xEDE1,\n\t0x78F3, 0xB48C, 0x78F4, 0xEDE3, 0x78F5, 0xB48D, 0x78F6, 0xB48E,\t0x78F7, 0xC1D7, 0x78F8, 0xB48F, 0x78F9, 0xB490, 0x78FA, 0xBBC7,\n\t0x78FB, 0xB491, 0x78FC, 0xB492, 0x78FD, 0xB493, 0x78FE, 0xB494,\t0x78FF, 0xB495, 0x7900, 0xB496, 0x7901, 0xBDB8, 0x7902, 0xB497,\n\t0x7903, 0xB498, 0x7904, 0xB499, 0x7905, 0xEDE2, 0x7906, 0xB49A,\t0x7907, 0xB49B, 0x7908, 0xB49C, 0x7909, 0xB49D, 0x790A, 0xB49E,\n\t0x790B, 0xB49F, 0x790C, 0xB4A0, 0x790D, 0xB540, 0x790E, 0xB541,\t0x790F, 0xB542, 0x7910, 0xB543, 0x7911, 0xB544, 0x7912, 0xB545,\n\t0x7913, 0xEDE4, 0x7914, 0xB546, 0x7915, 0xB547, 0x7916, 0xB548,\t0x7917, 0xB549, 0x7918, 0xB54A, 0x7919, 0xB54B, 0x791A, 0xB54C,\n\t0x791B, 0xB54D, 0x791C, 0xB54E, 0x791D, 0xB54F, 0x791E, 0xEDE6,\t0x791F, 0xB550, 0x7920, 0xB551, 0x7921, 0xB552, 0x7922, 0xB553,\n\t0x7923, 0xB554, 0x7924, 0xEDE5, 0x7925, 0xB555, 0x7926, 0xB556,\t0x7927, 0xB557, 0x7928, 0xB558, 0x7929, 0xB559, 0x792A, 0xB55A,\n\t0x792B, 0xB55B, 0x792C, 0xB55C, 0x792D, 0xB55D, 0x792E, 0xB55E,\t0x792F, 0xB55F, 0x7930, 0xB560, 0x7931, 0xB561, 0x7932, 0xB562,\n\t0x7933, 0xB563, 0x7934, 0xEDE7, 0x7935, 0xB564, 0x7936, 0xB565,\t0x7937, 0xB566, 0x7938, 0xB567, 0x7939, 0xB568, 0x793A, 0xCABE,\n\t0x793B, 0xECEA, 0x793C, 0xC0F1, 0x793D, 0xB569, 0x793E, 0xC9E7,\t0x793F, 0xB56A, 0x7940, 0xECEB, 0x7941, 0xC6EE, 0x7942, 0xB56B,\n\t0x7943, 0xB56C, 0x7944, 0xB56D, 0x7945, 0xB56E, 0x7946, 0xECEC,\t0x7947, 0xB56F, 0x7948, 0xC6ED, 0x7949, 0xECED, 0x794A, 0xB570,\n\t0x794B, 0xB571, 0x794C, 0xB572, 0x794D, 0xB573, 0x794E, 0xB574,\t0x794F, 0xB575, 0x7950, 0xB576, 0x7951, 0xB577, 0x7952, 0xB578,\n\t0x7953, 0xECF0, 0x7954, 0xB579, 0x7955, 0xB57A, 0x7956, 0xD7E6,\t0x7957, 0xECF3, 0x7958, 0xB57B, 0x7959, 0xB57C, 0x795A, 0xECF1,\n\t0x795B, 0xECEE, 0x795C, 0xECEF, 0x795D, 0xD7A3, 0x795E, 0xC9F1,\t0x795F, 0xCBEE, 0x7960, 0xECF4, 0x7961, 0xB57D, 0x7962, 0xECF2,\n\t0x7963, 0xB57E, 0x7964, 0xB580, 0x7965, 0xCFE9, 0x7966, 0xB581,\t0x7967, 0xECF6, 0x7968, 0xC6B1, 0x7969, 0xB582, 0x796A, 0xB583,\n\t0x796B, 0xB584, 0x796C, 0xB585, 0x796D, 0xBCC0, 0x796E, 0xB586,\t0x796F, 0xECF5, 0x7970, 0xB587, 0x7971, 0xB588, 0x7972, 0xB589,\n\t0x7973, 0xB58A, 0x7974, 0xB58B, 0x7975, 0xB58C, 0x7976, 0xB58D,\t0x7977, 0xB5BB, 0x7978, 0xBBF6, 0x7979, 0xB58E, 0x797A, 0xECF7,\n\t0x797B, 0xB58F, 0x797C, 0xB590, 0x797D, 0xB591, 0x797E, 0xB592,\t0x797F, 0xB593, 0x7980, 0xD9F7, 0x7981, 0xBDFB, 0x7982, 0xB594,\n\t0x7983, 0xB595, 0x7984, 0xC2BB, 0x7985, 0xECF8, 0x7986, 0xB596,\t0x7987, 0xB597, 0x7988, 0xB598, 0x7989, 0xB599, 0x798A, 0xECF9,\n\t0x798B, 0xB59A, 0x798C, 0xB59B, 0x798D, 0xB59C, 0x798E, 0xB59D,\t0x798F, 0xB8A3, 0x7990, 0xB59E, 0x7991, 0xB59F, 0x7992, 0xB5A0,\n\t0x7993, 0xB640, 0x7994, 0xB641, 0x7995, 0xB642, 0x7996, 0xB643,\t0x7997, 0xB644, 0x7998, 0xB645, 0x7999, 0xB646, 0x799A, 0xECFA,\n\t0x799B, 0xB647, 0x799C, 0xB648, 0x799D, 0xB649, 0x799E, 0xB64A,\t0x799F, 0xB64B, 0x79A0, 0xB64C, 0x79A1, 0xB64D, 0x79A2, 0xB64E,\n\t0x79A3, 0xB64F, 0x79A4, 0xB650, 0x79A5, 0xB651, 0x79A6, 0xB652,\t0x79A7, 0xECFB, 0x79A8, 0xB653, 0x79A9, 0xB654, 0x79AA, 0xB655,\n\t0x79AB, 0xB656, 0x79AC, 0xB657, 0x79AD, 0xB658, 0x79AE, 0xB659,\t0x79AF, 0xB65A, 0x79B0, 0xB65B, 0x79B1, 0xB65C, 0x79B2, 0xB65D,\n\t0x79B3, 0xECFC, 0x79B4, 0xB65E, 0x79B5, 0xB65F, 0x79B6, 0xB660,\t0x79B7, 0xB661, 0x79B8, 0xB662, 0x79B9, 0xD3ED, 0x79BA, 0xD8AE,\n\t0x79BB, 0xC0EB, 0x79BC, 0xB663, 0x79BD, 0xC7DD, 0x79BE, 0xBACC,\t0x79BF, 0xB664, 0x79C0, 0xD0E3, 0x79C1, 0xCBBD, 0x79C2, 0xB665,\n\t0x79C3, 0xCDBA, 0x79C4, 0xB666, 0x79C5, 0xB667, 0x79C6, 0xB8D1,\t0x79C7, 0xB668, 0x79C8, 0xB669, 0x79C9, 0xB1FC, 0x79CA, 0xB66A,\n\t0x79CB, 0xC7EF, 0x79CC, 0xB66B, 0x79CD, 0xD6D6, 0x79CE, 0xB66C,\t0x79CF, 0xB66D, 0x79D0, 0xB66E, 0x79D1, 0xBFC6, 0x79D2, 0xC3EB,\n\t0x79D3, 0xB66F, 0x79D4, 0xB670, 0x79D5, 0xEFF5, 0x79D6, 0xB671,\t0x79D7, 0xB672, 0x79D8, 0xC3D8, 0x79D9, 0xB673, 0x79DA, 0xB674,\n\t0x79DB, 0xB675, 0x79DC, 0xB676, 0x79DD, 0xB677, 0x79DE, 0xB678,\t0x79DF, 0xD7E2, 0x79E0, 0xB679, 0x79E1, 0xB67A, 0x79E2, 0xB67B,\n\t0x79E3, 0xEFF7, 0x79E4, 0xB3D3, 0x79E5, 0xB67C, 0x79E6, 0xC7D8,\t0x79E7, 0xD1ED, 0x79E8, 0xB67D, 0x79E9, 0xD6C8, 0x79EA, 0xB67E,\n\t0x79EB, 0xEFF8, 0x79EC, 0xB680, 0x79ED, 0xEFF6, 0x79EE, 0xB681,\t0x79EF, 0xBBFD, 0x79F0, 0xB3C6, 0x79F1, 0xB682, 0x79F2, 0xB683,\n\t0x79F3, 0xB684, 0x79F4, 0xB685, 0x79F5, 0xB686, 0x79F6, 0xB687,\t0x79F7, 0xB688, 0x79F8, 0xBDD5, 0x79F9, 0xB689, 0x79FA, 0xB68A,\n\t0x79FB, 0xD2C6, 0x79FC, 0xB68B, 0x79FD, 0xBBE0, 0x79FE, 0xB68C,\t0x79FF, 0xB68D, 0x7A00, 0xCFA1, 0x7A01, 0xB68E, 0x7A02, 0xEFFC,\n\t0x7A03, 0xEFFB, 0x7A04, 0xB68F, 0x7A05, 0xB690, 0x7A06, 0xEFF9,\t0x7A07, 0xB691, 0x7A08, 0xB692, 0x7A09, 0xB693, 0x7A0A, 0xB694,\n\t0x7A0B, 0xB3CC, 0x7A0C, 0xB695, 0x7A0D, 0xC9D4, 0x7A0E, 0xCBB0,\t0x7A0F, 0xB696, 0x7A10, 0xB697, 0x7A11, 0xB698, 0x7A12, 0xB699,\n\t0x7A13, 0xB69A, 0x7A14, 0xEFFE, 0x7A15, 0xB69B, 0x7A16, 0xB69C,\t0x7A17, 0xB0DE, 0x7A18, 0xB69D, 0x7A19, 0xB69E, 0x7A1A, 0xD6C9,\n\t0x7A1B, 0xB69F, 0x7A1C, 0xB6A0, 0x7A1D, 0xB740, 0x7A1E, 0xEFFD,\t0x7A1F, 0xB741, 0x7A20, 0xB3ED, 0x7A21, 0xB742, 0x7A22, 0xB743,\n\t0x7A23, 0xF6D5, 0x7A24, 0xB744, 0x7A25, 0xB745, 0x7A26, 0xB746,\t0x7A27, 0xB747, 0x7A28, 0xB748, 0x7A29, 0xB749, 0x7A2A, 0xB74A,\n\t0x7A2B, 0xB74B, 0x7A2C, 0xB74C, 0x7A2D, 0xB74D, 0x7A2E, 0xB74E,\t0x7A2F, 0xB74F, 0x7A30, 0xB750, 0x7A31, 0xB751, 0x7A32, 0xB752,\n\t0x7A33, 0xCEC8, 0x7A34, 0xB753, 0x7A35, 0xB754, 0x7A36, 0xB755,\t0x7A37, 0xF0A2, 0x7A38, 0xB756, 0x7A39, 0xF0A1, 0x7A3A, 0xB757,\n\t0x7A3B, 0xB5BE, 0x7A3C, 0xBCDA, 0x7A3D, 0xBBFC, 0x7A3E, 0xB758,\t0x7A3F, 0xB8E5, 0x7A40, 0xB759, 0x7A41, 0xB75A, 0x7A42, 0xB75B,\n\t0x7A43, 0xB75C, 0x7A44, 0xB75D, 0x7A45, 0xB75E, 0x7A46, 0xC4C2,\t0x7A47, 0xB75F, 0x7A48, 0xB760, 0x7A49, 0xB761, 0x7A4A, 0xB762,\n\t0x7A4B, 0xB763, 0x7A4C, 0xB764, 0x7A4D, 0xB765, 0x7A4E, 0xB766,\t0x7A4F, 0xB767, 0x7A50, 0xB768, 0x7A51, 0xF0A3, 0x7A52, 0xB769,\n\t0x7A53, 0xB76A, 0x7A54, 0xB76B, 0x7A55, 0xB76C, 0x7A56, 0xB76D,\t0x7A57, 0xCBEB, 0x7A58, 0xB76E, 0x7A59, 0xB76F, 0x7A5A, 0xB770,\n\t0x7A5B, 0xB771, 0x7A5C, 0xB772, 0x7A5D, 0xB773, 0x7A5E, 0xB774,\t0x7A5F, 0xB775, 0x7A60, 0xB776, 0x7A61, 0xB777, 0x7A62, 0xB778,\n\t0x7A63, 0xB779, 0x7A64, 0xB77A, 0x7A65, 0xB77B, 0x7A66, 0xB77C,\t0x7A67, 0xB77D, 0x7A68, 0xB77E, 0x7A69, 0xB780, 0x7A6A, 0xB781,\n\t0x7A6B, 0xB782, 0x7A6C, 0xB783, 0x7A6D, 0xB784, 0x7A6E, 0xB785,\t0x7A6F, 0xB786, 0x7A70, 0xF0A6, 0x7A71, 0xB787, 0x7A72, 0xB788,\n\t0x7A73, 0xB789, 0x7A74, 0xD1A8, 0x7A75, 0xB78A, 0x7A76, 0xBEBF,\t0x7A77, 0xC7EE, 0x7A78, 0xF1B6, 0x7A79, 0xF1B7, 0x7A7A, 0xBFD5,\n\t0x7A7B, 0xB78B, 0x7A7C, 0xB78C, 0x7A7D, 0xB78D, 0x7A7E, 0xB78E,\t0x7A7F, 0xB4A9, 0x7A80, 0xF1B8, 0x7A81, 0xCDBB, 0x7A82, 0xB78F,\n\t0x7A83, 0xC7D4, 0x7A84, 0xD5AD, 0x7A85, 0xB790, 0x7A86, 0xF1B9,\t0x7A87, 0xB791, 0x7A88, 0xF1BA, 0x7A89, 0xB792, 0x7A8A, 0xB793,\n\t0x7A8B, 0xB794, 0x7A8C, 0xB795, 0x7A8D, 0xC7CF, 0x7A8E, 0xB796,\t0x7A8F, 0xB797, 0x7A90, 0xB798, 0x7A91, 0xD2A4, 0x7A92, 0xD6CF,\n\t0x7A93, 0xB799, 0x7A94, 0xB79A, 0x7A95, 0xF1BB, 0x7A96, 0xBDD1,\t0x7A97, 0xB4B0, 0x7A98, 0xBEBD, 0x7A99, 0xB79B, 0x7A9A, 0xB79C,\n\t0x7A9B, 0xB79D, 0x7A9C, 0xB4DC, 0x7A9D, 0xCED1, 0x7A9E, 0xB79E,\t0x7A9F, 0xBFDF, 0x7AA0, 0xF1BD, 0x7AA1, 0xB79F, 0x7AA2, 0xB7A0,\n\t0x7AA3, 0xB840, 0x7AA4, 0xB841, 0x7AA5, 0xBFFA, 0x7AA6, 0xF1BC,\t0x7AA7, 0xB842, 0x7AA8, 0xF1BF, 0x7AA9, 0xB843, 0x7AAA, 0xB844,\n\t0x7AAB, 0xB845, 0x7AAC, 0xF1BE, 0x7AAD, 0xF1C0, 0x7AAE, 0xB846,\t0x7AAF, 0xB847, 0x7AB0, 0xB848, 0x7AB1, 0xB849, 0x7AB2, 0xB84A,\n\t0x7AB3, 0xF1C1, 0x7AB4, 0xB84B, 0x7AB5, 0xB84C, 0x7AB6, 0xB84D,\t0x7AB7, 0xB84E, 0x7AB8, 0xB84F, 0x7AB9, 0xB850, 0x7ABA, 0xB851,\n\t0x7ABB, 0xB852, 0x7ABC, 0xB853, 0x7ABD, 0xB854, 0x7ABE, 0xB855,\t0x7ABF, 0xC1FE, 0x7AC0, 0xB856, 0x7AC1, 0xB857, 0x7AC2, 0xB858,\n\t0x7AC3, 0xB859, 0x7AC4, 0xB85A, 0x7AC5, 0xB85B, 0x7AC6, 0xB85C,\t0x7AC7, 0xB85D, 0x7AC8, 0xB85E, 0x7AC9, 0xB85F, 0x7ACA, 0xB860,\n\t0x7ACB, 0xC1A2, 0x7ACC, 0xB861, 0x7ACD, 0xB862, 0x7ACE, 0xB863,\t0x7ACF, 0xB864, 0x7AD0, 0xB865, 0x7AD1, 0xB866, 0x7AD2, 0xB867,\n\t0x7AD3, 0xB868, 0x7AD4, 0xB869, 0x7AD5, 0xB86A, 0x7AD6, 0xCAFA,\t0x7AD7, 0xB86B, 0x7AD8, 0xB86C, 0x7AD9, 0xD5BE, 0x7ADA, 0xB86D,\n\t0x7ADB, 0xB86E, 0x7ADC, 0xB86F, 0x7ADD, 0xB870, 0x7ADE, 0xBEBA,\t0x7ADF, 0xBEB9, 0x7AE0, 0xD5C2, 0x7AE1, 0xB871, 0x7AE2, 0xB872,\n\t0x7AE3, 0xBFA2, 0x7AE4, 0xB873, 0x7AE5, 0xCDAF, 0x7AE6, 0xF1B5,\t0x7AE7, 0xB874, 0x7AE8, 0xB875, 0x7AE9, 0xB876, 0x7AEA, 0xB877,\n\t0x7AEB, 0xB878, 0x7AEC, 0xB879, 0x7AED, 0xBDDF, 0x7AEE, 0xB87A,\t0x7AEF, 0xB6CB, 0x7AF0, 0xB87B, 0x7AF1, 0xB87C, 0x7AF2, 0xB87D,\n\t0x7AF3, 0xB87E, 0x7AF4, 0xB880, 0x7AF5, 0xB881, 0x7AF6, 0xB882,\t0x7AF7, 0xB883, 0x7AF8, 0xB884, 0x7AF9, 0xD6F1, 0x7AFA, 0xF3C3,\n\t0x7AFB, 0xB885, 0x7AFC, 0xB886, 0x7AFD, 0xF3C4, 0x7AFE, 0xB887,\t0x7AFF, 0xB8CD, 0x7B00, 0xB888, 0x7B01, 0xB889, 0x7B02, 0xB88A,\n\t0x7B03, 0xF3C6, 0x7B04, 0xF3C7, 0x7B05, 0xB88B, 0x7B06, 0xB0CA,\t0x7B07, 0xB88C, 0x7B08, 0xF3C5, 0x7B09, 0xB88D, 0x7B0A, 0xF3C9,\n\t0x7B0B, 0xCBF1, 0x7B0C, 0xB88E, 0x7B0D, 0xB88F, 0x7B0E, 0xB890,\t0x7B0F, 0xF3CB, 0x7B10, 0xB891, 0x7B11, 0xD0A6, 0x7B12, 0xB892,\n\t0x7B13, 0xB893, 0x7B14, 0xB1CA, 0x7B15, 0xF3C8, 0x7B16, 0xB894,\t0x7B17, 0xB895, 0x7B18, 0xB896, 0x7B19, 0xF3CF, 0x7B1A, 0xB897,\n\t0x7B1B, 0xB5D1, 0x7B1C, 0xB898, 0x7B1D, 0xB899, 0x7B1E, 0xF3D7,\t0x7B1F, 0xB89A, 0x7B20, 0xF3D2, 0x7B21, 0xB89B, 0x7B22, 0xB89C,\n\t0x7B23, 0xB89D, 0x7B24, 0xF3D4, 0x7B25, 0xF3D3, 0x7B26, 0xB7FB,\t0x7B27, 0xB89E, 0x7B28, 0xB1BF, 0x7B29, 0xB89F, 0x7B2A, 0xF3CE,\n\t0x7B2B, 0xF3CA, 0x7B2C, 0xB5DA, 0x7B2D, 0xB8A0, 0x7B2E, 0xF3D0,\t0x7B2F, 0xB940, 0x7B30, 0xB941, 0x7B31, 0xF3D1, 0x7B32, 0xB942,\n\t0x7B33, 0xF3D5, 0x7B34, 0xB943, 0x7B35, 0xB944, 0x7B36, 0xB945,\t0x7B37, 0xB946, 0x7B38, 0xF3CD, 0x7B39, 0xB947, 0x7B3A, 0xBCE3,\n\t0x7B3B, 0xB948, 0x7B3C, 0xC1FD, 0x7B3D, 0xB949, 0x7B3E, 0xF3D6,\t0x7B3F, 0xB94A, 0x7B40, 0xB94B, 0x7B41, 0xB94C, 0x7B42, 0xB94D,\n\t0x7B43, 0xB94E, 0x7B44, 0xB94F, 0x7B45, 0xF3DA, 0x7B46, 0xB950,\t0x7B47, 0xF3CC, 0x7B48, 0xB951, 0x7B49, 0xB5C8, 0x7B4A, 0xB952,\n\t0x7B4B, 0xBDEE, 0x7B4C, 0xF3DC, 0x7B4D, 0xB953, 0x7B4E, 0xB954,\t0x7B4F, 0xB7A4, 0x7B50, 0xBFF0, 0x7B51, 0xD6FE, 0x7B52, 0xCDB2,\n\t0x7B53, 0xB955, 0x7B54, 0xB4F0, 0x7B55, 0xB956, 0x7B56, 0xB2DF,\t0x7B57, 0xB957, 0x7B58, 0xF3D8, 0x7B59, 0xB958, 0x7B5A, 0xF3D9,\n\t0x7B5B, 0xC9B8, 0x7B5C, 0xB959, 0x7B5D, 0xF3DD, 0x7B5E, 0xB95A,\t0x7B5F, 0xB95B, 0x7B60, 0xF3DE, 0x7B61, 0xB95C, 0x7B62, 0xF3E1,\n\t0x7B63, 0xB95D, 0x7B64, 0xB95E, 0x7B65, 0xB95F, 0x7B66, 0xB960,\t0x7B67, 0xB961, 0x7B68, 0xB962, 0x7B69, 0xB963, 0x7B6A, 0xB964,\n\t0x7B6B, 0xB965, 0x7B6C, 0xB966, 0x7B6D, 0xB967, 0x7B6E, 0xF3DF,\t0x7B6F, 0xB968, 0x7B70, 0xB969, 0x7B71, 0xF3E3, 0x7B72, 0xF3E2,\n\t0x7B73, 0xB96A, 0x7B74, 0xB96B, 0x7B75, 0xF3DB, 0x7B76, 0xB96C,\t0x7B77, 0xBFEA, 0x7B78, 0xB96D, 0x7B79, 0xB3EF, 0x7B7A, 0xB96E,\n\t0x7B7B, 0xF3E0, 0x7B7C, 0xB96F, 0x7B7D, 0xB970, 0x7B7E, 0xC7A9,\t0x7B7F, 0xB971, 0x7B80, 0xBCF2, 0x7B81, 0xB972, 0x7B82, 0xB973,\n\t0x7B83, 0xB974, 0x7B84, 0xB975, 0x7B85, 0xF3EB, 0x7B86, 0xB976,\t0x7B87, 0xB977, 0x7B88, 0xB978, 0x7B89, 0xB979, 0x7B8A, 0xB97A,\n\t0x7B8B, 0xB97B, 0x7B8C, 0xB97C, 0x7B8D, 0xB9BF, 0x7B8E, 0xB97D,\t0x7B8F, 0xB97E, 0x7B90, 0xF3E4, 0x7B91, 0xB980, 0x7B92, 0xB981,\n\t0x7B93, 0xB982, 0x7B94, 0xB2AD, 0x7B95, 0xBBFE, 0x7B96, 0xB983,\t0x7B97, 0xCBE3, 0x7B98, 0xB984, 0x7B99, 0xB985, 0x7B9A, 0xB986,\n\t0x7B9B, 0xB987, 0x7B9C, 0xF3ED, 0x7B9D, 0xF3E9, 0x7B9E, 0xB988,\t0x7B9F, 0xB989, 0x7BA0, 0xB98A, 0x7BA1, 0xB9DC, 0x7BA2, 0xF3EE,\n\t0x7BA3, 0xB98B, 0x7BA4, 0xB98C, 0x7BA5, 0xB98D, 0x7BA6, 0xF3E5,\t0x7BA7, 0xF3E6, 0x7BA8, 0xF3EA, 0x7BA9, 0xC2E1, 0x7BAA, 0xF3EC,\n\t0x7BAB, 0xF3EF, 0x7BAC, 0xF3E8, 0x7BAD, 0xBCFD, 0x7BAE, 0xB98E,\t0x7BAF, 0xB98F, 0x7BB0, 0xB990, 0x7BB1, 0xCFE4, 0x7BB2, 0xB991,\n\t0x7BB3, 0xB992, 0x7BB4, 0xF3F0, 0x7BB5, 0xB993, 0x7BB6, 0xB994,\t0x7BB7, 0xB995, 0x7BB8, 0xF3E7, 0x7BB9, 0xB996, 0x7BBA, 0xB997,\n\t0x7BBB, 0xB998, 0x7BBC, 0xB999, 0x7BBD, 0xB99A, 0x7BBE, 0xB99B,\t0x7BBF, 0xB99C, 0x7BC0, 0xB99D, 0x7BC1, 0xF3F2, 0x7BC2, 0xB99E,\n\t0x7BC3, 0xB99F, 0x7BC4, 0xB9A0, 0x7BC5, 0xBA40, 0x7BC6, 0xD7AD,\t0x7BC7, 0xC6AA, 0x7BC8, 0xBA41, 0x7BC9, 0xBA42, 0x7BCA, 0xBA43,\n\t0x7BCB, 0xBA44, 0x7BCC, 0xF3F3, 0x7BCD, 0xBA45, 0x7BCE, 0xBA46,\t0x7BCF, 0xBA47, 0x7BD0, 0xBA48, 0x7BD1, 0xF3F1, 0x7BD2, 0xBA49,\n\t0x7BD3, 0xC2A8, 0x7BD4, 0xBA4A, 0x7BD5, 0xBA4B, 0x7BD6, 0xBA4C,\t0x7BD7, 0xBA4D, 0x7BD8, 0xBA4E, 0x7BD9, 0xB8DD, 0x7BDA, 0xF3F5,\n\t0x7BDB, 0xBA4F, 0x7BDC, 0xBA50, 0x7BDD, 0xF3F4, 0x7BDE, 0xBA51,\t0x7BDF, 0xBA52, 0x7BE0, 0xBA53, 0x7BE1, 0xB4DB, 0x7BE2, 0xBA54,\n\t0x7BE3, 0xBA55, 0x7BE4, 0xBA56, 0x7BE5, 0xF3F6, 0x7BE6, 0xF3F7,\t0x7BE7, 0xBA57, 0x7BE8, 0xBA58, 0x7BE9, 0xBA59, 0x7BEA, 0xF3F8,\n\t0x7BEB, 0xBA5A, 0x7BEC, 0xBA5B, 0x7BED, 0xBA5C, 0x7BEE, 0xC0BA,\t0x7BEF, 0xBA5D, 0x7BF0, 0xBA5E, 0x7BF1, 0xC0E9, 0x7BF2, 0xBA5F,\n\t0x7BF3, 0xBA60, 0x7BF4, 0xBA61, 0x7BF5, 0xBA62, 0x7BF6, 0xBA63,\t0x7BF7, 0xC5F1, 0x7BF8, 0xBA64, 0x7BF9, 0xBA65, 0x7BFA, 0xBA66,\n\t0x7BFB, 0xBA67, 0x7BFC, 0xF3FB, 0x7BFD, 0xBA68, 0x7BFE, 0xF3FA,\t0x7BFF, 0xBA69, 0x7C00, 0xBA6A, 0x7C01, 0xBA6B, 0x7C02, 0xBA6C,\n\t0x7C03, 0xBA6D, 0x7C04, 0xBA6E, 0x7C05, 0xBA6F, 0x7C06, 0xBA70,\t0x7C07, 0xB4D8, 0x7C08, 0xBA71, 0x7C09, 0xBA72, 0x7C0A, 0xBA73,\n\t0x7C0B, 0xF3FE, 0x7C0C, 0xF3F9, 0x7C0D, 0xBA74, 0x7C0E, 0xBA75,\t0x7C0F, 0xF3FC, 0x7C10, 0xBA76, 0x7C11, 0xBA77, 0x7C12, 0xBA78,\n\t0x7C13, 0xBA79, 0x7C14, 0xBA7A, 0x7C15, 0xBA7B, 0x7C16, 0xF3FD,\t0x7C17, 0xBA7C, 0x7C18, 0xBA7D, 0x7C19, 0xBA7E, 0x7C1A, 0xBA80,\n\t0x7C1B, 0xBA81, 0x7C1C, 0xBA82, 0x7C1D, 0xBA83, 0x7C1E, 0xBA84,\t0x7C1F, 0xF4A1, 0x7C20, 0xBA85, 0x7C21, 0xBA86, 0x7C22, 0xBA87,\n\t0x7C23, 0xBA88, 0x7C24, 0xBA89, 0x7C25, 0xBA8A, 0x7C26, 0xF4A3,\t0x7C27, 0xBBC9, 0x7C28, 0xBA8B, 0x7C29, 0xBA8C, 0x7C2A, 0xF4A2,\n\t0x7C2B, 0xBA8D, 0x7C2C, 0xBA8E, 0x7C2D, 0xBA8F, 0x7C2E, 0xBA90,\t0x7C2F, 0xBA91, 0x7C30, 0xBA92, 0x7C31, 0xBA93, 0x7C32, 0xBA94,\n\t0x7C33, 0xBA95, 0x7C34, 0xBA96, 0x7C35, 0xBA97, 0x7C36, 0xBA98,\t0x7C37, 0xBA99, 0x7C38, 0xF4A4, 0x7C39, 0xBA9A, 0x7C3A, 0xBA9B,\n\t0x7C3B, 0xBA9C, 0x7C3C, 0xBA9D, 0x7C3D, 0xBA9E, 0x7C3E, 0xBA9F,\t0x7C3F, 0xB2BE, 0x7C40, 0xF4A6, 0x7C41, 0xF4A5, 0x7C42, 0xBAA0,\n\t0x7C43, 0xBB40, 0x7C44, 0xBB41, 0x7C45, 0xBB42, 0x7C46, 0xBB43,\t0x7C47, 0xBB44, 0x7C48, 0xBB45, 0x7C49, 0xBB46, 0x7C4A, 0xBB47,\n\t0x7C4B, 0xBB48, 0x7C4C, 0xBB49, 0x7C4D, 0xBCAE, 0x7C4E, 0xBB4A,\t0x7C4F, 0xBB4B, 0x7C50, 0xBB4C, 0x7C51, 0xBB4D, 0x7C52, 0xBB4E,\n\t0x7C53, 0xBB4F, 0x7C54, 0xBB50, 0x7C55, 0xBB51, 0x7C56, 0xBB52,\t0x7C57, 0xBB53, 0x7C58, 0xBB54, 0x7C59, 0xBB55, 0x7C5A, 0xBB56,\n\t0x7C5B, 0xBB57, 0x7C5C, 0xBB58, 0x7C5D, 0xBB59, 0x7C5E, 0xBB5A,\t0x7C5F, 0xBB5B, 0x7C60, 0xBB5C, 0x7C61, 0xBB5D, 0x7C62, 0xBB5E,\n\t0x7C63, 0xBB5F, 0x7C64, 0xBB60, 0x7C65, 0xBB61, 0x7C66, 0xBB62,\t0x7C67, 0xBB63, 0x7C68, 0xBB64, 0x7C69, 0xBB65, 0x7C6A, 0xBB66,\n\t0x7C6B, 0xBB67, 0x7C6C, 0xBB68, 0x7C6D, 0xBB69, 0x7C6E, 0xBB6A,\t0x7C6F, 0xBB6B, 0x7C70, 0xBB6C, 0x7C71, 0xBB6D, 0x7C72, 0xBB6E,\n\t0x7C73, 0xC3D7, 0x7C74, 0xD9E1, 0x7C75, 0xBB6F, 0x7C76, 0xBB70,\t0x7C77, 0xBB71, 0x7C78, 0xBB72, 0x7C79, 0xBB73, 0x7C7A, 0xBB74,\n\t0x7C7B, 0xC0E0, 0x7C7C, 0xF4CC, 0x7C7D, 0xD7D1, 0x7C7E, 0xBB75,\t0x7C7F, 0xBB76, 0x7C80, 0xBB77, 0x7C81, 0xBB78, 0x7C82, 0xBB79,\n\t0x7C83, 0xBB7A, 0x7C84, 0xBB7B, 0x7C85, 0xBB7C, 0x7C86, 0xBB7D,\t0x7C87, 0xBB7E, 0x7C88, 0xBB80, 0x7C89, 0xB7DB, 0x7C8A, 0xBB81,\n\t0x7C8B, 0xBB82, 0x7C8C, 0xBB83, 0x7C8D, 0xBB84, 0x7C8E, 0xBB85,\t0x7C8F, 0xBB86, 0x7C90, 0xBB87, 0x7C91, 0xF4CE, 0x7C92, 0xC1A3,\n\t0x7C93, 0xBB88, 0x7C94, 0xBB89, 0x7C95, 0xC6C9, 0x7C96, 0xBB8A,\t0x7C97, 0xB4D6, 0x7C98, 0xD5B3, 0x7C99, 0xBB8B, 0x7C9A, 0xBB8C,\n\t0x7C9B, 0xBB8D, 0x7C9C, 0xF4D0, 0x7C9D, 0xF4CF, 0x7C9E, 0xF4D1,\t0x7C9F, 0xCBDA, 0x7CA0, 0xBB8E, 0x7CA1, 0xBB8F, 0x7CA2, 0xF4D2,\n\t0x7CA3, 0xBB90, 0x7CA4, 0xD4C1, 0x7CA5, 0xD6E0, 0x7CA6, 0xBB91,\t0x7CA7, 0xBB92, 0x7CA8, 0xBB93, 0x7CA9, 0xBB94, 0x7CAA, 0xB7E0,\n\t0x7CAB, 0xBB95, 0x7CAC, 0xBB96, 0x7CAD, 0xBB97, 0x7CAE, 0xC1B8,\t0x7CAF, 0xBB98, 0x7CB0, 0xBB99, 0x7CB1, 0xC1BB, 0x7CB2, 0xF4D3,\n\t0x7CB3, 0xBEAC, 0x7CB4, 0xBB9A, 0x7CB5, 0xBB9B, 0x7CB6, 0xBB9C,\t0x7CB7, 0xBB9D, 0x7CB8, 0xBB9E, 0x7CB9, 0xB4E2, 0x7CBA, 0xBB9F,\n\t0x7CBB, 0xBBA0, 0x7CBC, 0xF4D4, 0x7CBD, 0xF4D5, 0x7CBE, 0xBEAB,\t0x7CBF, 0xBC40, 0x7CC0, 0xBC41, 0x7CC1, 0xF4D6, 0x7CC2, 0xBC42,\n\t0x7CC3, 0xBC43, 0x7CC4, 0xBC44, 0x7CC5, 0xF4DB, 0x7CC6, 0xBC45,\t0x7CC7, 0xF4D7, 0x7CC8, 0xF4DA, 0x7CC9, 0xBC46, 0x7CCA, 0xBAFD,\n\t0x7CCB, 0xBC47, 0x7CCC, 0xF4D8, 0x7CCD, 0xF4D9, 0x7CCE, 0xBC48,\t0x7CCF, 0xBC49, 0x7CD0, 0xBC4A, 0x7CD1, 0xBC4B, 0x7CD2, 0xBC4C,\n\t0x7CD3, 0xBC4D, 0x7CD4, 0xBC4E, 0x7CD5, 0xB8E2, 0x7CD6, 0xCCC7,\t0x7CD7, 0xF4DC, 0x7CD8, 0xBC4F, 0x7CD9, 0xB2DA, 0x7CDA, 0xBC50,\n\t0x7CDB, 0xBC51, 0x7CDC, 0xC3D3, 0x7CDD, 0xBC52, 0x7CDE, 0xBC53,\t0x7CDF, 0xD4E3, 0x7CE0, 0xBFB7, 0x7CE1, 0xBC54, 0x7CE2, 0xBC55,\n\t0x7CE3, 0xBC56, 0x7CE4, 0xBC57, 0x7CE5, 0xBC58, 0x7CE6, 0xBC59,\t0x7CE7, 0xBC5A, 0x7CE8, 0xF4DD, 0x7CE9, 0xBC5B, 0x7CEA, 0xBC5C,\n\t0x7CEB, 0xBC5D, 0x7CEC, 0xBC5E, 0x7CED, 0xBC5F, 0x7CEE, 0xBC60,\t0x7CEF, 0xC5B4, 0x7CF0, 0xBC61, 0x7CF1, 0xBC62, 0x7CF2, 0xBC63,\n\t0x7CF3, 0xBC64, 0x7CF4, 0xBC65, 0x7CF5, 0xBC66, 0x7CF6, 0xBC67,\t0x7CF7, 0xBC68, 0x7CF8, 0xF4E9, 0x7CF9, 0xBC69, 0x7CFA, 0xBC6A,\n\t0x7CFB, 0xCFB5, 0x7CFC, 0xBC6B, 0x7CFD, 0xBC6C, 0x7CFE, 0xBC6D,\t0x7CFF, 0xBC6E, 0x7D00, 0xBC6F, 0x7D01, 0xBC70, 0x7D02, 0xBC71,\n\t0x7D03, 0xBC72, 0x7D04, 0xBC73, 0x7D05, 0xBC74, 0x7D06, 0xBC75,\t0x7D07, 0xBC76, 0x7D08, 0xBC77, 0x7D09, 0xBC78, 0x7D0A, 0xCEC9,\n\t0x7D0B, 0xBC79, 0x7D0C, 0xBC7A, 0x7D0D, 0xBC7B, 0x7D0E, 0xBC7C,\t0x7D0F, 0xBC7D, 0x7D10, 0xBC7E, 0x7D11, 0xBC80, 0x7D12, 0xBC81,\n\t0x7D13, 0xBC82, 0x7D14, 0xBC83, 0x7D15, 0xBC84, 0x7D16, 0xBC85,\t0x7D17, 0xBC86, 0x7D18, 0xBC87, 0x7D19, 0xBC88, 0x7D1A, 0xBC89,\n\t0x7D1B, 0xBC8A, 0x7D1C, 0xBC8B, 0x7D1D, 0xBC8C, 0x7D1E, 0xBC8D,\t0x7D1F, 0xBC8E, 0x7D20, 0xCBD8, 0x7D21, 0xBC8F, 0x7D22, 0xCBF7,\n\t0x7D23, 0xBC90, 0x7D24, 0xBC91, 0x7D25, 0xBC92, 0x7D26, 0xBC93,\t0x7D27, 0xBDF4, 0x7D28, 0xBC94, 0x7D29, 0xBC95, 0x7D2A, 0xBC96,\n\t0x7D2B, 0xD7CF, 0x7D2C, 0xBC97, 0x7D2D, 0xBC98, 0x7D2E, 0xBC99,\t0x7D2F, 0xC0DB, 0x7D30, 0xBC9A, 0x7D31, 0xBC9B, 0x7D32, 0xBC9C,\n\t0x7D33, 0xBC9D, 0x7D34, 0xBC9E, 0x7D35, 0xBC9F, 0x7D36, 0xBCA0,\t0x7D37, 0xBD40, 0x7D38, 0xBD41, 0x7D39, 0xBD42, 0x7D3A, 0xBD43,\n\t0x7D3B, 0xBD44, 0x7D3C, 0xBD45, 0x7D3D, 0xBD46, 0x7D3E, 0xBD47,\t0x7D3F, 0xBD48, 0x7D40, 0xBD49, 0x7D41, 0xBD4A, 0x7D42, 0xBD4B,\n\t0x7D43, 0xBD4C, 0x7D44, 0xBD4D, 0x7D45, 0xBD4E, 0x7D46, 0xBD4F,\t0x7D47, 0xBD50, 0x7D48, 0xBD51, 0x7D49, 0xBD52, 0x7D4A, 0xBD53,\n\t0x7D4B, 0xBD54, 0x7D4C, 0xBD55, 0x7D4D, 0xBD56, 0x7D4E, 0xBD57,\t0x7D4F, 0xBD58, 0x7D50, 0xBD59, 0x7D51, 0xBD5A, 0x7D52, 0xBD5B,\n\t0x7D53, 0xBD5C, 0x7D54, 0xBD5D, 0x7D55, 0xBD5E, 0x7D56, 0xBD5F,\t0x7D57, 0xBD60, 0x7D58, 0xBD61, 0x7D59, 0xBD62, 0x7D5A, 0xBD63,\n\t0x7D5B, 0xBD64, 0x7D5C, 0xBD65, 0x7D5D, 0xBD66, 0x7D5E, 0xBD67,\t0x7D5F, 0xBD68, 0x7D60, 0xBD69, 0x7D61, 0xBD6A, 0x7D62, 0xBD6B,\n\t0x7D63, 0xBD6C, 0x7D64, 0xBD6D, 0x7D65, 0xBD6E, 0x7D66, 0xBD6F,\t0x7D67, 0xBD70, 0x7D68, 0xBD71, 0x7D69, 0xBD72, 0x7D6A, 0xBD73,\n\t0x7D6B, 0xBD74, 0x7D6C, 0xBD75, 0x7D6D, 0xBD76, 0x7D6E, 0xD0F5,\t0x7D6F, 0xBD77, 0x7D70, 0xBD78, 0x7D71, 0xBD79, 0x7D72, 0xBD7A,\n\t0x7D73, 0xBD7B, 0x7D74, 0xBD7C, 0x7D75, 0xBD7D, 0x7D76, 0xBD7E,\t0x7D77, 0xF4EA, 0x7D78, 0xBD80, 0x7D79, 0xBD81, 0x7D7A, 0xBD82,\n\t0x7D7B, 0xBD83, 0x7D7C, 0xBD84, 0x7D7D, 0xBD85, 0x7D7E, 0xBD86,\t0x7D7F, 0xBD87, 0x7D80, 0xBD88, 0x7D81, 0xBD89, 0x7D82, 0xBD8A,\n\t0x7D83, 0xBD8B, 0x7D84, 0xBD8C, 0x7D85, 0xBD8D, 0x7D86, 0xBD8E,\t0x7D87, 0xBD8F, 0x7D88, 0xBD90, 0x7D89, 0xBD91, 0x7D8A, 0xBD92,\n\t0x7D8B, 0xBD93, 0x7D8C, 0xBD94, 0x7D8D, 0xBD95, 0x7D8E, 0xBD96,\t0x7D8F, 0xBD97, 0x7D90, 0xBD98, 0x7D91, 0xBD99, 0x7D92, 0xBD9A,\n\t0x7D93, 0xBD9B, 0x7D94, 0xBD9C, 0x7D95, 0xBD9D, 0x7D96, 0xBD9E,\t0x7D97, 0xBD9F, 0x7D98, 0xBDA0, 0x7D99, 0xBE40, 0x7D9A, 0xBE41,\n\t0x7D9B, 0xBE42, 0x7D9C, 0xBE43, 0x7D9D, 0xBE44, 0x7D9E, 0xBE45,\t0x7D9F, 0xBE46, 0x7DA0, 0xBE47, 0x7DA1, 0xBE48, 0x7DA2, 0xBE49,\n\t0x7DA3, 0xBE4A, 0x7DA4, 0xBE4B, 0x7DA5, 0xBE4C, 0x7DA6, 0xF4EB,\t0x7DA7, 0xBE4D, 0x7DA8, 0xBE4E, 0x7DA9, 0xBE4F, 0x7DAA, 0xBE50,\n\t0x7DAB, 0xBE51, 0x7DAC, 0xBE52, 0x7DAD, 0xBE53, 0x7DAE, 0xF4EC,\t0x7DAF, 0xBE54, 0x7DB0, 0xBE55, 0x7DB1, 0xBE56, 0x7DB2, 0xBE57,\n\t0x7DB3, 0xBE58, 0x7DB4, 0xBE59, 0x7DB5, 0xBE5A, 0x7DB6, 0xBE5B,\t0x7DB7, 0xBE5C, 0x7DB8, 0xBE5D, 0x7DB9, 0xBE5E, 0x7DBA, 0xBE5F,\n\t0x7DBB, 0xBE60, 0x7DBC, 0xBE61, 0x7DBD, 0xBE62, 0x7DBE, 0xBE63,\t0x7DBF, 0xBE64, 0x7DC0, 0xBE65, 0x7DC1, 0xBE66, 0x7DC2, 0xBE67,\n\t0x7DC3, 0xBE68, 0x7DC4, 0xBE69, 0x7DC5, 0xBE6A, 0x7DC6, 0xBE6B,\t0x7DC7, 0xBE6C, 0x7DC8, 0xBE6D, 0x7DC9, 0xBE6E, 0x7DCA, 0xBE6F,\n\t0x7DCB, 0xBE70, 0x7DCC, 0xBE71, 0x7DCD, 0xBE72, 0x7DCE, 0xBE73,\t0x7DCF, 0xBE74, 0x7DD0, 0xBE75, 0x7DD1, 0xBE76, 0x7DD2, 0xBE77,\n\t0x7DD3, 0xBE78, 0x7DD4, 0xBE79, 0x7DD5, 0xBE7A, 0x7DD6, 0xBE7B,\t0x7DD7, 0xBE7C, 0x7DD8, 0xBE7D, 0x7DD9, 0xBE7E, 0x7DDA, 0xBE80,\n\t0x7DDB, 0xBE81, 0x7DDC, 0xBE82, 0x7DDD, 0xBE83, 0x7DDE, 0xBE84,\t0x7DDF, 0xBE85, 0x7DE0, 0xBE86, 0x7DE1, 0xBE87, 0x7DE2, 0xBE88,\n\t0x7DE3, 0xBE89, 0x7DE4, 0xBE8A, 0x7DE5, 0xBE8B, 0x7DE6, 0xBE8C,\t0x7DE7, 0xBE8D, 0x7DE8, 0xBE8E, 0x7DE9, 0xBE8F, 0x7DEA, 0xBE90,\n\t0x7DEB, 0xBE91, 0x7DEC, 0xBE92, 0x7DED, 0xBE93, 0x7DEE, 0xBE94,\t0x7DEF, 0xBE95, 0x7DF0, 0xBE96, 0x7DF1, 0xBE97, 0x7DF2, 0xBE98,\n\t0x7DF3, 0xBE99, 0x7DF4, 0xBE9A, 0x7DF5, 0xBE9B, 0x7DF6, 0xBE9C,\t0x7DF7, 0xBE9D, 0x7DF8, 0xBE9E, 0x7DF9, 0xBE9F, 0x7DFA, 0xBEA0,\n\t0x7DFB, 0xBF40, 0x7DFC, 0xBF41, 0x7DFD, 0xBF42, 0x7DFE, 0xBF43,\t0x7DFF, 0xBF44, 0x7E00, 0xBF45, 0x7E01, 0xBF46, 0x7E02, 0xBF47,\n\t0x7E03, 0xBF48, 0x7E04, 0xBF49, 0x7E05, 0xBF4A, 0x7E06, 0xBF4B,\t0x7E07, 0xBF4C, 0x7E08, 0xBF4D, 0x7E09, 0xBF4E, 0x7E0A, 0xBF4F,\n\t0x7E0B, 0xBF50, 0x7E0C, 0xBF51, 0x7E0D, 0xBF52, 0x7E0E, 0xBF53,\t0x7E0F, 0xBF54, 0x7E10, 0xBF55, 0x7E11, 0xBF56, 0x7E12, 0xBF57,\n\t0x7E13, 0xBF58, 0x7E14, 0xBF59, 0x7E15, 0xBF5A, 0x7E16, 0xBF5B,\t0x7E17, 0xBF5C, 0x7E18, 0xBF5D, 0x7E19, 0xBF5E, 0x7E1A, 0xBF5F,\n\t0x7E1B, 0xBF60, 0x7E1C, 0xBF61, 0x7E1D, 0xBF62, 0x7E1E, 0xBF63,\t0x7E1F, 0xBF64, 0x7E20, 0xBF65, 0x7E21, 0xBF66, 0x7E22, 0xBF67,\n\t0x7E23, 0xBF68, 0x7E24, 0xBF69, 0x7E25, 0xBF6A, 0x7E26, 0xBF6B,\t0x7E27, 0xBF6C, 0x7E28, 0xBF6D, 0x7E29, 0xBF6E, 0x7E2A, 0xBF6F,\n\t0x7E2B, 0xBF70, 0x7E2C, 0xBF71, 0x7E2D, 0xBF72, 0x7E2E, 0xBF73,\t0x7E2F, 0xBF74, 0x7E30, 0xBF75, 0x7E31, 0xBF76, 0x7E32, 0xBF77,\n\t0x7E33, 0xBF78, 0x7E34, 0xBF79, 0x7E35, 0xBF7A, 0x7E36, 0xBF7B,\t0x7E37, 0xBF7C, 0x7E38, 0xBF7D, 0x7E39, 0xBF7E, 0x7E3A, 0xBF80,\n\t0x7E3B, 0xF7E3, 0x7E3C, 0xBF81, 0x7E3D, 0xBF82, 0x7E3E, 0xBF83,\t0x7E3F, 0xBF84, 0x7E40, 0xBF85, 0x7E41, 0xB7B1, 0x7E42, 0xBF86,\n\t0x7E43, 0xBF87, 0x7E44, 0xBF88, 0x7E45, 0xBF89, 0x7E46, 0xBF8A,\t0x7E47, 0xF4ED, 0x7E48, 0xBF8B, 0x7E49, 0xBF8C, 0x7E4A, 0xBF8D,\n\t0x7E4B, 0xBF8E, 0x7E4C, 0xBF8F, 0x7E4D, 0xBF90, 0x7E4E, 0xBF91,\t0x7E4F, 0xBF92, 0x7E50, 0xBF93, 0x7E51, 0xBF94, 0x7E52, 0xBF95,\n\t0x7E53, 0xBF96, 0x7E54, 0xBF97, 0x7E55, 0xBF98, 0x7E56, 0xBF99,\t0x7E57, 0xBF9A, 0x7E58, 0xBF9B, 0x7E59, 0xBF9C, 0x7E5A, 0xBF9D,\n\t0x7E5B, 0xBF9E, 0x7E5C, 0xBF9F, 0x7E5D, 0xBFA0, 0x7E5E, 0xC040,\t0x7E5F, 0xC041, 0x7E60, 0xC042, 0x7E61, 0xC043, 0x7E62, 0xC044,\n\t0x7E63, 0xC045, 0x7E64, 0xC046, 0x7E65, 0xC047, 0x7E66, 0xC048,\t0x7E67, 0xC049, 0x7E68, 0xC04A, 0x7E69, 0xC04B, 0x7E6A, 0xC04C,\n\t0x7E6B, 0xC04D, 0x7E6C, 0xC04E, 0x7E6D, 0xC04F, 0x7E6E, 0xC050,\t0x7E6F, 0xC051, 0x7E70, 0xC052, 0x7E71, 0xC053, 0x7E72, 0xC054,\n\t0x7E73, 0xC055, 0x7E74, 0xC056, 0x7E75, 0xC057, 0x7E76, 0xC058,\t0x7E77, 0xC059, 0x7E78, 0xC05A, 0x7E79, 0xC05B, 0x7E7A, 0xC05C,\n\t0x7E7B, 0xC05D, 0x7E7C, 0xC05E, 0x7E7D, 0xC05F, 0x7E7E, 0xC060,\t0x7E7F, 0xC061, 0x7E80, 0xC062, 0x7E81, 0xC063, 0x7E82, 0xD7EB,\n\t0x7E83, 0xC064, 0x7E84, 0xC065, 0x7E85, 0xC066, 0x7E86, 0xC067,\t0x7E87, 0xC068, 0x7E88, 0xC069, 0x7E89, 0xC06A, 0x7E8A, 0xC06B,\n\t0x7E8B, 0xC06C, 0x7E8C, 0xC06D, 0x7E8D, 0xC06E, 0x7E8E, 0xC06F,\t0x7E8F, 0xC070, 0x7E90, 0xC071, 0x7E91, 0xC072, 0x7E92, 0xC073,\n\t0x7E93, 0xC074, 0x7E94, 0xC075, 0x7E95, 0xC076, 0x7E96, 0xC077,\t0x7E97, 0xC078, 0x7E98, 0xC079, 0x7E99, 0xC07A, 0x7E9A, 0xC07B,\n\t0x7E9B, 0xF4EE, 0x7E9C, 0xC07C, 0x7E9D, 0xC07D, 0x7E9E, 0xC07E,\t0x7E9F, 0xE6F9, 0x7EA0, 0xBEC0, 0x7EA1, 0xE6FA, 0x7EA2, 0xBAEC,\n\t0x7EA3, 0xE6FB, 0x7EA4, 0xCFCB, 0x7EA5, 0xE6FC, 0x7EA6, 0xD4BC,\t0x7EA7, 0xBCB6, 0x7EA8, 0xE6FD, 0x7EA9, 0xE6FE, 0x7EAA, 0xBCCD,\n\t0x7EAB, 0xC8D2, 0x7EAC, 0xCEB3, 0x7EAD, 0xE7A1, 0x7EAE, 0xC080,\t0x7EAF, 0xB4BF, 0x7EB0, 0xE7A2, 0x7EB1, 0xC9B4, 0x7EB2, 0xB8D9,\n\t0x7EB3, 0xC4C9, 0x7EB4, 0xC081, 0x7EB5, 0xD7DD, 0x7EB6, 0xC2DA,\t0x7EB7, 0xB7D7, 0x7EB8, 0xD6BD, 0x7EB9, 0xCEC6, 0x7EBA, 0xB7C4,\n\t0x7EBB, 0xC082, 0x7EBC, 0xC083, 0x7EBD, 0xC5A6, 0x7EBE, 0xE7A3,\t0x7EBF, 0xCFDF, 0x7EC0, 0xE7A4, 0x7EC1, 0xE7A5, 0x7EC2, 0xE7A6,\n\t0x7EC3, 0xC1B7, 0x7EC4, 0xD7E9, 0x7EC5, 0xC9F0, 0x7EC6, 0xCFB8,\t0x7EC7, 0xD6AF, 0x7EC8, 0xD6D5, 0x7EC9, 0xE7A7, 0x7ECA, 0xB0ED,\n\t0x7ECB, 0xE7A8, 0x7ECC, 0xE7A9, 0x7ECD, 0xC9DC, 0x7ECE, 0xD2EF,\t0x7ECF, 0xBEAD, 0x7ED0, 0xE7AA, 0x7ED1, 0xB0F3, 0x7ED2, 0xC8DE,\n\t0x7ED3, 0xBDE1, 0x7ED4, 0xE7AB, 0x7ED5, 0xC8C6, 0x7ED6, 0xC084,\t0x7ED7, 0xE7AC, 0x7ED8, 0xBBE6, 0x7ED9, 0xB8F8, 0x7EDA, 0xD1A4,\n\t0x7EDB, 0xE7AD, 0x7EDC, 0xC2E7, 0x7EDD, 0xBEF8, 0x7EDE, 0xBDCA,\t0x7EDF, 0xCDB3, 0x7EE0, 0xE7AE, 0x7EE1, 0xE7AF, 0x7EE2, 0xBEEE,\n\t0x7EE3, 0xD0E5, 0x7EE4, 0xC085, 0x7EE5, 0xCBE7, 0x7EE6, 0xCCD0,\t0x7EE7, 0xBCCC, 0x7EE8, 0xE7B0, 0x7EE9, 0xBCA8, 0x7EEA, 0xD0F7,\n\t0x7EEB, 0xE7B1, 0x7EEC, 0xC086, 0x7EED, 0xD0F8, 0x7EEE, 0xE7B2,\t0x7EEF, 0xE7B3, 0x7EF0, 0xB4C2, 0x7EF1, 0xE7B4, 0x7EF2, 0xE7B5,\n\t0x7EF3, 0xC9FE, 0x7EF4, 0xCEAC, 0x7EF5, 0xC3E0, 0x7EF6, 0xE7B7,\t0x7EF7, 0xB1C1, 0x7EF8, 0xB3F1, 0x7EF9, 0xC087, 0x7EFA, 0xE7B8,\n\t0x7EFB, 0xE7B9, 0x7EFC, 0xD7DB, 0x7EFD, 0xD5C0, 0x7EFE, 0xE7BA,\t0x7EFF, 0xC2CC, 0x7F00, 0xD7BA, 0x7F01, 0xE7BB, 0x7F02, 0xE7BC,\n\t0x7F03, 0xE7BD, 0x7F04, 0xBCEA, 0x7F05, 0xC3E5, 0x7F06, 0xC0C2,\t0x7F07, 0xE7BE, 0x7F08, 0xE7BF, 0x7F09, 0xBCA9, 0x7F0A, 0xC088,\n\t0x7F0B, 0xE7C0, 0x7F0C, 0xE7C1, 0x7F0D, 0xE7B6, 0x7F0E, 0xB6D0,\t0x7F0F, 0xE7C2, 0x7F10, 0xC089, 0x7F11, 0xE7C3, 0x7F12, 0xE7C4,\n\t0x7F13, 0xBBBA, 0x7F14, 0xB5DE, 0x7F15, 0xC2C6, 0x7F16, 0xB1E0,\t0x7F17, 0xE7C5, 0x7F18, 0xD4B5, 0x7F19, 0xE7C6, 0x7F1A, 0xB8BF,\n\t0x7F1B, 0xE7C8, 0x7F1C, 0xE7C7, 0x7F1D, 0xB7EC, 0x7F1E, 0xC08A,\t0x7F1F, 0xE7C9, 0x7F20, 0xB2F8, 0x7F21, 0xE7CA, 0x7F22, 0xE7CB,\n\t0x7F23, 0xE7CC, 0x7F24, 0xE7CD, 0x7F25, 0xE7CE, 0x7F26, 0xE7CF,\t0x7F27, 0xE7D0, 0x7F28, 0xD3A7, 0x7F29, 0xCBF5, 0x7F2A, 0xE7D1,\n\t0x7F2B, 0xE7D2, 0x7F2C, 0xE7D3, 0x7F2D, 0xE7D4, 0x7F2E, 0xC9C9,\t0x7F2F, 0xE7D5, 0x7F30, 0xE7D6, 0x7F31, 0xE7D7, 0x7F32, 0xE7D8,\n\t0x7F33, 0xE7D9, 0x7F34, 0xBDC9, 0x7F35, 0xE7DA, 0x7F36, 0xF3BE,\t0x7F37, 0xC08B, 0x7F38, 0xB8D7, 0x7F39, 0xC08C, 0x7F3A, 0xC8B1,\n\t0x7F3B, 0xC08D, 0x7F3C, 0xC08E, 0x7F3D, 0xC08F, 0x7F3E, 0xC090,\t0x7F3F, 0xC091, 0x7F40, 0xC092, 0x7F41, 0xC093, 0x7F42, 0xF3BF,\n\t0x7F43, 0xC094, 0x7F44, 0xF3C0, 0x7F45, 0xF3C1, 0x7F46, 0xC095,\t0x7F47, 0xC096, 0x7F48, 0xC097, 0x7F49, 0xC098, 0x7F4A, 0xC099,\n\t0x7F4B, 0xC09A, 0x7F4C, 0xC09B, 0x7F4D, 0xC09C, 0x7F4E, 0xC09D,\t0x7F4F, 0xC09E, 0x7F50, 0xB9DE, 0x7F51, 0xCDF8, 0x7F52, 0xC09F,\n\t0x7F53, 0xC0A0, 0x7F54, 0xD8E8, 0x7F55, 0xBAB1, 0x7F56, 0xC140,\t0x7F57, 0xC2DE, 0x7F58, 0xEEB7, 0x7F59, 0xC141, 0x7F5A, 0xB7A3,\n\t0x7F5B, 0xC142, 0x7F5C, 0xC143, 0x7F5D, 0xC144, 0x7F5E, 0xC145,\t0x7F5F, 0xEEB9, 0x7F60, 0xC146, 0x7F61, 0xEEB8, 0x7F62, 0xB0D5,\n\t0x7F63, 0xC147, 0x7F64, 0xC148, 0x7F65, 0xC149, 0x7F66, 0xC14A,\t0x7F67, 0xC14B, 0x7F68, 0xEEBB, 0x7F69, 0xD5D6, 0x7F6A, 0xD7EF,\n\t0x7F6B, 0xC14C, 0x7F6C, 0xC14D, 0x7F6D, 0xC14E, 0x7F6E, 0xD6C3,\t0x7F6F, 0xC14F, 0x7F70, 0xC150, 0x7F71, 0xEEBD, 0x7F72, 0xCAF0,\n\t0x7F73, 0xC151, 0x7F74, 0xEEBC, 0x7F75, 0xC152, 0x7F76, 0xC153,\t0x7F77, 0xC154, 0x7F78, 0xC155, 0x7F79, 0xEEBE, 0x7F7A, 0xC156,\n\t0x7F7B, 0xC157, 0x7F7C, 0xC158, 0x7F7D, 0xC159, 0x7F7E, 0xEEC0,\t0x7F7F, 0xC15A, 0x7F80, 0xC15B, 0x7F81, 0xEEBF, 0x7F82, 0xC15C,\n\t0x7F83, 0xC15D, 0x7F84, 0xC15E, 0x7F85, 0xC15F, 0x7F86, 0xC160,\t0x7F87, 0xC161, 0x7F88, 0xC162, 0x7F89, 0xC163, 0x7F8A, 0xD1F2,\n\t0x7F8B, 0xC164, 0x7F8C, 0xC7BC, 0x7F8D, 0xC165, 0x7F8E, 0xC3C0,\t0x7F8F, 0xC166, 0x7F90, 0xC167, 0x7F91, 0xC168, 0x7F92, 0xC169,\n\t0x7F93, 0xC16A, 0x7F94, 0xB8E1, 0x7F95, 0xC16B, 0x7F96, 0xC16C,\t0x7F97, 0xC16D, 0x7F98, 0xC16E, 0x7F99, 0xC16F, 0x7F9A, 0xC1E7,\n\t0x7F9B, 0xC170, 0x7F9C, 0xC171, 0x7F9D, 0xF4C6, 0x7F9E, 0xD0DF,\t0x7F9F, 0xF4C7, 0x7FA0, 0xC172, 0x7FA1, 0xCFDB, 0x7FA2, 0xC173,\n\t0x7FA3, 0xC174, 0x7FA4, 0xC8BA, 0x7FA5, 0xC175, 0x7FA6, 0xC176,\t0x7FA7, 0xF4C8, 0x7FA8, 0xC177, 0x7FA9, 0xC178, 0x7FAA, 0xC179,\n\t0x7FAB, 0xC17A, 0x7FAC, 0xC17B, 0x7FAD, 0xC17C, 0x7FAE, 0xC17D,\t0x7FAF, 0xF4C9, 0x7FB0, 0xF4CA, 0x7FB1, 0xC17E, 0x7FB2, 0xF4CB,\n\t0x7FB3, 0xC180, 0x7FB4, 0xC181, 0x7FB5, 0xC182, 0x7FB6, 0xC183,\t0x7FB7, 0xC184, 0x7FB8, 0xD9FA, 0x7FB9, 0xB8FE, 0x7FBA, 0xC185,\n\t0x7FBB, 0xC186, 0x7FBC, 0xE5F1, 0x7FBD, 0xD3F0, 0x7FBE, 0xC187,\t0x7FBF, 0xF4E0, 0x7FC0, 0xC188, 0x7FC1, 0xCECC, 0x7FC2, 0xC189,\n\t0x7FC3, 0xC18A, 0x7FC4, 0xC18B, 0x7FC5, 0xB3E1, 0x7FC6, 0xC18C,\t0x7FC7, 0xC18D, 0x7FC8, 0xC18E, 0x7FC9, 0xC18F, 0x7FCA, 0xF1B4,\n\t0x7FCB, 0xC190, 0x7FCC, 0xD2EE, 0x7FCD, 0xC191, 0x7FCE, 0xF4E1,\t0x7FCF, 0xC192, 0x7FD0, 0xC193, 0x7FD1, 0xC194, 0x7FD2, 0xC195,\n\t0x7FD3, 0xC196, 0x7FD4, 0xCFE8, 0x7FD5, 0xF4E2, 0x7FD6, 0xC197,\t0x7FD7, 0xC198, 0x7FD8, 0xC7CC, 0x7FD9, 0xC199, 0x7FDA, 0xC19A,\n\t0x7FDB, 0xC19B, 0x7FDC, 0xC19C, 0x7FDD, 0xC19D, 0x7FDE, 0xC19E,\t0x7FDF, 0xB5D4, 0x7FE0, 0xB4E4, 0x7FE1, 0xF4E4, 0x7FE2, 0xC19F,\n\t0x7FE3, 0xC1A0, 0x7FE4, 0xC240, 0x7FE5, 0xF4E3, 0x7FE6, 0xF4E5,\t0x7FE7, 0xC241, 0x7FE8, 0xC242, 0x7FE9, 0xF4E6, 0x7FEA, 0xC243,\n\t0x7FEB, 0xC244, 0x7FEC, 0xC245, 0x7FED, 0xC246, 0x7FEE, 0xF4E7,\t0x7FEF, 0xC247, 0x7FF0, 0xBAB2, 0x7FF1, 0xB0BF, 0x7FF2, 0xC248,\n\t0x7FF3, 0xF4E8, 0x7FF4, 0xC249, 0x7FF5, 0xC24A, 0x7FF6, 0xC24B,\t0x7FF7, 0xC24C, 0x7FF8, 0xC24D, 0x7FF9, 0xC24E, 0x7FFA, 0xC24F,\n\t0x7FFB, 0xB7AD, 0x7FFC, 0xD2ED, 0x7FFD, 0xC250, 0x7FFE, 0xC251,\t0x7FFF, 0xC252, 0x8000, 0xD2AB, 0x8001, 0xC0CF, 0x8002, 0xC253,\n\t0x8003, 0xBFBC, 0x8004, 0xEBA3, 0x8005, 0xD5DF, 0x8006, 0xEAC8,\t0x8007, 0xC254, 0x8008, 0xC255, 0x8009, 0xC256, 0x800A, 0xC257,\n\t0x800B, 0xF1F3, 0x800C, 0xB6F8, 0x800D, 0xCBA3, 0x800E, 0xC258,\t0x800F, 0xC259, 0x8010, 0xC4CD, 0x8011, 0xC25A, 0x8012, 0xF1E7,\n\t0x8013, 0xC25B, 0x8014, 0xF1E8, 0x8015, 0xB8FB, 0x8016, 0xF1E9,\t0x8017, 0xBAC4, 0x8018, 0xD4C5, 0x8019, 0xB0D2, 0x801A, 0xC25C,\n\t0x801B, 0xC25D, 0x801C, 0xF1EA, 0x801D, 0xC25E, 0x801E, 0xC25F,\t0x801F, 0xC260, 0x8020, 0xF1EB, 0x8021, 0xC261, 0x8022, 0xF1EC,\n\t0x8023, 0xC262, 0x8024, 0xC263, 0x8025, 0xF1ED, 0x8026, 0xF1EE,\t0x8027, 0xF1EF, 0x8028, 0xF1F1, 0x8029, 0xF1F0, 0x802A, 0xC5D5,\n\t0x802B, 0xC264, 0x802C, 0xC265, 0x802D, 0xC266, 0x802E, 0xC267,\t0x802F, 0xC268, 0x8030, 0xC269, 0x8031, 0xF1F2, 0x8032, 0xC26A,\n\t0x8033, 0xB6FA, 0x8034, 0xC26B, 0x8035, 0xF1F4, 0x8036, 0xD2AE,\t0x8037, 0xDEC7, 0x8038, 0xCBCA, 0x8039, 0xC26C, 0x803A, 0xC26D,\n\t0x803B, 0xB3DC, 0x803C, 0xC26E, 0x803D, 0xB5A2, 0x803E, 0xC26F,\t0x803F, 0xB9A2, 0x8040, 0xC270, 0x8041, 0xC271, 0x8042, 0xC4F4,\n\t0x8043, 0xF1F5, 0x8044, 0xC272, 0x8045, 0xC273, 0x8046, 0xF1F6,\t0x8047, 0xC274, 0x8048, 0xC275, 0x8049, 0xC276, 0x804A, 0xC1C4,\n\t0x804B, 0xC1FB, 0x804C, 0xD6B0, 0x804D, 0xF1F7, 0x804E, 0xC277,\t0x804F, 0xC278, 0x8050, 0xC279, 0x8051, 0xC27A, 0x8052, 0xF1F8,\n\t0x8053, 0xC27B, 0x8054, 0xC1AA, 0x8055, 0xC27C, 0x8056, 0xC27D,\t0x8057, 0xC27E, 0x8058, 0xC6B8, 0x8059, 0xC280, 0x805A, 0xBEDB,\n\t0x805B, 0xC281, 0x805C, 0xC282, 0x805D, 0xC283, 0x805E, 0xC284,\t0x805F, 0xC285, 0x8060, 0xC286, 0x8061, 0xC287, 0x8062, 0xC288,\n\t0x8063, 0xC289, 0x8064, 0xC28A, 0x8065, 0xC28B, 0x8066, 0xC28C,\t0x8067, 0xC28D, 0x8068, 0xC28E, 0x8069, 0xF1F9, 0x806A, 0xB4CF,\n\t0x806B, 0xC28F, 0x806C, 0xC290, 0x806D, 0xC291, 0x806E, 0xC292,\t0x806F, 0xC293, 0x8070, 0xC294, 0x8071, 0xF1FA, 0x8072, 0xC295,\n\t0x8073, 0xC296, 0x8074, 0xC297, 0x8075, 0xC298, 0x8076, 0xC299,\t0x8077, 0xC29A, 0x8078, 0xC29B, 0x8079, 0xC29C, 0x807A, 0xC29D,\n\t0x807B, 0xC29E, 0x807C, 0xC29F, 0x807D, 0xC2A0, 0x807E, 0xC340,\t0x807F, 0xEDB2, 0x8080, 0xEDB1, 0x8081, 0xC341, 0x8082, 0xC342,\n\t0x8083, 0xCBE0, 0x8084, 0xD2DE, 0x8085, 0xC343, 0x8086, 0xCBC1,\t0x8087, 0xD5D8, 0x8088, 0xC344, 0x8089, 0xC8E2, 0x808A, 0xC345,\n\t0x808B, 0xC0DF, 0x808C, 0xBCA1, 0x808D, 0xC346, 0x808E, 0xC347,\t0x808F, 0xC348, 0x8090, 0xC349, 0x8091, 0xC34A, 0x8092, 0xC34B,\n\t0x8093, 0xEBC1, 0x8094, 0xC34C, 0x8095, 0xC34D, 0x8096, 0xD0A4,\t0x8097, 0xC34E, 0x8098, 0xD6E2, 0x8099, 0xC34F, 0x809A, 0xB6C7,\n\t0x809B, 0xB8D8, 0x809C, 0xEBC0, 0x809D, 0xB8CE, 0x809E, 0xC350,\t0x809F, 0xEBBF, 0x80A0, 0xB3A6, 0x80A1, 0xB9C9, 0x80A2, 0xD6AB,\n\t0x80A3, 0xC351, 0x80A4, 0xB7F4, 0x80A5, 0xB7CA, 0x80A6, 0xC352,\t0x80A7, 0xC353, 0x80A8, 0xC354, 0x80A9, 0xBCE7, 0x80AA, 0xB7BE,\n\t0x80AB, 0xEBC6, 0x80AC, 0xC355, 0x80AD, 0xEBC7, 0x80AE, 0xB0B9,\t0x80AF, 0xBFCF, 0x80B0, 0xC356, 0x80B1, 0xEBC5, 0x80B2, 0xD3FD,\n\t0x80B3, 0xC357, 0x80B4, 0xEBC8, 0x80B5, 0xC358, 0x80B6, 0xC359,\t0x80B7, 0xEBC9, 0x80B8, 0xC35A, 0x80B9, 0xC35B, 0x80BA, 0xB7CE,\n\t0x80BB, 0xC35C, 0x80BC, 0xEBC2, 0x80BD, 0xEBC4, 0x80BE, 0xC9F6,\t0x80BF, 0xD6D7, 0x80C0, 0xD5CD, 0x80C1, 0xD0B2, 0x80C2, 0xEBCF,\n\t0x80C3, 0xCEB8, 0x80C4, 0xEBD0, 0x80C5, 0xC35D, 0x80C6, 0xB5A8,\t0x80C7, 0xC35E, 0x80C8, 0xC35F, 0x80C9, 0xC360, 0x80CA, 0xC361,\n\t0x80CB, 0xC362, 0x80CC, 0xB1B3, 0x80CD, 0xEBD2, 0x80CE, 0xCCA5,\t0x80CF, 0xC363, 0x80D0, 0xC364, 0x80D1, 0xC365, 0x80D2, 0xC366,\n\t0x80D3, 0xC367, 0x80D4, 0xC368, 0x80D5, 0xC369, 0x80D6, 0xC5D6,\t0x80D7, 0xEBD3, 0x80D8, 0xC36A, 0x80D9, 0xEBD1, 0x80DA, 0xC5DF,\n\t0x80DB, 0xEBCE, 0x80DC, 0xCAA4, 0x80DD, 0xEBD5, 0x80DE, 0xB0FB,\t0x80DF, 0xC36B, 0x80E0, 0xC36C, 0x80E1, 0xBAFA, 0x80E2, 0xC36D,\n\t0x80E3, 0xC36E, 0x80E4, 0xD8B7, 0x80E5, 0xF1E3, 0x80E6, 0xC36F,\t0x80E7, 0xEBCA, 0x80E8, 0xEBCB, 0x80E9, 0xEBCC, 0x80EA, 0xEBCD,\n\t0x80EB, 0xEBD6, 0x80EC, 0xE6C0, 0x80ED, 0xEBD9, 0x80EE, 0xC370,\t0x80EF, 0xBFE8, 0x80F0, 0xD2C8, 0x80F1, 0xEBD7, 0x80F2, 0xEBDC,\n\t0x80F3, 0xB8EC, 0x80F4, 0xEBD8, 0x80F5, 0xC371, 0x80F6, 0xBDBA,\t0x80F7, 0xC372, 0x80F8, 0xD0D8, 0x80F9, 0xC373, 0x80FA, 0xB0B7,\n\t0x80FB, 0xC374, 0x80FC, 0xEBDD, 0x80FD, 0xC4DC, 0x80FE, 0xC375,\t0x80FF, 0xC376, 0x8100, 0xC377, 0x8101, 0xC378, 0x8102, 0xD6AC,\n\t0x8103, 0xC379, 0x8104, 0xC37A, 0x8105, 0xC37B, 0x8106, 0xB4E0,\t0x8107, 0xC37C, 0x8108, 0xC37D, 0x8109, 0xC2F6, 0x810A, 0xBCB9,\n\t0x810B, 0xC37E, 0x810C, 0xC380, 0x810D, 0xEBDA, 0x810E, 0xEBDB,\t0x810F, 0xD4E0, 0x8110, 0xC6EA, 0x8111, 0xC4D4, 0x8112, 0xEBDF,\n\t0x8113, 0xC5A7, 0x8114, 0xD9F5, 0x8115, 0xC381, 0x8116, 0xB2B1,\t0x8117, 0xC382, 0x8118, 0xEBE4, 0x8119, 0xC383, 0x811A, 0xBDC5,\n\t0x811B, 0xC384, 0x811C, 0xC385, 0x811D, 0xC386, 0x811E, 0xEBE2,\t0x811F, 0xC387, 0x8120, 0xC388, 0x8121, 0xC389, 0x8122, 0xC38A,\n\t0x8123, 0xC38B, 0x8124, 0xC38C, 0x8125, 0xC38D, 0x8126, 0xC38E,\t0x8127, 0xC38F, 0x8128, 0xC390, 0x8129, 0xC391, 0x812A, 0xC392,\n\t0x812B, 0xC393, 0x812C, 0xEBE3, 0x812D, 0xC394, 0x812E, 0xC395,\t0x812F, 0xB8AC, 0x8130, 0xC396, 0x8131, 0xCDD1, 0x8132, 0xEBE5,\n\t0x8133, 0xC397, 0x8134, 0xC398, 0x8135, 0xC399, 0x8136, 0xEBE1,\t0x8137, 0xC39A, 0x8138, 0xC1B3, 0x8139, 0xC39B, 0x813A, 0xC39C,\n\t0x813B, 0xC39D, 0x813C, 0xC39E, 0x813D, 0xC39F, 0x813E, 0xC6A2,\t0x813F, 0xC3A0, 0x8140, 0xC440, 0x8141, 0xC441, 0x8142, 0xC442,\n\t0x8143, 0xC443, 0x8144, 0xC444, 0x8145, 0xC445, 0x8146, 0xCCF3,\t0x8147, 0xC446, 0x8148, 0xEBE6, 0x8149, 0xC447, 0x814A, 0xC0B0,\n\t0x814B, 0xD2B8, 0x814C, 0xEBE7, 0x814D, 0xC448, 0x814E, 0xC449,\t0x814F, 0xC44A, 0x8150, 0xB8AF, 0x8151, 0xB8AD, 0x8152, 0xC44B,\n\t0x8153, 0xEBE8, 0x8154, 0xC7BB, 0x8155, 0xCDF3, 0x8156, 0xC44C,\t0x8157, 0xC44D, 0x8158, 0xC44E, 0x8159, 0xEBEA, 0x815A, 0xEBEB,\n\t0x815B, 0xC44F, 0x815C, 0xC450, 0x815D, 0xC451, 0x815E, 0xC452,\t0x815F, 0xC453, 0x8160, 0xEBED, 0x8161, 0xC454, 0x8162, 0xC455,\n\t0x8163, 0xC456, 0x8164, 0xC457, 0x8165, 0xD0C8, 0x8166, 0xC458,\t0x8167, 0xEBF2, 0x8168, 0xC459, 0x8169, 0xEBEE, 0x816A, 0xC45A,\n\t0x816B, 0xC45B, 0x816C, 0xC45C, 0x816D, 0xEBF1, 0x816E, 0xC8F9,\t0x816F, 0xC45D, 0x8170, 0xD1FC, 0x8171, 0xEBEC, 0x8172, 0xC45E,\n\t0x8173, 0xC45F, 0x8174, 0xEBE9, 0x8175, 0xC460, 0x8176, 0xC461,\t0x8177, 0xC462, 0x8178, 0xC463, 0x8179, 0xB8B9, 0x817A, 0xCFD9,\n\t0x817B, 0xC4E5, 0x817C, 0xEBEF, 0x817D, 0xEBF0, 0x817E, 0xCCDA,\t0x817F, 0xCDC8, 0x8180, 0xB0F2, 0x8181, 0xC464, 0x8182, 0xEBF6,\n\t0x8183, 0xC465, 0x8184, 0xC466, 0x8185, 0xC467, 0x8186, 0xC468,\t0x8187, 0xC469, 0x8188, 0xEBF5, 0x8189, 0xC46A, 0x818A, 0xB2B2,\n\t0x818B, 0xC46B, 0x818C, 0xC46C, 0x818D, 0xC46D, 0x818E, 0xC46E,\t0x818F, 0xB8E0, 0x8190, 0xC46F, 0x8191, 0xEBF7, 0x8192, 0xC470,\n\t0x8193, 0xC471, 0x8194, 0xC472, 0x8195, 0xC473, 0x8196, 0xC474,\t0x8197, 0xC475, 0x8198, 0xB1EC, 0x8199, 0xC476, 0x819A, 0xC477,\n\t0x819B, 0xCCC5, 0x819C, 0xC4A4, 0x819D, 0xCFA5, 0x819E, 0xC478,\t0x819F, 0xC479, 0x81A0, 0xC47A, 0x81A1, 0xC47B, 0x81A2, 0xC47C,\n\t0x81A3, 0xEBF9, 0x81A4, 0xC47D, 0x81A5, 0xC47E, 0x81A6, 0xECA2,\t0x81A7, 0xC480, 0x81A8, 0xC5F2, 0x81A9, 0xC481, 0x81AA, 0xEBFA,\n\t0x81AB, 0xC482, 0x81AC, 0xC483, 0x81AD, 0xC484, 0x81AE, 0xC485,\t0x81AF, 0xC486, 0x81B0, 0xC487, 0x81B1, 0xC488, 0x81B2, 0xC489,\n\t0x81B3, 0xC9C5, 0x81B4, 0xC48A, 0x81B5, 0xC48B, 0x81B6, 0xC48C,\t0x81B7, 0xC48D, 0x81B8, 0xC48E, 0x81B9, 0xC48F, 0x81BA, 0xE2DF,\n\t0x81BB, 0xEBFE, 0x81BC, 0xC490, 0x81BD, 0xC491, 0x81BE, 0xC492,\t0x81BF, 0xC493, 0x81C0, 0xCDCE, 0x81C1, 0xECA1, 0x81C2, 0xB1DB,\n\t0x81C3, 0xD3B7, 0x81C4, 0xC494, 0x81C5, 0xC495, 0x81C6, 0xD2DC,\t0x81C7, 0xC496, 0x81C8, 0xC497, 0x81C9, 0xC498, 0x81CA, 0xEBFD,\n\t0x81CB, 0xC499, 0x81CC, 0xEBFB, 0x81CD, 0xC49A, 0x81CE, 0xC49B,\t0x81CF, 0xC49C, 0x81D0, 0xC49D, 0x81D1, 0xC49E, 0x81D2, 0xC49F,\n\t0x81D3, 0xC4A0, 0x81D4, 0xC540, 0x81D5, 0xC541, 0x81D6, 0xC542,\t0x81D7, 0xC543, 0x81D8, 0xC544, 0x81D9, 0xC545, 0x81DA, 0xC546,\n\t0x81DB, 0xC547, 0x81DC, 0xC548, 0x81DD, 0xC549, 0x81DE, 0xC54A,\t0x81DF, 0xC54B, 0x81E0, 0xC54C, 0x81E1, 0xC54D, 0x81E2, 0xC54E,\n\t0x81E3, 0xB3BC, 0x81E4, 0xC54F, 0x81E5, 0xC550, 0x81E6, 0xC551,\t0x81E7, 0xEAB0, 0x81E8, 0xC552, 0x81E9, 0xC553, 0x81EA, 0xD7D4,\n\t0x81EB, 0xC554, 0x81EC, 0xF4AB, 0x81ED, 0xB3F4, 0x81EE, 0xC555,\t0x81EF, 0xC556, 0x81F0, 0xC557, 0x81F1, 0xC558, 0x81F2, 0xC559,\n\t0x81F3, 0xD6C1, 0x81F4, 0xD6C2, 0x81F5, 0xC55A, 0x81F6, 0xC55B,\t0x81F7, 0xC55C, 0x81F8, 0xC55D, 0x81F9, 0xC55E, 0x81FA, 0xC55F,\n\t0x81FB, 0xD5E9, 0x81FC, 0xBECA, 0x81FD, 0xC560, 0x81FE, 0xF4A7,\t0x81FF, 0xC561, 0x8200, 0xD2A8, 0x8201, 0xF4A8, 0x8202, 0xF4A9,\n\t0x8203, 0xC562, 0x8204, 0xF4AA, 0x8205, 0xBECB, 0x8206, 0xD3DF,\t0x8207, 0xC563, 0x8208, 0xC564, 0x8209, 0xC565, 0x820A, 0xC566,\n\t0x820B, 0xC567, 0x820C, 0xC9E0, 0x820D, 0xC9E1, 0x820E, 0xC568,\t0x820F, 0xC569, 0x8210, 0xF3C2, 0x8211, 0xC56A, 0x8212, 0xCAE6,\n\t0x8213, 0xC56B, 0x8214, 0xCCF2, 0x8215, 0xC56C, 0x8216, 0xC56D,\t0x8217, 0xC56E, 0x8218, 0xC56F, 0x8219, 0xC570, 0x821A, 0xC571,\n\t0x821B, 0xE2B6, 0x821C, 0xCBB4, 0x821D, 0xC572, 0x821E, 0xCEE8,\t0x821F, 0xD6DB, 0x8220, 0xC573, 0x8221, 0xF4AD, 0x8222, 0xF4AE,\n\t0x8223, 0xF4AF, 0x8224, 0xC574, 0x8225, 0xC575, 0x8226, 0xC576,\t0x8227, 0xC577, 0x8228, 0xF4B2, 0x8229, 0xC578, 0x822A, 0xBABD,\n\t0x822B, 0xF4B3, 0x822C, 0xB0E3, 0x822D, 0xF4B0, 0x822E, 0xC579,\t0x822F, 0xF4B1, 0x8230, 0xBDA2, 0x8231, 0xB2D5, 0x8232, 0xC57A,\n\t0x8233, 0xF4B6, 0x8234, 0xF4B7, 0x8235, 0xB6E6, 0x8236, 0xB2B0,\t0x8237, 0xCFCF, 0x8238, 0xF4B4, 0x8239, 0xB4AC, 0x823A, 0xC57B,\n\t0x823B, 0xF4B5, 0x823C, 0xC57C, 0x823D, 0xC57D, 0x823E, 0xF4B8,\t0x823F, 0xC57E, 0x8240, 0xC580, 0x8241, 0xC581, 0x8242, 0xC582,\n\t0x8243, 0xC583, 0x8244, 0xF4B9, 0x8245, 0xC584, 0x8246, 0xC585,\t0x8247, 0xCDA7, 0x8248, 0xC586, 0x8249, 0xF4BA, 0x824A, 0xC587,\n\t0x824B, 0xF4BB, 0x824C, 0xC588, 0x824D, 0xC589, 0x824E, 0xC58A,\t0x824F, 0xF4BC, 0x8250, 0xC58B, 0x8251, 0xC58C, 0x8252, 0xC58D,\n\t0x8253, 0xC58E, 0x8254, 0xC58F, 0x8255, 0xC590, 0x8256, 0xC591,\t0x8257, 0xC592, 0x8258, 0xCBD2, 0x8259, 0xC593, 0x825A, 0xF4BD,\n\t0x825B, 0xC594, 0x825C, 0xC595, 0x825D, 0xC596, 0x825E, 0xC597,\t0x825F, 0xF4BE, 0x8260, 0xC598, 0x8261, 0xC599, 0x8262, 0xC59A,\n\t0x8263, 0xC59B, 0x8264, 0xC59C, 0x8265, 0xC59D, 0x8266, 0xC59E,\t0x8267, 0xC59F, 0x8268, 0xF4BF, 0x8269, 0xC5A0, 0x826A, 0xC640,\n\t0x826B, 0xC641, 0x826C, 0xC642, 0x826D, 0xC643, 0x826E, 0xF4DE,\t0x826F, 0xC1BC, 0x8270, 0xBCE8, 0x8271, 0xC644, 0x8272, 0xC9AB,\n\t0x8273, 0xD1DE, 0x8274, 0xE5F5, 0x8275, 0xC645, 0x8276, 0xC646,\t0x8277, 0xC647, 0x8278, 0xC648, 0x8279, 0xDCB3, 0x827A, 0xD2D5,\n\t0x827B, 0xC649, 0x827C, 0xC64A, 0x827D, 0xDCB4, 0x827E, 0xB0AC,\t0x827F, 0xDCB5, 0x8280, 0xC64B, 0x8281, 0xC64C, 0x8282, 0xBDDA,\n\t0x8283, 0xC64D, 0x8284, 0xDCB9, 0x8285, 0xC64E, 0x8286, 0xC64F,\t0x8287, 0xC650, 0x8288, 0xD8C2, 0x8289, 0xC651, 0x828A, 0xDCB7,\n\t0x828B, 0xD3F3, 0x828C, 0xC652, 0x828D, 0xC9D6, 0x828E, 0xDCBA,\t0x828F, 0xDCB6, 0x8290, 0xC653, 0x8291, 0xDCBB, 0x8292, 0xC3A2,\n\t0x8293, 0xC654, 0x8294, 0xC655, 0x8295, 0xC656, 0x8296, 0xC657,\t0x8297, 0xDCBC, 0x8298, 0xDCC5, 0x8299, 0xDCBD, 0x829A, 0xC658,\n\t0x829B, 0xC659, 0x829C, 0xCEDF, 0x829D, 0xD6A5, 0x829E, 0xC65A,\t0x829F, 0xDCCF, 0x82A0, 0xC65B, 0x82A1, 0xDCCD, 0x82A2, 0xC65C,\n\t0x82A3, 0xC65D, 0x82A4, 0xDCD2, 0x82A5, 0xBDE6, 0x82A6, 0xC2AB,\t0x82A7, 0xC65E, 0x82A8, 0xDCB8, 0x82A9, 0xDCCB, 0x82AA, 0xDCCE,\n\t0x82AB, 0xDCBE, 0x82AC, 0xB7D2, 0x82AD, 0xB0C5, 0x82AE, 0xDCC7,\t0x82AF, 0xD0BE, 0x82B0, 0xDCC1, 0x82B1, 0xBBA8, 0x82B2, 0xC65F,\n\t0x82B3, 0xB7BC, 0x82B4, 0xDCCC, 0x82B5, 0xC660, 0x82B6, 0xC661,\t0x82B7, 0xDCC6, 0x82B8, 0xDCBF, 0x82B9, 0xC7DB, 0x82BA, 0xC662,\n\t0x82BB, 0xC663, 0x82BC, 0xC664, 0x82BD, 0xD1BF, 0x82BE, 0xDCC0,\t0x82BF, 0xC665, 0x82C0, 0xC666, 0x82C1, 0xDCCA, 0x82C2, 0xC667,\n\t0x82C3, 0xC668, 0x82C4, 0xDCD0, 0x82C5, 0xC669, 0x82C6, 0xC66A,\t0x82C7, 0xCEAD, 0x82C8, 0xDCC2, 0x82C9, 0xC66B, 0x82CA, 0xDCC3,\n\t0x82CB, 0xDCC8, 0x82CC, 0xDCC9, 0x82CD, 0xB2D4, 0x82CE, 0xDCD1,\t0x82CF, 0xCBD5, 0x82D0, 0xC66C, 0x82D1, 0xD4B7, 0x82D2, 0xDCDB,\n\t0x82D3, 0xDCDF, 0x82D4, 0xCCA6, 0x82D5, 0xDCE6, 0x82D6, 0xC66D,\t0x82D7, 0xC3E7, 0x82D8, 0xDCDC, 0x82D9, 0xC66E, 0x82DA, 0xC66F,\n\t0x82DB, 0xBFC1, 0x82DC, 0xDCD9, 0x82DD, 0xC670, 0x82DE, 0xB0FA,\t0x82DF, 0xB9B6, 0x82E0, 0xDCE5, 0x82E1, 0xDCD3, 0x82E2, 0xC671,\n\t0x82E3, 0xDCC4, 0x82E4, 0xDCD6, 0x82E5, 0xC8F4, 0x82E6, 0xBFE0,\t0x82E7, 0xC672, 0x82E8, 0xC673, 0x82E9, 0xC674, 0x82EA, 0xC675,\n\t0x82EB, 0xC9BB, 0x82EC, 0xC676, 0x82ED, 0xC677, 0x82EE, 0xC678,\t0x82EF, 0xB1BD, 0x82F0, 0xC679, 0x82F1, 0xD3A2, 0x82F2, 0xC67A,\n\t0x82F3, 0xC67B, 0x82F4, 0xDCDA, 0x82F5, 0xC67C, 0x82F6, 0xC67D,\t0x82F7, 0xDCD5, 0x82F8, 0xC67E, 0x82F9, 0xC6BB, 0x82FA, 0xC680,\n\t0x82FB, 0xDCDE, 0x82FC, 0xC681, 0x82FD, 0xC682, 0x82FE, 0xC683,\t0x82FF, 0xC684, 0x8300, 0xC685, 0x8301, 0xD7C2, 0x8302, 0xC3AF,\n\t0x8303, 0xB7B6, 0x8304, 0xC7D1, 0x8305, 0xC3A9, 0x8306, 0xDCE2,\t0x8307, 0xDCD8, 0x8308, 0xDCEB, 0x8309, 0xDCD4, 0x830A, 0xC686,\n\t0x830B, 0xC687, 0x830C, 0xDCDD, 0x830D, 0xC688, 0x830E, 0xBEA5,\t0x830F, 0xDCD7, 0x8310, 0xC689, 0x8311, 0xDCE0, 0x8312, 0xC68A,\n\t0x8313, 0xC68B, 0x8314, 0xDCE3, 0x8315, 0xDCE4, 0x8316, 0xC68C,\t0x8317, 0xDCF8, 0x8318, 0xC68D, 0x8319, 0xC68E, 0x831A, 0xDCE1,\n\t0x831B, 0xDDA2, 0x831C, 0xDCE7, 0x831D, 0xC68F, 0x831E, 0xC690,\t0x831F, 0xC691, 0x8320, 0xC692, 0x8321, 0xC693, 0x8322, 0xC694,\n\t0x8323, 0xC695, 0x8324, 0xC696, 0x8325, 0xC697, 0x8326, 0xC698,\t0x8327, 0xBCEB, 0x8328, 0xB4C4, 0x8329, 0xC699, 0x832A, 0xC69A,\n\t0x832B, 0xC3A3, 0x832C, 0xB2E7, 0x832D, 0xDCFA, 0x832E, 0xC69B,\t0x832F, 0xDCF2, 0x8330, 0xC69C, 0x8331, 0xDCEF, 0x8332, 0xC69D,\n\t0x8333, 0xDCFC, 0x8334, 0xDCEE, 0x8335, 0xD2F0, 0x8336, 0xB2E8,\t0x8337, 0xC69E, 0x8338, 0xC8D7, 0x8339, 0xC8E3, 0x833A, 0xDCFB,\n\t0x833B, 0xC69F, 0x833C, 0xDCED, 0x833D, 0xC6A0, 0x833E, 0xC740,\t0x833F, 0xC741, 0x8340, 0xDCF7, 0x8341, 0xC742, 0x8342, 0xC743,\n\t0x8343, 0xDCF5, 0x8344, 0xC744, 0x8345, 0xC745, 0x8346, 0xBEA3,\t0x8347, 0xDCF4, 0x8348, 0xC746, 0x8349, 0xB2DD, 0x834A, 0xC747,\n\t0x834B, 0xC748, 0x834C, 0xC749, 0x834D, 0xC74A, 0x834E, 0xC74B,\t0x834F, 0xDCF3, 0x8350, 0xBCF6, 0x8351, 0xDCE8, 0x8352, 0xBBC4,\n\t0x8353, 0xC74C, 0x8354, 0xC0F3, 0x8355, 0xC74D, 0x8356, 0xC74E,\t0x8357, 0xC74F, 0x8358, 0xC750, 0x8359, 0xC751, 0x835A, 0xBCD4,\n\t0x835B, 0xDCE9, 0x835C, 0xDCEA, 0x835D, 0xC752, 0x835E, 0xDCF1,\t0x835F, 0xDCF6, 0x8360, 0xDCF9, 0x8361, 0xB5B4, 0x8362, 0xC753,\n\t0x8363, 0xC8D9, 0x8364, 0xBBE7, 0x8365, 0xDCFE, 0x8366, 0xDCFD,\t0x8367, 0xD3AB, 0x8368, 0xDDA1, 0x8369, 0xDDA3, 0x836A, 0xDDA5,\n\t0x836B, 0xD2F1, 0x836C, 0xDDA4, 0x836D, 0xDDA6, 0x836E, 0xDDA7,\t0x836F, 0xD2A9, 0x8370, 0xC754, 0x8371, 0xC755, 0x8372, 0xC756,\n\t0x8373, 0xC757, 0x8374, 0xC758, 0x8375, 0xC759, 0x8376, 0xC75A,\t0x8377, 0xBAC9, 0x8378, 0xDDA9, 0x8379, 0xC75B, 0x837A, 0xC75C,\n\t0x837B, 0xDDB6, 0x837C, 0xDDB1, 0x837D, 0xDDB4, 0x837E, 0xC75D,\t0x837F, 0xC75E, 0x8380, 0xC75F, 0x8381, 0xC760, 0x8382, 0xC761,\n\t0x8383, 0xC762, 0x8384, 0xC763, 0x8385, 0xDDB0, 0x8386, 0xC6CE,\t0x8387, 0xC764, 0x8388, 0xC765, 0x8389, 0xC0F2, 0x838A, 0xC766,\n\t0x838B, 0xC767, 0x838C, 0xC768, 0x838D, 0xC769, 0x838E, 0xC9AF,\t0x838F, 0xC76A, 0x8390, 0xC76B, 0x8391, 0xC76C, 0x8392, 0xDCEC,\n\t0x8393, 0xDDAE, 0x8394, 0xC76D, 0x8395, 0xC76E, 0x8396, 0xC76F,\t0x8397, 0xC770, 0x8398, 0xDDB7, 0x8399, 0xC771, 0x839A, 0xC772,\n\t0x839B, 0xDCF0, 0x839C, 0xDDAF, 0x839D, 0xC773, 0x839E, 0xDDB8,\t0x839F, 0xC774, 0x83A0, 0xDDAC, 0x83A1, 0xC775, 0x83A2, 0xC776,\n\t0x83A3, 0xC777, 0x83A4, 0xC778, 0x83A5, 0xC779, 0x83A6, 0xC77A,\t0x83A7, 0xC77B, 0x83A8, 0xDDB9, 0x83A9, 0xDDB3, 0x83AA, 0xDDAD,\n\t0x83AB, 0xC4AA, 0x83AC, 0xC77C, 0x83AD, 0xC77D, 0x83AE, 0xC77E,\t0x83AF, 0xC780, 0x83B0, 0xDDA8, 0x83B1, 0xC0B3, 0x83B2, 0xC1AB,\n\t0x83B3, 0xDDAA, 0x83B4, 0xDDAB, 0x83B5, 0xC781, 0x83B6, 0xDDB2,\t0x83B7, 0xBBF1, 0x83B8, 0xDDB5, 0x83B9, 0xD3A8, 0x83BA, 0xDDBA,\n\t0x83BB, 0xC782, 0x83BC, 0xDDBB, 0x83BD, 0xC3A7, 0x83BE, 0xC783,\t0x83BF, 0xC784, 0x83C0, 0xDDD2, 0x83C1, 0xDDBC, 0x83C2, 0xC785,\n\t0x83C3, 0xC786, 0x83C4, 0xC787, 0x83C5, 0xDDD1, 0x83C6, 0xC788,\t0x83C7, 0xB9BD, 0x83C8, 0xC789, 0x83C9, 0xC78A, 0x83CA, 0xBED5,\n\t0x83CB, 0xC78B, 0x83CC, 0xBEFA, 0x83CD, 0xC78C, 0x83CE, 0xC78D,\t0x83CF, 0xBACA, 0x83D0, 0xC78E, 0x83D1, 0xC78F, 0x83D2, 0xC790,\n\t0x83D3, 0xC791, 0x83D4, 0xDDCA, 0x83D5, 0xC792, 0x83D6, 0xDDC5,\t0x83D7, 0xC793, 0x83D8, 0xDDBF, 0x83D9, 0xC794, 0x83DA, 0xC795,\n\t0x83DB, 0xC796, 0x83DC, 0xB2CB, 0x83DD, 0xDDC3, 0x83DE, 0xC797,\t0x83DF, 0xDDCB, 0x83E0, 0xB2A4, 0x83E1, 0xDDD5, 0x83E2, 0xC798,\n\t0x83E3, 0xC799, 0x83E4, 0xC79A, 0x83E5, 0xDDBE, 0x83E6, 0xC79B,\t0x83E7, 0xC79C, 0x83E8, 0xC79D, 0x83E9, 0xC6D0, 0x83EA, 0xDDD0,\n\t0x83EB, 0xC79E, 0x83EC, 0xC79F, 0x83ED, 0xC7A0, 0x83EE, 0xC840,\t0x83EF, 0xC841, 0x83F0, 0xDDD4, 0x83F1, 0xC1E2, 0x83F2, 0xB7C6,\n\t0x83F3, 0xC842, 0x83F4, 0xC843, 0x83F5, 0xC844, 0x83F6, 0xC845,\t0x83F7, 0xC846, 0x83F8, 0xDDCE, 0x83F9, 0xDDCF, 0x83FA, 0xC847,\n\t0x83FB, 0xC848, 0x83FC, 0xC849, 0x83FD, 0xDDC4, 0x83FE, 0xC84A,\t0x83FF, 0xC84B, 0x8400, 0xC84C, 0x8401, 0xDDBD, 0x8402, 0xC84D,\n\t0x8403, 0xDDCD, 0x8404, 0xCCD1, 0x8405, 0xC84E, 0x8406, 0xDDC9,\t0x8407, 0xC84F, 0x8408, 0xC850, 0x8409, 0xC851, 0x840A, 0xC852,\n\t0x840B, 0xDDC2, 0x840C, 0xC3C8, 0x840D, 0xC6BC, 0x840E, 0xCEAE,\t0x840F, 0xDDCC, 0x8410, 0xC853, 0x8411, 0xDDC8, 0x8412, 0xC854,\n\t0x8413, 0xC855, 0x8414, 0xC856, 0x8415, 0xC857, 0x8416, 0xC858,\t0x8417, 0xC859, 0x8418, 0xDDC1, 0x8419, 0xC85A, 0x841A, 0xC85B,\n\t0x841B, 0xC85C, 0x841C, 0xDDC6, 0x841D, 0xC2DC, 0x841E, 0xC85D,\t0x841F, 0xC85E, 0x8420, 0xC85F, 0x8421, 0xC860, 0x8422, 0xC861,\n\t0x8423, 0xC862, 0x8424, 0xD3A9, 0x8425, 0xD3AA, 0x8426, 0xDDD3,\t0x8427, 0xCFF4, 0x8428, 0xC8F8, 0x8429, 0xC863, 0x842A, 0xC864,\n\t0x842B, 0xC865, 0x842C, 0xC866, 0x842D, 0xC867, 0x842E, 0xC868,\t0x842F, 0xC869, 0x8430, 0xC86A, 0x8431, 0xDDE6, 0x8432, 0xC86B,\n\t0x8433, 0xC86C, 0x8434, 0xC86D, 0x8435, 0xC86E, 0x8436, 0xC86F,\t0x8437, 0xC870, 0x8438, 0xDDC7, 0x8439, 0xC871, 0x843A, 0xC872,\n\t0x843B, 0xC873, 0x843C, 0xDDE0, 0x843D, 0xC2E4, 0x843E, 0xC874,\t0x843F, 0xC875, 0x8440, 0xC876, 0x8441, 0xC877, 0x8442, 0xC878,\n\t0x8443, 0xC879, 0x8444, 0xC87A, 0x8445, 0xC87B, 0x8446, 0xDDE1,\t0x8447, 0xC87C, 0x8448, 0xC87D, 0x8449, 0xC87E, 0x844A, 0xC880,\n\t0x844B, 0xC881, 0x844C, 0xC882, 0x844D, 0xC883, 0x844E, 0xC884,\t0x844F, 0xC885, 0x8450, 0xC886, 0x8451, 0xDDD7, 0x8452, 0xC887,\n\t0x8453, 0xC888, 0x8454, 0xC889, 0x8455, 0xC88A, 0x8456, 0xC88B,\t0x8457, 0xD6F8, 0x8458, 0xC88C, 0x8459, 0xDDD9, 0x845A, 0xDDD8,\n\t0x845B, 0xB8F0, 0x845C, 0xDDD6, 0x845D, 0xC88D, 0x845E, 0xC88E,\t0x845F, 0xC88F, 0x8460, 0xC890, 0x8461, 0xC6CF, 0x8462, 0xC891,\n\t0x8463, 0xB6AD, 0x8464, 0xC892, 0x8465, 0xC893, 0x8466, 0xC894,\t0x8467, 0xC895, 0x8468, 0xC896, 0x8469, 0xDDE2, 0x846A, 0xC897,\n\t0x846B, 0xBAF9, 0x846C, 0xD4E1, 0x846D, 0xDDE7, 0x846E, 0xC898,\t0x846F, 0xC899, 0x8470, 0xC89A, 0x8471, 0xB4D0, 0x8472, 0xC89B,\n\t0x8473, 0xDDDA, 0x8474, 0xC89C, 0x8475, 0xBFFB, 0x8476, 0xDDE3,\t0x8477, 0xC89D, 0x8478, 0xDDDF, 0x8479, 0xC89E, 0x847A, 0xDDDD,\n\t0x847B, 0xC89F, 0x847C, 0xC8A0, 0x847D, 0xC940, 0x847E, 0xC941,\t0x847F, 0xC942, 0x8480, 0xC943, 0x8481, 0xC944, 0x8482, 0xB5D9,\n\t0x8483, 0xC945, 0x8484, 0xC946, 0x8485, 0xC947, 0x8486, 0xC948,\t0x8487, 0xDDDB, 0x8488, 0xDDDC, 0x8489, 0xDDDE, 0x848A, 0xC949,\n\t0x848B, 0xBDAF, 0x848C, 0xDDE4, 0x848D, 0xC94A, 0x848E, 0xDDE5,\t0x848F, 0xC94B, 0x8490, 0xC94C, 0x8491, 0xC94D, 0x8492, 0xC94E,\n\t0x8493, 0xC94F, 0x8494, 0xC950, 0x8495, 0xC951, 0x8496, 0xC952,\t0x8497, 0xDDF5, 0x8498, 0xC953, 0x8499, 0xC3C9, 0x849A, 0xC954,\n\t0x849B, 0xC955, 0x849C, 0xCBE2, 0x849D, 0xC956, 0x849E, 0xC957,\t0x849F, 0xC958, 0x84A0, 0xC959, 0x84A1, 0xDDF2, 0x84A2, 0xC95A,\n\t0x84A3, 0xC95B, 0x84A4, 0xC95C, 0x84A5, 0xC95D, 0x84A6, 0xC95E,\t0x84A7, 0xC95F, 0x84A8, 0xC960, 0x84A9, 0xC961, 0x84AA, 0xC962,\n\t0x84AB, 0xC963, 0x84AC, 0xC964, 0x84AD, 0xC965, 0x84AE, 0xC966,\t0x84AF, 0xD8E1, 0x84B0, 0xC967, 0x84B1, 0xC968, 0x84B2, 0xC6D1,\n\t0x84B3, 0xC969, 0x84B4, 0xDDF4, 0x84B5, 0xC96A, 0x84B6, 0xC96B,\t0x84B7, 0xC96C, 0x84B8, 0xD5F4, 0x84B9, 0xDDF3, 0x84BA, 0xDDF0,\n\t0x84BB, 0xC96D, 0x84BC, 0xC96E, 0x84BD, 0xDDEC, 0x84BE, 0xC96F,\t0x84BF, 0xDDEF, 0x84C0, 0xC970, 0x84C1, 0xDDE8, 0x84C2, 0xC971,\n\t0x84C3, 0xC972, 0x84C4, 0xD0EE, 0x84C5, 0xC973, 0x84C6, 0xC974,\t0x84C7, 0xC975, 0x84C8, 0xC976, 0x84C9, 0xC8D8, 0x84CA, 0xDDEE,\n\t0x84CB, 0xC977, 0x84CC, 0xC978, 0x84CD, 0xDDE9, 0x84CE, 0xC979,\t0x84CF, 0xC97A, 0x84D0, 0xDDEA, 0x84D1, 0xCBF2, 0x84D2, 0xC97B,\n\t0x84D3, 0xDDED, 0x84D4, 0xC97C, 0x84D5, 0xC97D, 0x84D6, 0xB1CD,\t0x84D7, 0xC97E, 0x84D8, 0xC980, 0x84D9, 0xC981, 0x84DA, 0xC982,\n\t0x84DB, 0xC983, 0x84DC, 0xC984, 0x84DD, 0xC0B6, 0x84DE, 0xC985,\t0x84DF, 0xBCBB, 0x84E0, 0xDDF1, 0x84E1, 0xC986, 0x84E2, 0xC987,\n\t0x84E3, 0xDDF7, 0x84E4, 0xC988, 0x84E5, 0xDDF6, 0x84E6, 0xDDEB,\t0x84E7, 0xC989, 0x84E8, 0xC98A, 0x84E9, 0xC98B, 0x84EA, 0xC98C,\n\t0x84EB, 0xC98D, 0x84EC, 0xC5EE, 0x84ED, 0xC98E, 0x84EE, 0xC98F,\t0x84EF, 0xC990, 0x84F0, 0xDDFB, 0x84F1, 0xC991, 0x84F2, 0xC992,\n\t0x84F3, 0xC993, 0x84F4, 0xC994, 0x84F5, 0xC995, 0x84F6, 0xC996,\t0x84F7, 0xC997, 0x84F8, 0xC998, 0x84F9, 0xC999, 0x84FA, 0xC99A,\n\t0x84FB, 0xC99B, 0x84FC, 0xDEA4, 0x84FD, 0xC99C, 0x84FE, 0xC99D,\t0x84FF, 0xDEA3, 0x8500, 0xC99E, 0x8501, 0xC99F, 0x8502, 0xC9A0,\n\t0x8503, 0xCA40, 0x8504, 0xCA41, 0x8505, 0xCA42, 0x8506, 0xCA43,\t0x8507, 0xCA44, 0x8508, 0xCA45, 0x8509, 0xCA46, 0x850A, 0xCA47,\n\t0x850B, 0xCA48, 0x850C, 0xDDF8, 0x850D, 0xCA49, 0x850E, 0xCA4A,\t0x850F, 0xCA4B, 0x8510, 0xCA4C, 0x8511, 0xC3EF, 0x8512, 0xCA4D,\n\t0x8513, 0xC2FB, 0x8514, 0xCA4E, 0x8515, 0xCA4F, 0x8516, 0xCA50,\t0x8517, 0xD5E1, 0x8518, 0xCA51, 0x8519, 0xCA52, 0x851A, 0xCEB5,\n\t0x851B, 0xCA53, 0x851C, 0xCA54, 0x851D, 0xCA55, 0x851E, 0xCA56,\t0x851F, 0xDDFD, 0x8520, 0xCA57, 0x8521, 0xB2CC, 0x8522, 0xCA58,\n\t0x8523, 0xCA59, 0x8524, 0xCA5A, 0x8525, 0xCA5B, 0x8526, 0xCA5C,\t0x8527, 0xCA5D, 0x8528, 0xCA5E, 0x8529, 0xCA5F, 0x852A, 0xCA60,\n\t0x852B, 0xC4E8, 0x852C, 0xCADF, 0x852D, 0xCA61, 0x852E, 0xCA62,\t0x852F, 0xCA63, 0x8530, 0xCA64, 0x8531, 0xCA65, 0x8532, 0xCA66,\n\t0x8533, 0xCA67, 0x8534, 0xCA68, 0x8535, 0xCA69, 0x8536, 0xCA6A,\t0x8537, 0xC7BE, 0x8538, 0xDDFA, 0x8539, 0xDDFC, 0x853A, 0xDDFE,\n\t0x853B, 0xDEA2, 0x853C, 0xB0AA, 0x853D, 0xB1CE, 0x853E, 0xCA6B,\t0x853F, 0xCA6C, 0x8540, 0xCA6D, 0x8541, 0xCA6E, 0x8542, 0xCA6F,\n\t0x8543, 0xDEAC, 0x8544, 0xCA70, 0x8545, 0xCA71, 0x8546, 0xCA72,\t0x8547, 0xCA73, 0x8548, 0xDEA6, 0x8549, 0xBDB6, 0x854A, 0xC8EF,\n\t0x854B, 0xCA74, 0x854C, 0xCA75, 0x854D, 0xCA76, 0x854E, 0xCA77,\t0x854F, 0xCA78, 0x8550, 0xCA79, 0x8551, 0xCA7A, 0x8552, 0xCA7B,\n\t0x8553, 0xCA7C, 0x8554, 0xCA7D, 0x8555, 0xCA7E, 0x8556, 0xDEA1,\t0x8557, 0xCA80, 0x8558, 0xCA81, 0x8559, 0xDEA5, 0x855A, 0xCA82,\n\t0x855B, 0xCA83, 0x855C, 0xCA84, 0x855D, 0xCA85, 0x855E, 0xDEA9,\t0x855F, 0xCA86, 0x8560, 0xCA87, 0x8561, 0xCA88, 0x8562, 0xCA89,\n\t0x8563, 0xCA8A, 0x8564, 0xDEA8, 0x8565, 0xCA8B, 0x8566, 0xCA8C,\t0x8567, 0xCA8D, 0x8568, 0xDEA7, 0x8569, 0xCA8E, 0x856A, 0xCA8F,\n\t0x856B, 0xCA90, 0x856C, 0xCA91, 0x856D, 0xCA92, 0x856E, 0xCA93,\t0x856F, 0xCA94, 0x8570, 0xCA95, 0x8571, 0xCA96, 0x8572, 0xDEAD,\n\t0x8573, 0xCA97, 0x8574, 0xD4CC, 0x8575, 0xCA98, 0x8576, 0xCA99,\t0x8577, 0xCA9A, 0x8578, 0xCA9B, 0x8579, 0xDEB3, 0x857A, 0xDEAA,\n\t0x857B, 0xDEAE, 0x857C, 0xCA9C, 0x857D, 0xCA9D, 0x857E, 0xC0D9,\t0x857F, 0xCA9E, 0x8580, 0xCA9F, 0x8581, 0xCAA0, 0x8582, 0xCB40,\n\t0x8583, 0xCB41, 0x8584, 0xB1A1, 0x8585, 0xDEB6, 0x8586, 0xCB42,\t0x8587, 0xDEB1, 0x8588, 0xCB43, 0x8589, 0xCB44, 0x858A, 0xCB45,\n\t0x858B, 0xCB46, 0x858C, 0xCB47, 0x858D, 0xCB48, 0x858E, 0xCB49,\t0x858F, 0xDEB2, 0x8590, 0xCB4A, 0x8591, 0xCB4B, 0x8592, 0xCB4C,\n\t0x8593, 0xCB4D, 0x8594, 0xCB4E, 0x8595, 0xCB4F, 0x8596, 0xCB50,\t0x8597, 0xCB51, 0x8598, 0xCB52, 0x8599, 0xCB53, 0x859A, 0xCB54,\n\t0x859B, 0xD1A6, 0x859C, 0xDEB5, 0x859D, 0xCB55, 0x859E, 0xCB56,\t0x859F, 0xCB57, 0x85A0, 0xCB58, 0x85A1, 0xCB59, 0x85A2, 0xCB5A,\n\t0x85A3, 0xCB5B, 0x85A4, 0xDEAF, 0x85A5, 0xCB5C, 0x85A6, 0xCB5D,\t0x85A7, 0xCB5E, 0x85A8, 0xDEB0, 0x85A9, 0xCB5F, 0x85AA, 0xD0BD,\n\t0x85AB, 0xCB60, 0x85AC, 0xCB61, 0x85AD, 0xCB62, 0x85AE, 0xDEB4,\t0x85AF, 0xCAED, 0x85B0, 0xDEB9, 0x85B1, 0xCB63, 0x85B2, 0xCB64,\n\t0x85B3, 0xCB65, 0x85B4, 0xCB66, 0x85B5, 0xCB67, 0x85B6, 0xCB68,\t0x85B7, 0xDEB8, 0x85B8, 0xCB69, 0x85B9, 0xDEB7, 0x85BA, 0xCB6A,\n\t0x85BB, 0xCB6B, 0x85BC, 0xCB6C, 0x85BD, 0xCB6D, 0x85BE, 0xCB6E,\t0x85BF, 0xCB6F, 0x85C0, 0xCB70, 0x85C1, 0xDEBB, 0x85C2, 0xCB71,\n\t0x85C3, 0xCB72, 0x85C4, 0xCB73, 0x85C5, 0xCB74, 0x85C6, 0xCB75,\t0x85C7, 0xCB76, 0x85C8, 0xCB77, 0x85C9, 0xBDE5, 0x85CA, 0xCB78,\n\t0x85CB, 0xCB79, 0x85CC, 0xCB7A, 0x85CD, 0xCB7B, 0x85CE, 0xCB7C,\t0x85CF, 0xB2D8, 0x85D0, 0xC3EA, 0x85D1, 0xCB7D, 0x85D2, 0xCB7E,\n\t0x85D3, 0xDEBA, 0x85D4, 0xCB80, 0x85D5, 0xC5BA, 0x85D6, 0xCB81,\t0x85D7, 0xCB82, 0x85D8, 0xCB83, 0x85D9, 0xCB84, 0x85DA, 0xCB85,\n\t0x85DB, 0xCB86, 0x85DC, 0xDEBC, 0x85DD, 0xCB87, 0x85DE, 0xCB88,\t0x85DF, 0xCB89, 0x85E0, 0xCB8A, 0x85E1, 0xCB8B, 0x85E2, 0xCB8C,\n\t0x85E3, 0xCB8D, 0x85E4, 0xCCD9, 0x85E5, 0xCB8E, 0x85E6, 0xCB8F,\t0x85E7, 0xCB90, 0x85E8, 0xCB91, 0x85E9, 0xB7AA, 0x85EA, 0xCB92,\n\t0x85EB, 0xCB93, 0x85EC, 0xCB94, 0x85ED, 0xCB95, 0x85EE, 0xCB96,\t0x85EF, 0xCB97, 0x85F0, 0xCB98, 0x85F1, 0xCB99, 0x85F2, 0xCB9A,\n\t0x85F3, 0xCB9B, 0x85F4, 0xCB9C, 0x85F5, 0xCB9D, 0x85F6, 0xCB9E,\t0x85F7, 0xCB9F, 0x85F8, 0xCBA0, 0x85F9, 0xCC40, 0x85FA, 0xCC41,\n\t0x85FB, 0xD4E5, 0x85FC, 0xCC42, 0x85FD, 0xCC43, 0x85FE, 0xCC44,\t0x85FF, 0xDEBD, 0x8600, 0xCC45, 0x8601, 0xCC46, 0x8602, 0xCC47,\n\t0x8603, 0xCC48, 0x8604, 0xCC49, 0x8605, 0xDEBF, 0x8606, 0xCC4A,\t0x8607, 0xCC4B, 0x8608, 0xCC4C, 0x8609, 0xCC4D, 0x860A, 0xCC4E,\n\t0x860B, 0xCC4F, 0x860C, 0xCC50, 0x860D, 0xCC51, 0x860E, 0xCC52,\t0x860F, 0xCC53, 0x8610, 0xCC54, 0x8611, 0xC4A2, 0x8612, 0xCC55,\n\t0x8613, 0xCC56, 0x8614, 0xCC57, 0x8615, 0xCC58, 0x8616, 0xDEC1,\t0x8617, 0xCC59, 0x8618, 0xCC5A, 0x8619, 0xCC5B, 0x861A, 0xCC5C,\n\t0x861B, 0xCC5D, 0x861C, 0xCC5E, 0x861D, 0xCC5F, 0x861E, 0xCC60,\t0x861F, 0xCC61, 0x8620, 0xCC62, 0x8621, 0xCC63, 0x8622, 0xCC64,\n\t0x8623, 0xCC65, 0x8624, 0xCC66, 0x8625, 0xCC67, 0x8626, 0xCC68,\t0x8627, 0xDEBE, 0x8628, 0xCC69, 0x8629, 0xDEC0, 0x862A, 0xCC6A,\n\t0x862B, 0xCC6B, 0x862C, 0xCC6C, 0x862D, 0xCC6D, 0x862E, 0xCC6E,\t0x862F, 0xCC6F, 0x8630, 0xCC70, 0x8631, 0xCC71, 0x8632, 0xCC72,\n\t0x8633, 0xCC73, 0x8634, 0xCC74, 0x8635, 0xCC75, 0x8636, 0xCC76,\t0x8637, 0xCC77, 0x8638, 0xD5BA, 0x8639, 0xCC78, 0x863A, 0xCC79,\n\t0x863B, 0xCC7A, 0x863C, 0xDEC2, 0x863D, 0xCC7B, 0x863E, 0xCC7C,\t0x863F, 0xCC7D, 0x8640, 0xCC7E, 0x8641, 0xCC80, 0x8642, 0xCC81,\n\t0x8643, 0xCC82, 0x8644, 0xCC83, 0x8645, 0xCC84, 0x8646, 0xCC85,\t0x8647, 0xCC86, 0x8648, 0xCC87, 0x8649, 0xCC88, 0x864A, 0xCC89,\n\t0x864B, 0xCC8A, 0x864C, 0xCC8B, 0x864D, 0xF2AE, 0x864E, 0xBBA2,\t0x864F, 0xC2B2, 0x8650, 0xC5B0, 0x8651, 0xC2C7, 0x8652, 0xCC8C,\n\t0x8653, 0xCC8D, 0x8654, 0xF2AF, 0x8655, 0xCC8E, 0x8656, 0xCC8F,\t0x8657, 0xCC90, 0x8658, 0xCC91, 0x8659, 0xCC92, 0x865A, 0xD0E9,\n\t0x865B, 0xCC93, 0x865C, 0xCC94, 0x865D, 0xCC95, 0x865E, 0xD3DD,\t0x865F, 0xCC96, 0x8660, 0xCC97, 0x8661, 0xCC98, 0x8662, 0xEBBD,\n\t0x8663, 0xCC99, 0x8664, 0xCC9A, 0x8665, 0xCC9B, 0x8666, 0xCC9C,\t0x8667, 0xCC9D, 0x8668, 0xCC9E, 0x8669, 0xCC9F, 0x866A, 0xCCA0,\n\t0x866B, 0xB3E6, 0x866C, 0xF2B0, 0x866D, 0xCD40, 0x866E, 0xF2B1,\t0x866F, 0xCD41, 0x8670, 0xCD42, 0x8671, 0xCAAD, 0x8672, 0xCD43,\n\t0x8673, 0xCD44, 0x8674, 0xCD45, 0x8675, 0xCD46, 0x8676, 0xCD47,\t0x8677, 0xCD48, 0x8678, 0xCD49, 0x8679, 0xBAE7, 0x867A, 0xF2B3,\n\t0x867B, 0xF2B5, 0x867C, 0xF2B4, 0x867D, 0xCBE4, 0x867E, 0xCFBA,\t0x867F, 0xF2B2, 0x8680, 0xCAB4, 0x8681, 0xD2CF, 0x8682, 0xC2EC,\n\t0x8683, 0xCD4A, 0x8684, 0xCD4B, 0x8685, 0xCD4C, 0x8686, 0xCD4D,\t0x8687, 0xCD4E, 0x8688, 0xCD4F, 0x8689, 0xCD50, 0x868A, 0xCEC3,\n\t0x868B, 0xF2B8, 0x868C, 0xB0F6, 0x868D, 0xF2B7, 0x868E, 0xCD51,\t0x868F, 0xCD52, 0x8690, 0xCD53, 0x8691, 0xCD54, 0x8692, 0xCD55,\n\t0x8693, 0xF2BE, 0x8694, 0xCD56, 0x8695, 0xB2CF, 0x8696, 0xCD57,\t0x8697, 0xCD58, 0x8698, 0xCD59, 0x8699, 0xCD5A, 0x869A, 0xCD5B,\n\t0x869B, 0xCD5C, 0x869C, 0xD1C1, 0x869D, 0xF2BA, 0x869E, 0xCD5D,\t0x869F, 0xCD5E, 0x86A0, 0xCD5F, 0x86A1, 0xCD60, 0x86A2, 0xCD61,\n\t0x86A3, 0xF2BC, 0x86A4, 0xD4E9, 0x86A5, 0xCD62, 0x86A6, 0xCD63,\t0x86A7, 0xF2BB, 0x86A8, 0xF2B6, 0x86A9, 0xF2BF, 0x86AA, 0xF2BD,\n\t0x86AB, 0xCD64, 0x86AC, 0xF2B9, 0x86AD, 0xCD65, 0x86AE, 0xCD66,\t0x86AF, 0xF2C7, 0x86B0, 0xF2C4, 0x86B1, 0xF2C6, 0x86B2, 0xCD67,\n\t0x86B3, 0xCD68, 0x86B4, 0xF2CA, 0x86B5, 0xF2C2, 0x86B6, 0xF2C0,\t0x86B7, 0xCD69, 0x86B8, 0xCD6A, 0x86B9, 0xCD6B, 0x86BA, 0xF2C5,\n\t0x86BB, 0xCD6C, 0x86BC, 0xCD6D, 0x86BD, 0xCD6E, 0x86BE, 0xCD6F,\t0x86BF, 0xCD70, 0x86C0, 0xD6FB, 0x86C1, 0xCD71, 0x86C2, 0xCD72,\n\t0x86C3, 0xCD73, 0x86C4, 0xF2C1, 0x86C5, 0xCD74, 0x86C6, 0xC7F9,\t0x86C7, 0xC9DF, 0x86C8, 0xCD75, 0x86C9, 0xF2C8, 0x86CA, 0xB9C6,\n\t0x86CB, 0xB5B0, 0x86CC, 0xCD76, 0x86CD, 0xCD77, 0x86CE, 0xF2C3,\t0x86CF, 0xF2C9, 0x86D0, 0xF2D0, 0x86D1, 0xF2D6, 0x86D2, 0xCD78,\n\t0x86D3, 0xCD79, 0x86D4, 0xBBD7, 0x86D5, 0xCD7A, 0x86D6, 0xCD7B,\t0x86D7, 0xCD7C, 0x86D8, 0xF2D5, 0x86D9, 0xCDDC, 0x86DA, 0xCD7D,\n\t0x86DB, 0xD6EB, 0x86DC, 0xCD7E, 0x86DD, 0xCD80, 0x86DE, 0xF2D2,\t0x86DF, 0xF2D4, 0x86E0, 0xCD81, 0x86E1, 0xCD82, 0x86E2, 0xCD83,\n\t0x86E3, 0xCD84, 0x86E4, 0xB8F2, 0x86E5, 0xCD85, 0x86E6, 0xCD86,\t0x86E7, 0xCD87, 0x86E8, 0xCD88, 0x86E9, 0xF2CB, 0x86EA, 0xCD89,\n\t0x86EB, 0xCD8A, 0x86EC, 0xCD8B, 0x86ED, 0xF2CE, 0x86EE, 0xC2F9,\t0x86EF, 0xCD8C, 0x86F0, 0xD5DD, 0x86F1, 0xF2CC, 0x86F2, 0xF2CD,\n\t0x86F3, 0xF2CF, 0x86F4, 0xF2D3, 0x86F5, 0xCD8D, 0x86F6, 0xCD8E,\t0x86F7, 0xCD8F, 0x86F8, 0xF2D9, 0x86F9, 0xD3BC, 0x86FA, 0xCD90,\n\t0x86FB, 0xCD91, 0x86FC, 0xCD92, 0x86FD, 0xCD93, 0x86FE, 0xB6EA,\t0x86FF, 0xCD94, 0x8700, 0xCAF1, 0x8701, 0xCD95, 0x8702, 0xB7E4,\n\t0x8703, 0xF2D7, 0x8704, 0xCD96, 0x8705, 0xCD97, 0x8706, 0xCD98,\t0x8707, 0xF2D8, 0x8708, 0xF2DA, 0x8709, 0xF2DD, 0x870A, 0xF2DB,\n\t0x870B, 0xCD99, 0x870C, 0xCD9A, 0x870D, 0xF2DC, 0x870E, 0xCD9B,\t0x870F, 0xCD9C, 0x8710, 0xCD9D, 0x8711, 0xCD9E, 0x8712, 0xD1D1,\n\t0x8713, 0xF2D1, 0x8714, 0xCD9F, 0x8715, 0xCDC9, 0x8716, 0xCDA0,\t0x8717, 0xCECF, 0x8718, 0xD6A9, 0x8719, 0xCE40, 0x871A, 0xF2E3,\n\t0x871B, 0xCE41, 0x871C, 0xC3DB, 0x871D, 0xCE42, 0x871E, 0xF2E0,\t0x871F, 0xCE43, 0x8720, 0xCE44, 0x8721, 0xC0AF, 0x8722, 0xF2EC,\n\t0x8723, 0xF2DE, 0x8724, 0xCE45, 0x8725, 0xF2E1, 0x8726, 0xCE46,\t0x8727, 0xCE47, 0x8728, 0xCE48, 0x8729, 0xF2E8, 0x872A, 0xCE49,\n\t0x872B, 0xCE4A, 0x872C, 0xCE4B, 0x872D, 0xCE4C, 0x872E, 0xF2E2,\t0x872F, 0xCE4D, 0x8730, 0xCE4E, 0x8731, 0xF2E7, 0x8732, 0xCE4F,\n\t0x8733, 0xCE50, 0x8734, 0xF2E6, 0x8735, 0xCE51, 0x8736, 0xCE52,\t0x8737, 0xF2E9, 0x8738, 0xCE53, 0x8739, 0xCE54, 0x873A, 0xCE55,\n\t0x873B, 0xF2DF, 0x873C, 0xCE56, 0x873D, 0xCE57, 0x873E, 0xF2E4,\t0x873F, 0xF2EA, 0x8740, 0xCE58, 0x8741, 0xCE59, 0x8742, 0xCE5A,\n\t0x8743, 0xCE5B, 0x8744, 0xCE5C, 0x8745, 0xCE5D, 0x8746, 0xCE5E,\t0x8747, 0xD3AC, 0x8748, 0xF2E5, 0x8749, 0xB2F5, 0x874A, 0xCE5F,\n\t0x874B, 0xCE60, 0x874C, 0xF2F2, 0x874D, 0xCE61, 0x874E, 0xD0AB,\t0x874F, 0xCE62, 0x8750, 0xCE63, 0x8751, 0xCE64, 0x8752, 0xCE65,\n\t0x8753, 0xF2F5, 0x8754, 0xCE66, 0x8755, 0xCE67, 0x8756, 0xCE68,\t0x8757, 0xBBC8, 0x8758, 0xCE69, 0x8759, 0xF2F9, 0x875A, 0xCE6A,\n\t0x875B, 0xCE6B, 0x875C, 0xCE6C, 0x875D, 0xCE6D, 0x875E, 0xCE6E,\t0x875F, 0xCE6F, 0x8760, 0xF2F0, 0x8761, 0xCE70, 0x8762, 0xCE71,\n\t0x8763, 0xF2F6, 0x8764, 0xF2F8, 0x8765, 0xF2FA, 0x8766, 0xCE72,\t0x8767, 0xCE73, 0x8768, 0xCE74, 0x8769, 0xCE75, 0x876A, 0xCE76,\n\t0x876B, 0xCE77, 0x876C, 0xCE78, 0x876D, 0xCE79, 0x876E, 0xF2F3,\t0x876F, 0xCE7A, 0x8770, 0xF2F1, 0x8771, 0xCE7B, 0x8772, 0xCE7C,\n\t0x8773, 0xCE7D, 0x8774, 0xBAFB, 0x8775, 0xCE7E, 0x8776, 0xB5FB,\t0x8777, 0xCE80, 0x8778, 0xCE81, 0x8779, 0xCE82, 0x877A, 0xCE83,\n\t0x877B, 0xF2EF, 0x877C, 0xF2F7, 0x877D, 0xF2ED, 0x877E, 0xF2EE,\t0x877F, 0xCE84, 0x8780, 0xCE85, 0x8781, 0xCE86, 0x8782, 0xF2EB,\n\t0x8783, 0xF3A6, 0x8784, 0xCE87, 0x8785, 0xF3A3, 0x8786, 0xCE88,\t0x8787, 0xCE89, 0x8788, 0xF3A2, 0x8789, 0xCE8A, 0x878A, 0xCE8B,\n\t0x878B, 0xF2F4, 0x878C, 0xCE8C, 0x878D, 0xC8DA, 0x878E, 0xCE8D,\t0x878F, 0xCE8E, 0x8790, 0xCE8F, 0x8791, 0xCE90, 0x8792, 0xCE91,\n\t0x8793, 0xF2FB, 0x8794, 0xCE92, 0x8795, 0xCE93, 0x8796, 0xCE94,\t0x8797, 0xF3A5, 0x8798, 0xCE95, 0x8799, 0xCE96, 0x879A, 0xCE97,\n\t0x879B, 0xCE98, 0x879C, 0xCE99, 0x879D, 0xCE9A, 0x879E, 0xCE9B,\t0x879F, 0xC3F8, 0x87A0, 0xCE9C, 0x87A1, 0xCE9D, 0x87A2, 0xCE9E,\n\t0x87A3, 0xCE9F, 0x87A4, 0xCEA0, 0x87A5, 0xCF40, 0x87A6, 0xCF41,\t0x87A7, 0xCF42, 0x87A8, 0xF2FD, 0x87A9, 0xCF43, 0x87AA, 0xCF44,\n\t0x87AB, 0xF3A7, 0x87AC, 0xF3A9, 0x87AD, 0xF3A4, 0x87AE, 0xCF45,\t0x87AF, 0xF2FC, 0x87B0, 0xCF46, 0x87B1, 0xCF47, 0x87B2, 0xCF48,\n\t0x87B3, 0xF3AB, 0x87B4, 0xCF49, 0x87B5, 0xF3AA, 0x87B6, 0xCF4A,\t0x87B7, 0xCF4B, 0x87B8, 0xCF4C, 0x87B9, 0xCF4D, 0x87BA, 0xC2DD,\n\t0x87BB, 0xCF4E, 0x87BC, 0xCF4F, 0x87BD, 0xF3AE, 0x87BE, 0xCF50,\t0x87BF, 0xCF51, 0x87C0, 0xF3B0, 0x87C1, 0xCF52, 0x87C2, 0xCF53,\n\t0x87C3, 0xCF54, 0x87C4, 0xCF55, 0x87C5, 0xCF56, 0x87C6, 0xF3A1,\t0x87C7, 0xCF57, 0x87C8, 0xCF58, 0x87C9, 0xCF59, 0x87CA, 0xF3B1,\n\t0x87CB, 0xF3AC, 0x87CC, 0xCF5A, 0x87CD, 0xCF5B, 0x87CE, 0xCF5C,\t0x87CF, 0xCF5D, 0x87D0, 0xCF5E, 0x87D1, 0xF3AF, 0x87D2, 0xF2FE,\n\t0x87D3, 0xF3AD, 0x87D4, 0xCF5F, 0x87D5, 0xCF60, 0x87D6, 0xCF61,\t0x87D7, 0xCF62, 0x87D8, 0xCF63, 0x87D9, 0xCF64, 0x87DA, 0xCF65,\n\t0x87DB, 0xF3B2, 0x87DC, 0xCF66, 0x87DD, 0xCF67, 0x87DE, 0xCF68,\t0x87DF, 0xCF69, 0x87E0, 0xF3B4, 0x87E1, 0xCF6A, 0x87E2, 0xCF6B,\n\t0x87E3, 0xCF6C, 0x87E4, 0xCF6D, 0x87E5, 0xF3A8, 0x87E6, 0xCF6E,\t0x87E7, 0xCF6F, 0x87E8, 0xCF70, 0x87E9, 0xCF71, 0x87EA, 0xF3B3,\n\t0x87EB, 0xCF72, 0x87EC, 0xCF73, 0x87ED, 0xCF74, 0x87EE, 0xF3B5,\t0x87EF, 0xCF75, 0x87F0, 0xCF76, 0x87F1, 0xCF77, 0x87F2, 0xCF78,\n\t0x87F3, 0xCF79, 0x87F4, 0xCF7A, 0x87F5, 0xCF7B, 0x87F6, 0xCF7C,\t0x87F7, 0xCF7D, 0x87F8, 0xCF7E, 0x87F9, 0xD0B7, 0x87FA, 0xCF80,\n\t0x87FB, 0xCF81, 0x87FC, 0xCF82, 0x87FD, 0xCF83, 0x87FE, 0xF3B8,\t0x87FF, 0xCF84, 0x8800, 0xCF85, 0x8801, 0xCF86, 0x8802, 0xCF87,\n\t0x8803, 0xD9F9, 0x8804, 0xCF88, 0x8805, 0xCF89, 0x8806, 0xCF8A,\t0x8807, 0xCF8B, 0x8808, 0xCF8C, 0x8809, 0xCF8D, 0x880A, 0xF3B9,\n\t0x880B, 0xCF8E, 0x880C, 0xCF8F, 0x880D, 0xCF90, 0x880E, 0xCF91,\t0x880F, 0xCF92, 0x8810, 0xCF93, 0x8811, 0xCF94, 0x8812, 0xCF95,\n\t0x8813, 0xF3B7, 0x8814, 0xCF96, 0x8815, 0xC8E4, 0x8816, 0xF3B6,\t0x8817, 0xCF97, 0x8818, 0xCF98, 0x8819, 0xCF99, 0x881A, 0xCF9A,\n\t0x881B, 0xF3BA, 0x881C, 0xCF9B, 0x881D, 0xCF9C, 0x881E, 0xCF9D,\t0x881F, 0xCF9E, 0x8820, 0xCF9F, 0x8821, 0xF3BB, 0x8822, 0xB4C0,\n\t0x8823, 0xCFA0, 0x8824, 0xD040, 0x8825, 0xD041, 0x8826, 0xD042,\t0x8827, 0xD043, 0x8828, 0xD044, 0x8829, 0xD045, 0x882A, 0xD046,\n\t0x882B, 0xD047, 0x882C, 0xD048, 0x882D, 0xD049, 0x882E, 0xD04A,\t0x882F, 0xD04B, 0x8830, 0xD04C, 0x8831, 0xD04D, 0x8832, 0xEEC3,\n\t0x8833, 0xD04E, 0x8834, 0xD04F, 0x8835, 0xD050, 0x8836, 0xD051,\t0x8837, 0xD052, 0x8838, 0xD053, 0x8839, 0xF3BC, 0x883A, 0xD054,\n\t0x883B, 0xD055, 0x883C, 0xF3BD, 0x883D, 0xD056, 0x883E, 0xD057,\t0x883F, 0xD058, 0x8840, 0xD1AA, 0x8841, 0xD059, 0x8842, 0xD05A,\n\t0x8843, 0xD05B, 0x8844, 0xF4AC, 0x8845, 0xD0C6, 0x8846, 0xD05C,\t0x8847, 0xD05D, 0x8848, 0xD05E, 0x8849, 0xD05F, 0x884A, 0xD060,\n\t0x884B, 0xD061, 0x884C, 0xD0D0, 0x884D, 0xD1DC, 0x884E, 0xD062,\t0x884F, 0xD063, 0x8850, 0xD064, 0x8851, 0xD065, 0x8852, 0xD066,\n\t0x8853, 0xD067, 0x8854, 0xCFCE, 0x8855, 0xD068, 0x8856, 0xD069,\t0x8857, 0xBDD6, 0x8858, 0xD06A, 0x8859, 0xD1C3, 0x885A, 0xD06B,\n\t0x885B, 0xD06C, 0x885C, 0xD06D, 0x885D, 0xD06E, 0x885E, 0xD06F,\t0x885F, 0xD070, 0x8860, 0xD071, 0x8861, 0xBAE2, 0x8862, 0xE1E9,\n\t0x8863, 0xD2C2, 0x8864, 0xF1C2, 0x8865, 0xB2B9, 0x8866, 0xD072,\t0x8867, 0xD073, 0x8868, 0xB1ED, 0x8869, 0xF1C3, 0x886A, 0xD074,\n\t0x886B, 0xC9C0, 0x886C, 0xB3C4, 0x886D, 0xD075, 0x886E, 0xD9F2,\t0x886F, 0xD076, 0x8870, 0xCBA5, 0x8871, 0xD077, 0x8872, 0xF1C4,\n\t0x8873, 0xD078, 0x8874, 0xD079, 0x8875, 0xD07A, 0x8876, 0xD07B,\t0x8877, 0xD6D4, 0x8878, 0xD07C, 0x8879, 0xD07D, 0x887A, 0xD07E,\n\t0x887B, 0xD080, 0x887C, 0xD081, 0x887D, 0xF1C5, 0x887E, 0xF4C0,\t0x887F, 0xF1C6, 0x8880, 0xD082, 0x8881, 0xD4AC, 0x8882, 0xF1C7,\n\t0x8883, 0xD083, 0x8884, 0xB0C0, 0x8885, 0xF4C1, 0x8886, 0xD084,\t0x8887, 0xD085, 0x8888, 0xF4C2, 0x8889, 0xD086, 0x888A, 0xD087,\n\t0x888B, 0xB4FC, 0x888C, 0xD088, 0x888D, 0xC5DB, 0x888E, 0xD089,\t0x888F, 0xD08A, 0x8890, 0xD08B, 0x8891, 0xD08C, 0x8892, 0xCCBB,\n\t0x8893, 0xD08D, 0x8894, 0xD08E, 0x8895, 0xD08F, 0x8896, 0xD0E4,\t0x8897, 0xD090, 0x8898, 0xD091, 0x8899, 0xD092, 0x889A, 0xD093,\n\t0x889B, 0xD094, 0x889C, 0xCDE0, 0x889D, 0xD095, 0x889E, 0xD096,\t0x889F, 0xD097, 0x88A0, 0xD098, 0x88A1, 0xD099, 0x88A2, 0xF1C8,\n\t0x88A3, 0xD09A, 0x88A4, 0xD9F3, 0x88A5, 0xD09B, 0x88A6, 0xD09C,\t0x88A7, 0xD09D, 0x88A8, 0xD09E, 0x88A9, 0xD09F, 0x88AA, 0xD0A0,\n\t0x88AB, 0xB1BB, 0x88AC, 0xD140, 0x88AD, 0xCFAE, 0x88AE, 0xD141,\t0x88AF, 0xD142, 0x88B0, 0xD143, 0x88B1, 0xB8A4, 0x88B2, 0xD144,\n\t0x88B3, 0xD145, 0x88B4, 0xD146, 0x88B5, 0xD147, 0x88B6, 0xD148,\t0x88B7, 0xF1CA, 0x88B8, 0xD149, 0x88B9, 0xD14A, 0x88BA, 0xD14B,\n\t0x88BB, 0xD14C, 0x88BC, 0xF1CB, 0x88BD, 0xD14D, 0x88BE, 0xD14E,\t0x88BF, 0xD14F, 0x88C0, 0xD150, 0x88C1, 0xB2C3, 0x88C2, 0xC1D1,\n\t0x88C3, 0xD151, 0x88C4, 0xD152, 0x88C5, 0xD7B0, 0x88C6, 0xF1C9,\t0x88C7, 0xD153, 0x88C8, 0xD154, 0x88C9, 0xF1CC, 0x88CA, 0xD155,\n\t0x88CB, 0xD156, 0x88CC, 0xD157, 0x88CD, 0xD158, 0x88CE, 0xF1CE,\t0x88CF, 0xD159, 0x88D0, 0xD15A, 0x88D1, 0xD15B, 0x88D2, 0xD9F6,\n\t0x88D3, 0xD15C, 0x88D4, 0xD2E1, 0x88D5, 0xD4A3, 0x88D6, 0xD15D,\t0x88D7, 0xD15E, 0x88D8, 0xF4C3, 0x88D9, 0xC8B9, 0x88DA, 0xD15F,\n\t0x88DB, 0xD160, 0x88DC, 0xD161, 0x88DD, 0xD162, 0x88DE, 0xD163,\t0x88DF, 0xF4C4, 0x88E0, 0xD164, 0x88E1, 0xD165, 0x88E2, 0xF1CD,\n\t0x88E3, 0xF1CF, 0x88E4, 0xBFE3, 0x88E5, 0xF1D0, 0x88E6, 0xD166,\t0x88E7, 0xD167, 0x88E8, 0xF1D4, 0x88E9, 0xD168, 0x88EA, 0xD169,\n\t0x88EB, 0xD16A, 0x88EC, 0xD16B, 0x88ED, 0xD16C, 0x88EE, 0xD16D,\t0x88EF, 0xD16E, 0x88F0, 0xF1D6, 0x88F1, 0xF1D1, 0x88F2, 0xD16F,\n\t0x88F3, 0xC9D1, 0x88F4, 0xC5E1, 0x88F5, 0xD170, 0x88F6, 0xD171,\t0x88F7, 0xD172, 0x88F8, 0xC2E3, 0x88F9, 0xB9FC, 0x88FA, 0xD173,\n\t0x88FB, 0xD174, 0x88FC, 0xF1D3, 0x88FD, 0xD175, 0x88FE, 0xF1D5,\t0x88FF, 0xD176, 0x8900, 0xD177, 0x8901, 0xD178, 0x8902, 0xB9D3,\n\t0x8903, 0xD179, 0x8904, 0xD17A, 0x8905, 0xD17B, 0x8906, 0xD17C,\t0x8907, 0xD17D, 0x8908, 0xD17E, 0x8909, 0xD180, 0x890A, 0xF1DB,\n\t0x890B, 0xD181, 0x890C, 0xD182, 0x890D, 0xD183, 0x890E, 0xD184,\t0x890F, 0xD185, 0x8910, 0xBAD6, 0x8911, 0xD186, 0x8912, 0xB0FD,\n\t0x8913, 0xF1D9, 0x8914, 0xD187, 0x8915, 0xD188, 0x8916, 0xD189,\t0x8917, 0xD18A, 0x8918, 0xD18B, 0x8919, 0xF1D8, 0x891A, 0xF1D2,\n\t0x891B, 0xF1DA, 0x891C, 0xD18C, 0x891D, 0xD18D, 0x891E, 0xD18E,\t0x891F, 0xD18F, 0x8920, 0xD190, 0x8921, 0xF1D7, 0x8922, 0xD191,\n\t0x8923, 0xD192, 0x8924, 0xD193, 0x8925, 0xC8EC, 0x8926, 0xD194,\t0x8927, 0xD195, 0x8928, 0xD196, 0x8929, 0xD197, 0x892A, 0xCDCA,\n\t0x892B, 0xF1DD, 0x892C, 0xD198, 0x892D, 0xD199, 0x892E, 0xD19A,\t0x892F, 0xD19B, 0x8930, 0xE5BD, 0x8931, 0xD19C, 0x8932, 0xD19D,\n\t0x8933, 0xD19E, 0x8934, 0xF1DC, 0x8935, 0xD19F, 0x8936, 0xF1DE,\t0x8937, 0xD1A0, 0x8938, 0xD240, 0x8939, 0xD241, 0x893A, 0xD242,\n\t0x893B, 0xD243, 0x893C, 0xD244, 0x893D, 0xD245, 0x893E, 0xD246,\t0x893F, 0xD247, 0x8940, 0xD248, 0x8941, 0xF1DF, 0x8942, 0xD249,\n\t0x8943, 0xD24A, 0x8944, 0xCFE5, 0x8945, 0xD24B, 0x8946, 0xD24C,\t0x8947, 0xD24D, 0x8948, 0xD24E, 0x8949, 0xD24F, 0x894A, 0xD250,\n\t0x894B, 0xD251, 0x894C, 0xD252, 0x894D, 0xD253, 0x894E, 0xD254,\t0x894F, 0xD255, 0x8950, 0xD256, 0x8951, 0xD257, 0x8952, 0xD258,\n\t0x8953, 0xD259, 0x8954, 0xD25A, 0x8955, 0xD25B, 0x8956, 0xD25C,\t0x8957, 0xD25D, 0x8958, 0xD25E, 0x8959, 0xD25F, 0x895A, 0xD260,\n\t0x895B, 0xD261, 0x895C, 0xD262, 0x895D, 0xD263, 0x895E, 0xF4C5,\t0x895F, 0xBDF3, 0x8960, 0xD264, 0x8961, 0xD265, 0x8962, 0xD266,\n\t0x8963, 0xD267, 0x8964, 0xD268, 0x8965, 0xD269, 0x8966, 0xF1E0,\t0x8967, 0xD26A, 0x8968, 0xD26B, 0x8969, 0xD26C, 0x896A, 0xD26D,\n\t0x896B, 0xD26E, 0x896C, 0xD26F, 0x896D, 0xD270, 0x896E, 0xD271,\t0x896F, 0xD272, 0x8970, 0xD273, 0x8971, 0xD274, 0x8972, 0xD275,\n\t0x8973, 0xD276, 0x8974, 0xD277, 0x8975, 0xD278, 0x8976, 0xD279,\t0x8977, 0xD27A, 0x8978, 0xD27B, 0x8979, 0xD27C, 0x897A, 0xD27D,\n\t0x897B, 0xF1E1, 0x897C, 0xD27E, 0x897D, 0xD280, 0x897E, 0xD281,\t0x897F, 0xCEF7, 0x8980, 0xD282, 0x8981, 0xD2AA, 0x8982, 0xD283,\n\t0x8983, 0xF1FB, 0x8984, 0xD284, 0x8985, 0xD285, 0x8986, 0xB8B2,\t0x8987, 0xD286, 0x8988, 0xD287, 0x8989, 0xD288, 0x898A, 0xD289,\n\t0x898B, 0xD28A, 0x898C, 0xD28B, 0x898D, 0xD28C, 0x898E, 0xD28D,\t0x898F, 0xD28E, 0x8990, 0xD28F, 0x8991, 0xD290, 0x8992, 0xD291,\n\t0x8993, 0xD292, 0x8994, 0xD293, 0x8995, 0xD294, 0x8996, 0xD295,\t0x8997, 0xD296, 0x8998, 0xD297, 0x8999, 0xD298, 0x899A, 0xD299,\n\t0x899B, 0xD29A, 0x899C, 0xD29B, 0x899D, 0xD29C, 0x899E, 0xD29D,\t0x899F, 0xD29E, 0x89A0, 0xD29F, 0x89A1, 0xD2A0, 0x89A2, 0xD340,\n\t0x89A3, 0xD341, 0x89A4, 0xD342, 0x89A5, 0xD343, 0x89A6, 0xD344,\t0x89A7, 0xD345, 0x89A8, 0xD346, 0x89A9, 0xD347, 0x89AA, 0xD348,\n\t0x89AB, 0xD349, 0x89AC, 0xD34A, 0x89AD, 0xD34B, 0x89AE, 0xD34C,\t0x89AF, 0xD34D, 0x89B0, 0xD34E, 0x89B1, 0xD34F, 0x89B2, 0xD350,\n\t0x89B3, 0xD351, 0x89B4, 0xD352, 0x89B5, 0xD353, 0x89B6, 0xD354,\t0x89B7, 0xD355, 0x89B8, 0xD356, 0x89B9, 0xD357, 0x89BA, 0xD358,\n\t0x89BB, 0xD359, 0x89BC, 0xD35A, 0x89BD, 0xD35B, 0x89BE, 0xD35C,\t0x89BF, 0xD35D, 0x89C0, 0xD35E, 0x89C1, 0xBCFB, 0x89C2, 0xB9DB,\n\t0x89C3, 0xD35F, 0x89C4, 0xB9E6, 0x89C5, 0xC3D9, 0x89C6, 0xCAD3,\t0x89C7, 0xEAE8, 0x89C8, 0xC0C0, 0x89C9, 0xBEF5, 0x89CA, 0xEAE9,\n\t0x89CB, 0xEAEA, 0x89CC, 0xEAEB, 0x89CD, 0xD360, 0x89CE, 0xEAEC,\t0x89CF, 0xEAED, 0x89D0, 0xEAEE, 0x89D1, 0xEAEF, 0x89D2, 0xBDC7,\n\t0x89D3, 0xD361, 0x89D4, 0xD362, 0x89D5, 0xD363, 0x89D6, 0xF5FB,\t0x89D7, 0xD364, 0x89D8, 0xD365, 0x89D9, 0xD366, 0x89DA, 0xF5FD,\n\t0x89DB, 0xD367, 0x89DC, 0xF5FE, 0x89DD, 0xD368, 0x89DE, 0xF5FC,\t0x89DF, 0xD369, 0x89E0, 0xD36A, 0x89E1, 0xD36B, 0x89E2, 0xD36C,\n\t0x89E3, 0xBDE2, 0x89E4, 0xD36D, 0x89E5, 0xF6A1, 0x89E6, 0xB4A5,\t0x89E7, 0xD36E, 0x89E8, 0xD36F, 0x89E9, 0xD370, 0x89EA, 0xD371,\n\t0x89EB, 0xF6A2, 0x89EC, 0xD372, 0x89ED, 0xD373, 0x89EE, 0xD374,\t0x89EF, 0xF6A3, 0x89F0, 0xD375, 0x89F1, 0xD376, 0x89F2, 0xD377,\n\t0x89F3, 0xECB2, 0x89F4, 0xD378, 0x89F5, 0xD379, 0x89F6, 0xD37A,\t0x89F7, 0xD37B, 0x89F8, 0xD37C, 0x89F9, 0xD37D, 0x89FA, 0xD37E,\n\t0x89FB, 0xD380, 0x89FC, 0xD381, 0x89FD, 0xD382, 0x89FE, 0xD383,\t0x89FF, 0xD384, 0x8A00, 0xD1D4, 0x8A01, 0xD385, 0x8A02, 0xD386,\n\t0x8A03, 0xD387, 0x8A04, 0xD388, 0x8A05, 0xD389, 0x8A06, 0xD38A,\t0x8A07, 0xD9EA, 0x8A08, 0xD38B, 0x8A09, 0xD38C, 0x8A0A, 0xD38D,\n\t0x8A0B, 0xD38E, 0x8A0C, 0xD38F, 0x8A0D, 0xD390, 0x8A0E, 0xD391,\t0x8A0F, 0xD392, 0x8A10, 0xD393, 0x8A11, 0xD394, 0x8A12, 0xD395,\n\t0x8A13, 0xD396, 0x8A14, 0xD397, 0x8A15, 0xD398, 0x8A16, 0xD399,\t0x8A17, 0xD39A, 0x8A18, 0xD39B, 0x8A19, 0xD39C, 0x8A1A, 0xD39D,\n\t0x8A1B, 0xD39E, 0x8A1C, 0xD39F, 0x8A1D, 0xD3A0, 0x8A1E, 0xD440,\t0x8A1F, 0xD441, 0x8A20, 0xD442, 0x8A21, 0xD443, 0x8A22, 0xD444,\n\t0x8A23, 0xD445, 0x8A24, 0xD446, 0x8A25, 0xD447, 0x8A26, 0xD448,\t0x8A27, 0xD449, 0x8A28, 0xD44A, 0x8A29, 0xD44B, 0x8A2A, 0xD44C,\n\t0x8A2B, 0xD44D, 0x8A2C, 0xD44E, 0x8A2D, 0xD44F, 0x8A2E, 0xD450,\t0x8A2F, 0xD451, 0x8A30, 0xD452, 0x8A31, 0xD453, 0x8A32, 0xD454,\n\t0x8A33, 0xD455, 0x8A34, 0xD456, 0x8A35, 0xD457, 0x8A36, 0xD458,\t0x8A37, 0xD459, 0x8A38, 0xD45A, 0x8A39, 0xD45B, 0x8A3A, 0xD45C,\n\t0x8A3B, 0xD45D, 0x8A3C, 0xD45E, 0x8A3D, 0xD45F, 0x8A3E, 0xF6A4,\t0x8A3F, 0xD460, 0x8A40, 0xD461, 0x8A41, 0xD462, 0x8A42, 0xD463,\n\t0x8A43, 0xD464, 0x8A44, 0xD465, 0x8A45, 0xD466, 0x8A46, 0xD467,\t0x8A47, 0xD468, 0x8A48, 0xEEBA, 0x8A49, 0xD469, 0x8A4A, 0xD46A,\n\t0x8A4B, 0xD46B, 0x8A4C, 0xD46C, 0x8A4D, 0xD46D, 0x8A4E, 0xD46E,\t0x8A4F, 0xD46F, 0x8A50, 0xD470, 0x8A51, 0xD471, 0x8A52, 0xD472,\n\t0x8A53, 0xD473, 0x8A54, 0xD474, 0x8A55, 0xD475, 0x8A56, 0xD476,\t0x8A57, 0xD477, 0x8A58, 0xD478, 0x8A59, 0xD479, 0x8A5A, 0xD47A,\n\t0x8A5B, 0xD47B, 0x8A5C, 0xD47C, 0x8A5D, 0xD47D, 0x8A5E, 0xD47E,\t0x8A5F, 0xD480, 0x8A60, 0xD481, 0x8A61, 0xD482, 0x8A62, 0xD483,\n\t0x8A63, 0xD484, 0x8A64, 0xD485, 0x8A65, 0xD486, 0x8A66, 0xD487,\t0x8A67, 0xD488, 0x8A68, 0xD489, 0x8A69, 0xD48A, 0x8A6A, 0xD48B,\n\t0x8A6B, 0xD48C, 0x8A6C, 0xD48D, 0x8A6D, 0xD48E, 0x8A6E, 0xD48F,\t0x8A6F, 0xD490, 0x8A70, 0xD491, 0x8A71, 0xD492, 0x8A72, 0xD493,\n\t0x8A73, 0xD494, 0x8A74, 0xD495, 0x8A75, 0xD496, 0x8A76, 0xD497,\t0x8A77, 0xD498, 0x8A78, 0xD499, 0x8A79, 0xD5B2, 0x8A7A, 0xD49A,\n\t0x8A7B, 0xD49B, 0x8A7C, 0xD49C, 0x8A7D, 0xD49D, 0x8A7E, 0xD49E,\t0x8A7F, 0xD49F, 0x8A80, 0xD4A0, 0x8A81, 0xD540, 0x8A82, 0xD541,\n\t0x8A83, 0xD542, 0x8A84, 0xD543, 0x8A85, 0xD544, 0x8A86, 0xD545,\t0x8A87, 0xD546, 0x8A88, 0xD547, 0x8A89, 0xD3FE, 0x8A8A, 0xCCDC,\n\t0x8A8B, 0xD548, 0x8A8C, 0xD549, 0x8A8D, 0xD54A, 0x8A8E, 0xD54B,\t0x8A8F, 0xD54C, 0x8A90, 0xD54D, 0x8A91, 0xD54E, 0x8A92, 0xD54F,\n\t0x8A93, 0xCAC4, 0x8A94, 0xD550, 0x8A95, 0xD551, 0x8A96, 0xD552,\t0x8A97, 0xD553, 0x8A98, 0xD554, 0x8A99, 0xD555, 0x8A9A, 0xD556,\n\t0x8A9B, 0xD557, 0x8A9C, 0xD558, 0x8A9D, 0xD559, 0x8A9E, 0xD55A,\t0x8A9F, 0xD55B, 0x8AA0, 0xD55C, 0x8AA1, 0xD55D, 0x8AA2, 0xD55E,\n\t0x8AA3, 0xD55F, 0x8AA4, 0xD560, 0x8AA5, 0xD561, 0x8AA6, 0xD562,\t0x8AA7, 0xD563, 0x8AA8, 0xD564, 0x8AA9, 0xD565, 0x8AAA, 0xD566,\n\t0x8AAB, 0xD567, 0x8AAC, 0xD568, 0x8AAD, 0xD569, 0x8AAE, 0xD56A,\t0x8AAF, 0xD56B, 0x8AB0, 0xD56C, 0x8AB1, 0xD56D, 0x8AB2, 0xD56E,\n\t0x8AB3, 0xD56F, 0x8AB4, 0xD570, 0x8AB5, 0xD571, 0x8AB6, 0xD572,\t0x8AB7, 0xD573, 0x8AB8, 0xD574, 0x8AB9, 0xD575, 0x8ABA, 0xD576,\n\t0x8ABB, 0xD577, 0x8ABC, 0xD578, 0x8ABD, 0xD579, 0x8ABE, 0xD57A,\t0x8ABF, 0xD57B, 0x8AC0, 0xD57C, 0x8AC1, 0xD57D, 0x8AC2, 0xD57E,\n\t0x8AC3, 0xD580, 0x8AC4, 0xD581, 0x8AC5, 0xD582, 0x8AC6, 0xD583,\t0x8AC7, 0xD584, 0x8AC8, 0xD585, 0x8AC9, 0xD586, 0x8ACA, 0xD587,\n\t0x8ACB, 0xD588, 0x8ACC, 0xD589, 0x8ACD, 0xD58A, 0x8ACE, 0xD58B,\t0x8ACF, 0xD58C, 0x8AD0, 0xD58D, 0x8AD1, 0xD58E, 0x8AD2, 0xD58F,\n\t0x8AD3, 0xD590, 0x8AD4, 0xD591, 0x8AD5, 0xD592, 0x8AD6, 0xD593,\t0x8AD7, 0xD594, 0x8AD8, 0xD595, 0x8AD9, 0xD596, 0x8ADA, 0xD597,\n\t0x8ADB, 0xD598, 0x8ADC, 0xD599, 0x8ADD, 0xD59A, 0x8ADE, 0xD59B,\t0x8ADF, 0xD59C, 0x8AE0, 0xD59D, 0x8AE1, 0xD59E, 0x8AE2, 0xD59F,\n\t0x8AE3, 0xD5A0, 0x8AE4, 0xD640, 0x8AE5, 0xD641, 0x8AE6, 0xD642,\t0x8AE7, 0xD643, 0x8AE8, 0xD644, 0x8AE9, 0xD645, 0x8AEA, 0xD646,\n\t0x8AEB, 0xD647, 0x8AEC, 0xD648, 0x8AED, 0xD649, 0x8AEE, 0xD64A,\t0x8AEF, 0xD64B, 0x8AF0, 0xD64C, 0x8AF1, 0xD64D, 0x8AF2, 0xD64E,\n\t0x8AF3, 0xD64F, 0x8AF4, 0xD650, 0x8AF5, 0xD651, 0x8AF6, 0xD652,\t0x8AF7, 0xD653, 0x8AF8, 0xD654, 0x8AF9, 0xD655, 0x8AFA, 0xD656,\n\t0x8AFB, 0xD657, 0x8AFC, 0xD658, 0x8AFD, 0xD659, 0x8AFE, 0xD65A,\t0x8AFF, 0xD65B, 0x8B00, 0xD65C, 0x8B01, 0xD65D, 0x8B02, 0xD65E,\n\t0x8B03, 0xD65F, 0x8B04, 0xD660, 0x8B05, 0xD661, 0x8B06, 0xD662,\t0x8B07, 0xE5C0, 0x8B08, 0xD663, 0x8B09, 0xD664, 0x8B0A, 0xD665,\n\t0x8B0B, 0xD666, 0x8B0C, 0xD667, 0x8B0D, 0xD668, 0x8B0E, 0xD669,\t0x8B0F, 0xD66A, 0x8B10, 0xD66B, 0x8B11, 0xD66C, 0x8B12, 0xD66D,\n\t0x8B13, 0xD66E, 0x8B14, 0xD66F, 0x8B15, 0xD670, 0x8B16, 0xD671,\t0x8B17, 0xD672, 0x8B18, 0xD673, 0x8B19, 0xD674, 0x8B1A, 0xD675,\n\t0x8B1B, 0xD676, 0x8B1C, 0xD677, 0x8B1D, 0xD678, 0x8B1E, 0xD679,\t0x8B1F, 0xD67A, 0x8B20, 0xD67B, 0x8B21, 0xD67C, 0x8B22, 0xD67D,\n\t0x8B23, 0xD67E, 0x8B24, 0xD680, 0x8B25, 0xD681, 0x8B26, 0xF6A5,\t0x8B27, 0xD682, 0x8B28, 0xD683, 0x8B29, 0xD684, 0x8B2A, 0xD685,\n\t0x8B2B, 0xD686, 0x8B2C, 0xD687, 0x8B2D, 0xD688, 0x8B2E, 0xD689,\t0x8B2F, 0xD68A, 0x8B30, 0xD68B, 0x8B31, 0xD68C, 0x8B32, 0xD68D,\n\t0x8B33, 0xD68E, 0x8B34, 0xD68F, 0x8B35, 0xD690, 0x8B36, 0xD691,\t0x8B37, 0xD692, 0x8B38, 0xD693, 0x8B39, 0xD694, 0x8B3A, 0xD695,\n\t0x8B3B, 0xD696, 0x8B3C, 0xD697, 0x8B3D, 0xD698, 0x8B3E, 0xD699,\t0x8B3F, 0xD69A, 0x8B40, 0xD69B, 0x8B41, 0xD69C, 0x8B42, 0xD69D,\n\t0x8B43, 0xD69E, 0x8B44, 0xD69F, 0x8B45, 0xD6A0, 0x8B46, 0xD740,\t0x8B47, 0xD741, 0x8B48, 0xD742, 0x8B49, 0xD743, 0x8B4A, 0xD744,\n\t0x8B4B, 0xD745, 0x8B4C, 0xD746, 0x8B4D, 0xD747, 0x8B4E, 0xD748,\t0x8B4F, 0xD749, 0x8B50, 0xD74A, 0x8B51, 0xD74B, 0x8B52, 0xD74C,\n\t0x8B53, 0xD74D, 0x8B54, 0xD74E, 0x8B55, 0xD74F, 0x8B56, 0xD750,\t0x8B57, 0xD751, 0x8B58, 0xD752, 0x8B59, 0xD753, 0x8B5A, 0xD754,\n\t0x8B5B, 0xD755, 0x8B5C, 0xD756, 0x8B5D, 0xD757, 0x8B5E, 0xD758,\t0x8B5F, 0xD759, 0x8B60, 0xD75A, 0x8B61, 0xD75B, 0x8B62, 0xD75C,\n\t0x8B63, 0xD75D, 0x8B64, 0xD75E, 0x8B65, 0xD75F, 0x8B66, 0xBEAF,\t0x8B67, 0xD760, 0x8B68, 0xD761, 0x8B69, 0xD762, 0x8B6A, 0xD763,\n\t0x8B6B, 0xD764, 0x8B6C, 0xC6A9, 0x8B6D, 0xD765, 0x8B6E, 0xD766,\t0x8B6F, 0xD767, 0x8B70, 0xD768, 0x8B71, 0xD769, 0x8B72, 0xD76A,\n\t0x8B73, 0xD76B, 0x8B74, 0xD76C, 0x8B75, 0xD76D, 0x8B76, 0xD76E,\t0x8B77, 0xD76F, 0x8B78, 0xD770, 0x8B79, 0xD771, 0x8B7A, 0xD772,\n\t0x8B7B, 0xD773, 0x8B7C, 0xD774, 0x8B7D, 0xD775, 0x8B7E, 0xD776,\t0x8B7F, 0xD777, 0x8B80, 0xD778, 0x8B81, 0xD779, 0x8B82, 0xD77A,\n\t0x8B83, 0xD77B, 0x8B84, 0xD77C, 0x8B85, 0xD77D, 0x8B86, 0xD77E,\t0x8B87, 0xD780, 0x8B88, 0xD781, 0x8B89, 0xD782, 0x8B8A, 0xD783,\n\t0x8B8B, 0xD784, 0x8B8C, 0xD785, 0x8B8D, 0xD786, 0x8B8E, 0xD787,\t0x8B8F, 0xD788, 0x8B90, 0xD789, 0x8B91, 0xD78A, 0x8B92, 0xD78B,\n\t0x8B93, 0xD78C, 0x8B94, 0xD78D, 0x8B95, 0xD78E, 0x8B96, 0xD78F,\t0x8B97, 0xD790, 0x8B98, 0xD791, 0x8B99, 0xD792, 0x8B9A, 0xD793,\n\t0x8B9B, 0xD794, 0x8B9C, 0xD795, 0x8B9D, 0xD796, 0x8B9E, 0xD797,\t0x8B9F, 0xD798, 0x8BA0, 0xDAA5, 0x8BA1, 0xBCC6, 0x8BA2, 0xB6A9,\n\t0x8BA3, 0xB8BC, 0x8BA4, 0xC8CF, 0x8BA5, 0xBCA5, 0x8BA6, 0xDAA6,\t0x8BA7, 0xDAA7, 0x8BA8, 0xCCD6, 0x8BA9, 0xC8C3, 0x8BAA, 0xDAA8,\n\t0x8BAB, 0xC6FD, 0x8BAC, 0xD799, 0x8BAD, 0xD1B5, 0x8BAE, 0xD2E9,\t0x8BAF, 0xD1B6, 0x8BB0, 0xBCC7, 0x8BB1, 0xD79A, 0x8BB2, 0xBDB2,\n\t0x8BB3, 0xBBE4, 0x8BB4, 0xDAA9, 0x8BB5, 0xDAAA, 0x8BB6, 0xD1C8,\t0x8BB7, 0xDAAB, 0x8BB8, 0xD0ED, 0x8BB9, 0xB6EF, 0x8BBA, 0xC2DB,\n\t0x8BBB, 0xD79B, 0x8BBC, 0xCBCF, 0x8BBD, 0xB7ED, 0x8BBE, 0xC9E8,\t0x8BBF, 0xB7C3, 0x8BC0, 0xBEF7, 0x8BC1, 0xD6A4, 0x8BC2, 0xDAAC,\n\t0x8BC3, 0xDAAD, 0x8BC4, 0xC6C0, 0x8BC5, 0xD7E7, 0x8BC6, 0xCAB6,\t0x8BC7, 0xD79C, 0x8BC8, 0xD5A9, 0x8BC9, 0xCBDF, 0x8BCA, 0xD5EF,\n\t0x8BCB, 0xDAAE, 0x8BCC, 0xD6DF, 0x8BCD, 0xB4CA, 0x8BCE, 0xDAB0,\t0x8BCF, 0xDAAF, 0x8BD0, 0xD79D, 0x8BD1, 0xD2EB, 0x8BD2, 0xDAB1,\n\t0x8BD3, 0xDAB2, 0x8BD4, 0xDAB3, 0x8BD5, 0xCAD4, 0x8BD6, 0xDAB4,\t0x8BD7, 0xCAAB, 0x8BD8, 0xDAB5, 0x8BD9, 0xDAB6, 0x8BDA, 0xB3CF,\n\t0x8BDB, 0xD6EF, 0x8BDC, 0xDAB7, 0x8BDD, 0xBBB0, 0x8BDE, 0xB5AE,\t0x8BDF, 0xDAB8, 0x8BE0, 0xDAB9, 0x8BE1, 0xB9EE, 0x8BE2, 0xD1AF,\n\t0x8BE3, 0xD2E8, 0x8BE4, 0xDABA, 0x8BE5, 0xB8C3, 0x8BE6, 0xCFEA,\t0x8BE7, 0xB2EF, 0x8BE8, 0xDABB, 0x8BE9, 0xDABC, 0x8BEA, 0xD79E,\n\t0x8BEB, 0xBDEB, 0x8BEC, 0xCEDC, 0x8BED, 0xD3EF, 0x8BEE, 0xDABD,\t0x8BEF, 0xCEF3, 0x8BF0, 0xDABE, 0x8BF1, 0xD3D5, 0x8BF2, 0xBBE5,\n\t0x8BF3, 0xDABF, 0x8BF4, 0xCBB5, 0x8BF5, 0xCBD0, 0x8BF6, 0xDAC0,\t0x8BF7, 0xC7EB, 0x8BF8, 0xD6EE, 0x8BF9, 0xDAC1, 0x8BFA, 0xC5B5,\n\t0x8BFB, 0xB6C1, 0x8BFC, 0xDAC2, 0x8BFD, 0xB7CC, 0x8BFE, 0xBFCE,\t0x8BFF, 0xDAC3, 0x8C00, 0xDAC4, 0x8C01, 0xCBAD, 0x8C02, 0xDAC5,\n\t0x8C03, 0xB5F7, 0x8C04, 0xDAC6, 0x8C05, 0xC1C2, 0x8C06, 0xD7BB,\t0x8C07, 0xDAC7, 0x8C08, 0xCCB8, 0x8C09, 0xD79F, 0x8C0A, 0xD2EA,\n\t0x8C0B, 0xC4B1, 0x8C0C, 0xDAC8, 0x8C0D, 0xB5FD, 0x8C0E, 0xBBD1,\t0x8C0F, 0xDAC9, 0x8C10, 0xD0B3, 0x8C11, 0xDACA, 0x8C12, 0xDACB,\n\t0x8C13, 0xCEBD, 0x8C14, 0xDACC, 0x8C15, 0xDACD, 0x8C16, 0xDACE,\t0x8C17, 0xB2F7, 0x8C18, 0xDAD1, 0x8C19, 0xDACF, 0x8C1A, 0xD1E8,\n\t0x8C1B, 0xDAD0, 0x8C1C, 0xC3D5, 0x8C1D, 0xDAD2, 0x8C1E, 0xD7A0,\t0x8C1F, 0xDAD3, 0x8C20, 0xDAD4, 0x8C21, 0xDAD5, 0x8C22, 0xD0BB,\n\t0x8C23, 0xD2A5, 0x8C24, 0xB0F9, 0x8C25, 0xDAD6, 0x8C26, 0xC7AB,\t0x8C27, 0xDAD7, 0x8C28, 0xBDF7, 0x8C29, 0xC3A1, 0x8C2A, 0xDAD8,\n\t0x8C2B, 0xDAD9, 0x8C2C, 0xC3FD, 0x8C2D, 0xCCB7, 0x8C2E, 0xDADA,\t0x8C2F, 0xDADB, 0x8C30, 0xC0BE, 0x8C31, 0xC6D7, 0x8C32, 0xDADC,\n\t0x8C33, 0xDADD, 0x8C34, 0xC7B4, 0x8C35, 0xDADE, 0x8C36, 0xDADF,\t0x8C37, 0xB9C8, 0x8C38, 0xD840, 0x8C39, 0xD841, 0x8C3A, 0xD842,\n\t0x8C3B, 0xD843, 0x8C3C, 0xD844, 0x8C3D, 0xD845, 0x8C3E, 0xD846,\t0x8C3F, 0xD847, 0x8C40, 0xD848, 0x8C41, 0xBBED, 0x8C42, 0xD849,\n\t0x8C43, 0xD84A, 0x8C44, 0xD84B, 0x8C45, 0xD84C, 0x8C46, 0xB6B9,\t0x8C47, 0xF4F8, 0x8C48, 0xD84D, 0x8C49, 0xF4F9, 0x8C4A, 0xD84E,\n\t0x8C4B, 0xD84F, 0x8C4C, 0xCDE3, 0x8C4D, 0xD850, 0x8C4E, 0xD851,\t0x8C4F, 0xD852, 0x8C50, 0xD853, 0x8C51, 0xD854, 0x8C52, 0xD855,\n\t0x8C53, 0xD856, 0x8C54, 0xD857, 0x8C55, 0xF5B9, 0x8C56, 0xD858,\t0x8C57, 0xD859, 0x8C58, 0xD85A, 0x8C59, 0xD85B, 0x8C5A, 0xEBE0,\n\t0x8C5B, 0xD85C, 0x8C5C, 0xD85D, 0x8C5D, 0xD85E, 0x8C5E, 0xD85F,\t0x8C5F, 0xD860, 0x8C60, 0xD861, 0x8C61, 0xCFF3, 0x8C62, 0xBBBF,\n\t0x8C63, 0xD862, 0x8C64, 0xD863, 0x8C65, 0xD864, 0x8C66, 0xD865,\t0x8C67, 0xD866, 0x8C68, 0xD867, 0x8C69, 0xD868, 0x8C6A, 0xBAC0,\n\t0x8C6B, 0xD4A5, 0x8C6C, 0xD869, 0x8C6D, 0xD86A, 0x8C6E, 0xD86B,\t0x8C6F, 0xD86C, 0x8C70, 0xD86D, 0x8C71, 0xD86E, 0x8C72, 0xD86F,\n\t0x8C73, 0xE1D9, 0x8C74, 0xD870, 0x8C75, 0xD871, 0x8C76, 0xD872,\t0x8C77, 0xD873, 0x8C78, 0xF5F4, 0x8C79, 0xB1AA, 0x8C7A, 0xB2F2,\n\t0x8C7B, 0xD874, 0x8C7C, 0xD875, 0x8C7D, 0xD876, 0x8C7E, 0xD877,\t0x8C7F, 0xD878, 0x8C80, 0xD879, 0x8C81, 0xD87A, 0x8C82, 0xF5F5,\n\t0x8C83, 0xD87B, 0x8C84, 0xD87C, 0x8C85, 0xF5F7, 0x8C86, 0xD87D,\t0x8C87, 0xD87E, 0x8C88, 0xD880, 0x8C89, 0xBAD1, 0x8C8A, 0xF5F6,\n\t0x8C8B, 0xD881, 0x8C8C, 0xC3B2, 0x8C8D, 0xD882, 0x8C8E, 0xD883,\t0x8C8F, 0xD884, 0x8C90, 0xD885, 0x8C91, 0xD886, 0x8C92, 0xD887,\n\t0x8C93, 0xD888, 0x8C94, 0xF5F9, 0x8C95, 0xD889, 0x8C96, 0xD88A,\t0x8C97, 0xD88B, 0x8C98, 0xF5F8, 0x8C99, 0xD88C, 0x8C9A, 0xD88D,\n\t0x8C9B, 0xD88E, 0x8C9C, 0xD88F, 0x8C9D, 0xD890, 0x8C9E, 0xD891,\t0x8C9F, 0xD892, 0x8CA0, 0xD893, 0x8CA1, 0xD894, 0x8CA2, 0xD895,\n\t0x8CA3, 0xD896, 0x8CA4, 0xD897, 0x8CA5, 0xD898, 0x8CA6, 0xD899,\t0x8CA7, 0xD89A, 0x8CA8, 0xD89B, 0x8CA9, 0xD89C, 0x8CAA, 0xD89D,\n\t0x8CAB, 0xD89E, 0x8CAC, 0xD89F, 0x8CAD, 0xD8A0, 0x8CAE, 0xD940,\t0x8CAF, 0xD941, 0x8CB0, 0xD942, 0x8CB1, 0xD943, 0x8CB2, 0xD944,\n\t0x8CB3, 0xD945, 0x8CB4, 0xD946, 0x8CB5, 0xD947, 0x8CB6, 0xD948,\t0x8CB7, 0xD949, 0x8CB8, 0xD94A, 0x8CB9, 0xD94B, 0x8CBA, 0xD94C,\n\t0x8CBB, 0xD94D, 0x8CBC, 0xD94E, 0x8CBD, 0xD94F, 0x8CBE, 0xD950,\t0x8CBF, 0xD951, 0x8CC0, 0xD952, 0x8CC1, 0xD953, 0x8CC2, 0xD954,\n\t0x8CC3, 0xD955, 0x8CC4, 0xD956, 0x8CC5, 0xD957, 0x8CC6, 0xD958,\t0x8CC7, 0xD959, 0x8CC8, 0xD95A, 0x8CC9, 0xD95B, 0x8CCA, 0xD95C,\n\t0x8CCB, 0xD95D, 0x8CCC, 0xD95E, 0x8CCD, 0xD95F, 0x8CCE, 0xD960,\t0x8CCF, 0xD961, 0x8CD0, 0xD962, 0x8CD1, 0xD963, 0x8CD2, 0xD964,\n\t0x8CD3, 0xD965, 0x8CD4, 0xD966, 0x8CD5, 0xD967, 0x8CD6, 0xD968,\t0x8CD7, 0xD969, 0x8CD8, 0xD96A, 0x8CD9, 0xD96B, 0x8CDA, 0xD96C,\n\t0x8CDB, 0xD96D, 0x8CDC, 0xD96E, 0x8CDD, 0xD96F, 0x8CDE, 0xD970,\t0x8CDF, 0xD971, 0x8CE0, 0xD972, 0x8CE1, 0xD973, 0x8CE2, 0xD974,\n\t0x8CE3, 0xD975, 0x8CE4, 0xD976, 0x8CE5, 0xD977, 0x8CE6, 0xD978,\t0x8CE7, 0xD979, 0x8CE8, 0xD97A, 0x8CE9, 0xD97B, 0x8CEA, 0xD97C,\n\t0x8CEB, 0xD97D, 0x8CEC, 0xD97E, 0x8CED, 0xD980, 0x8CEE, 0xD981,\t0x8CEF, 0xD982, 0x8CF0, 0xD983, 0x8CF1, 0xD984, 0x8CF2, 0xD985,\n\t0x8CF3, 0xD986, 0x8CF4, 0xD987, 0x8CF5, 0xD988, 0x8CF6, 0xD989,\t0x8CF7, 0xD98A, 0x8CF8, 0xD98B, 0x8CF9, 0xD98C, 0x8CFA, 0xD98D,\n\t0x8CFB, 0xD98E, 0x8CFC, 0xD98F, 0x8CFD, 0xD990, 0x8CFE, 0xD991,\t0x8CFF, 0xD992, 0x8D00, 0xD993, 0x8D01, 0xD994, 0x8D02, 0xD995,\n\t0x8D03, 0xD996, 0x8D04, 0xD997, 0x8D05, 0xD998, 0x8D06, 0xD999,\t0x8D07, 0xD99A, 0x8D08, 0xD99B, 0x8D09, 0xD99C, 0x8D0A, 0xD99D,\n\t0x8D0B, 0xD99E, 0x8D0C, 0xD99F, 0x8D0D, 0xD9A0, 0x8D0E, 0xDA40,\t0x8D0F, 0xDA41, 0x8D10, 0xDA42, 0x8D11, 0xDA43, 0x8D12, 0xDA44,\n\t0x8D13, 0xDA45, 0x8D14, 0xDA46, 0x8D15, 0xDA47, 0x8D16, 0xDA48,\t0x8D17, 0xDA49, 0x8D18, 0xDA4A, 0x8D19, 0xDA4B, 0x8D1A, 0xDA4C,\n\t0x8D1B, 0xDA4D, 0x8D1C, 0xDA4E, 0x8D1D, 0xB1B4, 0x8D1E, 0xD5EA,\t0x8D1F, 0xB8BA, 0x8D20, 0xDA4F, 0x8D21, 0xB9B1, 0x8D22, 0xB2C6,\n\t0x8D23, 0xD4F0, 0x8D24, 0xCFCD, 0x8D25, 0xB0DC, 0x8D26, 0xD5CB,\t0x8D27, 0xBBF5, 0x8D28, 0xD6CA, 0x8D29, 0xB7B7, 0x8D2A, 0xCCB0,\n\t0x8D2B, 0xC6B6, 0x8D2C, 0xB1E1, 0x8D2D, 0xB9BA, 0x8D2E, 0xD6FC,\t0x8D2F, 0xB9E1, 0x8D30, 0xB7A1, 0x8D31, 0xBCFA, 0x8D32, 0xEADA,\n\t0x8D33, 0xEADB, 0x8D34, 0xCCF9, 0x8D35, 0xB9F3, 0x8D36, 0xEADC,\t0x8D37, 0xB4FB, 0x8D38, 0xC3B3, 0x8D39, 0xB7D1, 0x8D3A, 0xBAD8,\n\t0x8D3B, 0xEADD, 0x8D3C, 0xD4F4, 0x8D3D, 0xEADE, 0x8D3E, 0xBCD6,\t0x8D3F, 0xBBDF, 0x8D40, 0xEADF, 0x8D41, 0xC1DE, 0x8D42, 0xC2B8,\n\t0x8D43, 0xD4DF, 0x8D44, 0xD7CA, 0x8D45, 0xEAE0, 0x8D46, 0xEAE1,\t0x8D47, 0xEAE4, 0x8D48, 0xEAE2, 0x8D49, 0xEAE3, 0x8D4A, 0xC9DE,\n\t0x8D4B, 0xB8B3, 0x8D4C, 0xB6C4, 0x8D4D, 0xEAE5, 0x8D4E, 0xCAEA,\t0x8D4F, 0xC9CD, 0x8D50, 0xB4CD, 0x8D51, 0xDA50, 0x8D52, 0xDA51,\n\t0x8D53, 0xE2D9, 0x8D54, 0xC5E2, 0x8D55, 0xEAE6, 0x8D56, 0xC0B5,\t0x8D57, 0xDA52, 0x8D58, 0xD7B8, 0x8D59, 0xEAE7, 0x8D5A, 0xD7AC,\n\t0x8D5B, 0xC8FC, 0x8D5C, 0xD8D3, 0x8D5D, 0xD8CD, 0x8D5E, 0xD4DE,\t0x8D5F, 0xDA53, 0x8D60, 0xD4F9, 0x8D61, 0xC9C4, 0x8D62, 0xD3AE,\n\t0x8D63, 0xB8D3, 0x8D64, 0xB3E0, 0x8D65, 0xDA54, 0x8D66, 0xC9E2,\t0x8D67, 0xF4F6, 0x8D68, 0xDA55, 0x8D69, 0xDA56, 0x8D6A, 0xDA57,\n\t0x8D6B, 0xBAD5, 0x8D6C, 0xDA58, 0x8D6D, 0xF4F7, 0x8D6E, 0xDA59,\t0x8D6F, 0xDA5A, 0x8D70, 0xD7DF, 0x8D71, 0xDA5B, 0x8D72, 0xDA5C,\n\t0x8D73, 0xF4F1, 0x8D74, 0xB8B0, 0x8D75, 0xD5D4, 0x8D76, 0xB8CF,\t0x8D77, 0xC6F0, 0x8D78, 0xDA5D, 0x8D79, 0xDA5E, 0x8D7A, 0xDA5F,\n\t0x8D7B, 0xDA60, 0x8D7C, 0xDA61, 0x8D7D, 0xDA62, 0x8D7E, 0xDA63,\t0x8D7F, 0xDA64, 0x8D80, 0xDA65, 0x8D81, 0xB3C3, 0x8D82, 0xDA66,\n\t0x8D83, 0xDA67, 0x8D84, 0xF4F2, 0x8D85, 0xB3AC, 0x8D86, 0xDA68,\t0x8D87, 0xDA69, 0x8D88, 0xDA6A, 0x8D89, 0xDA6B, 0x8D8A, 0xD4BD,\n\t0x8D8B, 0xC7F7, 0x8D8C, 0xDA6C, 0x8D8D, 0xDA6D, 0x8D8E, 0xDA6E,\t0x8D8F, 0xDA6F, 0x8D90, 0xDA70, 0x8D91, 0xF4F4, 0x8D92, 0xDA71,\n\t0x8D93, 0xDA72, 0x8D94, 0xF4F3, 0x8D95, 0xDA73, 0x8D96, 0xDA74,\t0x8D97, 0xDA75, 0x8D98, 0xDA76, 0x8D99, 0xDA77, 0x8D9A, 0xDA78,\n\t0x8D9B, 0xDA79, 0x8D9C, 0xDA7A, 0x8D9D, 0xDA7B, 0x8D9E, 0xDA7C,\t0x8D9F, 0xCCCB, 0x8DA0, 0xDA7D, 0x8DA1, 0xDA7E, 0x8DA2, 0xDA80,\n\t0x8DA3, 0xC8A4, 0x8DA4, 0xDA81, 0x8DA5, 0xDA82, 0x8DA6, 0xDA83,\t0x8DA7, 0xDA84, 0x8DA8, 0xDA85, 0x8DA9, 0xDA86, 0x8DAA, 0xDA87,\n\t0x8DAB, 0xDA88, 0x8DAC, 0xDA89, 0x8DAD, 0xDA8A, 0x8DAE, 0xDA8B,\t0x8DAF, 0xDA8C, 0x8DB0, 0xDA8D, 0x8DB1, 0xF4F5, 0x8DB2, 0xDA8E,\n\t0x8DB3, 0xD7E3, 0x8DB4, 0xC5BF, 0x8DB5, 0xF5C0, 0x8DB6, 0xDA8F,\t0x8DB7, 0xDA90, 0x8DB8, 0xF5BB, 0x8DB9, 0xDA91, 0x8DBA, 0xF5C3,\n\t0x8DBB, 0xDA92, 0x8DBC, 0xF5C2, 0x8DBD, 0xDA93, 0x8DBE, 0xD6BA,\t0x8DBF, 0xF5C1, 0x8DC0, 0xDA94, 0x8DC1, 0xDA95, 0x8DC2, 0xDA96,\n\t0x8DC3, 0xD4BE, 0x8DC4, 0xF5C4, 0x8DC5, 0xDA97, 0x8DC6, 0xF5CC,\t0x8DC7, 0xDA98, 0x8DC8, 0xDA99, 0x8DC9, 0xDA9A, 0x8DCA, 0xDA9B,\n\t0x8DCB, 0xB0CF, 0x8DCC, 0xB5F8, 0x8DCD, 0xDA9C, 0x8DCE, 0xF5C9,\t0x8DCF, 0xF5CA, 0x8DD0, 0xDA9D, 0x8DD1, 0xC5DC, 0x8DD2, 0xDA9E,\n\t0x8DD3, 0xDA9F, 0x8DD4, 0xDAA0, 0x8DD5, 0xDB40, 0x8DD6, 0xF5C5,\t0x8DD7, 0xF5C6, 0x8DD8, 0xDB41, 0x8DD9, 0xDB42, 0x8DDA, 0xF5C7,\n\t0x8DDB, 0xF5CB, 0x8DDC, 0xDB43, 0x8DDD, 0xBEE0, 0x8DDE, 0xF5C8,\t0x8DDF, 0xB8FA, 0x8DE0, 0xDB44, 0x8DE1, 0xDB45, 0x8DE2, 0xDB46,\n\t0x8DE3, 0xF5D0, 0x8DE4, 0xF5D3, 0x8DE5, 0xDB47, 0x8DE6, 0xDB48,\t0x8DE7, 0xDB49, 0x8DE8, 0xBFE7, 0x8DE9, 0xDB4A, 0x8DEA, 0xB9F2,\n\t0x8DEB, 0xF5BC, 0x8DEC, 0xF5CD, 0x8DED, 0xDB4B, 0x8DEE, 0xDB4C,\t0x8DEF, 0xC2B7, 0x8DF0, 0xDB4D, 0x8DF1, 0xDB4E, 0x8DF2, 0xDB4F,\n\t0x8DF3, 0xCCF8, 0x8DF4, 0xDB50, 0x8DF5, 0xBCF9, 0x8DF6, 0xDB51,\t0x8DF7, 0xF5CE, 0x8DF8, 0xF5CF, 0x8DF9, 0xF5D1, 0x8DFA, 0xB6E5,\n\t0x8DFB, 0xF5D2, 0x8DFC, 0xDB52, 0x8DFD, 0xF5D5, 0x8DFE, 0xDB53,\t0x8DFF, 0xDB54, 0x8E00, 0xDB55, 0x8E01, 0xDB56, 0x8E02, 0xDB57,\n\t0x8E03, 0xDB58, 0x8E04, 0xDB59, 0x8E05, 0xF5BD, 0x8E06, 0xDB5A,\t0x8E07, 0xDB5B, 0x8E08, 0xDB5C, 0x8E09, 0xF5D4, 0x8E0A, 0xD3BB,\n\t0x8E0B, 0xDB5D, 0x8E0C, 0xB3EC, 0x8E0D, 0xDB5E, 0x8E0E, 0xDB5F,\t0x8E0F, 0xCCA4, 0x8E10, 0xDB60, 0x8E11, 0xDB61, 0x8E12, 0xDB62,\n\t0x8E13, 0xDB63, 0x8E14, 0xF5D6, 0x8E15, 0xDB64, 0x8E16, 0xDB65,\t0x8E17, 0xDB66, 0x8E18, 0xDB67, 0x8E19, 0xDB68, 0x8E1A, 0xDB69,\n\t0x8E1B, 0xDB6A, 0x8E1C, 0xDB6B, 0x8E1D, 0xF5D7, 0x8E1E, 0xBEE1,\t0x8E1F, 0xF5D8, 0x8E20, 0xDB6C, 0x8E21, 0xDB6D, 0x8E22, 0xCCDF,\n\t0x8E23, 0xF5DB, 0x8E24, 0xDB6E, 0x8E25, 0xDB6F, 0x8E26, 0xDB70,\t0x8E27, 0xDB71, 0x8E28, 0xDB72, 0x8E29, 0xB2C8, 0x8E2A, 0xD7D9,\n\t0x8E2B, 0xDB73, 0x8E2C, 0xF5D9, 0x8E2D, 0xDB74, 0x8E2E, 0xF5DA,\t0x8E2F, 0xF5DC, 0x8E30, 0xDB75, 0x8E31, 0xF5E2, 0x8E32, 0xDB76,\n\t0x8E33, 0xDB77, 0x8E34, 0xDB78, 0x8E35, 0xF5E0, 0x8E36, 0xDB79,\t0x8E37, 0xDB7A, 0x8E38, 0xDB7B, 0x8E39, 0xF5DF, 0x8E3A, 0xF5DD,\n\t0x8E3B, 0xDB7C, 0x8E3C, 0xDB7D, 0x8E3D, 0xF5E1, 0x8E3E, 0xDB7E,\t0x8E3F, 0xDB80, 0x8E40, 0xF5DE, 0x8E41, 0xF5E4, 0x8E42, 0xF5E5,\n\t0x8E43, 0xDB81, 0x8E44, 0xCCE3, 0x8E45, 0xDB82, 0x8E46, 0xDB83,\t0x8E47, 0xE5BF, 0x8E48, 0xB5B8, 0x8E49, 0xF5E3, 0x8E4A, 0xF5E8,\n\t0x8E4B, 0xCCA3, 0x8E4C, 0xDB84, 0x8E4D, 0xDB85, 0x8E4E, 0xDB86,\t0x8E4F, 0xDB87, 0x8E50, 0xDB88, 0x8E51, 0xF5E6, 0x8E52, 0xF5E7,\n\t0x8E53, 0xDB89, 0x8E54, 0xDB8A, 0x8E55, 0xDB8B, 0x8E56, 0xDB8C,\t0x8E57, 0xDB8D, 0x8E58, 0xDB8E, 0x8E59, 0xF5BE, 0x8E5A, 0xDB8F,\n\t0x8E5B, 0xDB90, 0x8E5C, 0xDB91, 0x8E5D, 0xDB92, 0x8E5E, 0xDB93,\t0x8E5F, 0xDB94, 0x8E60, 0xDB95, 0x8E61, 0xDB96, 0x8E62, 0xDB97,\n\t0x8E63, 0xDB98, 0x8E64, 0xDB99, 0x8E65, 0xDB9A, 0x8E66, 0xB1C4,\t0x8E67, 0xDB9B, 0x8E68, 0xDB9C, 0x8E69, 0xF5BF, 0x8E6A, 0xDB9D,\n\t0x8E6B, 0xDB9E, 0x8E6C, 0xB5C5, 0x8E6D, 0xB2E4, 0x8E6E, 0xDB9F,\t0x8E6F, 0xF5EC, 0x8E70, 0xF5E9, 0x8E71, 0xDBA0, 0x8E72, 0xB6D7,\n\t0x8E73, 0xDC40, 0x8E74, 0xF5ED, 0x8E75, 0xDC41, 0x8E76, 0xF5EA,\t0x8E77, 0xDC42, 0x8E78, 0xDC43, 0x8E79, 0xDC44, 0x8E7A, 0xDC45,\n\t0x8E7B, 0xDC46, 0x8E7C, 0xF5EB, 0x8E7D, 0xDC47, 0x8E7E, 0xDC48,\t0x8E7F, 0xB4DA, 0x8E80, 0xDC49, 0x8E81, 0xD4EA, 0x8E82, 0xDC4A,\n\t0x8E83, 0xDC4B, 0x8E84, 0xDC4C, 0x8E85, 0xF5EE, 0x8E86, 0xDC4D,\t0x8E87, 0xB3F9, 0x8E88, 0xDC4E, 0x8E89, 0xDC4F, 0x8E8A, 0xDC50,\n\t0x8E8B, 0xDC51, 0x8E8C, 0xDC52, 0x8E8D, 0xDC53, 0x8E8E, 0xDC54,\t0x8E8F, 0xF5EF, 0x8E90, 0xF5F1, 0x8E91, 0xDC55, 0x8E92, 0xDC56,\n\t0x8E93, 0xDC57, 0x8E94, 0xF5F0, 0x8E95, 0xDC58, 0x8E96, 0xDC59,\t0x8E97, 0xDC5A, 0x8E98, 0xDC5B, 0x8E99, 0xDC5C, 0x8E9A, 0xDC5D,\n\t0x8E9B, 0xDC5E, 0x8E9C, 0xF5F2, 0x8E9D, 0xDC5F, 0x8E9E, 0xF5F3,\t0x8E9F, 0xDC60, 0x8EA0, 0xDC61, 0x8EA1, 0xDC62, 0x8EA2, 0xDC63,\n\t0x8EA3, 0xDC64, 0x8EA4, 0xDC65, 0x8EA5, 0xDC66, 0x8EA6, 0xDC67,\t0x8EA7, 0xDC68, 0x8EA8, 0xDC69, 0x8EA9, 0xDC6A, 0x8EAA, 0xDC6B,\n\t0x8EAB, 0xC9ED, 0x8EAC, 0xB9AA, 0x8EAD, 0xDC6C, 0x8EAE, 0xDC6D,\t0x8EAF, 0xC7FB, 0x8EB0, 0xDC6E, 0x8EB1, 0xDC6F, 0x8EB2, 0xB6E3,\n\t0x8EB3, 0xDC70, 0x8EB4, 0xDC71, 0x8EB5, 0xDC72, 0x8EB6, 0xDC73,\t0x8EB7, 0xDC74, 0x8EB8, 0xDC75, 0x8EB9, 0xDC76, 0x8EBA, 0xCCC9,\n\t0x8EBB, 0xDC77, 0x8EBC, 0xDC78, 0x8EBD, 0xDC79, 0x8EBE, 0xDC7A,\t0x8EBF, 0xDC7B, 0x8EC0, 0xDC7C, 0x8EC1, 0xDC7D, 0x8EC2, 0xDC7E,\n\t0x8EC3, 0xDC80, 0x8EC4, 0xDC81, 0x8EC5, 0xDC82, 0x8EC6, 0xDC83,\t0x8EC7, 0xDC84, 0x8EC8, 0xDC85, 0x8EC9, 0xDC86, 0x8ECA, 0xDC87,\n\t0x8ECB, 0xDC88, 0x8ECC, 0xDC89, 0x8ECD, 0xDC8A, 0x8ECE, 0xEAA6,\t0x8ECF, 0xDC8B, 0x8ED0, 0xDC8C, 0x8ED1, 0xDC8D, 0x8ED2, 0xDC8E,\n\t0x8ED3, 0xDC8F, 0x8ED4, 0xDC90, 0x8ED5, 0xDC91, 0x8ED6, 0xDC92,\t0x8ED7, 0xDC93, 0x8ED8, 0xDC94, 0x8ED9, 0xDC95, 0x8EDA, 0xDC96,\n\t0x8EDB, 0xDC97, 0x8EDC, 0xDC98, 0x8EDD, 0xDC99, 0x8EDE, 0xDC9A,\t0x8EDF, 0xDC9B, 0x8EE0, 0xDC9C, 0x8EE1, 0xDC9D, 0x8EE2, 0xDC9E,\n\t0x8EE3, 0xDC9F, 0x8EE4, 0xDCA0, 0x8EE5, 0xDD40, 0x8EE6, 0xDD41,\t0x8EE7, 0xDD42, 0x8EE8, 0xDD43, 0x8EE9, 0xDD44, 0x8EEA, 0xDD45,\n\t0x8EEB, 0xDD46, 0x8EEC, 0xDD47, 0x8EED, 0xDD48, 0x8EEE, 0xDD49,\t0x8EEF, 0xDD4A, 0x8EF0, 0xDD4B, 0x8EF1, 0xDD4C, 0x8EF2, 0xDD4D,\n\t0x8EF3, 0xDD4E, 0x8EF4, 0xDD4F, 0x8EF5, 0xDD50, 0x8EF6, 0xDD51,\t0x8EF7, 0xDD52, 0x8EF8, 0xDD53, 0x8EF9, 0xDD54, 0x8EFA, 0xDD55,\n\t0x8EFB, 0xDD56, 0x8EFC, 0xDD57, 0x8EFD, 0xDD58, 0x8EFE, 0xDD59,\t0x8EFF, 0xDD5A, 0x8F00, 0xDD5B, 0x8F01, 0xDD5C, 0x8F02, 0xDD5D,\n\t0x8F03, 0xDD5E, 0x8F04, 0xDD5F, 0x8F05, 0xDD60, 0x8F06, 0xDD61,\t0x8F07, 0xDD62, 0x8F08, 0xDD63, 0x8F09, 0xDD64, 0x8F0A, 0xDD65,\n\t0x8F0B, 0xDD66, 0x8F0C, 0xDD67, 0x8F0D, 0xDD68, 0x8F0E, 0xDD69,\t0x8F0F, 0xDD6A, 0x8F10, 0xDD6B, 0x8F11, 0xDD6C, 0x8F12, 0xDD6D,\n\t0x8F13, 0xDD6E, 0x8F14, 0xDD6F, 0x8F15, 0xDD70, 0x8F16, 0xDD71,\t0x8F17, 0xDD72, 0x8F18, 0xDD73, 0x8F19, 0xDD74, 0x8F1A, 0xDD75,\n\t0x8F1B, 0xDD76, 0x8F1C, 0xDD77, 0x8F1D, 0xDD78, 0x8F1E, 0xDD79,\t0x8F1F, 0xDD7A, 0x8F20, 0xDD7B, 0x8F21, 0xDD7C, 0x8F22, 0xDD7D,\n\t0x8F23, 0xDD7E, 0x8F24, 0xDD80, 0x8F25, 0xDD81, 0x8F26, 0xDD82,\t0x8F27, 0xDD83, 0x8F28, 0xDD84, 0x8F29, 0xDD85, 0x8F2A, 0xDD86,\n\t0x8F2B, 0xDD87, 0x8F2C, 0xDD88, 0x8F2D, 0xDD89, 0x8F2E, 0xDD8A,\t0x8F2F, 0xDD8B, 0x8F30, 0xDD8C, 0x8F31, 0xDD8D, 0x8F32, 0xDD8E,\n\t0x8F33, 0xDD8F, 0x8F34, 0xDD90, 0x8F35, 0xDD91, 0x8F36, 0xDD92,\t0x8F37, 0xDD93, 0x8F38, 0xDD94, 0x8F39, 0xDD95, 0x8F3A, 0xDD96,\n\t0x8F3B, 0xDD97, 0x8F3C, 0xDD98, 0x8F3D, 0xDD99, 0x8F3E, 0xDD9A,\t0x8F3F, 0xDD9B, 0x8F40, 0xDD9C, 0x8F41, 0xDD9D, 0x8F42, 0xDD9E,\n\t0x8F43, 0xDD9F, 0x8F44, 0xDDA0, 0x8F45, 0xDE40, 0x8F46, 0xDE41,\t0x8F47, 0xDE42, 0x8F48, 0xDE43, 0x8F49, 0xDE44, 0x8F4A, 0xDE45,\n\t0x8F4B, 0xDE46, 0x8F4C, 0xDE47, 0x8F4D, 0xDE48, 0x8F4E, 0xDE49,\t0x8F4F, 0xDE4A, 0x8F50, 0xDE4B, 0x8F51, 0xDE4C, 0x8F52, 0xDE4D,\n\t0x8F53, 0xDE4E, 0x8F54, 0xDE4F, 0x8F55, 0xDE50, 0x8F56, 0xDE51,\t0x8F57, 0xDE52, 0x8F58, 0xDE53, 0x8F59, 0xDE54, 0x8F5A, 0xDE55,\n\t0x8F5B, 0xDE56, 0x8F5C, 0xDE57, 0x8F5D, 0xDE58, 0x8F5E, 0xDE59,\t0x8F5F, 0xDE5A, 0x8F60, 0xDE5B, 0x8F61, 0xDE5C, 0x8F62, 0xDE5D,\n\t0x8F63, 0xDE5E, 0x8F64, 0xDE5F, 0x8F65, 0xDE60, 0x8F66, 0xB3B5,\t0x8F67, 0xD4FE, 0x8F68, 0xB9EC, 0x8F69, 0xD0F9, 0x8F6A, 0xDE61,\n\t0x8F6B, 0xE9ED, 0x8F6C, 0xD7AA, 0x8F6D, 0xE9EE, 0x8F6E, 0xC2D6,\t0x8F6F, 0xC8ED, 0x8F70, 0xBAE4, 0x8F71, 0xE9EF, 0x8F72, 0xE9F0,\n\t0x8F73, 0xE9F1, 0x8F74, 0xD6E1, 0x8F75, 0xE9F2, 0x8F76, 0xE9F3,\t0x8F77, 0xE9F5, 0x8F78, 0xE9F4, 0x8F79, 0xE9F6, 0x8F7A, 0xE9F7,\n\t0x8F7B, 0xC7E1, 0x8F7C, 0xE9F8, 0x8F7D, 0xD4D8, 0x8F7E, 0xE9F9,\t0x8F7F, 0xBDCE, 0x8F80, 0xDE62, 0x8F81, 0xE9FA, 0x8F82, 0xE9FB,\n\t0x8F83, 0xBDCF, 0x8F84, 0xE9FC, 0x8F85, 0xB8A8, 0x8F86, 0xC1BE,\t0x8F87, 0xE9FD, 0x8F88, 0xB1B2, 0x8F89, 0xBBD4, 0x8F8A, 0xB9F5,\n\t0x8F8B, 0xE9FE, 0x8F8C, 0xDE63, 0x8F8D, 0xEAA1, 0x8F8E, 0xEAA2,\t0x8F8F, 0xEAA3, 0x8F90, 0xB7F8, 0x8F91, 0xBCAD, 0x8F92, 0xDE64,\n\t0x8F93, 0xCAE4, 0x8F94, 0xE0CE, 0x8F95, 0xD4AF, 0x8F96, 0xCFBD,\t0x8F97, 0xD5B7, 0x8F98, 0xEAA4, 0x8F99, 0xD5DE, 0x8F9A, 0xEAA5,\n\t0x8F9B, 0xD0C1, 0x8F9C, 0xB9BC, 0x8F9D, 0xDE65, 0x8F9E, 0xB4C7,\t0x8F9F, 0xB1D9, 0x8FA0, 0xDE66, 0x8FA1, 0xDE67, 0x8FA2, 0xDE68,\n\t0x8FA3, 0xC0B1, 0x8FA4, 0xDE69, 0x8FA5, 0xDE6A, 0x8FA6, 0xDE6B,\t0x8FA7, 0xDE6C, 0x8FA8, 0xB1E6, 0x8FA9, 0xB1E7, 0x8FAA, 0xDE6D,\n\t0x8FAB, 0xB1E8, 0x8FAC, 0xDE6E, 0x8FAD, 0xDE6F, 0x8FAE, 0xDE70,\t0x8FAF, 0xDE71, 0x8FB0, 0xB3BD, 0x8FB1, 0xC8E8, 0x8FB2, 0xDE72,\n\t0x8FB3, 0xDE73, 0x8FB4, 0xDE74, 0x8FB5, 0xDE75, 0x8FB6, 0xE5C1,\t0x8FB7, 0xDE76, 0x8FB8, 0xDE77, 0x8FB9, 0xB1DF, 0x8FBA, 0xDE78,\n\t0x8FBB, 0xDE79, 0x8FBC, 0xDE7A, 0x8FBD, 0xC1C9, 0x8FBE, 0xB4EF,\t0x8FBF, 0xDE7B, 0x8FC0, 0xDE7C, 0x8FC1, 0xC7A8, 0x8FC2, 0xD3D8,\n\t0x8FC3, 0xDE7D, 0x8FC4, 0xC6F9, 0x8FC5, 0xD1B8, 0x8FC6, 0xDE7E,\t0x8FC7, 0xB9FD, 0x8FC8, 0xC2F5, 0x8FC9, 0xDE80, 0x8FCA, 0xDE81,\n\t0x8FCB, 0xDE82, 0x8FCC, 0xDE83, 0x8FCD, 0xDE84, 0x8FCE, 0xD3AD,\t0x8FCF, 0xDE85, 0x8FD0, 0xD4CB, 0x8FD1, 0xBDFC, 0x8FD2, 0xDE86,\n\t0x8FD3, 0xE5C2, 0x8FD4, 0xB7B5, 0x8FD5, 0xE5C3, 0x8FD6, 0xDE87,\t0x8FD7, 0xDE88, 0x8FD8, 0xBBB9, 0x8FD9, 0xD5E2, 0x8FDA, 0xDE89,\n\t0x8FDB, 0xBDF8, 0x8FDC, 0xD4B6, 0x8FDD, 0xCEA5, 0x8FDE, 0xC1AC,\t0x8FDF, 0xB3D9, 0x8FE0, 0xDE8A, 0x8FE1, 0xDE8B, 0x8FE2, 0xCCF6,\n\t0x8FE3, 0xDE8C, 0x8FE4, 0xE5C6, 0x8FE5, 0xE5C4, 0x8FE6, 0xE5C8,\t0x8FE7, 0xDE8D, 0x8FE8, 0xE5CA, 0x8FE9, 0xE5C7, 0x8FEA, 0xB5CF,\n\t0x8FEB, 0xC6C8, 0x8FEC, 0xDE8E, 0x8FED, 0xB5FC, 0x8FEE, 0xE5C5,\t0x8FEF, 0xDE8F, 0x8FF0, 0xCAF6, 0x8FF1, 0xDE90, 0x8FF2, 0xDE91,\n\t0x8FF3, 0xE5C9, 0x8FF4, 0xDE92, 0x8FF5, 0xDE93, 0x8FF6, 0xDE94,\t0x8FF7, 0xC3D4, 0x8FF8, 0xB1C5, 0x8FF9, 0xBCA3, 0x8FFA, 0xDE95,\n\t0x8FFB, 0xDE96, 0x8FFC, 0xDE97, 0x8FFD, 0xD7B7, 0x8FFE, 0xDE98,\t0x8FFF, 0xDE99, 0x9000, 0xCDCB, 0x9001, 0xCBCD, 0x9002, 0xCACA,\n\t0x9003, 0xCCD3, 0x9004, 0xE5CC, 0x9005, 0xE5CB, 0x9006, 0xC4E6,\t0x9007, 0xDE9A, 0x9008, 0xDE9B, 0x9009, 0xD1A1, 0x900A, 0xD1B7,\n\t0x900B, 0xE5CD, 0x900C, 0xDE9C, 0x900D, 0xE5D0, 0x900E, 0xDE9D,\t0x900F, 0xCDB8, 0x9010, 0xD6F0, 0x9011, 0xE5CF, 0x9012, 0xB5DD,\n\t0x9013, 0xDE9E, 0x9014, 0xCDBE, 0x9015, 0xDE9F, 0x9016, 0xE5D1,\t0x9017, 0xB6BA, 0x9018, 0xDEA0, 0x9019, 0xDF40, 0x901A, 0xCDA8,\n\t0x901B, 0xB9E4, 0x901C, 0xDF41, 0x901D, 0xCAC5, 0x901E, 0xB3D1,\t0x901F, 0xCBD9, 0x9020, 0xD4EC, 0x9021, 0xE5D2, 0x9022, 0xB7EA,\n\t0x9023, 0xDF42, 0x9024, 0xDF43, 0x9025, 0xDF44, 0x9026, 0xE5CE,\t0x9027, 0xDF45, 0x9028, 0xDF46, 0x9029, 0xDF47, 0x902A, 0xDF48,\n\t0x902B, 0xDF49, 0x902C, 0xDF4A, 0x902D, 0xE5D5, 0x902E, 0xB4FE,\t0x902F, 0xE5D6, 0x9030, 0xDF4B, 0x9031, 0xDF4C, 0x9032, 0xDF4D,\n\t0x9033, 0xDF4E, 0x9034, 0xDF4F, 0x9035, 0xE5D3, 0x9036, 0xE5D4,\t0x9037, 0xDF50, 0x9038, 0xD2DD, 0x9039, 0xDF51, 0x903A, 0xDF52,\n\t0x903B, 0xC2DF, 0x903C, 0xB1C6, 0x903D, 0xDF53, 0x903E, 0xD3E2,\t0x903F, 0xDF54, 0x9040, 0xDF55, 0x9041, 0xB6DD, 0x9042, 0xCBEC,\n\t0x9043, 0xDF56, 0x9044, 0xE5D7, 0x9045, 0xDF57, 0x9046, 0xDF58,\t0x9047, 0xD3F6, 0x9048, 0xDF59, 0x9049, 0xDF5A, 0x904A, 0xDF5B,\n\t0x904B, 0xDF5C, 0x904C, 0xDF5D, 0x904D, 0xB1E9, 0x904E, 0xDF5E,\t0x904F, 0xB6F4, 0x9050, 0xE5DA, 0x9051, 0xE5D8, 0x9052, 0xE5D9,\n\t0x9053, 0xB5C0, 0x9054, 0xDF5F, 0x9055, 0xDF60, 0x9056, 0xDF61,\t0x9057, 0xD2C5, 0x9058, 0xE5DC, 0x9059, 0xDF62, 0x905A, 0xDF63,\n\t0x905B, 0xE5DE, 0x905C, 0xDF64, 0x905D, 0xDF65, 0x905E, 0xDF66,\t0x905F, 0xDF67, 0x9060, 0xDF68, 0x9061, 0xDF69, 0x9062, 0xE5DD,\n\t0x9063, 0xC7B2, 0x9064, 0xDF6A, 0x9065, 0xD2A3, 0x9066, 0xDF6B,\t0x9067, 0xDF6C, 0x9068, 0xE5DB, 0x9069, 0xDF6D, 0x906A, 0xDF6E,\n\t0x906B, 0xDF6F, 0x906C, 0xDF70, 0x906D, 0xD4E2, 0x906E, 0xD5DA,\t0x906F, 0xDF71, 0x9070, 0xDF72, 0x9071, 0xDF73, 0x9072, 0xDF74,\n\t0x9073, 0xDF75, 0x9074, 0xE5E0, 0x9075, 0xD7F1, 0x9076, 0xDF76,\t0x9077, 0xDF77, 0x9078, 0xDF78, 0x9079, 0xDF79, 0x907A, 0xDF7A,\n\t0x907B, 0xDF7B, 0x907C, 0xDF7C, 0x907D, 0xE5E1, 0x907E, 0xDF7D,\t0x907F, 0xB1DC, 0x9080, 0xD1FB, 0x9081, 0xDF7E, 0x9082, 0xE5E2,\n\t0x9083, 0xE5E4, 0x9084, 0xDF80, 0x9085, 0xDF81, 0x9086, 0xDF82,\t0x9087, 0xDF83, 0x9088, 0xE5E3, 0x9089, 0xDF84, 0x908A, 0xDF85,\n\t0x908B, 0xE5E5, 0x908C, 0xDF86, 0x908D, 0xDF87, 0x908E, 0xDF88,\t0x908F, 0xDF89, 0x9090, 0xDF8A, 0x9091, 0xD2D8, 0x9092, 0xDF8B,\n\t0x9093, 0xB5CB, 0x9094, 0xDF8C, 0x9095, 0xE7DF, 0x9096, 0xDF8D,\t0x9097, 0xDAF5, 0x9098, 0xDF8E, 0x9099, 0xDAF8, 0x909A, 0xDF8F,\n\t0x909B, 0xDAF6, 0x909C, 0xDF90, 0x909D, 0xDAF7, 0x909E, 0xDF91,\t0x909F, 0xDF92, 0x90A0, 0xDF93, 0x90A1, 0xDAFA, 0x90A2, 0xD0CF,\n\t0x90A3, 0xC4C7, 0x90A4, 0xDF94, 0x90A5, 0xDF95, 0x90A6, 0xB0EE,\t0x90A7, 0xDF96, 0x90A8, 0xDF97, 0x90A9, 0xDF98, 0x90AA, 0xD0B0,\n\t0x90AB, 0xDF99, 0x90AC, 0xDAF9, 0x90AD, 0xDF9A, 0x90AE, 0xD3CA,\t0x90AF, 0xBAAA, 0x90B0, 0xDBA2, 0x90B1, 0xC7F1, 0x90B2, 0xDF9B,\n\t0x90B3, 0xDAFC, 0x90B4, 0xDAFB, 0x90B5, 0xC9DB, 0x90B6, 0xDAFD,\t0x90B7, 0xDF9C, 0x90B8, 0xDBA1, 0x90B9, 0xD7DE, 0x90BA, 0xDAFE,\n\t0x90BB, 0xC1DA, 0x90BC, 0xDF9D, 0x90BD, 0xDF9E, 0x90BE, 0xDBA5,\t0x90BF, 0xDF9F, 0x90C0, 0xDFA0, 0x90C1, 0xD3F4, 0x90C2, 0xE040,\n\t0x90C3, 0xE041, 0x90C4, 0xDBA7, 0x90C5, 0xDBA4, 0x90C6, 0xE042,\t0x90C7, 0xDBA8, 0x90C8, 0xE043, 0x90C9, 0xE044, 0x90CA, 0xBDBC,\n\t0x90CB, 0xE045, 0x90CC, 0xE046, 0x90CD, 0xE047, 0x90CE, 0xC0C9,\t0x90CF, 0xDBA3, 0x90D0, 0xDBA6, 0x90D1, 0xD6A3, 0x90D2, 0xE048,\n\t0x90D3, 0xDBA9, 0x90D4, 0xE049, 0x90D5, 0xE04A, 0x90D6, 0xE04B,\t0x90D7, 0xDBAD, 0x90D8, 0xE04C, 0x90D9, 0xE04D, 0x90DA, 0xE04E,\n\t0x90DB, 0xDBAE, 0x90DC, 0xDBAC, 0x90DD, 0xBAC2, 0x90DE, 0xE04F,\t0x90DF, 0xE050, 0x90E0, 0xE051, 0x90E1, 0xBFA4, 0x90E2, 0xDBAB,\n\t0x90E3, 0xE052, 0x90E4, 0xE053, 0x90E5, 0xE054, 0x90E6, 0xDBAA,\t0x90E7, 0xD4C7, 0x90E8, 0xB2BF, 0x90E9, 0xE055, 0x90EA, 0xE056,\n\t0x90EB, 0xDBAF, 0x90EC, 0xE057, 0x90ED, 0xB9F9, 0x90EE, 0xE058,\t0x90EF, 0xDBB0, 0x90F0, 0xE059, 0x90F1, 0xE05A, 0x90F2, 0xE05B,\n\t0x90F3, 0xE05C, 0x90F4, 0xB3BB, 0x90F5, 0xE05D, 0x90F6, 0xE05E,\t0x90F7, 0xE05F, 0x90F8, 0xB5A6, 0x90F9, 0xE060, 0x90FA, 0xE061,\n\t0x90FB, 0xE062, 0x90FC, 0xE063, 0x90FD, 0xB6BC, 0x90FE, 0xDBB1,\t0x90FF, 0xE064, 0x9100, 0xE065, 0x9101, 0xE066, 0x9102, 0xB6F5,\n\t0x9103, 0xE067, 0x9104, 0xDBB2, 0x9105, 0xE068, 0x9106, 0xE069,\t0x9107, 0xE06A, 0x9108, 0xE06B, 0x9109, 0xE06C, 0x910A, 0xE06D,\n\t0x910B, 0xE06E, 0x910C, 0xE06F, 0x910D, 0xE070, 0x910E, 0xE071,\t0x910F, 0xE072, 0x9110, 0xE073, 0x9111, 0xE074, 0x9112, 0xE075,\n\t0x9113, 0xE076, 0x9114, 0xE077, 0x9115, 0xE078, 0x9116, 0xE079,\t0x9117, 0xE07A, 0x9118, 0xE07B, 0x9119, 0xB1C9, 0x911A, 0xE07C,\n\t0x911B, 0xE07D, 0x911C, 0xE07E, 0x911D, 0xE080, 0x911E, 0xDBB4,\t0x911F, 0xE081, 0x9120, 0xE082, 0x9121, 0xE083, 0x9122, 0xDBB3,\n\t0x9123, 0xDBB5, 0x9124, 0xE084, 0x9125, 0xE085, 0x9126, 0xE086,\t0x9127, 0xE087, 0x9128, 0xE088, 0x9129, 0xE089, 0x912A, 0xE08A,\n\t0x912B, 0xE08B, 0x912C, 0xE08C, 0x912D, 0xE08D, 0x912E, 0xE08E,\t0x912F, 0xDBB7, 0x9130, 0xE08F, 0x9131, 0xDBB6, 0x9132, 0xE090,\n\t0x9133, 0xE091, 0x9134, 0xE092, 0x9135, 0xE093, 0x9136, 0xE094,\t0x9137, 0xE095, 0x9138, 0xE096, 0x9139, 0xDBB8, 0x913A, 0xE097,\n\t0x913B, 0xE098, 0x913C, 0xE099, 0x913D, 0xE09A, 0x913E, 0xE09B,\t0x913F, 0xE09C, 0x9140, 0xE09D, 0x9141, 0xE09E, 0x9142, 0xE09F,\n\t0x9143, 0xDBB9, 0x9144, 0xE0A0, 0x9145, 0xE140, 0x9146, 0xDBBA,\t0x9147, 0xE141, 0x9148, 0xE142, 0x9149, 0xD3CF, 0x914A, 0xF4FA,\n\t0x914B, 0xC7F5, 0x914C, 0xD7C3, 0x914D, 0xC5E4, 0x914E, 0xF4FC,\t0x914F, 0xF4FD, 0x9150, 0xF4FB, 0x9151, 0xE143, 0x9152, 0xBEC6,\n\t0x9153, 0xE144, 0x9154, 0xE145, 0x9155, 0xE146, 0x9156, 0xE147,\t0x9157, 0xD0EF, 0x9158, 0xE148, 0x9159, 0xE149, 0x915A, 0xB7D3,\n\t0x915B, 0xE14A, 0x915C, 0xE14B, 0x915D, 0xD4CD, 0x915E, 0xCCAA,\t0x915F, 0xE14C, 0x9160, 0xE14D, 0x9161, 0xF5A2, 0x9162, 0xF5A1,\n\t0x9163, 0xBAA8, 0x9164, 0xF4FE, 0x9165, 0xCBD6, 0x9166, 0xE14E,\t0x9167, 0xE14F, 0x9168, 0xE150, 0x9169, 0xF5A4, 0x916A, 0xC0D2,\n\t0x916B, 0xE151, 0x916C, 0xB3EA, 0x916D, 0xE152, 0x916E, 0xCDAA,\t0x916F, 0xF5A5, 0x9170, 0xF5A3, 0x9171, 0xBDB4, 0x9172, 0xF5A8,\n\t0x9173, 0xE153, 0x9174, 0xF5A9, 0x9175, 0xBDCD, 0x9176, 0xC3B8,\t0x9177, 0xBFE1, 0x9178, 0xCBE1, 0x9179, 0xF5AA, 0x917A, 0xE154,\n\t0x917B, 0xE155, 0x917C, 0xE156, 0x917D, 0xF5A6, 0x917E, 0xF5A7,\t0x917F, 0xC4F0, 0x9180, 0xE157, 0x9181, 0xE158, 0x9182, 0xE159,\n\t0x9183, 0xE15A, 0x9184, 0xE15B, 0x9185, 0xF5AC, 0x9186, 0xE15C,\t0x9187, 0xB4BC, 0x9188, 0xE15D, 0x9189, 0xD7ED, 0x918A, 0xE15E,\n\t0x918B, 0xB4D7, 0x918C, 0xF5AB, 0x918D, 0xF5AE, 0x918E, 0xE15F,\t0x918F, 0xE160, 0x9190, 0xF5AD, 0x9191, 0xF5AF, 0x9192, 0xD0D1,\n\t0x9193, 0xE161, 0x9194, 0xE162, 0x9195, 0xE163, 0x9196, 0xE164,\t0x9197, 0xE165, 0x9198, 0xE166, 0x9199, 0xE167, 0x919A, 0xC3D1,\n\t0x919B, 0xC8A9, 0x919C, 0xE168, 0x919D, 0xE169, 0x919E, 0xE16A,\t0x919F, 0xE16B, 0x91A0, 0xE16C, 0x91A1, 0xE16D, 0x91A2, 0xF5B0,\n\t0x91A3, 0xF5B1, 0x91A4, 0xE16E, 0x91A5, 0xE16F, 0x91A6, 0xE170,\t0x91A7, 0xE171, 0x91A8, 0xE172, 0x91A9, 0xE173, 0x91AA, 0xF5B2,\n\t0x91AB, 0xE174, 0x91AC, 0xE175, 0x91AD, 0xF5B3, 0x91AE, 0xF5B4,\t0x91AF, 0xF5B5, 0x91B0, 0xE176, 0x91B1, 0xE177, 0x91B2, 0xE178,\n\t0x91B3, 0xE179, 0x91B4, 0xF5B7, 0x91B5, 0xF5B6, 0x91B6, 0xE17A,\t0x91B7, 0xE17B, 0x91B8, 0xE17C, 0x91B9, 0xE17D, 0x91BA, 0xF5B8,\n\t0x91BB, 0xE17E, 0x91BC, 0xE180, 0x91BD, 0xE181, 0x91BE, 0xE182,\t0x91BF, 0xE183, 0x91C0, 0xE184, 0x91C1, 0xE185, 0x91C2, 0xE186,\n\t0x91C3, 0xE187, 0x91C4, 0xE188, 0x91C5, 0xE189, 0x91C6, 0xE18A,\t0x91C7, 0xB2C9, 0x91C8, 0xE18B, 0x91C9, 0xD3D4, 0x91CA, 0xCACD,\n\t0x91CB, 0xE18C, 0x91CC, 0xC0EF, 0x91CD, 0xD6D8, 0x91CE, 0xD2B0,\t0x91CF, 0xC1BF, 0x91D0, 0xE18D, 0x91D1, 0xBDF0, 0x91D2, 0xE18E,\n\t0x91D3, 0xE18F, 0x91D4, 0xE190, 0x91D5, 0xE191, 0x91D6, 0xE192,\t0x91D7, 0xE193, 0x91D8, 0xE194, 0x91D9, 0xE195, 0x91DA, 0xE196,\n\t0x91DB, 0xE197, 0x91DC, 0xB8AA, 0x91DD, 0xE198, 0x91DE, 0xE199,\t0x91DF, 0xE19A, 0x91E0, 0xE19B, 0x91E1, 0xE19C, 0x91E2, 0xE19D,\n\t0x91E3, 0xE19E, 0x91E4, 0xE19F, 0x91E5, 0xE1A0, 0x91E6, 0xE240,\t0x91E7, 0xE241, 0x91E8, 0xE242, 0x91E9, 0xE243, 0x91EA, 0xE244,\n\t0x91EB, 0xE245, 0x91EC, 0xE246, 0x91ED, 0xE247, 0x91EE, 0xE248,\t0x91EF, 0xE249, 0x91F0, 0xE24A, 0x91F1, 0xE24B, 0x91F2, 0xE24C,\n\t0x91F3, 0xE24D, 0x91F4, 0xE24E, 0x91F5, 0xE24F, 0x91F6, 0xE250,\t0x91F7, 0xE251, 0x91F8, 0xE252, 0x91F9, 0xE253, 0x91FA, 0xE254,\n\t0x91FB, 0xE255, 0x91FC, 0xE256, 0x91FD, 0xE257, 0x91FE, 0xE258,\t0x91FF, 0xE259, 0x9200, 0xE25A, 0x9201, 0xE25B, 0x9202, 0xE25C,\n\t0x9203, 0xE25D, 0x9204, 0xE25E, 0x9205, 0xE25F, 0x9206, 0xE260,\t0x9207, 0xE261, 0x9208, 0xE262, 0x9209, 0xE263, 0x920A, 0xE264,\n\t0x920B, 0xE265, 0x920C, 0xE266, 0x920D, 0xE267, 0x920E, 0xE268,\t0x920F, 0xE269, 0x9210, 0xE26A, 0x9211, 0xE26B, 0x9212, 0xE26C,\n\t0x9213, 0xE26D, 0x9214, 0xE26E, 0x9215, 0xE26F, 0x9216, 0xE270,\t0x9217, 0xE271, 0x9218, 0xE272, 0x9219, 0xE273, 0x921A, 0xE274,\n\t0x921B, 0xE275, 0x921C, 0xE276, 0x921D, 0xE277, 0x921E, 0xE278,\t0x921F, 0xE279, 0x9220, 0xE27A, 0x9221, 0xE27B, 0x9222, 0xE27C,\n\t0x9223, 0xE27D, 0x9224, 0xE27E, 0x9225, 0xE280, 0x9226, 0xE281,\t0x9227, 0xE282, 0x9228, 0xE283, 0x9229, 0xE284, 0x922A, 0xE285,\n\t0x922B, 0xE286, 0x922C, 0xE287, 0x922D, 0xE288, 0x922E, 0xE289,\t0x922F, 0xE28A, 0x9230, 0xE28B, 0x9231, 0xE28C, 0x9232, 0xE28D,\n\t0x9233, 0xE28E, 0x9234, 0xE28F, 0x9235, 0xE290, 0x9236, 0xE291,\t0x9237, 0xE292, 0x9238, 0xE293, 0x9239, 0xE294, 0x923A, 0xE295,\n\t0x923B, 0xE296, 0x923C, 0xE297, 0x923D, 0xE298, 0x923E, 0xE299,\t0x923F, 0xE29A, 0x9240, 0xE29B, 0x9241, 0xE29C, 0x9242, 0xE29D,\n\t0x9243, 0xE29E, 0x9244, 0xE29F, 0x9245, 0xE2A0, 0x9246, 0xE340,\t0x9247, 0xE341, 0x9248, 0xE342, 0x9249, 0xE343, 0x924A, 0xE344,\n\t0x924B, 0xE345, 0x924C, 0xE346, 0x924D, 0xE347, 0x924E, 0xE348,\t0x924F, 0xE349, 0x9250, 0xE34A, 0x9251, 0xE34B, 0x9252, 0xE34C,\n\t0x9253, 0xE34D, 0x9254, 0xE34E, 0x9255, 0xE34F, 0x9256, 0xE350,\t0x9257, 0xE351, 0x9258, 0xE352, 0x9259, 0xE353, 0x925A, 0xE354,\n\t0x925B, 0xE355, 0x925C, 0xE356, 0x925D, 0xE357, 0x925E, 0xE358,\t0x925F, 0xE359, 0x9260, 0xE35A, 0x9261, 0xE35B, 0x9262, 0xE35C,\n\t0x9263, 0xE35D, 0x9264, 0xE35E, 0x9265, 0xE35F, 0x9266, 0xE360,\t0x9267, 0xE361, 0x9268, 0xE362, 0x9269, 0xE363, 0x926A, 0xE364,\n\t0x926B, 0xE365, 0x926C, 0xE366, 0x926D, 0xE367, 0x926E, 0xE368,\t0x926F, 0xE369, 0x9270, 0xE36A, 0x9271, 0xE36B, 0x9272, 0xE36C,\n\t0x9273, 0xE36D, 0x9274, 0xBCF8, 0x9275, 0xE36E, 0x9276, 0xE36F,\t0x9277, 0xE370, 0x9278, 0xE371, 0x9279, 0xE372, 0x927A, 0xE373,\n\t0x927B, 0xE374, 0x927C, 0xE375, 0x927D, 0xE376, 0x927E, 0xE377,\t0x927F, 0xE378, 0x9280, 0xE379, 0x9281, 0xE37A, 0x9282, 0xE37B,\n\t0x9283, 0xE37C, 0x9284, 0xE37D, 0x9285, 0xE37E, 0x9286, 0xE380,\t0x9287, 0xE381, 0x9288, 0xE382, 0x9289, 0xE383, 0x928A, 0xE384,\n\t0x928B, 0xE385, 0x928C, 0xE386, 0x928D, 0xE387, 0x928E, 0xF6C6,\t0x928F, 0xE388, 0x9290, 0xE389, 0x9291, 0xE38A, 0x9292, 0xE38B,\n\t0x9293, 0xE38C, 0x9294, 0xE38D, 0x9295, 0xE38E, 0x9296, 0xE38F,\t0x9297, 0xE390, 0x9298, 0xE391, 0x9299, 0xE392, 0x929A, 0xE393,\n\t0x929B, 0xE394, 0x929C, 0xE395, 0x929D, 0xE396, 0x929E, 0xE397,\t0x929F, 0xE398, 0x92A0, 0xE399, 0x92A1, 0xE39A, 0x92A2, 0xE39B,\n\t0x92A3, 0xE39C, 0x92A4, 0xE39D, 0x92A5, 0xE39E, 0x92A6, 0xE39F,\t0x92A7, 0xE3A0, 0x92A8, 0xE440, 0x92A9, 0xE441, 0x92AA, 0xE442,\n\t0x92AB, 0xE443, 0x92AC, 0xE444, 0x92AD, 0xE445, 0x92AE, 0xF6C7,\t0x92AF, 0xE446, 0x92B0, 0xE447, 0x92B1, 0xE448, 0x92B2, 0xE449,\n\t0x92B3, 0xE44A, 0x92B4, 0xE44B, 0x92B5, 0xE44C, 0x92B6, 0xE44D,\t0x92B7, 0xE44E, 0x92B8, 0xE44F, 0x92B9, 0xE450, 0x92BA, 0xE451,\n\t0x92BB, 0xE452, 0x92BC, 0xE453, 0x92BD, 0xE454, 0x92BE, 0xE455,\t0x92BF, 0xE456, 0x92C0, 0xE457, 0x92C1, 0xE458, 0x92C2, 0xE459,\n\t0x92C3, 0xE45A, 0x92C4, 0xE45B, 0x92C5, 0xE45C, 0x92C6, 0xE45D,\t0x92C7, 0xE45E, 0x92C8, 0xF6C8, 0x92C9, 0xE45F, 0x92CA, 0xE460,\n\t0x92CB, 0xE461, 0x92CC, 0xE462, 0x92CD, 0xE463, 0x92CE, 0xE464,\t0x92CF, 0xE465, 0x92D0, 0xE466, 0x92D1, 0xE467, 0x92D2, 0xE468,\n\t0x92D3, 0xE469, 0x92D4, 0xE46A, 0x92D5, 0xE46B, 0x92D6, 0xE46C,\t0x92D7, 0xE46D, 0x92D8, 0xE46E, 0x92D9, 0xE46F, 0x92DA, 0xE470,\n\t0x92DB, 0xE471, 0x92DC, 0xE472, 0x92DD, 0xE473, 0x92DE, 0xE474,\t0x92DF, 0xE475, 0x92E0, 0xE476, 0x92E1, 0xE477, 0x92E2, 0xE478,\n\t0x92E3, 0xE479, 0x92E4, 0xE47A, 0x92E5, 0xE47B, 0x92E6, 0xE47C,\t0x92E7, 0xE47D, 0x92E8, 0xE47E, 0x92E9, 0xE480, 0x92EA, 0xE481,\n\t0x92EB, 0xE482, 0x92EC, 0xE483, 0x92ED, 0xE484, 0x92EE, 0xE485,\t0x92EF, 0xE486, 0x92F0, 0xE487, 0x92F1, 0xE488, 0x92F2, 0xE489,\n\t0x92F3, 0xE48A, 0x92F4, 0xE48B, 0x92F5, 0xE48C, 0x92F6, 0xE48D,\t0x92F7, 0xE48E, 0x92F8, 0xE48F, 0x92F9, 0xE490, 0x92FA, 0xE491,\n\t0x92FB, 0xE492, 0x92FC, 0xE493, 0x92FD, 0xE494, 0x92FE, 0xE495,\t0x92FF, 0xE496, 0x9300, 0xE497, 0x9301, 0xE498, 0x9302, 0xE499,\n\t0x9303, 0xE49A, 0x9304, 0xE49B, 0x9305, 0xE49C, 0x9306, 0xE49D,\t0x9307, 0xE49E, 0x9308, 0xE49F, 0x9309, 0xE4A0, 0x930A, 0xE540,\n\t0x930B, 0xE541, 0x930C, 0xE542, 0x930D, 0xE543, 0x930E, 0xE544,\t0x930F, 0xE545, 0x9310, 0xE546, 0x9311, 0xE547, 0x9312, 0xE548,\n\t0x9313, 0xE549, 0x9314, 0xE54A, 0x9315, 0xE54B, 0x9316, 0xE54C,\t0x9317, 0xE54D, 0x9318, 0xE54E, 0x9319, 0xE54F, 0x931A, 0xE550,\n\t0x931B, 0xE551, 0x931C, 0xE552, 0x931D, 0xE553, 0x931E, 0xE554,\t0x931F, 0xE555, 0x9320, 0xE556, 0x9321, 0xE557, 0x9322, 0xE558,\n\t0x9323, 0xE559, 0x9324, 0xE55A, 0x9325, 0xE55B, 0x9326, 0xE55C,\t0x9327, 0xE55D, 0x9328, 0xE55E, 0x9329, 0xE55F, 0x932A, 0xE560,\n\t0x932B, 0xE561, 0x932C, 0xE562, 0x932D, 0xE563, 0x932E, 0xE564,\t0x932F, 0xE565, 0x9330, 0xE566, 0x9331, 0xE567, 0x9332, 0xE568,\n\t0x9333, 0xE569, 0x9334, 0xE56A, 0x9335, 0xE56B, 0x9336, 0xE56C,\t0x9337, 0xE56D, 0x9338, 0xE56E, 0x9339, 0xE56F, 0x933A, 0xE570,\n\t0x933B, 0xE571, 0x933C, 0xE572, 0x933D, 0xE573, 0x933E, 0xF6C9,\t0x933F, 0xE574, 0x9340, 0xE575, 0x9341, 0xE576, 0x9342, 0xE577,\n\t0x9343, 0xE578, 0x9344, 0xE579, 0x9345, 0xE57A, 0x9346, 0xE57B,\t0x9347, 0xE57C, 0x9348, 0xE57D, 0x9349, 0xE57E, 0x934A, 0xE580,\n\t0x934B, 0xE581, 0x934C, 0xE582, 0x934D, 0xE583, 0x934E, 0xE584,\t0x934F, 0xE585, 0x9350, 0xE586, 0x9351, 0xE587, 0x9352, 0xE588,\n\t0x9353, 0xE589, 0x9354, 0xE58A, 0x9355, 0xE58B, 0x9356, 0xE58C,\t0x9357, 0xE58D, 0x9358, 0xE58E, 0x9359, 0xE58F, 0x935A, 0xE590,\n\t0x935B, 0xE591, 0x935C, 0xE592, 0x935D, 0xE593, 0x935E, 0xE594,\t0x935F, 0xE595, 0x9360, 0xE596, 0x9361, 0xE597, 0x9362, 0xE598,\n\t0x9363, 0xE599, 0x9364, 0xE59A, 0x9365, 0xE59B, 0x9366, 0xE59C,\t0x9367, 0xE59D, 0x9368, 0xE59E, 0x9369, 0xE59F, 0x936A, 0xF6CA,\n\t0x936B, 0xE5A0, 0x936C, 0xE640, 0x936D, 0xE641, 0x936E, 0xE642,\t0x936F, 0xE643, 0x9370, 0xE644, 0x9371, 0xE645, 0x9372, 0xE646,\n\t0x9373, 0xE647, 0x9374, 0xE648, 0x9375, 0xE649, 0x9376, 0xE64A,\t0x9377, 0xE64B, 0x9378, 0xE64C, 0x9379, 0xE64D, 0x937A, 0xE64E,\n\t0x937B, 0xE64F, 0x937C, 0xE650, 0x937D, 0xE651, 0x937E, 0xE652,\t0x937F, 0xE653, 0x9380, 0xE654, 0x9381, 0xE655, 0x9382, 0xE656,\n\t0x9383, 0xE657, 0x9384, 0xE658, 0x9385, 0xE659, 0x9386, 0xE65A,\t0x9387, 0xE65B, 0x9388, 0xE65C, 0x9389, 0xE65D, 0x938A, 0xE65E,\n\t0x938B, 0xE65F, 0x938C, 0xE660, 0x938D, 0xE661, 0x938E, 0xE662,\t0x938F, 0xF6CC, 0x9390, 0xE663, 0x9391, 0xE664, 0x9392, 0xE665,\n\t0x9393, 0xE666, 0x9394, 0xE667, 0x9395, 0xE668, 0x9396, 0xE669,\t0x9397, 0xE66A, 0x9398, 0xE66B, 0x9399, 0xE66C, 0x939A, 0xE66D,\n\t0x939B, 0xE66E, 0x939C, 0xE66F, 0x939D, 0xE670, 0x939E, 0xE671,\t0x939F, 0xE672, 0x93A0, 0xE673, 0x93A1, 0xE674, 0x93A2, 0xE675,\n\t0x93A3, 0xE676, 0x93A4, 0xE677, 0x93A5, 0xE678, 0x93A6, 0xE679,\t0x93A7, 0xE67A, 0x93A8, 0xE67B, 0x93A9, 0xE67C, 0x93AA, 0xE67D,\n\t0x93AB, 0xE67E, 0x93AC, 0xE680, 0x93AD, 0xE681, 0x93AE, 0xE682,\t0x93AF, 0xE683, 0x93B0, 0xE684, 0x93B1, 0xE685, 0x93B2, 0xE686,\n\t0x93B3, 0xE687, 0x93B4, 0xE688, 0x93B5, 0xE689, 0x93B6, 0xE68A,\t0x93B7, 0xE68B, 0x93B8, 0xE68C, 0x93B9, 0xE68D, 0x93BA, 0xE68E,\n\t0x93BB, 0xE68F, 0x93BC, 0xE690, 0x93BD, 0xE691, 0x93BE, 0xE692,\t0x93BF, 0xE693, 0x93C0, 0xE694, 0x93C1, 0xE695, 0x93C2, 0xE696,\n\t0x93C3, 0xE697, 0x93C4, 0xE698, 0x93C5, 0xE699, 0x93C6, 0xE69A,\t0x93C7, 0xE69B, 0x93C8, 0xE69C, 0x93C9, 0xE69D, 0x93CA, 0xF6CB,\n\t0x93CB, 0xE69E, 0x93CC, 0xE69F, 0x93CD, 0xE6A0, 0x93CE, 0xE740,\t0x93CF, 0xE741, 0x93D0, 0xE742, 0x93D1, 0xE743, 0x93D2, 0xE744,\n\t0x93D3, 0xE745, 0x93D4, 0xE746, 0x93D5, 0xE747, 0x93D6, 0xF7E9,\t0x93D7, 0xE748, 0x93D8, 0xE749, 0x93D9, 0xE74A, 0x93DA, 0xE74B,\n\t0x93DB, 0xE74C, 0x93DC, 0xE74D, 0x93DD, 0xE74E, 0x93DE, 0xE74F,\t0x93DF, 0xE750, 0x93E0, 0xE751, 0x93E1, 0xE752, 0x93E2, 0xE753,\n\t0x93E3, 0xE754, 0x93E4, 0xE755, 0x93E5, 0xE756, 0x93E6, 0xE757,\t0x93E7, 0xE758, 0x93E8, 0xE759, 0x93E9, 0xE75A, 0x93EA, 0xE75B,\n\t0x93EB, 0xE75C, 0x93EC, 0xE75D, 0x93ED, 0xE75E, 0x93EE, 0xE75F,\t0x93EF, 0xE760, 0x93F0, 0xE761, 0x93F1, 0xE762, 0x93F2, 0xE763,\n\t0x93F3, 0xE764, 0x93F4, 0xE765, 0x93F5, 0xE766, 0x93F6, 0xE767,\t0x93F7, 0xE768, 0x93F8, 0xE769, 0x93F9, 0xE76A, 0x93FA, 0xE76B,\n\t0x93FB, 0xE76C, 0x93FC, 0xE76D, 0x93FD, 0xE76E, 0x93FE, 0xE76F,\t0x93FF, 0xE770, 0x9400, 0xE771, 0x9401, 0xE772, 0x9402, 0xE773,\n\t0x9403, 0xE774, 0x9404, 0xE775, 0x9405, 0xE776, 0x9406, 0xE777,\t0x9407, 0xE778, 0x9408, 0xE779, 0x9409, 0xE77A, 0x940A, 0xE77B,\n\t0x940B, 0xE77C, 0x940C, 0xE77D, 0x940D, 0xE77E, 0x940E, 0xE780,\t0x940F, 0xE781, 0x9410, 0xE782, 0x9411, 0xE783, 0x9412, 0xE784,\n\t0x9413, 0xE785, 0x9414, 0xE786, 0x9415, 0xE787, 0x9416, 0xE788,\t0x9417, 0xE789, 0x9418, 0xE78A, 0x9419, 0xE78B, 0x941A, 0xE78C,\n\t0x941B, 0xE78D, 0x941C, 0xE78E, 0x941D, 0xE78F, 0x941E, 0xE790,\t0x941F, 0xE791, 0x9420, 0xE792, 0x9421, 0xE793, 0x9422, 0xE794,\n\t0x9423, 0xE795, 0x9424, 0xE796, 0x9425, 0xE797, 0x9426, 0xE798,\t0x9427, 0xE799, 0x9428, 0xE79A, 0x9429, 0xE79B, 0x942A, 0xE79C,\n\t0x942B, 0xE79D, 0x942C, 0xE79E, 0x942D, 0xE79F, 0x942E, 0xE7A0,\t0x942F, 0xE840, 0x9430, 0xE841, 0x9431, 0xE842, 0x9432, 0xE843,\n\t0x9433, 0xE844, 0x9434, 0xE845, 0x9435, 0xE846, 0x9436, 0xE847,\t0x9437, 0xE848, 0x9438, 0xE849, 0x9439, 0xE84A, 0x943A, 0xE84B,\n\t0x943B, 0xE84C, 0x943C, 0xE84D, 0x943D, 0xE84E, 0x943E, 0xF6CD,\t0x943F, 0xE84F, 0x9440, 0xE850, 0x9441, 0xE851, 0x9442, 0xE852,\n\t0x9443, 0xE853, 0x9444, 0xE854, 0x9445, 0xE855, 0x9446, 0xE856,\t0x9447, 0xE857, 0x9448, 0xE858, 0x9449, 0xE859, 0x944A, 0xE85A,\n\t0x944B, 0xE85B, 0x944C, 0xE85C, 0x944D, 0xE85D, 0x944E, 0xE85E,\t0x944F, 0xE85F, 0x9450, 0xE860, 0x9451, 0xE861, 0x9452, 0xE862,\n\t0x9453, 0xE863, 0x9454, 0xE864, 0x9455, 0xE865, 0x9456, 0xE866,\t0x9457, 0xE867, 0x9458, 0xE868, 0x9459, 0xE869, 0x945A, 0xE86A,\n\t0x945B, 0xE86B, 0x945C, 0xE86C, 0x945D, 0xE86D, 0x945E, 0xE86E,\t0x945F, 0xE86F, 0x9460, 0xE870, 0x9461, 0xE871, 0x9462, 0xE872,\n\t0x9463, 0xE873, 0x9464, 0xE874, 0x9465, 0xE875, 0x9466, 0xE876,\t0x9467, 0xE877, 0x9468, 0xE878, 0x9469, 0xE879, 0x946A, 0xE87A,\n\t0x946B, 0xF6CE, 0x946C, 0xE87B, 0x946D, 0xE87C, 0x946E, 0xE87D,\t0x946F, 0xE87E, 0x9470, 0xE880, 0x9471, 0xE881, 0x9472, 0xE882,\n\t0x9473, 0xE883, 0x9474, 0xE884, 0x9475, 0xE885, 0x9476, 0xE886,\t0x9477, 0xE887, 0x9478, 0xE888, 0x9479, 0xE889, 0x947A, 0xE88A,\n\t0x947B, 0xE88B, 0x947C, 0xE88C, 0x947D, 0xE88D, 0x947E, 0xE88E,\t0x947F, 0xE88F, 0x9480, 0xE890, 0x9481, 0xE891, 0x9482, 0xE892,\n\t0x9483, 0xE893, 0x9484, 0xE894, 0x9485, 0xEEC4, 0x9486, 0xEEC5,\t0x9487, 0xEEC6, 0x9488, 0xD5EB, 0x9489, 0xB6A4, 0x948A, 0xEEC8,\n\t0x948B, 0xEEC7, 0x948C, 0xEEC9, 0x948D, 0xEECA, 0x948E, 0xC7A5,\t0x948F, 0xEECB, 0x9490, 0xEECC, 0x9491, 0xE895, 0x9492, 0xB7B0,\n\t0x9493, 0xB5F6, 0x9494, 0xEECD, 0x9495, 0xEECF, 0x9496, 0xE896,\t0x9497, 0xEECE, 0x9498, 0xE897, 0x9499, 0xB8C6, 0x949A, 0xEED0,\n\t0x949B, 0xEED1, 0x949C, 0xEED2, 0x949D, 0xB6DB, 0x949E, 0xB3AE,\t0x949F, 0xD6D3, 0x94A0, 0xC4C6, 0x94A1, 0xB1B5, 0x94A2, 0xB8D6,\n\t0x94A3, 0xEED3, 0x94A4, 0xEED4, 0x94A5, 0xD4BF, 0x94A6, 0xC7D5,\t0x94A7, 0xBEFB, 0x94A8, 0xCED9, 0x94A9, 0xB9B3, 0x94AA, 0xEED6,\n\t0x94AB, 0xEED5, 0x94AC, 0xEED8, 0x94AD, 0xEED7, 0x94AE, 0xC5A5,\t0x94AF, 0xEED9, 0x94B0, 0xEEDA, 0x94B1, 0xC7AE, 0x94B2, 0xEEDB,\n\t0x94B3, 0xC7AF, 0x94B4, 0xEEDC, 0x94B5, 0xB2A7, 0x94B6, 0xEEDD,\t0x94B7, 0xEEDE, 0x94B8, 0xEEDF, 0x94B9, 0xEEE0, 0x94BA, 0xEEE1,\n\t0x94BB, 0xD7EA, 0x94BC, 0xEEE2, 0x94BD, 0xEEE3, 0x94BE, 0xBCD8,\t0x94BF, 0xEEE4, 0x94C0, 0xD3CB, 0x94C1, 0xCCFA, 0x94C2, 0xB2AC,\n\t0x94C3, 0xC1E5, 0x94C4, 0xEEE5, 0x94C5, 0xC7A6, 0x94C6, 0xC3AD,\t0x94C7, 0xE898, 0x94C8, 0xEEE6, 0x94C9, 0xEEE7, 0x94CA, 0xEEE8,\n\t0x94CB, 0xEEE9, 0x94CC, 0xEEEA, 0x94CD, 0xEEEB, 0x94CE, 0xEEEC,\t0x94CF, 0xE899, 0x94D0, 0xEEED, 0x94D1, 0xEEEE, 0x94D2, 0xEEEF,\n\t0x94D3, 0xE89A, 0x94D4, 0xE89B, 0x94D5, 0xEEF0, 0x94D6, 0xEEF1,\t0x94D7, 0xEEF2, 0x94D8, 0xEEF4, 0x94D9, 0xEEF3, 0x94DA, 0xE89C,\n\t0x94DB, 0xEEF5, 0x94DC, 0xCDAD, 0x94DD, 0xC2C1, 0x94DE, 0xEEF6,\t0x94DF, 0xEEF7, 0x94E0, 0xEEF8, 0x94E1, 0xD5A1, 0x94E2, 0xEEF9,\n\t0x94E3, 0xCFB3, 0x94E4, 0xEEFA, 0x94E5, 0xEEFB, 0x94E6, 0xE89D,\t0x94E7, 0xEEFC, 0x94E8, 0xEEFD, 0x94E9, 0xEFA1, 0x94EA, 0xEEFE,\n\t0x94EB, 0xEFA2, 0x94EC, 0xB8F5, 0x94ED, 0xC3FA, 0x94EE, 0xEFA3,\t0x94EF, 0xEFA4, 0x94F0, 0xBDC2, 0x94F1, 0xD2BF, 0x94F2, 0xB2F9,\n\t0x94F3, 0xEFA5, 0x94F4, 0xEFA6, 0x94F5, 0xEFA7, 0x94F6, 0xD2F8,\t0x94F7, 0xEFA8, 0x94F8, 0xD6FD, 0x94F9, 0xEFA9, 0x94FA, 0xC6CC,\n\t0x94FB, 0xE89E, 0x94FC, 0xEFAA, 0x94FD, 0xEFAB, 0x94FE, 0xC1B4,\t0x94FF, 0xEFAC, 0x9500, 0xCFFA, 0x9501, 0xCBF8, 0x9502, 0xEFAE,\n\t0x9503, 0xEFAD, 0x9504, 0xB3FA, 0x9505, 0xB9F8, 0x9506, 0xEFAF,\t0x9507, 0xEFB0, 0x9508, 0xD0E2, 0x9509, 0xEFB1, 0x950A, 0xEFB2,\n\t0x950B, 0xB7E6, 0x950C, 0xD0BF, 0x950D, 0xEFB3, 0x950E, 0xEFB4,\t0x950F, 0xEFB5, 0x9510, 0xC8F1, 0x9511, 0xCCE0, 0x9512, 0xEFB6,\n\t0x9513, 0xEFB7, 0x9514, 0xEFB8, 0x9515, 0xEFB9, 0x9516, 0xEFBA,\t0x9517, 0xD5E0, 0x9518, 0xEFBB, 0x9519, 0xB4ED, 0x951A, 0xC3AA,\n\t0x951B, 0xEFBC, 0x951C, 0xE89F, 0x951D, 0xEFBD, 0x951E, 0xEFBE,\t0x951F, 0xEFBF, 0x9520, 0xE8A0, 0x9521, 0xCEFD, 0x9522, 0xEFC0,\n\t0x9523, 0xC2E0, 0x9524, 0xB4B8, 0x9525, 0xD7B6, 0x9526, 0xBDF5,\t0x9527, 0xE940, 0x9528, 0xCFC7, 0x9529, 0xEFC3, 0x952A, 0xEFC1,\n\t0x952B, 0xEFC2, 0x952C, 0xEFC4, 0x952D, 0xB6A7, 0x952E, 0xBCFC,\t0x952F, 0xBEE2, 0x9530, 0xC3CC, 0x9531, 0xEFC5, 0x9532, 0xEFC6,\n\t0x9533, 0xE941, 0x9534, 0xEFC7, 0x9535, 0xEFCF, 0x9536, 0xEFC8,\t0x9537, 0xEFC9, 0x9538, 0xEFCA, 0x9539, 0xC7C2, 0x953A, 0xEFF1,\n\t0x953B, 0xB6CD, 0x953C, 0xEFCB, 0x953D, 0xE942, 0x953E, 0xEFCC,\t0x953F, 0xEFCD, 0x9540, 0xB6C6, 0x9541, 0xC3BE, 0x9542, 0xEFCE,\n\t0x9543, 0xE943, 0x9544, 0xEFD0, 0x9545, 0xEFD1, 0x9546, 0xEFD2,\t0x9547, 0xD5F2, 0x9548, 0xE944, 0x9549, 0xEFD3, 0x954A, 0xC4F7,\n\t0x954B, 0xE945, 0x954C, 0xEFD4, 0x954D, 0xC4F8, 0x954E, 0xEFD5,\t0x954F, 0xEFD6, 0x9550, 0xB8E4, 0x9551, 0xB0F7, 0x9552, 0xEFD7,\n\t0x9553, 0xEFD8, 0x9554, 0xEFD9, 0x9555, 0xE946, 0x9556, 0xEFDA,\t0x9557, 0xEFDB, 0x9558, 0xEFDC, 0x9559, 0xEFDD, 0x955A, 0xE947,\n\t0x955B, 0xEFDE, 0x955C, 0xBEB5, 0x955D, 0xEFE1, 0x955E, 0xEFDF,\t0x955F, 0xEFE0, 0x9560, 0xE948, 0x9561, 0xEFE2, 0x9562, 0xEFE3,\n\t0x9563, 0xC1CD, 0x9564, 0xEFE4, 0x9565, 0xEFE5, 0x9566, 0xEFE6,\t0x9567, 0xEFE7, 0x9568, 0xEFE8, 0x9569, 0xEFE9, 0x956A, 0xEFEA,\n\t0x956B, 0xEFEB, 0x956C, 0xEFEC, 0x956D, 0xC0D8, 0x956E, 0xE949,\t0x956F, 0xEFED, 0x9570, 0xC1AD, 0x9571, 0xEFEE, 0x9572, 0xEFEF,\n\t0x9573, 0xEFF0, 0x9574, 0xE94A, 0x9575, 0xE94B, 0x9576, 0xCFE2,\t0x9577, 0xE94C, 0x9578, 0xE94D, 0x9579, 0xE94E, 0x957A, 0xE94F,\n\t0x957B, 0xE950, 0x957C, 0xE951, 0x957D, 0xE952, 0x957E, 0xE953,\t0x957F, 0xB3A4, 0x9580, 0xE954, 0x9581, 0xE955, 0x9582, 0xE956,\n\t0x9583, 0xE957, 0x9584, 0xE958, 0x9585, 0xE959, 0x9586, 0xE95A,\t0x9587, 0xE95B, 0x9588, 0xE95C, 0x9589, 0xE95D, 0x958A, 0xE95E,\n\t0x958B, 0xE95F, 0x958C, 0xE960, 0x958D, 0xE961, 0x958E, 0xE962,\t0x958F, 0xE963, 0x9590, 0xE964, 0x9591, 0xE965, 0x9592, 0xE966,\n\t0x9593, 0xE967, 0x9594, 0xE968, 0x9595, 0xE969, 0x9596, 0xE96A,\t0x9597, 0xE96B, 0x9598, 0xE96C, 0x9599, 0xE96D, 0x959A, 0xE96E,\n\t0x959B, 0xE96F, 0x959C, 0xE970, 0x959D, 0xE971, 0x959E, 0xE972,\t0x959F, 0xE973, 0x95A0, 0xE974, 0x95A1, 0xE975, 0x95A2, 0xE976,\n\t0x95A3, 0xE977, 0x95A4, 0xE978, 0x95A5, 0xE979, 0x95A6, 0xE97A,\t0x95A7, 0xE97B, 0x95A8, 0xE97C, 0x95A9, 0xE97D, 0x95AA, 0xE97E,\n\t0x95AB, 0xE980, 0x95AC, 0xE981, 0x95AD, 0xE982, 0x95AE, 0xE983,\t0x95AF, 0xE984, 0x95B0, 0xE985, 0x95B1, 0xE986, 0x95B2, 0xE987,\n\t0x95B3, 0xE988, 0x95B4, 0xE989, 0x95B5, 0xE98A, 0x95B6, 0xE98B,\t0x95B7, 0xE98C, 0x95B8, 0xE98D, 0x95B9, 0xE98E, 0x95BA, 0xE98F,\n\t0x95BB, 0xE990, 0x95BC, 0xE991, 0x95BD, 0xE992, 0x95BE, 0xE993,\t0x95BF, 0xE994, 0x95C0, 0xE995, 0x95C1, 0xE996, 0x95C2, 0xE997,\n\t0x95C3, 0xE998, 0x95C4, 0xE999, 0x95C5, 0xE99A, 0x95C6, 0xE99B,\t0x95C7, 0xE99C, 0x95C8, 0xE99D, 0x95C9, 0xE99E, 0x95CA, 0xE99F,\n\t0x95CB, 0xE9A0, 0x95CC, 0xEA40, 0x95CD, 0xEA41, 0x95CE, 0xEA42,\t0x95CF, 0xEA43, 0x95D0, 0xEA44, 0x95D1, 0xEA45, 0x95D2, 0xEA46,\n\t0x95D3, 0xEA47, 0x95D4, 0xEA48, 0x95D5, 0xEA49, 0x95D6, 0xEA4A,\t0x95D7, 0xEA4B, 0x95D8, 0xEA4C, 0x95D9, 0xEA4D, 0x95DA, 0xEA4E,\n\t0x95DB, 0xEA4F, 0x95DC, 0xEA50, 0x95DD, 0xEA51, 0x95DE, 0xEA52,\t0x95DF, 0xEA53, 0x95E0, 0xEA54, 0x95E1, 0xEA55, 0x95E2, 0xEA56,\n\t0x95E3, 0xEA57, 0x95E4, 0xEA58, 0x95E5, 0xEA59, 0x95E6, 0xEA5A,\t0x95E7, 0xEA5B, 0x95E8, 0xC3C5, 0x95E9, 0xE3C5, 0x95EA, 0xC9C1,\n\t0x95EB, 0xE3C6, 0x95EC, 0xEA5C, 0x95ED, 0xB1D5, 0x95EE, 0xCECA,\t0x95EF, 0xB4B3, 0x95F0, 0xC8F2, 0x95F1, 0xE3C7, 0x95F2, 0xCFD0,\n\t0x95F3, 0xE3C8, 0x95F4, 0xBCE4, 0x95F5, 0xE3C9, 0x95F6, 0xE3CA,\t0x95F7, 0xC3C6, 0x95F8, 0xD5A2, 0x95F9, 0xC4D6, 0x95FA, 0xB9EB,\n\t0x95FB, 0xCEC5, 0x95FC, 0xE3CB, 0x95FD, 0xC3F6, 0x95FE, 0xE3CC,\t0x95FF, 0xEA5D, 0x9600, 0xB7A7, 0x9601, 0xB8F3, 0x9602, 0xBAD2,\n\t0x9603, 0xE3CD, 0x9604, 0xE3CE, 0x9605, 0xD4C4, 0x9606, 0xE3CF,\t0x9607, 0xEA5E, 0x9608, 0xE3D0, 0x9609, 0xD1CB, 0x960A, 0xE3D1,\n\t0x960B, 0xE3D2, 0x960C, 0xE3D3, 0x960D, 0xE3D4, 0x960E, 0xD1D6,\t0x960F, 0xE3D5, 0x9610, 0xB2FB, 0x9611, 0xC0BB, 0x9612, 0xE3D6,\n\t0x9613, 0xEA5F, 0x9614, 0xC0AB, 0x9615, 0xE3D7, 0x9616, 0xE3D8,\t0x9617, 0xE3D9, 0x9618, 0xEA60, 0x9619, 0xE3DA, 0x961A, 0xE3DB,\n\t0x961B, 0xEA61, 0x961C, 0xB8B7, 0x961D, 0xDAE2, 0x961E, 0xEA62,\t0x961F, 0xB6D3, 0x9620, 0xEA63, 0x9621, 0xDAE4, 0x9622, 0xDAE3,\n\t0x9623, 0xEA64, 0x9624, 0xEA65, 0x9625, 0xEA66, 0x9626, 0xEA67,\t0x9627, 0xEA68, 0x9628, 0xEA69, 0x9629, 0xEA6A, 0x962A, 0xDAE6,\n\t0x962B, 0xEA6B, 0x962C, 0xEA6C, 0x962D, 0xEA6D, 0x962E, 0xC8EE,\t0x962F, 0xEA6E, 0x9630, 0xEA6F, 0x9631, 0xDAE5, 0x9632, 0xB7C0,\n\t0x9633, 0xD1F4, 0x9634, 0xD2F5, 0x9635, 0xD5F3, 0x9636, 0xBDD7,\t0x9637, 0xEA70, 0x9638, 0xEA71, 0x9639, 0xEA72, 0x963A, 0xEA73,\n\t0x963B, 0xD7E8, 0x963C, 0xDAE8, 0x963D, 0xDAE7, 0x963E, 0xEA74,\t0x963F, 0xB0A2, 0x9640, 0xCDD3, 0x9641, 0xEA75, 0x9642, 0xDAE9,\n\t0x9643, 0xEA76, 0x9644, 0xB8BD, 0x9645, 0xBCCA, 0x9646, 0xC2BD,\t0x9647, 0xC2A4, 0x9648, 0xB3C2, 0x9649, 0xDAEA, 0x964A, 0xEA77,\n\t0x964B, 0xC2AA, 0x964C, 0xC4B0, 0x964D, 0xBDB5, 0x964E, 0xEA78,\t0x964F, 0xEA79, 0x9650, 0xCFDE, 0x9651, 0xEA7A, 0x9652, 0xEA7B,\n\t0x9653, 0xEA7C, 0x9654, 0xDAEB, 0x9655, 0xC9C2, 0x9656, 0xEA7D,\t0x9657, 0xEA7E, 0x9658, 0xEA80, 0x9659, 0xEA81, 0x965A, 0xEA82,\n\t0x965B, 0xB1DD, 0x965C, 0xEA83, 0x965D, 0xEA84, 0x965E, 0xEA85,\t0x965F, 0xDAEC, 0x9660, 0xEA86, 0x9661, 0xB6B8, 0x9662, 0xD4BA,\n\t0x9663, 0xEA87, 0x9664, 0xB3FD, 0x9665, 0xEA88, 0x9666, 0xEA89,\t0x9667, 0xDAED, 0x9668, 0xD4C9, 0x9669, 0xCFD5, 0x966A, 0xC5E3,\n\t0x966B, 0xEA8A, 0x966C, 0xDAEE, 0x966D, 0xEA8B, 0x966E, 0xEA8C,\t0x966F, 0xEA8D, 0x9670, 0xEA8E, 0x9671, 0xEA8F, 0x9672, 0xDAEF,\n\t0x9673, 0xEA90, 0x9674, 0xDAF0, 0x9675, 0xC1EA, 0x9676, 0xCCD5,\t0x9677, 0xCFDD, 0x9678, 0xEA91, 0x9679, 0xEA92, 0x967A, 0xEA93,\n\t0x967B, 0xEA94, 0x967C, 0xEA95, 0x967D, 0xEA96, 0x967E, 0xEA97,\t0x967F, 0xEA98, 0x9680, 0xEA99, 0x9681, 0xEA9A, 0x9682, 0xEA9B,\n\t0x9683, 0xEA9C, 0x9684, 0xEA9D, 0x9685, 0xD3E7, 0x9686, 0xC2A1,\t0x9687, 0xEA9E, 0x9688, 0xDAF1, 0x9689, 0xEA9F, 0x968A, 0xEAA0,\n\t0x968B, 0xCBE5, 0x968C, 0xEB40, 0x968D, 0xDAF2, 0x968E, 0xEB41,\t0x968F, 0xCBE6, 0x9690, 0xD2FE, 0x9691, 0xEB42, 0x9692, 0xEB43,\n\t0x9693, 0xEB44, 0x9694, 0xB8F4, 0x9695, 0xEB45, 0x9696, 0xEB46,\t0x9697, 0xDAF3, 0x9698, 0xB0AF, 0x9699, 0xCFB6, 0x969A, 0xEB47,\n\t0x969B, 0xEB48, 0x969C, 0xD5CF, 0x969D, 0xEB49, 0x969E, 0xEB4A,\t0x969F, 0xEB4B, 0x96A0, 0xEB4C, 0x96A1, 0xEB4D, 0x96A2, 0xEB4E,\n\t0x96A3, 0xEB4F, 0x96A4, 0xEB50, 0x96A5, 0xEB51, 0x96A6, 0xEB52,\t0x96A7, 0xCBED, 0x96A8, 0xEB53, 0x96A9, 0xEB54, 0x96AA, 0xEB55,\n\t0x96AB, 0xEB56, 0x96AC, 0xEB57, 0x96AD, 0xEB58, 0x96AE, 0xEB59,\t0x96AF, 0xEB5A, 0x96B0, 0xDAF4, 0x96B1, 0xEB5B, 0x96B2, 0xEB5C,\n\t0x96B3, 0xE3C4, 0x96B4, 0xEB5D, 0x96B5, 0xEB5E, 0x96B6, 0xC1A5,\t0x96B7, 0xEB5F, 0x96B8, 0xEB60, 0x96B9, 0xF6BF, 0x96BA, 0xEB61,\n\t0x96BB, 0xEB62, 0x96BC, 0xF6C0, 0x96BD, 0xF6C1, 0x96BE, 0xC4D1,\t0x96BF, 0xEB63, 0x96C0, 0xC8B8, 0x96C1, 0xD1E3, 0x96C2, 0xEB64,\n\t0x96C3, 0xEB65, 0x96C4, 0xD0DB, 0x96C5, 0xD1C5, 0x96C6, 0xBCAF,\t0x96C7, 0xB9CD, 0x96C8, 0xEB66, 0x96C9, 0xEFF4, 0x96CA, 0xEB67,\n\t0x96CB, 0xEB68, 0x96CC, 0xB4C6, 0x96CD, 0xD3BA, 0x96CE, 0xF6C2,\t0x96CF, 0xB3FB, 0x96D0, 0xEB69, 0x96D1, 0xEB6A, 0x96D2, 0xF6C3,\n\t0x96D3, 0xEB6B, 0x96D4, 0xEB6C, 0x96D5, 0xB5F1, 0x96D6, 0xEB6D,\t0x96D7, 0xEB6E, 0x96D8, 0xEB6F, 0x96D9, 0xEB70, 0x96DA, 0xEB71,\n\t0x96DB, 0xEB72, 0x96DC, 0xEB73, 0x96DD, 0xEB74, 0x96DE, 0xEB75,\t0x96DF, 0xEB76, 0x96E0, 0xF6C5, 0x96E1, 0xEB77, 0x96E2, 0xEB78,\n\t0x96E3, 0xEB79, 0x96E4, 0xEB7A, 0x96E5, 0xEB7B, 0x96E6, 0xEB7C,\t0x96E7, 0xEB7D, 0x96E8, 0xD3EA, 0x96E9, 0xF6A7, 0x96EA, 0xD1A9,\n\t0x96EB, 0xEB7E, 0x96EC, 0xEB80, 0x96ED, 0xEB81, 0x96EE, 0xEB82,\t0x96EF, 0xF6A9, 0x96F0, 0xEB83, 0x96F1, 0xEB84, 0x96F2, 0xEB85,\n\t0x96F3, 0xF6A8, 0x96F4, 0xEB86, 0x96F5, 0xEB87, 0x96F6, 0xC1E3,\t0x96F7, 0xC0D7, 0x96F8, 0xEB88, 0x96F9, 0xB1A2, 0x96FA, 0xEB89,\n\t0x96FB, 0xEB8A, 0x96FC, 0xEB8B, 0x96FD, 0xEB8C, 0x96FE, 0xCEED,\t0x96FF, 0xEB8D, 0x9700, 0xD0E8, 0x9701, 0xF6AB, 0x9702, 0xEB8E,\n\t0x9703, 0xEB8F, 0x9704, 0xCFF6, 0x9705, 0xEB90, 0x9706, 0xF6AA,\t0x9707, 0xD5F0, 0x9708, 0xF6AC, 0x9709, 0xC3B9, 0x970A, 0xEB91,\n\t0x970B, 0xEB92, 0x970C, 0xEB93, 0x970D, 0xBBF4, 0x970E, 0xF6AE,\t0x970F, 0xF6AD, 0x9710, 0xEB94, 0x9711, 0xEB95, 0x9712, 0xEB96,\n\t0x9713, 0xC4DE, 0x9714, 0xEB97, 0x9715, 0xEB98, 0x9716, 0xC1D8,\t0x9717, 0xEB99, 0x9718, 0xEB9A, 0x9719, 0xEB9B, 0x971A, 0xEB9C,\n\t0x971B, 0xEB9D, 0x971C, 0xCBAA, 0x971D, 0xEB9E, 0x971E, 0xCFBC,\t0x971F, 0xEB9F, 0x9720, 0xEBA0, 0x9721, 0xEC40, 0x9722, 0xEC41,\n\t0x9723, 0xEC42, 0x9724, 0xEC43, 0x9725, 0xEC44, 0x9726, 0xEC45,\t0x9727, 0xEC46, 0x9728, 0xEC47, 0x9729, 0xEC48, 0x972A, 0xF6AF,\n\t0x972B, 0xEC49, 0x972C, 0xEC4A, 0x972D, 0xF6B0, 0x972E, 0xEC4B,\t0x972F, 0xEC4C, 0x9730, 0xF6B1, 0x9731, 0xEC4D, 0x9732, 0xC2B6,\n\t0x9733, 0xEC4E, 0x9734, 0xEC4F, 0x9735, 0xEC50, 0x9736, 0xEC51,\t0x9737, 0xEC52, 0x9738, 0xB0D4, 0x9739, 0xC5F9, 0x973A, 0xEC53,\n\t0x973B, 0xEC54, 0x973C, 0xEC55, 0x973D, 0xEC56, 0x973E, 0xF6B2,\t0x973F, 0xEC57, 0x9740, 0xEC58, 0x9741, 0xEC59, 0x9742, 0xEC5A,\n\t0x9743, 0xEC5B, 0x9744, 0xEC5C, 0x9745, 0xEC5D, 0x9746, 0xEC5E,\t0x9747, 0xEC5F, 0x9748, 0xEC60, 0x9749, 0xEC61, 0x974A, 0xEC62,\n\t0x974B, 0xEC63, 0x974C, 0xEC64, 0x974D, 0xEC65, 0x974E, 0xEC66,\t0x974F, 0xEC67, 0x9750, 0xEC68, 0x9751, 0xEC69, 0x9752, 0xC7E0,\n\t0x9753, 0xF6A6, 0x9754, 0xEC6A, 0x9755, 0xEC6B, 0x9756, 0xBEB8,\t0x9757, 0xEC6C, 0x9758, 0xEC6D, 0x9759, 0xBEB2, 0x975A, 0xEC6E,\n\t0x975B, 0xB5E5, 0x975C, 0xEC6F, 0x975D, 0xEC70, 0x975E, 0xB7C7,\t0x975F, 0xEC71, 0x9760, 0xBFBF, 0x9761, 0xC3D2, 0x9762, 0xC3E6,\n\t0x9763, 0xEC72, 0x9764, 0xEC73, 0x9765, 0xD8CC, 0x9766, 0xEC74,\t0x9767, 0xEC75, 0x9768, 0xEC76, 0x9769, 0xB8EF, 0x976A, 0xEC77,\n\t0x976B, 0xEC78, 0x976C, 0xEC79, 0x976D, 0xEC7A, 0x976E, 0xEC7B,\t0x976F, 0xEC7C, 0x9770, 0xEC7D, 0x9771, 0xEC7E, 0x9772, 0xEC80,\n\t0x9773, 0xBDF9, 0x9774, 0xD1A5, 0x9775, 0xEC81, 0x9776, 0xB0D0,\t0x9777, 0xEC82, 0x9778, 0xEC83, 0x9779, 0xEC84, 0x977A, 0xEC85,\n\t0x977B, 0xEC86, 0x977C, 0xF7B0, 0x977D, 0xEC87, 0x977E, 0xEC88,\t0x977F, 0xEC89, 0x9780, 0xEC8A, 0x9781, 0xEC8B, 0x9782, 0xEC8C,\n\t0x9783, 0xEC8D, 0x9784, 0xEC8E, 0x9785, 0xF7B1, 0x9786, 0xEC8F,\t0x9787, 0xEC90, 0x9788, 0xEC91, 0x9789, 0xEC92, 0x978A, 0xEC93,\n\t0x978B, 0xD0AC, 0x978C, 0xEC94, 0x978D, 0xB0B0, 0x978E, 0xEC95,\t0x978F, 0xEC96, 0x9790, 0xEC97, 0x9791, 0xF7B2, 0x9792, 0xF7B3,\n\t0x9793, 0xEC98, 0x9794, 0xF7B4, 0x9795, 0xEC99, 0x9796, 0xEC9A,\t0x9797, 0xEC9B, 0x9798, 0xC7CA, 0x9799, 0xEC9C, 0x979A, 0xEC9D,\n\t0x979B, 0xEC9E, 0x979C, 0xEC9F, 0x979D, 0xECA0, 0x979E, 0xED40,\t0x979F, 0xED41, 0x97A0, 0xBECF, 0x97A1, 0xED42, 0x97A2, 0xED43,\n\t0x97A3, 0xF7B7, 0x97A4, 0xED44, 0x97A5, 0xED45, 0x97A6, 0xED46,\t0x97A7, 0xED47, 0x97A8, 0xED48, 0x97A9, 0xED49, 0x97AA, 0xED4A,\n\t0x97AB, 0xF7B6, 0x97AC, 0xED4B, 0x97AD, 0xB1DE, 0x97AE, 0xED4C,\t0x97AF, 0xF7B5, 0x97B0, 0xED4D, 0x97B1, 0xED4E, 0x97B2, 0xF7B8,\n\t0x97B3, 0xED4F, 0x97B4, 0xF7B9, 0x97B5, 0xED50, 0x97B6, 0xED51,\t0x97B7, 0xED52, 0x97B8, 0xED53, 0x97B9, 0xED54, 0x97BA, 0xED55,\n\t0x97BB, 0xED56, 0x97BC, 0xED57, 0x97BD, 0xED58, 0x97BE, 0xED59,\t0x97BF, 0xED5A, 0x97C0, 0xED5B, 0x97C1, 0xED5C, 0x97C2, 0xED5D,\n\t0x97C3, 0xED5E, 0x97C4, 0xED5F, 0x97C5, 0xED60, 0x97C6, 0xED61,\t0x97C7, 0xED62, 0x97C8, 0xED63, 0x97C9, 0xED64, 0x97CA, 0xED65,\n\t0x97CB, 0xED66, 0x97CC, 0xED67, 0x97CD, 0xED68, 0x97CE, 0xED69,\t0x97CF, 0xED6A, 0x97D0, 0xED6B, 0x97D1, 0xED6C, 0x97D2, 0xED6D,\n\t0x97D3, 0xED6E, 0x97D4, 0xED6F, 0x97D5, 0xED70, 0x97D6, 0xED71,\t0x97D7, 0xED72, 0x97D8, 0xED73, 0x97D9, 0xED74, 0x97DA, 0xED75,\n\t0x97DB, 0xED76, 0x97DC, 0xED77, 0x97DD, 0xED78, 0x97DE, 0xED79,\t0x97DF, 0xED7A, 0x97E0, 0xED7B, 0x97E1, 0xED7C, 0x97E2, 0xED7D,\n\t0x97E3, 0xED7E, 0x97E4, 0xED80, 0x97E5, 0xED81, 0x97E6, 0xCEA4,\t0x97E7, 0xC8CD, 0x97E8, 0xED82, 0x97E9, 0xBAAB, 0x97EA, 0xE8B8,\n\t0x97EB, 0xE8B9, 0x97EC, 0xE8BA, 0x97ED, 0xBEC2, 0x97EE, 0xED83,\t0x97EF, 0xED84, 0x97F0, 0xED85, 0x97F1, 0xED86, 0x97F2, 0xED87,\n\t0x97F3, 0xD2F4, 0x97F4, 0xED88, 0x97F5, 0xD4CF, 0x97F6, 0xC9D8,\t0x97F7, 0xED89, 0x97F8, 0xED8A, 0x97F9, 0xED8B, 0x97FA, 0xED8C,\n\t0x97FB, 0xED8D, 0x97FC, 0xED8E, 0x97FD, 0xED8F, 0x97FE, 0xED90,\t0x97FF, 0xED91, 0x9800, 0xED92, 0x9801, 0xED93, 0x9802, 0xED94,\n\t0x9803, 0xED95, 0x9804, 0xED96, 0x9805, 0xED97, 0x9806, 0xED98,\t0x9807, 0xED99, 0x9808, 0xED9A, 0x9809, 0xED9B, 0x980A, 0xED9C,\n\t0x980B, 0xED9D, 0x980C, 0xED9E, 0x980D, 0xED9F, 0x980E, 0xEDA0,\t0x980F, 0xEE40, 0x9810, 0xEE41, 0x9811, 0xEE42, 0x9812, 0xEE43,\n\t0x9813, 0xEE44, 0x9814, 0xEE45, 0x9815, 0xEE46, 0x9816, 0xEE47,\t0x9817, 0xEE48, 0x9818, 0xEE49, 0x9819, 0xEE4A, 0x981A, 0xEE4B,\n\t0x981B, 0xEE4C, 0x981C, 0xEE4D, 0x981D, 0xEE4E, 0x981E, 0xEE4F,\t0x981F, 0xEE50, 0x9820, 0xEE51, 0x9821, 0xEE52, 0x9822, 0xEE53,\n\t0x9823, 0xEE54, 0x9824, 0xEE55, 0x9825, 0xEE56, 0x9826, 0xEE57,\t0x9827, 0xEE58, 0x9828, 0xEE59, 0x9829, 0xEE5A, 0x982A, 0xEE5B,\n\t0x982B, 0xEE5C, 0x982C, 0xEE5D, 0x982D, 0xEE5E, 0x982E, 0xEE5F,\t0x982F, 0xEE60, 0x9830, 0xEE61, 0x9831, 0xEE62, 0x9832, 0xEE63,\n\t0x9833, 0xEE64, 0x9834, 0xEE65, 0x9835, 0xEE66, 0x9836, 0xEE67,\t0x9837, 0xEE68, 0x9838, 0xEE69, 0x9839, 0xEE6A, 0x983A, 0xEE6B,\n\t0x983B, 0xEE6C, 0x983C, 0xEE6D, 0x983D, 0xEE6E, 0x983E, 0xEE6F,\t0x983F, 0xEE70, 0x9840, 0xEE71, 0x9841, 0xEE72, 0x9842, 0xEE73,\n\t0x9843, 0xEE74, 0x9844, 0xEE75, 0x9845, 0xEE76, 0x9846, 0xEE77,\t0x9847, 0xEE78, 0x9848, 0xEE79, 0x9849, 0xEE7A, 0x984A, 0xEE7B,\n\t0x984B, 0xEE7C, 0x984C, 0xEE7D, 0x984D, 0xEE7E, 0x984E, 0xEE80,\t0x984F, 0xEE81, 0x9850, 0xEE82, 0x9851, 0xEE83, 0x9852, 0xEE84,\n\t0x9853, 0xEE85, 0x9854, 0xEE86, 0x9855, 0xEE87, 0x9856, 0xEE88,\t0x9857, 0xEE89, 0x9858, 0xEE8A, 0x9859, 0xEE8B, 0x985A, 0xEE8C,\n\t0x985B, 0xEE8D, 0x985C, 0xEE8E, 0x985D, 0xEE8F, 0x985E, 0xEE90,\t0x985F, 0xEE91, 0x9860, 0xEE92, 0x9861, 0xEE93, 0x9862, 0xEE94,\n\t0x9863, 0xEE95, 0x9864, 0xEE96, 0x9865, 0xEE97, 0x9866, 0xEE98,\t0x9867, 0xEE99, 0x9868, 0xEE9A, 0x9869, 0xEE9B, 0x986A, 0xEE9C,\n\t0x986B, 0xEE9D, 0x986C, 0xEE9E, 0x986D, 0xEE9F, 0x986E, 0xEEA0,\t0x986F, 0xEF40, 0x9870, 0xEF41, 0x9871, 0xEF42, 0x9872, 0xEF43,\n\t0x9873, 0xEF44, 0x9874, 0xEF45, 0x9875, 0xD2B3, 0x9876, 0xB6A5,\t0x9877, 0xC7EA, 0x9878, 0xF1FC, 0x9879, 0xCFEE, 0x987A, 0xCBB3,\n\t0x987B, 0xD0EB, 0x987C, 0xE7EF, 0x987D, 0xCDE7, 0x987E, 0xB9CB,\t0x987F, 0xB6D9, 0x9880, 0xF1FD, 0x9881, 0xB0E4, 0x9882, 0xCBCC,\n\t0x9883, 0xF1FE, 0x9884, 0xD4A4, 0x9885, 0xC2AD, 0x9886, 0xC1EC,\t0x9887, 0xC6C4, 0x9888, 0xBEB1, 0x9889, 0xF2A1, 0x988A, 0xBCD5,\n\t0x988B, 0xEF46, 0x988C, 0xF2A2, 0x988D, 0xF2A3, 0x988E, 0xEF47,\t0x988F, 0xF2A4, 0x9890, 0xD2C3, 0x9891, 0xC6B5, 0x9892, 0xEF48,\n\t0x9893, 0xCDC7, 0x9894, 0xF2A5, 0x9895, 0xEF49, 0x9896, 0xD3B1,\t0x9897, 0xBFC5, 0x9898, 0xCCE2, 0x9899, 0xEF4A, 0x989A, 0xF2A6,\n\t0x989B, 0xF2A7, 0x989C, 0xD1D5, 0x989D, 0xB6EE, 0x989E, 0xF2A8,\t0x989F, 0xF2A9, 0x98A0, 0xB5DF, 0x98A1, 0xF2AA, 0x98A2, 0xF2AB,\n\t0x98A3, 0xEF4B, 0x98A4, 0xB2FC, 0x98A5, 0xF2AC, 0x98A6, 0xF2AD,\t0x98A7, 0xC8A7, 0x98A8, 0xEF4C, 0x98A9, 0xEF4D, 0x98AA, 0xEF4E,\n\t0x98AB, 0xEF4F, 0x98AC, 0xEF50, 0x98AD, 0xEF51, 0x98AE, 0xEF52,\t0x98AF, 0xEF53, 0x98B0, 0xEF54, 0x98B1, 0xEF55, 0x98B2, 0xEF56,\n\t0x98B3, 0xEF57, 0x98B4, 0xEF58, 0x98B5, 0xEF59, 0x98B6, 0xEF5A,\t0x98B7, 0xEF5B, 0x98B8, 0xEF5C, 0x98B9, 0xEF5D, 0x98BA, 0xEF5E,\n\t0x98BB, 0xEF5F, 0x98BC, 0xEF60, 0x98BD, 0xEF61, 0x98BE, 0xEF62,\t0x98BF, 0xEF63, 0x98C0, 0xEF64, 0x98C1, 0xEF65, 0x98C2, 0xEF66,\n\t0x98C3, 0xEF67, 0x98C4, 0xEF68, 0x98C5, 0xEF69, 0x98C6, 0xEF6A,\t0x98C7, 0xEF6B, 0x98C8, 0xEF6C, 0x98C9, 0xEF6D, 0x98CA, 0xEF6E,\n\t0x98CB, 0xEF6F, 0x98CC, 0xEF70, 0x98CD, 0xEF71, 0x98CE, 0xB7E7,\t0x98CF, 0xEF72, 0x98D0, 0xEF73, 0x98D1, 0xECA9, 0x98D2, 0xECAA,\n\t0x98D3, 0xECAB, 0x98D4, 0xEF74, 0x98D5, 0xECAC, 0x98D6, 0xEF75,\t0x98D7, 0xEF76, 0x98D8, 0xC6AE, 0x98D9, 0xECAD, 0x98DA, 0xECAE,\n\t0x98DB, 0xEF77, 0x98DC, 0xEF78, 0x98DD, 0xEF79, 0x98DE, 0xB7C9,\t0x98DF, 0xCAB3, 0x98E0, 0xEF7A, 0x98E1, 0xEF7B, 0x98E2, 0xEF7C,\n\t0x98E3, 0xEF7D, 0x98E4, 0xEF7E, 0x98E5, 0xEF80, 0x98E6, 0xEF81,\t0x98E7, 0xE2B8, 0x98E8, 0xF7CF, 0x98E9, 0xEF82, 0x98EA, 0xEF83,\n\t0x98EB, 0xEF84, 0x98EC, 0xEF85, 0x98ED, 0xEF86, 0x98EE, 0xEF87,\t0x98EF, 0xEF88, 0x98F0, 0xEF89, 0x98F1, 0xEF8A, 0x98F2, 0xEF8B,\n\t0x98F3, 0xEF8C, 0x98F4, 0xEF8D, 0x98F5, 0xEF8E, 0x98F6, 0xEF8F,\t0x98F7, 0xEF90, 0x98F8, 0xEF91, 0x98F9, 0xEF92, 0x98FA, 0xEF93,\n\t0x98FB, 0xEF94, 0x98FC, 0xEF95, 0x98FD, 0xEF96, 0x98FE, 0xEF97,\t0x98FF, 0xEF98, 0x9900, 0xEF99, 0x9901, 0xEF9A, 0x9902, 0xEF9B,\n\t0x9903, 0xEF9C, 0x9904, 0xEF9D, 0x9905, 0xEF9E, 0x9906, 0xEF9F,\t0x9907, 0xEFA0, 0x9908, 0xF040, 0x9909, 0xF041, 0x990A, 0xF042,\n\t0x990B, 0xF043, 0x990C, 0xF044, 0x990D, 0xF7D0, 0x990E, 0xF045,\t0x990F, 0xF046, 0x9910, 0xB2CD, 0x9911, 0xF047, 0x9912, 0xF048,\n\t0x9913, 0xF049, 0x9914, 0xF04A, 0x9915, 0xF04B, 0x9916, 0xF04C,\t0x9917, 0xF04D, 0x9918, 0xF04E, 0x9919, 0xF04F, 0x991A, 0xF050,\n\t0x991B, 0xF051, 0x991C, 0xF052, 0x991D, 0xF053, 0x991E, 0xF054,\t0x991F, 0xF055, 0x9920, 0xF056, 0x9921, 0xF057, 0x9922, 0xF058,\n\t0x9923, 0xF059, 0x9924, 0xF05A, 0x9925, 0xF05B, 0x9926, 0xF05C,\t0x9927, 0xF05D, 0x9928, 0xF05E, 0x9929, 0xF05F, 0x992A, 0xF060,\n\t0x992B, 0xF061, 0x992C, 0xF062, 0x992D, 0xF063, 0x992E, 0xF7D1,\t0x992F, 0xF064, 0x9930, 0xF065, 0x9931, 0xF066, 0x9932, 0xF067,\n\t0x9933, 0xF068, 0x9934, 0xF069, 0x9935, 0xF06A, 0x9936, 0xF06B,\t0x9937, 0xF06C, 0x9938, 0xF06D, 0x9939, 0xF06E, 0x993A, 0xF06F,\n\t0x993B, 0xF070, 0x993C, 0xF071, 0x993D, 0xF072, 0x993E, 0xF073,\t0x993F, 0xF074, 0x9940, 0xF075, 0x9941, 0xF076, 0x9942, 0xF077,\n\t0x9943, 0xF078, 0x9944, 0xF079, 0x9945, 0xF07A, 0x9946, 0xF07B,\t0x9947, 0xF07C, 0x9948, 0xF07D, 0x9949, 0xF07E, 0x994A, 0xF080,\n\t0x994B, 0xF081, 0x994C, 0xF082, 0x994D, 0xF083, 0x994E, 0xF084,\t0x994F, 0xF085, 0x9950, 0xF086, 0x9951, 0xF087, 0x9952, 0xF088,\n\t0x9953, 0xF089, 0x9954, 0xF7D3, 0x9955, 0xF7D2, 0x9956, 0xF08A,\t0x9957, 0xF08B, 0x9958, 0xF08C, 0x9959, 0xF08D, 0x995A, 0xF08E,\n\t0x995B, 0xF08F, 0x995C, 0xF090, 0x995D, 0xF091, 0x995E, 0xF092,\t0x995F, 0xF093, 0x9960, 0xF094, 0x9961, 0xF095, 0x9962, 0xF096,\n\t0x9963, 0xE2BB, 0x9964, 0xF097, 0x9965, 0xBCA2, 0x9966, 0xF098,\t0x9967, 0xE2BC, 0x9968, 0xE2BD, 0x9969, 0xE2BE, 0x996A, 0xE2BF,\n\t0x996B, 0xE2C0, 0x996C, 0xE2C1, 0x996D, 0xB7B9, 0x996E, 0xD2FB,\t0x996F, 0xBDA4, 0x9970, 0xCACE, 0x9971, 0xB1A5, 0x9972, 0xCBC7,\n\t0x9973, 0xF099, 0x9974, 0xE2C2, 0x9975, 0xB6FC, 0x9976, 0xC8C4,\t0x9977, 0xE2C3, 0x9978, 0xF09A, 0x9979, 0xF09B, 0x997A, 0xBDC8,\n\t0x997B, 0xF09C, 0x997C, 0xB1FD, 0x997D, 0xE2C4, 0x997E, 0xF09D,\t0x997F, 0xB6F6, 0x9980, 0xE2C5, 0x9981, 0xC4D9, 0x9982, 0xF09E,\n\t0x9983, 0xF09F, 0x9984, 0xE2C6, 0x9985, 0xCFDA, 0x9986, 0xB9DD,\t0x9987, 0xE2C7, 0x9988, 0xC0A1, 0x9989, 0xF0A0, 0x998A, 0xE2C8,\n\t0x998B, 0xB2F6, 0x998C, 0xF140, 0x998D, 0xE2C9, 0x998E, 0xF141,\t0x998F, 0xC1F3, 0x9990, 0xE2CA, 0x9991, 0xE2CB, 0x9992, 0xC2F8,\n\t0x9993, 0xE2CC, 0x9994, 0xE2CD, 0x9995, 0xE2CE, 0x9996, 0xCAD7,\t0x9997, 0xD8B8, 0x9998, 0xD9E5, 0x9999, 0xCFE3, 0x999A, 0xF142,\n\t0x999B, 0xF143, 0x999C, 0xF144, 0x999D, 0xF145, 0x999E, 0xF146,\t0x999F, 0xF147, 0x99A0, 0xF148, 0x99A1, 0xF149, 0x99A2, 0xF14A,\n\t0x99A3, 0xF14B, 0x99A4, 0xF14C, 0x99A5, 0xF0A5, 0x99A6, 0xF14D,\t0x99A7, 0xF14E, 0x99A8, 0xDCB0, 0x99A9, 0xF14F, 0x99AA, 0xF150,\n\t0x99AB, 0xF151, 0x99AC, 0xF152, 0x99AD, 0xF153, 0x99AE, 0xF154,\t0x99AF, 0xF155, 0x99B0, 0xF156, 0x99B1, 0xF157, 0x99B2, 0xF158,\n\t0x99B3, 0xF159, 0x99B4, 0xF15A, 0x99B5, 0xF15B, 0x99B6, 0xF15C,\t0x99B7, 0xF15D, 0x99B8, 0xF15E, 0x99B9, 0xF15F, 0x99BA, 0xF160,\n\t0x99BB, 0xF161, 0x99BC, 0xF162, 0x99BD, 0xF163, 0x99BE, 0xF164,\t0x99BF, 0xF165, 0x99C0, 0xF166, 0x99C1, 0xF167, 0x99C2, 0xF168,\n\t0x99C3, 0xF169, 0x99C4, 0xF16A, 0x99C5, 0xF16B, 0x99C6, 0xF16C,\t0x99C7, 0xF16D, 0x99C8, 0xF16E, 0x99C9, 0xF16F, 0x99CA, 0xF170,\n\t0x99CB, 0xF171, 0x99CC, 0xF172, 0x99CD, 0xF173, 0x99CE, 0xF174,\t0x99CF, 0xF175, 0x99D0, 0xF176, 0x99D1, 0xF177, 0x99D2, 0xF178,\n\t0x99D3, 0xF179, 0x99D4, 0xF17A, 0x99D5, 0xF17B, 0x99D6, 0xF17C,\t0x99D7, 0xF17D, 0x99D8, 0xF17E, 0x99D9, 0xF180, 0x99DA, 0xF181,\n\t0x99DB, 0xF182, 0x99DC, 0xF183, 0x99DD, 0xF184, 0x99DE, 0xF185,\t0x99DF, 0xF186, 0x99E0, 0xF187, 0x99E1, 0xF188, 0x99E2, 0xF189,\n\t0x99E3, 0xF18A, 0x99E4, 0xF18B, 0x99E5, 0xF18C, 0x99E6, 0xF18D,\t0x99E7, 0xF18E, 0x99E8, 0xF18F, 0x99E9, 0xF190, 0x99EA, 0xF191,\n\t0x99EB, 0xF192, 0x99EC, 0xF193, 0x99ED, 0xF194, 0x99EE, 0xF195,\t0x99EF, 0xF196, 0x99F0, 0xF197, 0x99F1, 0xF198, 0x99F2, 0xF199,\n\t0x99F3, 0xF19A, 0x99F4, 0xF19B, 0x99F5, 0xF19C, 0x99F6, 0xF19D,\t0x99F7, 0xF19E, 0x99F8, 0xF19F, 0x99F9, 0xF1A0, 0x99FA, 0xF240,\n\t0x99FB, 0xF241, 0x99FC, 0xF242, 0x99FD, 0xF243, 0x99FE, 0xF244,\t0x99FF, 0xF245, 0x9A00, 0xF246, 0x9A01, 0xF247, 0x9A02, 0xF248,\n\t0x9A03, 0xF249, 0x9A04, 0xF24A, 0x9A05, 0xF24B, 0x9A06, 0xF24C,\t0x9A07, 0xF24D, 0x9A08, 0xF24E, 0x9A09, 0xF24F, 0x9A0A, 0xF250,\n\t0x9A0B, 0xF251, 0x9A0C, 0xF252, 0x9A0D, 0xF253, 0x9A0E, 0xF254,\t0x9A0F, 0xF255, 0x9A10, 0xF256, 0x9A11, 0xF257, 0x9A12, 0xF258,\n\t0x9A13, 0xF259, 0x9A14, 0xF25A, 0x9A15, 0xF25B, 0x9A16, 0xF25C,\t0x9A17, 0xF25D, 0x9A18, 0xF25E, 0x9A19, 0xF25F, 0x9A1A, 0xF260,\n\t0x9A1B, 0xF261, 0x9A1C, 0xF262, 0x9A1D, 0xF263, 0x9A1E, 0xF264,\t0x9A1F, 0xF265, 0x9A20, 0xF266, 0x9A21, 0xF267, 0x9A22, 0xF268,\n\t0x9A23, 0xF269, 0x9A24, 0xF26A, 0x9A25, 0xF26B, 0x9A26, 0xF26C,\t0x9A27, 0xF26D, 0x9A28, 0xF26E, 0x9A29, 0xF26F, 0x9A2A, 0xF270,\n\t0x9A2B, 0xF271, 0x9A2C, 0xF272, 0x9A2D, 0xF273, 0x9A2E, 0xF274,\t0x9A2F, 0xF275, 0x9A30, 0xF276, 0x9A31, 0xF277, 0x9A32, 0xF278,\n\t0x9A33, 0xF279, 0x9A34, 0xF27A, 0x9A35, 0xF27B, 0x9A36, 0xF27C,\t0x9A37, 0xF27D, 0x9A38, 0xF27E, 0x9A39, 0xF280, 0x9A3A, 0xF281,\n\t0x9A3B, 0xF282, 0x9A3C, 0xF283, 0x9A3D, 0xF284, 0x9A3E, 0xF285,\t0x9A3F, 0xF286, 0x9A40, 0xF287, 0x9A41, 0xF288, 0x9A42, 0xF289,\n\t0x9A43, 0xF28A, 0x9A44, 0xF28B, 0x9A45, 0xF28C, 0x9A46, 0xF28D,\t0x9A47, 0xF28E, 0x9A48, 0xF28F, 0x9A49, 0xF290, 0x9A4A, 0xF291,\n\t0x9A4B, 0xF292, 0x9A4C, 0xF293, 0x9A4D, 0xF294, 0x9A4E, 0xF295,\t0x9A4F, 0xF296, 0x9A50, 0xF297, 0x9A51, 0xF298, 0x9A52, 0xF299,\n\t0x9A53, 0xF29A, 0x9A54, 0xF29B, 0x9A55, 0xF29C, 0x9A56, 0xF29D,\t0x9A57, 0xF29E, 0x9A58, 0xF29F, 0x9A59, 0xF2A0, 0x9A5A, 0xF340,\n\t0x9A5B, 0xF341, 0x9A5C, 0xF342, 0x9A5D, 0xF343, 0x9A5E, 0xF344,\t0x9A5F, 0xF345, 0x9A60, 0xF346, 0x9A61, 0xF347, 0x9A62, 0xF348,\n\t0x9A63, 0xF349, 0x9A64, 0xF34A, 0x9A65, 0xF34B, 0x9A66, 0xF34C,\t0x9A67, 0xF34D, 0x9A68, 0xF34E, 0x9A69, 0xF34F, 0x9A6A, 0xF350,\n\t0x9A6B, 0xF351, 0x9A6C, 0xC2ED, 0x9A6D, 0xD4A6, 0x9A6E, 0xCDD4,\t0x9A6F, 0xD1B1, 0x9A70, 0xB3DB, 0x9A71, 0xC7FD, 0x9A72, 0xF352,\n\t0x9A73, 0xB2B5, 0x9A74, 0xC2BF, 0x9A75, 0xE6E0, 0x9A76, 0xCABB,\t0x9A77, 0xE6E1, 0x9A78, 0xE6E2, 0x9A79, 0xBED4, 0x9A7A, 0xE6E3,\n\t0x9A7B, 0xD7A4, 0x9A7C, 0xCDD5, 0x9A7D, 0xE6E5, 0x9A7E, 0xBCDD,\t0x9A7F, 0xE6E4, 0x9A80, 0xE6E6, 0x9A81, 0xE6E7, 0x9A82, 0xC2EE,\n\t0x9A83, 0xF353, 0x9A84, 0xBDBE, 0x9A85, 0xE6E8, 0x9A86, 0xC2E6,\t0x9A87, 0xBAA7, 0x9A88, 0xE6E9, 0x9A89, 0xF354, 0x9A8A, 0xE6EA,\n\t0x9A8B, 0xB3D2, 0x9A8C, 0xD1E9, 0x9A8D, 0xF355, 0x9A8E, 0xF356,\t0x9A8F, 0xBFA5, 0x9A90, 0xE6EB, 0x9A91, 0xC6EF, 0x9A92, 0xE6EC,\n\t0x9A93, 0xE6ED, 0x9A94, 0xF357, 0x9A95, 0xF358, 0x9A96, 0xE6EE,\t0x9A97, 0xC6AD, 0x9A98, 0xE6EF, 0x9A99, 0xF359, 0x9A9A, 0xC9A7,\n\t0x9A9B, 0xE6F0, 0x9A9C, 0xE6F1, 0x9A9D, 0xE6F2, 0x9A9E, 0xE5B9,\t0x9A9F, 0xE6F3, 0x9AA0, 0xE6F4, 0x9AA1, 0xC2E2, 0x9AA2, 0xE6F5,\n\t0x9AA3, 0xE6F6, 0x9AA4, 0xD6E8, 0x9AA5, 0xE6F7, 0x9AA6, 0xF35A,\t0x9AA7, 0xE6F8, 0x9AA8, 0xB9C7, 0x9AA9, 0xF35B, 0x9AAA, 0xF35C,\n\t0x9AAB, 0xF35D, 0x9AAC, 0xF35E, 0x9AAD, 0xF35F, 0x9AAE, 0xF360,\t0x9AAF, 0xF361, 0x9AB0, 0xF7BB, 0x9AB1, 0xF7BA, 0x9AB2, 0xF362,\n\t0x9AB3, 0xF363, 0x9AB4, 0xF364, 0x9AB5, 0xF365, 0x9AB6, 0xF7BE,\t0x9AB7, 0xF7BC, 0x9AB8, 0xBAA1, 0x9AB9, 0xF366, 0x9ABA, 0xF7BF,\n\t0x9ABB, 0xF367, 0x9ABC, 0xF7C0, 0x9ABD, 0xF368, 0x9ABE, 0xF369,\t0x9ABF, 0xF36A, 0x9AC0, 0xF7C2, 0x9AC1, 0xF7C1, 0x9AC2, 0xF7C4,\n\t0x9AC3, 0xF36B, 0x9AC4, 0xF36C, 0x9AC5, 0xF7C3, 0x9AC6, 0xF36D,\t0x9AC7, 0xF36E, 0x9AC8, 0xF36F, 0x9AC9, 0xF370, 0x9ACA, 0xF371,\n\t0x9ACB, 0xF7C5, 0x9ACC, 0xF7C6, 0x9ACD, 0xF372, 0x9ACE, 0xF373,\t0x9ACF, 0xF374, 0x9AD0, 0xF375, 0x9AD1, 0xF7C7, 0x9AD2, 0xF376,\n\t0x9AD3, 0xCBE8, 0x9AD4, 0xF377, 0x9AD5, 0xF378, 0x9AD6, 0xF379,\t0x9AD7, 0xF37A, 0x9AD8, 0xB8DF, 0x9AD9, 0xF37B, 0x9ADA, 0xF37C,\n\t0x9ADB, 0xF37D, 0x9ADC, 0xF37E, 0x9ADD, 0xF380, 0x9ADE, 0xF381,\t0x9ADF, 0xF7D4, 0x9AE0, 0xF382, 0x9AE1, 0xF7D5, 0x9AE2, 0xF383,\n\t0x9AE3, 0xF384, 0x9AE4, 0xF385, 0x9AE5, 0xF386, 0x9AE6, 0xF7D6,\t0x9AE7, 0xF387, 0x9AE8, 0xF388, 0x9AE9, 0xF389, 0x9AEA, 0xF38A,\n\t0x9AEB, 0xF7D8, 0x9AEC, 0xF38B, 0x9AED, 0xF7DA, 0x9AEE, 0xF38C,\t0x9AEF, 0xF7D7, 0x9AF0, 0xF38D, 0x9AF1, 0xF38E, 0x9AF2, 0xF38F,\n\t0x9AF3, 0xF390, 0x9AF4, 0xF391, 0x9AF5, 0xF392, 0x9AF6, 0xF393,\t0x9AF7, 0xF394, 0x9AF8, 0xF395, 0x9AF9, 0xF7DB, 0x9AFA, 0xF396,\n\t0x9AFB, 0xF7D9, 0x9AFC, 0xF397, 0x9AFD, 0xF398, 0x9AFE, 0xF399,\t0x9AFF, 0xF39A, 0x9B00, 0xF39B, 0x9B01, 0xF39C, 0x9B02, 0xF39D,\n\t0x9B03, 0xD7D7, 0x9B04, 0xF39E, 0x9B05, 0xF39F, 0x9B06, 0xF3A0,\t0x9B07, 0xF440, 0x9B08, 0xF7DC, 0x9B09, 0xF441, 0x9B0A, 0xF442,\n\t0x9B0B, 0xF443, 0x9B0C, 0xF444, 0x9B0D, 0xF445, 0x9B0E, 0xF446,\t0x9B0F, 0xF7DD, 0x9B10, 0xF447, 0x9B11, 0xF448, 0x9B12, 0xF449,\n\t0x9B13, 0xF7DE, 0x9B14, 0xF44A, 0x9B15, 0xF44B, 0x9B16, 0xF44C,\t0x9B17, 0xF44D, 0x9B18, 0xF44E, 0x9B19, 0xF44F, 0x9B1A, 0xF450,\n\t0x9B1B, 0xF451, 0x9B1C, 0xF452, 0x9B1D, 0xF453, 0x9B1E, 0xF454,\t0x9B1F, 0xF7DF, 0x9B20, 0xF455, 0x9B21, 0xF456, 0x9B22, 0xF457,\n\t0x9B23, 0xF7E0, 0x9B24, 0xF458, 0x9B25, 0xF459, 0x9B26, 0xF45A,\t0x9B27, 0xF45B, 0x9B28, 0xF45C, 0x9B29, 0xF45D, 0x9B2A, 0xF45E,\n\t0x9B2B, 0xF45F, 0x9B2C, 0xF460, 0x9B2D, 0xF461, 0x9B2E, 0xF462,\t0x9B2F, 0xDBCB, 0x9B30, 0xF463, 0x9B31, 0xF464, 0x9B32, 0xD8AA,\n\t0x9B33, 0xF465, 0x9B34, 0xF466, 0x9B35, 0xF467, 0x9B36, 0xF468,\t0x9B37, 0xF469, 0x9B38, 0xF46A, 0x9B39, 0xF46B, 0x9B3A, 0xF46C,\n\t0x9B3B, 0xE5F7, 0x9B3C, 0xB9ED, 0x9B3D, 0xF46D, 0x9B3E, 0xF46E,\t0x9B3F, 0xF46F, 0x9B40, 0xF470, 0x9B41, 0xBFFD, 0x9B42, 0xBBEA,\n\t0x9B43, 0xF7C9, 0x9B44, 0xC6C7, 0x9B45, 0xF7C8, 0x9B46, 0xF471,\t0x9B47, 0xF7CA, 0x9B48, 0xF7CC, 0x9B49, 0xF7CB, 0x9B4A, 0xF472,\n\t0x9B4B, 0xF473, 0x9B4C, 0xF474, 0x9B4D, 0xF7CD, 0x9B4E, 0xF475,\t0x9B4F, 0xCEBA, 0x9B50, 0xF476, 0x9B51, 0xF7CE, 0x9B52, 0xF477,\n\t0x9B53, 0xF478, 0x9B54, 0xC4A7, 0x9B55, 0xF479, 0x9B56, 0xF47A,\t0x9B57, 0xF47B, 0x9B58, 0xF47C, 0x9B59, 0xF47D, 0x9B5A, 0xF47E,\n\t0x9B5B, 0xF480, 0x9B5C, 0xF481, 0x9B5D, 0xF482, 0x9B5E, 0xF483,\t0x9B5F, 0xF484, 0x9B60, 0xF485, 0x9B61, 0xF486, 0x9B62, 0xF487,\n\t0x9B63, 0xF488, 0x9B64, 0xF489, 0x9B65, 0xF48A, 0x9B66, 0xF48B,\t0x9B67, 0xF48C, 0x9B68, 0xF48D, 0x9B69, 0xF48E, 0x9B6A, 0xF48F,\n\t0x9B6B, 0xF490, 0x9B6C, 0xF491, 0x9B6D, 0xF492, 0x9B6E, 0xF493,\t0x9B6F, 0xF494, 0x9B70, 0xF495, 0x9B71, 0xF496, 0x9B72, 0xF497,\n\t0x9B73, 0xF498, 0x9B74, 0xF499, 0x9B75, 0xF49A, 0x9B76, 0xF49B,\t0x9B77, 0xF49C, 0x9B78, 0xF49D, 0x9B79, 0xF49E, 0x9B7A, 0xF49F,\n\t0x9B7B, 0xF4A0, 0x9B7C, 0xF540, 0x9B7D, 0xF541, 0x9B7E, 0xF542,\t0x9B7F, 0xF543, 0x9B80, 0xF544, 0x9B81, 0xF545, 0x9B82, 0xF546,\n\t0x9B83, 0xF547, 0x9B84, 0xF548, 0x9B85, 0xF549, 0x9B86, 0xF54A,\t0x9B87, 0xF54B, 0x9B88, 0xF54C, 0x9B89, 0xF54D, 0x9B8A, 0xF54E,\n\t0x9B8B, 0xF54F, 0x9B8C, 0xF550, 0x9B8D, 0xF551, 0x9B8E, 0xF552,\t0x9B8F, 0xF553, 0x9B90, 0xF554, 0x9B91, 0xF555, 0x9B92, 0xF556,\n\t0x9B93, 0xF557, 0x9B94, 0xF558, 0x9B95, 0xF559, 0x9B96, 0xF55A,\t0x9B97, 0xF55B, 0x9B98, 0xF55C, 0x9B99, 0xF55D, 0x9B9A, 0xF55E,\n\t0x9B9B, 0xF55F, 0x9B9C, 0xF560, 0x9B9D, 0xF561, 0x9B9E, 0xF562,\t0x9B9F, 0xF563, 0x9BA0, 0xF564, 0x9BA1, 0xF565, 0x9BA2, 0xF566,\n\t0x9BA3, 0xF567, 0x9BA4, 0xF568, 0x9BA5, 0xF569, 0x9BA6, 0xF56A,\t0x9BA7, 0xF56B, 0x9BA8, 0xF56C, 0x9BA9, 0xF56D, 0x9BAA, 0xF56E,\n\t0x9BAB, 0xF56F, 0x9BAC, 0xF570, 0x9BAD, 0xF571, 0x9BAE, 0xF572,\t0x9BAF, 0xF573, 0x9BB0, 0xF574, 0x9BB1, 0xF575, 0x9BB2, 0xF576,\n\t0x9BB3, 0xF577, 0x9BB4, 0xF578, 0x9BB5, 0xF579, 0x9BB6, 0xF57A,\t0x9BB7, 0xF57B, 0x9BB8, 0xF57C, 0x9BB9, 0xF57D, 0x9BBA, 0xF57E,\n\t0x9BBB, 0xF580, 0x9BBC, 0xF581, 0x9BBD, 0xF582, 0x9BBE, 0xF583,\t0x9BBF, 0xF584, 0x9BC0, 0xF585, 0x9BC1, 0xF586, 0x9BC2, 0xF587,\n\t0x9BC3, 0xF588, 0x9BC4, 0xF589, 0x9BC5, 0xF58A, 0x9BC6, 0xF58B,\t0x9BC7, 0xF58C, 0x9BC8, 0xF58D, 0x9BC9, 0xF58E, 0x9BCA, 0xF58F,\n\t0x9BCB, 0xF590, 0x9BCC, 0xF591, 0x9BCD, 0xF592, 0x9BCE, 0xF593,\t0x9BCF, 0xF594, 0x9BD0, 0xF595, 0x9BD1, 0xF596, 0x9BD2, 0xF597,\n\t0x9BD3, 0xF598, 0x9BD4, 0xF599, 0x9BD5, 0xF59A, 0x9BD6, 0xF59B,\t0x9BD7, 0xF59C, 0x9BD8, 0xF59D, 0x9BD9, 0xF59E, 0x9BDA, 0xF59F,\n\t0x9BDB, 0xF5A0, 0x9BDC, 0xF640, 0x9BDD, 0xF641, 0x9BDE, 0xF642,\t0x9BDF, 0xF643, 0x9BE0, 0xF644, 0x9BE1, 0xF645, 0x9BE2, 0xF646,\n\t0x9BE3, 0xF647, 0x9BE4, 0xF648, 0x9BE5, 0xF649, 0x9BE6, 0xF64A,\t0x9BE7, 0xF64B, 0x9BE8, 0xF64C, 0x9BE9, 0xF64D, 0x9BEA, 0xF64E,\n\t0x9BEB, 0xF64F, 0x9BEC, 0xF650, 0x9BED, 0xF651, 0x9BEE, 0xF652,\t0x9BEF, 0xF653, 0x9BF0, 0xF654, 0x9BF1, 0xF655, 0x9BF2, 0xF656,\n\t0x9BF3, 0xF657, 0x9BF4, 0xF658, 0x9BF5, 0xF659, 0x9BF6, 0xF65A,\t0x9BF7, 0xF65B, 0x9BF8, 0xF65C, 0x9BF9, 0xF65D, 0x9BFA, 0xF65E,\n\t0x9BFB, 0xF65F, 0x9BFC, 0xF660, 0x9BFD, 0xF661, 0x9BFE, 0xF662,\t0x9BFF, 0xF663, 0x9C00, 0xF664, 0x9C01, 0xF665, 0x9C02, 0xF666,\n\t0x9C03, 0xF667, 0x9C04, 0xF668, 0x9C05, 0xF669, 0x9C06, 0xF66A,\t0x9C07, 0xF66B, 0x9C08, 0xF66C, 0x9C09, 0xF66D, 0x9C0A, 0xF66E,\n\t0x9C0B, 0xF66F, 0x9C0C, 0xF670, 0x9C0D, 0xF671, 0x9C0E, 0xF672,\t0x9C0F, 0xF673, 0x9C10, 0xF674, 0x9C11, 0xF675, 0x9C12, 0xF676,\n\t0x9C13, 0xF677, 0x9C14, 0xF678, 0x9C15, 0xF679, 0x9C16, 0xF67A,\t0x9C17, 0xF67B, 0x9C18, 0xF67C, 0x9C19, 0xF67D, 0x9C1A, 0xF67E,\n\t0x9C1B, 0xF680, 0x9C1C, 0xF681, 0x9C1D, 0xF682, 0x9C1E, 0xF683,\t0x9C1F, 0xF684, 0x9C20, 0xF685, 0x9C21, 0xF686, 0x9C22, 0xF687,\n\t0x9C23, 0xF688, 0x9C24, 0xF689, 0x9C25, 0xF68A, 0x9C26, 0xF68B,\t0x9C27, 0xF68C, 0x9C28, 0xF68D, 0x9C29, 0xF68E, 0x9C2A, 0xF68F,\n\t0x9C2B, 0xF690, 0x9C2C, 0xF691, 0x9C2D, 0xF692, 0x9C2E, 0xF693,\t0x9C2F, 0xF694, 0x9C30, 0xF695, 0x9C31, 0xF696, 0x9C32, 0xF697,\n\t0x9C33, 0xF698, 0x9C34, 0xF699, 0x9C35, 0xF69A, 0x9C36, 0xF69B,\t0x9C37, 0xF69C, 0x9C38, 0xF69D, 0x9C39, 0xF69E, 0x9C3A, 0xF69F,\n\t0x9C3B, 0xF6A0, 0x9C3C, 0xF740, 0x9C3D, 0xF741, 0x9C3E, 0xF742,\t0x9C3F, 0xF743, 0x9C40, 0xF744, 0x9C41, 0xF745, 0x9C42, 0xF746,\n\t0x9C43, 0xF747, 0x9C44, 0xF748, 0x9C45, 0xF749, 0x9C46, 0xF74A,\t0x9C47, 0xF74B, 0x9C48, 0xF74C, 0x9C49, 0xF74D, 0x9C4A, 0xF74E,\n\t0x9C4B, 0xF74F, 0x9C4C, 0xF750, 0x9C4D, 0xF751, 0x9C4E, 0xF752,\t0x9C4F, 0xF753, 0x9C50, 0xF754, 0x9C51, 0xF755, 0x9C52, 0xF756,\n\t0x9C53, 0xF757, 0x9C54, 0xF758, 0x9C55, 0xF759, 0x9C56, 0xF75A,\t0x9C57, 0xF75B, 0x9C58, 0xF75C, 0x9C59, 0xF75D, 0x9C5A, 0xF75E,\n\t0x9C5B, 0xF75F, 0x9C5C, 0xF760, 0x9C5D, 0xF761, 0x9C5E, 0xF762,\t0x9C5F, 0xF763, 0x9C60, 0xF764, 0x9C61, 0xF765, 0x9C62, 0xF766,\n\t0x9C63, 0xF767, 0x9C64, 0xF768, 0x9C65, 0xF769, 0x9C66, 0xF76A,\t0x9C67, 0xF76B, 0x9C68, 0xF76C, 0x9C69, 0xF76D, 0x9C6A, 0xF76E,\n\t0x9C6B, 0xF76F, 0x9C6C, 0xF770, 0x9C6D, 0xF771, 0x9C6E, 0xF772,\t0x9C6F, 0xF773, 0x9C70, 0xF774, 0x9C71, 0xF775, 0x9C72, 0xF776,\n\t0x9C73, 0xF777, 0x9C74, 0xF778, 0x9C75, 0xF779, 0x9C76, 0xF77A,\t0x9C77, 0xF77B, 0x9C78, 0xF77C, 0x9C79, 0xF77D, 0x9C7A, 0xF77E,\n\t0x9C7B, 0xF780, 0x9C7C, 0xD3E3, 0x9C7D, 0xF781, 0x9C7E, 0xF782,\t0x9C7F, 0xF6CF, 0x9C80, 0xF783, 0x9C81, 0xC2B3, 0x9C82, 0xF6D0,\n\t0x9C83, 0xF784, 0x9C84, 0xF785, 0x9C85, 0xF6D1, 0x9C86, 0xF6D2,\t0x9C87, 0xF6D3, 0x9C88, 0xF6D4, 0x9C89, 0xF786, 0x9C8A, 0xF787,\n\t0x9C8B, 0xF6D6, 0x9C8C, 0xF788, 0x9C8D, 0xB1AB, 0x9C8E, 0xF6D7,\t0x9C8F, 0xF789, 0x9C90, 0xF6D8, 0x9C91, 0xF6D9, 0x9C92, 0xF6DA,\n\t0x9C93, 0xF78A, 0x9C94, 0xF6DB, 0x9C95, 0xF6DC, 0x9C96, 0xF78B,\t0x9C97, 0xF78C, 0x9C98, 0xF78D, 0x9C99, 0xF78E, 0x9C9A, 0xF6DD,\n\t0x9C9B, 0xF6DE, 0x9C9C, 0xCFCA, 0x9C9D, 0xF78F, 0x9C9E, 0xF6DF,\t0x9C9F, 0xF6E0, 0x9CA0, 0xF6E1, 0x9CA1, 0xF6E2, 0x9CA2, 0xF6E3,\n\t0x9CA3, 0xF6E4, 0x9CA4, 0xC0F0, 0x9CA5, 0xF6E5, 0x9CA6, 0xF6E6,\t0x9CA7, 0xF6E7, 0x9CA8, 0xF6E8, 0x9CA9, 0xF6E9, 0x9CAA, 0xF790,\n\t0x9CAB, 0xF6EA, 0x9CAC, 0xF791, 0x9CAD, 0xF6EB, 0x9CAE, 0xF6EC,\t0x9CAF, 0xF792, 0x9CB0, 0xF6ED, 0x9CB1, 0xF6EE, 0x9CB2, 0xF6EF,\n\t0x9CB3, 0xF6F0, 0x9CB4, 0xF6F1, 0x9CB5, 0xF6F2, 0x9CB6, 0xF6F3,\t0x9CB7, 0xF6F4, 0x9CB8, 0xBEA8, 0x9CB9, 0xF793, 0x9CBA, 0xF6F5,\n\t0x9CBB, 0xF6F6, 0x9CBC, 0xF6F7, 0x9CBD, 0xF6F8, 0x9CBE, 0xF794,\t0x9CBF, 0xF795, 0x9CC0, 0xF796, 0x9CC1, 0xF797, 0x9CC2, 0xF798,\n\t0x9CC3, 0xC8FA, 0x9CC4, 0xF6F9, 0x9CC5, 0xF6FA, 0x9CC6, 0xF6FB,\t0x9CC7, 0xF6FC, 0x9CC8, 0xF799, 0x9CC9, 0xF79A, 0x9CCA, 0xF6FD,\n\t0x9CCB, 0xF6FE, 0x9CCC, 0xF7A1, 0x9CCD, 0xF7A2, 0x9CCE, 0xF7A3,\t0x9CCF, 0xF7A4, 0x9CD0, 0xF7A5, 0x9CD1, 0xF79B, 0x9CD2, 0xF79C,\n\t0x9CD3, 0xF7A6, 0x9CD4, 0xF7A7, 0x9CD5, 0xF7A8, 0x9CD6, 0xB1EE,\t0x9CD7, 0xF7A9, 0x9CD8, 0xF7AA, 0x9CD9, 0xF7AB, 0x9CDA, 0xF79D,\n\t0x9CDB, 0xF79E, 0x9CDC, 0xF7AC, 0x9CDD, 0xF7AD, 0x9CDE, 0xC1DB,\t0x9CDF, 0xF7AE, 0x9CE0, 0xF79F, 0x9CE1, 0xF7A0, 0x9CE2, 0xF7AF,\n\t0x9CE3, 0xF840, 0x9CE4, 0xF841, 0x9CE5, 0xF842, 0x9CE6, 0xF843,\t0x9CE7, 0xF844, 0x9CE8, 0xF845, 0x9CE9, 0xF846, 0x9CEA, 0xF847,\n\t0x9CEB, 0xF848, 0x9CEC, 0xF849, 0x9CED, 0xF84A, 0x9CEE, 0xF84B,\t0x9CEF, 0xF84C, 0x9CF0, 0xF84D, 0x9CF1, 0xF84E, 0x9CF2, 0xF84F,\n\t0x9CF3, 0xF850, 0x9CF4, 0xF851, 0x9CF5, 0xF852, 0x9CF6, 0xF853,\t0x9CF7, 0xF854, 0x9CF8, 0xF855, 0x9CF9, 0xF856, 0x9CFA, 0xF857,\n\t0x9CFB, 0xF858, 0x9CFC, 0xF859, 0x9CFD, 0xF85A, 0x9CFE, 0xF85B,\t0x9CFF, 0xF85C, 0x9D00, 0xF85D, 0x9D01, 0xF85E, 0x9D02, 0xF85F,\n\t0x9D03, 0xF860, 0x9D04, 0xF861, 0x9D05, 0xF862, 0x9D06, 0xF863,\t0x9D07, 0xF864, 0x9D08, 0xF865, 0x9D09, 0xF866, 0x9D0A, 0xF867,\n\t0x9D0B, 0xF868, 0x9D0C, 0xF869, 0x9D0D, 0xF86A, 0x9D0E, 0xF86B,\t0x9D0F, 0xF86C, 0x9D10, 0xF86D, 0x9D11, 0xF86E, 0x9D12, 0xF86F,\n\t0x9D13, 0xF870, 0x9D14, 0xF871, 0x9D15, 0xF872, 0x9D16, 0xF873,\t0x9D17, 0xF874, 0x9D18, 0xF875, 0x9D19, 0xF876, 0x9D1A, 0xF877,\n\t0x9D1B, 0xF878, 0x9D1C, 0xF879, 0x9D1D, 0xF87A, 0x9D1E, 0xF87B,\t0x9D1F, 0xF87C, 0x9D20, 0xF87D, 0x9D21, 0xF87E, 0x9D22, 0xF880,\n\t0x9D23, 0xF881, 0x9D24, 0xF882, 0x9D25, 0xF883, 0x9D26, 0xF884,\t0x9D27, 0xF885, 0x9D28, 0xF886, 0x9D29, 0xF887, 0x9D2A, 0xF888,\n\t0x9D2B, 0xF889, 0x9D2C, 0xF88A, 0x9D2D, 0xF88B, 0x9D2E, 0xF88C,\t0x9D2F, 0xF88D, 0x9D30, 0xF88E, 0x9D31, 0xF88F, 0x9D32, 0xF890,\n\t0x9D33, 0xF891, 0x9D34, 0xF892, 0x9D35, 0xF893, 0x9D36, 0xF894,\t0x9D37, 0xF895, 0x9D38, 0xF896, 0x9D39, 0xF897, 0x9D3A, 0xF898,\n\t0x9D3B, 0xF899, 0x9D3C, 0xF89A, 0x9D3D, 0xF89B, 0x9D3E, 0xF89C,\t0x9D3F, 0xF89D, 0x9D40, 0xF89E, 0x9D41, 0xF89F, 0x9D42, 0xF8A0,\n\t0x9D43, 0xF940, 0x9D44, 0xF941, 0x9D45, 0xF942, 0x9D46, 0xF943,\t0x9D47, 0xF944, 0x9D48, 0xF945, 0x9D49, 0xF946, 0x9D4A, 0xF947,\n\t0x9D4B, 0xF948, 0x9D4C, 0xF949, 0x9D4D, 0xF94A, 0x9D4E, 0xF94B,\t0x9D4F, 0xF94C, 0x9D50, 0xF94D, 0x9D51, 0xF94E, 0x9D52, 0xF94F,\n\t0x9D53, 0xF950, 0x9D54, 0xF951, 0x9D55, 0xF952, 0x9D56, 0xF953,\t0x9D57, 0xF954, 0x9D58, 0xF955, 0x9D59, 0xF956, 0x9D5A, 0xF957,\n\t0x9D5B, 0xF958, 0x9D5C, 0xF959, 0x9D5D, 0xF95A, 0x9D5E, 0xF95B,\t0x9D5F, 0xF95C, 0x9D60, 0xF95D, 0x9D61, 0xF95E, 0x9D62, 0xF95F,\n\t0x9D63, 0xF960, 0x9D64, 0xF961, 0x9D65, 0xF962, 0x9D66, 0xF963,\t0x9D67, 0xF964, 0x9D68, 0xF965, 0x9D69, 0xF966, 0x9D6A, 0xF967,\n\t0x9D6B, 0xF968, 0x9D6C, 0xF969, 0x9D6D, 0xF96A, 0x9D6E, 0xF96B,\t0x9D6F, 0xF96C, 0x9D70, 0xF96D, 0x9D71, 0xF96E, 0x9D72, 0xF96F,\n\t0x9D73, 0xF970, 0x9D74, 0xF971, 0x9D75, 0xF972, 0x9D76, 0xF973,\t0x9D77, 0xF974, 0x9D78, 0xF975, 0x9D79, 0xF976, 0x9D7A, 0xF977,\n\t0x9D7B, 0xF978, 0x9D7C, 0xF979, 0x9D7D, 0xF97A, 0x9D7E, 0xF97B,\t0x9D7F, 0xF97C, 0x9D80, 0xF97D, 0x9D81, 0xF97E, 0x9D82, 0xF980,\n\t0x9D83, 0xF981, 0x9D84, 0xF982, 0x9D85, 0xF983, 0x9D86, 0xF984,\t0x9D87, 0xF985, 0x9D88, 0xF986, 0x9D89, 0xF987, 0x9D8A, 0xF988,\n\t0x9D8B, 0xF989, 0x9D8C, 0xF98A, 0x9D8D, 0xF98B, 0x9D8E, 0xF98C,\t0x9D8F, 0xF98D, 0x9D90, 0xF98E, 0x9D91, 0xF98F, 0x9D92, 0xF990,\n\t0x9D93, 0xF991, 0x9D94, 0xF992, 0x9D95, 0xF993, 0x9D96, 0xF994,\t0x9D97, 0xF995, 0x9D98, 0xF996, 0x9D99, 0xF997, 0x9D9A, 0xF998,\n\t0x9D9B, 0xF999, 0x9D9C, 0xF99A, 0x9D9D, 0xF99B, 0x9D9E, 0xF99C,\t0x9D9F, 0xF99D, 0x9DA0, 0xF99E, 0x9DA1, 0xF99F, 0x9DA2, 0xF9A0,\n\t0x9DA3, 0xFA40, 0x9DA4, 0xFA41, 0x9DA5, 0xFA42, 0x9DA6, 0xFA43,\t0x9DA7, 0xFA44, 0x9DA8, 0xFA45, 0x9DA9, 0xFA46, 0x9DAA, 0xFA47,\n\t0x9DAB, 0xFA48, 0x9DAC, 0xFA49, 0x9DAD, 0xFA4A, 0x9DAE, 0xFA4B,\t0x9DAF, 0xFA4C, 0x9DB0, 0xFA4D, 0x9DB1, 0xFA4E, 0x9DB2, 0xFA4F,\n\t0x9DB3, 0xFA50, 0x9DB4, 0xFA51, 0x9DB5, 0xFA52, 0x9DB6, 0xFA53,\t0x9DB7, 0xFA54, 0x9DB8, 0xFA55, 0x9DB9, 0xFA56, 0x9DBA, 0xFA57,\n\t0x9DBB, 0xFA58, 0x9DBC, 0xFA59, 0x9DBD, 0xFA5A, 0x9DBE, 0xFA5B,\t0x9DBF, 0xFA5C, 0x9DC0, 0xFA5D, 0x9DC1, 0xFA5E, 0x9DC2, 0xFA5F,\n\t0x9DC3, 0xFA60, 0x9DC4, 0xFA61, 0x9DC5, 0xFA62, 0x9DC6, 0xFA63,\t0x9DC7, 0xFA64, 0x9DC8, 0xFA65, 0x9DC9, 0xFA66, 0x9DCA, 0xFA67,\n\t0x9DCB, 0xFA68, 0x9DCC, 0xFA69, 0x9DCD, 0xFA6A, 0x9DCE, 0xFA6B,\t0x9DCF, 0xFA6C, 0x9DD0, 0xFA6D, 0x9DD1, 0xFA6E, 0x9DD2, 0xFA6F,\n\t0x9DD3, 0xFA70, 0x9DD4, 0xFA71, 0x9DD5, 0xFA72, 0x9DD6, 0xFA73,\t0x9DD7, 0xFA74, 0x9DD8, 0xFA75, 0x9DD9, 0xFA76, 0x9DDA, 0xFA77,\n\t0x9DDB, 0xFA78, 0x9DDC, 0xFA79, 0x9DDD, 0xFA7A, 0x9DDE, 0xFA7B,\t0x9DDF, 0xFA7C, 0x9DE0, 0xFA7D, 0x9DE1, 0xFA7E, 0x9DE2, 0xFA80,\n\t0x9DE3, 0xFA81, 0x9DE4, 0xFA82, 0x9DE5, 0xFA83, 0x9DE6, 0xFA84,\t0x9DE7, 0xFA85, 0x9DE8, 0xFA86, 0x9DE9, 0xFA87, 0x9DEA, 0xFA88,\n\t0x9DEB, 0xFA89, 0x9DEC, 0xFA8A, 0x9DED, 0xFA8B, 0x9DEE, 0xFA8C,\t0x9DEF, 0xFA8D, 0x9DF0, 0xFA8E, 0x9DF1, 0xFA8F, 0x9DF2, 0xFA90,\n\t0x9DF3, 0xFA91, 0x9DF4, 0xFA92, 0x9DF5, 0xFA93, 0x9DF6, 0xFA94,\t0x9DF7, 0xFA95, 0x9DF8, 0xFA96, 0x9DF9, 0xFA97, 0x9DFA, 0xFA98,\n\t0x9DFB, 0xFA99, 0x9DFC, 0xFA9A, 0x9DFD, 0xFA9B, 0x9DFE, 0xFA9C,\t0x9DFF, 0xFA9D, 0x9E00, 0xFA9E, 0x9E01, 0xFA9F, 0x9E02, 0xFAA0,\n\t0x9E03, 0xFB40, 0x9E04, 0xFB41, 0x9E05, 0xFB42, 0x9E06, 0xFB43,\t0x9E07, 0xFB44, 0x9E08, 0xFB45, 0x9E09, 0xFB46, 0x9E0A, 0xFB47,\n\t0x9E0B, 0xFB48, 0x9E0C, 0xFB49, 0x9E0D, 0xFB4A, 0x9E0E, 0xFB4B,\t0x9E0F, 0xFB4C, 0x9E10, 0xFB4D, 0x9E11, 0xFB4E, 0x9E12, 0xFB4F,\n\t0x9E13, 0xFB50, 0x9E14, 0xFB51, 0x9E15, 0xFB52, 0x9E16, 0xFB53,\t0x9E17, 0xFB54, 0x9E18, 0xFB55, 0x9E19, 0xFB56, 0x9E1A, 0xFB57,\n\t0x9E1B, 0xFB58, 0x9E1C, 0xFB59, 0x9E1D, 0xFB5A, 0x9E1E, 0xFB5B,\t0x9E1F, 0xC4F1, 0x9E20, 0xF0AF, 0x9E21, 0xBCA6, 0x9E22, 0xF0B0,\n\t0x9E23, 0xC3F9, 0x9E24, 0xFB5C, 0x9E25, 0xC5B8, 0x9E26, 0xD1BB,\t0x9E27, 0xFB5D, 0x9E28, 0xF0B1, 0x9E29, 0xF0B2, 0x9E2A, 0xF0B3,\n\t0x9E2B, 0xF0B4, 0x9E2C, 0xF0B5, 0x9E2D, 0xD1BC, 0x9E2E, 0xFB5E,\t0x9E2F, 0xD1EC, 0x9E30, 0xFB5F, 0x9E31, 0xF0B7, 0x9E32, 0xF0B6,\n\t0x9E33, 0xD4A7, 0x9E34, 0xFB60, 0x9E35, 0xCDD2, 0x9E36, 0xF0B8,\t0x9E37, 0xF0BA, 0x9E38, 0xF0B9, 0x9E39, 0xF0BB, 0x9E3A, 0xF0BC,\n\t0x9E3B, 0xFB61, 0x9E3C, 0xFB62, 0x9E3D, 0xB8EB, 0x9E3E, 0xF0BD,\t0x9E3F, 0xBAE8, 0x9E40, 0xFB63, 0x9E41, 0xF0BE, 0x9E42, 0xF0BF,\n\t0x9E43, 0xBEE9, 0x9E44, 0xF0C0, 0x9E45, 0xB6EC, 0x9E46, 0xF0C1,\t0x9E47, 0xF0C2, 0x9E48, 0xF0C3, 0x9E49, 0xF0C4, 0x9E4A, 0xC8B5,\n\t0x9E4B, 0xF0C5, 0x9E4C, 0xF0C6, 0x9E4D, 0xFB64, 0x9E4E, 0xF0C7,\t0x9E4F, 0xC5F4, 0x9E50, 0xFB65, 0x9E51, 0xF0C8, 0x9E52, 0xFB66,\n\t0x9E53, 0xFB67, 0x9E54, 0xFB68, 0x9E55, 0xF0C9, 0x9E56, 0xFB69,\t0x9E57, 0xF0CA, 0x9E58, 0xF7BD, 0x9E59, 0xFB6A, 0x9E5A, 0xF0CB,\n\t0x9E5B, 0xF0CC, 0x9E5C, 0xF0CD, 0x9E5D, 0xFB6B, 0x9E5E, 0xF0CE,\t0x9E5F, 0xFB6C, 0x9E60, 0xFB6D, 0x9E61, 0xFB6E, 0x9E62, 0xFB6F,\n\t0x9E63, 0xF0CF, 0x9E64, 0xBAD7, 0x9E65, 0xFB70, 0x9E66, 0xF0D0,\t0x9E67, 0xF0D1, 0x9E68, 0xF0D2, 0x9E69, 0xF0D3, 0x9E6A, 0xF0D4,\n\t0x9E6B, 0xF0D5, 0x9E6C, 0xF0D6, 0x9E6D, 0xF0D8, 0x9E6E, 0xFB71,\t0x9E6F, 0xFB72, 0x9E70, 0xD3A5, 0x9E71, 0xF0D7, 0x9E72, 0xFB73,\n\t0x9E73, 0xF0D9, 0x9E74, 0xFB74, 0x9E75, 0xFB75, 0x9E76, 0xFB76,\t0x9E77, 0xFB77, 0x9E78, 0xFB78, 0x9E79, 0xFB79, 0x9E7A, 0xFB7A,\n\t0x9E7B, 0xFB7B, 0x9E7C, 0xFB7C, 0x9E7D, 0xFB7D, 0x9E7E, 0xF5BA,\t0x9E7F, 0xC2B9, 0x9E80, 0xFB7E, 0x9E81, 0xFB80, 0x9E82, 0xF7E4,\n\t0x9E83, 0xFB81, 0x9E84, 0xFB82, 0x9E85, 0xFB83, 0x9E86, 0xFB84,\t0x9E87, 0xF7E5, 0x9E88, 0xF7E6, 0x9E89, 0xFB85, 0x9E8A, 0xFB86,\n\t0x9E8B, 0xF7E7, 0x9E8C, 0xFB87, 0x9E8D, 0xFB88, 0x9E8E, 0xFB89,\t0x9E8F, 0xFB8A, 0x9E90, 0xFB8B, 0x9E91, 0xFB8C, 0x9E92, 0xF7E8,\n\t0x9E93, 0xC2B4, 0x9E94, 0xFB8D, 0x9E95, 0xFB8E, 0x9E96, 0xFB8F,\t0x9E97, 0xFB90, 0x9E98, 0xFB91, 0x9E99, 0xFB92, 0x9E9A, 0xFB93,\n\t0x9E9B, 0xFB94, 0x9E9C, 0xFB95, 0x9E9D, 0xF7EA, 0x9E9E, 0xFB96,\t0x9E9F, 0xF7EB, 0x9EA0, 0xFB97, 0x9EA1, 0xFB98, 0x9EA2, 0xFB99,\n\t0x9EA3, 0xFB9A, 0x9EA4, 0xFB9B, 0x9EA5, 0xFB9C, 0x9EA6, 0xC2F3,\t0x9EA7, 0xFB9D, 0x9EA8, 0xFB9E, 0x9EA9, 0xFB9F, 0x9EAA, 0xFBA0,\n\t0x9EAB, 0xFC40, 0x9EAC, 0xFC41, 0x9EAD, 0xFC42, 0x9EAE, 0xFC43,\t0x9EAF, 0xFC44, 0x9EB0, 0xFC45, 0x9EB1, 0xFC46, 0x9EB2, 0xFC47,\n\t0x9EB3, 0xFC48, 0x9EB4, 0xF4F0, 0x9EB5, 0xFC49, 0x9EB6, 0xFC4A,\t0x9EB7, 0xFC4B, 0x9EB8, 0xF4EF, 0x9EB9, 0xFC4C, 0x9EBA, 0xFC4D,\n\t0x9EBB, 0xC2E9, 0x9EBC, 0xFC4E, 0x9EBD, 0xF7E1, 0x9EBE, 0xF7E2,\t0x9EBF, 0xFC4F, 0x9EC0, 0xFC50, 0x9EC1, 0xFC51, 0x9EC2, 0xFC52,\n\t0x9EC3, 0xFC53, 0x9EC4, 0xBBC6, 0x9EC5, 0xFC54, 0x9EC6, 0xFC55,\t0x9EC7, 0xFC56, 0x9EC8, 0xFC57, 0x9EC9, 0xD9E4, 0x9ECA, 0xFC58,\n\t0x9ECB, 0xFC59, 0x9ECC, 0xFC5A, 0x9ECD, 0xCAF2, 0x9ECE, 0xC0E8,\t0x9ECF, 0xF0A4, 0x9ED0, 0xFC5B, 0x9ED1, 0xBADA, 0x9ED2, 0xFC5C,\n\t0x9ED3, 0xFC5D, 0x9ED4, 0xC7AD, 0x9ED5, 0xFC5E, 0x9ED6, 0xFC5F,\t0x9ED7, 0xFC60, 0x9ED8, 0xC4AC, 0x9ED9, 0xFC61, 0x9EDA, 0xFC62,\n\t0x9EDB, 0xF7EC, 0x9EDC, 0xF7ED, 0x9EDD, 0xF7EE, 0x9EDE, 0xFC63,\t0x9EDF, 0xF7F0, 0x9EE0, 0xF7EF, 0x9EE1, 0xFC64, 0x9EE2, 0xF7F1,\n\t0x9EE3, 0xFC65, 0x9EE4, 0xFC66, 0x9EE5, 0xF7F4, 0x9EE6, 0xFC67,\t0x9EE7, 0xF7F3, 0x9EE8, 0xFC68, 0x9EE9, 0xF7F2, 0x9EEA, 0xF7F5,\n\t0x9EEB, 0xFC69, 0x9EEC, 0xFC6A, 0x9EED, 0xFC6B, 0x9EEE, 0xFC6C,\t0x9EEF, 0xF7F6, 0x9EF0, 0xFC6D, 0x9EF1, 0xFC6E, 0x9EF2, 0xFC6F,\n\t0x9EF3, 0xFC70, 0x9EF4, 0xFC71, 0x9EF5, 0xFC72, 0x9EF6, 0xFC73,\t0x9EF7, 0xFC74, 0x9EF8, 0xFC75, 0x9EF9, 0xEDE9, 0x9EFA, 0xFC76,\n\t0x9EFB, 0xEDEA, 0x9EFC, 0xEDEB, 0x9EFD, 0xFC77, 0x9EFE, 0xF6BC,\t0x9EFF, 0xFC78, 0x9F00, 0xFC79, 0x9F01, 0xFC7A, 0x9F02, 0xFC7B,\n\t0x9F03, 0xFC7C, 0x9F04, 0xFC7D, 0x9F05, 0xFC7E, 0x9F06, 0xFC80,\t0x9F07, 0xFC81, 0x9F08, 0xFC82, 0x9F09, 0xFC83, 0x9F0A, 0xFC84,\n\t0x9F0B, 0xF6BD, 0x9F0C, 0xFC85, 0x9F0D, 0xF6BE, 0x9F0E, 0xB6A6,\t0x9F0F, 0xFC86, 0x9F10, 0xD8BE, 0x9F11, 0xFC87, 0x9F12, 0xFC88,\n\t0x9F13, 0xB9C4, 0x9F14, 0xFC89, 0x9F15, 0xFC8A, 0x9F16, 0xFC8B,\t0x9F17, 0xD8BB, 0x9F18, 0xFC8C, 0x9F19, 0xDCB1, 0x9F1A, 0xFC8D,\n\t0x9F1B, 0xFC8E, 0x9F1C, 0xFC8F, 0x9F1D, 0xFC90, 0x9F1E, 0xFC91,\t0x9F1F, 0xFC92, 0x9F20, 0xCAF3, 0x9F21, 0xFC93, 0x9F22, 0xF7F7,\n\t0x9F23, 0xFC94, 0x9F24, 0xFC95, 0x9F25, 0xFC96, 0x9F26, 0xFC97,\t0x9F27, 0xFC98, 0x9F28, 0xFC99, 0x9F29, 0xFC9A, 0x9F2A, 0xFC9B,\n\t0x9F2B, 0xFC9C, 0x9F2C, 0xF7F8, 0x9F2D, 0xFC9D, 0x9F2E, 0xFC9E,\t0x9F2F, 0xF7F9, 0x9F30, 0xFC9F, 0x9F31, 0xFCA0, 0x9F32, 0xFD40,\n\t0x9F33, 0xFD41, 0x9F34, 0xFD42, 0x9F35, 0xFD43, 0x9F36, 0xFD44,\t0x9F37, 0xF7FB, 0x9F38, 0xFD45, 0x9F39, 0xF7FA, 0x9F3A, 0xFD46,\n\t0x9F3B, 0xB1C7, 0x9F3C, 0xFD47, 0x9F3D, 0xF7FC, 0x9F3E, 0xF7FD,\t0x9F3F, 0xFD48, 0x9F40, 0xFD49, 0x9F41, 0xFD4A, 0x9F42, 0xFD4B,\n\t0x9F43, 0xFD4C, 0x9F44, 0xF7FE, 0x9F45, 0xFD4D, 0x9F46, 0xFD4E,\t0x9F47, 0xFD4F, 0x9F48, 0xFD50, 0x9F49, 0xFD51, 0x9F4A, 0xFD52,\n\t0x9F4B, 0xFD53, 0x9F4C, 0xFD54, 0x9F4D, 0xFD55, 0x9F4E, 0xFD56,\t0x9F4F, 0xFD57, 0x9F50, 0xC6EB, 0x9F51, 0xECB4, 0x9F52, 0xFD58,\n\t0x9F53, 0xFD59, 0x9F54, 0xFD5A, 0x9F55, 0xFD5B, 0x9F56, 0xFD5C,\t0x9F57, 0xFD5D, 0x9F58, 0xFD5E, 0x9F59, 0xFD5F, 0x9F5A, 0xFD60,\n\t0x9F5B, 0xFD61, 0x9F5C, 0xFD62, 0x9F5D, 0xFD63, 0x9F5E, 0xFD64,\t0x9F5F, 0xFD65, 0x9F60, 0xFD66, 0x9F61, 0xFD67, 0x9F62, 0xFD68,\n\t0x9F63, 0xFD69, 0x9F64, 0xFD6A, 0x9F65, 0xFD6B, 0x9F66, 0xFD6C,\t0x9F67, 0xFD6D, 0x9F68, 0xFD6E, 0x9F69, 0xFD6F, 0x9F6A, 0xFD70,\n\t0x9F6B, 0xFD71, 0x9F6C, 0xFD72, 0x9F6D, 0xFD73, 0x9F6E, 0xFD74,\t0x9F6F, 0xFD75, 0x9F70, 0xFD76, 0x9F71, 0xFD77, 0x9F72, 0xFD78,\n\t0x9F73, 0xFD79, 0x9F74, 0xFD7A, 0x9F75, 0xFD7B, 0x9F76, 0xFD7C,\t0x9F77, 0xFD7D, 0x9F78, 0xFD7E, 0x9F79, 0xFD80, 0x9F7A, 0xFD81,\n\t0x9F7B, 0xFD82, 0x9F7C, 0xFD83, 0x9F7D, 0xFD84, 0x9F7E, 0xFD85,\t0x9F7F, 0xB3DD, 0x9F80, 0xF6B3, 0x9F81, 0xFD86, 0x9F82, 0xFD87,\n\t0x9F83, 0xF6B4, 0x9F84, 0xC1E4, 0x9F85, 0xF6B5, 0x9F86, 0xF6B6,\t0x9F87, 0xF6B7, 0x9F88, 0xF6B8, 0x9F89, 0xF6B9, 0x9F8A, 0xF6BA,\n\t0x9F8B, 0xC8A3, 0x9F8C, 0xF6BB, 0x9F8D, 0xFD88, 0x9F8E, 0xFD89,\t0x9F8F, 0xFD8A, 0x9F90, 0xFD8B, 0x9F91, 0xFD8C, 0x9F92, 0xFD8D,\n\t0x9F93, 0xFD8E, 0x9F94, 0xFD8F, 0x9F95, 0xFD90, 0x9F96, 0xFD91,\t0x9F97, 0xFD92, 0x9F98, 0xFD93, 0x9F99, 0xC1FA, 0x9F9A, 0xB9A8,\n\t0x9F9B, 0xEDE8, 0x9F9C, 0xFD94, 0x9F9D, 0xFD95, 0x9F9E, 0xFD96,\t0x9F9F, 0xB9EA, 0x9FA0, 0xD9DF, 0x9FA1, 0xFD97, 0x9FA2, 0xFD98,\n\t0x9FA3, 0xFD99, 0x9FA4, 0xFD9A, 0x9FA5, 0xFD9B, 0xF92C, 0xFD9C,\t0xF979, 0xFD9D, 0xF995, 0xFD9E, 0xF9E7, 0xFD9F, 0xF9F1, 0xFDA0,\n\t0xFA0C, 0xFE40, 0xFA0D, 0xFE41, 0xFA0E, 0xFE42, 0xFA0F, 0xFE43,\t0xFA11, 0xFE44, 0xFA13, 0xFE45, 0xFA14, 0xFE46, 0xFA18, 0xFE47,\n\t0xFA1F, 0xFE48, 0xFA20, 0xFE49, 0xFA21, 0xFE4A, 0xFA23, 0xFE4B,\t0xFA24, 0xFE4C, 0xFA27, 0xFE4D, 0xFA28, 0xFE4E, 0xFA29, 0xFE4F,\n\t0xFE30, 0xA955, 0xFE31, 0xA6F2, 0xFE33, 0xA6F4, 0xFE34, 0xA6F5,\t0xFE35, 0xA6E0, 0xFE36, 0xA6E1, 0xFE37, 0xA6F0, 0xFE38, 0xA6F1,\n\t0xFE39, 0xA6E2, 0xFE3A, 0xA6E3, 0xFE3B, 0xA6EE, 0xFE3C, 0xA6EF,\t0xFE3D, 0xA6E6, 0xFE3E, 0xA6E7, 0xFE3F, 0xA6E4, 0xFE40, 0xA6E5,\n\t0xFE41, 0xA6E8, 0xFE42, 0xA6E9, 0xFE43, 0xA6EA, 0xFE44, 0xA6EB,\t0xFE49, 0xA968, 0xFE4A, 0xA969, 0xFE4B, 0xA96A, 0xFE4C, 0xA96B,\n\t0xFE4D, 0xA96C, 0xFE4E, 0xA96D, 0xFE4F, 0xA96E, 0xFE50, 0xA96F,\t0xFE51, 0xA970, 0xFE52, 0xA971, 0xFE54, 0xA972, 0xFE55, 0xA973,\n\t0xFE56, 0xA974, 0xFE57, 0xA975, 0xFE59, 0xA976, 0xFE5A, 0xA977,\t0xFE5B, 0xA978, 0xFE5C, 0xA979, 0xFE5D, 0xA97A, 0xFE5E, 0xA97B,\n\t0xFE5F, 0xA97C, 0xFE60, 0xA97D, 0xFE61, 0xA97E, 0xFE62, 0xA980,\t0xFE63, 0xA981, 0xFE64, 0xA982, 0xFE65, 0xA983, 0xFE66, 0xA984,\n\t0xFE68, 0xA985, 0xFE69, 0xA986, 0xFE6A, 0xA987, 0xFE6B, 0xA988,\t0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA1E7,\n\t0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8,\t0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC,\n\t0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0,\t0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4,\n\t0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8,\t0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC,\n\t0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0,\t0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4,\n\t0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8,\t0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC,\n\t0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0,\t0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4,\n\t0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8,\t0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA3DC,\n\t0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0,\t0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4,\n\t0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8,\t0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC,\n\t0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0,\t0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4,\n\t0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8,\t0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC,\n\t0xFF5D, 0xA3FD, 0xFF5E, 0xA1AB, 0xFFE0, 0xA1E9, 0xFFE1, 0xA1EA,\t0xFFE2, 0xA956, 0xFFE3, 0xA3FE, 0xFFE4, 0xA957, 0xFFE5, 0xA3A4,\n\t0, 0\n};\n\nstatic const WCHAR oem2uni936[] = {\t/* GBK --> Unicode pairs */\n\t0x0080, 0x20AC, 0x8140, 0x4E02, 0x8141, 0x4E04, 0x8142, 0x4E05,\t0x8143, 0x4E06, 0x8144, 0x4E0F, 0x8145, 0x4E12, 0x8146, 0x4E17,\n\t0x8147, 0x4E1F, 0x8148, 0x4E20, 0x8149, 0x4E21, 0x814A, 0x4E23,\t0x814B, 0x4E26, 0x814C, 0x4E29, 0x814D, 0x4E2E, 0x814E, 0x4E2F,\n\t0x814F, 0x4E31, 0x8150, 0x4E33, 0x8151, 0x4E35, 0x8152, 0x4E37,\t0x8153, 0x4E3C, 0x8154, 0x4E40, 0x8155, 0x4E41, 0x8156, 0x4E42,\n\t0x8157, 0x4E44, 0x8158, 0x4E46, 0x8159, 0x4E4A, 0x815A, 0x4E51,\t0x815B, 0x4E55, 0x815C, 0x4E57, 0x815D, 0x4E5A, 0x815E, 0x4E5B,\n\t0x815F, 0x4E62, 0x8160, 0x4E63, 0x8161, 0x4E64, 0x8162, 0x4E65,\t0x8163, 0x4E67, 0x8164, 0x4E68, 0x8165, 0x4E6A, 0x8166, 0x4E6B,\n\t0x8167, 0x4E6C, 0x8168, 0x4E6D, 0x8169, 0x4E6E, 0x816A, 0x4E6F,\t0x816B, 0x4E72, 0x816C, 0x4E74, 0x816D, 0x4E75, 0x816E, 0x4E76,\n\t0x816F, 0x4E77, 0x8170, 0x4E78, 0x8171, 0x4E79, 0x8172, 0x4E7A,\t0x8173, 0x4E7B, 0x8174, 0x4E7C, 0x8175, 0x4E7D, 0x8176, 0x4E7F,\n\t0x8177, 0x4E80, 0x8178, 0x4E81, 0x8179, 0x4E82, 0x817A, 0x4E83,\t0x817B, 0x4E84, 0x817C, 0x4E85, 0x817D, 0x4E87, 0x817E, 0x4E8A,\n\t0x8180, 0x4E90, 0x8181, 0x4E96, 0x8182, 0x4E97, 0x8183, 0x4E99,\t0x8184, 0x4E9C, 0x8185, 0x4E9D, 0x8186, 0x4E9E, 0x8187, 0x4EA3,\n\t0x8188, 0x4EAA, 0x8189, 0x4EAF, 0x818A, 0x4EB0, 0x818B, 0x4EB1,\t0x818C, 0x4EB4, 0x818D, 0x4EB6, 0x818E, 0x4EB7, 0x818F, 0x4EB8,\n\t0x8190, 0x4EB9, 0x8191, 0x4EBC, 0x8192, 0x4EBD, 0x8193, 0x4EBE,\t0x8194, 0x4EC8, 0x8195, 0x4ECC, 0x8196, 0x4ECF, 0x8197, 0x4ED0,\n\t0x8198, 0x4ED2, 0x8199, 0x4EDA, 0x819A, 0x4EDB, 0x819B, 0x4EDC,\t0x819C, 0x4EE0, 0x819D, 0x4EE2, 0x819E, 0x4EE6, 0x819F, 0x4EE7,\n\t0x81A0, 0x4EE9, 0x81A1, 0x4EED, 0x81A2, 0x4EEE, 0x81A3, 0x4EEF,\t0x81A4, 0x4EF1, 0x81A5, 0x4EF4, 0x81A6, 0x4EF8, 0x81A7, 0x4EF9,\n\t0x81A8, 0x4EFA, 0x81A9, 0x4EFC, 0x81AA, 0x4EFE, 0x81AB, 0x4F00,\t0x81AC, 0x4F02, 0x81AD, 0x4F03, 0x81AE, 0x4F04, 0x81AF, 0x4F05,\n\t0x81B0, 0x4F06, 0x81B1, 0x4F07, 0x81B2, 0x4F08, 0x81B3, 0x4F0B,\t0x81B4, 0x4F0C, 0x81B5, 0x4F12, 0x81B6, 0x4F13, 0x81B7, 0x4F14,\n\t0x81B8, 0x4F15, 0x81B9, 0x4F16, 0x81BA, 0x4F1C, 0x81BB, 0x4F1D,\t0x81BC, 0x4F21, 0x81BD, 0x4F23, 0x81BE, 0x4F28, 0x81BF, 0x4F29,\n\t0x81C0, 0x4F2C, 0x81C1, 0x4F2D, 0x81C2, 0x4F2E, 0x81C3, 0x4F31,\t0x81C4, 0x4F33, 0x81C5, 0x4F35, 0x81C6, 0x4F37, 0x81C7, 0x4F39,\n\t0x81C8, 0x4F3B, 0x81C9, 0x4F3E, 0x81CA, 0x4F3F, 0x81CB, 0x4F40,\t0x81CC, 0x4F41, 0x81CD, 0x4F42, 0x81CE, 0x4F44, 0x81CF, 0x4F45,\n\t0x81D0, 0x4F47, 0x81D1, 0x4F48, 0x81D2, 0x4F49, 0x81D3, 0x4F4A,\t0x81D4, 0x4F4B, 0x81D5, 0x4F4C, 0x81D6, 0x4F52, 0x81D7, 0x4F54,\n\t0x81D8, 0x4F56, 0x81D9, 0x4F61, 0x81DA, 0x4F62, 0x81DB, 0x4F66,\t0x81DC, 0x4F68, 0x81DD, 0x4F6A, 0x81DE, 0x4F6B, 0x81DF, 0x4F6D,\n\t0x81E0, 0x4F6E, 0x81E1, 0x4F71, 0x81E2, 0x4F72, 0x81E3, 0x4F75,\t0x81E4, 0x4F77, 0x81E5, 0x4F78, 0x81E6, 0x4F79, 0x81E7, 0x4F7A,\n\t0x81E8, 0x4F7D, 0x81E9, 0x4F80, 0x81EA, 0x4F81, 0x81EB, 0x4F82,\t0x81EC, 0x4F85, 0x81ED, 0x4F86, 0x81EE, 0x4F87, 0x81EF, 0x4F8A,\n\t0x81F0, 0x4F8C, 0x81F1, 0x4F8E, 0x81F2, 0x4F90, 0x81F3, 0x4F92,\t0x81F4, 0x4F93, 0x81F5, 0x4F95, 0x81F6, 0x4F96, 0x81F7, 0x4F98,\n\t0x81F8, 0x4F99, 0x81F9, 0x4F9A, 0x81FA, 0x4F9C, 0x81FB, 0x4F9E,\t0x81FC, 0x4F9F, 0x81FD, 0x4FA1, 0x81FE, 0x4FA2, 0x8240, 0x4FA4,\n\t0x8241, 0x4FAB, 0x8242, 0x4FAD, 0x8243, 0x4FB0, 0x8244, 0x4FB1,\t0x8245, 0x4FB2, 0x8246, 0x4FB3, 0x8247, 0x4FB4, 0x8248, 0x4FB6,\n\t0x8249, 0x4FB7, 0x824A, 0x4FB8, 0x824B, 0x4FB9, 0x824C, 0x4FBA,\t0x824D, 0x4FBB, 0x824E, 0x4FBC, 0x824F, 0x4FBD, 0x8250, 0x4FBE,\n\t0x8251, 0x4FC0, 0x8252, 0x4FC1, 0x8253, 0x4FC2, 0x8254, 0x4FC6,\t0x8255, 0x4FC7, 0x8256, 0x4FC8, 0x8257, 0x4FC9, 0x8258, 0x4FCB,\n\t0x8259, 0x4FCC, 0x825A, 0x4FCD, 0x825B, 0x4FD2, 0x825C, 0x4FD3,\t0x825D, 0x4FD4, 0x825E, 0x4FD5, 0x825F, 0x4FD6, 0x8260, 0x4FD9,\n\t0x8261, 0x4FDB, 0x8262, 0x4FE0, 0x8263, 0x4FE2, 0x8264, 0x4FE4,\t0x8265, 0x4FE5, 0x8266, 0x4FE7, 0x8267, 0x4FEB, 0x8268, 0x4FEC,\n\t0x8269, 0x4FF0, 0x826A, 0x4FF2, 0x826B, 0x4FF4, 0x826C, 0x4FF5,\t0x826D, 0x4FF6, 0x826E, 0x4FF7, 0x826F, 0x4FF9, 0x8270, 0x4FFB,\n\t0x8271, 0x4FFC, 0x8272, 0x4FFD, 0x8273, 0x4FFF, 0x8274, 0x5000,\t0x8275, 0x5001, 0x8276, 0x5002, 0x8277, 0x5003, 0x8278, 0x5004,\n\t0x8279, 0x5005, 0x827A, 0x5006, 0x827B, 0x5007, 0x827C, 0x5008,\t0x827D, 0x5009, 0x827E, 0x500A, 0x8280, 0x500B, 0x8281, 0x500E,\n\t0x8282, 0x5010, 0x8283, 0x5011, 0x8284, 0x5013, 0x8285, 0x5015,\t0x8286, 0x5016, 0x8287, 0x5017, 0x8288, 0x501B, 0x8289, 0x501D,\n\t0x828A, 0x501E, 0x828B, 0x5020, 0x828C, 0x5022, 0x828D, 0x5023,\t0x828E, 0x5024, 0x828F, 0x5027, 0x8290, 0x502B, 0x8291, 0x502F,\n\t0x8292, 0x5030, 0x8293, 0x5031, 0x8294, 0x5032, 0x8295, 0x5033,\t0x8296, 0x5034, 0x8297, 0x5035, 0x8298, 0x5036, 0x8299, 0x5037,\n\t0x829A, 0x5038, 0x829B, 0x5039, 0x829C, 0x503B, 0x829D, 0x503D,\t0x829E, 0x503F, 0x829F, 0x5040, 0x82A0, 0x5041, 0x82A1, 0x5042,\n\t0x82A2, 0x5044, 0x82A3, 0x5045, 0x82A4, 0x5046, 0x82A5, 0x5049,\t0x82A6, 0x504A, 0x82A7, 0x504B, 0x82A8, 0x504D, 0x82A9, 0x5050,\n\t0x82AA, 0x5051, 0x82AB, 0x5052, 0x82AC, 0x5053, 0x82AD, 0x5054,\t0x82AE, 0x5056, 0x82AF, 0x5057, 0x82B0, 0x5058, 0x82B1, 0x5059,\n\t0x82B2, 0x505B, 0x82B3, 0x505D, 0x82B4, 0x505E, 0x82B5, 0x505F,\t0x82B6, 0x5060, 0x82B7, 0x5061, 0x82B8, 0x5062, 0x82B9, 0x5063,\n\t0x82BA, 0x5064, 0x82BB, 0x5066, 0x82BC, 0x5067, 0x82BD, 0x5068,\t0x82BE, 0x5069, 0x82BF, 0x506A, 0x82C0, 0x506B, 0x82C1, 0x506D,\n\t0x82C2, 0x506E, 0x82C3, 0x506F, 0x82C4, 0x5070, 0x82C5, 0x5071,\t0x82C6, 0x5072, 0x82C7, 0x5073, 0x82C8, 0x5074, 0x82C9, 0x5075,\n\t0x82CA, 0x5078, 0x82CB, 0x5079, 0x82CC, 0x507A, 0x82CD, 0x507C,\t0x82CE, 0x507D, 0x82CF, 0x5081, 0x82D0, 0x5082, 0x82D1, 0x5083,\n\t0x82D2, 0x5084, 0x82D3, 0x5086, 0x82D4, 0x5087, 0x82D5, 0x5089,\t0x82D6, 0x508A, 0x82D7, 0x508B, 0x82D8, 0x508C, 0x82D9, 0x508E,\n\t0x82DA, 0x508F, 0x82DB, 0x5090, 0x82DC, 0x5091, 0x82DD, 0x5092,\t0x82DE, 0x5093, 0x82DF, 0x5094, 0x82E0, 0x5095, 0x82E1, 0x5096,\n\t0x82E2, 0x5097, 0x82E3, 0x5098, 0x82E4, 0x5099, 0x82E5, 0x509A,\t0x82E6, 0x509B, 0x82E7, 0x509C, 0x82E8, 0x509D, 0x82E9, 0x509E,\n\t0x82EA, 0x509F, 0x82EB, 0x50A0, 0x82EC, 0x50A1, 0x82ED, 0x50A2,\t0x82EE, 0x50A4, 0x82EF, 0x50A6, 0x82F0, 0x50AA, 0x82F1, 0x50AB,\n\t0x82F2, 0x50AD, 0x82F3, 0x50AE, 0x82F4, 0x50AF, 0x82F5, 0x50B0,\t0x82F6, 0x50B1, 0x82F7, 0x50B3, 0x82F8, 0x50B4, 0x82F9, 0x50B5,\n\t0x82FA, 0x50B6, 0x82FB, 0x50B7, 0x82FC, 0x50B8, 0x82FD, 0x50B9,\t0x82FE, 0x50BC, 0x8340, 0x50BD, 0x8341, 0x50BE, 0x8342, 0x50BF,\n\t0x8343, 0x50C0, 0x8344, 0x50C1, 0x8345, 0x50C2, 0x8346, 0x50C3,\t0x8347, 0x50C4, 0x8348, 0x50C5, 0x8349, 0x50C6, 0x834A, 0x50C7,\n\t0x834B, 0x50C8, 0x834C, 0x50C9, 0x834D, 0x50CA, 0x834E, 0x50CB,\t0x834F, 0x50CC, 0x8350, 0x50CD, 0x8351, 0x50CE, 0x8352, 0x50D0,\n\t0x8353, 0x50D1, 0x8354, 0x50D2, 0x8355, 0x50D3, 0x8356, 0x50D4,\t0x8357, 0x50D5, 0x8358, 0x50D7, 0x8359, 0x50D8, 0x835A, 0x50D9,\n\t0x835B, 0x50DB, 0x835C, 0x50DC, 0x835D, 0x50DD, 0x835E, 0x50DE,\t0x835F, 0x50DF, 0x8360, 0x50E0, 0x8361, 0x50E1, 0x8362, 0x50E2,\n\t0x8363, 0x50E3, 0x8364, 0x50E4, 0x8365, 0x50E5, 0x8366, 0x50E8,\t0x8367, 0x50E9, 0x8368, 0x50EA, 0x8369, 0x50EB, 0x836A, 0x50EF,\n\t0x836B, 0x50F0, 0x836C, 0x50F1, 0x836D, 0x50F2, 0x836E, 0x50F4,\t0x836F, 0x50F6, 0x8370, 0x50F7, 0x8371, 0x50F8, 0x8372, 0x50F9,\n\t0x8373, 0x50FA, 0x8374, 0x50FC, 0x8375, 0x50FD, 0x8376, 0x50FE,\t0x8377, 0x50FF, 0x8378, 0x5100, 0x8379, 0x5101, 0x837A, 0x5102,\n\t0x837B, 0x5103, 0x837C, 0x5104, 0x837D, 0x5105, 0x837E, 0x5108,\t0x8380, 0x5109, 0x8381, 0x510A, 0x8382, 0x510C, 0x8383, 0x510D,\n\t0x8384, 0x510E, 0x8385, 0x510F, 0x8386, 0x5110, 0x8387, 0x5111,\t0x8388, 0x5113, 0x8389, 0x5114, 0x838A, 0x5115, 0x838B, 0x5116,\n\t0x838C, 0x5117, 0x838D, 0x5118, 0x838E, 0x5119, 0x838F, 0x511A,\t0x8390, 0x511B, 0x8391, 0x511C, 0x8392, 0x511D, 0x8393, 0x511E,\n\t0x8394, 0x511F, 0x8395, 0x5120, 0x8396, 0x5122, 0x8397, 0x5123,\t0x8398, 0x5124, 0x8399, 0x5125, 0x839A, 0x5126, 0x839B, 0x5127,\n\t0x839C, 0x5128, 0x839D, 0x5129, 0x839E, 0x512A, 0x839F, 0x512B,\t0x83A0, 0x512C, 0x83A1, 0x512D, 0x83A2, 0x512E, 0x83A3, 0x512F,\n\t0x83A4, 0x5130, 0x83A5, 0x5131, 0x83A6, 0x5132, 0x83A7, 0x5133,\t0x83A8, 0x5134, 0x83A9, 0x5135, 0x83AA, 0x5136, 0x83AB, 0x5137,\n\t0x83AC, 0x5138, 0x83AD, 0x5139, 0x83AE, 0x513A, 0x83AF, 0x513B,\t0x83B0, 0x513C, 0x83B1, 0x513D, 0x83B2, 0x513E, 0x83B3, 0x5142,\n\t0x83B4, 0x5147, 0x83B5, 0x514A, 0x83B6, 0x514C, 0x83B7, 0x514E,\t0x83B8, 0x514F, 0x83B9, 0x5150, 0x83BA, 0x5152, 0x83BB, 0x5153,\n\t0x83BC, 0x5157, 0x83BD, 0x5158, 0x83BE, 0x5159, 0x83BF, 0x515B,\t0x83C0, 0x515D, 0x83C1, 0x515E, 0x83C2, 0x515F, 0x83C3, 0x5160,\n\t0x83C4, 0x5161, 0x83C5, 0x5163, 0x83C6, 0x5164, 0x83C7, 0x5166,\t0x83C8, 0x5167, 0x83C9, 0x5169, 0x83CA, 0x516A, 0x83CB, 0x516F,\n\t0x83CC, 0x5172, 0x83CD, 0x517A, 0x83CE, 0x517E, 0x83CF, 0x517F,\t0x83D0, 0x5183, 0x83D1, 0x5184, 0x83D2, 0x5186, 0x83D3, 0x5187,\n\t0x83D4, 0x518A, 0x83D5, 0x518B, 0x83D6, 0x518E, 0x83D7, 0x518F,\t0x83D8, 0x5190, 0x83D9, 0x5191, 0x83DA, 0x5193, 0x83DB, 0x5194,\n\t0x83DC, 0x5198, 0x83DD, 0x519A, 0x83DE, 0x519D, 0x83DF, 0x519E,\t0x83E0, 0x519F, 0x83E1, 0x51A1, 0x83E2, 0x51A3, 0x83E3, 0x51A6,\n\t0x83E4, 0x51A7, 0x83E5, 0x51A8, 0x83E6, 0x51A9, 0x83E7, 0x51AA,\t0x83E8, 0x51AD, 0x83E9, 0x51AE, 0x83EA, 0x51B4, 0x83EB, 0x51B8,\n\t0x83EC, 0x51B9, 0x83ED, 0x51BA, 0x83EE, 0x51BE, 0x83EF, 0x51BF,\t0x83F0, 0x51C1, 0x83F1, 0x51C2, 0x83F2, 0x51C3, 0x83F3, 0x51C5,\n\t0x83F4, 0x51C8, 0x83F5, 0x51CA, 0x83F6, 0x51CD, 0x83F7, 0x51CE,\t0x83F8, 0x51D0, 0x83F9, 0x51D2, 0x83FA, 0x51D3, 0x83FB, 0x51D4,\n\t0x83FC, 0x51D5, 0x83FD, 0x51D6, 0x83FE, 0x51D7, 0x8440, 0x51D8,\t0x8441, 0x51D9, 0x8442, 0x51DA, 0x8443, 0x51DC, 0x8444, 0x51DE,\n\t0x8445, 0x51DF, 0x8446, 0x51E2, 0x8447, 0x51E3, 0x8448, 0x51E5,\t0x8449, 0x51E6, 0x844A, 0x51E7, 0x844B, 0x51E8, 0x844C, 0x51E9,\n\t0x844D, 0x51EA, 0x844E, 0x51EC, 0x844F, 0x51EE, 0x8450, 0x51F1,\t0x8451, 0x51F2, 0x8452, 0x51F4, 0x8453, 0x51F7, 0x8454, 0x51FE,\n\t0x8455, 0x5204, 0x8456, 0x5205, 0x8457, 0x5209, 0x8458, 0x520B,\t0x8459, 0x520C, 0x845A, 0x520F, 0x845B, 0x5210, 0x845C, 0x5213,\n\t0x845D, 0x5214, 0x845E, 0x5215, 0x845F, 0x521C, 0x8460, 0x521E,\t0x8461, 0x521F, 0x8462, 0x5221, 0x8463, 0x5222, 0x8464, 0x5223,\n\t0x8465, 0x5225, 0x8466, 0x5226, 0x8467, 0x5227, 0x8468, 0x522A,\t0x8469, 0x522C, 0x846A, 0x522F, 0x846B, 0x5231, 0x846C, 0x5232,\n\t0x846D, 0x5234, 0x846E, 0x5235, 0x846F, 0x523C, 0x8470, 0x523E,\t0x8471, 0x5244, 0x8472, 0x5245, 0x8473, 0x5246, 0x8474, 0x5247,\n\t0x8475, 0x5248, 0x8476, 0x5249, 0x8477, 0x524B, 0x8478, 0x524E,\t0x8479, 0x524F, 0x847A, 0x5252, 0x847B, 0x5253, 0x847C, 0x5255,\n\t0x847D, 0x5257, 0x847E, 0x5258, 0x8480, 0x5259, 0x8481, 0x525A,\t0x8482, 0x525B, 0x8483, 0x525D, 0x8484, 0x525F, 0x8485, 0x5260,\n\t0x8486, 0x5262, 0x8487, 0x5263, 0x8488, 0x5264, 0x8489, 0x5266,\t0x848A, 0x5268, 0x848B, 0x526B, 0x848C, 0x526C, 0x848D, 0x526D,\n\t0x848E, 0x526E, 0x848F, 0x5270, 0x8490, 0x5271, 0x8491, 0x5273,\t0x8492, 0x5274, 0x8493, 0x5275, 0x8494, 0x5276, 0x8495, 0x5277,\n\t0x8496, 0x5278, 0x8497, 0x5279, 0x8498, 0x527A, 0x8499, 0x527B,\t0x849A, 0x527C, 0x849B, 0x527E, 0x849C, 0x5280, 0x849D, 0x5283,\n\t0x849E, 0x5284, 0x849F, 0x5285, 0x84A0, 0x5286, 0x84A1, 0x5287,\t0x84A2, 0x5289, 0x84A3, 0x528A, 0x84A4, 0x528B, 0x84A5, 0x528C,\n\t0x84A6, 0x528D, 0x84A7, 0x528E, 0x84A8, 0x528F, 0x84A9, 0x5291,\t0x84AA, 0x5292, 0x84AB, 0x5294, 0x84AC, 0x5295, 0x84AD, 0x5296,\n\t0x84AE, 0x5297, 0x84AF, 0x5298, 0x84B0, 0x5299, 0x84B1, 0x529A,\t0x84B2, 0x529C, 0x84B3, 0x52A4, 0x84B4, 0x52A5, 0x84B5, 0x52A6,\n\t0x84B6, 0x52A7, 0x84B7, 0x52AE, 0x84B8, 0x52AF, 0x84B9, 0x52B0,\t0x84BA, 0x52B4, 0x84BB, 0x52B5, 0x84BC, 0x52B6, 0x84BD, 0x52B7,\n\t0x84BE, 0x52B8, 0x84BF, 0x52B9, 0x84C0, 0x52BA, 0x84C1, 0x52BB,\t0x84C2, 0x52BC, 0x84C3, 0x52BD, 0x84C4, 0x52C0, 0x84C5, 0x52C1,\n\t0x84C6, 0x52C2, 0x84C7, 0x52C4, 0x84C8, 0x52C5, 0x84C9, 0x52C6,\t0x84CA, 0x52C8, 0x84CB, 0x52CA, 0x84CC, 0x52CC, 0x84CD, 0x52CD,\n\t0x84CE, 0x52CE, 0x84CF, 0x52CF, 0x84D0, 0x52D1, 0x84D1, 0x52D3,\t0x84D2, 0x52D4, 0x84D3, 0x52D5, 0x84D4, 0x52D7, 0x84D5, 0x52D9,\n\t0x84D6, 0x52DA, 0x84D7, 0x52DB, 0x84D8, 0x52DC, 0x84D9, 0x52DD,\t0x84DA, 0x52DE, 0x84DB, 0x52E0, 0x84DC, 0x52E1, 0x84DD, 0x52E2,\n\t0x84DE, 0x52E3, 0x84DF, 0x52E5, 0x84E0, 0x52E6, 0x84E1, 0x52E7,\t0x84E2, 0x52E8, 0x84E3, 0x52E9, 0x84E4, 0x52EA, 0x84E5, 0x52EB,\n\t0x84E6, 0x52EC, 0x84E7, 0x52ED, 0x84E8, 0x52EE, 0x84E9, 0x52EF,\t0x84EA, 0x52F1, 0x84EB, 0x52F2, 0x84EC, 0x52F3, 0x84ED, 0x52F4,\n\t0x84EE, 0x52F5, 0x84EF, 0x52F6, 0x84F0, 0x52F7, 0x84F1, 0x52F8,\t0x84F2, 0x52FB, 0x84F3, 0x52FC, 0x84F4, 0x52FD, 0x84F5, 0x5301,\n\t0x84F6, 0x5302, 0x84F7, 0x5303, 0x84F8, 0x5304, 0x84F9, 0x5307,\t0x84FA, 0x5309, 0x84FB, 0x530A, 0x84FC, 0x530B, 0x84FD, 0x530C,\n\t0x84FE, 0x530E, 0x8540, 0x5311, 0x8541, 0x5312, 0x8542, 0x5313,\t0x8543, 0x5314, 0x8544, 0x5318, 0x8545, 0x531B, 0x8546, 0x531C,\n\t0x8547, 0x531E, 0x8548, 0x531F, 0x8549, 0x5322, 0x854A, 0x5324,\t0x854B, 0x5325, 0x854C, 0x5327, 0x854D, 0x5328, 0x854E, 0x5329,\n\t0x854F, 0x532B, 0x8550, 0x532C, 0x8551, 0x532D, 0x8552, 0x532F,\t0x8553, 0x5330, 0x8554, 0x5331, 0x8555, 0x5332, 0x8556, 0x5333,\n\t0x8557, 0x5334, 0x8558, 0x5335, 0x8559, 0x5336, 0x855A, 0x5337,\t0x855B, 0x5338, 0x855C, 0x533C, 0x855D, 0x533D, 0x855E, 0x5340,\n\t0x855F, 0x5342, 0x8560, 0x5344, 0x8561, 0x5346, 0x8562, 0x534B,\t0x8563, 0x534C, 0x8564, 0x534D, 0x8565, 0x5350, 0x8566, 0x5354,\n\t0x8567, 0x5358, 0x8568, 0x5359, 0x8569, 0x535B, 0x856A, 0x535D,\t0x856B, 0x5365, 0x856C, 0x5368, 0x856D, 0x536A, 0x856E, 0x536C,\n\t0x856F, 0x536D, 0x8570, 0x5372, 0x8571, 0x5376, 0x8572, 0x5379,\t0x8573, 0x537B, 0x8574, 0x537C, 0x8575, 0x537D, 0x8576, 0x537E,\n\t0x8577, 0x5380, 0x8578, 0x5381, 0x8579, 0x5383, 0x857A, 0x5387,\t0x857B, 0x5388, 0x857C, 0x538A, 0x857D, 0x538E, 0x857E, 0x538F,\n\t0x8580, 0x5390, 0x8581, 0x5391, 0x8582, 0x5392, 0x8583, 0x5393,\t0x8584, 0x5394, 0x8585, 0x5396, 0x8586, 0x5397, 0x8587, 0x5399,\n\t0x8588, 0x539B, 0x8589, 0x539C, 0x858A, 0x539E, 0x858B, 0x53A0,\t0x858C, 0x53A1, 0x858D, 0x53A4, 0x858E, 0x53A7, 0x858F, 0x53AA,\n\t0x8590, 0x53AB, 0x8591, 0x53AC, 0x8592, 0x53AD, 0x8593, 0x53AF,\t0x8594, 0x53B0, 0x8595, 0x53B1, 0x8596, 0x53B2, 0x8597, 0x53B3,\n\t0x8598, 0x53B4, 0x8599, 0x53B5, 0x859A, 0x53B7, 0x859B, 0x53B8,\t0x859C, 0x53B9, 0x859D, 0x53BA, 0x859E, 0x53BC, 0x859F, 0x53BD,\n\t0x85A0, 0x53BE, 0x85A1, 0x53C0, 0x85A2, 0x53C3, 0x85A3, 0x53C4,\t0x85A4, 0x53C5, 0x85A5, 0x53C6, 0x85A6, 0x53C7, 0x85A7, 0x53CE,\n\t0x85A8, 0x53CF, 0x85A9, 0x53D0, 0x85AA, 0x53D2, 0x85AB, 0x53D3,\t0x85AC, 0x53D5, 0x85AD, 0x53DA, 0x85AE, 0x53DC, 0x85AF, 0x53DD,\n\t0x85B0, 0x53DE, 0x85B1, 0x53E1, 0x85B2, 0x53E2, 0x85B3, 0x53E7,\t0x85B4, 0x53F4, 0x85B5, 0x53FA, 0x85B6, 0x53FE, 0x85B7, 0x53FF,\n\t0x85B8, 0x5400, 0x85B9, 0x5402, 0x85BA, 0x5405, 0x85BB, 0x5407,\t0x85BC, 0x540B, 0x85BD, 0x5414, 0x85BE, 0x5418, 0x85BF, 0x5419,\n\t0x85C0, 0x541A, 0x85C1, 0x541C, 0x85C2, 0x5422, 0x85C3, 0x5424,\t0x85C4, 0x5425, 0x85C5, 0x542A, 0x85C6, 0x5430, 0x85C7, 0x5433,\n\t0x85C8, 0x5436, 0x85C9, 0x5437, 0x85CA, 0x543A, 0x85CB, 0x543D,\t0x85CC, 0x543F, 0x85CD, 0x5441, 0x85CE, 0x5442, 0x85CF, 0x5444,\n\t0x85D0, 0x5445, 0x85D1, 0x5447, 0x85D2, 0x5449, 0x85D3, 0x544C,\t0x85D4, 0x544D, 0x85D5, 0x544E, 0x85D6, 0x544F, 0x85D7, 0x5451,\n\t0x85D8, 0x545A, 0x85D9, 0x545D, 0x85DA, 0x545E, 0x85DB, 0x545F,\t0x85DC, 0x5460, 0x85DD, 0x5461, 0x85DE, 0x5463, 0x85DF, 0x5465,\n\t0x85E0, 0x5467, 0x85E1, 0x5469, 0x85E2, 0x546A, 0x85E3, 0x546B,\t0x85E4, 0x546C, 0x85E5, 0x546D, 0x85E6, 0x546E, 0x85E7, 0x546F,\n\t0x85E8, 0x5470, 0x85E9, 0x5474, 0x85EA, 0x5479, 0x85EB, 0x547A,\t0x85EC, 0x547E, 0x85ED, 0x547F, 0x85EE, 0x5481, 0x85EF, 0x5483,\n\t0x85F0, 0x5485, 0x85F1, 0x5487, 0x85F2, 0x5488, 0x85F3, 0x5489,\t0x85F4, 0x548A, 0x85F5, 0x548D, 0x85F6, 0x5491, 0x85F7, 0x5493,\n\t0x85F8, 0x5497, 0x85F9, 0x5498, 0x85FA, 0x549C, 0x85FB, 0x549E,\t0x85FC, 0x549F, 0x85FD, 0x54A0, 0x85FE, 0x54A1, 0x8640, 0x54A2,\n\t0x8641, 0x54A5, 0x8642, 0x54AE, 0x8643, 0x54B0, 0x8644, 0x54B2,\t0x8645, 0x54B5, 0x8646, 0x54B6, 0x8647, 0x54B7, 0x8648, 0x54B9,\n\t0x8649, 0x54BA, 0x864A, 0x54BC, 0x864B, 0x54BE, 0x864C, 0x54C3,\t0x864D, 0x54C5, 0x864E, 0x54CA, 0x864F, 0x54CB, 0x8650, 0x54D6,\n\t0x8651, 0x54D8, 0x8652, 0x54DB, 0x8653, 0x54E0, 0x8654, 0x54E1,\t0x8655, 0x54E2, 0x8656, 0x54E3, 0x8657, 0x54E4, 0x8658, 0x54EB,\n\t0x8659, 0x54EC, 0x865A, 0x54EF, 0x865B, 0x54F0, 0x865C, 0x54F1,\t0x865D, 0x54F4, 0x865E, 0x54F5, 0x865F, 0x54F6, 0x8660, 0x54F7,\n\t0x8661, 0x54F8, 0x8662, 0x54F9, 0x8663, 0x54FB, 0x8664, 0x54FE,\t0x8665, 0x5500, 0x8666, 0x5502, 0x8667, 0x5503, 0x8668, 0x5504,\n\t0x8669, 0x5505, 0x866A, 0x5508, 0x866B, 0x550A, 0x866C, 0x550B,\t0x866D, 0x550C, 0x866E, 0x550D, 0x866F, 0x550E, 0x8670, 0x5512,\n\t0x8671, 0x5513, 0x8672, 0x5515, 0x8673, 0x5516, 0x8674, 0x5517,\t0x8675, 0x5518, 0x8676, 0x5519, 0x8677, 0x551A, 0x8678, 0x551C,\n\t0x8679, 0x551D, 0x867A, 0x551E, 0x867B, 0x551F, 0x867C, 0x5521,\t0x867D, 0x5525, 0x867E, 0x5526, 0x8680, 0x5528, 0x8681, 0x5529,\n\t0x8682, 0x552B, 0x8683, 0x552D, 0x8684, 0x5532, 0x8685, 0x5534,\t0x8686, 0x5535, 0x8687, 0x5536, 0x8688, 0x5538, 0x8689, 0x5539,\n\t0x868A, 0x553A, 0x868B, 0x553B, 0x868C, 0x553D, 0x868D, 0x5540,\t0x868E, 0x5542, 0x868F, 0x5545, 0x8690, 0x5547, 0x8691, 0x5548,\n\t0x8692, 0x554B, 0x8693, 0x554C, 0x8694, 0x554D, 0x8695, 0x554E,\t0x8696, 0x554F, 0x8697, 0x5551, 0x8698, 0x5552, 0x8699, 0x5553,\n\t0x869A, 0x5554, 0x869B, 0x5557, 0x869C, 0x5558, 0x869D, 0x5559,\t0x869E, 0x555A, 0x869F, 0x555B, 0x86A0, 0x555D, 0x86A1, 0x555E,\n\t0x86A2, 0x555F, 0x86A3, 0x5560, 0x86A4, 0x5562, 0x86A5, 0x5563,\t0x86A6, 0x5568, 0x86A7, 0x5569, 0x86A8, 0x556B, 0x86A9, 0x556F,\n\t0x86AA, 0x5570, 0x86AB, 0x5571, 0x86AC, 0x5572, 0x86AD, 0x5573,\t0x86AE, 0x5574, 0x86AF, 0x5579, 0x86B0, 0x557A, 0x86B1, 0x557D,\n\t0x86B2, 0x557F, 0x86B3, 0x5585, 0x86B4, 0x5586, 0x86B5, 0x558C,\t0x86B6, 0x558D, 0x86B7, 0x558E, 0x86B8, 0x5590, 0x86B9, 0x5592,\n\t0x86BA, 0x5593, 0x86BB, 0x5595, 0x86BC, 0x5596, 0x86BD, 0x5597,\t0x86BE, 0x559A, 0x86BF, 0x559B, 0x86C0, 0x559E, 0x86C1, 0x55A0,\n\t0x86C2, 0x55A1, 0x86C3, 0x55A2, 0x86C4, 0x55A3, 0x86C5, 0x55A4,\t0x86C6, 0x55A5, 0x86C7, 0x55A6, 0x86C8, 0x55A8, 0x86C9, 0x55A9,\n\t0x86CA, 0x55AA, 0x86CB, 0x55AB, 0x86CC, 0x55AC, 0x86CD, 0x55AD,\t0x86CE, 0x55AE, 0x86CF, 0x55AF, 0x86D0, 0x55B0, 0x86D1, 0x55B2,\n\t0x86D2, 0x55B4, 0x86D3, 0x55B6, 0x86D4, 0x55B8, 0x86D5, 0x55BA,\t0x86D6, 0x55BC, 0x86D7, 0x55BF, 0x86D8, 0x55C0, 0x86D9, 0x55C1,\n\t0x86DA, 0x55C2, 0x86DB, 0x55C3, 0x86DC, 0x55C6, 0x86DD, 0x55C7,\t0x86DE, 0x55C8, 0x86DF, 0x55CA, 0x86E0, 0x55CB, 0x86E1, 0x55CE,\n\t0x86E2, 0x55CF, 0x86E3, 0x55D0, 0x86E4, 0x55D5, 0x86E5, 0x55D7,\t0x86E6, 0x55D8, 0x86E7, 0x55D9, 0x86E8, 0x55DA, 0x86E9, 0x55DB,\n\t0x86EA, 0x55DE, 0x86EB, 0x55E0, 0x86EC, 0x55E2, 0x86ED, 0x55E7,\t0x86EE, 0x55E9, 0x86EF, 0x55ED, 0x86F0, 0x55EE, 0x86F1, 0x55F0,\n\t0x86F2, 0x55F1, 0x86F3, 0x55F4, 0x86F4, 0x55F6, 0x86F5, 0x55F8,\t0x86F6, 0x55F9, 0x86F7, 0x55FA, 0x86F8, 0x55FB, 0x86F9, 0x55FC,\n\t0x86FA, 0x55FF, 0x86FB, 0x5602, 0x86FC, 0x5603, 0x86FD, 0x5604,\t0x86FE, 0x5605, 0x8740, 0x5606, 0x8741, 0x5607, 0x8742, 0x560A,\n\t0x8743, 0x560B, 0x8744, 0x560D, 0x8745, 0x5610, 0x8746, 0x5611,\t0x8747, 0x5612, 0x8748, 0x5613, 0x8749, 0x5614, 0x874A, 0x5615,\n\t0x874B, 0x5616, 0x874C, 0x5617, 0x874D, 0x5619, 0x874E, 0x561A,\t0x874F, 0x561C, 0x8750, 0x561D, 0x8751, 0x5620, 0x8752, 0x5621,\n\t0x8753, 0x5622, 0x8754, 0x5625, 0x8755, 0x5626, 0x8756, 0x5628,\t0x8757, 0x5629, 0x8758, 0x562A, 0x8759, 0x562B, 0x875A, 0x562E,\n\t0x875B, 0x562F, 0x875C, 0x5630, 0x875D, 0x5633, 0x875E, 0x5635,\t0x875F, 0x5637, 0x8760, 0x5638, 0x8761, 0x563A, 0x8762, 0x563C,\n\t0x8763, 0x563D, 0x8764, 0x563E, 0x8765, 0x5640, 0x8766, 0x5641,\t0x8767, 0x5642, 0x8768, 0x5643, 0x8769, 0x5644, 0x876A, 0x5645,\n\t0x876B, 0x5646, 0x876C, 0x5647, 0x876D, 0x5648, 0x876E, 0x5649,\t0x876F, 0x564A, 0x8770, 0x564B, 0x8771, 0x564F, 0x8772, 0x5650,\n\t0x8773, 0x5651, 0x8774, 0x5652, 0x8775, 0x5653, 0x8776, 0x5655,\t0x8777, 0x5656, 0x8778, 0x565A, 0x8779, 0x565B, 0x877A, 0x565D,\n\t0x877B, 0x565E, 0x877C, 0x565F, 0x877D, 0x5660, 0x877E, 0x5661,\t0x8780, 0x5663, 0x8781, 0x5665, 0x8782, 0x5666, 0x8783, 0x5667,\n\t0x8784, 0x566D, 0x8785, 0x566E, 0x8786, 0x566F, 0x8787, 0x5670,\t0x8788, 0x5672, 0x8789, 0x5673, 0x878A, 0x5674, 0x878B, 0x5675,\n\t0x878C, 0x5677, 0x878D, 0x5678, 0x878E, 0x5679, 0x878F, 0x567A,\t0x8790, 0x567D, 0x8791, 0x567E, 0x8792, 0x567F, 0x8793, 0x5680,\n\t0x8794, 0x5681, 0x8795, 0x5682, 0x8796, 0x5683, 0x8797, 0x5684,\t0x8798, 0x5687, 0x8799, 0x5688, 0x879A, 0x5689, 0x879B, 0x568A,\n\t0x879C, 0x568B, 0x879D, 0x568C, 0x879E, 0x568D, 0x879F, 0x5690,\t0x87A0, 0x5691, 0x87A1, 0x5692, 0x87A2, 0x5694, 0x87A3, 0x5695,\n\t0x87A4, 0x5696, 0x87A5, 0x5697, 0x87A6, 0x5698, 0x87A7, 0x5699,\t0x87A8, 0x569A, 0x87A9, 0x569B, 0x87AA, 0x569C, 0x87AB, 0x569D,\n\t0x87AC, 0x569E, 0x87AD, 0x569F, 0x87AE, 0x56A0, 0x87AF, 0x56A1,\t0x87B0, 0x56A2, 0x87B1, 0x56A4, 0x87B2, 0x56A5, 0x87B3, 0x56A6,\n\t0x87B4, 0x56A7, 0x87B5, 0x56A8, 0x87B6, 0x56A9, 0x87B7, 0x56AA,\t0x87B8, 0x56AB, 0x87B9, 0x56AC, 0x87BA, 0x56AD, 0x87BB, 0x56AE,\n\t0x87BC, 0x56B0, 0x87BD, 0x56B1, 0x87BE, 0x56B2, 0x87BF, 0x56B3,\t0x87C0, 0x56B4, 0x87C1, 0x56B5, 0x87C2, 0x56B6, 0x87C3, 0x56B8,\n\t0x87C4, 0x56B9, 0x87C5, 0x56BA, 0x87C6, 0x56BB, 0x87C7, 0x56BD,\t0x87C8, 0x56BE, 0x87C9, 0x56BF, 0x87CA, 0x56C0, 0x87CB, 0x56C1,\n\t0x87CC, 0x56C2, 0x87CD, 0x56C3, 0x87CE, 0x56C4, 0x87CF, 0x56C5,\t0x87D0, 0x56C6, 0x87D1, 0x56C7, 0x87D2, 0x56C8, 0x87D3, 0x56C9,\n\t0x87D4, 0x56CB, 0x87D5, 0x56CC, 0x87D6, 0x56CD, 0x87D7, 0x56CE,\t0x87D8, 0x56CF, 0x87D9, 0x56D0, 0x87DA, 0x56D1, 0x87DB, 0x56D2,\n\t0x87DC, 0x56D3, 0x87DD, 0x56D5, 0x87DE, 0x56D6, 0x87DF, 0x56D8,\t0x87E0, 0x56D9, 0x87E1, 0x56DC, 0x87E2, 0x56E3, 0x87E3, 0x56E5,\n\t0x87E4, 0x56E6, 0x87E5, 0x56E7, 0x87E6, 0x56E8, 0x87E7, 0x56E9,\t0x87E8, 0x56EA, 0x87E9, 0x56EC, 0x87EA, 0x56EE, 0x87EB, 0x56EF,\n\t0x87EC, 0x56F2, 0x87ED, 0x56F3, 0x87EE, 0x56F6, 0x87EF, 0x56F7,\t0x87F0, 0x56F8, 0x87F1, 0x56FB, 0x87F2, 0x56FC, 0x87F3, 0x5700,\n\t0x87F4, 0x5701, 0x87F5, 0x5702, 0x87F6, 0x5705, 0x87F7, 0x5707,\t0x87F8, 0x570B, 0x87F9, 0x570C, 0x87FA, 0x570D, 0x87FB, 0x570E,\n\t0x87FC, 0x570F, 0x87FD, 0x5710, 0x87FE, 0x5711, 0x8840, 0x5712,\t0x8841, 0x5713, 0x8842, 0x5714, 0x8843, 0x5715, 0x8844, 0x5716,\n\t0x8845, 0x5717, 0x8846, 0x5718, 0x8847, 0x5719, 0x8848, 0x571A,\t0x8849, 0x571B, 0x884A, 0x571D, 0x884B, 0x571E, 0x884C, 0x5720,\n\t0x884D, 0x5721, 0x884E, 0x5722, 0x884F, 0x5724, 0x8850, 0x5725,\t0x8851, 0x5726, 0x8852, 0x5727, 0x8853, 0x572B, 0x8854, 0x5731,\n\t0x8855, 0x5732, 0x8856, 0x5734, 0x8857, 0x5735, 0x8858, 0x5736,\t0x8859, 0x5737, 0x885A, 0x5738, 0x885B, 0x573C, 0x885C, 0x573D,\n\t0x885D, 0x573F, 0x885E, 0x5741, 0x885F, 0x5743, 0x8860, 0x5744,\t0x8861, 0x5745, 0x8862, 0x5746, 0x8863, 0x5748, 0x8864, 0x5749,\n\t0x8865, 0x574B, 0x8866, 0x5752, 0x8867, 0x5753, 0x8868, 0x5754,\t0x8869, 0x5755, 0x886A, 0x5756, 0x886B, 0x5758, 0x886C, 0x5759,\n\t0x886D, 0x5762, 0x886E, 0x5763, 0x886F, 0x5765, 0x8870, 0x5767,\t0x8871, 0x576C, 0x8872, 0x576E, 0x8873, 0x5770, 0x8874, 0x5771,\n\t0x8875, 0x5772, 0x8876, 0x5774, 0x8877, 0x5775, 0x8878, 0x5778,\t0x8879, 0x5779, 0x887A, 0x577A, 0x887B, 0x577D, 0x887C, 0x577E,\n\t0x887D, 0x577F, 0x887E, 0x5780, 0x8880, 0x5781, 0x8881, 0x5787,\t0x8882, 0x5788, 0x8883, 0x5789, 0x8884, 0x578A, 0x8885, 0x578D,\n\t0x8886, 0x578E, 0x8887, 0x578F, 0x8888, 0x5790, 0x8889, 0x5791,\t0x888A, 0x5794, 0x888B, 0x5795, 0x888C, 0x5796, 0x888D, 0x5797,\n\t0x888E, 0x5798, 0x888F, 0x5799, 0x8890, 0x579A, 0x8891, 0x579C,\t0x8892, 0x579D, 0x8893, 0x579E, 0x8894, 0x579F, 0x8895, 0x57A5,\n\t0x8896, 0x57A8, 0x8897, 0x57AA, 0x8898, 0x57AC, 0x8899, 0x57AF,\t0x889A, 0x57B0, 0x889B, 0x57B1, 0x889C, 0x57B3, 0x889D, 0x57B5,\n\t0x889E, 0x57B6, 0x889F, 0x57B7, 0x88A0, 0x57B9, 0x88A1, 0x57BA,\t0x88A2, 0x57BB, 0x88A3, 0x57BC, 0x88A4, 0x57BD, 0x88A5, 0x57BE,\n\t0x88A6, 0x57BF, 0x88A7, 0x57C0, 0x88A8, 0x57C1, 0x88A9, 0x57C4,\t0x88AA, 0x57C5, 0x88AB, 0x57C6, 0x88AC, 0x57C7, 0x88AD, 0x57C8,\n\t0x88AE, 0x57C9, 0x88AF, 0x57CA, 0x88B0, 0x57CC, 0x88B1, 0x57CD,\t0x88B2, 0x57D0, 0x88B3, 0x57D1, 0x88B4, 0x57D3, 0x88B5, 0x57D6,\n\t0x88B6, 0x57D7, 0x88B7, 0x57DB, 0x88B8, 0x57DC, 0x88B9, 0x57DE,\t0x88BA, 0x57E1, 0x88BB, 0x57E2, 0x88BC, 0x57E3, 0x88BD, 0x57E5,\n\t0x88BE, 0x57E6, 0x88BF, 0x57E7, 0x88C0, 0x57E8, 0x88C1, 0x57E9,\t0x88C2, 0x57EA, 0x88C3, 0x57EB, 0x88C4, 0x57EC, 0x88C5, 0x57EE,\n\t0x88C6, 0x57F0, 0x88C7, 0x57F1, 0x88C8, 0x57F2, 0x88C9, 0x57F3,\t0x88CA, 0x57F5, 0x88CB, 0x57F6, 0x88CC, 0x57F7, 0x88CD, 0x57FB,\n\t0x88CE, 0x57FC, 0x88CF, 0x57FE, 0x88D0, 0x57FF, 0x88D1, 0x5801,\t0x88D2, 0x5803, 0x88D3, 0x5804, 0x88D4, 0x5805, 0x88D5, 0x5808,\n\t0x88D6, 0x5809, 0x88D7, 0x580A, 0x88D8, 0x580C, 0x88D9, 0x580E,\t0x88DA, 0x580F, 0x88DB, 0x5810, 0x88DC, 0x5812, 0x88DD, 0x5813,\n\t0x88DE, 0x5814, 0x88DF, 0x5816, 0x88E0, 0x5817, 0x88E1, 0x5818,\t0x88E2, 0x581A, 0x88E3, 0x581B, 0x88E4, 0x581C, 0x88E5, 0x581D,\n\t0x88E6, 0x581F, 0x88E7, 0x5822, 0x88E8, 0x5823, 0x88E9, 0x5825,\t0x88EA, 0x5826, 0x88EB, 0x5827, 0x88EC, 0x5828, 0x88ED, 0x5829,\n\t0x88EE, 0x582B, 0x88EF, 0x582C, 0x88F0, 0x582D, 0x88F1, 0x582E,\t0x88F2, 0x582F, 0x88F3, 0x5831, 0x88F4, 0x5832, 0x88F5, 0x5833,\n\t0x88F6, 0x5834, 0x88F7, 0x5836, 0x88F8, 0x5837, 0x88F9, 0x5838,\t0x88FA, 0x5839, 0x88FB, 0x583A, 0x88FC, 0x583B, 0x88FD, 0x583C,\n\t0x88FE, 0x583D, 0x8940, 0x583E, 0x8941, 0x583F, 0x8942, 0x5840,\t0x8943, 0x5841, 0x8944, 0x5842, 0x8945, 0x5843, 0x8946, 0x5845,\n\t0x8947, 0x5846, 0x8948, 0x5847, 0x8949, 0x5848, 0x894A, 0x5849,\t0x894B, 0x584A, 0x894C, 0x584B, 0x894D, 0x584E, 0x894E, 0x584F,\n\t0x894F, 0x5850, 0x8950, 0x5852, 0x8951, 0x5853, 0x8952, 0x5855,\t0x8953, 0x5856, 0x8954, 0x5857, 0x8955, 0x5859, 0x8956, 0x585A,\n\t0x8957, 0x585B, 0x8958, 0x585C, 0x8959, 0x585D, 0x895A, 0x585F,\t0x895B, 0x5860, 0x895C, 0x5861, 0x895D, 0x5862, 0x895E, 0x5863,\n\t0x895F, 0x5864, 0x8960, 0x5866, 0x8961, 0x5867, 0x8962, 0x5868,\t0x8963, 0x5869, 0x8964, 0x586A, 0x8965, 0x586D, 0x8966, 0x586E,\n\t0x8967, 0x586F, 0x8968, 0x5870, 0x8969, 0x5871, 0x896A, 0x5872,\t0x896B, 0x5873, 0x896C, 0x5874, 0x896D, 0x5875, 0x896E, 0x5876,\n\t0x896F, 0x5877, 0x8970, 0x5878, 0x8971, 0x5879, 0x8972, 0x587A,\t0x8973, 0x587B, 0x8974, 0x587C, 0x8975, 0x587D, 0x8976, 0x587F,\n\t0x8977, 0x5882, 0x8978, 0x5884, 0x8979, 0x5886, 0x897A, 0x5887,\t0x897B, 0x5888, 0x897C, 0x588A, 0x897D, 0x588B, 0x897E, 0x588C,\n\t0x8980, 0x588D, 0x8981, 0x588E, 0x8982, 0x588F, 0x8983, 0x5890,\t0x8984, 0x5891, 0x8985, 0x5894, 0x8986, 0x5895, 0x8987, 0x5896,\n\t0x8988, 0x5897, 0x8989, 0x5898, 0x898A, 0x589B, 0x898B, 0x589C,\t0x898C, 0x589D, 0x898D, 0x58A0, 0x898E, 0x58A1, 0x898F, 0x58A2,\n\t0x8990, 0x58A3, 0x8991, 0x58A4, 0x8992, 0x58A5, 0x8993, 0x58A6,\t0x8994, 0x58A7, 0x8995, 0x58AA, 0x8996, 0x58AB, 0x8997, 0x58AC,\n\t0x8998, 0x58AD, 0x8999, 0x58AE, 0x899A, 0x58AF, 0x899B, 0x58B0,\t0x899C, 0x58B1, 0x899D, 0x58B2, 0x899E, 0x58B3, 0x899F, 0x58B4,\n\t0x89A0, 0x58B5, 0x89A1, 0x58B6, 0x89A2, 0x58B7, 0x89A3, 0x58B8,\t0x89A4, 0x58B9, 0x89A5, 0x58BA, 0x89A6, 0x58BB, 0x89A7, 0x58BD,\n\t0x89A8, 0x58BE, 0x89A9, 0x58BF, 0x89AA, 0x58C0, 0x89AB, 0x58C2,\t0x89AC, 0x58C3, 0x89AD, 0x58C4, 0x89AE, 0x58C6, 0x89AF, 0x58C7,\n\t0x89B0, 0x58C8, 0x89B1, 0x58C9, 0x89B2, 0x58CA, 0x89B3, 0x58CB,\t0x89B4, 0x58CC, 0x89B5, 0x58CD, 0x89B6, 0x58CE, 0x89B7, 0x58CF,\n\t0x89B8, 0x58D0, 0x89B9, 0x58D2, 0x89BA, 0x58D3, 0x89BB, 0x58D4,\t0x89BC, 0x58D6, 0x89BD, 0x58D7, 0x89BE, 0x58D8, 0x89BF, 0x58D9,\n\t0x89C0, 0x58DA, 0x89C1, 0x58DB, 0x89C2, 0x58DC, 0x89C3, 0x58DD,\t0x89C4, 0x58DE, 0x89C5, 0x58DF, 0x89C6, 0x58E0, 0x89C7, 0x58E1,\n\t0x89C8, 0x58E2, 0x89C9, 0x58E3, 0x89CA, 0x58E5, 0x89CB, 0x58E6,\t0x89CC, 0x58E7, 0x89CD, 0x58E8, 0x89CE, 0x58E9, 0x89CF, 0x58EA,\n\t0x89D0, 0x58ED, 0x89D1, 0x58EF, 0x89D2, 0x58F1, 0x89D3, 0x58F2,\t0x89D4, 0x58F4, 0x89D5, 0x58F5, 0x89D6, 0x58F7, 0x89D7, 0x58F8,\n\t0x89D8, 0x58FA, 0x89D9, 0x58FB, 0x89DA, 0x58FC, 0x89DB, 0x58FD,\t0x89DC, 0x58FE, 0x89DD, 0x58FF, 0x89DE, 0x5900, 0x89DF, 0x5901,\n\t0x89E0, 0x5903, 0x89E1, 0x5905, 0x89E2, 0x5906, 0x89E3, 0x5908,\t0x89E4, 0x5909, 0x89E5, 0x590A, 0x89E6, 0x590B, 0x89E7, 0x590C,\n\t0x89E8, 0x590E, 0x89E9, 0x5910, 0x89EA, 0x5911, 0x89EB, 0x5912,\t0x89EC, 0x5913, 0x89ED, 0x5917, 0x89EE, 0x5918, 0x89EF, 0x591B,\n\t0x89F0, 0x591D, 0x89F1, 0x591E, 0x89F2, 0x5920, 0x89F3, 0x5921,\t0x89F4, 0x5922, 0x89F5, 0x5923, 0x89F6, 0x5926, 0x89F7, 0x5928,\n\t0x89F8, 0x592C, 0x89F9, 0x5930, 0x89FA, 0x5932, 0x89FB, 0x5933,\t0x89FC, 0x5935, 0x89FD, 0x5936, 0x89FE, 0x593B, 0x8A40, 0x593D,\n\t0x8A41, 0x593E, 0x8A42, 0x593F, 0x8A43, 0x5940, 0x8A44, 0x5943,\t0x8A45, 0x5945, 0x8A46, 0x5946, 0x8A47, 0x594A, 0x8A48, 0x594C,\n\t0x8A49, 0x594D, 0x8A4A, 0x5950, 0x8A4B, 0x5952, 0x8A4C, 0x5953,\t0x8A4D, 0x5959, 0x8A4E, 0x595B, 0x8A4F, 0x595C, 0x8A50, 0x595D,\n\t0x8A51, 0x595E, 0x8A52, 0x595F, 0x8A53, 0x5961, 0x8A54, 0x5963,\t0x8A55, 0x5964, 0x8A56, 0x5966, 0x8A57, 0x5967, 0x8A58, 0x5968,\n\t0x8A59, 0x5969, 0x8A5A, 0x596A, 0x8A5B, 0x596B, 0x8A5C, 0x596C,\t0x8A5D, 0x596D, 0x8A5E, 0x596E, 0x8A5F, 0x596F, 0x8A60, 0x5970,\n\t0x8A61, 0x5971, 0x8A62, 0x5972, 0x8A63, 0x5975, 0x8A64, 0x5977,\t0x8A65, 0x597A, 0x8A66, 0x597B, 0x8A67, 0x597C, 0x8A68, 0x597E,\n\t0x8A69, 0x597F, 0x8A6A, 0x5980, 0x8A6B, 0x5985, 0x8A6C, 0x5989,\t0x8A6D, 0x598B, 0x8A6E, 0x598C, 0x8A6F, 0x598E, 0x8A70, 0x598F,\n\t0x8A71, 0x5990, 0x8A72, 0x5991, 0x8A73, 0x5994, 0x8A74, 0x5995,\t0x8A75, 0x5998, 0x8A76, 0x599A, 0x8A77, 0x599B, 0x8A78, 0x599C,\n\t0x8A79, 0x599D, 0x8A7A, 0x599F, 0x8A7B, 0x59A0, 0x8A7C, 0x59A1,\t0x8A7D, 0x59A2, 0x8A7E, 0x59A6, 0x8A80, 0x59A7, 0x8A81, 0x59AC,\n\t0x8A82, 0x59AD, 0x8A83, 0x59B0, 0x8A84, 0x59B1, 0x8A85, 0x59B3,\t0x8A86, 0x59B4, 0x8A87, 0x59B5, 0x8A88, 0x59B6, 0x8A89, 0x59B7,\n\t0x8A8A, 0x59B8, 0x8A8B, 0x59BA, 0x8A8C, 0x59BC, 0x8A8D, 0x59BD,\t0x8A8E, 0x59BF, 0x8A8F, 0x59C0, 0x8A90, 0x59C1, 0x8A91, 0x59C2,\n\t0x8A92, 0x59C3, 0x8A93, 0x59C4, 0x8A94, 0x59C5, 0x8A95, 0x59C7,\t0x8A96, 0x59C8, 0x8A97, 0x59C9, 0x8A98, 0x59CC, 0x8A99, 0x59CD,\n\t0x8A9A, 0x59CE, 0x8A9B, 0x59CF, 0x8A9C, 0x59D5, 0x8A9D, 0x59D6,\t0x8A9E, 0x59D9, 0x8A9F, 0x59DB, 0x8AA0, 0x59DE, 0x8AA1, 0x59DF,\n\t0x8AA2, 0x59E0, 0x8AA3, 0x59E1, 0x8AA4, 0x59E2, 0x8AA5, 0x59E4,\t0x8AA6, 0x59E6, 0x8AA7, 0x59E7, 0x8AA8, 0x59E9, 0x8AA9, 0x59EA,\n\t0x8AAA, 0x59EB, 0x8AAB, 0x59ED, 0x8AAC, 0x59EE, 0x8AAD, 0x59EF,\t0x8AAE, 0x59F0, 0x8AAF, 0x59F1, 0x8AB0, 0x59F2, 0x8AB1, 0x59F3,\n\t0x8AB2, 0x59F4, 0x8AB3, 0x59F5, 0x8AB4, 0x59F6, 0x8AB5, 0x59F7,\t0x8AB6, 0x59F8, 0x8AB7, 0x59FA, 0x8AB8, 0x59FC, 0x8AB9, 0x59FD,\n\t0x8ABA, 0x59FE, 0x8ABB, 0x5A00, 0x8ABC, 0x5A02, 0x8ABD, 0x5A0A,\t0x8ABE, 0x5A0B, 0x8ABF, 0x5A0D, 0x8AC0, 0x5A0E, 0x8AC1, 0x5A0F,\n\t0x8AC2, 0x5A10, 0x8AC3, 0x5A12, 0x8AC4, 0x5A14, 0x8AC5, 0x5A15,\t0x8AC6, 0x5A16, 0x8AC7, 0x5A17, 0x8AC8, 0x5A19, 0x8AC9, 0x5A1A,\n\t0x8ACA, 0x5A1B, 0x8ACB, 0x5A1D, 0x8ACC, 0x5A1E, 0x8ACD, 0x5A21,\t0x8ACE, 0x5A22, 0x8ACF, 0x5A24, 0x8AD0, 0x5A26, 0x8AD1, 0x5A27,\n\t0x8AD2, 0x5A28, 0x8AD3, 0x5A2A, 0x8AD4, 0x5A2B, 0x8AD5, 0x5A2C,\t0x8AD6, 0x5A2D, 0x8AD7, 0x5A2E, 0x8AD8, 0x5A2F, 0x8AD9, 0x5A30,\n\t0x8ADA, 0x5A33, 0x8ADB, 0x5A35, 0x8ADC, 0x5A37, 0x8ADD, 0x5A38,\t0x8ADE, 0x5A39, 0x8ADF, 0x5A3A, 0x8AE0, 0x5A3B, 0x8AE1, 0x5A3D,\n\t0x8AE2, 0x5A3E, 0x8AE3, 0x5A3F, 0x8AE4, 0x5A41, 0x8AE5, 0x5A42,\t0x8AE6, 0x5A43, 0x8AE7, 0x5A44, 0x8AE8, 0x5A45, 0x8AE9, 0x5A47,\n\t0x8AEA, 0x5A48, 0x8AEB, 0x5A4B, 0x8AEC, 0x5A4C, 0x8AED, 0x5A4D,\t0x8AEE, 0x5A4E, 0x8AEF, 0x5A4F, 0x8AF0, 0x5A50, 0x8AF1, 0x5A51,\n\t0x8AF2, 0x5A52, 0x8AF3, 0x5A53, 0x8AF4, 0x5A54, 0x8AF5, 0x5A56,\t0x8AF6, 0x5A57, 0x8AF7, 0x5A58, 0x8AF8, 0x5A59, 0x8AF9, 0x5A5B,\n\t0x8AFA, 0x5A5C, 0x8AFB, 0x5A5D, 0x8AFC, 0x5A5E, 0x8AFD, 0x5A5F,\t0x8AFE, 0x5A60, 0x8B40, 0x5A61, 0x8B41, 0x5A63, 0x8B42, 0x5A64,\n\t0x8B43, 0x5A65, 0x8B44, 0x5A66, 0x8B45, 0x5A68, 0x8B46, 0x5A69,\t0x8B47, 0x5A6B, 0x8B48, 0x5A6C, 0x8B49, 0x5A6D, 0x8B4A, 0x5A6E,\n\t0x8B4B, 0x5A6F, 0x8B4C, 0x5A70, 0x8B4D, 0x5A71, 0x8B4E, 0x5A72,\t0x8B4F, 0x5A73, 0x8B50, 0x5A78, 0x8B51, 0x5A79, 0x8B52, 0x5A7B,\n\t0x8B53, 0x5A7C, 0x8B54, 0x5A7D, 0x8B55, 0x5A7E, 0x8B56, 0x5A80,\t0x8B57, 0x5A81, 0x8B58, 0x5A82, 0x8B59, 0x5A83, 0x8B5A, 0x5A84,\n\t0x8B5B, 0x5A85, 0x8B5C, 0x5A86, 0x8B5D, 0x5A87, 0x8B5E, 0x5A88,\t0x8B5F, 0x5A89, 0x8B60, 0x5A8A, 0x8B61, 0x5A8B, 0x8B62, 0x5A8C,\n\t0x8B63, 0x5A8D, 0x8B64, 0x5A8E, 0x8B65, 0x5A8F, 0x8B66, 0x5A90,\t0x8B67, 0x5A91, 0x8B68, 0x5A93, 0x8B69, 0x5A94, 0x8B6A, 0x5A95,\n\t0x8B6B, 0x5A96, 0x8B6C, 0x5A97, 0x8B6D, 0x5A98, 0x8B6E, 0x5A99,\t0x8B6F, 0x5A9C, 0x8B70, 0x5A9D, 0x8B71, 0x5A9E, 0x8B72, 0x5A9F,\n\t0x8B73, 0x5AA0, 0x8B74, 0x5AA1, 0x8B75, 0x5AA2, 0x8B76, 0x5AA3,\t0x8B77, 0x5AA4, 0x8B78, 0x5AA5, 0x8B79, 0x5AA6, 0x8B7A, 0x5AA7,\n\t0x8B7B, 0x5AA8, 0x8B7C, 0x5AA9, 0x8B7D, 0x5AAB, 0x8B7E, 0x5AAC,\t0x8B80, 0x5AAD, 0x8B81, 0x5AAE, 0x8B82, 0x5AAF, 0x8B83, 0x5AB0,\n\t0x8B84, 0x5AB1, 0x8B85, 0x5AB4, 0x8B86, 0x5AB6, 0x8B87, 0x5AB7,\t0x8B88, 0x5AB9, 0x8B89, 0x5ABA, 0x8B8A, 0x5ABB, 0x8B8B, 0x5ABC,\n\t0x8B8C, 0x5ABD, 0x8B8D, 0x5ABF, 0x8B8E, 0x5AC0, 0x8B8F, 0x5AC3,\t0x8B90, 0x5AC4, 0x8B91, 0x5AC5, 0x8B92, 0x5AC6, 0x8B93, 0x5AC7,\n\t0x8B94, 0x5AC8, 0x8B95, 0x5ACA, 0x8B96, 0x5ACB, 0x8B97, 0x5ACD,\t0x8B98, 0x5ACE, 0x8B99, 0x5ACF, 0x8B9A, 0x5AD0, 0x8B9B, 0x5AD1,\n\t0x8B9C, 0x5AD3, 0x8B9D, 0x5AD5, 0x8B9E, 0x5AD7, 0x8B9F, 0x5AD9,\t0x8BA0, 0x5ADA, 0x8BA1, 0x5ADB, 0x8BA2, 0x5ADD, 0x8BA3, 0x5ADE,\n\t0x8BA4, 0x5ADF, 0x8BA5, 0x5AE2, 0x8BA6, 0x5AE4, 0x8BA7, 0x5AE5,\t0x8BA8, 0x5AE7, 0x8BA9, 0x5AE8, 0x8BAA, 0x5AEA, 0x8BAB, 0x5AEC,\n\t0x8BAC, 0x5AED, 0x8BAD, 0x5AEE, 0x8BAE, 0x5AEF, 0x8BAF, 0x5AF0,\t0x8BB0, 0x5AF2, 0x8BB1, 0x5AF3, 0x8BB2, 0x5AF4, 0x8BB3, 0x5AF5,\n\t0x8BB4, 0x5AF6, 0x8BB5, 0x5AF7, 0x8BB6, 0x5AF8, 0x8BB7, 0x5AF9,\t0x8BB8, 0x5AFA, 0x8BB9, 0x5AFB, 0x8BBA, 0x5AFC, 0x8BBB, 0x5AFD,\n\t0x8BBC, 0x5AFE, 0x8BBD, 0x5AFF, 0x8BBE, 0x5B00, 0x8BBF, 0x5B01,\t0x8BC0, 0x5B02, 0x8BC1, 0x5B03, 0x8BC2, 0x5B04, 0x8BC3, 0x5B05,\n\t0x8BC4, 0x5B06, 0x8BC5, 0x5B07, 0x8BC6, 0x5B08, 0x8BC7, 0x5B0A,\t0x8BC8, 0x5B0B, 0x8BC9, 0x5B0C, 0x8BCA, 0x5B0D, 0x8BCB, 0x5B0E,\n\t0x8BCC, 0x5B0F, 0x8BCD, 0x5B10, 0x8BCE, 0x5B11, 0x8BCF, 0x5B12,\t0x8BD0, 0x5B13, 0x8BD1, 0x5B14, 0x8BD2, 0x5B15, 0x8BD3, 0x5B18,\n\t0x8BD4, 0x5B19, 0x8BD5, 0x5B1A, 0x8BD6, 0x5B1B, 0x8BD7, 0x5B1C,\t0x8BD8, 0x5B1D, 0x8BD9, 0x5B1E, 0x8BDA, 0x5B1F, 0x8BDB, 0x5B20,\n\t0x8BDC, 0x5B21, 0x8BDD, 0x5B22, 0x8BDE, 0x5B23, 0x8BDF, 0x5B24,\t0x8BE0, 0x5B25, 0x8BE1, 0x5B26, 0x8BE2, 0x5B27, 0x8BE3, 0x5B28,\n\t0x8BE4, 0x5B29, 0x8BE5, 0x5B2A, 0x8BE6, 0x5B2B, 0x8BE7, 0x5B2C,\t0x8BE8, 0x5B2D, 0x8BE9, 0x5B2E, 0x8BEA, 0x5B2F, 0x8BEB, 0x5B30,\n\t0x8BEC, 0x5B31, 0x8BED, 0x5B33, 0x8BEE, 0x5B35, 0x8BEF, 0x5B36,\t0x8BF0, 0x5B38, 0x8BF1, 0x5B39, 0x8BF2, 0x5B3A, 0x8BF3, 0x5B3B,\n\t0x8BF4, 0x5B3C, 0x8BF5, 0x5B3D, 0x8BF6, 0x5B3E, 0x8BF7, 0x5B3F,\t0x8BF8, 0x5B41, 0x8BF9, 0x5B42, 0x8BFA, 0x5B43, 0x8BFB, 0x5B44,\n\t0x8BFC, 0x5B45, 0x8BFD, 0x5B46, 0x8BFE, 0x5B47, 0x8C40, 0x5B48,\t0x8C41, 0x5B49, 0x8C42, 0x5B4A, 0x8C43, 0x5B4B, 0x8C44, 0x5B4C,\n\t0x8C45, 0x5B4D, 0x8C46, 0x5B4E, 0x8C47, 0x5B4F, 0x8C48, 0x5B52,\t0x8C49, 0x5B56, 0x8C4A, 0x5B5E, 0x8C4B, 0x5B60, 0x8C4C, 0x5B61,\n\t0x8C4D, 0x5B67, 0x8C4E, 0x5B68, 0x8C4F, 0x5B6B, 0x8C50, 0x5B6D,\t0x8C51, 0x5B6E, 0x8C52, 0x5B6F, 0x8C53, 0x5B72, 0x8C54, 0x5B74,\n\t0x8C55, 0x5B76, 0x8C56, 0x5B77, 0x8C57, 0x5B78, 0x8C58, 0x5B79,\t0x8C59, 0x5B7B, 0x8C5A, 0x5B7C, 0x8C5B, 0x5B7E, 0x8C5C, 0x5B7F,\n\t0x8C5D, 0x5B82, 0x8C5E, 0x5B86, 0x8C5F, 0x5B8A, 0x8C60, 0x5B8D,\t0x8C61, 0x5B8E, 0x8C62, 0x5B90, 0x8C63, 0x5B91, 0x8C64, 0x5B92,\n\t0x8C65, 0x5B94, 0x8C66, 0x5B96, 0x8C67, 0x5B9F, 0x8C68, 0x5BA7,\t0x8C69, 0x5BA8, 0x8C6A, 0x5BA9, 0x8C6B, 0x5BAC, 0x8C6C, 0x5BAD,\n\t0x8C6D, 0x5BAE, 0x8C6E, 0x5BAF, 0x8C6F, 0x5BB1, 0x8C70, 0x5BB2,\t0x8C71, 0x5BB7, 0x8C72, 0x5BBA, 0x8C73, 0x5BBB, 0x8C74, 0x5BBC,\n\t0x8C75, 0x5BC0, 0x8C76, 0x5BC1, 0x8C77, 0x5BC3, 0x8C78, 0x5BC8,\t0x8C79, 0x5BC9, 0x8C7A, 0x5BCA, 0x8C7B, 0x5BCB, 0x8C7C, 0x5BCD,\n\t0x8C7D, 0x5BCE, 0x8C7E, 0x5BCF, 0x8C80, 0x5BD1, 0x8C81, 0x5BD4,\t0x8C82, 0x5BD5, 0x8C83, 0x5BD6, 0x8C84, 0x5BD7, 0x8C85, 0x5BD8,\n\t0x8C86, 0x5BD9, 0x8C87, 0x5BDA, 0x8C88, 0x5BDB, 0x8C89, 0x5BDC,\t0x8C8A, 0x5BE0, 0x8C8B, 0x5BE2, 0x8C8C, 0x5BE3, 0x8C8D, 0x5BE6,\n\t0x8C8E, 0x5BE7, 0x8C8F, 0x5BE9, 0x8C90, 0x5BEA, 0x8C91, 0x5BEB,\t0x8C92, 0x5BEC, 0x8C93, 0x5BED, 0x8C94, 0x5BEF, 0x8C95, 0x5BF1,\n\t0x8C96, 0x5BF2, 0x8C97, 0x5BF3, 0x8C98, 0x5BF4, 0x8C99, 0x5BF5,\t0x8C9A, 0x5BF6, 0x8C9B, 0x5BF7, 0x8C9C, 0x5BFD, 0x8C9D, 0x5BFE,\n\t0x8C9E, 0x5C00, 0x8C9F, 0x5C02, 0x8CA0, 0x5C03, 0x8CA1, 0x5C05,\t0x8CA2, 0x5C07, 0x8CA3, 0x5C08, 0x8CA4, 0x5C0B, 0x8CA5, 0x5C0C,\n\t0x8CA6, 0x5C0D, 0x8CA7, 0x5C0E, 0x8CA8, 0x5C10, 0x8CA9, 0x5C12,\t0x8CAA, 0x5C13, 0x8CAB, 0x5C17, 0x8CAC, 0x5C19, 0x8CAD, 0x5C1B,\n\t0x8CAE, 0x5C1E, 0x8CAF, 0x5C1F, 0x8CB0, 0x5C20, 0x8CB1, 0x5C21,\t0x8CB2, 0x5C23, 0x8CB3, 0x5C26, 0x8CB4, 0x5C28, 0x8CB5, 0x5C29,\n\t0x8CB6, 0x5C2A, 0x8CB7, 0x5C2B, 0x8CB8, 0x5C2D, 0x8CB9, 0x5C2E,\t0x8CBA, 0x5C2F, 0x8CBB, 0x5C30, 0x8CBC, 0x5C32, 0x8CBD, 0x5C33,\n\t0x8CBE, 0x5C35, 0x8CBF, 0x5C36, 0x8CC0, 0x5C37, 0x8CC1, 0x5C43,\t0x8CC2, 0x5C44, 0x8CC3, 0x5C46, 0x8CC4, 0x5C47, 0x8CC5, 0x5C4C,\n\t0x8CC6, 0x5C4D, 0x8CC7, 0x5C52, 0x8CC8, 0x5C53, 0x8CC9, 0x5C54,\t0x8CCA, 0x5C56, 0x8CCB, 0x5C57, 0x8CCC, 0x5C58, 0x8CCD, 0x5C5A,\n\t0x8CCE, 0x5C5B, 0x8CCF, 0x5C5C, 0x8CD0, 0x5C5D, 0x8CD1, 0x5C5F,\t0x8CD2, 0x5C62, 0x8CD3, 0x5C64, 0x8CD4, 0x5C67, 0x8CD5, 0x5C68,\n\t0x8CD6, 0x5C69, 0x8CD7, 0x5C6A, 0x8CD8, 0x5C6B, 0x8CD9, 0x5C6C,\t0x8CDA, 0x5C6D, 0x8CDB, 0x5C70, 0x8CDC, 0x5C72, 0x8CDD, 0x5C73,\n\t0x8CDE, 0x5C74, 0x8CDF, 0x5C75, 0x8CE0, 0x5C76, 0x8CE1, 0x5C77,\t0x8CE2, 0x5C78, 0x8CE3, 0x5C7B, 0x8CE4, 0x5C7C, 0x8CE5, 0x5C7D,\n\t0x8CE6, 0x5C7E, 0x8CE7, 0x5C80, 0x8CE8, 0x5C83, 0x8CE9, 0x5C84,\t0x8CEA, 0x5C85, 0x8CEB, 0x5C86, 0x8CEC, 0x5C87, 0x8CED, 0x5C89,\n\t0x8CEE, 0x5C8A, 0x8CEF, 0x5C8B, 0x8CF0, 0x5C8E, 0x8CF1, 0x5C8F,\t0x8CF2, 0x5C92, 0x8CF3, 0x5C93, 0x8CF4, 0x5C95, 0x8CF5, 0x5C9D,\n\t0x8CF6, 0x5C9E, 0x8CF7, 0x5C9F, 0x8CF8, 0x5CA0, 0x8CF9, 0x5CA1,\t0x8CFA, 0x5CA4, 0x8CFB, 0x5CA5, 0x8CFC, 0x5CA6, 0x8CFD, 0x5CA7,\n\t0x8CFE, 0x5CA8, 0x8D40, 0x5CAA, 0x8D41, 0x5CAE, 0x8D42, 0x5CAF,\t0x8D43, 0x5CB0, 0x8D44, 0x5CB2, 0x8D45, 0x5CB4, 0x8D46, 0x5CB6,\n\t0x8D47, 0x5CB9, 0x8D48, 0x5CBA, 0x8D49, 0x5CBB, 0x8D4A, 0x5CBC,\t0x8D4B, 0x5CBE, 0x8D4C, 0x5CC0, 0x8D4D, 0x5CC2, 0x8D4E, 0x5CC3,\n\t0x8D4F, 0x5CC5, 0x8D50, 0x5CC6, 0x8D51, 0x5CC7, 0x8D52, 0x5CC8,\t0x8D53, 0x5CC9, 0x8D54, 0x5CCA, 0x8D55, 0x5CCC, 0x8D56, 0x5CCD,\n\t0x8D57, 0x5CCE, 0x8D58, 0x5CCF, 0x8D59, 0x5CD0, 0x8D5A, 0x5CD1,\t0x8D5B, 0x5CD3, 0x8D5C, 0x5CD4, 0x8D5D, 0x5CD5, 0x8D5E, 0x5CD6,\n\t0x8D5F, 0x5CD7, 0x8D60, 0x5CD8, 0x8D61, 0x5CDA, 0x8D62, 0x5CDB,\t0x8D63, 0x5CDC, 0x8D64, 0x5CDD, 0x8D65, 0x5CDE, 0x8D66, 0x5CDF,\n\t0x8D67, 0x5CE0, 0x8D68, 0x5CE2, 0x8D69, 0x5CE3, 0x8D6A, 0x5CE7,\t0x8D6B, 0x5CE9, 0x8D6C, 0x5CEB, 0x8D6D, 0x5CEC, 0x8D6E, 0x5CEE,\n\t0x8D6F, 0x5CEF, 0x8D70, 0x5CF1, 0x8D71, 0x5CF2, 0x8D72, 0x5CF3,\t0x8D73, 0x5CF4, 0x8D74, 0x5CF5, 0x8D75, 0x5CF6, 0x8D76, 0x5CF7,\n\t0x8D77, 0x5CF8, 0x8D78, 0x5CF9, 0x8D79, 0x5CFA, 0x8D7A, 0x5CFC,\t0x8D7B, 0x5CFD, 0x8D7C, 0x5CFE, 0x8D7D, 0x5CFF, 0x8D7E, 0x5D00,\n\t0x8D80, 0x5D01, 0x8D81, 0x5D04, 0x8D82, 0x5D05, 0x8D83, 0x5D08,\t0x8D84, 0x5D09, 0x8D85, 0x5D0A, 0x8D86, 0x5D0B, 0x8D87, 0x5D0C,\n\t0x8D88, 0x5D0D, 0x8D89, 0x5D0F, 0x8D8A, 0x5D10, 0x8D8B, 0x5D11,\t0x8D8C, 0x5D12, 0x8D8D, 0x5D13, 0x8D8E, 0x5D15, 0x8D8F, 0x5D17,\n\t0x8D90, 0x5D18, 0x8D91, 0x5D19, 0x8D92, 0x5D1A, 0x8D93, 0x5D1C,\t0x8D94, 0x5D1D, 0x8D95, 0x5D1F, 0x8D96, 0x5D20, 0x8D97, 0x5D21,\n\t0x8D98, 0x5D22, 0x8D99, 0x5D23, 0x8D9A, 0x5D25, 0x8D9B, 0x5D28,\t0x8D9C, 0x5D2A, 0x8D9D, 0x5D2B, 0x8D9E, 0x5D2C, 0x8D9F, 0x5D2F,\n\t0x8DA0, 0x5D30, 0x8DA1, 0x5D31, 0x8DA2, 0x5D32, 0x8DA3, 0x5D33,\t0x8DA4, 0x5D35, 0x8DA5, 0x5D36, 0x8DA6, 0x5D37, 0x8DA7, 0x5D38,\n\t0x8DA8, 0x5D39, 0x8DA9, 0x5D3A, 0x8DAA, 0x5D3B, 0x8DAB, 0x5D3C,\t0x8DAC, 0x5D3F, 0x8DAD, 0x5D40, 0x8DAE, 0x5D41, 0x8DAF, 0x5D42,\n\t0x8DB0, 0x5D43, 0x8DB1, 0x5D44, 0x8DB2, 0x5D45, 0x8DB3, 0x5D46,\t0x8DB4, 0x5D48, 0x8DB5, 0x5D49, 0x8DB6, 0x5D4D, 0x8DB7, 0x5D4E,\n\t0x8DB8, 0x5D4F, 0x8DB9, 0x5D50, 0x8DBA, 0x5D51, 0x8DBB, 0x5D52,\t0x8DBC, 0x5D53, 0x8DBD, 0x5D54, 0x8DBE, 0x5D55, 0x8DBF, 0x5D56,\n\t0x8DC0, 0x5D57, 0x8DC1, 0x5D59, 0x8DC2, 0x5D5A, 0x8DC3, 0x5D5C,\t0x8DC4, 0x5D5E, 0x8DC5, 0x5D5F, 0x8DC6, 0x5D60, 0x8DC7, 0x5D61,\n\t0x8DC8, 0x5D62, 0x8DC9, 0x5D63, 0x8DCA, 0x5D64, 0x8DCB, 0x5D65,\t0x8DCC, 0x5D66, 0x8DCD, 0x5D67, 0x8DCE, 0x5D68, 0x8DCF, 0x5D6A,\n\t0x8DD0, 0x5D6D, 0x8DD1, 0x5D6E, 0x8DD2, 0x5D70, 0x8DD3, 0x5D71,\t0x8DD4, 0x5D72, 0x8DD5, 0x5D73, 0x8DD6, 0x5D75, 0x8DD7, 0x5D76,\n\t0x8DD8, 0x5D77, 0x8DD9, 0x5D78, 0x8DDA, 0x5D79, 0x8DDB, 0x5D7A,\t0x8DDC, 0x5D7B, 0x8DDD, 0x5D7C, 0x8DDE, 0x5D7D, 0x8DDF, 0x5D7E,\n\t0x8DE0, 0x5D7F, 0x8DE1, 0x5D80, 0x8DE2, 0x5D81, 0x8DE3, 0x5D83,\t0x8DE4, 0x5D84, 0x8DE5, 0x5D85, 0x8DE6, 0x5D86, 0x8DE7, 0x5D87,\n\t0x8DE8, 0x5D88, 0x8DE9, 0x5D89, 0x8DEA, 0x5D8A, 0x8DEB, 0x5D8B,\t0x8DEC, 0x5D8C, 0x8DED, 0x5D8D, 0x8DEE, 0x5D8E, 0x8DEF, 0x5D8F,\n\t0x8DF0, 0x5D90, 0x8DF1, 0x5D91, 0x8DF2, 0x5D92, 0x8DF3, 0x5D93,\t0x8DF4, 0x5D94, 0x8DF5, 0x5D95, 0x8DF6, 0x5D96, 0x8DF7, 0x5D97,\n\t0x8DF8, 0x5D98, 0x8DF9, 0x5D9A, 0x8DFA, 0x5D9B, 0x8DFB, 0x5D9C,\t0x8DFC, 0x5D9E, 0x8DFD, 0x5D9F, 0x8DFE, 0x5DA0, 0x8E40, 0x5DA1,\n\t0x8E41, 0x5DA2, 0x8E42, 0x5DA3, 0x8E43, 0x5DA4, 0x8E44, 0x5DA5,\t0x8E45, 0x5DA6, 0x8E46, 0x5DA7, 0x8E47, 0x5DA8, 0x8E48, 0x5DA9,\n\t0x8E49, 0x5DAA, 0x8E4A, 0x5DAB, 0x8E4B, 0x5DAC, 0x8E4C, 0x5DAD,\t0x8E4D, 0x5DAE, 0x8E4E, 0x5DAF, 0x8E4F, 0x5DB0, 0x8E50, 0x5DB1,\n\t0x8E51, 0x5DB2, 0x8E52, 0x5DB3, 0x8E53, 0x5DB4, 0x8E54, 0x5DB5,\t0x8E55, 0x5DB6, 0x8E56, 0x5DB8, 0x8E57, 0x5DB9, 0x8E58, 0x5DBA,\n\t0x8E59, 0x5DBB, 0x8E5A, 0x5DBC, 0x8E5B, 0x5DBD, 0x8E5C, 0x5DBE,\t0x8E5D, 0x5DBF, 0x8E5E, 0x5DC0, 0x8E5F, 0x5DC1, 0x8E60, 0x5DC2,\n\t0x8E61, 0x5DC3, 0x8E62, 0x5DC4, 0x8E63, 0x5DC6, 0x8E64, 0x5DC7,\t0x8E65, 0x5DC8, 0x8E66, 0x5DC9, 0x8E67, 0x5DCA, 0x8E68, 0x5DCB,\n\t0x8E69, 0x5DCC, 0x8E6A, 0x5DCE, 0x8E6B, 0x5DCF, 0x8E6C, 0x5DD0,\t0x8E6D, 0x5DD1, 0x8E6E, 0x5DD2, 0x8E6F, 0x5DD3, 0x8E70, 0x5DD4,\n\t0x8E71, 0x5DD5, 0x8E72, 0x5DD6, 0x8E73, 0x5DD7, 0x8E74, 0x5DD8,\t0x8E75, 0x5DD9, 0x8E76, 0x5DDA, 0x8E77, 0x5DDC, 0x8E78, 0x5DDF,\n\t0x8E79, 0x5DE0, 0x8E7A, 0x5DE3, 0x8E7B, 0x5DE4, 0x8E7C, 0x5DEA,\t0x8E7D, 0x5DEC, 0x8E7E, 0x5DED, 0x8E80, 0x5DF0, 0x8E81, 0x5DF5,\n\t0x8E82, 0x5DF6, 0x8E83, 0x5DF8, 0x8E84, 0x5DF9, 0x8E85, 0x5DFA,\t0x8E86, 0x5DFB, 0x8E87, 0x5DFC, 0x8E88, 0x5DFF, 0x8E89, 0x5E00,\n\t0x8E8A, 0x5E04, 0x8E8B, 0x5E07, 0x8E8C, 0x5E09, 0x8E8D, 0x5E0A,\t0x8E8E, 0x5E0B, 0x8E8F, 0x5E0D, 0x8E90, 0x5E0E, 0x8E91, 0x5E12,\n\t0x8E92, 0x5E13, 0x8E93, 0x5E17, 0x8E94, 0x5E1E, 0x8E95, 0x5E1F,\t0x8E96, 0x5E20, 0x8E97, 0x5E21, 0x8E98, 0x5E22, 0x8E99, 0x5E23,\n\t0x8E9A, 0x5E24, 0x8E9B, 0x5E25, 0x8E9C, 0x5E28, 0x8E9D, 0x5E29,\t0x8E9E, 0x5E2A, 0x8E9F, 0x5E2B, 0x8EA0, 0x5E2C, 0x8EA1, 0x5E2F,\n\t0x8EA2, 0x5E30, 0x8EA3, 0x5E32, 0x8EA4, 0x5E33, 0x8EA5, 0x5E34,\t0x8EA6, 0x5E35, 0x8EA7, 0x5E36, 0x8EA8, 0x5E39, 0x8EA9, 0x5E3A,\n\t0x8EAA, 0x5E3E, 0x8EAB, 0x5E3F, 0x8EAC, 0x5E40, 0x8EAD, 0x5E41,\t0x8EAE, 0x5E43, 0x8EAF, 0x5E46, 0x8EB0, 0x5E47, 0x8EB1, 0x5E48,\n\t0x8EB2, 0x5E49, 0x8EB3, 0x5E4A, 0x8EB4, 0x5E4B, 0x8EB5, 0x5E4D,\t0x8EB6, 0x5E4E, 0x8EB7, 0x5E4F, 0x8EB8, 0x5E50, 0x8EB9, 0x5E51,\n\t0x8EBA, 0x5E52, 0x8EBB, 0x5E53, 0x8EBC, 0x5E56, 0x8EBD, 0x5E57,\t0x8EBE, 0x5E58, 0x8EBF, 0x5E59, 0x8EC0, 0x5E5A, 0x8EC1, 0x5E5C,\n\t0x8EC2, 0x5E5D, 0x8EC3, 0x5E5F, 0x8EC4, 0x5E60, 0x8EC5, 0x5E63,\t0x8EC6, 0x5E64, 0x8EC7, 0x5E65, 0x8EC8, 0x5E66, 0x8EC9, 0x5E67,\n\t0x8ECA, 0x5E68, 0x8ECB, 0x5E69, 0x8ECC, 0x5E6A, 0x8ECD, 0x5E6B,\t0x8ECE, 0x5E6C, 0x8ECF, 0x5E6D, 0x8ED0, 0x5E6E, 0x8ED1, 0x5E6F,\n\t0x8ED2, 0x5E70, 0x8ED3, 0x5E71, 0x8ED4, 0x5E75, 0x8ED5, 0x5E77,\t0x8ED6, 0x5E79, 0x8ED7, 0x5E7E, 0x8ED8, 0x5E81, 0x8ED9, 0x5E82,\n\t0x8EDA, 0x5E83, 0x8EDB, 0x5E85, 0x8EDC, 0x5E88, 0x8EDD, 0x5E89,\t0x8EDE, 0x5E8C, 0x8EDF, 0x5E8D, 0x8EE0, 0x5E8E, 0x8EE1, 0x5E92,\n\t0x8EE2, 0x5E98, 0x8EE3, 0x5E9B, 0x8EE4, 0x5E9D, 0x8EE5, 0x5EA1,\t0x8EE6, 0x5EA2, 0x8EE7, 0x5EA3, 0x8EE8, 0x5EA4, 0x8EE9, 0x5EA8,\n\t0x8EEA, 0x5EA9, 0x8EEB, 0x5EAA, 0x8EEC, 0x5EAB, 0x8EED, 0x5EAC,\t0x8EEE, 0x5EAE, 0x8EEF, 0x5EAF, 0x8EF0, 0x5EB0, 0x8EF1, 0x5EB1,\n\t0x8EF2, 0x5EB2, 0x8EF3, 0x5EB4, 0x8EF4, 0x5EBA, 0x8EF5, 0x5EBB,\t0x8EF6, 0x5EBC, 0x8EF7, 0x5EBD, 0x8EF8, 0x5EBF, 0x8EF9, 0x5EC0,\n\t0x8EFA, 0x5EC1, 0x8EFB, 0x5EC2, 0x8EFC, 0x5EC3, 0x8EFD, 0x5EC4,\t0x8EFE, 0x5EC5, 0x8F40, 0x5EC6, 0x8F41, 0x5EC7, 0x8F42, 0x5EC8,\n\t0x8F43, 0x5ECB, 0x8F44, 0x5ECC, 0x8F45, 0x5ECD, 0x8F46, 0x5ECE,\t0x8F47, 0x5ECF, 0x8F48, 0x5ED0, 0x8F49, 0x5ED4, 0x8F4A, 0x5ED5,\n\t0x8F4B, 0x5ED7, 0x8F4C, 0x5ED8, 0x8F4D, 0x5ED9, 0x8F4E, 0x5EDA,\t0x8F4F, 0x5EDC, 0x8F50, 0x5EDD, 0x8F51, 0x5EDE, 0x8F52, 0x5EDF,\n\t0x8F53, 0x5EE0, 0x8F54, 0x5EE1, 0x8F55, 0x5EE2, 0x8F56, 0x5EE3,\t0x8F57, 0x5EE4, 0x8F58, 0x5EE5, 0x8F59, 0x5EE6, 0x8F5A, 0x5EE7,\n\t0x8F5B, 0x5EE9, 0x8F5C, 0x5EEB, 0x8F5D, 0x5EEC, 0x8F5E, 0x5EED,\t0x8F5F, 0x5EEE, 0x8F60, 0x5EEF, 0x8F61, 0x5EF0, 0x8F62, 0x5EF1,\n\t0x8F63, 0x5EF2, 0x8F64, 0x5EF3, 0x8F65, 0x5EF5, 0x8F66, 0x5EF8,\t0x8F67, 0x5EF9, 0x8F68, 0x5EFB, 0x8F69, 0x5EFC, 0x8F6A, 0x5EFD,\n\t0x8F6B, 0x5F05, 0x8F6C, 0x5F06, 0x8F6D, 0x5F07, 0x8F6E, 0x5F09,\t0x8F6F, 0x5F0C, 0x8F70, 0x5F0D, 0x8F71, 0x5F0E, 0x8F72, 0x5F10,\n\t0x8F73, 0x5F12, 0x8F74, 0x5F14, 0x8F75, 0x5F16, 0x8F76, 0x5F19,\t0x8F77, 0x5F1A, 0x8F78, 0x5F1C, 0x8F79, 0x5F1D, 0x8F7A, 0x5F1E,\n\t0x8F7B, 0x5F21, 0x8F7C, 0x5F22, 0x8F7D, 0x5F23, 0x8F7E, 0x5F24,\t0x8F80, 0x5F28, 0x8F81, 0x5F2B, 0x8F82, 0x5F2C, 0x8F83, 0x5F2E,\n\t0x8F84, 0x5F30, 0x8F85, 0x5F32, 0x8F86, 0x5F33, 0x8F87, 0x5F34,\t0x8F88, 0x5F35, 0x8F89, 0x5F36, 0x8F8A, 0x5F37, 0x8F8B, 0x5F38,\n\t0x8F8C, 0x5F3B, 0x8F8D, 0x5F3D, 0x8F8E, 0x5F3E, 0x8F8F, 0x5F3F,\t0x8F90, 0x5F41, 0x8F91, 0x5F42, 0x8F92, 0x5F43, 0x8F93, 0x5F44,\n\t0x8F94, 0x5F45, 0x8F95, 0x5F46, 0x8F96, 0x5F47, 0x8F97, 0x5F48,\t0x8F98, 0x5F49, 0x8F99, 0x5F4A, 0x8F9A, 0x5F4B, 0x8F9B, 0x5F4C,\n\t0x8F9C, 0x5F4D, 0x8F9D, 0x5F4E, 0x8F9E, 0x5F4F, 0x8F9F, 0x5F51,\t0x8FA0, 0x5F54, 0x8FA1, 0x5F59, 0x8FA2, 0x5F5A, 0x8FA3, 0x5F5B,\n\t0x8FA4, 0x5F5C, 0x8FA5, 0x5F5E, 0x8FA6, 0x5F5F, 0x8FA7, 0x5F60,\t0x8FA8, 0x5F63, 0x8FA9, 0x5F65, 0x8FAA, 0x5F67, 0x8FAB, 0x5F68,\n\t0x8FAC, 0x5F6B, 0x8FAD, 0x5F6E, 0x8FAE, 0x5F6F, 0x8FAF, 0x5F72,\t0x8FB0, 0x5F74, 0x8FB1, 0x5F75, 0x8FB2, 0x5F76, 0x8FB3, 0x5F78,\n\t0x8FB4, 0x5F7A, 0x8FB5, 0x5F7D, 0x8FB6, 0x5F7E, 0x8FB7, 0x5F7F,\t0x8FB8, 0x5F83, 0x8FB9, 0x5F86, 0x8FBA, 0x5F8D, 0x8FBB, 0x5F8E,\n\t0x8FBC, 0x5F8F, 0x8FBD, 0x5F91, 0x8FBE, 0x5F93, 0x8FBF, 0x5F94,\t0x8FC0, 0x5F96, 0x8FC1, 0x5F9A, 0x8FC2, 0x5F9B, 0x8FC3, 0x5F9D,\n\t0x8FC4, 0x5F9E, 0x8FC5, 0x5F9F, 0x8FC6, 0x5FA0, 0x8FC7, 0x5FA2,\t0x8FC8, 0x5FA3, 0x8FC9, 0x5FA4, 0x8FCA, 0x5FA5, 0x8FCB, 0x5FA6,\n\t0x8FCC, 0x5FA7, 0x8FCD, 0x5FA9, 0x8FCE, 0x5FAB, 0x8FCF, 0x5FAC,\t0x8FD0, 0x5FAF, 0x8FD1, 0x5FB0, 0x8FD2, 0x5FB1, 0x8FD3, 0x5FB2,\n\t0x8FD4, 0x5FB3, 0x8FD5, 0x5FB4, 0x8FD6, 0x5FB6, 0x8FD7, 0x5FB8,\t0x8FD8, 0x5FB9, 0x8FD9, 0x5FBA, 0x8FDA, 0x5FBB, 0x8FDB, 0x5FBE,\n\t0x8FDC, 0x5FBF, 0x8FDD, 0x5FC0, 0x8FDE, 0x5FC1, 0x8FDF, 0x5FC2,\t0x8FE0, 0x5FC7, 0x8FE1, 0x5FC8, 0x8FE2, 0x5FCA, 0x8FE3, 0x5FCB,\n\t0x8FE4, 0x5FCE, 0x8FE5, 0x5FD3, 0x8FE6, 0x5FD4, 0x8FE7, 0x5FD5,\t0x8FE8, 0x5FDA, 0x8FE9, 0x5FDB, 0x8FEA, 0x5FDC, 0x8FEB, 0x5FDE,\n\t0x8FEC, 0x5FDF, 0x8FED, 0x5FE2, 0x8FEE, 0x5FE3, 0x8FEF, 0x5FE5,\t0x8FF0, 0x5FE6, 0x8FF1, 0x5FE8, 0x8FF2, 0x5FE9, 0x8FF3, 0x5FEC,\n\t0x8FF4, 0x5FEF, 0x8FF5, 0x5FF0, 0x8FF6, 0x5FF2, 0x8FF7, 0x5FF3,\t0x8FF8, 0x5FF4, 0x8FF9, 0x5FF6, 0x8FFA, 0x5FF7, 0x8FFB, 0x5FF9,\n\t0x8FFC, 0x5FFA, 0x8FFD, 0x5FFC, 0x8FFE, 0x6007, 0x9040, 0x6008,\t0x9041, 0x6009, 0x9042, 0x600B, 0x9043, 0x600C, 0x9044, 0x6010,\n\t0x9045, 0x6011, 0x9046, 0x6013, 0x9047, 0x6017, 0x9048, 0x6018,\t0x9049, 0x601A, 0x904A, 0x601E, 0x904B, 0x601F, 0x904C, 0x6022,\n\t0x904D, 0x6023, 0x904E, 0x6024, 0x904F, 0x602C, 0x9050, 0x602D,\t0x9051, 0x602E, 0x9052, 0x6030, 0x9053, 0x6031, 0x9054, 0x6032,\n\t0x9055, 0x6033, 0x9056, 0x6034, 0x9057, 0x6036, 0x9058, 0x6037,\t0x9059, 0x6038, 0x905A, 0x6039, 0x905B, 0x603A, 0x905C, 0x603D,\n\t0x905D, 0x603E, 0x905E, 0x6040, 0x905F, 0x6044, 0x9060, 0x6045,\t0x9061, 0x6046, 0x9062, 0x6047, 0x9063, 0x6048, 0x9064, 0x6049,\n\t0x9065, 0x604A, 0x9066, 0x604C, 0x9067, 0x604E, 0x9068, 0x604F,\t0x9069, 0x6051, 0x906A, 0x6053, 0x906B, 0x6054, 0x906C, 0x6056,\n\t0x906D, 0x6057, 0x906E, 0x6058, 0x906F, 0x605B, 0x9070, 0x605C,\t0x9071, 0x605E, 0x9072, 0x605F, 0x9073, 0x6060, 0x9074, 0x6061,\n\t0x9075, 0x6065, 0x9076, 0x6066, 0x9077, 0x606E, 0x9078, 0x6071,\t0x9079, 0x6072, 0x907A, 0x6074, 0x907B, 0x6075, 0x907C, 0x6077,\n\t0x907D, 0x607E, 0x907E, 0x6080, 0x9080, 0x6081, 0x9081, 0x6082,\t0x9082, 0x6085, 0x9083, 0x6086, 0x9084, 0x6087, 0x9085, 0x6088,\n\t0x9086, 0x608A, 0x9087, 0x608B, 0x9088, 0x608E, 0x9089, 0x608F,\t0x908A, 0x6090, 0x908B, 0x6091, 0x908C, 0x6093, 0x908D, 0x6095,\n\t0x908E, 0x6097, 0x908F, 0x6098, 0x9090, 0x6099, 0x9091, 0x609C,\t0x9092, 0x609E, 0x9093, 0x60A1, 0x9094, 0x60A2, 0x9095, 0x60A4,\n\t0x9096, 0x60A5, 0x9097, 0x60A7, 0x9098, 0x60A9, 0x9099, 0x60AA,\t0x909A, 0x60AE, 0x909B, 0x60B0, 0x909C, 0x60B3, 0x909D, 0x60B5,\n\t0x909E, 0x60B6, 0x909F, 0x60B7, 0x90A0, 0x60B9, 0x90A1, 0x60BA,\t0x90A2, 0x60BD, 0x90A3, 0x60BE, 0x90A4, 0x60BF, 0x90A5, 0x60C0,\n\t0x90A6, 0x60C1, 0x90A7, 0x60C2, 0x90A8, 0x60C3, 0x90A9, 0x60C4,\t0x90AA, 0x60C7, 0x90AB, 0x60C8, 0x90AC, 0x60C9, 0x90AD, 0x60CC,\n\t0x90AE, 0x60CD, 0x90AF, 0x60CE, 0x90B0, 0x60CF, 0x90B1, 0x60D0,\t0x90B2, 0x60D2, 0x90B3, 0x60D3, 0x90B4, 0x60D4, 0x90B5, 0x60D6,\n\t0x90B6, 0x60D7, 0x90B7, 0x60D9, 0x90B8, 0x60DB, 0x90B9, 0x60DE,\t0x90BA, 0x60E1, 0x90BB, 0x60E2, 0x90BC, 0x60E3, 0x90BD, 0x60E4,\n\t0x90BE, 0x60E5, 0x90BF, 0x60EA, 0x90C0, 0x60F1, 0x90C1, 0x60F2,\t0x90C2, 0x60F5, 0x90C3, 0x60F7, 0x90C4, 0x60F8, 0x90C5, 0x60FB,\n\t0x90C6, 0x60FC, 0x90C7, 0x60FD, 0x90C8, 0x60FE, 0x90C9, 0x60FF,\t0x90CA, 0x6102, 0x90CB, 0x6103, 0x90CC, 0x6104, 0x90CD, 0x6105,\n\t0x90CE, 0x6107, 0x90CF, 0x610A, 0x90D0, 0x610B, 0x90D1, 0x610C,\t0x90D2, 0x6110, 0x90D3, 0x6111, 0x90D4, 0x6112, 0x90D5, 0x6113,\n\t0x90D6, 0x6114, 0x90D7, 0x6116, 0x90D8, 0x6117, 0x90D9, 0x6118,\t0x90DA, 0x6119, 0x90DB, 0x611B, 0x90DC, 0x611C, 0x90DD, 0x611D,\n\t0x90DE, 0x611E, 0x90DF, 0x6121, 0x90E0, 0x6122, 0x90E1, 0x6125,\t0x90E2, 0x6128, 0x90E3, 0x6129, 0x90E4, 0x612A, 0x90E5, 0x612C,\n\t0x90E6, 0x612D, 0x90E7, 0x612E, 0x90E8, 0x612F, 0x90E9, 0x6130,\t0x90EA, 0x6131, 0x90EB, 0x6132, 0x90EC, 0x6133, 0x90ED, 0x6134,\n\t0x90EE, 0x6135, 0x90EF, 0x6136, 0x90F0, 0x6137, 0x90F1, 0x6138,\t0x90F2, 0x6139, 0x90F3, 0x613A, 0x90F4, 0x613B, 0x90F5, 0x613C,\n\t0x90F6, 0x613D, 0x90F7, 0x613E, 0x90F8, 0x6140, 0x90F9, 0x6141,\t0x90FA, 0x6142, 0x90FB, 0x6143, 0x90FC, 0x6144, 0x90FD, 0x6145,\n\t0x90FE, 0x6146, 0x9140, 0x6147, 0x9141, 0x6149, 0x9142, 0x614B,\t0x9143, 0x614D, 0x9144, 0x614F, 0x9145, 0x6150, 0x9146, 0x6152,\n\t0x9147, 0x6153, 0x9148, 0x6154, 0x9149, 0x6156, 0x914A, 0x6157,\t0x914B, 0x6158, 0x914C, 0x6159, 0x914D, 0x615A, 0x914E, 0x615B,\n\t0x914F, 0x615C, 0x9150, 0x615E, 0x9151, 0x615F, 0x9152, 0x6160,\t0x9153, 0x6161, 0x9154, 0x6163, 0x9155, 0x6164, 0x9156, 0x6165,\n\t0x9157, 0x6166, 0x9158, 0x6169, 0x9159, 0x616A, 0x915A, 0x616B,\t0x915B, 0x616C, 0x915C, 0x616D, 0x915D, 0x616E, 0x915E, 0x616F,\n\t0x915F, 0x6171, 0x9160, 0x6172, 0x9161, 0x6173, 0x9162, 0x6174,\t0x9163, 0x6176, 0x9164, 0x6178, 0x9165, 0x6179, 0x9166, 0x617A,\n\t0x9167, 0x617B, 0x9168, 0x617C, 0x9169, 0x617D, 0x916A, 0x617E,\t0x916B, 0x617F, 0x916C, 0x6180, 0x916D, 0x6181, 0x916E, 0x6182,\n\t0x916F, 0x6183, 0x9170, 0x6184, 0x9171, 0x6185, 0x9172, 0x6186,\t0x9173, 0x6187, 0x9174, 0x6188, 0x9175, 0x6189, 0x9176, 0x618A,\n\t0x9177, 0x618C, 0x9178, 0x618D, 0x9179, 0x618F, 0x917A, 0x6190,\t0x917B, 0x6191, 0x917C, 0x6192, 0x917D, 0x6193, 0x917E, 0x6195,\n\t0x9180, 0x6196, 0x9181, 0x6197, 0x9182, 0x6198, 0x9183, 0x6199,\t0x9184, 0x619A, 0x9185, 0x619B, 0x9186, 0x619C, 0x9187, 0x619E,\n\t0x9188, 0x619F, 0x9189, 0x61A0, 0x918A, 0x61A1, 0x918B, 0x61A2,\t0x918C, 0x61A3, 0x918D, 0x61A4, 0x918E, 0x61A5, 0x918F, 0x61A6,\n\t0x9190, 0x61AA, 0x9191, 0x61AB, 0x9192, 0x61AD, 0x9193, 0x61AE,\t0x9194, 0x61AF, 0x9195, 0x61B0, 0x9196, 0x61B1, 0x9197, 0x61B2,\n\t0x9198, 0x61B3, 0x9199, 0x61B4, 0x919A, 0x61B5, 0x919B, 0x61B6,\t0x919C, 0x61B8, 0x919D, 0x61B9, 0x919E, 0x61BA, 0x919F, 0x61BB,\n\t0x91A0, 0x61BC, 0x91A1, 0x61BD, 0x91A2, 0x61BF, 0x91A3, 0x61C0,\t0x91A4, 0x61C1, 0x91A5, 0x61C3, 0x91A6, 0x61C4, 0x91A7, 0x61C5,\n\t0x91A8, 0x61C6, 0x91A9, 0x61C7, 0x91AA, 0x61C9, 0x91AB, 0x61CC,\t0x91AC, 0x61CD, 0x91AD, 0x61CE, 0x91AE, 0x61CF, 0x91AF, 0x61D0,\n\t0x91B0, 0x61D3, 0x91B1, 0x61D5, 0x91B2, 0x61D6, 0x91B3, 0x61D7,\t0x91B4, 0x61D8, 0x91B5, 0x61D9, 0x91B6, 0x61DA, 0x91B7, 0x61DB,\n\t0x91B8, 0x61DC, 0x91B9, 0x61DD, 0x91BA, 0x61DE, 0x91BB, 0x61DF,\t0x91BC, 0x61E0, 0x91BD, 0x61E1, 0x91BE, 0x61E2, 0x91BF, 0x61E3,\n\t0x91C0, 0x61E4, 0x91C1, 0x61E5, 0x91C2, 0x61E7, 0x91C3, 0x61E8,\t0x91C4, 0x61E9, 0x91C5, 0x61EA, 0x91C6, 0x61EB, 0x91C7, 0x61EC,\n\t0x91C8, 0x61ED, 0x91C9, 0x61EE, 0x91CA, 0x61EF, 0x91CB, 0x61F0,\t0x91CC, 0x61F1, 0x91CD, 0x61F2, 0x91CE, 0x61F3, 0x91CF, 0x61F4,\n\t0x91D0, 0x61F6, 0x91D1, 0x61F7, 0x91D2, 0x61F8, 0x91D3, 0x61F9,\t0x91D4, 0x61FA, 0x91D5, 0x61FB, 0x91D6, 0x61FC, 0x91D7, 0x61FD,\n\t0x91D8, 0x61FE, 0x91D9, 0x6200, 0x91DA, 0x6201, 0x91DB, 0x6202,\t0x91DC, 0x6203, 0x91DD, 0x6204, 0x91DE, 0x6205, 0x91DF, 0x6207,\n\t0x91E0, 0x6209, 0x91E1, 0x6213, 0x91E2, 0x6214, 0x91E3, 0x6219,\t0x91E4, 0x621C, 0x91E5, 0x621D, 0x91E6, 0x621E, 0x91E7, 0x6220,\n\t0x91E8, 0x6223, 0x91E9, 0x6226, 0x91EA, 0x6227, 0x91EB, 0x6228,\t0x91EC, 0x6229, 0x91ED, 0x622B, 0x91EE, 0x622D, 0x91EF, 0x622F,\n\t0x91F0, 0x6230, 0x91F1, 0x6231, 0x91F2, 0x6232, 0x91F3, 0x6235,\t0x91F4, 0x6236, 0x91F5, 0x6238, 0x91F6, 0x6239, 0x91F7, 0x623A,\n\t0x91F8, 0x623B, 0x91F9, 0x623C, 0x91FA, 0x6242, 0x91FB, 0x6244,\t0x91FC, 0x6245, 0x91FD, 0x6246, 0x91FE, 0x624A, 0x9240, 0x624F,\n\t0x9241, 0x6250, 0x9242, 0x6255, 0x9243, 0x6256, 0x9244, 0x6257,\t0x9245, 0x6259, 0x9246, 0x625A, 0x9247, 0x625C, 0x9248, 0x625D,\n\t0x9249, 0x625E, 0x924A, 0x625F, 0x924B, 0x6260, 0x924C, 0x6261,\t0x924D, 0x6262, 0x924E, 0x6264, 0x924F, 0x6265, 0x9250, 0x6268,\n\t0x9251, 0x6271, 0x9252, 0x6272, 0x9253, 0x6274, 0x9254, 0x6275,\t0x9255, 0x6277, 0x9256, 0x6278, 0x9257, 0x627A, 0x9258, 0x627B,\n\t0x9259, 0x627D, 0x925A, 0x6281, 0x925B, 0x6282, 0x925C, 0x6283,\t0x925D, 0x6285, 0x925E, 0x6286, 0x925F, 0x6287, 0x9260, 0x6288,\n\t0x9261, 0x628B, 0x9262, 0x628C, 0x9263, 0x628D, 0x9264, 0x628E,\t0x9265, 0x628F, 0x9266, 0x6290, 0x9267, 0x6294, 0x9268, 0x6299,\n\t0x9269, 0x629C, 0x926A, 0x629D, 0x926B, 0x629E, 0x926C, 0x62A3,\t0x926D, 0x62A6, 0x926E, 0x62A7, 0x926F, 0x62A9, 0x9270, 0x62AA,\n\t0x9271, 0x62AD, 0x9272, 0x62AE, 0x9273, 0x62AF, 0x9274, 0x62B0,\t0x9275, 0x62B2, 0x9276, 0x62B3, 0x9277, 0x62B4, 0x9278, 0x62B6,\n\t0x9279, 0x62B7, 0x927A, 0x62B8, 0x927B, 0x62BA, 0x927C, 0x62BE,\t0x927D, 0x62C0, 0x927E, 0x62C1, 0x9280, 0x62C3, 0x9281, 0x62CB,\n\t0x9282, 0x62CF, 0x9283, 0x62D1, 0x9284, 0x62D5, 0x9285, 0x62DD,\t0x9286, 0x62DE, 0x9287, 0x62E0, 0x9288, 0x62E1, 0x9289, 0x62E4,\n\t0x928A, 0x62EA, 0x928B, 0x62EB, 0x928C, 0x62F0, 0x928D, 0x62F2,\t0x928E, 0x62F5, 0x928F, 0x62F8, 0x9290, 0x62F9, 0x9291, 0x62FA,\n\t0x9292, 0x62FB, 0x9293, 0x6300, 0x9294, 0x6303, 0x9295, 0x6304,\t0x9296, 0x6305, 0x9297, 0x6306, 0x9298, 0x630A, 0x9299, 0x630B,\n\t0x929A, 0x630C, 0x929B, 0x630D, 0x929C, 0x630F, 0x929D, 0x6310,\t0x929E, 0x6312, 0x929F, 0x6313, 0x92A0, 0x6314, 0x92A1, 0x6315,\n\t0x92A2, 0x6317, 0x92A3, 0x6318, 0x92A4, 0x6319, 0x92A5, 0x631C,\t0x92A6, 0x6326, 0x92A7, 0x6327, 0x92A8, 0x6329, 0x92A9, 0x632C,\n\t0x92AA, 0x632D, 0x92AB, 0x632E, 0x92AC, 0x6330, 0x92AD, 0x6331,\t0x92AE, 0x6333, 0x92AF, 0x6334, 0x92B0, 0x6335, 0x92B1, 0x6336,\n\t0x92B2, 0x6337, 0x92B3, 0x6338, 0x92B4, 0x633B, 0x92B5, 0x633C,\t0x92B6, 0x633E, 0x92B7, 0x633F, 0x92B8, 0x6340, 0x92B9, 0x6341,\n\t0x92BA, 0x6344, 0x92BB, 0x6347, 0x92BC, 0x6348, 0x92BD, 0x634A,\t0x92BE, 0x6351, 0x92BF, 0x6352, 0x92C0, 0x6353, 0x92C1, 0x6354,\n\t0x92C2, 0x6356, 0x92C3, 0x6357, 0x92C4, 0x6358, 0x92C5, 0x6359,\t0x92C6, 0x635A, 0x92C7, 0x635B, 0x92C8, 0x635C, 0x92C9, 0x635D,\n\t0x92CA, 0x6360, 0x92CB, 0x6364, 0x92CC, 0x6365, 0x92CD, 0x6366,\t0x92CE, 0x6368, 0x92CF, 0x636A, 0x92D0, 0x636B, 0x92D1, 0x636C,\n\t0x92D2, 0x636F, 0x92D3, 0x6370, 0x92D4, 0x6372, 0x92D5, 0x6373,\t0x92D6, 0x6374, 0x92D7, 0x6375, 0x92D8, 0x6378, 0x92D9, 0x6379,\n\t0x92DA, 0x637C, 0x92DB, 0x637D, 0x92DC, 0x637E, 0x92DD, 0x637F,\t0x92DE, 0x6381, 0x92DF, 0x6383, 0x92E0, 0x6384, 0x92E1, 0x6385,\n\t0x92E2, 0x6386, 0x92E3, 0x638B, 0x92E4, 0x638D, 0x92E5, 0x6391,\t0x92E6, 0x6393, 0x92E7, 0x6394, 0x92E8, 0x6395, 0x92E9, 0x6397,\n\t0x92EA, 0x6399, 0x92EB, 0x639A, 0x92EC, 0x639B, 0x92ED, 0x639C,\t0x92EE, 0x639D, 0x92EF, 0x639E, 0x92F0, 0x639F, 0x92F1, 0x63A1,\n\t0x92F2, 0x63A4, 0x92F3, 0x63A6, 0x92F4, 0x63AB, 0x92F5, 0x63AF,\t0x92F6, 0x63B1, 0x92F7, 0x63B2, 0x92F8, 0x63B5, 0x92F9, 0x63B6,\n\t0x92FA, 0x63B9, 0x92FB, 0x63BB, 0x92FC, 0x63BD, 0x92FD, 0x63BF,\t0x92FE, 0x63C0, 0x9340, 0x63C1, 0x9341, 0x63C2, 0x9342, 0x63C3,\n\t0x9343, 0x63C5, 0x9344, 0x63C7, 0x9345, 0x63C8, 0x9346, 0x63CA,\t0x9347, 0x63CB, 0x9348, 0x63CC, 0x9349, 0x63D1, 0x934A, 0x63D3,\n\t0x934B, 0x63D4, 0x934C, 0x63D5, 0x934D, 0x63D7, 0x934E, 0x63D8,\t0x934F, 0x63D9, 0x9350, 0x63DA, 0x9351, 0x63DB, 0x9352, 0x63DC,\n\t0x9353, 0x63DD, 0x9354, 0x63DF, 0x9355, 0x63E2, 0x9356, 0x63E4,\t0x9357, 0x63E5, 0x9358, 0x63E6, 0x9359, 0x63E7, 0x935A, 0x63E8,\n\t0x935B, 0x63EB, 0x935C, 0x63EC, 0x935D, 0x63EE, 0x935E, 0x63EF,\t0x935F, 0x63F0, 0x9360, 0x63F1, 0x9361, 0x63F3, 0x9362, 0x63F5,\n\t0x9363, 0x63F7, 0x9364, 0x63F9, 0x9365, 0x63FA, 0x9366, 0x63FB,\t0x9367, 0x63FC, 0x9368, 0x63FE, 0x9369, 0x6403, 0x936A, 0x6404,\n\t0x936B, 0x6406, 0x936C, 0x6407, 0x936D, 0x6408, 0x936E, 0x6409,\t0x936F, 0x640A, 0x9370, 0x640D, 0x9371, 0x640E, 0x9372, 0x6411,\n\t0x9373, 0x6412, 0x9374, 0x6415, 0x9375, 0x6416, 0x9376, 0x6417,\t0x9377, 0x6418, 0x9378, 0x6419, 0x9379, 0x641A, 0x937A, 0x641D,\n\t0x937B, 0x641F, 0x937C, 0x6422, 0x937D, 0x6423, 0x937E, 0x6424,\t0x9380, 0x6425, 0x9381, 0x6427, 0x9382, 0x6428, 0x9383, 0x6429,\n\t0x9384, 0x642B, 0x9385, 0x642E, 0x9386, 0x642F, 0x9387, 0x6430,\t0x9388, 0x6431, 0x9389, 0x6432, 0x938A, 0x6433, 0x938B, 0x6435,\n\t0x938C, 0x6436, 0x938D, 0x6437, 0x938E, 0x6438, 0x938F, 0x6439,\t0x9390, 0x643B, 0x9391, 0x643C, 0x9392, 0x643E, 0x9393, 0x6440,\n\t0x9394, 0x6442, 0x9395, 0x6443, 0x9396, 0x6449, 0x9397, 0x644B,\t0x9398, 0x644C, 0x9399, 0x644D, 0x939A, 0x644E, 0x939B, 0x644F,\n\t0x939C, 0x6450, 0x939D, 0x6451, 0x939E, 0x6453, 0x939F, 0x6455,\t0x93A0, 0x6456, 0x93A1, 0x6457, 0x93A2, 0x6459, 0x93A3, 0x645A,\n\t0x93A4, 0x645B, 0x93A5, 0x645C, 0x93A6, 0x645D, 0x93A7, 0x645F,\t0x93A8, 0x6460, 0x93A9, 0x6461, 0x93AA, 0x6462, 0x93AB, 0x6463,\n\t0x93AC, 0x6464, 0x93AD, 0x6465, 0x93AE, 0x6466, 0x93AF, 0x6468,\t0x93B0, 0x646A, 0x93B1, 0x646B, 0x93B2, 0x646C, 0x93B3, 0x646E,\n\t0x93B4, 0x646F, 0x93B5, 0x6470, 0x93B6, 0x6471, 0x93B7, 0x6472,\t0x93B8, 0x6473, 0x93B9, 0x6474, 0x93BA, 0x6475, 0x93BB, 0x6476,\n\t0x93BC, 0x6477, 0x93BD, 0x647B, 0x93BE, 0x647C, 0x93BF, 0x647D,\t0x93C0, 0x647E, 0x93C1, 0x647F, 0x93C2, 0x6480, 0x93C3, 0x6481,\n\t0x93C4, 0x6483, 0x93C5, 0x6486, 0x93C6, 0x6488, 0x93C7, 0x6489,\t0x93C8, 0x648A, 0x93C9, 0x648B, 0x93CA, 0x648C, 0x93CB, 0x648D,\n\t0x93CC, 0x648E, 0x93CD, 0x648F, 0x93CE, 0x6490, 0x93CF, 0x6493,\t0x93D0, 0x6494, 0x93D1, 0x6497, 0x93D2, 0x6498, 0x93D3, 0x649A,\n\t0x93D4, 0x649B, 0x93D5, 0x649C, 0x93D6, 0x649D, 0x93D7, 0x649F,\t0x93D8, 0x64A0, 0x93D9, 0x64A1, 0x93DA, 0x64A2, 0x93DB, 0x64A3,\n\t0x93DC, 0x64A5, 0x93DD, 0x64A6, 0x93DE, 0x64A7, 0x93DF, 0x64A8,\t0x93E0, 0x64AA, 0x93E1, 0x64AB, 0x93E2, 0x64AF, 0x93E3, 0x64B1,\n\t0x93E4, 0x64B2, 0x93E5, 0x64B3, 0x93E6, 0x64B4, 0x93E7, 0x64B6,\t0x93E8, 0x64B9, 0x93E9, 0x64BB, 0x93EA, 0x64BD, 0x93EB, 0x64BE,\n\t0x93EC, 0x64BF, 0x93ED, 0x64C1, 0x93EE, 0x64C3, 0x93EF, 0x64C4,\t0x93F0, 0x64C6, 0x93F1, 0x64C7, 0x93F2, 0x64C8, 0x93F3, 0x64C9,\n\t0x93F4, 0x64CA, 0x93F5, 0x64CB, 0x93F6, 0x64CC, 0x93F7, 0x64CF,\t0x93F8, 0x64D1, 0x93F9, 0x64D3, 0x93FA, 0x64D4, 0x93FB, 0x64D5,\n\t0x93FC, 0x64D6, 0x93FD, 0x64D9, 0x93FE, 0x64DA, 0x9440, 0x64DB,\t0x9441, 0x64DC, 0x9442, 0x64DD, 0x9443, 0x64DF, 0x9444, 0x64E0,\n\t0x9445, 0x64E1, 0x9446, 0x64E3, 0x9447, 0x64E5, 0x9448, 0x64E7,\t0x9449, 0x64E8, 0x944A, 0x64E9, 0x944B, 0x64EA, 0x944C, 0x64EB,\n\t0x944D, 0x64EC, 0x944E, 0x64ED, 0x944F, 0x64EE, 0x9450, 0x64EF,\t0x9451, 0x64F0, 0x9452, 0x64F1, 0x9453, 0x64F2, 0x9454, 0x64F3,\n\t0x9455, 0x64F4, 0x9456, 0x64F5, 0x9457, 0x64F6, 0x9458, 0x64F7,\t0x9459, 0x64F8, 0x945A, 0x64F9, 0x945B, 0x64FA, 0x945C, 0x64FB,\n\t0x945D, 0x64FC, 0x945E, 0x64FD, 0x945F, 0x64FE, 0x9460, 0x64FF,\t0x9461, 0x6501, 0x9462, 0x6502, 0x9463, 0x6503, 0x9464, 0x6504,\n\t0x9465, 0x6505, 0x9466, 0x6506, 0x9467, 0x6507, 0x9468, 0x6508,\t0x9469, 0x650A, 0x946A, 0x650B, 0x946B, 0x650C, 0x946C, 0x650D,\n\t0x946D, 0x650E, 0x946E, 0x650F, 0x946F, 0x6510, 0x9470, 0x6511,\t0x9471, 0x6513, 0x9472, 0x6514, 0x9473, 0x6515, 0x9474, 0x6516,\n\t0x9475, 0x6517, 0x9476, 0x6519, 0x9477, 0x651A, 0x9478, 0x651B,\t0x9479, 0x651C, 0x947A, 0x651D, 0x947B, 0x651E, 0x947C, 0x651F,\n\t0x947D, 0x6520, 0x947E, 0x6521, 0x9480, 0x6522, 0x9481, 0x6523,\t0x9482, 0x6524, 0x9483, 0x6526, 0x9484, 0x6527, 0x9485, 0x6528,\n\t0x9486, 0x6529, 0x9487, 0x652A, 0x9488, 0x652C, 0x9489, 0x652D,\t0x948A, 0x6530, 0x948B, 0x6531, 0x948C, 0x6532, 0x948D, 0x6533,\n\t0x948E, 0x6537, 0x948F, 0x653A, 0x9490, 0x653C, 0x9491, 0x653D,\t0x9492, 0x6540, 0x9493, 0x6541, 0x9494, 0x6542, 0x9495, 0x6543,\n\t0x9496, 0x6544, 0x9497, 0x6546, 0x9498, 0x6547, 0x9499, 0x654A,\t0x949A, 0x654B, 0x949B, 0x654D, 0x949C, 0x654E, 0x949D, 0x6550,\n\t0x949E, 0x6552, 0x949F, 0x6553, 0x94A0, 0x6554, 0x94A1, 0x6557,\t0x94A2, 0x6558, 0x94A3, 0x655A, 0x94A4, 0x655C, 0x94A5, 0x655F,\n\t0x94A6, 0x6560, 0x94A7, 0x6561, 0x94A8, 0x6564, 0x94A9, 0x6565,\t0x94AA, 0x6567, 0x94AB, 0x6568, 0x94AC, 0x6569, 0x94AD, 0x656A,\n\t0x94AE, 0x656D, 0x94AF, 0x656E, 0x94B0, 0x656F, 0x94B1, 0x6571,\t0x94B2, 0x6573, 0x94B3, 0x6575, 0x94B4, 0x6576, 0x94B5, 0x6578,\n\t0x94B6, 0x6579, 0x94B7, 0x657A, 0x94B8, 0x657B, 0x94B9, 0x657C,\t0x94BA, 0x657D, 0x94BB, 0x657E, 0x94BC, 0x657F, 0x94BD, 0x6580,\n\t0x94BE, 0x6581, 0x94BF, 0x6582, 0x94C0, 0x6583, 0x94C1, 0x6584,\t0x94C2, 0x6585, 0x94C3, 0x6586, 0x94C4, 0x6588, 0x94C5, 0x6589,\n\t0x94C6, 0x658A, 0x94C7, 0x658D, 0x94C8, 0x658E, 0x94C9, 0x658F,\t0x94CA, 0x6592, 0x94CB, 0x6594, 0x94CC, 0x6595, 0x94CD, 0x6596,\n\t0x94CE, 0x6598, 0x94CF, 0x659A, 0x94D0, 0x659D, 0x94D1, 0x659E,\t0x94D2, 0x65A0, 0x94D3, 0x65A2, 0x94D4, 0x65A3, 0x94D5, 0x65A6,\n\t0x94D6, 0x65A8, 0x94D7, 0x65AA, 0x94D8, 0x65AC, 0x94D9, 0x65AE,\t0x94DA, 0x65B1, 0x94DB, 0x65B2, 0x94DC, 0x65B3, 0x94DD, 0x65B4,\n\t0x94DE, 0x65B5, 0x94DF, 0x65B6, 0x94E0, 0x65B7, 0x94E1, 0x65B8,\t0x94E2, 0x65BA, 0x94E3, 0x65BB, 0x94E4, 0x65BE, 0x94E5, 0x65BF,\n\t0x94E6, 0x65C0, 0x94E7, 0x65C2, 0x94E8, 0x65C7, 0x94E9, 0x65C8,\t0x94EA, 0x65C9, 0x94EB, 0x65CA, 0x94EC, 0x65CD, 0x94ED, 0x65D0,\n\t0x94EE, 0x65D1, 0x94EF, 0x65D3, 0x94F0, 0x65D4, 0x94F1, 0x65D5,\t0x94F2, 0x65D8, 0x94F3, 0x65D9, 0x94F4, 0x65DA, 0x94F5, 0x65DB,\n\t0x94F6, 0x65DC, 0x94F7, 0x65DD, 0x94F8, 0x65DE, 0x94F9, 0x65DF,\t0x94FA, 0x65E1, 0x94FB, 0x65E3, 0x94FC, 0x65E4, 0x94FD, 0x65EA,\n\t0x94FE, 0x65EB, 0x9540, 0x65F2, 0x9541, 0x65F3, 0x9542, 0x65F4,\t0x9543, 0x65F5, 0x9544, 0x65F8, 0x9545, 0x65F9, 0x9546, 0x65FB,\n\t0x9547, 0x65FC, 0x9548, 0x65FD, 0x9549, 0x65FE, 0x954A, 0x65FF,\t0x954B, 0x6601, 0x954C, 0x6604, 0x954D, 0x6605, 0x954E, 0x6607,\n\t0x954F, 0x6608, 0x9550, 0x6609, 0x9551, 0x660B, 0x9552, 0x660D,\t0x9553, 0x6610, 0x9554, 0x6611, 0x9555, 0x6612, 0x9556, 0x6616,\n\t0x9557, 0x6617, 0x9558, 0x6618, 0x9559, 0x661A, 0x955A, 0x661B,\t0x955B, 0x661C, 0x955C, 0x661E, 0x955D, 0x6621, 0x955E, 0x6622,\n\t0x955F, 0x6623, 0x9560, 0x6624, 0x9561, 0x6626, 0x9562, 0x6629,\t0x9563, 0x662A, 0x9564, 0x662B, 0x9565, 0x662C, 0x9566, 0x662E,\n\t0x9567, 0x6630, 0x9568, 0x6632, 0x9569, 0x6633, 0x956A, 0x6637,\t0x956B, 0x6638, 0x956C, 0x6639, 0x956D, 0x663A, 0x956E, 0x663B,\n\t0x956F, 0x663D, 0x9570, 0x663F, 0x9571, 0x6640, 0x9572, 0x6642,\t0x9573, 0x6644, 0x9574, 0x6645, 0x9575, 0x6646, 0x9576, 0x6647,\n\t0x9577, 0x6648, 0x9578, 0x6649, 0x9579, 0x664A, 0x957A, 0x664D,\t0x957B, 0x664E, 0x957C, 0x6650, 0x957D, 0x6651, 0x957E, 0x6658,\n\t0x9580, 0x6659, 0x9581, 0x665B, 0x9582, 0x665C, 0x9583, 0x665D,\t0x9584, 0x665E, 0x9585, 0x6660, 0x9586, 0x6662, 0x9587, 0x6663,\n\t0x9588, 0x6665, 0x9589, 0x6667, 0x958A, 0x6669, 0x958B, 0x666A,\t0x958C, 0x666B, 0x958D, 0x666C, 0x958E, 0x666D, 0x958F, 0x6671,\n\t0x9590, 0x6672, 0x9591, 0x6673, 0x9592, 0x6675, 0x9593, 0x6678,\t0x9594, 0x6679, 0x9595, 0x667B, 0x9596, 0x667C, 0x9597, 0x667D,\n\t0x9598, 0x667F, 0x9599, 0x6680, 0x959A, 0x6681, 0x959B, 0x6683,\t0x959C, 0x6685, 0x959D, 0x6686, 0x959E, 0x6688, 0x959F, 0x6689,\n\t0x95A0, 0x668A, 0x95A1, 0x668B, 0x95A2, 0x668D, 0x95A3, 0x668E,\t0x95A4, 0x668F, 0x95A5, 0x6690, 0x95A6, 0x6692, 0x95A7, 0x6693,\n\t0x95A8, 0x6694, 0x95A9, 0x6695, 0x95AA, 0x6698, 0x95AB, 0x6699,\t0x95AC, 0x669A, 0x95AD, 0x669B, 0x95AE, 0x669C, 0x95AF, 0x669E,\n\t0x95B0, 0x669F, 0x95B1, 0x66A0, 0x95B2, 0x66A1, 0x95B3, 0x66A2,\t0x95B4, 0x66A3, 0x95B5, 0x66A4, 0x95B6, 0x66A5, 0x95B7, 0x66A6,\n\t0x95B8, 0x66A9, 0x95B9, 0x66AA, 0x95BA, 0x66AB, 0x95BB, 0x66AC,\t0x95BC, 0x66AD, 0x95BD, 0x66AF, 0x95BE, 0x66B0, 0x95BF, 0x66B1,\n\t0x95C0, 0x66B2, 0x95C1, 0x66B3, 0x95C2, 0x66B5, 0x95C3, 0x66B6,\t0x95C4, 0x66B7, 0x95C5, 0x66B8, 0x95C6, 0x66BA, 0x95C7, 0x66BB,\n\t0x95C8, 0x66BC, 0x95C9, 0x66BD, 0x95CA, 0x66BF, 0x95CB, 0x66C0,\t0x95CC, 0x66C1, 0x95CD, 0x66C2, 0x95CE, 0x66C3, 0x95CF, 0x66C4,\n\t0x95D0, 0x66C5, 0x95D1, 0x66C6, 0x95D2, 0x66C7, 0x95D3, 0x66C8,\t0x95D4, 0x66C9, 0x95D5, 0x66CA, 0x95D6, 0x66CB, 0x95D7, 0x66CC,\n\t0x95D8, 0x66CD, 0x95D9, 0x66CE, 0x95DA, 0x66CF, 0x95DB, 0x66D0,\t0x95DC, 0x66D1, 0x95DD, 0x66D2, 0x95DE, 0x66D3, 0x95DF, 0x66D4,\n\t0x95E0, 0x66D5, 0x95E1, 0x66D6, 0x95E2, 0x66D7, 0x95E3, 0x66D8,\t0x95E4, 0x66DA, 0x95E5, 0x66DE, 0x95E6, 0x66DF, 0x95E7, 0x66E0,\n\t0x95E8, 0x66E1, 0x95E9, 0x66E2, 0x95EA, 0x66E3, 0x95EB, 0x66E4,\t0x95EC, 0x66E5, 0x95ED, 0x66E7, 0x95EE, 0x66E8, 0x95EF, 0x66EA,\n\t0x95F0, 0x66EB, 0x95F1, 0x66EC, 0x95F2, 0x66ED, 0x95F3, 0x66EE,\t0x95F4, 0x66EF, 0x95F5, 0x66F1, 0x95F6, 0x66F5, 0x95F7, 0x66F6,\n\t0x95F8, 0x66F8, 0x95F9, 0x66FA, 0x95FA, 0x66FB, 0x95FB, 0x66FD,\t0x95FC, 0x6701, 0x95FD, 0x6702, 0x95FE, 0x6703, 0x9640, 0x6704,\n\t0x9641, 0x6705, 0x9642, 0x6706, 0x9643, 0x6707, 0x9644, 0x670C,\t0x9645, 0x670E, 0x9646, 0x670F, 0x9647, 0x6711, 0x9648, 0x6712,\n\t0x9649, 0x6713, 0x964A, 0x6716, 0x964B, 0x6718, 0x964C, 0x6719,\t0x964D, 0x671A, 0x964E, 0x671C, 0x964F, 0x671E, 0x9650, 0x6720,\n\t0x9651, 0x6721, 0x9652, 0x6722, 0x9653, 0x6723, 0x9654, 0x6724,\t0x9655, 0x6725, 0x9656, 0x6727, 0x9657, 0x6729, 0x9658, 0x672E,\n\t0x9659, 0x6730, 0x965A, 0x6732, 0x965B, 0x6733, 0x965C, 0x6736,\t0x965D, 0x6737, 0x965E, 0x6738, 0x965F, 0x6739, 0x9660, 0x673B,\n\t0x9661, 0x673C, 0x9662, 0x673E, 0x9663, 0x673F, 0x9664, 0x6741,\t0x9665, 0x6744, 0x9666, 0x6745, 0x9667, 0x6747, 0x9668, 0x674A,\n\t0x9669, 0x674B, 0x966A, 0x674D, 0x966B, 0x6752, 0x966C, 0x6754,\t0x966D, 0x6755, 0x966E, 0x6757, 0x966F, 0x6758, 0x9670, 0x6759,\n\t0x9671, 0x675A, 0x9672, 0x675B, 0x9673, 0x675D, 0x9674, 0x6762,\t0x9675, 0x6763, 0x9676, 0x6764, 0x9677, 0x6766, 0x9678, 0x6767,\n\t0x9679, 0x676B, 0x967A, 0x676C, 0x967B, 0x676E, 0x967C, 0x6771,\t0x967D, 0x6774, 0x967E, 0x6776, 0x9680, 0x6778, 0x9681, 0x6779,\n\t0x9682, 0x677A, 0x9683, 0x677B, 0x9684, 0x677D, 0x9685, 0x6780,\t0x9686, 0x6782, 0x9687, 0x6783, 0x9688, 0x6785, 0x9689, 0x6786,\n\t0x968A, 0x6788, 0x968B, 0x678A, 0x968C, 0x678C, 0x968D, 0x678D,\t0x968E, 0x678E, 0x968F, 0x678F, 0x9690, 0x6791, 0x9691, 0x6792,\n\t0x9692, 0x6793, 0x9693, 0x6794, 0x9694, 0x6796, 0x9695, 0x6799,\t0x9696, 0x679B, 0x9697, 0x679F, 0x9698, 0x67A0, 0x9699, 0x67A1,\n\t0x969A, 0x67A4, 0x969B, 0x67A6, 0x969C, 0x67A9, 0x969D, 0x67AC,\t0x969E, 0x67AE, 0x969F, 0x67B1, 0x96A0, 0x67B2, 0x96A1, 0x67B4,\n\t0x96A2, 0x67B9, 0x96A3, 0x67BA, 0x96A4, 0x67BB, 0x96A5, 0x67BC,\t0x96A6, 0x67BD, 0x96A7, 0x67BE, 0x96A8, 0x67BF, 0x96A9, 0x67C0,\n\t0x96AA, 0x67C2, 0x96AB, 0x67C5, 0x96AC, 0x67C6, 0x96AD, 0x67C7,\t0x96AE, 0x67C8, 0x96AF, 0x67C9, 0x96B0, 0x67CA, 0x96B1, 0x67CB,\n\t0x96B2, 0x67CC, 0x96B3, 0x67CD, 0x96B4, 0x67CE, 0x96B5, 0x67D5,\t0x96B6, 0x67D6, 0x96B7, 0x67D7, 0x96B8, 0x67DB, 0x96B9, 0x67DF,\n\t0x96BA, 0x67E1, 0x96BB, 0x67E3, 0x96BC, 0x67E4, 0x96BD, 0x67E6,\t0x96BE, 0x67E7, 0x96BF, 0x67E8, 0x96C0, 0x67EA, 0x96C1, 0x67EB,\n\t0x96C2, 0x67ED, 0x96C3, 0x67EE, 0x96C4, 0x67F2, 0x96C5, 0x67F5,\t0x96C6, 0x67F6, 0x96C7, 0x67F7, 0x96C8, 0x67F8, 0x96C9, 0x67F9,\n\t0x96CA, 0x67FA, 0x96CB, 0x67FB, 0x96CC, 0x67FC, 0x96CD, 0x67FE,\t0x96CE, 0x6801, 0x96CF, 0x6802, 0x96D0, 0x6803, 0x96D1, 0x6804,\n\t0x96D2, 0x6806, 0x96D3, 0x680D, 0x96D4, 0x6810, 0x96D5, 0x6812,\t0x96D6, 0x6814, 0x96D7, 0x6815, 0x96D8, 0x6818, 0x96D9, 0x6819,\n\t0x96DA, 0x681A, 0x96DB, 0x681B, 0x96DC, 0x681C, 0x96DD, 0x681E,\t0x96DE, 0x681F, 0x96DF, 0x6820, 0x96E0, 0x6822, 0x96E1, 0x6823,\n\t0x96E2, 0x6824, 0x96E3, 0x6825, 0x96E4, 0x6826, 0x96E5, 0x6827,\t0x96E6, 0x6828, 0x96E7, 0x682B, 0x96E8, 0x682C, 0x96E9, 0x682D,\n\t0x96EA, 0x682E, 0x96EB, 0x682F, 0x96EC, 0x6830, 0x96ED, 0x6831,\t0x96EE, 0x6834, 0x96EF, 0x6835, 0x96F0, 0x6836, 0x96F1, 0x683A,\n\t0x96F2, 0x683B, 0x96F3, 0x683F, 0x96F4, 0x6847, 0x96F5, 0x684B,\t0x96F6, 0x684D, 0x96F7, 0x684F, 0x96F8, 0x6852, 0x96F9, 0x6856,\n\t0x96FA, 0x6857, 0x96FB, 0x6858, 0x96FC, 0x6859, 0x96FD, 0x685A,\t0x96FE, 0x685B, 0x9740, 0x685C, 0x9741, 0x685D, 0x9742, 0x685E,\n\t0x9743, 0x685F, 0x9744, 0x686A, 0x9745, 0x686C, 0x9746, 0x686D,\t0x9747, 0x686E, 0x9748, 0x686F, 0x9749, 0x6870, 0x974A, 0x6871,\n\t0x974B, 0x6872, 0x974C, 0x6873, 0x974D, 0x6875, 0x974E, 0x6878,\t0x974F, 0x6879, 0x9750, 0x687A, 0x9751, 0x687B, 0x9752, 0x687C,\n\t0x9753, 0x687D, 0x9754, 0x687E, 0x9755, 0x687F, 0x9756, 0x6880,\t0x9757, 0x6882, 0x9758, 0x6884, 0x9759, 0x6887, 0x975A, 0x6888,\n\t0x975B, 0x6889, 0x975C, 0x688A, 0x975D, 0x688B, 0x975E, 0x688C,\t0x975F, 0x688D, 0x9760, 0x688E, 0x9761, 0x6890, 0x9762, 0x6891,\n\t0x9763, 0x6892, 0x9764, 0x6894, 0x9765, 0x6895, 0x9766, 0x6896,\t0x9767, 0x6898, 0x9768, 0x6899, 0x9769, 0x689A, 0x976A, 0x689B,\n\t0x976B, 0x689C, 0x976C, 0x689D, 0x976D, 0x689E, 0x976E, 0x689F,\t0x976F, 0x68A0, 0x9770, 0x68A1, 0x9771, 0x68A3, 0x9772, 0x68A4,\n\t0x9773, 0x68A5, 0x9774, 0x68A9, 0x9775, 0x68AA, 0x9776, 0x68AB,\t0x9777, 0x68AC, 0x9778, 0x68AE, 0x9779, 0x68B1, 0x977A, 0x68B2,\n\t0x977B, 0x68B4, 0x977C, 0x68B6, 0x977D, 0x68B7, 0x977E, 0x68B8,\t0x9780, 0x68B9, 0x9781, 0x68BA, 0x9782, 0x68BB, 0x9783, 0x68BC,\n\t0x9784, 0x68BD, 0x9785, 0x68BE, 0x9786, 0x68BF, 0x9787, 0x68C1,\t0x9788, 0x68C3, 0x9789, 0x68C4, 0x978A, 0x68C5, 0x978B, 0x68C6,\n\t0x978C, 0x68C7, 0x978D, 0x68C8, 0x978E, 0x68CA, 0x978F, 0x68CC,\t0x9790, 0x68CE, 0x9791, 0x68CF, 0x9792, 0x68D0, 0x9793, 0x68D1,\n\t0x9794, 0x68D3, 0x9795, 0x68D4, 0x9796, 0x68D6, 0x9797, 0x68D7,\t0x9798, 0x68D9, 0x9799, 0x68DB, 0x979A, 0x68DC, 0x979B, 0x68DD,\n\t0x979C, 0x68DE, 0x979D, 0x68DF, 0x979E, 0x68E1, 0x979F, 0x68E2,\t0x97A0, 0x68E4, 0x97A1, 0x68E5, 0x97A2, 0x68E6, 0x97A3, 0x68E7,\n\t0x97A4, 0x68E8, 0x97A5, 0x68E9, 0x97A6, 0x68EA, 0x97A7, 0x68EB,\t0x97A8, 0x68EC, 0x97A9, 0x68ED, 0x97AA, 0x68EF, 0x97AB, 0x68F2,\n\t0x97AC, 0x68F3, 0x97AD, 0x68F4, 0x97AE, 0x68F6, 0x97AF, 0x68F7,\t0x97B0, 0x68F8, 0x97B1, 0x68FB, 0x97B2, 0x68FD, 0x97B3, 0x68FE,\n\t0x97B4, 0x68FF, 0x97B5, 0x6900, 0x97B6, 0x6902, 0x97B7, 0x6903,\t0x97B8, 0x6904, 0x97B9, 0x6906, 0x97BA, 0x6907, 0x97BB, 0x6908,\n\t0x97BC, 0x6909, 0x97BD, 0x690A, 0x97BE, 0x690C, 0x97BF, 0x690F,\t0x97C0, 0x6911, 0x97C1, 0x6913, 0x97C2, 0x6914, 0x97C3, 0x6915,\n\t0x97C4, 0x6916, 0x97C5, 0x6917, 0x97C6, 0x6918, 0x97C7, 0x6919,\t0x97C8, 0x691A, 0x97C9, 0x691B, 0x97CA, 0x691C, 0x97CB, 0x691D,\n\t0x97CC, 0x691E, 0x97CD, 0x6921, 0x97CE, 0x6922, 0x97CF, 0x6923,\t0x97D0, 0x6925, 0x97D1, 0x6926, 0x97D2, 0x6927, 0x97D3, 0x6928,\n\t0x97D4, 0x6929, 0x97D5, 0x692A, 0x97D6, 0x692B, 0x97D7, 0x692C,\t0x97D8, 0x692E, 0x97D9, 0x692F, 0x97DA, 0x6931, 0x97DB, 0x6932,\n\t0x97DC, 0x6933, 0x97DD, 0x6935, 0x97DE, 0x6936, 0x97DF, 0x6937,\t0x97E0, 0x6938, 0x97E1, 0x693A, 0x97E2, 0x693B, 0x97E3, 0x693C,\n\t0x97E4, 0x693E, 0x97E5, 0x6940, 0x97E6, 0x6941, 0x97E7, 0x6943,\t0x97E8, 0x6944, 0x97E9, 0x6945, 0x97EA, 0x6946, 0x97EB, 0x6947,\n\t0x97EC, 0x6948, 0x97ED, 0x6949, 0x97EE, 0x694A, 0x97EF, 0x694B,\t0x97F0, 0x694C, 0x97F1, 0x694D, 0x97F2, 0x694E, 0x97F3, 0x694F,\n\t0x97F4, 0x6950, 0x97F5, 0x6951, 0x97F6, 0x6952, 0x97F7, 0x6953,\t0x97F8, 0x6955, 0x97F9, 0x6956, 0x97FA, 0x6958, 0x97FB, 0x6959,\n\t0x97FC, 0x695B, 0x97FD, 0x695C, 0x97FE, 0x695F, 0x9840, 0x6961,\t0x9841, 0x6962, 0x9842, 0x6964, 0x9843, 0x6965, 0x9844, 0x6967,\n\t0x9845, 0x6968, 0x9846, 0x6969, 0x9847, 0x696A, 0x9848, 0x696C,\t0x9849, 0x696D, 0x984A, 0x696F, 0x984B, 0x6970, 0x984C, 0x6972,\n\t0x984D, 0x6973, 0x984E, 0x6974, 0x984F, 0x6975, 0x9850, 0x6976,\t0x9851, 0x697A, 0x9852, 0x697B, 0x9853, 0x697D, 0x9854, 0x697E,\n\t0x9855, 0x697F, 0x9856, 0x6981, 0x9857, 0x6983, 0x9858, 0x6985,\t0x9859, 0x698A, 0x985A, 0x698B, 0x985B, 0x698C, 0x985C, 0x698E,\n\t0x985D, 0x698F, 0x985E, 0x6990, 0x985F, 0x6991, 0x9860, 0x6992,\t0x9861, 0x6993, 0x9862, 0x6996, 0x9863, 0x6997, 0x9864, 0x6999,\n\t0x9865, 0x699A, 0x9866, 0x699D, 0x9867, 0x699E, 0x9868, 0x699F,\t0x9869, 0x69A0, 0x986A, 0x69A1, 0x986B, 0x69A2, 0x986C, 0x69A3,\n\t0x986D, 0x69A4, 0x986E, 0x69A5, 0x986F, 0x69A6, 0x9870, 0x69A9,\t0x9871, 0x69AA, 0x9872, 0x69AC, 0x9873, 0x69AE, 0x9874, 0x69AF,\n\t0x9875, 0x69B0, 0x9876, 0x69B2, 0x9877, 0x69B3, 0x9878, 0x69B5,\t0x9879, 0x69B6, 0x987A, 0x69B8, 0x987B, 0x69B9, 0x987C, 0x69BA,\n\t0x987D, 0x69BC, 0x987E, 0x69BD, 0x9880, 0x69BE, 0x9881, 0x69BF,\t0x9882, 0x69C0, 0x9883, 0x69C2, 0x9884, 0x69C3, 0x9885, 0x69C4,\n\t0x9886, 0x69C5, 0x9887, 0x69C6, 0x9888, 0x69C7, 0x9889, 0x69C8,\t0x988A, 0x69C9, 0x988B, 0x69CB, 0x988C, 0x69CD, 0x988D, 0x69CF,\n\t0x988E, 0x69D1, 0x988F, 0x69D2, 0x9890, 0x69D3, 0x9891, 0x69D5,\t0x9892, 0x69D6, 0x9893, 0x69D7, 0x9894, 0x69D8, 0x9895, 0x69D9,\n\t0x9896, 0x69DA, 0x9897, 0x69DC, 0x9898, 0x69DD, 0x9899, 0x69DE,\t0x989A, 0x69E1, 0x989B, 0x69E2, 0x989C, 0x69E3, 0x989D, 0x69E4,\n\t0x989E, 0x69E5, 0x989F, 0x69E6, 0x98A0, 0x69E7, 0x98A1, 0x69E8,\t0x98A2, 0x69E9, 0x98A3, 0x69EA, 0x98A4, 0x69EB, 0x98A5, 0x69EC,\n\t0x98A6, 0x69EE, 0x98A7, 0x69EF, 0x98A8, 0x69F0, 0x98A9, 0x69F1,\t0x98AA, 0x69F3, 0x98AB, 0x69F4, 0x98AC, 0x69F5, 0x98AD, 0x69F6,\n\t0x98AE, 0x69F7, 0x98AF, 0x69F8, 0x98B0, 0x69F9, 0x98B1, 0x69FA,\t0x98B2, 0x69FB, 0x98B3, 0x69FC, 0x98B4, 0x69FE, 0x98B5, 0x6A00,\n\t0x98B6, 0x6A01, 0x98B7, 0x6A02, 0x98B8, 0x6A03, 0x98B9, 0x6A04,\t0x98BA, 0x6A05, 0x98BB, 0x6A06, 0x98BC, 0x6A07, 0x98BD, 0x6A08,\n\t0x98BE, 0x6A09, 0x98BF, 0x6A0B, 0x98C0, 0x6A0C, 0x98C1, 0x6A0D,\t0x98C2, 0x6A0E, 0x98C3, 0x6A0F, 0x98C4, 0x6A10, 0x98C5, 0x6A11,\n\t0x98C6, 0x6A12, 0x98C7, 0x6A13, 0x98C8, 0x6A14, 0x98C9, 0x6A15,\t0x98CA, 0x6A16, 0x98CB, 0x6A19, 0x98CC, 0x6A1A, 0x98CD, 0x6A1B,\n\t0x98CE, 0x6A1C, 0x98CF, 0x6A1D, 0x98D0, 0x6A1E, 0x98D1, 0x6A20,\t0x98D2, 0x6A22, 0x98D3, 0x6A23, 0x98D4, 0x6A24, 0x98D5, 0x6A25,\n\t0x98D6, 0x6A26, 0x98D7, 0x6A27, 0x98D8, 0x6A29, 0x98D9, 0x6A2B,\t0x98DA, 0x6A2C, 0x98DB, 0x6A2D, 0x98DC, 0x6A2E, 0x98DD, 0x6A30,\n\t0x98DE, 0x6A32, 0x98DF, 0x6A33, 0x98E0, 0x6A34, 0x98E1, 0x6A36,\t0x98E2, 0x6A37, 0x98E3, 0x6A38, 0x98E4, 0x6A39, 0x98E5, 0x6A3A,\n\t0x98E6, 0x6A3B, 0x98E7, 0x6A3C, 0x98E8, 0x6A3F, 0x98E9, 0x6A40,\t0x98EA, 0x6A41, 0x98EB, 0x6A42, 0x98EC, 0x6A43, 0x98ED, 0x6A45,\n\t0x98EE, 0x6A46, 0x98EF, 0x6A48, 0x98F0, 0x6A49, 0x98F1, 0x6A4A,\t0x98F2, 0x6A4B, 0x98F3, 0x6A4C, 0x98F4, 0x6A4D, 0x98F5, 0x6A4E,\n\t0x98F6, 0x6A4F, 0x98F7, 0x6A51, 0x98F8, 0x6A52, 0x98F9, 0x6A53,\t0x98FA, 0x6A54, 0x98FB, 0x6A55, 0x98FC, 0x6A56, 0x98FD, 0x6A57,\n\t0x98FE, 0x6A5A, 0x9940, 0x6A5C, 0x9941, 0x6A5D, 0x9942, 0x6A5E,\t0x9943, 0x6A5F, 0x9944, 0x6A60, 0x9945, 0x6A62, 0x9946, 0x6A63,\n\t0x9947, 0x6A64, 0x9948, 0x6A66, 0x9949, 0x6A67, 0x994A, 0x6A68,\t0x994B, 0x6A69, 0x994C, 0x6A6A, 0x994D, 0x6A6B, 0x994E, 0x6A6C,\n\t0x994F, 0x6A6D, 0x9950, 0x6A6E, 0x9951, 0x6A6F, 0x9952, 0x6A70,\t0x9953, 0x6A72, 0x9954, 0x6A73, 0x9955, 0x6A74, 0x9956, 0x6A75,\n\t0x9957, 0x6A76, 0x9958, 0x6A77, 0x9959, 0x6A78, 0x995A, 0x6A7A,\t0x995B, 0x6A7B, 0x995C, 0x6A7D, 0x995D, 0x6A7E, 0x995E, 0x6A7F,\n\t0x995F, 0x6A81, 0x9960, 0x6A82, 0x9961, 0x6A83, 0x9962, 0x6A85,\t0x9963, 0x6A86, 0x9964, 0x6A87, 0x9965, 0x6A88, 0x9966, 0x6A89,\n\t0x9967, 0x6A8A, 0x9968, 0x6A8B, 0x9969, 0x6A8C, 0x996A, 0x6A8D,\t0x996B, 0x6A8F, 0x996C, 0x6A92, 0x996D, 0x6A93, 0x996E, 0x6A94,\n\t0x996F, 0x6A95, 0x9970, 0x6A96, 0x9971, 0x6A98, 0x9972, 0x6A99,\t0x9973, 0x6A9A, 0x9974, 0x6A9B, 0x9975, 0x6A9C, 0x9976, 0x6A9D,\n\t0x9977, 0x6A9E, 0x9978, 0x6A9F, 0x9979, 0x6AA1, 0x997A, 0x6AA2,\t0x997B, 0x6AA3, 0x997C, 0x6AA4, 0x997D, 0x6AA5, 0x997E, 0x6AA6,\n\t0x9980, 0x6AA7, 0x9981, 0x6AA8, 0x9982, 0x6AAA, 0x9983, 0x6AAD,\t0x9984, 0x6AAE, 0x9985, 0x6AAF, 0x9986, 0x6AB0, 0x9987, 0x6AB1,\n\t0x9988, 0x6AB2, 0x9989, 0x6AB3, 0x998A, 0x6AB4, 0x998B, 0x6AB5,\t0x998C, 0x6AB6, 0x998D, 0x6AB7, 0x998E, 0x6AB8, 0x998F, 0x6AB9,\n\t0x9990, 0x6ABA, 0x9991, 0x6ABB, 0x9992, 0x6ABC, 0x9993, 0x6ABD,\t0x9994, 0x6ABE, 0x9995, 0x6ABF, 0x9996, 0x6AC0, 0x9997, 0x6AC1,\n\t0x9998, 0x6AC2, 0x9999, 0x6AC3, 0x999A, 0x6AC4, 0x999B, 0x6AC5,\t0x999C, 0x6AC6, 0x999D, 0x6AC7, 0x999E, 0x6AC8, 0x999F, 0x6AC9,\n\t0x99A0, 0x6ACA, 0x99A1, 0x6ACB, 0x99A2, 0x6ACC, 0x99A3, 0x6ACD,\t0x99A4, 0x6ACE, 0x99A5, 0x6ACF, 0x99A6, 0x6AD0, 0x99A7, 0x6AD1,\n\t0x99A8, 0x6AD2, 0x99A9, 0x6AD3, 0x99AA, 0x6AD4, 0x99AB, 0x6AD5,\t0x99AC, 0x6AD6, 0x99AD, 0x6AD7, 0x99AE, 0x6AD8, 0x99AF, 0x6AD9,\n\t0x99B0, 0x6ADA, 0x99B1, 0x6ADB, 0x99B2, 0x6ADC, 0x99B3, 0x6ADD,\t0x99B4, 0x6ADE, 0x99B5, 0x6ADF, 0x99B6, 0x6AE0, 0x99B7, 0x6AE1,\n\t0x99B8, 0x6AE2, 0x99B9, 0x6AE3, 0x99BA, 0x6AE4, 0x99BB, 0x6AE5,\t0x99BC, 0x6AE6, 0x99BD, 0x6AE7, 0x99BE, 0x6AE8, 0x99BF, 0x6AE9,\n\t0x99C0, 0x6AEA, 0x99C1, 0x6AEB, 0x99C2, 0x6AEC, 0x99C3, 0x6AED,\t0x99C4, 0x6AEE, 0x99C5, 0x6AEF, 0x99C6, 0x6AF0, 0x99C7, 0x6AF1,\n\t0x99C8, 0x6AF2, 0x99C9, 0x6AF3, 0x99CA, 0x6AF4, 0x99CB, 0x6AF5,\t0x99CC, 0x6AF6, 0x99CD, 0x6AF7, 0x99CE, 0x6AF8, 0x99CF, 0x6AF9,\n\t0x99D0, 0x6AFA, 0x99D1, 0x6AFB, 0x99D2, 0x6AFC, 0x99D3, 0x6AFD,\t0x99D4, 0x6AFE, 0x99D5, 0x6AFF, 0x99D6, 0x6B00, 0x99D7, 0x6B01,\n\t0x99D8, 0x6B02, 0x99D9, 0x6B03, 0x99DA, 0x6B04, 0x99DB, 0x6B05,\t0x99DC, 0x6B06, 0x99DD, 0x6B07, 0x99DE, 0x6B08, 0x99DF, 0x6B09,\n\t0x99E0, 0x6B0A, 0x99E1, 0x6B0B, 0x99E2, 0x6B0C, 0x99E3, 0x6B0D,\t0x99E4, 0x6B0E, 0x99E5, 0x6B0F, 0x99E6, 0x6B10, 0x99E7, 0x6B11,\n\t0x99E8, 0x6B12, 0x99E9, 0x6B13, 0x99EA, 0x6B14, 0x99EB, 0x6B15,\t0x99EC, 0x6B16, 0x99ED, 0x6B17, 0x99EE, 0x6B18, 0x99EF, 0x6B19,\n\t0x99F0, 0x6B1A, 0x99F1, 0x6B1B, 0x99F2, 0x6B1C, 0x99F3, 0x6B1D,\t0x99F4, 0x6B1E, 0x99F5, 0x6B1F, 0x99F6, 0x6B25, 0x99F7, 0x6B26,\n\t0x99F8, 0x6B28, 0x99F9, 0x6B29, 0x99FA, 0x6B2A, 0x99FB, 0x6B2B,\t0x99FC, 0x6B2C, 0x99FD, 0x6B2D, 0x99FE, 0x6B2E, 0x9A40, 0x6B2F,\n\t0x9A41, 0x6B30, 0x9A42, 0x6B31, 0x9A43, 0x6B33, 0x9A44, 0x6B34,\t0x9A45, 0x6B35, 0x9A46, 0x6B36, 0x9A47, 0x6B38, 0x9A48, 0x6B3B,\n\t0x9A49, 0x6B3C, 0x9A4A, 0x6B3D, 0x9A4B, 0x6B3F, 0x9A4C, 0x6B40,\t0x9A4D, 0x6B41, 0x9A4E, 0x6B42, 0x9A4F, 0x6B44, 0x9A50, 0x6B45,\n\t0x9A51, 0x6B48, 0x9A52, 0x6B4A, 0x9A53, 0x6B4B, 0x9A54, 0x6B4D,\t0x9A55, 0x6B4E, 0x9A56, 0x6B4F, 0x9A57, 0x6B50, 0x9A58, 0x6B51,\n\t0x9A59, 0x6B52, 0x9A5A, 0x6B53, 0x9A5B, 0x6B54, 0x9A5C, 0x6B55,\t0x9A5D, 0x6B56, 0x9A5E, 0x6B57, 0x9A5F, 0x6B58, 0x9A60, 0x6B5A,\n\t0x9A61, 0x6B5B, 0x9A62, 0x6B5C, 0x9A63, 0x6B5D, 0x9A64, 0x6B5E,\t0x9A65, 0x6B5F, 0x9A66, 0x6B60, 0x9A67, 0x6B61, 0x9A68, 0x6B68,\n\t0x9A69, 0x6B69, 0x9A6A, 0x6B6B, 0x9A6B, 0x6B6C, 0x9A6C, 0x6B6D,\t0x9A6D, 0x6B6E, 0x9A6E, 0x6B6F, 0x9A6F, 0x6B70, 0x9A70, 0x6B71,\n\t0x9A71, 0x6B72, 0x9A72, 0x6B73, 0x9A73, 0x6B74, 0x9A74, 0x6B75,\t0x9A75, 0x6B76, 0x9A76, 0x6B77, 0x9A77, 0x6B78, 0x9A78, 0x6B7A,\n\t0x9A79, 0x6B7D, 0x9A7A, 0x6B7E, 0x9A7B, 0x6B7F, 0x9A7C, 0x6B80,\t0x9A7D, 0x6B85, 0x9A7E, 0x6B88, 0x9A80, 0x6B8C, 0x9A81, 0x6B8E,\n\t0x9A82, 0x6B8F, 0x9A83, 0x6B90, 0x9A84, 0x6B91, 0x9A85, 0x6B94,\t0x9A86, 0x6B95, 0x9A87, 0x6B97, 0x9A88, 0x6B98, 0x9A89, 0x6B99,\n\t0x9A8A, 0x6B9C, 0x9A8B, 0x6B9D, 0x9A8C, 0x6B9E, 0x9A8D, 0x6B9F,\t0x9A8E, 0x6BA0, 0x9A8F, 0x6BA2, 0x9A90, 0x6BA3, 0x9A91, 0x6BA4,\n\t0x9A92, 0x6BA5, 0x9A93, 0x6BA6, 0x9A94, 0x6BA7, 0x9A95, 0x6BA8,\t0x9A96, 0x6BA9, 0x9A97, 0x6BAB, 0x9A98, 0x6BAC, 0x9A99, 0x6BAD,\n\t0x9A9A, 0x6BAE, 0x9A9B, 0x6BAF, 0x9A9C, 0x6BB0, 0x9A9D, 0x6BB1,\t0x9A9E, 0x6BB2, 0x9A9F, 0x6BB6, 0x9AA0, 0x6BB8, 0x9AA1, 0x6BB9,\n\t0x9AA2, 0x6BBA, 0x9AA3, 0x6BBB, 0x9AA4, 0x6BBC, 0x9AA5, 0x6BBD,\t0x9AA6, 0x6BBE, 0x9AA7, 0x6BC0, 0x9AA8, 0x6BC3, 0x9AA9, 0x6BC4,\n\t0x9AAA, 0x6BC6, 0x9AAB, 0x6BC7, 0x9AAC, 0x6BC8, 0x9AAD, 0x6BC9,\t0x9AAE, 0x6BCA, 0x9AAF, 0x6BCC, 0x9AB0, 0x6BCE, 0x9AB1, 0x6BD0,\n\t0x9AB2, 0x6BD1, 0x9AB3, 0x6BD8, 0x9AB4, 0x6BDA, 0x9AB5, 0x6BDC,\t0x9AB6, 0x6BDD, 0x9AB7, 0x6BDE, 0x9AB8, 0x6BDF, 0x9AB9, 0x6BE0,\n\t0x9ABA, 0x6BE2, 0x9ABB, 0x6BE3, 0x9ABC, 0x6BE4, 0x9ABD, 0x6BE5,\t0x9ABE, 0x6BE6, 0x9ABF, 0x6BE7, 0x9AC0, 0x6BE8, 0x9AC1, 0x6BE9,\n\t0x9AC2, 0x6BEC, 0x9AC3, 0x6BED, 0x9AC4, 0x6BEE, 0x9AC5, 0x6BF0,\t0x9AC6, 0x6BF1, 0x9AC7, 0x6BF2, 0x9AC8, 0x6BF4, 0x9AC9, 0x6BF6,\n\t0x9ACA, 0x6BF7, 0x9ACB, 0x6BF8, 0x9ACC, 0x6BFA, 0x9ACD, 0x6BFB,\t0x9ACE, 0x6BFC, 0x9ACF, 0x6BFE, 0x9AD0, 0x6BFF, 0x9AD1, 0x6C00,\n\t0x9AD2, 0x6C01, 0x9AD3, 0x6C02, 0x9AD4, 0x6C03, 0x9AD5, 0x6C04,\t0x9AD6, 0x6C08, 0x9AD7, 0x6C09, 0x9AD8, 0x6C0A, 0x9AD9, 0x6C0B,\n\t0x9ADA, 0x6C0C, 0x9ADB, 0x6C0E, 0x9ADC, 0x6C12, 0x9ADD, 0x6C17,\t0x9ADE, 0x6C1C, 0x9ADF, 0x6C1D, 0x9AE0, 0x6C1E, 0x9AE1, 0x6C20,\n\t0x9AE2, 0x6C23, 0x9AE3, 0x6C25, 0x9AE4, 0x6C2B, 0x9AE5, 0x6C2C,\t0x9AE6, 0x6C2D, 0x9AE7, 0x6C31, 0x9AE8, 0x6C33, 0x9AE9, 0x6C36,\n\t0x9AEA, 0x6C37, 0x9AEB, 0x6C39, 0x9AEC, 0x6C3A, 0x9AED, 0x6C3B,\t0x9AEE, 0x6C3C, 0x9AEF, 0x6C3E, 0x9AF0, 0x6C3F, 0x9AF1, 0x6C43,\n\t0x9AF2, 0x6C44, 0x9AF3, 0x6C45, 0x9AF4, 0x6C48, 0x9AF5, 0x6C4B,\t0x9AF6, 0x6C4C, 0x9AF7, 0x6C4D, 0x9AF8, 0x6C4E, 0x9AF9, 0x6C4F,\n\t0x9AFA, 0x6C51, 0x9AFB, 0x6C52, 0x9AFC, 0x6C53, 0x9AFD, 0x6C56,\t0x9AFE, 0x6C58, 0x9B40, 0x6C59, 0x9B41, 0x6C5A, 0x9B42, 0x6C62,\n\t0x9B43, 0x6C63, 0x9B44, 0x6C65, 0x9B45, 0x6C66, 0x9B46, 0x6C67,\t0x9B47, 0x6C6B, 0x9B48, 0x6C6C, 0x9B49, 0x6C6D, 0x9B4A, 0x6C6E,\n\t0x9B4B, 0x6C6F, 0x9B4C, 0x6C71, 0x9B4D, 0x6C73, 0x9B4E, 0x6C75,\t0x9B4F, 0x6C77, 0x9B50, 0x6C78, 0x9B51, 0x6C7A, 0x9B52, 0x6C7B,\n\t0x9B53, 0x6C7C, 0x9B54, 0x6C7F, 0x9B55, 0x6C80, 0x9B56, 0x6C84,\t0x9B57, 0x6C87, 0x9B58, 0x6C8A, 0x9B59, 0x6C8B, 0x9B5A, 0x6C8D,\n\t0x9B5B, 0x6C8E, 0x9B5C, 0x6C91, 0x9B5D, 0x6C92, 0x9B5E, 0x6C95,\t0x9B5F, 0x6C96, 0x9B60, 0x6C97, 0x9B61, 0x6C98, 0x9B62, 0x6C9A,\n\t0x9B63, 0x6C9C, 0x9B64, 0x6C9D, 0x9B65, 0x6C9E, 0x9B66, 0x6CA0,\t0x9B67, 0x6CA2, 0x9B68, 0x6CA8, 0x9B69, 0x6CAC, 0x9B6A, 0x6CAF,\n\t0x9B6B, 0x6CB0, 0x9B6C, 0x6CB4, 0x9B6D, 0x6CB5, 0x9B6E, 0x6CB6,\t0x9B6F, 0x6CB7, 0x9B70, 0x6CBA, 0x9B71, 0x6CC0, 0x9B72, 0x6CC1,\n\t0x9B73, 0x6CC2, 0x9B74, 0x6CC3, 0x9B75, 0x6CC6, 0x9B76, 0x6CC7,\t0x9B77, 0x6CC8, 0x9B78, 0x6CCB, 0x9B79, 0x6CCD, 0x9B7A, 0x6CCE,\n\t0x9B7B, 0x6CCF, 0x9B7C, 0x6CD1, 0x9B7D, 0x6CD2, 0x9B7E, 0x6CD8,\t0x9B80, 0x6CD9, 0x9B81, 0x6CDA, 0x9B82, 0x6CDC, 0x9B83, 0x6CDD,\n\t0x9B84, 0x6CDF, 0x9B85, 0x6CE4, 0x9B86, 0x6CE6, 0x9B87, 0x6CE7,\t0x9B88, 0x6CE9, 0x9B89, 0x6CEC, 0x9B8A, 0x6CED, 0x9B8B, 0x6CF2,\n\t0x9B8C, 0x6CF4, 0x9B8D, 0x6CF9, 0x9B8E, 0x6CFF, 0x9B8F, 0x6D00,\t0x9B90, 0x6D02, 0x9B91, 0x6D03, 0x9B92, 0x6D05, 0x9B93, 0x6D06,\n\t0x9B94, 0x6D08, 0x9B95, 0x6D09, 0x9B96, 0x6D0A, 0x9B97, 0x6D0D,\t0x9B98, 0x6D0F, 0x9B99, 0x6D10, 0x9B9A, 0x6D11, 0x9B9B, 0x6D13,\n\t0x9B9C, 0x6D14, 0x9B9D, 0x6D15, 0x9B9E, 0x6D16, 0x9B9F, 0x6D18,\t0x9BA0, 0x6D1C, 0x9BA1, 0x6D1D, 0x9BA2, 0x6D1F, 0x9BA3, 0x6D20,\n\t0x9BA4, 0x6D21, 0x9BA5, 0x6D22, 0x9BA6, 0x6D23, 0x9BA7, 0x6D24,\t0x9BA8, 0x6D26, 0x9BA9, 0x6D28, 0x9BAA, 0x6D29, 0x9BAB, 0x6D2C,\n\t0x9BAC, 0x6D2D, 0x9BAD, 0x6D2F, 0x9BAE, 0x6D30, 0x9BAF, 0x6D34,\t0x9BB0, 0x6D36, 0x9BB1, 0x6D37, 0x9BB2, 0x6D38, 0x9BB3, 0x6D3A,\n\t0x9BB4, 0x6D3F, 0x9BB5, 0x6D40, 0x9BB6, 0x6D42, 0x9BB7, 0x6D44,\t0x9BB8, 0x6D49, 0x9BB9, 0x6D4C, 0x9BBA, 0x6D50, 0x9BBB, 0x6D55,\n\t0x9BBC, 0x6D56, 0x9BBD, 0x6D57, 0x9BBE, 0x6D58, 0x9BBF, 0x6D5B,\t0x9BC0, 0x6D5D, 0x9BC1, 0x6D5F, 0x9BC2, 0x6D61, 0x9BC3, 0x6D62,\n\t0x9BC4, 0x6D64, 0x9BC5, 0x6D65, 0x9BC6, 0x6D67, 0x9BC7, 0x6D68,\t0x9BC8, 0x6D6B, 0x9BC9, 0x6D6C, 0x9BCA, 0x6D6D, 0x9BCB, 0x6D70,\n\t0x9BCC, 0x6D71, 0x9BCD, 0x6D72, 0x9BCE, 0x6D73, 0x9BCF, 0x6D75,\t0x9BD0, 0x6D76, 0x9BD1, 0x6D79, 0x9BD2, 0x6D7A, 0x9BD3, 0x6D7B,\n\t0x9BD4, 0x6D7D, 0x9BD5, 0x6D7E, 0x9BD6, 0x6D7F, 0x9BD7, 0x6D80,\t0x9BD8, 0x6D81, 0x9BD9, 0x6D83, 0x9BDA, 0x6D84, 0x9BDB, 0x6D86,\n\t0x9BDC, 0x6D87, 0x9BDD, 0x6D8A, 0x9BDE, 0x6D8B, 0x9BDF, 0x6D8D,\t0x9BE0, 0x6D8F, 0x9BE1, 0x6D90, 0x9BE2, 0x6D92, 0x9BE3, 0x6D96,\n\t0x9BE4, 0x6D97, 0x9BE5, 0x6D98, 0x9BE6, 0x6D99, 0x9BE7, 0x6D9A,\t0x9BE8, 0x6D9C, 0x9BE9, 0x6DA2, 0x9BEA, 0x6DA5, 0x9BEB, 0x6DAC,\n\t0x9BEC, 0x6DAD, 0x9BED, 0x6DB0, 0x9BEE, 0x6DB1, 0x9BEF, 0x6DB3,\t0x9BF0, 0x6DB4, 0x9BF1, 0x6DB6, 0x9BF2, 0x6DB7, 0x9BF3, 0x6DB9,\n\t0x9BF4, 0x6DBA, 0x9BF5, 0x6DBB, 0x9BF6, 0x6DBC, 0x9BF7, 0x6DBD,\t0x9BF8, 0x6DBE, 0x9BF9, 0x6DC1, 0x9BFA, 0x6DC2, 0x9BFB, 0x6DC3,\n\t0x9BFC, 0x6DC8, 0x9BFD, 0x6DC9, 0x9BFE, 0x6DCA, 0x9C40, 0x6DCD,\t0x9C41, 0x6DCE, 0x9C42, 0x6DCF, 0x9C43, 0x6DD0, 0x9C44, 0x6DD2,\n\t0x9C45, 0x6DD3, 0x9C46, 0x6DD4, 0x9C47, 0x6DD5, 0x9C48, 0x6DD7,\t0x9C49, 0x6DDA, 0x9C4A, 0x6DDB, 0x9C4B, 0x6DDC, 0x9C4C, 0x6DDF,\n\t0x9C4D, 0x6DE2, 0x9C4E, 0x6DE3, 0x9C4F, 0x6DE5, 0x9C50, 0x6DE7,\t0x9C51, 0x6DE8, 0x9C52, 0x6DE9, 0x9C53, 0x6DEA, 0x9C54, 0x6DED,\n\t0x9C55, 0x6DEF, 0x9C56, 0x6DF0, 0x9C57, 0x6DF2, 0x9C58, 0x6DF4,\t0x9C59, 0x6DF5, 0x9C5A, 0x6DF6, 0x9C5B, 0x6DF8, 0x9C5C, 0x6DFA,\n\t0x9C5D, 0x6DFD, 0x9C5E, 0x6DFE, 0x9C5F, 0x6DFF, 0x9C60, 0x6E00,\t0x9C61, 0x6E01, 0x9C62, 0x6E02, 0x9C63, 0x6E03, 0x9C64, 0x6E04,\n\t0x9C65, 0x6E06, 0x9C66, 0x6E07, 0x9C67, 0x6E08, 0x9C68, 0x6E09,\t0x9C69, 0x6E0B, 0x9C6A, 0x6E0F, 0x9C6B, 0x6E12, 0x9C6C, 0x6E13,\n\t0x9C6D, 0x6E15, 0x9C6E, 0x6E18, 0x9C6F, 0x6E19, 0x9C70, 0x6E1B,\t0x9C71, 0x6E1C, 0x9C72, 0x6E1E, 0x9C73, 0x6E1F, 0x9C74, 0x6E22,\n\t0x9C75, 0x6E26, 0x9C76, 0x6E27, 0x9C77, 0x6E28, 0x9C78, 0x6E2A,\t0x9C79, 0x6E2C, 0x9C7A, 0x6E2E, 0x9C7B, 0x6E30, 0x9C7C, 0x6E31,\n\t0x9C7D, 0x6E33, 0x9C7E, 0x6E35, 0x9C80, 0x6E36, 0x9C81, 0x6E37,\t0x9C82, 0x6E39, 0x9C83, 0x6E3B, 0x9C84, 0x6E3C, 0x9C85, 0x6E3D,\n\t0x9C86, 0x6E3E, 0x9C87, 0x6E3F, 0x9C88, 0x6E40, 0x9C89, 0x6E41,\t0x9C8A, 0x6E42, 0x9C8B, 0x6E45, 0x9C8C, 0x6E46, 0x9C8D, 0x6E47,\n\t0x9C8E, 0x6E48, 0x9C8F, 0x6E49, 0x9C90, 0x6E4A, 0x9C91, 0x6E4B,\t0x9C92, 0x6E4C, 0x9C93, 0x6E4F, 0x9C94, 0x6E50, 0x9C95, 0x6E51,\n\t0x9C96, 0x6E52, 0x9C97, 0x6E55, 0x9C98, 0x6E57, 0x9C99, 0x6E59,\t0x9C9A, 0x6E5A, 0x9C9B, 0x6E5C, 0x9C9C, 0x6E5D, 0x9C9D, 0x6E5E,\n\t0x9C9E, 0x6E60, 0x9C9F, 0x6E61, 0x9CA0, 0x6E62, 0x9CA1, 0x6E63,\t0x9CA2, 0x6E64, 0x9CA3, 0x6E65, 0x9CA4, 0x6E66, 0x9CA5, 0x6E67,\n\t0x9CA6, 0x6E68, 0x9CA7, 0x6E69, 0x9CA8, 0x6E6A, 0x9CA9, 0x6E6C,\t0x9CAA, 0x6E6D, 0x9CAB, 0x6E6F, 0x9CAC, 0x6E70, 0x9CAD, 0x6E71,\n\t0x9CAE, 0x6E72, 0x9CAF, 0x6E73, 0x9CB0, 0x6E74, 0x9CB1, 0x6E75,\t0x9CB2, 0x6E76, 0x9CB3, 0x6E77, 0x9CB4, 0x6E78, 0x9CB5, 0x6E79,\n\t0x9CB6, 0x6E7A, 0x9CB7, 0x6E7B, 0x9CB8, 0x6E7C, 0x9CB9, 0x6E7D,\t0x9CBA, 0x6E80, 0x9CBB, 0x6E81, 0x9CBC, 0x6E82, 0x9CBD, 0x6E84,\n\t0x9CBE, 0x6E87, 0x9CBF, 0x6E88, 0x9CC0, 0x6E8A, 0x9CC1, 0x6E8B,\t0x9CC2, 0x6E8C, 0x9CC3, 0x6E8D, 0x9CC4, 0x6E8E, 0x9CC5, 0x6E91,\n\t0x9CC6, 0x6E92, 0x9CC7, 0x6E93, 0x9CC8, 0x6E94, 0x9CC9, 0x6E95,\t0x9CCA, 0x6E96, 0x9CCB, 0x6E97, 0x9CCC, 0x6E99, 0x9CCD, 0x6E9A,\n\t0x9CCE, 0x6E9B, 0x9CCF, 0x6E9D, 0x9CD0, 0x6E9E, 0x9CD1, 0x6EA0,\t0x9CD2, 0x6EA1, 0x9CD3, 0x6EA3, 0x9CD4, 0x6EA4, 0x9CD5, 0x6EA6,\n\t0x9CD6, 0x6EA8, 0x9CD7, 0x6EA9, 0x9CD8, 0x6EAB, 0x9CD9, 0x6EAC,\t0x9CDA, 0x6EAD, 0x9CDB, 0x6EAE, 0x9CDC, 0x6EB0, 0x9CDD, 0x6EB3,\n\t0x9CDE, 0x6EB5, 0x9CDF, 0x6EB8, 0x9CE0, 0x6EB9, 0x9CE1, 0x6EBC,\t0x9CE2, 0x6EBE, 0x9CE3, 0x6EBF, 0x9CE4, 0x6EC0, 0x9CE5, 0x6EC3,\n\t0x9CE6, 0x6EC4, 0x9CE7, 0x6EC5, 0x9CE8, 0x6EC6, 0x9CE9, 0x6EC8,\t0x9CEA, 0x6EC9, 0x9CEB, 0x6ECA, 0x9CEC, 0x6ECC, 0x9CED, 0x6ECD,\n\t0x9CEE, 0x6ECE, 0x9CEF, 0x6ED0, 0x9CF0, 0x6ED2, 0x9CF1, 0x6ED6,\t0x9CF2, 0x6ED8, 0x9CF3, 0x6ED9, 0x9CF4, 0x6EDB, 0x9CF5, 0x6EDC,\n\t0x9CF6, 0x6EDD, 0x9CF7, 0x6EE3, 0x9CF8, 0x6EE7, 0x9CF9, 0x6EEA,\t0x9CFA, 0x6EEB, 0x9CFB, 0x6EEC, 0x9CFC, 0x6EED, 0x9CFD, 0x6EEE,\n\t0x9CFE, 0x6EEF, 0x9D40, 0x6EF0, 0x9D41, 0x6EF1, 0x9D42, 0x6EF2,\t0x9D43, 0x6EF3, 0x9D44, 0x6EF5, 0x9D45, 0x6EF6, 0x9D46, 0x6EF7,\n\t0x9D47, 0x6EF8, 0x9D48, 0x6EFA, 0x9D49, 0x6EFB, 0x9D4A, 0x6EFC,\t0x9D4B, 0x6EFD, 0x9D4C, 0x6EFE, 0x9D4D, 0x6EFF, 0x9D4E, 0x6F00,\n\t0x9D4F, 0x6F01, 0x9D50, 0x6F03, 0x9D51, 0x6F04, 0x9D52, 0x6F05,\t0x9D53, 0x6F07, 0x9D54, 0x6F08, 0x9D55, 0x6F0A, 0x9D56, 0x6F0B,\n\t0x9D57, 0x6F0C, 0x9D58, 0x6F0D, 0x9D59, 0x6F0E, 0x9D5A, 0x6F10,\t0x9D5B, 0x6F11, 0x9D5C, 0x6F12, 0x9D5D, 0x6F16, 0x9D5E, 0x6F17,\n\t0x9D5F, 0x6F18, 0x9D60, 0x6F19, 0x9D61, 0x6F1A, 0x9D62, 0x6F1B,\t0x9D63, 0x6F1C, 0x9D64, 0x6F1D, 0x9D65, 0x6F1E, 0x9D66, 0x6F1F,\n\t0x9D67, 0x6F21, 0x9D68, 0x6F22, 0x9D69, 0x6F23, 0x9D6A, 0x6F25,\t0x9D6B, 0x6F26, 0x9D6C, 0x6F27, 0x9D6D, 0x6F28, 0x9D6E, 0x6F2C,\n\t0x9D6F, 0x6F2E, 0x9D70, 0x6F30, 0x9D71, 0x6F32, 0x9D72, 0x6F34,\t0x9D73, 0x6F35, 0x9D74, 0x6F37, 0x9D75, 0x6F38, 0x9D76, 0x6F39,\n\t0x9D77, 0x6F3A, 0x9D78, 0x6F3B, 0x9D79, 0x6F3C, 0x9D7A, 0x6F3D,\t0x9D7B, 0x6F3F, 0x9D7C, 0x6F40, 0x9D7D, 0x6F41, 0x9D7E, 0x6F42,\n\t0x9D80, 0x6F43, 0x9D81, 0x6F44, 0x9D82, 0x6F45, 0x9D83, 0x6F48,\t0x9D84, 0x6F49, 0x9D85, 0x6F4A, 0x9D86, 0x6F4C, 0x9D87, 0x6F4E,\n\t0x9D88, 0x6F4F, 0x9D89, 0x6F50, 0x9D8A, 0x6F51, 0x9D8B, 0x6F52,\t0x9D8C, 0x6F53, 0x9D8D, 0x6F54, 0x9D8E, 0x6F55, 0x9D8F, 0x6F56,\n\t0x9D90, 0x6F57, 0x9D91, 0x6F59, 0x9D92, 0x6F5A, 0x9D93, 0x6F5B,\t0x9D94, 0x6F5D, 0x9D95, 0x6F5F, 0x9D96, 0x6F60, 0x9D97, 0x6F61,\n\t0x9D98, 0x6F63, 0x9D99, 0x6F64, 0x9D9A, 0x6F65, 0x9D9B, 0x6F67,\t0x9D9C, 0x6F68, 0x9D9D, 0x6F69, 0x9D9E, 0x6F6A, 0x9D9F, 0x6F6B,\n\t0x9DA0, 0x6F6C, 0x9DA1, 0x6F6F, 0x9DA2, 0x6F70, 0x9DA3, 0x6F71,\t0x9DA4, 0x6F73, 0x9DA5, 0x6F75, 0x9DA6, 0x6F76, 0x9DA7, 0x6F77,\n\t0x9DA8, 0x6F79, 0x9DA9, 0x6F7B, 0x9DAA, 0x6F7D, 0x9DAB, 0x6F7E,\t0x9DAC, 0x6F7F, 0x9DAD, 0x6F80, 0x9DAE, 0x6F81, 0x9DAF, 0x6F82,\n\t0x9DB0, 0x6F83, 0x9DB1, 0x6F85, 0x9DB2, 0x6F86, 0x9DB3, 0x6F87,\t0x9DB4, 0x6F8A, 0x9DB5, 0x6F8B, 0x9DB6, 0x6F8F, 0x9DB7, 0x6F90,\n\t0x9DB8, 0x6F91, 0x9DB9, 0x6F92, 0x9DBA, 0x6F93, 0x9DBB, 0x6F94,\t0x9DBC, 0x6F95, 0x9DBD, 0x6F96, 0x9DBE, 0x6F97, 0x9DBF, 0x6F98,\n\t0x9DC0, 0x6F99, 0x9DC1, 0x6F9A, 0x9DC2, 0x6F9B, 0x9DC3, 0x6F9D,\t0x9DC4, 0x6F9E, 0x9DC5, 0x6F9F, 0x9DC6, 0x6FA0, 0x9DC7, 0x6FA2,\n\t0x9DC8, 0x6FA3, 0x9DC9, 0x6FA4, 0x9DCA, 0x6FA5, 0x9DCB, 0x6FA6,\t0x9DCC, 0x6FA8, 0x9DCD, 0x6FA9, 0x9DCE, 0x6FAA, 0x9DCF, 0x6FAB,\n\t0x9DD0, 0x6FAC, 0x9DD1, 0x6FAD, 0x9DD2, 0x6FAE, 0x9DD3, 0x6FAF,\t0x9DD4, 0x6FB0, 0x9DD5, 0x6FB1, 0x9DD6, 0x6FB2, 0x9DD7, 0x6FB4,\n\t0x9DD8, 0x6FB5, 0x9DD9, 0x6FB7, 0x9DDA, 0x6FB8, 0x9DDB, 0x6FBA,\t0x9DDC, 0x6FBB, 0x9DDD, 0x6FBC, 0x9DDE, 0x6FBD, 0x9DDF, 0x6FBE,\n\t0x9DE0, 0x6FBF, 0x9DE1, 0x6FC1, 0x9DE2, 0x6FC3, 0x9DE3, 0x6FC4,\t0x9DE4, 0x6FC5, 0x9DE5, 0x6FC6, 0x9DE6, 0x6FC7, 0x9DE7, 0x6FC8,\n\t0x9DE8, 0x6FCA, 0x9DE9, 0x6FCB, 0x9DEA, 0x6FCC, 0x9DEB, 0x6FCD,\t0x9DEC, 0x6FCE, 0x9DED, 0x6FCF, 0x9DEE, 0x6FD0, 0x9DEF, 0x6FD3,\n\t0x9DF0, 0x6FD4, 0x9DF1, 0x6FD5, 0x9DF2, 0x6FD6, 0x9DF3, 0x6FD7,\t0x9DF4, 0x6FD8, 0x9DF5, 0x6FD9, 0x9DF6, 0x6FDA, 0x9DF7, 0x6FDB,\n\t0x9DF8, 0x6FDC, 0x9DF9, 0x6FDD, 0x9DFA, 0x6FDF, 0x9DFB, 0x6FE2,\t0x9DFC, 0x6FE3, 0x9DFD, 0x6FE4, 0x9DFE, 0x6FE5, 0x9E40, 0x6FE6,\n\t0x9E41, 0x6FE7, 0x9E42, 0x6FE8, 0x9E43, 0x6FE9, 0x9E44, 0x6FEA,\t0x9E45, 0x6FEB, 0x9E46, 0x6FEC, 0x9E47, 0x6FED, 0x9E48, 0x6FF0,\n\t0x9E49, 0x6FF1, 0x9E4A, 0x6FF2, 0x9E4B, 0x6FF3, 0x9E4C, 0x6FF4,\t0x9E4D, 0x6FF5, 0x9E4E, 0x6FF6, 0x9E4F, 0x6FF7, 0x9E50, 0x6FF8,\n\t0x9E51, 0x6FF9, 0x9E52, 0x6FFA, 0x9E53, 0x6FFB, 0x9E54, 0x6FFC,\t0x9E55, 0x6FFD, 0x9E56, 0x6FFE, 0x9E57, 0x6FFF, 0x9E58, 0x7000,\n\t0x9E59, 0x7001, 0x9E5A, 0x7002, 0x9E5B, 0x7003, 0x9E5C, 0x7004,\t0x9E5D, 0x7005, 0x9E5E, 0x7006, 0x9E5F, 0x7007, 0x9E60, 0x7008,\n\t0x9E61, 0x7009, 0x9E62, 0x700A, 0x9E63, 0x700B, 0x9E64, 0x700C,\t0x9E65, 0x700D, 0x9E66, 0x700E, 0x9E67, 0x700F, 0x9E68, 0x7010,\n\t0x9E69, 0x7012, 0x9E6A, 0x7013, 0x9E6B, 0x7014, 0x9E6C, 0x7015,\t0x9E6D, 0x7016, 0x9E6E, 0x7017, 0x9E6F, 0x7018, 0x9E70, 0x7019,\n\t0x9E71, 0x701C, 0x9E72, 0x701D, 0x9E73, 0x701E, 0x9E74, 0x701F,\t0x9E75, 0x7020, 0x9E76, 0x7021, 0x9E77, 0x7022, 0x9E78, 0x7024,\n\t0x9E79, 0x7025, 0x9E7A, 0x7026, 0x9E7B, 0x7027, 0x9E7C, 0x7028,\t0x9E7D, 0x7029, 0x9E7E, 0x702A, 0x9E80, 0x702B, 0x9E81, 0x702C,\n\t0x9E82, 0x702D, 0x9E83, 0x702E, 0x9E84, 0x702F, 0x9E85, 0x7030,\t0x9E86, 0x7031, 0x9E87, 0x7032, 0x9E88, 0x7033, 0x9E89, 0x7034,\n\t0x9E8A, 0x7036, 0x9E8B, 0x7037, 0x9E8C, 0x7038, 0x9E8D, 0x703A,\t0x9E8E, 0x703B, 0x9E8F, 0x703C, 0x9E90, 0x703D, 0x9E91, 0x703E,\n\t0x9E92, 0x703F, 0x9E93, 0x7040, 0x9E94, 0x7041, 0x9E95, 0x7042,\t0x9E96, 0x7043, 0x9E97, 0x7044, 0x9E98, 0x7045, 0x9E99, 0x7046,\n\t0x9E9A, 0x7047, 0x9E9B, 0x7048, 0x9E9C, 0x7049, 0x9E9D, 0x704A,\t0x9E9E, 0x704B, 0x9E9F, 0x704D, 0x9EA0, 0x704E, 0x9EA1, 0x7050,\n\t0x9EA2, 0x7051, 0x9EA3, 0x7052, 0x9EA4, 0x7053, 0x9EA5, 0x7054,\t0x9EA6, 0x7055, 0x9EA7, 0x7056, 0x9EA8, 0x7057, 0x9EA9, 0x7058,\n\t0x9EAA, 0x7059, 0x9EAB, 0x705A, 0x9EAC, 0x705B, 0x9EAD, 0x705C,\t0x9EAE, 0x705D, 0x9EAF, 0x705F, 0x9EB0, 0x7060, 0x9EB1, 0x7061,\n\t0x9EB2, 0x7062, 0x9EB3, 0x7063, 0x9EB4, 0x7064, 0x9EB5, 0x7065,\t0x9EB6, 0x7066, 0x9EB7, 0x7067, 0x9EB8, 0x7068, 0x9EB9, 0x7069,\n\t0x9EBA, 0x706A, 0x9EBB, 0x706E, 0x9EBC, 0x7071, 0x9EBD, 0x7072,\t0x9EBE, 0x7073, 0x9EBF, 0x7074, 0x9EC0, 0x7077, 0x9EC1, 0x7079,\n\t0x9EC2, 0x707A, 0x9EC3, 0x707B, 0x9EC4, 0x707D, 0x9EC5, 0x7081,\t0x9EC6, 0x7082, 0x9EC7, 0x7083, 0x9EC8, 0x7084, 0x9EC9, 0x7086,\n\t0x9ECA, 0x7087, 0x9ECB, 0x7088, 0x9ECC, 0x708B, 0x9ECD, 0x708C,\t0x9ECE, 0x708D, 0x9ECF, 0x708F, 0x9ED0, 0x7090, 0x9ED1, 0x7091,\n\t0x9ED2, 0x7093, 0x9ED3, 0x7097, 0x9ED4, 0x7098, 0x9ED5, 0x709A,\t0x9ED6, 0x709B, 0x9ED7, 0x709E, 0x9ED8, 0x709F, 0x9ED9, 0x70A0,\n\t0x9EDA, 0x70A1, 0x9EDB, 0x70A2, 0x9EDC, 0x70A3, 0x9EDD, 0x70A4,\t0x9EDE, 0x70A5, 0x9EDF, 0x70A6, 0x9EE0, 0x70A7, 0x9EE1, 0x70A8,\n\t0x9EE2, 0x70A9, 0x9EE3, 0x70AA, 0x9EE4, 0x70B0, 0x9EE5, 0x70B2,\t0x9EE6, 0x70B4, 0x9EE7, 0x70B5, 0x9EE8, 0x70B6, 0x9EE9, 0x70BA,\n\t0x9EEA, 0x70BE, 0x9EEB, 0x70BF, 0x9EEC, 0x70C4, 0x9EED, 0x70C5,\t0x9EEE, 0x70C6, 0x9EEF, 0x70C7, 0x9EF0, 0x70C9, 0x9EF1, 0x70CB,\n\t0x9EF2, 0x70CC, 0x9EF3, 0x70CD, 0x9EF4, 0x70CE, 0x9EF5, 0x70CF,\t0x9EF6, 0x70D0, 0x9EF7, 0x70D1, 0x9EF8, 0x70D2, 0x9EF9, 0x70D3,\n\t0x9EFA, 0x70D4, 0x9EFB, 0x70D5, 0x9EFC, 0x70D6, 0x9EFD, 0x70D7,\t0x9EFE, 0x70DA, 0x9F40, 0x70DC, 0x9F41, 0x70DD, 0x9F42, 0x70DE,\n\t0x9F43, 0x70E0, 0x9F44, 0x70E1, 0x9F45, 0x70E2, 0x9F46, 0x70E3,\t0x9F47, 0x70E5, 0x9F48, 0x70EA, 0x9F49, 0x70EE, 0x9F4A, 0x70F0,\n\t0x9F4B, 0x70F1, 0x9F4C, 0x70F2, 0x9F4D, 0x70F3, 0x9F4E, 0x70F4,\t0x9F4F, 0x70F5, 0x9F50, 0x70F6, 0x9F51, 0x70F8, 0x9F52, 0x70FA,\n\t0x9F53, 0x70FB, 0x9F54, 0x70FC, 0x9F55, 0x70FE, 0x9F56, 0x70FF,\t0x9F57, 0x7100, 0x9F58, 0x7101, 0x9F59, 0x7102, 0x9F5A, 0x7103,\n\t0x9F5B, 0x7104, 0x9F5C, 0x7105, 0x9F5D, 0x7106, 0x9F5E, 0x7107,\t0x9F5F, 0x7108, 0x9F60, 0x710B, 0x9F61, 0x710C, 0x9F62, 0x710D,\n\t0x9F63, 0x710E, 0x9F64, 0x710F, 0x9F65, 0x7111, 0x9F66, 0x7112,\t0x9F67, 0x7114, 0x9F68, 0x7117, 0x9F69, 0x711B, 0x9F6A, 0x711C,\n\t0x9F6B, 0x711D, 0x9F6C, 0x711E, 0x9F6D, 0x711F, 0x9F6E, 0x7120,\t0x9F6F, 0x7121, 0x9F70, 0x7122, 0x9F71, 0x7123, 0x9F72, 0x7124,\n\t0x9F73, 0x7125, 0x9F74, 0x7127, 0x9F75, 0x7128, 0x9F76, 0x7129,\t0x9F77, 0x712A, 0x9F78, 0x712B, 0x9F79, 0x712C, 0x9F7A, 0x712D,\n\t0x9F7B, 0x712E, 0x9F7C, 0x7132, 0x9F7D, 0x7133, 0x9F7E, 0x7134,\t0x9F80, 0x7135, 0x9F81, 0x7137, 0x9F82, 0x7138, 0x9F83, 0x7139,\n\t0x9F84, 0x713A, 0x9F85, 0x713B, 0x9F86, 0x713C, 0x9F87, 0x713D,\t0x9F88, 0x713E, 0x9F89, 0x713F, 0x9F8A, 0x7140, 0x9F8B, 0x7141,\n\t0x9F8C, 0x7142, 0x9F8D, 0x7143, 0x9F8E, 0x7144, 0x9F8F, 0x7146,\t0x9F90, 0x7147, 0x9F91, 0x7148, 0x9F92, 0x7149, 0x9F93, 0x714B,\n\t0x9F94, 0x714D, 0x9F95, 0x714F, 0x9F96, 0x7150, 0x9F97, 0x7151,\t0x9F98, 0x7152, 0x9F99, 0x7153, 0x9F9A, 0x7154, 0x9F9B, 0x7155,\n\t0x9F9C, 0x7156, 0x9F9D, 0x7157, 0x9F9E, 0x7158, 0x9F9F, 0x7159,\t0x9FA0, 0x715A, 0x9FA1, 0x715B, 0x9FA2, 0x715D, 0x9FA3, 0x715F,\n\t0x9FA4, 0x7160, 0x9FA5, 0x7161, 0x9FA6, 0x7162, 0x9FA7, 0x7163,\t0x9FA8, 0x7165, 0x9FA9, 0x7169, 0x9FAA, 0x716A, 0x9FAB, 0x716B,\n\t0x9FAC, 0x716C, 0x9FAD, 0x716D, 0x9FAE, 0x716F, 0x9FAF, 0x7170,\t0x9FB0, 0x7171, 0x9FB1, 0x7174, 0x9FB2, 0x7175, 0x9FB3, 0x7176,\n\t0x9FB4, 0x7177, 0x9FB5, 0x7179, 0x9FB6, 0x717B, 0x9FB7, 0x717C,\t0x9FB8, 0x717E, 0x9FB9, 0x717F, 0x9FBA, 0x7180, 0x9FBB, 0x7181,\n\t0x9FBC, 0x7182, 0x9FBD, 0x7183, 0x9FBE, 0x7185, 0x9FBF, 0x7186,\t0x9FC0, 0x7187, 0x9FC1, 0x7188, 0x9FC2, 0x7189, 0x9FC3, 0x718B,\n\t0x9FC4, 0x718C, 0x9FC5, 0x718D, 0x9FC6, 0x718E, 0x9FC7, 0x7190,\t0x9FC8, 0x7191, 0x9FC9, 0x7192, 0x9FCA, 0x7193, 0x9FCB, 0x7195,\n\t0x9FCC, 0x7196, 0x9FCD, 0x7197, 0x9FCE, 0x719A, 0x9FCF, 0x719B,\t0x9FD0, 0x719C, 0x9FD1, 0x719D, 0x9FD2, 0x719E, 0x9FD3, 0x71A1,\n\t0x9FD4, 0x71A2, 0x9FD5, 0x71A3, 0x9FD6, 0x71A4, 0x9FD7, 0x71A5,\t0x9FD8, 0x71A6, 0x9FD9, 0x71A7, 0x9FDA, 0x71A9, 0x9FDB, 0x71AA,\n\t0x9FDC, 0x71AB, 0x9FDD, 0x71AD, 0x9FDE, 0x71AE, 0x9FDF, 0x71AF,\t0x9FE0, 0x71B0, 0x9FE1, 0x71B1, 0x9FE2, 0x71B2, 0x9FE3, 0x71B4,\n\t0x9FE4, 0x71B6, 0x9FE5, 0x71B7, 0x9FE6, 0x71B8, 0x9FE7, 0x71BA,\t0x9FE8, 0x71BB, 0x9FE9, 0x71BC, 0x9FEA, 0x71BD, 0x9FEB, 0x71BE,\n\t0x9FEC, 0x71BF, 0x9FED, 0x71C0, 0x9FEE, 0x71C1, 0x9FEF, 0x71C2,\t0x9FF0, 0x71C4, 0x9FF1, 0x71C5, 0x9FF2, 0x71C6, 0x9FF3, 0x71C7,\n\t0x9FF4, 0x71C8, 0x9FF5, 0x71C9, 0x9FF6, 0x71CA, 0x9FF7, 0x71CB,\t0x9FF8, 0x71CC, 0x9FF9, 0x71CD, 0x9FFA, 0x71CF, 0x9FFB, 0x71D0,\n\t0x9FFC, 0x71D1, 0x9FFD, 0x71D2, 0x9FFE, 0x71D3, 0xA040, 0x71D6,\t0xA041, 0x71D7, 0xA042, 0x71D8, 0xA043, 0x71D9, 0xA044, 0x71DA,\n\t0xA045, 0x71DB, 0xA046, 0x71DC, 0xA047, 0x71DD, 0xA048, 0x71DE,\t0xA049, 0x71DF, 0xA04A, 0x71E1, 0xA04B, 0x71E2, 0xA04C, 0x71E3,\n\t0xA04D, 0x71E4, 0xA04E, 0x71E6, 0xA04F, 0x71E8, 0xA050, 0x71E9,\t0xA051, 0x71EA, 0xA052, 0x71EB, 0xA053, 0x71EC, 0xA054, 0x71ED,\n\t0xA055, 0x71EF, 0xA056, 0x71F0, 0xA057, 0x71F1, 0xA058, 0x71F2,\t0xA059, 0x71F3, 0xA05A, 0x71F4, 0xA05B, 0x71F5, 0xA05C, 0x71F6,\n\t0xA05D, 0x71F7, 0xA05E, 0x71F8, 0xA05F, 0x71FA, 0xA060, 0x71FB,\t0xA061, 0x71FC, 0xA062, 0x71FD, 0xA063, 0x71FE, 0xA064, 0x71FF,\n\t0xA065, 0x7200, 0xA066, 0x7201, 0xA067, 0x7202, 0xA068, 0x7203,\t0xA069, 0x7204, 0xA06A, 0x7205, 0xA06B, 0x7207, 0xA06C, 0x7208,\n\t0xA06D, 0x7209, 0xA06E, 0x720A, 0xA06F, 0x720B, 0xA070, 0x720C,\t0xA071, 0x720D, 0xA072, 0x720E, 0xA073, 0x720F, 0xA074, 0x7210,\n\t0xA075, 0x7211, 0xA076, 0x7212, 0xA077, 0x7213, 0xA078, 0x7214,\t0xA079, 0x7215, 0xA07A, 0x7216, 0xA07B, 0x7217, 0xA07C, 0x7218,\n\t0xA07D, 0x7219, 0xA07E, 0x721A, 0xA080, 0x721B, 0xA081, 0x721C,\t0xA082, 0x721E, 0xA083, 0x721F, 0xA084, 0x7220, 0xA085, 0x7221,\n\t0xA086, 0x7222, 0xA087, 0x7223, 0xA088, 0x7224, 0xA089, 0x7225,\t0xA08A, 0x7226, 0xA08B, 0x7227, 0xA08C, 0x7229, 0xA08D, 0x722B,\n\t0xA08E, 0x722D, 0xA08F, 0x722E, 0xA090, 0x722F, 0xA091, 0x7232,\t0xA092, 0x7233, 0xA093, 0x7234, 0xA094, 0x723A, 0xA095, 0x723C,\n\t0xA096, 0x723E, 0xA097, 0x7240, 0xA098, 0x7241, 0xA099, 0x7242,\t0xA09A, 0x7243, 0xA09B, 0x7244, 0xA09C, 0x7245, 0xA09D, 0x7246,\n\t0xA09E, 0x7249, 0xA09F, 0x724A, 0xA0A0, 0x724B, 0xA0A1, 0x724E,\t0xA0A2, 0x724F, 0xA0A3, 0x7250, 0xA0A4, 0x7251, 0xA0A5, 0x7253,\n\t0xA0A6, 0x7254, 0xA0A7, 0x7255, 0xA0A8, 0x7257, 0xA0A9, 0x7258,\t0xA0AA, 0x725A, 0xA0AB, 0x725C, 0xA0AC, 0x725E, 0xA0AD, 0x7260,\n\t0xA0AE, 0x7263, 0xA0AF, 0x7264, 0xA0B0, 0x7265, 0xA0B1, 0x7268,\t0xA0B2, 0x726A, 0xA0B3, 0x726B, 0xA0B4, 0x726C, 0xA0B5, 0x726D,\n\t0xA0B6, 0x7270, 0xA0B7, 0x7271, 0xA0B8, 0x7273, 0xA0B9, 0x7274,\t0xA0BA, 0x7276, 0xA0BB, 0x7277, 0xA0BC, 0x7278, 0xA0BD, 0x727B,\n\t0xA0BE, 0x727C, 0xA0BF, 0x727D, 0xA0C0, 0x7282, 0xA0C1, 0x7283,\t0xA0C2, 0x7285, 0xA0C3, 0x7286, 0xA0C4, 0x7287, 0xA0C5, 0x7288,\n\t0xA0C6, 0x7289, 0xA0C7, 0x728C, 0xA0C8, 0x728E, 0xA0C9, 0x7290,\t0xA0CA, 0x7291, 0xA0CB, 0x7293, 0xA0CC, 0x7294, 0xA0CD, 0x7295,\n\t0xA0CE, 0x7296, 0xA0CF, 0x7297, 0xA0D0, 0x7298, 0xA0D1, 0x7299,\t0xA0D2, 0x729A, 0xA0D3, 0x729B, 0xA0D4, 0x729C, 0xA0D5, 0x729D,\n\t0xA0D6, 0x729E, 0xA0D7, 0x72A0, 0xA0D8, 0x72A1, 0xA0D9, 0x72A2,\t0xA0DA, 0x72A3, 0xA0DB, 0x72A4, 0xA0DC, 0x72A5, 0xA0DD, 0x72A6,\n\t0xA0DE, 0x72A7, 0xA0DF, 0x72A8, 0xA0E0, 0x72A9, 0xA0E1, 0x72AA,\t0xA0E2, 0x72AB, 0xA0E3, 0x72AE, 0xA0E4, 0x72B1, 0xA0E5, 0x72B2,\n\t0xA0E6, 0x72B3, 0xA0E7, 0x72B5, 0xA0E8, 0x72BA, 0xA0E9, 0x72BB,\t0xA0EA, 0x72BC, 0xA0EB, 0x72BD, 0xA0EC, 0x72BE, 0xA0ED, 0x72BF,\n\t0xA0EE, 0x72C0, 0xA0EF, 0x72C5, 0xA0F0, 0x72C6, 0xA0F1, 0x72C7,\t0xA0F2, 0x72C9, 0xA0F3, 0x72CA, 0xA0F4, 0x72CB, 0xA0F5, 0x72CC,\n\t0xA0F6, 0x72CF, 0xA0F7, 0x72D1, 0xA0F8, 0x72D3, 0xA0F9, 0x72D4,\t0xA0FA, 0x72D5, 0xA0FB, 0x72D6, 0xA0FC, 0x72D8, 0xA0FD, 0x72DA,\n\t0xA0FE, 0x72DB, 0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002,\t0xA1A4, 0x00B7, 0xA1A5, 0x02C9, 0xA1A6, 0x02C7, 0xA1A7, 0x00A8,\n\t0xA1A8, 0x3003, 0xA1A9, 0x3005, 0xA1AA, 0x2014, 0xA1AB, 0xFF5E,\t0xA1AC, 0x2016, 0xA1AD, 0x2026, 0xA1AE, 0x2018, 0xA1AF, 0x2019,\n\t0xA1B0, 0x201C, 0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015,\t0xA1B4, 0x3008, 0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B,\n\t0xA1B8, 0x300C, 0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F,\t0xA1BC, 0x3016, 0xA1BD, 0x3017, 0xA1BE, 0x3010, 0xA1BF, 0x3011,\n\t0xA1C0, 0x00B1, 0xA1C1, 0x00D7, 0xA1C2, 0x00F7, 0xA1C3, 0x2236,\t0xA1C4, 0x2227, 0xA1C5, 0x2228, 0xA1C6, 0x2211, 0xA1C7, 0x220F,\n\t0xA1C8, 0x222A, 0xA1C9, 0x2229, 0xA1CA, 0x2208, 0xA1CB, 0x2237,\t0xA1CC, 0x221A, 0xA1CD, 0x22A5, 0xA1CE, 0x2225, 0xA1CF, 0x2220,\n\t0xA1D0, 0x2312, 0xA1D1, 0x2299, 0xA1D2, 0x222B, 0xA1D3, 0x222E,\t0xA1D4, 0x2261, 0xA1D5, 0x224C, 0xA1D6, 0x2248, 0xA1D7, 0x223D,\n\t0xA1D8, 0x221D, 0xA1D9, 0x2260, 0xA1DA, 0x226E, 0xA1DB, 0x226F,\t0xA1DC, 0x2264, 0xA1DD, 0x2265, 0xA1DE, 0x221E, 0xA1DF, 0x2235,\n\t0xA1E0, 0x2234, 0xA1E1, 0x2642, 0xA1E2, 0x2640, 0xA1E3, 0x00B0,\t0xA1E4, 0x2032, 0xA1E5, 0x2033, 0xA1E6, 0x2103, 0xA1E7, 0xFF04,\n\t0xA1E8, 0x00A4, 0xA1E9, 0xFFE0, 0xA1EA, 0xFFE1, 0xA1EB, 0x2030,\t0xA1EC, 0x00A7, 0xA1ED, 0x2116, 0xA1EE, 0x2606, 0xA1EF, 0x2605,\n\t0xA1F0, 0x25CB, 0xA1F1, 0x25CF, 0xA1F2, 0x25CE, 0xA1F3, 0x25C7,\t0xA1F4, 0x25C6, 0xA1F5, 0x25A1, 0xA1F6, 0x25A0, 0xA1F7, 0x25B3,\n\t0xA1F8, 0x25B2, 0xA1F9, 0x203B, 0xA1FA, 0x2192, 0xA1FB, 0x2190,\t0xA1FC, 0x2191, 0xA1FD, 0x2193, 0xA1FE, 0x3013, 0xA2A1, 0x2170,\n\t0xA2A2, 0x2171, 0xA2A3, 0x2172, 0xA2A4, 0x2173, 0xA2A5, 0x2174,\t0xA2A6, 0x2175, 0xA2A7, 0x2176, 0xA2A8, 0x2177, 0xA2A9, 0x2178,\n\t0xA2AA, 0x2179, 0xA2B1, 0x2488, 0xA2B2, 0x2489, 0xA2B3, 0x248A,\t0xA2B4, 0x248B, 0xA2B5, 0x248C, 0xA2B6, 0x248D, 0xA2B7, 0x248E,\n\t0xA2B8, 0x248F, 0xA2B9, 0x2490, 0xA2BA, 0x2491, 0xA2BB, 0x2492,\t0xA2BC, 0x2493, 0xA2BD, 0x2494, 0xA2BE, 0x2495, 0xA2BF, 0x2496,\n\t0xA2C0, 0x2497, 0xA2C1, 0x2498, 0xA2C2, 0x2499, 0xA2C3, 0x249A,\t0xA2C4, 0x249B, 0xA2C5, 0x2474, 0xA2C6, 0x2475, 0xA2C7, 0x2476,\n\t0xA2C8, 0x2477, 0xA2C9, 0x2478, 0xA2CA, 0x2479, 0xA2CB, 0x247A,\t0xA2CC, 0x247B, 0xA2CD, 0x247C, 0xA2CE, 0x247D, 0xA2CF, 0x247E,\n\t0xA2D0, 0x247F, 0xA2D1, 0x2480, 0xA2D2, 0x2481, 0xA2D3, 0x2482,\t0xA2D4, 0x2483, 0xA2D5, 0x2484, 0xA2D6, 0x2485, 0xA2D7, 0x2486,\n\t0xA2D8, 0x2487, 0xA2D9, 0x2460, 0xA2DA, 0x2461, 0xA2DB, 0x2462,\t0xA2DC, 0x2463, 0xA2DD, 0x2464, 0xA2DE, 0x2465, 0xA2DF, 0x2466,\n\t0xA2E0, 0x2467, 0xA2E1, 0x2468, 0xA2E2, 0x2469, 0xA2E5, 0x3220,\t0xA2E6, 0x3221, 0xA2E7, 0x3222, 0xA2E8, 0x3223, 0xA2E9, 0x3224,\n\t0xA2EA, 0x3225, 0xA2EB, 0x3226, 0xA2EC, 0x3227, 0xA2ED, 0x3228,\t0xA2EE, 0x3229, 0xA2F1, 0x2160, 0xA2F2, 0x2161, 0xA2F3, 0x2162,\n\t0xA2F4, 0x2163, 0xA2F5, 0x2164, 0xA2F6, 0x2165, 0xA2F7, 0x2166,\t0xA2F8, 0x2167, 0xA2F9, 0x2168, 0xA2FA, 0x2169, 0xA2FB, 0x216A,\n\t0xA2FC, 0x216B, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03,\t0xA3A4, 0xFFE5, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07,\n\t0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B,\t0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F,\n\t0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13,\t0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17,\n\t0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B,\t0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F,\n\t0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23,\t0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27,\n\t0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B,\t0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F,\n\t0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33,\t0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37,\n\t0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B,\t0xA3DC, 0xFF3C, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F,\n\t0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43,\t0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47,\n\t0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B,\t0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F,\n\t0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53,\t0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57,\n\t0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B,\t0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA4A1, 0x3041,\n\t0xA4A2, 0x3042, 0xA4A3, 0x3043, 0xA4A4, 0x3044, 0xA4A5, 0x3045,\t0xA4A6, 0x3046, 0xA4A7, 0x3047, 0xA4A8, 0x3048, 0xA4A9, 0x3049,\n\t0xA4AA, 0x304A, 0xA4AB, 0x304B, 0xA4AC, 0x304C, 0xA4AD, 0x304D,\t0xA4AE, 0x304E, 0xA4AF, 0x304F, 0xA4B0, 0x3050, 0xA4B1, 0x3051,\n\t0xA4B2, 0x3052, 0xA4B3, 0x3053, 0xA4B4, 0x3054, 0xA4B5, 0x3055,\t0xA4B6, 0x3056, 0xA4B7, 0x3057, 0xA4B8, 0x3058, 0xA4B9, 0x3059,\n\t0xA4BA, 0x305A, 0xA4BB, 0x305B, 0xA4BC, 0x305C, 0xA4BD, 0x305D,\t0xA4BE, 0x305E, 0xA4BF, 0x305F, 0xA4C0, 0x3060, 0xA4C1, 0x3061,\n\t0xA4C2, 0x3062, 0xA4C3, 0x3063, 0xA4C4, 0x3064, 0xA4C5, 0x3065,\t0xA4C6, 0x3066, 0xA4C7, 0x3067, 0xA4C8, 0x3068, 0xA4C9, 0x3069,\n\t0xA4CA, 0x306A, 0xA4CB, 0x306B, 0xA4CC, 0x306C, 0xA4CD, 0x306D,\t0xA4CE, 0x306E, 0xA4CF, 0x306F, 0xA4D0, 0x3070, 0xA4D1, 0x3071,\n\t0xA4D2, 0x3072, 0xA4D3, 0x3073, 0xA4D4, 0x3074, 0xA4D5, 0x3075,\t0xA4D6, 0x3076, 0xA4D7, 0x3077, 0xA4D8, 0x3078, 0xA4D9, 0x3079,\n\t0xA4DA, 0x307A, 0xA4DB, 0x307B, 0xA4DC, 0x307C, 0xA4DD, 0x307D,\t0xA4DE, 0x307E, 0xA4DF, 0x307F, 0xA4E0, 0x3080, 0xA4E1, 0x3081,\n\t0xA4E2, 0x3082, 0xA4E3, 0x3083, 0xA4E4, 0x3084, 0xA4E5, 0x3085,\t0xA4E6, 0x3086, 0xA4E7, 0x3087, 0xA4E8, 0x3088, 0xA4E9, 0x3089,\n\t0xA4EA, 0x308A, 0xA4EB, 0x308B, 0xA4EC, 0x308C, 0xA4ED, 0x308D,\t0xA4EE, 0x308E, 0xA4EF, 0x308F, 0xA4F0, 0x3090, 0xA4F1, 0x3091,\n\t0xA4F2, 0x3092, 0xA4F3, 0x3093, 0xA5A1, 0x30A1, 0xA5A2, 0x30A2,\t0xA5A3, 0x30A3, 0xA5A4, 0x30A4, 0xA5A5, 0x30A5, 0xA5A6, 0x30A6,\n\t0xA5A7, 0x30A7, 0xA5A8, 0x30A8, 0xA5A9, 0x30A9, 0xA5AA, 0x30AA,\t0xA5AB, 0x30AB, 0xA5AC, 0x30AC, 0xA5AD, 0x30AD, 0xA5AE, 0x30AE,\n\t0xA5AF, 0x30AF, 0xA5B0, 0x30B0, 0xA5B1, 0x30B1, 0xA5B2, 0x30B2,\t0xA5B3, 0x30B3, 0xA5B4, 0x30B4, 0xA5B5, 0x30B5, 0xA5B6, 0x30B6,\n\t0xA5B7, 0x30B7, 0xA5B8, 0x30B8, 0xA5B9, 0x30B9, 0xA5BA, 0x30BA,\t0xA5BB, 0x30BB, 0xA5BC, 0x30BC, 0xA5BD, 0x30BD, 0xA5BE, 0x30BE,\n\t0xA5BF, 0x30BF, 0xA5C0, 0x30C0, 0xA5C1, 0x30C1, 0xA5C2, 0x30C2,\t0xA5C3, 0x30C3, 0xA5C4, 0x30C4, 0xA5C5, 0x30C5, 0xA5C6, 0x30C6,\n\t0xA5C7, 0x30C7, 0xA5C8, 0x30C8, 0xA5C9, 0x30C9, 0xA5CA, 0x30CA,\t0xA5CB, 0x30CB, 0xA5CC, 0x30CC, 0xA5CD, 0x30CD, 0xA5CE, 0x30CE,\n\t0xA5CF, 0x30CF, 0xA5D0, 0x30D0, 0xA5D1, 0x30D1, 0xA5D2, 0x30D2,\t0xA5D3, 0x30D3, 0xA5D4, 0x30D4, 0xA5D5, 0x30D5, 0xA5D6, 0x30D6,\n\t0xA5D7, 0x30D7, 0xA5D8, 0x30D8, 0xA5D9, 0x30D9, 0xA5DA, 0x30DA,\t0xA5DB, 0x30DB, 0xA5DC, 0x30DC, 0xA5DD, 0x30DD, 0xA5DE, 0x30DE,\n\t0xA5DF, 0x30DF, 0xA5E0, 0x30E0, 0xA5E1, 0x30E1, 0xA5E2, 0x30E2,\t0xA5E3, 0x30E3, 0xA5E4, 0x30E4, 0xA5E5, 0x30E5, 0xA5E6, 0x30E6,\n\t0xA5E7, 0x30E7, 0xA5E8, 0x30E8, 0xA5E9, 0x30E9, 0xA5EA, 0x30EA,\t0xA5EB, 0x30EB, 0xA5EC, 0x30EC, 0xA5ED, 0x30ED, 0xA5EE, 0x30EE,\n\t0xA5EF, 0x30EF, 0xA5F0, 0x30F0, 0xA5F1, 0x30F1, 0xA5F2, 0x30F2,\t0xA5F3, 0x30F3, 0xA5F4, 0x30F4, 0xA5F5, 0x30F5, 0xA5F6, 0x30F6,\n\t0xA6A1, 0x0391, 0xA6A2, 0x0392, 0xA6A3, 0x0393, 0xA6A4, 0x0394,\t0xA6A5, 0x0395, 0xA6A6, 0x0396, 0xA6A7, 0x0397, 0xA6A8, 0x0398,\n\t0xA6A9, 0x0399, 0xA6AA, 0x039A, 0xA6AB, 0x039B, 0xA6AC, 0x039C,\t0xA6AD, 0x039D, 0xA6AE, 0x039E, 0xA6AF, 0x039F, 0xA6B0, 0x03A0,\n\t0xA6B1, 0x03A1, 0xA6B2, 0x03A3, 0xA6B3, 0x03A4, 0xA6B4, 0x03A5,\t0xA6B5, 0x03A6, 0xA6B6, 0x03A7, 0xA6B7, 0x03A8, 0xA6B8, 0x03A9,\n\t0xA6C1, 0x03B1, 0xA6C2, 0x03B2, 0xA6C3, 0x03B3, 0xA6C4, 0x03B4,\t0xA6C5, 0x03B5, 0xA6C6, 0x03B6, 0xA6C7, 0x03B7, 0xA6C8, 0x03B8,\n\t0xA6C9, 0x03B9, 0xA6CA, 0x03BA, 0xA6CB, 0x03BB, 0xA6CC, 0x03BC,\t0xA6CD, 0x03BD, 0xA6CE, 0x03BE, 0xA6CF, 0x03BF, 0xA6D0, 0x03C0,\n\t0xA6D1, 0x03C1, 0xA6D2, 0x03C3, 0xA6D3, 0x03C4, 0xA6D4, 0x03C5,\t0xA6D5, 0x03C6, 0xA6D6, 0x03C7, 0xA6D7, 0x03C8, 0xA6D8, 0x03C9,\n\t0xA6E0, 0xFE35, 0xA6E1, 0xFE36, 0xA6E2, 0xFE39, 0xA6E3, 0xFE3A,\t0xA6E4, 0xFE3F, 0xA6E5, 0xFE40, 0xA6E6, 0xFE3D, 0xA6E7, 0xFE3E,\n\t0xA6E8, 0xFE41, 0xA6E9, 0xFE42, 0xA6EA, 0xFE43, 0xA6EB, 0xFE44,\t0xA6EE, 0xFE3B, 0xA6EF, 0xFE3C, 0xA6F0, 0xFE37, 0xA6F1, 0xFE38,\n\t0xA6F2, 0xFE31, 0xA6F4, 0xFE33, 0xA6F5, 0xFE34, 0xA7A1, 0x0410,\t0xA7A2, 0x0411, 0xA7A3, 0x0412, 0xA7A4, 0x0413, 0xA7A5, 0x0414,\n\t0xA7A6, 0x0415, 0xA7A7, 0x0401, 0xA7A8, 0x0416, 0xA7A9, 0x0417,\t0xA7AA, 0x0418, 0xA7AB, 0x0419, 0xA7AC, 0x041A, 0xA7AD, 0x041B,\n\t0xA7AE, 0x041C, 0xA7AF, 0x041D, 0xA7B0, 0x041E, 0xA7B1, 0x041F,\t0xA7B2, 0x0420, 0xA7B3, 0x0421, 0xA7B4, 0x0422, 0xA7B5, 0x0423,\n\t0xA7B6, 0x0424, 0xA7B7, 0x0425, 0xA7B8, 0x0426, 0xA7B9, 0x0427,\t0xA7BA, 0x0428, 0xA7BB, 0x0429, 0xA7BC, 0x042A, 0xA7BD, 0x042B,\n\t0xA7BE, 0x042C, 0xA7BF, 0x042D, 0xA7C0, 0x042E, 0xA7C1, 0x042F,\t0xA7D1, 0x0430, 0xA7D2, 0x0431, 0xA7D3, 0x0432, 0xA7D4, 0x0433,\n\t0xA7D5, 0x0434, 0xA7D6, 0x0435, 0xA7D7, 0x0451, 0xA7D8, 0x0436,\t0xA7D9, 0x0437, 0xA7DA, 0x0438, 0xA7DB, 0x0439, 0xA7DC, 0x043A,\n\t0xA7DD, 0x043B, 0xA7DE, 0x043C, 0xA7DF, 0x043D, 0xA7E0, 0x043E,\t0xA7E1, 0x043F, 0xA7E2, 0x0440, 0xA7E3, 0x0441, 0xA7E4, 0x0442,\n\t0xA7E5, 0x0443, 0xA7E6, 0x0444, 0xA7E7, 0x0445, 0xA7E8, 0x0446,\t0xA7E9, 0x0447, 0xA7EA, 0x0448, 0xA7EB, 0x0449, 0xA7EC, 0x044A,\n\t0xA7ED, 0x044B, 0xA7EE, 0x044C, 0xA7EF, 0x044D, 0xA7F0, 0x044E,\t0xA7F1, 0x044F, 0xA840, 0x02CA, 0xA841, 0x02CB, 0xA842, 0x02D9,\n\t0xA843, 0x2013, 0xA844, 0x2015, 0xA845, 0x2025, 0xA846, 0x2035,\t0xA847, 0x2105, 0xA848, 0x2109, 0xA849, 0x2196, 0xA84A, 0x2197,\n\t0xA84B, 0x2198, 0xA84C, 0x2199, 0xA84D, 0x2215, 0xA84E, 0x221F,\t0xA84F, 0x2223, 0xA850, 0x2252, 0xA851, 0x2266, 0xA852, 0x2267,\n\t0xA853, 0x22BF, 0xA854, 0x2550, 0xA855, 0x2551, 0xA856, 0x2552,\t0xA857, 0x2553, 0xA858, 0x2554, 0xA859, 0x2555, 0xA85A, 0x2556,\n\t0xA85B, 0x2557, 0xA85C, 0x2558, 0xA85D, 0x2559, 0xA85E, 0x255A,\t0xA85F, 0x255B, 0xA860, 0x255C, 0xA861, 0x255D, 0xA862, 0x255E,\n\t0xA863, 0x255F, 0xA864, 0x2560, 0xA865, 0x2561, 0xA866, 0x2562,\t0xA867, 0x2563, 0xA868, 0x2564, 0xA869, 0x2565, 0xA86A, 0x2566,\n\t0xA86B, 0x2567, 0xA86C, 0x2568, 0xA86D, 0x2569, 0xA86E, 0x256A,\t0xA86F, 0x256B, 0xA870, 0x256C, 0xA871, 0x256D, 0xA872, 0x256E,\n\t0xA873, 0x256F, 0xA874, 0x2570, 0xA875, 0x2571, 0xA876, 0x2572,\t0xA877, 0x2573, 0xA878, 0x2581, 0xA879, 0x2582, 0xA87A, 0x2583,\n\t0xA87B, 0x2584, 0xA87C, 0x2585, 0xA87D, 0x2586, 0xA87E, 0x2587,\t0xA880, 0x2588, 0xA881, 0x2589, 0xA882, 0x258A, 0xA883, 0x258B,\n\t0xA884, 0x258C, 0xA885, 0x258D, 0xA886, 0x258E, 0xA887, 0x258F,\t0xA888, 0x2593, 0xA889, 0x2594, 0xA88A, 0x2595, 0xA88B, 0x25BC,\n\t0xA88C, 0x25BD, 0xA88D, 0x25E2, 0xA88E, 0x25E3, 0xA88F, 0x25E4,\t0xA890, 0x25E5, 0xA891, 0x2609, 0xA892, 0x2295, 0xA893, 0x3012,\n\t0xA894, 0x301D, 0xA895, 0x301E, 0xA8A1, 0x0101, 0xA8A2, 0x00E1,\t0xA8A3, 0x01CE, 0xA8A4, 0x00E0, 0xA8A5, 0x0113, 0xA8A6, 0x00E9,\n\t0xA8A7, 0x011B, 0xA8A8, 0x00E8, 0xA8A9, 0x012B, 0xA8AA, 0x00ED,\t0xA8AB, 0x01D0, 0xA8AC, 0x00EC, 0xA8AD, 0x014D, 0xA8AE, 0x00F3,\n\t0xA8AF, 0x01D2, 0xA8B0, 0x00F2, 0xA8B1, 0x016B, 0xA8B2, 0x00FA,\t0xA8B3, 0x01D4, 0xA8B4, 0x00F9, 0xA8B5, 0x01D6, 0xA8B6, 0x01D8,\n\t0xA8B7, 0x01DA, 0xA8B8, 0x01DC, 0xA8B9, 0x00FC, 0xA8BA, 0x00EA,\t0xA8BB, 0x0251, 0xA8BD, 0x0144, 0xA8BE, 0x0148, 0xA8C0, 0x0261,\n\t0xA8C5, 0x3105, 0xA8C6, 0x3106, 0xA8C7, 0x3107, 0xA8C8, 0x3108,\t0xA8C9, 0x3109, 0xA8CA, 0x310A, 0xA8CB, 0x310B, 0xA8CC, 0x310C,\n\t0xA8CD, 0x310D, 0xA8CE, 0x310E, 0xA8CF, 0x310F, 0xA8D0, 0x3110,\t0xA8D1, 0x3111, 0xA8D2, 0x3112, 0xA8D3, 0x3113, 0xA8D4, 0x3114,\n\t0xA8D5, 0x3115, 0xA8D6, 0x3116, 0xA8D7, 0x3117, 0xA8D8, 0x3118,\t0xA8D9, 0x3119, 0xA8DA, 0x311A, 0xA8DB, 0x311B, 0xA8DC, 0x311C,\n\t0xA8DD, 0x311D, 0xA8DE, 0x311E, 0xA8DF, 0x311F, 0xA8E0, 0x3120,\t0xA8E1, 0x3121, 0xA8E2, 0x3122, 0xA8E3, 0x3123, 0xA8E4, 0x3124,\n\t0xA8E5, 0x3125, 0xA8E6, 0x3126, 0xA8E7, 0x3127, 0xA8E8, 0x3128,\t0xA8E9, 0x3129, 0xA940, 0x3021, 0xA941, 0x3022, 0xA942, 0x3023,\n\t0xA943, 0x3024, 0xA944, 0x3025, 0xA945, 0x3026, 0xA946, 0x3027,\t0xA947, 0x3028, 0xA948, 0x3029, 0xA949, 0x32A3, 0xA94A, 0x338E,\n\t0xA94B, 0x338F, 0xA94C, 0x339C, 0xA94D, 0x339D, 0xA94E, 0x339E,\t0xA94F, 0x33A1, 0xA950, 0x33C4, 0xA951, 0x33CE, 0xA952, 0x33D1,\n\t0xA953, 0x33D2, 0xA954, 0x33D5, 0xA955, 0xFE30, 0xA956, 0xFFE2,\t0xA957, 0xFFE4, 0xA959, 0x2121, 0xA95A, 0x3231, 0xA95C, 0x2010,\n\t0xA960, 0x30FC, 0xA961, 0x309B, 0xA962, 0x309C, 0xA963, 0x30FD,\t0xA964, 0x30FE, 0xA965, 0x3006, 0xA966, 0x309D, 0xA967, 0x309E,\n\t0xA968, 0xFE49, 0xA969, 0xFE4A, 0xA96A, 0xFE4B, 0xA96B, 0xFE4C,\t0xA96C, 0xFE4D, 0xA96D, 0xFE4E, 0xA96E, 0xFE4F, 0xA96F, 0xFE50,\n\t0xA970, 0xFE51, 0xA971, 0xFE52, 0xA972, 0xFE54, 0xA973, 0xFE55,\t0xA974, 0xFE56, 0xA975, 0xFE57, 0xA976, 0xFE59, 0xA977, 0xFE5A,\n\t0xA978, 0xFE5B, 0xA979, 0xFE5C, 0xA97A, 0xFE5D, 0xA97B, 0xFE5E,\t0xA97C, 0xFE5F, 0xA97D, 0xFE60, 0xA97E, 0xFE61, 0xA980, 0xFE62,\n\t0xA981, 0xFE63, 0xA982, 0xFE64, 0xA983, 0xFE65, 0xA984, 0xFE66,\t0xA985, 0xFE68, 0xA986, 0xFE69, 0xA987, 0xFE6A, 0xA988, 0xFE6B,\n\t0xA996, 0x3007, 0xA9A4, 0x2500, 0xA9A5, 0x2501, 0xA9A6, 0x2502,\t0xA9A7, 0x2503, 0xA9A8, 0x2504, 0xA9A9, 0x2505, 0xA9AA, 0x2506,\n\t0xA9AB, 0x2507, 0xA9AC, 0x2508, 0xA9AD, 0x2509, 0xA9AE, 0x250A,\t0xA9AF, 0x250B, 0xA9B0, 0x250C, 0xA9B1, 0x250D, 0xA9B2, 0x250E,\n\t0xA9B3, 0x250F, 0xA9B4, 0x2510, 0xA9B5, 0x2511, 0xA9B6, 0x2512,\t0xA9B7, 0x2513, 0xA9B8, 0x2514, 0xA9B9, 0x2515, 0xA9BA, 0x2516,\n\t0xA9BB, 0x2517, 0xA9BC, 0x2518, 0xA9BD, 0x2519, 0xA9BE, 0x251A,\t0xA9BF, 0x251B, 0xA9C0, 0x251C, 0xA9C1, 0x251D, 0xA9C2, 0x251E,\n\t0xA9C3, 0x251F, 0xA9C4, 0x2520, 0xA9C5, 0x2521, 0xA9C6, 0x2522,\t0xA9C7, 0x2523, 0xA9C8, 0x2524, 0xA9C9, 0x2525, 0xA9CA, 0x2526,\n\t0xA9CB, 0x2527, 0xA9CC, 0x2528, 0xA9CD, 0x2529, 0xA9CE, 0x252A,\t0xA9CF, 0x252B, 0xA9D0, 0x252C, 0xA9D1, 0x252D, 0xA9D2, 0x252E,\n\t0xA9D3, 0x252F, 0xA9D4, 0x2530, 0xA9D5, 0x2531, 0xA9D6, 0x2532,\t0xA9D7, 0x2533, 0xA9D8, 0x2534, 0xA9D9, 0x2535, 0xA9DA, 0x2536,\n\t0xA9DB, 0x2537, 0xA9DC, 0x2538, 0xA9DD, 0x2539, 0xA9DE, 0x253A,\t0xA9DF, 0x253B, 0xA9E0, 0x253C, 0xA9E1, 0x253D, 0xA9E2, 0x253E,\n\t0xA9E3, 0x253F, 0xA9E4, 0x2540, 0xA9E5, 0x2541, 0xA9E6, 0x2542,\t0xA9E7, 0x2543, 0xA9E8, 0x2544, 0xA9E9, 0x2545, 0xA9EA, 0x2546,\n\t0xA9EB, 0x2547, 0xA9EC, 0x2548, 0xA9ED, 0x2549, 0xA9EE, 0x254A,\t0xA9EF, 0x254B, 0xAA40, 0x72DC, 0xAA41, 0x72DD, 0xAA42, 0x72DF,\n\t0xAA43, 0x72E2, 0xAA44, 0x72E3, 0xAA45, 0x72E4, 0xAA46, 0x72E5,\t0xAA47, 0x72E6, 0xAA48, 0x72E7, 0xAA49, 0x72EA, 0xAA4A, 0x72EB,\n\t0xAA4B, 0x72F5, 0xAA4C, 0x72F6, 0xAA4D, 0x72F9, 0xAA4E, 0x72FD,\t0xAA4F, 0x72FE, 0xAA50, 0x72FF, 0xAA51, 0x7300, 0xAA52, 0x7302,\n\t0xAA53, 0x7304, 0xAA54, 0x7305, 0xAA55, 0x7306, 0xAA56, 0x7307,\t0xAA57, 0x7308, 0xAA58, 0x7309, 0xAA59, 0x730B, 0xAA5A, 0x730C,\n\t0xAA5B, 0x730D, 0xAA5C, 0x730F, 0xAA5D, 0x7310, 0xAA5E, 0x7311,\t0xAA5F, 0x7312, 0xAA60, 0x7314, 0xAA61, 0x7318, 0xAA62, 0x7319,\n\t0xAA63, 0x731A, 0xAA64, 0x731F, 0xAA65, 0x7320, 0xAA66, 0x7323,\t0xAA67, 0x7324, 0xAA68, 0x7326, 0xAA69, 0x7327, 0xAA6A, 0x7328,\n\t0xAA6B, 0x732D, 0xAA6C, 0x732F, 0xAA6D, 0x7330, 0xAA6E, 0x7332,\t0xAA6F, 0x7333, 0xAA70, 0x7335, 0xAA71, 0x7336, 0xAA72, 0x733A,\n\t0xAA73, 0x733B, 0xAA74, 0x733C, 0xAA75, 0x733D, 0xAA76, 0x7340,\t0xAA77, 0x7341, 0xAA78, 0x7342, 0xAA79, 0x7343, 0xAA7A, 0x7344,\n\t0xAA7B, 0x7345, 0xAA7C, 0x7346, 0xAA7D, 0x7347, 0xAA7E, 0x7348,\t0xAA80, 0x7349, 0xAA81, 0x734A, 0xAA82, 0x734B, 0xAA83, 0x734C,\n\t0xAA84, 0x734E, 0xAA85, 0x734F, 0xAA86, 0x7351, 0xAA87, 0x7353,\t0xAA88, 0x7354, 0xAA89, 0x7355, 0xAA8A, 0x7356, 0xAA8B, 0x7358,\n\t0xAA8C, 0x7359, 0xAA8D, 0x735A, 0xAA8E, 0x735B, 0xAA8F, 0x735C,\t0xAA90, 0x735D, 0xAA91, 0x735E, 0xAA92, 0x735F, 0xAA93, 0x7361,\n\t0xAA94, 0x7362, 0xAA95, 0x7363, 0xAA96, 0x7364, 0xAA97, 0x7365,\t0xAA98, 0x7366, 0xAA99, 0x7367, 0xAA9A, 0x7368, 0xAA9B, 0x7369,\n\t0xAA9C, 0x736A, 0xAA9D, 0x736B, 0xAA9E, 0x736E, 0xAA9F, 0x7370,\t0xAAA0, 0x7371, 0xAB40, 0x7372, 0xAB41, 0x7373, 0xAB42, 0x7374,\n\t0xAB43, 0x7375, 0xAB44, 0x7376, 0xAB45, 0x7377, 0xAB46, 0x7378,\t0xAB47, 0x7379, 0xAB48, 0x737A, 0xAB49, 0x737B, 0xAB4A, 0x737C,\n\t0xAB4B, 0x737D, 0xAB4C, 0x737F, 0xAB4D, 0x7380, 0xAB4E, 0x7381,\t0xAB4F, 0x7382, 0xAB50, 0x7383, 0xAB51, 0x7385, 0xAB52, 0x7386,\n\t0xAB53, 0x7388, 0xAB54, 0x738A, 0xAB55, 0x738C, 0xAB56, 0x738D,\t0xAB57, 0x738F, 0xAB58, 0x7390, 0xAB59, 0x7392, 0xAB5A, 0x7393,\n\t0xAB5B, 0x7394, 0xAB5C, 0x7395, 0xAB5D, 0x7397, 0xAB5E, 0x7398,\t0xAB5F, 0x7399, 0xAB60, 0x739A, 0xAB61, 0x739C, 0xAB62, 0x739D,\n\t0xAB63, 0x739E, 0xAB64, 0x73A0, 0xAB65, 0x73A1, 0xAB66, 0x73A3,\t0xAB67, 0x73A4, 0xAB68, 0x73A5, 0xAB69, 0x73A6, 0xAB6A, 0x73A7,\n\t0xAB6B, 0x73A8, 0xAB6C, 0x73AA, 0xAB6D, 0x73AC, 0xAB6E, 0x73AD,\t0xAB6F, 0x73B1, 0xAB70, 0x73B4, 0xAB71, 0x73B5, 0xAB72, 0x73B6,\n\t0xAB73, 0x73B8, 0xAB74, 0x73B9, 0xAB75, 0x73BC, 0xAB76, 0x73BD,\t0xAB77, 0x73BE, 0xAB78, 0x73BF, 0xAB79, 0x73C1, 0xAB7A, 0x73C3,\n\t0xAB7B, 0x73C4, 0xAB7C, 0x73C5, 0xAB7D, 0x73C6, 0xAB7E, 0x73C7,\t0xAB80, 0x73CB, 0xAB81, 0x73CC, 0xAB82, 0x73CE, 0xAB83, 0x73D2,\n\t0xAB84, 0x73D3, 0xAB85, 0x73D4, 0xAB86, 0x73D5, 0xAB87, 0x73D6,\t0xAB88, 0x73D7, 0xAB89, 0x73D8, 0xAB8A, 0x73DA, 0xAB8B, 0x73DB,\n\t0xAB8C, 0x73DC, 0xAB8D, 0x73DD, 0xAB8E, 0x73DF, 0xAB8F, 0x73E1,\t0xAB90, 0x73E2, 0xAB91, 0x73E3, 0xAB92, 0x73E4, 0xAB93, 0x73E6,\n\t0xAB94, 0x73E8, 0xAB95, 0x73EA, 0xAB96, 0x73EB, 0xAB97, 0x73EC,\t0xAB98, 0x73EE, 0xAB99, 0x73EF, 0xAB9A, 0x73F0, 0xAB9B, 0x73F1,\n\t0xAB9C, 0x73F3, 0xAB9D, 0x73F4, 0xAB9E, 0x73F5, 0xAB9F, 0x73F6,\t0xABA0, 0x73F7, 0xAC40, 0x73F8, 0xAC41, 0x73F9, 0xAC42, 0x73FA,\n\t0xAC43, 0x73FB, 0xAC44, 0x73FC, 0xAC45, 0x73FD, 0xAC46, 0x73FE,\t0xAC47, 0x73FF, 0xAC48, 0x7400, 0xAC49, 0x7401, 0xAC4A, 0x7402,\n\t0xAC4B, 0x7404, 0xAC4C, 0x7407, 0xAC4D, 0x7408, 0xAC4E, 0x740B,\t0xAC4F, 0x740C, 0xAC50, 0x740D, 0xAC51, 0x740E, 0xAC52, 0x7411,\n\t0xAC53, 0x7412, 0xAC54, 0x7413, 0xAC55, 0x7414, 0xAC56, 0x7415,\t0xAC57, 0x7416, 0xAC58, 0x7417, 0xAC59, 0x7418, 0xAC5A, 0x7419,\n\t0xAC5B, 0x741C, 0xAC5C, 0x741D, 0xAC5D, 0x741E, 0xAC5E, 0x741F,\t0xAC5F, 0x7420, 0xAC60, 0x7421, 0xAC61, 0x7423, 0xAC62, 0x7424,\n\t0xAC63, 0x7427, 0xAC64, 0x7429, 0xAC65, 0x742B, 0xAC66, 0x742D,\t0xAC67, 0x742F, 0xAC68, 0x7431, 0xAC69, 0x7432, 0xAC6A, 0x7437,\n\t0xAC6B, 0x7438, 0xAC6C, 0x7439, 0xAC6D, 0x743A, 0xAC6E, 0x743B,\t0xAC6F, 0x743D, 0xAC70, 0x743E, 0xAC71, 0x743F, 0xAC72, 0x7440,\n\t0xAC73, 0x7442, 0xAC74, 0x7443, 0xAC75, 0x7444, 0xAC76, 0x7445,\t0xAC77, 0x7446, 0xAC78, 0x7447, 0xAC79, 0x7448, 0xAC7A, 0x7449,\n\t0xAC7B, 0x744A, 0xAC7C, 0x744B, 0xAC7D, 0x744C, 0xAC7E, 0x744D,\t0xAC80, 0x744E, 0xAC81, 0x744F, 0xAC82, 0x7450, 0xAC83, 0x7451,\n\t0xAC84, 0x7452, 0xAC85, 0x7453, 0xAC86, 0x7454, 0xAC87, 0x7456,\t0xAC88, 0x7458, 0xAC89, 0x745D, 0xAC8A, 0x7460, 0xAC8B, 0x7461,\n\t0xAC8C, 0x7462, 0xAC8D, 0x7463, 0xAC8E, 0x7464, 0xAC8F, 0x7465,\t0xAC90, 0x7466, 0xAC91, 0x7467, 0xAC92, 0x7468, 0xAC93, 0x7469,\n\t0xAC94, 0x746A, 0xAC95, 0x746B, 0xAC96, 0x746C, 0xAC97, 0x746E,\t0xAC98, 0x746F, 0xAC99, 0x7471, 0xAC9A, 0x7472, 0xAC9B, 0x7473,\n\t0xAC9C, 0x7474, 0xAC9D, 0x7475, 0xAC9E, 0x7478, 0xAC9F, 0x7479,\t0xACA0, 0x747A, 0xAD40, 0x747B, 0xAD41, 0x747C, 0xAD42, 0x747D,\n\t0xAD43, 0x747F, 0xAD44, 0x7482, 0xAD45, 0x7484, 0xAD46, 0x7485,\t0xAD47, 0x7486, 0xAD48, 0x7488, 0xAD49, 0x7489, 0xAD4A, 0x748A,\n\t0xAD4B, 0x748C, 0xAD4C, 0x748D, 0xAD4D, 0x748F, 0xAD4E, 0x7491,\t0xAD4F, 0x7492, 0xAD50, 0x7493, 0xAD51, 0x7494, 0xAD52, 0x7495,\n\t0xAD53, 0x7496, 0xAD54, 0x7497, 0xAD55, 0x7498, 0xAD56, 0x7499,\t0xAD57, 0x749A, 0xAD58, 0x749B, 0xAD59, 0x749D, 0xAD5A, 0x749F,\n\t0xAD5B, 0x74A0, 0xAD5C, 0x74A1, 0xAD5D, 0x74A2, 0xAD5E, 0x74A3,\t0xAD5F, 0x74A4, 0xAD60, 0x74A5, 0xAD61, 0x74A6, 0xAD62, 0x74AA,\n\t0xAD63, 0x74AB, 0xAD64, 0x74AC, 0xAD65, 0x74AD, 0xAD66, 0x74AE,\t0xAD67, 0x74AF, 0xAD68, 0x74B0, 0xAD69, 0x74B1, 0xAD6A, 0x74B2,\n\t0xAD6B, 0x74B3, 0xAD6C, 0x74B4, 0xAD6D, 0x74B5, 0xAD6E, 0x74B6,\t0xAD6F, 0x74B7, 0xAD70, 0x74B8, 0xAD71, 0x74B9, 0xAD72, 0x74BB,\n\t0xAD73, 0x74BC, 0xAD74, 0x74BD, 0xAD75, 0x74BE, 0xAD76, 0x74BF,\t0xAD77, 0x74C0, 0xAD78, 0x74C1, 0xAD79, 0x74C2, 0xAD7A, 0x74C3,\n\t0xAD7B, 0x74C4, 0xAD7C, 0x74C5, 0xAD7D, 0x74C6, 0xAD7E, 0x74C7,\t0xAD80, 0x74C8, 0xAD81, 0x74C9, 0xAD82, 0x74CA, 0xAD83, 0x74CB,\n\t0xAD84, 0x74CC, 0xAD85, 0x74CD, 0xAD86, 0x74CE, 0xAD87, 0x74CF,\t0xAD88, 0x74D0, 0xAD89, 0x74D1, 0xAD8A, 0x74D3, 0xAD8B, 0x74D4,\n\t0xAD8C, 0x74D5, 0xAD8D, 0x74D6, 0xAD8E, 0x74D7, 0xAD8F, 0x74D8,\t0xAD90, 0x74D9, 0xAD91, 0x74DA, 0xAD92, 0x74DB, 0xAD93, 0x74DD,\n\t0xAD94, 0x74DF, 0xAD95, 0x74E1, 0xAD96, 0x74E5, 0xAD97, 0x74E7,\t0xAD98, 0x74E8, 0xAD99, 0x74E9, 0xAD9A, 0x74EA, 0xAD9B, 0x74EB,\n\t0xAD9C, 0x74EC, 0xAD9D, 0x74ED, 0xAD9E, 0x74F0, 0xAD9F, 0x74F1,\t0xADA0, 0x74F2, 0xAE40, 0x74F3, 0xAE41, 0x74F5, 0xAE42, 0x74F8,\n\t0xAE43, 0x74F9, 0xAE44, 0x74FA, 0xAE45, 0x74FB, 0xAE46, 0x74FC,\t0xAE47, 0x74FD, 0xAE48, 0x74FE, 0xAE49, 0x7500, 0xAE4A, 0x7501,\n\t0xAE4B, 0x7502, 0xAE4C, 0x7503, 0xAE4D, 0x7505, 0xAE4E, 0x7506,\t0xAE4F, 0x7507, 0xAE50, 0x7508, 0xAE51, 0x7509, 0xAE52, 0x750A,\n\t0xAE53, 0x750B, 0xAE54, 0x750C, 0xAE55, 0x750E, 0xAE56, 0x7510,\t0xAE57, 0x7512, 0xAE58, 0x7514, 0xAE59, 0x7515, 0xAE5A, 0x7516,\n\t0xAE5B, 0x7517, 0xAE5C, 0x751B, 0xAE5D, 0x751D, 0xAE5E, 0x751E,\t0xAE5F, 0x7520, 0xAE60, 0x7521, 0xAE61, 0x7522, 0xAE62, 0x7523,\n\t0xAE63, 0x7524, 0xAE64, 0x7526, 0xAE65, 0x7527, 0xAE66, 0x752A,\t0xAE67, 0x752E, 0xAE68, 0x7534, 0xAE69, 0x7536, 0xAE6A, 0x7539,\n\t0xAE6B, 0x753C, 0xAE6C, 0x753D, 0xAE6D, 0x753F, 0xAE6E, 0x7541,\t0xAE6F, 0x7542, 0xAE70, 0x7543, 0xAE71, 0x7544, 0xAE72, 0x7546,\n\t0xAE73, 0x7547, 0xAE74, 0x7549, 0xAE75, 0x754A, 0xAE76, 0x754D,\t0xAE77, 0x7550, 0xAE78, 0x7551, 0xAE79, 0x7552, 0xAE7A, 0x7553,\n\t0xAE7B, 0x7555, 0xAE7C, 0x7556, 0xAE7D, 0x7557, 0xAE7E, 0x7558,\t0xAE80, 0x755D, 0xAE81, 0x755E, 0xAE82, 0x755F, 0xAE83, 0x7560,\n\t0xAE84, 0x7561, 0xAE85, 0x7562, 0xAE86, 0x7563, 0xAE87, 0x7564,\t0xAE88, 0x7567, 0xAE89, 0x7568, 0xAE8A, 0x7569, 0xAE8B, 0x756B,\n\t0xAE8C, 0x756C, 0xAE8D, 0x756D, 0xAE8E, 0x756E, 0xAE8F, 0x756F,\t0xAE90, 0x7570, 0xAE91, 0x7571, 0xAE92, 0x7573, 0xAE93, 0x7575,\n\t0xAE94, 0x7576, 0xAE95, 0x7577, 0xAE96, 0x757A, 0xAE97, 0x757B,\t0xAE98, 0x757C, 0xAE99, 0x757D, 0xAE9A, 0x757E, 0xAE9B, 0x7580,\n\t0xAE9C, 0x7581, 0xAE9D, 0x7582, 0xAE9E, 0x7584, 0xAE9F, 0x7585,\t0xAEA0, 0x7587, 0xAF40, 0x7588, 0xAF41, 0x7589, 0xAF42, 0x758A,\n\t0xAF43, 0x758C, 0xAF44, 0x758D, 0xAF45, 0x758E, 0xAF46, 0x7590,\t0xAF47, 0x7593, 0xAF48, 0x7595, 0xAF49, 0x7598, 0xAF4A, 0x759B,\n\t0xAF4B, 0x759C, 0xAF4C, 0x759E, 0xAF4D, 0x75A2, 0xAF4E, 0x75A6,\t0xAF4F, 0x75A7, 0xAF50, 0x75A8, 0xAF51, 0x75A9, 0xAF52, 0x75AA,\n\t0xAF53, 0x75AD, 0xAF54, 0x75B6, 0xAF55, 0x75B7, 0xAF56, 0x75BA,\t0xAF57, 0x75BB, 0xAF58, 0x75BF, 0xAF59, 0x75C0, 0xAF5A, 0x75C1,\n\t0xAF5B, 0x75C6, 0xAF5C, 0x75CB, 0xAF5D, 0x75CC, 0xAF5E, 0x75CE,\t0xAF5F, 0x75CF, 0xAF60, 0x75D0, 0xAF61, 0x75D1, 0xAF62, 0x75D3,\n\t0xAF63, 0x75D7, 0xAF64, 0x75D9, 0xAF65, 0x75DA, 0xAF66, 0x75DC,\t0xAF67, 0x75DD, 0xAF68, 0x75DF, 0xAF69, 0x75E0, 0xAF6A, 0x75E1,\n\t0xAF6B, 0x75E5, 0xAF6C, 0x75E9, 0xAF6D, 0x75EC, 0xAF6E, 0x75ED,\t0xAF6F, 0x75EE, 0xAF70, 0x75EF, 0xAF71, 0x75F2, 0xAF72, 0x75F3,\n\t0xAF73, 0x75F5, 0xAF74, 0x75F6, 0xAF75, 0x75F7, 0xAF76, 0x75F8,\t0xAF77, 0x75FA, 0xAF78, 0x75FB, 0xAF79, 0x75FD, 0xAF7A, 0x75FE,\n\t0xAF7B, 0x7602, 0xAF7C, 0x7604, 0xAF7D, 0x7606, 0xAF7E, 0x7607,\t0xAF80, 0x7608, 0xAF81, 0x7609, 0xAF82, 0x760B, 0xAF83, 0x760D,\n\t0xAF84, 0x760E, 0xAF85, 0x760F, 0xAF86, 0x7611, 0xAF87, 0x7612,\t0xAF88, 0x7613, 0xAF89, 0x7614, 0xAF8A, 0x7616, 0xAF8B, 0x761A,\n\t0xAF8C, 0x761C, 0xAF8D, 0x761D, 0xAF8E, 0x761E, 0xAF8F, 0x7621,\t0xAF90, 0x7623, 0xAF91, 0x7627, 0xAF92, 0x7628, 0xAF93, 0x762C,\n\t0xAF94, 0x762E, 0xAF95, 0x762F, 0xAF96, 0x7631, 0xAF97, 0x7632,\t0xAF98, 0x7636, 0xAF99, 0x7637, 0xAF9A, 0x7639, 0xAF9B, 0x763A,\n\t0xAF9C, 0x763B, 0xAF9D, 0x763D, 0xAF9E, 0x7641, 0xAF9F, 0x7642,\t0xAFA0, 0x7644, 0xB040, 0x7645, 0xB041, 0x7646, 0xB042, 0x7647,\n\t0xB043, 0x7648, 0xB044, 0x7649, 0xB045, 0x764A, 0xB046, 0x764B,\t0xB047, 0x764E, 0xB048, 0x764F, 0xB049, 0x7650, 0xB04A, 0x7651,\n\t0xB04B, 0x7652, 0xB04C, 0x7653, 0xB04D, 0x7655, 0xB04E, 0x7657,\t0xB04F, 0x7658, 0xB050, 0x7659, 0xB051, 0x765A, 0xB052, 0x765B,\n\t0xB053, 0x765D, 0xB054, 0x765F, 0xB055, 0x7660, 0xB056, 0x7661,\t0xB057, 0x7662, 0xB058, 0x7664, 0xB059, 0x7665, 0xB05A, 0x7666,\n\t0xB05B, 0x7667, 0xB05C, 0x7668, 0xB05D, 0x7669, 0xB05E, 0x766A,\t0xB05F, 0x766C, 0xB060, 0x766D, 0xB061, 0x766E, 0xB062, 0x7670,\n\t0xB063, 0x7671, 0xB064, 0x7672, 0xB065, 0x7673, 0xB066, 0x7674,\t0xB067, 0x7675, 0xB068, 0x7676, 0xB069, 0x7677, 0xB06A, 0x7679,\n\t0xB06B, 0x767A, 0xB06C, 0x767C, 0xB06D, 0x767F, 0xB06E, 0x7680,\t0xB06F, 0x7681, 0xB070, 0x7683, 0xB071, 0x7685, 0xB072, 0x7689,\n\t0xB073, 0x768A, 0xB074, 0x768C, 0xB075, 0x768D, 0xB076, 0x768F,\t0xB077, 0x7690, 0xB078, 0x7692, 0xB079, 0x7694, 0xB07A, 0x7695,\n\t0xB07B, 0x7697, 0xB07C, 0x7698, 0xB07D, 0x769A, 0xB07E, 0x769B,\t0xB080, 0x769C, 0xB081, 0x769D, 0xB082, 0x769E, 0xB083, 0x769F,\n\t0xB084, 0x76A0, 0xB085, 0x76A1, 0xB086, 0x76A2, 0xB087, 0x76A3,\t0xB088, 0x76A5, 0xB089, 0x76A6, 0xB08A, 0x76A7, 0xB08B, 0x76A8,\n\t0xB08C, 0x76A9, 0xB08D, 0x76AA, 0xB08E, 0x76AB, 0xB08F, 0x76AC,\t0xB090, 0x76AD, 0xB091, 0x76AF, 0xB092, 0x76B0, 0xB093, 0x76B3,\n\t0xB094, 0x76B5, 0xB095, 0x76B6, 0xB096, 0x76B7, 0xB097, 0x76B8,\t0xB098, 0x76B9, 0xB099, 0x76BA, 0xB09A, 0x76BB, 0xB09B, 0x76BC,\n\t0xB09C, 0x76BD, 0xB09D, 0x76BE, 0xB09E, 0x76C0, 0xB09F, 0x76C1,\t0xB0A0, 0x76C3, 0xB0A1, 0x554A, 0xB0A2, 0x963F, 0xB0A3, 0x57C3,\n\t0xB0A4, 0x6328, 0xB0A5, 0x54CE, 0xB0A6, 0x5509, 0xB0A7, 0x54C0,\t0xB0A8, 0x7691, 0xB0A9, 0x764C, 0xB0AA, 0x853C, 0xB0AB, 0x77EE,\n\t0xB0AC, 0x827E, 0xB0AD, 0x788D, 0xB0AE, 0x7231, 0xB0AF, 0x9698,\t0xB0B0, 0x978D, 0xB0B1, 0x6C28, 0xB0B2, 0x5B89, 0xB0B3, 0x4FFA,\n\t0xB0B4, 0x6309, 0xB0B5, 0x6697, 0xB0B6, 0x5CB8, 0xB0B7, 0x80FA,\t0xB0B8, 0x6848, 0xB0B9, 0x80AE, 0xB0BA, 0x6602, 0xB0BB, 0x76CE,\n\t0xB0BC, 0x51F9, 0xB0BD, 0x6556, 0xB0BE, 0x71AC, 0xB0BF, 0x7FF1,\t0xB0C0, 0x8884, 0xB0C1, 0x50B2, 0xB0C2, 0x5965, 0xB0C3, 0x61CA,\n\t0xB0C4, 0x6FB3, 0xB0C5, 0x82AD, 0xB0C6, 0x634C, 0xB0C7, 0x6252,\t0xB0C8, 0x53ED, 0xB0C9, 0x5427, 0xB0CA, 0x7B06, 0xB0CB, 0x516B,\n\t0xB0CC, 0x75A4, 0xB0CD, 0x5DF4, 0xB0CE, 0x62D4, 0xB0CF, 0x8DCB,\t0xB0D0, 0x9776, 0xB0D1, 0x628A, 0xB0D2, 0x8019, 0xB0D3, 0x575D,\n\t0xB0D4, 0x9738, 0xB0D5, 0x7F62, 0xB0D6, 0x7238, 0xB0D7, 0x767D,\t0xB0D8, 0x67CF, 0xB0D9, 0x767E, 0xB0DA, 0x6446, 0xB0DB, 0x4F70,\n\t0xB0DC, 0x8D25, 0xB0DD, 0x62DC, 0xB0DE, 0x7A17, 0xB0DF, 0x6591,\t0xB0E0, 0x73ED, 0xB0E1, 0x642C, 0xB0E2, 0x6273, 0xB0E3, 0x822C,\n\t0xB0E4, 0x9881, 0xB0E5, 0x677F, 0xB0E6, 0x7248, 0xB0E7, 0x626E,\t0xB0E8, 0x62CC, 0xB0E9, 0x4F34, 0xB0EA, 0x74E3, 0xB0EB, 0x534A,\n\t0xB0EC, 0x529E, 0xB0ED, 0x7ECA, 0xB0EE, 0x90A6, 0xB0EF, 0x5E2E,\t0xB0F0, 0x6886, 0xB0F1, 0x699C, 0xB0F2, 0x8180, 0xB0F3, 0x7ED1,\n\t0xB0F4, 0x68D2, 0xB0F5, 0x78C5, 0xB0F6, 0x868C, 0xB0F7, 0x9551,\t0xB0F8, 0x508D, 0xB0F9, 0x8C24, 0xB0FA, 0x82DE, 0xB0FB, 0x80DE,\n\t0xB0FC, 0x5305, 0xB0FD, 0x8912, 0xB0FE, 0x5265, 0xB140, 0x76C4,\t0xB141, 0x76C7, 0xB142, 0x76C9, 0xB143, 0x76CB, 0xB144, 0x76CC,\n\t0xB145, 0x76D3, 0xB146, 0x76D5, 0xB147, 0x76D9, 0xB148, 0x76DA,\t0xB149, 0x76DC, 0xB14A, 0x76DD, 0xB14B, 0x76DE, 0xB14C, 0x76E0,\n\t0xB14D, 0x76E1, 0xB14E, 0x76E2, 0xB14F, 0x76E3, 0xB150, 0x76E4,\t0xB151, 0x76E6, 0xB152, 0x76E7, 0xB153, 0x76E8, 0xB154, 0x76E9,\n\t0xB155, 0x76EA, 0xB156, 0x76EB, 0xB157, 0x76EC, 0xB158, 0x76ED,\t0xB159, 0x76F0, 0xB15A, 0x76F3, 0xB15B, 0x76F5, 0xB15C, 0x76F6,\n\t0xB15D, 0x76F7, 0xB15E, 0x76FA, 0xB15F, 0x76FB, 0xB160, 0x76FD,\t0xB161, 0x76FF, 0xB162, 0x7700, 0xB163, 0x7702, 0xB164, 0x7703,\n\t0xB165, 0x7705, 0xB166, 0x7706, 0xB167, 0x770A, 0xB168, 0x770C,\t0xB169, 0x770E, 0xB16A, 0x770F, 0xB16B, 0x7710, 0xB16C, 0x7711,\n\t0xB16D, 0x7712, 0xB16E, 0x7713, 0xB16F, 0x7714, 0xB170, 0x7715,\t0xB171, 0x7716, 0xB172, 0x7717, 0xB173, 0x7718, 0xB174, 0x771B,\n\t0xB175, 0x771C, 0xB176, 0x771D, 0xB177, 0x771E, 0xB178, 0x7721,\t0xB179, 0x7723, 0xB17A, 0x7724, 0xB17B, 0x7725, 0xB17C, 0x7727,\n\t0xB17D, 0x772A, 0xB17E, 0x772B, 0xB180, 0x772C, 0xB181, 0x772E,\t0xB182, 0x7730, 0xB183, 0x7731, 0xB184, 0x7732, 0xB185, 0x7733,\n\t0xB186, 0x7734, 0xB187, 0x7739, 0xB188, 0x773B, 0xB189, 0x773D,\t0xB18A, 0x773E, 0xB18B, 0x773F, 0xB18C, 0x7742, 0xB18D, 0x7744,\n\t0xB18E, 0x7745, 0xB18F, 0x7746, 0xB190, 0x7748, 0xB191, 0x7749,\t0xB192, 0x774A, 0xB193, 0x774B, 0xB194, 0x774C, 0xB195, 0x774D,\n\t0xB196, 0x774E, 0xB197, 0x774F, 0xB198, 0x7752, 0xB199, 0x7753,\t0xB19A, 0x7754, 0xB19B, 0x7755, 0xB19C, 0x7756, 0xB19D, 0x7757,\n\t0xB19E, 0x7758, 0xB19F, 0x7759, 0xB1A0, 0x775C, 0xB1A1, 0x8584,\t0xB1A2, 0x96F9, 0xB1A3, 0x4FDD, 0xB1A4, 0x5821, 0xB1A5, 0x9971,\n\t0xB1A6, 0x5B9D, 0xB1A7, 0x62B1, 0xB1A8, 0x62A5, 0xB1A9, 0x66B4,\t0xB1AA, 0x8C79, 0xB1AB, 0x9C8D, 0xB1AC, 0x7206, 0xB1AD, 0x676F,\n\t0xB1AE, 0x7891, 0xB1AF, 0x60B2, 0xB1B0, 0x5351, 0xB1B1, 0x5317,\t0xB1B2, 0x8F88, 0xB1B3, 0x80CC, 0xB1B4, 0x8D1D, 0xB1B5, 0x94A1,\n\t0xB1B6, 0x500D, 0xB1B7, 0x72C8, 0xB1B8, 0x5907, 0xB1B9, 0x60EB,\t0xB1BA, 0x7119, 0xB1BB, 0x88AB, 0xB1BC, 0x5954, 0xB1BD, 0x82EF,\n\t0xB1BE, 0x672C, 0xB1BF, 0x7B28, 0xB1C0, 0x5D29, 0xB1C1, 0x7EF7,\t0xB1C2, 0x752D, 0xB1C3, 0x6CF5, 0xB1C4, 0x8E66, 0xB1C5, 0x8FF8,\n\t0xB1C6, 0x903C, 0xB1C7, 0x9F3B, 0xB1C8, 0x6BD4, 0xB1C9, 0x9119,\t0xB1CA, 0x7B14, 0xB1CB, 0x5F7C, 0xB1CC, 0x78A7, 0xB1CD, 0x84D6,\n\t0xB1CE, 0x853D, 0xB1CF, 0x6BD5, 0xB1D0, 0x6BD9, 0xB1D1, 0x6BD6,\t0xB1D2, 0x5E01, 0xB1D3, 0x5E87, 0xB1D4, 0x75F9, 0xB1D5, 0x95ED,\n\t0xB1D6, 0x655D, 0xB1D7, 0x5F0A, 0xB1D8, 0x5FC5, 0xB1D9, 0x8F9F,\t0xB1DA, 0x58C1, 0xB1DB, 0x81C2, 0xB1DC, 0x907F, 0xB1DD, 0x965B,\n\t0xB1DE, 0x97AD, 0xB1DF, 0x8FB9, 0xB1E0, 0x7F16, 0xB1E1, 0x8D2C,\t0xB1E2, 0x6241, 0xB1E3, 0x4FBF, 0xB1E4, 0x53D8, 0xB1E5, 0x535E,\n\t0xB1E6, 0x8FA8, 0xB1E7, 0x8FA9, 0xB1E8, 0x8FAB, 0xB1E9, 0x904D,\t0xB1EA, 0x6807, 0xB1EB, 0x5F6A, 0xB1EC, 0x8198, 0xB1ED, 0x8868,\n\t0xB1EE, 0x9CD6, 0xB1EF, 0x618B, 0xB1F0, 0x522B, 0xB1F1, 0x762A,\t0xB1F2, 0x5F6C, 0xB1F3, 0x658C, 0xB1F4, 0x6FD2, 0xB1F5, 0x6EE8,\n\t0xB1F6, 0x5BBE, 0xB1F7, 0x6448, 0xB1F8, 0x5175, 0xB1F9, 0x51B0,\t0xB1FA, 0x67C4, 0xB1FB, 0x4E19, 0xB1FC, 0x79C9, 0xB1FD, 0x997C,\n\t0xB1FE, 0x70B3, 0xB240, 0x775D, 0xB241, 0x775E, 0xB242, 0x775F,\t0xB243, 0x7760, 0xB244, 0x7764, 0xB245, 0x7767, 0xB246, 0x7769,\n\t0xB247, 0x776A, 0xB248, 0x776D, 0xB249, 0x776E, 0xB24A, 0x776F,\t0xB24B, 0x7770, 0xB24C, 0x7771, 0xB24D, 0x7772, 0xB24E, 0x7773,\n\t0xB24F, 0x7774, 0xB250, 0x7775, 0xB251, 0x7776, 0xB252, 0x7777,\t0xB253, 0x7778, 0xB254, 0x777A, 0xB255, 0x777B, 0xB256, 0x777C,\n\t0xB257, 0x7781, 0xB258, 0x7782, 0xB259, 0x7783, 0xB25A, 0x7786,\t0xB25B, 0x7787, 0xB25C, 0x7788, 0xB25D, 0x7789, 0xB25E, 0x778A,\n\t0xB25F, 0x778B, 0xB260, 0x778F, 0xB261, 0x7790, 0xB262, 0x7793,\t0xB263, 0x7794, 0xB264, 0x7795, 0xB265, 0x7796, 0xB266, 0x7797,\n\t0xB267, 0x7798, 0xB268, 0x7799, 0xB269, 0x779A, 0xB26A, 0x779B,\t0xB26B, 0x779C, 0xB26C, 0x779D, 0xB26D, 0x779E, 0xB26E, 0x77A1,\n\t0xB26F, 0x77A3, 0xB270, 0x77A4, 0xB271, 0x77A6, 0xB272, 0x77A8,\t0xB273, 0x77AB, 0xB274, 0x77AD, 0xB275, 0x77AE, 0xB276, 0x77AF,\n\t0xB277, 0x77B1, 0xB278, 0x77B2, 0xB279, 0x77B4, 0xB27A, 0x77B6,\t0xB27B, 0x77B7, 0xB27C, 0x77B8, 0xB27D, 0x77B9, 0xB27E, 0x77BA,\n\t0xB280, 0x77BC, 0xB281, 0x77BE, 0xB282, 0x77C0, 0xB283, 0x77C1,\t0xB284, 0x77C2, 0xB285, 0x77C3, 0xB286, 0x77C4, 0xB287, 0x77C5,\n\t0xB288, 0x77C6, 0xB289, 0x77C7, 0xB28A, 0x77C8, 0xB28B, 0x77C9,\t0xB28C, 0x77CA, 0xB28D, 0x77CB, 0xB28E, 0x77CC, 0xB28F, 0x77CE,\n\t0xB290, 0x77CF, 0xB291, 0x77D0, 0xB292, 0x77D1, 0xB293, 0x77D2,\t0xB294, 0x77D3, 0xB295, 0x77D4, 0xB296, 0x77D5, 0xB297, 0x77D6,\n\t0xB298, 0x77D8, 0xB299, 0x77D9, 0xB29A, 0x77DA, 0xB29B, 0x77DD,\t0xB29C, 0x77DE, 0xB29D, 0x77DF, 0xB29E, 0x77E0, 0xB29F, 0x77E1,\n\t0xB2A0, 0x77E4, 0xB2A1, 0x75C5, 0xB2A2, 0x5E76, 0xB2A3, 0x73BB,\t0xB2A4, 0x83E0, 0xB2A5, 0x64AD, 0xB2A6, 0x62E8, 0xB2A7, 0x94B5,\n\t0xB2A8, 0x6CE2, 0xB2A9, 0x535A, 0xB2AA, 0x52C3, 0xB2AB, 0x640F,\t0xB2AC, 0x94C2, 0xB2AD, 0x7B94, 0xB2AE, 0x4F2F, 0xB2AF, 0x5E1B,\n\t0xB2B0, 0x8236, 0xB2B1, 0x8116, 0xB2B2, 0x818A, 0xB2B3, 0x6E24,\t0xB2B4, 0x6CCA, 0xB2B5, 0x9A73, 0xB2B6, 0x6355, 0xB2B7, 0x535C,\n\t0xB2B8, 0x54FA, 0xB2B9, 0x8865, 0xB2BA, 0x57E0, 0xB2BB, 0x4E0D,\t0xB2BC, 0x5E03, 0xB2BD, 0x6B65, 0xB2BE, 0x7C3F, 0xB2BF, 0x90E8,\n\t0xB2C0, 0x6016, 0xB2C1, 0x64E6, 0xB2C2, 0x731C, 0xB2C3, 0x88C1,\t0xB2C4, 0x6750, 0xB2C5, 0x624D, 0xB2C6, 0x8D22, 0xB2C7, 0x776C,\n\t0xB2C8, 0x8E29, 0xB2C9, 0x91C7, 0xB2CA, 0x5F69, 0xB2CB, 0x83DC,\t0xB2CC, 0x8521, 0xB2CD, 0x9910, 0xB2CE, 0x53C2, 0xB2CF, 0x8695,\n\t0xB2D0, 0x6B8B, 0xB2D1, 0x60ED, 0xB2D2, 0x60E8, 0xB2D3, 0x707F,\t0xB2D4, 0x82CD, 0xB2D5, 0x8231, 0xB2D6, 0x4ED3, 0xB2D7, 0x6CA7,\n\t0xB2D8, 0x85CF, 0xB2D9, 0x64CD, 0xB2DA, 0x7CD9, 0xB2DB, 0x69FD,\t0xB2DC, 0x66F9, 0xB2DD, 0x8349, 0xB2DE, 0x5395, 0xB2DF, 0x7B56,\n\t0xB2E0, 0x4FA7, 0xB2E1, 0x518C, 0xB2E2, 0x6D4B, 0xB2E3, 0x5C42,\t0xB2E4, 0x8E6D, 0xB2E5, 0x63D2, 0xB2E6, 0x53C9, 0xB2E7, 0x832C,\n\t0xB2E8, 0x8336, 0xB2E9, 0x67E5, 0xB2EA, 0x78B4, 0xB2EB, 0x643D,\t0xB2EC, 0x5BDF, 0xB2ED, 0x5C94, 0xB2EE, 0x5DEE, 0xB2EF, 0x8BE7,\n\t0xB2F0, 0x62C6, 0xB2F1, 0x67F4, 0xB2F2, 0x8C7A, 0xB2F3, 0x6400,\t0xB2F4, 0x63BA, 0xB2F5, 0x8749, 0xB2F6, 0x998B, 0xB2F7, 0x8C17,\n\t0xB2F8, 0x7F20, 0xB2F9, 0x94F2, 0xB2FA, 0x4EA7, 0xB2FB, 0x9610,\t0xB2FC, 0x98A4, 0xB2FD, 0x660C, 0xB2FE, 0x7316, 0xB340, 0x77E6,\n\t0xB341, 0x77E8, 0xB342, 0x77EA, 0xB343, 0x77EF, 0xB344, 0x77F0,\t0xB345, 0x77F1, 0xB346, 0x77F2, 0xB347, 0x77F4, 0xB348, 0x77F5,\n\t0xB349, 0x77F7, 0xB34A, 0x77F9, 0xB34B, 0x77FA, 0xB34C, 0x77FB,\t0xB34D, 0x77FC, 0xB34E, 0x7803, 0xB34F, 0x7804, 0xB350, 0x7805,\n\t0xB351, 0x7806, 0xB352, 0x7807, 0xB353, 0x7808, 0xB354, 0x780A,\t0xB355, 0x780B, 0xB356, 0x780E, 0xB357, 0x780F, 0xB358, 0x7810,\n\t0xB359, 0x7813, 0xB35A, 0x7815, 0xB35B, 0x7819, 0xB35C, 0x781B,\t0xB35D, 0x781E, 0xB35E, 0x7820, 0xB35F, 0x7821, 0xB360, 0x7822,\n\t0xB361, 0x7824, 0xB362, 0x7828, 0xB363, 0x782A, 0xB364, 0x782B,\t0xB365, 0x782E, 0xB366, 0x782F, 0xB367, 0x7831, 0xB368, 0x7832,\n\t0xB369, 0x7833, 0xB36A, 0x7835, 0xB36B, 0x7836, 0xB36C, 0x783D,\t0xB36D, 0x783F, 0xB36E, 0x7841, 0xB36F, 0x7842, 0xB370, 0x7843,\n\t0xB371, 0x7844, 0xB372, 0x7846, 0xB373, 0x7848, 0xB374, 0x7849,\t0xB375, 0x784A, 0xB376, 0x784B, 0xB377, 0x784D, 0xB378, 0x784F,\n\t0xB379, 0x7851, 0xB37A, 0x7853, 0xB37B, 0x7854, 0xB37C, 0x7858,\t0xB37D, 0x7859, 0xB37E, 0x785A, 0xB380, 0x785B, 0xB381, 0x785C,\n\t0xB382, 0x785E, 0xB383, 0x785F, 0xB384, 0x7860, 0xB385, 0x7861,\t0xB386, 0x7862, 0xB387, 0x7863, 0xB388, 0x7864, 0xB389, 0x7865,\n\t0xB38A, 0x7866, 0xB38B, 0x7867, 0xB38C, 0x7868, 0xB38D, 0x7869,\t0xB38E, 0x786F, 0xB38F, 0x7870, 0xB390, 0x7871, 0xB391, 0x7872,\n\t0xB392, 0x7873, 0xB393, 0x7874, 0xB394, 0x7875, 0xB395, 0x7876,\t0xB396, 0x7878, 0xB397, 0x7879, 0xB398, 0x787A, 0xB399, 0x787B,\n\t0xB39A, 0x787D, 0xB39B, 0x787E, 0xB39C, 0x787F, 0xB39D, 0x7880,\t0xB39E, 0x7881, 0xB39F, 0x7882, 0xB3A0, 0x7883, 0xB3A1, 0x573A,\n\t0xB3A2, 0x5C1D, 0xB3A3, 0x5E38, 0xB3A4, 0x957F, 0xB3A5, 0x507F,\t0xB3A6, 0x80A0, 0xB3A7, 0x5382, 0xB3A8, 0x655E, 0xB3A9, 0x7545,\n\t0xB3AA, 0x5531, 0xB3AB, 0x5021, 0xB3AC, 0x8D85, 0xB3AD, 0x6284,\t0xB3AE, 0x949E, 0xB3AF, 0x671D, 0xB3B0, 0x5632, 0xB3B1, 0x6F6E,\n\t0xB3B2, 0x5DE2, 0xB3B3, 0x5435, 0xB3B4, 0x7092, 0xB3B5, 0x8F66,\t0xB3B6, 0x626F, 0xB3B7, 0x64A4, 0xB3B8, 0x63A3, 0xB3B9, 0x5F7B,\n\t0xB3BA, 0x6F88, 0xB3BB, 0x90F4, 0xB3BC, 0x81E3, 0xB3BD, 0x8FB0,\t0xB3BE, 0x5C18, 0xB3BF, 0x6668, 0xB3C0, 0x5FF1, 0xB3C1, 0x6C89,\n\t0xB3C2, 0x9648, 0xB3C3, 0x8D81, 0xB3C4, 0x886C, 0xB3C5, 0x6491,\t0xB3C6, 0x79F0, 0xB3C7, 0x57CE, 0xB3C8, 0x6A59, 0xB3C9, 0x6210,\n\t0xB3CA, 0x5448, 0xB3CB, 0x4E58, 0xB3CC, 0x7A0B, 0xB3CD, 0x60E9,\t0xB3CE, 0x6F84, 0xB3CF, 0x8BDA, 0xB3D0, 0x627F, 0xB3D1, 0x901E,\n\t0xB3D2, 0x9A8B, 0xB3D3, 0x79E4, 0xB3D4, 0x5403, 0xB3D5, 0x75F4,\t0xB3D6, 0x6301, 0xB3D7, 0x5319, 0xB3D8, 0x6C60, 0xB3D9, 0x8FDF,\n\t0xB3DA, 0x5F1B, 0xB3DB, 0x9A70, 0xB3DC, 0x803B, 0xB3DD, 0x9F7F,\t0xB3DE, 0x4F88, 0xB3DF, 0x5C3A, 0xB3E0, 0x8D64, 0xB3E1, 0x7FC5,\n\t0xB3E2, 0x65A5, 0xB3E3, 0x70BD, 0xB3E4, 0x5145, 0xB3E5, 0x51B2,\t0xB3E6, 0x866B, 0xB3E7, 0x5D07, 0xB3E8, 0x5BA0, 0xB3E9, 0x62BD,\n\t0xB3EA, 0x916C, 0xB3EB, 0x7574, 0xB3EC, 0x8E0C, 0xB3ED, 0x7A20,\t0xB3EE, 0x6101, 0xB3EF, 0x7B79, 0xB3F0, 0x4EC7, 0xB3F1, 0x7EF8,\n\t0xB3F2, 0x7785, 0xB3F3, 0x4E11, 0xB3F4, 0x81ED, 0xB3F5, 0x521D,\t0xB3F6, 0x51FA, 0xB3F7, 0x6A71, 0xB3F8, 0x53A8, 0xB3F9, 0x8E87,\n\t0xB3FA, 0x9504, 0xB3FB, 0x96CF, 0xB3FC, 0x6EC1, 0xB3FD, 0x9664,\t0xB3FE, 0x695A, 0xB440, 0x7884, 0xB441, 0x7885, 0xB442, 0x7886,\n\t0xB443, 0x7888, 0xB444, 0x788A, 0xB445, 0x788B, 0xB446, 0x788F,\t0xB447, 0x7890, 0xB448, 0x7892, 0xB449, 0x7894, 0xB44A, 0x7895,\n\t0xB44B, 0x7896, 0xB44C, 0x7899, 0xB44D, 0x789D, 0xB44E, 0x789E,\t0xB44F, 0x78A0, 0xB450, 0x78A2, 0xB451, 0x78A4, 0xB452, 0x78A6,\n\t0xB453, 0x78A8, 0xB454, 0x78A9, 0xB455, 0x78AA, 0xB456, 0x78AB,\t0xB457, 0x78AC, 0xB458, 0x78AD, 0xB459, 0x78AE, 0xB45A, 0x78AF,\n\t0xB45B, 0x78B5, 0xB45C, 0x78B6, 0xB45D, 0x78B7, 0xB45E, 0x78B8,\t0xB45F, 0x78BA, 0xB460, 0x78BB, 0xB461, 0x78BC, 0xB462, 0x78BD,\n\t0xB463, 0x78BF, 0xB464, 0x78C0, 0xB465, 0x78C2, 0xB466, 0x78C3,\t0xB467, 0x78C4, 0xB468, 0x78C6, 0xB469, 0x78C7, 0xB46A, 0x78C8,\n\t0xB46B, 0x78CC, 0xB46C, 0x78CD, 0xB46D, 0x78CE, 0xB46E, 0x78CF,\t0xB46F, 0x78D1, 0xB470, 0x78D2, 0xB471, 0x78D3, 0xB472, 0x78D6,\n\t0xB473, 0x78D7, 0xB474, 0x78D8, 0xB475, 0x78DA, 0xB476, 0x78DB,\t0xB477, 0x78DC, 0xB478, 0x78DD, 0xB479, 0x78DE, 0xB47A, 0x78DF,\n\t0xB47B, 0x78E0, 0xB47C, 0x78E1, 0xB47D, 0x78E2, 0xB47E, 0x78E3,\t0xB480, 0x78E4, 0xB481, 0x78E5, 0xB482, 0x78E6, 0xB483, 0x78E7,\n\t0xB484, 0x78E9, 0xB485, 0x78EA, 0xB486, 0x78EB, 0xB487, 0x78ED,\t0xB488, 0x78EE, 0xB489, 0x78EF, 0xB48A, 0x78F0, 0xB48B, 0x78F1,\n\t0xB48C, 0x78F3, 0xB48D, 0x78F5, 0xB48E, 0x78F6, 0xB48F, 0x78F8,\t0xB490, 0x78F9, 0xB491, 0x78FB, 0xB492, 0x78FC, 0xB493, 0x78FD,\n\t0xB494, 0x78FE, 0xB495, 0x78FF, 0xB496, 0x7900, 0xB497, 0x7902,\t0xB498, 0x7903, 0xB499, 0x7904, 0xB49A, 0x7906, 0xB49B, 0x7907,\n\t0xB49C, 0x7908, 0xB49D, 0x7909, 0xB49E, 0x790A, 0xB49F, 0x790B,\t0xB4A0, 0x790C, 0xB4A1, 0x7840, 0xB4A2, 0x50A8, 0xB4A3, 0x77D7,\n\t0xB4A4, 0x6410, 0xB4A5, 0x89E6, 0xB4A6, 0x5904, 0xB4A7, 0x63E3,\t0xB4A8, 0x5DDD, 0xB4A9, 0x7A7F, 0xB4AA, 0x693D, 0xB4AB, 0x4F20,\n\t0xB4AC, 0x8239, 0xB4AD, 0x5598, 0xB4AE, 0x4E32, 0xB4AF, 0x75AE,\t0xB4B0, 0x7A97, 0xB4B1, 0x5E62, 0xB4B2, 0x5E8A, 0xB4B3, 0x95EF,\n\t0xB4B4, 0x521B, 0xB4B5, 0x5439, 0xB4B6, 0x708A, 0xB4B7, 0x6376,\t0xB4B8, 0x9524, 0xB4B9, 0x5782, 0xB4BA, 0x6625, 0xB4BB, 0x693F,\n\t0xB4BC, 0x9187, 0xB4BD, 0x5507, 0xB4BE, 0x6DF3, 0xB4BF, 0x7EAF,\t0xB4C0, 0x8822, 0xB4C1, 0x6233, 0xB4C2, 0x7EF0, 0xB4C3, 0x75B5,\n\t0xB4C4, 0x8328, 0xB4C5, 0x78C1, 0xB4C6, 0x96CC, 0xB4C7, 0x8F9E,\t0xB4C8, 0x6148, 0xB4C9, 0x74F7, 0xB4CA, 0x8BCD, 0xB4CB, 0x6B64,\n\t0xB4CC, 0x523A, 0xB4CD, 0x8D50, 0xB4CE, 0x6B21, 0xB4CF, 0x806A,\t0xB4D0, 0x8471, 0xB4D1, 0x56F1, 0xB4D2, 0x5306, 0xB4D3, 0x4ECE,\n\t0xB4D4, 0x4E1B, 0xB4D5, 0x51D1, 0xB4D6, 0x7C97, 0xB4D7, 0x918B,\t0xB4D8, 0x7C07, 0xB4D9, 0x4FC3, 0xB4DA, 0x8E7F, 0xB4DB, 0x7BE1,\n\t0xB4DC, 0x7A9C, 0xB4DD, 0x6467, 0xB4DE, 0x5D14, 0xB4DF, 0x50AC,\t0xB4E0, 0x8106, 0xB4E1, 0x7601, 0xB4E2, 0x7CB9, 0xB4E3, 0x6DEC,\n\t0xB4E4, 0x7FE0, 0xB4E5, 0x6751, 0xB4E6, 0x5B58, 0xB4E7, 0x5BF8,\t0xB4E8, 0x78CB, 0xB4E9, 0x64AE, 0xB4EA, 0x6413, 0xB4EB, 0x63AA,\n\t0xB4EC, 0x632B, 0xB4ED, 0x9519, 0xB4EE, 0x642D, 0xB4EF, 0x8FBE,\t0xB4F0, 0x7B54, 0xB4F1, 0x7629, 0xB4F2, 0x6253, 0xB4F3, 0x5927,\n\t0xB4F4, 0x5446, 0xB4F5, 0x6B79, 0xB4F6, 0x50A3, 0xB4F7, 0x6234,\t0xB4F8, 0x5E26, 0xB4F9, 0x6B86, 0xB4FA, 0x4EE3, 0xB4FB, 0x8D37,\n\t0xB4FC, 0x888B, 0xB4FD, 0x5F85, 0xB4FE, 0x902E, 0xB540, 0x790D,\t0xB541, 0x790E, 0xB542, 0x790F, 0xB543, 0x7910, 0xB544, 0x7911,\n\t0xB545, 0x7912, 0xB546, 0x7914, 0xB547, 0x7915, 0xB548, 0x7916,\t0xB549, 0x7917, 0xB54A, 0x7918, 0xB54B, 0x7919, 0xB54C, 0x791A,\n\t0xB54D, 0x791B, 0xB54E, 0x791C, 0xB54F, 0x791D, 0xB550, 0x791F,\t0xB551, 0x7920, 0xB552, 0x7921, 0xB553, 0x7922, 0xB554, 0x7923,\n\t0xB555, 0x7925, 0xB556, 0x7926, 0xB557, 0x7927, 0xB558, 0x7928,\t0xB559, 0x7929, 0xB55A, 0x792A, 0xB55B, 0x792B, 0xB55C, 0x792C,\n\t0xB55D, 0x792D, 0xB55E, 0x792E, 0xB55F, 0x792F, 0xB560, 0x7930,\t0xB561, 0x7931, 0xB562, 0x7932, 0xB563, 0x7933, 0xB564, 0x7935,\n\t0xB565, 0x7936, 0xB566, 0x7937, 0xB567, 0x7938, 0xB568, 0x7939,\t0xB569, 0x793D, 0xB56A, 0x793F, 0xB56B, 0x7942, 0xB56C, 0x7943,\n\t0xB56D, 0x7944, 0xB56E, 0x7945, 0xB56F, 0x7947, 0xB570, 0x794A,\t0xB571, 0x794B, 0xB572, 0x794C, 0xB573, 0x794D, 0xB574, 0x794E,\n\t0xB575, 0x794F, 0xB576, 0x7950, 0xB577, 0x7951, 0xB578, 0x7952,\t0xB579, 0x7954, 0xB57A, 0x7955, 0xB57B, 0x7958, 0xB57C, 0x7959,\n\t0xB57D, 0x7961, 0xB57E, 0x7963, 0xB580, 0x7964, 0xB581, 0x7966,\t0xB582, 0x7969, 0xB583, 0x796A, 0xB584, 0x796B, 0xB585, 0x796C,\n\t0xB586, 0x796E, 0xB587, 0x7970, 0xB588, 0x7971, 0xB589, 0x7972,\t0xB58A, 0x7973, 0xB58B, 0x7974, 0xB58C, 0x7975, 0xB58D, 0x7976,\n\t0xB58E, 0x7979, 0xB58F, 0x797B, 0xB590, 0x797C, 0xB591, 0x797D,\t0xB592, 0x797E, 0xB593, 0x797F, 0xB594, 0x7982, 0xB595, 0x7983,\n\t0xB596, 0x7986, 0xB597, 0x7987, 0xB598, 0x7988, 0xB599, 0x7989,\t0xB59A, 0x798B, 0xB59B, 0x798C, 0xB59C, 0x798D, 0xB59D, 0x798E,\n\t0xB59E, 0x7990, 0xB59F, 0x7991, 0xB5A0, 0x7992, 0xB5A1, 0x6020,\t0xB5A2, 0x803D, 0xB5A3, 0x62C5, 0xB5A4, 0x4E39, 0xB5A5, 0x5355,\n\t0xB5A6, 0x90F8, 0xB5A7, 0x63B8, 0xB5A8, 0x80C6, 0xB5A9, 0x65E6,\t0xB5AA, 0x6C2E, 0xB5AB, 0x4F46, 0xB5AC, 0x60EE, 0xB5AD, 0x6DE1,\n\t0xB5AE, 0x8BDE, 0xB5AF, 0x5F39, 0xB5B0, 0x86CB, 0xB5B1, 0x5F53,\t0xB5B2, 0x6321, 0xB5B3, 0x515A, 0xB5B4, 0x8361, 0xB5B5, 0x6863,\n\t0xB5B6, 0x5200, 0xB5B7, 0x6363, 0xB5B8, 0x8E48, 0xB5B9, 0x5012,\t0xB5BA, 0x5C9B, 0xB5BB, 0x7977, 0xB5BC, 0x5BFC, 0xB5BD, 0x5230,\n\t0xB5BE, 0x7A3B, 0xB5BF, 0x60BC, 0xB5C0, 0x9053, 0xB5C1, 0x76D7,\t0xB5C2, 0x5FB7, 0xB5C3, 0x5F97, 0xB5C4, 0x7684, 0xB5C5, 0x8E6C,\n\t0xB5C6, 0x706F, 0xB5C7, 0x767B, 0xB5C8, 0x7B49, 0xB5C9, 0x77AA,\t0xB5CA, 0x51F3, 0xB5CB, 0x9093, 0xB5CC, 0x5824, 0xB5CD, 0x4F4E,\n\t0xB5CE, 0x6EF4, 0xB5CF, 0x8FEA, 0xB5D0, 0x654C, 0xB5D1, 0x7B1B,\t0xB5D2, 0x72C4, 0xB5D3, 0x6DA4, 0xB5D4, 0x7FDF, 0xB5D5, 0x5AE1,\n\t0xB5D6, 0x62B5, 0xB5D7, 0x5E95, 0xB5D8, 0x5730, 0xB5D9, 0x8482,\t0xB5DA, 0x7B2C, 0xB5DB, 0x5E1D, 0xB5DC, 0x5F1F, 0xB5DD, 0x9012,\n\t0xB5DE, 0x7F14, 0xB5DF, 0x98A0, 0xB5E0, 0x6382, 0xB5E1, 0x6EC7,\t0xB5E2, 0x7898, 0xB5E3, 0x70B9, 0xB5E4, 0x5178, 0xB5E5, 0x975B,\n\t0xB5E6, 0x57AB, 0xB5E7, 0x7535, 0xB5E8, 0x4F43, 0xB5E9, 0x7538,\t0xB5EA, 0x5E97, 0xB5EB, 0x60E6, 0xB5EC, 0x5960, 0xB5ED, 0x6DC0,\n\t0xB5EE, 0x6BBF, 0xB5EF, 0x7889, 0xB5F0, 0x53FC, 0xB5F1, 0x96D5,\t0xB5F2, 0x51CB, 0xB5F3, 0x5201, 0xB5F4, 0x6389, 0xB5F5, 0x540A,\n\t0xB5F6, 0x9493, 0xB5F7, 0x8C03, 0xB5F8, 0x8DCC, 0xB5F9, 0x7239,\t0xB5FA, 0x789F, 0xB5FB, 0x8776, 0xB5FC, 0x8FED, 0xB5FD, 0x8C0D,\n\t0xB5FE, 0x53E0, 0xB640, 0x7993, 0xB641, 0x7994, 0xB642, 0x7995,\t0xB643, 0x7996, 0xB644, 0x7997, 0xB645, 0x7998, 0xB646, 0x7999,\n\t0xB647, 0x799B, 0xB648, 0x799C, 0xB649, 0x799D, 0xB64A, 0x799E,\t0xB64B, 0x799F, 0xB64C, 0x79A0, 0xB64D, 0x79A1, 0xB64E, 0x79A2,\n\t0xB64F, 0x79A3, 0xB650, 0x79A4, 0xB651, 0x79A5, 0xB652, 0x79A6,\t0xB653, 0x79A8, 0xB654, 0x79A9, 0xB655, 0x79AA, 0xB656, 0x79AB,\n\t0xB657, 0x79AC, 0xB658, 0x79AD, 0xB659, 0x79AE, 0xB65A, 0x79AF,\t0xB65B, 0x79B0, 0xB65C, 0x79B1, 0xB65D, 0x79B2, 0xB65E, 0x79B4,\n\t0xB65F, 0x79B5, 0xB660, 0x79B6, 0xB661, 0x79B7, 0xB662, 0x79B8,\t0xB663, 0x79BC, 0xB664, 0x79BF, 0xB665, 0x79C2, 0xB666, 0x79C4,\n\t0xB667, 0x79C5, 0xB668, 0x79C7, 0xB669, 0x79C8, 0xB66A, 0x79CA,\t0xB66B, 0x79CC, 0xB66C, 0x79CE, 0xB66D, 0x79CF, 0xB66E, 0x79D0,\n\t0xB66F, 0x79D3, 0xB670, 0x79D4, 0xB671, 0x79D6, 0xB672, 0x79D7,\t0xB673, 0x79D9, 0xB674, 0x79DA, 0xB675, 0x79DB, 0xB676, 0x79DC,\n\t0xB677, 0x79DD, 0xB678, 0x79DE, 0xB679, 0x79E0, 0xB67A, 0x79E1,\t0xB67B, 0x79E2, 0xB67C, 0x79E5, 0xB67D, 0x79E8, 0xB67E, 0x79EA,\n\t0xB680, 0x79EC, 0xB681, 0x79EE, 0xB682, 0x79F1, 0xB683, 0x79F2,\t0xB684, 0x79F3, 0xB685, 0x79F4, 0xB686, 0x79F5, 0xB687, 0x79F6,\n\t0xB688, 0x79F7, 0xB689, 0x79F9, 0xB68A, 0x79FA, 0xB68B, 0x79FC,\t0xB68C, 0x79FE, 0xB68D, 0x79FF, 0xB68E, 0x7A01, 0xB68F, 0x7A04,\n\t0xB690, 0x7A05, 0xB691, 0x7A07, 0xB692, 0x7A08, 0xB693, 0x7A09,\t0xB694, 0x7A0A, 0xB695, 0x7A0C, 0xB696, 0x7A0F, 0xB697, 0x7A10,\n\t0xB698, 0x7A11, 0xB699, 0x7A12, 0xB69A, 0x7A13, 0xB69B, 0x7A15,\t0xB69C, 0x7A16, 0xB69D, 0x7A18, 0xB69E, 0x7A19, 0xB69F, 0x7A1B,\n\t0xB6A0, 0x7A1C, 0xB6A1, 0x4E01, 0xB6A2, 0x76EF, 0xB6A3, 0x53EE,\t0xB6A4, 0x9489, 0xB6A5, 0x9876, 0xB6A6, 0x9F0E, 0xB6A7, 0x952D,\n\t0xB6A8, 0x5B9A, 0xB6A9, 0x8BA2, 0xB6AA, 0x4E22, 0xB6AB, 0x4E1C,\t0xB6AC, 0x51AC, 0xB6AD, 0x8463, 0xB6AE, 0x61C2, 0xB6AF, 0x52A8,\n\t0xB6B0, 0x680B, 0xB6B1, 0x4F97, 0xB6B2, 0x606B, 0xB6B3, 0x51BB,\t0xB6B4, 0x6D1E, 0xB6B5, 0x515C, 0xB6B6, 0x6296, 0xB6B7, 0x6597,\n\t0xB6B8, 0x9661, 0xB6B9, 0x8C46, 0xB6BA, 0x9017, 0xB6BB, 0x75D8,\t0xB6BC, 0x90FD, 0xB6BD, 0x7763, 0xB6BE, 0x6BD2, 0xB6BF, 0x728A,\n\t0xB6C0, 0x72EC, 0xB6C1, 0x8BFB, 0xB6C2, 0x5835, 0xB6C3, 0x7779,\t0xB6C4, 0x8D4C, 0xB6C5, 0x675C, 0xB6C6, 0x9540, 0xB6C7, 0x809A,\n\t0xB6C8, 0x5EA6, 0xB6C9, 0x6E21, 0xB6CA, 0x5992, 0xB6CB, 0x7AEF,\t0xB6CC, 0x77ED, 0xB6CD, 0x953B, 0xB6CE, 0x6BB5, 0xB6CF, 0x65AD,\n\t0xB6D0, 0x7F0E, 0xB6D1, 0x5806, 0xB6D2, 0x5151, 0xB6D3, 0x961F,\t0xB6D4, 0x5BF9, 0xB6D5, 0x58A9, 0xB6D6, 0x5428, 0xB6D7, 0x8E72,\n\t0xB6D8, 0x6566, 0xB6D9, 0x987F, 0xB6DA, 0x56E4, 0xB6DB, 0x949D,\t0xB6DC, 0x76FE, 0xB6DD, 0x9041, 0xB6DE, 0x6387, 0xB6DF, 0x54C6,\n\t0xB6E0, 0x591A, 0xB6E1, 0x593A, 0xB6E2, 0x579B, 0xB6E3, 0x8EB2,\t0xB6E4, 0x6735, 0xB6E5, 0x8DFA, 0xB6E6, 0x8235, 0xB6E7, 0x5241,\n\t0xB6E8, 0x60F0, 0xB6E9, 0x5815, 0xB6EA, 0x86FE, 0xB6EB, 0x5CE8,\t0xB6EC, 0x9E45, 0xB6ED, 0x4FC4, 0xB6EE, 0x989D, 0xB6EF, 0x8BB9,\n\t0xB6F0, 0x5A25, 0xB6F1, 0x6076, 0xB6F2, 0x5384, 0xB6F3, 0x627C,\t0xB6F4, 0x904F, 0xB6F5, 0x9102, 0xB6F6, 0x997F, 0xB6F7, 0x6069,\n\t0xB6F8, 0x800C, 0xB6F9, 0x513F, 0xB6FA, 0x8033, 0xB6FB, 0x5C14,\t0xB6FC, 0x9975, 0xB6FD, 0x6D31, 0xB6FE, 0x4E8C, 0xB740, 0x7A1D,\n\t0xB741, 0x7A1F, 0xB742, 0x7A21, 0xB743, 0x7A22, 0xB744, 0x7A24,\t0xB745, 0x7A25, 0xB746, 0x7A26, 0xB747, 0x7A27, 0xB748, 0x7A28,\n\t0xB749, 0x7A29, 0xB74A, 0x7A2A, 0xB74B, 0x7A2B, 0xB74C, 0x7A2C,\t0xB74D, 0x7A2D, 0xB74E, 0x7A2E, 0xB74F, 0x7A2F, 0xB750, 0x7A30,\n\t0xB751, 0x7A31, 0xB752, 0x7A32, 0xB753, 0x7A34, 0xB754, 0x7A35,\t0xB755, 0x7A36, 0xB756, 0x7A38, 0xB757, 0x7A3A, 0xB758, 0x7A3E,\n\t0xB759, 0x7A40, 0xB75A, 0x7A41, 0xB75B, 0x7A42, 0xB75C, 0x7A43,\t0xB75D, 0x7A44, 0xB75E, 0x7A45, 0xB75F, 0x7A47, 0xB760, 0x7A48,\n\t0xB761, 0x7A49, 0xB762, 0x7A4A, 0xB763, 0x7A4B, 0xB764, 0x7A4C,\t0xB765, 0x7A4D, 0xB766, 0x7A4E, 0xB767, 0x7A4F, 0xB768, 0x7A50,\n\t0xB769, 0x7A52, 0xB76A, 0x7A53, 0xB76B, 0x7A54, 0xB76C, 0x7A55,\t0xB76D, 0x7A56, 0xB76E, 0x7A58, 0xB76F, 0x7A59, 0xB770, 0x7A5A,\n\t0xB771, 0x7A5B, 0xB772, 0x7A5C, 0xB773, 0x7A5D, 0xB774, 0x7A5E,\t0xB775, 0x7A5F, 0xB776, 0x7A60, 0xB777, 0x7A61, 0xB778, 0x7A62,\n\t0xB779, 0x7A63, 0xB77A, 0x7A64, 0xB77B, 0x7A65, 0xB77C, 0x7A66,\t0xB77D, 0x7A67, 0xB77E, 0x7A68, 0xB780, 0x7A69, 0xB781, 0x7A6A,\n\t0xB782, 0x7A6B, 0xB783, 0x7A6C, 0xB784, 0x7A6D, 0xB785, 0x7A6E,\t0xB786, 0x7A6F, 0xB787, 0x7A71, 0xB788, 0x7A72, 0xB789, 0x7A73,\n\t0xB78A, 0x7A75, 0xB78B, 0x7A7B, 0xB78C, 0x7A7C, 0xB78D, 0x7A7D,\t0xB78E, 0x7A7E, 0xB78F, 0x7A82, 0xB790, 0x7A85, 0xB791, 0x7A87,\n\t0xB792, 0x7A89, 0xB793, 0x7A8A, 0xB794, 0x7A8B, 0xB795, 0x7A8C,\t0xB796, 0x7A8E, 0xB797, 0x7A8F, 0xB798, 0x7A90, 0xB799, 0x7A93,\n\t0xB79A, 0x7A94, 0xB79B, 0x7A99, 0xB79C, 0x7A9A, 0xB79D, 0x7A9B,\t0xB79E, 0x7A9E, 0xB79F, 0x7AA1, 0xB7A0, 0x7AA2, 0xB7A1, 0x8D30,\n\t0xB7A2, 0x53D1, 0xB7A3, 0x7F5A, 0xB7A4, 0x7B4F, 0xB7A5, 0x4F10,\t0xB7A6, 0x4E4F, 0xB7A7, 0x9600, 0xB7A8, 0x6CD5, 0xB7A9, 0x73D0,\n\t0xB7AA, 0x85E9, 0xB7AB, 0x5E06, 0xB7AC, 0x756A, 0xB7AD, 0x7FFB,\t0xB7AE, 0x6A0A, 0xB7AF, 0x77FE, 0xB7B0, 0x9492, 0xB7B1, 0x7E41,\n\t0xB7B2, 0x51E1, 0xB7B3, 0x70E6, 0xB7B4, 0x53CD, 0xB7B5, 0x8FD4,\t0xB7B6, 0x8303, 0xB7B7, 0x8D29, 0xB7B8, 0x72AF, 0xB7B9, 0x996D,\n\t0xB7BA, 0x6CDB, 0xB7BB, 0x574A, 0xB7BC, 0x82B3, 0xB7BD, 0x65B9,\t0xB7BE, 0x80AA, 0xB7BF, 0x623F, 0xB7C0, 0x9632, 0xB7C1, 0x59A8,\n\t0xB7C2, 0x4EFF, 0xB7C3, 0x8BBF, 0xB7C4, 0x7EBA, 0xB7C5, 0x653E,\t0xB7C6, 0x83F2, 0xB7C7, 0x975E, 0xB7C8, 0x5561, 0xB7C9, 0x98DE,\n\t0xB7CA, 0x80A5, 0xB7CB, 0x532A, 0xB7CC, 0x8BFD, 0xB7CD, 0x5420,\t0xB7CE, 0x80BA, 0xB7CF, 0x5E9F, 0xB7D0, 0x6CB8, 0xB7D1, 0x8D39,\n\t0xB7D2, 0x82AC, 0xB7D3, 0x915A, 0xB7D4, 0x5429, 0xB7D5, 0x6C1B,\t0xB7D6, 0x5206, 0xB7D7, 0x7EB7, 0xB7D8, 0x575F, 0xB7D9, 0x711A,\n\t0xB7DA, 0x6C7E, 0xB7DB, 0x7C89, 0xB7DC, 0x594B, 0xB7DD, 0x4EFD,\t0xB7DE, 0x5FFF, 0xB7DF, 0x6124, 0xB7E0, 0x7CAA, 0xB7E1, 0x4E30,\n\t0xB7E2, 0x5C01, 0xB7E3, 0x67AB, 0xB7E4, 0x8702, 0xB7E5, 0x5CF0,\t0xB7E6, 0x950B, 0xB7E7, 0x98CE, 0xB7E8, 0x75AF, 0xB7E9, 0x70FD,\n\t0xB7EA, 0x9022, 0xB7EB, 0x51AF, 0xB7EC, 0x7F1D, 0xB7ED, 0x8BBD,\t0xB7EE, 0x5949, 0xB7EF, 0x51E4, 0xB7F0, 0x4F5B, 0xB7F1, 0x5426,\n\t0xB7F2, 0x592B, 0xB7F3, 0x6577, 0xB7F4, 0x80A4, 0xB7F5, 0x5B75,\t0xB7F6, 0x6276, 0xB7F7, 0x62C2, 0xB7F8, 0x8F90, 0xB7F9, 0x5E45,\n\t0xB7FA, 0x6C1F, 0xB7FB, 0x7B26, 0xB7FC, 0x4F0F, 0xB7FD, 0x4FD8,\t0xB7FE, 0x670D, 0xB840, 0x7AA3, 0xB841, 0x7AA4, 0xB842, 0x7AA7,\n\t0xB843, 0x7AA9, 0xB844, 0x7AAA, 0xB845, 0x7AAB, 0xB846, 0x7AAE,\t0xB847, 0x7AAF, 0xB848, 0x7AB0, 0xB849, 0x7AB1, 0xB84A, 0x7AB2,\n\t0xB84B, 0x7AB4, 0xB84C, 0x7AB5, 0xB84D, 0x7AB6, 0xB84E, 0x7AB7,\t0xB84F, 0x7AB8, 0xB850, 0x7AB9, 0xB851, 0x7ABA, 0xB852, 0x7ABB,\n\t0xB853, 0x7ABC, 0xB854, 0x7ABD, 0xB855, 0x7ABE, 0xB856, 0x7AC0,\t0xB857, 0x7AC1, 0xB858, 0x7AC2, 0xB859, 0x7AC3, 0xB85A, 0x7AC4,\n\t0xB85B, 0x7AC5, 0xB85C, 0x7AC6, 0xB85D, 0x7AC7, 0xB85E, 0x7AC8,\t0xB85F, 0x7AC9, 0xB860, 0x7ACA, 0xB861, 0x7ACC, 0xB862, 0x7ACD,\n\t0xB863, 0x7ACE, 0xB864, 0x7ACF, 0xB865, 0x7AD0, 0xB866, 0x7AD1,\t0xB867, 0x7AD2, 0xB868, 0x7AD3, 0xB869, 0x7AD4, 0xB86A, 0x7AD5,\n\t0xB86B, 0x7AD7, 0xB86C, 0x7AD8, 0xB86D, 0x7ADA, 0xB86E, 0x7ADB,\t0xB86F, 0x7ADC, 0xB870, 0x7ADD, 0xB871, 0x7AE1, 0xB872, 0x7AE2,\n\t0xB873, 0x7AE4, 0xB874, 0x7AE7, 0xB875, 0x7AE8, 0xB876, 0x7AE9,\t0xB877, 0x7AEA, 0xB878, 0x7AEB, 0xB879, 0x7AEC, 0xB87A, 0x7AEE,\n\t0xB87B, 0x7AF0, 0xB87C, 0x7AF1, 0xB87D, 0x7AF2, 0xB87E, 0x7AF3,\t0xB880, 0x7AF4, 0xB881, 0x7AF5, 0xB882, 0x7AF6, 0xB883, 0x7AF7,\n\t0xB884, 0x7AF8, 0xB885, 0x7AFB, 0xB886, 0x7AFC, 0xB887, 0x7AFE,\t0xB888, 0x7B00, 0xB889, 0x7B01, 0xB88A, 0x7B02, 0xB88B, 0x7B05,\n\t0xB88C, 0x7B07, 0xB88D, 0x7B09, 0xB88E, 0x7B0C, 0xB88F, 0x7B0D,\t0xB890, 0x7B0E, 0xB891, 0x7B10, 0xB892, 0x7B12, 0xB893, 0x7B13,\n\t0xB894, 0x7B16, 0xB895, 0x7B17, 0xB896, 0x7B18, 0xB897, 0x7B1A,\t0xB898, 0x7B1C, 0xB899, 0x7B1D, 0xB89A, 0x7B1F, 0xB89B, 0x7B21,\n\t0xB89C, 0x7B22, 0xB89D, 0x7B23, 0xB89E, 0x7B27, 0xB89F, 0x7B29,\t0xB8A0, 0x7B2D, 0xB8A1, 0x6D6E, 0xB8A2, 0x6DAA, 0xB8A3, 0x798F,\n\t0xB8A4, 0x88B1, 0xB8A5, 0x5F17, 0xB8A6, 0x752B, 0xB8A7, 0x629A,\t0xB8A8, 0x8F85, 0xB8A9, 0x4FEF, 0xB8AA, 0x91DC, 0xB8AB, 0x65A7,\n\t0xB8AC, 0x812F, 0xB8AD, 0x8151, 0xB8AE, 0x5E9C, 0xB8AF, 0x8150,\t0xB8B0, 0x8D74, 0xB8B1, 0x526F, 0xB8B2, 0x8986, 0xB8B3, 0x8D4B,\n\t0xB8B4, 0x590D, 0xB8B5, 0x5085, 0xB8B6, 0x4ED8, 0xB8B7, 0x961C,\t0xB8B8, 0x7236, 0xB8B9, 0x8179, 0xB8BA, 0x8D1F, 0xB8BB, 0x5BCC,\n\t0xB8BC, 0x8BA3, 0xB8BD, 0x9644, 0xB8BE, 0x5987, 0xB8BF, 0x7F1A,\t0xB8C0, 0x5490, 0xB8C1, 0x5676, 0xB8C2, 0x560E, 0xB8C3, 0x8BE5,\n\t0xB8C4, 0x6539, 0xB8C5, 0x6982, 0xB8C6, 0x9499, 0xB8C7, 0x76D6,\t0xB8C8, 0x6E89, 0xB8C9, 0x5E72, 0xB8CA, 0x7518, 0xB8CB, 0x6746,\n\t0xB8CC, 0x67D1, 0xB8CD, 0x7AFF, 0xB8CE, 0x809D, 0xB8CF, 0x8D76,\t0xB8D0, 0x611F, 0xB8D1, 0x79C6, 0xB8D2, 0x6562, 0xB8D3, 0x8D63,\n\t0xB8D4, 0x5188, 0xB8D5, 0x521A, 0xB8D6, 0x94A2, 0xB8D7, 0x7F38,\t0xB8D8, 0x809B, 0xB8D9, 0x7EB2, 0xB8DA, 0x5C97, 0xB8DB, 0x6E2F,\n\t0xB8DC, 0x6760, 0xB8DD, 0x7BD9, 0xB8DE, 0x768B, 0xB8DF, 0x9AD8,\t0xB8E0, 0x818F, 0xB8E1, 0x7F94, 0xB8E2, 0x7CD5, 0xB8E3, 0x641E,\n\t0xB8E4, 0x9550, 0xB8E5, 0x7A3F, 0xB8E6, 0x544A, 0xB8E7, 0x54E5,\t0xB8E8, 0x6B4C, 0xB8E9, 0x6401, 0xB8EA, 0x6208, 0xB8EB, 0x9E3D,\n\t0xB8EC, 0x80F3, 0xB8ED, 0x7599, 0xB8EE, 0x5272, 0xB8EF, 0x9769,\t0xB8F0, 0x845B, 0xB8F1, 0x683C, 0xB8F2, 0x86E4, 0xB8F3, 0x9601,\n\t0xB8F4, 0x9694, 0xB8F5, 0x94EC, 0xB8F6, 0x4E2A, 0xB8F7, 0x5404,\t0xB8F8, 0x7ED9, 0xB8F9, 0x6839, 0xB8FA, 0x8DDF, 0xB8FB, 0x8015,\n\t0xB8FC, 0x66F4, 0xB8FD, 0x5E9A, 0xB8FE, 0x7FB9, 0xB940, 0x7B2F,\t0xB941, 0x7B30, 0xB942, 0x7B32, 0xB943, 0x7B34, 0xB944, 0x7B35,\n\t0xB945, 0x7B36, 0xB946, 0x7B37, 0xB947, 0x7B39, 0xB948, 0x7B3B,\t0xB949, 0x7B3D, 0xB94A, 0x7B3F, 0xB94B, 0x7B40, 0xB94C, 0x7B41,\n\t0xB94D, 0x7B42, 0xB94E, 0x7B43, 0xB94F, 0x7B44, 0xB950, 0x7B46,\t0xB951, 0x7B48, 0xB952, 0x7B4A, 0xB953, 0x7B4D, 0xB954, 0x7B4E,\n\t0xB955, 0x7B53, 0xB956, 0x7B55, 0xB957, 0x7B57, 0xB958, 0x7B59,\t0xB959, 0x7B5C, 0xB95A, 0x7B5E, 0xB95B, 0x7B5F, 0xB95C, 0x7B61,\n\t0xB95D, 0x7B63, 0xB95E, 0x7B64, 0xB95F, 0x7B65, 0xB960, 0x7B66,\t0xB961, 0x7B67, 0xB962, 0x7B68, 0xB963, 0x7B69, 0xB964, 0x7B6A,\n\t0xB965, 0x7B6B, 0xB966, 0x7B6C, 0xB967, 0x7B6D, 0xB968, 0x7B6F,\t0xB969, 0x7B70, 0xB96A, 0x7B73, 0xB96B, 0x7B74, 0xB96C, 0x7B76,\n\t0xB96D, 0x7B78, 0xB96E, 0x7B7A, 0xB96F, 0x7B7C, 0xB970, 0x7B7D,\t0xB971, 0x7B7F, 0xB972, 0x7B81, 0xB973, 0x7B82, 0xB974, 0x7B83,\n\t0xB975, 0x7B84, 0xB976, 0x7B86, 0xB977, 0x7B87, 0xB978, 0x7B88,\t0xB979, 0x7B89, 0xB97A, 0x7B8A, 0xB97B, 0x7B8B, 0xB97C, 0x7B8C,\n\t0xB97D, 0x7B8E, 0xB97E, 0x7B8F, 0xB980, 0x7B91, 0xB981, 0x7B92,\t0xB982, 0x7B93, 0xB983, 0x7B96, 0xB984, 0x7B98, 0xB985, 0x7B99,\n\t0xB986, 0x7B9A, 0xB987, 0x7B9B, 0xB988, 0x7B9E, 0xB989, 0x7B9F,\t0xB98A, 0x7BA0, 0xB98B, 0x7BA3, 0xB98C, 0x7BA4, 0xB98D, 0x7BA5,\n\t0xB98E, 0x7BAE, 0xB98F, 0x7BAF, 0xB990, 0x7BB0, 0xB991, 0x7BB2,\t0xB992, 0x7BB3, 0xB993, 0x7BB5, 0xB994, 0x7BB6, 0xB995, 0x7BB7,\n\t0xB996, 0x7BB9, 0xB997, 0x7BBA, 0xB998, 0x7BBB, 0xB999, 0x7BBC,\t0xB99A, 0x7BBD, 0xB99B, 0x7BBE, 0xB99C, 0x7BBF, 0xB99D, 0x7BC0,\n\t0xB99E, 0x7BC2, 0xB99F, 0x7BC3, 0xB9A0, 0x7BC4, 0xB9A1, 0x57C2,\t0xB9A2, 0x803F, 0xB9A3, 0x6897, 0xB9A4, 0x5DE5, 0xB9A5, 0x653B,\n\t0xB9A6, 0x529F, 0xB9A7, 0x606D, 0xB9A8, 0x9F9A, 0xB9A9, 0x4F9B,\t0xB9AA, 0x8EAC, 0xB9AB, 0x516C, 0xB9AC, 0x5BAB, 0xB9AD, 0x5F13,\n\t0xB9AE, 0x5DE9, 0xB9AF, 0x6C5E, 0xB9B0, 0x62F1, 0xB9B1, 0x8D21,\t0xB9B2, 0x5171, 0xB9B3, 0x94A9, 0xB9B4, 0x52FE, 0xB9B5, 0x6C9F,\n\t0xB9B6, 0x82DF, 0xB9B7, 0x72D7, 0xB9B8, 0x57A2, 0xB9B9, 0x6784,\t0xB9BA, 0x8D2D, 0xB9BB, 0x591F, 0xB9BC, 0x8F9C, 0xB9BD, 0x83C7,\n\t0xB9BE, 0x5495, 0xB9BF, 0x7B8D, 0xB9C0, 0x4F30, 0xB9C1, 0x6CBD,\t0xB9C2, 0x5B64, 0xB9C3, 0x59D1, 0xB9C4, 0x9F13, 0xB9C5, 0x53E4,\n\t0xB9C6, 0x86CA, 0xB9C7, 0x9AA8, 0xB9C8, 0x8C37, 0xB9C9, 0x80A1,\t0xB9CA, 0x6545, 0xB9CB, 0x987E, 0xB9CC, 0x56FA, 0xB9CD, 0x96C7,\n\t0xB9CE, 0x522E, 0xB9CF, 0x74DC, 0xB9D0, 0x5250, 0xB9D1, 0x5BE1,\t0xB9D2, 0x6302, 0xB9D3, 0x8902, 0xB9D4, 0x4E56, 0xB9D5, 0x62D0,\n\t0xB9D6, 0x602A, 0xB9D7, 0x68FA, 0xB9D8, 0x5173, 0xB9D9, 0x5B98,\t0xB9DA, 0x51A0, 0xB9DB, 0x89C2, 0xB9DC, 0x7BA1, 0xB9DD, 0x9986,\n\t0xB9DE, 0x7F50, 0xB9DF, 0x60EF, 0xB9E0, 0x704C, 0xB9E1, 0x8D2F,\t0xB9E2, 0x5149, 0xB9E3, 0x5E7F, 0xB9E4, 0x901B, 0xB9E5, 0x7470,\n\t0xB9E6, 0x89C4, 0xB9E7, 0x572D, 0xB9E8, 0x7845, 0xB9E9, 0x5F52,\t0xB9EA, 0x9F9F, 0xB9EB, 0x95FA, 0xB9EC, 0x8F68, 0xB9ED, 0x9B3C,\n\t0xB9EE, 0x8BE1, 0xB9EF, 0x7678, 0xB9F0, 0x6842, 0xB9F1, 0x67DC,\t0xB9F2, 0x8DEA, 0xB9F3, 0x8D35, 0xB9F4, 0x523D, 0xB9F5, 0x8F8A,\n\t0xB9F6, 0x6EDA, 0xB9F7, 0x68CD, 0xB9F8, 0x9505, 0xB9F9, 0x90ED,\t0xB9FA, 0x56FD, 0xB9FB, 0x679C, 0xB9FC, 0x88F9, 0xB9FD, 0x8FC7,\n\t0xB9FE, 0x54C8, 0xBA40, 0x7BC5, 0xBA41, 0x7BC8, 0xBA42, 0x7BC9,\t0xBA43, 0x7BCA, 0xBA44, 0x7BCB, 0xBA45, 0x7BCD, 0xBA46, 0x7BCE,\n\t0xBA47, 0x7BCF, 0xBA48, 0x7BD0, 0xBA49, 0x7BD2, 0xBA4A, 0x7BD4,\t0xBA4B, 0x7BD5, 0xBA4C, 0x7BD6, 0xBA4D, 0x7BD7, 0xBA4E, 0x7BD8,\n\t0xBA4F, 0x7BDB, 0xBA50, 0x7BDC, 0xBA51, 0x7BDE, 0xBA52, 0x7BDF,\t0xBA53, 0x7BE0, 0xBA54, 0x7BE2, 0xBA55, 0x7BE3, 0xBA56, 0x7BE4,\n\t0xBA57, 0x7BE7, 0xBA58, 0x7BE8, 0xBA59, 0x7BE9, 0xBA5A, 0x7BEB,\t0xBA5B, 0x7BEC, 0xBA5C, 0x7BED, 0xBA5D, 0x7BEF, 0xBA5E, 0x7BF0,\n\t0xBA5F, 0x7BF2, 0xBA60, 0x7BF3, 0xBA61, 0x7BF4, 0xBA62, 0x7BF5,\t0xBA63, 0x7BF6, 0xBA64, 0x7BF8, 0xBA65, 0x7BF9, 0xBA66, 0x7BFA,\n\t0xBA67, 0x7BFB, 0xBA68, 0x7BFD, 0xBA69, 0x7BFF, 0xBA6A, 0x7C00,\t0xBA6B, 0x7C01, 0xBA6C, 0x7C02, 0xBA6D, 0x7C03, 0xBA6E, 0x7C04,\n\t0xBA6F, 0x7C05, 0xBA70, 0x7C06, 0xBA71, 0x7C08, 0xBA72, 0x7C09,\t0xBA73, 0x7C0A, 0xBA74, 0x7C0D, 0xBA75, 0x7C0E, 0xBA76, 0x7C10,\n\t0xBA77, 0x7C11, 0xBA78, 0x7C12, 0xBA79, 0x7C13, 0xBA7A, 0x7C14,\t0xBA7B, 0x7C15, 0xBA7C, 0x7C17, 0xBA7D, 0x7C18, 0xBA7E, 0x7C19,\n\t0xBA80, 0x7C1A, 0xBA81, 0x7C1B, 0xBA82, 0x7C1C, 0xBA83, 0x7C1D,\t0xBA84, 0x7C1E, 0xBA85, 0x7C20, 0xBA86, 0x7C21, 0xBA87, 0x7C22,\n\t0xBA88, 0x7C23, 0xBA89, 0x7C24, 0xBA8A, 0x7C25, 0xBA8B, 0x7C28,\t0xBA8C, 0x7C29, 0xBA8D, 0x7C2B, 0xBA8E, 0x7C2C, 0xBA8F, 0x7C2D,\n\t0xBA90, 0x7C2E, 0xBA91, 0x7C2F, 0xBA92, 0x7C30, 0xBA93, 0x7C31,\t0xBA94, 0x7C32, 0xBA95, 0x7C33, 0xBA96, 0x7C34, 0xBA97, 0x7C35,\n\t0xBA98, 0x7C36, 0xBA99, 0x7C37, 0xBA9A, 0x7C39, 0xBA9B, 0x7C3A,\t0xBA9C, 0x7C3B, 0xBA9D, 0x7C3C, 0xBA9E, 0x7C3D, 0xBA9F, 0x7C3E,\n\t0xBAA0, 0x7C42, 0xBAA1, 0x9AB8, 0xBAA2, 0x5B69, 0xBAA3, 0x6D77,\t0xBAA4, 0x6C26, 0xBAA5, 0x4EA5, 0xBAA6, 0x5BB3, 0xBAA7, 0x9A87,\n\t0xBAA8, 0x9163, 0xBAA9, 0x61A8, 0xBAAA, 0x90AF, 0xBAAB, 0x97E9,\t0xBAAC, 0x542B, 0xBAAD, 0x6DB5, 0xBAAE, 0x5BD2, 0xBAAF, 0x51FD,\n\t0xBAB0, 0x558A, 0xBAB1, 0x7F55, 0xBAB2, 0x7FF0, 0xBAB3, 0x64BC,\t0xBAB4, 0x634D, 0xBAB5, 0x65F1, 0xBAB6, 0x61BE, 0xBAB7, 0x608D,\n\t0xBAB8, 0x710A, 0xBAB9, 0x6C57, 0xBABA, 0x6C49, 0xBABB, 0x592F,\t0xBABC, 0x676D, 0xBABD, 0x822A, 0xBABE, 0x58D5, 0xBABF, 0x568E,\n\t0xBAC0, 0x8C6A, 0xBAC1, 0x6BEB, 0xBAC2, 0x90DD, 0xBAC3, 0x597D,\t0xBAC4, 0x8017, 0xBAC5, 0x53F7, 0xBAC6, 0x6D69, 0xBAC7, 0x5475,\n\t0xBAC8, 0x559D, 0xBAC9, 0x8377, 0xBACA, 0x83CF, 0xBACB, 0x6838,\t0xBACC, 0x79BE, 0xBACD, 0x548C, 0xBACE, 0x4F55, 0xBACF, 0x5408,\n\t0xBAD0, 0x76D2, 0xBAD1, 0x8C89, 0xBAD2, 0x9602, 0xBAD3, 0x6CB3,\t0xBAD4, 0x6DB8, 0xBAD5, 0x8D6B, 0xBAD6, 0x8910, 0xBAD7, 0x9E64,\n\t0xBAD8, 0x8D3A, 0xBAD9, 0x563F, 0xBADA, 0x9ED1, 0xBADB, 0x75D5,\t0xBADC, 0x5F88, 0xBADD, 0x72E0, 0xBADE, 0x6068, 0xBADF, 0x54FC,\n\t0xBAE0, 0x4EA8, 0xBAE1, 0x6A2A, 0xBAE2, 0x8861, 0xBAE3, 0x6052,\t0xBAE4, 0x8F70, 0xBAE5, 0x54C4, 0xBAE6, 0x70D8, 0xBAE7, 0x8679,\n\t0xBAE8, 0x9E3F, 0xBAE9, 0x6D2A, 0xBAEA, 0x5B8F, 0xBAEB, 0x5F18,\t0xBAEC, 0x7EA2, 0xBAED, 0x5589, 0xBAEE, 0x4FAF, 0xBAEF, 0x7334,\n\t0xBAF0, 0x543C, 0xBAF1, 0x539A, 0xBAF2, 0x5019, 0xBAF3, 0x540E,\t0xBAF4, 0x547C, 0xBAF5, 0x4E4E, 0xBAF6, 0x5FFD, 0xBAF7, 0x745A,\n\t0xBAF8, 0x58F6, 0xBAF9, 0x846B, 0xBAFA, 0x80E1, 0xBAFB, 0x8774,\t0xBAFC, 0x72D0, 0xBAFD, 0x7CCA, 0xBAFE, 0x6E56, 0xBB40, 0x7C43,\n\t0xBB41, 0x7C44, 0xBB42, 0x7C45, 0xBB43, 0x7C46, 0xBB44, 0x7C47,\t0xBB45, 0x7C48, 0xBB46, 0x7C49, 0xBB47, 0x7C4A, 0xBB48, 0x7C4B,\n\t0xBB49, 0x7C4C, 0xBB4A, 0x7C4E, 0xBB4B, 0x7C4F, 0xBB4C, 0x7C50,\t0xBB4D, 0x7C51, 0xBB4E, 0x7C52, 0xBB4F, 0x7C53, 0xBB50, 0x7C54,\n\t0xBB51, 0x7C55, 0xBB52, 0x7C56, 0xBB53, 0x7C57, 0xBB54, 0x7C58,\t0xBB55, 0x7C59, 0xBB56, 0x7C5A, 0xBB57, 0x7C5B, 0xBB58, 0x7C5C,\n\t0xBB59, 0x7C5D, 0xBB5A, 0x7C5E, 0xBB5B, 0x7C5F, 0xBB5C, 0x7C60,\t0xBB5D, 0x7C61, 0xBB5E, 0x7C62, 0xBB5F, 0x7C63, 0xBB60, 0x7C64,\n\t0xBB61, 0x7C65, 0xBB62, 0x7C66, 0xBB63, 0x7C67, 0xBB64, 0x7C68,\t0xBB65, 0x7C69, 0xBB66, 0x7C6A, 0xBB67, 0x7C6B, 0xBB68, 0x7C6C,\n\t0xBB69, 0x7C6D, 0xBB6A, 0x7C6E, 0xBB6B, 0x7C6F, 0xBB6C, 0x7C70,\t0xBB6D, 0x7C71, 0xBB6E, 0x7C72, 0xBB6F, 0x7C75, 0xBB70, 0x7C76,\n\t0xBB71, 0x7C77, 0xBB72, 0x7C78, 0xBB73, 0x7C79, 0xBB74, 0x7C7A,\t0xBB75, 0x7C7E, 0xBB76, 0x7C7F, 0xBB77, 0x7C80, 0xBB78, 0x7C81,\n\t0xBB79, 0x7C82, 0xBB7A, 0x7C83, 0xBB7B, 0x7C84, 0xBB7C, 0x7C85,\t0xBB7D, 0x7C86, 0xBB7E, 0x7C87, 0xBB80, 0x7C88, 0xBB81, 0x7C8A,\n\t0xBB82, 0x7C8B, 0xBB83, 0x7C8C, 0xBB84, 0x7C8D, 0xBB85, 0x7C8E,\t0xBB86, 0x7C8F, 0xBB87, 0x7C90, 0xBB88, 0x7C93, 0xBB89, 0x7C94,\n\t0xBB8A, 0x7C96, 0xBB8B, 0x7C99, 0xBB8C, 0x7C9A, 0xBB8D, 0x7C9B,\t0xBB8E, 0x7CA0, 0xBB8F, 0x7CA1, 0xBB90, 0x7CA3, 0xBB91, 0x7CA6,\n\t0xBB92, 0x7CA7, 0xBB93, 0x7CA8, 0xBB94, 0x7CA9, 0xBB95, 0x7CAB,\t0xBB96, 0x7CAC, 0xBB97, 0x7CAD, 0xBB98, 0x7CAF, 0xBB99, 0x7CB0,\n\t0xBB9A, 0x7CB4, 0xBB9B, 0x7CB5, 0xBB9C, 0x7CB6, 0xBB9D, 0x7CB7,\t0xBB9E, 0x7CB8, 0xBB9F, 0x7CBA, 0xBBA0, 0x7CBB, 0xBBA1, 0x5F27,\n\t0xBBA2, 0x864E, 0xBBA3, 0x552C, 0xBBA4, 0x62A4, 0xBBA5, 0x4E92,\t0xBBA6, 0x6CAA, 0xBBA7, 0x6237, 0xBBA8, 0x82B1, 0xBBA9, 0x54D7,\n\t0xBBAA, 0x534E, 0xBBAB, 0x733E, 0xBBAC, 0x6ED1, 0xBBAD, 0x753B,\t0xBBAE, 0x5212, 0xBBAF, 0x5316, 0xBBB0, 0x8BDD, 0xBBB1, 0x69D0,\n\t0xBBB2, 0x5F8A, 0xBBB3, 0x6000, 0xBBB4, 0x6DEE, 0xBBB5, 0x574F,\t0xBBB6, 0x6B22, 0xBBB7, 0x73AF, 0xBBB8, 0x6853, 0xBBB9, 0x8FD8,\n\t0xBBBA, 0x7F13, 0xBBBB, 0x6362, 0xBBBC, 0x60A3, 0xBBBD, 0x5524,\t0xBBBE, 0x75EA, 0xBBBF, 0x8C62, 0xBBC0, 0x7115, 0xBBC1, 0x6DA3,\n\t0xBBC2, 0x5BA6, 0xBBC3, 0x5E7B, 0xBBC4, 0x8352, 0xBBC5, 0x614C,\t0xBBC6, 0x9EC4, 0xBBC7, 0x78FA, 0xBBC8, 0x8757, 0xBBC9, 0x7C27,\n\t0xBBCA, 0x7687, 0xBBCB, 0x51F0, 0xBBCC, 0x60F6, 0xBBCD, 0x714C,\t0xBBCE, 0x6643, 0xBBCF, 0x5E4C, 0xBBD0, 0x604D, 0xBBD1, 0x8C0E,\n\t0xBBD2, 0x7070, 0xBBD3, 0x6325, 0xBBD4, 0x8F89, 0xBBD5, 0x5FBD,\t0xBBD6, 0x6062, 0xBBD7, 0x86D4, 0xBBD8, 0x56DE, 0xBBD9, 0x6BC1,\n\t0xBBDA, 0x6094, 0xBBDB, 0x6167, 0xBBDC, 0x5349, 0xBBDD, 0x60E0,\t0xBBDE, 0x6666, 0xBBDF, 0x8D3F, 0xBBE0, 0x79FD, 0xBBE1, 0x4F1A,\n\t0xBBE2, 0x70E9, 0xBBE3, 0x6C47, 0xBBE4, 0x8BB3, 0xBBE5, 0x8BF2,\t0xBBE6, 0x7ED8, 0xBBE7, 0x8364, 0xBBE8, 0x660F, 0xBBE9, 0x5A5A,\n\t0xBBEA, 0x9B42, 0xBBEB, 0x6D51, 0xBBEC, 0x6DF7, 0xBBED, 0x8C41,\t0xBBEE, 0x6D3B, 0xBBEF, 0x4F19, 0xBBF0, 0x706B, 0xBBF1, 0x83B7,\n\t0xBBF2, 0x6216, 0xBBF3, 0x60D1, 0xBBF4, 0x970D, 0xBBF5, 0x8D27,\t0xBBF6, 0x7978, 0xBBF7, 0x51FB, 0xBBF8, 0x573E, 0xBBF9, 0x57FA,\n\t0xBBFA, 0x673A, 0xBBFB, 0x7578, 0xBBFC, 0x7A3D, 0xBBFD, 0x79EF,\t0xBBFE, 0x7B95, 0xBC40, 0x7CBF, 0xBC41, 0x7CC0, 0xBC42, 0x7CC2,\n\t0xBC43, 0x7CC3, 0xBC44, 0x7CC4, 0xBC45, 0x7CC6, 0xBC46, 0x7CC9,\t0xBC47, 0x7CCB, 0xBC48, 0x7CCE, 0xBC49, 0x7CCF, 0xBC4A, 0x7CD0,\n\t0xBC4B, 0x7CD1, 0xBC4C, 0x7CD2, 0xBC4D, 0x7CD3, 0xBC4E, 0x7CD4,\t0xBC4F, 0x7CD8, 0xBC50, 0x7CDA, 0xBC51, 0x7CDB, 0xBC52, 0x7CDD,\n\t0xBC53, 0x7CDE, 0xBC54, 0x7CE1, 0xBC55, 0x7CE2, 0xBC56, 0x7CE3,\t0xBC57, 0x7CE4, 0xBC58, 0x7CE5, 0xBC59, 0x7CE6, 0xBC5A, 0x7CE7,\n\t0xBC5B, 0x7CE9, 0xBC5C, 0x7CEA, 0xBC5D, 0x7CEB, 0xBC5E, 0x7CEC,\t0xBC5F, 0x7CED, 0xBC60, 0x7CEE, 0xBC61, 0x7CF0, 0xBC62, 0x7CF1,\n\t0xBC63, 0x7CF2, 0xBC64, 0x7CF3, 0xBC65, 0x7CF4, 0xBC66, 0x7CF5,\t0xBC67, 0x7CF6, 0xBC68, 0x7CF7, 0xBC69, 0x7CF9, 0xBC6A, 0x7CFA,\n\t0xBC6B, 0x7CFC, 0xBC6C, 0x7CFD, 0xBC6D, 0x7CFE, 0xBC6E, 0x7CFF,\t0xBC6F, 0x7D00, 0xBC70, 0x7D01, 0xBC71, 0x7D02, 0xBC72, 0x7D03,\n\t0xBC73, 0x7D04, 0xBC74, 0x7D05, 0xBC75, 0x7D06, 0xBC76, 0x7D07,\t0xBC77, 0x7D08, 0xBC78, 0x7D09, 0xBC79, 0x7D0B, 0xBC7A, 0x7D0C,\n\t0xBC7B, 0x7D0D, 0xBC7C, 0x7D0E, 0xBC7D, 0x7D0F, 0xBC7E, 0x7D10,\t0xBC80, 0x7D11, 0xBC81, 0x7D12, 0xBC82, 0x7D13, 0xBC83, 0x7D14,\n\t0xBC84, 0x7D15, 0xBC85, 0x7D16, 0xBC86, 0x7D17, 0xBC87, 0x7D18,\t0xBC88, 0x7D19, 0xBC89, 0x7D1A, 0xBC8A, 0x7D1B, 0xBC8B, 0x7D1C,\n\t0xBC8C, 0x7D1D, 0xBC8D, 0x7D1E, 0xBC8E, 0x7D1F, 0xBC8F, 0x7D21,\t0xBC90, 0x7D23, 0xBC91, 0x7D24, 0xBC92, 0x7D25, 0xBC93, 0x7D26,\n\t0xBC94, 0x7D28, 0xBC95, 0x7D29, 0xBC96, 0x7D2A, 0xBC97, 0x7D2C,\t0xBC98, 0x7D2D, 0xBC99, 0x7D2E, 0xBC9A, 0x7D30, 0xBC9B, 0x7D31,\n\t0xBC9C, 0x7D32, 0xBC9D, 0x7D33, 0xBC9E, 0x7D34, 0xBC9F, 0x7D35,\t0xBCA0, 0x7D36, 0xBCA1, 0x808C, 0xBCA2, 0x9965, 0xBCA3, 0x8FF9,\n\t0xBCA4, 0x6FC0, 0xBCA5, 0x8BA5, 0xBCA6, 0x9E21, 0xBCA7, 0x59EC,\t0xBCA8, 0x7EE9, 0xBCA9, 0x7F09, 0xBCAA, 0x5409, 0xBCAB, 0x6781,\n\t0xBCAC, 0x68D8, 0xBCAD, 0x8F91, 0xBCAE, 0x7C4D, 0xBCAF, 0x96C6,\t0xBCB0, 0x53CA, 0xBCB1, 0x6025, 0xBCB2, 0x75BE, 0xBCB3, 0x6C72,\n\t0xBCB4, 0x5373, 0xBCB5, 0x5AC9, 0xBCB6, 0x7EA7, 0xBCB7, 0x6324,\t0xBCB8, 0x51E0, 0xBCB9, 0x810A, 0xBCBA, 0x5DF1, 0xBCBB, 0x84DF,\n\t0xBCBC, 0x6280, 0xBCBD, 0x5180, 0xBCBE, 0x5B63, 0xBCBF, 0x4F0E,\t0xBCC0, 0x796D, 0xBCC1, 0x5242, 0xBCC2, 0x60B8, 0xBCC3, 0x6D4E,\n\t0xBCC4, 0x5BC4, 0xBCC5, 0x5BC2, 0xBCC6, 0x8BA1, 0xBCC7, 0x8BB0,\t0xBCC8, 0x65E2, 0xBCC9, 0x5FCC, 0xBCCA, 0x9645, 0xBCCB, 0x5993,\n\t0xBCCC, 0x7EE7, 0xBCCD, 0x7EAA, 0xBCCE, 0x5609, 0xBCCF, 0x67B7,\t0xBCD0, 0x5939, 0xBCD1, 0x4F73, 0xBCD2, 0x5BB6, 0xBCD3, 0x52A0,\n\t0xBCD4, 0x835A, 0xBCD5, 0x988A, 0xBCD6, 0x8D3E, 0xBCD7, 0x7532,\t0xBCD8, 0x94BE, 0xBCD9, 0x5047, 0xBCDA, 0x7A3C, 0xBCDB, 0x4EF7,\n\t0xBCDC, 0x67B6, 0xBCDD, 0x9A7E, 0xBCDE, 0x5AC1, 0xBCDF, 0x6B7C,\t0xBCE0, 0x76D1, 0xBCE1, 0x575A, 0xBCE2, 0x5C16, 0xBCE3, 0x7B3A,\n\t0xBCE4, 0x95F4, 0xBCE5, 0x714E, 0xBCE6, 0x517C, 0xBCE7, 0x80A9,\t0xBCE8, 0x8270, 0xBCE9, 0x5978, 0xBCEA, 0x7F04, 0xBCEB, 0x8327,\n\t0xBCEC, 0x68C0, 0xBCED, 0x67EC, 0xBCEE, 0x78B1, 0xBCEF, 0x7877,\t0xBCF0, 0x62E3, 0xBCF1, 0x6361, 0xBCF2, 0x7B80, 0xBCF3, 0x4FED,\n\t0xBCF4, 0x526A, 0xBCF5, 0x51CF, 0xBCF6, 0x8350, 0xBCF7, 0x69DB,\t0xBCF8, 0x9274, 0xBCF9, 0x8DF5, 0xBCFA, 0x8D31, 0xBCFB, 0x89C1,\n\t0xBCFC, 0x952E, 0xBCFD, 0x7BAD, 0xBCFE, 0x4EF6, 0xBD40, 0x7D37,\t0xBD41, 0x7D38, 0xBD42, 0x7D39, 0xBD43, 0x7D3A, 0xBD44, 0x7D3B,\n\t0xBD45, 0x7D3C, 0xBD46, 0x7D3D, 0xBD47, 0x7D3E, 0xBD48, 0x7D3F,\t0xBD49, 0x7D40, 0xBD4A, 0x7D41, 0xBD4B, 0x7D42, 0xBD4C, 0x7D43,\n\t0xBD4D, 0x7D44, 0xBD4E, 0x7D45, 0xBD4F, 0x7D46, 0xBD50, 0x7D47,\t0xBD51, 0x7D48, 0xBD52, 0x7D49, 0xBD53, 0x7D4A, 0xBD54, 0x7D4B,\n\t0xBD55, 0x7D4C, 0xBD56, 0x7D4D, 0xBD57, 0x7D4E, 0xBD58, 0x7D4F,\t0xBD59, 0x7D50, 0xBD5A, 0x7D51, 0xBD5B, 0x7D52, 0xBD5C, 0x7D53,\n\t0xBD5D, 0x7D54, 0xBD5E, 0x7D55, 0xBD5F, 0x7D56, 0xBD60, 0x7D57,\t0xBD61, 0x7D58, 0xBD62, 0x7D59, 0xBD63, 0x7D5A, 0xBD64, 0x7D5B,\n\t0xBD65, 0x7D5C, 0xBD66, 0x7D5D, 0xBD67, 0x7D5E, 0xBD68, 0x7D5F,\t0xBD69, 0x7D60, 0xBD6A, 0x7D61, 0xBD6B, 0x7D62, 0xBD6C, 0x7D63,\n\t0xBD6D, 0x7D64, 0xBD6E, 0x7D65, 0xBD6F, 0x7D66, 0xBD70, 0x7D67,\t0xBD71, 0x7D68, 0xBD72, 0x7D69, 0xBD73, 0x7D6A, 0xBD74, 0x7D6B,\n\t0xBD75, 0x7D6C, 0xBD76, 0x7D6D, 0xBD77, 0x7D6F, 0xBD78, 0x7D70,\t0xBD79, 0x7D71, 0xBD7A, 0x7D72, 0xBD7B, 0x7D73, 0xBD7C, 0x7D74,\n\t0xBD7D, 0x7D75, 0xBD7E, 0x7D76, 0xBD80, 0x7D78, 0xBD81, 0x7D79,\t0xBD82, 0x7D7A, 0xBD83, 0x7D7B, 0xBD84, 0x7D7C, 0xBD85, 0x7D7D,\n\t0xBD86, 0x7D7E, 0xBD87, 0x7D7F, 0xBD88, 0x7D80, 0xBD89, 0x7D81,\t0xBD8A, 0x7D82, 0xBD8B, 0x7D83, 0xBD8C, 0x7D84, 0xBD8D, 0x7D85,\n\t0xBD8E, 0x7D86, 0xBD8F, 0x7D87, 0xBD90, 0x7D88, 0xBD91, 0x7D89,\t0xBD92, 0x7D8A, 0xBD93, 0x7D8B, 0xBD94, 0x7D8C, 0xBD95, 0x7D8D,\n\t0xBD96, 0x7D8E, 0xBD97, 0x7D8F, 0xBD98, 0x7D90, 0xBD99, 0x7D91,\t0xBD9A, 0x7D92, 0xBD9B, 0x7D93, 0xBD9C, 0x7D94, 0xBD9D, 0x7D95,\n\t0xBD9E, 0x7D96, 0xBD9F, 0x7D97, 0xBDA0, 0x7D98, 0xBDA1, 0x5065,\t0xBDA2, 0x8230, 0xBDA3, 0x5251, 0xBDA4, 0x996F, 0xBDA5, 0x6E10,\n\t0xBDA6, 0x6E85, 0xBDA7, 0x6DA7, 0xBDA8, 0x5EFA, 0xBDA9, 0x50F5,\t0xBDAA, 0x59DC, 0xBDAB, 0x5C06, 0xBDAC, 0x6D46, 0xBDAD, 0x6C5F,\n\t0xBDAE, 0x7586, 0xBDAF, 0x848B, 0xBDB0, 0x6868, 0xBDB1, 0x5956,\t0xBDB2, 0x8BB2, 0xBDB3, 0x5320, 0xBDB4, 0x9171, 0xBDB5, 0x964D,\n\t0xBDB6, 0x8549, 0xBDB7, 0x6912, 0xBDB8, 0x7901, 0xBDB9, 0x7126,\t0xBDBA, 0x80F6, 0xBDBB, 0x4EA4, 0xBDBC, 0x90CA, 0xBDBD, 0x6D47,\n\t0xBDBE, 0x9A84, 0xBDBF, 0x5A07, 0xBDC0, 0x56BC, 0xBDC1, 0x6405,\t0xBDC2, 0x94F0, 0xBDC3, 0x77EB, 0xBDC4, 0x4FA5, 0xBDC5, 0x811A,\n\t0xBDC6, 0x72E1, 0xBDC7, 0x89D2, 0xBDC8, 0x997A, 0xBDC9, 0x7F34,\t0xBDCA, 0x7EDE, 0xBDCB, 0x527F, 0xBDCC, 0x6559, 0xBDCD, 0x9175,\n\t0xBDCE, 0x8F7F, 0xBDCF, 0x8F83, 0xBDD0, 0x53EB, 0xBDD1, 0x7A96,\t0xBDD2, 0x63ED, 0xBDD3, 0x63A5, 0xBDD4, 0x7686, 0xBDD5, 0x79F8,\n\t0xBDD6, 0x8857, 0xBDD7, 0x9636, 0xBDD8, 0x622A, 0xBDD9, 0x52AB,\t0xBDDA, 0x8282, 0xBDDB, 0x6854, 0xBDDC, 0x6770, 0xBDDD, 0x6377,\n\t0xBDDE, 0x776B, 0xBDDF, 0x7AED, 0xBDE0, 0x6D01, 0xBDE1, 0x7ED3,\t0xBDE2, 0x89E3, 0xBDE3, 0x59D0, 0xBDE4, 0x6212, 0xBDE5, 0x85C9,\n\t0xBDE6, 0x82A5, 0xBDE7, 0x754C, 0xBDE8, 0x501F, 0xBDE9, 0x4ECB,\t0xBDEA, 0x75A5, 0xBDEB, 0x8BEB, 0xBDEC, 0x5C4A, 0xBDED, 0x5DFE,\n\t0xBDEE, 0x7B4B, 0xBDEF, 0x65A4, 0xBDF0, 0x91D1, 0xBDF1, 0x4ECA,\t0xBDF2, 0x6D25, 0xBDF3, 0x895F, 0xBDF4, 0x7D27, 0xBDF5, 0x9526,\n\t0xBDF6, 0x4EC5, 0xBDF7, 0x8C28, 0xBDF8, 0x8FDB, 0xBDF9, 0x9773,\t0xBDFA, 0x664B, 0xBDFB, 0x7981, 0xBDFC, 0x8FD1, 0xBDFD, 0x70EC,\n\t0xBDFE, 0x6D78, 0xBE40, 0x7D99, 0xBE41, 0x7D9A, 0xBE42, 0x7D9B,\t0xBE43, 0x7D9C, 0xBE44, 0x7D9D, 0xBE45, 0x7D9E, 0xBE46, 0x7D9F,\n\t0xBE47, 0x7DA0, 0xBE48, 0x7DA1, 0xBE49, 0x7DA2, 0xBE4A, 0x7DA3,\t0xBE4B, 0x7DA4, 0xBE4C, 0x7DA5, 0xBE4D, 0x7DA7, 0xBE4E, 0x7DA8,\n\t0xBE4F, 0x7DA9, 0xBE50, 0x7DAA, 0xBE51, 0x7DAB, 0xBE52, 0x7DAC,\t0xBE53, 0x7DAD, 0xBE54, 0x7DAF, 0xBE55, 0x7DB0, 0xBE56, 0x7DB1,\n\t0xBE57, 0x7DB2, 0xBE58, 0x7DB3, 0xBE59, 0x7DB4, 0xBE5A, 0x7DB5,\t0xBE5B, 0x7DB6, 0xBE5C, 0x7DB7, 0xBE5D, 0x7DB8, 0xBE5E, 0x7DB9,\n\t0xBE5F, 0x7DBA, 0xBE60, 0x7DBB, 0xBE61, 0x7DBC, 0xBE62, 0x7DBD,\t0xBE63, 0x7DBE, 0xBE64, 0x7DBF, 0xBE65, 0x7DC0, 0xBE66, 0x7DC1,\n\t0xBE67, 0x7DC2, 0xBE68, 0x7DC3, 0xBE69, 0x7DC4, 0xBE6A, 0x7DC5,\t0xBE6B, 0x7DC6, 0xBE6C, 0x7DC7, 0xBE6D, 0x7DC8, 0xBE6E, 0x7DC9,\n\t0xBE6F, 0x7DCA, 0xBE70, 0x7DCB, 0xBE71, 0x7DCC, 0xBE72, 0x7DCD,\t0xBE73, 0x7DCE, 0xBE74, 0x7DCF, 0xBE75, 0x7DD0, 0xBE76, 0x7DD1,\n\t0xBE77, 0x7DD2, 0xBE78, 0x7DD3, 0xBE79, 0x7DD4, 0xBE7A, 0x7DD5,\t0xBE7B, 0x7DD6, 0xBE7C, 0x7DD7, 0xBE7D, 0x7DD8, 0xBE7E, 0x7DD9,\n\t0xBE80, 0x7DDA, 0xBE81, 0x7DDB, 0xBE82, 0x7DDC, 0xBE83, 0x7DDD,\t0xBE84, 0x7DDE, 0xBE85, 0x7DDF, 0xBE86, 0x7DE0, 0xBE87, 0x7DE1,\n\t0xBE88, 0x7DE2, 0xBE89, 0x7DE3, 0xBE8A, 0x7DE4, 0xBE8B, 0x7DE5,\t0xBE8C, 0x7DE6, 0xBE8D, 0x7DE7, 0xBE8E, 0x7DE8, 0xBE8F, 0x7DE9,\n\t0xBE90, 0x7DEA, 0xBE91, 0x7DEB, 0xBE92, 0x7DEC, 0xBE93, 0x7DED,\t0xBE94, 0x7DEE, 0xBE95, 0x7DEF, 0xBE96, 0x7DF0, 0xBE97, 0x7DF1,\n\t0xBE98, 0x7DF2, 0xBE99, 0x7DF3, 0xBE9A, 0x7DF4, 0xBE9B, 0x7DF5,\t0xBE9C, 0x7DF6, 0xBE9D, 0x7DF7, 0xBE9E, 0x7DF8, 0xBE9F, 0x7DF9,\n\t0xBEA0, 0x7DFA, 0xBEA1, 0x5C3D, 0xBEA2, 0x52B2, 0xBEA3, 0x8346,\t0xBEA4, 0x5162, 0xBEA5, 0x830E, 0xBEA6, 0x775B, 0xBEA7, 0x6676,\n\t0xBEA8, 0x9CB8, 0xBEA9, 0x4EAC, 0xBEAA, 0x60CA, 0xBEAB, 0x7CBE,\t0xBEAC, 0x7CB3, 0xBEAD, 0x7ECF, 0xBEAE, 0x4E95, 0xBEAF, 0x8B66,\n\t0xBEB0, 0x666F, 0xBEB1, 0x9888, 0xBEB2, 0x9759, 0xBEB3, 0x5883,\t0xBEB4, 0x656C, 0xBEB5, 0x955C, 0xBEB6, 0x5F84, 0xBEB7, 0x75C9,\n\t0xBEB8, 0x9756, 0xBEB9, 0x7ADF, 0xBEBA, 0x7ADE, 0xBEBB, 0x51C0,\t0xBEBC, 0x70AF, 0xBEBD, 0x7A98, 0xBEBE, 0x63EA, 0xBEBF, 0x7A76,\n\t0xBEC0, 0x7EA0, 0xBEC1, 0x7396, 0xBEC2, 0x97ED, 0xBEC3, 0x4E45,\t0xBEC4, 0x7078, 0xBEC5, 0x4E5D, 0xBEC6, 0x9152, 0xBEC7, 0x53A9,\n\t0xBEC8, 0x6551, 0xBEC9, 0x65E7, 0xBECA, 0x81FC, 0xBECB, 0x8205,\t0xBECC, 0x548E, 0xBECD, 0x5C31, 0xBECE, 0x759A, 0xBECF, 0x97A0,\n\t0xBED0, 0x62D8, 0xBED1, 0x72D9, 0xBED2, 0x75BD, 0xBED3, 0x5C45,\t0xBED4, 0x9A79, 0xBED5, 0x83CA, 0xBED6, 0x5C40, 0xBED7, 0x5480,\n\t0xBED8, 0x77E9, 0xBED9, 0x4E3E, 0xBEDA, 0x6CAE, 0xBEDB, 0x805A,\t0xBEDC, 0x62D2, 0xBEDD, 0x636E, 0xBEDE, 0x5DE8, 0xBEDF, 0x5177,\n\t0xBEE0, 0x8DDD, 0xBEE1, 0x8E1E, 0xBEE2, 0x952F, 0xBEE3, 0x4FF1,\t0xBEE4, 0x53E5, 0xBEE5, 0x60E7, 0xBEE6, 0x70AC, 0xBEE7, 0x5267,\n\t0xBEE8, 0x6350, 0xBEE9, 0x9E43, 0xBEEA, 0x5A1F, 0xBEEB, 0x5026,\t0xBEEC, 0x7737, 0xBEED, 0x5377, 0xBEEE, 0x7EE2, 0xBEEF, 0x6485,\n\t0xBEF0, 0x652B, 0xBEF1, 0x6289, 0xBEF2, 0x6398, 0xBEF3, 0x5014,\t0xBEF4, 0x7235, 0xBEF5, 0x89C9, 0xBEF6, 0x51B3, 0xBEF7, 0x8BC0,\n\t0xBEF8, 0x7EDD, 0xBEF9, 0x5747, 0xBEFA, 0x83CC, 0xBEFB, 0x94A7,\t0xBEFC, 0x519B, 0xBEFD, 0x541B, 0xBEFE, 0x5CFB, 0xBF40, 0x7DFB,\n\t0xBF41, 0x7DFC, 0xBF42, 0x7DFD, 0xBF43, 0x7DFE, 0xBF44, 0x7DFF,\t0xBF45, 0x7E00, 0xBF46, 0x7E01, 0xBF47, 0x7E02, 0xBF48, 0x7E03,\n\t0xBF49, 0x7E04, 0xBF4A, 0x7E05, 0xBF4B, 0x7E06, 0xBF4C, 0x7E07,\t0xBF4D, 0x7E08, 0xBF4E, 0x7E09, 0xBF4F, 0x7E0A, 0xBF50, 0x7E0B,\n\t0xBF51, 0x7E0C, 0xBF52, 0x7E0D, 0xBF53, 0x7E0E, 0xBF54, 0x7E0F,\t0xBF55, 0x7E10, 0xBF56, 0x7E11, 0xBF57, 0x7E12, 0xBF58, 0x7E13,\n\t0xBF59, 0x7E14, 0xBF5A, 0x7E15, 0xBF5B, 0x7E16, 0xBF5C, 0x7E17,\t0xBF5D, 0x7E18, 0xBF5E, 0x7E19, 0xBF5F, 0x7E1A, 0xBF60, 0x7E1B,\n\t0xBF61, 0x7E1C, 0xBF62, 0x7E1D, 0xBF63, 0x7E1E, 0xBF64, 0x7E1F,\t0xBF65, 0x7E20, 0xBF66, 0x7E21, 0xBF67, 0x7E22, 0xBF68, 0x7E23,\n\t0xBF69, 0x7E24, 0xBF6A, 0x7E25, 0xBF6B, 0x7E26, 0xBF6C, 0x7E27,\t0xBF6D, 0x7E28, 0xBF6E, 0x7E29, 0xBF6F, 0x7E2A, 0xBF70, 0x7E2B,\n\t0xBF71, 0x7E2C, 0xBF72, 0x7E2D, 0xBF73, 0x7E2E, 0xBF74, 0x7E2F,\t0xBF75, 0x7E30, 0xBF76, 0x7E31, 0xBF77, 0x7E32, 0xBF78, 0x7E33,\n\t0xBF79, 0x7E34, 0xBF7A, 0x7E35, 0xBF7B, 0x7E36, 0xBF7C, 0x7E37,\t0xBF7D, 0x7E38, 0xBF7E, 0x7E39, 0xBF80, 0x7E3A, 0xBF81, 0x7E3C,\n\t0xBF82, 0x7E3D, 0xBF83, 0x7E3E, 0xBF84, 0x7E3F, 0xBF85, 0x7E40,\t0xBF86, 0x7E42, 0xBF87, 0x7E43, 0xBF88, 0x7E44, 0xBF89, 0x7E45,\n\t0xBF8A, 0x7E46, 0xBF8B, 0x7E48, 0xBF8C, 0x7E49, 0xBF8D, 0x7E4A,\t0xBF8E, 0x7E4B, 0xBF8F, 0x7E4C, 0xBF90, 0x7E4D, 0xBF91, 0x7E4E,\n\t0xBF92, 0x7E4F, 0xBF93, 0x7E50, 0xBF94, 0x7E51, 0xBF95, 0x7E52,\t0xBF96, 0x7E53, 0xBF97, 0x7E54, 0xBF98, 0x7E55, 0xBF99, 0x7E56,\n\t0xBF9A, 0x7E57, 0xBF9B, 0x7E58, 0xBF9C, 0x7E59, 0xBF9D, 0x7E5A,\t0xBF9E, 0x7E5B, 0xBF9F, 0x7E5C, 0xBFA0, 0x7E5D, 0xBFA1, 0x4FCA,\n\t0xBFA2, 0x7AE3, 0xBFA3, 0x6D5A, 0xBFA4, 0x90E1, 0xBFA5, 0x9A8F,\t0xBFA6, 0x5580, 0xBFA7, 0x5496, 0xBFA8, 0x5361, 0xBFA9, 0x54AF,\n\t0xBFAA, 0x5F00, 0xBFAB, 0x63E9, 0xBFAC, 0x6977, 0xBFAD, 0x51EF,\t0xBFAE, 0x6168, 0xBFAF, 0x520A, 0xBFB0, 0x582A, 0xBFB1, 0x52D8,\n\t0xBFB2, 0x574E, 0xBFB3, 0x780D, 0xBFB4, 0x770B, 0xBFB5, 0x5EB7,\t0xBFB6, 0x6177, 0xBFB7, 0x7CE0, 0xBFB8, 0x625B, 0xBFB9, 0x6297,\n\t0xBFBA, 0x4EA2, 0xBFBB, 0x7095, 0xBFBC, 0x8003, 0xBFBD, 0x62F7,\t0xBFBE, 0x70E4, 0xBFBF, 0x9760, 0xBFC0, 0x5777, 0xBFC1, 0x82DB,\n\t0xBFC2, 0x67EF, 0xBFC3, 0x68F5, 0xBFC4, 0x78D5, 0xBFC5, 0x9897,\t0xBFC6, 0x79D1, 0xBFC7, 0x58F3, 0xBFC8, 0x54B3, 0xBFC9, 0x53EF,\n\t0xBFCA, 0x6E34, 0xBFCB, 0x514B, 0xBFCC, 0x523B, 0xBFCD, 0x5BA2,\t0xBFCE, 0x8BFE, 0xBFCF, 0x80AF, 0xBFD0, 0x5543, 0xBFD1, 0x57A6,\n\t0xBFD2, 0x6073, 0xBFD3, 0x5751, 0xBFD4, 0x542D, 0xBFD5, 0x7A7A,\t0xBFD6, 0x6050, 0xBFD7, 0x5B54, 0xBFD8, 0x63A7, 0xBFD9, 0x62A0,\n\t0xBFDA, 0x53E3, 0xBFDB, 0x6263, 0xBFDC, 0x5BC7, 0xBFDD, 0x67AF,\t0xBFDE, 0x54ED, 0xBFDF, 0x7A9F, 0xBFE0, 0x82E6, 0xBFE1, 0x9177,\n\t0xBFE2, 0x5E93, 0xBFE3, 0x88E4, 0xBFE4, 0x5938, 0xBFE5, 0x57AE,\t0xBFE6, 0x630E, 0xBFE7, 0x8DE8, 0xBFE8, 0x80EF, 0xBFE9, 0x5757,\n\t0xBFEA, 0x7B77, 0xBFEB, 0x4FA9, 0xBFEC, 0x5FEB, 0xBFED, 0x5BBD,\t0xBFEE, 0x6B3E, 0xBFEF, 0x5321, 0xBFF0, 0x7B50, 0xBFF1, 0x72C2,\n\t0xBFF2, 0x6846, 0xBFF3, 0x77FF, 0xBFF4, 0x7736, 0xBFF5, 0x65F7,\t0xBFF6, 0x51B5, 0xBFF7, 0x4E8F, 0xBFF8, 0x76D4, 0xBFF9, 0x5CBF,\n\t0xBFFA, 0x7AA5, 0xBFFB, 0x8475, 0xBFFC, 0x594E, 0xBFFD, 0x9B41,\t0xBFFE, 0x5080, 0xC040, 0x7E5E, 0xC041, 0x7E5F, 0xC042, 0x7E60,\n\t0xC043, 0x7E61, 0xC044, 0x7E62, 0xC045, 0x7E63, 0xC046, 0x7E64,\t0xC047, 0x7E65, 0xC048, 0x7E66, 0xC049, 0x7E67, 0xC04A, 0x7E68,\n\t0xC04B, 0x7E69, 0xC04C, 0x7E6A, 0xC04D, 0x7E6B, 0xC04E, 0x7E6C,\t0xC04F, 0x7E6D, 0xC050, 0x7E6E, 0xC051, 0x7E6F, 0xC052, 0x7E70,\n\t0xC053, 0x7E71, 0xC054, 0x7E72, 0xC055, 0x7E73, 0xC056, 0x7E74,\t0xC057, 0x7E75, 0xC058, 0x7E76, 0xC059, 0x7E77, 0xC05A, 0x7E78,\n\t0xC05B, 0x7E79, 0xC05C, 0x7E7A, 0xC05D, 0x7E7B, 0xC05E, 0x7E7C,\t0xC05F, 0x7E7D, 0xC060, 0x7E7E, 0xC061, 0x7E7F, 0xC062, 0x7E80,\n\t0xC063, 0x7E81, 0xC064, 0x7E83, 0xC065, 0x7E84, 0xC066, 0x7E85,\t0xC067, 0x7E86, 0xC068, 0x7E87, 0xC069, 0x7E88, 0xC06A, 0x7E89,\n\t0xC06B, 0x7E8A, 0xC06C, 0x7E8B, 0xC06D, 0x7E8C, 0xC06E, 0x7E8D,\t0xC06F, 0x7E8E, 0xC070, 0x7E8F, 0xC071, 0x7E90, 0xC072, 0x7E91,\n\t0xC073, 0x7E92, 0xC074, 0x7E93, 0xC075, 0x7E94, 0xC076, 0x7E95,\t0xC077, 0x7E96, 0xC078, 0x7E97, 0xC079, 0x7E98, 0xC07A, 0x7E99,\n\t0xC07B, 0x7E9A, 0xC07C, 0x7E9C, 0xC07D, 0x7E9D, 0xC07E, 0x7E9E,\t0xC080, 0x7EAE, 0xC081, 0x7EB4, 0xC082, 0x7EBB, 0xC083, 0x7EBC,\n\t0xC084, 0x7ED6, 0xC085, 0x7EE4, 0xC086, 0x7EEC, 0xC087, 0x7EF9,\t0xC088, 0x7F0A, 0xC089, 0x7F10, 0xC08A, 0x7F1E, 0xC08B, 0x7F37,\n\t0xC08C, 0x7F39, 0xC08D, 0x7F3B, 0xC08E, 0x7F3C, 0xC08F, 0x7F3D,\t0xC090, 0x7F3E, 0xC091, 0x7F3F, 0xC092, 0x7F40, 0xC093, 0x7F41,\n\t0xC094, 0x7F43, 0xC095, 0x7F46, 0xC096, 0x7F47, 0xC097, 0x7F48,\t0xC098, 0x7F49, 0xC099, 0x7F4A, 0xC09A, 0x7F4B, 0xC09B, 0x7F4C,\n\t0xC09C, 0x7F4D, 0xC09D, 0x7F4E, 0xC09E, 0x7F4F, 0xC09F, 0x7F52,\t0xC0A0, 0x7F53, 0xC0A1, 0x9988, 0xC0A2, 0x6127, 0xC0A3, 0x6E83,\n\t0xC0A4, 0x5764, 0xC0A5, 0x6606, 0xC0A6, 0x6346, 0xC0A7, 0x56F0,\t0xC0A8, 0x62EC, 0xC0A9, 0x6269, 0xC0AA, 0x5ED3, 0xC0AB, 0x9614,\n\t0xC0AC, 0x5783, 0xC0AD, 0x62C9, 0xC0AE, 0x5587, 0xC0AF, 0x8721,\t0xC0B0, 0x814A, 0xC0B1, 0x8FA3, 0xC0B2, 0x5566, 0xC0B3, 0x83B1,\n\t0xC0B4, 0x6765, 0xC0B5, 0x8D56, 0xC0B6, 0x84DD, 0xC0B7, 0x5A6A,\t0xC0B8, 0x680F, 0xC0B9, 0x62E6, 0xC0BA, 0x7BEE, 0xC0BB, 0x9611,\n\t0xC0BC, 0x5170, 0xC0BD, 0x6F9C, 0xC0BE, 0x8C30, 0xC0BF, 0x63FD,\t0xC0C0, 0x89C8, 0xC0C1, 0x61D2, 0xC0C2, 0x7F06, 0xC0C3, 0x70C2,\n\t0xC0C4, 0x6EE5, 0xC0C5, 0x7405, 0xC0C6, 0x6994, 0xC0C7, 0x72FC,\t0xC0C8, 0x5ECA, 0xC0C9, 0x90CE, 0xC0CA, 0x6717, 0xC0CB, 0x6D6A,\n\t0xC0CC, 0x635E, 0xC0CD, 0x52B3, 0xC0CE, 0x7262, 0xC0CF, 0x8001,\t0xC0D0, 0x4F6C, 0xC0D1, 0x59E5, 0xC0D2, 0x916A, 0xC0D3, 0x70D9,\n\t0xC0D4, 0x6D9D, 0xC0D5, 0x52D2, 0xC0D6, 0x4E50, 0xC0D7, 0x96F7,\t0xC0D8, 0x956D, 0xC0D9, 0x857E, 0xC0DA, 0x78CA, 0xC0DB, 0x7D2F,\n\t0xC0DC, 0x5121, 0xC0DD, 0x5792, 0xC0DE, 0x64C2, 0xC0DF, 0x808B,\t0xC0E0, 0x7C7B, 0xC0E1, 0x6CEA, 0xC0E2, 0x68F1, 0xC0E3, 0x695E,\n\t0xC0E4, 0x51B7, 0xC0E5, 0x5398, 0xC0E6, 0x68A8, 0xC0E7, 0x7281,\t0xC0E8, 0x9ECE, 0xC0E9, 0x7BF1, 0xC0EA, 0x72F8, 0xC0EB, 0x79BB,\n\t0xC0EC, 0x6F13, 0xC0ED, 0x7406, 0xC0EE, 0x674E, 0xC0EF, 0x91CC,\t0xC0F0, 0x9CA4, 0xC0F1, 0x793C, 0xC0F2, 0x8389, 0xC0F3, 0x8354,\n\t0xC0F4, 0x540F, 0xC0F5, 0x6817, 0xC0F6, 0x4E3D, 0xC0F7, 0x5389,\t0xC0F8, 0x52B1, 0xC0F9, 0x783E, 0xC0FA, 0x5386, 0xC0FB, 0x5229,\n\t0xC0FC, 0x5088, 0xC0FD, 0x4F8B, 0xC0FE, 0x4FD0, 0xC140, 0x7F56,\t0xC141, 0x7F59, 0xC142, 0x7F5B, 0xC143, 0x7F5C, 0xC144, 0x7F5D,\n\t0xC145, 0x7F5E, 0xC146, 0x7F60, 0xC147, 0x7F63, 0xC148, 0x7F64,\t0xC149, 0x7F65, 0xC14A, 0x7F66, 0xC14B, 0x7F67, 0xC14C, 0x7F6B,\n\t0xC14D, 0x7F6C, 0xC14E, 0x7F6D, 0xC14F, 0x7F6F, 0xC150, 0x7F70,\t0xC151, 0x7F73, 0xC152, 0x7F75, 0xC153, 0x7F76, 0xC154, 0x7F77,\n\t0xC155, 0x7F78, 0xC156, 0x7F7A, 0xC157, 0x7F7B, 0xC158, 0x7F7C,\t0xC159, 0x7F7D, 0xC15A, 0x7F7F, 0xC15B, 0x7F80, 0xC15C, 0x7F82,\n\t0xC15D, 0x7F83, 0xC15E, 0x7F84, 0xC15F, 0x7F85, 0xC160, 0x7F86,\t0xC161, 0x7F87, 0xC162, 0x7F88, 0xC163, 0x7F89, 0xC164, 0x7F8B,\n\t0xC165, 0x7F8D, 0xC166, 0x7F8F, 0xC167, 0x7F90, 0xC168, 0x7F91,\t0xC169, 0x7F92, 0xC16A, 0x7F93, 0xC16B, 0x7F95, 0xC16C, 0x7F96,\n\t0xC16D, 0x7F97, 0xC16E, 0x7F98, 0xC16F, 0x7F99, 0xC170, 0x7F9B,\t0xC171, 0x7F9C, 0xC172, 0x7FA0, 0xC173, 0x7FA2, 0xC174, 0x7FA3,\n\t0xC175, 0x7FA5, 0xC176, 0x7FA6, 0xC177, 0x7FA8, 0xC178, 0x7FA9,\t0xC179, 0x7FAA, 0xC17A, 0x7FAB, 0xC17B, 0x7FAC, 0xC17C, 0x7FAD,\n\t0xC17D, 0x7FAE, 0xC17E, 0x7FB1, 0xC180, 0x7FB3, 0xC181, 0x7FB4,\t0xC182, 0x7FB5, 0xC183, 0x7FB6, 0xC184, 0x7FB7, 0xC185, 0x7FBA,\n\t0xC186, 0x7FBB, 0xC187, 0x7FBE, 0xC188, 0x7FC0, 0xC189, 0x7FC2,\t0xC18A, 0x7FC3, 0xC18B, 0x7FC4, 0xC18C, 0x7FC6, 0xC18D, 0x7FC7,\n\t0xC18E, 0x7FC8, 0xC18F, 0x7FC9, 0xC190, 0x7FCB, 0xC191, 0x7FCD,\t0xC192, 0x7FCF, 0xC193, 0x7FD0, 0xC194, 0x7FD1, 0xC195, 0x7FD2,\n\t0xC196, 0x7FD3, 0xC197, 0x7FD6, 0xC198, 0x7FD7, 0xC199, 0x7FD9,\t0xC19A, 0x7FDA, 0xC19B, 0x7FDB, 0xC19C, 0x7FDC, 0xC19D, 0x7FDD,\n\t0xC19E, 0x7FDE, 0xC19F, 0x7FE2, 0xC1A0, 0x7FE3, 0xC1A1, 0x75E2,\t0xC1A2, 0x7ACB, 0xC1A3, 0x7C92, 0xC1A4, 0x6CA5, 0xC1A5, 0x96B6,\n\t0xC1A6, 0x529B, 0xC1A7, 0x7483, 0xC1A8, 0x54E9, 0xC1A9, 0x4FE9,\t0xC1AA, 0x8054, 0xC1AB, 0x83B2, 0xC1AC, 0x8FDE, 0xC1AD, 0x9570,\n\t0xC1AE, 0x5EC9, 0xC1AF, 0x601C, 0xC1B0, 0x6D9F, 0xC1B1, 0x5E18,\t0xC1B2, 0x655B, 0xC1B3, 0x8138, 0xC1B4, 0x94FE, 0xC1B5, 0x604B,\n\t0xC1B6, 0x70BC, 0xC1B7, 0x7EC3, 0xC1B8, 0x7CAE, 0xC1B9, 0x51C9,\t0xC1BA, 0x6881, 0xC1BB, 0x7CB1, 0xC1BC, 0x826F, 0xC1BD, 0x4E24,\n\t0xC1BE, 0x8F86, 0xC1BF, 0x91CF, 0xC1C0, 0x667E, 0xC1C1, 0x4EAE,\t0xC1C2, 0x8C05, 0xC1C3, 0x64A9, 0xC1C4, 0x804A, 0xC1C5, 0x50DA,\n\t0xC1C6, 0x7597, 0xC1C7, 0x71CE, 0xC1C8, 0x5BE5, 0xC1C9, 0x8FBD,\t0xC1CA, 0x6F66, 0xC1CB, 0x4E86, 0xC1CC, 0x6482, 0xC1CD, 0x9563,\n\t0xC1CE, 0x5ED6, 0xC1CF, 0x6599, 0xC1D0, 0x5217, 0xC1D1, 0x88C2,\t0xC1D2, 0x70C8, 0xC1D3, 0x52A3, 0xC1D4, 0x730E, 0xC1D5, 0x7433,\n\t0xC1D6, 0x6797, 0xC1D7, 0x78F7, 0xC1D8, 0x9716, 0xC1D9, 0x4E34,\t0xC1DA, 0x90BB, 0xC1DB, 0x9CDE, 0xC1DC, 0x6DCB, 0xC1DD, 0x51DB,\n\t0xC1DE, 0x8D41, 0xC1DF, 0x541D, 0xC1E0, 0x62CE, 0xC1E1, 0x73B2,\t0xC1E2, 0x83F1, 0xC1E3, 0x96F6, 0xC1E4, 0x9F84, 0xC1E5, 0x94C3,\n\t0xC1E6, 0x4F36, 0xC1E7, 0x7F9A, 0xC1E8, 0x51CC, 0xC1E9, 0x7075,\t0xC1EA, 0x9675, 0xC1EB, 0x5CAD, 0xC1EC, 0x9886, 0xC1ED, 0x53E6,\n\t0xC1EE, 0x4EE4, 0xC1EF, 0x6E9C, 0xC1F0, 0x7409, 0xC1F1, 0x69B4,\t0xC1F2, 0x786B, 0xC1F3, 0x998F, 0xC1F4, 0x7559, 0xC1F5, 0x5218,\n\t0xC1F6, 0x7624, 0xC1F7, 0x6D41, 0xC1F8, 0x67F3, 0xC1F9, 0x516D,\t0xC1FA, 0x9F99, 0xC1FB, 0x804B, 0xC1FC, 0x5499, 0xC1FD, 0x7B3C,\n\t0xC1FE, 0x7ABF, 0xC240, 0x7FE4, 0xC241, 0x7FE7, 0xC242, 0x7FE8,\t0xC243, 0x7FEA, 0xC244, 0x7FEB, 0xC245, 0x7FEC, 0xC246, 0x7FED,\n\t0xC247, 0x7FEF, 0xC248, 0x7FF2, 0xC249, 0x7FF4, 0xC24A, 0x7FF5,\t0xC24B, 0x7FF6, 0xC24C, 0x7FF7, 0xC24D, 0x7FF8, 0xC24E, 0x7FF9,\n\t0xC24F, 0x7FFA, 0xC250, 0x7FFD, 0xC251, 0x7FFE, 0xC252, 0x7FFF,\t0xC253, 0x8002, 0xC254, 0x8007, 0xC255, 0x8008, 0xC256, 0x8009,\n\t0xC257, 0x800A, 0xC258, 0x800E, 0xC259, 0x800F, 0xC25A, 0x8011,\t0xC25B, 0x8013, 0xC25C, 0x801A, 0xC25D, 0x801B, 0xC25E, 0x801D,\n\t0xC25F, 0x801E, 0xC260, 0x801F, 0xC261, 0x8021, 0xC262, 0x8023,\t0xC263, 0x8024, 0xC264, 0x802B, 0xC265, 0x802C, 0xC266, 0x802D,\n\t0xC267, 0x802E, 0xC268, 0x802F, 0xC269, 0x8030, 0xC26A, 0x8032,\t0xC26B, 0x8034, 0xC26C, 0x8039, 0xC26D, 0x803A, 0xC26E, 0x803C,\n\t0xC26F, 0x803E, 0xC270, 0x8040, 0xC271, 0x8041, 0xC272, 0x8044,\t0xC273, 0x8045, 0xC274, 0x8047, 0xC275, 0x8048, 0xC276, 0x8049,\n\t0xC277, 0x804E, 0xC278, 0x804F, 0xC279, 0x8050, 0xC27A, 0x8051,\t0xC27B, 0x8053, 0xC27C, 0x8055, 0xC27D, 0x8056, 0xC27E, 0x8057,\n\t0xC280, 0x8059, 0xC281, 0x805B, 0xC282, 0x805C, 0xC283, 0x805D,\t0xC284, 0x805E, 0xC285, 0x805F, 0xC286, 0x8060, 0xC287, 0x8061,\n\t0xC288, 0x8062, 0xC289, 0x8063, 0xC28A, 0x8064, 0xC28B, 0x8065,\t0xC28C, 0x8066, 0xC28D, 0x8067, 0xC28E, 0x8068, 0xC28F, 0x806B,\n\t0xC290, 0x806C, 0xC291, 0x806D, 0xC292, 0x806E, 0xC293, 0x806F,\t0xC294, 0x8070, 0xC295, 0x8072, 0xC296, 0x8073, 0xC297, 0x8074,\n\t0xC298, 0x8075, 0xC299, 0x8076, 0xC29A, 0x8077, 0xC29B, 0x8078,\t0xC29C, 0x8079, 0xC29D, 0x807A, 0xC29E, 0x807B, 0xC29F, 0x807C,\n\t0xC2A0, 0x807D, 0xC2A1, 0x9686, 0xC2A2, 0x5784, 0xC2A3, 0x62E2,\t0xC2A4, 0x9647, 0xC2A5, 0x697C, 0xC2A6, 0x5A04, 0xC2A7, 0x6402,\n\t0xC2A8, 0x7BD3, 0xC2A9, 0x6F0F, 0xC2AA, 0x964B, 0xC2AB, 0x82A6,\t0xC2AC, 0x5362, 0xC2AD, 0x9885, 0xC2AE, 0x5E90, 0xC2AF, 0x7089,\n\t0xC2B0, 0x63B3, 0xC2B1, 0x5364, 0xC2B2, 0x864F, 0xC2B3, 0x9C81,\t0xC2B4, 0x9E93, 0xC2B5, 0x788C, 0xC2B6, 0x9732, 0xC2B7, 0x8DEF,\n\t0xC2B8, 0x8D42, 0xC2B9, 0x9E7F, 0xC2BA, 0x6F5E, 0xC2BB, 0x7984,\t0xC2BC, 0x5F55, 0xC2BD, 0x9646, 0xC2BE, 0x622E, 0xC2BF, 0x9A74,\n\t0xC2C0, 0x5415, 0xC2C1, 0x94DD, 0xC2C2, 0x4FA3, 0xC2C3, 0x65C5,\t0xC2C4, 0x5C65, 0xC2C5, 0x5C61, 0xC2C6, 0x7F15, 0xC2C7, 0x8651,\n\t0xC2C8, 0x6C2F, 0xC2C9, 0x5F8B, 0xC2CA, 0x7387, 0xC2CB, 0x6EE4,\t0xC2CC, 0x7EFF, 0xC2CD, 0x5CE6, 0xC2CE, 0x631B, 0xC2CF, 0x5B6A,\n\t0xC2D0, 0x6EE6, 0xC2D1, 0x5375, 0xC2D2, 0x4E71, 0xC2D3, 0x63A0,\t0xC2D4, 0x7565, 0xC2D5, 0x62A1, 0xC2D6, 0x8F6E, 0xC2D7, 0x4F26,\n\t0xC2D8, 0x4ED1, 0xC2D9, 0x6CA6, 0xC2DA, 0x7EB6, 0xC2DB, 0x8BBA,\t0xC2DC, 0x841D, 0xC2DD, 0x87BA, 0xC2DE, 0x7F57, 0xC2DF, 0x903B,\n\t0xC2E0, 0x9523, 0xC2E1, 0x7BA9, 0xC2E2, 0x9AA1, 0xC2E3, 0x88F8,\t0xC2E4, 0x843D, 0xC2E5, 0x6D1B, 0xC2E6, 0x9A86, 0xC2E7, 0x7EDC,\n\t0xC2E8, 0x5988, 0xC2E9, 0x9EBB, 0xC2EA, 0x739B, 0xC2EB, 0x7801,\t0xC2EC, 0x8682, 0xC2ED, 0x9A6C, 0xC2EE, 0x9A82, 0xC2EF, 0x561B,\n\t0xC2F0, 0x5417, 0xC2F1, 0x57CB, 0xC2F2, 0x4E70, 0xC2F3, 0x9EA6,\t0xC2F4, 0x5356, 0xC2F5, 0x8FC8, 0xC2F6, 0x8109, 0xC2F7, 0x7792,\n\t0xC2F8, 0x9992, 0xC2F9, 0x86EE, 0xC2FA, 0x6EE1, 0xC2FB, 0x8513,\t0xC2FC, 0x66FC, 0xC2FD, 0x6162, 0xC2FE, 0x6F2B, 0xC340, 0x807E,\n\t0xC341, 0x8081, 0xC342, 0x8082, 0xC343, 0x8085, 0xC344, 0x8088,\t0xC345, 0x808A, 0xC346, 0x808D, 0xC347, 0x808E, 0xC348, 0x808F,\n\t0xC349, 0x8090, 0xC34A, 0x8091, 0xC34B, 0x8092, 0xC34C, 0x8094,\t0xC34D, 0x8095, 0xC34E, 0x8097, 0xC34F, 0x8099, 0xC350, 0x809E,\n\t0xC351, 0x80A3, 0xC352, 0x80A6, 0xC353, 0x80A7, 0xC354, 0x80A8,\t0xC355, 0x80AC, 0xC356, 0x80B0, 0xC357, 0x80B3, 0xC358, 0x80B5,\n\t0xC359, 0x80B6, 0xC35A, 0x80B8, 0xC35B, 0x80B9, 0xC35C, 0x80BB,\t0xC35D, 0x80C5, 0xC35E, 0x80C7, 0xC35F, 0x80C8, 0xC360, 0x80C9,\n\t0xC361, 0x80CA, 0xC362, 0x80CB, 0xC363, 0x80CF, 0xC364, 0x80D0,\t0xC365, 0x80D1, 0xC366, 0x80D2, 0xC367, 0x80D3, 0xC368, 0x80D4,\n\t0xC369, 0x80D5, 0xC36A, 0x80D8, 0xC36B, 0x80DF, 0xC36C, 0x80E0,\t0xC36D, 0x80E2, 0xC36E, 0x80E3, 0xC36F, 0x80E6, 0xC370, 0x80EE,\n\t0xC371, 0x80F5, 0xC372, 0x80F7, 0xC373, 0x80F9, 0xC374, 0x80FB,\t0xC375, 0x80FE, 0xC376, 0x80FF, 0xC377, 0x8100, 0xC378, 0x8101,\n\t0xC379, 0x8103, 0xC37A, 0x8104, 0xC37B, 0x8105, 0xC37C, 0x8107,\t0xC37D, 0x8108, 0xC37E, 0x810B, 0xC380, 0x810C, 0xC381, 0x8115,\n\t0xC382, 0x8117, 0xC383, 0x8119, 0xC384, 0x811B, 0xC385, 0x811C,\t0xC386, 0x811D, 0xC387, 0x811F, 0xC388, 0x8120, 0xC389, 0x8121,\n\t0xC38A, 0x8122, 0xC38B, 0x8123, 0xC38C, 0x8124, 0xC38D, 0x8125,\t0xC38E, 0x8126, 0xC38F, 0x8127, 0xC390, 0x8128, 0xC391, 0x8129,\n\t0xC392, 0x812A, 0xC393, 0x812B, 0xC394, 0x812D, 0xC395, 0x812E,\t0xC396, 0x8130, 0xC397, 0x8133, 0xC398, 0x8134, 0xC399, 0x8135,\n\t0xC39A, 0x8137, 0xC39B, 0x8139, 0xC39C, 0x813A, 0xC39D, 0x813B,\t0xC39E, 0x813C, 0xC39F, 0x813D, 0xC3A0, 0x813F, 0xC3A1, 0x8C29,\n\t0xC3A2, 0x8292, 0xC3A3, 0x832B, 0xC3A4, 0x76F2, 0xC3A5, 0x6C13,\t0xC3A6, 0x5FD9, 0xC3A7, 0x83BD, 0xC3A8, 0x732B, 0xC3A9, 0x8305,\n\t0xC3AA, 0x951A, 0xC3AB, 0x6BDB, 0xC3AC, 0x77DB, 0xC3AD, 0x94C6,\t0xC3AE, 0x536F, 0xC3AF, 0x8302, 0xC3B0, 0x5192, 0xC3B1, 0x5E3D,\n\t0xC3B2, 0x8C8C, 0xC3B3, 0x8D38, 0xC3B4, 0x4E48, 0xC3B5, 0x73AB,\t0xC3B6, 0x679A, 0xC3B7, 0x6885, 0xC3B8, 0x9176, 0xC3B9, 0x9709,\n\t0xC3BA, 0x7164, 0xC3BB, 0x6CA1, 0xC3BC, 0x7709, 0xC3BD, 0x5A92,\t0xC3BE, 0x9541, 0xC3BF, 0x6BCF, 0xC3C0, 0x7F8E, 0xC3C1, 0x6627,\n\t0xC3C2, 0x5BD0, 0xC3C3, 0x59B9, 0xC3C4, 0x5A9A, 0xC3C5, 0x95E8,\t0xC3C6, 0x95F7, 0xC3C7, 0x4EEC, 0xC3C8, 0x840C, 0xC3C9, 0x8499,\n\t0xC3CA, 0x6AAC, 0xC3CB, 0x76DF, 0xC3CC, 0x9530, 0xC3CD, 0x731B,\t0xC3CE, 0x68A6, 0xC3CF, 0x5B5F, 0xC3D0, 0x772F, 0xC3D1, 0x919A,\n\t0xC3D2, 0x9761, 0xC3D3, 0x7CDC, 0xC3D4, 0x8FF7, 0xC3D5, 0x8C1C,\t0xC3D6, 0x5F25, 0xC3D7, 0x7C73, 0xC3D8, 0x79D8, 0xC3D9, 0x89C5,\n\t0xC3DA, 0x6CCC, 0xC3DB, 0x871C, 0xC3DC, 0x5BC6, 0xC3DD, 0x5E42,\t0xC3DE, 0x68C9, 0xC3DF, 0x7720, 0xC3E0, 0x7EF5, 0xC3E1, 0x5195,\n\t0xC3E2, 0x514D, 0xC3E3, 0x52C9, 0xC3E4, 0x5A29, 0xC3E5, 0x7F05,\t0xC3E6, 0x9762, 0xC3E7, 0x82D7, 0xC3E8, 0x63CF, 0xC3E9, 0x7784,\n\t0xC3EA, 0x85D0, 0xC3EB, 0x79D2, 0xC3EC, 0x6E3A, 0xC3ED, 0x5E99,\t0xC3EE, 0x5999, 0xC3EF, 0x8511, 0xC3F0, 0x706D, 0xC3F1, 0x6C11,\n\t0xC3F2, 0x62BF, 0xC3F3, 0x76BF, 0xC3F4, 0x654F, 0xC3F5, 0x60AF,\t0xC3F6, 0x95FD, 0xC3F7, 0x660E, 0xC3F8, 0x879F, 0xC3F9, 0x9E23,\n\t0xC3FA, 0x94ED, 0xC3FB, 0x540D, 0xC3FC, 0x547D, 0xC3FD, 0x8C2C,\t0xC3FE, 0x6478, 0xC440, 0x8140, 0xC441, 0x8141, 0xC442, 0x8142,\n\t0xC443, 0x8143, 0xC444, 0x8144, 0xC445, 0x8145, 0xC446, 0x8147,\t0xC447, 0x8149, 0xC448, 0x814D, 0xC449, 0x814E, 0xC44A, 0x814F,\n\t0xC44B, 0x8152, 0xC44C, 0x8156, 0xC44D, 0x8157, 0xC44E, 0x8158,\t0xC44F, 0x815B, 0xC450, 0x815C, 0xC451, 0x815D, 0xC452, 0x815E,\n\t0xC453, 0x815F, 0xC454, 0x8161, 0xC455, 0x8162, 0xC456, 0x8163,\t0xC457, 0x8164, 0xC458, 0x8166, 0xC459, 0x8168, 0xC45A, 0x816A,\n\t0xC45B, 0x816B, 0xC45C, 0x816C, 0xC45D, 0x816F, 0xC45E, 0x8172,\t0xC45F, 0x8173, 0xC460, 0x8175, 0xC461, 0x8176, 0xC462, 0x8177,\n\t0xC463, 0x8178, 0xC464, 0x8181, 0xC465, 0x8183, 0xC466, 0x8184,\t0xC467, 0x8185, 0xC468, 0x8186, 0xC469, 0x8187, 0xC46A, 0x8189,\n\t0xC46B, 0x818B, 0xC46C, 0x818C, 0xC46D, 0x818D, 0xC46E, 0x818E,\t0xC46F, 0x8190, 0xC470, 0x8192, 0xC471, 0x8193, 0xC472, 0x8194,\n\t0xC473, 0x8195, 0xC474, 0x8196, 0xC475, 0x8197, 0xC476, 0x8199,\t0xC477, 0x819A, 0xC478, 0x819E, 0xC479, 0x819F, 0xC47A, 0x81A0,\n\t0xC47B, 0x81A1, 0xC47C, 0x81A2, 0xC47D, 0x81A4, 0xC47E, 0x81A5,\t0xC480, 0x81A7, 0xC481, 0x81A9, 0xC482, 0x81AB, 0xC483, 0x81AC,\n\t0xC484, 0x81AD, 0xC485, 0x81AE, 0xC486, 0x81AF, 0xC487, 0x81B0,\t0xC488, 0x81B1, 0xC489, 0x81B2, 0xC48A, 0x81B4, 0xC48B, 0x81B5,\n\t0xC48C, 0x81B6, 0xC48D, 0x81B7, 0xC48E, 0x81B8, 0xC48F, 0x81B9,\t0xC490, 0x81BC, 0xC491, 0x81BD, 0xC492, 0x81BE, 0xC493, 0x81BF,\n\t0xC494, 0x81C4, 0xC495, 0x81C5, 0xC496, 0x81C7, 0xC497, 0x81C8,\t0xC498, 0x81C9, 0xC499, 0x81CB, 0xC49A, 0x81CD, 0xC49B, 0x81CE,\n\t0xC49C, 0x81CF, 0xC49D, 0x81D0, 0xC49E, 0x81D1, 0xC49F, 0x81D2,\t0xC4A0, 0x81D3, 0xC4A1, 0x6479, 0xC4A2, 0x8611, 0xC4A3, 0x6A21,\n\t0xC4A4, 0x819C, 0xC4A5, 0x78E8, 0xC4A6, 0x6469, 0xC4A7, 0x9B54,\t0xC4A8, 0x62B9, 0xC4A9, 0x672B, 0xC4AA, 0x83AB, 0xC4AB, 0x58A8,\n\t0xC4AC, 0x9ED8, 0xC4AD, 0x6CAB, 0xC4AE, 0x6F20, 0xC4AF, 0x5BDE,\t0xC4B0, 0x964C, 0xC4B1, 0x8C0B, 0xC4B2, 0x725F, 0xC4B3, 0x67D0,\n\t0xC4B4, 0x62C7, 0xC4B5, 0x7261, 0xC4B6, 0x4EA9, 0xC4B7, 0x59C6,\t0xC4B8, 0x6BCD, 0xC4B9, 0x5893, 0xC4BA, 0x66AE, 0xC4BB, 0x5E55,\n\t0xC4BC, 0x52DF, 0xC4BD, 0x6155, 0xC4BE, 0x6728, 0xC4BF, 0x76EE,\t0xC4C0, 0x7766, 0xC4C1, 0x7267, 0xC4C2, 0x7A46, 0xC4C3, 0x62FF,\n\t0xC4C4, 0x54EA, 0xC4C5, 0x5450, 0xC4C6, 0x94A0, 0xC4C7, 0x90A3,\t0xC4C8, 0x5A1C, 0xC4C9, 0x7EB3, 0xC4CA, 0x6C16, 0xC4CB, 0x4E43,\n\t0xC4CC, 0x5976, 0xC4CD, 0x8010, 0xC4CE, 0x5948, 0xC4CF, 0x5357,\t0xC4D0, 0x7537, 0xC4D1, 0x96BE, 0xC4D2, 0x56CA, 0xC4D3, 0x6320,\n\t0xC4D4, 0x8111, 0xC4D5, 0x607C, 0xC4D6, 0x95F9, 0xC4D7, 0x6DD6,\t0xC4D8, 0x5462, 0xC4D9, 0x9981, 0xC4DA, 0x5185, 0xC4DB, 0x5AE9,\n\t0xC4DC, 0x80FD, 0xC4DD, 0x59AE, 0xC4DE, 0x9713, 0xC4DF, 0x502A,\t0xC4E0, 0x6CE5, 0xC4E1, 0x5C3C, 0xC4E2, 0x62DF, 0xC4E3, 0x4F60,\n\t0xC4E4, 0x533F, 0xC4E5, 0x817B, 0xC4E6, 0x9006, 0xC4E7, 0x6EBA,\t0xC4E8, 0x852B, 0xC4E9, 0x62C8, 0xC4EA, 0x5E74, 0xC4EB, 0x78BE,\n\t0xC4EC, 0x64B5, 0xC4ED, 0x637B, 0xC4EE, 0x5FF5, 0xC4EF, 0x5A18,\t0xC4F0, 0x917F, 0xC4F1, 0x9E1F, 0xC4F2, 0x5C3F, 0xC4F3, 0x634F,\n\t0xC4F4, 0x8042, 0xC4F5, 0x5B7D, 0xC4F6, 0x556E, 0xC4F7, 0x954A,\t0xC4F8, 0x954D, 0xC4F9, 0x6D85, 0xC4FA, 0x60A8, 0xC4FB, 0x67E0,\n\t0xC4FC, 0x72DE, 0xC4FD, 0x51DD, 0xC4FE, 0x5B81, 0xC540, 0x81D4,\t0xC541, 0x81D5, 0xC542, 0x81D6, 0xC543, 0x81D7, 0xC544, 0x81D8,\n\t0xC545, 0x81D9, 0xC546, 0x81DA, 0xC547, 0x81DB, 0xC548, 0x81DC,\t0xC549, 0x81DD, 0xC54A, 0x81DE, 0xC54B, 0x81DF, 0xC54C, 0x81E0,\n\t0xC54D, 0x81E1, 0xC54E, 0x81E2, 0xC54F, 0x81E4, 0xC550, 0x81E5,\t0xC551, 0x81E6, 0xC552, 0x81E8, 0xC553, 0x81E9, 0xC554, 0x81EB,\n\t0xC555, 0x81EE, 0xC556, 0x81EF, 0xC557, 0x81F0, 0xC558, 0x81F1,\t0xC559, 0x81F2, 0xC55A, 0x81F5, 0xC55B, 0x81F6, 0xC55C, 0x81F7,\n\t0xC55D, 0x81F8, 0xC55E, 0x81F9, 0xC55F, 0x81FA, 0xC560, 0x81FD,\t0xC561, 0x81FF, 0xC562, 0x8203, 0xC563, 0x8207, 0xC564, 0x8208,\n\t0xC565, 0x8209, 0xC566, 0x820A, 0xC567, 0x820B, 0xC568, 0x820E,\t0xC569, 0x820F, 0xC56A, 0x8211, 0xC56B, 0x8213, 0xC56C, 0x8215,\n\t0xC56D, 0x8216, 0xC56E, 0x8217, 0xC56F, 0x8218, 0xC570, 0x8219,\t0xC571, 0x821A, 0xC572, 0x821D, 0xC573, 0x8220, 0xC574, 0x8224,\n\t0xC575, 0x8225, 0xC576, 0x8226, 0xC577, 0x8227, 0xC578, 0x8229,\t0xC579, 0x822E, 0xC57A, 0x8232, 0xC57B, 0x823A, 0xC57C, 0x823C,\n\t0xC57D, 0x823D, 0xC57E, 0x823F, 0xC580, 0x8240, 0xC581, 0x8241,\t0xC582, 0x8242, 0xC583, 0x8243, 0xC584, 0x8245, 0xC585, 0x8246,\n\t0xC586, 0x8248, 0xC587, 0x824A, 0xC588, 0x824C, 0xC589, 0x824D,\t0xC58A, 0x824E, 0xC58B, 0x8250, 0xC58C, 0x8251, 0xC58D, 0x8252,\n\t0xC58E, 0x8253, 0xC58F, 0x8254, 0xC590, 0x8255, 0xC591, 0x8256,\t0xC592, 0x8257, 0xC593, 0x8259, 0xC594, 0x825B, 0xC595, 0x825C,\n\t0xC596, 0x825D, 0xC597, 0x825E, 0xC598, 0x8260, 0xC599, 0x8261,\t0xC59A, 0x8262, 0xC59B, 0x8263, 0xC59C, 0x8264, 0xC59D, 0x8265,\n\t0xC59E, 0x8266, 0xC59F, 0x8267, 0xC5A0, 0x8269, 0xC5A1, 0x62E7,\t0xC5A2, 0x6CDE, 0xC5A3, 0x725B, 0xC5A4, 0x626D, 0xC5A5, 0x94AE,\n\t0xC5A6, 0x7EBD, 0xC5A7, 0x8113, 0xC5A8, 0x6D53, 0xC5A9, 0x519C,\t0xC5AA, 0x5F04, 0xC5AB, 0x5974, 0xC5AC, 0x52AA, 0xC5AD, 0x6012,\n\t0xC5AE, 0x5973, 0xC5AF, 0x6696, 0xC5B0, 0x8650, 0xC5B1, 0x759F,\t0xC5B2, 0x632A, 0xC5B3, 0x61E6, 0xC5B4, 0x7CEF, 0xC5B5, 0x8BFA,\n\t0xC5B6, 0x54E6, 0xC5B7, 0x6B27, 0xC5B8, 0x9E25, 0xC5B9, 0x6BB4,\t0xC5BA, 0x85D5, 0xC5BB, 0x5455, 0xC5BC, 0x5076, 0xC5BD, 0x6CA4,\n\t0xC5BE, 0x556A, 0xC5BF, 0x8DB4, 0xC5C0, 0x722C, 0xC5C1, 0x5E15,\t0xC5C2, 0x6015, 0xC5C3, 0x7436, 0xC5C4, 0x62CD, 0xC5C5, 0x6392,\n\t0xC5C6, 0x724C, 0xC5C7, 0x5F98, 0xC5C8, 0x6E43, 0xC5C9, 0x6D3E,\t0xC5CA, 0x6500, 0xC5CB, 0x6F58, 0xC5CC, 0x76D8, 0xC5CD, 0x78D0,\n\t0xC5CE, 0x76FC, 0xC5CF, 0x7554, 0xC5D0, 0x5224, 0xC5D1, 0x53DB,\t0xC5D2, 0x4E53, 0xC5D3, 0x5E9E, 0xC5D4, 0x65C1, 0xC5D5, 0x802A,\n\t0xC5D6, 0x80D6, 0xC5D7, 0x629B, 0xC5D8, 0x5486, 0xC5D9, 0x5228,\t0xC5DA, 0x70AE, 0xC5DB, 0x888D, 0xC5DC, 0x8DD1, 0xC5DD, 0x6CE1,\n\t0xC5DE, 0x5478, 0xC5DF, 0x80DA, 0xC5E0, 0x57F9, 0xC5E1, 0x88F4,\t0xC5E2, 0x8D54, 0xC5E3, 0x966A, 0xC5E4, 0x914D, 0xC5E5, 0x4F69,\n\t0xC5E6, 0x6C9B, 0xC5E7, 0x55B7, 0xC5E8, 0x76C6, 0xC5E9, 0x7830,\t0xC5EA, 0x62A8, 0xC5EB, 0x70F9, 0xC5EC, 0x6F8E, 0xC5ED, 0x5F6D,\n\t0xC5EE, 0x84EC, 0xC5EF, 0x68DA, 0xC5F0, 0x787C, 0xC5F1, 0x7BF7,\t0xC5F2, 0x81A8, 0xC5F3, 0x670B, 0xC5F4, 0x9E4F, 0xC5F5, 0x6367,\n\t0xC5F6, 0x78B0, 0xC5F7, 0x576F, 0xC5F8, 0x7812, 0xC5F9, 0x9739,\t0xC5FA, 0x6279, 0xC5FB, 0x62AB, 0xC5FC, 0x5288, 0xC5FD, 0x7435,\n\t0xC5FE, 0x6BD7, 0xC640, 0x826A, 0xC641, 0x826B, 0xC642, 0x826C,\t0xC643, 0x826D, 0xC644, 0x8271, 0xC645, 0x8275, 0xC646, 0x8276,\n\t0xC647, 0x8277, 0xC648, 0x8278, 0xC649, 0x827B, 0xC64A, 0x827C,\t0xC64B, 0x8280, 0xC64C, 0x8281, 0xC64D, 0x8283, 0xC64E, 0x8285,\n\t0xC64F, 0x8286, 0xC650, 0x8287, 0xC651, 0x8289, 0xC652, 0x828C,\t0xC653, 0x8290, 0xC654, 0x8293, 0xC655, 0x8294, 0xC656, 0x8295,\n\t0xC657, 0x8296, 0xC658, 0x829A, 0xC659, 0x829B, 0xC65A, 0x829E,\t0xC65B, 0x82A0, 0xC65C, 0x82A2, 0xC65D, 0x82A3, 0xC65E, 0x82A7,\n\t0xC65F, 0x82B2, 0xC660, 0x82B5, 0xC661, 0x82B6, 0xC662, 0x82BA,\t0xC663, 0x82BB, 0xC664, 0x82BC, 0xC665, 0x82BF, 0xC666, 0x82C0,\n\t0xC667, 0x82C2, 0xC668, 0x82C3, 0xC669, 0x82C5, 0xC66A, 0x82C6,\t0xC66B, 0x82C9, 0xC66C, 0x82D0, 0xC66D, 0x82D6, 0xC66E, 0x82D9,\n\t0xC66F, 0x82DA, 0xC670, 0x82DD, 0xC671, 0x82E2, 0xC672, 0x82E7,\t0xC673, 0x82E8, 0xC674, 0x82E9, 0xC675, 0x82EA, 0xC676, 0x82EC,\n\t0xC677, 0x82ED, 0xC678, 0x82EE, 0xC679, 0x82F0, 0xC67A, 0x82F2,\t0xC67B, 0x82F3, 0xC67C, 0x82F5, 0xC67D, 0x82F6, 0xC67E, 0x82F8,\n\t0xC680, 0x82FA, 0xC681, 0x82FC, 0xC682, 0x82FD, 0xC683, 0x82FE,\t0xC684, 0x82FF, 0xC685, 0x8300, 0xC686, 0x830A, 0xC687, 0x830B,\n\t0xC688, 0x830D, 0xC689, 0x8310, 0xC68A, 0x8312, 0xC68B, 0x8313,\t0xC68C, 0x8316, 0xC68D, 0x8318, 0xC68E, 0x8319, 0xC68F, 0x831D,\n\t0xC690, 0x831E, 0xC691, 0x831F, 0xC692, 0x8320, 0xC693, 0x8321,\t0xC694, 0x8322, 0xC695, 0x8323, 0xC696, 0x8324, 0xC697, 0x8325,\n\t0xC698, 0x8326, 0xC699, 0x8329, 0xC69A, 0x832A, 0xC69B, 0x832E,\t0xC69C, 0x8330, 0xC69D, 0x8332, 0xC69E, 0x8337, 0xC69F, 0x833B,\n\t0xC6A0, 0x833D, 0xC6A1, 0x5564, 0xC6A2, 0x813E, 0xC6A3, 0x75B2,\t0xC6A4, 0x76AE, 0xC6A5, 0x5339, 0xC6A6, 0x75DE, 0xC6A7, 0x50FB,\n\t0xC6A8, 0x5C41, 0xC6A9, 0x8B6C, 0xC6AA, 0x7BC7, 0xC6AB, 0x504F,\t0xC6AC, 0x7247, 0xC6AD, 0x9A97, 0xC6AE, 0x98D8, 0xC6AF, 0x6F02,\n\t0xC6B0, 0x74E2, 0xC6B1, 0x7968, 0xC6B2, 0x6487, 0xC6B3, 0x77A5,\t0xC6B4, 0x62FC, 0xC6B5, 0x9891, 0xC6B6, 0x8D2B, 0xC6B7, 0x54C1,\n\t0xC6B8, 0x8058, 0xC6B9, 0x4E52, 0xC6BA, 0x576A, 0xC6BB, 0x82F9,\t0xC6BC, 0x840D, 0xC6BD, 0x5E73, 0xC6BE, 0x51ED, 0xC6BF, 0x74F6,\n\t0xC6C0, 0x8BC4, 0xC6C1, 0x5C4F, 0xC6C2, 0x5761, 0xC6C3, 0x6CFC,\t0xC6C4, 0x9887, 0xC6C5, 0x5A46, 0xC6C6, 0x7834, 0xC6C7, 0x9B44,\n\t0xC6C8, 0x8FEB, 0xC6C9, 0x7C95, 0xC6CA, 0x5256, 0xC6CB, 0x6251,\t0xC6CC, 0x94FA, 0xC6CD, 0x4EC6, 0xC6CE, 0x8386, 0xC6CF, 0x8461,\n\t0xC6D0, 0x83E9, 0xC6D1, 0x84B2, 0xC6D2, 0x57D4, 0xC6D3, 0x6734,\t0xC6D4, 0x5703, 0xC6D5, 0x666E, 0xC6D6, 0x6D66, 0xC6D7, 0x8C31,\n\t0xC6D8, 0x66DD, 0xC6D9, 0x7011, 0xC6DA, 0x671F, 0xC6DB, 0x6B3A,\t0xC6DC, 0x6816, 0xC6DD, 0x621A, 0xC6DE, 0x59BB, 0xC6DF, 0x4E03,\n\t0xC6E0, 0x51C4, 0xC6E1, 0x6F06, 0xC6E2, 0x67D2, 0xC6E3, 0x6C8F,\t0xC6E4, 0x5176, 0xC6E5, 0x68CB, 0xC6E6, 0x5947, 0xC6E7, 0x6B67,\n\t0xC6E8, 0x7566, 0xC6E9, 0x5D0E, 0xC6EA, 0x8110, 0xC6EB, 0x9F50,\t0xC6EC, 0x65D7, 0xC6ED, 0x7948, 0xC6EE, 0x7941, 0xC6EF, 0x9A91,\n\t0xC6F0, 0x8D77, 0xC6F1, 0x5C82, 0xC6F2, 0x4E5E, 0xC6F3, 0x4F01,\t0xC6F4, 0x542F, 0xC6F5, 0x5951, 0xC6F6, 0x780C, 0xC6F7, 0x5668,\n\t0xC6F8, 0x6C14, 0xC6F9, 0x8FC4, 0xC6FA, 0x5F03, 0xC6FB, 0x6C7D,\t0xC6FC, 0x6CE3, 0xC6FD, 0x8BAB, 0xC6FE, 0x6390, 0xC740, 0x833E,\n\t0xC741, 0x833F, 0xC742, 0x8341, 0xC743, 0x8342, 0xC744, 0x8344,\t0xC745, 0x8345, 0xC746, 0x8348, 0xC747, 0x834A, 0xC748, 0x834B,\n\t0xC749, 0x834C, 0xC74A, 0x834D, 0xC74B, 0x834E, 0xC74C, 0x8353,\t0xC74D, 0x8355, 0xC74E, 0x8356, 0xC74F, 0x8357, 0xC750, 0x8358,\n\t0xC751, 0x8359, 0xC752, 0x835D, 0xC753, 0x8362, 0xC754, 0x8370,\t0xC755, 0x8371, 0xC756, 0x8372, 0xC757, 0x8373, 0xC758, 0x8374,\n\t0xC759, 0x8375, 0xC75A, 0x8376, 0xC75B, 0x8379, 0xC75C, 0x837A,\t0xC75D, 0x837E, 0xC75E, 0x837F, 0xC75F, 0x8380, 0xC760, 0x8381,\n\t0xC761, 0x8382, 0xC762, 0x8383, 0xC763, 0x8384, 0xC764, 0x8387,\t0xC765, 0x8388, 0xC766, 0x838A, 0xC767, 0x838B, 0xC768, 0x838C,\n\t0xC769, 0x838D, 0xC76A, 0x838F, 0xC76B, 0x8390, 0xC76C, 0x8391,\t0xC76D, 0x8394, 0xC76E, 0x8395, 0xC76F, 0x8396, 0xC770, 0x8397,\n\t0xC771, 0x8399, 0xC772, 0x839A, 0xC773, 0x839D, 0xC774, 0x839F,\t0xC775, 0x83A1, 0xC776, 0x83A2, 0xC777, 0x83A3, 0xC778, 0x83A4,\n\t0xC779, 0x83A5, 0xC77A, 0x83A6, 0xC77B, 0x83A7, 0xC77C, 0x83AC,\t0xC77D, 0x83AD, 0xC77E, 0x83AE, 0xC780, 0x83AF, 0xC781, 0x83B5,\n\t0xC782, 0x83BB, 0xC783, 0x83BE, 0xC784, 0x83BF, 0xC785, 0x83C2,\t0xC786, 0x83C3, 0xC787, 0x83C4, 0xC788, 0x83C6, 0xC789, 0x83C8,\n\t0xC78A, 0x83C9, 0xC78B, 0x83CB, 0xC78C, 0x83CD, 0xC78D, 0x83CE,\t0xC78E, 0x83D0, 0xC78F, 0x83D1, 0xC790, 0x83D2, 0xC791, 0x83D3,\n\t0xC792, 0x83D5, 0xC793, 0x83D7, 0xC794, 0x83D9, 0xC795, 0x83DA,\t0xC796, 0x83DB, 0xC797, 0x83DE, 0xC798, 0x83E2, 0xC799, 0x83E3,\n\t0xC79A, 0x83E4, 0xC79B, 0x83E6, 0xC79C, 0x83E7, 0xC79D, 0x83E8,\t0xC79E, 0x83EB, 0xC79F, 0x83EC, 0xC7A0, 0x83ED, 0xC7A1, 0x6070,\n\t0xC7A2, 0x6D3D, 0xC7A3, 0x7275, 0xC7A4, 0x6266, 0xC7A5, 0x948E,\t0xC7A6, 0x94C5, 0xC7A7, 0x5343, 0xC7A8, 0x8FC1, 0xC7A9, 0x7B7E,\n\t0xC7AA, 0x4EDF, 0xC7AB, 0x8C26, 0xC7AC, 0x4E7E, 0xC7AD, 0x9ED4,\t0xC7AE, 0x94B1, 0xC7AF, 0x94B3, 0xC7B0, 0x524D, 0xC7B1, 0x6F5C,\n\t0xC7B2, 0x9063, 0xC7B3, 0x6D45, 0xC7B4, 0x8C34, 0xC7B5, 0x5811,\t0xC7B6, 0x5D4C, 0xC7B7, 0x6B20, 0xC7B8, 0x6B49, 0xC7B9, 0x67AA,\n\t0xC7BA, 0x545B, 0xC7BB, 0x8154, 0xC7BC, 0x7F8C, 0xC7BD, 0x5899,\t0xC7BE, 0x8537, 0xC7BF, 0x5F3A, 0xC7C0, 0x62A2, 0xC7C1, 0x6A47,\n\t0xC7C2, 0x9539, 0xC7C3, 0x6572, 0xC7C4, 0x6084, 0xC7C5, 0x6865,\t0xC7C6, 0x77A7, 0xC7C7, 0x4E54, 0xC7C8, 0x4FA8, 0xC7C9, 0x5DE7,\n\t0xC7CA, 0x9798, 0xC7CB, 0x64AC, 0xC7CC, 0x7FD8, 0xC7CD, 0x5CED,\t0xC7CE, 0x4FCF, 0xC7CF, 0x7A8D, 0xC7D0, 0x5207, 0xC7D1, 0x8304,\n\t0xC7D2, 0x4E14, 0xC7D3, 0x602F, 0xC7D4, 0x7A83, 0xC7D5, 0x94A6,\t0xC7D6, 0x4FB5, 0xC7D7, 0x4EB2, 0xC7D8, 0x79E6, 0xC7D9, 0x7434,\n\t0xC7DA, 0x52E4, 0xC7DB, 0x82B9, 0xC7DC, 0x64D2, 0xC7DD, 0x79BD,\t0xC7DE, 0x5BDD, 0xC7DF, 0x6C81, 0xC7E0, 0x9752, 0xC7E1, 0x8F7B,\n\t0xC7E2, 0x6C22, 0xC7E3, 0x503E, 0xC7E4, 0x537F, 0xC7E5, 0x6E05,\t0xC7E6, 0x64CE, 0xC7E7, 0x6674, 0xC7E8, 0x6C30, 0xC7E9, 0x60C5,\n\t0xC7EA, 0x9877, 0xC7EB, 0x8BF7, 0xC7EC, 0x5E86, 0xC7ED, 0x743C,\t0xC7EE, 0x7A77, 0xC7EF, 0x79CB, 0xC7F0, 0x4E18, 0xC7F1, 0x90B1,\n\t0xC7F2, 0x7403, 0xC7F3, 0x6C42, 0xC7F4, 0x56DA, 0xC7F5, 0x914B,\t0xC7F6, 0x6CC5, 0xC7F7, 0x8D8B, 0xC7F8, 0x533A, 0xC7F9, 0x86C6,\n\t0xC7FA, 0x66F2, 0xC7FB, 0x8EAF, 0xC7FC, 0x5C48, 0xC7FD, 0x9A71,\t0xC7FE, 0x6E20, 0xC840, 0x83EE, 0xC841, 0x83EF, 0xC842, 0x83F3,\n\t0xC843, 0x83F4, 0xC844, 0x83F5, 0xC845, 0x83F6, 0xC846, 0x83F7,\t0xC847, 0x83FA, 0xC848, 0x83FB, 0xC849, 0x83FC, 0xC84A, 0x83FE,\n\t0xC84B, 0x83FF, 0xC84C, 0x8400, 0xC84D, 0x8402, 0xC84E, 0x8405,\t0xC84F, 0x8407, 0xC850, 0x8408, 0xC851, 0x8409, 0xC852, 0x840A,\n\t0xC853, 0x8410, 0xC854, 0x8412, 0xC855, 0x8413, 0xC856, 0x8414,\t0xC857, 0x8415, 0xC858, 0x8416, 0xC859, 0x8417, 0xC85A, 0x8419,\n\t0xC85B, 0x841A, 0xC85C, 0x841B, 0xC85D, 0x841E, 0xC85E, 0x841F,\t0xC85F, 0x8420, 0xC860, 0x8421, 0xC861, 0x8422, 0xC862, 0x8423,\n\t0xC863, 0x8429, 0xC864, 0x842A, 0xC865, 0x842B, 0xC866, 0x842C,\t0xC867, 0x842D, 0xC868, 0x842E, 0xC869, 0x842F, 0xC86A, 0x8430,\n\t0xC86B, 0x8432, 0xC86C, 0x8433, 0xC86D, 0x8434, 0xC86E, 0x8435,\t0xC86F, 0x8436, 0xC870, 0x8437, 0xC871, 0x8439, 0xC872, 0x843A,\n\t0xC873, 0x843B, 0xC874, 0x843E, 0xC875, 0x843F, 0xC876, 0x8440,\t0xC877, 0x8441, 0xC878, 0x8442, 0xC879, 0x8443, 0xC87A, 0x8444,\n\t0xC87B, 0x8445, 0xC87C, 0x8447, 0xC87D, 0x8448, 0xC87E, 0x8449,\t0xC880, 0x844A, 0xC881, 0x844B, 0xC882, 0x844C, 0xC883, 0x844D,\n\t0xC884, 0x844E, 0xC885, 0x844F, 0xC886, 0x8450, 0xC887, 0x8452,\t0xC888, 0x8453, 0xC889, 0x8454, 0xC88A, 0x8455, 0xC88B, 0x8456,\n\t0xC88C, 0x8458, 0xC88D, 0x845D, 0xC88E, 0x845E, 0xC88F, 0x845F,\t0xC890, 0x8460, 0xC891, 0x8462, 0xC892, 0x8464, 0xC893, 0x8465,\n\t0xC894, 0x8466, 0xC895, 0x8467, 0xC896, 0x8468, 0xC897, 0x846A,\t0xC898, 0x846E, 0xC899, 0x846F, 0xC89A, 0x8470, 0xC89B, 0x8472,\n\t0xC89C, 0x8474, 0xC89D, 0x8477, 0xC89E, 0x8479, 0xC89F, 0x847B,\t0xC8A0, 0x847C, 0xC8A1, 0x53D6, 0xC8A2, 0x5A36, 0xC8A3, 0x9F8B,\n\t0xC8A4, 0x8DA3, 0xC8A5, 0x53BB, 0xC8A6, 0x5708, 0xC8A7, 0x98A7,\t0xC8A8, 0x6743, 0xC8A9, 0x919B, 0xC8AA, 0x6CC9, 0xC8AB, 0x5168,\n\t0xC8AC, 0x75CA, 0xC8AD, 0x62F3, 0xC8AE, 0x72AC, 0xC8AF, 0x5238,\t0xC8B0, 0x529D, 0xC8B1, 0x7F3A, 0xC8B2, 0x7094, 0xC8B3, 0x7638,\n\t0xC8B4, 0x5374, 0xC8B5, 0x9E4A, 0xC8B6, 0x69B7, 0xC8B7, 0x786E,\t0xC8B8, 0x96C0, 0xC8B9, 0x88D9, 0xC8BA, 0x7FA4, 0xC8BB, 0x7136,\n\t0xC8BC, 0x71C3, 0xC8BD, 0x5189, 0xC8BE, 0x67D3, 0xC8BF, 0x74E4,\t0xC8C0, 0x58E4, 0xC8C1, 0x6518, 0xC8C2, 0x56B7, 0xC8C3, 0x8BA9,\n\t0xC8C4, 0x9976, 0xC8C5, 0x6270, 0xC8C6, 0x7ED5, 0xC8C7, 0x60F9,\t0xC8C8, 0x70ED, 0xC8C9, 0x58EC, 0xC8CA, 0x4EC1, 0xC8CB, 0x4EBA,\n\t0xC8CC, 0x5FCD, 0xC8CD, 0x97E7, 0xC8CE, 0x4EFB, 0xC8CF, 0x8BA4,\t0xC8D0, 0x5203, 0xC8D1, 0x598A, 0xC8D2, 0x7EAB, 0xC8D3, 0x6254,\n\t0xC8D4, 0x4ECD, 0xC8D5, 0x65E5, 0xC8D6, 0x620E, 0xC8D7, 0x8338,\t0xC8D8, 0x84C9, 0xC8D9, 0x8363, 0xC8DA, 0x878D, 0xC8DB, 0x7194,\n\t0xC8DC, 0x6EB6, 0xC8DD, 0x5BB9, 0xC8DE, 0x7ED2, 0xC8DF, 0x5197,\t0xC8E0, 0x63C9, 0xC8E1, 0x67D4, 0xC8E2, 0x8089, 0xC8E3, 0x8339,\n\t0xC8E4, 0x8815, 0xC8E5, 0x5112, 0xC8E6, 0x5B7A, 0xC8E7, 0x5982,\t0xC8E8, 0x8FB1, 0xC8E9, 0x4E73, 0xC8EA, 0x6C5D, 0xC8EB, 0x5165,\n\t0xC8EC, 0x8925, 0xC8ED, 0x8F6F, 0xC8EE, 0x962E, 0xC8EF, 0x854A,\t0xC8F0, 0x745E, 0xC8F1, 0x9510, 0xC8F2, 0x95F0, 0xC8F3, 0x6DA6,\n\t0xC8F4, 0x82E5, 0xC8F5, 0x5F31, 0xC8F6, 0x6492, 0xC8F7, 0x6D12,\t0xC8F8, 0x8428, 0xC8F9, 0x816E, 0xC8FA, 0x9CC3, 0xC8FB, 0x585E,\n\t0xC8FC, 0x8D5B, 0xC8FD, 0x4E09, 0xC8FE, 0x53C1, 0xC940, 0x847D,\t0xC941, 0x847E, 0xC942, 0x847F, 0xC943, 0x8480, 0xC944, 0x8481,\n\t0xC945, 0x8483, 0xC946, 0x8484, 0xC947, 0x8485, 0xC948, 0x8486,\t0xC949, 0x848A, 0xC94A, 0x848D, 0xC94B, 0x848F, 0xC94C, 0x8490,\n\t0xC94D, 0x8491, 0xC94E, 0x8492, 0xC94F, 0x8493, 0xC950, 0x8494,\t0xC951, 0x8495, 0xC952, 0x8496, 0xC953, 0x8498, 0xC954, 0x849A,\n\t0xC955, 0x849B, 0xC956, 0x849D, 0xC957, 0x849E, 0xC958, 0x849F,\t0xC959, 0x84A0, 0xC95A, 0x84A2, 0xC95B, 0x84A3, 0xC95C, 0x84A4,\n\t0xC95D, 0x84A5, 0xC95E, 0x84A6, 0xC95F, 0x84A7, 0xC960, 0x84A8,\t0xC961, 0x84A9, 0xC962, 0x84AA, 0xC963, 0x84AB, 0xC964, 0x84AC,\n\t0xC965, 0x84AD, 0xC966, 0x84AE, 0xC967, 0x84B0, 0xC968, 0x84B1,\t0xC969, 0x84B3, 0xC96A, 0x84B5, 0xC96B, 0x84B6, 0xC96C, 0x84B7,\n\t0xC96D, 0x84BB, 0xC96E, 0x84BC, 0xC96F, 0x84BE, 0xC970, 0x84C0,\t0xC971, 0x84C2, 0xC972, 0x84C3, 0xC973, 0x84C5, 0xC974, 0x84C6,\n\t0xC975, 0x84C7, 0xC976, 0x84C8, 0xC977, 0x84CB, 0xC978, 0x84CC,\t0xC979, 0x84CE, 0xC97A, 0x84CF, 0xC97B, 0x84D2, 0xC97C, 0x84D4,\n\t0xC97D, 0x84D5, 0xC97E, 0x84D7, 0xC980, 0x84D8, 0xC981, 0x84D9,\t0xC982, 0x84DA, 0xC983, 0x84DB, 0xC984, 0x84DC, 0xC985, 0x84DE,\n\t0xC986, 0x84E1, 0xC987, 0x84E2, 0xC988, 0x84E4, 0xC989, 0x84E7,\t0xC98A, 0x84E8, 0xC98B, 0x84E9, 0xC98C, 0x84EA, 0xC98D, 0x84EB,\n\t0xC98E, 0x84ED, 0xC98F, 0x84EE, 0xC990, 0x84EF, 0xC991, 0x84F1,\t0xC992, 0x84F2, 0xC993, 0x84F3, 0xC994, 0x84F4, 0xC995, 0x84F5,\n\t0xC996, 0x84F6, 0xC997, 0x84F7, 0xC998, 0x84F8, 0xC999, 0x84F9,\t0xC99A, 0x84FA, 0xC99B, 0x84FB, 0xC99C, 0x84FD, 0xC99D, 0x84FE,\n\t0xC99E, 0x8500, 0xC99F, 0x8501, 0xC9A0, 0x8502, 0xC9A1, 0x4F1E,\t0xC9A2, 0x6563, 0xC9A3, 0x6851, 0xC9A4, 0x55D3, 0xC9A5, 0x4E27,\n\t0xC9A6, 0x6414, 0xC9A7, 0x9A9A, 0xC9A8, 0x626B, 0xC9A9, 0x5AC2,\t0xC9AA, 0x745F, 0xC9AB, 0x8272, 0xC9AC, 0x6DA9, 0xC9AD, 0x68EE,\n\t0xC9AE, 0x50E7, 0xC9AF, 0x838E, 0xC9B0, 0x7802, 0xC9B1, 0x6740,\t0xC9B2, 0x5239, 0xC9B3, 0x6C99, 0xC9B4, 0x7EB1, 0xC9B5, 0x50BB,\n\t0xC9B6, 0x5565, 0xC9B7, 0x715E, 0xC9B8, 0x7B5B, 0xC9B9, 0x6652,\t0xC9BA, 0x73CA, 0xC9BB, 0x82EB, 0xC9BC, 0x6749, 0xC9BD, 0x5C71,\n\t0xC9BE, 0x5220, 0xC9BF, 0x717D, 0xC9C0, 0x886B, 0xC9C1, 0x95EA,\t0xC9C2, 0x9655, 0xC9C3, 0x64C5, 0xC9C4, 0x8D61, 0xC9C5, 0x81B3,\n\t0xC9C6, 0x5584, 0xC9C7, 0x6C55, 0xC9C8, 0x6247, 0xC9C9, 0x7F2E,\t0xC9CA, 0x5892, 0xC9CB, 0x4F24, 0xC9CC, 0x5546, 0xC9CD, 0x8D4F,\n\t0xC9CE, 0x664C, 0xC9CF, 0x4E0A, 0xC9D0, 0x5C1A, 0xC9D1, 0x88F3,\t0xC9D2, 0x68A2, 0xC9D3, 0x634E, 0xC9D4, 0x7A0D, 0xC9D5, 0x70E7,\n\t0xC9D6, 0x828D, 0xC9D7, 0x52FA, 0xC9D8, 0x97F6, 0xC9D9, 0x5C11,\t0xC9DA, 0x54E8, 0xC9DB, 0x90B5, 0xC9DC, 0x7ECD, 0xC9DD, 0x5962,\n\t0xC9DE, 0x8D4A, 0xC9DF, 0x86C7, 0xC9E0, 0x820C, 0xC9E1, 0x820D,\t0xC9E2, 0x8D66, 0xC9E3, 0x6444, 0xC9E4, 0x5C04, 0xC9E5, 0x6151,\n\t0xC9E6, 0x6D89, 0xC9E7, 0x793E, 0xC9E8, 0x8BBE, 0xC9E9, 0x7837,\t0xC9EA, 0x7533, 0xC9EB, 0x547B, 0xC9EC, 0x4F38, 0xC9ED, 0x8EAB,\n\t0xC9EE, 0x6DF1, 0xC9EF, 0x5A20, 0xC9F0, 0x7EC5, 0xC9F1, 0x795E,\t0xC9F2, 0x6C88, 0xC9F3, 0x5BA1, 0xC9F4, 0x5A76, 0xC9F5, 0x751A,\n\t0xC9F6, 0x80BE, 0xC9F7, 0x614E, 0xC9F8, 0x6E17, 0xC9F9, 0x58F0,\t0xC9FA, 0x751F, 0xC9FB, 0x7525, 0xC9FC, 0x7272, 0xC9FD, 0x5347,\n\t0xC9FE, 0x7EF3, 0xCA40, 0x8503, 0xCA41, 0x8504, 0xCA42, 0x8505,\t0xCA43, 0x8506, 0xCA44, 0x8507, 0xCA45, 0x8508, 0xCA46, 0x8509,\n\t0xCA47, 0x850A, 0xCA48, 0x850B, 0xCA49, 0x850D, 0xCA4A, 0x850E,\t0xCA4B, 0x850F, 0xCA4C, 0x8510, 0xCA4D, 0x8512, 0xCA4E, 0x8514,\n\t0xCA4F, 0x8515, 0xCA50, 0x8516, 0xCA51, 0x8518, 0xCA52, 0x8519,\t0xCA53, 0x851B, 0xCA54, 0x851C, 0xCA55, 0x851D, 0xCA56, 0x851E,\n\t0xCA57, 0x8520, 0xCA58, 0x8522, 0xCA59, 0x8523, 0xCA5A, 0x8524,\t0xCA5B, 0x8525, 0xCA5C, 0x8526, 0xCA5D, 0x8527, 0xCA5E, 0x8528,\n\t0xCA5F, 0x8529, 0xCA60, 0x852A, 0xCA61, 0x852D, 0xCA62, 0x852E,\t0xCA63, 0x852F, 0xCA64, 0x8530, 0xCA65, 0x8531, 0xCA66, 0x8532,\n\t0xCA67, 0x8533, 0xCA68, 0x8534, 0xCA69, 0x8535, 0xCA6A, 0x8536,\t0xCA6B, 0x853E, 0xCA6C, 0x853F, 0xCA6D, 0x8540, 0xCA6E, 0x8541,\n\t0xCA6F, 0x8542, 0xCA70, 0x8544, 0xCA71, 0x8545, 0xCA72, 0x8546,\t0xCA73, 0x8547, 0xCA74, 0x854B, 0xCA75, 0x854C, 0xCA76, 0x854D,\n\t0xCA77, 0x854E, 0xCA78, 0x854F, 0xCA79, 0x8550, 0xCA7A, 0x8551,\t0xCA7B, 0x8552, 0xCA7C, 0x8553, 0xCA7D, 0x8554, 0xCA7E, 0x8555,\n\t0xCA80, 0x8557, 0xCA81, 0x8558, 0xCA82, 0x855A, 0xCA83, 0x855B,\t0xCA84, 0x855C, 0xCA85, 0x855D, 0xCA86, 0x855F, 0xCA87, 0x8560,\n\t0xCA88, 0x8561, 0xCA89, 0x8562, 0xCA8A, 0x8563, 0xCA8B, 0x8565,\t0xCA8C, 0x8566, 0xCA8D, 0x8567, 0xCA8E, 0x8569, 0xCA8F, 0x856A,\n\t0xCA90, 0x856B, 0xCA91, 0x856C, 0xCA92, 0x856D, 0xCA93, 0x856E,\t0xCA94, 0x856F, 0xCA95, 0x8570, 0xCA96, 0x8571, 0xCA97, 0x8573,\n\t0xCA98, 0x8575, 0xCA99, 0x8576, 0xCA9A, 0x8577, 0xCA9B, 0x8578,\t0xCA9C, 0x857C, 0xCA9D, 0x857D, 0xCA9E, 0x857F, 0xCA9F, 0x8580,\n\t0xCAA0, 0x8581, 0xCAA1, 0x7701, 0xCAA2, 0x76DB, 0xCAA3, 0x5269,\t0xCAA4, 0x80DC, 0xCAA5, 0x5723, 0xCAA6, 0x5E08, 0xCAA7, 0x5931,\n\t0xCAA8, 0x72EE, 0xCAA9, 0x65BD, 0xCAAA, 0x6E7F, 0xCAAB, 0x8BD7,\t0xCAAC, 0x5C38, 0xCAAD, 0x8671, 0xCAAE, 0x5341, 0xCAAF, 0x77F3,\n\t0xCAB0, 0x62FE, 0xCAB1, 0x65F6, 0xCAB2, 0x4EC0, 0xCAB3, 0x98DF,\t0xCAB4, 0x8680, 0xCAB5, 0x5B9E, 0xCAB6, 0x8BC6, 0xCAB7, 0x53F2,\n\t0xCAB8, 0x77E2, 0xCAB9, 0x4F7F, 0xCABA, 0x5C4E, 0xCABB, 0x9A76,\t0xCABC, 0x59CB, 0xCABD, 0x5F0F, 0xCABE, 0x793A, 0xCABF, 0x58EB,\n\t0xCAC0, 0x4E16, 0xCAC1, 0x67FF, 0xCAC2, 0x4E8B, 0xCAC3, 0x62ED,\t0xCAC4, 0x8A93, 0xCAC5, 0x901D, 0xCAC6, 0x52BF, 0xCAC7, 0x662F,\n\t0xCAC8, 0x55DC, 0xCAC9, 0x566C, 0xCACA, 0x9002, 0xCACB, 0x4ED5,\t0xCACC, 0x4F8D, 0xCACD, 0x91CA, 0xCACE, 0x9970, 0xCACF, 0x6C0F,\n\t0xCAD0, 0x5E02, 0xCAD1, 0x6043, 0xCAD2, 0x5BA4, 0xCAD3, 0x89C6,\t0xCAD4, 0x8BD5, 0xCAD5, 0x6536, 0xCAD6, 0x624B, 0xCAD7, 0x9996,\n\t0xCAD8, 0x5B88, 0xCAD9, 0x5BFF, 0xCADA, 0x6388, 0xCADB, 0x552E,\t0xCADC, 0x53D7, 0xCADD, 0x7626, 0xCADE, 0x517D, 0xCADF, 0x852C,\n\t0xCAE0, 0x67A2, 0xCAE1, 0x68B3, 0xCAE2, 0x6B8A, 0xCAE3, 0x6292,\t0xCAE4, 0x8F93, 0xCAE5, 0x53D4, 0xCAE6, 0x8212, 0xCAE7, 0x6DD1,\n\t0xCAE8, 0x758F, 0xCAE9, 0x4E66, 0xCAEA, 0x8D4E, 0xCAEB, 0x5B70,\t0xCAEC, 0x719F, 0xCAED, 0x85AF, 0xCAEE, 0x6691, 0xCAEF, 0x66D9,\n\t0xCAF0, 0x7F72, 0xCAF1, 0x8700, 0xCAF2, 0x9ECD, 0xCAF3, 0x9F20,\t0xCAF4, 0x5C5E, 0xCAF5, 0x672F, 0xCAF6, 0x8FF0, 0xCAF7, 0x6811,\n\t0xCAF8, 0x675F, 0xCAF9, 0x620D, 0xCAFA, 0x7AD6, 0xCAFB, 0x5885,\t0xCAFC, 0x5EB6, 0xCAFD, 0x6570, 0xCAFE, 0x6F31, 0xCB40, 0x8582,\n\t0xCB41, 0x8583, 0xCB42, 0x8586, 0xCB43, 0x8588, 0xCB44, 0x8589,\t0xCB45, 0x858A, 0xCB46, 0x858B, 0xCB47, 0x858C, 0xCB48, 0x858D,\n\t0xCB49, 0x858E, 0xCB4A, 0x8590, 0xCB4B, 0x8591, 0xCB4C, 0x8592,\t0xCB4D, 0x8593, 0xCB4E, 0x8594, 0xCB4F, 0x8595, 0xCB50, 0x8596,\n\t0xCB51, 0x8597, 0xCB52, 0x8598, 0xCB53, 0x8599, 0xCB54, 0x859A,\t0xCB55, 0x859D, 0xCB56, 0x859E, 0xCB57, 0x859F, 0xCB58, 0x85A0,\n\t0xCB59, 0x85A1, 0xCB5A, 0x85A2, 0xCB5B, 0x85A3, 0xCB5C, 0x85A5,\t0xCB5D, 0x85A6, 0xCB5E, 0x85A7, 0xCB5F, 0x85A9, 0xCB60, 0x85AB,\n\t0xCB61, 0x85AC, 0xCB62, 0x85AD, 0xCB63, 0x85B1, 0xCB64, 0x85B2,\t0xCB65, 0x85B3, 0xCB66, 0x85B4, 0xCB67, 0x85B5, 0xCB68, 0x85B6,\n\t0xCB69, 0x85B8, 0xCB6A, 0x85BA, 0xCB6B, 0x85BB, 0xCB6C, 0x85BC,\t0xCB6D, 0x85BD, 0xCB6E, 0x85BE, 0xCB6F, 0x85BF, 0xCB70, 0x85C0,\n\t0xCB71, 0x85C2, 0xCB72, 0x85C3, 0xCB73, 0x85C4, 0xCB74, 0x85C5,\t0xCB75, 0x85C6, 0xCB76, 0x85C7, 0xCB77, 0x85C8, 0xCB78, 0x85CA,\n\t0xCB79, 0x85CB, 0xCB7A, 0x85CC, 0xCB7B, 0x85CD, 0xCB7C, 0x85CE,\t0xCB7D, 0x85D1, 0xCB7E, 0x85D2, 0xCB80, 0x85D4, 0xCB81, 0x85D6,\n\t0xCB82, 0x85D7, 0xCB83, 0x85D8, 0xCB84, 0x85D9, 0xCB85, 0x85DA,\t0xCB86, 0x85DB, 0xCB87, 0x85DD, 0xCB88, 0x85DE, 0xCB89, 0x85DF,\n\t0xCB8A, 0x85E0, 0xCB8B, 0x85E1, 0xCB8C, 0x85E2, 0xCB8D, 0x85E3,\t0xCB8E, 0x85E5, 0xCB8F, 0x85E6, 0xCB90, 0x85E7, 0xCB91, 0x85E8,\n\t0xCB92, 0x85EA, 0xCB93, 0x85EB, 0xCB94, 0x85EC, 0xCB95, 0x85ED,\t0xCB96, 0x85EE, 0xCB97, 0x85EF, 0xCB98, 0x85F0, 0xCB99, 0x85F1,\n\t0xCB9A, 0x85F2, 0xCB9B, 0x85F3, 0xCB9C, 0x85F4, 0xCB9D, 0x85F5,\t0xCB9E, 0x85F6, 0xCB9F, 0x85F7, 0xCBA0, 0x85F8, 0xCBA1, 0x6055,\n\t0xCBA2, 0x5237, 0xCBA3, 0x800D, 0xCBA4, 0x6454, 0xCBA5, 0x8870,\t0xCBA6, 0x7529, 0xCBA7, 0x5E05, 0xCBA8, 0x6813, 0xCBA9, 0x62F4,\n\t0xCBAA, 0x971C, 0xCBAB, 0x53CC, 0xCBAC, 0x723D, 0xCBAD, 0x8C01,\t0xCBAE, 0x6C34, 0xCBAF, 0x7761, 0xCBB0, 0x7A0E, 0xCBB1, 0x542E,\n\t0xCBB2, 0x77AC, 0xCBB3, 0x987A, 0xCBB4, 0x821C, 0xCBB5, 0x8BF4,\t0xCBB6, 0x7855, 0xCBB7, 0x6714, 0xCBB8, 0x70C1, 0xCBB9, 0x65AF,\n\t0xCBBA, 0x6495, 0xCBBB, 0x5636, 0xCBBC, 0x601D, 0xCBBD, 0x79C1,\t0xCBBE, 0x53F8, 0xCBBF, 0x4E1D, 0xCBC0, 0x6B7B, 0xCBC1, 0x8086,\n\t0xCBC2, 0x5BFA, 0xCBC3, 0x55E3, 0xCBC4, 0x56DB, 0xCBC5, 0x4F3A,\t0xCBC6, 0x4F3C, 0xCBC7, 0x9972, 0xCBC8, 0x5DF3, 0xCBC9, 0x677E,\n\t0xCBCA, 0x8038, 0xCBCB, 0x6002, 0xCBCC, 0x9882, 0xCBCD, 0x9001,\t0xCBCE, 0x5B8B, 0xCBCF, 0x8BBC, 0xCBD0, 0x8BF5, 0xCBD1, 0x641C,\n\t0xCBD2, 0x8258, 0xCBD3, 0x64DE, 0xCBD4, 0x55FD, 0xCBD5, 0x82CF,\t0xCBD6, 0x9165, 0xCBD7, 0x4FD7, 0xCBD8, 0x7D20, 0xCBD9, 0x901F,\n\t0xCBDA, 0x7C9F, 0xCBDB, 0x50F3, 0xCBDC, 0x5851, 0xCBDD, 0x6EAF,\t0xCBDE, 0x5BBF, 0xCBDF, 0x8BC9, 0xCBE0, 0x8083, 0xCBE1, 0x9178,\n\t0xCBE2, 0x849C, 0xCBE3, 0x7B97, 0xCBE4, 0x867D, 0xCBE5, 0x968B,\t0xCBE6, 0x968F, 0xCBE7, 0x7EE5, 0xCBE8, 0x9AD3, 0xCBE9, 0x788E,\n\t0xCBEA, 0x5C81, 0xCBEB, 0x7A57, 0xCBEC, 0x9042, 0xCBED, 0x96A7,\t0xCBEE, 0x795F, 0xCBEF, 0x5B59, 0xCBF0, 0x635F, 0xCBF1, 0x7B0B,\n\t0xCBF2, 0x84D1, 0xCBF3, 0x68AD, 0xCBF4, 0x5506, 0xCBF5, 0x7F29,\t0xCBF6, 0x7410, 0xCBF7, 0x7D22, 0xCBF8, 0x9501, 0xCBF9, 0x6240,\n\t0xCBFA, 0x584C, 0xCBFB, 0x4ED6, 0xCBFC, 0x5B83, 0xCBFD, 0x5979,\t0xCBFE, 0x5854, 0xCC40, 0x85F9, 0xCC41, 0x85FA, 0xCC42, 0x85FC,\n\t0xCC43, 0x85FD, 0xCC44, 0x85FE, 0xCC45, 0x8600, 0xCC46, 0x8601,\t0xCC47, 0x8602, 0xCC48, 0x8603, 0xCC49, 0x8604, 0xCC4A, 0x8606,\n\t0xCC4B, 0x8607, 0xCC4C, 0x8608, 0xCC4D, 0x8609, 0xCC4E, 0x860A,\t0xCC4F, 0x860B, 0xCC50, 0x860C, 0xCC51, 0x860D, 0xCC52, 0x860E,\n\t0xCC53, 0x860F, 0xCC54, 0x8610, 0xCC55, 0x8612, 0xCC56, 0x8613,\t0xCC57, 0x8614, 0xCC58, 0x8615, 0xCC59, 0x8617, 0xCC5A, 0x8618,\n\t0xCC5B, 0x8619, 0xCC5C, 0x861A, 0xCC5D, 0x861B, 0xCC5E, 0x861C,\t0xCC5F, 0x861D, 0xCC60, 0x861E, 0xCC61, 0x861F, 0xCC62, 0x8620,\n\t0xCC63, 0x8621, 0xCC64, 0x8622, 0xCC65, 0x8623, 0xCC66, 0x8624,\t0xCC67, 0x8625, 0xCC68, 0x8626, 0xCC69, 0x8628, 0xCC6A, 0x862A,\n\t0xCC6B, 0x862B, 0xCC6C, 0x862C, 0xCC6D, 0x862D, 0xCC6E, 0x862E,\t0xCC6F, 0x862F, 0xCC70, 0x8630, 0xCC71, 0x8631, 0xCC72, 0x8632,\n\t0xCC73, 0x8633, 0xCC74, 0x8634, 0xCC75, 0x8635, 0xCC76, 0x8636,\t0xCC77, 0x8637, 0xCC78, 0x8639, 0xCC79, 0x863A, 0xCC7A, 0x863B,\n\t0xCC7B, 0x863D, 0xCC7C, 0x863E, 0xCC7D, 0x863F, 0xCC7E, 0x8640,\t0xCC80, 0x8641, 0xCC81, 0x8642, 0xCC82, 0x8643, 0xCC83, 0x8644,\n\t0xCC84, 0x8645, 0xCC85, 0x8646, 0xCC86, 0x8647, 0xCC87, 0x8648,\t0xCC88, 0x8649, 0xCC89, 0x864A, 0xCC8A, 0x864B, 0xCC8B, 0x864C,\n\t0xCC8C, 0x8652, 0xCC8D, 0x8653, 0xCC8E, 0x8655, 0xCC8F, 0x8656,\t0xCC90, 0x8657, 0xCC91, 0x8658, 0xCC92, 0x8659, 0xCC93, 0x865B,\n\t0xCC94, 0x865C, 0xCC95, 0x865D, 0xCC96, 0x865F, 0xCC97, 0x8660,\t0xCC98, 0x8661, 0xCC99, 0x8663, 0xCC9A, 0x8664, 0xCC9B, 0x8665,\n\t0xCC9C, 0x8666, 0xCC9D, 0x8667, 0xCC9E, 0x8668, 0xCC9F, 0x8669,\t0xCCA0, 0x866A, 0xCCA1, 0x736D, 0xCCA2, 0x631E, 0xCCA3, 0x8E4B,\n\t0xCCA4, 0x8E0F, 0xCCA5, 0x80CE, 0xCCA6, 0x82D4, 0xCCA7, 0x62AC,\t0xCCA8, 0x53F0, 0xCCA9, 0x6CF0, 0xCCAA, 0x915E, 0xCCAB, 0x592A,\n\t0xCCAC, 0x6001, 0xCCAD, 0x6C70, 0xCCAE, 0x574D, 0xCCAF, 0x644A,\t0xCCB0, 0x8D2A, 0xCCB1, 0x762B, 0xCCB2, 0x6EE9, 0xCCB3, 0x575B,\n\t0xCCB4, 0x6A80, 0xCCB5, 0x75F0, 0xCCB6, 0x6F6D, 0xCCB7, 0x8C2D,\t0xCCB8, 0x8C08, 0xCCB9, 0x5766, 0xCCBA, 0x6BEF, 0xCCBB, 0x8892,\n\t0xCCBC, 0x78B3, 0xCCBD, 0x63A2, 0xCCBE, 0x53F9, 0xCCBF, 0x70AD,\t0xCCC0, 0x6C64, 0xCCC1, 0x5858, 0xCCC2, 0x642A, 0xCCC3, 0x5802,\n\t0xCCC4, 0x68E0, 0xCCC5, 0x819B, 0xCCC6, 0x5510, 0xCCC7, 0x7CD6,\t0xCCC8, 0x5018, 0xCCC9, 0x8EBA, 0xCCCA, 0x6DCC, 0xCCCB, 0x8D9F,\n\t0xCCCC, 0x70EB, 0xCCCD, 0x638F, 0xCCCE, 0x6D9B, 0xCCCF, 0x6ED4,\t0xCCD0, 0x7EE6, 0xCCD1, 0x8404, 0xCCD2, 0x6843, 0xCCD3, 0x9003,\n\t0xCCD4, 0x6DD8, 0xCCD5, 0x9676, 0xCCD6, 0x8BA8, 0xCCD7, 0x5957,\t0xCCD8, 0x7279, 0xCCD9, 0x85E4, 0xCCDA, 0x817E, 0xCCDB, 0x75BC,\n\t0xCCDC, 0x8A8A, 0xCCDD, 0x68AF, 0xCCDE, 0x5254, 0xCCDF, 0x8E22,\t0xCCE0, 0x9511, 0xCCE1, 0x63D0, 0xCCE2, 0x9898, 0xCCE3, 0x8E44,\n\t0xCCE4, 0x557C, 0xCCE5, 0x4F53, 0xCCE6, 0x66FF, 0xCCE7, 0x568F,\t0xCCE8, 0x60D5, 0xCCE9, 0x6D95, 0xCCEA, 0x5243, 0xCCEB, 0x5C49,\n\t0xCCEC, 0x5929, 0xCCED, 0x6DFB, 0xCCEE, 0x586B, 0xCCEF, 0x7530,\t0xCCF0, 0x751C, 0xCCF1, 0x606C, 0xCCF2, 0x8214, 0xCCF3, 0x8146,\n\t0xCCF4, 0x6311, 0xCCF5, 0x6761, 0xCCF6, 0x8FE2, 0xCCF7, 0x773A,\t0xCCF8, 0x8DF3, 0xCCF9, 0x8D34, 0xCCFA, 0x94C1, 0xCCFB, 0x5E16,\n\t0xCCFC, 0x5385, 0xCCFD, 0x542C, 0xCCFE, 0x70C3, 0xCD40, 0x866D,\t0xCD41, 0x866F, 0xCD42, 0x8670, 0xCD43, 0x8672, 0xCD44, 0x8673,\n\t0xCD45, 0x8674, 0xCD46, 0x8675, 0xCD47, 0x8676, 0xCD48, 0x8677,\t0xCD49, 0x8678, 0xCD4A, 0x8683, 0xCD4B, 0x8684, 0xCD4C, 0x8685,\n\t0xCD4D, 0x8686, 0xCD4E, 0x8687, 0xCD4F, 0x8688, 0xCD50, 0x8689,\t0xCD51, 0x868E, 0xCD52, 0x868F, 0xCD53, 0x8690, 0xCD54, 0x8691,\n\t0xCD55, 0x8692, 0xCD56, 0x8694, 0xCD57, 0x8696, 0xCD58, 0x8697,\t0xCD59, 0x8698, 0xCD5A, 0x8699, 0xCD5B, 0x869A, 0xCD5C, 0x869B,\n\t0xCD5D, 0x869E, 0xCD5E, 0x869F, 0xCD5F, 0x86A0, 0xCD60, 0x86A1,\t0xCD61, 0x86A2, 0xCD62, 0x86A5, 0xCD63, 0x86A6, 0xCD64, 0x86AB,\n\t0xCD65, 0x86AD, 0xCD66, 0x86AE, 0xCD67, 0x86B2, 0xCD68, 0x86B3,\t0xCD69, 0x86B7, 0xCD6A, 0x86B8, 0xCD6B, 0x86B9, 0xCD6C, 0x86BB,\n\t0xCD6D, 0x86BC, 0xCD6E, 0x86BD, 0xCD6F, 0x86BE, 0xCD70, 0x86BF,\t0xCD71, 0x86C1, 0xCD72, 0x86C2, 0xCD73, 0x86C3, 0xCD74, 0x86C5,\n\t0xCD75, 0x86C8, 0xCD76, 0x86CC, 0xCD77, 0x86CD, 0xCD78, 0x86D2,\t0xCD79, 0x86D3, 0xCD7A, 0x86D5, 0xCD7B, 0x86D6, 0xCD7C, 0x86D7,\n\t0xCD7D, 0x86DA, 0xCD7E, 0x86DC, 0xCD80, 0x86DD, 0xCD81, 0x86E0,\t0xCD82, 0x86E1, 0xCD83, 0x86E2, 0xCD84, 0x86E3, 0xCD85, 0x86E5,\n\t0xCD86, 0x86E6, 0xCD87, 0x86E7, 0xCD88, 0x86E8, 0xCD89, 0x86EA,\t0xCD8A, 0x86EB, 0xCD8B, 0x86EC, 0xCD8C, 0x86EF, 0xCD8D, 0x86F5,\n\t0xCD8E, 0x86F6, 0xCD8F, 0x86F7, 0xCD90, 0x86FA, 0xCD91, 0x86FB,\t0xCD92, 0x86FC, 0xCD93, 0x86FD, 0xCD94, 0x86FF, 0xCD95, 0x8701,\n\t0xCD96, 0x8704, 0xCD97, 0x8705, 0xCD98, 0x8706, 0xCD99, 0x870B,\t0xCD9A, 0x870C, 0xCD9B, 0x870E, 0xCD9C, 0x870F, 0xCD9D, 0x8710,\n\t0xCD9E, 0x8711, 0xCD9F, 0x8714, 0xCDA0, 0x8716, 0xCDA1, 0x6C40,\t0xCDA2, 0x5EF7, 0xCDA3, 0x505C, 0xCDA4, 0x4EAD, 0xCDA5, 0x5EAD,\n\t0xCDA6, 0x633A, 0xCDA7, 0x8247, 0xCDA8, 0x901A, 0xCDA9, 0x6850,\t0xCDAA, 0x916E, 0xCDAB, 0x77B3, 0xCDAC, 0x540C, 0xCDAD, 0x94DC,\n\t0xCDAE, 0x5F64, 0xCDAF, 0x7AE5, 0xCDB0, 0x6876, 0xCDB1, 0x6345,\t0xCDB2, 0x7B52, 0xCDB3, 0x7EDF, 0xCDB4, 0x75DB, 0xCDB5, 0x5077,\n\t0xCDB6, 0x6295, 0xCDB7, 0x5934, 0xCDB8, 0x900F, 0xCDB9, 0x51F8,\t0xCDBA, 0x79C3, 0xCDBB, 0x7A81, 0xCDBC, 0x56FE, 0xCDBD, 0x5F92,\n\t0xCDBE, 0x9014, 0xCDBF, 0x6D82, 0xCDC0, 0x5C60, 0xCDC1, 0x571F,\t0xCDC2, 0x5410, 0xCDC3, 0x5154, 0xCDC4, 0x6E4D, 0xCDC5, 0x56E2,\n\t0xCDC6, 0x63A8, 0xCDC7, 0x9893, 0xCDC8, 0x817F, 0xCDC9, 0x8715,\t0xCDCA, 0x892A, 0xCDCB, 0x9000, 0xCDCC, 0x541E, 0xCDCD, 0x5C6F,\n\t0xCDCE, 0x81C0, 0xCDCF, 0x62D6, 0xCDD0, 0x6258, 0xCDD1, 0x8131,\t0xCDD2, 0x9E35, 0xCDD3, 0x9640, 0xCDD4, 0x9A6E, 0xCDD5, 0x9A7C,\n\t0xCDD6, 0x692D, 0xCDD7, 0x59A5, 0xCDD8, 0x62D3, 0xCDD9, 0x553E,\t0xCDDA, 0x6316, 0xCDDB, 0x54C7, 0xCDDC, 0x86D9, 0xCDDD, 0x6D3C,\n\t0xCDDE, 0x5A03, 0xCDDF, 0x74E6, 0xCDE0, 0x889C, 0xCDE1, 0x6B6A,\t0xCDE2, 0x5916, 0xCDE3, 0x8C4C, 0xCDE4, 0x5F2F, 0xCDE5, 0x6E7E,\n\t0xCDE6, 0x73A9, 0xCDE7, 0x987D, 0xCDE8, 0x4E38, 0xCDE9, 0x70F7,\t0xCDEA, 0x5B8C, 0xCDEB, 0x7897, 0xCDEC, 0x633D, 0xCDED, 0x665A,\n\t0xCDEE, 0x7696, 0xCDEF, 0x60CB, 0xCDF0, 0x5B9B, 0xCDF1, 0x5A49,\t0xCDF2, 0x4E07, 0xCDF3, 0x8155, 0xCDF4, 0x6C6A, 0xCDF5, 0x738B,\n\t0xCDF6, 0x4EA1, 0xCDF7, 0x6789, 0xCDF8, 0x7F51, 0xCDF9, 0x5F80,\t0xCDFA, 0x65FA, 0xCDFB, 0x671B, 0xCDFC, 0x5FD8, 0xCDFD, 0x5984,\n\t0xCDFE, 0x5A01, 0xCE40, 0x8719, 0xCE41, 0x871B, 0xCE42, 0x871D,\t0xCE43, 0x871F, 0xCE44, 0x8720, 0xCE45, 0x8724, 0xCE46, 0x8726,\n\t0xCE47, 0x8727, 0xCE48, 0x8728, 0xCE49, 0x872A, 0xCE4A, 0x872B,\t0xCE4B, 0x872C, 0xCE4C, 0x872D, 0xCE4D, 0x872F, 0xCE4E, 0x8730,\n\t0xCE4F, 0x8732, 0xCE50, 0x8733, 0xCE51, 0x8735, 0xCE52, 0x8736,\t0xCE53, 0x8738, 0xCE54, 0x8739, 0xCE55, 0x873A, 0xCE56, 0x873C,\n\t0xCE57, 0x873D, 0xCE58, 0x8740, 0xCE59, 0x8741, 0xCE5A, 0x8742,\t0xCE5B, 0x8743, 0xCE5C, 0x8744, 0xCE5D, 0x8745, 0xCE5E, 0x8746,\n\t0xCE5F, 0x874A, 0xCE60, 0x874B, 0xCE61, 0x874D, 0xCE62, 0x874F,\t0xCE63, 0x8750, 0xCE64, 0x8751, 0xCE65, 0x8752, 0xCE66, 0x8754,\n\t0xCE67, 0x8755, 0xCE68, 0x8756, 0xCE69, 0x8758, 0xCE6A, 0x875A,\t0xCE6B, 0x875B, 0xCE6C, 0x875C, 0xCE6D, 0x875D, 0xCE6E, 0x875E,\n\t0xCE6F, 0x875F, 0xCE70, 0x8761, 0xCE71, 0x8762, 0xCE72, 0x8766,\t0xCE73, 0x8767, 0xCE74, 0x8768, 0xCE75, 0x8769, 0xCE76, 0x876A,\n\t0xCE77, 0x876B, 0xCE78, 0x876C, 0xCE79, 0x876D, 0xCE7A, 0x876F,\t0xCE7B, 0x8771, 0xCE7C, 0x8772, 0xCE7D, 0x8773, 0xCE7E, 0x8775,\n\t0xCE80, 0x8777, 0xCE81, 0x8778, 0xCE82, 0x8779, 0xCE83, 0x877A,\t0xCE84, 0x877F, 0xCE85, 0x8780, 0xCE86, 0x8781, 0xCE87, 0x8784,\n\t0xCE88, 0x8786, 0xCE89, 0x8787, 0xCE8A, 0x8789, 0xCE8B, 0x878A,\t0xCE8C, 0x878C, 0xCE8D, 0x878E, 0xCE8E, 0x878F, 0xCE8F, 0x8790,\n\t0xCE90, 0x8791, 0xCE91, 0x8792, 0xCE92, 0x8794, 0xCE93, 0x8795,\t0xCE94, 0x8796, 0xCE95, 0x8798, 0xCE96, 0x8799, 0xCE97, 0x879A,\n\t0xCE98, 0x879B, 0xCE99, 0x879C, 0xCE9A, 0x879D, 0xCE9B, 0x879E,\t0xCE9C, 0x87A0, 0xCE9D, 0x87A1, 0xCE9E, 0x87A2, 0xCE9F, 0x87A3,\n\t0xCEA0, 0x87A4, 0xCEA1, 0x5DCD, 0xCEA2, 0x5FAE, 0xCEA3, 0x5371,\t0xCEA4, 0x97E6, 0xCEA5, 0x8FDD, 0xCEA6, 0x6845, 0xCEA7, 0x56F4,\n\t0xCEA8, 0x552F, 0xCEA9, 0x60DF, 0xCEAA, 0x4E3A, 0xCEAB, 0x6F4D,\t0xCEAC, 0x7EF4, 0xCEAD, 0x82C7, 0xCEAE, 0x840E, 0xCEAF, 0x59D4,\n\t0xCEB0, 0x4F1F, 0xCEB1, 0x4F2A, 0xCEB2, 0x5C3E, 0xCEB3, 0x7EAC,\t0xCEB4, 0x672A, 0xCEB5, 0x851A, 0xCEB6, 0x5473, 0xCEB7, 0x754F,\n\t0xCEB8, 0x80C3, 0xCEB9, 0x5582, 0xCEBA, 0x9B4F, 0xCEBB, 0x4F4D,\t0xCEBC, 0x6E2D, 0xCEBD, 0x8C13, 0xCEBE, 0x5C09, 0xCEBF, 0x6170,\n\t0xCEC0, 0x536B, 0xCEC1, 0x761F, 0xCEC2, 0x6E29, 0xCEC3, 0x868A,\t0xCEC4, 0x6587, 0xCEC5, 0x95FB, 0xCEC6, 0x7EB9, 0xCEC7, 0x543B,\n\t0xCEC8, 0x7A33, 0xCEC9, 0x7D0A, 0xCECA, 0x95EE, 0xCECB, 0x55E1,\t0xCECC, 0x7FC1, 0xCECD, 0x74EE, 0xCECE, 0x631D, 0xCECF, 0x8717,\n\t0xCED0, 0x6DA1, 0xCED1, 0x7A9D, 0xCED2, 0x6211, 0xCED3, 0x65A1,\t0xCED4, 0x5367, 0xCED5, 0x63E1, 0xCED6, 0x6C83, 0xCED7, 0x5DEB,\n\t0xCED8, 0x545C, 0xCED9, 0x94A8, 0xCEDA, 0x4E4C, 0xCEDB, 0x6C61,\t0xCEDC, 0x8BEC, 0xCEDD, 0x5C4B, 0xCEDE, 0x65E0, 0xCEDF, 0x829C,\n\t0xCEE0, 0x68A7, 0xCEE1, 0x543E, 0xCEE2, 0x5434, 0xCEE3, 0x6BCB,\t0xCEE4, 0x6B66, 0xCEE5, 0x4E94, 0xCEE6, 0x6342, 0xCEE7, 0x5348,\n\t0xCEE8, 0x821E, 0xCEE9, 0x4F0D, 0xCEEA, 0x4FAE, 0xCEEB, 0x575E,\t0xCEEC, 0x620A, 0xCEED, 0x96FE, 0xCEEE, 0x6664, 0xCEEF, 0x7269,\n\t0xCEF0, 0x52FF, 0xCEF1, 0x52A1, 0xCEF2, 0x609F, 0xCEF3, 0x8BEF,\t0xCEF4, 0x6614, 0xCEF5, 0x7199, 0xCEF6, 0x6790, 0xCEF7, 0x897F,\n\t0xCEF8, 0x7852, 0xCEF9, 0x77FD, 0xCEFA, 0x6670, 0xCEFB, 0x563B,\t0xCEFC, 0x5438, 0xCEFD, 0x9521, 0xCEFE, 0x727A, 0xCF40, 0x87A5,\n\t0xCF41, 0x87A6, 0xCF42, 0x87A7, 0xCF43, 0x87A9, 0xCF44, 0x87AA,\t0xCF45, 0x87AE, 0xCF46, 0x87B0, 0xCF47, 0x87B1, 0xCF48, 0x87B2,\n\t0xCF49, 0x87B4, 0xCF4A, 0x87B6, 0xCF4B, 0x87B7, 0xCF4C, 0x87B8,\t0xCF4D, 0x87B9, 0xCF4E, 0x87BB, 0xCF4F, 0x87BC, 0xCF50, 0x87BE,\n\t0xCF51, 0x87BF, 0xCF52, 0x87C1, 0xCF53, 0x87C2, 0xCF54, 0x87C3,\t0xCF55, 0x87C4, 0xCF56, 0x87C5, 0xCF57, 0x87C7, 0xCF58, 0x87C8,\n\t0xCF59, 0x87C9, 0xCF5A, 0x87CC, 0xCF5B, 0x87CD, 0xCF5C, 0x87CE,\t0xCF5D, 0x87CF, 0xCF5E, 0x87D0, 0xCF5F, 0x87D4, 0xCF60, 0x87D5,\n\t0xCF61, 0x87D6, 0xCF62, 0x87D7, 0xCF63, 0x87D8, 0xCF64, 0x87D9,\t0xCF65, 0x87DA, 0xCF66, 0x87DC, 0xCF67, 0x87DD, 0xCF68, 0x87DE,\n\t0xCF69, 0x87DF, 0xCF6A, 0x87E1, 0xCF6B, 0x87E2, 0xCF6C, 0x87E3,\t0xCF6D, 0x87E4, 0xCF6E, 0x87E6, 0xCF6F, 0x87E7, 0xCF70, 0x87E8,\n\t0xCF71, 0x87E9, 0xCF72, 0x87EB, 0xCF73, 0x87EC, 0xCF74, 0x87ED,\t0xCF75, 0x87EF, 0xCF76, 0x87F0, 0xCF77, 0x87F1, 0xCF78, 0x87F2,\n\t0xCF79, 0x87F3, 0xCF7A, 0x87F4, 0xCF7B, 0x87F5, 0xCF7C, 0x87F6,\t0xCF7D, 0x87F7, 0xCF7E, 0x87F8, 0xCF80, 0x87FA, 0xCF81, 0x87FB,\n\t0xCF82, 0x87FC, 0xCF83, 0x87FD, 0xCF84, 0x87FF, 0xCF85, 0x8800,\t0xCF86, 0x8801, 0xCF87, 0x8802, 0xCF88, 0x8804, 0xCF89, 0x8805,\n\t0xCF8A, 0x8806, 0xCF8B, 0x8807, 0xCF8C, 0x8808, 0xCF8D, 0x8809,\t0xCF8E, 0x880B, 0xCF8F, 0x880C, 0xCF90, 0x880D, 0xCF91, 0x880E,\n\t0xCF92, 0x880F, 0xCF93, 0x8810, 0xCF94, 0x8811, 0xCF95, 0x8812,\t0xCF96, 0x8814, 0xCF97, 0x8817, 0xCF98, 0x8818, 0xCF99, 0x8819,\n\t0xCF9A, 0x881A, 0xCF9B, 0x881C, 0xCF9C, 0x881D, 0xCF9D, 0x881E,\t0xCF9E, 0x881F, 0xCF9F, 0x8820, 0xCFA0, 0x8823, 0xCFA1, 0x7A00,\n\t0xCFA2, 0x606F, 0xCFA3, 0x5E0C, 0xCFA4, 0x6089, 0xCFA5, 0x819D,\t0xCFA6, 0x5915, 0xCFA7, 0x60DC, 0xCFA8, 0x7184, 0xCFA9, 0x70EF,\n\t0xCFAA, 0x6EAA, 0xCFAB, 0x6C50, 0xCFAC, 0x7280, 0xCFAD, 0x6A84,\t0xCFAE, 0x88AD, 0xCFAF, 0x5E2D, 0xCFB0, 0x4E60, 0xCFB1, 0x5AB3,\n\t0xCFB2, 0x559C, 0xCFB3, 0x94E3, 0xCFB4, 0x6D17, 0xCFB5, 0x7CFB,\t0xCFB6, 0x9699, 0xCFB7, 0x620F, 0xCFB8, 0x7EC6, 0xCFB9, 0x778E,\n\t0xCFBA, 0x867E, 0xCFBB, 0x5323, 0xCFBC, 0x971E, 0xCFBD, 0x8F96,\t0xCFBE, 0x6687, 0xCFBF, 0x5CE1, 0xCFC0, 0x4FA0, 0xCFC1, 0x72ED,\n\t0xCFC2, 0x4E0B, 0xCFC3, 0x53A6, 0xCFC4, 0x590F, 0xCFC5, 0x5413,\t0xCFC6, 0x6380, 0xCFC7, 0x9528, 0xCFC8, 0x5148, 0xCFC9, 0x4ED9,\n\t0xCFCA, 0x9C9C, 0xCFCB, 0x7EA4, 0xCFCC, 0x54B8, 0xCFCD, 0x8D24,\t0xCFCE, 0x8854, 0xCFCF, 0x8237, 0xCFD0, 0x95F2, 0xCFD1, 0x6D8E,\n\t0xCFD2, 0x5F26, 0xCFD3, 0x5ACC, 0xCFD4, 0x663E, 0xCFD5, 0x9669,\t0xCFD6, 0x73B0, 0xCFD7, 0x732E, 0xCFD8, 0x53BF, 0xCFD9, 0x817A,\n\t0xCFDA, 0x9985, 0xCFDB, 0x7FA1, 0xCFDC, 0x5BAA, 0xCFDD, 0x9677,\t0xCFDE, 0x9650, 0xCFDF, 0x7EBF, 0xCFE0, 0x76F8, 0xCFE1, 0x53A2,\n\t0xCFE2, 0x9576, 0xCFE3, 0x9999, 0xCFE4, 0x7BB1, 0xCFE5, 0x8944,\t0xCFE6, 0x6E58, 0xCFE7, 0x4E61, 0xCFE8, 0x7FD4, 0xCFE9, 0x7965,\n\t0xCFEA, 0x8BE6, 0xCFEB, 0x60F3, 0xCFEC, 0x54CD, 0xCFED, 0x4EAB,\t0xCFEE, 0x9879, 0xCFEF, 0x5DF7, 0xCFF0, 0x6A61, 0xCFF1, 0x50CF,\n\t0xCFF2, 0x5411, 0xCFF3, 0x8C61, 0xCFF4, 0x8427, 0xCFF5, 0x785D,\t0xCFF6, 0x9704, 0xCFF7, 0x524A, 0xCFF8, 0x54EE, 0xCFF9, 0x56A3,\n\t0xCFFA, 0x9500, 0xCFFB, 0x6D88, 0xCFFC, 0x5BB5, 0xCFFD, 0x6DC6,\t0xCFFE, 0x6653, 0xD040, 0x8824, 0xD041, 0x8825, 0xD042, 0x8826,\n\t0xD043, 0x8827, 0xD044, 0x8828, 0xD045, 0x8829, 0xD046, 0x882A,\t0xD047, 0x882B, 0xD048, 0x882C, 0xD049, 0x882D, 0xD04A, 0x882E,\n\t0xD04B, 0x882F, 0xD04C, 0x8830, 0xD04D, 0x8831, 0xD04E, 0x8833,\t0xD04F, 0x8834, 0xD050, 0x8835, 0xD051, 0x8836, 0xD052, 0x8837,\n\t0xD053, 0x8838, 0xD054, 0x883A, 0xD055, 0x883B, 0xD056, 0x883D,\t0xD057, 0x883E, 0xD058, 0x883F, 0xD059, 0x8841, 0xD05A, 0x8842,\n\t0xD05B, 0x8843, 0xD05C, 0x8846, 0xD05D, 0x8847, 0xD05E, 0x8848,\t0xD05F, 0x8849, 0xD060, 0x884A, 0xD061, 0x884B, 0xD062, 0x884E,\n\t0xD063, 0x884F, 0xD064, 0x8850, 0xD065, 0x8851, 0xD066, 0x8852,\t0xD067, 0x8853, 0xD068, 0x8855, 0xD069, 0x8856, 0xD06A, 0x8858,\n\t0xD06B, 0x885A, 0xD06C, 0x885B, 0xD06D, 0x885C, 0xD06E, 0x885D,\t0xD06F, 0x885E, 0xD070, 0x885F, 0xD071, 0x8860, 0xD072, 0x8866,\n\t0xD073, 0x8867, 0xD074, 0x886A, 0xD075, 0x886D, 0xD076, 0x886F,\t0xD077, 0x8871, 0xD078, 0x8873, 0xD079, 0x8874, 0xD07A, 0x8875,\n\t0xD07B, 0x8876, 0xD07C, 0x8878, 0xD07D, 0x8879, 0xD07E, 0x887A,\t0xD080, 0x887B, 0xD081, 0x887C, 0xD082, 0x8880, 0xD083, 0x8883,\n\t0xD084, 0x8886, 0xD085, 0x8887, 0xD086, 0x8889, 0xD087, 0x888A,\t0xD088, 0x888C, 0xD089, 0x888E, 0xD08A, 0x888F, 0xD08B, 0x8890,\n\t0xD08C, 0x8891, 0xD08D, 0x8893, 0xD08E, 0x8894, 0xD08F, 0x8895,\t0xD090, 0x8897, 0xD091, 0x8898, 0xD092, 0x8899, 0xD093, 0x889A,\n\t0xD094, 0x889B, 0xD095, 0x889D, 0xD096, 0x889E, 0xD097, 0x889F,\t0xD098, 0x88A0, 0xD099, 0x88A1, 0xD09A, 0x88A3, 0xD09B, 0x88A5,\n\t0xD09C, 0x88A6, 0xD09D, 0x88A7, 0xD09E, 0x88A8, 0xD09F, 0x88A9,\t0xD0A0, 0x88AA, 0xD0A1, 0x5C0F, 0xD0A2, 0x5B5D, 0xD0A3, 0x6821,\n\t0xD0A4, 0x8096, 0xD0A5, 0x5578, 0xD0A6, 0x7B11, 0xD0A7, 0x6548,\t0xD0A8, 0x6954, 0xD0A9, 0x4E9B, 0xD0AA, 0x6B47, 0xD0AB, 0x874E,\n\t0xD0AC, 0x978B, 0xD0AD, 0x534F, 0xD0AE, 0x631F, 0xD0AF, 0x643A,\t0xD0B0, 0x90AA, 0xD0B1, 0x659C, 0xD0B2, 0x80C1, 0xD0B3, 0x8C10,\n\t0xD0B4, 0x5199, 0xD0B5, 0x68B0, 0xD0B6, 0x5378, 0xD0B7, 0x87F9,\t0xD0B8, 0x61C8, 0xD0B9, 0x6CC4, 0xD0BA, 0x6CFB, 0xD0BB, 0x8C22,\n\t0xD0BC, 0x5C51, 0xD0BD, 0x85AA, 0xD0BE, 0x82AF, 0xD0BF, 0x950C,\t0xD0C0, 0x6B23, 0xD0C1, 0x8F9B, 0xD0C2, 0x65B0, 0xD0C3, 0x5FFB,\n\t0xD0C4, 0x5FC3, 0xD0C5, 0x4FE1, 0xD0C6, 0x8845, 0xD0C7, 0x661F,\t0xD0C8, 0x8165, 0xD0C9, 0x7329, 0xD0CA, 0x60FA, 0xD0CB, 0x5174,\n\t0xD0CC, 0x5211, 0xD0CD, 0x578B, 0xD0CE, 0x5F62, 0xD0CF, 0x90A2,\t0xD0D0, 0x884C, 0xD0D1, 0x9192, 0xD0D2, 0x5E78, 0xD0D3, 0x674F,\n\t0xD0D4, 0x6027, 0xD0D5, 0x59D3, 0xD0D6, 0x5144, 0xD0D7, 0x51F6,\t0xD0D8, 0x80F8, 0xD0D9, 0x5308, 0xD0DA, 0x6C79, 0xD0DB, 0x96C4,\n\t0xD0DC, 0x718A, 0xD0DD, 0x4F11, 0xD0DE, 0x4FEE, 0xD0DF, 0x7F9E,\t0xD0E0, 0x673D, 0xD0E1, 0x55C5, 0xD0E2, 0x9508, 0xD0E3, 0x79C0,\n\t0xD0E4, 0x8896, 0xD0E5, 0x7EE3, 0xD0E6, 0x589F, 0xD0E7, 0x620C,\t0xD0E8, 0x9700, 0xD0E9, 0x865A, 0xD0EA, 0x5618, 0xD0EB, 0x987B,\n\t0xD0EC, 0x5F90, 0xD0ED, 0x8BB8, 0xD0EE, 0x84C4, 0xD0EF, 0x9157,\t0xD0F0, 0x53D9, 0xD0F1, 0x65ED, 0xD0F2, 0x5E8F, 0xD0F3, 0x755C,\n\t0xD0F4, 0x6064, 0xD0F5, 0x7D6E, 0xD0F6, 0x5A7F, 0xD0F7, 0x7EEA,\t0xD0F8, 0x7EED, 0xD0F9, 0x8F69, 0xD0FA, 0x55A7, 0xD0FB, 0x5BA3,\n\t0xD0FC, 0x60AC, 0xD0FD, 0x65CB, 0xD0FE, 0x7384, 0xD140, 0x88AC,\t0xD141, 0x88AE, 0xD142, 0x88AF, 0xD143, 0x88B0, 0xD144, 0x88B2,\n\t0xD145, 0x88B3, 0xD146, 0x88B4, 0xD147, 0x88B5, 0xD148, 0x88B6,\t0xD149, 0x88B8, 0xD14A, 0x88B9, 0xD14B, 0x88BA, 0xD14C, 0x88BB,\n\t0xD14D, 0x88BD, 0xD14E, 0x88BE, 0xD14F, 0x88BF, 0xD150, 0x88C0,\t0xD151, 0x88C3, 0xD152, 0x88C4, 0xD153, 0x88C7, 0xD154, 0x88C8,\n\t0xD155, 0x88CA, 0xD156, 0x88CB, 0xD157, 0x88CC, 0xD158, 0x88CD,\t0xD159, 0x88CF, 0xD15A, 0x88D0, 0xD15B, 0x88D1, 0xD15C, 0x88D3,\n\t0xD15D, 0x88D6, 0xD15E, 0x88D7, 0xD15F, 0x88DA, 0xD160, 0x88DB,\t0xD161, 0x88DC, 0xD162, 0x88DD, 0xD163, 0x88DE, 0xD164, 0x88E0,\n\t0xD165, 0x88E1, 0xD166, 0x88E6, 0xD167, 0x88E7, 0xD168, 0x88E9,\t0xD169, 0x88EA, 0xD16A, 0x88EB, 0xD16B, 0x88EC, 0xD16C, 0x88ED,\n\t0xD16D, 0x88EE, 0xD16E, 0x88EF, 0xD16F, 0x88F2, 0xD170, 0x88F5,\t0xD171, 0x88F6, 0xD172, 0x88F7, 0xD173, 0x88FA, 0xD174, 0x88FB,\n\t0xD175, 0x88FD, 0xD176, 0x88FF, 0xD177, 0x8900, 0xD178, 0x8901,\t0xD179, 0x8903, 0xD17A, 0x8904, 0xD17B, 0x8905, 0xD17C, 0x8906,\n\t0xD17D, 0x8907, 0xD17E, 0x8908, 0xD180, 0x8909, 0xD181, 0x890B,\t0xD182, 0x890C, 0xD183, 0x890D, 0xD184, 0x890E, 0xD185, 0x890F,\n\t0xD186, 0x8911, 0xD187, 0x8914, 0xD188, 0x8915, 0xD189, 0x8916,\t0xD18A, 0x8917, 0xD18B, 0x8918, 0xD18C, 0x891C, 0xD18D, 0x891D,\n\t0xD18E, 0x891E, 0xD18F, 0x891F, 0xD190, 0x8920, 0xD191, 0x8922,\t0xD192, 0x8923, 0xD193, 0x8924, 0xD194, 0x8926, 0xD195, 0x8927,\n\t0xD196, 0x8928, 0xD197, 0x8929, 0xD198, 0x892C, 0xD199, 0x892D,\t0xD19A, 0x892E, 0xD19B, 0x892F, 0xD19C, 0x8931, 0xD19D, 0x8932,\n\t0xD19E, 0x8933, 0xD19F, 0x8935, 0xD1A0, 0x8937, 0xD1A1, 0x9009,\t0xD1A2, 0x7663, 0xD1A3, 0x7729, 0xD1A4, 0x7EDA, 0xD1A5, 0x9774,\n\t0xD1A6, 0x859B, 0xD1A7, 0x5B66, 0xD1A8, 0x7A74, 0xD1A9, 0x96EA,\t0xD1AA, 0x8840, 0xD1AB, 0x52CB, 0xD1AC, 0x718F, 0xD1AD, 0x5FAA,\n\t0xD1AE, 0x65EC, 0xD1AF, 0x8BE2, 0xD1B0, 0x5BFB, 0xD1B1, 0x9A6F,\t0xD1B2, 0x5DE1, 0xD1B3, 0x6B89, 0xD1B4, 0x6C5B, 0xD1B5, 0x8BAD,\n\t0xD1B6, 0x8BAF, 0xD1B7, 0x900A, 0xD1B8, 0x8FC5, 0xD1B9, 0x538B,\t0xD1BA, 0x62BC, 0xD1BB, 0x9E26, 0xD1BC, 0x9E2D, 0xD1BD, 0x5440,\n\t0xD1BE, 0x4E2B, 0xD1BF, 0x82BD, 0xD1C0, 0x7259, 0xD1C1, 0x869C,\t0xD1C2, 0x5D16, 0xD1C3, 0x8859, 0xD1C4, 0x6DAF, 0xD1C5, 0x96C5,\n\t0xD1C6, 0x54D1, 0xD1C7, 0x4E9A, 0xD1C8, 0x8BB6, 0xD1C9, 0x7109,\t0xD1CA, 0x54BD, 0xD1CB, 0x9609, 0xD1CC, 0x70DF, 0xD1CD, 0x6DF9,\n\t0xD1CE, 0x76D0, 0xD1CF, 0x4E25, 0xD1D0, 0x7814, 0xD1D1, 0x8712,\t0xD1D2, 0x5CA9, 0xD1D3, 0x5EF6, 0xD1D4, 0x8A00, 0xD1D5, 0x989C,\n\t0xD1D6, 0x960E, 0xD1D7, 0x708E, 0xD1D8, 0x6CBF, 0xD1D9, 0x5944,\t0xD1DA, 0x63A9, 0xD1DB, 0x773C, 0xD1DC, 0x884D, 0xD1DD, 0x6F14,\n\t0xD1DE, 0x8273, 0xD1DF, 0x5830, 0xD1E0, 0x71D5, 0xD1E1, 0x538C,\t0xD1E2, 0x781A, 0xD1E3, 0x96C1, 0xD1E4, 0x5501, 0xD1E5, 0x5F66,\n\t0xD1E6, 0x7130, 0xD1E7, 0x5BB4, 0xD1E8, 0x8C1A, 0xD1E9, 0x9A8C,\t0xD1EA, 0x6B83, 0xD1EB, 0x592E, 0xD1EC, 0x9E2F, 0xD1ED, 0x79E7,\n\t0xD1EE, 0x6768, 0xD1EF, 0x626C, 0xD1F0, 0x4F6F, 0xD1F1, 0x75A1,\t0xD1F2, 0x7F8A, 0xD1F3, 0x6D0B, 0xD1F4, 0x9633, 0xD1F5, 0x6C27,\n\t0xD1F6, 0x4EF0, 0xD1F7, 0x75D2, 0xD1F8, 0x517B, 0xD1F9, 0x6837,\t0xD1FA, 0x6F3E, 0xD1FB, 0x9080, 0xD1FC, 0x8170, 0xD1FD, 0x5996,\n\t0xD1FE, 0x7476, 0xD240, 0x8938, 0xD241, 0x8939, 0xD242, 0x893A,\t0xD243, 0x893B, 0xD244, 0x893C, 0xD245, 0x893D, 0xD246, 0x893E,\n\t0xD247, 0x893F, 0xD248, 0x8940, 0xD249, 0x8942, 0xD24A, 0x8943,\t0xD24B, 0x8945, 0xD24C, 0x8946, 0xD24D, 0x8947, 0xD24E, 0x8948,\n\t0xD24F, 0x8949, 0xD250, 0x894A, 0xD251, 0x894B, 0xD252, 0x894C,\t0xD253, 0x894D, 0xD254, 0x894E, 0xD255, 0x894F, 0xD256, 0x8950,\n\t0xD257, 0x8951, 0xD258, 0x8952, 0xD259, 0x8953, 0xD25A, 0x8954,\t0xD25B, 0x8955, 0xD25C, 0x8956, 0xD25D, 0x8957, 0xD25E, 0x8958,\n\t0xD25F, 0x8959, 0xD260, 0x895A, 0xD261, 0x895B, 0xD262, 0x895C,\t0xD263, 0x895D, 0xD264, 0x8960, 0xD265, 0x8961, 0xD266, 0x8962,\n\t0xD267, 0x8963, 0xD268, 0x8964, 0xD269, 0x8965, 0xD26A, 0x8967,\t0xD26B, 0x8968, 0xD26C, 0x8969, 0xD26D, 0x896A, 0xD26E, 0x896B,\n\t0xD26F, 0x896C, 0xD270, 0x896D, 0xD271, 0x896E, 0xD272, 0x896F,\t0xD273, 0x8970, 0xD274, 0x8971, 0xD275, 0x8972, 0xD276, 0x8973,\n\t0xD277, 0x8974, 0xD278, 0x8975, 0xD279, 0x8976, 0xD27A, 0x8977,\t0xD27B, 0x8978, 0xD27C, 0x8979, 0xD27D, 0x897A, 0xD27E, 0x897C,\n\t0xD280, 0x897D, 0xD281, 0x897E, 0xD282, 0x8980, 0xD283, 0x8982,\t0xD284, 0x8984, 0xD285, 0x8985, 0xD286, 0x8987, 0xD287, 0x8988,\n\t0xD288, 0x8989, 0xD289, 0x898A, 0xD28A, 0x898B, 0xD28B, 0x898C,\t0xD28C, 0x898D, 0xD28D, 0x898E, 0xD28E, 0x898F, 0xD28F, 0x8990,\n\t0xD290, 0x8991, 0xD291, 0x8992, 0xD292, 0x8993, 0xD293, 0x8994,\t0xD294, 0x8995, 0xD295, 0x8996, 0xD296, 0x8997, 0xD297, 0x8998,\n\t0xD298, 0x8999, 0xD299, 0x899A, 0xD29A, 0x899B, 0xD29B, 0x899C,\t0xD29C, 0x899D, 0xD29D, 0x899E, 0xD29E, 0x899F, 0xD29F, 0x89A0,\n\t0xD2A0, 0x89A1, 0xD2A1, 0x6447, 0xD2A2, 0x5C27, 0xD2A3, 0x9065,\t0xD2A4, 0x7A91, 0xD2A5, 0x8C23, 0xD2A6, 0x59DA, 0xD2A7, 0x54AC,\n\t0xD2A8, 0x8200, 0xD2A9, 0x836F, 0xD2AA, 0x8981, 0xD2AB, 0x8000,\t0xD2AC, 0x6930, 0xD2AD, 0x564E, 0xD2AE, 0x8036, 0xD2AF, 0x7237,\n\t0xD2B0, 0x91CE, 0xD2B1, 0x51B6, 0xD2B2, 0x4E5F, 0xD2B3, 0x9875,\t0xD2B4, 0x6396, 0xD2B5, 0x4E1A, 0xD2B6, 0x53F6, 0xD2B7, 0x66F3,\n\t0xD2B8, 0x814B, 0xD2B9, 0x591C, 0xD2BA, 0x6DB2, 0xD2BB, 0x4E00,\t0xD2BC, 0x58F9, 0xD2BD, 0x533B, 0xD2BE, 0x63D6, 0xD2BF, 0x94F1,\n\t0xD2C0, 0x4F9D, 0xD2C1, 0x4F0A, 0xD2C2, 0x8863, 0xD2C3, 0x9890,\t0xD2C4, 0x5937, 0xD2C5, 0x9057, 0xD2C6, 0x79FB, 0xD2C7, 0x4EEA,\n\t0xD2C8, 0x80F0, 0xD2C9, 0x7591, 0xD2CA, 0x6C82, 0xD2CB, 0x5B9C,\t0xD2CC, 0x59E8, 0xD2CD, 0x5F5D, 0xD2CE, 0x6905, 0xD2CF, 0x8681,\n\t0xD2D0, 0x501A, 0xD2D1, 0x5DF2, 0xD2D2, 0x4E59, 0xD2D3, 0x77E3,\t0xD2D4, 0x4EE5, 0xD2D5, 0x827A, 0xD2D6, 0x6291, 0xD2D7, 0x6613,\n\t0xD2D8, 0x9091, 0xD2D9, 0x5C79, 0xD2DA, 0x4EBF, 0xD2DB, 0x5F79,\t0xD2DC, 0x81C6, 0xD2DD, 0x9038, 0xD2DE, 0x8084, 0xD2DF, 0x75AB,\n\t0xD2E0, 0x4EA6, 0xD2E1, 0x88D4, 0xD2E2, 0x610F, 0xD2E3, 0x6BC5,\t0xD2E4, 0x5FC6, 0xD2E5, 0x4E49, 0xD2E6, 0x76CA, 0xD2E7, 0x6EA2,\n\t0xD2E8, 0x8BE3, 0xD2E9, 0x8BAE, 0xD2EA, 0x8C0A, 0xD2EB, 0x8BD1,\t0xD2EC, 0x5F02, 0xD2ED, 0x7FFC, 0xD2EE, 0x7FCC, 0xD2EF, 0x7ECE,\n\t0xD2F0, 0x8335, 0xD2F1, 0x836B, 0xD2F2, 0x56E0, 0xD2F3, 0x6BB7,\t0xD2F4, 0x97F3, 0xD2F5, 0x9634, 0xD2F6, 0x59FB, 0xD2F7, 0x541F,\n\t0xD2F8, 0x94F6, 0xD2F9, 0x6DEB, 0xD2FA, 0x5BC5, 0xD2FB, 0x996E,\t0xD2FC, 0x5C39, 0xD2FD, 0x5F15, 0xD2FE, 0x9690, 0xD340, 0x89A2,\n\t0xD341, 0x89A3, 0xD342, 0x89A4, 0xD343, 0x89A5, 0xD344, 0x89A6,\t0xD345, 0x89A7, 0xD346, 0x89A8, 0xD347, 0x89A9, 0xD348, 0x89AA,\n\t0xD349, 0x89AB, 0xD34A, 0x89AC, 0xD34B, 0x89AD, 0xD34C, 0x89AE,\t0xD34D, 0x89AF, 0xD34E, 0x89B0, 0xD34F, 0x89B1, 0xD350, 0x89B2,\n\t0xD351, 0x89B3, 0xD352, 0x89B4, 0xD353, 0x89B5, 0xD354, 0x89B6,\t0xD355, 0x89B7, 0xD356, 0x89B8, 0xD357, 0x89B9, 0xD358, 0x89BA,\n\t0xD359, 0x89BB, 0xD35A, 0x89BC, 0xD35B, 0x89BD, 0xD35C, 0x89BE,\t0xD35D, 0x89BF, 0xD35E, 0x89C0, 0xD35F, 0x89C3, 0xD360, 0x89CD,\n\t0xD361, 0x89D3, 0xD362, 0x89D4, 0xD363, 0x89D5, 0xD364, 0x89D7,\t0xD365, 0x89D8, 0xD366, 0x89D9, 0xD367, 0x89DB, 0xD368, 0x89DD,\n\t0xD369, 0x89DF, 0xD36A, 0x89E0, 0xD36B, 0x89E1, 0xD36C, 0x89E2,\t0xD36D, 0x89E4, 0xD36E, 0x89E7, 0xD36F, 0x89E8, 0xD370, 0x89E9,\n\t0xD371, 0x89EA, 0xD372, 0x89EC, 0xD373, 0x89ED, 0xD374, 0x89EE,\t0xD375, 0x89F0, 0xD376, 0x89F1, 0xD377, 0x89F2, 0xD378, 0x89F4,\n\t0xD379, 0x89F5, 0xD37A, 0x89F6, 0xD37B, 0x89F7, 0xD37C, 0x89F8,\t0xD37D, 0x89F9, 0xD37E, 0x89FA, 0xD380, 0x89FB, 0xD381, 0x89FC,\n\t0xD382, 0x89FD, 0xD383, 0x89FE, 0xD384, 0x89FF, 0xD385, 0x8A01,\t0xD386, 0x8A02, 0xD387, 0x8A03, 0xD388, 0x8A04, 0xD389, 0x8A05,\n\t0xD38A, 0x8A06, 0xD38B, 0x8A08, 0xD38C, 0x8A09, 0xD38D, 0x8A0A,\t0xD38E, 0x8A0B, 0xD38F, 0x8A0C, 0xD390, 0x8A0D, 0xD391, 0x8A0E,\n\t0xD392, 0x8A0F, 0xD393, 0x8A10, 0xD394, 0x8A11, 0xD395, 0x8A12,\t0xD396, 0x8A13, 0xD397, 0x8A14, 0xD398, 0x8A15, 0xD399, 0x8A16,\n\t0xD39A, 0x8A17, 0xD39B, 0x8A18, 0xD39C, 0x8A19, 0xD39D, 0x8A1A,\t0xD39E, 0x8A1B, 0xD39F, 0x8A1C, 0xD3A0, 0x8A1D, 0xD3A1, 0x5370,\n\t0xD3A2, 0x82F1, 0xD3A3, 0x6A31, 0xD3A4, 0x5A74, 0xD3A5, 0x9E70,\t0xD3A6, 0x5E94, 0xD3A7, 0x7F28, 0xD3A8, 0x83B9, 0xD3A9, 0x8424,\n\t0xD3AA, 0x8425, 0xD3AB, 0x8367, 0xD3AC, 0x8747, 0xD3AD, 0x8FCE,\t0xD3AE, 0x8D62, 0xD3AF, 0x76C8, 0xD3B0, 0x5F71, 0xD3B1, 0x9896,\n\t0xD3B2, 0x786C, 0xD3B3, 0x6620, 0xD3B4, 0x54DF, 0xD3B5, 0x62E5,\t0xD3B6, 0x4F63, 0xD3B7, 0x81C3, 0xD3B8, 0x75C8, 0xD3B9, 0x5EB8,\n\t0xD3BA, 0x96CD, 0xD3BB, 0x8E0A, 0xD3BC, 0x86F9, 0xD3BD, 0x548F,\t0xD3BE, 0x6CF3, 0xD3BF, 0x6D8C, 0xD3C0, 0x6C38, 0xD3C1, 0x607F,\n\t0xD3C2, 0x52C7, 0xD3C3, 0x7528, 0xD3C4, 0x5E7D, 0xD3C5, 0x4F18,\t0xD3C6, 0x60A0, 0xD3C7, 0x5FE7, 0xD3C8, 0x5C24, 0xD3C9, 0x7531,\n\t0xD3CA, 0x90AE, 0xD3CB, 0x94C0, 0xD3CC, 0x72B9, 0xD3CD, 0x6CB9,\t0xD3CE, 0x6E38, 0xD3CF, 0x9149, 0xD3D0, 0x6709, 0xD3D1, 0x53CB,\n\t0xD3D2, 0x53F3, 0xD3D3, 0x4F51, 0xD3D4, 0x91C9, 0xD3D5, 0x8BF1,\t0xD3D6, 0x53C8, 0xD3D7, 0x5E7C, 0xD3D8, 0x8FC2, 0xD3D9, 0x6DE4,\n\t0xD3DA, 0x4E8E, 0xD3DB, 0x76C2, 0xD3DC, 0x6986, 0xD3DD, 0x865E,\t0xD3DE, 0x611A, 0xD3DF, 0x8206, 0xD3E0, 0x4F59, 0xD3E1, 0x4FDE,\n\t0xD3E2, 0x903E, 0xD3E3, 0x9C7C, 0xD3E4, 0x6109, 0xD3E5, 0x6E1D,\t0xD3E6, 0x6E14, 0xD3E7, 0x9685, 0xD3E8, 0x4E88, 0xD3E9, 0x5A31,\n\t0xD3EA, 0x96E8, 0xD3EB, 0x4E0E, 0xD3EC, 0x5C7F, 0xD3ED, 0x79B9,\t0xD3EE, 0x5B87, 0xD3EF, 0x8BED, 0xD3F0, 0x7FBD, 0xD3F1, 0x7389,\n\t0xD3F2, 0x57DF, 0xD3F3, 0x828B, 0xD3F4, 0x90C1, 0xD3F5, 0x5401,\t0xD3F6, 0x9047, 0xD3F7, 0x55BB, 0xD3F8, 0x5CEA, 0xD3F9, 0x5FA1,\n\t0xD3FA, 0x6108, 0xD3FB, 0x6B32, 0xD3FC, 0x72F1, 0xD3FD, 0x80B2,\t0xD3FE, 0x8A89, 0xD440, 0x8A1E, 0xD441, 0x8A1F, 0xD442, 0x8A20,\n\t0xD443, 0x8A21, 0xD444, 0x8A22, 0xD445, 0x8A23, 0xD446, 0x8A24,\t0xD447, 0x8A25, 0xD448, 0x8A26, 0xD449, 0x8A27, 0xD44A, 0x8A28,\n\t0xD44B, 0x8A29, 0xD44C, 0x8A2A, 0xD44D, 0x8A2B, 0xD44E, 0x8A2C,\t0xD44F, 0x8A2D, 0xD450, 0x8A2E, 0xD451, 0x8A2F, 0xD452, 0x8A30,\n\t0xD453, 0x8A31, 0xD454, 0x8A32, 0xD455, 0x8A33, 0xD456, 0x8A34,\t0xD457, 0x8A35, 0xD458, 0x8A36, 0xD459, 0x8A37, 0xD45A, 0x8A38,\n\t0xD45B, 0x8A39, 0xD45C, 0x8A3A, 0xD45D, 0x8A3B, 0xD45E, 0x8A3C,\t0xD45F, 0x8A3D, 0xD460, 0x8A3F, 0xD461, 0x8A40, 0xD462, 0x8A41,\n\t0xD463, 0x8A42, 0xD464, 0x8A43, 0xD465, 0x8A44, 0xD466, 0x8A45,\t0xD467, 0x8A46, 0xD468, 0x8A47, 0xD469, 0x8A49, 0xD46A, 0x8A4A,\n\t0xD46B, 0x8A4B, 0xD46C, 0x8A4C, 0xD46D, 0x8A4D, 0xD46E, 0x8A4E,\t0xD46F, 0x8A4F, 0xD470, 0x8A50, 0xD471, 0x8A51, 0xD472, 0x8A52,\n\t0xD473, 0x8A53, 0xD474, 0x8A54, 0xD475, 0x8A55, 0xD476, 0x8A56,\t0xD477, 0x8A57, 0xD478, 0x8A58, 0xD479, 0x8A59, 0xD47A, 0x8A5A,\n\t0xD47B, 0x8A5B, 0xD47C, 0x8A5C, 0xD47D, 0x8A5D, 0xD47E, 0x8A5E,\t0xD480, 0x8A5F, 0xD481, 0x8A60, 0xD482, 0x8A61, 0xD483, 0x8A62,\n\t0xD484, 0x8A63, 0xD485, 0x8A64, 0xD486, 0x8A65, 0xD487, 0x8A66,\t0xD488, 0x8A67, 0xD489, 0x8A68, 0xD48A, 0x8A69, 0xD48B, 0x8A6A,\n\t0xD48C, 0x8A6B, 0xD48D, 0x8A6C, 0xD48E, 0x8A6D, 0xD48F, 0x8A6E,\t0xD490, 0x8A6F, 0xD491, 0x8A70, 0xD492, 0x8A71, 0xD493, 0x8A72,\n\t0xD494, 0x8A73, 0xD495, 0x8A74, 0xD496, 0x8A75, 0xD497, 0x8A76,\t0xD498, 0x8A77, 0xD499, 0x8A78, 0xD49A, 0x8A7A, 0xD49B, 0x8A7B,\n\t0xD49C, 0x8A7C, 0xD49D, 0x8A7D, 0xD49E, 0x8A7E, 0xD49F, 0x8A7F,\t0xD4A0, 0x8A80, 0xD4A1, 0x6D74, 0xD4A2, 0x5BD3, 0xD4A3, 0x88D5,\n\t0xD4A4, 0x9884, 0xD4A5, 0x8C6B, 0xD4A6, 0x9A6D, 0xD4A7, 0x9E33,\t0xD4A8, 0x6E0A, 0xD4A9, 0x51A4, 0xD4AA, 0x5143, 0xD4AB, 0x57A3,\n\t0xD4AC, 0x8881, 0xD4AD, 0x539F, 0xD4AE, 0x63F4, 0xD4AF, 0x8F95,\t0xD4B0, 0x56ED, 0xD4B1, 0x5458, 0xD4B2, 0x5706, 0xD4B3, 0x733F,\n\t0xD4B4, 0x6E90, 0xD4B5, 0x7F18, 0xD4B6, 0x8FDC, 0xD4B7, 0x82D1,\t0xD4B8, 0x613F, 0xD4B9, 0x6028, 0xD4BA, 0x9662, 0xD4BB, 0x66F0,\n\t0xD4BC, 0x7EA6, 0xD4BD, 0x8D8A, 0xD4BE, 0x8DC3, 0xD4BF, 0x94A5,\t0xD4C0, 0x5CB3, 0xD4C1, 0x7CA4, 0xD4C2, 0x6708, 0xD4C3, 0x60A6,\n\t0xD4C4, 0x9605, 0xD4C5, 0x8018, 0xD4C6, 0x4E91, 0xD4C7, 0x90E7,\t0xD4C8, 0x5300, 0xD4C9, 0x9668, 0xD4CA, 0x5141, 0xD4CB, 0x8FD0,\n\t0xD4CC, 0x8574, 0xD4CD, 0x915D, 0xD4CE, 0x6655, 0xD4CF, 0x97F5,\t0xD4D0, 0x5B55, 0xD4D1, 0x531D, 0xD4D2, 0x7838, 0xD4D3, 0x6742,\n\t0xD4D4, 0x683D, 0xD4D5, 0x54C9, 0xD4D6, 0x707E, 0xD4D7, 0x5BB0,\t0xD4D8, 0x8F7D, 0xD4D9, 0x518D, 0xD4DA, 0x5728, 0xD4DB, 0x54B1,\n\t0xD4DC, 0x6512, 0xD4DD, 0x6682, 0xD4DE, 0x8D5E, 0xD4DF, 0x8D43,\t0xD4E0, 0x810F, 0xD4E1, 0x846C, 0xD4E2, 0x906D, 0xD4E3, 0x7CDF,\n\t0xD4E4, 0x51FF, 0xD4E5, 0x85FB, 0xD4E6, 0x67A3, 0xD4E7, 0x65E9,\t0xD4E8, 0x6FA1, 0xD4E9, 0x86A4, 0xD4EA, 0x8E81, 0xD4EB, 0x566A,\n\t0xD4EC, 0x9020, 0xD4ED, 0x7682, 0xD4EE, 0x7076, 0xD4EF, 0x71E5,\t0xD4F0, 0x8D23, 0xD4F1, 0x62E9, 0xD4F2, 0x5219, 0xD4F3, 0x6CFD,\n\t0xD4F4, 0x8D3C, 0xD4F5, 0x600E, 0xD4F6, 0x589E, 0xD4F7, 0x618E,\t0xD4F8, 0x66FE, 0xD4F9, 0x8D60, 0xD4FA, 0x624E, 0xD4FB, 0x55B3,\n\t0xD4FC, 0x6E23, 0xD4FD, 0x672D, 0xD4FE, 0x8F67, 0xD540, 0x8A81,\t0xD541, 0x8A82, 0xD542, 0x8A83, 0xD543, 0x8A84, 0xD544, 0x8A85,\n\t0xD545, 0x8A86, 0xD546, 0x8A87, 0xD547, 0x8A88, 0xD548, 0x8A8B,\t0xD549, 0x8A8C, 0xD54A, 0x8A8D, 0xD54B, 0x8A8E, 0xD54C, 0x8A8F,\n\t0xD54D, 0x8A90, 0xD54E, 0x8A91, 0xD54F, 0x8A92, 0xD550, 0x8A94,\t0xD551, 0x8A95, 0xD552, 0x8A96, 0xD553, 0x8A97, 0xD554, 0x8A98,\n\t0xD555, 0x8A99, 0xD556, 0x8A9A, 0xD557, 0x8A9B, 0xD558, 0x8A9C,\t0xD559, 0x8A9D, 0xD55A, 0x8A9E, 0xD55B, 0x8A9F, 0xD55C, 0x8AA0,\n\t0xD55D, 0x8AA1, 0xD55E, 0x8AA2, 0xD55F, 0x8AA3, 0xD560, 0x8AA4,\t0xD561, 0x8AA5, 0xD562, 0x8AA6, 0xD563, 0x8AA7, 0xD564, 0x8AA8,\n\t0xD565, 0x8AA9, 0xD566, 0x8AAA, 0xD567, 0x8AAB, 0xD568, 0x8AAC,\t0xD569, 0x8AAD, 0xD56A, 0x8AAE, 0xD56B, 0x8AAF, 0xD56C, 0x8AB0,\n\t0xD56D, 0x8AB1, 0xD56E, 0x8AB2, 0xD56F, 0x8AB3, 0xD570, 0x8AB4,\t0xD571, 0x8AB5, 0xD572, 0x8AB6, 0xD573, 0x8AB7, 0xD574, 0x8AB8,\n\t0xD575, 0x8AB9, 0xD576, 0x8ABA, 0xD577, 0x8ABB, 0xD578, 0x8ABC,\t0xD579, 0x8ABD, 0xD57A, 0x8ABE, 0xD57B, 0x8ABF, 0xD57C, 0x8AC0,\n\t0xD57D, 0x8AC1, 0xD57E, 0x8AC2, 0xD580, 0x8AC3, 0xD581, 0x8AC4,\t0xD582, 0x8AC5, 0xD583, 0x8AC6, 0xD584, 0x8AC7, 0xD585, 0x8AC8,\n\t0xD586, 0x8AC9, 0xD587, 0x8ACA, 0xD588, 0x8ACB, 0xD589, 0x8ACC,\t0xD58A, 0x8ACD, 0xD58B, 0x8ACE, 0xD58C, 0x8ACF, 0xD58D, 0x8AD0,\n\t0xD58E, 0x8AD1, 0xD58F, 0x8AD2, 0xD590, 0x8AD3, 0xD591, 0x8AD4,\t0xD592, 0x8AD5, 0xD593, 0x8AD6, 0xD594, 0x8AD7, 0xD595, 0x8AD8,\n\t0xD596, 0x8AD9, 0xD597, 0x8ADA, 0xD598, 0x8ADB, 0xD599, 0x8ADC,\t0xD59A, 0x8ADD, 0xD59B, 0x8ADE, 0xD59C, 0x8ADF, 0xD59D, 0x8AE0,\n\t0xD59E, 0x8AE1, 0xD59F, 0x8AE2, 0xD5A0, 0x8AE3, 0xD5A1, 0x94E1,\t0xD5A2, 0x95F8, 0xD5A3, 0x7728, 0xD5A4, 0x6805, 0xD5A5, 0x69A8,\n\t0xD5A6, 0x548B, 0xD5A7, 0x4E4D, 0xD5A8, 0x70B8, 0xD5A9, 0x8BC8,\t0xD5AA, 0x6458, 0xD5AB, 0x658B, 0xD5AC, 0x5B85, 0xD5AD, 0x7A84,\n\t0xD5AE, 0x503A, 0xD5AF, 0x5BE8, 0xD5B0, 0x77BB, 0xD5B1, 0x6BE1,\t0xD5B2, 0x8A79, 0xD5B3, 0x7C98, 0xD5B4, 0x6CBE, 0xD5B5, 0x76CF,\n\t0xD5B6, 0x65A9, 0xD5B7, 0x8F97, 0xD5B8, 0x5D2D, 0xD5B9, 0x5C55,\t0xD5BA, 0x8638, 0xD5BB, 0x6808, 0xD5BC, 0x5360, 0xD5BD, 0x6218,\n\t0xD5BE, 0x7AD9, 0xD5BF, 0x6E5B, 0xD5C0, 0x7EFD, 0xD5C1, 0x6A1F,\t0xD5C2, 0x7AE0, 0xD5C3, 0x5F70, 0xD5C4, 0x6F33, 0xD5C5, 0x5F20,\n\t0xD5C6, 0x638C, 0xD5C7, 0x6DA8, 0xD5C8, 0x6756, 0xD5C9, 0x4E08,\t0xD5CA, 0x5E10, 0xD5CB, 0x8D26, 0xD5CC, 0x4ED7, 0xD5CD, 0x80C0,\n\t0xD5CE, 0x7634, 0xD5CF, 0x969C, 0xD5D0, 0x62DB, 0xD5D1, 0x662D,\t0xD5D2, 0x627E, 0xD5D3, 0x6CBC, 0xD5D4, 0x8D75, 0xD5D5, 0x7167,\n\t0xD5D6, 0x7F69, 0xD5D7, 0x5146, 0xD5D8, 0x8087, 0xD5D9, 0x53EC,\t0xD5DA, 0x906E, 0xD5DB, 0x6298, 0xD5DC, 0x54F2, 0xD5DD, 0x86F0,\n\t0xD5DE, 0x8F99, 0xD5DF, 0x8005, 0xD5E0, 0x9517, 0xD5E1, 0x8517,\t0xD5E2, 0x8FD9, 0xD5E3, 0x6D59, 0xD5E4, 0x73CD, 0xD5E5, 0x659F,\n\t0xD5E6, 0x771F, 0xD5E7, 0x7504, 0xD5E8, 0x7827, 0xD5E9, 0x81FB,\t0xD5EA, 0x8D1E, 0xD5EB, 0x9488, 0xD5EC, 0x4FA6, 0xD5ED, 0x6795,\n\t0xD5EE, 0x75B9, 0xD5EF, 0x8BCA, 0xD5F0, 0x9707, 0xD5F1, 0x632F,\t0xD5F2, 0x9547, 0xD5F3, 0x9635, 0xD5F4, 0x84B8, 0xD5F5, 0x6323,\n\t0xD5F6, 0x7741, 0xD5F7, 0x5F81, 0xD5F8, 0x72F0, 0xD5F9, 0x4E89,\t0xD5FA, 0x6014, 0xD5FB, 0x6574, 0xD5FC, 0x62EF, 0xD5FD, 0x6B63,\n\t0xD5FE, 0x653F, 0xD640, 0x8AE4, 0xD641, 0x8AE5, 0xD642, 0x8AE6,\t0xD643, 0x8AE7, 0xD644, 0x8AE8, 0xD645, 0x8AE9, 0xD646, 0x8AEA,\n\t0xD647, 0x8AEB, 0xD648, 0x8AEC, 0xD649, 0x8AED, 0xD64A, 0x8AEE,\t0xD64B, 0x8AEF, 0xD64C, 0x8AF0, 0xD64D, 0x8AF1, 0xD64E, 0x8AF2,\n\t0xD64F, 0x8AF3, 0xD650, 0x8AF4, 0xD651, 0x8AF5, 0xD652, 0x8AF6,\t0xD653, 0x8AF7, 0xD654, 0x8AF8, 0xD655, 0x8AF9, 0xD656, 0x8AFA,\n\t0xD657, 0x8AFB, 0xD658, 0x8AFC, 0xD659, 0x8AFD, 0xD65A, 0x8AFE,\t0xD65B, 0x8AFF, 0xD65C, 0x8B00, 0xD65D, 0x8B01, 0xD65E, 0x8B02,\n\t0xD65F, 0x8B03, 0xD660, 0x8B04, 0xD661, 0x8B05, 0xD662, 0x8B06,\t0xD663, 0x8B08, 0xD664, 0x8B09, 0xD665, 0x8B0A, 0xD666, 0x8B0B,\n\t0xD667, 0x8B0C, 0xD668, 0x8B0D, 0xD669, 0x8B0E, 0xD66A, 0x8B0F,\t0xD66B, 0x8B10, 0xD66C, 0x8B11, 0xD66D, 0x8B12, 0xD66E, 0x8B13,\n\t0xD66F, 0x8B14, 0xD670, 0x8B15, 0xD671, 0x8B16, 0xD672, 0x8B17,\t0xD673, 0x8B18, 0xD674, 0x8B19, 0xD675, 0x8B1A, 0xD676, 0x8B1B,\n\t0xD677, 0x8B1C, 0xD678, 0x8B1D, 0xD679, 0x8B1E, 0xD67A, 0x8B1F,\t0xD67B, 0x8B20, 0xD67C, 0x8B21, 0xD67D, 0x8B22, 0xD67E, 0x8B23,\n\t0xD680, 0x8B24, 0xD681, 0x8B25, 0xD682, 0x8B27, 0xD683, 0x8B28,\t0xD684, 0x8B29, 0xD685, 0x8B2A, 0xD686, 0x8B2B, 0xD687, 0x8B2C,\n\t0xD688, 0x8B2D, 0xD689, 0x8B2E, 0xD68A, 0x8B2F, 0xD68B, 0x8B30,\t0xD68C, 0x8B31, 0xD68D, 0x8B32, 0xD68E, 0x8B33, 0xD68F, 0x8B34,\n\t0xD690, 0x8B35, 0xD691, 0x8B36, 0xD692, 0x8B37, 0xD693, 0x8B38,\t0xD694, 0x8B39, 0xD695, 0x8B3A, 0xD696, 0x8B3B, 0xD697, 0x8B3C,\n\t0xD698, 0x8B3D, 0xD699, 0x8B3E, 0xD69A, 0x8B3F, 0xD69B, 0x8B40,\t0xD69C, 0x8B41, 0xD69D, 0x8B42, 0xD69E, 0x8B43, 0xD69F, 0x8B44,\n\t0xD6A0, 0x8B45, 0xD6A1, 0x5E27, 0xD6A2, 0x75C7, 0xD6A3, 0x90D1,\t0xD6A4, 0x8BC1, 0xD6A5, 0x829D, 0xD6A6, 0x679D, 0xD6A7, 0x652F,\n\t0xD6A8, 0x5431, 0xD6A9, 0x8718, 0xD6AA, 0x77E5, 0xD6AB, 0x80A2,\t0xD6AC, 0x8102, 0xD6AD, 0x6C41, 0xD6AE, 0x4E4B, 0xD6AF, 0x7EC7,\n\t0xD6B0, 0x804C, 0xD6B1, 0x76F4, 0xD6B2, 0x690D, 0xD6B3, 0x6B96,\t0xD6B4, 0x6267, 0xD6B5, 0x503C, 0xD6B6, 0x4F84, 0xD6B7, 0x5740,\n\t0xD6B8, 0x6307, 0xD6B9, 0x6B62, 0xD6BA, 0x8DBE, 0xD6BB, 0x53EA,\t0xD6BC, 0x65E8, 0xD6BD, 0x7EB8, 0xD6BE, 0x5FD7, 0xD6BF, 0x631A,\n\t0xD6C0, 0x63B7, 0xD6C1, 0x81F3, 0xD6C2, 0x81F4, 0xD6C3, 0x7F6E,\t0xD6C4, 0x5E1C, 0xD6C5, 0x5CD9, 0xD6C6, 0x5236, 0xD6C7, 0x667A,\n\t0xD6C8, 0x79E9, 0xD6C9, 0x7A1A, 0xD6CA, 0x8D28, 0xD6CB, 0x7099,\t0xD6CC, 0x75D4, 0xD6CD, 0x6EDE, 0xD6CE, 0x6CBB, 0xD6CF, 0x7A92,\n\t0xD6D0, 0x4E2D, 0xD6D1, 0x76C5, 0xD6D2, 0x5FE0, 0xD6D3, 0x949F,\t0xD6D4, 0x8877, 0xD6D5, 0x7EC8, 0xD6D6, 0x79CD, 0xD6D7, 0x80BF,\n\t0xD6D8, 0x91CD, 0xD6D9, 0x4EF2, 0xD6DA, 0x4F17, 0xD6DB, 0x821F,\t0xD6DC, 0x5468, 0xD6DD, 0x5DDE, 0xD6DE, 0x6D32, 0xD6DF, 0x8BCC,\n\t0xD6E0, 0x7CA5, 0xD6E1, 0x8F74, 0xD6E2, 0x8098, 0xD6E3, 0x5E1A,\t0xD6E4, 0x5492, 0xD6E5, 0x76B1, 0xD6E6, 0x5B99, 0xD6E7, 0x663C,\n\t0xD6E8, 0x9AA4, 0xD6E9, 0x73E0, 0xD6EA, 0x682A, 0xD6EB, 0x86DB,\t0xD6EC, 0x6731, 0xD6ED, 0x732A, 0xD6EE, 0x8BF8, 0xD6EF, 0x8BDB,\n\t0xD6F0, 0x9010, 0xD6F1, 0x7AF9, 0xD6F2, 0x70DB, 0xD6F3, 0x716E,\t0xD6F4, 0x62C4, 0xD6F5, 0x77A9, 0xD6F6, 0x5631, 0xD6F7, 0x4E3B,\n\t0xD6F8, 0x8457, 0xD6F9, 0x67F1, 0xD6FA, 0x52A9, 0xD6FB, 0x86C0,\t0xD6FC, 0x8D2E, 0xD6FD, 0x94F8, 0xD6FE, 0x7B51, 0xD740, 0x8B46,\n\t0xD741, 0x8B47, 0xD742, 0x8B48, 0xD743, 0x8B49, 0xD744, 0x8B4A,\t0xD745, 0x8B4B, 0xD746, 0x8B4C, 0xD747, 0x8B4D, 0xD748, 0x8B4E,\n\t0xD749, 0x8B4F, 0xD74A, 0x8B50, 0xD74B, 0x8B51, 0xD74C, 0x8B52,\t0xD74D, 0x8B53, 0xD74E, 0x8B54, 0xD74F, 0x8B55, 0xD750, 0x8B56,\n\t0xD751, 0x8B57, 0xD752, 0x8B58, 0xD753, 0x8B59, 0xD754, 0x8B5A,\t0xD755, 0x8B5B, 0xD756, 0x8B5C, 0xD757, 0x8B5D, 0xD758, 0x8B5E,\n\t0xD759, 0x8B5F, 0xD75A, 0x8B60, 0xD75B, 0x8B61, 0xD75C, 0x8B62,\t0xD75D, 0x8B63, 0xD75E, 0x8B64, 0xD75F, 0x8B65, 0xD760, 0x8B67,\n\t0xD761, 0x8B68, 0xD762, 0x8B69, 0xD763, 0x8B6A, 0xD764, 0x8B6B,\t0xD765, 0x8B6D, 0xD766, 0x8B6E, 0xD767, 0x8B6F, 0xD768, 0x8B70,\n\t0xD769, 0x8B71, 0xD76A, 0x8B72, 0xD76B, 0x8B73, 0xD76C, 0x8B74,\t0xD76D, 0x8B75, 0xD76E, 0x8B76, 0xD76F, 0x8B77, 0xD770, 0x8B78,\n\t0xD771, 0x8B79, 0xD772, 0x8B7A, 0xD773, 0x8B7B, 0xD774, 0x8B7C,\t0xD775, 0x8B7D, 0xD776, 0x8B7E, 0xD777, 0x8B7F, 0xD778, 0x8B80,\n\t0xD779, 0x8B81, 0xD77A, 0x8B82, 0xD77B, 0x8B83, 0xD77C, 0x8B84,\t0xD77D, 0x8B85, 0xD77E, 0x8B86, 0xD780, 0x8B87, 0xD781, 0x8B88,\n\t0xD782, 0x8B89, 0xD783, 0x8B8A, 0xD784, 0x8B8B, 0xD785, 0x8B8C,\t0xD786, 0x8B8D, 0xD787, 0x8B8E, 0xD788, 0x8B8F, 0xD789, 0x8B90,\n\t0xD78A, 0x8B91, 0xD78B, 0x8B92, 0xD78C, 0x8B93, 0xD78D, 0x8B94,\t0xD78E, 0x8B95, 0xD78F, 0x8B96, 0xD790, 0x8B97, 0xD791, 0x8B98,\n\t0xD792, 0x8B99, 0xD793, 0x8B9A, 0xD794, 0x8B9B, 0xD795, 0x8B9C,\t0xD796, 0x8B9D, 0xD797, 0x8B9E, 0xD798, 0x8B9F, 0xD799, 0x8BAC,\n\t0xD79A, 0x8BB1, 0xD79B, 0x8BBB, 0xD79C, 0x8BC7, 0xD79D, 0x8BD0,\t0xD79E, 0x8BEA, 0xD79F, 0x8C09, 0xD7A0, 0x8C1E, 0xD7A1, 0x4F4F,\n\t0xD7A2, 0x6CE8, 0xD7A3, 0x795D, 0xD7A4, 0x9A7B, 0xD7A5, 0x6293,\t0xD7A6, 0x722A, 0xD7A7, 0x62FD, 0xD7A8, 0x4E13, 0xD7A9, 0x7816,\n\t0xD7AA, 0x8F6C, 0xD7AB, 0x64B0, 0xD7AC, 0x8D5A, 0xD7AD, 0x7BC6,\t0xD7AE, 0x6869, 0xD7AF, 0x5E84, 0xD7B0, 0x88C5, 0xD7B1, 0x5986,\n\t0xD7B2, 0x649E, 0xD7B3, 0x58EE, 0xD7B4, 0x72B6, 0xD7B5, 0x690E,\t0xD7B6, 0x9525, 0xD7B7, 0x8FFD, 0xD7B8, 0x8D58, 0xD7B9, 0x5760,\n\t0xD7BA, 0x7F00, 0xD7BB, 0x8C06, 0xD7BC, 0x51C6, 0xD7BD, 0x6349,\t0xD7BE, 0x62D9, 0xD7BF, 0x5353, 0xD7C0, 0x684C, 0xD7C1, 0x7422,\n\t0xD7C2, 0x8301, 0xD7C3, 0x914C, 0xD7C4, 0x5544, 0xD7C5, 0x7740,\t0xD7C6, 0x707C, 0xD7C7, 0x6D4A, 0xD7C8, 0x5179, 0xD7C9, 0x54A8,\n\t0xD7CA, 0x8D44, 0xD7CB, 0x59FF, 0xD7CC, 0x6ECB, 0xD7CD, 0x6DC4,\t0xD7CE, 0x5B5C, 0xD7CF, 0x7D2B, 0xD7D0, 0x4ED4, 0xD7D1, 0x7C7D,\n\t0xD7D2, 0x6ED3, 0xD7D3, 0x5B50, 0xD7D4, 0x81EA, 0xD7D5, 0x6E0D,\t0xD7D6, 0x5B57, 0xD7D7, 0x9B03, 0xD7D8, 0x68D5, 0xD7D9, 0x8E2A,\n\t0xD7DA, 0x5B97, 0xD7DB, 0x7EFC, 0xD7DC, 0x603B, 0xD7DD, 0x7EB5,\t0xD7DE, 0x90B9, 0xD7DF, 0x8D70, 0xD7E0, 0x594F, 0xD7E1, 0x63CD,\n\t0xD7E2, 0x79DF, 0xD7E3, 0x8DB3, 0xD7E4, 0x5352, 0xD7E5, 0x65CF,\t0xD7E6, 0x7956, 0xD7E7, 0x8BC5, 0xD7E8, 0x963B, 0xD7E9, 0x7EC4,\n\t0xD7EA, 0x94BB, 0xD7EB, 0x7E82, 0xD7EC, 0x5634, 0xD7ED, 0x9189,\t0xD7EE, 0x6700, 0xD7EF, 0x7F6A, 0xD7F0, 0x5C0A, 0xD7F1, 0x9075,\n\t0xD7F2, 0x6628, 0xD7F3, 0x5DE6, 0xD7F4, 0x4F50, 0xD7F5, 0x67DE,\t0xD7F6, 0x505A, 0xD7F7, 0x4F5C, 0xD7F8, 0x5750, 0xD7F9, 0x5EA7,\n\t0xD840, 0x8C38, 0xD841, 0x8C39, 0xD842, 0x8C3A, 0xD843, 0x8C3B,\t0xD844, 0x8C3C, 0xD845, 0x8C3D, 0xD846, 0x8C3E, 0xD847, 0x8C3F,\n\t0xD848, 0x8C40, 0xD849, 0x8C42, 0xD84A, 0x8C43, 0xD84B, 0x8C44,\t0xD84C, 0x8C45, 0xD84D, 0x8C48, 0xD84E, 0x8C4A, 0xD84F, 0x8C4B,\n\t0xD850, 0x8C4D, 0xD851, 0x8C4E, 0xD852, 0x8C4F, 0xD853, 0x8C50,\t0xD854, 0x8C51, 0xD855, 0x8C52, 0xD856, 0x8C53, 0xD857, 0x8C54,\n\t0xD858, 0x8C56, 0xD859, 0x8C57, 0xD85A, 0x8C58, 0xD85B, 0x8C59,\t0xD85C, 0x8C5B, 0xD85D, 0x8C5C, 0xD85E, 0x8C5D, 0xD85F, 0x8C5E,\n\t0xD860, 0x8C5F, 0xD861, 0x8C60, 0xD862, 0x8C63, 0xD863, 0x8C64,\t0xD864, 0x8C65, 0xD865, 0x8C66, 0xD866, 0x8C67, 0xD867, 0x8C68,\n\t0xD868, 0x8C69, 0xD869, 0x8C6C, 0xD86A, 0x8C6D, 0xD86B, 0x8C6E,\t0xD86C, 0x8C6F, 0xD86D, 0x8C70, 0xD86E, 0x8C71, 0xD86F, 0x8C72,\n\t0xD870, 0x8C74, 0xD871, 0x8C75, 0xD872, 0x8C76, 0xD873, 0x8C77,\t0xD874, 0x8C7B, 0xD875, 0x8C7C, 0xD876, 0x8C7D, 0xD877, 0x8C7E,\n\t0xD878, 0x8C7F, 0xD879, 0x8C80, 0xD87A, 0x8C81, 0xD87B, 0x8C83,\t0xD87C, 0x8C84, 0xD87D, 0x8C86, 0xD87E, 0x8C87, 0xD880, 0x8C88,\n\t0xD881, 0x8C8B, 0xD882, 0x8C8D, 0xD883, 0x8C8E, 0xD884, 0x8C8F,\t0xD885, 0x8C90, 0xD886, 0x8C91, 0xD887, 0x8C92, 0xD888, 0x8C93,\n\t0xD889, 0x8C95, 0xD88A, 0x8C96, 0xD88B, 0x8C97, 0xD88C, 0x8C99,\t0xD88D, 0x8C9A, 0xD88E, 0x8C9B, 0xD88F, 0x8C9C, 0xD890, 0x8C9D,\n\t0xD891, 0x8C9E, 0xD892, 0x8C9F, 0xD893, 0x8CA0, 0xD894, 0x8CA1,\t0xD895, 0x8CA2, 0xD896, 0x8CA3, 0xD897, 0x8CA4, 0xD898, 0x8CA5,\n\t0xD899, 0x8CA6, 0xD89A, 0x8CA7, 0xD89B, 0x8CA8, 0xD89C, 0x8CA9,\t0xD89D, 0x8CAA, 0xD89E, 0x8CAB, 0xD89F, 0x8CAC, 0xD8A0, 0x8CAD,\n\t0xD8A1, 0x4E8D, 0xD8A2, 0x4E0C, 0xD8A3, 0x5140, 0xD8A4, 0x4E10,\t0xD8A5, 0x5EFF, 0xD8A6, 0x5345, 0xD8A7, 0x4E15, 0xD8A8, 0x4E98,\n\t0xD8A9, 0x4E1E, 0xD8AA, 0x9B32, 0xD8AB, 0x5B6C, 0xD8AC, 0x5669,\t0xD8AD, 0x4E28, 0xD8AE, 0x79BA, 0xD8AF, 0x4E3F, 0xD8B0, 0x5315,\n\t0xD8B1, 0x4E47, 0xD8B2, 0x592D, 0xD8B3, 0x723B, 0xD8B4, 0x536E,\t0xD8B5, 0x6C10, 0xD8B6, 0x56DF, 0xD8B7, 0x80E4, 0xD8B8, 0x9997,\n\t0xD8B9, 0x6BD3, 0xD8BA, 0x777E, 0xD8BB, 0x9F17, 0xD8BC, 0x4E36,\t0xD8BD, 0x4E9F, 0xD8BE, 0x9F10, 0xD8BF, 0x4E5C, 0xD8C0, 0x4E69,\n\t0xD8C1, 0x4E93, 0xD8C2, 0x8288, 0xD8C3, 0x5B5B, 0xD8C4, 0x556C,\t0xD8C5, 0x560F, 0xD8C6, 0x4EC4, 0xD8C7, 0x538D, 0xD8C8, 0x539D,\n\t0xD8C9, 0x53A3, 0xD8CA, 0x53A5, 0xD8CB, 0x53AE, 0xD8CC, 0x9765,\t0xD8CD, 0x8D5D, 0xD8CE, 0x531A, 0xD8CF, 0x53F5, 0xD8D0, 0x5326,\n\t0xD8D1, 0x532E, 0xD8D2, 0x533E, 0xD8D3, 0x8D5C, 0xD8D4, 0x5366,\t0xD8D5, 0x5363, 0xD8D6, 0x5202, 0xD8D7, 0x5208, 0xD8D8, 0x520E,\n\t0xD8D9, 0x522D, 0xD8DA, 0x5233, 0xD8DB, 0x523F, 0xD8DC, 0x5240,\t0xD8DD, 0x524C, 0xD8DE, 0x525E, 0xD8DF, 0x5261, 0xD8E0, 0x525C,\n\t0xD8E1, 0x84AF, 0xD8E2, 0x527D, 0xD8E3, 0x5282, 0xD8E4, 0x5281,\t0xD8E5, 0x5290, 0xD8E6, 0x5293, 0xD8E7, 0x5182, 0xD8E8, 0x7F54,\n\t0xD8E9, 0x4EBB, 0xD8EA, 0x4EC3, 0xD8EB, 0x4EC9, 0xD8EC, 0x4EC2,\t0xD8ED, 0x4EE8, 0xD8EE, 0x4EE1, 0xD8EF, 0x4EEB, 0xD8F0, 0x4EDE,\n\t0xD8F1, 0x4F1B, 0xD8F2, 0x4EF3, 0xD8F3, 0x4F22, 0xD8F4, 0x4F64,\t0xD8F5, 0x4EF5, 0xD8F6, 0x4F25, 0xD8F7, 0x4F27, 0xD8F8, 0x4F09,\n\t0xD8F9, 0x4F2B, 0xD8FA, 0x4F5E, 0xD8FB, 0x4F67, 0xD8FC, 0x6538,\t0xD8FD, 0x4F5A, 0xD8FE, 0x4F5D, 0xD940, 0x8CAE, 0xD941, 0x8CAF,\n\t0xD942, 0x8CB0, 0xD943, 0x8CB1, 0xD944, 0x8CB2, 0xD945, 0x8CB3,\t0xD946, 0x8CB4, 0xD947, 0x8CB5, 0xD948, 0x8CB6, 0xD949, 0x8CB7,\n\t0xD94A, 0x8CB8, 0xD94B, 0x8CB9, 0xD94C, 0x8CBA, 0xD94D, 0x8CBB,\t0xD94E, 0x8CBC, 0xD94F, 0x8CBD, 0xD950, 0x8CBE, 0xD951, 0x8CBF,\n\t0xD952, 0x8CC0, 0xD953, 0x8CC1, 0xD954, 0x8CC2, 0xD955, 0x8CC3,\t0xD956, 0x8CC4, 0xD957, 0x8CC5, 0xD958, 0x8CC6, 0xD959, 0x8CC7,\n\t0xD95A, 0x8CC8, 0xD95B, 0x8CC9, 0xD95C, 0x8CCA, 0xD95D, 0x8CCB,\t0xD95E, 0x8CCC, 0xD95F, 0x8CCD, 0xD960, 0x8CCE, 0xD961, 0x8CCF,\n\t0xD962, 0x8CD0, 0xD963, 0x8CD1, 0xD964, 0x8CD2, 0xD965, 0x8CD3,\t0xD966, 0x8CD4, 0xD967, 0x8CD5, 0xD968, 0x8CD6, 0xD969, 0x8CD7,\n\t0xD96A, 0x8CD8, 0xD96B, 0x8CD9, 0xD96C, 0x8CDA, 0xD96D, 0x8CDB,\t0xD96E, 0x8CDC, 0xD96F, 0x8CDD, 0xD970, 0x8CDE, 0xD971, 0x8CDF,\n\t0xD972, 0x8CE0, 0xD973, 0x8CE1, 0xD974, 0x8CE2, 0xD975, 0x8CE3,\t0xD976, 0x8CE4, 0xD977, 0x8CE5, 0xD978, 0x8CE6, 0xD979, 0x8CE7,\n\t0xD97A, 0x8CE8, 0xD97B, 0x8CE9, 0xD97C, 0x8CEA, 0xD97D, 0x8CEB,\t0xD97E, 0x8CEC, 0xD980, 0x8CED, 0xD981, 0x8CEE, 0xD982, 0x8CEF,\n\t0xD983, 0x8CF0, 0xD984, 0x8CF1, 0xD985, 0x8CF2, 0xD986, 0x8CF3,\t0xD987, 0x8CF4, 0xD988, 0x8CF5, 0xD989, 0x8CF6, 0xD98A, 0x8CF7,\n\t0xD98B, 0x8CF8, 0xD98C, 0x8CF9, 0xD98D, 0x8CFA, 0xD98E, 0x8CFB,\t0xD98F, 0x8CFC, 0xD990, 0x8CFD, 0xD991, 0x8CFE, 0xD992, 0x8CFF,\n\t0xD993, 0x8D00, 0xD994, 0x8D01, 0xD995, 0x8D02, 0xD996, 0x8D03,\t0xD997, 0x8D04, 0xD998, 0x8D05, 0xD999, 0x8D06, 0xD99A, 0x8D07,\n\t0xD99B, 0x8D08, 0xD99C, 0x8D09, 0xD99D, 0x8D0A, 0xD99E, 0x8D0B,\t0xD99F, 0x8D0C, 0xD9A0, 0x8D0D, 0xD9A1, 0x4F5F, 0xD9A2, 0x4F57,\n\t0xD9A3, 0x4F32, 0xD9A4, 0x4F3D, 0xD9A5, 0x4F76, 0xD9A6, 0x4F74,\t0xD9A7, 0x4F91, 0xD9A8, 0x4F89, 0xD9A9, 0x4F83, 0xD9AA, 0x4F8F,\n\t0xD9AB, 0x4F7E, 0xD9AC, 0x4F7B, 0xD9AD, 0x4FAA, 0xD9AE, 0x4F7C,\t0xD9AF, 0x4FAC, 0xD9B0, 0x4F94, 0xD9B1, 0x4FE6, 0xD9B2, 0x4FE8,\n\t0xD9B3, 0x4FEA, 0xD9B4, 0x4FC5, 0xD9B5, 0x4FDA, 0xD9B6, 0x4FE3,\t0xD9B7, 0x4FDC, 0xD9B8, 0x4FD1, 0xD9B9, 0x4FDF, 0xD9BA, 0x4FF8,\n\t0xD9BB, 0x5029, 0xD9BC, 0x504C, 0xD9BD, 0x4FF3, 0xD9BE, 0x502C,\t0xD9BF, 0x500F, 0xD9C0, 0x502E, 0xD9C1, 0x502D, 0xD9C2, 0x4FFE,\n\t0xD9C3, 0x501C, 0xD9C4, 0x500C, 0xD9C5, 0x5025, 0xD9C6, 0x5028,\t0xD9C7, 0x507E, 0xD9C8, 0x5043, 0xD9C9, 0x5055, 0xD9CA, 0x5048,\n\t0xD9CB, 0x504E, 0xD9CC, 0x506C, 0xD9CD, 0x507B, 0xD9CE, 0x50A5,\t0xD9CF, 0x50A7, 0xD9D0, 0x50A9, 0xD9D1, 0x50BA, 0xD9D2, 0x50D6,\n\t0xD9D3, 0x5106, 0xD9D4, 0x50ED, 0xD9D5, 0x50EC, 0xD9D6, 0x50E6,\t0xD9D7, 0x50EE, 0xD9D8, 0x5107, 0xD9D9, 0x510B, 0xD9DA, 0x4EDD,\n\t0xD9DB, 0x6C3D, 0xD9DC, 0x4F58, 0xD9DD, 0x4F65, 0xD9DE, 0x4FCE,\t0xD9DF, 0x9FA0, 0xD9E0, 0x6C46, 0xD9E1, 0x7C74, 0xD9E2, 0x516E,\n\t0xD9E3, 0x5DFD, 0xD9E4, 0x9EC9, 0xD9E5, 0x9998, 0xD9E6, 0x5181,\t0xD9E7, 0x5914, 0xD9E8, 0x52F9, 0xD9E9, 0x530D, 0xD9EA, 0x8A07,\n\t0xD9EB, 0x5310, 0xD9EC, 0x51EB, 0xD9ED, 0x5919, 0xD9EE, 0x5155,\t0xD9EF, 0x4EA0, 0xD9F0, 0x5156, 0xD9F1, 0x4EB3, 0xD9F2, 0x886E,\n\t0xD9F3, 0x88A4, 0xD9F4, 0x4EB5, 0xD9F5, 0x8114, 0xD9F6, 0x88D2,\t0xD9F7, 0x7980, 0xD9F8, 0x5B34, 0xD9F9, 0x8803, 0xD9FA, 0x7FB8,\n\t0xD9FB, 0x51AB, 0xD9FC, 0x51B1, 0xD9FD, 0x51BD, 0xD9FE, 0x51BC,\t0xDA40, 0x8D0E, 0xDA41, 0x8D0F, 0xDA42, 0x8D10, 0xDA43, 0x8D11,\n\t0xDA44, 0x8D12, 0xDA45, 0x8D13, 0xDA46, 0x8D14, 0xDA47, 0x8D15,\t0xDA48, 0x8D16, 0xDA49, 0x8D17, 0xDA4A, 0x8D18, 0xDA4B, 0x8D19,\n\t0xDA4C, 0x8D1A, 0xDA4D, 0x8D1B, 0xDA4E, 0x8D1C, 0xDA4F, 0x8D20,\t0xDA50, 0x8D51, 0xDA51, 0x8D52, 0xDA52, 0x8D57, 0xDA53, 0x8D5F,\n\t0xDA54, 0x8D65, 0xDA55, 0x8D68, 0xDA56, 0x8D69, 0xDA57, 0x8D6A,\t0xDA58, 0x8D6C, 0xDA59, 0x8D6E, 0xDA5A, 0x8D6F, 0xDA5B, 0x8D71,\n\t0xDA5C, 0x8D72, 0xDA5D, 0x8D78, 0xDA5E, 0x8D79, 0xDA5F, 0x8D7A,\t0xDA60, 0x8D7B, 0xDA61, 0x8D7C, 0xDA62, 0x8D7D, 0xDA63, 0x8D7E,\n\t0xDA64, 0x8D7F, 0xDA65, 0x8D80, 0xDA66, 0x8D82, 0xDA67, 0x8D83,\t0xDA68, 0x8D86, 0xDA69, 0x8D87, 0xDA6A, 0x8D88, 0xDA6B, 0x8D89,\n\t0xDA6C, 0x8D8C, 0xDA6D, 0x8D8D, 0xDA6E, 0x8D8E, 0xDA6F, 0x8D8F,\t0xDA70, 0x8D90, 0xDA71, 0x8D92, 0xDA72, 0x8D93, 0xDA73, 0x8D95,\n\t0xDA74, 0x8D96, 0xDA75, 0x8D97, 0xDA76, 0x8D98, 0xDA77, 0x8D99,\t0xDA78, 0x8D9A, 0xDA79, 0x8D9B, 0xDA7A, 0x8D9C, 0xDA7B, 0x8D9D,\n\t0xDA7C, 0x8D9E, 0xDA7D, 0x8DA0, 0xDA7E, 0x8DA1, 0xDA80, 0x8DA2,\t0xDA81, 0x8DA4, 0xDA82, 0x8DA5, 0xDA83, 0x8DA6, 0xDA84, 0x8DA7,\n\t0xDA85, 0x8DA8, 0xDA86, 0x8DA9, 0xDA87, 0x8DAA, 0xDA88, 0x8DAB,\t0xDA89, 0x8DAC, 0xDA8A, 0x8DAD, 0xDA8B, 0x8DAE, 0xDA8C, 0x8DAF,\n\t0xDA8D, 0x8DB0, 0xDA8E, 0x8DB2, 0xDA8F, 0x8DB6, 0xDA90, 0x8DB7,\t0xDA91, 0x8DB9, 0xDA92, 0x8DBB, 0xDA93, 0x8DBD, 0xDA94, 0x8DC0,\n\t0xDA95, 0x8DC1, 0xDA96, 0x8DC2, 0xDA97, 0x8DC5, 0xDA98, 0x8DC7,\t0xDA99, 0x8DC8, 0xDA9A, 0x8DC9, 0xDA9B, 0x8DCA, 0xDA9C, 0x8DCD,\n\t0xDA9D, 0x8DD0, 0xDA9E, 0x8DD2, 0xDA9F, 0x8DD3, 0xDAA0, 0x8DD4,\t0xDAA1, 0x51C7, 0xDAA2, 0x5196, 0xDAA3, 0x51A2, 0xDAA4, 0x51A5,\n\t0xDAA5, 0x8BA0, 0xDAA6, 0x8BA6, 0xDAA7, 0x8BA7, 0xDAA8, 0x8BAA,\t0xDAA9, 0x8BB4, 0xDAAA, 0x8BB5, 0xDAAB, 0x8BB7, 0xDAAC, 0x8BC2,\n\t0xDAAD, 0x8BC3, 0xDAAE, 0x8BCB, 0xDAAF, 0x8BCF, 0xDAB0, 0x8BCE,\t0xDAB1, 0x8BD2, 0xDAB2, 0x8BD3, 0xDAB3, 0x8BD4, 0xDAB4, 0x8BD6,\n\t0xDAB5, 0x8BD8, 0xDAB6, 0x8BD9, 0xDAB7, 0x8BDC, 0xDAB8, 0x8BDF,\t0xDAB9, 0x8BE0, 0xDABA, 0x8BE4, 0xDABB, 0x8BE8, 0xDABC, 0x8BE9,\n\t0xDABD, 0x8BEE, 0xDABE, 0x8BF0, 0xDABF, 0x8BF3, 0xDAC0, 0x8BF6,\t0xDAC1, 0x8BF9, 0xDAC2, 0x8BFC, 0xDAC3, 0x8BFF, 0xDAC4, 0x8C00,\n\t0xDAC5, 0x8C02, 0xDAC6, 0x8C04, 0xDAC7, 0x8C07, 0xDAC8, 0x8C0C,\t0xDAC9, 0x8C0F, 0xDACA, 0x8C11, 0xDACB, 0x8C12, 0xDACC, 0x8C14,\n\t0xDACD, 0x8C15, 0xDACE, 0x8C16, 0xDACF, 0x8C19, 0xDAD0, 0x8C1B,\t0xDAD1, 0x8C18, 0xDAD2, 0x8C1D, 0xDAD3, 0x8C1F, 0xDAD4, 0x8C20,\n\t0xDAD5, 0x8C21, 0xDAD6, 0x8C25, 0xDAD7, 0x8C27, 0xDAD8, 0x8C2A,\t0xDAD9, 0x8C2B, 0xDADA, 0x8C2E, 0xDADB, 0x8C2F, 0xDADC, 0x8C32,\n\t0xDADD, 0x8C33, 0xDADE, 0x8C35, 0xDADF, 0x8C36, 0xDAE0, 0x5369,\t0xDAE1, 0x537A, 0xDAE2, 0x961D, 0xDAE3, 0x9622, 0xDAE4, 0x9621,\n\t0xDAE5, 0x9631, 0xDAE6, 0x962A, 0xDAE7, 0x963D, 0xDAE8, 0x963C,\t0xDAE9, 0x9642, 0xDAEA, 0x9649, 0xDAEB, 0x9654, 0xDAEC, 0x965F,\n\t0xDAED, 0x9667, 0xDAEE, 0x966C, 0xDAEF, 0x9672, 0xDAF0, 0x9674,\t0xDAF1, 0x9688, 0xDAF2, 0x968D, 0xDAF3, 0x9697, 0xDAF4, 0x96B0,\n\t0xDAF5, 0x9097, 0xDAF6, 0x909B, 0xDAF7, 0x909D, 0xDAF8, 0x9099,\t0xDAF9, 0x90AC, 0xDAFA, 0x90A1, 0xDAFB, 0x90B4, 0xDAFC, 0x90B3,\n\t0xDAFD, 0x90B6, 0xDAFE, 0x90BA, 0xDB40, 0x8DD5, 0xDB41, 0x8DD8,\t0xDB42, 0x8DD9, 0xDB43, 0x8DDC, 0xDB44, 0x8DE0, 0xDB45, 0x8DE1,\n\t0xDB46, 0x8DE2, 0xDB47, 0x8DE5, 0xDB48, 0x8DE6, 0xDB49, 0x8DE7,\t0xDB4A, 0x8DE9, 0xDB4B, 0x8DED, 0xDB4C, 0x8DEE, 0xDB4D, 0x8DF0,\n\t0xDB4E, 0x8DF1, 0xDB4F, 0x8DF2, 0xDB50, 0x8DF4, 0xDB51, 0x8DF6,\t0xDB52, 0x8DFC, 0xDB53, 0x8DFE, 0xDB54, 0x8DFF, 0xDB55, 0x8E00,\n\t0xDB56, 0x8E01, 0xDB57, 0x8E02, 0xDB58, 0x8E03, 0xDB59, 0x8E04,\t0xDB5A, 0x8E06, 0xDB5B, 0x8E07, 0xDB5C, 0x8E08, 0xDB5D, 0x8E0B,\n\t0xDB5E, 0x8E0D, 0xDB5F, 0x8E0E, 0xDB60, 0x8E10, 0xDB61, 0x8E11,\t0xDB62, 0x8E12, 0xDB63, 0x8E13, 0xDB64, 0x8E15, 0xDB65, 0x8E16,\n\t0xDB66, 0x8E17, 0xDB67, 0x8E18, 0xDB68, 0x8E19, 0xDB69, 0x8E1A,\t0xDB6A, 0x8E1B, 0xDB6B, 0x8E1C, 0xDB6C, 0x8E20, 0xDB6D, 0x8E21,\n\t0xDB6E, 0x8E24, 0xDB6F, 0x8E25, 0xDB70, 0x8E26, 0xDB71, 0x8E27,\t0xDB72, 0x8E28, 0xDB73, 0x8E2B, 0xDB74, 0x8E2D, 0xDB75, 0x8E30,\n\t0xDB76, 0x8E32, 0xDB77, 0x8E33, 0xDB78, 0x8E34, 0xDB79, 0x8E36,\t0xDB7A, 0x8E37, 0xDB7B, 0x8E38, 0xDB7C, 0x8E3B, 0xDB7D, 0x8E3C,\n\t0xDB7E, 0x8E3E, 0xDB80, 0x8E3F, 0xDB81, 0x8E43, 0xDB82, 0x8E45,\t0xDB83, 0x8E46, 0xDB84, 0x8E4C, 0xDB85, 0x8E4D, 0xDB86, 0x8E4E,\n\t0xDB87, 0x8E4F, 0xDB88, 0x8E50, 0xDB89, 0x8E53, 0xDB8A, 0x8E54,\t0xDB8B, 0x8E55, 0xDB8C, 0x8E56, 0xDB8D, 0x8E57, 0xDB8E, 0x8E58,\n\t0xDB8F, 0x8E5A, 0xDB90, 0x8E5B, 0xDB91, 0x8E5C, 0xDB92, 0x8E5D,\t0xDB93, 0x8E5E, 0xDB94, 0x8E5F, 0xDB95, 0x8E60, 0xDB96, 0x8E61,\n\t0xDB97, 0x8E62, 0xDB98, 0x8E63, 0xDB99, 0x8E64, 0xDB9A, 0x8E65,\t0xDB9B, 0x8E67, 0xDB9C, 0x8E68, 0xDB9D, 0x8E6A, 0xDB9E, 0x8E6B,\n\t0xDB9F, 0x8E6E, 0xDBA0, 0x8E71, 0xDBA1, 0x90B8, 0xDBA2, 0x90B0,\t0xDBA3, 0x90CF, 0xDBA4, 0x90C5, 0xDBA5, 0x90BE, 0xDBA6, 0x90D0,\n\t0xDBA7, 0x90C4, 0xDBA8, 0x90C7, 0xDBA9, 0x90D3, 0xDBAA, 0x90E6,\t0xDBAB, 0x90E2, 0xDBAC, 0x90DC, 0xDBAD, 0x90D7, 0xDBAE, 0x90DB,\n\t0xDBAF, 0x90EB, 0xDBB0, 0x90EF, 0xDBB1, 0x90FE, 0xDBB2, 0x9104,\t0xDBB3, 0x9122, 0xDBB4, 0x911E, 0xDBB5, 0x9123, 0xDBB6, 0x9131,\n\t0xDBB7, 0x912F, 0xDBB8, 0x9139, 0xDBB9, 0x9143, 0xDBBA, 0x9146,\t0xDBBB, 0x520D, 0xDBBC, 0x5942, 0xDBBD, 0x52A2, 0xDBBE, 0x52AC,\n\t0xDBBF, 0x52AD, 0xDBC0, 0x52BE, 0xDBC1, 0x54FF, 0xDBC2, 0x52D0,\t0xDBC3, 0x52D6, 0xDBC4, 0x52F0, 0xDBC5, 0x53DF, 0xDBC6, 0x71EE,\n\t0xDBC7, 0x77CD, 0xDBC8, 0x5EF4, 0xDBC9, 0x51F5, 0xDBCA, 0x51FC,\t0xDBCB, 0x9B2F, 0xDBCC, 0x53B6, 0xDBCD, 0x5F01, 0xDBCE, 0x755A,\n\t0xDBCF, 0x5DEF, 0xDBD0, 0x574C, 0xDBD1, 0x57A9, 0xDBD2, 0x57A1,\t0xDBD3, 0x587E, 0xDBD4, 0x58BC, 0xDBD5, 0x58C5, 0xDBD6, 0x58D1,\n\t0xDBD7, 0x5729, 0xDBD8, 0x572C, 0xDBD9, 0x572A, 0xDBDA, 0x5733,\t0xDBDB, 0x5739, 0xDBDC, 0x572E, 0xDBDD, 0x572F, 0xDBDE, 0x575C,\n\t0xDBDF, 0x573B, 0xDBE0, 0x5742, 0xDBE1, 0x5769, 0xDBE2, 0x5785,\t0xDBE3, 0x576B, 0xDBE4, 0x5786, 0xDBE5, 0x577C, 0xDBE6, 0x577B,\n\t0xDBE7, 0x5768, 0xDBE8, 0x576D, 0xDBE9, 0x5776, 0xDBEA, 0x5773,\t0xDBEB, 0x57AD, 0xDBEC, 0x57A4, 0xDBED, 0x578C, 0xDBEE, 0x57B2,\n\t0xDBEF, 0x57CF, 0xDBF0, 0x57A7, 0xDBF1, 0x57B4, 0xDBF2, 0x5793,\t0xDBF3, 0x57A0, 0xDBF4, 0x57D5, 0xDBF5, 0x57D8, 0xDBF6, 0x57DA,\n\t0xDBF7, 0x57D9, 0xDBF8, 0x57D2, 0xDBF9, 0x57B8, 0xDBFA, 0x57F4,\t0xDBFB, 0x57EF, 0xDBFC, 0x57F8, 0xDBFD, 0x57E4, 0xDBFE, 0x57DD,\n\t0xDC40, 0x8E73, 0xDC41, 0x8E75, 0xDC42, 0x8E77, 0xDC43, 0x8E78,\t0xDC44, 0x8E79, 0xDC45, 0x8E7A, 0xDC46, 0x8E7B, 0xDC47, 0x8E7D,\n\t0xDC48, 0x8E7E, 0xDC49, 0x8E80, 0xDC4A, 0x8E82, 0xDC4B, 0x8E83,\t0xDC4C, 0x8E84, 0xDC4D, 0x8E86, 0xDC4E, 0x8E88, 0xDC4F, 0x8E89,\n\t0xDC50, 0x8E8A, 0xDC51, 0x8E8B, 0xDC52, 0x8E8C, 0xDC53, 0x8E8D,\t0xDC54, 0x8E8E, 0xDC55, 0x8E91, 0xDC56, 0x8E92, 0xDC57, 0x8E93,\n\t0xDC58, 0x8E95, 0xDC59, 0x8E96, 0xDC5A, 0x8E97, 0xDC5B, 0x8E98,\t0xDC5C, 0x8E99, 0xDC5D, 0x8E9A, 0xDC5E, 0x8E9B, 0xDC5F, 0x8E9D,\n\t0xDC60, 0x8E9F, 0xDC61, 0x8EA0, 0xDC62, 0x8EA1, 0xDC63, 0x8EA2,\t0xDC64, 0x8EA3, 0xDC65, 0x8EA4, 0xDC66, 0x8EA5, 0xDC67, 0x8EA6,\n\t0xDC68, 0x8EA7, 0xDC69, 0x8EA8, 0xDC6A, 0x8EA9, 0xDC6B, 0x8EAA,\t0xDC6C, 0x8EAD, 0xDC6D, 0x8EAE, 0xDC6E, 0x8EB0, 0xDC6F, 0x8EB1,\n\t0xDC70, 0x8EB3, 0xDC71, 0x8EB4, 0xDC72, 0x8EB5, 0xDC73, 0x8EB6,\t0xDC74, 0x8EB7, 0xDC75, 0x8EB8, 0xDC76, 0x8EB9, 0xDC77, 0x8EBB,\n\t0xDC78, 0x8EBC, 0xDC79, 0x8EBD, 0xDC7A, 0x8EBE, 0xDC7B, 0x8EBF,\t0xDC7C, 0x8EC0, 0xDC7D, 0x8EC1, 0xDC7E, 0x8EC2, 0xDC80, 0x8EC3,\n\t0xDC81, 0x8EC4, 0xDC82, 0x8EC5, 0xDC83, 0x8EC6, 0xDC84, 0x8EC7,\t0xDC85, 0x8EC8, 0xDC86, 0x8EC9, 0xDC87, 0x8ECA, 0xDC88, 0x8ECB,\n\t0xDC89, 0x8ECC, 0xDC8A, 0x8ECD, 0xDC8B, 0x8ECF, 0xDC8C, 0x8ED0,\t0xDC8D, 0x8ED1, 0xDC8E, 0x8ED2, 0xDC8F, 0x8ED3, 0xDC90, 0x8ED4,\n\t0xDC91, 0x8ED5, 0xDC92, 0x8ED6, 0xDC93, 0x8ED7, 0xDC94, 0x8ED8,\t0xDC95, 0x8ED9, 0xDC96, 0x8EDA, 0xDC97, 0x8EDB, 0xDC98, 0x8EDC,\n\t0xDC99, 0x8EDD, 0xDC9A, 0x8EDE, 0xDC9B, 0x8EDF, 0xDC9C, 0x8EE0,\t0xDC9D, 0x8EE1, 0xDC9E, 0x8EE2, 0xDC9F, 0x8EE3, 0xDCA0, 0x8EE4,\n\t0xDCA1, 0x580B, 0xDCA2, 0x580D, 0xDCA3, 0x57FD, 0xDCA4, 0x57ED,\t0xDCA5, 0x5800, 0xDCA6, 0x581E, 0xDCA7, 0x5819, 0xDCA8, 0x5844,\n\t0xDCA9, 0x5820, 0xDCAA, 0x5865, 0xDCAB, 0x586C, 0xDCAC, 0x5881,\t0xDCAD, 0x5889, 0xDCAE, 0x589A, 0xDCAF, 0x5880, 0xDCB0, 0x99A8,\n\t0xDCB1, 0x9F19, 0xDCB2, 0x61FF, 0xDCB3, 0x8279, 0xDCB4, 0x827D,\t0xDCB5, 0x827F, 0xDCB6, 0x828F, 0xDCB7, 0x828A, 0xDCB8, 0x82A8,\n\t0xDCB9, 0x8284, 0xDCBA, 0x828E, 0xDCBB, 0x8291, 0xDCBC, 0x8297,\t0xDCBD, 0x8299, 0xDCBE, 0x82AB, 0xDCBF, 0x82B8, 0xDCC0, 0x82BE,\n\t0xDCC1, 0x82B0, 0xDCC2, 0x82C8, 0xDCC3, 0x82CA, 0xDCC4, 0x82E3,\t0xDCC5, 0x8298, 0xDCC6, 0x82B7, 0xDCC7, 0x82AE, 0xDCC8, 0x82CB,\n\t0xDCC9, 0x82CC, 0xDCCA, 0x82C1, 0xDCCB, 0x82A9, 0xDCCC, 0x82B4,\t0xDCCD, 0x82A1, 0xDCCE, 0x82AA, 0xDCCF, 0x829F, 0xDCD0, 0x82C4,\n\t0xDCD1, 0x82CE, 0xDCD2, 0x82A4, 0xDCD3, 0x82E1, 0xDCD4, 0x8309,\t0xDCD5, 0x82F7, 0xDCD6, 0x82E4, 0xDCD7, 0x830F, 0xDCD8, 0x8307,\n\t0xDCD9, 0x82DC, 0xDCDA, 0x82F4, 0xDCDB, 0x82D2, 0xDCDC, 0x82D8,\t0xDCDD, 0x830C, 0xDCDE, 0x82FB, 0xDCDF, 0x82D3, 0xDCE0, 0x8311,\n\t0xDCE1, 0x831A, 0xDCE2, 0x8306, 0xDCE3, 0x8314, 0xDCE4, 0x8315,\t0xDCE5, 0x82E0, 0xDCE6, 0x82D5, 0xDCE7, 0x831C, 0xDCE8, 0x8351,\n\t0xDCE9, 0x835B, 0xDCEA, 0x835C, 0xDCEB, 0x8308, 0xDCEC, 0x8392,\t0xDCED, 0x833C, 0xDCEE, 0x8334, 0xDCEF, 0x8331, 0xDCF0, 0x839B,\n\t0xDCF1, 0x835E, 0xDCF2, 0x832F, 0xDCF3, 0x834F, 0xDCF4, 0x8347,\t0xDCF5, 0x8343, 0xDCF6, 0x835F, 0xDCF7, 0x8340, 0xDCF8, 0x8317,\n\t0xDCF9, 0x8360, 0xDCFA, 0x832D, 0xDCFB, 0x833A, 0xDCFC, 0x8333,\t0xDCFD, 0x8366, 0xDCFE, 0x8365, 0xDD40, 0x8EE5, 0xDD41, 0x8EE6,\n\t0xDD42, 0x8EE7, 0xDD43, 0x8EE8, 0xDD44, 0x8EE9, 0xDD45, 0x8EEA,\t0xDD46, 0x8EEB, 0xDD47, 0x8EEC, 0xDD48, 0x8EED, 0xDD49, 0x8EEE,\n\t0xDD4A, 0x8EEF, 0xDD4B, 0x8EF0, 0xDD4C, 0x8EF1, 0xDD4D, 0x8EF2,\t0xDD4E, 0x8EF3, 0xDD4F, 0x8EF4, 0xDD50, 0x8EF5, 0xDD51, 0x8EF6,\n\t0xDD52, 0x8EF7, 0xDD53, 0x8EF8, 0xDD54, 0x8EF9, 0xDD55, 0x8EFA,\t0xDD56, 0x8EFB, 0xDD57, 0x8EFC, 0xDD58, 0x8EFD, 0xDD59, 0x8EFE,\n\t0xDD5A, 0x8EFF, 0xDD5B, 0x8F00, 0xDD5C, 0x8F01, 0xDD5D, 0x8F02,\t0xDD5E, 0x8F03, 0xDD5F, 0x8F04, 0xDD60, 0x8F05, 0xDD61, 0x8F06,\n\t0xDD62, 0x8F07, 0xDD63, 0x8F08, 0xDD64, 0x8F09, 0xDD65, 0x8F0A,\t0xDD66, 0x8F0B, 0xDD67, 0x8F0C, 0xDD68, 0x8F0D, 0xDD69, 0x8F0E,\n\t0xDD6A, 0x8F0F, 0xDD6B, 0x8F10, 0xDD6C, 0x8F11, 0xDD6D, 0x8F12,\t0xDD6E, 0x8F13, 0xDD6F, 0x8F14, 0xDD70, 0x8F15, 0xDD71, 0x8F16,\n\t0xDD72, 0x8F17, 0xDD73, 0x8F18, 0xDD74, 0x8F19, 0xDD75, 0x8F1A,\t0xDD76, 0x8F1B, 0xDD77, 0x8F1C, 0xDD78, 0x8F1D, 0xDD79, 0x8F1E,\n\t0xDD7A, 0x8F1F, 0xDD7B, 0x8F20, 0xDD7C, 0x8F21, 0xDD7D, 0x8F22,\t0xDD7E, 0x8F23, 0xDD80, 0x8F24, 0xDD81, 0x8F25, 0xDD82, 0x8F26,\n\t0xDD83, 0x8F27, 0xDD84, 0x8F28, 0xDD85, 0x8F29, 0xDD86, 0x8F2A,\t0xDD87, 0x8F2B, 0xDD88, 0x8F2C, 0xDD89, 0x8F2D, 0xDD8A, 0x8F2E,\n\t0xDD8B, 0x8F2F, 0xDD8C, 0x8F30, 0xDD8D, 0x8F31, 0xDD8E, 0x8F32,\t0xDD8F, 0x8F33, 0xDD90, 0x8F34, 0xDD91, 0x8F35, 0xDD92, 0x8F36,\n\t0xDD93, 0x8F37, 0xDD94, 0x8F38, 0xDD95, 0x8F39, 0xDD96, 0x8F3A,\t0xDD97, 0x8F3B, 0xDD98, 0x8F3C, 0xDD99, 0x8F3D, 0xDD9A, 0x8F3E,\n\t0xDD9B, 0x8F3F, 0xDD9C, 0x8F40, 0xDD9D, 0x8F41, 0xDD9E, 0x8F42,\t0xDD9F, 0x8F43, 0xDDA0, 0x8F44, 0xDDA1, 0x8368, 0xDDA2, 0x831B,\n\t0xDDA3, 0x8369, 0xDDA4, 0x836C, 0xDDA5, 0x836A, 0xDDA6, 0x836D,\t0xDDA7, 0x836E, 0xDDA8, 0x83B0, 0xDDA9, 0x8378, 0xDDAA, 0x83B3,\n\t0xDDAB, 0x83B4, 0xDDAC, 0x83A0, 0xDDAD, 0x83AA, 0xDDAE, 0x8393,\t0xDDAF, 0x839C, 0xDDB0, 0x8385, 0xDDB1, 0x837C, 0xDDB2, 0x83B6,\n\t0xDDB3, 0x83A9, 0xDDB4, 0x837D, 0xDDB5, 0x83B8, 0xDDB6, 0x837B,\t0xDDB7, 0x8398, 0xDDB8, 0x839E, 0xDDB9, 0x83A8, 0xDDBA, 0x83BA,\n\t0xDDBB, 0x83BC, 0xDDBC, 0x83C1, 0xDDBD, 0x8401, 0xDDBE, 0x83E5,\t0xDDBF, 0x83D8, 0xDDC0, 0x5807, 0xDDC1, 0x8418, 0xDDC2, 0x840B,\n\t0xDDC3, 0x83DD, 0xDDC4, 0x83FD, 0xDDC5, 0x83D6, 0xDDC6, 0x841C,\t0xDDC7, 0x8438, 0xDDC8, 0x8411, 0xDDC9, 0x8406, 0xDDCA, 0x83D4,\n\t0xDDCB, 0x83DF, 0xDDCC, 0x840F, 0xDDCD, 0x8403, 0xDDCE, 0x83F8,\t0xDDCF, 0x83F9, 0xDDD0, 0x83EA, 0xDDD1, 0x83C5, 0xDDD2, 0x83C0,\n\t0xDDD3, 0x8426, 0xDDD4, 0x83F0, 0xDDD5, 0x83E1, 0xDDD6, 0x845C,\t0xDDD7, 0x8451, 0xDDD8, 0x845A, 0xDDD9, 0x8459, 0xDDDA, 0x8473,\n\t0xDDDB, 0x8487, 0xDDDC, 0x8488, 0xDDDD, 0x847A, 0xDDDE, 0x8489,\t0xDDDF, 0x8478, 0xDDE0, 0x843C, 0xDDE1, 0x8446, 0xDDE2, 0x8469,\n\t0xDDE3, 0x8476, 0xDDE4, 0x848C, 0xDDE5, 0x848E, 0xDDE6, 0x8431,\t0xDDE7, 0x846D, 0xDDE8, 0x84C1, 0xDDE9, 0x84CD, 0xDDEA, 0x84D0,\n\t0xDDEB, 0x84E6, 0xDDEC, 0x84BD, 0xDDED, 0x84D3, 0xDDEE, 0x84CA,\t0xDDEF, 0x84BF, 0xDDF0, 0x84BA, 0xDDF1, 0x84E0, 0xDDF2, 0x84A1,\n\t0xDDF3, 0x84B9, 0xDDF4, 0x84B4, 0xDDF5, 0x8497, 0xDDF6, 0x84E5,\t0xDDF7, 0x84E3, 0xDDF8, 0x850C, 0xDDF9, 0x750D, 0xDDFA, 0x8538,\n\t0xDDFB, 0x84F0, 0xDDFC, 0x8539, 0xDDFD, 0x851F, 0xDDFE, 0x853A,\t0xDE40, 0x8F45, 0xDE41, 0x8F46, 0xDE42, 0x8F47, 0xDE43, 0x8F48,\n\t0xDE44, 0x8F49, 0xDE45, 0x8F4A, 0xDE46, 0x8F4B, 0xDE47, 0x8F4C,\t0xDE48, 0x8F4D, 0xDE49, 0x8F4E, 0xDE4A, 0x8F4F, 0xDE4B, 0x8F50,\n\t0xDE4C, 0x8F51, 0xDE4D, 0x8F52, 0xDE4E, 0x8F53, 0xDE4F, 0x8F54,\t0xDE50, 0x8F55, 0xDE51, 0x8F56, 0xDE52, 0x8F57, 0xDE53, 0x8F58,\n\t0xDE54, 0x8F59, 0xDE55, 0x8F5A, 0xDE56, 0x8F5B, 0xDE57, 0x8F5C,\t0xDE58, 0x8F5D, 0xDE59, 0x8F5E, 0xDE5A, 0x8F5F, 0xDE5B, 0x8F60,\n\t0xDE5C, 0x8F61, 0xDE5D, 0x8F62, 0xDE5E, 0x8F63, 0xDE5F, 0x8F64,\t0xDE60, 0x8F65, 0xDE61, 0x8F6A, 0xDE62, 0x8F80, 0xDE63, 0x8F8C,\n\t0xDE64, 0x8F92, 0xDE65, 0x8F9D, 0xDE66, 0x8FA0, 0xDE67, 0x8FA1,\t0xDE68, 0x8FA2, 0xDE69, 0x8FA4, 0xDE6A, 0x8FA5, 0xDE6B, 0x8FA6,\n\t0xDE6C, 0x8FA7, 0xDE6D, 0x8FAA, 0xDE6E, 0x8FAC, 0xDE6F, 0x8FAD,\t0xDE70, 0x8FAE, 0xDE71, 0x8FAF, 0xDE72, 0x8FB2, 0xDE73, 0x8FB3,\n\t0xDE74, 0x8FB4, 0xDE75, 0x8FB5, 0xDE76, 0x8FB7, 0xDE77, 0x8FB8,\t0xDE78, 0x8FBA, 0xDE79, 0x8FBB, 0xDE7A, 0x8FBC, 0xDE7B, 0x8FBF,\n\t0xDE7C, 0x8FC0, 0xDE7D, 0x8FC3, 0xDE7E, 0x8FC6, 0xDE80, 0x8FC9,\t0xDE81, 0x8FCA, 0xDE82, 0x8FCB, 0xDE83, 0x8FCC, 0xDE84, 0x8FCD,\n\t0xDE85, 0x8FCF, 0xDE86, 0x8FD2, 0xDE87, 0x8FD6, 0xDE88, 0x8FD7,\t0xDE89, 0x8FDA, 0xDE8A, 0x8FE0, 0xDE8B, 0x8FE1, 0xDE8C, 0x8FE3,\n\t0xDE8D, 0x8FE7, 0xDE8E, 0x8FEC, 0xDE8F, 0x8FEF, 0xDE90, 0x8FF1,\t0xDE91, 0x8FF2, 0xDE92, 0x8FF4, 0xDE93, 0x8FF5, 0xDE94, 0x8FF6,\n\t0xDE95, 0x8FFA, 0xDE96, 0x8FFB, 0xDE97, 0x8FFC, 0xDE98, 0x8FFE,\t0xDE99, 0x8FFF, 0xDE9A, 0x9007, 0xDE9B, 0x9008, 0xDE9C, 0x900C,\n\t0xDE9D, 0x900E, 0xDE9E, 0x9013, 0xDE9F, 0x9015, 0xDEA0, 0x9018,\t0xDEA1, 0x8556, 0xDEA2, 0x853B, 0xDEA3, 0x84FF, 0xDEA4, 0x84FC,\n\t0xDEA5, 0x8559, 0xDEA6, 0x8548, 0xDEA7, 0x8568, 0xDEA8, 0x8564,\t0xDEA9, 0x855E, 0xDEAA, 0x857A, 0xDEAB, 0x77A2, 0xDEAC, 0x8543,\n\t0xDEAD, 0x8572, 0xDEAE, 0x857B, 0xDEAF, 0x85A4, 0xDEB0, 0x85A8,\t0xDEB1, 0x8587, 0xDEB2, 0x858F, 0xDEB3, 0x8579, 0xDEB4, 0x85AE,\n\t0xDEB5, 0x859C, 0xDEB6, 0x8585, 0xDEB7, 0x85B9, 0xDEB8, 0x85B7,\t0xDEB9, 0x85B0, 0xDEBA, 0x85D3, 0xDEBB, 0x85C1, 0xDEBC, 0x85DC,\n\t0xDEBD, 0x85FF, 0xDEBE, 0x8627, 0xDEBF, 0x8605, 0xDEC0, 0x8629,\t0xDEC1, 0x8616, 0xDEC2, 0x863C, 0xDEC3, 0x5EFE, 0xDEC4, 0x5F08,\n\t0xDEC5, 0x593C, 0xDEC6, 0x5941, 0xDEC7, 0x8037, 0xDEC8, 0x5955,\t0xDEC9, 0x595A, 0xDECA, 0x5958, 0xDECB, 0x530F, 0xDECC, 0x5C22,\n\t0xDECD, 0x5C25, 0xDECE, 0x5C2C, 0xDECF, 0x5C34, 0xDED0, 0x624C,\t0xDED1, 0x626A, 0xDED2, 0x629F, 0xDED3, 0x62BB, 0xDED4, 0x62CA,\n\t0xDED5, 0x62DA, 0xDED6, 0x62D7, 0xDED7, 0x62EE, 0xDED8, 0x6322,\t0xDED9, 0x62F6, 0xDEDA, 0x6339, 0xDEDB, 0x634B, 0xDEDC, 0x6343,\n\t0xDEDD, 0x63AD, 0xDEDE, 0x63F6, 0xDEDF, 0x6371, 0xDEE0, 0x637A,\t0xDEE1, 0x638E, 0xDEE2, 0x63B4, 0xDEE3, 0x636D, 0xDEE4, 0x63AC,\n\t0xDEE5, 0x638A, 0xDEE6, 0x6369, 0xDEE7, 0x63AE, 0xDEE8, 0x63BC,\t0xDEE9, 0x63F2, 0xDEEA, 0x63F8, 0xDEEB, 0x63E0, 0xDEEC, 0x63FF,\n\t0xDEED, 0x63C4, 0xDEEE, 0x63DE, 0xDEEF, 0x63CE, 0xDEF0, 0x6452,\t0xDEF1, 0x63C6, 0xDEF2, 0x63BE, 0xDEF3, 0x6445, 0xDEF4, 0x6441,\n\t0xDEF5, 0x640B, 0xDEF6, 0x641B, 0xDEF7, 0x6420, 0xDEF8, 0x640C,\t0xDEF9, 0x6426, 0xDEFA, 0x6421, 0xDEFB, 0x645E, 0xDEFC, 0x6484,\n\t0xDEFD, 0x646D, 0xDEFE, 0x6496, 0xDF40, 0x9019, 0xDF41, 0x901C,\t0xDF42, 0x9023, 0xDF43, 0x9024, 0xDF44, 0x9025, 0xDF45, 0x9027,\n\t0xDF46, 0x9028, 0xDF47, 0x9029, 0xDF48, 0x902A, 0xDF49, 0x902B,\t0xDF4A, 0x902C, 0xDF4B, 0x9030, 0xDF4C, 0x9031, 0xDF4D, 0x9032,\n\t0xDF4E, 0x9033, 0xDF4F, 0x9034, 0xDF50, 0x9037, 0xDF51, 0x9039,\t0xDF52, 0x903A, 0xDF53, 0x903D, 0xDF54, 0x903F, 0xDF55, 0x9040,\n\t0xDF56, 0x9043, 0xDF57, 0x9045, 0xDF58, 0x9046, 0xDF59, 0x9048,\t0xDF5A, 0x9049, 0xDF5B, 0x904A, 0xDF5C, 0x904B, 0xDF5D, 0x904C,\n\t0xDF5E, 0x904E, 0xDF5F, 0x9054, 0xDF60, 0x9055, 0xDF61, 0x9056,\t0xDF62, 0x9059, 0xDF63, 0x905A, 0xDF64, 0x905C, 0xDF65, 0x905D,\n\t0xDF66, 0x905E, 0xDF67, 0x905F, 0xDF68, 0x9060, 0xDF69, 0x9061,\t0xDF6A, 0x9064, 0xDF6B, 0x9066, 0xDF6C, 0x9067, 0xDF6D, 0x9069,\n\t0xDF6E, 0x906A, 0xDF6F, 0x906B, 0xDF70, 0x906C, 0xDF71, 0x906F,\t0xDF72, 0x9070, 0xDF73, 0x9071, 0xDF74, 0x9072, 0xDF75, 0x9073,\n\t0xDF76, 0x9076, 0xDF77, 0x9077, 0xDF78, 0x9078, 0xDF79, 0x9079,\t0xDF7A, 0x907A, 0xDF7B, 0x907B, 0xDF7C, 0x907C, 0xDF7D, 0x907E,\n\t0xDF7E, 0x9081, 0xDF80, 0x9084, 0xDF81, 0x9085, 0xDF82, 0x9086,\t0xDF83, 0x9087, 0xDF84, 0x9089, 0xDF85, 0x908A, 0xDF86, 0x908C,\n\t0xDF87, 0x908D, 0xDF88, 0x908E, 0xDF89, 0x908F, 0xDF8A, 0x9090,\t0xDF8B, 0x9092, 0xDF8C, 0x9094, 0xDF8D, 0x9096, 0xDF8E, 0x9098,\n\t0xDF8F, 0x909A, 0xDF90, 0x909C, 0xDF91, 0x909E, 0xDF92, 0x909F,\t0xDF93, 0x90A0, 0xDF94, 0x90A4, 0xDF95, 0x90A5, 0xDF96, 0x90A7,\n\t0xDF97, 0x90A8, 0xDF98, 0x90A9, 0xDF99, 0x90AB, 0xDF9A, 0x90AD,\t0xDF9B, 0x90B2, 0xDF9C, 0x90B7, 0xDF9D, 0x90BC, 0xDF9E, 0x90BD,\n\t0xDF9F, 0x90BF, 0xDFA0, 0x90C0, 0xDFA1, 0x647A, 0xDFA2, 0x64B7,\t0xDFA3, 0x64B8, 0xDFA4, 0x6499, 0xDFA5, 0x64BA, 0xDFA6, 0x64C0,\n\t0xDFA7, 0x64D0, 0xDFA8, 0x64D7, 0xDFA9, 0x64E4, 0xDFAA, 0x64E2,\t0xDFAB, 0x6509, 0xDFAC, 0x6525, 0xDFAD, 0x652E, 0xDFAE, 0x5F0B,\n\t0xDFAF, 0x5FD2, 0xDFB0, 0x7519, 0xDFB1, 0x5F11, 0xDFB2, 0x535F,\t0xDFB3, 0x53F1, 0xDFB4, 0x53FD, 0xDFB5, 0x53E9, 0xDFB6, 0x53E8,\n\t0xDFB7, 0x53FB, 0xDFB8, 0x5412, 0xDFB9, 0x5416, 0xDFBA, 0x5406,\t0xDFBB, 0x544B, 0xDFBC, 0x5452, 0xDFBD, 0x5453, 0xDFBE, 0x5454,\n\t0xDFBF, 0x5456, 0xDFC0, 0x5443, 0xDFC1, 0x5421, 0xDFC2, 0x5457,\t0xDFC3, 0x5459, 0xDFC4, 0x5423, 0xDFC5, 0x5432, 0xDFC6, 0x5482,\n\t0xDFC7, 0x5494, 0xDFC8, 0x5477, 0xDFC9, 0x5471, 0xDFCA, 0x5464,\t0xDFCB, 0x549A, 0xDFCC, 0x549B, 0xDFCD, 0x5484, 0xDFCE, 0x5476,\n\t0xDFCF, 0x5466, 0xDFD0, 0x549D, 0xDFD1, 0x54D0, 0xDFD2, 0x54AD,\t0xDFD3, 0x54C2, 0xDFD4, 0x54B4, 0xDFD5, 0x54D2, 0xDFD6, 0x54A7,\n\t0xDFD7, 0x54A6, 0xDFD8, 0x54D3, 0xDFD9, 0x54D4, 0xDFDA, 0x5472,\t0xDFDB, 0x54A3, 0xDFDC, 0x54D5, 0xDFDD, 0x54BB, 0xDFDE, 0x54BF,\n\t0xDFDF, 0x54CC, 0xDFE0, 0x54D9, 0xDFE1, 0x54DA, 0xDFE2, 0x54DC,\t0xDFE3, 0x54A9, 0xDFE4, 0x54AA, 0xDFE5, 0x54A4, 0xDFE6, 0x54DD,\n\t0xDFE7, 0x54CF, 0xDFE8, 0x54DE, 0xDFE9, 0x551B, 0xDFEA, 0x54E7,\t0xDFEB, 0x5520, 0xDFEC, 0x54FD, 0xDFED, 0x5514, 0xDFEE, 0x54F3,\n\t0xDFEF, 0x5522, 0xDFF0, 0x5523, 0xDFF1, 0x550F, 0xDFF2, 0x5511,\t0xDFF3, 0x5527, 0xDFF4, 0x552A, 0xDFF5, 0x5567, 0xDFF6, 0x558F,\n\t0xDFF7, 0x55B5, 0xDFF8, 0x5549, 0xDFF9, 0x556D, 0xDFFA, 0x5541,\t0xDFFB, 0x5555, 0xDFFC, 0x553F, 0xDFFD, 0x5550, 0xDFFE, 0x553C,\n\t0xE040, 0x90C2, 0xE041, 0x90C3, 0xE042, 0x90C6, 0xE043, 0x90C8,\t0xE044, 0x90C9, 0xE045, 0x90CB, 0xE046, 0x90CC, 0xE047, 0x90CD,\n\t0xE048, 0x90D2, 0xE049, 0x90D4, 0xE04A, 0x90D5, 0xE04B, 0x90D6,\t0xE04C, 0x90D8, 0xE04D, 0x90D9, 0xE04E, 0x90DA, 0xE04F, 0x90DE,\n\t0xE050, 0x90DF, 0xE051, 0x90E0, 0xE052, 0x90E3, 0xE053, 0x90E4,\t0xE054, 0x90E5, 0xE055, 0x90E9, 0xE056, 0x90EA, 0xE057, 0x90EC,\n\t0xE058, 0x90EE, 0xE059, 0x90F0, 0xE05A, 0x90F1, 0xE05B, 0x90F2,\t0xE05C, 0x90F3, 0xE05D, 0x90F5, 0xE05E, 0x90F6, 0xE05F, 0x90F7,\n\t0xE060, 0x90F9, 0xE061, 0x90FA, 0xE062, 0x90FB, 0xE063, 0x90FC,\t0xE064, 0x90FF, 0xE065, 0x9100, 0xE066, 0x9101, 0xE067, 0x9103,\n\t0xE068, 0x9105, 0xE069, 0x9106, 0xE06A, 0x9107, 0xE06B, 0x9108,\t0xE06C, 0x9109, 0xE06D, 0x910A, 0xE06E, 0x910B, 0xE06F, 0x910C,\n\t0xE070, 0x910D, 0xE071, 0x910E, 0xE072, 0x910F, 0xE073, 0x9110,\t0xE074, 0x9111, 0xE075, 0x9112, 0xE076, 0x9113, 0xE077, 0x9114,\n\t0xE078, 0x9115, 0xE079, 0x9116, 0xE07A, 0x9117, 0xE07B, 0x9118,\t0xE07C, 0x911A, 0xE07D, 0x911B, 0xE07E, 0x911C, 0xE080, 0x911D,\n\t0xE081, 0x911F, 0xE082, 0x9120, 0xE083, 0x9121, 0xE084, 0x9124,\t0xE085, 0x9125, 0xE086, 0x9126, 0xE087, 0x9127, 0xE088, 0x9128,\n\t0xE089, 0x9129, 0xE08A, 0x912A, 0xE08B, 0x912B, 0xE08C, 0x912C,\t0xE08D, 0x912D, 0xE08E, 0x912E, 0xE08F, 0x9130, 0xE090, 0x9132,\n\t0xE091, 0x9133, 0xE092, 0x9134, 0xE093, 0x9135, 0xE094, 0x9136,\t0xE095, 0x9137, 0xE096, 0x9138, 0xE097, 0x913A, 0xE098, 0x913B,\n\t0xE099, 0x913C, 0xE09A, 0x913D, 0xE09B, 0x913E, 0xE09C, 0x913F,\t0xE09D, 0x9140, 0xE09E, 0x9141, 0xE09F, 0x9142, 0xE0A0, 0x9144,\n\t0xE0A1, 0x5537, 0xE0A2, 0x5556, 0xE0A3, 0x5575, 0xE0A4, 0x5576,\t0xE0A5, 0x5577, 0xE0A6, 0x5533, 0xE0A7, 0x5530, 0xE0A8, 0x555C,\n\t0xE0A9, 0x558B, 0xE0AA, 0x55D2, 0xE0AB, 0x5583, 0xE0AC, 0x55B1,\t0xE0AD, 0x55B9, 0xE0AE, 0x5588, 0xE0AF, 0x5581, 0xE0B0, 0x559F,\n\t0xE0B1, 0x557E, 0xE0B2, 0x55D6, 0xE0B3, 0x5591, 0xE0B4, 0x557B,\t0xE0B5, 0x55DF, 0xE0B6, 0x55BD, 0xE0B7, 0x55BE, 0xE0B8, 0x5594,\n\t0xE0B9, 0x5599, 0xE0BA, 0x55EA, 0xE0BB, 0x55F7, 0xE0BC, 0x55C9,\t0xE0BD, 0x561F, 0xE0BE, 0x55D1, 0xE0BF, 0x55EB, 0xE0C0, 0x55EC,\n\t0xE0C1, 0x55D4, 0xE0C2, 0x55E6, 0xE0C3, 0x55DD, 0xE0C4, 0x55C4,\t0xE0C5, 0x55EF, 0xE0C6, 0x55E5, 0xE0C7, 0x55F2, 0xE0C8, 0x55F3,\n\t0xE0C9, 0x55CC, 0xE0CA, 0x55CD, 0xE0CB, 0x55E8, 0xE0CC, 0x55F5,\t0xE0CD, 0x55E4, 0xE0CE, 0x8F94, 0xE0CF, 0x561E, 0xE0D0, 0x5608,\n\t0xE0D1, 0x560C, 0xE0D2, 0x5601, 0xE0D3, 0x5624, 0xE0D4, 0x5623,\t0xE0D5, 0x55FE, 0xE0D6, 0x5600, 0xE0D7, 0x5627, 0xE0D8, 0x562D,\n\t0xE0D9, 0x5658, 0xE0DA, 0x5639, 0xE0DB, 0x5657, 0xE0DC, 0x562C,\t0xE0DD, 0x564D, 0xE0DE, 0x5662, 0xE0DF, 0x5659, 0xE0E0, 0x565C,\n\t0xE0E1, 0x564C, 0xE0E2, 0x5654, 0xE0E3, 0x5686, 0xE0E4, 0x5664,\t0xE0E5, 0x5671, 0xE0E6, 0x566B, 0xE0E7, 0x567B, 0xE0E8, 0x567C,\n\t0xE0E9, 0x5685, 0xE0EA, 0x5693, 0xE0EB, 0x56AF, 0xE0EC, 0x56D4,\t0xE0ED, 0x56D7, 0xE0EE, 0x56DD, 0xE0EF, 0x56E1, 0xE0F0, 0x56F5,\n\t0xE0F1, 0x56EB, 0xE0F2, 0x56F9, 0xE0F3, 0x56FF, 0xE0F4, 0x5704,\t0xE0F5, 0x570A, 0xE0F6, 0x5709, 0xE0F7, 0x571C, 0xE0F8, 0x5E0F,\n\t0xE0F9, 0x5E19, 0xE0FA, 0x5E14, 0xE0FB, 0x5E11, 0xE0FC, 0x5E31,\t0xE0FD, 0x5E3B, 0xE0FE, 0x5E3C, 0xE140, 0x9145, 0xE141, 0x9147,\n\t0xE142, 0x9148, 0xE143, 0x9151, 0xE144, 0x9153, 0xE145, 0x9154,\t0xE146, 0x9155, 0xE147, 0x9156, 0xE148, 0x9158, 0xE149, 0x9159,\n\t0xE14A, 0x915B, 0xE14B, 0x915C, 0xE14C, 0x915F, 0xE14D, 0x9160,\t0xE14E, 0x9166, 0xE14F, 0x9167, 0xE150, 0x9168, 0xE151, 0x916B,\n\t0xE152, 0x916D, 0xE153, 0x9173, 0xE154, 0x917A, 0xE155, 0x917B,\t0xE156, 0x917C, 0xE157, 0x9180, 0xE158, 0x9181, 0xE159, 0x9182,\n\t0xE15A, 0x9183, 0xE15B, 0x9184, 0xE15C, 0x9186, 0xE15D, 0x9188,\t0xE15E, 0x918A, 0xE15F, 0x918E, 0xE160, 0x918F, 0xE161, 0x9193,\n\t0xE162, 0x9194, 0xE163, 0x9195, 0xE164, 0x9196, 0xE165, 0x9197,\t0xE166, 0x9198, 0xE167, 0x9199, 0xE168, 0x919C, 0xE169, 0x919D,\n\t0xE16A, 0x919E, 0xE16B, 0x919F, 0xE16C, 0x91A0, 0xE16D, 0x91A1,\t0xE16E, 0x91A4, 0xE16F, 0x91A5, 0xE170, 0x91A6, 0xE171, 0x91A7,\n\t0xE172, 0x91A8, 0xE173, 0x91A9, 0xE174, 0x91AB, 0xE175, 0x91AC,\t0xE176, 0x91B0, 0xE177, 0x91B1, 0xE178, 0x91B2, 0xE179, 0x91B3,\n\t0xE17A, 0x91B6, 0xE17B, 0x91B7, 0xE17C, 0x91B8, 0xE17D, 0x91B9,\t0xE17E, 0x91BB, 0xE180, 0x91BC, 0xE181, 0x91BD, 0xE182, 0x91BE,\n\t0xE183, 0x91BF, 0xE184, 0x91C0, 0xE185, 0x91C1, 0xE186, 0x91C2,\t0xE187, 0x91C3, 0xE188, 0x91C4, 0xE189, 0x91C5, 0xE18A, 0x91C6,\n\t0xE18B, 0x91C8, 0xE18C, 0x91CB, 0xE18D, 0x91D0, 0xE18E, 0x91D2,\t0xE18F, 0x91D3, 0xE190, 0x91D4, 0xE191, 0x91D5, 0xE192, 0x91D6,\n\t0xE193, 0x91D7, 0xE194, 0x91D8, 0xE195, 0x91D9, 0xE196, 0x91DA,\t0xE197, 0x91DB, 0xE198, 0x91DD, 0xE199, 0x91DE, 0xE19A, 0x91DF,\n\t0xE19B, 0x91E0, 0xE19C, 0x91E1, 0xE19D, 0x91E2, 0xE19E, 0x91E3,\t0xE19F, 0x91E4, 0xE1A0, 0x91E5, 0xE1A1, 0x5E37, 0xE1A2, 0x5E44,\n\t0xE1A3, 0x5E54, 0xE1A4, 0x5E5B, 0xE1A5, 0x5E5E, 0xE1A6, 0x5E61,\t0xE1A7, 0x5C8C, 0xE1A8, 0x5C7A, 0xE1A9, 0x5C8D, 0xE1AA, 0x5C90,\n\t0xE1AB, 0x5C96, 0xE1AC, 0x5C88, 0xE1AD, 0x5C98, 0xE1AE, 0x5C99,\t0xE1AF, 0x5C91, 0xE1B0, 0x5C9A, 0xE1B1, 0x5C9C, 0xE1B2, 0x5CB5,\n\t0xE1B3, 0x5CA2, 0xE1B4, 0x5CBD, 0xE1B5, 0x5CAC, 0xE1B6, 0x5CAB,\t0xE1B7, 0x5CB1, 0xE1B8, 0x5CA3, 0xE1B9, 0x5CC1, 0xE1BA, 0x5CB7,\n\t0xE1BB, 0x5CC4, 0xE1BC, 0x5CD2, 0xE1BD, 0x5CE4, 0xE1BE, 0x5CCB,\t0xE1BF, 0x5CE5, 0xE1C0, 0x5D02, 0xE1C1, 0x5D03, 0xE1C2, 0x5D27,\n\t0xE1C3, 0x5D26, 0xE1C4, 0x5D2E, 0xE1C5, 0x5D24, 0xE1C6, 0x5D1E,\t0xE1C7, 0x5D06, 0xE1C8, 0x5D1B, 0xE1C9, 0x5D58, 0xE1CA, 0x5D3E,\n\t0xE1CB, 0x5D34, 0xE1CC, 0x5D3D, 0xE1CD, 0x5D6C, 0xE1CE, 0x5D5B,\t0xE1CF, 0x5D6F, 0xE1D0, 0x5D5D, 0xE1D1, 0x5D6B, 0xE1D2, 0x5D4B,\n\t0xE1D3, 0x5D4A, 0xE1D4, 0x5D69, 0xE1D5, 0x5D74, 0xE1D6, 0x5D82,\t0xE1D7, 0x5D99, 0xE1D8, 0x5D9D, 0xE1D9, 0x8C73, 0xE1DA, 0x5DB7,\n\t0xE1DB, 0x5DC5, 0xE1DC, 0x5F73, 0xE1DD, 0x5F77, 0xE1DE, 0x5F82,\t0xE1DF, 0x5F87, 0xE1E0, 0x5F89, 0xE1E1, 0x5F8C, 0xE1E2, 0x5F95,\n\t0xE1E3, 0x5F99, 0xE1E4, 0x5F9C, 0xE1E5, 0x5FA8, 0xE1E6, 0x5FAD,\t0xE1E7, 0x5FB5, 0xE1E8, 0x5FBC, 0xE1E9, 0x8862, 0xE1EA, 0x5F61,\n\t0xE1EB, 0x72AD, 0xE1EC, 0x72B0, 0xE1ED, 0x72B4, 0xE1EE, 0x72B7,\t0xE1EF, 0x72B8, 0xE1F0, 0x72C3, 0xE1F1, 0x72C1, 0xE1F2, 0x72CE,\n\t0xE1F3, 0x72CD, 0xE1F4, 0x72D2, 0xE1F5, 0x72E8, 0xE1F6, 0x72EF,\t0xE1F7, 0x72E9, 0xE1F8, 0x72F2, 0xE1F9, 0x72F4, 0xE1FA, 0x72F7,\n\t0xE1FB, 0x7301, 0xE1FC, 0x72F3, 0xE1FD, 0x7303, 0xE1FE, 0x72FA,\t0xE240, 0x91E6, 0xE241, 0x91E7, 0xE242, 0x91E8, 0xE243, 0x91E9,\n\t0xE244, 0x91EA, 0xE245, 0x91EB, 0xE246, 0x91EC, 0xE247, 0x91ED,\t0xE248, 0x91EE, 0xE249, 0x91EF, 0xE24A, 0x91F0, 0xE24B, 0x91F1,\n\t0xE24C, 0x91F2, 0xE24D, 0x91F3, 0xE24E, 0x91F4, 0xE24F, 0x91F5,\t0xE250, 0x91F6, 0xE251, 0x91F7, 0xE252, 0x91F8, 0xE253, 0x91F9,\n\t0xE254, 0x91FA, 0xE255, 0x91FB, 0xE256, 0x91FC, 0xE257, 0x91FD,\t0xE258, 0x91FE, 0xE259, 0x91FF, 0xE25A, 0x9200, 0xE25B, 0x9201,\n\t0xE25C, 0x9202, 0xE25D, 0x9203, 0xE25E, 0x9204, 0xE25F, 0x9205,\t0xE260, 0x9206, 0xE261, 0x9207, 0xE262, 0x9208, 0xE263, 0x9209,\n\t0xE264, 0x920A, 0xE265, 0x920B, 0xE266, 0x920C, 0xE267, 0x920D,\t0xE268, 0x920E, 0xE269, 0x920F, 0xE26A, 0x9210, 0xE26B, 0x9211,\n\t0xE26C, 0x9212, 0xE26D, 0x9213, 0xE26E, 0x9214, 0xE26F, 0x9215,\t0xE270, 0x9216, 0xE271, 0x9217, 0xE272, 0x9218, 0xE273, 0x9219,\n\t0xE274, 0x921A, 0xE275, 0x921B, 0xE276, 0x921C, 0xE277, 0x921D,\t0xE278, 0x921E, 0xE279, 0x921F, 0xE27A, 0x9220, 0xE27B, 0x9221,\n\t0xE27C, 0x9222, 0xE27D, 0x9223, 0xE27E, 0x9224, 0xE280, 0x9225,\t0xE281, 0x9226, 0xE282, 0x9227, 0xE283, 0x9228, 0xE284, 0x9229,\n\t0xE285, 0x922A, 0xE286, 0x922B, 0xE287, 0x922C, 0xE288, 0x922D,\t0xE289, 0x922E, 0xE28A, 0x922F, 0xE28B, 0x9230, 0xE28C, 0x9231,\n\t0xE28D, 0x9232, 0xE28E, 0x9233, 0xE28F, 0x9234, 0xE290, 0x9235,\t0xE291, 0x9236, 0xE292, 0x9237, 0xE293, 0x9238, 0xE294, 0x9239,\n\t0xE295, 0x923A, 0xE296, 0x923B, 0xE297, 0x923C, 0xE298, 0x923D,\t0xE299, 0x923E, 0xE29A, 0x923F, 0xE29B, 0x9240, 0xE29C, 0x9241,\n\t0xE29D, 0x9242, 0xE29E, 0x9243, 0xE29F, 0x9244, 0xE2A0, 0x9245,\t0xE2A1, 0x72FB, 0xE2A2, 0x7317, 0xE2A3, 0x7313, 0xE2A4, 0x7321,\n\t0xE2A5, 0x730A, 0xE2A6, 0x731E, 0xE2A7, 0x731D, 0xE2A8, 0x7315,\t0xE2A9, 0x7322, 0xE2AA, 0x7339, 0xE2AB, 0x7325, 0xE2AC, 0x732C,\n\t0xE2AD, 0x7338, 0xE2AE, 0x7331, 0xE2AF, 0x7350, 0xE2B0, 0x734D,\t0xE2B1, 0x7357, 0xE2B2, 0x7360, 0xE2B3, 0x736C, 0xE2B4, 0x736F,\n\t0xE2B5, 0x737E, 0xE2B6, 0x821B, 0xE2B7, 0x5925, 0xE2B8, 0x98E7,\t0xE2B9, 0x5924, 0xE2BA, 0x5902, 0xE2BB, 0x9963, 0xE2BC, 0x9967,\n\t0xE2BD, 0x9968, 0xE2BE, 0x9969, 0xE2BF, 0x996A, 0xE2C0, 0x996B,\t0xE2C1, 0x996C, 0xE2C2, 0x9974, 0xE2C3, 0x9977, 0xE2C4, 0x997D,\n\t0xE2C5, 0x9980, 0xE2C6, 0x9984, 0xE2C7, 0x9987, 0xE2C8, 0x998A,\t0xE2C9, 0x998D, 0xE2CA, 0x9990, 0xE2CB, 0x9991, 0xE2CC, 0x9993,\n\t0xE2CD, 0x9994, 0xE2CE, 0x9995, 0xE2CF, 0x5E80, 0xE2D0, 0x5E91,\t0xE2D1, 0x5E8B, 0xE2D2, 0x5E96, 0xE2D3, 0x5EA5, 0xE2D4, 0x5EA0,\n\t0xE2D5, 0x5EB9, 0xE2D6, 0x5EB5, 0xE2D7, 0x5EBE, 0xE2D8, 0x5EB3,\t0xE2D9, 0x8D53, 0xE2DA, 0x5ED2, 0xE2DB, 0x5ED1, 0xE2DC, 0x5EDB,\n\t0xE2DD, 0x5EE8, 0xE2DE, 0x5EEA, 0xE2DF, 0x81BA, 0xE2E0, 0x5FC4,\t0xE2E1, 0x5FC9, 0xE2E2, 0x5FD6, 0xE2E3, 0x5FCF, 0xE2E4, 0x6003,\n\t0xE2E5, 0x5FEE, 0xE2E6, 0x6004, 0xE2E7, 0x5FE1, 0xE2E8, 0x5FE4,\t0xE2E9, 0x5FFE, 0xE2EA, 0x6005, 0xE2EB, 0x6006, 0xE2EC, 0x5FEA,\n\t0xE2ED, 0x5FED, 0xE2EE, 0x5FF8, 0xE2EF, 0x6019, 0xE2F0, 0x6035,\t0xE2F1, 0x6026, 0xE2F2, 0x601B, 0xE2F3, 0x600F, 0xE2F4, 0x600D,\n\t0xE2F5, 0x6029, 0xE2F6, 0x602B, 0xE2F7, 0x600A, 0xE2F8, 0x603F,\t0xE2F9, 0x6021, 0xE2FA, 0x6078, 0xE2FB, 0x6079, 0xE2FC, 0x607B,\n\t0xE2FD, 0x607A, 0xE2FE, 0x6042, 0xE340, 0x9246, 0xE341, 0x9247,\t0xE342, 0x9248, 0xE343, 0x9249, 0xE344, 0x924A, 0xE345, 0x924B,\n\t0xE346, 0x924C, 0xE347, 0x924D, 0xE348, 0x924E, 0xE349, 0x924F,\t0xE34A, 0x9250, 0xE34B, 0x9251, 0xE34C, 0x9252, 0xE34D, 0x9253,\n\t0xE34E, 0x9254, 0xE34F, 0x9255, 0xE350, 0x9256, 0xE351, 0x9257,\t0xE352, 0x9258, 0xE353, 0x9259, 0xE354, 0x925A, 0xE355, 0x925B,\n\t0xE356, 0x925C, 0xE357, 0x925D, 0xE358, 0x925E, 0xE359, 0x925F,\t0xE35A, 0x9260, 0xE35B, 0x9261, 0xE35C, 0x9262, 0xE35D, 0x9263,\n\t0xE35E, 0x9264, 0xE35F, 0x9265, 0xE360, 0x9266, 0xE361, 0x9267,\t0xE362, 0x9268, 0xE363, 0x9269, 0xE364, 0x926A, 0xE365, 0x926B,\n\t0xE366, 0x926C, 0xE367, 0x926D, 0xE368, 0x926E, 0xE369, 0x926F,\t0xE36A, 0x9270, 0xE36B, 0x9271, 0xE36C, 0x9272, 0xE36D, 0x9273,\n\t0xE36E, 0x9275, 0xE36F, 0x9276, 0xE370, 0x9277, 0xE371, 0x9278,\t0xE372, 0x9279, 0xE373, 0x927A, 0xE374, 0x927B, 0xE375, 0x927C,\n\t0xE376, 0x927D, 0xE377, 0x927E, 0xE378, 0x927F, 0xE379, 0x9280,\t0xE37A, 0x9281, 0xE37B, 0x9282, 0xE37C, 0x9283, 0xE37D, 0x9284,\n\t0xE37E, 0x9285, 0xE380, 0x9286, 0xE381, 0x9287, 0xE382, 0x9288,\t0xE383, 0x9289, 0xE384, 0x928A, 0xE385, 0x928B, 0xE386, 0x928C,\n\t0xE387, 0x928D, 0xE388, 0x928F, 0xE389, 0x9290, 0xE38A, 0x9291,\t0xE38B, 0x9292, 0xE38C, 0x9293, 0xE38D, 0x9294, 0xE38E, 0x9295,\n\t0xE38F, 0x9296, 0xE390, 0x9297, 0xE391, 0x9298, 0xE392, 0x9299,\t0xE393, 0x929A, 0xE394, 0x929B, 0xE395, 0x929C, 0xE396, 0x929D,\n\t0xE397, 0x929E, 0xE398, 0x929F, 0xE399, 0x92A0, 0xE39A, 0x92A1,\t0xE39B, 0x92A2, 0xE39C, 0x92A3, 0xE39D, 0x92A4, 0xE39E, 0x92A5,\n\t0xE39F, 0x92A6, 0xE3A0, 0x92A7, 0xE3A1, 0x606A, 0xE3A2, 0x607D,\t0xE3A3, 0x6096, 0xE3A4, 0x609A, 0xE3A5, 0x60AD, 0xE3A6, 0x609D,\n\t0xE3A7, 0x6083, 0xE3A8, 0x6092, 0xE3A9, 0x608C, 0xE3AA, 0x609B,\t0xE3AB, 0x60EC, 0xE3AC, 0x60BB, 0xE3AD, 0x60B1, 0xE3AE, 0x60DD,\n\t0xE3AF, 0x60D8, 0xE3B0, 0x60C6, 0xE3B1, 0x60DA, 0xE3B2, 0x60B4,\t0xE3B3, 0x6120, 0xE3B4, 0x6126, 0xE3B5, 0x6115, 0xE3B6, 0x6123,\n\t0xE3B7, 0x60F4, 0xE3B8, 0x6100, 0xE3B9, 0x610E, 0xE3BA, 0x612B,\t0xE3BB, 0x614A, 0xE3BC, 0x6175, 0xE3BD, 0x61AC, 0xE3BE, 0x6194,\n\t0xE3BF, 0x61A7, 0xE3C0, 0x61B7, 0xE3C1, 0x61D4, 0xE3C2, 0x61F5,\t0xE3C3, 0x5FDD, 0xE3C4, 0x96B3, 0xE3C5, 0x95E9, 0xE3C6, 0x95EB,\n\t0xE3C7, 0x95F1, 0xE3C8, 0x95F3, 0xE3C9, 0x95F5, 0xE3CA, 0x95F6,\t0xE3CB, 0x95FC, 0xE3CC, 0x95FE, 0xE3CD, 0x9603, 0xE3CE, 0x9604,\n\t0xE3CF, 0x9606, 0xE3D0, 0x9608, 0xE3D1, 0x960A, 0xE3D2, 0x960B,\t0xE3D3, 0x960C, 0xE3D4, 0x960D, 0xE3D5, 0x960F, 0xE3D6, 0x9612,\n\t0xE3D7, 0x9615, 0xE3D8, 0x9616, 0xE3D9, 0x9617, 0xE3DA, 0x9619,\t0xE3DB, 0x961A, 0xE3DC, 0x4E2C, 0xE3DD, 0x723F, 0xE3DE, 0x6215,\n\t0xE3DF, 0x6C35, 0xE3E0, 0x6C54, 0xE3E1, 0x6C5C, 0xE3E2, 0x6C4A,\t0xE3E3, 0x6CA3, 0xE3E4, 0x6C85, 0xE3E5, 0x6C90, 0xE3E6, 0x6C94,\n\t0xE3E7, 0x6C8C, 0xE3E8, 0x6C68, 0xE3E9, 0x6C69, 0xE3EA, 0x6C74,\t0xE3EB, 0x6C76, 0xE3EC, 0x6C86, 0xE3ED, 0x6CA9, 0xE3EE, 0x6CD0,\n\t0xE3EF, 0x6CD4, 0xE3F0, 0x6CAD, 0xE3F1, 0x6CF7, 0xE3F2, 0x6CF8,\t0xE3F3, 0x6CF1, 0xE3F4, 0x6CD7, 0xE3F5, 0x6CB2, 0xE3F6, 0x6CE0,\n\t0xE3F7, 0x6CD6, 0xE3F8, 0x6CFA, 0xE3F9, 0x6CEB, 0xE3FA, 0x6CEE,\t0xE3FB, 0x6CB1, 0xE3FC, 0x6CD3, 0xE3FD, 0x6CEF, 0xE3FE, 0x6CFE,\n\t0xE440, 0x92A8, 0xE441, 0x92A9, 0xE442, 0x92AA, 0xE443, 0x92AB,\t0xE444, 0x92AC, 0xE445, 0x92AD, 0xE446, 0x92AF, 0xE447, 0x92B0,\n\t0xE448, 0x92B1, 0xE449, 0x92B2, 0xE44A, 0x92B3, 0xE44B, 0x92B4,\t0xE44C, 0x92B5, 0xE44D, 0x92B6, 0xE44E, 0x92B7, 0xE44F, 0x92B8,\n\t0xE450, 0x92B9, 0xE451, 0x92BA, 0xE452, 0x92BB, 0xE453, 0x92BC,\t0xE454, 0x92BD, 0xE455, 0x92BE, 0xE456, 0x92BF, 0xE457, 0x92C0,\n\t0xE458, 0x92C1, 0xE459, 0x92C2, 0xE45A, 0x92C3, 0xE45B, 0x92C4,\t0xE45C, 0x92C5, 0xE45D, 0x92C6, 0xE45E, 0x92C7, 0xE45F, 0x92C9,\n\t0xE460, 0x92CA, 0xE461, 0x92CB, 0xE462, 0x92CC, 0xE463, 0x92CD,\t0xE464, 0x92CE, 0xE465, 0x92CF, 0xE466, 0x92D0, 0xE467, 0x92D1,\n\t0xE468, 0x92D2, 0xE469, 0x92D3, 0xE46A, 0x92D4, 0xE46B, 0x92D5,\t0xE46C, 0x92D6, 0xE46D, 0x92D7, 0xE46E, 0x92D8, 0xE46F, 0x92D9,\n\t0xE470, 0x92DA, 0xE471, 0x92DB, 0xE472, 0x92DC, 0xE473, 0x92DD,\t0xE474, 0x92DE, 0xE475, 0x92DF, 0xE476, 0x92E0, 0xE477, 0x92E1,\n\t0xE478, 0x92E2, 0xE479, 0x92E3, 0xE47A, 0x92E4, 0xE47B, 0x92E5,\t0xE47C, 0x92E6, 0xE47D, 0x92E7, 0xE47E, 0x92E8, 0xE480, 0x92E9,\n\t0xE481, 0x92EA, 0xE482, 0x92EB, 0xE483, 0x92EC, 0xE484, 0x92ED,\t0xE485, 0x92EE, 0xE486, 0x92EF, 0xE487, 0x92F0, 0xE488, 0x92F1,\n\t0xE489, 0x92F2, 0xE48A, 0x92F3, 0xE48B, 0x92F4, 0xE48C, 0x92F5,\t0xE48D, 0x92F6, 0xE48E, 0x92F7, 0xE48F, 0x92F8, 0xE490, 0x92F9,\n\t0xE491, 0x92FA, 0xE492, 0x92FB, 0xE493, 0x92FC, 0xE494, 0x92FD,\t0xE495, 0x92FE, 0xE496, 0x92FF, 0xE497, 0x9300, 0xE498, 0x9301,\n\t0xE499, 0x9302, 0xE49A, 0x9303, 0xE49B, 0x9304, 0xE49C, 0x9305,\t0xE49D, 0x9306, 0xE49E, 0x9307, 0xE49F, 0x9308, 0xE4A0, 0x9309,\n\t0xE4A1, 0x6D39, 0xE4A2, 0x6D27, 0xE4A3, 0x6D0C, 0xE4A4, 0x6D43,\t0xE4A5, 0x6D48, 0xE4A6, 0x6D07, 0xE4A7, 0x6D04, 0xE4A8, 0x6D19,\n\t0xE4A9, 0x6D0E, 0xE4AA, 0x6D2B, 0xE4AB, 0x6D4D, 0xE4AC, 0x6D2E,\t0xE4AD, 0x6D35, 0xE4AE, 0x6D1A, 0xE4AF, 0x6D4F, 0xE4B0, 0x6D52,\n\t0xE4B1, 0x6D54, 0xE4B2, 0x6D33, 0xE4B3, 0x6D91, 0xE4B4, 0x6D6F,\t0xE4B5, 0x6D9E, 0xE4B6, 0x6DA0, 0xE4B7, 0x6D5E, 0xE4B8, 0x6D93,\n\t0xE4B9, 0x6D94, 0xE4BA, 0x6D5C, 0xE4BB, 0x6D60, 0xE4BC, 0x6D7C,\t0xE4BD, 0x6D63, 0xE4BE, 0x6E1A, 0xE4BF, 0x6DC7, 0xE4C0, 0x6DC5,\n\t0xE4C1, 0x6DDE, 0xE4C2, 0x6E0E, 0xE4C3, 0x6DBF, 0xE4C4, 0x6DE0,\t0xE4C5, 0x6E11, 0xE4C6, 0x6DE6, 0xE4C7, 0x6DDD, 0xE4C8, 0x6DD9,\n\t0xE4C9, 0x6E16, 0xE4CA, 0x6DAB, 0xE4CB, 0x6E0C, 0xE4CC, 0x6DAE,\t0xE4CD, 0x6E2B, 0xE4CE, 0x6E6E, 0xE4CF, 0x6E4E, 0xE4D0, 0x6E6B,\n\t0xE4D1, 0x6EB2, 0xE4D2, 0x6E5F, 0xE4D3, 0x6E86, 0xE4D4, 0x6E53,\t0xE4D5, 0x6E54, 0xE4D6, 0x6E32, 0xE4D7, 0x6E25, 0xE4D8, 0x6E44,\n\t0xE4D9, 0x6EDF, 0xE4DA, 0x6EB1, 0xE4DB, 0x6E98, 0xE4DC, 0x6EE0,\t0xE4DD, 0x6F2D, 0xE4DE, 0x6EE2, 0xE4DF, 0x6EA5, 0xE4E0, 0x6EA7,\n\t0xE4E1, 0x6EBD, 0xE4E2, 0x6EBB, 0xE4E3, 0x6EB7, 0xE4E4, 0x6ED7,\t0xE4E5, 0x6EB4, 0xE4E6, 0x6ECF, 0xE4E7, 0x6E8F, 0xE4E8, 0x6EC2,\n\t0xE4E9, 0x6E9F, 0xE4EA, 0x6F62, 0xE4EB, 0x6F46, 0xE4EC, 0x6F47,\t0xE4ED, 0x6F24, 0xE4EE, 0x6F15, 0xE4EF, 0x6EF9, 0xE4F0, 0x6F2F,\n\t0xE4F1, 0x6F36, 0xE4F2, 0x6F4B, 0xE4F3, 0x6F74, 0xE4F4, 0x6F2A,\t0xE4F5, 0x6F09, 0xE4F6, 0x6F29, 0xE4F7, 0x6F89, 0xE4F8, 0x6F8D,\n\t0xE4F9, 0x6F8C, 0xE4FA, 0x6F78, 0xE4FB, 0x6F72, 0xE4FC, 0x6F7C,\t0xE4FD, 0x6F7A, 0xE4FE, 0x6FD1, 0xE540, 0x930A, 0xE541, 0x930B,\n\t0xE542, 0x930C, 0xE543, 0x930D, 0xE544, 0x930E, 0xE545, 0x930F,\t0xE546, 0x9310, 0xE547, 0x9311, 0xE548, 0x9312, 0xE549, 0x9313,\n\t0xE54A, 0x9314, 0xE54B, 0x9315, 0xE54C, 0x9316, 0xE54D, 0x9317,\t0xE54E, 0x9318, 0xE54F, 0x9319, 0xE550, 0x931A, 0xE551, 0x931B,\n\t0xE552, 0x931C, 0xE553, 0x931D, 0xE554, 0x931E, 0xE555, 0x931F,\t0xE556, 0x9320, 0xE557, 0x9321, 0xE558, 0x9322, 0xE559, 0x9323,\n\t0xE55A, 0x9324, 0xE55B, 0x9325, 0xE55C, 0x9326, 0xE55D, 0x9327,\t0xE55E, 0x9328, 0xE55F, 0x9329, 0xE560, 0x932A, 0xE561, 0x932B,\n\t0xE562, 0x932C, 0xE563, 0x932D, 0xE564, 0x932E, 0xE565, 0x932F,\t0xE566, 0x9330, 0xE567, 0x9331, 0xE568, 0x9332, 0xE569, 0x9333,\n\t0xE56A, 0x9334, 0xE56B, 0x9335, 0xE56C, 0x9336, 0xE56D, 0x9337,\t0xE56E, 0x9338, 0xE56F, 0x9339, 0xE570, 0x933A, 0xE571, 0x933B,\n\t0xE572, 0x933C, 0xE573, 0x933D, 0xE574, 0x933F, 0xE575, 0x9340,\t0xE576, 0x9341, 0xE577, 0x9342, 0xE578, 0x9343, 0xE579, 0x9344,\n\t0xE57A, 0x9345, 0xE57B, 0x9346, 0xE57C, 0x9347, 0xE57D, 0x9348,\t0xE57E, 0x9349, 0xE580, 0x934A, 0xE581, 0x934B, 0xE582, 0x934C,\n\t0xE583, 0x934D, 0xE584, 0x934E, 0xE585, 0x934F, 0xE586, 0x9350,\t0xE587, 0x9351, 0xE588, 0x9352, 0xE589, 0x9353, 0xE58A, 0x9354,\n\t0xE58B, 0x9355, 0xE58C, 0x9356, 0xE58D, 0x9357, 0xE58E, 0x9358,\t0xE58F, 0x9359, 0xE590, 0x935A, 0xE591, 0x935B, 0xE592, 0x935C,\n\t0xE593, 0x935D, 0xE594, 0x935E, 0xE595, 0x935F, 0xE596, 0x9360,\t0xE597, 0x9361, 0xE598, 0x9362, 0xE599, 0x9363, 0xE59A, 0x9364,\n\t0xE59B, 0x9365, 0xE59C, 0x9366, 0xE59D, 0x9367, 0xE59E, 0x9368,\t0xE59F, 0x9369, 0xE5A0, 0x936B, 0xE5A1, 0x6FC9, 0xE5A2, 0x6FA7,\n\t0xE5A3, 0x6FB9, 0xE5A4, 0x6FB6, 0xE5A5, 0x6FC2, 0xE5A6, 0x6FE1,\t0xE5A7, 0x6FEE, 0xE5A8, 0x6FDE, 0xE5A9, 0x6FE0, 0xE5AA, 0x6FEF,\n\t0xE5AB, 0x701A, 0xE5AC, 0x7023, 0xE5AD, 0x701B, 0xE5AE, 0x7039,\t0xE5AF, 0x7035, 0xE5B0, 0x704F, 0xE5B1, 0x705E, 0xE5B2, 0x5B80,\n\t0xE5B3, 0x5B84, 0xE5B4, 0x5B95, 0xE5B5, 0x5B93, 0xE5B6, 0x5BA5,\t0xE5B7, 0x5BB8, 0xE5B8, 0x752F, 0xE5B9, 0x9A9E, 0xE5BA, 0x6434,\n\t0xE5BB, 0x5BE4, 0xE5BC, 0x5BEE, 0xE5BD, 0x8930, 0xE5BE, 0x5BF0,\t0xE5BF, 0x8E47, 0xE5C0, 0x8B07, 0xE5C1, 0x8FB6, 0xE5C2, 0x8FD3,\n\t0xE5C3, 0x8FD5, 0xE5C4, 0x8FE5, 0xE5C5, 0x8FEE, 0xE5C6, 0x8FE4,\t0xE5C7, 0x8FE9, 0xE5C8, 0x8FE6, 0xE5C9, 0x8FF3, 0xE5CA, 0x8FE8,\n\t0xE5CB, 0x9005, 0xE5CC, 0x9004, 0xE5CD, 0x900B, 0xE5CE, 0x9026,\t0xE5CF, 0x9011, 0xE5D0, 0x900D, 0xE5D1, 0x9016, 0xE5D2, 0x9021,\n\t0xE5D3, 0x9035, 0xE5D4, 0x9036, 0xE5D5, 0x902D, 0xE5D6, 0x902F,\t0xE5D7, 0x9044, 0xE5D8, 0x9051, 0xE5D9, 0x9052, 0xE5DA, 0x9050,\n\t0xE5DB, 0x9068, 0xE5DC, 0x9058, 0xE5DD, 0x9062, 0xE5DE, 0x905B,\t0xE5DF, 0x66B9, 0xE5E0, 0x9074, 0xE5E1, 0x907D, 0xE5E2, 0x9082,\n\t0xE5E3, 0x9088, 0xE5E4, 0x9083, 0xE5E5, 0x908B, 0xE5E6, 0x5F50,\t0xE5E7, 0x5F57, 0xE5E8, 0x5F56, 0xE5E9, 0x5F58, 0xE5EA, 0x5C3B,\n\t0xE5EB, 0x54AB, 0xE5EC, 0x5C50, 0xE5ED, 0x5C59, 0xE5EE, 0x5B71,\t0xE5EF, 0x5C63, 0xE5F0, 0x5C66, 0xE5F1, 0x7FBC, 0xE5F2, 0x5F2A,\n\t0xE5F3, 0x5F29, 0xE5F4, 0x5F2D, 0xE5F5, 0x8274, 0xE5F6, 0x5F3C,\t0xE5F7, 0x9B3B, 0xE5F8, 0x5C6E, 0xE5F9, 0x5981, 0xE5FA, 0x5983,\n\t0xE5FB, 0x598D, 0xE5FC, 0x59A9, 0xE5FD, 0x59AA, 0xE5FE, 0x59A3,\t0xE640, 0x936C, 0xE641, 0x936D, 0xE642, 0x936E, 0xE643, 0x936F,\n\t0xE644, 0x9370, 0xE645, 0x9371, 0xE646, 0x9372, 0xE647, 0x9373,\t0xE648, 0x9374, 0xE649, 0x9375, 0xE64A, 0x9376, 0xE64B, 0x9377,\n\t0xE64C, 0x9378, 0xE64D, 0x9379, 0xE64E, 0x937A, 0xE64F, 0x937B,\t0xE650, 0x937C, 0xE651, 0x937D, 0xE652, 0x937E, 0xE653, 0x937F,\n\t0xE654, 0x9380, 0xE655, 0x9381, 0xE656, 0x9382, 0xE657, 0x9383,\t0xE658, 0x9384, 0xE659, 0x9385, 0xE65A, 0x9386, 0xE65B, 0x9387,\n\t0xE65C, 0x9388, 0xE65D, 0x9389, 0xE65E, 0x938A, 0xE65F, 0x938B,\t0xE660, 0x938C, 0xE661, 0x938D, 0xE662, 0x938E, 0xE663, 0x9390,\n\t0xE664, 0x9391, 0xE665, 0x9392, 0xE666, 0x9393, 0xE667, 0x9394,\t0xE668, 0x9395, 0xE669, 0x9396, 0xE66A, 0x9397, 0xE66B, 0x9398,\n\t0xE66C, 0x9399, 0xE66D, 0x939A, 0xE66E, 0x939B, 0xE66F, 0x939C,\t0xE670, 0x939D, 0xE671, 0x939E, 0xE672, 0x939F, 0xE673, 0x93A0,\n\t0xE674, 0x93A1, 0xE675, 0x93A2, 0xE676, 0x93A3, 0xE677, 0x93A4,\t0xE678, 0x93A5, 0xE679, 0x93A6, 0xE67A, 0x93A7, 0xE67B, 0x93A8,\n\t0xE67C, 0x93A9, 0xE67D, 0x93AA, 0xE67E, 0x93AB, 0xE680, 0x93AC,\t0xE681, 0x93AD, 0xE682, 0x93AE, 0xE683, 0x93AF, 0xE684, 0x93B0,\n\t0xE685, 0x93B1, 0xE686, 0x93B2, 0xE687, 0x93B3, 0xE688, 0x93B4,\t0xE689, 0x93B5, 0xE68A, 0x93B6, 0xE68B, 0x93B7, 0xE68C, 0x93B8,\n\t0xE68D, 0x93B9, 0xE68E, 0x93BA, 0xE68F, 0x93BB, 0xE690, 0x93BC,\t0xE691, 0x93BD, 0xE692, 0x93BE, 0xE693, 0x93BF, 0xE694, 0x93C0,\n\t0xE695, 0x93C1, 0xE696, 0x93C2, 0xE697, 0x93C3, 0xE698, 0x93C4,\t0xE699, 0x93C5, 0xE69A, 0x93C6, 0xE69B, 0x93C7, 0xE69C, 0x93C8,\n\t0xE69D, 0x93C9, 0xE69E, 0x93CB, 0xE69F, 0x93CC, 0xE6A0, 0x93CD,\t0xE6A1, 0x5997, 0xE6A2, 0x59CA, 0xE6A3, 0x59AB, 0xE6A4, 0x599E,\n\t0xE6A5, 0x59A4, 0xE6A6, 0x59D2, 0xE6A7, 0x59B2, 0xE6A8, 0x59AF,\t0xE6A9, 0x59D7, 0xE6AA, 0x59BE, 0xE6AB, 0x5A05, 0xE6AC, 0x5A06,\n\t0xE6AD, 0x59DD, 0xE6AE, 0x5A08, 0xE6AF, 0x59E3, 0xE6B0, 0x59D8,\t0xE6B1, 0x59F9, 0xE6B2, 0x5A0C, 0xE6B3, 0x5A09, 0xE6B4, 0x5A32,\n\t0xE6B5, 0x5A34, 0xE6B6, 0x5A11, 0xE6B7, 0x5A23, 0xE6B8, 0x5A13,\t0xE6B9, 0x5A40, 0xE6BA, 0x5A67, 0xE6BB, 0x5A4A, 0xE6BC, 0x5A55,\n\t0xE6BD, 0x5A3C, 0xE6BE, 0x5A62, 0xE6BF, 0x5A75, 0xE6C0, 0x80EC,\t0xE6C1, 0x5AAA, 0xE6C2, 0x5A9B, 0xE6C3, 0x5A77, 0xE6C4, 0x5A7A,\n\t0xE6C5, 0x5ABE, 0xE6C6, 0x5AEB, 0xE6C7, 0x5AB2, 0xE6C8, 0x5AD2,\t0xE6C9, 0x5AD4, 0xE6CA, 0x5AB8, 0xE6CB, 0x5AE0, 0xE6CC, 0x5AE3,\n\t0xE6CD, 0x5AF1, 0xE6CE, 0x5AD6, 0xE6CF, 0x5AE6, 0xE6D0, 0x5AD8,\t0xE6D1, 0x5ADC, 0xE6D2, 0x5B09, 0xE6D3, 0x5B17, 0xE6D4, 0x5B16,\n\t0xE6D5, 0x5B32, 0xE6D6, 0x5B37, 0xE6D7, 0x5B40, 0xE6D8, 0x5C15,\t0xE6D9, 0x5C1C, 0xE6DA, 0x5B5A, 0xE6DB, 0x5B65, 0xE6DC, 0x5B73,\n\t0xE6DD, 0x5B51, 0xE6DE, 0x5B53, 0xE6DF, 0x5B62, 0xE6E0, 0x9A75,\t0xE6E1, 0x9A77, 0xE6E2, 0x9A78, 0xE6E3, 0x9A7A, 0xE6E4, 0x9A7F,\n\t0xE6E5, 0x9A7D, 0xE6E6, 0x9A80, 0xE6E7, 0x9A81, 0xE6E8, 0x9A85,\t0xE6E9, 0x9A88, 0xE6EA, 0x9A8A, 0xE6EB, 0x9A90, 0xE6EC, 0x9A92,\n\t0xE6ED, 0x9A93, 0xE6EE, 0x9A96, 0xE6EF, 0x9A98, 0xE6F0, 0x9A9B,\t0xE6F1, 0x9A9C, 0xE6F2, 0x9A9D, 0xE6F3, 0x9A9F, 0xE6F4, 0x9AA0,\n\t0xE6F5, 0x9AA2, 0xE6F6, 0x9AA3, 0xE6F7, 0x9AA5, 0xE6F8, 0x9AA7,\t0xE6F9, 0x7E9F, 0xE6FA, 0x7EA1, 0xE6FB, 0x7EA3, 0xE6FC, 0x7EA5,\n\t0xE6FD, 0x7EA8, 0xE6FE, 0x7EA9, 0xE740, 0x93CE, 0xE741, 0x93CF,\t0xE742, 0x93D0, 0xE743, 0x93D1, 0xE744, 0x93D2, 0xE745, 0x93D3,\n\t0xE746, 0x93D4, 0xE747, 0x93D5, 0xE748, 0x93D7, 0xE749, 0x93D8,\t0xE74A, 0x93D9, 0xE74B, 0x93DA, 0xE74C, 0x93DB, 0xE74D, 0x93DC,\n\t0xE74E, 0x93DD, 0xE74F, 0x93DE, 0xE750, 0x93DF, 0xE751, 0x93E0,\t0xE752, 0x93E1, 0xE753, 0x93E2, 0xE754, 0x93E3, 0xE755, 0x93E4,\n\t0xE756, 0x93E5, 0xE757, 0x93E6, 0xE758, 0x93E7, 0xE759, 0x93E8,\t0xE75A, 0x93E9, 0xE75B, 0x93EA, 0xE75C, 0x93EB, 0xE75D, 0x93EC,\n\t0xE75E, 0x93ED, 0xE75F, 0x93EE, 0xE760, 0x93EF, 0xE761, 0x93F0,\t0xE762, 0x93F1, 0xE763, 0x93F2, 0xE764, 0x93F3, 0xE765, 0x93F4,\n\t0xE766, 0x93F5, 0xE767, 0x93F6, 0xE768, 0x93F7, 0xE769, 0x93F8,\t0xE76A, 0x93F9, 0xE76B, 0x93FA, 0xE76C, 0x93FB, 0xE76D, 0x93FC,\n\t0xE76E, 0x93FD, 0xE76F, 0x93FE, 0xE770, 0x93FF, 0xE771, 0x9400,\t0xE772, 0x9401, 0xE773, 0x9402, 0xE774, 0x9403, 0xE775, 0x9404,\n\t0xE776, 0x9405, 0xE777, 0x9406, 0xE778, 0x9407, 0xE779, 0x9408,\t0xE77A, 0x9409, 0xE77B, 0x940A, 0xE77C, 0x940B, 0xE77D, 0x940C,\n\t0xE77E, 0x940D, 0xE780, 0x940E, 0xE781, 0x940F, 0xE782, 0x9410,\t0xE783, 0x9411, 0xE784, 0x9412, 0xE785, 0x9413, 0xE786, 0x9414,\n\t0xE787, 0x9415, 0xE788, 0x9416, 0xE789, 0x9417, 0xE78A, 0x9418,\t0xE78B, 0x9419, 0xE78C, 0x941A, 0xE78D, 0x941B, 0xE78E, 0x941C,\n\t0xE78F, 0x941D, 0xE790, 0x941E, 0xE791, 0x941F, 0xE792, 0x9420,\t0xE793, 0x9421, 0xE794, 0x9422, 0xE795, 0x9423, 0xE796, 0x9424,\n\t0xE797, 0x9425, 0xE798, 0x9426, 0xE799, 0x9427, 0xE79A, 0x9428,\t0xE79B, 0x9429, 0xE79C, 0x942A, 0xE79D, 0x942B, 0xE79E, 0x942C,\n\t0xE79F, 0x942D, 0xE7A0, 0x942E, 0xE7A1, 0x7EAD, 0xE7A2, 0x7EB0,\t0xE7A3, 0x7EBE, 0xE7A4, 0x7EC0, 0xE7A5, 0x7EC1, 0xE7A6, 0x7EC2,\n\t0xE7A7, 0x7EC9, 0xE7A8, 0x7ECB, 0xE7A9, 0x7ECC, 0xE7AA, 0x7ED0,\t0xE7AB, 0x7ED4, 0xE7AC, 0x7ED7, 0xE7AD, 0x7EDB, 0xE7AE, 0x7EE0,\n\t0xE7AF, 0x7EE1, 0xE7B0, 0x7EE8, 0xE7B1, 0x7EEB, 0xE7B2, 0x7EEE,\t0xE7B3, 0x7EEF, 0xE7B4, 0x7EF1, 0xE7B5, 0x7EF2, 0xE7B6, 0x7F0D,\n\t0xE7B7, 0x7EF6, 0xE7B8, 0x7EFA, 0xE7B9, 0x7EFB, 0xE7BA, 0x7EFE,\t0xE7BB, 0x7F01, 0xE7BC, 0x7F02, 0xE7BD, 0x7F03, 0xE7BE, 0x7F07,\n\t0xE7BF, 0x7F08, 0xE7C0, 0x7F0B, 0xE7C1, 0x7F0C, 0xE7C2, 0x7F0F,\t0xE7C3, 0x7F11, 0xE7C4, 0x7F12, 0xE7C5, 0x7F17, 0xE7C6, 0x7F19,\n\t0xE7C7, 0x7F1C, 0xE7C8, 0x7F1B, 0xE7C9, 0x7F1F, 0xE7CA, 0x7F21,\t0xE7CB, 0x7F22, 0xE7CC, 0x7F23, 0xE7CD, 0x7F24, 0xE7CE, 0x7F25,\n\t0xE7CF, 0x7F26, 0xE7D0, 0x7F27, 0xE7D1, 0x7F2A, 0xE7D2, 0x7F2B,\t0xE7D3, 0x7F2C, 0xE7D4, 0x7F2D, 0xE7D5, 0x7F2F, 0xE7D6, 0x7F30,\n\t0xE7D7, 0x7F31, 0xE7D8, 0x7F32, 0xE7D9, 0x7F33, 0xE7DA, 0x7F35,\t0xE7DB, 0x5E7A, 0xE7DC, 0x757F, 0xE7DD, 0x5DDB, 0xE7DE, 0x753E,\n\t0xE7DF, 0x9095, 0xE7E0, 0x738E, 0xE7E1, 0x7391, 0xE7E2, 0x73AE,\t0xE7E3, 0x73A2, 0xE7E4, 0x739F, 0xE7E5, 0x73CF, 0xE7E6, 0x73C2,\n\t0xE7E7, 0x73D1, 0xE7E8, 0x73B7, 0xE7E9, 0x73B3, 0xE7EA, 0x73C0,\t0xE7EB, 0x73C9, 0xE7EC, 0x73C8, 0xE7ED, 0x73E5, 0xE7EE, 0x73D9,\n\t0xE7EF, 0x987C, 0xE7F0, 0x740A, 0xE7F1, 0x73E9, 0xE7F2, 0x73E7,\t0xE7F3, 0x73DE, 0xE7F4, 0x73BA, 0xE7F5, 0x73F2, 0xE7F6, 0x740F,\n\t0xE7F7, 0x742A, 0xE7F8, 0x745B, 0xE7F9, 0x7426, 0xE7FA, 0x7425,\t0xE7FB, 0x7428, 0xE7FC, 0x7430, 0xE7FD, 0x742E, 0xE7FE, 0x742C,\n\t0xE840, 0x942F, 0xE841, 0x9430, 0xE842, 0x9431, 0xE843, 0x9432,\t0xE844, 0x9433, 0xE845, 0x9434, 0xE846, 0x9435, 0xE847, 0x9436,\n\t0xE848, 0x9437, 0xE849, 0x9438, 0xE84A, 0x9439, 0xE84B, 0x943A,\t0xE84C, 0x943B, 0xE84D, 0x943C, 0xE84E, 0x943D, 0xE84F, 0x943F,\n\t0xE850, 0x9440, 0xE851, 0x9441, 0xE852, 0x9442, 0xE853, 0x9443,\t0xE854, 0x9444, 0xE855, 0x9445, 0xE856, 0x9446, 0xE857, 0x9447,\n\t0xE858, 0x9448, 0xE859, 0x9449, 0xE85A, 0x944A, 0xE85B, 0x944B,\t0xE85C, 0x944C, 0xE85D, 0x944D, 0xE85E, 0x944E, 0xE85F, 0x944F,\n\t0xE860, 0x9450, 0xE861, 0x9451, 0xE862, 0x9452, 0xE863, 0x9453,\t0xE864, 0x9454, 0xE865, 0x9455, 0xE866, 0x9456, 0xE867, 0x9457,\n\t0xE868, 0x9458, 0xE869, 0x9459, 0xE86A, 0x945A, 0xE86B, 0x945B,\t0xE86C, 0x945C, 0xE86D, 0x945D, 0xE86E, 0x945E, 0xE86F, 0x945F,\n\t0xE870, 0x9460, 0xE871, 0x9461, 0xE872, 0x9462, 0xE873, 0x9463,\t0xE874, 0x9464, 0xE875, 0x9465, 0xE876, 0x9466, 0xE877, 0x9467,\n\t0xE878, 0x9468, 0xE879, 0x9469, 0xE87A, 0x946A, 0xE87B, 0x946C,\t0xE87C, 0x946D, 0xE87D, 0x946E, 0xE87E, 0x946F, 0xE880, 0x9470,\n\t0xE881, 0x9471, 0xE882, 0x9472, 0xE883, 0x9473, 0xE884, 0x9474,\t0xE885, 0x9475, 0xE886, 0x9476, 0xE887, 0x9477, 0xE888, 0x9478,\n\t0xE889, 0x9479, 0xE88A, 0x947A, 0xE88B, 0x947B, 0xE88C, 0x947C,\t0xE88D, 0x947D, 0xE88E, 0x947E, 0xE88F, 0x947F, 0xE890, 0x9480,\n\t0xE891, 0x9481, 0xE892, 0x9482, 0xE893, 0x9483, 0xE894, 0x9484,\t0xE895, 0x9491, 0xE896, 0x9496, 0xE897, 0x9498, 0xE898, 0x94C7,\n\t0xE899, 0x94CF, 0xE89A, 0x94D3, 0xE89B, 0x94D4, 0xE89C, 0x94DA,\t0xE89D, 0x94E6, 0xE89E, 0x94FB, 0xE89F, 0x951C, 0xE8A0, 0x9520,\n\t0xE8A1, 0x741B, 0xE8A2, 0x741A, 0xE8A3, 0x7441, 0xE8A4, 0x745C,\t0xE8A5, 0x7457, 0xE8A6, 0x7455, 0xE8A7, 0x7459, 0xE8A8, 0x7477,\n\t0xE8A9, 0x746D, 0xE8AA, 0x747E, 0xE8AB, 0x749C, 0xE8AC, 0x748E,\t0xE8AD, 0x7480, 0xE8AE, 0x7481, 0xE8AF, 0x7487, 0xE8B0, 0x748B,\n\t0xE8B1, 0x749E, 0xE8B2, 0x74A8, 0xE8B3, 0x74A9, 0xE8B4, 0x7490,\t0xE8B5, 0x74A7, 0xE8B6, 0x74D2, 0xE8B7, 0x74BA, 0xE8B8, 0x97EA,\n\t0xE8B9, 0x97EB, 0xE8BA, 0x97EC, 0xE8BB, 0x674C, 0xE8BC, 0x6753,\t0xE8BD, 0x675E, 0xE8BE, 0x6748, 0xE8BF, 0x6769, 0xE8C0, 0x67A5,\n\t0xE8C1, 0x6787, 0xE8C2, 0x676A, 0xE8C3, 0x6773, 0xE8C4, 0x6798,\t0xE8C5, 0x67A7, 0xE8C6, 0x6775, 0xE8C7, 0x67A8, 0xE8C8, 0x679E,\n\t0xE8C9, 0x67AD, 0xE8CA, 0x678B, 0xE8CB, 0x6777, 0xE8CC, 0x677C,\t0xE8CD, 0x67F0, 0xE8CE, 0x6809, 0xE8CF, 0x67D8, 0xE8D0, 0x680A,\n\t0xE8D1, 0x67E9, 0xE8D2, 0x67B0, 0xE8D3, 0x680C, 0xE8D4, 0x67D9,\t0xE8D5, 0x67B5, 0xE8D6, 0x67DA, 0xE8D7, 0x67B3, 0xE8D8, 0x67DD,\n\t0xE8D9, 0x6800, 0xE8DA, 0x67C3, 0xE8DB, 0x67B8, 0xE8DC, 0x67E2,\t0xE8DD, 0x680E, 0xE8DE, 0x67C1, 0xE8DF, 0x67FD, 0xE8E0, 0x6832,\n\t0xE8E1, 0x6833, 0xE8E2, 0x6860, 0xE8E3, 0x6861, 0xE8E4, 0x684E,\t0xE8E5, 0x6862, 0xE8E6, 0x6844, 0xE8E7, 0x6864, 0xE8E8, 0x6883,\n\t0xE8E9, 0x681D, 0xE8EA, 0x6855, 0xE8EB, 0x6866, 0xE8EC, 0x6841,\t0xE8ED, 0x6867, 0xE8EE, 0x6840, 0xE8EF, 0x683E, 0xE8F0, 0x684A,\n\t0xE8F1, 0x6849, 0xE8F2, 0x6829, 0xE8F3, 0x68B5, 0xE8F4, 0x688F,\t0xE8F5, 0x6874, 0xE8F6, 0x6877, 0xE8F7, 0x6893, 0xE8F8, 0x686B,\n\t0xE8F9, 0x68C2, 0xE8FA, 0x696E, 0xE8FB, 0x68FC, 0xE8FC, 0x691F,\t0xE8FD, 0x6920, 0xE8FE, 0x68F9, 0xE940, 0x9527, 0xE941, 0x9533,\n\t0xE942, 0x953D, 0xE943, 0x9543, 0xE944, 0x9548, 0xE945, 0x954B,\t0xE946, 0x9555, 0xE947, 0x955A, 0xE948, 0x9560, 0xE949, 0x956E,\n\t0xE94A, 0x9574, 0xE94B, 0x9575, 0xE94C, 0x9577, 0xE94D, 0x9578,\t0xE94E, 0x9579, 0xE94F, 0x957A, 0xE950, 0x957B, 0xE951, 0x957C,\n\t0xE952, 0x957D, 0xE953, 0x957E, 0xE954, 0x9580, 0xE955, 0x9581,\t0xE956, 0x9582, 0xE957, 0x9583, 0xE958, 0x9584, 0xE959, 0x9585,\n\t0xE95A, 0x9586, 0xE95B, 0x9587, 0xE95C, 0x9588, 0xE95D, 0x9589,\t0xE95E, 0x958A, 0xE95F, 0x958B, 0xE960, 0x958C, 0xE961, 0x958D,\n\t0xE962, 0x958E, 0xE963, 0x958F, 0xE964, 0x9590, 0xE965, 0x9591,\t0xE966, 0x9592, 0xE967, 0x9593, 0xE968, 0x9594, 0xE969, 0x9595,\n\t0xE96A, 0x9596, 0xE96B, 0x9597, 0xE96C, 0x9598, 0xE96D, 0x9599,\t0xE96E, 0x959A, 0xE96F, 0x959B, 0xE970, 0x959C, 0xE971, 0x959D,\n\t0xE972, 0x959E, 0xE973, 0x959F, 0xE974, 0x95A0, 0xE975, 0x95A1,\t0xE976, 0x95A2, 0xE977, 0x95A3, 0xE978, 0x95A4, 0xE979, 0x95A5,\n\t0xE97A, 0x95A6, 0xE97B, 0x95A7, 0xE97C, 0x95A8, 0xE97D, 0x95A9,\t0xE97E, 0x95AA, 0xE980, 0x95AB, 0xE981, 0x95AC, 0xE982, 0x95AD,\n\t0xE983, 0x95AE, 0xE984, 0x95AF, 0xE985, 0x95B0, 0xE986, 0x95B1,\t0xE987, 0x95B2, 0xE988, 0x95B3, 0xE989, 0x95B4, 0xE98A, 0x95B5,\n\t0xE98B, 0x95B6, 0xE98C, 0x95B7, 0xE98D, 0x95B8, 0xE98E, 0x95B9,\t0xE98F, 0x95BA, 0xE990, 0x95BB, 0xE991, 0x95BC, 0xE992, 0x95BD,\n\t0xE993, 0x95BE, 0xE994, 0x95BF, 0xE995, 0x95C0, 0xE996, 0x95C1,\t0xE997, 0x95C2, 0xE998, 0x95C3, 0xE999, 0x95C4, 0xE99A, 0x95C5,\n\t0xE99B, 0x95C6, 0xE99C, 0x95C7, 0xE99D, 0x95C8, 0xE99E, 0x95C9,\t0xE99F, 0x95CA, 0xE9A0, 0x95CB, 0xE9A1, 0x6924, 0xE9A2, 0x68F0,\n\t0xE9A3, 0x690B, 0xE9A4, 0x6901, 0xE9A5, 0x6957, 0xE9A6, 0x68E3,\t0xE9A7, 0x6910, 0xE9A8, 0x6971, 0xE9A9, 0x6939, 0xE9AA, 0x6960,\n\t0xE9AB, 0x6942, 0xE9AC, 0x695D, 0xE9AD, 0x6984, 0xE9AE, 0x696B,\t0xE9AF, 0x6980, 0xE9B0, 0x6998, 0xE9B1, 0x6978, 0xE9B2, 0x6934,\n\t0xE9B3, 0x69CC, 0xE9B4, 0x6987, 0xE9B5, 0x6988, 0xE9B6, 0x69CE,\t0xE9B7, 0x6989, 0xE9B8, 0x6966, 0xE9B9, 0x6963, 0xE9BA, 0x6979,\n\t0xE9BB, 0x699B, 0xE9BC, 0x69A7, 0xE9BD, 0x69BB, 0xE9BE, 0x69AB,\t0xE9BF, 0x69AD, 0xE9C0, 0x69D4, 0xE9C1, 0x69B1, 0xE9C2, 0x69C1,\n\t0xE9C3, 0x69CA, 0xE9C4, 0x69DF, 0xE9C5, 0x6995, 0xE9C6, 0x69E0,\t0xE9C7, 0x698D, 0xE9C8, 0x69FF, 0xE9C9, 0x6A2F, 0xE9CA, 0x69ED,\n\t0xE9CB, 0x6A17, 0xE9CC, 0x6A18, 0xE9CD, 0x6A65, 0xE9CE, 0x69F2,\t0xE9CF, 0x6A44, 0xE9D0, 0x6A3E, 0xE9D1, 0x6AA0, 0xE9D2, 0x6A50,\n\t0xE9D3, 0x6A5B, 0xE9D4, 0x6A35, 0xE9D5, 0x6A8E, 0xE9D6, 0x6A79,\t0xE9D7, 0x6A3D, 0xE9D8, 0x6A28, 0xE9D9, 0x6A58, 0xE9DA, 0x6A7C,\n\t0xE9DB, 0x6A91, 0xE9DC, 0x6A90, 0xE9DD, 0x6AA9, 0xE9DE, 0x6A97,\t0xE9DF, 0x6AAB, 0xE9E0, 0x7337, 0xE9E1, 0x7352, 0xE9E2, 0x6B81,\n\t0xE9E3, 0x6B82, 0xE9E4, 0x6B87, 0xE9E5, 0x6B84, 0xE9E6, 0x6B92,\t0xE9E7, 0x6B93, 0xE9E8, 0x6B8D, 0xE9E9, 0x6B9A, 0xE9EA, 0x6B9B,\n\t0xE9EB, 0x6BA1, 0xE9EC, 0x6BAA, 0xE9ED, 0x8F6B, 0xE9EE, 0x8F6D,\t0xE9EF, 0x8F71, 0xE9F0, 0x8F72, 0xE9F1, 0x8F73, 0xE9F2, 0x8F75,\n\t0xE9F3, 0x8F76, 0xE9F4, 0x8F78, 0xE9F5, 0x8F77, 0xE9F6, 0x8F79,\t0xE9F7, 0x8F7A, 0xE9F8, 0x8F7C, 0xE9F9, 0x8F7E, 0xE9FA, 0x8F81,\n\t0xE9FB, 0x8F82, 0xE9FC, 0x8F84, 0xE9FD, 0x8F87, 0xE9FE, 0x8F8B,\t0xEA40, 0x95CC, 0xEA41, 0x95CD, 0xEA42, 0x95CE, 0xEA43, 0x95CF,\n\t0xEA44, 0x95D0, 0xEA45, 0x95D1, 0xEA46, 0x95D2, 0xEA47, 0x95D3,\t0xEA48, 0x95D4, 0xEA49, 0x95D5, 0xEA4A, 0x95D6, 0xEA4B, 0x95D7,\n\t0xEA4C, 0x95D8, 0xEA4D, 0x95D9, 0xEA4E, 0x95DA, 0xEA4F, 0x95DB,\t0xEA50, 0x95DC, 0xEA51, 0x95DD, 0xEA52, 0x95DE, 0xEA53, 0x95DF,\n\t0xEA54, 0x95E0, 0xEA55, 0x95E1, 0xEA56, 0x95E2, 0xEA57, 0x95E3,\t0xEA58, 0x95E4, 0xEA59, 0x95E5, 0xEA5A, 0x95E6, 0xEA5B, 0x95E7,\n\t0xEA5C, 0x95EC, 0xEA5D, 0x95FF, 0xEA5E, 0x9607, 0xEA5F, 0x9613,\t0xEA60, 0x9618, 0xEA61, 0x961B, 0xEA62, 0x961E, 0xEA63, 0x9620,\n\t0xEA64, 0x9623, 0xEA65, 0x9624, 0xEA66, 0x9625, 0xEA67, 0x9626,\t0xEA68, 0x9627, 0xEA69, 0x9628, 0xEA6A, 0x9629, 0xEA6B, 0x962B,\n\t0xEA6C, 0x962C, 0xEA6D, 0x962D, 0xEA6E, 0x962F, 0xEA6F, 0x9630,\t0xEA70, 0x9637, 0xEA71, 0x9638, 0xEA72, 0x9639, 0xEA73, 0x963A,\n\t0xEA74, 0x963E, 0xEA75, 0x9641, 0xEA76, 0x9643, 0xEA77, 0x964A,\t0xEA78, 0x964E, 0xEA79, 0x964F, 0xEA7A, 0x9651, 0xEA7B, 0x9652,\n\t0xEA7C, 0x9653, 0xEA7D, 0x9656, 0xEA7E, 0x9657, 0xEA80, 0x9658,\t0xEA81, 0x9659, 0xEA82, 0x965A, 0xEA83, 0x965C, 0xEA84, 0x965D,\n\t0xEA85, 0x965E, 0xEA86, 0x9660, 0xEA87, 0x9663, 0xEA88, 0x9665,\t0xEA89, 0x9666, 0xEA8A, 0x966B, 0xEA8B, 0x966D, 0xEA8C, 0x966E,\n\t0xEA8D, 0x966F, 0xEA8E, 0x9670, 0xEA8F, 0x9671, 0xEA90, 0x9673,\t0xEA91, 0x9678, 0xEA92, 0x9679, 0xEA93, 0x967A, 0xEA94, 0x967B,\n\t0xEA95, 0x967C, 0xEA96, 0x967D, 0xEA97, 0x967E, 0xEA98, 0x967F,\t0xEA99, 0x9680, 0xEA9A, 0x9681, 0xEA9B, 0x9682, 0xEA9C, 0x9683,\n\t0xEA9D, 0x9684, 0xEA9E, 0x9687, 0xEA9F, 0x9689, 0xEAA0, 0x968A,\t0xEAA1, 0x8F8D, 0xEAA2, 0x8F8E, 0xEAA3, 0x8F8F, 0xEAA4, 0x8F98,\n\t0xEAA5, 0x8F9A, 0xEAA6, 0x8ECE, 0xEAA7, 0x620B, 0xEAA8, 0x6217,\t0xEAA9, 0x621B, 0xEAAA, 0x621F, 0xEAAB, 0x6222, 0xEAAC, 0x6221,\n\t0xEAAD, 0x6225, 0xEAAE, 0x6224, 0xEAAF, 0x622C, 0xEAB0, 0x81E7,\t0xEAB1, 0x74EF, 0xEAB2, 0x74F4, 0xEAB3, 0x74FF, 0xEAB4, 0x750F,\n\t0xEAB5, 0x7511, 0xEAB6, 0x7513, 0xEAB7, 0x6534, 0xEAB8, 0x65EE,\t0xEAB9, 0x65EF, 0xEABA, 0x65F0, 0xEABB, 0x660A, 0xEABC, 0x6619,\n\t0xEABD, 0x6772, 0xEABE, 0x6603, 0xEABF, 0x6615, 0xEAC0, 0x6600,\t0xEAC1, 0x7085, 0xEAC2, 0x66F7, 0xEAC3, 0x661D, 0xEAC4, 0x6634,\n\t0xEAC5, 0x6631, 0xEAC6, 0x6636, 0xEAC7, 0x6635, 0xEAC8, 0x8006,\t0xEAC9, 0x665F, 0xEACA, 0x6654, 0xEACB, 0x6641, 0xEACC, 0x664F,\n\t0xEACD, 0x6656, 0xEACE, 0x6661, 0xEACF, 0x6657, 0xEAD0, 0x6677,\t0xEAD1, 0x6684, 0xEAD2, 0x668C, 0xEAD3, 0x66A7, 0xEAD4, 0x669D,\n\t0xEAD5, 0x66BE, 0xEAD6, 0x66DB, 0xEAD7, 0x66DC, 0xEAD8, 0x66E6,\t0xEAD9, 0x66E9, 0xEADA, 0x8D32, 0xEADB, 0x8D33, 0xEADC, 0x8D36,\n\t0xEADD, 0x8D3B, 0xEADE, 0x8D3D, 0xEADF, 0x8D40, 0xEAE0, 0x8D45,\t0xEAE1, 0x8D46, 0xEAE2, 0x8D48, 0xEAE3, 0x8D49, 0xEAE4, 0x8D47,\n\t0xEAE5, 0x8D4D, 0xEAE6, 0x8D55, 0xEAE7, 0x8D59, 0xEAE8, 0x89C7,\t0xEAE9, 0x89CA, 0xEAEA, 0x89CB, 0xEAEB, 0x89CC, 0xEAEC, 0x89CE,\n\t0xEAED, 0x89CF, 0xEAEE, 0x89D0, 0xEAEF, 0x89D1, 0xEAF0, 0x726E,\t0xEAF1, 0x729F, 0xEAF2, 0x725D, 0xEAF3, 0x7266, 0xEAF4, 0x726F,\n\t0xEAF5, 0x727E, 0xEAF6, 0x727F, 0xEAF7, 0x7284, 0xEAF8, 0x728B,\t0xEAF9, 0x728D, 0xEAFA, 0x728F, 0xEAFB, 0x7292, 0xEAFC, 0x6308,\n\t0xEAFD, 0x6332, 0xEAFE, 0x63B0, 0xEB40, 0x968C, 0xEB41, 0x968E,\t0xEB42, 0x9691, 0xEB43, 0x9692, 0xEB44, 0x9693, 0xEB45, 0x9695,\n\t0xEB46, 0x9696, 0xEB47, 0x969A, 0xEB48, 0x969B, 0xEB49, 0x969D,\t0xEB4A, 0x969E, 0xEB4B, 0x969F, 0xEB4C, 0x96A0, 0xEB4D, 0x96A1,\n\t0xEB4E, 0x96A2, 0xEB4F, 0x96A3, 0xEB50, 0x96A4, 0xEB51, 0x96A5,\t0xEB52, 0x96A6, 0xEB53, 0x96A8, 0xEB54, 0x96A9, 0xEB55, 0x96AA,\n\t0xEB56, 0x96AB, 0xEB57, 0x96AC, 0xEB58, 0x96AD, 0xEB59, 0x96AE,\t0xEB5A, 0x96AF, 0xEB5B, 0x96B1, 0xEB5C, 0x96B2, 0xEB5D, 0x96B4,\n\t0xEB5E, 0x96B5, 0xEB5F, 0x96B7, 0xEB60, 0x96B8, 0xEB61, 0x96BA,\t0xEB62, 0x96BB, 0xEB63, 0x96BF, 0xEB64, 0x96C2, 0xEB65, 0x96C3,\n\t0xEB66, 0x96C8, 0xEB67, 0x96CA, 0xEB68, 0x96CB, 0xEB69, 0x96D0,\t0xEB6A, 0x96D1, 0xEB6B, 0x96D3, 0xEB6C, 0x96D4, 0xEB6D, 0x96D6,\n\t0xEB6E, 0x96D7, 0xEB6F, 0x96D8, 0xEB70, 0x96D9, 0xEB71, 0x96DA,\t0xEB72, 0x96DB, 0xEB73, 0x96DC, 0xEB74, 0x96DD, 0xEB75, 0x96DE,\n\t0xEB76, 0x96DF, 0xEB77, 0x96E1, 0xEB78, 0x96E2, 0xEB79, 0x96E3,\t0xEB7A, 0x96E4, 0xEB7B, 0x96E5, 0xEB7C, 0x96E6, 0xEB7D, 0x96E7,\n\t0xEB7E, 0x96EB, 0xEB80, 0x96EC, 0xEB81, 0x96ED, 0xEB82, 0x96EE,\t0xEB83, 0x96F0, 0xEB84, 0x96F1, 0xEB85, 0x96F2, 0xEB86, 0x96F4,\n\t0xEB87, 0x96F5, 0xEB88, 0x96F8, 0xEB89, 0x96FA, 0xEB8A, 0x96FB,\t0xEB8B, 0x96FC, 0xEB8C, 0x96FD, 0xEB8D, 0x96FF, 0xEB8E, 0x9702,\n\t0xEB8F, 0x9703, 0xEB90, 0x9705, 0xEB91, 0x970A, 0xEB92, 0x970B,\t0xEB93, 0x970C, 0xEB94, 0x9710, 0xEB95, 0x9711, 0xEB96, 0x9712,\n\t0xEB97, 0x9714, 0xEB98, 0x9715, 0xEB99, 0x9717, 0xEB9A, 0x9718,\t0xEB9B, 0x9719, 0xEB9C, 0x971A, 0xEB9D, 0x971B, 0xEB9E, 0x971D,\n\t0xEB9F, 0x971F, 0xEBA0, 0x9720, 0xEBA1, 0x643F, 0xEBA2, 0x64D8,\t0xEBA3, 0x8004, 0xEBA4, 0x6BEA, 0xEBA5, 0x6BF3, 0xEBA6, 0x6BFD,\n\t0xEBA7, 0x6BF5, 0xEBA8, 0x6BF9, 0xEBA9, 0x6C05, 0xEBAA, 0x6C07,\t0xEBAB, 0x6C06, 0xEBAC, 0x6C0D, 0xEBAD, 0x6C15, 0xEBAE, 0x6C18,\n\t0xEBAF, 0x6C19, 0xEBB0, 0x6C1A, 0xEBB1, 0x6C21, 0xEBB2, 0x6C29,\t0xEBB3, 0x6C24, 0xEBB4, 0x6C2A, 0xEBB5, 0x6C32, 0xEBB6, 0x6535,\n\t0xEBB7, 0x6555, 0xEBB8, 0x656B, 0xEBB9, 0x724D, 0xEBBA, 0x7252,\t0xEBBB, 0x7256, 0xEBBC, 0x7230, 0xEBBD, 0x8662, 0xEBBE, 0x5216,\n\t0xEBBF, 0x809F, 0xEBC0, 0x809C, 0xEBC1, 0x8093, 0xEBC2, 0x80BC,\t0xEBC3, 0x670A, 0xEBC4, 0x80BD, 0xEBC5, 0x80B1, 0xEBC6, 0x80AB,\n\t0xEBC7, 0x80AD, 0xEBC8, 0x80B4, 0xEBC9, 0x80B7, 0xEBCA, 0x80E7,\t0xEBCB, 0x80E8, 0xEBCC, 0x80E9, 0xEBCD, 0x80EA, 0xEBCE, 0x80DB,\n\t0xEBCF, 0x80C2, 0xEBD0, 0x80C4, 0xEBD1, 0x80D9, 0xEBD2, 0x80CD,\t0xEBD3, 0x80D7, 0xEBD4, 0x6710, 0xEBD5, 0x80DD, 0xEBD6, 0x80EB,\n\t0xEBD7, 0x80F1, 0xEBD8, 0x80F4, 0xEBD9, 0x80ED, 0xEBDA, 0x810D,\t0xEBDB, 0x810E, 0xEBDC, 0x80F2, 0xEBDD, 0x80FC, 0xEBDE, 0x6715,\n\t0xEBDF, 0x8112, 0xEBE0, 0x8C5A, 0xEBE1, 0x8136, 0xEBE2, 0x811E,\t0xEBE3, 0x812C, 0xEBE4, 0x8118, 0xEBE5, 0x8132, 0xEBE6, 0x8148,\n\t0xEBE7, 0x814C, 0xEBE8, 0x8153, 0xEBE9, 0x8174, 0xEBEA, 0x8159,\t0xEBEB, 0x815A, 0xEBEC, 0x8171, 0xEBED, 0x8160, 0xEBEE, 0x8169,\n\t0xEBEF, 0x817C, 0xEBF0, 0x817D, 0xEBF1, 0x816D, 0xEBF2, 0x8167,\t0xEBF3, 0x584D, 0xEBF4, 0x5AB5, 0xEBF5, 0x8188, 0xEBF6, 0x8182,\n\t0xEBF7, 0x8191, 0xEBF8, 0x6ED5, 0xEBF9, 0x81A3, 0xEBFA, 0x81AA,\t0xEBFB, 0x81CC, 0xEBFC, 0x6726, 0xEBFD, 0x81CA, 0xEBFE, 0x81BB,\n\t0xEC40, 0x9721, 0xEC41, 0x9722, 0xEC42, 0x9723, 0xEC43, 0x9724,\t0xEC44, 0x9725, 0xEC45, 0x9726, 0xEC46, 0x9727, 0xEC47, 0x9728,\n\t0xEC48, 0x9729, 0xEC49, 0x972B, 0xEC4A, 0x972C, 0xEC4B, 0x972E,\t0xEC4C, 0x972F, 0xEC4D, 0x9731, 0xEC4E, 0x9733, 0xEC4F, 0x9734,\n\t0xEC50, 0x9735, 0xEC51, 0x9736, 0xEC52, 0x9737, 0xEC53, 0x973A,\t0xEC54, 0x973B, 0xEC55, 0x973C, 0xEC56, 0x973D, 0xEC57, 0x973F,\n\t0xEC58, 0x9740, 0xEC59, 0x9741, 0xEC5A, 0x9742, 0xEC5B, 0x9743,\t0xEC5C, 0x9744, 0xEC5D, 0x9745, 0xEC5E, 0x9746, 0xEC5F, 0x9747,\n\t0xEC60, 0x9748, 0xEC61, 0x9749, 0xEC62, 0x974A, 0xEC63, 0x974B,\t0xEC64, 0x974C, 0xEC65, 0x974D, 0xEC66, 0x974E, 0xEC67, 0x974F,\n\t0xEC68, 0x9750, 0xEC69, 0x9751, 0xEC6A, 0x9754, 0xEC6B, 0x9755,\t0xEC6C, 0x9757, 0xEC6D, 0x9758, 0xEC6E, 0x975A, 0xEC6F, 0x975C,\n\t0xEC70, 0x975D, 0xEC71, 0x975F, 0xEC72, 0x9763, 0xEC73, 0x9764,\t0xEC74, 0x9766, 0xEC75, 0x9767, 0xEC76, 0x9768, 0xEC77, 0x976A,\n\t0xEC78, 0x976B, 0xEC79, 0x976C, 0xEC7A, 0x976D, 0xEC7B, 0x976E,\t0xEC7C, 0x976F, 0xEC7D, 0x9770, 0xEC7E, 0x9771, 0xEC80, 0x9772,\n\t0xEC81, 0x9775, 0xEC82, 0x9777, 0xEC83, 0x9778, 0xEC84, 0x9779,\t0xEC85, 0x977A, 0xEC86, 0x977B, 0xEC87, 0x977D, 0xEC88, 0x977E,\n\t0xEC89, 0x977F, 0xEC8A, 0x9780, 0xEC8B, 0x9781, 0xEC8C, 0x9782,\t0xEC8D, 0x9783, 0xEC8E, 0x9784, 0xEC8F, 0x9786, 0xEC90, 0x9787,\n\t0xEC91, 0x9788, 0xEC92, 0x9789, 0xEC93, 0x978A, 0xEC94, 0x978C,\t0xEC95, 0x978E, 0xEC96, 0x978F, 0xEC97, 0x9790, 0xEC98, 0x9793,\n\t0xEC99, 0x9795, 0xEC9A, 0x9796, 0xEC9B, 0x9797, 0xEC9C, 0x9799,\t0xEC9D, 0x979A, 0xEC9E, 0x979B, 0xEC9F, 0x979C, 0xECA0, 0x979D,\n\t0xECA1, 0x81C1, 0xECA2, 0x81A6, 0xECA3, 0x6B24, 0xECA4, 0x6B37,\t0xECA5, 0x6B39, 0xECA6, 0x6B43, 0xECA7, 0x6B46, 0xECA8, 0x6B59,\n\t0xECA9, 0x98D1, 0xECAA, 0x98D2, 0xECAB, 0x98D3, 0xECAC, 0x98D5,\t0xECAD, 0x98D9, 0xECAE, 0x98DA, 0xECAF, 0x6BB3, 0xECB0, 0x5F40,\n\t0xECB1, 0x6BC2, 0xECB2, 0x89F3, 0xECB3, 0x6590, 0xECB4, 0x9F51,\t0xECB5, 0x6593, 0xECB6, 0x65BC, 0xECB7, 0x65C6, 0xECB8, 0x65C4,\n\t0xECB9, 0x65C3, 0xECBA, 0x65CC, 0xECBB, 0x65CE, 0xECBC, 0x65D2,\t0xECBD, 0x65D6, 0xECBE, 0x7080, 0xECBF, 0x709C, 0xECC0, 0x7096,\n\t0xECC1, 0x709D, 0xECC2, 0x70BB, 0xECC3, 0x70C0, 0xECC4, 0x70B7,\t0xECC5, 0x70AB, 0xECC6, 0x70B1, 0xECC7, 0x70E8, 0xECC8, 0x70CA,\n\t0xECC9, 0x7110, 0xECCA, 0x7113, 0xECCB, 0x7116, 0xECCC, 0x712F,\t0xECCD, 0x7131, 0xECCE, 0x7173, 0xECCF, 0x715C, 0xECD0, 0x7168,\n\t0xECD1, 0x7145, 0xECD2, 0x7172, 0xECD3, 0x714A, 0xECD4, 0x7178,\t0xECD5, 0x717A, 0xECD6, 0x7198, 0xECD7, 0x71B3, 0xECD8, 0x71B5,\n\t0xECD9, 0x71A8, 0xECDA, 0x71A0, 0xECDB, 0x71E0, 0xECDC, 0x71D4,\t0xECDD, 0x71E7, 0xECDE, 0x71F9, 0xECDF, 0x721D, 0xECE0, 0x7228,\n\t0xECE1, 0x706C, 0xECE2, 0x7118, 0xECE3, 0x7166, 0xECE4, 0x71B9,\t0xECE5, 0x623E, 0xECE6, 0x623D, 0xECE7, 0x6243, 0xECE8, 0x6248,\n\t0xECE9, 0x6249, 0xECEA, 0x793B, 0xECEB, 0x7940, 0xECEC, 0x7946,\t0xECED, 0x7949, 0xECEE, 0x795B, 0xECEF, 0x795C, 0xECF0, 0x7953,\n\t0xECF1, 0x795A, 0xECF2, 0x7962, 0xECF3, 0x7957, 0xECF4, 0x7960,\t0xECF5, 0x796F, 0xECF6, 0x7967, 0xECF7, 0x797A, 0xECF8, 0x7985,\n\t0xECF9, 0x798A, 0xECFA, 0x799A, 0xECFB, 0x79A7, 0xECFC, 0x79B3,\t0xECFD, 0x5FD1, 0xECFE, 0x5FD0, 0xED40, 0x979E, 0xED41, 0x979F,\n\t0xED42, 0x97A1, 0xED43, 0x97A2, 0xED44, 0x97A4, 0xED45, 0x97A5,\t0xED46, 0x97A6, 0xED47, 0x97A7, 0xED48, 0x97A8, 0xED49, 0x97A9,\n\t0xED4A, 0x97AA, 0xED4B, 0x97AC, 0xED4C, 0x97AE, 0xED4D, 0x97B0,\t0xED4E, 0x97B1, 0xED4F, 0x97B3, 0xED50, 0x97B5, 0xED51, 0x97B6,\n\t0xED52, 0x97B7, 0xED53, 0x97B8, 0xED54, 0x97B9, 0xED55, 0x97BA,\t0xED56, 0x97BB, 0xED57, 0x97BC, 0xED58, 0x97BD, 0xED59, 0x97BE,\n\t0xED5A, 0x97BF, 0xED5B, 0x97C0, 0xED5C, 0x97C1, 0xED5D, 0x97C2,\t0xED5E, 0x97C3, 0xED5F, 0x97C4, 0xED60, 0x97C5, 0xED61, 0x97C6,\n\t0xED62, 0x97C7, 0xED63, 0x97C8, 0xED64, 0x97C9, 0xED65, 0x97CA,\t0xED66, 0x97CB, 0xED67, 0x97CC, 0xED68, 0x97CD, 0xED69, 0x97CE,\n\t0xED6A, 0x97CF, 0xED6B, 0x97D0, 0xED6C, 0x97D1, 0xED6D, 0x97D2,\t0xED6E, 0x97D3, 0xED6F, 0x97D4, 0xED70, 0x97D5, 0xED71, 0x97D6,\n\t0xED72, 0x97D7, 0xED73, 0x97D8, 0xED74, 0x97D9, 0xED75, 0x97DA,\t0xED76, 0x97DB, 0xED77, 0x97DC, 0xED78, 0x97DD, 0xED79, 0x97DE,\n\t0xED7A, 0x97DF, 0xED7B, 0x97E0, 0xED7C, 0x97E1, 0xED7D, 0x97E2,\t0xED7E, 0x97E3, 0xED80, 0x97E4, 0xED81, 0x97E5, 0xED82, 0x97E8,\n\t0xED83, 0x97EE, 0xED84, 0x97EF, 0xED85, 0x97F0, 0xED86, 0x97F1,\t0xED87, 0x97F2, 0xED88, 0x97F4, 0xED89, 0x97F7, 0xED8A, 0x97F8,\n\t0xED8B, 0x97F9, 0xED8C, 0x97FA, 0xED8D, 0x97FB, 0xED8E, 0x97FC,\t0xED8F, 0x97FD, 0xED90, 0x97FE, 0xED91, 0x97FF, 0xED92, 0x9800,\n\t0xED93, 0x9801, 0xED94, 0x9802, 0xED95, 0x9803, 0xED96, 0x9804,\t0xED97, 0x9805, 0xED98, 0x9806, 0xED99, 0x9807, 0xED9A, 0x9808,\n\t0xED9B, 0x9809, 0xED9C, 0x980A, 0xED9D, 0x980B, 0xED9E, 0x980C,\t0xED9F, 0x980D, 0xEDA0, 0x980E, 0xEDA1, 0x603C, 0xEDA2, 0x605D,\n\t0xEDA3, 0x605A, 0xEDA4, 0x6067, 0xEDA5, 0x6041, 0xEDA6, 0x6059,\t0xEDA7, 0x6063, 0xEDA8, 0x60AB, 0xEDA9, 0x6106, 0xEDAA, 0x610D,\n\t0xEDAB, 0x615D, 0xEDAC, 0x61A9, 0xEDAD, 0x619D, 0xEDAE, 0x61CB,\t0xEDAF, 0x61D1, 0xEDB0, 0x6206, 0xEDB1, 0x8080, 0xEDB2, 0x807F,\n\t0xEDB3, 0x6C93, 0xEDB4, 0x6CF6, 0xEDB5, 0x6DFC, 0xEDB6, 0x77F6,\t0xEDB7, 0x77F8, 0xEDB8, 0x7800, 0xEDB9, 0x7809, 0xEDBA, 0x7817,\n\t0xEDBB, 0x7818, 0xEDBC, 0x7811, 0xEDBD, 0x65AB, 0xEDBE, 0x782D,\t0xEDBF, 0x781C, 0xEDC0, 0x781D, 0xEDC1, 0x7839, 0xEDC2, 0x783A,\n\t0xEDC3, 0x783B, 0xEDC4, 0x781F, 0xEDC5, 0x783C, 0xEDC6, 0x7825,\t0xEDC7, 0x782C, 0xEDC8, 0x7823, 0xEDC9, 0x7829, 0xEDCA, 0x784E,\n\t0xEDCB, 0x786D, 0xEDCC, 0x7856, 0xEDCD, 0x7857, 0xEDCE, 0x7826,\t0xEDCF, 0x7850, 0xEDD0, 0x7847, 0xEDD1, 0x784C, 0xEDD2, 0x786A,\n\t0xEDD3, 0x789B, 0xEDD4, 0x7893, 0xEDD5, 0x789A, 0xEDD6, 0x7887,\t0xEDD7, 0x789C, 0xEDD8, 0x78A1, 0xEDD9, 0x78A3, 0xEDDA, 0x78B2,\n\t0xEDDB, 0x78B9, 0xEDDC, 0x78A5, 0xEDDD, 0x78D4, 0xEDDE, 0x78D9,\t0xEDDF, 0x78C9, 0xEDE0, 0x78EC, 0xEDE1, 0x78F2, 0xEDE2, 0x7905,\n\t0xEDE3, 0x78F4, 0xEDE4, 0x7913, 0xEDE5, 0x7924, 0xEDE6, 0x791E,\t0xEDE7, 0x7934, 0xEDE8, 0x9F9B, 0xEDE9, 0x9EF9, 0xEDEA, 0x9EFB,\n\t0xEDEB, 0x9EFC, 0xEDEC, 0x76F1, 0xEDED, 0x7704, 0xEDEE, 0x770D,\t0xEDEF, 0x76F9, 0xEDF0, 0x7707, 0xEDF1, 0x7708, 0xEDF2, 0x771A,\n\t0xEDF3, 0x7722, 0xEDF4, 0x7719, 0xEDF5, 0x772D, 0xEDF6, 0x7726,\t0xEDF7, 0x7735, 0xEDF8, 0x7738, 0xEDF9, 0x7750, 0xEDFA, 0x7751,\n\t0xEDFB, 0x7747, 0xEDFC, 0x7743, 0xEDFD, 0x775A, 0xEDFE, 0x7768,\t0xEE40, 0x980F, 0xEE41, 0x9810, 0xEE42, 0x9811, 0xEE43, 0x9812,\n\t0xEE44, 0x9813, 0xEE45, 0x9814, 0xEE46, 0x9815, 0xEE47, 0x9816,\t0xEE48, 0x9817, 0xEE49, 0x9818, 0xEE4A, 0x9819, 0xEE4B, 0x981A,\n\t0xEE4C, 0x981B, 0xEE4D, 0x981C, 0xEE4E, 0x981D, 0xEE4F, 0x981E,\t0xEE50, 0x981F, 0xEE51, 0x9820, 0xEE52, 0x9821, 0xEE53, 0x9822,\n\t0xEE54, 0x9823, 0xEE55, 0x9824, 0xEE56, 0x9825, 0xEE57, 0x9826,\t0xEE58, 0x9827, 0xEE59, 0x9828, 0xEE5A, 0x9829, 0xEE5B, 0x982A,\n\t0xEE5C, 0x982B, 0xEE5D, 0x982C, 0xEE5E, 0x982D, 0xEE5F, 0x982E,\t0xEE60, 0x982F, 0xEE61, 0x9830, 0xEE62, 0x9831, 0xEE63, 0x9832,\n\t0xEE64, 0x9833, 0xEE65, 0x9834, 0xEE66, 0x9835, 0xEE67, 0x9836,\t0xEE68, 0x9837, 0xEE69, 0x9838, 0xEE6A, 0x9839, 0xEE6B, 0x983A,\n\t0xEE6C, 0x983B, 0xEE6D, 0x983C, 0xEE6E, 0x983D, 0xEE6F, 0x983E,\t0xEE70, 0x983F, 0xEE71, 0x9840, 0xEE72, 0x9841, 0xEE73, 0x9842,\n\t0xEE74, 0x9843, 0xEE75, 0x9844, 0xEE76, 0x9845, 0xEE77, 0x9846,\t0xEE78, 0x9847, 0xEE79, 0x9848, 0xEE7A, 0x9849, 0xEE7B, 0x984A,\n\t0xEE7C, 0x984B, 0xEE7D, 0x984C, 0xEE7E, 0x984D, 0xEE80, 0x984E,\t0xEE81, 0x984F, 0xEE82, 0x9850, 0xEE83, 0x9851, 0xEE84, 0x9852,\n\t0xEE85, 0x9853, 0xEE86, 0x9854, 0xEE87, 0x9855, 0xEE88, 0x9856,\t0xEE89, 0x9857, 0xEE8A, 0x9858, 0xEE8B, 0x9859, 0xEE8C, 0x985A,\n\t0xEE8D, 0x985B, 0xEE8E, 0x985C, 0xEE8F, 0x985D, 0xEE90, 0x985E,\t0xEE91, 0x985F, 0xEE92, 0x9860, 0xEE93, 0x9861, 0xEE94, 0x9862,\n\t0xEE95, 0x9863, 0xEE96, 0x9864, 0xEE97, 0x9865, 0xEE98, 0x9866,\t0xEE99, 0x9867, 0xEE9A, 0x9868, 0xEE9B, 0x9869, 0xEE9C, 0x986A,\n\t0xEE9D, 0x986B, 0xEE9E, 0x986C, 0xEE9F, 0x986D, 0xEEA0, 0x986E,\t0xEEA1, 0x7762, 0xEEA2, 0x7765, 0xEEA3, 0x777F, 0xEEA4, 0x778D,\n\t0xEEA5, 0x777D, 0xEEA6, 0x7780, 0xEEA7, 0x778C, 0xEEA8, 0x7791,\t0xEEA9, 0x779F, 0xEEAA, 0x77A0, 0xEEAB, 0x77B0, 0xEEAC, 0x77B5,\n\t0xEEAD, 0x77BD, 0xEEAE, 0x753A, 0xEEAF, 0x7540, 0xEEB0, 0x754E,\t0xEEB1, 0x754B, 0xEEB2, 0x7548, 0xEEB3, 0x755B, 0xEEB4, 0x7572,\n\t0xEEB5, 0x7579, 0xEEB6, 0x7583, 0xEEB7, 0x7F58, 0xEEB8, 0x7F61,\t0xEEB9, 0x7F5F, 0xEEBA, 0x8A48, 0xEEBB, 0x7F68, 0xEEBC, 0x7F74,\n\t0xEEBD, 0x7F71, 0xEEBE, 0x7F79, 0xEEBF, 0x7F81, 0xEEC0, 0x7F7E,\t0xEEC1, 0x76CD, 0xEEC2, 0x76E5, 0xEEC3, 0x8832, 0xEEC4, 0x9485,\n\t0xEEC5, 0x9486, 0xEEC6, 0x9487, 0xEEC7, 0x948B, 0xEEC8, 0x948A,\t0xEEC9, 0x948C, 0xEECA, 0x948D, 0xEECB, 0x948F, 0xEECC, 0x9490,\n\t0xEECD, 0x9494, 0xEECE, 0x9497, 0xEECF, 0x9495, 0xEED0, 0x949A,\t0xEED1, 0x949B, 0xEED2, 0x949C, 0xEED3, 0x94A3, 0xEED4, 0x94A4,\n\t0xEED5, 0x94AB, 0xEED6, 0x94AA, 0xEED7, 0x94AD, 0xEED8, 0x94AC,\t0xEED9, 0x94AF, 0xEEDA, 0x94B0, 0xEEDB, 0x94B2, 0xEEDC, 0x94B4,\n\t0xEEDD, 0x94B6, 0xEEDE, 0x94B7, 0xEEDF, 0x94B8, 0xEEE0, 0x94B9,\t0xEEE1, 0x94BA, 0xEEE2, 0x94BC, 0xEEE3, 0x94BD, 0xEEE4, 0x94BF,\n\t0xEEE5, 0x94C4, 0xEEE6, 0x94C8, 0xEEE7, 0x94C9, 0xEEE8, 0x94CA,\t0xEEE9, 0x94CB, 0xEEEA, 0x94CC, 0xEEEB, 0x94CD, 0xEEEC, 0x94CE,\n\t0xEEED, 0x94D0, 0xEEEE, 0x94D1, 0xEEEF, 0x94D2, 0xEEF0, 0x94D5,\t0xEEF1, 0x94D6, 0xEEF2, 0x94D7, 0xEEF3, 0x94D9, 0xEEF4, 0x94D8,\n\t0xEEF5, 0x94DB, 0xEEF6, 0x94DE, 0xEEF7, 0x94DF, 0xEEF8, 0x94E0,\t0xEEF9, 0x94E2, 0xEEFA, 0x94E4, 0xEEFB, 0x94E5, 0xEEFC, 0x94E7,\n\t0xEEFD, 0x94E8, 0xEEFE, 0x94EA, 0xEF40, 0x986F, 0xEF41, 0x9870,\t0xEF42, 0x9871, 0xEF43, 0x9872, 0xEF44, 0x9873, 0xEF45, 0x9874,\n\t0xEF46, 0x988B, 0xEF47, 0x988E, 0xEF48, 0x9892, 0xEF49, 0x9895,\t0xEF4A, 0x9899, 0xEF4B, 0x98A3, 0xEF4C, 0x98A8, 0xEF4D, 0x98A9,\n\t0xEF4E, 0x98AA, 0xEF4F, 0x98AB, 0xEF50, 0x98AC, 0xEF51, 0x98AD,\t0xEF52, 0x98AE, 0xEF53, 0x98AF, 0xEF54, 0x98B0, 0xEF55, 0x98B1,\n\t0xEF56, 0x98B2, 0xEF57, 0x98B3, 0xEF58, 0x98B4, 0xEF59, 0x98B5,\t0xEF5A, 0x98B6, 0xEF5B, 0x98B7, 0xEF5C, 0x98B8, 0xEF5D, 0x98B9,\n\t0xEF5E, 0x98BA, 0xEF5F, 0x98BB, 0xEF60, 0x98BC, 0xEF61, 0x98BD,\t0xEF62, 0x98BE, 0xEF63, 0x98BF, 0xEF64, 0x98C0, 0xEF65, 0x98C1,\n\t0xEF66, 0x98C2, 0xEF67, 0x98C3, 0xEF68, 0x98C4, 0xEF69, 0x98C5,\t0xEF6A, 0x98C6, 0xEF6B, 0x98C7, 0xEF6C, 0x98C8, 0xEF6D, 0x98C9,\n\t0xEF6E, 0x98CA, 0xEF6F, 0x98CB, 0xEF70, 0x98CC, 0xEF71, 0x98CD,\t0xEF72, 0x98CF, 0xEF73, 0x98D0, 0xEF74, 0x98D4, 0xEF75, 0x98D6,\n\t0xEF76, 0x98D7, 0xEF77, 0x98DB, 0xEF78, 0x98DC, 0xEF79, 0x98DD,\t0xEF7A, 0x98E0, 0xEF7B, 0x98E1, 0xEF7C, 0x98E2, 0xEF7D, 0x98E3,\n\t0xEF7E, 0x98E4, 0xEF80, 0x98E5, 0xEF81, 0x98E6, 0xEF82, 0x98E9,\t0xEF83, 0x98EA, 0xEF84, 0x98EB, 0xEF85, 0x98EC, 0xEF86, 0x98ED,\n\t0xEF87, 0x98EE, 0xEF88, 0x98EF, 0xEF89, 0x98F0, 0xEF8A, 0x98F1,\t0xEF8B, 0x98F2, 0xEF8C, 0x98F3, 0xEF8D, 0x98F4, 0xEF8E, 0x98F5,\n\t0xEF8F, 0x98F6, 0xEF90, 0x98F7, 0xEF91, 0x98F8, 0xEF92, 0x98F9,\t0xEF93, 0x98FA, 0xEF94, 0x98FB, 0xEF95, 0x98FC, 0xEF96, 0x98FD,\n\t0xEF97, 0x98FE, 0xEF98, 0x98FF, 0xEF99, 0x9900, 0xEF9A, 0x9901,\t0xEF9B, 0x9902, 0xEF9C, 0x9903, 0xEF9D, 0x9904, 0xEF9E, 0x9905,\n\t0xEF9F, 0x9906, 0xEFA0, 0x9907, 0xEFA1, 0x94E9, 0xEFA2, 0x94EB,\t0xEFA3, 0x94EE, 0xEFA4, 0x94EF, 0xEFA5, 0x94F3, 0xEFA6, 0x94F4,\n\t0xEFA7, 0x94F5, 0xEFA8, 0x94F7, 0xEFA9, 0x94F9, 0xEFAA, 0x94FC,\t0xEFAB, 0x94FD, 0xEFAC, 0x94FF, 0xEFAD, 0x9503, 0xEFAE, 0x9502,\n\t0xEFAF, 0x9506, 0xEFB0, 0x9507, 0xEFB1, 0x9509, 0xEFB2, 0x950A,\t0xEFB3, 0x950D, 0xEFB4, 0x950E, 0xEFB5, 0x950F, 0xEFB6, 0x9512,\n\t0xEFB7, 0x9513, 0xEFB8, 0x9514, 0xEFB9, 0x9515, 0xEFBA, 0x9516,\t0xEFBB, 0x9518, 0xEFBC, 0x951B, 0xEFBD, 0x951D, 0xEFBE, 0x951E,\n\t0xEFBF, 0x951F, 0xEFC0, 0x9522, 0xEFC1, 0x952A, 0xEFC2, 0x952B,\t0xEFC3, 0x9529, 0xEFC4, 0x952C, 0xEFC5, 0x9531, 0xEFC6, 0x9532,\n\t0xEFC7, 0x9534, 0xEFC8, 0x9536, 0xEFC9, 0x9537, 0xEFCA, 0x9538,\t0xEFCB, 0x953C, 0xEFCC, 0x953E, 0xEFCD, 0x953F, 0xEFCE, 0x9542,\n\t0xEFCF, 0x9535, 0xEFD0, 0x9544, 0xEFD1, 0x9545, 0xEFD2, 0x9546,\t0xEFD3, 0x9549, 0xEFD4, 0x954C, 0xEFD5, 0x954E, 0xEFD6, 0x954F,\n\t0xEFD7, 0x9552, 0xEFD8, 0x9553, 0xEFD9, 0x9554, 0xEFDA, 0x9556,\t0xEFDB, 0x9557, 0xEFDC, 0x9558, 0xEFDD, 0x9559, 0xEFDE, 0x955B,\n\t0xEFDF, 0x955E, 0xEFE0, 0x955F, 0xEFE1, 0x955D, 0xEFE2, 0x9561,\t0xEFE3, 0x9562, 0xEFE4, 0x9564, 0xEFE5, 0x9565, 0xEFE6, 0x9566,\n\t0xEFE7, 0x9567, 0xEFE8, 0x9568, 0xEFE9, 0x9569, 0xEFEA, 0x956A,\t0xEFEB, 0x956B, 0xEFEC, 0x956C, 0xEFED, 0x956F, 0xEFEE, 0x9571,\n\t0xEFEF, 0x9572, 0xEFF0, 0x9573, 0xEFF1, 0x953A, 0xEFF2, 0x77E7,\t0xEFF3, 0x77EC, 0xEFF4, 0x96C9, 0xEFF5, 0x79D5, 0xEFF6, 0x79ED,\n\t0xEFF7, 0x79E3, 0xEFF8, 0x79EB, 0xEFF9, 0x7A06, 0xEFFA, 0x5D47,\t0xEFFB, 0x7A03, 0xEFFC, 0x7A02, 0xEFFD, 0x7A1E, 0xEFFE, 0x7A14,\n\t0xF040, 0x9908, 0xF041, 0x9909, 0xF042, 0x990A, 0xF043, 0x990B,\t0xF044, 0x990C, 0xF045, 0x990E, 0xF046, 0x990F, 0xF047, 0x9911,\n\t0xF048, 0x9912, 0xF049, 0x9913, 0xF04A, 0x9914, 0xF04B, 0x9915,\t0xF04C, 0x9916, 0xF04D, 0x9917, 0xF04E, 0x9918, 0xF04F, 0x9919,\n\t0xF050, 0x991A, 0xF051, 0x991B, 0xF052, 0x991C, 0xF053, 0x991D,\t0xF054, 0x991E, 0xF055, 0x991F, 0xF056, 0x9920, 0xF057, 0x9921,\n\t0xF058, 0x9922, 0xF059, 0x9923, 0xF05A, 0x9924, 0xF05B, 0x9925,\t0xF05C, 0x9926, 0xF05D, 0x9927, 0xF05E, 0x9928, 0xF05F, 0x9929,\n\t0xF060, 0x992A, 0xF061, 0x992B, 0xF062, 0x992C, 0xF063, 0x992D,\t0xF064, 0x992F, 0xF065, 0x9930, 0xF066, 0x9931, 0xF067, 0x9932,\n\t0xF068, 0x9933, 0xF069, 0x9934, 0xF06A, 0x9935, 0xF06B, 0x9936,\t0xF06C, 0x9937, 0xF06D, 0x9938, 0xF06E, 0x9939, 0xF06F, 0x993A,\n\t0xF070, 0x993B, 0xF071, 0x993C, 0xF072, 0x993D, 0xF073, 0x993E,\t0xF074, 0x993F, 0xF075, 0x9940, 0xF076, 0x9941, 0xF077, 0x9942,\n\t0xF078, 0x9943, 0xF079, 0x9944, 0xF07A, 0x9945, 0xF07B, 0x9946,\t0xF07C, 0x9947, 0xF07D, 0x9948, 0xF07E, 0x9949, 0xF080, 0x994A,\n\t0xF081, 0x994B, 0xF082, 0x994C, 0xF083, 0x994D, 0xF084, 0x994E,\t0xF085, 0x994F, 0xF086, 0x9950, 0xF087, 0x9951, 0xF088, 0x9952,\n\t0xF089, 0x9953, 0xF08A, 0x9956, 0xF08B, 0x9957, 0xF08C, 0x9958,\t0xF08D, 0x9959, 0xF08E, 0x995A, 0xF08F, 0x995B, 0xF090, 0x995C,\n\t0xF091, 0x995D, 0xF092, 0x995E, 0xF093, 0x995F, 0xF094, 0x9960,\t0xF095, 0x9961, 0xF096, 0x9962, 0xF097, 0x9964, 0xF098, 0x9966,\n\t0xF099, 0x9973, 0xF09A, 0x9978, 0xF09B, 0x9979, 0xF09C, 0x997B,\t0xF09D, 0x997E, 0xF09E, 0x9982, 0xF09F, 0x9983, 0xF0A0, 0x9989,\n\t0xF0A1, 0x7A39, 0xF0A2, 0x7A37, 0xF0A3, 0x7A51, 0xF0A4, 0x9ECF,\t0xF0A5, 0x99A5, 0xF0A6, 0x7A70, 0xF0A7, 0x7688, 0xF0A8, 0x768E,\n\t0xF0A9, 0x7693, 0xF0AA, 0x7699, 0xF0AB, 0x76A4, 0xF0AC, 0x74DE,\t0xF0AD, 0x74E0, 0xF0AE, 0x752C, 0xF0AF, 0x9E20, 0xF0B0, 0x9E22,\n\t0xF0B1, 0x9E28, 0xF0B2, 0x9E29, 0xF0B3, 0x9E2A, 0xF0B4, 0x9E2B,\t0xF0B5, 0x9E2C, 0xF0B6, 0x9E32, 0xF0B7, 0x9E31, 0xF0B8, 0x9E36,\n\t0xF0B9, 0x9E38, 0xF0BA, 0x9E37, 0xF0BB, 0x9E39, 0xF0BC, 0x9E3A,\t0xF0BD, 0x9E3E, 0xF0BE, 0x9E41, 0xF0BF, 0x9E42, 0xF0C0, 0x9E44,\n\t0xF0C1, 0x9E46, 0xF0C2, 0x9E47, 0xF0C3, 0x9E48, 0xF0C4, 0x9E49,\t0xF0C5, 0x9E4B, 0xF0C6, 0x9E4C, 0xF0C7, 0x9E4E, 0xF0C8, 0x9E51,\n\t0xF0C9, 0x9E55, 0xF0CA, 0x9E57, 0xF0CB, 0x9E5A, 0xF0CC, 0x9E5B,\t0xF0CD, 0x9E5C, 0xF0CE, 0x9E5E, 0xF0CF, 0x9E63, 0xF0D0, 0x9E66,\n\t0xF0D1, 0x9E67, 0xF0D2, 0x9E68, 0xF0D3, 0x9E69, 0xF0D4, 0x9E6A,\t0xF0D5, 0x9E6B, 0xF0D6, 0x9E6C, 0xF0D7, 0x9E71, 0xF0D8, 0x9E6D,\n\t0xF0D9, 0x9E73, 0xF0DA, 0x7592, 0xF0DB, 0x7594, 0xF0DC, 0x7596,\t0xF0DD, 0x75A0, 0xF0DE, 0x759D, 0xF0DF, 0x75AC, 0xF0E0, 0x75A3,\n\t0xF0E1, 0x75B3, 0xF0E2, 0x75B4, 0xF0E3, 0x75B8, 0xF0E4, 0x75C4,\t0xF0E5, 0x75B1, 0xF0E6, 0x75B0, 0xF0E7, 0x75C3, 0xF0E8, 0x75C2,\n\t0xF0E9, 0x75D6, 0xF0EA, 0x75CD, 0xF0EB, 0x75E3, 0xF0EC, 0x75E8,\t0xF0ED, 0x75E6, 0xF0EE, 0x75E4, 0xF0EF, 0x75EB, 0xF0F0, 0x75E7,\n\t0xF0F1, 0x7603, 0xF0F2, 0x75F1, 0xF0F3, 0x75FC, 0xF0F4, 0x75FF,\t0xF0F5, 0x7610, 0xF0F6, 0x7600, 0xF0F7, 0x7605, 0xF0F8, 0x760C,\n\t0xF0F9, 0x7617, 0xF0FA, 0x760A, 0xF0FB, 0x7625, 0xF0FC, 0x7618,\t0xF0FD, 0x7615, 0xF0FE, 0x7619, 0xF140, 0x998C, 0xF141, 0x998E,\n\t0xF142, 0x999A, 0xF143, 0x999B, 0xF144, 0x999C, 0xF145, 0x999D,\t0xF146, 0x999E, 0xF147, 0x999F, 0xF148, 0x99A0, 0xF149, 0x99A1,\n\t0xF14A, 0x99A2, 0xF14B, 0x99A3, 0xF14C, 0x99A4, 0xF14D, 0x99A6,\t0xF14E, 0x99A7, 0xF14F, 0x99A9, 0xF150, 0x99AA, 0xF151, 0x99AB,\n\t0xF152, 0x99AC, 0xF153, 0x99AD, 0xF154, 0x99AE, 0xF155, 0x99AF,\t0xF156, 0x99B0, 0xF157, 0x99B1, 0xF158, 0x99B2, 0xF159, 0x99B3,\n\t0xF15A, 0x99B4, 0xF15B, 0x99B5, 0xF15C, 0x99B6, 0xF15D, 0x99B7,\t0xF15E, 0x99B8, 0xF15F, 0x99B9, 0xF160, 0x99BA, 0xF161, 0x99BB,\n\t0xF162, 0x99BC, 0xF163, 0x99BD, 0xF164, 0x99BE, 0xF165, 0x99BF,\t0xF166, 0x99C0, 0xF167, 0x99C1, 0xF168, 0x99C2, 0xF169, 0x99C3,\n\t0xF16A, 0x99C4, 0xF16B, 0x99C5, 0xF16C, 0x99C6, 0xF16D, 0x99C7,\t0xF16E, 0x99C8, 0xF16F, 0x99C9, 0xF170, 0x99CA, 0xF171, 0x99CB,\n\t0xF172, 0x99CC, 0xF173, 0x99CD, 0xF174, 0x99CE, 0xF175, 0x99CF,\t0xF176, 0x99D0, 0xF177, 0x99D1, 0xF178, 0x99D2, 0xF179, 0x99D3,\n\t0xF17A, 0x99D4, 0xF17B, 0x99D5, 0xF17C, 0x99D6, 0xF17D, 0x99D7,\t0xF17E, 0x99D8, 0xF180, 0x99D9, 0xF181, 0x99DA, 0xF182, 0x99DB,\n\t0xF183, 0x99DC, 0xF184, 0x99DD, 0xF185, 0x99DE, 0xF186, 0x99DF,\t0xF187, 0x99E0, 0xF188, 0x99E1, 0xF189, 0x99E2, 0xF18A, 0x99E3,\n\t0xF18B, 0x99E4, 0xF18C, 0x99E5, 0xF18D, 0x99E6, 0xF18E, 0x99E7,\t0xF18F, 0x99E8, 0xF190, 0x99E9, 0xF191, 0x99EA, 0xF192, 0x99EB,\n\t0xF193, 0x99EC, 0xF194, 0x99ED, 0xF195, 0x99EE, 0xF196, 0x99EF,\t0xF197, 0x99F0, 0xF198, 0x99F1, 0xF199, 0x99F2, 0xF19A, 0x99F3,\n\t0xF19B, 0x99F4, 0xF19C, 0x99F5, 0xF19D, 0x99F6, 0xF19E, 0x99F7,\t0xF19F, 0x99F8, 0xF1A0, 0x99F9, 0xF1A1, 0x761B, 0xF1A2, 0x763C,\n\t0xF1A3, 0x7622, 0xF1A4, 0x7620, 0xF1A5, 0x7640, 0xF1A6, 0x762D,\t0xF1A7, 0x7630, 0xF1A8, 0x763F, 0xF1A9, 0x7635, 0xF1AA, 0x7643,\n\t0xF1AB, 0x763E, 0xF1AC, 0x7633, 0xF1AD, 0x764D, 0xF1AE, 0x765E,\t0xF1AF, 0x7654, 0xF1B0, 0x765C, 0xF1B1, 0x7656, 0xF1B2, 0x766B,\n\t0xF1B3, 0x766F, 0xF1B4, 0x7FCA, 0xF1B5, 0x7AE6, 0xF1B6, 0x7A78,\t0xF1B7, 0x7A79, 0xF1B8, 0x7A80, 0xF1B9, 0x7A86, 0xF1BA, 0x7A88,\n\t0xF1BB, 0x7A95, 0xF1BC, 0x7AA6, 0xF1BD, 0x7AA0, 0xF1BE, 0x7AAC,\t0xF1BF, 0x7AA8, 0xF1C0, 0x7AAD, 0xF1C1, 0x7AB3, 0xF1C2, 0x8864,\n\t0xF1C3, 0x8869, 0xF1C4, 0x8872, 0xF1C5, 0x887D, 0xF1C6, 0x887F,\t0xF1C7, 0x8882, 0xF1C8, 0x88A2, 0xF1C9, 0x88C6, 0xF1CA, 0x88B7,\n\t0xF1CB, 0x88BC, 0xF1CC, 0x88C9, 0xF1CD, 0x88E2, 0xF1CE, 0x88CE,\t0xF1CF, 0x88E3, 0xF1D0, 0x88E5, 0xF1D1, 0x88F1, 0xF1D2, 0x891A,\n\t0xF1D3, 0x88FC, 0xF1D4, 0x88E8, 0xF1D5, 0x88FE, 0xF1D6, 0x88F0,\t0xF1D7, 0x8921, 0xF1D8, 0x8919, 0xF1D9, 0x8913, 0xF1DA, 0x891B,\n\t0xF1DB, 0x890A, 0xF1DC, 0x8934, 0xF1DD, 0x892B, 0xF1DE, 0x8936,\t0xF1DF, 0x8941, 0xF1E0, 0x8966, 0xF1E1, 0x897B, 0xF1E2, 0x758B,\n\t0xF1E3, 0x80E5, 0xF1E4, 0x76B2, 0xF1E5, 0x76B4, 0xF1E6, 0x77DC,\t0xF1E7, 0x8012, 0xF1E8, 0x8014, 0xF1E9, 0x8016, 0xF1EA, 0x801C,\n\t0xF1EB, 0x8020, 0xF1EC, 0x8022, 0xF1ED, 0x8025, 0xF1EE, 0x8026,\t0xF1EF, 0x8027, 0xF1F0, 0x8029, 0xF1F1, 0x8028, 0xF1F2, 0x8031,\n\t0xF1F3, 0x800B, 0xF1F4, 0x8035, 0xF1F5, 0x8043, 0xF1F6, 0x8046,\t0xF1F7, 0x804D, 0xF1F8, 0x8052, 0xF1F9, 0x8069, 0xF1FA, 0x8071,\n\t0xF1FB, 0x8983, 0xF1FC, 0x9878, 0xF1FD, 0x9880, 0xF1FE, 0x9883,\t0xF240, 0x99FA, 0xF241, 0x99FB, 0xF242, 0x99FC, 0xF243, 0x99FD,\n\t0xF244, 0x99FE, 0xF245, 0x99FF, 0xF246, 0x9A00, 0xF247, 0x9A01,\t0xF248, 0x9A02, 0xF249, 0x9A03, 0xF24A, 0x9A04, 0xF24B, 0x9A05,\n\t0xF24C, 0x9A06, 0xF24D, 0x9A07, 0xF24E, 0x9A08, 0xF24F, 0x9A09,\t0xF250, 0x9A0A, 0xF251, 0x9A0B, 0xF252, 0x9A0C, 0xF253, 0x9A0D,\n\t0xF254, 0x9A0E, 0xF255, 0x9A0F, 0xF256, 0x9A10, 0xF257, 0x9A11,\t0xF258, 0x9A12, 0xF259, 0x9A13, 0xF25A, 0x9A14, 0xF25B, 0x9A15,\n\t0xF25C, 0x9A16, 0xF25D, 0x9A17, 0xF25E, 0x9A18, 0xF25F, 0x9A19,\t0xF260, 0x9A1A, 0xF261, 0x9A1B, 0xF262, 0x9A1C, 0xF263, 0x9A1D,\n\t0xF264, 0x9A1E, 0xF265, 0x9A1F, 0xF266, 0x9A20, 0xF267, 0x9A21,\t0xF268, 0x9A22, 0xF269, 0x9A23, 0xF26A, 0x9A24, 0xF26B, 0x9A25,\n\t0xF26C, 0x9A26, 0xF26D, 0x9A27, 0xF26E, 0x9A28, 0xF26F, 0x9A29,\t0xF270, 0x9A2A, 0xF271, 0x9A2B, 0xF272, 0x9A2C, 0xF273, 0x9A2D,\n\t0xF274, 0x9A2E, 0xF275, 0x9A2F, 0xF276, 0x9A30, 0xF277, 0x9A31,\t0xF278, 0x9A32, 0xF279, 0x9A33, 0xF27A, 0x9A34, 0xF27B, 0x9A35,\n\t0xF27C, 0x9A36, 0xF27D, 0x9A37, 0xF27E, 0x9A38, 0xF280, 0x9A39,\t0xF281, 0x9A3A, 0xF282, 0x9A3B, 0xF283, 0x9A3C, 0xF284, 0x9A3D,\n\t0xF285, 0x9A3E, 0xF286, 0x9A3F, 0xF287, 0x9A40, 0xF288, 0x9A41,\t0xF289, 0x9A42, 0xF28A, 0x9A43, 0xF28B, 0x9A44, 0xF28C, 0x9A45,\n\t0xF28D, 0x9A46, 0xF28E, 0x9A47, 0xF28F, 0x9A48, 0xF290, 0x9A49,\t0xF291, 0x9A4A, 0xF292, 0x9A4B, 0xF293, 0x9A4C, 0xF294, 0x9A4D,\n\t0xF295, 0x9A4E, 0xF296, 0x9A4F, 0xF297, 0x9A50, 0xF298, 0x9A51,\t0xF299, 0x9A52, 0xF29A, 0x9A53, 0xF29B, 0x9A54, 0xF29C, 0x9A55,\n\t0xF29D, 0x9A56, 0xF29E, 0x9A57, 0xF29F, 0x9A58, 0xF2A0, 0x9A59,\t0xF2A1, 0x9889, 0xF2A2, 0x988C, 0xF2A3, 0x988D, 0xF2A4, 0x988F,\n\t0xF2A5, 0x9894, 0xF2A6, 0x989A, 0xF2A7, 0x989B, 0xF2A8, 0x989E,\t0xF2A9, 0x989F, 0xF2AA, 0x98A1, 0xF2AB, 0x98A2, 0xF2AC, 0x98A5,\n\t0xF2AD, 0x98A6, 0xF2AE, 0x864D, 0xF2AF, 0x8654, 0xF2B0, 0x866C,\t0xF2B1, 0x866E, 0xF2B2, 0x867F, 0xF2B3, 0x867A, 0xF2B4, 0x867C,\n\t0xF2B5, 0x867B, 0xF2B6, 0x86A8, 0xF2B7, 0x868D, 0xF2B8, 0x868B,\t0xF2B9, 0x86AC, 0xF2BA, 0x869D, 0xF2BB, 0x86A7, 0xF2BC, 0x86A3,\n\t0xF2BD, 0x86AA, 0xF2BE, 0x8693, 0xF2BF, 0x86A9, 0xF2C0, 0x86B6,\t0xF2C1, 0x86C4, 0xF2C2, 0x86B5, 0xF2C3, 0x86CE, 0xF2C4, 0x86B0,\n\t0xF2C5, 0x86BA, 0xF2C6, 0x86B1, 0xF2C7, 0x86AF, 0xF2C8, 0x86C9,\t0xF2C9, 0x86CF, 0xF2CA, 0x86B4, 0xF2CB, 0x86E9, 0xF2CC, 0x86F1,\n\t0xF2CD, 0x86F2, 0xF2CE, 0x86ED, 0xF2CF, 0x86F3, 0xF2D0, 0x86D0,\t0xF2D1, 0x8713, 0xF2D2, 0x86DE, 0xF2D3, 0x86F4, 0xF2D4, 0x86DF,\n\t0xF2D5, 0x86D8, 0xF2D6, 0x86D1, 0xF2D7, 0x8703, 0xF2D8, 0x8707,\t0xF2D9, 0x86F8, 0xF2DA, 0x8708, 0xF2DB, 0x870A, 0xF2DC, 0x870D,\n\t0xF2DD, 0x8709, 0xF2DE, 0x8723, 0xF2DF, 0x873B, 0xF2E0, 0x871E,\t0xF2E1, 0x8725, 0xF2E2, 0x872E, 0xF2E3, 0x871A, 0xF2E4, 0x873E,\n\t0xF2E5, 0x8748, 0xF2E6, 0x8734, 0xF2E7, 0x8731, 0xF2E8, 0x8729,\t0xF2E9, 0x8737, 0xF2EA, 0x873F, 0xF2EB, 0x8782, 0xF2EC, 0x8722,\n\t0xF2ED, 0x877D, 0xF2EE, 0x877E, 0xF2EF, 0x877B, 0xF2F0, 0x8760,\t0xF2F1, 0x8770, 0xF2F2, 0x874C, 0xF2F3, 0x876E, 0xF2F4, 0x878B,\n\t0xF2F5, 0x8753, 0xF2F6, 0x8763, 0xF2F7, 0x877C, 0xF2F8, 0x8764,\t0xF2F9, 0x8759, 0xF2FA, 0x8765, 0xF2FB, 0x8793, 0xF2FC, 0x87AF,\n\t0xF2FD, 0x87A8, 0xF2FE, 0x87D2, 0xF340, 0x9A5A, 0xF341, 0x9A5B,\t0xF342, 0x9A5C, 0xF343, 0x9A5D, 0xF344, 0x9A5E, 0xF345, 0x9A5F,\n\t0xF346, 0x9A60, 0xF347, 0x9A61, 0xF348, 0x9A62, 0xF349, 0x9A63,\t0xF34A, 0x9A64, 0xF34B, 0x9A65, 0xF34C, 0x9A66, 0xF34D, 0x9A67,\n\t0xF34E, 0x9A68, 0xF34F, 0x9A69, 0xF350, 0x9A6A, 0xF351, 0x9A6B,\t0xF352, 0x9A72, 0xF353, 0x9A83, 0xF354, 0x9A89, 0xF355, 0x9A8D,\n\t0xF356, 0x9A8E, 0xF357, 0x9A94, 0xF358, 0x9A95, 0xF359, 0x9A99,\t0xF35A, 0x9AA6, 0xF35B, 0x9AA9, 0xF35C, 0x9AAA, 0xF35D, 0x9AAB,\n\t0xF35E, 0x9AAC, 0xF35F, 0x9AAD, 0xF360, 0x9AAE, 0xF361, 0x9AAF,\t0xF362, 0x9AB2, 0xF363, 0x9AB3, 0xF364, 0x9AB4, 0xF365, 0x9AB5,\n\t0xF366, 0x9AB9, 0xF367, 0x9ABB, 0xF368, 0x9ABD, 0xF369, 0x9ABE,\t0xF36A, 0x9ABF, 0xF36B, 0x9AC3, 0xF36C, 0x9AC4, 0xF36D, 0x9AC6,\n\t0xF36E, 0x9AC7, 0xF36F, 0x9AC8, 0xF370, 0x9AC9, 0xF371, 0x9ACA,\t0xF372, 0x9ACD, 0xF373, 0x9ACE, 0xF374, 0x9ACF, 0xF375, 0x9AD0,\n\t0xF376, 0x9AD2, 0xF377, 0x9AD4, 0xF378, 0x9AD5, 0xF379, 0x9AD6,\t0xF37A, 0x9AD7, 0xF37B, 0x9AD9, 0xF37C, 0x9ADA, 0xF37D, 0x9ADB,\n\t0xF37E, 0x9ADC, 0xF380, 0x9ADD, 0xF381, 0x9ADE, 0xF382, 0x9AE0,\t0xF383, 0x9AE2, 0xF384, 0x9AE3, 0xF385, 0x9AE4, 0xF386, 0x9AE5,\n\t0xF387, 0x9AE7, 0xF388, 0x9AE8, 0xF389, 0x9AE9, 0xF38A, 0x9AEA,\t0xF38B, 0x9AEC, 0xF38C, 0x9AEE, 0xF38D, 0x9AF0, 0xF38E, 0x9AF1,\n\t0xF38F, 0x9AF2, 0xF390, 0x9AF3, 0xF391, 0x9AF4, 0xF392, 0x9AF5,\t0xF393, 0x9AF6, 0xF394, 0x9AF7, 0xF395, 0x9AF8, 0xF396, 0x9AFA,\n\t0xF397, 0x9AFC, 0xF398, 0x9AFD, 0xF399, 0x9AFE, 0xF39A, 0x9AFF,\t0xF39B, 0x9B00, 0xF39C, 0x9B01, 0xF39D, 0x9B02, 0xF39E, 0x9B04,\n\t0xF39F, 0x9B05, 0xF3A0, 0x9B06, 0xF3A1, 0x87C6, 0xF3A2, 0x8788,\t0xF3A3, 0x8785, 0xF3A4, 0x87AD, 0xF3A5, 0x8797, 0xF3A6, 0x8783,\n\t0xF3A7, 0x87AB, 0xF3A8, 0x87E5, 0xF3A9, 0x87AC, 0xF3AA, 0x87B5,\t0xF3AB, 0x87B3, 0xF3AC, 0x87CB, 0xF3AD, 0x87D3, 0xF3AE, 0x87BD,\n\t0xF3AF, 0x87D1, 0xF3B0, 0x87C0, 0xF3B1, 0x87CA, 0xF3B2, 0x87DB,\t0xF3B3, 0x87EA, 0xF3B4, 0x87E0, 0xF3B5, 0x87EE, 0xF3B6, 0x8816,\n\t0xF3B7, 0x8813, 0xF3B8, 0x87FE, 0xF3B9, 0x880A, 0xF3BA, 0x881B,\t0xF3BB, 0x8821, 0xF3BC, 0x8839, 0xF3BD, 0x883C, 0xF3BE, 0x7F36,\n\t0xF3BF, 0x7F42, 0xF3C0, 0x7F44, 0xF3C1, 0x7F45, 0xF3C2, 0x8210,\t0xF3C3, 0x7AFA, 0xF3C4, 0x7AFD, 0xF3C5, 0x7B08, 0xF3C6, 0x7B03,\n\t0xF3C7, 0x7B04, 0xF3C8, 0x7B15, 0xF3C9, 0x7B0A, 0xF3CA, 0x7B2B,\t0xF3CB, 0x7B0F, 0xF3CC, 0x7B47, 0xF3CD, 0x7B38, 0xF3CE, 0x7B2A,\n\t0xF3CF, 0x7B19, 0xF3D0, 0x7B2E, 0xF3D1, 0x7B31, 0xF3D2, 0x7B20,\t0xF3D3, 0x7B25, 0xF3D4, 0x7B24, 0xF3D5, 0x7B33, 0xF3D6, 0x7B3E,\n\t0xF3D7, 0x7B1E, 0xF3D8, 0x7B58, 0xF3D9, 0x7B5A, 0xF3DA, 0x7B45,\t0xF3DB, 0x7B75, 0xF3DC, 0x7B4C, 0xF3DD, 0x7B5D, 0xF3DE, 0x7B60,\n\t0xF3DF, 0x7B6E, 0xF3E0, 0x7B7B, 0xF3E1, 0x7B62, 0xF3E2, 0x7B72,\t0xF3E3, 0x7B71, 0xF3E4, 0x7B90, 0xF3E5, 0x7BA6, 0xF3E6, 0x7BA7,\n\t0xF3E7, 0x7BB8, 0xF3E8, 0x7BAC, 0xF3E9, 0x7B9D, 0xF3EA, 0x7BA8,\t0xF3EB, 0x7B85, 0xF3EC, 0x7BAA, 0xF3ED, 0x7B9C, 0xF3EE, 0x7BA2,\n\t0xF3EF, 0x7BAB, 0xF3F0, 0x7BB4, 0xF3F1, 0x7BD1, 0xF3F2, 0x7BC1,\t0xF3F3, 0x7BCC, 0xF3F4, 0x7BDD, 0xF3F5, 0x7BDA, 0xF3F6, 0x7BE5,\n\t0xF3F7, 0x7BE6, 0xF3F8, 0x7BEA, 0xF3F9, 0x7C0C, 0xF3FA, 0x7BFE,\t0xF3FB, 0x7BFC, 0xF3FC, 0x7C0F, 0xF3FD, 0x7C16, 0xF3FE, 0x7C0B,\n\t0xF440, 0x9B07, 0xF441, 0x9B09, 0xF442, 0x9B0A, 0xF443, 0x9B0B,\t0xF444, 0x9B0C, 0xF445, 0x9B0D, 0xF446, 0x9B0E, 0xF447, 0x9B10,\n\t0xF448, 0x9B11, 0xF449, 0x9B12, 0xF44A, 0x9B14, 0xF44B, 0x9B15,\t0xF44C, 0x9B16, 0xF44D, 0x9B17, 0xF44E, 0x9B18, 0xF44F, 0x9B19,\n\t0xF450, 0x9B1A, 0xF451, 0x9B1B, 0xF452, 0x9B1C, 0xF453, 0x9B1D,\t0xF454, 0x9B1E, 0xF455, 0x9B20, 0xF456, 0x9B21, 0xF457, 0x9B22,\n\t0xF458, 0x9B24, 0xF459, 0x9B25, 0xF45A, 0x9B26, 0xF45B, 0x9B27,\t0xF45C, 0x9B28, 0xF45D, 0x9B29, 0xF45E, 0x9B2A, 0xF45F, 0x9B2B,\n\t0xF460, 0x9B2C, 0xF461, 0x9B2D, 0xF462, 0x9B2E, 0xF463, 0x9B30,\t0xF464, 0x9B31, 0xF465, 0x9B33, 0xF466, 0x9B34, 0xF467, 0x9B35,\n\t0xF468, 0x9B36, 0xF469, 0x9B37, 0xF46A, 0x9B38, 0xF46B, 0x9B39,\t0xF46C, 0x9B3A, 0xF46D, 0x9B3D, 0xF46E, 0x9B3E, 0xF46F, 0x9B3F,\n\t0xF470, 0x9B40, 0xF471, 0x9B46, 0xF472, 0x9B4A, 0xF473, 0x9B4B,\t0xF474, 0x9B4C, 0xF475, 0x9B4E, 0xF476, 0x9B50, 0xF477, 0x9B52,\n\t0xF478, 0x9B53, 0xF479, 0x9B55, 0xF47A, 0x9B56, 0xF47B, 0x9B57,\t0xF47C, 0x9B58, 0xF47D, 0x9B59, 0xF47E, 0x9B5A, 0xF480, 0x9B5B,\n\t0xF481, 0x9B5C, 0xF482, 0x9B5D, 0xF483, 0x9B5E, 0xF484, 0x9B5F,\t0xF485, 0x9B60, 0xF486, 0x9B61, 0xF487, 0x9B62, 0xF488, 0x9B63,\n\t0xF489, 0x9B64, 0xF48A, 0x9B65, 0xF48B, 0x9B66, 0xF48C, 0x9B67,\t0xF48D, 0x9B68, 0xF48E, 0x9B69, 0xF48F, 0x9B6A, 0xF490, 0x9B6B,\n\t0xF491, 0x9B6C, 0xF492, 0x9B6D, 0xF493, 0x9B6E, 0xF494, 0x9B6F,\t0xF495, 0x9B70, 0xF496, 0x9B71, 0xF497, 0x9B72, 0xF498, 0x9B73,\n\t0xF499, 0x9B74, 0xF49A, 0x9B75, 0xF49B, 0x9B76, 0xF49C, 0x9B77,\t0xF49D, 0x9B78, 0xF49E, 0x9B79, 0xF49F, 0x9B7A, 0xF4A0, 0x9B7B,\n\t0xF4A1, 0x7C1F, 0xF4A2, 0x7C2A, 0xF4A3, 0x7C26, 0xF4A4, 0x7C38,\t0xF4A5, 0x7C41, 0xF4A6, 0x7C40, 0xF4A7, 0x81FE, 0xF4A8, 0x8201,\n\t0xF4A9, 0x8202, 0xF4AA, 0x8204, 0xF4AB, 0x81EC, 0xF4AC, 0x8844,\t0xF4AD, 0x8221, 0xF4AE, 0x8222, 0xF4AF, 0x8223, 0xF4B0, 0x822D,\n\t0xF4B1, 0x822F, 0xF4B2, 0x8228, 0xF4B3, 0x822B, 0xF4B4, 0x8238,\t0xF4B5, 0x823B, 0xF4B6, 0x8233, 0xF4B7, 0x8234, 0xF4B8, 0x823E,\n\t0xF4B9, 0x8244, 0xF4BA, 0x8249, 0xF4BB, 0x824B, 0xF4BC, 0x824F,\t0xF4BD, 0x825A, 0xF4BE, 0x825F, 0xF4BF, 0x8268, 0xF4C0, 0x887E,\n\t0xF4C1, 0x8885, 0xF4C2, 0x8888, 0xF4C3, 0x88D8, 0xF4C4, 0x88DF,\t0xF4C5, 0x895E, 0xF4C6, 0x7F9D, 0xF4C7, 0x7F9F, 0xF4C8, 0x7FA7,\n\t0xF4C9, 0x7FAF, 0xF4CA, 0x7FB0, 0xF4CB, 0x7FB2, 0xF4CC, 0x7C7C,\t0xF4CD, 0x6549, 0xF4CE, 0x7C91, 0xF4CF, 0x7C9D, 0xF4D0, 0x7C9C,\n\t0xF4D1, 0x7C9E, 0xF4D2, 0x7CA2, 0xF4D3, 0x7CB2, 0xF4D4, 0x7CBC,\t0xF4D5, 0x7CBD, 0xF4D6, 0x7CC1, 0xF4D7, 0x7CC7, 0xF4D8, 0x7CCC,\n\t0xF4D9, 0x7CCD, 0xF4DA, 0x7CC8, 0xF4DB, 0x7CC5, 0xF4DC, 0x7CD7,\t0xF4DD, 0x7CE8, 0xF4DE, 0x826E, 0xF4DF, 0x66A8, 0xF4E0, 0x7FBF,\n\t0xF4E1, 0x7FCE, 0xF4E2, 0x7FD5, 0xF4E3, 0x7FE5, 0xF4E4, 0x7FE1,\t0xF4E5, 0x7FE6, 0xF4E6, 0x7FE9, 0xF4E7, 0x7FEE, 0xF4E8, 0x7FF3,\n\t0xF4E9, 0x7CF8, 0xF4EA, 0x7D77, 0xF4EB, 0x7DA6, 0xF4EC, 0x7DAE,\t0xF4ED, 0x7E47, 0xF4EE, 0x7E9B, 0xF4EF, 0x9EB8, 0xF4F0, 0x9EB4,\n\t0xF4F1, 0x8D73, 0xF4F2, 0x8D84, 0xF4F3, 0x8D94, 0xF4F4, 0x8D91,\t0xF4F5, 0x8DB1, 0xF4F6, 0x8D67, 0xF4F7, 0x8D6D, 0xF4F8, 0x8C47,\n\t0xF4F9, 0x8C49, 0xF4FA, 0x914A, 0xF4FB, 0x9150, 0xF4FC, 0x914E,\t0xF4FD, 0x914F, 0xF4FE, 0x9164, 0xF540, 0x9B7C, 0xF541, 0x9B7D,\n\t0xF542, 0x9B7E, 0xF543, 0x9B7F, 0xF544, 0x9B80, 0xF545, 0x9B81,\t0xF546, 0x9B82, 0xF547, 0x9B83, 0xF548, 0x9B84, 0xF549, 0x9B85,\n\t0xF54A, 0x9B86, 0xF54B, 0x9B87, 0xF54C, 0x9B88, 0xF54D, 0x9B89,\t0xF54E, 0x9B8A, 0xF54F, 0x9B8B, 0xF550, 0x9B8C, 0xF551, 0x9B8D,\n\t0xF552, 0x9B8E, 0xF553, 0x9B8F, 0xF554, 0x9B90, 0xF555, 0x9B91,\t0xF556, 0x9B92, 0xF557, 0x9B93, 0xF558, 0x9B94, 0xF559, 0x9B95,\n\t0xF55A, 0x9B96, 0xF55B, 0x9B97, 0xF55C, 0x9B98, 0xF55D, 0x9B99,\t0xF55E, 0x9B9A, 0xF55F, 0x9B9B, 0xF560, 0x9B9C, 0xF561, 0x9B9D,\n\t0xF562, 0x9B9E, 0xF563, 0x9B9F, 0xF564, 0x9BA0, 0xF565, 0x9BA1,\t0xF566, 0x9BA2, 0xF567, 0x9BA3, 0xF568, 0x9BA4, 0xF569, 0x9BA5,\n\t0xF56A, 0x9BA6, 0xF56B, 0x9BA7, 0xF56C, 0x9BA8, 0xF56D, 0x9BA9,\t0xF56E, 0x9BAA, 0xF56F, 0x9BAB, 0xF570, 0x9BAC, 0xF571, 0x9BAD,\n\t0xF572, 0x9BAE, 0xF573, 0x9BAF, 0xF574, 0x9BB0, 0xF575, 0x9BB1,\t0xF576, 0x9BB2, 0xF577, 0x9BB3, 0xF578, 0x9BB4, 0xF579, 0x9BB5,\n\t0xF57A, 0x9BB6, 0xF57B, 0x9BB7, 0xF57C, 0x9BB8, 0xF57D, 0x9BB9,\t0xF57E, 0x9BBA, 0xF580, 0x9BBB, 0xF581, 0x9BBC, 0xF582, 0x9BBD,\n\t0xF583, 0x9BBE, 0xF584, 0x9BBF, 0xF585, 0x9BC0, 0xF586, 0x9BC1,\t0xF587, 0x9BC2, 0xF588, 0x9BC3, 0xF589, 0x9BC4, 0xF58A, 0x9BC5,\n\t0xF58B, 0x9BC6, 0xF58C, 0x9BC7, 0xF58D, 0x9BC8, 0xF58E, 0x9BC9,\t0xF58F, 0x9BCA, 0xF590, 0x9BCB, 0xF591, 0x9BCC, 0xF592, 0x9BCD,\n\t0xF593, 0x9BCE, 0xF594, 0x9BCF, 0xF595, 0x9BD0, 0xF596, 0x9BD1,\t0xF597, 0x9BD2, 0xF598, 0x9BD3, 0xF599, 0x9BD4, 0xF59A, 0x9BD5,\n\t0xF59B, 0x9BD6, 0xF59C, 0x9BD7, 0xF59D, 0x9BD8, 0xF59E, 0x9BD9,\t0xF59F, 0x9BDA, 0xF5A0, 0x9BDB, 0xF5A1, 0x9162, 0xF5A2, 0x9161,\n\t0xF5A3, 0x9170, 0xF5A4, 0x9169, 0xF5A5, 0x916F, 0xF5A6, 0x917D,\t0xF5A7, 0x917E, 0xF5A8, 0x9172, 0xF5A9, 0x9174, 0xF5AA, 0x9179,\n\t0xF5AB, 0x918C, 0xF5AC, 0x9185, 0xF5AD, 0x9190, 0xF5AE, 0x918D,\t0xF5AF, 0x9191, 0xF5B0, 0x91A2, 0xF5B1, 0x91A3, 0xF5B2, 0x91AA,\n\t0xF5B3, 0x91AD, 0xF5B4, 0x91AE, 0xF5B5, 0x91AF, 0xF5B6, 0x91B5,\t0xF5B7, 0x91B4, 0xF5B8, 0x91BA, 0xF5B9, 0x8C55, 0xF5BA, 0x9E7E,\n\t0xF5BB, 0x8DB8, 0xF5BC, 0x8DEB, 0xF5BD, 0x8E05, 0xF5BE, 0x8E59,\t0xF5BF, 0x8E69, 0xF5C0, 0x8DB5, 0xF5C1, 0x8DBF, 0xF5C2, 0x8DBC,\n\t0xF5C3, 0x8DBA, 0xF5C4, 0x8DC4, 0xF5C5, 0x8DD6, 0xF5C6, 0x8DD7,\t0xF5C7, 0x8DDA, 0xF5C8, 0x8DDE, 0xF5C9, 0x8DCE, 0xF5CA, 0x8DCF,\n\t0xF5CB, 0x8DDB, 0xF5CC, 0x8DC6, 0xF5CD, 0x8DEC, 0xF5CE, 0x8DF7,\t0xF5CF, 0x8DF8, 0xF5D0, 0x8DE3, 0xF5D1, 0x8DF9, 0xF5D2, 0x8DFB,\n\t0xF5D3, 0x8DE4, 0xF5D4, 0x8E09, 0xF5D5, 0x8DFD, 0xF5D6, 0x8E14,\t0xF5D7, 0x8E1D, 0xF5D8, 0x8E1F, 0xF5D9, 0x8E2C, 0xF5DA, 0x8E2E,\n\t0xF5DB, 0x8E23, 0xF5DC, 0x8E2F, 0xF5DD, 0x8E3A, 0xF5DE, 0x8E40,\t0xF5DF, 0x8E39, 0xF5E0, 0x8E35, 0xF5E1, 0x8E3D, 0xF5E2, 0x8E31,\n\t0xF5E3, 0x8E49, 0xF5E4, 0x8E41, 0xF5E5, 0x8E42, 0xF5E6, 0x8E51,\t0xF5E7, 0x8E52, 0xF5E8, 0x8E4A, 0xF5E9, 0x8E70, 0xF5EA, 0x8E76,\n\t0xF5EB, 0x8E7C, 0xF5EC, 0x8E6F, 0xF5ED, 0x8E74, 0xF5EE, 0x8E85,\t0xF5EF, 0x8E8F, 0xF5F0, 0x8E94, 0xF5F1, 0x8E90, 0xF5F2, 0x8E9C,\n\t0xF5F3, 0x8E9E, 0xF5F4, 0x8C78, 0xF5F5, 0x8C82, 0xF5F6, 0x8C8A,\t0xF5F7, 0x8C85, 0xF5F8, 0x8C98, 0xF5F9, 0x8C94, 0xF5FA, 0x659B,\n\t0xF5FB, 0x89D6, 0xF5FC, 0x89DE, 0xF5FD, 0x89DA, 0xF5FE, 0x89DC,\t0xF640, 0x9BDC, 0xF641, 0x9BDD, 0xF642, 0x9BDE, 0xF643, 0x9BDF,\n\t0xF644, 0x9BE0, 0xF645, 0x9BE1, 0xF646, 0x9BE2, 0xF647, 0x9BE3,\t0xF648, 0x9BE4, 0xF649, 0x9BE5, 0xF64A, 0x9BE6, 0xF64B, 0x9BE7,\n\t0xF64C, 0x9BE8, 0xF64D, 0x9BE9, 0xF64E, 0x9BEA, 0xF64F, 0x9BEB,\t0xF650, 0x9BEC, 0xF651, 0x9BED, 0xF652, 0x9BEE, 0xF653, 0x9BEF,\n\t0xF654, 0x9BF0, 0xF655, 0x9BF1, 0xF656, 0x9BF2, 0xF657, 0x9BF3,\t0xF658, 0x9BF4, 0xF659, 0x9BF5, 0xF65A, 0x9BF6, 0xF65B, 0x9BF7,\n\t0xF65C, 0x9BF8, 0xF65D, 0x9BF9, 0xF65E, 0x9BFA, 0xF65F, 0x9BFB,\t0xF660, 0x9BFC, 0xF661, 0x9BFD, 0xF662, 0x9BFE, 0xF663, 0x9BFF,\n\t0xF664, 0x9C00, 0xF665, 0x9C01, 0xF666, 0x9C02, 0xF667, 0x9C03,\t0xF668, 0x9C04, 0xF669, 0x9C05, 0xF66A, 0x9C06, 0xF66B, 0x9C07,\n\t0xF66C, 0x9C08, 0xF66D, 0x9C09, 0xF66E, 0x9C0A, 0xF66F, 0x9C0B,\t0xF670, 0x9C0C, 0xF671, 0x9C0D, 0xF672, 0x9C0E, 0xF673, 0x9C0F,\n\t0xF674, 0x9C10, 0xF675, 0x9C11, 0xF676, 0x9C12, 0xF677, 0x9C13,\t0xF678, 0x9C14, 0xF679, 0x9C15, 0xF67A, 0x9C16, 0xF67B, 0x9C17,\n\t0xF67C, 0x9C18, 0xF67D, 0x9C19, 0xF67E, 0x9C1A, 0xF680, 0x9C1B,\t0xF681, 0x9C1C, 0xF682, 0x9C1D, 0xF683, 0x9C1E, 0xF684, 0x9C1F,\n\t0xF685, 0x9C20, 0xF686, 0x9C21, 0xF687, 0x9C22, 0xF688, 0x9C23,\t0xF689, 0x9C24, 0xF68A, 0x9C25, 0xF68B, 0x9C26, 0xF68C, 0x9C27,\n\t0xF68D, 0x9C28, 0xF68E, 0x9C29, 0xF68F, 0x9C2A, 0xF690, 0x9C2B,\t0xF691, 0x9C2C, 0xF692, 0x9C2D, 0xF693, 0x9C2E, 0xF694, 0x9C2F,\n\t0xF695, 0x9C30, 0xF696, 0x9C31, 0xF697, 0x9C32, 0xF698, 0x9C33,\t0xF699, 0x9C34, 0xF69A, 0x9C35, 0xF69B, 0x9C36, 0xF69C, 0x9C37,\n\t0xF69D, 0x9C38, 0xF69E, 0x9C39, 0xF69F, 0x9C3A, 0xF6A0, 0x9C3B,\t0xF6A1, 0x89E5, 0xF6A2, 0x89EB, 0xF6A3, 0x89EF, 0xF6A4, 0x8A3E,\n\t0xF6A5, 0x8B26, 0xF6A6, 0x9753, 0xF6A7, 0x96E9, 0xF6A8, 0x96F3,\t0xF6A9, 0x96EF, 0xF6AA, 0x9706, 0xF6AB, 0x9701, 0xF6AC, 0x9708,\n\t0xF6AD, 0x970F, 0xF6AE, 0x970E, 0xF6AF, 0x972A, 0xF6B0, 0x972D,\t0xF6B1, 0x9730, 0xF6B2, 0x973E, 0xF6B3, 0x9F80, 0xF6B4, 0x9F83,\n\t0xF6B5, 0x9F85, 0xF6B6, 0x9F86, 0xF6B7, 0x9F87, 0xF6B8, 0x9F88,\t0xF6B9, 0x9F89, 0xF6BA, 0x9F8A, 0xF6BB, 0x9F8C, 0xF6BC, 0x9EFE,\n\t0xF6BD, 0x9F0B, 0xF6BE, 0x9F0D, 0xF6BF, 0x96B9, 0xF6C0, 0x96BC,\t0xF6C1, 0x96BD, 0xF6C2, 0x96CE, 0xF6C3, 0x96D2, 0xF6C4, 0x77BF,\n\t0xF6C5, 0x96E0, 0xF6C6, 0x928E, 0xF6C7, 0x92AE, 0xF6C8, 0x92C8,\t0xF6C9, 0x933E, 0xF6CA, 0x936A, 0xF6CB, 0x93CA, 0xF6CC, 0x938F,\n\t0xF6CD, 0x943E, 0xF6CE, 0x946B, 0xF6CF, 0x9C7F, 0xF6D0, 0x9C82,\t0xF6D1, 0x9C85, 0xF6D2, 0x9C86, 0xF6D3, 0x9C87, 0xF6D4, 0x9C88,\n\t0xF6D5, 0x7A23, 0xF6D6, 0x9C8B, 0xF6D7, 0x9C8E, 0xF6D8, 0x9C90,\t0xF6D9, 0x9C91, 0xF6DA, 0x9C92, 0xF6DB, 0x9C94, 0xF6DC, 0x9C95,\n\t0xF6DD, 0x9C9A, 0xF6DE, 0x9C9B, 0xF6DF, 0x9C9E, 0xF6E0, 0x9C9F,\t0xF6E1, 0x9CA0, 0xF6E2, 0x9CA1, 0xF6E3, 0x9CA2, 0xF6E4, 0x9CA3,\n\t0xF6E5, 0x9CA5, 0xF6E6, 0x9CA6, 0xF6E7, 0x9CA7, 0xF6E8, 0x9CA8,\t0xF6E9, 0x9CA9, 0xF6EA, 0x9CAB, 0xF6EB, 0x9CAD, 0xF6EC, 0x9CAE,\n\t0xF6ED, 0x9CB0, 0xF6EE, 0x9CB1, 0xF6EF, 0x9CB2, 0xF6F0, 0x9CB3,\t0xF6F1, 0x9CB4, 0xF6F2, 0x9CB5, 0xF6F3, 0x9CB6, 0xF6F4, 0x9CB7,\n\t0xF6F5, 0x9CBA, 0xF6F6, 0x9CBB, 0xF6F7, 0x9CBC, 0xF6F8, 0x9CBD,\t0xF6F9, 0x9CC4, 0xF6FA, 0x9CC5, 0xF6FB, 0x9CC6, 0xF6FC, 0x9CC7,\n\t0xF6FD, 0x9CCA, 0xF6FE, 0x9CCB, 0xF740, 0x9C3C, 0xF741, 0x9C3D,\t0xF742, 0x9C3E, 0xF743, 0x9C3F, 0xF744, 0x9C40, 0xF745, 0x9C41,\n\t0xF746, 0x9C42, 0xF747, 0x9C43, 0xF748, 0x9C44, 0xF749, 0x9C45,\t0xF74A, 0x9C46, 0xF74B, 0x9C47, 0xF74C, 0x9C48, 0xF74D, 0x9C49,\n\t0xF74E, 0x9C4A, 0xF74F, 0x9C4B, 0xF750, 0x9C4C, 0xF751, 0x9C4D,\t0xF752, 0x9C4E, 0xF753, 0x9C4F, 0xF754, 0x9C50, 0xF755, 0x9C51,\n\t0xF756, 0x9C52, 0xF757, 0x9C53, 0xF758, 0x9C54, 0xF759, 0x9C55,\t0xF75A, 0x9C56, 0xF75B, 0x9C57, 0xF75C, 0x9C58, 0xF75D, 0x9C59,\n\t0xF75E, 0x9C5A, 0xF75F, 0x9C5B, 0xF760, 0x9C5C, 0xF761, 0x9C5D,\t0xF762, 0x9C5E, 0xF763, 0x9C5F, 0xF764, 0x9C60, 0xF765, 0x9C61,\n\t0xF766, 0x9C62, 0xF767, 0x9C63, 0xF768, 0x9C64, 0xF769, 0x9C65,\t0xF76A, 0x9C66, 0xF76B, 0x9C67, 0xF76C, 0x9C68, 0xF76D, 0x9C69,\n\t0xF76E, 0x9C6A, 0xF76F, 0x9C6B, 0xF770, 0x9C6C, 0xF771, 0x9C6D,\t0xF772, 0x9C6E, 0xF773, 0x9C6F, 0xF774, 0x9C70, 0xF775, 0x9C71,\n\t0xF776, 0x9C72, 0xF777, 0x9C73, 0xF778, 0x9C74, 0xF779, 0x9C75,\t0xF77A, 0x9C76, 0xF77B, 0x9C77, 0xF77C, 0x9C78, 0xF77D, 0x9C79,\n\t0xF77E, 0x9C7A, 0xF780, 0x9C7B, 0xF781, 0x9C7D, 0xF782, 0x9C7E,\t0xF783, 0x9C80, 0xF784, 0x9C83, 0xF785, 0x9C84, 0xF786, 0x9C89,\n\t0xF787, 0x9C8A, 0xF788, 0x9C8C, 0xF789, 0x9C8F, 0xF78A, 0x9C93,\t0xF78B, 0x9C96, 0xF78C, 0x9C97, 0xF78D, 0x9C98, 0xF78E, 0x9C99,\n\t0xF78F, 0x9C9D, 0xF790, 0x9CAA, 0xF791, 0x9CAC, 0xF792, 0x9CAF,\t0xF793, 0x9CB9, 0xF794, 0x9CBE, 0xF795, 0x9CBF, 0xF796, 0x9CC0,\n\t0xF797, 0x9CC1, 0xF798, 0x9CC2, 0xF799, 0x9CC8, 0xF79A, 0x9CC9,\t0xF79B, 0x9CD1, 0xF79C, 0x9CD2, 0xF79D, 0x9CDA, 0xF79E, 0x9CDB,\n\t0xF79F, 0x9CE0, 0xF7A0, 0x9CE1, 0xF7A1, 0x9CCC, 0xF7A2, 0x9CCD,\t0xF7A3, 0x9CCE, 0xF7A4, 0x9CCF, 0xF7A5, 0x9CD0, 0xF7A6, 0x9CD3,\n\t0xF7A7, 0x9CD4, 0xF7A8, 0x9CD5, 0xF7A9, 0x9CD7, 0xF7AA, 0x9CD8,\t0xF7AB, 0x9CD9, 0xF7AC, 0x9CDC, 0xF7AD, 0x9CDD, 0xF7AE, 0x9CDF,\n\t0xF7AF, 0x9CE2, 0xF7B0, 0x977C, 0xF7B1, 0x9785, 0xF7B2, 0x9791,\t0xF7B3, 0x9792, 0xF7B4, 0x9794, 0xF7B5, 0x97AF, 0xF7B6, 0x97AB,\n\t0xF7B7, 0x97A3, 0xF7B8, 0x97B2, 0xF7B9, 0x97B4, 0xF7BA, 0x9AB1,\t0xF7BB, 0x9AB0, 0xF7BC, 0x9AB7, 0xF7BD, 0x9E58, 0xF7BE, 0x9AB6,\n\t0xF7BF, 0x9ABA, 0xF7C0, 0x9ABC, 0xF7C1, 0x9AC1, 0xF7C2, 0x9AC0,\t0xF7C3, 0x9AC5, 0xF7C4, 0x9AC2, 0xF7C5, 0x9ACB, 0xF7C6, 0x9ACC,\n\t0xF7C7, 0x9AD1, 0xF7C8, 0x9B45, 0xF7C9, 0x9B43, 0xF7CA, 0x9B47,\t0xF7CB, 0x9B49, 0xF7CC, 0x9B48, 0xF7CD, 0x9B4D, 0xF7CE, 0x9B51,\n\t0xF7CF, 0x98E8, 0xF7D0, 0x990D, 0xF7D1, 0x992E, 0xF7D2, 0x9955,\t0xF7D3, 0x9954, 0xF7D4, 0x9ADF, 0xF7D5, 0x9AE1, 0xF7D6, 0x9AE6,\n\t0xF7D7, 0x9AEF, 0xF7D8, 0x9AEB, 0xF7D9, 0x9AFB, 0xF7DA, 0x9AED,\t0xF7DB, 0x9AF9, 0xF7DC, 0x9B08, 0xF7DD, 0x9B0F, 0xF7DE, 0x9B13,\n\t0xF7DF, 0x9B1F, 0xF7E0, 0x9B23, 0xF7E1, 0x9EBD, 0xF7E2, 0x9EBE,\t0xF7E3, 0x7E3B, 0xF7E4, 0x9E82, 0xF7E5, 0x9E87, 0xF7E6, 0x9E88,\n\t0xF7E7, 0x9E8B, 0xF7E8, 0x9E92, 0xF7E9, 0x93D6, 0xF7EA, 0x9E9D,\t0xF7EB, 0x9E9F, 0xF7EC, 0x9EDB, 0xF7ED, 0x9EDC, 0xF7EE, 0x9EDD,\n\t0xF7EF, 0x9EE0, 0xF7F0, 0x9EDF, 0xF7F1, 0x9EE2, 0xF7F2, 0x9EE9,\t0xF7F3, 0x9EE7, 0xF7F4, 0x9EE5, 0xF7F5, 0x9EEA, 0xF7F6, 0x9EEF,\n\t0xF7F7, 0x9F22, 0xF7F8, 0x9F2C, 0xF7F9, 0x9F2F, 0xF7FA, 0x9F39,\t0xF7FB, 0x9F37, 0xF7FC, 0x9F3D, 0xF7FD, 0x9F3E, 0xF7FE, 0x9F44,\n\t0xF840, 0x9CE3, 0xF841, 0x9CE4, 0xF842, 0x9CE5, 0xF843, 0x9CE6,\t0xF844, 0x9CE7, 0xF845, 0x9CE8, 0xF846, 0x9CE9, 0xF847, 0x9CEA,\n\t0xF848, 0x9CEB, 0xF849, 0x9CEC, 0xF84A, 0x9CED, 0xF84B, 0x9CEE,\t0xF84C, 0x9CEF, 0xF84D, 0x9CF0, 0xF84E, 0x9CF1, 0xF84F, 0x9CF2,\n\t0xF850, 0x9CF3, 0xF851, 0x9CF4, 0xF852, 0x9CF5, 0xF853, 0x9CF6,\t0xF854, 0x9CF7, 0xF855, 0x9CF8, 0xF856, 0x9CF9, 0xF857, 0x9CFA,\n\t0xF858, 0x9CFB, 0xF859, 0x9CFC, 0xF85A, 0x9CFD, 0xF85B, 0x9CFE,\t0xF85C, 0x9CFF, 0xF85D, 0x9D00, 0xF85E, 0x9D01, 0xF85F, 0x9D02,\n\t0xF860, 0x9D03, 0xF861, 0x9D04, 0xF862, 0x9D05, 0xF863, 0x9D06,\t0xF864, 0x9D07, 0xF865, 0x9D08, 0xF866, 0x9D09, 0xF867, 0x9D0A,\n\t0xF868, 0x9D0B, 0xF869, 0x9D0C, 0xF86A, 0x9D0D, 0xF86B, 0x9D0E,\t0xF86C, 0x9D0F, 0xF86D, 0x9D10, 0xF86E, 0x9D11, 0xF86F, 0x9D12,\n\t0xF870, 0x9D13, 0xF871, 0x9D14, 0xF872, 0x9D15, 0xF873, 0x9D16,\t0xF874, 0x9D17, 0xF875, 0x9D18, 0xF876, 0x9D19, 0xF877, 0x9D1A,\n\t0xF878, 0x9D1B, 0xF879, 0x9D1C, 0xF87A, 0x9D1D, 0xF87B, 0x9D1E,\t0xF87C, 0x9D1F, 0xF87D, 0x9D20, 0xF87E, 0x9D21, 0xF880, 0x9D22,\n\t0xF881, 0x9D23, 0xF882, 0x9D24, 0xF883, 0x9D25, 0xF884, 0x9D26,\t0xF885, 0x9D27, 0xF886, 0x9D28, 0xF887, 0x9D29, 0xF888, 0x9D2A,\n\t0xF889, 0x9D2B, 0xF88A, 0x9D2C, 0xF88B, 0x9D2D, 0xF88C, 0x9D2E,\t0xF88D, 0x9D2F, 0xF88E, 0x9D30, 0xF88F, 0x9D31, 0xF890, 0x9D32,\n\t0xF891, 0x9D33, 0xF892, 0x9D34, 0xF893, 0x9D35, 0xF894, 0x9D36,\t0xF895, 0x9D37, 0xF896, 0x9D38, 0xF897, 0x9D39, 0xF898, 0x9D3A,\n\t0xF899, 0x9D3B, 0xF89A, 0x9D3C, 0xF89B, 0x9D3D, 0xF89C, 0x9D3E,\t0xF89D, 0x9D3F, 0xF89E, 0x9D40, 0xF89F, 0x9D41, 0xF8A0, 0x9D42,\n\t0xF940, 0x9D43, 0xF941, 0x9D44, 0xF942, 0x9D45, 0xF943, 0x9D46,\t0xF944, 0x9D47, 0xF945, 0x9D48, 0xF946, 0x9D49, 0xF947, 0x9D4A,\n\t0xF948, 0x9D4B, 0xF949, 0x9D4C, 0xF94A, 0x9D4D, 0xF94B, 0x9D4E,\t0xF94C, 0x9D4F, 0xF94D, 0x9D50, 0xF94E, 0x9D51, 0xF94F, 0x9D52,\n\t0xF950, 0x9D53, 0xF951, 0x9D54, 0xF952, 0x9D55, 0xF953, 0x9D56,\t0xF954, 0x9D57, 0xF955, 0x9D58, 0xF956, 0x9D59, 0xF957, 0x9D5A,\n\t0xF958, 0x9D5B, 0xF959, 0x9D5C, 0xF95A, 0x9D5D, 0xF95B, 0x9D5E,\t0xF95C, 0x9D5F, 0xF95D, 0x9D60, 0xF95E, 0x9D61, 0xF95F, 0x9D62,\n\t0xF960, 0x9D63, 0xF961, 0x9D64, 0xF962, 0x9D65, 0xF963, 0x9D66,\t0xF964, 0x9D67, 0xF965, 0x9D68, 0xF966, 0x9D69, 0xF967, 0x9D6A,\n\t0xF968, 0x9D6B, 0xF969, 0x9D6C, 0xF96A, 0x9D6D, 0xF96B, 0x9D6E,\t0xF96C, 0x9D6F, 0xF96D, 0x9D70, 0xF96E, 0x9D71, 0xF96F, 0x9D72,\n\t0xF970, 0x9D73, 0xF971, 0x9D74, 0xF972, 0x9D75, 0xF973, 0x9D76,\t0xF974, 0x9D77, 0xF975, 0x9D78, 0xF976, 0x9D79, 0xF977, 0x9D7A,\n\t0xF978, 0x9D7B, 0xF979, 0x9D7C, 0xF97A, 0x9D7D, 0xF97B, 0x9D7E,\t0xF97C, 0x9D7F, 0xF97D, 0x9D80, 0xF97E, 0x9D81, 0xF980, 0x9D82,\n\t0xF981, 0x9D83, 0xF982, 0x9D84, 0xF983, 0x9D85, 0xF984, 0x9D86,\t0xF985, 0x9D87, 0xF986, 0x9D88, 0xF987, 0x9D89, 0xF988, 0x9D8A,\n\t0xF989, 0x9D8B, 0xF98A, 0x9D8C, 0xF98B, 0x9D8D, 0xF98C, 0x9D8E,\t0xF98D, 0x9D8F, 0xF98E, 0x9D90, 0xF98F, 0x9D91, 0xF990, 0x9D92,\n\t0xF991, 0x9D93, 0xF992, 0x9D94, 0xF993, 0x9D95, 0xF994, 0x9D96,\t0xF995, 0x9D97, 0xF996, 0x9D98, 0xF997, 0x9D99, 0xF998, 0x9D9A,\n\t0xF999, 0x9D9B, 0xF99A, 0x9D9C, 0xF99B, 0x9D9D, 0xF99C, 0x9D9E,\t0xF99D, 0x9D9F, 0xF99E, 0x9DA0, 0xF99F, 0x9DA1, 0xF9A0, 0x9DA2,\n\t0xFA40, 0x9DA3, 0xFA41, 0x9DA4, 0xFA42, 0x9DA5, 0xFA43, 0x9DA6,\t0xFA44, 0x9DA7, 0xFA45, 0x9DA8, 0xFA46, 0x9DA9, 0xFA47, 0x9DAA,\n\t0xFA48, 0x9DAB, 0xFA49, 0x9DAC, 0xFA4A, 0x9DAD, 0xFA4B, 0x9DAE,\t0xFA4C, 0x9DAF, 0xFA4D, 0x9DB0, 0xFA4E, 0x9DB1, 0xFA4F, 0x9DB2,\n\t0xFA50, 0x9DB3, 0xFA51, 0x9DB4, 0xFA52, 0x9DB5, 0xFA53, 0x9DB6,\t0xFA54, 0x9DB7, 0xFA55, 0x9DB8, 0xFA56, 0x9DB9, 0xFA57, 0x9DBA,\n\t0xFA58, 0x9DBB, 0xFA59, 0x9DBC, 0xFA5A, 0x9DBD, 0xFA5B, 0x9DBE,\t0xFA5C, 0x9DBF, 0xFA5D, 0x9DC0, 0xFA5E, 0x9DC1, 0xFA5F, 0x9DC2,\n\t0xFA60, 0x9DC3, 0xFA61, 0x9DC4, 0xFA62, 0x9DC5, 0xFA63, 0x9DC6,\t0xFA64, 0x9DC7, 0xFA65, 0x9DC8, 0xFA66, 0x9DC9, 0xFA67, 0x9DCA,\n\t0xFA68, 0x9DCB, 0xFA69, 0x9DCC, 0xFA6A, 0x9DCD, 0xFA6B, 0x9DCE,\t0xFA6C, 0x9DCF, 0xFA6D, 0x9DD0, 0xFA6E, 0x9DD1, 0xFA6F, 0x9DD2,\n\t0xFA70, 0x9DD3, 0xFA71, 0x9DD4, 0xFA72, 0x9DD5, 0xFA73, 0x9DD6,\t0xFA74, 0x9DD7, 0xFA75, 0x9DD8, 0xFA76, 0x9DD9, 0xFA77, 0x9DDA,\n\t0xFA78, 0x9DDB, 0xFA79, 0x9DDC, 0xFA7A, 0x9DDD, 0xFA7B, 0x9DDE,\t0xFA7C, 0x9DDF, 0xFA7D, 0x9DE0, 0xFA7E, 0x9DE1, 0xFA80, 0x9DE2,\n\t0xFA81, 0x9DE3, 0xFA82, 0x9DE4, 0xFA83, 0x9DE5, 0xFA84, 0x9DE6,\t0xFA85, 0x9DE7, 0xFA86, 0x9DE8, 0xFA87, 0x9DE9, 0xFA88, 0x9DEA,\n\t0xFA89, 0x9DEB, 0xFA8A, 0x9DEC, 0xFA8B, 0x9DED, 0xFA8C, 0x9DEE,\t0xFA8D, 0x9DEF, 0xFA8E, 0x9DF0, 0xFA8F, 0x9DF1, 0xFA90, 0x9DF2,\n\t0xFA91, 0x9DF3, 0xFA92, 0x9DF4, 0xFA93, 0x9DF5, 0xFA94, 0x9DF6,\t0xFA95, 0x9DF7, 0xFA96, 0x9DF8, 0xFA97, 0x9DF9, 0xFA98, 0x9DFA,\n\t0xFA99, 0x9DFB, 0xFA9A, 0x9DFC, 0xFA9B, 0x9DFD, 0xFA9C, 0x9DFE,\t0xFA9D, 0x9DFF, 0xFA9E, 0x9E00, 0xFA9F, 0x9E01, 0xFAA0, 0x9E02,\n\t0xFB40, 0x9E03, 0xFB41, 0x9E04, 0xFB42, 0x9E05, 0xFB43, 0x9E06,\t0xFB44, 0x9E07, 0xFB45, 0x9E08, 0xFB46, 0x9E09, 0xFB47, 0x9E0A,\n\t0xFB48, 0x9E0B, 0xFB49, 0x9E0C, 0xFB4A, 0x9E0D, 0xFB4B, 0x9E0E,\t0xFB4C, 0x9E0F, 0xFB4D, 0x9E10, 0xFB4E, 0x9E11, 0xFB4F, 0x9E12,\n\t0xFB50, 0x9E13, 0xFB51, 0x9E14, 0xFB52, 0x9E15, 0xFB53, 0x9E16,\t0xFB54, 0x9E17, 0xFB55, 0x9E18, 0xFB56, 0x9E19, 0xFB57, 0x9E1A,\n\t0xFB58, 0x9E1B, 0xFB59, 0x9E1C, 0xFB5A, 0x9E1D, 0xFB5B, 0x9E1E,\t0xFB5C, 0x9E24, 0xFB5D, 0x9E27, 0xFB5E, 0x9E2E, 0xFB5F, 0x9E30,\n\t0xFB60, 0x9E34, 0xFB61, 0x9E3B, 0xFB62, 0x9E3C, 0xFB63, 0x9E40,\t0xFB64, 0x9E4D, 0xFB65, 0x9E50, 0xFB66, 0x9E52, 0xFB67, 0x9E53,\n\t0xFB68, 0x9E54, 0xFB69, 0x9E56, 0xFB6A, 0x9E59, 0xFB6B, 0x9E5D,\t0xFB6C, 0x9E5F, 0xFB6D, 0x9E60, 0xFB6E, 0x9E61, 0xFB6F, 0x9E62,\n\t0xFB70, 0x9E65, 0xFB71, 0x9E6E, 0xFB72, 0x9E6F, 0xFB73, 0x9E72,\t0xFB74, 0x9E74, 0xFB75, 0x9E75, 0xFB76, 0x9E76, 0xFB77, 0x9E77,\n\t0xFB78, 0x9E78, 0xFB79, 0x9E79, 0xFB7A, 0x9E7A, 0xFB7B, 0x9E7B,\t0xFB7C, 0x9E7C, 0xFB7D, 0x9E7D, 0xFB7E, 0x9E80, 0xFB80, 0x9E81,\n\t0xFB81, 0x9E83, 0xFB82, 0x9E84, 0xFB83, 0x9E85, 0xFB84, 0x9E86,\t0xFB85, 0x9E89, 0xFB86, 0x9E8A, 0xFB87, 0x9E8C, 0xFB88, 0x9E8D,\n\t0xFB89, 0x9E8E, 0xFB8A, 0x9E8F, 0xFB8B, 0x9E90, 0xFB8C, 0x9E91,\t0xFB8D, 0x9E94, 0xFB8E, 0x9E95, 0xFB8F, 0x9E96, 0xFB90, 0x9E97,\n\t0xFB91, 0x9E98, 0xFB92, 0x9E99, 0xFB93, 0x9E9A, 0xFB94, 0x9E9B,\t0xFB95, 0x9E9C, 0xFB96, 0x9E9E, 0xFB97, 0x9EA0, 0xFB98, 0x9EA1,\n\t0xFB99, 0x9EA2, 0xFB9A, 0x9EA3, 0xFB9B, 0x9EA4, 0xFB9C, 0x9EA5,\t0xFB9D, 0x9EA7, 0xFB9E, 0x9EA8, 0xFB9F, 0x9EA9, 0xFBA0, 0x9EAA,\n\t0xFC40, 0x9EAB, 0xFC41, 0x9EAC, 0xFC42, 0x9EAD, 0xFC43, 0x9EAE,\t0xFC44, 0x9EAF, 0xFC45, 0x9EB0, 0xFC46, 0x9EB1, 0xFC47, 0x9EB2,\n\t0xFC48, 0x9EB3, 0xFC49, 0x9EB5, 0xFC4A, 0x9EB6, 0xFC4B, 0x9EB7,\t0xFC4C, 0x9EB9, 0xFC4D, 0x9EBA, 0xFC4E, 0x9EBC, 0xFC4F, 0x9EBF,\n\t0xFC50, 0x9EC0, 0xFC51, 0x9EC1, 0xFC52, 0x9EC2, 0xFC53, 0x9EC3,\t0xFC54, 0x9EC5, 0xFC55, 0x9EC6, 0xFC56, 0x9EC7, 0xFC57, 0x9EC8,\n\t0xFC58, 0x9ECA, 0xFC59, 0x9ECB, 0xFC5A, 0x9ECC, 0xFC5B, 0x9ED0,\t0xFC5C, 0x9ED2, 0xFC5D, 0x9ED3, 0xFC5E, 0x9ED5, 0xFC5F, 0x9ED6,\n\t0xFC60, 0x9ED7, 0xFC61, 0x9ED9, 0xFC62, 0x9EDA, 0xFC63, 0x9EDE,\t0xFC64, 0x9EE1, 0xFC65, 0x9EE3, 0xFC66, 0x9EE4, 0xFC67, 0x9EE6,\n\t0xFC68, 0x9EE8, 0xFC69, 0x9EEB, 0xFC6A, 0x9EEC, 0xFC6B, 0x9EED,\t0xFC6C, 0x9EEE, 0xFC6D, 0x9EF0, 0xFC6E, 0x9EF1, 0xFC6F, 0x9EF2,\n\t0xFC70, 0x9EF3, 0xFC71, 0x9EF4, 0xFC72, 0x9EF5, 0xFC73, 0x9EF6,\t0xFC74, 0x9EF7, 0xFC75, 0x9EF8, 0xFC76, 0x9EFA, 0xFC77, 0x9EFD,\n\t0xFC78, 0x9EFF, 0xFC79, 0x9F00, 0xFC7A, 0x9F01, 0xFC7B, 0x9F02,\t0xFC7C, 0x9F03, 0xFC7D, 0x9F04, 0xFC7E, 0x9F05, 0xFC80, 0x9F06,\n\t0xFC81, 0x9F07, 0xFC82, 0x9F08, 0xFC83, 0x9F09, 0xFC84, 0x9F0A,\t0xFC85, 0x9F0C, 0xFC86, 0x9F0F, 0xFC87, 0x9F11, 0xFC88, 0x9F12,\n\t0xFC89, 0x9F14, 0xFC8A, 0x9F15, 0xFC8B, 0x9F16, 0xFC8C, 0x9F18,\t0xFC8D, 0x9F1A, 0xFC8E, 0x9F1B, 0xFC8F, 0x9F1C, 0xFC90, 0x9F1D,\n\t0xFC91, 0x9F1E, 0xFC92, 0x9F1F, 0xFC93, 0x9F21, 0xFC94, 0x9F23,\t0xFC95, 0x9F24, 0xFC96, 0x9F25, 0xFC97, 0x9F26, 0xFC98, 0x9F27,\n\t0xFC99, 0x9F28, 0xFC9A, 0x9F29, 0xFC9B, 0x9F2A, 0xFC9C, 0x9F2B,\t0xFC9D, 0x9F2D, 0xFC9E, 0x9F2E, 0xFC9F, 0x9F30, 0xFCA0, 0x9F31,\n\t0xFD40, 0x9F32, 0xFD41, 0x9F33, 0xFD42, 0x9F34, 0xFD43, 0x9F35,\t0xFD44, 0x9F36, 0xFD45, 0x9F38, 0xFD46, 0x9F3A, 0xFD47, 0x9F3C,\n\t0xFD48, 0x9F3F, 0xFD49, 0x9F40, 0xFD4A, 0x9F41, 0xFD4B, 0x9F42,\t0xFD4C, 0x9F43, 0xFD4D, 0x9F45, 0xFD4E, 0x9F46, 0xFD4F, 0x9F47,\n\t0xFD50, 0x9F48, 0xFD51, 0x9F49, 0xFD52, 0x9F4A, 0xFD53, 0x9F4B,\t0xFD54, 0x9F4C, 0xFD55, 0x9F4D, 0xFD56, 0x9F4E, 0xFD57, 0x9F4F,\n\t0xFD58, 0x9F52, 0xFD59, 0x9F53, 0xFD5A, 0x9F54, 0xFD5B, 0x9F55,\t0xFD5C, 0x9F56, 0xFD5D, 0x9F57, 0xFD5E, 0x9F58, 0xFD5F, 0x9F59,\n\t0xFD60, 0x9F5A, 0xFD61, 0x9F5B, 0xFD62, 0x9F5C, 0xFD63, 0x9F5D,\t0xFD64, 0x9F5E, 0xFD65, 0x9F5F, 0xFD66, 0x9F60, 0xFD67, 0x9F61,\n\t0xFD68, 0x9F62, 0xFD69, 0x9F63, 0xFD6A, 0x9F64, 0xFD6B, 0x9F65,\t0xFD6C, 0x9F66, 0xFD6D, 0x9F67, 0xFD6E, 0x9F68, 0xFD6F, 0x9F69,\n\t0xFD70, 0x9F6A, 0xFD71, 0x9F6B, 0xFD72, 0x9F6C, 0xFD73, 0x9F6D,\t0xFD74, 0x9F6E, 0xFD75, 0x9F6F, 0xFD76, 0x9F70, 0xFD77, 0x9F71,\n\t0xFD78, 0x9F72, 0xFD79, 0x9F73, 0xFD7A, 0x9F74, 0xFD7B, 0x9F75,\t0xFD7C, 0x9F76, 0xFD7D, 0x9F77, 0xFD7E, 0x9F78, 0xFD80, 0x9F79,\n\t0xFD81, 0x9F7A, 0xFD82, 0x9F7B, 0xFD83, 0x9F7C, 0xFD84, 0x9F7D,\t0xFD85, 0x9F7E, 0xFD86, 0x9F81, 0xFD87, 0x9F82, 0xFD88, 0x9F8D,\n\t0xFD89, 0x9F8E, 0xFD8A, 0x9F8F, 0xFD8B, 0x9F90, 0xFD8C, 0x9F91,\t0xFD8D, 0x9F92, 0xFD8E, 0x9F93, 0xFD8F, 0x9F94, 0xFD90, 0x9F95,\n\t0xFD91, 0x9F96, 0xFD92, 0x9F97, 0xFD93, 0x9F98, 0xFD94, 0x9F9C,\t0xFD95, 0x9F9D, 0xFD96, 0x9F9E, 0xFD97, 0x9FA1, 0xFD98, 0x9FA2,\n\t0xFD99, 0x9FA3, 0xFD9A, 0x9FA4, 0xFD9B, 0x9FA5, 0xFD9C, 0xF92C,\t0xFD9D, 0xF979, 0xFD9E, 0xF995, 0xFD9F, 0xF9E7, 0xFDA0, 0xF9F1,\n\t0xFE40, 0xFA0C, 0xFE41, 0xFA0D, 0xFE42, 0xFA0E, 0xFE43, 0xFA0F,\t0xFE44, 0xFA11, 0xFE45, 0xFA13, 0xFE46, 0xFA14, 0xFE47, 0xFA18,\n\t0xFE48, 0xFA1F, 0xFE49, 0xFA20, 0xFE4A, 0xFA21, 0xFE4B, 0xFA23,\t0xFE4C, 0xFA24, 0xFE4D, 0xFA27, 0xFE4E, 0xFA28, 0xFE4F, 0xFA29,\n\t0, 0\n};\n#endif\n\n#if FF_CODE_PAGE == 949 || FF_CODE_PAGE == 0\t/* Korean */\nstatic const WCHAR uni2oem949[] = {\t/* Unicode --> Korean pairs */\n\t0x00A1, 0xA2AE, 0x00A4, 0xA2B4, 0x00A7, 0xA1D7, 0x00A8, 0xA1A7,\t0x00AA, 0xA8A3, 0x00AD, 0xA1A9, 0x00AE, 0xA2E7, 0x00B0, 0xA1C6,\n\t0x00B1, 0xA1BE, 0x00B2, 0xA9F7, 0x00B3, 0xA9F8, 0x00B4, 0xA2A5,\t0x00B6, 0xA2D2, 0x00B7, 0xA1A4, 0x00B8, 0xA2AC, 0x00B9, 0xA9F6,\n\t0x00BA, 0xA8AC, 0x00BC, 0xA8F9, 0x00BD, 0xA8F6, 0x00BE, 0xA8FA,\t0x00BF, 0xA2AF, 0x00C6, 0xA8A1, 0x00D0, 0xA8A2, 0x00D7, 0xA1BF,\n\t0x00D8, 0xA8AA, 0x00DE, 0xA8AD, 0x00DF, 0xA9AC, 0x00E6, 0xA9A1,\t0x00F0, 0xA9A3, 0x00F7, 0xA1C0, 0x00F8, 0xA9AA, 0x00FE, 0xA9AD,\n\t0x0111, 0xA9A2, 0x0126, 0xA8A4, 0x0127, 0xA9A4, 0x0131, 0xA9A5,\t0x0132, 0xA8A6, 0x0133, 0xA9A6, 0x0138, 0xA9A7, 0x013F, 0xA8A8,\n\t0x0140, 0xA9A8, 0x0141, 0xA8A9, 0x0142, 0xA9A9, 0x0149, 0xA9B0,\t0x014A, 0xA8AF, 0x014B, 0xA9AF, 0x0152, 0xA8AB, 0x0153, 0xA9AB,\n\t0x0166, 0xA8AE, 0x0167, 0xA9AE, 0x02C7, 0xA2A7, 0x02D0, 0xA2B0,\t0x02D8, 0xA2A8, 0x02D9, 0xA2AB, 0x02DA, 0xA2AA, 0x02DB, 0xA2AD,\n\t0x02DD, 0xA2A9, 0x0391, 0xA5C1, 0x0392, 0xA5C2, 0x0393, 0xA5C3,\t0x0394, 0xA5C4, 0x0395, 0xA5C5, 0x0396, 0xA5C6, 0x0397, 0xA5C7,\n\t0x0398, 0xA5C8, 0x0399, 0xA5C9, 0x039A, 0xA5CA, 0x039B, 0xA5CB,\t0x039C, 0xA5CC, 0x039D, 0xA5CD, 0x039E, 0xA5CE, 0x039F, 0xA5CF,\n\t0x03A0, 0xA5D0, 0x03A1, 0xA5D1, 0x03A3, 0xA5D2, 0x03A4, 0xA5D3,\t0x03A5, 0xA5D4, 0x03A6, 0xA5D5, 0x03A7, 0xA5D6, 0x03A8, 0xA5D7,\n\t0x03A9, 0xA5D8, 0x03B1, 0xA5E1, 0x03B2, 0xA5E2, 0x03B3, 0xA5E3,\t0x03B4, 0xA5E4, 0x03B5, 0xA5E5, 0x03B6, 0xA5E6, 0x03B7, 0xA5E7,\n\t0x03B8, 0xA5E8, 0x03B9, 0xA5E9, 0x03BA, 0xA5EA, 0x03BB, 0xA5EB,\t0x03BC, 0xA5EC, 0x03BD, 0xA5ED, 0x03BE, 0xA5EE, 0x03BF, 0xA5EF,\n\t0x03C0, 0xA5F0, 0x03C1, 0xA5F1, 0x03C3, 0xA5F2, 0x03C4, 0xA5F3,\t0x03C5, 0xA5F4, 0x03C6, 0xA5F5, 0x03C7, 0xA5F6, 0x03C8, 0xA5F7,\n\t0x03C9, 0xA5F8, 0x0401, 0xACA7, 0x0410, 0xACA1, 0x0411, 0xACA2,\t0x0412, 0xACA3, 0x0413, 0xACA4, 0x0414, 0xACA5, 0x0415, 0xACA6,\n\t0x0416, 0xACA8, 0x0417, 0xACA9, 0x0418, 0xACAA, 0x0419, 0xACAB,\t0x041A, 0xACAC, 0x041B, 0xACAD, 0x041C, 0xACAE, 0x041D, 0xACAF,\n\t0x041E, 0xACB0, 0x041F, 0xACB1, 0x0420, 0xACB2, 0x0421, 0xACB3,\t0x0422, 0xACB4, 0x0423, 0xACB5, 0x0424, 0xACB6, 0x0425, 0xACB7,\n\t0x0426, 0xACB8, 0x0427, 0xACB9, 0x0428, 0xACBA, 0x0429, 0xACBB,\t0x042A, 0xACBC, 0x042B, 0xACBD, 0x042C, 0xACBE, 0x042D, 0xACBF,\n\t0x042E, 0xACC0, 0x042F, 0xACC1, 0x0430, 0xACD1, 0x0431, 0xACD2,\t0x0432, 0xACD3, 0x0433, 0xACD4, 0x0434, 0xACD5, 0x0435, 0xACD6,\n\t0x0436, 0xACD8, 0x0437, 0xACD9, 0x0438, 0xACDA, 0x0439, 0xACDB,\t0x043A, 0xACDC, 0x043B, 0xACDD, 0x043C, 0xACDE, 0x043D, 0xACDF,\n\t0x043E, 0xACE0, 0x043F, 0xACE1, 0x0440, 0xACE2, 0x0441, 0xACE3,\t0x0442, 0xACE4, 0x0443, 0xACE5, 0x0444, 0xACE6, 0x0445, 0xACE7,\n\t0x0446, 0xACE8, 0x0447, 0xACE9, 0x0448, 0xACEA, 0x0449, 0xACEB,\t0x044A, 0xACEC, 0x044B, 0xACED, 0x044C, 0xACEE, 0x044D, 0xACEF,\n\t0x044E, 0xACF0, 0x044F, 0xACF1, 0x0451, 0xACD7, 0x2015, 0xA1AA,\t0x2018, 0xA1AE, 0x2019, 0xA1AF, 0x201C, 0xA1B0, 0x201D, 0xA1B1,\n\t0x2020, 0xA2D3, 0x2021, 0xA2D4, 0x2025, 0xA1A5, 0x2026, 0xA1A6,\t0x2030, 0xA2B6, 0x2032, 0xA1C7, 0x2033, 0xA1C8, 0x203B, 0xA1D8,\n\t0x2074, 0xA9F9, 0x207F, 0xA9FA, 0x2081, 0xA9FB, 0x2082, 0xA9FC,\t0x2083, 0xA9FD, 0x2084, 0xA9FE, 0x20AC, 0xA2E6, 0x2103, 0xA1C9,\n\t0x2109, 0xA2B5, 0x2113, 0xA7A4, 0x2116, 0xA2E0, 0x2121, 0xA2E5,\t0x2122, 0xA2E2, 0x2126, 0xA7D9, 0x212B, 0xA1CA, 0x2153, 0xA8F7,\n\t0x2154, 0xA8F8, 0x215B, 0xA8FB, 0x215C, 0xA8FC, 0x215D, 0xA8FD,\t0x215E, 0xA8FE, 0x2160, 0xA5B0, 0x2161, 0xA5B1, 0x2162, 0xA5B2,\n\t0x2163, 0xA5B3, 0x2164, 0xA5B4, 0x2165, 0xA5B5, 0x2166, 0xA5B6,\t0x2167, 0xA5B7, 0x2168, 0xA5B8, 0x2169, 0xA5B9, 0x2170, 0xA5A1,\n\t0x2171, 0xA5A2, 0x2172, 0xA5A3, 0x2173, 0xA5A4, 0x2174, 0xA5A5,\t0x2175, 0xA5A6, 0x2176, 0xA5A7, 0x2177, 0xA5A8, 0x2178, 0xA5A9,\n\t0x2179, 0xA5AA, 0x2190, 0xA1E7, 0x2191, 0xA1E8, 0x2192, 0xA1E6,\t0x2193, 0xA1E9, 0x2194, 0xA1EA, 0x2195, 0xA2D5, 0x2196, 0xA2D8,\n\t0x2197, 0xA2D6, 0x2198, 0xA2D9, 0x2199, 0xA2D7, 0x21D2, 0xA2A1,\t0x21D4, 0xA2A2, 0x2200, 0xA2A3, 0x2202, 0xA1D3, 0x2203, 0xA2A4,\n\t0x2207, 0xA1D4, 0x2208, 0xA1F4, 0x220B, 0xA1F5, 0x220F, 0xA2B3,\t0x2211, 0xA2B2, 0x221A, 0xA1EE, 0x221D, 0xA1F0, 0x221E, 0xA1C4,\n\t0x2220, 0xA1D0, 0x2225, 0xA1AB, 0x2227, 0xA1FC, 0x2228, 0xA1FD,\t0x2229, 0xA1FB, 0x222A, 0xA1FA, 0x222B, 0xA1F2, 0x222C, 0xA1F3,\n\t0x222E, 0xA2B1, 0x2234, 0xA1C5, 0x2235, 0xA1F1, 0x223C, 0xA1AD,\t0x223D, 0xA1EF, 0x2252, 0xA1D6, 0x2260, 0xA1C1, 0x2261, 0xA1D5,\n\t0x2264, 0xA1C2, 0x2265, 0xA1C3, 0x226A, 0xA1EC, 0x226B, 0xA1ED,\t0x2282, 0xA1F8, 0x2283, 0xA1F9, 0x2286, 0xA1F6, 0x2287, 0xA1F7,\n\t0x2299, 0xA2C1, 0x22A5, 0xA1D1, 0x2312, 0xA1D2, 0x2460, 0xA8E7,\t0x2461, 0xA8E8, 0x2462, 0xA8E9, 0x2463, 0xA8EA, 0x2464, 0xA8EB,\n\t0x2465, 0xA8EC, 0x2466, 0xA8ED, 0x2467, 0xA8EE, 0x2468, 0xA8EF,\t0x2469, 0xA8F0, 0x246A, 0xA8F1, 0x246B, 0xA8F2, 0x246C, 0xA8F3,\n\t0x246D, 0xA8F4, 0x246E, 0xA8F5, 0x2474, 0xA9E7, 0x2475, 0xA9E8,\t0x2476, 0xA9E9, 0x2477, 0xA9EA, 0x2478, 0xA9EB, 0x2479, 0xA9EC,\n\t0x247A, 0xA9ED, 0x247B, 0xA9EE, 0x247C, 0xA9EF, 0x247D, 0xA9F0,\t0x247E, 0xA9F1, 0x247F, 0xA9F2, 0x2480, 0xA9F3, 0x2481, 0xA9F4,\n\t0x2482, 0xA9F5, 0x249C, 0xA9CD, 0x249D, 0xA9CE, 0x249E, 0xA9CF,\t0x249F, 0xA9D0, 0x24A0, 0xA9D1, 0x24A1, 0xA9D2, 0x24A2, 0xA9D3,\n\t0x24A3, 0xA9D4, 0x24A4, 0xA9D5, 0x24A5, 0xA9D6, 0x24A6, 0xA9D7,\t0x24A7, 0xA9D8, 0x24A8, 0xA9D9, 0x24A9, 0xA9DA, 0x24AA, 0xA9DB,\n\t0x24AB, 0xA9DC, 0x24AC, 0xA9DD, 0x24AD, 0xA9DE, 0x24AE, 0xA9DF,\t0x24AF, 0xA9E0, 0x24B0, 0xA9E1, 0x24B1, 0xA9E2, 0x24B2, 0xA9E3,\n\t0x24B3, 0xA9E4, 0x24B4, 0xA9E5, 0x24B5, 0xA9E6, 0x24D0, 0xA8CD,\t0x24D1, 0xA8CE, 0x24D2, 0xA8CF, 0x24D3, 0xA8D0, 0x24D4, 0xA8D1,\n\t0x24D5, 0xA8D2, 0x24D6, 0xA8D3, 0x24D7, 0xA8D4, 0x24D8, 0xA8D5,\t0x24D9, 0xA8D6, 0x24DA, 0xA8D7, 0x24DB, 0xA8D8, 0x24DC, 0xA8D9,\n\t0x24DD, 0xA8DA, 0x24DE, 0xA8DB, 0x24DF, 0xA8DC, 0x24E0, 0xA8DD,\t0x24E1, 0xA8DE, 0x24E2, 0xA8DF, 0x24E3, 0xA8E0, 0x24E4, 0xA8E1,\n\t0x24E5, 0xA8E2, 0x24E6, 0xA8E3, 0x24E7, 0xA8E4, 0x24E8, 0xA8E5,\t0x24E9, 0xA8E6, 0x2500, 0xA6A1, 0x2501, 0xA6AC, 0x2502, 0xA6A2,\n\t0x2503, 0xA6AD, 0x250C, 0xA6A3, 0x250D, 0xA6C8, 0x250E, 0xA6C7,\t0x250F, 0xA6AE, 0x2510, 0xA6A4, 0x2511, 0xA6C2, 0x2512, 0xA6C1,\n\t0x2513, 0xA6AF, 0x2514, 0xA6A6, 0x2515, 0xA6C6, 0x2516, 0xA6C5,\t0x2517, 0xA6B1, 0x2518, 0xA6A5, 0x2519, 0xA6C4, 0x251A, 0xA6C3,\n\t0x251B, 0xA6B0, 0x251C, 0xA6A7, 0x251D, 0xA6BC, 0x251E, 0xA6C9,\t0x251F, 0xA6CA, 0x2520, 0xA6B7, 0x2521, 0xA6CB, 0x2522, 0xA6CC,\n\t0x2523, 0xA6B2, 0x2524, 0xA6A9, 0x2525, 0xA6BE, 0x2526, 0xA6CD,\t0x2527, 0xA6CE, 0x2528, 0xA6B9, 0x2529, 0xA6CF, 0x252A, 0xA6D0,\n\t0x252B, 0xA6B4, 0x252C, 0xA6A8, 0x252D, 0xA6D1, 0x252E, 0xA6D2,\t0x252F, 0xA6B8, 0x2530, 0xA6BD, 0x2531, 0xA6D3, 0x2532, 0xA6D4,\n\t0x2533, 0xA6B3, 0x2534, 0xA6AA, 0x2535, 0xA6D5, 0x2536, 0xA6D6,\t0x2537, 0xA6BA, 0x2538, 0xA6BF, 0x2539, 0xA6D7, 0x253A, 0xA6D8,\n\t0x253B, 0xA6B5, 0x253C, 0xA6AB, 0x253D, 0xA6D9, 0x253E, 0xA6DA,\t0x253F, 0xA6BB, 0x2540, 0xA6DB, 0x2541, 0xA6DC, 0x2542, 0xA6C0,\n\t0x2543, 0xA6DD, 0x2544, 0xA6DE, 0x2545, 0xA6DF, 0x2546, 0xA6E0,\t0x2547, 0xA6E1, 0x2548, 0xA6E2, 0x2549, 0xA6E3, 0x254A, 0xA6E4,\n\t0x254B, 0xA6B6, 0x2592, 0xA2C6, 0x25A0, 0xA1E1, 0x25A1, 0xA1E0,\t0x25A3, 0xA2C3, 0x25A4, 0xA2C7, 0x25A5, 0xA2C8, 0x25A6, 0xA2CB,\n\t0x25A7, 0xA2CA, 0x25A8, 0xA2C9, 0x25A9, 0xA2CC, 0x25B2, 0xA1E3,\t0x25B3, 0xA1E2, 0x25B6, 0xA2BA, 0x25B7, 0xA2B9, 0x25BC, 0xA1E5,\n\t0x25BD, 0xA1E4, 0x25C0, 0xA2B8, 0x25C1, 0xA2B7, 0x25C6, 0xA1DF,\t0x25C7, 0xA1DE, 0x25C8, 0xA2C2, 0x25CB, 0xA1DB, 0x25CE, 0xA1DD,\n\t0x25CF, 0xA1DC, 0x25D0, 0xA2C4, 0x25D1, 0xA2C5, 0x2605, 0xA1DA,\t0x2606, 0xA1D9, 0x260E, 0xA2CF, 0x260F, 0xA2CE, 0x261C, 0xA2D0,\n\t0x261E, 0xA2D1, 0x2640, 0xA1CF, 0x2642, 0xA1CE, 0x2660, 0xA2BC,\t0x2661, 0xA2BD, 0x2663, 0xA2C0, 0x2664, 0xA2BB, 0x2665, 0xA2BE,\n\t0x2667, 0xA2BF, 0x2668, 0xA2CD, 0x2669, 0xA2DB, 0x266A, 0xA2DC,\t0x266C, 0xA2DD, 0x266D, 0xA2DA, 0x3000, 0xA1A1, 0x3001, 0xA1A2,\n\t0x3002, 0xA1A3, 0x3003, 0xA1A8, 0x3008, 0xA1B4, 0x3009, 0xA1B5,\t0x300A, 0xA1B6, 0x300B, 0xA1B7, 0x300C, 0xA1B8, 0x300D, 0xA1B9,\n\t0x300E, 0xA1BA, 0x300F, 0xA1BB, 0x3010, 0xA1BC, 0x3011, 0xA1BD,\t0x3013, 0xA1EB, 0x3014, 0xA1B2, 0x3015, 0xA1B3, 0x3041, 0xAAA1,\n\t0x3042, 0xAAA2, 0x3043, 0xAAA3, 0x3044, 0xAAA4, 0x3045, 0xAAA5,\t0x3046, 0xAAA6, 0x3047, 0xAAA7, 0x3048, 0xAAA8, 0x3049, 0xAAA9,\n\t0x304A, 0xAAAA, 0x304B, 0xAAAB, 0x304C, 0xAAAC, 0x304D, 0xAAAD,\t0x304E, 0xAAAE, 0x304F, 0xAAAF, 0x3050, 0xAAB0, 0x3051, 0xAAB1,\n\t0x3052, 0xAAB2, 0x3053, 0xAAB3, 0x3054, 0xAAB4, 0x3055, 0xAAB5,\t0x3056, 0xAAB6, 0x3057, 0xAAB7, 0x3058, 0xAAB8, 0x3059, 0xAAB9,\n\t0x305A, 0xAABA, 0x305B, 0xAABB, 0x305C, 0xAABC, 0x305D, 0xAABD,\t0x305E, 0xAABE, 0x305F, 0xAABF, 0x3060, 0xAAC0, 0x3061, 0xAAC1,\n\t0x3062, 0xAAC2, 0x3063, 0xAAC3, 0x3064, 0xAAC4, 0x3065, 0xAAC5,\t0x3066, 0xAAC6, 0x3067, 0xAAC7, 0x3068, 0xAAC8, 0x3069, 0xAAC9,\n\t0x306A, 0xAACA, 0x306B, 0xAACB, 0x306C, 0xAACC, 0x306D, 0xAACD,\t0x306E, 0xAACE, 0x306F, 0xAACF, 0x3070, 0xAAD0, 0x3071, 0xAAD1,\n\t0x3072, 0xAAD2, 0x3073, 0xAAD3, 0x3074, 0xAAD4, 0x3075, 0xAAD5,\t0x3076, 0xAAD6, 0x3077, 0xAAD7, 0x3078, 0xAAD8, 0x3079, 0xAAD9,\n\t0x307A, 0xAADA, 0x307B, 0xAADB, 0x307C, 0xAADC, 0x307D, 0xAADD,\t0x307E, 0xAADE, 0x307F, 0xAADF, 0x3080, 0xAAE0, 0x3081, 0xAAE1,\n\t0x3082, 0xAAE2, 0x3083, 0xAAE3, 0x3084, 0xAAE4, 0x3085, 0xAAE5,\t0x3086, 0xAAE6, 0x3087, 0xAAE7, 0x3088, 0xAAE8, 0x3089, 0xAAE9,\n\t0x308A, 0xAAEA, 0x308B, 0xAAEB, 0x308C, 0xAAEC, 0x308D, 0xAAED,\t0x308E, 0xAAEE, 0x308F, 0xAAEF, 0x3090, 0xAAF0, 0x3091, 0xAAF1,\n\t0x3092, 0xAAF2, 0x3093, 0xAAF3, 0x30A1, 0xABA1, 0x30A2, 0xABA2,\t0x30A3, 0xABA3, 0x30A4, 0xABA4, 0x30A5, 0xABA5, 0x30A6, 0xABA6,\n\t0x30A7, 0xABA7, 0x30A8, 0xABA8, 0x30A9, 0xABA9, 0x30AA, 0xABAA,\t0x30AB, 0xABAB, 0x30AC, 0xABAC, 0x30AD, 0xABAD, 0x30AE, 0xABAE,\n\t0x30AF, 0xABAF, 0x30B0, 0xABB0, 0x30B1, 0xABB1, 0x30B2, 0xABB2,\t0x30B3, 0xABB3, 0x30B4, 0xABB4, 0x30B5, 0xABB5, 0x30B6, 0xABB6,\n\t0x30B7, 0xABB7, 0x30B8, 0xABB8, 0x30B9, 0xABB9, 0x30BA, 0xABBA,\t0x30BB, 0xABBB, 0x30BC, 0xABBC, 0x30BD, 0xABBD, 0x30BE, 0xABBE,\n\t0x30BF, 0xABBF, 0x30C0, 0xABC0, 0x30C1, 0xABC1, 0x30C2, 0xABC2,\t0x30C3, 0xABC3, 0x30C4, 0xABC4, 0x30C5, 0xABC5, 0x30C6, 0xABC6,\n\t0x30C7, 0xABC7, 0x30C8, 0xABC8, 0x30C9, 0xABC9, 0x30CA, 0xABCA,\t0x30CB, 0xABCB, 0x30CC, 0xABCC, 0x30CD, 0xABCD, 0x30CE, 0xABCE,\n\t0x30CF, 0xABCF, 0x30D0, 0xABD0, 0x30D1, 0xABD1, 0x30D2, 0xABD2,\t0x30D3, 0xABD3, 0x30D4, 0xABD4, 0x30D5, 0xABD5, 0x30D6, 0xABD6,\n\t0x30D7, 0xABD7, 0x30D8, 0xABD8, 0x30D9, 0xABD9, 0x30DA, 0xABDA,\t0x30DB, 0xABDB, 0x30DC, 0xABDC, 0x30DD, 0xABDD, 0x30DE, 0xABDE,\n\t0x30DF, 0xABDF, 0x30E0, 0xABE0, 0x30E1, 0xABE1, 0x30E2, 0xABE2,\t0x30E3, 0xABE3, 0x30E4, 0xABE4, 0x30E5, 0xABE5, 0x30E6, 0xABE6,\n\t0x30E7, 0xABE7, 0x30E8, 0xABE8, 0x30E9, 0xABE9, 0x30EA, 0xABEA,\t0x30EB, 0xABEB, 0x30EC, 0xABEC, 0x30ED, 0xABED, 0x30EE, 0xABEE,\n\t0x30EF, 0xABEF, 0x30F0, 0xABF0, 0x30F1, 0xABF1, 0x30F2, 0xABF2,\t0x30F3, 0xABF3, 0x30F4, 0xABF4, 0x30F5, 0xABF5, 0x30F6, 0xABF6,\n\t0x3131, 0xA4A1, 0x3132, 0xA4A2, 0x3133, 0xA4A3, 0x3134, 0xA4A4,\t0x3135, 0xA4A5, 0x3136, 0xA4A6, 0x3137, 0xA4A7, 0x3138, 0xA4A8,\n\t0x3139, 0xA4A9, 0x313A, 0xA4AA, 0x313B, 0xA4AB, 0x313C, 0xA4AC,\t0x313D, 0xA4AD, 0x313E, 0xA4AE, 0x313F, 0xA4AF, 0x3140, 0xA4B0,\n\t0x3141, 0xA4B1, 0x3142, 0xA4B2, 0x3143, 0xA4B3, 0x3144, 0xA4B4,\t0x3145, 0xA4B5, 0x3146, 0xA4B6, 0x3147, 0xA4B7, 0x3148, 0xA4B8,\n\t0x3149, 0xA4B9, 0x314A, 0xA4BA, 0x314B, 0xA4BB, 0x314C, 0xA4BC,\t0x314D, 0xA4BD, 0x314E, 0xA4BE, 0x314F, 0xA4BF, 0x3150, 0xA4C0,\n\t0x3151, 0xA4C1, 0x3152, 0xA4C2, 0x3153, 0xA4C3, 0x3154, 0xA4C4,\t0x3155, 0xA4C5, 0x3156, 0xA4C6, 0x3157, 0xA4C7, 0x3158, 0xA4C8,\n\t0x3159, 0xA4C9, 0x315A, 0xA4CA, 0x315B, 0xA4CB, 0x315C, 0xA4CC,\t0x315D, 0xA4CD, 0x315E, 0xA4CE, 0x315F, 0xA4CF, 0x3160, 0xA4D0,\n\t0x3161, 0xA4D1, 0x3162, 0xA4D2, 0x3163, 0xA4D3, 0x3164, 0xA4D4,\t0x3165, 0xA4D5, 0x3166, 0xA4D6, 0x3167, 0xA4D7, 0x3168, 0xA4D8,\n\t0x3169, 0xA4D9, 0x316A, 0xA4DA, 0x316B, 0xA4DB, 0x316C, 0xA4DC,\t0x316D, 0xA4DD, 0x316E, 0xA4DE, 0x316F, 0xA4DF, 0x3170, 0xA4E0,\n\t0x3171, 0xA4E1, 0x3172, 0xA4E2, 0x3173, 0xA4E3, 0x3174, 0xA4E4,\t0x3175, 0xA4E5, 0x3176, 0xA4E6, 0x3177, 0xA4E7, 0x3178, 0xA4E8,\n\t0x3179, 0xA4E9, 0x317A, 0xA4EA, 0x317B, 0xA4EB, 0x317C, 0xA4EC,\t0x317D, 0xA4ED, 0x317E, 0xA4EE, 0x317F, 0xA4EF, 0x3180, 0xA4F0,\n\t0x3181, 0xA4F1, 0x3182, 0xA4F2, 0x3183, 0xA4F3, 0x3184, 0xA4F4,\t0x3185, 0xA4F5, 0x3186, 0xA4F6, 0x3187, 0xA4F7, 0x3188, 0xA4F8,\n\t0x3189, 0xA4F9, 0x318A, 0xA4FA, 0x318B, 0xA4FB, 0x318C, 0xA4FC,\t0x318D, 0xA4FD, 0x318E, 0xA4FE, 0x3200, 0xA9B1, 0x3201, 0xA9B2,\n\t0x3202, 0xA9B3, 0x3203, 0xA9B4, 0x3204, 0xA9B5, 0x3205, 0xA9B6,\t0x3206, 0xA9B7, 0x3207, 0xA9B8, 0x3208, 0xA9B9, 0x3209, 0xA9BA,\n\t0x320A, 0xA9BB, 0x320B, 0xA9BC, 0x320C, 0xA9BD, 0x320D, 0xA9BE,\t0x320E, 0xA9BF, 0x320F, 0xA9C0, 0x3210, 0xA9C1, 0x3211, 0xA9C2,\n\t0x3212, 0xA9C3, 0x3213, 0xA9C4, 0x3214, 0xA9C5, 0x3215, 0xA9C6,\t0x3216, 0xA9C7, 0x3217, 0xA9C8, 0x3218, 0xA9C9, 0x3219, 0xA9CA,\n\t0x321A, 0xA9CB, 0x321B, 0xA9CC, 0x321C, 0xA2DF, 0x3260, 0xA8B1,\t0x3261, 0xA8B2, 0x3262, 0xA8B3, 0x3263, 0xA8B4, 0x3264, 0xA8B5,\n\t0x3265, 0xA8B6, 0x3266, 0xA8B7, 0x3267, 0xA8B8, 0x3268, 0xA8B9,\t0x3269, 0xA8BA, 0x326A, 0xA8BB, 0x326B, 0xA8BC, 0x326C, 0xA8BD,\n\t0x326D, 0xA8BE, 0x326E, 0xA8BF, 0x326F, 0xA8C0, 0x3270, 0xA8C1,\t0x3271, 0xA8C2, 0x3272, 0xA8C3, 0x3273, 0xA8C4, 0x3274, 0xA8C5,\n\t0x3275, 0xA8C6, 0x3276, 0xA8C7, 0x3277, 0xA8C8, 0x3278, 0xA8C9,\t0x3279, 0xA8CA, 0x327A, 0xA8CB, 0x327B, 0xA8CC, 0x327F, 0xA2DE,\n\t0x3380, 0xA7C9, 0x3381, 0xA7CA, 0x3382, 0xA7CB, 0x3383, 0xA7CC,\t0x3384, 0xA7CD, 0x3388, 0xA7BA, 0x3389, 0xA7BB, 0x338A, 0xA7DC,\n\t0x338B, 0xA7DD, 0x338C, 0xA7DE, 0x338D, 0xA7B6, 0x338E, 0xA7B7,\t0x338F, 0xA7B8, 0x3390, 0xA7D4, 0x3391, 0xA7D5, 0x3392, 0xA7D6,\n\t0x3393, 0xA7D7, 0x3394, 0xA7D8, 0x3395, 0xA7A1, 0x3396, 0xA7A2,\t0x3397, 0xA7A3, 0x3398, 0xA7A5, 0x3399, 0xA7AB, 0x339A, 0xA7AC,\n\t0x339B, 0xA7AD, 0x339C, 0xA7AE, 0x339D, 0xA7AF, 0x339E, 0xA7B0,\t0x339F, 0xA7B1, 0x33A0, 0xA7B2, 0x33A1, 0xA7B3, 0x33A2, 0xA7B4,\n\t0x33A3, 0xA7A7, 0x33A4, 0xA7A8, 0x33A5, 0xA7A9, 0x33A6, 0xA7AA,\t0x33A7, 0xA7BD, 0x33A8, 0xA7BE, 0x33A9, 0xA7E5, 0x33AA, 0xA7E6,\n\t0x33AB, 0xA7E7, 0x33AC, 0xA7E8, 0x33AD, 0xA7E1, 0x33AE, 0xA7E2,\t0x33AF, 0xA7E3, 0x33B0, 0xA7BF, 0x33B1, 0xA7C0, 0x33B2, 0xA7C1,\n\t0x33B3, 0xA7C2, 0x33B4, 0xA7C3, 0x33B5, 0xA7C4, 0x33B6, 0xA7C5,\t0x33B7, 0xA7C6, 0x33B8, 0xA7C7, 0x33B9, 0xA7C8, 0x33BA, 0xA7CE,\n\t0x33BB, 0xA7CF, 0x33BC, 0xA7D0, 0x33BD, 0xA7D1, 0x33BE, 0xA7D2,\t0x33BF, 0xA7D3, 0x33C0, 0xA7DA, 0x33C1, 0xA7DB, 0x33C2, 0xA2E3,\n\t0x33C3, 0xA7EC, 0x33C4, 0xA7A6, 0x33C5, 0xA7E0, 0x33C6, 0xA7EF,\t0x33C7, 0xA2E1, 0x33C8, 0xA7BC, 0x33C9, 0xA7ED, 0x33CA, 0xA7B5,\n\t0x33CF, 0xA7B9, 0x33D0, 0xA7EA, 0x33D3, 0xA7EB, 0x33D6, 0xA7DF,\t0x33D8, 0xA2E4, 0x33DB, 0xA7E4, 0x33DC, 0xA7EE, 0x33DD, 0xA7E9,\n\t0x4E00, 0xECE9, 0x4E01, 0xEFCB, 0x4E03, 0xF6D2, 0x4E07, 0xD8B2,\t0x4E08, 0xEDDB, 0x4E09, 0xDFB2, 0x4E0A, 0xDFBE, 0x4E0B, 0xF9BB,\n\t0x4E0D, 0xDCF4, 0x4E11, 0xF5E4, 0x4E14, 0xF3A6, 0x4E15, 0xDDE0,\t0x4E16, 0xE1A6, 0x4E18, 0xCEF8, 0x4E19, 0xDCB0, 0x4E1E, 0xE3AA,\n\t0x4E2D, 0xF1E9, 0x4E32, 0xCDFA, 0x4E38, 0xFCAF, 0x4E39, 0xD3A1,\t0x4E3B, 0xF1AB, 0x4E42, 0xE7D1, 0x4E43, 0xD2AC, 0x4E45, 0xCEF9,\n\t0x4E4B, 0xF1FD, 0x4E4D, 0xDEBF, 0x4E4E, 0xFBBA, 0x4E4F, 0xF9B9,\t0x4E56, 0xCED2, 0x4E58, 0xE3AB, 0x4E59, 0xEBE0, 0x4E5D, 0xCEFA,\n\t0x4E5E, 0xCBF7, 0x4E5F, 0xE5A5, 0x4E6B, 0xCAE1, 0x4E6D, 0xD4CC,\t0x4E73, 0xEAE1, 0x4E76, 0xDCE3, 0x4E77, 0xDFAD, 0x4E7E, 0xCBEB,\n\t0x4E82, 0xD5AF, 0x4E86, 0xD6F5, 0x4E88, 0xE5F8, 0x4E8B, 0xDEC0,\t0x4E8C, 0xECA3, 0x4E8E, 0xE9CD, 0x4E90, 0xEAA7, 0x4E91, 0xE9F6,\n\t0x4E92, 0xFBBB, 0x4E94, 0xE7E9, 0x4E95, 0xEFCC, 0x4E98, 0xD0E6,\t0x4E9B, 0xDEC1, 0x4E9E, 0xE4AC, 0x4EA1, 0xD8CC, 0x4EA2, 0xF9F1,\n\t0x4EA4, 0xCEDF, 0x4EA5, 0xFAA4, 0x4EA6, 0xE6B2, 0x4EA8, 0xFAFB,\t0x4EAB, 0xFABD, 0x4EAC, 0xCCC8, 0x4EAD, 0xEFCD, 0x4EAE, 0xD5D5,\n\t0x4EB6, 0xD3A2, 0x4EBA, 0xECD1, 0x4EC0, 0xE4A7, 0x4EC1, 0xECD2,\t0x4EC4, 0xF6B1, 0x4EC7, 0xCEFB, 0x4ECA, 0xD0D1, 0x4ECB, 0xCBBF,\n\t0x4ECD, 0xEDA4, 0x4ED4, 0xEDA8, 0x4ED5, 0xDEC2, 0x4ED6, 0xF6E2,\t0x4ED7, 0xEDDC, 0x4ED8, 0xDCF5, 0x4ED9, 0xE0B9, 0x4EDD, 0xD4CE,\n\t0x4EDF, 0xF4B5, 0x4EE3, 0xD3DB, 0x4EE4, 0xD6B5, 0x4EE5, 0xECA4,\t0x4EF0, 0xE4E6, 0x4EF2, 0xF1EA, 0x4EF6, 0xCBEC, 0x4EF7, 0xCBC0,\n\t0x4EFB, 0xECF2, 0x4F01, 0xD0EA, 0x4F09, 0xF9F2, 0x4F0A, 0xECA5,\t0x4F0B, 0xD0DF, 0x4F0D, 0xE7EA, 0x4F0E, 0xD0EB, 0x4F0F, 0xDCD1,\n\t0x4F10, 0xDBE9, 0x4F11, 0xFDCC, 0x4F2F, 0xDBD7, 0x4F34, 0xDAE1,\t0x4F36, 0xD6B6, 0x4F38, 0xE3DF, 0x4F3A, 0xDEC3, 0x4F3C, 0xDEC4,\n\t0x4F3D, 0xCAA1, 0x4F43, 0xEEEC, 0x4F46, 0xD3A3, 0x4F47, 0xEEB7,\t0x4F48, 0xF8CF, 0x4F4D, 0xEAC8, 0x4F4E, 0xEEB8, 0x4F4F, 0xF1AC,\n\t0x4F50, 0xF1A5, 0x4F51, 0xE9CE, 0x4F55, 0xF9BC, 0x4F59, 0xE5F9,\t0x4F5A, 0xECEA, 0x4F5B, 0xDDD6, 0x4F5C, 0xEDC2, 0x4F69, 0xF8A5,\n\t0x4F6F, 0xE5BA, 0x4F70, 0xDBD8, 0x4F73, 0xCAA2, 0x4F76, 0xD1CD,\t0x4F7A, 0xEEED, 0x4F7E, 0xECEB, 0x4F7F, 0xDEC5, 0x4F81, 0xE3E0,\n\t0x4F83, 0xCAC9, 0x4F84, 0xF2E9, 0x4F86, 0xD5CE, 0x4F88, 0xF6B6,\t0x4F8A, 0xCEC2, 0x4F8B, 0xD6C7, 0x4F8D, 0xE3B4, 0x4F8F, 0xF1AD,\n\t0x4F91, 0xEAE2, 0x4F96, 0xD7C2, 0x4F98, 0xF3A7, 0x4F9B, 0xCDEA,\t0x4F9D, 0xEBEE, 0x4FAE, 0xD9B2, 0x4FAF, 0xFDA5, 0x4FB5, 0xF6D5,\n\t0x4FB6, 0xD5E2, 0x4FBF, 0xF8B5, 0x4FC2, 0xCCF5, 0x4FC3, 0xF5B5,\t0x4FC4, 0xE4AD, 0x4FC9, 0xE7EB, 0x4FCA, 0xF1D5, 0x4FCE, 0xF0BB,\n\t0x4FD1, 0xE9B5, 0x4FD3, 0xCCC9, 0x4FD4, 0xFAD5, 0x4FD7, 0xE1D4,\t0x4FDA, 0xD7D6, 0x4FDD, 0xDCC1, 0x4FDF, 0xDEC6, 0x4FE0, 0xFAEF,\n\t0x4FE1, 0xE3E1, 0x4FEE, 0xE1F3, 0x4FEF, 0xDCF6, 0x4FF1, 0xCEFC,\t0x4FF3, 0xDBC4, 0x4FF5, 0xF8F1, 0x4FF8, 0xDCE4, 0x4FFA, 0xE5EF,\n\t0x5002, 0xDCB1, 0x5006, 0xD5D6, 0x5009, 0xF3DA, 0x500B, 0xCBC1,\t0x500D, 0xDBC3, 0x5011, 0xD9FA, 0x5012, 0xD3EE, 0x5016, 0xFAB8,\n\t0x5019, 0xFDA6, 0x501A, 0xEBEF, 0x501C, 0xF4A6, 0x501E, 0xCCCA,\t0x501F, 0xF3A8, 0x5021, 0xF3DB, 0x5023, 0xDBA7, 0x5024, 0xF6B7,\n\t0x5026, 0xCFE6, 0x5027, 0xF0F2, 0x5028, 0xCBDA, 0x502A, 0xE7D2,\t0x502B, 0xD7C3, 0x502C, 0xF6F0, 0x502D, 0xE8DE, 0x503B, 0xE5A6,\n\t0x5043, 0xE5E7, 0x5047, 0xCAA3, 0x5048, 0xCCA7, 0x5049, 0xEAC9,\t0x504F, 0xF8B6, 0x5055, 0xFAA5, 0x505A, 0xF1AE, 0x505C, 0xEFCE,\n\t0x5065, 0xCBED, 0x5074, 0xF6B0, 0x5075, 0xEFCF, 0x5076, 0xE9CF,\t0x5078, 0xF7DE, 0x5080, 0xCED3, 0x5085, 0xDCF7, 0x508D, 0xDBA8,\n\t0x5091, 0xCBF8, 0x5098, 0xDFA1, 0x5099, 0xDDE1, 0x50AC, 0xF5CA,\t0x50AD, 0xE9B6, 0x50B2, 0xE7EC, 0x50B3, 0xEEEE, 0x50B5, 0xF3F0,\n\t0x50B7, 0xDFBF, 0x50BE, 0xCCCB, 0x50C5, 0xD0C1, 0x50C9, 0xF4D2,\t0x50CA, 0xE0BA, 0x50CF, 0xDFC0, 0x50D1, 0xCEE0, 0x50D5, 0xDCD2,\n\t0x50D6, 0xFDEA, 0x50DA, 0xD6F6, 0x50DE, 0xEACA, 0x50E5, 0xE8E9,\t0x50E7, 0xE3AC, 0x50ED, 0xF3D0, 0x50F9, 0xCAA4, 0x50FB, 0xDBF8,\n\t0x50FF, 0xDEC7, 0x5100, 0xEBF0, 0x5101, 0xF1D6, 0x5104, 0xE5E2,\t0x5106, 0xCCCC, 0x5109, 0xCBFB, 0x5112, 0xEAE3, 0x511F, 0xDFC1,\n\t0x5121, 0xD6ED, 0x512A, 0xE9D0, 0x5132, 0xEEB9, 0x5137, 0xD5E3,\t0x513A, 0xD1D3, 0x513C, 0xE5F0, 0x5140, 0xE8B4, 0x5141, 0xEBC3,\n\t0x5143, 0xEAAA, 0x5144, 0xFAFC, 0x5145, 0xF5F6, 0x5146, 0xF0BC,\t0x5147, 0xFDD4, 0x5148, 0xE0BB, 0x5149, 0xCEC3, 0x514B, 0xD0BA,\n\t0x514C, 0xF7BA, 0x514D, 0xD8F3, 0x514E, 0xF7CD, 0x5152, 0xE4AE,\t0x515C, 0xD4DF, 0x5162, 0xD0E7, 0x5165, 0xECFD, 0x5167, 0xD2AE,\n\t0x5168, 0xEEEF, 0x5169, 0xD5D7, 0x516A, 0xEAE4, 0x516B, 0xF8A2,\t0x516C, 0xCDEB, 0x516D, 0xD7BF, 0x516E, 0xFBB1, 0x5171, 0xCDEC,\n\t0x5175, 0xDCB2, 0x5176, 0xD0EC, 0x5177, 0xCEFD, 0x5178, 0xEEF0,\t0x517C, 0xCCC2, 0x5180, 0xD0ED, 0x5186, 0xE5F7, 0x518A, 0xF3FC,\n\t0x518D, 0xEEA2, 0x5192, 0xD9B3, 0x5195, 0xD8F4, 0x5197, 0xE9B7,\t0x51A0, 0xCEAE, 0x51A5, 0xD9A2, 0x51AA, 0xD8F1, 0x51AC, 0xD4CF,\n\t0x51B6, 0xE5A7, 0x51B7, 0xD5D2, 0x51BD, 0xD6A9, 0x51C4, 0xF4A2,\t0x51C6, 0xF1D7, 0x51C9, 0xD5D8, 0x51CB, 0xF0BD, 0x51CC, 0xD7D0,\n\t0x51CD, 0xD4D0, 0x51DC, 0xD7CF, 0x51DD, 0xEBEA, 0x51DE, 0xFDEB,\t0x51E1, 0xDBED, 0x51F0, 0xFCC5, 0x51F1, 0xCBC2, 0x51F6, 0xFDD5,\n\t0x51F8, 0xF4C8, 0x51F9, 0xE8EA, 0x51FA, 0xF5F3, 0x51FD, 0xF9DE,\t0x5200, 0xD3EF, 0x5203, 0xECD3, 0x5206, 0xDDC2, 0x5207, 0xEFB7,\n\t0x5208, 0xE7D4, 0x520A, 0xCACA, 0x520E, 0xD9FB, 0x5211, 0xFAFD,\t0x5217, 0xD6AA, 0x521D, 0xF4F8, 0x5224, 0xF7F7, 0x5225, 0xDCAC,\n\t0x5229, 0xD7D7, 0x522A, 0xDFA2, 0x522E, 0xCEBE, 0x5230, 0xD3F0,\t0x5236, 0xF0A4, 0x5237, 0xE1EC, 0x5238, 0xCFE7, 0x5239, 0xF3CB,\n\t0x523A, 0xEDA9, 0x523B, 0xCABE, 0x5243, 0xF4EF, 0x5247, 0xF6CE,\t0x524A, 0xDEFB, 0x524B, 0xD0BB, 0x524C, 0xD5B7, 0x524D, 0xEEF1,\n\t0x5254, 0xF4A8, 0x5256, 0xDCF8, 0x525B, 0xCBA7, 0x525D, 0xDACE,\t0x5261, 0xE0E6, 0x5269, 0xEDA5, 0x526A, 0xEEF2, 0x526F, 0xDCF9,\n\t0x5272, 0xF9DC, 0x5275, 0xF3DC, 0x527D, 0xF8F2, 0x527F, 0xF4F9,\t0x5283, 0xFCF1, 0x5287, 0xD0BC, 0x5288, 0xDBF9, 0x5289, 0xD7B1,\n\t0x528D, 0xCBFC, 0x5291, 0xF0A5, 0x5292, 0xCBFD, 0x529B, 0xD5F4,\t0x529F, 0xCDED, 0x52A0, 0xCAA5, 0x52A3, 0xD6AB, 0x52A4, 0xD0C2,\n\t0x52A9, 0xF0BE, 0x52AA, 0xD2BD, 0x52AB, 0xCCA4, 0x52BE, 0xFAB6,\t0x52C1, 0xCCCD, 0x52C3, 0xDAFA, 0x52C5, 0xF6CF, 0x52C7, 0xE9B8,\n\t0x52C9, 0xD8F5, 0x52CD, 0xCCCE, 0x52D2, 0xD7CD, 0x52D5, 0xD4D1,\t0x52D6, 0xE9ED, 0x52D8, 0xCAEB, 0x52D9, 0xD9E2, 0x52DB, 0xFDB2,\n\t0x52DD, 0xE3AD, 0x52DE, 0xD6CC, 0x52DF, 0xD9B4, 0x52E2, 0xE1A7,\t0x52E3, 0xEED3, 0x52E4, 0xD0C3, 0x52F3, 0xFDB3, 0x52F5, 0xD5E4,\n\t0x52F8, 0xCFE8, 0x52FA, 0xEDC3, 0x52FB, 0xD0B2, 0x52FE, 0xCEFE,\t0x52FF, 0xDAA8, 0x5305, 0xF8D0, 0x5308, 0xFDD6, 0x530D, 0xF8D1,\n\t0x530F, 0xF8D2, 0x5310, 0xDCD3, 0x5315, 0xDDE2, 0x5316, 0xFBF9,\t0x5317, 0xDDC1, 0x5319, 0xE3B5, 0x5320, 0xEDDD, 0x5321, 0xCEC4,\n\t0x5323, 0xCBA1, 0x532A, 0xDDE3, 0x532F, 0xFCDD, 0x5339, 0xF9AF,\t0x533F, 0xD2FB, 0x5340, 0xCFA1, 0x5341, 0xE4A8, 0x5343, 0xF4B6,\n\t0x5344, 0xECFE, 0x5347, 0xE3AE, 0x5348, 0xE7ED, 0x5349, 0xFDC1,\t0x534A, 0xDAE2, 0x534D, 0xD8B3, 0x5351, 0xDDE4, 0x5352, 0xF0EF,\n\t0x5353, 0xF6F1, 0x5354, 0xFAF0, 0x5357, 0xD1F5, 0x535A, 0xDACF,\t0x535C, 0xDCD4, 0x535E, 0xDCA6, 0x5360, 0xEFBF, 0x5366, 0xCECF,\n\t0x5368, 0xE0D9, 0x536F, 0xD9D6, 0x5370, 0xECD4, 0x5371, 0xEACB,\t0x5374, 0xCABF, 0x5375, 0xD5B0, 0x5377, 0xCFE9, 0x537D, 0xF1ED,\n\t0x537F, 0xCCCF, 0x5384, 0xE4F8, 0x5393, 0xE4ED, 0x5398, 0xD7D8,\t0x539A, 0xFDA7, 0x539F, 0xEAAB, 0x53A0, 0xF6B2, 0x53A5, 0xCFF0,\n\t0x53A6, 0xF9BD, 0x53AD, 0xE6F4, 0x53BB, 0xCBDB, 0x53C3, 0xF3D1,\t0x53C8, 0xE9D1, 0x53C9, 0xF3A9, 0x53CA, 0xD0E0, 0x53CB, 0xE9D2,\n\t0x53CD, 0xDAE3, 0x53D4, 0xE2D2, 0x53D6, 0xF6A2, 0x53D7, 0xE1F4,\t0x53DB, 0xDAE4, 0x53E1, 0xE7D5, 0x53E2, 0xF5BF, 0x53E3, 0xCFA2,\n\t0x53E4, 0xCDAF, 0x53E5, 0xCFA3, 0x53E9, 0xCDB0, 0x53EA, 0xF1FE,\t0x53EB, 0xD0A3, 0x53EC, 0xE1AF, 0x53ED, 0xF8A3, 0x53EF, 0xCAA6,\n\t0x53F0, 0xF7BB, 0x53F1, 0xF2EA, 0x53F2, 0xDEC8, 0x53F3, 0xE9D3,\t0x53F8, 0xDEC9, 0x5403, 0xFDDE, 0x5404, 0xCAC0, 0x5408, 0xF9EA,\n\t0x5409, 0xD1CE, 0x540A, 0xEED4, 0x540C, 0xD4D2, 0x540D, 0xD9A3,\t0x540E, 0xFDA8, 0x540F, 0xD7D9, 0x5410, 0xF7CE, 0x5411, 0xFABE,\n\t0x541B, 0xCFD6, 0x541D, 0xD7F0, 0x541F, 0xEBE1, 0x5420, 0xF8C5,\t0x5426, 0xDCFA, 0x5429, 0xDDC3, 0x542B, 0xF9DF, 0x5433, 0xE7EF,\n\t0x5438, 0xFDE5, 0x5439, 0xF6A3, 0x543B, 0xD9FC, 0x543C, 0xFDA9,\t0x543E, 0xE7EE, 0x5442, 0xD5E5, 0x5448, 0xEFD0, 0x544A, 0xCDB1,\n\t0x5451, 0xF7A2, 0x5468, 0xF1B2, 0x546A, 0xF1B1, 0x5471, 0xCDB2,\t0x5473, 0xDAAB, 0x5475, 0xCAA7, 0x547B, 0xE3E2, 0x547C, 0xFBBC,\n\t0x547D, 0xD9A4, 0x5480, 0xEEBA, 0x5486, 0xF8D3, 0x548C, 0xFBFA,\t0x548E, 0xCFA4, 0x5490, 0xDCFB, 0x54A4, 0xF6E3, 0x54A8, 0xEDAA,\n\t0x54AB, 0xF2A1, 0x54AC, 0xCEE1, 0x54B3, 0xFAA6, 0x54B8, 0xF9E0,\t0x54BD, 0xECD6, 0x54C0, 0xE4EE, 0x54C1, 0xF9A1, 0x54C4, 0xFBEF,\n\t0x54C8, 0xF9EB, 0x54C9, 0xEEA3, 0x54E1, 0xEAAC, 0x54E5, 0xCAA8,\t0x54E8, 0xF4FA, 0x54ED, 0xCDD6, 0x54EE, 0xFCF6, 0x54F2, 0xF4C9,\n\t0x54FA, 0xF8D4, 0x5504, 0xF8A6, 0x5506, 0xDECA, 0x5507, 0xF2C6,\t0x550E, 0xD7DA, 0x5510, 0xD3D0, 0x551C, 0xD8C5, 0x552F, 0xEAE6,\n\t0x5531, 0xF3DD, 0x5535, 0xE4DA, 0x553E, 0xF6E4, 0x5544, 0xF6F2,\t0x5546, 0xDFC2, 0x554F, 0xD9FD, 0x5553, 0xCCF6, 0x5556, 0xD3BA,\n\t0x555E, 0xE4AF, 0x5563, 0xF9E1, 0x557C, 0xF0A6, 0x5580, 0xCBD3,\t0x5584, 0xE0BC, 0x5586, 0xF4CA, 0x5587, 0xD4FA, 0x5589, 0xFDAA,\n\t0x558A, 0xF9E2, 0x5598, 0xF4B7, 0x5599, 0xFDC2, 0x559A, 0xFCB0,\t0x559C, 0xFDEC, 0x559D, 0xCAE2, 0x55A7, 0xFDBD, 0x55A9, 0xEAE7,\n\t0x55AA, 0xDFC3, 0x55AB, 0xD1D2, 0x55AC, 0xCEE2, 0x55AE, 0xD3A4,\t0x55C5, 0xFDAB, 0x55C7, 0xDFE0, 0x55D4, 0xF2C7, 0x55DA, 0xE7F0,\n\t0x55DC, 0xD0EE, 0x55DF, 0xF3AA, 0x55E3, 0xDECB, 0x55E4, 0xF6B8,\t0x55FD, 0xE1F5, 0x55FE, 0xF1B3, 0x5606, 0xF7A3, 0x5609, 0xCAA9,\n\t0x5614, 0xCFA5, 0x5617, 0xDFC4, 0x562F, 0xE1B0, 0x5632, 0xF0BF,\t0x5634, 0xF6A4, 0x5636, 0xE3B6, 0x5653, 0xFAC6, 0x5668, 0xD0EF,\n\t0x566B, 0xFDED, 0x5674, 0xDDC4, 0x5686, 0xFCF7, 0x56A5, 0xE6BF,\t0x56AC, 0xDEAD, 0x56AE, 0xFABF, 0x56B4, 0xE5F1, 0x56BC, 0xEDC4,\n\t0x56CA, 0xD2A5, 0x56CD, 0xFDEE, 0x56D1, 0xF5B6, 0x56DA, 0xE1F6,\t0x56DB, 0xDECC, 0x56DE, 0xFCDE, 0x56E0, 0xECD7, 0x56F0, 0xCDDD,\n\t0x56F9, 0xD6B7, 0x56FA, 0xCDB3, 0x5703, 0xF8D5, 0x5704, 0xE5D8,\t0x5708, 0xCFEA, 0x570B, 0xCFD0, 0x570D, 0xEACC, 0x5712, 0xEAAE,\n\t0x5713, 0xEAAD, 0x5716, 0xD3F1, 0x5718, 0xD3A5, 0x571F, 0xF7CF,\t0x5728, 0xEEA4, 0x572D, 0xD0A4, 0x5730, 0xF2A2, 0x573B, 0xD0F0,\n\t0x5740, 0xF2A3, 0x5742, 0xF7F8, 0x5747, 0xD0B3, 0x574A, 0xDBA9,\t0x574D, 0xD3BB, 0x574E, 0xCAEC, 0x5750, 0xF1A6, 0x5751, 0xCBD5,\n\t0x5761, 0xF7E7, 0x5764, 0xCDDE, 0x5766, 0xF7A4, 0x576A, 0xF8C0,\t0x576E, 0xD3DD, 0x5770, 0xCCD0, 0x5775, 0xCFA6, 0x577C, 0xF6F3,\n\t0x5782, 0xE1F7, 0x5788, 0xD3DC, 0x578B, 0xFAFE, 0x5793, 0xFAA7,\t0x57A0, 0xEBD9, 0x57A2, 0xCFA7, 0x57A3, 0xEAAF, 0x57C3, 0xE4EF,\n\t0x57C7, 0xE9B9, 0x57C8, 0xF1D8, 0x57CB, 0xD8D8, 0x57CE, 0xE0F2,\t0x57DF, 0xE6B4, 0x57E0, 0xDCFC, 0x57F0, 0xF3F1, 0x57F4, 0xE3D0,\n\t0x57F7, 0xF2FB, 0x57F9, 0xDBC6, 0x57FA, 0xD0F1, 0x57FC, 0xD0F2,\t0x5800, 0xCFDC, 0x5802, 0xD3D1, 0x5805, 0xCCB1, 0x5806, 0xF7D8,\n\t0x5808, 0xCBA8, 0x5809, 0xEBBC, 0x580A, 0xE4BE, 0x581E, 0xF4DC,\t0x5821, 0xDCC2, 0x5824, 0xF0A7, 0x5827, 0xE6C0, 0x582A, 0xCAED,\n\t0x582F, 0xE8EB, 0x5830, 0xE5E8, 0x5831, 0xDCC3, 0x5834, 0xEDDE,\t0x5835, 0xD3F2, 0x583A, 0xCCF7, 0x584A, 0xCED4, 0x584B, 0xE7AB,\n\t0x584F, 0xCBC3, 0x5851, 0xE1B1, 0x5854, 0xF7B2, 0x5857, 0xD3F3,\t0x5858, 0xD3D2, 0x585A, 0xF5C0, 0x585E, 0xDFDD, 0x5861, 0xEEF3,\n\t0x5862, 0xE7F1, 0x5864, 0xFDB4, 0x5875, 0xF2C8, 0x5879, 0xF3D2,\t0x587C, 0xEEF4, 0x587E, 0xE2D3, 0x5883, 0xCCD1, 0x5885, 0xDFEA,\n\t0x5889, 0xE9BA, 0x5893, 0xD9D7, 0x589C, 0xF5CD, 0x589E, 0xF1F2,\t0x589F, 0xFAC7, 0x58A8, 0xD9F8, 0x58A9, 0xD4C2, 0x58AE, 0xF6E5,\n\t0x58B3, 0xDDC5, 0x58BA, 0xE7F2, 0x58BB, 0xEDDF, 0x58BE, 0xCACB,\t0x58C1, 0xDBFA, 0x58C5, 0xE8B5, 0x58C7, 0xD3A6, 0x58CE, 0xFDB5,\n\t0x58D1, 0xF9C9, 0x58D3, 0xE4E2, 0x58D5, 0xFBBD, 0x58D8, 0xD7A4,\t0x58D9, 0xCEC5, 0x58DE, 0xCED5, 0x58DF, 0xD6E6, 0x58E4, 0xE5BD,\n\t0x58EB, 0xDECD, 0x58EC, 0xECF3, 0x58EF, 0xEDE0, 0x58F9, 0xECEC,\t0x58FA, 0xFBBE, 0x58FB, 0xDFEB, 0x58FD, 0xE1F8, 0x590F, 0xF9BE,\n\t0x5914, 0xD0F3, 0x5915, 0xE0AA, 0x5916, 0xE8E2, 0x5919, 0xE2D4,\t0x591A, 0xD2FD, 0x591C, 0xE5A8, 0x5922, 0xD9D3, 0x5927, 0xD3DE,\n\t0x5929, 0xF4B8, 0x592A, 0xF7BC, 0x592B, 0xDCFD, 0x592D, 0xE8EC,\t0x592E, 0xE4E7, 0x5931, 0xE3F7, 0x5937, 0xECA8, 0x593E, 0xFAF1,\n\t0x5944, 0xE5F2, 0x5947, 0xD0F4, 0x5948, 0xD2AF, 0x5949, 0xDCE5,\t0x594E, 0xD0A5, 0x594F, 0xF1B4, 0x5950, 0xFCB1, 0x5951, 0xCCF8,\n\t0x5954, 0xDDC6, 0x5955, 0xFAD1, 0x5957, 0xF7DF, 0x595A, 0xFAA8,\t0x5960, 0xEEF5, 0x5962, 0xDECE, 0x5967, 0xE7F3, 0x596A, 0xF7AC,\n\t0x596B, 0xEBC4, 0x596C, 0xEDE1, 0x596D, 0xE0AB, 0x596E, 0xDDC7,\t0x5973, 0xD2B3, 0x5974, 0xD2BF, 0x5978, 0xCACC, 0x597D, 0xFBBF,\n\t0x5982, 0xE5FD, 0x5983, 0xDDE5, 0x5984, 0xD8CD, 0x598A, 0xECF4,\t0x5993, 0xD0F5, 0x5996, 0xE8ED, 0x5997, 0xD0D2, 0x5999, 0xD9D8,\n\t0x59A5, 0xF6E6, 0x59A8, 0xDBAA, 0x59AC, 0xF7E0, 0x59B9, 0xD8D9,\t0x59BB, 0xF4A3, 0x59BE, 0xF4DD, 0x59C3, 0xEFD1, 0x59C6, 0xD9B5,\n\t0x59C9, 0xEDAB, 0x59CB, 0xE3B7, 0x59D0, 0xEEBB, 0x59D1, 0xCDB4,\t0x59D3, 0xE0F3, 0x59D4, 0xEACD, 0x59D9, 0xECF5, 0x59DA, 0xE8EE,\n\t0x59DC, 0xCBA9, 0x59DD, 0xF1AF, 0x59E6, 0xCACD, 0x59E8, 0xECA9,\t0x59EA, 0xF2EB, 0x59EC, 0xFDEF, 0x59EE, 0xF9F3, 0x59F8, 0xE6C1,\n\t0x59FB, 0xECD8, 0x59FF, 0xEDAC, 0x5A01, 0xEACE, 0x5A03, 0xE8DF,\t0x5A11, 0xDECF, 0x5A18, 0xD2A6, 0x5A1B, 0xE7F4, 0x5A1C, 0xD1D6,\n\t0x5A1F, 0xE6C2, 0x5A20, 0xE3E3, 0x5A25, 0xE4B0, 0x5A29, 0xD8B4,\t0x5A36, 0xF6A5, 0x5A3C, 0xF3DE, 0x5A41, 0xD7A5, 0x5A46, 0xF7E8,\n\t0x5A49, 0xE8C6, 0x5A5A, 0xFBE6, 0x5A62, 0xDDE6, 0x5A66, 0xDCFE,\t0x5A92, 0xD8DA, 0x5A9A, 0xDAAC, 0x5A9B, 0xEAB0, 0x5AA4, 0xE3B8,\n\t0x5AC1, 0xCAAA, 0x5AC2, 0xE1F9, 0x5AC4, 0xEAB1, 0x5AC9, 0xF2EC,\t0x5ACC, 0xFAEE, 0x5AE1, 0xEED5, 0x5AE6, 0xF9F4, 0x5AE9, 0xD2EC,\n\t0x5B05, 0xFBFB, 0x5B09, 0xFDF0, 0x5B0B, 0xE0BD, 0x5B0C, 0xCEE3,\t0x5B16, 0xF8C6, 0x5B2A, 0xDEAE, 0x5B40, 0xDFC5, 0x5B43, 0xE5BE,\n\t0x5B50, 0xEDAD, 0x5B51, 0xFAEA, 0x5B54, 0xCDEE, 0x5B55, 0xEDA6,\t0x5B57, 0xEDAE, 0x5B58, 0xF0ED, 0x5B5A, 0xDDA1, 0x5B5C, 0xEDAF,\n\t0x5B5D, 0xFCF8, 0x5B5F, 0xD8EB, 0x5B63, 0xCCF9, 0x5B64, 0xCDB5,\t0x5B69, 0xFAA9, 0x5B6B, 0xE1DD, 0x5B70, 0xE2D5, 0x5B71, 0xEDCF,\n\t0x5B75, 0xDDA2, 0x5B78, 0xF9CA, 0x5B7A, 0xEAE8, 0x5B7C, 0xE5ED,\t0x5B85, 0xD3EB, 0x5B87, 0xE9D4, 0x5B88, 0xE1FA, 0x5B89, 0xE4CC,\n\t0x5B8B, 0xE1E4, 0x5B8C, 0xE8C7, 0x5B8F, 0xCEDB, 0x5B93, 0xDCD5,\t0x5B95, 0xF7B5, 0x5B96, 0xFCF3, 0x5B97, 0xF0F3, 0x5B98, 0xCEAF,\n\t0x5B99, 0xF1B5, 0x5B9A, 0xEFD2, 0x5B9B, 0xE8C8, 0x5B9C, 0xEBF1,\t0x5BA2, 0xCBD4, 0x5BA3, 0xE0BE, 0x5BA4, 0xE3F8, 0x5BA5, 0xEAE9,\n\t0x5BA6, 0xFCB2, 0x5BAC, 0xE0F4, 0x5BAE, 0xCFE0, 0x5BB0, 0xEEA5,\t0x5BB3, 0xFAAA, 0x5BB4, 0xE6C3, 0x5BB5, 0xE1B2, 0x5BB6, 0xCAAB,\n\t0x5BB8, 0xE3E4, 0x5BB9, 0xE9BB, 0x5BBF, 0xE2D6, 0x5BC0, 0xF3F2,\t0x5BC2, 0xEED6, 0x5BC3, 0xEAB2, 0x5BC4, 0xD0F6, 0x5BC5, 0xECD9,\n\t0x5BC6, 0xDACB, 0x5BC7, 0xCFA8, 0x5BCC, 0xDDA3, 0x5BD0, 0xD8DB,\t0x5BD2, 0xF9CE, 0x5BD3, 0xE9D5, 0x5BD4, 0xE3D1, 0x5BD7, 0xD2BC,\n\t0x5BDE, 0xD8AC, 0x5BDF, 0xF3CC, 0x5BE1, 0xCDFB, 0x5BE2, 0xF6D6,\t0x5BE4, 0xE7F5, 0x5BE5, 0xE8EF, 0x5BE6, 0xE3F9, 0x5BE7, 0xD2BB,\n\t0x5BE8, 0xF3F3, 0x5BE9, 0xE3FB, 0x5BEB, 0xDED0, 0x5BEC, 0xCEB0,\t0x5BEE, 0xD6F7, 0x5BEF, 0xF1D9, 0x5BF5, 0xF5C1, 0x5BF6, 0xDCC4,\n\t0x5BF8, 0xF5BB, 0x5BFA, 0xDED1, 0x5C01, 0xDCE6, 0x5C04, 0xDED2,\t0x5C07, 0xEDE2, 0x5C08, 0xEEF6, 0x5C09, 0xEACF, 0x5C0A, 0xF0EE,\n\t0x5C0B, 0xE3FC, 0x5C0D, 0xD3DF, 0x5C0E, 0xD3F4, 0x5C0F, 0xE1B3,\t0x5C11, 0xE1B4, 0x5C16, 0xF4D3, 0x5C19, 0xDFC6, 0x5C24, 0xE9D6,\n\t0x5C28, 0xDBAB, 0x5C31, 0xF6A6, 0x5C38, 0xE3B9, 0x5C39, 0xEBC5,\t0x5C3A, 0xF4A9, 0x5C3B, 0xCDB6, 0x5C3C, 0xD2F9, 0x5C3E, 0xDAAD,\n\t0x5C3F, 0xD2E3, 0x5C40, 0xCFD1, 0x5C45, 0xCBDC, 0x5C46, 0xCCFA,\t0x5C48, 0xCFDD, 0x5C4B, 0xE8A9, 0x5C4D, 0xE3BB, 0x5C4E, 0xE3BA,\n\t0x5C51, 0xE0DA, 0x5C55, 0xEEF7, 0x5C5B, 0xDCB3, 0x5C60, 0xD3F5,\t0x5C62, 0xD7A6, 0x5C64, 0xF6B5, 0x5C65, 0xD7DB, 0x5C6C, 0xE1D5,\n\t0x5C6F, 0xD4EA, 0x5C71, 0xDFA3, 0x5C79, 0xFDDF, 0x5C90, 0xD0F7,\t0x5C91, 0xEDD4, 0x5CA1, 0xCBAA, 0x5CA9, 0xE4DB, 0x5CAB, 0xE1FB,\n\t0x5CAC, 0xCBA2, 0x5CB1, 0xD3E0, 0x5CB3, 0xE4BF, 0x5CB5, 0xFBC0,\t0x5CB7, 0xDABE, 0x5CB8, 0xE4CD, 0x5CBA, 0xD6B9, 0x5CBE, 0xEFC0,\n\t0x5CC0, 0xE1FC, 0x5CD9, 0xF6B9, 0x5CE0, 0xDFC7, 0x5CE8, 0xE4B1,\t0x5CEF, 0xDCE7, 0x5CF0, 0xDCE8, 0x5CF4, 0xFAD6, 0x5CF6, 0xD3F6,\n\t0x5CFB, 0xF1DA, 0x5CFD, 0xFAF2, 0x5D07, 0xE2FD, 0x5D0D, 0xD5CF,\t0x5D0E, 0xD0F8, 0x5D11, 0xCDDF, 0x5D14, 0xF5CB, 0x5D16, 0xE4F0,\n\t0x5D17, 0xCBAB, 0x5D19, 0xD7C4, 0x5D27, 0xE2FE, 0x5D29, 0xDDDA,\t0x5D4B, 0xDAAE, 0x5D4C, 0xCAEE, 0x5D50, 0xD5B9, 0x5D69, 0xE3A1,\n\t0x5D6C, 0xE8E3, 0x5D6F, 0xF3AB, 0x5D87, 0xCFA9, 0x5D8B, 0xD3F7,\t0x5D9D, 0xD4F1, 0x5DA0, 0xCEE4, 0x5DA2, 0xE8F2, 0x5DAA, 0xE5F5,\n\t0x5DB8, 0xE7AE, 0x5DBA, 0xD6BA, 0x5DBC, 0xDFEC, 0x5DBD, 0xE4C0,\t0x5DCD, 0xE8E4, 0x5DD2, 0xD8B5, 0x5DD6, 0xE4DC, 0x5DDD, 0xF4B9,\n\t0x5DDE, 0xF1B6, 0x5DE1, 0xE2DE, 0x5DE2, 0xE1B5, 0x5DE5, 0xCDEF,\t0x5DE6, 0xF1A7, 0x5DE7, 0xCEE5, 0x5DE8, 0xCBDD, 0x5DEB, 0xD9E3,\n\t0x5DEE, 0xF3AC, 0x5DF1, 0xD0F9, 0x5DF2, 0xECAB, 0x5DF3, 0xDED3,\t0x5DF4, 0xF7E9, 0x5DF7, 0xF9F5, 0x5DFD, 0xE1DE, 0x5DFE, 0xCBEE,\n\t0x5E02, 0xE3BC, 0x5E03, 0xF8D6, 0x5E06, 0xDBEE, 0x5E0C, 0xFDF1,\t0x5E11, 0xF7B6, 0x5E16, 0xF4DE, 0x5E19, 0xF2ED, 0x5E1B, 0xDBD9,\n\t0x5E1D, 0xF0A8, 0x5E25, 0xE1FD, 0x5E2B, 0xDED4, 0x5E2D, 0xE0AC,\t0x5E33, 0xEDE3, 0x5E36, 0xD3E1, 0x5E38, 0xDFC8, 0x5E3D, 0xD9B6,\n\t0x5E3F, 0xFDAC, 0x5E40, 0xEFD3, 0x5E44, 0xE4C1, 0x5E45, 0xF8EB,\t0x5E47, 0xDBAC, 0x5E4C, 0xFCC6, 0x5E55, 0xD8AD, 0x5E5F, 0xF6BA,\n\t0x5E61, 0xDBDF, 0x5E62, 0xD3D3, 0x5E63, 0xF8C7, 0x5E72, 0xCACE,\t0x5E73, 0xF8C1, 0x5E74, 0xD2B4, 0x5E77, 0xDCB4, 0x5E78, 0xFAB9,\n\t0x5E79, 0xCACF, 0x5E7B, 0xFCB3, 0x5E7C, 0xEAEA, 0x5E7D, 0xEAEB,\t0x5E7E, 0xD0FA, 0x5E84, 0xEDE4, 0x5E87, 0xDDE7, 0x5E8A, 0xDFC9,\n\t0x5E8F, 0xDFED, 0x5E95, 0xEEBC, 0x5E97, 0xEFC1, 0x5E9A, 0xCCD2,\t0x5E9C, 0xDDA4, 0x5EA0, 0xDFCA, 0x5EA6, 0xD3F8, 0x5EA7, 0xF1A8,\n\t0x5EAB, 0xCDB7, 0x5EAD, 0xEFD4, 0x5EB5, 0xE4DD, 0x5EB6, 0xDFEE,\t0x5EB7, 0xCBAC, 0x5EB8, 0xE9BC, 0x5EBE, 0xEAEC, 0x5EC2, 0xDFCB,\n\t0x5EC8, 0xF9BF, 0x5EC9, 0xD6AF, 0x5ECA, 0xD5C6, 0x5ED0, 0xCFAA,\t0x5ED3, 0xCEA9, 0x5ED6, 0xD6F8, 0x5EDA, 0xF1B7, 0x5EDB, 0xEEF8,\n\t0x5EDF, 0xD9D9, 0x5EE0, 0xF3DF, 0x5EE2, 0xF8C8, 0x5EE3, 0xCEC6,\t0x5EEC, 0xD5E6, 0x5EF3, 0xF4E6, 0x5EF6, 0xE6C5, 0x5EF7, 0xEFD5,\n\t0x5EFA, 0xCBEF, 0x5EFB, 0xFCDF, 0x5F01, 0xDCA7, 0x5F04, 0xD6E7,\t0x5F0A, 0xF8C9, 0x5F0F, 0xE3D2, 0x5F11, 0xE3BD, 0x5F13, 0xCFE1,\n\t0x5F14, 0xF0C0, 0x5F15, 0xECDA, 0x5F17, 0xDDD7, 0x5F18, 0xFBF0,\t0x5F1B, 0xECAC, 0x5F1F, 0xF0A9, 0x5F26, 0xFAD7, 0x5F27, 0xFBC1,\n\t0x5F29, 0xD2C0, 0x5F31, 0xE5B0, 0x5F35, 0xEDE5, 0x5F3A, 0xCBAD,\t0x5F3C, 0xF9B0, 0x5F48, 0xF7A5, 0x5F4A, 0xCBAE, 0x5F4C, 0xDAAF,\n\t0x5F4E, 0xD8B6, 0x5F56, 0xD3A7, 0x5F57, 0xFBB2, 0x5F59, 0xFDC4,\t0x5F5B, 0xECAD, 0x5F62, 0xFBA1, 0x5F66, 0xE5E9, 0x5F67, 0xE9EE,\n\t0x5F69, 0xF3F4, 0x5F6A, 0xF8F3, 0x5F6B, 0xF0C1, 0x5F6C, 0xDEAF,\t0x5F6D, 0xF8B0, 0x5F70, 0xF3E0, 0x5F71, 0xE7AF, 0x5F77, 0xDBAD,\n\t0x5F79, 0xE6B5, 0x5F7C, 0xF9A8, 0x5F7F, 0xDDD8, 0x5F80, 0xE8D9,\t0x5F81, 0xEFD6, 0x5F85, 0xD3E2, 0x5F87, 0xE2DF, 0x5F8A, 0xFCE0,\n\t0x5F8B, 0xD7C8, 0x5F8C, 0xFDAD, 0x5F90, 0xDFEF, 0x5F91, 0xCCD3,\t0x5F92, 0xD3F9, 0x5F97, 0xD4F0, 0x5F98, 0xDBC7, 0x5F99, 0xDED5,\n\t0x5F9E, 0xF0F4, 0x5FA0, 0xD5D0, 0x5FA1, 0xE5D9, 0x5FA8, 0xFCC7,\t0x5FA9, 0xDCD6, 0x5FAA, 0xE2E0, 0x5FAE, 0xDAB0, 0x5FB5, 0xF3A3,\n\t0x5FB7, 0xD3EC, 0x5FB9, 0xF4CB, 0x5FBD, 0xFDC5, 0x5FC3, 0xE3FD,\t0x5FC5, 0xF9B1, 0x5FCC, 0xD0FB, 0x5FCD, 0xECDB, 0x5FD6, 0xF5BC,\n\t0x5FD7, 0xF2A4, 0x5FD8, 0xD8CE, 0x5FD9, 0xD8CF, 0x5FE0, 0xF5F7,\t0x5FEB, 0xF6E1, 0x5FF5, 0xD2B7, 0x5FFD, 0xFBEC, 0x5FFF, 0xDDC8,\n\t0x600F, 0xE4E8, 0x6012, 0xD2C1, 0x6016, 0xF8D7, 0x601C, 0xD6BB,\t0x601D, 0xDED6, 0x6020, 0xF7BD, 0x6021, 0xECAE, 0x6025, 0xD0E1,\n\t0x6027, 0xE0F5, 0x6028, 0xEAB3, 0x602A, 0xCED6, 0x602F, 0xCCA5,\t0x6041, 0xECF6, 0x6042, 0xE2E1, 0x6043, 0xE3BE, 0x604D, 0xFCC8,\n\t0x6050, 0xCDF0, 0x6052, 0xF9F6, 0x6055, 0xDFF0, 0x6059, 0xE5BF,\t0x605D, 0xCEBF, 0x6062, 0xFCE1, 0x6063, 0xEDB0, 0x6064, 0xFDD1,\n\t0x6065, 0xF6BB, 0x6068, 0xF9CF, 0x6069, 0xEBDA, 0x606A, 0xCAC1,\t0x606C, 0xD2B8, 0x606D, 0xCDF1, 0x606F, 0xE3D3, 0x6070, 0xFDE6,\n\t0x6085, 0xE6ED, 0x6089, 0xE3FA, 0x608C, 0xF0AA, 0x608D, 0xF9D0,\t0x6094, 0xFCE2, 0x6096, 0xF8A7, 0x609A, 0xE1E5, 0x609B, 0xEEF9,\n\t0x609F, 0xE7F6, 0x60A0, 0xEAED, 0x60A3, 0xFCB4, 0x60A4, 0xF5C2,\t0x60A7, 0xD7DC, 0x60B0, 0xF0F5, 0x60B2, 0xDDE8, 0x60B3, 0xD3ED,\n\t0x60B4, 0xF5FC, 0x60B6, 0xDABF, 0x60B8, 0xCCFB, 0x60BC, 0xD3FA,\t0x60BD, 0xF4A4, 0x60C5, 0xEFD7, 0x60C7, 0xD4C3, 0x60D1, 0xFBE3,\n\t0x60DA, 0xFBED, 0x60DC, 0xE0AD, 0x60DF, 0xEAEE, 0x60E0, 0xFBB3,\t0x60E1, 0xE4C2, 0x60F0, 0xF6E7, 0x60F1, 0xD2DD, 0x60F3, 0xDFCC,\n\t0x60F6, 0xFCC9, 0x60F9, 0xE5A9, 0x60FA, 0xE0F6, 0x60FB, 0xF6B3,\t0x6101, 0xE1FE, 0x6106, 0xCBF0, 0x6108, 0xEAEF, 0x6109, 0xEAF0,\n\t0x610D, 0xDAC0, 0x610E, 0xF8B4, 0x610F, 0xEBF2, 0x6115, 0xE4C3,\t0x611A, 0xE9D7, 0x611B, 0xE4F1, 0x611F, 0xCAEF, 0x6127, 0xCED7,\n\t0x6130, 0xFCCA, 0x6134, 0xF3E1, 0x6137, 0xCBC4, 0x613C, 0xE3E5,\t0x613E, 0xCBC5, 0x613F, 0xEAB4, 0x6142, 0xE9BD, 0x6144, 0xD7C9,\n\t0x6147, 0xEBDB, 0x6148, 0xEDB1, 0x614A, 0xCCC3, 0x614B, 0xF7BE,\t0x614C, 0xFCCB, 0x6153, 0xF8F4, 0x6155, 0xD9B7, 0x6158, 0xF3D3,\n\t0x6159, 0xF3D4, 0x615D, 0xF7E4, 0x615F, 0xF7D1, 0x6162, 0xD8B7,\t0x6163, 0xCEB1, 0x6164, 0xCAC2, 0x6167, 0xFBB4, 0x6168, 0xCBC6,\n\t0x616B, 0xF0F6, 0x616E, 0xD5E7, 0x6170, 0xEAD0, 0x6176, 0xCCD4,\t0x6177, 0xCBAF, 0x617D, 0xF4AA, 0x617E, 0xE9AF, 0x6181, 0xF5C3,\n\t0x6182, 0xE9D8, 0x618A, 0xDDE9, 0x618E, 0xF1F3, 0x6190, 0xD5FB,\t0x6191, 0xDEBB, 0x6194, 0xF4FB, 0x6198, 0xFDF3, 0x6199, 0xFDF2,\n\t0x619A, 0xF7A6, 0x61A4, 0xDDC9, 0x61A7, 0xD4D3, 0x61A9, 0xCCA8,\t0x61AB, 0xDAC1, 0x61AC, 0xCCD5, 0x61AE, 0xD9E4, 0x61B2, 0xFACA,\n\t0x61B6, 0xE5E3, 0x61BA, 0xD3BC, 0x61BE, 0xCAF0, 0x61C3, 0xD0C4,\t0x61C7, 0xCAD0, 0x61C8, 0xFAAB, 0x61C9, 0xEBEB, 0x61CA, 0xE7F8,\n\t0x61CB, 0xD9E5, 0x61E6, 0xD1D7, 0x61F2, 0xF3A4, 0x61F6, 0xD4FB,\t0x61F7, 0xFCE3, 0x61F8, 0xFAD8, 0x61FA, 0xF3D5, 0x61FC, 0xCFAB,\n\t0x61FF, 0xEBF3, 0x6200, 0xD5FC, 0x6207, 0xD3D4, 0x6208, 0xCDFC,\t0x620A, 0xD9E6, 0x620C, 0xE2F9, 0x620D, 0xE2A1, 0x620E, 0xEBD4,\n\t0x6210, 0xE0F7, 0x6211, 0xE4B2, 0x6212, 0xCCFC, 0x6216, 0xFBE4,\t0x621A, 0xF4AB, 0x621F, 0xD0BD, 0x6221, 0xCAF1, 0x622A, 0xEFB8,\n\t0x622E, 0xD7C0, 0x6230, 0xEEFA, 0x6231, 0xFDF4, 0x6234, 0xD3E3,\t0x6236, 0xFBC2, 0x623E, 0xD5E8, 0x623F, 0xDBAE, 0x6240, 0xE1B6,\n\t0x6241, 0xF8B7, 0x6247, 0xE0BF, 0x6248, 0xFBC3, 0x6249, 0xDDEA,\t0x624B, 0xE2A2, 0x624D, 0xEEA6, 0x6253, 0xF6E8, 0x6258, 0xF6F5,\n\t0x626E, 0xDDCA, 0x6271, 0xD0E2, 0x6276, 0xDDA6, 0x6279, 0xDDEB,\t0x627C, 0xE4F9, 0x627F, 0xE3AF, 0x6280, 0xD0FC, 0x6284, 0xF4FC,\n\t0x6289, 0xCCBC, 0x628A, 0xF7EA, 0x6291, 0xE5E4, 0x6292, 0xDFF1,\t0x6295, 0xF7E1, 0x6297, 0xF9F7, 0x6298, 0xEFB9, 0x629B, 0xF8D8,\n\t0x62AB, 0xF9A9, 0x62B1, 0xF8D9, 0x62B5, 0xEEBD, 0x62B9, 0xD8C6,\t0x62BC, 0xE4E3, 0x62BD, 0xF5CE, 0x62C2, 0xDDD9, 0x62C7, 0xD9E7,\n\t0x62C8, 0xD2B9, 0x62C9, 0xD5C3, 0x62CC, 0xDAE5, 0x62CD, 0xDAD0,\t0x62CF, 0xD1D9, 0x62D0, 0xCED8, 0x62D2, 0xCBDE, 0x62D3, 0xF4AC,\n\t0x62D4, 0xDAFB, 0x62D6, 0xF6E9, 0x62D7, 0xE8F3, 0x62D8, 0xCFAC,\t0x62D9, 0xF0F0, 0x62DB, 0xF4FD, 0x62DC, 0xDBC8, 0x62EC, 0xCEC0,\n\t0x62ED, 0xE3D4, 0x62EE, 0xD1CF, 0x62EF, 0xF1F5, 0x62F1, 0xCDF2,\t0x62F3, 0xCFEB, 0x62F7, 0xCDB8, 0x62FE, 0xE3A6, 0x62FF, 0xD1DA,\n\t0x6301, 0xF2A5, 0x6307, 0xF2A6, 0x6309, 0xE4CE, 0x6311, 0xD3FB,\t0x632B, 0xF1A9, 0x632F, 0xF2C9, 0x633A, 0xEFD8, 0x633B, 0xE6C9,\n\t0x633D, 0xD8B8, 0x633E, 0xFAF3, 0x6349, 0xF3B5, 0x634C, 0xF8A4,\t0x634F, 0xD1F3, 0x6350, 0xE6C8, 0x6355, 0xF8DA, 0x6367, 0xDCE9,\n\t0x6368, 0xDED7, 0x636E, 0xCBDF, 0x6372, 0xCFEC, 0x6377, 0xF4DF,\t0x637A, 0xD1F4, 0x637B, 0xD2BA, 0x637F, 0xDFF2, 0x6383, 0xE1B7,\n\t0x6388, 0xE2A3, 0x6389, 0xD3FC, 0x638C, 0xEDE6, 0x6392, 0xDBC9,\t0x6396, 0xE4FA, 0x6398, 0xCFDE, 0x639B, 0xCED0, 0x63A0, 0xD5D3,\n\t0x63A1, 0xF3F5, 0x63A2, 0xF7AE, 0x63A5, 0xEFC8, 0x63A7, 0xCDF3,\t0x63A8, 0xF5CF, 0x63A9, 0xE5F3, 0x63AA, 0xF0C2, 0x63C0, 0xCAD1,\n\t0x63C4, 0xEAF1, 0x63C6, 0xD0A6, 0x63CF, 0xD9DA, 0x63D0, 0xF0AB,\t0x63D6, 0xEBE7, 0x63DA, 0xE5C0, 0x63DB, 0xFCB5, 0x63E1, 0xE4C4,\n\t0x63ED, 0xCCA9, 0x63EE, 0xFDC6, 0x63F4, 0xEAB5, 0x63F6, 0xE5AA,\t0x63F7, 0xDFBA, 0x640D, 0xE1DF, 0x640F, 0xDAD1, 0x6414, 0xE1B8,\n\t0x6416, 0xE8F4, 0x6417, 0xD3FD, 0x641C, 0xE2A4, 0x6422, 0xF2CA,\t0x642C, 0xDAE6, 0x642D, 0xF7B3, 0x643A, 0xFDCD, 0x643E, 0xF3B6,\n\t0x6458, 0xEED7, 0x6460, 0xF5C4, 0x6469, 0xD8A4, 0x646F, 0xF2A7,\t0x6478, 0xD9B8, 0x6479, 0xD9B9, 0x647A, 0xEFC9, 0x6488, 0xD6CE,\n\t0x6491, 0xF7CB, 0x6492, 0xDFAE, 0x6493, 0xE8F5, 0x649A, 0xD2B5,\t0x649E, 0xD3D5, 0x64A4, 0xF4CC, 0x64A5, 0xDAFC, 0x64AB, 0xD9E8,\n\t0x64AD, 0xF7EB, 0x64AE, 0xF5C9, 0x64B0, 0xF3BC, 0x64B2, 0xDAD2,\t0x64BB, 0xD3B5, 0x64C1, 0xE8B6, 0x64C4, 0xD6CF, 0x64C5, 0xF4BA,\n\t0x64C7, 0xF7C9, 0x64CA, 0xCCAA, 0x64CD, 0xF0C3, 0x64CE, 0xCCD6,\t0x64D2, 0xD0D3, 0x64D4, 0xD3BD, 0x64D8, 0xDBFB, 0x64DA, 0xCBE0,\n\t0x64E1, 0xD3E4, 0x64E2, 0xF6F7, 0x64E5, 0xD5BA, 0x64E6, 0xF3CD,\t0x64E7, 0xCBE1, 0x64EC, 0xEBF4, 0x64F2, 0xF4AD, 0x64F4, 0xFCAA,\n\t0x64FA, 0xF7EC, 0x64FE, 0xE8F6, 0x6500, 0xDAE7, 0x6504, 0xF7CC,\t0x6518, 0xE5C1, 0x651D, 0xE0EE, 0x6523, 0xD5FD, 0x652A, 0xCEE6,\n\t0x652B, 0xFCAB, 0x652C, 0xD5BB, 0x652F, 0xF2A8, 0x6536, 0xE2A5,\t0x6537, 0xCDB9, 0x6538, 0xEAF2, 0x6539, 0xCBC7, 0x653B, 0xCDF4,\n\t0x653E, 0xDBAF, 0x653F, 0xEFD9, 0x6545, 0xCDBA, 0x6548, 0xFCF9,\t0x654D, 0xDFF3, 0x654E, 0xCEE7, 0x654F, 0xDAC2, 0x6551, 0xCFAD,\n\t0x6556, 0xE7F9, 0x6557, 0xF8A8, 0x655E, 0xF3E2, 0x6562, 0xCAF2,\t0x6563, 0xDFA4, 0x6566, 0xD4C4, 0x656C, 0xCCD7, 0x656D, 0xE5C2,\n\t0x6572, 0xCDBB, 0x6574, 0xEFDA, 0x6575, 0xEED8, 0x6577, 0xDDA7,\t0x6578, 0xE2A6, 0x657E, 0xE0C0, 0x6582, 0xD6B0, 0x6583, 0xF8CA,\n\t0x6585, 0xFCFA, 0x6587, 0xD9FE, 0x658C, 0xDEB0, 0x6590, 0xDDEC,\t0x6591, 0xDAE8, 0x6597, 0xD4E0, 0x6599, 0xD6F9, 0x659B, 0xCDD7,\n\t0x659C, 0xDED8, 0x659F, 0xF2F8, 0x65A1, 0xE4D6, 0x65A4, 0xD0C5,\t0x65A5, 0xF4AE, 0x65A7, 0xDDA8, 0x65AB, 0xEDC5, 0x65AC, 0xF3D6,\n\t0x65AF, 0xDED9, 0x65B0, 0xE3E6, 0x65B7, 0xD3A8, 0x65B9, 0xDBB0,\t0x65BC, 0xE5DA, 0x65BD, 0xE3BF, 0x65C1, 0xDBB1, 0x65C5, 0xD5E9,\n\t0x65CB, 0xE0C1, 0x65CC, 0xEFDB, 0x65CF, 0xF0E9, 0x65D2, 0xD7B2,\t0x65D7, 0xD0FD, 0x65E0, 0xD9E9, 0x65E3, 0xD0FE, 0x65E5, 0xECED,\n\t0x65E6, 0xD3A9, 0x65E8, 0xF2A9, 0x65E9, 0xF0C4, 0x65EC, 0xE2E2,\t0x65ED, 0xE9EF, 0x65F1, 0xF9D1, 0x65F4, 0xE9D9, 0x65FA, 0xE8DA,\n\t0x65FB, 0xDAC3, 0x65FC, 0xDAC4, 0x65FD, 0xD4C5, 0x65FF, 0xE7FA,\t0x6606, 0xCDE0, 0x6607, 0xE3B0, 0x6609, 0xDBB2, 0x660A, 0xFBC4,\n\t0x660C, 0xF3E3, 0x660E, 0xD9A5, 0x660F, 0xFBE7, 0x6610, 0xDDCB,\t0x6611, 0xD0D4, 0x6613, 0xE6B6, 0x6614, 0xE0AE, 0x6615, 0xFDDA,\n\t0x661E, 0xDCB5, 0x661F, 0xE0F8, 0x6620, 0xE7B1, 0x6625, 0xF5F0,\t0x6627, 0xD8DC, 0x6628, 0xEDC6, 0x662D, 0xE1B9, 0x662F, 0xE3C0,\n\t0x6630, 0xF9C0, 0x6631, 0xE9F0, 0x6634, 0xD9DB, 0x6636, 0xF3E4,\t0x663A, 0xDCB6, 0x663B, 0xE4E9, 0x6641, 0xF0C5, 0x6642, 0xE3C1,\n\t0x6643, 0xFCCC, 0x6644, 0xFCCD, 0x6649, 0xF2CB, 0x664B, 0xF2CC,\t0x664F, 0xE4CF, 0x6659, 0xF1DB, 0x665B, 0xFAD9, 0x665D, 0xF1B8,\n\t0x665E, 0xFDF5, 0x665F, 0xE0F9, 0x6664, 0xE7FB, 0x6665, 0xFCB7,\t0x6666, 0xFCE4, 0x6667, 0xFBC5, 0x6668, 0xE3E7, 0x6669, 0xD8B9,\n\t0x666B, 0xF6F8, 0x666E, 0xDCC5, 0x666F, 0xCCD8, 0x6673, 0xE0AF,\t0x6674, 0xF4E7, 0x6676, 0xEFDC, 0x6677, 0xCFFC, 0x6678, 0xEFDD,\n\t0x667A, 0xF2AA, 0x6684, 0xFDBE, 0x6687, 0xCAAC, 0x6688, 0xFDBB,\t0x6689, 0xFDC7, 0x668E, 0xE7B2, 0x6690, 0xEAD1, 0x6691, 0xDFF4,\n\t0x6696, 0xD1EC, 0x6697, 0xE4DE, 0x6698, 0xE5C3, 0x669D, 0xD9A6,\t0x66A0, 0xCDBC, 0x66A2, 0xF3E5, 0x66AB, 0xEDD5, 0x66AE, 0xD9BA,\n\t0x66B2, 0xEDE7, 0x66B3, 0xFBB5, 0x66B4, 0xF8EC, 0x66B9, 0xE0E7,\t0x66BB, 0xCCD9, 0x66BE, 0xD4C6, 0x66C4, 0xE7A5, 0x66C6, 0xD5F5,\n\t0x66C7, 0xD3BE, 0x66C9, 0xFCFB, 0x66D6, 0xE4F2, 0x66D9, 0xDFF5,\t0x66DC, 0xE8F8, 0x66DD, 0xF8ED, 0x66E0, 0xCEC7, 0x66E6, 0xFDF6,\n\t0x66F0, 0xE8D8, 0x66F2, 0xCDD8, 0x66F3, 0xE7D6, 0x66F4, 0xCCDA,\t0x66F7, 0xCAE3, 0x66F8, 0xDFF6, 0x66F9, 0xF0C7, 0x66FA, 0xF0C6,\n\t0x66FC, 0xD8BA, 0x66FE, 0xF1F4, 0x66FF, 0xF4F0, 0x6700, 0xF5CC,\t0x6703, 0xFCE5, 0x6708, 0xEAC5, 0x6709, 0xEAF3, 0x670B, 0xDDDB,\n\t0x670D, 0xDCD7, 0x6714, 0xDEFD, 0x6715, 0xF2F9, 0x6717, 0xD5C7,\t0x671B, 0xD8D0, 0x671D, 0xF0C8, 0x671E, 0xD1A1, 0x671F, 0xD1A2,\n\t0x6726, 0xD9D4, 0x6727, 0xD6E8, 0x6728, 0xD9CA, 0x672A, 0xDAB1,\t0x672B, 0xD8C7, 0x672C, 0xDCE2, 0x672D, 0xF3CE, 0x672E, 0xF5F4,\n\t0x6731, 0xF1B9, 0x6734, 0xDAD3, 0x6736, 0xF6EA, 0x673A, 0xCFF5,\t0x673D, 0xFDAE, 0x6746, 0xCAD2, 0x6749, 0xDFB4, 0x674E, 0xD7DD,\n\t0x674F, 0xFABA, 0x6750, 0xEEA7, 0x6751, 0xF5BD, 0x6753, 0xF8F5,\t0x6756, 0xEDE8, 0x675C, 0xD4E1, 0x675E, 0xD1A3, 0x675F, 0xE1D6,\n\t0x676D, 0xF9F8, 0x676F, 0xDBCA, 0x6770, 0xCBF9, 0x6771, 0xD4D4,\t0x6773, 0xD9DC, 0x6775, 0xEEBE, 0x6777, 0xF7ED, 0x677B, 0xD2EE,\n\t0x677E, 0xE1E6, 0x677F, 0xF7F9, 0x6787, 0xDDED, 0x6789, 0xE8DB,\t0x678B, 0xDBB3, 0x678F, 0xD1F7, 0x6790, 0xE0B0, 0x6793, 0xD4E2,\n\t0x6795, 0xF6D7, 0x6797, 0xD7F9, 0x679A, 0xD8DD, 0x679C, 0xCDFD,\t0x679D, 0xF2AB, 0x67AF, 0xCDBD, 0x67B0, 0xF8C2, 0x67B3, 0xF2AC,\n\t0x67B6, 0xCAAD, 0x67B7, 0xCAAE, 0x67B8, 0xCFAE, 0x67BE, 0xE3C2,\t0x67C4, 0xDCB7, 0x67CF, 0xDBDA, 0x67D0, 0xD9BB, 0x67D1, 0xCAF3,\n\t0x67D2, 0xF6D3, 0x67D3, 0xE6F8, 0x67D4, 0xEAF5, 0x67DA, 0xEAF6,\t0x67DD, 0xF6F9, 0x67E9, 0xCFAF, 0x67EC, 0xCAD3, 0x67EF, 0xCAAF,\n\t0x67F0, 0xD2B0, 0x67F1, 0xF1BA, 0x67F3, 0xD7B3, 0x67F4, 0xE3C3,\t0x67F5, 0xF3FD, 0x67F6, 0xDEDA, 0x67FB, 0xDEDB, 0x67FE, 0xEFDE,\n\t0x6812, 0xE2E3, 0x6813, 0xEEFB, 0x6816, 0xDFF7, 0x6817, 0xD7CA,\t0x6821, 0xCEE8, 0x6822, 0xDBDB, 0x682A, 0xF1BB, 0x682F, 0xE9F1,\n\t0x6838, 0xFAB7, 0x6839, 0xD0C6, 0x683C, 0xCCAB, 0x683D, 0xEEA8,\t0x6840, 0xCBFA, 0x6841, 0xF9F9, 0x6842, 0xCCFD, 0x6843, 0xD3FE,\n\t0x6848, 0xE4D0, 0x684E, 0xF2EE, 0x6850, 0xD4D5, 0x6851, 0xDFCD,\t0x6853, 0xFCB8, 0x6854, 0xD1D0, 0x686D, 0xF2CD, 0x6876, 0xF7D2,\n\t0x687F, 0xCAD4, 0x6881, 0xD5D9, 0x6885, 0xD8DE, 0x688F, 0xCDD9,\t0x6893, 0xEEA9, 0x6894, 0xF6BC, 0x6897, 0xCCDB, 0x689D, 0xF0C9,\n\t0x689F, 0xFCFC, 0x68A1, 0xE8C9, 0x68A2, 0xF4FE, 0x68A7, 0xE7FC,\t0x68A8, 0xD7DE, 0x68AD, 0xDEDC, 0x68AF, 0xF0AC, 0x68B0, 0xCCFE,\n\t0x68B1, 0xCDE1, 0x68B3, 0xE1BA, 0x68B5, 0xDBEF, 0x68B6, 0xDAB2,\t0x68C4, 0xD1A5, 0x68C5, 0xDCB8, 0x68C9, 0xD8F6, 0x68CB, 0xD1A4,\n\t0x68CD, 0xCDE2, 0x68D2, 0xDCEA, 0x68D5, 0xF0F7, 0x68D7, 0xF0CA,\t0x68D8, 0xD0BE, 0x68DA, 0xDDDC, 0x68DF, 0xD4D6, 0x68E0, 0xD3D6,\n\t0x68E7, 0xEDD0, 0x68E8, 0xCDA1, 0x68EE, 0xDFB5, 0x68F2, 0xDFF8,\t0x68F9, 0xD4A1, 0x68FA, 0xCEB2, 0x6900, 0xE8CA, 0x6905, 0xEBF5,\n\t0x690D, 0xE3D5, 0x690E, 0xF5D0, 0x6912, 0xF5A1, 0x6927, 0xD9A7,\t0x6930, 0xE5AB, 0x693D, 0xE6CB, 0x693F, 0xF5F1, 0x694A, 0xE5C5,\n\t0x6953, 0xF9A3, 0x6954, 0xE0DB, 0x6955, 0xF6EB, 0x6957, 0xCBF1,\t0x6959, 0xD9EA, 0x695A, 0xF5A2, 0x695E, 0xD7D1, 0x6960, 0xD1F8,\n\t0x6961, 0xEAF8, 0x6962, 0xEAF9, 0x6963, 0xDAB3, 0x6968, 0xEFDF,\t0x696B, 0xF1EF, 0x696D, 0xE5F6, 0x696E, 0xEEBF, 0x696F, 0xE2E4,\n\t0x6975, 0xD0BF, 0x6977, 0xFAAC, 0x6978, 0xF5D1, 0x6979, 0xE7B3,\t0x6995, 0xE9BE, 0x699B, 0xF2CE, 0x699C, 0xDBB4, 0x69A5, 0xFCCE,\n\t0x69A7, 0xDDEE, 0x69AE, 0xE7B4, 0x69B4, 0xD7B4, 0x69BB, 0xF7B4,\t0x69C1, 0xCDBE, 0x69C3, 0xDAE9, 0x69CB, 0xCFB0, 0x69CC, 0xF7D9,\n\t0x69CD, 0xF3E6, 0x69D0, 0xCED9, 0x69E8, 0xCEAA, 0x69EA, 0xCBC8,\t0x69FB, 0xD0A7, 0x69FD, 0xF0CB, 0x69FF, 0xD0C7, 0x6A02, 0xE4C5,\n\t0x6A0A, 0xDBE0, 0x6A11, 0xD5DA, 0x6A13, 0xD7A7, 0x6A17, 0xEEC0,\t0x6A19, 0xF8F6, 0x6A1E, 0xF5D2, 0x6A1F, 0xEDE9, 0x6A21, 0xD9BC,\n\t0x6A23, 0xE5C6, 0x6A35, 0xF5A3, 0x6A38, 0xDAD4, 0x6A39, 0xE2A7,\t0x6A3A, 0xFBFC, 0x6A3D, 0xF1DC, 0x6A44, 0xCAF4, 0x6A48, 0xE8FA,\n\t0x6A4B, 0xCEE9, 0x6A52, 0xE9F8, 0x6A53, 0xE2E5, 0x6A58, 0xD0B9,\t0x6A59, 0xD4F2, 0x6A5F, 0xD1A6, 0x6A61, 0xDFCE, 0x6A6B, 0xFCF4,\n\t0x6A80, 0xD3AA, 0x6A84, 0xCCAC, 0x6A89, 0xEFE0, 0x6A8D, 0xE5E5,\t0x6A8E, 0xD0D5, 0x6A97, 0xDBFC, 0x6A9C, 0xFCE6, 0x6AA2, 0xCBFE,\n\t0x6AA3, 0xEDEA, 0x6AB3, 0xDEB1, 0x6ABB, 0xF9E3, 0x6AC2, 0xD4A2,\t0x6AC3, 0xCFF6, 0x6AD3, 0xD6D0, 0x6ADA, 0xD5EA, 0x6ADB, 0xF1EE,\n\t0x6AF6, 0xFACB, 0x6AFB, 0xE5A1, 0x6B04, 0xD5B1, 0x6B0A, 0xCFED,\t0x6B0C, 0xEDEB, 0x6B12, 0xD5B2, 0x6B16, 0xD5BC, 0x6B20, 0xFDE2,\n\t0x6B21, 0xF3AD, 0x6B23, 0xFDDB, 0x6B32, 0xE9B0, 0x6B3A, 0xD1A7,\t0x6B3D, 0xFDE3, 0x6B3E, 0xCEB3, 0x6B46, 0xFDE4, 0x6B47, 0xFACE,\n\t0x6B4C, 0xCAB0, 0x6B4E, 0xF7A7, 0x6B50, 0xCFB1, 0x6B5F, 0xE6A2,\t0x6B61, 0xFCB6, 0x6B62, 0xF2AD, 0x6B63, 0xEFE1, 0x6B64, 0xF3AE,\n\t0x6B65, 0xDCC6, 0x6B66, 0xD9EB, 0x6B6A, 0xE8E0, 0x6B72, 0xE1A8,\t0x6B77, 0xD5F6, 0x6B78, 0xCFFD, 0x6B7B, 0xDEDD, 0x6B7F, 0xD9D1,\n\t0x6B83, 0xE4EA, 0x6B84, 0xF2CF, 0x6B86, 0xF7BF, 0x6B89, 0xE2E6,\t0x6B8A, 0xE2A8, 0x6B96, 0xE3D6, 0x6B98, 0xEDD1, 0x6B9E, 0xE9F9,\n\t0x6BAE, 0xD6B1, 0x6BAF, 0xDEB2, 0x6BB2, 0xE0E8, 0x6BB5, 0xD3AB,\t0x6BB7, 0xEBDC, 0x6BBA, 0xDFAF, 0x6BBC, 0xCAC3, 0x6BBF, 0xEEFC,\n\t0x6BC1, 0xFDC3, 0x6BC5, 0xEBF6, 0x6BC6, 0xCFB2, 0x6BCB, 0xD9EC,\t0x6BCD, 0xD9BD, 0x6BCF, 0xD8DF, 0x6BD2, 0xD4B8, 0x6BD3, 0xEBBE,\n\t0x6BD4, 0xDDEF, 0x6BD6, 0xDDF0, 0x6BD7, 0xDDF1, 0x6BD8, 0xDDF2,\t0x6BDB, 0xD9BE, 0x6BEB, 0xFBC6, 0x6BEC, 0xCFB3, 0x6C08, 0xEEFD,\n\t0x6C0F, 0xE4AB, 0x6C11, 0xDAC5, 0x6C13, 0xD8EC, 0x6C23, 0xD1A8,\t0x6C34, 0xE2A9, 0x6C37, 0xDEBC, 0x6C38, 0xE7B5, 0x6C3E, 0xDBF0,\n\t0x6C40, 0xEFE2, 0x6C41, 0xF1F0, 0x6C42, 0xCFB4, 0x6C4E, 0xDBF1,\t0x6C50, 0xE0B1, 0x6C55, 0xDFA5, 0x6C57, 0xF9D2, 0x6C5A, 0xE7FD,\n\t0x6C5D, 0xE6A3, 0x6C5E, 0xFBF1, 0x6C5F, 0xCBB0, 0x6C60, 0xF2AE,\t0x6C68, 0xCDE7, 0x6C6A, 0xE8DC, 0x6C6D, 0xE7D7, 0x6C70, 0xF7C0,\n\t0x6C72, 0xD0E3, 0x6C76, 0xDAA1, 0x6C7A, 0xCCBD, 0x6C7D, 0xD1A9,\t0x6C7E, 0xDDCC, 0x6C81, 0xE3FE, 0x6C82, 0xD1AA, 0x6C83, 0xE8AA,\n\t0x6C85, 0xEAB6, 0x6C86, 0xF9FA, 0x6C87, 0xE6CC, 0x6C88, 0xF6D8,\t0x6C8C, 0xD4C7, 0x6C90, 0xD9CB, 0x6C92, 0xD9D2, 0x6C93, 0xD3CB,\n\t0x6C94, 0xD8F7, 0x6C95, 0xDAA9, 0x6C96, 0xF5F8, 0x6C99, 0xDEDE,\t0x6C9A, 0xF2AF, 0x6C9B, 0xF8A9, 0x6CAB, 0xD8C8, 0x6CAE, 0xEEC1,\n\t0x6CB3, 0xF9C1, 0x6CB8, 0xDDF3, 0x6CB9, 0xEAFA, 0x6CBB, 0xF6BD,\t0x6CBC, 0xE1BB, 0x6CBD, 0xCDBF, 0x6CBE, 0xF4D4, 0x6CBF, 0xE6CD,\n\t0x6CC1, 0xFCCF, 0x6CC2, 0xFBA2, 0x6CC4, 0xE0DC, 0x6CC9, 0xF4BB,\t0x6CCA, 0xDAD5, 0x6CCC, 0xF9B2, 0x6CD3, 0xFBF2, 0x6CD5, 0xDBF6,\n\t0x6CD7, 0xDEDF, 0x6CDB, 0xDBF2, 0x6CE1, 0xF8DC, 0x6CE2, 0xF7EE,\t0x6CE3, 0xEBE8, 0x6CE5, 0xD2FA, 0x6CE8, 0xF1BC, 0x6CEB, 0xFADA,\n\t0x6CEE, 0xDAEA, 0x6CEF, 0xDAC6, 0x6CF0, 0xF7C1, 0x6CF3, 0xE7B6,\t0x6D0B, 0xE5C7, 0x6D0C, 0xD6AC, 0x6D11, 0xDCC7, 0x6D17, 0xE1A9,\n\t0x6D19, 0xE2AA, 0x6D1B, 0xD5A6, 0x6D1E, 0xD4D7, 0x6D25, 0xF2D0,\t0x6D27, 0xEAFB, 0x6D29, 0xE0DD, 0x6D2A, 0xFBF3, 0x6D32, 0xF1BD,\n\t0x6D35, 0xE2E7, 0x6D36, 0xFDD7, 0x6D38, 0xCEC8, 0x6D39, 0xEAB7,\t0x6D3B, 0xFCC0, 0x6D3D, 0xFDE7, 0x6D3E, 0xF7EF, 0x6D41, 0xD7B5,\n\t0x6D59, 0xEFBA, 0x6D5A, 0xF1DD, 0x6D5C, 0xDEB3, 0x6D63, 0xE8CB,\t0x6D66, 0xF8DD, 0x6D69, 0xFBC7, 0x6D6A, 0xD5C8, 0x6D6C, 0xD7DF,\n\t0x6D6E, 0xDDA9, 0x6D74, 0xE9B1, 0x6D77, 0xFAAD, 0x6D78, 0xF6D9,\t0x6D79, 0xFAF4, 0x6D7F, 0xF8AA, 0x6D85, 0xE6EE, 0x6D87, 0xCCDC,\n\t0x6D88, 0xE1BC, 0x6D89, 0xE0EF, 0x6D8C, 0xE9BF, 0x6D8D, 0xFCFD,\t0x6D8E, 0xE6CE, 0x6D91, 0xE1D7, 0x6D93, 0xE6CF, 0x6D95, 0xF4F1,\n\t0x6DAF, 0xE4F3, 0x6DB2, 0xE4FB, 0x6DB5, 0xF9E4, 0x6DC0, 0xEFE3,\t0x6DC3, 0xCFEE, 0x6DC4, 0xF6BE, 0x6DC5, 0xE0B2, 0x6DC6, 0xFCFE,\n\t0x6DC7, 0xD1AB, 0x6DCB, 0xD7FA, 0x6DCF, 0xFBC8, 0x6DD1, 0xE2D7,\t0x6DD8, 0xD4A3, 0x6DD9, 0xF0F8, 0x6DDA, 0xD7A8, 0x6DDE, 0xE1E7,\n\t0x6DE1, 0xD3BF, 0x6DE8, 0xEFE4, 0x6DEA, 0xD7C5, 0x6DEB, 0xEBE2,\t0x6DEE, 0xFCE7, 0x6DF1, 0xE4A2, 0x6DF3, 0xE2E8, 0x6DF5, 0xE6D0,\n\t0x6DF7, 0xFBE8, 0x6DF8, 0xF4E8, 0x6DF9, 0xE5F4, 0x6DFA, 0xF4BC,\t0x6DFB, 0xF4D5, 0x6E17, 0xDFB6, 0x6E19, 0xFCB9, 0x6E1A, 0xEEC2,\n\t0x6E1B, 0xCAF5, 0x6E1F, 0xEFE5, 0x6E20, 0xCBE2, 0x6E21, 0xD4A4,\t0x6E23, 0xDEE0, 0x6E24, 0xDAFD, 0x6E25, 0xE4C6, 0x6E26, 0xE8BE,\n\t0x6E2B, 0xE0DE, 0x6E2C, 0xF6B4, 0x6E2D, 0xEAD2, 0x6E2F, 0xF9FB,\t0x6E32, 0xE0C2, 0x6E34, 0xCAE4, 0x6E36, 0xE7B7, 0x6E38, 0xEAFD,\n\t0x6E3A, 0xD9DD, 0x6E3C, 0xDAB4, 0x6E3D, 0xEEAA, 0x6E3E, 0xFBE9,\t0x6E43, 0xDBCB, 0x6E44, 0xDAB5, 0x6E4A, 0xF1BE, 0x6E4D, 0xD3AC,\n\t0x6E56, 0xFBC9, 0x6E58, 0xDFCF, 0x6E5B, 0xD3C0, 0x6E5C, 0xE3D7,\t0x6E5E, 0xEFE6, 0x6E5F, 0xFCD0, 0x6E67, 0xE9C0, 0x6E6B, 0xF5D3,\n\t0x6E6E, 0xECDC, 0x6E6F, 0xF7B7, 0x6E72, 0xEAB8, 0x6E73, 0xD1F9,\t0x6E7A, 0xDCC8, 0x6E90, 0xEAB9, 0x6E96, 0xF1DE, 0x6E9C, 0xD7B6,\n\t0x6E9D, 0xCFB5, 0x6E9F, 0xD9A8, 0x6EA2, 0xECEE, 0x6EA5, 0xDDAA,\t0x6EAA, 0xCDA2, 0x6EAB, 0xE8AE, 0x6EAF, 0xE1BD, 0x6EB1, 0xF2D1,\n\t0x6EB6, 0xE9C1, 0x6EBA, 0xD2FC, 0x6EC2, 0xDBB5, 0x6EC4, 0xF3E7,\t0x6EC5, 0xD8FE, 0x6EC9, 0xFCD1, 0x6ECB, 0xEDB2, 0x6ECC, 0xF4AF,\n\t0x6ECE, 0xFBA3, 0x6ED1, 0xFCC1, 0x6ED3, 0xEEAB, 0x6ED4, 0xD4A5,\t0x6EEF, 0xF4F2, 0x6EF4, 0xEED9, 0x6EF8, 0xFBCA, 0x6EFE, 0xCDE3,\n\t0x6EFF, 0xD8BB, 0x6F01, 0xE5DB, 0x6F02, 0xF8F7, 0x6F06, 0xF6D4,\t0x6F0F, 0xD7A9, 0x6F11, 0xCBC9, 0x6F14, 0xE6D1, 0x6F15, 0xF0CC,\n\t0x6F20, 0xD8AE, 0x6F22, 0xF9D3, 0x6F23, 0xD5FE, 0x6F2B, 0xD8BC,\t0x6F2C, 0xF2B0, 0x6F31, 0xE2AB, 0x6F32, 0xF3E8, 0x6F38, 0xEFC2,\n\t0x6F3F, 0xEDEC, 0x6F41, 0xE7B8, 0x6F51, 0xDAFE, 0x6F54, 0xCCBE,\t0x6F57, 0xF2FC, 0x6F58, 0xDAEB, 0x6F5A, 0xE2D8, 0x6F5B, 0xEDD6,\n\t0x6F5E, 0xD6D1, 0x6F5F, 0xE0B3, 0x6F62, 0xFCD2, 0x6F64, 0xEBC8,\t0x6F6D, 0xD3C1, 0x6F6E, 0xF0CD, 0x6F70, 0xCFF7, 0x6F7A, 0xEDD2,\n\t0x6F7C, 0xD4D8, 0x6F7D, 0xDCC9, 0x6F7E, 0xD7F1, 0x6F81, 0xDFBB,\t0x6F84, 0xF3A5, 0x6F88, 0xF4CD, 0x6F8D, 0xF1BF, 0x6F8E, 0xF8B1,\n\t0x6F90, 0xE9FA, 0x6F94, 0xFBCB, 0x6F97, 0xCAD5, 0x6FA3, 0xF9D4,\t0x6FA4, 0xF7CA, 0x6FA7, 0xD6C8, 0x6FAE, 0xFCE8, 0x6FAF, 0xF3BD,\n\t0x6FB1, 0xEEFE, 0x6FB3, 0xE7FE, 0x6FB9, 0xD3C2, 0x6FBE, 0xD3B6,\t0x6FC0, 0xCCAD, 0x6FC1, 0xF6FA, 0x6FC2, 0xD6B2, 0x6FC3, 0xD2D8,\n\t0x6FCA, 0xE7D8, 0x6FD5, 0xE3A5, 0x6FDA, 0xE7B9, 0x6FDF, 0xF0AD,\t0x6FE0, 0xFBCC, 0x6FE1, 0xEBA1, 0x6FE4, 0xD4A6, 0x6FE9, 0xFBCD,\n\t0x6FEB, 0xD5BD, 0x6FEC, 0xF1DF, 0x6FEF, 0xF6FB, 0x6FF1, 0xDEB4,\t0x6FFE, 0xD5EB, 0x7001, 0xE5C8, 0x7005, 0xFBA4, 0x7006, 0xD4B9,\n\t0x7009, 0xDEE1, 0x700B, 0xE4A3, 0x700F, 0xD7B7, 0x7011, 0xF8EE,\t0x7015, 0xDEB5, 0x7018, 0xD6D2, 0x701A, 0xF9D5, 0x701B, 0xE7BA,\n\t0x701C, 0xEBD5, 0x701D, 0xD5F7, 0x701E, 0xEFE7, 0x701F, 0xE1BE,\t0x7023, 0xFAAE, 0x7027, 0xD6E9, 0x7028, 0xD6EE, 0x702F, 0xE7BB,\n\t0x7037, 0xECCB, 0x703E, 0xD5B3, 0x704C, 0xCEB4, 0x7050, 0xFBA5,\t0x7051, 0xE1EE, 0x7058, 0xF7A8, 0x705D, 0xFBCE, 0x7063, 0xD8BD,\n\t0x706B, 0xFBFD, 0x7070, 0xFCE9, 0x7078, 0xCFB6, 0x707C, 0xEDC7,\t0x707D, 0xEEAC, 0x7085, 0xCCDD, 0x708A, 0xF6A7, 0x708E, 0xE6FA,\n\t0x7092, 0xF5A4, 0x7098, 0xFDDC, 0x7099, 0xEDB3, 0x709A, 0xCEC9,\t0x70A1, 0xEFE8, 0x70A4, 0xE1BF, 0x70AB, 0xFADB, 0x70AC, 0xCBE3,\n\t0x70AD, 0xF7A9, 0x70AF, 0xFBA6, 0x70B3, 0xDCB9, 0x70B7, 0xF1C0,\t0x70B8, 0xEDC8, 0x70B9, 0xEFC3, 0x70C8, 0xD6AD, 0x70CB, 0xFDCE,\n\t0x70CF, 0xE8A1, 0x70D8, 0xFBF4, 0x70D9, 0xD5A7, 0x70DD, 0xF1F6,\t0x70DF, 0xE6D3, 0x70F1, 0xCCDE, 0x70F9, 0xF8B2, 0x70FD, 0xDCEB,\n\t0x7104, 0xFDB6, 0x7109, 0xE5EA, 0x710C, 0xF1E0, 0x7119, 0xDBCC,\t0x711A, 0xDDCD, 0x711E, 0xD4C8, 0x7121, 0xD9ED, 0x7126, 0xF5A5,\n\t0x7130, 0xE6FB, 0x7136, 0xE6D4, 0x7147, 0xFDC8, 0x7149, 0xD6A1,\t0x714A, 0xFDBF, 0x714C, 0xFCD3, 0x714E, 0xEFA1, 0x7150, 0xE7BC,\n\t0x7156, 0xD1EE, 0x7159, 0xE6D5, 0x715C, 0xE9F2, 0x715E, 0xDFB0,\t0x7164, 0xD8E0, 0x7165, 0xFCBA, 0x7166, 0xFDAF, 0x7167, 0xF0CE,\n\t0x7169, 0xDBE1, 0x716C, 0xE5C9, 0x716E, 0xEDB4, 0x717D, 0xE0C3,\t0x7184, 0xE3D8, 0x7189, 0xE9FB, 0x718A, 0xEAA8, 0x718F, 0xFDB7,\n\t0x7192, 0xFBA7, 0x7194, 0xE9C2, 0x7199, 0xFDF7, 0x719F, 0xE2D9,\t0x71A2, 0xDCEC, 0x71AC, 0xE8A2, 0x71B1, 0xE6F0, 0x71B9, 0xFDF8,\n\t0x71BA, 0xFDF9, 0x71BE, 0xF6BF, 0x71C1, 0xE7A7, 0x71C3, 0xE6D7,\t0x71C8, 0xD4F3, 0x71C9, 0xD4C9, 0x71CE, 0xD6FA, 0x71D0, 0xD7F2,\n\t0x71D2, 0xE1C0, 0x71D4, 0xDBE2, 0x71D5, 0xE6D8, 0x71DF, 0xE7BD,\t0x71E5, 0xF0CF, 0x71E6, 0xF3BE, 0x71E7, 0xE2AC, 0x71ED, 0xF5B7,\n\t0x71EE, 0xE0F0, 0x71FB, 0xFDB8, 0x71FC, 0xE3E8, 0x71FE, 0xD4A7,\t0x71FF, 0xE8FC, 0x7200, 0xFAD2, 0x7206, 0xF8EF, 0x7210, 0xD6D3,\n\t0x721B, 0xD5B4, 0x722A, 0xF0D0, 0x722C, 0xF7F0, 0x722D, 0xEEB3,\t0x7230, 0xEABA, 0x7232, 0xEAD3, 0x7235, 0xEDC9, 0x7236, 0xDDAB,\n\t0x723A, 0xE5AC, 0x723B, 0xFDA1, 0x723D, 0xDFD0, 0x723E, 0xECB3,\t0x7240, 0xDFD1, 0x7246, 0xEDED, 0x7247, 0xF8B8, 0x7248, 0xF7FA,\n\t0x724C, 0xF8AB, 0x7252, 0xF4E0, 0x7258, 0xD4BA, 0x7259, 0xE4B3,\t0x725B, 0xE9DA, 0x725D, 0xDEB6, 0x725F, 0xD9BF, 0x7261, 0xD9C0,\n\t0x7262, 0xD6EF, 0x7267, 0xD9CC, 0x7269, 0xDAAA, 0x7272, 0xDFE5,\t0x7279, 0xF7E5, 0x727D, 0xCCB2, 0x7280, 0xDFF9, 0x7281, 0xD7E0,\n\t0x72A2, 0xD4BB, 0x72A7, 0xFDFA, 0x72AC, 0xCCB3, 0x72AF, 0xDBF3,\t0x72C0, 0xDFD2, 0x72C2, 0xCECA, 0x72C4, 0xEEDA, 0x72CE, 0xE4E4,\n\t0x72D0, 0xFBCF, 0x72D7, 0xCFB7, 0x72D9, 0xEEC3, 0x72E1, 0xCEEA,\t0x72E9, 0xE2AD, 0x72F8, 0xD7E1, 0x72F9, 0xFAF5, 0x72FC, 0xD5C9,\n\t0x72FD, 0xF8AC, 0x730A, 0xE7D9, 0x7316, 0xF3E9, 0x731B, 0xD8ED,\t0x731C, 0xE3C4, 0x731D, 0xF0F1, 0x7325, 0xE8E5, 0x7329, 0xE0FA,\n\t0x732A, 0xEEC4, 0x732B, 0xD9DE, 0x7336, 0xEBA2, 0x7337, 0xEBA3,\t0x733E, 0xFCC2, 0x733F, 0xEABB, 0x7344, 0xE8AB, 0x7345, 0xDEE2,\n\t0x7350, 0xEDEF, 0x7352, 0xE8A3, 0x7357, 0xCFF1, 0x7368, 0xD4BC,\t0x736A, 0xFCEA, 0x7370, 0xE7BE, 0x7372, 0xFCF2, 0x7375, 0xD6B4,\n\t0x7378, 0xE2AE, 0x737A, 0xD3B7, 0x737B, 0xFACC, 0x7384, 0xFADC,\t0x7386, 0xEDB5, 0x7387, 0xE1E3, 0x7389, 0xE8AC, 0x738B, 0xE8DD,\n\t0x738E, 0xEFE9, 0x7394, 0xF4BD, 0x7396, 0xCFB8, 0x7397, 0xE9DB,\t0x7398, 0xD1AC, 0x739F, 0xDAC7, 0x73A7, 0xEBC9, 0x73A9, 0xE8CC,\n\t0x73AD, 0xDEB7, 0x73B2, 0xD6BC, 0x73B3, 0xD3E5, 0x73B9, 0xFADD,\t0x73C0, 0xDAD6, 0x73C2, 0xCAB1, 0x73C9, 0xDAC8, 0x73CA, 0xDFA6,\n\t0x73CC, 0xF9B3, 0x73CD, 0xF2D2, 0x73CF, 0xCAC4, 0x73D6, 0xCECB,\t0x73D9, 0xCDF5, 0x73DD, 0xFDB0, 0x73DE, 0xD5A8, 0x73E0, 0xF1C1,\n\t0x73E3, 0xE2E9, 0x73E4, 0xDCCA, 0x73E5, 0xECB4, 0x73E6, 0xFAC0,\t0x73E9, 0xFBA8, 0x73EA, 0xD0A8, 0x73ED, 0xDAEC, 0x73F7, 0xD9EE,\n\t0x73F9, 0xE0FB, 0x73FD, 0xEFEA, 0x73FE, 0xFADE, 0x7401, 0xE0C4,\t0x7403, 0xCFB9, 0x7405, 0xD5CA, 0x7406, 0xD7E2, 0x7407, 0xE2AF,\n\t0x7409, 0xD7B8, 0x7413, 0xE8CD, 0x741B, 0xF6DA, 0x7420, 0xEFA2,\t0x7421, 0xE2DA, 0x7422, 0xF6FC, 0x7425, 0xFBD0, 0x7426, 0xD1AD,\n\t0x7428, 0xCDE4, 0x742A, 0xD1AE, 0x742B, 0xDCED, 0x742C, 0xE8CE,\t0x742E, 0xF0F9, 0x742F, 0xCEB5, 0x7430, 0xE6FC, 0x7433, 0xD7FB,\n\t0x7434, 0xD0D6, 0x7435, 0xDDF5, 0x7436, 0xF7F1, 0x7438, 0xF6FD,\t0x743A, 0xDBF7, 0x743F, 0xFBEA, 0x7440, 0xE9DC, 0x7441, 0xD9C1,\n\t0x7443, 0xF5F2, 0x7444, 0xE0C5, 0x744B, 0xEAD4, 0x7455, 0xF9C2,\t0x7457, 0xEABC, 0x7459, 0xD2C5, 0x745A, 0xFBD1, 0x745B, 0xE7C0,\n\t0x745C, 0xEBA5, 0x745E, 0xDFFA, 0x745F, 0xE3A2, 0x7460, 0xD7B9,\t0x7462, 0xE9C3, 0x7464, 0xE8FD, 0x7465, 0xE8AF, 0x7468, 0xF2D3,\n\t0x7469, 0xFBA9, 0x746A, 0xD8A5, 0x746F, 0xD5CB, 0x747E, 0xD0C8,\t0x7482, 0xD1AF, 0x7483, 0xD7E3, 0x7487, 0xE0C6, 0x7489, 0xD6A2,\n\t0x748B, 0xEDF0, 0x7498, 0xD7F3, 0x749C, 0xFCD4, 0x749E, 0xDAD7,\t0x749F, 0xCCDF, 0x74A1, 0xF2D4, 0x74A3, 0xD1B0, 0x74A5, 0xCCE0,\n\t0x74A7, 0xDBFD, 0x74A8, 0xF3BF, 0x74AA, 0xF0D1, 0x74B0, 0xFCBB,\t0x74B2, 0xE2B0, 0x74B5, 0xE6A5, 0x74B9, 0xE2DB, 0x74BD, 0xDFDE,\n\t0x74BF, 0xE0C7, 0x74C6, 0xF2EF, 0x74CA, 0xCCE1, 0x74CF, 0xD6EA,\t0x74D4, 0xE7C2, 0x74D8, 0xCEB6, 0x74DA, 0xF3C0, 0x74DC, 0xCDFE,\n\t0x74E0, 0xFBD2, 0x74E2, 0xF8F8, 0x74E3, 0xF7FB, 0x74E6, 0xE8BF,\t0x74EE, 0xE8B7, 0x74F7, 0xEDB6, 0x7501, 0xDCBA, 0x7504, 0xCCB4,\n\t0x7511, 0xF1F7, 0x7515, 0xE8B8, 0x7518, 0xCAF6, 0x751A, 0xE4A4,\t0x751B, 0xF4D6, 0x751F, 0xDFE6, 0x7523, 0xDFA7, 0x7525, 0xDFE7,\n\t0x7526, 0xE1C1, 0x7528, 0xE9C4, 0x752B, 0xDCCB, 0x752C, 0xE9C5,\t0x7530, 0xEFA3, 0x7531, 0xEBA6, 0x7532, 0xCBA3, 0x7533, 0xE3E9,\n\t0x7537, 0xD1FB, 0x7538, 0xEFA4, 0x753A, 0xEFEB, 0x7547, 0xD0B4,\t0x754C, 0xCDA3, 0x754F, 0xE8E6, 0x7551, 0xEFA5, 0x7553, 0xD3CC,\n\t0x7554, 0xDAED, 0x7559, 0xD7BA, 0x755B, 0xF2D5, 0x755C, 0xF5E5,\t0x755D, 0xD9EF, 0x7562, 0xF9B4, 0x7565, 0xD5D4, 0x7566, 0xFDCF,\n\t0x756A, 0xDBE3, 0x756F, 0xF1E1, 0x7570, 0xECB6, 0x7575, 0xFBFE,\t0x7576, 0xD3D7, 0x7578, 0xD1B1, 0x757A, 0xCBB1, 0x757F, 0xD1B2,\n\t0x7586, 0xCBB2, 0x7587, 0xF1C2, 0x758A, 0xF4E1, 0x758B, 0xF9B5,\t0x758E, 0xE1C3, 0x758F, 0xE1C2, 0x7591, 0xEBF7, 0x759D, 0xDFA8,\n\t0x75A5, 0xCBCA, 0x75AB, 0xE6B9, 0x75B1, 0xF8DE, 0x75B2, 0xF9AA,\t0x75B3, 0xCAF7, 0x75B5, 0xEDB7, 0x75B8, 0xD3B8, 0x75B9, 0xF2D6,\n\t0x75BC, 0xD4D9, 0x75BD, 0xEEC5, 0x75BE, 0xF2F0, 0x75C2, 0xCAB2,\t0x75C5, 0xDCBB, 0x75C7, 0xF1F8, 0x75CD, 0xECB7, 0x75D2, 0xE5CA,\n\t0x75D4, 0xF6C0, 0x75D5, 0xFDDD, 0x75D8, 0xD4E3, 0x75D9, 0xCCE2,\t0x75DB, 0xF7D4, 0x75E2, 0xD7E5, 0x75F0, 0xD3C3, 0x75F2, 0xD8A6,\n\t0x75F4, 0xF6C1, 0x75FA, 0xDDF6, 0x75FC, 0xCDC0, 0x7600, 0xE5DC,\t0x760D, 0xE5CB, 0x7619, 0xE1C4, 0x761F, 0xE8B0, 0x7620, 0xF4B0,\n\t0x7621, 0xF3EA, 0x7622, 0xDAEE, 0x7624, 0xD7BB, 0x7626, 0xE2B1,\t0x763B, 0xD7AA, 0x7642, 0xD6FB, 0x764C, 0xE4DF, 0x764E, 0xCAD6,\n\t0x7652, 0xEBA8, 0x7656, 0xDBFE, 0x7661, 0xF6C2, 0x7664, 0xEFBB,\t0x7669, 0xD4FD, 0x766C, 0xE0C8, 0x7670, 0xE8B9, 0x7672, 0xEFA6,\n\t0x7678, 0xCDA4, 0x767B, 0xD4F4, 0x767C, 0xDBA1, 0x767D, 0xDBDC,\t0x767E, 0xDBDD, 0x7684, 0xEEDC, 0x7686, 0xCBCB, 0x7687, 0xFCD5,\n\t0x768E, 0xCEEB, 0x7690, 0xCDC1, 0x7693, 0xFBD3, 0x76AE, 0xF9AB,\t0x76BA, 0xF5D4, 0x76BF, 0xD9A9, 0x76C2, 0xE9DD, 0x76C3, 0xDBCD,\n\t0x76C6, 0xDDCE, 0x76C8, 0xE7C3, 0x76CA, 0xECCC, 0x76D2, 0xF9EC,\t0x76D6, 0xCBCC, 0x76DB, 0xE0FC, 0x76DC, 0xD4A8, 0x76DE, 0xEDD3,\n\t0x76DF, 0xD8EF, 0x76E1, 0xF2D7, 0x76E3, 0xCAF8, 0x76E4, 0xDAEF,\t0x76E7, 0xD6D4, 0x76EE, 0xD9CD, 0x76F2, 0xD8EE, 0x76F4, 0xF2C1,\n\t0x76F8, 0xDFD3, 0x76FC, 0xDAF0, 0x76FE, 0xE2EA, 0x7701, 0xE0FD,\t0x7704, 0xD8F8, 0x7708, 0xF7AF, 0x7709, 0xDAB6, 0x770B, 0xCAD7,\n\t0x771E, 0xF2D8, 0x7720, 0xD8F9, 0x7729, 0xFADF, 0x7737, 0xCFEF,\t0x7738, 0xD9C2, 0x773A, 0xF0D2, 0x773C, 0xE4D1, 0x7740, 0xF3B7,\n\t0x774D, 0xFAE0, 0x775B, 0xEFEC, 0x7761, 0xE2B2, 0x7763, 0xD4BD,\t0x7766, 0xD9CE, 0x776B, 0xF4E2, 0x7779, 0xD4A9, 0x777E, 0xCDC2,\n\t0x777F, 0xE7DA, 0x778B, 0xF2D9, 0x7791, 0xD9AA, 0x779E, 0xD8BE,\t0x77A5, 0xDCAD, 0x77AC, 0xE2EB, 0x77AD, 0xD6FC, 0x77B0, 0xCAF9,\n\t0x77B3, 0xD4DA, 0x77BB, 0xF4D7, 0x77BC, 0xCCA1, 0x77BF, 0xCFBA,\t0x77D7, 0xF5B8, 0x77DB, 0xD9C3, 0x77DC, 0xD0E8, 0x77E2, 0xE3C5,\n\t0x77E3, 0xEBF8, 0x77E5, 0xF2B1, 0x77E9, 0xCFBB, 0x77ED, 0xD3AD,\t0x77EE, 0xE8E1, 0x77EF, 0xCEEC, 0x77F3, 0xE0B4, 0x7802, 0xDEE3,\n\t0x7812, 0xDDF7, 0x7825, 0xF2B2, 0x7826, 0xF3F6, 0x7827, 0xF6DB,\t0x782C, 0xD7FE, 0x7832, 0xF8DF, 0x7834, 0xF7F2, 0x7845, 0xD0A9,\n\t0x784F, 0xE6DA, 0x785D, 0xF5A6, 0x786B, 0xD7BC, 0x786C, 0xCCE3,\t0x786F, 0xE6DB, 0x787C, 0xDDDD, 0x7881, 0xD1B3, 0x7887, 0xEFED,\n\t0x788C, 0xD6DE, 0x788D, 0xE4F4, 0x788E, 0xE1EF, 0x7891, 0xDDF8,\t0x7897, 0xE8CF, 0x78A3, 0xCAE5, 0x78A7, 0xDCA1, 0x78A9, 0xE0B5,\n\t0x78BA, 0xFCAC, 0x78BB, 0xFCAD, 0x78BC, 0xD8A7, 0x78C1, 0xEDB8,\t0x78C5, 0xDBB6, 0x78CA, 0xD6F0, 0x78CB, 0xF3AF, 0x78CE, 0xCDA5,\n\t0x78D0, 0xDAF1, 0x78E8, 0xD8A8, 0x78EC, 0xCCE4, 0x78EF, 0xD1B4,\t0x78F5, 0xCAD8, 0x78FB, 0xDAF2, 0x7901, 0xF5A7, 0x790E, 0xF5A8,\n\t0x7916, 0xE6A6, 0x792A, 0xD5EC, 0x792B, 0xD5F8, 0x792C, 0xDAF3,\t0x793A, 0xE3C6, 0x793E, 0xDEE4, 0x7940, 0xDEE5, 0x7941, 0xD1B5,\n\t0x7947, 0xD1B6, 0x7948, 0xD1B7, 0x7949, 0xF2B3, 0x7950, 0xE9DE,\t0x7956, 0xF0D3, 0x7957, 0xF2B4, 0x795A, 0xF0D4, 0x795B, 0xCBE4,\n\t0x795C, 0xFBD4, 0x795D, 0xF5E6, 0x795E, 0xE3EA, 0x7960, 0xDEE6,\t0x7965, 0xDFD4, 0x7968, 0xF8F9, 0x796D, 0xF0AE, 0x797A, 0xD1B8,\n\t0x797F, 0xD6DF, 0x7981, 0xD0D7, 0x798D, 0xFCA1, 0x798E, 0xEFEE,\t0x798F, 0xDCD8, 0x7991, 0xE9DF, 0x79A6, 0xE5DD, 0x79A7, 0xFDFB,\n\t0x79AA, 0xE0C9, 0x79AE, 0xD6C9, 0x79B1, 0xD4AA, 0x79B3, 0xE5CC,\t0x79B9, 0xE9E0, 0x79BD, 0xD0D8, 0x79BE, 0xFCA2, 0x79BF, 0xD4BE,\n\t0x79C0, 0xE2B3, 0x79C1, 0xDEE7, 0x79C9, 0xDCBC, 0x79CA, 0xD2B6,\t0x79CB, 0xF5D5, 0x79D1, 0xCEA1, 0x79D2, 0xF5A9, 0x79D5, 0xDDF9,\n\t0x79D8, 0xDDFA, 0x79DF, 0xF0D5, 0x79E4, 0xF6DF, 0x79E6, 0xF2DA,\t0x79E7, 0xE4EB, 0x79E9, 0xF2F1, 0x79FB, 0xECB9, 0x7A00, 0xFDFC,\n\t0x7A05, 0xE1AA, 0x7A08, 0xCAD9, 0x7A0B, 0xEFEF, 0x7A0D, 0xF5AA,\t0x7A14, 0xECF9, 0x7A17, 0xF8AD, 0x7A19, 0xF2C2, 0x7A1A, 0xF6C3,\n\t0x7A1C, 0xD7D2, 0x7A1F, 0xF9A2, 0x7A20, 0xF0D6, 0x7A2E, 0xF0FA,\t0x7A31, 0xF6E0, 0x7A36, 0xE9F3, 0x7A37, 0xF2C3, 0x7A3B, 0xD4AB,\n\t0x7A3C, 0xCAB3, 0x7A3D, 0xCDA6, 0x7A3F, 0xCDC3, 0x7A40, 0xCDDA,\t0x7A46, 0xD9CF, 0x7A49, 0xF6C4, 0x7A4D, 0xEEDD, 0x7A4E, 0xE7C4,\n\t0x7A57, 0xE2B4, 0x7A61, 0xDFE2, 0x7A62, 0xE7DB, 0x7A69, 0xE8B1,\t0x7A6B, 0xFCAE, 0x7A70, 0xE5CD, 0x7A74, 0xFAEB, 0x7A76, 0xCFBC,\n\t0x7A79, 0xCFE2, 0x7A7A, 0xCDF6, 0x7A7D, 0xEFF0, 0x7A7F, 0xF4BE,\t0x7A81, 0xD4CD, 0x7A84, 0xF3B8, 0x7A88, 0xE9A1, 0x7A92, 0xF2F2,\n\t0x7A93, 0xF3EB, 0x7A95, 0xF0D7, 0x7A98, 0xCFD7, 0x7A9F, 0xCFDF,\t0x7AA9, 0xE8C0, 0x7AAA, 0xE8C1, 0x7AAE, 0xCFE3, 0x7AAF, 0xE9A2,\n\t0x7ABA, 0xD0AA, 0x7AC4, 0xF3C1, 0x7AC5, 0xD0AB, 0x7AC7, 0xD4E4,\t0x7ACA, 0xEFBC, 0x7ACB, 0xD8A1, 0x7AD7, 0xD9DF, 0x7AD9, 0xF3D7,\n\t0x7ADD, 0xDCBD, 0x7ADF, 0xCCE5, 0x7AE0, 0xEDF1, 0x7AE3, 0xF1E2,\t0x7AE5, 0xD4DB, 0x7AEA, 0xE2B5, 0x7AED, 0xCAE6, 0x7AEF, 0xD3AE,\n\t0x7AF6, 0xCCE6, 0x7AF9, 0xF1D3, 0x7AFA, 0xF5E7, 0x7AFF, 0xCADA,\t0x7B0F, 0xFBEE, 0x7B11, 0xE1C5, 0x7B19, 0xDFE9, 0x7B1B, 0xEEDE,\n\t0x7B1E, 0xF7C2, 0x7B20, 0xD8A2, 0x7B26, 0xDDAC, 0x7B2C, 0xF0AF,\t0x7B2D, 0xD6BD, 0x7B39, 0xE1AB, 0x7B46, 0xF9B6, 0x7B49, 0xD4F5,\n\t0x7B4B, 0xD0C9, 0x7B4C, 0xEFA7, 0x7B4D, 0xE2EC, 0x7B4F, 0xDBEA,\t0x7B50, 0xCECC, 0x7B51, 0xF5E8, 0x7B52, 0xF7D5, 0x7B54, 0xD3CD,\n\t0x7B56, 0xF3FE, 0x7B60, 0xD0B5, 0x7B6C, 0xE0FE, 0x7B6E, 0xDFFB,\t0x7B75, 0xE6DD, 0x7B7D, 0xE8A4, 0x7B87, 0xCBCD, 0x7B8B, 0xEFA8,\n\t0x7B8F, 0xEEB4, 0x7B94, 0xDAD8, 0x7B95, 0xD1B9, 0x7B97, 0xDFA9,\t0x7B9A, 0xF3B0, 0x7B9D, 0xCCC4, 0x7BA1, 0xCEB7, 0x7BAD, 0xEFA9,\n\t0x7BB1, 0xDFD5, 0x7BB4, 0xEDD7, 0x7BB8, 0xEEC6, 0x7BC0, 0xEFBD,\t0x7BC1, 0xFCD6, 0x7BC4, 0xDBF4, 0x7BC6, 0xEFAA, 0x7BC7, 0xF8B9,\n\t0x7BC9, 0xF5E9, 0x7BD2, 0xE3D9, 0x7BE0, 0xE1C6, 0x7BE4, 0xD4BF,\t0x7BE9, 0xDEE8, 0x7C07, 0xF0EA, 0x7C12, 0xF3C2, 0x7C1E, 0xD3AF,\n\t0x7C21, 0xCADB, 0x7C27, 0xFCD7, 0x7C2A, 0xEDD8, 0x7C2B, 0xE1C7,\t0x7C3D, 0xF4D8, 0x7C3E, 0xD6B3, 0x7C3F, 0xDDAD, 0x7C43, 0xD5BE,\n\t0x7C4C, 0xF1C3, 0x7C4D, 0xEEDF, 0x7C60, 0xD6EB, 0x7C64, 0xF4D9,\t0x7C6C, 0xD7E6, 0x7C73, 0xDAB7, 0x7C83, 0xDDFB, 0x7C89, 0xDDCF,\n\t0x7C92, 0xD8A3, 0x7C95, 0xDAD9, 0x7C97, 0xF0D8, 0x7C98, 0xEFC4,\t0x7C9F, 0xE1D8, 0x7CA5, 0xF1D4, 0x7CA7, 0xEDF2, 0x7CAE, 0xD5DB,\n\t0x7CB1, 0xD5DC, 0x7CB2, 0xF3C4, 0x7CB3, 0xCBD7, 0x7CB9, 0xE2B6,\t0x7CBE, 0xEFF1, 0x7CCA, 0xFBD5, 0x7CD6, 0xD3D8, 0x7CDE, 0xDDD0,\n\t0x7CDF, 0xF0D9, 0x7CE0, 0xCBB3, 0x7CE7, 0xD5DD, 0x7CFB, 0xCDA7,\t0x7CFE, 0xD0AC, 0x7D00, 0xD1BA, 0x7D02, 0xF1C4, 0x7D04, 0xE5B3,\n\t0x7D05, 0xFBF5, 0x7D06, 0xE9E1, 0x7D07, 0xFDE0, 0x7D08, 0xFCBC,\t0x7D0A, 0xDAA2, 0x7D0B, 0xDAA3, 0x7D0D, 0xD2A1, 0x7D10, 0xD2EF,\n\t0x7D14, 0xE2ED, 0x7D17, 0xDEE9, 0x7D18, 0xCEDC, 0x7D19, 0xF2B5,\t0x7D1A, 0xD0E4, 0x7D1B, 0xDDD1, 0x7D20, 0xE1C8, 0x7D21, 0xDBB7,\n\t0x7D22, 0xDFE3, 0x7D2B, 0xEDB9, 0x7D2C, 0xF1C5, 0x7D2E, 0xF3CF,\t0x7D2F, 0xD7AB, 0x7D30, 0xE1AC, 0x7D33, 0xE3EB, 0x7D35, 0xEEC7,\n\t0x7D39, 0xE1C9, 0x7D3A, 0xCAFA, 0x7D42, 0xF0FB, 0x7D43, 0xFAE1,\t0x7D44, 0xF0DA, 0x7D45, 0xCCE7, 0x7D46, 0xDAF4, 0x7D50, 0xCCBF,\n\t0x7D5E, 0xCEED, 0x7D61, 0xD5A9, 0x7D62, 0xFAE2, 0x7D66, 0xD0E5,\t0x7D68, 0xEBD6, 0x7D6A, 0xECDF, 0x7D6E, 0xDFFC, 0x7D71, 0xF7D6,\n\t0x7D72, 0xDEEA, 0x7D73, 0xCBB4, 0x7D76, 0xEFBE, 0x7D79, 0xCCB5,\t0x7D7F, 0xCFBD, 0x7D8E, 0xEFF2, 0x7D8F, 0xE2B7, 0x7D93, 0xCCE8,\n\t0x7D9C, 0xF0FC, 0x7DA0, 0xD6E0, 0x7DA2, 0xF1C6, 0x7DAC, 0xE2B8,\t0x7DAD, 0xEBAB, 0x7DB1, 0xCBB5, 0x7DB2, 0xD8D1, 0x7DB4, 0xF4CE,\n\t0x7DB5, 0xF3F7, 0x7DB8, 0xD7C6, 0x7DBA, 0xD1BB, 0x7DBB, 0xF7AA,\t0x7DBD, 0xEDCA, 0x7DBE, 0xD7D3, 0x7DBF, 0xD8FA, 0x7DC7, 0xF6C5,\n\t0x7DCA, 0xD1CC, 0x7DCB, 0xDDFC, 0x7DD6, 0xDFFD, 0x7DD8, 0xF9E5,\t0x7DDA, 0xE0CA, 0x7DDD, 0xF2FD, 0x7DDE, 0xD3B0, 0x7DE0, 0xF4F3,\n\t0x7DE1, 0xDAC9, 0x7DE3, 0xE6DE, 0x7DE8, 0xF8BA, 0x7DE9, 0xE8D0,\t0x7DEC, 0xD8FB, 0x7DEF, 0xEAD5, 0x7DF4, 0xD6A3, 0x7DFB, 0xF6C6,\n\t0x7E09, 0xF2DB, 0x7E0A, 0xE4FC, 0x7E15, 0xE8B2, 0x7E1B, 0xDADA,\t0x7E1D, 0xF2DC, 0x7E1E, 0xFBD6, 0x7E1F, 0xE9B2, 0x7E21, 0xEEAD,\n\t0x7E23, 0xFAE3, 0x7E2B, 0xDCEE, 0x7E2E, 0xF5EA, 0x7E2F, 0xE6E0,\t0x7E31, 0xF0FD, 0x7E37, 0xD7AC, 0x7E3D, 0xF5C5, 0x7E3E, 0xEEE0,\n\t0x7E41, 0xDBE5, 0x7E43, 0xDDDE, 0x7E46, 0xD9F0, 0x7E47, 0xE9A3,\t0x7E52, 0xF1F9, 0x7E54, 0xF2C4, 0x7E55, 0xE0CB, 0x7E5E, 0xE9A4,\n\t0x7E61, 0xE2B9, 0x7E69, 0xE3B1, 0x7E6A, 0xFCEB, 0x7E6B, 0xCDA8,\t0x7E6D, 0xCCB6, 0x7E70, 0xF0DB, 0x7E79, 0xE6BA, 0x7E7C, 0xCDA9,\n\t0x7E82, 0xF3C3, 0x7E8C, 0xE1D9, 0x7E8F, 0xEFAB, 0x7E93, 0xE7C5,\t0x7E96, 0xE0E9, 0x7E98, 0xF3C5, 0x7E9B, 0xD4C0, 0x7E9C, 0xD5BF,\n\t0x7F36, 0xDDAE, 0x7F38, 0xF9FC, 0x7F3A, 0xCCC0, 0x7F4C, 0xE5A2,\t0x7F50, 0xCEB8, 0x7F54, 0xD8D2, 0x7F55, 0xF9D6, 0x7F6A, 0xF1AA,\n\t0x7F6B, 0xCED1, 0x7F6E, 0xF6C7, 0x7F70, 0xDBEB, 0x7F72, 0xDFFE,\t0x7F75, 0xD8E1, 0x7F77, 0xF7F3, 0x7F79, 0xD7E7, 0x7F85, 0xD4FE,\n\t0x7F88, 0xD1BC, 0x7F8A, 0xE5CF, 0x7F8C, 0xCBB6, 0x7F8E, 0xDAB8,\t0x7F94, 0xCDC4, 0x7F9A, 0xD6BE, 0x7F9E, 0xE2BA, 0x7FA4, 0xCFD8,\n\t0x7FA8, 0xE0CC, 0x7FA9, 0xEBF9, 0x7FB2, 0xFDFD, 0x7FB8, 0xD7E8,\t0x7FB9, 0xCBD8, 0x7FBD, 0xE9E2, 0x7FC1, 0xE8BA, 0x7FC5, 0xE3C7,\n\t0x7FCA, 0xECCD, 0x7FCC, 0xECCE, 0x7FCE, 0xD6BF, 0x7FD2, 0xE3A7,\t0x7FD4, 0xDFD6, 0x7FD5, 0xFDE8, 0x7FDF, 0xEEE1, 0x7FE0, 0xF6A8,\n\t0x7FE1, 0xDDFD, 0x7FE9, 0xF8BB, 0x7FEB, 0xE8D1, 0x7FF0, 0xF9D7,\t0x7FF9, 0xCEEE, 0x7FFC, 0xECCF, 0x8000, 0xE9A5, 0x8001, 0xD6D5,\n\t0x8003, 0xCDC5, 0x8005, 0xEDBA, 0x8006, 0xD1BD, 0x8009, 0xCFBE,\t0x800C, 0xECBB, 0x8010, 0xD2B1, 0x8015, 0xCCE9, 0x8017, 0xD9C4,\n\t0x8018, 0xE9FC, 0x802D, 0xD1BE, 0x8033, 0xECBC, 0x8036, 0xE5AD,\t0x803D, 0xF7B0, 0x803F, 0xCCEA, 0x8043, 0xD3C4, 0x8046, 0xD6C0,\n\t0x804A, 0xD6FD, 0x8056, 0xE1A1, 0x8058, 0xDEBD, 0x805A, 0xF6A9,\t0x805E, 0xDAA4, 0x806F, 0xD6A4, 0x8070, 0xF5C6, 0x8072, 0xE1A2,\n\t0x8073, 0xE9C6, 0x8077, 0xF2C5, 0x807D, 0xF4E9, 0x807E, 0xD6EC,\t0x807F, 0xEBD3, 0x8084, 0xECBD, 0x8085, 0xE2DC, 0x8086, 0xDEEB,\n\t0x8087, 0xF0DC, 0x8089, 0xEBBF, 0x808B, 0xD7CE, 0x808C, 0xD1BF,\t0x8096, 0xF5AB, 0x809B, 0xF9FD, 0x809D, 0xCADC, 0x80A1, 0xCDC6,\n\t0x80A2, 0xF2B6, 0x80A5, 0xDDFE, 0x80A9, 0xCCB7, 0x80AA, 0xDBB8,\t0x80AF, 0xD0E9, 0x80B1, 0xCEDD, 0x80B2, 0xEBC0, 0x80B4, 0xFDA2,\n\t0x80BA, 0xF8CB, 0x80C3, 0xEAD6, 0x80C4, 0xF1B0, 0x80CC, 0xDBCE,\t0x80CE, 0xF7C3, 0x80DA, 0xDBCF, 0x80DB, 0xCBA4, 0x80DE, 0xF8E0,\n\t0x80E1, 0xFBD7, 0x80E4, 0xEBCA, 0x80E5, 0xE0A1, 0x80F1, 0xCECD,\t0x80F4, 0xD4DC, 0x80F8, 0xFDD8, 0x80FD, 0xD2F6, 0x8102, 0xF2B7,\n\t0x8105, 0xFAF6, 0x8106, 0xF6AA, 0x8107, 0xFAF7, 0x8108, 0xD8E6,\t0x810A, 0xF4B1, 0x8118, 0xE8D2, 0x811A, 0xCAC5, 0x811B, 0xCCEB,\n\t0x8123, 0xE2EE, 0x8129, 0xE2BB, 0x812B, 0xF7AD, 0x812F, 0xF8E1,\t0x8139, 0xF3EC, 0x813E, 0xDEA1, 0x814B, 0xE4FD, 0x814E, 0xE3EC,\n\t0x8150, 0xDDAF, 0x8151, 0xDDB0, 0x8154, 0xCBB7, 0x8155, 0xE8D3,\t0x8165, 0xE1A3, 0x8166, 0xD2E0, 0x816B, 0xF0FE, 0x8170, 0xE9A6,\n\t0x8171, 0xCBF2, 0x8178, 0xEDF3, 0x8179, 0xDCD9, 0x817A, 0xE0CD,\t0x817F, 0xF7DA, 0x8180, 0xDBB9, 0x8188, 0xCCAE, 0x818A, 0xDADB,\n\t0x818F, 0xCDC7, 0x819A, 0xDDB1, 0x819C, 0xD8AF, 0x819D, 0xE3A3,\t0x81A0, 0xCEEF, 0x81A3, 0xF2F3, 0x81A8, 0xF8B3, 0x81B3, 0xE0CE,\n\t0x81B5, 0xF5FD, 0x81BA, 0xEBEC, 0x81BD, 0xD3C5, 0x81BE, 0xFCEC,\t0x81BF, 0xD2DB, 0x81C0, 0xD4EB, 0x81C2, 0xDEA2, 0x81C6, 0xE5E6,\n\t0x81CD, 0xF0B0, 0x81D8, 0xD5C4, 0x81DF, 0xEDF4, 0x81E3, 0xE3ED,\t0x81E5, 0xE8C2, 0x81E7, 0xEDF5, 0x81E8, 0xD7FC, 0x81EA, 0xEDBB,\n\t0x81ED, 0xF6AB, 0x81F3, 0xF2B8, 0x81F4, 0xF6C8, 0x81FA, 0xD3E6,\t0x81FB, 0xF2DD, 0x81FC, 0xCFBF, 0x81FE, 0xEBAC, 0x8205, 0xCFC0,\n\t0x8207, 0xE6A8, 0x8208, 0xFDE9, 0x820A, 0xCFC1, 0x820C, 0xE0DF,\t0x820D, 0xDEEC, 0x8212, 0xE0A2, 0x821B, 0xF4BF, 0x821C, 0xE2EF,\n\t0x821E, 0xD9F1, 0x821F, 0xF1C7, 0x8221, 0xCBB8, 0x822A, 0xF9FE,\t0x822B, 0xDBBA, 0x822C, 0xDAF5, 0x8235, 0xF6EC, 0x8236, 0xDADC,\n\t0x8237, 0xFAE4, 0x8239, 0xE0CF, 0x8240, 0xDDB2, 0x8245, 0xE6A9,\t0x8247, 0xEFF3, 0x8259, 0xF3ED, 0x8264, 0xEBFA, 0x8266, 0xF9E6,\n\t0x826E, 0xCADD, 0x826F, 0xD5DE, 0x8271, 0xCADE, 0x8272, 0xDFE4,\t0x8276, 0xE6FD, 0x8278, 0xF5AC, 0x827E, 0xE4F5, 0x828B, 0xE9E3,\n\t0x828D, 0xEDCB, 0x828E, 0xCFE4, 0x8292, 0xD8D3, 0x8299, 0xDDB3,\t0x829A, 0xD4EC, 0x829D, 0xF2B9, 0x829F, 0xDFB7, 0x82A5, 0xCBCE,\n\t0x82A6, 0xFBD8, 0x82A9, 0xD0D9, 0x82AC, 0xDDD2, 0x82AD, 0xF7F4,\t0x82AE, 0xE7DC, 0x82AF, 0xE4A5, 0x82B1, 0xFCA3, 0x82B3, 0xDBBB,\n\t0x82B7, 0xF2BA, 0x82B8, 0xE9FD, 0x82B9, 0xD0CA, 0x82BB, 0xF5D6,\t0x82BC, 0xD9C5, 0x82BD, 0xE4B4, 0x82BF, 0xEDA7, 0x82D1, 0xEABD,\n\t0x82D2, 0xE6FE, 0x82D4, 0xF7C4, 0x82D5, 0xF5AD, 0x82D7, 0xD9E0,\t0x82DB, 0xCAB4, 0x82DE, 0xF8E2, 0x82DF, 0xCFC2, 0x82E1, 0xECBE,\n\t0x82E5, 0xE5B4, 0x82E6, 0xCDC8, 0x82E7, 0xEEC8, 0x82F1, 0xE7C8,\t0x82FD, 0xCDC9, 0x82FE, 0xF9B7, 0x8301, 0xF1E8, 0x8302, 0xD9F2,\n\t0x8303, 0xDBF5, 0x8304, 0xCAB5, 0x8305, 0xD9C6, 0x8309, 0xD8C9,\t0x8317, 0xD9AB, 0x8328, 0xEDBC, 0x832B, 0xD8D4, 0x832F, 0xDCDA,\n\t0x8331, 0xE2BC, 0x8334, 0xFCED, 0x8335, 0xECE0, 0x8336, 0xD2FE,\t0x8338, 0xE9C7, 0x8339, 0xE6AA, 0x8340, 0xE2F0, 0x8347, 0xFABB,\n\t0x8349, 0xF5AE, 0x834A, 0xFBAA, 0x834F, 0xECFB, 0x8351, 0xECBF,\t0x8352, 0xFCD8, 0x8373, 0xD4E5, 0x8377, 0xF9C3, 0x837B, 0xEEE2,\n\t0x8389, 0xD7E9, 0x838A, 0xEDF6, 0x838E, 0xDEED, 0x8396, 0xCCEC,\t0x8398, 0xE3EE, 0x839E, 0xE8D4, 0x83A2, 0xFAF8, 0x83A9, 0xDDB4,\n\t0x83AA, 0xE4B5, 0x83AB, 0xD8B0, 0x83BD, 0xD8D5, 0x83C1, 0xF4EA,\t0x83C5, 0xCEB9, 0x83C9, 0xD6E1, 0x83CA, 0xCFD2, 0x83CC, 0xD0B6,\n\t0x83D3, 0xCEA2, 0x83D6, 0xF3EE, 0x83DC, 0xF3F8, 0x83E9, 0xDCCC,\t0x83EB, 0xD0CB, 0x83EF, 0xFCA4, 0x83F0, 0xCDCA, 0x83F1, 0xD7D4,\n\t0x83F2, 0xDEA3, 0x83F4, 0xE4E0, 0x83F9, 0xEEC9, 0x83FD, 0xE2DD,\t0x8403, 0xF5FE, 0x8404, 0xD4AC, 0x840A, 0xD5D1, 0x840C, 0xD8F0,\n\t0x840D, 0xF8C3, 0x840E, 0xEAD7, 0x8429, 0xF5D7, 0x842C, 0xD8BF,\t0x8431, 0xFDC0, 0x8438, 0xEBAD, 0x843D, 0xD5AA, 0x8449, 0xE7A8,\n\t0x8457, 0xEECA, 0x845B, 0xCAE7, 0x8461, 0xF8E3, 0x8463, 0xD4DD,\t0x8466, 0xEAD8, 0x846B, 0xFBD9, 0x846C, 0xEDF7, 0x846F, 0xE5B5,\n\t0x8475, 0xD0AD, 0x847A, 0xF1F1, 0x8490, 0xE2BD, 0x8494, 0xE3C8,\t0x8499, 0xD9D5, 0x849C, 0xDFAA, 0x84A1, 0xDBBC, 0x84B2, 0xF8E4,\n\t0x84B8, 0xF1FA, 0x84BB, 0xE5B6, 0x84BC, 0xF3EF, 0x84BF, 0xFBDA,\t0x84C0, 0xE1E0, 0x84C2, 0xD9AC, 0x84C4, 0xF5EB, 0x84C6, 0xE0B6,\n\t0x84C9, 0xE9C8, 0x84CB, 0xCBCF, 0x84CD, 0xE3C9, 0x84D1, 0xDEEE,\t0x84DA, 0xE2BE, 0x84EC, 0xDCEF, 0x84EE, 0xD6A5, 0x84F4, 0xE2F1,\n\t0x84FC, 0xD6FE, 0x8511, 0xD9A1, 0x8513, 0xD8C0, 0x8514, 0xDCDB,\t0x8517, 0xEDBD, 0x8518, 0xDFB8, 0x851A, 0xEAA5, 0x851E, 0xD7AD,\n\t0x8521, 0xF3F9, 0x8523, 0xEDF8, 0x8525, 0xF5C7, 0x852C, 0xE1CA,\t0x852D, 0xEBE3, 0x852F, 0xF2DE, 0x853D, 0xF8CC, 0x853F, 0xEAD9,\n\t0x8541, 0xD3C6, 0x8543, 0xDBE6, 0x8549, 0xF5AF, 0x854E, 0xCEF0,\t0x8553, 0xE9FE, 0x8559, 0xFBB6, 0x8563, 0xE2F2, 0x8568, 0xCFF2,\n\t0x8569, 0xF7B9, 0x856A, 0xD9F3, 0x856D, 0xE1CB, 0x8584, 0xDADD,\t0x8587, 0xDAB9, 0x858F, 0xEBFB, 0x8591, 0xCBB9, 0x8594, 0xEDF9,\n\t0x859B, 0xE0E0, 0x85A6, 0xF4C0, 0x85A8, 0xFDBC, 0x85A9, 0xDFB1,\t0x85AA, 0xE3EF, 0x85AF, 0xE0A3, 0x85B0, 0xFDB9, 0x85BA, 0xF0B1,\n\t0x85C1, 0xCDCB, 0x85C9, 0xEDBE, 0x85CD, 0xD5C0, 0x85CE, 0xE3F0,\t0x85CF, 0xEDFA, 0x85D5, 0xE9E4, 0x85DC, 0xD5ED, 0x85DD, 0xE7DD,\n\t0x85E4, 0xD4F6, 0x85E5, 0xE5B7, 0x85E9, 0xDBE7, 0x85EA, 0xE2BF,\t0x85F7, 0xEECB, 0x85FA, 0xD7F4, 0x85FB, 0xF0DD, 0x85FF, 0xCEAB,\n\t0x8602, 0xE7DE, 0x8606, 0xD6D6, 0x8607, 0xE1CC, 0x860A, 0xE8B3,\t0x8616, 0xE5EE, 0x8617, 0xDCA2, 0x861A, 0xE0D0, 0x862D, 0xD5B5,\n\t0x863F, 0xD5A1, 0x864E, 0xFBDB, 0x8650, 0xF9CB, 0x8654, 0xCBF3,\t0x8655, 0xF4A5, 0x865B, 0xFAC8, 0x865C, 0xD6D7, 0x865E, 0xE9E5,\n\t0x865F, 0xFBDC, 0x8667, 0xFDD0, 0x8679, 0xFBF6, 0x868A, 0xDAA5,\t0x868C, 0xDBBD, 0x8693, 0xECE2, 0x86A3, 0xCDF7, 0x86A4, 0xF0DE,\n\t0x86A9, 0xF6C9, 0x86C7, 0xDEEF, 0x86CB, 0xD3B1, 0x86D4, 0xFCEE,\t0x86D9, 0xE8C3, 0x86DB, 0xF1C8, 0x86DF, 0xCEF1, 0x86E4, 0xF9ED,\n\t0x86ED, 0xF2F4, 0x86FE, 0xE4B6, 0x8700, 0xF5B9, 0x8702, 0xDCF0,\t0x8703, 0xE3F1, 0x8708, 0xE8A5, 0x8718, 0xF2BB, 0x871A, 0xDEA4,\n\t0x871C, 0xDACC, 0x874E, 0xCAE9, 0x8755, 0xE3DA, 0x8757, 0xFCD9,\t0x875F, 0xEADA, 0x8766, 0xF9C4, 0x8768, 0xE3A4, 0x8774, 0xFBDD,\n\t0x8776, 0xEFCA, 0x8778, 0xE8C4, 0x8782, 0xD5CC, 0x878D, 0xEBD7,\t0x879F, 0xD9AD, 0x87A2, 0xFBAB, 0x87B3, 0xD3D9, 0x87BA, 0xD5A2,\n\t0x87C4, 0xF6DE, 0x87E0, 0xDAF6, 0x87EC, 0xE0D1, 0x87EF, 0xE9A8,\t0x87F2, 0xF5F9, 0x87F9, 0xFAAF, 0x87FB, 0xEBFC, 0x87FE, 0xE0EA,\n\t0x8805, 0xE3B2, 0x881F, 0xD5C5, 0x8822, 0xF1E3, 0x8823, 0xD5EE,\t0x8831, 0xCDCC, 0x8836, 0xEDD9, 0x883B, 0xD8C1, 0x8840, 0xFAEC,\n\t0x8846, 0xF1EB, 0x884C, 0xFABC, 0x884D, 0xE6E2, 0x8852, 0xFAE5,\t0x8853, 0xE2FA, 0x8857, 0xCAB6, 0x8859, 0xE4B7, 0x885B, 0xEADB,\n\t0x885D, 0xF5FA, 0x8861, 0xFBAC, 0x8862, 0xCFC3, 0x8863, 0xEBFD,\t0x8868, 0xF8FA, 0x886B, 0xDFB9, 0x8870, 0xE1F1, 0x8872, 0xD2A4,\n\t0x8877, 0xF5FB, 0x887E, 0xD0DA, 0x887F, 0xD0DB, 0x8881, 0xEABE,\t0x8882, 0xD9B1, 0x8888, 0xCAB7, 0x888B, 0xD3E7, 0x888D, 0xF8E5,\n\t0x8892, 0xD3B2, 0x8896, 0xE2C0, 0x8897, 0xF2DF, 0x889E, 0xCDE5,\t0x88AB, 0xF9AC, 0x88B4, 0xCDCD, 0x88C1, 0xEEAE, 0x88C2, 0xD6AE,\n\t0x88CF, 0xD7EA, 0x88D4, 0xE7E0, 0x88D5, 0xEBAE, 0x88D9, 0xCFD9,\t0x88DC, 0xDCCD, 0x88DD, 0xEDFB, 0x88DF, 0xDEF0, 0x88E1, 0xD7EB,\n\t0x88E8, 0xDEA5, 0x88F3, 0xDFD7, 0x88F4, 0xDBD0, 0x88F5, 0xDBD1,\t0x88F8, 0xD5A3, 0x88FD, 0xF0B2, 0x8907, 0xDCDC, 0x8910, 0xCAE8,\n\t0x8912, 0xF8E6, 0x8913, 0xDCCE, 0x8918, 0xEADC, 0x8919, 0xDBD2,\t0x8925, 0xE9B3, 0x892A, 0xF7DB, 0x8936, 0xE3A8, 0x8938, 0xD7AE,\n\t0x893B, 0xE0E1, 0x8941, 0xCBBA, 0x8944, 0xE5D1, 0x895F, 0xD0DC,\t0x8964, 0xD5C1, 0x896A, 0xD8CA, 0x8972, 0xE3A9, 0x897F, 0xE0A4,\n\t0x8981, 0xE9A9, 0x8983, 0xD3C7, 0x8986, 0xDCDD, 0x8987, 0xF8AE,\t0x898B, 0xCCB8, 0x898F, 0xD0AE, 0x8993, 0xD8F2, 0x8996, 0xE3CA,\n\t0x89A1, 0xCCAF, 0x89A9, 0xD4AD, 0x89AA, 0xF6D1, 0x89B2, 0xD0CC,\t0x89BA, 0xCAC6, 0x89BD, 0xD5C2, 0x89C0, 0xCEBA, 0x89D2, 0xCAC7,\n\t0x89E3, 0xFAB0, 0x89F4, 0xDFD8, 0x89F8, 0xF5BA, 0x8A00, 0xE5EB,\t0x8A02, 0xEFF4, 0x8A03, 0xDDB5, 0x8A08, 0xCDAA, 0x8A0A, 0xE3F2,\n\t0x8A0C, 0xFBF7, 0x8A0E, 0xF7D0, 0x8A13, 0xFDBA, 0x8A16, 0xFDE1,\t0x8A17, 0xF6FE, 0x8A18, 0xD1C0, 0x8A1B, 0xE8C5, 0x8A1D, 0xE4B8,\n\t0x8A1F, 0xE1E8, 0x8A23, 0xCCC1, 0x8A25, 0xD2ED, 0x8A2A, 0xDBBE,\t0x8A2D, 0xE0E2, 0x8A31, 0xFAC9, 0x8A34, 0xE1CD, 0x8A36, 0xCAB8,\n\t0x8A3A, 0xF2E0, 0x8A3B, 0xF1C9, 0x8A50, 0xDEF1, 0x8A54, 0xF0DF,\t0x8A55, 0xF8C4, 0x8A5B, 0xEECC, 0x8A5E, 0xDEF2, 0x8A60, 0xE7C9,\n\t0x8A62, 0xE2F3, 0x8A63, 0xE7E1, 0x8A66, 0xE3CB, 0x8A69, 0xE3CC,\t0x8A6D, 0xCFF8, 0x8A6E, 0xEFAC, 0x8A70, 0xFDFE, 0x8A71, 0xFCA5,\n\t0x8A72, 0xFAB1, 0x8A73, 0xDFD9, 0x8A75, 0xE0D2, 0x8A79, 0xF4DA,\t0x8A85, 0xF1CA, 0x8A87, 0xCEA3, 0x8A8C, 0xF2BC, 0x8A8D, 0xECE3,\n\t0x8A93, 0xE0A5, 0x8A95, 0xF7AB, 0x8A98, 0xEBAF, 0x8A9E, 0xE5DE,\t0x8AA0, 0xE1A4, 0x8AA1, 0xCDAB, 0x8AA3, 0xD9F4, 0x8AA4, 0xE8A6,\n\t0x8AA5, 0xCDCE, 0x8AA6, 0xE1E9, 0x8AA8, 0xFCEF, 0x8AAA, 0xE0E3,\t0x8AB0, 0xE2C1, 0x8AB2, 0xCEA4, 0x8AB9, 0xDEA6, 0x8ABC, 0xEBFE,\n\t0x8ABE, 0xEBDD, 0x8ABF, 0xF0E0, 0x8AC2, 0xF4DB, 0x8AC4, 0xE2F4,\t0x8AC7, 0xD3C8, 0x8ACB, 0xF4EB, 0x8ACD, 0xEEB5, 0x8ACF, 0xF5D8,\n\t0x8AD2, 0xD5DF, 0x8AD6, 0xD6E5, 0x8ADB, 0xEBB0, 0x8ADC, 0xF4E3,\t0x8AE1, 0xE3CD, 0x8AE6, 0xF4F4, 0x8AE7, 0xFAB2, 0x8AEA, 0xEFF5,\n\t0x8AEB, 0xCADF, 0x8AED, 0xEBB1, 0x8AEE, 0xEDBF, 0x8AF1, 0xFDC9,\t0x8AF6, 0xE4A6, 0x8AF7, 0xF9A4, 0x8AF8, 0xF0B3, 0x8AFA, 0xE5EC,\n\t0x8AFE, 0xD1E7, 0x8B00, 0xD9C7, 0x8B01, 0xE4D7, 0x8B02, 0xEADD,\t0x8B04, 0xD4F7, 0x8B0E, 0xDABA, 0x8B10, 0xDACD, 0x8B14, 0xF9CC,\n\t0x8B16, 0xE1DA, 0x8B17, 0xDBBF, 0x8B19, 0xCCC5, 0x8B1A, 0xECD0,\t0x8B1B, 0xCBBB, 0x8B1D, 0xDEF3, 0x8B20, 0xE9AA, 0x8B28, 0xD9C8,\n\t0x8B2B, 0xEEE3, 0x8B2C, 0xD7BD, 0x8B33, 0xCFC4, 0x8B39, 0xD0CD,\t0x8B41, 0xFCA6, 0x8B49, 0xF1FB, 0x8B4E, 0xFDD2, 0x8B4F, 0xD1C1,\n\t0x8B58, 0xE3DB, 0x8B5A, 0xD3C9, 0x8B5C, 0xDCCF, 0x8B66, 0xCCED,\t0x8B6C, 0xDEA7, 0x8B6F, 0xE6BB, 0x8B70, 0xECA1, 0x8B74, 0xCCB9,\n\t0x8B77, 0xFBDE, 0x8B7D, 0xE7E2, 0x8B80, 0xD4C1, 0x8B8A, 0xDCA8,\t0x8B90, 0xE2C2, 0x8B92, 0xF3D8, 0x8B93, 0xE5D3, 0x8B96, 0xF3D9,\n\t0x8B9A, 0xF3C6, 0x8C37, 0xCDDB, 0x8C3F, 0xCDAC, 0x8C41, 0xFCC3,\t0x8C46, 0xD4E7, 0x8C48, 0xD1C2, 0x8C4A, 0xF9A5, 0x8C4C, 0xE8D5,\n\t0x8C55, 0xE3CE, 0x8C5A, 0xD4CA, 0x8C61, 0xDFDA, 0x8C6A, 0xFBDF,\t0x8C6B, 0xE7E3, 0x8C79, 0xF8FB, 0x8C7A, 0xE3CF, 0x8C82, 0xF5B0,\n\t0x8C8A, 0xD8E7, 0x8C8C, 0xD9C9, 0x8C9D, 0xF8AF, 0x8C9E, 0xEFF6,\t0x8CA0, 0xDDB6, 0x8CA1, 0xEEAF, 0x8CA2, 0xCDF8, 0x8CA7, 0xDEB8,\n\t0x8CA8, 0xFCA7, 0x8CA9, 0xF7FC, 0x8CAA, 0xF7B1, 0x8CAB, 0xCEBB,\t0x8CAC, 0xF4A1, 0x8CAF, 0xEECD, 0x8CB0, 0xE1AE, 0x8CB3, 0xECC3,\n\t0x8CB4, 0xCFFE, 0x8CB6, 0xF8BF, 0x8CB7, 0xD8E2, 0x8CB8, 0xD3E8,\t0x8CBB, 0xDEA8, 0x8CBC, 0xF4E4, 0x8CBD, 0xECC2, 0x8CBF, 0xD9F5,\n\t0x8CC0, 0xF9C5, 0x8CC1, 0xDDD3, 0x8CC2, 0xD6F1, 0x8CC3, 0xECFC,\t0x8CC4, 0xFCF0, 0x8CC7, 0xEDC0, 0x8CC8, 0xCAB9, 0x8CCA, 0xEEE4,\n\t0x8CD1, 0xF2E1, 0x8CD3, 0xDEB9, 0x8CDA, 0xD6F2, 0x8CDC, 0xDEF4,\t0x8CDE, 0xDFDB, 0x8CE0, 0xDBD3, 0x8CE2, 0xFAE7, 0x8CE3, 0xD8E3,\n\t0x8CE4, 0xF4C1, 0x8CE6, 0xDDB7, 0x8CEA, 0xF2F5, 0x8CED, 0xD4AE,\t0x8CF4, 0xD6F3, 0x8CFB, 0xDDB8, 0x8CFC, 0xCFC5, 0x8CFD, 0xDFDF,\n\t0x8D04, 0xF2BE, 0x8D05, 0xF6A1, 0x8D07, 0xEBCB, 0x8D08, 0xF1FC,\t0x8D0A, 0xF3C7, 0x8D0D, 0xE0EB, 0x8D13, 0xEDFC, 0x8D16, 0xE1DB,\n\t0x8D64, 0xEEE5, 0x8D66, 0xDEF5, 0x8D6B, 0xFAD3, 0x8D70, 0xF1CB,\t0x8D73, 0xD0AF, 0x8D74, 0xDDB9, 0x8D77, 0xD1C3, 0x8D85, 0xF5B1,\n\t0x8D8A, 0xEAC6, 0x8D99, 0xF0E1, 0x8DA3, 0xF6AC, 0x8DA8, 0xF5D9,\t0x8DB3, 0xF0EB, 0x8DBA, 0xDDBA, 0x8DBE, 0xF2BF, 0x8DC6, 0xF7C5,\n\t0x8DCB, 0xDBA2, 0x8DCC, 0xF2F6, 0x8DCF, 0xCABA, 0x8DDB, 0xF7F5,\t0x8DDD, 0xCBE5, 0x8DE1, 0xEEE6, 0x8DE3, 0xE0D3, 0x8DE8, 0xCEA5,\n\t0x8DEF, 0xD6D8, 0x8DF3, 0xD4AF, 0x8E0A, 0xE9C9, 0x8E0F, 0xD3CE,\t0x8E10, 0xF4C2, 0x8E1E, 0xCBE6, 0x8E2A, 0xF1A1, 0x8E30, 0xEBB2,\n\t0x8E35, 0xF1A2, 0x8E42, 0xEBB3, 0x8E44, 0xF0B4, 0x8E47, 0xCBF4,\t0x8E48, 0xD4B0, 0x8E49, 0xF3B2, 0x8E4A, 0xFBB7, 0x8E59, 0xF5EC,\n\t0x8E5F, 0xEEE7, 0x8E60, 0xF4B2, 0x8E74, 0xF5ED, 0x8E76, 0xCFF3,\t0x8E81, 0xF0E2, 0x8E87, 0xEECE, 0x8E8A, 0xF1CC, 0x8E8D, 0xE5B8,\n\t0x8EAA, 0xD7F5, 0x8EAB, 0xE3F3, 0x8EAC, 0xCFE5, 0x8EC0, 0xCFC6,\t0x8ECA, 0xF3B3, 0x8ECB, 0xE4D8, 0x8ECC, 0xCFF9, 0x8ECD, 0xCFDA,\n\t0x8ED2, 0xFACD, 0x8EDF, 0xE6E3, 0x8EEB, 0xF2E2, 0x8EF8, 0xF5EE,\t0x8EFB, 0xCABB, 0x8EFE, 0xE3DC, 0x8F03, 0xCEF2, 0x8F05, 0xD6D9,\n\t0x8F09, 0xEEB0, 0x8F12, 0xF4E5, 0x8F13, 0xD8C2, 0x8F14, 0xDCD0,\t0x8F15, 0xCCEE, 0x8F1B, 0xD5E0, 0x8F1C, 0xF6CA, 0x8F1D, 0xFDCA,\n\t0x8F1E, 0xD8D6, 0x8F1F, 0xF4CF, 0x8F26, 0xD6A6, 0x8F27, 0xDCBE,\t0x8F29, 0xDBD4, 0x8F2A, 0xD7C7, 0x8F2F, 0xF2FE, 0x8F33, 0xF1CD,\n\t0x8F38, 0xE2C3, 0x8F39, 0xDCDE, 0x8F3B, 0xDCDF, 0x8F3E, 0xEFAD,\t0x8F3F, 0xE6AB, 0x8F44, 0xF9DD, 0x8F45, 0xEABF, 0x8F49, 0xEFAE,\n\t0x8F4D, 0xF4D0, 0x8F4E, 0xCEF3, 0x8F5D, 0xE6AC, 0x8F5F, 0xCEDE,\t0x8F62, 0xD5F9, 0x8F9B, 0xE3F4, 0x8F9C, 0xCDD0, 0x8FA3, 0xD5B8,\n\t0x8FA6, 0xF7FD, 0x8FA8, 0xDCA9, 0x8FAD, 0xDEF6, 0x8FAF, 0xDCAA,\t0x8FB0, 0xF2E3, 0x8FB1, 0xE9B4, 0x8FB2, 0xD2DC, 0x8FC2, 0xE9E6,\n\t0x8FC5, 0xE3F6, 0x8FCE, 0xE7CA, 0x8FD1, 0xD0CE, 0x8FD4, 0xDAF7,\t0x8FE6, 0xCABC, 0x8FEA, 0xEEE8, 0x8FEB, 0xDADE, 0x8FED, 0xF2F7,\n\t0x8FF0, 0xE2FB, 0x8FF2, 0xCCA6, 0x8FF7, 0xDABB, 0x8FF9, 0xEEE9,\t0x8FFD, 0xF5DA, 0x9000, 0xF7DC, 0x9001, 0xE1EA, 0x9002, 0xCEC1,\n\t0x9003, 0xD4B1, 0x9005, 0xFDB1, 0x9006, 0xE6BD, 0x9008, 0xFBAD,\t0x900B, 0xF8E7, 0x900D, 0xE1CE, 0x900F, 0xF7E2, 0x9010, 0xF5EF,\n\t0x9011, 0xCFC7, 0x9014, 0xD4B2, 0x9015, 0xCCEF, 0x9017, 0xD4E8,\t0x9019, 0xEECF, 0x901A, 0xF7D7, 0x901D, 0xE0A6, 0x901E, 0xD6C1,\n\t0x901F, 0xE1DC, 0x9020, 0xF0E3, 0x9021, 0xF1E4, 0x9022, 0xDCF1,\t0x9023, 0xD6A7, 0x902E, 0xF4F5, 0x9031, 0xF1CE, 0x9032, 0xF2E4,\n\t0x9035, 0xD0B0, 0x9038, 0xECEF, 0x903C, 0xF9BA, 0x903E, 0xEBB5,\t0x9041, 0xD4ED, 0x9042, 0xE2C4, 0x9047, 0xE9E7, 0x904A, 0xEBB4,\n\t0x904B, 0xEAA1, 0x904D, 0xF8BC, 0x904E, 0xCEA6, 0x9050, 0xF9C6,\t0x9051, 0xFCDA, 0x9053, 0xD4B3, 0x9054, 0xD3B9, 0x9055, 0xEADE,\n\t0x9059, 0xE9AB, 0x905C, 0xE1E1, 0x905D, 0xD3CF, 0x905E, 0xF4F6,\t0x9060, 0xEAC0, 0x9061, 0xE1CF, 0x9063, 0xCCBA, 0x9069, 0xEEEA,\n\t0x906D, 0xF0E4, 0x906E, 0xF3B4, 0x906F, 0xD4EE, 0x9072, 0xF2C0,\t0x9075, 0xF1E5, 0x9077, 0xF4C3, 0x9078, 0xE0D4, 0x907A, 0xEBB6,\n\t0x907C, 0xD7A1, 0x907D, 0xCBE8, 0x907F, 0xF9AD, 0x9080, 0xE9AD,\t0x9081, 0xD8E4, 0x9082, 0xFAB3, 0x9083, 0xE2C5, 0x9084, 0xFCBD,\n\t0x9087, 0xECC4, 0x9088, 0xD8B1, 0x908A, 0xDCAB, 0x908F, 0xD5A4,\t0x9091, 0xEBE9, 0x9095, 0xE8BB, 0x9099, 0xD8D7, 0x90A2, 0xFBAE,\n\t0x90A3, 0xD1E1, 0x90A6, 0xDBC0, 0x90A8, 0xF5BE, 0x90AA, 0xDEF7,\t0x90AF, 0xCAFB, 0x90B0, 0xF7C6, 0x90B1, 0xCFC8, 0x90B5, 0xE1D0,\n\t0x90B8, 0xEED0, 0x90C1, 0xE9F4, 0x90CA, 0xCEF4, 0x90DE, 0xD5CD,\t0x90E1, 0xCFDB, 0x90E8, 0xDDBB, 0x90ED, 0xCEAC, 0x90F5, 0xE9E8,\n\t0x90FD, 0xD4B4, 0x9102, 0xE4C7, 0x9112, 0xF5DB, 0x9115, 0xFAC1,\t0x9119, 0xDEA9, 0x9127, 0xD4F8, 0x912D, 0xEFF7, 0x9132, 0xD3B3,\n\t0x9149, 0xEBB7, 0x914A, 0xEFF8, 0x914B, 0xF5DC, 0x914C, 0xEDCC,\t0x914D, 0xDBD5, 0x914E, 0xF1CF, 0x9152, 0xF1D0, 0x9162, 0xF5B2,\n\t0x9169, 0xD9AE, 0x916A, 0xD5AC, 0x916C, 0xE2C6, 0x9175, 0xFDA3,\t0x9177, 0xFBE5, 0x9178, 0xDFAB, 0x9187, 0xE2F5, 0x9189, 0xF6AD,\n\t0x918B, 0xF5B3, 0x918D, 0xF0B5, 0x9192, 0xE1A5, 0x919C, 0xF5DD,\t0x91AB, 0xECA2, 0x91AC, 0xEDFD, 0x91AE, 0xF5B4, 0x91AF, 0xFBB8,\n\t0x91B1, 0xDBA3, 0x91B4, 0xD6CA, 0x91B5, 0xCBD9, 0x91C0, 0xE5D4,\t0x91C7, 0xF3FA, 0x91C9, 0xEBB8, 0x91CB, 0xE0B7, 0x91CC, 0xD7EC,\n\t0x91CD, 0xF1EC, 0x91CE, 0xE5AF, 0x91CF, 0xD5E1, 0x91D0, 0xD7ED,\t0x91D1, 0xD1D1, 0x91D7, 0xE1F2, 0x91D8, 0xEFF9, 0x91DC, 0xDDBC,\n\t0x91DD, 0xF6DC, 0x91E3, 0xF0E5, 0x91E7, 0xF4C4, 0x91EA, 0xE9E9,\t0x91F5, 0xF3FB, 0x920D, 0xD4EF, 0x9210, 0xCCA2, 0x9211, 0xF7FE,\n\t0x9212, 0xDFBC, 0x9217, 0xEBCD, 0x921E, 0xD0B7, 0x9234, 0xD6C2,\t0x923A, 0xE8AD, 0x923F, 0xEFAF, 0x9240, 0xCBA5, 0x9245, 0xCBE9,\n\t0x9249, 0xFAE8, 0x9257, 0xCCC6, 0x925B, 0xE6E7, 0x925E, 0xEAC7,\t0x9262, 0xDBA4, 0x9264, 0xCFC9, 0x9265, 0xE2FC, 0x9266, 0xEFFA,\n\t0x9280, 0xEBDE, 0x9283, 0xF5C8, 0x9285, 0xD4DE, 0x9291, 0xE0D5,\t0x9293, 0xEFB0, 0x9296, 0xE2C7, 0x9298, 0xD9AF, 0x929C, 0xF9E7,\n\t0x92B3, 0xE7E5, 0x92B6, 0xCFCA, 0x92B7, 0xE1D1, 0x92B9, 0xE2C8,\t0x92CC, 0xEFFB, 0x92CF, 0xFAF9, 0x92D2, 0xDCF2, 0x92E4, 0xE0A7,\n\t0x92EA, 0xF8E8, 0x92F8, 0xCBEA, 0x92FC, 0xCBBC, 0x9304, 0xD6E2,\t0x9310, 0xF5DE, 0x9318, 0xF5DF, 0x931A, 0xEEB6, 0x931E, 0xE2F6,\n\t0x931F, 0xD3CA, 0x9320, 0xEFFC, 0x9321, 0xD1C4, 0x9322, 0xEFB1,\t0x9324, 0xD1C5, 0x9326, 0xD0DE, 0x9328, 0xD9E1, 0x932B, 0xE0B8,\n\t0x932E, 0xCDD1, 0x932F, 0xF3B9, 0x9348, 0xE7CC, 0x934A, 0xD6A8,\t0x934B, 0xCEA7, 0x934D, 0xD4B5, 0x9354, 0xE4C8, 0x935B, 0xD3B4,\n\t0x936E, 0xEBB9, 0x9375, 0xCBF5, 0x937C, 0xF6DD, 0x937E, 0xF1A3,\t0x938C, 0xCCC7, 0x9394, 0xE9CA, 0x9396, 0xE1F0, 0x939A, 0xF5E0,\n\t0x93A3, 0xFBAF, 0x93A7, 0xCBD1, 0x93AC, 0xFBE0, 0x93AD, 0xF2E5,\t0x93B0, 0xECF0, 0x93C3, 0xF0EC, 0x93D1, 0xEEEB, 0x93DE, 0xE9CB,\n\t0x93E1, 0xCCF0, 0x93E4, 0xD7AF, 0x93F6, 0xF3A1, 0x9404, 0xFCF5,\t0x9418, 0xF1A4, 0x9425, 0xE0D6, 0x942B, 0xEFB2, 0x9435, 0xF4D1,\n\t0x9438, 0xF7A1, 0x9444, 0xF1D1, 0x9451, 0xCAFC, 0x9452, 0xCAFD,\t0x945B, 0xCECE, 0x947D, 0xF3C8, 0x947F, 0xF3BA, 0x9577, 0xEDFE,\n\t0x9580, 0xDAA6, 0x9583, 0xE0EC, 0x9589, 0xF8CD, 0x958B, 0xCBD2,\t0x958F, 0xEBCE, 0x9591, 0xF9D8, 0x9592, 0xF9D9, 0x9593, 0xCAE0,\n\t0x9594, 0xDACA, 0x9598, 0xCBA6, 0x95A3, 0xCAC8, 0x95A4, 0xF9EE,\t0x95A5, 0xDBEC, 0x95A8, 0xD0B1, 0x95AD, 0xD5EF, 0x95B1, 0xE6F3,\n\t0x95BB, 0xE7A2, 0x95BC, 0xE4D9, 0x95C7, 0xE4E1, 0x95CA, 0xFCC4,\t0x95D4, 0xF9EF, 0x95D5, 0xCFF4, 0x95D6, 0xF7E6, 0x95DC, 0xCEBC,\n\t0x95E1, 0xF4C5, 0x95E2, 0xDCA3, 0x961C, 0xDDBD, 0x9621, 0xF4C6,\t0x962A, 0xF8A1, 0x962E, 0xE8D6, 0x9632, 0xDBC1, 0x963B, 0xF0E6,\n\t0x963F, 0xE4B9, 0x9640, 0xF6ED, 0x9642, 0xF9AE, 0x9644, 0xDDBE,\t0x964B, 0xD7B0, 0x964C, 0xD8E8, 0x964D, 0xCBBD, 0x9650, 0xF9DA,\n\t0x965B, 0xF8CE, 0x965C, 0xF9F0, 0x965D, 0xE0ED, 0x965E, 0xE3B3,\t0x965F, 0xF4B3, 0x9662, 0xEAC2, 0x9663, 0xF2E6, 0x9664, 0xF0B6,\n\t0x966A, 0xDBD6, 0x9670, 0xEBE4, 0x9673, 0xF2E7, 0x9675, 0xD7D5,\t0x9676, 0xD4B6, 0x9677, 0xF9E8, 0x9678, 0xD7C1, 0x967D, 0xE5D5,\n\t0x9685, 0xE9EA, 0x9686, 0xD7CC, 0x968A, 0xD3E9, 0x968B, 0xE2C9,\t0x968D, 0xFCDB, 0x968E, 0xCDAD, 0x9694, 0xCCB0, 0x9695, 0xEAA2,\n\t0x9698, 0xE4F6, 0x9699, 0xD0C0, 0x969B, 0xF0B7, 0x969C, 0xEEA1,\t0x96A3, 0xD7F6, 0x96A7, 0xE2CA, 0x96A8, 0xE2CB, 0x96AA, 0xFACF,\n\t0x96B1, 0xEBDF, 0x96B7, 0xD6CB, 0x96BB, 0xF4B4, 0x96C0, 0xEDCD,\t0x96C1, 0xE4D2, 0x96C4, 0xEAA9, 0x96C5, 0xE4BA, 0x96C6, 0xF3A2,\n\t0x96C7, 0xCDD2, 0x96C9, 0xF6CB, 0x96CB, 0xF1E6, 0x96CC, 0xEDC1,\t0x96CD, 0xE8BC, 0x96CE, 0xEED1, 0x96D5, 0xF0E7, 0x96D6, 0xE2CC,\n\t0x96D9, 0xE4AA, 0x96DB, 0xF5E1, 0x96DC, 0xEDDA, 0x96E2, 0xD7EE,\t0x96E3, 0xD1F1, 0x96E8, 0xE9EB, 0x96E9, 0xE9EC, 0x96EA, 0xE0E4,\n\t0x96EF, 0xDAA7, 0x96F0, 0xDDD4, 0x96F2, 0xEAA3, 0x96F6, 0xD6C3,\t0x96F7, 0xD6F4, 0x96F9, 0xDADF, 0x96FB, 0xEFB3, 0x9700, 0xE2CD,\n\t0x9706, 0xEFFD, 0x9707, 0xF2E8, 0x9711, 0xEFC5, 0x9713, 0xE7E7,\t0x9716, 0xD7FD, 0x9719, 0xE7CE, 0x971C, 0xDFDC, 0x971E, 0xF9C7,\n\t0x9727, 0xD9F6, 0x9730, 0xDFAC, 0x9732, 0xD6DA, 0x9739, 0xDCA4,\t0x973D, 0xF0B8, 0x9742, 0xD5FA, 0x9744, 0xE4F7, 0x9748, 0xD6C4,\n\t0x9751, 0xF4EC, 0x9756, 0xEFFE, 0x975C, 0xF0A1, 0x975E, 0xDEAA,\t0x9761, 0xDABC, 0x9762, 0xD8FC, 0x9769, 0xFAD4, 0x976D, 0xECE5,\n\t0x9774, 0xFCA8, 0x9777, 0xECE6, 0x977A, 0xD8CB, 0x978B, 0xFBB9,\t0x978D, 0xE4D3, 0x978F, 0xCDF9, 0x97A0, 0xCFD3, 0x97A8, 0xCAEA,\n\t0x97AB, 0xCFD4, 0x97AD, 0xF8BD, 0x97C6, 0xF4C7, 0x97CB, 0xEADF,\t0x97D3, 0xF9DB, 0x97DC, 0xD4B7, 0x97F3, 0xEBE5, 0x97F6, 0xE1D2,\n\t0x97FB, 0xEAA4, 0x97FF, 0xFAC2, 0x9800, 0xFBE1, 0x9801, 0xFAED,\t0x9802, 0xF0A2, 0x9803, 0xCCF1, 0x9805, 0xFAA3, 0x9806, 0xE2F7,\n\t0x9808, 0xE2CE, 0x980A, 0xE9F5, 0x980C, 0xE1EB, 0x9810, 0xE7E8,\t0x9811, 0xE8D7, 0x9812, 0xDAF8, 0x9813, 0xD4CB, 0x9817, 0xF7F6,\n\t0x9818, 0xD6C5, 0x982D, 0xD4E9, 0x9830, 0xFAFA, 0x9838, 0xCCF2,\t0x9839, 0xF7DD, 0x983B, 0xDEBA, 0x9846, 0xCEA8, 0x984C, 0xF0B9,\n\t0x984D, 0xE4FE, 0x984E, 0xE4C9, 0x9854, 0xE4D4, 0x9858, 0xEAC3,\t0x985A, 0xEFB4, 0x985E, 0xD7BE, 0x9865, 0xFBE2, 0x9867, 0xCDD3,\n\t0x986B, 0xEFB5, 0x986F, 0xFAE9, 0x98A8, 0xF9A6, 0x98AF, 0xDFBD,\t0x98B1, 0xF7C7, 0x98C4, 0xF8FD, 0x98C7, 0xF8FC, 0x98DB, 0xDEAB,\n\t0x98DC, 0xDBE8, 0x98DF, 0xE3DD, 0x98E1, 0xE1E2, 0x98E2, 0xD1C6,\t0x98ED, 0xF6D0, 0x98EE, 0xEBE6, 0x98EF, 0xDAF9, 0x98F4, 0xECC7,\n\t0x98FC, 0xDEF8, 0x98FD, 0xF8E9, 0x98FE, 0xE3DE, 0x9903, 0xCEF5,\t0x9909, 0xFAC3, 0x990A, 0xE5D7, 0x990C, 0xECC8, 0x9910, 0xF3C9,\n\t0x9913, 0xE4BB, 0x9918, 0xE6AE, 0x991E, 0xEFB6, 0x9920, 0xDCBF,\t0x9928, 0xCEBD, 0x9945, 0xD8C3, 0x9949, 0xD0CF, 0x994B, 0xCFFA,\n\t0x994C, 0xF3CA, 0x994D, 0xE0D7, 0x9951, 0xD1C7, 0x9952, 0xE9AE,\t0x9954, 0xE8BD, 0x9957, 0xFAC4, 0x9996, 0xE2CF, 0x9999, 0xFAC5,\n\t0x999D, 0xF9B8, 0x99A5, 0xDCE0, 0x99A8, 0xFBB0, 0x99AC, 0xD8A9,\t0x99AD, 0xE5DF, 0x99AE, 0xF9A7, 0x99B1, 0xF6EE, 0x99B3, 0xF6CC,\n\t0x99B4, 0xE2F8, 0x99B9, 0xECF1, 0x99C1, 0xDAE0, 0x99D0, 0xF1D2,\t0x99D1, 0xD2CC, 0x99D2, 0xCFCB, 0x99D5, 0xCABD, 0x99D9, 0xDDBF,\n\t0x99DD, 0xF6EF, 0x99DF, 0xDEF9, 0x99ED, 0xFAB4, 0x99F1, 0xD5AD,\t0x99FF, 0xF1E7, 0x9A01, 0xDEBE, 0x9A08, 0xDCC0, 0x9A0E, 0xD1C8,\n\t0x9A0F, 0xD1C9, 0x9A19, 0xF8BE, 0x9A2B, 0xCBF6, 0x9A30, 0xD4F9,\t0x9A36, 0xF5E2, 0x9A37, 0xE1D3, 0x9A40, 0xD8E9, 0x9A43, 0xF8FE,\n\t0x9A45, 0xCFCC, 0x9A4D, 0xFDA4, 0x9A55, 0xCEF6, 0x9A57, 0xFAD0,\t0x9A5A, 0xCCF3, 0x9A5B, 0xE6BE, 0x9A5F, 0xF6AE, 0x9A62, 0xD5F0,\n\t0x9A65, 0xD1CA, 0x9A69, 0xFCBE, 0x9A6A, 0xD5F1, 0x9AA8, 0xCDE9,\t0x9AB8, 0xFAB5, 0x9AD3, 0xE2D0, 0x9AD4, 0xF4F7, 0x9AD8, 0xCDD4,\n\t0x9AE5, 0xE7A3, 0x9AEE, 0xDBA5, 0x9B1A, 0xE2D1, 0x9B27, 0xD7A2,\t0x9B2A, 0xF7E3, 0x9B31, 0xEAA6, 0x9B3C, 0xD0A1, 0x9B41, 0xCEDA,\n\t0x9B42, 0xFBEB, 0x9B43, 0xDBA6, 0x9B44, 0xDBDE, 0x9B45, 0xD8E5,\t0x9B4F, 0xEAE0, 0x9B54, 0xD8AA, 0x9B5A, 0xE5E0, 0x9B6F, 0xD6DB,\n\t0x9B8E, 0xEFC6, 0x9B91, 0xF8EA, 0x9B9F, 0xE4D5, 0x9BAB, 0xCEF7,\t0x9BAE, 0xE0D8, 0x9BC9, 0xD7EF, 0x9BD6, 0xF4ED, 0x9BE4, 0xCDE6,\n\t0x9BE8, 0xCCF4, 0x9C0D, 0xF5E3, 0x9C10, 0xE4CA, 0x9C12, 0xDCE1,\t0x9C15, 0xF9C8, 0x9C25, 0xFCBF, 0x9C32, 0xE8A7, 0x9C3B, 0xD8C4,\n\t0x9C47, 0xCBBE, 0x9C49, 0xDCAE, 0x9C57, 0xD7F7, 0x9CE5, 0xF0E8,\t0x9CE7, 0xDDC0, 0x9CE9, 0xCFCD, 0x9CF3, 0xDCF3, 0x9CF4, 0xD9B0,\n\t0x9CF6, 0xE6E9, 0x9D09, 0xE4BC, 0x9D1B, 0xEAC4, 0x9D26, 0xE4EC,\t0x9D28, 0xE4E5, 0x9D3B, 0xFBF8, 0x9D51, 0xCCBB, 0x9D5D, 0xE4BD,\n\t0x9D60, 0xCDDC, 0x9D61, 0xD9F7, 0x9D6C, 0xDDDF, 0x9D72, 0xEDCE,\t0x9DA9, 0xD9D0, 0x9DAF, 0xE5A3, 0x9DB4, 0xF9CD, 0x9DC4, 0xCDAE,\n\t0x9DD7, 0xCFCE, 0x9DF2, 0xF6AF, 0x9DF8, 0xFDD3, 0x9DF9, 0xEBED,\t0x9DFA, 0xD6DC, 0x9E1A, 0xE5A4, 0x9E1E, 0xD5B6, 0x9E75, 0xD6DD,\n\t0x9E79, 0xF9E9, 0x9E7D, 0xE7A4, 0x9E7F, 0xD6E3, 0x9E92, 0xD1CB,\t0x9E93, 0xD6E4, 0x9E97, 0xD5F2, 0x9E9D, 0xDEFA, 0x9E9F, 0xD7F8,\n\t0x9EA5, 0xD8EA, 0x9EB4, 0xCFD5, 0x9EB5, 0xD8FD, 0x9EBB, 0xD8AB,\t0x9EBE, 0xFDCB, 0x9EC3, 0xFCDC, 0x9ECD, 0xE0A8, 0x9ECE, 0xD5F3,\n\t0x9ED1, 0xFDD9, 0x9ED4, 0xCCA3, 0x9ED8, 0xD9F9, 0x9EDB, 0xD3EA,\t0x9EDC, 0xF5F5, 0x9EDE, 0xEFC7, 0x9EE8, 0xD3DA, 0x9EF4, 0xDABD,\n\t0x9F07, 0xE8A8, 0x9F08, 0xDCAF, 0x9F0E, 0xF0A3, 0x9F13, 0xCDD5,\t0x9F20, 0xE0A9, 0x9F3B, 0xDEAC, 0x9F4A, 0xF0BA, 0x9F4B, 0xEEB1,\n\t0x9F4E, 0xEEB2, 0x9F52, 0xF6CD, 0x9F5F, 0xEED2, 0x9F61, 0xD6C6,\t0x9F67, 0xE0E5, 0x9F6A, 0xF3BB, 0x9F6C, 0xE5E1, 0x9F77, 0xE4CB,\n\t0x9F8D, 0xD7A3, 0x9F90, 0xDBC2, 0x9F95, 0xCAFE, 0x9F9C, 0xCFCF,\t0xAC00, 0xB0A1, 0xAC01, 0xB0A2, 0xAC02, 0x8141, 0xAC03, 0x8142,\n\t0xAC04, 0xB0A3, 0xAC05, 0x8143, 0xAC06, 0x8144, 0xAC07, 0xB0A4,\t0xAC08, 0xB0A5, 0xAC09, 0xB0A6, 0xAC0A, 0xB0A7, 0xAC0B, 0x8145,\n\t0xAC0C, 0x8146, 0xAC0D, 0x8147, 0xAC0E, 0x8148, 0xAC0F, 0x8149,\t0xAC10, 0xB0A8, 0xAC11, 0xB0A9, 0xAC12, 0xB0AA, 0xAC13, 0xB0AB,\n\t0xAC14, 0xB0AC, 0xAC15, 0xB0AD, 0xAC16, 0xB0AE, 0xAC17, 0xB0AF,\t0xAC18, 0x814A, 0xAC19, 0xB0B0, 0xAC1A, 0xB0B1, 0xAC1B, 0xB0B2,\n\t0xAC1C, 0xB0B3, 0xAC1D, 0xB0B4, 0xAC1E, 0x814B, 0xAC1F, 0x814C,\t0xAC20, 0xB0B5, 0xAC21, 0x814D, 0xAC22, 0x814E, 0xAC23, 0x814F,\n\t0xAC24, 0xB0B6, 0xAC25, 0x8150, 0xAC26, 0x8151, 0xAC27, 0x8152,\t0xAC28, 0x8153, 0xAC29, 0x8154, 0xAC2A, 0x8155, 0xAC2B, 0x8156,\n\t0xAC2C, 0xB0B7, 0xAC2D, 0xB0B8, 0xAC2E, 0x8157, 0xAC2F, 0xB0B9,\t0xAC30, 0xB0BA, 0xAC31, 0xB0BB, 0xAC32, 0x8158, 0xAC33, 0x8159,\n\t0xAC34, 0x815A, 0xAC35, 0x8161, 0xAC36, 0x8162, 0xAC37, 0x8163,\t0xAC38, 0xB0BC, 0xAC39, 0xB0BD, 0xAC3A, 0x8164, 0xAC3B, 0x8165,\n\t0xAC3C, 0xB0BE, 0xAC3D, 0x8166, 0xAC3E, 0x8167, 0xAC3F, 0x8168,\t0xAC40, 0xB0BF, 0xAC41, 0x8169, 0xAC42, 0x816A, 0xAC43, 0x816B,\n\t0xAC44, 0x816C, 0xAC45, 0x816D, 0xAC46, 0x816E, 0xAC47, 0x816F,\t0xAC48, 0x8170, 0xAC49, 0x8171, 0xAC4A, 0x8172, 0xAC4B, 0xB0C0,\n\t0xAC4C, 0x8173, 0xAC4D, 0xB0C1, 0xAC4E, 0x8174, 0xAC4F, 0x8175,\t0xAC50, 0x8176, 0xAC51, 0x8177, 0xAC52, 0x8178, 0xAC53, 0x8179,\n\t0xAC54, 0xB0C2, 0xAC55, 0x817A, 0xAC56, 0x8181, 0xAC57, 0x8182,\t0xAC58, 0xB0C3, 0xAC59, 0x8183, 0xAC5A, 0x8184, 0xAC5B, 0x8185,\n\t0xAC5C, 0xB0C4, 0xAC5D, 0x8186, 0xAC5E, 0x8187, 0xAC5F, 0x8188,\t0xAC60, 0x8189, 0xAC61, 0x818A, 0xAC62, 0x818B, 0xAC63, 0x818C,\n\t0xAC64, 0x818D, 0xAC65, 0x818E, 0xAC66, 0x818F, 0xAC67, 0x8190,\t0xAC68, 0x8191, 0xAC69, 0x8192, 0xAC6A, 0x8193, 0xAC6B, 0x8194,\n\t0xAC6C, 0x8195, 0xAC6D, 0x8196, 0xAC6E, 0x8197, 0xAC6F, 0x8198,\t0xAC70, 0xB0C5, 0xAC71, 0xB0C6, 0xAC72, 0x8199, 0xAC73, 0x819A,\n\t0xAC74, 0xB0C7, 0xAC75, 0x819B, 0xAC76, 0x819C, 0xAC77, 0xB0C8,\t0xAC78, 0xB0C9, 0xAC79, 0x819D, 0xAC7A, 0xB0CA, 0xAC7B, 0x819E,\n\t0xAC7C, 0x819F, 0xAC7D, 0x81A0, 0xAC7E, 0x81A1, 0xAC7F, 0x81A2,\t0xAC80, 0xB0CB, 0xAC81, 0xB0CC, 0xAC82, 0x81A3, 0xAC83, 0xB0CD,\n\t0xAC84, 0xB0CE, 0xAC85, 0xB0CF, 0xAC86, 0xB0D0, 0xAC87, 0x81A4,\t0xAC88, 0x81A5, 0xAC89, 0xB0D1, 0xAC8A, 0xB0D2, 0xAC8B, 0xB0D3,\n\t0xAC8C, 0xB0D4, 0xAC8D, 0x81A6, 0xAC8E, 0x81A7, 0xAC8F, 0x81A8,\t0xAC90, 0xB0D5, 0xAC91, 0x81A9, 0xAC92, 0x81AA, 0xAC93, 0x81AB,\n\t0xAC94, 0xB0D6, 0xAC95, 0x81AC, 0xAC96, 0x81AD, 0xAC97, 0x81AE,\t0xAC98, 0x81AF, 0xAC99, 0x81B0, 0xAC9A, 0x81B1, 0xAC9B, 0x81B2,\n\t0xAC9C, 0xB0D7, 0xAC9D, 0xB0D8, 0xAC9E, 0x81B3, 0xAC9F, 0xB0D9,\t0xACA0, 0xB0DA, 0xACA1, 0xB0DB, 0xACA2, 0x81B4, 0xACA3, 0x81B5,\n\t0xACA4, 0x81B6, 0xACA5, 0x81B7, 0xACA6, 0x81B8, 0xACA7, 0x81B9,\t0xACA8, 0xB0DC, 0xACA9, 0xB0DD, 0xACAA, 0xB0DE, 0xACAB, 0x81BA,\n\t0xACAC, 0xB0DF, 0xACAD, 0x81BB, 0xACAE, 0x81BC, 0xACAF, 0xB0E0,\t0xACB0, 0xB0E1, 0xACB1, 0x81BD, 0xACB2, 0x81BE, 0xACB3, 0x81BF,\n\t0xACB4, 0x81C0, 0xACB5, 0x81C1, 0xACB6, 0x81C2, 0xACB7, 0x81C3,\t0xACB8, 0xB0E2, 0xACB9, 0xB0E3, 0xACBA, 0x81C4, 0xACBB, 0xB0E4,\n\t0xACBC, 0xB0E5, 0xACBD, 0xB0E6, 0xACBE, 0x81C5, 0xACBF, 0x81C6,\t0xACC0, 0x81C7, 0xACC1, 0xB0E7, 0xACC2, 0x81C8, 0xACC3, 0x81C9,\n\t0xACC4, 0xB0E8, 0xACC5, 0x81CA, 0xACC6, 0x81CB, 0xACC7, 0x81CC,\t0xACC8, 0xB0E9, 0xACC9, 0x81CD, 0xACCA, 0x81CE, 0xACCB, 0x81CF,\n\t0xACCC, 0xB0EA, 0xACCD, 0x81D0, 0xACCE, 0x81D1, 0xACCF, 0x81D2,\t0xACD0, 0x81D3, 0xACD1, 0x81D4, 0xACD2, 0x81D5, 0xACD3, 0x81D6,\n\t0xACD4, 0x81D7, 0xACD5, 0xB0EB, 0xACD6, 0x81D8, 0xACD7, 0xB0EC,\t0xACD8, 0x81D9, 0xACD9, 0x81DA, 0xACDA, 0x81DB, 0xACDB, 0x81DC,\n\t0xACDC, 0x81DD, 0xACDD, 0x81DE, 0xACDE, 0x81DF, 0xACDF, 0x81E0,\t0xACE0, 0xB0ED, 0xACE1, 0xB0EE, 0xACE2, 0x81E1, 0xACE3, 0x81E2,\n\t0xACE4, 0xB0EF, 0xACE5, 0x81E3, 0xACE6, 0x81E4, 0xACE7, 0xB0F0,\t0xACE8, 0xB0F1, 0xACE9, 0x81E5, 0xACEA, 0xB0F2, 0xACEB, 0x81E6,\n\t0xACEC, 0xB0F3, 0xACED, 0x81E7, 0xACEE, 0x81E8, 0xACEF, 0xB0F4,\t0xACF0, 0xB0F5, 0xACF1, 0xB0F6, 0xACF2, 0x81E9, 0xACF3, 0xB0F7,\n\t0xACF4, 0x81EA, 0xACF5, 0xB0F8, 0xACF6, 0xB0F9, 0xACF7, 0x81EB,\t0xACF8, 0x81EC, 0xACF9, 0x81ED, 0xACFA, 0x81EE, 0xACFB, 0x81EF,\n\t0xACFC, 0xB0FA, 0xACFD, 0xB0FB, 0xACFE, 0x81F0, 0xACFF, 0x81F1,\t0xAD00, 0xB0FC, 0xAD01, 0x81F2, 0xAD02, 0x81F3, 0xAD03, 0x81F4,\n\t0xAD04, 0xB0FD, 0xAD05, 0x81F5, 0xAD06, 0xB0FE, 0xAD07, 0x81F6,\t0xAD08, 0x81F7, 0xAD09, 0x81F8, 0xAD0A, 0x81F9, 0xAD0B, 0x81FA,\n\t0xAD0C, 0xB1A1, 0xAD0D, 0xB1A2, 0xAD0E, 0x81FB, 0xAD0F, 0xB1A3,\t0xAD10, 0x81FC, 0xAD11, 0xB1A4, 0xAD12, 0x81FD, 0xAD13, 0x81FE,\n\t0xAD14, 0x8241, 0xAD15, 0x8242, 0xAD16, 0x8243, 0xAD17, 0x8244,\t0xAD18, 0xB1A5, 0xAD19, 0x8245, 0xAD1A, 0x8246, 0xAD1B, 0x8247,\n\t0xAD1C, 0xB1A6, 0xAD1D, 0x8248, 0xAD1E, 0x8249, 0xAD1F, 0x824A,\t0xAD20, 0xB1A7, 0xAD21, 0x824B, 0xAD22, 0x824C, 0xAD23, 0x824D,\n\t0xAD24, 0x824E, 0xAD25, 0x824F, 0xAD26, 0x8250, 0xAD27, 0x8251,\t0xAD28, 0x8252, 0xAD29, 0xB1A8, 0xAD2A, 0x8253, 0xAD2B, 0x8254,\n\t0xAD2C, 0xB1A9, 0xAD2D, 0xB1AA, 0xAD2E, 0x8255, 0xAD2F, 0x8256,\t0xAD30, 0x8257, 0xAD31, 0x8258, 0xAD32, 0x8259, 0xAD33, 0x825A,\n\t0xAD34, 0xB1AB, 0xAD35, 0xB1AC, 0xAD36, 0x8261, 0xAD37, 0x8262,\t0xAD38, 0xB1AD, 0xAD39, 0x8263, 0xAD3A, 0x8264, 0xAD3B, 0x8265,\n\t0xAD3C, 0xB1AE, 0xAD3D, 0x8266, 0xAD3E, 0x8267, 0xAD3F, 0x8268,\t0xAD40, 0x8269, 0xAD41, 0x826A, 0xAD42, 0x826B, 0xAD43, 0x826C,\n\t0xAD44, 0xB1AF, 0xAD45, 0xB1B0, 0xAD46, 0x826D, 0xAD47, 0xB1B1,\t0xAD48, 0x826E, 0xAD49, 0xB1B2, 0xAD4A, 0x826F, 0xAD4B, 0x8270,\n\t0xAD4C, 0x8271, 0xAD4D, 0x8272, 0xAD4E, 0x8273, 0xAD4F, 0x8274,\t0xAD50, 0xB1B3, 0xAD51, 0x8275, 0xAD52, 0x8276, 0xAD53, 0x8277,\n\t0xAD54, 0xB1B4, 0xAD55, 0x8278, 0xAD56, 0x8279, 0xAD57, 0x827A,\t0xAD58, 0xB1B5, 0xAD59, 0x8281, 0xAD5A, 0x8282, 0xAD5B, 0x8283,\n\t0xAD5C, 0x8284, 0xAD5D, 0x8285, 0xAD5E, 0x8286, 0xAD5F, 0x8287,\t0xAD60, 0x8288, 0xAD61, 0xB1B6, 0xAD62, 0x8289, 0xAD63, 0xB1B7,\n\t0xAD64, 0x828A, 0xAD65, 0x828B, 0xAD66, 0x828C, 0xAD67, 0x828D,\t0xAD68, 0x828E, 0xAD69, 0x828F, 0xAD6A, 0x8290, 0xAD6B, 0x8291,\n\t0xAD6C, 0xB1B8, 0xAD6D, 0xB1B9, 0xAD6E, 0x8292, 0xAD6F, 0x8293,\t0xAD70, 0xB1BA, 0xAD71, 0x8294, 0xAD72, 0x8295, 0xAD73, 0xB1BB,\n\t0xAD74, 0xB1BC, 0xAD75, 0xB1BD, 0xAD76, 0xB1BE, 0xAD77, 0x8296,\t0xAD78, 0x8297, 0xAD79, 0x8298, 0xAD7A, 0x8299, 0xAD7B, 0xB1BF,\n\t0xAD7C, 0xB1C0, 0xAD7D, 0xB1C1, 0xAD7E, 0x829A, 0xAD7F, 0xB1C2,\t0xAD80, 0x829B, 0xAD81, 0xB1C3, 0xAD82, 0xB1C4, 0xAD83, 0x829C,\n\t0xAD84, 0x829D, 0xAD85, 0x829E, 0xAD86, 0x829F, 0xAD87, 0x82A0,\t0xAD88, 0xB1C5, 0xAD89, 0xB1C6, 0xAD8A, 0x82A1, 0xAD8B, 0x82A2,\n\t0xAD8C, 0xB1C7, 0xAD8D, 0x82A3, 0xAD8E, 0x82A4, 0xAD8F, 0x82A5,\t0xAD90, 0xB1C8, 0xAD91, 0x82A6, 0xAD92, 0x82A7, 0xAD93, 0x82A8,\n\t0xAD94, 0x82A9, 0xAD95, 0x82AA, 0xAD96, 0x82AB, 0xAD97, 0x82AC,\t0xAD98, 0x82AD, 0xAD99, 0x82AE, 0xAD9A, 0x82AF, 0xAD9B, 0x82B0,\n\t0xAD9C, 0xB1C9, 0xAD9D, 0xB1CA, 0xAD9E, 0x82B1, 0xAD9F, 0x82B2,\t0xADA0, 0x82B3, 0xADA1, 0x82B4, 0xADA2, 0x82B5, 0xADA3, 0x82B6,\n\t0xADA4, 0xB1CB, 0xADA5, 0x82B7, 0xADA6, 0x82B8, 0xADA7, 0x82B9,\t0xADA8, 0x82BA, 0xADA9, 0x82BB, 0xADAA, 0x82BC, 0xADAB, 0x82BD,\n\t0xADAC, 0x82BE, 0xADAD, 0x82BF, 0xADAE, 0x82C0, 0xADAF, 0x82C1,\t0xADB0, 0x82C2, 0xADB1, 0x82C3, 0xADB2, 0x82C4, 0xADB3, 0x82C5,\n\t0xADB4, 0x82C6, 0xADB5, 0x82C7, 0xADB6, 0x82C8, 0xADB7, 0xB1CC,\t0xADB8, 0x82C9, 0xADB9, 0x82CA, 0xADBA, 0x82CB, 0xADBB, 0x82CC,\n\t0xADBC, 0x82CD, 0xADBD, 0x82CE, 0xADBE, 0x82CF, 0xADBF, 0x82D0,\t0xADC0, 0xB1CD, 0xADC1, 0xB1CE, 0xADC2, 0x82D1, 0xADC3, 0x82D2,\n\t0xADC4, 0xB1CF, 0xADC5, 0x82D3, 0xADC6, 0x82D4, 0xADC7, 0x82D5,\t0xADC8, 0xB1D0, 0xADC9, 0x82D6, 0xADCA, 0x82D7, 0xADCB, 0x82D8,\n\t0xADCC, 0x82D9, 0xADCD, 0x82DA, 0xADCE, 0x82DB, 0xADCF, 0x82DC,\t0xADD0, 0xB1D1, 0xADD1, 0xB1D2, 0xADD2, 0x82DD, 0xADD3, 0xB1D3,\n\t0xADD4, 0x82DE, 0xADD5, 0x82DF, 0xADD6, 0x82E0, 0xADD7, 0x82E1,\t0xADD8, 0x82E2, 0xADD9, 0x82E3, 0xADDA, 0x82E4, 0xADDB, 0x82E5,\n\t0xADDC, 0xB1D4, 0xADDD, 0x82E6, 0xADDE, 0x82E7, 0xADDF, 0x82E8,\t0xADE0, 0xB1D5, 0xADE1, 0x82E9, 0xADE2, 0x82EA, 0xADE3, 0x82EB,\n\t0xADE4, 0xB1D6, 0xADE5, 0x82EC, 0xADE6, 0x82ED, 0xADE7, 0x82EE,\t0xADE8, 0x82EF, 0xADE9, 0x82F0, 0xADEA, 0x82F1, 0xADEB, 0x82F2,\n\t0xADEC, 0x82F3, 0xADED, 0x82F4, 0xADEE, 0x82F5, 0xADEF, 0x82F6,\t0xADF0, 0x82F7, 0xADF1, 0x82F8, 0xADF2, 0x82F9, 0xADF3, 0x82FA,\n\t0xADF4, 0x82FB, 0xADF5, 0x82FC, 0xADF6, 0x82FD, 0xADF7, 0x82FE,\t0xADF8, 0xB1D7, 0xADF9, 0xB1D8, 0xADFA, 0x8341, 0xADFB, 0x8342,\n\t0xADFC, 0xB1D9, 0xADFD, 0x8343, 0xADFE, 0x8344, 0xADFF, 0xB1DA,\t0xAE00, 0xB1DB, 0xAE01, 0xB1DC, 0xAE02, 0x8345, 0xAE03, 0x8346,\n\t0xAE04, 0x8347, 0xAE05, 0x8348, 0xAE06, 0x8349, 0xAE07, 0x834A,\t0xAE08, 0xB1DD, 0xAE09, 0xB1DE, 0xAE0A, 0x834B, 0xAE0B, 0xB1DF,\n\t0xAE0C, 0x834C, 0xAE0D, 0xB1E0, 0xAE0E, 0x834D, 0xAE0F, 0x834E,\t0xAE10, 0x834F, 0xAE11, 0x8350, 0xAE12, 0x8351, 0xAE13, 0x8352,\n\t0xAE14, 0xB1E1, 0xAE15, 0x8353, 0xAE16, 0x8354, 0xAE17, 0x8355,\t0xAE18, 0x8356, 0xAE19, 0x8357, 0xAE1A, 0x8358, 0xAE1B, 0x8359,\n\t0xAE1C, 0x835A, 0xAE1D, 0x8361, 0xAE1E, 0x8362, 0xAE1F, 0x8363,\t0xAE20, 0x8364, 0xAE21, 0x8365, 0xAE22, 0x8366, 0xAE23, 0x8367,\n\t0xAE24, 0x8368, 0xAE25, 0x8369, 0xAE26, 0x836A, 0xAE27, 0x836B,\t0xAE28, 0x836C, 0xAE29, 0x836D, 0xAE2A, 0x836E, 0xAE2B, 0x836F,\n\t0xAE2C, 0x8370, 0xAE2D, 0x8371, 0xAE2E, 0x8372, 0xAE2F, 0x8373,\t0xAE30, 0xB1E2, 0xAE31, 0xB1E3, 0xAE32, 0x8374, 0xAE33, 0x8375,\n\t0xAE34, 0xB1E4, 0xAE35, 0x8376, 0xAE36, 0x8377, 0xAE37, 0xB1E5,\t0xAE38, 0xB1E6, 0xAE39, 0x8378, 0xAE3A, 0xB1E7, 0xAE3B, 0x8379,\n\t0xAE3C, 0x837A, 0xAE3D, 0x8381, 0xAE3E, 0x8382, 0xAE3F, 0x8383,\t0xAE40, 0xB1E8, 0xAE41, 0xB1E9, 0xAE42, 0x8384, 0xAE43, 0xB1EA,\n\t0xAE44, 0x8385, 0xAE45, 0xB1EB, 0xAE46, 0xB1EC, 0xAE47, 0x8386,\t0xAE48, 0x8387, 0xAE49, 0x8388, 0xAE4A, 0xB1ED, 0xAE4B, 0x8389,\n\t0xAE4C, 0xB1EE, 0xAE4D, 0xB1EF, 0xAE4E, 0xB1F0, 0xAE4F, 0x838A,\t0xAE50, 0xB1F1, 0xAE51, 0x838B, 0xAE52, 0x838C, 0xAE53, 0x838D,\n\t0xAE54, 0xB1F2, 0xAE55, 0x838E, 0xAE56, 0xB1F3, 0xAE57, 0x838F,\t0xAE58, 0x8390, 0xAE59, 0x8391, 0xAE5A, 0x8392, 0xAE5B, 0x8393,\n\t0xAE5C, 0xB1F4, 0xAE5D, 0xB1F5, 0xAE5E, 0x8394, 0xAE5F, 0xB1F6,\t0xAE60, 0xB1F7, 0xAE61, 0xB1F8, 0xAE62, 0x8395, 0xAE63, 0x8396,\n\t0xAE64, 0x8397, 0xAE65, 0xB1F9, 0xAE66, 0x8398, 0xAE67, 0x8399,\t0xAE68, 0xB1FA, 0xAE69, 0xB1FB, 0xAE6A, 0x839A, 0xAE6B, 0x839B,\n\t0xAE6C, 0xB1FC, 0xAE6D, 0x839C, 0xAE6E, 0x839D, 0xAE6F, 0x839E,\t0xAE70, 0xB1FD, 0xAE71, 0x839F, 0xAE72, 0x83A0, 0xAE73, 0x83A1,\n\t0xAE74, 0x83A2, 0xAE75, 0x83A3, 0xAE76, 0x83A4, 0xAE77, 0x83A5,\t0xAE78, 0xB1FE, 0xAE79, 0xB2A1, 0xAE7A, 0x83A6, 0xAE7B, 0xB2A2,\n\t0xAE7C, 0xB2A3, 0xAE7D, 0xB2A4, 0xAE7E, 0x83A7, 0xAE7F, 0x83A8,\t0xAE80, 0x83A9, 0xAE81, 0x83AA, 0xAE82, 0x83AB, 0xAE83, 0x83AC,\n\t0xAE84, 0xB2A5, 0xAE85, 0xB2A6, 0xAE86, 0x83AD, 0xAE87, 0x83AE,\t0xAE88, 0x83AF, 0xAE89, 0x83B0, 0xAE8A, 0x83B1, 0xAE8B, 0x83B2,\n\t0xAE8C, 0xB2A7, 0xAE8D, 0x83B3, 0xAE8E, 0x83B4, 0xAE8F, 0x83B5,\t0xAE90, 0x83B6, 0xAE91, 0x83B7, 0xAE92, 0x83B8, 0xAE93, 0x83B9,\n\t0xAE94, 0x83BA, 0xAE95, 0x83BB, 0xAE96, 0x83BC, 0xAE97, 0x83BD,\t0xAE98, 0x83BE, 0xAE99, 0x83BF, 0xAE9A, 0x83C0, 0xAE9B, 0x83C1,\n\t0xAE9C, 0x83C2, 0xAE9D, 0x83C3, 0xAE9E, 0x83C4, 0xAE9F, 0x83C5,\t0xAEA0, 0x83C6, 0xAEA1, 0x83C7, 0xAEA2, 0x83C8, 0xAEA3, 0x83C9,\n\t0xAEA4, 0x83CA, 0xAEA5, 0x83CB, 0xAEA6, 0x83CC, 0xAEA7, 0x83CD,\t0xAEA8, 0x83CE, 0xAEA9, 0x83CF, 0xAEAA, 0x83D0, 0xAEAB, 0x83D1,\n\t0xAEAC, 0x83D2, 0xAEAD, 0x83D3, 0xAEAE, 0x83D4, 0xAEAF, 0x83D5,\t0xAEB0, 0x83D6, 0xAEB1, 0x83D7, 0xAEB2, 0x83D8, 0xAEB3, 0x83D9,\n\t0xAEB4, 0x83DA, 0xAEB5, 0x83DB, 0xAEB6, 0x83DC, 0xAEB7, 0x83DD,\t0xAEB8, 0x83DE, 0xAEB9, 0x83DF, 0xAEBA, 0x83E0, 0xAEBB, 0x83E1,\n\t0xAEBC, 0xB2A8, 0xAEBD, 0xB2A9, 0xAEBE, 0xB2AA, 0xAEBF, 0x83E2,\t0xAEC0, 0xB2AB, 0xAEC1, 0x83E3, 0xAEC2, 0x83E4, 0xAEC3, 0x83E5,\n\t0xAEC4, 0xB2AC, 0xAEC5, 0x83E6, 0xAEC6, 0x83E7, 0xAEC7, 0x83E8,\t0xAEC8, 0x83E9, 0xAEC9, 0x83EA, 0xAECA, 0x83EB, 0xAECB, 0x83EC,\n\t0xAECC, 0xB2AD, 0xAECD, 0xB2AE, 0xAECE, 0x83ED, 0xAECF, 0xB2AF,\t0xAED0, 0xB2B0, 0xAED1, 0xB2B1, 0xAED2, 0x83EE, 0xAED3, 0x83EF,\n\t0xAED4, 0x83F0, 0xAED5, 0x83F1, 0xAED6, 0x83F2, 0xAED7, 0x83F3,\t0xAED8, 0xB2B2, 0xAED9, 0xB2B3, 0xAEDA, 0x83F4, 0xAEDB, 0x83F5,\n\t0xAEDC, 0xB2B4, 0xAEDD, 0x83F6, 0xAEDE, 0x83F7, 0xAEDF, 0x83F8,\t0xAEE0, 0x83F9, 0xAEE1, 0x83FA, 0xAEE2, 0x83FB, 0xAEE3, 0x83FC,\n\t0xAEE4, 0x83FD, 0xAEE5, 0x83FE, 0xAEE6, 0x8441, 0xAEE7, 0x8442,\t0xAEE8, 0xB2B5, 0xAEE9, 0x8443, 0xAEEA, 0x8444, 0xAEEB, 0xB2B6,\n\t0xAEEC, 0x8445, 0xAEED, 0xB2B7, 0xAEEE, 0x8446, 0xAEEF, 0x8447,\t0xAEF0, 0x8448, 0xAEF1, 0x8449, 0xAEF2, 0x844A, 0xAEF3, 0x844B,\n\t0xAEF4, 0xB2B8, 0xAEF5, 0x844C, 0xAEF6, 0x844D, 0xAEF7, 0x844E,\t0xAEF8, 0xB2B9, 0xAEF9, 0x844F, 0xAEFA, 0x8450, 0xAEFB, 0x8451,\n\t0xAEFC, 0xB2BA, 0xAEFD, 0x8452, 0xAEFE, 0x8453, 0xAEFF, 0x8454,\t0xAF00, 0x8455, 0xAF01, 0x8456, 0xAF02, 0x8457, 0xAF03, 0x8458,\n\t0xAF04, 0x8459, 0xAF05, 0x845A, 0xAF06, 0x8461, 0xAF07, 0xB2BB,\t0xAF08, 0xB2BC, 0xAF09, 0x8462, 0xAF0A, 0x8463, 0xAF0B, 0x8464,\n\t0xAF0C, 0x8465, 0xAF0D, 0xB2BD, 0xAF0E, 0x8466, 0xAF0F, 0x8467,\t0xAF10, 0xB2BE, 0xAF11, 0x8468, 0xAF12, 0x8469, 0xAF13, 0x846A,\n\t0xAF14, 0x846B, 0xAF15, 0x846C, 0xAF16, 0x846D, 0xAF17, 0x846E,\t0xAF18, 0x846F, 0xAF19, 0x8470, 0xAF1A, 0x8471, 0xAF1B, 0x8472,\n\t0xAF1C, 0x8473, 0xAF1D, 0x8474, 0xAF1E, 0x8475, 0xAF1F, 0x8476,\t0xAF20, 0x8477, 0xAF21, 0x8478, 0xAF22, 0x8479, 0xAF23, 0x847A,\n\t0xAF24, 0x8481, 0xAF25, 0x8482, 0xAF26, 0x8483, 0xAF27, 0x8484,\t0xAF28, 0x8485, 0xAF29, 0x8486, 0xAF2A, 0x8487, 0xAF2B, 0x8488,\n\t0xAF2C, 0xB2BF, 0xAF2D, 0xB2C0, 0xAF2E, 0x8489, 0xAF2F, 0x848A,\t0xAF30, 0xB2C1, 0xAF31, 0x848B, 0xAF32, 0xB2C2, 0xAF33, 0x848C,\n\t0xAF34, 0xB2C3, 0xAF35, 0x848D, 0xAF36, 0x848E, 0xAF37, 0x848F,\t0xAF38, 0x8490, 0xAF39, 0x8491, 0xAF3A, 0x8492, 0xAF3B, 0x8493,\n\t0xAF3C, 0xB2C4, 0xAF3D, 0xB2C5, 0xAF3E, 0x8494, 0xAF3F, 0xB2C6,\t0xAF40, 0x8495, 0xAF41, 0xB2C7, 0xAF42, 0xB2C8, 0xAF43, 0xB2C9,\n\t0xAF44, 0x8496, 0xAF45, 0x8497, 0xAF46, 0x8498, 0xAF47, 0x8499,\t0xAF48, 0xB2CA, 0xAF49, 0xB2CB, 0xAF4A, 0x849A, 0xAF4B, 0x849B,\n\t0xAF4C, 0x849C, 0xAF4D, 0x849D, 0xAF4E, 0x849E, 0xAF4F, 0x849F,\t0xAF50, 0xB2CC, 0xAF51, 0x84A0, 0xAF52, 0x84A1, 0xAF53, 0x84A2,\n\t0xAF54, 0x84A3, 0xAF55, 0x84A4, 0xAF56, 0x84A5, 0xAF57, 0x84A6,\t0xAF58, 0x84A7, 0xAF59, 0x84A8, 0xAF5A, 0x84A9, 0xAF5B, 0x84AA,\n\t0xAF5C, 0xB2CD, 0xAF5D, 0xB2CE, 0xAF5E, 0x84AB, 0xAF5F, 0x84AC,\t0xAF60, 0x84AD, 0xAF61, 0x84AE, 0xAF62, 0x84AF, 0xAF63, 0x84B0,\n\t0xAF64, 0xB2CF, 0xAF65, 0xB2D0, 0xAF66, 0x84B1, 0xAF67, 0x84B2,\t0xAF68, 0x84B3, 0xAF69, 0x84B4, 0xAF6A, 0x84B5, 0xAF6B, 0x84B6,\n\t0xAF6C, 0x84B7, 0xAF6D, 0x84B8, 0xAF6E, 0x84B9, 0xAF6F, 0x84BA,\t0xAF70, 0x84BB, 0xAF71, 0x84BC, 0xAF72, 0x84BD, 0xAF73, 0x84BE,\n\t0xAF74, 0x84BF, 0xAF75, 0x84C0, 0xAF76, 0x84C1, 0xAF77, 0x84C2,\t0xAF78, 0x84C3, 0xAF79, 0xB2D1, 0xAF7A, 0x84C4, 0xAF7B, 0x84C5,\n\t0xAF7C, 0x84C6, 0xAF7D, 0x84C7, 0xAF7E, 0x84C8, 0xAF7F, 0x84C9,\t0xAF80, 0xB2D2, 0xAF81, 0x84CA, 0xAF82, 0x84CB, 0xAF83, 0x84CC,\n\t0xAF84, 0xB2D3, 0xAF85, 0x84CD, 0xAF86, 0x84CE, 0xAF87, 0x84CF,\t0xAF88, 0xB2D4, 0xAF89, 0x84D0, 0xAF8A, 0x84D1, 0xAF8B, 0x84D2,\n\t0xAF8C, 0x84D3, 0xAF8D, 0x84D4, 0xAF8E, 0x84D5, 0xAF8F, 0x84D6,\t0xAF90, 0xB2D5, 0xAF91, 0xB2D6, 0xAF92, 0x84D7, 0xAF93, 0x84D8,\n\t0xAF94, 0x84D9, 0xAF95, 0xB2D7, 0xAF96, 0x84DA, 0xAF97, 0x84DB,\t0xAF98, 0x84DC, 0xAF99, 0x84DD, 0xAF9A, 0x84DE, 0xAF9B, 0x84DF,\n\t0xAF9C, 0xB2D8, 0xAF9D, 0x84E0, 0xAF9E, 0x84E1, 0xAF9F, 0x84E2,\t0xAFA0, 0x84E3, 0xAFA1, 0x84E4, 0xAFA2, 0x84E5, 0xAFA3, 0x84E6,\n\t0xAFA4, 0x84E7, 0xAFA5, 0x84E8, 0xAFA6, 0x84E9, 0xAFA7, 0x84EA,\t0xAFA8, 0x84EB, 0xAFA9, 0x84EC, 0xAFAA, 0x84ED, 0xAFAB, 0x84EE,\n\t0xAFAC, 0x84EF, 0xAFAD, 0x84F0, 0xAFAE, 0x84F1, 0xAFAF, 0x84F2,\t0xAFB0, 0x84F3, 0xAFB1, 0x84F4, 0xAFB2, 0x84F5, 0xAFB3, 0x84F6,\n\t0xAFB4, 0x84F7, 0xAFB5, 0x84F8, 0xAFB6, 0x84F9, 0xAFB7, 0x84FA,\t0xAFB8, 0xB2D9, 0xAFB9, 0xB2DA, 0xAFBA, 0x84FB, 0xAFBB, 0x84FC,\n\t0xAFBC, 0xB2DB, 0xAFBD, 0x84FD, 0xAFBE, 0x84FE, 0xAFBF, 0x8541,\t0xAFC0, 0xB2DC, 0xAFC1, 0x8542, 0xAFC2, 0x8543, 0xAFC3, 0x8544,\n\t0xAFC4, 0x8545, 0xAFC5, 0x8546, 0xAFC6, 0x8547, 0xAFC7, 0xB2DD,\t0xAFC8, 0xB2DE, 0xAFC9, 0xB2DF, 0xAFCA, 0x8548, 0xAFCB, 0xB2E0,\n\t0xAFCC, 0x8549, 0xAFCD, 0xB2E1, 0xAFCE, 0xB2E2, 0xAFCF, 0x854A,\t0xAFD0, 0x854B, 0xAFD1, 0x854C, 0xAFD2, 0x854D, 0xAFD3, 0x854E,\n\t0xAFD4, 0xB2E3, 0xAFD5, 0x854F, 0xAFD6, 0x8550, 0xAFD7, 0x8551,\t0xAFD8, 0x8552, 0xAFD9, 0x8553, 0xAFDA, 0x8554, 0xAFDB, 0x8555,\n\t0xAFDC, 0xB2E4, 0xAFDD, 0x8556, 0xAFDE, 0x8557, 0xAFDF, 0x8558,\t0xAFE0, 0x8559, 0xAFE1, 0x855A, 0xAFE2, 0x8561, 0xAFE3, 0x8562,\n\t0xAFE4, 0x8563, 0xAFE5, 0x8564, 0xAFE6, 0x8565, 0xAFE7, 0x8566,\t0xAFE8, 0xB2E5, 0xAFE9, 0xB2E6, 0xAFEA, 0x8567, 0xAFEB, 0x8568,\n\t0xAFEC, 0x8569, 0xAFED, 0x856A, 0xAFEE, 0x856B, 0xAFEF, 0x856C,\t0xAFF0, 0xB2E7, 0xAFF1, 0xB2E8, 0xAFF2, 0x856D, 0xAFF3, 0x856E,\n\t0xAFF4, 0xB2E9, 0xAFF5, 0x856F, 0xAFF6, 0x8570, 0xAFF7, 0x8571,\t0xAFF8, 0xB2EA, 0xAFF9, 0x8572, 0xAFFA, 0x8573, 0xAFFB, 0x8574,\n\t0xAFFC, 0x8575, 0xAFFD, 0x8576, 0xAFFE, 0x8577, 0xAFFF, 0x8578,\t0xB000, 0xB2EB, 0xB001, 0xB2EC, 0xB002, 0x8579, 0xB003, 0x857A,\n\t0xB004, 0xB2ED, 0xB005, 0x8581, 0xB006, 0x8582, 0xB007, 0x8583,\t0xB008, 0x8584, 0xB009, 0x8585, 0xB00A, 0x8586, 0xB00B, 0x8587,\n\t0xB00C, 0xB2EE, 0xB00D, 0x8588, 0xB00E, 0x8589, 0xB00F, 0x858A,\t0xB010, 0xB2EF, 0xB011, 0x858B, 0xB012, 0x858C, 0xB013, 0x858D,\n\t0xB014, 0xB2F0, 0xB015, 0x858E, 0xB016, 0x858F, 0xB017, 0x8590,\t0xB018, 0x8591, 0xB019, 0x8592, 0xB01A, 0x8593, 0xB01B, 0x8594,\n\t0xB01C, 0xB2F1, 0xB01D, 0xB2F2, 0xB01E, 0x8595, 0xB01F, 0x8596,\t0xB020, 0x8597, 0xB021, 0x8598, 0xB022, 0x8599, 0xB023, 0x859A,\n\t0xB024, 0x859B, 0xB025, 0x859C, 0xB026, 0x859D, 0xB027, 0x859E,\t0xB028, 0xB2F3, 0xB029, 0x859F, 0xB02A, 0x85A0, 0xB02B, 0x85A1,\n\t0xB02C, 0x85A2, 0xB02D, 0x85A3, 0xB02E, 0x85A4, 0xB02F, 0x85A5,\t0xB030, 0x85A6, 0xB031, 0x85A7, 0xB032, 0x85A8, 0xB033, 0x85A9,\n\t0xB034, 0x85AA, 0xB035, 0x85AB, 0xB036, 0x85AC, 0xB037, 0x85AD,\t0xB038, 0x85AE, 0xB039, 0x85AF, 0xB03A, 0x85B0, 0xB03B, 0x85B1,\n\t0xB03C, 0x85B2, 0xB03D, 0x85B3, 0xB03E, 0x85B4, 0xB03F, 0x85B5,\t0xB040, 0x85B6, 0xB041, 0x85B7, 0xB042, 0x85B8, 0xB043, 0x85B9,\n\t0xB044, 0xB2F4, 0xB045, 0xB2F5, 0xB046, 0x85BA, 0xB047, 0x85BB,\t0xB048, 0xB2F6, 0xB049, 0x85BC, 0xB04A, 0xB2F7, 0xB04B, 0x85BD,\n\t0xB04C, 0xB2F8, 0xB04D, 0x85BE, 0xB04E, 0xB2F9, 0xB04F, 0x85BF,\t0xB050, 0x85C0, 0xB051, 0x85C1, 0xB052, 0x85C2, 0xB053, 0xB2FA,\n\t0xB054, 0xB2FB, 0xB055, 0xB2FC, 0xB056, 0x85C3, 0xB057, 0xB2FD,\t0xB058, 0x85C4, 0xB059, 0xB2FE, 0xB05A, 0x85C5, 0xB05B, 0x85C6,\n\t0xB05C, 0x85C7, 0xB05D, 0xB3A1, 0xB05E, 0x85C8, 0xB05F, 0x85C9,\t0xB060, 0x85CA, 0xB061, 0x85CB, 0xB062, 0x85CC, 0xB063, 0x85CD,\n\t0xB064, 0x85CE, 0xB065, 0x85CF, 0xB066, 0x85D0, 0xB067, 0x85D1,\t0xB068, 0x85D2, 0xB069, 0x85D3, 0xB06A, 0x85D4, 0xB06B, 0x85D5,\n\t0xB06C, 0x85D6, 0xB06D, 0x85D7, 0xB06E, 0x85D8, 0xB06F, 0x85D9,\t0xB070, 0x85DA, 0xB071, 0x85DB, 0xB072, 0x85DC, 0xB073, 0x85DD,\n\t0xB074, 0x85DE, 0xB075, 0x85DF, 0xB076, 0x85E0, 0xB077, 0x85E1,\t0xB078, 0x85E2, 0xB079, 0x85E3, 0xB07A, 0x85E4, 0xB07B, 0x85E5,\n\t0xB07C, 0xB3A2, 0xB07D, 0xB3A3, 0xB07E, 0x85E6, 0xB07F, 0x85E7,\t0xB080, 0xB3A4, 0xB081, 0x85E8, 0xB082, 0x85E9, 0xB083, 0x85EA,\n\t0xB084, 0xB3A5, 0xB085, 0x85EB, 0xB086, 0x85EC, 0xB087, 0x85ED,\t0xB088, 0x85EE, 0xB089, 0x85EF, 0xB08A, 0x85F0, 0xB08B, 0x85F1,\n\t0xB08C, 0xB3A6, 0xB08D, 0xB3A7, 0xB08E, 0x85F2, 0xB08F, 0xB3A8,\t0xB090, 0x85F3, 0xB091, 0xB3A9, 0xB092, 0x85F4, 0xB093, 0x85F5,\n\t0xB094, 0x85F6, 0xB095, 0x85F7, 0xB096, 0x85F8, 0xB097, 0x85F9,\t0xB098, 0xB3AA, 0xB099, 0xB3AB, 0xB09A, 0xB3AC, 0xB09B, 0x85FA,\n\t0xB09C, 0xB3AD, 0xB09D, 0x85FB, 0xB09E, 0x85FC, 0xB09F, 0xB3AE,\t0xB0A0, 0xB3AF, 0xB0A1, 0xB3B0, 0xB0A2, 0xB3B1, 0xB0A3, 0x85FD,\n\t0xB0A4, 0x85FE, 0xB0A5, 0x8641, 0xB0A6, 0x8642, 0xB0A7, 0x8643,\t0xB0A8, 0xB3B2, 0xB0A9, 0xB3B3, 0xB0AA, 0x8644, 0xB0AB, 0xB3B4,\n\t0xB0AC, 0xB3B5, 0xB0AD, 0xB3B6, 0xB0AE, 0xB3B7, 0xB0AF, 0xB3B8,\t0xB0B0, 0x8645, 0xB0B1, 0xB3B9, 0xB0B2, 0x8646, 0xB0B3, 0xB3BA,\n\t0xB0B4, 0xB3BB, 0xB0B5, 0xB3BC, 0xB0B6, 0x8647, 0xB0B7, 0x8648,\t0xB0B8, 0xB3BD, 0xB0B9, 0x8649, 0xB0BA, 0x864A, 0xB0BB, 0x864B,\n\t0xB0BC, 0xB3BE, 0xB0BD, 0x864C, 0xB0BE, 0x864D, 0xB0BF, 0x864E,\t0xB0C0, 0x864F, 0xB0C1, 0x8650, 0xB0C2, 0x8651, 0xB0C3, 0x8652,\n\t0xB0C4, 0xB3BF, 0xB0C5, 0xB3C0, 0xB0C6, 0x8653, 0xB0C7, 0xB3C1,\t0xB0C8, 0xB3C2, 0xB0C9, 0xB3C3, 0xB0CA, 0x8654, 0xB0CB, 0x8655,\n\t0xB0CC, 0x8656, 0xB0CD, 0x8657, 0xB0CE, 0x8658, 0xB0CF, 0x8659,\t0xB0D0, 0xB3C4, 0xB0D1, 0xB3C5, 0xB0D2, 0x865A, 0xB0D3, 0x8661,\n\t0xB0D4, 0xB3C6, 0xB0D5, 0x8662, 0xB0D6, 0x8663, 0xB0D7, 0x8664,\t0xB0D8, 0xB3C7, 0xB0D9, 0x8665, 0xB0DA, 0x8666, 0xB0DB, 0x8667,\n\t0xB0DC, 0x8668, 0xB0DD, 0x8669, 0xB0DE, 0x866A, 0xB0DF, 0x866B,\t0xB0E0, 0xB3C8, 0xB0E1, 0x866C, 0xB0E2, 0x866D, 0xB0E3, 0x866E,\n\t0xB0E4, 0x866F, 0xB0E5, 0xB3C9, 0xB0E6, 0x8670, 0xB0E7, 0x8671,\t0xB0E8, 0x8672, 0xB0E9, 0x8673, 0xB0EA, 0x8674, 0xB0EB, 0x8675,\n\t0xB0EC, 0x8676, 0xB0ED, 0x8677, 0xB0EE, 0x8678, 0xB0EF, 0x8679,\t0xB0F0, 0x867A, 0xB0F1, 0x8681, 0xB0F2, 0x8682, 0xB0F3, 0x8683,\n\t0xB0F4, 0x8684, 0xB0F5, 0x8685, 0xB0F6, 0x8686, 0xB0F7, 0x8687,\t0xB0F8, 0x8688, 0xB0F9, 0x8689, 0xB0FA, 0x868A, 0xB0FB, 0x868B,\n\t0xB0FC, 0x868C, 0xB0FD, 0x868D, 0xB0FE, 0x868E, 0xB0FF, 0x868F,\t0xB100, 0x8690, 0xB101, 0x8691, 0xB102, 0x8692, 0xB103, 0x8693,\n\t0xB104, 0x8694, 0xB105, 0x8695, 0xB106, 0x8696, 0xB107, 0x8697,\t0xB108, 0xB3CA, 0xB109, 0xB3CB, 0xB10A, 0x8698, 0xB10B, 0xB3CC,\n\t0xB10C, 0xB3CD, 0xB10D, 0x8699, 0xB10E, 0x869A, 0xB10F, 0x869B,\t0xB110, 0xB3CE, 0xB111, 0x869C, 0xB112, 0xB3CF, 0xB113, 0xB3D0,\n\t0xB114, 0x869D, 0xB115, 0x869E, 0xB116, 0x869F, 0xB117, 0x86A0,\t0xB118, 0xB3D1, 0xB119, 0xB3D2, 0xB11A, 0x86A1, 0xB11B, 0xB3D3,\n\t0xB11C, 0xB3D4, 0xB11D, 0xB3D5, 0xB11E, 0x86A2, 0xB11F, 0x86A3,\t0xB120, 0x86A4, 0xB121, 0x86A5, 0xB122, 0x86A6, 0xB123, 0xB3D6,\n\t0xB124, 0xB3D7, 0xB125, 0xB3D8, 0xB126, 0x86A7, 0xB127, 0x86A8,\t0xB128, 0xB3D9, 0xB129, 0x86A9, 0xB12A, 0x86AA, 0xB12B, 0x86AB,\n\t0xB12C, 0xB3DA, 0xB12D, 0x86AC, 0xB12E, 0x86AD, 0xB12F, 0x86AE,\t0xB130, 0x86AF, 0xB131, 0x86B0, 0xB132, 0x86B1, 0xB133, 0x86B2,\n\t0xB134, 0xB3DB, 0xB135, 0xB3DC, 0xB136, 0x86B3, 0xB137, 0xB3DD,\t0xB138, 0xB3DE, 0xB139, 0xB3DF, 0xB13A, 0x86B4, 0xB13B, 0x86B5,\n\t0xB13C, 0x86B6, 0xB13D, 0x86B7, 0xB13E, 0x86B8, 0xB13F, 0x86B9,\t0xB140, 0xB3E0, 0xB141, 0xB3E1, 0xB142, 0x86BA, 0xB143, 0x86BB,\n\t0xB144, 0xB3E2, 0xB145, 0x86BC, 0xB146, 0x86BD, 0xB147, 0x86BE,\t0xB148, 0xB3E3, 0xB149, 0x86BF, 0xB14A, 0x86C0, 0xB14B, 0x86C1,\n\t0xB14C, 0x86C2, 0xB14D, 0x86C3, 0xB14E, 0x86C4, 0xB14F, 0x86C5,\t0xB150, 0xB3E4, 0xB151, 0xB3E5, 0xB152, 0x86C6, 0xB153, 0x86C7,\n\t0xB154, 0xB3E6, 0xB155, 0xB3E7, 0xB156, 0x86C8, 0xB157, 0x86C9,\t0xB158, 0xB3E8, 0xB159, 0x86CA, 0xB15A, 0x86CB, 0xB15B, 0x86CC,\n\t0xB15C, 0xB3E9, 0xB15D, 0x86CD, 0xB15E, 0x86CE, 0xB15F, 0x86CF,\t0xB160, 0xB3EA, 0xB161, 0x86D0, 0xB162, 0x86D1, 0xB163, 0x86D2,\n\t0xB164, 0x86D3, 0xB165, 0x86D4, 0xB166, 0x86D5, 0xB167, 0x86D6,\t0xB168, 0x86D7, 0xB169, 0x86D8, 0xB16A, 0x86D9, 0xB16B, 0x86DA,\n\t0xB16C, 0x86DB, 0xB16D, 0x86DC, 0xB16E, 0x86DD, 0xB16F, 0x86DE,\t0xB170, 0x86DF, 0xB171, 0x86E0, 0xB172, 0x86E1, 0xB173, 0x86E2,\n\t0xB174, 0x86E3, 0xB175, 0x86E4, 0xB176, 0x86E5, 0xB177, 0x86E6,\t0xB178, 0xB3EB, 0xB179, 0xB3EC, 0xB17A, 0x86E7, 0xB17B, 0x86E8,\n\t0xB17C, 0xB3ED, 0xB17D, 0x86E9, 0xB17E, 0x86EA, 0xB17F, 0x86EB,\t0xB180, 0xB3EE, 0xB181, 0x86EC, 0xB182, 0xB3EF, 0xB183, 0x86ED,\n\t0xB184, 0x86EE, 0xB185, 0x86EF, 0xB186, 0x86F0, 0xB187, 0x86F1,\t0xB188, 0xB3F0, 0xB189, 0xB3F1, 0xB18A, 0x86F2, 0xB18B, 0xB3F2,\n\t0xB18C, 0x86F3, 0xB18D, 0xB3F3, 0xB18E, 0x86F4, 0xB18F, 0x86F5,\t0xB190, 0x86F6, 0xB191, 0x86F7, 0xB192, 0xB3F4, 0xB193, 0xB3F5,\n\t0xB194, 0xB3F6, 0xB195, 0x86F8, 0xB196, 0x86F9, 0xB197, 0x86FA,\t0xB198, 0xB3F7, 0xB199, 0x86FB, 0xB19A, 0x86FC, 0xB19B, 0x86FD,\n\t0xB19C, 0xB3F8, 0xB19D, 0x86FE, 0xB19E, 0x8741, 0xB19F, 0x8742,\t0xB1A0, 0x8743, 0xB1A1, 0x8744, 0xB1A2, 0x8745, 0xB1A3, 0x8746,\n\t0xB1A4, 0x8747, 0xB1A5, 0x8748, 0xB1A6, 0x8749, 0xB1A7, 0x874A,\t0xB1A8, 0xB3F9, 0xB1A9, 0x874B, 0xB1AA, 0x874C, 0xB1AB, 0x874D,\n\t0xB1AC, 0x874E, 0xB1AD, 0x874F, 0xB1AE, 0x8750, 0xB1AF, 0x8751,\t0xB1B0, 0x8752, 0xB1B1, 0x8753, 0xB1B2, 0x8754, 0xB1B3, 0x8755,\n\t0xB1B4, 0x8756, 0xB1B5, 0x8757, 0xB1B6, 0x8758, 0xB1B7, 0x8759,\t0xB1B8, 0x875A, 0xB1B9, 0x8761, 0xB1BA, 0x8762, 0xB1BB, 0x8763,\n\t0xB1BC, 0x8764, 0xB1BD, 0x8765, 0xB1BE, 0x8766, 0xB1BF, 0x8767,\t0xB1C0, 0x8768, 0xB1C1, 0x8769, 0xB1C2, 0x876A, 0xB1C3, 0x876B,\n\t0xB1C4, 0x876C, 0xB1C5, 0x876D, 0xB1C6, 0x876E, 0xB1C7, 0x876F,\t0xB1C8, 0x8770, 0xB1C9, 0x8771, 0xB1CA, 0x8772, 0xB1CB, 0x8773,\n\t0xB1CC, 0xB3FA, 0xB1CD, 0x8774, 0xB1CE, 0x8775, 0xB1CF, 0x8776,\t0xB1D0, 0xB3FB, 0xB1D1, 0x8777, 0xB1D2, 0x8778, 0xB1D3, 0x8779,\n\t0xB1D4, 0xB3FC, 0xB1D5, 0x877A, 0xB1D6, 0x8781, 0xB1D7, 0x8782,\t0xB1D8, 0x8783, 0xB1D9, 0x8784, 0xB1DA, 0x8785, 0xB1DB, 0x8786,\n\t0xB1DC, 0xB3FD, 0xB1DD, 0xB3FE, 0xB1DE, 0x8787, 0xB1DF, 0xB4A1,\t0xB1E0, 0x8788, 0xB1E1, 0x8789, 0xB1E2, 0x878A, 0xB1E3, 0x878B,\n\t0xB1E4, 0x878C, 0xB1E5, 0x878D, 0xB1E6, 0x878E, 0xB1E7, 0x878F,\t0xB1E8, 0xB4A2, 0xB1E9, 0xB4A3, 0xB1EA, 0x8790, 0xB1EB, 0x8791,\n\t0xB1EC, 0xB4A4, 0xB1ED, 0x8792, 0xB1EE, 0x8793, 0xB1EF, 0x8794,\t0xB1F0, 0xB4A5, 0xB1F1, 0x8795, 0xB1F2, 0x8796, 0xB1F3, 0x8797,\n\t0xB1F4, 0x8798, 0xB1F5, 0x8799, 0xB1F6, 0x879A, 0xB1F7, 0x879B,\t0xB1F8, 0x879C, 0xB1F9, 0xB4A6, 0xB1FA, 0x879D, 0xB1FB, 0xB4A7,\n\t0xB1FC, 0x879E, 0xB1FD, 0xB4A8, 0xB1FE, 0x879F, 0xB1FF, 0x87A0,\t0xB200, 0x87A1, 0xB201, 0x87A2, 0xB202, 0x87A3, 0xB203, 0x87A4,\n\t0xB204, 0xB4A9, 0xB205, 0xB4AA, 0xB206, 0x87A5, 0xB207, 0x87A6,\t0xB208, 0xB4AB, 0xB209, 0x87A7, 0xB20A, 0x87A8, 0xB20B, 0xB4AC,\n\t0xB20C, 0xB4AD, 0xB20D, 0x87A9, 0xB20E, 0x87AA, 0xB20F, 0x87AB,\t0xB210, 0x87AC, 0xB211, 0x87AD, 0xB212, 0x87AE, 0xB213, 0x87AF,\n\t0xB214, 0xB4AE, 0xB215, 0xB4AF, 0xB216, 0x87B0, 0xB217, 0xB4B0,\t0xB218, 0x87B1, 0xB219, 0xB4B1, 0xB21A, 0x87B2, 0xB21B, 0x87B3,\n\t0xB21C, 0x87B4, 0xB21D, 0x87B5, 0xB21E, 0x87B6, 0xB21F, 0x87B7,\t0xB220, 0xB4B2, 0xB221, 0x87B8, 0xB222, 0x87B9, 0xB223, 0x87BA,\n\t0xB224, 0x87BB, 0xB225, 0x87BC, 0xB226, 0x87BD, 0xB227, 0x87BE,\t0xB228, 0x87BF, 0xB229, 0x87C0, 0xB22A, 0x87C1, 0xB22B, 0x87C2,\n\t0xB22C, 0x87C3, 0xB22D, 0x87C4, 0xB22E, 0x87C5, 0xB22F, 0x87C6,\t0xB230, 0x87C7, 0xB231, 0x87C8, 0xB232, 0x87C9, 0xB233, 0x87CA,\n\t0xB234, 0xB4B3, 0xB235, 0x87CB, 0xB236, 0x87CC, 0xB237, 0x87CD,\t0xB238, 0x87CE, 0xB239, 0x87CF, 0xB23A, 0x87D0, 0xB23B, 0x87D1,\n\t0xB23C, 0xB4B4, 0xB23D, 0x87D2, 0xB23E, 0x87D3, 0xB23F, 0x87D4,\t0xB240, 0x87D5, 0xB241, 0x87D6, 0xB242, 0x87D7, 0xB243, 0x87D8,\n\t0xB244, 0x87D9, 0xB245, 0x87DA, 0xB246, 0x87DB, 0xB247, 0x87DC,\t0xB248, 0x87DD, 0xB249, 0x87DE, 0xB24A, 0x87DF, 0xB24B, 0x87E0,\n\t0xB24C, 0x87E1, 0xB24D, 0x87E2, 0xB24E, 0x87E3, 0xB24F, 0x87E4,\t0xB250, 0x87E5, 0xB251, 0x87E6, 0xB252, 0x87E7, 0xB253, 0x87E8,\n\t0xB254, 0x87E9, 0xB255, 0x87EA, 0xB256, 0x87EB, 0xB257, 0x87EC,\t0xB258, 0xB4B5, 0xB259, 0x87ED, 0xB25A, 0x87EE, 0xB25B, 0x87EF,\n\t0xB25C, 0xB4B6, 0xB25D, 0x87F0, 0xB25E, 0x87F1, 0xB25F, 0x87F2,\t0xB260, 0xB4B7, 0xB261, 0x87F3, 0xB262, 0x87F4, 0xB263, 0x87F5,\n\t0xB264, 0x87F6, 0xB265, 0x87F7, 0xB266, 0x87F8, 0xB267, 0x87F9,\t0xB268, 0xB4B8, 0xB269, 0xB4B9, 0xB26A, 0x87FA, 0xB26B, 0x87FB,\n\t0xB26C, 0x87FC, 0xB26D, 0x87FD, 0xB26E, 0x87FE, 0xB26F, 0x8841,\t0xB270, 0x8842, 0xB271, 0x8843, 0xB272, 0x8844, 0xB273, 0x8845,\n\t0xB274, 0xB4BA, 0xB275, 0xB4BB, 0xB276, 0x8846, 0xB277, 0x8847,\t0xB278, 0x8848, 0xB279, 0x8849, 0xB27A, 0x884A, 0xB27B, 0x884B,\n\t0xB27C, 0xB4BC, 0xB27D, 0x884C, 0xB27E, 0x884D, 0xB27F, 0x884E,\t0xB280, 0x884F, 0xB281, 0x8850, 0xB282, 0x8851, 0xB283, 0x8852,\n\t0xB284, 0xB4BD, 0xB285, 0xB4BE, 0xB286, 0x8853, 0xB287, 0x8854,\t0xB288, 0x8855, 0xB289, 0xB4BF, 0xB28A, 0x8856, 0xB28B, 0x8857,\n\t0xB28C, 0x8858, 0xB28D, 0x8859, 0xB28E, 0x885A, 0xB28F, 0x8861,\t0xB290, 0xB4C0, 0xB291, 0xB4C1, 0xB292, 0x8862, 0xB293, 0x8863,\n\t0xB294, 0xB4C2, 0xB295, 0x8864, 0xB296, 0x8865, 0xB297, 0x8866,\t0xB298, 0xB4C3, 0xB299, 0xB4C4, 0xB29A, 0xB4C5, 0xB29B, 0x8867,\n\t0xB29C, 0x8868, 0xB29D, 0x8869, 0xB29E, 0x886A, 0xB29F, 0x886B,\t0xB2A0, 0xB4C6, 0xB2A1, 0xB4C7, 0xB2A2, 0x886C, 0xB2A3, 0xB4C8,\n\t0xB2A4, 0x886D, 0xB2A5, 0xB4C9, 0xB2A6, 0xB4CA, 0xB2A7, 0x886E,\t0xB2A8, 0x886F, 0xB2A9, 0x8870, 0xB2AA, 0xB4CB, 0xB2AB, 0x8871,\n\t0xB2AC, 0xB4CC, 0xB2AD, 0x8872, 0xB2AE, 0x8873, 0xB2AF, 0x8874,\t0xB2B0, 0xB4CD, 0xB2B1, 0x8875, 0xB2B2, 0x8876, 0xB2B3, 0x8877,\n\t0xB2B4, 0xB4CE, 0xB2B5, 0x8878, 0xB2B6, 0x8879, 0xB2B7, 0x887A,\t0xB2B8, 0x8881, 0xB2B9, 0x8882, 0xB2BA, 0x8883, 0xB2BB, 0x8884,\n\t0xB2BC, 0x8885, 0xB2BD, 0x8886, 0xB2BE, 0x8887, 0xB2BF, 0x8888,\t0xB2C0, 0x8889, 0xB2C1, 0x888A, 0xB2C2, 0x888B, 0xB2C3, 0x888C,\n\t0xB2C4, 0x888D, 0xB2C5, 0x888E, 0xB2C6, 0x888F, 0xB2C7, 0x8890,\t0xB2C8, 0xB4CF, 0xB2C9, 0xB4D0, 0xB2CA, 0x8891, 0xB2CB, 0x8892,\n\t0xB2CC, 0xB4D1, 0xB2CD, 0x8893, 0xB2CE, 0x8894, 0xB2CF, 0x8895,\t0xB2D0, 0xB4D2, 0xB2D1, 0x8896, 0xB2D2, 0xB4D3, 0xB2D3, 0x8897,\n\t0xB2D4, 0x8898, 0xB2D5, 0x8899, 0xB2D6, 0x889A, 0xB2D7, 0x889B,\t0xB2D8, 0xB4D4, 0xB2D9, 0xB4D5, 0xB2DA, 0x889C, 0xB2DB, 0xB4D6,\n\t0xB2DC, 0x889D, 0xB2DD, 0xB4D7, 0xB2DE, 0x889E, 0xB2DF, 0x889F,\t0xB2E0, 0x88A0, 0xB2E1, 0x88A1, 0xB2E2, 0xB4D8, 0xB2E3, 0x88A2,\n\t0xB2E4, 0xB4D9, 0xB2E5, 0xB4DA, 0xB2E6, 0xB4DB, 0xB2E7, 0x88A3,\t0xB2E8, 0xB4DC, 0xB2E9, 0x88A4, 0xB2EA, 0x88A5, 0xB2EB, 0xB4DD,\n\t0xB2EC, 0xB4DE, 0xB2ED, 0xB4DF, 0xB2EE, 0xB4E0, 0xB2EF, 0xB4E1,\t0xB2F0, 0x88A6, 0xB2F1, 0x88A7, 0xB2F2, 0x88A8, 0xB2F3, 0xB4E2,\n\t0xB2F4, 0xB4E3, 0xB2F5, 0xB4E4, 0xB2F6, 0x88A9, 0xB2F7, 0xB4E5,\t0xB2F8, 0xB4E6, 0xB2F9, 0xB4E7, 0xB2FA, 0xB4E8, 0xB2FB, 0xB4E9,\n\t0xB2FC, 0x88AA, 0xB2FD, 0x88AB, 0xB2FE, 0x88AC, 0xB2FF, 0xB4EA,\t0xB300, 0xB4EB, 0xB301, 0xB4EC, 0xB302, 0x88AD, 0xB303, 0x88AE,\n\t0xB304, 0xB4ED, 0xB305, 0x88AF, 0xB306, 0x88B0, 0xB307, 0x88B1,\t0xB308, 0xB4EE, 0xB309, 0x88B2, 0xB30A, 0x88B3, 0xB30B, 0x88B4,\n\t0xB30C, 0x88B5, 0xB30D, 0x88B6, 0xB30E, 0x88B7, 0xB30F, 0x88B8,\t0xB310, 0xB4EF, 0xB311, 0xB4F0, 0xB312, 0x88B9, 0xB313, 0xB4F1,\n\t0xB314, 0xB4F2, 0xB315, 0xB4F3, 0xB316, 0x88BA, 0xB317, 0x88BB,\t0xB318, 0x88BC, 0xB319, 0x88BD, 0xB31A, 0x88BE, 0xB31B, 0x88BF,\n\t0xB31C, 0xB4F4, 0xB31D, 0x88C0, 0xB31E, 0x88C1, 0xB31F, 0x88C2,\t0xB320, 0x88C3, 0xB321, 0x88C4, 0xB322, 0x88C5, 0xB323, 0x88C6,\n\t0xB324, 0x88C7, 0xB325, 0x88C8, 0xB326, 0x88C9, 0xB327, 0x88CA,\t0xB328, 0x88CB, 0xB329, 0x88CC, 0xB32A, 0x88CD, 0xB32B, 0x88CE,\n\t0xB32C, 0x88CF, 0xB32D, 0x88D0, 0xB32E, 0x88D1, 0xB32F, 0x88D2,\t0xB330, 0x88D3, 0xB331, 0x88D4, 0xB332, 0x88D5, 0xB333, 0x88D6,\n\t0xB334, 0x88D7, 0xB335, 0x88D8, 0xB336, 0x88D9, 0xB337, 0x88DA,\t0xB338, 0x88DB, 0xB339, 0x88DC, 0xB33A, 0x88DD, 0xB33B, 0x88DE,\n\t0xB33C, 0x88DF, 0xB33D, 0x88E0, 0xB33E, 0x88E1, 0xB33F, 0x88E2,\t0xB340, 0x88E3, 0xB341, 0x88E4, 0xB342, 0x88E5, 0xB343, 0x88E6,\n\t0xB344, 0x88E7, 0xB345, 0x88E8, 0xB346, 0x88E9, 0xB347, 0x88EA,\t0xB348, 0x88EB, 0xB349, 0x88EC, 0xB34A, 0x88ED, 0xB34B, 0x88EE,\n\t0xB34C, 0x88EF, 0xB34D, 0x88F0, 0xB34E, 0x88F1, 0xB34F, 0x88F2,\t0xB350, 0x88F3, 0xB351, 0x88F4, 0xB352, 0x88F5, 0xB353, 0x88F6,\n\t0xB354, 0xB4F5, 0xB355, 0xB4F6, 0xB356, 0xB4F7, 0xB357, 0x88F7,\t0xB358, 0xB4F8, 0xB359, 0x88F8, 0xB35A, 0x88F9, 0xB35B, 0xB4F9,\n\t0xB35C, 0xB4FA, 0xB35D, 0x88FA, 0xB35E, 0xB4FB, 0xB35F, 0xB4FC,\t0xB360, 0x88FB, 0xB361, 0x88FC, 0xB362, 0x88FD, 0xB363, 0x88FE,\n\t0xB364, 0xB4FD, 0xB365, 0xB4FE, 0xB366, 0x8941, 0xB367, 0xB5A1,\t0xB368, 0x8942, 0xB369, 0xB5A2, 0xB36A, 0x8943, 0xB36B, 0xB5A3,\n\t0xB36C, 0x8944, 0xB36D, 0x8945, 0xB36E, 0xB5A4, 0xB36F, 0x8946,\t0xB370, 0xB5A5, 0xB371, 0xB5A6, 0xB372, 0x8947, 0xB373, 0x8948,\n\t0xB374, 0xB5A7, 0xB375, 0x8949, 0xB376, 0x894A, 0xB377, 0x894B,\t0xB378, 0xB5A8, 0xB379, 0x894C, 0xB37A, 0x894D, 0xB37B, 0x894E,\n\t0xB37C, 0x894F, 0xB37D, 0x8950, 0xB37E, 0x8951, 0xB37F, 0x8952,\t0xB380, 0xB5A9, 0xB381, 0xB5AA, 0xB382, 0x8953, 0xB383, 0xB5AB,\n\t0xB384, 0xB5AC, 0xB385, 0xB5AD, 0xB386, 0x8954, 0xB387, 0x8955,\t0xB388, 0x8956, 0xB389, 0x8957, 0xB38A, 0x8958, 0xB38B, 0x8959,\n\t0xB38C, 0xB5AE, 0xB38D, 0x895A, 0xB38E, 0x8961, 0xB38F, 0x8962,\t0xB390, 0xB5AF, 0xB391, 0x8963, 0xB392, 0x8964, 0xB393, 0x8965,\n\t0xB394, 0xB5B0, 0xB395, 0x8966, 0xB396, 0x8967, 0xB397, 0x8968,\t0xB398, 0x8969, 0xB399, 0x896A, 0xB39A, 0x896B, 0xB39B, 0x896C,\n\t0xB39C, 0x896D, 0xB39D, 0x896E, 0xB39E, 0x896F, 0xB39F, 0x8970,\t0xB3A0, 0xB5B1, 0xB3A1, 0xB5B2, 0xB3A2, 0x8971, 0xB3A3, 0x8972,\n\t0xB3A4, 0x8973, 0xB3A5, 0x8974, 0xB3A6, 0x8975, 0xB3A7, 0x8976,\t0xB3A8, 0xB5B3, 0xB3A9, 0x8977, 0xB3AA, 0x8978, 0xB3AB, 0x8979,\n\t0xB3AC, 0xB5B4, 0xB3AD, 0x897A, 0xB3AE, 0x8981, 0xB3AF, 0x8982,\t0xB3B0, 0x8983, 0xB3B1, 0x8984, 0xB3B2, 0x8985, 0xB3B3, 0x8986,\n\t0xB3B4, 0x8987, 0xB3B5, 0x8988, 0xB3B6, 0x8989, 0xB3B7, 0x898A,\t0xB3B8, 0x898B, 0xB3B9, 0x898C, 0xB3BA, 0x898D, 0xB3BB, 0x898E,\n\t0xB3BC, 0x898F, 0xB3BD, 0x8990, 0xB3BE, 0x8991, 0xB3BF, 0x8992,\t0xB3C0, 0x8993, 0xB3C1, 0x8994, 0xB3C2, 0x8995, 0xB3C3, 0x8996,\n\t0xB3C4, 0xB5B5, 0xB3C5, 0xB5B6, 0xB3C6, 0x8997, 0xB3C7, 0x8998,\t0xB3C8, 0xB5B7, 0xB3C9, 0x8999, 0xB3CA, 0x899A, 0xB3CB, 0xB5B8,\n\t0xB3CC, 0xB5B9, 0xB3CD, 0x899B, 0xB3CE, 0xB5BA, 0xB3CF, 0x899C,\t0xB3D0, 0xB5BB, 0xB3D1, 0x899D, 0xB3D2, 0x899E, 0xB3D3, 0x899F,\n\t0xB3D4, 0xB5BC, 0xB3D5, 0xB5BD, 0xB3D6, 0x89A0, 0xB3D7, 0xB5BE,\t0xB3D8, 0x89A1, 0xB3D9, 0xB5BF, 0xB3DA, 0x89A2, 0xB3DB, 0xB5C0,\n\t0xB3DC, 0x89A3, 0xB3DD, 0xB5C1, 0xB3DE, 0x89A4, 0xB3DF, 0x89A5,\t0xB3E0, 0xB5C2, 0xB3E1, 0x89A6, 0xB3E2, 0x89A7, 0xB3E3, 0x89A8,\n\t0xB3E4, 0xB5C3, 0xB3E5, 0x89A9, 0xB3E6, 0x89AA, 0xB3E7, 0x89AB,\t0xB3E8, 0xB5C4, 0xB3E9, 0x89AC, 0xB3EA, 0x89AD, 0xB3EB, 0x89AE,\n\t0xB3EC, 0x89AF, 0xB3ED, 0x89B0, 0xB3EE, 0x89B1, 0xB3EF, 0x89B2,\t0xB3F0, 0x89B3, 0xB3F1, 0x89B4, 0xB3F2, 0x89B5, 0xB3F3, 0x89B6,\n\t0xB3F4, 0x89B7, 0xB3F5, 0x89B8, 0xB3F6, 0x89B9, 0xB3F7, 0x89BA,\t0xB3F8, 0x89BB, 0xB3F9, 0x89BC, 0xB3FA, 0x89BD, 0xB3FB, 0x89BE,\n\t0xB3FC, 0xB5C5, 0xB3FD, 0x89BF, 0xB3FE, 0x89C0, 0xB3FF, 0x89C1,\t0xB400, 0x89C2, 0xB401, 0x89C3, 0xB402, 0x89C4, 0xB403, 0x89C5,\n\t0xB404, 0x89C6, 0xB405, 0x89C7, 0xB406, 0x89C8, 0xB407, 0x89C9,\t0xB408, 0x89CA, 0xB409, 0x89CB, 0xB40A, 0x89CC, 0xB40B, 0x89CD,\n\t0xB40C, 0x89CE, 0xB40D, 0x89CF, 0xB40E, 0x89D0, 0xB40F, 0x89D1,\t0xB410, 0xB5C6, 0xB411, 0x89D2, 0xB412, 0x89D3, 0xB413, 0x89D4,\n\t0xB414, 0x89D5, 0xB415, 0x89D6, 0xB416, 0x89D7, 0xB417, 0x89D8,\t0xB418, 0xB5C7, 0xB419, 0x89D9, 0xB41A, 0x89DA, 0xB41B, 0x89DB,\n\t0xB41C, 0xB5C8, 0xB41D, 0x89DC, 0xB41E, 0x89DD, 0xB41F, 0x89DE,\t0xB420, 0xB5C9, 0xB421, 0x89DF, 0xB422, 0x89E0, 0xB423, 0x89E1,\n\t0xB424, 0x89E2, 0xB425, 0x89E3, 0xB426, 0x89E4, 0xB427, 0x89E5,\t0xB428, 0xB5CA, 0xB429, 0xB5CB, 0xB42A, 0x89E6, 0xB42B, 0xB5CC,\n\t0xB42C, 0x89E7, 0xB42D, 0x89E8, 0xB42E, 0x89E9, 0xB42F, 0x89EA,\t0xB430, 0x89EB, 0xB431, 0x89EC, 0xB432, 0x89ED, 0xB433, 0x89EE,\n\t0xB434, 0xB5CD, 0xB435, 0x89EF, 0xB436, 0x89F0, 0xB437, 0x89F1,\t0xB438, 0x89F2, 0xB439, 0x89F3, 0xB43A, 0x89F4, 0xB43B, 0x89F5,\n\t0xB43C, 0x89F6, 0xB43D, 0x89F7, 0xB43E, 0x89F8, 0xB43F, 0x89F9,\t0xB440, 0x89FA, 0xB441, 0x89FB, 0xB442, 0x89FC, 0xB443, 0x89FD,\n\t0xB444, 0x89FE, 0xB445, 0x8A41, 0xB446, 0x8A42, 0xB447, 0x8A43,\t0xB448, 0x8A44, 0xB449, 0x8A45, 0xB44A, 0x8A46, 0xB44B, 0x8A47,\n\t0xB44C, 0x8A48, 0xB44D, 0x8A49, 0xB44E, 0x8A4A, 0xB44F, 0x8A4B,\t0xB450, 0xB5CE, 0xB451, 0xB5CF, 0xB452, 0x8A4C, 0xB453, 0x8A4D,\n\t0xB454, 0xB5D0, 0xB455, 0x8A4E, 0xB456, 0x8A4F, 0xB457, 0x8A50,\t0xB458, 0xB5D1, 0xB459, 0x8A51, 0xB45A, 0x8A52, 0xB45B, 0x8A53,\n\t0xB45C, 0x8A54, 0xB45D, 0x8A55, 0xB45E, 0x8A56, 0xB45F, 0x8A57,\t0xB460, 0xB5D2, 0xB461, 0xB5D3, 0xB462, 0x8A58, 0xB463, 0xB5D4,\n\t0xB464, 0x8A59, 0xB465, 0xB5D5, 0xB466, 0x8A5A, 0xB467, 0x8A61,\t0xB468, 0x8A62, 0xB469, 0x8A63, 0xB46A, 0x8A64, 0xB46B, 0x8A65,\n\t0xB46C, 0xB5D6, 0xB46D, 0x8A66, 0xB46E, 0x8A67, 0xB46F, 0x8A68,\t0xB470, 0x8A69, 0xB471, 0x8A6A, 0xB472, 0x8A6B, 0xB473, 0x8A6C,\n\t0xB474, 0x8A6D, 0xB475, 0x8A6E, 0xB476, 0x8A6F, 0xB477, 0x8A70,\t0xB478, 0x8A71, 0xB479, 0x8A72, 0xB47A, 0x8A73, 0xB47B, 0x8A74,\n\t0xB47C, 0x8A75, 0xB47D, 0x8A76, 0xB47E, 0x8A77, 0xB47F, 0x8A78,\t0xB480, 0xB5D7, 0xB481, 0x8A79, 0xB482, 0x8A7A, 0xB483, 0x8A81,\n\t0xB484, 0x8A82, 0xB485, 0x8A83, 0xB486, 0x8A84, 0xB487, 0x8A85,\t0xB488, 0xB5D8, 0xB489, 0x8A86, 0xB48A, 0x8A87, 0xB48B, 0x8A88,\n\t0xB48C, 0x8A89, 0xB48D, 0x8A8A, 0xB48E, 0x8A8B, 0xB48F, 0x8A8C,\t0xB490, 0x8A8D, 0xB491, 0x8A8E, 0xB492, 0x8A8F, 0xB493, 0x8A90,\n\t0xB494, 0x8A91, 0xB495, 0x8A92, 0xB496, 0x8A93, 0xB497, 0x8A94,\t0xB498, 0x8A95, 0xB499, 0x8A96, 0xB49A, 0x8A97, 0xB49B, 0x8A98,\n\t0xB49C, 0x8A99, 0xB49D, 0xB5D9, 0xB49E, 0x8A9A, 0xB49F, 0x8A9B,\t0xB4A0, 0x8A9C, 0xB4A1, 0x8A9D, 0xB4A2, 0x8A9E, 0xB4A3, 0x8A9F,\n\t0xB4A4, 0xB5DA, 0xB4A5, 0x8AA0, 0xB4A6, 0x8AA1, 0xB4A7, 0x8AA2,\t0xB4A8, 0xB5DB, 0xB4A9, 0x8AA3, 0xB4AA, 0x8AA4, 0xB4AB, 0x8AA5,\n\t0xB4AC, 0xB5DC, 0xB4AD, 0x8AA6, 0xB4AE, 0x8AA7, 0xB4AF, 0x8AA8,\t0xB4B0, 0x8AA9, 0xB4B1, 0x8AAA, 0xB4B2, 0x8AAB, 0xB4B3, 0x8AAC,\n\t0xB4B4, 0x8AAD, 0xB4B5, 0xB5DD, 0xB4B6, 0x8AAE, 0xB4B7, 0xB5DE,\t0xB4B8, 0x8AAF, 0xB4B9, 0xB5DF, 0xB4BA, 0x8AB0, 0xB4BB, 0x8AB1,\n\t0xB4BC, 0x8AB2, 0xB4BD, 0x8AB3, 0xB4BE, 0x8AB4, 0xB4BF, 0x8AB5,\t0xB4C0, 0xB5E0, 0xB4C1, 0x8AB6, 0xB4C2, 0x8AB7, 0xB4C3, 0x8AB8,\n\t0xB4C4, 0xB5E1, 0xB4C5, 0x8AB9, 0xB4C6, 0x8ABA, 0xB4C7, 0x8ABB,\t0xB4C8, 0xB5E2, 0xB4C9, 0x8ABC, 0xB4CA, 0x8ABD, 0xB4CB, 0x8ABE,\n\t0xB4CC, 0x8ABF, 0xB4CD, 0x8AC0, 0xB4CE, 0x8AC1, 0xB4CF, 0x8AC2,\t0xB4D0, 0xB5E3, 0xB4D1, 0x8AC3, 0xB4D2, 0x8AC4, 0xB4D3, 0x8AC5,\n\t0xB4D4, 0x8AC6, 0xB4D5, 0xB5E4, 0xB4D6, 0x8AC7, 0xB4D7, 0x8AC8,\t0xB4D8, 0x8AC9, 0xB4D9, 0x8ACA, 0xB4DA, 0x8ACB, 0xB4DB, 0x8ACC,\n\t0xB4DC, 0xB5E5, 0xB4DD, 0xB5E6, 0xB4DE, 0x8ACD, 0xB4DF, 0x8ACE,\t0xB4E0, 0xB5E7, 0xB4E1, 0x8ACF, 0xB4E2, 0x8AD0, 0xB4E3, 0xB5E8,\n\t0xB4E4, 0xB5E9, 0xB4E5, 0x8AD1, 0xB4E6, 0xB5EA, 0xB4E7, 0x8AD2,\t0xB4E8, 0x8AD3, 0xB4E9, 0x8AD4, 0xB4EA, 0x8AD5, 0xB4EB, 0x8AD6,\n\t0xB4EC, 0xB5EB, 0xB4ED, 0xB5EC, 0xB4EE, 0x8AD7, 0xB4EF, 0xB5ED,\t0xB4F0, 0x8AD8, 0xB4F1, 0xB5EE, 0xB4F2, 0x8AD9, 0xB4F3, 0x8ADA,\n\t0xB4F4, 0x8ADB, 0xB4F5, 0x8ADC, 0xB4F6, 0x8ADD, 0xB4F7, 0x8ADE,\t0xB4F8, 0xB5EF, 0xB4F9, 0x8ADF, 0xB4FA, 0x8AE0, 0xB4FB, 0x8AE1,\n\t0xB4FC, 0x8AE2, 0xB4FD, 0x8AE3, 0xB4FE, 0x8AE4, 0xB4FF, 0x8AE5,\t0xB500, 0x8AE6, 0xB501, 0x8AE7, 0xB502, 0x8AE8, 0xB503, 0x8AE9,\n\t0xB504, 0x8AEA, 0xB505, 0x8AEB, 0xB506, 0x8AEC, 0xB507, 0x8AED,\t0xB508, 0x8AEE, 0xB509, 0x8AEF, 0xB50A, 0x8AF0, 0xB50B, 0x8AF1,\n\t0xB50C, 0x8AF2, 0xB50D, 0x8AF3, 0xB50E, 0x8AF4, 0xB50F, 0x8AF5,\t0xB510, 0x8AF6, 0xB511, 0x8AF7, 0xB512, 0x8AF8, 0xB513, 0x8AF9,\n\t0xB514, 0xB5F0, 0xB515, 0xB5F1, 0xB516, 0x8AFA, 0xB517, 0x8AFB,\t0xB518, 0xB5F2, 0xB519, 0x8AFC, 0xB51A, 0x8AFD, 0xB51B, 0xB5F3,\n\t0xB51C, 0xB5F4, 0xB51D, 0x8AFE, 0xB51E, 0x8B41, 0xB51F, 0x8B42,\t0xB520, 0x8B43, 0xB521, 0x8B44, 0xB522, 0x8B45, 0xB523, 0x8B46,\n\t0xB524, 0xB5F5, 0xB525, 0xB5F6, 0xB526, 0x8B47, 0xB527, 0xB5F7,\t0xB528, 0xB5F8, 0xB529, 0xB5F9, 0xB52A, 0xB5FA, 0xB52B, 0x8B48,\n\t0xB52C, 0x8B49, 0xB52D, 0x8B4A, 0xB52E, 0x8B4B, 0xB52F, 0x8B4C,\t0xB530, 0xB5FB, 0xB531, 0xB5FC, 0xB532, 0x8B4D, 0xB533, 0x8B4E,\n\t0xB534, 0xB5FD, 0xB535, 0x8B4F, 0xB536, 0x8B50, 0xB537, 0x8B51,\t0xB538, 0xB5FE, 0xB539, 0x8B52, 0xB53A, 0x8B53, 0xB53B, 0x8B54,\n\t0xB53C, 0x8B55, 0xB53D, 0x8B56, 0xB53E, 0x8B57, 0xB53F, 0x8B58,\t0xB540, 0xB6A1, 0xB541, 0xB6A2, 0xB542, 0x8B59, 0xB543, 0xB6A3,\n\t0xB544, 0xB6A4, 0xB545, 0xB6A5, 0xB546, 0x8B5A, 0xB547, 0x8B61,\t0xB548, 0x8B62, 0xB549, 0x8B63, 0xB54A, 0x8B64, 0xB54B, 0xB6A6,\n\t0xB54C, 0xB6A7, 0xB54D, 0xB6A8, 0xB54E, 0x8B65, 0xB54F, 0x8B66,\t0xB550, 0xB6A9, 0xB551, 0x8B67, 0xB552, 0x8B68, 0xB553, 0x8B69,\n\t0xB554, 0xB6AA, 0xB555, 0x8B6A, 0xB556, 0x8B6B, 0xB557, 0x8B6C,\t0xB558, 0x8B6D, 0xB559, 0x8B6E, 0xB55A, 0x8B6F, 0xB55B, 0x8B70,\n\t0xB55C, 0xB6AB, 0xB55D, 0xB6AC, 0xB55E, 0x8B71, 0xB55F, 0xB6AD,\t0xB560, 0xB6AE, 0xB561, 0xB6AF, 0xB562, 0x8B72, 0xB563, 0x8B73,\n\t0xB564, 0x8B74, 0xB565, 0x8B75, 0xB566, 0x8B76, 0xB567, 0x8B77,\t0xB568, 0x8B78, 0xB569, 0x8B79, 0xB56A, 0x8B7A, 0xB56B, 0x8B81,\n\t0xB56C, 0x8B82, 0xB56D, 0x8B83, 0xB56E, 0x8B84, 0xB56F, 0x8B85,\t0xB570, 0x8B86, 0xB571, 0x8B87, 0xB572, 0x8B88, 0xB573, 0x8B89,\n\t0xB574, 0x8B8A, 0xB575, 0x8B8B, 0xB576, 0x8B8C, 0xB577, 0x8B8D,\t0xB578, 0x8B8E, 0xB579, 0x8B8F, 0xB57A, 0x8B90, 0xB57B, 0x8B91,\n\t0xB57C, 0x8B92, 0xB57D, 0x8B93, 0xB57E, 0x8B94, 0xB57F, 0x8B95,\t0xB580, 0x8B96, 0xB581, 0x8B97, 0xB582, 0x8B98, 0xB583, 0x8B99,\n\t0xB584, 0x8B9A, 0xB585, 0x8B9B, 0xB586, 0x8B9C, 0xB587, 0x8B9D,\t0xB588, 0x8B9E, 0xB589, 0x8B9F, 0xB58A, 0x8BA0, 0xB58B, 0x8BA1,\n\t0xB58C, 0x8BA2, 0xB58D, 0x8BA3, 0xB58E, 0x8BA4, 0xB58F, 0x8BA5,\t0xB590, 0x8BA6, 0xB591, 0x8BA7, 0xB592, 0x8BA8, 0xB593, 0x8BA9,\n\t0xB594, 0x8BAA, 0xB595, 0x8BAB, 0xB596, 0x8BAC, 0xB597, 0x8BAD,\t0xB598, 0x8BAE, 0xB599, 0x8BAF, 0xB59A, 0x8BB0, 0xB59B, 0x8BB1,\n\t0xB59C, 0x8BB2, 0xB59D, 0x8BB3, 0xB59E, 0x8BB4, 0xB59F, 0x8BB5,\t0xB5A0, 0xB6B0, 0xB5A1, 0xB6B1, 0xB5A2, 0x8BB6, 0xB5A3, 0x8BB7,\n\t0xB5A4, 0xB6B2, 0xB5A5, 0x8BB8, 0xB5A6, 0x8BB9, 0xB5A7, 0x8BBA,\t0xB5A8, 0xB6B3, 0xB5A9, 0x8BBB, 0xB5AA, 0xB6B4, 0xB5AB, 0xB6B5,\n\t0xB5AC, 0x8BBC, 0xB5AD, 0x8BBD, 0xB5AE, 0x8BBE, 0xB5AF, 0x8BBF,\t0xB5B0, 0xB6B6, 0xB5B1, 0xB6B7, 0xB5B2, 0x8BC0, 0xB5B3, 0xB6B8,\n\t0xB5B4, 0xB6B9, 0xB5B5, 0xB6BA, 0xB5B6, 0x8BC1, 0xB5B7, 0x8BC2,\t0xB5B8, 0x8BC3, 0xB5B9, 0x8BC4, 0xB5BA, 0x8BC5, 0xB5BB, 0xB6BB,\n\t0xB5BC, 0xB6BC, 0xB5BD, 0xB6BD, 0xB5BE, 0x8BC6, 0xB5BF, 0x8BC7,\t0xB5C0, 0xB6BE, 0xB5C1, 0x8BC8, 0xB5C2, 0x8BC9, 0xB5C3, 0x8BCA,\n\t0xB5C4, 0xB6BF, 0xB5C5, 0x8BCB, 0xB5C6, 0x8BCC, 0xB5C7, 0x8BCD,\t0xB5C8, 0x8BCE, 0xB5C9, 0x8BCF, 0xB5CA, 0x8BD0, 0xB5CB, 0x8BD1,\n\t0xB5CC, 0xB6C0, 0xB5CD, 0xB6C1, 0xB5CE, 0x8BD2, 0xB5CF, 0xB6C2,\t0xB5D0, 0xB6C3, 0xB5D1, 0xB6C4, 0xB5D2, 0x8BD3, 0xB5D3, 0x8BD4,\n\t0xB5D4, 0x8BD5, 0xB5D5, 0x8BD6, 0xB5D6, 0x8BD7, 0xB5D7, 0x8BD8,\t0xB5D8, 0xB6C5, 0xB5D9, 0x8BD9, 0xB5DA, 0x8BDA, 0xB5DB, 0x8BDB,\n\t0xB5DC, 0x8BDC, 0xB5DD, 0x8BDD, 0xB5DE, 0x8BDE, 0xB5DF, 0x8BDF,\t0xB5E0, 0x8BE0, 0xB5E1, 0x8BE1, 0xB5E2, 0x8BE2, 0xB5E3, 0x8BE3,\n\t0xB5E4, 0x8BE4, 0xB5E5, 0x8BE5, 0xB5E6, 0x8BE6, 0xB5E7, 0x8BE7,\t0xB5E8, 0x8BE8, 0xB5E9, 0x8BE9, 0xB5EA, 0x8BEA, 0xB5EB, 0x8BEB,\n\t0xB5EC, 0xB6C6, 0xB5ED, 0x8BEC, 0xB5EE, 0x8BED, 0xB5EF, 0x8BEE,\t0xB5F0, 0x8BEF, 0xB5F1, 0x8BF0, 0xB5F2, 0x8BF1, 0xB5F3, 0x8BF2,\n\t0xB5F4, 0x8BF3, 0xB5F5, 0x8BF4, 0xB5F6, 0x8BF5, 0xB5F7, 0x8BF6,\t0xB5F8, 0x8BF7, 0xB5F9, 0x8BF8, 0xB5FA, 0x8BF9, 0xB5FB, 0x8BFA,\n\t0xB5FC, 0x8BFB, 0xB5FD, 0x8BFC, 0xB5FE, 0x8BFD, 0xB5FF, 0x8BFE,\t0xB600, 0x8C41, 0xB601, 0x8C42, 0xB602, 0x8C43, 0xB603, 0x8C44,\n\t0xB604, 0x8C45, 0xB605, 0x8C46, 0xB606, 0x8C47, 0xB607, 0x8C48,\t0xB608, 0x8C49, 0xB609, 0x8C4A, 0xB60A, 0x8C4B, 0xB60B, 0x8C4C,\n\t0xB60C, 0x8C4D, 0xB60D, 0x8C4E, 0xB60E, 0x8C4F, 0xB60F, 0x8C50,\t0xB610, 0xB6C7, 0xB611, 0xB6C8, 0xB612, 0x8C51, 0xB613, 0x8C52,\n\t0xB614, 0xB6C9, 0xB615, 0x8C53, 0xB616, 0x8C54, 0xB617, 0x8C55,\t0xB618, 0xB6CA, 0xB619, 0x8C56, 0xB61A, 0x8C57, 0xB61B, 0x8C58,\n\t0xB61C, 0x8C59, 0xB61D, 0x8C5A, 0xB61E, 0x8C61, 0xB61F, 0x8C62,\t0xB620, 0x8C63, 0xB621, 0x8C64, 0xB622, 0x8C65, 0xB623, 0x8C66,\n\t0xB624, 0x8C67, 0xB625, 0xB6CB, 0xB626, 0x8C68, 0xB627, 0x8C69,\t0xB628, 0x8C6A, 0xB629, 0x8C6B, 0xB62A, 0x8C6C, 0xB62B, 0x8C6D,\n\t0xB62C, 0xB6CC, 0xB62D, 0x8C6E, 0xB62E, 0x8C6F, 0xB62F, 0x8C70,\t0xB630, 0x8C71, 0xB631, 0x8C72, 0xB632, 0x8C73, 0xB633, 0x8C74,\n\t0xB634, 0xB6CD, 0xB635, 0x8C75, 0xB636, 0x8C76, 0xB637, 0x8C77,\t0xB638, 0x8C78, 0xB639, 0x8C79, 0xB63A, 0x8C7A, 0xB63B, 0x8C81,\n\t0xB63C, 0x8C82, 0xB63D, 0x8C83, 0xB63E, 0x8C84, 0xB63F, 0x8C85,\t0xB640, 0x8C86, 0xB641, 0x8C87, 0xB642, 0x8C88, 0xB643, 0x8C89,\n\t0xB644, 0x8C8A, 0xB645, 0x8C8B, 0xB646, 0x8C8C, 0xB647, 0x8C8D,\t0xB648, 0xB6CE, 0xB649, 0x8C8E, 0xB64A, 0x8C8F, 0xB64B, 0x8C90,\n\t0xB64C, 0x8C91, 0xB64D, 0x8C92, 0xB64E, 0x8C93, 0xB64F, 0x8C94,\t0xB650, 0x8C95, 0xB651, 0x8C96, 0xB652, 0x8C97, 0xB653, 0x8C98,\n\t0xB654, 0x8C99, 0xB655, 0x8C9A, 0xB656, 0x8C9B, 0xB657, 0x8C9C,\t0xB658, 0x8C9D, 0xB659, 0x8C9E, 0xB65A, 0x8C9F, 0xB65B, 0x8CA0,\n\t0xB65C, 0x8CA1, 0xB65D, 0x8CA2, 0xB65E, 0x8CA3, 0xB65F, 0x8CA4,\t0xB660, 0x8CA5, 0xB661, 0x8CA6, 0xB662, 0x8CA7, 0xB663, 0x8CA8,\n\t0xB664, 0xB6CF, 0xB665, 0x8CA9, 0xB666, 0x8CAA, 0xB667, 0x8CAB,\t0xB668, 0xB6D0, 0xB669, 0x8CAC, 0xB66A, 0x8CAD, 0xB66B, 0x8CAE,\n\t0xB66C, 0x8CAF, 0xB66D, 0x8CB0, 0xB66E, 0x8CB1, 0xB66F, 0x8CB2,\t0xB670, 0x8CB3, 0xB671, 0x8CB4, 0xB672, 0x8CB5, 0xB673, 0x8CB6,\n\t0xB674, 0x8CB7, 0xB675, 0x8CB8, 0xB676, 0x8CB9, 0xB677, 0x8CBA,\t0xB678, 0x8CBB, 0xB679, 0x8CBC, 0xB67A, 0x8CBD, 0xB67B, 0x8CBE,\n\t0xB67C, 0x8CBF, 0xB67D, 0x8CC0, 0xB67E, 0x8CC1, 0xB67F, 0x8CC2,\t0xB680, 0x8CC3, 0xB681, 0x8CC4, 0xB682, 0x8CC5, 0xB683, 0x8CC6,\n\t0xB684, 0x8CC7, 0xB685, 0x8CC8, 0xB686, 0x8CC9, 0xB687, 0x8CCA,\t0xB688, 0x8CCB, 0xB689, 0x8CCC, 0xB68A, 0x8CCD, 0xB68B, 0x8CCE,\n\t0xB68C, 0x8CCF, 0xB68D, 0x8CD0, 0xB68E, 0x8CD1, 0xB68F, 0x8CD2,\t0xB690, 0x8CD3, 0xB691, 0x8CD4, 0xB692, 0x8CD5, 0xB693, 0x8CD6,\n\t0xB694, 0x8CD7, 0xB695, 0x8CD8, 0xB696, 0x8CD9, 0xB697, 0x8CDA,\t0xB698, 0x8CDB, 0xB699, 0x8CDC, 0xB69A, 0x8CDD, 0xB69B, 0x8CDE,\n\t0xB69C, 0xB6D1, 0xB69D, 0xB6D2, 0xB69E, 0x8CDF, 0xB69F, 0x8CE0,\t0xB6A0, 0xB6D3, 0xB6A1, 0x8CE1, 0xB6A2, 0x8CE2, 0xB6A3, 0x8CE3,\n\t0xB6A4, 0xB6D4, 0xB6A5, 0x8CE4, 0xB6A6, 0x8CE5, 0xB6A7, 0x8CE6,\t0xB6A8, 0x8CE7, 0xB6A9, 0x8CE8, 0xB6AA, 0x8CE9, 0xB6AB, 0xB6D5,\n\t0xB6AC, 0xB6D6, 0xB6AD, 0x8CEA, 0xB6AE, 0x8CEB, 0xB6AF, 0x8CEC,\t0xB6B0, 0x8CED, 0xB6B1, 0xB6D7, 0xB6B2, 0x8CEE, 0xB6B3, 0x8CEF,\n\t0xB6B4, 0x8CF0, 0xB6B5, 0x8CF1, 0xB6B6, 0x8CF2, 0xB6B7, 0x8CF3,\t0xB6B8, 0x8CF4, 0xB6B9, 0x8CF5, 0xB6BA, 0x8CF6, 0xB6BB, 0x8CF7,\n\t0xB6BC, 0x8CF8, 0xB6BD, 0x8CF9, 0xB6BE, 0x8CFA, 0xB6BF, 0x8CFB,\t0xB6C0, 0x8CFC, 0xB6C1, 0x8CFD, 0xB6C2, 0x8CFE, 0xB6C3, 0x8D41,\n\t0xB6C4, 0x8D42, 0xB6C5, 0x8D43, 0xB6C6, 0x8D44, 0xB6C7, 0x8D45,\t0xB6C8, 0x8D46, 0xB6C9, 0x8D47, 0xB6CA, 0x8D48, 0xB6CB, 0x8D49,\n\t0xB6CC, 0x8D4A, 0xB6CD, 0x8D4B, 0xB6CE, 0x8D4C, 0xB6CF, 0x8D4D,\t0xB6D0, 0x8D4E, 0xB6D1, 0x8D4F, 0xB6D2, 0x8D50, 0xB6D3, 0x8D51,\n\t0xB6D4, 0xB6D8, 0xB6D5, 0x8D52, 0xB6D6, 0x8D53, 0xB6D7, 0x8D54,\t0xB6D8, 0x8D55, 0xB6D9, 0x8D56, 0xB6DA, 0x8D57, 0xB6DB, 0x8D58,\n\t0xB6DC, 0x8D59, 0xB6DD, 0x8D5A, 0xB6DE, 0x8D61, 0xB6DF, 0x8D62,\t0xB6E0, 0x8D63, 0xB6E1, 0x8D64, 0xB6E2, 0x8D65, 0xB6E3, 0x8D66,\n\t0xB6E4, 0x8D67, 0xB6E5, 0x8D68, 0xB6E6, 0x8D69, 0xB6E7, 0x8D6A,\t0xB6E8, 0x8D6B, 0xB6E9, 0x8D6C, 0xB6EA, 0x8D6D, 0xB6EB, 0x8D6E,\n\t0xB6EC, 0x8D6F, 0xB6ED, 0x8D70, 0xB6EE, 0x8D71, 0xB6EF, 0x8D72,\t0xB6F0, 0xB6D9, 0xB6F1, 0x8D73, 0xB6F2, 0x8D74, 0xB6F3, 0x8D75,\n\t0xB6F4, 0xB6DA, 0xB6F5, 0x8D76, 0xB6F6, 0x8D77, 0xB6F7, 0x8D78,\t0xB6F8, 0xB6DB, 0xB6F9, 0x8D79, 0xB6FA, 0x8D7A, 0xB6FB, 0x8D81,\n\t0xB6FC, 0x8D82, 0xB6FD, 0x8D83, 0xB6FE, 0x8D84, 0xB6FF, 0x8D85,\t0xB700, 0xB6DC, 0xB701, 0xB6DD, 0xB702, 0x8D86, 0xB703, 0x8D87,\n\t0xB704, 0x8D88, 0xB705, 0xB6DE, 0xB706, 0x8D89, 0xB707, 0x8D8A,\t0xB708, 0x8D8B, 0xB709, 0x8D8C, 0xB70A, 0x8D8D, 0xB70B, 0x8D8E,\n\t0xB70C, 0x8D8F, 0xB70D, 0x8D90, 0xB70E, 0x8D91, 0xB70F, 0x8D92,\t0xB710, 0x8D93, 0xB711, 0x8D94, 0xB712, 0x8D95, 0xB713, 0x8D96,\n\t0xB714, 0x8D97, 0xB715, 0x8D98, 0xB716, 0x8D99, 0xB717, 0x8D9A,\t0xB718, 0x8D9B, 0xB719, 0x8D9C, 0xB71A, 0x8D9D, 0xB71B, 0x8D9E,\n\t0xB71C, 0x8D9F, 0xB71D, 0x8DA0, 0xB71E, 0x8DA1, 0xB71F, 0x8DA2,\t0xB720, 0x8DA3, 0xB721, 0x8DA4, 0xB722, 0x8DA5, 0xB723, 0x8DA6,\n\t0xB724, 0x8DA7, 0xB725, 0x8DA8, 0xB726, 0x8DA9, 0xB727, 0x8DAA,\t0xB728, 0xB6DF, 0xB729, 0xB6E0, 0xB72A, 0x8DAB, 0xB72B, 0x8DAC,\n\t0xB72C, 0xB6E1, 0xB72D, 0x8DAD, 0xB72E, 0x8DAE, 0xB72F, 0xB6E2,\t0xB730, 0xB6E3, 0xB731, 0x8DAF, 0xB732, 0x8DB0, 0xB733, 0x8DB1,\n\t0xB734, 0x8DB2, 0xB735, 0x8DB3, 0xB736, 0x8DB4, 0xB737, 0x8DB5,\t0xB738, 0xB6E4, 0xB739, 0xB6E5, 0xB73A, 0x8DB6, 0xB73B, 0xB6E6,\n\t0xB73C, 0x8DB7, 0xB73D, 0x8DB8, 0xB73E, 0x8DB9, 0xB73F, 0x8DBA,\t0xB740, 0x8DBB, 0xB741, 0x8DBC, 0xB742, 0x8DBD, 0xB743, 0x8DBE,\n\t0xB744, 0xB6E7, 0xB745, 0x8DBF, 0xB746, 0x8DC0, 0xB747, 0x8DC1,\t0xB748, 0xB6E8, 0xB749, 0x8DC2, 0xB74A, 0x8DC3, 0xB74B, 0x8DC4,\n\t0xB74C, 0xB6E9, 0xB74D, 0x8DC5, 0xB74E, 0x8DC6, 0xB74F, 0x8DC7,\t0xB750, 0x8DC8, 0xB751, 0x8DC9, 0xB752, 0x8DCA, 0xB753, 0x8DCB,\n\t0xB754, 0xB6EA, 0xB755, 0xB6EB, 0xB756, 0x8DCC, 0xB757, 0x8DCD,\t0xB758, 0x8DCE, 0xB759, 0x8DCF, 0xB75A, 0x8DD0, 0xB75B, 0x8DD1,\n\t0xB75C, 0x8DD2, 0xB75D, 0x8DD3, 0xB75E, 0x8DD4, 0xB75F, 0x8DD5,\t0xB760, 0xB6EC, 0xB761, 0x8DD6, 0xB762, 0x8DD7, 0xB763, 0x8DD8,\n\t0xB764, 0xB6ED, 0xB765, 0x8DD9, 0xB766, 0x8DDA, 0xB767, 0x8DDB,\t0xB768, 0xB6EE, 0xB769, 0x8DDC, 0xB76A, 0x8DDD, 0xB76B, 0x8DDE,\n\t0xB76C, 0x8DDF, 0xB76D, 0x8DE0, 0xB76E, 0x8DE1, 0xB76F, 0x8DE2,\t0xB770, 0xB6EF, 0xB771, 0xB6F0, 0xB772, 0x8DE3, 0xB773, 0xB6F1,\n\t0xB774, 0x8DE4, 0xB775, 0xB6F2, 0xB776, 0x8DE5, 0xB777, 0x8DE6,\t0xB778, 0x8DE7, 0xB779, 0x8DE8, 0xB77A, 0x8DE9, 0xB77B, 0x8DEA,\n\t0xB77C, 0xB6F3, 0xB77D, 0xB6F4, 0xB77E, 0x8DEB, 0xB77F, 0x8DEC,\t0xB780, 0xB6F5, 0xB781, 0x8DED, 0xB782, 0x8DEE, 0xB783, 0x8DEF,\n\t0xB784, 0xB6F6, 0xB785, 0x8DF0, 0xB786, 0x8DF1, 0xB787, 0x8DF2,\t0xB788, 0x8DF3, 0xB789, 0x8DF4, 0xB78A, 0x8DF5, 0xB78B, 0x8DF6,\n\t0xB78C, 0xB6F7, 0xB78D, 0xB6F8, 0xB78E, 0x8DF7, 0xB78F, 0xB6F9,\t0xB790, 0xB6FA, 0xB791, 0xB6FB, 0xB792, 0xB6FC, 0xB793, 0x8DF8,\n\t0xB794, 0x8DF9, 0xB795, 0x8DFA, 0xB796, 0xB6FD, 0xB797, 0xB6FE,\t0xB798, 0xB7A1, 0xB799, 0xB7A2, 0xB79A, 0x8DFB, 0xB79B, 0x8DFC,\n\t0xB79C, 0xB7A3, 0xB79D, 0x8DFD, 0xB79E, 0x8DFE, 0xB79F, 0x8E41,\t0xB7A0, 0xB7A4, 0xB7A1, 0x8E42, 0xB7A2, 0x8E43, 0xB7A3, 0x8E44,\n\t0xB7A4, 0x8E45, 0xB7A5, 0x8E46, 0xB7A6, 0x8E47, 0xB7A7, 0x8E48,\t0xB7A8, 0xB7A5, 0xB7A9, 0xB7A6, 0xB7AA, 0x8E49, 0xB7AB, 0xB7A7,\n\t0xB7AC, 0xB7A8, 0xB7AD, 0xB7A9, 0xB7AE, 0x8E4A, 0xB7AF, 0x8E4B,\t0xB7B0, 0x8E4C, 0xB7B1, 0x8E4D, 0xB7B2, 0x8E4E, 0xB7B3, 0x8E4F,\n\t0xB7B4, 0xB7AA, 0xB7B5, 0xB7AB, 0xB7B6, 0x8E50, 0xB7B7, 0x8E51,\t0xB7B8, 0xB7AC, 0xB7B9, 0x8E52, 0xB7BA, 0x8E53, 0xB7BB, 0x8E54,\n\t0xB7BC, 0x8E55, 0xB7BD, 0x8E56, 0xB7BE, 0x8E57, 0xB7BF, 0x8E58,\t0xB7C0, 0x8E59, 0xB7C1, 0x8E5A, 0xB7C2, 0x8E61, 0xB7C3, 0x8E62,\n\t0xB7C4, 0x8E63, 0xB7C5, 0x8E64, 0xB7C6, 0x8E65, 0xB7C7, 0xB7AD,\t0xB7C8, 0x8E66, 0xB7C9, 0xB7AE, 0xB7CA, 0x8E67, 0xB7CB, 0x8E68,\n\t0xB7CC, 0x8E69, 0xB7CD, 0x8E6A, 0xB7CE, 0x8E6B, 0xB7CF, 0x8E6C,\t0xB7D0, 0x8E6D, 0xB7D1, 0x8E6E, 0xB7D2, 0x8E6F, 0xB7D3, 0x8E70,\n\t0xB7D4, 0x8E71, 0xB7D5, 0x8E72, 0xB7D6, 0x8E73, 0xB7D7, 0x8E74,\t0xB7D8, 0x8E75, 0xB7D9, 0x8E76, 0xB7DA, 0x8E77, 0xB7DB, 0x8E78,\n\t0xB7DC, 0x8E79, 0xB7DD, 0x8E7A, 0xB7DE, 0x8E81, 0xB7DF, 0x8E82,\t0xB7E0, 0x8E83, 0xB7E1, 0x8E84, 0xB7E2, 0x8E85, 0xB7E3, 0x8E86,\n\t0xB7E4, 0x8E87, 0xB7E5, 0x8E88, 0xB7E6, 0x8E89, 0xB7E7, 0x8E8A,\t0xB7E8, 0x8E8B, 0xB7E9, 0x8E8C, 0xB7EA, 0x8E8D, 0xB7EB, 0x8E8E,\n\t0xB7EC, 0xB7AF, 0xB7ED, 0xB7B0, 0xB7EE, 0x8E8F, 0xB7EF, 0x8E90,\t0xB7F0, 0xB7B1, 0xB7F1, 0x8E91, 0xB7F2, 0x8E92, 0xB7F3, 0x8E93,\n\t0xB7F4, 0xB7B2, 0xB7F5, 0x8E94, 0xB7F6, 0x8E95, 0xB7F7, 0x8E96,\t0xB7F8, 0x8E97, 0xB7F9, 0x8E98, 0xB7FA, 0x8E99, 0xB7FB, 0x8E9A,\n\t0xB7FC, 0xB7B3, 0xB7FD, 0xB7B4, 0xB7FE, 0x8E9B, 0xB7FF, 0xB7B5,\t0xB800, 0xB7B6, 0xB801, 0xB7B7, 0xB802, 0x8E9C, 0xB803, 0x8E9D,\n\t0xB804, 0x8E9E, 0xB805, 0x8E9F, 0xB806, 0x8EA0, 0xB807, 0xB7B8,\t0xB808, 0xB7B9, 0xB809, 0xB7BA, 0xB80A, 0x8EA1, 0xB80B, 0x8EA2,\n\t0xB80C, 0xB7BB, 0xB80D, 0x8EA3, 0xB80E, 0x8EA4, 0xB80F, 0x8EA5,\t0xB810, 0xB7BC, 0xB811, 0x8EA6, 0xB812, 0x8EA7, 0xB813, 0x8EA8,\n\t0xB814, 0x8EA9, 0xB815, 0x8EAA, 0xB816, 0x8EAB, 0xB817, 0x8EAC,\t0xB818, 0xB7BD, 0xB819, 0xB7BE, 0xB81A, 0x8EAD, 0xB81B, 0xB7BF,\n\t0xB81C, 0x8EAE, 0xB81D, 0xB7C0, 0xB81E, 0x8EAF, 0xB81F, 0x8EB0,\t0xB820, 0x8EB1, 0xB821, 0x8EB2, 0xB822, 0x8EB3, 0xB823, 0x8EB4,\n\t0xB824, 0xB7C1, 0xB825, 0xB7C2, 0xB826, 0x8EB5, 0xB827, 0x8EB6,\t0xB828, 0xB7C3, 0xB829, 0x8EB7, 0xB82A, 0x8EB8, 0xB82B, 0x8EB9,\n\t0xB82C, 0xB7C4, 0xB82D, 0x8EBA, 0xB82E, 0x8EBB, 0xB82F, 0x8EBC,\t0xB830, 0x8EBD, 0xB831, 0x8EBE, 0xB832, 0x8EBF, 0xB833, 0x8EC0,\n\t0xB834, 0xB7C5, 0xB835, 0xB7C6, 0xB836, 0x8EC1, 0xB837, 0xB7C7,\t0xB838, 0xB7C8, 0xB839, 0xB7C9, 0xB83A, 0x8EC2, 0xB83B, 0x8EC3,\n\t0xB83C, 0x8EC4, 0xB83D, 0x8EC5, 0xB83E, 0x8EC6, 0xB83F, 0x8EC7,\t0xB840, 0xB7CA, 0xB841, 0x8EC8, 0xB842, 0x8EC9, 0xB843, 0x8ECA,\n\t0xB844, 0xB7CB, 0xB845, 0x8ECB, 0xB846, 0x8ECC, 0xB847, 0x8ECD,\t0xB848, 0x8ECE, 0xB849, 0x8ECF, 0xB84A, 0x8ED0, 0xB84B, 0x8ED1,\n\t0xB84C, 0x8ED2, 0xB84D, 0x8ED3, 0xB84E, 0x8ED4, 0xB84F, 0x8ED5,\t0xB850, 0x8ED6, 0xB851, 0xB7CC, 0xB852, 0x8ED7, 0xB853, 0xB7CD,\n\t0xB854, 0x8ED8, 0xB855, 0x8ED9, 0xB856, 0x8EDA, 0xB857, 0x8EDB,\t0xB858, 0x8EDC, 0xB859, 0x8EDD, 0xB85A, 0x8EDE, 0xB85B, 0x8EDF,\n\t0xB85C, 0xB7CE, 0xB85D, 0xB7CF, 0xB85E, 0x8EE0, 0xB85F, 0x8EE1,\t0xB860, 0xB7D0, 0xB861, 0x8EE2, 0xB862, 0x8EE3, 0xB863, 0x8EE4,\n\t0xB864, 0xB7D1, 0xB865, 0x8EE5, 0xB866, 0x8EE6, 0xB867, 0x8EE7,\t0xB868, 0x8EE8, 0xB869, 0x8EE9, 0xB86A, 0x8EEA, 0xB86B, 0x8EEB,\n\t0xB86C, 0xB7D2, 0xB86D, 0xB7D3, 0xB86E, 0x8EEC, 0xB86F, 0xB7D4,\t0xB870, 0x8EED, 0xB871, 0xB7D5, 0xB872, 0x8EEE, 0xB873, 0x8EEF,\n\t0xB874, 0x8EF0, 0xB875, 0x8EF1, 0xB876, 0x8EF2, 0xB877, 0x8EF3,\t0xB878, 0xB7D6, 0xB879, 0x8EF4, 0xB87A, 0x8EF5, 0xB87B, 0x8EF6,\n\t0xB87C, 0xB7D7, 0xB87D, 0x8EF7, 0xB87E, 0x8EF8, 0xB87F, 0x8EF9,\t0xB880, 0x8EFA, 0xB881, 0x8EFB, 0xB882, 0x8EFC, 0xB883, 0x8EFD,\n\t0xB884, 0x8EFE, 0xB885, 0x8F41, 0xB886, 0x8F42, 0xB887, 0x8F43,\t0xB888, 0x8F44, 0xB889, 0x8F45, 0xB88A, 0x8F46, 0xB88B, 0x8F47,\n\t0xB88C, 0x8F48, 0xB88D, 0xB7D8, 0xB88E, 0x8F49, 0xB88F, 0x8F4A,\t0xB890, 0x8F4B, 0xB891, 0x8F4C, 0xB892, 0x8F4D, 0xB893, 0x8F4E,\n\t0xB894, 0x8F4F, 0xB895, 0x8F50, 0xB896, 0x8F51, 0xB897, 0x8F52,\t0xB898, 0x8F53, 0xB899, 0x8F54, 0xB89A, 0x8F55, 0xB89B, 0x8F56,\n\t0xB89C, 0x8F57, 0xB89D, 0x8F58, 0xB89E, 0x8F59, 0xB89F, 0x8F5A,\t0xB8A0, 0x8F61, 0xB8A1, 0x8F62, 0xB8A2, 0x8F63, 0xB8A3, 0x8F64,\n\t0xB8A4, 0x8F65, 0xB8A5, 0x8F66, 0xB8A6, 0x8F67, 0xB8A7, 0x8F68,\t0xB8A8, 0xB7D9, 0xB8A9, 0x8F69, 0xB8AA, 0x8F6A, 0xB8AB, 0x8F6B,\n\t0xB8AC, 0x8F6C, 0xB8AD, 0x8F6D, 0xB8AE, 0x8F6E, 0xB8AF, 0x8F6F,\t0xB8B0, 0xB7DA, 0xB8B1, 0x8F70, 0xB8B2, 0x8F71, 0xB8B3, 0x8F72,\n\t0xB8B4, 0xB7DB, 0xB8B5, 0x8F73, 0xB8B6, 0x8F74, 0xB8B7, 0x8F75,\t0xB8B8, 0xB7DC, 0xB8B9, 0x8F76, 0xB8BA, 0x8F77, 0xB8BB, 0x8F78,\n\t0xB8BC, 0x8F79, 0xB8BD, 0x8F7A, 0xB8BE, 0x8F81, 0xB8BF, 0x8F82,\t0xB8C0, 0xB7DD, 0xB8C1, 0xB7DE, 0xB8C2, 0x8F83, 0xB8C3, 0xB7DF,\n\t0xB8C4, 0x8F84, 0xB8C5, 0xB7E0, 0xB8C6, 0x8F85, 0xB8C7, 0x8F86,\t0xB8C8, 0x8F87, 0xB8C9, 0x8F88, 0xB8CA, 0x8F89, 0xB8CB, 0x8F8A,\n\t0xB8CC, 0xB7E1, 0xB8CD, 0x8F8B, 0xB8CE, 0x8F8C, 0xB8CF, 0x8F8D,\t0xB8D0, 0xB7E2, 0xB8D1, 0x8F8E, 0xB8D2, 0x8F8F, 0xB8D3, 0x8F90,\n\t0xB8D4, 0xB7E3, 0xB8D5, 0x8F91, 0xB8D6, 0x8F92, 0xB8D7, 0x8F93,\t0xB8D8, 0x8F94, 0xB8D9, 0x8F95, 0xB8DA, 0x8F96, 0xB8DB, 0x8F97,\n\t0xB8DC, 0x8F98, 0xB8DD, 0xB7E4, 0xB8DE, 0x8F99, 0xB8DF, 0xB7E5,\t0xB8E0, 0x8F9A, 0xB8E1, 0xB7E6, 0xB8E2, 0x8F9B, 0xB8E3, 0x8F9C,\n\t0xB8E4, 0x8F9D, 0xB8E5, 0x8F9E, 0xB8E6, 0x8F9F, 0xB8E7, 0x8FA0,\t0xB8E8, 0xB7E7, 0xB8E9, 0xB7E8, 0xB8EA, 0x8FA1, 0xB8EB, 0x8FA2,\n\t0xB8EC, 0xB7E9, 0xB8ED, 0x8FA3, 0xB8EE, 0x8FA4, 0xB8EF, 0x8FA5,\t0xB8F0, 0xB7EA, 0xB8F1, 0x8FA6, 0xB8F2, 0x8FA7, 0xB8F3, 0x8FA8,\n\t0xB8F4, 0x8FA9, 0xB8F5, 0x8FAA, 0xB8F6, 0x8FAB, 0xB8F7, 0x8FAC,\t0xB8F8, 0xB7EB, 0xB8F9, 0xB7EC, 0xB8FA, 0x8FAD, 0xB8FB, 0xB7ED,\n\t0xB8FC, 0x8FAE, 0xB8FD, 0xB7EE, 0xB8FE, 0x8FAF, 0xB8FF, 0x8FB0,\t0xB900, 0x8FB1, 0xB901, 0x8FB2, 0xB902, 0x8FB3, 0xB903, 0x8FB4,\n\t0xB904, 0xB7EF, 0xB905, 0x8FB5, 0xB906, 0x8FB6, 0xB907, 0x8FB7,\t0xB908, 0x8FB8, 0xB909, 0x8FB9, 0xB90A, 0x8FBA, 0xB90B, 0x8FBB,\n\t0xB90C, 0x8FBC, 0xB90D, 0x8FBD, 0xB90E, 0x8FBE, 0xB90F, 0x8FBF,\t0xB910, 0x8FC0, 0xB911, 0x8FC1, 0xB912, 0x8FC2, 0xB913, 0x8FC3,\n\t0xB914, 0x8FC4, 0xB915, 0x8FC5, 0xB916, 0x8FC6, 0xB917, 0x8FC7,\t0xB918, 0xB7F0, 0xB919, 0x8FC8, 0xB91A, 0x8FC9, 0xB91B, 0x8FCA,\n\t0xB91C, 0x8FCB, 0xB91D, 0x8FCC, 0xB91E, 0x8FCD, 0xB91F, 0x8FCE,\t0xB920, 0xB7F1, 0xB921, 0x8FCF, 0xB922, 0x8FD0, 0xB923, 0x8FD1,\n\t0xB924, 0x8FD2, 0xB925, 0x8FD3, 0xB926, 0x8FD4, 0xB927, 0x8FD5,\t0xB928, 0x8FD6, 0xB929, 0x8FD7, 0xB92A, 0x8FD8, 0xB92B, 0x8FD9,\n\t0xB92C, 0x8FDA, 0xB92D, 0x8FDB, 0xB92E, 0x8FDC, 0xB92F, 0x8FDD,\t0xB930, 0x8FDE, 0xB931, 0x8FDF, 0xB932, 0x8FE0, 0xB933, 0x8FE1,\n\t0xB934, 0x8FE2, 0xB935, 0x8FE3, 0xB936, 0x8FE4, 0xB937, 0x8FE5,\t0xB938, 0x8FE6, 0xB939, 0x8FE7, 0xB93A, 0x8FE8, 0xB93B, 0x8FE9,\n\t0xB93C, 0xB7F2, 0xB93D, 0xB7F3, 0xB93E, 0x8FEA, 0xB93F, 0x8FEB,\t0xB940, 0xB7F4, 0xB941, 0x8FEC, 0xB942, 0x8FED, 0xB943, 0x8FEE,\n\t0xB944, 0xB7F5, 0xB945, 0x8FEF, 0xB946, 0x8FF0, 0xB947, 0x8FF1,\t0xB948, 0x8FF2, 0xB949, 0x8FF3, 0xB94A, 0x8FF4, 0xB94B, 0x8FF5,\n\t0xB94C, 0xB7F6, 0xB94D, 0x8FF6, 0xB94E, 0x8FF7, 0xB94F, 0xB7F7,\t0xB950, 0x8FF8, 0xB951, 0xB7F8, 0xB952, 0x8FF9, 0xB953, 0x8FFA,\n\t0xB954, 0x8FFB, 0xB955, 0x8FFC, 0xB956, 0x8FFD, 0xB957, 0x8FFE,\t0xB958, 0xB7F9, 0xB959, 0xB7FA, 0xB95A, 0x9041, 0xB95B, 0x9042,\n\t0xB95C, 0xB7FB, 0xB95D, 0x9043, 0xB95E, 0x9044, 0xB95F, 0x9045,\t0xB960, 0xB7FC, 0xB961, 0x9046, 0xB962, 0x9047, 0xB963, 0x9048,\n\t0xB964, 0x9049, 0xB965, 0x904A, 0xB966, 0x904B, 0xB967, 0x904C,\t0xB968, 0xB7FD, 0xB969, 0xB7FE, 0xB96A, 0x904D, 0xB96B, 0xB8A1,\n\t0xB96C, 0x904E, 0xB96D, 0xB8A2, 0xB96E, 0x904F, 0xB96F, 0x9050,\t0xB970, 0x9051, 0xB971, 0x9052, 0xB972, 0x9053, 0xB973, 0x9054,\n\t0xB974, 0xB8A3, 0xB975, 0xB8A4, 0xB976, 0x9055, 0xB977, 0x9056,\t0xB978, 0xB8A5, 0xB979, 0x9057, 0xB97A, 0x9058, 0xB97B, 0x9059,\n\t0xB97C, 0xB8A6, 0xB97D, 0x905A, 0xB97E, 0x9061, 0xB97F, 0x9062,\t0xB980, 0x9063, 0xB981, 0x9064, 0xB982, 0x9065, 0xB983, 0x9066,\n\t0xB984, 0xB8A7, 0xB985, 0xB8A8, 0xB986, 0x9067, 0xB987, 0xB8A9,\t0xB988, 0x9068, 0xB989, 0xB8AA, 0xB98A, 0xB8AB, 0xB98B, 0x9069,\n\t0xB98C, 0x906A, 0xB98D, 0xB8AC, 0xB98E, 0xB8AD, 0xB98F, 0x906B,\t0xB990, 0x906C, 0xB991, 0x906D, 0xB992, 0x906E, 0xB993, 0x906F,\n\t0xB994, 0x9070, 0xB995, 0x9071, 0xB996, 0x9072, 0xB997, 0x9073,\t0xB998, 0x9074, 0xB999, 0x9075, 0xB99A, 0x9076, 0xB99B, 0x9077,\n\t0xB99C, 0x9078, 0xB99D, 0x9079, 0xB99E, 0x907A, 0xB99F, 0x9081,\t0xB9A0, 0x9082, 0xB9A1, 0x9083, 0xB9A2, 0x9084, 0xB9A3, 0x9085,\n\t0xB9A4, 0x9086, 0xB9A5, 0x9087, 0xB9A6, 0x9088, 0xB9A7, 0x9089,\t0xB9A8, 0x908A, 0xB9A9, 0x908B, 0xB9AA, 0x908C, 0xB9AB, 0x908D,\n\t0xB9AC, 0xB8AE, 0xB9AD, 0xB8AF, 0xB9AE, 0x908E, 0xB9AF, 0x908F,\t0xB9B0, 0xB8B0, 0xB9B1, 0x9090, 0xB9B2, 0x9091, 0xB9B3, 0x9092,\n\t0xB9B4, 0xB8B1, 0xB9B5, 0x9093, 0xB9B6, 0x9094, 0xB9B7, 0x9095,\t0xB9B8, 0x9096, 0xB9B9, 0x9097, 0xB9BA, 0x9098, 0xB9BB, 0x9099,\n\t0xB9BC, 0xB8B2, 0xB9BD, 0xB8B3, 0xB9BE, 0x909A, 0xB9BF, 0xB8B4,\t0xB9C0, 0x909B, 0xB9C1, 0xB8B5, 0xB9C2, 0x909C, 0xB9C3, 0x909D,\n\t0xB9C4, 0x909E, 0xB9C5, 0x909F, 0xB9C6, 0x90A0, 0xB9C7, 0x90A1,\t0xB9C8, 0xB8B6, 0xB9C9, 0xB8B7, 0xB9CA, 0x90A2, 0xB9CB, 0x90A3,\n\t0xB9CC, 0xB8B8, 0xB9CD, 0x90A4, 0xB9CE, 0xB8B9, 0xB9CF, 0xB8BA,\t0xB9D0, 0xB8BB, 0xB9D1, 0xB8BC, 0xB9D2, 0xB8BD, 0xB9D3, 0x90A5,\n\t0xB9D4, 0x90A6, 0xB9D5, 0x90A7, 0xB9D6, 0x90A8, 0xB9D7, 0x90A9,\t0xB9D8, 0xB8BE, 0xB9D9, 0xB8BF, 0xB9DA, 0x90AA, 0xB9DB, 0xB8C0,\n\t0xB9DC, 0x90AB, 0xB9DD, 0xB8C1, 0xB9DE, 0xB8C2, 0xB9DF, 0x90AC,\t0xB9E0, 0x90AD, 0xB9E1, 0xB8C3, 0xB9E2, 0x90AE, 0xB9E3, 0xB8C4,\n\t0xB9E4, 0xB8C5, 0xB9E5, 0xB8C6, 0xB9E6, 0x90AF, 0xB9E7, 0x90B0,\t0xB9E8, 0xB8C7, 0xB9E9, 0x90B1, 0xB9EA, 0x90B2, 0xB9EB, 0x90B3,\n\t0xB9EC, 0xB8C8, 0xB9ED, 0x90B4, 0xB9EE, 0x90B5, 0xB9EF, 0x90B6,\t0xB9F0, 0x90B7, 0xB9F1, 0x90B8, 0xB9F2, 0x90B9, 0xB9F3, 0x90BA,\n\t0xB9F4, 0xB8C9, 0xB9F5, 0xB8CA, 0xB9F6, 0x90BB, 0xB9F7, 0xB8CB,\t0xB9F8, 0xB8CC, 0xB9F9, 0xB8CD, 0xB9FA, 0xB8CE, 0xB9FB, 0x90BC,\n\t0xB9FC, 0x90BD, 0xB9FD, 0x90BE, 0xB9FE, 0x90BF, 0xB9FF, 0x90C0,\t0xBA00, 0xB8CF, 0xBA01, 0xB8D0, 0xBA02, 0x90C1, 0xBA03, 0x90C2,\n\t0xBA04, 0x90C3, 0xBA05, 0x90C4, 0xBA06, 0x90C5, 0xBA07, 0x90C6,\t0xBA08, 0xB8D1, 0xBA09, 0x90C7, 0xBA0A, 0x90C8, 0xBA0B, 0x90C9,\n\t0xBA0C, 0x90CA, 0xBA0D, 0x90CB, 0xBA0E, 0x90CC, 0xBA0F, 0x90CD,\t0xBA10, 0x90CE, 0xBA11, 0x90CF, 0xBA12, 0x90D0, 0xBA13, 0x90D1,\n\t0xBA14, 0x90D2, 0xBA15, 0xB8D2, 0xBA16, 0x90D3, 0xBA17, 0x90D4,\t0xBA18, 0x90D5, 0xBA19, 0x90D6, 0xBA1A, 0x90D7, 0xBA1B, 0x90D8,\n\t0xBA1C, 0x90D9, 0xBA1D, 0x90DA, 0xBA1E, 0x90DB, 0xBA1F, 0x90DC,\t0xBA20, 0x90DD, 0xBA21, 0x90DE, 0xBA22, 0x90DF, 0xBA23, 0x90E0,\n\t0xBA24, 0x90E1, 0xBA25, 0x90E2, 0xBA26, 0x90E3, 0xBA27, 0x90E4,\t0xBA28, 0x90E5, 0xBA29, 0x90E6, 0xBA2A, 0x90E7, 0xBA2B, 0x90E8,\n\t0xBA2C, 0x90E9, 0xBA2D, 0x90EA, 0xBA2E, 0x90EB, 0xBA2F, 0x90EC,\t0xBA30, 0x90ED, 0xBA31, 0x90EE, 0xBA32, 0x90EF, 0xBA33, 0x90F0,\n\t0xBA34, 0x90F1, 0xBA35, 0x90F2, 0xBA36, 0x90F3, 0xBA37, 0x90F4,\t0xBA38, 0xB8D3, 0xBA39, 0xB8D4, 0xBA3A, 0x90F5, 0xBA3B, 0x90F6,\n\t0xBA3C, 0xB8D5, 0xBA3D, 0x90F7, 0xBA3E, 0x90F8, 0xBA3F, 0x90F9,\t0xBA40, 0xB8D6, 0xBA41, 0x90FA, 0xBA42, 0xB8D7, 0xBA43, 0x90FB,\n\t0xBA44, 0x90FC, 0xBA45, 0x90FD, 0xBA46, 0x90FE, 0xBA47, 0x9141,\t0xBA48, 0xB8D8, 0xBA49, 0xB8D9, 0xBA4A, 0x9142, 0xBA4B, 0xB8DA,\n\t0xBA4C, 0x9143, 0xBA4D, 0xB8DB, 0xBA4E, 0xB8DC, 0xBA4F, 0x9144,\t0xBA50, 0x9145, 0xBA51, 0x9146, 0xBA52, 0x9147, 0xBA53, 0xB8DD,\n\t0xBA54, 0xB8DE, 0xBA55, 0xB8DF, 0xBA56, 0x9148, 0xBA57, 0x9149,\t0xBA58, 0xB8E0, 0xBA59, 0x914A, 0xBA5A, 0x914B, 0xBA5B, 0x914C,\n\t0xBA5C, 0xB8E1, 0xBA5D, 0x914D, 0xBA5E, 0x914E, 0xBA5F, 0x914F,\t0xBA60, 0x9150, 0xBA61, 0x9151, 0xBA62, 0x9152, 0xBA63, 0x9153,\n\t0xBA64, 0xB8E2, 0xBA65, 0xB8E3, 0xBA66, 0x9154, 0xBA67, 0xB8E4,\t0xBA68, 0xB8E5, 0xBA69, 0xB8E6, 0xBA6A, 0x9155, 0xBA6B, 0x9156,\n\t0xBA6C, 0x9157, 0xBA6D, 0x9158, 0xBA6E, 0x9159, 0xBA6F, 0x915A,\t0xBA70, 0xB8E7, 0xBA71, 0xB8E8, 0xBA72, 0x9161, 0xBA73, 0x9162,\n\t0xBA74, 0xB8E9, 0xBA75, 0x9163, 0xBA76, 0x9164, 0xBA77, 0x9165,\t0xBA78, 0xB8EA, 0xBA79, 0x9166, 0xBA7A, 0x9167, 0xBA7B, 0x9168,\n\t0xBA7C, 0x9169, 0xBA7D, 0x916A, 0xBA7E, 0x916B, 0xBA7F, 0x916C,\t0xBA80, 0x916D, 0xBA81, 0x916E, 0xBA82, 0x916F, 0xBA83, 0xB8EB,\n\t0xBA84, 0xB8EC, 0xBA85, 0xB8ED, 0xBA86, 0x9170, 0xBA87, 0xB8EE,\t0xBA88, 0x9171, 0xBA89, 0x9172, 0xBA8A, 0x9173, 0xBA8B, 0x9174,\n\t0xBA8C, 0xB8EF, 0xBA8D, 0x9175, 0xBA8E, 0x9176, 0xBA8F, 0x9177,\t0xBA90, 0x9178, 0xBA91, 0x9179, 0xBA92, 0x917A, 0xBA93, 0x9181,\n\t0xBA94, 0x9182, 0xBA95, 0x9183, 0xBA96, 0x9184, 0xBA97, 0x9185,\t0xBA98, 0x9186, 0xBA99, 0x9187, 0xBA9A, 0x9188, 0xBA9B, 0x9189,\n\t0xBA9C, 0x918A, 0xBA9D, 0x918B, 0xBA9E, 0x918C, 0xBA9F, 0x918D,\t0xBAA0, 0x918E, 0xBAA1, 0x918F, 0xBAA2, 0x9190, 0xBAA3, 0x9191,\n\t0xBAA4, 0x9192, 0xBAA5, 0x9193, 0xBAA6, 0x9194, 0xBAA7, 0x9195,\t0xBAA8, 0xB8F0, 0xBAA9, 0xB8F1, 0xBAAA, 0x9196, 0xBAAB, 0xB8F2,\n\t0xBAAC, 0xB8F3, 0xBAAD, 0x9197, 0xBAAE, 0x9198, 0xBAAF, 0x9199,\t0xBAB0, 0xB8F4, 0xBAB1, 0x919A, 0xBAB2, 0xB8F5, 0xBAB3, 0x919B,\n\t0xBAB4, 0x919C, 0xBAB5, 0x919D, 0xBAB6, 0x919E, 0xBAB7, 0x919F,\t0xBAB8, 0xB8F6, 0xBAB9, 0xB8F7, 0xBABA, 0x91A0, 0xBABB, 0xB8F8,\n\t0xBABC, 0x91A1, 0xBABD, 0xB8F9, 0xBABE, 0x91A2, 0xBABF, 0x91A3,\t0xBAC0, 0x91A4, 0xBAC1, 0x91A5, 0xBAC2, 0x91A6, 0xBAC3, 0x91A7,\n\t0xBAC4, 0xB8FA, 0xBAC5, 0x91A8, 0xBAC6, 0x91A9, 0xBAC7, 0x91AA,\t0xBAC8, 0xB8FB, 0xBAC9, 0x91AB, 0xBACA, 0x91AC, 0xBACB, 0x91AD,\n\t0xBACC, 0x91AE, 0xBACD, 0x91AF, 0xBACE, 0x91B0, 0xBACF, 0x91B1,\t0xBAD0, 0x91B2, 0xBAD1, 0x91B3, 0xBAD2, 0x91B4, 0xBAD3, 0x91B5,\n\t0xBAD4, 0x91B6, 0xBAD5, 0x91B7, 0xBAD6, 0x91B8, 0xBAD7, 0x91B9,\t0xBAD8, 0xB8FC, 0xBAD9, 0xB8FD, 0xBADA, 0x91BA, 0xBADB, 0x91BB,\n\t0xBADC, 0x91BC, 0xBADD, 0x91BD, 0xBADE, 0x91BE, 0xBADF, 0x91BF,\t0xBAE0, 0x91C0, 0xBAE1, 0x91C1, 0xBAE2, 0x91C2, 0xBAE3, 0x91C3,\n\t0xBAE4, 0x91C4, 0xBAE5, 0x91C5, 0xBAE6, 0x91C6, 0xBAE7, 0x91C7,\t0xBAE8, 0x91C8, 0xBAE9, 0x91C9, 0xBAEA, 0x91CA, 0xBAEB, 0x91CB,\n\t0xBAEC, 0x91CC, 0xBAED, 0x91CD, 0xBAEE, 0x91CE, 0xBAEF, 0x91CF,\t0xBAF0, 0x91D0, 0xBAF1, 0x91D1, 0xBAF2, 0x91D2, 0xBAF3, 0x91D3,\n\t0xBAF4, 0x91D4, 0xBAF5, 0x91D5, 0xBAF6, 0x91D6, 0xBAF7, 0x91D7,\t0xBAF8, 0x91D8, 0xBAF9, 0x91D9, 0xBAFA, 0x91DA, 0xBAFB, 0x91DB,\n\t0xBAFC, 0xB8FE, 0xBAFD, 0x91DC, 0xBAFE, 0x91DD, 0xBAFF, 0x91DE,\t0xBB00, 0xB9A1, 0xBB01, 0x91DF, 0xBB02, 0x91E0, 0xBB03, 0x91E1,\n\t0xBB04, 0xB9A2, 0xBB05, 0x91E2, 0xBB06, 0x91E3, 0xBB07, 0x91E4,\t0xBB08, 0x91E5, 0xBB09, 0x91E6, 0xBB0A, 0x91E7, 0xBB0B, 0x91E8,\n\t0xBB0C, 0x91E9, 0xBB0D, 0xB9A3, 0xBB0E, 0x91EA, 0xBB0F, 0xB9A4,\t0xBB10, 0x91EB, 0xBB11, 0xB9A5, 0xBB12, 0x91EC, 0xBB13, 0x91ED,\n\t0xBB14, 0x91EE, 0xBB15, 0x91EF, 0xBB16, 0x91F0, 0xBB17, 0x91F1,\t0xBB18, 0xB9A6, 0xBB19, 0x91F2, 0xBB1A, 0x91F3, 0xBB1B, 0x91F4,\n\t0xBB1C, 0xB9A7, 0xBB1D, 0x91F5, 0xBB1E, 0x91F6, 0xBB1F, 0x91F7,\t0xBB20, 0xB9A8, 0xBB21, 0x91F8, 0xBB22, 0x91F9, 0xBB23, 0x91FA,\n\t0xBB24, 0x91FB, 0xBB25, 0x91FC, 0xBB26, 0x91FD, 0xBB27, 0x91FE,\t0xBB28, 0x9241, 0xBB29, 0xB9A9, 0xBB2A, 0x9242, 0xBB2B, 0xB9AA,\n\t0xBB2C, 0x9243, 0xBB2D, 0x9244, 0xBB2E, 0x9245, 0xBB2F, 0x9246,\t0xBB30, 0x9247, 0xBB31, 0x9248, 0xBB32, 0x9249, 0xBB33, 0x924A,\n\t0xBB34, 0xB9AB, 0xBB35, 0xB9AC, 0xBB36, 0xB9AD, 0xBB37, 0x924B,\t0xBB38, 0xB9AE, 0xBB39, 0x924C, 0xBB3A, 0x924D, 0xBB3B, 0xB9AF,\n\t0xBB3C, 0xB9B0, 0xBB3D, 0xB9B1, 0xBB3E, 0xB9B2, 0xBB3F, 0x924E,\t0xBB40, 0x924F, 0xBB41, 0x9250, 0xBB42, 0x9251, 0xBB43, 0x9252,\n\t0xBB44, 0xB9B3, 0xBB45, 0xB9B4, 0xBB46, 0x9253, 0xBB47, 0xB9B5,\t0xBB48, 0x9254, 0xBB49, 0xB9B6, 0xBB4A, 0x9255, 0xBB4B, 0x9256,\n\t0xBB4C, 0x9257, 0xBB4D, 0xB9B7, 0xBB4E, 0x9258, 0xBB4F, 0xB9B8,\t0xBB50, 0xB9B9, 0xBB51, 0x9259, 0xBB52, 0x925A, 0xBB53, 0x9261,\n\t0xBB54, 0xB9BA, 0xBB55, 0x9262, 0xBB56, 0x9263, 0xBB57, 0x9264,\t0xBB58, 0xB9BB, 0xBB59, 0x9265, 0xBB5A, 0x9266, 0xBB5B, 0x9267,\n\t0xBB5C, 0x9268, 0xBB5D, 0x9269, 0xBB5E, 0x926A, 0xBB5F, 0x926B,\t0xBB60, 0x926C, 0xBB61, 0xB9BC, 0xBB62, 0x926D, 0xBB63, 0xB9BD,\n\t0xBB64, 0x926E, 0xBB65, 0x926F, 0xBB66, 0x9270, 0xBB67, 0x9271,\t0xBB68, 0x9272, 0xBB69, 0x9273, 0xBB6A, 0x9274, 0xBB6B, 0x9275,\n\t0xBB6C, 0xB9BE, 0xBB6D, 0x9276, 0xBB6E, 0x9277, 0xBB6F, 0x9278,\t0xBB70, 0x9279, 0xBB71, 0x927A, 0xBB72, 0x9281, 0xBB73, 0x9282,\n\t0xBB74, 0x9283, 0xBB75, 0x9284, 0xBB76, 0x9285, 0xBB77, 0x9286,\t0xBB78, 0x9287, 0xBB79, 0x9288, 0xBB7A, 0x9289, 0xBB7B, 0x928A,\n\t0xBB7C, 0x928B, 0xBB7D, 0x928C, 0xBB7E, 0x928D, 0xBB7F, 0x928E,\t0xBB80, 0x928F, 0xBB81, 0x9290, 0xBB82, 0x9291, 0xBB83, 0x9292,\n\t0xBB84, 0x9293, 0xBB85, 0x9294, 0xBB86, 0x9295, 0xBB87, 0x9296,\t0xBB88, 0xB9BF, 0xBB89, 0x9297, 0xBB8A, 0x9298, 0xBB8B, 0x9299,\n\t0xBB8C, 0xB9C0, 0xBB8D, 0x929A, 0xBB8E, 0x929B, 0xBB8F, 0x929C,\t0xBB90, 0xB9C1, 0xBB91, 0x929D, 0xBB92, 0x929E, 0xBB93, 0x929F,\n\t0xBB94, 0x92A0, 0xBB95, 0x92A1, 0xBB96, 0x92A2, 0xBB97, 0x92A3,\t0xBB98, 0x92A4, 0xBB99, 0x92A5, 0xBB9A, 0x92A6, 0xBB9B, 0x92A7,\n\t0xBB9C, 0x92A8, 0xBB9D, 0x92A9, 0xBB9E, 0x92AA, 0xBB9F, 0x92AB,\t0xBBA0, 0x92AC, 0xBBA1, 0x92AD, 0xBBA2, 0x92AE, 0xBBA3, 0x92AF,\n\t0xBBA4, 0xB9C2, 0xBBA5, 0x92B0, 0xBBA6, 0x92B1, 0xBBA7, 0x92B2,\t0xBBA8, 0xB9C3, 0xBBA9, 0x92B3, 0xBBAA, 0x92B4, 0xBBAB, 0x92B5,\n\t0xBBAC, 0xB9C4, 0xBBAD, 0x92B6, 0xBBAE, 0x92B7, 0xBBAF, 0x92B8,\t0xBBB0, 0x92B9, 0xBBB1, 0x92BA, 0xBBB2, 0x92BB, 0xBBB3, 0x92BC,\n\t0xBBB4, 0xB9C5, 0xBBB5, 0x92BD, 0xBBB6, 0x92BE, 0xBBB7, 0xB9C6,\t0xBBB8, 0x92BF, 0xBBB9, 0x92C0, 0xBBBA, 0x92C1, 0xBBBB, 0x92C2,\n\t0xBBBC, 0x92C3, 0xBBBD, 0x92C4, 0xBBBE, 0x92C5, 0xBBBF, 0x92C6,\t0xBBC0, 0xB9C7, 0xBBC1, 0x92C7, 0xBBC2, 0x92C8, 0xBBC3, 0x92C9,\n\t0xBBC4, 0xB9C8, 0xBBC5, 0x92CA, 0xBBC6, 0x92CB, 0xBBC7, 0x92CC,\t0xBBC8, 0xB9C9, 0xBBC9, 0x92CD, 0xBBCA, 0x92CE, 0xBBCB, 0x92CF,\n\t0xBBCC, 0x92D0, 0xBBCD, 0x92D1, 0xBBCE, 0x92D2, 0xBBCF, 0x92D3,\t0xBBD0, 0xB9CA, 0xBBD1, 0x92D4, 0xBBD2, 0x92D5, 0xBBD3, 0xB9CB,\n\t0xBBD4, 0x92D6, 0xBBD5, 0x92D7, 0xBBD6, 0x92D8, 0xBBD7, 0x92D9,\t0xBBD8, 0x92DA, 0xBBD9, 0x92DB, 0xBBDA, 0x92DC, 0xBBDB, 0x92DD,\n\t0xBBDC, 0x92DE, 0xBBDD, 0x92DF, 0xBBDE, 0x92E0, 0xBBDF, 0x92E1,\t0xBBE0, 0x92E2, 0xBBE1, 0x92E3, 0xBBE2, 0x92E4, 0xBBE3, 0x92E5,\n\t0xBBE4, 0x92E6, 0xBBE5, 0x92E7, 0xBBE6, 0x92E8, 0xBBE7, 0x92E9,\t0xBBE8, 0x92EA, 0xBBE9, 0x92EB, 0xBBEA, 0x92EC, 0xBBEB, 0x92ED,\n\t0xBBEC, 0x92EE, 0xBBED, 0x92EF, 0xBBEE, 0x92F0, 0xBBEF, 0x92F1,\t0xBBF0, 0x92F2, 0xBBF1, 0x92F3, 0xBBF2, 0x92F4, 0xBBF3, 0x92F5,\n\t0xBBF4, 0x92F6, 0xBBF5, 0x92F7, 0xBBF6, 0x92F8, 0xBBF7, 0x92F9,\t0xBBF8, 0xB9CC, 0xBBF9, 0xB9CD, 0xBBFA, 0x92FA, 0xBBFB, 0x92FB,\n\t0xBBFC, 0xB9CE, 0xBBFD, 0x92FC, 0xBBFE, 0x92FD, 0xBBFF, 0xB9CF,\t0xBC00, 0xB9D0, 0xBC01, 0x92FE, 0xBC02, 0xB9D1, 0xBC03, 0x9341,\n\t0xBC04, 0x9342, 0xBC05, 0x9343, 0xBC06, 0x9344, 0xBC07, 0x9345,\t0xBC08, 0xB9D2, 0xBC09, 0xB9D3, 0xBC0A, 0x9346, 0xBC0B, 0xB9D4,\n\t0xBC0C, 0xB9D5, 0xBC0D, 0xB9D6, 0xBC0E, 0x9347, 0xBC0F, 0xB9D7,\t0xBC10, 0x9348, 0xBC11, 0xB9D8, 0xBC12, 0x9349, 0xBC13, 0x934A,\n\t0xBC14, 0xB9D9, 0xBC15, 0xB9DA, 0xBC16, 0xB9DB, 0xBC17, 0xB9DC,\t0xBC18, 0xB9DD, 0xBC19, 0x934B, 0xBC1A, 0x934C, 0xBC1B, 0xB9DE,\n\t0xBC1C, 0xB9DF, 0xBC1D, 0xB9E0, 0xBC1E, 0xB9E1, 0xBC1F, 0xB9E2,\t0xBC20, 0x934D, 0xBC21, 0x934E, 0xBC22, 0x934F, 0xBC23, 0x9350,\n\t0xBC24, 0xB9E3, 0xBC25, 0xB9E4, 0xBC26, 0x9351, 0xBC27, 0xB9E5,\t0xBC28, 0x9352, 0xBC29, 0xB9E6, 0xBC2A, 0x9353, 0xBC2B, 0x9354,\n\t0xBC2C, 0x9355, 0xBC2D, 0xB9E7, 0xBC2E, 0x9356, 0xBC2F, 0x9357,\t0xBC30, 0xB9E8, 0xBC31, 0xB9E9, 0xBC32, 0x9358, 0xBC33, 0x9359,\n\t0xBC34, 0xB9EA, 0xBC35, 0x935A, 0xBC36, 0x9361, 0xBC37, 0x9362,\t0xBC38, 0xB9EB, 0xBC39, 0x9363, 0xBC3A, 0x9364, 0xBC3B, 0x9365,\n\t0xBC3C, 0x9366, 0xBC3D, 0x9367, 0xBC3E, 0x9368, 0xBC3F, 0x9369,\t0xBC40, 0xB9EC, 0xBC41, 0xB9ED, 0xBC42, 0x936A, 0xBC43, 0xB9EE,\n\t0xBC44, 0xB9EF, 0xBC45, 0xB9F0, 0xBC46, 0x936B, 0xBC47, 0x936C,\t0xBC48, 0x936D, 0xBC49, 0xB9F1, 0xBC4A, 0x936E, 0xBC4B, 0x936F,\n\t0xBC4C, 0xB9F2, 0xBC4D, 0xB9F3, 0xBC4E, 0x9370, 0xBC4F, 0x9371,\t0xBC50, 0xB9F4, 0xBC51, 0x9372, 0xBC52, 0x9373, 0xBC53, 0x9374,\n\t0xBC54, 0x9375, 0xBC55, 0x9376, 0xBC56, 0x9377, 0xBC57, 0x9378,\t0xBC58, 0x9379, 0xBC59, 0x937A, 0xBC5A, 0x9381, 0xBC5B, 0x9382,\n\t0xBC5C, 0x9383, 0xBC5D, 0xB9F5, 0xBC5E, 0x9384, 0xBC5F, 0x9385,\t0xBC60, 0x9386, 0xBC61, 0x9387, 0xBC62, 0x9388, 0xBC63, 0x9389,\n\t0xBC64, 0x938A, 0xBC65, 0x938B, 0xBC66, 0x938C, 0xBC67, 0x938D,\t0xBC68, 0x938E, 0xBC69, 0x938F, 0xBC6A, 0x9390, 0xBC6B, 0x9391,\n\t0xBC6C, 0x9392, 0xBC6D, 0x9393, 0xBC6E, 0x9394, 0xBC6F, 0x9395,\t0xBC70, 0x9396, 0xBC71, 0x9397, 0xBC72, 0x9398, 0xBC73, 0x9399,\n\t0xBC74, 0x939A, 0xBC75, 0x939B, 0xBC76, 0x939C, 0xBC77, 0x939D,\t0xBC78, 0x939E, 0xBC79, 0x939F, 0xBC7A, 0x93A0, 0xBC7B, 0x93A1,\n\t0xBC7C, 0x93A2, 0xBC7D, 0x93A3, 0xBC7E, 0x93A4, 0xBC7F, 0x93A5,\t0xBC80, 0x93A6, 0xBC81, 0x93A7, 0xBC82, 0x93A8, 0xBC83, 0x93A9,\n\t0xBC84, 0xB9F6, 0xBC85, 0xB9F7, 0xBC86, 0x93AA, 0xBC87, 0x93AB,\t0xBC88, 0xB9F8, 0xBC89, 0x93AC, 0xBC8A, 0x93AD, 0xBC8B, 0xB9F9,\n\t0xBC8C, 0xB9FA, 0xBC8D, 0x93AE, 0xBC8E, 0xB9FB, 0xBC8F, 0x93AF,\t0xBC90, 0x93B0, 0xBC91, 0x93B1, 0xBC92, 0x93B2, 0xBC93, 0x93B3,\n\t0xBC94, 0xB9FC, 0xBC95, 0xB9FD, 0xBC96, 0x93B4, 0xBC97, 0xB9FE,\t0xBC98, 0x93B5, 0xBC99, 0xBAA1, 0xBC9A, 0xBAA2, 0xBC9B, 0x93B6,\n\t0xBC9C, 0x93B7, 0xBC9D, 0x93B8, 0xBC9E, 0x93B9, 0xBC9F, 0x93BA,\t0xBCA0, 0xBAA3, 0xBCA1, 0xBAA4, 0xBCA2, 0x93BB, 0xBCA3, 0x93BC,\n\t0xBCA4, 0xBAA5, 0xBCA5, 0x93BD, 0xBCA6, 0x93BE, 0xBCA7, 0xBAA6,\t0xBCA8, 0xBAA7, 0xBCA9, 0x93BF, 0xBCAA, 0x93C0, 0xBCAB, 0x93C1,\n\t0xBCAC, 0x93C2, 0xBCAD, 0x93C3, 0xBCAE, 0x93C4, 0xBCAF, 0x93C5,\t0xBCB0, 0xBAA8, 0xBCB1, 0xBAA9, 0xBCB2, 0x93C6, 0xBCB3, 0xBAAA,\n\t0xBCB4, 0xBAAB, 0xBCB5, 0xBAAC, 0xBCB6, 0x93C7, 0xBCB7, 0x93C8,\t0xBCB8, 0x93C9, 0xBCB9, 0x93CA, 0xBCBA, 0x93CB, 0xBCBB, 0x93CC,\n\t0xBCBC, 0xBAAD, 0xBCBD, 0xBAAE, 0xBCBE, 0x93CD, 0xBCBF, 0x93CE,\t0xBCC0, 0xBAAF, 0xBCC1, 0x93CF, 0xBCC2, 0x93D0, 0xBCC3, 0x93D1,\n\t0xBCC4, 0xBAB0, 0xBCC5, 0x93D2, 0xBCC6, 0x93D3, 0xBCC7, 0x93D4,\t0xBCC8, 0x93D5, 0xBCC9, 0x93D6, 0xBCCA, 0x93D7, 0xBCCB, 0x93D8,\n\t0xBCCC, 0x93D9, 0xBCCD, 0xBAB1, 0xBCCE, 0x93DA, 0xBCCF, 0xBAB2,\t0xBCD0, 0xBAB3, 0xBCD1, 0xBAB4, 0xBCD2, 0x93DB, 0xBCD3, 0x93DC,\n\t0xBCD4, 0x93DD, 0xBCD5, 0xBAB5, 0xBCD6, 0x93DE, 0xBCD7, 0x93DF,\t0xBCD8, 0xBAB6, 0xBCD9, 0x93E0, 0xBCDA, 0x93E1, 0xBCDB, 0x93E2,\n\t0xBCDC, 0xBAB7, 0xBCDD, 0x93E3, 0xBCDE, 0x93E4, 0xBCDF, 0x93E5,\t0xBCE0, 0x93E6, 0xBCE1, 0x93E7, 0xBCE2, 0x93E8, 0xBCE3, 0x93E9,\n\t0xBCE4, 0x93EA, 0xBCE5, 0x93EB, 0xBCE6, 0x93EC, 0xBCE7, 0x93ED,\t0xBCE8, 0x93EE, 0xBCE9, 0x93EF, 0xBCEA, 0x93F0, 0xBCEB, 0x93F1,\n\t0xBCEC, 0x93F2, 0xBCED, 0x93F3, 0xBCEE, 0x93F4, 0xBCEF, 0x93F5,\t0xBCF0, 0x93F6, 0xBCF1, 0x93F7, 0xBCF2, 0x93F8, 0xBCF3, 0x93F9,\n\t0xBCF4, 0xBAB8, 0xBCF5, 0xBAB9, 0xBCF6, 0xBABA, 0xBCF7, 0x93FA,\t0xBCF8, 0xBABB, 0xBCF9, 0x93FB, 0xBCFA, 0x93FC, 0xBCFB, 0x93FD,\n\t0xBCFC, 0xBABC, 0xBCFD, 0x93FE, 0xBCFE, 0x9441, 0xBCFF, 0x9442,\t0xBD00, 0x9443, 0xBD01, 0x9444, 0xBD02, 0x9445, 0xBD03, 0x9446,\n\t0xBD04, 0xBABD, 0xBD05, 0xBABE, 0xBD06, 0x9447, 0xBD07, 0xBABF,\t0xBD08, 0x9448, 0xBD09, 0xBAC0, 0xBD0A, 0x9449, 0xBD0B, 0x944A,\n\t0xBD0C, 0x944B, 0xBD0D, 0x944C, 0xBD0E, 0x944D, 0xBD0F, 0x944E,\t0xBD10, 0xBAC1, 0xBD11, 0x944F, 0xBD12, 0x9450, 0xBD13, 0x9451,\n\t0xBD14, 0xBAC2, 0xBD15, 0x9452, 0xBD16, 0x9453, 0xBD17, 0x9454,\t0xBD18, 0x9455, 0xBD19, 0x9456, 0xBD1A, 0x9457, 0xBD1B, 0x9458,\n\t0xBD1C, 0x9459, 0xBD1D, 0x945A, 0xBD1E, 0x9461, 0xBD1F, 0x9462,\t0xBD20, 0x9463, 0xBD21, 0x9464, 0xBD22, 0x9465, 0xBD23, 0x9466,\n\t0xBD24, 0xBAC3, 0xBD25, 0x9467, 0xBD26, 0x9468, 0xBD27, 0x9469,\t0xBD28, 0x946A, 0xBD29, 0x946B, 0xBD2A, 0x946C, 0xBD2B, 0x946D,\n\t0xBD2C, 0xBAC4, 0xBD2D, 0x946E, 0xBD2E, 0x946F, 0xBD2F, 0x9470,\t0xBD30, 0x9471, 0xBD31, 0x9472, 0xBD32, 0x9473, 0xBD33, 0x9474,\n\t0xBD34, 0x9475, 0xBD35, 0x9476, 0xBD36, 0x9477, 0xBD37, 0x9478,\t0xBD38, 0x9479, 0xBD39, 0x947A, 0xBD3A, 0x9481, 0xBD3B, 0x9482,\n\t0xBD3C, 0x9483, 0xBD3D, 0x9484, 0xBD3E, 0x9485, 0xBD3F, 0x9486,\t0xBD40, 0xBAC5, 0xBD41, 0x9487, 0xBD42, 0x9488, 0xBD43, 0x9489,\n\t0xBD44, 0x948A, 0xBD45, 0x948B, 0xBD46, 0x948C, 0xBD47, 0x948D,\t0xBD48, 0xBAC6, 0xBD49, 0xBAC7, 0xBD4A, 0x948E, 0xBD4B, 0x948F,\n\t0xBD4C, 0xBAC8, 0xBD4D, 0x9490, 0xBD4E, 0x9491, 0xBD4F, 0x9492,\t0xBD50, 0xBAC9, 0xBD51, 0x9493, 0xBD52, 0x9494, 0xBD53, 0x9495,\n\t0xBD54, 0x9496, 0xBD55, 0x9497, 0xBD56, 0x9498, 0xBD57, 0x9499,\t0xBD58, 0xBACA, 0xBD59, 0xBACB, 0xBD5A, 0x949A, 0xBD5B, 0x949B,\n\t0xBD5C, 0x949C, 0xBD5D, 0x949D, 0xBD5E, 0x949E, 0xBD5F, 0x949F,\t0xBD60, 0x94A0, 0xBD61, 0x94A1, 0xBD62, 0x94A2, 0xBD63, 0x94A3,\n\t0xBD64, 0xBACC, 0xBD65, 0x94A4, 0xBD66, 0x94A5, 0xBD67, 0x94A6,\t0xBD68, 0xBACD, 0xBD69, 0x94A7, 0xBD6A, 0x94A8, 0xBD6B, 0x94A9,\n\t0xBD6C, 0x94AA, 0xBD6D, 0x94AB, 0xBD6E, 0x94AC, 0xBD6F, 0x94AD,\t0xBD70, 0x94AE, 0xBD71, 0x94AF, 0xBD72, 0x94B0, 0xBD73, 0x94B1,\n\t0xBD74, 0x94B2, 0xBD75, 0x94B3, 0xBD76, 0x94B4, 0xBD77, 0x94B5,\t0xBD78, 0x94B6, 0xBD79, 0x94B7, 0xBD7A, 0x94B8, 0xBD7B, 0x94B9,\n\t0xBD7C, 0x94BA, 0xBD7D, 0x94BB, 0xBD7E, 0x94BC, 0xBD7F, 0x94BD,\t0xBD80, 0xBACE, 0xBD81, 0xBACF, 0xBD82, 0x94BE, 0xBD83, 0x94BF,\n\t0xBD84, 0xBAD0, 0xBD85, 0x94C0, 0xBD86, 0x94C1, 0xBD87, 0xBAD1,\t0xBD88, 0xBAD2, 0xBD89, 0xBAD3, 0xBD8A, 0xBAD4, 0xBD8B, 0x94C2,\n\t0xBD8C, 0x94C3, 0xBD8D, 0x94C4, 0xBD8E, 0x94C5, 0xBD8F, 0x94C6,\t0xBD90, 0xBAD5, 0xBD91, 0xBAD6, 0xBD92, 0x94C7, 0xBD93, 0xBAD7,\n\t0xBD94, 0x94C8, 0xBD95, 0xBAD8, 0xBD96, 0x94C9, 0xBD97, 0x94CA,\t0xBD98, 0x94CB, 0xBD99, 0xBAD9, 0xBD9A, 0xBADA, 0xBD9B, 0x94CC,\n\t0xBD9C, 0xBADB, 0xBD9D, 0x94CD, 0xBD9E, 0x94CE, 0xBD9F, 0x94CF,\t0xBDA0, 0x94D0, 0xBDA1, 0x94D1, 0xBDA2, 0x94D2, 0xBDA3, 0x94D3,\n\t0xBDA4, 0xBADC, 0xBDA5, 0x94D4, 0xBDA6, 0x94D5, 0xBDA7, 0x94D6,\t0xBDA8, 0x94D7, 0xBDA9, 0x94D8, 0xBDAA, 0x94D9, 0xBDAB, 0x94DA,\n\t0xBDAC, 0x94DB, 0xBDAD, 0x94DC, 0xBDAE, 0x94DD, 0xBDAF, 0x94DE,\t0xBDB0, 0xBADD, 0xBDB1, 0x94DF, 0xBDB2, 0x94E0, 0xBDB3, 0x94E1,\n\t0xBDB4, 0x94E2, 0xBDB5, 0x94E3, 0xBDB6, 0x94E4, 0xBDB7, 0x94E5,\t0xBDB8, 0xBADE, 0xBDB9, 0x94E6, 0xBDBA, 0x94E7, 0xBDBB, 0x94E8,\n\t0xBDBC, 0x94E9, 0xBDBD, 0x94EA, 0xBDBE, 0x94EB, 0xBDBF, 0x94EC,\t0xBDC0, 0x94ED, 0xBDC1, 0x94EE, 0xBDC2, 0x94EF, 0xBDC3, 0x94F0,\n\t0xBDC4, 0x94F1, 0xBDC5, 0x94F2, 0xBDC6, 0x94F3, 0xBDC7, 0x94F4,\t0xBDC8, 0x94F5, 0xBDC9, 0x94F6, 0xBDCA, 0x94F7, 0xBDCB, 0x94F8,\n\t0xBDCC, 0x94F9, 0xBDCD, 0x94FA, 0xBDCE, 0x94FB, 0xBDCF, 0x94FC,\t0xBDD0, 0x94FD, 0xBDD1, 0x94FE, 0xBDD2, 0x9541, 0xBDD3, 0x9542,\n\t0xBDD4, 0xBADF, 0xBDD5, 0xBAE0, 0xBDD6, 0x9543, 0xBDD7, 0x9544,\t0xBDD8, 0xBAE1, 0xBDD9, 0x9545, 0xBDDA, 0x9546, 0xBDDB, 0x9547,\n\t0xBDDC, 0xBAE2, 0xBDDD, 0x9548, 0xBDDE, 0x9549, 0xBDDF, 0x954A,\t0xBDE0, 0x954B, 0xBDE1, 0x954C, 0xBDE2, 0x954D, 0xBDE3, 0x954E,\n\t0xBDE4, 0x954F, 0xBDE5, 0x9550, 0xBDE6, 0x9551, 0xBDE7, 0x9552,\t0xBDE8, 0x9553, 0xBDE9, 0xBAE3, 0xBDEA, 0x9554, 0xBDEB, 0x9555,\n\t0xBDEC, 0x9556, 0xBDED, 0x9557, 0xBDEE, 0x9558, 0xBDEF, 0x9559,\t0xBDF0, 0xBAE4, 0xBDF1, 0x955A, 0xBDF2, 0x9561, 0xBDF3, 0x9562,\n\t0xBDF4, 0xBAE5, 0xBDF5, 0x9563, 0xBDF6, 0x9564, 0xBDF7, 0x9565,\t0xBDF8, 0xBAE6, 0xBDF9, 0x9566, 0xBDFA, 0x9567, 0xBDFB, 0x9568,\n\t0xBDFC, 0x9569, 0xBDFD, 0x956A, 0xBDFE, 0x956B, 0xBDFF, 0x956C,\t0xBE00, 0xBAE7, 0xBE01, 0x956D, 0xBE02, 0x956E, 0xBE03, 0xBAE8,\n\t0xBE04, 0x956F, 0xBE05, 0xBAE9, 0xBE06, 0x9570, 0xBE07, 0x9571,\t0xBE08, 0x9572, 0xBE09, 0x9573, 0xBE0A, 0x9574, 0xBE0B, 0x9575,\n\t0xBE0C, 0xBAEA, 0xBE0D, 0xBAEB, 0xBE0E, 0x9576, 0xBE0F, 0x9577,\t0xBE10, 0xBAEC, 0xBE11, 0x9578, 0xBE12, 0x9579, 0xBE13, 0x957A,\n\t0xBE14, 0xBAED, 0xBE15, 0x9581, 0xBE16, 0x9582, 0xBE17, 0x9583,\t0xBE18, 0x9584, 0xBE19, 0x9585, 0xBE1A, 0x9586, 0xBE1B, 0x9587,\n\t0xBE1C, 0xBAEE, 0xBE1D, 0xBAEF, 0xBE1E, 0x9588, 0xBE1F, 0xBAF0,\t0xBE20, 0x9589, 0xBE21, 0x958A, 0xBE22, 0x958B, 0xBE23, 0x958C,\n\t0xBE24, 0x958D, 0xBE25, 0x958E, 0xBE26, 0x958F, 0xBE27, 0x9590,\t0xBE28, 0x9591, 0xBE29, 0x9592, 0xBE2A, 0x9593, 0xBE2B, 0x9594,\n\t0xBE2C, 0x9595, 0xBE2D, 0x9596, 0xBE2E, 0x9597, 0xBE2F, 0x9598,\t0xBE30, 0x9599, 0xBE31, 0x959A, 0xBE32, 0x959B, 0xBE33, 0x959C,\n\t0xBE34, 0x959D, 0xBE35, 0x959E, 0xBE36, 0x959F, 0xBE37, 0x95A0,\t0xBE38, 0x95A1, 0xBE39, 0x95A2, 0xBE3A, 0x95A3, 0xBE3B, 0x95A4,\n\t0xBE3C, 0x95A5, 0xBE3D, 0x95A6, 0xBE3E, 0x95A7, 0xBE3F, 0x95A8,\t0xBE40, 0x95A9, 0xBE41, 0x95AA, 0xBE42, 0x95AB, 0xBE43, 0x95AC,\n\t0xBE44, 0xBAF1, 0xBE45, 0xBAF2, 0xBE46, 0x95AD, 0xBE47, 0x95AE,\t0xBE48, 0xBAF3, 0xBE49, 0x95AF, 0xBE4A, 0x95B0, 0xBE4B, 0x95B1,\n\t0xBE4C, 0xBAF4, 0xBE4D, 0x95B2, 0xBE4E, 0xBAF5, 0xBE4F, 0x95B3,\t0xBE50, 0x95B4, 0xBE51, 0x95B5, 0xBE52, 0x95B6, 0xBE53, 0x95B7,\n\t0xBE54, 0xBAF6, 0xBE55, 0xBAF7, 0xBE56, 0x95B8, 0xBE57, 0xBAF8,\t0xBE58, 0x95B9, 0xBE59, 0xBAF9, 0xBE5A, 0xBAFA, 0xBE5B, 0xBAFB,\n\t0xBE5C, 0x95BA, 0xBE5D, 0x95BB, 0xBE5E, 0x95BC, 0xBE5F, 0x95BD,\t0xBE60, 0xBAFC, 0xBE61, 0xBAFD, 0xBE62, 0x95BE, 0xBE63, 0x95BF,\n\t0xBE64, 0xBAFE, 0xBE65, 0x95C0, 0xBE66, 0x95C1, 0xBE67, 0x95C2,\t0xBE68, 0xBBA1, 0xBE69, 0x95C3, 0xBE6A, 0xBBA2, 0xBE6B, 0x95C4,\n\t0xBE6C, 0x95C5, 0xBE6D, 0x95C6, 0xBE6E, 0x95C7, 0xBE6F, 0x95C8,\t0xBE70, 0xBBA3, 0xBE71, 0xBBA4, 0xBE72, 0x95C9, 0xBE73, 0xBBA5,\n\t0xBE74, 0xBBA6, 0xBE75, 0xBBA7, 0xBE76, 0x95CA, 0xBE77, 0x95CB,\t0xBE78, 0x95CC, 0xBE79, 0x95CD, 0xBE7A, 0x95CE, 0xBE7B, 0xBBA8,\n\t0xBE7C, 0xBBA9, 0xBE7D, 0xBBAA, 0xBE7E, 0x95CF, 0xBE7F, 0x95D0,\t0xBE80, 0xBBAB, 0xBE81, 0x95D1, 0xBE82, 0x95D2, 0xBE83, 0x95D3,\n\t0xBE84, 0xBBAC, 0xBE85, 0x95D4, 0xBE86, 0x95D5, 0xBE87, 0x95D6,\t0xBE88, 0x95D7, 0xBE89, 0x95D8, 0xBE8A, 0x95D9, 0xBE8B, 0x95DA,\n\t0xBE8C, 0xBBAD, 0xBE8D, 0xBBAE, 0xBE8E, 0x95DB, 0xBE8F, 0xBBAF,\t0xBE90, 0xBBB0, 0xBE91, 0xBBB1, 0xBE92, 0x95DC, 0xBE93, 0x95DD,\n\t0xBE94, 0x95DE, 0xBE95, 0x95DF, 0xBE96, 0x95E0, 0xBE97, 0x95E1,\t0xBE98, 0xBBB2, 0xBE99, 0xBBB3, 0xBE9A, 0x95E2, 0xBE9B, 0x95E3,\n\t0xBE9C, 0x95E4, 0xBE9D, 0x95E5, 0xBE9E, 0x95E6, 0xBE9F, 0x95E7,\t0xBEA0, 0x95E8, 0xBEA1, 0x95E9, 0xBEA2, 0x95EA, 0xBEA3, 0x95EB,\n\t0xBEA4, 0x95EC, 0xBEA5, 0x95ED, 0xBEA6, 0x95EE, 0xBEA7, 0x95EF,\t0xBEA8, 0xBBB4, 0xBEA9, 0x95F0, 0xBEAA, 0x95F1, 0xBEAB, 0x95F2,\n\t0xBEAC, 0x95F3, 0xBEAD, 0x95F4, 0xBEAE, 0x95F5, 0xBEAF, 0x95F6,\t0xBEB0, 0x95F7, 0xBEB1, 0x95F8, 0xBEB2, 0x95F9, 0xBEB3, 0x95FA,\n\t0xBEB4, 0x95FB, 0xBEB5, 0x95FC, 0xBEB6, 0x95FD, 0xBEB7, 0x95FE,\t0xBEB8, 0x9641, 0xBEB9, 0x9642, 0xBEBA, 0x9643, 0xBEBB, 0x9644,\n\t0xBEBC, 0x9645, 0xBEBD, 0x9646, 0xBEBE, 0x9647, 0xBEBF, 0x9648,\t0xBEC0, 0x9649, 0xBEC1, 0x964A, 0xBEC2, 0x964B, 0xBEC3, 0x964C,\n\t0xBEC4, 0x964D, 0xBEC5, 0x964E, 0xBEC6, 0x964F, 0xBEC7, 0x9650,\t0xBEC8, 0x9651, 0xBEC9, 0x9652, 0xBECA, 0x9653, 0xBECB, 0x9654,\n\t0xBECC, 0x9655, 0xBECD, 0x9656, 0xBECE, 0x9657, 0xBECF, 0x9658,\t0xBED0, 0xBBB5, 0xBED1, 0xBBB6, 0xBED2, 0x9659, 0xBED3, 0x965A,\n\t0xBED4, 0xBBB7, 0xBED5, 0x9661, 0xBED6, 0x9662, 0xBED7, 0xBBB8,\t0xBED8, 0xBBB9, 0xBED9, 0x9663, 0xBEDA, 0x9664, 0xBEDB, 0x9665,\n\t0xBEDC, 0x9666, 0xBEDD, 0x9667, 0xBEDE, 0x9668, 0xBEDF, 0x9669,\t0xBEE0, 0xBBBA, 0xBEE1, 0x966A, 0xBEE2, 0x966B, 0xBEE3, 0xBBBB,\n\t0xBEE4, 0xBBBC, 0xBEE5, 0xBBBD, 0xBEE6, 0x966C, 0xBEE7, 0x966D,\t0xBEE8, 0x966E, 0xBEE9, 0x966F, 0xBEEA, 0x9670, 0xBEEB, 0x9671,\n\t0xBEEC, 0xBBBE, 0xBEED, 0x9672, 0xBEEE, 0x9673, 0xBEEF, 0x9674,\t0xBEF0, 0x9675, 0xBEF1, 0x9676, 0xBEF2, 0x9677, 0xBEF3, 0x9678,\n\t0xBEF4, 0x9679, 0xBEF5, 0x967A, 0xBEF6, 0x9681, 0xBEF7, 0x9682,\t0xBEF8, 0x9683, 0xBEF9, 0x9684, 0xBEFA, 0x9685, 0xBEFB, 0x9686,\n\t0xBEFC, 0x9687, 0xBEFD, 0x9688, 0xBEFE, 0x9689, 0xBEFF, 0x968A,\t0xBF00, 0x968B, 0xBF01, 0xBBBF, 0xBF02, 0x968C, 0xBF03, 0x968D,\n\t0xBF04, 0x968E, 0xBF05, 0x968F, 0xBF06, 0x9690, 0xBF07, 0x9691,\t0xBF08, 0xBBC0, 0xBF09, 0xBBC1, 0xBF0A, 0x9692, 0xBF0B, 0x9693,\n\t0xBF0C, 0x9694, 0xBF0D, 0x9695, 0xBF0E, 0x9696, 0xBF0F, 0x9697,\t0xBF10, 0x9698, 0xBF11, 0x9699, 0xBF12, 0x969A, 0xBF13, 0x969B,\n\t0xBF14, 0x969C, 0xBF15, 0x969D, 0xBF16, 0x969E, 0xBF17, 0x969F,\t0xBF18, 0xBBC2, 0xBF19, 0xBBC3, 0xBF1A, 0x96A0, 0xBF1B, 0xBBC4,\n\t0xBF1C, 0xBBC5, 0xBF1D, 0xBBC6, 0xBF1E, 0x96A1, 0xBF1F, 0x96A2,\t0xBF20, 0x96A3, 0xBF21, 0x96A4, 0xBF22, 0x96A5, 0xBF23, 0x96A6,\n\t0xBF24, 0x96A7, 0xBF25, 0x96A8, 0xBF26, 0x96A9, 0xBF27, 0x96AA,\t0xBF28, 0x96AB, 0xBF29, 0x96AC, 0xBF2A, 0x96AD, 0xBF2B, 0x96AE,\n\t0xBF2C, 0x96AF, 0xBF2D, 0x96B0, 0xBF2E, 0x96B1, 0xBF2F, 0x96B2,\t0xBF30, 0x96B3, 0xBF31, 0x96B4, 0xBF32, 0x96B5, 0xBF33, 0x96B6,\n\t0xBF34, 0x96B7, 0xBF35, 0x96B8, 0xBF36, 0x96B9, 0xBF37, 0x96BA,\t0xBF38, 0x96BB, 0xBF39, 0x96BC, 0xBF3A, 0x96BD, 0xBF3B, 0x96BE,\n\t0xBF3C, 0x96BF, 0xBF3D, 0x96C0, 0xBF3E, 0x96C1, 0xBF3F, 0x96C2,\t0xBF40, 0xBBC7, 0xBF41, 0xBBC8, 0xBF42, 0x96C3, 0xBF43, 0x96C4,\n\t0xBF44, 0xBBC9, 0xBF45, 0x96C5, 0xBF46, 0x96C6, 0xBF47, 0x96C7,\t0xBF48, 0xBBCA, 0xBF49, 0x96C8, 0xBF4A, 0x96C9, 0xBF4B, 0x96CA,\n\t0xBF4C, 0x96CB, 0xBF4D, 0x96CC, 0xBF4E, 0x96CD, 0xBF4F, 0x96CE,\t0xBF50, 0xBBCB, 0xBF51, 0xBBCC, 0xBF52, 0x96CF, 0xBF53, 0x96D0,\n\t0xBF54, 0x96D1, 0xBF55, 0xBBCD, 0xBF56, 0x96D2, 0xBF57, 0x96D3,\t0xBF58, 0x96D4, 0xBF59, 0x96D5, 0xBF5A, 0x96D6, 0xBF5B, 0x96D7,\n\t0xBF5C, 0x96D8, 0xBF5D, 0x96D9, 0xBF5E, 0x96DA, 0xBF5F, 0x96DB,\t0xBF60, 0x96DC, 0xBF61, 0x96DD, 0xBF62, 0x96DE, 0xBF63, 0x96DF,\n\t0xBF64, 0x96E0, 0xBF65, 0x96E1, 0xBF66, 0x96E2, 0xBF67, 0x96E3,\t0xBF68, 0x96E4, 0xBF69, 0x96E5, 0xBF6A, 0x96E6, 0xBF6B, 0x96E7,\n\t0xBF6C, 0x96E8, 0xBF6D, 0x96E9, 0xBF6E, 0x96EA, 0xBF6F, 0x96EB,\t0xBF70, 0x96EC, 0xBF71, 0x96ED, 0xBF72, 0x96EE, 0xBF73, 0x96EF,\n\t0xBF74, 0x96F0, 0xBF75, 0x96F1, 0xBF76, 0x96F2, 0xBF77, 0x96F3,\t0xBF78, 0x96F4, 0xBF79, 0x96F5, 0xBF7A, 0x96F6, 0xBF7B, 0x96F7,\n\t0xBF7C, 0x96F8, 0xBF7D, 0x96F9, 0xBF7E, 0x96FA, 0xBF7F, 0x96FB,\t0xBF80, 0x96FC, 0xBF81, 0x96FD, 0xBF82, 0x96FE, 0xBF83, 0x9741,\n\t0xBF84, 0x9742, 0xBF85, 0x9743, 0xBF86, 0x9744, 0xBF87, 0x9745,\t0xBF88, 0x9746, 0xBF89, 0x9747, 0xBF8A, 0x9748, 0xBF8B, 0x9749,\n\t0xBF8C, 0x974A, 0xBF8D, 0x974B, 0xBF8E, 0x974C, 0xBF8F, 0x974D,\t0xBF90, 0x974E, 0xBF91, 0x974F, 0xBF92, 0x9750, 0xBF93, 0x9751,\n\t0xBF94, 0xBBCE, 0xBF95, 0x9752, 0xBF96, 0x9753, 0xBF97, 0x9754,\t0xBF98, 0x9755, 0xBF99, 0x9756, 0xBF9A, 0x9757, 0xBF9B, 0x9758,\n\t0xBF9C, 0x9759, 0xBF9D, 0x975A, 0xBF9E, 0x9761, 0xBF9F, 0x9762,\t0xBFA0, 0x9763, 0xBFA1, 0x9764, 0xBFA2, 0x9765, 0xBFA3, 0x9766,\n\t0xBFA4, 0x9767, 0xBFA5, 0x9768, 0xBFA6, 0x9769, 0xBFA7, 0x976A,\t0xBFA8, 0x976B, 0xBFA9, 0x976C, 0xBFAA, 0x976D, 0xBFAB, 0x976E,\n\t0xBFAC, 0x976F, 0xBFAD, 0x9770, 0xBFAE, 0x9771, 0xBFAF, 0x9772,\t0xBFB0, 0xBBCF, 0xBFB1, 0x9773, 0xBFB2, 0x9774, 0xBFB3, 0x9775,\n\t0xBFB4, 0x9776, 0xBFB5, 0x9777, 0xBFB6, 0x9778, 0xBFB7, 0x9779,\t0xBFB8, 0x977A, 0xBFB9, 0x9781, 0xBFBA, 0x9782, 0xBFBB, 0x9783,\n\t0xBFBC, 0x9784, 0xBFBD, 0x9785, 0xBFBE, 0x9786, 0xBFBF, 0x9787,\t0xBFC0, 0x9788, 0xBFC1, 0x9789, 0xBFC2, 0x978A, 0xBFC3, 0x978B,\n\t0xBFC4, 0x978C, 0xBFC5, 0xBBD0, 0xBFC6, 0x978D, 0xBFC7, 0x978E,\t0xBFC8, 0x978F, 0xBFC9, 0x9790, 0xBFCA, 0x9791, 0xBFCB, 0x9792,\n\t0xBFCC, 0xBBD1, 0xBFCD, 0xBBD2, 0xBFCE, 0x9793, 0xBFCF, 0x9794,\t0xBFD0, 0xBBD3, 0xBFD1, 0x9795, 0xBFD2, 0x9796, 0xBFD3, 0x9797,\n\t0xBFD4, 0xBBD4, 0xBFD5, 0x9798, 0xBFD6, 0x9799, 0xBFD7, 0x979A,\t0xBFD8, 0x979B, 0xBFD9, 0x979C, 0xBFDA, 0x979D, 0xBFDB, 0x979E,\n\t0xBFDC, 0xBBD5, 0xBFDD, 0x979F, 0xBFDE, 0x97A0, 0xBFDF, 0xBBD6,\t0xBFE0, 0x97A1, 0xBFE1, 0xBBD7, 0xBFE2, 0x97A2, 0xBFE3, 0x97A3,\n\t0xBFE4, 0x97A4, 0xBFE5, 0x97A5, 0xBFE6, 0x97A6, 0xBFE7, 0x97A7,\t0xBFE8, 0x97A8, 0xBFE9, 0x97A9, 0xBFEA, 0x97AA, 0xBFEB, 0x97AB,\n\t0xBFEC, 0x97AC, 0xBFED, 0x97AD, 0xBFEE, 0x97AE, 0xBFEF, 0x97AF,\t0xBFF0, 0x97B0, 0xBFF1, 0x97B1, 0xBFF2, 0x97B2, 0xBFF3, 0x97B3,\n\t0xBFF4, 0x97B4, 0xBFF5, 0x97B5, 0xBFF6, 0x97B6, 0xBFF7, 0x97B7,\t0xBFF8, 0x97B8, 0xBFF9, 0x97B9, 0xBFFA, 0x97BA, 0xBFFB, 0x97BB,\n\t0xBFFC, 0x97BC, 0xBFFD, 0x97BD, 0xBFFE, 0x97BE, 0xBFFF, 0x97BF,\t0xC000, 0x97C0, 0xC001, 0x97C1, 0xC002, 0x97C2, 0xC003, 0x97C3,\n\t0xC004, 0x97C4, 0xC005, 0x97C5, 0xC006, 0x97C6, 0xC007, 0x97C7,\t0xC008, 0x97C8, 0xC009, 0x97C9, 0xC00A, 0x97CA, 0xC00B, 0x97CB,\n\t0xC00C, 0x97CC, 0xC00D, 0x97CD, 0xC00E, 0x97CE, 0xC00F, 0x97CF,\t0xC010, 0x97D0, 0xC011, 0x97D1, 0xC012, 0x97D2, 0xC013, 0x97D3,\n\t0xC014, 0x97D4, 0xC015, 0x97D5, 0xC016, 0x97D6, 0xC017, 0x97D7,\t0xC018, 0x97D8, 0xC019, 0x97D9, 0xC01A, 0x97DA, 0xC01B, 0x97DB,\n\t0xC01C, 0x97DC, 0xC01D, 0x97DD, 0xC01E, 0x97DE, 0xC01F, 0x97DF,\t0xC020, 0x97E0, 0xC021, 0x97E1, 0xC022, 0x97E2, 0xC023, 0x97E3,\n\t0xC024, 0x97E4, 0xC025, 0x97E5, 0xC026, 0x97E6, 0xC027, 0x97E7,\t0xC028, 0x97E8, 0xC029, 0x97E9, 0xC02A, 0x97EA, 0xC02B, 0x97EB,\n\t0xC02C, 0x97EC, 0xC02D, 0x97ED, 0xC02E, 0x97EE, 0xC02F, 0x97EF,\t0xC030, 0x97F0, 0xC031, 0x97F1, 0xC032, 0x97F2, 0xC033, 0x97F3,\n\t0xC034, 0x97F4, 0xC035, 0x97F5, 0xC036, 0x97F6, 0xC037, 0x97F7,\t0xC038, 0x97F8, 0xC039, 0x97F9, 0xC03A, 0x97FA, 0xC03B, 0x97FB,\n\t0xC03C, 0xBBD8, 0xC03D, 0x97FC, 0xC03E, 0x97FD, 0xC03F, 0x97FE,\t0xC040, 0x9841, 0xC041, 0x9842, 0xC042, 0x9843, 0xC043, 0x9844,\n\t0xC044, 0x9845, 0xC045, 0x9846, 0xC046, 0x9847, 0xC047, 0x9848,\t0xC048, 0x9849, 0xC049, 0x984A, 0xC04A, 0x984B, 0xC04B, 0x984C,\n\t0xC04C, 0x984D, 0xC04D, 0x984E, 0xC04E, 0x984F, 0xC04F, 0x9850,\t0xC050, 0x9851, 0xC051, 0xBBD9, 0xC052, 0x9852, 0xC053, 0x9853,\n\t0xC054, 0x9854, 0xC055, 0x9855, 0xC056, 0x9856, 0xC057, 0x9857,\t0xC058, 0xBBDA, 0xC059, 0x9858, 0xC05A, 0x9859, 0xC05B, 0x985A,\n\t0xC05C, 0xBBDB, 0xC05D, 0x9861, 0xC05E, 0x9862, 0xC05F, 0x9863,\t0xC060, 0xBBDC, 0xC061, 0x9864, 0xC062, 0x9865, 0xC063, 0x9866,\n\t0xC064, 0x9867, 0xC065, 0x9868, 0xC066, 0x9869, 0xC067, 0x986A,\t0xC068, 0xBBDD, 0xC069, 0xBBDE, 0xC06A, 0x986B, 0xC06B, 0x986C,\n\t0xC06C, 0x986D, 0xC06D, 0x986E, 0xC06E, 0x986F, 0xC06F, 0x9870,\t0xC070, 0x9871, 0xC071, 0x9872, 0xC072, 0x9873, 0xC073, 0x9874,\n\t0xC074, 0x9875, 0xC075, 0x9876, 0xC076, 0x9877, 0xC077, 0x9878,\t0xC078, 0x9879, 0xC079, 0x987A, 0xC07A, 0x9881, 0xC07B, 0x9882,\n\t0xC07C, 0x9883, 0xC07D, 0x9884, 0xC07E, 0x9885, 0xC07F, 0x9886,\t0xC080, 0x9887, 0xC081, 0x9888, 0xC082, 0x9889, 0xC083, 0x988A,\n\t0xC084, 0x988B, 0xC085, 0x988C, 0xC086, 0x988D, 0xC087, 0x988E,\t0xC088, 0x988F, 0xC089, 0x9890, 0xC08A, 0x9891, 0xC08B, 0x9892,\n\t0xC08C, 0x9893, 0xC08D, 0x9894, 0xC08E, 0x9895, 0xC08F, 0x9896,\t0xC090, 0xBBDF, 0xC091, 0xBBE0, 0xC092, 0x9897, 0xC093, 0x9898,\n\t0xC094, 0xBBE1, 0xC095, 0x9899, 0xC096, 0x989A, 0xC097, 0x989B,\t0xC098, 0xBBE2, 0xC099, 0x989C, 0xC09A, 0x989D, 0xC09B, 0x989E,\n\t0xC09C, 0x989F, 0xC09D, 0x98A0, 0xC09E, 0x98A1, 0xC09F, 0x98A2,\t0xC0A0, 0xBBE3, 0xC0A1, 0xBBE4, 0xC0A2, 0x98A3, 0xC0A3, 0xBBE5,\n\t0xC0A4, 0x98A4, 0xC0A5, 0xBBE6, 0xC0A6, 0x98A5, 0xC0A7, 0x98A6,\t0xC0A8, 0x98A7, 0xC0A9, 0x98A8, 0xC0AA, 0x98A9, 0xC0AB, 0x98AA,\n\t0xC0AC, 0xBBE7, 0xC0AD, 0xBBE8, 0xC0AE, 0x98AB, 0xC0AF, 0xBBE9,\t0xC0B0, 0xBBEA, 0xC0B1, 0x98AC, 0xC0B2, 0x98AD, 0xC0B3, 0xBBEB,\n\t0xC0B4, 0xBBEC, 0xC0B5, 0xBBED, 0xC0B6, 0xBBEE, 0xC0B7, 0x98AE,\t0xC0B8, 0x98AF, 0xC0B9, 0x98B0, 0xC0BA, 0x98B1, 0xC0BB, 0x98B2,\n\t0xC0BC, 0xBBEF, 0xC0BD, 0xBBF0, 0xC0BE, 0x98B3, 0xC0BF, 0xBBF1,\t0xC0C0, 0xBBF2, 0xC0C1, 0xBBF3, 0xC0C2, 0x98B4, 0xC0C3, 0x98B5,\n\t0xC0C4, 0x98B6, 0xC0C5, 0xBBF4, 0xC0C6, 0x98B7, 0xC0C7, 0x98B8,\t0xC0C8, 0xBBF5, 0xC0C9, 0xBBF6, 0xC0CA, 0x98B9, 0xC0CB, 0x98BA,\n\t0xC0CC, 0xBBF7, 0xC0CD, 0x98BB, 0xC0CE, 0x98BC, 0xC0CF, 0x98BD,\t0xC0D0, 0xBBF8, 0xC0D1, 0x98BE, 0xC0D2, 0x98BF, 0xC0D3, 0x98C0,\n\t0xC0D4, 0x98C1, 0xC0D5, 0x98C2, 0xC0D6, 0x98C3, 0xC0D7, 0x98C4,\t0xC0D8, 0xBBF9, 0xC0D9, 0xBBFA, 0xC0DA, 0x98C5, 0xC0DB, 0xBBFB,\n\t0xC0DC, 0xBBFC, 0xC0DD, 0xBBFD, 0xC0DE, 0x98C6, 0xC0DF, 0x98C7,\t0xC0E0, 0x98C8, 0xC0E1, 0x98C9, 0xC0E2, 0x98CA, 0xC0E3, 0x98CB,\n\t0xC0E4, 0xBBFE, 0xC0E5, 0xBCA1, 0xC0E6, 0x98CC, 0xC0E7, 0x98CD,\t0xC0E8, 0xBCA2, 0xC0E9, 0x98CE, 0xC0EA, 0x98CF, 0xC0EB, 0x98D0,\n\t0xC0EC, 0xBCA3, 0xC0ED, 0x98D1, 0xC0EE, 0x98D2, 0xC0EF, 0x98D3,\t0xC0F0, 0x98D4, 0xC0F1, 0x98D5, 0xC0F2, 0x98D6, 0xC0F3, 0x98D7,\n\t0xC0F4, 0xBCA4, 0xC0F5, 0xBCA5, 0xC0F6, 0x98D8, 0xC0F7, 0xBCA6,\t0xC0F8, 0x98D9, 0xC0F9, 0xBCA7, 0xC0FA, 0x98DA, 0xC0FB, 0x98DB,\n\t0xC0FC, 0x98DC, 0xC0FD, 0x98DD, 0xC0FE, 0x98DE, 0xC0FF, 0x98DF,\t0xC100, 0xBCA8, 0xC101, 0x98E0, 0xC102, 0x98E1, 0xC103, 0x98E2,\n\t0xC104, 0xBCA9, 0xC105, 0x98E3, 0xC106, 0x98E4, 0xC107, 0x98E5,\t0xC108, 0xBCAA, 0xC109, 0x98E6, 0xC10A, 0x98E7, 0xC10B, 0x98E8,\n\t0xC10C, 0x98E9, 0xC10D, 0x98EA, 0xC10E, 0x98EB, 0xC10F, 0x98EC,\t0xC110, 0xBCAB, 0xC111, 0x98ED, 0xC112, 0x98EE, 0xC113, 0x98EF,\n\t0xC114, 0x98F0, 0xC115, 0xBCAC, 0xC116, 0x98F1, 0xC117, 0x98F2,\t0xC118, 0x98F3, 0xC119, 0x98F4, 0xC11A, 0x98F5, 0xC11B, 0x98F6,\n\t0xC11C, 0xBCAD, 0xC11D, 0xBCAE, 0xC11E, 0xBCAF, 0xC11F, 0xBCB0,\t0xC120, 0xBCB1, 0xC121, 0x98F7, 0xC122, 0x98F8, 0xC123, 0xBCB2,\n\t0xC124, 0xBCB3, 0xC125, 0x98F9, 0xC126, 0xBCB4, 0xC127, 0xBCB5,\t0xC128, 0x98FA, 0xC129, 0x98FB, 0xC12A, 0x98FC, 0xC12B, 0x98FD,\n\t0xC12C, 0xBCB6, 0xC12D, 0xBCB7, 0xC12E, 0x98FE, 0xC12F, 0xBCB8,\t0xC130, 0xBCB9, 0xC131, 0xBCBA, 0xC132, 0x9941, 0xC133, 0x9942,\n\t0xC134, 0x9943, 0xC135, 0x9944, 0xC136, 0xBCBB, 0xC137, 0x9945,\t0xC138, 0xBCBC, 0xC139, 0xBCBD, 0xC13A, 0x9946, 0xC13B, 0x9947,\n\t0xC13C, 0xBCBE, 0xC13D, 0x9948, 0xC13E, 0x9949, 0xC13F, 0x994A,\t0xC140, 0xBCBF, 0xC141, 0x994B, 0xC142, 0x994C, 0xC143, 0x994D,\n\t0xC144, 0x994E, 0xC145, 0x994F, 0xC146, 0x9950, 0xC147, 0x9951,\t0xC148, 0xBCC0, 0xC149, 0xBCC1, 0xC14A, 0x9952, 0xC14B, 0xBCC2,\n\t0xC14C, 0xBCC3, 0xC14D, 0xBCC4, 0xC14E, 0x9953, 0xC14F, 0x9954,\t0xC150, 0x9955, 0xC151, 0x9956, 0xC152, 0x9957, 0xC153, 0x9958,\n\t0xC154, 0xBCC5, 0xC155, 0xBCC6, 0xC156, 0x9959, 0xC157, 0x995A,\t0xC158, 0xBCC7, 0xC159, 0x9961, 0xC15A, 0x9962, 0xC15B, 0x9963,\n\t0xC15C, 0xBCC8, 0xC15D, 0x9964, 0xC15E, 0x9965, 0xC15F, 0x9966,\t0xC160, 0x9967, 0xC161, 0x9968, 0xC162, 0x9969, 0xC163, 0x996A,\n\t0xC164, 0xBCC9, 0xC165, 0xBCCA, 0xC166, 0x996B, 0xC167, 0xBCCB,\t0xC168, 0xBCCC, 0xC169, 0xBCCD, 0xC16A, 0x996C, 0xC16B, 0x996D,\n\t0xC16C, 0x996E, 0xC16D, 0x996F, 0xC16E, 0x9970, 0xC16F, 0x9971,\t0xC170, 0xBCCE, 0xC171, 0x9972, 0xC172, 0x9973, 0xC173, 0x9974,\n\t0xC174, 0xBCCF, 0xC175, 0x9975, 0xC176, 0x9976, 0xC177, 0x9977,\t0xC178, 0xBCD0, 0xC179, 0x9978, 0xC17A, 0x9979, 0xC17B, 0x997A,\n\t0xC17C, 0x9981, 0xC17D, 0x9982, 0xC17E, 0x9983, 0xC17F, 0x9984,\t0xC180, 0x9985, 0xC181, 0x9986, 0xC182, 0x9987, 0xC183, 0x9988,\n\t0xC184, 0x9989, 0xC185, 0xBCD1, 0xC186, 0x998A, 0xC187, 0x998B,\t0xC188, 0x998C, 0xC189, 0x998D, 0xC18A, 0x998E, 0xC18B, 0x998F,\n\t0xC18C, 0xBCD2, 0xC18D, 0xBCD3, 0xC18E, 0xBCD4, 0xC18F, 0x9990,\t0xC190, 0xBCD5, 0xC191, 0x9991, 0xC192, 0x9992, 0xC193, 0x9993,\n\t0xC194, 0xBCD6, 0xC195, 0x9994, 0xC196, 0xBCD7, 0xC197, 0x9995,\t0xC198, 0x9996, 0xC199, 0x9997, 0xC19A, 0x9998, 0xC19B, 0x9999,\n\t0xC19C, 0xBCD8, 0xC19D, 0xBCD9, 0xC19E, 0x999A, 0xC19F, 0xBCDA,\t0xC1A0, 0x999B, 0xC1A1, 0xBCDB, 0xC1A2, 0x999C, 0xC1A3, 0x999D,\n\t0xC1A4, 0x999E, 0xC1A5, 0xBCDC, 0xC1A6, 0x999F, 0xC1A7, 0x99A0,\t0xC1A8, 0xBCDD, 0xC1A9, 0xBCDE, 0xC1AA, 0x99A1, 0xC1AB, 0x99A2,\n\t0xC1AC, 0xBCDF, 0xC1AD, 0x99A3, 0xC1AE, 0x99A4, 0xC1AF, 0x99A5,\t0xC1B0, 0xBCE0, 0xC1B1, 0x99A6, 0xC1B2, 0x99A7, 0xC1B3, 0x99A8,\n\t0xC1B4, 0x99A9, 0xC1B5, 0x99AA, 0xC1B6, 0x99AB, 0xC1B7, 0x99AC,\t0xC1B8, 0x99AD, 0xC1B9, 0x99AE, 0xC1BA, 0x99AF, 0xC1BB, 0x99B0,\n\t0xC1BC, 0x99B1, 0xC1BD, 0xBCE1, 0xC1BE, 0x99B2, 0xC1BF, 0x99B3,\t0xC1C0, 0x99B4, 0xC1C1, 0x99B5, 0xC1C2, 0x99B6, 0xC1C3, 0x99B7,\n\t0xC1C4, 0xBCE2, 0xC1C5, 0x99B8, 0xC1C6, 0x99B9, 0xC1C7, 0x99BA,\t0xC1C8, 0xBCE3, 0xC1C9, 0x99BB, 0xC1CA, 0x99BC, 0xC1CB, 0x99BD,\n\t0xC1CC, 0xBCE4, 0xC1CD, 0x99BE, 0xC1CE, 0x99BF, 0xC1CF, 0x99C0,\t0xC1D0, 0x99C1, 0xC1D1, 0x99C2, 0xC1D2, 0x99C3, 0xC1D3, 0x99C4,\n\t0xC1D4, 0xBCE5, 0xC1D5, 0x99C5, 0xC1D6, 0x99C6, 0xC1D7, 0xBCE6,\t0xC1D8, 0xBCE7, 0xC1D9, 0x99C7, 0xC1DA, 0x99C8, 0xC1DB, 0x99C9,\n\t0xC1DC, 0x99CA, 0xC1DD, 0x99CB, 0xC1DE, 0x99CC, 0xC1DF, 0x99CD,\t0xC1E0, 0xBCE8, 0xC1E1, 0x99CE, 0xC1E2, 0x99CF, 0xC1E3, 0x99D0,\n\t0xC1E4, 0xBCE9, 0xC1E5, 0x99D1, 0xC1E6, 0x99D2, 0xC1E7, 0x99D3,\t0xC1E8, 0xBCEA, 0xC1E9, 0x99D4, 0xC1EA, 0x99D5, 0xC1EB, 0x99D6,\n\t0xC1EC, 0x99D7, 0xC1ED, 0x99D8, 0xC1EE, 0x99D9, 0xC1EF, 0x99DA,\t0xC1F0, 0xBCEB, 0xC1F1, 0xBCEC, 0xC1F2, 0x99DB, 0xC1F3, 0xBCED,\n\t0xC1F4, 0x99DC, 0xC1F5, 0x99DD, 0xC1F6, 0x99DE, 0xC1F7, 0x99DF,\t0xC1F8, 0x99E0, 0xC1F9, 0x99E1, 0xC1FA, 0x99E2, 0xC1FB, 0x99E3,\n\t0xC1FC, 0xBCEE, 0xC1FD, 0xBCEF, 0xC1FE, 0x99E4, 0xC1FF, 0x99E5,\t0xC200, 0xBCF0, 0xC201, 0x99E6, 0xC202, 0x99E7, 0xC203, 0x99E8,\n\t0xC204, 0xBCF1, 0xC205, 0x99E9, 0xC206, 0x99EA, 0xC207, 0x99EB,\t0xC208, 0x99EC, 0xC209, 0x99ED, 0xC20A, 0x99EE, 0xC20B, 0x99EF,\n\t0xC20C, 0xBCF2, 0xC20D, 0xBCF3, 0xC20E, 0x99F0, 0xC20F, 0xBCF4,\t0xC210, 0x99F1, 0xC211, 0xBCF5, 0xC212, 0x99F2, 0xC213, 0x99F3,\n\t0xC214, 0x99F4, 0xC215, 0x99F5, 0xC216, 0x99F6, 0xC217, 0x99F7,\t0xC218, 0xBCF6, 0xC219, 0xBCF7, 0xC21A, 0x99F8, 0xC21B, 0x99F9,\n\t0xC21C, 0xBCF8, 0xC21D, 0x99FA, 0xC21E, 0x99FB, 0xC21F, 0xBCF9,\t0xC220, 0xBCFA, 0xC221, 0x99FC, 0xC222, 0x99FD, 0xC223, 0x99FE,\n\t0xC224, 0x9A41, 0xC225, 0x9A42, 0xC226, 0x9A43, 0xC227, 0x9A44,\t0xC228, 0xBCFB, 0xC229, 0xBCFC, 0xC22A, 0x9A45, 0xC22B, 0xBCFD,\n\t0xC22C, 0x9A46, 0xC22D, 0xBCFE, 0xC22E, 0x9A47, 0xC22F, 0xBDA1,\t0xC230, 0x9A48, 0xC231, 0xBDA2, 0xC232, 0xBDA3, 0xC233, 0x9A49,\n\t0xC234, 0xBDA4, 0xC235, 0x9A4A, 0xC236, 0x9A4B, 0xC237, 0x9A4C,\t0xC238, 0x9A4D, 0xC239, 0x9A4E, 0xC23A, 0x9A4F, 0xC23B, 0x9A50,\n\t0xC23C, 0x9A51, 0xC23D, 0x9A52, 0xC23E, 0x9A53, 0xC23F, 0x9A54,\t0xC240, 0x9A55, 0xC241, 0x9A56, 0xC242, 0x9A57, 0xC243, 0x9A58,\n\t0xC244, 0x9A59, 0xC245, 0x9A5A, 0xC246, 0x9A61, 0xC247, 0x9A62,\t0xC248, 0xBDA5, 0xC249, 0x9A63, 0xC24A, 0x9A64, 0xC24B, 0x9A65,\n\t0xC24C, 0x9A66, 0xC24D, 0x9A67, 0xC24E, 0x9A68, 0xC24F, 0x9A69,\t0xC250, 0xBDA6, 0xC251, 0xBDA7, 0xC252, 0x9A6A, 0xC253, 0x9A6B,\n\t0xC254, 0xBDA8, 0xC255, 0x9A6C, 0xC256, 0x9A6D, 0xC257, 0x9A6E,\t0xC258, 0xBDA9, 0xC259, 0x9A6F, 0xC25A, 0x9A70, 0xC25B, 0x9A71,\n\t0xC25C, 0x9A72, 0xC25D, 0x9A73, 0xC25E, 0x9A74, 0xC25F, 0x9A75,\t0xC260, 0xBDAA, 0xC261, 0x9A76, 0xC262, 0x9A77, 0xC263, 0x9A78,\n\t0xC264, 0x9A79, 0xC265, 0xBDAB, 0xC266, 0x9A7A, 0xC267, 0x9A81,\t0xC268, 0x9A82, 0xC269, 0x9A83, 0xC26A, 0x9A84, 0xC26B, 0x9A85,\n\t0xC26C, 0xBDAC, 0xC26D, 0xBDAD, 0xC26E, 0x9A86, 0xC26F, 0x9A87,\t0xC270, 0xBDAE, 0xC271, 0x9A88, 0xC272, 0x9A89, 0xC273, 0x9A8A,\n\t0xC274, 0xBDAF, 0xC275, 0x9A8B, 0xC276, 0x9A8C, 0xC277, 0x9A8D,\t0xC278, 0x9A8E, 0xC279, 0x9A8F, 0xC27A, 0x9A90, 0xC27B, 0x9A91,\n\t0xC27C, 0xBDB0, 0xC27D, 0xBDB1, 0xC27E, 0x9A92, 0xC27F, 0xBDB2,\t0xC280, 0x9A93, 0xC281, 0xBDB3, 0xC282, 0x9A94, 0xC283, 0x9A95,\n\t0xC284, 0x9A96, 0xC285, 0x9A97, 0xC286, 0x9A98, 0xC287, 0x9A99,\t0xC288, 0xBDB4, 0xC289, 0xBDB5, 0xC28A, 0x9A9A, 0xC28B, 0x9A9B,\n\t0xC28C, 0x9A9C, 0xC28D, 0x9A9D, 0xC28E, 0x9A9E, 0xC28F, 0x9A9F,\t0xC290, 0xBDB6, 0xC291, 0x9AA0, 0xC292, 0x9AA1, 0xC293, 0x9AA2,\n\t0xC294, 0x9AA3, 0xC295, 0x9AA4, 0xC296, 0x9AA5, 0xC297, 0x9AA6,\t0xC298, 0xBDB7, 0xC299, 0x9AA7, 0xC29A, 0x9AA8, 0xC29B, 0xBDB8,\n\t0xC29C, 0x9AA9, 0xC29D, 0xBDB9, 0xC29E, 0x9AAA, 0xC29F, 0x9AAB,\t0xC2A0, 0x9AAC, 0xC2A1, 0x9AAD, 0xC2A2, 0x9AAE, 0xC2A3, 0x9AAF,\n\t0xC2A4, 0xBDBA, 0xC2A5, 0xBDBB, 0xC2A6, 0x9AB0, 0xC2A7, 0x9AB1,\t0xC2A8, 0xBDBC, 0xC2A9, 0x9AB2, 0xC2AA, 0x9AB3, 0xC2AB, 0x9AB4,\n\t0xC2AC, 0xBDBD, 0xC2AD, 0xBDBE, 0xC2AE, 0x9AB5, 0xC2AF, 0x9AB6,\t0xC2B0, 0x9AB7, 0xC2B1, 0x9AB8, 0xC2B2, 0x9AB9, 0xC2B3, 0x9ABA,\n\t0xC2B4, 0xBDBF, 0xC2B5, 0xBDC0, 0xC2B6, 0x9ABB, 0xC2B7, 0xBDC1,\t0xC2B8, 0x9ABC, 0xC2B9, 0xBDC2, 0xC2BA, 0x9ABD, 0xC2BB, 0x9ABE,\n\t0xC2BC, 0x9ABF, 0xC2BD, 0x9AC0, 0xC2BE, 0x9AC1, 0xC2BF, 0x9AC2,\t0xC2C0, 0x9AC3, 0xC2C1, 0x9AC4, 0xC2C2, 0x9AC5, 0xC2C3, 0x9AC6,\n\t0xC2C4, 0x9AC7, 0xC2C5, 0x9AC8, 0xC2C6, 0x9AC9, 0xC2C7, 0x9ACA,\t0xC2C8, 0x9ACB, 0xC2C9, 0x9ACC, 0xC2CA, 0x9ACD, 0xC2CB, 0x9ACE,\n\t0xC2CC, 0x9ACF, 0xC2CD, 0x9AD0, 0xC2CE, 0x9AD1, 0xC2CF, 0x9AD2,\t0xC2D0, 0x9AD3, 0xC2D1, 0x9AD4, 0xC2D2, 0x9AD5, 0xC2D3, 0x9AD6,\n\t0xC2D4, 0x9AD7, 0xC2D5, 0x9AD8, 0xC2D6, 0x9AD9, 0xC2D7, 0x9ADA,\t0xC2D8, 0x9ADB, 0xC2D9, 0x9ADC, 0xC2DA, 0x9ADD, 0xC2DB, 0x9ADE,\n\t0xC2DC, 0xBDC3, 0xC2DD, 0xBDC4, 0xC2DE, 0x9ADF, 0xC2DF, 0x9AE0,\t0xC2E0, 0xBDC5, 0xC2E1, 0x9AE1, 0xC2E2, 0x9AE2, 0xC2E3, 0xBDC6,\n\t0xC2E4, 0xBDC7, 0xC2E5, 0x9AE3, 0xC2E6, 0x9AE4, 0xC2E7, 0x9AE5,\t0xC2E8, 0x9AE6, 0xC2E9, 0x9AE7, 0xC2EA, 0x9AE8, 0xC2EB, 0xBDC8,\n\t0xC2EC, 0xBDC9, 0xC2ED, 0xBDCA, 0xC2EE, 0x9AE9, 0xC2EF, 0xBDCB,\t0xC2F0, 0x9AEA, 0xC2F1, 0xBDCC, 0xC2F2, 0x9AEB, 0xC2F3, 0x9AEC,\n\t0xC2F4, 0x9AED, 0xC2F5, 0x9AEE, 0xC2F6, 0xBDCD, 0xC2F7, 0x9AEF,\t0xC2F8, 0xBDCE, 0xC2F9, 0xBDCF, 0xC2FA, 0x9AF0, 0xC2FB, 0xBDD0,\n\t0xC2FC, 0xBDD1, 0xC2FD, 0x9AF1, 0xC2FE, 0x9AF2, 0xC2FF, 0x9AF3,\t0xC300, 0xBDD2, 0xC301, 0x9AF4, 0xC302, 0x9AF5, 0xC303, 0x9AF6,\n\t0xC304, 0x9AF7, 0xC305, 0x9AF8, 0xC306, 0x9AF9, 0xC307, 0x9AFA,\t0xC308, 0xBDD3, 0xC309, 0xBDD4, 0xC30A, 0x9AFB, 0xC30B, 0x9AFC,\n\t0xC30C, 0xBDD5, 0xC30D, 0xBDD6, 0xC30E, 0x9AFD, 0xC30F, 0x9AFE,\t0xC310, 0x9B41, 0xC311, 0x9B42, 0xC312, 0x9B43, 0xC313, 0xBDD7,\n\t0xC314, 0xBDD8, 0xC315, 0xBDD9, 0xC316, 0x9B44, 0xC317, 0x9B45,\t0xC318, 0xBDDA, 0xC319, 0x9B46, 0xC31A, 0x9B47, 0xC31B, 0x9B48,\n\t0xC31C, 0xBDDB, 0xC31D, 0x9B49, 0xC31E, 0x9B4A, 0xC31F, 0x9B4B,\t0xC320, 0x9B4C, 0xC321, 0x9B4D, 0xC322, 0x9B4E, 0xC323, 0x9B4F,\n\t0xC324, 0xBDDC, 0xC325, 0xBDDD, 0xC326, 0x9B50, 0xC327, 0x9B51,\t0xC328, 0xBDDE, 0xC329, 0xBDDF, 0xC32A, 0x9B52, 0xC32B, 0x9B53,\n\t0xC32C, 0x9B54, 0xC32D, 0x9B55, 0xC32E, 0x9B56, 0xC32F, 0x9B57,\t0xC330, 0x9B58, 0xC331, 0x9B59, 0xC332, 0x9B5A, 0xC333, 0x9B61,\n\t0xC334, 0x9B62, 0xC335, 0x9B63, 0xC336, 0x9B64, 0xC337, 0x9B65,\t0xC338, 0x9B66, 0xC339, 0x9B67, 0xC33A, 0x9B68, 0xC33B, 0x9B69,\n\t0xC33C, 0x9B6A, 0xC33D, 0x9B6B, 0xC33E, 0x9B6C, 0xC33F, 0x9B6D,\t0xC340, 0x9B6E, 0xC341, 0x9B6F, 0xC342, 0x9B70, 0xC343, 0x9B71,\n\t0xC344, 0x9B72, 0xC345, 0xBDE0, 0xC346, 0x9B73, 0xC347, 0x9B74,\t0xC348, 0x9B75, 0xC349, 0x9B76, 0xC34A, 0x9B77, 0xC34B, 0x9B78,\n\t0xC34C, 0x9B79, 0xC34D, 0x9B7A, 0xC34E, 0x9B81, 0xC34F, 0x9B82,\t0xC350, 0x9B83, 0xC351, 0x9B84, 0xC352, 0x9B85, 0xC353, 0x9B86,\n\t0xC354, 0x9B87, 0xC355, 0x9B88, 0xC356, 0x9B89, 0xC357, 0x9B8A,\t0xC358, 0x9B8B, 0xC359, 0x9B8C, 0xC35A, 0x9B8D, 0xC35B, 0x9B8E,\n\t0xC35C, 0x9B8F, 0xC35D, 0x9B90, 0xC35E, 0x9B91, 0xC35F, 0x9B92,\t0xC360, 0x9B93, 0xC361, 0x9B94, 0xC362, 0x9B95, 0xC363, 0x9B96,\n\t0xC364, 0x9B97, 0xC365, 0x9B98, 0xC366, 0x9B99, 0xC367, 0x9B9A,\t0xC368, 0xBDE1, 0xC369, 0xBDE2, 0xC36A, 0x9B9B, 0xC36B, 0x9B9C,\n\t0xC36C, 0xBDE3, 0xC36D, 0x9B9D, 0xC36E, 0x9B9E, 0xC36F, 0x9B9F,\t0xC370, 0xBDE4, 0xC371, 0x9BA0, 0xC372, 0xBDE5, 0xC373, 0x9BA1,\n\t0xC374, 0x9BA2, 0xC375, 0x9BA3, 0xC376, 0x9BA4, 0xC377, 0x9BA5,\t0xC378, 0xBDE6, 0xC379, 0xBDE7, 0xC37A, 0x9BA6, 0xC37B, 0x9BA7,\n\t0xC37C, 0xBDE8, 0xC37D, 0xBDE9, 0xC37E, 0x9BA8, 0xC37F, 0x9BA9,\t0xC380, 0x9BAA, 0xC381, 0x9BAB, 0xC382, 0x9BAC, 0xC383, 0x9BAD,\n\t0xC384, 0xBDEA, 0xC385, 0x9BAE, 0xC386, 0x9BAF, 0xC387, 0x9BB0,\t0xC388, 0xBDEB, 0xC389, 0x9BB1, 0xC38A, 0x9BB2, 0xC38B, 0x9BB3,\n\t0xC38C, 0xBDEC, 0xC38D, 0x9BB4, 0xC38E, 0x9BB5, 0xC38F, 0x9BB6,\t0xC390, 0x9BB7, 0xC391, 0x9BB8, 0xC392, 0x9BB9, 0xC393, 0x9BBA,\n\t0xC394, 0x9BBB, 0xC395, 0x9BBC, 0xC396, 0x9BBD, 0xC397, 0x9BBE,\t0xC398, 0x9BBF, 0xC399, 0x9BC0, 0xC39A, 0x9BC1, 0xC39B, 0x9BC2,\n\t0xC39C, 0x9BC3, 0xC39D, 0x9BC4, 0xC39E, 0x9BC5, 0xC39F, 0x9BC6,\t0xC3A0, 0x9BC7, 0xC3A1, 0x9BC8, 0xC3A2, 0x9BC9, 0xC3A3, 0x9BCA,\n\t0xC3A4, 0x9BCB, 0xC3A5, 0x9BCC, 0xC3A6, 0x9BCD, 0xC3A7, 0x9BCE,\t0xC3A8, 0x9BCF, 0xC3A9, 0x9BD0, 0xC3AA, 0x9BD1, 0xC3AB, 0x9BD2,\n\t0xC3AC, 0x9BD3, 0xC3AD, 0x9BD4, 0xC3AE, 0x9BD5, 0xC3AF, 0x9BD6,\t0xC3B0, 0x9BD7, 0xC3B1, 0x9BD8, 0xC3B2, 0x9BD9, 0xC3B3, 0x9BDA,\n\t0xC3B4, 0x9BDB, 0xC3B5, 0x9BDC, 0xC3B6, 0x9BDD, 0xC3B7, 0x9BDE,\t0xC3B8, 0x9BDF, 0xC3B9, 0x9BE0, 0xC3BA, 0x9BE1, 0xC3BB, 0x9BE2,\n\t0xC3BC, 0x9BE3, 0xC3BD, 0x9BE4, 0xC3BE, 0x9BE5, 0xC3BF, 0x9BE6,\t0xC3C0, 0xBDED, 0xC3C1, 0x9BE7, 0xC3C2, 0x9BE8, 0xC3C3, 0x9BE9,\n\t0xC3C4, 0x9BEA, 0xC3C5, 0x9BEB, 0xC3C6, 0x9BEC, 0xC3C7, 0x9BED,\t0xC3C8, 0x9BEE, 0xC3C9, 0x9BEF, 0xC3CA, 0x9BF0, 0xC3CB, 0x9BF1,\n\t0xC3CC, 0x9BF2, 0xC3CD, 0x9BF3, 0xC3CE, 0x9BF4, 0xC3CF, 0x9BF5,\t0xC3D0, 0x9BF6, 0xC3D1, 0x9BF7, 0xC3D2, 0x9BF8, 0xC3D3, 0x9BF9,\n\t0xC3D4, 0x9BFA, 0xC3D5, 0x9BFB, 0xC3D6, 0x9BFC, 0xC3D7, 0x9BFD,\t0xC3D8, 0xBDEE, 0xC3D9, 0xBDEF, 0xC3DA, 0x9BFE, 0xC3DB, 0x9C41,\n\t0xC3DC, 0xBDF0, 0xC3DD, 0x9C42, 0xC3DE, 0x9C43, 0xC3DF, 0xBDF1,\t0xC3E0, 0xBDF2, 0xC3E1, 0x9C44, 0xC3E2, 0xBDF3, 0xC3E3, 0x9C45,\n\t0xC3E4, 0x9C46, 0xC3E5, 0x9C47, 0xC3E6, 0x9C48, 0xC3E7, 0x9C49,\t0xC3E8, 0xBDF4, 0xC3E9, 0xBDF5, 0xC3EA, 0x9C4A, 0xC3EB, 0x9C4B,\n\t0xC3EC, 0x9C4C, 0xC3ED, 0xBDF6, 0xC3EE, 0x9C4D, 0xC3EF, 0x9C4E,\t0xC3F0, 0x9C4F, 0xC3F1, 0x9C50, 0xC3F2, 0x9C51, 0xC3F3, 0x9C52,\n\t0xC3F4, 0xBDF7, 0xC3F5, 0xBDF8, 0xC3F6, 0x9C53, 0xC3F7, 0x9C54,\t0xC3F8, 0xBDF9, 0xC3F9, 0x9C55, 0xC3FA, 0x9C56, 0xC3FB, 0x9C57,\n\t0xC3FC, 0x9C58, 0xC3FD, 0x9C59, 0xC3FE, 0x9C5A, 0xC3FF, 0x9C61,\t0xC400, 0x9C62, 0xC401, 0x9C63, 0xC402, 0x9C64, 0xC403, 0x9C65,\n\t0xC404, 0x9C66, 0xC405, 0x9C67, 0xC406, 0x9C68, 0xC407, 0x9C69,\t0xC408, 0xBDFA, 0xC409, 0x9C6A, 0xC40A, 0x9C6B, 0xC40B, 0x9C6C,\n\t0xC40C, 0x9C6D, 0xC40D, 0x9C6E, 0xC40E, 0x9C6F, 0xC40F, 0x9C70,\t0xC410, 0xBDFB, 0xC411, 0x9C71, 0xC412, 0x9C72, 0xC413, 0x9C73,\n\t0xC414, 0x9C74, 0xC415, 0x9C75, 0xC416, 0x9C76, 0xC417, 0x9C77,\t0xC418, 0x9C78, 0xC419, 0x9C79, 0xC41A, 0x9C7A, 0xC41B, 0x9C81,\n\t0xC41C, 0x9C82, 0xC41D, 0x9C83, 0xC41E, 0x9C84, 0xC41F, 0x9C85,\t0xC420, 0x9C86, 0xC421, 0x9C87, 0xC422, 0x9C88, 0xC423, 0x9C89,\n\t0xC424, 0xBDFC, 0xC425, 0x9C8A, 0xC426, 0x9C8B, 0xC427, 0x9C8C,\t0xC428, 0x9C8D, 0xC429, 0x9C8E, 0xC42A, 0x9C8F, 0xC42B, 0x9C90,\n\t0xC42C, 0xBDFD, 0xC42D, 0x9C91, 0xC42E, 0x9C92, 0xC42F, 0x9C93,\t0xC430, 0xBDFE, 0xC431, 0x9C94, 0xC432, 0x9C95, 0xC433, 0x9C96,\n\t0xC434, 0xBEA1, 0xC435, 0x9C97, 0xC436, 0x9C98, 0xC437, 0x9C99,\t0xC438, 0x9C9A, 0xC439, 0x9C9B, 0xC43A, 0x9C9C, 0xC43B, 0x9C9D,\n\t0xC43C, 0xBEA2, 0xC43D, 0xBEA3, 0xC43E, 0x9C9E, 0xC43F, 0x9C9F,\t0xC440, 0x9CA0, 0xC441, 0x9CA1, 0xC442, 0x9CA2, 0xC443, 0x9CA3,\n\t0xC444, 0x9CA4, 0xC445, 0x9CA5, 0xC446, 0x9CA6, 0xC447, 0x9CA7,\t0xC448, 0xBEA4, 0xC449, 0x9CA8, 0xC44A, 0x9CA9, 0xC44B, 0x9CAA,\n\t0xC44C, 0x9CAB, 0xC44D, 0x9CAC, 0xC44E, 0x9CAD, 0xC44F, 0x9CAE,\t0xC450, 0x9CAF, 0xC451, 0x9CB0, 0xC452, 0x9CB1, 0xC453, 0x9CB2,\n\t0xC454, 0x9CB3, 0xC455, 0x9CB4, 0xC456, 0x9CB5, 0xC457, 0x9CB6,\t0xC458, 0x9CB7, 0xC459, 0x9CB8, 0xC45A, 0x9CB9, 0xC45B, 0x9CBA,\n\t0xC45C, 0x9CBB, 0xC45D, 0x9CBC, 0xC45E, 0x9CBD, 0xC45F, 0x9CBE,\t0xC460, 0x9CBF, 0xC461, 0x9CC0, 0xC462, 0x9CC1, 0xC463, 0x9CC2,\n\t0xC464, 0xBEA5, 0xC465, 0xBEA6, 0xC466, 0x9CC3, 0xC467, 0x9CC4,\t0xC468, 0xBEA7, 0xC469, 0x9CC5, 0xC46A, 0x9CC6, 0xC46B, 0x9CC7,\n\t0xC46C, 0xBEA8, 0xC46D, 0x9CC8, 0xC46E, 0x9CC9, 0xC46F, 0x9CCA,\t0xC470, 0x9CCB, 0xC471, 0x9CCC, 0xC472, 0x9CCD, 0xC473, 0x9CCE,\n\t0xC474, 0xBEA9, 0xC475, 0xBEAA, 0xC476, 0x9CCF, 0xC477, 0x9CD0,\t0xC478, 0x9CD1, 0xC479, 0xBEAB, 0xC47A, 0x9CD2, 0xC47B, 0x9CD3,\n\t0xC47C, 0x9CD4, 0xC47D, 0x9CD5, 0xC47E, 0x9CD6, 0xC47F, 0x9CD7,\t0xC480, 0xBEAC, 0xC481, 0x9CD8, 0xC482, 0x9CD9, 0xC483, 0x9CDA,\n\t0xC484, 0x9CDB, 0xC485, 0x9CDC, 0xC486, 0x9CDD, 0xC487, 0x9CDE,\t0xC488, 0x9CDF, 0xC489, 0x9CE0, 0xC48A, 0x9CE1, 0xC48B, 0x9CE2,\n\t0xC48C, 0x9CE3, 0xC48D, 0x9CE4, 0xC48E, 0x9CE5, 0xC48F, 0x9CE6,\t0xC490, 0x9CE7, 0xC491, 0x9CE8, 0xC492, 0x9CE9, 0xC493, 0x9CEA,\n\t0xC494, 0xBEAD, 0xC495, 0x9CEB, 0xC496, 0x9CEC, 0xC497, 0x9CED,\t0xC498, 0x9CEE, 0xC499, 0x9CEF, 0xC49A, 0x9CF0, 0xC49B, 0x9CF1,\n\t0xC49C, 0xBEAE, 0xC49D, 0x9CF2, 0xC49E, 0x9CF3, 0xC49F, 0x9CF4,\t0xC4A0, 0x9CF5, 0xC4A1, 0x9CF6, 0xC4A2, 0x9CF7, 0xC4A3, 0x9CF8,\n\t0xC4A4, 0x9CF9, 0xC4A5, 0x9CFA, 0xC4A6, 0x9CFB, 0xC4A7, 0x9CFC,\t0xC4A8, 0x9CFD, 0xC4A9, 0x9CFE, 0xC4AA, 0x9D41, 0xC4AB, 0x9D42,\n\t0xC4AC, 0x9D43, 0xC4AD, 0x9D44, 0xC4AE, 0x9D45, 0xC4AF, 0x9D46,\t0xC4B0, 0x9D47, 0xC4B1, 0x9D48, 0xC4B2, 0x9D49, 0xC4B3, 0x9D4A,\n\t0xC4B4, 0x9D4B, 0xC4B5, 0x9D4C, 0xC4B6, 0x9D4D, 0xC4B7, 0x9D4E,\t0xC4B8, 0xBEAF, 0xC4B9, 0x9D4F, 0xC4BA, 0x9D50, 0xC4BB, 0x9D51,\n\t0xC4BC, 0xBEB0, 0xC4BD, 0x9D52, 0xC4BE, 0x9D53, 0xC4BF, 0x9D54,\t0xC4C0, 0x9D55, 0xC4C1, 0x9D56, 0xC4C2, 0x9D57, 0xC4C3, 0x9D58,\n\t0xC4C4, 0x9D59, 0xC4C5, 0x9D5A, 0xC4C6, 0x9D61, 0xC4C7, 0x9D62,\t0xC4C8, 0x9D63, 0xC4C9, 0x9D64, 0xC4CA, 0x9D65, 0xC4CB, 0x9D66,\n\t0xC4CC, 0x9D67, 0xC4CD, 0x9D68, 0xC4CE, 0x9D69, 0xC4CF, 0x9D6A,\t0xC4D0, 0x9D6B, 0xC4D1, 0x9D6C, 0xC4D2, 0x9D6D, 0xC4D3, 0x9D6E,\n\t0xC4D4, 0x9D6F, 0xC4D5, 0x9D70, 0xC4D6, 0x9D71, 0xC4D7, 0x9D72,\t0xC4D8, 0x9D73, 0xC4D9, 0x9D74, 0xC4DA, 0x9D75, 0xC4DB, 0x9D76,\n\t0xC4DC, 0x9D77, 0xC4DD, 0x9D78, 0xC4DE, 0x9D79, 0xC4DF, 0x9D7A,\t0xC4E0, 0x9D81, 0xC4E1, 0x9D82, 0xC4E2, 0x9D83, 0xC4E3, 0x9D84,\n\t0xC4E4, 0x9D85, 0xC4E5, 0x9D86, 0xC4E6, 0x9D87, 0xC4E7, 0x9D88,\t0xC4E8, 0x9D89, 0xC4E9, 0xBEB1, 0xC4EA, 0x9D8A, 0xC4EB, 0x9D8B,\n\t0xC4EC, 0x9D8C, 0xC4ED, 0x9D8D, 0xC4EE, 0x9D8E, 0xC4EF, 0x9D8F,\t0xC4F0, 0xBEB2, 0xC4F1, 0xBEB3, 0xC4F2, 0x9D90, 0xC4F3, 0x9D91,\n\t0xC4F4, 0xBEB4, 0xC4F5, 0x9D92, 0xC4F6, 0x9D93, 0xC4F7, 0x9D94,\t0xC4F8, 0xBEB5, 0xC4F9, 0x9D95, 0xC4FA, 0xBEB6, 0xC4FB, 0x9D96,\n\t0xC4FC, 0x9D97, 0xC4FD, 0x9D98, 0xC4FE, 0x9D99, 0xC4FF, 0xBEB7,\t0xC500, 0xBEB8, 0xC501, 0xBEB9, 0xC502, 0x9D9A, 0xC503, 0x9D9B,\n\t0xC504, 0x9D9C, 0xC505, 0x9D9D, 0xC506, 0x9D9E, 0xC507, 0x9D9F,\t0xC508, 0x9DA0, 0xC509, 0x9DA1, 0xC50A, 0x9DA2, 0xC50B, 0x9DA3,\n\t0xC50C, 0xBEBA, 0xC50D, 0x9DA4, 0xC50E, 0x9DA5, 0xC50F, 0x9DA6,\t0xC510, 0xBEBB, 0xC511, 0x9DA7, 0xC512, 0x9DA8, 0xC513, 0x9DA9,\n\t0xC514, 0xBEBC, 0xC515, 0x9DAA, 0xC516, 0x9DAB, 0xC517, 0x9DAC,\t0xC518, 0x9DAD, 0xC519, 0x9DAE, 0xC51A, 0x9DAF, 0xC51B, 0x9DB0,\n\t0xC51C, 0xBEBD, 0xC51D, 0x9DB1, 0xC51E, 0x9DB2, 0xC51F, 0x9DB3,\t0xC520, 0x9DB4, 0xC521, 0x9DB5, 0xC522, 0x9DB6, 0xC523, 0x9DB7,\n\t0xC524, 0x9DB8, 0xC525, 0x9DB9, 0xC526, 0x9DBA, 0xC527, 0x9DBB,\t0xC528, 0xBEBE, 0xC529, 0xBEBF, 0xC52A, 0x9DBC, 0xC52B, 0x9DBD,\n\t0xC52C, 0xBEC0, 0xC52D, 0x9DBE, 0xC52E, 0x9DBF, 0xC52F, 0x9DC0,\t0xC530, 0xBEC1, 0xC531, 0x9DC1, 0xC532, 0x9DC2, 0xC533, 0x9DC3,\n\t0xC534, 0x9DC4, 0xC535, 0x9DC5, 0xC536, 0x9DC6, 0xC537, 0x9DC7,\t0xC538, 0xBEC2, 0xC539, 0xBEC3, 0xC53A, 0x9DC8, 0xC53B, 0xBEC4,\n\t0xC53C, 0x9DC9, 0xC53D, 0xBEC5, 0xC53E, 0x9DCA, 0xC53F, 0x9DCB,\t0xC540, 0x9DCC, 0xC541, 0x9DCD, 0xC542, 0x9DCE, 0xC543, 0x9DCF,\n\t0xC544, 0xBEC6, 0xC545, 0xBEC7, 0xC546, 0x9DD0, 0xC547, 0x9DD1,\t0xC548, 0xBEC8, 0xC549, 0xBEC9, 0xC54A, 0xBECA, 0xC54B, 0x9DD2,\n\t0xC54C, 0xBECB, 0xC54D, 0xBECC, 0xC54E, 0xBECD, 0xC54F, 0x9DD3,\t0xC550, 0x9DD4, 0xC551, 0x9DD5, 0xC552, 0x9DD6, 0xC553, 0xBECE,\n\t0xC554, 0xBECF, 0xC555, 0xBED0, 0xC556, 0x9DD7, 0xC557, 0xBED1,\t0xC558, 0xBED2, 0xC559, 0xBED3, 0xC55A, 0x9DD8, 0xC55B, 0x9DD9,\n\t0xC55C, 0x9DDA, 0xC55D, 0xBED4, 0xC55E, 0xBED5, 0xC55F, 0x9DDB,\t0xC560, 0xBED6, 0xC561, 0xBED7, 0xC562, 0x9DDC, 0xC563, 0x9DDD,\n\t0xC564, 0xBED8, 0xC565, 0x9DDE, 0xC566, 0x9DDF, 0xC567, 0x9DE0,\t0xC568, 0xBED9, 0xC569, 0x9DE1, 0xC56A, 0x9DE2, 0xC56B, 0x9DE3,\n\t0xC56C, 0x9DE4, 0xC56D, 0x9DE5, 0xC56E, 0x9DE6, 0xC56F, 0x9DE7,\t0xC570, 0xBEDA, 0xC571, 0xBEDB, 0xC572, 0x9DE8, 0xC573, 0xBEDC,\n\t0xC574, 0xBEDD, 0xC575, 0xBEDE, 0xC576, 0x9DE9, 0xC577, 0x9DEA,\t0xC578, 0x9DEB, 0xC579, 0x9DEC, 0xC57A, 0x9DED, 0xC57B, 0x9DEE,\n\t0xC57C, 0xBEDF, 0xC57D, 0xBEE0, 0xC57E, 0x9DEF, 0xC57F, 0x9DF0,\t0xC580, 0xBEE1, 0xC581, 0x9DF1, 0xC582, 0x9DF2, 0xC583, 0x9DF3,\n\t0xC584, 0xBEE2, 0xC585, 0x9DF4, 0xC586, 0x9DF5, 0xC587, 0xBEE3,\t0xC588, 0x9DF6, 0xC589, 0x9DF7, 0xC58A, 0x9DF8, 0xC58B, 0x9DF9,\n\t0xC58C, 0xBEE4, 0xC58D, 0xBEE5, 0xC58E, 0x9DFA, 0xC58F, 0xBEE6,\t0xC590, 0x9DFB, 0xC591, 0xBEE7, 0xC592, 0x9DFC, 0xC593, 0x9DFD,\n\t0xC594, 0x9DFE, 0xC595, 0xBEE8, 0xC596, 0x9E41, 0xC597, 0xBEE9,\t0xC598, 0xBEEA, 0xC599, 0x9E42, 0xC59A, 0x9E43, 0xC59B, 0x9E44,\n\t0xC59C, 0xBEEB, 0xC59D, 0x9E45, 0xC59E, 0x9E46, 0xC59F, 0x9E47,\t0xC5A0, 0xBEEC, 0xC5A1, 0x9E48, 0xC5A2, 0x9E49, 0xC5A3, 0x9E4A,\n\t0xC5A4, 0x9E4B, 0xC5A5, 0x9E4C, 0xC5A6, 0x9E4D, 0xC5A7, 0x9E4E,\t0xC5A8, 0x9E4F, 0xC5A9, 0xBEED, 0xC5AA, 0x9E50, 0xC5AB, 0x9E51,\n\t0xC5AC, 0x9E52, 0xC5AD, 0x9E53, 0xC5AE, 0x9E54, 0xC5AF, 0x9E55,\t0xC5B0, 0x9E56, 0xC5B1, 0x9E57, 0xC5B2, 0x9E58, 0xC5B3, 0x9E59,\n\t0xC5B4, 0xBEEE, 0xC5B5, 0xBEEF, 0xC5B6, 0x9E5A, 0xC5B7, 0x9E61,\t0xC5B8, 0xBEF0, 0xC5B9, 0xBEF1, 0xC5BA, 0x9E62, 0xC5BB, 0xBEF2,\n\t0xC5BC, 0xBEF3, 0xC5BD, 0xBEF4, 0xC5BE, 0xBEF5, 0xC5BF, 0x9E63,\t0xC5C0, 0x9E64, 0xC5C1, 0x9E65, 0xC5C2, 0x9E66, 0xC5C3, 0x9E67,\n\t0xC5C4, 0xBEF6, 0xC5C5, 0xBEF7, 0xC5C6, 0xBEF8, 0xC5C7, 0xBEF9,\t0xC5C8, 0xBEFA, 0xC5C9, 0xBEFB, 0xC5CA, 0xBEFC, 0xC5CB, 0x9E68,\n\t0xC5CC, 0xBEFD, 0xC5CD, 0x9E69, 0xC5CE, 0xBEFE, 0xC5CF, 0x9E6A,\t0xC5D0, 0xBFA1, 0xC5D1, 0xBFA2, 0xC5D2, 0x9E6B, 0xC5D3, 0x9E6C,\n\t0xC5D4, 0xBFA3, 0xC5D5, 0x9E6D, 0xC5D6, 0x9E6E, 0xC5D7, 0x9E6F,\t0xC5D8, 0xBFA4, 0xC5D9, 0x9E70, 0xC5DA, 0x9E71, 0xC5DB, 0x9E72,\n\t0xC5DC, 0x9E73, 0xC5DD, 0x9E74, 0xC5DE, 0x9E75, 0xC5DF, 0x9E76,\t0xC5E0, 0xBFA5, 0xC5E1, 0xBFA6, 0xC5E2, 0x9E77, 0xC5E3, 0xBFA7,\n\t0xC5E4, 0x9E78, 0xC5E5, 0xBFA8, 0xC5E6, 0x9E79, 0xC5E7, 0x9E7A,\t0xC5E8, 0x9E81, 0xC5E9, 0x9E82, 0xC5EA, 0x9E83, 0xC5EB, 0x9E84,\n\t0xC5EC, 0xBFA9, 0xC5ED, 0xBFAA, 0xC5EE, 0xBFAB, 0xC5EF, 0x9E85,\t0xC5F0, 0xBFAC, 0xC5F1, 0x9E86, 0xC5F2, 0x9E87, 0xC5F3, 0x9E88,\n\t0xC5F4, 0xBFAD, 0xC5F5, 0x9E89, 0xC5F6, 0xBFAE, 0xC5F7, 0xBFAF,\t0xC5F8, 0x9E8A, 0xC5F9, 0x9E8B, 0xC5FA, 0x9E8C, 0xC5FB, 0x9E8D,\n\t0xC5FC, 0xBFB0, 0xC5FD, 0xBFB1, 0xC5FE, 0xBFB2, 0xC5FF, 0xBFB3,\t0xC600, 0xBFB4, 0xC601, 0xBFB5, 0xC602, 0x9E8E, 0xC603, 0x9E8F,\n\t0xC604, 0x9E90, 0xC605, 0xBFB6, 0xC606, 0xBFB7, 0xC607, 0xBFB8,\t0xC608, 0xBFB9, 0xC609, 0x9E91, 0xC60A, 0x9E92, 0xC60B, 0x9E93,\n\t0xC60C, 0xBFBA, 0xC60D, 0x9E94, 0xC60E, 0x9E95, 0xC60F, 0x9E96,\t0xC610, 0xBFBB, 0xC611, 0x9E97, 0xC612, 0x9E98, 0xC613, 0x9E99,\n\t0xC614, 0x9E9A, 0xC615, 0x9E9B, 0xC616, 0x9E9C, 0xC617, 0x9E9D,\t0xC618, 0xBFBC, 0xC619, 0xBFBD, 0xC61A, 0x9E9E, 0xC61B, 0xBFBE,\n\t0xC61C, 0xBFBF, 0xC61D, 0x9E9F, 0xC61E, 0x9EA0, 0xC61F, 0x9EA1,\t0xC620, 0x9EA2, 0xC621, 0x9EA3, 0xC622, 0x9EA4, 0xC623, 0x9EA5,\n\t0xC624, 0xBFC0, 0xC625, 0xBFC1, 0xC626, 0x9EA6, 0xC627, 0x9EA7,\t0xC628, 0xBFC2, 0xC629, 0x9EA8, 0xC62A, 0x9EA9, 0xC62B, 0x9EAA,\n\t0xC62C, 0xBFC3, 0xC62D, 0xBFC4, 0xC62E, 0xBFC5, 0xC62F, 0x9EAB,\t0xC630, 0xBFC6, 0xC631, 0x9EAC, 0xC632, 0x9EAD, 0xC633, 0xBFC7,\n\t0xC634, 0xBFC8, 0xC635, 0xBFC9, 0xC636, 0x9EAE, 0xC637, 0xBFCA,\t0xC638, 0x9EAF, 0xC639, 0xBFCB, 0xC63A, 0x9EB0, 0xC63B, 0xBFCC,\n\t0xC63C, 0x9EB1, 0xC63D, 0x9EB2, 0xC63E, 0x9EB3, 0xC63F, 0x9EB4,\t0xC640, 0xBFCD, 0xC641, 0xBFCE, 0xC642, 0x9EB5, 0xC643, 0x9EB6,\n\t0xC644, 0xBFCF, 0xC645, 0x9EB7, 0xC646, 0x9EB8, 0xC647, 0x9EB9,\t0xC648, 0xBFD0, 0xC649, 0x9EBA, 0xC64A, 0x9EBB, 0xC64B, 0x9EBC,\n\t0xC64C, 0x9EBD, 0xC64D, 0x9EBE, 0xC64E, 0x9EBF, 0xC64F, 0x9EC0,\t0xC650, 0xBFD1, 0xC651, 0xBFD2, 0xC652, 0x9EC1, 0xC653, 0xBFD3,\n\t0xC654, 0xBFD4, 0xC655, 0xBFD5, 0xC656, 0x9EC2, 0xC657, 0x9EC3,\t0xC658, 0x9EC4, 0xC659, 0x9EC5, 0xC65A, 0x9EC6, 0xC65B, 0x9EC7,\n\t0xC65C, 0xBFD6, 0xC65D, 0xBFD7, 0xC65E, 0x9EC8, 0xC65F, 0x9EC9,\t0xC660, 0xBFD8, 0xC661, 0x9ECA, 0xC662, 0x9ECB, 0xC663, 0x9ECC,\n\t0xC664, 0x9ECD, 0xC665, 0x9ECE, 0xC666, 0x9ECF, 0xC667, 0x9ED0,\t0xC668, 0x9ED1, 0xC669, 0x9ED2, 0xC66A, 0x9ED3, 0xC66B, 0x9ED4,\n\t0xC66C, 0xBFD9, 0xC66D, 0x9ED5, 0xC66E, 0x9ED6, 0xC66F, 0xBFDA,\t0xC670, 0x9ED7, 0xC671, 0xBFDB, 0xC672, 0x9ED8, 0xC673, 0x9ED9,\n\t0xC674, 0x9EDA, 0xC675, 0x9EDB, 0xC676, 0x9EDC, 0xC677, 0x9EDD,\t0xC678, 0xBFDC, 0xC679, 0xBFDD, 0xC67A, 0x9EDE, 0xC67B, 0x9EDF,\n\t0xC67C, 0xBFDE, 0xC67D, 0x9EE0, 0xC67E, 0x9EE1, 0xC67F, 0x9EE2,\t0xC680, 0xBFDF, 0xC681, 0x9EE3, 0xC682, 0x9EE4, 0xC683, 0x9EE5,\n\t0xC684, 0x9EE6, 0xC685, 0x9EE7, 0xC686, 0x9EE8, 0xC687, 0x9EE9,\t0xC688, 0xBFE0, 0xC689, 0xBFE1, 0xC68A, 0x9EEA, 0xC68B, 0xBFE2,\n\t0xC68C, 0x9EEB, 0xC68D, 0xBFE3, 0xC68E, 0x9EEC, 0xC68F, 0x9EED,\t0xC690, 0x9EEE, 0xC691, 0x9EEF, 0xC692, 0x9EF0, 0xC693, 0x9EF1,\n\t0xC694, 0xBFE4, 0xC695, 0xBFE5, 0xC696, 0x9EF2, 0xC697, 0x9EF3,\t0xC698, 0xBFE6, 0xC699, 0x9EF4, 0xC69A, 0x9EF5, 0xC69B, 0x9EF6,\n\t0xC69C, 0xBFE7, 0xC69D, 0x9EF7, 0xC69E, 0x9EF8, 0xC69F, 0x9EF9,\t0xC6A0, 0x9EFA, 0xC6A1, 0x9EFB, 0xC6A2, 0x9EFC, 0xC6A3, 0x9EFD,\n\t0xC6A4, 0xBFE8, 0xC6A5, 0xBFE9, 0xC6A6, 0x9EFE, 0xC6A7, 0xBFEA,\t0xC6A8, 0x9F41, 0xC6A9, 0xBFEB, 0xC6AA, 0x9F42, 0xC6AB, 0x9F43,\n\t0xC6AC, 0x9F44, 0xC6AD, 0x9F45, 0xC6AE, 0x9F46, 0xC6AF, 0x9F47,\t0xC6B0, 0xBFEC, 0xC6B1, 0xBFED, 0xC6B2, 0x9F48, 0xC6B3, 0x9F49,\n\t0xC6B4, 0xBFEE, 0xC6B5, 0x9F4A, 0xC6B6, 0x9F4B, 0xC6B7, 0x9F4C,\t0xC6B8, 0xBFEF, 0xC6B9, 0xBFF0, 0xC6BA, 0xBFF1, 0xC6BB, 0x9F4D,\n\t0xC6BC, 0x9F4E, 0xC6BD, 0x9F4F, 0xC6BE, 0x9F50, 0xC6BF, 0x9F51,\t0xC6C0, 0xBFF2, 0xC6C1, 0xBFF3, 0xC6C2, 0x9F52, 0xC6C3, 0xBFF4,\n\t0xC6C4, 0x9F53, 0xC6C5, 0xBFF5, 0xC6C6, 0x9F54, 0xC6C7, 0x9F55,\t0xC6C8, 0x9F56, 0xC6C9, 0x9F57, 0xC6CA, 0x9F58, 0xC6CB, 0x9F59,\n\t0xC6CC, 0xBFF6, 0xC6CD, 0xBFF7, 0xC6CE, 0x9F5A, 0xC6CF, 0x9F61,\t0xC6D0, 0xBFF8, 0xC6D1, 0x9F62, 0xC6D2, 0x9F63, 0xC6D3, 0x9F64,\n\t0xC6D4, 0xBFF9, 0xC6D5, 0x9F65, 0xC6D6, 0x9F66, 0xC6D7, 0x9F67,\t0xC6D8, 0x9F68, 0xC6D9, 0x9F69, 0xC6DA, 0x9F6A, 0xC6DB, 0x9F6B,\n\t0xC6DC, 0xBFFA, 0xC6DD, 0xBFFB, 0xC6DE, 0x9F6C, 0xC6DF, 0x9F6D,\t0xC6E0, 0xBFFC, 0xC6E1, 0xBFFD, 0xC6E2, 0x9F6E, 0xC6E3, 0x9F6F,\n\t0xC6E4, 0x9F70, 0xC6E5, 0x9F71, 0xC6E6, 0x9F72, 0xC6E7, 0x9F73,\t0xC6E8, 0xBFFE, 0xC6E9, 0xC0A1, 0xC6EA, 0x9F74, 0xC6EB, 0x9F75,\n\t0xC6EC, 0xC0A2, 0xC6ED, 0x9F76, 0xC6EE, 0x9F77, 0xC6EF, 0x9F78,\t0xC6F0, 0xC0A3, 0xC6F1, 0x9F79, 0xC6F2, 0x9F7A, 0xC6F3, 0x9F81,\n\t0xC6F4, 0x9F82, 0xC6F5, 0x9F83, 0xC6F6, 0x9F84, 0xC6F7, 0x9F85,\t0xC6F8, 0xC0A4, 0xC6F9, 0xC0A5, 0xC6FA, 0x9F86, 0xC6FB, 0x9F87,\n\t0xC6FC, 0x9F88, 0xC6FD, 0xC0A6, 0xC6FE, 0x9F89, 0xC6FF, 0x9F8A,\t0xC700, 0x9F8B, 0xC701, 0x9F8C, 0xC702, 0x9F8D, 0xC703, 0x9F8E,\n\t0xC704, 0xC0A7, 0xC705, 0xC0A8, 0xC706, 0x9F8F, 0xC707, 0x9F90,\t0xC708, 0xC0A9, 0xC709, 0x9F91, 0xC70A, 0x9F92, 0xC70B, 0x9F93,\n\t0xC70C, 0xC0AA, 0xC70D, 0x9F94, 0xC70E, 0x9F95, 0xC70F, 0x9F96,\t0xC710, 0x9F97, 0xC711, 0x9F98, 0xC712, 0x9F99, 0xC713, 0x9F9A,\n\t0xC714, 0xC0AB, 0xC715, 0xC0AC, 0xC716, 0x9F9B, 0xC717, 0xC0AD,\t0xC718, 0x9F9C, 0xC719, 0xC0AE, 0xC71A, 0x9F9D, 0xC71B, 0x9F9E,\n\t0xC71C, 0x9F9F, 0xC71D, 0x9FA0, 0xC71E, 0x9FA1, 0xC71F, 0x9FA2,\t0xC720, 0xC0AF, 0xC721, 0xC0B0, 0xC722, 0x9FA3, 0xC723, 0x9FA4,\n\t0xC724, 0xC0B1, 0xC725, 0x9FA5, 0xC726, 0x9FA6, 0xC727, 0x9FA7,\t0xC728, 0xC0B2, 0xC729, 0x9FA8, 0xC72A, 0x9FA9, 0xC72B, 0x9FAA,\n\t0xC72C, 0x9FAB, 0xC72D, 0x9FAC, 0xC72E, 0x9FAD, 0xC72F, 0x9FAE,\t0xC730, 0xC0B3, 0xC731, 0xC0B4, 0xC732, 0x9FAF, 0xC733, 0xC0B5,\n\t0xC734, 0x9FB0, 0xC735, 0xC0B6, 0xC736, 0x9FB1, 0xC737, 0xC0B7,\t0xC738, 0x9FB2, 0xC739, 0x9FB3, 0xC73A, 0x9FB4, 0xC73B, 0x9FB5,\n\t0xC73C, 0xC0B8, 0xC73D, 0xC0B9, 0xC73E, 0x9FB6, 0xC73F, 0x9FB7,\t0xC740, 0xC0BA, 0xC741, 0x9FB8, 0xC742, 0x9FB9, 0xC743, 0x9FBA,\n\t0xC744, 0xC0BB, 0xC745, 0x9FBB, 0xC746, 0x9FBC, 0xC747, 0x9FBD,\t0xC748, 0x9FBE, 0xC749, 0x9FBF, 0xC74A, 0xC0BC, 0xC74B, 0x9FC0,\n\t0xC74C, 0xC0BD, 0xC74D, 0xC0BE, 0xC74E, 0x9FC1, 0xC74F, 0xC0BF,\t0xC750, 0x9FC2, 0xC751, 0xC0C0, 0xC752, 0xC0C1, 0xC753, 0xC0C2,\n\t0xC754, 0xC0C3, 0xC755, 0xC0C4, 0xC756, 0xC0C5, 0xC757, 0xC0C6,\t0xC758, 0xC0C7, 0xC759, 0x9FC3, 0xC75A, 0x9FC4, 0xC75B, 0x9FC5,\n\t0xC75C, 0xC0C8, 0xC75D, 0x9FC6, 0xC75E, 0x9FC7, 0xC75F, 0x9FC8,\t0xC760, 0xC0C9, 0xC761, 0x9FC9, 0xC762, 0x9FCA, 0xC763, 0x9FCB,\n\t0xC764, 0x9FCC, 0xC765, 0x9FCD, 0xC766, 0x9FCE, 0xC767, 0x9FCF,\t0xC768, 0xC0CA, 0xC769, 0x9FD0, 0xC76A, 0x9FD1, 0xC76B, 0xC0CB,\n\t0xC76C, 0x9FD2, 0xC76D, 0x9FD3, 0xC76E, 0x9FD4, 0xC76F, 0x9FD5,\t0xC770, 0x9FD6, 0xC771, 0x9FD7, 0xC772, 0x9FD8, 0xC773, 0x9FD9,\n\t0xC774, 0xC0CC, 0xC775, 0xC0CD, 0xC776, 0x9FDA, 0xC777, 0x9FDB,\t0xC778, 0xC0CE, 0xC779, 0x9FDC, 0xC77A, 0x9FDD, 0xC77B, 0x9FDE,\n\t0xC77C, 0xC0CF, 0xC77D, 0xC0D0, 0xC77E, 0xC0D1, 0xC77F, 0x9FDF,\t0xC780, 0x9FE0, 0xC781, 0x9FE1, 0xC782, 0x9FE2, 0xC783, 0xC0D2,\n\t0xC784, 0xC0D3, 0xC785, 0xC0D4, 0xC786, 0x9FE3, 0xC787, 0xC0D5,\t0xC788, 0xC0D6, 0xC789, 0xC0D7, 0xC78A, 0xC0D8, 0xC78B, 0x9FE4,\n\t0xC78C, 0x9FE5, 0xC78D, 0x9FE6, 0xC78E, 0xC0D9, 0xC78F, 0x9FE7,\t0xC790, 0xC0DA, 0xC791, 0xC0DB, 0xC792, 0x9FE8, 0xC793, 0x9FE9,\n\t0xC794, 0xC0DC, 0xC795, 0x9FEA, 0xC796, 0xC0DD, 0xC797, 0xC0DE,\t0xC798, 0xC0DF, 0xC799, 0x9FEB, 0xC79A, 0xC0E0, 0xC79B, 0x9FEC,\n\t0xC79C, 0x9FED, 0xC79D, 0x9FEE, 0xC79E, 0x9FEF, 0xC79F, 0x9FF0,\t0xC7A0, 0xC0E1, 0xC7A1, 0xC0E2, 0xC7A2, 0x9FF1, 0xC7A3, 0xC0E3,\n\t0xC7A4, 0xC0E4, 0xC7A5, 0xC0E5, 0xC7A6, 0xC0E6, 0xC7A7, 0x9FF2,\t0xC7A8, 0x9FF3, 0xC7A9, 0x9FF4, 0xC7AA, 0x9FF5, 0xC7AB, 0x9FF6,\n\t0xC7AC, 0xC0E7, 0xC7AD, 0xC0E8, 0xC7AE, 0x9FF7, 0xC7AF, 0x9FF8,\t0xC7B0, 0xC0E9, 0xC7B1, 0x9FF9, 0xC7B2, 0x9FFA, 0xC7B3, 0x9FFB,\n\t0xC7B4, 0xC0EA, 0xC7B5, 0x9FFC, 0xC7B6, 0x9FFD, 0xC7B7, 0x9FFE,\t0xC7B8, 0xA041, 0xC7B9, 0xA042, 0xC7BA, 0xA043, 0xC7BB, 0xA044,\n\t0xC7BC, 0xC0EB, 0xC7BD, 0xC0EC, 0xC7BE, 0xA045, 0xC7BF, 0xC0ED,\t0xC7C0, 0xC0EE, 0xC7C1, 0xC0EF, 0xC7C2, 0xA046, 0xC7C3, 0xA047,\n\t0xC7C4, 0xA048, 0xC7C5, 0xA049, 0xC7C6, 0xA04A, 0xC7C7, 0xA04B,\t0xC7C8, 0xC0F0, 0xC7C9, 0xC0F1, 0xC7CA, 0xA04C, 0xC7CB, 0xA04D,\n\t0xC7CC, 0xC0F2, 0xC7CD, 0xA04E, 0xC7CE, 0xC0F3, 0xC7CF, 0xA04F,\t0xC7D0, 0xC0F4, 0xC7D1, 0xA050, 0xC7D2, 0xA051, 0xC7D3, 0xA052,\n\t0xC7D4, 0xA053, 0xC7D5, 0xA054, 0xC7D6, 0xA055, 0xC7D7, 0xA056,\t0xC7D8, 0xC0F5, 0xC7D9, 0xA057, 0xC7DA, 0xA058, 0xC7DB, 0xA059,\n\t0xC7DC, 0xA05A, 0xC7DD, 0xC0F6, 0xC7DE, 0xA061, 0xC7DF, 0xA062,\t0xC7E0, 0xA063, 0xC7E1, 0xA064, 0xC7E2, 0xA065, 0xC7E3, 0xA066,\n\t0xC7E4, 0xC0F7, 0xC7E5, 0xA067, 0xC7E6, 0xA068, 0xC7E7, 0xA069,\t0xC7E8, 0xC0F8, 0xC7E9, 0xA06A, 0xC7EA, 0xA06B, 0xC7EB, 0xA06C,\n\t0xC7EC, 0xC0F9, 0xC7ED, 0xA06D, 0xC7EE, 0xA06E, 0xC7EF, 0xA06F,\t0xC7F0, 0xA070, 0xC7F1, 0xA071, 0xC7F2, 0xA072, 0xC7F3, 0xA073,\n\t0xC7F4, 0xA074, 0xC7F5, 0xA075, 0xC7F6, 0xA076, 0xC7F7, 0xA077,\t0xC7F8, 0xA078, 0xC7F9, 0xA079, 0xC7FA, 0xA07A, 0xC7FB, 0xA081,\n\t0xC7FC, 0xA082, 0xC7FD, 0xA083, 0xC7FE, 0xA084, 0xC7FF, 0xA085,\t0xC800, 0xC0FA, 0xC801, 0xC0FB, 0xC802, 0xA086, 0xC803, 0xA087,\n\t0xC804, 0xC0FC, 0xC805, 0xA088, 0xC806, 0xA089, 0xC807, 0xA08A,\t0xC808, 0xC0FD, 0xC809, 0xA08B, 0xC80A, 0xC0FE, 0xC80B, 0xA08C,\n\t0xC80C, 0xA08D, 0xC80D, 0xA08E, 0xC80E, 0xA08F, 0xC80F, 0xA090,\t0xC810, 0xC1A1, 0xC811, 0xC1A2, 0xC812, 0xA091, 0xC813, 0xC1A3,\n\t0xC814, 0xA092, 0xC815, 0xC1A4, 0xC816, 0xC1A5, 0xC817, 0xA093,\t0xC818, 0xA094, 0xC819, 0xA095, 0xC81A, 0xA096, 0xC81B, 0xA097,\n\t0xC81C, 0xC1A6, 0xC81D, 0xC1A7, 0xC81E, 0xA098, 0xC81F, 0xA099,\t0xC820, 0xC1A8, 0xC821, 0xA09A, 0xC822, 0xA09B, 0xC823, 0xA09C,\n\t0xC824, 0xC1A9, 0xC825, 0xA09D, 0xC826, 0xA09E, 0xC827, 0xA09F,\t0xC828, 0xA0A0, 0xC829, 0xA0A1, 0xC82A, 0xA0A2, 0xC82B, 0xA0A3,\n\t0xC82C, 0xC1AA, 0xC82D, 0xC1AB, 0xC82E, 0xA0A4, 0xC82F, 0xC1AC,\t0xC830, 0xA0A5, 0xC831, 0xC1AD, 0xC832, 0xA0A6, 0xC833, 0xA0A7,\n\t0xC834, 0xA0A8, 0xC835, 0xA0A9, 0xC836, 0xA0AA, 0xC837, 0xA0AB,\t0xC838, 0xC1AE, 0xC839, 0xA0AC, 0xC83A, 0xA0AD, 0xC83B, 0xA0AE,\n\t0xC83C, 0xC1AF, 0xC83D, 0xA0AF, 0xC83E, 0xA0B0, 0xC83F, 0xA0B1,\t0xC840, 0xC1B0, 0xC841, 0xA0B2, 0xC842, 0xA0B3, 0xC843, 0xA0B4,\n\t0xC844, 0xA0B5, 0xC845, 0xA0B6, 0xC846, 0xA0B7, 0xC847, 0xA0B8,\t0xC848, 0xC1B1, 0xC849, 0xC1B2, 0xC84A, 0xA0B9, 0xC84B, 0xA0BA,\n\t0xC84C, 0xC1B3, 0xC84D, 0xC1B4, 0xC84E, 0xA0BB, 0xC84F, 0xA0BC,\t0xC850, 0xA0BD, 0xC851, 0xA0BE, 0xC852, 0xA0BF, 0xC853, 0xA0C0,\n\t0xC854, 0xC1B5, 0xC855, 0xA0C1, 0xC856, 0xA0C2, 0xC857, 0xA0C3,\t0xC858, 0xA0C4, 0xC859, 0xA0C5, 0xC85A, 0xA0C6, 0xC85B, 0xA0C7,\n\t0xC85C, 0xA0C8, 0xC85D, 0xA0C9, 0xC85E, 0xA0CA, 0xC85F, 0xA0CB,\t0xC860, 0xA0CC, 0xC861, 0xA0CD, 0xC862, 0xA0CE, 0xC863, 0xA0CF,\n\t0xC864, 0xA0D0, 0xC865, 0xA0D1, 0xC866, 0xA0D2, 0xC867, 0xA0D3,\t0xC868, 0xA0D4, 0xC869, 0xA0D5, 0xC86A, 0xA0D6, 0xC86B, 0xA0D7,\n\t0xC86C, 0xA0D8, 0xC86D, 0xA0D9, 0xC86E, 0xA0DA, 0xC86F, 0xA0DB,\t0xC870, 0xC1B6, 0xC871, 0xC1B7, 0xC872, 0xA0DC, 0xC873, 0xA0DD,\n\t0xC874, 0xC1B8, 0xC875, 0xA0DE, 0xC876, 0xA0DF, 0xC877, 0xA0E0,\t0xC878, 0xC1B9, 0xC879, 0xA0E1, 0xC87A, 0xC1BA, 0xC87B, 0xA0E2,\n\t0xC87C, 0xA0E3, 0xC87D, 0xA0E4, 0xC87E, 0xA0E5, 0xC87F, 0xA0E6,\t0xC880, 0xC1BB, 0xC881, 0xC1BC, 0xC882, 0xA0E7, 0xC883, 0xC1BD,\n\t0xC884, 0xA0E8, 0xC885, 0xC1BE, 0xC886, 0xC1BF, 0xC887, 0xC1C0,\t0xC888, 0xA0E9, 0xC889, 0xA0EA, 0xC88A, 0xA0EB, 0xC88B, 0xC1C1,\n\t0xC88C, 0xC1C2, 0xC88D, 0xC1C3, 0xC88E, 0xA0EC, 0xC88F, 0xA0ED,\t0xC890, 0xA0EE, 0xC891, 0xA0EF, 0xC892, 0xA0F0, 0xC893, 0xA0F1,\n\t0xC894, 0xC1C4, 0xC895, 0xA0F2, 0xC896, 0xA0F3, 0xC897, 0xA0F4,\t0xC898, 0xA0F5, 0xC899, 0xA0F6, 0xC89A, 0xA0F7, 0xC89B, 0xA0F8,\n\t0xC89C, 0xA0F9, 0xC89D, 0xC1C5, 0xC89E, 0xA0FA, 0xC89F, 0xC1C6,\t0xC8A0, 0xA0FB, 0xC8A1, 0xC1C7, 0xC8A2, 0xA0FC, 0xC8A3, 0xA0FD,\n\t0xC8A4, 0xA0FE, 0xC8A5, 0xA141, 0xC8A6, 0xA142, 0xC8A7, 0xA143,\t0xC8A8, 0xC1C8, 0xC8A9, 0xA144, 0xC8AA, 0xA145, 0xC8AB, 0xA146,\n\t0xC8AC, 0xA147, 0xC8AD, 0xA148, 0xC8AE, 0xA149, 0xC8AF, 0xA14A,\t0xC8B0, 0xA14B, 0xC8B1, 0xA14C, 0xC8B2, 0xA14D, 0xC8B3, 0xA14E,\n\t0xC8B4, 0xA14F, 0xC8B5, 0xA150, 0xC8B6, 0xA151, 0xC8B7, 0xA152,\t0xC8B8, 0xA153, 0xC8B9, 0xA154, 0xC8BA, 0xA155, 0xC8BB, 0xA156,\n\t0xC8BC, 0xC1C9, 0xC8BD, 0xC1CA, 0xC8BE, 0xA157, 0xC8BF, 0xA158,\t0xC8C0, 0xA159, 0xC8C1, 0xA15A, 0xC8C2, 0xA161, 0xC8C3, 0xA162,\n\t0xC8C4, 0xC1CB, 0xC8C5, 0xA163, 0xC8C6, 0xA164, 0xC8C7, 0xA165,\t0xC8C8, 0xC1CC, 0xC8C9, 0xA166, 0xC8CA, 0xA167, 0xC8CB, 0xA168,\n\t0xC8CC, 0xC1CD, 0xC8CD, 0xA169, 0xC8CE, 0xA16A, 0xC8CF, 0xA16B,\t0xC8D0, 0xA16C, 0xC8D1, 0xA16D, 0xC8D2, 0xA16E, 0xC8D3, 0xA16F,\n\t0xC8D4, 0xC1CE, 0xC8D5, 0xC1CF, 0xC8D6, 0xA170, 0xC8D7, 0xC1D0,\t0xC8D8, 0xA171, 0xC8D9, 0xC1D1, 0xC8DA, 0xA172, 0xC8DB, 0xA173,\n\t0xC8DC, 0xA174, 0xC8DD, 0xA175, 0xC8DE, 0xA176, 0xC8DF, 0xA177,\t0xC8E0, 0xC1D2, 0xC8E1, 0xC1D3, 0xC8E2, 0xA178, 0xC8E3, 0xA179,\n\t0xC8E4, 0xC1D4, 0xC8E5, 0xA17A, 0xC8E6, 0xA181, 0xC8E7, 0xA182,\t0xC8E8, 0xA183, 0xC8E9, 0xA184, 0xC8EA, 0xA185, 0xC8EB, 0xA186,\n\t0xC8EC, 0xA187, 0xC8ED, 0xA188, 0xC8EE, 0xA189, 0xC8EF, 0xA18A,\t0xC8F0, 0xA18B, 0xC8F1, 0xA18C, 0xC8F2, 0xA18D, 0xC8F3, 0xA18E,\n\t0xC8F4, 0xA18F, 0xC8F5, 0xC1D5, 0xC8F6, 0xA190, 0xC8F7, 0xA191,\t0xC8F8, 0xA192, 0xC8F9, 0xA193, 0xC8FA, 0xA194, 0xC8FB, 0xA195,\n\t0xC8FC, 0xC1D6, 0xC8FD, 0xC1D7, 0xC8FE, 0xA196, 0xC8FF, 0xA197,\t0xC900, 0xC1D8, 0xC901, 0xA198, 0xC902, 0xA199, 0xC903, 0xA19A,\n\t0xC904, 0xC1D9, 0xC905, 0xC1DA, 0xC906, 0xC1DB, 0xC907, 0xA19B,\t0xC908, 0xA19C, 0xC909, 0xA19D, 0xC90A, 0xA19E, 0xC90B, 0xA19F,\n\t0xC90C, 0xC1DC, 0xC90D, 0xC1DD, 0xC90E, 0xA1A0, 0xC90F, 0xC1DE,\t0xC910, 0xA241, 0xC911, 0xC1DF, 0xC912, 0xA242, 0xC913, 0xA243,\n\t0xC914, 0xA244, 0xC915, 0xA245, 0xC916, 0xA246, 0xC917, 0xA247,\t0xC918, 0xC1E0, 0xC919, 0xA248, 0xC91A, 0xA249, 0xC91B, 0xA24A,\n\t0xC91C, 0xA24B, 0xC91D, 0xA24C, 0xC91E, 0xA24D, 0xC91F, 0xA24E,\t0xC920, 0xA24F, 0xC921, 0xA250, 0xC922, 0xA251, 0xC923, 0xA252,\n\t0xC924, 0xA253, 0xC925, 0xA254, 0xC926, 0xA255, 0xC927, 0xA256,\t0xC928, 0xA257, 0xC929, 0xA258, 0xC92A, 0xA259, 0xC92B, 0xA25A,\n\t0xC92C, 0xC1E1, 0xC92D, 0xA261, 0xC92E, 0xA262, 0xC92F, 0xA263,\t0xC930, 0xA264, 0xC931, 0xA265, 0xC932, 0xA266, 0xC933, 0xA267,\n\t0xC934, 0xC1E2, 0xC935, 0xA268, 0xC936, 0xA269, 0xC937, 0xA26A,\t0xC938, 0xA26B, 0xC939, 0xA26C, 0xC93A, 0xA26D, 0xC93B, 0xA26E,\n\t0xC93C, 0xA26F, 0xC93D, 0xA270, 0xC93E, 0xA271, 0xC93F, 0xA272,\t0xC940, 0xA273, 0xC941, 0xA274, 0xC942, 0xA275, 0xC943, 0xA276,\n\t0xC944, 0xA277, 0xC945, 0xA278, 0xC946, 0xA279, 0xC947, 0xA27A,\t0xC948, 0xA281, 0xC949, 0xA282, 0xC94A, 0xA283, 0xC94B, 0xA284,\n\t0xC94C, 0xA285, 0xC94D, 0xA286, 0xC94E, 0xA287, 0xC94F, 0xA288,\t0xC950, 0xC1E3, 0xC951, 0xC1E4, 0xC952, 0xA289, 0xC953, 0xA28A,\n\t0xC954, 0xC1E5, 0xC955, 0xA28B, 0xC956, 0xA28C, 0xC957, 0xA28D,\t0xC958, 0xC1E6, 0xC959, 0xA28E, 0xC95A, 0xA28F, 0xC95B, 0xA290,\n\t0xC95C, 0xA291, 0xC95D, 0xA292, 0xC95E, 0xA293, 0xC95F, 0xA294,\t0xC960, 0xC1E7, 0xC961, 0xC1E8, 0xC962, 0xA295, 0xC963, 0xC1E9,\n\t0xC964, 0xA296, 0xC965, 0xA297, 0xC966, 0xA298, 0xC967, 0xA299,\t0xC968, 0xA29A, 0xC969, 0xA29B, 0xC96A, 0xA29C, 0xC96B, 0xA29D,\n\t0xC96C, 0xC1EA, 0xC96D, 0xA29E, 0xC96E, 0xA29F, 0xC96F, 0xA2A0,\t0xC970, 0xC1EB, 0xC971, 0xA341, 0xC972, 0xA342, 0xC973, 0xA343,\n\t0xC974, 0xC1EC, 0xC975, 0xA344, 0xC976, 0xA345, 0xC977, 0xA346,\t0xC978, 0xA347, 0xC979, 0xA348, 0xC97A, 0xA349, 0xC97B, 0xA34A,\n\t0xC97C, 0xC1ED, 0xC97D, 0xA34B, 0xC97E, 0xA34C, 0xC97F, 0xA34D,\t0xC980, 0xA34E, 0xC981, 0xA34F, 0xC982, 0xA350, 0xC983, 0xA351,\n\t0xC984, 0xA352, 0xC985, 0xA353, 0xC986, 0xA354, 0xC987, 0xA355,\t0xC988, 0xC1EE, 0xC989, 0xC1EF, 0xC98A, 0xA356, 0xC98B, 0xA357,\n\t0xC98C, 0xC1F0, 0xC98D, 0xA358, 0xC98E, 0xA359, 0xC98F, 0xA35A,\t0xC990, 0xC1F1, 0xC991, 0xA361, 0xC992, 0xA362, 0xC993, 0xA363,\n\t0xC994, 0xA364, 0xC995, 0xA365, 0xC996, 0xA366, 0xC997, 0xA367,\t0xC998, 0xC1F2, 0xC999, 0xC1F3, 0xC99A, 0xA368, 0xC99B, 0xC1F4,\n\t0xC99C, 0xA369, 0xC99D, 0xC1F5, 0xC99E, 0xA36A, 0xC99F, 0xA36B,\t0xC9A0, 0xA36C, 0xC9A1, 0xA36D, 0xC9A2, 0xA36E, 0xC9A3, 0xA36F,\n\t0xC9A4, 0xA370, 0xC9A5, 0xA371, 0xC9A6, 0xA372, 0xC9A7, 0xA373,\t0xC9A8, 0xA374, 0xC9A9, 0xA375, 0xC9AA, 0xA376, 0xC9AB, 0xA377,\n\t0xC9AC, 0xA378, 0xC9AD, 0xA379, 0xC9AE, 0xA37A, 0xC9AF, 0xA381,\t0xC9B0, 0xA382, 0xC9B1, 0xA383, 0xC9B2, 0xA384, 0xC9B3, 0xA385,\n\t0xC9B4, 0xA386, 0xC9B5, 0xA387, 0xC9B6, 0xA388, 0xC9B7, 0xA389,\t0xC9B8, 0xA38A, 0xC9B9, 0xA38B, 0xC9BA, 0xA38C, 0xC9BB, 0xA38D,\n\t0xC9BC, 0xA38E, 0xC9BD, 0xA38F, 0xC9BE, 0xA390, 0xC9BF, 0xA391,\t0xC9C0, 0xC1F6, 0xC9C1, 0xC1F7, 0xC9C2, 0xA392, 0xC9C3, 0xA393,\n\t0xC9C4, 0xC1F8, 0xC9C5, 0xA394, 0xC9C6, 0xA395, 0xC9C7, 0xC1F9,\t0xC9C8, 0xC1FA, 0xC9C9, 0xA396, 0xC9CA, 0xC1FB, 0xC9CB, 0xA397,\n\t0xC9CC, 0xA398, 0xC9CD, 0xA399, 0xC9CE, 0xA39A, 0xC9CF, 0xA39B,\t0xC9D0, 0xC1FC, 0xC9D1, 0xC1FD, 0xC9D2, 0xA39C, 0xC9D3, 0xC1FE,\n\t0xC9D4, 0xA39D, 0xC9D5, 0xC2A1, 0xC9D6, 0xC2A2, 0xC9D7, 0xA39E,\t0xC9D8, 0xA39F, 0xC9D9, 0xC2A3, 0xC9DA, 0xC2A4, 0xC9DB, 0xA3A0,\n\t0xC9DC, 0xC2A5, 0xC9DD, 0xC2A6, 0xC9DE, 0xA441, 0xC9DF, 0xA442,\t0xC9E0, 0xC2A7, 0xC9E1, 0xA443, 0xC9E2, 0xC2A8, 0xC9E3, 0xA444,\n\t0xC9E4, 0xC2A9, 0xC9E5, 0xA445, 0xC9E6, 0xA446, 0xC9E7, 0xC2AA,\t0xC9E8, 0xA447, 0xC9E9, 0xA448, 0xC9EA, 0xA449, 0xC9EB, 0xA44A,\n\t0xC9EC, 0xC2AB, 0xC9ED, 0xC2AC, 0xC9EE, 0xA44B, 0xC9EF, 0xC2AD,\t0xC9F0, 0xC2AE, 0xC9F1, 0xC2AF, 0xC9F2, 0xA44C, 0xC9F3, 0xA44D,\n\t0xC9F4, 0xA44E, 0xC9F5, 0xA44F, 0xC9F6, 0xA450, 0xC9F7, 0xA451,\t0xC9F8, 0xC2B0, 0xC9F9, 0xC2B1, 0xC9FA, 0xA452, 0xC9FB, 0xA453,\n\t0xC9FC, 0xC2B2, 0xC9FD, 0xA454, 0xC9FE, 0xA455, 0xC9FF, 0xA456,\t0xCA00, 0xC2B3, 0xCA01, 0xA457, 0xCA02, 0xA458, 0xCA03, 0xA459,\n\t0xCA04, 0xA45A, 0xCA05, 0xA461, 0xCA06, 0xA462, 0xCA07, 0xA463,\t0xCA08, 0xC2B4, 0xCA09, 0xC2B5, 0xCA0A, 0xA464, 0xCA0B, 0xC2B6,\n\t0xCA0C, 0xC2B7, 0xCA0D, 0xC2B8, 0xCA0E, 0xA465, 0xCA0F, 0xA466,\t0xCA10, 0xA467, 0xCA11, 0xA468, 0xCA12, 0xA469, 0xCA13, 0xA46A,\n\t0xCA14, 0xC2B9, 0xCA15, 0xA46B, 0xCA16, 0xA46C, 0xCA17, 0xA46D,\t0xCA18, 0xC2BA, 0xCA19, 0xA46E, 0xCA1A, 0xA46F, 0xCA1B, 0xA470,\n\t0xCA1C, 0xA471, 0xCA1D, 0xA472, 0xCA1E, 0xA473, 0xCA1F, 0xA474,\t0xCA20, 0xA475, 0xCA21, 0xA476, 0xCA22, 0xA477, 0xCA23, 0xA478,\n\t0xCA24, 0xA479, 0xCA25, 0xA47A, 0xCA26, 0xA481, 0xCA27, 0xA482,\t0xCA28, 0xA483, 0xCA29, 0xC2BB, 0xCA2A, 0xA484, 0xCA2B, 0xA485,\n\t0xCA2C, 0xA486, 0xCA2D, 0xA487, 0xCA2E, 0xA488, 0xCA2F, 0xA489,\t0xCA30, 0xA48A, 0xCA31, 0xA48B, 0xCA32, 0xA48C, 0xCA33, 0xA48D,\n\t0xCA34, 0xA48E, 0xCA35, 0xA48F, 0xCA36, 0xA490, 0xCA37, 0xA491,\t0xCA38, 0xA492, 0xCA39, 0xA493, 0xCA3A, 0xA494, 0xCA3B, 0xA495,\n\t0xCA3C, 0xA496, 0xCA3D, 0xA497, 0xCA3E, 0xA498, 0xCA3F, 0xA499,\t0xCA40, 0xA49A, 0xCA41, 0xA49B, 0xCA42, 0xA49C, 0xCA43, 0xA49D,\n\t0xCA44, 0xA49E, 0xCA45, 0xA49F, 0xCA46, 0xA4A0, 0xCA47, 0xA541,\t0xCA48, 0xA542, 0xCA49, 0xA543, 0xCA4A, 0xA544, 0xCA4B, 0xA545,\n\t0xCA4C, 0xC2BC, 0xCA4D, 0xC2BD, 0xCA4E, 0xA546, 0xCA4F, 0xA547,\t0xCA50, 0xC2BE, 0xCA51, 0xA548, 0xCA52, 0xA549, 0xCA53, 0xA54A,\n\t0xCA54, 0xC2BF, 0xCA55, 0xA54B, 0xCA56, 0xA54C, 0xCA57, 0xA54D,\t0xCA58, 0xA54E, 0xCA59, 0xA54F, 0xCA5A, 0xA550, 0xCA5B, 0xA551,\n\t0xCA5C, 0xC2C0, 0xCA5D, 0xC2C1, 0xCA5E, 0xA552, 0xCA5F, 0xC2C2,\t0xCA60, 0xC2C3, 0xCA61, 0xC2C4, 0xCA62, 0xA553, 0xCA63, 0xA554,\n\t0xCA64, 0xA555, 0xCA65, 0xA556, 0xCA66, 0xA557, 0xCA67, 0xA558,\t0xCA68, 0xC2C5, 0xCA69, 0xA559, 0xCA6A, 0xA55A, 0xCA6B, 0xA561,\n\t0xCA6C, 0xA562, 0xCA6D, 0xA563, 0xCA6E, 0xA564, 0xCA6F, 0xA565,\t0xCA70, 0xA566, 0xCA71, 0xA567, 0xCA72, 0xA568, 0xCA73, 0xA569,\n\t0xCA74, 0xA56A, 0xCA75, 0xA56B, 0xCA76, 0xA56C, 0xCA77, 0xA56D,\t0xCA78, 0xA56E, 0xCA79, 0xA56F, 0xCA7A, 0xA570, 0xCA7B, 0xA571,\n\t0xCA7C, 0xA572, 0xCA7D, 0xC2C6, 0xCA7E, 0xA573, 0xCA7F, 0xA574,\t0xCA80, 0xA575, 0xCA81, 0xA576, 0xCA82, 0xA577, 0xCA83, 0xA578,\n\t0xCA84, 0xC2C7, 0xCA85, 0xA579, 0xCA86, 0xA57A, 0xCA87, 0xA581,\t0xCA88, 0xA582, 0xCA89, 0xA583, 0xCA8A, 0xA584, 0xCA8B, 0xA585,\n\t0xCA8C, 0xA586, 0xCA8D, 0xA587, 0xCA8E, 0xA588, 0xCA8F, 0xA589,\t0xCA90, 0xA58A, 0xCA91, 0xA58B, 0xCA92, 0xA58C, 0xCA93, 0xA58D,\n\t0xCA94, 0xA58E, 0xCA95, 0xA58F, 0xCA96, 0xA590, 0xCA97, 0xA591,\t0xCA98, 0xC2C8, 0xCA99, 0xA592, 0xCA9A, 0xA593, 0xCA9B, 0xA594,\n\t0xCA9C, 0xA595, 0xCA9D, 0xA596, 0xCA9E, 0xA597, 0xCA9F, 0xA598,\t0xCAA0, 0xA599, 0xCAA1, 0xA59A, 0xCAA2, 0xA59B, 0xCAA3, 0xA59C,\n\t0xCAA4, 0xA59D, 0xCAA5, 0xA59E, 0xCAA6, 0xA59F, 0xCAA7, 0xA5A0,\t0xCAA8, 0xA641, 0xCAA9, 0xA642, 0xCAAA, 0xA643, 0xCAAB, 0xA644,\n\t0xCAAC, 0xA645, 0xCAAD, 0xA646, 0xCAAE, 0xA647, 0xCAAF, 0xA648,\t0xCAB0, 0xA649, 0xCAB1, 0xA64A, 0xCAB2, 0xA64B, 0xCAB3, 0xA64C,\n\t0xCAB4, 0xA64D, 0xCAB5, 0xA64E, 0xCAB6, 0xA64F, 0xCAB7, 0xA650,\t0xCAB8, 0xA651, 0xCAB9, 0xA652, 0xCABA, 0xA653, 0xCABB, 0xA654,\n\t0xCABC, 0xC2C9, 0xCABD, 0xC2CA, 0xCABE, 0xA655, 0xCABF, 0xA656,\t0xCAC0, 0xC2CB, 0xCAC1, 0xA657, 0xCAC2, 0xA658, 0xCAC3, 0xA659,\n\t0xCAC4, 0xC2CC, 0xCAC5, 0xA65A, 0xCAC6, 0xA661, 0xCAC7, 0xA662,\t0xCAC8, 0xA663, 0xCAC9, 0xA664, 0xCACA, 0xA665, 0xCACB, 0xA666,\n\t0xCACC, 0xC2CD, 0xCACD, 0xC2CE, 0xCACE, 0xA667, 0xCACF, 0xC2CF,\t0xCAD0, 0xA668, 0xCAD1, 0xC2D0, 0xCAD2, 0xA669, 0xCAD3, 0xC2D1,\n\t0xCAD4, 0xA66A, 0xCAD5, 0xA66B, 0xCAD6, 0xA66C, 0xCAD7, 0xA66D,\t0xCAD8, 0xC2D2, 0xCAD9, 0xC2D3, 0xCADA, 0xA66E, 0xCADB, 0xA66F,\n\t0xCADC, 0xA670, 0xCADD, 0xA671, 0xCADE, 0xA672, 0xCADF, 0xA673,\t0xCAE0, 0xC2D4, 0xCAE1, 0xA674, 0xCAE2, 0xA675, 0xCAE3, 0xA676,\n\t0xCAE4, 0xA677, 0xCAE5, 0xA678, 0xCAE6, 0xA679, 0xCAE7, 0xA67A,\t0xCAE8, 0xA681, 0xCAE9, 0xA682, 0xCAEA, 0xA683, 0xCAEB, 0xA684,\n\t0xCAEC, 0xC2D5, 0xCAED, 0xA685, 0xCAEE, 0xA686, 0xCAEF, 0xA687,\t0xCAF0, 0xA688, 0xCAF1, 0xA689, 0xCAF2, 0xA68A, 0xCAF3, 0xA68B,\n\t0xCAF4, 0xC2D6, 0xCAF5, 0xA68C, 0xCAF6, 0xA68D, 0xCAF7, 0xA68E,\t0xCAF8, 0xA68F, 0xCAF9, 0xA690, 0xCAFA, 0xA691, 0xCAFB, 0xA692,\n\t0xCAFC, 0xA693, 0xCAFD, 0xA694, 0xCAFE, 0xA695, 0xCAFF, 0xA696,\t0xCB00, 0xA697, 0xCB01, 0xA698, 0xCB02, 0xA699, 0xCB03, 0xA69A,\n\t0xCB04, 0xA69B, 0xCB05, 0xA69C, 0xCB06, 0xA69D, 0xCB07, 0xA69E,\t0xCB08, 0xC2D7, 0xCB09, 0xA69F, 0xCB0A, 0xA6A0, 0xCB0B, 0xA741,\n\t0xCB0C, 0xA742, 0xCB0D, 0xA743, 0xCB0E, 0xA744, 0xCB0F, 0xA745,\t0xCB10, 0xC2D8, 0xCB11, 0xA746, 0xCB12, 0xA747, 0xCB13, 0xA748,\n\t0xCB14, 0xC2D9, 0xCB15, 0xA749, 0xCB16, 0xA74A, 0xCB17, 0xA74B,\t0xCB18, 0xC2DA, 0xCB19, 0xA74C, 0xCB1A, 0xA74D, 0xCB1B, 0xA74E,\n\t0xCB1C, 0xA74F, 0xCB1D, 0xA750, 0xCB1E, 0xA751, 0xCB1F, 0xA752,\t0xCB20, 0xC2DB, 0xCB21, 0xC2DC, 0xCB22, 0xA753, 0xCB23, 0xA754,\n\t0xCB24, 0xA755, 0xCB25, 0xA756, 0xCB26, 0xA757, 0xCB27, 0xA758,\t0xCB28, 0xA759, 0xCB29, 0xA75A, 0xCB2A, 0xA761, 0xCB2B, 0xA762,\n\t0xCB2C, 0xA763, 0xCB2D, 0xA764, 0xCB2E, 0xA765, 0xCB2F, 0xA766,\t0xCB30, 0xA767, 0xCB31, 0xA768, 0xCB32, 0xA769, 0xCB33, 0xA76A,\n\t0xCB34, 0xA76B, 0xCB35, 0xA76C, 0xCB36, 0xA76D, 0xCB37, 0xA76E,\t0xCB38, 0xA76F, 0xCB39, 0xA770, 0xCB3A, 0xA771, 0xCB3B, 0xA772,\n\t0xCB3C, 0xA773, 0xCB3D, 0xA774, 0xCB3E, 0xA775, 0xCB3F, 0xA776,\t0xCB40, 0xA777, 0xCB41, 0xC2DD, 0xCB42, 0xA778, 0xCB43, 0xA779,\n\t0xCB44, 0xA77A, 0xCB45, 0xA781, 0xCB46, 0xA782, 0xCB47, 0xA783,\t0xCB48, 0xC2DE, 0xCB49, 0xC2DF, 0xCB4A, 0xA784, 0xCB4B, 0xA785,\n\t0xCB4C, 0xC2E0, 0xCB4D, 0xA786, 0xCB4E, 0xA787, 0xCB4F, 0xA788,\t0xCB50, 0xC2E1, 0xCB51, 0xA789, 0xCB52, 0xA78A, 0xCB53, 0xA78B,\n\t0xCB54, 0xA78C, 0xCB55, 0xA78D, 0xCB56, 0xA78E, 0xCB57, 0xA78F,\t0xCB58, 0xC2E2, 0xCB59, 0xC2E3, 0xCB5A, 0xA790, 0xCB5B, 0xA791,\n\t0xCB5C, 0xA792, 0xCB5D, 0xC2E4, 0xCB5E, 0xA793, 0xCB5F, 0xA794,\t0xCB60, 0xA795, 0xCB61, 0xA796, 0xCB62, 0xA797, 0xCB63, 0xA798,\n\t0xCB64, 0xC2E5, 0xCB65, 0xA799, 0xCB66, 0xA79A, 0xCB67, 0xA79B,\t0xCB68, 0xA79C, 0xCB69, 0xA79D, 0xCB6A, 0xA79E, 0xCB6B, 0xA79F,\n\t0xCB6C, 0xA7A0, 0xCB6D, 0xA841, 0xCB6E, 0xA842, 0xCB6F, 0xA843,\t0xCB70, 0xA844, 0xCB71, 0xA845, 0xCB72, 0xA846, 0xCB73, 0xA847,\n\t0xCB74, 0xA848, 0xCB75, 0xA849, 0xCB76, 0xA84A, 0xCB77, 0xA84B,\t0xCB78, 0xC2E6, 0xCB79, 0xC2E7, 0xCB7A, 0xA84C, 0xCB7B, 0xA84D,\n\t0xCB7C, 0xA84E, 0xCB7D, 0xA84F, 0xCB7E, 0xA850, 0xCB7F, 0xA851,\t0xCB80, 0xA852, 0xCB81, 0xA853, 0xCB82, 0xA854, 0xCB83, 0xA855,\n\t0xCB84, 0xA856, 0xCB85, 0xA857, 0xCB86, 0xA858, 0xCB87, 0xA859,\t0xCB88, 0xA85A, 0xCB89, 0xA861, 0xCB8A, 0xA862, 0xCB8B, 0xA863,\n\t0xCB8C, 0xA864, 0xCB8D, 0xA865, 0xCB8E, 0xA866, 0xCB8F, 0xA867,\t0xCB90, 0xA868, 0xCB91, 0xA869, 0xCB92, 0xA86A, 0xCB93, 0xA86B,\n\t0xCB94, 0xA86C, 0xCB95, 0xA86D, 0xCB96, 0xA86E, 0xCB97, 0xA86F,\t0xCB98, 0xA870, 0xCB99, 0xA871, 0xCB9A, 0xA872, 0xCB9B, 0xA873,\n\t0xCB9C, 0xC2E8, 0xCB9D, 0xA874, 0xCB9E, 0xA875, 0xCB9F, 0xA876,\t0xCBA0, 0xA877, 0xCBA1, 0xA878, 0xCBA2, 0xA879, 0xCBA3, 0xA87A,\n\t0xCBA4, 0xA881, 0xCBA5, 0xA882, 0xCBA6, 0xA883, 0xCBA7, 0xA884,\t0xCBA8, 0xA885, 0xCBA9, 0xA886, 0xCBAA, 0xA887, 0xCBAB, 0xA888,\n\t0xCBAC, 0xA889, 0xCBAD, 0xA88A, 0xCBAE, 0xA88B, 0xCBAF, 0xA88C,\t0xCBB0, 0xA88D, 0xCBB1, 0xA88E, 0xCBB2, 0xA88F, 0xCBB3, 0xA890,\n\t0xCBB4, 0xA891, 0xCBB5, 0xA892, 0xCBB6, 0xA893, 0xCBB7, 0xA894,\t0xCBB8, 0xC2E9, 0xCBB9, 0xA895, 0xCBBA, 0xA896, 0xCBBB, 0xA897,\n\t0xCBBC, 0xA898, 0xCBBD, 0xA899, 0xCBBE, 0xA89A, 0xCBBF, 0xA89B,\t0xCBC0, 0xA89C, 0xCBC1, 0xA89D, 0xCBC2, 0xA89E, 0xCBC3, 0xA89F,\n\t0xCBC4, 0xA8A0, 0xCBC5, 0xA941, 0xCBC6, 0xA942, 0xCBC7, 0xA943,\t0xCBC8, 0xA944, 0xCBC9, 0xA945, 0xCBCA, 0xA946, 0xCBCB, 0xA947,\n\t0xCBCC, 0xA948, 0xCBCD, 0xA949, 0xCBCE, 0xA94A, 0xCBCF, 0xA94B,\t0xCBD0, 0xA94C, 0xCBD1, 0xA94D, 0xCBD2, 0xA94E, 0xCBD3, 0xA94F,\n\t0xCBD4, 0xC2EA, 0xCBD5, 0xA950, 0xCBD6, 0xA951, 0xCBD7, 0xA952,\t0xCBD8, 0xA953, 0xCBD9, 0xA954, 0xCBDA, 0xA955, 0xCBDB, 0xA956,\n\t0xCBDC, 0xA957, 0xCBDD, 0xA958, 0xCBDE, 0xA959, 0xCBDF, 0xA95A,\t0xCBE0, 0xA961, 0xCBE1, 0xA962, 0xCBE2, 0xA963, 0xCBE3, 0xA964,\n\t0xCBE4, 0xC2EB, 0xCBE5, 0xA965, 0xCBE6, 0xA966, 0xCBE7, 0xC2EC,\t0xCBE8, 0xA967, 0xCBE9, 0xC2ED, 0xCBEA, 0xA968, 0xCBEB, 0xA969,\n\t0xCBEC, 0xA96A, 0xCBED, 0xA96B, 0xCBEE, 0xA96C, 0xCBEF, 0xA96D,\t0xCBF0, 0xA96E, 0xCBF1, 0xA96F, 0xCBF2, 0xA970, 0xCBF3, 0xA971,\n\t0xCBF4, 0xA972, 0xCBF5, 0xA973, 0xCBF6, 0xA974, 0xCBF7, 0xA975,\t0xCBF8, 0xA976, 0xCBF9, 0xA977, 0xCBFA, 0xA978, 0xCBFB, 0xA979,\n\t0xCBFC, 0xA97A, 0xCBFD, 0xA981, 0xCBFE, 0xA982, 0xCBFF, 0xA983,\t0xCC00, 0xA984, 0xCC01, 0xA985, 0xCC02, 0xA986, 0xCC03, 0xA987,\n\t0xCC04, 0xA988, 0xCC05, 0xA989, 0xCC06, 0xA98A, 0xCC07, 0xA98B,\t0xCC08, 0xA98C, 0xCC09, 0xA98D, 0xCC0A, 0xA98E, 0xCC0B, 0xA98F,\n\t0xCC0C, 0xC2EE, 0xCC0D, 0xC2EF, 0xCC0E, 0xA990, 0xCC0F, 0xA991,\t0xCC10, 0xC2F0, 0xCC11, 0xA992, 0xCC12, 0xA993, 0xCC13, 0xA994,\n\t0xCC14, 0xC2F1, 0xCC15, 0xA995, 0xCC16, 0xA996, 0xCC17, 0xA997,\t0xCC18, 0xA998, 0xCC19, 0xA999, 0xCC1A, 0xA99A, 0xCC1B, 0xA99B,\n\t0xCC1C, 0xC2F2, 0xCC1D, 0xC2F3, 0xCC1E, 0xA99C, 0xCC1F, 0xA99D,\t0xCC20, 0xA99E, 0xCC21, 0xC2F4, 0xCC22, 0xC2F5, 0xCC23, 0xA99F,\n\t0xCC24, 0xA9A0, 0xCC25, 0xAA41, 0xCC26, 0xAA42, 0xCC27, 0xC2F6,\t0xCC28, 0xC2F7, 0xCC29, 0xC2F8, 0xCC2A, 0xAA43, 0xCC2B, 0xAA44,\n\t0xCC2C, 0xC2F9, 0xCC2D, 0xAA45, 0xCC2E, 0xC2FA, 0xCC2F, 0xAA46,\t0xCC30, 0xC2FB, 0xCC31, 0xAA47, 0xCC32, 0xAA48, 0xCC33, 0xAA49,\n\t0xCC34, 0xAA4A, 0xCC35, 0xAA4B, 0xCC36, 0xAA4C, 0xCC37, 0xAA4D,\t0xCC38, 0xC2FC, 0xCC39, 0xC2FD, 0xCC3A, 0xAA4E, 0xCC3B, 0xC2FE,\n\t0xCC3C, 0xC3A1, 0xCC3D, 0xC3A2, 0xCC3E, 0xC3A3, 0xCC3F, 0xAA4F,\t0xCC40, 0xAA50, 0xCC41, 0xAA51, 0xCC42, 0xAA52, 0xCC43, 0xAA53,\n\t0xCC44, 0xC3A4, 0xCC45, 0xC3A5, 0xCC46, 0xAA54, 0xCC47, 0xAA55,\t0xCC48, 0xC3A6, 0xCC49, 0xAA56, 0xCC4A, 0xAA57, 0xCC4B, 0xAA58,\n\t0xCC4C, 0xC3A7, 0xCC4D, 0xAA59, 0xCC4E, 0xAA5A, 0xCC4F, 0xAA61,\t0xCC50, 0xAA62, 0xCC51, 0xAA63, 0xCC52, 0xAA64, 0xCC53, 0xAA65,\n\t0xCC54, 0xC3A8, 0xCC55, 0xC3A9, 0xCC56, 0xAA66, 0xCC57, 0xC3AA,\t0xCC58, 0xC3AB, 0xCC59, 0xC3AC, 0xCC5A, 0xAA67, 0xCC5B, 0xAA68,\n\t0xCC5C, 0xAA69, 0xCC5D, 0xAA6A, 0xCC5E, 0xAA6B, 0xCC5F, 0xAA6C,\t0xCC60, 0xC3AD, 0xCC61, 0xAA6D, 0xCC62, 0xAA6E, 0xCC63, 0xAA6F,\n\t0xCC64, 0xC3AE, 0xCC65, 0xAA70, 0xCC66, 0xC3AF, 0xCC67, 0xAA71,\t0xCC68, 0xC3B0, 0xCC69, 0xAA72, 0xCC6A, 0xAA73, 0xCC6B, 0xAA74,\n\t0xCC6C, 0xAA75, 0xCC6D, 0xAA76, 0xCC6E, 0xAA77, 0xCC6F, 0xAA78,\t0xCC70, 0xC3B1, 0xCC71, 0xAA79, 0xCC72, 0xAA7A, 0xCC73, 0xAA81,\n\t0xCC74, 0xAA82, 0xCC75, 0xC3B2, 0xCC76, 0xAA83, 0xCC77, 0xAA84,\t0xCC78, 0xAA85, 0xCC79, 0xAA86, 0xCC7A, 0xAA87, 0xCC7B, 0xAA88,\n\t0xCC7C, 0xAA89, 0xCC7D, 0xAA8A, 0xCC7E, 0xAA8B, 0xCC7F, 0xAA8C,\t0xCC80, 0xAA8D, 0xCC81, 0xAA8E, 0xCC82, 0xAA8F, 0xCC83, 0xAA90,\n\t0xCC84, 0xAA91, 0xCC85, 0xAA92, 0xCC86, 0xAA93, 0xCC87, 0xAA94,\t0xCC88, 0xAA95, 0xCC89, 0xAA96, 0xCC8A, 0xAA97, 0xCC8B, 0xAA98,\n\t0xCC8C, 0xAA99, 0xCC8D, 0xAA9A, 0xCC8E, 0xAA9B, 0xCC8F, 0xAA9C,\t0xCC90, 0xAA9D, 0xCC91, 0xAA9E, 0xCC92, 0xAA9F, 0xCC93, 0xAAA0,\n\t0xCC94, 0xAB41, 0xCC95, 0xAB42, 0xCC96, 0xAB43, 0xCC97, 0xAB44,\t0xCC98, 0xC3B3, 0xCC99, 0xC3B4, 0xCC9A, 0xAB45, 0xCC9B, 0xAB46,\n\t0xCC9C, 0xC3B5, 0xCC9D, 0xAB47, 0xCC9E, 0xAB48, 0xCC9F, 0xAB49,\t0xCCA0, 0xC3B6, 0xCCA1, 0xAB4A, 0xCCA2, 0xAB4B, 0xCCA3, 0xAB4C,\n\t0xCCA4, 0xAB4D, 0xCCA5, 0xAB4E, 0xCCA6, 0xAB4F, 0xCCA7, 0xAB50,\t0xCCA8, 0xC3B7, 0xCCA9, 0xC3B8, 0xCCAA, 0xAB51, 0xCCAB, 0xC3B9,\n\t0xCCAC, 0xC3BA, 0xCCAD, 0xC3BB, 0xCCAE, 0xAB52, 0xCCAF, 0xAB53,\t0xCCB0, 0xAB54, 0xCCB1, 0xAB55, 0xCCB2, 0xAB56, 0xCCB3, 0xAB57,\n\t0xCCB4, 0xC3BC, 0xCCB5, 0xC3BD, 0xCCB6, 0xAB58, 0xCCB7, 0xAB59,\t0xCCB8, 0xC3BE, 0xCCB9, 0xAB5A, 0xCCBA, 0xAB61, 0xCCBB, 0xAB62,\n\t0xCCBC, 0xC3BF, 0xCCBD, 0xAB63, 0xCCBE, 0xAB64, 0xCCBF, 0xAB65,\t0xCCC0, 0xAB66, 0xCCC1, 0xAB67, 0xCCC2, 0xAB68, 0xCCC3, 0xAB69,\n\t0xCCC4, 0xC3C0, 0xCCC5, 0xC3C1, 0xCCC6, 0xAB6A, 0xCCC7, 0xC3C2,\t0xCCC8, 0xAB6B, 0xCCC9, 0xC3C3, 0xCCCA, 0xAB6C, 0xCCCB, 0xAB6D,\n\t0xCCCC, 0xAB6E, 0xCCCD, 0xAB6F, 0xCCCE, 0xAB70, 0xCCCF, 0xAB71,\t0xCCD0, 0xC3C4, 0xCCD1, 0xAB72, 0xCCD2, 0xAB73, 0xCCD3, 0xAB74,\n\t0xCCD4, 0xC3C5, 0xCCD5, 0xAB75, 0xCCD6, 0xAB76, 0xCCD7, 0xAB77,\t0xCCD8, 0xAB78, 0xCCD9, 0xAB79, 0xCCDA, 0xAB7A, 0xCCDB, 0xAB81,\n\t0xCCDC, 0xAB82, 0xCCDD, 0xAB83, 0xCCDE, 0xAB84, 0xCCDF, 0xAB85,\t0xCCE0, 0xAB86, 0xCCE1, 0xAB87, 0xCCE2, 0xAB88, 0xCCE3, 0xAB89,\n\t0xCCE4, 0xC3C6, 0xCCE5, 0xAB8A, 0xCCE6, 0xAB8B, 0xCCE7, 0xAB8C,\t0xCCE8, 0xAB8D, 0xCCE9, 0xAB8E, 0xCCEA, 0xAB8F, 0xCCEB, 0xAB90,\n\t0xCCEC, 0xC3C7, 0xCCED, 0xAB91, 0xCCEE, 0xAB92, 0xCCEF, 0xAB93,\t0xCCF0, 0xC3C8, 0xCCF1, 0xAB94, 0xCCF2, 0xAB95, 0xCCF3, 0xAB96,\n\t0xCCF4, 0xAB97, 0xCCF5, 0xAB98, 0xCCF6, 0xAB99, 0xCCF7, 0xAB9A,\t0xCCF8, 0xAB9B, 0xCCF9, 0xAB9C, 0xCCFA, 0xAB9D, 0xCCFB, 0xAB9E,\n\t0xCCFC, 0xAB9F, 0xCCFD, 0xABA0, 0xCCFE, 0xAC41, 0xCCFF, 0xAC42,\t0xCD00, 0xAC43, 0xCD01, 0xC3C9, 0xCD02, 0xAC44, 0xCD03, 0xAC45,\n\t0xCD04, 0xAC46, 0xCD05, 0xAC47, 0xCD06, 0xAC48, 0xCD07, 0xAC49,\t0xCD08, 0xC3CA, 0xCD09, 0xC3CB, 0xCD0A, 0xAC4A, 0xCD0B, 0xAC4B,\n\t0xCD0C, 0xC3CC, 0xCD0D, 0xAC4C, 0xCD0E, 0xAC4D, 0xCD0F, 0xAC4E,\t0xCD10, 0xC3CD, 0xCD11, 0xAC4F, 0xCD12, 0xAC50, 0xCD13, 0xAC51,\n\t0xCD14, 0xAC52, 0xCD15, 0xAC53, 0xCD16, 0xAC54, 0xCD17, 0xAC55,\t0xCD18, 0xC3CE, 0xCD19, 0xC3CF, 0xCD1A, 0xAC56, 0xCD1B, 0xC3D0,\n\t0xCD1C, 0xAC57, 0xCD1D, 0xC3D1, 0xCD1E, 0xAC58, 0xCD1F, 0xAC59,\t0xCD20, 0xAC5A, 0xCD21, 0xAC61, 0xCD22, 0xAC62, 0xCD23, 0xAC63,\n\t0xCD24, 0xC3D2, 0xCD25, 0xAC64, 0xCD26, 0xAC65, 0xCD27, 0xAC66,\t0xCD28, 0xC3D3, 0xCD29, 0xAC67, 0xCD2A, 0xAC68, 0xCD2B, 0xAC69,\n\t0xCD2C, 0xC3D4, 0xCD2D, 0xAC6A, 0xCD2E, 0xAC6B, 0xCD2F, 0xAC6C,\t0xCD30, 0xAC6D, 0xCD31, 0xAC6E, 0xCD32, 0xAC6F, 0xCD33, 0xAC70,\n\t0xCD34, 0xAC71, 0xCD35, 0xAC72, 0xCD36, 0xAC73, 0xCD37, 0xAC74,\t0xCD38, 0xAC75, 0xCD39, 0xC3D5, 0xCD3A, 0xAC76, 0xCD3B, 0xAC77,\n\t0xCD3C, 0xAC78, 0xCD3D, 0xAC79, 0xCD3E, 0xAC7A, 0xCD3F, 0xAC81,\t0xCD40, 0xAC82, 0xCD41, 0xAC83, 0xCD42, 0xAC84, 0xCD43, 0xAC85,\n\t0xCD44, 0xAC86, 0xCD45, 0xAC87, 0xCD46, 0xAC88, 0xCD47, 0xAC89,\t0xCD48, 0xAC8A, 0xCD49, 0xAC8B, 0xCD4A, 0xAC8C, 0xCD4B, 0xAC8D,\n\t0xCD4C, 0xAC8E, 0xCD4D, 0xAC8F, 0xCD4E, 0xAC90, 0xCD4F, 0xAC91,\t0xCD50, 0xAC92, 0xCD51, 0xAC93, 0xCD52, 0xAC94, 0xCD53, 0xAC95,\n\t0xCD54, 0xAC96, 0xCD55, 0xAC97, 0xCD56, 0xAC98, 0xCD57, 0xAC99,\t0xCD58, 0xAC9A, 0xCD59, 0xAC9B, 0xCD5A, 0xAC9C, 0xCD5B, 0xAC9D,\n\t0xCD5C, 0xC3D6, 0xCD5D, 0xAC9E, 0xCD5E, 0xAC9F, 0xCD5F, 0xACA0,\t0xCD60, 0xC3D7, 0xCD61, 0xAD41, 0xCD62, 0xAD42, 0xCD63, 0xAD43,\n\t0xCD64, 0xC3D8, 0xCD65, 0xAD44, 0xCD66, 0xAD45, 0xCD67, 0xAD46,\t0xCD68, 0xAD47, 0xCD69, 0xAD48, 0xCD6A, 0xAD49, 0xCD6B, 0xAD4A,\n\t0xCD6C, 0xC3D9, 0xCD6D, 0xC3DA, 0xCD6E, 0xAD4B, 0xCD6F, 0xC3DB,\t0xCD70, 0xAD4C, 0xCD71, 0xC3DC, 0xCD72, 0xAD4D, 0xCD73, 0xAD4E,\n\t0xCD74, 0xAD4F, 0xCD75, 0xAD50, 0xCD76, 0xAD51, 0xCD77, 0xAD52,\t0xCD78, 0xC3DD, 0xCD79, 0xAD53, 0xCD7A, 0xAD54, 0xCD7B, 0xAD55,\n\t0xCD7C, 0xAD56, 0xCD7D, 0xAD57, 0xCD7E, 0xAD58, 0xCD7F, 0xAD59,\t0xCD80, 0xAD5A, 0xCD81, 0xAD61, 0xCD82, 0xAD62, 0xCD83, 0xAD63,\n\t0xCD84, 0xAD64, 0xCD85, 0xAD65, 0xCD86, 0xAD66, 0xCD87, 0xAD67,\t0xCD88, 0xC3DE, 0xCD89, 0xAD68, 0xCD8A, 0xAD69, 0xCD8B, 0xAD6A,\n\t0xCD8C, 0xAD6B, 0xCD8D, 0xAD6C, 0xCD8E, 0xAD6D, 0xCD8F, 0xAD6E,\t0xCD90, 0xAD6F, 0xCD91, 0xAD70, 0xCD92, 0xAD71, 0xCD93, 0xAD72,\n\t0xCD94, 0xC3DF, 0xCD95, 0xC3E0, 0xCD96, 0xAD73, 0xCD97, 0xAD74,\t0xCD98, 0xC3E1, 0xCD99, 0xAD75, 0xCD9A, 0xAD76, 0xCD9B, 0xAD77,\n\t0xCD9C, 0xC3E2, 0xCD9D, 0xAD78, 0xCD9E, 0xAD79, 0xCD9F, 0xAD7A,\t0xCDA0, 0xAD81, 0xCDA1, 0xAD82, 0xCDA2, 0xAD83, 0xCDA3, 0xAD84,\n\t0xCDA4, 0xC3E3, 0xCDA5, 0xC3E4, 0xCDA6, 0xAD85, 0xCDA7, 0xC3E5,\t0xCDA8, 0xAD86, 0xCDA9, 0xC3E6, 0xCDAA, 0xAD87, 0xCDAB, 0xAD88,\n\t0xCDAC, 0xAD89, 0xCDAD, 0xAD8A, 0xCDAE, 0xAD8B, 0xCDAF, 0xAD8C,\t0xCDB0, 0xC3E7, 0xCDB1, 0xAD8D, 0xCDB2, 0xAD8E, 0xCDB3, 0xAD8F,\n\t0xCDB4, 0xAD90, 0xCDB5, 0xAD91, 0xCDB6, 0xAD92, 0xCDB7, 0xAD93,\t0xCDB8, 0xAD94, 0xCDB9, 0xAD95, 0xCDBA, 0xAD96, 0xCDBB, 0xAD97,\n\t0xCDBC, 0xAD98, 0xCDBD, 0xAD99, 0xCDBE, 0xAD9A, 0xCDBF, 0xAD9B,\t0xCDC0, 0xAD9C, 0xCDC1, 0xAD9D, 0xCDC2, 0xAD9E, 0xCDC3, 0xAD9F,\n\t0xCDC4, 0xC3E8, 0xCDC5, 0xADA0, 0xCDC6, 0xAE41, 0xCDC7, 0xAE42,\t0xCDC8, 0xAE43, 0xCDC9, 0xAE44, 0xCDCA, 0xAE45, 0xCDCB, 0xAE46,\n\t0xCDCC, 0xC3E9, 0xCDCD, 0xAE47, 0xCDCE, 0xAE48, 0xCDCF, 0xAE49,\t0xCDD0, 0xC3EA, 0xCDD1, 0xAE4A, 0xCDD2, 0xAE4B, 0xCDD3, 0xAE4C,\n\t0xCDD4, 0xAE4D, 0xCDD5, 0xAE4E, 0xCDD6, 0xAE4F, 0xCDD7, 0xAE50,\t0xCDD8, 0xAE51, 0xCDD9, 0xAE52, 0xCDDA, 0xAE53, 0xCDDB, 0xAE54,\n\t0xCDDC, 0xAE55, 0xCDDD, 0xAE56, 0xCDDE, 0xAE57, 0xCDDF, 0xAE58,\t0xCDE0, 0xAE59, 0xCDE1, 0xAE5A, 0xCDE2, 0xAE61, 0xCDE3, 0xAE62,\n\t0xCDE4, 0xAE63, 0xCDE5, 0xAE64, 0xCDE6, 0xAE65, 0xCDE7, 0xAE66,\t0xCDE8, 0xC3EB, 0xCDE9, 0xAE67, 0xCDEA, 0xAE68, 0xCDEB, 0xAE69,\n\t0xCDEC, 0xC3EC, 0xCDED, 0xAE6A, 0xCDEE, 0xAE6B, 0xCDEF, 0xAE6C,\t0xCDF0, 0xC3ED, 0xCDF1, 0xAE6D, 0xCDF2, 0xAE6E, 0xCDF3, 0xAE6F,\n\t0xCDF4, 0xAE70, 0xCDF5, 0xAE71, 0xCDF6, 0xAE72, 0xCDF7, 0xAE73,\t0xCDF8, 0xC3EE, 0xCDF9, 0xC3EF, 0xCDFA, 0xAE74, 0xCDFB, 0xC3F0,\n\t0xCDFC, 0xAE75, 0xCDFD, 0xC3F1, 0xCDFE, 0xAE76, 0xCDFF, 0xAE77,\t0xCE00, 0xAE78, 0xCE01, 0xAE79, 0xCE02, 0xAE7A, 0xCE03, 0xAE81,\n\t0xCE04, 0xC3F2, 0xCE05, 0xAE82, 0xCE06, 0xAE83, 0xCE07, 0xAE84,\t0xCE08, 0xC3F3, 0xCE09, 0xAE85, 0xCE0A, 0xAE86, 0xCE0B, 0xAE87,\n\t0xCE0C, 0xC3F4, 0xCE0D, 0xAE88, 0xCE0E, 0xAE89, 0xCE0F, 0xAE8A,\t0xCE10, 0xAE8B, 0xCE11, 0xAE8C, 0xCE12, 0xAE8D, 0xCE13, 0xAE8E,\n\t0xCE14, 0xC3F5, 0xCE15, 0xAE8F, 0xCE16, 0xAE90, 0xCE17, 0xAE91,\t0xCE18, 0xAE92, 0xCE19, 0xC3F6, 0xCE1A, 0xAE93, 0xCE1B, 0xAE94,\n\t0xCE1C, 0xAE95, 0xCE1D, 0xAE96, 0xCE1E, 0xAE97, 0xCE1F, 0xAE98,\t0xCE20, 0xC3F7, 0xCE21, 0xC3F8, 0xCE22, 0xAE99, 0xCE23, 0xAE9A,\n\t0xCE24, 0xC3F9, 0xCE25, 0xAE9B, 0xCE26, 0xAE9C, 0xCE27, 0xAE9D,\t0xCE28, 0xC3FA, 0xCE29, 0xAE9E, 0xCE2A, 0xAE9F, 0xCE2B, 0xAEA0,\n\t0xCE2C, 0xAF41, 0xCE2D, 0xAF42, 0xCE2E, 0xAF43, 0xCE2F, 0xAF44,\t0xCE30, 0xC3FB, 0xCE31, 0xC3FC, 0xCE32, 0xAF45, 0xCE33, 0xC3FD,\n\t0xCE34, 0xAF46, 0xCE35, 0xC3FE, 0xCE36, 0xAF47, 0xCE37, 0xAF48,\t0xCE38, 0xAF49, 0xCE39, 0xAF4A, 0xCE3A, 0xAF4B, 0xCE3B, 0xAF4C,\n\t0xCE3C, 0xAF4D, 0xCE3D, 0xAF4E, 0xCE3E, 0xAF4F, 0xCE3F, 0xAF50,\t0xCE40, 0xAF51, 0xCE41, 0xAF52, 0xCE42, 0xAF53, 0xCE43, 0xAF54,\n\t0xCE44, 0xAF55, 0xCE45, 0xAF56, 0xCE46, 0xAF57, 0xCE47, 0xAF58,\t0xCE48, 0xAF59, 0xCE49, 0xAF5A, 0xCE4A, 0xAF61, 0xCE4B, 0xAF62,\n\t0xCE4C, 0xAF63, 0xCE4D, 0xAF64, 0xCE4E, 0xAF65, 0xCE4F, 0xAF66,\t0xCE50, 0xAF67, 0xCE51, 0xAF68, 0xCE52, 0xAF69, 0xCE53, 0xAF6A,\n\t0xCE54, 0xAF6B, 0xCE55, 0xAF6C, 0xCE56, 0xAF6D, 0xCE57, 0xAF6E,\t0xCE58, 0xC4A1, 0xCE59, 0xC4A2, 0xCE5A, 0xAF6F, 0xCE5B, 0xAF70,\n\t0xCE5C, 0xC4A3, 0xCE5D, 0xAF71, 0xCE5E, 0xAF72, 0xCE5F, 0xC4A4,\t0xCE60, 0xC4A5, 0xCE61, 0xC4A6, 0xCE62, 0xAF73, 0xCE63, 0xAF74,\n\t0xCE64, 0xAF75, 0xCE65, 0xAF76, 0xCE66, 0xAF77, 0xCE67, 0xAF78,\t0xCE68, 0xC4A7, 0xCE69, 0xC4A8, 0xCE6A, 0xAF79, 0xCE6B, 0xC4A9,\n\t0xCE6C, 0xAF7A, 0xCE6D, 0xC4AA, 0xCE6E, 0xAF81, 0xCE6F, 0xAF82,\t0xCE70, 0xAF83, 0xCE71, 0xAF84, 0xCE72, 0xAF85, 0xCE73, 0xAF86,\n\t0xCE74, 0xC4AB, 0xCE75, 0xC4AC, 0xCE76, 0xAF87, 0xCE77, 0xAF88,\t0xCE78, 0xC4AD, 0xCE79, 0xAF89, 0xCE7A, 0xAF8A, 0xCE7B, 0xAF8B,\n\t0xCE7C, 0xC4AE, 0xCE7D, 0xAF8C, 0xCE7E, 0xAF8D, 0xCE7F, 0xAF8E,\t0xCE80, 0xAF8F, 0xCE81, 0xAF90, 0xCE82, 0xAF91, 0xCE83, 0xAF92,\n\t0xCE84, 0xC4AF, 0xCE85, 0xC4B0, 0xCE86, 0xAF93, 0xCE87, 0xC4B1,\t0xCE88, 0xAF94, 0xCE89, 0xC4B2, 0xCE8A, 0xAF95, 0xCE8B, 0xAF96,\n\t0xCE8C, 0xAF97, 0xCE8D, 0xAF98, 0xCE8E, 0xAF99, 0xCE8F, 0xAF9A,\t0xCE90, 0xC4B3, 0xCE91, 0xC4B4, 0xCE92, 0xAF9B, 0xCE93, 0xAF9C,\n\t0xCE94, 0xC4B5, 0xCE95, 0xAF9D, 0xCE96, 0xAF9E, 0xCE97, 0xAF9F,\t0xCE98, 0xC4B6, 0xCE99, 0xAFA0, 0xCE9A, 0xB041, 0xCE9B, 0xB042,\n\t0xCE9C, 0xB043, 0xCE9D, 0xB044, 0xCE9E, 0xB045, 0xCE9F, 0xB046,\t0xCEA0, 0xC4B7, 0xCEA1, 0xC4B8, 0xCEA2, 0xB047, 0xCEA3, 0xC4B9,\n\t0xCEA4, 0xC4BA, 0xCEA5, 0xC4BB, 0xCEA6, 0xB048, 0xCEA7, 0xB049,\t0xCEA8, 0xB04A, 0xCEA9, 0xB04B, 0xCEAA, 0xB04C, 0xCEAB, 0xB04D,\n\t0xCEAC, 0xC4BC, 0xCEAD, 0xC4BD, 0xCEAE, 0xB04E, 0xCEAF, 0xB04F,\t0xCEB0, 0xB050, 0xCEB1, 0xB051, 0xCEB2, 0xB052, 0xCEB3, 0xB053,\n\t0xCEB4, 0xB054, 0xCEB5, 0xB055, 0xCEB6, 0xB056, 0xCEB7, 0xB057,\t0xCEB8, 0xB058, 0xCEB9, 0xB059, 0xCEBA, 0xB05A, 0xCEBB, 0xB061,\n\t0xCEBC, 0xB062, 0xCEBD, 0xB063, 0xCEBE, 0xB064, 0xCEBF, 0xB065,\t0xCEC0, 0xB066, 0xCEC1, 0xC4BE, 0xCEC2, 0xB067, 0xCEC3, 0xB068,\n\t0xCEC4, 0xB069, 0xCEC5, 0xB06A, 0xCEC6, 0xB06B, 0xCEC7, 0xB06C,\t0xCEC8, 0xB06D, 0xCEC9, 0xB06E, 0xCECA, 0xB06F, 0xCECB, 0xB070,\n\t0xCECC, 0xB071, 0xCECD, 0xB072, 0xCECE, 0xB073, 0xCECF, 0xB074,\t0xCED0, 0xB075, 0xCED1, 0xB076, 0xCED2, 0xB077, 0xCED3, 0xB078,\n\t0xCED4, 0xB079, 0xCED5, 0xB07A, 0xCED6, 0xB081, 0xCED7, 0xB082,\t0xCED8, 0xB083, 0xCED9, 0xB084, 0xCEDA, 0xB085, 0xCEDB, 0xB086,\n\t0xCEDC, 0xB087, 0xCEDD, 0xB088, 0xCEDE, 0xB089, 0xCEDF, 0xB08A,\t0xCEE0, 0xB08B, 0xCEE1, 0xB08C, 0xCEE2, 0xB08D, 0xCEE3, 0xB08E,\n\t0xCEE4, 0xC4BF, 0xCEE5, 0xC4C0, 0xCEE6, 0xB08F, 0xCEE7, 0xB090,\t0xCEE8, 0xC4C1, 0xCEE9, 0xB091, 0xCEEA, 0xB092, 0xCEEB, 0xC4C2,\n\t0xCEEC, 0xC4C3, 0xCEED, 0xB093, 0xCEEE, 0xB094, 0xCEEF, 0xB095,\t0xCEF0, 0xB096, 0xCEF1, 0xB097, 0xCEF2, 0xB098, 0xCEF3, 0xB099,\n\t0xCEF4, 0xC4C4, 0xCEF5, 0xC4C5, 0xCEF6, 0xB09A, 0xCEF7, 0xC4C6,\t0xCEF8, 0xC4C7, 0xCEF9, 0xC4C8, 0xCEFA, 0xB09B, 0xCEFB, 0xB09C,\n\t0xCEFC, 0xB09D, 0xCEFD, 0xB09E, 0xCEFE, 0xB09F, 0xCEFF, 0xB0A0,\t0xCF00, 0xC4C9, 0xCF01, 0xC4CA, 0xCF02, 0xB141, 0xCF03, 0xB142,\n\t0xCF04, 0xC4CB, 0xCF05, 0xB143, 0xCF06, 0xB144, 0xCF07, 0xB145,\t0xCF08, 0xC4CC, 0xCF09, 0xB146, 0xCF0A, 0xB147, 0xCF0B, 0xB148,\n\t0xCF0C, 0xB149, 0xCF0D, 0xB14A, 0xCF0E, 0xB14B, 0xCF0F, 0xB14C,\t0xCF10, 0xC4CD, 0xCF11, 0xC4CE, 0xCF12, 0xB14D, 0xCF13, 0xC4CF,\n\t0xCF14, 0xB14E, 0xCF15, 0xC4D0, 0xCF16, 0xB14F, 0xCF17, 0xB150,\t0xCF18, 0xB151, 0xCF19, 0xB152, 0xCF1A, 0xB153, 0xCF1B, 0xB154,\n\t0xCF1C, 0xC4D1, 0xCF1D, 0xB155, 0xCF1E, 0xB156, 0xCF1F, 0xB157,\t0xCF20, 0xC4D2, 0xCF21, 0xB158, 0xCF22, 0xB159, 0xCF23, 0xB15A,\n\t0xCF24, 0xC4D3, 0xCF25, 0xB161, 0xCF26, 0xB162, 0xCF27, 0xB163,\t0xCF28, 0xB164, 0xCF29, 0xB165, 0xCF2A, 0xB166, 0xCF2B, 0xB167,\n\t0xCF2C, 0xC4D4, 0xCF2D, 0xC4D5, 0xCF2E, 0xB168, 0xCF2F, 0xC4D6,\t0xCF30, 0xC4D7, 0xCF31, 0xC4D8, 0xCF32, 0xB169, 0xCF33, 0xB16A,\n\t0xCF34, 0xB16B, 0xCF35, 0xB16C, 0xCF36, 0xB16D, 0xCF37, 0xB16E,\t0xCF38, 0xC4D9, 0xCF39, 0xB16F, 0xCF3A, 0xB170, 0xCF3B, 0xB171,\n\t0xCF3C, 0xB172, 0xCF3D, 0xB173, 0xCF3E, 0xB174, 0xCF3F, 0xB175,\t0xCF40, 0xB176, 0xCF41, 0xB177, 0xCF42, 0xB178, 0xCF43, 0xB179,\n\t0xCF44, 0xB17A, 0xCF45, 0xB181, 0xCF46, 0xB182, 0xCF47, 0xB183,\t0xCF48, 0xB184, 0xCF49, 0xB185, 0xCF4A, 0xB186, 0xCF4B, 0xB187,\n\t0xCF4C, 0xB188, 0xCF4D, 0xB189, 0xCF4E, 0xB18A, 0xCF4F, 0xB18B,\t0xCF50, 0xB18C, 0xCF51, 0xB18D, 0xCF52, 0xB18E, 0xCF53, 0xB18F,\n\t0xCF54, 0xC4DA, 0xCF55, 0xC4DB, 0xCF56, 0xB190, 0xCF57, 0xB191,\t0xCF58, 0xC4DC, 0xCF59, 0xB192, 0xCF5A, 0xB193, 0xCF5B, 0xB194,\n\t0xCF5C, 0xC4DD, 0xCF5D, 0xB195, 0xCF5E, 0xB196, 0xCF5F, 0xB197,\t0xCF60, 0xB198, 0xCF61, 0xB199, 0xCF62, 0xB19A, 0xCF63, 0xB19B,\n\t0xCF64, 0xC4DE, 0xCF65, 0xC4DF, 0xCF66, 0xB19C, 0xCF67, 0xC4E0,\t0xCF68, 0xB19D, 0xCF69, 0xC4E1, 0xCF6A, 0xB19E, 0xCF6B, 0xB19F,\n\t0xCF6C, 0xB1A0, 0xCF6D, 0xB241, 0xCF6E, 0xB242, 0xCF6F, 0xB243,\t0xCF70, 0xC4E2, 0xCF71, 0xC4E3, 0xCF72, 0xB244, 0xCF73, 0xB245,\n\t0xCF74, 0xC4E4, 0xCF75, 0xB246, 0xCF76, 0xB247, 0xCF77, 0xB248,\t0xCF78, 0xC4E5, 0xCF79, 0xB249, 0xCF7A, 0xB24A, 0xCF7B, 0xB24B,\n\t0xCF7C, 0xB24C, 0xCF7D, 0xB24D, 0xCF7E, 0xB24E, 0xCF7F, 0xB24F,\t0xCF80, 0xC4E6, 0xCF81, 0xB250, 0xCF82, 0xB251, 0xCF83, 0xB252,\n\t0xCF84, 0xB253, 0xCF85, 0xC4E7, 0xCF86, 0xB254, 0xCF87, 0xB255,\t0xCF88, 0xB256, 0xCF89, 0xB257, 0xCF8A, 0xB258, 0xCF8B, 0xB259,\n\t0xCF8C, 0xC4E8, 0xCF8D, 0xB25A, 0xCF8E, 0xB261, 0xCF8F, 0xB262,\t0xCF90, 0xB263, 0xCF91, 0xB264, 0xCF92, 0xB265, 0xCF93, 0xB266,\n\t0xCF94, 0xB267, 0xCF95, 0xB268, 0xCF96, 0xB269, 0xCF97, 0xB26A,\t0xCF98, 0xB26B, 0xCF99, 0xB26C, 0xCF9A, 0xB26D, 0xCF9B, 0xB26E,\n\t0xCF9C, 0xB26F, 0xCF9D, 0xB270, 0xCF9E, 0xB271, 0xCF9F, 0xB272,\t0xCFA0, 0xB273, 0xCFA1, 0xC4E9, 0xCFA2, 0xB274, 0xCFA3, 0xB275,\n\t0xCFA4, 0xB276, 0xCFA5, 0xB277, 0xCFA6, 0xB278, 0xCFA7, 0xB279,\t0xCFA8, 0xC4EA, 0xCFA9, 0xB27A, 0xCFAA, 0xB281, 0xCFAB, 0xB282,\n\t0xCFAC, 0xB283, 0xCFAD, 0xB284, 0xCFAE, 0xB285, 0xCFAF, 0xB286,\t0xCFB0, 0xC4EB, 0xCFB1, 0xB287, 0xCFB2, 0xB288, 0xCFB3, 0xB289,\n\t0xCFB4, 0xB28A, 0xCFB5, 0xB28B, 0xCFB6, 0xB28C, 0xCFB7, 0xB28D,\t0xCFB8, 0xB28E, 0xCFB9, 0xB28F, 0xCFBA, 0xB290, 0xCFBB, 0xB291,\n\t0xCFBC, 0xB292, 0xCFBD, 0xB293, 0xCFBE, 0xB294, 0xCFBF, 0xB295,\t0xCFC0, 0xB296, 0xCFC1, 0xB297, 0xCFC2, 0xB298, 0xCFC3, 0xB299,\n\t0xCFC4, 0xC4EC, 0xCFC5, 0xB29A, 0xCFC6, 0xB29B, 0xCFC7, 0xB29C,\t0xCFC8, 0xB29D, 0xCFC9, 0xB29E, 0xCFCA, 0xB29F, 0xCFCB, 0xB2A0,\n\t0xCFCC, 0xB341, 0xCFCD, 0xB342, 0xCFCE, 0xB343, 0xCFCF, 0xB344,\t0xCFD0, 0xB345, 0xCFD1, 0xB346, 0xCFD2, 0xB347, 0xCFD3, 0xB348,\n\t0xCFD4, 0xB349, 0xCFD5, 0xB34A, 0xCFD6, 0xB34B, 0xCFD7, 0xB34C,\t0xCFD8, 0xB34D, 0xCFD9, 0xB34E, 0xCFDA, 0xB34F, 0xCFDB, 0xB350,\n\t0xCFDC, 0xB351, 0xCFDD, 0xB352, 0xCFDE, 0xB353, 0xCFDF, 0xB354,\t0xCFE0, 0xC4ED, 0xCFE1, 0xC4EE, 0xCFE2, 0xB355, 0xCFE3, 0xB356,\n\t0xCFE4, 0xC4EF, 0xCFE5, 0xB357, 0xCFE6, 0xB358, 0xCFE7, 0xB359,\t0xCFE8, 0xC4F0, 0xCFE9, 0xB35A, 0xCFEA, 0xB361, 0xCFEB, 0xB362,\n\t0xCFEC, 0xB363, 0xCFED, 0xB364, 0xCFEE, 0xB365, 0xCFEF, 0xB366,\t0xCFF0, 0xC4F1, 0xCFF1, 0xC4F2, 0xCFF2, 0xB367, 0xCFF3, 0xC4F3,\n\t0xCFF4, 0xB368, 0xCFF5, 0xC4F4, 0xCFF6, 0xB369, 0xCFF7, 0xB36A,\t0xCFF8, 0xB36B, 0xCFF9, 0xB36C, 0xCFFA, 0xB36D, 0xCFFB, 0xB36E,\n\t0xCFFC, 0xC4F5, 0xCFFD, 0xB36F, 0xCFFE, 0xB370, 0xCFFF, 0xB371,\t0xD000, 0xC4F6, 0xD001, 0xB372, 0xD002, 0xB373, 0xD003, 0xB374,\n\t0xD004, 0xC4F7, 0xD005, 0xB375, 0xD006, 0xB376, 0xD007, 0xB377,\t0xD008, 0xB378, 0xD009, 0xB379, 0xD00A, 0xB37A, 0xD00B, 0xB381,\n\t0xD00C, 0xB382, 0xD00D, 0xB383, 0xD00E, 0xB384, 0xD00F, 0xB385,\t0xD010, 0xB386, 0xD011, 0xC4F8, 0xD012, 0xB387, 0xD013, 0xB388,\n\t0xD014, 0xB389, 0xD015, 0xB38A, 0xD016, 0xB38B, 0xD017, 0xB38C,\t0xD018, 0xC4F9, 0xD019, 0xB38D, 0xD01A, 0xB38E, 0xD01B, 0xB38F,\n\t0xD01C, 0xB390, 0xD01D, 0xB391, 0xD01E, 0xB392, 0xD01F, 0xB393,\t0xD020, 0xB394, 0xD021, 0xB395, 0xD022, 0xB396, 0xD023, 0xB397,\n\t0xD024, 0xB398, 0xD025, 0xB399, 0xD026, 0xB39A, 0xD027, 0xB39B,\t0xD028, 0xB39C, 0xD029, 0xB39D, 0xD02A, 0xB39E, 0xD02B, 0xB39F,\n\t0xD02C, 0xB3A0, 0xD02D, 0xC4FA, 0xD02E, 0xB441, 0xD02F, 0xB442,\t0xD030, 0xB443, 0xD031, 0xB444, 0xD032, 0xB445, 0xD033, 0xB446,\n\t0xD034, 0xC4FB, 0xD035, 0xC4FC, 0xD036, 0xB447, 0xD037, 0xB448,\t0xD038, 0xC4FD, 0xD039, 0xB449, 0xD03A, 0xB44A, 0xD03B, 0xB44B,\n\t0xD03C, 0xC4FE, 0xD03D, 0xB44C, 0xD03E, 0xB44D, 0xD03F, 0xB44E,\t0xD040, 0xB44F, 0xD041, 0xB450, 0xD042, 0xB451, 0xD043, 0xB452,\n\t0xD044, 0xC5A1, 0xD045, 0xC5A2, 0xD046, 0xB453, 0xD047, 0xC5A3,\t0xD048, 0xB454, 0xD049, 0xC5A4, 0xD04A, 0xB455, 0xD04B, 0xB456,\n\t0xD04C, 0xB457, 0xD04D, 0xB458, 0xD04E, 0xB459, 0xD04F, 0xB45A,\t0xD050, 0xC5A5, 0xD051, 0xB461, 0xD052, 0xB462, 0xD053, 0xB463,\n\t0xD054, 0xC5A6, 0xD055, 0xB464, 0xD056, 0xB465, 0xD057, 0xB466,\t0xD058, 0xC5A7, 0xD059, 0xB467, 0xD05A, 0xB468, 0xD05B, 0xB469,\n\t0xD05C, 0xB46A, 0xD05D, 0xB46B, 0xD05E, 0xB46C, 0xD05F, 0xB46D,\t0xD060, 0xC5A8, 0xD061, 0xB46E, 0xD062, 0xB46F, 0xD063, 0xB470,\n\t0xD064, 0xB471, 0xD065, 0xB472, 0xD066, 0xB473, 0xD067, 0xB474,\t0xD068, 0xB475, 0xD069, 0xB476, 0xD06A, 0xB477, 0xD06B, 0xB478,\n\t0xD06C, 0xC5A9, 0xD06D, 0xC5AA, 0xD06E, 0xB479, 0xD06F, 0xB47A,\t0xD070, 0xC5AB, 0xD071, 0xB481, 0xD072, 0xB482, 0xD073, 0xB483,\n\t0xD074, 0xC5AC, 0xD075, 0xB484, 0xD076, 0xB485, 0xD077, 0xB486,\t0xD078, 0xB487, 0xD079, 0xB488, 0xD07A, 0xB489, 0xD07B, 0xB48A,\n\t0xD07C, 0xC5AD, 0xD07D, 0xC5AE, 0xD07E, 0xB48B, 0xD07F, 0xB48C,\t0xD080, 0xB48D, 0xD081, 0xC5AF, 0xD082, 0xB48E, 0xD083, 0xB48F,\n\t0xD084, 0xB490, 0xD085, 0xB491, 0xD086, 0xB492, 0xD087, 0xB493,\t0xD088, 0xB494, 0xD089, 0xB495, 0xD08A, 0xB496, 0xD08B, 0xB497,\n\t0xD08C, 0xB498, 0xD08D, 0xB499, 0xD08E, 0xB49A, 0xD08F, 0xB49B,\t0xD090, 0xB49C, 0xD091, 0xB49D, 0xD092, 0xB49E, 0xD093, 0xB49F,\n\t0xD094, 0xB4A0, 0xD095, 0xB541, 0xD096, 0xB542, 0xD097, 0xB543,\t0xD098, 0xB544, 0xD099, 0xB545, 0xD09A, 0xB546, 0xD09B, 0xB547,\n\t0xD09C, 0xB548, 0xD09D, 0xB549, 0xD09E, 0xB54A, 0xD09F, 0xB54B,\t0xD0A0, 0xB54C, 0xD0A1, 0xB54D, 0xD0A2, 0xB54E, 0xD0A3, 0xB54F,\n\t0xD0A4, 0xC5B0, 0xD0A5, 0xC5B1, 0xD0A6, 0xB550, 0xD0A7, 0xB551,\t0xD0A8, 0xC5B2, 0xD0A9, 0xB552, 0xD0AA, 0xB553, 0xD0AB, 0xB554,\n\t0xD0AC, 0xC5B3, 0xD0AD, 0xB555, 0xD0AE, 0xB556, 0xD0AF, 0xB557,\t0xD0B0, 0xB558, 0xD0B1, 0xB559, 0xD0B2, 0xB55A, 0xD0B3, 0xB561,\n\t0xD0B4, 0xC5B4, 0xD0B5, 0xC5B5, 0xD0B6, 0xB562, 0xD0B7, 0xC5B6,\t0xD0B8, 0xB563, 0xD0B9, 0xC5B7, 0xD0BA, 0xB564, 0xD0BB, 0xB565,\n\t0xD0BC, 0xB566, 0xD0BD, 0xB567, 0xD0BE, 0xB568, 0xD0BF, 0xB569,\t0xD0C0, 0xC5B8, 0xD0C1, 0xC5B9, 0xD0C2, 0xB56A, 0xD0C3, 0xB56B,\n\t0xD0C4, 0xC5BA, 0xD0C5, 0xB56C, 0xD0C6, 0xB56D, 0xD0C7, 0xB56E,\t0xD0C8, 0xC5BB, 0xD0C9, 0xC5BC, 0xD0CA, 0xB56F, 0xD0CB, 0xB570,\n\t0xD0CC, 0xB571, 0xD0CD, 0xB572, 0xD0CE, 0xB573, 0xD0CF, 0xB574,\t0xD0D0, 0xC5BD, 0xD0D1, 0xC5BE, 0xD0D2, 0xB575, 0xD0D3, 0xC5BF,\n\t0xD0D4, 0xC5C0, 0xD0D5, 0xC5C1, 0xD0D6, 0xB576, 0xD0D7, 0xB577,\t0xD0D8, 0xB578, 0xD0D9, 0xB579, 0xD0DA, 0xB57A, 0xD0DB, 0xB581,\n\t0xD0DC, 0xC5C2, 0xD0DD, 0xC5C3, 0xD0DE, 0xB582, 0xD0DF, 0xB583,\t0xD0E0, 0xC5C4, 0xD0E1, 0xB584, 0xD0E2, 0xB585, 0xD0E3, 0xB586,\n\t0xD0E4, 0xC5C5, 0xD0E5, 0xB587, 0xD0E6, 0xB588, 0xD0E7, 0xB589,\t0xD0E8, 0xB58A, 0xD0E9, 0xB58B, 0xD0EA, 0xB58C, 0xD0EB, 0xB58D,\n\t0xD0EC, 0xC5C6, 0xD0ED, 0xC5C7, 0xD0EE, 0xB58E, 0xD0EF, 0xC5C8,\t0xD0F0, 0xC5C9, 0xD0F1, 0xC5CA, 0xD0F2, 0xB58F, 0xD0F3, 0xB590,\n\t0xD0F4, 0xB591, 0xD0F5, 0xB592, 0xD0F6, 0xB593, 0xD0F7, 0xB594,\t0xD0F8, 0xC5CB, 0xD0F9, 0xB595, 0xD0FA, 0xB596, 0xD0FB, 0xB597,\n\t0xD0FC, 0xB598, 0xD0FD, 0xB599, 0xD0FE, 0xB59A, 0xD0FF, 0xB59B,\t0xD100, 0xB59C, 0xD101, 0xB59D, 0xD102, 0xB59E, 0xD103, 0xB59F,\n\t0xD104, 0xB5A0, 0xD105, 0xB641, 0xD106, 0xB642, 0xD107, 0xB643,\t0xD108, 0xB644, 0xD109, 0xB645, 0xD10A, 0xB646, 0xD10B, 0xB647,\n\t0xD10C, 0xB648, 0xD10D, 0xC5CC, 0xD10E, 0xB649, 0xD10F, 0xB64A,\t0xD110, 0xB64B, 0xD111, 0xB64C, 0xD112, 0xB64D, 0xD113, 0xB64E,\n\t0xD114, 0xB64F, 0xD115, 0xB650, 0xD116, 0xB651, 0xD117, 0xB652,\t0xD118, 0xB653, 0xD119, 0xB654, 0xD11A, 0xB655, 0xD11B, 0xB656,\n\t0xD11C, 0xB657, 0xD11D, 0xB658, 0xD11E, 0xB659, 0xD11F, 0xB65A,\t0xD120, 0xB661, 0xD121, 0xB662, 0xD122, 0xB663, 0xD123, 0xB664,\n\t0xD124, 0xB665, 0xD125, 0xB666, 0xD126, 0xB667, 0xD127, 0xB668,\t0xD128, 0xB669, 0xD129, 0xB66A, 0xD12A, 0xB66B, 0xD12B, 0xB66C,\n\t0xD12C, 0xB66D, 0xD12D, 0xB66E, 0xD12E, 0xB66F, 0xD12F, 0xB670,\t0xD130, 0xC5CD, 0xD131, 0xC5CE, 0xD132, 0xB671, 0xD133, 0xB672,\n\t0xD134, 0xC5CF, 0xD135, 0xB673, 0xD136, 0xB674, 0xD137, 0xB675,\t0xD138, 0xC5D0, 0xD139, 0xB676, 0xD13A, 0xC5D1, 0xD13B, 0xB677,\n\t0xD13C, 0xB678, 0xD13D, 0xB679, 0xD13E, 0xB67A, 0xD13F, 0xB681,\t0xD140, 0xC5D2, 0xD141, 0xC5D3, 0xD142, 0xB682, 0xD143, 0xC5D4,\n\t0xD144, 0xC5D5, 0xD145, 0xC5D6, 0xD146, 0xB683, 0xD147, 0xB684,\t0xD148, 0xB685, 0xD149, 0xB686, 0xD14A, 0xB687, 0xD14B, 0xB688,\n\t0xD14C, 0xC5D7, 0xD14D, 0xC5D8, 0xD14E, 0xB689, 0xD14F, 0xB68A,\t0xD150, 0xC5D9, 0xD151, 0xB68B, 0xD152, 0xB68C, 0xD153, 0xB68D,\n\t0xD154, 0xC5DA, 0xD155, 0xB68E, 0xD156, 0xB68F, 0xD157, 0xB690,\t0xD158, 0xB691, 0xD159, 0xB692, 0xD15A, 0xB693, 0xD15B, 0xB694,\n\t0xD15C, 0xC5DB, 0xD15D, 0xC5DC, 0xD15E, 0xB695, 0xD15F, 0xC5DD,\t0xD160, 0xB696, 0xD161, 0xC5DE, 0xD162, 0xB697, 0xD163, 0xB698,\n\t0xD164, 0xB699, 0xD165, 0xB69A, 0xD166, 0xB69B, 0xD167, 0xB69C,\t0xD168, 0xC5DF, 0xD169, 0xB69D, 0xD16A, 0xB69E, 0xD16B, 0xB69F,\n\t0xD16C, 0xC5E0, 0xD16D, 0xB6A0, 0xD16E, 0xB741, 0xD16F, 0xB742,\t0xD170, 0xB743, 0xD171, 0xB744, 0xD172, 0xB745, 0xD173, 0xB746,\n\t0xD174, 0xB747, 0xD175, 0xB748, 0xD176, 0xB749, 0xD177, 0xB74A,\t0xD178, 0xB74B, 0xD179, 0xB74C, 0xD17A, 0xB74D, 0xD17B, 0xB74E,\n\t0xD17C, 0xC5E1, 0xD17D, 0xB74F, 0xD17E, 0xB750, 0xD17F, 0xB751,\t0xD180, 0xB752, 0xD181, 0xB753, 0xD182, 0xB754, 0xD183, 0xB755,\n\t0xD184, 0xC5E2, 0xD185, 0xB756, 0xD186, 0xB757, 0xD187, 0xB758,\t0xD188, 0xC5E3, 0xD189, 0xB759, 0xD18A, 0xB75A, 0xD18B, 0xB761,\n\t0xD18C, 0xB762, 0xD18D, 0xB763, 0xD18E, 0xB764, 0xD18F, 0xB765,\t0xD190, 0xB766, 0xD191, 0xB767, 0xD192, 0xB768, 0xD193, 0xB769,\n\t0xD194, 0xB76A, 0xD195, 0xB76B, 0xD196, 0xB76C, 0xD197, 0xB76D,\t0xD198, 0xB76E, 0xD199, 0xB76F, 0xD19A, 0xB770, 0xD19B, 0xB771,\n\t0xD19C, 0xB772, 0xD19D, 0xB773, 0xD19E, 0xB774, 0xD19F, 0xB775,\t0xD1A0, 0xC5E4, 0xD1A1, 0xC5E5, 0xD1A2, 0xB776, 0xD1A3, 0xB777,\n\t0xD1A4, 0xC5E6, 0xD1A5, 0xB778, 0xD1A6, 0xB779, 0xD1A7, 0xB77A,\t0xD1A8, 0xC5E7, 0xD1A9, 0xB781, 0xD1AA, 0xB782, 0xD1AB, 0xB783,\n\t0xD1AC, 0xB784, 0xD1AD, 0xB785, 0xD1AE, 0xB786, 0xD1AF, 0xB787,\t0xD1B0, 0xC5E8, 0xD1B1, 0xC5E9, 0xD1B2, 0xB788, 0xD1B3, 0xC5EA,\n\t0xD1B4, 0xB789, 0xD1B5, 0xC5EB, 0xD1B6, 0xB78A, 0xD1B7, 0xB78B,\t0xD1B8, 0xB78C, 0xD1B9, 0xB78D, 0xD1BA, 0xC5EC, 0xD1BB, 0xB78E,\n\t0xD1BC, 0xC5ED, 0xD1BD, 0xB78F, 0xD1BE, 0xB790, 0xD1BF, 0xB791,\t0xD1C0, 0xC5EE, 0xD1C1, 0xB792, 0xD1C2, 0xB793, 0xD1C3, 0xB794,\n\t0xD1C4, 0xB795, 0xD1C5, 0xB796, 0xD1C6, 0xB797, 0xD1C7, 0xB798,\t0xD1C8, 0xB799, 0xD1C9, 0xB79A, 0xD1CA, 0xB79B, 0xD1CB, 0xB79C,\n\t0xD1CC, 0xB79D, 0xD1CD, 0xB79E, 0xD1CE, 0xB79F, 0xD1CF, 0xB7A0,\t0xD1D0, 0xB841, 0xD1D1, 0xB842, 0xD1D2, 0xB843, 0xD1D3, 0xB844,\n\t0xD1D4, 0xB845, 0xD1D5, 0xB846, 0xD1D6, 0xB847, 0xD1D7, 0xB848,\t0xD1D8, 0xC5EF, 0xD1D9, 0xB849, 0xD1DA, 0xB84A, 0xD1DB, 0xB84B,\n\t0xD1DC, 0xB84C, 0xD1DD, 0xB84D, 0xD1DE, 0xB84E, 0xD1DF, 0xB84F,\t0xD1E0, 0xB850, 0xD1E1, 0xB851, 0xD1E2, 0xB852, 0xD1E3, 0xB853,\n\t0xD1E4, 0xB854, 0xD1E5, 0xB855, 0xD1E6, 0xB856, 0xD1E7, 0xB857,\t0xD1E8, 0xB858, 0xD1E9, 0xB859, 0xD1EA, 0xB85A, 0xD1EB, 0xB861,\n\t0xD1EC, 0xB862, 0xD1ED, 0xB863, 0xD1EE, 0xB864, 0xD1EF, 0xB865,\t0xD1F0, 0xB866, 0xD1F1, 0xB867, 0xD1F2, 0xB868, 0xD1F3, 0xB869,\n\t0xD1F4, 0xC5F0, 0xD1F5, 0xB86A, 0xD1F6, 0xB86B, 0xD1F7, 0xB86C,\t0xD1F8, 0xC5F1, 0xD1F9, 0xB86D, 0xD1FA, 0xB86E, 0xD1FB, 0xB86F,\n\t0xD1FC, 0xB870, 0xD1FD, 0xB871, 0xD1FE, 0xB872, 0xD1FF, 0xB873,\t0xD200, 0xB874, 0xD201, 0xB875, 0xD202, 0xB876, 0xD203, 0xB877,\n\t0xD204, 0xB878, 0xD205, 0xB879, 0xD206, 0xB87A, 0xD207, 0xC5F2,\t0xD208, 0xB881, 0xD209, 0xC5F3, 0xD20A, 0xB882, 0xD20B, 0xB883,\n\t0xD20C, 0xB884, 0xD20D, 0xB885, 0xD20E, 0xB886, 0xD20F, 0xB887,\t0xD210, 0xC5F4, 0xD211, 0xB888, 0xD212, 0xB889, 0xD213, 0xB88A,\n\t0xD214, 0xB88B, 0xD215, 0xB88C, 0xD216, 0xB88D, 0xD217, 0xB88E,\t0xD218, 0xB88F, 0xD219, 0xB890, 0xD21A, 0xB891, 0xD21B, 0xB892,\n\t0xD21C, 0xB893, 0xD21D, 0xB894, 0xD21E, 0xB895, 0xD21F, 0xB896,\t0xD220, 0xB897, 0xD221, 0xB898, 0xD222, 0xB899, 0xD223, 0xB89A,\n\t0xD224, 0xB89B, 0xD225, 0xB89C, 0xD226, 0xB89D, 0xD227, 0xB89E,\t0xD228, 0xB89F, 0xD229, 0xB8A0, 0xD22A, 0xB941, 0xD22B, 0xB942,\n\t0xD22C, 0xC5F5, 0xD22D, 0xC5F6, 0xD22E, 0xB943, 0xD22F, 0xB944,\t0xD230, 0xC5F7, 0xD231, 0xB945, 0xD232, 0xB946, 0xD233, 0xB947,\n\t0xD234, 0xC5F8, 0xD235, 0xB948, 0xD236, 0xB949, 0xD237, 0xB94A,\t0xD238, 0xB94B, 0xD239, 0xB94C, 0xD23A, 0xB94D, 0xD23B, 0xB94E,\n\t0xD23C, 0xC5F9, 0xD23D, 0xC5FA, 0xD23E, 0xB94F, 0xD23F, 0xC5FB,\t0xD240, 0xB950, 0xD241, 0xC5FC, 0xD242, 0xB951, 0xD243, 0xB952,\n\t0xD244, 0xB953, 0xD245, 0xB954, 0xD246, 0xB955, 0xD247, 0xB956,\t0xD248, 0xC5FD, 0xD249, 0xB957, 0xD24A, 0xB958, 0xD24B, 0xB959,\n\t0xD24C, 0xB95A, 0xD24D, 0xB961, 0xD24E, 0xB962, 0xD24F, 0xB963,\t0xD250, 0xB964, 0xD251, 0xB965, 0xD252, 0xB966, 0xD253, 0xB967,\n\t0xD254, 0xB968, 0xD255, 0xB969, 0xD256, 0xB96A, 0xD257, 0xB96B,\t0xD258, 0xB96C, 0xD259, 0xB96D, 0xD25A, 0xB96E, 0xD25B, 0xB96F,\n\t0xD25C, 0xC5FE, 0xD25D, 0xB970, 0xD25E, 0xB971, 0xD25F, 0xB972,\t0xD260, 0xB973, 0xD261, 0xB974, 0xD262, 0xB975, 0xD263, 0xB976,\n\t0xD264, 0xC6A1, 0xD265, 0xB977, 0xD266, 0xB978, 0xD267, 0xB979,\t0xD268, 0xB97A, 0xD269, 0xB981, 0xD26A, 0xB982, 0xD26B, 0xB983,\n\t0xD26C, 0xB984, 0xD26D, 0xB985, 0xD26E, 0xB986, 0xD26F, 0xB987,\t0xD270, 0xB988, 0xD271, 0xB989, 0xD272, 0xB98A, 0xD273, 0xB98B,\n\t0xD274, 0xB98C, 0xD275, 0xB98D, 0xD276, 0xB98E, 0xD277, 0xB98F,\t0xD278, 0xB990, 0xD279, 0xB991, 0xD27A, 0xB992, 0xD27B, 0xB993,\n\t0xD27C, 0xB994, 0xD27D, 0xB995, 0xD27E, 0xB996, 0xD27F, 0xB997,\t0xD280, 0xC6A2, 0xD281, 0xC6A3, 0xD282, 0xB998, 0xD283, 0xB999,\n\t0xD284, 0xC6A4, 0xD285, 0xB99A, 0xD286, 0xB99B, 0xD287, 0xB99C,\t0xD288, 0xC6A5, 0xD289, 0xB99D, 0xD28A, 0xB99E, 0xD28B, 0xB99F,\n\t0xD28C, 0xB9A0, 0xD28D, 0xBA41, 0xD28E, 0xBA42, 0xD28F, 0xBA43,\t0xD290, 0xC6A6, 0xD291, 0xC6A7, 0xD292, 0xBA44, 0xD293, 0xBA45,\n\t0xD294, 0xBA46, 0xD295, 0xC6A8, 0xD296, 0xBA47, 0xD297, 0xBA48,\t0xD298, 0xBA49, 0xD299, 0xBA4A, 0xD29A, 0xBA4B, 0xD29B, 0xBA4C,\n\t0xD29C, 0xC6A9, 0xD29D, 0xBA4D, 0xD29E, 0xBA4E, 0xD29F, 0xBA4F,\t0xD2A0, 0xC6AA, 0xD2A1, 0xBA50, 0xD2A2, 0xBA51, 0xD2A3, 0xBA52,\n\t0xD2A4, 0xC6AB, 0xD2A5, 0xBA53, 0xD2A6, 0xBA54, 0xD2A7, 0xBA55,\t0xD2A8, 0xBA56, 0xD2A9, 0xBA57, 0xD2AA, 0xBA58, 0xD2AB, 0xBA59,\n\t0xD2AC, 0xC6AC, 0xD2AD, 0xBA5A, 0xD2AE, 0xBA61, 0xD2AF, 0xBA62,\t0xD2B0, 0xBA63, 0xD2B1, 0xC6AD, 0xD2B2, 0xBA64, 0xD2B3, 0xBA65,\n\t0xD2B4, 0xBA66, 0xD2B5, 0xBA67, 0xD2B6, 0xBA68, 0xD2B7, 0xBA69,\t0xD2B8, 0xC6AE, 0xD2B9, 0xC6AF, 0xD2BA, 0xBA6A, 0xD2BB, 0xBA6B,\n\t0xD2BC, 0xC6B0, 0xD2BD, 0xBA6C, 0xD2BE, 0xBA6D, 0xD2BF, 0xC6B1,\t0xD2C0, 0xC6B2, 0xD2C1, 0xBA6E, 0xD2C2, 0xC6B3, 0xD2C3, 0xBA6F,\n\t0xD2C4, 0xBA70, 0xD2C5, 0xBA71, 0xD2C6, 0xBA72, 0xD2C7, 0xBA73,\t0xD2C8, 0xC6B4, 0xD2C9, 0xC6B5, 0xD2CA, 0xBA74, 0xD2CB, 0xC6B6,\n\t0xD2CC, 0xBA75, 0xD2CD, 0xBA76, 0xD2CE, 0xBA77, 0xD2CF, 0xBA78,\t0xD2D0, 0xBA79, 0xD2D1, 0xBA7A, 0xD2D2, 0xBA81, 0xD2D3, 0xBA82,\n\t0xD2D4, 0xC6B7, 0xD2D5, 0xBA83, 0xD2D6, 0xBA84, 0xD2D7, 0xBA85,\t0xD2D8, 0xC6B8, 0xD2D9, 0xBA86, 0xD2DA, 0xBA87, 0xD2DB, 0xBA88,\n\t0xD2DC, 0xC6B9, 0xD2DD, 0xBA89, 0xD2DE, 0xBA8A, 0xD2DF, 0xBA8B,\t0xD2E0, 0xBA8C, 0xD2E1, 0xBA8D, 0xD2E2, 0xBA8E, 0xD2E3, 0xBA8F,\n\t0xD2E4, 0xC6BA, 0xD2E5, 0xC6BB, 0xD2E6, 0xBA90, 0xD2E7, 0xBA91,\t0xD2E8, 0xBA92, 0xD2E9, 0xBA93, 0xD2EA, 0xBA94, 0xD2EB, 0xBA95,\n\t0xD2EC, 0xBA96, 0xD2ED, 0xBA97, 0xD2EE, 0xBA98, 0xD2EF, 0xBA99,\t0xD2F0, 0xC6BC, 0xD2F1, 0xC6BD, 0xD2F2, 0xBA9A, 0xD2F3, 0xBA9B,\n\t0xD2F4, 0xC6BE, 0xD2F5, 0xBA9C, 0xD2F6, 0xBA9D, 0xD2F7, 0xBA9E,\t0xD2F8, 0xC6BF, 0xD2F9, 0xBA9F, 0xD2FA, 0xBAA0, 0xD2FB, 0xBB41,\n\t0xD2FC, 0xBB42, 0xD2FD, 0xBB43, 0xD2FE, 0xBB44, 0xD2FF, 0xBB45,\t0xD300, 0xC6C0, 0xD301, 0xC6C1, 0xD302, 0xBB46, 0xD303, 0xC6C2,\n\t0xD304, 0xBB47, 0xD305, 0xC6C3, 0xD306, 0xBB48, 0xD307, 0xBB49,\t0xD308, 0xBB4A, 0xD309, 0xBB4B, 0xD30A, 0xBB4C, 0xD30B, 0xBB4D,\n\t0xD30C, 0xC6C4, 0xD30D, 0xC6C5, 0xD30E, 0xC6C6, 0xD30F, 0xBB4E,\t0xD310, 0xC6C7, 0xD311, 0xBB4F, 0xD312, 0xBB50, 0xD313, 0xBB51,\n\t0xD314, 0xC6C8, 0xD315, 0xBB52, 0xD316, 0xC6C9, 0xD317, 0xBB53,\t0xD318, 0xBB54, 0xD319, 0xBB55, 0xD31A, 0xBB56, 0xD31B, 0xBB57,\n\t0xD31C, 0xC6CA, 0xD31D, 0xC6CB, 0xD31E, 0xBB58, 0xD31F, 0xC6CC,\t0xD320, 0xC6CD, 0xD321, 0xC6CE, 0xD322, 0xBB59, 0xD323, 0xBB5A,\n\t0xD324, 0xBB61, 0xD325, 0xC6CF, 0xD326, 0xBB62, 0xD327, 0xBB63,\t0xD328, 0xC6D0, 0xD329, 0xC6D1, 0xD32A, 0xBB64, 0xD32B, 0xBB65,\n\t0xD32C, 0xC6D2, 0xD32D, 0xBB66, 0xD32E, 0xBB67, 0xD32F, 0xBB68,\t0xD330, 0xC6D3, 0xD331, 0xBB69, 0xD332, 0xBB6A, 0xD333, 0xBB6B,\n\t0xD334, 0xBB6C, 0xD335, 0xBB6D, 0xD336, 0xBB6E, 0xD337, 0xBB6F,\t0xD338, 0xC6D4, 0xD339, 0xC6D5, 0xD33A, 0xBB70, 0xD33B, 0xC6D6,\n\t0xD33C, 0xC6D7, 0xD33D, 0xC6D8, 0xD33E, 0xBB71, 0xD33F, 0xBB72,\t0xD340, 0xBB73, 0xD341, 0xBB74, 0xD342, 0xBB75, 0xD343, 0xBB76,\n\t0xD344, 0xC6D9, 0xD345, 0xC6DA, 0xD346, 0xBB77, 0xD347, 0xBB78,\t0xD348, 0xBB79, 0xD349, 0xBB7A, 0xD34A, 0xBB81, 0xD34B, 0xBB82,\n\t0xD34C, 0xBB83, 0xD34D, 0xBB84, 0xD34E, 0xBB85, 0xD34F, 0xBB86,\t0xD350, 0xBB87, 0xD351, 0xBB88, 0xD352, 0xBB89, 0xD353, 0xBB8A,\n\t0xD354, 0xBB8B, 0xD355, 0xBB8C, 0xD356, 0xBB8D, 0xD357, 0xBB8E,\t0xD358, 0xBB8F, 0xD359, 0xBB90, 0xD35A, 0xBB91, 0xD35B, 0xBB92,\n\t0xD35C, 0xBB93, 0xD35D, 0xBB94, 0xD35E, 0xBB95, 0xD35F, 0xBB96,\t0xD360, 0xBB97, 0xD361, 0xBB98, 0xD362, 0xBB99, 0xD363, 0xBB9A,\n\t0xD364, 0xBB9B, 0xD365, 0xBB9C, 0xD366, 0xBB9D, 0xD367, 0xBB9E,\t0xD368, 0xBB9F, 0xD369, 0xBBA0, 0xD36A, 0xBC41, 0xD36B, 0xBC42,\n\t0xD36C, 0xBC43, 0xD36D, 0xBC44, 0xD36E, 0xBC45, 0xD36F, 0xBC46,\t0xD370, 0xBC47, 0xD371, 0xBC48, 0xD372, 0xBC49, 0xD373, 0xBC4A,\n\t0xD374, 0xBC4B, 0xD375, 0xBC4C, 0xD376, 0xBC4D, 0xD377, 0xBC4E,\t0xD378, 0xBC4F, 0xD379, 0xBC50, 0xD37A, 0xBC51, 0xD37B, 0xBC52,\n\t0xD37C, 0xC6DB, 0xD37D, 0xC6DC, 0xD37E, 0xBC53, 0xD37F, 0xBC54,\t0xD380, 0xC6DD, 0xD381, 0xBC55, 0xD382, 0xBC56, 0xD383, 0xBC57,\n\t0xD384, 0xC6DE, 0xD385, 0xBC58, 0xD386, 0xBC59, 0xD387, 0xBC5A,\t0xD388, 0xBC61, 0xD389, 0xBC62, 0xD38A, 0xBC63, 0xD38B, 0xBC64,\n\t0xD38C, 0xC6DF, 0xD38D, 0xC6E0, 0xD38E, 0xBC65, 0xD38F, 0xC6E1,\t0xD390, 0xC6E2, 0xD391, 0xC6E3, 0xD392, 0xBC66, 0xD393, 0xBC67,\n\t0xD394, 0xBC68, 0xD395, 0xBC69, 0xD396, 0xBC6A, 0xD397, 0xBC6B,\t0xD398, 0xC6E4, 0xD399, 0xC6E5, 0xD39A, 0xBC6C, 0xD39B, 0xBC6D,\n\t0xD39C, 0xC6E6, 0xD39D, 0xBC6E, 0xD39E, 0xBC6F, 0xD39F, 0xBC70,\t0xD3A0, 0xC6E7, 0xD3A1, 0xBC71, 0xD3A2, 0xBC72, 0xD3A3, 0xBC73,\n\t0xD3A4, 0xBC74, 0xD3A5, 0xBC75, 0xD3A6, 0xBC76, 0xD3A7, 0xBC77,\t0xD3A8, 0xC6E8, 0xD3A9, 0xC6E9, 0xD3AA, 0xBC78, 0xD3AB, 0xC6EA,\n\t0xD3AC, 0xBC79, 0xD3AD, 0xC6EB, 0xD3AE, 0xBC7A, 0xD3AF, 0xBC81,\t0xD3B0, 0xBC82, 0xD3B1, 0xBC83, 0xD3B2, 0xBC84, 0xD3B3, 0xBC85,\n\t0xD3B4, 0xC6EC, 0xD3B5, 0xBC86, 0xD3B6, 0xBC87, 0xD3B7, 0xBC88,\t0xD3B8, 0xC6ED, 0xD3B9, 0xBC89, 0xD3BA, 0xBC8A, 0xD3BB, 0xBC8B,\n\t0xD3BC, 0xC6EE, 0xD3BD, 0xBC8C, 0xD3BE, 0xBC8D, 0xD3BF, 0xBC8E,\t0xD3C0, 0xBC8F, 0xD3C1, 0xBC90, 0xD3C2, 0xBC91, 0xD3C3, 0xBC92,\n\t0xD3C4, 0xC6EF, 0xD3C5, 0xC6F0, 0xD3C6, 0xBC93, 0xD3C7, 0xBC94,\t0xD3C8, 0xC6F1, 0xD3C9, 0xC6F2, 0xD3CA, 0xBC95, 0xD3CB, 0xBC96,\n\t0xD3CC, 0xBC97, 0xD3CD, 0xBC98, 0xD3CE, 0xBC99, 0xD3CF, 0xBC9A,\t0xD3D0, 0xC6F3, 0xD3D1, 0xBC9B, 0xD3D2, 0xBC9C, 0xD3D3, 0xBC9D,\n\t0xD3D4, 0xBC9E, 0xD3D5, 0xBC9F, 0xD3D6, 0xBCA0, 0xD3D7, 0xBD41,\t0xD3D8, 0xC6F4, 0xD3D9, 0xBD42, 0xD3DA, 0xBD43, 0xD3DB, 0xBD44,\n\t0xD3DC, 0xBD45, 0xD3DD, 0xBD46, 0xD3DE, 0xBD47, 0xD3DF, 0xBD48,\t0xD3E0, 0xBD49, 0xD3E1, 0xC6F5, 0xD3E2, 0xBD4A, 0xD3E3, 0xC6F6,\n\t0xD3E4, 0xBD4B, 0xD3E5, 0xBD4C, 0xD3E6, 0xBD4D, 0xD3E7, 0xBD4E,\t0xD3E8, 0xBD4F, 0xD3E9, 0xBD50, 0xD3EA, 0xBD51, 0xD3EB, 0xBD52,\n\t0xD3EC, 0xC6F7, 0xD3ED, 0xC6F8, 0xD3EE, 0xBD53, 0xD3EF, 0xBD54,\t0xD3F0, 0xC6F9, 0xD3F1, 0xBD55, 0xD3F2, 0xBD56, 0xD3F3, 0xBD57,\n\t0xD3F4, 0xC6FA, 0xD3F5, 0xBD58, 0xD3F6, 0xBD59, 0xD3F7, 0xBD5A,\t0xD3F8, 0xBD61, 0xD3F9, 0xBD62, 0xD3FA, 0xBD63, 0xD3FB, 0xBD64,\n\t0xD3FC, 0xC6FB, 0xD3FD, 0xC6FC, 0xD3FE, 0xBD65, 0xD3FF, 0xC6FD,\t0xD400, 0xBD66, 0xD401, 0xC6FE, 0xD402, 0xBD67, 0xD403, 0xBD68,\n\t0xD404, 0xBD69, 0xD405, 0xBD6A, 0xD406, 0xBD6B, 0xD407, 0xBD6C,\t0xD408, 0xC7A1, 0xD409, 0xBD6D, 0xD40A, 0xBD6E, 0xD40B, 0xBD6F,\n\t0xD40C, 0xBD70, 0xD40D, 0xBD71, 0xD40E, 0xBD72, 0xD40F, 0xBD73,\t0xD410, 0xBD74, 0xD411, 0xBD75, 0xD412, 0xBD76, 0xD413, 0xBD77,\n\t0xD414, 0xBD78, 0xD415, 0xBD79, 0xD416, 0xBD7A, 0xD417, 0xBD81,\t0xD418, 0xBD82, 0xD419, 0xBD83, 0xD41A, 0xBD84, 0xD41B, 0xBD85,\n\t0xD41C, 0xBD86, 0xD41D, 0xC7A2, 0xD41E, 0xBD87, 0xD41F, 0xBD88,\t0xD420, 0xBD89, 0xD421, 0xBD8A, 0xD422, 0xBD8B, 0xD423, 0xBD8C,\n\t0xD424, 0xBD8D, 0xD425, 0xBD8E, 0xD426, 0xBD8F, 0xD427, 0xBD90,\t0xD428, 0xBD91, 0xD429, 0xBD92, 0xD42A, 0xBD93, 0xD42B, 0xBD94,\n\t0xD42C, 0xBD95, 0xD42D, 0xBD96, 0xD42E, 0xBD97, 0xD42F, 0xBD98,\t0xD430, 0xBD99, 0xD431, 0xBD9A, 0xD432, 0xBD9B, 0xD433, 0xBD9C,\n\t0xD434, 0xBD9D, 0xD435, 0xBD9E, 0xD436, 0xBD9F, 0xD437, 0xBDA0,\t0xD438, 0xBE41, 0xD439, 0xBE42, 0xD43A, 0xBE43, 0xD43B, 0xBE44,\n\t0xD43C, 0xBE45, 0xD43D, 0xBE46, 0xD43E, 0xBE47, 0xD43F, 0xBE48,\t0xD440, 0xC7A3, 0xD441, 0xBE49, 0xD442, 0xBE4A, 0xD443, 0xBE4B,\n\t0xD444, 0xC7A4, 0xD445, 0xBE4C, 0xD446, 0xBE4D, 0xD447, 0xBE4E,\t0xD448, 0xBE4F, 0xD449, 0xBE50, 0xD44A, 0xBE51, 0xD44B, 0xBE52,\n\t0xD44C, 0xBE53, 0xD44D, 0xBE54, 0xD44E, 0xBE55, 0xD44F, 0xBE56,\t0xD450, 0xBE57, 0xD451, 0xBE58, 0xD452, 0xBE59, 0xD453, 0xBE5A,\n\t0xD454, 0xBE61, 0xD455, 0xBE62, 0xD456, 0xBE63, 0xD457, 0xBE64,\t0xD458, 0xBE65, 0xD459, 0xBE66, 0xD45A, 0xBE67, 0xD45B, 0xBE68,\n\t0xD45C, 0xC7A5, 0xD45D, 0xBE69, 0xD45E, 0xBE6A, 0xD45F, 0xBE6B,\t0xD460, 0xC7A6, 0xD461, 0xBE6C, 0xD462, 0xBE6D, 0xD463, 0xBE6E,\n\t0xD464, 0xC7A7, 0xD465, 0xBE6F, 0xD466, 0xBE70, 0xD467, 0xBE71,\t0xD468, 0xBE72, 0xD469, 0xBE73, 0xD46A, 0xBE74, 0xD46B, 0xBE75,\n\t0xD46C, 0xBE76, 0xD46D, 0xC7A8, 0xD46E, 0xBE77, 0xD46F, 0xC7A9,\t0xD470, 0xBE78, 0xD471, 0xBE79, 0xD472, 0xBE7A, 0xD473, 0xBE81,\n\t0xD474, 0xBE82, 0xD475, 0xBE83, 0xD476, 0xBE84, 0xD477, 0xBE85,\t0xD478, 0xC7AA, 0xD479, 0xC7AB, 0xD47A, 0xBE86, 0xD47B, 0xBE87,\n\t0xD47C, 0xC7AC, 0xD47D, 0xBE88, 0xD47E, 0xBE89, 0xD47F, 0xC7AD,\t0xD480, 0xC7AE, 0xD481, 0xBE8A, 0xD482, 0xC7AF, 0xD483, 0xBE8B,\n\t0xD484, 0xBE8C, 0xD485, 0xBE8D, 0xD486, 0xBE8E, 0xD487, 0xBE8F,\t0xD488, 0xC7B0, 0xD489, 0xC7B1, 0xD48A, 0xBE90, 0xD48B, 0xC7B2,\n\t0xD48C, 0xBE91, 0xD48D, 0xC7B3, 0xD48E, 0xBE92, 0xD48F, 0xBE93,\t0xD490, 0xBE94, 0xD491, 0xBE95, 0xD492, 0xBE96, 0xD493, 0xBE97,\n\t0xD494, 0xC7B4, 0xD495, 0xBE98, 0xD496, 0xBE99, 0xD497, 0xBE9A,\t0xD498, 0xBE9B, 0xD499, 0xBE9C, 0xD49A, 0xBE9D, 0xD49B, 0xBE9E,\n\t0xD49C, 0xBE9F, 0xD49D, 0xBEA0, 0xD49E, 0xBF41, 0xD49F, 0xBF42,\t0xD4A0, 0xBF43, 0xD4A1, 0xBF44, 0xD4A2, 0xBF45, 0xD4A3, 0xBF46,\n\t0xD4A4, 0xBF47, 0xD4A5, 0xBF48, 0xD4A6, 0xBF49, 0xD4A7, 0xBF4A,\t0xD4A8, 0xBF4B, 0xD4A9, 0xC7B5, 0xD4AA, 0xBF4C, 0xD4AB, 0xBF4D,\n\t0xD4AC, 0xBF4E, 0xD4AD, 0xBF4F, 0xD4AE, 0xBF50, 0xD4AF, 0xBF51,\t0xD4B0, 0xBF52, 0xD4B1, 0xBF53, 0xD4B2, 0xBF54, 0xD4B3, 0xBF55,\n\t0xD4B4, 0xBF56, 0xD4B5, 0xBF57, 0xD4B6, 0xBF58, 0xD4B7, 0xBF59,\t0xD4B8, 0xBF5A, 0xD4B9, 0xBF61, 0xD4BA, 0xBF62, 0xD4BB, 0xBF63,\n\t0xD4BC, 0xBF64, 0xD4BD, 0xBF65, 0xD4BE, 0xBF66, 0xD4BF, 0xBF67,\t0xD4C0, 0xBF68, 0xD4C1, 0xBF69, 0xD4C2, 0xBF6A, 0xD4C3, 0xBF6B,\n\t0xD4C4, 0xBF6C, 0xD4C5, 0xBF6D, 0xD4C6, 0xBF6E, 0xD4C7, 0xBF6F,\t0xD4C8, 0xBF70, 0xD4C9, 0xBF71, 0xD4CA, 0xBF72, 0xD4CB, 0xBF73,\n\t0xD4CC, 0xC7B6, 0xD4CD, 0xBF74, 0xD4CE, 0xBF75, 0xD4CF, 0xBF76,\t0xD4D0, 0xC7B7, 0xD4D1, 0xBF77, 0xD4D2, 0xBF78, 0xD4D3, 0xBF79,\n\t0xD4D4, 0xC7B8, 0xD4D5, 0xBF7A, 0xD4D6, 0xBF81, 0xD4D7, 0xBF82,\t0xD4D8, 0xBF83, 0xD4D9, 0xBF84, 0xD4DA, 0xBF85, 0xD4DB, 0xBF86,\n\t0xD4DC, 0xC7B9, 0xD4DD, 0xBF87, 0xD4DE, 0xBF88, 0xD4DF, 0xC7BA,\t0xD4E0, 0xBF89, 0xD4E1, 0xBF8A, 0xD4E2, 0xBF8B, 0xD4E3, 0xBF8C,\n\t0xD4E4, 0xBF8D, 0xD4E5, 0xBF8E, 0xD4E6, 0xBF8F, 0xD4E7, 0xBF90,\t0xD4E8, 0xC7BB, 0xD4E9, 0xBF91, 0xD4EA, 0xBF92, 0xD4EB, 0xBF93,\n\t0xD4EC, 0xC7BC, 0xD4ED, 0xBF94, 0xD4EE, 0xBF95, 0xD4EF, 0xBF96,\t0xD4F0, 0xC7BD, 0xD4F1, 0xBF97, 0xD4F2, 0xBF98, 0xD4F3, 0xBF99,\n\t0xD4F4, 0xBF9A, 0xD4F5, 0xBF9B, 0xD4F6, 0xBF9C, 0xD4F7, 0xBF9D,\t0xD4F8, 0xC7BE, 0xD4F9, 0xBF9E, 0xD4FA, 0xBF9F, 0xD4FB, 0xC7BF,\n\t0xD4FC, 0xBFA0, 0xD4FD, 0xC7C0, 0xD4FE, 0xC041, 0xD4FF, 0xC042,\t0xD500, 0xC043, 0xD501, 0xC044, 0xD502, 0xC045, 0xD503, 0xC046,\n\t0xD504, 0xC7C1, 0xD505, 0xC047, 0xD506, 0xC048, 0xD507, 0xC049,\t0xD508, 0xC7C2, 0xD509, 0xC04A, 0xD50A, 0xC04B, 0xD50B, 0xC04C,\n\t0xD50C, 0xC7C3, 0xD50D, 0xC04D, 0xD50E, 0xC04E, 0xD50F, 0xC04F,\t0xD510, 0xC050, 0xD511, 0xC051, 0xD512, 0xC052, 0xD513, 0xC053,\n\t0xD514, 0xC7C4, 0xD515, 0xC7C5, 0xD516, 0xC054, 0xD517, 0xC7C6,\t0xD518, 0xC055, 0xD519, 0xC056, 0xD51A, 0xC057, 0xD51B, 0xC058,\n\t0xD51C, 0xC059, 0xD51D, 0xC05A, 0xD51E, 0xC061, 0xD51F, 0xC062,\t0xD520, 0xC063, 0xD521, 0xC064, 0xD522, 0xC065, 0xD523, 0xC066,\n\t0xD524, 0xC067, 0xD525, 0xC068, 0xD526, 0xC069, 0xD527, 0xC06A,\t0xD528, 0xC06B, 0xD529, 0xC06C, 0xD52A, 0xC06D, 0xD52B, 0xC06E,\n\t0xD52C, 0xC06F, 0xD52D, 0xC070, 0xD52E, 0xC071, 0xD52F, 0xC072,\t0xD530, 0xC073, 0xD531, 0xC074, 0xD532, 0xC075, 0xD533, 0xC076,\n\t0xD534, 0xC077, 0xD535, 0xC078, 0xD536, 0xC079, 0xD537, 0xC07A,\t0xD538, 0xC081, 0xD539, 0xC082, 0xD53A, 0xC083, 0xD53B, 0xC084,\n\t0xD53C, 0xC7C7, 0xD53D, 0xC7C8, 0xD53E, 0xC085, 0xD53F, 0xC086,\t0xD540, 0xC7C9, 0xD541, 0xC087, 0xD542, 0xC088, 0xD543, 0xC089,\n\t0xD544, 0xC7CA, 0xD545, 0xC08A, 0xD546, 0xC08B, 0xD547, 0xC08C,\t0xD548, 0xC08D, 0xD549, 0xC08E, 0xD54A, 0xC08F, 0xD54B, 0xC090,\n\t0xD54C, 0xC7CB, 0xD54D, 0xC7CC, 0xD54E, 0xC091, 0xD54F, 0xC7CD,\t0xD550, 0xC092, 0xD551, 0xC7CE, 0xD552, 0xC093, 0xD553, 0xC094,\n\t0xD554, 0xC095, 0xD555, 0xC096, 0xD556, 0xC097, 0xD557, 0xC098,\t0xD558, 0xC7CF, 0xD559, 0xC7D0, 0xD55A, 0xC099, 0xD55B, 0xC09A,\n\t0xD55C, 0xC7D1, 0xD55D, 0xC09B, 0xD55E, 0xC09C, 0xD55F, 0xC09D,\t0xD560, 0xC7D2, 0xD561, 0xC09E, 0xD562, 0xC09F, 0xD563, 0xC0A0,\n\t0xD564, 0xC141, 0xD565, 0xC7D3, 0xD566, 0xC142, 0xD567, 0xC143,\t0xD568, 0xC7D4, 0xD569, 0xC7D5, 0xD56A, 0xC144, 0xD56B, 0xC7D6,\n\t0xD56C, 0xC145, 0xD56D, 0xC7D7, 0xD56E, 0xC146, 0xD56F, 0xC147,\t0xD570, 0xC148, 0xD571, 0xC149, 0xD572, 0xC14A, 0xD573, 0xC14B,\n\t0xD574, 0xC7D8, 0xD575, 0xC7D9, 0xD576, 0xC14C, 0xD577, 0xC14D,\t0xD578, 0xC7DA, 0xD579, 0xC14E, 0xD57A, 0xC14F, 0xD57B, 0xC150,\n\t0xD57C, 0xC7DB, 0xD57D, 0xC151, 0xD57E, 0xC152, 0xD57F, 0xC153,\t0xD580, 0xC154, 0xD581, 0xC155, 0xD582, 0xC156, 0xD583, 0xC157,\n\t0xD584, 0xC7DC, 0xD585, 0xC7DD, 0xD586, 0xC158, 0xD587, 0xC7DE,\t0xD588, 0xC7DF, 0xD589, 0xC7E0, 0xD58A, 0xC159, 0xD58B, 0xC15A,\n\t0xD58C, 0xC161, 0xD58D, 0xC162, 0xD58E, 0xC163, 0xD58F, 0xC164,\t0xD590, 0xC7E1, 0xD591, 0xC165, 0xD592, 0xC166, 0xD593, 0xC167,\n\t0xD594, 0xC168, 0xD595, 0xC169, 0xD596, 0xC16A, 0xD597, 0xC16B,\t0xD598, 0xC16C, 0xD599, 0xC16D, 0xD59A, 0xC16E, 0xD59B, 0xC16F,\n\t0xD59C, 0xC170, 0xD59D, 0xC171, 0xD59E, 0xC172, 0xD59F, 0xC173,\t0xD5A0, 0xC174, 0xD5A1, 0xC175, 0xD5A2, 0xC176, 0xD5A3, 0xC177,\n\t0xD5A4, 0xC178, 0xD5A5, 0xC7E2, 0xD5A6, 0xC179, 0xD5A7, 0xC17A,\t0xD5A8, 0xC181, 0xD5A9, 0xC182, 0xD5AA, 0xC183, 0xD5AB, 0xC184,\n\t0xD5AC, 0xC185, 0xD5AD, 0xC186, 0xD5AE, 0xC187, 0xD5AF, 0xC188,\t0xD5B0, 0xC189, 0xD5B1, 0xC18A, 0xD5B2, 0xC18B, 0xD5B3, 0xC18C,\n\t0xD5B4, 0xC18D, 0xD5B5, 0xC18E, 0xD5B6, 0xC18F, 0xD5B7, 0xC190,\t0xD5B8, 0xC191, 0xD5B9, 0xC192, 0xD5BA, 0xC193, 0xD5BB, 0xC194,\n\t0xD5BC, 0xC195, 0xD5BD, 0xC196, 0xD5BE, 0xC197, 0xD5BF, 0xC198,\t0xD5C0, 0xC199, 0xD5C1, 0xC19A, 0xD5C2, 0xC19B, 0xD5C3, 0xC19C,\n\t0xD5C4, 0xC19D, 0xD5C5, 0xC19E, 0xD5C6, 0xC19F, 0xD5C7, 0xC1A0,\t0xD5C8, 0xC7E3, 0xD5C9, 0xC7E4, 0xD5CA, 0xC241, 0xD5CB, 0xC242,\n\t0xD5CC, 0xC7E5, 0xD5CD, 0xC243, 0xD5CE, 0xC244, 0xD5CF, 0xC245,\t0xD5D0, 0xC7E6, 0xD5D1, 0xC246, 0xD5D2, 0xC7E7, 0xD5D3, 0xC247,\n\t0xD5D4, 0xC248, 0xD5D5, 0xC249, 0xD5D6, 0xC24A, 0xD5D7, 0xC24B,\t0xD5D8, 0xC7E8, 0xD5D9, 0xC7E9, 0xD5DA, 0xC24C, 0xD5DB, 0xC7EA,\n\t0xD5DC, 0xC24D, 0xD5DD, 0xC7EB, 0xD5DE, 0xC24E, 0xD5DF, 0xC24F,\t0xD5E0, 0xC250, 0xD5E1, 0xC251, 0xD5E2, 0xC252, 0xD5E3, 0xC253,\n\t0xD5E4, 0xC7EC, 0xD5E5, 0xC7ED, 0xD5E6, 0xC254, 0xD5E7, 0xC255,\t0xD5E8, 0xC7EE, 0xD5E9, 0xC256, 0xD5EA, 0xC257, 0xD5EB, 0xC258,\n\t0xD5EC, 0xC7EF, 0xD5ED, 0xC259, 0xD5EE, 0xC25A, 0xD5EF, 0xC261,\t0xD5F0, 0xC262, 0xD5F1, 0xC263, 0xD5F2, 0xC264, 0xD5F3, 0xC265,\n\t0xD5F4, 0xC7F0, 0xD5F5, 0xC7F1, 0xD5F6, 0xC266, 0xD5F7, 0xC7F2,\t0xD5F8, 0xC267, 0xD5F9, 0xC7F3, 0xD5FA, 0xC268, 0xD5FB, 0xC269,\n\t0xD5FC, 0xC26A, 0xD5FD, 0xC26B, 0xD5FE, 0xC26C, 0xD5FF, 0xC26D,\t0xD600, 0xC7F4, 0xD601, 0xC7F5, 0xD602, 0xC26E, 0xD603, 0xC26F,\n\t0xD604, 0xC7F6, 0xD605, 0xC270, 0xD606, 0xC271, 0xD607, 0xC272,\t0xD608, 0xC7F7, 0xD609, 0xC273, 0xD60A, 0xC274, 0xD60B, 0xC275,\n\t0xD60C, 0xC276, 0xD60D, 0xC277, 0xD60E, 0xC278, 0xD60F, 0xC279,\t0xD610, 0xC7F8, 0xD611, 0xC7F9, 0xD612, 0xC27A, 0xD613, 0xC7FA,\n\t0xD614, 0xC7FB, 0xD615, 0xC7FC, 0xD616, 0xC281, 0xD617, 0xC282,\t0xD618, 0xC283, 0xD619, 0xC284, 0xD61A, 0xC285, 0xD61B, 0xC286,\n\t0xD61C, 0xC7FD, 0xD61D, 0xC287, 0xD61E, 0xC288, 0xD61F, 0xC289,\t0xD620, 0xC7FE, 0xD621, 0xC28A, 0xD622, 0xC28B, 0xD623, 0xC28C,\n\t0xD624, 0xC8A1, 0xD625, 0xC28D, 0xD626, 0xC28E, 0xD627, 0xC28F,\t0xD628, 0xC290, 0xD629, 0xC291, 0xD62A, 0xC292, 0xD62B, 0xC293,\n\t0xD62C, 0xC294, 0xD62D, 0xC8A2, 0xD62E, 0xC295, 0xD62F, 0xC296,\t0xD630, 0xC297, 0xD631, 0xC298, 0xD632, 0xC299, 0xD633, 0xC29A,\n\t0xD634, 0xC29B, 0xD635, 0xC29C, 0xD636, 0xC29D, 0xD637, 0xC29E,\t0xD638, 0xC8A3, 0xD639, 0xC8A4, 0xD63A, 0xC29F, 0xD63B, 0xC2A0,\n\t0xD63C, 0xC8A5, 0xD63D, 0xC341, 0xD63E, 0xC342, 0xD63F, 0xC343,\t0xD640, 0xC8A6, 0xD641, 0xC344, 0xD642, 0xC345, 0xD643, 0xC346,\n\t0xD644, 0xC347, 0xD645, 0xC8A7, 0xD646, 0xC348, 0xD647, 0xC349,\t0xD648, 0xC8A8, 0xD649, 0xC8A9, 0xD64A, 0xC34A, 0xD64B, 0xC8AA,\n\t0xD64C, 0xC34B, 0xD64D, 0xC8AB, 0xD64E, 0xC34C, 0xD64F, 0xC34D,\t0xD650, 0xC34E, 0xD651, 0xC8AC, 0xD652, 0xC34F, 0xD653, 0xC350,\n\t0xD654, 0xC8AD, 0xD655, 0xC8AE, 0xD656, 0xC351, 0xD657, 0xC352,\t0xD658, 0xC8AF, 0xD659, 0xC353, 0xD65A, 0xC354, 0xD65B, 0xC355,\n\t0xD65C, 0xC8B0, 0xD65D, 0xC356, 0xD65E, 0xC357, 0xD65F, 0xC358,\t0xD660, 0xC359, 0xD661, 0xC35A, 0xD662, 0xC361, 0xD663, 0xC362,\n\t0xD664, 0xC363, 0xD665, 0xC364, 0xD666, 0xC365, 0xD667, 0xC8B1,\t0xD668, 0xC366, 0xD669, 0xC8B2, 0xD66A, 0xC367, 0xD66B, 0xC368,\n\t0xD66C, 0xC369, 0xD66D, 0xC36A, 0xD66E, 0xC36B, 0xD66F, 0xC36C,\t0xD670, 0xC8B3, 0xD671, 0xC8B4, 0xD672, 0xC36D, 0xD673, 0xC36E,\n\t0xD674, 0xC8B5, 0xD675, 0xC36F, 0xD676, 0xC370, 0xD677, 0xC371,\t0xD678, 0xC372, 0xD679, 0xC373, 0xD67A, 0xC374, 0xD67B, 0xC375,\n\t0xD67C, 0xC376, 0xD67D, 0xC377, 0xD67E, 0xC378, 0xD67F, 0xC379,\t0xD680, 0xC37A, 0xD681, 0xC381, 0xD682, 0xC382, 0xD683, 0xC8B6,\n\t0xD684, 0xC383, 0xD685, 0xC8B7, 0xD686, 0xC384, 0xD687, 0xC385,\t0xD688, 0xC386, 0xD689, 0xC387, 0xD68A, 0xC388, 0xD68B, 0xC389,\n\t0xD68C, 0xC8B8, 0xD68D, 0xC8B9, 0xD68E, 0xC38A, 0xD68F, 0xC38B,\t0xD690, 0xC8BA, 0xD691, 0xC38C, 0xD692, 0xC38D, 0xD693, 0xC38E,\n\t0xD694, 0xC8BB, 0xD695, 0xC38F, 0xD696, 0xC390, 0xD697, 0xC391,\t0xD698, 0xC392, 0xD699, 0xC393, 0xD69A, 0xC394, 0xD69B, 0xC395,\n\t0xD69C, 0xC396, 0xD69D, 0xC8BC, 0xD69E, 0xC397, 0xD69F, 0xC8BD,\t0xD6A0, 0xC398, 0xD6A1, 0xC8BE, 0xD6A2, 0xC399, 0xD6A3, 0xC39A,\n\t0xD6A4, 0xC39B, 0xD6A5, 0xC39C, 0xD6A6, 0xC39D, 0xD6A7, 0xC39E,\t0xD6A8, 0xC8BF, 0xD6A9, 0xC39F, 0xD6AA, 0xC3A0, 0xD6AB, 0xC441,\n\t0xD6AC, 0xC8C0, 0xD6AD, 0xC442, 0xD6AE, 0xC443, 0xD6AF, 0xC444,\t0xD6B0, 0xC8C1, 0xD6B1, 0xC445, 0xD6B2, 0xC446, 0xD6B3, 0xC447,\n\t0xD6B4, 0xC448, 0xD6B5, 0xC449, 0xD6B6, 0xC44A, 0xD6B7, 0xC44B,\t0xD6B8, 0xC44C, 0xD6B9, 0xC8C2, 0xD6BA, 0xC44D, 0xD6BB, 0xC8C3,\n\t0xD6BC, 0xC44E, 0xD6BD, 0xC44F, 0xD6BE, 0xC450, 0xD6BF, 0xC451,\t0xD6C0, 0xC452, 0xD6C1, 0xC453, 0xD6C2, 0xC454, 0xD6C3, 0xC455,\n\t0xD6C4, 0xC8C4, 0xD6C5, 0xC8C5, 0xD6C6, 0xC456, 0xD6C7, 0xC457,\t0xD6C8, 0xC8C6, 0xD6C9, 0xC458, 0xD6CA, 0xC459, 0xD6CB, 0xC45A,\n\t0xD6CC, 0xC8C7, 0xD6CD, 0xC461, 0xD6CE, 0xC462, 0xD6CF, 0xC463,\t0xD6D0, 0xC464, 0xD6D1, 0xC8C8, 0xD6D2, 0xC465, 0xD6D3, 0xC466,\n\t0xD6D4, 0xC8C9, 0xD6D5, 0xC467, 0xD6D6, 0xC468, 0xD6D7, 0xC8CA,\t0xD6D8, 0xC469, 0xD6D9, 0xC8CB, 0xD6DA, 0xC46A, 0xD6DB, 0xC46B,\n\t0xD6DC, 0xC46C, 0xD6DD, 0xC46D, 0xD6DE, 0xC46E, 0xD6DF, 0xC46F,\t0xD6E0, 0xC8CC, 0xD6E1, 0xC470, 0xD6E2, 0xC471, 0xD6E3, 0xC472,\n\t0xD6E4, 0xC8CD, 0xD6E5, 0xC473, 0xD6E6, 0xC474, 0xD6E7, 0xC475,\t0xD6E8, 0xC8CE, 0xD6E9, 0xC476, 0xD6EA, 0xC477, 0xD6EB, 0xC478,\n\t0xD6EC, 0xC479, 0xD6ED, 0xC47A, 0xD6EE, 0xC481, 0xD6EF, 0xC482,\t0xD6F0, 0xC8CF, 0xD6F1, 0xC483, 0xD6F2, 0xC484, 0xD6F3, 0xC485,\n\t0xD6F4, 0xC486, 0xD6F5, 0xC8D0, 0xD6F6, 0xC487, 0xD6F7, 0xC488,\t0xD6F8, 0xC489, 0xD6F9, 0xC48A, 0xD6FA, 0xC48B, 0xD6FB, 0xC48C,\n\t0xD6FC, 0xC8D1, 0xD6FD, 0xC8D2, 0xD6FE, 0xC48D, 0xD6FF, 0xC48E,\t0xD700, 0xC8D3, 0xD701, 0xC48F, 0xD702, 0xC490, 0xD703, 0xC491,\n\t0xD704, 0xC8D4, 0xD705, 0xC492, 0xD706, 0xC493, 0xD707, 0xC494,\t0xD708, 0xC495, 0xD709, 0xC496, 0xD70A, 0xC497, 0xD70B, 0xC498,\n\t0xD70C, 0xC499, 0xD70D, 0xC49A, 0xD70E, 0xC49B, 0xD70F, 0xC49C,\t0xD710, 0xC49D, 0xD711, 0xC8D5, 0xD712, 0xC49E, 0xD713, 0xC49F,\n\t0xD714, 0xC4A0, 0xD715, 0xC541, 0xD716, 0xC542, 0xD717, 0xC543,\t0xD718, 0xC8D6, 0xD719, 0xC8D7, 0xD71A, 0xC544, 0xD71B, 0xC545,\n\t0xD71C, 0xC8D8, 0xD71D, 0xC546, 0xD71E, 0xC547, 0xD71F, 0xC548,\t0xD720, 0xC8D9, 0xD721, 0xC549, 0xD722, 0xC54A, 0xD723, 0xC54B,\n\t0xD724, 0xC54C, 0xD725, 0xC54D, 0xD726, 0xC54E, 0xD727, 0xC54F,\t0xD728, 0xC8DA, 0xD729, 0xC8DB, 0xD72A, 0xC550, 0xD72B, 0xC8DC,\n\t0xD72C, 0xC551, 0xD72D, 0xC8DD, 0xD72E, 0xC552, 0xD72F, 0xC553,\t0xD730, 0xC554, 0xD731, 0xC555, 0xD732, 0xC556, 0xD733, 0xC557,\n\t0xD734, 0xC8DE, 0xD735, 0xC8DF, 0xD736, 0xC558, 0xD737, 0xC559,\t0xD738, 0xC8E0, 0xD739, 0xC55A, 0xD73A, 0xC561, 0xD73B, 0xC562,\n\t0xD73C, 0xC8E1, 0xD73D, 0xC563, 0xD73E, 0xC564, 0xD73F, 0xC565,\t0xD740, 0xC566, 0xD741, 0xC567, 0xD742, 0xC568, 0xD743, 0xC569,\n\t0xD744, 0xC8E2, 0xD745, 0xC56A, 0xD746, 0xC56B, 0xD747, 0xC8E3,\t0xD748, 0xC56C, 0xD749, 0xC8E4, 0xD74A, 0xC56D, 0xD74B, 0xC56E,\n\t0xD74C, 0xC56F, 0xD74D, 0xC570, 0xD74E, 0xC571, 0xD74F, 0xC572,\t0xD750, 0xC8E5, 0xD751, 0xC8E6, 0xD752, 0xC573, 0xD753, 0xC574,\n\t0xD754, 0xC8E7, 0xD755, 0xC575, 0xD756, 0xC8E8, 0xD757, 0xC8E9,\t0xD758, 0xC8EA, 0xD759, 0xC8EB, 0xD75A, 0xC576, 0xD75B, 0xC577,\n\t0xD75C, 0xC578, 0xD75D, 0xC579, 0xD75E, 0xC57A, 0xD75F, 0xC581,\t0xD760, 0xC8EC, 0xD761, 0xC8ED, 0xD762, 0xC582, 0xD763, 0xC8EE,\n\t0xD764, 0xC583, 0xD765, 0xC8EF, 0xD766, 0xC584, 0xD767, 0xC585,\t0xD768, 0xC586, 0xD769, 0xC8F0, 0xD76A, 0xC587, 0xD76B, 0xC588,\n\t0xD76C, 0xC8F1, 0xD76D, 0xC589, 0xD76E, 0xC58A, 0xD76F, 0xC58B,\t0xD770, 0xC8F2, 0xD771, 0xC58C, 0xD772, 0xC58D, 0xD773, 0xC58E,\n\t0xD774, 0xC8F3, 0xD775, 0xC58F, 0xD776, 0xC590, 0xD777, 0xC591,\t0xD778, 0xC592, 0xD779, 0xC593, 0xD77A, 0xC594, 0xD77B, 0xC595,\n\t0xD77C, 0xC8F4, 0xD77D, 0xC8F5, 0xD77E, 0xC596, 0xD77F, 0xC597,\t0xD780, 0xC598, 0xD781, 0xC8F6, 0xD782, 0xC599, 0xD783, 0xC59A,\n\t0xD784, 0xC59B, 0xD785, 0xC59C, 0xD786, 0xC59D, 0xD787, 0xC59E,\t0xD788, 0xC8F7, 0xD789, 0xC8F8, 0xD78A, 0xC59F, 0xD78B, 0xC5A0,\n\t0xD78C, 0xC8F9, 0xD78D, 0xC641, 0xD78E, 0xC642, 0xD78F, 0xC643,\t0xD790, 0xC8FA, 0xD791, 0xC644, 0xD792, 0xC645, 0xD793, 0xC646,\n\t0xD794, 0xC647, 0xD795, 0xC648, 0xD796, 0xC649, 0xD797, 0xC64A,\t0xD798, 0xC8FB, 0xD799, 0xC8FC, 0xD79A, 0xC64B, 0xD79B, 0xC8FD,\n\t0xD79C, 0xC64C, 0xD79D, 0xC8FE, 0xD79E, 0xC64D, 0xD79F, 0xC64E,\t0xD7A0, 0xC64F, 0xD7A1, 0xC650, 0xD7A2, 0xC651, 0xD7A3, 0xC652,\n\t0xF900, 0xCBD0, 0xF901, 0xCBD6, 0xF902, 0xCBE7, 0xF903, 0xCDCF,\t0xF904, 0xCDE8, 0xF905, 0xCEAD, 0xF906, 0xCFFB, 0xF907, 0xD0A2,\n\t0xF908, 0xD0B8, 0xF909, 0xD0D0, 0xF90A, 0xD0DD, 0xF90B, 0xD1D4,\t0xF90C, 0xD1D5, 0xF90D, 0xD1D8, 0xF90E, 0xD1DB, 0xF90F, 0xD1DC,\n\t0xF910, 0xD1DD, 0xF911, 0xD1DE, 0xF912, 0xD1DF, 0xF913, 0xD1E0,\t0xF914, 0xD1E2, 0xF915, 0xD1E3, 0xF916, 0xD1E4, 0xF917, 0xD1E5,\n\t0xF918, 0xD1E6, 0xF919, 0xD1E8, 0xF91A, 0xD1E9, 0xF91B, 0xD1EA,\t0xF91C, 0xD1EB, 0xF91D, 0xD1ED, 0xF91E, 0xD1EF, 0xF91F, 0xD1F0,\n\t0xF920, 0xD1F2, 0xF921, 0xD1F6, 0xF922, 0xD1FA, 0xF923, 0xD1FC,\t0xF924, 0xD1FD, 0xF925, 0xD1FE, 0xF926, 0xD2A2, 0xF927, 0xD2A3,\n\t0xF928, 0xD2A7, 0xF929, 0xD2A8, 0xF92A, 0xD2A9, 0xF92B, 0xD2AA,\t0xF92C, 0xD2AB, 0xF92D, 0xD2AD, 0xF92E, 0xD2B2, 0xF92F, 0xD2BE,\n\t0xF930, 0xD2C2, 0xF931, 0xD2C3, 0xF932, 0xD2C4, 0xF933, 0xD2C6,\t0xF934, 0xD2C7, 0xF935, 0xD2C8, 0xF936, 0xD2C9, 0xF937, 0xD2CA,\n\t0xF938, 0xD2CB, 0xF939, 0xD2CD, 0xF93A, 0xD2CE, 0xF93B, 0xD2CF,\t0xF93C, 0xD2D0, 0xF93D, 0xD2D1, 0xF93E, 0xD2D2, 0xF93F, 0xD2D3,\n\t0xF940, 0xD2D4, 0xF941, 0xD2D5, 0xF942, 0xD2D6, 0xF943, 0xD2D7,\t0xF944, 0xD2D9, 0xF945, 0xD2DA, 0xF946, 0xD2DE, 0xF947, 0xD2DF,\n\t0xF948, 0xD2E1, 0xF949, 0xD2E2, 0xF94A, 0xD2E4, 0xF94B, 0xD2E5,\t0xF94C, 0xD2E6, 0xF94D, 0xD2E7, 0xF94E, 0xD2E8, 0xF94F, 0xD2E9,\n\t0xF950, 0xD2EA, 0xF951, 0xD2EB, 0xF952, 0xD2F0, 0xF953, 0xD2F1,\t0xF954, 0xD2F2, 0xF955, 0xD2F3, 0xF956, 0xD2F4, 0xF957, 0xD2F5,\n\t0xF958, 0xD2F7, 0xF959, 0xD2F8, 0xF95A, 0xD4E6, 0xF95B, 0xD4FC,\t0xF95C, 0xD5A5, 0xF95D, 0xD5AB, 0xF95E, 0xD5AE, 0xF95F, 0xD6B8,\n\t0xF960, 0xD6CD, 0xF961, 0xD7CB, 0xF962, 0xD7E4, 0xF963, 0xDBC5,\t0xF964, 0xDBE4, 0xF965, 0xDCA5, 0xF966, 0xDDA5, 0xF967, 0xDDD5,\n\t0xF968, 0xDDF4, 0xF969, 0xDEFC, 0xF96A, 0xDEFE, 0xF96B, 0xDFB3,\t0xF96C, 0xDFE1, 0xF96D, 0xDFE8, 0xF96E, 0xE0F1, 0xF96F, 0xE1AD,\n\t0xF970, 0xE1ED, 0xF971, 0xE3F5, 0xF972, 0xE4A1, 0xF973, 0xE4A9,\t0xF974, 0xE5AE, 0xF975, 0xE5B1, 0xF976, 0xE5B2, 0xF977, 0xE5B9,\n\t0xF978, 0xE5BB, 0xF979, 0xE5BC, 0xF97A, 0xE5C4, 0xF97B, 0xE5CE,\t0xF97C, 0xE5D0, 0xF97D, 0xE5D2, 0xF97E, 0xE5D6, 0xF97F, 0xE5FA,\n\t0xF980, 0xE5FB, 0xF981, 0xE5FC, 0xF982, 0xE5FE, 0xF983, 0xE6A1,\t0xF984, 0xE6A4, 0xF985, 0xE6A7, 0xF986, 0xE6AD, 0xF987, 0xE6AF,\n\t0xF988, 0xE6B0, 0xF989, 0xE6B1, 0xF98A, 0xE6B3, 0xF98B, 0xE6B7,\t0xF98C, 0xE6B8, 0xF98D, 0xE6BC, 0xF98E, 0xE6C4, 0xF98F, 0xE6C6,\n\t0xF990, 0xE6C7, 0xF991, 0xE6CA, 0xF992, 0xE6D2, 0xF993, 0xE6D6,\t0xF994, 0xE6D9, 0xF995, 0xE6DC, 0xF996, 0xE6DF, 0xF997, 0xE6E1,\n\t0xF998, 0xE6E4, 0xF999, 0xE6E5, 0xF99A, 0xE6E6, 0xF99B, 0xE6E8,\t0xF99C, 0xE6EA, 0xF99D, 0xE6EB, 0xF99E, 0xE6EC, 0xF99F, 0xE6EF,\n\t0xF9A0, 0xE6F1, 0xF9A1, 0xE6F2, 0xF9A2, 0xE6F5, 0xF9A3, 0xE6F6,\t0xF9A4, 0xE6F7, 0xF9A5, 0xE6F9, 0xF9A6, 0xE7A1, 0xF9A7, 0xE7A6,\n\t0xF9A8, 0xE7A9, 0xF9A9, 0xE7AA, 0xF9AA, 0xE7AC, 0xF9AB, 0xE7AD,\t0xF9AC, 0xE7B0, 0xF9AD, 0xE7BF, 0xF9AE, 0xE7C1, 0xF9AF, 0xE7C6,\n\t0xF9B0, 0xE7C7, 0xF9B1, 0xE7CB, 0xF9B2, 0xE7CD, 0xF9B3, 0xE7CF,\t0xF9B4, 0xE7D0, 0xF9B5, 0xE7D3, 0xF9B6, 0xE7DF, 0xF9B7, 0xE7E4,\n\t0xF9B8, 0xE7E6, 0xF9B9, 0xE7F7, 0xF9BA, 0xE8E7, 0xF9BB, 0xE8E8,\t0xF9BC, 0xE8F0, 0xF9BD, 0xE8F1, 0xF9BE, 0xE8F7, 0xF9BF, 0xE8F9,\n\t0xF9C0, 0xE8FB, 0xF9C1, 0xE8FE, 0xF9C2, 0xE9A7, 0xF9C3, 0xE9AC,\t0xF9C4, 0xE9CC, 0xF9C5, 0xE9F7, 0xF9C6, 0xEAC1, 0xF9C7, 0xEAE5,\n\t0xF9C8, 0xEAF4, 0xF9C9, 0xEAF7, 0xF9CA, 0xEAFC, 0xF9CB, 0xEAFE,\t0xF9CC, 0xEBA4, 0xF9CD, 0xEBA7, 0xF9CE, 0xEBA9, 0xF9CF, 0xEBAA,\n\t0xF9D0, 0xEBBA, 0xF9D1, 0xEBBB, 0xF9D2, 0xEBBD, 0xF9D3, 0xEBC1,\t0xF9D4, 0xEBC2, 0xF9D5, 0xEBC6, 0xF9D6, 0xEBC7, 0xF9D7, 0xEBCC,\n\t0xF9D8, 0xEBCF, 0xF9D9, 0xEBD0, 0xF9DA, 0xEBD1, 0xF9DB, 0xEBD2,\t0xF9DC, 0xEBD8, 0xF9DD, 0xECA6, 0xF9DE, 0xECA7, 0xF9DF, 0xECAA,\n\t0xF9E0, 0xECAF, 0xF9E1, 0xECB0, 0xF9E2, 0xECB1, 0xF9E3, 0xECB2,\t0xF9E4, 0xECB5, 0xF9E5, 0xECB8, 0xF9E6, 0xECBA, 0xF9E7, 0xECC0,\n\t0xF9E8, 0xECC1, 0xF9E9, 0xECC5, 0xF9EA, 0xECC6, 0xF9EB, 0xECC9,\t0xF9EC, 0xECCA, 0xF9ED, 0xECD5, 0xF9EE, 0xECDD, 0xF9EF, 0xECDE,\n\t0xF9F0, 0xECE1, 0xF9F1, 0xECE4, 0xF9F2, 0xECE7, 0xF9F3, 0xECE8,\t0xF9F4, 0xECF7, 0xF9F5, 0xECF8, 0xF9F6, 0xECFA, 0xF9F7, 0xEDA1,\n\t0xF9F8, 0xEDA2, 0xF9F9, 0xEDA3, 0xF9FA, 0xEDEE, 0xF9FB, 0xEEDB,\t0xF9FC, 0xF2BD, 0xF9FD, 0xF2FA, 0xF9FE, 0xF3B1, 0xF9FF, 0xF4A7,\n\t0xFA00, 0xF4EE, 0xFA01, 0xF6F4, 0xFA02, 0xF6F6, 0xFA03, 0xF7B8,\t0xFA04, 0xF7C8, 0xFA05, 0xF7D3, 0xFA06, 0xF8DB, 0xFA07, 0xF8F0,\n\t0xFA08, 0xFAA1, 0xFA09, 0xFAA2, 0xFA0A, 0xFAE6, 0xFA0B, 0xFCA9,\t0xFF01, 0xA3A1, 0xFF02, 0xA3A2, 0xFF03, 0xA3A3, 0xFF04, 0xA3A4,\n\t0xFF05, 0xA3A5, 0xFF06, 0xA3A6, 0xFF07, 0xA3A7, 0xFF08, 0xA3A8,\t0xFF09, 0xA3A9, 0xFF0A, 0xA3AA, 0xFF0B, 0xA3AB, 0xFF0C, 0xA3AC,\n\t0xFF0D, 0xA3AD, 0xFF0E, 0xA3AE, 0xFF0F, 0xA3AF, 0xFF10, 0xA3B0,\t0xFF11, 0xA3B1, 0xFF12, 0xA3B2, 0xFF13, 0xA3B3, 0xFF14, 0xA3B4,\n\t0xFF15, 0xA3B5, 0xFF16, 0xA3B6, 0xFF17, 0xA3B7, 0xFF18, 0xA3B8,\t0xFF19, 0xA3B9, 0xFF1A, 0xA3BA, 0xFF1B, 0xA3BB, 0xFF1C, 0xA3BC,\n\t0xFF1D, 0xA3BD, 0xFF1E, 0xA3BE, 0xFF1F, 0xA3BF, 0xFF20, 0xA3C0,\t0xFF21, 0xA3C1, 0xFF22, 0xA3C2, 0xFF23, 0xA3C3, 0xFF24, 0xA3C4,\n\t0xFF25, 0xA3C5, 0xFF26, 0xA3C6, 0xFF27, 0xA3C7, 0xFF28, 0xA3C8,\t0xFF29, 0xA3C9, 0xFF2A, 0xA3CA, 0xFF2B, 0xA3CB, 0xFF2C, 0xA3CC,\n\t0xFF2D, 0xA3CD, 0xFF2E, 0xA3CE, 0xFF2F, 0xA3CF, 0xFF30, 0xA3D0,\t0xFF31, 0xA3D1, 0xFF32, 0xA3D2, 0xFF33, 0xA3D3, 0xFF34, 0xA3D4,\n\t0xFF35, 0xA3D5, 0xFF36, 0xA3D6, 0xFF37, 0xA3D7, 0xFF38, 0xA3D8,\t0xFF39, 0xA3D9, 0xFF3A, 0xA3DA, 0xFF3B, 0xA3DB, 0xFF3C, 0xA1AC,\n\t0xFF3D, 0xA3DD, 0xFF3E, 0xA3DE, 0xFF3F, 0xA3DF, 0xFF40, 0xA3E0,\t0xFF41, 0xA3E1, 0xFF42, 0xA3E2, 0xFF43, 0xA3E3, 0xFF44, 0xA3E4,\n\t0xFF45, 0xA3E5, 0xFF46, 0xA3E6, 0xFF47, 0xA3E7, 0xFF48, 0xA3E8,\t0xFF49, 0xA3E9, 0xFF4A, 0xA3EA, 0xFF4B, 0xA3EB, 0xFF4C, 0xA3EC,\n\t0xFF4D, 0xA3ED, 0xFF4E, 0xA3EE, 0xFF4F, 0xA3EF, 0xFF50, 0xA3F0,\t0xFF51, 0xA3F1, 0xFF52, 0xA3F2, 0xFF53, 0xA3F3, 0xFF54, 0xA3F4,\n\t0xFF55, 0xA3F5, 0xFF56, 0xA3F6, 0xFF57, 0xA3F7, 0xFF58, 0xA3F8,\t0xFF59, 0xA3F9, 0xFF5A, 0xA3FA, 0xFF5B, 0xA3FB, 0xFF5C, 0xA3FC,\n\t0xFF5D, 0xA3FD, 0xFF5E, 0xA2A6, 0xFFE0, 0xA1CB, 0xFFE1, 0xA1CC,\t0xFFE2, 0xA1FE, 0xFFE3, 0xA3FE, 0xFFE5, 0xA1CD, 0xFFE6, 0xA3DC,\n\t0, 0\n};\n\nstatic const WCHAR oem2uni949[] = {\t/* Korean --> Unicode pairs */\n\t0x8141, 0xAC02, 0x8142, 0xAC03, 0x8143, 0xAC05, 0x8144, 0xAC06,\t0x8145, 0xAC0B, 0x8146, 0xAC0C, 0x8147, 0xAC0D, 0x8148, 0xAC0E,\n\t0x8149, 0xAC0F, 0x814A, 0xAC18, 0x814B, 0xAC1E, 0x814C, 0xAC1F,\t0x814D, 0xAC21, 0x814E, 0xAC22, 0x814F, 0xAC23, 0x8150, 0xAC25,\n\t0x8151, 0xAC26, 0x8152, 0xAC27, 0x8153, 0xAC28, 0x8154, 0xAC29,\t0x8155, 0xAC2A, 0x8156, 0xAC2B, 0x8157, 0xAC2E, 0x8158, 0xAC32,\n\t0x8159, 0xAC33, 0x815A, 0xAC34, 0x8161, 0xAC35, 0x8162, 0xAC36,\t0x8163, 0xAC37, 0x8164, 0xAC3A, 0x8165, 0xAC3B, 0x8166, 0xAC3D,\n\t0x8167, 0xAC3E, 0x8168, 0xAC3F, 0x8169, 0xAC41, 0x816A, 0xAC42,\t0x816B, 0xAC43, 0x816C, 0xAC44, 0x816D, 0xAC45, 0x816E, 0xAC46,\n\t0x816F, 0xAC47, 0x8170, 0xAC48, 0x8171, 0xAC49, 0x8172, 0xAC4A,\t0x8173, 0xAC4C, 0x8174, 0xAC4E, 0x8175, 0xAC4F, 0x8176, 0xAC50,\n\t0x8177, 0xAC51, 0x8178, 0xAC52, 0x8179, 0xAC53, 0x817A, 0xAC55,\t0x8181, 0xAC56, 0x8182, 0xAC57, 0x8183, 0xAC59, 0x8184, 0xAC5A,\n\t0x8185, 0xAC5B, 0x8186, 0xAC5D, 0x8187, 0xAC5E, 0x8188, 0xAC5F,\t0x8189, 0xAC60, 0x818A, 0xAC61, 0x818B, 0xAC62, 0x818C, 0xAC63,\n\t0x818D, 0xAC64, 0x818E, 0xAC65, 0x818F, 0xAC66, 0x8190, 0xAC67,\t0x8191, 0xAC68, 0x8192, 0xAC69, 0x8193, 0xAC6A, 0x8194, 0xAC6B,\n\t0x8195, 0xAC6C, 0x8196, 0xAC6D, 0x8197, 0xAC6E, 0x8198, 0xAC6F,\t0x8199, 0xAC72, 0x819A, 0xAC73, 0x819B, 0xAC75, 0x819C, 0xAC76,\n\t0x819D, 0xAC79, 0x819E, 0xAC7B, 0x819F, 0xAC7C, 0x81A0, 0xAC7D,\t0x81A1, 0xAC7E, 0x81A2, 0xAC7F, 0x81A3, 0xAC82, 0x81A4, 0xAC87,\n\t0x81A5, 0xAC88, 0x81A6, 0xAC8D, 0x81A7, 0xAC8E, 0x81A8, 0xAC8F,\t0x81A9, 0xAC91, 0x81AA, 0xAC92, 0x81AB, 0xAC93, 0x81AC, 0xAC95,\n\t0x81AD, 0xAC96, 0x81AE, 0xAC97, 0x81AF, 0xAC98, 0x81B0, 0xAC99,\t0x81B1, 0xAC9A, 0x81B2, 0xAC9B, 0x81B3, 0xAC9E, 0x81B4, 0xACA2,\n\t0x81B5, 0xACA3, 0x81B6, 0xACA4, 0x81B7, 0xACA5, 0x81B8, 0xACA6,\t0x81B9, 0xACA7, 0x81BA, 0xACAB, 0x81BB, 0xACAD, 0x81BC, 0xACAE,\n\t0x81BD, 0xACB1, 0x81BE, 0xACB2, 0x81BF, 0xACB3, 0x81C0, 0xACB4,\t0x81C1, 0xACB5, 0x81C2, 0xACB6, 0x81C3, 0xACB7, 0x81C4, 0xACBA,\n\t0x81C5, 0xACBE, 0x81C6, 0xACBF, 0x81C7, 0xACC0, 0x81C8, 0xACC2,\t0x81C9, 0xACC3, 0x81CA, 0xACC5, 0x81CB, 0xACC6, 0x81CC, 0xACC7,\n\t0x81CD, 0xACC9, 0x81CE, 0xACCA, 0x81CF, 0xACCB, 0x81D0, 0xACCD,\t0x81D1, 0xACCE, 0x81D2, 0xACCF, 0x81D3, 0xACD0, 0x81D4, 0xACD1,\n\t0x81D5, 0xACD2, 0x81D6, 0xACD3, 0x81D7, 0xACD4, 0x81D8, 0xACD6,\t0x81D9, 0xACD8, 0x81DA, 0xACD9, 0x81DB, 0xACDA, 0x81DC, 0xACDB,\n\t0x81DD, 0xACDC, 0x81DE, 0xACDD, 0x81DF, 0xACDE, 0x81E0, 0xACDF,\t0x81E1, 0xACE2, 0x81E2, 0xACE3, 0x81E3, 0xACE5, 0x81E4, 0xACE6,\n\t0x81E5, 0xACE9, 0x81E6, 0xACEB, 0x81E7, 0xACED, 0x81E8, 0xACEE,\t0x81E9, 0xACF2, 0x81EA, 0xACF4, 0x81EB, 0xACF7, 0x81EC, 0xACF8,\n\t0x81ED, 0xACF9, 0x81EE, 0xACFA, 0x81EF, 0xACFB, 0x81F0, 0xACFE,\t0x81F1, 0xACFF, 0x81F2, 0xAD01, 0x81F3, 0xAD02, 0x81F4, 0xAD03,\n\t0x81F5, 0xAD05, 0x81F6, 0xAD07, 0x81F7, 0xAD08, 0x81F8, 0xAD09,\t0x81F9, 0xAD0A, 0x81FA, 0xAD0B, 0x81FB, 0xAD0E, 0x81FC, 0xAD10,\n\t0x81FD, 0xAD12, 0x81FE, 0xAD13, 0x8241, 0xAD14, 0x8242, 0xAD15,\t0x8243, 0xAD16, 0x8244, 0xAD17, 0x8245, 0xAD19, 0x8246, 0xAD1A,\n\t0x8247, 0xAD1B, 0x8248, 0xAD1D, 0x8249, 0xAD1E, 0x824A, 0xAD1F,\t0x824B, 0xAD21, 0x824C, 0xAD22, 0x824D, 0xAD23, 0x824E, 0xAD24,\n\t0x824F, 0xAD25, 0x8250, 0xAD26, 0x8251, 0xAD27, 0x8252, 0xAD28,\t0x8253, 0xAD2A, 0x8254, 0xAD2B, 0x8255, 0xAD2E, 0x8256, 0xAD2F,\n\t0x8257, 0xAD30, 0x8258, 0xAD31, 0x8259, 0xAD32, 0x825A, 0xAD33,\t0x8261, 0xAD36, 0x8262, 0xAD37, 0x8263, 0xAD39, 0x8264, 0xAD3A,\n\t0x8265, 0xAD3B, 0x8266, 0xAD3D, 0x8267, 0xAD3E, 0x8268, 0xAD3F,\t0x8269, 0xAD40, 0x826A, 0xAD41, 0x826B, 0xAD42, 0x826C, 0xAD43,\n\t0x826D, 0xAD46, 0x826E, 0xAD48, 0x826F, 0xAD4A, 0x8270, 0xAD4B,\t0x8271, 0xAD4C, 0x8272, 0xAD4D, 0x8273, 0xAD4E, 0x8274, 0xAD4F,\n\t0x8275, 0xAD51, 0x8276, 0xAD52, 0x8277, 0xAD53, 0x8278, 0xAD55,\t0x8279, 0xAD56, 0x827A, 0xAD57, 0x8281, 0xAD59, 0x8282, 0xAD5A,\n\t0x8283, 0xAD5B, 0x8284, 0xAD5C, 0x8285, 0xAD5D, 0x8286, 0xAD5E,\t0x8287, 0xAD5F, 0x8288, 0xAD60, 0x8289, 0xAD62, 0x828A, 0xAD64,\n\t0x828B, 0xAD65, 0x828C, 0xAD66, 0x828D, 0xAD67, 0x828E, 0xAD68,\t0x828F, 0xAD69, 0x8290, 0xAD6A, 0x8291, 0xAD6B, 0x8292, 0xAD6E,\n\t0x8293, 0xAD6F, 0x8294, 0xAD71, 0x8295, 0xAD72, 0x8296, 0xAD77,\t0x8297, 0xAD78, 0x8298, 0xAD79, 0x8299, 0xAD7A, 0x829A, 0xAD7E,\n\t0x829B, 0xAD80, 0x829C, 0xAD83, 0x829D, 0xAD84, 0x829E, 0xAD85,\t0x829F, 0xAD86, 0x82A0, 0xAD87, 0x82A1, 0xAD8A, 0x82A2, 0xAD8B,\n\t0x82A3, 0xAD8D, 0x82A4, 0xAD8E, 0x82A5, 0xAD8F, 0x82A6, 0xAD91,\t0x82A7, 0xAD92, 0x82A8, 0xAD93, 0x82A9, 0xAD94, 0x82AA, 0xAD95,\n\t0x82AB, 0xAD96, 0x82AC, 0xAD97, 0x82AD, 0xAD98, 0x82AE, 0xAD99,\t0x82AF, 0xAD9A, 0x82B0, 0xAD9B, 0x82B1, 0xAD9E, 0x82B2, 0xAD9F,\n\t0x82B3, 0xADA0, 0x82B4, 0xADA1, 0x82B5, 0xADA2, 0x82B6, 0xADA3,\t0x82B7, 0xADA5, 0x82B8, 0xADA6, 0x82B9, 0xADA7, 0x82BA, 0xADA8,\n\t0x82BB, 0xADA9, 0x82BC, 0xADAA, 0x82BD, 0xADAB, 0x82BE, 0xADAC,\t0x82BF, 0xADAD, 0x82C0, 0xADAE, 0x82C1, 0xADAF, 0x82C2, 0xADB0,\n\t0x82C3, 0xADB1, 0x82C4, 0xADB2, 0x82C5, 0xADB3, 0x82C6, 0xADB4,\t0x82C7, 0xADB5, 0x82C8, 0xADB6, 0x82C9, 0xADB8, 0x82CA, 0xADB9,\n\t0x82CB, 0xADBA, 0x82CC, 0xADBB, 0x82CD, 0xADBC, 0x82CE, 0xADBD,\t0x82CF, 0xADBE, 0x82D0, 0xADBF, 0x82D1, 0xADC2, 0x82D2, 0xADC3,\n\t0x82D3, 0xADC5, 0x82D4, 0xADC6, 0x82D5, 0xADC7, 0x82D6, 0xADC9,\t0x82D7, 0xADCA, 0x82D8, 0xADCB, 0x82D9, 0xADCC, 0x82DA, 0xADCD,\n\t0x82DB, 0xADCE, 0x82DC, 0xADCF, 0x82DD, 0xADD2, 0x82DE, 0xADD4,\t0x82DF, 0xADD5, 0x82E0, 0xADD6, 0x82E1, 0xADD7, 0x82E2, 0xADD8,\n\t0x82E3, 0xADD9, 0x82E4, 0xADDA, 0x82E5, 0xADDB, 0x82E6, 0xADDD,\t0x82E7, 0xADDE, 0x82E8, 0xADDF, 0x82E9, 0xADE1, 0x82EA, 0xADE2,\n\t0x82EB, 0xADE3, 0x82EC, 0xADE5, 0x82ED, 0xADE6, 0x82EE, 0xADE7,\t0x82EF, 0xADE8, 0x82F0, 0xADE9, 0x82F1, 0xADEA, 0x82F2, 0xADEB,\n\t0x82F3, 0xADEC, 0x82F4, 0xADED, 0x82F5, 0xADEE, 0x82F6, 0xADEF,\t0x82F7, 0xADF0, 0x82F8, 0xADF1, 0x82F9, 0xADF2, 0x82FA, 0xADF3,\n\t0x82FB, 0xADF4, 0x82FC, 0xADF5, 0x82FD, 0xADF6, 0x82FE, 0xADF7,\t0x8341, 0xADFA, 0x8342, 0xADFB, 0x8343, 0xADFD, 0x8344, 0xADFE,\n\t0x8345, 0xAE02, 0x8346, 0xAE03, 0x8347, 0xAE04, 0x8348, 0xAE05,\t0x8349, 0xAE06, 0x834A, 0xAE07, 0x834B, 0xAE0A, 0x834C, 0xAE0C,\n\t0x834D, 0xAE0E, 0x834E, 0xAE0F, 0x834F, 0xAE10, 0x8350, 0xAE11,\t0x8351, 0xAE12, 0x8352, 0xAE13, 0x8353, 0xAE15, 0x8354, 0xAE16,\n\t0x8355, 0xAE17, 0x8356, 0xAE18, 0x8357, 0xAE19, 0x8358, 0xAE1A,\t0x8359, 0xAE1B, 0x835A, 0xAE1C, 0x8361, 0xAE1D, 0x8362, 0xAE1E,\n\t0x8363, 0xAE1F, 0x8364, 0xAE20, 0x8365, 0xAE21, 0x8366, 0xAE22,\t0x8367, 0xAE23, 0x8368, 0xAE24, 0x8369, 0xAE25, 0x836A, 0xAE26,\n\t0x836B, 0xAE27, 0x836C, 0xAE28, 0x836D, 0xAE29, 0x836E, 0xAE2A,\t0x836F, 0xAE2B, 0x8370, 0xAE2C, 0x8371, 0xAE2D, 0x8372, 0xAE2E,\n\t0x8373, 0xAE2F, 0x8374, 0xAE32, 0x8375, 0xAE33, 0x8376, 0xAE35,\t0x8377, 0xAE36, 0x8378, 0xAE39, 0x8379, 0xAE3B, 0x837A, 0xAE3C,\n\t0x8381, 0xAE3D, 0x8382, 0xAE3E, 0x8383, 0xAE3F, 0x8384, 0xAE42,\t0x8385, 0xAE44, 0x8386, 0xAE47, 0x8387, 0xAE48, 0x8388, 0xAE49,\n\t0x8389, 0xAE4B, 0x838A, 0xAE4F, 0x838B, 0xAE51, 0x838C, 0xAE52,\t0x838D, 0xAE53, 0x838E, 0xAE55, 0x838F, 0xAE57, 0x8390, 0xAE58,\n\t0x8391, 0xAE59, 0x8392, 0xAE5A, 0x8393, 0xAE5B, 0x8394, 0xAE5E,\t0x8395, 0xAE62, 0x8396, 0xAE63, 0x8397, 0xAE64, 0x8398, 0xAE66,\n\t0x8399, 0xAE67, 0x839A, 0xAE6A, 0x839B, 0xAE6B, 0x839C, 0xAE6D,\t0x839D, 0xAE6E, 0x839E, 0xAE6F, 0x839F, 0xAE71, 0x83A0, 0xAE72,\n\t0x83A1, 0xAE73, 0x83A2, 0xAE74, 0x83A3, 0xAE75, 0x83A4, 0xAE76,\t0x83A5, 0xAE77, 0x83A6, 0xAE7A, 0x83A7, 0xAE7E, 0x83A8, 0xAE7F,\n\t0x83A9, 0xAE80, 0x83AA, 0xAE81, 0x83AB, 0xAE82, 0x83AC, 0xAE83,\t0x83AD, 0xAE86, 0x83AE, 0xAE87, 0x83AF, 0xAE88, 0x83B0, 0xAE89,\n\t0x83B1, 0xAE8A, 0x83B2, 0xAE8B, 0x83B3, 0xAE8D, 0x83B4, 0xAE8E,\t0x83B5, 0xAE8F, 0x83B6, 0xAE90, 0x83B7, 0xAE91, 0x83B8, 0xAE92,\n\t0x83B9, 0xAE93, 0x83BA, 0xAE94, 0x83BB, 0xAE95, 0x83BC, 0xAE96,\t0x83BD, 0xAE97, 0x83BE, 0xAE98, 0x83BF, 0xAE99, 0x83C0, 0xAE9A,\n\t0x83C1, 0xAE9B, 0x83C2, 0xAE9C, 0x83C3, 0xAE9D, 0x83C4, 0xAE9E,\t0x83C5, 0xAE9F, 0x83C6, 0xAEA0, 0x83C7, 0xAEA1, 0x83C8, 0xAEA2,\n\t0x83C9, 0xAEA3, 0x83CA, 0xAEA4, 0x83CB, 0xAEA5, 0x83CC, 0xAEA6,\t0x83CD, 0xAEA7, 0x83CE, 0xAEA8, 0x83CF, 0xAEA9, 0x83D0, 0xAEAA,\n\t0x83D1, 0xAEAB, 0x83D2, 0xAEAC, 0x83D3, 0xAEAD, 0x83D4, 0xAEAE,\t0x83D5, 0xAEAF, 0x83D6, 0xAEB0, 0x83D7, 0xAEB1, 0x83D8, 0xAEB2,\n\t0x83D9, 0xAEB3, 0x83DA, 0xAEB4, 0x83DB, 0xAEB5, 0x83DC, 0xAEB6,\t0x83DD, 0xAEB7, 0x83DE, 0xAEB8, 0x83DF, 0xAEB9, 0x83E0, 0xAEBA,\n\t0x83E1, 0xAEBB, 0x83E2, 0xAEBF, 0x83E3, 0xAEC1, 0x83E4, 0xAEC2,\t0x83E5, 0xAEC3, 0x83E6, 0xAEC5, 0x83E7, 0xAEC6, 0x83E8, 0xAEC7,\n\t0x83E9, 0xAEC8, 0x83EA, 0xAEC9, 0x83EB, 0xAECA, 0x83EC, 0xAECB,\t0x83ED, 0xAECE, 0x83EE, 0xAED2, 0x83EF, 0xAED3, 0x83F0, 0xAED4,\n\t0x83F1, 0xAED5, 0x83F2, 0xAED6, 0x83F3, 0xAED7, 0x83F4, 0xAEDA,\t0x83F5, 0xAEDB, 0x83F6, 0xAEDD, 0x83F7, 0xAEDE, 0x83F8, 0xAEDF,\n\t0x83F9, 0xAEE0, 0x83FA, 0xAEE1, 0x83FB, 0xAEE2, 0x83FC, 0xAEE3,\t0x83FD, 0xAEE4, 0x83FE, 0xAEE5, 0x8441, 0xAEE6, 0x8442, 0xAEE7,\n\t0x8443, 0xAEE9, 0x8444, 0xAEEA, 0x8445, 0xAEEC, 0x8446, 0xAEEE,\t0x8447, 0xAEEF, 0x8448, 0xAEF0, 0x8449, 0xAEF1, 0x844A, 0xAEF2,\n\t0x844B, 0xAEF3, 0x844C, 0xAEF5, 0x844D, 0xAEF6, 0x844E, 0xAEF7,\t0x844F, 0xAEF9, 0x8450, 0xAEFA, 0x8451, 0xAEFB, 0x8452, 0xAEFD,\n\t0x8453, 0xAEFE, 0x8454, 0xAEFF, 0x8455, 0xAF00, 0x8456, 0xAF01,\t0x8457, 0xAF02, 0x8458, 0xAF03, 0x8459, 0xAF04, 0x845A, 0xAF05,\n\t0x8461, 0xAF06, 0x8462, 0xAF09, 0x8463, 0xAF0A, 0x8464, 0xAF0B,\t0x8465, 0xAF0C, 0x8466, 0xAF0E, 0x8467, 0xAF0F, 0x8468, 0xAF11,\n\t0x8469, 0xAF12, 0x846A, 0xAF13, 0x846B, 0xAF14, 0x846C, 0xAF15,\t0x846D, 0xAF16, 0x846E, 0xAF17, 0x846F, 0xAF18, 0x8470, 0xAF19,\n\t0x8471, 0xAF1A, 0x8472, 0xAF1B, 0x8473, 0xAF1C, 0x8474, 0xAF1D,\t0x8475, 0xAF1E, 0x8476, 0xAF1F, 0x8477, 0xAF20, 0x8478, 0xAF21,\n\t0x8479, 0xAF22, 0x847A, 0xAF23, 0x8481, 0xAF24, 0x8482, 0xAF25,\t0x8483, 0xAF26, 0x8484, 0xAF27, 0x8485, 0xAF28, 0x8486, 0xAF29,\n\t0x8487, 0xAF2A, 0x8488, 0xAF2B, 0x8489, 0xAF2E, 0x848A, 0xAF2F,\t0x848B, 0xAF31, 0x848C, 0xAF33, 0x848D, 0xAF35, 0x848E, 0xAF36,\n\t0x848F, 0xAF37, 0x8490, 0xAF38, 0x8491, 0xAF39, 0x8492, 0xAF3A,\t0x8493, 0xAF3B, 0x8494, 0xAF3E, 0x8495, 0xAF40, 0x8496, 0xAF44,\n\t0x8497, 0xAF45, 0x8498, 0xAF46, 0x8499, 0xAF47, 0x849A, 0xAF4A,\t0x849B, 0xAF4B, 0x849C, 0xAF4C, 0x849D, 0xAF4D, 0x849E, 0xAF4E,\n\t0x849F, 0xAF4F, 0x84A0, 0xAF51, 0x84A1, 0xAF52, 0x84A2, 0xAF53,\t0x84A3, 0xAF54, 0x84A4, 0xAF55, 0x84A5, 0xAF56, 0x84A6, 0xAF57,\n\t0x84A7, 0xAF58, 0x84A8, 0xAF59, 0x84A9, 0xAF5A, 0x84AA, 0xAF5B,\t0x84AB, 0xAF5E, 0x84AC, 0xAF5F, 0x84AD, 0xAF60, 0x84AE, 0xAF61,\n\t0x84AF, 0xAF62, 0x84B0, 0xAF63, 0x84B1, 0xAF66, 0x84B2, 0xAF67,\t0x84B3, 0xAF68, 0x84B4, 0xAF69, 0x84B5, 0xAF6A, 0x84B6, 0xAF6B,\n\t0x84B7, 0xAF6C, 0x84B8, 0xAF6D, 0x84B9, 0xAF6E, 0x84BA, 0xAF6F,\t0x84BB, 0xAF70, 0x84BC, 0xAF71, 0x84BD, 0xAF72, 0x84BE, 0xAF73,\n\t0x84BF, 0xAF74, 0x84C0, 0xAF75, 0x84C1, 0xAF76, 0x84C2, 0xAF77,\t0x84C3, 0xAF78, 0x84C4, 0xAF7A, 0x84C5, 0xAF7B, 0x84C6, 0xAF7C,\n\t0x84C7, 0xAF7D, 0x84C8, 0xAF7E, 0x84C9, 0xAF7F, 0x84CA, 0xAF81,\t0x84CB, 0xAF82, 0x84CC, 0xAF83, 0x84CD, 0xAF85, 0x84CE, 0xAF86,\n\t0x84CF, 0xAF87, 0x84D0, 0xAF89, 0x84D1, 0xAF8A, 0x84D2, 0xAF8B,\t0x84D3, 0xAF8C, 0x84D4, 0xAF8D, 0x84D5, 0xAF8E, 0x84D6, 0xAF8F,\n\t0x84D7, 0xAF92, 0x84D8, 0xAF93, 0x84D9, 0xAF94, 0x84DA, 0xAF96,\t0x84DB, 0xAF97, 0x84DC, 0xAF98, 0x84DD, 0xAF99, 0x84DE, 0xAF9A,\n\t0x84DF, 0xAF9B, 0x84E0, 0xAF9D, 0x84E1, 0xAF9E, 0x84E2, 0xAF9F,\t0x84E3, 0xAFA0, 0x84E4, 0xAFA1, 0x84E5, 0xAFA2, 0x84E6, 0xAFA3,\n\t0x84E7, 0xAFA4, 0x84E8, 0xAFA5, 0x84E9, 0xAFA6, 0x84EA, 0xAFA7,\t0x84EB, 0xAFA8, 0x84EC, 0xAFA9, 0x84ED, 0xAFAA, 0x84EE, 0xAFAB,\n\t0x84EF, 0xAFAC, 0x84F0, 0xAFAD, 0x84F1, 0xAFAE, 0x84F2, 0xAFAF,\t0x84F3, 0xAFB0, 0x84F4, 0xAFB1, 0x84F5, 0xAFB2, 0x84F6, 0xAFB3,\n\t0x84F7, 0xAFB4, 0x84F8, 0xAFB5, 0x84F9, 0xAFB6, 0x84FA, 0xAFB7,\t0x84FB, 0xAFBA, 0x84FC, 0xAFBB, 0x84FD, 0xAFBD, 0x84FE, 0xAFBE,\n\t0x8541, 0xAFBF, 0x8542, 0xAFC1, 0x8543, 0xAFC2, 0x8544, 0xAFC3,\t0x8545, 0xAFC4, 0x8546, 0xAFC5, 0x8547, 0xAFC6, 0x8548, 0xAFCA,\n\t0x8549, 0xAFCC, 0x854A, 0xAFCF, 0x854B, 0xAFD0, 0x854C, 0xAFD1,\t0x854D, 0xAFD2, 0x854E, 0xAFD3, 0x854F, 0xAFD5, 0x8550, 0xAFD6,\n\t0x8551, 0xAFD7, 0x8552, 0xAFD8, 0x8553, 0xAFD9, 0x8554, 0xAFDA,\t0x8555, 0xAFDB, 0x8556, 0xAFDD, 0x8557, 0xAFDE, 0x8558, 0xAFDF,\n\t0x8559, 0xAFE0, 0x855A, 0xAFE1, 0x8561, 0xAFE2, 0x8562, 0xAFE3,\t0x8563, 0xAFE4, 0x8564, 0xAFE5, 0x8565, 0xAFE6, 0x8566, 0xAFE7,\n\t0x8567, 0xAFEA, 0x8568, 0xAFEB, 0x8569, 0xAFEC, 0x856A, 0xAFED,\t0x856B, 0xAFEE, 0x856C, 0xAFEF, 0x856D, 0xAFF2, 0x856E, 0xAFF3,\n\t0x856F, 0xAFF5, 0x8570, 0xAFF6, 0x8571, 0xAFF7, 0x8572, 0xAFF9,\t0x8573, 0xAFFA, 0x8574, 0xAFFB, 0x8575, 0xAFFC, 0x8576, 0xAFFD,\n\t0x8577, 0xAFFE, 0x8578, 0xAFFF, 0x8579, 0xB002, 0x857A, 0xB003,\t0x8581, 0xB005, 0x8582, 0xB006, 0x8583, 0xB007, 0x8584, 0xB008,\n\t0x8585, 0xB009, 0x8586, 0xB00A, 0x8587, 0xB00B, 0x8588, 0xB00D,\t0x8589, 0xB00E, 0x858A, 0xB00F, 0x858B, 0xB011, 0x858C, 0xB012,\n\t0x858D, 0xB013, 0x858E, 0xB015, 0x858F, 0xB016, 0x8590, 0xB017,\t0x8591, 0xB018, 0x8592, 0xB019, 0x8593, 0xB01A, 0x8594, 0xB01B,\n\t0x8595, 0xB01E, 0x8596, 0xB01F, 0x8597, 0xB020, 0x8598, 0xB021,\t0x8599, 0xB022, 0x859A, 0xB023, 0x859B, 0xB024, 0x859C, 0xB025,\n\t0x859D, 0xB026, 0x859E, 0xB027, 0x859F, 0xB029, 0x85A0, 0xB02A,\t0x85A1, 0xB02B, 0x85A2, 0xB02C, 0x85A3, 0xB02D, 0x85A4, 0xB02E,\n\t0x85A5, 0xB02F, 0x85A6, 0xB030, 0x85A7, 0xB031, 0x85A8, 0xB032,\t0x85A9, 0xB033, 0x85AA, 0xB034, 0x85AB, 0xB035, 0x85AC, 0xB036,\n\t0x85AD, 0xB037, 0x85AE, 0xB038, 0x85AF, 0xB039, 0x85B0, 0xB03A,\t0x85B1, 0xB03B, 0x85B2, 0xB03C, 0x85B3, 0xB03D, 0x85B4, 0xB03E,\n\t0x85B5, 0xB03F, 0x85B6, 0xB040, 0x85B7, 0xB041, 0x85B8, 0xB042,\t0x85B9, 0xB043, 0x85BA, 0xB046, 0x85BB, 0xB047, 0x85BC, 0xB049,\n\t0x85BD, 0xB04B, 0x85BE, 0xB04D, 0x85BF, 0xB04F, 0x85C0, 0xB050,\t0x85C1, 0xB051, 0x85C2, 0xB052, 0x85C3, 0xB056, 0x85C4, 0xB058,\n\t0x85C5, 0xB05A, 0x85C6, 0xB05B, 0x85C7, 0xB05C, 0x85C8, 0xB05E,\t0x85C9, 0xB05F, 0x85CA, 0xB060, 0x85CB, 0xB061, 0x85CC, 0xB062,\n\t0x85CD, 0xB063, 0x85CE, 0xB064, 0x85CF, 0xB065, 0x85D0, 0xB066,\t0x85D1, 0xB067, 0x85D2, 0xB068, 0x85D3, 0xB069, 0x85D4, 0xB06A,\n\t0x85D5, 0xB06B, 0x85D6, 0xB06C, 0x85D7, 0xB06D, 0x85D8, 0xB06E,\t0x85D9, 0xB06F, 0x85DA, 0xB070, 0x85DB, 0xB071, 0x85DC, 0xB072,\n\t0x85DD, 0xB073, 0x85DE, 0xB074, 0x85DF, 0xB075, 0x85E0, 0xB076,\t0x85E1, 0xB077, 0x85E2, 0xB078, 0x85E3, 0xB079, 0x85E4, 0xB07A,\n\t0x85E5, 0xB07B, 0x85E6, 0xB07E, 0x85E7, 0xB07F, 0x85E8, 0xB081,\t0x85E9, 0xB082, 0x85EA, 0xB083, 0x85EB, 0xB085, 0x85EC, 0xB086,\n\t0x85ED, 0xB087, 0x85EE, 0xB088, 0x85EF, 0xB089, 0x85F0, 0xB08A,\t0x85F1, 0xB08B, 0x85F2, 0xB08E, 0x85F3, 0xB090, 0x85F4, 0xB092,\n\t0x85F5, 0xB093, 0x85F6, 0xB094, 0x85F7, 0xB095, 0x85F8, 0xB096,\t0x85F9, 0xB097, 0x85FA, 0xB09B, 0x85FB, 0xB09D, 0x85FC, 0xB09E,\n\t0x85FD, 0xB0A3, 0x85FE, 0xB0A4, 0x8641, 0xB0A5, 0x8642, 0xB0A6,\t0x8643, 0xB0A7, 0x8644, 0xB0AA, 0x8645, 0xB0B0, 0x8646, 0xB0B2,\n\t0x8647, 0xB0B6, 0x8648, 0xB0B7, 0x8649, 0xB0B9, 0x864A, 0xB0BA,\t0x864B, 0xB0BB, 0x864C, 0xB0BD, 0x864D, 0xB0BE, 0x864E, 0xB0BF,\n\t0x864F, 0xB0C0, 0x8650, 0xB0C1, 0x8651, 0xB0C2, 0x8652, 0xB0C3,\t0x8653, 0xB0C6, 0x8654, 0xB0CA, 0x8655, 0xB0CB, 0x8656, 0xB0CC,\n\t0x8657, 0xB0CD, 0x8658, 0xB0CE, 0x8659, 0xB0CF, 0x865A, 0xB0D2,\t0x8661, 0xB0D3, 0x8662, 0xB0D5, 0x8663, 0xB0D6, 0x8664, 0xB0D7,\n\t0x8665, 0xB0D9, 0x8666, 0xB0DA, 0x8667, 0xB0DB, 0x8668, 0xB0DC,\t0x8669, 0xB0DD, 0x866A, 0xB0DE, 0x866B, 0xB0DF, 0x866C, 0xB0E1,\n\t0x866D, 0xB0E2, 0x866E, 0xB0E3, 0x866F, 0xB0E4, 0x8670, 0xB0E6,\t0x8671, 0xB0E7, 0x8672, 0xB0E8, 0x8673, 0xB0E9, 0x8674, 0xB0EA,\n\t0x8675, 0xB0EB, 0x8676, 0xB0EC, 0x8677, 0xB0ED, 0x8678, 0xB0EE,\t0x8679, 0xB0EF, 0x867A, 0xB0F0, 0x8681, 0xB0F1, 0x8682, 0xB0F2,\n\t0x8683, 0xB0F3, 0x8684, 0xB0F4, 0x8685, 0xB0F5, 0x8686, 0xB0F6,\t0x8687, 0xB0F7, 0x8688, 0xB0F8, 0x8689, 0xB0F9, 0x868A, 0xB0FA,\n\t0x868B, 0xB0FB, 0x868C, 0xB0FC, 0x868D, 0xB0FD, 0x868E, 0xB0FE,\t0x868F, 0xB0FF, 0x8690, 0xB100, 0x8691, 0xB101, 0x8692, 0xB102,\n\t0x8693, 0xB103, 0x8694, 0xB104, 0x8695, 0xB105, 0x8696, 0xB106,\t0x8697, 0xB107, 0x8698, 0xB10A, 0x8699, 0xB10D, 0x869A, 0xB10E,\n\t0x869B, 0xB10F, 0x869C, 0xB111, 0x869D, 0xB114, 0x869E, 0xB115,\t0x869F, 0xB116, 0x86A0, 0xB117, 0x86A1, 0xB11A, 0x86A2, 0xB11E,\n\t0x86A3, 0xB11F, 0x86A4, 0xB120, 0x86A5, 0xB121, 0x86A6, 0xB122,\t0x86A7, 0xB126, 0x86A8, 0xB127, 0x86A9, 0xB129, 0x86AA, 0xB12A,\n\t0x86AB, 0xB12B, 0x86AC, 0xB12D, 0x86AD, 0xB12E, 0x86AE, 0xB12F,\t0x86AF, 0xB130, 0x86B0, 0xB131, 0x86B1, 0xB132, 0x86B2, 0xB133,\n\t0x86B3, 0xB136, 0x86B4, 0xB13A, 0x86B5, 0xB13B, 0x86B6, 0xB13C,\t0x86B7, 0xB13D, 0x86B8, 0xB13E, 0x86B9, 0xB13F, 0x86BA, 0xB142,\n\t0x86BB, 0xB143, 0x86BC, 0xB145, 0x86BD, 0xB146, 0x86BE, 0xB147,\t0x86BF, 0xB149, 0x86C0, 0xB14A, 0x86C1, 0xB14B, 0x86C2, 0xB14C,\n\t0x86C3, 0xB14D, 0x86C4, 0xB14E, 0x86C5, 0xB14F, 0x86C6, 0xB152,\t0x86C7, 0xB153, 0x86C8, 0xB156, 0x86C9, 0xB157, 0x86CA, 0xB159,\n\t0x86CB, 0xB15A, 0x86CC, 0xB15B, 0x86CD, 0xB15D, 0x86CE, 0xB15E,\t0x86CF, 0xB15F, 0x86D0, 0xB161, 0x86D1, 0xB162, 0x86D2, 0xB163,\n\t0x86D3, 0xB164, 0x86D4, 0xB165, 0x86D5, 0xB166, 0x86D6, 0xB167,\t0x86D7, 0xB168, 0x86D8, 0xB169, 0x86D9, 0xB16A, 0x86DA, 0xB16B,\n\t0x86DB, 0xB16C, 0x86DC, 0xB16D, 0x86DD, 0xB16E, 0x86DE, 0xB16F,\t0x86DF, 0xB170, 0x86E0, 0xB171, 0x86E1, 0xB172, 0x86E2, 0xB173,\n\t0x86E3, 0xB174, 0x86E4, 0xB175, 0x86E5, 0xB176, 0x86E6, 0xB177,\t0x86E7, 0xB17A, 0x86E8, 0xB17B, 0x86E9, 0xB17D, 0x86EA, 0xB17E,\n\t0x86EB, 0xB17F, 0x86EC, 0xB181, 0x86ED, 0xB183, 0x86EE, 0xB184,\t0x86EF, 0xB185, 0x86F0, 0xB186, 0x86F1, 0xB187, 0x86F2, 0xB18A,\n\t0x86F3, 0xB18C, 0x86F4, 0xB18E, 0x86F5, 0xB18F, 0x86F6, 0xB190,\t0x86F7, 0xB191, 0x86F8, 0xB195, 0x86F9, 0xB196, 0x86FA, 0xB197,\n\t0x86FB, 0xB199, 0x86FC, 0xB19A, 0x86FD, 0xB19B, 0x86FE, 0xB19D,\t0x8741, 0xB19E, 0x8742, 0xB19F, 0x8743, 0xB1A0, 0x8744, 0xB1A1,\n\t0x8745, 0xB1A2, 0x8746, 0xB1A3, 0x8747, 0xB1A4, 0x8748, 0xB1A5,\t0x8749, 0xB1A6, 0x874A, 0xB1A7, 0x874B, 0xB1A9, 0x874C, 0xB1AA,\n\t0x874D, 0xB1AB, 0x874E, 0xB1AC, 0x874F, 0xB1AD, 0x8750, 0xB1AE,\t0x8751, 0xB1AF, 0x8752, 0xB1B0, 0x8753, 0xB1B1, 0x8754, 0xB1B2,\n\t0x8755, 0xB1B3, 0x8756, 0xB1B4, 0x8757, 0xB1B5, 0x8758, 0xB1B6,\t0x8759, 0xB1B7, 0x875A, 0xB1B8, 0x8761, 0xB1B9, 0x8762, 0xB1BA,\n\t0x8763, 0xB1BB, 0x8764, 0xB1BC, 0x8765, 0xB1BD, 0x8766, 0xB1BE,\t0x8767, 0xB1BF, 0x8768, 0xB1C0, 0x8769, 0xB1C1, 0x876A, 0xB1C2,\n\t0x876B, 0xB1C3, 0x876C, 0xB1C4, 0x876D, 0xB1C5, 0x876E, 0xB1C6,\t0x876F, 0xB1C7, 0x8770, 0xB1C8, 0x8771, 0xB1C9, 0x8772, 0xB1CA,\n\t0x8773, 0xB1CB, 0x8774, 0xB1CD, 0x8775, 0xB1CE, 0x8776, 0xB1CF,\t0x8777, 0xB1D1, 0x8778, 0xB1D2, 0x8779, 0xB1D3, 0x877A, 0xB1D5,\n\t0x8781, 0xB1D6, 0x8782, 0xB1D7, 0x8783, 0xB1D8, 0x8784, 0xB1D9,\t0x8785, 0xB1DA, 0x8786, 0xB1DB, 0x8787, 0xB1DE, 0x8788, 0xB1E0,\n\t0x8789, 0xB1E1, 0x878A, 0xB1E2, 0x878B, 0xB1E3, 0x878C, 0xB1E4,\t0x878D, 0xB1E5, 0x878E, 0xB1E6, 0x878F, 0xB1E7, 0x8790, 0xB1EA,\n\t0x8791, 0xB1EB, 0x8792, 0xB1ED, 0x8793, 0xB1EE, 0x8794, 0xB1EF,\t0x8795, 0xB1F1, 0x8796, 0xB1F2, 0x8797, 0xB1F3, 0x8798, 0xB1F4,\n\t0x8799, 0xB1F5, 0x879A, 0xB1F6, 0x879B, 0xB1F7, 0x879C, 0xB1F8,\t0x879D, 0xB1FA, 0x879E, 0xB1FC, 0x879F, 0xB1FE, 0x87A0, 0xB1FF,\n\t0x87A1, 0xB200, 0x87A2, 0xB201, 0x87A3, 0xB202, 0x87A4, 0xB203,\t0x87A5, 0xB206, 0x87A6, 0xB207, 0x87A7, 0xB209, 0x87A8, 0xB20A,\n\t0x87A9, 0xB20D, 0x87AA, 0xB20E, 0x87AB, 0xB20F, 0x87AC, 0xB210,\t0x87AD, 0xB211, 0x87AE, 0xB212, 0x87AF, 0xB213, 0x87B0, 0xB216,\n\t0x87B1, 0xB218, 0x87B2, 0xB21A, 0x87B3, 0xB21B, 0x87B4, 0xB21C,\t0x87B5, 0xB21D, 0x87B6, 0xB21E, 0x87B7, 0xB21F, 0x87B8, 0xB221,\n\t0x87B9, 0xB222, 0x87BA, 0xB223, 0x87BB, 0xB224, 0x87BC, 0xB225,\t0x87BD, 0xB226, 0x87BE, 0xB227, 0x87BF, 0xB228, 0x87C0, 0xB229,\n\t0x87C1, 0xB22A, 0x87C2, 0xB22B, 0x87C3, 0xB22C, 0x87C4, 0xB22D,\t0x87C5, 0xB22E, 0x87C6, 0xB22F, 0x87C7, 0xB230, 0x87C8, 0xB231,\n\t0x87C9, 0xB232, 0x87CA, 0xB233, 0x87CB, 0xB235, 0x87CC, 0xB236,\t0x87CD, 0xB237, 0x87CE, 0xB238, 0x87CF, 0xB239, 0x87D0, 0xB23A,\n\t0x87D1, 0xB23B, 0x87D2, 0xB23D, 0x87D3, 0xB23E, 0x87D4, 0xB23F,\t0x87D5, 0xB240, 0x87D6, 0xB241, 0x87D7, 0xB242, 0x87D8, 0xB243,\n\t0x87D9, 0xB244, 0x87DA, 0xB245, 0x87DB, 0xB246, 0x87DC, 0xB247,\t0x87DD, 0xB248, 0x87DE, 0xB249, 0x87DF, 0xB24A, 0x87E0, 0xB24B,\n\t0x87E1, 0xB24C, 0x87E2, 0xB24D, 0x87E3, 0xB24E, 0x87E4, 0xB24F,\t0x87E5, 0xB250, 0x87E6, 0xB251, 0x87E7, 0xB252, 0x87E8, 0xB253,\n\t0x87E9, 0xB254, 0x87EA, 0xB255, 0x87EB, 0xB256, 0x87EC, 0xB257,\t0x87ED, 0xB259, 0x87EE, 0xB25A, 0x87EF, 0xB25B, 0x87F0, 0xB25D,\n\t0x87F1, 0xB25E, 0x87F2, 0xB25F, 0x87F3, 0xB261, 0x87F4, 0xB262,\t0x87F5, 0xB263, 0x87F6, 0xB264, 0x87F7, 0xB265, 0x87F8, 0xB266,\n\t0x87F9, 0xB267, 0x87FA, 0xB26A, 0x87FB, 0xB26B, 0x87FC, 0xB26C,\t0x87FD, 0xB26D, 0x87FE, 0xB26E, 0x8841, 0xB26F, 0x8842, 0xB270,\n\t0x8843, 0xB271, 0x8844, 0xB272, 0x8845, 0xB273, 0x8846, 0xB276,\t0x8847, 0xB277, 0x8848, 0xB278, 0x8849, 0xB279, 0x884A, 0xB27A,\n\t0x884B, 0xB27B, 0x884C, 0xB27D, 0x884D, 0xB27E, 0x884E, 0xB27F,\t0x884F, 0xB280, 0x8850, 0xB281, 0x8851, 0xB282, 0x8852, 0xB283,\n\t0x8853, 0xB286, 0x8854, 0xB287, 0x8855, 0xB288, 0x8856, 0xB28A,\t0x8857, 0xB28B, 0x8858, 0xB28C, 0x8859, 0xB28D, 0x885A, 0xB28E,\n\t0x8861, 0xB28F, 0x8862, 0xB292, 0x8863, 0xB293, 0x8864, 0xB295,\t0x8865, 0xB296, 0x8866, 0xB297, 0x8867, 0xB29B, 0x8868, 0xB29C,\n\t0x8869, 0xB29D, 0x886A, 0xB29E, 0x886B, 0xB29F, 0x886C, 0xB2A2,\t0x886D, 0xB2A4, 0x886E, 0xB2A7, 0x886F, 0xB2A8, 0x8870, 0xB2A9,\n\t0x8871, 0xB2AB, 0x8872, 0xB2AD, 0x8873, 0xB2AE, 0x8874, 0xB2AF,\t0x8875, 0xB2B1, 0x8876, 0xB2B2, 0x8877, 0xB2B3, 0x8878, 0xB2B5,\n\t0x8879, 0xB2B6, 0x887A, 0xB2B7, 0x8881, 0xB2B8, 0x8882, 0xB2B9,\t0x8883, 0xB2BA, 0x8884, 0xB2BB, 0x8885, 0xB2BC, 0x8886, 0xB2BD,\n\t0x8887, 0xB2BE, 0x8888, 0xB2BF, 0x8889, 0xB2C0, 0x888A, 0xB2C1,\t0x888B, 0xB2C2, 0x888C, 0xB2C3, 0x888D, 0xB2C4, 0x888E, 0xB2C5,\n\t0x888F, 0xB2C6, 0x8890, 0xB2C7, 0x8891, 0xB2CA, 0x8892, 0xB2CB,\t0x8893, 0xB2CD, 0x8894, 0xB2CE, 0x8895, 0xB2CF, 0x8896, 0xB2D1,\n\t0x8897, 0xB2D3, 0x8898, 0xB2D4, 0x8899, 0xB2D5, 0x889A, 0xB2D6,\t0x889B, 0xB2D7, 0x889C, 0xB2DA, 0x889D, 0xB2DC, 0x889E, 0xB2DE,\n\t0x889F, 0xB2DF, 0x88A0, 0xB2E0, 0x88A1, 0xB2E1, 0x88A2, 0xB2E3,\t0x88A3, 0xB2E7, 0x88A4, 0xB2E9, 0x88A5, 0xB2EA, 0x88A6, 0xB2F0,\n\t0x88A7, 0xB2F1, 0x88A8, 0xB2F2, 0x88A9, 0xB2F6, 0x88AA, 0xB2FC,\t0x88AB, 0xB2FD, 0x88AC, 0xB2FE, 0x88AD, 0xB302, 0x88AE, 0xB303,\n\t0x88AF, 0xB305, 0x88B0, 0xB306, 0x88B1, 0xB307, 0x88B2, 0xB309,\t0x88B3, 0xB30A, 0x88B4, 0xB30B, 0x88B5, 0xB30C, 0x88B6, 0xB30D,\n\t0x88B7, 0xB30E, 0x88B8, 0xB30F, 0x88B9, 0xB312, 0x88BA, 0xB316,\t0x88BB, 0xB317, 0x88BC, 0xB318, 0x88BD, 0xB319, 0x88BE, 0xB31A,\n\t0x88BF, 0xB31B, 0x88C0, 0xB31D, 0x88C1, 0xB31E, 0x88C2, 0xB31F,\t0x88C3, 0xB320, 0x88C4, 0xB321, 0x88C5, 0xB322, 0x88C6, 0xB323,\n\t0x88C7, 0xB324, 0x88C8, 0xB325, 0x88C9, 0xB326, 0x88CA, 0xB327,\t0x88CB, 0xB328, 0x88CC, 0xB329, 0x88CD, 0xB32A, 0x88CE, 0xB32B,\n\t0x88CF, 0xB32C, 0x88D0, 0xB32D, 0x88D1, 0xB32E, 0x88D2, 0xB32F,\t0x88D3, 0xB330, 0x88D4, 0xB331, 0x88D5, 0xB332, 0x88D6, 0xB333,\n\t0x88D7, 0xB334, 0x88D8, 0xB335, 0x88D9, 0xB336, 0x88DA, 0xB337,\t0x88DB, 0xB338, 0x88DC, 0xB339, 0x88DD, 0xB33A, 0x88DE, 0xB33B,\n\t0x88DF, 0xB33C, 0x88E0, 0xB33D, 0x88E1, 0xB33E, 0x88E2, 0xB33F,\t0x88E3, 0xB340, 0x88E4, 0xB341, 0x88E5, 0xB342, 0x88E6, 0xB343,\n\t0x88E7, 0xB344, 0x88E8, 0xB345, 0x88E9, 0xB346, 0x88EA, 0xB347,\t0x88EB, 0xB348, 0x88EC, 0xB349, 0x88ED, 0xB34A, 0x88EE, 0xB34B,\n\t0x88EF, 0xB34C, 0x88F0, 0xB34D, 0x88F1, 0xB34E, 0x88F2, 0xB34F,\t0x88F3, 0xB350, 0x88F4, 0xB351, 0x88F5, 0xB352, 0x88F6, 0xB353,\n\t0x88F7, 0xB357, 0x88F8, 0xB359, 0x88F9, 0xB35A, 0x88FA, 0xB35D,\t0x88FB, 0xB360, 0x88FC, 0xB361, 0x88FD, 0xB362, 0x88FE, 0xB363,\n\t0x8941, 0xB366, 0x8942, 0xB368, 0x8943, 0xB36A, 0x8944, 0xB36C,\t0x8945, 0xB36D, 0x8946, 0xB36F, 0x8947, 0xB372, 0x8948, 0xB373,\n\t0x8949, 0xB375, 0x894A, 0xB376, 0x894B, 0xB377, 0x894C, 0xB379,\t0x894D, 0xB37A, 0x894E, 0xB37B, 0x894F, 0xB37C, 0x8950, 0xB37D,\n\t0x8951, 0xB37E, 0x8952, 0xB37F, 0x8953, 0xB382, 0x8954, 0xB386,\t0x8955, 0xB387, 0x8956, 0xB388, 0x8957, 0xB389, 0x8958, 0xB38A,\n\t0x8959, 0xB38B, 0x895A, 0xB38D, 0x8961, 0xB38E, 0x8962, 0xB38F,\t0x8963, 0xB391, 0x8964, 0xB392, 0x8965, 0xB393, 0x8966, 0xB395,\n\t0x8967, 0xB396, 0x8968, 0xB397, 0x8969, 0xB398, 0x896A, 0xB399,\t0x896B, 0xB39A, 0x896C, 0xB39B, 0x896D, 0xB39C, 0x896E, 0xB39D,\n\t0x896F, 0xB39E, 0x8970, 0xB39F, 0x8971, 0xB3A2, 0x8972, 0xB3A3,\t0x8973, 0xB3A4, 0x8974, 0xB3A5, 0x8975, 0xB3A6, 0x8976, 0xB3A7,\n\t0x8977, 0xB3A9, 0x8978, 0xB3AA, 0x8979, 0xB3AB, 0x897A, 0xB3AD,\t0x8981, 0xB3AE, 0x8982, 0xB3AF, 0x8983, 0xB3B0, 0x8984, 0xB3B1,\n\t0x8985, 0xB3B2, 0x8986, 0xB3B3, 0x8987, 0xB3B4, 0x8988, 0xB3B5,\t0x8989, 0xB3B6, 0x898A, 0xB3B7, 0x898B, 0xB3B8, 0x898C, 0xB3B9,\n\t0x898D, 0xB3BA, 0x898E, 0xB3BB, 0x898F, 0xB3BC, 0x8990, 0xB3BD,\t0x8991, 0xB3BE, 0x8992, 0xB3BF, 0x8993, 0xB3C0, 0x8994, 0xB3C1,\n\t0x8995, 0xB3C2, 0x8996, 0xB3C3, 0x8997, 0xB3C6, 0x8998, 0xB3C7,\t0x8999, 0xB3C9, 0x899A, 0xB3CA, 0x899B, 0xB3CD, 0x899C, 0xB3CF,\n\t0x899D, 0xB3D1, 0x899E, 0xB3D2, 0x899F, 0xB3D3, 0x89A0, 0xB3D6,\t0x89A1, 0xB3D8, 0x89A2, 0xB3DA, 0x89A3, 0xB3DC, 0x89A4, 0xB3DE,\n\t0x89A5, 0xB3DF, 0x89A6, 0xB3E1, 0x89A7, 0xB3E2, 0x89A8, 0xB3E3,\t0x89A9, 0xB3E5, 0x89AA, 0xB3E6, 0x89AB, 0xB3E7, 0x89AC, 0xB3E9,\n\t0x89AD, 0xB3EA, 0x89AE, 0xB3EB, 0x89AF, 0xB3EC, 0x89B0, 0xB3ED,\t0x89B1, 0xB3EE, 0x89B2, 0xB3EF, 0x89B3, 0xB3F0, 0x89B4, 0xB3F1,\n\t0x89B5, 0xB3F2, 0x89B6, 0xB3F3, 0x89B7, 0xB3F4, 0x89B8, 0xB3F5,\t0x89B9, 0xB3F6, 0x89BA, 0xB3F7, 0x89BB, 0xB3F8, 0x89BC, 0xB3F9,\n\t0x89BD, 0xB3FA, 0x89BE, 0xB3FB, 0x89BF, 0xB3FD, 0x89C0, 0xB3FE,\t0x89C1, 0xB3FF, 0x89C2, 0xB400, 0x89C3, 0xB401, 0x89C4, 0xB402,\n\t0x89C5, 0xB403, 0x89C6, 0xB404, 0x89C7, 0xB405, 0x89C8, 0xB406,\t0x89C9, 0xB407, 0x89CA, 0xB408, 0x89CB, 0xB409, 0x89CC, 0xB40A,\n\t0x89CD, 0xB40B, 0x89CE, 0xB40C, 0x89CF, 0xB40D, 0x89D0, 0xB40E,\t0x89D1, 0xB40F, 0x89D2, 0xB411, 0x89D3, 0xB412, 0x89D4, 0xB413,\n\t0x89D5, 0xB414, 0x89D6, 0xB415, 0x89D7, 0xB416, 0x89D8, 0xB417,\t0x89D9, 0xB419, 0x89DA, 0xB41A, 0x89DB, 0xB41B, 0x89DC, 0xB41D,\n\t0x89DD, 0xB41E, 0x89DE, 0xB41F, 0x89DF, 0xB421, 0x89E0, 0xB422,\t0x89E1, 0xB423, 0x89E2, 0xB424, 0x89E3, 0xB425, 0x89E4, 0xB426,\n\t0x89E5, 0xB427, 0x89E6, 0xB42A, 0x89E7, 0xB42C, 0x89E8, 0xB42D,\t0x89E9, 0xB42E, 0x89EA, 0xB42F, 0x89EB, 0xB430, 0x89EC, 0xB431,\n\t0x89ED, 0xB432, 0x89EE, 0xB433, 0x89EF, 0xB435, 0x89F0, 0xB436,\t0x89F1, 0xB437, 0x89F2, 0xB438, 0x89F3, 0xB439, 0x89F4, 0xB43A,\n\t0x89F5, 0xB43B, 0x89F6, 0xB43C, 0x89F7, 0xB43D, 0x89F8, 0xB43E,\t0x89F9, 0xB43F, 0x89FA, 0xB440, 0x89FB, 0xB441, 0x89FC, 0xB442,\n\t0x89FD, 0xB443, 0x89FE, 0xB444, 0x8A41, 0xB445, 0x8A42, 0xB446,\t0x8A43, 0xB447, 0x8A44, 0xB448, 0x8A45, 0xB449, 0x8A46, 0xB44A,\n\t0x8A47, 0xB44B, 0x8A48, 0xB44C, 0x8A49, 0xB44D, 0x8A4A, 0xB44E,\t0x8A4B, 0xB44F, 0x8A4C, 0xB452, 0x8A4D, 0xB453, 0x8A4E, 0xB455,\n\t0x8A4F, 0xB456, 0x8A50, 0xB457, 0x8A51, 0xB459, 0x8A52, 0xB45A,\t0x8A53, 0xB45B, 0x8A54, 0xB45C, 0x8A55, 0xB45D, 0x8A56, 0xB45E,\n\t0x8A57, 0xB45F, 0x8A58, 0xB462, 0x8A59, 0xB464, 0x8A5A, 0xB466,\t0x8A61, 0xB467, 0x8A62, 0xB468, 0x8A63, 0xB469, 0x8A64, 0xB46A,\n\t0x8A65, 0xB46B, 0x8A66, 0xB46D, 0x8A67, 0xB46E, 0x8A68, 0xB46F,\t0x8A69, 0xB470, 0x8A6A, 0xB471, 0x8A6B, 0xB472, 0x8A6C, 0xB473,\n\t0x8A6D, 0xB474, 0x8A6E, 0xB475, 0x8A6F, 0xB476, 0x8A70, 0xB477,\t0x8A71, 0xB478, 0x8A72, 0xB479, 0x8A73, 0xB47A, 0x8A74, 0xB47B,\n\t0x8A75, 0xB47C, 0x8A76, 0xB47D, 0x8A77, 0xB47E, 0x8A78, 0xB47F,\t0x8A79, 0xB481, 0x8A7A, 0xB482, 0x8A81, 0xB483, 0x8A82, 0xB484,\n\t0x8A83, 0xB485, 0x8A84, 0xB486, 0x8A85, 0xB487, 0x8A86, 0xB489,\t0x8A87, 0xB48A, 0x8A88, 0xB48B, 0x8A89, 0xB48C, 0x8A8A, 0xB48D,\n\t0x8A8B, 0xB48E, 0x8A8C, 0xB48F, 0x8A8D, 0xB490, 0x8A8E, 0xB491,\t0x8A8F, 0xB492, 0x8A90, 0xB493, 0x8A91, 0xB494, 0x8A92, 0xB495,\n\t0x8A93, 0xB496, 0x8A94, 0xB497, 0x8A95, 0xB498, 0x8A96, 0xB499,\t0x8A97, 0xB49A, 0x8A98, 0xB49B, 0x8A99, 0xB49C, 0x8A9A, 0xB49E,\n\t0x8A9B, 0xB49F, 0x8A9C, 0xB4A0, 0x8A9D, 0xB4A1, 0x8A9E, 0xB4A2,\t0x8A9F, 0xB4A3, 0x8AA0, 0xB4A5, 0x8AA1, 0xB4A6, 0x8AA2, 0xB4A7,\n\t0x8AA3, 0xB4A9, 0x8AA4, 0xB4AA, 0x8AA5, 0xB4AB, 0x8AA6, 0xB4AD,\t0x8AA7, 0xB4AE, 0x8AA8, 0xB4AF, 0x8AA9, 0xB4B0, 0x8AAA, 0xB4B1,\n\t0x8AAB, 0xB4B2, 0x8AAC, 0xB4B3, 0x8AAD, 0xB4B4, 0x8AAE, 0xB4B6,\t0x8AAF, 0xB4B8, 0x8AB0, 0xB4BA, 0x8AB1, 0xB4BB, 0x8AB2, 0xB4BC,\n\t0x8AB3, 0xB4BD, 0x8AB4, 0xB4BE, 0x8AB5, 0xB4BF, 0x8AB6, 0xB4C1,\t0x8AB7, 0xB4C2, 0x8AB8, 0xB4C3, 0x8AB9, 0xB4C5, 0x8ABA, 0xB4C6,\n\t0x8ABB, 0xB4C7, 0x8ABC, 0xB4C9, 0x8ABD, 0xB4CA, 0x8ABE, 0xB4CB,\t0x8ABF, 0xB4CC, 0x8AC0, 0xB4CD, 0x8AC1, 0xB4CE, 0x8AC2, 0xB4CF,\n\t0x8AC3, 0xB4D1, 0x8AC4, 0xB4D2, 0x8AC5, 0xB4D3, 0x8AC6, 0xB4D4,\t0x8AC7, 0xB4D6, 0x8AC8, 0xB4D7, 0x8AC9, 0xB4D8, 0x8ACA, 0xB4D9,\n\t0x8ACB, 0xB4DA, 0x8ACC, 0xB4DB, 0x8ACD, 0xB4DE, 0x8ACE, 0xB4DF,\t0x8ACF, 0xB4E1, 0x8AD0, 0xB4E2, 0x8AD1, 0xB4E5, 0x8AD2, 0xB4E7,\n\t0x8AD3, 0xB4E8, 0x8AD4, 0xB4E9, 0x8AD5, 0xB4EA, 0x8AD6, 0xB4EB,\t0x8AD7, 0xB4EE, 0x8AD8, 0xB4F0, 0x8AD9, 0xB4F2, 0x8ADA, 0xB4F3,\n\t0x8ADB, 0xB4F4, 0x8ADC, 0xB4F5, 0x8ADD, 0xB4F6, 0x8ADE, 0xB4F7,\t0x8ADF, 0xB4F9, 0x8AE0, 0xB4FA, 0x8AE1, 0xB4FB, 0x8AE2, 0xB4FC,\n\t0x8AE3, 0xB4FD, 0x8AE4, 0xB4FE, 0x8AE5, 0xB4FF, 0x8AE6, 0xB500,\t0x8AE7, 0xB501, 0x8AE8, 0xB502, 0x8AE9, 0xB503, 0x8AEA, 0xB504,\n\t0x8AEB, 0xB505, 0x8AEC, 0xB506, 0x8AED, 0xB507, 0x8AEE, 0xB508,\t0x8AEF, 0xB509, 0x8AF0, 0xB50A, 0x8AF1, 0xB50B, 0x8AF2, 0xB50C,\n\t0x8AF3, 0xB50D, 0x8AF4, 0xB50E, 0x8AF5, 0xB50F, 0x8AF6, 0xB510,\t0x8AF7, 0xB511, 0x8AF8, 0xB512, 0x8AF9, 0xB513, 0x8AFA, 0xB516,\n\t0x8AFB, 0xB517, 0x8AFC, 0xB519, 0x8AFD, 0xB51A, 0x8AFE, 0xB51D,\t0x8B41, 0xB51E, 0x8B42, 0xB51F, 0x8B43, 0xB520, 0x8B44, 0xB521,\n\t0x8B45, 0xB522, 0x8B46, 0xB523, 0x8B47, 0xB526, 0x8B48, 0xB52B,\t0x8B49, 0xB52C, 0x8B4A, 0xB52D, 0x8B4B, 0xB52E, 0x8B4C, 0xB52F,\n\t0x8B4D, 0xB532, 0x8B4E, 0xB533, 0x8B4F, 0xB535, 0x8B50, 0xB536,\t0x8B51, 0xB537, 0x8B52, 0xB539, 0x8B53, 0xB53A, 0x8B54, 0xB53B,\n\t0x8B55, 0xB53C, 0x8B56, 0xB53D, 0x8B57, 0xB53E, 0x8B58, 0xB53F,\t0x8B59, 0xB542, 0x8B5A, 0xB546, 0x8B61, 0xB547, 0x8B62, 0xB548,\n\t0x8B63, 0xB549, 0x8B64, 0xB54A, 0x8B65, 0xB54E, 0x8B66, 0xB54F,\t0x8B67, 0xB551, 0x8B68, 0xB552, 0x8B69, 0xB553, 0x8B6A, 0xB555,\n\t0x8B6B, 0xB556, 0x8B6C, 0xB557, 0x8B6D, 0xB558, 0x8B6E, 0xB559,\t0x8B6F, 0xB55A, 0x8B70, 0xB55B, 0x8B71, 0xB55E, 0x8B72, 0xB562,\n\t0x8B73, 0xB563, 0x8B74, 0xB564, 0x8B75, 0xB565, 0x8B76, 0xB566,\t0x8B77, 0xB567, 0x8B78, 0xB568, 0x8B79, 0xB569, 0x8B7A, 0xB56A,\n\t0x8B81, 0xB56B, 0x8B82, 0xB56C, 0x8B83, 0xB56D, 0x8B84, 0xB56E,\t0x8B85, 0xB56F, 0x8B86, 0xB570, 0x8B87, 0xB571, 0x8B88, 0xB572,\n\t0x8B89, 0xB573, 0x8B8A, 0xB574, 0x8B8B, 0xB575, 0x8B8C, 0xB576,\t0x8B8D, 0xB577, 0x8B8E, 0xB578, 0x8B8F, 0xB579, 0x8B90, 0xB57A,\n\t0x8B91, 0xB57B, 0x8B92, 0xB57C, 0x8B93, 0xB57D, 0x8B94, 0xB57E,\t0x8B95, 0xB57F, 0x8B96, 0xB580, 0x8B97, 0xB581, 0x8B98, 0xB582,\n\t0x8B99, 0xB583, 0x8B9A, 0xB584, 0x8B9B, 0xB585, 0x8B9C, 0xB586,\t0x8B9D, 0xB587, 0x8B9E, 0xB588, 0x8B9F, 0xB589, 0x8BA0, 0xB58A,\n\t0x8BA1, 0xB58B, 0x8BA2, 0xB58C, 0x8BA3, 0xB58D, 0x8BA4, 0xB58E,\t0x8BA5, 0xB58F, 0x8BA6, 0xB590, 0x8BA7, 0xB591, 0x8BA8, 0xB592,\n\t0x8BA9, 0xB593, 0x8BAA, 0xB594, 0x8BAB, 0xB595, 0x8BAC, 0xB596,\t0x8BAD, 0xB597, 0x8BAE, 0xB598, 0x8BAF, 0xB599, 0x8BB0, 0xB59A,\n\t0x8BB1, 0xB59B, 0x8BB2, 0xB59C, 0x8BB3, 0xB59D, 0x8BB4, 0xB59E,\t0x8BB5, 0xB59F, 0x8BB6, 0xB5A2, 0x8BB7, 0xB5A3, 0x8BB8, 0xB5A5,\n\t0x8BB9, 0xB5A6, 0x8BBA, 0xB5A7, 0x8BBB, 0xB5A9, 0x8BBC, 0xB5AC,\t0x8BBD, 0xB5AD, 0x8BBE, 0xB5AE, 0x8BBF, 0xB5AF, 0x8BC0, 0xB5B2,\n\t0x8BC1, 0xB5B6, 0x8BC2, 0xB5B7, 0x8BC3, 0xB5B8, 0x8BC4, 0xB5B9,\t0x8BC5, 0xB5BA, 0x8BC6, 0xB5BE, 0x8BC7, 0xB5BF, 0x8BC8, 0xB5C1,\n\t0x8BC9, 0xB5C2, 0x8BCA, 0xB5C3, 0x8BCB, 0xB5C5, 0x8BCC, 0xB5C6,\t0x8BCD, 0xB5C7, 0x8BCE, 0xB5C8, 0x8BCF, 0xB5C9, 0x8BD0, 0xB5CA,\n\t0x8BD1, 0xB5CB, 0x8BD2, 0xB5CE, 0x8BD3, 0xB5D2, 0x8BD4, 0xB5D3,\t0x8BD5, 0xB5D4, 0x8BD6, 0xB5D5, 0x8BD7, 0xB5D6, 0x8BD8, 0xB5D7,\n\t0x8BD9, 0xB5D9, 0x8BDA, 0xB5DA, 0x8BDB, 0xB5DB, 0x8BDC, 0xB5DC,\t0x8BDD, 0xB5DD, 0x8BDE, 0xB5DE, 0x8BDF, 0xB5DF, 0x8BE0, 0xB5E0,\n\t0x8BE1, 0xB5E1, 0x8BE2, 0xB5E2, 0x8BE3, 0xB5E3, 0x8BE4, 0xB5E4,\t0x8BE5, 0xB5E5, 0x8BE6, 0xB5E6, 0x8BE7, 0xB5E7, 0x8BE8, 0xB5E8,\n\t0x8BE9, 0xB5E9, 0x8BEA, 0xB5EA, 0x8BEB, 0xB5EB, 0x8BEC, 0xB5ED,\t0x8BED, 0xB5EE, 0x8BEE, 0xB5EF, 0x8BEF, 0xB5F0, 0x8BF0, 0xB5F1,\n\t0x8BF1, 0xB5F2, 0x8BF2, 0xB5F3, 0x8BF3, 0xB5F4, 0x8BF4, 0xB5F5,\t0x8BF5, 0xB5F6, 0x8BF6, 0xB5F7, 0x8BF7, 0xB5F8, 0x8BF8, 0xB5F9,\n\t0x8BF9, 0xB5FA, 0x8BFA, 0xB5FB, 0x8BFB, 0xB5FC, 0x8BFC, 0xB5FD,\t0x8BFD, 0xB5FE, 0x8BFE, 0xB5FF, 0x8C41, 0xB600, 0x8C42, 0xB601,\n\t0x8C43, 0xB602, 0x8C44, 0xB603, 0x8C45, 0xB604, 0x8C46, 0xB605,\t0x8C47, 0xB606, 0x8C48, 0xB607, 0x8C49, 0xB608, 0x8C4A, 0xB609,\n\t0x8C4B, 0xB60A, 0x8C4C, 0xB60B, 0x8C4D, 0xB60C, 0x8C4E, 0xB60D,\t0x8C4F, 0xB60E, 0x8C50, 0xB60F, 0x8C51, 0xB612, 0x8C52, 0xB613,\n\t0x8C53, 0xB615, 0x8C54, 0xB616, 0x8C55, 0xB617, 0x8C56, 0xB619,\t0x8C57, 0xB61A, 0x8C58, 0xB61B, 0x8C59, 0xB61C, 0x8C5A, 0xB61D,\n\t0x8C61, 0xB61E, 0x8C62, 0xB61F, 0x8C63, 0xB620, 0x8C64, 0xB621,\t0x8C65, 0xB622, 0x8C66, 0xB623, 0x8C67, 0xB624, 0x8C68, 0xB626,\n\t0x8C69, 0xB627, 0x8C6A, 0xB628, 0x8C6B, 0xB629, 0x8C6C, 0xB62A,\t0x8C6D, 0xB62B, 0x8C6E, 0xB62D, 0x8C6F, 0xB62E, 0x8C70, 0xB62F,\n\t0x8C71, 0xB630, 0x8C72, 0xB631, 0x8C73, 0xB632, 0x8C74, 0xB633,\t0x8C75, 0xB635, 0x8C76, 0xB636, 0x8C77, 0xB637, 0x8C78, 0xB638,\n\t0x8C79, 0xB639, 0x8C7A, 0xB63A, 0x8C81, 0xB63B, 0x8C82, 0xB63C,\t0x8C83, 0xB63D, 0x8C84, 0xB63E, 0x8C85, 0xB63F, 0x8C86, 0xB640,\n\t0x8C87, 0xB641, 0x8C88, 0xB642, 0x8C89, 0xB643, 0x8C8A, 0xB644,\t0x8C8B, 0xB645, 0x8C8C, 0xB646, 0x8C8D, 0xB647, 0x8C8E, 0xB649,\n\t0x8C8F, 0xB64A, 0x8C90, 0xB64B, 0x8C91, 0xB64C, 0x8C92, 0xB64D,\t0x8C93, 0xB64E, 0x8C94, 0xB64F, 0x8C95, 0xB650, 0x8C96, 0xB651,\n\t0x8C97, 0xB652, 0x8C98, 0xB653, 0x8C99, 0xB654, 0x8C9A, 0xB655,\t0x8C9B, 0xB656, 0x8C9C, 0xB657, 0x8C9D, 0xB658, 0x8C9E, 0xB659,\n\t0x8C9F, 0xB65A, 0x8CA0, 0xB65B, 0x8CA1, 0xB65C, 0x8CA2, 0xB65D,\t0x8CA3, 0xB65E, 0x8CA4, 0xB65F, 0x8CA5, 0xB660, 0x8CA6, 0xB661,\n\t0x8CA7, 0xB662, 0x8CA8, 0xB663, 0x8CA9, 0xB665, 0x8CAA, 0xB666,\t0x8CAB, 0xB667, 0x8CAC, 0xB669, 0x8CAD, 0xB66A, 0x8CAE, 0xB66B,\n\t0x8CAF, 0xB66C, 0x8CB0, 0xB66D, 0x8CB1, 0xB66E, 0x8CB2, 0xB66F,\t0x8CB3, 0xB670, 0x8CB4, 0xB671, 0x8CB5, 0xB672, 0x8CB6, 0xB673,\n\t0x8CB7, 0xB674, 0x8CB8, 0xB675, 0x8CB9, 0xB676, 0x8CBA, 0xB677,\t0x8CBB, 0xB678, 0x8CBC, 0xB679, 0x8CBD, 0xB67A, 0x8CBE, 0xB67B,\n\t0x8CBF, 0xB67C, 0x8CC0, 0xB67D, 0x8CC1, 0xB67E, 0x8CC2, 0xB67F,\t0x8CC3, 0xB680, 0x8CC4, 0xB681, 0x8CC5, 0xB682, 0x8CC6, 0xB683,\n\t0x8CC7, 0xB684, 0x8CC8, 0xB685, 0x8CC9, 0xB686, 0x8CCA, 0xB687,\t0x8CCB, 0xB688, 0x8CCC, 0xB689, 0x8CCD, 0xB68A, 0x8CCE, 0xB68B,\n\t0x8CCF, 0xB68C, 0x8CD0, 0xB68D, 0x8CD1, 0xB68E, 0x8CD2, 0xB68F,\t0x8CD3, 0xB690, 0x8CD4, 0xB691, 0x8CD5, 0xB692, 0x8CD6, 0xB693,\n\t0x8CD7, 0xB694, 0x8CD8, 0xB695, 0x8CD9, 0xB696, 0x8CDA, 0xB697,\t0x8CDB, 0xB698, 0x8CDC, 0xB699, 0x8CDD, 0xB69A, 0x8CDE, 0xB69B,\n\t0x8CDF, 0xB69E, 0x8CE0, 0xB69F, 0x8CE1, 0xB6A1, 0x8CE2, 0xB6A2,\t0x8CE3, 0xB6A3, 0x8CE4, 0xB6A5, 0x8CE5, 0xB6A6, 0x8CE6, 0xB6A7,\n\t0x8CE7, 0xB6A8, 0x8CE8, 0xB6A9, 0x8CE9, 0xB6AA, 0x8CEA, 0xB6AD,\t0x8CEB, 0xB6AE, 0x8CEC, 0xB6AF, 0x8CED, 0xB6B0, 0x8CEE, 0xB6B2,\n\t0x8CEF, 0xB6B3, 0x8CF0, 0xB6B4, 0x8CF1, 0xB6B5, 0x8CF2, 0xB6B6,\t0x8CF3, 0xB6B7, 0x8CF4, 0xB6B8, 0x8CF5, 0xB6B9, 0x8CF6, 0xB6BA,\n\t0x8CF7, 0xB6BB, 0x8CF8, 0xB6BC, 0x8CF9, 0xB6BD, 0x8CFA, 0xB6BE,\t0x8CFB, 0xB6BF, 0x8CFC, 0xB6C0, 0x8CFD, 0xB6C1, 0x8CFE, 0xB6C2,\n\t0x8D41, 0xB6C3, 0x8D42, 0xB6C4, 0x8D43, 0xB6C5, 0x8D44, 0xB6C6,\t0x8D45, 0xB6C7, 0x8D46, 0xB6C8, 0x8D47, 0xB6C9, 0x8D48, 0xB6CA,\n\t0x8D49, 0xB6CB, 0x8D4A, 0xB6CC, 0x8D4B, 0xB6CD, 0x8D4C, 0xB6CE,\t0x8D4D, 0xB6CF, 0x8D4E, 0xB6D0, 0x8D4F, 0xB6D1, 0x8D50, 0xB6D2,\n\t0x8D51, 0xB6D3, 0x8D52, 0xB6D5, 0x8D53, 0xB6D6, 0x8D54, 0xB6D7,\t0x8D55, 0xB6D8, 0x8D56, 0xB6D9, 0x8D57, 0xB6DA, 0x8D58, 0xB6DB,\n\t0x8D59, 0xB6DC, 0x8D5A, 0xB6DD, 0x8D61, 0xB6DE, 0x8D62, 0xB6DF,\t0x8D63, 0xB6E0, 0x8D64, 0xB6E1, 0x8D65, 0xB6E2, 0x8D66, 0xB6E3,\n\t0x8D67, 0xB6E4, 0x8D68, 0xB6E5, 0x8D69, 0xB6E6, 0x8D6A, 0xB6E7,\t0x8D6B, 0xB6E8, 0x8D6C, 0xB6E9, 0x8D6D, 0xB6EA, 0x8D6E, 0xB6EB,\n\t0x8D6F, 0xB6EC, 0x8D70, 0xB6ED, 0x8D71, 0xB6EE, 0x8D72, 0xB6EF,\t0x8D73, 0xB6F1, 0x8D74, 0xB6F2, 0x8D75, 0xB6F3, 0x8D76, 0xB6F5,\n\t0x8D77, 0xB6F6, 0x8D78, 0xB6F7, 0x8D79, 0xB6F9, 0x8D7A, 0xB6FA,\t0x8D81, 0xB6FB, 0x8D82, 0xB6FC, 0x8D83, 0xB6FD, 0x8D84, 0xB6FE,\n\t0x8D85, 0xB6FF, 0x8D86, 0xB702, 0x8D87, 0xB703, 0x8D88, 0xB704,\t0x8D89, 0xB706, 0x8D8A, 0xB707, 0x8D8B, 0xB708, 0x8D8C, 0xB709,\n\t0x8D8D, 0xB70A, 0x8D8E, 0xB70B, 0x8D8F, 0xB70C, 0x8D90, 0xB70D,\t0x8D91, 0xB70E, 0x8D92, 0xB70F, 0x8D93, 0xB710, 0x8D94, 0xB711,\n\t0x8D95, 0xB712, 0x8D96, 0xB713, 0x8D97, 0xB714, 0x8D98, 0xB715,\t0x8D99, 0xB716, 0x8D9A, 0xB717, 0x8D9B, 0xB718, 0x8D9C, 0xB719,\n\t0x8D9D, 0xB71A, 0x8D9E, 0xB71B, 0x8D9F, 0xB71C, 0x8DA0, 0xB71D,\t0x8DA1, 0xB71E, 0x8DA2, 0xB71F, 0x8DA3, 0xB720, 0x8DA4, 0xB721,\n\t0x8DA5, 0xB722, 0x8DA6, 0xB723, 0x8DA7, 0xB724, 0x8DA8, 0xB725,\t0x8DA9, 0xB726, 0x8DAA, 0xB727, 0x8DAB, 0xB72A, 0x8DAC, 0xB72B,\n\t0x8DAD, 0xB72D, 0x8DAE, 0xB72E, 0x8DAF, 0xB731, 0x8DB0, 0xB732,\t0x8DB1, 0xB733, 0x8DB2, 0xB734, 0x8DB3, 0xB735, 0x8DB4, 0xB736,\n\t0x8DB5, 0xB737, 0x8DB6, 0xB73A, 0x8DB7, 0xB73C, 0x8DB8, 0xB73D,\t0x8DB9, 0xB73E, 0x8DBA, 0xB73F, 0x8DBB, 0xB740, 0x8DBC, 0xB741,\n\t0x8DBD, 0xB742, 0x8DBE, 0xB743, 0x8DBF, 0xB745, 0x8DC0, 0xB746,\t0x8DC1, 0xB747, 0x8DC2, 0xB749, 0x8DC3, 0xB74A, 0x8DC4, 0xB74B,\n\t0x8DC5, 0xB74D, 0x8DC6, 0xB74E, 0x8DC7, 0xB74F, 0x8DC8, 0xB750,\t0x8DC9, 0xB751, 0x8DCA, 0xB752, 0x8DCB, 0xB753, 0x8DCC, 0xB756,\n\t0x8DCD, 0xB757, 0x8DCE, 0xB758, 0x8DCF, 0xB759, 0x8DD0, 0xB75A,\t0x8DD1, 0xB75B, 0x8DD2, 0xB75C, 0x8DD3, 0xB75D, 0x8DD4, 0xB75E,\n\t0x8DD5, 0xB75F, 0x8DD6, 0xB761, 0x8DD7, 0xB762, 0x8DD8, 0xB763,\t0x8DD9, 0xB765, 0x8DDA, 0xB766, 0x8DDB, 0xB767, 0x8DDC, 0xB769,\n\t0x8DDD, 0xB76A, 0x8DDE, 0xB76B, 0x8DDF, 0xB76C, 0x8DE0, 0xB76D,\t0x8DE1, 0xB76E, 0x8DE2, 0xB76F, 0x8DE3, 0xB772, 0x8DE4, 0xB774,\n\t0x8DE5, 0xB776, 0x8DE6, 0xB777, 0x8DE7, 0xB778, 0x8DE8, 0xB779,\t0x8DE9, 0xB77A, 0x8DEA, 0xB77B, 0x8DEB, 0xB77E, 0x8DEC, 0xB77F,\n\t0x8DED, 0xB781, 0x8DEE, 0xB782, 0x8DEF, 0xB783, 0x8DF0, 0xB785,\t0x8DF1, 0xB786, 0x8DF2, 0xB787, 0x8DF3, 0xB788, 0x8DF4, 0xB789,\n\t0x8DF5, 0xB78A, 0x8DF6, 0xB78B, 0x8DF7, 0xB78E, 0x8DF8, 0xB793,\t0x8DF9, 0xB794, 0x8DFA, 0xB795, 0x8DFB, 0xB79A, 0x8DFC, 0xB79B,\n\t0x8DFD, 0xB79D, 0x8DFE, 0xB79E, 0x8E41, 0xB79F, 0x8E42, 0xB7A1,\t0x8E43, 0xB7A2, 0x8E44, 0xB7A3, 0x8E45, 0xB7A4, 0x8E46, 0xB7A5,\n\t0x8E47, 0xB7A6, 0x8E48, 0xB7A7, 0x8E49, 0xB7AA, 0x8E4A, 0xB7AE,\t0x8E4B, 0xB7AF, 0x8E4C, 0xB7B0, 0x8E4D, 0xB7B1, 0x8E4E, 0xB7B2,\n\t0x8E4F, 0xB7B3, 0x8E50, 0xB7B6, 0x8E51, 0xB7B7, 0x8E52, 0xB7B9,\t0x8E53, 0xB7BA, 0x8E54, 0xB7BB, 0x8E55, 0xB7BC, 0x8E56, 0xB7BD,\n\t0x8E57, 0xB7BE, 0x8E58, 0xB7BF, 0x8E59, 0xB7C0, 0x8E5A, 0xB7C1,\t0x8E61, 0xB7C2, 0x8E62, 0xB7C3, 0x8E63, 0xB7C4, 0x8E64, 0xB7C5,\n\t0x8E65, 0xB7C6, 0x8E66, 0xB7C8, 0x8E67, 0xB7CA, 0x8E68, 0xB7CB,\t0x8E69, 0xB7CC, 0x8E6A, 0xB7CD, 0x8E6B, 0xB7CE, 0x8E6C, 0xB7CF,\n\t0x8E6D, 0xB7D0, 0x8E6E, 0xB7D1, 0x8E6F, 0xB7D2, 0x8E70, 0xB7D3,\t0x8E71, 0xB7D4, 0x8E72, 0xB7D5, 0x8E73, 0xB7D6, 0x8E74, 0xB7D7,\n\t0x8E75, 0xB7D8, 0x8E76, 0xB7D9, 0x8E77, 0xB7DA, 0x8E78, 0xB7DB,\t0x8E79, 0xB7DC, 0x8E7A, 0xB7DD, 0x8E81, 0xB7DE, 0x8E82, 0xB7DF,\n\t0x8E83, 0xB7E0, 0x8E84, 0xB7E1, 0x8E85, 0xB7E2, 0x8E86, 0xB7E3,\t0x8E87, 0xB7E4, 0x8E88, 0xB7E5, 0x8E89, 0xB7E6, 0x8E8A, 0xB7E7,\n\t0x8E8B, 0xB7E8, 0x8E8C, 0xB7E9, 0x8E8D, 0xB7EA, 0x8E8E, 0xB7EB,\t0x8E8F, 0xB7EE, 0x8E90, 0xB7EF, 0x8E91, 0xB7F1, 0x8E92, 0xB7F2,\n\t0x8E93, 0xB7F3, 0x8E94, 0xB7F5, 0x8E95, 0xB7F6, 0x8E96, 0xB7F7,\t0x8E97, 0xB7F8, 0x8E98, 0xB7F9, 0x8E99, 0xB7FA, 0x8E9A, 0xB7FB,\n\t0x8E9B, 0xB7FE, 0x8E9C, 0xB802, 0x8E9D, 0xB803, 0x8E9E, 0xB804,\t0x8E9F, 0xB805, 0x8EA0, 0xB806, 0x8EA1, 0xB80A, 0x8EA2, 0xB80B,\n\t0x8EA3, 0xB80D, 0x8EA4, 0xB80E, 0x8EA5, 0xB80F, 0x8EA6, 0xB811,\t0x8EA7, 0xB812, 0x8EA8, 0xB813, 0x8EA9, 0xB814, 0x8EAA, 0xB815,\n\t0x8EAB, 0xB816, 0x8EAC, 0xB817, 0x8EAD, 0xB81A, 0x8EAE, 0xB81C,\t0x8EAF, 0xB81E, 0x8EB0, 0xB81F, 0x8EB1, 0xB820, 0x8EB2, 0xB821,\n\t0x8EB3, 0xB822, 0x8EB4, 0xB823, 0x8EB5, 0xB826, 0x8EB6, 0xB827,\t0x8EB7, 0xB829, 0x8EB8, 0xB82A, 0x8EB9, 0xB82B, 0x8EBA, 0xB82D,\n\t0x8EBB, 0xB82E, 0x8EBC, 0xB82F, 0x8EBD, 0xB830, 0x8EBE, 0xB831,\t0x8EBF, 0xB832, 0x8EC0, 0xB833, 0x8EC1, 0xB836, 0x8EC2, 0xB83A,\n\t0x8EC3, 0xB83B, 0x8EC4, 0xB83C, 0x8EC5, 0xB83D, 0x8EC6, 0xB83E,\t0x8EC7, 0xB83F, 0x8EC8, 0xB841, 0x8EC9, 0xB842, 0x8ECA, 0xB843,\n\t0x8ECB, 0xB845, 0x8ECC, 0xB846, 0x8ECD, 0xB847, 0x8ECE, 0xB848,\t0x8ECF, 0xB849, 0x8ED0, 0xB84A, 0x8ED1, 0xB84B, 0x8ED2, 0xB84C,\n\t0x8ED3, 0xB84D, 0x8ED4, 0xB84E, 0x8ED5, 0xB84F, 0x8ED6, 0xB850,\t0x8ED7, 0xB852, 0x8ED8, 0xB854, 0x8ED9, 0xB855, 0x8EDA, 0xB856,\n\t0x8EDB, 0xB857, 0x8EDC, 0xB858, 0x8EDD, 0xB859, 0x8EDE, 0xB85A,\t0x8EDF, 0xB85B, 0x8EE0, 0xB85E, 0x8EE1, 0xB85F, 0x8EE2, 0xB861,\n\t0x8EE3, 0xB862, 0x8EE4, 0xB863, 0x8EE5, 0xB865, 0x8EE6, 0xB866,\t0x8EE7, 0xB867, 0x8EE8, 0xB868, 0x8EE9, 0xB869, 0x8EEA, 0xB86A,\n\t0x8EEB, 0xB86B, 0x8EEC, 0xB86E, 0x8EED, 0xB870, 0x8EEE, 0xB872,\t0x8EEF, 0xB873, 0x8EF0, 0xB874, 0x8EF1, 0xB875, 0x8EF2, 0xB876,\n\t0x8EF3, 0xB877, 0x8EF4, 0xB879, 0x8EF5, 0xB87A, 0x8EF6, 0xB87B,\t0x8EF7, 0xB87D, 0x8EF8, 0xB87E, 0x8EF9, 0xB87F, 0x8EFA, 0xB880,\n\t0x8EFB, 0xB881, 0x8EFC, 0xB882, 0x8EFD, 0xB883, 0x8EFE, 0xB884,\t0x8F41, 0xB885, 0x8F42, 0xB886, 0x8F43, 0xB887, 0x8F44, 0xB888,\n\t0x8F45, 0xB889, 0x8F46, 0xB88A, 0x8F47, 0xB88B, 0x8F48, 0xB88C,\t0x8F49, 0xB88E, 0x8F4A, 0xB88F, 0x8F4B, 0xB890, 0x8F4C, 0xB891,\n\t0x8F4D, 0xB892, 0x8F4E, 0xB893, 0x8F4F, 0xB894, 0x8F50, 0xB895,\t0x8F51, 0xB896, 0x8F52, 0xB897, 0x8F53, 0xB898, 0x8F54, 0xB899,\n\t0x8F55, 0xB89A, 0x8F56, 0xB89B, 0x8F57, 0xB89C, 0x8F58, 0xB89D,\t0x8F59, 0xB89E, 0x8F5A, 0xB89F, 0x8F61, 0xB8A0, 0x8F62, 0xB8A1,\n\t0x8F63, 0xB8A2, 0x8F64, 0xB8A3, 0x8F65, 0xB8A4, 0x8F66, 0xB8A5,\t0x8F67, 0xB8A6, 0x8F68, 0xB8A7, 0x8F69, 0xB8A9, 0x8F6A, 0xB8AA,\n\t0x8F6B, 0xB8AB, 0x8F6C, 0xB8AC, 0x8F6D, 0xB8AD, 0x8F6E, 0xB8AE,\t0x8F6F, 0xB8AF, 0x8F70, 0xB8B1, 0x8F71, 0xB8B2, 0x8F72, 0xB8B3,\n\t0x8F73, 0xB8B5, 0x8F74, 0xB8B6, 0x8F75, 0xB8B7, 0x8F76, 0xB8B9,\t0x8F77, 0xB8BA, 0x8F78, 0xB8BB, 0x8F79, 0xB8BC, 0x8F7A, 0xB8BD,\n\t0x8F81, 0xB8BE, 0x8F82, 0xB8BF, 0x8F83, 0xB8C2, 0x8F84, 0xB8C4,\t0x8F85, 0xB8C6, 0x8F86, 0xB8C7, 0x8F87, 0xB8C8, 0x8F88, 0xB8C9,\n\t0x8F89, 0xB8CA, 0x8F8A, 0xB8CB, 0x8F8B, 0xB8CD, 0x8F8C, 0xB8CE,\t0x8F8D, 0xB8CF, 0x8F8E, 0xB8D1, 0x8F8F, 0xB8D2, 0x8F90, 0xB8D3,\n\t0x8F91, 0xB8D5, 0x8F92, 0xB8D6, 0x8F93, 0xB8D7, 0x8F94, 0xB8D8,\t0x8F95, 0xB8D9, 0x8F96, 0xB8DA, 0x8F97, 0xB8DB, 0x8F98, 0xB8DC,\n\t0x8F99, 0xB8DE, 0x8F9A, 0xB8E0, 0x8F9B, 0xB8E2, 0x8F9C, 0xB8E3,\t0x8F9D, 0xB8E4, 0x8F9E, 0xB8E5, 0x8F9F, 0xB8E6, 0x8FA0, 0xB8E7,\n\t0x8FA1, 0xB8EA, 0x8FA2, 0xB8EB, 0x8FA3, 0xB8ED, 0x8FA4, 0xB8EE,\t0x8FA5, 0xB8EF, 0x8FA6, 0xB8F1, 0x8FA7, 0xB8F2, 0x8FA8, 0xB8F3,\n\t0x8FA9, 0xB8F4, 0x8FAA, 0xB8F5, 0x8FAB, 0xB8F6, 0x8FAC, 0xB8F7,\t0x8FAD, 0xB8FA, 0x8FAE, 0xB8FC, 0x8FAF, 0xB8FE, 0x8FB0, 0xB8FF,\n\t0x8FB1, 0xB900, 0x8FB2, 0xB901, 0x8FB3, 0xB902, 0x8FB4, 0xB903,\t0x8FB5, 0xB905, 0x8FB6, 0xB906, 0x8FB7, 0xB907, 0x8FB8, 0xB908,\n\t0x8FB9, 0xB909, 0x8FBA, 0xB90A, 0x8FBB, 0xB90B, 0x8FBC, 0xB90C,\t0x8FBD, 0xB90D, 0x8FBE, 0xB90E, 0x8FBF, 0xB90F, 0x8FC0, 0xB910,\n\t0x8FC1, 0xB911, 0x8FC2, 0xB912, 0x8FC3, 0xB913, 0x8FC4, 0xB914,\t0x8FC5, 0xB915, 0x8FC6, 0xB916, 0x8FC7, 0xB917, 0x8FC8, 0xB919,\n\t0x8FC9, 0xB91A, 0x8FCA, 0xB91B, 0x8FCB, 0xB91C, 0x8FCC, 0xB91D,\t0x8FCD, 0xB91E, 0x8FCE, 0xB91F, 0x8FCF, 0xB921, 0x8FD0, 0xB922,\n\t0x8FD1, 0xB923, 0x8FD2, 0xB924, 0x8FD3, 0xB925, 0x8FD4, 0xB926,\t0x8FD5, 0xB927, 0x8FD6, 0xB928, 0x8FD7, 0xB929, 0x8FD8, 0xB92A,\n\t0x8FD9, 0xB92B, 0x8FDA, 0xB92C, 0x8FDB, 0xB92D, 0x8FDC, 0xB92E,\t0x8FDD, 0xB92F, 0x8FDE, 0xB930, 0x8FDF, 0xB931, 0x8FE0, 0xB932,\n\t0x8FE1, 0xB933, 0x8FE2, 0xB934, 0x8FE3, 0xB935, 0x8FE4, 0xB936,\t0x8FE5, 0xB937, 0x8FE6, 0xB938, 0x8FE7, 0xB939, 0x8FE8, 0xB93A,\n\t0x8FE9, 0xB93B, 0x8FEA, 0xB93E, 0x8FEB, 0xB93F, 0x8FEC, 0xB941,\t0x8FED, 0xB942, 0x8FEE, 0xB943, 0x8FEF, 0xB945, 0x8FF0, 0xB946,\n\t0x8FF1, 0xB947, 0x8FF2, 0xB948, 0x8FF3, 0xB949, 0x8FF4, 0xB94A,\t0x8FF5, 0xB94B, 0x8FF6, 0xB94D, 0x8FF7, 0xB94E, 0x8FF8, 0xB950,\n\t0x8FF9, 0xB952, 0x8FFA, 0xB953, 0x8FFB, 0xB954, 0x8FFC, 0xB955,\t0x8FFD, 0xB956, 0x8FFE, 0xB957, 0x9041, 0xB95A, 0x9042, 0xB95B,\n\t0x9043, 0xB95D, 0x9044, 0xB95E, 0x9045, 0xB95F, 0x9046, 0xB961,\t0x9047, 0xB962, 0x9048, 0xB963, 0x9049, 0xB964, 0x904A, 0xB965,\n\t0x904B, 0xB966, 0x904C, 0xB967, 0x904D, 0xB96A, 0x904E, 0xB96C,\t0x904F, 0xB96E, 0x9050, 0xB96F, 0x9051, 0xB970, 0x9052, 0xB971,\n\t0x9053, 0xB972, 0x9054, 0xB973, 0x9055, 0xB976, 0x9056, 0xB977,\t0x9057, 0xB979, 0x9058, 0xB97A, 0x9059, 0xB97B, 0x905A, 0xB97D,\n\t0x9061, 0xB97E, 0x9062, 0xB97F, 0x9063, 0xB980, 0x9064, 0xB981,\t0x9065, 0xB982, 0x9066, 0xB983, 0x9067, 0xB986, 0x9068, 0xB988,\n\t0x9069, 0xB98B, 0x906A, 0xB98C, 0x906B, 0xB98F, 0x906C, 0xB990,\t0x906D, 0xB991, 0x906E, 0xB992, 0x906F, 0xB993, 0x9070, 0xB994,\n\t0x9071, 0xB995, 0x9072, 0xB996, 0x9073, 0xB997, 0x9074, 0xB998,\t0x9075, 0xB999, 0x9076, 0xB99A, 0x9077, 0xB99B, 0x9078, 0xB99C,\n\t0x9079, 0xB99D, 0x907A, 0xB99E, 0x9081, 0xB99F, 0x9082, 0xB9A0,\t0x9083, 0xB9A1, 0x9084, 0xB9A2, 0x9085, 0xB9A3, 0x9086, 0xB9A4,\n\t0x9087, 0xB9A5, 0x9088, 0xB9A6, 0x9089, 0xB9A7, 0x908A, 0xB9A8,\t0x908B, 0xB9A9, 0x908C, 0xB9AA, 0x908D, 0xB9AB, 0x908E, 0xB9AE,\n\t0x908F, 0xB9AF, 0x9090, 0xB9B1, 0x9091, 0xB9B2, 0x9092, 0xB9B3,\t0x9093, 0xB9B5, 0x9094, 0xB9B6, 0x9095, 0xB9B7, 0x9096, 0xB9B8,\n\t0x9097, 0xB9B9, 0x9098, 0xB9BA, 0x9099, 0xB9BB, 0x909A, 0xB9BE,\t0x909B, 0xB9C0, 0x909C, 0xB9C2, 0x909D, 0xB9C3, 0x909E, 0xB9C4,\n\t0x909F, 0xB9C5, 0x90A0, 0xB9C6, 0x90A1, 0xB9C7, 0x90A2, 0xB9CA,\t0x90A3, 0xB9CB, 0x90A4, 0xB9CD, 0x90A5, 0xB9D3, 0x90A6, 0xB9D4,\n\t0x90A7, 0xB9D5, 0x90A8, 0xB9D6, 0x90A9, 0xB9D7, 0x90AA, 0xB9DA,\t0x90AB, 0xB9DC, 0x90AC, 0xB9DF, 0x90AD, 0xB9E0, 0x90AE, 0xB9E2,\n\t0x90AF, 0xB9E6, 0x90B0, 0xB9E7, 0x90B1, 0xB9E9, 0x90B2, 0xB9EA,\t0x90B3, 0xB9EB, 0x90B4, 0xB9ED, 0x90B5, 0xB9EE, 0x90B6, 0xB9EF,\n\t0x90B7, 0xB9F0, 0x90B8, 0xB9F1, 0x90B9, 0xB9F2, 0x90BA, 0xB9F3,\t0x90BB, 0xB9F6, 0x90BC, 0xB9FB, 0x90BD, 0xB9FC, 0x90BE, 0xB9FD,\n\t0x90BF, 0xB9FE, 0x90C0, 0xB9FF, 0x90C1, 0xBA02, 0x90C2, 0xBA03,\t0x90C3, 0xBA04, 0x90C4, 0xBA05, 0x90C5, 0xBA06, 0x90C6, 0xBA07,\n\t0x90C7, 0xBA09, 0x90C8, 0xBA0A, 0x90C9, 0xBA0B, 0x90CA, 0xBA0C,\t0x90CB, 0xBA0D, 0x90CC, 0xBA0E, 0x90CD, 0xBA0F, 0x90CE, 0xBA10,\n\t0x90CF, 0xBA11, 0x90D0, 0xBA12, 0x90D1, 0xBA13, 0x90D2, 0xBA14,\t0x90D3, 0xBA16, 0x90D4, 0xBA17, 0x90D5, 0xBA18, 0x90D6, 0xBA19,\n\t0x90D7, 0xBA1A, 0x90D8, 0xBA1B, 0x90D9, 0xBA1C, 0x90DA, 0xBA1D,\t0x90DB, 0xBA1E, 0x90DC, 0xBA1F, 0x90DD, 0xBA20, 0x90DE, 0xBA21,\n\t0x90DF, 0xBA22, 0x90E0, 0xBA23, 0x90E1, 0xBA24, 0x90E2, 0xBA25,\t0x90E3, 0xBA26, 0x90E4, 0xBA27, 0x90E5, 0xBA28, 0x90E6, 0xBA29,\n\t0x90E7, 0xBA2A, 0x90E8, 0xBA2B, 0x90E9, 0xBA2C, 0x90EA, 0xBA2D,\t0x90EB, 0xBA2E, 0x90EC, 0xBA2F, 0x90ED, 0xBA30, 0x90EE, 0xBA31,\n\t0x90EF, 0xBA32, 0x90F0, 0xBA33, 0x90F1, 0xBA34, 0x90F2, 0xBA35,\t0x90F3, 0xBA36, 0x90F4, 0xBA37, 0x90F5, 0xBA3A, 0x90F6, 0xBA3B,\n\t0x90F7, 0xBA3D, 0x90F8, 0xBA3E, 0x90F9, 0xBA3F, 0x90FA, 0xBA41,\t0x90FB, 0xBA43, 0x90FC, 0xBA44, 0x90FD, 0xBA45, 0x90FE, 0xBA46,\n\t0x9141, 0xBA47, 0x9142, 0xBA4A, 0x9143, 0xBA4C, 0x9144, 0xBA4F,\t0x9145, 0xBA50, 0x9146, 0xBA51, 0x9147, 0xBA52, 0x9148, 0xBA56,\n\t0x9149, 0xBA57, 0x914A, 0xBA59, 0x914B, 0xBA5A, 0x914C, 0xBA5B,\t0x914D, 0xBA5D, 0x914E, 0xBA5E, 0x914F, 0xBA5F, 0x9150, 0xBA60,\n\t0x9151, 0xBA61, 0x9152, 0xBA62, 0x9153, 0xBA63, 0x9154, 0xBA66,\t0x9155, 0xBA6A, 0x9156, 0xBA6B, 0x9157, 0xBA6C, 0x9158, 0xBA6D,\n\t0x9159, 0xBA6E, 0x915A, 0xBA6F, 0x9161, 0xBA72, 0x9162, 0xBA73,\t0x9163, 0xBA75, 0x9164, 0xBA76, 0x9165, 0xBA77, 0x9166, 0xBA79,\n\t0x9167, 0xBA7A, 0x9168, 0xBA7B, 0x9169, 0xBA7C, 0x916A, 0xBA7D,\t0x916B, 0xBA7E, 0x916C, 0xBA7F, 0x916D, 0xBA80, 0x916E, 0xBA81,\n\t0x916F, 0xBA82, 0x9170, 0xBA86, 0x9171, 0xBA88, 0x9172, 0xBA89,\t0x9173, 0xBA8A, 0x9174, 0xBA8B, 0x9175, 0xBA8D, 0x9176, 0xBA8E,\n\t0x9177, 0xBA8F, 0x9178, 0xBA90, 0x9179, 0xBA91, 0x917A, 0xBA92,\t0x9181, 0xBA93, 0x9182, 0xBA94, 0x9183, 0xBA95, 0x9184, 0xBA96,\n\t0x9185, 0xBA97, 0x9186, 0xBA98, 0x9187, 0xBA99, 0x9188, 0xBA9A,\t0x9189, 0xBA9B, 0x918A, 0xBA9C, 0x918B, 0xBA9D, 0x918C, 0xBA9E,\n\t0x918D, 0xBA9F, 0x918E, 0xBAA0, 0x918F, 0xBAA1, 0x9190, 0xBAA2,\t0x9191, 0xBAA3, 0x9192, 0xBAA4, 0x9193, 0xBAA5, 0x9194, 0xBAA6,\n\t0x9195, 0xBAA7, 0x9196, 0xBAAA, 0x9197, 0xBAAD, 0x9198, 0xBAAE,\t0x9199, 0xBAAF, 0x919A, 0xBAB1, 0x919B, 0xBAB3, 0x919C, 0xBAB4,\n\t0x919D, 0xBAB5, 0x919E, 0xBAB6, 0x919F, 0xBAB7, 0x91A0, 0xBABA,\t0x91A1, 0xBABC, 0x91A2, 0xBABE, 0x91A3, 0xBABF, 0x91A4, 0xBAC0,\n\t0x91A5, 0xBAC1, 0x91A6, 0xBAC2, 0x91A7, 0xBAC3, 0x91A8, 0xBAC5,\t0x91A9, 0xBAC6, 0x91AA, 0xBAC7, 0x91AB, 0xBAC9, 0x91AC, 0xBACA,\n\t0x91AD, 0xBACB, 0x91AE, 0xBACC, 0x91AF, 0xBACD, 0x91B0, 0xBACE,\t0x91B1, 0xBACF, 0x91B2, 0xBAD0, 0x91B3, 0xBAD1, 0x91B4, 0xBAD2,\n\t0x91B5, 0xBAD3, 0x91B6, 0xBAD4, 0x91B7, 0xBAD5, 0x91B8, 0xBAD6,\t0x91B9, 0xBAD7, 0x91BA, 0xBADA, 0x91BB, 0xBADB, 0x91BC, 0xBADC,\n\t0x91BD, 0xBADD, 0x91BE, 0xBADE, 0x91BF, 0xBADF, 0x91C0, 0xBAE0,\t0x91C1, 0xBAE1, 0x91C2, 0xBAE2, 0x91C3, 0xBAE3, 0x91C4, 0xBAE4,\n\t0x91C5, 0xBAE5, 0x91C6, 0xBAE6, 0x91C7, 0xBAE7, 0x91C8, 0xBAE8,\t0x91C9, 0xBAE9, 0x91CA, 0xBAEA, 0x91CB, 0xBAEB, 0x91CC, 0xBAEC,\n\t0x91CD, 0xBAED, 0x91CE, 0xBAEE, 0x91CF, 0xBAEF, 0x91D0, 0xBAF0,\t0x91D1, 0xBAF1, 0x91D2, 0xBAF2, 0x91D3, 0xBAF3, 0x91D4, 0xBAF4,\n\t0x91D5, 0xBAF5, 0x91D6, 0xBAF6, 0x91D7, 0xBAF7, 0x91D8, 0xBAF8,\t0x91D9, 0xBAF9, 0x91DA, 0xBAFA, 0x91DB, 0xBAFB, 0x91DC, 0xBAFD,\n\t0x91DD, 0xBAFE, 0x91DE, 0xBAFF, 0x91DF, 0xBB01, 0x91E0, 0xBB02,\t0x91E1, 0xBB03, 0x91E2, 0xBB05, 0x91E3, 0xBB06, 0x91E4, 0xBB07,\n\t0x91E5, 0xBB08, 0x91E6, 0xBB09, 0x91E7, 0xBB0A, 0x91E8, 0xBB0B,\t0x91E9, 0xBB0C, 0x91EA, 0xBB0E, 0x91EB, 0xBB10, 0x91EC, 0xBB12,\n\t0x91ED, 0xBB13, 0x91EE, 0xBB14, 0x91EF, 0xBB15, 0x91F0, 0xBB16,\t0x91F1, 0xBB17, 0x91F2, 0xBB19, 0x91F3, 0xBB1A, 0x91F4, 0xBB1B,\n\t0x91F5, 0xBB1D, 0x91F6, 0xBB1E, 0x91F7, 0xBB1F, 0x91F8, 0xBB21,\t0x91F9, 0xBB22, 0x91FA, 0xBB23, 0x91FB, 0xBB24, 0x91FC, 0xBB25,\n\t0x91FD, 0xBB26, 0x91FE, 0xBB27, 0x9241, 0xBB28, 0x9242, 0xBB2A,\t0x9243, 0xBB2C, 0x9244, 0xBB2D, 0x9245, 0xBB2E, 0x9246, 0xBB2F,\n\t0x9247, 0xBB30, 0x9248, 0xBB31, 0x9249, 0xBB32, 0x924A, 0xBB33,\t0x924B, 0xBB37, 0x924C, 0xBB39, 0x924D, 0xBB3A, 0x924E, 0xBB3F,\n\t0x924F, 0xBB40, 0x9250, 0xBB41, 0x9251, 0xBB42, 0x9252, 0xBB43,\t0x9253, 0xBB46, 0x9254, 0xBB48, 0x9255, 0xBB4A, 0x9256, 0xBB4B,\n\t0x9257, 0xBB4C, 0x9258, 0xBB4E, 0x9259, 0xBB51, 0x925A, 0xBB52,\t0x9261, 0xBB53, 0x9262, 0xBB55, 0x9263, 0xBB56, 0x9264, 0xBB57,\n\t0x9265, 0xBB59, 0x9266, 0xBB5A, 0x9267, 0xBB5B, 0x9268, 0xBB5C,\t0x9269, 0xBB5D, 0x926A, 0xBB5E, 0x926B, 0xBB5F, 0x926C, 0xBB60,\n\t0x926D, 0xBB62, 0x926E, 0xBB64, 0x926F, 0xBB65, 0x9270, 0xBB66,\t0x9271, 0xBB67, 0x9272, 0xBB68, 0x9273, 0xBB69, 0x9274, 0xBB6A,\n\t0x9275, 0xBB6B, 0x9276, 0xBB6D, 0x9277, 0xBB6E, 0x9278, 0xBB6F,\t0x9279, 0xBB70, 0x927A, 0xBB71, 0x9281, 0xBB72, 0x9282, 0xBB73,\n\t0x9283, 0xBB74, 0x9284, 0xBB75, 0x9285, 0xBB76, 0x9286, 0xBB77,\t0x9287, 0xBB78, 0x9288, 0xBB79, 0x9289, 0xBB7A, 0x928A, 0xBB7B,\n\t0x928B, 0xBB7C, 0x928C, 0xBB7D, 0x928D, 0xBB7E, 0x928E, 0xBB7F,\t0x928F, 0xBB80, 0x9290, 0xBB81, 0x9291, 0xBB82, 0x9292, 0xBB83,\n\t0x9293, 0xBB84, 0x9294, 0xBB85, 0x9295, 0xBB86, 0x9296, 0xBB87,\t0x9297, 0xBB89, 0x9298, 0xBB8A, 0x9299, 0xBB8B, 0x929A, 0xBB8D,\n\t0x929B, 0xBB8E, 0x929C, 0xBB8F, 0x929D, 0xBB91, 0x929E, 0xBB92,\t0x929F, 0xBB93, 0x92A0, 0xBB94, 0x92A1, 0xBB95, 0x92A2, 0xBB96,\n\t0x92A3, 0xBB97, 0x92A4, 0xBB98, 0x92A5, 0xBB99, 0x92A6, 0xBB9A,\t0x92A7, 0xBB9B, 0x92A8, 0xBB9C, 0x92A9, 0xBB9D, 0x92AA, 0xBB9E,\n\t0x92AB, 0xBB9F, 0x92AC, 0xBBA0, 0x92AD, 0xBBA1, 0x92AE, 0xBBA2,\t0x92AF, 0xBBA3, 0x92B0, 0xBBA5, 0x92B1, 0xBBA6, 0x92B2, 0xBBA7,\n\t0x92B3, 0xBBA9, 0x92B4, 0xBBAA, 0x92B5, 0xBBAB, 0x92B6, 0xBBAD,\t0x92B7, 0xBBAE, 0x92B8, 0xBBAF, 0x92B9, 0xBBB0, 0x92BA, 0xBBB1,\n\t0x92BB, 0xBBB2, 0x92BC, 0xBBB3, 0x92BD, 0xBBB5, 0x92BE, 0xBBB6,\t0x92BF, 0xBBB8, 0x92C0, 0xBBB9, 0x92C1, 0xBBBA, 0x92C2, 0xBBBB,\n\t0x92C3, 0xBBBC, 0x92C4, 0xBBBD, 0x92C5, 0xBBBE, 0x92C6, 0xBBBF,\t0x92C7, 0xBBC1, 0x92C8, 0xBBC2, 0x92C9, 0xBBC3, 0x92CA, 0xBBC5,\n\t0x92CB, 0xBBC6, 0x92CC, 0xBBC7, 0x92CD, 0xBBC9, 0x92CE, 0xBBCA,\t0x92CF, 0xBBCB, 0x92D0, 0xBBCC, 0x92D1, 0xBBCD, 0x92D2, 0xBBCE,\n\t0x92D3, 0xBBCF, 0x92D4, 0xBBD1, 0x92D5, 0xBBD2, 0x92D6, 0xBBD4,\t0x92D7, 0xBBD5, 0x92D8, 0xBBD6, 0x92D9, 0xBBD7, 0x92DA, 0xBBD8,\n\t0x92DB, 0xBBD9, 0x92DC, 0xBBDA, 0x92DD, 0xBBDB, 0x92DE, 0xBBDC,\t0x92DF, 0xBBDD, 0x92E0, 0xBBDE, 0x92E1, 0xBBDF, 0x92E2, 0xBBE0,\n\t0x92E3, 0xBBE1, 0x92E4, 0xBBE2, 0x92E5, 0xBBE3, 0x92E6, 0xBBE4,\t0x92E7, 0xBBE5, 0x92E8, 0xBBE6, 0x92E9, 0xBBE7, 0x92EA, 0xBBE8,\n\t0x92EB, 0xBBE9, 0x92EC, 0xBBEA, 0x92ED, 0xBBEB, 0x92EE, 0xBBEC,\t0x92EF, 0xBBED, 0x92F0, 0xBBEE, 0x92F1, 0xBBEF, 0x92F2, 0xBBF0,\n\t0x92F3, 0xBBF1, 0x92F4, 0xBBF2, 0x92F5, 0xBBF3, 0x92F6, 0xBBF4,\t0x92F7, 0xBBF5, 0x92F8, 0xBBF6, 0x92F9, 0xBBF7, 0x92FA, 0xBBFA,\n\t0x92FB, 0xBBFB, 0x92FC, 0xBBFD, 0x92FD, 0xBBFE, 0x92FE, 0xBC01,\t0x9341, 0xBC03, 0x9342, 0xBC04, 0x9343, 0xBC05, 0x9344, 0xBC06,\n\t0x9345, 0xBC07, 0x9346, 0xBC0A, 0x9347, 0xBC0E, 0x9348, 0xBC10,\t0x9349, 0xBC12, 0x934A, 0xBC13, 0x934B, 0xBC19, 0x934C, 0xBC1A,\n\t0x934D, 0xBC20, 0x934E, 0xBC21, 0x934F, 0xBC22, 0x9350, 0xBC23,\t0x9351, 0xBC26, 0x9352, 0xBC28, 0x9353, 0xBC2A, 0x9354, 0xBC2B,\n\t0x9355, 0xBC2C, 0x9356, 0xBC2E, 0x9357, 0xBC2F, 0x9358, 0xBC32,\t0x9359, 0xBC33, 0x935A, 0xBC35, 0x9361, 0xBC36, 0x9362, 0xBC37,\n\t0x9363, 0xBC39, 0x9364, 0xBC3A, 0x9365, 0xBC3B, 0x9366, 0xBC3C,\t0x9367, 0xBC3D, 0x9368, 0xBC3E, 0x9369, 0xBC3F, 0x936A, 0xBC42,\n\t0x936B, 0xBC46, 0x936C, 0xBC47, 0x936D, 0xBC48, 0x936E, 0xBC4A,\t0x936F, 0xBC4B, 0x9370, 0xBC4E, 0x9371, 0xBC4F, 0x9372, 0xBC51,\n\t0x9373, 0xBC52, 0x9374, 0xBC53, 0x9375, 0xBC54, 0x9376, 0xBC55,\t0x9377, 0xBC56, 0x9378, 0xBC57, 0x9379, 0xBC58, 0x937A, 0xBC59,\n\t0x9381, 0xBC5A, 0x9382, 0xBC5B, 0x9383, 0xBC5C, 0x9384, 0xBC5E,\t0x9385, 0xBC5F, 0x9386, 0xBC60, 0x9387, 0xBC61, 0x9388, 0xBC62,\n\t0x9389, 0xBC63, 0x938A, 0xBC64, 0x938B, 0xBC65, 0x938C, 0xBC66,\t0x938D, 0xBC67, 0x938E, 0xBC68, 0x938F, 0xBC69, 0x9390, 0xBC6A,\n\t0x9391, 0xBC6B, 0x9392, 0xBC6C, 0x9393, 0xBC6D, 0x9394, 0xBC6E,\t0x9395, 0xBC6F, 0x9396, 0xBC70, 0x9397, 0xBC71, 0x9398, 0xBC72,\n\t0x9399, 0xBC73, 0x939A, 0xBC74, 0x939B, 0xBC75, 0x939C, 0xBC76,\t0x939D, 0xBC77, 0x939E, 0xBC78, 0x939F, 0xBC79, 0x93A0, 0xBC7A,\n\t0x93A1, 0xBC7B, 0x93A2, 0xBC7C, 0x93A3, 0xBC7D, 0x93A4, 0xBC7E,\t0x93A5, 0xBC7F, 0x93A6, 0xBC80, 0x93A7, 0xBC81, 0x93A8, 0xBC82,\n\t0x93A9, 0xBC83, 0x93AA, 0xBC86, 0x93AB, 0xBC87, 0x93AC, 0xBC89,\t0x93AD, 0xBC8A, 0x93AE, 0xBC8D, 0x93AF, 0xBC8F, 0x93B0, 0xBC90,\n\t0x93B1, 0xBC91, 0x93B2, 0xBC92, 0x93B3, 0xBC93, 0x93B4, 0xBC96,\t0x93B5, 0xBC98, 0x93B6, 0xBC9B, 0x93B7, 0xBC9C, 0x93B8, 0xBC9D,\n\t0x93B9, 0xBC9E, 0x93BA, 0xBC9F, 0x93BB, 0xBCA2, 0x93BC, 0xBCA3,\t0x93BD, 0xBCA5, 0x93BE, 0xBCA6, 0x93BF, 0xBCA9, 0x93C0, 0xBCAA,\n\t0x93C1, 0xBCAB, 0x93C2, 0xBCAC, 0x93C3, 0xBCAD, 0x93C4, 0xBCAE,\t0x93C5, 0xBCAF, 0x93C6, 0xBCB2, 0x93C7, 0xBCB6, 0x93C8, 0xBCB7,\n\t0x93C9, 0xBCB8, 0x93CA, 0xBCB9, 0x93CB, 0xBCBA, 0x93CC, 0xBCBB,\t0x93CD, 0xBCBE, 0x93CE, 0xBCBF, 0x93CF, 0xBCC1, 0x93D0, 0xBCC2,\n\t0x93D1, 0xBCC3, 0x93D2, 0xBCC5, 0x93D3, 0xBCC6, 0x93D4, 0xBCC7,\t0x93D5, 0xBCC8, 0x93D6, 0xBCC9, 0x93D7, 0xBCCA, 0x93D8, 0xBCCB,\n\t0x93D9, 0xBCCC, 0x93DA, 0xBCCE, 0x93DB, 0xBCD2, 0x93DC, 0xBCD3,\t0x93DD, 0xBCD4, 0x93DE, 0xBCD6, 0x93DF, 0xBCD7, 0x93E0, 0xBCD9,\n\t0x93E1, 0xBCDA, 0x93E2, 0xBCDB, 0x93E3, 0xBCDD, 0x93E4, 0xBCDE,\t0x93E5, 0xBCDF, 0x93E6, 0xBCE0, 0x93E7, 0xBCE1, 0x93E8, 0xBCE2,\n\t0x93E9, 0xBCE3, 0x93EA, 0xBCE4, 0x93EB, 0xBCE5, 0x93EC, 0xBCE6,\t0x93ED, 0xBCE7, 0x93EE, 0xBCE8, 0x93EF, 0xBCE9, 0x93F0, 0xBCEA,\n\t0x93F1, 0xBCEB, 0x93F2, 0xBCEC, 0x93F3, 0xBCED, 0x93F4, 0xBCEE,\t0x93F5, 0xBCEF, 0x93F6, 0xBCF0, 0x93F7, 0xBCF1, 0x93F8, 0xBCF2,\n\t0x93F9, 0xBCF3, 0x93FA, 0xBCF7, 0x93FB, 0xBCF9, 0x93FC, 0xBCFA,\t0x93FD, 0xBCFB, 0x93FE, 0xBCFD, 0x9441, 0xBCFE, 0x9442, 0xBCFF,\n\t0x9443, 0xBD00, 0x9444, 0xBD01, 0x9445, 0xBD02, 0x9446, 0xBD03,\t0x9447, 0xBD06, 0x9448, 0xBD08, 0x9449, 0xBD0A, 0x944A, 0xBD0B,\n\t0x944B, 0xBD0C, 0x944C, 0xBD0D, 0x944D, 0xBD0E, 0x944E, 0xBD0F,\t0x944F, 0xBD11, 0x9450, 0xBD12, 0x9451, 0xBD13, 0x9452, 0xBD15,\n\t0x9453, 0xBD16, 0x9454, 0xBD17, 0x9455, 0xBD18, 0x9456, 0xBD19,\t0x9457, 0xBD1A, 0x9458, 0xBD1B, 0x9459, 0xBD1C, 0x945A, 0xBD1D,\n\t0x9461, 0xBD1E, 0x9462, 0xBD1F, 0x9463, 0xBD20, 0x9464, 0xBD21,\t0x9465, 0xBD22, 0x9466, 0xBD23, 0x9467, 0xBD25, 0x9468, 0xBD26,\n\t0x9469, 0xBD27, 0x946A, 0xBD28, 0x946B, 0xBD29, 0x946C, 0xBD2A,\t0x946D, 0xBD2B, 0x946E, 0xBD2D, 0x946F, 0xBD2E, 0x9470, 0xBD2F,\n\t0x9471, 0xBD30, 0x9472, 0xBD31, 0x9473, 0xBD32, 0x9474, 0xBD33,\t0x9475, 0xBD34, 0x9476, 0xBD35, 0x9477, 0xBD36, 0x9478, 0xBD37,\n\t0x9479, 0xBD38, 0x947A, 0xBD39, 0x9481, 0xBD3A, 0x9482, 0xBD3B,\t0x9483, 0xBD3C, 0x9484, 0xBD3D, 0x9485, 0xBD3E, 0x9486, 0xBD3F,\n\t0x9487, 0xBD41, 0x9488, 0xBD42, 0x9489, 0xBD43, 0x948A, 0xBD44,\t0x948B, 0xBD45, 0x948C, 0xBD46, 0x948D, 0xBD47, 0x948E, 0xBD4A,\n\t0x948F, 0xBD4B, 0x9490, 0xBD4D, 0x9491, 0xBD4E, 0x9492, 0xBD4F,\t0x9493, 0xBD51, 0x9494, 0xBD52, 0x9495, 0xBD53, 0x9496, 0xBD54,\n\t0x9497, 0xBD55, 0x9498, 0xBD56, 0x9499, 0xBD57, 0x949A, 0xBD5A,\t0x949B, 0xBD5B, 0x949C, 0xBD5C, 0x949D, 0xBD5D, 0x949E, 0xBD5E,\n\t0x949F, 0xBD5F, 0x94A0, 0xBD60, 0x94A1, 0xBD61, 0x94A2, 0xBD62,\t0x94A3, 0xBD63, 0x94A4, 0xBD65, 0x94A5, 0xBD66, 0x94A6, 0xBD67,\n\t0x94A7, 0xBD69, 0x94A8, 0xBD6A, 0x94A9, 0xBD6B, 0x94AA, 0xBD6C,\t0x94AB, 0xBD6D, 0x94AC, 0xBD6E, 0x94AD, 0xBD6F, 0x94AE, 0xBD70,\n\t0x94AF, 0xBD71, 0x94B0, 0xBD72, 0x94B1, 0xBD73, 0x94B2, 0xBD74,\t0x94B3, 0xBD75, 0x94B4, 0xBD76, 0x94B5, 0xBD77, 0x94B6, 0xBD78,\n\t0x94B7, 0xBD79, 0x94B8, 0xBD7A, 0x94B9, 0xBD7B, 0x94BA, 0xBD7C,\t0x94BB, 0xBD7D, 0x94BC, 0xBD7E, 0x94BD, 0xBD7F, 0x94BE, 0xBD82,\n\t0x94BF, 0xBD83, 0x94C0, 0xBD85, 0x94C1, 0xBD86, 0x94C2, 0xBD8B,\t0x94C3, 0xBD8C, 0x94C4, 0xBD8D, 0x94C5, 0xBD8E, 0x94C6, 0xBD8F,\n\t0x94C7, 0xBD92, 0x94C8, 0xBD94, 0x94C9, 0xBD96, 0x94CA, 0xBD97,\t0x94CB, 0xBD98, 0x94CC, 0xBD9B, 0x94CD, 0xBD9D, 0x94CE, 0xBD9E,\n\t0x94CF, 0xBD9F, 0x94D0, 0xBDA0, 0x94D1, 0xBDA1, 0x94D2, 0xBDA2,\t0x94D3, 0xBDA3, 0x94D4, 0xBDA5, 0x94D5, 0xBDA6, 0x94D6, 0xBDA7,\n\t0x94D7, 0xBDA8, 0x94D8, 0xBDA9, 0x94D9, 0xBDAA, 0x94DA, 0xBDAB,\t0x94DB, 0xBDAC, 0x94DC, 0xBDAD, 0x94DD, 0xBDAE, 0x94DE, 0xBDAF,\n\t0x94DF, 0xBDB1, 0x94E0, 0xBDB2, 0x94E1, 0xBDB3, 0x94E2, 0xBDB4,\t0x94E3, 0xBDB5, 0x94E4, 0xBDB6, 0x94E5, 0xBDB7, 0x94E6, 0xBDB9,\n\t0x94E7, 0xBDBA, 0x94E8, 0xBDBB, 0x94E9, 0xBDBC, 0x94EA, 0xBDBD,\t0x94EB, 0xBDBE, 0x94EC, 0xBDBF, 0x94ED, 0xBDC0, 0x94EE, 0xBDC1,\n\t0x94EF, 0xBDC2, 0x94F0, 0xBDC3, 0x94F1, 0xBDC4, 0x94F2, 0xBDC5,\t0x94F3, 0xBDC6, 0x94F4, 0xBDC7, 0x94F5, 0xBDC8, 0x94F6, 0xBDC9,\n\t0x94F7, 0xBDCA, 0x94F8, 0xBDCB, 0x94F9, 0xBDCC, 0x94FA, 0xBDCD,\t0x94FB, 0xBDCE, 0x94FC, 0xBDCF, 0x94FD, 0xBDD0, 0x94FE, 0xBDD1,\n\t0x9541, 0xBDD2, 0x9542, 0xBDD3, 0x9543, 0xBDD6, 0x9544, 0xBDD7,\t0x9545, 0xBDD9, 0x9546, 0xBDDA, 0x9547, 0xBDDB, 0x9548, 0xBDDD,\n\t0x9549, 0xBDDE, 0x954A, 0xBDDF, 0x954B, 0xBDE0, 0x954C, 0xBDE1,\t0x954D, 0xBDE2, 0x954E, 0xBDE3, 0x954F, 0xBDE4, 0x9550, 0xBDE5,\n\t0x9551, 0xBDE6, 0x9552, 0xBDE7, 0x9553, 0xBDE8, 0x9554, 0xBDEA,\t0x9555, 0xBDEB, 0x9556, 0xBDEC, 0x9557, 0xBDED, 0x9558, 0xBDEE,\n\t0x9559, 0xBDEF, 0x955A, 0xBDF1, 0x9561, 0xBDF2, 0x9562, 0xBDF3,\t0x9563, 0xBDF5, 0x9564, 0xBDF6, 0x9565, 0xBDF7, 0x9566, 0xBDF9,\n\t0x9567, 0xBDFA, 0x9568, 0xBDFB, 0x9569, 0xBDFC, 0x956A, 0xBDFD,\t0x956B, 0xBDFE, 0x956C, 0xBDFF, 0x956D, 0xBE01, 0x956E, 0xBE02,\n\t0x956F, 0xBE04, 0x9570, 0xBE06, 0x9571, 0xBE07, 0x9572, 0xBE08,\t0x9573, 0xBE09, 0x9574, 0xBE0A, 0x9575, 0xBE0B, 0x9576, 0xBE0E,\n\t0x9577, 0xBE0F, 0x9578, 0xBE11, 0x9579, 0xBE12, 0x957A, 0xBE13,\t0x9581, 0xBE15, 0x9582, 0xBE16, 0x9583, 0xBE17, 0x9584, 0xBE18,\n\t0x9585, 0xBE19, 0x9586, 0xBE1A, 0x9587, 0xBE1B, 0x9588, 0xBE1E,\t0x9589, 0xBE20, 0x958A, 0xBE21, 0x958B, 0xBE22, 0x958C, 0xBE23,\n\t0x958D, 0xBE24, 0x958E, 0xBE25, 0x958F, 0xBE26, 0x9590, 0xBE27,\t0x9591, 0xBE28, 0x9592, 0xBE29, 0x9593, 0xBE2A, 0x9594, 0xBE2B,\n\t0x9595, 0xBE2C, 0x9596, 0xBE2D, 0x9597, 0xBE2E, 0x9598, 0xBE2F,\t0x9599, 0xBE30, 0x959A, 0xBE31, 0x959B, 0xBE32, 0x959C, 0xBE33,\n\t0x959D, 0xBE34, 0x959E, 0xBE35, 0x959F, 0xBE36, 0x95A0, 0xBE37,\t0x95A1, 0xBE38, 0x95A2, 0xBE39, 0x95A3, 0xBE3A, 0x95A4, 0xBE3B,\n\t0x95A5, 0xBE3C, 0x95A6, 0xBE3D, 0x95A7, 0xBE3E, 0x95A8, 0xBE3F,\t0x95A9, 0xBE40, 0x95AA, 0xBE41, 0x95AB, 0xBE42, 0x95AC, 0xBE43,\n\t0x95AD, 0xBE46, 0x95AE, 0xBE47, 0x95AF, 0xBE49, 0x95B0, 0xBE4A,\t0x95B1, 0xBE4B, 0x95B2, 0xBE4D, 0x95B3, 0xBE4F, 0x95B4, 0xBE50,\n\t0x95B5, 0xBE51, 0x95B6, 0xBE52, 0x95B7, 0xBE53, 0x95B8, 0xBE56,\t0x95B9, 0xBE58, 0x95BA, 0xBE5C, 0x95BB, 0xBE5D, 0x95BC, 0xBE5E,\n\t0x95BD, 0xBE5F, 0x95BE, 0xBE62, 0x95BF, 0xBE63, 0x95C0, 0xBE65,\t0x95C1, 0xBE66, 0x95C2, 0xBE67, 0x95C3, 0xBE69, 0x95C4, 0xBE6B,\n\t0x95C5, 0xBE6C, 0x95C6, 0xBE6D, 0x95C7, 0xBE6E, 0x95C8, 0xBE6F,\t0x95C9, 0xBE72, 0x95CA, 0xBE76, 0x95CB, 0xBE77, 0x95CC, 0xBE78,\n\t0x95CD, 0xBE79, 0x95CE, 0xBE7A, 0x95CF, 0xBE7E, 0x95D0, 0xBE7F,\t0x95D1, 0xBE81, 0x95D2, 0xBE82, 0x95D3, 0xBE83, 0x95D4, 0xBE85,\n\t0x95D5, 0xBE86, 0x95D6, 0xBE87, 0x95D7, 0xBE88, 0x95D8, 0xBE89,\t0x95D9, 0xBE8A, 0x95DA, 0xBE8B, 0x95DB, 0xBE8E, 0x95DC, 0xBE92,\n\t0x95DD, 0xBE93, 0x95DE, 0xBE94, 0x95DF, 0xBE95, 0x95E0, 0xBE96,\t0x95E1, 0xBE97, 0x95E2, 0xBE9A, 0x95E3, 0xBE9B, 0x95E4, 0xBE9C,\n\t0x95E5, 0xBE9D, 0x95E6, 0xBE9E, 0x95E7, 0xBE9F, 0x95E8, 0xBEA0,\t0x95E9, 0xBEA1, 0x95EA, 0xBEA2, 0x95EB, 0xBEA3, 0x95EC, 0xBEA4,\n\t0x95ED, 0xBEA5, 0x95EE, 0xBEA6, 0x95EF, 0xBEA7, 0x95F0, 0xBEA9,\t0x95F1, 0xBEAA, 0x95F2, 0xBEAB, 0x95F3, 0xBEAC, 0x95F4, 0xBEAD,\n\t0x95F5, 0xBEAE, 0x95F6, 0xBEAF, 0x95F7, 0xBEB0, 0x95F8, 0xBEB1,\t0x95F9, 0xBEB2, 0x95FA, 0xBEB3, 0x95FB, 0xBEB4, 0x95FC, 0xBEB5,\n\t0x95FD, 0xBEB6, 0x95FE, 0xBEB7, 0x9641, 0xBEB8, 0x9642, 0xBEB9,\t0x9643, 0xBEBA, 0x9644, 0xBEBB, 0x9645, 0xBEBC, 0x9646, 0xBEBD,\n\t0x9647, 0xBEBE, 0x9648, 0xBEBF, 0x9649, 0xBEC0, 0x964A, 0xBEC1,\t0x964B, 0xBEC2, 0x964C, 0xBEC3, 0x964D, 0xBEC4, 0x964E, 0xBEC5,\n\t0x964F, 0xBEC6, 0x9650, 0xBEC7, 0x9651, 0xBEC8, 0x9652, 0xBEC9,\t0x9653, 0xBECA, 0x9654, 0xBECB, 0x9655, 0xBECC, 0x9656, 0xBECD,\n\t0x9657, 0xBECE, 0x9658, 0xBECF, 0x9659, 0xBED2, 0x965A, 0xBED3,\t0x9661, 0xBED5, 0x9662, 0xBED6, 0x9663, 0xBED9, 0x9664, 0xBEDA,\n\t0x9665, 0xBEDB, 0x9666, 0xBEDC, 0x9667, 0xBEDD, 0x9668, 0xBEDE,\t0x9669, 0xBEDF, 0x966A, 0xBEE1, 0x966B, 0xBEE2, 0x966C, 0xBEE6,\n\t0x966D, 0xBEE7, 0x966E, 0xBEE8, 0x966F, 0xBEE9, 0x9670, 0xBEEA,\t0x9671, 0xBEEB, 0x9672, 0xBEED, 0x9673, 0xBEEE, 0x9674, 0xBEEF,\n\t0x9675, 0xBEF0, 0x9676, 0xBEF1, 0x9677, 0xBEF2, 0x9678, 0xBEF3,\t0x9679, 0xBEF4, 0x967A, 0xBEF5, 0x9681, 0xBEF6, 0x9682, 0xBEF7,\n\t0x9683, 0xBEF8, 0x9684, 0xBEF9, 0x9685, 0xBEFA, 0x9686, 0xBEFB,\t0x9687, 0xBEFC, 0x9688, 0xBEFD, 0x9689, 0xBEFE, 0x968A, 0xBEFF,\n\t0x968B, 0xBF00, 0x968C, 0xBF02, 0x968D, 0xBF03, 0x968E, 0xBF04,\t0x968F, 0xBF05, 0x9690, 0xBF06, 0x9691, 0xBF07, 0x9692, 0xBF0A,\n\t0x9693, 0xBF0B, 0x9694, 0xBF0C, 0x9695, 0xBF0D, 0x9696, 0xBF0E,\t0x9697, 0xBF0F, 0x9698, 0xBF10, 0x9699, 0xBF11, 0x969A, 0xBF12,\n\t0x969B, 0xBF13, 0x969C, 0xBF14, 0x969D, 0xBF15, 0x969E, 0xBF16,\t0x969F, 0xBF17, 0x96A0, 0xBF1A, 0x96A1, 0xBF1E, 0x96A2, 0xBF1F,\n\t0x96A3, 0xBF20, 0x96A4, 0xBF21, 0x96A5, 0xBF22, 0x96A6, 0xBF23,\t0x96A7, 0xBF24, 0x96A8, 0xBF25, 0x96A9, 0xBF26, 0x96AA, 0xBF27,\n\t0x96AB, 0xBF28, 0x96AC, 0xBF29, 0x96AD, 0xBF2A, 0x96AE, 0xBF2B,\t0x96AF, 0xBF2C, 0x96B0, 0xBF2D, 0x96B1, 0xBF2E, 0x96B2, 0xBF2F,\n\t0x96B3, 0xBF30, 0x96B4, 0xBF31, 0x96B5, 0xBF32, 0x96B6, 0xBF33,\t0x96B7, 0xBF34, 0x96B8, 0xBF35, 0x96B9, 0xBF36, 0x96BA, 0xBF37,\n\t0x96BB, 0xBF38, 0x96BC, 0xBF39, 0x96BD, 0xBF3A, 0x96BE, 0xBF3B,\t0x96BF, 0xBF3C, 0x96C0, 0xBF3D, 0x96C1, 0xBF3E, 0x96C2, 0xBF3F,\n\t0x96C3, 0xBF42, 0x96C4, 0xBF43, 0x96C5, 0xBF45, 0x96C6, 0xBF46,\t0x96C7, 0xBF47, 0x96C8, 0xBF49, 0x96C9, 0xBF4A, 0x96CA, 0xBF4B,\n\t0x96CB, 0xBF4C, 0x96CC, 0xBF4D, 0x96CD, 0xBF4E, 0x96CE, 0xBF4F,\t0x96CF, 0xBF52, 0x96D0, 0xBF53, 0x96D1, 0xBF54, 0x96D2, 0xBF56,\n\t0x96D3, 0xBF57, 0x96D4, 0xBF58, 0x96D5, 0xBF59, 0x96D6, 0xBF5A,\t0x96D7, 0xBF5B, 0x96D8, 0xBF5C, 0x96D9, 0xBF5D, 0x96DA, 0xBF5E,\n\t0x96DB, 0xBF5F, 0x96DC, 0xBF60, 0x96DD, 0xBF61, 0x96DE, 0xBF62,\t0x96DF, 0xBF63, 0x96E0, 0xBF64, 0x96E1, 0xBF65, 0x96E2, 0xBF66,\n\t0x96E3, 0xBF67, 0x96E4, 0xBF68, 0x96E5, 0xBF69, 0x96E6, 0xBF6A,\t0x96E7, 0xBF6B, 0x96E8, 0xBF6C, 0x96E9, 0xBF6D, 0x96EA, 0xBF6E,\n\t0x96EB, 0xBF6F, 0x96EC, 0xBF70, 0x96ED, 0xBF71, 0x96EE, 0xBF72,\t0x96EF, 0xBF73, 0x96F0, 0xBF74, 0x96F1, 0xBF75, 0x96F2, 0xBF76,\n\t0x96F3, 0xBF77, 0x96F4, 0xBF78, 0x96F5, 0xBF79, 0x96F6, 0xBF7A,\t0x96F7, 0xBF7B, 0x96F8, 0xBF7C, 0x96F9, 0xBF7D, 0x96FA, 0xBF7E,\n\t0x96FB, 0xBF7F, 0x96FC, 0xBF80, 0x96FD, 0xBF81, 0x96FE, 0xBF82,\t0x9741, 0xBF83, 0x9742, 0xBF84, 0x9743, 0xBF85, 0x9744, 0xBF86,\n\t0x9745, 0xBF87, 0x9746, 0xBF88, 0x9747, 0xBF89, 0x9748, 0xBF8A,\t0x9749, 0xBF8B, 0x974A, 0xBF8C, 0x974B, 0xBF8D, 0x974C, 0xBF8E,\n\t0x974D, 0xBF8F, 0x974E, 0xBF90, 0x974F, 0xBF91, 0x9750, 0xBF92,\t0x9751, 0xBF93, 0x9752, 0xBF95, 0x9753, 0xBF96, 0x9754, 0xBF97,\n\t0x9755, 0xBF98, 0x9756, 0xBF99, 0x9757, 0xBF9A, 0x9758, 0xBF9B,\t0x9759, 0xBF9C, 0x975A, 0xBF9D, 0x9761, 0xBF9E, 0x9762, 0xBF9F,\n\t0x9763, 0xBFA0, 0x9764, 0xBFA1, 0x9765, 0xBFA2, 0x9766, 0xBFA3,\t0x9767, 0xBFA4, 0x9768, 0xBFA5, 0x9769, 0xBFA6, 0x976A, 0xBFA7,\n\t0x976B, 0xBFA8, 0x976C, 0xBFA9, 0x976D, 0xBFAA, 0x976E, 0xBFAB,\t0x976F, 0xBFAC, 0x9770, 0xBFAD, 0x9771, 0xBFAE, 0x9772, 0xBFAF,\n\t0x9773, 0xBFB1, 0x9774, 0xBFB2, 0x9775, 0xBFB3, 0x9776, 0xBFB4,\t0x9777, 0xBFB5, 0x9778, 0xBFB6, 0x9779, 0xBFB7, 0x977A, 0xBFB8,\n\t0x9781, 0xBFB9, 0x9782, 0xBFBA, 0x9783, 0xBFBB, 0x9784, 0xBFBC,\t0x9785, 0xBFBD, 0x9786, 0xBFBE, 0x9787, 0xBFBF, 0x9788, 0xBFC0,\n\t0x9789, 0xBFC1, 0x978A, 0xBFC2, 0x978B, 0xBFC3, 0x978C, 0xBFC4,\t0x978D, 0xBFC6, 0x978E, 0xBFC7, 0x978F, 0xBFC8, 0x9790, 0xBFC9,\n\t0x9791, 0xBFCA, 0x9792, 0xBFCB, 0x9793, 0xBFCE, 0x9794, 0xBFCF,\t0x9795, 0xBFD1, 0x9796, 0xBFD2, 0x9797, 0xBFD3, 0x9798, 0xBFD5,\n\t0x9799, 0xBFD6, 0x979A, 0xBFD7, 0x979B, 0xBFD8, 0x979C, 0xBFD9,\t0x979D, 0xBFDA, 0x979E, 0xBFDB, 0x979F, 0xBFDD, 0x97A0, 0xBFDE,\n\t0x97A1, 0xBFE0, 0x97A2, 0xBFE2, 0x97A3, 0xBFE3, 0x97A4, 0xBFE4,\t0x97A5, 0xBFE5, 0x97A6, 0xBFE6, 0x97A7, 0xBFE7, 0x97A8, 0xBFE8,\n\t0x97A9, 0xBFE9, 0x97AA, 0xBFEA, 0x97AB, 0xBFEB, 0x97AC, 0xBFEC,\t0x97AD, 0xBFED, 0x97AE, 0xBFEE, 0x97AF, 0xBFEF, 0x97B0, 0xBFF0,\n\t0x97B1, 0xBFF1, 0x97B2, 0xBFF2, 0x97B3, 0xBFF3, 0x97B4, 0xBFF4,\t0x97B5, 0xBFF5, 0x97B6, 0xBFF6, 0x97B7, 0xBFF7, 0x97B8, 0xBFF8,\n\t0x97B9, 0xBFF9, 0x97BA, 0xBFFA, 0x97BB, 0xBFFB, 0x97BC, 0xBFFC,\t0x97BD, 0xBFFD, 0x97BE, 0xBFFE, 0x97BF, 0xBFFF, 0x97C0, 0xC000,\n\t0x97C1, 0xC001, 0x97C2, 0xC002, 0x97C3, 0xC003, 0x97C4, 0xC004,\t0x97C5, 0xC005, 0x97C6, 0xC006, 0x97C7, 0xC007, 0x97C8, 0xC008,\n\t0x97C9, 0xC009, 0x97CA, 0xC00A, 0x97CB, 0xC00B, 0x97CC, 0xC00C,\t0x97CD, 0xC00D, 0x97CE, 0xC00E, 0x97CF, 0xC00F, 0x97D0, 0xC010,\n\t0x97D1, 0xC011, 0x97D2, 0xC012, 0x97D3, 0xC013, 0x97D4, 0xC014,\t0x97D5, 0xC015, 0x97D6, 0xC016, 0x97D7, 0xC017, 0x97D8, 0xC018,\n\t0x97D9, 0xC019, 0x97DA, 0xC01A, 0x97DB, 0xC01B, 0x97DC, 0xC01C,\t0x97DD, 0xC01D, 0x97DE, 0xC01E, 0x97DF, 0xC01F, 0x97E0, 0xC020,\n\t0x97E1, 0xC021, 0x97E2, 0xC022, 0x97E3, 0xC023, 0x97E4, 0xC024,\t0x97E5, 0xC025, 0x97E6, 0xC026, 0x97E7, 0xC027, 0x97E8, 0xC028,\n\t0x97E9, 0xC029, 0x97EA, 0xC02A, 0x97EB, 0xC02B, 0x97EC, 0xC02C,\t0x97ED, 0xC02D, 0x97EE, 0xC02E, 0x97EF, 0xC02F, 0x97F0, 0xC030,\n\t0x97F1, 0xC031, 0x97F2, 0xC032, 0x97F3, 0xC033, 0x97F4, 0xC034,\t0x97F5, 0xC035, 0x97F6, 0xC036, 0x97F7, 0xC037, 0x97F8, 0xC038,\n\t0x97F9, 0xC039, 0x97FA, 0xC03A, 0x97FB, 0xC03B, 0x97FC, 0xC03D,\t0x97FD, 0xC03E, 0x97FE, 0xC03F, 0x9841, 0xC040, 0x9842, 0xC041,\n\t0x9843, 0xC042, 0x9844, 0xC043, 0x9845, 0xC044, 0x9846, 0xC045,\t0x9847, 0xC046, 0x9848, 0xC047, 0x9849, 0xC048, 0x984A, 0xC049,\n\t0x984B, 0xC04A, 0x984C, 0xC04B, 0x984D, 0xC04C, 0x984E, 0xC04D,\t0x984F, 0xC04E, 0x9850, 0xC04F, 0x9851, 0xC050, 0x9852, 0xC052,\n\t0x9853, 0xC053, 0x9854, 0xC054, 0x9855, 0xC055, 0x9856, 0xC056,\t0x9857, 0xC057, 0x9858, 0xC059, 0x9859, 0xC05A, 0x985A, 0xC05B,\n\t0x9861, 0xC05D, 0x9862, 0xC05E, 0x9863, 0xC05F, 0x9864, 0xC061,\t0x9865, 0xC062, 0x9866, 0xC063, 0x9867, 0xC064, 0x9868, 0xC065,\n\t0x9869, 0xC066, 0x986A, 0xC067, 0x986B, 0xC06A, 0x986C, 0xC06B,\t0x986D, 0xC06C, 0x986E, 0xC06D, 0x986F, 0xC06E, 0x9870, 0xC06F,\n\t0x9871, 0xC070, 0x9872, 0xC071, 0x9873, 0xC072, 0x9874, 0xC073,\t0x9875, 0xC074, 0x9876, 0xC075, 0x9877, 0xC076, 0x9878, 0xC077,\n\t0x9879, 0xC078, 0x987A, 0xC079, 0x9881, 0xC07A, 0x9882, 0xC07B,\t0x9883, 0xC07C, 0x9884, 0xC07D, 0x9885, 0xC07E, 0x9886, 0xC07F,\n\t0x9887, 0xC080, 0x9888, 0xC081, 0x9889, 0xC082, 0x988A, 0xC083,\t0x988B, 0xC084, 0x988C, 0xC085, 0x988D, 0xC086, 0x988E, 0xC087,\n\t0x988F, 0xC088, 0x9890, 0xC089, 0x9891, 0xC08A, 0x9892, 0xC08B,\t0x9893, 0xC08C, 0x9894, 0xC08D, 0x9895, 0xC08E, 0x9896, 0xC08F,\n\t0x9897, 0xC092, 0x9898, 0xC093, 0x9899, 0xC095, 0x989A, 0xC096,\t0x989B, 0xC097, 0x989C, 0xC099, 0x989D, 0xC09A, 0x989E, 0xC09B,\n\t0x989F, 0xC09C, 0x98A0, 0xC09D, 0x98A1, 0xC09E, 0x98A2, 0xC09F,\t0x98A3, 0xC0A2, 0x98A4, 0xC0A4, 0x98A5, 0xC0A6, 0x98A6, 0xC0A7,\n\t0x98A7, 0xC0A8, 0x98A8, 0xC0A9, 0x98A9, 0xC0AA, 0x98AA, 0xC0AB,\t0x98AB, 0xC0AE, 0x98AC, 0xC0B1, 0x98AD, 0xC0B2, 0x98AE, 0xC0B7,\n\t0x98AF, 0xC0B8, 0x98B0, 0xC0B9, 0x98B1, 0xC0BA, 0x98B2, 0xC0BB,\t0x98B3, 0xC0BE, 0x98B4, 0xC0C2, 0x98B5, 0xC0C3, 0x98B6, 0xC0C4,\n\t0x98B7, 0xC0C6, 0x98B8, 0xC0C7, 0x98B9, 0xC0CA, 0x98BA, 0xC0CB,\t0x98BB, 0xC0CD, 0x98BC, 0xC0CE, 0x98BD, 0xC0CF, 0x98BE, 0xC0D1,\n\t0x98BF, 0xC0D2, 0x98C0, 0xC0D3, 0x98C1, 0xC0D4, 0x98C2, 0xC0D5,\t0x98C3, 0xC0D6, 0x98C4, 0xC0D7, 0x98C5, 0xC0DA, 0x98C6, 0xC0DE,\n\t0x98C7, 0xC0DF, 0x98C8, 0xC0E0, 0x98C9, 0xC0E1, 0x98CA, 0xC0E2,\t0x98CB, 0xC0E3, 0x98CC, 0xC0E6, 0x98CD, 0xC0E7, 0x98CE, 0xC0E9,\n\t0x98CF, 0xC0EA, 0x98D0, 0xC0EB, 0x98D1, 0xC0ED, 0x98D2, 0xC0EE,\t0x98D3, 0xC0EF, 0x98D4, 0xC0F0, 0x98D5, 0xC0F1, 0x98D6, 0xC0F2,\n\t0x98D7, 0xC0F3, 0x98D8, 0xC0F6, 0x98D9, 0xC0F8, 0x98DA, 0xC0FA,\t0x98DB, 0xC0FB, 0x98DC, 0xC0FC, 0x98DD, 0xC0FD, 0x98DE, 0xC0FE,\n\t0x98DF, 0xC0FF, 0x98E0, 0xC101, 0x98E1, 0xC102, 0x98E2, 0xC103,\t0x98E3, 0xC105, 0x98E4, 0xC106, 0x98E5, 0xC107, 0x98E6, 0xC109,\n\t0x98E7, 0xC10A, 0x98E8, 0xC10B, 0x98E9, 0xC10C, 0x98EA, 0xC10D,\t0x98EB, 0xC10E, 0x98EC, 0xC10F, 0x98ED, 0xC111, 0x98EE, 0xC112,\n\t0x98EF, 0xC113, 0x98F0, 0xC114, 0x98F1, 0xC116, 0x98F2, 0xC117,\t0x98F3, 0xC118, 0x98F4, 0xC119, 0x98F5, 0xC11A, 0x98F6, 0xC11B,\n\t0x98F7, 0xC121, 0x98F8, 0xC122, 0x98F9, 0xC125, 0x98FA, 0xC128,\t0x98FB, 0xC129, 0x98FC, 0xC12A, 0x98FD, 0xC12B, 0x98FE, 0xC12E,\n\t0x9941, 0xC132, 0x9942, 0xC133, 0x9943, 0xC134, 0x9944, 0xC135,\t0x9945, 0xC137, 0x9946, 0xC13A, 0x9947, 0xC13B, 0x9948, 0xC13D,\n\t0x9949, 0xC13E, 0x994A, 0xC13F, 0x994B, 0xC141, 0x994C, 0xC142,\t0x994D, 0xC143, 0x994E, 0xC144, 0x994F, 0xC145, 0x9950, 0xC146,\n\t0x9951, 0xC147, 0x9952, 0xC14A, 0x9953, 0xC14E, 0x9954, 0xC14F,\t0x9955, 0xC150, 0x9956, 0xC151, 0x9957, 0xC152, 0x9958, 0xC153,\n\t0x9959, 0xC156, 0x995A, 0xC157, 0x9961, 0xC159, 0x9962, 0xC15A,\t0x9963, 0xC15B, 0x9964, 0xC15D, 0x9965, 0xC15E, 0x9966, 0xC15F,\n\t0x9967, 0xC160, 0x9968, 0xC161, 0x9969, 0xC162, 0x996A, 0xC163,\t0x996B, 0xC166, 0x996C, 0xC16A, 0x996D, 0xC16B, 0x996E, 0xC16C,\n\t0x996F, 0xC16D, 0x9970, 0xC16E, 0x9971, 0xC16F, 0x9972, 0xC171,\t0x9973, 0xC172, 0x9974, 0xC173, 0x9975, 0xC175, 0x9976, 0xC176,\n\t0x9977, 0xC177, 0x9978, 0xC179, 0x9979, 0xC17A, 0x997A, 0xC17B,\t0x9981, 0xC17C, 0x9982, 0xC17D, 0x9983, 0xC17E, 0x9984, 0xC17F,\n\t0x9985, 0xC180, 0x9986, 0xC181, 0x9987, 0xC182, 0x9988, 0xC183,\t0x9989, 0xC184, 0x998A, 0xC186, 0x998B, 0xC187, 0x998C, 0xC188,\n\t0x998D, 0xC189, 0x998E, 0xC18A, 0x998F, 0xC18B, 0x9990, 0xC18F,\t0x9991, 0xC191, 0x9992, 0xC192, 0x9993, 0xC193, 0x9994, 0xC195,\n\t0x9995, 0xC197, 0x9996, 0xC198, 0x9997, 0xC199, 0x9998, 0xC19A,\t0x9999, 0xC19B, 0x999A, 0xC19E, 0x999B, 0xC1A0, 0x999C, 0xC1A2,\n\t0x999D, 0xC1A3, 0x999E, 0xC1A4, 0x999F, 0xC1A6, 0x99A0, 0xC1A7,\t0x99A1, 0xC1AA, 0x99A2, 0xC1AB, 0x99A3, 0xC1AD, 0x99A4, 0xC1AE,\n\t0x99A5, 0xC1AF, 0x99A6, 0xC1B1, 0x99A7, 0xC1B2, 0x99A8, 0xC1B3,\t0x99A9, 0xC1B4, 0x99AA, 0xC1B5, 0x99AB, 0xC1B6, 0x99AC, 0xC1B7,\n\t0x99AD, 0xC1B8, 0x99AE, 0xC1B9, 0x99AF, 0xC1BA, 0x99B0, 0xC1BB,\t0x99B1, 0xC1BC, 0x99B2, 0xC1BE, 0x99B3, 0xC1BF, 0x99B4, 0xC1C0,\n\t0x99B5, 0xC1C1, 0x99B6, 0xC1C2, 0x99B7, 0xC1C3, 0x99B8, 0xC1C5,\t0x99B9, 0xC1C6, 0x99BA, 0xC1C7, 0x99BB, 0xC1C9, 0x99BC, 0xC1CA,\n\t0x99BD, 0xC1CB, 0x99BE, 0xC1CD, 0x99BF, 0xC1CE, 0x99C0, 0xC1CF,\t0x99C1, 0xC1D0, 0x99C2, 0xC1D1, 0x99C3, 0xC1D2, 0x99C4, 0xC1D3,\n\t0x99C5, 0xC1D5, 0x99C6, 0xC1D6, 0x99C7, 0xC1D9, 0x99C8, 0xC1DA,\t0x99C9, 0xC1DB, 0x99CA, 0xC1DC, 0x99CB, 0xC1DD, 0x99CC, 0xC1DE,\n\t0x99CD, 0xC1DF, 0x99CE, 0xC1E1, 0x99CF, 0xC1E2, 0x99D0, 0xC1E3,\t0x99D1, 0xC1E5, 0x99D2, 0xC1E6, 0x99D3, 0xC1E7, 0x99D4, 0xC1E9,\n\t0x99D5, 0xC1EA, 0x99D6, 0xC1EB, 0x99D7, 0xC1EC, 0x99D8, 0xC1ED,\t0x99D9, 0xC1EE, 0x99DA, 0xC1EF, 0x99DB, 0xC1F2, 0x99DC, 0xC1F4,\n\t0x99DD, 0xC1F5, 0x99DE, 0xC1F6, 0x99DF, 0xC1F7, 0x99E0, 0xC1F8,\t0x99E1, 0xC1F9, 0x99E2, 0xC1FA, 0x99E3, 0xC1FB, 0x99E4, 0xC1FE,\n\t0x99E5, 0xC1FF, 0x99E6, 0xC201, 0x99E7, 0xC202, 0x99E8, 0xC203,\t0x99E9, 0xC205, 0x99EA, 0xC206, 0x99EB, 0xC207, 0x99EC, 0xC208,\n\t0x99ED, 0xC209, 0x99EE, 0xC20A, 0x99EF, 0xC20B, 0x99F0, 0xC20E,\t0x99F1, 0xC210, 0x99F2, 0xC212, 0x99F3, 0xC213, 0x99F4, 0xC214,\n\t0x99F5, 0xC215, 0x99F6, 0xC216, 0x99F7, 0xC217, 0x99F8, 0xC21A,\t0x99F9, 0xC21B, 0x99FA, 0xC21D, 0x99FB, 0xC21E, 0x99FC, 0xC221,\n\t0x99FD, 0xC222, 0x99FE, 0xC223, 0x9A41, 0xC224, 0x9A42, 0xC225,\t0x9A43, 0xC226, 0x9A44, 0xC227, 0x9A45, 0xC22A, 0x9A46, 0xC22C,\n\t0x9A47, 0xC22E, 0x9A48, 0xC230, 0x9A49, 0xC233, 0x9A4A, 0xC235,\t0x9A4B, 0xC236, 0x9A4C, 0xC237, 0x9A4D, 0xC238, 0x9A4E, 0xC239,\n\t0x9A4F, 0xC23A, 0x9A50, 0xC23B, 0x9A51, 0xC23C, 0x9A52, 0xC23D,\t0x9A53, 0xC23E, 0x9A54, 0xC23F, 0x9A55, 0xC240, 0x9A56, 0xC241,\n\t0x9A57, 0xC242, 0x9A58, 0xC243, 0x9A59, 0xC244, 0x9A5A, 0xC245,\t0x9A61, 0xC246, 0x9A62, 0xC247, 0x9A63, 0xC249, 0x9A64, 0xC24A,\n\t0x9A65, 0xC24B, 0x9A66, 0xC24C, 0x9A67, 0xC24D, 0x9A68, 0xC24E,\t0x9A69, 0xC24F, 0x9A6A, 0xC252, 0x9A6B, 0xC253, 0x9A6C, 0xC255,\n\t0x9A6D, 0xC256, 0x9A6E, 0xC257, 0x9A6F, 0xC259, 0x9A70, 0xC25A,\t0x9A71, 0xC25B, 0x9A72, 0xC25C, 0x9A73, 0xC25D, 0x9A74, 0xC25E,\n\t0x9A75, 0xC25F, 0x9A76, 0xC261, 0x9A77, 0xC262, 0x9A78, 0xC263,\t0x9A79, 0xC264, 0x9A7A, 0xC266, 0x9A81, 0xC267, 0x9A82, 0xC268,\n\t0x9A83, 0xC269, 0x9A84, 0xC26A, 0x9A85, 0xC26B, 0x9A86, 0xC26E,\t0x9A87, 0xC26F, 0x9A88, 0xC271, 0x9A89, 0xC272, 0x9A8A, 0xC273,\n\t0x9A8B, 0xC275, 0x9A8C, 0xC276, 0x9A8D, 0xC277, 0x9A8E, 0xC278,\t0x9A8F, 0xC279, 0x9A90, 0xC27A, 0x9A91, 0xC27B, 0x9A92, 0xC27E,\n\t0x9A93, 0xC280, 0x9A94, 0xC282, 0x9A95, 0xC283, 0x9A96, 0xC284,\t0x9A97, 0xC285, 0x9A98, 0xC286, 0x9A99, 0xC287, 0x9A9A, 0xC28A,\n\t0x9A9B, 0xC28B, 0x9A9C, 0xC28C, 0x9A9D, 0xC28D, 0x9A9E, 0xC28E,\t0x9A9F, 0xC28F, 0x9AA0, 0xC291, 0x9AA1, 0xC292, 0x9AA2, 0xC293,\n\t0x9AA3, 0xC294, 0x9AA4, 0xC295, 0x9AA5, 0xC296, 0x9AA6, 0xC297,\t0x9AA7, 0xC299, 0x9AA8, 0xC29A, 0x9AA9, 0xC29C, 0x9AAA, 0xC29E,\n\t0x9AAB, 0xC29F, 0x9AAC, 0xC2A0, 0x9AAD, 0xC2A1, 0x9AAE, 0xC2A2,\t0x9AAF, 0xC2A3, 0x9AB0, 0xC2A6, 0x9AB1, 0xC2A7, 0x9AB2, 0xC2A9,\n\t0x9AB3, 0xC2AA, 0x9AB4, 0xC2AB, 0x9AB5, 0xC2AE, 0x9AB6, 0xC2AF,\t0x9AB7, 0xC2B0, 0x9AB8, 0xC2B1, 0x9AB9, 0xC2B2, 0x9ABA, 0xC2B3,\n\t0x9ABB, 0xC2B6, 0x9ABC, 0xC2B8, 0x9ABD, 0xC2BA, 0x9ABE, 0xC2BB,\t0x9ABF, 0xC2BC, 0x9AC0, 0xC2BD, 0x9AC1, 0xC2BE, 0x9AC2, 0xC2BF,\n\t0x9AC3, 0xC2C0, 0x9AC4, 0xC2C1, 0x9AC5, 0xC2C2, 0x9AC6, 0xC2C3,\t0x9AC7, 0xC2C4, 0x9AC8, 0xC2C5, 0x9AC9, 0xC2C6, 0x9ACA, 0xC2C7,\n\t0x9ACB, 0xC2C8, 0x9ACC, 0xC2C9, 0x9ACD, 0xC2CA, 0x9ACE, 0xC2CB,\t0x9ACF, 0xC2CC, 0x9AD0, 0xC2CD, 0x9AD1, 0xC2CE, 0x9AD2, 0xC2CF,\n\t0x9AD3, 0xC2D0, 0x9AD4, 0xC2D1, 0x9AD5, 0xC2D2, 0x9AD6, 0xC2D3,\t0x9AD7, 0xC2D4, 0x9AD8, 0xC2D5, 0x9AD9, 0xC2D6, 0x9ADA, 0xC2D7,\n\t0x9ADB, 0xC2D8, 0x9ADC, 0xC2D9, 0x9ADD, 0xC2DA, 0x9ADE, 0xC2DB,\t0x9ADF, 0xC2DE, 0x9AE0, 0xC2DF, 0x9AE1, 0xC2E1, 0x9AE2, 0xC2E2,\n\t0x9AE3, 0xC2E5, 0x9AE4, 0xC2E6, 0x9AE5, 0xC2E7, 0x9AE6, 0xC2E8,\t0x9AE7, 0xC2E9, 0x9AE8, 0xC2EA, 0x9AE9, 0xC2EE, 0x9AEA, 0xC2F0,\n\t0x9AEB, 0xC2F2, 0x9AEC, 0xC2F3, 0x9AED, 0xC2F4, 0x9AEE, 0xC2F5,\t0x9AEF, 0xC2F7, 0x9AF0, 0xC2FA, 0x9AF1, 0xC2FD, 0x9AF2, 0xC2FE,\n\t0x9AF3, 0xC2FF, 0x9AF4, 0xC301, 0x9AF5, 0xC302, 0x9AF6, 0xC303,\t0x9AF7, 0xC304, 0x9AF8, 0xC305, 0x9AF9, 0xC306, 0x9AFA, 0xC307,\n\t0x9AFB, 0xC30A, 0x9AFC, 0xC30B, 0x9AFD, 0xC30E, 0x9AFE, 0xC30F,\t0x9B41, 0xC310, 0x9B42, 0xC311, 0x9B43, 0xC312, 0x9B44, 0xC316,\n\t0x9B45, 0xC317, 0x9B46, 0xC319, 0x9B47, 0xC31A, 0x9B48, 0xC31B,\t0x9B49, 0xC31D, 0x9B4A, 0xC31E, 0x9B4B, 0xC31F, 0x9B4C, 0xC320,\n\t0x9B4D, 0xC321, 0x9B4E, 0xC322, 0x9B4F, 0xC323, 0x9B50, 0xC326,\t0x9B51, 0xC327, 0x9B52, 0xC32A, 0x9B53, 0xC32B, 0x9B54, 0xC32C,\n\t0x9B55, 0xC32D, 0x9B56, 0xC32E, 0x9B57, 0xC32F, 0x9B58, 0xC330,\t0x9B59, 0xC331, 0x9B5A, 0xC332, 0x9B61, 0xC333, 0x9B62, 0xC334,\n\t0x9B63, 0xC335, 0x9B64, 0xC336, 0x9B65, 0xC337, 0x9B66, 0xC338,\t0x9B67, 0xC339, 0x9B68, 0xC33A, 0x9B69, 0xC33B, 0x9B6A, 0xC33C,\n\t0x9B6B, 0xC33D, 0x9B6C, 0xC33E, 0x9B6D, 0xC33F, 0x9B6E, 0xC340,\t0x9B6F, 0xC341, 0x9B70, 0xC342, 0x9B71, 0xC343, 0x9B72, 0xC344,\n\t0x9B73, 0xC346, 0x9B74, 0xC347, 0x9B75, 0xC348, 0x9B76, 0xC349,\t0x9B77, 0xC34A, 0x9B78, 0xC34B, 0x9B79, 0xC34C, 0x9B7A, 0xC34D,\n\t0x9B81, 0xC34E, 0x9B82, 0xC34F, 0x9B83, 0xC350, 0x9B84, 0xC351,\t0x9B85, 0xC352, 0x9B86, 0xC353, 0x9B87, 0xC354, 0x9B88, 0xC355,\n\t0x9B89, 0xC356, 0x9B8A, 0xC357, 0x9B8B, 0xC358, 0x9B8C, 0xC359,\t0x9B8D, 0xC35A, 0x9B8E, 0xC35B, 0x9B8F, 0xC35C, 0x9B90, 0xC35D,\n\t0x9B91, 0xC35E, 0x9B92, 0xC35F, 0x9B93, 0xC360, 0x9B94, 0xC361,\t0x9B95, 0xC362, 0x9B96, 0xC363, 0x9B97, 0xC364, 0x9B98, 0xC365,\n\t0x9B99, 0xC366, 0x9B9A, 0xC367, 0x9B9B, 0xC36A, 0x9B9C, 0xC36B,\t0x9B9D, 0xC36D, 0x9B9E, 0xC36E, 0x9B9F, 0xC36F, 0x9BA0, 0xC371,\n\t0x9BA1, 0xC373, 0x9BA2, 0xC374, 0x9BA3, 0xC375, 0x9BA4, 0xC376,\t0x9BA5, 0xC377, 0x9BA6, 0xC37A, 0x9BA7, 0xC37B, 0x9BA8, 0xC37E,\n\t0x9BA9, 0xC37F, 0x9BAA, 0xC380, 0x9BAB, 0xC381, 0x9BAC, 0xC382,\t0x9BAD, 0xC383, 0x9BAE, 0xC385, 0x9BAF, 0xC386, 0x9BB0, 0xC387,\n\t0x9BB1, 0xC389, 0x9BB2, 0xC38A, 0x9BB3, 0xC38B, 0x9BB4, 0xC38D,\t0x9BB5, 0xC38E, 0x9BB6, 0xC38F, 0x9BB7, 0xC390, 0x9BB8, 0xC391,\n\t0x9BB9, 0xC392, 0x9BBA, 0xC393, 0x9BBB, 0xC394, 0x9BBC, 0xC395,\t0x9BBD, 0xC396, 0x9BBE, 0xC397, 0x9BBF, 0xC398, 0x9BC0, 0xC399,\n\t0x9BC1, 0xC39A, 0x9BC2, 0xC39B, 0x9BC3, 0xC39C, 0x9BC4, 0xC39D,\t0x9BC5, 0xC39E, 0x9BC6, 0xC39F, 0x9BC7, 0xC3A0, 0x9BC8, 0xC3A1,\n\t0x9BC9, 0xC3A2, 0x9BCA, 0xC3A3, 0x9BCB, 0xC3A4, 0x9BCC, 0xC3A5,\t0x9BCD, 0xC3A6, 0x9BCE, 0xC3A7, 0x9BCF, 0xC3A8, 0x9BD0, 0xC3A9,\n\t0x9BD1, 0xC3AA, 0x9BD2, 0xC3AB, 0x9BD3, 0xC3AC, 0x9BD4, 0xC3AD,\t0x9BD5, 0xC3AE, 0x9BD6, 0xC3AF, 0x9BD7, 0xC3B0, 0x9BD8, 0xC3B1,\n\t0x9BD9, 0xC3B2, 0x9BDA, 0xC3B3, 0x9BDB, 0xC3B4, 0x9BDC, 0xC3B5,\t0x9BDD, 0xC3B6, 0x9BDE, 0xC3B7, 0x9BDF, 0xC3B8, 0x9BE0, 0xC3B9,\n\t0x9BE1, 0xC3BA, 0x9BE2, 0xC3BB, 0x9BE3, 0xC3BC, 0x9BE4, 0xC3BD,\t0x9BE5, 0xC3BE, 0x9BE6, 0xC3BF, 0x9BE7, 0xC3C1, 0x9BE8, 0xC3C2,\n\t0x9BE9, 0xC3C3, 0x9BEA, 0xC3C4, 0x9BEB, 0xC3C5, 0x9BEC, 0xC3C6,\t0x9BED, 0xC3C7, 0x9BEE, 0xC3C8, 0x9BEF, 0xC3C9, 0x9BF0, 0xC3CA,\n\t0x9BF1, 0xC3CB, 0x9BF2, 0xC3CC, 0x9BF3, 0xC3CD, 0x9BF4, 0xC3CE,\t0x9BF5, 0xC3CF, 0x9BF6, 0xC3D0, 0x9BF7, 0xC3D1, 0x9BF8, 0xC3D2,\n\t0x9BF9, 0xC3D3, 0x9BFA, 0xC3D4, 0x9BFB, 0xC3D5, 0x9BFC, 0xC3D6,\t0x9BFD, 0xC3D7, 0x9BFE, 0xC3DA, 0x9C41, 0xC3DB, 0x9C42, 0xC3DD,\n\t0x9C43, 0xC3DE, 0x9C44, 0xC3E1, 0x9C45, 0xC3E3, 0x9C46, 0xC3E4,\t0x9C47, 0xC3E5, 0x9C48, 0xC3E6, 0x9C49, 0xC3E7, 0x9C4A, 0xC3EA,\n\t0x9C4B, 0xC3EB, 0x9C4C, 0xC3EC, 0x9C4D, 0xC3EE, 0x9C4E, 0xC3EF,\t0x9C4F, 0xC3F0, 0x9C50, 0xC3F1, 0x9C51, 0xC3F2, 0x9C52, 0xC3F3,\n\t0x9C53, 0xC3F6, 0x9C54, 0xC3F7, 0x9C55, 0xC3F9, 0x9C56, 0xC3FA,\t0x9C57, 0xC3FB, 0x9C58, 0xC3FC, 0x9C59, 0xC3FD, 0x9C5A, 0xC3FE,\n\t0x9C61, 0xC3FF, 0x9C62, 0xC400, 0x9C63, 0xC401, 0x9C64, 0xC402,\t0x9C65, 0xC403, 0x9C66, 0xC404, 0x9C67, 0xC405, 0x9C68, 0xC406,\n\t0x9C69, 0xC407, 0x9C6A, 0xC409, 0x9C6B, 0xC40A, 0x9C6C, 0xC40B,\t0x9C6D, 0xC40C, 0x9C6E, 0xC40D, 0x9C6F, 0xC40E, 0x9C70, 0xC40F,\n\t0x9C71, 0xC411, 0x9C72, 0xC412, 0x9C73, 0xC413, 0x9C74, 0xC414,\t0x9C75, 0xC415, 0x9C76, 0xC416, 0x9C77, 0xC417, 0x9C78, 0xC418,\n\t0x9C79, 0xC419, 0x9C7A, 0xC41A, 0x9C81, 0xC41B, 0x9C82, 0xC41C,\t0x9C83, 0xC41D, 0x9C84, 0xC41E, 0x9C85, 0xC41F, 0x9C86, 0xC420,\n\t0x9C87, 0xC421, 0x9C88, 0xC422, 0x9C89, 0xC423, 0x9C8A, 0xC425,\t0x9C8B, 0xC426, 0x9C8C, 0xC427, 0x9C8D, 0xC428, 0x9C8E, 0xC429,\n\t0x9C8F, 0xC42A, 0x9C90, 0xC42B, 0x9C91, 0xC42D, 0x9C92, 0xC42E,\t0x9C93, 0xC42F, 0x9C94, 0xC431, 0x9C95, 0xC432, 0x9C96, 0xC433,\n\t0x9C97, 0xC435, 0x9C98, 0xC436, 0x9C99, 0xC437, 0x9C9A, 0xC438,\t0x9C9B, 0xC439, 0x9C9C, 0xC43A, 0x9C9D, 0xC43B, 0x9C9E, 0xC43E,\n\t0x9C9F, 0xC43F, 0x9CA0, 0xC440, 0x9CA1, 0xC441, 0x9CA2, 0xC442,\t0x9CA3, 0xC443, 0x9CA4, 0xC444, 0x9CA5, 0xC445, 0x9CA6, 0xC446,\n\t0x9CA7, 0xC447, 0x9CA8, 0xC449, 0x9CA9, 0xC44A, 0x9CAA, 0xC44B,\t0x9CAB, 0xC44C, 0x9CAC, 0xC44D, 0x9CAD, 0xC44E, 0x9CAE, 0xC44F,\n\t0x9CAF, 0xC450, 0x9CB0, 0xC451, 0x9CB1, 0xC452, 0x9CB2, 0xC453,\t0x9CB3, 0xC454, 0x9CB4, 0xC455, 0x9CB5, 0xC456, 0x9CB6, 0xC457,\n\t0x9CB7, 0xC458, 0x9CB8, 0xC459, 0x9CB9, 0xC45A, 0x9CBA, 0xC45B,\t0x9CBB, 0xC45C, 0x9CBC, 0xC45D, 0x9CBD, 0xC45E, 0x9CBE, 0xC45F,\n\t0x9CBF, 0xC460, 0x9CC0, 0xC461, 0x9CC1, 0xC462, 0x9CC2, 0xC463,\t0x9CC3, 0xC466, 0x9CC4, 0xC467, 0x9CC5, 0xC469, 0x9CC6, 0xC46A,\n\t0x9CC7, 0xC46B, 0x9CC8, 0xC46D, 0x9CC9, 0xC46E, 0x9CCA, 0xC46F,\t0x9CCB, 0xC470, 0x9CCC, 0xC471, 0x9CCD, 0xC472, 0x9CCE, 0xC473,\n\t0x9CCF, 0xC476, 0x9CD0, 0xC477, 0x9CD1, 0xC478, 0x9CD2, 0xC47A,\t0x9CD3, 0xC47B, 0x9CD4, 0xC47C, 0x9CD5, 0xC47D, 0x9CD6, 0xC47E,\n\t0x9CD7, 0xC47F, 0x9CD8, 0xC481, 0x9CD9, 0xC482, 0x9CDA, 0xC483,\t0x9CDB, 0xC484, 0x9CDC, 0xC485, 0x9CDD, 0xC486, 0x9CDE, 0xC487,\n\t0x9CDF, 0xC488, 0x9CE0, 0xC489, 0x9CE1, 0xC48A, 0x9CE2, 0xC48B,\t0x9CE3, 0xC48C, 0x9CE4, 0xC48D, 0x9CE5, 0xC48E, 0x9CE6, 0xC48F,\n\t0x9CE7, 0xC490, 0x9CE8, 0xC491, 0x9CE9, 0xC492, 0x9CEA, 0xC493,\t0x9CEB, 0xC495, 0x9CEC, 0xC496, 0x9CED, 0xC497, 0x9CEE, 0xC498,\n\t0x9CEF, 0xC499, 0x9CF0, 0xC49A, 0x9CF1, 0xC49B, 0x9CF2, 0xC49D,\t0x9CF3, 0xC49E, 0x9CF4, 0xC49F, 0x9CF5, 0xC4A0, 0x9CF6, 0xC4A1,\n\t0x9CF7, 0xC4A2, 0x9CF8, 0xC4A3, 0x9CF9, 0xC4A4, 0x9CFA, 0xC4A5,\t0x9CFB, 0xC4A6, 0x9CFC, 0xC4A7, 0x9CFD, 0xC4A8, 0x9CFE, 0xC4A9,\n\t0x9D41, 0xC4AA, 0x9D42, 0xC4AB, 0x9D43, 0xC4AC, 0x9D44, 0xC4AD,\t0x9D45, 0xC4AE, 0x9D46, 0xC4AF, 0x9D47, 0xC4B0, 0x9D48, 0xC4B1,\n\t0x9D49, 0xC4B2, 0x9D4A, 0xC4B3, 0x9D4B, 0xC4B4, 0x9D4C, 0xC4B5,\t0x9D4D, 0xC4B6, 0x9D4E, 0xC4B7, 0x9D4F, 0xC4B9, 0x9D50, 0xC4BA,\n\t0x9D51, 0xC4BB, 0x9D52, 0xC4BD, 0x9D53, 0xC4BE, 0x9D54, 0xC4BF,\t0x9D55, 0xC4C0, 0x9D56, 0xC4C1, 0x9D57, 0xC4C2, 0x9D58, 0xC4C3,\n\t0x9D59, 0xC4C4, 0x9D5A, 0xC4C5, 0x9D61, 0xC4C6, 0x9D62, 0xC4C7,\t0x9D63, 0xC4C8, 0x9D64, 0xC4C9, 0x9D65, 0xC4CA, 0x9D66, 0xC4CB,\n\t0x9D67, 0xC4CC, 0x9D68, 0xC4CD, 0x9D69, 0xC4CE, 0x9D6A, 0xC4CF,\t0x9D6B, 0xC4D0, 0x9D6C, 0xC4D1, 0x9D6D, 0xC4D2, 0x9D6E, 0xC4D3,\n\t0x9D6F, 0xC4D4, 0x9D70, 0xC4D5, 0x9D71, 0xC4D6, 0x9D72, 0xC4D7,\t0x9D73, 0xC4D8, 0x9D74, 0xC4D9, 0x9D75, 0xC4DA, 0x9D76, 0xC4DB,\n\t0x9D77, 0xC4DC, 0x9D78, 0xC4DD, 0x9D79, 0xC4DE, 0x9D7A, 0xC4DF,\t0x9D81, 0xC4E0, 0x9D82, 0xC4E1, 0x9D83, 0xC4E2, 0x9D84, 0xC4E3,\n\t0x9D85, 0xC4E4, 0x9D86, 0xC4E5, 0x9D87, 0xC4E6, 0x9D88, 0xC4E7,\t0x9D89, 0xC4E8, 0x9D8A, 0xC4EA, 0x9D8B, 0xC4EB, 0x9D8C, 0xC4EC,\n\t0x9D8D, 0xC4ED, 0x9D8E, 0xC4EE, 0x9D8F, 0xC4EF, 0x9D90, 0xC4F2,\t0x9D91, 0xC4F3, 0x9D92, 0xC4F5, 0x9D93, 0xC4F6, 0x9D94, 0xC4F7,\n\t0x9D95, 0xC4F9, 0x9D96, 0xC4FB, 0x9D97, 0xC4FC, 0x9D98, 0xC4FD,\t0x9D99, 0xC4FE, 0x9D9A, 0xC502, 0x9D9B, 0xC503, 0x9D9C, 0xC504,\n\t0x9D9D, 0xC505, 0x9D9E, 0xC506, 0x9D9F, 0xC507, 0x9DA0, 0xC508,\t0x9DA1, 0xC509, 0x9DA2, 0xC50A, 0x9DA3, 0xC50B, 0x9DA4, 0xC50D,\n\t0x9DA5, 0xC50E, 0x9DA6, 0xC50F, 0x9DA7, 0xC511, 0x9DA8, 0xC512,\t0x9DA9, 0xC513, 0x9DAA, 0xC515, 0x9DAB, 0xC516, 0x9DAC, 0xC517,\n\t0x9DAD, 0xC518, 0x9DAE, 0xC519, 0x9DAF, 0xC51A, 0x9DB0, 0xC51B,\t0x9DB1, 0xC51D, 0x9DB2, 0xC51E, 0x9DB3, 0xC51F, 0x9DB4, 0xC520,\n\t0x9DB5, 0xC521, 0x9DB6, 0xC522, 0x9DB7, 0xC523, 0x9DB8, 0xC524,\t0x9DB9, 0xC525, 0x9DBA, 0xC526, 0x9DBB, 0xC527, 0x9DBC, 0xC52A,\n\t0x9DBD, 0xC52B, 0x9DBE, 0xC52D, 0x9DBF, 0xC52E, 0x9DC0, 0xC52F,\t0x9DC1, 0xC531, 0x9DC2, 0xC532, 0x9DC3, 0xC533, 0x9DC4, 0xC534,\n\t0x9DC5, 0xC535, 0x9DC6, 0xC536, 0x9DC7, 0xC537, 0x9DC8, 0xC53A,\t0x9DC9, 0xC53C, 0x9DCA, 0xC53E, 0x9DCB, 0xC53F, 0x9DCC, 0xC540,\n\t0x9DCD, 0xC541, 0x9DCE, 0xC542, 0x9DCF, 0xC543, 0x9DD0, 0xC546,\t0x9DD1, 0xC547, 0x9DD2, 0xC54B, 0x9DD3, 0xC54F, 0x9DD4, 0xC550,\n\t0x9DD5, 0xC551, 0x9DD6, 0xC552, 0x9DD7, 0xC556, 0x9DD8, 0xC55A,\t0x9DD9, 0xC55B, 0x9DDA, 0xC55C, 0x9DDB, 0xC55F, 0x9DDC, 0xC562,\n\t0x9DDD, 0xC563, 0x9DDE, 0xC565, 0x9DDF, 0xC566, 0x9DE0, 0xC567,\t0x9DE1, 0xC569, 0x9DE2, 0xC56A, 0x9DE3, 0xC56B, 0x9DE4, 0xC56C,\n\t0x9DE5, 0xC56D, 0x9DE6, 0xC56E, 0x9DE7, 0xC56F, 0x9DE8, 0xC572,\t0x9DE9, 0xC576, 0x9DEA, 0xC577, 0x9DEB, 0xC578, 0x9DEC, 0xC579,\n\t0x9DED, 0xC57A, 0x9DEE, 0xC57B, 0x9DEF, 0xC57E, 0x9DF0, 0xC57F,\t0x9DF1, 0xC581, 0x9DF2, 0xC582, 0x9DF3, 0xC583, 0x9DF4, 0xC585,\n\t0x9DF5, 0xC586, 0x9DF6, 0xC588, 0x9DF7, 0xC589, 0x9DF8, 0xC58A,\t0x9DF9, 0xC58B, 0x9DFA, 0xC58E, 0x9DFB, 0xC590, 0x9DFC, 0xC592,\n\t0x9DFD, 0xC593, 0x9DFE, 0xC594, 0x9E41, 0xC596, 0x9E42, 0xC599,\t0x9E43, 0xC59A, 0x9E44, 0xC59B, 0x9E45, 0xC59D, 0x9E46, 0xC59E,\n\t0x9E47, 0xC59F, 0x9E48, 0xC5A1, 0x9E49, 0xC5A2, 0x9E4A, 0xC5A3,\t0x9E4B, 0xC5A4, 0x9E4C, 0xC5A5, 0x9E4D, 0xC5A6, 0x9E4E, 0xC5A7,\n\t0x9E4F, 0xC5A8, 0x9E50, 0xC5AA, 0x9E51, 0xC5AB, 0x9E52, 0xC5AC,\t0x9E53, 0xC5AD, 0x9E54, 0xC5AE, 0x9E55, 0xC5AF, 0x9E56, 0xC5B0,\n\t0x9E57, 0xC5B1, 0x9E58, 0xC5B2, 0x9E59, 0xC5B3, 0x9E5A, 0xC5B6,\t0x9E61, 0xC5B7, 0x9E62, 0xC5BA, 0x9E63, 0xC5BF, 0x9E64, 0xC5C0,\n\t0x9E65, 0xC5C1, 0x9E66, 0xC5C2, 0x9E67, 0xC5C3, 0x9E68, 0xC5CB,\t0x9E69, 0xC5CD, 0x9E6A, 0xC5CF, 0x9E6B, 0xC5D2, 0x9E6C, 0xC5D3,\n\t0x9E6D, 0xC5D5, 0x9E6E, 0xC5D6, 0x9E6F, 0xC5D7, 0x9E70, 0xC5D9,\t0x9E71, 0xC5DA, 0x9E72, 0xC5DB, 0x9E73, 0xC5DC, 0x9E74, 0xC5DD,\n\t0x9E75, 0xC5DE, 0x9E76, 0xC5DF, 0x9E77, 0xC5E2, 0x9E78, 0xC5E4,\t0x9E79, 0xC5E6, 0x9E7A, 0xC5E7, 0x9E81, 0xC5E8, 0x9E82, 0xC5E9,\n\t0x9E83, 0xC5EA, 0x9E84, 0xC5EB, 0x9E85, 0xC5EF, 0x9E86, 0xC5F1,\t0x9E87, 0xC5F2, 0x9E88, 0xC5F3, 0x9E89, 0xC5F5, 0x9E8A, 0xC5F8,\n\t0x9E8B, 0xC5F9, 0x9E8C, 0xC5FA, 0x9E8D, 0xC5FB, 0x9E8E, 0xC602,\t0x9E8F, 0xC603, 0x9E90, 0xC604, 0x9E91, 0xC609, 0x9E92, 0xC60A,\n\t0x9E93, 0xC60B, 0x9E94, 0xC60D, 0x9E95, 0xC60E, 0x9E96, 0xC60F,\t0x9E97, 0xC611, 0x9E98, 0xC612, 0x9E99, 0xC613, 0x9E9A, 0xC614,\n\t0x9E9B, 0xC615, 0x9E9C, 0xC616, 0x9E9D, 0xC617, 0x9E9E, 0xC61A,\t0x9E9F, 0xC61D, 0x9EA0, 0xC61E, 0x9EA1, 0xC61F, 0x9EA2, 0xC620,\n\t0x9EA3, 0xC621, 0x9EA4, 0xC622, 0x9EA5, 0xC623, 0x9EA6, 0xC626,\t0x9EA7, 0xC627, 0x9EA8, 0xC629, 0x9EA9, 0xC62A, 0x9EAA, 0xC62B,\n\t0x9EAB, 0xC62F, 0x9EAC, 0xC631, 0x9EAD, 0xC632, 0x9EAE, 0xC636,\t0x9EAF, 0xC638, 0x9EB0, 0xC63A, 0x9EB1, 0xC63C, 0x9EB2, 0xC63D,\n\t0x9EB3, 0xC63E, 0x9EB4, 0xC63F, 0x9EB5, 0xC642, 0x9EB6, 0xC643,\t0x9EB7, 0xC645, 0x9EB8, 0xC646, 0x9EB9, 0xC647, 0x9EBA, 0xC649,\n\t0x9EBB, 0xC64A, 0x9EBC, 0xC64B, 0x9EBD, 0xC64C, 0x9EBE, 0xC64D,\t0x9EBF, 0xC64E, 0x9EC0, 0xC64F, 0x9EC1, 0xC652, 0x9EC2, 0xC656,\n\t0x9EC3, 0xC657, 0x9EC4, 0xC658, 0x9EC5, 0xC659, 0x9EC6, 0xC65A,\t0x9EC7, 0xC65B, 0x9EC8, 0xC65E, 0x9EC9, 0xC65F, 0x9ECA, 0xC661,\n\t0x9ECB, 0xC662, 0x9ECC, 0xC663, 0x9ECD, 0xC664, 0x9ECE, 0xC665,\t0x9ECF, 0xC666, 0x9ED0, 0xC667, 0x9ED1, 0xC668, 0x9ED2, 0xC669,\n\t0x9ED3, 0xC66A, 0x9ED4, 0xC66B, 0x9ED5, 0xC66D, 0x9ED6, 0xC66E,\t0x9ED7, 0xC670, 0x9ED8, 0xC672, 0x9ED9, 0xC673, 0x9EDA, 0xC674,\n\t0x9EDB, 0xC675, 0x9EDC, 0xC676, 0x9EDD, 0xC677, 0x9EDE, 0xC67A,\t0x9EDF, 0xC67B, 0x9EE0, 0xC67D, 0x9EE1, 0xC67E, 0x9EE2, 0xC67F,\n\t0x9EE3, 0xC681, 0x9EE4, 0xC682, 0x9EE5, 0xC683, 0x9EE6, 0xC684,\t0x9EE7, 0xC685, 0x9EE8, 0xC686, 0x9EE9, 0xC687, 0x9EEA, 0xC68A,\n\t0x9EEB, 0xC68C, 0x9EEC, 0xC68E, 0x9EED, 0xC68F, 0x9EEE, 0xC690,\t0x9EEF, 0xC691, 0x9EF0, 0xC692, 0x9EF1, 0xC693, 0x9EF2, 0xC696,\n\t0x9EF3, 0xC697, 0x9EF4, 0xC699, 0x9EF5, 0xC69A, 0x9EF6, 0xC69B,\t0x9EF7, 0xC69D, 0x9EF8, 0xC69E, 0x9EF9, 0xC69F, 0x9EFA, 0xC6A0,\n\t0x9EFB, 0xC6A1, 0x9EFC, 0xC6A2, 0x9EFD, 0xC6A3, 0x9EFE, 0xC6A6,\t0x9F41, 0xC6A8, 0x9F42, 0xC6AA, 0x9F43, 0xC6AB, 0x9F44, 0xC6AC,\n\t0x9F45, 0xC6AD, 0x9F46, 0xC6AE, 0x9F47, 0xC6AF, 0x9F48, 0xC6B2,\t0x9F49, 0xC6B3, 0x9F4A, 0xC6B5, 0x9F4B, 0xC6B6, 0x9F4C, 0xC6B7,\n\t0x9F4D, 0xC6BB, 0x9F4E, 0xC6BC, 0x9F4F, 0xC6BD, 0x9F50, 0xC6BE,\t0x9F51, 0xC6BF, 0x9F52, 0xC6C2, 0x9F53, 0xC6C4, 0x9F54, 0xC6C6,\n\t0x9F55, 0xC6C7, 0x9F56, 0xC6C8, 0x9F57, 0xC6C9, 0x9F58, 0xC6CA,\t0x9F59, 0xC6CB, 0x9F5A, 0xC6CE, 0x9F61, 0xC6CF, 0x9F62, 0xC6D1,\n\t0x9F63, 0xC6D2, 0x9F64, 0xC6D3, 0x9F65, 0xC6D5, 0x9F66, 0xC6D6,\t0x9F67, 0xC6D7, 0x9F68, 0xC6D8, 0x9F69, 0xC6D9, 0x9F6A, 0xC6DA,\n\t0x9F6B, 0xC6DB, 0x9F6C, 0xC6DE, 0x9F6D, 0xC6DF, 0x9F6E, 0xC6E2,\t0x9F6F, 0xC6E3, 0x9F70, 0xC6E4, 0x9F71, 0xC6E5, 0x9F72, 0xC6E6,\n\t0x9F73, 0xC6E7, 0x9F74, 0xC6EA, 0x9F75, 0xC6EB, 0x9F76, 0xC6ED,\t0x9F77, 0xC6EE, 0x9F78, 0xC6EF, 0x9F79, 0xC6F1, 0x9F7A, 0xC6F2,\n\t0x9F81, 0xC6F3, 0x9F82, 0xC6F4, 0x9F83, 0xC6F5, 0x9F84, 0xC6F6,\t0x9F85, 0xC6F7, 0x9F86, 0xC6FA, 0x9F87, 0xC6FB, 0x9F88, 0xC6FC,\n\t0x9F89, 0xC6FE, 0x9F8A, 0xC6FF, 0x9F8B, 0xC700, 0x9F8C, 0xC701,\t0x9F8D, 0xC702, 0x9F8E, 0xC703, 0x9F8F, 0xC706, 0x9F90, 0xC707,\n\t0x9F91, 0xC709, 0x9F92, 0xC70A, 0x9F93, 0xC70B, 0x9F94, 0xC70D,\t0x9F95, 0xC70E, 0x9F96, 0xC70F, 0x9F97, 0xC710, 0x9F98, 0xC711,\n\t0x9F99, 0xC712, 0x9F9A, 0xC713, 0x9F9B, 0xC716, 0x9F9C, 0xC718,\t0x9F9D, 0xC71A, 0x9F9E, 0xC71B, 0x9F9F, 0xC71C, 0x9FA0, 0xC71D,\n\t0x9FA1, 0xC71E, 0x9FA2, 0xC71F, 0x9FA3, 0xC722, 0x9FA4, 0xC723,\t0x9FA5, 0xC725, 0x9FA6, 0xC726, 0x9FA7, 0xC727, 0x9FA8, 0xC729,\n\t0x9FA9, 0xC72A, 0x9FAA, 0xC72B, 0x9FAB, 0xC72C, 0x9FAC, 0xC72D,\t0x9FAD, 0xC72E, 0x9FAE, 0xC72F, 0x9FAF, 0xC732, 0x9FB0, 0xC734,\n\t0x9FB1, 0xC736, 0x9FB2, 0xC738, 0x9FB3, 0xC739, 0x9FB4, 0xC73A,\t0x9FB5, 0xC73B, 0x9FB6, 0xC73E, 0x9FB7, 0xC73F, 0x9FB8, 0xC741,\n\t0x9FB9, 0xC742, 0x9FBA, 0xC743, 0x9FBB, 0xC745, 0x9FBC, 0xC746,\t0x9FBD, 0xC747, 0x9FBE, 0xC748, 0x9FBF, 0xC749, 0x9FC0, 0xC74B,\n\t0x9FC1, 0xC74E, 0x9FC2, 0xC750, 0x9FC3, 0xC759, 0x9FC4, 0xC75A,\t0x9FC5, 0xC75B, 0x9FC6, 0xC75D, 0x9FC7, 0xC75E, 0x9FC8, 0xC75F,\n\t0x9FC9, 0xC761, 0x9FCA, 0xC762, 0x9FCB, 0xC763, 0x9FCC, 0xC764,\t0x9FCD, 0xC765, 0x9FCE, 0xC766, 0x9FCF, 0xC767, 0x9FD0, 0xC769,\n\t0x9FD1, 0xC76A, 0x9FD2, 0xC76C, 0x9FD3, 0xC76D, 0x9FD4, 0xC76E,\t0x9FD5, 0xC76F, 0x9FD6, 0xC770, 0x9FD7, 0xC771, 0x9FD8, 0xC772,\n\t0x9FD9, 0xC773, 0x9FDA, 0xC776, 0x9FDB, 0xC777, 0x9FDC, 0xC779,\t0x9FDD, 0xC77A, 0x9FDE, 0xC77B, 0x9FDF, 0xC77F, 0x9FE0, 0xC780,\n\t0x9FE1, 0xC781, 0x9FE2, 0xC782, 0x9FE3, 0xC786, 0x9FE4, 0xC78B,\t0x9FE5, 0xC78C, 0x9FE6, 0xC78D, 0x9FE7, 0xC78F, 0x9FE8, 0xC792,\n\t0x9FE9, 0xC793, 0x9FEA, 0xC795, 0x9FEB, 0xC799, 0x9FEC, 0xC79B,\t0x9FED, 0xC79C, 0x9FEE, 0xC79D, 0x9FEF, 0xC79E, 0x9FF0, 0xC79F,\n\t0x9FF1, 0xC7A2, 0x9FF2, 0xC7A7, 0x9FF3, 0xC7A8, 0x9FF4, 0xC7A9,\t0x9FF5, 0xC7AA, 0x9FF6, 0xC7AB, 0x9FF7, 0xC7AE, 0x9FF8, 0xC7AF,\n\t0x9FF9, 0xC7B1, 0x9FFA, 0xC7B2, 0x9FFB, 0xC7B3, 0x9FFC, 0xC7B5,\t0x9FFD, 0xC7B6, 0x9FFE, 0xC7B7, 0xA041, 0xC7B8, 0xA042, 0xC7B9,\n\t0xA043, 0xC7BA, 0xA044, 0xC7BB, 0xA045, 0xC7BE, 0xA046, 0xC7C2,\t0xA047, 0xC7C3, 0xA048, 0xC7C4, 0xA049, 0xC7C5, 0xA04A, 0xC7C6,\n\t0xA04B, 0xC7C7, 0xA04C, 0xC7CA, 0xA04D, 0xC7CB, 0xA04E, 0xC7CD,\t0xA04F, 0xC7CF, 0xA050, 0xC7D1, 0xA051, 0xC7D2, 0xA052, 0xC7D3,\n\t0xA053, 0xC7D4, 0xA054, 0xC7D5, 0xA055, 0xC7D6, 0xA056, 0xC7D7,\t0xA057, 0xC7D9, 0xA058, 0xC7DA, 0xA059, 0xC7DB, 0xA05A, 0xC7DC,\n\t0xA061, 0xC7DE, 0xA062, 0xC7DF, 0xA063, 0xC7E0, 0xA064, 0xC7E1,\t0xA065, 0xC7E2, 0xA066, 0xC7E3, 0xA067, 0xC7E5, 0xA068, 0xC7E6,\n\t0xA069, 0xC7E7, 0xA06A, 0xC7E9, 0xA06B, 0xC7EA, 0xA06C, 0xC7EB,\t0xA06D, 0xC7ED, 0xA06E, 0xC7EE, 0xA06F, 0xC7EF, 0xA070, 0xC7F0,\n\t0xA071, 0xC7F1, 0xA072, 0xC7F2, 0xA073, 0xC7F3, 0xA074, 0xC7F4,\t0xA075, 0xC7F5, 0xA076, 0xC7F6, 0xA077, 0xC7F7, 0xA078, 0xC7F8,\n\t0xA079, 0xC7F9, 0xA07A, 0xC7FA, 0xA081, 0xC7FB, 0xA082, 0xC7FC,\t0xA083, 0xC7FD, 0xA084, 0xC7FE, 0xA085, 0xC7FF, 0xA086, 0xC802,\n\t0xA087, 0xC803, 0xA088, 0xC805, 0xA089, 0xC806, 0xA08A, 0xC807,\t0xA08B, 0xC809, 0xA08C, 0xC80B, 0xA08D, 0xC80C, 0xA08E, 0xC80D,\n\t0xA08F, 0xC80E, 0xA090, 0xC80F, 0xA091, 0xC812, 0xA092, 0xC814,\t0xA093, 0xC817, 0xA094, 0xC818, 0xA095, 0xC819, 0xA096, 0xC81A,\n\t0xA097, 0xC81B, 0xA098, 0xC81E, 0xA099, 0xC81F, 0xA09A, 0xC821,\t0xA09B, 0xC822, 0xA09C, 0xC823, 0xA09D, 0xC825, 0xA09E, 0xC826,\n\t0xA09F, 0xC827, 0xA0A0, 0xC828, 0xA0A1, 0xC829, 0xA0A2, 0xC82A,\t0xA0A3, 0xC82B, 0xA0A4, 0xC82E, 0xA0A5, 0xC830, 0xA0A6, 0xC832,\n\t0xA0A7, 0xC833, 0xA0A8, 0xC834, 0xA0A9, 0xC835, 0xA0AA, 0xC836,\t0xA0AB, 0xC837, 0xA0AC, 0xC839, 0xA0AD, 0xC83A, 0xA0AE, 0xC83B,\n\t0xA0AF, 0xC83D, 0xA0B0, 0xC83E, 0xA0B1, 0xC83F, 0xA0B2, 0xC841,\t0xA0B3, 0xC842, 0xA0B4, 0xC843, 0xA0B5, 0xC844, 0xA0B6, 0xC845,\n\t0xA0B7, 0xC846, 0xA0B8, 0xC847, 0xA0B9, 0xC84A, 0xA0BA, 0xC84B,\t0xA0BB, 0xC84E, 0xA0BC, 0xC84F, 0xA0BD, 0xC850, 0xA0BE, 0xC851,\n\t0xA0BF, 0xC852, 0xA0C0, 0xC853, 0xA0C1, 0xC855, 0xA0C2, 0xC856,\t0xA0C3, 0xC857, 0xA0C4, 0xC858, 0xA0C5, 0xC859, 0xA0C6, 0xC85A,\n\t0xA0C7, 0xC85B, 0xA0C8, 0xC85C, 0xA0C9, 0xC85D, 0xA0CA, 0xC85E,\t0xA0CB, 0xC85F, 0xA0CC, 0xC860, 0xA0CD, 0xC861, 0xA0CE, 0xC862,\n\t0xA0CF, 0xC863, 0xA0D0, 0xC864, 0xA0D1, 0xC865, 0xA0D2, 0xC866,\t0xA0D3, 0xC867, 0xA0D4, 0xC868, 0xA0D5, 0xC869, 0xA0D6, 0xC86A,\n\t0xA0D7, 0xC86B, 0xA0D8, 0xC86C, 0xA0D9, 0xC86D, 0xA0DA, 0xC86E,\t0xA0DB, 0xC86F, 0xA0DC, 0xC872, 0xA0DD, 0xC873, 0xA0DE, 0xC875,\n\t0xA0DF, 0xC876, 0xA0E0, 0xC877, 0xA0E1, 0xC879, 0xA0E2, 0xC87B,\t0xA0E3, 0xC87C, 0xA0E4, 0xC87D, 0xA0E5, 0xC87E, 0xA0E6, 0xC87F,\n\t0xA0E7, 0xC882, 0xA0E8, 0xC884, 0xA0E9, 0xC888, 0xA0EA, 0xC889,\t0xA0EB, 0xC88A, 0xA0EC, 0xC88E, 0xA0ED, 0xC88F, 0xA0EE, 0xC890,\n\t0xA0EF, 0xC891, 0xA0F0, 0xC892, 0xA0F1, 0xC893, 0xA0F2, 0xC895,\t0xA0F3, 0xC896, 0xA0F4, 0xC897, 0xA0F5, 0xC898, 0xA0F6, 0xC899,\n\t0xA0F7, 0xC89A, 0xA0F8, 0xC89B, 0xA0F9, 0xC89C, 0xA0FA, 0xC89E,\t0xA0FB, 0xC8A0, 0xA0FC, 0xC8A2, 0xA0FD, 0xC8A3, 0xA0FE, 0xC8A4,\n\t0xA141, 0xC8A5, 0xA142, 0xC8A6, 0xA143, 0xC8A7, 0xA144, 0xC8A9,\t0xA145, 0xC8AA, 0xA146, 0xC8AB, 0xA147, 0xC8AC, 0xA148, 0xC8AD,\n\t0xA149, 0xC8AE, 0xA14A, 0xC8AF, 0xA14B, 0xC8B0, 0xA14C, 0xC8B1,\t0xA14D, 0xC8B2, 0xA14E, 0xC8B3, 0xA14F, 0xC8B4, 0xA150, 0xC8B5,\n\t0xA151, 0xC8B6, 0xA152, 0xC8B7, 0xA153, 0xC8B8, 0xA154, 0xC8B9,\t0xA155, 0xC8BA, 0xA156, 0xC8BB, 0xA157, 0xC8BE, 0xA158, 0xC8BF,\n\t0xA159, 0xC8C0, 0xA15A, 0xC8C1, 0xA161, 0xC8C2, 0xA162, 0xC8C3,\t0xA163, 0xC8C5, 0xA164, 0xC8C6, 0xA165, 0xC8C7, 0xA166, 0xC8C9,\n\t0xA167, 0xC8CA, 0xA168, 0xC8CB, 0xA169, 0xC8CD, 0xA16A, 0xC8CE,\t0xA16B, 0xC8CF, 0xA16C, 0xC8D0, 0xA16D, 0xC8D1, 0xA16E, 0xC8D2,\n\t0xA16F, 0xC8D3, 0xA170, 0xC8D6, 0xA171, 0xC8D8, 0xA172, 0xC8DA,\t0xA173, 0xC8DB, 0xA174, 0xC8DC, 0xA175, 0xC8DD, 0xA176, 0xC8DE,\n\t0xA177, 0xC8DF, 0xA178, 0xC8E2, 0xA179, 0xC8E3, 0xA17A, 0xC8E5,\t0xA181, 0xC8E6, 0xA182, 0xC8E7, 0xA183, 0xC8E8, 0xA184, 0xC8E9,\n\t0xA185, 0xC8EA, 0xA186, 0xC8EB, 0xA187, 0xC8EC, 0xA188, 0xC8ED,\t0xA189, 0xC8EE, 0xA18A, 0xC8EF, 0xA18B, 0xC8F0, 0xA18C, 0xC8F1,\n\t0xA18D, 0xC8F2, 0xA18E, 0xC8F3, 0xA18F, 0xC8F4, 0xA190, 0xC8F6,\t0xA191, 0xC8F7, 0xA192, 0xC8F8, 0xA193, 0xC8F9, 0xA194, 0xC8FA,\n\t0xA195, 0xC8FB, 0xA196, 0xC8FE, 0xA197, 0xC8FF, 0xA198, 0xC901,\t0xA199, 0xC902, 0xA19A, 0xC903, 0xA19B, 0xC907, 0xA19C, 0xC908,\n\t0xA19D, 0xC909, 0xA19E, 0xC90A, 0xA19F, 0xC90B, 0xA1A0, 0xC90E,\t0xA1A1, 0x3000, 0xA1A2, 0x3001, 0xA1A3, 0x3002, 0xA1A4, 0x00B7,\n\t0xA1A5, 0x2025, 0xA1A6, 0x2026, 0xA1A7, 0x00A8, 0xA1A8, 0x3003,\t0xA1A9, 0x00AD, 0xA1AA, 0x2015, 0xA1AB, 0x2225, 0xA1AC, 0xFF3C,\n\t0xA1AD, 0x223C, 0xA1AE, 0x2018, 0xA1AF, 0x2019, 0xA1B0, 0x201C,\t0xA1B1, 0x201D, 0xA1B2, 0x3014, 0xA1B3, 0x3015, 0xA1B4, 0x3008,\n\t0xA1B5, 0x3009, 0xA1B6, 0x300A, 0xA1B7, 0x300B, 0xA1B8, 0x300C,\t0xA1B9, 0x300D, 0xA1BA, 0x300E, 0xA1BB, 0x300F, 0xA1BC, 0x3010,\n\t0xA1BD, 0x3011, 0xA1BE, 0x00B1, 0xA1BF, 0x00D7, 0xA1C0, 0x00F7,\t0xA1C1, 0x2260, 0xA1C2, 0x2264, 0xA1C3, 0x2265, 0xA1C4, 0x221E,\n\t0xA1C5, 0x2234, 0xA1C6, 0x00B0, 0xA1C7, 0x2032, 0xA1C8, 0x2033,\t0xA1C9, 0x2103, 0xA1CA, 0x212B, 0xA1CB, 0xFFE0, 0xA1CC, 0xFFE1,\n\t0xA1CD, 0xFFE5, 0xA1CE, 0x2642, 0xA1CF, 0x2640, 0xA1D0, 0x2220,\t0xA1D1, 0x22A5, 0xA1D2, 0x2312, 0xA1D3, 0x2202, 0xA1D4, 0x2207,\n\t0xA1D5, 0x2261, 0xA1D6, 0x2252, 0xA1D7, 0x00A7, 0xA1D8, 0x203B,\t0xA1D9, 0x2606, 0xA1DA, 0x2605, 0xA1DB, 0x25CB, 0xA1DC, 0x25CF,\n\t0xA1DD, 0x25CE, 0xA1DE, 0x25C7, 0xA1DF, 0x25C6, 0xA1E0, 0x25A1,\t0xA1E1, 0x25A0, 0xA1E2, 0x25B3, 0xA1E3, 0x25B2, 0xA1E4, 0x25BD,\n\t0xA1E5, 0x25BC, 0xA1E6, 0x2192, 0xA1E7, 0x2190, 0xA1E8, 0x2191,\t0xA1E9, 0x2193, 0xA1EA, 0x2194, 0xA1EB, 0x3013, 0xA1EC, 0x226A,\n\t0xA1ED, 0x226B, 0xA1EE, 0x221A, 0xA1EF, 0x223D, 0xA1F0, 0x221D,\t0xA1F1, 0x2235, 0xA1F2, 0x222B, 0xA1F3, 0x222C, 0xA1F4, 0x2208,\n\t0xA1F5, 0x220B, 0xA1F6, 0x2286, 0xA1F7, 0x2287, 0xA1F8, 0x2282,\t0xA1F9, 0x2283, 0xA1FA, 0x222A, 0xA1FB, 0x2229, 0xA1FC, 0x2227,\n\t0xA1FD, 0x2228, 0xA1FE, 0xFFE2, 0xA241, 0xC910, 0xA242, 0xC912,\t0xA243, 0xC913, 0xA244, 0xC914, 0xA245, 0xC915, 0xA246, 0xC916,\n\t0xA247, 0xC917, 0xA248, 0xC919, 0xA249, 0xC91A, 0xA24A, 0xC91B,\t0xA24B, 0xC91C, 0xA24C, 0xC91D, 0xA24D, 0xC91E, 0xA24E, 0xC91F,\n\t0xA24F, 0xC920, 0xA250, 0xC921, 0xA251, 0xC922, 0xA252, 0xC923,\t0xA253, 0xC924, 0xA254, 0xC925, 0xA255, 0xC926, 0xA256, 0xC927,\n\t0xA257, 0xC928, 0xA258, 0xC929, 0xA259, 0xC92A, 0xA25A, 0xC92B,\t0xA261, 0xC92D, 0xA262, 0xC92E, 0xA263, 0xC92F, 0xA264, 0xC930,\n\t0xA265, 0xC931, 0xA266, 0xC932, 0xA267, 0xC933, 0xA268, 0xC935,\t0xA269, 0xC936, 0xA26A, 0xC937, 0xA26B, 0xC938, 0xA26C, 0xC939,\n\t0xA26D, 0xC93A, 0xA26E, 0xC93B, 0xA26F, 0xC93C, 0xA270, 0xC93D,\t0xA271, 0xC93E, 0xA272, 0xC93F, 0xA273, 0xC940, 0xA274, 0xC941,\n\t0xA275, 0xC942, 0xA276, 0xC943, 0xA277, 0xC944, 0xA278, 0xC945,\t0xA279, 0xC946, 0xA27A, 0xC947, 0xA281, 0xC948, 0xA282, 0xC949,\n\t0xA283, 0xC94A, 0xA284, 0xC94B, 0xA285, 0xC94C, 0xA286, 0xC94D,\t0xA287, 0xC94E, 0xA288, 0xC94F, 0xA289, 0xC952, 0xA28A, 0xC953,\n\t0xA28B, 0xC955, 0xA28C, 0xC956, 0xA28D, 0xC957, 0xA28E, 0xC959,\t0xA28F, 0xC95A, 0xA290, 0xC95B, 0xA291, 0xC95C, 0xA292, 0xC95D,\n\t0xA293, 0xC95E, 0xA294, 0xC95F, 0xA295, 0xC962, 0xA296, 0xC964,\t0xA297, 0xC965, 0xA298, 0xC966, 0xA299, 0xC967, 0xA29A, 0xC968,\n\t0xA29B, 0xC969, 0xA29C, 0xC96A, 0xA29D, 0xC96B, 0xA29E, 0xC96D,\t0xA29F, 0xC96E, 0xA2A0, 0xC96F, 0xA2A1, 0x21D2, 0xA2A2, 0x21D4,\n\t0xA2A3, 0x2200, 0xA2A4, 0x2203, 0xA2A5, 0x00B4, 0xA2A6, 0xFF5E,\t0xA2A7, 0x02C7, 0xA2A8, 0x02D8, 0xA2A9, 0x02DD, 0xA2AA, 0x02DA,\n\t0xA2AB, 0x02D9, 0xA2AC, 0x00B8, 0xA2AD, 0x02DB, 0xA2AE, 0x00A1,\t0xA2AF, 0x00BF, 0xA2B0, 0x02D0, 0xA2B1, 0x222E, 0xA2B2, 0x2211,\n\t0xA2B3, 0x220F, 0xA2B4, 0x00A4, 0xA2B5, 0x2109, 0xA2B6, 0x2030,\t0xA2B7, 0x25C1, 0xA2B8, 0x25C0, 0xA2B9, 0x25B7, 0xA2BA, 0x25B6,\n\t0xA2BB, 0x2664, 0xA2BC, 0x2660, 0xA2BD, 0x2661, 0xA2BE, 0x2665,\t0xA2BF, 0x2667, 0xA2C0, 0x2663, 0xA2C1, 0x2299, 0xA2C2, 0x25C8,\n\t0xA2C3, 0x25A3, 0xA2C4, 0x25D0, 0xA2C5, 0x25D1, 0xA2C6, 0x2592,\t0xA2C7, 0x25A4, 0xA2C8, 0x25A5, 0xA2C9, 0x25A8, 0xA2CA, 0x25A7,\n\t0xA2CB, 0x25A6, 0xA2CC, 0x25A9, 0xA2CD, 0x2668, 0xA2CE, 0x260F,\t0xA2CF, 0x260E, 0xA2D0, 0x261C, 0xA2D1, 0x261E, 0xA2D2, 0x00B6,\n\t0xA2D3, 0x2020, 0xA2D4, 0x2021, 0xA2D5, 0x2195, 0xA2D6, 0x2197,\t0xA2D7, 0x2199, 0xA2D8, 0x2196, 0xA2D9, 0x2198, 0xA2DA, 0x266D,\n\t0xA2DB, 0x2669, 0xA2DC, 0x266A, 0xA2DD, 0x266C, 0xA2DE, 0x327F,\t0xA2DF, 0x321C, 0xA2E0, 0x2116, 0xA2E1, 0x33C7, 0xA2E2, 0x2122,\n\t0xA2E3, 0x33C2, 0xA2E4, 0x33D8, 0xA2E5, 0x2121, 0xA2E6, 0x20AC,\t0xA2E7, 0x00AE, 0xA341, 0xC971, 0xA342, 0xC972, 0xA343, 0xC973,\n\t0xA344, 0xC975, 0xA345, 0xC976, 0xA346, 0xC977, 0xA347, 0xC978,\t0xA348, 0xC979, 0xA349, 0xC97A, 0xA34A, 0xC97B, 0xA34B, 0xC97D,\n\t0xA34C, 0xC97E, 0xA34D, 0xC97F, 0xA34E, 0xC980, 0xA34F, 0xC981,\t0xA350, 0xC982, 0xA351, 0xC983, 0xA352, 0xC984, 0xA353, 0xC985,\n\t0xA354, 0xC986, 0xA355, 0xC987, 0xA356, 0xC98A, 0xA357, 0xC98B,\t0xA358, 0xC98D, 0xA359, 0xC98E, 0xA35A, 0xC98F, 0xA361, 0xC991,\n\t0xA362, 0xC992, 0xA363, 0xC993, 0xA364, 0xC994, 0xA365, 0xC995,\t0xA366, 0xC996, 0xA367, 0xC997, 0xA368, 0xC99A, 0xA369, 0xC99C,\n\t0xA36A, 0xC99E, 0xA36B, 0xC99F, 0xA36C, 0xC9A0, 0xA36D, 0xC9A1,\t0xA36E, 0xC9A2, 0xA36F, 0xC9A3, 0xA370, 0xC9A4, 0xA371, 0xC9A5,\n\t0xA372, 0xC9A6, 0xA373, 0xC9A7, 0xA374, 0xC9A8, 0xA375, 0xC9A9,\t0xA376, 0xC9AA, 0xA377, 0xC9AB, 0xA378, 0xC9AC, 0xA379, 0xC9AD,\n\t0xA37A, 0xC9AE, 0xA381, 0xC9AF, 0xA382, 0xC9B0, 0xA383, 0xC9B1,\t0xA384, 0xC9B2, 0xA385, 0xC9B3, 0xA386, 0xC9B4, 0xA387, 0xC9B5,\n\t0xA388, 0xC9B6, 0xA389, 0xC9B7, 0xA38A, 0xC9B8, 0xA38B, 0xC9B9,\t0xA38C, 0xC9BA, 0xA38D, 0xC9BB, 0xA38E, 0xC9BC, 0xA38F, 0xC9BD,\n\t0xA390, 0xC9BE, 0xA391, 0xC9BF, 0xA392, 0xC9C2, 0xA393, 0xC9C3,\t0xA394, 0xC9C5, 0xA395, 0xC9C6, 0xA396, 0xC9C9, 0xA397, 0xC9CB,\n\t0xA398, 0xC9CC, 0xA399, 0xC9CD, 0xA39A, 0xC9CE, 0xA39B, 0xC9CF,\t0xA39C, 0xC9D2, 0xA39D, 0xC9D4, 0xA39E, 0xC9D7, 0xA39F, 0xC9D8,\n\t0xA3A0, 0xC9DB, 0xA3A1, 0xFF01, 0xA3A2, 0xFF02, 0xA3A3, 0xFF03,\t0xA3A4, 0xFF04, 0xA3A5, 0xFF05, 0xA3A6, 0xFF06, 0xA3A7, 0xFF07,\n\t0xA3A8, 0xFF08, 0xA3A9, 0xFF09, 0xA3AA, 0xFF0A, 0xA3AB, 0xFF0B,\t0xA3AC, 0xFF0C, 0xA3AD, 0xFF0D, 0xA3AE, 0xFF0E, 0xA3AF, 0xFF0F,\n\t0xA3B0, 0xFF10, 0xA3B1, 0xFF11, 0xA3B2, 0xFF12, 0xA3B3, 0xFF13,\t0xA3B4, 0xFF14, 0xA3B5, 0xFF15, 0xA3B6, 0xFF16, 0xA3B7, 0xFF17,\n\t0xA3B8, 0xFF18, 0xA3B9, 0xFF19, 0xA3BA, 0xFF1A, 0xA3BB, 0xFF1B,\t0xA3BC, 0xFF1C, 0xA3BD, 0xFF1D, 0xA3BE, 0xFF1E, 0xA3BF, 0xFF1F,\n\t0xA3C0, 0xFF20, 0xA3C1, 0xFF21, 0xA3C2, 0xFF22, 0xA3C3, 0xFF23,\t0xA3C4, 0xFF24, 0xA3C5, 0xFF25, 0xA3C6, 0xFF26, 0xA3C7, 0xFF27,\n\t0xA3C8, 0xFF28, 0xA3C9, 0xFF29, 0xA3CA, 0xFF2A, 0xA3CB, 0xFF2B,\t0xA3CC, 0xFF2C, 0xA3CD, 0xFF2D, 0xA3CE, 0xFF2E, 0xA3CF, 0xFF2F,\n\t0xA3D0, 0xFF30, 0xA3D1, 0xFF31, 0xA3D2, 0xFF32, 0xA3D3, 0xFF33,\t0xA3D4, 0xFF34, 0xA3D5, 0xFF35, 0xA3D6, 0xFF36, 0xA3D7, 0xFF37,\n\t0xA3D8, 0xFF38, 0xA3D9, 0xFF39, 0xA3DA, 0xFF3A, 0xA3DB, 0xFF3B,\t0xA3DC, 0xFFE6, 0xA3DD, 0xFF3D, 0xA3DE, 0xFF3E, 0xA3DF, 0xFF3F,\n\t0xA3E0, 0xFF40, 0xA3E1, 0xFF41, 0xA3E2, 0xFF42, 0xA3E3, 0xFF43,\t0xA3E4, 0xFF44, 0xA3E5, 0xFF45, 0xA3E6, 0xFF46, 0xA3E7, 0xFF47,\n\t0xA3E8, 0xFF48, 0xA3E9, 0xFF49, 0xA3EA, 0xFF4A, 0xA3EB, 0xFF4B,\t0xA3EC, 0xFF4C, 0xA3ED, 0xFF4D, 0xA3EE, 0xFF4E, 0xA3EF, 0xFF4F,\n\t0xA3F0, 0xFF50, 0xA3F1, 0xFF51, 0xA3F2, 0xFF52, 0xA3F3, 0xFF53,\t0xA3F4, 0xFF54, 0xA3F5, 0xFF55, 0xA3F6, 0xFF56, 0xA3F7, 0xFF57,\n\t0xA3F8, 0xFF58, 0xA3F9, 0xFF59, 0xA3FA, 0xFF5A, 0xA3FB, 0xFF5B,\t0xA3FC, 0xFF5C, 0xA3FD, 0xFF5D, 0xA3FE, 0xFFE3, 0xA441, 0xC9DE,\n\t0xA442, 0xC9DF, 0xA443, 0xC9E1, 0xA444, 0xC9E3, 0xA445, 0xC9E5,\t0xA446, 0xC9E6, 0xA447, 0xC9E8, 0xA448, 0xC9E9, 0xA449, 0xC9EA,\n\t0xA44A, 0xC9EB, 0xA44B, 0xC9EE, 0xA44C, 0xC9F2, 0xA44D, 0xC9F3,\t0xA44E, 0xC9F4, 0xA44F, 0xC9F5, 0xA450, 0xC9F6, 0xA451, 0xC9F7,\n\t0xA452, 0xC9FA, 0xA453, 0xC9FB, 0xA454, 0xC9FD, 0xA455, 0xC9FE,\t0xA456, 0xC9FF, 0xA457, 0xCA01, 0xA458, 0xCA02, 0xA459, 0xCA03,\n\t0xA45A, 0xCA04, 0xA461, 0xCA05, 0xA462, 0xCA06, 0xA463, 0xCA07,\t0xA464, 0xCA0A, 0xA465, 0xCA0E, 0xA466, 0xCA0F, 0xA467, 0xCA10,\n\t0xA468, 0xCA11, 0xA469, 0xCA12, 0xA46A, 0xCA13, 0xA46B, 0xCA15,\t0xA46C, 0xCA16, 0xA46D, 0xCA17, 0xA46E, 0xCA19, 0xA46F, 0xCA1A,\n\t0xA470, 0xCA1B, 0xA471, 0xCA1C, 0xA472, 0xCA1D, 0xA473, 0xCA1E,\t0xA474, 0xCA1F, 0xA475, 0xCA20, 0xA476, 0xCA21, 0xA477, 0xCA22,\n\t0xA478, 0xCA23, 0xA479, 0xCA24, 0xA47A, 0xCA25, 0xA481, 0xCA26,\t0xA482, 0xCA27, 0xA483, 0xCA28, 0xA484, 0xCA2A, 0xA485, 0xCA2B,\n\t0xA486, 0xCA2C, 0xA487, 0xCA2D, 0xA488, 0xCA2E, 0xA489, 0xCA2F,\t0xA48A, 0xCA30, 0xA48B, 0xCA31, 0xA48C, 0xCA32, 0xA48D, 0xCA33,\n\t0xA48E, 0xCA34, 0xA48F, 0xCA35, 0xA490, 0xCA36, 0xA491, 0xCA37,\t0xA492, 0xCA38, 0xA493, 0xCA39, 0xA494, 0xCA3A, 0xA495, 0xCA3B,\n\t0xA496, 0xCA3C, 0xA497, 0xCA3D, 0xA498, 0xCA3E, 0xA499, 0xCA3F,\t0xA49A, 0xCA40, 0xA49B, 0xCA41, 0xA49C, 0xCA42, 0xA49D, 0xCA43,\n\t0xA49E, 0xCA44, 0xA49F, 0xCA45, 0xA4A0, 0xCA46, 0xA4A1, 0x3131,\t0xA4A2, 0x3132, 0xA4A3, 0x3133, 0xA4A4, 0x3134, 0xA4A5, 0x3135,\n\t0xA4A6, 0x3136, 0xA4A7, 0x3137, 0xA4A8, 0x3138, 0xA4A9, 0x3139,\t0xA4AA, 0x313A, 0xA4AB, 0x313B, 0xA4AC, 0x313C, 0xA4AD, 0x313D,\n\t0xA4AE, 0x313E, 0xA4AF, 0x313F, 0xA4B0, 0x3140, 0xA4B1, 0x3141,\t0xA4B2, 0x3142, 0xA4B3, 0x3143, 0xA4B4, 0x3144, 0xA4B5, 0x3145,\n\t0xA4B6, 0x3146, 0xA4B7, 0x3147, 0xA4B8, 0x3148, 0xA4B9, 0x3149,\t0xA4BA, 0x314A, 0xA4BB, 0x314B, 0xA4BC, 0x314C, 0xA4BD, 0x314D,\n\t0xA4BE, 0x314E, 0xA4BF, 0x314F, 0xA4C0, 0x3150, 0xA4C1, 0x3151,\t0xA4C2, 0x3152, 0xA4C3, 0x3153, 0xA4C4, 0x3154, 0xA4C5, 0x3155,\n\t0xA4C6, 0x3156, 0xA4C7, 0x3157, 0xA4C8, 0x3158, 0xA4C9, 0x3159,\t0xA4CA, 0x315A, 0xA4CB, 0x315B, 0xA4CC, 0x315C, 0xA4CD, 0x315D,\n\t0xA4CE, 0x315E, 0xA4CF, 0x315F, 0xA4D0, 0x3160, 0xA4D1, 0x3161,\t0xA4D2, 0x3162, 0xA4D3, 0x3163, 0xA4D4, 0x3164, 0xA4D5, 0x3165,\n\t0xA4D6, 0x3166, 0xA4D7, 0x3167, 0xA4D8, 0x3168, 0xA4D9, 0x3169,\t0xA4DA, 0x316A, 0xA4DB, 0x316B, 0xA4DC, 0x316C, 0xA4DD, 0x316D,\n\t0xA4DE, 0x316E, 0xA4DF, 0x316F, 0xA4E0, 0x3170, 0xA4E1, 0x3171,\t0xA4E2, 0x3172, 0xA4E3, 0x3173, 0xA4E4, 0x3174, 0xA4E5, 0x3175,\n\t0xA4E6, 0x3176, 0xA4E7, 0x3177, 0xA4E8, 0x3178, 0xA4E9, 0x3179,\t0xA4EA, 0x317A, 0xA4EB, 0x317B, 0xA4EC, 0x317C, 0xA4ED, 0x317D,\n\t0xA4EE, 0x317E, 0xA4EF, 0x317F, 0xA4F0, 0x3180, 0xA4F1, 0x3181,\t0xA4F2, 0x3182, 0xA4F3, 0x3183, 0xA4F4, 0x3184, 0xA4F5, 0x3185,\n\t0xA4F6, 0x3186, 0xA4F7, 0x3187, 0xA4F8, 0x3188, 0xA4F9, 0x3189,\t0xA4FA, 0x318A, 0xA4FB, 0x318B, 0xA4FC, 0x318C, 0xA4FD, 0x318D,\n\t0xA4FE, 0x318E, 0xA541, 0xCA47, 0xA542, 0xCA48, 0xA543, 0xCA49,\t0xA544, 0xCA4A, 0xA545, 0xCA4B, 0xA546, 0xCA4E, 0xA547, 0xCA4F,\n\t0xA548, 0xCA51, 0xA549, 0xCA52, 0xA54A, 0xCA53, 0xA54B, 0xCA55,\t0xA54C, 0xCA56, 0xA54D, 0xCA57, 0xA54E, 0xCA58, 0xA54F, 0xCA59,\n\t0xA550, 0xCA5A, 0xA551, 0xCA5B, 0xA552, 0xCA5E, 0xA553, 0xCA62,\t0xA554, 0xCA63, 0xA555, 0xCA64, 0xA556, 0xCA65, 0xA557, 0xCA66,\n\t0xA558, 0xCA67, 0xA559, 0xCA69, 0xA55A, 0xCA6A, 0xA561, 0xCA6B,\t0xA562, 0xCA6C, 0xA563, 0xCA6D, 0xA564, 0xCA6E, 0xA565, 0xCA6F,\n\t0xA566, 0xCA70, 0xA567, 0xCA71, 0xA568, 0xCA72, 0xA569, 0xCA73,\t0xA56A, 0xCA74, 0xA56B, 0xCA75, 0xA56C, 0xCA76, 0xA56D, 0xCA77,\n\t0xA56E, 0xCA78, 0xA56F, 0xCA79, 0xA570, 0xCA7A, 0xA571, 0xCA7B,\t0xA572, 0xCA7C, 0xA573, 0xCA7E, 0xA574, 0xCA7F, 0xA575, 0xCA80,\n\t0xA576, 0xCA81, 0xA577, 0xCA82, 0xA578, 0xCA83, 0xA579, 0xCA85,\t0xA57A, 0xCA86, 0xA581, 0xCA87, 0xA582, 0xCA88, 0xA583, 0xCA89,\n\t0xA584, 0xCA8A, 0xA585, 0xCA8B, 0xA586, 0xCA8C, 0xA587, 0xCA8D,\t0xA588, 0xCA8E, 0xA589, 0xCA8F, 0xA58A, 0xCA90, 0xA58B, 0xCA91,\n\t0xA58C, 0xCA92, 0xA58D, 0xCA93, 0xA58E, 0xCA94, 0xA58F, 0xCA95,\t0xA590, 0xCA96, 0xA591, 0xCA97, 0xA592, 0xCA99, 0xA593, 0xCA9A,\n\t0xA594, 0xCA9B, 0xA595, 0xCA9C, 0xA596, 0xCA9D, 0xA597, 0xCA9E,\t0xA598, 0xCA9F, 0xA599, 0xCAA0, 0xA59A, 0xCAA1, 0xA59B, 0xCAA2,\n\t0xA59C, 0xCAA3, 0xA59D, 0xCAA4, 0xA59E, 0xCAA5, 0xA59F, 0xCAA6,\t0xA5A0, 0xCAA7, 0xA5A1, 0x2170, 0xA5A2, 0x2171, 0xA5A3, 0x2172,\n\t0xA5A4, 0x2173, 0xA5A5, 0x2174, 0xA5A6, 0x2175, 0xA5A7, 0x2176,\t0xA5A8, 0x2177, 0xA5A9, 0x2178, 0xA5AA, 0x2179, 0xA5B0, 0x2160,\n\t0xA5B1, 0x2161, 0xA5B2, 0x2162, 0xA5B3, 0x2163, 0xA5B4, 0x2164,\t0xA5B5, 0x2165, 0xA5B6, 0x2166, 0xA5B7, 0x2167, 0xA5B8, 0x2168,\n\t0xA5B9, 0x2169, 0xA5C1, 0x0391, 0xA5C2, 0x0392, 0xA5C3, 0x0393,\t0xA5C4, 0x0394, 0xA5C5, 0x0395, 0xA5C6, 0x0396, 0xA5C7, 0x0397,\n\t0xA5C8, 0x0398, 0xA5C9, 0x0399, 0xA5CA, 0x039A, 0xA5CB, 0x039B,\t0xA5CC, 0x039C, 0xA5CD, 0x039D, 0xA5CE, 0x039E, 0xA5CF, 0x039F,\n\t0xA5D0, 0x03A0, 0xA5D1, 0x03A1, 0xA5D2, 0x03A3, 0xA5D3, 0x03A4,\t0xA5D4, 0x03A5, 0xA5D5, 0x03A6, 0xA5D6, 0x03A7, 0xA5D7, 0x03A8,\n\t0xA5D8, 0x03A9, 0xA5E1, 0x03B1, 0xA5E2, 0x03B2, 0xA5E3, 0x03B3,\t0xA5E4, 0x03B4, 0xA5E5, 0x03B5, 0xA5E6, 0x03B6, 0xA5E7, 0x03B7,\n\t0xA5E8, 0x03B8, 0xA5E9, 0x03B9, 0xA5EA, 0x03BA, 0xA5EB, 0x03BB,\t0xA5EC, 0x03BC, 0xA5ED, 0x03BD, 0xA5EE, 0x03BE, 0xA5EF, 0x03BF,\n\t0xA5F0, 0x03C0, 0xA5F1, 0x03C1, 0xA5F2, 0x03C3, 0xA5F3, 0x03C4,\t0xA5F4, 0x03C5, 0xA5F5, 0x03C6, 0xA5F6, 0x03C7, 0xA5F7, 0x03C8,\n\t0xA5F8, 0x03C9, 0xA641, 0xCAA8, 0xA642, 0xCAA9, 0xA643, 0xCAAA,\t0xA644, 0xCAAB, 0xA645, 0xCAAC, 0xA646, 0xCAAD, 0xA647, 0xCAAE,\n\t0xA648, 0xCAAF, 0xA649, 0xCAB0, 0xA64A, 0xCAB1, 0xA64B, 0xCAB2,\t0xA64C, 0xCAB3, 0xA64D, 0xCAB4, 0xA64E, 0xCAB5, 0xA64F, 0xCAB6,\n\t0xA650, 0xCAB7, 0xA651, 0xCAB8, 0xA652, 0xCAB9, 0xA653, 0xCABA,\t0xA654, 0xCABB, 0xA655, 0xCABE, 0xA656, 0xCABF, 0xA657, 0xCAC1,\n\t0xA658, 0xCAC2, 0xA659, 0xCAC3, 0xA65A, 0xCAC5, 0xA661, 0xCAC6,\t0xA662, 0xCAC7, 0xA663, 0xCAC8, 0xA664, 0xCAC9, 0xA665, 0xCACA,\n\t0xA666, 0xCACB, 0xA667, 0xCACE, 0xA668, 0xCAD0, 0xA669, 0xCAD2,\t0xA66A, 0xCAD4, 0xA66B, 0xCAD5, 0xA66C, 0xCAD6, 0xA66D, 0xCAD7,\n\t0xA66E, 0xCADA, 0xA66F, 0xCADB, 0xA670, 0xCADC, 0xA671, 0xCADD,\t0xA672, 0xCADE, 0xA673, 0xCADF, 0xA674, 0xCAE1, 0xA675, 0xCAE2,\n\t0xA676, 0xCAE3, 0xA677, 0xCAE4, 0xA678, 0xCAE5, 0xA679, 0xCAE6,\t0xA67A, 0xCAE7, 0xA681, 0xCAE8, 0xA682, 0xCAE9, 0xA683, 0xCAEA,\n\t0xA684, 0xCAEB, 0xA685, 0xCAED, 0xA686, 0xCAEE, 0xA687, 0xCAEF,\t0xA688, 0xCAF0, 0xA689, 0xCAF1, 0xA68A, 0xCAF2, 0xA68B, 0xCAF3,\n\t0xA68C, 0xCAF5, 0xA68D, 0xCAF6, 0xA68E, 0xCAF7, 0xA68F, 0xCAF8,\t0xA690, 0xCAF9, 0xA691, 0xCAFA, 0xA692, 0xCAFB, 0xA693, 0xCAFC,\n\t0xA694, 0xCAFD, 0xA695, 0xCAFE, 0xA696, 0xCAFF, 0xA697, 0xCB00,\t0xA698, 0xCB01, 0xA699, 0xCB02, 0xA69A, 0xCB03, 0xA69B, 0xCB04,\n\t0xA69C, 0xCB05, 0xA69D, 0xCB06, 0xA69E, 0xCB07, 0xA69F, 0xCB09,\t0xA6A0, 0xCB0A, 0xA6A1, 0x2500, 0xA6A2, 0x2502, 0xA6A3, 0x250C,\n\t0xA6A4, 0x2510, 0xA6A5, 0x2518, 0xA6A6, 0x2514, 0xA6A7, 0x251C,\t0xA6A8, 0x252C, 0xA6A9, 0x2524, 0xA6AA, 0x2534, 0xA6AB, 0x253C,\n\t0xA6AC, 0x2501, 0xA6AD, 0x2503, 0xA6AE, 0x250F, 0xA6AF, 0x2513,\t0xA6B0, 0x251B, 0xA6B1, 0x2517, 0xA6B2, 0x2523, 0xA6B3, 0x2533,\n\t0xA6B4, 0x252B, 0xA6B5, 0x253B, 0xA6B6, 0x254B, 0xA6B7, 0x2520,\t0xA6B8, 0x252F, 0xA6B9, 0x2528, 0xA6BA, 0x2537, 0xA6BB, 0x253F,\n\t0xA6BC, 0x251D, 0xA6BD, 0x2530, 0xA6BE, 0x2525, 0xA6BF, 0x2538,\t0xA6C0, 0x2542, 0xA6C1, 0x2512, 0xA6C2, 0x2511, 0xA6C3, 0x251A,\n\t0xA6C4, 0x2519, 0xA6C5, 0x2516, 0xA6C6, 0x2515, 0xA6C7, 0x250E,\t0xA6C8, 0x250D, 0xA6C9, 0x251E, 0xA6CA, 0x251F, 0xA6CB, 0x2521,\n\t0xA6CC, 0x2522, 0xA6CD, 0x2526, 0xA6CE, 0x2527, 0xA6CF, 0x2529,\t0xA6D0, 0x252A, 0xA6D1, 0x252D, 0xA6D2, 0x252E, 0xA6D3, 0x2531,\n\t0xA6D4, 0x2532, 0xA6D5, 0x2535, 0xA6D6, 0x2536, 0xA6D7, 0x2539,\t0xA6D8, 0x253A, 0xA6D9, 0x253D, 0xA6DA, 0x253E, 0xA6DB, 0x2540,\n\t0xA6DC, 0x2541, 0xA6DD, 0x2543, 0xA6DE, 0x2544, 0xA6DF, 0x2545,\t0xA6E0, 0x2546, 0xA6E1, 0x2547, 0xA6E2, 0x2548, 0xA6E3, 0x2549,\n\t0xA6E4, 0x254A, 0xA741, 0xCB0B, 0xA742, 0xCB0C, 0xA743, 0xCB0D,\t0xA744, 0xCB0E, 0xA745, 0xCB0F, 0xA746, 0xCB11, 0xA747, 0xCB12,\n\t0xA748, 0xCB13, 0xA749, 0xCB15, 0xA74A, 0xCB16, 0xA74B, 0xCB17,\t0xA74C, 0xCB19, 0xA74D, 0xCB1A, 0xA74E, 0xCB1B, 0xA74F, 0xCB1C,\n\t0xA750, 0xCB1D, 0xA751, 0xCB1E, 0xA752, 0xCB1F, 0xA753, 0xCB22,\t0xA754, 0xCB23, 0xA755, 0xCB24, 0xA756, 0xCB25, 0xA757, 0xCB26,\n\t0xA758, 0xCB27, 0xA759, 0xCB28, 0xA75A, 0xCB29, 0xA761, 0xCB2A,\t0xA762, 0xCB2B, 0xA763, 0xCB2C, 0xA764, 0xCB2D, 0xA765, 0xCB2E,\n\t0xA766, 0xCB2F, 0xA767, 0xCB30, 0xA768, 0xCB31, 0xA769, 0xCB32,\t0xA76A, 0xCB33, 0xA76B, 0xCB34, 0xA76C, 0xCB35, 0xA76D, 0xCB36,\n\t0xA76E, 0xCB37, 0xA76F, 0xCB38, 0xA770, 0xCB39, 0xA771, 0xCB3A,\t0xA772, 0xCB3B, 0xA773, 0xCB3C, 0xA774, 0xCB3D, 0xA775, 0xCB3E,\n\t0xA776, 0xCB3F, 0xA777, 0xCB40, 0xA778, 0xCB42, 0xA779, 0xCB43,\t0xA77A, 0xCB44, 0xA781, 0xCB45, 0xA782, 0xCB46, 0xA783, 0xCB47,\n\t0xA784, 0xCB4A, 0xA785, 0xCB4B, 0xA786, 0xCB4D, 0xA787, 0xCB4E,\t0xA788, 0xCB4F, 0xA789, 0xCB51, 0xA78A, 0xCB52, 0xA78B, 0xCB53,\n\t0xA78C, 0xCB54, 0xA78D, 0xCB55, 0xA78E, 0xCB56, 0xA78F, 0xCB57,\t0xA790, 0xCB5A, 0xA791, 0xCB5B, 0xA792, 0xCB5C, 0xA793, 0xCB5E,\n\t0xA794, 0xCB5F, 0xA795, 0xCB60, 0xA796, 0xCB61, 0xA797, 0xCB62,\t0xA798, 0xCB63, 0xA799, 0xCB65, 0xA79A, 0xCB66, 0xA79B, 0xCB67,\n\t0xA79C, 0xCB68, 0xA79D, 0xCB69, 0xA79E, 0xCB6A, 0xA79F, 0xCB6B,\t0xA7A0, 0xCB6C, 0xA7A1, 0x3395, 0xA7A2, 0x3396, 0xA7A3, 0x3397,\n\t0xA7A4, 0x2113, 0xA7A5, 0x3398, 0xA7A6, 0x33C4, 0xA7A7, 0x33A3,\t0xA7A8, 0x33A4, 0xA7A9, 0x33A5, 0xA7AA, 0x33A6, 0xA7AB, 0x3399,\n\t0xA7AC, 0x339A, 0xA7AD, 0x339B, 0xA7AE, 0x339C, 0xA7AF, 0x339D,\t0xA7B0, 0x339E, 0xA7B1, 0x339F, 0xA7B2, 0x33A0, 0xA7B3, 0x33A1,\n\t0xA7B4, 0x33A2, 0xA7B5, 0x33CA, 0xA7B6, 0x338D, 0xA7B7, 0x338E,\t0xA7B8, 0x338F, 0xA7B9, 0x33CF, 0xA7BA, 0x3388, 0xA7BB, 0x3389,\n\t0xA7BC, 0x33C8, 0xA7BD, 0x33A7, 0xA7BE, 0x33A8, 0xA7BF, 0x33B0,\t0xA7C0, 0x33B1, 0xA7C1, 0x33B2, 0xA7C2, 0x33B3, 0xA7C3, 0x33B4,\n\t0xA7C4, 0x33B5, 0xA7C5, 0x33B6, 0xA7C6, 0x33B7, 0xA7C7, 0x33B8,\t0xA7C8, 0x33B9, 0xA7C9, 0x3380, 0xA7CA, 0x3381, 0xA7CB, 0x3382,\n\t0xA7CC, 0x3383, 0xA7CD, 0x3384, 0xA7CE, 0x33BA, 0xA7CF, 0x33BB,\t0xA7D0, 0x33BC, 0xA7D1, 0x33BD, 0xA7D2, 0x33BE, 0xA7D3, 0x33BF,\n\t0xA7D4, 0x3390, 0xA7D5, 0x3391, 0xA7D6, 0x3392, 0xA7D7, 0x3393,\t0xA7D8, 0x3394, 0xA7D9, 0x2126, 0xA7DA, 0x33C0, 0xA7DB, 0x33C1,\n\t0xA7DC, 0x338A, 0xA7DD, 0x338B, 0xA7DE, 0x338C, 0xA7DF, 0x33D6,\t0xA7E0, 0x33C5, 0xA7E1, 0x33AD, 0xA7E2, 0x33AE, 0xA7E3, 0x33AF,\n\t0xA7E4, 0x33DB, 0xA7E5, 0x33A9, 0xA7E6, 0x33AA, 0xA7E7, 0x33AB,\t0xA7E8, 0x33AC, 0xA7E9, 0x33DD, 0xA7EA, 0x33D0, 0xA7EB, 0x33D3,\n\t0xA7EC, 0x33C3, 0xA7ED, 0x33C9, 0xA7EE, 0x33DC, 0xA7EF, 0x33C6,\t0xA841, 0xCB6D, 0xA842, 0xCB6E, 0xA843, 0xCB6F, 0xA844, 0xCB70,\n\t0xA845, 0xCB71, 0xA846, 0xCB72, 0xA847, 0xCB73, 0xA848, 0xCB74,\t0xA849, 0xCB75, 0xA84A, 0xCB76, 0xA84B, 0xCB77, 0xA84C, 0xCB7A,\n\t0xA84D, 0xCB7B, 0xA84E, 0xCB7C, 0xA84F, 0xCB7D, 0xA850, 0xCB7E,\t0xA851, 0xCB7F, 0xA852, 0xCB80, 0xA853, 0xCB81, 0xA854, 0xCB82,\n\t0xA855, 0xCB83, 0xA856, 0xCB84, 0xA857, 0xCB85, 0xA858, 0xCB86,\t0xA859, 0xCB87, 0xA85A, 0xCB88, 0xA861, 0xCB89, 0xA862, 0xCB8A,\n\t0xA863, 0xCB8B, 0xA864, 0xCB8C, 0xA865, 0xCB8D, 0xA866, 0xCB8E,\t0xA867, 0xCB8F, 0xA868, 0xCB90, 0xA869, 0xCB91, 0xA86A, 0xCB92,\n\t0xA86B, 0xCB93, 0xA86C, 0xCB94, 0xA86D, 0xCB95, 0xA86E, 0xCB96,\t0xA86F, 0xCB97, 0xA870, 0xCB98, 0xA871, 0xCB99, 0xA872, 0xCB9A,\n\t0xA873, 0xCB9B, 0xA874, 0xCB9D, 0xA875, 0xCB9E, 0xA876, 0xCB9F,\t0xA877, 0xCBA0, 0xA878, 0xCBA1, 0xA879, 0xCBA2, 0xA87A, 0xCBA3,\n\t0xA881, 0xCBA4, 0xA882, 0xCBA5, 0xA883, 0xCBA6, 0xA884, 0xCBA7,\t0xA885, 0xCBA8, 0xA886, 0xCBA9, 0xA887, 0xCBAA, 0xA888, 0xCBAB,\n\t0xA889, 0xCBAC, 0xA88A, 0xCBAD, 0xA88B, 0xCBAE, 0xA88C, 0xCBAF,\t0xA88D, 0xCBB0, 0xA88E, 0xCBB1, 0xA88F, 0xCBB2, 0xA890, 0xCBB3,\n\t0xA891, 0xCBB4, 0xA892, 0xCBB5, 0xA893, 0xCBB6, 0xA894, 0xCBB7,\t0xA895, 0xCBB9, 0xA896, 0xCBBA, 0xA897, 0xCBBB, 0xA898, 0xCBBC,\n\t0xA899, 0xCBBD, 0xA89A, 0xCBBE, 0xA89B, 0xCBBF, 0xA89C, 0xCBC0,\t0xA89D, 0xCBC1, 0xA89E, 0xCBC2, 0xA89F, 0xCBC3, 0xA8A0, 0xCBC4,\n\t0xA8A1, 0x00C6, 0xA8A2, 0x00D0, 0xA8A3, 0x00AA, 0xA8A4, 0x0126,\t0xA8A6, 0x0132, 0xA8A8, 0x013F, 0xA8A9, 0x0141, 0xA8AA, 0x00D8,\n\t0xA8AB, 0x0152, 0xA8AC, 0x00BA, 0xA8AD, 0x00DE, 0xA8AE, 0x0166,\t0xA8AF, 0x014A, 0xA8B1, 0x3260, 0xA8B2, 0x3261, 0xA8B3, 0x3262,\n\t0xA8B4, 0x3263, 0xA8B5, 0x3264, 0xA8B6, 0x3265, 0xA8B7, 0x3266,\t0xA8B8, 0x3267, 0xA8B9, 0x3268, 0xA8BA, 0x3269, 0xA8BB, 0x326A,\n\t0xA8BC, 0x326B, 0xA8BD, 0x326C, 0xA8BE, 0x326D, 0xA8BF, 0x326E,\t0xA8C0, 0x326F, 0xA8C1, 0x3270, 0xA8C2, 0x3271, 0xA8C3, 0x3272,\n\t0xA8C4, 0x3273, 0xA8C5, 0x3274, 0xA8C6, 0x3275, 0xA8C7, 0x3276,\t0xA8C8, 0x3277, 0xA8C9, 0x3278, 0xA8CA, 0x3279, 0xA8CB, 0x327A,\n\t0xA8CC, 0x327B, 0xA8CD, 0x24D0, 0xA8CE, 0x24D1, 0xA8CF, 0x24D2,\t0xA8D0, 0x24D3, 0xA8D1, 0x24D4, 0xA8D2, 0x24D5, 0xA8D3, 0x24D6,\n\t0xA8D4, 0x24D7, 0xA8D5, 0x24D8, 0xA8D6, 0x24D9, 0xA8D7, 0x24DA,\t0xA8D8, 0x24DB, 0xA8D9, 0x24DC, 0xA8DA, 0x24DD, 0xA8DB, 0x24DE,\n\t0xA8DC, 0x24DF, 0xA8DD, 0x24E0, 0xA8DE, 0x24E1, 0xA8DF, 0x24E2,\t0xA8E0, 0x24E3, 0xA8E1, 0x24E4, 0xA8E2, 0x24E5, 0xA8E3, 0x24E6,\n\t0xA8E4, 0x24E7, 0xA8E5, 0x24E8, 0xA8E6, 0x24E9, 0xA8E7, 0x2460,\t0xA8E8, 0x2461, 0xA8E9, 0x2462, 0xA8EA, 0x2463, 0xA8EB, 0x2464,\n\t0xA8EC, 0x2465, 0xA8ED, 0x2466, 0xA8EE, 0x2467, 0xA8EF, 0x2468,\t0xA8F0, 0x2469, 0xA8F1, 0x246A, 0xA8F2, 0x246B, 0xA8F3, 0x246C,\n\t0xA8F4, 0x246D, 0xA8F5, 0x246E, 0xA8F6, 0x00BD, 0xA8F7, 0x2153,\t0xA8F8, 0x2154, 0xA8F9, 0x00BC, 0xA8FA, 0x00BE, 0xA8FB, 0x215B,\n\t0xA8FC, 0x215C, 0xA8FD, 0x215D, 0xA8FE, 0x215E, 0xA941, 0xCBC5,\t0xA942, 0xCBC6, 0xA943, 0xCBC7, 0xA944, 0xCBC8, 0xA945, 0xCBC9,\n\t0xA946, 0xCBCA, 0xA947, 0xCBCB, 0xA948, 0xCBCC, 0xA949, 0xCBCD,\t0xA94A, 0xCBCE, 0xA94B, 0xCBCF, 0xA94C, 0xCBD0, 0xA94D, 0xCBD1,\n\t0xA94E, 0xCBD2, 0xA94F, 0xCBD3, 0xA950, 0xCBD5, 0xA951, 0xCBD6,\t0xA952, 0xCBD7, 0xA953, 0xCBD8, 0xA954, 0xCBD9, 0xA955, 0xCBDA,\n\t0xA956, 0xCBDB, 0xA957, 0xCBDC, 0xA958, 0xCBDD, 0xA959, 0xCBDE,\t0xA95A, 0xCBDF, 0xA961, 0xCBE0, 0xA962, 0xCBE1, 0xA963, 0xCBE2,\n\t0xA964, 0xCBE3, 0xA965, 0xCBE5, 0xA966, 0xCBE6, 0xA967, 0xCBE8,\t0xA968, 0xCBEA, 0xA969, 0xCBEB, 0xA96A, 0xCBEC, 0xA96B, 0xCBED,\n\t0xA96C, 0xCBEE, 0xA96D, 0xCBEF, 0xA96E, 0xCBF0, 0xA96F, 0xCBF1,\t0xA970, 0xCBF2, 0xA971, 0xCBF3, 0xA972, 0xCBF4, 0xA973, 0xCBF5,\n\t0xA974, 0xCBF6, 0xA975, 0xCBF7, 0xA976, 0xCBF8, 0xA977, 0xCBF9,\t0xA978, 0xCBFA, 0xA979, 0xCBFB, 0xA97A, 0xCBFC, 0xA981, 0xCBFD,\n\t0xA982, 0xCBFE, 0xA983, 0xCBFF, 0xA984, 0xCC00, 0xA985, 0xCC01,\t0xA986, 0xCC02, 0xA987, 0xCC03, 0xA988, 0xCC04, 0xA989, 0xCC05,\n\t0xA98A, 0xCC06, 0xA98B, 0xCC07, 0xA98C, 0xCC08, 0xA98D, 0xCC09,\t0xA98E, 0xCC0A, 0xA98F, 0xCC0B, 0xA990, 0xCC0E, 0xA991, 0xCC0F,\n\t0xA992, 0xCC11, 0xA993, 0xCC12, 0xA994, 0xCC13, 0xA995, 0xCC15,\t0xA996, 0xCC16, 0xA997, 0xCC17, 0xA998, 0xCC18, 0xA999, 0xCC19,\n\t0xA99A, 0xCC1A, 0xA99B, 0xCC1B, 0xA99C, 0xCC1E, 0xA99D, 0xCC1F,\t0xA99E, 0xCC20, 0xA99F, 0xCC23, 0xA9A0, 0xCC24, 0xA9A1, 0x00E6,\n\t0xA9A2, 0x0111, 0xA9A3, 0x00F0, 0xA9A4, 0x0127, 0xA9A5, 0x0131,\t0xA9A6, 0x0133, 0xA9A7, 0x0138, 0xA9A8, 0x0140, 0xA9A9, 0x0142,\n\t0xA9AA, 0x00F8, 0xA9AB, 0x0153, 0xA9AC, 0x00DF, 0xA9AD, 0x00FE,\t0xA9AE, 0x0167, 0xA9AF, 0x014B, 0xA9B0, 0x0149, 0xA9B1, 0x3200,\n\t0xA9B2, 0x3201, 0xA9B3, 0x3202, 0xA9B4, 0x3203, 0xA9B5, 0x3204,\t0xA9B6, 0x3205, 0xA9B7, 0x3206, 0xA9B8, 0x3207, 0xA9B9, 0x3208,\n\t0xA9BA, 0x3209, 0xA9BB, 0x320A, 0xA9BC, 0x320B, 0xA9BD, 0x320C,\t0xA9BE, 0x320D, 0xA9BF, 0x320E, 0xA9C0, 0x320F, 0xA9C1, 0x3210,\n\t0xA9C2, 0x3211, 0xA9C3, 0x3212, 0xA9C4, 0x3213, 0xA9C5, 0x3214,\t0xA9C6, 0x3215, 0xA9C7, 0x3216, 0xA9C8, 0x3217, 0xA9C9, 0x3218,\n\t0xA9CA, 0x3219, 0xA9CB, 0x321A, 0xA9CC, 0x321B, 0xA9CD, 0x249C,\t0xA9CE, 0x249D, 0xA9CF, 0x249E, 0xA9D0, 0x249F, 0xA9D1, 0x24A0,\n\t0xA9D2, 0x24A1, 0xA9D3, 0x24A2, 0xA9D4, 0x24A3, 0xA9D5, 0x24A4,\t0xA9D6, 0x24A5, 0xA9D7, 0x24A6, 0xA9D8, 0x24A7, 0xA9D9, 0x24A8,\n\t0xA9DA, 0x24A9, 0xA9DB, 0x24AA, 0xA9DC, 0x24AB, 0xA9DD, 0x24AC,\t0xA9DE, 0x24AD, 0xA9DF, 0x24AE, 0xA9E0, 0x24AF, 0xA9E1, 0x24B0,\n\t0xA9E2, 0x24B1, 0xA9E3, 0x24B2, 0xA9E4, 0x24B3, 0xA9E5, 0x24B4,\t0xA9E6, 0x24B5, 0xA9E7, 0x2474, 0xA9E8, 0x2475, 0xA9E9, 0x2476,\n\t0xA9EA, 0x2477, 0xA9EB, 0x2478, 0xA9EC, 0x2479, 0xA9ED, 0x247A,\t0xA9EE, 0x247B, 0xA9EF, 0x247C, 0xA9F0, 0x247D, 0xA9F1, 0x247E,\n\t0xA9F2, 0x247F, 0xA9F3, 0x2480, 0xA9F4, 0x2481, 0xA9F5, 0x2482,\t0xA9F6, 0x00B9, 0xA9F7, 0x00B2, 0xA9F8, 0x00B3, 0xA9F9, 0x2074,\n\t0xA9FA, 0x207F, 0xA9FB, 0x2081, 0xA9FC, 0x2082, 0xA9FD, 0x2083,\t0xA9FE, 0x2084, 0xAA41, 0xCC25, 0xAA42, 0xCC26, 0xAA43, 0xCC2A,\n\t0xAA44, 0xCC2B, 0xAA45, 0xCC2D, 0xAA46, 0xCC2F, 0xAA47, 0xCC31,\t0xAA48, 0xCC32, 0xAA49, 0xCC33, 0xAA4A, 0xCC34, 0xAA4B, 0xCC35,\n\t0xAA4C, 0xCC36, 0xAA4D, 0xCC37, 0xAA4E, 0xCC3A, 0xAA4F, 0xCC3F,\t0xAA50, 0xCC40, 0xAA51, 0xCC41, 0xAA52, 0xCC42, 0xAA53, 0xCC43,\n\t0xAA54, 0xCC46, 0xAA55, 0xCC47, 0xAA56, 0xCC49, 0xAA57, 0xCC4A,\t0xAA58, 0xCC4B, 0xAA59, 0xCC4D, 0xAA5A, 0xCC4E, 0xAA61, 0xCC4F,\n\t0xAA62, 0xCC50, 0xAA63, 0xCC51, 0xAA64, 0xCC52, 0xAA65, 0xCC53,\t0xAA66, 0xCC56, 0xAA67, 0xCC5A, 0xAA68, 0xCC5B, 0xAA69, 0xCC5C,\n\t0xAA6A, 0xCC5D, 0xAA6B, 0xCC5E, 0xAA6C, 0xCC5F, 0xAA6D, 0xCC61,\t0xAA6E, 0xCC62, 0xAA6F, 0xCC63, 0xAA70, 0xCC65, 0xAA71, 0xCC67,\n\t0xAA72, 0xCC69, 0xAA73, 0xCC6A, 0xAA74, 0xCC6B, 0xAA75, 0xCC6C,\t0xAA76, 0xCC6D, 0xAA77, 0xCC6E, 0xAA78, 0xCC6F, 0xAA79, 0xCC71,\n\t0xAA7A, 0xCC72, 0xAA81, 0xCC73, 0xAA82, 0xCC74, 0xAA83, 0xCC76,\t0xAA84, 0xCC77, 0xAA85, 0xCC78, 0xAA86, 0xCC79, 0xAA87, 0xCC7A,\n\t0xAA88, 0xCC7B, 0xAA89, 0xCC7C, 0xAA8A, 0xCC7D, 0xAA8B, 0xCC7E,\t0xAA8C, 0xCC7F, 0xAA8D, 0xCC80, 0xAA8E, 0xCC81, 0xAA8F, 0xCC82,\n\t0xAA90, 0xCC83, 0xAA91, 0xCC84, 0xAA92, 0xCC85, 0xAA93, 0xCC86,\t0xAA94, 0xCC87, 0xAA95, 0xCC88, 0xAA96, 0xCC89, 0xAA97, 0xCC8A,\n\t0xAA98, 0xCC8B, 0xAA99, 0xCC8C, 0xAA9A, 0xCC8D, 0xAA9B, 0xCC8E,\t0xAA9C, 0xCC8F, 0xAA9D, 0xCC90, 0xAA9E, 0xCC91, 0xAA9F, 0xCC92,\n\t0xAAA0, 0xCC93, 0xAAA1, 0x3041, 0xAAA2, 0x3042, 0xAAA3, 0x3043,\t0xAAA4, 0x3044, 0xAAA5, 0x3045, 0xAAA6, 0x3046, 0xAAA7, 0x3047,\n\t0xAAA8, 0x3048, 0xAAA9, 0x3049, 0xAAAA, 0x304A, 0xAAAB, 0x304B,\t0xAAAC, 0x304C, 0xAAAD, 0x304D, 0xAAAE, 0x304E, 0xAAAF, 0x304F,\n\t0xAAB0, 0x3050, 0xAAB1, 0x3051, 0xAAB2, 0x3052, 0xAAB3, 0x3053,\t0xAAB4, 0x3054, 0xAAB5, 0x3055, 0xAAB6, 0x3056, 0xAAB7, 0x3057,\n\t0xAAB8, 0x3058, 0xAAB9, 0x3059, 0xAABA, 0x305A, 0xAABB, 0x305B,\t0xAABC, 0x305C, 0xAABD, 0x305D, 0xAABE, 0x305E, 0xAABF, 0x305F,\n\t0xAAC0, 0x3060, 0xAAC1, 0x3061, 0xAAC2, 0x3062, 0xAAC3, 0x3063,\t0xAAC4, 0x3064, 0xAAC5, 0x3065, 0xAAC6, 0x3066, 0xAAC7, 0x3067,\n\t0xAAC8, 0x3068, 0xAAC9, 0x3069, 0xAACA, 0x306A, 0xAACB, 0x306B,\t0xAACC, 0x306C, 0xAACD, 0x306D, 0xAACE, 0x306E, 0xAACF, 0x306F,\n\t0xAAD0, 0x3070, 0xAAD1, 0x3071, 0xAAD2, 0x3072, 0xAAD3, 0x3073,\t0xAAD4, 0x3074, 0xAAD5, 0x3075, 0xAAD6, 0x3076, 0xAAD7, 0x3077,\n\t0xAAD8, 0x3078, 0xAAD9, 0x3079, 0xAADA, 0x307A, 0xAADB, 0x307B,\t0xAADC, 0x307C, 0xAADD, 0x307D, 0xAADE, 0x307E, 0xAADF, 0x307F,\n\t0xAAE0, 0x3080, 0xAAE1, 0x3081, 0xAAE2, 0x3082, 0xAAE3, 0x3083,\t0xAAE4, 0x3084, 0xAAE5, 0x3085, 0xAAE6, 0x3086, 0xAAE7, 0x3087,\n\t0xAAE8, 0x3088, 0xAAE9, 0x3089, 0xAAEA, 0x308A, 0xAAEB, 0x308B,\t0xAAEC, 0x308C, 0xAAED, 0x308D, 0xAAEE, 0x308E, 0xAAEF, 0x308F,\n\t0xAAF0, 0x3090, 0xAAF1, 0x3091, 0xAAF2, 0x3092, 0xAAF3, 0x3093,\t0xAB41, 0xCC94, 0xAB42, 0xCC95, 0xAB43, 0xCC96, 0xAB44, 0xCC97,\n\t0xAB45, 0xCC9A, 0xAB46, 0xCC9B, 0xAB47, 0xCC9D, 0xAB48, 0xCC9E,\t0xAB49, 0xCC9F, 0xAB4A, 0xCCA1, 0xAB4B, 0xCCA2, 0xAB4C, 0xCCA3,\n\t0xAB4D, 0xCCA4, 0xAB4E, 0xCCA5, 0xAB4F, 0xCCA6, 0xAB50, 0xCCA7,\t0xAB51, 0xCCAA, 0xAB52, 0xCCAE, 0xAB53, 0xCCAF, 0xAB54, 0xCCB0,\n\t0xAB55, 0xCCB1, 0xAB56, 0xCCB2, 0xAB57, 0xCCB3, 0xAB58, 0xCCB6,\t0xAB59, 0xCCB7, 0xAB5A, 0xCCB9, 0xAB61, 0xCCBA, 0xAB62, 0xCCBB,\n\t0xAB63, 0xCCBD, 0xAB64, 0xCCBE, 0xAB65, 0xCCBF, 0xAB66, 0xCCC0,\t0xAB67, 0xCCC1, 0xAB68, 0xCCC2, 0xAB69, 0xCCC3, 0xAB6A, 0xCCC6,\n\t0xAB6B, 0xCCC8, 0xAB6C, 0xCCCA, 0xAB6D, 0xCCCB, 0xAB6E, 0xCCCC,\t0xAB6F, 0xCCCD, 0xAB70, 0xCCCE, 0xAB71, 0xCCCF, 0xAB72, 0xCCD1,\n\t0xAB73, 0xCCD2, 0xAB74, 0xCCD3, 0xAB75, 0xCCD5, 0xAB76, 0xCCD6,\t0xAB77, 0xCCD7, 0xAB78, 0xCCD8, 0xAB79, 0xCCD9, 0xAB7A, 0xCCDA,\n\t0xAB81, 0xCCDB, 0xAB82, 0xCCDC, 0xAB83, 0xCCDD, 0xAB84, 0xCCDE,\t0xAB85, 0xCCDF, 0xAB86, 0xCCE0, 0xAB87, 0xCCE1, 0xAB88, 0xCCE2,\n\t0xAB89, 0xCCE3, 0xAB8A, 0xCCE5, 0xAB8B, 0xCCE6, 0xAB8C, 0xCCE7,\t0xAB8D, 0xCCE8, 0xAB8E, 0xCCE9, 0xAB8F, 0xCCEA, 0xAB90, 0xCCEB,\n\t0xAB91, 0xCCED, 0xAB92, 0xCCEE, 0xAB93, 0xCCEF, 0xAB94, 0xCCF1,\t0xAB95, 0xCCF2, 0xAB96, 0xCCF3, 0xAB97, 0xCCF4, 0xAB98, 0xCCF5,\n\t0xAB99, 0xCCF6, 0xAB9A, 0xCCF7, 0xAB9B, 0xCCF8, 0xAB9C, 0xCCF9,\t0xAB9D, 0xCCFA, 0xAB9E, 0xCCFB, 0xAB9F, 0xCCFC, 0xABA0, 0xCCFD,\n\t0xABA1, 0x30A1, 0xABA2, 0x30A2, 0xABA3, 0x30A3, 0xABA4, 0x30A4,\t0xABA5, 0x30A5, 0xABA6, 0x30A6, 0xABA7, 0x30A7, 0xABA8, 0x30A8,\n\t0xABA9, 0x30A9, 0xABAA, 0x30AA, 0xABAB, 0x30AB, 0xABAC, 0x30AC,\t0xABAD, 0x30AD, 0xABAE, 0x30AE, 0xABAF, 0x30AF, 0xABB0, 0x30B0,\n\t0xABB1, 0x30B1, 0xABB2, 0x30B2, 0xABB3, 0x30B3, 0xABB4, 0x30B4,\t0xABB5, 0x30B5, 0xABB6, 0x30B6, 0xABB7, 0x30B7, 0xABB8, 0x30B8,\n\t0xABB9, 0x30B9, 0xABBA, 0x30BA, 0xABBB, 0x30BB, 0xABBC, 0x30BC,\t0xABBD, 0x30BD, 0xABBE, 0x30BE, 0xABBF, 0x30BF, 0xABC0, 0x30C0,\n\t0xABC1, 0x30C1, 0xABC2, 0x30C2, 0xABC3, 0x30C3, 0xABC4, 0x30C4,\t0xABC5, 0x30C5, 0xABC6, 0x30C6, 0xABC7, 0x30C7, 0xABC8, 0x30C8,\n\t0xABC9, 0x30C9, 0xABCA, 0x30CA, 0xABCB, 0x30CB, 0xABCC, 0x30CC,\t0xABCD, 0x30CD, 0xABCE, 0x30CE, 0xABCF, 0x30CF, 0xABD0, 0x30D0,\n\t0xABD1, 0x30D1, 0xABD2, 0x30D2, 0xABD3, 0x30D3, 0xABD4, 0x30D4,\t0xABD5, 0x30D5, 0xABD6, 0x30D6, 0xABD7, 0x30D7, 0xABD8, 0x30D8,\n\t0xABD9, 0x30D9, 0xABDA, 0x30DA, 0xABDB, 0x30DB, 0xABDC, 0x30DC,\t0xABDD, 0x30DD, 0xABDE, 0x30DE, 0xABDF, 0x30DF, 0xABE0, 0x30E0,\n\t0xABE1, 0x30E1, 0xABE2, 0x30E2, 0xABE3, 0x30E3, 0xABE4, 0x30E4,\t0xABE5, 0x30E5, 0xABE6, 0x30E6, 0xABE7, 0x30E7, 0xABE8, 0x30E8,\n\t0xABE9, 0x30E9, 0xABEA, 0x30EA, 0xABEB, 0x30EB, 0xABEC, 0x30EC,\t0xABED, 0x30ED, 0xABEE, 0x30EE, 0xABEF, 0x30EF, 0xABF0, 0x30F0,\n\t0xABF1, 0x30F1, 0xABF2, 0x30F2, 0xABF3, 0x30F3, 0xABF4, 0x30F4,\t0xABF5, 0x30F5, 0xABF6, 0x30F6, 0xAC41, 0xCCFE, 0xAC42, 0xCCFF,\n\t0xAC43, 0xCD00, 0xAC44, 0xCD02, 0xAC45, 0xCD03, 0xAC46, 0xCD04,\t0xAC47, 0xCD05, 0xAC48, 0xCD06, 0xAC49, 0xCD07, 0xAC4A, 0xCD0A,\n\t0xAC4B, 0xCD0B, 0xAC4C, 0xCD0D, 0xAC4D, 0xCD0E, 0xAC4E, 0xCD0F,\t0xAC4F, 0xCD11, 0xAC50, 0xCD12, 0xAC51, 0xCD13, 0xAC52, 0xCD14,\n\t0xAC53, 0xCD15, 0xAC54, 0xCD16, 0xAC55, 0xCD17, 0xAC56, 0xCD1A,\t0xAC57, 0xCD1C, 0xAC58, 0xCD1E, 0xAC59, 0xCD1F, 0xAC5A, 0xCD20,\n\t0xAC61, 0xCD21, 0xAC62, 0xCD22, 0xAC63, 0xCD23, 0xAC64, 0xCD25,\t0xAC65, 0xCD26, 0xAC66, 0xCD27, 0xAC67, 0xCD29, 0xAC68, 0xCD2A,\n\t0xAC69, 0xCD2B, 0xAC6A, 0xCD2D, 0xAC6B, 0xCD2E, 0xAC6C, 0xCD2F,\t0xAC6D, 0xCD30, 0xAC6E, 0xCD31, 0xAC6F, 0xCD32, 0xAC70, 0xCD33,\n\t0xAC71, 0xCD34, 0xAC72, 0xCD35, 0xAC73, 0xCD36, 0xAC74, 0xCD37,\t0xAC75, 0xCD38, 0xAC76, 0xCD3A, 0xAC77, 0xCD3B, 0xAC78, 0xCD3C,\n\t0xAC79, 0xCD3D, 0xAC7A, 0xCD3E, 0xAC81, 0xCD3F, 0xAC82, 0xCD40,\t0xAC83, 0xCD41, 0xAC84, 0xCD42, 0xAC85, 0xCD43, 0xAC86, 0xCD44,\n\t0xAC87, 0xCD45, 0xAC88, 0xCD46, 0xAC89, 0xCD47, 0xAC8A, 0xCD48,\t0xAC8B, 0xCD49, 0xAC8C, 0xCD4A, 0xAC8D, 0xCD4B, 0xAC8E, 0xCD4C,\n\t0xAC8F, 0xCD4D, 0xAC90, 0xCD4E, 0xAC91, 0xCD4F, 0xAC92, 0xCD50,\t0xAC93, 0xCD51, 0xAC94, 0xCD52, 0xAC95, 0xCD53, 0xAC96, 0xCD54,\n\t0xAC97, 0xCD55, 0xAC98, 0xCD56, 0xAC99, 0xCD57, 0xAC9A, 0xCD58,\t0xAC9B, 0xCD59, 0xAC9C, 0xCD5A, 0xAC9D, 0xCD5B, 0xAC9E, 0xCD5D,\n\t0xAC9F, 0xCD5E, 0xACA0, 0xCD5F, 0xACA1, 0x0410, 0xACA2, 0x0411,\t0xACA3, 0x0412, 0xACA4, 0x0413, 0xACA5, 0x0414, 0xACA6, 0x0415,\n\t0xACA7, 0x0401, 0xACA8, 0x0416, 0xACA9, 0x0417, 0xACAA, 0x0418,\t0xACAB, 0x0419, 0xACAC, 0x041A, 0xACAD, 0x041B, 0xACAE, 0x041C,\n\t0xACAF, 0x041D, 0xACB0, 0x041E, 0xACB1, 0x041F, 0xACB2, 0x0420,\t0xACB3, 0x0421, 0xACB4, 0x0422, 0xACB5, 0x0423, 0xACB6, 0x0424,\n\t0xACB7, 0x0425, 0xACB8, 0x0426, 0xACB9, 0x0427, 0xACBA, 0x0428,\t0xACBB, 0x0429, 0xACBC, 0x042A, 0xACBD, 0x042B, 0xACBE, 0x042C,\n\t0xACBF, 0x042D, 0xACC0, 0x042E, 0xACC1, 0x042F, 0xACD1, 0x0430,\t0xACD2, 0x0431, 0xACD3, 0x0432, 0xACD4, 0x0433, 0xACD5, 0x0434,\n\t0xACD6, 0x0435, 0xACD7, 0x0451, 0xACD8, 0x0436, 0xACD9, 0x0437,\t0xACDA, 0x0438, 0xACDB, 0x0439, 0xACDC, 0x043A, 0xACDD, 0x043B,\n\t0xACDE, 0x043C, 0xACDF, 0x043D, 0xACE0, 0x043E, 0xACE1, 0x043F,\t0xACE2, 0x0440, 0xACE3, 0x0441, 0xACE4, 0x0442, 0xACE5, 0x0443,\n\t0xACE6, 0x0444, 0xACE7, 0x0445, 0xACE8, 0x0446, 0xACE9, 0x0447,\t0xACEA, 0x0448, 0xACEB, 0x0449, 0xACEC, 0x044A, 0xACED, 0x044B,\n\t0xACEE, 0x044C, 0xACEF, 0x044D, 0xACF0, 0x044E, 0xACF1, 0x044F,\t0xAD41, 0xCD61, 0xAD42, 0xCD62, 0xAD43, 0xCD63, 0xAD44, 0xCD65,\n\t0xAD45, 0xCD66, 0xAD46, 0xCD67, 0xAD47, 0xCD68, 0xAD48, 0xCD69,\t0xAD49, 0xCD6A, 0xAD4A, 0xCD6B, 0xAD4B, 0xCD6E, 0xAD4C, 0xCD70,\n\t0xAD4D, 0xCD72, 0xAD4E, 0xCD73, 0xAD4F, 0xCD74, 0xAD50, 0xCD75,\t0xAD51, 0xCD76, 0xAD52, 0xCD77, 0xAD53, 0xCD79, 0xAD54, 0xCD7A,\n\t0xAD55, 0xCD7B, 0xAD56, 0xCD7C, 0xAD57, 0xCD7D, 0xAD58, 0xCD7E,\t0xAD59, 0xCD7F, 0xAD5A, 0xCD80, 0xAD61, 0xCD81, 0xAD62, 0xCD82,\n\t0xAD63, 0xCD83, 0xAD64, 0xCD84, 0xAD65, 0xCD85, 0xAD66, 0xCD86,\t0xAD67, 0xCD87, 0xAD68, 0xCD89, 0xAD69, 0xCD8A, 0xAD6A, 0xCD8B,\n\t0xAD6B, 0xCD8C, 0xAD6C, 0xCD8D, 0xAD6D, 0xCD8E, 0xAD6E, 0xCD8F,\t0xAD6F, 0xCD90, 0xAD70, 0xCD91, 0xAD71, 0xCD92, 0xAD72, 0xCD93,\n\t0xAD73, 0xCD96, 0xAD74, 0xCD97, 0xAD75, 0xCD99, 0xAD76, 0xCD9A,\t0xAD77, 0xCD9B, 0xAD78, 0xCD9D, 0xAD79, 0xCD9E, 0xAD7A, 0xCD9F,\n\t0xAD81, 0xCDA0, 0xAD82, 0xCDA1, 0xAD83, 0xCDA2, 0xAD84, 0xCDA3,\t0xAD85, 0xCDA6, 0xAD86, 0xCDA8, 0xAD87, 0xCDAA, 0xAD88, 0xCDAB,\n\t0xAD89, 0xCDAC, 0xAD8A, 0xCDAD, 0xAD8B, 0xCDAE, 0xAD8C, 0xCDAF,\t0xAD8D, 0xCDB1, 0xAD8E, 0xCDB2, 0xAD8F, 0xCDB3, 0xAD90, 0xCDB4,\n\t0xAD91, 0xCDB5, 0xAD92, 0xCDB6, 0xAD93, 0xCDB7, 0xAD94, 0xCDB8,\t0xAD95, 0xCDB9, 0xAD96, 0xCDBA, 0xAD97, 0xCDBB, 0xAD98, 0xCDBC,\n\t0xAD99, 0xCDBD, 0xAD9A, 0xCDBE, 0xAD9B, 0xCDBF, 0xAD9C, 0xCDC0,\t0xAD9D, 0xCDC1, 0xAD9E, 0xCDC2, 0xAD9F, 0xCDC3, 0xADA0, 0xCDC5,\n\t0xAE41, 0xCDC6, 0xAE42, 0xCDC7, 0xAE43, 0xCDC8, 0xAE44, 0xCDC9,\t0xAE45, 0xCDCA, 0xAE46, 0xCDCB, 0xAE47, 0xCDCD, 0xAE48, 0xCDCE,\n\t0xAE49, 0xCDCF, 0xAE4A, 0xCDD1, 0xAE4B, 0xCDD2, 0xAE4C, 0xCDD3,\t0xAE4D, 0xCDD4, 0xAE4E, 0xCDD5, 0xAE4F, 0xCDD6, 0xAE50, 0xCDD7,\n\t0xAE51, 0xCDD8, 0xAE52, 0xCDD9, 0xAE53, 0xCDDA, 0xAE54, 0xCDDB,\t0xAE55, 0xCDDC, 0xAE56, 0xCDDD, 0xAE57, 0xCDDE, 0xAE58, 0xCDDF,\n\t0xAE59, 0xCDE0, 0xAE5A, 0xCDE1, 0xAE61, 0xCDE2, 0xAE62, 0xCDE3,\t0xAE63, 0xCDE4, 0xAE64, 0xCDE5, 0xAE65, 0xCDE6, 0xAE66, 0xCDE7,\n\t0xAE67, 0xCDE9, 0xAE68, 0xCDEA, 0xAE69, 0xCDEB, 0xAE6A, 0xCDED,\t0xAE6B, 0xCDEE, 0xAE6C, 0xCDEF, 0xAE6D, 0xCDF1, 0xAE6E, 0xCDF2,\n\t0xAE6F, 0xCDF3, 0xAE70, 0xCDF4, 0xAE71, 0xCDF5, 0xAE72, 0xCDF6,\t0xAE73, 0xCDF7, 0xAE74, 0xCDFA, 0xAE75, 0xCDFC, 0xAE76, 0xCDFE,\n\t0xAE77, 0xCDFF, 0xAE78, 0xCE00, 0xAE79, 0xCE01, 0xAE7A, 0xCE02,\t0xAE81, 0xCE03, 0xAE82, 0xCE05, 0xAE83, 0xCE06, 0xAE84, 0xCE07,\n\t0xAE85, 0xCE09, 0xAE86, 0xCE0A, 0xAE87, 0xCE0B, 0xAE88, 0xCE0D,\t0xAE89, 0xCE0E, 0xAE8A, 0xCE0F, 0xAE8B, 0xCE10, 0xAE8C, 0xCE11,\n\t0xAE8D, 0xCE12, 0xAE8E, 0xCE13, 0xAE8F, 0xCE15, 0xAE90, 0xCE16,\t0xAE91, 0xCE17, 0xAE92, 0xCE18, 0xAE93, 0xCE1A, 0xAE94, 0xCE1B,\n\t0xAE95, 0xCE1C, 0xAE96, 0xCE1D, 0xAE97, 0xCE1E, 0xAE98, 0xCE1F,\t0xAE99, 0xCE22, 0xAE9A, 0xCE23, 0xAE9B, 0xCE25, 0xAE9C, 0xCE26,\n\t0xAE9D, 0xCE27, 0xAE9E, 0xCE29, 0xAE9F, 0xCE2A, 0xAEA0, 0xCE2B,\t0xAF41, 0xCE2C, 0xAF42, 0xCE2D, 0xAF43, 0xCE2E, 0xAF44, 0xCE2F,\n\t0xAF45, 0xCE32, 0xAF46, 0xCE34, 0xAF47, 0xCE36, 0xAF48, 0xCE37,\t0xAF49, 0xCE38, 0xAF4A, 0xCE39, 0xAF4B, 0xCE3A, 0xAF4C, 0xCE3B,\n\t0xAF4D, 0xCE3C, 0xAF4E, 0xCE3D, 0xAF4F, 0xCE3E, 0xAF50, 0xCE3F,\t0xAF51, 0xCE40, 0xAF52, 0xCE41, 0xAF53, 0xCE42, 0xAF54, 0xCE43,\n\t0xAF55, 0xCE44, 0xAF56, 0xCE45, 0xAF57, 0xCE46, 0xAF58, 0xCE47,\t0xAF59, 0xCE48, 0xAF5A, 0xCE49, 0xAF61, 0xCE4A, 0xAF62, 0xCE4B,\n\t0xAF63, 0xCE4C, 0xAF64, 0xCE4D, 0xAF65, 0xCE4E, 0xAF66, 0xCE4F,\t0xAF67, 0xCE50, 0xAF68, 0xCE51, 0xAF69, 0xCE52, 0xAF6A, 0xCE53,\n\t0xAF6B, 0xCE54, 0xAF6C, 0xCE55, 0xAF6D, 0xCE56, 0xAF6E, 0xCE57,\t0xAF6F, 0xCE5A, 0xAF70, 0xCE5B, 0xAF71, 0xCE5D, 0xAF72, 0xCE5E,\n\t0xAF73, 0xCE62, 0xAF74, 0xCE63, 0xAF75, 0xCE64, 0xAF76, 0xCE65,\t0xAF77, 0xCE66, 0xAF78, 0xCE67, 0xAF79, 0xCE6A, 0xAF7A, 0xCE6C,\n\t0xAF81, 0xCE6E, 0xAF82, 0xCE6F, 0xAF83, 0xCE70, 0xAF84, 0xCE71,\t0xAF85, 0xCE72, 0xAF86, 0xCE73, 0xAF87, 0xCE76, 0xAF88, 0xCE77,\n\t0xAF89, 0xCE79, 0xAF8A, 0xCE7A, 0xAF8B, 0xCE7B, 0xAF8C, 0xCE7D,\t0xAF8D, 0xCE7E, 0xAF8E, 0xCE7F, 0xAF8F, 0xCE80, 0xAF90, 0xCE81,\n\t0xAF91, 0xCE82, 0xAF92, 0xCE83, 0xAF93, 0xCE86, 0xAF94, 0xCE88,\t0xAF95, 0xCE8A, 0xAF96, 0xCE8B, 0xAF97, 0xCE8C, 0xAF98, 0xCE8D,\n\t0xAF99, 0xCE8E, 0xAF9A, 0xCE8F, 0xAF9B, 0xCE92, 0xAF9C, 0xCE93,\t0xAF9D, 0xCE95, 0xAF9E, 0xCE96, 0xAF9F, 0xCE97, 0xAFA0, 0xCE99,\n\t0xB041, 0xCE9A, 0xB042, 0xCE9B, 0xB043, 0xCE9C, 0xB044, 0xCE9D,\t0xB045, 0xCE9E, 0xB046, 0xCE9F, 0xB047, 0xCEA2, 0xB048, 0xCEA6,\n\t0xB049, 0xCEA7, 0xB04A, 0xCEA8, 0xB04B, 0xCEA9, 0xB04C, 0xCEAA,\t0xB04D, 0xCEAB, 0xB04E, 0xCEAE, 0xB04F, 0xCEAF, 0xB050, 0xCEB0,\n\t0xB051, 0xCEB1, 0xB052, 0xCEB2, 0xB053, 0xCEB3, 0xB054, 0xCEB4,\t0xB055, 0xCEB5, 0xB056, 0xCEB6, 0xB057, 0xCEB7, 0xB058, 0xCEB8,\n\t0xB059, 0xCEB9, 0xB05A, 0xCEBA, 0xB061, 0xCEBB, 0xB062, 0xCEBC,\t0xB063, 0xCEBD, 0xB064, 0xCEBE, 0xB065, 0xCEBF, 0xB066, 0xCEC0,\n\t0xB067, 0xCEC2, 0xB068, 0xCEC3, 0xB069, 0xCEC4, 0xB06A, 0xCEC5,\t0xB06B, 0xCEC6, 0xB06C, 0xCEC7, 0xB06D, 0xCEC8, 0xB06E, 0xCEC9,\n\t0xB06F, 0xCECA, 0xB070, 0xCECB, 0xB071, 0xCECC, 0xB072, 0xCECD,\t0xB073, 0xCECE, 0xB074, 0xCECF, 0xB075, 0xCED0, 0xB076, 0xCED1,\n\t0xB077, 0xCED2, 0xB078, 0xCED3, 0xB079, 0xCED4, 0xB07A, 0xCED5,\t0xB081, 0xCED6, 0xB082, 0xCED7, 0xB083, 0xCED8, 0xB084, 0xCED9,\n\t0xB085, 0xCEDA, 0xB086, 0xCEDB, 0xB087, 0xCEDC, 0xB088, 0xCEDD,\t0xB089, 0xCEDE, 0xB08A, 0xCEDF, 0xB08B, 0xCEE0, 0xB08C, 0xCEE1,\n\t0xB08D, 0xCEE2, 0xB08E, 0xCEE3, 0xB08F, 0xCEE6, 0xB090, 0xCEE7,\t0xB091, 0xCEE9, 0xB092, 0xCEEA, 0xB093, 0xCEED, 0xB094, 0xCEEE,\n\t0xB095, 0xCEEF, 0xB096, 0xCEF0, 0xB097, 0xCEF1, 0xB098, 0xCEF2,\t0xB099, 0xCEF3, 0xB09A, 0xCEF6, 0xB09B, 0xCEFA, 0xB09C, 0xCEFB,\n\t0xB09D, 0xCEFC, 0xB09E, 0xCEFD, 0xB09F, 0xCEFE, 0xB0A0, 0xCEFF,\t0xB0A1, 0xAC00, 0xB0A2, 0xAC01, 0xB0A3, 0xAC04, 0xB0A4, 0xAC07,\n\t0xB0A5, 0xAC08, 0xB0A6, 0xAC09, 0xB0A7, 0xAC0A, 0xB0A8, 0xAC10,\t0xB0A9, 0xAC11, 0xB0AA, 0xAC12, 0xB0AB, 0xAC13, 0xB0AC, 0xAC14,\n\t0xB0AD, 0xAC15, 0xB0AE, 0xAC16, 0xB0AF, 0xAC17, 0xB0B0, 0xAC19,\t0xB0B1, 0xAC1A, 0xB0B2, 0xAC1B, 0xB0B3, 0xAC1C, 0xB0B4, 0xAC1D,\n\t0xB0B5, 0xAC20, 0xB0B6, 0xAC24, 0xB0B7, 0xAC2C, 0xB0B8, 0xAC2D,\t0xB0B9, 0xAC2F, 0xB0BA, 0xAC30, 0xB0BB, 0xAC31, 0xB0BC, 0xAC38,\n\t0xB0BD, 0xAC39, 0xB0BE, 0xAC3C, 0xB0BF, 0xAC40, 0xB0C0, 0xAC4B,\t0xB0C1, 0xAC4D, 0xB0C2, 0xAC54, 0xB0C3, 0xAC58, 0xB0C4, 0xAC5C,\n\t0xB0C5, 0xAC70, 0xB0C6, 0xAC71, 0xB0C7, 0xAC74, 0xB0C8, 0xAC77,\t0xB0C9, 0xAC78, 0xB0CA, 0xAC7A, 0xB0CB, 0xAC80, 0xB0CC, 0xAC81,\n\t0xB0CD, 0xAC83, 0xB0CE, 0xAC84, 0xB0CF, 0xAC85, 0xB0D0, 0xAC86,\t0xB0D1, 0xAC89, 0xB0D2, 0xAC8A, 0xB0D3, 0xAC8B, 0xB0D4, 0xAC8C,\n\t0xB0D5, 0xAC90, 0xB0D6, 0xAC94, 0xB0D7, 0xAC9C, 0xB0D8, 0xAC9D,\t0xB0D9, 0xAC9F, 0xB0DA, 0xACA0, 0xB0DB, 0xACA1, 0xB0DC, 0xACA8,\n\t0xB0DD, 0xACA9, 0xB0DE, 0xACAA, 0xB0DF, 0xACAC, 0xB0E0, 0xACAF,\t0xB0E1, 0xACB0, 0xB0E2, 0xACB8, 0xB0E3, 0xACB9, 0xB0E4, 0xACBB,\n\t0xB0E5, 0xACBC, 0xB0E6, 0xACBD, 0xB0E7, 0xACC1, 0xB0E8, 0xACC4,\t0xB0E9, 0xACC8, 0xB0EA, 0xACCC, 0xB0EB, 0xACD5, 0xB0EC, 0xACD7,\n\t0xB0ED, 0xACE0, 0xB0EE, 0xACE1, 0xB0EF, 0xACE4, 0xB0F0, 0xACE7,\t0xB0F1, 0xACE8, 0xB0F2, 0xACEA, 0xB0F3, 0xACEC, 0xB0F4, 0xACEF,\n\t0xB0F5, 0xACF0, 0xB0F6, 0xACF1, 0xB0F7, 0xACF3, 0xB0F8, 0xACF5,\t0xB0F9, 0xACF6, 0xB0FA, 0xACFC, 0xB0FB, 0xACFD, 0xB0FC, 0xAD00,\n\t0xB0FD, 0xAD04, 0xB0FE, 0xAD06, 0xB141, 0xCF02, 0xB142, 0xCF03,\t0xB143, 0xCF05, 0xB144, 0xCF06, 0xB145, 0xCF07, 0xB146, 0xCF09,\n\t0xB147, 0xCF0A, 0xB148, 0xCF0B, 0xB149, 0xCF0C, 0xB14A, 0xCF0D,\t0xB14B, 0xCF0E, 0xB14C, 0xCF0F, 0xB14D, 0xCF12, 0xB14E, 0xCF14,\n\t0xB14F, 0xCF16, 0xB150, 0xCF17, 0xB151, 0xCF18, 0xB152, 0xCF19,\t0xB153, 0xCF1A, 0xB154, 0xCF1B, 0xB155, 0xCF1D, 0xB156, 0xCF1E,\n\t0xB157, 0xCF1F, 0xB158, 0xCF21, 0xB159, 0xCF22, 0xB15A, 0xCF23,\t0xB161, 0xCF25, 0xB162, 0xCF26, 0xB163, 0xCF27, 0xB164, 0xCF28,\n\t0xB165, 0xCF29, 0xB166, 0xCF2A, 0xB167, 0xCF2B, 0xB168, 0xCF2E,\t0xB169, 0xCF32, 0xB16A, 0xCF33, 0xB16B, 0xCF34, 0xB16C, 0xCF35,\n\t0xB16D, 0xCF36, 0xB16E, 0xCF37, 0xB16F, 0xCF39, 0xB170, 0xCF3A,\t0xB171, 0xCF3B, 0xB172, 0xCF3C, 0xB173, 0xCF3D, 0xB174, 0xCF3E,\n\t0xB175, 0xCF3F, 0xB176, 0xCF40, 0xB177, 0xCF41, 0xB178, 0xCF42,\t0xB179, 0xCF43, 0xB17A, 0xCF44, 0xB181, 0xCF45, 0xB182, 0xCF46,\n\t0xB183, 0xCF47, 0xB184, 0xCF48, 0xB185, 0xCF49, 0xB186, 0xCF4A,\t0xB187, 0xCF4B, 0xB188, 0xCF4C, 0xB189, 0xCF4D, 0xB18A, 0xCF4E,\n\t0xB18B, 0xCF4F, 0xB18C, 0xCF50, 0xB18D, 0xCF51, 0xB18E, 0xCF52,\t0xB18F, 0xCF53, 0xB190, 0xCF56, 0xB191, 0xCF57, 0xB192, 0xCF59,\n\t0xB193, 0xCF5A, 0xB194, 0xCF5B, 0xB195, 0xCF5D, 0xB196, 0xCF5E,\t0xB197, 0xCF5F, 0xB198, 0xCF60, 0xB199, 0xCF61, 0xB19A, 0xCF62,\n\t0xB19B, 0xCF63, 0xB19C, 0xCF66, 0xB19D, 0xCF68, 0xB19E, 0xCF6A,\t0xB19F, 0xCF6B, 0xB1A0, 0xCF6C, 0xB1A1, 0xAD0C, 0xB1A2, 0xAD0D,\n\t0xB1A3, 0xAD0F, 0xB1A4, 0xAD11, 0xB1A5, 0xAD18, 0xB1A6, 0xAD1C,\t0xB1A7, 0xAD20, 0xB1A8, 0xAD29, 0xB1A9, 0xAD2C, 0xB1AA, 0xAD2D,\n\t0xB1AB, 0xAD34, 0xB1AC, 0xAD35, 0xB1AD, 0xAD38, 0xB1AE, 0xAD3C,\t0xB1AF, 0xAD44, 0xB1B0, 0xAD45, 0xB1B1, 0xAD47, 0xB1B2, 0xAD49,\n\t0xB1B3, 0xAD50, 0xB1B4, 0xAD54, 0xB1B5, 0xAD58, 0xB1B6, 0xAD61,\t0xB1B7, 0xAD63, 0xB1B8, 0xAD6C, 0xB1B9, 0xAD6D, 0xB1BA, 0xAD70,\n\t0xB1BB, 0xAD73, 0xB1BC, 0xAD74, 0xB1BD, 0xAD75, 0xB1BE, 0xAD76,\t0xB1BF, 0xAD7B, 0xB1C0, 0xAD7C, 0xB1C1, 0xAD7D, 0xB1C2, 0xAD7F,\n\t0xB1C3, 0xAD81, 0xB1C4, 0xAD82, 0xB1C5, 0xAD88, 0xB1C6, 0xAD89,\t0xB1C7, 0xAD8C, 0xB1C8, 0xAD90, 0xB1C9, 0xAD9C, 0xB1CA, 0xAD9D,\n\t0xB1CB, 0xADA4, 0xB1CC, 0xADB7, 0xB1CD, 0xADC0, 0xB1CE, 0xADC1,\t0xB1CF, 0xADC4, 0xB1D0, 0xADC8, 0xB1D1, 0xADD0, 0xB1D2, 0xADD1,\n\t0xB1D3, 0xADD3, 0xB1D4, 0xADDC, 0xB1D5, 0xADE0, 0xB1D6, 0xADE4,\t0xB1D7, 0xADF8, 0xB1D8, 0xADF9, 0xB1D9, 0xADFC, 0xB1DA, 0xADFF,\n\t0xB1DB, 0xAE00, 0xB1DC, 0xAE01, 0xB1DD, 0xAE08, 0xB1DE, 0xAE09,\t0xB1DF, 0xAE0B, 0xB1E0, 0xAE0D, 0xB1E1, 0xAE14, 0xB1E2, 0xAE30,\n\t0xB1E3, 0xAE31, 0xB1E4, 0xAE34, 0xB1E5, 0xAE37, 0xB1E6, 0xAE38,\t0xB1E7, 0xAE3A, 0xB1E8, 0xAE40, 0xB1E9, 0xAE41, 0xB1EA, 0xAE43,\n\t0xB1EB, 0xAE45, 0xB1EC, 0xAE46, 0xB1ED, 0xAE4A, 0xB1EE, 0xAE4C,\t0xB1EF, 0xAE4D, 0xB1F0, 0xAE4E, 0xB1F1, 0xAE50, 0xB1F2, 0xAE54,\n\t0xB1F3, 0xAE56, 0xB1F4, 0xAE5C, 0xB1F5, 0xAE5D, 0xB1F6, 0xAE5F,\t0xB1F7, 0xAE60, 0xB1F8, 0xAE61, 0xB1F9, 0xAE65, 0xB1FA, 0xAE68,\n\t0xB1FB, 0xAE69, 0xB1FC, 0xAE6C, 0xB1FD, 0xAE70, 0xB1FE, 0xAE78,\t0xB241, 0xCF6D, 0xB242, 0xCF6E, 0xB243, 0xCF6F, 0xB244, 0xCF72,\n\t0xB245, 0xCF73, 0xB246, 0xCF75, 0xB247, 0xCF76, 0xB248, 0xCF77,\t0xB249, 0xCF79, 0xB24A, 0xCF7A, 0xB24B, 0xCF7B, 0xB24C, 0xCF7C,\n\t0xB24D, 0xCF7D, 0xB24E, 0xCF7E, 0xB24F, 0xCF7F, 0xB250, 0xCF81,\t0xB251, 0xCF82, 0xB252, 0xCF83, 0xB253, 0xCF84, 0xB254, 0xCF86,\n\t0xB255, 0xCF87, 0xB256, 0xCF88, 0xB257, 0xCF89, 0xB258, 0xCF8A,\t0xB259, 0xCF8B, 0xB25A, 0xCF8D, 0xB261, 0xCF8E, 0xB262, 0xCF8F,\n\t0xB263, 0xCF90, 0xB264, 0xCF91, 0xB265, 0xCF92, 0xB266, 0xCF93,\t0xB267, 0xCF94, 0xB268, 0xCF95, 0xB269, 0xCF96, 0xB26A, 0xCF97,\n\t0xB26B, 0xCF98, 0xB26C, 0xCF99, 0xB26D, 0xCF9A, 0xB26E, 0xCF9B,\t0xB26F, 0xCF9C, 0xB270, 0xCF9D, 0xB271, 0xCF9E, 0xB272, 0xCF9F,\n\t0xB273, 0xCFA0, 0xB274, 0xCFA2, 0xB275, 0xCFA3, 0xB276, 0xCFA4,\t0xB277, 0xCFA5, 0xB278, 0xCFA6, 0xB279, 0xCFA7, 0xB27A, 0xCFA9,\n\t0xB281, 0xCFAA, 0xB282, 0xCFAB, 0xB283, 0xCFAC, 0xB284, 0xCFAD,\t0xB285, 0xCFAE, 0xB286, 0xCFAF, 0xB287, 0xCFB1, 0xB288, 0xCFB2,\n\t0xB289, 0xCFB3, 0xB28A, 0xCFB4, 0xB28B, 0xCFB5, 0xB28C, 0xCFB6,\t0xB28D, 0xCFB7, 0xB28E, 0xCFB8, 0xB28F, 0xCFB9, 0xB290, 0xCFBA,\n\t0xB291, 0xCFBB, 0xB292, 0xCFBC, 0xB293, 0xCFBD, 0xB294, 0xCFBE,\t0xB295, 0xCFBF, 0xB296, 0xCFC0, 0xB297, 0xCFC1, 0xB298, 0xCFC2,\n\t0xB299, 0xCFC3, 0xB29A, 0xCFC5, 0xB29B, 0xCFC6, 0xB29C, 0xCFC7,\t0xB29D, 0xCFC8, 0xB29E, 0xCFC9, 0xB29F, 0xCFCA, 0xB2A0, 0xCFCB,\n\t0xB2A1, 0xAE79, 0xB2A2, 0xAE7B, 0xB2A3, 0xAE7C, 0xB2A4, 0xAE7D,\t0xB2A5, 0xAE84, 0xB2A6, 0xAE85, 0xB2A7, 0xAE8C, 0xB2A8, 0xAEBC,\n\t0xB2A9, 0xAEBD, 0xB2AA, 0xAEBE, 0xB2AB, 0xAEC0, 0xB2AC, 0xAEC4,\t0xB2AD, 0xAECC, 0xB2AE, 0xAECD, 0xB2AF, 0xAECF, 0xB2B0, 0xAED0,\n\t0xB2B1, 0xAED1, 0xB2B2, 0xAED8, 0xB2B3, 0xAED9, 0xB2B4, 0xAEDC,\t0xB2B5, 0xAEE8, 0xB2B6, 0xAEEB, 0xB2B7, 0xAEED, 0xB2B8, 0xAEF4,\n\t0xB2B9, 0xAEF8, 0xB2BA, 0xAEFC, 0xB2BB, 0xAF07, 0xB2BC, 0xAF08,\t0xB2BD, 0xAF0D, 0xB2BE, 0xAF10, 0xB2BF, 0xAF2C, 0xB2C0, 0xAF2D,\n\t0xB2C1, 0xAF30, 0xB2C2, 0xAF32, 0xB2C3, 0xAF34, 0xB2C4, 0xAF3C,\t0xB2C5, 0xAF3D, 0xB2C6, 0xAF3F, 0xB2C7, 0xAF41, 0xB2C8, 0xAF42,\n\t0xB2C9, 0xAF43, 0xB2CA, 0xAF48, 0xB2CB, 0xAF49, 0xB2CC, 0xAF50,\t0xB2CD, 0xAF5C, 0xB2CE, 0xAF5D, 0xB2CF, 0xAF64, 0xB2D0, 0xAF65,\n\t0xB2D1, 0xAF79, 0xB2D2, 0xAF80, 0xB2D3, 0xAF84, 0xB2D4, 0xAF88,\t0xB2D5, 0xAF90, 0xB2D6, 0xAF91, 0xB2D7, 0xAF95, 0xB2D8, 0xAF9C,\n\t0xB2D9, 0xAFB8, 0xB2DA, 0xAFB9, 0xB2DB, 0xAFBC, 0xB2DC, 0xAFC0,\t0xB2DD, 0xAFC7, 0xB2DE, 0xAFC8, 0xB2DF, 0xAFC9, 0xB2E0, 0xAFCB,\n\t0xB2E1, 0xAFCD, 0xB2E2, 0xAFCE, 0xB2E3, 0xAFD4, 0xB2E4, 0xAFDC,\t0xB2E5, 0xAFE8, 0xB2E6, 0xAFE9, 0xB2E7, 0xAFF0, 0xB2E8, 0xAFF1,\n\t0xB2E9, 0xAFF4, 0xB2EA, 0xAFF8, 0xB2EB, 0xB000, 0xB2EC, 0xB001,\t0xB2ED, 0xB004, 0xB2EE, 0xB00C, 0xB2EF, 0xB010, 0xB2F0, 0xB014,\n\t0xB2F1, 0xB01C, 0xB2F2, 0xB01D, 0xB2F3, 0xB028, 0xB2F4, 0xB044,\t0xB2F5, 0xB045, 0xB2F6, 0xB048, 0xB2F7, 0xB04A, 0xB2F8, 0xB04C,\n\t0xB2F9, 0xB04E, 0xB2FA, 0xB053, 0xB2FB, 0xB054, 0xB2FC, 0xB055,\t0xB2FD, 0xB057, 0xB2FE, 0xB059, 0xB341, 0xCFCC, 0xB342, 0xCFCD,\n\t0xB343, 0xCFCE, 0xB344, 0xCFCF, 0xB345, 0xCFD0, 0xB346, 0xCFD1,\t0xB347, 0xCFD2, 0xB348, 0xCFD3, 0xB349, 0xCFD4, 0xB34A, 0xCFD5,\n\t0xB34B, 0xCFD6, 0xB34C, 0xCFD7, 0xB34D, 0xCFD8, 0xB34E, 0xCFD9,\t0xB34F, 0xCFDA, 0xB350, 0xCFDB, 0xB351, 0xCFDC, 0xB352, 0xCFDD,\n\t0xB353, 0xCFDE, 0xB354, 0xCFDF, 0xB355, 0xCFE2, 0xB356, 0xCFE3,\t0xB357, 0xCFE5, 0xB358, 0xCFE6, 0xB359, 0xCFE7, 0xB35A, 0xCFE9,\n\t0xB361, 0xCFEA, 0xB362, 0xCFEB, 0xB363, 0xCFEC, 0xB364, 0xCFED,\t0xB365, 0xCFEE, 0xB366, 0xCFEF, 0xB367, 0xCFF2, 0xB368, 0xCFF4,\n\t0xB369, 0xCFF6, 0xB36A, 0xCFF7, 0xB36B, 0xCFF8, 0xB36C, 0xCFF9,\t0xB36D, 0xCFFA, 0xB36E, 0xCFFB, 0xB36F, 0xCFFD, 0xB370, 0xCFFE,\n\t0xB371, 0xCFFF, 0xB372, 0xD001, 0xB373, 0xD002, 0xB374, 0xD003,\t0xB375, 0xD005, 0xB376, 0xD006, 0xB377, 0xD007, 0xB378, 0xD008,\n\t0xB379, 0xD009, 0xB37A, 0xD00A, 0xB381, 0xD00B, 0xB382, 0xD00C,\t0xB383, 0xD00D, 0xB384, 0xD00E, 0xB385, 0xD00F, 0xB386, 0xD010,\n\t0xB387, 0xD012, 0xB388, 0xD013, 0xB389, 0xD014, 0xB38A, 0xD015,\t0xB38B, 0xD016, 0xB38C, 0xD017, 0xB38D, 0xD019, 0xB38E, 0xD01A,\n\t0xB38F, 0xD01B, 0xB390, 0xD01C, 0xB391, 0xD01D, 0xB392, 0xD01E,\t0xB393, 0xD01F, 0xB394, 0xD020, 0xB395, 0xD021, 0xB396, 0xD022,\n\t0xB397, 0xD023, 0xB398, 0xD024, 0xB399, 0xD025, 0xB39A, 0xD026,\t0xB39B, 0xD027, 0xB39C, 0xD028, 0xB39D, 0xD029, 0xB39E, 0xD02A,\n\t0xB39F, 0xD02B, 0xB3A0, 0xD02C, 0xB3A1, 0xB05D, 0xB3A2, 0xB07C,\t0xB3A3, 0xB07D, 0xB3A4, 0xB080, 0xB3A5, 0xB084, 0xB3A6, 0xB08C,\n\t0xB3A7, 0xB08D, 0xB3A8, 0xB08F, 0xB3A9, 0xB091, 0xB3AA, 0xB098,\t0xB3AB, 0xB099, 0xB3AC, 0xB09A, 0xB3AD, 0xB09C, 0xB3AE, 0xB09F,\n\t0xB3AF, 0xB0A0, 0xB3B0, 0xB0A1, 0xB3B1, 0xB0A2, 0xB3B2, 0xB0A8,\t0xB3B3, 0xB0A9, 0xB3B4, 0xB0AB, 0xB3B5, 0xB0AC, 0xB3B6, 0xB0AD,\n\t0xB3B7, 0xB0AE, 0xB3B8, 0xB0AF, 0xB3B9, 0xB0B1, 0xB3BA, 0xB0B3,\t0xB3BB, 0xB0B4, 0xB3BC, 0xB0B5, 0xB3BD, 0xB0B8, 0xB3BE, 0xB0BC,\n\t0xB3BF, 0xB0C4, 0xB3C0, 0xB0C5, 0xB3C1, 0xB0C7, 0xB3C2, 0xB0C8,\t0xB3C3, 0xB0C9, 0xB3C4, 0xB0D0, 0xB3C5, 0xB0D1, 0xB3C6, 0xB0D4,\n\t0xB3C7, 0xB0D8, 0xB3C8, 0xB0E0, 0xB3C9, 0xB0E5, 0xB3CA, 0xB108,\t0xB3CB, 0xB109, 0xB3CC, 0xB10B, 0xB3CD, 0xB10C, 0xB3CE, 0xB110,\n\t0xB3CF, 0xB112, 0xB3D0, 0xB113, 0xB3D1, 0xB118, 0xB3D2, 0xB119,\t0xB3D3, 0xB11B, 0xB3D4, 0xB11C, 0xB3D5, 0xB11D, 0xB3D6, 0xB123,\n\t0xB3D7, 0xB124, 0xB3D8, 0xB125, 0xB3D9, 0xB128, 0xB3DA, 0xB12C,\t0xB3DB, 0xB134, 0xB3DC, 0xB135, 0xB3DD, 0xB137, 0xB3DE, 0xB138,\n\t0xB3DF, 0xB139, 0xB3E0, 0xB140, 0xB3E1, 0xB141, 0xB3E2, 0xB144,\t0xB3E3, 0xB148, 0xB3E4, 0xB150, 0xB3E5, 0xB151, 0xB3E6, 0xB154,\n\t0xB3E7, 0xB155, 0xB3E8, 0xB158, 0xB3E9, 0xB15C, 0xB3EA, 0xB160,\t0xB3EB, 0xB178, 0xB3EC, 0xB179, 0xB3ED, 0xB17C, 0xB3EE, 0xB180,\n\t0xB3EF, 0xB182, 0xB3F0, 0xB188, 0xB3F1, 0xB189, 0xB3F2, 0xB18B,\t0xB3F3, 0xB18D, 0xB3F4, 0xB192, 0xB3F5, 0xB193, 0xB3F6, 0xB194,\n\t0xB3F7, 0xB198, 0xB3F8, 0xB19C, 0xB3F9, 0xB1A8, 0xB3FA, 0xB1CC,\t0xB3FB, 0xB1D0, 0xB3FC, 0xB1D4, 0xB3FD, 0xB1DC, 0xB3FE, 0xB1DD,\n\t0xB441, 0xD02E, 0xB442, 0xD02F, 0xB443, 0xD030, 0xB444, 0xD031,\t0xB445, 0xD032, 0xB446, 0xD033, 0xB447, 0xD036, 0xB448, 0xD037,\n\t0xB449, 0xD039, 0xB44A, 0xD03A, 0xB44B, 0xD03B, 0xB44C, 0xD03D,\t0xB44D, 0xD03E, 0xB44E, 0xD03F, 0xB44F, 0xD040, 0xB450, 0xD041,\n\t0xB451, 0xD042, 0xB452, 0xD043, 0xB453, 0xD046, 0xB454, 0xD048,\t0xB455, 0xD04A, 0xB456, 0xD04B, 0xB457, 0xD04C, 0xB458, 0xD04D,\n\t0xB459, 0xD04E, 0xB45A, 0xD04F, 0xB461, 0xD051, 0xB462, 0xD052,\t0xB463, 0xD053, 0xB464, 0xD055, 0xB465, 0xD056, 0xB466, 0xD057,\n\t0xB467, 0xD059, 0xB468, 0xD05A, 0xB469, 0xD05B, 0xB46A, 0xD05C,\t0xB46B, 0xD05D, 0xB46C, 0xD05E, 0xB46D, 0xD05F, 0xB46E, 0xD061,\n\t0xB46F, 0xD062, 0xB470, 0xD063, 0xB471, 0xD064, 0xB472, 0xD065,\t0xB473, 0xD066, 0xB474, 0xD067, 0xB475, 0xD068, 0xB476, 0xD069,\n\t0xB477, 0xD06A, 0xB478, 0xD06B, 0xB479, 0xD06E, 0xB47A, 0xD06F,\t0xB481, 0xD071, 0xB482, 0xD072, 0xB483, 0xD073, 0xB484, 0xD075,\n\t0xB485, 0xD076, 0xB486, 0xD077, 0xB487, 0xD078, 0xB488, 0xD079,\t0xB489, 0xD07A, 0xB48A, 0xD07B, 0xB48B, 0xD07E, 0xB48C, 0xD07F,\n\t0xB48D, 0xD080, 0xB48E, 0xD082, 0xB48F, 0xD083, 0xB490, 0xD084,\t0xB491, 0xD085, 0xB492, 0xD086, 0xB493, 0xD087, 0xB494, 0xD088,\n\t0xB495, 0xD089, 0xB496, 0xD08A, 0xB497, 0xD08B, 0xB498, 0xD08C,\t0xB499, 0xD08D, 0xB49A, 0xD08E, 0xB49B, 0xD08F, 0xB49C, 0xD090,\n\t0xB49D, 0xD091, 0xB49E, 0xD092, 0xB49F, 0xD093, 0xB4A0, 0xD094,\t0xB4A1, 0xB1DF, 0xB4A2, 0xB1E8, 0xB4A3, 0xB1E9, 0xB4A4, 0xB1EC,\n\t0xB4A5, 0xB1F0, 0xB4A6, 0xB1F9, 0xB4A7, 0xB1FB, 0xB4A8, 0xB1FD,\t0xB4A9, 0xB204, 0xB4AA, 0xB205, 0xB4AB, 0xB208, 0xB4AC, 0xB20B,\n\t0xB4AD, 0xB20C, 0xB4AE, 0xB214, 0xB4AF, 0xB215, 0xB4B0, 0xB217,\t0xB4B1, 0xB219, 0xB4B2, 0xB220, 0xB4B3, 0xB234, 0xB4B4, 0xB23C,\n\t0xB4B5, 0xB258, 0xB4B6, 0xB25C, 0xB4B7, 0xB260, 0xB4B8, 0xB268,\t0xB4B9, 0xB269, 0xB4BA, 0xB274, 0xB4BB, 0xB275, 0xB4BC, 0xB27C,\n\t0xB4BD, 0xB284, 0xB4BE, 0xB285, 0xB4BF, 0xB289, 0xB4C0, 0xB290,\t0xB4C1, 0xB291, 0xB4C2, 0xB294, 0xB4C3, 0xB298, 0xB4C4, 0xB299,\n\t0xB4C5, 0xB29A, 0xB4C6, 0xB2A0, 0xB4C7, 0xB2A1, 0xB4C8, 0xB2A3,\t0xB4C9, 0xB2A5, 0xB4CA, 0xB2A6, 0xB4CB, 0xB2AA, 0xB4CC, 0xB2AC,\n\t0xB4CD, 0xB2B0, 0xB4CE, 0xB2B4, 0xB4CF, 0xB2C8, 0xB4D0, 0xB2C9,\t0xB4D1, 0xB2CC, 0xB4D2, 0xB2D0, 0xB4D3, 0xB2D2, 0xB4D4, 0xB2D8,\n\t0xB4D5, 0xB2D9, 0xB4D6, 0xB2DB, 0xB4D7, 0xB2DD, 0xB4D8, 0xB2E2,\t0xB4D9, 0xB2E4, 0xB4DA, 0xB2E5, 0xB4DB, 0xB2E6, 0xB4DC, 0xB2E8,\n\t0xB4DD, 0xB2EB, 0xB4DE, 0xB2EC, 0xB4DF, 0xB2ED, 0xB4E0, 0xB2EE,\t0xB4E1, 0xB2EF, 0xB4E2, 0xB2F3, 0xB4E3, 0xB2F4, 0xB4E4, 0xB2F5,\n\t0xB4E5, 0xB2F7, 0xB4E6, 0xB2F8, 0xB4E7, 0xB2F9, 0xB4E8, 0xB2FA,\t0xB4E9, 0xB2FB, 0xB4EA, 0xB2FF, 0xB4EB, 0xB300, 0xB4EC, 0xB301,\n\t0xB4ED, 0xB304, 0xB4EE, 0xB308, 0xB4EF, 0xB310, 0xB4F0, 0xB311,\t0xB4F1, 0xB313, 0xB4F2, 0xB314, 0xB4F3, 0xB315, 0xB4F4, 0xB31C,\n\t0xB4F5, 0xB354, 0xB4F6, 0xB355, 0xB4F7, 0xB356, 0xB4F8, 0xB358,\t0xB4F9, 0xB35B, 0xB4FA, 0xB35C, 0xB4FB, 0xB35E, 0xB4FC, 0xB35F,\n\t0xB4FD, 0xB364, 0xB4FE, 0xB365, 0xB541, 0xD095, 0xB542, 0xD096,\t0xB543, 0xD097, 0xB544, 0xD098, 0xB545, 0xD099, 0xB546, 0xD09A,\n\t0xB547, 0xD09B, 0xB548, 0xD09C, 0xB549, 0xD09D, 0xB54A, 0xD09E,\t0xB54B, 0xD09F, 0xB54C, 0xD0A0, 0xB54D, 0xD0A1, 0xB54E, 0xD0A2,\n\t0xB54F, 0xD0A3, 0xB550, 0xD0A6, 0xB551, 0xD0A7, 0xB552, 0xD0A9,\t0xB553, 0xD0AA, 0xB554, 0xD0AB, 0xB555, 0xD0AD, 0xB556, 0xD0AE,\n\t0xB557, 0xD0AF, 0xB558, 0xD0B0, 0xB559, 0xD0B1, 0xB55A, 0xD0B2,\t0xB561, 0xD0B3, 0xB562, 0xD0B6, 0xB563, 0xD0B8, 0xB564, 0xD0BA,\n\t0xB565, 0xD0BB, 0xB566, 0xD0BC, 0xB567, 0xD0BD, 0xB568, 0xD0BE,\t0xB569, 0xD0BF, 0xB56A, 0xD0C2, 0xB56B, 0xD0C3, 0xB56C, 0xD0C5,\n\t0xB56D, 0xD0C6, 0xB56E, 0xD0C7, 0xB56F, 0xD0CA, 0xB570, 0xD0CB,\t0xB571, 0xD0CC, 0xB572, 0xD0CD, 0xB573, 0xD0CE, 0xB574, 0xD0CF,\n\t0xB575, 0xD0D2, 0xB576, 0xD0D6, 0xB577, 0xD0D7, 0xB578, 0xD0D8,\t0xB579, 0xD0D9, 0xB57A, 0xD0DA, 0xB581, 0xD0DB, 0xB582, 0xD0DE,\n\t0xB583, 0xD0DF, 0xB584, 0xD0E1, 0xB585, 0xD0E2, 0xB586, 0xD0E3,\t0xB587, 0xD0E5, 0xB588, 0xD0E6, 0xB589, 0xD0E7, 0xB58A, 0xD0E8,\n\t0xB58B, 0xD0E9, 0xB58C, 0xD0EA, 0xB58D, 0xD0EB, 0xB58E, 0xD0EE,\t0xB58F, 0xD0F2, 0xB590, 0xD0F3, 0xB591, 0xD0F4, 0xB592, 0xD0F5,\n\t0xB593, 0xD0F6, 0xB594, 0xD0F7, 0xB595, 0xD0F9, 0xB596, 0xD0FA,\t0xB597, 0xD0FB, 0xB598, 0xD0FC, 0xB599, 0xD0FD, 0xB59A, 0xD0FE,\n\t0xB59B, 0xD0FF, 0xB59C, 0xD100, 0xB59D, 0xD101, 0xB59E, 0xD102,\t0xB59F, 0xD103, 0xB5A0, 0xD104, 0xB5A1, 0xB367, 0xB5A2, 0xB369,\n\t0xB5A3, 0xB36B, 0xB5A4, 0xB36E, 0xB5A5, 0xB370, 0xB5A6, 0xB371,\t0xB5A7, 0xB374, 0xB5A8, 0xB378, 0xB5A9, 0xB380, 0xB5AA, 0xB381,\n\t0xB5AB, 0xB383, 0xB5AC, 0xB384, 0xB5AD, 0xB385, 0xB5AE, 0xB38C,\t0xB5AF, 0xB390, 0xB5B0, 0xB394, 0xB5B1, 0xB3A0, 0xB5B2, 0xB3A1,\n\t0xB5B3, 0xB3A8, 0xB5B4, 0xB3AC, 0xB5B5, 0xB3C4, 0xB5B6, 0xB3C5,\t0xB5B7, 0xB3C8, 0xB5B8, 0xB3CB, 0xB5B9, 0xB3CC, 0xB5BA, 0xB3CE,\n\t0xB5BB, 0xB3D0, 0xB5BC, 0xB3D4, 0xB5BD, 0xB3D5, 0xB5BE, 0xB3D7,\t0xB5BF, 0xB3D9, 0xB5C0, 0xB3DB, 0xB5C1, 0xB3DD, 0xB5C2, 0xB3E0,\n\t0xB5C3, 0xB3E4, 0xB5C4, 0xB3E8, 0xB5C5, 0xB3FC, 0xB5C6, 0xB410,\t0xB5C7, 0xB418, 0xB5C8, 0xB41C, 0xB5C9, 0xB420, 0xB5CA, 0xB428,\n\t0xB5CB, 0xB429, 0xB5CC, 0xB42B, 0xB5CD, 0xB434, 0xB5CE, 0xB450,\t0xB5CF, 0xB451, 0xB5D0, 0xB454, 0xB5D1, 0xB458, 0xB5D2, 0xB460,\n\t0xB5D3, 0xB461, 0xB5D4, 0xB463, 0xB5D5, 0xB465, 0xB5D6, 0xB46C,\t0xB5D7, 0xB480, 0xB5D8, 0xB488, 0xB5D9, 0xB49D, 0xB5DA, 0xB4A4,\n\t0xB5DB, 0xB4A8, 0xB5DC, 0xB4AC, 0xB5DD, 0xB4B5, 0xB5DE, 0xB4B7,\t0xB5DF, 0xB4B9, 0xB5E0, 0xB4C0, 0xB5E1, 0xB4C4, 0xB5E2, 0xB4C8,\n\t0xB5E3, 0xB4D0, 0xB5E4, 0xB4D5, 0xB5E5, 0xB4DC, 0xB5E6, 0xB4DD,\t0xB5E7, 0xB4E0, 0xB5E8, 0xB4E3, 0xB5E9, 0xB4E4, 0xB5EA, 0xB4E6,\n\t0xB5EB, 0xB4EC, 0xB5EC, 0xB4ED, 0xB5ED, 0xB4EF, 0xB5EE, 0xB4F1,\t0xB5EF, 0xB4F8, 0xB5F0, 0xB514, 0xB5F1, 0xB515, 0xB5F2, 0xB518,\n\t0xB5F3, 0xB51B, 0xB5F4, 0xB51C, 0xB5F5, 0xB524, 0xB5F6, 0xB525,\t0xB5F7, 0xB527, 0xB5F8, 0xB528, 0xB5F9, 0xB529, 0xB5FA, 0xB52A,\n\t0xB5FB, 0xB530, 0xB5FC, 0xB531, 0xB5FD, 0xB534, 0xB5FE, 0xB538,\t0xB641, 0xD105, 0xB642, 0xD106, 0xB643, 0xD107, 0xB644, 0xD108,\n\t0xB645, 0xD109, 0xB646, 0xD10A, 0xB647, 0xD10B, 0xB648, 0xD10C,\t0xB649, 0xD10E, 0xB64A, 0xD10F, 0xB64B, 0xD110, 0xB64C, 0xD111,\n\t0xB64D, 0xD112, 0xB64E, 0xD113, 0xB64F, 0xD114, 0xB650, 0xD115,\t0xB651, 0xD116, 0xB652, 0xD117, 0xB653, 0xD118, 0xB654, 0xD119,\n\t0xB655, 0xD11A, 0xB656, 0xD11B, 0xB657, 0xD11C, 0xB658, 0xD11D,\t0xB659, 0xD11E, 0xB65A, 0xD11F, 0xB661, 0xD120, 0xB662, 0xD121,\n\t0xB663, 0xD122, 0xB664, 0xD123, 0xB665, 0xD124, 0xB666, 0xD125,\t0xB667, 0xD126, 0xB668, 0xD127, 0xB669, 0xD128, 0xB66A, 0xD129,\n\t0xB66B, 0xD12A, 0xB66C, 0xD12B, 0xB66D, 0xD12C, 0xB66E, 0xD12D,\t0xB66F, 0xD12E, 0xB670, 0xD12F, 0xB671, 0xD132, 0xB672, 0xD133,\n\t0xB673, 0xD135, 0xB674, 0xD136, 0xB675, 0xD137, 0xB676, 0xD139,\t0xB677, 0xD13B, 0xB678, 0xD13C, 0xB679, 0xD13D, 0xB67A, 0xD13E,\n\t0xB681, 0xD13F, 0xB682, 0xD142, 0xB683, 0xD146, 0xB684, 0xD147,\t0xB685, 0xD148, 0xB686, 0xD149, 0xB687, 0xD14A, 0xB688, 0xD14B,\n\t0xB689, 0xD14E, 0xB68A, 0xD14F, 0xB68B, 0xD151, 0xB68C, 0xD152,\t0xB68D, 0xD153, 0xB68E, 0xD155, 0xB68F, 0xD156, 0xB690, 0xD157,\n\t0xB691, 0xD158, 0xB692, 0xD159, 0xB693, 0xD15A, 0xB694, 0xD15B,\t0xB695, 0xD15E, 0xB696, 0xD160, 0xB697, 0xD162, 0xB698, 0xD163,\n\t0xB699, 0xD164, 0xB69A, 0xD165, 0xB69B, 0xD166, 0xB69C, 0xD167,\t0xB69D, 0xD169, 0xB69E, 0xD16A, 0xB69F, 0xD16B, 0xB6A0, 0xD16D,\n\t0xB6A1, 0xB540, 0xB6A2, 0xB541, 0xB6A3, 0xB543, 0xB6A4, 0xB544,\t0xB6A5, 0xB545, 0xB6A6, 0xB54B, 0xB6A7, 0xB54C, 0xB6A8, 0xB54D,\n\t0xB6A9, 0xB550, 0xB6AA, 0xB554, 0xB6AB, 0xB55C, 0xB6AC, 0xB55D,\t0xB6AD, 0xB55F, 0xB6AE, 0xB560, 0xB6AF, 0xB561, 0xB6B0, 0xB5A0,\n\t0xB6B1, 0xB5A1, 0xB6B2, 0xB5A4, 0xB6B3, 0xB5A8, 0xB6B4, 0xB5AA,\t0xB6B5, 0xB5AB, 0xB6B6, 0xB5B0, 0xB6B7, 0xB5B1, 0xB6B8, 0xB5B3,\n\t0xB6B9, 0xB5B4, 0xB6BA, 0xB5B5, 0xB6BB, 0xB5BB, 0xB6BC, 0xB5BC,\t0xB6BD, 0xB5BD, 0xB6BE, 0xB5C0, 0xB6BF, 0xB5C4, 0xB6C0, 0xB5CC,\n\t0xB6C1, 0xB5CD, 0xB6C2, 0xB5CF, 0xB6C3, 0xB5D0, 0xB6C4, 0xB5D1,\t0xB6C5, 0xB5D8, 0xB6C6, 0xB5EC, 0xB6C7, 0xB610, 0xB6C8, 0xB611,\n\t0xB6C9, 0xB614, 0xB6CA, 0xB618, 0xB6CB, 0xB625, 0xB6CC, 0xB62C,\t0xB6CD, 0xB634, 0xB6CE, 0xB648, 0xB6CF, 0xB664, 0xB6D0, 0xB668,\n\t0xB6D1, 0xB69C, 0xB6D2, 0xB69D, 0xB6D3, 0xB6A0, 0xB6D4, 0xB6A4,\t0xB6D5, 0xB6AB, 0xB6D6, 0xB6AC, 0xB6D7, 0xB6B1, 0xB6D8, 0xB6D4,\n\t0xB6D9, 0xB6F0, 0xB6DA, 0xB6F4, 0xB6DB, 0xB6F8, 0xB6DC, 0xB700,\t0xB6DD, 0xB701, 0xB6DE, 0xB705, 0xB6DF, 0xB728, 0xB6E0, 0xB729,\n\t0xB6E1, 0xB72C, 0xB6E2, 0xB72F, 0xB6E3, 0xB730, 0xB6E4, 0xB738,\t0xB6E5, 0xB739, 0xB6E6, 0xB73B, 0xB6E7, 0xB744, 0xB6E8, 0xB748,\n\t0xB6E9, 0xB74C, 0xB6EA, 0xB754, 0xB6EB, 0xB755, 0xB6EC, 0xB760,\t0xB6ED, 0xB764, 0xB6EE, 0xB768, 0xB6EF, 0xB770, 0xB6F0, 0xB771,\n\t0xB6F1, 0xB773, 0xB6F2, 0xB775, 0xB6F3, 0xB77C, 0xB6F4, 0xB77D,\t0xB6F5, 0xB780, 0xB6F6, 0xB784, 0xB6F7, 0xB78C, 0xB6F8, 0xB78D,\n\t0xB6F9, 0xB78F, 0xB6FA, 0xB790, 0xB6FB, 0xB791, 0xB6FC, 0xB792,\t0xB6FD, 0xB796, 0xB6FE, 0xB797, 0xB741, 0xD16E, 0xB742, 0xD16F,\n\t0xB743, 0xD170, 0xB744, 0xD171, 0xB745, 0xD172, 0xB746, 0xD173,\t0xB747, 0xD174, 0xB748, 0xD175, 0xB749, 0xD176, 0xB74A, 0xD177,\n\t0xB74B, 0xD178, 0xB74C, 0xD179, 0xB74D, 0xD17A, 0xB74E, 0xD17B,\t0xB74F, 0xD17D, 0xB750, 0xD17E, 0xB751, 0xD17F, 0xB752, 0xD180,\n\t0xB753, 0xD181, 0xB754, 0xD182, 0xB755, 0xD183, 0xB756, 0xD185,\t0xB757, 0xD186, 0xB758, 0xD187, 0xB759, 0xD189, 0xB75A, 0xD18A,\n\t0xB761, 0xD18B, 0xB762, 0xD18C, 0xB763, 0xD18D, 0xB764, 0xD18E,\t0xB765, 0xD18F, 0xB766, 0xD190, 0xB767, 0xD191, 0xB768, 0xD192,\n\t0xB769, 0xD193, 0xB76A, 0xD194, 0xB76B, 0xD195, 0xB76C, 0xD196,\t0xB76D, 0xD197, 0xB76E, 0xD198, 0xB76F, 0xD199, 0xB770, 0xD19A,\n\t0xB771, 0xD19B, 0xB772, 0xD19C, 0xB773, 0xD19D, 0xB774, 0xD19E,\t0xB775, 0xD19F, 0xB776, 0xD1A2, 0xB777, 0xD1A3, 0xB778, 0xD1A5,\n\t0xB779, 0xD1A6, 0xB77A, 0xD1A7, 0xB781, 0xD1A9, 0xB782, 0xD1AA,\t0xB783, 0xD1AB, 0xB784, 0xD1AC, 0xB785, 0xD1AD, 0xB786, 0xD1AE,\n\t0xB787, 0xD1AF, 0xB788, 0xD1B2, 0xB789, 0xD1B4, 0xB78A, 0xD1B6,\t0xB78B, 0xD1B7, 0xB78C, 0xD1B8, 0xB78D, 0xD1B9, 0xB78E, 0xD1BB,\n\t0xB78F, 0xD1BD, 0xB790, 0xD1BE, 0xB791, 0xD1BF, 0xB792, 0xD1C1,\t0xB793, 0xD1C2, 0xB794, 0xD1C3, 0xB795, 0xD1C4, 0xB796, 0xD1C5,\n\t0xB797, 0xD1C6, 0xB798, 0xD1C7, 0xB799, 0xD1C8, 0xB79A, 0xD1C9,\t0xB79B, 0xD1CA, 0xB79C, 0xD1CB, 0xB79D, 0xD1CC, 0xB79E, 0xD1CD,\n\t0xB79F, 0xD1CE, 0xB7A0, 0xD1CF, 0xB7A1, 0xB798, 0xB7A2, 0xB799,\t0xB7A3, 0xB79C, 0xB7A4, 0xB7A0, 0xB7A5, 0xB7A8, 0xB7A6, 0xB7A9,\n\t0xB7A7, 0xB7AB, 0xB7A8, 0xB7AC, 0xB7A9, 0xB7AD, 0xB7AA, 0xB7B4,\t0xB7AB, 0xB7B5, 0xB7AC, 0xB7B8, 0xB7AD, 0xB7C7, 0xB7AE, 0xB7C9,\n\t0xB7AF, 0xB7EC, 0xB7B0, 0xB7ED, 0xB7B1, 0xB7F0, 0xB7B2, 0xB7F4,\t0xB7B3, 0xB7FC, 0xB7B4, 0xB7FD, 0xB7B5, 0xB7FF, 0xB7B6, 0xB800,\n\t0xB7B7, 0xB801, 0xB7B8, 0xB807, 0xB7B9, 0xB808, 0xB7BA, 0xB809,\t0xB7BB, 0xB80C, 0xB7BC, 0xB810, 0xB7BD, 0xB818, 0xB7BE, 0xB819,\n\t0xB7BF, 0xB81B, 0xB7C0, 0xB81D, 0xB7C1, 0xB824, 0xB7C2, 0xB825,\t0xB7C3, 0xB828, 0xB7C4, 0xB82C, 0xB7C5, 0xB834, 0xB7C6, 0xB835,\n\t0xB7C7, 0xB837, 0xB7C8, 0xB838, 0xB7C9, 0xB839, 0xB7CA, 0xB840,\t0xB7CB, 0xB844, 0xB7CC, 0xB851, 0xB7CD, 0xB853, 0xB7CE, 0xB85C,\n\t0xB7CF, 0xB85D, 0xB7D0, 0xB860, 0xB7D1, 0xB864, 0xB7D2, 0xB86C,\t0xB7D3, 0xB86D, 0xB7D4, 0xB86F, 0xB7D5, 0xB871, 0xB7D6, 0xB878,\n\t0xB7D7, 0xB87C, 0xB7D8, 0xB88D, 0xB7D9, 0xB8A8, 0xB7DA, 0xB8B0,\t0xB7DB, 0xB8B4, 0xB7DC, 0xB8B8, 0xB7DD, 0xB8C0, 0xB7DE, 0xB8C1,\n\t0xB7DF, 0xB8C3, 0xB7E0, 0xB8C5, 0xB7E1, 0xB8CC, 0xB7E2, 0xB8D0,\t0xB7E3, 0xB8D4, 0xB7E4, 0xB8DD, 0xB7E5, 0xB8DF, 0xB7E6, 0xB8E1,\n\t0xB7E7, 0xB8E8, 0xB7E8, 0xB8E9, 0xB7E9, 0xB8EC, 0xB7EA, 0xB8F0,\t0xB7EB, 0xB8F8, 0xB7EC, 0xB8F9, 0xB7ED, 0xB8FB, 0xB7EE, 0xB8FD,\n\t0xB7EF, 0xB904, 0xB7F0, 0xB918, 0xB7F1, 0xB920, 0xB7F2, 0xB93C,\t0xB7F3, 0xB93D, 0xB7F4, 0xB940, 0xB7F5, 0xB944, 0xB7F6, 0xB94C,\n\t0xB7F7, 0xB94F, 0xB7F8, 0xB951, 0xB7F9, 0xB958, 0xB7FA, 0xB959,\t0xB7FB, 0xB95C, 0xB7FC, 0xB960, 0xB7FD, 0xB968, 0xB7FE, 0xB969,\n\t0xB841, 0xD1D0, 0xB842, 0xD1D1, 0xB843, 0xD1D2, 0xB844, 0xD1D3,\t0xB845, 0xD1D4, 0xB846, 0xD1D5, 0xB847, 0xD1D6, 0xB848, 0xD1D7,\n\t0xB849, 0xD1D9, 0xB84A, 0xD1DA, 0xB84B, 0xD1DB, 0xB84C, 0xD1DC,\t0xB84D, 0xD1DD, 0xB84E, 0xD1DE, 0xB84F, 0xD1DF, 0xB850, 0xD1E0,\n\t0xB851, 0xD1E1, 0xB852, 0xD1E2, 0xB853, 0xD1E3, 0xB854, 0xD1E4,\t0xB855, 0xD1E5, 0xB856, 0xD1E6, 0xB857, 0xD1E7, 0xB858, 0xD1E8,\n\t0xB859, 0xD1E9, 0xB85A, 0xD1EA, 0xB861, 0xD1EB, 0xB862, 0xD1EC,\t0xB863, 0xD1ED, 0xB864, 0xD1EE, 0xB865, 0xD1EF, 0xB866, 0xD1F0,\n\t0xB867, 0xD1F1, 0xB868, 0xD1F2, 0xB869, 0xD1F3, 0xB86A, 0xD1F5,\t0xB86B, 0xD1F6, 0xB86C, 0xD1F7, 0xB86D, 0xD1F9, 0xB86E, 0xD1FA,\n\t0xB86F, 0xD1FB, 0xB870, 0xD1FC, 0xB871, 0xD1FD, 0xB872, 0xD1FE,\t0xB873, 0xD1FF, 0xB874, 0xD200, 0xB875, 0xD201, 0xB876, 0xD202,\n\t0xB877, 0xD203, 0xB878, 0xD204, 0xB879, 0xD205, 0xB87A, 0xD206,\t0xB881, 0xD208, 0xB882, 0xD20A, 0xB883, 0xD20B, 0xB884, 0xD20C,\n\t0xB885, 0xD20D, 0xB886, 0xD20E, 0xB887, 0xD20F, 0xB888, 0xD211,\t0xB889, 0xD212, 0xB88A, 0xD213, 0xB88B, 0xD214, 0xB88C, 0xD215,\n\t0xB88D, 0xD216, 0xB88E, 0xD217, 0xB88F, 0xD218, 0xB890, 0xD219,\t0xB891, 0xD21A, 0xB892, 0xD21B, 0xB893, 0xD21C, 0xB894, 0xD21D,\n\t0xB895, 0xD21E, 0xB896, 0xD21F, 0xB897, 0xD220, 0xB898, 0xD221,\t0xB899, 0xD222, 0xB89A, 0xD223, 0xB89B, 0xD224, 0xB89C, 0xD225,\n\t0xB89D, 0xD226, 0xB89E, 0xD227, 0xB89F, 0xD228, 0xB8A0, 0xD229,\t0xB8A1, 0xB96B, 0xB8A2, 0xB96D, 0xB8A3, 0xB974, 0xB8A4, 0xB975,\n\t0xB8A5, 0xB978, 0xB8A6, 0xB97C, 0xB8A7, 0xB984, 0xB8A8, 0xB985,\t0xB8A9, 0xB987, 0xB8AA, 0xB989, 0xB8AB, 0xB98A, 0xB8AC, 0xB98D,\n\t0xB8AD, 0xB98E, 0xB8AE, 0xB9AC, 0xB8AF, 0xB9AD, 0xB8B0, 0xB9B0,\t0xB8B1, 0xB9B4, 0xB8B2, 0xB9BC, 0xB8B3, 0xB9BD, 0xB8B4, 0xB9BF,\n\t0xB8B5, 0xB9C1, 0xB8B6, 0xB9C8, 0xB8B7, 0xB9C9, 0xB8B8, 0xB9CC,\t0xB8B9, 0xB9CE, 0xB8BA, 0xB9CF, 0xB8BB, 0xB9D0, 0xB8BC, 0xB9D1,\n\t0xB8BD, 0xB9D2, 0xB8BE, 0xB9D8, 0xB8BF, 0xB9D9, 0xB8C0, 0xB9DB,\t0xB8C1, 0xB9DD, 0xB8C2, 0xB9DE, 0xB8C3, 0xB9E1, 0xB8C4, 0xB9E3,\n\t0xB8C5, 0xB9E4, 0xB8C6, 0xB9E5, 0xB8C7, 0xB9E8, 0xB8C8, 0xB9EC,\t0xB8C9, 0xB9F4, 0xB8CA, 0xB9F5, 0xB8CB, 0xB9F7, 0xB8CC, 0xB9F8,\n\t0xB8CD, 0xB9F9, 0xB8CE, 0xB9FA, 0xB8CF, 0xBA00, 0xB8D0, 0xBA01,\t0xB8D1, 0xBA08, 0xB8D2, 0xBA15, 0xB8D3, 0xBA38, 0xB8D4, 0xBA39,\n\t0xB8D5, 0xBA3C, 0xB8D6, 0xBA40, 0xB8D7, 0xBA42, 0xB8D8, 0xBA48,\t0xB8D9, 0xBA49, 0xB8DA, 0xBA4B, 0xB8DB, 0xBA4D, 0xB8DC, 0xBA4E,\n\t0xB8DD, 0xBA53, 0xB8DE, 0xBA54, 0xB8DF, 0xBA55, 0xB8E0, 0xBA58,\t0xB8E1, 0xBA5C, 0xB8E2, 0xBA64, 0xB8E3, 0xBA65, 0xB8E4, 0xBA67,\n\t0xB8E5, 0xBA68, 0xB8E6, 0xBA69, 0xB8E7, 0xBA70, 0xB8E8, 0xBA71,\t0xB8E9, 0xBA74, 0xB8EA, 0xBA78, 0xB8EB, 0xBA83, 0xB8EC, 0xBA84,\n\t0xB8ED, 0xBA85, 0xB8EE, 0xBA87, 0xB8EF, 0xBA8C, 0xB8F0, 0xBAA8,\t0xB8F1, 0xBAA9, 0xB8F2, 0xBAAB, 0xB8F3, 0xBAAC, 0xB8F4, 0xBAB0,\n\t0xB8F5, 0xBAB2, 0xB8F6, 0xBAB8, 0xB8F7, 0xBAB9, 0xB8F8, 0xBABB,\t0xB8F9, 0xBABD, 0xB8FA, 0xBAC4, 0xB8FB, 0xBAC8, 0xB8FC, 0xBAD8,\n\t0xB8FD, 0xBAD9, 0xB8FE, 0xBAFC, 0xB941, 0xD22A, 0xB942, 0xD22B,\t0xB943, 0xD22E, 0xB944, 0xD22F, 0xB945, 0xD231, 0xB946, 0xD232,\n\t0xB947, 0xD233, 0xB948, 0xD235, 0xB949, 0xD236, 0xB94A, 0xD237,\t0xB94B, 0xD238, 0xB94C, 0xD239, 0xB94D, 0xD23A, 0xB94E, 0xD23B,\n\t0xB94F, 0xD23E, 0xB950, 0xD240, 0xB951, 0xD242, 0xB952, 0xD243,\t0xB953, 0xD244, 0xB954, 0xD245, 0xB955, 0xD246, 0xB956, 0xD247,\n\t0xB957, 0xD249, 0xB958, 0xD24A, 0xB959, 0xD24B, 0xB95A, 0xD24C,\t0xB961, 0xD24D, 0xB962, 0xD24E, 0xB963, 0xD24F, 0xB964, 0xD250,\n\t0xB965, 0xD251, 0xB966, 0xD252, 0xB967, 0xD253, 0xB968, 0xD254,\t0xB969, 0xD255, 0xB96A, 0xD256, 0xB96B, 0xD257, 0xB96C, 0xD258,\n\t0xB96D, 0xD259, 0xB96E, 0xD25A, 0xB96F, 0xD25B, 0xB970, 0xD25D,\t0xB971, 0xD25E, 0xB972, 0xD25F, 0xB973, 0xD260, 0xB974, 0xD261,\n\t0xB975, 0xD262, 0xB976, 0xD263, 0xB977, 0xD265, 0xB978, 0xD266,\t0xB979, 0xD267, 0xB97A, 0xD268, 0xB981, 0xD269, 0xB982, 0xD26A,\n\t0xB983, 0xD26B, 0xB984, 0xD26C, 0xB985, 0xD26D, 0xB986, 0xD26E,\t0xB987, 0xD26F, 0xB988, 0xD270, 0xB989, 0xD271, 0xB98A, 0xD272,\n\t0xB98B, 0xD273, 0xB98C, 0xD274, 0xB98D, 0xD275, 0xB98E, 0xD276,\t0xB98F, 0xD277, 0xB990, 0xD278, 0xB991, 0xD279, 0xB992, 0xD27A,\n\t0xB993, 0xD27B, 0xB994, 0xD27C, 0xB995, 0xD27D, 0xB996, 0xD27E,\t0xB997, 0xD27F, 0xB998, 0xD282, 0xB999, 0xD283, 0xB99A, 0xD285,\n\t0xB99B, 0xD286, 0xB99C, 0xD287, 0xB99D, 0xD289, 0xB99E, 0xD28A,\t0xB99F, 0xD28B, 0xB9A0, 0xD28C, 0xB9A1, 0xBB00, 0xB9A2, 0xBB04,\n\t0xB9A3, 0xBB0D, 0xB9A4, 0xBB0F, 0xB9A5, 0xBB11, 0xB9A6, 0xBB18,\t0xB9A7, 0xBB1C, 0xB9A8, 0xBB20, 0xB9A9, 0xBB29, 0xB9AA, 0xBB2B,\n\t0xB9AB, 0xBB34, 0xB9AC, 0xBB35, 0xB9AD, 0xBB36, 0xB9AE, 0xBB38,\t0xB9AF, 0xBB3B, 0xB9B0, 0xBB3C, 0xB9B1, 0xBB3D, 0xB9B2, 0xBB3E,\n\t0xB9B3, 0xBB44, 0xB9B4, 0xBB45, 0xB9B5, 0xBB47, 0xB9B6, 0xBB49,\t0xB9B7, 0xBB4D, 0xB9B8, 0xBB4F, 0xB9B9, 0xBB50, 0xB9BA, 0xBB54,\n\t0xB9BB, 0xBB58, 0xB9BC, 0xBB61, 0xB9BD, 0xBB63, 0xB9BE, 0xBB6C,\t0xB9BF, 0xBB88, 0xB9C0, 0xBB8C, 0xB9C1, 0xBB90, 0xB9C2, 0xBBA4,\n\t0xB9C3, 0xBBA8, 0xB9C4, 0xBBAC, 0xB9C5, 0xBBB4, 0xB9C6, 0xBBB7,\t0xB9C7, 0xBBC0, 0xB9C8, 0xBBC4, 0xB9C9, 0xBBC8, 0xB9CA, 0xBBD0,\n\t0xB9CB, 0xBBD3, 0xB9CC, 0xBBF8, 0xB9CD, 0xBBF9, 0xB9CE, 0xBBFC,\t0xB9CF, 0xBBFF, 0xB9D0, 0xBC00, 0xB9D1, 0xBC02, 0xB9D2, 0xBC08,\n\t0xB9D3, 0xBC09, 0xB9D4, 0xBC0B, 0xB9D5, 0xBC0C, 0xB9D6, 0xBC0D,\t0xB9D7, 0xBC0F, 0xB9D8, 0xBC11, 0xB9D9, 0xBC14, 0xB9DA, 0xBC15,\n\t0xB9DB, 0xBC16, 0xB9DC, 0xBC17, 0xB9DD, 0xBC18, 0xB9DE, 0xBC1B,\t0xB9DF, 0xBC1C, 0xB9E0, 0xBC1D, 0xB9E1, 0xBC1E, 0xB9E2, 0xBC1F,\n\t0xB9E3, 0xBC24, 0xB9E4, 0xBC25, 0xB9E5, 0xBC27, 0xB9E6, 0xBC29,\t0xB9E7, 0xBC2D, 0xB9E8, 0xBC30, 0xB9E9, 0xBC31, 0xB9EA, 0xBC34,\n\t0xB9EB, 0xBC38, 0xB9EC, 0xBC40, 0xB9ED, 0xBC41, 0xB9EE, 0xBC43,\t0xB9EF, 0xBC44, 0xB9F0, 0xBC45, 0xB9F1, 0xBC49, 0xB9F2, 0xBC4C,\n\t0xB9F3, 0xBC4D, 0xB9F4, 0xBC50, 0xB9F5, 0xBC5D, 0xB9F6, 0xBC84,\t0xB9F7, 0xBC85, 0xB9F8, 0xBC88, 0xB9F9, 0xBC8B, 0xB9FA, 0xBC8C,\n\t0xB9FB, 0xBC8E, 0xB9FC, 0xBC94, 0xB9FD, 0xBC95, 0xB9FE, 0xBC97,\t0xBA41, 0xD28D, 0xBA42, 0xD28E, 0xBA43, 0xD28F, 0xBA44, 0xD292,\n\t0xBA45, 0xD293, 0xBA46, 0xD294, 0xBA47, 0xD296, 0xBA48, 0xD297,\t0xBA49, 0xD298, 0xBA4A, 0xD299, 0xBA4B, 0xD29A, 0xBA4C, 0xD29B,\n\t0xBA4D, 0xD29D, 0xBA4E, 0xD29E, 0xBA4F, 0xD29F, 0xBA50, 0xD2A1,\t0xBA51, 0xD2A2, 0xBA52, 0xD2A3, 0xBA53, 0xD2A5, 0xBA54, 0xD2A6,\n\t0xBA55, 0xD2A7, 0xBA56, 0xD2A8, 0xBA57, 0xD2A9, 0xBA58, 0xD2AA,\t0xBA59, 0xD2AB, 0xBA5A, 0xD2AD, 0xBA61, 0xD2AE, 0xBA62, 0xD2AF,\n\t0xBA63, 0xD2B0, 0xBA64, 0xD2B2, 0xBA65, 0xD2B3, 0xBA66, 0xD2B4,\t0xBA67, 0xD2B5, 0xBA68, 0xD2B6, 0xBA69, 0xD2B7, 0xBA6A, 0xD2BA,\n\t0xBA6B, 0xD2BB, 0xBA6C, 0xD2BD, 0xBA6D, 0xD2BE, 0xBA6E, 0xD2C1,\t0xBA6F, 0xD2C3, 0xBA70, 0xD2C4, 0xBA71, 0xD2C5, 0xBA72, 0xD2C6,\n\t0xBA73, 0xD2C7, 0xBA74, 0xD2CA, 0xBA75, 0xD2CC, 0xBA76, 0xD2CD,\t0xBA77, 0xD2CE, 0xBA78, 0xD2CF, 0xBA79, 0xD2D0, 0xBA7A, 0xD2D1,\n\t0xBA81, 0xD2D2, 0xBA82, 0xD2D3, 0xBA83, 0xD2D5, 0xBA84, 0xD2D6,\t0xBA85, 0xD2D7, 0xBA86, 0xD2D9, 0xBA87, 0xD2DA, 0xBA88, 0xD2DB,\n\t0xBA89, 0xD2DD, 0xBA8A, 0xD2DE, 0xBA8B, 0xD2DF, 0xBA8C, 0xD2E0,\t0xBA8D, 0xD2E1, 0xBA8E, 0xD2E2, 0xBA8F, 0xD2E3, 0xBA90, 0xD2E6,\n\t0xBA91, 0xD2E7, 0xBA92, 0xD2E8, 0xBA93, 0xD2E9, 0xBA94, 0xD2EA,\t0xBA95, 0xD2EB, 0xBA96, 0xD2EC, 0xBA97, 0xD2ED, 0xBA98, 0xD2EE,\n\t0xBA99, 0xD2EF, 0xBA9A, 0xD2F2, 0xBA9B, 0xD2F3, 0xBA9C, 0xD2F5,\t0xBA9D, 0xD2F6, 0xBA9E, 0xD2F7, 0xBA9F, 0xD2F9, 0xBAA0, 0xD2FA,\n\t0xBAA1, 0xBC99, 0xBAA2, 0xBC9A, 0xBAA3, 0xBCA0, 0xBAA4, 0xBCA1,\t0xBAA5, 0xBCA4, 0xBAA6, 0xBCA7, 0xBAA7, 0xBCA8, 0xBAA8, 0xBCB0,\n\t0xBAA9, 0xBCB1, 0xBAAA, 0xBCB3, 0xBAAB, 0xBCB4, 0xBAAC, 0xBCB5,\t0xBAAD, 0xBCBC, 0xBAAE, 0xBCBD, 0xBAAF, 0xBCC0, 0xBAB0, 0xBCC4,\n\t0xBAB1, 0xBCCD, 0xBAB2, 0xBCCF, 0xBAB3, 0xBCD0, 0xBAB4, 0xBCD1,\t0xBAB5, 0xBCD5, 0xBAB6, 0xBCD8, 0xBAB7, 0xBCDC, 0xBAB8, 0xBCF4,\n\t0xBAB9, 0xBCF5, 0xBABA, 0xBCF6, 0xBABB, 0xBCF8, 0xBABC, 0xBCFC,\t0xBABD, 0xBD04, 0xBABE, 0xBD05, 0xBABF, 0xBD07, 0xBAC0, 0xBD09,\n\t0xBAC1, 0xBD10, 0xBAC2, 0xBD14, 0xBAC3, 0xBD24, 0xBAC4, 0xBD2C,\t0xBAC5, 0xBD40, 0xBAC6, 0xBD48, 0xBAC7, 0xBD49, 0xBAC8, 0xBD4C,\n\t0xBAC9, 0xBD50, 0xBACA, 0xBD58, 0xBACB, 0xBD59, 0xBACC, 0xBD64,\t0xBACD, 0xBD68, 0xBACE, 0xBD80, 0xBACF, 0xBD81, 0xBAD0, 0xBD84,\n\t0xBAD1, 0xBD87, 0xBAD2, 0xBD88, 0xBAD3, 0xBD89, 0xBAD4, 0xBD8A,\t0xBAD5, 0xBD90, 0xBAD6, 0xBD91, 0xBAD7, 0xBD93, 0xBAD8, 0xBD95,\n\t0xBAD9, 0xBD99, 0xBADA, 0xBD9A, 0xBADB, 0xBD9C, 0xBADC, 0xBDA4,\t0xBADD, 0xBDB0, 0xBADE, 0xBDB8, 0xBADF, 0xBDD4, 0xBAE0, 0xBDD5,\n\t0xBAE1, 0xBDD8, 0xBAE2, 0xBDDC, 0xBAE3, 0xBDE9, 0xBAE4, 0xBDF0,\t0xBAE5, 0xBDF4, 0xBAE6, 0xBDF8, 0xBAE7, 0xBE00, 0xBAE8, 0xBE03,\n\t0xBAE9, 0xBE05, 0xBAEA, 0xBE0C, 0xBAEB, 0xBE0D, 0xBAEC, 0xBE10,\t0xBAED, 0xBE14, 0xBAEE, 0xBE1C, 0xBAEF, 0xBE1D, 0xBAF0, 0xBE1F,\n\t0xBAF1, 0xBE44, 0xBAF2, 0xBE45, 0xBAF3, 0xBE48, 0xBAF4, 0xBE4C,\t0xBAF5, 0xBE4E, 0xBAF6, 0xBE54, 0xBAF7, 0xBE55, 0xBAF8, 0xBE57,\n\t0xBAF9, 0xBE59, 0xBAFA, 0xBE5A, 0xBAFB, 0xBE5B, 0xBAFC, 0xBE60,\t0xBAFD, 0xBE61, 0xBAFE, 0xBE64, 0xBB41, 0xD2FB, 0xBB42, 0xD2FC,\n\t0xBB43, 0xD2FD, 0xBB44, 0xD2FE, 0xBB45, 0xD2FF, 0xBB46, 0xD302,\t0xBB47, 0xD304, 0xBB48, 0xD306, 0xBB49, 0xD307, 0xBB4A, 0xD308,\n\t0xBB4B, 0xD309, 0xBB4C, 0xD30A, 0xBB4D, 0xD30B, 0xBB4E, 0xD30F,\t0xBB4F, 0xD311, 0xBB50, 0xD312, 0xBB51, 0xD313, 0xBB52, 0xD315,\n\t0xBB53, 0xD317, 0xBB54, 0xD318, 0xBB55, 0xD319, 0xBB56, 0xD31A,\t0xBB57, 0xD31B, 0xBB58, 0xD31E, 0xBB59, 0xD322, 0xBB5A, 0xD323,\n\t0xBB61, 0xD324, 0xBB62, 0xD326, 0xBB63, 0xD327, 0xBB64, 0xD32A,\t0xBB65, 0xD32B, 0xBB66, 0xD32D, 0xBB67, 0xD32E, 0xBB68, 0xD32F,\n\t0xBB69, 0xD331, 0xBB6A, 0xD332, 0xBB6B, 0xD333, 0xBB6C, 0xD334,\t0xBB6D, 0xD335, 0xBB6E, 0xD336, 0xBB6F, 0xD337, 0xBB70, 0xD33A,\n\t0xBB71, 0xD33E, 0xBB72, 0xD33F, 0xBB73, 0xD340, 0xBB74, 0xD341,\t0xBB75, 0xD342, 0xBB76, 0xD343, 0xBB77, 0xD346, 0xBB78, 0xD347,\n\t0xBB79, 0xD348, 0xBB7A, 0xD349, 0xBB81, 0xD34A, 0xBB82, 0xD34B,\t0xBB83, 0xD34C, 0xBB84, 0xD34D, 0xBB85, 0xD34E, 0xBB86, 0xD34F,\n\t0xBB87, 0xD350, 0xBB88, 0xD351, 0xBB89, 0xD352, 0xBB8A, 0xD353,\t0xBB8B, 0xD354, 0xBB8C, 0xD355, 0xBB8D, 0xD356, 0xBB8E, 0xD357,\n\t0xBB8F, 0xD358, 0xBB90, 0xD359, 0xBB91, 0xD35A, 0xBB92, 0xD35B,\t0xBB93, 0xD35C, 0xBB94, 0xD35D, 0xBB95, 0xD35E, 0xBB96, 0xD35F,\n\t0xBB97, 0xD360, 0xBB98, 0xD361, 0xBB99, 0xD362, 0xBB9A, 0xD363,\t0xBB9B, 0xD364, 0xBB9C, 0xD365, 0xBB9D, 0xD366, 0xBB9E, 0xD367,\n\t0xBB9F, 0xD368, 0xBBA0, 0xD369, 0xBBA1, 0xBE68, 0xBBA2, 0xBE6A,\t0xBBA3, 0xBE70, 0xBBA4, 0xBE71, 0xBBA5, 0xBE73, 0xBBA6, 0xBE74,\n\t0xBBA7, 0xBE75, 0xBBA8, 0xBE7B, 0xBBA9, 0xBE7C, 0xBBAA, 0xBE7D,\t0xBBAB, 0xBE80, 0xBBAC, 0xBE84, 0xBBAD, 0xBE8C, 0xBBAE, 0xBE8D,\n\t0xBBAF, 0xBE8F, 0xBBB0, 0xBE90, 0xBBB1, 0xBE91, 0xBBB2, 0xBE98,\t0xBBB3, 0xBE99, 0xBBB4, 0xBEA8, 0xBBB5, 0xBED0, 0xBBB6, 0xBED1,\n\t0xBBB7, 0xBED4, 0xBBB8, 0xBED7, 0xBBB9, 0xBED8, 0xBBBA, 0xBEE0,\t0xBBBB, 0xBEE3, 0xBBBC, 0xBEE4, 0xBBBD, 0xBEE5, 0xBBBE, 0xBEEC,\n\t0xBBBF, 0xBF01, 0xBBC0, 0xBF08, 0xBBC1, 0xBF09, 0xBBC2, 0xBF18,\t0xBBC3, 0xBF19, 0xBBC4, 0xBF1B, 0xBBC5, 0xBF1C, 0xBBC6, 0xBF1D,\n\t0xBBC7, 0xBF40, 0xBBC8, 0xBF41, 0xBBC9, 0xBF44, 0xBBCA, 0xBF48,\t0xBBCB, 0xBF50, 0xBBCC, 0xBF51, 0xBBCD, 0xBF55, 0xBBCE, 0xBF94,\n\t0xBBCF, 0xBFB0, 0xBBD0, 0xBFC5, 0xBBD1, 0xBFCC, 0xBBD2, 0xBFCD,\t0xBBD3, 0xBFD0, 0xBBD4, 0xBFD4, 0xBBD5, 0xBFDC, 0xBBD6, 0xBFDF,\n\t0xBBD7, 0xBFE1, 0xBBD8, 0xC03C, 0xBBD9, 0xC051, 0xBBDA, 0xC058,\t0xBBDB, 0xC05C, 0xBBDC, 0xC060, 0xBBDD, 0xC068, 0xBBDE, 0xC069,\n\t0xBBDF, 0xC090, 0xBBE0, 0xC091, 0xBBE1, 0xC094, 0xBBE2, 0xC098,\t0xBBE3, 0xC0A0, 0xBBE4, 0xC0A1, 0xBBE5, 0xC0A3, 0xBBE6, 0xC0A5,\n\t0xBBE7, 0xC0AC, 0xBBE8, 0xC0AD, 0xBBE9, 0xC0AF, 0xBBEA, 0xC0B0,\t0xBBEB, 0xC0B3, 0xBBEC, 0xC0B4, 0xBBED, 0xC0B5, 0xBBEE, 0xC0B6,\n\t0xBBEF, 0xC0BC, 0xBBF0, 0xC0BD, 0xBBF1, 0xC0BF, 0xBBF2, 0xC0C0,\t0xBBF3, 0xC0C1, 0xBBF4, 0xC0C5, 0xBBF5, 0xC0C8, 0xBBF6, 0xC0C9,\n\t0xBBF7, 0xC0CC, 0xBBF8, 0xC0D0, 0xBBF9, 0xC0D8, 0xBBFA, 0xC0D9,\t0xBBFB, 0xC0DB, 0xBBFC, 0xC0DC, 0xBBFD, 0xC0DD, 0xBBFE, 0xC0E4,\n\t0xBC41, 0xD36A, 0xBC42, 0xD36B, 0xBC43, 0xD36C, 0xBC44, 0xD36D,\t0xBC45, 0xD36E, 0xBC46, 0xD36F, 0xBC47, 0xD370, 0xBC48, 0xD371,\n\t0xBC49, 0xD372, 0xBC4A, 0xD373, 0xBC4B, 0xD374, 0xBC4C, 0xD375,\t0xBC4D, 0xD376, 0xBC4E, 0xD377, 0xBC4F, 0xD378, 0xBC50, 0xD379,\n\t0xBC51, 0xD37A, 0xBC52, 0xD37B, 0xBC53, 0xD37E, 0xBC54, 0xD37F,\t0xBC55, 0xD381, 0xBC56, 0xD382, 0xBC57, 0xD383, 0xBC58, 0xD385,\n\t0xBC59, 0xD386, 0xBC5A, 0xD387, 0xBC61, 0xD388, 0xBC62, 0xD389,\t0xBC63, 0xD38A, 0xBC64, 0xD38B, 0xBC65, 0xD38E, 0xBC66, 0xD392,\n\t0xBC67, 0xD393, 0xBC68, 0xD394, 0xBC69, 0xD395, 0xBC6A, 0xD396,\t0xBC6B, 0xD397, 0xBC6C, 0xD39A, 0xBC6D, 0xD39B, 0xBC6E, 0xD39D,\n\t0xBC6F, 0xD39E, 0xBC70, 0xD39F, 0xBC71, 0xD3A1, 0xBC72, 0xD3A2,\t0xBC73, 0xD3A3, 0xBC74, 0xD3A4, 0xBC75, 0xD3A5, 0xBC76, 0xD3A6,\n\t0xBC77, 0xD3A7, 0xBC78, 0xD3AA, 0xBC79, 0xD3AC, 0xBC7A, 0xD3AE,\t0xBC81, 0xD3AF, 0xBC82, 0xD3B0, 0xBC83, 0xD3B1, 0xBC84, 0xD3B2,\n\t0xBC85, 0xD3B3, 0xBC86, 0xD3B5, 0xBC87, 0xD3B6, 0xBC88, 0xD3B7,\t0xBC89, 0xD3B9, 0xBC8A, 0xD3BA, 0xBC8B, 0xD3BB, 0xBC8C, 0xD3BD,\n\t0xBC8D, 0xD3BE, 0xBC8E, 0xD3BF, 0xBC8F, 0xD3C0, 0xBC90, 0xD3C1,\t0xBC91, 0xD3C2, 0xBC92, 0xD3C3, 0xBC93, 0xD3C6, 0xBC94, 0xD3C7,\n\t0xBC95, 0xD3CA, 0xBC96, 0xD3CB, 0xBC97, 0xD3CC, 0xBC98, 0xD3CD,\t0xBC99, 0xD3CE, 0xBC9A, 0xD3CF, 0xBC9B, 0xD3D1, 0xBC9C, 0xD3D2,\n\t0xBC9D, 0xD3D3, 0xBC9E, 0xD3D4, 0xBC9F, 0xD3D5, 0xBCA0, 0xD3D6,\t0xBCA1, 0xC0E5, 0xBCA2, 0xC0E8, 0xBCA3, 0xC0EC, 0xBCA4, 0xC0F4,\n\t0xBCA5, 0xC0F5, 0xBCA6, 0xC0F7, 0xBCA7, 0xC0F9, 0xBCA8, 0xC100,\t0xBCA9, 0xC104, 0xBCAA, 0xC108, 0xBCAB, 0xC110, 0xBCAC, 0xC115,\n\t0xBCAD, 0xC11C, 0xBCAE, 0xC11D, 0xBCAF, 0xC11E, 0xBCB0, 0xC11F,\t0xBCB1, 0xC120, 0xBCB2, 0xC123, 0xBCB3, 0xC124, 0xBCB4, 0xC126,\n\t0xBCB5, 0xC127, 0xBCB6, 0xC12C, 0xBCB7, 0xC12D, 0xBCB8, 0xC12F,\t0xBCB9, 0xC130, 0xBCBA, 0xC131, 0xBCBB, 0xC136, 0xBCBC, 0xC138,\n\t0xBCBD, 0xC139, 0xBCBE, 0xC13C, 0xBCBF, 0xC140, 0xBCC0, 0xC148,\t0xBCC1, 0xC149, 0xBCC2, 0xC14B, 0xBCC3, 0xC14C, 0xBCC4, 0xC14D,\n\t0xBCC5, 0xC154, 0xBCC6, 0xC155, 0xBCC7, 0xC158, 0xBCC8, 0xC15C,\t0xBCC9, 0xC164, 0xBCCA, 0xC165, 0xBCCB, 0xC167, 0xBCCC, 0xC168,\n\t0xBCCD, 0xC169, 0xBCCE, 0xC170, 0xBCCF, 0xC174, 0xBCD0, 0xC178,\t0xBCD1, 0xC185, 0xBCD2, 0xC18C, 0xBCD3, 0xC18D, 0xBCD4, 0xC18E,\n\t0xBCD5, 0xC190, 0xBCD6, 0xC194, 0xBCD7, 0xC196, 0xBCD8, 0xC19C,\t0xBCD9, 0xC19D, 0xBCDA, 0xC19F, 0xBCDB, 0xC1A1, 0xBCDC, 0xC1A5,\n\t0xBCDD, 0xC1A8, 0xBCDE, 0xC1A9, 0xBCDF, 0xC1AC, 0xBCE0, 0xC1B0,\t0xBCE1, 0xC1BD, 0xBCE2, 0xC1C4, 0xBCE3, 0xC1C8, 0xBCE4, 0xC1CC,\n\t0xBCE5, 0xC1D4, 0xBCE6, 0xC1D7, 0xBCE7, 0xC1D8, 0xBCE8, 0xC1E0,\t0xBCE9, 0xC1E4, 0xBCEA, 0xC1E8, 0xBCEB, 0xC1F0, 0xBCEC, 0xC1F1,\n\t0xBCED, 0xC1F3, 0xBCEE, 0xC1FC, 0xBCEF, 0xC1FD, 0xBCF0, 0xC200,\t0xBCF1, 0xC204, 0xBCF2, 0xC20C, 0xBCF3, 0xC20D, 0xBCF4, 0xC20F,\n\t0xBCF5, 0xC211, 0xBCF6, 0xC218, 0xBCF7, 0xC219, 0xBCF8, 0xC21C,\t0xBCF9, 0xC21F, 0xBCFA, 0xC220, 0xBCFB, 0xC228, 0xBCFC, 0xC229,\n\t0xBCFD, 0xC22B, 0xBCFE, 0xC22D, 0xBD41, 0xD3D7, 0xBD42, 0xD3D9,\t0xBD43, 0xD3DA, 0xBD44, 0xD3DB, 0xBD45, 0xD3DC, 0xBD46, 0xD3DD,\n\t0xBD47, 0xD3DE, 0xBD48, 0xD3DF, 0xBD49, 0xD3E0, 0xBD4A, 0xD3E2,\t0xBD4B, 0xD3E4, 0xBD4C, 0xD3E5, 0xBD4D, 0xD3E6, 0xBD4E, 0xD3E7,\n\t0xBD4F, 0xD3E8, 0xBD50, 0xD3E9, 0xBD51, 0xD3EA, 0xBD52, 0xD3EB,\t0xBD53, 0xD3EE, 0xBD54, 0xD3EF, 0xBD55, 0xD3F1, 0xBD56, 0xD3F2,\n\t0xBD57, 0xD3F3, 0xBD58, 0xD3F5, 0xBD59, 0xD3F6, 0xBD5A, 0xD3F7,\t0xBD61, 0xD3F8, 0xBD62, 0xD3F9, 0xBD63, 0xD3FA, 0xBD64, 0xD3FB,\n\t0xBD65, 0xD3FE, 0xBD66, 0xD400, 0xBD67, 0xD402, 0xBD68, 0xD403,\t0xBD69, 0xD404, 0xBD6A, 0xD405, 0xBD6B, 0xD406, 0xBD6C, 0xD407,\n\t0xBD6D, 0xD409, 0xBD6E, 0xD40A, 0xBD6F, 0xD40B, 0xBD70, 0xD40C,\t0xBD71, 0xD40D, 0xBD72, 0xD40E, 0xBD73, 0xD40F, 0xBD74, 0xD410,\n\t0xBD75, 0xD411, 0xBD76, 0xD412, 0xBD77, 0xD413, 0xBD78, 0xD414,\t0xBD79, 0xD415, 0xBD7A, 0xD416, 0xBD81, 0xD417, 0xBD82, 0xD418,\n\t0xBD83, 0xD419, 0xBD84, 0xD41A, 0xBD85, 0xD41B, 0xBD86, 0xD41C,\t0xBD87, 0xD41E, 0xBD88, 0xD41F, 0xBD89, 0xD420, 0xBD8A, 0xD421,\n\t0xBD8B, 0xD422, 0xBD8C, 0xD423, 0xBD8D, 0xD424, 0xBD8E, 0xD425,\t0xBD8F, 0xD426, 0xBD90, 0xD427, 0xBD91, 0xD428, 0xBD92, 0xD429,\n\t0xBD93, 0xD42A, 0xBD94, 0xD42B, 0xBD95, 0xD42C, 0xBD96, 0xD42D,\t0xBD97, 0xD42E, 0xBD98, 0xD42F, 0xBD99, 0xD430, 0xBD9A, 0xD431,\n\t0xBD9B, 0xD432, 0xBD9C, 0xD433, 0xBD9D, 0xD434, 0xBD9E, 0xD435,\t0xBD9F, 0xD436, 0xBDA0, 0xD437, 0xBDA1, 0xC22F, 0xBDA2, 0xC231,\n\t0xBDA3, 0xC232, 0xBDA4, 0xC234, 0xBDA5, 0xC248, 0xBDA6, 0xC250,\t0xBDA7, 0xC251, 0xBDA8, 0xC254, 0xBDA9, 0xC258, 0xBDAA, 0xC260,\n\t0xBDAB, 0xC265, 0xBDAC, 0xC26C, 0xBDAD, 0xC26D, 0xBDAE, 0xC270,\t0xBDAF, 0xC274, 0xBDB0, 0xC27C, 0xBDB1, 0xC27D, 0xBDB2, 0xC27F,\n\t0xBDB3, 0xC281, 0xBDB4, 0xC288, 0xBDB5, 0xC289, 0xBDB6, 0xC290,\t0xBDB7, 0xC298, 0xBDB8, 0xC29B, 0xBDB9, 0xC29D, 0xBDBA, 0xC2A4,\n\t0xBDBB, 0xC2A5, 0xBDBC, 0xC2A8, 0xBDBD, 0xC2AC, 0xBDBE, 0xC2AD,\t0xBDBF, 0xC2B4, 0xBDC0, 0xC2B5, 0xBDC1, 0xC2B7, 0xBDC2, 0xC2B9,\n\t0xBDC3, 0xC2DC, 0xBDC4, 0xC2DD, 0xBDC5, 0xC2E0, 0xBDC6, 0xC2E3,\t0xBDC7, 0xC2E4, 0xBDC8, 0xC2EB, 0xBDC9, 0xC2EC, 0xBDCA, 0xC2ED,\n\t0xBDCB, 0xC2EF, 0xBDCC, 0xC2F1, 0xBDCD, 0xC2F6, 0xBDCE, 0xC2F8,\t0xBDCF, 0xC2F9, 0xBDD0, 0xC2FB, 0xBDD1, 0xC2FC, 0xBDD2, 0xC300,\n\t0xBDD3, 0xC308, 0xBDD4, 0xC309, 0xBDD5, 0xC30C, 0xBDD6, 0xC30D,\t0xBDD7, 0xC313, 0xBDD8, 0xC314, 0xBDD9, 0xC315, 0xBDDA, 0xC318,\n\t0xBDDB, 0xC31C, 0xBDDC, 0xC324, 0xBDDD, 0xC325, 0xBDDE, 0xC328,\t0xBDDF, 0xC329, 0xBDE0, 0xC345, 0xBDE1, 0xC368, 0xBDE2, 0xC369,\n\t0xBDE3, 0xC36C, 0xBDE4, 0xC370, 0xBDE5, 0xC372, 0xBDE6, 0xC378,\t0xBDE7, 0xC379, 0xBDE8, 0xC37C, 0xBDE9, 0xC37D, 0xBDEA, 0xC384,\n\t0xBDEB, 0xC388, 0xBDEC, 0xC38C, 0xBDED, 0xC3C0, 0xBDEE, 0xC3D8,\t0xBDEF, 0xC3D9, 0xBDF0, 0xC3DC, 0xBDF1, 0xC3DF, 0xBDF2, 0xC3E0,\n\t0xBDF3, 0xC3E2, 0xBDF4, 0xC3E8, 0xBDF5, 0xC3E9, 0xBDF6, 0xC3ED,\t0xBDF7, 0xC3F4, 0xBDF8, 0xC3F5, 0xBDF9, 0xC3F8, 0xBDFA, 0xC408,\n\t0xBDFB, 0xC410, 0xBDFC, 0xC424, 0xBDFD, 0xC42C, 0xBDFE, 0xC430,\t0xBE41, 0xD438, 0xBE42, 0xD439, 0xBE43, 0xD43A, 0xBE44, 0xD43B,\n\t0xBE45, 0xD43C, 0xBE46, 0xD43D, 0xBE47, 0xD43E, 0xBE48, 0xD43F,\t0xBE49, 0xD441, 0xBE4A, 0xD442, 0xBE4B, 0xD443, 0xBE4C, 0xD445,\n\t0xBE4D, 0xD446, 0xBE4E, 0xD447, 0xBE4F, 0xD448, 0xBE50, 0xD449,\t0xBE51, 0xD44A, 0xBE52, 0xD44B, 0xBE53, 0xD44C, 0xBE54, 0xD44D,\n\t0xBE55, 0xD44E, 0xBE56, 0xD44F, 0xBE57, 0xD450, 0xBE58, 0xD451,\t0xBE59, 0xD452, 0xBE5A, 0xD453, 0xBE61, 0xD454, 0xBE62, 0xD455,\n\t0xBE63, 0xD456, 0xBE64, 0xD457, 0xBE65, 0xD458, 0xBE66, 0xD459,\t0xBE67, 0xD45A, 0xBE68, 0xD45B, 0xBE69, 0xD45D, 0xBE6A, 0xD45E,\n\t0xBE6B, 0xD45F, 0xBE6C, 0xD461, 0xBE6D, 0xD462, 0xBE6E, 0xD463,\t0xBE6F, 0xD465, 0xBE70, 0xD466, 0xBE71, 0xD467, 0xBE72, 0xD468,\n\t0xBE73, 0xD469, 0xBE74, 0xD46A, 0xBE75, 0xD46B, 0xBE76, 0xD46C,\t0xBE77, 0xD46E, 0xBE78, 0xD470, 0xBE79, 0xD471, 0xBE7A, 0xD472,\n\t0xBE81, 0xD473, 0xBE82, 0xD474, 0xBE83, 0xD475, 0xBE84, 0xD476,\t0xBE85, 0xD477, 0xBE86, 0xD47A, 0xBE87, 0xD47B, 0xBE88, 0xD47D,\n\t0xBE89, 0xD47E, 0xBE8A, 0xD481, 0xBE8B, 0xD483, 0xBE8C, 0xD484,\t0xBE8D, 0xD485, 0xBE8E, 0xD486, 0xBE8F, 0xD487, 0xBE90, 0xD48A,\n\t0xBE91, 0xD48C, 0xBE92, 0xD48E, 0xBE93, 0xD48F, 0xBE94, 0xD490,\t0xBE95, 0xD491, 0xBE96, 0xD492, 0xBE97, 0xD493, 0xBE98, 0xD495,\n\t0xBE99, 0xD496, 0xBE9A, 0xD497, 0xBE9B, 0xD498, 0xBE9C, 0xD499,\t0xBE9D, 0xD49A, 0xBE9E, 0xD49B, 0xBE9F, 0xD49C, 0xBEA0, 0xD49D,\n\t0xBEA1, 0xC434, 0xBEA2, 0xC43C, 0xBEA3, 0xC43D, 0xBEA4, 0xC448,\t0xBEA5, 0xC464, 0xBEA6, 0xC465, 0xBEA7, 0xC468, 0xBEA8, 0xC46C,\n\t0xBEA9, 0xC474, 0xBEAA, 0xC475, 0xBEAB, 0xC479, 0xBEAC, 0xC480,\t0xBEAD, 0xC494, 0xBEAE, 0xC49C, 0xBEAF, 0xC4B8, 0xBEB0, 0xC4BC,\n\t0xBEB1, 0xC4E9, 0xBEB2, 0xC4F0, 0xBEB3, 0xC4F1, 0xBEB4, 0xC4F4,\t0xBEB5, 0xC4F8, 0xBEB6, 0xC4FA, 0xBEB7, 0xC4FF, 0xBEB8, 0xC500,\n\t0xBEB9, 0xC501, 0xBEBA, 0xC50C, 0xBEBB, 0xC510, 0xBEBC, 0xC514,\t0xBEBD, 0xC51C, 0xBEBE, 0xC528, 0xBEBF, 0xC529, 0xBEC0, 0xC52C,\n\t0xBEC1, 0xC530, 0xBEC2, 0xC538, 0xBEC3, 0xC539, 0xBEC4, 0xC53B,\t0xBEC5, 0xC53D, 0xBEC6, 0xC544, 0xBEC7, 0xC545, 0xBEC8, 0xC548,\n\t0xBEC9, 0xC549, 0xBECA, 0xC54A, 0xBECB, 0xC54C, 0xBECC, 0xC54D,\t0xBECD, 0xC54E, 0xBECE, 0xC553, 0xBECF, 0xC554, 0xBED0, 0xC555,\n\t0xBED1, 0xC557, 0xBED2, 0xC558, 0xBED3, 0xC559, 0xBED4, 0xC55D,\t0xBED5, 0xC55E, 0xBED6, 0xC560, 0xBED7, 0xC561, 0xBED8, 0xC564,\n\t0xBED9, 0xC568, 0xBEDA, 0xC570, 0xBEDB, 0xC571, 0xBEDC, 0xC573,\t0xBEDD, 0xC574, 0xBEDE, 0xC575, 0xBEDF, 0xC57C, 0xBEE0, 0xC57D,\n\t0xBEE1, 0xC580, 0xBEE2, 0xC584, 0xBEE3, 0xC587, 0xBEE4, 0xC58C,\t0xBEE5, 0xC58D, 0xBEE6, 0xC58F, 0xBEE7, 0xC591, 0xBEE8, 0xC595,\n\t0xBEE9, 0xC597, 0xBEEA, 0xC598, 0xBEEB, 0xC59C, 0xBEEC, 0xC5A0,\t0xBEED, 0xC5A9, 0xBEEE, 0xC5B4, 0xBEEF, 0xC5B5, 0xBEF0, 0xC5B8,\n\t0xBEF1, 0xC5B9, 0xBEF2, 0xC5BB, 0xBEF3, 0xC5BC, 0xBEF4, 0xC5BD,\t0xBEF5, 0xC5BE, 0xBEF6, 0xC5C4, 0xBEF7, 0xC5C5, 0xBEF8, 0xC5C6,\n\t0xBEF9, 0xC5C7, 0xBEFA, 0xC5C8, 0xBEFB, 0xC5C9, 0xBEFC, 0xC5CA,\t0xBEFD, 0xC5CC, 0xBEFE, 0xC5CE, 0xBF41, 0xD49E, 0xBF42, 0xD49F,\n\t0xBF43, 0xD4A0, 0xBF44, 0xD4A1, 0xBF45, 0xD4A2, 0xBF46, 0xD4A3,\t0xBF47, 0xD4A4, 0xBF48, 0xD4A5, 0xBF49, 0xD4A6, 0xBF4A, 0xD4A7,\n\t0xBF4B, 0xD4A8, 0xBF4C, 0xD4AA, 0xBF4D, 0xD4AB, 0xBF4E, 0xD4AC,\t0xBF4F, 0xD4AD, 0xBF50, 0xD4AE, 0xBF51, 0xD4AF, 0xBF52, 0xD4B0,\n\t0xBF53, 0xD4B1, 0xBF54, 0xD4B2, 0xBF55, 0xD4B3, 0xBF56, 0xD4B4,\t0xBF57, 0xD4B5, 0xBF58, 0xD4B6, 0xBF59, 0xD4B7, 0xBF5A, 0xD4B8,\n\t0xBF61, 0xD4B9, 0xBF62, 0xD4BA, 0xBF63, 0xD4BB, 0xBF64, 0xD4BC,\t0xBF65, 0xD4BD, 0xBF66, 0xD4BE, 0xBF67, 0xD4BF, 0xBF68, 0xD4C0,\n\t0xBF69, 0xD4C1, 0xBF6A, 0xD4C2, 0xBF6B, 0xD4C3, 0xBF6C, 0xD4C4,\t0xBF6D, 0xD4C5, 0xBF6E, 0xD4C6, 0xBF6F, 0xD4C7, 0xBF70, 0xD4C8,\n\t0xBF71, 0xD4C9, 0xBF72, 0xD4CA, 0xBF73, 0xD4CB, 0xBF74, 0xD4CD,\t0xBF75, 0xD4CE, 0xBF76, 0xD4CF, 0xBF77, 0xD4D1, 0xBF78, 0xD4D2,\n\t0xBF79, 0xD4D3, 0xBF7A, 0xD4D5, 0xBF81, 0xD4D6, 0xBF82, 0xD4D7,\t0xBF83, 0xD4D8, 0xBF84, 0xD4D9, 0xBF85, 0xD4DA, 0xBF86, 0xD4DB,\n\t0xBF87, 0xD4DD, 0xBF88, 0xD4DE, 0xBF89, 0xD4E0, 0xBF8A, 0xD4E1,\t0xBF8B, 0xD4E2, 0xBF8C, 0xD4E3, 0xBF8D, 0xD4E4, 0xBF8E, 0xD4E5,\n\t0xBF8F, 0xD4E6, 0xBF90, 0xD4E7, 0xBF91, 0xD4E9, 0xBF92, 0xD4EA,\t0xBF93, 0xD4EB, 0xBF94, 0xD4ED, 0xBF95, 0xD4EE, 0xBF96, 0xD4EF,\n\t0xBF97, 0xD4F1, 0xBF98, 0xD4F2, 0xBF99, 0xD4F3, 0xBF9A, 0xD4F4,\t0xBF9B, 0xD4F5, 0xBF9C, 0xD4F6, 0xBF9D, 0xD4F7, 0xBF9E, 0xD4F9,\n\t0xBF9F, 0xD4FA, 0xBFA0, 0xD4FC, 0xBFA1, 0xC5D0, 0xBFA2, 0xC5D1,\t0xBFA3, 0xC5D4, 0xBFA4, 0xC5D8, 0xBFA5, 0xC5E0, 0xBFA6, 0xC5E1,\n\t0xBFA7, 0xC5E3, 0xBFA8, 0xC5E5, 0xBFA9, 0xC5EC, 0xBFAA, 0xC5ED,\t0xBFAB, 0xC5EE, 0xBFAC, 0xC5F0, 0xBFAD, 0xC5F4, 0xBFAE, 0xC5F6,\n\t0xBFAF, 0xC5F7, 0xBFB0, 0xC5FC, 0xBFB1, 0xC5FD, 0xBFB2, 0xC5FE,\t0xBFB3, 0xC5FF, 0xBFB4, 0xC600, 0xBFB5, 0xC601, 0xBFB6, 0xC605,\n\t0xBFB7, 0xC606, 0xBFB8, 0xC607, 0xBFB9, 0xC608, 0xBFBA, 0xC60C,\t0xBFBB, 0xC610, 0xBFBC, 0xC618, 0xBFBD, 0xC619, 0xBFBE, 0xC61B,\n\t0xBFBF, 0xC61C, 0xBFC0, 0xC624, 0xBFC1, 0xC625, 0xBFC2, 0xC628,\t0xBFC3, 0xC62C, 0xBFC4, 0xC62D, 0xBFC5, 0xC62E, 0xBFC6, 0xC630,\n\t0xBFC7, 0xC633, 0xBFC8, 0xC634, 0xBFC9, 0xC635, 0xBFCA, 0xC637,\t0xBFCB, 0xC639, 0xBFCC, 0xC63B, 0xBFCD, 0xC640, 0xBFCE, 0xC641,\n\t0xBFCF, 0xC644, 0xBFD0, 0xC648, 0xBFD1, 0xC650, 0xBFD2, 0xC651,\t0xBFD3, 0xC653, 0xBFD4, 0xC654, 0xBFD5, 0xC655, 0xBFD6, 0xC65C,\n\t0xBFD7, 0xC65D, 0xBFD8, 0xC660, 0xBFD9, 0xC66C, 0xBFDA, 0xC66F,\t0xBFDB, 0xC671, 0xBFDC, 0xC678, 0xBFDD, 0xC679, 0xBFDE, 0xC67C,\n\t0xBFDF, 0xC680, 0xBFE0, 0xC688, 0xBFE1, 0xC689, 0xBFE2, 0xC68B,\t0xBFE3, 0xC68D, 0xBFE4, 0xC694, 0xBFE5, 0xC695, 0xBFE6, 0xC698,\n\t0xBFE7, 0xC69C, 0xBFE8, 0xC6A4, 0xBFE9, 0xC6A5, 0xBFEA, 0xC6A7,\t0xBFEB, 0xC6A9, 0xBFEC, 0xC6B0, 0xBFED, 0xC6B1, 0xBFEE, 0xC6B4,\n\t0xBFEF, 0xC6B8, 0xBFF0, 0xC6B9, 0xBFF1, 0xC6BA, 0xBFF2, 0xC6C0,\t0xBFF3, 0xC6C1, 0xBFF4, 0xC6C3, 0xBFF5, 0xC6C5, 0xBFF6, 0xC6CC,\n\t0xBFF7, 0xC6CD, 0xBFF8, 0xC6D0, 0xBFF9, 0xC6D4, 0xBFFA, 0xC6DC,\t0xBFFB, 0xC6DD, 0xBFFC, 0xC6E0, 0xBFFD, 0xC6E1, 0xBFFE, 0xC6E8,\n\t0xC041, 0xD4FE, 0xC042, 0xD4FF, 0xC043, 0xD500, 0xC044, 0xD501,\t0xC045, 0xD502, 0xC046, 0xD503, 0xC047, 0xD505, 0xC048, 0xD506,\n\t0xC049, 0xD507, 0xC04A, 0xD509, 0xC04B, 0xD50A, 0xC04C, 0xD50B,\t0xC04D, 0xD50D, 0xC04E, 0xD50E, 0xC04F, 0xD50F, 0xC050, 0xD510,\n\t0xC051, 0xD511, 0xC052, 0xD512, 0xC053, 0xD513, 0xC054, 0xD516,\t0xC055, 0xD518, 0xC056, 0xD519, 0xC057, 0xD51A, 0xC058, 0xD51B,\n\t0xC059, 0xD51C, 0xC05A, 0xD51D, 0xC061, 0xD51E, 0xC062, 0xD51F,\t0xC063, 0xD520, 0xC064, 0xD521, 0xC065, 0xD522, 0xC066, 0xD523,\n\t0xC067, 0xD524, 0xC068, 0xD525, 0xC069, 0xD526, 0xC06A, 0xD527,\t0xC06B, 0xD528, 0xC06C, 0xD529, 0xC06D, 0xD52A, 0xC06E, 0xD52B,\n\t0xC06F, 0xD52C, 0xC070, 0xD52D, 0xC071, 0xD52E, 0xC072, 0xD52F,\t0xC073, 0xD530, 0xC074, 0xD531, 0xC075, 0xD532, 0xC076, 0xD533,\n\t0xC077, 0xD534, 0xC078, 0xD535, 0xC079, 0xD536, 0xC07A, 0xD537,\t0xC081, 0xD538, 0xC082, 0xD539, 0xC083, 0xD53A, 0xC084, 0xD53B,\n\t0xC085, 0xD53E, 0xC086, 0xD53F, 0xC087, 0xD541, 0xC088, 0xD542,\t0xC089, 0xD543, 0xC08A, 0xD545, 0xC08B, 0xD546, 0xC08C, 0xD547,\n\t0xC08D, 0xD548, 0xC08E, 0xD549, 0xC08F, 0xD54A, 0xC090, 0xD54B,\t0xC091, 0xD54E, 0xC092, 0xD550, 0xC093, 0xD552, 0xC094, 0xD553,\n\t0xC095, 0xD554, 0xC096, 0xD555, 0xC097, 0xD556, 0xC098, 0xD557,\t0xC099, 0xD55A, 0xC09A, 0xD55B, 0xC09B, 0xD55D, 0xC09C, 0xD55E,\n\t0xC09D, 0xD55F, 0xC09E, 0xD561, 0xC09F, 0xD562, 0xC0A0, 0xD563,\t0xC0A1, 0xC6E9, 0xC0A2, 0xC6EC, 0xC0A3, 0xC6F0, 0xC0A4, 0xC6F8,\n\t0xC0A5, 0xC6F9, 0xC0A6, 0xC6FD, 0xC0A7, 0xC704, 0xC0A8, 0xC705,\t0xC0A9, 0xC708, 0xC0AA, 0xC70C, 0xC0AB, 0xC714, 0xC0AC, 0xC715,\n\t0xC0AD, 0xC717, 0xC0AE, 0xC719, 0xC0AF, 0xC720, 0xC0B0, 0xC721,\t0xC0B1, 0xC724, 0xC0B2, 0xC728, 0xC0B3, 0xC730, 0xC0B4, 0xC731,\n\t0xC0B5, 0xC733, 0xC0B6, 0xC735, 0xC0B7, 0xC737, 0xC0B8, 0xC73C,\t0xC0B9, 0xC73D, 0xC0BA, 0xC740, 0xC0BB, 0xC744, 0xC0BC, 0xC74A,\n\t0xC0BD, 0xC74C, 0xC0BE, 0xC74D, 0xC0BF, 0xC74F, 0xC0C0, 0xC751,\t0xC0C1, 0xC752, 0xC0C2, 0xC753, 0xC0C3, 0xC754, 0xC0C4, 0xC755,\n\t0xC0C5, 0xC756, 0xC0C6, 0xC757, 0xC0C7, 0xC758, 0xC0C8, 0xC75C,\t0xC0C9, 0xC760, 0xC0CA, 0xC768, 0xC0CB, 0xC76B, 0xC0CC, 0xC774,\n\t0xC0CD, 0xC775, 0xC0CE, 0xC778, 0xC0CF, 0xC77C, 0xC0D0, 0xC77D,\t0xC0D1, 0xC77E, 0xC0D2, 0xC783, 0xC0D3, 0xC784, 0xC0D4, 0xC785,\n\t0xC0D5, 0xC787, 0xC0D6, 0xC788, 0xC0D7, 0xC789, 0xC0D8, 0xC78A,\t0xC0D9, 0xC78E, 0xC0DA, 0xC790, 0xC0DB, 0xC791, 0xC0DC, 0xC794,\n\t0xC0DD, 0xC796, 0xC0DE, 0xC797, 0xC0DF, 0xC798, 0xC0E0, 0xC79A,\t0xC0E1, 0xC7A0, 0xC0E2, 0xC7A1, 0xC0E3, 0xC7A3, 0xC0E4, 0xC7A4,\n\t0xC0E5, 0xC7A5, 0xC0E6, 0xC7A6, 0xC0E7, 0xC7AC, 0xC0E8, 0xC7AD,\t0xC0E9, 0xC7B0, 0xC0EA, 0xC7B4, 0xC0EB, 0xC7BC, 0xC0EC, 0xC7BD,\n\t0xC0ED, 0xC7BF, 0xC0EE, 0xC7C0, 0xC0EF, 0xC7C1, 0xC0F0, 0xC7C8,\t0xC0F1, 0xC7C9, 0xC0F2, 0xC7CC, 0xC0F3, 0xC7CE, 0xC0F4, 0xC7D0,\n\t0xC0F5, 0xC7D8, 0xC0F6, 0xC7DD, 0xC0F7, 0xC7E4, 0xC0F8, 0xC7E8,\t0xC0F9, 0xC7EC, 0xC0FA, 0xC800, 0xC0FB, 0xC801, 0xC0FC, 0xC804,\n\t0xC0FD, 0xC808, 0xC0FE, 0xC80A, 0xC141, 0xD564, 0xC142, 0xD566,\t0xC143, 0xD567, 0xC144, 0xD56A, 0xC145, 0xD56C, 0xC146, 0xD56E,\n\t0xC147, 0xD56F, 0xC148, 0xD570, 0xC149, 0xD571, 0xC14A, 0xD572,\t0xC14B, 0xD573, 0xC14C, 0xD576, 0xC14D, 0xD577, 0xC14E, 0xD579,\n\t0xC14F, 0xD57A, 0xC150, 0xD57B, 0xC151, 0xD57D, 0xC152, 0xD57E,\t0xC153, 0xD57F, 0xC154, 0xD580, 0xC155, 0xD581, 0xC156, 0xD582,\n\t0xC157, 0xD583, 0xC158, 0xD586, 0xC159, 0xD58A, 0xC15A, 0xD58B,\t0xC161, 0xD58C, 0xC162, 0xD58D, 0xC163, 0xD58E, 0xC164, 0xD58F,\n\t0xC165, 0xD591, 0xC166, 0xD592, 0xC167, 0xD593, 0xC168, 0xD594,\t0xC169, 0xD595, 0xC16A, 0xD596, 0xC16B, 0xD597, 0xC16C, 0xD598,\n\t0xC16D, 0xD599, 0xC16E, 0xD59A, 0xC16F, 0xD59B, 0xC170, 0xD59C,\t0xC171, 0xD59D, 0xC172, 0xD59E, 0xC173, 0xD59F, 0xC174, 0xD5A0,\n\t0xC175, 0xD5A1, 0xC176, 0xD5A2, 0xC177, 0xD5A3, 0xC178, 0xD5A4,\t0xC179, 0xD5A6, 0xC17A, 0xD5A7, 0xC181, 0xD5A8, 0xC182, 0xD5A9,\n\t0xC183, 0xD5AA, 0xC184, 0xD5AB, 0xC185, 0xD5AC, 0xC186, 0xD5AD,\t0xC187, 0xD5AE, 0xC188, 0xD5AF, 0xC189, 0xD5B0, 0xC18A, 0xD5B1,\n\t0xC18B, 0xD5B2, 0xC18C, 0xD5B3, 0xC18D, 0xD5B4, 0xC18E, 0xD5B5,\t0xC18F, 0xD5B6, 0xC190, 0xD5B7, 0xC191, 0xD5B8, 0xC192, 0xD5B9,\n\t0xC193, 0xD5BA, 0xC194, 0xD5BB, 0xC195, 0xD5BC, 0xC196, 0xD5BD,\t0xC197, 0xD5BE, 0xC198, 0xD5BF, 0xC199, 0xD5C0, 0xC19A, 0xD5C1,\n\t0xC19B, 0xD5C2, 0xC19C, 0xD5C3, 0xC19D, 0xD5C4, 0xC19E, 0xD5C5,\t0xC19F, 0xD5C6, 0xC1A0, 0xD5C7, 0xC1A1, 0xC810, 0xC1A2, 0xC811,\n\t0xC1A3, 0xC813, 0xC1A4, 0xC815, 0xC1A5, 0xC816, 0xC1A6, 0xC81C,\t0xC1A7, 0xC81D, 0xC1A8, 0xC820, 0xC1A9, 0xC824, 0xC1AA, 0xC82C,\n\t0xC1AB, 0xC82D, 0xC1AC, 0xC82F, 0xC1AD, 0xC831, 0xC1AE, 0xC838,\t0xC1AF, 0xC83C, 0xC1B0, 0xC840, 0xC1B1, 0xC848, 0xC1B2, 0xC849,\n\t0xC1B3, 0xC84C, 0xC1B4, 0xC84D, 0xC1B5, 0xC854, 0xC1B6, 0xC870,\t0xC1B7, 0xC871, 0xC1B8, 0xC874, 0xC1B9, 0xC878, 0xC1BA, 0xC87A,\n\t0xC1BB, 0xC880, 0xC1BC, 0xC881, 0xC1BD, 0xC883, 0xC1BE, 0xC885,\t0xC1BF, 0xC886, 0xC1C0, 0xC887, 0xC1C1, 0xC88B, 0xC1C2, 0xC88C,\n\t0xC1C3, 0xC88D, 0xC1C4, 0xC894, 0xC1C5, 0xC89D, 0xC1C6, 0xC89F,\t0xC1C7, 0xC8A1, 0xC1C8, 0xC8A8, 0xC1C9, 0xC8BC, 0xC1CA, 0xC8BD,\n\t0xC1CB, 0xC8C4, 0xC1CC, 0xC8C8, 0xC1CD, 0xC8CC, 0xC1CE, 0xC8D4,\t0xC1CF, 0xC8D5, 0xC1D0, 0xC8D7, 0xC1D1, 0xC8D9, 0xC1D2, 0xC8E0,\n\t0xC1D3, 0xC8E1, 0xC1D4, 0xC8E4, 0xC1D5, 0xC8F5, 0xC1D6, 0xC8FC,\t0xC1D7, 0xC8FD, 0xC1D8, 0xC900, 0xC1D9, 0xC904, 0xC1DA, 0xC905,\n\t0xC1DB, 0xC906, 0xC1DC, 0xC90C, 0xC1DD, 0xC90D, 0xC1DE, 0xC90F,\t0xC1DF, 0xC911, 0xC1E0, 0xC918, 0xC1E1, 0xC92C, 0xC1E2, 0xC934,\n\t0xC1E3, 0xC950, 0xC1E4, 0xC951, 0xC1E5, 0xC954, 0xC1E6, 0xC958,\t0xC1E7, 0xC960, 0xC1E8, 0xC961, 0xC1E9, 0xC963, 0xC1EA, 0xC96C,\n\t0xC1EB, 0xC970, 0xC1EC, 0xC974, 0xC1ED, 0xC97C, 0xC1EE, 0xC988,\t0xC1EF, 0xC989, 0xC1F0, 0xC98C, 0xC1F1, 0xC990, 0xC1F2, 0xC998,\n\t0xC1F3, 0xC999, 0xC1F4, 0xC99B, 0xC1F5, 0xC99D, 0xC1F6, 0xC9C0,\t0xC1F7, 0xC9C1, 0xC1F8, 0xC9C4, 0xC1F9, 0xC9C7, 0xC1FA, 0xC9C8,\n\t0xC1FB, 0xC9CA, 0xC1FC, 0xC9D0, 0xC1FD, 0xC9D1, 0xC1FE, 0xC9D3,\t0xC241, 0xD5CA, 0xC242, 0xD5CB, 0xC243, 0xD5CD, 0xC244, 0xD5CE,\n\t0xC245, 0xD5CF, 0xC246, 0xD5D1, 0xC247, 0xD5D3, 0xC248, 0xD5D4,\t0xC249, 0xD5D5, 0xC24A, 0xD5D6, 0xC24B, 0xD5D7, 0xC24C, 0xD5DA,\n\t0xC24D, 0xD5DC, 0xC24E, 0xD5DE, 0xC24F, 0xD5DF, 0xC250, 0xD5E0,\t0xC251, 0xD5E1, 0xC252, 0xD5E2, 0xC253, 0xD5E3, 0xC254, 0xD5E6,\n\t0xC255, 0xD5E7, 0xC256, 0xD5E9, 0xC257, 0xD5EA, 0xC258, 0xD5EB,\t0xC259, 0xD5ED, 0xC25A, 0xD5EE, 0xC261, 0xD5EF, 0xC262, 0xD5F0,\n\t0xC263, 0xD5F1, 0xC264, 0xD5F2, 0xC265, 0xD5F3, 0xC266, 0xD5F6,\t0xC267, 0xD5F8, 0xC268, 0xD5FA, 0xC269, 0xD5FB, 0xC26A, 0xD5FC,\n\t0xC26B, 0xD5FD, 0xC26C, 0xD5FE, 0xC26D, 0xD5FF, 0xC26E, 0xD602,\t0xC26F, 0xD603, 0xC270, 0xD605, 0xC271, 0xD606, 0xC272, 0xD607,\n\t0xC273, 0xD609, 0xC274, 0xD60A, 0xC275, 0xD60B, 0xC276, 0xD60C,\t0xC277, 0xD60D, 0xC278, 0xD60E, 0xC279, 0xD60F, 0xC27A, 0xD612,\n\t0xC281, 0xD616, 0xC282, 0xD617, 0xC283, 0xD618, 0xC284, 0xD619,\t0xC285, 0xD61A, 0xC286, 0xD61B, 0xC287, 0xD61D, 0xC288, 0xD61E,\n\t0xC289, 0xD61F, 0xC28A, 0xD621, 0xC28B, 0xD622, 0xC28C, 0xD623,\t0xC28D, 0xD625, 0xC28E, 0xD626, 0xC28F, 0xD627, 0xC290, 0xD628,\n\t0xC291, 0xD629, 0xC292, 0xD62A, 0xC293, 0xD62B, 0xC294, 0xD62C,\t0xC295, 0xD62E, 0xC296, 0xD62F, 0xC297, 0xD630, 0xC298, 0xD631,\n\t0xC299, 0xD632, 0xC29A, 0xD633, 0xC29B, 0xD634, 0xC29C, 0xD635,\t0xC29D, 0xD636, 0xC29E, 0xD637, 0xC29F, 0xD63A, 0xC2A0, 0xD63B,\n\t0xC2A1, 0xC9D5, 0xC2A2, 0xC9D6, 0xC2A3, 0xC9D9, 0xC2A4, 0xC9DA,\t0xC2A5, 0xC9DC, 0xC2A6, 0xC9DD, 0xC2A7, 0xC9E0, 0xC2A8, 0xC9E2,\n\t0xC2A9, 0xC9E4, 0xC2AA, 0xC9E7, 0xC2AB, 0xC9EC, 0xC2AC, 0xC9ED,\t0xC2AD, 0xC9EF, 0xC2AE, 0xC9F0, 0xC2AF, 0xC9F1, 0xC2B0, 0xC9F8,\n\t0xC2B1, 0xC9F9, 0xC2B2, 0xC9FC, 0xC2B3, 0xCA00, 0xC2B4, 0xCA08,\t0xC2B5, 0xCA09, 0xC2B6, 0xCA0B, 0xC2B7, 0xCA0C, 0xC2B8, 0xCA0D,\n\t0xC2B9, 0xCA14, 0xC2BA, 0xCA18, 0xC2BB, 0xCA29, 0xC2BC, 0xCA4C,\t0xC2BD, 0xCA4D, 0xC2BE, 0xCA50, 0xC2BF, 0xCA54, 0xC2C0, 0xCA5C,\n\t0xC2C1, 0xCA5D, 0xC2C2, 0xCA5F, 0xC2C3, 0xCA60, 0xC2C4, 0xCA61,\t0xC2C5, 0xCA68, 0xC2C6, 0xCA7D, 0xC2C7, 0xCA84, 0xC2C8, 0xCA98,\n\t0xC2C9, 0xCABC, 0xC2CA, 0xCABD, 0xC2CB, 0xCAC0, 0xC2CC, 0xCAC4,\t0xC2CD, 0xCACC, 0xC2CE, 0xCACD, 0xC2CF, 0xCACF, 0xC2D0, 0xCAD1,\n\t0xC2D1, 0xCAD3, 0xC2D2, 0xCAD8, 0xC2D3, 0xCAD9, 0xC2D4, 0xCAE0,\t0xC2D5, 0xCAEC, 0xC2D6, 0xCAF4, 0xC2D7, 0xCB08, 0xC2D8, 0xCB10,\n\t0xC2D9, 0xCB14, 0xC2DA, 0xCB18, 0xC2DB, 0xCB20, 0xC2DC, 0xCB21,\t0xC2DD, 0xCB41, 0xC2DE, 0xCB48, 0xC2DF, 0xCB49, 0xC2E0, 0xCB4C,\n\t0xC2E1, 0xCB50, 0xC2E2, 0xCB58, 0xC2E3, 0xCB59, 0xC2E4, 0xCB5D,\t0xC2E5, 0xCB64, 0xC2E6, 0xCB78, 0xC2E7, 0xCB79, 0xC2E8, 0xCB9C,\n\t0xC2E9, 0xCBB8, 0xC2EA, 0xCBD4, 0xC2EB, 0xCBE4, 0xC2EC, 0xCBE7,\t0xC2ED, 0xCBE9, 0xC2EE, 0xCC0C, 0xC2EF, 0xCC0D, 0xC2F0, 0xCC10,\n\t0xC2F1, 0xCC14, 0xC2F2, 0xCC1C, 0xC2F3, 0xCC1D, 0xC2F4, 0xCC21,\t0xC2F5, 0xCC22, 0xC2F6, 0xCC27, 0xC2F7, 0xCC28, 0xC2F8, 0xCC29,\n\t0xC2F9, 0xCC2C, 0xC2FA, 0xCC2E, 0xC2FB, 0xCC30, 0xC2FC, 0xCC38,\t0xC2FD, 0xCC39, 0xC2FE, 0xCC3B, 0xC341, 0xD63D, 0xC342, 0xD63E,\n\t0xC343, 0xD63F, 0xC344, 0xD641, 0xC345, 0xD642, 0xC346, 0xD643,\t0xC347, 0xD644, 0xC348, 0xD646, 0xC349, 0xD647, 0xC34A, 0xD64A,\n\t0xC34B, 0xD64C, 0xC34C, 0xD64E, 0xC34D, 0xD64F, 0xC34E, 0xD650,\t0xC34F, 0xD652, 0xC350, 0xD653, 0xC351, 0xD656, 0xC352, 0xD657,\n\t0xC353, 0xD659, 0xC354, 0xD65A, 0xC355, 0xD65B, 0xC356, 0xD65D,\t0xC357, 0xD65E, 0xC358, 0xD65F, 0xC359, 0xD660, 0xC35A, 0xD661,\n\t0xC361, 0xD662, 0xC362, 0xD663, 0xC363, 0xD664, 0xC364, 0xD665,\t0xC365, 0xD666, 0xC366, 0xD668, 0xC367, 0xD66A, 0xC368, 0xD66B,\n\t0xC369, 0xD66C, 0xC36A, 0xD66D, 0xC36B, 0xD66E, 0xC36C, 0xD66F,\t0xC36D, 0xD672, 0xC36E, 0xD673, 0xC36F, 0xD675, 0xC370, 0xD676,\n\t0xC371, 0xD677, 0xC372, 0xD678, 0xC373, 0xD679, 0xC374, 0xD67A,\t0xC375, 0xD67B, 0xC376, 0xD67C, 0xC377, 0xD67D, 0xC378, 0xD67E,\n\t0xC379, 0xD67F, 0xC37A, 0xD680, 0xC381, 0xD681, 0xC382, 0xD682,\t0xC383, 0xD684, 0xC384, 0xD686, 0xC385, 0xD687, 0xC386, 0xD688,\n\t0xC387, 0xD689, 0xC388, 0xD68A, 0xC389, 0xD68B, 0xC38A, 0xD68E,\t0xC38B, 0xD68F, 0xC38C, 0xD691, 0xC38D, 0xD692, 0xC38E, 0xD693,\n\t0xC38F, 0xD695, 0xC390, 0xD696, 0xC391, 0xD697, 0xC392, 0xD698,\t0xC393, 0xD699, 0xC394, 0xD69A, 0xC395, 0xD69B, 0xC396, 0xD69C,\n\t0xC397, 0xD69E, 0xC398, 0xD6A0, 0xC399, 0xD6A2, 0xC39A, 0xD6A3,\t0xC39B, 0xD6A4, 0xC39C, 0xD6A5, 0xC39D, 0xD6A6, 0xC39E, 0xD6A7,\n\t0xC39F, 0xD6A9, 0xC3A0, 0xD6AA, 0xC3A1, 0xCC3C, 0xC3A2, 0xCC3D,\t0xC3A3, 0xCC3E, 0xC3A4, 0xCC44, 0xC3A5, 0xCC45, 0xC3A6, 0xCC48,\n\t0xC3A7, 0xCC4C, 0xC3A8, 0xCC54, 0xC3A9, 0xCC55, 0xC3AA, 0xCC57,\t0xC3AB, 0xCC58, 0xC3AC, 0xCC59, 0xC3AD, 0xCC60, 0xC3AE, 0xCC64,\n\t0xC3AF, 0xCC66, 0xC3B0, 0xCC68, 0xC3B1, 0xCC70, 0xC3B2, 0xCC75,\t0xC3B3, 0xCC98, 0xC3B4, 0xCC99, 0xC3B5, 0xCC9C, 0xC3B6, 0xCCA0,\n\t0xC3B7, 0xCCA8, 0xC3B8, 0xCCA9, 0xC3B9, 0xCCAB, 0xC3BA, 0xCCAC,\t0xC3BB, 0xCCAD, 0xC3BC, 0xCCB4, 0xC3BD, 0xCCB5, 0xC3BE, 0xCCB8,\n\t0xC3BF, 0xCCBC, 0xC3C0, 0xCCC4, 0xC3C1, 0xCCC5, 0xC3C2, 0xCCC7,\t0xC3C3, 0xCCC9, 0xC3C4, 0xCCD0, 0xC3C5, 0xCCD4, 0xC3C6, 0xCCE4,\n\t0xC3C7, 0xCCEC, 0xC3C8, 0xCCF0, 0xC3C9, 0xCD01, 0xC3CA, 0xCD08,\t0xC3CB, 0xCD09, 0xC3CC, 0xCD0C, 0xC3CD, 0xCD10, 0xC3CE, 0xCD18,\n\t0xC3CF, 0xCD19, 0xC3D0, 0xCD1B, 0xC3D1, 0xCD1D, 0xC3D2, 0xCD24,\t0xC3D3, 0xCD28, 0xC3D4, 0xCD2C, 0xC3D5, 0xCD39, 0xC3D6, 0xCD5C,\n\t0xC3D7, 0xCD60, 0xC3D8, 0xCD64, 0xC3D9, 0xCD6C, 0xC3DA, 0xCD6D,\t0xC3DB, 0xCD6F, 0xC3DC, 0xCD71, 0xC3DD, 0xCD78, 0xC3DE, 0xCD88,\n\t0xC3DF, 0xCD94, 0xC3E0, 0xCD95, 0xC3E1, 0xCD98, 0xC3E2, 0xCD9C,\t0xC3E3, 0xCDA4, 0xC3E4, 0xCDA5, 0xC3E5, 0xCDA7, 0xC3E6, 0xCDA9,\n\t0xC3E7, 0xCDB0, 0xC3E8, 0xCDC4, 0xC3E9, 0xCDCC, 0xC3EA, 0xCDD0,\t0xC3EB, 0xCDE8, 0xC3EC, 0xCDEC, 0xC3ED, 0xCDF0, 0xC3EE, 0xCDF8,\n\t0xC3EF, 0xCDF9, 0xC3F0, 0xCDFB, 0xC3F1, 0xCDFD, 0xC3F2, 0xCE04,\t0xC3F3, 0xCE08, 0xC3F4, 0xCE0C, 0xC3F5, 0xCE14, 0xC3F6, 0xCE19,\n\t0xC3F7, 0xCE20, 0xC3F8, 0xCE21, 0xC3F9, 0xCE24, 0xC3FA, 0xCE28,\t0xC3FB, 0xCE30, 0xC3FC, 0xCE31, 0xC3FD, 0xCE33, 0xC3FE, 0xCE35,\n\t0xC441, 0xD6AB, 0xC442, 0xD6AD, 0xC443, 0xD6AE, 0xC444, 0xD6AF,\t0xC445, 0xD6B1, 0xC446, 0xD6B2, 0xC447, 0xD6B3, 0xC448, 0xD6B4,\n\t0xC449, 0xD6B5, 0xC44A, 0xD6B6, 0xC44B, 0xD6B7, 0xC44C, 0xD6B8,\t0xC44D, 0xD6BA, 0xC44E, 0xD6BC, 0xC44F, 0xD6BD, 0xC450, 0xD6BE,\n\t0xC451, 0xD6BF, 0xC452, 0xD6C0, 0xC453, 0xD6C1, 0xC454, 0xD6C2,\t0xC455, 0xD6C3, 0xC456, 0xD6C6, 0xC457, 0xD6C7, 0xC458, 0xD6C9,\n\t0xC459, 0xD6CA, 0xC45A, 0xD6CB, 0xC461, 0xD6CD, 0xC462, 0xD6CE,\t0xC463, 0xD6CF, 0xC464, 0xD6D0, 0xC465, 0xD6D2, 0xC466, 0xD6D3,\n\t0xC467, 0xD6D5, 0xC468, 0xD6D6, 0xC469, 0xD6D8, 0xC46A, 0xD6DA,\t0xC46B, 0xD6DB, 0xC46C, 0xD6DC, 0xC46D, 0xD6DD, 0xC46E, 0xD6DE,\n\t0xC46F, 0xD6DF, 0xC470, 0xD6E1, 0xC471, 0xD6E2, 0xC472, 0xD6E3,\t0xC473, 0xD6E5, 0xC474, 0xD6E6, 0xC475, 0xD6E7, 0xC476, 0xD6E9,\n\t0xC477, 0xD6EA, 0xC478, 0xD6EB, 0xC479, 0xD6EC, 0xC47A, 0xD6ED,\t0xC481, 0xD6EE, 0xC482, 0xD6EF, 0xC483, 0xD6F1, 0xC484, 0xD6F2,\n\t0xC485, 0xD6F3, 0xC486, 0xD6F4, 0xC487, 0xD6F6, 0xC488, 0xD6F7,\t0xC489, 0xD6F8, 0xC48A, 0xD6F9, 0xC48B, 0xD6FA, 0xC48C, 0xD6FB,\n\t0xC48D, 0xD6FE, 0xC48E, 0xD6FF, 0xC48F, 0xD701, 0xC490, 0xD702,\t0xC491, 0xD703, 0xC492, 0xD705, 0xC493, 0xD706, 0xC494, 0xD707,\n\t0xC495, 0xD708, 0xC496, 0xD709, 0xC497, 0xD70A, 0xC498, 0xD70B,\t0xC499, 0xD70C, 0xC49A, 0xD70D, 0xC49B, 0xD70E, 0xC49C, 0xD70F,\n\t0xC49D, 0xD710, 0xC49E, 0xD712, 0xC49F, 0xD713, 0xC4A0, 0xD714,\t0xC4A1, 0xCE58, 0xC4A2, 0xCE59, 0xC4A3, 0xCE5C, 0xC4A4, 0xCE5F,\n\t0xC4A5, 0xCE60, 0xC4A6, 0xCE61, 0xC4A7, 0xCE68, 0xC4A8, 0xCE69,\t0xC4A9, 0xCE6B, 0xC4AA, 0xCE6D, 0xC4AB, 0xCE74, 0xC4AC, 0xCE75,\n\t0xC4AD, 0xCE78, 0xC4AE, 0xCE7C, 0xC4AF, 0xCE84, 0xC4B0, 0xCE85,\t0xC4B1, 0xCE87, 0xC4B2, 0xCE89, 0xC4B3, 0xCE90, 0xC4B4, 0xCE91,\n\t0xC4B5, 0xCE94, 0xC4B6, 0xCE98, 0xC4B7, 0xCEA0, 0xC4B8, 0xCEA1,\t0xC4B9, 0xCEA3, 0xC4BA, 0xCEA4, 0xC4BB, 0xCEA5, 0xC4BC, 0xCEAC,\n\t0xC4BD, 0xCEAD, 0xC4BE, 0xCEC1, 0xC4BF, 0xCEE4, 0xC4C0, 0xCEE5,\t0xC4C1, 0xCEE8, 0xC4C2, 0xCEEB, 0xC4C3, 0xCEEC, 0xC4C4, 0xCEF4,\n\t0xC4C5, 0xCEF5, 0xC4C6, 0xCEF7, 0xC4C7, 0xCEF8, 0xC4C8, 0xCEF9,\t0xC4C9, 0xCF00, 0xC4CA, 0xCF01, 0xC4CB, 0xCF04, 0xC4CC, 0xCF08,\n\t0xC4CD, 0xCF10, 0xC4CE, 0xCF11, 0xC4CF, 0xCF13, 0xC4D0, 0xCF15,\t0xC4D1, 0xCF1C, 0xC4D2, 0xCF20, 0xC4D3, 0xCF24, 0xC4D4, 0xCF2C,\n\t0xC4D5, 0xCF2D, 0xC4D6, 0xCF2F, 0xC4D7, 0xCF30, 0xC4D8, 0xCF31,\t0xC4D9, 0xCF38, 0xC4DA, 0xCF54, 0xC4DB, 0xCF55, 0xC4DC, 0xCF58,\n\t0xC4DD, 0xCF5C, 0xC4DE, 0xCF64, 0xC4DF, 0xCF65, 0xC4E0, 0xCF67,\t0xC4E1, 0xCF69, 0xC4E2, 0xCF70, 0xC4E3, 0xCF71, 0xC4E4, 0xCF74,\n\t0xC4E5, 0xCF78, 0xC4E6, 0xCF80, 0xC4E7, 0xCF85, 0xC4E8, 0xCF8C,\t0xC4E9, 0xCFA1, 0xC4EA, 0xCFA8, 0xC4EB, 0xCFB0, 0xC4EC, 0xCFC4,\n\t0xC4ED, 0xCFE0, 0xC4EE, 0xCFE1, 0xC4EF, 0xCFE4, 0xC4F0, 0xCFE8,\t0xC4F1, 0xCFF0, 0xC4F2, 0xCFF1, 0xC4F3, 0xCFF3, 0xC4F4, 0xCFF5,\n\t0xC4F5, 0xCFFC, 0xC4F6, 0xD000, 0xC4F7, 0xD004, 0xC4F8, 0xD011,\t0xC4F9, 0xD018, 0xC4FA, 0xD02D, 0xC4FB, 0xD034, 0xC4FC, 0xD035,\n\t0xC4FD, 0xD038, 0xC4FE, 0xD03C, 0xC541, 0xD715, 0xC542, 0xD716,\t0xC543, 0xD717, 0xC544, 0xD71A, 0xC545, 0xD71B, 0xC546, 0xD71D,\n\t0xC547, 0xD71E, 0xC548, 0xD71F, 0xC549, 0xD721, 0xC54A, 0xD722,\t0xC54B, 0xD723, 0xC54C, 0xD724, 0xC54D, 0xD725, 0xC54E, 0xD726,\n\t0xC54F, 0xD727, 0xC550, 0xD72A, 0xC551, 0xD72C, 0xC552, 0xD72E,\t0xC553, 0xD72F, 0xC554, 0xD730, 0xC555, 0xD731, 0xC556, 0xD732,\n\t0xC557, 0xD733, 0xC558, 0xD736, 0xC559, 0xD737, 0xC55A, 0xD739,\t0xC561, 0xD73A, 0xC562, 0xD73B, 0xC563, 0xD73D, 0xC564, 0xD73E,\n\t0xC565, 0xD73F, 0xC566, 0xD740, 0xC567, 0xD741, 0xC568, 0xD742,\t0xC569, 0xD743, 0xC56A, 0xD745, 0xC56B, 0xD746, 0xC56C, 0xD748,\n\t0xC56D, 0xD74A, 0xC56E, 0xD74B, 0xC56F, 0xD74C, 0xC570, 0xD74D,\t0xC571, 0xD74E, 0xC572, 0xD74F, 0xC573, 0xD752, 0xC574, 0xD753,\n\t0xC575, 0xD755, 0xC576, 0xD75A, 0xC577, 0xD75B, 0xC578, 0xD75C,\t0xC579, 0xD75D, 0xC57A, 0xD75E, 0xC581, 0xD75F, 0xC582, 0xD762,\n\t0xC583, 0xD764, 0xC584, 0xD766, 0xC585, 0xD767, 0xC586, 0xD768,\t0xC587, 0xD76A, 0xC588, 0xD76B, 0xC589, 0xD76D, 0xC58A, 0xD76E,\n\t0xC58B, 0xD76F, 0xC58C, 0xD771, 0xC58D, 0xD772, 0xC58E, 0xD773,\t0xC58F, 0xD775, 0xC590, 0xD776, 0xC591, 0xD777, 0xC592, 0xD778,\n\t0xC593, 0xD779, 0xC594, 0xD77A, 0xC595, 0xD77B, 0xC596, 0xD77E,\t0xC597, 0xD77F, 0xC598, 0xD780, 0xC599, 0xD782, 0xC59A, 0xD783,\n\t0xC59B, 0xD784, 0xC59C, 0xD785, 0xC59D, 0xD786, 0xC59E, 0xD787,\t0xC59F, 0xD78A, 0xC5A0, 0xD78B, 0xC5A1, 0xD044, 0xC5A2, 0xD045,\n\t0xC5A3, 0xD047, 0xC5A4, 0xD049, 0xC5A5, 0xD050, 0xC5A6, 0xD054,\t0xC5A7, 0xD058, 0xC5A8, 0xD060, 0xC5A9, 0xD06C, 0xC5AA, 0xD06D,\n\t0xC5AB, 0xD070, 0xC5AC, 0xD074, 0xC5AD, 0xD07C, 0xC5AE, 0xD07D,\t0xC5AF, 0xD081, 0xC5B0, 0xD0A4, 0xC5B1, 0xD0A5, 0xC5B2, 0xD0A8,\n\t0xC5B3, 0xD0AC, 0xC5B4, 0xD0B4, 0xC5B5, 0xD0B5, 0xC5B6, 0xD0B7,\t0xC5B7, 0xD0B9, 0xC5B8, 0xD0C0, 0xC5B9, 0xD0C1, 0xC5BA, 0xD0C4,\n\t0xC5BB, 0xD0C8, 0xC5BC, 0xD0C9, 0xC5BD, 0xD0D0, 0xC5BE, 0xD0D1,\t0xC5BF, 0xD0D3, 0xC5C0, 0xD0D4, 0xC5C1, 0xD0D5, 0xC5C2, 0xD0DC,\n\t0xC5C3, 0xD0DD, 0xC5C4, 0xD0E0, 0xC5C5, 0xD0E4, 0xC5C6, 0xD0EC,\t0xC5C7, 0xD0ED, 0xC5C8, 0xD0EF, 0xC5C9, 0xD0F0, 0xC5CA, 0xD0F1,\n\t0xC5CB, 0xD0F8, 0xC5CC, 0xD10D, 0xC5CD, 0xD130, 0xC5CE, 0xD131,\t0xC5CF, 0xD134, 0xC5D0, 0xD138, 0xC5D1, 0xD13A, 0xC5D2, 0xD140,\n\t0xC5D3, 0xD141, 0xC5D4, 0xD143, 0xC5D5, 0xD144, 0xC5D6, 0xD145,\t0xC5D7, 0xD14C, 0xC5D8, 0xD14D, 0xC5D9, 0xD150, 0xC5DA, 0xD154,\n\t0xC5DB, 0xD15C, 0xC5DC, 0xD15D, 0xC5DD, 0xD15F, 0xC5DE, 0xD161,\t0xC5DF, 0xD168, 0xC5E0, 0xD16C, 0xC5E1, 0xD17C, 0xC5E2, 0xD184,\n\t0xC5E3, 0xD188, 0xC5E4, 0xD1A0, 0xC5E5, 0xD1A1, 0xC5E6, 0xD1A4,\t0xC5E7, 0xD1A8, 0xC5E8, 0xD1B0, 0xC5E9, 0xD1B1, 0xC5EA, 0xD1B3,\n\t0xC5EB, 0xD1B5, 0xC5EC, 0xD1BA, 0xC5ED, 0xD1BC, 0xC5EE, 0xD1C0,\t0xC5EF, 0xD1D8, 0xC5F0, 0xD1F4, 0xC5F1, 0xD1F8, 0xC5F2, 0xD207,\n\t0xC5F3, 0xD209, 0xC5F4, 0xD210, 0xC5F5, 0xD22C, 0xC5F6, 0xD22D,\t0xC5F7, 0xD230, 0xC5F8, 0xD234, 0xC5F9, 0xD23C, 0xC5FA, 0xD23D,\n\t0xC5FB, 0xD23F, 0xC5FC, 0xD241, 0xC5FD, 0xD248, 0xC5FE, 0xD25C,\t0xC641, 0xD78D, 0xC642, 0xD78E, 0xC643, 0xD78F, 0xC644, 0xD791,\n\t0xC645, 0xD792, 0xC646, 0xD793, 0xC647, 0xD794, 0xC648, 0xD795,\t0xC649, 0xD796, 0xC64A, 0xD797, 0xC64B, 0xD79A, 0xC64C, 0xD79C,\n\t0xC64D, 0xD79E, 0xC64E, 0xD79F, 0xC64F, 0xD7A0, 0xC650, 0xD7A1,\t0xC651, 0xD7A2, 0xC652, 0xD7A3, 0xC6A1, 0xD264, 0xC6A2, 0xD280,\n\t0xC6A3, 0xD281, 0xC6A4, 0xD284, 0xC6A5, 0xD288, 0xC6A6, 0xD290,\t0xC6A7, 0xD291, 0xC6A8, 0xD295, 0xC6A9, 0xD29C, 0xC6AA, 0xD2A0,\n\t0xC6AB, 0xD2A4, 0xC6AC, 0xD2AC, 0xC6AD, 0xD2B1, 0xC6AE, 0xD2B8,\t0xC6AF, 0xD2B9, 0xC6B0, 0xD2BC, 0xC6B1, 0xD2BF, 0xC6B2, 0xD2C0,\n\t0xC6B3, 0xD2C2, 0xC6B4, 0xD2C8, 0xC6B5, 0xD2C9, 0xC6B6, 0xD2CB,\t0xC6B7, 0xD2D4, 0xC6B8, 0xD2D8, 0xC6B9, 0xD2DC, 0xC6BA, 0xD2E4,\n\t0xC6BB, 0xD2E5, 0xC6BC, 0xD2F0, 0xC6BD, 0xD2F1, 0xC6BE, 0xD2F4,\t0xC6BF, 0xD2F8, 0xC6C0, 0xD300, 0xC6C1, 0xD301, 0xC6C2, 0xD303,\n\t0xC6C3, 0xD305, 0xC6C4, 0xD30C, 0xC6C5, 0xD30D, 0xC6C6, 0xD30E,\t0xC6C7, 0xD310, 0xC6C8, 0xD314, 0xC6C9, 0xD316, 0xC6CA, 0xD31C,\n\t0xC6CB, 0xD31D, 0xC6CC, 0xD31F, 0xC6CD, 0xD320, 0xC6CE, 0xD321,\t0xC6CF, 0xD325, 0xC6D0, 0xD328, 0xC6D1, 0xD329, 0xC6D2, 0xD32C,\n\t0xC6D3, 0xD330, 0xC6D4, 0xD338, 0xC6D5, 0xD339, 0xC6D6, 0xD33B,\t0xC6D7, 0xD33C, 0xC6D8, 0xD33D, 0xC6D9, 0xD344, 0xC6DA, 0xD345,\n\t0xC6DB, 0xD37C, 0xC6DC, 0xD37D, 0xC6DD, 0xD380, 0xC6DE, 0xD384,\t0xC6DF, 0xD38C, 0xC6E0, 0xD38D, 0xC6E1, 0xD38F, 0xC6E2, 0xD390,\n\t0xC6E3, 0xD391, 0xC6E4, 0xD398, 0xC6E5, 0xD399, 0xC6E6, 0xD39C,\t0xC6E7, 0xD3A0, 0xC6E8, 0xD3A8, 0xC6E9, 0xD3A9, 0xC6EA, 0xD3AB,\n\t0xC6EB, 0xD3AD, 0xC6EC, 0xD3B4, 0xC6ED, 0xD3B8, 0xC6EE, 0xD3BC,\t0xC6EF, 0xD3C4, 0xC6F0, 0xD3C5, 0xC6F1, 0xD3C8, 0xC6F2, 0xD3C9,\n\t0xC6F3, 0xD3D0, 0xC6F4, 0xD3D8, 0xC6F5, 0xD3E1, 0xC6F6, 0xD3E3,\t0xC6F7, 0xD3EC, 0xC6F8, 0xD3ED, 0xC6F9, 0xD3F0, 0xC6FA, 0xD3F4,\n\t0xC6FB, 0xD3FC, 0xC6FC, 0xD3FD, 0xC6FD, 0xD3FF, 0xC6FE, 0xD401,\t0xC7A1, 0xD408, 0xC7A2, 0xD41D, 0xC7A3, 0xD440, 0xC7A4, 0xD444,\n\t0xC7A5, 0xD45C, 0xC7A6, 0xD460, 0xC7A7, 0xD464, 0xC7A8, 0xD46D,\t0xC7A9, 0xD46F, 0xC7AA, 0xD478, 0xC7AB, 0xD479, 0xC7AC, 0xD47C,\n\t0xC7AD, 0xD47F, 0xC7AE, 0xD480, 0xC7AF, 0xD482, 0xC7B0, 0xD488,\t0xC7B1, 0xD489, 0xC7B2, 0xD48B, 0xC7B3, 0xD48D, 0xC7B4, 0xD494,\n\t0xC7B5, 0xD4A9, 0xC7B6, 0xD4CC, 0xC7B7, 0xD4D0, 0xC7B8, 0xD4D4,\t0xC7B9, 0xD4DC, 0xC7BA, 0xD4DF, 0xC7BB, 0xD4E8, 0xC7BC, 0xD4EC,\n\t0xC7BD, 0xD4F0, 0xC7BE, 0xD4F8, 0xC7BF, 0xD4FB, 0xC7C0, 0xD4FD,\t0xC7C1, 0xD504, 0xC7C2, 0xD508, 0xC7C3, 0xD50C, 0xC7C4, 0xD514,\n\t0xC7C5, 0xD515, 0xC7C6, 0xD517, 0xC7C7, 0xD53C, 0xC7C8, 0xD53D,\t0xC7C9, 0xD540, 0xC7CA, 0xD544, 0xC7CB, 0xD54C, 0xC7CC, 0xD54D,\n\t0xC7CD, 0xD54F, 0xC7CE, 0xD551, 0xC7CF, 0xD558, 0xC7D0, 0xD559,\t0xC7D1, 0xD55C, 0xC7D2, 0xD560, 0xC7D3, 0xD565, 0xC7D4, 0xD568,\n\t0xC7D5, 0xD569, 0xC7D6, 0xD56B, 0xC7D7, 0xD56D, 0xC7D8, 0xD574,\t0xC7D9, 0xD575, 0xC7DA, 0xD578, 0xC7DB, 0xD57C, 0xC7DC, 0xD584,\n\t0xC7DD, 0xD585, 0xC7DE, 0xD587, 0xC7DF, 0xD588, 0xC7E0, 0xD589,\t0xC7E1, 0xD590, 0xC7E2, 0xD5A5, 0xC7E3, 0xD5C8, 0xC7E4, 0xD5C9,\n\t0xC7E5, 0xD5CC, 0xC7E6, 0xD5D0, 0xC7E7, 0xD5D2, 0xC7E8, 0xD5D8,\t0xC7E9, 0xD5D9, 0xC7EA, 0xD5DB, 0xC7EB, 0xD5DD, 0xC7EC, 0xD5E4,\n\t0xC7ED, 0xD5E5, 0xC7EE, 0xD5E8, 0xC7EF, 0xD5EC, 0xC7F0, 0xD5F4,\t0xC7F1, 0xD5F5, 0xC7F2, 0xD5F7, 0xC7F3, 0xD5F9, 0xC7F4, 0xD600,\n\t0xC7F5, 0xD601, 0xC7F6, 0xD604, 0xC7F7, 0xD608, 0xC7F8, 0xD610,\t0xC7F9, 0xD611, 0xC7FA, 0xD613, 0xC7FB, 0xD614, 0xC7FC, 0xD615,\n\t0xC7FD, 0xD61C, 0xC7FE, 0xD620, 0xC8A1, 0xD624, 0xC8A2, 0xD62D,\t0xC8A3, 0xD638, 0xC8A4, 0xD639, 0xC8A5, 0xD63C, 0xC8A6, 0xD640,\n\t0xC8A7, 0xD645, 0xC8A8, 0xD648, 0xC8A9, 0xD649, 0xC8AA, 0xD64B,\t0xC8AB, 0xD64D, 0xC8AC, 0xD651, 0xC8AD, 0xD654, 0xC8AE, 0xD655,\n\t0xC8AF, 0xD658, 0xC8B0, 0xD65C, 0xC8B1, 0xD667, 0xC8B2, 0xD669,\t0xC8B3, 0xD670, 0xC8B4, 0xD671, 0xC8B5, 0xD674, 0xC8B6, 0xD683,\n\t0xC8B7, 0xD685, 0xC8B8, 0xD68C, 0xC8B9, 0xD68D, 0xC8BA, 0xD690,\t0xC8BB, 0xD694, 0xC8BC, 0xD69D, 0xC8BD, 0xD69F, 0xC8BE, 0xD6A1,\n\t0xC8BF, 0xD6A8, 0xC8C0, 0xD6AC, 0xC8C1, 0xD6B0, 0xC8C2, 0xD6B9,\t0xC8C3, 0xD6BB, 0xC8C4, 0xD6C4, 0xC8C5, 0xD6C5, 0xC8C6, 0xD6C8,\n\t0xC8C7, 0xD6CC, 0xC8C8, 0xD6D1, 0xC8C9, 0xD6D4, 0xC8CA, 0xD6D7,\t0xC8CB, 0xD6D9, 0xC8CC, 0xD6E0, 0xC8CD, 0xD6E4, 0xC8CE, 0xD6E8,\n\t0xC8CF, 0xD6F0, 0xC8D0, 0xD6F5, 0xC8D1, 0xD6FC, 0xC8D2, 0xD6FD,\t0xC8D3, 0xD700, 0xC8D4, 0xD704, 0xC8D5, 0xD711, 0xC8D6, 0xD718,\n\t0xC8D7, 0xD719, 0xC8D8, 0xD71C, 0xC8D9, 0xD720, 0xC8DA, 0xD728,\t0xC8DB, 0xD729, 0xC8DC, 0xD72B, 0xC8DD, 0xD72D, 0xC8DE, 0xD734,\n\t0xC8DF, 0xD735, 0xC8E0, 0xD738, 0xC8E1, 0xD73C, 0xC8E2, 0xD744,\t0xC8E3, 0xD747, 0xC8E4, 0xD749, 0xC8E5, 0xD750, 0xC8E6, 0xD751,\n\t0xC8E7, 0xD754, 0xC8E8, 0xD756, 0xC8E9, 0xD757, 0xC8EA, 0xD758,\t0xC8EB, 0xD759, 0xC8EC, 0xD760, 0xC8ED, 0xD761, 0xC8EE, 0xD763,\n\t0xC8EF, 0xD765, 0xC8F0, 0xD769, 0xC8F1, 0xD76C, 0xC8F2, 0xD770,\t0xC8F3, 0xD774, 0xC8F4, 0xD77C, 0xC8F5, 0xD77D, 0xC8F6, 0xD781,\n\t0xC8F7, 0xD788, 0xC8F8, 0xD789, 0xC8F9, 0xD78C, 0xC8FA, 0xD790,\t0xC8FB, 0xD798, 0xC8FC, 0xD799, 0xC8FD, 0xD79B, 0xC8FE, 0xD79D,\n\t0xCAA1, 0x4F3D, 0xCAA2, 0x4F73, 0xCAA3, 0x5047, 0xCAA4, 0x50F9,\t0xCAA5, 0x52A0, 0xCAA6, 0x53EF, 0xCAA7, 0x5475, 0xCAA8, 0x54E5,\n\t0xCAA9, 0x5609, 0xCAAA, 0x5AC1, 0xCAAB, 0x5BB6, 0xCAAC, 0x6687,\t0xCAAD, 0x67B6, 0xCAAE, 0x67B7, 0xCAAF, 0x67EF, 0xCAB0, 0x6B4C,\n\t0xCAB1, 0x73C2, 0xCAB2, 0x75C2, 0xCAB3, 0x7A3C, 0xCAB4, 0x82DB,\t0xCAB5, 0x8304, 0xCAB6, 0x8857, 0xCAB7, 0x8888, 0xCAB8, 0x8A36,\n\t0xCAB9, 0x8CC8, 0xCABA, 0x8DCF, 0xCABB, 0x8EFB, 0xCABC, 0x8FE6,\t0xCABD, 0x99D5, 0xCABE, 0x523B, 0xCABF, 0x5374, 0xCAC0, 0x5404,\n\t0xCAC1, 0x606A, 0xCAC2, 0x6164, 0xCAC3, 0x6BBC, 0xCAC4, 0x73CF,\t0xCAC5, 0x811A, 0xCAC6, 0x89BA, 0xCAC7, 0x89D2, 0xCAC8, 0x95A3,\n\t0xCAC9, 0x4F83, 0xCACA, 0x520A, 0xCACB, 0x58BE, 0xCACC, 0x5978,\t0xCACD, 0x59E6, 0xCACE, 0x5E72, 0xCACF, 0x5E79, 0xCAD0, 0x61C7,\n\t0xCAD1, 0x63C0, 0xCAD2, 0x6746, 0xCAD3, 0x67EC, 0xCAD4, 0x687F,\t0xCAD5, 0x6F97, 0xCAD6, 0x764E, 0xCAD7, 0x770B, 0xCAD8, 0x78F5,\n\t0xCAD9, 0x7A08, 0xCADA, 0x7AFF, 0xCADB, 0x7C21, 0xCADC, 0x809D,\t0xCADD, 0x826E, 0xCADE, 0x8271, 0xCADF, 0x8AEB, 0xCAE0, 0x9593,\n\t0xCAE1, 0x4E6B, 0xCAE2, 0x559D, 0xCAE3, 0x66F7, 0xCAE4, 0x6E34,\t0xCAE5, 0x78A3, 0xCAE6, 0x7AED, 0xCAE7, 0x845B, 0xCAE8, 0x8910,\n\t0xCAE9, 0x874E, 0xCAEA, 0x97A8, 0xCAEB, 0x52D8, 0xCAEC, 0x574E,\t0xCAED, 0x582A, 0xCAEE, 0x5D4C, 0xCAEF, 0x611F, 0xCAF0, 0x61BE,\n\t0xCAF1, 0x6221, 0xCAF2, 0x6562, 0xCAF3, 0x67D1, 0xCAF4, 0x6A44,\t0xCAF5, 0x6E1B, 0xCAF6, 0x7518, 0xCAF7, 0x75B3, 0xCAF8, 0x76E3,\n\t0xCAF9, 0x77B0, 0xCAFA, 0x7D3A, 0xCAFB, 0x90AF, 0xCAFC, 0x9451,\t0xCAFD, 0x9452, 0xCAFE, 0x9F95, 0xCBA1, 0x5323, 0xCBA2, 0x5CAC,\n\t0xCBA3, 0x7532, 0xCBA4, 0x80DB, 0xCBA5, 0x9240, 0xCBA6, 0x9598,\t0xCBA7, 0x525B, 0xCBA8, 0x5808, 0xCBA9, 0x59DC, 0xCBAA, 0x5CA1,\n\t0xCBAB, 0x5D17, 0xCBAC, 0x5EB7, 0xCBAD, 0x5F3A, 0xCBAE, 0x5F4A,\t0xCBAF, 0x6177, 0xCBB0, 0x6C5F, 0xCBB1, 0x757A, 0xCBB2, 0x7586,\n\t0xCBB3, 0x7CE0, 0xCBB4, 0x7D73, 0xCBB5, 0x7DB1, 0xCBB6, 0x7F8C,\t0xCBB7, 0x8154, 0xCBB8, 0x8221, 0xCBB9, 0x8591, 0xCBBA, 0x8941,\n\t0xCBBB, 0x8B1B, 0xCBBC, 0x92FC, 0xCBBD, 0x964D, 0xCBBE, 0x9C47,\t0xCBBF, 0x4ECB, 0xCBC0, 0x4EF7, 0xCBC1, 0x500B, 0xCBC2, 0x51F1,\n\t0xCBC3, 0x584F, 0xCBC4, 0x6137, 0xCBC5, 0x613E, 0xCBC6, 0x6168,\t0xCBC7, 0x6539, 0xCBC8, 0x69EA, 0xCBC9, 0x6F11, 0xCBCA, 0x75A5,\n\t0xCBCB, 0x7686, 0xCBCC, 0x76D6, 0xCBCD, 0x7B87, 0xCBCE, 0x82A5,\t0xCBCF, 0x84CB, 0xCBD0, 0xF900, 0xCBD1, 0x93A7, 0xCBD2, 0x958B,\n\t0xCBD3, 0x5580, 0xCBD4, 0x5BA2, 0xCBD5, 0x5751, 0xCBD6, 0xF901,\t0xCBD7, 0x7CB3, 0xCBD8, 0x7FB9, 0xCBD9, 0x91B5, 0xCBDA, 0x5028,\n\t0xCBDB, 0x53BB, 0xCBDC, 0x5C45, 0xCBDD, 0x5DE8, 0xCBDE, 0x62D2,\t0xCBDF, 0x636E, 0xCBE0, 0x64DA, 0xCBE1, 0x64E7, 0xCBE2, 0x6E20,\n\t0xCBE3, 0x70AC, 0xCBE4, 0x795B, 0xCBE5, 0x8DDD, 0xCBE6, 0x8E1E,\t0xCBE7, 0xF902, 0xCBE8, 0x907D, 0xCBE9, 0x9245, 0xCBEA, 0x92F8,\n\t0xCBEB, 0x4E7E, 0xCBEC, 0x4EF6, 0xCBED, 0x5065, 0xCBEE, 0x5DFE,\t0xCBEF, 0x5EFA, 0xCBF0, 0x6106, 0xCBF1, 0x6957, 0xCBF2, 0x8171,\n\t0xCBF3, 0x8654, 0xCBF4, 0x8E47, 0xCBF5, 0x9375, 0xCBF6, 0x9A2B,\t0xCBF7, 0x4E5E, 0xCBF8, 0x5091, 0xCBF9, 0x6770, 0xCBFA, 0x6840,\n\t0xCBFB, 0x5109, 0xCBFC, 0x528D, 0xCBFD, 0x5292, 0xCBFE, 0x6AA2,\t0xCCA1, 0x77BC, 0xCCA2, 0x9210, 0xCCA3, 0x9ED4, 0xCCA4, 0x52AB,\n\t0xCCA5, 0x602F, 0xCCA6, 0x8FF2, 0xCCA7, 0x5048, 0xCCA8, 0x61A9,\t0xCCA9, 0x63ED, 0xCCAA, 0x64CA, 0xCCAB, 0x683C, 0xCCAC, 0x6A84,\n\t0xCCAD, 0x6FC0, 0xCCAE, 0x8188, 0xCCAF, 0x89A1, 0xCCB0, 0x9694,\t0xCCB1, 0x5805, 0xCCB2, 0x727D, 0xCCB3, 0x72AC, 0xCCB4, 0x7504,\n\t0xCCB5, 0x7D79, 0xCCB6, 0x7E6D, 0xCCB7, 0x80A9, 0xCCB8, 0x898B,\t0xCCB9, 0x8B74, 0xCCBA, 0x9063, 0xCCBB, 0x9D51, 0xCCBC, 0x6289,\n\t0xCCBD, 0x6C7A, 0xCCBE, 0x6F54, 0xCCBF, 0x7D50, 0xCCC0, 0x7F3A,\t0xCCC1, 0x8A23, 0xCCC2, 0x517C, 0xCCC3, 0x614A, 0xCCC4, 0x7B9D,\n\t0xCCC5, 0x8B19, 0xCCC6, 0x9257, 0xCCC7, 0x938C, 0xCCC8, 0x4EAC,\t0xCCC9, 0x4FD3, 0xCCCA, 0x501E, 0xCCCB, 0x50BE, 0xCCCC, 0x5106,\n\t0xCCCD, 0x52C1, 0xCCCE, 0x52CD, 0xCCCF, 0x537F, 0xCCD0, 0x5770,\t0xCCD1, 0x5883, 0xCCD2, 0x5E9A, 0xCCD3, 0x5F91, 0xCCD4, 0x6176,\n\t0xCCD5, 0x61AC, 0xCCD6, 0x64CE, 0xCCD7, 0x656C, 0xCCD8, 0x666F,\t0xCCD9, 0x66BB, 0xCCDA, 0x66F4, 0xCCDB, 0x6897, 0xCCDC, 0x6D87,\n\t0xCCDD, 0x7085, 0xCCDE, 0x70F1, 0xCCDF, 0x749F, 0xCCE0, 0x74A5,\t0xCCE1, 0x74CA, 0xCCE2, 0x75D9, 0xCCE3, 0x786C, 0xCCE4, 0x78EC,\n\t0xCCE5, 0x7ADF, 0xCCE6, 0x7AF6, 0xCCE7, 0x7D45, 0xCCE8, 0x7D93,\t0xCCE9, 0x8015, 0xCCEA, 0x803F, 0xCCEB, 0x811B, 0xCCEC, 0x8396,\n\t0xCCED, 0x8B66, 0xCCEE, 0x8F15, 0xCCEF, 0x9015, 0xCCF0, 0x93E1,\t0xCCF1, 0x9803, 0xCCF2, 0x9838, 0xCCF3, 0x9A5A, 0xCCF4, 0x9BE8,\n\t0xCCF5, 0x4FC2, 0xCCF6, 0x5553, 0xCCF7, 0x583A, 0xCCF8, 0x5951,\t0xCCF9, 0x5B63, 0xCCFA, 0x5C46, 0xCCFB, 0x60B8, 0xCCFC, 0x6212,\n\t0xCCFD, 0x6842, 0xCCFE, 0x68B0, 0xCDA1, 0x68E8, 0xCDA2, 0x6EAA,\t0xCDA3, 0x754C, 0xCDA4, 0x7678, 0xCDA5, 0x78CE, 0xCDA6, 0x7A3D,\n\t0xCDA7, 0x7CFB, 0xCDA8, 0x7E6B, 0xCDA9, 0x7E7C, 0xCDAA, 0x8A08,\t0xCDAB, 0x8AA1, 0xCDAC, 0x8C3F, 0xCDAD, 0x968E, 0xCDAE, 0x9DC4,\n\t0xCDAF, 0x53E4, 0xCDB0, 0x53E9, 0xCDB1, 0x544A, 0xCDB2, 0x5471,\t0xCDB3, 0x56FA, 0xCDB4, 0x59D1, 0xCDB5, 0x5B64, 0xCDB6, 0x5C3B,\n\t0xCDB7, 0x5EAB, 0xCDB8, 0x62F7, 0xCDB9, 0x6537, 0xCDBA, 0x6545,\t0xCDBB, 0x6572, 0xCDBC, 0x66A0, 0xCDBD, 0x67AF, 0xCDBE, 0x69C1,\n\t0xCDBF, 0x6CBD, 0xCDC0, 0x75FC, 0xCDC1, 0x7690, 0xCDC2, 0x777E,\t0xCDC3, 0x7A3F, 0xCDC4, 0x7F94, 0xCDC5, 0x8003, 0xCDC6, 0x80A1,\n\t0xCDC7, 0x818F, 0xCDC8, 0x82E6, 0xCDC9, 0x82FD, 0xCDCA, 0x83F0,\t0xCDCB, 0x85C1, 0xCDCC, 0x8831, 0xCDCD, 0x88B4, 0xCDCE, 0x8AA5,\n\t0xCDCF, 0xF903, 0xCDD0, 0x8F9C, 0xCDD1, 0x932E, 0xCDD2, 0x96C7,\t0xCDD3, 0x9867, 0xCDD4, 0x9AD8, 0xCDD5, 0x9F13, 0xCDD6, 0x54ED,\n\t0xCDD7, 0x659B, 0xCDD8, 0x66F2, 0xCDD9, 0x688F, 0xCDDA, 0x7A40,\t0xCDDB, 0x8C37, 0xCDDC, 0x9D60, 0xCDDD, 0x56F0, 0xCDDE, 0x5764,\n\t0xCDDF, 0x5D11, 0xCDE0, 0x6606, 0xCDE1, 0x68B1, 0xCDE2, 0x68CD,\t0xCDE3, 0x6EFE, 0xCDE4, 0x7428, 0xCDE5, 0x889E, 0xCDE6, 0x9BE4,\n\t0xCDE7, 0x6C68, 0xCDE8, 0xF904, 0xCDE9, 0x9AA8, 0xCDEA, 0x4F9B,\t0xCDEB, 0x516C, 0xCDEC, 0x5171, 0xCDED, 0x529F, 0xCDEE, 0x5B54,\n\t0xCDEF, 0x5DE5, 0xCDF0, 0x6050, 0xCDF1, 0x606D, 0xCDF2, 0x62F1,\t0xCDF3, 0x63A7, 0xCDF4, 0x653B, 0xCDF5, 0x73D9, 0xCDF6, 0x7A7A,\n\t0xCDF7, 0x86A3, 0xCDF8, 0x8CA2, 0xCDF9, 0x978F, 0xCDFA, 0x4E32,\t0xCDFB, 0x5BE1, 0xCDFC, 0x6208, 0xCDFD, 0x679C, 0xCDFE, 0x74DC,\n\t0xCEA1, 0x79D1, 0xCEA2, 0x83D3, 0xCEA3, 0x8A87, 0xCEA4, 0x8AB2,\t0xCEA5, 0x8DE8, 0xCEA6, 0x904E, 0xCEA7, 0x934B, 0xCEA8, 0x9846,\n\t0xCEA9, 0x5ED3, 0xCEAA, 0x69E8, 0xCEAB, 0x85FF, 0xCEAC, 0x90ED,\t0xCEAD, 0xF905, 0xCEAE, 0x51A0, 0xCEAF, 0x5B98, 0xCEB0, 0x5BEC,\n\t0xCEB1, 0x6163, 0xCEB2, 0x68FA, 0xCEB3, 0x6B3E, 0xCEB4, 0x704C,\t0xCEB5, 0x742F, 0xCEB6, 0x74D8, 0xCEB7, 0x7BA1, 0xCEB8, 0x7F50,\n\t0xCEB9, 0x83C5, 0xCEBA, 0x89C0, 0xCEBB, 0x8CAB, 0xCEBC, 0x95DC,\t0xCEBD, 0x9928, 0xCEBE, 0x522E, 0xCEBF, 0x605D, 0xCEC0, 0x62EC,\n\t0xCEC1, 0x9002, 0xCEC2, 0x4F8A, 0xCEC3, 0x5149, 0xCEC4, 0x5321,\t0xCEC5, 0x58D9, 0xCEC6, 0x5EE3, 0xCEC7, 0x66E0, 0xCEC8, 0x6D38,\n\t0xCEC9, 0x709A, 0xCECA, 0x72C2, 0xCECB, 0x73D6, 0xCECC, 0x7B50,\t0xCECD, 0x80F1, 0xCECE, 0x945B, 0xCECF, 0x5366, 0xCED0, 0x639B,\n\t0xCED1, 0x7F6B, 0xCED2, 0x4E56, 0xCED3, 0x5080, 0xCED4, 0x584A,\t0xCED5, 0x58DE, 0xCED6, 0x602A, 0xCED7, 0x6127, 0xCED8, 0x62D0,\n\t0xCED9, 0x69D0, 0xCEDA, 0x9B41, 0xCEDB, 0x5B8F, 0xCEDC, 0x7D18,\t0xCEDD, 0x80B1, 0xCEDE, 0x8F5F, 0xCEDF, 0x4EA4, 0xCEE0, 0x50D1,\n\t0xCEE1, 0x54AC, 0xCEE2, 0x55AC, 0xCEE3, 0x5B0C, 0xCEE4, 0x5DA0,\t0xCEE5, 0x5DE7, 0xCEE6, 0x652A, 0xCEE7, 0x654E, 0xCEE8, 0x6821,\n\t0xCEE9, 0x6A4B, 0xCEEA, 0x72E1, 0xCEEB, 0x768E, 0xCEEC, 0x77EF,\t0xCEED, 0x7D5E, 0xCEEE, 0x7FF9, 0xCEEF, 0x81A0, 0xCEF0, 0x854E,\n\t0xCEF1, 0x86DF, 0xCEF2, 0x8F03, 0xCEF3, 0x8F4E, 0xCEF4, 0x90CA,\t0xCEF5, 0x9903, 0xCEF6, 0x9A55, 0xCEF7, 0x9BAB, 0xCEF8, 0x4E18,\n\t0xCEF9, 0x4E45, 0xCEFA, 0x4E5D, 0xCEFB, 0x4EC7, 0xCEFC, 0x4FF1,\t0xCEFD, 0x5177, 0xCEFE, 0x52FE, 0xCFA1, 0x5340, 0xCFA2, 0x53E3,\n\t0xCFA3, 0x53E5, 0xCFA4, 0x548E, 0xCFA5, 0x5614, 0xCFA6, 0x5775,\t0xCFA7, 0x57A2, 0xCFA8, 0x5BC7, 0xCFA9, 0x5D87, 0xCFAA, 0x5ED0,\n\t0xCFAB, 0x61FC, 0xCFAC, 0x62D8, 0xCFAD, 0x6551, 0xCFAE, 0x67B8,\t0xCFAF, 0x67E9, 0xCFB0, 0x69CB, 0xCFB1, 0x6B50, 0xCFB2, 0x6BC6,\n\t0xCFB3, 0x6BEC, 0xCFB4, 0x6C42, 0xCFB5, 0x6E9D, 0xCFB6, 0x7078,\t0xCFB7, 0x72D7, 0xCFB8, 0x7396, 0xCFB9, 0x7403, 0xCFBA, 0x77BF,\n\t0xCFBB, 0x77E9, 0xCFBC, 0x7A76, 0xCFBD, 0x7D7F, 0xCFBE, 0x8009,\t0xCFBF, 0x81FC, 0xCFC0, 0x8205, 0xCFC1, 0x820A, 0xCFC2, 0x82DF,\n\t0xCFC3, 0x8862, 0xCFC4, 0x8B33, 0xCFC5, 0x8CFC, 0xCFC6, 0x8EC0,\t0xCFC7, 0x9011, 0xCFC8, 0x90B1, 0xCFC9, 0x9264, 0xCFCA, 0x92B6,\n\t0xCFCB, 0x99D2, 0xCFCC, 0x9A45, 0xCFCD, 0x9CE9, 0xCFCE, 0x9DD7,\t0xCFCF, 0x9F9C, 0xCFD0, 0x570B, 0xCFD1, 0x5C40, 0xCFD2, 0x83CA,\n\t0xCFD3, 0x97A0, 0xCFD4, 0x97AB, 0xCFD5, 0x9EB4, 0xCFD6, 0x541B,\t0xCFD7, 0x7A98, 0xCFD8, 0x7FA4, 0xCFD9, 0x88D9, 0xCFDA, 0x8ECD,\n\t0xCFDB, 0x90E1, 0xCFDC, 0x5800, 0xCFDD, 0x5C48, 0xCFDE, 0x6398,\t0xCFDF, 0x7A9F, 0xCFE0, 0x5BAE, 0xCFE1, 0x5F13, 0xCFE2, 0x7A79,\n\t0xCFE3, 0x7AAE, 0xCFE4, 0x828E, 0xCFE5, 0x8EAC, 0xCFE6, 0x5026,\t0xCFE7, 0x5238, 0xCFE8, 0x52F8, 0xCFE9, 0x5377, 0xCFEA, 0x5708,\n\t0xCFEB, 0x62F3, 0xCFEC, 0x6372, 0xCFED, 0x6B0A, 0xCFEE, 0x6DC3,\t0xCFEF, 0x7737, 0xCFF0, 0x53A5, 0xCFF1, 0x7357, 0xCFF2, 0x8568,\n\t0xCFF3, 0x8E76, 0xCFF4, 0x95D5, 0xCFF5, 0x673A, 0xCFF6, 0x6AC3,\t0xCFF7, 0x6F70, 0xCFF8, 0x8A6D, 0xCFF9, 0x8ECC, 0xCFFA, 0x994B,\n\t0xCFFB, 0xF906, 0xCFFC, 0x6677, 0xCFFD, 0x6B78, 0xCFFE, 0x8CB4,\t0xD0A1, 0x9B3C, 0xD0A2, 0xF907, 0xD0A3, 0x53EB, 0xD0A4, 0x572D,\n\t0xD0A5, 0x594E, 0xD0A6, 0x63C6, 0xD0A7, 0x69FB, 0xD0A8, 0x73EA,\t0xD0A9, 0x7845, 0xD0AA, 0x7ABA, 0xD0AB, 0x7AC5, 0xD0AC, 0x7CFE,\n\t0xD0AD, 0x8475, 0xD0AE, 0x898F, 0xD0AF, 0x8D73, 0xD0B0, 0x9035,\t0xD0B1, 0x95A8, 0xD0B2, 0x52FB, 0xD0B3, 0x5747, 0xD0B4, 0x7547,\n\t0xD0B5, 0x7B60, 0xD0B6, 0x83CC, 0xD0B7, 0x921E, 0xD0B8, 0xF908,\t0xD0B9, 0x6A58, 0xD0BA, 0x514B, 0xD0BB, 0x524B, 0xD0BC, 0x5287,\n\t0xD0BD, 0x621F, 0xD0BE, 0x68D8, 0xD0BF, 0x6975, 0xD0C0, 0x9699,\t0xD0C1, 0x50C5, 0xD0C2, 0x52A4, 0xD0C3, 0x52E4, 0xD0C4, 0x61C3,\n\t0xD0C5, 0x65A4, 0xD0C6, 0x6839, 0xD0C7, 0x69FF, 0xD0C8, 0x747E,\t0xD0C9, 0x7B4B, 0xD0CA, 0x82B9, 0xD0CB, 0x83EB, 0xD0CC, 0x89B2,\n\t0xD0CD, 0x8B39, 0xD0CE, 0x8FD1, 0xD0CF, 0x9949, 0xD0D0, 0xF909,\t0xD0D1, 0x4ECA, 0xD0D2, 0x5997, 0xD0D3, 0x64D2, 0xD0D4, 0x6611,\n\t0xD0D5, 0x6A8E, 0xD0D6, 0x7434, 0xD0D7, 0x7981, 0xD0D8, 0x79BD,\t0xD0D9, 0x82A9, 0xD0DA, 0x887E, 0xD0DB, 0x887F, 0xD0DC, 0x895F,\n\t0xD0DD, 0xF90A, 0xD0DE, 0x9326, 0xD0DF, 0x4F0B, 0xD0E0, 0x53CA,\t0xD0E1, 0x6025, 0xD0E2, 0x6271, 0xD0E3, 0x6C72, 0xD0E4, 0x7D1A,\n\t0xD0E5, 0x7D66, 0xD0E6, 0x4E98, 0xD0E7, 0x5162, 0xD0E8, 0x77DC,\t0xD0E9, 0x80AF, 0xD0EA, 0x4F01, 0xD0EB, 0x4F0E, 0xD0EC, 0x5176,\n\t0xD0ED, 0x5180, 0xD0EE, 0x55DC, 0xD0EF, 0x5668, 0xD0F0, 0x573B,\t0xD0F1, 0x57FA, 0xD0F2, 0x57FC, 0xD0F3, 0x5914, 0xD0F4, 0x5947,\n\t0xD0F5, 0x5993, 0xD0F6, 0x5BC4, 0xD0F7, 0x5C90, 0xD0F8, 0x5D0E,\t0xD0F9, 0x5DF1, 0xD0FA, 0x5E7E, 0xD0FB, 0x5FCC, 0xD0FC, 0x6280,\n\t0xD0FD, 0x65D7, 0xD0FE, 0x65E3, 0xD1A1, 0x671E, 0xD1A2, 0x671F,\t0xD1A3, 0x675E, 0xD1A4, 0x68CB, 0xD1A5, 0x68C4, 0xD1A6, 0x6A5F,\n\t0xD1A7, 0x6B3A, 0xD1A8, 0x6C23, 0xD1A9, 0x6C7D, 0xD1AA, 0x6C82,\t0xD1AB, 0x6DC7, 0xD1AC, 0x7398, 0xD1AD, 0x7426, 0xD1AE, 0x742A,\n\t0xD1AF, 0x7482, 0xD1B0, 0x74A3, 0xD1B1, 0x7578, 0xD1B2, 0x757F,\t0xD1B3, 0x7881, 0xD1B4, 0x78EF, 0xD1B5, 0x7941, 0xD1B6, 0x7947,\n\t0xD1B7, 0x7948, 0xD1B8, 0x797A, 0xD1B9, 0x7B95, 0xD1BA, 0x7D00,\t0xD1BB, 0x7DBA, 0xD1BC, 0x7F88, 0xD1BD, 0x8006, 0xD1BE, 0x802D,\n\t0xD1BF, 0x808C, 0xD1C0, 0x8A18, 0xD1C1, 0x8B4F, 0xD1C2, 0x8C48,\t0xD1C3, 0x8D77, 0xD1C4, 0x9321, 0xD1C5, 0x9324, 0xD1C6, 0x98E2,\n\t0xD1C7, 0x9951, 0xD1C8, 0x9A0E, 0xD1C9, 0x9A0F, 0xD1CA, 0x9A65,\t0xD1CB, 0x9E92, 0xD1CC, 0x7DCA, 0xD1CD, 0x4F76, 0xD1CE, 0x5409,\n\t0xD1CF, 0x62EE, 0xD1D0, 0x6854, 0xD1D1, 0x91D1, 0xD1D2, 0x55AB,\t0xD1D3, 0x513A, 0xD1D4, 0xF90B, 0xD1D5, 0xF90C, 0xD1D6, 0x5A1C,\n\t0xD1D7, 0x61E6, 0xD1D8, 0xF90D, 0xD1D9, 0x62CF, 0xD1DA, 0x62FF,\t0xD1DB, 0xF90E, 0xD1DC, 0xF90F, 0xD1DD, 0xF910, 0xD1DE, 0xF911,\n\t0xD1DF, 0xF912, 0xD1E0, 0xF913, 0xD1E1, 0x90A3, 0xD1E2, 0xF914,\t0xD1E3, 0xF915, 0xD1E4, 0xF916, 0xD1E5, 0xF917, 0xD1E6, 0xF918,\n\t0xD1E7, 0x8AFE, 0xD1E8, 0xF919, 0xD1E9, 0xF91A, 0xD1EA, 0xF91B,\t0xD1EB, 0xF91C, 0xD1EC, 0x6696, 0xD1ED, 0xF91D, 0xD1EE, 0x7156,\n\t0xD1EF, 0xF91E, 0xD1F0, 0xF91F, 0xD1F1, 0x96E3, 0xD1F2, 0xF920,\t0xD1F3, 0x634F, 0xD1F4, 0x637A, 0xD1F5, 0x5357, 0xD1F6, 0xF921,\n\t0xD1F7, 0x678F, 0xD1F8, 0x6960, 0xD1F9, 0x6E73, 0xD1FA, 0xF922,\t0xD1FB, 0x7537, 0xD1FC, 0xF923, 0xD1FD, 0xF924, 0xD1FE, 0xF925,\n\t0xD2A1, 0x7D0D, 0xD2A2, 0xF926, 0xD2A3, 0xF927, 0xD2A4, 0x8872,\t0xD2A5, 0x56CA, 0xD2A6, 0x5A18, 0xD2A7, 0xF928, 0xD2A8, 0xF929,\n\t0xD2A9, 0xF92A, 0xD2AA, 0xF92B, 0xD2AB, 0xF92C, 0xD2AC, 0x4E43,\t0xD2AD, 0xF92D, 0xD2AE, 0x5167, 0xD2AF, 0x5948, 0xD2B0, 0x67F0,\n\t0xD2B1, 0x8010, 0xD2B2, 0xF92E, 0xD2B3, 0x5973, 0xD2B4, 0x5E74,\t0xD2B5, 0x649A, 0xD2B6, 0x79CA, 0xD2B7, 0x5FF5, 0xD2B8, 0x606C,\n\t0xD2B9, 0x62C8, 0xD2BA, 0x637B, 0xD2BB, 0x5BE7, 0xD2BC, 0x5BD7,\t0xD2BD, 0x52AA, 0xD2BE, 0xF92F, 0xD2BF, 0x5974, 0xD2C0, 0x5F29,\n\t0xD2C1, 0x6012, 0xD2C2, 0xF930, 0xD2C3, 0xF931, 0xD2C4, 0xF932,\t0xD2C5, 0x7459, 0xD2C6, 0xF933, 0xD2C7, 0xF934, 0xD2C8, 0xF935,\n\t0xD2C9, 0xF936, 0xD2CA, 0xF937, 0xD2CB, 0xF938, 0xD2CC, 0x99D1,\t0xD2CD, 0xF939, 0xD2CE, 0xF93A, 0xD2CF, 0xF93B, 0xD2D0, 0xF93C,\n\t0xD2D1, 0xF93D, 0xD2D2, 0xF93E, 0xD2D3, 0xF93F, 0xD2D4, 0xF940,\t0xD2D5, 0xF941, 0xD2D6, 0xF942, 0xD2D7, 0xF943, 0xD2D8, 0x6FC3,\n\t0xD2D9, 0xF944, 0xD2DA, 0xF945, 0xD2DB, 0x81BF, 0xD2DC, 0x8FB2,\t0xD2DD, 0x60F1, 0xD2DE, 0xF946, 0xD2DF, 0xF947, 0xD2E0, 0x8166,\n\t0xD2E1, 0xF948, 0xD2E2, 0xF949, 0xD2E3, 0x5C3F, 0xD2E4, 0xF94A,\t0xD2E5, 0xF94B, 0xD2E6, 0xF94C, 0xD2E7, 0xF94D, 0xD2E8, 0xF94E,\n\t0xD2E9, 0xF94F, 0xD2EA, 0xF950, 0xD2EB, 0xF951, 0xD2EC, 0x5AE9,\t0xD2ED, 0x8A25, 0xD2EE, 0x677B, 0xD2EF, 0x7D10, 0xD2F0, 0xF952,\n\t0xD2F1, 0xF953, 0xD2F2, 0xF954, 0xD2F3, 0xF955, 0xD2F4, 0xF956,\t0xD2F5, 0xF957, 0xD2F6, 0x80FD, 0xD2F7, 0xF958, 0xD2F8, 0xF959,\n\t0xD2F9, 0x5C3C, 0xD2FA, 0x6CE5, 0xD2FB, 0x533F, 0xD2FC, 0x6EBA,\t0xD2FD, 0x591A, 0xD2FE, 0x8336, 0xD3A1, 0x4E39, 0xD3A2, 0x4EB6,\n\t0xD3A3, 0x4F46, 0xD3A4, 0x55AE, 0xD3A5, 0x5718, 0xD3A6, 0x58C7,\t0xD3A7, 0x5F56, 0xD3A8, 0x65B7, 0xD3A9, 0x65E6, 0xD3AA, 0x6A80,\n\t0xD3AB, 0x6BB5, 0xD3AC, 0x6E4D, 0xD3AD, 0x77ED, 0xD3AE, 0x7AEF,\t0xD3AF, 0x7C1E, 0xD3B0, 0x7DDE, 0xD3B1, 0x86CB, 0xD3B2, 0x8892,\n\t0xD3B3, 0x9132, 0xD3B4, 0x935B, 0xD3B5, 0x64BB, 0xD3B6, 0x6FBE,\t0xD3B7, 0x737A, 0xD3B8, 0x75B8, 0xD3B9, 0x9054, 0xD3BA, 0x5556,\n\t0xD3BB, 0x574D, 0xD3BC, 0x61BA, 0xD3BD, 0x64D4, 0xD3BE, 0x66C7,\t0xD3BF, 0x6DE1, 0xD3C0, 0x6E5B, 0xD3C1, 0x6F6D, 0xD3C2, 0x6FB9,\n\t0xD3C3, 0x75F0, 0xD3C4, 0x8043, 0xD3C5, 0x81BD, 0xD3C6, 0x8541,\t0xD3C7, 0x8983, 0xD3C8, 0x8AC7, 0xD3C9, 0x8B5A, 0xD3CA, 0x931F,\n\t0xD3CB, 0x6C93, 0xD3CC, 0x7553, 0xD3CD, 0x7B54, 0xD3CE, 0x8E0F,\t0xD3CF, 0x905D, 0xD3D0, 0x5510, 0xD3D1, 0x5802, 0xD3D2, 0x5858,\n\t0xD3D3, 0x5E62, 0xD3D4, 0x6207, 0xD3D5, 0x649E, 0xD3D6, 0x68E0,\t0xD3D7, 0x7576, 0xD3D8, 0x7CD6, 0xD3D9, 0x87B3, 0xD3DA, 0x9EE8,\n\t0xD3DB, 0x4EE3, 0xD3DC, 0x5788, 0xD3DD, 0x576E, 0xD3DE, 0x5927,\t0xD3DF, 0x5C0D, 0xD3E0, 0x5CB1, 0xD3E1, 0x5E36, 0xD3E2, 0x5F85,\n\t0xD3E3, 0x6234, 0xD3E4, 0x64E1, 0xD3E5, 0x73B3, 0xD3E6, 0x81FA,\t0xD3E7, 0x888B, 0xD3E8, 0x8CB8, 0xD3E9, 0x968A, 0xD3EA, 0x9EDB,\n\t0xD3EB, 0x5B85, 0xD3EC, 0x5FB7, 0xD3ED, 0x60B3, 0xD3EE, 0x5012,\t0xD3EF, 0x5200, 0xD3F0, 0x5230, 0xD3F1, 0x5716, 0xD3F2, 0x5835,\n\t0xD3F3, 0x5857, 0xD3F4, 0x5C0E, 0xD3F5, 0x5C60, 0xD3F6, 0x5CF6,\t0xD3F7, 0x5D8B, 0xD3F8, 0x5EA6, 0xD3F9, 0x5F92, 0xD3FA, 0x60BC,\n\t0xD3FB, 0x6311, 0xD3FC, 0x6389, 0xD3FD, 0x6417, 0xD3FE, 0x6843,\t0xD4A1, 0x68F9, 0xD4A2, 0x6AC2, 0xD4A3, 0x6DD8, 0xD4A4, 0x6E21,\n\t0xD4A5, 0x6ED4, 0xD4A6, 0x6FE4, 0xD4A7, 0x71FE, 0xD4A8, 0x76DC,\t0xD4A9, 0x7779, 0xD4AA, 0x79B1, 0xD4AB, 0x7A3B, 0xD4AC, 0x8404,\n\t0xD4AD, 0x89A9, 0xD4AE, 0x8CED, 0xD4AF, 0x8DF3, 0xD4B0, 0x8E48,\t0xD4B1, 0x9003, 0xD4B2, 0x9014, 0xD4B3, 0x9053, 0xD4B4, 0x90FD,\n\t0xD4B5, 0x934D, 0xD4B6, 0x9676, 0xD4B7, 0x97DC, 0xD4B8, 0x6BD2,\t0xD4B9, 0x7006, 0xD4BA, 0x7258, 0xD4BB, 0x72A2, 0xD4BC, 0x7368,\n\t0xD4BD, 0x7763, 0xD4BE, 0x79BF, 0xD4BF, 0x7BE4, 0xD4C0, 0x7E9B,\t0xD4C1, 0x8B80, 0xD4C2, 0x58A9, 0xD4C3, 0x60C7, 0xD4C4, 0x6566,\n\t0xD4C5, 0x65FD, 0xD4C6, 0x66BE, 0xD4C7, 0x6C8C, 0xD4C8, 0x711E,\t0xD4C9, 0x71C9, 0xD4CA, 0x8C5A, 0xD4CB, 0x9813, 0xD4CC, 0x4E6D,\n\t0xD4CD, 0x7A81, 0xD4CE, 0x4EDD, 0xD4CF, 0x51AC, 0xD4D0, 0x51CD,\t0xD4D1, 0x52D5, 0xD4D2, 0x540C, 0xD4D3, 0x61A7, 0xD4D4, 0x6771,\n\t0xD4D5, 0x6850, 0xD4D6, 0x68DF, 0xD4D7, 0x6D1E, 0xD4D8, 0x6F7C,\t0xD4D9, 0x75BC, 0xD4DA, 0x77B3, 0xD4DB, 0x7AE5, 0xD4DC, 0x80F4,\n\t0xD4DD, 0x8463, 0xD4DE, 0x9285, 0xD4DF, 0x515C, 0xD4E0, 0x6597,\t0xD4E1, 0x675C, 0xD4E2, 0x6793, 0xD4E3, 0x75D8, 0xD4E4, 0x7AC7,\n\t0xD4E5, 0x8373, 0xD4E6, 0xF95A, 0xD4E7, 0x8C46, 0xD4E8, 0x9017,\t0xD4E9, 0x982D, 0xD4EA, 0x5C6F, 0xD4EB, 0x81C0, 0xD4EC, 0x829A,\n\t0xD4ED, 0x9041, 0xD4EE, 0x906F, 0xD4EF, 0x920D, 0xD4F0, 0x5F97,\t0xD4F1, 0x5D9D, 0xD4F2, 0x6A59, 0xD4F3, 0x71C8, 0xD4F4, 0x767B,\n\t0xD4F5, 0x7B49, 0xD4F6, 0x85E4, 0xD4F7, 0x8B04, 0xD4F8, 0x9127,\t0xD4F9, 0x9A30, 0xD4FA, 0x5587, 0xD4FB, 0x61F6, 0xD4FC, 0xF95B,\n\t0xD4FD, 0x7669, 0xD4FE, 0x7F85, 0xD5A1, 0x863F, 0xD5A2, 0x87BA,\t0xD5A3, 0x88F8, 0xD5A4, 0x908F, 0xD5A5, 0xF95C, 0xD5A6, 0x6D1B,\n\t0xD5A7, 0x70D9, 0xD5A8, 0x73DE, 0xD5A9, 0x7D61, 0xD5AA, 0x843D,\t0xD5AB, 0xF95D, 0xD5AC, 0x916A, 0xD5AD, 0x99F1, 0xD5AE, 0xF95E,\n\t0xD5AF, 0x4E82, 0xD5B0, 0x5375, 0xD5B1, 0x6B04, 0xD5B2, 0x6B12,\t0xD5B3, 0x703E, 0xD5B4, 0x721B, 0xD5B5, 0x862D, 0xD5B6, 0x9E1E,\n\t0xD5B7, 0x524C, 0xD5B8, 0x8FA3, 0xD5B9, 0x5D50, 0xD5BA, 0x64E5,\t0xD5BB, 0x652C, 0xD5BC, 0x6B16, 0xD5BD, 0x6FEB, 0xD5BE, 0x7C43,\n\t0xD5BF, 0x7E9C, 0xD5C0, 0x85CD, 0xD5C1, 0x8964, 0xD5C2, 0x89BD,\t0xD5C3, 0x62C9, 0xD5C4, 0x81D8, 0xD5C5, 0x881F, 0xD5C6, 0x5ECA,\n\t0xD5C7, 0x6717, 0xD5C8, 0x6D6A, 0xD5C9, 0x72FC, 0xD5CA, 0x7405,\t0xD5CB, 0x746F, 0xD5CC, 0x8782, 0xD5CD, 0x90DE, 0xD5CE, 0x4F86,\n\t0xD5CF, 0x5D0D, 0xD5D0, 0x5FA0, 0xD5D1, 0x840A, 0xD5D2, 0x51B7,\t0xD5D3, 0x63A0, 0xD5D4, 0x7565, 0xD5D5, 0x4EAE, 0xD5D6, 0x5006,\n\t0xD5D7, 0x5169, 0xD5D8, 0x51C9, 0xD5D9, 0x6881, 0xD5DA, 0x6A11,\t0xD5DB, 0x7CAE, 0xD5DC, 0x7CB1, 0xD5DD, 0x7CE7, 0xD5DE, 0x826F,\n\t0xD5DF, 0x8AD2, 0xD5E0, 0x8F1B, 0xD5E1, 0x91CF, 0xD5E2, 0x4FB6,\t0xD5E3, 0x5137, 0xD5E4, 0x52F5, 0xD5E5, 0x5442, 0xD5E6, 0x5EEC,\n\t0xD5E7, 0x616E, 0xD5E8, 0x623E, 0xD5E9, 0x65C5, 0xD5EA, 0x6ADA,\t0xD5EB, 0x6FFE, 0xD5EC, 0x792A, 0xD5ED, 0x85DC, 0xD5EE, 0x8823,\n\t0xD5EF, 0x95AD, 0xD5F0, 0x9A62, 0xD5F1, 0x9A6A, 0xD5F2, 0x9E97,\t0xD5F3, 0x9ECE, 0xD5F4, 0x529B, 0xD5F5, 0x66C6, 0xD5F6, 0x6B77,\n\t0xD5F7, 0x701D, 0xD5F8, 0x792B, 0xD5F9, 0x8F62, 0xD5FA, 0x9742,\t0xD5FB, 0x6190, 0xD5FC, 0x6200, 0xD5FD, 0x6523, 0xD5FE, 0x6F23,\n\t0xD6A1, 0x7149, 0xD6A2, 0x7489, 0xD6A3, 0x7DF4, 0xD6A4, 0x806F,\t0xD6A5, 0x84EE, 0xD6A6, 0x8F26, 0xD6A7, 0x9023, 0xD6A8, 0x934A,\n\t0xD6A9, 0x51BD, 0xD6AA, 0x5217, 0xD6AB, 0x52A3, 0xD6AC, 0x6D0C,\t0xD6AD, 0x70C8, 0xD6AE, 0x88C2, 0xD6AF, 0x5EC9, 0xD6B0, 0x6582,\n\t0xD6B1, 0x6BAE, 0xD6B2, 0x6FC2, 0xD6B3, 0x7C3E, 0xD6B4, 0x7375,\t0xD6B5, 0x4EE4, 0xD6B6, 0x4F36, 0xD6B7, 0x56F9, 0xD6B8, 0xF95F,\n\t0xD6B9, 0x5CBA, 0xD6BA, 0x5DBA, 0xD6BB, 0x601C, 0xD6BC, 0x73B2,\t0xD6BD, 0x7B2D, 0xD6BE, 0x7F9A, 0xD6BF, 0x7FCE, 0xD6C0, 0x8046,\n\t0xD6C1, 0x901E, 0xD6C2, 0x9234, 0xD6C3, 0x96F6, 0xD6C4, 0x9748,\t0xD6C5, 0x9818, 0xD6C6, 0x9F61, 0xD6C7, 0x4F8B, 0xD6C8, 0x6FA7,\n\t0xD6C9, 0x79AE, 0xD6CA, 0x91B4, 0xD6CB, 0x96B7, 0xD6CC, 0x52DE,\t0xD6CD, 0xF960, 0xD6CE, 0x6488, 0xD6CF, 0x64C4, 0xD6D0, 0x6AD3,\n\t0xD6D1, 0x6F5E, 0xD6D2, 0x7018, 0xD6D3, 0x7210, 0xD6D4, 0x76E7,\t0xD6D5, 0x8001, 0xD6D6, 0x8606, 0xD6D7, 0x865C, 0xD6D8, 0x8DEF,\n\t0xD6D9, 0x8F05, 0xD6DA, 0x9732, 0xD6DB, 0x9B6F, 0xD6DC, 0x9DFA,\t0xD6DD, 0x9E75, 0xD6DE, 0x788C, 0xD6DF, 0x797F, 0xD6E0, 0x7DA0,\n\t0xD6E1, 0x83C9, 0xD6E2, 0x9304, 0xD6E3, 0x9E7F, 0xD6E4, 0x9E93,\t0xD6E5, 0x8AD6, 0xD6E6, 0x58DF, 0xD6E7, 0x5F04, 0xD6E8, 0x6727,\n\t0xD6E9, 0x7027, 0xD6EA, 0x74CF, 0xD6EB, 0x7C60, 0xD6EC, 0x807E,\t0xD6ED, 0x5121, 0xD6EE, 0x7028, 0xD6EF, 0x7262, 0xD6F0, 0x78CA,\n\t0xD6F1, 0x8CC2, 0xD6F2, 0x8CDA, 0xD6F3, 0x8CF4, 0xD6F4, 0x96F7,\t0xD6F5, 0x4E86, 0xD6F6, 0x50DA, 0xD6F7, 0x5BEE, 0xD6F8, 0x5ED6,\n\t0xD6F9, 0x6599, 0xD6FA, 0x71CE, 0xD6FB, 0x7642, 0xD6FC, 0x77AD,\t0xD6FD, 0x804A, 0xD6FE, 0x84FC, 0xD7A1, 0x907C, 0xD7A2, 0x9B27,\n\t0xD7A3, 0x9F8D, 0xD7A4, 0x58D8, 0xD7A5, 0x5A41, 0xD7A6, 0x5C62,\t0xD7A7, 0x6A13, 0xD7A8, 0x6DDA, 0xD7A9, 0x6F0F, 0xD7AA, 0x763B,\n\t0xD7AB, 0x7D2F, 0xD7AC, 0x7E37, 0xD7AD, 0x851E, 0xD7AE, 0x8938,\t0xD7AF, 0x93E4, 0xD7B0, 0x964B, 0xD7B1, 0x5289, 0xD7B2, 0x65D2,\n\t0xD7B3, 0x67F3, 0xD7B4, 0x69B4, 0xD7B5, 0x6D41, 0xD7B6, 0x6E9C,\t0xD7B7, 0x700F, 0xD7B8, 0x7409, 0xD7B9, 0x7460, 0xD7BA, 0x7559,\n\t0xD7BB, 0x7624, 0xD7BC, 0x786B, 0xD7BD, 0x8B2C, 0xD7BE, 0x985E,\t0xD7BF, 0x516D, 0xD7C0, 0x622E, 0xD7C1, 0x9678, 0xD7C2, 0x4F96,\n\t0xD7C3, 0x502B, 0xD7C4, 0x5D19, 0xD7C5, 0x6DEA, 0xD7C6, 0x7DB8,\t0xD7C7, 0x8F2A, 0xD7C8, 0x5F8B, 0xD7C9, 0x6144, 0xD7CA, 0x6817,\n\t0xD7CB, 0xF961, 0xD7CC, 0x9686, 0xD7CD, 0x52D2, 0xD7CE, 0x808B,\t0xD7CF, 0x51DC, 0xD7D0, 0x51CC, 0xD7D1, 0x695E, 0xD7D2, 0x7A1C,\n\t0xD7D3, 0x7DBE, 0xD7D4, 0x83F1, 0xD7D5, 0x9675, 0xD7D6, 0x4FDA,\t0xD7D7, 0x5229, 0xD7D8, 0x5398, 0xD7D9, 0x540F, 0xD7DA, 0x550E,\n\t0xD7DB, 0x5C65, 0xD7DC, 0x60A7, 0xD7DD, 0x674E, 0xD7DE, 0x68A8,\t0xD7DF, 0x6D6C, 0xD7E0, 0x7281, 0xD7E1, 0x72F8, 0xD7E2, 0x7406,\n\t0xD7E3, 0x7483, 0xD7E4, 0xF962, 0xD7E5, 0x75E2, 0xD7E6, 0x7C6C,\t0xD7E7, 0x7F79, 0xD7E8, 0x7FB8, 0xD7E9, 0x8389, 0xD7EA, 0x88CF,\n\t0xD7EB, 0x88E1, 0xD7EC, 0x91CC, 0xD7ED, 0x91D0, 0xD7EE, 0x96E2,\t0xD7EF, 0x9BC9, 0xD7F0, 0x541D, 0xD7F1, 0x6F7E, 0xD7F2, 0x71D0,\n\t0xD7F3, 0x7498, 0xD7F4, 0x85FA, 0xD7F5, 0x8EAA, 0xD7F6, 0x96A3,\t0xD7F7, 0x9C57, 0xD7F8, 0x9E9F, 0xD7F9, 0x6797, 0xD7FA, 0x6DCB,\n\t0xD7FB, 0x7433, 0xD7FC, 0x81E8, 0xD7FD, 0x9716, 0xD7FE, 0x782C,\t0xD8A1, 0x7ACB, 0xD8A2, 0x7B20, 0xD8A3, 0x7C92, 0xD8A4, 0x6469,\n\t0xD8A5, 0x746A, 0xD8A6, 0x75F2, 0xD8A7, 0x78BC, 0xD8A8, 0x78E8,\t0xD8A9, 0x99AC, 0xD8AA, 0x9B54, 0xD8AB, 0x9EBB, 0xD8AC, 0x5BDE,\n\t0xD8AD, 0x5E55, 0xD8AE, 0x6F20, 0xD8AF, 0x819C, 0xD8B0, 0x83AB,\t0xD8B1, 0x9088, 0xD8B2, 0x4E07, 0xD8B3, 0x534D, 0xD8B4, 0x5A29,\n\t0xD8B5, 0x5DD2, 0xD8B6, 0x5F4E, 0xD8B7, 0x6162, 0xD8B8, 0x633D,\t0xD8B9, 0x6669, 0xD8BA, 0x66FC, 0xD8BB, 0x6EFF, 0xD8BC, 0x6F2B,\n\t0xD8BD, 0x7063, 0xD8BE, 0x779E, 0xD8BF, 0x842C, 0xD8C0, 0x8513,\t0xD8C1, 0x883B, 0xD8C2, 0x8F13, 0xD8C3, 0x9945, 0xD8C4, 0x9C3B,\n\t0xD8C5, 0x551C, 0xD8C6, 0x62B9, 0xD8C7, 0x672B, 0xD8C8, 0x6CAB,\t0xD8C9, 0x8309, 0xD8CA, 0x896A, 0xD8CB, 0x977A, 0xD8CC, 0x4EA1,\n\t0xD8CD, 0x5984, 0xD8CE, 0x5FD8, 0xD8CF, 0x5FD9, 0xD8D0, 0x671B,\t0xD8D1, 0x7DB2, 0xD8D2, 0x7F54, 0xD8D3, 0x8292, 0xD8D4, 0x832B,\n\t0xD8D5, 0x83BD, 0xD8D6, 0x8F1E, 0xD8D7, 0x9099, 0xD8D8, 0x57CB,\t0xD8D9, 0x59B9, 0xD8DA, 0x5A92, 0xD8DB, 0x5BD0, 0xD8DC, 0x6627,\n\t0xD8DD, 0x679A, 0xD8DE, 0x6885, 0xD8DF, 0x6BCF, 0xD8E0, 0x7164,\t0xD8E1, 0x7F75, 0xD8E2, 0x8CB7, 0xD8E3, 0x8CE3, 0xD8E4, 0x9081,\n\t0xD8E5, 0x9B45, 0xD8E6, 0x8108, 0xD8E7, 0x8C8A, 0xD8E8, 0x964C,\t0xD8E9, 0x9A40, 0xD8EA, 0x9EA5, 0xD8EB, 0x5B5F, 0xD8EC, 0x6C13,\n\t0xD8ED, 0x731B, 0xD8EE, 0x76F2, 0xD8EF, 0x76DF, 0xD8F0, 0x840C,\t0xD8F1, 0x51AA, 0xD8F2, 0x8993, 0xD8F3, 0x514D, 0xD8F4, 0x5195,\n\t0xD8F5, 0x52C9, 0xD8F6, 0x68C9, 0xD8F7, 0x6C94, 0xD8F8, 0x7704,\t0xD8F9, 0x7720, 0xD8FA, 0x7DBF, 0xD8FB, 0x7DEC, 0xD8FC, 0x9762,\n\t0xD8FD, 0x9EB5, 0xD8FE, 0x6EC5, 0xD9A1, 0x8511, 0xD9A2, 0x51A5,\t0xD9A3, 0x540D, 0xD9A4, 0x547D, 0xD9A5, 0x660E, 0xD9A6, 0x669D,\n\t0xD9A7, 0x6927, 0xD9A8, 0x6E9F, 0xD9A9, 0x76BF, 0xD9AA, 0x7791,\t0xD9AB, 0x8317, 0xD9AC, 0x84C2, 0xD9AD, 0x879F, 0xD9AE, 0x9169,\n\t0xD9AF, 0x9298, 0xD9B0, 0x9CF4, 0xD9B1, 0x8882, 0xD9B2, 0x4FAE,\t0xD9B3, 0x5192, 0xD9B4, 0x52DF, 0xD9B5, 0x59C6, 0xD9B6, 0x5E3D,\n\t0xD9B7, 0x6155, 0xD9B8, 0x6478, 0xD9B9, 0x6479, 0xD9BA, 0x66AE,\t0xD9BB, 0x67D0, 0xD9BC, 0x6A21, 0xD9BD, 0x6BCD, 0xD9BE, 0x6BDB,\n\t0xD9BF, 0x725F, 0xD9C0, 0x7261, 0xD9C1, 0x7441, 0xD9C2, 0x7738,\t0xD9C3, 0x77DB, 0xD9C4, 0x8017, 0xD9C5, 0x82BC, 0xD9C6, 0x8305,\n\t0xD9C7, 0x8B00, 0xD9C8, 0x8B28, 0xD9C9, 0x8C8C, 0xD9CA, 0x6728,\t0xD9CB, 0x6C90, 0xD9CC, 0x7267, 0xD9CD, 0x76EE, 0xD9CE, 0x7766,\n\t0xD9CF, 0x7A46, 0xD9D0, 0x9DA9, 0xD9D1, 0x6B7F, 0xD9D2, 0x6C92,\t0xD9D3, 0x5922, 0xD9D4, 0x6726, 0xD9D5, 0x8499, 0xD9D6, 0x536F,\n\t0xD9D7, 0x5893, 0xD9D8, 0x5999, 0xD9D9, 0x5EDF, 0xD9DA, 0x63CF,\t0xD9DB, 0x6634, 0xD9DC, 0x6773, 0xD9DD, 0x6E3A, 0xD9DE, 0x732B,\n\t0xD9DF, 0x7AD7, 0xD9E0, 0x82D7, 0xD9E1, 0x9328, 0xD9E2, 0x52D9,\t0xD9E3, 0x5DEB, 0xD9E4, 0x61AE, 0xD9E5, 0x61CB, 0xD9E6, 0x620A,\n\t0xD9E7, 0x62C7, 0xD9E8, 0x64AB, 0xD9E9, 0x65E0, 0xD9EA, 0x6959,\t0xD9EB, 0x6B66, 0xD9EC, 0x6BCB, 0xD9ED, 0x7121, 0xD9EE, 0x73F7,\n\t0xD9EF, 0x755D, 0xD9F0, 0x7E46, 0xD9F1, 0x821E, 0xD9F2, 0x8302,\t0xD9F3, 0x856A, 0xD9F4, 0x8AA3, 0xD9F5, 0x8CBF, 0xD9F6, 0x9727,\n\t0xD9F7, 0x9D61, 0xD9F8, 0x58A8, 0xD9F9, 0x9ED8, 0xD9FA, 0x5011,\t0xD9FB, 0x520E, 0xD9FC, 0x543B, 0xD9FD, 0x554F, 0xD9FE, 0x6587,\n\t0xDAA1, 0x6C76, 0xDAA2, 0x7D0A, 0xDAA3, 0x7D0B, 0xDAA4, 0x805E,\t0xDAA5, 0x868A, 0xDAA6, 0x9580, 0xDAA7, 0x96EF, 0xDAA8, 0x52FF,\n\t0xDAA9, 0x6C95, 0xDAAA, 0x7269, 0xDAAB, 0x5473, 0xDAAC, 0x5A9A,\t0xDAAD, 0x5C3E, 0xDAAE, 0x5D4B, 0xDAAF, 0x5F4C, 0xDAB0, 0x5FAE,\n\t0xDAB1, 0x672A, 0xDAB2, 0x68B6, 0xDAB3, 0x6963, 0xDAB4, 0x6E3C,\t0xDAB5, 0x6E44, 0xDAB6, 0x7709, 0xDAB7, 0x7C73, 0xDAB8, 0x7F8E,\n\t0xDAB9, 0x8587, 0xDABA, 0x8B0E, 0xDABB, 0x8FF7, 0xDABC, 0x9761,\t0xDABD, 0x9EF4, 0xDABE, 0x5CB7, 0xDABF, 0x60B6, 0xDAC0, 0x610D,\n\t0xDAC1, 0x61AB, 0xDAC2, 0x654F, 0xDAC3, 0x65FB, 0xDAC4, 0x65FC,\t0xDAC5, 0x6C11, 0xDAC6, 0x6CEF, 0xDAC7, 0x739F, 0xDAC8, 0x73C9,\n\t0xDAC9, 0x7DE1, 0xDACA, 0x9594, 0xDACB, 0x5BC6, 0xDACC, 0x871C,\t0xDACD, 0x8B10, 0xDACE, 0x525D, 0xDACF, 0x535A, 0xDAD0, 0x62CD,\n\t0xDAD1, 0x640F, 0xDAD2, 0x64B2, 0xDAD3, 0x6734, 0xDAD4, 0x6A38,\t0xDAD5, 0x6CCA, 0xDAD6, 0x73C0, 0xDAD7, 0x749E, 0xDAD8, 0x7B94,\n\t0xDAD9, 0x7C95, 0xDADA, 0x7E1B, 0xDADB, 0x818A, 0xDADC, 0x8236,\t0xDADD, 0x8584, 0xDADE, 0x8FEB, 0xDADF, 0x96F9, 0xDAE0, 0x99C1,\n\t0xDAE1, 0x4F34, 0xDAE2, 0x534A, 0xDAE3, 0x53CD, 0xDAE4, 0x53DB,\t0xDAE5, 0x62CC, 0xDAE6, 0x642C, 0xDAE7, 0x6500, 0xDAE8, 0x6591,\n\t0xDAE9, 0x69C3, 0xDAEA, 0x6CEE, 0xDAEB, 0x6F58, 0xDAEC, 0x73ED,\t0xDAED, 0x7554, 0xDAEE, 0x7622, 0xDAEF, 0x76E4, 0xDAF0, 0x76FC,\n\t0xDAF1, 0x78D0, 0xDAF2, 0x78FB, 0xDAF3, 0x792C, 0xDAF4, 0x7D46,\t0xDAF5, 0x822C, 0xDAF6, 0x87E0, 0xDAF7, 0x8FD4, 0xDAF8, 0x9812,\n\t0xDAF9, 0x98EF, 0xDAFA, 0x52C3, 0xDAFB, 0x62D4, 0xDAFC, 0x64A5,\t0xDAFD, 0x6E24, 0xDAFE, 0x6F51, 0xDBA1, 0x767C, 0xDBA2, 0x8DCB,\n\t0xDBA3, 0x91B1, 0xDBA4, 0x9262, 0xDBA5, 0x9AEE, 0xDBA6, 0x9B43,\t0xDBA7, 0x5023, 0xDBA8, 0x508D, 0xDBA9, 0x574A, 0xDBAA, 0x59A8,\n\t0xDBAB, 0x5C28, 0xDBAC, 0x5E47, 0xDBAD, 0x5F77, 0xDBAE, 0x623F,\t0xDBAF, 0x653E, 0xDBB0, 0x65B9, 0xDBB1, 0x65C1, 0xDBB2, 0x6609,\n\t0xDBB3, 0x678B, 0xDBB4, 0x699C, 0xDBB5, 0x6EC2, 0xDBB6, 0x78C5,\t0xDBB7, 0x7D21, 0xDBB8, 0x80AA, 0xDBB9, 0x8180, 0xDBBA, 0x822B,\n\t0xDBBB, 0x82B3, 0xDBBC, 0x84A1, 0xDBBD, 0x868C, 0xDBBE, 0x8A2A,\t0xDBBF, 0x8B17, 0xDBC0, 0x90A6, 0xDBC1, 0x9632, 0xDBC2, 0x9F90,\n\t0xDBC3, 0x500D, 0xDBC4, 0x4FF3, 0xDBC5, 0xF963, 0xDBC6, 0x57F9,\t0xDBC7, 0x5F98, 0xDBC8, 0x62DC, 0xDBC9, 0x6392, 0xDBCA, 0x676F,\n\t0xDBCB, 0x6E43, 0xDBCC, 0x7119, 0xDBCD, 0x76C3, 0xDBCE, 0x80CC,\t0xDBCF, 0x80DA, 0xDBD0, 0x88F4, 0xDBD1, 0x88F5, 0xDBD2, 0x8919,\n\t0xDBD3, 0x8CE0, 0xDBD4, 0x8F29, 0xDBD5, 0x914D, 0xDBD6, 0x966A,\t0xDBD7, 0x4F2F, 0xDBD8, 0x4F70, 0xDBD9, 0x5E1B, 0xDBDA, 0x67CF,\n\t0xDBDB, 0x6822, 0xDBDC, 0x767D, 0xDBDD, 0x767E, 0xDBDE, 0x9B44,\t0xDBDF, 0x5E61, 0xDBE0, 0x6A0A, 0xDBE1, 0x7169, 0xDBE2, 0x71D4,\n\t0xDBE3, 0x756A, 0xDBE4, 0xF964, 0xDBE5, 0x7E41, 0xDBE6, 0x8543,\t0xDBE7, 0x85E9, 0xDBE8, 0x98DC, 0xDBE9, 0x4F10, 0xDBEA, 0x7B4F,\n\t0xDBEB, 0x7F70, 0xDBEC, 0x95A5, 0xDBED, 0x51E1, 0xDBEE, 0x5E06,\t0xDBEF, 0x68B5, 0xDBF0, 0x6C3E, 0xDBF1, 0x6C4E, 0xDBF2, 0x6CDB,\n\t0xDBF3, 0x72AF, 0xDBF4, 0x7BC4, 0xDBF5, 0x8303, 0xDBF6, 0x6CD5,\t0xDBF7, 0x743A, 0xDBF8, 0x50FB, 0xDBF9, 0x5288, 0xDBFA, 0x58C1,\n\t0xDBFB, 0x64D8, 0xDBFC, 0x6A97, 0xDBFD, 0x74A7, 0xDBFE, 0x7656,\t0xDCA1, 0x78A7, 0xDCA2, 0x8617, 0xDCA3, 0x95E2, 0xDCA4, 0x9739,\n\t0xDCA5, 0xF965, 0xDCA6, 0x535E, 0xDCA7, 0x5F01, 0xDCA8, 0x8B8A,\t0xDCA9, 0x8FA8, 0xDCAA, 0x8FAF, 0xDCAB, 0x908A, 0xDCAC, 0x5225,\n\t0xDCAD, 0x77A5, 0xDCAE, 0x9C49, 0xDCAF, 0x9F08, 0xDCB0, 0x4E19,\t0xDCB1, 0x5002, 0xDCB2, 0x5175, 0xDCB3, 0x5C5B, 0xDCB4, 0x5E77,\n\t0xDCB5, 0x661E, 0xDCB6, 0x663A, 0xDCB7, 0x67C4, 0xDCB8, 0x68C5,\t0xDCB9, 0x70B3, 0xDCBA, 0x7501, 0xDCBB, 0x75C5, 0xDCBC, 0x79C9,\n\t0xDCBD, 0x7ADD, 0xDCBE, 0x8F27, 0xDCBF, 0x9920, 0xDCC0, 0x9A08,\t0xDCC1, 0x4FDD, 0xDCC2, 0x5821, 0xDCC3, 0x5831, 0xDCC4, 0x5BF6,\n\t0xDCC5, 0x666E, 0xDCC6, 0x6B65, 0xDCC7, 0x6D11, 0xDCC8, 0x6E7A,\t0xDCC9, 0x6F7D, 0xDCCA, 0x73E4, 0xDCCB, 0x752B, 0xDCCC, 0x83E9,\n\t0xDCCD, 0x88DC, 0xDCCE, 0x8913, 0xDCCF, 0x8B5C, 0xDCD0, 0x8F14,\t0xDCD1, 0x4F0F, 0xDCD2, 0x50D5, 0xDCD3, 0x5310, 0xDCD4, 0x535C,\n\t0xDCD5, 0x5B93, 0xDCD6, 0x5FA9, 0xDCD7, 0x670D, 0xDCD8, 0x798F,\t0xDCD9, 0x8179, 0xDCDA, 0x832F, 0xDCDB, 0x8514, 0xDCDC, 0x8907,\n\t0xDCDD, 0x8986, 0xDCDE, 0x8F39, 0xDCDF, 0x8F3B, 0xDCE0, 0x99A5,\t0xDCE1, 0x9C12, 0xDCE2, 0x672C, 0xDCE3, 0x4E76, 0xDCE4, 0x4FF8,\n\t0xDCE5, 0x5949, 0xDCE6, 0x5C01, 0xDCE7, 0x5CEF, 0xDCE8, 0x5CF0,\t0xDCE9, 0x6367, 0xDCEA, 0x68D2, 0xDCEB, 0x70FD, 0xDCEC, 0x71A2,\n\t0xDCED, 0x742B, 0xDCEE, 0x7E2B, 0xDCEF, 0x84EC, 0xDCF0, 0x8702,\t0xDCF1, 0x9022, 0xDCF2, 0x92D2, 0xDCF3, 0x9CF3, 0xDCF4, 0x4E0D,\n\t0xDCF5, 0x4ED8, 0xDCF6, 0x4FEF, 0xDCF7, 0x5085, 0xDCF8, 0x5256,\t0xDCF9, 0x526F, 0xDCFA, 0x5426, 0xDCFB, 0x5490, 0xDCFC, 0x57E0,\n\t0xDCFD, 0x592B, 0xDCFE, 0x5A66, 0xDDA1, 0x5B5A, 0xDDA2, 0x5B75,\t0xDDA3, 0x5BCC, 0xDDA4, 0x5E9C, 0xDDA5, 0xF966, 0xDDA6, 0x6276,\n\t0xDDA7, 0x6577, 0xDDA8, 0x65A7, 0xDDA9, 0x6D6E, 0xDDAA, 0x6EA5,\t0xDDAB, 0x7236, 0xDDAC, 0x7B26, 0xDDAD, 0x7C3F, 0xDDAE, 0x7F36,\n\t0xDDAF, 0x8150, 0xDDB0, 0x8151, 0xDDB1, 0x819A, 0xDDB2, 0x8240,\t0xDDB3, 0x8299, 0xDDB4, 0x83A9, 0xDDB5, 0x8A03, 0xDDB6, 0x8CA0,\n\t0xDDB7, 0x8CE6, 0xDDB8, 0x8CFB, 0xDDB9, 0x8D74, 0xDDBA, 0x8DBA,\t0xDDBB, 0x90E8, 0xDDBC, 0x91DC, 0xDDBD, 0x961C, 0xDDBE, 0x9644,\n\t0xDDBF, 0x99D9, 0xDDC0, 0x9CE7, 0xDDC1, 0x5317, 0xDDC2, 0x5206,\t0xDDC3, 0x5429, 0xDDC4, 0x5674, 0xDDC5, 0x58B3, 0xDDC6, 0x5954,\n\t0xDDC7, 0x596E, 0xDDC8, 0x5FFF, 0xDDC9, 0x61A4, 0xDDCA, 0x626E,\t0xDDCB, 0x6610, 0xDDCC, 0x6C7E, 0xDDCD, 0x711A, 0xDDCE, 0x76C6,\n\t0xDDCF, 0x7C89, 0xDDD0, 0x7CDE, 0xDDD1, 0x7D1B, 0xDDD2, 0x82AC,\t0xDDD3, 0x8CC1, 0xDDD4, 0x96F0, 0xDDD5, 0xF967, 0xDDD6, 0x4F5B,\n\t0xDDD7, 0x5F17, 0xDDD8, 0x5F7F, 0xDDD9, 0x62C2, 0xDDDA, 0x5D29,\t0xDDDB, 0x670B, 0xDDDC, 0x68DA, 0xDDDD, 0x787C, 0xDDDE, 0x7E43,\n\t0xDDDF, 0x9D6C, 0xDDE0, 0x4E15, 0xDDE1, 0x5099, 0xDDE2, 0x5315,\t0xDDE3, 0x532A, 0xDDE4, 0x5351, 0xDDE5, 0x5983, 0xDDE6, 0x5A62,\n\t0xDDE7, 0x5E87, 0xDDE8, 0x60B2, 0xDDE9, 0x618A, 0xDDEA, 0x6249,\t0xDDEB, 0x6279, 0xDDEC, 0x6590, 0xDDED, 0x6787, 0xDDEE, 0x69A7,\n\t0xDDEF, 0x6BD4, 0xDDF0, 0x6BD6, 0xDDF1, 0x6BD7, 0xDDF2, 0x6BD8,\t0xDDF3, 0x6CB8, 0xDDF4, 0xF968, 0xDDF5, 0x7435, 0xDDF6, 0x75FA,\n\t0xDDF7, 0x7812, 0xDDF8, 0x7891, 0xDDF9, 0x79D5, 0xDDFA, 0x79D8,\t0xDDFB, 0x7C83, 0xDDFC, 0x7DCB, 0xDDFD, 0x7FE1, 0xDDFE, 0x80A5,\n\t0xDEA1, 0x813E, 0xDEA2, 0x81C2, 0xDEA3, 0x83F2, 0xDEA4, 0x871A,\t0xDEA5, 0x88E8, 0xDEA6, 0x8AB9, 0xDEA7, 0x8B6C, 0xDEA8, 0x8CBB,\n\t0xDEA9, 0x9119, 0xDEAA, 0x975E, 0xDEAB, 0x98DB, 0xDEAC, 0x9F3B,\t0xDEAD, 0x56AC, 0xDEAE, 0x5B2A, 0xDEAF, 0x5F6C, 0xDEB0, 0x658C,\n\t0xDEB1, 0x6AB3, 0xDEB2, 0x6BAF, 0xDEB3, 0x6D5C, 0xDEB4, 0x6FF1,\t0xDEB5, 0x7015, 0xDEB6, 0x725D, 0xDEB7, 0x73AD, 0xDEB8, 0x8CA7,\n\t0xDEB9, 0x8CD3, 0xDEBA, 0x983B, 0xDEBB, 0x6191, 0xDEBC, 0x6C37,\t0xDEBD, 0x8058, 0xDEBE, 0x9A01, 0xDEBF, 0x4E4D, 0xDEC0, 0x4E8B,\n\t0xDEC1, 0x4E9B, 0xDEC2, 0x4ED5, 0xDEC3, 0x4F3A, 0xDEC4, 0x4F3C,\t0xDEC5, 0x4F7F, 0xDEC6, 0x4FDF, 0xDEC7, 0x50FF, 0xDEC8, 0x53F2,\n\t0xDEC9, 0x53F8, 0xDECA, 0x5506, 0xDECB, 0x55E3, 0xDECC, 0x56DB,\t0xDECD, 0x58EB, 0xDECE, 0x5962, 0xDECF, 0x5A11, 0xDED0, 0x5BEB,\n\t0xDED1, 0x5BFA, 0xDED2, 0x5C04, 0xDED3, 0x5DF3, 0xDED4, 0x5E2B,\t0xDED5, 0x5F99, 0xDED6, 0x601D, 0xDED7, 0x6368, 0xDED8, 0x659C,\n\t0xDED9, 0x65AF, 0xDEDA, 0x67F6, 0xDEDB, 0x67FB, 0xDEDC, 0x68AD,\t0xDEDD, 0x6B7B, 0xDEDE, 0x6C99, 0xDEDF, 0x6CD7, 0xDEE0, 0x6E23,\n\t0xDEE1, 0x7009, 0xDEE2, 0x7345, 0xDEE3, 0x7802, 0xDEE4, 0x793E,\t0xDEE5, 0x7940, 0xDEE6, 0x7960, 0xDEE7, 0x79C1, 0xDEE8, 0x7BE9,\n\t0xDEE9, 0x7D17, 0xDEEA, 0x7D72, 0xDEEB, 0x8086, 0xDEEC, 0x820D,\t0xDEED, 0x838E, 0xDEEE, 0x84D1, 0xDEEF, 0x86C7, 0xDEF0, 0x88DF,\n\t0xDEF1, 0x8A50, 0xDEF2, 0x8A5E, 0xDEF3, 0x8B1D, 0xDEF4, 0x8CDC,\t0xDEF5, 0x8D66, 0xDEF6, 0x8FAD, 0xDEF7, 0x90AA, 0xDEF8, 0x98FC,\n\t0xDEF9, 0x99DF, 0xDEFA, 0x9E9D, 0xDEFB, 0x524A, 0xDEFC, 0xF969,\t0xDEFD, 0x6714, 0xDEFE, 0xF96A, 0xDFA1, 0x5098, 0xDFA2, 0x522A,\n\t0xDFA3, 0x5C71, 0xDFA4, 0x6563, 0xDFA5, 0x6C55, 0xDFA6, 0x73CA,\t0xDFA7, 0x7523, 0xDFA8, 0x759D, 0xDFA9, 0x7B97, 0xDFAA, 0x849C,\n\t0xDFAB, 0x9178, 0xDFAC, 0x9730, 0xDFAD, 0x4E77, 0xDFAE, 0x6492,\t0xDFAF, 0x6BBA, 0xDFB0, 0x715E, 0xDFB1, 0x85A9, 0xDFB2, 0x4E09,\n\t0xDFB3, 0xF96B, 0xDFB4, 0x6749, 0xDFB5, 0x68EE, 0xDFB6, 0x6E17,\t0xDFB7, 0x829F, 0xDFB8, 0x8518, 0xDFB9, 0x886B, 0xDFBA, 0x63F7,\n\t0xDFBB, 0x6F81, 0xDFBC, 0x9212, 0xDFBD, 0x98AF, 0xDFBE, 0x4E0A,\t0xDFBF, 0x50B7, 0xDFC0, 0x50CF, 0xDFC1, 0x511F, 0xDFC2, 0x5546,\n\t0xDFC3, 0x55AA, 0xDFC4, 0x5617, 0xDFC5, 0x5B40, 0xDFC6, 0x5C19,\t0xDFC7, 0x5CE0, 0xDFC8, 0x5E38, 0xDFC9, 0x5E8A, 0xDFCA, 0x5EA0,\n\t0xDFCB, 0x5EC2, 0xDFCC, 0x60F3, 0xDFCD, 0x6851, 0xDFCE, 0x6A61,\t0xDFCF, 0x6E58, 0xDFD0, 0x723D, 0xDFD1, 0x7240, 0xDFD2, 0x72C0,\n\t0xDFD3, 0x76F8, 0xDFD4, 0x7965, 0xDFD5, 0x7BB1, 0xDFD6, 0x7FD4,\t0xDFD7, 0x88F3, 0xDFD8, 0x89F4, 0xDFD9, 0x8A73, 0xDFDA, 0x8C61,\n\t0xDFDB, 0x8CDE, 0xDFDC, 0x971C, 0xDFDD, 0x585E, 0xDFDE, 0x74BD,\t0xDFDF, 0x8CFD, 0xDFE0, 0x55C7, 0xDFE1, 0xF96C, 0xDFE2, 0x7A61,\n\t0xDFE3, 0x7D22, 0xDFE4, 0x8272, 0xDFE5, 0x7272, 0xDFE6, 0x751F,\t0xDFE7, 0x7525, 0xDFE8, 0xF96D, 0xDFE9, 0x7B19, 0xDFEA, 0x5885,\n\t0xDFEB, 0x58FB, 0xDFEC, 0x5DBC, 0xDFED, 0x5E8F, 0xDFEE, 0x5EB6,\t0xDFEF, 0x5F90, 0xDFF0, 0x6055, 0xDFF1, 0x6292, 0xDFF2, 0x637F,\n\t0xDFF3, 0x654D, 0xDFF4, 0x6691, 0xDFF5, 0x66D9, 0xDFF6, 0x66F8,\t0xDFF7, 0x6816, 0xDFF8, 0x68F2, 0xDFF9, 0x7280, 0xDFFA, 0x745E,\n\t0xDFFB, 0x7B6E, 0xDFFC, 0x7D6E, 0xDFFD, 0x7DD6, 0xDFFE, 0x7F72,\t0xE0A1, 0x80E5, 0xE0A2, 0x8212, 0xE0A3, 0x85AF, 0xE0A4, 0x897F,\n\t0xE0A5, 0x8A93, 0xE0A6, 0x901D, 0xE0A7, 0x92E4, 0xE0A8, 0x9ECD,\t0xE0A9, 0x9F20, 0xE0AA, 0x5915, 0xE0AB, 0x596D, 0xE0AC, 0x5E2D,\n\t0xE0AD, 0x60DC, 0xE0AE, 0x6614, 0xE0AF, 0x6673, 0xE0B0, 0x6790,\t0xE0B1, 0x6C50, 0xE0B2, 0x6DC5, 0xE0B3, 0x6F5F, 0xE0B4, 0x77F3,\n\t0xE0B5, 0x78A9, 0xE0B6, 0x84C6, 0xE0B7, 0x91CB, 0xE0B8, 0x932B,\t0xE0B9, 0x4ED9, 0xE0BA, 0x50CA, 0xE0BB, 0x5148, 0xE0BC, 0x5584,\n\t0xE0BD, 0x5B0B, 0xE0BE, 0x5BA3, 0xE0BF, 0x6247, 0xE0C0, 0x657E,\t0xE0C1, 0x65CB, 0xE0C2, 0x6E32, 0xE0C3, 0x717D, 0xE0C4, 0x7401,\n\t0xE0C5, 0x7444, 0xE0C6, 0x7487, 0xE0C7, 0x74BF, 0xE0C8, 0x766C,\t0xE0C9, 0x79AA, 0xE0CA, 0x7DDA, 0xE0CB, 0x7E55, 0xE0CC, 0x7FA8,\n\t0xE0CD, 0x817A, 0xE0CE, 0x81B3, 0xE0CF, 0x8239, 0xE0D0, 0x861A,\t0xE0D1, 0x87EC, 0xE0D2, 0x8A75, 0xE0D3, 0x8DE3, 0xE0D4, 0x9078,\n\t0xE0D5, 0x9291, 0xE0D6, 0x9425, 0xE0D7, 0x994D, 0xE0D8, 0x9BAE,\t0xE0D9, 0x5368, 0xE0DA, 0x5C51, 0xE0DB, 0x6954, 0xE0DC, 0x6CC4,\n\t0xE0DD, 0x6D29, 0xE0DE, 0x6E2B, 0xE0DF, 0x820C, 0xE0E0, 0x859B,\t0xE0E1, 0x893B, 0xE0E2, 0x8A2D, 0xE0E3, 0x8AAA, 0xE0E4, 0x96EA,\n\t0xE0E5, 0x9F67, 0xE0E6, 0x5261, 0xE0E7, 0x66B9, 0xE0E8, 0x6BB2,\t0xE0E9, 0x7E96, 0xE0EA, 0x87FE, 0xE0EB, 0x8D0D, 0xE0EC, 0x9583,\n\t0xE0ED, 0x965D, 0xE0EE, 0x651D, 0xE0EF, 0x6D89, 0xE0F0, 0x71EE,\t0xE0F1, 0xF96E, 0xE0F2, 0x57CE, 0xE0F3, 0x59D3, 0xE0F4, 0x5BAC,\n\t0xE0F5, 0x6027, 0xE0F6, 0x60FA, 0xE0F7, 0x6210, 0xE0F8, 0x661F,\t0xE0F9, 0x665F, 0xE0FA, 0x7329, 0xE0FB, 0x73F9, 0xE0FC, 0x76DB,\n\t0xE0FD, 0x7701, 0xE0FE, 0x7B6C, 0xE1A1, 0x8056, 0xE1A2, 0x8072,\t0xE1A3, 0x8165, 0xE1A4, 0x8AA0, 0xE1A5, 0x9192, 0xE1A6, 0x4E16,\n\t0xE1A7, 0x52E2, 0xE1A8, 0x6B72, 0xE1A9, 0x6D17, 0xE1AA, 0x7A05,\t0xE1AB, 0x7B39, 0xE1AC, 0x7D30, 0xE1AD, 0xF96F, 0xE1AE, 0x8CB0,\n\t0xE1AF, 0x53EC, 0xE1B0, 0x562F, 0xE1B1, 0x5851, 0xE1B2, 0x5BB5,\t0xE1B3, 0x5C0F, 0xE1B4, 0x5C11, 0xE1B5, 0x5DE2, 0xE1B6, 0x6240,\n\t0xE1B7, 0x6383, 0xE1B8, 0x6414, 0xE1B9, 0x662D, 0xE1BA, 0x68B3,\t0xE1BB, 0x6CBC, 0xE1BC, 0x6D88, 0xE1BD, 0x6EAF, 0xE1BE, 0x701F,\n\t0xE1BF, 0x70A4, 0xE1C0, 0x71D2, 0xE1C1, 0x7526, 0xE1C2, 0x758F,\t0xE1C3, 0x758E, 0xE1C4, 0x7619, 0xE1C5, 0x7B11, 0xE1C6, 0x7BE0,\n\t0xE1C7, 0x7C2B, 0xE1C8, 0x7D20, 0xE1C9, 0x7D39, 0xE1CA, 0x852C,\t0xE1CB, 0x856D, 0xE1CC, 0x8607, 0xE1CD, 0x8A34, 0xE1CE, 0x900D,\n\t0xE1CF, 0x9061, 0xE1D0, 0x90B5, 0xE1D1, 0x92B7, 0xE1D2, 0x97F6,\t0xE1D3, 0x9A37, 0xE1D4, 0x4FD7, 0xE1D5, 0x5C6C, 0xE1D6, 0x675F,\n\t0xE1D7, 0x6D91, 0xE1D8, 0x7C9F, 0xE1D9, 0x7E8C, 0xE1DA, 0x8B16,\t0xE1DB, 0x8D16, 0xE1DC, 0x901F, 0xE1DD, 0x5B6B, 0xE1DE, 0x5DFD,\n\t0xE1DF, 0x640D, 0xE1E0, 0x84C0, 0xE1E1, 0x905C, 0xE1E2, 0x98E1,\t0xE1E3, 0x7387, 0xE1E4, 0x5B8B, 0xE1E5, 0x609A, 0xE1E6, 0x677E,\n\t0xE1E7, 0x6DDE, 0xE1E8, 0x8A1F, 0xE1E9, 0x8AA6, 0xE1EA, 0x9001,\t0xE1EB, 0x980C, 0xE1EC, 0x5237, 0xE1ED, 0xF970, 0xE1EE, 0x7051,\n\t0xE1EF, 0x788E, 0xE1F0, 0x9396, 0xE1F1, 0x8870, 0xE1F2, 0x91D7,\t0xE1F3, 0x4FEE, 0xE1F4, 0x53D7, 0xE1F5, 0x55FD, 0xE1F6, 0x56DA,\n\t0xE1F7, 0x5782, 0xE1F8, 0x58FD, 0xE1F9, 0x5AC2, 0xE1FA, 0x5B88,\t0xE1FB, 0x5CAB, 0xE1FC, 0x5CC0, 0xE1FD, 0x5E25, 0xE1FE, 0x6101,\n\t0xE2A1, 0x620D, 0xE2A2, 0x624B, 0xE2A3, 0x6388, 0xE2A4, 0x641C,\t0xE2A5, 0x6536, 0xE2A6, 0x6578, 0xE2A7, 0x6A39, 0xE2A8, 0x6B8A,\n\t0xE2A9, 0x6C34, 0xE2AA, 0x6D19, 0xE2AB, 0x6F31, 0xE2AC, 0x71E7,\t0xE2AD, 0x72E9, 0xE2AE, 0x7378, 0xE2AF, 0x7407, 0xE2B0, 0x74B2,\n\t0xE2B1, 0x7626, 0xE2B2, 0x7761, 0xE2B3, 0x79C0, 0xE2B4, 0x7A57,\t0xE2B5, 0x7AEA, 0xE2B6, 0x7CB9, 0xE2B7, 0x7D8F, 0xE2B8, 0x7DAC,\n\t0xE2B9, 0x7E61, 0xE2BA, 0x7F9E, 0xE2BB, 0x8129, 0xE2BC, 0x8331,\t0xE2BD, 0x8490, 0xE2BE, 0x84DA, 0xE2BF, 0x85EA, 0xE2C0, 0x8896,\n\t0xE2C1, 0x8AB0, 0xE2C2, 0x8B90, 0xE2C3, 0x8F38, 0xE2C4, 0x9042,\t0xE2C5, 0x9083, 0xE2C6, 0x916C, 0xE2C7, 0x9296, 0xE2C8, 0x92B9,\n\t0xE2C9, 0x968B, 0xE2CA, 0x96A7, 0xE2CB, 0x96A8, 0xE2CC, 0x96D6,\t0xE2CD, 0x9700, 0xE2CE, 0x9808, 0xE2CF, 0x9996, 0xE2D0, 0x9AD3,\n\t0xE2D1, 0x9B1A, 0xE2D2, 0x53D4, 0xE2D3, 0x587E, 0xE2D4, 0x5919,\t0xE2D5, 0x5B70, 0xE2D6, 0x5BBF, 0xE2D7, 0x6DD1, 0xE2D8, 0x6F5A,\n\t0xE2D9, 0x719F, 0xE2DA, 0x7421, 0xE2DB, 0x74B9, 0xE2DC, 0x8085,\t0xE2DD, 0x83FD, 0xE2DE, 0x5DE1, 0xE2DF, 0x5F87, 0xE2E0, 0x5FAA,\n\t0xE2E1, 0x6042, 0xE2E2, 0x65EC, 0xE2E3, 0x6812, 0xE2E4, 0x696F,\t0xE2E5, 0x6A53, 0xE2E6, 0x6B89, 0xE2E7, 0x6D35, 0xE2E8, 0x6DF3,\n\t0xE2E9, 0x73E3, 0xE2EA, 0x76FE, 0xE2EB, 0x77AC, 0xE2EC, 0x7B4D,\t0xE2ED, 0x7D14, 0xE2EE, 0x8123, 0xE2EF, 0x821C, 0xE2F0, 0x8340,\n\t0xE2F1, 0x84F4, 0xE2F2, 0x8563, 0xE2F3, 0x8A62, 0xE2F4, 0x8AC4,\t0xE2F5, 0x9187, 0xE2F6, 0x931E, 0xE2F7, 0x9806, 0xE2F8, 0x99B4,\n\t0xE2F9, 0x620C, 0xE2FA, 0x8853, 0xE2FB, 0x8FF0, 0xE2FC, 0x9265,\t0xE2FD, 0x5D07, 0xE2FE, 0x5D27, 0xE3A1, 0x5D69, 0xE3A2, 0x745F,\n\t0xE3A3, 0x819D, 0xE3A4, 0x8768, 0xE3A5, 0x6FD5, 0xE3A6, 0x62FE,\t0xE3A7, 0x7FD2, 0xE3A8, 0x8936, 0xE3A9, 0x8972, 0xE3AA, 0x4E1E,\n\t0xE3AB, 0x4E58, 0xE3AC, 0x50E7, 0xE3AD, 0x52DD, 0xE3AE, 0x5347,\t0xE3AF, 0x627F, 0xE3B0, 0x6607, 0xE3B1, 0x7E69, 0xE3B2, 0x8805,\n\t0xE3B3, 0x965E, 0xE3B4, 0x4F8D, 0xE3B5, 0x5319, 0xE3B6, 0x5636,\t0xE3B7, 0x59CB, 0xE3B8, 0x5AA4, 0xE3B9, 0x5C38, 0xE3BA, 0x5C4E,\n\t0xE3BB, 0x5C4D, 0xE3BC, 0x5E02, 0xE3BD, 0x5F11, 0xE3BE, 0x6043,\t0xE3BF, 0x65BD, 0xE3C0, 0x662F, 0xE3C1, 0x6642, 0xE3C2, 0x67BE,\n\t0xE3C3, 0x67F4, 0xE3C4, 0x731C, 0xE3C5, 0x77E2, 0xE3C6, 0x793A,\t0xE3C7, 0x7FC5, 0xE3C8, 0x8494, 0xE3C9, 0x84CD, 0xE3CA, 0x8996,\n\t0xE3CB, 0x8A66, 0xE3CC, 0x8A69, 0xE3CD, 0x8AE1, 0xE3CE, 0x8C55,\t0xE3CF, 0x8C7A, 0xE3D0, 0x57F4, 0xE3D1, 0x5BD4, 0xE3D2, 0x5F0F,\n\t0xE3D3, 0x606F, 0xE3D4, 0x62ED, 0xE3D5, 0x690D, 0xE3D6, 0x6B96,\t0xE3D7, 0x6E5C, 0xE3D8, 0x7184, 0xE3D9, 0x7BD2, 0xE3DA, 0x8755,\n\t0xE3DB, 0x8B58, 0xE3DC, 0x8EFE, 0xE3DD, 0x98DF, 0xE3DE, 0x98FE,\t0xE3DF, 0x4F38, 0xE3E0, 0x4F81, 0xE3E1, 0x4FE1, 0xE3E2, 0x547B,\n\t0xE3E3, 0x5A20, 0xE3E4, 0x5BB8, 0xE3E5, 0x613C, 0xE3E6, 0x65B0,\t0xE3E7, 0x6668, 0xE3E8, 0x71FC, 0xE3E9, 0x7533, 0xE3EA, 0x795E,\n\t0xE3EB, 0x7D33, 0xE3EC, 0x814E, 0xE3ED, 0x81E3, 0xE3EE, 0x8398,\t0xE3EF, 0x85AA, 0xE3F0, 0x85CE, 0xE3F1, 0x8703, 0xE3F2, 0x8A0A,\n\t0xE3F3, 0x8EAB, 0xE3F4, 0x8F9B, 0xE3F5, 0xF971, 0xE3F6, 0x8FC5,\t0xE3F7, 0x5931, 0xE3F8, 0x5BA4, 0xE3F9, 0x5BE6, 0xE3FA, 0x6089,\n\t0xE3FB, 0x5BE9, 0xE3FC, 0x5C0B, 0xE3FD, 0x5FC3, 0xE3FE, 0x6C81,\t0xE4A1, 0xF972, 0xE4A2, 0x6DF1, 0xE4A3, 0x700B, 0xE4A4, 0x751A,\n\t0xE4A5, 0x82AF, 0xE4A6, 0x8AF6, 0xE4A7, 0x4EC0, 0xE4A8, 0x5341,\t0xE4A9, 0xF973, 0xE4AA, 0x96D9, 0xE4AB, 0x6C0F, 0xE4AC, 0x4E9E,\n\t0xE4AD, 0x4FC4, 0xE4AE, 0x5152, 0xE4AF, 0x555E, 0xE4B0, 0x5A25,\t0xE4B1, 0x5CE8, 0xE4B2, 0x6211, 0xE4B3, 0x7259, 0xE4B4, 0x82BD,\n\t0xE4B5, 0x83AA, 0xE4B6, 0x86FE, 0xE4B7, 0x8859, 0xE4B8, 0x8A1D,\t0xE4B9, 0x963F, 0xE4BA, 0x96C5, 0xE4BB, 0x9913, 0xE4BC, 0x9D09,\n\t0xE4BD, 0x9D5D, 0xE4BE, 0x580A, 0xE4BF, 0x5CB3, 0xE4C0, 0x5DBD,\t0xE4C1, 0x5E44, 0xE4C2, 0x60E1, 0xE4C3, 0x6115, 0xE4C4, 0x63E1,\n\t0xE4C5, 0x6A02, 0xE4C6, 0x6E25, 0xE4C7, 0x9102, 0xE4C8, 0x9354,\t0xE4C9, 0x984E, 0xE4CA, 0x9C10, 0xE4CB, 0x9F77, 0xE4CC, 0x5B89,\n\t0xE4CD, 0x5CB8, 0xE4CE, 0x6309, 0xE4CF, 0x664F, 0xE4D0, 0x6848,\t0xE4D1, 0x773C, 0xE4D2, 0x96C1, 0xE4D3, 0x978D, 0xE4D4, 0x9854,\n\t0xE4D5, 0x9B9F, 0xE4D6, 0x65A1, 0xE4D7, 0x8B01, 0xE4D8, 0x8ECB,\t0xE4D9, 0x95BC, 0xE4DA, 0x5535, 0xE4DB, 0x5CA9, 0xE4DC, 0x5DD6,\n\t0xE4DD, 0x5EB5, 0xE4DE, 0x6697, 0xE4DF, 0x764C, 0xE4E0, 0x83F4,\t0xE4E1, 0x95C7, 0xE4E2, 0x58D3, 0xE4E3, 0x62BC, 0xE4E4, 0x72CE,\n\t0xE4E5, 0x9D28, 0xE4E6, 0x4EF0, 0xE4E7, 0x592E, 0xE4E8, 0x600F,\t0xE4E9, 0x663B, 0xE4EA, 0x6B83, 0xE4EB, 0x79E7, 0xE4EC, 0x9D26,\n\t0xE4ED, 0x5393, 0xE4EE, 0x54C0, 0xE4EF, 0x57C3, 0xE4F0, 0x5D16,\t0xE4F1, 0x611B, 0xE4F2, 0x66D6, 0xE4F3, 0x6DAF, 0xE4F4, 0x788D,\n\t0xE4F5, 0x827E, 0xE4F6, 0x9698, 0xE4F7, 0x9744, 0xE4F8, 0x5384,\t0xE4F9, 0x627C, 0xE4FA, 0x6396, 0xE4FB, 0x6DB2, 0xE4FC, 0x7E0A,\n\t0xE4FD, 0x814B, 0xE4FE, 0x984D, 0xE5A1, 0x6AFB, 0xE5A2, 0x7F4C,\t0xE5A3, 0x9DAF, 0xE5A4, 0x9E1A, 0xE5A5, 0x4E5F, 0xE5A6, 0x503B,\n\t0xE5A7, 0x51B6, 0xE5A8, 0x591C, 0xE5A9, 0x60F9, 0xE5AA, 0x63F6,\t0xE5AB, 0x6930, 0xE5AC, 0x723A, 0xE5AD, 0x8036, 0xE5AE, 0xF974,\n\t0xE5AF, 0x91CE, 0xE5B0, 0x5F31, 0xE5B1, 0xF975, 0xE5B2, 0xF976,\t0xE5B3, 0x7D04, 0xE5B4, 0x82E5, 0xE5B5, 0x846F, 0xE5B6, 0x84BB,\n\t0xE5B7, 0x85E5, 0xE5B8, 0x8E8D, 0xE5B9, 0xF977, 0xE5BA, 0x4F6F,\t0xE5BB, 0xF978, 0xE5BC, 0xF979, 0xE5BD, 0x58E4, 0xE5BE, 0x5B43,\n\t0xE5BF, 0x6059, 0xE5C0, 0x63DA, 0xE5C1, 0x6518, 0xE5C2, 0x656D,\t0xE5C3, 0x6698, 0xE5C4, 0xF97A, 0xE5C5, 0x694A, 0xE5C6, 0x6A23,\n\t0xE5C7, 0x6D0B, 0xE5C8, 0x7001, 0xE5C9, 0x716C, 0xE5CA, 0x75D2,\t0xE5CB, 0x760D, 0xE5CC, 0x79B3, 0xE5CD, 0x7A70, 0xE5CE, 0xF97B,\n\t0xE5CF, 0x7F8A, 0xE5D0, 0xF97C, 0xE5D1, 0x8944, 0xE5D2, 0xF97D,\t0xE5D3, 0x8B93, 0xE5D4, 0x91C0, 0xE5D5, 0x967D, 0xE5D6, 0xF97E,\n\t0xE5D7, 0x990A, 0xE5D8, 0x5704, 0xE5D9, 0x5FA1, 0xE5DA, 0x65BC,\t0xE5DB, 0x6F01, 0xE5DC, 0x7600, 0xE5DD, 0x79A6, 0xE5DE, 0x8A9E,\n\t0xE5DF, 0x99AD, 0xE5E0, 0x9B5A, 0xE5E1, 0x9F6C, 0xE5E2, 0x5104,\t0xE5E3, 0x61B6, 0xE5E4, 0x6291, 0xE5E5, 0x6A8D, 0xE5E6, 0x81C6,\n\t0xE5E7, 0x5043, 0xE5E8, 0x5830, 0xE5E9, 0x5F66, 0xE5EA, 0x7109,\t0xE5EB, 0x8A00, 0xE5EC, 0x8AFA, 0xE5ED, 0x5B7C, 0xE5EE, 0x8616,\n\t0xE5EF, 0x4FFA, 0xE5F0, 0x513C, 0xE5F1, 0x56B4, 0xE5F2, 0x5944,\t0xE5F3, 0x63A9, 0xE5F4, 0x6DF9, 0xE5F5, 0x5DAA, 0xE5F6, 0x696D,\n\t0xE5F7, 0x5186, 0xE5F8, 0x4E88, 0xE5F9, 0x4F59, 0xE5FA, 0xF97F,\t0xE5FB, 0xF980, 0xE5FC, 0xF981, 0xE5FD, 0x5982, 0xE5FE, 0xF982,\n\t0xE6A1, 0xF983, 0xE6A2, 0x6B5F, 0xE6A3, 0x6C5D, 0xE6A4, 0xF984,\t0xE6A5, 0x74B5, 0xE6A6, 0x7916, 0xE6A7, 0xF985, 0xE6A8, 0x8207,\n\t0xE6A9, 0x8245, 0xE6AA, 0x8339, 0xE6AB, 0x8F3F, 0xE6AC, 0x8F5D,\t0xE6AD, 0xF986, 0xE6AE, 0x9918, 0xE6AF, 0xF987, 0xE6B0, 0xF988,\n\t0xE6B1, 0xF989, 0xE6B2, 0x4EA6, 0xE6B3, 0xF98A, 0xE6B4, 0x57DF,\t0xE6B5, 0x5F79, 0xE6B6, 0x6613, 0xE6B7, 0xF98B, 0xE6B8, 0xF98C,\n\t0xE6B9, 0x75AB, 0xE6BA, 0x7E79, 0xE6BB, 0x8B6F, 0xE6BC, 0xF98D,\t0xE6BD, 0x9006, 0xE6BE, 0x9A5B, 0xE6BF, 0x56A5, 0xE6C0, 0x5827,\n\t0xE6C1, 0x59F8, 0xE6C2, 0x5A1F, 0xE6C3, 0x5BB4, 0xE6C4, 0xF98E,\t0xE6C5, 0x5EF6, 0xE6C6, 0xF98F, 0xE6C7, 0xF990, 0xE6C8, 0x6350,\n\t0xE6C9, 0x633B, 0xE6CA, 0xF991, 0xE6CB, 0x693D, 0xE6CC, 0x6C87,\t0xE6CD, 0x6CBF, 0xE6CE, 0x6D8E, 0xE6CF, 0x6D93, 0xE6D0, 0x6DF5,\n\t0xE6D1, 0x6F14, 0xE6D2, 0xF992, 0xE6D3, 0x70DF, 0xE6D4, 0x7136,\t0xE6D5, 0x7159, 0xE6D6, 0xF993, 0xE6D7, 0x71C3, 0xE6D8, 0x71D5,\n\t0xE6D9, 0xF994, 0xE6DA, 0x784F, 0xE6DB, 0x786F, 0xE6DC, 0xF995,\t0xE6DD, 0x7B75, 0xE6DE, 0x7DE3, 0xE6DF, 0xF996, 0xE6E0, 0x7E2F,\n\t0xE6E1, 0xF997, 0xE6E2, 0x884D, 0xE6E3, 0x8EDF, 0xE6E4, 0xF998,\t0xE6E5, 0xF999, 0xE6E6, 0xF99A, 0xE6E7, 0x925B, 0xE6E8, 0xF99B,\n\t0xE6E9, 0x9CF6, 0xE6EA, 0xF99C, 0xE6EB, 0xF99D, 0xE6EC, 0xF99E,\t0xE6ED, 0x6085, 0xE6EE, 0x6D85, 0xE6EF, 0xF99F, 0xE6F0, 0x71B1,\n\t0xE6F1, 0xF9A0, 0xE6F2, 0xF9A1, 0xE6F3, 0x95B1, 0xE6F4, 0x53AD,\t0xE6F5, 0xF9A2, 0xE6F6, 0xF9A3, 0xE6F7, 0xF9A4, 0xE6F8, 0x67D3,\n\t0xE6F9, 0xF9A5, 0xE6FA, 0x708E, 0xE6FB, 0x7130, 0xE6FC, 0x7430,\t0xE6FD, 0x8276, 0xE6FE, 0x82D2, 0xE7A1, 0xF9A6, 0xE7A2, 0x95BB,\n\t0xE7A3, 0x9AE5, 0xE7A4, 0x9E7D, 0xE7A5, 0x66C4, 0xE7A6, 0xF9A7,\t0xE7A7, 0x71C1, 0xE7A8, 0x8449, 0xE7A9, 0xF9A8, 0xE7AA, 0xF9A9,\n\t0xE7AB, 0x584B, 0xE7AC, 0xF9AA, 0xE7AD, 0xF9AB, 0xE7AE, 0x5DB8,\t0xE7AF, 0x5F71, 0xE7B0, 0xF9AC, 0xE7B1, 0x6620, 0xE7B2, 0x668E,\n\t0xE7B3, 0x6979, 0xE7B4, 0x69AE, 0xE7B5, 0x6C38, 0xE7B6, 0x6CF3,\t0xE7B7, 0x6E36, 0xE7B8, 0x6F41, 0xE7B9, 0x6FDA, 0xE7BA, 0x701B,\n\t0xE7BB, 0x702F, 0xE7BC, 0x7150, 0xE7BD, 0x71DF, 0xE7BE, 0x7370,\t0xE7BF, 0xF9AD, 0xE7C0, 0x745B, 0xE7C1, 0xF9AE, 0xE7C2, 0x74D4,\n\t0xE7C3, 0x76C8, 0xE7C4, 0x7A4E, 0xE7C5, 0x7E93, 0xE7C6, 0xF9AF,\t0xE7C7, 0xF9B0, 0xE7C8, 0x82F1, 0xE7C9, 0x8A60, 0xE7CA, 0x8FCE,\n\t0xE7CB, 0xF9B1, 0xE7CC, 0x9348, 0xE7CD, 0xF9B2, 0xE7CE, 0x9719,\t0xE7CF, 0xF9B3, 0xE7D0, 0xF9B4, 0xE7D1, 0x4E42, 0xE7D2, 0x502A,\n\t0xE7D3, 0xF9B5, 0xE7D4, 0x5208, 0xE7D5, 0x53E1, 0xE7D6, 0x66F3,\t0xE7D7, 0x6C6D, 0xE7D8, 0x6FCA, 0xE7D9, 0x730A, 0xE7DA, 0x777F,\n\t0xE7DB, 0x7A62, 0xE7DC, 0x82AE, 0xE7DD, 0x85DD, 0xE7DE, 0x8602,\t0xE7DF, 0xF9B6, 0xE7E0, 0x88D4, 0xE7E1, 0x8A63, 0xE7E2, 0x8B7D,\n\t0xE7E3, 0x8C6B, 0xE7E4, 0xF9B7, 0xE7E5, 0x92B3, 0xE7E6, 0xF9B8,\t0xE7E7, 0x9713, 0xE7E8, 0x9810, 0xE7E9, 0x4E94, 0xE7EA, 0x4F0D,\n\t0xE7EB, 0x4FC9, 0xE7EC, 0x50B2, 0xE7ED, 0x5348, 0xE7EE, 0x543E,\t0xE7EF, 0x5433, 0xE7F0, 0x55DA, 0xE7F1, 0x5862, 0xE7F2, 0x58BA,\n\t0xE7F3, 0x5967, 0xE7F4, 0x5A1B, 0xE7F5, 0x5BE4, 0xE7F6, 0x609F,\t0xE7F7, 0xF9B9, 0xE7F8, 0x61CA, 0xE7F9, 0x6556, 0xE7FA, 0x65FF,\n\t0xE7FB, 0x6664, 0xE7FC, 0x68A7, 0xE7FD, 0x6C5A, 0xE7FE, 0x6FB3,\t0xE8A1, 0x70CF, 0xE8A2, 0x71AC, 0xE8A3, 0x7352, 0xE8A4, 0x7B7D,\n\t0xE8A5, 0x8708, 0xE8A6, 0x8AA4, 0xE8A7, 0x9C32, 0xE8A8, 0x9F07,\t0xE8A9, 0x5C4B, 0xE8AA, 0x6C83, 0xE8AB, 0x7344, 0xE8AC, 0x7389,\n\t0xE8AD, 0x923A, 0xE8AE, 0x6EAB, 0xE8AF, 0x7465, 0xE8B0, 0x761F,\t0xE8B1, 0x7A69, 0xE8B2, 0x7E15, 0xE8B3, 0x860A, 0xE8B4, 0x5140,\n\t0xE8B5, 0x58C5, 0xE8B6, 0x64C1, 0xE8B7, 0x74EE, 0xE8B8, 0x7515,\t0xE8B9, 0x7670, 0xE8BA, 0x7FC1, 0xE8BB, 0x9095, 0xE8BC, 0x96CD,\n\t0xE8BD, 0x9954, 0xE8BE, 0x6E26, 0xE8BF, 0x74E6, 0xE8C0, 0x7AA9,\t0xE8C1, 0x7AAA, 0xE8C2, 0x81E5, 0xE8C3, 0x86D9, 0xE8C4, 0x8778,\n\t0xE8C5, 0x8A1B, 0xE8C6, 0x5A49, 0xE8C7, 0x5B8C, 0xE8C8, 0x5B9B,\t0xE8C9, 0x68A1, 0xE8CA, 0x6900, 0xE8CB, 0x6D63, 0xE8CC, 0x73A9,\n\t0xE8CD, 0x7413, 0xE8CE, 0x742C, 0xE8CF, 0x7897, 0xE8D0, 0x7DE9,\t0xE8D1, 0x7FEB, 0xE8D2, 0x8118, 0xE8D3, 0x8155, 0xE8D4, 0x839E,\n\t0xE8D5, 0x8C4C, 0xE8D6, 0x962E, 0xE8D7, 0x9811, 0xE8D8, 0x66F0,\t0xE8D9, 0x5F80, 0xE8DA, 0x65FA, 0xE8DB, 0x6789, 0xE8DC, 0x6C6A,\n\t0xE8DD, 0x738B, 0xE8DE, 0x502D, 0xE8DF, 0x5A03, 0xE8E0, 0x6B6A,\t0xE8E1, 0x77EE, 0xE8E2, 0x5916, 0xE8E3, 0x5D6C, 0xE8E4, 0x5DCD,\n\t0xE8E5, 0x7325, 0xE8E6, 0x754F, 0xE8E7, 0xF9BA, 0xE8E8, 0xF9BB,\t0xE8E9, 0x50E5, 0xE8EA, 0x51F9, 0xE8EB, 0x582F, 0xE8EC, 0x592D,\n\t0xE8ED, 0x5996, 0xE8EE, 0x59DA, 0xE8EF, 0x5BE5, 0xE8F0, 0xF9BC,\t0xE8F1, 0xF9BD, 0xE8F2, 0x5DA2, 0xE8F3, 0x62D7, 0xE8F4, 0x6416,\n\t0xE8F5, 0x6493, 0xE8F6, 0x64FE, 0xE8F7, 0xF9BE, 0xE8F8, 0x66DC,\t0xE8F9, 0xF9BF, 0xE8FA, 0x6A48, 0xE8FB, 0xF9C0, 0xE8FC, 0x71FF,\n\t0xE8FD, 0x7464, 0xE8FE, 0xF9C1, 0xE9A1, 0x7A88, 0xE9A2, 0x7AAF,\t0xE9A3, 0x7E47, 0xE9A4, 0x7E5E, 0xE9A5, 0x8000, 0xE9A6, 0x8170,\n\t0xE9A7, 0xF9C2, 0xE9A8, 0x87EF, 0xE9A9, 0x8981, 0xE9AA, 0x8B20,\t0xE9AB, 0x9059, 0xE9AC, 0xF9C3, 0xE9AD, 0x9080, 0xE9AE, 0x9952,\n\t0xE9AF, 0x617E, 0xE9B0, 0x6B32, 0xE9B1, 0x6D74, 0xE9B2, 0x7E1F,\t0xE9B3, 0x8925, 0xE9B4, 0x8FB1, 0xE9B5, 0x4FD1, 0xE9B6, 0x50AD,\n\t0xE9B7, 0x5197, 0xE9B8, 0x52C7, 0xE9B9, 0x57C7, 0xE9BA, 0x5889,\t0xE9BB, 0x5BB9, 0xE9BC, 0x5EB8, 0xE9BD, 0x6142, 0xE9BE, 0x6995,\n\t0xE9BF, 0x6D8C, 0xE9C0, 0x6E67, 0xE9C1, 0x6EB6, 0xE9C2, 0x7194,\t0xE9C3, 0x7462, 0xE9C4, 0x7528, 0xE9C5, 0x752C, 0xE9C6, 0x8073,\n\t0xE9C7, 0x8338, 0xE9C8, 0x84C9, 0xE9C9, 0x8E0A, 0xE9CA, 0x9394,\t0xE9CB, 0x93DE, 0xE9CC, 0xF9C4, 0xE9CD, 0x4E8E, 0xE9CE, 0x4F51,\n\t0xE9CF, 0x5076, 0xE9D0, 0x512A, 0xE9D1, 0x53C8, 0xE9D2, 0x53CB,\t0xE9D3, 0x53F3, 0xE9D4, 0x5B87, 0xE9D5, 0x5BD3, 0xE9D6, 0x5C24,\n\t0xE9D7, 0x611A, 0xE9D8, 0x6182, 0xE9D9, 0x65F4, 0xE9DA, 0x725B,\t0xE9DB, 0x7397, 0xE9DC, 0x7440, 0xE9DD, 0x76C2, 0xE9DE, 0x7950,\n\t0xE9DF, 0x7991, 0xE9E0, 0x79B9, 0xE9E1, 0x7D06, 0xE9E2, 0x7FBD,\t0xE9E3, 0x828B, 0xE9E4, 0x85D5, 0xE9E5, 0x865E, 0xE9E6, 0x8FC2,\n\t0xE9E7, 0x9047, 0xE9E8, 0x90F5, 0xE9E9, 0x91EA, 0xE9EA, 0x9685,\t0xE9EB, 0x96E8, 0xE9EC, 0x96E9, 0xE9ED, 0x52D6, 0xE9EE, 0x5F67,\n\t0xE9EF, 0x65ED, 0xE9F0, 0x6631, 0xE9F1, 0x682F, 0xE9F2, 0x715C,\t0xE9F3, 0x7A36, 0xE9F4, 0x90C1, 0xE9F5, 0x980A, 0xE9F6, 0x4E91,\n\t0xE9F7, 0xF9C5, 0xE9F8, 0x6A52, 0xE9F9, 0x6B9E, 0xE9FA, 0x6F90,\t0xE9FB, 0x7189, 0xE9FC, 0x8018, 0xE9FD, 0x82B8, 0xE9FE, 0x8553,\n\t0xEAA1, 0x904B, 0xEAA2, 0x9695, 0xEAA3, 0x96F2, 0xEAA4, 0x97FB,\t0xEAA5, 0x851A, 0xEAA6, 0x9B31, 0xEAA7, 0x4E90, 0xEAA8, 0x718A,\n\t0xEAA9, 0x96C4, 0xEAAA, 0x5143, 0xEAAB, 0x539F, 0xEAAC, 0x54E1,\t0xEAAD, 0x5713, 0xEAAE, 0x5712, 0xEAAF, 0x57A3, 0xEAB0, 0x5A9B,\n\t0xEAB1, 0x5AC4, 0xEAB2, 0x5BC3, 0xEAB3, 0x6028, 0xEAB4, 0x613F,\t0xEAB5, 0x63F4, 0xEAB6, 0x6C85, 0xEAB7, 0x6D39, 0xEAB8, 0x6E72,\n\t0xEAB9, 0x6E90, 0xEABA, 0x7230, 0xEABB, 0x733F, 0xEABC, 0x7457,\t0xEABD, 0x82D1, 0xEABE, 0x8881, 0xEABF, 0x8F45, 0xEAC0, 0x9060,\n\t0xEAC1, 0xF9C6, 0xEAC2, 0x9662, 0xEAC3, 0x9858, 0xEAC4, 0x9D1B,\t0xEAC5, 0x6708, 0xEAC6, 0x8D8A, 0xEAC7, 0x925E, 0xEAC8, 0x4F4D,\n\t0xEAC9, 0x5049, 0xEACA, 0x50DE, 0xEACB, 0x5371, 0xEACC, 0x570D,\t0xEACD, 0x59D4, 0xEACE, 0x5A01, 0xEACF, 0x5C09, 0xEAD0, 0x6170,\n\t0xEAD1, 0x6690, 0xEAD2, 0x6E2D, 0xEAD3, 0x7232, 0xEAD4, 0x744B,\t0xEAD5, 0x7DEF, 0xEAD6, 0x80C3, 0xEAD7, 0x840E, 0xEAD8, 0x8466,\n\t0xEAD9, 0x853F, 0xEADA, 0x875F, 0xEADB, 0x885B, 0xEADC, 0x8918,\t0xEADD, 0x8B02, 0xEADE, 0x9055, 0xEADF, 0x97CB, 0xEAE0, 0x9B4F,\n\t0xEAE1, 0x4E73, 0xEAE2, 0x4F91, 0xEAE3, 0x5112, 0xEAE4, 0x516A,\t0xEAE5, 0xF9C7, 0xEAE6, 0x552F, 0xEAE7, 0x55A9, 0xEAE8, 0x5B7A,\n\t0xEAE9, 0x5BA5, 0xEAEA, 0x5E7C, 0xEAEB, 0x5E7D, 0xEAEC, 0x5EBE,\t0xEAED, 0x60A0, 0xEAEE, 0x60DF, 0xEAEF, 0x6108, 0xEAF0, 0x6109,\n\t0xEAF1, 0x63C4, 0xEAF2, 0x6538, 0xEAF3, 0x6709, 0xEAF4, 0xF9C8,\t0xEAF5, 0x67D4, 0xEAF6, 0x67DA, 0xEAF7, 0xF9C9, 0xEAF8, 0x6961,\n\t0xEAF9, 0x6962, 0xEAFA, 0x6CB9, 0xEAFB, 0x6D27, 0xEAFC, 0xF9CA,\t0xEAFD, 0x6E38, 0xEAFE, 0xF9CB, 0xEBA1, 0x6FE1, 0xEBA2, 0x7336,\n\t0xEBA3, 0x7337, 0xEBA4, 0xF9CC, 0xEBA5, 0x745C, 0xEBA6, 0x7531,\t0xEBA7, 0xF9CD, 0xEBA8, 0x7652, 0xEBA9, 0xF9CE, 0xEBAA, 0xF9CF,\n\t0xEBAB, 0x7DAD, 0xEBAC, 0x81FE, 0xEBAD, 0x8438, 0xEBAE, 0x88D5,\t0xEBAF, 0x8A98, 0xEBB0, 0x8ADB, 0xEBB1, 0x8AED, 0xEBB2, 0x8E30,\n\t0xEBB3, 0x8E42, 0xEBB4, 0x904A, 0xEBB5, 0x903E, 0xEBB6, 0x907A,\t0xEBB7, 0x9149, 0xEBB8, 0x91C9, 0xEBB9, 0x936E, 0xEBBA, 0xF9D0,\n\t0xEBBB, 0xF9D1, 0xEBBC, 0x5809, 0xEBBD, 0xF9D2, 0xEBBE, 0x6BD3,\t0xEBBF, 0x8089, 0xEBC0, 0x80B2, 0xEBC1, 0xF9D3, 0xEBC2, 0xF9D4,\n\t0xEBC3, 0x5141, 0xEBC4, 0x596B, 0xEBC5, 0x5C39, 0xEBC6, 0xF9D5,\t0xEBC7, 0xF9D6, 0xEBC8, 0x6F64, 0xEBC9, 0x73A7, 0xEBCA, 0x80E4,\n\t0xEBCB, 0x8D07, 0xEBCC, 0xF9D7, 0xEBCD, 0x9217, 0xEBCE, 0x958F,\t0xEBCF, 0xF9D8, 0xEBD0, 0xF9D9, 0xEBD1, 0xF9DA, 0xEBD2, 0xF9DB,\n\t0xEBD3, 0x807F, 0xEBD4, 0x620E, 0xEBD5, 0x701C, 0xEBD6, 0x7D68,\t0xEBD7, 0x878D, 0xEBD8, 0xF9DC, 0xEBD9, 0x57A0, 0xEBDA, 0x6069,\n\t0xEBDB, 0x6147, 0xEBDC, 0x6BB7, 0xEBDD, 0x8ABE, 0xEBDE, 0x9280,\t0xEBDF, 0x96B1, 0xEBE0, 0x4E59, 0xEBE1, 0x541F, 0xEBE2, 0x6DEB,\n\t0xEBE3, 0x852D, 0xEBE4, 0x9670, 0xEBE5, 0x97F3, 0xEBE6, 0x98EE,\t0xEBE7, 0x63D6, 0xEBE8, 0x6CE3, 0xEBE9, 0x9091, 0xEBEA, 0x51DD,\n\t0xEBEB, 0x61C9, 0xEBEC, 0x81BA, 0xEBED, 0x9DF9, 0xEBEE, 0x4F9D,\t0xEBEF, 0x501A, 0xEBF0, 0x5100, 0xEBF1, 0x5B9C, 0xEBF2, 0x610F,\n\t0xEBF3, 0x61FF, 0xEBF4, 0x64EC, 0xEBF5, 0x6905, 0xEBF6, 0x6BC5,\t0xEBF7, 0x7591, 0xEBF8, 0x77E3, 0xEBF9, 0x7FA9, 0xEBFA, 0x8264,\n\t0xEBFB, 0x858F, 0xEBFC, 0x87FB, 0xEBFD, 0x8863, 0xEBFE, 0x8ABC,\t0xECA1, 0x8B70, 0xECA2, 0x91AB, 0xECA3, 0x4E8C, 0xECA4, 0x4EE5,\n\t0xECA5, 0x4F0A, 0xECA6, 0xF9DD, 0xECA7, 0xF9DE, 0xECA8, 0x5937,\t0xECA9, 0x59E8, 0xECAA, 0xF9DF, 0xECAB, 0x5DF2, 0xECAC, 0x5F1B,\n\t0xECAD, 0x5F5B, 0xECAE, 0x6021, 0xECAF, 0xF9E0, 0xECB0, 0xF9E1,\t0xECB1, 0xF9E2, 0xECB2, 0xF9E3, 0xECB3, 0x723E, 0xECB4, 0x73E5,\n\t0xECB5, 0xF9E4, 0xECB6, 0x7570, 0xECB7, 0x75CD, 0xECB8, 0xF9E5,\t0xECB9, 0x79FB, 0xECBA, 0xF9E6, 0xECBB, 0x800C, 0xECBC, 0x8033,\n\t0xECBD, 0x8084, 0xECBE, 0x82E1, 0xECBF, 0x8351, 0xECC0, 0xF9E7,\t0xECC1, 0xF9E8, 0xECC2, 0x8CBD, 0xECC3, 0x8CB3, 0xECC4, 0x9087,\n\t0xECC5, 0xF9E9, 0xECC6, 0xF9EA, 0xECC7, 0x98F4, 0xECC8, 0x990C,\t0xECC9, 0xF9EB, 0xECCA, 0xF9EC, 0xECCB, 0x7037, 0xECCC, 0x76CA,\n\t0xECCD, 0x7FCA, 0xECCE, 0x7FCC, 0xECCF, 0x7FFC, 0xECD0, 0x8B1A,\t0xECD1, 0x4EBA, 0xECD2, 0x4EC1, 0xECD3, 0x5203, 0xECD4, 0x5370,\n\t0xECD5, 0xF9ED, 0xECD6, 0x54BD, 0xECD7, 0x56E0, 0xECD8, 0x59FB,\t0xECD9, 0x5BC5, 0xECDA, 0x5F15, 0xECDB, 0x5FCD, 0xECDC, 0x6E6E,\n\t0xECDD, 0xF9EE, 0xECDE, 0xF9EF, 0xECDF, 0x7D6A, 0xECE0, 0x8335,\t0xECE1, 0xF9F0, 0xECE2, 0x8693, 0xECE3, 0x8A8D, 0xECE4, 0xF9F1,\n\t0xECE5, 0x976D, 0xECE6, 0x9777, 0xECE7, 0xF9F2, 0xECE8, 0xF9F3,\t0xECE9, 0x4E00, 0xECEA, 0x4F5A, 0xECEB, 0x4F7E, 0xECEC, 0x58F9,\n\t0xECED, 0x65E5, 0xECEE, 0x6EA2, 0xECEF, 0x9038, 0xECF0, 0x93B0,\t0xECF1, 0x99B9, 0xECF2, 0x4EFB, 0xECF3, 0x58EC, 0xECF4, 0x598A,\n\t0xECF5, 0x59D9, 0xECF6, 0x6041, 0xECF7, 0xF9F4, 0xECF8, 0xF9F5,\t0xECF9, 0x7A14, 0xECFA, 0xF9F6, 0xECFB, 0x834F, 0xECFC, 0x8CC3,\n\t0xECFD, 0x5165, 0xECFE, 0x5344, 0xEDA1, 0xF9F7, 0xEDA2, 0xF9F8,\t0xEDA3, 0xF9F9, 0xEDA4, 0x4ECD, 0xEDA5, 0x5269, 0xEDA6, 0x5B55,\n\t0xEDA7, 0x82BF, 0xEDA8, 0x4ED4, 0xEDA9, 0x523A, 0xEDAA, 0x54A8,\t0xEDAB, 0x59C9, 0xEDAC, 0x59FF, 0xEDAD, 0x5B50, 0xEDAE, 0x5B57,\n\t0xEDAF, 0x5B5C, 0xEDB0, 0x6063, 0xEDB1, 0x6148, 0xEDB2, 0x6ECB,\t0xEDB3, 0x7099, 0xEDB4, 0x716E, 0xEDB5, 0x7386, 0xEDB6, 0x74F7,\n\t0xEDB7, 0x75B5, 0xEDB8, 0x78C1, 0xEDB9, 0x7D2B, 0xEDBA, 0x8005,\t0xEDBB, 0x81EA, 0xEDBC, 0x8328, 0xEDBD, 0x8517, 0xEDBE, 0x85C9,\n\t0xEDBF, 0x8AEE, 0xEDC0, 0x8CC7, 0xEDC1, 0x96CC, 0xEDC2, 0x4F5C,\t0xEDC3, 0x52FA, 0xEDC4, 0x56BC, 0xEDC5, 0x65AB, 0xEDC6, 0x6628,\n\t0xEDC7, 0x707C, 0xEDC8, 0x70B8, 0xEDC9, 0x7235, 0xEDCA, 0x7DBD,\t0xEDCB, 0x828D, 0xEDCC, 0x914C, 0xEDCD, 0x96C0, 0xEDCE, 0x9D72,\n\t0xEDCF, 0x5B71, 0xEDD0, 0x68E7, 0xEDD1, 0x6B98, 0xEDD2, 0x6F7A,\t0xEDD3, 0x76DE, 0xEDD4, 0x5C91, 0xEDD5, 0x66AB, 0xEDD6, 0x6F5B,\n\t0xEDD7, 0x7BB4, 0xEDD8, 0x7C2A, 0xEDD9, 0x8836, 0xEDDA, 0x96DC,\t0xEDDB, 0x4E08, 0xEDDC, 0x4ED7, 0xEDDD, 0x5320, 0xEDDE, 0x5834,\n\t0xEDDF, 0x58BB, 0xEDE0, 0x58EF, 0xEDE1, 0x596C, 0xEDE2, 0x5C07,\t0xEDE3, 0x5E33, 0xEDE4, 0x5E84, 0xEDE5, 0x5F35, 0xEDE6, 0x638C,\n\t0xEDE7, 0x66B2, 0xEDE8, 0x6756, 0xEDE9, 0x6A1F, 0xEDEA, 0x6AA3,\t0xEDEB, 0x6B0C, 0xEDEC, 0x6F3F, 0xEDED, 0x7246, 0xEDEE, 0xF9FA,\n\t0xEDEF, 0x7350, 0xEDF0, 0x748B, 0xEDF1, 0x7AE0, 0xEDF2, 0x7CA7,\t0xEDF3, 0x8178, 0xEDF4, 0x81DF, 0xEDF5, 0x81E7, 0xEDF6, 0x838A,\n\t0xEDF7, 0x846C, 0xEDF8, 0x8523, 0xEDF9, 0x8594, 0xEDFA, 0x85CF,\t0xEDFB, 0x88DD, 0xEDFC, 0x8D13, 0xEDFD, 0x91AC, 0xEDFE, 0x9577,\n\t0xEEA1, 0x969C, 0xEEA2, 0x518D, 0xEEA3, 0x54C9, 0xEEA4, 0x5728,\t0xEEA5, 0x5BB0, 0xEEA6, 0x624D, 0xEEA7, 0x6750, 0xEEA8, 0x683D,\n\t0xEEA9, 0x6893, 0xEEAA, 0x6E3D, 0xEEAB, 0x6ED3, 0xEEAC, 0x707D,\t0xEEAD, 0x7E21, 0xEEAE, 0x88C1, 0xEEAF, 0x8CA1, 0xEEB0, 0x8F09,\n\t0xEEB1, 0x9F4B, 0xEEB2, 0x9F4E, 0xEEB3, 0x722D, 0xEEB4, 0x7B8F,\t0xEEB5, 0x8ACD, 0xEEB6, 0x931A, 0xEEB7, 0x4F47, 0xEEB8, 0x4F4E,\n\t0xEEB9, 0x5132, 0xEEBA, 0x5480, 0xEEBB, 0x59D0, 0xEEBC, 0x5E95,\t0xEEBD, 0x62B5, 0xEEBE, 0x6775, 0xEEBF, 0x696E, 0xEEC0, 0x6A17,\n\t0xEEC1, 0x6CAE, 0xEEC2, 0x6E1A, 0xEEC3, 0x72D9, 0xEEC4, 0x732A,\t0xEEC5, 0x75BD, 0xEEC6, 0x7BB8, 0xEEC7, 0x7D35, 0xEEC8, 0x82E7,\n\t0xEEC9, 0x83F9, 0xEECA, 0x8457, 0xEECB, 0x85F7, 0xEECC, 0x8A5B,\t0xEECD, 0x8CAF, 0xEECE, 0x8E87, 0xEECF, 0x9019, 0xEED0, 0x90B8,\n\t0xEED1, 0x96CE, 0xEED2, 0x9F5F, 0xEED3, 0x52E3, 0xEED4, 0x540A,\t0xEED5, 0x5AE1, 0xEED6, 0x5BC2, 0xEED7, 0x6458, 0xEED8, 0x6575,\n\t0xEED9, 0x6EF4, 0xEEDA, 0x72C4, 0xEEDB, 0xF9FB, 0xEEDC, 0x7684,\t0xEEDD, 0x7A4D, 0xEEDE, 0x7B1B, 0xEEDF, 0x7C4D, 0xEEE0, 0x7E3E,\n\t0xEEE1, 0x7FDF, 0xEEE2, 0x837B, 0xEEE3, 0x8B2B, 0xEEE4, 0x8CCA,\t0xEEE5, 0x8D64, 0xEEE6, 0x8DE1, 0xEEE7, 0x8E5F, 0xEEE8, 0x8FEA,\n\t0xEEE9, 0x8FF9, 0xEEEA, 0x9069, 0xEEEB, 0x93D1, 0xEEEC, 0x4F43,\t0xEEED, 0x4F7A, 0xEEEE, 0x50B3, 0xEEEF, 0x5168, 0xEEF0, 0x5178,\n\t0xEEF1, 0x524D, 0xEEF2, 0x526A, 0xEEF3, 0x5861, 0xEEF4, 0x587C,\t0xEEF5, 0x5960, 0xEEF6, 0x5C08, 0xEEF7, 0x5C55, 0xEEF8, 0x5EDB,\n\t0xEEF9, 0x609B, 0xEEFA, 0x6230, 0xEEFB, 0x6813, 0xEEFC, 0x6BBF,\t0xEEFD, 0x6C08, 0xEEFE, 0x6FB1, 0xEFA1, 0x714E, 0xEFA2, 0x7420,\n\t0xEFA3, 0x7530, 0xEFA4, 0x7538, 0xEFA5, 0x7551, 0xEFA6, 0x7672,\t0xEFA7, 0x7B4C, 0xEFA8, 0x7B8B, 0xEFA9, 0x7BAD, 0xEFAA, 0x7BC6,\n\t0xEFAB, 0x7E8F, 0xEFAC, 0x8A6E, 0xEFAD, 0x8F3E, 0xEFAE, 0x8F49,\t0xEFAF, 0x923F, 0xEFB0, 0x9293, 0xEFB1, 0x9322, 0xEFB2, 0x942B,\n\t0xEFB3, 0x96FB, 0xEFB4, 0x985A, 0xEFB5, 0x986B, 0xEFB6, 0x991E,\t0xEFB7, 0x5207, 0xEFB8, 0x622A, 0xEFB9, 0x6298, 0xEFBA, 0x6D59,\n\t0xEFBB, 0x7664, 0xEFBC, 0x7ACA, 0xEFBD, 0x7BC0, 0xEFBE, 0x7D76,\t0xEFBF, 0x5360, 0xEFC0, 0x5CBE, 0xEFC1, 0x5E97, 0xEFC2, 0x6F38,\n\t0xEFC3, 0x70B9, 0xEFC4, 0x7C98, 0xEFC5, 0x9711, 0xEFC6, 0x9B8E,\t0xEFC7, 0x9EDE, 0xEFC8, 0x63A5, 0xEFC9, 0x647A, 0xEFCA, 0x8776,\n\t0xEFCB, 0x4E01, 0xEFCC, 0x4E95, 0xEFCD, 0x4EAD, 0xEFCE, 0x505C,\t0xEFCF, 0x5075, 0xEFD0, 0x5448, 0xEFD1, 0x59C3, 0xEFD2, 0x5B9A,\n\t0xEFD3, 0x5E40, 0xEFD4, 0x5EAD, 0xEFD5, 0x5EF7, 0xEFD6, 0x5F81,\t0xEFD7, 0x60C5, 0xEFD8, 0x633A, 0xEFD9, 0x653F, 0xEFDA, 0x6574,\n\t0xEFDB, 0x65CC, 0xEFDC, 0x6676, 0xEFDD, 0x6678, 0xEFDE, 0x67FE,\t0xEFDF, 0x6968, 0xEFE0, 0x6A89, 0xEFE1, 0x6B63, 0xEFE2, 0x6C40,\n\t0xEFE3, 0x6DC0, 0xEFE4, 0x6DE8, 0xEFE5, 0x6E1F, 0xEFE6, 0x6E5E,\t0xEFE7, 0x701E, 0xEFE8, 0x70A1, 0xEFE9, 0x738E, 0xEFEA, 0x73FD,\n\t0xEFEB, 0x753A, 0xEFEC, 0x775B, 0xEFED, 0x7887, 0xEFEE, 0x798E,\t0xEFEF, 0x7A0B, 0xEFF0, 0x7A7D, 0xEFF1, 0x7CBE, 0xEFF2, 0x7D8E,\n\t0xEFF3, 0x8247, 0xEFF4, 0x8A02, 0xEFF5, 0x8AEA, 0xEFF6, 0x8C9E,\t0xEFF7, 0x912D, 0xEFF8, 0x914A, 0xEFF9, 0x91D8, 0xEFFA, 0x9266,\n\t0xEFFB, 0x92CC, 0xEFFC, 0x9320, 0xEFFD, 0x9706, 0xEFFE, 0x9756,\t0xF0A1, 0x975C, 0xF0A2, 0x9802, 0xF0A3, 0x9F0E, 0xF0A4, 0x5236,\n\t0xF0A5, 0x5291, 0xF0A6, 0x557C, 0xF0A7, 0x5824, 0xF0A8, 0x5E1D,\t0xF0A9, 0x5F1F, 0xF0AA, 0x608C, 0xF0AB, 0x63D0, 0xF0AC, 0x68AF,\n\t0xF0AD, 0x6FDF, 0xF0AE, 0x796D, 0xF0AF, 0x7B2C, 0xF0B0, 0x81CD,\t0xF0B1, 0x85BA, 0xF0B2, 0x88FD, 0xF0B3, 0x8AF8, 0xF0B4, 0x8E44,\n\t0xF0B5, 0x918D, 0xF0B6, 0x9664, 0xF0B7, 0x969B, 0xF0B8, 0x973D,\t0xF0B9, 0x984C, 0xF0BA, 0x9F4A, 0xF0BB, 0x4FCE, 0xF0BC, 0x5146,\n\t0xF0BD, 0x51CB, 0xF0BE, 0x52A9, 0xF0BF, 0x5632, 0xF0C0, 0x5F14,\t0xF0C1, 0x5F6B, 0xF0C2, 0x63AA, 0xF0C3, 0x64CD, 0xF0C4, 0x65E9,\n\t0xF0C5, 0x6641, 0xF0C6, 0x66FA, 0xF0C7, 0x66F9, 0xF0C8, 0x671D,\t0xF0C9, 0x689D, 0xF0CA, 0x68D7, 0xF0CB, 0x69FD, 0xF0CC, 0x6F15,\n\t0xF0CD, 0x6F6E, 0xF0CE, 0x7167, 0xF0CF, 0x71E5, 0xF0D0, 0x722A,\t0xF0D1, 0x74AA, 0xF0D2, 0x773A, 0xF0D3, 0x7956, 0xF0D4, 0x795A,\n\t0xF0D5, 0x79DF, 0xF0D6, 0x7A20, 0xF0D7, 0x7A95, 0xF0D8, 0x7C97,\t0xF0D9, 0x7CDF, 0xF0DA, 0x7D44, 0xF0DB, 0x7E70, 0xF0DC, 0x8087,\n\t0xF0DD, 0x85FB, 0xF0DE, 0x86A4, 0xF0DF, 0x8A54, 0xF0E0, 0x8ABF,\t0xF0E1, 0x8D99, 0xF0E2, 0x8E81, 0xF0E3, 0x9020, 0xF0E4, 0x906D,\n\t0xF0E5, 0x91E3, 0xF0E6, 0x963B, 0xF0E7, 0x96D5, 0xF0E8, 0x9CE5,\t0xF0E9, 0x65CF, 0xF0EA, 0x7C07, 0xF0EB, 0x8DB3, 0xF0EC, 0x93C3,\n\t0xF0ED, 0x5B58, 0xF0EE, 0x5C0A, 0xF0EF, 0x5352, 0xF0F0, 0x62D9,\t0xF0F1, 0x731D, 0xF0F2, 0x5027, 0xF0F3, 0x5B97, 0xF0F4, 0x5F9E,\n\t0xF0F5, 0x60B0, 0xF0F6, 0x616B, 0xF0F7, 0x68D5, 0xF0F8, 0x6DD9,\t0xF0F9, 0x742E, 0xF0FA, 0x7A2E, 0xF0FB, 0x7D42, 0xF0FC, 0x7D9C,\n\t0xF0FD, 0x7E31, 0xF0FE, 0x816B, 0xF1A1, 0x8E2A, 0xF1A2, 0x8E35,\t0xF1A3, 0x937E, 0xF1A4, 0x9418, 0xF1A5, 0x4F50, 0xF1A6, 0x5750,\n\t0xF1A7, 0x5DE6, 0xF1A8, 0x5EA7, 0xF1A9, 0x632B, 0xF1AA, 0x7F6A,\t0xF1AB, 0x4E3B, 0xF1AC, 0x4F4F, 0xF1AD, 0x4F8F, 0xF1AE, 0x505A,\n\t0xF1AF, 0x59DD, 0xF1B0, 0x80C4, 0xF1B1, 0x546A, 0xF1B2, 0x5468,\t0xF1B3, 0x55FE, 0xF1B4, 0x594F, 0xF1B5, 0x5B99, 0xF1B6, 0x5DDE,\n\t0xF1B7, 0x5EDA, 0xF1B8, 0x665D, 0xF1B9, 0x6731, 0xF1BA, 0x67F1,\t0xF1BB, 0x682A, 0xF1BC, 0x6CE8, 0xF1BD, 0x6D32, 0xF1BE, 0x6E4A,\n\t0xF1BF, 0x6F8D, 0xF1C0, 0x70B7, 0xF1C1, 0x73E0, 0xF1C2, 0x7587,\t0xF1C3, 0x7C4C, 0xF1C4, 0x7D02, 0xF1C5, 0x7D2C, 0xF1C6, 0x7DA2,\n\t0xF1C7, 0x821F, 0xF1C8, 0x86DB, 0xF1C9, 0x8A3B, 0xF1CA, 0x8A85,\t0xF1CB, 0x8D70, 0xF1CC, 0x8E8A, 0xF1CD, 0x8F33, 0xF1CE, 0x9031,\n\t0xF1CF, 0x914E, 0xF1D0, 0x9152, 0xF1D1, 0x9444, 0xF1D2, 0x99D0,\t0xF1D3, 0x7AF9, 0xF1D4, 0x7CA5, 0xF1D5, 0x4FCA, 0xF1D6, 0x5101,\n\t0xF1D7, 0x51C6, 0xF1D8, 0x57C8, 0xF1D9, 0x5BEF, 0xF1DA, 0x5CFB,\t0xF1DB, 0x6659, 0xF1DC, 0x6A3D, 0xF1DD, 0x6D5A, 0xF1DE, 0x6E96,\n\t0xF1DF, 0x6FEC, 0xF1E0, 0x710C, 0xF1E1, 0x756F, 0xF1E2, 0x7AE3,\t0xF1E3, 0x8822, 0xF1E4, 0x9021, 0xF1E5, 0x9075, 0xF1E6, 0x96CB,\n\t0xF1E7, 0x99FF, 0xF1E8, 0x8301, 0xF1E9, 0x4E2D, 0xF1EA, 0x4EF2,\t0xF1EB, 0x8846, 0xF1EC, 0x91CD, 0xF1ED, 0x537D, 0xF1EE, 0x6ADB,\n\t0xF1EF, 0x696B, 0xF1F0, 0x6C41, 0xF1F1, 0x847A, 0xF1F2, 0x589E,\t0xF1F3, 0x618E, 0xF1F4, 0x66FE, 0xF1F5, 0x62EF, 0xF1F6, 0x70DD,\n\t0xF1F7, 0x7511, 0xF1F8, 0x75C7, 0xF1F9, 0x7E52, 0xF1FA, 0x84B8,\t0xF1FB, 0x8B49, 0xF1FC, 0x8D08, 0xF1FD, 0x4E4B, 0xF1FE, 0x53EA,\n\t0xF2A1, 0x54AB, 0xF2A2, 0x5730, 0xF2A3, 0x5740, 0xF2A4, 0x5FD7,\t0xF2A5, 0x6301, 0xF2A6, 0x6307, 0xF2A7, 0x646F, 0xF2A8, 0x652F,\n\t0xF2A9, 0x65E8, 0xF2AA, 0x667A, 0xF2AB, 0x679D, 0xF2AC, 0x67B3,\t0xF2AD, 0x6B62, 0xF2AE, 0x6C60, 0xF2AF, 0x6C9A, 0xF2B0, 0x6F2C,\n\t0xF2B1, 0x77E5, 0xF2B2, 0x7825, 0xF2B3, 0x7949, 0xF2B4, 0x7957,\t0xF2B5, 0x7D19, 0xF2B6, 0x80A2, 0xF2B7, 0x8102, 0xF2B8, 0x81F3,\n\t0xF2B9, 0x829D, 0xF2BA, 0x82B7, 0xF2BB, 0x8718, 0xF2BC, 0x8A8C,\t0xF2BD, 0xF9FC, 0xF2BE, 0x8D04, 0xF2BF, 0x8DBE, 0xF2C0, 0x9072,\n\t0xF2C1, 0x76F4, 0xF2C2, 0x7A19, 0xF2C3, 0x7A37, 0xF2C4, 0x7E54,\t0xF2C5, 0x8077, 0xF2C6, 0x5507, 0xF2C7, 0x55D4, 0xF2C8, 0x5875,\n\t0xF2C9, 0x632F, 0xF2CA, 0x6422, 0xF2CB, 0x6649, 0xF2CC, 0x664B,\t0xF2CD, 0x686D, 0xF2CE, 0x699B, 0xF2CF, 0x6B84, 0xF2D0, 0x6D25,\n\t0xF2D1, 0x6EB1, 0xF2D2, 0x73CD, 0xF2D3, 0x7468, 0xF2D4, 0x74A1,\t0xF2D5, 0x755B, 0xF2D6, 0x75B9, 0xF2D7, 0x76E1, 0xF2D8, 0x771E,\n\t0xF2D9, 0x778B, 0xF2DA, 0x79E6, 0xF2DB, 0x7E09, 0xF2DC, 0x7E1D,\t0xF2DD, 0x81FB, 0xF2DE, 0x852F, 0xF2DF, 0x8897, 0xF2E0, 0x8A3A,\n\t0xF2E1, 0x8CD1, 0xF2E2, 0x8EEB, 0xF2E3, 0x8FB0, 0xF2E4, 0x9032,\t0xF2E5, 0x93AD, 0xF2E6, 0x9663, 0xF2E7, 0x9673, 0xF2E8, 0x9707,\n\t0xF2E9, 0x4F84, 0xF2EA, 0x53F1, 0xF2EB, 0x59EA, 0xF2EC, 0x5AC9,\t0xF2ED, 0x5E19, 0xF2EE, 0x684E, 0xF2EF, 0x74C6, 0xF2F0, 0x75BE,\n\t0xF2F1, 0x79E9, 0xF2F2, 0x7A92, 0xF2F3, 0x81A3, 0xF2F4, 0x86ED,\t0xF2F5, 0x8CEA, 0xF2F6, 0x8DCC, 0xF2F7, 0x8FED, 0xF2F8, 0x659F,\n\t0xF2F9, 0x6715, 0xF2FA, 0xF9FD, 0xF2FB, 0x57F7, 0xF2FC, 0x6F57,\t0xF2FD, 0x7DDD, 0xF2FE, 0x8F2F, 0xF3A1, 0x93F6, 0xF3A2, 0x96C6,\n\t0xF3A3, 0x5FB5, 0xF3A4, 0x61F2, 0xF3A5, 0x6F84, 0xF3A6, 0x4E14,\t0xF3A7, 0x4F98, 0xF3A8, 0x501F, 0xF3A9, 0x53C9, 0xF3AA, 0x55DF,\n\t0xF3AB, 0x5D6F, 0xF3AC, 0x5DEE, 0xF3AD, 0x6B21, 0xF3AE, 0x6B64,\t0xF3AF, 0x78CB, 0xF3B0, 0x7B9A, 0xF3B1, 0xF9FE, 0xF3B2, 0x8E49,\n\t0xF3B3, 0x8ECA, 0xF3B4, 0x906E, 0xF3B5, 0x6349, 0xF3B6, 0x643E,\t0xF3B7, 0x7740, 0xF3B8, 0x7A84, 0xF3B9, 0x932F, 0xF3BA, 0x947F,\n\t0xF3BB, 0x9F6A, 0xF3BC, 0x64B0, 0xF3BD, 0x6FAF, 0xF3BE, 0x71E6,\t0xF3BF, 0x74A8, 0xF3C0, 0x74DA, 0xF3C1, 0x7AC4, 0xF3C2, 0x7C12,\n\t0xF3C3, 0x7E82, 0xF3C4, 0x7CB2, 0xF3C5, 0x7E98, 0xF3C6, 0x8B9A,\t0xF3C7, 0x8D0A, 0xF3C8, 0x947D, 0xF3C9, 0x9910, 0xF3CA, 0x994C,\n\t0xF3CB, 0x5239, 0xF3CC, 0x5BDF, 0xF3CD, 0x64E6, 0xF3CE, 0x672D,\t0xF3CF, 0x7D2E, 0xF3D0, 0x50ED, 0xF3D1, 0x53C3, 0xF3D2, 0x5879,\n\t0xF3D3, 0x6158, 0xF3D4, 0x6159, 0xF3D5, 0x61FA, 0xF3D6, 0x65AC,\t0xF3D7, 0x7AD9, 0xF3D8, 0x8B92, 0xF3D9, 0x8B96, 0xF3DA, 0x5009,\n\t0xF3DB, 0x5021, 0xF3DC, 0x5275, 0xF3DD, 0x5531, 0xF3DE, 0x5A3C,\t0xF3DF, 0x5EE0, 0xF3E0, 0x5F70, 0xF3E1, 0x6134, 0xF3E2, 0x655E,\n\t0xF3E3, 0x660C, 0xF3E4, 0x6636, 0xF3E5, 0x66A2, 0xF3E6, 0x69CD,\t0xF3E7, 0x6EC4, 0xF3E8, 0x6F32, 0xF3E9, 0x7316, 0xF3EA, 0x7621,\n\t0xF3EB, 0x7A93, 0xF3EC, 0x8139, 0xF3ED, 0x8259, 0xF3EE, 0x83D6,\t0xF3EF, 0x84BC, 0xF3F0, 0x50B5, 0xF3F1, 0x57F0, 0xF3F2, 0x5BC0,\n\t0xF3F3, 0x5BE8, 0xF3F4, 0x5F69, 0xF3F5, 0x63A1, 0xF3F6, 0x7826,\t0xF3F7, 0x7DB5, 0xF3F8, 0x83DC, 0xF3F9, 0x8521, 0xF3FA, 0x91C7,\n\t0xF3FB, 0x91F5, 0xF3FC, 0x518A, 0xF3FD, 0x67F5, 0xF3FE, 0x7B56,\t0xF4A1, 0x8CAC, 0xF4A2, 0x51C4, 0xF4A3, 0x59BB, 0xF4A4, 0x60BD,\n\t0xF4A5, 0x8655, 0xF4A6, 0x501C, 0xF4A7, 0xF9FF, 0xF4A8, 0x5254,\t0xF4A9, 0x5C3A, 0xF4AA, 0x617D, 0xF4AB, 0x621A, 0xF4AC, 0x62D3,\n\t0xF4AD, 0x64F2, 0xF4AE, 0x65A5, 0xF4AF, 0x6ECC, 0xF4B0, 0x7620,\t0xF4B1, 0x810A, 0xF4B2, 0x8E60, 0xF4B3, 0x965F, 0xF4B4, 0x96BB,\n\t0xF4B5, 0x4EDF, 0xF4B6, 0x5343, 0xF4B7, 0x5598, 0xF4B8, 0x5929,\t0xF4B9, 0x5DDD, 0xF4BA, 0x64C5, 0xF4BB, 0x6CC9, 0xF4BC, 0x6DFA,\n\t0xF4BD, 0x7394, 0xF4BE, 0x7A7F, 0xF4BF, 0x821B, 0xF4C0, 0x85A6,\t0xF4C1, 0x8CE4, 0xF4C2, 0x8E10, 0xF4C3, 0x9077, 0xF4C4, 0x91E7,\n\t0xF4C5, 0x95E1, 0xF4C6, 0x9621, 0xF4C7, 0x97C6, 0xF4C8, 0x51F8,\t0xF4C9, 0x54F2, 0xF4CA, 0x5586, 0xF4CB, 0x5FB9, 0xF4CC, 0x64A4,\n\t0xF4CD, 0x6F88, 0xF4CE, 0x7DB4, 0xF4CF, 0x8F1F, 0xF4D0, 0x8F4D,\t0xF4D1, 0x9435, 0xF4D2, 0x50C9, 0xF4D3, 0x5C16, 0xF4D4, 0x6CBE,\n\t0xF4D5, 0x6DFB, 0xF4D6, 0x751B, 0xF4D7, 0x77BB, 0xF4D8, 0x7C3D,\t0xF4D9, 0x7C64, 0xF4DA, 0x8A79, 0xF4DB, 0x8AC2, 0xF4DC, 0x581E,\n\t0xF4DD, 0x59BE, 0xF4DE, 0x5E16, 0xF4DF, 0x6377, 0xF4E0, 0x7252,\t0xF4E1, 0x758A, 0xF4E2, 0x776B, 0xF4E3, 0x8ADC, 0xF4E4, 0x8CBC,\n\t0xF4E5, 0x8F12, 0xF4E6, 0x5EF3, 0xF4E7, 0x6674, 0xF4E8, 0x6DF8,\t0xF4E9, 0x807D, 0xF4EA, 0x83C1, 0xF4EB, 0x8ACB, 0xF4EC, 0x9751,\n\t0xF4ED, 0x9BD6, 0xF4EE, 0xFA00, 0xF4EF, 0x5243, 0xF4F0, 0x66FF,\t0xF4F1, 0x6D95, 0xF4F2, 0x6EEF, 0xF4F3, 0x7DE0, 0xF4F4, 0x8AE6,\n\t0xF4F5, 0x902E, 0xF4F6, 0x905E, 0xF4F7, 0x9AD4, 0xF4F8, 0x521D,\t0xF4F9, 0x527F, 0xF4FA, 0x54E8, 0xF4FB, 0x6194, 0xF4FC, 0x6284,\n\t0xF4FD, 0x62DB, 0xF4FE, 0x68A2, 0xF5A1, 0x6912, 0xF5A2, 0x695A,\t0xF5A3, 0x6A35, 0xF5A4, 0x7092, 0xF5A5, 0x7126, 0xF5A6, 0x785D,\n\t0xF5A7, 0x7901, 0xF5A8, 0x790E, 0xF5A9, 0x79D2, 0xF5AA, 0x7A0D,\t0xF5AB, 0x8096, 0xF5AC, 0x8278, 0xF5AD, 0x82D5, 0xF5AE, 0x8349,\n\t0xF5AF, 0x8549, 0xF5B0, 0x8C82, 0xF5B1, 0x8D85, 0xF5B2, 0x9162,\t0xF5B3, 0x918B, 0xF5B4, 0x91AE, 0xF5B5, 0x4FC3, 0xF5B6, 0x56D1,\n\t0xF5B7, 0x71ED, 0xF5B8, 0x77D7, 0xF5B9, 0x8700, 0xF5BA, 0x89F8,\t0xF5BB, 0x5BF8, 0xF5BC, 0x5FD6, 0xF5BD, 0x6751, 0xF5BE, 0x90A8,\n\t0xF5BF, 0x53E2, 0xF5C0, 0x585A, 0xF5C1, 0x5BF5, 0xF5C2, 0x60A4,\t0xF5C3, 0x6181, 0xF5C4, 0x6460, 0xF5C5, 0x7E3D, 0xF5C6, 0x8070,\n\t0xF5C7, 0x8525, 0xF5C8, 0x9283, 0xF5C9, 0x64AE, 0xF5CA, 0x50AC,\t0xF5CB, 0x5D14, 0xF5CC, 0x6700, 0xF5CD, 0x589C, 0xF5CE, 0x62BD,\n\t0xF5CF, 0x63A8, 0xF5D0, 0x690E, 0xF5D1, 0x6978, 0xF5D2, 0x6A1E,\t0xF5D3, 0x6E6B, 0xF5D4, 0x76BA, 0xF5D5, 0x79CB, 0xF5D6, 0x82BB,\n\t0xF5D7, 0x8429, 0xF5D8, 0x8ACF, 0xF5D9, 0x8DA8, 0xF5DA, 0x8FFD,\t0xF5DB, 0x9112, 0xF5DC, 0x914B, 0xF5DD, 0x919C, 0xF5DE, 0x9310,\n\t0xF5DF, 0x9318, 0xF5E0, 0x939A, 0xF5E1, 0x96DB, 0xF5E2, 0x9A36,\t0xF5E3, 0x9C0D, 0xF5E4, 0x4E11, 0xF5E5, 0x755C, 0xF5E6, 0x795D,\n\t0xF5E7, 0x7AFA, 0xF5E8, 0x7B51, 0xF5E9, 0x7BC9, 0xF5EA, 0x7E2E,\t0xF5EB, 0x84C4, 0xF5EC, 0x8E59, 0xF5ED, 0x8E74, 0xF5EE, 0x8EF8,\n\t0xF5EF, 0x9010, 0xF5F0, 0x6625, 0xF5F1, 0x693F, 0xF5F2, 0x7443,\t0xF5F3, 0x51FA, 0xF5F4, 0x672E, 0xF5F5, 0x9EDC, 0xF5F6, 0x5145,\n\t0xF5F7, 0x5FE0, 0xF5F8, 0x6C96, 0xF5F9, 0x87F2, 0xF5FA, 0x885D,\t0xF5FB, 0x8877, 0xF5FC, 0x60B4, 0xF5FD, 0x81B5, 0xF5FE, 0x8403,\n\t0xF6A1, 0x8D05, 0xF6A2, 0x53D6, 0xF6A3, 0x5439, 0xF6A4, 0x5634,\t0xF6A5, 0x5A36, 0xF6A6, 0x5C31, 0xF6A7, 0x708A, 0xF6A8, 0x7FE0,\n\t0xF6A9, 0x805A, 0xF6AA, 0x8106, 0xF6AB, 0x81ED, 0xF6AC, 0x8DA3,\t0xF6AD, 0x9189, 0xF6AE, 0x9A5F, 0xF6AF, 0x9DF2, 0xF6B0, 0x5074,\n\t0xF6B1, 0x4EC4, 0xF6B2, 0x53A0, 0xF6B3, 0x60FB, 0xF6B4, 0x6E2C,\t0xF6B5, 0x5C64, 0xF6B6, 0x4F88, 0xF6B7, 0x5024, 0xF6B8, 0x55E4,\n\t0xF6B9, 0x5CD9, 0xF6BA, 0x5E5F, 0xF6BB, 0x6065, 0xF6BC, 0x6894,\t0xF6BD, 0x6CBB, 0xF6BE, 0x6DC4, 0xF6BF, 0x71BE, 0xF6C0, 0x75D4,\n\t0xF6C1, 0x75F4, 0xF6C2, 0x7661, 0xF6C3, 0x7A1A, 0xF6C4, 0x7A49,\t0xF6C5, 0x7DC7, 0xF6C6, 0x7DFB, 0xF6C7, 0x7F6E, 0xF6C8, 0x81F4,\n\t0xF6C9, 0x86A9, 0xF6CA, 0x8F1C, 0xF6CB, 0x96C9, 0xF6CC, 0x99B3,\t0xF6CD, 0x9F52, 0xF6CE, 0x5247, 0xF6CF, 0x52C5, 0xF6D0, 0x98ED,\n\t0xF6D1, 0x89AA, 0xF6D2, 0x4E03, 0xF6D3, 0x67D2, 0xF6D4, 0x6F06,\t0xF6D5, 0x4FB5, 0xF6D6, 0x5BE2, 0xF6D7, 0x6795, 0xF6D8, 0x6C88,\n\t0xF6D9, 0x6D78, 0xF6DA, 0x741B, 0xF6DB, 0x7827, 0xF6DC, 0x91DD,\t0xF6DD, 0x937C, 0xF6DE, 0x87C4, 0xF6DF, 0x79E4, 0xF6E0, 0x7A31,\n\t0xF6E1, 0x5FEB, 0xF6E2, 0x4ED6, 0xF6E3, 0x54A4, 0xF6E4, 0x553E,\t0xF6E5, 0x58AE, 0xF6E6, 0x59A5, 0xF6E7, 0x60F0, 0xF6E8, 0x6253,\n\t0xF6E9, 0x62D6, 0xF6EA, 0x6736, 0xF6EB, 0x6955, 0xF6EC, 0x8235,\t0xF6ED, 0x9640, 0xF6EE, 0x99B1, 0xF6EF, 0x99DD, 0xF6F0, 0x502C,\n\t0xF6F1, 0x5353, 0xF6F2, 0x5544, 0xF6F3, 0x577C, 0xF6F4, 0xFA01,\t0xF6F5, 0x6258, 0xF6F6, 0xFA02, 0xF6F7, 0x64E2, 0xF6F8, 0x666B,\n\t0xF6F9, 0x67DD, 0xF6FA, 0x6FC1, 0xF6FB, 0x6FEF, 0xF6FC, 0x7422,\t0xF6FD, 0x7438, 0xF6FE, 0x8A17, 0xF7A1, 0x9438, 0xF7A2, 0x5451,\n\t0xF7A3, 0x5606, 0xF7A4, 0x5766, 0xF7A5, 0x5F48, 0xF7A6, 0x619A,\t0xF7A7, 0x6B4E, 0xF7A8, 0x7058, 0xF7A9, 0x70AD, 0xF7AA, 0x7DBB,\n\t0xF7AB, 0x8A95, 0xF7AC, 0x596A, 0xF7AD, 0x812B, 0xF7AE, 0x63A2,\t0xF7AF, 0x7708, 0xF7B0, 0x803D, 0xF7B1, 0x8CAA, 0xF7B2, 0x5854,\n\t0xF7B3, 0x642D, 0xF7B4, 0x69BB, 0xF7B5, 0x5B95, 0xF7B6, 0x5E11,\t0xF7B7, 0x6E6F, 0xF7B8, 0xFA03, 0xF7B9, 0x8569, 0xF7BA, 0x514C,\n\t0xF7BB, 0x53F0, 0xF7BC, 0x592A, 0xF7BD, 0x6020, 0xF7BE, 0x614B,\t0xF7BF, 0x6B86, 0xF7C0, 0x6C70, 0xF7C1, 0x6CF0, 0xF7C2, 0x7B1E,\n\t0xF7C3, 0x80CE, 0xF7C4, 0x82D4, 0xF7C5, 0x8DC6, 0xF7C6, 0x90B0,\t0xF7C7, 0x98B1, 0xF7C8, 0xFA04, 0xF7C9, 0x64C7, 0xF7CA, 0x6FA4,\n\t0xF7CB, 0x6491, 0xF7CC, 0x6504, 0xF7CD, 0x514E, 0xF7CE, 0x5410,\t0xF7CF, 0x571F, 0xF7D0, 0x8A0E, 0xF7D1, 0x615F, 0xF7D2, 0x6876,\n\t0xF7D3, 0xFA05, 0xF7D4, 0x75DB, 0xF7D5, 0x7B52, 0xF7D6, 0x7D71,\t0xF7D7, 0x901A, 0xF7D8, 0x5806, 0xF7D9, 0x69CC, 0xF7DA, 0x817F,\n\t0xF7DB, 0x892A, 0xF7DC, 0x9000, 0xF7DD, 0x9839, 0xF7DE, 0x5078,\t0xF7DF, 0x5957, 0xF7E0, 0x59AC, 0xF7E1, 0x6295, 0xF7E2, 0x900F,\n\t0xF7E3, 0x9B2A, 0xF7E4, 0x615D, 0xF7E5, 0x7279, 0xF7E6, 0x95D6,\t0xF7E7, 0x5761, 0xF7E8, 0x5A46, 0xF7E9, 0x5DF4, 0xF7EA, 0x628A,\n\t0xF7EB, 0x64AD, 0xF7EC, 0x64FA, 0xF7ED, 0x6777, 0xF7EE, 0x6CE2,\t0xF7EF, 0x6D3E, 0xF7F0, 0x722C, 0xF7F1, 0x7436, 0xF7F2, 0x7834,\n\t0xF7F3, 0x7F77, 0xF7F4, 0x82AD, 0xF7F5, 0x8DDB, 0xF7F6, 0x9817,\t0xF7F7, 0x5224, 0xF7F8, 0x5742, 0xF7F9, 0x677F, 0xF7FA, 0x7248,\n\t0xF7FB, 0x74E3, 0xF7FC, 0x8CA9, 0xF7FD, 0x8FA6, 0xF7FE, 0x9211,\t0xF8A1, 0x962A, 0xF8A2, 0x516B, 0xF8A3, 0x53ED, 0xF8A4, 0x634C,\n\t0xF8A5, 0x4F69, 0xF8A6, 0x5504, 0xF8A7, 0x6096, 0xF8A8, 0x6557,\t0xF8A9, 0x6C9B, 0xF8AA, 0x6D7F, 0xF8AB, 0x724C, 0xF8AC, 0x72FD,\n\t0xF8AD, 0x7A17, 0xF8AE, 0x8987, 0xF8AF, 0x8C9D, 0xF8B0, 0x5F6D,\t0xF8B1, 0x6F8E, 0xF8B2, 0x70F9, 0xF8B3, 0x81A8, 0xF8B4, 0x610E,\n\t0xF8B5, 0x4FBF, 0xF8B6, 0x504F, 0xF8B7, 0x6241, 0xF8B8, 0x7247,\t0xF8B9, 0x7BC7, 0xF8BA, 0x7DE8, 0xF8BB, 0x7FE9, 0xF8BC, 0x904D,\n\t0xF8BD, 0x97AD, 0xF8BE, 0x9A19, 0xF8BF, 0x8CB6, 0xF8C0, 0x576A,\t0xF8C1, 0x5E73, 0xF8C2, 0x67B0, 0xF8C3, 0x840D, 0xF8C4, 0x8A55,\n\t0xF8C5, 0x5420, 0xF8C6, 0x5B16, 0xF8C7, 0x5E63, 0xF8C8, 0x5EE2,\t0xF8C9, 0x5F0A, 0xF8CA, 0x6583, 0xF8CB, 0x80BA, 0xF8CC, 0x853D,\n\t0xF8CD, 0x9589, 0xF8CE, 0x965B, 0xF8CF, 0x4F48, 0xF8D0, 0x5305,\t0xF8D1, 0x530D, 0xF8D2, 0x530F, 0xF8D3, 0x5486, 0xF8D4, 0x54FA,\n\t0xF8D5, 0x5703, 0xF8D6, 0x5E03, 0xF8D7, 0x6016, 0xF8D8, 0x629B,\t0xF8D9, 0x62B1, 0xF8DA, 0x6355, 0xF8DB, 0xFA06, 0xF8DC, 0x6CE1,\n\t0xF8DD, 0x6D66, 0xF8DE, 0x75B1, 0xF8DF, 0x7832, 0xF8E0, 0x80DE,\t0xF8E1, 0x812F, 0xF8E2, 0x82DE, 0xF8E3, 0x8461, 0xF8E4, 0x84B2,\n\t0xF8E5, 0x888D, 0xF8E6, 0x8912, 0xF8E7, 0x900B, 0xF8E8, 0x92EA,\t0xF8E9, 0x98FD, 0xF8EA, 0x9B91, 0xF8EB, 0x5E45, 0xF8EC, 0x66B4,\n\t0xF8ED, 0x66DD, 0xF8EE, 0x7011, 0xF8EF, 0x7206, 0xF8F0, 0xFA07,\t0xF8F1, 0x4FF5, 0xF8F2, 0x527D, 0xF8F3, 0x5F6A, 0xF8F4, 0x6153,\n\t0xF8F5, 0x6753, 0xF8F6, 0x6A19, 0xF8F7, 0x6F02, 0xF8F8, 0x74E2,\t0xF8F9, 0x7968, 0xF8FA, 0x8868, 0xF8FB, 0x8C79, 0xF8FC, 0x98C7,\n\t0xF8FD, 0x98C4, 0xF8FE, 0x9A43, 0xF9A1, 0x54C1, 0xF9A2, 0x7A1F,\t0xF9A3, 0x6953, 0xF9A4, 0x8AF7, 0xF9A5, 0x8C4A, 0xF9A6, 0x98A8,\n\t0xF9A7, 0x99AE, 0xF9A8, 0x5F7C, 0xF9A9, 0x62AB, 0xF9AA, 0x75B2,\t0xF9AB, 0x76AE, 0xF9AC, 0x88AB, 0xF9AD, 0x907F, 0xF9AE, 0x9642,\n\t0xF9AF, 0x5339, 0xF9B0, 0x5F3C, 0xF9B1, 0x5FC5, 0xF9B2, 0x6CCC,\t0xF9B3, 0x73CC, 0xF9B4, 0x7562, 0xF9B5, 0x758B, 0xF9B6, 0x7B46,\n\t0xF9B7, 0x82FE, 0xF9B8, 0x999D, 0xF9B9, 0x4E4F, 0xF9BA, 0x903C,\t0xF9BB, 0x4E0B, 0xF9BC, 0x4F55, 0xF9BD, 0x53A6, 0xF9BE, 0x590F,\n\t0xF9BF, 0x5EC8, 0xF9C0, 0x6630, 0xF9C1, 0x6CB3, 0xF9C2, 0x7455,\t0xF9C3, 0x8377, 0xF9C4, 0x8766, 0xF9C5, 0x8CC0, 0xF9C6, 0x9050,\n\t0xF9C7, 0x971E, 0xF9C8, 0x9C15, 0xF9C9, 0x58D1, 0xF9CA, 0x5B78,\t0xF9CB, 0x8650, 0xF9CC, 0x8B14, 0xF9CD, 0x9DB4, 0xF9CE, 0x5BD2,\n\t0xF9CF, 0x6068, 0xF9D0, 0x608D, 0xF9D1, 0x65F1, 0xF9D2, 0x6C57,\t0xF9D3, 0x6F22, 0xF9D4, 0x6FA3, 0xF9D5, 0x701A, 0xF9D6, 0x7F55,\n\t0xF9D7, 0x7FF0, 0xF9D8, 0x9591, 0xF9D9, 0x9592, 0xF9DA, 0x9650,\t0xF9DB, 0x97D3, 0xF9DC, 0x5272, 0xF9DD, 0x8F44, 0xF9DE, 0x51FD,\n\t0xF9DF, 0x542B, 0xF9E0, 0x54B8, 0xF9E1, 0x5563, 0xF9E2, 0x558A,\t0xF9E3, 0x6ABB, 0xF9E4, 0x6DB5, 0xF9E5, 0x7DD8, 0xF9E6, 0x8266,\n\t0xF9E7, 0x929C, 0xF9E8, 0x9677, 0xF9E9, 0x9E79, 0xF9EA, 0x5408,\t0xF9EB, 0x54C8, 0xF9EC, 0x76D2, 0xF9ED, 0x86E4, 0xF9EE, 0x95A4,\n\t0xF9EF, 0x95D4, 0xF9F0, 0x965C, 0xF9F1, 0x4EA2, 0xF9F2, 0x4F09,\t0xF9F3, 0x59EE, 0xF9F4, 0x5AE6, 0xF9F5, 0x5DF7, 0xF9F6, 0x6052,\n\t0xF9F7, 0x6297, 0xF9F8, 0x676D, 0xF9F9, 0x6841, 0xF9FA, 0x6C86,\t0xF9FB, 0x6E2F, 0xF9FC, 0x7F38, 0xF9FD, 0x809B, 0xF9FE, 0x822A,\n\t0xFAA1, 0xFA08, 0xFAA2, 0xFA09, 0xFAA3, 0x9805, 0xFAA4, 0x4EA5,\t0xFAA5, 0x5055, 0xFAA6, 0x54B3, 0xFAA7, 0x5793, 0xFAA8, 0x595A,\n\t0xFAA9, 0x5B69, 0xFAAA, 0x5BB3, 0xFAAB, 0x61C8, 0xFAAC, 0x6977,\t0xFAAD, 0x6D77, 0xFAAE, 0x7023, 0xFAAF, 0x87F9, 0xFAB0, 0x89E3,\n\t0xFAB1, 0x8A72, 0xFAB2, 0x8AE7, 0xFAB3, 0x9082, 0xFAB4, 0x99ED,\t0xFAB5, 0x9AB8, 0xFAB6, 0x52BE, 0xFAB7, 0x6838, 0xFAB8, 0x5016,\n\t0xFAB9, 0x5E78, 0xFABA, 0x674F, 0xFABB, 0x8347, 0xFABC, 0x884C,\t0xFABD, 0x4EAB, 0xFABE, 0x5411, 0xFABF, 0x56AE, 0xFAC0, 0x73E6,\n\t0xFAC1, 0x9115, 0xFAC2, 0x97FF, 0xFAC3, 0x9909, 0xFAC4, 0x9957,\t0xFAC5, 0x9999, 0xFAC6, 0x5653, 0xFAC7, 0x589F, 0xFAC8, 0x865B,\n\t0xFAC9, 0x8A31, 0xFACA, 0x61B2, 0xFACB, 0x6AF6, 0xFACC, 0x737B,\t0xFACD, 0x8ED2, 0xFACE, 0x6B47, 0xFACF, 0x96AA, 0xFAD0, 0x9A57,\n\t0xFAD1, 0x5955, 0xFAD2, 0x7200, 0xFAD3, 0x8D6B, 0xFAD4, 0x9769,\t0xFAD5, 0x4FD4, 0xFAD6, 0x5CF4, 0xFAD7, 0x5F26, 0xFAD8, 0x61F8,\n\t0xFAD9, 0x665B, 0xFADA, 0x6CEB, 0xFADB, 0x70AB, 0xFADC, 0x7384,\t0xFADD, 0x73B9, 0xFADE, 0x73FE, 0xFADF, 0x7729, 0xFAE0, 0x774D,\n\t0xFAE1, 0x7D43, 0xFAE2, 0x7D62, 0xFAE3, 0x7E23, 0xFAE4, 0x8237,\t0xFAE5, 0x8852, 0xFAE6, 0xFA0A, 0xFAE7, 0x8CE2, 0xFAE8, 0x9249,\n\t0xFAE9, 0x986F, 0xFAEA, 0x5B51, 0xFAEB, 0x7A74, 0xFAEC, 0x8840,\t0xFAED, 0x9801, 0xFAEE, 0x5ACC, 0xFAEF, 0x4FE0, 0xFAF0, 0x5354,\n\t0xFAF1, 0x593E, 0xFAF2, 0x5CFD, 0xFAF3, 0x633E, 0xFAF4, 0x6D79,\t0xFAF5, 0x72F9, 0xFAF6, 0x8105, 0xFAF7, 0x8107, 0xFAF8, 0x83A2,\n\t0xFAF9, 0x92CF, 0xFAFA, 0x9830, 0xFAFB, 0x4EA8, 0xFAFC, 0x5144,\t0xFAFD, 0x5211, 0xFAFE, 0x578B, 0xFBA1, 0x5F62, 0xFBA2, 0x6CC2,\n\t0xFBA3, 0x6ECE, 0xFBA4, 0x7005, 0xFBA5, 0x7050, 0xFBA6, 0x70AF,\t0xFBA7, 0x7192, 0xFBA8, 0x73E9, 0xFBA9, 0x7469, 0xFBAA, 0x834A,\n\t0xFBAB, 0x87A2, 0xFBAC, 0x8861, 0xFBAD, 0x9008, 0xFBAE, 0x90A2,\t0xFBAF, 0x93A3, 0xFBB0, 0x99A8, 0xFBB1, 0x516E, 0xFBB2, 0x5F57,\n\t0xFBB3, 0x60E0, 0xFBB4, 0x6167, 0xFBB5, 0x66B3, 0xFBB6, 0x8559,\t0xFBB7, 0x8E4A, 0xFBB8, 0x91AF, 0xFBB9, 0x978B, 0xFBBA, 0x4E4E,\n\t0xFBBB, 0x4E92, 0xFBBC, 0x547C, 0xFBBD, 0x58D5, 0xFBBE, 0x58FA,\t0xFBBF, 0x597D, 0xFBC0, 0x5CB5, 0xFBC1, 0x5F27, 0xFBC2, 0x6236,\n\t0xFBC3, 0x6248, 0xFBC4, 0x660A, 0xFBC5, 0x6667, 0xFBC6, 0x6BEB,\t0xFBC7, 0x6D69, 0xFBC8, 0x6DCF, 0xFBC9, 0x6E56, 0xFBCA, 0x6EF8,\n\t0xFBCB, 0x6F94, 0xFBCC, 0x6FE0, 0xFBCD, 0x6FE9, 0xFBCE, 0x705D,\t0xFBCF, 0x72D0, 0xFBD0, 0x7425, 0xFBD1, 0x745A, 0xFBD2, 0x74E0,\n\t0xFBD3, 0x7693, 0xFBD4, 0x795C, 0xFBD5, 0x7CCA, 0xFBD6, 0x7E1E,\t0xFBD7, 0x80E1, 0xFBD8, 0x82A6, 0xFBD9, 0x846B, 0xFBDA, 0x84BF,\n\t0xFBDB, 0x864E, 0xFBDC, 0x865F, 0xFBDD, 0x8774, 0xFBDE, 0x8B77,\t0xFBDF, 0x8C6A, 0xFBE0, 0x93AC, 0xFBE1, 0x9800, 0xFBE2, 0x9865,\n\t0xFBE3, 0x60D1, 0xFBE4, 0x6216, 0xFBE5, 0x9177, 0xFBE6, 0x5A5A,\t0xFBE7, 0x660F, 0xFBE8, 0x6DF7, 0xFBE9, 0x6E3E, 0xFBEA, 0x743F,\n\t0xFBEB, 0x9B42, 0xFBEC, 0x5FFD, 0xFBED, 0x60DA, 0xFBEE, 0x7B0F,\t0xFBEF, 0x54C4, 0xFBF0, 0x5F18, 0xFBF1, 0x6C5E, 0xFBF2, 0x6CD3,\n\t0xFBF3, 0x6D2A, 0xFBF4, 0x70D8, 0xFBF5, 0x7D05, 0xFBF6, 0x8679,\t0xFBF7, 0x8A0C, 0xFBF8, 0x9D3B, 0xFBF9, 0x5316, 0xFBFA, 0x548C,\n\t0xFBFB, 0x5B05, 0xFBFC, 0x6A3A, 0xFBFD, 0x706B, 0xFBFE, 0x7575,\t0xFCA1, 0x798D, 0xFCA2, 0x79BE, 0xFCA3, 0x82B1, 0xFCA4, 0x83EF,\n\t0xFCA5, 0x8A71, 0xFCA6, 0x8B41, 0xFCA7, 0x8CA8, 0xFCA8, 0x9774,\t0xFCA9, 0xFA0B, 0xFCAA, 0x64F4, 0xFCAB, 0x652B, 0xFCAC, 0x78BA,\n\t0xFCAD, 0x78BB, 0xFCAE, 0x7A6B, 0xFCAF, 0x4E38, 0xFCB0, 0x559A,\t0xFCB1, 0x5950, 0xFCB2, 0x5BA6, 0xFCB3, 0x5E7B, 0xFCB4, 0x60A3,\n\t0xFCB5, 0x63DB, 0xFCB6, 0x6B61, 0xFCB7, 0x6665, 0xFCB8, 0x6853,\t0xFCB9, 0x6E19, 0xFCBA, 0x7165, 0xFCBB, 0x74B0, 0xFCBC, 0x7D08,\n\t0xFCBD, 0x9084, 0xFCBE, 0x9A69, 0xFCBF, 0x9C25, 0xFCC0, 0x6D3B,\t0xFCC1, 0x6ED1, 0xFCC2, 0x733E, 0xFCC3, 0x8C41, 0xFCC4, 0x95CA,\n\t0xFCC5, 0x51F0, 0xFCC6, 0x5E4C, 0xFCC7, 0x5FA8, 0xFCC8, 0x604D,\t0xFCC9, 0x60F6, 0xFCCA, 0x6130, 0xFCCB, 0x614C, 0xFCCC, 0x6643,\n\t0xFCCD, 0x6644, 0xFCCE, 0x69A5, 0xFCCF, 0x6CC1, 0xFCD0, 0x6E5F,\t0xFCD1, 0x6EC9, 0xFCD2, 0x6F62, 0xFCD3, 0x714C, 0xFCD4, 0x749C,\n\t0xFCD5, 0x7687, 0xFCD6, 0x7BC1, 0xFCD7, 0x7C27, 0xFCD8, 0x8352,\t0xFCD9, 0x8757, 0xFCDA, 0x9051, 0xFCDB, 0x968D, 0xFCDC, 0x9EC3,\n\t0xFCDD, 0x532F, 0xFCDE, 0x56DE, 0xFCDF, 0x5EFB, 0xFCE0, 0x5F8A,\t0xFCE1, 0x6062, 0xFCE2, 0x6094, 0xFCE3, 0x61F7, 0xFCE4, 0x6666,\n\t0xFCE5, 0x6703, 0xFCE6, 0x6A9C, 0xFCE7, 0x6DEE, 0xFCE8, 0x6FAE,\t0xFCE9, 0x7070, 0xFCEA, 0x736A, 0xFCEB, 0x7E6A, 0xFCEC, 0x81BE,\n\t0xFCED, 0x8334, 0xFCEE, 0x86D4, 0xFCEF, 0x8AA8, 0xFCF0, 0x8CC4,\t0xFCF1, 0x5283, 0xFCF2, 0x7372, 0xFCF3, 0x5B96, 0xFCF4, 0x6A6B,\n\t0xFCF5, 0x9404, 0xFCF6, 0x54EE, 0xFCF7, 0x5686, 0xFCF8, 0x5B5D,\t0xFCF9, 0x6548, 0xFCFA, 0x6585, 0xFCFB, 0x66C9, 0xFCFC, 0x689F,\n\t0xFCFD, 0x6D8D, 0xFCFE, 0x6DC6, 0xFDA1, 0x723B, 0xFDA2, 0x80B4,\t0xFDA3, 0x9175, 0xFDA4, 0x9A4D, 0xFDA5, 0x4FAF, 0xFDA6, 0x5019,\n\t0xFDA7, 0x539A, 0xFDA8, 0x540E, 0xFDA9, 0x543C, 0xFDAA, 0x5589,\t0xFDAB, 0x55C5, 0xFDAC, 0x5E3F, 0xFDAD, 0x5F8C, 0xFDAE, 0x673D,\n\t0xFDAF, 0x7166, 0xFDB0, 0x73DD, 0xFDB1, 0x9005, 0xFDB2, 0x52DB,\t0xFDB3, 0x52F3, 0xFDB4, 0x5864, 0xFDB5, 0x58CE, 0xFDB6, 0x7104,\n\t0xFDB7, 0x718F, 0xFDB8, 0x71FB, 0xFDB9, 0x85B0, 0xFDBA, 0x8A13,\t0xFDBB, 0x6688, 0xFDBC, 0x85A8, 0xFDBD, 0x55A7, 0xFDBE, 0x6684,\n\t0xFDBF, 0x714A, 0xFDC0, 0x8431, 0xFDC1, 0x5349, 0xFDC2, 0x5599,\t0xFDC3, 0x6BC1, 0xFDC4, 0x5F59, 0xFDC5, 0x5FBD, 0xFDC6, 0x63EE,\n\t0xFDC7, 0x6689, 0xFDC8, 0x7147, 0xFDC9, 0x8AF1, 0xFDCA, 0x8F1D,\t0xFDCB, 0x9EBE, 0xFDCC, 0x4F11, 0xFDCD, 0x643A, 0xFDCE, 0x70CB,\n\t0xFDCF, 0x7566, 0xFDD0, 0x8667, 0xFDD1, 0x6064, 0xFDD2, 0x8B4E,\t0xFDD3, 0x9DF8, 0xFDD4, 0x5147, 0xFDD5, 0x51F6, 0xFDD6, 0x5308,\n\t0xFDD7, 0x6D36, 0xFDD8, 0x80F8, 0xFDD9, 0x9ED1, 0xFDDA, 0x6615,\t0xFDDB, 0x6B23, 0xFDDC, 0x7098, 0xFDDD, 0x75D5, 0xFDDE, 0x5403,\n\t0xFDDF, 0x5C79, 0xFDE0, 0x7D07, 0xFDE1, 0x8A16, 0xFDE2, 0x6B20,\t0xFDE3, 0x6B3D, 0xFDE4, 0x6B46, 0xFDE5, 0x5438, 0xFDE6, 0x6070,\n\t0xFDE7, 0x6D3D, 0xFDE8, 0x7FD5, 0xFDE9, 0x8208, 0xFDEA, 0x50D6,\t0xFDEB, 0x51DE, 0xFDEC, 0x559C, 0xFDED, 0x566B, 0xFDEE, 0x56CD,\n\t0xFDEF, 0x59EC, 0xFDF0, 0x5B09, 0xFDF1, 0x5E0C, 0xFDF2, 0x6199,\t0xFDF3, 0x6198, 0xFDF4, 0x6231, 0xFDF5, 0x665E, 0xFDF6, 0x66E6,\n\t0xFDF7, 0x7199, 0xFDF8, 0x71B9, 0xFDF9, 0x71BA, 0xFDFA, 0x72A7,\t0xFDFB, 0x79A7, 0xFDFC, 0x7A00, 0xFDFD, 0x7FB2, 0xFDFE, 0x8A70,\n\t0, 0\n};\n#endif\n\n#if FF_CODE_PAGE == 950 || FF_CODE_PAGE == 0\t/* Traditional Chinese */\nstatic const WCHAR uni2oem950[] = {\t/* Unicode --> Big5 pairs */\n\t0x00A7, 0xA1B1, 0x00AF, 0xA1C2, 0x00B0, 0xA258, 0x00B1, 0xA1D3,\t0x00B7, 0xA150, 0x00D7, 0xA1D1, 0x00F7, 0xA1D2, 0x02C7, 0xA3BE,\n\t0x02C9, 0xA3BC, 0x02CA, 0xA3BD, 0x02CB, 0xA3BF, 0x02CD, 0xA1C5,\t0x02D9, 0xA3BB, 0x0391, 0xA344, 0x0392, 0xA345, 0x0393, 0xA346,\n\t0x0394, 0xA347, 0x0395, 0xA348, 0x0396, 0xA349, 0x0397, 0xA34A,\t0x0398, 0xA34B, 0x0399, 0xA34C, 0x039A, 0xA34D, 0x039B, 0xA34E,\n\t0x039C, 0xA34F, 0x039D, 0xA350, 0x039E, 0xA351, 0x039F, 0xA352,\t0x03A0, 0xA353, 0x03A1, 0xA354, 0x03A3, 0xA355, 0x03A4, 0xA356,\n\t0x03A5, 0xA357, 0x03A6, 0xA358, 0x03A7, 0xA359, 0x03A8, 0xA35A,\t0x03A9, 0xA35B, 0x03B1, 0xA35C, 0x03B2, 0xA35D, 0x03B3, 0xA35E,\n\t0x03B4, 0xA35F, 0x03B5, 0xA360, 0x03B6, 0xA361, 0x03B7, 0xA362,\t0x03B8, 0xA363, 0x03B9, 0xA364, 0x03BA, 0xA365, 0x03BB, 0xA366,\n\t0x03BC, 0xA367, 0x03BD, 0xA368, 0x03BE, 0xA369, 0x03BF, 0xA36A,\t0x03C0, 0xA36B, 0x03C1, 0xA36C, 0x03C3, 0xA36D, 0x03C4, 0xA36E,\n\t0x03C5, 0xA36F, 0x03C6, 0xA370, 0x03C7, 0xA371, 0x03C8, 0xA372,\t0x03C9, 0xA373, 0x2013, 0xA156, 0x2014, 0xA158, 0x2018, 0xA1A5,\n\t0x2019, 0xA1A6, 0x201C, 0xA1A7, 0x201D, 0xA1A8, 0x2025, 0xA14C,\t0x2026, 0xA14B, 0x2027, 0xA145, 0x2032, 0xA1AC, 0x2035, 0xA1AB,\n\t0x203B, 0xA1B0, 0x20AC, 0xA3E1, 0x2103, 0xA24A, 0x2105, 0xA1C1,\t0x2109, 0xA24B, 0x2160, 0xA2B9, 0x2161, 0xA2BA, 0x2162, 0xA2BB,\n\t0x2163, 0xA2BC, 0x2164, 0xA2BD, 0x2165, 0xA2BE, 0x2166, 0xA2BF,\t0x2167, 0xA2C0, 0x2168, 0xA2C1, 0x2169, 0xA2C2, 0x2190, 0xA1F6,\n\t0x2191, 0xA1F4, 0x2192, 0xA1F7, 0x2193, 0xA1F5, 0x2196, 0xA1F8,\t0x2197, 0xA1F9, 0x2198, 0xA1FB, 0x2199, 0xA1FA, 0x2215, 0xA241,\n\t0x221A, 0xA1D4, 0x221E, 0xA1DB, 0x221F, 0xA1E8, 0x2220, 0xA1E7,\t0x2223, 0xA1FD, 0x2225, 0xA1FC, 0x2229, 0xA1E4, 0x222A, 0xA1E5,\n\t0x222B, 0xA1EC, 0x222E, 0xA1ED, 0x2234, 0xA1EF, 0x2235, 0xA1EE,\t0x2252, 0xA1DC, 0x2260, 0xA1DA, 0x2261, 0xA1DD, 0x2266, 0xA1D8,\n\t0x2267, 0xA1D9, 0x2295, 0xA1F2, 0x2299, 0xA1F3, 0x22A5, 0xA1E6,\t0x22BF, 0xA1E9, 0x2500, 0xA277, 0x2502, 0xA278, 0x250C, 0xA27A,\n\t0x2510, 0xA27B, 0x2514, 0xA27C, 0x2518, 0xA27D, 0x251C, 0xA275,\t0x2524, 0xA274, 0x252C, 0xA273, 0x2534, 0xA272, 0x253C, 0xA271,\n\t0x2550, 0xA2A4, 0x2550, 0xF9F9, 0x2551, 0xF9F8, 0x2552, 0xF9E6,\t0x2553, 0xF9EF, 0x2554, 0xF9DD, 0x2555, 0xF9E8, 0x2556, 0xF9F1,\n\t0x2557, 0xF9DF, 0x2558, 0xF9EC, 0x2559, 0xF9F5, 0x255A, 0xF9E3,\t0x255B, 0xF9EE, 0x255C, 0xF9F7, 0x255D, 0xF9E5, 0x255E, 0xA2A5,\n\t0x255E, 0xF9E9, 0x255F, 0xF9F2, 0x2560, 0xF9E0, 0x2561, 0xA2A7,\t0x2561, 0xF9EB, 0x2562, 0xF9F4, 0x2563, 0xF9E2, 0x2564, 0xF9E7,\n\t0x2565, 0xF9F0, 0x2566, 0xF9DE, 0x2567, 0xF9ED, 0x2568, 0xF9F6,\t0x2569, 0xF9E4, 0x256A, 0xA2A6, 0x256A, 0xF9EA, 0x256B, 0xF9F3,\n\t0x256C, 0xF9E1, 0x256D, 0xA27E, 0x256D, 0xF9FA, 0x256E, 0xA2A1,\t0x256E, 0xF9FB, 0x256F, 0xA2A3, 0x256F, 0xF9FD, 0x2570, 0xA2A2,\n\t0x2570, 0xF9FC, 0x2571, 0xA2AC, 0x2572, 0xA2AD, 0x2573, 0xA2AE,\t0x2574, 0xA15A, 0x2581, 0xA262, 0x2582, 0xA263, 0x2583, 0xA264,\n\t0x2584, 0xA265, 0x2585, 0xA266, 0x2586, 0xA267, 0x2587, 0xA268,\t0x2588, 0xA269, 0x2589, 0xA270, 0x258A, 0xA26F, 0x258B, 0xA26E,\n\t0x258C, 0xA26D, 0x258D, 0xA26C, 0x258E, 0xA26B, 0x258F, 0xA26A,\t0x2593, 0xF9FE, 0x2594, 0xA276, 0x2595, 0xA279, 0x25A0, 0xA1BD,\n\t0x25A1, 0xA1BC, 0x25B2, 0xA1B6, 0x25B3, 0xA1B5, 0x25BC, 0xA1BF,\t0x25BD, 0xA1BE, 0x25C6, 0xA1BB, 0x25C7, 0xA1BA, 0x25CB, 0xA1B3,\n\t0x25CE, 0xA1B7, 0x25CF, 0xA1B4, 0x25E2, 0xA2A8, 0x25E3, 0xA2A9,\t0x25E4, 0xA2AB, 0x25E5, 0xA2AA, 0x2605, 0xA1B9, 0x2606, 0xA1B8,\n\t0x2640, 0xA1F0, 0x2642, 0xA1F1, 0x3000, 0xA140, 0x3001, 0xA142,\t0x3002, 0xA143, 0x3003, 0xA1B2, 0x3008, 0xA171, 0x3009, 0xA172,\n\t0x300A, 0xA16D, 0x300B, 0xA16E, 0x300C, 0xA175, 0x300D, 0xA176,\t0x300E, 0xA179, 0x300F, 0xA17A, 0x3010, 0xA169, 0x3011, 0xA16A,\n\t0x3012, 0xA245, 0x3014, 0xA165, 0x3015, 0xA166, 0x301D, 0xA1A9,\t0x301E, 0xA1AA, 0x3021, 0xA2C3, 0x3022, 0xA2C4, 0x3023, 0xA2C5,\n\t0x3024, 0xA2C6, 0x3025, 0xA2C7, 0x3026, 0xA2C8, 0x3027, 0xA2C9,\t0x3028, 0xA2CA, 0x3029, 0xA2CB, 0x3105, 0xA374, 0x3106, 0xA375,\n\t0x3107, 0xA376, 0x3108, 0xA377, 0x3109, 0xA378, 0x310A, 0xA379,\t0x310B, 0xA37A, 0x310C, 0xA37B, 0x310D, 0xA37C, 0x310E, 0xA37D,\n\t0x310F, 0xA37E, 0x3110, 0xA3A1, 0x3111, 0xA3A2, 0x3112, 0xA3A3,\t0x3113, 0xA3A4, 0x3114, 0xA3A5, 0x3115, 0xA3A6, 0x3116, 0xA3A7,\n\t0x3117, 0xA3A8, 0x3118, 0xA3A9, 0x3119, 0xA3AA, 0x311A, 0xA3AB,\t0x311B, 0xA3AC, 0x311C, 0xA3AD, 0x311D, 0xA3AE, 0x311E, 0xA3AF,\n\t0x311F, 0xA3B0, 0x3120, 0xA3B1, 0x3121, 0xA3B2, 0x3122, 0xA3B3,\t0x3123, 0xA3B4, 0x3124, 0xA3B5, 0x3125, 0xA3B6, 0x3126, 0xA3B7,\n\t0x3127, 0xA3B8, 0x3128, 0xA3B9, 0x3129, 0xA3BA, 0x32A3, 0xA1C0,\t0x338E, 0xA255, 0x338F, 0xA256, 0x339C, 0xA250, 0x339D, 0xA251,\n\t0x339E, 0xA252, 0x33A1, 0xA254, 0x33C4, 0xA257, 0x33CE, 0xA253,\t0x33D1, 0xA1EB, 0x33D2, 0xA1EA, 0x33D5, 0xA24F, 0x4E00, 0xA440,\n\t0x4E01, 0xA442, 0x4E03, 0xA443, 0x4E07, 0xC945, 0x4E08, 0xA456,\t0x4E09, 0xA454, 0x4E0A, 0xA457, 0x4E0B, 0xA455, 0x4E0C, 0xC946,\n\t0x4E0D, 0xA4A3, 0x4E0E, 0xC94F, 0x4E0F, 0xC94D, 0x4E10, 0xA4A2,\t0x4E11, 0xA4A1, 0x4E14, 0xA542, 0x4E15, 0xA541, 0x4E16, 0xA540,\n\t0x4E18, 0xA543, 0x4E19, 0xA4FE, 0x4E1E, 0xA5E0, 0x4E1F, 0xA5E1,\t0x4E26, 0xA8C3, 0x4E2B, 0xA458, 0x4E2D, 0xA4A4, 0x4E2E, 0xC950,\n\t0x4E30, 0xA4A5, 0x4E31, 0xC963, 0x4E32, 0xA6EA, 0x4E33, 0xCBB1,\t0x4E38, 0xA459, 0x4E39, 0xA4A6, 0x4E3B, 0xA544, 0x4E3C, 0xC964,\n\t0x4E42, 0xC940, 0x4E43, 0xA444, 0x4E45, 0xA45B, 0x4E47, 0xC947,\t0x4E48, 0xA45C, 0x4E4B, 0xA4A7, 0x4E4D, 0xA545, 0x4E4E, 0xA547,\n\t0x4E4F, 0xA546, 0x4E52, 0xA5E2, 0x4E53, 0xA5E3, 0x4E56, 0xA8C4,\t0x4E58, 0xADBC, 0x4E59, 0xA441, 0x4E5C, 0xC941, 0x4E5D, 0xA445,\n\t0x4E5E, 0xA45E, 0x4E5F, 0xA45D, 0x4E69, 0xA5E4, 0x4E73, 0xA8C5,\t0x4E7E, 0xB0AE, 0x4E7F, 0xD44B, 0x4E82, 0xB6C3, 0x4E83, 0xDCB1,\n\t0x4E84, 0xDCB2, 0x4E86, 0xA446, 0x4E88, 0xA4A9, 0x4E8B, 0xA8C6,\t0x4E8C, 0xA447, 0x4E8D, 0xC948, 0x4E8E, 0xA45F, 0x4E91, 0xA4AA,\n\t0x4E92, 0xA4AC, 0x4E93, 0xC951, 0x4E94, 0xA4AD, 0x4E95, 0xA4AB,\t0x4E99, 0xA5E5, 0x4E9B, 0xA8C7, 0x4E9E, 0xA8C8, 0x4E9F, 0xAB45,\n\t0x4EA1, 0xA460, 0x4EA2, 0xA4AE, 0x4EA4, 0xA5E6, 0x4EA5, 0xA5E8,\t0x4EA6, 0xA5E7, 0x4EA8, 0xA6EB, 0x4EAB, 0xA8C9, 0x4EAC, 0xA8CA,\n\t0x4EAD, 0xAB46, 0x4EAE, 0xAB47, 0x4EB3, 0xADBD, 0x4EB6, 0xDCB3,\t0x4EB9, 0xF6D6, 0x4EBA, 0xA448, 0x4EC0, 0xA4B0, 0x4EC1, 0xA4AF,\n\t0x4EC2, 0xC952, 0x4EC3, 0xA4B1, 0x4EC4, 0xA4B7, 0x4EC6, 0xA4B2,\t0x4EC7, 0xA4B3, 0x4EC8, 0xC954, 0x4EC9, 0xC953, 0x4ECA, 0xA4B5,\n\t0x4ECB, 0xA4B6, 0x4ECD, 0xA4B4, 0x4ED4, 0xA54A, 0x4ED5, 0xA54B,\t0x4ED6, 0xA54C, 0x4ED7, 0xA54D, 0x4ED8, 0xA549, 0x4ED9, 0xA550,\n\t0x4EDA, 0xC96A, 0x4EDC, 0xC966, 0x4EDD, 0xC969, 0x4EDE, 0xA551,\t0x4EDF, 0xA561, 0x4EE1, 0xC968, 0x4EE3, 0xA54E, 0x4EE4, 0xA54F,\n\t0x4EE5, 0xA548, 0x4EE8, 0xC965, 0x4EE9, 0xC967, 0x4EF0, 0xA5F5,\t0x4EF1, 0xC9B0, 0x4EF2, 0xA5F2, 0x4EF3, 0xA5F6, 0x4EF4, 0xC9BA,\n\t0x4EF5, 0xC9AE, 0x4EF6, 0xA5F3, 0x4EF7, 0xC9B2, 0x4EFB, 0xA5F4,\t0x4EFD, 0xA5F7, 0x4EFF, 0xA5E9, 0x4F00, 0xC9B1, 0x4F01, 0xA5F8,\n\t0x4F02, 0xC9B5, 0x4F04, 0xC9B9, 0x4F05, 0xC9B6, 0x4F08, 0xC9B3,\t0x4F09, 0xA5EA, 0x4F0A, 0xA5EC, 0x4F0B, 0xA5F9, 0x4F0D, 0xA5EE,\n\t0x4F0E, 0xC9AB, 0x4F0F, 0xA5F1, 0x4F10, 0xA5EF, 0x4F11, 0xA5F0,\t0x4F12, 0xC9BB, 0x4F13, 0xC9B8, 0x4F14, 0xC9AF, 0x4F15, 0xA5ED,\n\t0x4F18, 0xC9AC, 0x4F19, 0xA5EB, 0x4F1D, 0xC9B4, 0x4F22, 0xC9B7,\t0x4F2C, 0xC9AD, 0x4F2D, 0xCA66, 0x4F2F, 0xA742, 0x4F30, 0xA6F4,\n\t0x4F33, 0xCA67, 0x4F34, 0xA6F1, 0x4F36, 0xA744, 0x4F38, 0xA6F9,\t0x4F3A, 0xA6F8, 0x4F3B, 0xCA5B, 0x4F3C, 0xA6FC, 0x4F3D, 0xA6F7,\n\t0x4F3E, 0xCA60, 0x4F3F, 0xCA68, 0x4F41, 0xCA64, 0x4F43, 0xA6FA,\t0x4F46, 0xA6FD, 0x4F47, 0xA6EE, 0x4F48, 0xA747, 0x4F49, 0xCA5D,\n\t0x4F4C, 0xCBBD, 0x4F4D, 0xA6EC, 0x4F4E, 0xA743, 0x4F4F, 0xA6ED,\t0x4F50, 0xA6F5, 0x4F51, 0xA6F6, 0x4F52, 0xCA62, 0x4F53, 0xCA5E,\n\t0x4F54, 0xA6FB, 0x4F55, 0xA6F3, 0x4F56, 0xCA5A, 0x4F57, 0xA6EF,\t0x4F58, 0xCA65, 0x4F59, 0xA745, 0x4F5A, 0xA748, 0x4F5B, 0xA6F2,\n\t0x4F5C, 0xA740, 0x4F5D, 0xA746, 0x4F5E, 0xA6F0, 0x4F5F, 0xCA63,\t0x4F60, 0xA741, 0x4F61, 0xCA69, 0x4F62, 0xCA5C, 0x4F63, 0xA6FE,\n\t0x4F64, 0xCA5F, 0x4F67, 0xCA61, 0x4F69, 0xA8D8, 0x4F6A, 0xCBBF,\t0x4F6B, 0xCBCB, 0x4F6C, 0xA8D0, 0x4F6E, 0xCBCC, 0x4F6F, 0xA8CB,\n\t0x4F70, 0xA8D5, 0x4F73, 0xA8CE, 0x4F74, 0xCBB9, 0x4F75, 0xA8D6,\t0x4F76, 0xCBB8, 0x4F77, 0xCBBC, 0x4F78, 0xCBC3, 0x4F79, 0xCBC1,\n\t0x4F7A, 0xA8DE, 0x4F7B, 0xA8D9, 0x4F7C, 0xCBB3, 0x4F7D, 0xCBB5,\t0x4F7E, 0xA8DB, 0x4F7F, 0xA8CF, 0x4F80, 0xCBB6, 0x4F81, 0xCBC2,\n\t0x4F82, 0xCBC9, 0x4F83, 0xA8D4, 0x4F84, 0xCBBB, 0x4F85, 0xCBB4,\t0x4F86, 0xA8D3, 0x4F87, 0xCBB7, 0x4F88, 0xA8D7, 0x4F89, 0xCBBA,\n\t0x4F8B, 0xA8D2, 0x4F8D, 0xA8CD, 0x4F8F, 0xA8DC, 0x4F90, 0xCBC4,\t0x4F91, 0xA8DD, 0x4F92, 0xCBC8, 0x4F94, 0xCBC6, 0x4F95, 0xCBCA,\n\t0x4F96, 0xA8DA, 0x4F97, 0xCBBE, 0x4F98, 0xCBB2, 0x4F9A, 0xCBC0,\t0x4F9B, 0xA8D1, 0x4F9C, 0xCBC5, 0x4F9D, 0xA8CC, 0x4F9E, 0xCBC7,\n\t0x4FAE, 0xAB56, 0x4FAF, 0xAB4A, 0x4FB2, 0xCDE0, 0x4FB3, 0xCDE8,\t0x4FB5, 0xAB49, 0x4FB6, 0xAB51, 0x4FB7, 0xAB5D, 0x4FB9, 0xCDEE,\n\t0x4FBA, 0xCDEC, 0x4FBB, 0xCDE7, 0x4FBF, 0xAB4B, 0x4FC0, 0xCDED,\t0x4FC1, 0xCDE3, 0x4FC2, 0xAB59, 0x4FC3, 0xAB50, 0x4FC4, 0xAB58,\n\t0x4FC5, 0xCDDE, 0x4FC7, 0xCDEA, 0x4FC9, 0xCDE1, 0x4FCA, 0xAB54,\t0x4FCB, 0xCDE2, 0x4FCD, 0xCDDD, 0x4FCE, 0xAB5B, 0x4FCF, 0xAB4E,\n\t0x4FD0, 0xAB57, 0x4FD1, 0xAB4D, 0x4FD3, 0xCDDF, 0x4FD4, 0xCDE4,\t0x4FD6, 0xCDEB, 0x4FD7, 0xAB55, 0x4FD8, 0xAB52, 0x4FD9, 0xCDE6,\n\t0x4FDA, 0xAB5A, 0x4FDB, 0xCDE9, 0x4FDC, 0xCDE5, 0x4FDD, 0xAB4F,\t0x4FDE, 0xAB5C, 0x4FDF, 0xAB53, 0x4FE0, 0xAB4C, 0x4FE1, 0xAB48,\n\t0x4FEC, 0xCDEF, 0x4FEE, 0xADD7, 0x4FEF, 0xADC1, 0x4FF1, 0xADD1,\t0x4FF3, 0xADD6, 0x4FF4, 0xD0D0, 0x4FF5, 0xD0CF, 0x4FF6, 0xD0D4,\n\t0x4FF7, 0xD0D5, 0x4FF8, 0xADC4, 0x4FFA, 0xADCD, 0x4FFE, 0xADDA,\t0x5000, 0xADCE, 0x5005, 0xD0C9, 0x5006, 0xADC7, 0x5007, 0xD0CA,\n\t0x5009, 0xADDC, 0x500B, 0xADD3, 0x500C, 0xADBE, 0x500D, 0xADBF,\t0x500E, 0xD0DD, 0x500F, 0xB0BF, 0x5011, 0xADCC, 0x5012, 0xADCB,\n\t0x5013, 0xD0CB, 0x5014, 0xADCF, 0x5015, 0xD45B, 0x5016, 0xADC6,\t0x5017, 0xD0D6, 0x5018, 0xADD5, 0x5019, 0xADD4, 0x501A, 0xADCA,\n\t0x501B, 0xD0CE, 0x501C, 0xD0D7, 0x501E, 0xD0C8, 0x501F, 0xADC9,\t0x5020, 0xD0D8, 0x5021, 0xADD2, 0x5022, 0xD0CC, 0x5023, 0xADC0,\n\t0x5025, 0xADC3, 0x5026, 0xADC2, 0x5027, 0xD0D9, 0x5028, 0xADD0,\t0x5029, 0xADC5, 0x502A, 0xADD9, 0x502B, 0xADDB, 0x502C, 0xD0D3,\n\t0x502D, 0xADD8, 0x502F, 0xD0DB, 0x5030, 0xD0CD, 0x5031, 0xD0DC,\t0x5033, 0xD0D1, 0x5035, 0xD0DA, 0x5037, 0xD0D2, 0x503C, 0xADC8,\n\t0x5040, 0xD463, 0x5041, 0xD457, 0x5043, 0xB0B3, 0x5045, 0xD45C,\t0x5046, 0xD462, 0x5047, 0xB0B2, 0x5048, 0xD455, 0x5049, 0xB0B6,\n\t0x504A, 0xD459, 0x504B, 0xD452, 0x504C, 0xB0B4, 0x504D, 0xD456,\t0x504E, 0xB0B9, 0x504F, 0xB0BE, 0x5051, 0xD467, 0x5053, 0xD451,\n\t0x5055, 0xB0BA, 0x5057, 0xD466, 0x505A, 0xB0B5, 0x505B, 0xD458,\t0x505C, 0xB0B1, 0x505D, 0xD453, 0x505E, 0xD44F, 0x505F, 0xD45D,\n\t0x5060, 0xD450, 0x5061, 0xD44E, 0x5062, 0xD45A, 0x5063, 0xD460,\t0x5064, 0xD461, 0x5065, 0xB0B7, 0x5068, 0xD85B, 0x5069, 0xD45E,\n\t0x506A, 0xD44D, 0x506B, 0xD45F, 0x506D, 0xB0C1, 0x506E, 0xD464,\t0x506F, 0xB0C0, 0x5070, 0xD44C, 0x5072, 0xD454, 0x5073, 0xD465,\n\t0x5074, 0xB0BC, 0x5075, 0xB0BB, 0x5076, 0xB0B8, 0x5077, 0xB0BD,\t0x507A, 0xB0AF, 0x507D, 0xB0B0, 0x5080, 0xB3C8, 0x5082, 0xD85E,\n\t0x5083, 0xD857, 0x5085, 0xB3C5, 0x5087, 0xD85F, 0x508B, 0xD855,\t0x508C, 0xD858, 0x508D, 0xB3C4, 0x508E, 0xD859, 0x5091, 0xB3C7,\n\t0x5092, 0xD85D, 0x5094, 0xD853, 0x5095, 0xD852, 0x5096, 0xB3C9,\t0x5098, 0xB3CA, 0x5099, 0xB3C6, 0x509A, 0xB3CB, 0x509B, 0xD851,\n\t0x509C, 0xD85C, 0x509D, 0xD85A, 0x509E, 0xD854, 0x50A2, 0xB3C3,\t0x50A3, 0xD856, 0x50AC, 0xB6CA, 0x50AD, 0xB6C4, 0x50AE, 0xDCB7,\n\t0x50AF, 0xB6CD, 0x50B0, 0xDCBD, 0x50B1, 0xDCC0, 0x50B2, 0xB6C6,\t0x50B3, 0xB6C7, 0x50B4, 0xDCBA, 0x50B5, 0xB6C5, 0x50B6, 0xDCC3,\n\t0x50B7, 0xB6CB, 0x50B8, 0xDCC4, 0x50BA, 0xDCBF, 0x50BB, 0xB6CC,\t0x50BD, 0xDCB4, 0x50BE, 0xB6C9, 0x50BF, 0xDCB5, 0x50C1, 0xDCBE,\n\t0x50C2, 0xDCBC, 0x50C4, 0xDCB8, 0x50C5, 0xB6C8, 0x50C6, 0xDCB6,\t0x50C7, 0xB6CE, 0x50C8, 0xDCBB, 0x50C9, 0xDCC2, 0x50CA, 0xDCB9,\n\t0x50CB, 0xDCC1, 0x50CE, 0xB9B6, 0x50CF, 0xB9B3, 0x50D1, 0xB9B4,\t0x50D3, 0xE0F9, 0x50D4, 0xE0F1, 0x50D5, 0xB9B2, 0x50D6, 0xB9AF,\n\t0x50D7, 0xE0F2, 0x50DA, 0xB9B1, 0x50DB, 0xE0F5, 0x50DD, 0xE0F7,\t0x50E0, 0xE0FE, 0x50E3, 0xE0FD, 0x50E4, 0xE0F8, 0x50E5, 0xB9AE,\n\t0x50E6, 0xE0F0, 0x50E7, 0xB9AC, 0x50E8, 0xE0F3, 0x50E9, 0xB9B7,\t0x50EA, 0xE0F6, 0x50EC, 0xE0FA, 0x50ED, 0xB9B0, 0x50EE, 0xB9AD,\n\t0x50EF, 0xE0FC, 0x50F0, 0xE0FB, 0x50F1, 0xB9B5, 0x50F3, 0xE0F4,\t0x50F5, 0xBBF8, 0x50F6, 0xE4EC, 0x50F8, 0xE4E9, 0x50F9, 0xBBF9,\n\t0x50FB, 0xBBF7, 0x50FD, 0xE4F0, 0x50FE, 0xE4ED, 0x50FF, 0xE4E6,\t0x5100, 0xBBF6, 0x5102, 0xBBFA, 0x5103, 0xE4E7, 0x5104, 0xBBF5,\n\t0x5105, 0xBBFD, 0x5106, 0xE4EA, 0x5107, 0xE4EB, 0x5108, 0xBBFB,\t0x5109, 0xBBFC, 0x510A, 0xE4F1, 0x510B, 0xE4EE, 0x510C, 0xE4EF,\n\t0x5110, 0xBEAA, 0x5111, 0xE8F8, 0x5112, 0xBEA7, 0x5113, 0xE8F5,\t0x5114, 0xBEA9, 0x5115, 0xBEAB, 0x5117, 0xE8F6, 0x5118, 0xBEA8,\n\t0x511A, 0xE8F7, 0x511C, 0xE8F4, 0x511F, 0xC076, 0x5120, 0xECBD,\t0x5121, 0xC077, 0x5122, 0xECBB, 0x5124, 0xECBC, 0x5125, 0xECBA,\n\t0x5126, 0xECB9, 0x5129, 0xECBE, 0x512A, 0xC075, 0x512D, 0xEFB8,\t0x512E, 0xEFB9, 0x5130, 0xE4E8, 0x5131, 0xEFB7, 0x5132, 0xC078,\n\t0x5133, 0xC35F, 0x5134, 0xF1EB, 0x5135, 0xF1EC, 0x5137, 0xC4D7,\t0x5138, 0xC4D8, 0x5139, 0xF5C1, 0x513A, 0xF5C0, 0x513B, 0xC56C,\n\t0x513C, 0xC56B, 0x513D, 0xF7D0, 0x513F, 0xA449, 0x5140, 0xA461,\t0x5141, 0xA4B9, 0x5143, 0xA4B8, 0x5144, 0xA553, 0x5145, 0xA552,\n\t0x5146, 0xA5FC, 0x5147, 0xA5FB, 0x5148, 0xA5FD, 0x5149, 0xA5FA,\t0x514B, 0xA74A, 0x514C, 0xA749, 0x514D, 0xA74B, 0x5152, 0xA8E0,\n\t0x5154, 0xA8DF, 0x5155, 0xA8E1, 0x5157, 0xAB5E, 0x5159, 0xA259,\t0x515A, 0xD0DE, 0x515B, 0xA25A, 0x515C, 0xB0C2, 0x515D, 0xA25C,\n\t0x515E, 0xA25B, 0x515F, 0xD860, 0x5161, 0xA25D, 0x5162, 0xB9B8,\t0x5163, 0xA25E, 0x5165, 0xA44A, 0x5167, 0xA4BA, 0x5168, 0xA5FE,\n\t0x5169, 0xA8E2, 0x516B, 0xA44B, 0x516C, 0xA4BD, 0x516D, 0xA4BB,\t0x516E, 0xA4BC, 0x5171, 0xA640, 0x5175, 0xA74C, 0x5176, 0xA8E4,\n\t0x5177, 0xA8E3, 0x5178, 0xA8E5, 0x517C, 0xADDD, 0x5180, 0xBEAC,\t0x5187, 0xC94E, 0x5189, 0xA554, 0x518A, 0xA555, 0x518D, 0xA641,\n\t0x518F, 0xCA6A, 0x5191, 0xAB60, 0x5192, 0xAB5F, 0x5193, 0xD0E0,\t0x5194, 0xD0DF, 0x5195, 0xB0C3, 0x5197, 0xA4BE, 0x5198, 0xC955,\n\t0x519E, 0xCBCD, 0x51A0, 0xAB61, 0x51A2, 0xADE0, 0x51A4, 0xADDE,\t0x51A5, 0xADDF, 0x51AA, 0xBEAD, 0x51AC, 0xA556, 0x51B0, 0xA642,\n\t0x51B1, 0xC9BC, 0x51B6, 0xA74D, 0x51B7, 0xA74E, 0x51B9, 0xCA6B,\t0x51BC, 0xCBCE, 0x51BD, 0xA8E6, 0x51BE, 0xCBCF, 0x51C4, 0xD0E2,\n\t0x51C5, 0xD0E3, 0x51C6, 0xADE3, 0x51C8, 0xD0E4, 0x51CA, 0xD0E1,\t0x51CB, 0xADE4, 0x51CC, 0xADE2, 0x51CD, 0xADE1, 0x51CE, 0xD0E5,\n\t0x51D0, 0xD468, 0x51D4, 0xD861, 0x51D7, 0xDCC5, 0x51D8, 0xE140,\t0x51DC, 0xBBFE, 0x51DD, 0xBEAE, 0x51DE, 0xE8F9, 0x51E0, 0xA44C,\n\t0x51E1, 0xA45A, 0x51F0, 0xB0C4, 0x51F1, 0xB3CD, 0x51F3, 0xB9B9,\t0x51F5, 0xC942, 0x51F6, 0xA4BF, 0x51F8, 0xA559, 0x51F9, 0xA557,\n\t0x51FA, 0xA558, 0x51FD, 0xA8E7, 0x5200, 0xA44D, 0x5201, 0xA44E,\t0x5203, 0xA462, 0x5206, 0xA4C0, 0x5207, 0xA4C1, 0x5208, 0xA4C2,\n\t0x5209, 0xC9BE, 0x520A, 0xA55A, 0x520C, 0xC96B, 0x520E, 0xA646,\t0x5210, 0xC9BF, 0x5211, 0xA644, 0x5212, 0xA645, 0x5213, 0xC9BD,\n\t0x5216, 0xA647, 0x5217, 0xA643, 0x521C, 0xCA6C, 0x521D, 0xAAEC,\t0x521E, 0xCA6D, 0x5221, 0xCA6E, 0x5224, 0xA750, 0x5225, 0xA74F,\n\t0x5228, 0xA753, 0x5229, 0xA751, 0x522A, 0xA752, 0x522E, 0xA8ED,\t0x5230, 0xA8EC, 0x5231, 0xCBD4, 0x5232, 0xCBD1, 0x5233, 0xCBD2,\n\t0x5235, 0xCBD0, 0x5236, 0xA8EE, 0x5237, 0xA8EA, 0x5238, 0xA8E9,\t0x523A, 0xA8EB, 0x523B, 0xA8E8, 0x5241, 0xA8EF, 0x5243, 0xAB63,\n\t0x5244, 0xCDF0, 0x5246, 0xCBD3, 0x5247, 0xAB68, 0x5249, 0xCDF1,\t0x524A, 0xAB64, 0x524B, 0xAB67, 0x524C, 0xAB66, 0x524D, 0xAB65,\n\t0x524E, 0xAB62, 0x5252, 0xD0E8, 0x5254, 0xADE7, 0x5255, 0xD0EB,\t0x5256, 0xADE5, 0x525A, 0xD0E7, 0x525B, 0xADE8, 0x525C, 0xADE6,\n\t0x525D, 0xADE9, 0x525E, 0xD0E9, 0x525F, 0xD0EA, 0x5261, 0xD0E6,\t0x5262, 0xD0EC, 0x5269, 0xB3D1, 0x526A, 0xB0C5, 0x526B, 0xD469,\n\t0x526C, 0xD46B, 0x526D, 0xD46A, 0x526E, 0xD46C, 0x526F, 0xB0C6,\t0x5272, 0xB3CE, 0x5274, 0xB3CF, 0x5275, 0xB3D0, 0x5277, 0xB6D0,\n\t0x5278, 0xDCC7, 0x527A, 0xDCC6, 0x527B, 0xDCC8, 0x527C, 0xDCC9,\t0x527D, 0xB6D1, 0x527F, 0xB6CF, 0x5280, 0xE141, 0x5281, 0xE142,\n\t0x5282, 0xB9BB, 0x5283, 0xB9BA, 0x5284, 0xE35A, 0x5287, 0xBC40,\t0x5288, 0xBC41, 0x5289, 0xBC42, 0x528A, 0xBC44, 0x528B, 0xE4F2,\n\t0x528C, 0xE4F3, 0x528D, 0xBC43, 0x5291, 0xBEAF, 0x5293, 0xBEB0,\t0x5296, 0xF1ED, 0x5297, 0xF5C3, 0x5298, 0xF5C2, 0x5299, 0xF7D1,\n\t0x529B, 0xA44F, 0x529F, 0xA55C, 0x52A0, 0xA55B, 0x52A3, 0xA648,\t0x52A6, 0xC9C0, 0x52A9, 0xA755, 0x52AA, 0xA756, 0x52AB, 0xA754,\n\t0x52AC, 0xA757, 0x52AD, 0xCA6F, 0x52AE, 0xCA70, 0x52BB, 0xA8F1,\t0x52BC, 0xCBD5, 0x52BE, 0xA8F0, 0x52C0, 0xCDF2, 0x52C1, 0xAB6C,\n\t0x52C2, 0xCDF3, 0x52C3, 0xAB6B, 0x52C7, 0xAB69, 0x52C9, 0xAB6A,\t0x52CD, 0xD0ED, 0x52D2, 0xB0C7, 0x52D3, 0xD46E, 0x52D5, 0xB0CA,\n\t0x52D6, 0xD46D, 0x52D7, 0xB1E5, 0x52D8, 0xB0C9, 0x52D9, 0xB0C8,\t0x52DB, 0xB3D4, 0x52DD, 0xB3D3, 0x52DE, 0xB3D2, 0x52DF, 0xB6D2,\n\t0x52E2, 0xB6D5, 0x52E3, 0xB6D6, 0x52E4, 0xB6D4, 0x52E6, 0xB6D3,\t0x52E9, 0xE143, 0x52EB, 0xE144, 0x52EF, 0xE4F5, 0x52F0, 0xBC45,\n\t0x52F1, 0xE4F4, 0x52F3, 0xBEB1, 0x52F4, 0xECBF, 0x52F5, 0xC079,\t0x52F7, 0xF1EE, 0x52F8, 0xC455, 0x52FA, 0xA463, 0x52FB, 0xA4C3,\n\t0x52FC, 0xC956, 0x52FE, 0xA4C4, 0x52FF, 0xA4C5, 0x5305, 0xA55D,\t0x5306, 0xA55E, 0x5308, 0xA649, 0x5309, 0xCA71, 0x530A, 0xCBD6,\n\t0x530B, 0xCBD7, 0x530D, 0xAB6D, 0x530E, 0xD0EE, 0x530F, 0xB0CC,\t0x5310, 0xB0CB, 0x5311, 0xD863, 0x5312, 0xD862, 0x5315, 0xA450,\n\t0x5316, 0xA4C6, 0x5317, 0xA55F, 0x5319, 0xB0CD, 0x531A, 0xC943,\t0x531C, 0xC96C, 0x531D, 0xA560, 0x531F, 0xC9C2, 0x5320, 0xA64B,\n\t0x5321, 0xA64A, 0x5322, 0xC9C1, 0x5323, 0xA758, 0x532A, 0xADEA,\t0x532D, 0xD46F, 0x532F, 0xB6D7, 0x5330, 0xE145, 0x5331, 0xB9BC,\n\t0x5334, 0xE8FA, 0x5337, 0xF3FD, 0x5339, 0xA4C7, 0x533C, 0xCBD8,\t0x533D, 0xCDF4, 0x533E, 0xB0D0, 0x533F, 0xB0CE, 0x5340, 0xB0CF,\n\t0x5341, 0xA2CC, 0x5341, 0xA451, 0x5343, 0xA464, 0x5344, 0xA2CD,\t0x5345, 0xA2CE, 0x5345, 0xA4CA, 0x5347, 0xA4C9, 0x5348, 0xA4C8,\n\t0x5349, 0xA563, 0x534A, 0xA562, 0x534C, 0xC96D, 0x534D, 0xC9C3,\t0x5351, 0xA8F5, 0x5352, 0xA8F2, 0x5353, 0xA8F4, 0x5354, 0xA8F3,\n\t0x5357, 0xAB6E, 0x535A, 0xB3D5, 0x535C, 0xA452, 0x535E, 0xA4CB,\t0x5360, 0xA565, 0x5361, 0xA564, 0x5363, 0xCA72, 0x5366, 0xA8F6,\n\t0x536C, 0xC957, 0x536E, 0xA567, 0x536F, 0xA566, 0x5370, 0xA64C,\t0x5371, 0xA64D, 0x5372, 0xCA73, 0x5373, 0xA759, 0x5375, 0xA75A,\n\t0x5377, 0xA8F7, 0x5378, 0xA8F8, 0x5379, 0xA8F9, 0x537B, 0xAB6F,\t0x537C, 0xCDF5, 0x537F, 0xADEB, 0x5382, 0xC944, 0x5384, 0xA4CC,\n\t0x538A, 0xC9C4, 0x538E, 0xCA74, 0x538F, 0xCA75, 0x5392, 0xCBD9,\t0x5394, 0xCBDA, 0x5396, 0xCDF7, 0x5397, 0xCDF6, 0x5398, 0xCDF9,\n\t0x5399, 0xCDF8, 0x539A, 0xAB70, 0x539C, 0xD470, 0x539D, 0xADED,\t0x539E, 0xD0EF, 0x539F, 0xADEC, 0x53A4, 0xD864, 0x53A5, 0xB3D6,\n\t0x53A7, 0xD865, 0x53AC, 0xE146, 0x53AD, 0xB9BD, 0x53B2, 0xBC46,\t0x53B4, 0xF1EF, 0x53B9, 0xC958, 0x53BB, 0xA568, 0x53C3, 0xB0D1,\n\t0x53C8, 0xA453, 0x53C9, 0xA465, 0x53CA, 0xA4CE, 0x53CB, 0xA4CD,\t0x53CD, 0xA4CF, 0x53D4, 0xA8FB, 0x53D6, 0xA8FA, 0x53D7, 0xA8FC,\n\t0x53DB, 0xAB71, 0x53DF, 0xADEE, 0x53E1, 0xE8FB, 0x53E2, 0xC24F,\t0x53E3, 0xA466, 0x53E4, 0xA56A, 0x53E5, 0xA579, 0x53E6, 0xA574,\n\t0x53E8, 0xA56F, 0x53E9, 0xA56E, 0x53EA, 0xA575, 0x53EB, 0xA573,\t0x53EC, 0xA56C, 0x53ED, 0xA57A, 0x53EE, 0xA56D, 0x53EF, 0xA569,\n\t0x53F0, 0xA578, 0x53F1, 0xA577, 0x53F2, 0xA576, 0x53F3, 0xA56B,\t0x53F5, 0xA572, 0x53F8, 0xA571, 0x53FB, 0xA57B, 0x53FC, 0xA570,\n\t0x5401, 0xA653, 0x5403, 0xA659, 0x5404, 0xA655, 0x5406, 0xA65B,\t0x5407, 0xC9C5, 0x5408, 0xA658, 0x5409, 0xA64E, 0x540A, 0xA651,\n\t0x540B, 0xA654, 0x540C, 0xA650, 0x540D, 0xA657, 0x540E, 0xA65A,\t0x540F, 0xA64F, 0x5410, 0xA652, 0x5411, 0xA656, 0x5412, 0xA65C,\n\t0x5418, 0xCA7E, 0x5419, 0xCA7B, 0x541B, 0xA767, 0x541C, 0xCA7C,\t0x541D, 0xA75B, 0x541E, 0xA75D, 0x541F, 0xA775, 0x5420, 0xA770,\n\t0x5424, 0xCAA5, 0x5425, 0xCA7D, 0x5426, 0xA75F, 0x5427, 0xA761,\t0x5428, 0xCAA4, 0x5429, 0xA768, 0x542A, 0xCA78, 0x542B, 0xA774,\n\t0x542C, 0xA776, 0x542D, 0xA75C, 0x542E, 0xA76D, 0x5430, 0xCA76,\t0x5431, 0xA773, 0x5433, 0xA764, 0x5435, 0xA76E, 0x5436, 0xA76F,\n\t0x5437, 0xCA77, 0x5438, 0xA76C, 0x5439, 0xA76A, 0x543B, 0xA76B,\t0x543C, 0xA771, 0x543D, 0xCAA1, 0x543E, 0xA75E, 0x5440, 0xA772,\n\t0x5441, 0xCAA3, 0x5442, 0xA766, 0x5443, 0xA763, 0x5445, 0xCA7A,\t0x5446, 0xA762, 0x5447, 0xCAA6, 0x5448, 0xA765, 0x544A, 0xA769,\n\t0x544E, 0xA760, 0x544F, 0xCAA2, 0x5454, 0xCA79, 0x5460, 0xCBEB,\t0x5461, 0xCBEA, 0x5462, 0xA94F, 0x5463, 0xCBED, 0x5464, 0xCBEF,\n\t0x5465, 0xCBE4, 0x5466, 0xCBE7, 0x5467, 0xCBEE, 0x5468, 0xA950,\t0x546B, 0xCBE1, 0x546C, 0xCBE5, 0x546F, 0xCBE9, 0x5470, 0xCE49,\n\t0x5471, 0xA94B, 0x5472, 0xCE4D, 0x5473, 0xA8FD, 0x5474, 0xCBE6,\t0x5475, 0xA8FE, 0x5476, 0xA94C, 0x5477, 0xA945, 0x5478, 0xA941,\n\t0x547A, 0xCBE2, 0x547B, 0xA944, 0x547C, 0xA949, 0x547D, 0xA952,\t0x547E, 0xCBE3, 0x547F, 0xCBDC, 0x5480, 0xA943, 0x5481, 0xCBDD,\n\t0x5482, 0xCBDF, 0x5484, 0xA946, 0x5486, 0xA948, 0x5487, 0xCBDB,\t0x5488, 0xCBE0, 0x548B, 0xA951, 0x548C, 0xA94D, 0x548D, 0xCBE8,\n\t0x548E, 0xA953, 0x5490, 0xA94A, 0x5491, 0xCBDE, 0x5492, 0xA947,\t0x5495, 0xA942, 0x5496, 0xA940, 0x5498, 0xCBEC, 0x549A, 0xA94E,\n\t0x54A0, 0xCE48, 0x54A1, 0xCDFB, 0x54A2, 0xCE4B, 0x54A5, 0xCDFD,\t0x54A6, 0xAB78, 0x54A7, 0xABA8, 0x54A8, 0xAB74, 0x54A9, 0xABA7,\n\t0x54AA, 0xAB7D, 0x54AB, 0xABA4, 0x54AC, 0xAB72, 0x54AD, 0xCDFC,\t0x54AE, 0xCE43, 0x54AF, 0xABA3, 0x54B0, 0xCE4F, 0x54B1, 0xABA5,\n\t0x54B3, 0xAB79, 0x54B6, 0xCE45, 0x54B7, 0xCE42, 0x54B8, 0xAB77,\t0x54BA, 0xCDFA, 0x54BB, 0xABA6, 0x54BC, 0xCE4A, 0x54BD, 0xAB7C,\n\t0x54BE, 0xCE4C, 0x54BF, 0xABA9, 0x54C0, 0xAB73, 0x54C1, 0xAB7E,\t0x54C2, 0xAB7B, 0x54C3, 0xCE40, 0x54C4, 0xABA1, 0x54C5, 0xCE46,\n\t0x54C6, 0xCE47, 0x54C7, 0xAB7A, 0x54C8, 0xABA2, 0x54C9, 0xAB76,\t0x54CE, 0xAB75, 0x54CF, 0xCDFE, 0x54D6, 0xCE44, 0x54DE, 0xCE4E,\n\t0x54E0, 0xD144, 0x54E1, 0xADFB, 0x54E2, 0xD0F1, 0x54E4, 0xD0F6,\t0x54E5, 0xADF4, 0x54E6, 0xAE40, 0x54E7, 0xD0F4, 0x54E8, 0xADEF,\n\t0x54E9, 0xADF9, 0x54EA, 0xADFE, 0x54EB, 0xD0FB, 0x54ED, 0xADFA,\t0x54EE, 0xADFD, 0x54F1, 0xD0FE, 0x54F2, 0xADF5, 0x54F3, 0xD0F5,\n\t0x54F7, 0xD142, 0x54F8, 0xD143, 0x54FA, 0xADF7, 0x54FB, 0xD141,\t0x54FC, 0xADF3, 0x54FD, 0xAE43, 0x54FF, 0xD0F8, 0x5501, 0xADF1,\n\t0x5503, 0xD146, 0x5504, 0xD0F9, 0x5505, 0xD0FD, 0x5506, 0xADF6,\t0x5507, 0xAE42, 0x5508, 0xD0FA, 0x5509, 0xADFC, 0x550A, 0xD140,\n\t0x550B, 0xD147, 0x550C, 0xD4A1, 0x550E, 0xD145, 0x550F, 0xAE44,\t0x5510, 0xADF0, 0x5511, 0xD0FC, 0x5512, 0xD0F3, 0x5514, 0xADF8,\n\t0x5517, 0xD0F2, 0x551A, 0xD0F7, 0x5526, 0xD0F0, 0x5527, 0xAE41,\t0x552A, 0xD477, 0x552C, 0xB0E4, 0x552D, 0xD4A7, 0x552E, 0xB0E2,\n\t0x552F, 0xB0DF, 0x5530, 0xD47C, 0x5531, 0xB0DB, 0x5532, 0xD4A2,\t0x5533, 0xB0E6, 0x5534, 0xD476, 0x5535, 0xD47B, 0x5536, 0xD47A,\n\t0x5537, 0xADF2, 0x5538, 0xB0E1, 0x5539, 0xD4A5, 0x553B, 0xD4A8,\t0x553C, 0xD473, 0x553E, 0xB3E8, 0x5540, 0xD4A9, 0x5541, 0xB0E7,\n\t0x5543, 0xB0D9, 0x5544, 0xB0D6, 0x5545, 0xD47E, 0x5546, 0xB0D3,\t0x5548, 0xD4A6, 0x554A, 0xB0DA, 0x554B, 0xD4AA, 0x554D, 0xD474,\n\t0x554E, 0xD4A4, 0x554F, 0xB0DD, 0x5550, 0xD475, 0x5551, 0xD478,\t0x5552, 0xD47D, 0x5555, 0xB0DE, 0x5556, 0xB0DC, 0x5557, 0xB0E8,\n\t0x555C, 0xB0E3, 0x555E, 0xB0D7, 0x555F, 0xB1D2, 0x5561, 0xB0D8,\t0x5562, 0xD479, 0x5563, 0xB0E5, 0x5564, 0xB0E0, 0x5565, 0xD4A3,\n\t0x5566, 0xB0D5, 0x556A, 0xB0D4, 0x5575, 0xD471, 0x5576, 0xD472,\t0x5577, 0xD86A, 0x557B, 0xB3D7, 0x557C, 0xB3DA, 0x557D, 0xD875,\n\t0x557E, 0xB3EE, 0x557F, 0xD878, 0x5580, 0xB3D8, 0x5581, 0xD871,\t0x5582, 0xB3DE, 0x5583, 0xB3E4, 0x5584, 0xB5BD, 0x5587, 0xB3E2,\n\t0x5588, 0xD86E, 0x5589, 0xB3EF, 0x558A, 0xB3DB, 0x558B, 0xB3E3,\t0x558C, 0xD876, 0x558D, 0xDCD7, 0x558E, 0xD87B, 0x558F, 0xD86F,\n\t0x5591, 0xD866, 0x5592, 0xD873, 0x5593, 0xD86D, 0x5594, 0xB3E1,\t0x5595, 0xD879, 0x5598, 0xB3DD, 0x5599, 0xB3F1, 0x559A, 0xB3EA,\n\t0x559C, 0xB3DF, 0x559D, 0xB3DC, 0x559F, 0xB3E7, 0x55A1, 0xD87A,\t0x55A2, 0xD86C, 0x55A3, 0xD872, 0x55A4, 0xD874, 0x55A5, 0xD868,\n\t0x55A6, 0xD877, 0x55A7, 0xB3D9, 0x55A8, 0xD867, 0x55AA, 0xB3E0,\t0x55AB, 0xB3F0, 0x55AC, 0xB3EC, 0x55AD, 0xD869, 0x55AE, 0xB3E6,\n\t0x55B1, 0xB3ED, 0x55B2, 0xB3E9, 0x55B3, 0xB3E5, 0x55B5, 0xD870,\t0x55BB, 0xB3EB, 0x55BF, 0xDCD5, 0x55C0, 0xDCD1, 0x55C2, 0xDCE0,\n\t0x55C3, 0xDCCA, 0x55C4, 0xDCD3, 0x55C5, 0xB6E5, 0x55C6, 0xB6E6,\t0x55C7, 0xB6DE, 0x55C8, 0xDCDC, 0x55C9, 0xB6E8, 0x55CA, 0xDCCF,\n\t0x55CB, 0xDCCE, 0x55CC, 0xDCCC, 0x55CD, 0xDCDE, 0x55CE, 0xB6DC,\t0x55CF, 0xDCD8, 0x55D0, 0xDCCD, 0x55D1, 0xB6DF, 0x55D2, 0xDCD6,\n\t0x55D3, 0xB6DA, 0x55D4, 0xDCD2, 0x55D5, 0xDCD9, 0x55D6, 0xDCDB,\t0x55D9, 0xDCDF, 0x55DA, 0xB6E3, 0x55DB, 0xDCCB, 0x55DC, 0xB6DD,\n\t0x55DD, 0xDCD0, 0x55DF, 0xB6D8, 0x55E1, 0xB6E4, 0x55E2, 0xDCDA,\t0x55E3, 0xB6E0, 0x55E4, 0xB6E1, 0x55E5, 0xB6E7, 0x55E6, 0xB6DB,\n\t0x55E7, 0xA25F, 0x55E8, 0xB6D9, 0x55E9, 0xDCD4, 0x55EF, 0xB6E2,\t0x55F2, 0xDCDD, 0x55F6, 0xB9CD, 0x55F7, 0xB9C8, 0x55F9, 0xE155,\n\t0x55FA, 0xE151, 0x55FC, 0xE14B, 0x55FD, 0xB9C2, 0x55FE, 0xB9BE,\t0x55FF, 0xE154, 0x5600, 0xB9BF, 0x5601, 0xE14E, 0x5602, 0xE150,\n\t0x5604, 0xE153, 0x5606, 0xB9C4, 0x5608, 0xB9CB, 0x5609, 0xB9C5,\t0x560C, 0xE149, 0x560D, 0xB9C6, 0x560E, 0xB9C7, 0x560F, 0xE14C,\n\t0x5610, 0xB9CC, 0x5612, 0xE14A, 0x5613, 0xE14F, 0x5614, 0xB9C3,\t0x5615, 0xE148, 0x5616, 0xB9C9, 0x5617, 0xB9C1, 0x561B, 0xB9C0,\n\t0x561C, 0xE14D, 0x561D, 0xE152, 0x561F, 0xB9CA, 0x5627, 0xE147,\t0x5629, 0xBC4D, 0x562A, 0xE547, 0x562C, 0xE544, 0x562E, 0xBC47,\n\t0x562F, 0xBC53, 0x5630, 0xBC54, 0x5632, 0xBC4A, 0x5633, 0xE542,\t0x5634, 0xBC4C, 0x5635, 0xE4F9, 0x5636, 0xBC52, 0x5638, 0xE546,\n\t0x5639, 0xBC49, 0x563A, 0xE548, 0x563B, 0xBC48, 0x563D, 0xE543,\t0x563E, 0xE545, 0x563F, 0xBC4B, 0x5640, 0xE541, 0x5641, 0xE4FA,\n\t0x5642, 0xE4F7, 0x5645, 0xD86B, 0x5646, 0xE4FD, 0x5648, 0xE4F6,\t0x5649, 0xE4FC, 0x564A, 0xE4FB, 0x564C, 0xE4F8, 0x564E, 0xBC4F,\n\t0x5653, 0xBC4E, 0x5657, 0xBC50, 0x5658, 0xE4FE, 0x5659, 0xBEB2,\t0x565A, 0xE540, 0x565E, 0xE945, 0x5660, 0xE8FD, 0x5662, 0xBEBE,\n\t0x5663, 0xE942, 0x5664, 0xBEB6, 0x5665, 0xBEBA, 0x5666, 0xE941,\t0x5668, 0xBEB9, 0x5669, 0xBEB5, 0x566A, 0xBEB8, 0x566B, 0xBEB3,\n\t0x566C, 0xBEBD, 0x566D, 0xE943, 0x566E, 0xE8FE, 0x566F, 0xBEBC,\t0x5670, 0xE8FC, 0x5671, 0xBEBB, 0x5672, 0xE944, 0x5673, 0xE940,\n\t0x5674, 0xBC51, 0x5676, 0xBEBF, 0x5677, 0xE946, 0x5678, 0xBEB7,\t0x5679, 0xBEB4, 0x567E, 0xECC6, 0x567F, 0xECC8, 0x5680, 0xC07B,\n\t0x5681, 0xECC9, 0x5682, 0xECC7, 0x5683, 0xECC5, 0x5684, 0xECC4,\t0x5685, 0xC07D, 0x5686, 0xECC3, 0x5687, 0xC07E, 0x568C, 0xECC1,\n\t0x568D, 0xECC2, 0x568E, 0xC07A, 0x568F, 0xC0A1, 0x5690, 0xC07C,\t0x5693, 0xECC0, 0x5695, 0xC250, 0x5697, 0xEFBC, 0x5698, 0xEFBA,\n\t0x5699, 0xEFBF, 0x569A, 0xEFBD, 0x569C, 0xEFBB, 0x569D, 0xEFBE,\t0x56A5, 0xC360, 0x56A6, 0xF1F2, 0x56A7, 0xF1F3, 0x56A8, 0xC456,\n\t0x56AA, 0xF1F4, 0x56AB, 0xF1F0, 0x56AC, 0xF1F5, 0x56AD, 0xF1F1,\t0x56AE, 0xC251, 0x56B2, 0xF3FE, 0x56B3, 0xF441, 0x56B4, 0xC459,\n\t0x56B5, 0xF440, 0x56B6, 0xC458, 0x56B7, 0xC457, 0x56BC, 0xC45A,\t0x56BD, 0xF5C5, 0x56BE, 0xF5C6, 0x56C0, 0xC4DA, 0x56C1, 0xC4D9,\n\t0x56C2, 0xC4DB, 0x56C3, 0xF5C4, 0x56C5, 0xF6D8, 0x56C6, 0xF6D7,\t0x56C8, 0xC56D, 0x56C9, 0xC56F, 0x56CA, 0xC56E, 0x56CB, 0xF6D9,\n\t0x56CC, 0xC5C8, 0x56CD, 0xF8A6, 0x56D1, 0xC5F1, 0x56D3, 0xF8A5,\t0x56D4, 0xF8EE, 0x56D7, 0xC949, 0x56DA, 0xA57D, 0x56DB, 0xA57C,\n\t0x56DD, 0xA65F, 0x56DE, 0xA65E, 0x56DF, 0xC9C7, 0x56E0, 0xA65D,\t0x56E1, 0xC9C6, 0x56E4, 0xA779, 0x56E5, 0xCAA9, 0x56E7, 0xCAA8,\n\t0x56EA, 0xA777, 0x56EB, 0xA77A, 0x56EE, 0xCAA7, 0x56F0, 0xA778,\t0x56F7, 0xCBF0, 0x56F9, 0xCBF1, 0x56FA, 0xA954, 0x56FF, 0xABAA,\n\t0x5701, 0xD148, 0x5702, 0xD149, 0x5703, 0xAE45, 0x5704, 0xAE46,\t0x5707, 0xD4AC, 0x5708, 0xB0E9, 0x5709, 0xB0EB, 0x570A, 0xD4AB,\n\t0x570B, 0xB0EA, 0x570C, 0xD87C, 0x570D, 0xB3F2, 0x5712, 0xB6E9,\t0x5713, 0xB6EA, 0x5714, 0xDCE1, 0x5716, 0xB9CF, 0x5718, 0xB9CE,\n\t0x571A, 0xE549, 0x571B, 0xE948, 0x571C, 0xE947, 0x571E, 0xF96B,\t0x571F, 0xA467, 0x5720, 0xC959, 0x5722, 0xC96E, 0x5723, 0xC96F,\n\t0x5728, 0xA662, 0x5729, 0xA666, 0x572A, 0xC9C9, 0x572C, 0xA664,\t0x572D, 0xA663, 0x572E, 0xC9C8, 0x572F, 0xA665, 0x5730, 0xA661,\n\t0x5733, 0xA660, 0x5734, 0xC9CA, 0x573B, 0xA7A6, 0x573E, 0xA7A3,\t0x5740, 0xA77D, 0x5741, 0xCAAA, 0x5745, 0xCAAB, 0x5747, 0xA7A1,\n\t0x5749, 0xCAAD, 0x574A, 0xA77B, 0x574B, 0xCAAE, 0x574C, 0xCAAC,\t0x574D, 0xA77E, 0x574E, 0xA7A2, 0x574F, 0xA7A5, 0x5750, 0xA7A4,\n\t0x5751, 0xA77C, 0x5752, 0xCAAF, 0x5761, 0xA959, 0x5762, 0xCBFE,\t0x5764, 0xA95B, 0x5766, 0xA95A, 0x5768, 0xCC40, 0x5769, 0xA958,\n\t0x576A, 0xA957, 0x576B, 0xCBF5, 0x576D, 0xCBF4, 0x576F, 0xCBF2,\t0x5770, 0xCBF7, 0x5771, 0xCBF6, 0x5772, 0xCBF3, 0x5773, 0xCBFC,\n\t0x5774, 0xCBFD, 0x5775, 0xCBFA, 0x5776, 0xCBF8, 0x5777, 0xA956,\t0x577B, 0xCBFB, 0x577C, 0xA95C, 0x577D, 0xCC41, 0x5780, 0xCBF9,\n\t0x5782, 0xABAB, 0x5783, 0xA955, 0x578B, 0xABAC, 0x578C, 0xCE54,\t0x578F, 0xCE5A, 0x5793, 0xABB2, 0x5794, 0xCE58, 0x5795, 0xCE5E,\n\t0x5797, 0xCE55, 0x5798, 0xCE59, 0x5799, 0xCE5B, 0x579A, 0xCE5D,\t0x579B, 0xCE57, 0x579D, 0xCE56, 0x579E, 0xCE51, 0x579F, 0xCE52,\n\t0x57A0, 0xABAD, 0x57A2, 0xABAF, 0x57A3, 0xABAE, 0x57A4, 0xCE53,\t0x57A5, 0xCE5C, 0x57AE, 0xABB1, 0x57B5, 0xCE50, 0x57B6, 0xD153,\n\t0x57B8, 0xD152, 0x57B9, 0xD157, 0x57BA, 0xD14E, 0x57BC, 0xD151,\t0x57BD, 0xD150, 0x57BF, 0xD154, 0x57C1, 0xD158, 0x57C2, 0xAE47,\n\t0x57C3, 0xAE4A, 0x57C6, 0xD14F, 0x57C7, 0xD155, 0x57CB, 0xAE49,\t0x57CC, 0xD14A, 0x57CE, 0xABB0, 0x57CF, 0xD4BA, 0x57D0, 0xD156,\n\t0x57D2, 0xD14D, 0x57D4, 0xAE48, 0x57D5, 0xD14C, 0x57DC, 0xD4B1,\t0x57DF, 0xB0EC, 0x57E0, 0xB0F0, 0x57E1, 0xD4C1, 0x57E2, 0xD4AF,\n\t0x57E3, 0xD4BD, 0x57E4, 0xB0F1, 0x57E5, 0xD4BF, 0x57E7, 0xD4C5,\t0x57E9, 0xD4C9, 0x57EC, 0xD4C0, 0x57ED, 0xD4B4, 0x57EE, 0xD4BC,\n\t0x57F0, 0xD4CA, 0x57F1, 0xD4C8, 0x57F2, 0xD4BE, 0x57F3, 0xD4B9,\t0x57F4, 0xD4B2, 0x57F5, 0xD8A6, 0x57F6, 0xD4B0, 0x57F7, 0xB0F5,\n\t0x57F8, 0xD4B7, 0x57F9, 0xB0F6, 0x57FA, 0xB0F2, 0x57FB, 0xD4AD,\t0x57FC, 0xD4C3, 0x57FD, 0xD4B5, 0x5800, 0xD4B3, 0x5801, 0xD4C6,\n\t0x5802, 0xB0F3, 0x5804, 0xD4CC, 0x5805, 0xB0ED, 0x5806, 0xB0EF,\t0x5807, 0xD4BB, 0x5808, 0xD4B6, 0x5809, 0xAE4B, 0x580A, 0xB0EE,\n\t0x580B, 0xD4B8, 0x580C, 0xD4C7, 0x580D, 0xD4CB, 0x580E, 0xD4C2,\t0x5810, 0xD4C4, 0x5814, 0xD4AE, 0x5819, 0xD8A1, 0x581B, 0xD8AA,\n\t0x581C, 0xD8A9, 0x581D, 0xB3FA, 0x581E, 0xD8A2, 0x5820, 0xB3FB,\t0x5821, 0xB3F9, 0x5823, 0xD8A4, 0x5824, 0xB3F6, 0x5825, 0xD8A8,\n\t0x5827, 0xD8A3, 0x5828, 0xD8A5, 0x5829, 0xD87D, 0x582A, 0xB3F4,\t0x582C, 0xD8B2, 0x582D, 0xD8B1, 0x582E, 0xD8AE, 0x582F, 0xB3F3,\n\t0x5830, 0xB3F7, 0x5831, 0xB3F8, 0x5832, 0xD14B, 0x5833, 0xD8AB,\t0x5834, 0xB3F5, 0x5835, 0xB0F4, 0x5836, 0xD8AD, 0x5837, 0xD87E,\n\t0x5838, 0xD8B0, 0x5839, 0xD8AF, 0x583B, 0xD8B3, 0x583D, 0xDCEF,\t0x583F, 0xD8AC, 0x5848, 0xD8A7, 0x5849, 0xDCE7, 0x584A, 0xB6F4,\n\t0x584B, 0xB6F7, 0x584C, 0xB6F2, 0x584D, 0xDCE6, 0x584E, 0xDCEA,\t0x584F, 0xDCE5, 0x5851, 0xB6EC, 0x5852, 0xB6F6, 0x5853, 0xDCE2,\n\t0x5854, 0xB6F0, 0x5855, 0xDCE9, 0x5857, 0xB6EE, 0x5858, 0xB6ED,\t0x5859, 0xDCEC, 0x585A, 0xB6EF, 0x585B, 0xDCEE, 0x585D, 0xDCEB,\n\t0x585E, 0xB6EB, 0x5862, 0xB6F5, 0x5863, 0xDCF0, 0x5864, 0xDCE4,\t0x5865, 0xDCED, 0x5868, 0xDCE3, 0x586B, 0xB6F1, 0x586D, 0xB6F3,\n\t0x586F, 0xDCE8, 0x5871, 0xDCF1, 0x5874, 0xE15D, 0x5875, 0xB9D0,\t0x5876, 0xE163, 0x5879, 0xB9D5, 0x587A, 0xE15F, 0x587B, 0xE166,\n\t0x587C, 0xE157, 0x587D, 0xB9D7, 0x587E, 0xB9D1, 0x587F, 0xE15C,\t0x5880, 0xBC55, 0x5881, 0xE15B, 0x5882, 0xE164, 0x5883, 0xB9D2,\n\t0x5885, 0xB9D6, 0x5886, 0xE15A, 0x5887, 0xE160, 0x5888, 0xE165,\t0x5889, 0xE156, 0x588A, 0xB9D4, 0x588B, 0xE15E, 0x588E, 0xE162,\n\t0x588F, 0xE168, 0x5890, 0xE158, 0x5891, 0xE161, 0x5893, 0xB9D3,\t0x5894, 0xE167, 0x5898, 0xE159, 0x589C, 0xBC59, 0x589D, 0xE54B,\n\t0x589E, 0xBC57, 0x589F, 0xBC56, 0x58A0, 0xE54D, 0x58A1, 0xE552,\t0x58A3, 0xE54E, 0x58A5, 0xE551, 0x58A6, 0xBC5C, 0x58A8, 0xBEA5,\n\t0x58A9, 0xBC5B, 0x58AB, 0xE54A, 0x58AC, 0xE550, 0x58AE, 0xBC5A,\t0x58AF, 0xE54F, 0x58B1, 0xE54C, 0x58B3, 0xBC58, 0x58BA, 0xE94D,\n\t0x58BB, 0xF9D9, 0x58BC, 0xE94F, 0x58BD, 0xE94A, 0x58BE, 0xBEC1,\t0x58BF, 0xE94C, 0x58C1, 0xBEC0, 0x58C2, 0xE94E, 0x58C5, 0xBEC3,\n\t0x58C6, 0xE950, 0x58C7, 0xBEC2, 0x58C8, 0xE949, 0x58C9, 0xE94B,\t0x58CE, 0xC0A5, 0x58CF, 0xECCC, 0x58D1, 0xC0A4, 0x58D2, 0xECCD,\n\t0x58D3, 0xC0A3, 0x58D4, 0xECCB, 0x58D5, 0xC0A2, 0x58D6, 0xECCA,\t0x58D8, 0xC253, 0x58D9, 0xC252, 0x58DA, 0xF1F6, 0x58DB, 0xF1F8,\n\t0x58DD, 0xF1F7, 0x58DE, 0xC361, 0x58DF, 0xC362, 0x58E2, 0xC363,\t0x58E3, 0xF442, 0x58E4, 0xC45B, 0x58E7, 0xF7D3, 0x58E8, 0xF7D2,\n\t0x58E9, 0xC5F2, 0x58EB, 0xA468, 0x58EC, 0xA4D0, 0x58EF, 0xA7A7,\t0x58F4, 0xCE5F, 0x58F9, 0xB3FC, 0x58FA, 0xB3FD, 0x58FC, 0xDCF2,\n\t0x58FD, 0xB9D8, 0x58FE, 0xE169, 0x58FF, 0xE553, 0x5903, 0xC95A,\t0x5906, 0xCAB0, 0x590C, 0xCC42, 0x590D, 0xCE60, 0x590E, 0xD159,\n\t0x590F, 0xAE4C, 0x5912, 0xF1F9, 0x5914, 0xC4DC, 0x5915, 0xA469,\t0x5916, 0xA57E, 0x5917, 0xC970, 0x5919, 0xA667, 0x591A, 0xA668,\n\t0x591C, 0xA95D, 0x5920, 0xB0F7, 0x5922, 0xB9DA, 0x5924, 0xB9DB,\t0x5925, 0xB9D9, 0x5927, 0xA46A, 0x5929, 0xA4D1, 0x592A, 0xA4D3,\n\t0x592B, 0xA4D2, 0x592C, 0xC95B, 0x592D, 0xA4D4, 0x592E, 0xA5A1,\t0x592F, 0xC971, 0x5931, 0xA5A2, 0x5937, 0xA669, 0x5938, 0xA66A,\n\t0x593C, 0xC9CB, 0x593E, 0xA7A8, 0x5940, 0xCAB1, 0x5944, 0xA961,\t0x5945, 0xCC43, 0x5947, 0xA95F, 0x5948, 0xA960, 0x5949, 0xA95E,\n\t0x594A, 0xD15A, 0x594E, 0xABB6, 0x594F, 0xABB5, 0x5950, 0xABB7,\t0x5951, 0xABB4, 0x5953, 0xCE61, 0x5954, 0xA962, 0x5955, 0xABB3,\n\t0x5957, 0xAE4D, 0x5958, 0xAE4E, 0x595A, 0xAE4F, 0x595C, 0xD4CD,\t0x5960, 0xB3FE, 0x5961, 0xD8B4, 0x5962, 0xB0F8, 0x5967, 0xB6F8,\n\t0x5969, 0xB9DD, 0x596A, 0xB9DC, 0x596B, 0xE16A, 0x596D, 0xBC5D,\t0x596E, 0xBEC4, 0x5970, 0xEFC0, 0x5971, 0xF6DA, 0x5972, 0xF7D4,\n\t0x5973, 0xA46B, 0x5974, 0xA5A3, 0x5976, 0xA5A4, 0x5977, 0xC9D1,\t0x5978, 0xA66C, 0x5979, 0xA66F, 0x597B, 0xC9CF, 0x597C, 0xC9CD,\n\t0x597D, 0xA66E, 0x597E, 0xC9D0, 0x597F, 0xC9D2, 0x5980, 0xC9CC,\t0x5981, 0xA671, 0x5982, 0xA670, 0x5983, 0xA66D, 0x5984, 0xA66B,\n\t0x5985, 0xC9CE, 0x598A, 0xA7B3, 0x598D, 0xA7B0, 0x598E, 0xCAB6,\t0x598F, 0xCAB9, 0x5990, 0xCAB8, 0x5992, 0xA7AA, 0x5993, 0xA7B2,\n\t0x5996, 0xA7AF, 0x5997, 0xCAB5, 0x5998, 0xCAB3, 0x5999, 0xA7AE,\t0x599D, 0xA7A9, 0x599E, 0xA7AC, 0x59A0, 0xCAB4, 0x59A1, 0xCABB,\n\t0x59A2, 0xCAB7, 0x59A3, 0xA7AD, 0x59A4, 0xA7B1, 0x59A5, 0xA7B4,\t0x59A6, 0xCAB2, 0x59A7, 0xCABA, 0x59A8, 0xA7AB, 0x59AE, 0xA967,\n\t0x59AF, 0xA96F, 0x59B1, 0xCC4F, 0x59B2, 0xCC48, 0x59B3, 0xA970,\t0x59B4, 0xCC53, 0x59B5, 0xCC44, 0x59B6, 0xCC4B, 0x59B9, 0xA966,\n\t0x59BA, 0xCC45, 0x59BB, 0xA964, 0x59BC, 0xCC4C, 0x59BD, 0xCC50,\t0x59BE, 0xA963, 0x59C0, 0xCC51, 0x59C1, 0xCC4A, 0x59C3, 0xCC4D,\n\t0x59C5, 0xA972, 0x59C6, 0xA969, 0x59C7, 0xCC54, 0x59C8, 0xCC52,\t0x59CA, 0xA96E, 0x59CB, 0xA96C, 0x59CC, 0xCC49, 0x59CD, 0xA96B,\n\t0x59CE, 0xCC47, 0x59CF, 0xCC46, 0x59D0, 0xA96A, 0x59D1, 0xA968,\t0x59D2, 0xA971, 0x59D3, 0xA96D, 0x59D4, 0xA965, 0x59D6, 0xCC4E,\n\t0x59D8, 0xABB9, 0x59DA, 0xABC0, 0x59DB, 0xCE6F, 0x59DC, 0xABB8,\t0x59DD, 0xCE67, 0x59DE, 0xCE63, 0x59E0, 0xCE73, 0x59E1, 0xCE62,\n\t0x59E3, 0xABBB, 0x59E4, 0xCE6C, 0x59E5, 0xABBE, 0x59E6, 0xABC1,\t0x59E8, 0xABBC, 0x59E9, 0xCE70, 0x59EA, 0xABBF, 0x59EC, 0xAE56,\n\t0x59ED, 0xCE76, 0x59EE, 0xCE64, 0x59F1, 0xCE66, 0x59F2, 0xCE6D,\t0x59F3, 0xCE71, 0x59F4, 0xCE75, 0x59F5, 0xCE72, 0x59F6, 0xCE6B,\n\t0x59F7, 0xCE6E, 0x59FA, 0xCE68, 0x59FB, 0xABC3, 0x59FC, 0xCE6A,\t0x59FD, 0xCE69, 0x59FE, 0xCE74, 0x59FF, 0xABBA, 0x5A00, 0xCE65,\n\t0x5A01, 0xABC2, 0x5A03, 0xABBD, 0x5A09, 0xAE5C, 0x5A0A, 0xD162,\t0x5A0C, 0xAE5B, 0x5A0F, 0xD160, 0x5A11, 0xAE50, 0x5A13, 0xAE55,\n\t0x5A15, 0xD15F, 0x5A16, 0xD15C, 0x5A17, 0xD161, 0x5A18, 0xAE51,\t0x5A19, 0xD15B, 0x5A1B, 0xAE54, 0x5A1C, 0xAE52, 0x5A1E, 0xD163,\n\t0x5A1F, 0xAE53, 0x5A20, 0xAE57, 0x5A23, 0xAE58, 0x5A25, 0xAE5A,\t0x5A29, 0xAE59, 0x5A2D, 0xD15D, 0x5A2E, 0xD15E, 0x5A33, 0xD164,\n\t0x5A35, 0xD4D4, 0x5A36, 0xB0F9, 0x5A37, 0xD8C2, 0x5A38, 0xD4D3,\t0x5A39, 0xD4E6, 0x5A3C, 0xB140, 0x5A3E, 0xD4E4, 0x5A40, 0xB0FE,\n\t0x5A41, 0xB0FA, 0x5A42, 0xD4ED, 0x5A43, 0xD4DD, 0x5A44, 0xD4E0,\t0x5A46, 0xB143, 0x5A47, 0xD4EA, 0x5A48, 0xD4E2, 0x5A49, 0xB0FB,\n\t0x5A4A, 0xB144, 0x5A4C, 0xD4E7, 0x5A4D, 0xD4E5, 0x5A50, 0xD4D6,\t0x5A51, 0xD4EB, 0x5A52, 0xD4DF, 0x5A53, 0xD4DA, 0x5A55, 0xD4D0,\n\t0x5A56, 0xD4EC, 0x5A57, 0xD4DC, 0x5A58, 0xD4CF, 0x5A5A, 0xB142,\t0x5A5B, 0xD4E1, 0x5A5C, 0xD4EE, 0x5A5D, 0xD4DE, 0x5A5E, 0xD4D2,\n\t0x5A5F, 0xD4D7, 0x5A60, 0xD4CE, 0x5A62, 0xB141, 0x5A64, 0xD4DB,\t0x5A65, 0xD4D8, 0x5A66, 0xB0FC, 0x5A67, 0xD4D1, 0x5A69, 0xD4E9,\n\t0x5A6A, 0xB0FD, 0x5A6C, 0xD4D9, 0x5A6D, 0xD4D5, 0x5A70, 0xD4E8,\t0x5A77, 0xB440, 0x5A78, 0xD8BB, 0x5A7A, 0xD8B8, 0x5A7B, 0xD8C9,\n\t0x5A7C, 0xD8BD, 0x5A7D, 0xD8CA, 0x5A7F, 0xB442, 0x5A83, 0xD8C6,\t0x5A84, 0xD8C3, 0x5A8A, 0xD8C4, 0x5A8B, 0xD8C7, 0x5A8C, 0xD8CB,\n\t0x5A8E, 0xD4E3, 0x5A8F, 0xD8CD, 0x5A90, 0xDD47, 0x5A92, 0xB443,\t0x5A93, 0xD8CE, 0x5A94, 0xD8B6, 0x5A95, 0xD8C0, 0x5A97, 0xD8C5,\n\t0x5A9A, 0xB441, 0x5A9B, 0xB444, 0x5A9C, 0xD8CC, 0x5A9D, 0xD8CF,\t0x5A9E, 0xD8BA, 0x5A9F, 0xD8B7, 0x5AA2, 0xD8B9, 0x5AA5, 0xD8BE,\n\t0x5AA6, 0xD8BC, 0x5AA7, 0xB445, 0x5AA9, 0xD8C8, 0x5AAC, 0xD8BF,\t0x5AAE, 0xD8C1, 0x5AAF, 0xD8B5, 0x5AB0, 0xDCFA, 0x5AB1, 0xDCF8,\n\t0x5AB2, 0xB742, 0x5AB3, 0xB740, 0x5AB4, 0xDD43, 0x5AB5, 0xDCF9,\t0x5AB6, 0xDD44, 0x5AB7, 0xDD40, 0x5AB8, 0xDCF7, 0x5AB9, 0xDD46,\n\t0x5ABA, 0xDCF6, 0x5ABB, 0xDCFD, 0x5ABC, 0xB6FE, 0x5ABD, 0xB6FD,\t0x5ABE, 0xB6FC, 0x5ABF, 0xDCFB, 0x5AC0, 0xDD41, 0x5AC1, 0xB6F9,\n\t0x5AC2, 0xB741, 0x5AC4, 0xDCF4, 0x5AC6, 0xDCFE, 0x5AC7, 0xDCF3,\t0x5AC8, 0xDCFC, 0x5AC9, 0xB6FA, 0x5ACA, 0xDD42, 0x5ACB, 0xDCF5,\n\t0x5ACC, 0xB6FB, 0x5ACD, 0xDD45, 0x5AD5, 0xE16E, 0x5AD6, 0xB9E2,\t0x5AD7, 0xB9E1, 0x5AD8, 0xB9E3, 0x5AD9, 0xE17A, 0x5ADA, 0xE170,\n\t0x5ADB, 0xE176, 0x5ADC, 0xE16B, 0x5ADD, 0xE179, 0x5ADE, 0xE178,\t0x5ADF, 0xE17C, 0x5AE0, 0xE175, 0x5AE1, 0xB9DE, 0x5AE2, 0xE174,\n\t0x5AE3, 0xB9E4, 0x5AE5, 0xE16D, 0x5AE6, 0xB9DF, 0x5AE8, 0xE17B,\t0x5AE9, 0xB9E0, 0x5AEA, 0xE16F, 0x5AEB, 0xE172, 0x5AEC, 0xE177,\n\t0x5AED, 0xE171, 0x5AEE, 0xE16C, 0x5AF3, 0xE173, 0x5AF4, 0xE555,\t0x5AF5, 0xBC61, 0x5AF6, 0xE558, 0x5AF7, 0xE557, 0x5AF8, 0xE55A,\n\t0x5AF9, 0xE55C, 0x5AFA, 0xF9DC, 0x5AFB, 0xBC5F, 0x5AFD, 0xE556,\t0x5AFF, 0xE554, 0x5B01, 0xE55D, 0x5B02, 0xE55B, 0x5B03, 0xE559,\n\t0x5B05, 0xE55F, 0x5B07, 0xE55E, 0x5B08, 0xBC63, 0x5B09, 0xBC5E,\t0x5B0B, 0xBC60, 0x5B0C, 0xBC62, 0x5B0F, 0xE560, 0x5B10, 0xE957,\n\t0x5B13, 0xE956, 0x5B14, 0xE955, 0x5B16, 0xE958, 0x5B17, 0xE951,\t0x5B19, 0xE952, 0x5B1A, 0xE95A, 0x5B1B, 0xE953, 0x5B1D, 0xBEC5,\n\t0x5B1E, 0xE95C, 0x5B20, 0xE95B, 0x5B21, 0xE954, 0x5B23, 0xECD1,\t0x5B24, 0xC0A8, 0x5B25, 0xECCF, 0x5B26, 0xECD4, 0x5B27, 0xECD3,\n\t0x5B28, 0xE959, 0x5B2A, 0xC0A7, 0x5B2C, 0xECD2, 0x5B2D, 0xECCE,\t0x5B2E, 0xECD6, 0x5B2F, 0xECD5, 0x5B30, 0xC0A6, 0x5B32, 0xECD0,\n\t0x5B34, 0xBEC6, 0x5B38, 0xC254, 0x5B3C, 0xEFC1, 0x5B3D, 0xF1FA,\t0x5B3E, 0xF1FB, 0x5B3F, 0xF1FC, 0x5B40, 0xC45C, 0x5B43, 0xC45D,\n\t0x5B45, 0xF443, 0x5B47, 0xF5C8, 0x5B48, 0xF5C7, 0x5B4B, 0xF6DB,\t0x5B4C, 0xF6DC, 0x5B4D, 0xF7D5, 0x5B4E, 0xF8A7, 0x5B50, 0xA46C,\n\t0x5B51, 0xA46D, 0x5B53, 0xA46E, 0x5B54, 0xA4D5, 0x5B55, 0xA5A5,\t0x5B56, 0xC9D3, 0x5B57, 0xA672, 0x5B58, 0xA673, 0x5B5A, 0xA7B7,\n\t0x5B5B, 0xA7B8, 0x5B5C, 0xA7B6, 0x5B5D, 0xA7B5, 0x5B5F, 0xA973,\t0x5B62, 0xCC55, 0x5B63, 0xA975, 0x5B64, 0xA974, 0x5B65, 0xCC56,\n\t0x5B69, 0xABC4, 0x5B6B, 0xAE5D, 0x5B6C, 0xD165, 0x5B6E, 0xD4F0,\t0x5B70, 0xB145, 0x5B71, 0xB447, 0x5B72, 0xD4EF, 0x5B73, 0xB446,\n\t0x5B75, 0xB9E5, 0x5B77, 0xE17D, 0x5B78, 0xBEC7, 0x5B7A, 0xC0A9,\t0x5B7B, 0xECD7, 0x5B7D, 0xC45E, 0x5B7F, 0xC570, 0x5B81, 0xC972,\n\t0x5B83, 0xA5A6, 0x5B84, 0xC973, 0x5B85, 0xA676, 0x5B87, 0xA674,\t0x5B88, 0xA675, 0x5B89, 0xA677, 0x5B8B, 0xA7BA, 0x5B8C, 0xA7B9,\n\t0x5B8E, 0xCABC, 0x5B8F, 0xA7BB, 0x5B92, 0xCABD, 0x5B93, 0xCC57,\t0x5B95, 0xCC58, 0x5B97, 0xA976, 0x5B98, 0xA978, 0x5B99, 0xA97A,\n\t0x5B9A, 0xA977, 0x5B9B, 0xA97B, 0x5B9C, 0xA979, 0x5BA2, 0xABC8,\t0x5BA3, 0xABC5, 0x5BA4, 0xABC7, 0x5BA5, 0xABC9, 0x5BA6, 0xABC6,\n\t0x5BA7, 0xD166, 0x5BA8, 0xCE77, 0x5BAC, 0xD168, 0x5BAD, 0xD167,\t0x5BAE, 0xAE63, 0x5BB0, 0xAE5F, 0x5BB3, 0xAE60, 0x5BB4, 0xAE62,\n\t0x5BB5, 0xAE64, 0x5BB6, 0xAE61, 0x5BB8, 0xAE66, 0x5BB9, 0xAE65,\t0x5BBF, 0xB14A, 0x5BC0, 0xD4F2, 0x5BC1, 0xD4F1, 0x5BC2, 0xB149,\n\t0x5BC4, 0xB148, 0x5BC5, 0xB147, 0x5BC6, 0xB14B, 0x5BC7, 0xB146,\t0x5BCA, 0xD8D5, 0x5BCB, 0xD8D2, 0x5BCC, 0xB449, 0x5BCD, 0xD8D1,\n\t0x5BCE, 0xD8D6, 0x5BD0, 0xB44B, 0x5BD1, 0xD8D4, 0x5BD2, 0xB448,\t0x5BD3, 0xB44A, 0x5BD4, 0xD8D3, 0x5BD6, 0xDD48, 0x5BD8, 0xDD49,\n\t0x5BD9, 0xDD4A, 0x5BDE, 0xB9E6, 0x5BDF, 0xB9EE, 0x5BE0, 0xE17E,\t0x5BE1, 0xB9E8, 0x5BE2, 0xB9EC, 0x5BE3, 0xE1A1, 0x5BE4, 0xB9ED,\n\t0x5BE5, 0xB9E9, 0x5BE6, 0xB9EA, 0x5BE7, 0xB9E7, 0x5BE8, 0xB9EB,\t0x5BE9, 0xBC66, 0x5BEA, 0xD8D0, 0x5BEB, 0xBC67, 0x5BEC, 0xBC65,\n\t0x5BEE, 0xBC64, 0x5BEF, 0xE95D, 0x5BF0, 0xBEC8, 0x5BF1, 0xECD8,\t0x5BF2, 0xECD9, 0x5BF5, 0xC364, 0x5BF6, 0xC45F, 0x5BF8, 0xA46F,\n\t0x5BFA, 0xA678, 0x5C01, 0xABCA, 0x5C03, 0xD169, 0x5C04, 0xAE67,\t0x5C07, 0xB14E, 0x5C08, 0xB14D, 0x5C09, 0xB14C, 0x5C0A, 0xB44C,\n\t0x5C0B, 0xB44D, 0x5C0C, 0xD8D7, 0x5C0D, 0xB9EF, 0x5C0E, 0xBEC9,\t0x5C0F, 0xA470, 0x5C10, 0xC95C, 0x5C11, 0xA4D6, 0x5C12, 0xC974,\n\t0x5C15, 0xC9D4, 0x5C16, 0xA679, 0x5C1A, 0xA97C, 0x5C1F, 0xDD4B,\t0x5C22, 0xA471, 0x5C24, 0xA4D7, 0x5C25, 0xC9D5, 0x5C28, 0xCABE,\n\t0x5C2A, 0xCABF, 0x5C2C, 0xA7BC, 0x5C30, 0xD8D8, 0x5C31, 0xB44E,\t0x5C33, 0xDD4C, 0x5C37, 0xC0AA, 0x5C38, 0xA472, 0x5C39, 0xA4A8,\n\t0x5C3A, 0xA4D8, 0x5C3B, 0xC975, 0x5C3C, 0xA5A7, 0x5C3E, 0xA7C0,\t0x5C3F, 0xA7BF, 0x5C40, 0xA7BD, 0x5C41, 0xA7BE, 0x5C44, 0xCC59,\n\t0x5C45, 0xA97E, 0x5C46, 0xA9A1, 0x5C47, 0xCC5A, 0x5C48, 0xA97D,\t0x5C4B, 0xABCE, 0x5C4C, 0xCE78, 0x5C4D, 0xABCD, 0x5C4E, 0xABCB,\n\t0x5C4F, 0xABCC, 0x5C50, 0xAE6A, 0x5C51, 0xAE68, 0x5C54, 0xD16B,\t0x5C55, 0xAE69, 0x5C56, 0xD16A, 0x5C58, 0xAE5E, 0x5C59, 0xD4F3,\n\t0x5C5C, 0xB150, 0x5C5D, 0xB151, 0x5C60, 0xB14F, 0x5C62, 0xB9F0,\t0x5C63, 0xE1A2, 0x5C64, 0xBC68, 0x5C65, 0xBC69, 0x5C67, 0xE561,\n\t0x5C68, 0xC0AB, 0x5C69, 0xEFC2, 0x5C6A, 0xEFC3, 0x5C6C, 0xC4DD,\t0x5C6D, 0xF8A8, 0x5C6E, 0xC94B, 0x5C6F, 0xA4D9, 0x5C71, 0xA473,\n\t0x5C73, 0xC977, 0x5C74, 0xC976, 0x5C79, 0xA67A, 0x5C7A, 0xC9D7,\t0x5C7B, 0xC9D8, 0x5C7C, 0xC9D6, 0x5C7E, 0xC9D9, 0x5C86, 0xCAC7,\n\t0x5C88, 0xCAC2, 0x5C89, 0xCAC4, 0x5C8A, 0xCAC6, 0x5C8B, 0xCAC3,\t0x5C8C, 0xA7C4, 0x5C8D, 0xCAC0, 0x5C8F, 0xCAC1, 0x5C90, 0xA7C1,\n\t0x5C91, 0xA7C2, 0x5C92, 0xCAC5, 0x5C93, 0xCAC8, 0x5C94, 0xA7C3,\t0x5C95, 0xCAC9, 0x5C9D, 0xCC68, 0x5C9F, 0xCC62, 0x5CA0, 0xCC5D,\n\t0x5CA1, 0xA9A3, 0x5CA2, 0xCC65, 0x5CA3, 0xCC63, 0x5CA4, 0xCC5C,\t0x5CA5, 0xCC69, 0x5CA6, 0xCC6C, 0x5CA7, 0xCC67, 0x5CA8, 0xCC60,\n\t0x5CA9, 0xA9A5, 0x5CAA, 0xCC66, 0x5CAB, 0xA9A6, 0x5CAC, 0xCC61,\t0x5CAD, 0xCC64, 0x5CAE, 0xCC5B, 0x5CAF, 0xCC5F, 0x5CB0, 0xCC6B,\n\t0x5CB1, 0xA9A7, 0x5CB3, 0xA9A8, 0x5CB5, 0xCC5E, 0x5CB6, 0xCC6A,\t0x5CB7, 0xA9A2, 0x5CB8, 0xA9A4, 0x5CC6, 0xCEAB, 0x5CC7, 0xCEA4,\n\t0x5CC8, 0xCEAA, 0x5CC9, 0xCEA3, 0x5CCA, 0xCEA5, 0x5CCB, 0xCE7D,\t0x5CCC, 0xCE7B, 0x5CCE, 0xCEAC, 0x5CCF, 0xCEA9, 0x5CD0, 0xCE79,\n\t0x5CD2, 0xABD0, 0x5CD3, 0xCEA7, 0x5CD4, 0xCEA8, 0x5CD6, 0xCEA6,\t0x5CD7, 0xCE7C, 0x5CD8, 0xCE7A, 0x5CD9, 0xABCF, 0x5CDA, 0xCEA2,\n\t0x5CDB, 0xCE7E, 0x5CDE, 0xCEA1, 0x5CDF, 0xCEAD, 0x5CE8, 0xAE6F,\t0x5CEA, 0xAE6E, 0x5CEC, 0xD16C, 0x5CED, 0xAE6B, 0x5CEE, 0xD16E,\n\t0x5CF0, 0xAE70, 0x5CF1, 0xD16F, 0x5CF4, 0xAE73, 0x5CF6, 0xAE71,\t0x5CF7, 0xD170, 0x5CF8, 0xCEAE, 0x5CF9, 0xD172, 0x5CFB, 0xAE6D,\n\t0x5CFD, 0xAE6C, 0x5CFF, 0xD16D, 0x5D00, 0xD171, 0x5D01, 0xAE72,\t0x5D06, 0xB153, 0x5D07, 0xB152, 0x5D0B, 0xD4F5, 0x5D0C, 0xD4F9,\n\t0x5D0D, 0xD4FB, 0x5D0E, 0xB154, 0x5D0F, 0xD4FE, 0x5D11, 0xB158,\t0x5D12, 0xD541, 0x5D14, 0xB15A, 0x5D16, 0xB156, 0x5D17, 0xB15E,\n\t0x5D19, 0xB15B, 0x5D1A, 0xD4F7, 0x5D1B, 0xB155, 0x5D1D, 0xD4F6,\t0x5D1E, 0xD4F4, 0x5D1F, 0xD543, 0x5D20, 0xD4F8, 0x5D22, 0xB157,\n\t0x5D23, 0xD542, 0x5D24, 0xB15C, 0x5D25, 0xD4FD, 0x5D26, 0xD4FC,\t0x5D27, 0xB15D, 0x5D28, 0xD4FA, 0x5D29, 0xB159, 0x5D2E, 0xD544,\n\t0x5D30, 0xD540, 0x5D31, 0xD8E7, 0x5D32, 0xD8EE, 0x5D33, 0xD8E3,\t0x5D34, 0xB451, 0x5D35, 0xD8DF, 0x5D36, 0xD8EF, 0x5D37, 0xD8D9,\n\t0x5D38, 0xD8EC, 0x5D39, 0xD8EA, 0x5D3A, 0xD8E4, 0x5D3C, 0xD8ED,\t0x5D3D, 0xD8E6, 0x5D3F, 0xD8DE, 0x5D40, 0xD8F0, 0x5D41, 0xD8DC,\n\t0x5D42, 0xD8E9, 0x5D43, 0xD8DA, 0x5D45, 0xD8F1, 0x5D47, 0xB452,\t0x5D49, 0xD8EB, 0x5D4A, 0xDD4F, 0x5D4B, 0xD8DD, 0x5D4C, 0xB44F,\n\t0x5D4E, 0xD8E1, 0x5D50, 0xB450, 0x5D51, 0xD8E0, 0x5D52, 0xD8E5,\t0x5D55, 0xD8E2, 0x5D59, 0xD8E8, 0x5D5E, 0xDD53, 0x5D62, 0xDD56,\n\t0x5D63, 0xDD4E, 0x5D65, 0xDD50, 0x5D67, 0xDD55, 0x5D68, 0xDD54,\t0x5D69, 0xB743, 0x5D6B, 0xD8DB, 0x5D6C, 0xDD52, 0x5D6F, 0xB744,\n\t0x5D71, 0xDD4D, 0x5D72, 0xDD51, 0x5D77, 0xE1A9, 0x5D79, 0xE1B0,\t0x5D7A, 0xE1A7, 0x5D7C, 0xE1AE, 0x5D7D, 0xE1A5, 0x5D7E, 0xE1AD,\n\t0x5D7F, 0xE1B1, 0x5D80, 0xE1A4, 0x5D81, 0xE1A8, 0x5D82, 0xE1A3,\t0x5D84, 0xB9F1, 0x5D86, 0xE1A6, 0x5D87, 0xB9F2, 0x5D88, 0xE1AC,\n\t0x5D89, 0xE1AB, 0x5D8A, 0xE1AA, 0x5D8D, 0xE1AF, 0x5D92, 0xE565,\t0x5D93, 0xE567, 0x5D94, 0xBC6B, 0x5D95, 0xE568, 0x5D97, 0xE563,\n\t0x5D99, 0xE562, 0x5D9A, 0xE56C, 0x5D9C, 0xE56A, 0x5D9D, 0xBC6A,\t0x5D9E, 0xE56D, 0x5D9F, 0xE564, 0x5DA0, 0xE569, 0x5DA1, 0xE56B,\n\t0x5DA2, 0xE566, 0x5DA7, 0xE961, 0x5DA8, 0xE966, 0x5DA9, 0xE960,\t0x5DAA, 0xE965, 0x5DAC, 0xE95E, 0x5DAD, 0xE968, 0x5DAE, 0xE964,\n\t0x5DAF, 0xE969, 0x5DB0, 0xE963, 0x5DB1, 0xE95F, 0x5DB2, 0xE967,\t0x5DB4, 0xE96A, 0x5DB5, 0xE962, 0x5DB7, 0xECDA, 0x5DB8, 0xC0AF,\n\t0x5DBA, 0xC0AD, 0x5DBC, 0xC0AC, 0x5DBD, 0xC0AE, 0x5DC0, 0xEFC4,\t0x5DC2, 0xF172, 0x5DC3, 0xF1FD, 0x5DC6, 0xF444, 0x5DC7, 0xF445,\n\t0x5DC9, 0xC460, 0x5DCB, 0xF5C9, 0x5DCD, 0xC4DE, 0x5DCF, 0xF5CA,\t0x5DD1, 0xF6DE, 0x5DD2, 0xC572, 0x5DD4, 0xC571, 0x5DD5, 0xF6DD,\n\t0x5DD6, 0xC5C9, 0x5DD8, 0xF7D6, 0x5DDD, 0xA474, 0x5DDE, 0xA67B,\t0x5DDF, 0xC9DA, 0x5DE0, 0xCACA, 0x5DE1, 0xA8B5, 0x5DE2, 0xB15F,\n\t0x5DE5, 0xA475, 0x5DE6, 0xA5AA, 0x5DE7, 0xA5A9, 0x5DE8, 0xA5A8,\t0x5DEB, 0xA7C5, 0x5DEE, 0xAE74, 0x5DF0, 0xDD57, 0x5DF1, 0xA476,\n\t0x5DF2, 0xA477, 0x5DF3, 0xA478, 0x5DF4, 0xA4DA, 0x5DF7, 0xABD1,\t0x5DF9, 0xCEAF, 0x5DFD, 0xB453, 0x5DFE, 0xA479, 0x5DFF, 0xC95D,\n\t0x5E02, 0xA5AB, 0x5E03, 0xA5AC, 0x5E04, 0xC978, 0x5E06, 0xA67C,\t0x5E0A, 0xCACB, 0x5E0C, 0xA7C6, 0x5E0E, 0xCACC, 0x5E11, 0xA9AE,\n\t0x5E14, 0xCC6E, 0x5E15, 0xA9AC, 0x5E16, 0xA9AB, 0x5E17, 0xCC6D,\t0x5E18, 0xA9A9, 0x5E19, 0xCC6F, 0x5E1A, 0xA9AA, 0x5E1B, 0xA9AD,\n\t0x5E1D, 0xABD2, 0x5E1F, 0xABD4, 0x5E20, 0xCEB3, 0x5E21, 0xCEB0,\t0x5E22, 0xCEB1, 0x5E23, 0xCEB2, 0x5E24, 0xCEB4, 0x5E25, 0xABD3,\n\t0x5E28, 0xD174, 0x5E29, 0xD173, 0x5E2B, 0xAE76, 0x5E2D, 0xAE75,\t0x5E33, 0xB162, 0x5E34, 0xD546, 0x5E36, 0xB161, 0x5E37, 0xB163,\n\t0x5E38, 0xB160, 0x5E3D, 0xB455, 0x5E3E, 0xD545, 0x5E40, 0xB456,\t0x5E41, 0xD8F3, 0x5E43, 0xB457, 0x5E44, 0xD8F2, 0x5E45, 0xB454,\n\t0x5E4A, 0xDD5A, 0x5E4B, 0xDD5C, 0x5E4C, 0xB745, 0x5E4D, 0xDD5B,\t0x5E4E, 0xDD59, 0x5E4F, 0xDD58, 0x5E53, 0xE1B4, 0x5E54, 0xB9F7,\n\t0x5E55, 0xB9F5, 0x5E57, 0xB9F6, 0x5E58, 0xE1B2, 0x5E59, 0xE1B3,\t0x5E5B, 0xB9F3, 0x5E5C, 0xE571, 0x5E5D, 0xE56F, 0x5E5F, 0xBC6D,\n\t0x5E60, 0xE570, 0x5E61, 0xBC6E, 0x5E62, 0xBC6C, 0x5E63, 0xB9F4,\t0x5E66, 0xE96D, 0x5E67, 0xE96B, 0x5E68, 0xE96C, 0x5E69, 0xE56E,\n\t0x5E6A, 0xECDC, 0x5E6B, 0xC0B0, 0x5E6C, 0xECDB, 0x5E6D, 0xEFC5,\t0x5E6E, 0xEFC6, 0x5E6F, 0xE96E, 0x5E70, 0xF1FE, 0x5E72, 0xA47A,\n\t0x5E73, 0xA5AD, 0x5E74, 0xA67E, 0x5E75, 0xC9DB, 0x5E76, 0xA67D,\t0x5E78, 0xA9AF, 0x5E79, 0xB746, 0x5E7B, 0xA4DB, 0x5E7C, 0xA5AE,\n\t0x5E7D, 0xABD5, 0x5E7E, 0xB458, 0x5E80, 0xC979, 0x5E82, 0xC97A,\t0x5E84, 0xC9DC, 0x5E87, 0xA7C8, 0x5E88, 0xCAD0, 0x5E89, 0xCACE,\n\t0x5E8A, 0xA7C9, 0x5E8B, 0xCACD, 0x5E8C, 0xCACF, 0x5E8D, 0xCAD1,\t0x5E8F, 0xA7C7, 0x5E95, 0xA9B3, 0x5E96, 0xA9B4, 0x5E97, 0xA9B1,\n\t0x5E9A, 0xA9B0, 0x5E9B, 0xCEB8, 0x5E9C, 0xA9B2, 0x5EA0, 0xABD6,\t0x5EA2, 0xCEB7, 0x5EA3, 0xCEB9, 0x5EA4, 0xCEB6, 0x5EA5, 0xCEBA,\n\t0x5EA6, 0xABD7, 0x5EA7, 0xAE79, 0x5EA8, 0xD175, 0x5EAA, 0xD177,\t0x5EAB, 0xAE77, 0x5EAC, 0xD178, 0x5EAD, 0xAE78, 0x5EAE, 0xD176,\n\t0x5EB0, 0xCEB5, 0x5EB1, 0xD547, 0x5EB2, 0xD54A, 0x5EB3, 0xD54B,\t0x5EB4, 0xD548, 0x5EB5, 0xB167, 0x5EB6, 0xB166, 0x5EB7, 0xB164,\n\t0x5EB8, 0xB165, 0x5EB9, 0xD549, 0x5EBE, 0xB168, 0x5EC1, 0xB45A,\t0x5EC2, 0xB45B, 0x5EC4, 0xB45C, 0x5EC5, 0xDD5D, 0x5EC6, 0xDD5F,\n\t0x5EC7, 0xDD61, 0x5EC8, 0xB748, 0x5EC9, 0xB747, 0x5ECA, 0xB459,\t0x5ECB, 0xDD60, 0x5ECC, 0xDD5E, 0x5ECE, 0xE1B8, 0x5ED1, 0xE1B6,\n\t0x5ED2, 0xE1BC, 0x5ED3, 0xB9F8, 0x5ED4, 0xE1BD, 0x5ED5, 0xE1BA,\t0x5ED6, 0xB9F9, 0x5ED7, 0xE1B7, 0x5ED8, 0xE1B5, 0x5ED9, 0xE1BB,\n\t0x5EDA, 0xBC70, 0x5EDB, 0xE573, 0x5EDC, 0xE1B9, 0x5EDD, 0xBC72,\t0x5EDE, 0xE574, 0x5EDF, 0xBC71, 0x5EE0, 0xBC74, 0x5EE1, 0xE575,\n\t0x5EE2, 0xBC6F, 0x5EE3, 0xBC73, 0x5EE5, 0xE973, 0x5EE6, 0xE971,\t0x5EE7, 0xE970, 0x5EE8, 0xE972, 0x5EE9, 0xE96F, 0x5EEC, 0xC366,\n\t0x5EEE, 0xF446, 0x5EEF, 0xF447, 0x5EF1, 0xF5CB, 0x5EF2, 0xF6DF,\t0x5EF3, 0xC655, 0x5EF6, 0xA9B5, 0x5EF7, 0xA7CA, 0x5EFA, 0xABD8,\n\t0x5EFE, 0xA47B, 0x5EFF, 0xA4DC, 0x5F01, 0xA5AF, 0x5F02, 0xC9DD,\t0x5F04, 0xA7CB, 0x5F05, 0xCAD2, 0x5F07, 0xCEBB, 0x5F08, 0xABD9,\n\t0x5F0A, 0xB9FA, 0x5F0B, 0xA47C, 0x5F0F, 0xA6A1, 0x5F12, 0xB749,\t0x5F13, 0xA47D, 0x5F14, 0xA4DD, 0x5F15, 0xA4DE, 0x5F17, 0xA5B1,\n\t0x5F18, 0xA5B0, 0x5F1A, 0xC9DE, 0x5F1B, 0xA6A2, 0x5F1D, 0xCAD3,\t0x5F1F, 0xA7CC, 0x5F22, 0xCC71, 0x5F23, 0xCC72, 0x5F24, 0xCC73,\n\t0x5F26, 0xA9B6, 0x5F27, 0xA9B7, 0x5F28, 0xCC70, 0x5F29, 0xA9B8,\t0x5F2D, 0xABDA, 0x5F2E, 0xCEBC, 0x5F30, 0xD17A, 0x5F31, 0xAE7A,\n\t0x5F33, 0xD179, 0x5F35, 0xB169, 0x5F36, 0xD54C, 0x5F37, 0xB16A,\t0x5F38, 0xD54D, 0x5F3C, 0xB45D, 0x5F40, 0xDD62, 0x5F43, 0xE1BF,\n\t0x5F44, 0xE1BE, 0x5F46, 0xB9FB, 0x5F48, 0xBC75, 0x5F49, 0xE576,\t0x5F4A, 0xBECA, 0x5F4B, 0xE974, 0x5F4C, 0xC0B1, 0x5F4E, 0xC573,\n\t0x5F4F, 0xF7D8, 0x5F54, 0xCC74, 0x5F56, 0xCEBD, 0x5F57, 0xB16B,\t0x5F58, 0xD8F4, 0x5F59, 0xB74A, 0x5F5D, 0xC255, 0x5F62, 0xA7CE,\n\t0x5F64, 0xA7CD, 0x5F65, 0xABDB, 0x5F67, 0xD17B, 0x5F69, 0xB16D,\t0x5F6A, 0xB343, 0x5F6B, 0xB16E, 0x5F6C, 0xB16C, 0x5F6D, 0xB45E,\n\t0x5F6F, 0xE1C0, 0x5F70, 0xB9FC, 0x5F71, 0xBC76, 0x5F73, 0xC94C,\t0x5F74, 0xC9DF, 0x5F76, 0xCAD5, 0x5F77, 0xA7CF, 0x5F78, 0xCAD4,\n\t0x5F79, 0xA7D0, 0x5F7C, 0xA9BC, 0x5F7D, 0xCC77, 0x5F7E, 0xCC76,\t0x5F7F, 0xA9BB, 0x5F80, 0xA9B9, 0x5F81, 0xA9BA, 0x5F82, 0xCC75,\n\t0x5F85, 0xABDD, 0x5F86, 0xCEBE, 0x5F87, 0xABE0, 0x5F88, 0xABDC,\t0x5F89, 0xABE2, 0x5F8A, 0xABDE, 0x5F8B, 0xABDF, 0x5F8C, 0xABE1,\n\t0x5F90, 0xAE7D, 0x5F91, 0xAE7C, 0x5F92, 0xAE7B, 0x5F96, 0xD54F,\t0x5F97, 0xB16F, 0x5F98, 0xB172, 0x5F99, 0xB170, 0x5F9B, 0xD54E,\n\t0x5F9C, 0xB175, 0x5F9E, 0xB171, 0x5F9F, 0xD550, 0x5FA0, 0xB174,\t0x5FA1, 0xB173, 0x5FA5, 0xD8F6, 0x5FA6, 0xD8F5, 0x5FA8, 0xB461,\n\t0x5FA9, 0xB45F, 0x5FAA, 0xB460, 0x5FAB, 0xD8F7, 0x5FAC, 0xB74B,\t0x5FAD, 0xDD64, 0x5FAE, 0xB74C, 0x5FAF, 0xDD63, 0x5FB2, 0xE577,\n\t0x5FB5, 0xBC78, 0x5FB6, 0xE1C1, 0x5FB7, 0xBC77, 0x5FB9, 0xB9FD,\t0x5FBB, 0xECDE, 0x5FBC, 0xE975, 0x5FBD, 0xC0B2, 0x5FBE, 0xECDD,\n\t0x5FBF, 0xF240, 0x5FC0, 0xF448, 0x5FC1, 0xF449, 0x5FC3, 0xA4DF,\t0x5FC5, 0xA5B2, 0x5FC9, 0xC97B, 0x5FCC, 0xA7D2, 0x5FCD, 0xA7D4,\n\t0x5FCF, 0xC9E2, 0x5FD0, 0xCAD8, 0x5FD1, 0xCAD7, 0x5FD2, 0xCAD6,\t0x5FD4, 0xC9E1, 0x5FD5, 0xC9E0, 0x5FD6, 0xA6A4, 0x5FD7, 0xA7D3,\n\t0x5FD8, 0xA7D1, 0x5FD9, 0xA6A3, 0x5FDD, 0xA9BD, 0x5FDE, 0xCC78,\t0x5FE0, 0xA9BE, 0x5FE1, 0xCADD, 0x5FE3, 0xCADF, 0x5FE4, 0xCADE,\n\t0x5FE5, 0xCC79, 0x5FE8, 0xCADA, 0x5FEA, 0xA7D8, 0x5FEB, 0xA7D6,\t0x5FED, 0xCAD9, 0x5FEE, 0xCADB, 0x5FEF, 0xCAE1, 0x5FF1, 0xA7D5,\n\t0x5FF3, 0xCADC, 0x5FF4, 0xCAE5, 0x5FF5, 0xA9C0, 0x5FF7, 0xCAE2,\t0x5FF8, 0xA7D7, 0x5FFA, 0xCAE0, 0x5FFB, 0xCAE3, 0x5FFD, 0xA9BF,\n\t0x5FFF, 0xA9C1, 0x6000, 0xCAE4, 0x6009, 0xCCAF, 0x600A, 0xCCA2,\t0x600B, 0xCC7E, 0x600C, 0xCCAE, 0x600D, 0xCCA9, 0x600E, 0xABE7,\n\t0x600F, 0xA9C2, 0x6010, 0xCCAA, 0x6011, 0xCCAD, 0x6012, 0xABE3,\t0x6013, 0xCCAC, 0x6014, 0xA9C3, 0x6015, 0xA9C8, 0x6016, 0xA9C6,\n\t0x6017, 0xCCA3, 0x6019, 0xCC7C, 0x601A, 0xCCA5, 0x601B, 0xA9CD,\t0x601C, 0xCCB0, 0x601D, 0xABE4, 0x601E, 0xCCA6, 0x6020, 0xABE5,\n\t0x6021, 0xA9C9, 0x6022, 0xCCA8, 0x6024, 0xCECD, 0x6025, 0xABE6,\t0x6026, 0xCC7B, 0x6027, 0xA9CA, 0x6028, 0xABE8, 0x6029, 0xA9CB,\n\t0x602A, 0xA9C7, 0x602B, 0xA9CC, 0x602C, 0xCCA7, 0x602D, 0xCC7A,\t0x602E, 0xCCAB, 0x602F, 0xA9C4, 0x6032, 0xCC7D, 0x6033, 0xCCA4,\n\t0x6034, 0xCCA1, 0x6035, 0xA9C5, 0x6037, 0xCEBF, 0x6039, 0xCEC0,\t0x6040, 0xCECA, 0x6041, 0xD1A1, 0x6042, 0xCECB, 0x6043, 0xABEE,\n\t0x6044, 0xCECE, 0x6045, 0xCEC4, 0x6046, 0xABED, 0x6047, 0xCEC6,\t0x6049, 0xCEC7, 0x604C, 0xCEC9, 0x604D, 0xABE9, 0x6050, 0xAEA3,\n\t0x6052, 0xF9DA, 0x6053, 0xCEC5, 0x6054, 0xCEC1, 0x6055, 0xAEA4,\t0x6058, 0xCECF, 0x6059, 0xAE7E, 0x605A, 0xD17D, 0x605B, 0xCEC8,\n\t0x605D, 0xD17C, 0x605E, 0xCEC3, 0x605F, 0xCECC, 0x6062, 0xABEC,\t0x6063, 0xAEA1, 0x6064, 0xABF2, 0x6065, 0xAEA2, 0x6066, 0xCED0,\n\t0x6067, 0xD17E, 0x6068, 0xABEB, 0x6069, 0xAEA6, 0x606A, 0xABF1,\t0x606B, 0xABF0, 0x606C, 0xABEF, 0x606D, 0xAEA5, 0x606E, 0xCED1,\n\t0x606F, 0xAEA7, 0x6070, 0xABEA, 0x6072, 0xCEC2, 0x607F, 0xB176,\t0x6080, 0xD1A4, 0x6081, 0xD1A6, 0x6083, 0xD1A8, 0x6084, 0xAEA8,\n\t0x6085, 0xAEAE, 0x6086, 0xD553, 0x6087, 0xD1AC, 0x6088, 0xD1A3,\t0x6089, 0xB178, 0x608A, 0xD551, 0x608C, 0xAEAD, 0x608D, 0xAEAB,\n\t0x608E, 0xD1AE, 0x6090, 0xD552, 0x6092, 0xD1A5, 0x6094, 0xAEAC,\t0x6095, 0xD1A9, 0x6096, 0xAEAF, 0x6097, 0xD1AB, 0x609A, 0xAEAA,\n\t0x609B, 0xD1AA, 0x609C, 0xD1AD, 0x609D, 0xD1A7, 0x609F, 0xAEA9,\t0x60A0, 0xB179, 0x60A2, 0xD1A2, 0x60A3, 0xB177, 0x60A8, 0xB17A,\n\t0x60B0, 0xD555, 0x60B1, 0xD55E, 0x60B2, 0xB464, 0x60B4, 0xB17C,\t0x60B5, 0xB1A3, 0x60B6, 0xB465, 0x60B7, 0xD560, 0x60B8, 0xB1AA,\n\t0x60B9, 0xD8F9, 0x60BA, 0xD556, 0x60BB, 0xB1A2, 0x60BC, 0xB1A5,\t0x60BD, 0xB17E, 0x60BE, 0xD554, 0x60BF, 0xD562, 0x60C0, 0xD565,\n\t0x60C1, 0xD949, 0x60C3, 0xD563, 0x60C4, 0xD8FD, 0x60C5, 0xB1A1,\t0x60C6, 0xB1A8, 0x60C7, 0xB1AC, 0x60C8, 0xD55D, 0x60C9, 0xD8F8,\n\t0x60CA, 0xD561, 0x60CB, 0xB17B, 0x60CC, 0xD8FA, 0x60CD, 0xD564,\t0x60CE, 0xD8FC, 0x60CF, 0xD559, 0x60D1, 0xB462, 0x60D3, 0xD557,\n\t0x60D4, 0xD558, 0x60D5, 0xB1A7, 0x60D8, 0xB1A6, 0x60D9, 0xD55B,\t0x60DA, 0xB1AB, 0x60DB, 0xD55F, 0x60DC, 0xB1A4, 0x60DD, 0xD55C,\n\t0x60DF, 0xB1A9, 0x60E0, 0xB466, 0x60E1, 0xB463, 0x60E2, 0xD8FB,\t0x60E4, 0xD55A, 0x60E6, 0xB17D, 0x60F0, 0xB46B, 0x60F1, 0xB46F,\n\t0x60F2, 0xD940, 0x60F3, 0xB751, 0x60F4, 0xB46D, 0x60F5, 0xD944,\t0x60F6, 0xB471, 0x60F7, 0xDD65, 0x60F8, 0xD946, 0x60F9, 0xB753,\n\t0x60FA, 0xB469, 0x60FB, 0xB46C, 0x60FC, 0xD947, 0x60FE, 0xD948,\t0x60FF, 0xD94E, 0x6100, 0xB473, 0x6101, 0xB754, 0x6103, 0xD94A,\n\t0x6104, 0xD94F, 0x6105, 0xD943, 0x6106, 0xB75E, 0x6108, 0xB755,\t0x6109, 0xB472, 0x610A, 0xD941, 0x610B, 0xD950, 0x610D, 0xB75D,\n\t0x610E, 0xB470, 0x610F, 0xB74E, 0x6110, 0xD94D, 0x6112, 0xB474,\t0x6113, 0xD945, 0x6114, 0xD8FE, 0x6115, 0xB46A, 0x6116, 0xD942,\n\t0x6118, 0xD94B, 0x611A, 0xB74D, 0x611B, 0xB752, 0x611C, 0xB467,\t0x611D, 0xD94C, 0x611F, 0xB750, 0x6123, 0xB468, 0x6127, 0xB75C,\n\t0x6128, 0xE1C3, 0x6129, 0xDD70, 0x612B, 0xDD68, 0x612C, 0xE1C2,\t0x612E, 0xDD6C, 0x612F, 0xDD6E, 0x6132, 0xDD6B, 0x6134, 0xB75B,\n\t0x6136, 0xDD6A, 0x6137, 0xB75F, 0x613B, 0xE1D2, 0x613E, 0xB75A,\t0x613F, 0xBA40, 0x6140, 0xDD71, 0x6141, 0xE1C4, 0x6144, 0xB758,\n\t0x6145, 0xDD69, 0x6146, 0xDD6D, 0x6147, 0xB9FE, 0x6148, 0xB74F,\t0x6149, 0xDD66, 0x614A, 0xDD67, 0x614B, 0xBA41, 0x614C, 0xB757,\n\t0x614D, 0xB759, 0x614E, 0xB756, 0x614F, 0xDD6F, 0x6152, 0xE1C8,\t0x6153, 0xE1C9, 0x6154, 0xE1CE, 0x6155, 0xBC7D, 0x6156, 0xE1D5,\n\t0x6158, 0xBA47, 0x615A, 0xBA46, 0x615B, 0xE1D0, 0x615D, 0xBC7C,\t0x615E, 0xE1C5, 0x615F, 0xBA45, 0x6161, 0xE1D4, 0x6162, 0xBA43,\n\t0x6163, 0xBA44, 0x6165, 0xE1D1, 0x6166, 0xE5AA, 0x6167, 0xBC7A,\t0x6168, 0xB46E, 0x616A, 0xE1D3, 0x616B, 0xBCA3, 0x616C, 0xE1CB,\n\t0x616E, 0xBC7B, 0x6170, 0xBCA2, 0x6171, 0xE1C6, 0x6172, 0xE1CA,\t0x6173, 0xE1C7, 0x6174, 0xE1CD, 0x6175, 0xBA48, 0x6176, 0xBC79,\n\t0x6177, 0xBA42, 0x6179, 0xE57A, 0x617A, 0xE1CF, 0x617C, 0xBCA1,\t0x617E, 0xBCA4, 0x6180, 0xE1CC, 0x6182, 0xBC7E, 0x6183, 0xE579,\n\t0x6189, 0xE57E, 0x618A, 0xBECE, 0x618B, 0xE578, 0x618C, 0xE9A3,\t0x618D, 0xE5A9, 0x618E, 0xBCA8, 0x6190, 0xBCA6, 0x6191, 0xBECC,\n\t0x6192, 0xE5A6, 0x6193, 0xE5A2, 0x6194, 0xBCAC, 0x6196, 0xE978,\t0x619A, 0xBCAA, 0x619B, 0xE5A1, 0x619D, 0xE976, 0x619F, 0xE5A5,\n\t0x61A1, 0xE5A8, 0x61A2, 0xE57D, 0x61A4, 0xBCAB, 0x61A7, 0xBCA5,\t0x61A8, 0xE977, 0x61A9, 0xBECD, 0x61AA, 0xE5A7, 0x61AB, 0xBCA7,\n\t0x61AC, 0xBCA9, 0x61AD, 0xE5A4, 0x61AE, 0xBCAD, 0x61AF, 0xE5A3,\t0x61B0, 0xE57C, 0x61B1, 0xE57B, 0x61B2, 0xBECB, 0x61B3, 0xE5AB,\n\t0x61B4, 0xE97A, 0x61B5, 0xECE0, 0x61B6, 0xBED0, 0x61B8, 0xE9A2,\t0x61BA, 0xE97E, 0x61BC, 0xECE1, 0x61BE, 0xBED1, 0x61BF, 0xE9A1,\n\t0x61C1, 0xE97C, 0x61C2, 0xC0B4, 0x61C3, 0xECDF, 0x61C5, 0xE979,\t0x61C6, 0xE97B, 0x61C7, 0xC0B5, 0x61C8, 0xBED3, 0x61C9, 0xC0B3,\n\t0x61CA, 0xBED2, 0x61CB, 0xC0B7, 0x61CC, 0xE97D, 0x61CD, 0xBECF,\t0x61D6, 0xEFCF, 0x61D8, 0xEFC7, 0x61DE, 0xECE7, 0x61DF, 0xEFC8,\n\t0x61E0, 0xECE3, 0x61E3, 0xC256, 0x61E4, 0xECE5, 0x61E5, 0xECE4,\t0x61E6, 0xC0B6, 0x61E7, 0xECE2, 0x61E8, 0xECE6, 0x61E9, 0xEFD0,\n\t0x61EA, 0xEFCC, 0x61EB, 0xEFCE, 0x61ED, 0xEFC9, 0x61EE, 0xEFCA,\t0x61F0, 0xEFCD, 0x61F1, 0xEFCB, 0x61F2, 0xC367, 0x61F5, 0xC36A,\n\t0x61F6, 0xC369, 0x61F7, 0xC368, 0x61F8, 0xC461, 0x61F9, 0xF44A,\t0x61FA, 0xC462, 0x61FB, 0xF241, 0x61FC, 0xC4DF, 0x61FD, 0xF5CC,\n\t0x61FE, 0xC4E0, 0x61FF, 0xC574, 0x6200, 0xC5CA, 0x6201, 0xF7D9,\t0x6203, 0xF7DA, 0x6204, 0xF7DB, 0x6207, 0xF9BA, 0x6208, 0xA4E0,\n\t0x6209, 0xC97C, 0x620A, 0xA5B3, 0x620C, 0xA6A6, 0x620D, 0xA6A7,\t0x620E, 0xA6A5, 0x6210, 0xA6A8, 0x6211, 0xA7DA, 0x6212, 0xA7D9,\n\t0x6214, 0xCCB1, 0x6215, 0xA9CF, 0x6216, 0xA9CE, 0x6219, 0xD1AF,\t0x621A, 0xB1AD, 0x621B, 0xB1AE, 0x621F, 0xB475, 0x6220, 0xDD72,\n\t0x6221, 0xB760, 0x6222, 0xB761, 0x6223, 0xDD74, 0x6224, 0xDD76,\t0x6225, 0xDD75, 0x6227, 0xE1D7, 0x6229, 0xE1D6, 0x622A, 0xBA49,\n\t0x622B, 0xE1D8, 0x622D, 0xE5AC, 0x622E, 0xBCAE, 0x6230, 0xBED4,\t0x6232, 0xC0B8, 0x6233, 0xC257, 0x6234, 0xC0B9, 0x6236, 0xA4E1,\n\t0x623A, 0xCAE6, 0x623D, 0xCCB2, 0x623E, 0xA9D1, 0x623F, 0xA9D0,\t0x6240, 0xA9D2, 0x6241, 0xABF3, 0x6242, 0xCED2, 0x6243, 0xCED3,\n\t0x6246, 0xD1B0, 0x6247, 0xAEB0, 0x6248, 0xB1AF, 0x6249, 0xB476,\t0x624A, 0xD951, 0x624B, 0xA4E2, 0x624D, 0xA47E, 0x624E, 0xA4E3,\n\t0x6250, 0xC97D, 0x6251, 0xA5B7, 0x6252, 0xA5B6, 0x6253, 0xA5B4,\t0x6254, 0xA5B5, 0x6258, 0xA6AB, 0x6259, 0xC9E9, 0x625A, 0xC9EB,\n\t0x625B, 0xA6AA, 0x625C, 0xC9E3, 0x625E, 0xC9E4, 0x6260, 0xC9EA,\t0x6261, 0xC9E6, 0x6262, 0xC9E8, 0x6263, 0xA6A9, 0x6264, 0xC9E5,\n\t0x6265, 0xC9EC, 0x6266, 0xC9E7, 0x626D, 0xA7E1, 0x626E, 0xA7EA,\t0x626F, 0xA7E8, 0x6270, 0xCAF0, 0x6271, 0xCAED, 0x6272, 0xCAF5,\n\t0x6273, 0xA7E6, 0x6274, 0xCAF6, 0x6276, 0xA7DF, 0x6277, 0xCAF3,\t0x6279, 0xA7E5, 0x627A, 0xCAEF, 0x627B, 0xCAEE, 0x627C, 0xA7E3,\n\t0x627D, 0xCAF4, 0x627E, 0xA7E4, 0x627F, 0xA9D3, 0x6280, 0xA7DE,\t0x6281, 0xCAF1, 0x6283, 0xCAE7, 0x6284, 0xA7DB, 0x6286, 0xA7EE,\n\t0x6287, 0xCAEC, 0x6288, 0xCAF2, 0x6289, 0xA7E0, 0x628A, 0xA7E2,\t0x628C, 0xCAE8, 0x628E, 0xCAE9, 0x628F, 0xCAEA, 0x6291, 0xA7ED,\n\t0x6292, 0xA7E7, 0x6293, 0xA7EC, 0x6294, 0xCAEB, 0x6295, 0xA7EB,\t0x6296, 0xA7DD, 0x6297, 0xA7DC, 0x6298, 0xA7E9, 0x62A8, 0xA9E1,\n\t0x62A9, 0xCCBE, 0x62AA, 0xCCB7, 0x62AB, 0xA9DC, 0x62AC, 0xA9EF,\t0x62AD, 0xCCB3, 0x62AE, 0xCCBA, 0x62AF, 0xCCBC, 0x62B0, 0xCCBF,\n\t0x62B1, 0xA9EA, 0x62B3, 0xCCBB, 0x62B4, 0xCCB4, 0x62B5, 0xA9E8,\t0x62B6, 0xCCB8, 0x62B8, 0xCCC0, 0x62B9, 0xA9D9, 0x62BB, 0xCCBD,\n\t0x62BC, 0xA9E3, 0x62BD, 0xA9E2, 0x62BE, 0xCCB6, 0x62BF, 0xA9D7,\t0x62C2, 0xA9D8, 0x62C4, 0xA9D6, 0x62C6, 0xA9EE, 0x62C7, 0xA9E6,\n\t0x62C8, 0xA9E0, 0x62C9, 0xA9D4, 0x62CA, 0xCCB9, 0x62CB, 0xA9DF,\t0x62CC, 0xA9D5, 0x62CD, 0xA9E7, 0x62CE, 0xA9F0, 0x62CF, 0xCED4,\n\t0x62D0, 0xA9E4, 0x62D1, 0xCCB5, 0x62D2, 0xA9DA, 0x62D3, 0xA9DD,\t0x62D4, 0xA9DE, 0x62D6, 0xA9EC, 0x62D7, 0xA9ED, 0x62D8, 0xA9EB,\n\t0x62D9, 0xA9E5, 0x62DA, 0xA9E9, 0x62DB, 0xA9DB, 0x62DC, 0xABF4,\t0x62EB, 0xCEDA, 0x62EC, 0xAC41, 0x62ED, 0xABF8, 0x62EE, 0xABFA,\n\t0x62EF, 0xAC40, 0x62F0, 0xCEE6, 0x62F1, 0xABFD, 0x62F2, 0xD1B1,\t0x62F3, 0xAEB1, 0x62F4, 0xAC43, 0x62F5, 0xCED7, 0x62F6, 0xCEDF,\n\t0x62F7, 0xABFE, 0x62F8, 0xCEDE, 0x62F9, 0xCEDB, 0x62FA, 0xCEE3,\t0x62FB, 0xCEE5, 0x62FC, 0xABF7, 0x62FD, 0xABFB, 0x62FE, 0xAC42,\n\t0x62FF, 0xAEB3, 0x6300, 0xCEE0, 0x6301, 0xABF9, 0x6302, 0xAC45,\t0x6303, 0xCED9, 0x6307, 0xABFC, 0x6308, 0xAEB2, 0x6309, 0xABF6,\n\t0x630B, 0xCED6, 0x630C, 0xCEDD, 0x630D, 0xCED5, 0x630E, 0xCED8,\t0x630F, 0xCEDC, 0x6310, 0xD1B2, 0x6311, 0xAC44, 0x6313, 0xCEE1,\n\t0x6314, 0xCEE2, 0x6315, 0xCEE4, 0x6316, 0xABF5, 0x6328, 0xAEC1,\t0x6329, 0xD1BE, 0x632A, 0xAEBF, 0x632B, 0xAEC0, 0x632C, 0xD1B4,\n\t0x632D, 0xD1C4, 0x632F, 0xAEB6, 0x6332, 0xD566, 0x6333, 0xD1C6,\t0x6334, 0xD1C0, 0x6336, 0xD1B7, 0x6338, 0xD1C9, 0x6339, 0xD1BA,\n\t0x633A, 0xAEBC, 0x633B, 0xD57D, 0x633C, 0xD1BD, 0x633D, 0xAEBE,\t0x633E, 0xAEB5, 0x6340, 0xD1CB, 0x6341, 0xD1BF, 0x6342, 0xAEB8,\n\t0x6343, 0xD1B8, 0x6344, 0xD1B5, 0x6345, 0xD1B6, 0x6346, 0xAEB9,\t0x6347, 0xD1C5, 0x6348, 0xD1CC, 0x6349, 0xAEBB, 0x634A, 0xD1BC,\n\t0x634B, 0xD1BB, 0x634C, 0xAEC3, 0x634D, 0xAEC2, 0x634E, 0xAEB4,\t0x634F, 0xAEBA, 0x6350, 0xAEBD, 0x6351, 0xD1C8, 0x6354, 0xD1C2,\n\t0x6355, 0xAEB7, 0x6356, 0xD1B3, 0x6357, 0xD1CA, 0x6358, 0xD1C1,\t0x6359, 0xD1C3, 0x635A, 0xD1C7, 0x6365, 0xD567, 0x6367, 0xB1B7,\n\t0x6368, 0xB1CB, 0x6369, 0xB1CA, 0x636B, 0xB1BF, 0x636D, 0xD579,\t0x636E, 0xD575, 0x636F, 0xD572, 0x6370, 0xD5A6, 0x6371, 0xB1BA,\n\t0x6372, 0xB1B2, 0x6375, 0xD577, 0x6376, 0xB4A8, 0x6377, 0xB1B6,\t0x6378, 0xD5A1, 0x637A, 0xB1CC, 0x637B, 0xB1C9, 0x637C, 0xD57B,\n\t0x637D, 0xD56A, 0x6380, 0xB1C8, 0x6381, 0xD5A3, 0x6382, 0xD569,\t0x6383, 0xB1BD, 0x6384, 0xB1C1, 0x6385, 0xD5A2, 0x6387, 0xD573,\n\t0x6388, 0xB1C2, 0x6389, 0xB1BC, 0x638A, 0xD568, 0x638C, 0xB478,\t0x638D, 0xD5A5, 0x638E, 0xD571, 0x638F, 0xB1C7, 0x6390, 0xD574,\n\t0x6391, 0xD5A4, 0x6392, 0xB1C6, 0x6394, 0xD952, 0x6396, 0xB1B3,\t0x6397, 0xD56F, 0x6398, 0xB1B8, 0x6399, 0xB1C3, 0x639B, 0xB1BE,\n\t0x639C, 0xD578, 0x639D, 0xD56E, 0x639E, 0xD56C, 0x639F, 0xD57E,\t0x63A0, 0xB1B0, 0x63A1, 0xB1C4, 0x63A2, 0xB1B4, 0x63A3, 0xB477,\n\t0x63A4, 0xD57C, 0x63A5, 0xB1B5, 0x63A7, 0xB1B1, 0x63A8, 0xB1C0,\t0x63A9, 0xB1BB, 0x63AA, 0xB1B9, 0x63AB, 0xD570, 0x63AC, 0xB1C5,\n\t0x63AD, 0xD56D, 0x63AE, 0xD57A, 0x63AF, 0xD576, 0x63B0, 0xD954,\t0x63B1, 0xD953, 0x63BD, 0xD56B, 0x63BE, 0xD964, 0x63C0, 0xB47A,\n\t0x63C2, 0xD96A, 0x63C3, 0xD959, 0x63C4, 0xD967, 0x63C5, 0xDD77,\t0x63C6, 0xB47D, 0x63C7, 0xD96B, 0x63C8, 0xD96E, 0x63C9, 0xB47C,\n\t0x63CA, 0xD95C, 0x63CB, 0xD96D, 0x63CC, 0xD96C, 0x63CD, 0xB47E,\t0x63CE, 0xD955, 0x63CF, 0xB479, 0x63D0, 0xB4A3, 0x63D2, 0xB4A1,\n\t0x63D3, 0xD969, 0x63D5, 0xD95F, 0x63D6, 0xB4A5, 0x63D7, 0xD970,\t0x63D8, 0xD968, 0x63D9, 0xD971, 0x63DA, 0xB4AD, 0x63DB, 0xB4AB,\n\t0x63DC, 0xD966, 0x63DD, 0xD965, 0x63DF, 0xD963, 0x63E0, 0xD95D,\t0x63E1, 0xB4A4, 0x63E3, 0xB4A2, 0x63E4, 0xD1B9, 0x63E5, 0xD956,\n\t0x63E7, 0xDDB7, 0x63E8, 0xD957, 0x63E9, 0xB47B, 0x63EA, 0xB4AA,\t0x63EB, 0xDD79, 0x63ED, 0xB4A6, 0x63EE, 0xB4A7, 0x63EF, 0xD958,\n\t0x63F0, 0xD96F, 0x63F1, 0xDD78, 0x63F2, 0xD960, 0x63F3, 0xD95B,\t0x63F4, 0xB4A9, 0x63F5, 0xD961, 0x63F6, 0xD95E, 0x63F9, 0xB4AE,\n\t0x6406, 0xB770, 0x6409, 0xDD7C, 0x640A, 0xDDB1, 0x640B, 0xDDB6,\t0x640C, 0xDDAA, 0x640D, 0xB76C, 0x640E, 0xDDBB, 0x640F, 0xB769,\n\t0x6410, 0xDD7A, 0x6412, 0xDD7B, 0x6413, 0xB762, 0x6414, 0xB76B,\t0x6415, 0xDDA4, 0x6416, 0xB76E, 0x6417, 0xB76F, 0x6418, 0xDDA5,\n\t0x641A, 0xDDB2, 0x641B, 0xDDB8, 0x641C, 0xB76A, 0x641E, 0xB764,\t0x641F, 0xDDA3, 0x6420, 0xDD7D, 0x6421, 0xDDBA, 0x6422, 0xDDA8,\n\t0x6423, 0xDDA9, 0x6424, 0xDD7E, 0x6425, 0xDDB4, 0x6426, 0xDDAB,\t0x6427, 0xDDB5, 0x6428, 0xDDAD, 0x642A, 0xB765, 0x642B, 0xE1D9,\n\t0x642C, 0xB768, 0x642D, 0xB766, 0x642E, 0xDDB9, 0x642F, 0xDDB0,\t0x6430, 0xDDAC, 0x6433, 0xDDA1, 0x6434, 0xBA53, 0x6435, 0xDDAF,\n\t0x6436, 0xB76D, 0x6437, 0xDDA7, 0x6439, 0xDDA6, 0x643D, 0xB767,\t0x643E, 0xB763, 0x643F, 0xE1EE, 0x6440, 0xDDB3, 0x6441, 0xDDAE,\n\t0x6443, 0xDDA2, 0x644B, 0xE1E9, 0x644D, 0xE1DA, 0x644E, 0xE1E5,\t0x6450, 0xE1EC, 0x6451, 0xBA51, 0x6452, 0xB4AC, 0x6453, 0xE1EA,\n\t0x6454, 0xBA4C, 0x6458, 0xBA4B, 0x6459, 0xE1F1, 0x645B, 0xE1DB,\t0x645C, 0xE1E8, 0x645D, 0xE1DC, 0x645E, 0xE1E7, 0x645F, 0xBA4F,\n\t0x6460, 0xE1EB, 0x6461, 0xD962, 0x6465, 0xE1F2, 0x6466, 0xE1E3,\t0x6467, 0xBA52, 0x6468, 0xE5BA, 0x6469, 0xBCAF, 0x646B, 0xE1F0,\n\t0x646C, 0xE1EF, 0x646D, 0xBA54, 0x646E, 0xE5AD, 0x646F, 0xBCB0,\t0x6470, 0xE5AE, 0x6472, 0xE1DF, 0x6473, 0xE1E0, 0x6474, 0xE1DD,\n\t0x6475, 0xE1E2, 0x6476, 0xE1DE, 0x6477, 0xE1F3, 0x6478, 0xBA4E,\t0x6479, 0xBCB1, 0x647A, 0xBA50, 0x647B, 0xBA55, 0x647D, 0xE1E1,\n\t0x647F, 0xE1ED, 0x6482, 0xE1E6, 0x6485, 0xE5B1, 0x6487, 0xBA4A,\t0x6488, 0xBCB4, 0x6489, 0xE9AA, 0x648A, 0xE5B6, 0x648B, 0xE5B5,\n\t0x648C, 0xE5B7, 0x648F, 0xE5B4, 0x6490, 0xBCB5, 0x6492, 0xBCBB,\t0x6493, 0xBCB8, 0x6495, 0xBCB9, 0x6496, 0xE5AF, 0x6497, 0xE5B2,\n\t0x6498, 0xE5BC, 0x6499, 0xBCC1, 0x649A, 0xBCBF, 0x649C, 0xE5B3,\t0x649D, 0xD95A, 0x649E, 0xBCB2, 0x649F, 0xE5B9, 0x64A0, 0xE5B0,\n\t0x64A2, 0xBCC2, 0x64A3, 0xE5B8, 0x64A4, 0xBA4D, 0x64A5, 0xBCB7,\t0x64A6, 0xE1E4, 0x64A9, 0xBCBA, 0x64AB, 0xBCBE, 0x64AC, 0xBCC0,\n\t0x64AD, 0xBCBD, 0x64AE, 0xBCBC, 0x64B0, 0xBCB6, 0x64B1, 0xE5BB,\t0x64B2, 0xBCB3, 0x64B3, 0xBCC3, 0x64BB, 0xBED8, 0x64BC, 0xBED9,\n\t0x64BD, 0xE9A9, 0x64BE, 0xBEE2, 0x64BF, 0xBEDF, 0x64C1, 0xBED6,\t0x64C2, 0xBEDD, 0x64C3, 0xE9AB, 0x64C4, 0xBEDB, 0x64C5, 0xBED5,\n\t0x64C7, 0xBEDC, 0x64C9, 0xE9A8, 0x64CA, 0xC0BB, 0x64CB, 0xBED7,\t0x64CD, 0xBEDE, 0x64CE, 0xC0BA, 0x64CF, 0xE9A7, 0x64D0, 0xE9A6,\n\t0x64D2, 0xBEE0, 0x64D4, 0xBEE1, 0x64D6, 0xE9A5, 0x64D7, 0xE9A4,\t0x64D8, 0xC0BC, 0x64D9, 0xE9AE, 0x64DA, 0xBEDA, 0x64DB, 0xE9AC,\n\t0x64E0, 0xC0BD, 0x64E2, 0xC0C2, 0x64E3, 0xECEA, 0x64E4, 0xECEC,\t0x64E6, 0xC0BF, 0x64E8, 0xECED, 0x64E9, 0xECE9, 0x64EB, 0xECEB,\n\t0x64EC, 0xC0C0, 0x64ED, 0xC0C3, 0x64EF, 0xECE8, 0x64F0, 0xC0BE,\t0x64F1, 0xC0C1, 0x64F2, 0xC259, 0x64F3, 0xE9AD, 0x64F4, 0xC258,\n\t0x64F7, 0xC25E, 0x64F8, 0xEFD4, 0x64FA, 0xC25C, 0x64FB, 0xC25D,\t0x64FC, 0xEFD7, 0x64FD, 0xEFD3, 0x64FE, 0xC25A, 0x64FF, 0xEFD1,\n\t0x6500, 0xC36B, 0x6501, 0xEFD5, 0x6503, 0xEFD6, 0x6504, 0xEFD2,\t0x6506, 0xC25B, 0x6507, 0xF242, 0x6509, 0xF245, 0x650C, 0xF246,\n\t0x650D, 0xF244, 0x650E, 0xF247, 0x650F, 0xC36C, 0x6510, 0xF243,\t0x6513, 0xF44E, 0x6514, 0xC464, 0x6515, 0xF44D, 0x6516, 0xF44C,\n\t0x6517, 0xF44B, 0x6518, 0xC463, 0x6519, 0xC465, 0x651B, 0xF5CD,\t0x651C, 0xC4E2, 0x651D, 0xC4E1, 0x6520, 0xF6E1, 0x6521, 0xF6E0,\n\t0x6522, 0xF6E3, 0x6523, 0xC5CB, 0x6524, 0xC575, 0x6525, 0xF7DD,\t0x6526, 0xF6E2, 0x6529, 0xF7DC, 0x652A, 0xC5CD, 0x652B, 0xC5CC,\n\t0x652C, 0xC5F3, 0x652D, 0xF8A9, 0x652E, 0xF8EF, 0x652F, 0xA4E4,\t0x6532, 0xD972, 0x6533, 0xE9AF, 0x6536, 0xA6AC, 0x6537, 0xCAF7,\n\t0x6538, 0xA7F1, 0x6539, 0xA7EF, 0x653B, 0xA7F0, 0x653D, 0xCCC1,\t0x653E, 0xA9F1, 0x653F, 0xAC46, 0x6541, 0xCEE7, 0x6543, 0xCEE8,\n\t0x6545, 0xAC47, 0x6546, 0xD1CE, 0x6548, 0xAEC4, 0x6549, 0xAEC5,\t0x654A, 0xD1CD, 0x654F, 0xB1D3, 0x6551, 0xB1CF, 0x6553, 0xD5A7,\n\t0x6554, 0xB1D6, 0x6555, 0xB1D5, 0x6556, 0xB1CE, 0x6557, 0xB1D1,\t0x6558, 0xB1D4, 0x6559, 0xB1D0, 0x655C, 0xD976, 0x655D, 0xB1CD,\n\t0x655E, 0xB4AF, 0x6562, 0xB4B1, 0x6563, 0xB4B2, 0x6564, 0xD975,\t0x6565, 0xD978, 0x6566, 0xB4B0, 0x6567, 0xD973, 0x6568, 0xD977,\n\t0x656A, 0xD974, 0x656C, 0xB771, 0x656F, 0xDDBC, 0x6572, 0xBA56,\t0x6573, 0xE1F4, 0x6574, 0xBEE3, 0x6575, 0xBCC4, 0x6576, 0xE5BD,\n\t0x6577, 0xBCC5, 0x6578, 0xBCC6, 0x6579, 0xE5BF, 0x657A, 0xE5BE,\t0x657B, 0xE5C0, 0x657C, 0xE9B1, 0x657F, 0xE9B0, 0x6580, 0xECEF,\n\t0x6581, 0xECEE, 0x6582, 0xC0C4, 0x6583, 0xC0C5, 0x6584, 0xF248,\t0x6587, 0xA4E5, 0x658C, 0xD979, 0x6590, 0xB4B4, 0x6591, 0xB4B3,\n\t0x6592, 0xDDBD, 0x6594, 0xEFD8, 0x6595, 0xC4E3, 0x6596, 0xF7DE,\t0x6597, 0xA4E6, 0x6599, 0xAEC6, 0x659B, 0xB1D8, 0x659C, 0xB1D7,\n\t0x659D, 0xD97A, 0x659E, 0xD97B, 0x659F, 0xB772, 0x65A0, 0xE1F5,\t0x65A1, 0xBA57, 0x65A2, 0xE9B2, 0x65A4, 0xA4E7, 0x65A5, 0xA5B8,\n\t0x65A7, 0xA9F2, 0x65A8, 0xCCC2, 0x65AA, 0xCEE9, 0x65AB, 0xAC48,\t0x65AC, 0xB1D9, 0x65AE, 0xD97C, 0x65AF, 0xB4B5, 0x65B0, 0xB773,\n\t0x65B2, 0xE5C1, 0x65B3, 0xE5C2, 0x65B6, 0xECF0, 0x65B7, 0xC25F,\t0x65B8, 0xF8F0, 0x65B9, 0xA4E8, 0x65BB, 0xCCC3, 0x65BC, 0xA9F3,\n\t0x65BD, 0xAC49, 0x65BF, 0xCEEA, 0x65C1, 0xAEC7, 0x65C2, 0xD1D2,\t0x65C3, 0xD1D0, 0x65C4, 0xD1D1, 0x65C5, 0xAEC8, 0x65C6, 0xD1CF,\n\t0x65CB, 0xB1DB, 0x65CC, 0xB1DC, 0x65CD, 0xD5A8, 0x65CE, 0xB1DD,\t0x65CF, 0xB1DA, 0x65D0, 0xD97D, 0x65D2, 0xD97E, 0x65D3, 0xDDBE,\n\t0x65D6, 0xBA59, 0x65D7, 0xBA58, 0x65DA, 0xECF1, 0x65DB, 0xEFD9,\t0x65DD, 0xF24A, 0x65DE, 0xF249, 0x65DF, 0xF44F, 0x65E1, 0xC95E,\n\t0x65E2, 0xAC4A, 0x65E5, 0xA4E9, 0x65E6, 0xA5B9, 0x65E8, 0xA6AE,\t0x65E9, 0xA6AD, 0x65EC, 0xA6AF, 0x65ED, 0xA6B0, 0x65EE, 0xC9EE,\n\t0x65EF, 0xC9ED, 0x65F0, 0xCAF8, 0x65F1, 0xA7F2, 0x65F2, 0xCAFB,\t0x65F3, 0xCAFA, 0x65F4, 0xCAF9, 0x65F5, 0xCAFC, 0x65FA, 0xA9F4,\n\t0x65FB, 0xCCC9, 0x65FC, 0xCCC5, 0x65FD, 0xCCCE, 0x6600, 0xA9FB,\t0x6602, 0xA9F9, 0x6603, 0xCCCA, 0x6604, 0xCCC6, 0x6605, 0xCCCD,\n\t0x6606, 0xA9F8, 0x6607, 0xAA40, 0x6608, 0xCCC8, 0x6609, 0xCCC4,\t0x660A, 0xA9FE, 0x660B, 0xCCCB, 0x660C, 0xA9F7, 0x660D, 0xCCCC,\n\t0x660E, 0xA9FA, 0x660F, 0xA9FC, 0x6610, 0xCCD0, 0x6611, 0xCCCF,\t0x6612, 0xCCC7, 0x6613, 0xA9F6, 0x6614, 0xA9F5, 0x6615, 0xA9FD,\n\t0x661C, 0xCEEF, 0x661D, 0xCEF5, 0x661F, 0xAC50, 0x6620, 0xAC4D,\t0x6621, 0xCEEC, 0x6622, 0xCEF1, 0x6624, 0xAC53, 0x6625, 0xAC4B,\n\t0x6626, 0xCEF0, 0x6627, 0xAC4E, 0x6628, 0xAC51, 0x662B, 0xCEF3,\t0x662D, 0xAC4C, 0x662E, 0xCEF8, 0x662F, 0xAC4F, 0x6631, 0xAC52,\n\t0x6632, 0xCEED, 0x6633, 0xCEF2, 0x6634, 0xCEF6, 0x6635, 0xCEEE,\t0x6636, 0xCEEB, 0x6639, 0xCEF7, 0x663A, 0xCEF4, 0x6641, 0xAED0,\n\t0x6642, 0xAEC9, 0x6643, 0xAECC, 0x6645, 0xAECF, 0x6647, 0xD1D5,\t0x6649, 0xAECA, 0x664A, 0xD1D3, 0x664C, 0xAECE, 0x664F, 0xAECB,\n\t0x6651, 0xD1D6, 0x6652, 0xAECD, 0x6659, 0xD5AC, 0x665A, 0xB1DF,\t0x665B, 0xD5AB, 0x665C, 0xD5AD, 0x665D, 0xB1DE, 0x665E, 0xB1E3,\n\t0x665F, 0xD1D4, 0x6661, 0xD5AA, 0x6662, 0xD5AE, 0x6664, 0xB1E0,\t0x6665, 0xD5A9, 0x6666, 0xB1E2, 0x6668, 0xB1E1, 0x666A, 0xD9A7,\n\t0x666C, 0xD9A2, 0x666E, 0xB4B6, 0x666F, 0xB4BA, 0x6670, 0xB4B7,\t0x6671, 0xD9A5, 0x6672, 0xD9A8, 0x6674, 0xB4B8, 0x6676, 0xB4B9,\n\t0x6677, 0xB4BE, 0x6678, 0xDDC7, 0x6679, 0xD9A6, 0x667A, 0xB4BC,\t0x667B, 0xD9A3, 0x667C, 0xD9A1, 0x667E, 0xB4BD, 0x6680, 0xD9A4,\n\t0x6684, 0xB779, 0x6686, 0xDDBF, 0x6687, 0xB776, 0x6688, 0xB777,\t0x6689, 0xB775, 0x668A, 0xDDC4, 0x668B, 0xDDC3, 0x668C, 0xDDC0,\n\t0x668D, 0xB77B, 0x6690, 0xDDC2, 0x6691, 0xB4BB, 0x6694, 0xDDC6,\t0x6695, 0xDDC1, 0x6696, 0xB778, 0x6697, 0xB774, 0x6698, 0xB77A,\n\t0x6699, 0xDDC5, 0x669D, 0xBA5C, 0x669F, 0xE1F8, 0x66A0, 0xE1F7,\t0x66A1, 0xE1F6, 0x66A2, 0xBA5A, 0x66A8, 0xBA5B, 0x66A9, 0xE5C5,\n\t0x66AA, 0xE5C8, 0x66AB, 0xBCC8, 0x66AE, 0xBCC7, 0x66AF, 0xE5C9,\t0x66B0, 0xE5C4, 0x66B1, 0xBCCA, 0x66B2, 0xE5C6, 0x66B4, 0xBCC9,\n\t0x66B5, 0xE5C3, 0x66B7, 0xE5C7, 0x66B8, 0xBEE9, 0x66B9, 0xBEE6,\t0x66BA, 0xE9BB, 0x66BB, 0xE9BA, 0x66BD, 0xE9B9, 0x66BE, 0xE9B4,\n\t0x66C0, 0xE9B5, 0x66C4, 0xBEE7, 0x66C6, 0xBEE4, 0x66C7, 0xBEE8,\t0x66C8, 0xE9B3, 0x66C9, 0xBEE5, 0x66CA, 0xE9B6, 0x66CB, 0xE9B7,\n\t0x66CC, 0xE9BC, 0x66CF, 0xE9B8, 0x66D2, 0xECF2, 0x66D6, 0xC0C7,\t0x66D8, 0xEFDC, 0x66D9, 0xC0C6, 0x66DA, 0xEFDA, 0x66DB, 0xEFDB,\n\t0x66DC, 0xC260, 0x66DD, 0xC36E, 0x66DE, 0xF24B, 0x66E0, 0xC36D,\t0x66E3, 0xF451, 0x66E4, 0xF452, 0x66E6, 0xC466, 0x66E8, 0xF450,\n\t0x66E9, 0xC4E4, 0x66EB, 0xF7DF, 0x66EC, 0xC5CE, 0x66ED, 0xF8AA,\t0x66EE, 0xF8AB, 0x66F0, 0xA4EA, 0x66F2, 0xA6B1, 0x66F3, 0xA6B2,\n\t0x66F4, 0xA7F3, 0x66F6, 0xCCD1, 0x66F7, 0xAC54, 0x66F8, 0xAED1,\t0x66F9, 0xB1E4, 0x66FC, 0xB0D2, 0x66FE, 0xB4BF, 0x66FF, 0xB4C0,\n\t0x6700, 0xB3CC, 0x6701, 0xD9A9, 0x6703, 0xB77C, 0x6704, 0xE1FA,\t0x6705, 0xE1F9, 0x6708, 0xA4EB, 0x6709, 0xA6B3, 0x670A, 0xCCD2,\n\t0x670B, 0xAA42, 0x670D, 0xAA41, 0x670F, 0xCEF9, 0x6710, 0xCEFA,\t0x6712, 0xD1D7, 0x6713, 0xD1D8, 0x6714, 0xAED2, 0x6715, 0xAED3,\n\t0x6717, 0xAED4, 0x6718, 0xD5AF, 0x671B, 0xB1E6, 0x671D, 0xB4C2,\t0x671F, 0xB4C1, 0x6720, 0xDDC8, 0x6721, 0xDF7A, 0x6722, 0xE1FB,\n\t0x6723, 0xE9BD, 0x6726, 0xC261, 0x6727, 0xC467, 0x6728, 0xA4EC,\t0x672A, 0xA5BC, 0x672B, 0xA5BD, 0x672C, 0xA5BB, 0x672D, 0xA5BE,\n\t0x672E, 0xA5BA, 0x6731, 0xA6B6, 0x6733, 0xC9F6, 0x6734, 0xA6B5,\t0x6735, 0xA6B7, 0x6738, 0xC9F1, 0x6739, 0xC9F0, 0x673A, 0xC9F3,\n\t0x673B, 0xC9F2, 0x673C, 0xC9F5, 0x673D, 0xA6B4, 0x673E, 0xC9EF,\t0x673F, 0xC9F4, 0x6745, 0xCAFD, 0x6746, 0xA7FD, 0x6747, 0xCAFE,\n\t0x6748, 0xCB43, 0x6749, 0xA7FC, 0x674B, 0xCB47, 0x674C, 0xCB42,\t0x674D, 0xCB45, 0x674E, 0xA7F5, 0x674F, 0xA7F6, 0x6750, 0xA7F7,\n\t0x6751, 0xA7F8, 0x6753, 0xA840, 0x6755, 0xCB41, 0x6756, 0xA7FA,\t0x6757, 0xA841, 0x6759, 0xCB40, 0x675A, 0xCB46, 0x675C, 0xA7F9,\n\t0x675D, 0xCB44, 0x675E, 0xA7FB, 0x675F, 0xA7F4, 0x6760, 0xA7FE,\t0x676A, 0xAA57, 0x676C, 0xCCD4, 0x676D, 0xAA43, 0x676F, 0xAA4D,\n\t0x6770, 0xAA4E, 0x6771, 0xAA46, 0x6772, 0xAA58, 0x6773, 0xAA48,\t0x6774, 0xCCDC, 0x6775, 0xAA53, 0x6776, 0xCCD7, 0x6777, 0xAA49,\n\t0x6778, 0xCCE6, 0x6779, 0xCCE7, 0x677A, 0xCCDF, 0x677B, 0xCCD8,\t0x677C, 0xAA56, 0x677D, 0xCCE4, 0x677E, 0xAA51, 0x677F, 0xAA4F,\n\t0x6781, 0xCCE5, 0x6783, 0xCCE3, 0x6784, 0xCCDB, 0x6785, 0xCCD3,\t0x6786, 0xCCDA, 0x6787, 0xAA4A, 0x6789, 0xAA50, 0x678B, 0xAA44,\n\t0x678C, 0xCCDE, 0x678D, 0xCCDD, 0x678E, 0xCCD5, 0x6790, 0xAA52,\t0x6791, 0xCCE1, 0x6792, 0xCCD6, 0x6793, 0xAA55, 0x6794, 0xCCE8,\n\t0x6795, 0xAA45, 0x6797, 0xAA4C, 0x6798, 0xCCD9, 0x6799, 0xCCE2,\t0x679A, 0xAA54, 0x679C, 0xAA47, 0x679D, 0xAA4B, 0x679F, 0xCCE0,\n\t0x67AE, 0xCF5B, 0x67AF, 0xAC5C, 0x67B0, 0xAC69, 0x67B2, 0xCF56,\t0x67B3, 0xCF4C, 0x67B4, 0xAC62, 0x67B5, 0xCF4A, 0x67B6, 0xAC5B,\n\t0x67B7, 0xCF45, 0x67B8, 0xAC65, 0x67B9, 0xCF52, 0x67BA, 0xCEFE,\t0x67BB, 0xCF41, 0x67C0, 0xCF44, 0x67C1, 0xCEFB, 0x67C2, 0xCF51,\n\t0x67C3, 0xCF61, 0x67C4, 0xAC60, 0x67C5, 0xCF46, 0x67C6, 0xCF58,\t0x67C8, 0xCEFD, 0x67C9, 0xCF5F, 0x67CA, 0xCF60, 0x67CB, 0xCF63,\n\t0x67CC, 0xCF5A, 0x67CD, 0xCF4B, 0x67CE, 0xCF53, 0x67CF, 0xAC66,\t0x67D0, 0xAC59, 0x67D1, 0xAC61, 0x67D2, 0xAC6D, 0x67D3, 0xAC56,\n\t0x67D4, 0xAC58, 0x67D8, 0xCF43, 0x67D9, 0xAC6A, 0x67DA, 0xAC63,\t0x67DB, 0xCF5D, 0x67DC, 0xCF40, 0x67DD, 0xAC6C, 0x67DE, 0xAC67,\n\t0x67DF, 0xCF49, 0x67E2, 0xAC6B, 0x67E3, 0xCF50, 0x67E4, 0xCF48,\t0x67E5, 0xAC64, 0x67E6, 0xCF5C, 0x67E7, 0xCF54, 0x67E9, 0xAC5E,\n\t0x67EA, 0xCF62, 0x67EB, 0xCF47, 0x67EC, 0xAC5A, 0x67ED, 0xCF59,\t0x67EE, 0xCF4F, 0x67EF, 0xAC5F, 0x67F0, 0xCF55, 0x67F1, 0xAC57,\n\t0x67F2, 0xCEFC, 0x67F3, 0xAC68, 0x67F4, 0xAEE3, 0x67F5, 0xAC5D,\t0x67F6, 0xCF4E, 0x67F7, 0xCF4D, 0x67F8, 0xCF42, 0x67FA, 0xCF5E,\n\t0x67FC, 0xCF57, 0x67FF, 0xAC55, 0x6812, 0xD1EC, 0x6813, 0xAEEA,\t0x6814, 0xD1ED, 0x6816, 0xD1E1, 0x6817, 0xAEDF, 0x6818, 0xAEEB,\n\t0x681A, 0xD1DA, 0x681C, 0xD1E3, 0x681D, 0xD1EB, 0x681F, 0xD1D9,\t0x6820, 0xD1F4, 0x6821, 0xAED5, 0x6825, 0xD1F3, 0x6826, 0xD1EE,\n\t0x6828, 0xD1EF, 0x6829, 0xAEDD, 0x682A, 0xAEE8, 0x682B, 0xD1E5,\t0x682D, 0xD1E6, 0x682E, 0xD1F0, 0x682F, 0xD1E7, 0x6831, 0xD1E2,\n\t0x6832, 0xD1DC, 0x6833, 0xD1DD, 0x6834, 0xD1EA, 0x6835, 0xD1E4,\t0x6838, 0xAED6, 0x6839, 0xAEDA, 0x683A, 0xD1F2, 0x683B, 0xD1DE,\n\t0x683C, 0xAEE6, 0x683D, 0xAEE2, 0x6840, 0xAEE5, 0x6841, 0xAEEC,\t0x6842, 0xAEDB, 0x6843, 0xAEE7, 0x6844, 0xD1E9, 0x6845, 0xAEE9,\n\t0x6846, 0xAED8, 0x6848, 0xAED7, 0x6849, 0xD1DB, 0x684B, 0xD1DF,\t0x684C, 0xAEE0, 0x684D, 0xD1F1, 0x684E, 0xD1E8, 0x684F, 0xD1E0,\n\t0x6850, 0xAEE4, 0x6851, 0xAEE1, 0x6853, 0xAED9, 0x6854, 0xAEDC,\t0x686B, 0xD5C4, 0x686D, 0xD5B4, 0x686E, 0xD5B5, 0x686F, 0xD5B9,\n\t0x6871, 0xD5C8, 0x6872, 0xD5C5, 0x6874, 0xD5BE, 0x6875, 0xD5BD,\t0x6876, 0xB1ED, 0x6877, 0xD5C1, 0x6878, 0xD5D0, 0x6879, 0xD5B0,\n\t0x687B, 0xD5D1, 0x687C, 0xD5C3, 0x687D, 0xD5D5, 0x687E, 0xD5C9,\t0x687F, 0xB1EC, 0x6880, 0xD5C7, 0x6881, 0xB1E7, 0x6882, 0xB1FC,\n\t0x6883, 0xB1F2, 0x6885, 0xB1F6, 0x6886, 0xB1F5, 0x6887, 0xD5B1,\t0x6889, 0xD5CE, 0x688A, 0xD5D4, 0x688B, 0xD5CC, 0x688C, 0xD5D3,\n\t0x688F, 0xD5C0, 0x6890, 0xD5B2, 0x6891, 0xD5D2, 0x6892, 0xD5C2,\t0x6893, 0xB1EA, 0x6894, 0xB1F7, 0x6896, 0xD5CB, 0x6897, 0xB1F0,\n\t0x689B, 0xD5CA, 0x689C, 0xD5B3, 0x689D, 0xB1F8, 0x689F, 0xB1FA,\t0x68A0, 0xD5CD, 0x68A1, 0xB1FB, 0x68A2, 0xB1E9, 0x68A3, 0xD5BA,\n\t0x68A4, 0xD5CF, 0x68A7, 0xB1EF, 0x68A8, 0xB1F9, 0x68A9, 0xD5BC,\t0x68AA, 0xD5C6, 0x68AB, 0xD5B7, 0x68AC, 0xD5BB, 0x68AD, 0xB1F4,\n\t0x68AE, 0xD5B6, 0x68AF, 0xB1E8, 0x68B0, 0xB1F1, 0x68B1, 0xB1EE,\t0x68B2, 0xD5BF, 0x68B3, 0xAEDE, 0x68B4, 0xD9C0, 0x68B5, 0xB1EB,\n\t0x68C4, 0xB1F3, 0x68C6, 0xD9C3, 0x68C7, 0xD9D9, 0x68C8, 0xD9CE,\t0x68C9, 0xB4D6, 0x68CB, 0xB4D1, 0x68CC, 0xD9BD, 0x68CD, 0xB4D2,\n\t0x68CE, 0xD9CD, 0x68D0, 0xD9C6, 0x68D1, 0xD9D3, 0x68D2, 0xB4CE,\t0x68D3, 0xD9AB, 0x68D4, 0xD9D5, 0x68D5, 0xB4C4, 0x68D6, 0xD9B3,\n\t0x68D7, 0xB4C7, 0x68D8, 0xB4C6, 0x68DA, 0xB4D7, 0x68DC, 0xD9AD,\t0x68DD, 0xD9CF, 0x68DE, 0xD9D0, 0x68DF, 0xB4C9, 0x68E0, 0xB4C5,\n\t0x68E1, 0xD9BB, 0x68E3, 0xB4D0, 0x68E4, 0xD9B6, 0x68E6, 0xD9D1,\t0x68E7, 0xB4CC, 0x68E8, 0xD9C9, 0x68E9, 0xD9D6, 0x68EA, 0xD9B0,\n\t0x68EB, 0xD9B5, 0x68EC, 0xD9AF, 0x68EE, 0xB4CB, 0x68EF, 0xD9C2,\t0x68F0, 0xDDDE, 0x68F1, 0xD9B1, 0x68F2, 0xB4CF, 0x68F3, 0xD9BA,\n\t0x68F4, 0xD9D2, 0x68F5, 0xB4CA, 0x68F6, 0xD9B7, 0x68F7, 0xD9B4,\t0x68F8, 0xD9C5, 0x68F9, 0xB4CD, 0x68FA, 0xB4C3, 0x68FB, 0xB4D9,\n\t0x68FC, 0xD9C8, 0x68FD, 0xD9C7, 0x6904, 0xD9AC, 0x6905, 0xB4C8,\t0x6906, 0xD9D4, 0x6907, 0xD9BC, 0x6908, 0xD9BE, 0x690A, 0xD9CB,\n\t0x690B, 0xD9CA, 0x690C, 0xD9AA, 0x690D, 0xB4D3, 0x690E, 0xB4D5,\t0x690F, 0xD9B2, 0x6910, 0xD9B9, 0x6911, 0xD9C1, 0x6912, 0xB4D4,\n\t0x6913, 0xD9B8, 0x6914, 0xD9C4, 0x6915, 0xD9D7, 0x6917, 0xD9CC,\t0x6925, 0xD9D8, 0x692A, 0xD9AE, 0x692F, 0xDDF2, 0x6930, 0xB7A6,\n\t0x6932, 0xDDF0, 0x6933, 0xDDDB, 0x6934, 0xDDE0, 0x6935, 0xDDD9,\t0x6937, 0xDDEC, 0x6938, 0xDDCB, 0x6939, 0xDDD2, 0x693B, 0xDDEA,\n\t0x693C, 0xDDF4, 0x693D, 0xDDDC, 0x693F, 0xDDCF, 0x6940, 0xDDE2,\t0x6941, 0xDDE7, 0x6942, 0xDDD3, 0x6944, 0xDDE4, 0x6945, 0xDDD0,\n\t0x6948, 0xDDD7, 0x6949, 0xDDD8, 0x694A, 0xB7A8, 0x694B, 0xDDEB,\t0x694C, 0xDDE9, 0x694E, 0xDDCC, 0x694F, 0xDDEE, 0x6951, 0xDDEF,\n\t0x6952, 0xDDF1, 0x6953, 0xB7AC, 0x6954, 0xB7A4, 0x6956, 0xD5B8,\t0x6957, 0xDDD4, 0x6958, 0xDDE6, 0x6959, 0xDDD5, 0x695A, 0xB7A1,\n\t0x695B, 0xB7B1, 0x695C, 0xDDED, 0x695D, 0xB7AF, 0x695E, 0xB7AB,\t0x695F, 0xDDCA, 0x6960, 0xB7A3, 0x6962, 0xDDCD, 0x6963, 0xB7B0,\n\t0x6965, 0xDDDD, 0x6966, 0xDDC9, 0x6968, 0xB7A9, 0x6969, 0xDDE1,\t0x696A, 0xDDD1, 0x696B, 0xB7AA, 0x696C, 0xDDDA, 0x696D, 0xB77E,\n\t0x696E, 0xB4D8, 0x696F, 0xDDE3, 0x6970, 0xD9BF, 0x6971, 0xDDCE,\t0x6974, 0xDDE8, 0x6975, 0xB7A5, 0x6976, 0xDDE5, 0x6977, 0xB7A2,\n\t0x6978, 0xDDDF, 0x6979, 0xB7AD, 0x697A, 0xDDD6, 0x697B, 0xDDF3,\t0x6982, 0xB7A7, 0x6983, 0xDEC6, 0x6986, 0xB7AE, 0x698D, 0xE24A,\n\t0x698E, 0xE248, 0x6990, 0xE25E, 0x6991, 0xE246, 0x6993, 0xE258,\t0x6994, 0xB77D, 0x6995, 0xBA5F, 0x6996, 0xE242, 0x6997, 0xE25D,\n\t0x6999, 0xE247, 0x699A, 0xE255, 0x699B, 0xBA64, 0x699C, 0xBA5D,\t0x699E, 0xE25B, 0x69A0, 0xE240, 0x69A1, 0xE25A, 0x69A3, 0xBA6F,\n\t0x69A4, 0xE251, 0x69A5, 0xE261, 0x69A6, 0xBA6D, 0x69A7, 0xE249,\t0x69A8, 0xBA5E, 0x69A9, 0xE24B, 0x69AA, 0xE259, 0x69AB, 0xBA67,\n\t0x69AC, 0xE244, 0x69AD, 0xBA6B, 0x69AE, 0xBA61, 0x69AF, 0xE24D,\t0x69B0, 0xE243, 0x69B1, 0xE1FC, 0x69B3, 0xE257, 0x69B4, 0xBA68,\n\t0x69B5, 0xE260, 0x69B6, 0xE1FD, 0x69B7, 0xBA65, 0x69B9, 0xE253,\t0x69BB, 0xBA66, 0x69BC, 0xE245, 0x69BD, 0xE250, 0x69BE, 0xE24C,\n\t0x69BF, 0xE24E, 0x69C1, 0xBA60, 0x69C2, 0xE25F, 0x69C3, 0xBA6E,\t0x69C4, 0xE24F, 0x69C6, 0xE262, 0x69C9, 0xE1FE, 0x69CA, 0xE254,\n\t0x69CB, 0xBA63, 0x69CC, 0xBA6C, 0x69CD, 0xBA6A, 0x69CE, 0xE241,\t0x69CF, 0xE256, 0x69D0, 0xBA69, 0x69D3, 0xBA62, 0x69D4, 0xE252,\n\t0x69D9, 0xE25C, 0x69E2, 0xE5D5, 0x69E4, 0xE5D1, 0x69E5, 0xE5CD,\t0x69E6, 0xE5E1, 0x69E7, 0xE5DE, 0x69E8, 0xBCCD, 0x69EB, 0xE5E5,\n\t0x69EC, 0xE5D4, 0x69ED, 0xBCD8, 0x69EE, 0xE5DB, 0x69F1, 0xE5D0,\t0x69F2, 0xE5DA, 0x69F3, 0xBCD5, 0x69F4, 0xE5EE, 0x69F6, 0xE5EB,\n\t0x69F7, 0xE5DD, 0x69F8, 0xE5CE, 0x69FB, 0xE5E2, 0x69FC, 0xE5E4,\t0x69FD, 0xBCD1, 0x69FE, 0xE5D8, 0x69FF, 0xE5D3, 0x6A00, 0xE5CA,\n\t0x6A01, 0xBCCE, 0x6A02, 0xBCD6, 0x6A04, 0xE5E7, 0x6A05, 0xBCD7,\t0x6A06, 0xE5CB, 0x6A07, 0xE5ED, 0x6A08, 0xE5E0, 0x6A09, 0xE5E6,\n\t0x6A0A, 0xBCD4, 0x6A0D, 0xE5E3, 0x6A0F, 0xE5EA, 0x6A11, 0xBCD9,\t0x6A13, 0xBCD3, 0x6A14, 0xE5DC, 0x6A15, 0xE5CF, 0x6A16, 0xE5EF,\n\t0x6A17, 0xE5CC, 0x6A18, 0xE5E8, 0x6A19, 0xBCD0, 0x6A1B, 0xE5D6,\t0x6A1D, 0xE5D7, 0x6A1E, 0xBCCF, 0x6A1F, 0xBCCC, 0x6A20, 0xE5D2,\n\t0x6A21, 0xBCD2, 0x6A23, 0xBCCB, 0x6A25, 0xE5E9, 0x6A26, 0xE5EC,\t0x6A27, 0xE5D9, 0x6A28, 0xE9CA, 0x6A32, 0xE9C2, 0x6A34, 0xE9BE,\n\t0x6A35, 0xBEF6, 0x6A38, 0xBEEB, 0x6A39, 0xBEF0, 0x6A3A, 0xBEEC,\t0x6A3B, 0xE9CC, 0x6A3C, 0xE9D7, 0x6A3D, 0xBEEA, 0x6A3E, 0xE9C4,\n\t0x6A3F, 0xE9CD, 0x6A40, 0xE5DF, 0x6A41, 0xE9CE, 0x6A44, 0xBEF1,\t0x6A46, 0xE9DD, 0x6A47, 0xBEF5, 0x6A48, 0xBEF8, 0x6A49, 0xE9C0,\n\t0x6A4B, 0xBEF4, 0x6A4D, 0xE9DB, 0x6A4E, 0xE9DC, 0x6A4F, 0xE9D2,\t0x6A50, 0xE9D1, 0x6A51, 0xE9C9, 0x6A54, 0xE9D3, 0x6A55, 0xE9DA,\n\t0x6A56, 0xE9D9, 0x6A58, 0xBEEF, 0x6A59, 0xBEED, 0x6A5A, 0xE9CB,\t0x6A5B, 0xE9C8, 0x6A5D, 0xE9C5, 0x6A5E, 0xE9D8, 0x6A5F, 0xBEF7,\n\t0x6A60, 0xE9D6, 0x6A61, 0xBEF3, 0x6A62, 0xBEF2, 0x6A64, 0xE9D0,\t0x6A66, 0xE9BF, 0x6A67, 0xE9C1, 0x6A68, 0xE9C3, 0x6A69, 0xE9D5,\n\t0x6A6A, 0xE9CF, 0x6A6B, 0xBEEE, 0x6A6D, 0xE9C6, 0x6A6F, 0xE9D4,\t0x6A76, 0xE9C7, 0x6A7E, 0xC0CF, 0x6A7F, 0xED45, 0x6A80, 0xC0C8,\n\t0x6A81, 0xECF5, 0x6A83, 0xED41, 0x6A84, 0xC0CA, 0x6A85, 0xED48,\t0x6A87, 0xECFC, 0x6A89, 0xECF7, 0x6A8C, 0xED49, 0x6A8D, 0xECF3,\n\t0x6A8E, 0xECFE, 0x6A90, 0xC0D1, 0x6A91, 0xED44, 0x6A92, 0xED4A,\t0x6A93, 0xECFD, 0x6A94, 0xC0C9, 0x6A95, 0xED40, 0x6A96, 0xECF4,\n\t0x6A97, 0xC0D0, 0x6A9A, 0xED47, 0x6A9B, 0xECF9, 0x6A9C, 0xC0CC,\t0x6A9E, 0xECFB, 0x6A9F, 0xECF8, 0x6AA0, 0xC0D2, 0x6AA1, 0xECFA,\n\t0x6AA2, 0xC0CB, 0x6AA3, 0xC0CE, 0x6AA4, 0xED43, 0x6AA5, 0xECF6,\t0x6AA6, 0xED46, 0x6AA8, 0xED42, 0x6AAC, 0xC263, 0x6AAD, 0xEFE7,\n\t0x6AAE, 0xC268, 0x6AAF, 0xC269, 0x6AB3, 0xC262, 0x6AB4, 0xEFE6,\t0x6AB6, 0xEFE3, 0x6AB7, 0xEFE4, 0x6AB8, 0xC266, 0x6AB9, 0xEFDE,\n\t0x6ABA, 0xEFE2, 0x6ABB, 0xC265, 0x6ABD, 0xEFDF, 0x6AC2, 0xC267,\t0x6AC3, 0xC264, 0x6AC5, 0xEFDD, 0x6AC6, 0xEFE1, 0x6AC7, 0xEFE5,\n\t0x6ACB, 0xF251, 0x6ACC, 0xF24E, 0x6ACD, 0xF257, 0x6ACF, 0xF256,\t0x6AD0, 0xF254, 0x6AD1, 0xF24F, 0x6AD3, 0xC372, 0x6AD9, 0xF250,\n\t0x6ADA, 0xC371, 0x6ADB, 0xC0CD, 0x6ADC, 0xF253, 0x6ADD, 0xC370,\t0x6ADE, 0xF258, 0x6ADF, 0xF252, 0x6AE0, 0xF24D, 0x6AE1, 0xEFE0,\n\t0x6AE5, 0xC36F, 0x6AE7, 0xF24C, 0x6AE8, 0xF456, 0x6AEA, 0xF455,\t0x6AEB, 0xF255, 0x6AEC, 0xC468, 0x6AEE, 0xF459, 0x6AEF, 0xF45A,\n\t0x6AF0, 0xF454, 0x6AF1, 0xF458, 0x6AF3, 0xF453, 0x6AF8, 0xF5D1,\t0x6AF9, 0xF457, 0x6AFA, 0xC4E7, 0x6AFB, 0xC4E5, 0x6AFC, 0xF5CF,\n\t0x6B00, 0xF5D2, 0x6B02, 0xF5CE, 0x6B03, 0xF5D0, 0x6B04, 0xC4E6,\t0x6B08, 0xF6E5, 0x6B09, 0xF6E6, 0x6B0A, 0xC576, 0x6B0B, 0xF6E4,\n\t0x6B0F, 0xF7E2, 0x6B10, 0xC5CF, 0x6B11, 0xF7E0, 0x6B12, 0xF7E1,\t0x6B13, 0xF8AC, 0x6B16, 0xC656, 0x6B17, 0xF8F3, 0x6B18, 0xF8F1,\n\t0x6B19, 0xF8F2, 0x6B1A, 0xF8F4, 0x6B1E, 0xF9BB, 0x6B20, 0xA4ED,\t0x6B21, 0xA6B8, 0x6B23, 0xAA59, 0x6B25, 0xCCE9, 0x6B28, 0xCF64,\n\t0x6B2C, 0xD1F5, 0x6B2D, 0xD1F7, 0x6B2F, 0xD1F6, 0x6B31, 0xD1F8,\t0x6B32, 0xB1FD, 0x6B33, 0xD5D7, 0x6B34, 0xD1F9, 0x6B36, 0xD5D6,\n\t0x6B37, 0xD5D8, 0x6B38, 0xD5D9, 0x6B39, 0xD9DA, 0x6B3A, 0xB4DB,\t0x6B3B, 0xD9DB, 0x6B3C, 0xD9DD, 0x6B3D, 0xB4DC, 0x6B3E, 0xB4DA,\n\t0x6B3F, 0xD9DC, 0x6B41, 0xDDFA, 0x6B42, 0xDDF8, 0x6B43, 0xDDF7,\t0x6B45, 0xDDF6, 0x6B46, 0xDDF5, 0x6B47, 0xB7B2, 0x6B48, 0xDDF9,\n\t0x6B49, 0xBA70, 0x6B4A, 0xE263, 0x6B4B, 0xE265, 0x6B4C, 0xBA71,\t0x6B4D, 0xE264, 0x6B4E, 0xBCDB, 0x6B50, 0xBCDA, 0x6B51, 0xE5F0,\n\t0x6B54, 0xE9DF, 0x6B55, 0xE9DE, 0x6B56, 0xE9E0, 0x6B59, 0xBEF9,\t0x6B5B, 0xED4B, 0x6B5C, 0xC0D3, 0x6B5E, 0xEFE8, 0x6B5F, 0xC26A,\n\t0x6B60, 0xF259, 0x6B61, 0xC577, 0x6B62, 0xA4EE, 0x6B63, 0xA5BF,\t0x6B64, 0xA6B9, 0x6B65, 0xA842, 0x6B66, 0xAA5A, 0x6B67, 0xAA5B,\n\t0x6B6A, 0xAC6E, 0x6B6D, 0xD1FA, 0x6B72, 0xB7B3, 0x6B76, 0xE6D1,\t0x6B77, 0xBEFA, 0x6B78, 0xC26B, 0x6B79, 0xA4EF, 0x6B7B, 0xA6BA,\n\t0x6B7E, 0xCCEB, 0x6B7F, 0xAA5C, 0x6B80, 0xCCEA, 0x6B82, 0xCF65,\t0x6B83, 0xAC6F, 0x6B84, 0xCF66, 0x6B86, 0xAC70, 0x6B88, 0xD1FC,\n\t0x6B89, 0xAEEE, 0x6B8A, 0xAEED, 0x6B8C, 0xD5DE, 0x6B8D, 0xD5DC,\t0x6B8E, 0xD5DD, 0x6B8F, 0xD5DB, 0x6B91, 0xD5DA, 0x6B94, 0xD9DE,\n\t0x6B95, 0xD9E1, 0x6B96, 0xB4DE, 0x6B97, 0xD9DF, 0x6B98, 0xB4DD,\t0x6B99, 0xD9E0, 0x6B9B, 0xDDFB, 0x6B9E, 0xE266, 0x6B9F, 0xE267,\n\t0x6BA0, 0xE268, 0x6BA2, 0xE5F3, 0x6BA3, 0xE5F2, 0x6BA4, 0xBCDC,\t0x6BA5, 0xE5F1, 0x6BA6, 0xE5F4, 0x6BA7, 0xE9E1, 0x6BAA, 0xE9E2,\n\t0x6BAB, 0xE9E3, 0x6BAD, 0xED4C, 0x6BAE, 0xC0D4, 0x6BAF, 0xC26C,\t0x6BB0, 0xF25A, 0x6BB2, 0xC4E8, 0x6BB3, 0xC95F, 0x6BB5, 0xAC71,\n\t0x6BB6, 0xCF67, 0x6BB7, 0xAEEF, 0x6BBA, 0xB1FE, 0x6BBC, 0xB4DF,\t0x6BBD, 0xD9E2, 0x6BBF, 0xB7B5, 0x6BC0, 0xB7B4, 0x6BC3, 0xE269,\n\t0x6BC4, 0xE26A, 0x6BC5, 0xBCDD, 0x6BC6, 0xBCDE, 0x6BC7, 0xE9E5,\t0x6BC8, 0xE9E4, 0x6BC9, 0xEFE9, 0x6BCA, 0xF7E3, 0x6BCB, 0xA4F0,\n\t0x6BCC, 0xC960, 0x6BCD, 0xA5C0, 0x6BCF, 0xA843, 0x6BD0, 0xCB48,\t0x6BD2, 0xAC72, 0x6BD3, 0xB7B6, 0x6BD4, 0xA4F1, 0x6BD6, 0xCF68,\n\t0x6BD7, 0xAC73, 0x6BD8, 0xCF69, 0x6BDA, 0xC0D5, 0x6BDB, 0xA4F2,\t0x6BDE, 0xCCEC, 0x6BE0, 0xCF6A, 0x6BE2, 0xD242, 0x6BE3, 0xD241,\n\t0x6BE4, 0xD1FE, 0x6BE6, 0xD1FD, 0x6BE7, 0xD243, 0x6BE8, 0xD240,\t0x6BEB, 0xB240, 0x6BEC, 0xB241, 0x6BEF, 0xB4E0, 0x6BF0, 0xD9E3,\n\t0x6BF2, 0xD9E4, 0x6BF3, 0xD9E5, 0x6BF7, 0xDE41, 0x6BF8, 0xDE42,\t0x6BF9, 0xDE40, 0x6BFB, 0xDDFD, 0x6BFC, 0xDDFE, 0x6BFD, 0xB7B7,\n\t0x6BFE, 0xE26B, 0x6BFF, 0xE5F7, 0x6C00, 0xE5F6, 0x6C01, 0xE5F5,\t0x6C02, 0xE5F8, 0x6C03, 0xE9E7, 0x6C04, 0xE9E6, 0x6C05, 0xBEFB,\n\t0x6C06, 0xE9E8, 0x6C08, 0xC0D6, 0x6C09, 0xED4D, 0x6C0B, 0xEFEA,\t0x6C0C, 0xF25B, 0x6C0D, 0xF6E7, 0x6C0F, 0xA4F3, 0x6C10, 0xA5C2,\n\t0x6C11, 0xA5C1, 0x6C13, 0xAA5D, 0x6C14, 0xC961, 0x6C15, 0xC97E,\t0x6C16, 0xA6BB, 0x6C18, 0xC9F7, 0x6C19, 0xCB49, 0x6C1A, 0xCB4A,\n\t0x6C1B, 0xAA5E, 0x6C1D, 0xCCED, 0x6C1F, 0xAC74, 0x6C20, 0xCF6B,\t0x6C21, 0xCF6C, 0x6C23, 0xAEF0, 0x6C24, 0xAEF4, 0x6C25, 0xD244,\n\t0x6C26, 0xAEF3, 0x6C27, 0xAEF1, 0x6C28, 0xAEF2, 0x6C2A, 0xD5DF,\t0x6C2B, 0xB242, 0x6C2C, 0xB4E3, 0x6C2E, 0xB4E1, 0x6C2F, 0xB4E2,\n\t0x6C30, 0xD9E6, 0x6C33, 0xBA72, 0x6C34, 0xA4F4, 0x6C36, 0xC9A1,\t0x6C38, 0xA5C3, 0x6C3B, 0xC9A4, 0x6C3E, 0xA5C6, 0x6C3F, 0xC9A3,\n\t0x6C40, 0xA5C5, 0x6C41, 0xA5C4, 0x6C42, 0xA844, 0x6C43, 0xC9A2,\t0x6C46, 0xC9F8, 0x6C4A, 0xC9FC, 0x6C4B, 0xC9FE, 0x6C4C, 0xCA40,\n\t0x6C4D, 0xA6C5, 0x6C4E, 0xA6C6, 0x6C4F, 0xC9FB, 0x6C50, 0xA6C1,\t0x6C52, 0xC9F9, 0x6C54, 0xC9FD, 0x6C55, 0xA6C2, 0x6C57, 0xA6BD,\n\t0x6C59, 0xA6BE, 0x6C5B, 0xA6C4, 0x6C5C, 0xC9FA, 0x6C5D, 0xA6BC,\t0x6C5E, 0xA845, 0x6C5F, 0xA6BF, 0x6C60, 0xA6C0, 0x6C61, 0xA6C3,\n\t0x6C65, 0xCB5B, 0x6C66, 0xCB59, 0x6C67, 0xCB4C, 0x6C68, 0xA851,\t0x6C69, 0xCB53, 0x6C6A, 0xA84C, 0x6C6B, 0xCB4D, 0x6C6D, 0xCB55,\n\t0x6C6F, 0xCB52, 0x6C70, 0xA84F, 0x6C71, 0xCB51, 0x6C72, 0xA856,\t0x6C73, 0xCB5A, 0x6C74, 0xA858, 0x6C76, 0xA85A, 0x6C78, 0xCB4B,\n\t0x6C7A, 0xA84D, 0x6C7B, 0xCB5C, 0x6C7D, 0xA854, 0x6C7E, 0xA857,\t0x6C80, 0xCD45, 0x6C81, 0xA847, 0x6C82, 0xA85E, 0x6C83, 0xA855,\n\t0x6C84, 0xCB4E, 0x6C85, 0xA84A, 0x6C86, 0xA859, 0x6C87, 0xCB56,\t0x6C88, 0xA848, 0x6C89, 0xA849, 0x6C8A, 0xCD43, 0x6C8B, 0xCB4F,\n\t0x6C8C, 0xA850, 0x6C8D, 0xA85B, 0x6C8E, 0xCB5D, 0x6C8F, 0xCB50,\t0x6C90, 0xA84E, 0x6C92, 0xA853, 0x6C93, 0xCCEE, 0x6C94, 0xA85C,\n\t0x6C95, 0xCB57, 0x6C96, 0xA852, 0x6C98, 0xA85D, 0x6C99, 0xA846,\t0x6C9A, 0xCB54, 0x6C9B, 0xA84B, 0x6C9C, 0xCB58, 0x6C9D, 0xCD44,\n\t0x6CAB, 0xAA6A, 0x6CAC, 0xAA7A, 0x6CAD, 0xCCF5, 0x6CAE, 0xAA71,\t0x6CB0, 0xCD4B, 0x6CB1, 0xAA62, 0x6CB3, 0xAA65, 0x6CB4, 0xCD42,\n\t0x6CB6, 0xCCF3, 0x6CB7, 0xCCF7, 0x6CB8, 0xAA6D, 0x6CB9, 0xAA6F,\t0x6CBA, 0xCCFA, 0x6CBB, 0xAA76, 0x6CBC, 0xAA68, 0x6CBD, 0xAA66,\n\t0x6CBE, 0xAA67, 0x6CBF, 0xAA75, 0x6CC0, 0xCD47, 0x6CC1, 0xAA70,\t0x6CC2, 0xCCF9, 0x6CC3, 0xCCFB, 0x6CC4, 0xAA6E, 0x6CC5, 0xAA73,\n\t0x6CC6, 0xCCFC, 0x6CC7, 0xCD4A, 0x6CC9, 0xAC75, 0x6CCA, 0xAA79,\t0x6CCC, 0xAA63, 0x6CCD, 0xCD49, 0x6CCF, 0xCD4D, 0x6CD0, 0xCCF8,\n\t0x6CD1, 0xCD4F, 0x6CD2, 0xCD40, 0x6CD3, 0xAA6C, 0x6CD4, 0xCCF4,\t0x6CD5, 0xAA6B, 0x6CD6, 0xAA7D, 0x6CD7, 0xAA72, 0x6CD9, 0xCCF2,\n\t0x6CDA, 0xCF75, 0x6CDB, 0xAA78, 0x6CDC, 0xAA7C, 0x6CDD, 0xCD41,\t0x6CDE, 0xCD46, 0x6CE0, 0xAA7E, 0x6CE1, 0xAA77, 0x6CE2, 0xAA69,\n\t0x6CE3, 0xAA5F, 0x6CE5, 0xAA64, 0x6CE7, 0xCCF6, 0x6CE8, 0xAA60,\t0x6CE9, 0xCD4E, 0x6CEB, 0xCCF0, 0x6CEC, 0xCCEF, 0x6CED, 0xCCFD,\n\t0x6CEE, 0xCCF1, 0x6CEF, 0xAA7B, 0x6CF0, 0xAEF5, 0x6CF1, 0xAA74,\t0x6CF2, 0xCCFE, 0x6CF3, 0xAA61, 0x6CF5, 0xACA6, 0x6CF9, 0xCD4C,\n\t0x6D00, 0xCF7C, 0x6D01, 0xCFA1, 0x6D03, 0xCFA4, 0x6D04, 0xCF77,\t0x6D07, 0xCFA7, 0x6D08, 0xCFAA, 0x6D09, 0xCFAC, 0x6D0A, 0xCF74,\n\t0x6D0B, 0xAC76, 0x6D0C, 0xAC7B, 0x6D0D, 0xD249, 0x6D0E, 0xACAD,\t0x6D0F, 0xCFA5, 0x6D10, 0xCFAD, 0x6D11, 0xCF7B, 0x6D12, 0xCF73,\n\t0x6D16, 0xD264, 0x6D17, 0xAC7E, 0x6D18, 0xCFA2, 0x6D19, 0xCF78,\t0x6D1A, 0xCF7A, 0x6D1B, 0xACA5, 0x6D1D, 0xCF7D, 0x6D1E, 0xAC7D,\n\t0x6D1F, 0xCF70, 0x6D20, 0xCFA8, 0x6D22, 0xCFAB, 0x6D25, 0xAC7A,\t0x6D27, 0xACA8, 0x6D28, 0xCF6D, 0x6D29, 0xACAA, 0x6D2A, 0xAC78,\n\t0x6D2B, 0xACAE, 0x6D2C, 0xCFA9, 0x6D2D, 0xCF6F, 0x6D2E, 0xACAB,\t0x6D2F, 0xD25E, 0x6D30, 0xCD48, 0x6D31, 0xAC7C, 0x6D32, 0xAC77,\n\t0x6D33, 0xCF76, 0x6D34, 0xCF6E, 0x6D35, 0xACAC, 0x6D36, 0xACA4,\t0x6D37, 0xCFA3, 0x6D38, 0xACA9, 0x6D39, 0xACA7, 0x6D3A, 0xCF79,\n\t0x6D3B, 0xACA1, 0x6D3C, 0xCF71, 0x6D3D, 0xACA2, 0x6D3E, 0xACA3,\t0x6D3F, 0xCF72, 0x6D40, 0xCFA6, 0x6D41, 0xAC79, 0x6D42, 0xCF7E,\n\t0x6D58, 0xD24C, 0x6D59, 0xAEFD, 0x6D5A, 0xAF43, 0x6D5E, 0xD255,\t0x6D5F, 0xD25B, 0x6D60, 0xD257, 0x6D61, 0xD24A, 0x6D62, 0xD24D,\n\t0x6D63, 0xD246, 0x6D64, 0xD247, 0x6D65, 0xAF4A, 0x6D66, 0xAEFA,\t0x6D67, 0xD256, 0x6D68, 0xD25F, 0x6D69, 0xAF45, 0x6D6A, 0xAEF6,\n\t0x6D6C, 0xAF40, 0x6D6D, 0xD24E, 0x6D6E, 0xAF42, 0x6D6F, 0xD24F,\t0x6D70, 0xD259, 0x6D74, 0xAF44, 0x6D75, 0xD268, 0x6D76, 0xD248,\n\t0x6D77, 0xAEFC, 0x6D78, 0xAEFB, 0x6D79, 0xAF48, 0x6D7A, 0xD245,\t0x6D7B, 0xD266, 0x6D7C, 0xD25A, 0x6D7D, 0xD267, 0x6D7E, 0xD261,\n\t0x6D7F, 0xD253, 0x6D80, 0xD262, 0x6D82, 0xD25C, 0x6D83, 0xD265,\t0x6D84, 0xD263, 0x6D85, 0xAF49, 0x6D86, 0xD254, 0x6D87, 0xAEF9,\n\t0x6D88, 0xAEF8, 0x6D89, 0xAF41, 0x6D8A, 0xAF47, 0x6D8B, 0xD260,\t0x6D8C, 0xAF46, 0x6D8D, 0xD251, 0x6D8E, 0xB243, 0x6D90, 0xD269,\n\t0x6D91, 0xD250, 0x6D92, 0xD24B, 0x6D93, 0xAEFE, 0x6D94, 0xAF4B,\t0x6D95, 0xAEF7, 0x6D97, 0xD258, 0x6D98, 0xD25D, 0x6DAA, 0xB265,\n\t0x6DAB, 0xD5E1, 0x6DAC, 0xD5E5, 0x6DAE, 0xB252, 0x6DAF, 0xB250,\t0x6DB2, 0xB247, 0x6DB3, 0xD5E3, 0x6DB4, 0xD5E2, 0x6DB5, 0xB25B,\n\t0x6DB7, 0xD5E8, 0x6DB8, 0xB255, 0x6DBA, 0xD5FA, 0x6DBB, 0xD647,\t0x6DBC, 0xB244, 0x6DBD, 0xD5F7, 0x6DBE, 0xD5F0, 0x6DBF, 0xB267,\n\t0x6DC0, 0xD5E0, 0x6DC2, 0xD5FC, 0x6DC4, 0xB264, 0x6DC5, 0xB258,\t0x6DC6, 0xB263, 0x6DC7, 0xB24E, 0x6DC8, 0xD5EC, 0x6DC9, 0xD5FE,\n\t0x6DCA, 0xD5F6, 0x6DCB, 0xB24F, 0x6DCC, 0xB249, 0x6DCD, 0xD645,\t0x6DCF, 0xD5FD, 0x6DD0, 0xD640, 0x6DD1, 0xB251, 0x6DD2, 0xB259,\n\t0x6DD3, 0xD642, 0x6DD4, 0xD5EA, 0x6DD5, 0xD5FB, 0x6DD6, 0xD5EF,\t0x6DD7, 0xD644, 0x6DD8, 0xB25E, 0x6DD9, 0xB246, 0x6DDA, 0xB25C,\n\t0x6DDB, 0xD5F4, 0x6DDC, 0xD5F2, 0x6DDD, 0xD5F3, 0x6DDE, 0xB253,\t0x6DDF, 0xD5EE, 0x6DE0, 0xD5ED, 0x6DE1, 0xB248, 0x6DE2, 0xD5E7,\n\t0x6DE3, 0xD646, 0x6DE4, 0xB24A, 0x6DE5, 0xD5F1, 0x6DE6, 0xB268,\t0x6DE8, 0xB262, 0x6DE9, 0xD5E6, 0x6DEA, 0xB25F, 0x6DEB, 0xB25D,\n\t0x6DEC, 0xB266, 0x6DED, 0xD5F8, 0x6DEE, 0xB261, 0x6DEF, 0xD252,\t0x6DF0, 0xD5F9, 0x6DF1, 0xB260, 0x6DF2, 0xD641, 0x6DF3, 0xB245,\n\t0x6DF4, 0xD5F5, 0x6DF5, 0xB257, 0x6DF6, 0xD5E9, 0x6DF7, 0xB256,\t0x6DF9, 0xB254, 0x6DFA, 0xB24C, 0x6DFB, 0xB24B, 0x6DFC, 0xD9E7,\n\t0x6DFD, 0xD643, 0x6E00, 0xD5EB, 0x6E03, 0xD9FC, 0x6E05, 0xB24D,\t0x6E19, 0xB541, 0x6E1A, 0xB25A, 0x6E1B, 0xB4EE, 0x6E1C, 0xD9F6,\n\t0x6E1D, 0xB4FC, 0x6E1F, 0xD9EA, 0x6E20, 0xB4EB, 0x6E21, 0xB4E7,\t0x6E22, 0xDA49, 0x6E23, 0xB4ED, 0x6E24, 0xB4F1, 0x6E25, 0xB4EC,\n\t0x6E26, 0xB4F5, 0x6E27, 0xDA4D, 0x6E28, 0xDA44, 0x6E2B, 0xD9F1,\t0x6E2C, 0xB4FA, 0x6E2D, 0xB4F4, 0x6E2E, 0xD9FD, 0x6E2F, 0xB4E4,\n\t0x6E30, 0xDA4A, 0x6E31, 0xDA43, 0x6E32, 0xB4E8, 0x6E33, 0xD9F7,\t0x6E34, 0xB4F7, 0x6E35, 0xDA55, 0x6E36, 0xDA56, 0x6E38, 0xB4E5,\n\t0x6E39, 0xDA48, 0x6E3A, 0xB4F9, 0x6E3B, 0xD9FB, 0x6E3C, 0xD9ED,\t0x6E3D, 0xD9EE, 0x6E3E, 0xB4FD, 0x6E3F, 0xD9F2, 0x6E40, 0xD9F9,\n\t0x6E41, 0xD9F3, 0x6E43, 0xB4FB, 0x6E44, 0xB544, 0x6E45, 0xD9EF,\t0x6E46, 0xD9E8, 0x6E47, 0xD9E9, 0x6E49, 0xD9EB, 0x6E4A, 0xB4EA,\n\t0x6E4B, 0xD9F8, 0x6E4D, 0xB4F8, 0x6E4E, 0xB542, 0x6E51, 0xD9FA,\t0x6E52, 0xDA53, 0x6E53, 0xDA4B, 0x6E54, 0xB4E6, 0x6E55, 0xDA51,\n\t0x6E56, 0xB4F2, 0x6E58, 0xB4F0, 0x6E5A, 0xDA57, 0x6E5B, 0xB4EF,\t0x6E5C, 0xDA41, 0x6E5D, 0xD9F4, 0x6E5E, 0xD9FE, 0x6E5F, 0xB547,\n\t0x6E60, 0xDA45, 0x6E61, 0xDA42, 0x6E62, 0xD9F0, 0x6E63, 0xB543,\t0x6E64, 0xDA4F, 0x6E65, 0xDA4C, 0x6E66, 0xDA54, 0x6E67, 0xB4E9,\n\t0x6E68, 0xDA40, 0x6E69, 0xB546, 0x6E6B, 0xDA47, 0x6E6E, 0xB4F3,\t0x6E6F, 0xB4F6, 0x6E71, 0xDA46, 0x6E72, 0xB545, 0x6E73, 0xD9F5,\n\t0x6E74, 0xD5E4, 0x6E77, 0xDA50, 0x6E78, 0xDA4E, 0x6E79, 0xDA52,\t0x6E88, 0xD9EC, 0x6E89, 0xB540, 0x6E8D, 0xDE61, 0x6E8E, 0xDE60,\n\t0x6E8F, 0xDE46, 0x6E90, 0xB7BD, 0x6E92, 0xDE5F, 0x6E93, 0xDE49,\t0x6E94, 0xDE4A, 0x6E96, 0xB7C7, 0x6E97, 0xDE68, 0x6E98, 0xB7C2,\n\t0x6E99, 0xDE5E, 0x6E9B, 0xDE43, 0x6E9C, 0xB7C8, 0x6E9D, 0xB7BE,\t0x6E9E, 0xDE52, 0x6E9F, 0xDE48, 0x6EA0, 0xDE4B, 0x6EA1, 0xDE63,\n\t0x6EA2, 0xB7B8, 0x6EA3, 0xDE6A, 0x6EA4, 0xDE62, 0x6EA5, 0xB7C1,\t0x6EA6, 0xDE57, 0x6EA7, 0xB7CC, 0x6EAA, 0xB7CB, 0x6EAB, 0xB7C5,\n\t0x6EAE, 0xDE69, 0x6EAF, 0xB7B9, 0x6EB0, 0xDE55, 0x6EB1, 0xDE4C,\t0x6EB2, 0xDE59, 0x6EB3, 0xDE65, 0x6EB4, 0xB7CD, 0x6EB6, 0xB7BB,\n\t0x6EB7, 0xDE54, 0x6EB9, 0xDE4D, 0x6EBA, 0xB7C4, 0x6EBC, 0xB7C3,\t0x6EBD, 0xDE50, 0x6EBE, 0xDE5A, 0x6EBF, 0xDE64, 0x6EC0, 0xDE47,\n\t0x6EC1, 0xDE51, 0x6EC2, 0xB7BC, 0x6EC3, 0xDE5B, 0x6EC4, 0xB7C9,\t0x6EC5, 0xB7C0, 0x6EC6, 0xDE4E, 0x6EC7, 0xB7BF, 0x6EC8, 0xDE45,\n\t0x6EC9, 0xDE53, 0x6ECA, 0xDE67, 0x6ECB, 0xB4FE, 0x6ECC, 0xBAB0,\t0x6ECD, 0xDE56, 0x6ECE, 0xE26C, 0x6ECF, 0xDE58, 0x6ED0, 0xDE66,\n\t0x6ED1, 0xB7C6, 0x6ED2, 0xDE4F, 0x6ED3, 0xB7BA, 0x6ED4, 0xB7CA,\t0x6ED5, 0xBCF0, 0x6ED6, 0xDE44, 0x6ED8, 0xDE5D, 0x6EDC, 0xDE5C,\n\t0x6EEB, 0xE2AA, 0x6EEC, 0xBAAD, 0x6EED, 0xE27D, 0x6EEE, 0xE2A4,\t0x6EEF, 0xBAA2, 0x6EF1, 0xE26E, 0x6EF2, 0xBAAF, 0x6EF4, 0xBA77,\n\t0x6EF5, 0xE26D, 0x6EF6, 0xE2B0, 0x6EF7, 0xBAB1, 0x6EF8, 0xE271,\t0x6EF9, 0xE2A3, 0x6EFB, 0xE273, 0x6EFC, 0xE2B3, 0x6EFD, 0xE2AF,\n\t0x6EFE, 0xBA75, 0x6EFF, 0xBAA1, 0x6F00, 0xE653, 0x6F01, 0xBAAE,\t0x6F02, 0xBA7D, 0x6F03, 0xE26F, 0x6F05, 0xE2AE, 0x6F06, 0xBAA3,\n\t0x6F07, 0xE2AB, 0x6F08, 0xE2B8, 0x6F09, 0xE275, 0x6F0A, 0xE27E,\t0x6F0D, 0xE2B6, 0x6F0E, 0xE2AC, 0x6F0F, 0xBA7C, 0x6F12, 0xE27C,\n\t0x6F13, 0xBA76, 0x6F14, 0xBA74, 0x6F15, 0xBAA8, 0x6F18, 0xE27A,\t0x6F19, 0xE277, 0x6F1A, 0xE278, 0x6F1C, 0xE2B2, 0x6F1E, 0xE2B7,\n\t0x6F1F, 0xE2B5, 0x6F20, 0xBA7A, 0x6F21, 0xE2B9, 0x6F22, 0xBA7E,\t0x6F23, 0xBAA7, 0x6F25, 0xE270, 0x6F26, 0xE5FA, 0x6F27, 0xE279,\n\t0x6F29, 0xBA78, 0x6F2A, 0xBAAC, 0x6F2B, 0xBAA9, 0x6F2C, 0xBA7B,\t0x6F2D, 0xE2A5, 0x6F2E, 0xE274, 0x6F2F, 0xBAAA, 0x6F30, 0xE2A7,\n\t0x6F31, 0xBAA4, 0x6F32, 0xBAA6, 0x6F33, 0xBA73, 0x6F35, 0xE2A9,\t0x6F36, 0xE2A1, 0x6F37, 0xE272, 0x6F38, 0xBAA5, 0x6F39, 0xE2B1,\n\t0x6F3A, 0xE2B4, 0x6F3B, 0xE27B, 0x6F3C, 0xE2A8, 0x6F3E, 0xBA79,\t0x6F3F, 0xBCDF, 0x6F40, 0xE2A6, 0x6F41, 0xE5F9, 0x6F43, 0xE2AD,\n\t0x6F4E, 0xE276, 0x6F4F, 0xE644, 0x6F50, 0xE64E, 0x6F51, 0xBCE2,\t0x6F52, 0xE64D, 0x6F53, 0xE659, 0x6F54, 0xBCE4, 0x6F55, 0xE64B,\n\t0x6F57, 0xE64F, 0x6F58, 0xBCEF, 0x6F5A, 0xE646, 0x6F5B, 0xBCE7,\t0x6F5D, 0xE652, 0x6F5E, 0xE9F0, 0x6F5F, 0xBCF3, 0x6F60, 0xBCF2,\n\t0x6F61, 0xE654, 0x6F62, 0xE643, 0x6F63, 0xE65E, 0x6F64, 0xBCED,\t0x6F66, 0xBCE3, 0x6F67, 0xE657, 0x6F69, 0xE65B, 0x6F6A, 0xE660,\n\t0x6F6B, 0xE655, 0x6F6C, 0xE649, 0x6F6D, 0xBCE6, 0x6F6E, 0xBCE9,\t0x6F6F, 0xBCF1, 0x6F70, 0xBCEC, 0x6F72, 0xE64C, 0x6F73, 0xE2A2,\n\t0x6F76, 0xE648, 0x6F77, 0xE65F, 0x6F78, 0xBCE8, 0x6F7A, 0xBCEB,\t0x6F7B, 0xE661, 0x6F7C, 0xBCE0, 0x6F7D, 0xE656, 0x6F7E, 0xE5FB,\n\t0x6F7F, 0xE65C, 0x6F80, 0xC0DF, 0x6F82, 0xE64A, 0x6F84, 0xBCE1,\t0x6F85, 0xE645, 0x6F86, 0xBCE5, 0x6F87, 0xE5FC, 0x6F88, 0xBAAB,\n\t0x6F89, 0xE641, 0x6F8B, 0xE65A, 0x6F8C, 0xE642, 0x6F8D, 0xE640,\t0x6F8E, 0xBCEA, 0x6F90, 0xE658, 0x6F92, 0xE5FE, 0x6F93, 0xE651,\n\t0x6F94, 0xE650, 0x6F95, 0xE65D, 0x6F96, 0xE647, 0x6F97, 0xBCEE,\t0x6F9E, 0xE9F3, 0x6FA0, 0xBF49, 0x6FA1, 0xBEFE, 0x6FA2, 0xEA40,\n\t0x6FA3, 0xE9EB, 0x6FA4, 0xBF41, 0x6FA5, 0xE9F7, 0x6FA6, 0xBF48,\t0x6FA7, 0xBF43, 0x6FA8, 0xE9F5, 0x6FA9, 0xED4F, 0x6FAA, 0xE9FB,\n\t0x6FAB, 0xEA42, 0x6FAC, 0xE9FA, 0x6FAD, 0xE9E9, 0x6FAE, 0xE9F8,\t0x6FAF, 0xEA44, 0x6FB0, 0xEA46, 0x6FB1, 0xBEFD, 0x6FB2, 0xEA45,\n\t0x6FB3, 0xBF44, 0x6FB4, 0xBF4A, 0x6FB6, 0xBF47, 0x6FB8, 0xE9FE,\t0x6FB9, 0xBF46, 0x6FBA, 0xE9F9, 0x6FBC, 0xE9ED, 0x6FBD, 0xE9F2,\n\t0x6FBF, 0xE9FD, 0x6FC0, 0xBF45, 0x6FC1, 0xBF42, 0x6FC2, 0xBEFC,\t0x6FC3, 0xBF40, 0x6FC4, 0xE9F1, 0x6FC6, 0xE5FD, 0x6FC7, 0xE9EC,\n\t0x6FC8, 0xE9EF, 0x6FC9, 0xEA41, 0x6FCA, 0xE9F4, 0x6FCB, 0xE9EA,\t0x6FCC, 0xED4E, 0x6FCD, 0xEA43, 0x6FCE, 0xE9EE, 0x6FCF, 0xE9FC,\n\t0x6FD4, 0xED51, 0x6FD5, 0xC0E3, 0x6FD8, 0xC0D7, 0x6FDB, 0xC0DB,\t0x6FDC, 0xED53, 0x6FDD, 0xED59, 0x6FDE, 0xED57, 0x6FDF, 0xC0D9,\n\t0x6FE0, 0xC0DA, 0x6FE1, 0xC0E1, 0x6FE2, 0xED5A, 0x6FE3, 0xED52,\t0x6FE4, 0xC0DC, 0x6FE6, 0xED56, 0x6FE7, 0xED55, 0x6FE8, 0xED5B,\n\t0x6FE9, 0xC0E2, 0x6FEB, 0xC0DD, 0x6FEC, 0xC0E0, 0x6FED, 0xED54,\t0x6FEE, 0xC0E4, 0x6FEF, 0xC0DE, 0x6FF0, 0xC0E5, 0x6FF1, 0xC0D8,\n\t0x6FF2, 0xED58, 0x6FF4, 0xED50, 0x6FF7, 0xEFF7, 0x6FFA, 0xC271,\t0x6FFB, 0xEFF4, 0x6FFC, 0xEFF6, 0x6FFE, 0xC26F, 0x6FFF, 0xEFF2,\n\t0x7000, 0xEFF3, 0x7001, 0xEFEE, 0x7004, 0xE9F6, 0x7005, 0xEFEF,\t0x7006, 0xC270, 0x7007, 0xEFEB, 0x7009, 0xC26D, 0x700A, 0xEFF8,\n\t0x700B, 0xC26E, 0x700C, 0xEFEC, 0x700D, 0xEFED, 0x700E, 0xEFF1,\t0x700F, 0xC273, 0x7011, 0xC272, 0x7014, 0xEFF0, 0x7015, 0xC378,\n\t0x7016, 0xF25F, 0x7017, 0xF265, 0x7018, 0xC379, 0x7019, 0xF25C,\t0x701A, 0xC376, 0x701B, 0xC373, 0x701C, 0xF267, 0x701D, 0xC377,\n\t0x701F, 0xC374, 0x7020, 0xF25E, 0x7021, 0xF261, 0x7022, 0xF262,\t0x7023, 0xF263, 0x7024, 0xF266, 0x7026, 0xEFF5, 0x7027, 0xF25D,\n\t0x7028, 0xC375, 0x7029, 0xF264, 0x702A, 0xF268, 0x702B, 0xF260,\t0x702F, 0xF45D, 0x7030, 0xC46A, 0x7031, 0xF460, 0x7032, 0xC46B,\n\t0x7033, 0xF468, 0x7034, 0xF45F, 0x7035, 0xF45C, 0x7037, 0xF45E,\t0x7038, 0xF462, 0x7039, 0xF465, 0x703A, 0xF464, 0x703B, 0xF467,\n\t0x703C, 0xF45B, 0x703E, 0xC469, 0x703F, 0xF463, 0x7040, 0xF466,\t0x7041, 0xF469, 0x7042, 0xF461, 0x7043, 0xF5D3, 0x7044, 0xF5D4,\n\t0x7045, 0xF5D8, 0x7046, 0xF5D9, 0x7048, 0xF5D6, 0x7049, 0xF5D7,\t0x704A, 0xF5D5, 0x704C, 0xC4E9, 0x7051, 0xC578, 0x7052, 0xF6EB,\n\t0x7055, 0xF6E8, 0x7056, 0xF6E9, 0x7057, 0xF6EA, 0x7058, 0xC579,\t0x705A, 0xF7E5, 0x705B, 0xF7E4, 0x705D, 0xF8AF, 0x705E, 0xC5F4,\n\t0x705F, 0xF8AD, 0x7060, 0xF8B0, 0x7061, 0xF8AE, 0x7062, 0xF8F5,\t0x7063, 0xC657, 0x7064, 0xC665, 0x7065, 0xF9A3, 0x7066, 0xF96C,\n\t0x7068, 0xF9A2, 0x7069, 0xF9D0, 0x706A, 0xF9D1, 0x706B, 0xA4F5,\t0x7070, 0xA6C7, 0x7071, 0xCA41, 0x7074, 0xCB5E, 0x7076, 0xA85F,\n\t0x7078, 0xA862, 0x707A, 0xCB5F, 0x707C, 0xA860, 0x707D, 0xA861,\t0x7082, 0xCD58, 0x7083, 0xCD5A, 0x7084, 0xCD55, 0x7085, 0xCD52,\n\t0x7086, 0xCD54, 0x708A, 0xAAA4, 0x708E, 0xAAA2, 0x7091, 0xCD56,\t0x7092, 0xAAA3, 0x7093, 0xCD53, 0x7094, 0xCD50, 0x7095, 0xAAA1,\n\t0x7096, 0xCD57, 0x7098, 0xCD51, 0x7099, 0xAAA5, 0x709A, 0xCD59,\t0x709F, 0xCFAF, 0x70A1, 0xCFB3, 0x70A4, 0xACB7, 0x70A9, 0xCFB6,\n\t0x70AB, 0xACAF, 0x70AC, 0xACB2, 0x70AD, 0xACB4, 0x70AE, 0xACB6,\t0x70AF, 0xACB3, 0x70B0, 0xCFB2, 0x70B1, 0xCFB1, 0x70B3, 0xACB1,\n\t0x70B4, 0xCFB4, 0x70B5, 0xCFB5, 0x70B7, 0xCFAE, 0x70B8, 0xACB5,\t0x70BA, 0xACB0, 0x70BE, 0xCFB0, 0x70C5, 0xD277, 0x70C6, 0xD278,\n\t0x70C7, 0xD279, 0x70C8, 0xAF50, 0x70CA, 0xAF4C, 0x70CB, 0xD26E,\t0x70CD, 0xD276, 0x70CE, 0xD27B, 0x70CF, 0xAF51, 0x70D1, 0xD26C,\n\t0x70D2, 0xD272, 0x70D3, 0xD26B, 0x70D4, 0xD275, 0x70D7, 0xD271,\t0x70D8, 0xAF4D, 0x70D9, 0xAF4F, 0x70DA, 0xD27A, 0x70DC, 0xD26A,\n\t0x70DD, 0xD26D, 0x70DE, 0xD273, 0x70E0, 0xD274, 0x70E1, 0xD27C,\t0x70E2, 0xD270, 0x70E4, 0xAF4E, 0x70EF, 0xB26D, 0x70F0, 0xD64E,\n\t0x70F3, 0xD650, 0x70F4, 0xD64C, 0x70F6, 0xD658, 0x70F7, 0xD64A,\t0x70F8, 0xD657, 0x70F9, 0xB269, 0x70FA, 0xD648, 0x70FB, 0xDA5B,\n\t0x70FC, 0xD652, 0x70FD, 0xB26C, 0x70FF, 0xD653, 0x7100, 0xD656,\t0x7102, 0xD65A, 0x7104, 0xD64F, 0x7106, 0xD654, 0x7109, 0xB26A,\n\t0x710A, 0xB26B, 0x710B, 0xD659, 0x710C, 0xD64D, 0x710D, 0xD649,\t0x710E, 0xD65B, 0x7110, 0xD651, 0x7113, 0xD655, 0x7117, 0xD64B,\n\t0x7119, 0xB548, 0x711A, 0xB549, 0x711B, 0xDA65, 0x711C, 0xB54F,\t0x711E, 0xDA59, 0x711F, 0xDA62, 0x7120, 0xDA58, 0x7121, 0xB54C,\n\t0x7122, 0xDA60, 0x7123, 0xDA5E, 0x7125, 0xDA5F, 0x7126, 0xB54A,\t0x7128, 0xDA63, 0x712E, 0xDA5C, 0x712F, 0xDA5A, 0x7130, 0xB54B,\n\t0x7131, 0xDA5D, 0x7132, 0xDA61, 0x7136, 0xB54D, 0x713A, 0xDA64,\t0x7141, 0xDE70, 0x7142, 0xDE77, 0x7143, 0xDE79, 0x7144, 0xDEA1,\n\t0x7146, 0xB7DA, 0x7147, 0xDE6B, 0x7149, 0xB7D2, 0x714B, 0xDE7A,\t0x714C, 0xB7D7, 0x714D, 0xDEA2, 0x714E, 0xB7CE, 0x7150, 0xDE7D,\n\t0x7152, 0xDE6D, 0x7153, 0xDE7E, 0x7154, 0xDE6C, 0x7156, 0xB7DC,\t0x7158, 0xDE78, 0x7159, 0xB7CF, 0x715A, 0xDEA3, 0x715C, 0xB7D4,\n\t0x715D, 0xDE71, 0x715E, 0xB7D9, 0x715F, 0xDE7C, 0x7160, 0xDE6F,\t0x7161, 0xDE76, 0x7162, 0xDE72, 0x7163, 0xDE6E, 0x7164, 0xB7D1,\n\t0x7165, 0xB7D8, 0x7166, 0xB7D6, 0x7167, 0xB7D3, 0x7168, 0xB7DB,\t0x7169, 0xB7D0, 0x716A, 0xDE75, 0x716C, 0xB7D5, 0x716E, 0xB54E,\n\t0x7170, 0xDE7B, 0x7172, 0xDE73, 0x7178, 0xDE74, 0x717B, 0xE2C1,\t0x717D, 0xBAB4, 0x7180, 0xE2BD, 0x7181, 0xE2C3, 0x7182, 0xE2BF,\n\t0x7184, 0xBAB6, 0x7185, 0xE2BE, 0x7186, 0xE2C2, 0x7187, 0xE2BA,\t0x7189, 0xE2BC, 0x718A, 0xBAB5, 0x718F, 0xE2C0, 0x7190, 0xE2BB,\n\t0x7192, 0xBAB7, 0x7194, 0xBAB2, 0x7197, 0xE2C4, 0x7199, 0xBAB3,\t0x719A, 0xE667, 0x719B, 0xE664, 0x719C, 0xE670, 0x719D, 0xE66A,\n\t0x719E, 0xE66C, 0x719F, 0xBCF4, 0x71A0, 0xE666, 0x71A1, 0xE66E,\t0x71A4, 0xE66D, 0x71A5, 0xE66B, 0x71A7, 0xE671, 0x71A8, 0xBCF7,\n\t0x71A9, 0xE668, 0x71AA, 0xE66F, 0x71AC, 0xBCF5, 0x71AF, 0xE663,\t0x71B0, 0xE665, 0x71B1, 0xBCF6, 0x71B2, 0xE662, 0x71B3, 0xE672,\n\t0x71B5, 0xE669, 0x71B8, 0xEA4A, 0x71B9, 0xBF51, 0x71BC, 0xEA55,\t0x71BD, 0xEA53, 0x71BE, 0xBF4B, 0x71BF, 0xEA49, 0x71C0, 0xEA4C,\n\t0x71C1, 0xEA4D, 0x71C2, 0xEA48, 0x71C3, 0xBF55, 0x71C4, 0xBF56,\t0x71C5, 0xEA47, 0x71C6, 0xEA56, 0x71C7, 0xEA51, 0x71C8, 0xBF4F,\n\t0x71C9, 0xBF4C, 0x71CA, 0xEA50, 0x71CB, 0xEA4E, 0x71CE, 0xBF52,\t0x71CF, 0xEA52, 0x71D0, 0xBF4D, 0x71D2, 0xBF4E, 0x71D4, 0xEA4F,\n\t0x71D5, 0xBF50, 0x71D6, 0xEA4B, 0x71D8, 0xEA54, 0x71D9, 0xBF53,\t0x71DA, 0xEA57, 0x71DB, 0xEA58, 0x71DC, 0xBF54, 0x71DF, 0xC0E7,\n\t0x71E0, 0xC0EE, 0x71E1, 0xED5C, 0x71E2, 0xED62, 0x71E4, 0xED60,\t0x71E5, 0xC0EA, 0x71E6, 0xC0E9, 0x71E7, 0xC0E6, 0x71E8, 0xED5E,\n\t0x71EC, 0xC0EC, 0x71ED, 0xC0EB, 0x71EE, 0xC0E8, 0x71F0, 0xED61,\t0x71F1, 0xED5D, 0x71F2, 0xED5F, 0x71F4, 0xC0ED, 0x71F8, 0xC277,\n\t0x71F9, 0xEFFB, 0x71FB, 0xC274, 0x71FC, 0xC275, 0x71FD, 0xEFFD,\t0x71FE, 0xC276, 0x71FF, 0xEFFA, 0x7201, 0xEFF9, 0x7202, 0xF26C,\n\t0x7203, 0xEFFC, 0x7205, 0xF26D, 0x7206, 0xC37A, 0x7207, 0xF26B,\t0x720A, 0xF26A, 0x720C, 0xF269, 0x720D, 0xC37B, 0x7210, 0xC46C,\n\t0x7213, 0xF46A, 0x7214, 0xF46B, 0x7219, 0xF5DC, 0x721A, 0xF5DB,\t0x721B, 0xC4EA, 0x721D, 0xF5DA, 0x721E, 0xF6EC, 0x721F, 0xF6ED,\n\t0x7222, 0xF7E6, 0x7223, 0xF8B1, 0x7226, 0xF8F6, 0x7227, 0xF9BC,\t0x7228, 0xC679, 0x7229, 0xF9C6, 0x722A, 0xA4F6, 0x722C, 0xAAA6,\n\t0x722D, 0xAAA7, 0x7230, 0xACB8, 0x7235, 0xC0EF, 0x7236, 0xA4F7,\t0x7238, 0xAAA8, 0x7239, 0xAF52, 0x723A, 0xB7DD, 0x723B, 0xA4F8,\n\t0x723D, 0xB26E, 0x723E, 0xBAB8, 0x723F, 0xC962, 0x7241, 0xCFB7,\t0x7242, 0xD27D, 0x7244, 0xE2C5, 0x7246, 0xC0F0, 0x7247, 0xA4F9,\n\t0x7248, 0xAAA9, 0x7249, 0xCFB8, 0x724A, 0xCFB9, 0x724B, 0xDA66,\t0x724C, 0xB550, 0x724F, 0xDEA4, 0x7252, 0xB7DE, 0x7253, 0xE2C6,\n\t0x7256, 0xBCF8, 0x7258, 0xC37C, 0x7259, 0xA4FA, 0x725A, 0xDA67,\t0x725B, 0xA4FB, 0x725D, 0xA6C9, 0x725E, 0xCA42, 0x725F, 0xA6C8,\n\t0x7260, 0xA865, 0x7261, 0xA864, 0x7262, 0xA863, 0x7263, 0xCB60,\t0x7267, 0xAAAA, 0x7269, 0xAAAB, 0x726A, 0xCD5B, 0x726C, 0xCFBA,\n\t0x726E, 0xCFBD, 0x726F, 0xACBA, 0x7270, 0xCFBB, 0x7272, 0xACB9,\t0x7273, 0xCFBC, 0x7274, 0xACBB, 0x7276, 0xD2A2, 0x7277, 0xD2A1,\n\t0x7278, 0xD27E, 0x7279, 0xAF53, 0x727B, 0xD65D, 0x727C, 0xD65E,\t0x727D, 0xB26F, 0x727E, 0xD65C, 0x727F, 0xD65F, 0x7280, 0xB552,\n\t0x7281, 0xB270, 0x7284, 0xB551, 0x7285, 0xDA6B, 0x7286, 0xDA6A,\t0x7288, 0xDA68, 0x7289, 0xDA69, 0x728B, 0xDA6C, 0x728C, 0xDEA6,\n\t0x728D, 0xDEA5, 0x728E, 0xDEA9, 0x7290, 0xDEA8, 0x7291, 0xDEA7,\t0x7292, 0xBAB9, 0x7293, 0xE2C9, 0x7295, 0xE2C8, 0x7296, 0xBABA,\n\t0x7297, 0xE2C7, 0x7298, 0xE673, 0x729A, 0xE674, 0x729B, 0xBCF9,\t0x729D, 0xEA59, 0x729E, 0xEA5A, 0x72A1, 0xF272, 0x72A2, 0xC37D,\n\t0x72A3, 0xF271, 0x72A4, 0xF270, 0x72A5, 0xF26E, 0x72A6, 0xF26F,\t0x72A7, 0xC4EB, 0x72A8, 0xF46C, 0x72A9, 0xF6EE, 0x72AA, 0xF8F7,\n\t0x72AC, 0xA4FC, 0x72AE, 0xC9A5, 0x72AF, 0xA5C7, 0x72B0, 0xC9A6,\t0x72B4, 0xCA43, 0x72B5, 0xCA44, 0x72BA, 0xCB66, 0x72BD, 0xCB62,\n\t0x72BF, 0xCB61, 0x72C0, 0xAAAC, 0x72C1, 0xCB65, 0x72C2, 0xA867,\t0x72C3, 0xCB63, 0x72C4, 0xA866, 0x72C5, 0xCB67, 0x72C6, 0xCB64,\n\t0x72C9, 0xCD5F, 0x72CA, 0xCFBE, 0x72CB, 0xCD5D, 0x72CC, 0xCD64,\t0x72CE, 0xAAAD, 0x72D0, 0xAAB0, 0x72D1, 0xCD65, 0x72D2, 0xCD61,\n\t0x72D4, 0xCD62, 0x72D6, 0xCD5C, 0x72D7, 0xAAAF, 0x72D8, 0xCD5E,\t0x72D9, 0xAAAE, 0x72DA, 0xCD63, 0x72DC, 0xCD60, 0x72DF, 0xCFC2,\n\t0x72E0, 0xACBD, 0x72E1, 0xACBE, 0x72E3, 0xCFC5, 0x72E4, 0xCFBF,\t0x72E6, 0xCFC4, 0x72E8, 0xCFC0, 0x72E9, 0xACBC, 0x72EA, 0xCFC3,\n\t0x72EB, 0xCFC1, 0x72F3, 0xD2A8, 0x72F4, 0xD2A5, 0x72F6, 0xD2A7,\t0x72F7, 0xAF58, 0x72F8, 0xAF57, 0x72F9, 0xAF55, 0x72FA, 0xD2A4,\n\t0x72FB, 0xD2A9, 0x72FC, 0xAF54, 0x72FD, 0xAF56, 0x72FE, 0xD2A6,\t0x72FF, 0xD667, 0x7300, 0xD2A3, 0x7301, 0xD2AA, 0x7307, 0xD662,\n\t0x7308, 0xD666, 0x730A, 0xD665, 0x730B, 0xDA6E, 0x730C, 0xDA79,\t0x730F, 0xD668, 0x7311, 0xD663, 0x7312, 0xDA6D, 0x7313, 0xB274,\n\t0x7316, 0xB273, 0x7317, 0xD661, 0x7318, 0xD664, 0x7319, 0xB275,\t0x731B, 0xB272, 0x731C, 0xB271, 0x731D, 0xD660, 0x731E, 0xD669,\n\t0x7322, 0xDA70, 0x7323, 0xDA77, 0x7325, 0xB554, 0x7326, 0xDA76,\t0x7327, 0xDA73, 0x7329, 0xB556, 0x732D, 0xDA75, 0x7330, 0xDA6F,\n\t0x7331, 0xDA71, 0x7332, 0xDA74, 0x7333, 0xDA72, 0x7334, 0xB555,\t0x7335, 0xDA78, 0x7336, 0xB553, 0x7337, 0xB7DF, 0x733A, 0xDEAD,\n\t0x733B, 0xDEAC, 0x733C, 0xDEAA, 0x733E, 0xB7E2, 0x733F, 0xB7E1,\t0x7340, 0xDEAE, 0x7342, 0xDEAB, 0x7343, 0xE2CA, 0x7344, 0xBABB,\n\t0x7345, 0xB7E0, 0x7349, 0xDEB0, 0x734A, 0xDEAF, 0x734C, 0xE2CD,\t0x734D, 0xE2CB, 0x734E, 0xBCFA, 0x7350, 0xBABC, 0x7351, 0xE2CC,\n\t0x7352, 0xE676, 0x7357, 0xBCFB, 0x7358, 0xE675, 0x7359, 0xE67E,\t0x735A, 0xE67D, 0x735B, 0xE67B, 0x735D, 0xE67A, 0x735E, 0xE677,\n\t0x735F, 0xE678, 0x7360, 0xE679, 0x7361, 0xE67C, 0x7362, 0xE6A1,\t0x7365, 0xEA5F, 0x7366, 0xEA5C, 0x7367, 0xEA5D, 0x7368, 0xBF57,\n\t0x7369, 0xEA5B, 0x736A, 0xEA61, 0x736B, 0xEA60, 0x736C, 0xEA5E,\t0x736E, 0xED64, 0x736F, 0xED65, 0x7370, 0xC0F1, 0x7372, 0xC0F2,\n\t0x7373, 0xED63, 0x7375, 0xC279, 0x7376, 0xEFFE, 0x7377, 0xC278,\t0x7378, 0xC37E, 0x737A, 0xC3A1, 0x737B, 0xC46D, 0x737C, 0xF46E,\n\t0x737D, 0xF46D, 0x737E, 0xF5DD, 0x737F, 0xF6EF, 0x7380, 0xC57A,\t0x7381, 0xF7E8, 0x7382, 0xF7E7, 0x7383, 0xF7E9, 0x7384, 0xA5C8,\n\t0x7385, 0xCFC6, 0x7386, 0xAF59, 0x7387, 0xB276, 0x7388, 0xD66A,\t0x7389, 0xA5C9, 0x738A, 0xC9A7, 0x738B, 0xA4FD, 0x738E, 0xCA45,\n\t0x7392, 0xCB6C, 0x7393, 0xCB6A, 0x7394, 0xCB6B, 0x7395, 0xCB68,\t0x7396, 0xA868, 0x7397, 0xCB69, 0x739D, 0xCD6D, 0x739F, 0xAAB3,\n\t0x73A0, 0xCD6B, 0x73A1, 0xCD67, 0x73A2, 0xCD6A, 0x73A4, 0xCD66,\t0x73A5, 0xAAB5, 0x73A6, 0xCD69, 0x73A8, 0xAAB2, 0x73A9, 0xAAB1,\n\t0x73AB, 0xAAB4, 0x73AC, 0xCD6C, 0x73AD, 0xCD68, 0x73B2, 0xACC2,\t0x73B3, 0xACC5, 0x73B4, 0xCFCE, 0x73B5, 0xCFCD, 0x73B6, 0xCFCC,\n\t0x73B7, 0xACBF, 0x73B8, 0xCFD5, 0x73B9, 0xCFCB, 0x73BB, 0xACC1,\t0x73BC, 0xD2AF, 0x73BE, 0xCFD2, 0x73BF, 0xCFD0, 0x73C0, 0xACC4,\n\t0x73C2, 0xCFC8, 0x73C3, 0xCFD3, 0x73C5, 0xCFCA, 0x73C6, 0xCFD4,\t0x73C7, 0xCFD1, 0x73C8, 0xCFC9, 0x73CA, 0xACC0, 0x73CB, 0xCFD6,\n\t0x73CC, 0xCFC7, 0x73CD, 0xACC3, 0x73D2, 0xD2B4, 0x73D3, 0xD2AB,\t0x73D4, 0xD2B6, 0x73D6, 0xD2AE, 0x73D7, 0xD2B9, 0x73D8, 0xD2BA,\n\t0x73D9, 0xD2AC, 0x73DA, 0xD2B8, 0x73DB, 0xD2B5, 0x73DC, 0xD2B3,\t0x73DD, 0xD2B7, 0x73DE, 0xAF5F, 0x73E0, 0xAF5D, 0x73E3, 0xD2B1,\n\t0x73E5, 0xD2AD, 0x73E7, 0xD2B0, 0x73E8, 0xD2BB, 0x73E9, 0xD2B2,\t0x73EA, 0xAF5E, 0x73EB, 0xCFCF, 0x73ED, 0xAF5A, 0x73EE, 0xAF5C,\n\t0x73F4, 0xD678, 0x73F5, 0xD66D, 0x73F6, 0xD66B, 0x73F8, 0xD66C,\t0x73FA, 0xD673, 0x73FC, 0xD674, 0x73FD, 0xD670, 0x73FE, 0xB27B,\n\t0x73FF, 0xD675, 0x7400, 0xD672, 0x7401, 0xD66F, 0x7403, 0xB279,\t0x7404, 0xD66E, 0x7405, 0xB277, 0x7406, 0xB27A, 0x7407, 0xD671,\n\t0x7408, 0xD679, 0x7409, 0xAF5B, 0x740A, 0xB278, 0x740B, 0xD677,\t0x740C, 0xD676, 0x740D, 0xB27C, 0x7416, 0xDA7E, 0x741A, 0xDAA1,\n\t0x741B, 0xB560, 0x741D, 0xDAA7, 0x7420, 0xDAA9, 0x7421, 0xDAA2,\t0x7422, 0xB55A, 0x7423, 0xDAA6, 0x7424, 0xDAA5, 0x7425, 0xB55B,\n\t0x7426, 0xB561, 0x7428, 0xB562, 0x7429, 0xDAA8, 0x742A, 0xB558,\t0x742B, 0xDA7D, 0x742C, 0xDA7B, 0x742D, 0xDAA3, 0x742E, 0xDA7A,\n\t0x742F, 0xB55F, 0x7430, 0xDA7C, 0x7431, 0xDAA4, 0x7432, 0xDAAA,\t0x7433, 0xB559, 0x7434, 0xB55E, 0x7435, 0xB55C, 0x7436, 0xB55D,\n\t0x743A, 0xB557, 0x743F, 0xB7E9, 0x7440, 0xDEB7, 0x7441, 0xB7E8,\t0x7442, 0xDEBB, 0x7444, 0xDEB1, 0x7446, 0xDEBC, 0x744A, 0xDEB2,\n\t0x744B, 0xDEB3, 0x744D, 0xDEBD, 0x744E, 0xDEBA, 0x744F, 0xDEB8,\t0x7450, 0xDEB9, 0x7451, 0xDEB5, 0x7452, 0xDEB4, 0x7454, 0xDEBE,\n\t0x7455, 0xB7E5, 0x7457, 0xDEB6, 0x7459, 0xB7EA, 0x745A, 0xB7E4,\t0x745B, 0xB7EB, 0x745C, 0xB7EC, 0x745E, 0xB7E7, 0x745F, 0xB7E6,\n\t0x7462, 0xE2CE, 0x7463, 0xBABE, 0x7464, 0xBABD, 0x7467, 0xE2D3,\t0x7469, 0xBCFC, 0x746A, 0xBABF, 0x746D, 0xBAC1, 0x746E, 0xE2D4,\n\t0x746F, 0xB7E3, 0x7470, 0xBAC0, 0x7471, 0xE2D0, 0x7472, 0xE2D2,\t0x7473, 0xE2CF, 0x7475, 0xE2D1, 0x7479, 0xE6AB, 0x747C, 0xE6AA,\n\t0x747D, 0xE6A7, 0x747E, 0xBD40, 0x747F, 0xEA62, 0x7480, 0xBD41,\t0x7481, 0xE6A6, 0x7483, 0xBCFE, 0x7485, 0xE6A8, 0x7486, 0xE6A5,\n\t0x7487, 0xE6A2, 0x7488, 0xE6A9, 0x7489, 0xE6A3, 0x748A, 0xE6A4,\t0x748B, 0xBCFD, 0x7490, 0xED69, 0x7492, 0xEA66, 0x7494, 0xEA65,\n\t0x7495, 0xEA67, 0x7497, 0xED66, 0x7498, 0xBF5A, 0x749A, 0xEA63,\t0x749C, 0xBF58, 0x749E, 0xBF5C, 0x749F, 0xBF5B, 0x74A0, 0xEA64,\n\t0x74A1, 0xEA68, 0x74A3, 0xBF59, 0x74A5, 0xED6D, 0x74A6, 0xC0F5,\t0x74A7, 0xC27A, 0x74A8, 0xC0F6, 0x74A9, 0xC0F3, 0x74AA, 0xED6A,\n\t0x74AB, 0xED68, 0x74AD, 0xED6B, 0x74AF, 0xED6E, 0x74B0, 0xC0F4,\t0x74B1, 0xED6C, 0x74B2, 0xED67, 0x74B5, 0xF042, 0x74B6, 0xF045,\n\t0x74B7, 0xF275, 0x74B8, 0xF040, 0x74BA, 0xF46F, 0x74BB, 0xF046,\t0x74BD, 0xC3A2, 0x74BE, 0xF044, 0x74BF, 0xC27B, 0x74C0, 0xF041,\n\t0x74C1, 0xF043, 0x74C2, 0xF047, 0x74C3, 0xF276, 0x74C5, 0xF274,\t0x74CA, 0xC3A3, 0x74CB, 0xF273, 0x74CF, 0xC46E, 0x74D4, 0xC4ED,\n\t0x74D5, 0xF6F1, 0x74D6, 0xC4EC, 0x74D7, 0xF6F3, 0x74D8, 0xF6F0,\t0x74D9, 0xF6F2, 0x74DA, 0xC5D0, 0x74DB, 0xF8B2, 0x74DC, 0xA5CA,\n\t0x74DD, 0xCD6E, 0x74DE, 0xD2BC, 0x74DF, 0xD2BD, 0x74E0, 0xB27D,\t0x74E1, 0xDEBF, 0x74E2, 0xBF5D, 0x74E3, 0xC3A4, 0x74E4, 0xC57B,\n\t0x74E5, 0xF8B3, 0x74E6, 0xA5CB, 0x74E8, 0xCD6F, 0x74E9, 0xA260,\t0x74EC, 0xCFD7, 0x74EE, 0xCFD8, 0x74F4, 0xD2BE, 0x74F5, 0xD2BF,\n\t0x74F6, 0xB27E, 0x74F7, 0xB2A1, 0x74FB, 0xDAAB, 0x74FD, 0xDEC2,\t0x74FE, 0xDEC1, 0x74FF, 0xDEC0, 0x7500, 0xE2D5, 0x7502, 0xE2D6,\n\t0x7503, 0xE2D7, 0x7504, 0xBAC2, 0x7507, 0xE6AD, 0x7508, 0xE6AC,\t0x750B, 0xEA69, 0x750C, 0xBF5E, 0x750D, 0xBF5F, 0x750F, 0xED72,\n\t0x7510, 0xED6F, 0x7511, 0xED70, 0x7512, 0xED71, 0x7513, 0xF049,\t0x7514, 0xF048, 0x7515, 0xC27C, 0x7516, 0xF277, 0x7517, 0xF5DE,\n\t0x7518, 0xA5CC, 0x751A, 0xACC6, 0x751C, 0xB2A2, 0x751D, 0xDEC3,\t0x751F, 0xA5CD, 0x7521, 0xD2C0, 0x7522, 0xB2A3, 0x7525, 0xB563,\n\t0x7526, 0xB564, 0x7528, 0xA5CE, 0x7529, 0xA5CF, 0x752A, 0xCA46,\t0x752B, 0xA86A, 0x752C, 0xA869, 0x752D, 0xACC7, 0x752E, 0xCFD9,\n\t0x752F, 0xDAAC, 0x7530, 0xA5D0, 0x7531, 0xA5D1, 0x7532, 0xA5D2,\t0x7533, 0xA5D3, 0x7537, 0xA86B, 0x7538, 0xA86C, 0x7539, 0xCB6E,\n\t0x753A, 0xCB6D, 0x753D, 0xAAB6, 0x753E, 0xCD72, 0x753F, 0xCD70,\t0x7540, 0xCD71, 0x7547, 0xCFDA, 0x7548, 0xCFDB, 0x754B, 0xACCB,\n\t0x754C, 0xACC9, 0x754E, 0xACCA, 0x754F, 0xACC8, 0x7554, 0xAF60,\t0x7559, 0xAF64, 0x755A, 0xAF63, 0x755B, 0xD2C1, 0x755C, 0xAF62,\n\t0x755D, 0xAF61, 0x755F, 0xD2C2, 0x7562, 0xB2A6, 0x7563, 0xD67B,\t0x7564, 0xD67A, 0x7565, 0xB2A4, 0x7566, 0xB2A5, 0x756A, 0xB566,\n\t0x756B, 0xB565, 0x756C, 0xDAAE, 0x756F, 0xDAAD, 0x7570, 0xB2A7,\t0x7576, 0xB7ED, 0x7577, 0xDEC5, 0x7578, 0xB7EE, 0x7579, 0xDEC4,\n\t0x757D, 0xE2D8, 0x757E, 0xE6AE, 0x757F, 0xBD42, 0x7580, 0xEA6A,\t0x7584, 0xED73, 0x7586, 0xC3A6, 0x7587, 0xC3A5, 0x758A, 0xC57C,\n\t0x758B, 0xA5D4, 0x758C, 0xCD73, 0x758F, 0xB2A8, 0x7590, 0xE2D9,\t0x7591, 0xBAC3, 0x7594, 0xCB6F, 0x7595, 0xCB70, 0x7598, 0xCD74,\n\t0x7599, 0xAAB8, 0x759A, 0xAAB9, 0x759D, 0xAAB7, 0x75A2, 0xACCF,\t0x75A3, 0xACD0, 0x75A4, 0xACCD, 0x75A5, 0xACCE, 0x75A7, 0xCFDC,\n\t0x75AA, 0xCFDD, 0x75AB, 0xACCC, 0x75B0, 0xD2C3, 0x75B2, 0xAF68,\t0x75B3, 0xAF69, 0x75B5, 0xB2AB, 0x75B6, 0xD2C9, 0x75B8, 0xAF6E,\n\t0x75B9, 0xAF6C, 0x75BA, 0xD2CA, 0x75BB, 0xD2C5, 0x75BC, 0xAF6B,\t0x75BD, 0xAF6A, 0x75BE, 0xAF65, 0x75BF, 0xD2C8, 0x75C0, 0xD2C7,\n\t0x75C1, 0xD2C4, 0x75C2, 0xAF6D, 0x75C4, 0xD2C6, 0x75C5, 0xAF66,\t0x75C7, 0xAF67, 0x75CA, 0xB2AC, 0x75CB, 0xD6A1, 0x75CC, 0xD6A2,\n\t0x75CD, 0xB2AD, 0x75CE, 0xD67C, 0x75CF, 0xD67E, 0x75D0, 0xD6A4,\t0x75D1, 0xD6A3, 0x75D2, 0xD67D, 0x75D4, 0xB2A9, 0x75D5, 0xB2AA,\n\t0x75D7, 0xDAB6, 0x75D8, 0xB56B, 0x75D9, 0xB56A, 0x75DA, 0xDAB0,\t0x75DB, 0xB568, 0x75DD, 0xDAB3, 0x75DE, 0xB56C, 0x75DF, 0xDAB4,\n\t0x75E0, 0xB56D, 0x75E1, 0xDAB1, 0x75E2, 0xB567, 0x75E3, 0xB569,\t0x75E4, 0xDAB5, 0x75E6, 0xDAB2, 0x75E7, 0xDAAF, 0x75ED, 0xDED2,\n\t0x75EF, 0xDEC7, 0x75F0, 0xB7F0, 0x75F1, 0xB7F3, 0x75F2, 0xB7F2,\t0x75F3, 0xB7F7, 0x75F4, 0xB7F6, 0x75F5, 0xDED3, 0x75F6, 0xDED1,\n\t0x75F7, 0xDECA, 0x75F8, 0xDECE, 0x75F9, 0xDECD, 0x75FA, 0xB7F4,\t0x75FB, 0xDED0, 0x75FC, 0xDECC, 0x75FD, 0xDED4, 0x75FE, 0xDECB,\n\t0x75FF, 0xB7F5, 0x7600, 0xB7EF, 0x7601, 0xB7F1, 0x7603, 0xDEC9,\t0x7608, 0xE2DB, 0x7609, 0xBAC7, 0x760A, 0xE2DF, 0x760B, 0xBAC6,\n\t0x760C, 0xE2DC, 0x760D, 0xBAC5, 0x760F, 0xDEC8, 0x7610, 0xDECF,\t0x7611, 0xE2DE, 0x7613, 0xBAC8, 0x7614, 0xE2E0, 0x7615, 0xE2DD,\n\t0x7616, 0xE2DA, 0x7619, 0xE6B1, 0x761A, 0xE6B5, 0x761B, 0xE6B7,\t0x761C, 0xE6B3, 0x761D, 0xE6B2, 0x761E, 0xE6B0, 0x761F, 0xBD45,\n\t0x7620, 0xBD43, 0x7621, 0xBD48, 0x7622, 0xBD49, 0x7623, 0xE6B4,\t0x7624, 0xBD46, 0x7625, 0xE6AF, 0x7626, 0xBD47, 0x7627, 0xBAC4,\n\t0x7628, 0xE6B6, 0x7629, 0xBD44, 0x762D, 0xEA6C, 0x762F, 0xEA6B,\t0x7630, 0xEA73, 0x7631, 0xEA6D, 0x7632, 0xEA72, 0x7633, 0xEA6F,\n\t0x7634, 0xBF60, 0x7635, 0xEA71, 0x7638, 0xBF61, 0x763A, 0xBF62,\t0x763C, 0xEA70, 0x763D, 0xEA6E, 0x7642, 0xC0F8, 0x7643, 0xED74,\n\t0x7646, 0xC0F7, 0x7647, 0xED77, 0x7648, 0xED75, 0x7649, 0xED76,\t0x764C, 0xC0F9, 0x7650, 0xF04D, 0x7652, 0xC2A1, 0x7653, 0xF04E,\n\t0x7656, 0xC27D, 0x7657, 0xF04F, 0x7658, 0xC27E, 0x7659, 0xF04C,\t0x765A, 0xF050, 0x765C, 0xF04A, 0x765F, 0xC3A7, 0x7660, 0xF278,\n\t0x7661, 0xC3A8, 0x7662, 0xC46F, 0x7664, 0xF04B, 0x7665, 0xC470,\t0x7669, 0xC4EE, 0x766A, 0xF5DF, 0x766C, 0xC57E, 0x766D, 0xF6F4,\n\t0x766E, 0xC57D, 0x7670, 0xF7EA, 0x7671, 0xC5F5, 0x7672, 0xC5F6,\t0x7675, 0xF9CC, 0x7678, 0xACD1, 0x7679, 0xCFDE, 0x767B, 0xB56E,\n\t0x767C, 0xB56F, 0x767D, 0xA5D5, 0x767E, 0xA6CA, 0x767F, 0xCA47,\t0x7681, 0xCB71, 0x7682, 0xA86D, 0x7684, 0xAABA, 0x7686, 0xACD2,\n\t0x7687, 0xACD3, 0x7688, 0xACD4, 0x7689, 0xD6A6, 0x768A, 0xD2CB,\t0x768B, 0xAF6F, 0x768E, 0xB2AE, 0x768F, 0xD6A5, 0x7692, 0xDAB8,\n\t0x7693, 0xB571, 0x7695, 0xDAB7, 0x7696, 0xB570, 0x7699, 0xDED5,\t0x769A, 0xBD4A, 0x769B, 0xE6BB, 0x769C, 0xE6B8, 0x769D, 0xE6B9,\n\t0x769E, 0xE6BA, 0x76A4, 0xED78, 0x76A6, 0xF051, 0x76AA, 0xF471,\t0x76AB, 0xF470, 0x76AD, 0xF6F5, 0x76AE, 0xA5D6, 0x76AF, 0xCD75,\n\t0x76B0, 0xAF70, 0x76B4, 0xB572, 0x76B5, 0xDED6, 0x76B8, 0xE2E1,\t0x76BA, 0xBD4B, 0x76BB, 0xEA74, 0x76BD, 0xF052, 0x76BE, 0xF472,\n\t0x76BF, 0xA5D7, 0x76C2, 0xAABB, 0x76C3, 0xACD7, 0x76C4, 0xCFDF,\t0x76C5, 0xACD8, 0x76C6, 0xACD6, 0x76C8, 0xACD5, 0x76C9, 0xD2CC,\n\t0x76CA, 0xAF71, 0x76CD, 0xAF72, 0x76CE, 0xAF73, 0x76D2, 0xB2B0,\t0x76D3, 0xD6A7, 0x76D4, 0xB2AF, 0x76DA, 0xDAB9, 0x76DB, 0xB2B1,\n\t0x76DC, 0xB573, 0x76DD, 0xDED7, 0x76DE, 0xB7F8, 0x76DF, 0xB7F9,\t0x76E1, 0xBAC9, 0x76E3, 0xBACA, 0x76E4, 0xBD4C, 0x76E5, 0xBF64,\n\t0x76E6, 0xEA75, 0x76E7, 0xBF63, 0x76E9, 0xED79, 0x76EA, 0xC0FA,\t0x76EC, 0xF053, 0x76ED, 0xF473, 0x76EE, 0xA5D8, 0x76EF, 0xA86E,\n\t0x76F0, 0xCD78, 0x76F1, 0xCD77, 0x76F2, 0xAABC, 0x76F3, 0xCD76,\t0x76F4, 0xAABD, 0x76F5, 0xCD79, 0x76F7, 0xCFE5, 0x76F8, 0xACDB,\n\t0x76F9, 0xACDA, 0x76FA, 0xCFE7, 0x76FB, 0xCFE6, 0x76FC, 0xACDF,\t0x76FE, 0xACDE, 0x7701, 0xACD9, 0x7703, 0xCFE1, 0x7704, 0xCFE2,\n\t0x7705, 0xCFE3, 0x7707, 0xACE0, 0x7708, 0xCFE0, 0x7709, 0xACDC,\t0x770A, 0xCFE4, 0x770B, 0xACDD, 0x7710, 0xD2CF, 0x7711, 0xD2D3,\n\t0x7712, 0xD2D1, 0x7713, 0xD2D0, 0x7715, 0xD2D4, 0x7719, 0xD2D5,\t0x771A, 0xD2D6, 0x771B, 0xD2CE, 0x771D, 0xD2CD, 0x771F, 0xAF75,\n\t0x7720, 0xAF76, 0x7722, 0xD2D7, 0x7723, 0xD2D2, 0x7725, 0xD6B0,\t0x7727, 0xD2D8, 0x7728, 0xAF77, 0x7729, 0xAF74, 0x772D, 0xD6AA,\n\t0x772F, 0xD6A9, 0x7731, 0xD6AB, 0x7732, 0xD6AC, 0x7733, 0xD6AE,\t0x7734, 0xD6AD, 0x7735, 0xD6B2, 0x7736, 0xB2B5, 0x7737, 0xB2B2,\n\t0x7738, 0xB2B6, 0x7739, 0xD6A8, 0x773A, 0xB2B7, 0x773B, 0xD6B1,\t0x773C, 0xB2B4, 0x773D, 0xD6AF, 0x773E, 0xB2B3, 0x7744, 0xDABC,\n\t0x7745, 0xDABE, 0x7746, 0xDABA, 0x7747, 0xDABB, 0x774A, 0xDABF,\t0x774B, 0xDAC1, 0x774C, 0xDAC2, 0x774D, 0xDABD, 0x774E, 0xDAC0,\n\t0x774F, 0xB574, 0x7752, 0xDEDB, 0x7754, 0xDEE0, 0x7755, 0xDED8,\t0x7756, 0xDEDC, 0x7759, 0xDEE1, 0x775A, 0xDEDD, 0x775B, 0xB7FA,\n\t0x775C, 0xB843, 0x775E, 0xB7FD, 0x775F, 0xDED9, 0x7760, 0xDEDA,\t0x7761, 0xBACE, 0x7762, 0xB846, 0x7763, 0xB7FE, 0x7765, 0xB844,\n\t0x7766, 0xB7FC, 0x7767, 0xDEDF, 0x7768, 0xB845, 0x7769, 0xDEDE,\t0x776A, 0xB841, 0x776B, 0xB7FB, 0x776C, 0xB842, 0x776D, 0xDEE2,\n\t0x776E, 0xE2E6, 0x776F, 0xE2E8, 0x7779, 0xB840, 0x777C, 0xE2E3,\t0x777D, 0xBACC, 0x777E, 0xE2E9, 0x777F, 0xBACD, 0x7780, 0xE2E7,\n\t0x7781, 0xE2E2, 0x7782, 0xE2E5, 0x7783, 0xE2EA, 0x7784, 0xBACB,\t0x7785, 0xE2E4, 0x7787, 0xBD4E, 0x7788, 0xE6BF, 0x7789, 0xE6BE,\n\t0x778B, 0xBD51, 0x778C, 0xBD4F, 0x778D, 0xE6BC, 0x778E, 0xBD4D,\t0x778F, 0xE6BD, 0x7791, 0xBD50, 0x7795, 0xEA7D, 0x7797, 0xEAA1,\n\t0x7799, 0xEA7E, 0x779A, 0xEA76, 0x779B, 0xEA7A, 0x779C, 0xEA79,\t0x779D, 0xEA77, 0x779E, 0xBF66, 0x779F, 0xBF67, 0x77A0, 0xBF65,\n\t0x77A1, 0xEA78, 0x77A2, 0xEA7B, 0x77A3, 0xEA7C, 0x77A5, 0xBF68,\t0x77A7, 0xC140, 0x77A8, 0xEDA3, 0x77AA, 0xC0FC, 0x77AB, 0xED7B,\n\t0x77AC, 0xC0FE, 0x77AD, 0xC141, 0x77B0, 0xC0FD, 0x77B1, 0xEDA2,\t0x77B2, 0xED7C, 0x77B3, 0xC0FB, 0x77B4, 0xEDA1, 0x77B5, 0xED7A,\n\t0x77B6, 0xED7E, 0x77B7, 0xED7D, 0x77BA, 0xF055, 0x77BB, 0xC2A4,\t0x77BC, 0xC2A5, 0x77BD, 0xC2A2, 0x77BF, 0xC2A3, 0x77C2, 0xF054,\n\t0x77C4, 0xF27B, 0x77C7, 0xC3A9, 0x77C9, 0xF279, 0x77CA, 0xF27A,\t0x77CC, 0xF474, 0x77CD, 0xF477, 0x77CE, 0xF475, 0x77CF, 0xF476,\n\t0x77D0, 0xF5E0, 0x77D3, 0xC4EF, 0x77D4, 0xF7EB, 0x77D5, 0xF8B4,\t0x77D7, 0xC5F7, 0x77D8, 0xF8F8, 0x77D9, 0xF8F9, 0x77DA, 0xC666,\n\t0x77DB, 0xA5D9, 0x77DC, 0xACE1, 0x77DE, 0xDAC3, 0x77E0, 0xDEE3,\t0x77E2, 0xA5DA, 0x77E3, 0xA86F, 0x77E5, 0xAABE, 0x77E7, 0xCFE8,\n\t0x77E8, 0xCFE9, 0x77E9, 0xAF78, 0x77EC, 0xDAC4, 0x77ED, 0xB575,\t0x77EE, 0xB847, 0x77EF, 0xC142, 0x77F0, 0xEDA4, 0x77F1, 0xF27C,\n\t0x77F2, 0xF478, 0x77F3, 0xA5DB, 0x77F7, 0xCDA1, 0x77F8, 0xCD7A,\t0x77F9, 0xCD7C, 0x77FA, 0xCD7E, 0x77FB, 0xCD7D, 0x77FC, 0xCD7B,\n\t0x77FD, 0xAABF, 0x7802, 0xACE2, 0x7803, 0xCFF2, 0x7805, 0xCFED,\t0x7806, 0xCFEA, 0x7809, 0xCFF1, 0x780C, 0xACE4, 0x780D, 0xACE5,\n\t0x780E, 0xCFF0, 0x780F, 0xCFEF, 0x7810, 0xCFEE, 0x7811, 0xCFEB,\t0x7812, 0xCFEC, 0x7813, 0xCFF3, 0x7814, 0xACE3, 0x781D, 0xAF7C,\n\t0x781F, 0xAFA4, 0x7820, 0xAFA3, 0x7821, 0xD2E1, 0x7822, 0xD2DB,\t0x7823, 0xD2D9, 0x7825, 0xAFA1, 0x7826, 0xD6B9, 0x7827, 0xAF7A,\n\t0x7828, 0xD2DE, 0x7829, 0xD2E2, 0x782A, 0xD2E4, 0x782B, 0xD2E0,\t0x782C, 0xD2DA, 0x782D, 0xAFA2, 0x782E, 0xD2DF, 0x782F, 0xD2DD,\n\t0x7830, 0xAF79, 0x7831, 0xD2E5, 0x7832, 0xAFA5, 0x7833, 0xD2E3,\t0x7834, 0xAF7D, 0x7835, 0xD2DC, 0x7837, 0xAF7E, 0x7838, 0xAF7B,\n\t0x7843, 0xB2B9, 0x7845, 0xD6BA, 0x7848, 0xD6B3, 0x7849, 0xD6B5,\t0x784A, 0xD6B7, 0x784C, 0xD6B8, 0x784D, 0xD6B6, 0x784E, 0xB2BA,\n\t0x7850, 0xD6BB, 0x7852, 0xD6B4, 0x785C, 0xDAC8, 0x785D, 0xB576,\t0x785E, 0xDAD0, 0x7860, 0xDAC5, 0x7862, 0xDAD1, 0x7864, 0xDAC6,\n\t0x7865, 0xDAC7, 0x7868, 0xDACF, 0x7869, 0xDACE, 0x786A, 0xDACB,\t0x786B, 0xB2B8, 0x786C, 0xB577, 0x786D, 0xDAC9, 0x786E, 0xDACC,\n\t0x786F, 0xB578, 0x7870, 0xDACD, 0x7871, 0xDACA, 0x7879, 0xDEEE,\t0x787B, 0xDEF2, 0x787C, 0xB84E, 0x787E, 0xE2F0, 0x787F, 0xB851,\n\t0x7880, 0xDEF0, 0x7881, 0xF9D6, 0x7883, 0xDEED, 0x7884, 0xDEE8,\t0x7885, 0xDEEA, 0x7886, 0xDEEB, 0x7887, 0xDEE4, 0x7889, 0xB84D,\n\t0x788C, 0xB84C, 0x788E, 0xB848, 0x788F, 0xDEE7, 0x7891, 0xB84F,\t0x7893, 0xB850, 0x7894, 0xDEE6, 0x7895, 0xDEE9, 0x7896, 0xDEF1,\n\t0x7897, 0xB84A, 0x7898, 0xB84B, 0x7899, 0xDEEF, 0x789A, 0xDEE5,\t0x789E, 0xE2F2, 0x789F, 0xBAD0, 0x78A0, 0xE2F4, 0x78A1, 0xDEEC,\n\t0x78A2, 0xE2F6, 0x78A3, 0xBAD4, 0x78A4, 0xE2F7, 0x78A5, 0xE2F3,\t0x78A7, 0xBAD1, 0x78A8, 0xE2EF, 0x78A9, 0xBAD3, 0x78AA, 0xE2EC,\n\t0x78AB, 0xE2F1, 0x78AC, 0xE2F5, 0x78AD, 0xE2EE, 0x78B0, 0xB849,\t0x78B2, 0xE2EB, 0x78B3, 0xBAD2, 0x78B4, 0xE2ED, 0x78BA, 0xBD54,\n\t0x78BB, 0xE6C1, 0x78BC, 0xBD58, 0x78BE, 0xBD56, 0x78C1, 0xBACF,\t0x78C3, 0xE6C8, 0x78C4, 0xE6C9, 0x78C5, 0xBD53, 0x78C8, 0xE6C7,\n\t0x78C9, 0xE6CA, 0x78CA, 0xBD55, 0x78CB, 0xBD52, 0x78CC, 0xE6C3,\t0x78CD, 0xE6C0, 0x78CE, 0xE6C5, 0x78CF, 0xE6C2, 0x78D0, 0xBD59,\n\t0x78D1, 0xE6C4, 0x78D4, 0xE6C6, 0x78D5, 0xBD57, 0x78DA, 0xBF6A,\t0x78DB, 0xEAA8, 0x78DD, 0xEAA2, 0x78DE, 0xEAA6, 0x78DF, 0xEAAC,\n\t0x78E0, 0xEAAD, 0x78E1, 0xEAA9, 0x78E2, 0xEAAA, 0x78E3, 0xEAA7,\t0x78E5, 0xEAA4, 0x78E7, 0xBF6C, 0x78E8, 0xBF69, 0x78E9, 0xEAA3,\n\t0x78EA, 0xEAA5, 0x78EC, 0xBF6B, 0x78ED, 0xEAAB, 0x78EF, 0xC146,\t0x78F2, 0xEDAA, 0x78F3, 0xEDA5, 0x78F4, 0xC145, 0x78F7, 0xC143,\n\t0x78F9, 0xEDAC, 0x78FA, 0xC144, 0x78FB, 0xEDA8, 0x78FC, 0xEDA9,\t0x78FD, 0xEDA6, 0x78FE, 0xEDAD, 0x78FF, 0xF056, 0x7901, 0xC147,\n\t0x7902, 0xEDA7, 0x7904, 0xEDAE, 0x7905, 0xEDAB, 0x7909, 0xF05A,\t0x790C, 0xF057, 0x790E, 0xC2A6, 0x7910, 0xF05B, 0x7911, 0xF05D,\n\t0x7912, 0xF05C, 0x7913, 0xF058, 0x7914, 0xF059, 0x7917, 0xF2A3,\t0x7919, 0xC3AA, 0x791B, 0xF27E, 0x791C, 0xF2A2, 0x791D, 0xF27D,\n\t0x791E, 0xF2A4, 0x7921, 0xF2A1, 0x7923, 0xF47A, 0x7924, 0xF47D,\t0x7925, 0xF479, 0x7926, 0xC471, 0x7927, 0xF47B, 0x7928, 0xF47C,\n\t0x7929, 0xF47E, 0x792A, 0xC472, 0x792B, 0xC474, 0x792C, 0xC473,\t0x792D, 0xF5E1, 0x792F, 0xF5E3, 0x7931, 0xF5E2, 0x7935, 0xF6F6,\n\t0x7938, 0xF8B5, 0x7939, 0xF8FA, 0x793A, 0xA5DC, 0x793D, 0xCB72,\t0x793E, 0xAAC0, 0x793F, 0xCDA3, 0x7940, 0xAAC1, 0x7941, 0xAAC2,\n\t0x7942, 0xCDA2, 0x7944, 0xCFF8, 0x7945, 0xCFF7, 0x7946, 0xACE6,\t0x7947, 0xACE9, 0x7948, 0xACE8, 0x7949, 0xACE7, 0x794A, 0xCFF4,\n\t0x794B, 0xCFF6, 0x794C, 0xCFF5, 0x794F, 0xD2E8, 0x7950, 0xAFA7,\t0x7951, 0xD2EC, 0x7952, 0xD2EB, 0x7953, 0xD2EA, 0x7954, 0xD2E6,\n\t0x7955, 0xAFA6, 0x7956, 0xAFAA, 0x7957, 0xAFAD, 0x795A, 0xAFAE,\t0x795B, 0xD2E7, 0x795C, 0xD2E9, 0x795D, 0xAFAC, 0x795E, 0xAFAB,\n\t0x795F, 0xAFA9, 0x7960, 0xAFA8, 0x7961, 0xD6C2, 0x7963, 0xD6C0,\t0x7964, 0xD6BC, 0x7965, 0xB2BB, 0x7967, 0xD6BD, 0x7968, 0xB2BC,\n\t0x7969, 0xD6BE, 0x796A, 0xD6BF, 0x796B, 0xD6C1, 0x796D, 0xB2BD,\t0x7970, 0xDAD5, 0x7972, 0xDAD4, 0x7973, 0xDAD3, 0x7974, 0xDAD2,\n\t0x7979, 0xDEF6, 0x797A, 0xB852, 0x797C, 0xDEF3, 0x797D, 0xDEF5,\t0x797F, 0xB853, 0x7981, 0xB854, 0x7982, 0xDEF4, 0x7988, 0xE341,\n\t0x798A, 0xE2F9, 0x798B, 0xE2FA, 0x798D, 0xBAD7, 0x798E, 0xBAD5,\t0x798F, 0xBAD6, 0x7990, 0xE343, 0x7992, 0xE342, 0x7993, 0xE2FE,\n\t0x7994, 0xE2FD, 0x7995, 0xE2FC, 0x7996, 0xE2FB, 0x7997, 0xE340,\t0x7998, 0xE2F8, 0x799A, 0xE6CB, 0x799B, 0xE6D0, 0x799C, 0xE6CE,\n\t0x79A0, 0xE6CD, 0x79A1, 0xE6CC, 0x79A2, 0xE6CF, 0x79A4, 0xEAAE,\t0x79A6, 0xBF6D, 0x79A7, 0xC148, 0x79A8, 0xEDB0, 0x79AA, 0xC149,\n\t0x79AB, 0xEDAF, 0x79AC, 0xF05F, 0x79AD, 0xF05E, 0x79AE, 0xC2A7,\t0x79B0, 0xF2A5, 0x79B1, 0xC3AB, 0x79B2, 0xF4A1, 0x79B3, 0xC5A1,\n\t0x79B4, 0xF6F7, 0x79B6, 0xF8B7, 0x79B7, 0xF8B6, 0x79B8, 0xC9A8,\t0x79B9, 0xACEA, 0x79BA, 0xACEB, 0x79BB, 0xD6C3, 0x79BD, 0xB856,\n\t0x79BE, 0xA5DD, 0x79BF, 0xA872, 0x79C0, 0xA871, 0x79C1, 0xA870,\t0x79C5, 0xCDA4, 0x79C8, 0xAAC4, 0x79C9, 0xAAC3, 0x79CB, 0xACEE,\n\t0x79CD, 0xCFFA, 0x79CE, 0xCFFD, 0x79CF, 0xCFFB, 0x79D1, 0xACEC,\t0x79D2, 0xACED, 0x79D5, 0xCFF9, 0x79D6, 0xCFFC, 0x79D8, 0xAFB5,\n\t0x79DC, 0xD2F3, 0x79DD, 0xD2F5, 0x79DE, 0xD2F4, 0x79DF, 0xAFB2,\t0x79E0, 0xD2EF, 0x79E3, 0xAFB0, 0x79E4, 0xAFAF, 0x79E6, 0xAFB3,\n\t0x79E7, 0xAFB1, 0x79E9, 0xAFB4, 0x79EA, 0xD2F2, 0x79EB, 0xD2ED,\t0x79EC, 0xD2EE, 0x79ED, 0xD2F1, 0x79EE, 0xD2F0, 0x79F6, 0xD6C6,\n\t0x79F7, 0xD6C7, 0x79F8, 0xD6C5, 0x79FA, 0xD6C4, 0x79FB, 0xB2BE,\t0x7A00, 0xB57D, 0x7A02, 0xDAD6, 0x7A03, 0xDAD8, 0x7A04, 0xDADA,\n\t0x7A05, 0xB57C, 0x7A08, 0xB57A, 0x7A0A, 0xDAD7, 0x7A0B, 0xB57B,\t0x7A0C, 0xDAD9, 0x7A0D, 0xB579, 0x7A10, 0xDF41, 0x7A11, 0xDEF7,\n\t0x7A12, 0xDEFA, 0x7A13, 0xDEFE, 0x7A14, 0xB85A, 0x7A15, 0xDEFC,\t0x7A17, 0xDEFB, 0x7A18, 0xDEF8, 0x7A19, 0xDEF9, 0x7A1A, 0xB858,\n\t0x7A1B, 0xDF40, 0x7A1C, 0xB857, 0x7A1E, 0xB85C, 0x7A1F, 0xB85B,\t0x7A20, 0xB859, 0x7A22, 0xDEFD, 0x7A26, 0xE349, 0x7A28, 0xE348,\n\t0x7A2B, 0xE344, 0x7A2E, 0xBAD8, 0x7A2F, 0xE347, 0x7A30, 0xE346,\t0x7A31, 0xBAD9, 0x7A37, 0xBD5E, 0x7A39, 0xE6D2, 0x7A3B, 0xBD5F,\n\t0x7A3C, 0xBD5B, 0x7A3D, 0xBD5D, 0x7A3F, 0xBD5A, 0x7A40, 0xBD5C,\t0x7A44, 0xEAAF, 0x7A46, 0xBF70, 0x7A47, 0xEAB1, 0x7A48, 0xEAB0,\n\t0x7A4A, 0xE345, 0x7A4B, 0xBF72, 0x7A4C, 0xBF71, 0x7A4D, 0xBF6E,\t0x7A4E, 0xBF6F, 0x7A54, 0xEDB5, 0x7A56, 0xEDB3, 0x7A57, 0xC14A,\n\t0x7A58, 0xEDB4, 0x7A5A, 0xEDB6, 0x7A5B, 0xEDB2, 0x7A5C, 0xEDB1,\t0x7A5F, 0xF060, 0x7A60, 0xC2AA, 0x7A61, 0xC2A8, 0x7A62, 0xC2A9,\n\t0x7A67, 0xF2A6, 0x7A68, 0xF2A7, 0x7A69, 0xC3AD, 0x7A6B, 0xC3AC,\t0x7A6C, 0xF4A3, 0x7A6D, 0xF4A4, 0x7A6E, 0xF4A2, 0x7A70, 0xF6F8,\n\t0x7A71, 0xF6F9, 0x7A74, 0xA5DE, 0x7A75, 0xCA48, 0x7A76, 0xA873,\t0x7A78, 0xCDA5, 0x7A79, 0xAAC6, 0x7A7A, 0xAAC5, 0x7A7B, 0xCDA6,\n\t0x7A7E, 0xD040, 0x7A7F, 0xACEF, 0x7A80, 0xCFFE, 0x7A81, 0xACF0,\t0x7A84, 0xAFB6, 0x7A85, 0xD2F8, 0x7A86, 0xD2F6, 0x7A87, 0xD2FC,\n\t0x7A88, 0xAFB7, 0x7A89, 0xD2F7, 0x7A8A, 0xD2FB, 0x7A8B, 0xD2F9,\t0x7A8C, 0xD2FA, 0x7A8F, 0xD6C8, 0x7A90, 0xD6CA, 0x7A92, 0xB2BF,\n\t0x7A94, 0xD6C9, 0x7A95, 0xB2C0, 0x7A96, 0xB5A2, 0x7A97, 0xB5A1,\t0x7A98, 0xB57E, 0x7A99, 0xDADB, 0x7A9E, 0xDF44, 0x7A9F, 0xB85D,\n\t0x7AA0, 0xB85E, 0x7AA2, 0xDF43, 0x7AA3, 0xDF42, 0x7AA8, 0xE34A,\t0x7AA9, 0xBADB, 0x7AAA, 0xBADA, 0x7AAB, 0xE34B, 0x7AAC, 0xE34C,\n\t0x7AAE, 0xBD61, 0x7AAF, 0xBD60, 0x7AB1, 0xEAB5, 0x7AB2, 0xE6D3,\t0x7AB3, 0xE6D5, 0x7AB4, 0xE6D4, 0x7AB5, 0xEAB4, 0x7AB6, 0xEAB2,\n\t0x7AB7, 0xEAB6, 0x7AB8, 0xEAB3, 0x7ABA, 0xBF73, 0x7ABE, 0xEDB7,\t0x7ABF, 0xC14B, 0x7AC0, 0xEDB8, 0x7AC1, 0xEDB9, 0x7AC4, 0xC2AB,\n\t0x7AC5, 0xC2AC, 0x7AC7, 0xC475, 0x7ACA, 0xC5D1, 0x7ACB, 0xA5DF,\t0x7AD1, 0xD041, 0x7AD8, 0xD2FD, 0x7AD9, 0xAFB8, 0x7ADF, 0xB3BA,\n\t0x7AE0, 0xB3B9, 0x7AE3, 0xB5A4, 0x7AE4, 0xDADD, 0x7AE5, 0xB5A3,\t0x7AE6, 0xDADC, 0x7AEB, 0xDF45, 0x7AED, 0xBADC, 0x7AEE, 0xE34D,\n\t0x7AEF, 0xBADD, 0x7AF6, 0xC476, 0x7AF7, 0xF4A5, 0x7AF9, 0xA6CB,\t0x7AFA, 0xAAC7, 0x7AFB, 0xCDA7, 0x7AFD, 0xACF2, 0x7AFF, 0xACF1,\n\t0x7B00, 0xD042, 0x7B01, 0xD043, 0x7B04, 0xD340, 0x7B05, 0xD342,\t0x7B06, 0xAFB9, 0x7B08, 0xD344, 0x7B09, 0xD347, 0x7B0A, 0xD345,\n\t0x7B0E, 0xD346, 0x7B0F, 0xD343, 0x7B10, 0xD2FE, 0x7B11, 0xAFBA,\t0x7B12, 0xD348, 0x7B13, 0xD341, 0x7B18, 0xD6D3, 0x7B19, 0xB2C6,\n\t0x7B1A, 0xD6DC, 0x7B1B, 0xB2C3, 0x7B1D, 0xD6D5, 0x7B1E, 0xB2C7,\t0x7B20, 0xB2C1, 0x7B22, 0xD6D0, 0x7B23, 0xD6DD, 0x7B24, 0xD6D1,\n\t0x7B25, 0xD6CE, 0x7B26, 0xB2C5, 0x7B28, 0xB2C2, 0x7B2A, 0xD6D4,\t0x7B2B, 0xD6D7, 0x7B2C, 0xB2C4, 0x7B2D, 0xD6D8, 0x7B2E, 0xB2C8,\n\t0x7B2F, 0xD6D9, 0x7B30, 0xD6CF, 0x7B31, 0xD6D6, 0x7B32, 0xD6DA,\t0x7B33, 0xD6D2, 0x7B34, 0xD6CD, 0x7B35, 0xD6CB, 0x7B38, 0xD6DB,\n\t0x7B3B, 0xDADF, 0x7B40, 0xDAE4, 0x7B44, 0xDAE0, 0x7B45, 0xDAE6,\t0x7B46, 0xB5A7, 0x7B47, 0xD6CC, 0x7B48, 0xDAE1, 0x7B49, 0xB5A5,\n\t0x7B4A, 0xDADE, 0x7B4B, 0xB5AC, 0x7B4C, 0xDAE2, 0x7B4D, 0xB5AB,\t0x7B4E, 0xDAE3, 0x7B4F, 0xB5AD, 0x7B50, 0xB5A8, 0x7B51, 0xB5AE,\n\t0x7B52, 0xB5A9, 0x7B54, 0xB5AA, 0x7B56, 0xB5A6, 0x7B58, 0xDAE5,\t0x7B60, 0xB861, 0x7B61, 0xDF50, 0x7B63, 0xDF53, 0x7B64, 0xDF47,\n\t0x7B65, 0xDF4C, 0x7B66, 0xDF46, 0x7B67, 0xB863, 0x7B69, 0xDF4A,\t0x7B6D, 0xDF48, 0x7B6E, 0xB862, 0x7B70, 0xDF4F, 0x7B71, 0xDF4E,\n\t0x7B72, 0xDF4B, 0x7B73, 0xDF4D, 0x7B74, 0xDF49, 0x7B75, 0xBAE1,\t0x7B76, 0xDF52, 0x7B77, 0xB85F, 0x7B78, 0xDF51, 0x7B82, 0xE35D,\n\t0x7B84, 0xBAE8, 0x7B85, 0xE358, 0x7B87, 0xBAE7, 0x7B88, 0xE34E,\t0x7B8A, 0xE350, 0x7B8B, 0xBAE0, 0x7B8C, 0xE355, 0x7B8D, 0xE354,\n\t0x7B8E, 0xE357, 0x7B8F, 0xBAE5, 0x7B90, 0xE352, 0x7B91, 0xE351,\t0x7B94, 0xBAE4, 0x7B95, 0xBADF, 0x7B96, 0xE353, 0x7B97, 0xBAE2,\n\t0x7B98, 0xE359, 0x7B99, 0xE35B, 0x7B9B, 0xE356, 0x7B9C, 0xE34F,\t0x7B9D, 0xBAE3, 0x7BA0, 0xBD69, 0x7BA1, 0xBADE, 0x7BA4, 0xE35C,\n\t0x7BAC, 0xE6D9, 0x7BAD, 0xBD62, 0x7BAF, 0xE6DB, 0x7BB1, 0xBD63,\t0x7BB4, 0xBD65, 0x7BB5, 0xE6DE, 0x7BB7, 0xE6D6, 0x7BB8, 0xBAE6,\n\t0x7BB9, 0xE6DC, 0x7BBE, 0xE6D8, 0x7BC0, 0xB860, 0x7BC1, 0xBD68,\t0x7BC4, 0xBD64, 0x7BC6, 0xBD66, 0x7BC7, 0xBD67, 0x7BC9, 0xBF76,\n\t0x7BCA, 0xE6DD, 0x7BCB, 0xE6D7, 0x7BCC, 0xBD6A, 0x7BCE, 0xE6DA,\t0x7BD4, 0xEAC0, 0x7BD5, 0xEABB, 0x7BD8, 0xEAC5, 0x7BD9, 0xBF74,\n\t0x7BDA, 0xEABD, 0x7BDB, 0xBF78, 0x7BDC, 0xEAC3, 0x7BDD, 0xEABA,\t0x7BDE, 0xEAB7, 0x7BDF, 0xEAC6, 0x7BE0, 0xC151, 0x7BE1, 0xBF79,\n\t0x7BE2, 0xEAC2, 0x7BE3, 0xEAB8, 0x7BE4, 0xBF77, 0x7BE5, 0xEABC,\t0x7BE6, 0xBF7B, 0x7BE7, 0xEAB9, 0x7BE8, 0xEABE, 0x7BE9, 0xBF7A,\n\t0x7BEA, 0xEAC1, 0x7BEB, 0xEAC4, 0x7BF0, 0xEDCB, 0x7BF1, 0xEDCC,\t0x7BF2, 0xEDBC, 0x7BF3, 0xEDC3, 0x7BF4, 0xEDC1, 0x7BF7, 0xC14F,\n\t0x7BF8, 0xEDC8, 0x7BF9, 0xEABF, 0x7BFB, 0xEDBF, 0x7BFD, 0xEDC9,\t0x7BFE, 0xC14E, 0x7BFF, 0xEDBE, 0x7C00, 0xEDBD, 0x7C01, 0xEDC7,\n\t0x7C02, 0xEDC4, 0x7C03, 0xEDC6, 0x7C05, 0xEDBA, 0x7C06, 0xEDCA,\t0x7C07, 0xC14C, 0x7C09, 0xEDC5, 0x7C0A, 0xEDCE, 0x7C0B, 0xEDC2,\n\t0x7C0C, 0xC150, 0x7C0D, 0xC14D, 0x7C0E, 0xEDC0, 0x7C0F, 0xEDBB,\t0x7C10, 0xEDCD, 0x7C11, 0xBF75, 0x7C19, 0xF063, 0x7C1C, 0xF061,\n\t0x7C1D, 0xF067, 0x7C1E, 0xC2B0, 0x7C1F, 0xF065, 0x7C20, 0xF064,\t0x7C21, 0xC2B2, 0x7C22, 0xF06A, 0x7C23, 0xC2B1, 0x7C25, 0xF06B,\n\t0x7C26, 0xF068, 0x7C27, 0xC2AE, 0x7C28, 0xF069, 0x7C29, 0xF062,\t0x7C2A, 0xC2AF, 0x7C2B, 0xC2AD, 0x7C2C, 0xF2AB, 0x7C2D, 0xF066,\n\t0x7C30, 0xF06C, 0x7C33, 0xF2A8, 0x7C37, 0xC3B2, 0x7C38, 0xC3B0,\t0x7C39, 0xF2AA, 0x7C3B, 0xF2AC, 0x7C3C, 0xF2A9, 0x7C3D, 0xC3B1,\n\t0x7C3E, 0xC3AE, 0x7C3F, 0xC3AF, 0x7C40, 0xC3B3, 0x7C43, 0xC478,\t0x7C45, 0xF4AA, 0x7C47, 0xF4A9, 0x7C48, 0xF4A7, 0x7C49, 0xF4A6,\n\t0x7C4A, 0xF4A8, 0x7C4C, 0xC477, 0x7C4D, 0xC479, 0x7C50, 0xC4F0,\t0x7C53, 0xF5E5, 0x7C54, 0xF5E4, 0x7C57, 0xF6FA, 0x7C59, 0xF6FC,\n\t0x7C5A, 0xF6FE, 0x7C5B, 0xF6FD, 0x7C5C, 0xF6FB, 0x7C5F, 0xC5A3,\t0x7C60, 0xC5A2, 0x7C63, 0xC5D3, 0x7C64, 0xC5D2, 0x7C65, 0xC5D4,\n\t0x7C66, 0xF7ED, 0x7C67, 0xF7EC, 0x7C69, 0xF8FB, 0x7C6A, 0xF8B8,\t0x7C6B, 0xF8FC, 0x7C6C, 0xC658, 0x7C6E, 0xC659, 0x7C6F, 0xF96D,\n\t0x7C72, 0xC67E, 0x7C73, 0xA6CC, 0x7C75, 0xCDA8, 0x7C78, 0xD045,\t0x7C79, 0xD046, 0x7C7A, 0xD044, 0x7C7D, 0xACF3, 0x7C7F, 0xD047,\n\t0x7C80, 0xD048, 0x7C81, 0xD049, 0x7C84, 0xD349, 0x7C85, 0xD34F,\t0x7C88, 0xD34D, 0x7C89, 0xAFBB, 0x7C8A, 0xD34B, 0x7C8C, 0xD34C,\n\t0x7C8D, 0xD34E, 0x7C91, 0xD34A, 0x7C92, 0xB2C9, 0x7C94, 0xD6DE,\t0x7C95, 0xB2CB, 0x7C96, 0xD6E0, 0x7C97, 0xB2CA, 0x7C98, 0xD6DF,\n\t0x7C9E, 0xDAE8, 0x7C9F, 0xB5AF, 0x7CA1, 0xDAEA, 0x7CA2, 0xDAE7,\t0x7CA3, 0xD6E1, 0x7CA5, 0xB5B0, 0x7CA7, 0xF9DB, 0x7CA8, 0xDAE9,\n\t0x7CAF, 0xDF56, 0x7CB1, 0xB864, 0x7CB2, 0xDF54, 0x7CB3, 0xB865,\t0x7CB4, 0xDF55, 0x7CB5, 0xB866, 0x7CB9, 0xBAE9, 0x7CBA, 0xE361,\n\t0x7CBB, 0xE35E, 0x7CBC, 0xE360, 0x7CBD, 0xBAEA, 0x7CBE, 0xBAEB,\t0x7CBF, 0xE35F, 0x7CC5, 0xE6DF, 0x7CC8, 0xE6E0, 0x7CCA, 0xBD6B,\n\t0x7CCB, 0xE6E2, 0x7CCC, 0xE6E1, 0x7CCE, 0xA261, 0x7CD0, 0xEACA,\t0x7CD1, 0xEACB, 0x7CD2, 0xEAC7, 0x7CD4, 0xEAC8, 0x7CD5, 0xBF7C,\n\t0x7CD6, 0xBF7D, 0x7CD7, 0xEAC9, 0x7CD9, 0xC157, 0x7CDC, 0xC153,\t0x7CDD, 0xC158, 0x7CDE, 0xC154, 0x7CDF, 0xC156, 0x7CE0, 0xC152,\n\t0x7CE2, 0xC155, 0x7CE7, 0xC2B3, 0x7CE8, 0xEDCF, 0x7CEA, 0xF2AE,\t0x7CEC, 0xF2AD, 0x7CEE, 0xF4AB, 0x7CEF, 0xC47A, 0x7CF0, 0xC47B,\n\t0x7CF1, 0xF741, 0x7CF2, 0xF5E6, 0x7CF4, 0xF740, 0x7CF6, 0xF8FD,\t0x7CF7, 0xF9A4, 0x7CF8, 0xA6CD, 0x7CFB, 0xA874, 0x7CFD, 0xCDA9,\n\t0x7CFE, 0xAAC8, 0x7D00, 0xACF6, 0x7D01, 0xD04C, 0x7D02, 0xACF4,\t0x7D03, 0xD04A, 0x7D04, 0xACF9, 0x7D05, 0xACF5, 0x7D06, 0xACFA,\n\t0x7D07, 0xACF8, 0x7D08, 0xD04B, 0x7D09, 0xACF7, 0x7D0A, 0xAFBF,\t0x7D0B, 0xAFBE, 0x7D0C, 0xD35A, 0x7D0D, 0xAFC7, 0x7D0E, 0xD353,\n\t0x7D0F, 0xD359, 0x7D10, 0xAFC3, 0x7D11, 0xD352, 0x7D12, 0xD358,\t0x7D13, 0xD356, 0x7D14, 0xAFC2, 0x7D15, 0xAFC4, 0x7D16, 0xD355,\n\t0x7D17, 0xAFBD, 0x7D18, 0xD354, 0x7D19, 0xAFC8, 0x7D1A, 0xAFC5,\t0x7D1B, 0xAFC9, 0x7D1C, 0xAFC6, 0x7D1D, 0xD351, 0x7D1E, 0xD350,\n\t0x7D1F, 0xD357, 0x7D20, 0xAFC0, 0x7D21, 0xAFBC, 0x7D22, 0xAFC1,\t0x7D28, 0xD6F0, 0x7D29, 0xD6E9, 0x7D2B, 0xB5B5, 0x7D2C, 0xD6E8,\n\t0x7D2E, 0xB2CF, 0x7D2F, 0xB2D6, 0x7D30, 0xB2D3, 0x7D31, 0xB2D9,\t0x7D32, 0xB2D8, 0x7D33, 0xB2D4, 0x7D35, 0xD6E2, 0x7D36, 0xD6E5,\n\t0x7D38, 0xD6E4, 0x7D39, 0xB2D0, 0x7D3A, 0xD6E6, 0x7D3B, 0xD6EF,\t0x7D3C, 0xB2D1, 0x7D3D, 0xD6E3, 0x7D3E, 0xD6EC, 0x7D3F, 0xD6ED,\n\t0x7D40, 0xB2D2, 0x7D41, 0xD6EA, 0x7D42, 0xB2D7, 0x7D43, 0xB2CD,\t0x7D44, 0xB2D5, 0x7D45, 0xD6E7, 0x7D46, 0xB2CC, 0x7D47, 0xD6EB,\n\t0x7D4A, 0xD6EE, 0x7D4E, 0xDAFB, 0x7D4F, 0xDAF2, 0x7D50, 0xB5B2,\t0x7D51, 0xDAF9, 0x7D52, 0xDAF6, 0x7D53, 0xDAEE, 0x7D54, 0xDAF7,\n\t0x7D55, 0xB5B4, 0x7D56, 0xDAEF, 0x7D58, 0xDAEB, 0x7D5B, 0xB86C,\t0x7D5C, 0xDAF4, 0x7D5E, 0xB5B1, 0x7D5F, 0xDAFA, 0x7D61, 0xB5B8,\n\t0x7D62, 0xB5BA, 0x7D63, 0xDAED, 0x7D66, 0xB5B9, 0x7D67, 0xDAF0,\t0x7D68, 0xB5B3, 0x7D69, 0xDAF8, 0x7D6A, 0xDAF1, 0x7D6B, 0xDAF5,\n\t0x7D6D, 0xDAF3, 0x7D6E, 0xB5B6, 0x7D6F, 0xDAEC, 0x7D70, 0xB5BB,\t0x7D71, 0xB2CE, 0x7D72, 0xB5B7, 0x7D73, 0xB5BC, 0x7D79, 0xB868,\n\t0x7D7A, 0xDF5D, 0x7D7B, 0xDF5F, 0x7D7C, 0xDF61, 0x7D7D, 0xDF65,\t0x7D7F, 0xDF5B, 0x7D80, 0xDF59, 0x7D81, 0xB86A, 0x7D83, 0xDF60,\n\t0x7D84, 0xDF64, 0x7D85, 0xDF5C, 0x7D86, 0xDF58, 0x7D88, 0xDF57,\t0x7D8C, 0xDF62, 0x7D8D, 0xDF5A, 0x7D8E, 0xDF5E, 0x7D8F, 0xB86B,\n\t0x7D91, 0xB869, 0x7D92, 0xDF66, 0x7D93, 0xB867, 0x7D94, 0xDF63,\t0x7D96, 0xE372, 0x7D9C, 0xBAEE, 0x7D9D, 0xE36A, 0x7D9E, 0xBD78,\n\t0x7D9F, 0xE374, 0x7DA0, 0xBAF1, 0x7DA1, 0xE378, 0x7DA2, 0xBAF7,\t0x7DA3, 0xE365, 0x7DA6, 0xE375, 0x7DA7, 0xE362, 0x7DA9, 0xE377,\n\t0x7DAA, 0xE366, 0x7DAC, 0xBAFE, 0x7DAD, 0xBAFB, 0x7DAE, 0xE376,\t0x7DAF, 0xE370, 0x7DB0, 0xBAED, 0x7DB1, 0xBAF5, 0x7DB2, 0xBAF4,\n\t0x7DB4, 0xBAF3, 0x7DB5, 0xBAF9, 0x7DB7, 0xE363, 0x7DB8, 0xBAFA,\t0x7DB9, 0xE371, 0x7DBA, 0xBAF6, 0x7DBB, 0xBAEC, 0x7DBC, 0xE373,\n\t0x7DBD, 0xBAEF, 0x7DBE, 0xBAF0, 0x7DBF, 0xBAF8, 0x7DC0, 0xE368,\t0x7DC1, 0xE367, 0x7DC2, 0xE364, 0x7DC4, 0xE36C, 0x7DC5, 0xE369,\n\t0x7DC6, 0xE36D, 0x7DC7, 0xBAFD, 0x7DC9, 0xE379, 0x7DCA, 0xBAF2,\t0x7DCB, 0xE36E, 0x7DCC, 0xE36F, 0x7DCE, 0xE36B, 0x7DD2, 0xBAFC,\n\t0x7DD7, 0xE6E7, 0x7DD8, 0xBD70, 0x7DD9, 0xBD79, 0x7DDA, 0xBD75,\t0x7DDB, 0xE6E4, 0x7DDD, 0xBD72, 0x7DDE, 0xBD76, 0x7DDF, 0xE6F0,\n\t0x7DE0, 0xBD6C, 0x7DE1, 0xE6E8, 0x7DE3, 0xBD74, 0x7DE6, 0xE6EB,\t0x7DE7, 0xE6E6, 0x7DE8, 0xBD73, 0x7DE9, 0xBD77, 0x7DEA, 0xE6E5,\n\t0x7DEC, 0xBD71, 0x7DEE, 0xE6EF, 0x7DEF, 0xBD6E, 0x7DF0, 0xE6EE,\t0x7DF1, 0xE6ED, 0x7DF2, 0xBD7A, 0x7DF3, 0xE572, 0x7DF4, 0xBD6D,\n\t0x7DF6, 0xE6EC, 0x7DF7, 0xE6E3, 0x7DF9, 0xBD7B, 0x7DFA, 0xE6EA,\t0x7DFB, 0xBD6F, 0x7E03, 0xE6E9, 0x7E08, 0xBFA2, 0x7E09, 0xBFA7,\n\t0x7E0A, 0xBF7E, 0x7E0B, 0xEAD8, 0x7E0C, 0xEACF, 0x7E0D, 0xEADB,\t0x7E0E, 0xEAD3, 0x7E0F, 0xEAD9, 0x7E10, 0xBFA8, 0x7E11, 0xBFA1,\n\t0x7E12, 0xEACC, 0x7E13, 0xEAD2, 0x7E14, 0xEADC, 0x7E15, 0xEAD5,\t0x7E16, 0xEADA, 0x7E17, 0xEACE, 0x7E1A, 0xEAD6, 0x7E1B, 0xBFA3,\n\t0x7E1C, 0xEAD4, 0x7E1D, 0xBFA6, 0x7E1E, 0xBFA5, 0x7E1F, 0xEAD0,\t0x7E20, 0xEAD1, 0x7E21, 0xEACD, 0x7E22, 0xEAD7, 0x7E23, 0xBFA4,\n\t0x7E24, 0xEADE, 0x7E25, 0xEADD, 0x7E29, 0xEDDA, 0x7E2A, 0xEDD6,\t0x7E2B, 0xC15F, 0x7E2D, 0xEDD0, 0x7E2E, 0xC159, 0x7E2F, 0xC169,\n\t0x7E30, 0xEDDC, 0x7E31, 0xC161, 0x7E32, 0xC15D, 0x7E33, 0xEDD3,\t0x7E34, 0xC164, 0x7E35, 0xC167, 0x7E36, 0xEDDE, 0x7E37, 0xC15C,\n\t0x7E38, 0xEDD5, 0x7E39, 0xC165, 0x7E3A, 0xEDE0, 0x7E3B, 0xEDDD,\t0x7E3C, 0xEDD1, 0x7E3D, 0xC160, 0x7E3E, 0xC15A, 0x7E3F, 0xC168,\n\t0x7E40, 0xEDD8, 0x7E41, 0xC163, 0x7E42, 0xEDD2, 0x7E43, 0xC15E,\t0x7E44, 0xEDDF, 0x7E45, 0xC162, 0x7E46, 0xC15B, 0x7E47, 0xEDD9,\n\t0x7E48, 0xC166, 0x7E49, 0xEDD7, 0x7E4C, 0xEDDB, 0x7E50, 0xF06E,\t0x7E51, 0xF074, 0x7E52, 0xC2B9, 0x7E53, 0xF077, 0x7E54, 0xC2B4,\n\t0x7E55, 0xC2B5, 0x7E56, 0xF06F, 0x7E57, 0xF076, 0x7E58, 0xF071,\t0x7E59, 0xC2BA, 0x7E5A, 0xC2B7, 0x7E5C, 0xF06D, 0x7E5E, 0xC2B6,\n\t0x7E5F, 0xF073, 0x7E60, 0xF075, 0x7E61, 0xC2B8, 0x7E62, 0xF072,\t0x7E63, 0xF070, 0x7E68, 0xF2B8, 0x7E69, 0xC3B7, 0x7E6A, 0xC3B8,\n\t0x7E6B, 0xC3B4, 0x7E6D, 0xC3B5, 0x7E6F, 0xF2B4, 0x7E70, 0xF2B2,\t0x7E72, 0xF2B6, 0x7E73, 0xC3BA, 0x7E74, 0xF2B7, 0x7E75, 0xF2B0,\n\t0x7E76, 0xF2AF, 0x7E77, 0xF2B3, 0x7E78, 0xF2B1, 0x7E79, 0xC3B6,\t0x7E7A, 0xF2B5, 0x7E7B, 0xF4AC, 0x7E7C, 0xC47E, 0x7E7D, 0xC47D,\n\t0x7E7E, 0xF4AD, 0x7E80, 0xF4AF, 0x7E81, 0xF4AE, 0x7E82, 0xC4A1,\t0x7E86, 0xF5EB, 0x7E87, 0xF5E8, 0x7E88, 0xF5E9, 0x7E8A, 0xF5E7,\n\t0x7E8B, 0xF5EA, 0x7E8C, 0xC4F2, 0x7E8D, 0xF5EC, 0x7E8F, 0xC4F1,\t0x7E91, 0xF742, 0x7E93, 0xC5D5, 0x7E94, 0xC5D7, 0x7E95, 0xF7EE,\n\t0x7E96, 0xC5D6, 0x7E97, 0xF8B9, 0x7E98, 0xF940, 0x7E99, 0xF942,\t0x7E9A, 0xF8FE, 0x7E9B, 0xF941, 0x7E9C, 0xC66C, 0x7F36, 0xA6CE,\n\t0x7F38, 0xACFB, 0x7F39, 0xD26F, 0x7F3A, 0xAFCA, 0x7F3D, 0xB2DA,\t0x7F3E, 0xDAFC, 0x7F3F, 0xDAFD, 0x7F43, 0xEADF, 0x7F44, 0xC16A,\n\t0x7F45, 0xEDE1, 0x7F48, 0xC2BB, 0x7F4A, 0xF2BA, 0x7F4B, 0xF2B9,\t0x7F4C, 0xC4A2, 0x7F4D, 0xF5ED, 0x7F4F, 0xF743, 0x7F50, 0xC5F8,\n\t0x7F51, 0xCA49, 0x7F54, 0xAAC9, 0x7F55, 0xA875, 0x7F58, 0xD04D,\t0x7F5B, 0xD360, 0x7F5C, 0xD35B, 0x7F5D, 0xD35F, 0x7F5E, 0xD35D,\n\t0x7F5F, 0xAFCB, 0x7F60, 0xD35E, 0x7F61, 0xD35C, 0x7F63, 0xD6F1,\t0x7F65, 0xDAFE, 0x7F66, 0xDB40, 0x7F67, 0xDF69, 0x7F68, 0xDF6A,\n\t0x7F69, 0xB86E, 0x7F6A, 0xB86F, 0x7F6B, 0xDF68, 0x7F6C, 0xDF6B,\t0x7F6D, 0xDF67, 0x7F6E, 0xB86D, 0x7F70, 0xBB40, 0x7F72, 0xB870,\n\t0x7F73, 0xE37A, 0x7F75, 0xBD7C, 0x7F76, 0xE6F1, 0x7F77, 0xBD7D,\t0x7F79, 0xBFA9, 0x7F7A, 0xEAE2, 0x7F7B, 0xEAE0, 0x7F7C, 0xEAE1,\n\t0x7F7D, 0xEDE4, 0x7F7E, 0xEDE3, 0x7F7F, 0xEDE2, 0x7F83, 0xF2BB,\t0x7F85, 0xC3B9, 0x7F86, 0xF2BC, 0x7F87, 0xF744, 0x7F88, 0xC5F9,\n\t0x7F89, 0xF8BA, 0x7F8A, 0xA6CF, 0x7F8B, 0xAACB, 0x7F8C, 0xAACA,\t0x7F8D, 0xD04F, 0x7F8E, 0xACFC, 0x7F91, 0xD04E, 0x7F92, 0xD362,\n\t0x7F94, 0xAFCC, 0x7F95, 0xD6F2, 0x7F96, 0xD361, 0x7F9A, 0xB2DC,\t0x7F9B, 0xD6F5, 0x7F9C, 0xD6F3, 0x7F9D, 0xD6F4, 0x7F9E, 0xB2DB,\n\t0x7FA0, 0xDB42, 0x7FA1, 0xDB43, 0x7FA2, 0xDB41, 0x7FA4, 0xB873,\t0x7FA5, 0xDF6D, 0x7FA6, 0xDF6C, 0x7FA7, 0xDF6E, 0x7FA8, 0xB872,\n\t0x7FA9, 0xB871, 0x7FAC, 0xE6F2, 0x7FAD, 0xE6F4, 0x7FAF, 0xBD7E,\t0x7FB0, 0xE6F3, 0x7FB1, 0xEAE3, 0x7FB2, 0xBFAA, 0x7FB3, 0xF079,\n\t0x7FB5, 0xF078, 0x7FB6, 0xC3BB, 0x7FB7, 0xF2BD, 0x7FB8, 0xC3BD,\t0x7FB9, 0xC3BC, 0x7FBA, 0xF4B0, 0x7FBB, 0xF5EE, 0x7FBC, 0xC4F3,\n\t0x7FBD, 0xA6D0, 0x7FBE, 0xD050, 0x7FBF, 0xACFD, 0x7FC0, 0xD365,\t0x7FC1, 0xAFCE, 0x7FC2, 0xD364, 0x7FC3, 0xD363, 0x7FC5, 0xAFCD,\n\t0x7FC7, 0xD6FB, 0x7FC9, 0xD6FD, 0x7FCA, 0xD6F6, 0x7FCB, 0xD6F7,\t0x7FCC, 0xB2DD, 0x7FCD, 0xD6F8, 0x7FCE, 0xB2DE, 0x7FCF, 0xD6FC,\n\t0x7FD0, 0xD6F9, 0x7FD1, 0xD6FA, 0x7FD2, 0xB2DF, 0x7FD4, 0xB5BE,\t0x7FD5, 0xB5BF, 0x7FD7, 0xDB44, 0x7FDB, 0xDF6F, 0x7FDC, 0xDF70,\n\t0x7FDE, 0xE37E, 0x7FDF, 0xBB43, 0x7FE0, 0xBB41, 0x7FE1, 0xBB42,\t0x7FE2, 0xE37B, 0x7FE3, 0xE37C, 0x7FE5, 0xE37D, 0x7FE6, 0xE6F9,\n\t0x7FE8, 0xE6FA, 0x7FE9, 0xBDA1, 0x7FEA, 0xE6F7, 0x7FEB, 0xE6F6,\t0x7FEC, 0xE6F8, 0x7FED, 0xE6F5, 0x7FEE, 0xBFAD, 0x7FEF, 0xEAE4,\n\t0x7FF0, 0xBFAB, 0x7FF1, 0xBFAC, 0x7FF2, 0xEDE6, 0x7FF3, 0xC16B,\t0x7FF4, 0xEDE5, 0x7FF5, 0xEFA8, 0x7FF7, 0xF07A, 0x7FF8, 0xF07B,\n\t0x7FF9, 0xC2BC, 0x7FFB, 0xC2BD, 0x7FFC, 0xC16C, 0x7FFD, 0xF2BE,\t0x7FFE, 0xF2BF, 0x7FFF, 0xF4B1, 0x8000, 0xC4A3, 0x8001, 0xA6D1,\n\t0x8003, 0xA6D2, 0x8004, 0xACFE, 0x8005, 0xAACC, 0x8006, 0xAFCF,\t0x8007, 0xD051, 0x800B, 0xB5C0, 0x800C, 0xA6D3, 0x800D, 0xAD41,\n\t0x800E, 0xD052, 0x800F, 0xD053, 0x8010, 0xAD40, 0x8011, 0xAD42,\t0x8012, 0xA6D4, 0x8014, 0xD054, 0x8015, 0xAFD1, 0x8016, 0xD366,\n\t0x8017, 0xAFD3, 0x8018, 0xAFD0, 0x8019, 0xAFD2, 0x801B, 0xD741,\t0x801C, 0xB2E0, 0x801E, 0xD740, 0x801F, 0xD6FE, 0x8021, 0xDF71,\n\t0x8024, 0xE3A1, 0x8026, 0xBDA2, 0x8028, 0xBFAE, 0x8029, 0xEAE6,\t0x802A, 0xEAE5, 0x802C, 0xEDE7, 0x8030, 0xF5EF, 0x8033, 0xA6D5,\n\t0x8034, 0xCB73, 0x8035, 0xCDAA, 0x8036, 0xAD43, 0x8037, 0xD055,\t0x8039, 0xD368, 0x803D, 0xAFD4, 0x803E, 0xD367, 0x803F, 0xAFD5,\n\t0x8043, 0xD743, 0x8046, 0xB2E2, 0x8047, 0xD742, 0x8048, 0xD744,\t0x804A, 0xB2E1, 0x804F, 0xDB46, 0x8050, 0xDB47, 0x8051, 0xDB45,\n\t0x8052, 0xB5C1, 0x8056, 0xB874, 0x8058, 0xB875, 0x805A, 0xBB45,\t0x805C, 0xE3A3, 0x805D, 0xE3A2, 0x805E, 0xBB44, 0x8064, 0xE6FB,\n\t0x8067, 0xE6FC, 0x806C, 0xEAE7, 0x806F, 0xC170, 0x8070, 0xC16F,\t0x8071, 0xC16D, 0x8072, 0xC16E, 0x8073, 0xC171, 0x8075, 0xF07C,\n\t0x8076, 0xC2BF, 0x8077, 0xC2BE, 0x8078, 0xF2C0, 0x8079, 0xF4B2,\t0x807D, 0xC5A5, 0x807E, 0xC5A4, 0x807F, 0xA6D6, 0x8082, 0xD1FB,\n\t0x8084, 0xB877, 0x8085, 0xB5C2, 0x8086, 0xB876, 0x8087, 0xBB46,\t0x8089, 0xA6D7, 0x808A, 0xC9A9, 0x808B, 0xA6D8, 0x808C, 0xA6D9,\n\t0x808F, 0xCDAB, 0x8090, 0xCB76, 0x8092, 0xCB77, 0x8093, 0xA877,\t0x8095, 0xCB74, 0x8096, 0xA876, 0x8098, 0xA879, 0x8099, 0xCB75,\n\t0x809A, 0xA87B, 0x809B, 0xA87A, 0x809C, 0xCB78, 0x809D, 0xA878,\t0x80A1, 0xAAD1, 0x80A2, 0xAACF, 0x80A3, 0xCDAD, 0x80A5, 0xAACE,\n\t0x80A9, 0xAAD3, 0x80AA, 0xAAD5, 0x80AB, 0xAAD2, 0x80AD, 0xCDB0,\t0x80AE, 0xCDAC, 0x80AF, 0xAAD6, 0x80B1, 0xAAD0, 0x80B2, 0xA87C,\n\t0x80B4, 0xAAD4, 0x80B5, 0xCDAF, 0x80B8, 0xCDAE, 0x80BA, 0xAACD,\t0x80C2, 0xD05B, 0x80C3, 0xAD47, 0x80C4, 0xAD48, 0x80C5, 0xD05D,\n\t0x80C7, 0xD057, 0x80C8, 0xD05A, 0x80C9, 0xD063, 0x80CA, 0xD061,\t0x80CC, 0xAD49, 0x80CD, 0xD067, 0x80CE, 0xAD4C, 0x80CF, 0xD064,\n\t0x80D0, 0xD05C, 0x80D1, 0xD059, 0x80D4, 0xDB49, 0x80D5, 0xD062,\t0x80D6, 0xAD44, 0x80D7, 0xD065, 0x80D8, 0xD056, 0x80D9, 0xD05F,\n\t0x80DA, 0xAD46, 0x80DB, 0xAD4B, 0x80DC, 0xD060, 0x80DD, 0xAD4F,\t0x80DE, 0xAD4D, 0x80E0, 0xD058, 0x80E1, 0xAD4A, 0x80E3, 0xD05E,\n\t0x80E4, 0xAD4E, 0x80E5, 0xAD45, 0x80E6, 0xD066, 0x80ED, 0xAFDA,\t0x80EF, 0xAFE3, 0x80F0, 0xAFD8, 0x80F1, 0xAFD6, 0x80F2, 0xD36A,\n\t0x80F3, 0xAFDE, 0x80F4, 0xAFDB, 0x80F5, 0xD36C, 0x80F8, 0xAFDD,\t0x80F9, 0xD36B, 0x80FA, 0xD369, 0x80FB, 0xD36E, 0x80FC, 0xAFE2,\n\t0x80FD, 0xAFE0, 0x80FE, 0xDB48, 0x8100, 0xD36F, 0x8101, 0xD36D,\t0x8102, 0xAFD7, 0x8105, 0xAFD9, 0x8106, 0xAFDC, 0x8108, 0xAFDF,\n\t0x810A, 0xAFE1, 0x8115, 0xD74E, 0x8116, 0xB2E4, 0x8118, 0xD745,\t0x8119, 0xD747, 0x811B, 0xD748, 0x811D, 0xD750, 0x811E, 0xD74C,\n\t0x811F, 0xD74A, 0x8121, 0xD74D, 0x8122, 0xD751, 0x8123, 0xB2E5,\t0x8124, 0xB2E9, 0x8125, 0xD746, 0x8127, 0xD74F, 0x8129, 0xB2E7,\n\t0x812B, 0xB2E6, 0x812C, 0xD74B, 0x812D, 0xD749, 0x812F, 0xB2E3,\t0x8130, 0xB2E8, 0x8139, 0xB5C8, 0x813A, 0xDB51, 0x813D, 0xDB4F,\n\t0x813E, 0xB5CA, 0x8143, 0xDB4A, 0x8144, 0xDFA1, 0x8146, 0xB5C9,\t0x8147, 0xDB4E, 0x814A, 0xDB4B, 0x814B, 0xB5C5, 0x814C, 0xB5CB,\n\t0x814D, 0xDB50, 0x814E, 0xB5C7, 0x814F, 0xDB4D, 0x8150, 0xBB47,\t0x8151, 0xB5C6, 0x8152, 0xDB4C, 0x8153, 0xB5CC, 0x8154, 0xB5C4,\n\t0x8155, 0xB5C3, 0x815B, 0xDF77, 0x815C, 0xDF75, 0x815E, 0xDF7B,\t0x8160, 0xDF73, 0x8161, 0xDFA2, 0x8162, 0xDF78, 0x8164, 0xDF72,\n\t0x8165, 0xB87B, 0x8166, 0xB8A3, 0x8167, 0xDF7D, 0x8169, 0xDF76,\t0x816B, 0xB87E, 0x816E, 0xB87C, 0x816F, 0xDF7E, 0x8170, 0xB879,\n\t0x8171, 0xB878, 0x8172, 0xDF79, 0x8173, 0xB87D, 0x8174, 0xB5CD,\t0x8176, 0xDF7C, 0x8177, 0xDF74, 0x8178, 0xB87A, 0x8179, 0xB8A1,\n\t0x817A, 0xB8A2, 0x817F, 0xBB4C, 0x8180, 0xBB48, 0x8182, 0xBB4D,\t0x8183, 0xE3A6, 0x8186, 0xE3A5, 0x8187, 0xE3A7, 0x8188, 0xBB4A,\n\t0x8189, 0xE3A4, 0x818A, 0xBB4B, 0x818B, 0xE3AA, 0x818C, 0xE3A9,\t0x818D, 0xE3A8, 0x818F, 0xBB49, 0x8195, 0xE741, 0x8197, 0xE744,\n\t0x8198, 0xBDA8, 0x8199, 0xE743, 0x819A, 0xBDA7, 0x819B, 0xBDA3,\t0x819C, 0xBDA4, 0x819D, 0xBDA5, 0x819E, 0xE740, 0x819F, 0xE6FE,\n\t0x81A0, 0xBDA6, 0x81A2, 0xE742, 0x81A3, 0xE6FD, 0x81A6, 0xEAE9,\t0x81A7, 0xEAF3, 0x81A8, 0xBFB1, 0x81A9, 0xBFB0, 0x81AB, 0xEAED,\n\t0x81AC, 0xEAEF, 0x81AE, 0xEAEA, 0x81B0, 0xEAEE, 0x81B1, 0xEAE8,\t0x81B2, 0xEAF1, 0x81B3, 0xBFAF, 0x81B4, 0xEAF0, 0x81B5, 0xEAEC,\n\t0x81B7, 0xEAF2, 0x81B9, 0xEAEB, 0x81BA, 0xC174, 0x81BB, 0xEDE8,\t0x81BC, 0xEDEE, 0x81BD, 0xC178, 0x81BE, 0xC17A, 0x81BF, 0xC177,\n\t0x81C0, 0xC176, 0x81C2, 0xC175, 0x81C3, 0xC173, 0x81C4, 0xEDE9,\t0x81C5, 0xEDEC, 0x81C6, 0xC172, 0x81C7, 0xEDED, 0x81C9, 0xC179,\n\t0x81CA, 0xEDEB, 0x81CC, 0xEDEA, 0x81CD, 0xC2C0, 0x81CF, 0xC2C1,\t0x81D0, 0xF0A1, 0x81D1, 0xF07D, 0x81D2, 0xF07E, 0x81D5, 0xF2C2,\n\t0x81D7, 0xF2C1, 0x81D8, 0xC3BE, 0x81D9, 0xF4B4, 0x81DA, 0xC4A4,\t0x81DB, 0xF4B3, 0x81DD, 0xF5F0, 0x81DE, 0xF745, 0x81DF, 0xC5A6,\n\t0x81E0, 0xF943, 0x81E1, 0xF944, 0x81E2, 0xC5D8, 0x81E3, 0xA6DA,\t0x81E5, 0xAAD7, 0x81E6, 0xDB52, 0x81E7, 0xBB4E, 0x81E8, 0xC17B,\n\t0x81E9, 0xEDEF, 0x81EA, 0xA6DB, 0x81EC, 0xAFE5, 0x81ED, 0xAFE4,\t0x81EE, 0xDB53, 0x81F2, 0xEAF4, 0x81F3, 0xA6DC, 0x81F4, 0xAD50,\n\t0x81F7, 0xDB54, 0x81F8, 0xDB55, 0x81F9, 0xDB56, 0x81FA, 0xBB4F,\t0x81FB, 0xBFB2, 0x81FC, 0xA6DD, 0x81FE, 0xAAD8, 0x81FF, 0xD068,\n\t0x8200, 0xAFE6, 0x8201, 0xD370, 0x8202, 0xB2EA, 0x8204, 0xDB57,\t0x8205, 0xB8A4, 0x8207, 0xBB50, 0x8208, 0xBFB3, 0x8209, 0xC17C,\n\t0x820A, 0xC2C2, 0x820B, 0xF4B5, 0x820C, 0xA6DE, 0x820D, 0xAAD9,\t0x8210, 0xAFE7, 0x8211, 0xD752, 0x8212, 0xB5CE, 0x8214, 0xBB51,\n\t0x8215, 0xE3AB, 0x8216, 0xE745, 0x821B, 0xA6DF, 0x821C, 0xB5CF,\t0x821D, 0xDFA3, 0x821E, 0xBB52, 0x821F, 0xA6E0, 0x8220, 0xCDB1,\n\t0x8221, 0xD069, 0x8222, 0xAD51, 0x8225, 0xD372, 0x8228, 0xAFEA,\t0x822A, 0xAFE8, 0x822B, 0xAFE9, 0x822C, 0xAFEB, 0x822F, 0xD371,\n\t0x8232, 0xD757, 0x8233, 0xD754, 0x8234, 0xD756, 0x8235, 0xB2EB,\t0x8236, 0xB2ED, 0x8237, 0xB2EC, 0x8238, 0xD753, 0x8239, 0xB2EE,\n\t0x823A, 0xD755, 0x823C, 0xDB58, 0x823D, 0xDB59, 0x823F, 0xDB5A,\t0x8240, 0xDFA6, 0x8242, 0xDFA7, 0x8244, 0xDFA5, 0x8245, 0xDFA8,\n\t0x8247, 0xB8A5, 0x8249, 0xDFA4, 0x824B, 0xBB53, 0x824E, 0xE74A,\t0x824F, 0xE746, 0x8250, 0xE749, 0x8251, 0xE74B, 0x8252, 0xE748,\n\t0x8253, 0xE747, 0x8255, 0xEAF5, 0x8256, 0xEAF6, 0x8257, 0xEAF7,\t0x8258, 0xBFB4, 0x8259, 0xBFB5, 0x825A, 0xEDF1, 0x825B, 0xEDF0,\n\t0x825C, 0xEDF2, 0x825E, 0xF0A3, 0x825F, 0xF0A2, 0x8261, 0xF2C4,\t0x8263, 0xF2C5, 0x8264, 0xF2C3, 0x8266, 0xC4A5, 0x8268, 0xF4B6,\n\t0x8269, 0xF4B7, 0x826B, 0xF746, 0x826C, 0xF7EF, 0x826D, 0xF8BB,\t0x826E, 0xA6E1, 0x826F, 0xA87D, 0x8271, 0xC17D, 0x8272, 0xA6E2,\n\t0x8274, 0xD758, 0x8275, 0xDB5B, 0x8277, 0xC641, 0x8278, 0xCA4A,\t0x827C, 0xCA4B, 0x827D, 0xCA4D, 0x827E, 0xA6E3, 0x827F, 0xCA4E,\n\t0x8280, 0xCA4C, 0x8283, 0xCBA2, 0x8284, 0xCBA3, 0x8285, 0xCB7B,\t0x828A, 0xCBA1, 0x828B, 0xA8A1, 0x828D, 0xA8A2, 0x828E, 0xCB7C,\n\t0x828F, 0xCB7A, 0x8290, 0xCB79, 0x8291, 0xCB7D, 0x8292, 0xA87E,\t0x8293, 0xCB7E, 0x8294, 0xD06A, 0x8298, 0xCDB6, 0x8299, 0xAADC,\n\t0x829A, 0xCDB5, 0x829B, 0xCDB7, 0x829D, 0xAADB, 0x829E, 0xCDBC,\t0x829F, 0xAADF, 0x82A0, 0xCDB2, 0x82A1, 0xCDC0, 0x82A2, 0xCDC6,\n\t0x82A3, 0xAAE6, 0x82A4, 0xCDC3, 0x82A5, 0xAAE3, 0x82A7, 0xCDB9,\t0x82A8, 0xCDBF, 0x82A9, 0xCDC1, 0x82AB, 0xCDB4, 0x82AC, 0xAAE2,\n\t0x82AD, 0xAADD, 0x82AE, 0xCDBA, 0x82AF, 0xAAE4, 0x82B0, 0xAAE7,\t0x82B1, 0xAAE1, 0x82B3, 0xAADA, 0x82B4, 0xCDBE, 0x82B5, 0xCDB8,\n\t0x82B6, 0xCDC5, 0x82B7, 0xAAE9, 0x82B8, 0xAAE5, 0x82B9, 0xAAE0,\t0x82BA, 0xCDBD, 0x82BB, 0xAFEC, 0x82BC, 0xCDBB, 0x82BD, 0xAADE,\n\t0x82BE, 0xAAE8, 0x82C0, 0xCDB3, 0x82C2, 0xCDC2, 0x82C3, 0xCDC4,\t0x82D1, 0xAD62, 0x82D2, 0xAD5C, 0x82D3, 0xAD64, 0x82D4, 0xAD61,\n\t0x82D5, 0xD071, 0x82D6, 0xD074, 0x82D7, 0xAD5D, 0x82D9, 0xD06B,\t0x82DB, 0xAD56, 0x82DC, 0xAD60, 0x82DE, 0xAD63, 0x82DF, 0xAD65,\n\t0x82E0, 0xD0A2, 0x82E1, 0xD077, 0x82E3, 0xAD55, 0x82E4, 0xD0A1,\t0x82E5, 0xAD59, 0x82E6, 0xAD57, 0x82E7, 0xAD52, 0x82E8, 0xD06F,\n\t0x82EA, 0xD07E, 0x82EB, 0xD073, 0x82EC, 0xD076, 0x82ED, 0xD0A5,\t0x82EF, 0xAD66, 0x82F0, 0xD07D, 0x82F1, 0xAD5E, 0x82F2, 0xD078,\n\t0x82F3, 0xD0A4, 0x82F4, 0xD075, 0x82F5, 0xD079, 0x82F6, 0xD07C,\t0x82F9, 0xD06D, 0x82FA, 0xD0A3, 0x82FB, 0xD07B, 0x82FE, 0xD06C,\n\t0x8300, 0xD070, 0x8301, 0xAD5F, 0x8302, 0xAD5A, 0x8303, 0xAD53,\t0x8304, 0xAD58, 0x8305, 0xAD54, 0x8306, 0xAD67, 0x8307, 0xD06E,\n\t0x8308, 0xD3A5, 0x8309, 0xAD5B, 0x830C, 0xD07A, 0x830D, 0xCE41,\t0x8316, 0xD3A8, 0x8317, 0xAFFA, 0x8319, 0xD376, 0x831B, 0xD3A3,\n\t0x831C, 0xD37D, 0x831E, 0xD3B2, 0x8320, 0xD3AA, 0x8322, 0xD37E,\t0x8324, 0xD3A9, 0x8325, 0xD378, 0x8326, 0xD37C, 0x8327, 0xD3B5,\n\t0x8328, 0xAFFD, 0x8329, 0xD3AD, 0x832A, 0xD3A4, 0x832B, 0xAFED,\t0x832C, 0xD3B3, 0x832D, 0xD374, 0x832F, 0xD3AC, 0x8331, 0xAFFC,\n\t0x8332, 0xAFF7, 0x8333, 0xD373, 0x8334, 0xAFF5, 0x8335, 0xAFF4,\t0x8336, 0xAFF9, 0x8337, 0xD3AB, 0x8338, 0xAFF1, 0x8339, 0xAFF8,\n\t0x833A, 0xD072, 0x833B, 0xDB5C, 0x833C, 0xD3A6, 0x833F, 0xD37A,\t0x8340, 0xAFFB, 0x8341, 0xD37B, 0x8342, 0xD3A1, 0x8343, 0xAFFE,\n\t0x8344, 0xD375, 0x8345, 0xD3AF, 0x8347, 0xD3AE, 0x8348, 0xD3B6,\t0x8349, 0xAFF3, 0x834A, 0xAFF0, 0x834B, 0xD3B4, 0x834C, 0xD3B0,\n\t0x834D, 0xD3A7, 0x834E, 0xD3A2, 0x834F, 0xAFF6, 0x8350, 0xAFF2,\t0x8351, 0xD377, 0x8352, 0xAFEE, 0x8353, 0xD3B1, 0x8354, 0xAFEF,\n\t0x8356, 0xD379, 0x8373, 0xD75E, 0x8374, 0xD760, 0x8375, 0xD765,\t0x8376, 0xD779, 0x8377, 0xB2FC, 0x8378, 0xB2F2, 0x837A, 0xD75D,\n\t0x837B, 0xB2FD, 0x837C, 0xB2FE, 0x837D, 0xD768, 0x837E, 0xD76F,\t0x837F, 0xD775, 0x8381, 0xD762, 0x8383, 0xD769, 0x8386, 0xB340,\n\t0x8387, 0xD777, 0x8388, 0xD772, 0x8389, 0xB2FA, 0x838A, 0xB2F8,\t0x838B, 0xD76E, 0x838C, 0xD76A, 0x838D, 0xD75C, 0x838E, 0xB2EF,\n\t0x838F, 0xD761, 0x8390, 0xD759, 0x8392, 0xB2F7, 0x8393, 0xB2F9,\t0x8394, 0xD766, 0x8395, 0xD763, 0x8396, 0xB2F4, 0x8397, 0xD773,\n\t0x8398, 0xB2F1, 0x8399, 0xD764, 0x839A, 0xD77A, 0x839B, 0xD76C,\t0x839D, 0xD76B, 0x839E, 0xB2F0, 0x83A0, 0xB2FB, 0x83A2, 0xB2F3,\n\t0x83A3, 0xD75A, 0x83A4, 0xD75F, 0x83A5, 0xD770, 0x83A6, 0xD776,\t0x83A7, 0xB341, 0x83A8, 0xD75B, 0x83A9, 0xD767, 0x83AA, 0xD76D,\n\t0x83AB, 0xB2F6, 0x83AE, 0xD778, 0x83AF, 0xD771, 0x83B0, 0xD774,\t0x83BD, 0xB2F5, 0x83BF, 0xDB6C, 0x83C0, 0xDB60, 0x83C1, 0xB5D7,\n\t0x83C2, 0xDB7D, 0x83C3, 0xDBA7, 0x83C4, 0xDBAA, 0x83C5, 0xB5D5,\t0x83C6, 0xDB68, 0x83C7, 0xDBA3, 0x83C8, 0xDB69, 0x83C9, 0xDB77,\n\t0x83CA, 0xB5E2, 0x83CB, 0xDB73, 0x83CC, 0xB5DF, 0x83CE, 0xDB74,\t0x83CF, 0xDB5D, 0x83D1, 0xDBA4, 0x83D4, 0xB5E8, 0x83D5, 0xDBA1,\n\t0x83D6, 0xDB75, 0x83D7, 0xDBAC, 0x83D8, 0xDB70, 0x83D9, 0xDFC8,\t0x83DB, 0xDBAF, 0x83DC, 0xB5E6, 0x83DD, 0xDB6E, 0x83DE, 0xDB7A,\n\t0x83DF, 0xB5E9, 0x83E0, 0xB5D4, 0x83E1, 0xDB72, 0x83E2, 0xDBAD,\t0x83E3, 0xDB6B, 0x83E4, 0xDB64, 0x83E5, 0xDB6F, 0x83E7, 0xDB63,\n\t0x83E8, 0xDB61, 0x83E9, 0xB5D0, 0x83EA, 0xDBA5, 0x83EB, 0xDB6A,\t0x83EC, 0xDBA8, 0x83EE, 0xDBA9, 0x83EF, 0xB5D8, 0x83F0, 0xB5DD,\n\t0x83F1, 0xB5D9, 0x83F2, 0xB5E1, 0x83F3, 0xDB7E, 0x83F4, 0xB5DA,\t0x83F5, 0xDB76, 0x83F6, 0xDB66, 0x83F8, 0xB5D2, 0x83F9, 0xDB5E,\n\t0x83FA, 0xDBA2, 0x83FB, 0xDBAB, 0x83FC, 0xDB65, 0x83FD, 0xB5E0,\t0x83FE, 0xDBB0, 0x83FF, 0xDB71, 0x8401, 0xDB6D, 0x8403, 0xB5D1,\n\t0x8404, 0xB5E5, 0x8406, 0xDB7C, 0x8407, 0xB5E7, 0x8409, 0xDB78,\t0x840A, 0xB5DC, 0x840B, 0xB5D6, 0x840C, 0xB5DE, 0x840D, 0xB5D3,\n\t0x840E, 0xB5E4, 0x840F, 0xDB79, 0x8410, 0xDB67, 0x8411, 0xDB7B,\t0x8412, 0xDB62, 0x8413, 0xDBA6, 0x841B, 0xDBAE, 0x8423, 0xDB5F,\n\t0x8429, 0xDFC7, 0x842B, 0xDFDD, 0x842C, 0xB855, 0x842D, 0xDFCC,\t0x842F, 0xDFCA, 0x8430, 0xDFB5, 0x8431, 0xB8A9, 0x8432, 0xDFC5,\n\t0x8433, 0xDFD9, 0x8434, 0xDFC1, 0x8435, 0xB8B1, 0x8436, 0xDFD8,\t0x8437, 0xDFBF, 0x8438, 0xB5E3, 0x8439, 0xDFCF, 0x843A, 0xDFC0,\n\t0x843B, 0xDFD6, 0x843C, 0xB8B0, 0x843D, 0xB8A8, 0x843F, 0xDFAA,\t0x8440, 0xDFB2, 0x8442, 0xDFCB, 0x8443, 0xDFC3, 0x8444, 0xDFDC,\n\t0x8445, 0xDFC6, 0x8446, 0xB8B6, 0x8447, 0xDFD7, 0x8449, 0xB8AD,\t0x844B, 0xDFC9, 0x844C, 0xDFD1, 0x844D, 0xDFB6, 0x844E, 0xDFD0,\n\t0x8450, 0xDFE1, 0x8451, 0xDFB1, 0x8452, 0xDFD2, 0x8454, 0xDFDF,\t0x8456, 0xDFAB, 0x8457, 0xB5DB, 0x8459, 0xDFB9, 0x845A, 0xDFB8,\n\t0x845B, 0xB8AF, 0x845D, 0xDFBC, 0x845E, 0xDFBE, 0x845F, 0xDFCD,\t0x8460, 0xDFDE, 0x8461, 0xB8B2, 0x8463, 0xB8B3, 0x8465, 0xDFB0,\n\t0x8466, 0xB8AB, 0x8467, 0xDFB4, 0x8468, 0xDFDA, 0x8469, 0xB8B4,\t0x846B, 0xB8AC, 0x846C, 0xB8AE, 0x846D, 0xB8B5, 0x846E, 0xDFE0,\n\t0x846F, 0xDFD3, 0x8470, 0xDFCE, 0x8473, 0xDFBB, 0x8474, 0xDFBA,\t0x8475, 0xB8AA, 0x8476, 0xDFAC, 0x8477, 0xB8A7, 0x8478, 0xDFC4,\n\t0x8479, 0xDFAD, 0x847A, 0xDFC2, 0x847D, 0xDFB7, 0x847E, 0xDFDB,\t0x8482, 0xB8A6, 0x8486, 0xDFB3, 0x848D, 0xDFAF, 0x848E, 0xDFD5,\n\t0x848F, 0xDFAE, 0x8490, 0xBB60, 0x8491, 0xE3D3, 0x8494, 0xE3C2,\t0x8497, 0xE3AC, 0x8498, 0xE3CA, 0x8499, 0xBB58, 0x849A, 0xE3BB,\n\t0x849B, 0xE3C5, 0x849C, 0xBB5B, 0x849D, 0xE3BE, 0x849E, 0xBB59,\t0x849F, 0xE3AF, 0x84A0, 0xE3CD, 0x84A1, 0xE3AE, 0x84A2, 0xE3C1,\n\t0x84A4, 0xE3AD, 0x84A7, 0xE3BF, 0x84A8, 0xE3C8, 0x84A9, 0xE3C6,\t0x84AA, 0xE3BA, 0x84AB, 0xE3B5, 0x84AC, 0xE3B3, 0x84AE, 0xE3B4,\n\t0x84AF, 0xE3C7, 0x84B0, 0xE3D2, 0x84B1, 0xE3BC, 0x84B2, 0xBB5A,\t0x84B4, 0xE3B7, 0x84B6, 0xE3CB, 0x84B8, 0xBB5D, 0x84B9, 0xE3B6,\n\t0x84BA, 0xE3B0, 0x84BB, 0xE3C0, 0x84BC, 0xBB61, 0x84BF, 0xBB55,\t0x84C0, 0xBB5E, 0x84C1, 0xE3B8, 0x84C2, 0xE3B2, 0x84C4, 0xBB57,\n\t0x84C5, 0xDFD4, 0x84C6, 0xBB56, 0x84C7, 0xE3C3, 0x84C9, 0xBB54,\t0x84CA, 0xBB63, 0x84CB, 0xBB5C, 0x84CC, 0xE3C4, 0x84CD, 0xE3B9,\n\t0x84CE, 0xE3B1, 0x84CF, 0xE3CC, 0x84D0, 0xE3BD, 0x84D1, 0xBB62,\t0x84D2, 0xE3D0, 0x84D3, 0xBB5F, 0x84D4, 0xE3CF, 0x84D6, 0xE3C9,\n\t0x84D7, 0xE3CE, 0x84DB, 0xE3D1, 0x84E7, 0xE773, 0x84E8, 0xE774,\t0x84E9, 0xE767, 0x84EA, 0xE766, 0x84EB, 0xE762, 0x84EC, 0xBDB4,\n\t0x84EE, 0xBDAC, 0x84EF, 0xE776, 0x84F0, 0xE775, 0x84F1, 0xDFA9,\t0x84F2, 0xE75F, 0x84F3, 0xE763, 0x84F4, 0xE75D, 0x84F6, 0xE770,\n\t0x84F7, 0xE761, 0x84F9, 0xE777, 0x84FA, 0xE75A, 0x84FB, 0xE758,\t0x84FC, 0xE764, 0x84FD, 0xE76E, 0x84FE, 0xE769, 0x84FF, 0xBDB6,\n\t0x8500, 0xE74F, 0x8502, 0xE76D, 0x8506, 0xBDB7, 0x8507, 0xDFBD,\t0x8508, 0xE75B, 0x8509, 0xE752, 0x850A, 0xE755, 0x850B, 0xE77B,\n\t0x850C, 0xE75C, 0x850D, 0xE753, 0x850E, 0xE751, 0x850F, 0xE74E,\t0x8511, 0xBDB0, 0x8512, 0xE765, 0x8513, 0xBDAF, 0x8514, 0xBDB3,\n\t0x8515, 0xE760, 0x8516, 0xE768, 0x8517, 0xBDA9, 0x8518, 0xE778,\t0x8519, 0xE77C, 0x851A, 0xBDAB, 0x851C, 0xE757, 0x851D, 0xE76B,\n\t0x851E, 0xE76F, 0x851F, 0xE754, 0x8520, 0xE779, 0x8521, 0xBDB2,\t0x8523, 0xBDB1, 0x8524, 0xE74C, 0x8525, 0xBDB5, 0x8526, 0xE772,\n\t0x8527, 0xE756, 0x8528, 0xE76A, 0x8529, 0xE750, 0x852A, 0xE75E,\t0x852B, 0xE759, 0x852C, 0xBDAD, 0x852D, 0xBDAE, 0x852E, 0xE76C,\n\t0x852F, 0xE77D, 0x8530, 0xE77A, 0x8531, 0xE771, 0x853B, 0xE74D,\t0x853D, 0xBDAA, 0x853E, 0xEB49, 0x8540, 0xEB40, 0x8541, 0xEB43,\n\t0x8543, 0xBFBB, 0x8544, 0xEB45, 0x8545, 0xEAF9, 0x8546, 0xEB41,\t0x8547, 0xEB47, 0x8548, 0xBFB8, 0x8549, 0xBFBC, 0x854A, 0xBFB6,\n\t0x854D, 0xEAFB, 0x854E, 0xEB4C, 0x8551, 0xEB46, 0x8553, 0xEAFC,\t0x8554, 0xEB55, 0x8555, 0xEB4F, 0x8556, 0xEAF8, 0x8557, 0xEE46,\n\t0x8558, 0xEAFE, 0x8559, 0xBFB7, 0x855B, 0xEB4A, 0x855D, 0xEB54,\t0x855E, 0xBFBF, 0x8560, 0xEB51, 0x8561, 0xEAFD, 0x8562, 0xEB44,\n\t0x8563, 0xEB48, 0x8564, 0xEB42, 0x8565, 0xEB56, 0x8566, 0xEB53,\t0x8567, 0xEB50, 0x8568, 0xBFB9, 0x8569, 0xBFBA, 0x856A, 0xBFBE,\n\t0x856B, 0xEAFA, 0x856C, 0xEB57, 0x856D, 0xBFBD, 0x856E, 0xEB4D,\t0x8571, 0xEB4B, 0x8575, 0xEB4E, 0x8576, 0xEE53, 0x8577, 0xEE40,\n\t0x8578, 0xEE45, 0x8579, 0xEE52, 0x857A, 0xEE44, 0x857B, 0xEDFB,\t0x857C, 0xEE41, 0x857E, 0xC1A2, 0x8580, 0xEDF4, 0x8581, 0xEE4D,\n\t0x8582, 0xEE4F, 0x8583, 0xEDF3, 0x8584, 0xC1A1, 0x8585, 0xEE51,\t0x8586, 0xEE49, 0x8587, 0xC1A8, 0x8588, 0xEE50, 0x8589, 0xEE42,\n\t0x858A, 0xC1AA, 0x858B, 0xEDF9, 0x858C, 0xEB52, 0x858D, 0xEE4A,\t0x858E, 0xEE47, 0x858F, 0xEDF5, 0x8590, 0xEE55, 0x8591, 0xC1A4,\n\t0x8594, 0xC1A5, 0x8595, 0xEDF7, 0x8596, 0xEE48, 0x8598, 0xEE54,\t0x8599, 0xEE4B, 0x859A, 0xEDFD, 0x859B, 0xC1A7, 0x859C, 0xC1A3,\n\t0x859D, 0xEE4C, 0x859E, 0xEDFE, 0x859F, 0xEE56, 0x85A0, 0xEDF8,\t0x85A1, 0xEE43, 0x85A2, 0xEE4E, 0x85A3, 0xEDFA, 0x85A4, 0xEDFC,\n\t0x85A6, 0xC2CB, 0x85A7, 0xEDF6, 0x85A8, 0xC1A9, 0x85A9, 0xC2C4,\t0x85AA, 0xC17E, 0x85AF, 0xC1A6, 0x85B0, 0xC2C8, 0x85B1, 0xF0B3,\n\t0x85B3, 0xF0A9, 0x85B4, 0xF0A4, 0x85B5, 0xF0AA, 0x85B6, 0xF0B4,\t0x85B7, 0xF0B8, 0x85B8, 0xF0B7, 0x85B9, 0xC2CA, 0x85BA, 0xC2C9,\n\t0x85BD, 0xF0AB, 0x85BE, 0xF0B9, 0x85BF, 0xF0AE, 0x85C0, 0xF0A6,\t0x85C2, 0xF0A8, 0x85C3, 0xF0A7, 0x85C4, 0xF0AD, 0x85C5, 0xF0B2,\n\t0x85C6, 0xF0A5, 0x85C7, 0xF0AC, 0x85C8, 0xF0B1, 0x85C9, 0xC2C7,\t0x85CB, 0xF0AF, 0x85CD, 0xC2C5, 0x85CE, 0xF0B0, 0x85CF, 0xC2C3,\n\t0x85D0, 0xC2C6, 0x85D1, 0xF2D5, 0x85D2, 0xF0B5, 0x85D5, 0xC3C2,\t0x85D7, 0xF2CD, 0x85D8, 0xF2D1, 0x85D9, 0xF2C9, 0x85DA, 0xF2CC,\n\t0x85DC, 0xF2D4, 0x85DD, 0xC3C0, 0x85DE, 0xF2D9, 0x85DF, 0xF2D2,\t0x85E1, 0xF2CA, 0x85E2, 0xF2DA, 0x85E3, 0xF2D3, 0x85E4, 0xC3C3,\n\t0x85E5, 0xC3C4, 0x85E6, 0xF2D7, 0x85E8, 0xF2CB, 0x85E9, 0xC3BF,\t0x85EA, 0xC3C1, 0x85EB, 0xF2C6, 0x85EC, 0xF2CE, 0x85ED, 0xF2C8,\n\t0x85EF, 0xF2D8, 0x85F0, 0xF2D6, 0x85F1, 0xF2C7, 0x85F2, 0xF2CF,\t0x85F6, 0xF4BE, 0x85F7, 0xC3C5, 0x85F8, 0xF2D0, 0x85F9, 0xC4A7,\n\t0x85FA, 0xC4A9, 0x85FB, 0xC4A6, 0x85FD, 0xF4C3, 0x85FE, 0xF4BB,\t0x85FF, 0xF4B9, 0x8600, 0xF4BD, 0x8601, 0xF4BA, 0x8604, 0xF4BF,\n\t0x8605, 0xF4C1, 0x8606, 0xC4AA, 0x8607, 0xC4AC, 0x8609, 0xF4C0,\t0x860A, 0xC4AD, 0x860B, 0xC4AB, 0x860C, 0xF4C2, 0x8611, 0xC4A8,\n\t0x8617, 0xC4F4, 0x8618, 0xF5F1, 0x8619, 0xF5F7, 0x861A, 0xC4F6,\t0x861B, 0xF4BC, 0x861C, 0xF5F6, 0x861E, 0xF5FD, 0x861F, 0xF5F4,\n\t0x8620, 0xF5FB, 0x8621, 0xF5FA, 0x8622, 0xF4B8, 0x8623, 0xF5F5,\t0x8624, 0xF0B6, 0x8625, 0xF5FE, 0x8626, 0xF5F3, 0x8627, 0xF5F8,\n\t0x8629, 0xF5FC, 0x862A, 0xF5F2, 0x862C, 0xF74A, 0x862D, 0xC4F5,\t0x862E, 0xF5F9, 0x8631, 0xF7F4, 0x8632, 0xF74B, 0x8633, 0xF749,\n\t0x8634, 0xF747, 0x8635, 0xF748, 0x8636, 0xF74C, 0x8638, 0xC5D9,\t0x8639, 0xF7F2, 0x863A, 0xF7F0, 0x863B, 0xF7F5, 0x863C, 0xF7F3,\n\t0x863E, 0xF7F6, 0x863F, 0xC5DA, 0x8640, 0xF7F1, 0x8643, 0xF8BC,\t0x8646, 0xF945, 0x8647, 0xF946, 0x8648, 0xF947, 0x864B, 0xF9C7,\n\t0x864C, 0xF9BD, 0x864D, 0xCA4F, 0x864E, 0xAAEA, 0x8650, 0xAD68,\t0x8652, 0xD3B8, 0x8653, 0xD3B7, 0x8654, 0xB040, 0x8655, 0xB342,\n\t0x8656, 0xD77C, 0x8659, 0xD77B, 0x865B, 0xB5EA, 0x865C, 0xB8B8,\t0x865E, 0xB8B7, 0x865F, 0xB8B9, 0x8661, 0xE3D4, 0x8662, 0xE77E,\n\t0x8663, 0xEB58, 0x8664, 0xEB5A, 0x8665, 0xEB59, 0x8667, 0xC1AB,\t0x8668, 0xEE57, 0x8669, 0xF0BA, 0x866A, 0xF9A5, 0x866B, 0xA6E4,\n\t0x866D, 0xCDC9, 0x866E, 0xCDCA, 0x866F, 0xCDC8, 0x8670, 0xCDC7,\t0x8671, 0xAAEB, 0x8673, 0xD0A9, 0x8674, 0xD0A7, 0x8677, 0xD0A6,\n\t0x8679, 0xAD69, 0x867A, 0xAD6B, 0x867B, 0xAD6A, 0x867C, 0xD0A8,\t0x8685, 0xD3C4, 0x8686, 0xD3C1, 0x8687, 0xD3BF, 0x868A, 0xB041,\n\t0x868B, 0xD3C2, 0x868C, 0xB046, 0x868D, 0xD3BC, 0x868E, 0xD3CB,\t0x8690, 0xD3CD, 0x8691, 0xD3BD, 0x8693, 0xB043, 0x8694, 0xD3CE,\n\t0x8695, 0xD3C9, 0x8696, 0xD3BB, 0x8697, 0xD3C0, 0x8698, 0xD3CA,\t0x8699, 0xD3C6, 0x869A, 0xD3C3, 0x869C, 0xB048, 0x869D, 0xD3CC,\n\t0x869E, 0xD3BE, 0x86A1, 0xD3C7, 0x86A2, 0xD3B9, 0x86A3, 0xB047,\t0x86A4, 0xB044, 0x86A5, 0xD3C5, 0x86A7, 0xD3C8, 0x86A8, 0xD3BA,\n\t0x86A9, 0xB045, 0x86AA, 0xB042, 0x86AF, 0xB34C, 0x86B0, 0xD7A5,\t0x86B1, 0xB34B, 0x86B3, 0xD7A8, 0x86B4, 0xD7AB, 0x86B5, 0xB348,\n\t0x86B6, 0xB346, 0x86B7, 0xD77E, 0x86B8, 0xD7A9, 0x86B9, 0xD7A7,\t0x86BA, 0xD7A4, 0x86BB, 0xD7AC, 0x86BC, 0xD7AD, 0x86BD, 0xD7AF,\n\t0x86BE, 0xD7B0, 0x86BF, 0xD77D, 0x86C0, 0xB345, 0x86C1, 0xD7A2,\t0x86C2, 0xD7A1, 0x86C3, 0xD7AE, 0x86C4, 0xB347, 0x86C5, 0xD7A3,\n\t0x86C6, 0xB349, 0x86C7, 0xB344, 0x86C8, 0xD7A6, 0x86C9, 0xB34D,\t0x86CB, 0xB34A, 0x86CC, 0xD7AA, 0x86D0, 0xB5F1, 0x86D1, 0xDBBF,\n\t0x86D3, 0xDBB4, 0x86D4, 0xB5EE, 0x86D6, 0xDFE7, 0x86D7, 0xDBBD,\t0x86D8, 0xDBB1, 0x86D9, 0xB5EC, 0x86DA, 0xDBB6, 0x86DB, 0xB5EF,\n\t0x86DC, 0xDBBA, 0x86DD, 0xDBB8, 0x86DE, 0xB5F2, 0x86DF, 0xB5EB,\t0x86E2, 0xDBB2, 0x86E3, 0xDBB5, 0x86E4, 0xB5F0, 0x86E6, 0xDBB3,\n\t0x86E8, 0xDBBE, 0x86E9, 0xDBBC, 0x86EA, 0xDBB7, 0x86EB, 0xDBB9,\t0x86EC, 0xDBBB, 0x86ED, 0xB5ED, 0x86F5, 0xDFE8, 0x86F6, 0xDFEE,\n\t0x86F7, 0xDFE4, 0x86F8, 0xDFEA, 0x86F9, 0xB8BA, 0x86FA, 0xDFE6,\t0x86FB, 0xB8C0, 0x86FE, 0xB8BF, 0x8700, 0xB8BE, 0x8701, 0xDFED,\n\t0x8702, 0xB8C1, 0x8703, 0xB8C2, 0x8704, 0xDFE3, 0x8705, 0xDFF0,\t0x8706, 0xB8C3, 0x8707, 0xB8BD, 0x8708, 0xB8BC, 0x8709, 0xDFEC,\n\t0x870A, 0xB8C4, 0x870B, 0xDFE2, 0x870C, 0xDFE5, 0x870D, 0xDFEF,\t0x870E, 0xDFEB, 0x8711, 0xE3F4, 0x8712, 0xE3E9, 0x8713, 0xB8BB,\n\t0x8718, 0xBB6A, 0x8719, 0xE3DD, 0x871A, 0xE3F2, 0x871B, 0xE3DE,\t0x871C, 0xBB65, 0x871E, 0xE3DB, 0x8720, 0xE3E4, 0x8721, 0xE3DC,\n\t0x8722, 0xBB67, 0x8723, 0xE3D6, 0x8724, 0xE3F1, 0x8725, 0xBB68,\t0x8726, 0xE3EE, 0x8727, 0xE3EF, 0x8728, 0xE3D7, 0x8729, 0xBB6D,\n\t0x872A, 0xE3E6, 0x872C, 0xE3E0, 0x872D, 0xE3E7, 0x872E, 0xE3DA,\t0x8730, 0xE3F3, 0x8731, 0xE3EB, 0x8732, 0xE3E5, 0x8733, 0xE3D5,\n\t0x8734, 0xBB69, 0x8735, 0xE3EC, 0x8737, 0xBB6C, 0x8738, 0xE3F0,\t0x873A, 0xE3EA, 0x873B, 0xBB66, 0x873C, 0xE3E8, 0x873E, 0xE3E2,\n\t0x873F, 0xBB64, 0x8740, 0xE3D9, 0x8741, 0xE3E1, 0x8742, 0xE3ED,\t0x8743, 0xE3DF, 0x8746, 0xE3E3, 0x874C, 0xBDC1, 0x874D, 0xDFE9,\n\t0x874E, 0xE7B2, 0x874F, 0xE7BB, 0x8750, 0xE7B1, 0x8751, 0xE7AD,\t0x8752, 0xE7AA, 0x8753, 0xBDC2, 0x8754, 0xE7A8, 0x8755, 0xBB6B,\n\t0x8756, 0xE7A1, 0x8757, 0xBDC0, 0x8758, 0xE7A7, 0x8759, 0xBDBF,\t0x875A, 0xE7AC, 0x875B, 0xE7A9, 0x875C, 0xE7B9, 0x875D, 0xE7B4,\n\t0x875E, 0xE7AE, 0x875F, 0xE7B3, 0x8760, 0xBDBB, 0x8761, 0xE7AB,\t0x8762, 0xE7BE, 0x8763, 0xE7A2, 0x8764, 0xE7A3, 0x8765, 0xE7BA,\n\t0x8766, 0xBDBC, 0x8767, 0xE7BF, 0x8768, 0xBDBE, 0x8769, 0xE7C0,\t0x876A, 0xE7B0, 0x876B, 0xE3D8, 0x876C, 0xE7B6, 0x876D, 0xE7AF,\n\t0x876E, 0xE7B8, 0x876F, 0xE7B5, 0x8773, 0xE7A6, 0x8774, 0xBDB9,\t0x8775, 0xE7BD, 0x8776, 0xBDBA, 0x8777, 0xE7A4, 0x8778, 0xBDBD,\n\t0x8779, 0xEB64, 0x877A, 0xE7B7, 0x877B, 0xE7BC, 0x8781, 0xEB61,\t0x8782, 0xBDB8, 0x8783, 0xBFC0, 0x8784, 0xEB6B, 0x8785, 0xEB67,\n\t0x8787, 0xEB65, 0x8788, 0xEB60, 0x8789, 0xEB6F, 0x878D, 0xBFC4,\t0x878F, 0xEB5C, 0x8790, 0xEB68, 0x8791, 0xEB69, 0x8792, 0xEB5F,\n\t0x8793, 0xEB5E, 0x8794, 0xEB6C, 0x8796, 0xEB62, 0x8797, 0xEB5D,\t0x8798, 0xEB63, 0x879A, 0xEB6E, 0x879B, 0xEB5B, 0x879C, 0xEB6D,\n\t0x879D, 0xEB6A, 0x879E, 0xBFC2, 0x879F, 0xBFC1, 0x87A2, 0xBFC3,\t0x87A3, 0xEB66, 0x87A4, 0xF0CB, 0x87AA, 0xEE59, 0x87AB, 0xC1B1,\n\t0x87AC, 0xEE5D, 0x87AD, 0xEE5A, 0x87AE, 0xEE61, 0x87AF, 0xEE67,\t0x87B0, 0xEE5C, 0x87B2, 0xEE70, 0x87B3, 0xC1AE, 0x87B4, 0xEE6A,\n\t0x87B5, 0xEE5F, 0x87B6, 0xEE6B, 0x87B7, 0xEE66, 0x87B8, 0xEE6D,\t0x87B9, 0xEE5E, 0x87BA, 0xC1B3, 0x87BB, 0xC1B2, 0x87BC, 0xEE60,\n\t0x87BD, 0xEE6E, 0x87BE, 0xEE58, 0x87BF, 0xEE6C, 0x87C0, 0xC1AC,\t0x87C2, 0xEE64, 0x87C3, 0xEE63, 0x87C4, 0xEE68, 0x87C5, 0xEE5B,\n\t0x87C6, 0xC1B0, 0x87C8, 0xC1B4, 0x87C9, 0xEE62, 0x87CA, 0xEE69,\t0x87CB, 0xC1B5, 0x87CC, 0xEE65, 0x87D1, 0xC1AD, 0x87D2, 0xC1AF,\n\t0x87D3, 0xF0C7, 0x87D4, 0xF0C5, 0x87D7, 0xF0CC, 0x87D8, 0xF0C9,\t0x87D9, 0xF0CD, 0x87DB, 0xF0BE, 0x87DC, 0xF0C6, 0x87DD, 0xF0D1,\n\t0x87DE, 0xEE6F, 0x87DF, 0xF0C2, 0x87E0, 0xC2CF, 0x87E1, 0xE7A5,\t0x87E2, 0xF0BD, 0x87E3, 0xF0CA, 0x87E4, 0xF0C4, 0x87E5, 0xF0C1,\n\t0x87E6, 0xF0BC, 0x87E7, 0xF0BB, 0x87E8, 0xF0D0, 0x87EA, 0xF0C0,\t0x87EB, 0xF0BF, 0x87EC, 0xC2CD, 0x87ED, 0xF0C8, 0x87EF, 0xC2CC,\n\t0x87F2, 0xC2CE, 0x87F3, 0xF0C3, 0x87F4, 0xF0CF, 0x87F6, 0xF2DE,\t0x87F7, 0xF2DF, 0x87F9, 0xC3C9, 0x87FA, 0xF2DC, 0x87FB, 0xC3C6,\n\t0x87FC, 0xF2E4, 0x87FE, 0xC3CA, 0x87FF, 0xF2E6, 0x8800, 0xF2DB,\t0x8801, 0xF0CE, 0x8802, 0xF2E8, 0x8803, 0xF2DD, 0x8805, 0xC3C7,\n\t0x8806, 0xF2E3, 0x8808, 0xF2E5, 0x8809, 0xF2E0, 0x880A, 0xF2E7,\t0x880B, 0xF2E2, 0x880C, 0xF2E1, 0x880D, 0xC3C8, 0x8810, 0xF4C5,\n\t0x8811, 0xF4C6, 0x8813, 0xF4C8, 0x8814, 0xC4AE, 0x8815, 0xC4AF,\t0x8816, 0xF4C9, 0x8817, 0xF4C7, 0x8819, 0xF4C4, 0x881B, 0xF642,\n\t0x881C, 0xF645, 0x881D, 0xF641, 0x881F, 0xC4FA, 0x8820, 0xF643,\t0x8821, 0xC4F9, 0x8822, 0xC4F8, 0x8823, 0xC4F7, 0x8824, 0xF644,\n\t0x8825, 0xF751, 0x8826, 0xF74F, 0x8828, 0xF74E, 0x8829, 0xF640,\t0x882A, 0xF750, 0x882B, 0xF646, 0x882C, 0xF74D, 0x882E, 0xF7F9,\n\t0x882F, 0xF7D7, 0x8830, 0xF7F7, 0x8831, 0xC5DB, 0x8832, 0xF7F8,\t0x8833, 0xF7FA, 0x8835, 0xF8BF, 0x8836, 0xC5FA, 0x8837, 0xF8BE,\n\t0x8838, 0xF8BD, 0x8839, 0xC5FB, 0x883B, 0xC65A, 0x883C, 0xF96E,\t0x883D, 0xF9A7, 0x883E, 0xF9A6, 0x883F, 0xF9A8, 0x8840, 0xA6E5,\n\t0x8841, 0xD0AA, 0x8843, 0xD3CF, 0x8844, 0xD3D0, 0x8848, 0xDBC0,\t0x884A, 0xF647, 0x884B, 0xF8C0, 0x884C, 0xA6E6, 0x884D, 0xAD6C,\n\t0x884E, 0xD0AB, 0x8852, 0xD7B1, 0x8853, 0xB34E, 0x8855, 0xDBC2,\t0x8856, 0xDBC1, 0x8857, 0xB5F3, 0x8859, 0xB8C5, 0x885A, 0xE7C1,\n\t0x885B, 0xBDC3, 0x885D, 0xBDC4, 0x8861, 0xBFC5, 0x8862, 0xC5FC,\t0x8863, 0xA6E7, 0x8867, 0xD0AC, 0x8868, 0xAAED, 0x8869, 0xD0AE,\n\t0x886A, 0xD0AD, 0x886B, 0xAD6D, 0x886D, 0xD3D1, 0x886F, 0xD3D8,\t0x8870, 0xB049, 0x8871, 0xD3D6, 0x8872, 0xD3D4, 0x8874, 0xD3DB,\n\t0x8875, 0xD3D2, 0x8876, 0xD3D3, 0x8877, 0xB04A, 0x8879, 0xB04E,\t0x887C, 0xD3DC, 0x887D, 0xB04D, 0x887E, 0xD3DA, 0x887F, 0xD3D7,\n\t0x8880, 0xD3D5, 0x8881, 0xB04B, 0x8882, 0xB04C, 0x8883, 0xD3D9,\t0x8888, 0xB350, 0x8889, 0xD7B2, 0x888B, 0xB355, 0x888C, 0xD7C2,\n\t0x888D, 0xB354, 0x888E, 0xD7C4, 0x8891, 0xD7B8, 0x8892, 0xB352,\t0x8893, 0xD7C3, 0x8895, 0xD7B3, 0x8896, 0xB353, 0x8897, 0xD7BF,\n\t0x8898, 0xD7BB, 0x8899, 0xD7BD, 0x889A, 0xD7B7, 0x889B, 0xD7BE,\t0x889E, 0xB34F, 0x889F, 0xD7BA, 0x88A1, 0xD7B9, 0x88A2, 0xD7B5,\n\t0x88A4, 0xD7C0, 0x88A7, 0xD7BC, 0x88A8, 0xD7B4, 0x88AA, 0xD7B6,\t0x88AB, 0xB351, 0x88AC, 0xD7C1, 0x88B1, 0xB5F6, 0x88B2, 0xDBCD,\n\t0x88B6, 0xDBC9, 0x88B7, 0xDBCB, 0x88B8, 0xDBC6, 0x88B9, 0xDBC5,\t0x88BA, 0xDBC3, 0x88BC, 0xDBCA, 0x88BD, 0xDBCC, 0x88BE, 0xDBC8,\n\t0x88C0, 0xDBC7, 0x88C1, 0xB5F4, 0x88C2, 0xB5F5, 0x88C9, 0xDBCF,\t0x88CA, 0xB8CD, 0x88CB, 0xDFF2, 0x88CC, 0xDFF8, 0x88CD, 0xDFF3,\n\t0x88CE, 0xDFF4, 0x88CF, 0xF9D8, 0x88D0, 0xDFF9, 0x88D2, 0xB8CF,\t0x88D4, 0xB8C7, 0x88D5, 0xB8CE, 0x88D6, 0xDFF1, 0x88D7, 0xDBC4,\n\t0x88D8, 0xB8CA, 0x88D9, 0xB8C8, 0x88DA, 0xDFF7, 0x88DB, 0xDFF6,\t0x88DC, 0xB8C9, 0x88DD, 0xB8CB, 0x88DE, 0xDFF5, 0x88DF, 0xB8C6,\n\t0x88E1, 0xB8CC, 0x88E7, 0xE3F6, 0x88E8, 0xBB74, 0x88EB, 0xE442,\t0x88EC, 0xE441, 0x88EE, 0xE3FB, 0x88EF, 0xBB76, 0x88F0, 0xE440,\n\t0x88F1, 0xE3F7, 0x88F2, 0xE3F8, 0x88F3, 0xBB6E, 0x88F4, 0xBB70,\t0x88F6, 0xE3FD, 0x88F7, 0xE3F5, 0x88F8, 0xBB72, 0x88F9, 0xBB71,\n\t0x88FA, 0xE3F9, 0x88FB, 0xE3FE, 0x88FC, 0xE3FC, 0x88FD, 0xBB73,\t0x88FE, 0xE3FA, 0x8901, 0xDBCE, 0x8902, 0xBB6F, 0x8905, 0xE7C2,\n\t0x8906, 0xE7C9, 0x8907, 0xBDC6, 0x8909, 0xE7CD, 0x890A, 0xBDCA,\t0x890B, 0xE7C5, 0x890C, 0xE7C3, 0x890E, 0xE7CC, 0x8910, 0xBDC5,\n\t0x8911, 0xE7CB, 0x8912, 0xBDC7, 0x8913, 0xBDC8, 0x8914, 0xE7C4,\t0x8915, 0xBDC9, 0x8916, 0xE7CA, 0x8917, 0xE7C6, 0x8918, 0xE7C7,\n\t0x8919, 0xE7C8, 0x891A, 0xBB75, 0x891E, 0xEB70, 0x891F, 0xEB7C,\t0x8921, 0xBFCA, 0x8922, 0xEB77, 0x8923, 0xEB79, 0x8925, 0xBFC8,\n\t0x8926, 0xEB71, 0x8927, 0xEB75, 0x8929, 0xEB78, 0x892A, 0xBFC6,\t0x892B, 0xBFC9, 0x892C, 0xEB7B, 0x892D, 0xEB73, 0x892E, 0xEB74,\n\t0x892F, 0xEB7A, 0x8930, 0xEB72, 0x8931, 0xEB76, 0x8932, 0xBFC7,\t0x8933, 0xEE72, 0x8935, 0xEE71, 0x8936, 0xC1B7, 0x8937, 0xEE77,\n\t0x8938, 0xC1B9, 0x893B, 0xC1B6, 0x893C, 0xEE73, 0x893D, 0xC1BA,\t0x893E, 0xEE74, 0x8941, 0xEE75, 0x8942, 0xEE78, 0x8944, 0xC1B8,\n\t0x8946, 0xF0D6, 0x8949, 0xF0D9, 0x894B, 0xF0D3, 0x894C, 0xF0D5,\t0x894F, 0xF0D4, 0x8950, 0xF0D7, 0x8951, 0xF0D8, 0x8952, 0xEE76,\n\t0x8953, 0xF0D2, 0x8956, 0xC3CD, 0x8957, 0xF2EC, 0x8958, 0xF2EF,\t0x8959, 0xF2F1, 0x895A, 0xF2EA, 0x895B, 0xF2EB, 0x895C, 0xF2EE,\n\t0x895D, 0xF2F0, 0x895E, 0xC3CE, 0x895F, 0xC3CC, 0x8960, 0xC3CB,\t0x8961, 0xF2ED, 0x8962, 0xF2E9, 0x8963, 0xF4CA, 0x8964, 0xC4B0,\n\t0x8966, 0xF4CB, 0x8969, 0xF649, 0x896A, 0xC4FB, 0x896B, 0xF64B,\t0x896C, 0xC4FC, 0x896D, 0xF648, 0x896E, 0xF64A, 0x896F, 0xC5A8,\n\t0x8971, 0xF752, 0x8972, 0xC5A7, 0x8973, 0xF7FD, 0x8974, 0xF7FC,\t0x8976, 0xF7FB, 0x8979, 0xF948, 0x897A, 0xF949, 0x897B, 0xF94B,\n\t0x897C, 0xF94A, 0x897E, 0xCA50, 0x897F, 0xA6E8, 0x8981, 0xAD6E,\t0x8982, 0xD7C5, 0x8983, 0xB5F7, 0x8985, 0xDFFA, 0x8986, 0xC2D0,\n\t0x8988, 0xF2F2, 0x898B, 0xA8A3, 0x898F, 0xB357, 0x8993, 0xB356,\t0x8995, 0xDBD0, 0x8996, 0xB5F8, 0x8997, 0xDBD2, 0x8998, 0xDBD1,\n\t0x899B, 0xDFFB, 0x899C, 0xB8D0, 0x899D, 0xE443, 0x899E, 0xE446,\t0x899F, 0xE445, 0x89A1, 0xE444, 0x89A2, 0xE7CE, 0x89A3, 0xE7D0,\n\t0x89A4, 0xE7CF, 0x89A6, 0xBFCC, 0x89AA, 0xBFCB, 0x89AC, 0xC1BB,\t0x89AD, 0xEE79, 0x89AE, 0xEE7B, 0x89AF, 0xEE7A, 0x89B2, 0xC2D1,\n\t0x89B6, 0xF2F4, 0x89B7, 0xF2F3, 0x89B9, 0xF4CC, 0x89BA, 0xC4B1,\t0x89BD, 0xC4FD, 0x89BE, 0xF754, 0x89BF, 0xF753, 0x89C0, 0xC65B,\n\t0x89D2, 0xA8A4, 0x89D3, 0xD0AF, 0x89D4, 0xAD6F, 0x89D5, 0xD7C8,\t0x89D6, 0xD7C6, 0x89D9, 0xD7C7, 0x89DA, 0xDBD4, 0x89DB, 0xDBD5,\n\t0x89DC, 0xE043, 0x89DD, 0xDBD3, 0x89DF, 0xDFFC, 0x89E0, 0xE041,\t0x89E1, 0xE040, 0x89E2, 0xE042, 0x89E3, 0xB8D1, 0x89E4, 0xDFFE,\n\t0x89E5, 0xDFFD, 0x89E6, 0xE044, 0x89E8, 0xE449, 0x89E9, 0xE447,\t0x89EB, 0xE448, 0x89EC, 0xE7D3, 0x89ED, 0xE7D1, 0x89F0, 0xE7D2,\n\t0x89F1, 0xEB7D, 0x89F2, 0xEE7C, 0x89F3, 0xEE7D, 0x89F4, 0xC2D2,\t0x89F6, 0xF2F5, 0x89F7, 0xF4CD, 0x89F8, 0xC4B2, 0x89FA, 0xF64C,\n\t0x89FB, 0xF755, 0x89FC, 0xC5A9, 0x89FE, 0xF7FE, 0x89FF, 0xF94C,\t0x8A00, 0xA8A5, 0x8A02, 0xAD71, 0x8A03, 0xAD72, 0x8A04, 0xD0B0,\n\t0x8A07, 0xD0B1, 0x8A08, 0xAD70, 0x8A0A, 0xB054, 0x8A0C, 0xB052,\t0x8A0E, 0xB051, 0x8A0F, 0xB058, 0x8A10, 0xB050, 0x8A11, 0xB059,\n\t0x8A12, 0xD3DD, 0x8A13, 0xB056, 0x8A15, 0xB053, 0x8A16, 0xB057,\t0x8A17, 0xB055, 0x8A18, 0xB04F, 0x8A1B, 0xB35F, 0x8A1D, 0xB359,\n\t0x8A1E, 0xD7CC, 0x8A1F, 0xB35E, 0x8A22, 0xB360, 0x8A23, 0xB35A,\t0x8A25, 0xB35B, 0x8A27, 0xD7CA, 0x8A2A, 0xB358, 0x8A2C, 0xD7CB,\n\t0x8A2D, 0xB35D, 0x8A30, 0xD7C9, 0x8A31, 0xB35C, 0x8A34, 0xB644,\t0x8A36, 0xB646, 0x8A39, 0xDBD8, 0x8A3A, 0xB645, 0x8A3B, 0xB5F9,\n\t0x8A3C, 0xB5FD, 0x8A3E, 0xB8E4, 0x8A3F, 0xE049, 0x8A40, 0xDBDA,\t0x8A41, 0xB5FE, 0x8A44, 0xDBDD, 0x8A45, 0xDBDE, 0x8A46, 0xB643,\n\t0x8A48, 0xDBE0, 0x8A4A, 0xDBE2, 0x8A4C, 0xDBE3, 0x8A4D, 0xDBD7,\t0x8A4E, 0xDBD6, 0x8A4F, 0xDBE4, 0x8A50, 0xB642, 0x8A51, 0xDBE1,\n\t0x8A52, 0xDBDF, 0x8A54, 0xB640, 0x8A55, 0xB5FB, 0x8A56, 0xB647,\t0x8A57, 0xDBDB, 0x8A58, 0xDBDC, 0x8A59, 0xDBD9, 0x8A5B, 0xB641,\n\t0x8A5E, 0xB5FC, 0x8A60, 0xB5FA, 0x8A61, 0xE048, 0x8A62, 0xB8DF,\t0x8A63, 0xB8DA, 0x8A66, 0xB8D5, 0x8A68, 0xB8E5, 0x8A69, 0xB8D6,\n\t0x8A6B, 0xB8D2, 0x8A6C, 0xB8E1, 0x8A6D, 0xB8DE, 0x8A6E, 0xB8E0,\t0x8A70, 0xB8D7, 0x8A71, 0xB8DC, 0x8A72, 0xB8D3, 0x8A73, 0xB8D4,\n\t0x8A74, 0xE050, 0x8A75, 0xE04D, 0x8A76, 0xE045, 0x8A77, 0xE04A,\t0x8A79, 0xB8E2, 0x8A7A, 0xE051, 0x8A7B, 0xB8E3, 0x8A7C, 0xB8D9,\n\t0x8A7F, 0xE047, 0x8A81, 0xE04F, 0x8A82, 0xE04B, 0x8A83, 0xE04E,\t0x8A84, 0xE04C, 0x8A85, 0xB8DD, 0x8A86, 0xE046, 0x8A87, 0xB8D8,\n\t0x8A8B, 0xE44C, 0x8A8C, 0xBB78, 0x8A8D, 0xBB7B, 0x8A8F, 0xE44E,\t0x8A91, 0xBBA5, 0x8A92, 0xE44D, 0x8A93, 0xBB7D, 0x8A95, 0xBDCF,\n\t0x8A96, 0xE44F, 0x8A98, 0xBBA4, 0x8A99, 0xE44B, 0x8A9A, 0xBBA6,\t0x8A9E, 0xBB79, 0x8AA0, 0xB8DB, 0x8AA1, 0xBB7C, 0x8AA3, 0xBB7A,\n\t0x8AA4, 0xBB7E, 0x8AA5, 0xBBA2, 0x8AA6, 0xBB77, 0x8AA7, 0xBBA7,\t0x8AA8, 0xBBA3, 0x8AAA, 0xBBA1, 0x8AAB, 0xE44A, 0x8AB0, 0xBDD6,\n\t0x8AB2, 0xBDD2, 0x8AB6, 0xBDD9, 0x8AB8, 0xE7D6, 0x8AB9, 0xBDDA,\t0x8ABA, 0xE7E2, 0x8ABB, 0xE7DB, 0x8ABC, 0xBDCB, 0x8ABD, 0xE7E3,\n\t0x8ABE, 0xE7DD, 0x8ABF, 0xBDD5, 0x8AC0, 0xE7DE, 0x8AC2, 0xBDD4,\t0x8AC3, 0xE7E1, 0x8AC4, 0xBDCE, 0x8AC5, 0xE7DF, 0x8AC6, 0xE7D5,\n\t0x8AC7, 0xBDCD, 0x8AC8, 0xEBAA, 0x8AC9, 0xBDD3, 0x8ACB, 0xBDD0,\t0x8ACD, 0xBDD8, 0x8ACF, 0xE7D4, 0x8AD1, 0xE7D8, 0x8AD2, 0xBDCC,\n\t0x8AD3, 0xE7D7, 0x8AD4, 0xE7D9, 0x8AD5, 0xE7DA, 0x8AD6, 0xBDD7,\t0x8AD7, 0xE7DC, 0x8AD8, 0xE7E0, 0x8AD9, 0xE7E4, 0x8ADB, 0xBDDB,\n\t0x8ADC, 0xBFD2, 0x8ADD, 0xEBA5, 0x8ADE, 0xEBAB, 0x8ADF, 0xEBA8,\t0x8AE0, 0xEB7E, 0x8AE1, 0xEBAC, 0x8AE2, 0xEBA1, 0x8AE4, 0xEBA7,\n\t0x8AE6, 0xBFCD, 0x8AE7, 0xBFD3, 0x8AE8, 0xEBAD, 0x8AEB, 0xBFCF,\t0x8AED, 0xBFD9, 0x8AEE, 0xBFD4, 0x8AEF, 0xEBAF, 0x8AF0, 0xEBA9,\n\t0x8AF1, 0xBFD0, 0x8AF2, 0xEBA2, 0x8AF3, 0xBFDA, 0x8AF4, 0xEBA3,\t0x8AF5, 0xEBA4, 0x8AF6, 0xBFDB, 0x8AF7, 0xBFD8, 0x8AF8, 0xBDD1,\n\t0x8AFA, 0xBFCE, 0x8AFB, 0xEBB0, 0x8AFC, 0xBFDC, 0x8AFE, 0xBFD5,\t0x8AFF, 0xEBAE, 0x8B00, 0xBFD1, 0x8B01, 0xBFD6, 0x8B02, 0xBFD7,\n\t0x8B04, 0xC1C3, 0x8B05, 0xEEA4, 0x8B06, 0xEEAD, 0x8B07, 0xEEAA,\t0x8B08, 0xEEAC, 0x8B0A, 0xC1C0, 0x8B0B, 0xEEA5, 0x8B0D, 0xEEAB,\n\t0x8B0E, 0xC1BC, 0x8B0F, 0xEEA7, 0x8B10, 0xC1C4, 0x8B11, 0xEEA3,\t0x8B12, 0xEEA8, 0x8B13, 0xEEAF, 0x8B14, 0xEBA6, 0x8B15, 0xEEA9,\n\t0x8B16, 0xEEA2, 0x8B17, 0xC1BD, 0x8B18, 0xEEA1, 0x8B19, 0xC1BE,\t0x8B1A, 0xEEB0, 0x8B1B, 0xC1BF, 0x8B1C, 0xEEAE, 0x8B1D, 0xC1C2,\n\t0x8B1E, 0xEE7E, 0x8B20, 0xC1C1, 0x8B22, 0xEEA6, 0x8B23, 0xF0DC,\t0x8B24, 0xF0EA, 0x8B25, 0xF0E5, 0x8B26, 0xF0E7, 0x8B27, 0xF0DB,\n\t0x8B28, 0xC2D3, 0x8B2A, 0xF0DA, 0x8B2B, 0xC2D6, 0x8B2C, 0xC2D5,\t0x8B2E, 0xF0E9, 0x8B2F, 0xF0E1, 0x8B30, 0xF0DE, 0x8B31, 0xF0E4,\n\t0x8B33, 0xF0DD, 0x8B35, 0xF0DF, 0x8B36, 0xF0E8, 0x8B37, 0xF0E6,\t0x8B39, 0xC2D4, 0x8B3A, 0xF0ED, 0x8B3B, 0xF0EB, 0x8B3C, 0xF0E2,\n\t0x8B3D, 0xF0EC, 0x8B3E, 0xF0E3, 0x8B40, 0xF2F9, 0x8B41, 0xC3CF,\t0x8B42, 0xF341, 0x8B45, 0xF64F, 0x8B46, 0xC3D6, 0x8B47, 0xF0E0,\n\t0x8B48, 0xF2F7, 0x8B49, 0xC3D2, 0x8B4A, 0xF2F8, 0x8B4B, 0xF2FD,\t0x8B4E, 0xC3D4, 0x8B4F, 0xC3D5, 0x8B50, 0xF2F6, 0x8B51, 0xF340,\n\t0x8B52, 0xF342, 0x8B53, 0xF2FA, 0x8B54, 0xF2FC, 0x8B55, 0xF2FE,\t0x8B56, 0xF2FB, 0x8B57, 0xF343, 0x8B58, 0xC3D1, 0x8B59, 0xC3D7,\n\t0x8B5A, 0xC3D3, 0x8B5C, 0xC3D0, 0x8B5D, 0xF4D0, 0x8B5F, 0xC4B7,\t0x8B60, 0xF4CE, 0x8B63, 0xF4D2, 0x8B65, 0xF4D3, 0x8B66, 0xC4B5,\n\t0x8B67, 0xF4D4, 0x8B68, 0xF4D1, 0x8B6A, 0xF4CF, 0x8B6B, 0xC4B8,\t0x8B6C, 0xC4B4, 0x8B6D, 0xF4D5, 0x8B6F, 0xC4B6, 0x8B70, 0xC4B3,\n\t0x8B74, 0xC4FE, 0x8B77, 0xC540, 0x8B78, 0xF64E, 0x8B79, 0xF64D,\t0x8B7A, 0xF650, 0x8B7B, 0xF651, 0x8B7D, 0xC541, 0x8B7E, 0xF756,\n\t0x8B7F, 0xF75B, 0x8B80, 0xC5AA, 0x8B82, 0xF758, 0x8B84, 0xF757,\t0x8B85, 0xF75A, 0x8B86, 0xF759, 0x8B88, 0xF843, 0x8B8A, 0xC5DC,\n\t0x8B8B, 0xF842, 0x8B8C, 0xF840, 0x8B8E, 0xF841, 0x8B92, 0xC5FE,\t0x8B93, 0xC5FD, 0x8B94, 0xF8C1, 0x8B95, 0xF8C2, 0x8B96, 0xC640,\n\t0x8B98, 0xF94D, 0x8B99, 0xF94E, 0x8B9A, 0xC667, 0x8B9C, 0xC66D,\t0x8B9E, 0xF9A9, 0x8B9F, 0xF9C8, 0x8C37, 0xA8A6, 0x8C39, 0xD7CD,\n\t0x8C3B, 0xD7CE, 0x8C3C, 0xE052, 0x8C3D, 0xE450, 0x8C3E, 0xE7E5,\t0x8C3F, 0xC1C6, 0x8C41, 0xC1C5, 0x8C42, 0xF0EE, 0x8C43, 0xF344,\n\t0x8C45, 0xF844, 0x8C46, 0xA8A7, 0x8C47, 0xD3DE, 0x8C48, 0xB05A,\t0x8C49, 0xB361, 0x8C4A, 0xE054, 0x8C4B, 0xE053, 0x8C4C, 0xBDDC,\n\t0x8C4D, 0xE7E6, 0x8C4E, 0xBDDD, 0x8C4F, 0xEEB1, 0x8C50, 0xC2D7,\t0x8C54, 0xC676, 0x8C55, 0xA8A8, 0x8C56, 0xCDCB, 0x8C57, 0xD3DF,\n\t0x8C5A, 0xB362, 0x8C5C, 0xD7CF, 0x8C5D, 0xD7D0, 0x8C5F, 0xDBE5,\t0x8C61, 0xB648, 0x8C62, 0xB8E6, 0x8C64, 0xE056, 0x8C65, 0xE055,\n\t0x8C66, 0xE057, 0x8C68, 0xE451, 0x8C69, 0xE452, 0x8C6A, 0xBBA8,\t0x8C6B, 0xBFDD, 0x8C6C, 0xBDDE, 0x8C6D, 0xBFDE, 0x8C6F, 0xEEB5,\n\t0x8C70, 0xEEB2, 0x8C71, 0xEEB4, 0x8C72, 0xEEB3, 0x8C73, 0xC1C7,\t0x8C75, 0xF0EF, 0x8C76, 0xF346, 0x8C77, 0xF345, 0x8C78, 0xCBA4,\n\t0x8C79, 0xB05C, 0x8C7A, 0xB05B, 0x8C7B, 0xD3E0, 0x8C7D, 0xD7D1,\t0x8C80, 0xDBE7, 0x8C81, 0xDBE6, 0x8C82, 0xB649, 0x8C84, 0xE059,\n\t0x8C85, 0xE05A, 0x8C86, 0xE058, 0x8C89, 0xB8E8, 0x8C8A, 0xB8E7,\t0x8C8C, 0xBBAA, 0x8C8D, 0xBBA9, 0x8C8F, 0xE7E7, 0x8C90, 0xEBB3,\n\t0x8C91, 0xEBB1, 0x8C92, 0xEBB2, 0x8C93, 0xBFDF, 0x8C94, 0xEEB7,\t0x8C95, 0xEEB6, 0x8C97, 0xF0F2, 0x8C98, 0xF0F1, 0x8C99, 0xF0F0,\n\t0x8C9A, 0xF347, 0x8C9C, 0xF9AA, 0x8C9D, 0xA8A9, 0x8C9E, 0xAD73,\t0x8CA0, 0xAD74, 0x8CA1, 0xB05D, 0x8CA2, 0xB05E, 0x8CA3, 0xD3E2,\n\t0x8CA4, 0xD3E1, 0x8CA5, 0xD7D2, 0x8CA7, 0xB368, 0x8CA8, 0xB366,\t0x8CA9, 0xB363, 0x8CAA, 0xB367, 0x8CAB, 0xB365, 0x8CAC, 0xB364,\n\t0x8CAF, 0xB64A, 0x8CB0, 0xDBEA, 0x8CB2, 0xB8ED, 0x8CB3, 0xB64C,\t0x8CB4, 0xB651, 0x8CB5, 0xDBEC, 0x8CB6, 0xB653, 0x8CB7, 0xB652,\n\t0x8CB8, 0xB655, 0x8CB9, 0xDBEB, 0x8CBA, 0xDBE8, 0x8CBB, 0xB64F,\t0x8CBC, 0xB64B, 0x8CBD, 0xB64D, 0x8CBE, 0xDBE9, 0x8CBF, 0xB654,\n\t0x8CC0, 0xB650, 0x8CC1, 0xB64E, 0x8CC2, 0xB8EF, 0x8CC3, 0xB8EE,\t0x8CC4, 0xB8EC, 0x8CC5, 0xB8F0, 0x8CC7, 0xB8EA, 0x8CC8, 0xB8EB,\n\t0x8CCA, 0xB8E9, 0x8CCC, 0xE05B, 0x8CCF, 0xE454, 0x8CD1, 0xBBAC,\t0x8CD2, 0xBBAD, 0x8CD3, 0xBBAB, 0x8CD5, 0xE453, 0x8CD7, 0xE455,\n\t0x8CD9, 0xE7EA, 0x8CDA, 0xE7EC, 0x8CDC, 0xBDE7, 0x8CDD, 0xE7ED,\t0x8CDE, 0xBDE0, 0x8CDF, 0xE7E9, 0x8CE0, 0xBDDF, 0x8CE1, 0xBDE9,\n\t0x8CE2, 0xBDE5, 0x8CE3, 0xBDE6, 0x8CE4, 0xBDE2, 0x8CE5, 0xE7E8,\t0x8CE6, 0xBDE1, 0x8CE7, 0xE7EE, 0x8CE8, 0xE7EB, 0x8CEA, 0xBDE8,\n\t0x8CEC, 0xBDE3, 0x8CED, 0xBDE4, 0x8CEE, 0xEBB5, 0x8CF0, 0xEBB7,\t0x8CF1, 0xEBB6, 0x8CF3, 0xEBB8, 0x8CF4, 0xBFE0, 0x8CF5, 0xEBB4,\n\t0x8CF8, 0xC1CB, 0x8CF9, 0xEEB8, 0x8CFA, 0xC1C8, 0x8CFB, 0xC1CC,\t0x8CFC, 0xC1CA, 0x8CFD, 0xC1C9, 0x8CFE, 0xF0F3, 0x8D00, 0xF0F6,\n\t0x8D02, 0xF0F5, 0x8D04, 0xF0F4, 0x8D05, 0xC2D8, 0x8D06, 0xF348,\t0x8D07, 0xF349, 0x8D08, 0xC3D8, 0x8D09, 0xF34A, 0x8D0A, 0xC3D9,\n\t0x8D0D, 0xC4BA, 0x8D0F, 0xC4B9, 0x8D10, 0xF652, 0x8D13, 0xC542,\t0x8D14, 0xF653, 0x8D15, 0xF75C, 0x8D16, 0xC5AB, 0x8D17, 0xC5AC,\n\t0x8D19, 0xF845, 0x8D1B, 0xC642, 0x8D64, 0xA8AA, 0x8D66, 0xB36A,\t0x8D67, 0xB369, 0x8D68, 0xE05C, 0x8D69, 0xE05D, 0x8D6B, 0xBBAE,\n\t0x8D6C, 0xEBB9, 0x8D6D, 0xBDEA, 0x8D6E, 0xEBBA, 0x8D6F, 0xEEB9,\t0x8D70, 0xA8AB, 0x8D72, 0xD0B2, 0x8D73, 0xAD76, 0x8D74, 0xAD75,\n\t0x8D76, 0xD3E3, 0x8D77, 0xB05F, 0x8D78, 0xD3E4, 0x8D79, 0xD7D5,\t0x8D7B, 0xD7D4, 0x8D7D, 0xD7D3, 0x8D80, 0xDBEE, 0x8D81, 0xB658,\n\t0x8D84, 0xDBED, 0x8D85, 0xB657, 0x8D89, 0xDBEF, 0x8D8A, 0xB656,\t0x8D8C, 0xE05F, 0x8D8D, 0xE062, 0x8D8E, 0xE060, 0x8D8F, 0xE061,\n\t0x8D90, 0xE065, 0x8D91, 0xE05E, 0x8D92, 0xE066, 0x8D93, 0xE063,\t0x8D94, 0xE064, 0x8D95, 0xBBB0, 0x8D96, 0xE456, 0x8D99, 0xBBAF,\n\t0x8D9B, 0xE7F2, 0x8D9C, 0xE7F0, 0x8D9F, 0xBDEB, 0x8DA0, 0xE7EF,\t0x8DA1, 0xE7F1, 0x8DA3, 0xBDEC, 0x8DA5, 0xEBBB, 0x8DA7, 0xEBBC,\n\t0x8DA8, 0xC1CD, 0x8DAA, 0xF34C, 0x8DAB, 0xF34E, 0x8DAC, 0xF34B,\t0x8DAD, 0xF34D, 0x8DAE, 0xF4D6, 0x8DAF, 0xF654, 0x8DB2, 0xF96F,\n\t0x8DB3, 0xA8AC, 0x8DB4, 0xAD77, 0x8DB5, 0xD3E5, 0x8DB6, 0xD3E7,\t0x8DB7, 0xD3E6, 0x8DB9, 0xD7D8, 0x8DBA, 0xB36C, 0x8DBC, 0xD7D6,\n\t0x8DBE, 0xB36B, 0x8DBF, 0xD7D9, 0x8DC1, 0xD7DA, 0x8DC2, 0xD7D7,\t0x8DC5, 0xDBFB, 0x8DC6, 0xB660, 0x8DC7, 0xDBF3, 0x8DC8, 0xDBF9,\n\t0x8DCB, 0xB65B, 0x8DCC, 0xB65E, 0x8DCD, 0xDBF2, 0x8DCE, 0xB659,\t0x8DCF, 0xDBF6, 0x8DD0, 0xE06C, 0x8DD1, 0xB65D, 0x8DD3, 0xDBF1,\n\t0x8DD5, 0xDBF7, 0x8DD6, 0xDBF4, 0x8DD7, 0xDBFA, 0x8DD8, 0xDBF0,\t0x8DD9, 0xDBF8, 0x8DDA, 0xB65C, 0x8DDB, 0xB65F, 0x8DDC, 0xDBF5,\n\t0x8DDD, 0xB65A, 0x8DDF, 0xB8F2, 0x8DE0, 0xE068, 0x8DE1, 0xB8F1,\t0x8DE2, 0xE06F, 0x8DE3, 0xE06E, 0x8DE4, 0xB8F8, 0x8DE6, 0xB8F9,\n\t0x8DE7, 0xE070, 0x8DE8, 0xB8F3, 0x8DE9, 0xE06D, 0x8DEA, 0xB8F7,\t0x8DEB, 0xE072, 0x8DEC, 0xE069, 0x8DEE, 0xE06B, 0x8DEF, 0xB8F4,\n\t0x8DF0, 0xE067, 0x8DF1, 0xE06A, 0x8DF2, 0xE071, 0x8DF3, 0xB8F5,\t0x8DF4, 0xE073, 0x8DFA, 0xB8F6, 0x8DFC, 0xBBB1, 0x8DFD, 0xE45B,\n\t0x8DFE, 0xE461, 0x8DFF, 0xE459, 0x8E00, 0xE462, 0x8E02, 0xE458,\t0x8E03, 0xE45D, 0x8E04, 0xE463, 0x8E05, 0xE460, 0x8E06, 0xE45F,\n\t0x8E07, 0xE45E, 0x8E09, 0xE457, 0x8E0A, 0xE45C, 0x8E0D, 0xE45A,\t0x8E0F, 0xBDF1, 0x8E10, 0xBDEE, 0x8E11, 0xE7FB, 0x8E12, 0xE841,\n\t0x8E13, 0xE843, 0x8E14, 0xE840, 0x8E15, 0xE7F8, 0x8E16, 0xE7FA,\t0x8E17, 0xE845, 0x8E18, 0xE842, 0x8E19, 0xE7FC, 0x8E1A, 0xE846,\n\t0x8E1B, 0xE7F9, 0x8E1C, 0xE844, 0x8E1D, 0xBDEF, 0x8E1E, 0xBDF5,\t0x8E1F, 0xBDF3, 0x8E20, 0xE7F3, 0x8E21, 0xBDF4, 0x8E22, 0xBDF0,\n\t0x8E23, 0xE7F4, 0x8E24, 0xE7F6, 0x8E25, 0xE7F5, 0x8E26, 0xE7FD,\t0x8E27, 0xE7FE, 0x8E29, 0xBDF2, 0x8E2B, 0xBDED, 0x8E2E, 0xE7F7,\n\t0x8E30, 0xEBC6, 0x8E31, 0xBFE2, 0x8E33, 0xEBBD, 0x8E34, 0xBFE3,\t0x8E35, 0xBFE6, 0x8E36, 0xEBC2, 0x8E38, 0xEBBF, 0x8E39, 0xBFE5,\n\t0x8E3C, 0xEBC3, 0x8E3D, 0xEBC4, 0x8E3E, 0xEBBE, 0x8E3F, 0xEBC7,\t0x8E40, 0xEBC0, 0x8E41, 0xEBC5, 0x8E42, 0xBFE4, 0x8E44, 0xBFE1,\n\t0x8E45, 0xEBC1, 0x8E47, 0xEEBF, 0x8E48, 0xC1D0, 0x8E49, 0xC1CE,\t0x8E4A, 0xC1D1, 0x8E4B, 0xC1CF, 0x8E4C, 0xEEBE, 0x8E4D, 0xEEBB,\n\t0x8E4E, 0xEEBA, 0x8E50, 0xEEBD, 0x8E53, 0xEEBC, 0x8E54, 0xF145,\t0x8E55, 0xC2DE, 0x8E56, 0xF0FB, 0x8E57, 0xF0FA, 0x8E59, 0xC2D9,\n\t0x8E5A, 0xF141, 0x8E5B, 0xF140, 0x8E5C, 0xF0F7, 0x8E5D, 0xF143,\t0x8E5E, 0xF0FC, 0x8E5F, 0xC2DD, 0x8E60, 0xF0F9, 0x8E61, 0xF142,\n\t0x8E62, 0xF0F8, 0x8E63, 0xC2DA, 0x8E64, 0xC2DC, 0x8E65, 0xF0FD,\t0x8E66, 0xC2DB, 0x8E67, 0xF0FE, 0x8E69, 0xF144, 0x8E6A, 0xF352,\n\t0x8E6C, 0xC3DE, 0x8E6D, 0xF34F, 0x8E6F, 0xF353, 0x8E72, 0xC3DB,\t0x8E73, 0xF351, 0x8E74, 0xC3E0, 0x8E76, 0xC3DD, 0x8E78, 0xF350,\n\t0x8E7A, 0xC3DF, 0x8E7B, 0xF354, 0x8E7C, 0xC3DA, 0x8E81, 0xC4BC,\t0x8E82, 0xC4BE, 0x8E84, 0xF4D9, 0x8E85, 0xC4BD, 0x8E86, 0xF4D7,\n\t0x8E87, 0xC3DC, 0x8E88, 0xF4D8, 0x8E89, 0xC4BB, 0x8E8A, 0xC543,\t0x8E8B, 0xC545, 0x8E8C, 0xF656, 0x8E8D, 0xC544, 0x8E8E, 0xF655,\n\t0x8E90, 0xF761, 0x8E91, 0xC5AD, 0x8E92, 0xF760, 0x8E93, 0xC5AE,\t0x8E94, 0xF75E, 0x8E95, 0xF75D, 0x8E96, 0xF762, 0x8E97, 0xF763,\n\t0x8E98, 0xF846, 0x8E9A, 0xF75F, 0x8E9D, 0xF8C6, 0x8E9E, 0xF8C3,\t0x8E9F, 0xF8C4, 0x8EA0, 0xF8C5, 0x8EA1, 0xC65C, 0x8EA3, 0xF951,\n\t0x8EA4, 0xF950, 0x8EA5, 0xF94F, 0x8EA6, 0xF970, 0x8EA8, 0xF9BE,\t0x8EA9, 0xF9AB, 0x8EAA, 0xC66E, 0x8EAB, 0xA8AD, 0x8EAC, 0xB060,\n\t0x8EB2, 0xB8FA, 0x8EBA, 0xBDF6, 0x8EBD, 0xEBC8, 0x8EC0, 0xC2DF,\t0x8EC2, 0xF355, 0x8EC9, 0xF9AC, 0x8ECA, 0xA8AE, 0x8ECB, 0xAAEE,\n\t0x8ECC, 0xAD79, 0x8ECD, 0xAD78, 0x8ECF, 0xB063, 0x8ED1, 0xD3E8,\t0x8ED2, 0xB061, 0x8ED3, 0xD3E9, 0x8ED4, 0xB062, 0x8ED7, 0xD7DF,\n\t0x8ED8, 0xD7DB, 0x8EDB, 0xB36D, 0x8EDC, 0xD7DE, 0x8EDD, 0xD7DD,\t0x8EDE, 0xD7DC, 0x8EDF, 0xB36E, 0x8EE0, 0xD7E0, 0x8EE1, 0xD7E1,\n\t0x8EE5, 0xDC43, 0x8EE6, 0xDC41, 0x8EE7, 0xDC45, 0x8EE8, 0xDC46,\t0x8EE9, 0xDC4C, 0x8EEB, 0xDC48, 0x8EEC, 0xDC4A, 0x8EEE, 0xDC42,\n\t0x8EEF, 0xDBFC, 0x8EF1, 0xDC49, 0x8EF4, 0xDC4B, 0x8EF5, 0xDC44,\t0x8EF6, 0xDC47, 0x8EF7, 0xDBFD, 0x8EF8, 0xB662, 0x8EF9, 0xDC40,\n\t0x8EFA, 0xDBFE, 0x8EFB, 0xB661, 0x8EFC, 0xB663, 0x8EFE, 0xB8FD,\t0x8EFF, 0xE075, 0x8F00, 0xE077, 0x8F01, 0xE076, 0x8F02, 0xE07B,\n\t0x8F03, 0xB8FB, 0x8F05, 0xE078, 0x8F06, 0xE074, 0x8F07, 0xE079,\t0x8F08, 0xE07A, 0x8F09, 0xB8FC, 0x8F0A, 0xB8FE, 0x8F0B, 0xE07C,\n\t0x8F0D, 0xE467, 0x8F0E, 0xE466, 0x8F10, 0xE464, 0x8F11, 0xE465,\t0x8F12, 0xBBB3, 0x8F13, 0xBBB5, 0x8F14, 0xBBB2, 0x8F15, 0xBBB4,\n\t0x8F16, 0xE84D, 0x8F17, 0xE84E, 0x8F18, 0xE849, 0x8F1A, 0xE84A,\t0x8F1B, 0xBDF8, 0x8F1C, 0xBDFD, 0x8F1D, 0xBDF7, 0x8F1E, 0xBDFE,\n\t0x8F1F, 0xBDF9, 0x8F20, 0xE84B, 0x8F23, 0xE84C, 0x8F24, 0xE848,\t0x8F25, 0xBE40, 0x8F26, 0xBDFB, 0x8F29, 0xBDFA, 0x8F2A, 0xBDFC,\n\t0x8F2C, 0xE847, 0x8F2E, 0xEBCA, 0x8F2F, 0xBFE8, 0x8F32, 0xEBCC,\t0x8F33, 0xBFEA, 0x8F34, 0xEBCF, 0x8F35, 0xEBCB, 0x8F36, 0xEBC9,\n\t0x8F37, 0xEBCE, 0x8F38, 0xBFE9, 0x8F39, 0xEBCD, 0x8F3B, 0xBFE7,\t0x8F3E, 0xC1D3, 0x8F3F, 0xC1D6, 0x8F40, 0xEEC1, 0x8F42, 0xC1D4,\n\t0x8F43, 0xEEC0, 0x8F44, 0xC1D2, 0x8F45, 0xC1D5, 0x8F46, 0xF146,\t0x8F47, 0xF147, 0x8F48, 0xF148, 0x8F49, 0xC2E0, 0x8F4B, 0xF149,\n\t0x8F4D, 0xC2E1, 0x8F4E, 0xC3E2, 0x8F4F, 0xF358, 0x8F50, 0xF359,\t0x8F51, 0xF357, 0x8F52, 0xF356, 0x8F53, 0xF35A, 0x8F54, 0xC3E1,\n\t0x8F55, 0xF4DD, 0x8F56, 0xF4DB, 0x8F57, 0xF4DC, 0x8F58, 0xF4DE,\t0x8F59, 0xF4DA, 0x8F5A, 0xF4DF, 0x8F5B, 0xF658, 0x8F5D, 0xF659,\n\t0x8F5E, 0xF657, 0x8F5F, 0xC546, 0x8F60, 0xF764, 0x8F61, 0xC5AF,\t0x8F62, 0xF765, 0x8F63, 0xF848, 0x8F64, 0xF847, 0x8F9B, 0xA8AF,\n\t0x8F9C, 0xB664, 0x8F9F, 0xB940, 0x8FA3, 0xBBB6, 0x8FA6, 0xBFEC,\t0x8FA8, 0xBFEB, 0x8FAD, 0xC3E3, 0x8FAE, 0xC47C, 0x8FAF, 0xC547,\n\t0x8FB0, 0xA8B0, 0x8FB1, 0xB064, 0x8FB2, 0xB941, 0x8FB4, 0xF35B,\t0x8FBF, 0xCBA6, 0x8FC2, 0xA8B1, 0x8FC4, 0xA8B4, 0x8FC5, 0xA8B3,\n\t0x8FC6, 0xA8B2, 0x8FC9, 0xCBA5, 0x8FCB, 0xCDCD, 0x8FCD, 0xCDCF,\t0x8FCE, 0xAAEF, 0x8FD1, 0xAAF1, 0x8FD2, 0xCDCC, 0x8FD3, 0xCDCE,\n\t0x8FD4, 0xAAF0, 0x8FD5, 0xCDD1, 0x8FD6, 0xCDD0, 0x8FD7, 0xCDD2,\t0x8FE0, 0xD0B6, 0x8FE1, 0xD0B4, 0x8FE2, 0xAD7C, 0x8FE3, 0xD0B3,\n\t0x8FE4, 0xADA3, 0x8FE5, 0xAD7E, 0x8FE6, 0xAD7B, 0x8FE8, 0xADA4,\t0x8FEA, 0xAD7D, 0x8FEB, 0xADA2, 0x8FED, 0xADA1, 0x8FEE, 0xD0B5,\n\t0x8FF0, 0xAD7A, 0x8FF4, 0xB06A, 0x8FF5, 0xD3EB, 0x8FF6, 0xD3F1,\t0x8FF7, 0xB067, 0x8FF8, 0xB06E, 0x8FFA, 0xB069, 0x8FFB, 0xD3EE,\n\t0x8FFC, 0xD3F0, 0x8FFD, 0xB06C, 0x8FFE, 0xD3EA, 0x8FFF, 0xD3ED,\t0x9000, 0xB068, 0x9001, 0xB065, 0x9002, 0xD3EC, 0x9003, 0xB06B,\n\t0x9004, 0xD3EF, 0x9005, 0xB06D, 0x9006, 0xB066, 0x900B, 0xD7E3,\t0x900C, 0xD7E6, 0x900D, 0xB370, 0x900F, 0xB37A, 0x9010, 0xB376,\n\t0x9011, 0xD7E4, 0x9014, 0xB37E, 0x9015, 0xB377, 0x9016, 0xB37C,\t0x9017, 0xB372, 0x9019, 0xB36F, 0x901A, 0xB371, 0x901B, 0xB37D,\n\t0x901C, 0xD7E5, 0x901D, 0xB375, 0x901E, 0xB378, 0x901F, 0xB374,\t0x9020, 0xB379, 0x9021, 0xD7E7, 0x9022, 0xB37B, 0x9023, 0xB373,\n\t0x9024, 0xD7E2, 0x902D, 0xDC4D, 0x902E, 0xB665, 0x902F, 0xDC4F,\t0x9031, 0xB667, 0x9032, 0xB669, 0x9034, 0xDC4E, 0x9035, 0xB666,\n\t0x9036, 0xB66A, 0x9038, 0xB668, 0x903C, 0xB947, 0x903D, 0xE0A3,\t0x903E, 0xB94F, 0x903F, 0xE07E, 0x9041, 0xB950, 0x9042, 0xB945,\n\t0x9044, 0xE0A1, 0x9047, 0xB94A, 0x9049, 0xE0A2, 0x904A, 0xB943,\t0x904B, 0xB942, 0x904D, 0xB94D, 0x904E, 0xB94C, 0x904F, 0xB94B,\n\t0x9050, 0xB949, 0x9051, 0xB94E, 0x9052, 0xE07D, 0x9053, 0xB944,\t0x9054, 0xB946, 0x9055, 0xB948, 0x9058, 0xBBB8, 0x9059, 0xBBBB,\n\t0x905B, 0xBBBF, 0x905C, 0xBBB9, 0x905D, 0xBBBE, 0x905E, 0xBBBC,\t0x9060, 0xBBB7, 0x9062, 0xBBBD, 0x9063, 0xBBBA, 0x9067, 0xE852,\n\t0x9068, 0xBE43, 0x9069, 0xBE41, 0x906B, 0xE853, 0x906D, 0xBE44,\t0x906E, 0xBE42, 0x906F, 0xE851, 0x9070, 0xE850, 0x9072, 0xBFF0,\n\t0x9073, 0xE84F, 0x9074, 0xBFEE, 0x9075, 0xBFED, 0x9076, 0xEBD0,\t0x9077, 0xBE45, 0x9078, 0xBFEF, 0x9079, 0xEBD1, 0x907A, 0xBFF2,\n\t0x907B, 0xEBD2, 0x907C, 0xBFF1, 0x907D, 0xC1D8, 0x907E, 0xEEC3,\t0x907F, 0xC1D7, 0x9080, 0xC1DC, 0x9081, 0xC1DA, 0x9082, 0xC1DB,\n\t0x9083, 0xC2E3, 0x9084, 0xC1D9, 0x9085, 0xEEC2, 0x9086, 0xEBD3,\t0x9087, 0xC2E2, 0x9088, 0xC2E4, 0x908A, 0xC3E4, 0x908B, 0xC3E5,\n\t0x908D, 0xF4E0, 0x908F, 0xC5DE, 0x9090, 0xC5DD, 0x9091, 0xA8B6,\t0x9094, 0xCA55, 0x9095, 0xB06F, 0x9097, 0xCA52, 0x9098, 0xCA53,\n\t0x9099, 0xCA51, 0x909B, 0xCA54, 0x909E, 0xCBAA, 0x909F, 0xCBA7,\t0x90A0, 0xCBAC, 0x90A1, 0xCBA8, 0x90A2, 0xA8B7, 0x90A3, 0xA8BA,\n\t0x90A5, 0xCBA9, 0x90A6, 0xA8B9, 0x90A7, 0xCBAB, 0x90AA, 0xA8B8,\t0x90AF, 0xCDD5, 0x90B0, 0xCDD7, 0x90B1, 0xAAF4, 0x90B2, 0xCDD3,\n\t0x90B3, 0xCDD6, 0x90B4, 0xCDD4, 0x90B5, 0xAAF2, 0x90B6, 0xAAF5,\t0x90B8, 0xAAF3, 0x90BD, 0xD0B8, 0x90BE, 0xD0BC, 0x90BF, 0xD0B9,\n\t0x90C1, 0xADA7, 0x90C3, 0xADA8, 0x90C5, 0xD0BB, 0x90C7, 0xD0BD,\t0x90C8, 0xD0BF, 0x90CA, 0xADA5, 0x90CB, 0xD0BE, 0x90CE, 0xADA6,\n\t0x90D4, 0xD7EE, 0x90D5, 0xD0BA, 0x90D6, 0xD3F2, 0x90D7, 0xD3FB,\t0x90D8, 0xD3F9, 0x90D9, 0xD3F4, 0x90DA, 0xD3F5, 0x90DB, 0xD3FA,\n\t0x90DC, 0xD3FC, 0x90DD, 0xB071, 0x90DF, 0xD3F7, 0x90E0, 0xD3F3,\t0x90E1, 0xB070, 0x90E2, 0xB072, 0x90E3, 0xD3F6, 0x90E4, 0xD3FD,\n\t0x90E5, 0xD3F8, 0x90E8, 0xB3A1, 0x90E9, 0xD7F1, 0x90EA, 0xD7E9,\t0x90EB, 0xD7EF, 0x90EC, 0xD7F0, 0x90ED, 0xB3A2, 0x90EF, 0xD7E8,\n\t0x90F0, 0xD7EA, 0x90F1, 0xD0B7, 0x90F2, 0xD7EC, 0x90F3, 0xD7ED,\t0x90F4, 0xD7EB, 0x90F5, 0xB66C, 0x90F9, 0xDC56, 0x90FA, 0xEBD4,\n\t0x90FB, 0xDC57, 0x90FC, 0xDC54, 0x90FD, 0xB3A3, 0x90FE, 0xB66E,\t0x90FF, 0xDC53, 0x9100, 0xDC59, 0x9101, 0xDC58, 0x9102, 0xB66B,\n\t0x9103, 0xDC5C, 0x9104, 0xDC52, 0x9105, 0xDC5B, 0x9106, 0xDC50,\t0x9107, 0xDC5A, 0x9108, 0xDC55, 0x9109, 0xB66D, 0x910B, 0xE0AA,\n\t0x910D, 0xE0A5, 0x910E, 0xE0AB, 0x910F, 0xE0A6, 0x9110, 0xE0A4,\t0x9111, 0xE0A7, 0x9112, 0xB951, 0x9114, 0xE0A9, 0x9116, 0xE0A8,\n\t0x9117, 0xB952, 0x9118, 0xBBC1, 0x9119, 0xBBC0, 0x911A, 0xE46E,\t0x911B, 0xE471, 0x911C, 0xE469, 0x911D, 0xE46D, 0x911E, 0xBBC2,\n\t0x911F, 0xE46C, 0x9120, 0xE46A, 0x9121, 0xE470, 0x9122, 0xE46B,\t0x9123, 0xE468, 0x9124, 0xE46F, 0x9126, 0xE859, 0x9127, 0xBE48,\n\t0x9128, 0xF14A, 0x9129, 0xE856, 0x912A, 0xE857, 0x912B, 0xE855,\t0x912C, 0xDC51, 0x912D, 0xBE47, 0x912E, 0xE85A, 0x912F, 0xE854,\n\t0x9130, 0xBE46, 0x9131, 0xBE49, 0x9132, 0xE858, 0x9133, 0xEBD5,\t0x9134, 0xBFF3, 0x9135, 0xEBD6, 0x9136, 0xEBD7, 0x9138, 0xEEC4,\n\t0x9139, 0xC1DD, 0x913A, 0xF14B, 0x913B, 0xF14C, 0x913E, 0xF14D,\t0x913F, 0xF35D, 0x9140, 0xF35C, 0x9141, 0xF4E2, 0x9143, 0xF4E1,\n\t0x9144, 0xF65B, 0x9145, 0xF65C, 0x9146, 0xF65A, 0x9147, 0xF766,\t0x9148, 0xC5B0, 0x9149, 0xA8BB, 0x914A, 0xADAA, 0x914B, 0xADA9,\n\t0x914C, 0xB075, 0x914D, 0xB074, 0x914E, 0xD440, 0x914F, 0xD441,\t0x9150, 0xD3FE, 0x9152, 0xB073, 0x9153, 0xD7F5, 0x9155, 0xD7F6,\n\t0x9156, 0xD7F2, 0x9157, 0xB3A4, 0x9158, 0xD7F3, 0x915A, 0xD7F4,\t0x915F, 0xDC5F, 0x9160, 0xDC61, 0x9161, 0xDC5D, 0x9162, 0xDC60,\n\t0x9163, 0xB66F, 0x9164, 0xDC5E, 0x9165, 0xB670, 0x9168, 0xDD73,\t0x9169, 0xB955, 0x916A, 0xB954, 0x916C, 0xB953, 0x916E, 0xE0AC,\n\t0x916F, 0xE0AD, 0x9172, 0xE473, 0x9173, 0xE475, 0x9174, 0xBBC6,\t0x9175, 0xBBC3, 0x9177, 0xBBC5, 0x9178, 0xBBC4, 0x9179, 0xE474,\n\t0x917A, 0xE472, 0x9180, 0xE861, 0x9181, 0xE85E, 0x9182, 0xE85F,\t0x9183, 0xBE4D, 0x9184, 0xE860, 0x9185, 0xE85B, 0x9186, 0xE85C,\n\t0x9187, 0xBE4A, 0x9189, 0xBE4B, 0x918A, 0xE85D, 0x918B, 0xBE4C,\t0x918D, 0xEBDB, 0x918F, 0xEBDC, 0x9190, 0xEBD9, 0x9191, 0xEBDA,\n\t0x9192, 0xBFF4, 0x9193, 0xEBD8, 0x9199, 0xEEC8, 0x919A, 0xEEC5,\t0x919B, 0xEEC7, 0x919C, 0xC1E0, 0x919D, 0xEECB, 0x919E, 0xC1DF,\n\t0x919F, 0xEEC9, 0x91A0, 0xEECC, 0x91A1, 0xEECA, 0x91A2, 0xEEC6,\t0x91A3, 0xC1DE, 0x91A5, 0xF14F, 0x91A7, 0xF150, 0x91A8, 0xF14E,\n\t0x91AA, 0xF152, 0x91AB, 0xC2E5, 0x91AC, 0xC2E6, 0x91AD, 0xF35F,\t0x91AE, 0xC3E7, 0x91AF, 0xF151, 0x91B0, 0xF35E, 0x91B1, 0xC3E6,\n\t0x91B2, 0xF4E5, 0x91B3, 0xF4E6, 0x91B4, 0xC4BF, 0x91B5, 0xF4E4,\t0x91B7, 0xF4E3, 0x91B9, 0xF65D, 0x91BA, 0xC548, 0x91BC, 0xF849,\n\t0x91BD, 0xF8C8, 0x91BE, 0xF8C7, 0x91C0, 0xC643, 0x91C1, 0xC65D,\t0x91C2, 0xF8C9, 0x91C3, 0xF971, 0x91C5, 0xC66F, 0x91C6, 0xA8BC,\n\t0x91C7, 0xAAF6, 0x91C9, 0xB956, 0x91CB, 0xC4C0, 0x91CC, 0xA8BD,\t0x91CD, 0xADAB, 0x91CE, 0xB3A5, 0x91CF, 0xB671, 0x91D0, 0xC2E7,\n\t0x91D1, 0xAAF7, 0x91D3, 0xD0C1, 0x91D4, 0xD0C0, 0x91D5, 0xD442,\t0x91D7, 0xB078, 0x91D8, 0xB076, 0x91D9, 0xB07A, 0x91DA, 0xD444,\n\t0x91DC, 0xB079, 0x91DD, 0xB077, 0x91E2, 0xD443, 0x91E3, 0xB3A8,\t0x91E4, 0xD7FC, 0x91E6, 0xB3A7, 0x91E7, 0xB3A9, 0x91E8, 0xD842,\n\t0x91E9, 0xB3AB, 0x91EA, 0xD7FE, 0x91EB, 0xD840, 0x91EC, 0xD7F7,\t0x91ED, 0xB3AA, 0x91EE, 0xD843, 0x91F1, 0xD7F9, 0x91F3, 0xD7FA,\n\t0x91F4, 0xD7F8, 0x91F5, 0xB3A6, 0x91F7, 0xD841, 0x91F8, 0xD7FB,\t0x91F9, 0xD7FD, 0x91FD, 0xDC6D, 0x91FF, 0xDC6C, 0x9200, 0xDC6A,\n\t0x9201, 0xDC62, 0x9202, 0xDC71, 0x9203, 0xDC65, 0x9204, 0xDC6F,\t0x9205, 0xDC76, 0x9206, 0xDC6E, 0x9207, 0xB679, 0x9209, 0xB675,\n\t0x920A, 0xDC63, 0x920C, 0xDC69, 0x920D, 0xB677, 0x920F, 0xDC68,\t0x9210, 0xB678, 0x9211, 0xB67A, 0x9212, 0xDC6B, 0x9214, 0xB672,\n\t0x9215, 0xB673, 0x9216, 0xDC77, 0x9217, 0xDC75, 0x9219, 0xDC74,\t0x921A, 0xDC66, 0x921C, 0xDC72, 0x921E, 0xB676, 0x9223, 0xB674,\n\t0x9224, 0xDC73, 0x9225, 0xDC64, 0x9226, 0xDC67, 0x9227, 0xDC70,\t0x922D, 0xE4BA, 0x922E, 0xE0B7, 0x9230, 0xE0B0, 0x9231, 0xE0C3,\n\t0x9232, 0xE0CC, 0x9233, 0xE0B3, 0x9234, 0xB961, 0x9236, 0xE0C0,\t0x9237, 0xB957, 0x9238, 0xB959, 0x9239, 0xB965, 0x923A, 0xE0B1,\n\t0x923D, 0xB95A, 0x923E, 0xB95C, 0x923F, 0xB966, 0x9240, 0xB95B,\t0x9245, 0xB964, 0x9246, 0xE0B9, 0x9248, 0xE0AE, 0x9249, 0xB962,\n\t0x924A, 0xE0B8, 0x924B, 0xB95E, 0x924C, 0xE0CA, 0x924D, 0xB963,\t0x924E, 0xE0C8, 0x924F, 0xE0BC, 0x9250, 0xE0C6, 0x9251, 0xB960,\n\t0x9252, 0xE0AF, 0x9253, 0xE0C9, 0x9254, 0xE0C4, 0x9256, 0xE0CB,\t0x9257, 0xB958, 0x925A, 0xB967, 0x925B, 0xB95D, 0x925E, 0xE0B5,\n\t0x9260, 0xE0BD, 0x9261, 0xE0C1, 0x9263, 0xE0C5, 0x9264, 0xB95F,\t0x9265, 0xE0B4, 0x9266, 0xE0B2, 0x9267, 0xE0BE, 0x926C, 0xE0BB,\n\t0x926D, 0xE0BA, 0x926F, 0xE0BF, 0x9270, 0xE0C2, 0x9272, 0xE0C7,\t0x9276, 0xE478, 0x9278, 0xBBC7, 0x9279, 0xE4A4, 0x927A, 0xE47A,\n\t0x927B, 0xBBCC, 0x927C, 0xBBD0, 0x927D, 0xE4AD, 0x927E, 0xE4B5,\t0x927F, 0xE4A6, 0x9280, 0xBBC8, 0x9282, 0xE4AA, 0x9283, 0xE0B6,\n\t0x9285, 0xBBC9, 0x9286, 0xE4B1, 0x9287, 0xE4B6, 0x9288, 0xE4AE,\t0x928A, 0xE4B0, 0x928B, 0xE4B9, 0x928C, 0xE4B2, 0x928D, 0xE47E,\n\t0x928E, 0xE4A9, 0x9291, 0xBBD1, 0x9293, 0xBBCD, 0x9294, 0xE47C,\t0x9295, 0xE4AB, 0x9296, 0xBBCB, 0x9297, 0xE4A5, 0x9298, 0xBBCA,\n\t0x9299, 0xE4B3, 0x929A, 0xE4A2, 0x929B, 0xE479, 0x929C, 0xBBCE,\t0x929D, 0xE4B8, 0x92A0, 0xE47B, 0x92A1, 0xE4AF, 0x92A2, 0xE4AC,\n\t0x92A3, 0xE4A7, 0x92A4, 0xE477, 0x92A5, 0xE476, 0x92A6, 0xE4A1,\t0x92A7, 0xE4B4, 0x92A8, 0xBBCF, 0x92A9, 0xE4B7, 0x92AA, 0xE47D,\n\t0x92AB, 0xE4A3, 0x92AC, 0xBE52, 0x92B2, 0xBE5A, 0x92B3, 0xBE55,\t0x92B4, 0xE8A4, 0x92B5, 0xE8A1, 0x92B6, 0xE867, 0x92B7, 0xBE50,\n\t0x92B9, 0xF9D7, 0x92BB, 0xBE4F, 0x92BC, 0xBE56, 0x92C0, 0xE865,\t0x92C1, 0xBE54, 0x92C2, 0xE871, 0x92C3, 0xE863, 0x92C4, 0xE864,\n\t0x92C5, 0xBE4E, 0x92C6, 0xE8A3, 0x92C7, 0xBE58, 0x92C8, 0xE874,\t0x92C9, 0xE879, 0x92CA, 0xE873, 0x92CB, 0xEBEE, 0x92CC, 0xE86F,\n\t0x92CD, 0xE877, 0x92CE, 0xE875, 0x92CF, 0xE868, 0x92D0, 0xE862,\t0x92D1, 0xE87D, 0x92D2, 0xBE57, 0x92D3, 0xE87E, 0x92D5, 0xE878,\n\t0x92D7, 0xE86D, 0x92D8, 0xE86B, 0x92D9, 0xE866, 0x92DD, 0xE86E,\t0x92DE, 0xE87B, 0x92DF, 0xE86A, 0x92E0, 0xE87A, 0x92E1, 0xE8A2,\n\t0x92E4, 0xBE53, 0x92E6, 0xE876, 0x92E7, 0xE87C, 0x92E8, 0xE872,\t0x92E9, 0xE86C, 0x92EA, 0xBE51, 0x92EE, 0xE4A8, 0x92EF, 0xE870,\n\t0x92F0, 0xBE59, 0x92F1, 0xE869, 0x92F7, 0xEBF4, 0x92F8, 0xBFF7,\t0x92F9, 0xEBF3, 0x92FA, 0xEBF0, 0x92FB, 0xEC44, 0x92FC, 0xBFFB,\n\t0x92FE, 0xEC41, 0x92FF, 0xEBF8, 0x9300, 0xEC43, 0x9301, 0xEBE9,\t0x9302, 0xEBF6, 0x9304, 0xBFFD, 0x9306, 0xEBE1, 0x9308, 0xEBDF,\n\t0x9309, 0xEC42, 0x930B, 0xEC40, 0x930C, 0xEBFE, 0x930D, 0xEBED,\t0x930E, 0xEBEC, 0x930F, 0xEBE2, 0x9310, 0xC040, 0x9312, 0xEBE8,\n\t0x9313, 0xEBF2, 0x9314, 0xEBFD, 0x9315, 0xC043, 0x9316, 0xEC45,\t0x9318, 0xC1E8, 0x9319, 0xC045, 0x931A, 0xBFFE, 0x931B, 0xEBE6,\n\t0x931D, 0xEBEF, 0x931E, 0xEBDE, 0x931F, 0xEBE0, 0x9320, 0xBFF5,\t0x9321, 0xC042, 0x9322, 0xBFFA, 0x9323, 0xEBE7, 0x9324, 0xEBF7,\n\t0x9325, 0xEBF1, 0x9326, 0xC041, 0x9327, 0xEBDD, 0x9328, 0xC1E3,\t0x9329, 0xEBF9, 0x932A, 0xEBFC, 0x932B, 0xBFFC, 0x932D, 0xEBEB,\n\t0x932E, 0xC044, 0x932F, 0xBFF9, 0x9333, 0xBFF8, 0x9334, 0xEBF5,\t0x9335, 0xEBFB, 0x9336, 0xBFF6, 0x9338, 0xEBE4, 0x9339, 0xEBFA,\n\t0x933C, 0xEBE5, 0x9346, 0xEBEA, 0x9347, 0xEED2, 0x9349, 0xEED7,\t0x934A, 0xC1E5, 0x934B, 0xC1E7, 0x934C, 0xEEDD, 0x934D, 0xC1E1,\n\t0x934E, 0xEEEC, 0x934F, 0xEEE3, 0x9350, 0xEED8, 0x9351, 0xEED9,\t0x9352, 0xEEE2, 0x9354, 0xC1EE, 0x9355, 0xEEE1, 0x9356, 0xEED1,\n\t0x9357, 0xEEE0, 0x9358, 0xEED4, 0x9359, 0xEEED, 0x935A, 0xC1ED,\t0x935B, 0xC1EB, 0x935C, 0xEED5, 0x935E, 0xEEE8, 0x9360, 0xEEDA,\n\t0x9361, 0xEEE7, 0x9363, 0xEEE9, 0x9364, 0xEED0, 0x9365, 0xC1E6,\t0x9367, 0xEEEA, 0x936A, 0xEEDE, 0x936C, 0xC1EA, 0x936D, 0xEEDB,\n\t0x9370, 0xC1EC, 0x9371, 0xEEE4, 0x9375, 0xC1E4, 0x9376, 0xEED6,\t0x9377, 0xEEE5, 0x9379, 0xEEDF, 0x937A, 0xEBE3, 0x937B, 0xEEE6,\n\t0x937C, 0xEED3, 0x937E, 0xC1E9, 0x9380, 0xEEEB, 0x9382, 0xC1E2,\t0x9383, 0xEECE, 0x9388, 0xF160, 0x9389, 0xF159, 0x938A, 0xC2E9,\n\t0x938C, 0xF154, 0x938D, 0xF163, 0x938E, 0xF15B, 0x938F, 0xEEDC,\t0x9391, 0xF165, 0x9392, 0xF155, 0x9394, 0xC2E8, 0x9395, 0xF15F,\n\t0x9396, 0xC2EA, 0x9397, 0xC2F2, 0x9398, 0xC2F0, 0x9399, 0xF161,\t0x939A, 0xC2F1, 0x939B, 0xF157, 0x939D, 0xF158, 0x939E, 0xF15D,\n\t0x939F, 0xF162, 0x93A1, 0xEECD, 0x93A2, 0xC2EB, 0x93A3, 0xF16A,\t0x93A4, 0xF167, 0x93A5, 0xF16B, 0x93A6, 0xF15E, 0x93A7, 0xF15A,\n\t0x93A8, 0xF168, 0x93A9, 0xF36A, 0x93AA, 0xF15C, 0x93AC, 0xC2EE,\t0x93AE, 0xC2ED, 0x93AF, 0xEECF, 0x93B0, 0xC2EF, 0x93B1, 0xF164,\n\t0x93B2, 0xF166, 0x93B3, 0xC2EC, 0x93B4, 0xF169, 0x93B5, 0xF153,\t0x93B7, 0xF156, 0x93C0, 0xF373, 0x93C2, 0xF363, 0x93C3, 0xC3EB,\n\t0x93C4, 0xF371, 0x93C7, 0xF361, 0x93C8, 0xC3EC, 0x93CA, 0xF36C,\t0x93CC, 0xF368, 0x93CD, 0xC3F1, 0x93CE, 0xF372, 0x93CF, 0xF362,\n\t0x93D0, 0xF365, 0x93D1, 0xC3E9, 0x93D2, 0xF374, 0x93D4, 0xF36D,\t0x93D5, 0xF370, 0x93D6, 0xC3EF, 0x93D7, 0xC3F4, 0x93D8, 0xC3F2,\n\t0x93D9, 0xF369, 0x93DA, 0xF364, 0x93DC, 0xC3ED, 0x93DD, 0xC3EE,\t0x93DE, 0xF360, 0x93DF, 0xC3EA, 0x93E1, 0xC3E8, 0x93E2, 0xC3F0,\n\t0x93E3, 0xF36F, 0x93E4, 0xC3F3, 0x93E6, 0xF36B, 0x93E7, 0xF375,\t0x93E8, 0xC3F5, 0x93EC, 0xF367, 0x93EE, 0xF36E, 0x93F5, 0xF4F3,\n\t0x93F6, 0xF542, 0x93F7, 0xF4F5, 0x93F8, 0xF4FC, 0x93F9, 0xF366,\t0x93FA, 0xF4FA, 0x93FB, 0xF4E9, 0x93FC, 0xF540, 0x93FD, 0xC4C3,\n\t0x93FE, 0xF4ED, 0x93FF, 0xF4FE, 0x9400, 0xF4F4, 0x9403, 0xC4C2,\t0x9406, 0xF544, 0x9407, 0xF4F6, 0x9409, 0xF4FB, 0x940A, 0xF4FD,\n\t0x940B, 0xF4E7, 0x940C, 0xF541, 0x940D, 0xF4F2, 0x940E, 0xF4F7,\t0x940F, 0xF4EB, 0x9410, 0xF4EF, 0x9411, 0xF543, 0x9412, 0xF4F9,\n\t0x9413, 0xF4E8, 0x9414, 0xF4EC, 0x9415, 0xF4EE, 0x9416, 0xF4F8,\t0x9418, 0xC4C1, 0x9419, 0xF4F1, 0x9420, 0xF4EA, 0x9428, 0xF4F0,\n\t0x9429, 0xF661, 0x942A, 0xF666, 0x942B, 0xC54F, 0x942C, 0xF668,\t0x942E, 0xC549, 0x9430, 0xF664, 0x9431, 0xF66A, 0x9432, 0xC54E,\n\t0x9433, 0xC54A, 0x9435, 0xC54B, 0x9436, 0xF660, 0x9437, 0xF667,\t0x9438, 0xC54D, 0x9439, 0xF665, 0x943A, 0xC54C, 0x943B, 0xF65F,\n\t0x943C, 0xF663, 0x943D, 0xF662, 0x943F, 0xF65E, 0x9440, 0xF669,\t0x9444, 0xC5B1, 0x9445, 0xF76D, 0x9446, 0xF770, 0x9447, 0xF76C,\n\t0x9448, 0xF76E, 0x9449, 0xF76F, 0x944A, 0xF769, 0x944B, 0xF76A,\t0x944C, 0xF767, 0x944F, 0xF76B, 0x9450, 0xF768, 0x9451, 0xC5B2,\n\t0x9452, 0xC5B3, 0x9455, 0xF84B, 0x9457, 0xF84D, 0x945D, 0xF84C,\t0x945E, 0xF84E, 0x9460, 0xC5E0, 0x9462, 0xF84A, 0x9463, 0xC5DF,\n\t0x9464, 0xC5E1, 0x9468, 0xF8CB, 0x9469, 0xF8CC, 0x946A, 0xC644,\t0x946B, 0xF8CA, 0x946D, 0xF953, 0x946E, 0xF952, 0x946F, 0xF954,\n\t0x9470, 0xC65F, 0x9471, 0xF955, 0x9472, 0xC65E, 0x9473, 0xF956,\t0x9474, 0xF972, 0x9475, 0xF975, 0x9476, 0xF974, 0x9477, 0xC668,\n\t0x9478, 0xF973, 0x947C, 0xC672, 0x947D, 0xC670, 0x947E, 0xC671,\t0x947F, 0xC677, 0x9480, 0xF9C0, 0x9481, 0xF9C1, 0x9482, 0xF9BF,\n\t0x9483, 0xF9C9, 0x9577, 0xAAF8, 0x957A, 0xD844, 0x957B, 0xDC78,\t0x957C, 0xE8A5, 0x957D, 0xF376, 0x9580, 0xAAF9, 0x9582, 0xADAC,\n\t0x9583, 0xB07B, 0x9586, 0xD845, 0x9588, 0xD846, 0x9589, 0xB3AC,\t0x958B, 0xB67D, 0x958C, 0xDC7A, 0x958D, 0xDC79, 0x958E, 0xB6A3,\n\t0x958F, 0xB67C, 0x9590, 0xDC7B, 0x9591, 0xB67E, 0x9592, 0xB6A2,\t0x9593, 0xB6A1, 0x9594, 0xB67B, 0x9598, 0xB968, 0x959B, 0xE0D0,\n\t0x959C, 0xE0CE, 0x959E, 0xE0CF, 0x959F, 0xE0CD, 0x95A1, 0xBBD2,\t0x95A3, 0xBBD5, 0x95A4, 0xBBD7, 0x95A5, 0xBBD6, 0x95A8, 0xBBD3,\n\t0x95A9, 0xBBD4, 0x95AB, 0xE8A7, 0x95AC, 0xE8A6, 0x95AD, 0xBE5B,\t0x95AE, 0xE8A8, 0x95B0, 0xE8A9, 0x95B1, 0xBE5C, 0x95B5, 0xEC4D,\n\t0x95B6, 0xEC4B, 0x95B7, 0xEEF3, 0x95B9, 0xEC49, 0x95BA, 0xEC4A,\t0x95BB, 0xC046, 0x95BC, 0xEC46, 0x95BD, 0xEC4E, 0x95BE, 0xEC48,\n\t0x95BF, 0xEC4C, 0x95C0, 0xEEEF, 0x95C3, 0xEEF1, 0x95C5, 0xEEF2,\t0x95C6, 0xC1F3, 0x95C7, 0xEEEE, 0x95C8, 0xC1F2, 0x95C9, 0xEEF0,\n\t0x95CA, 0xC1EF, 0x95CB, 0xC1F0, 0x95CC, 0xC1F1, 0x95CD, 0xEC47,\t0x95D0, 0xC2F5, 0x95D1, 0xF16E, 0x95D2, 0xF16C, 0x95D3, 0xF16D,\n\t0x95D4, 0xC2F3, 0x95D5, 0xC2F6, 0x95D6, 0xC2F4, 0x95DA, 0xF377,\t0x95DB, 0xF378, 0x95DC, 0xC3F6, 0x95DE, 0xF545, 0x95DF, 0xF547,\n\t0x95E0, 0xF546, 0x95E1, 0xC4C4, 0x95E2, 0xC550, 0x95E3, 0xF66D,\t0x95E4, 0xF66C, 0x95E5, 0xF66B, 0x961C, 0xAAFA, 0x961E, 0xC9AA,\n\t0x9620, 0xCA58, 0x9621, 0xA6E9, 0x9622, 0xCA56, 0x9623, 0xCA59,\t0x9624, 0xCA57, 0x9628, 0xCBAE, 0x962A, 0xA8C1, 0x962C, 0xA8C2,\n\t0x962D, 0xCBB0, 0x962E, 0xA8BF, 0x962F, 0xCBAF, 0x9630, 0xCBAD,\t0x9631, 0xA8C0, 0x9632, 0xA8BE, 0x9639, 0xCDD8, 0x963A, 0xCDDB,\n\t0x963B, 0xAAFD, 0x963C, 0xCDDA, 0x963D, 0xCDD9, 0x963F, 0xAAFC,\t0x9640, 0xAAFB, 0x9642, 0xAB40, 0x9643, 0xCDDC, 0x9644, 0xAAFE,\n\t0x964A, 0xD0C6, 0x964B, 0xADAE, 0x964C, 0xADAF, 0x964D, 0xADB0,\t0x964E, 0xD0C7, 0x964F, 0xD0C3, 0x9650, 0xADAD, 0x9651, 0xD0C4,\n\t0x9653, 0xD0C5, 0x9654, 0xD0C2, 0x9658, 0xB0A4, 0x965B, 0xB0A1,\t0x965C, 0xD445, 0x965D, 0xB0A2, 0x965E, 0xB0A5, 0x965F, 0xD446,\n\t0x9661, 0xB07E, 0x9662, 0xB07C, 0x9663, 0xB07D, 0x9664, 0xB0A3,\t0x966A, 0xB3AD, 0x966B, 0xD849, 0x966C, 0xB3B5, 0x966D, 0xD848,\n\t0x966F, 0xD84B, 0x9670, 0xB3B1, 0x9671, 0xD84A, 0x9672, 0xB6AB,\t0x9673, 0xB3AF, 0x9674, 0xB3B2, 0x9675, 0xB3AE, 0x9676, 0xB3B3,\n\t0x9677, 0xB3B4, 0x9678, 0xB3B0, 0x967C, 0xD847, 0x967D, 0xB6A7,\t0x967E, 0xDC7D, 0x9680, 0xDCA3, 0x9683, 0xDCA2, 0x9684, 0xB6AC,\n\t0x9685, 0xB6A8, 0x9686, 0xB6A9, 0x9687, 0xDC7C, 0x9688, 0xDC7E,\t0x9689, 0xDCA1, 0x968A, 0xB6A4, 0x968B, 0xB6A6, 0x968D, 0xB6AA,\n\t0x968E, 0xB6A5, 0x9691, 0xE0D3, 0x9692, 0xE0D1, 0x9693, 0xE0D2,\t0x9694, 0xB96A, 0x9695, 0xB96B, 0x9697, 0xE0D4, 0x9698, 0xB969,\n\t0x9699, 0xBBD8, 0x969B, 0xBBDA, 0x969C, 0xBBD9, 0x969E, 0xE4BB,\t0x96A1, 0xE4BC, 0x96A2, 0xE8AB, 0x96A4, 0xE8AA, 0x96A7, 0xC047,\n\t0x96A8, 0xC048, 0x96A9, 0xEC4F, 0x96AA, 0xC049, 0x96AC, 0xEEF6,\t0x96AE, 0xEEF4, 0x96B0, 0xEEF5, 0x96B1, 0xC1F4, 0x96B3, 0xF16F,\n\t0x96B4, 0xC3F7, 0x96B8, 0xC1F5, 0x96B9, 0xAB41, 0x96BB, 0xB0A6,\t0x96BC, 0xD447, 0x96BF, 0xD84C, 0x96C0, 0xB3B6, 0x96C1, 0xB6AD,\n\t0x96C2, 0xDCA4, 0x96C3, 0xDCA6, 0x96C4, 0xB6AF, 0x96C5, 0xB6AE,\t0x96C6, 0xB6B0, 0x96C7, 0xB6B1, 0x96C8, 0xDCA5, 0x96C9, 0xB96E,\n\t0x96CA, 0xB96F, 0x96CB, 0xB96D, 0x96CC, 0xBBDB, 0x96CD, 0xB96C,\t0x96CE, 0xE0D5, 0x96D2, 0xBBDC, 0x96D3, 0xE8AC, 0x96D4, 0xEC50,\n\t0x96D5, 0xC04A, 0x96D6, 0xC1F6, 0x96D7, 0xF170, 0x96D8, 0xF174,\t0x96D9, 0xC2F9, 0x96DA, 0xF171, 0x96DB, 0xC2FA, 0x96DC, 0xC2F8,\n\t0x96DD, 0xF175, 0x96DE, 0xC2FB, 0x96DF, 0xF173, 0x96E1, 0xF379,\t0x96E2, 0xC2F7, 0x96E3, 0xC3F8, 0x96E5, 0xF8CD, 0x96E8, 0xAB42,\n\t0x96E9, 0xB3B8, 0x96EA, 0xB3B7, 0x96EF, 0xB6B2, 0x96F0, 0xDCA8,\t0x96F1, 0xDCA7, 0x96F2, 0xB6B3, 0x96F5, 0xE0D9, 0x96F6, 0xB973,\n\t0x96F7, 0xB970, 0x96F8, 0xE0D8, 0x96F9, 0xB972, 0x96FA, 0xE0D6,\t0x96FB, 0xB971, 0x96FD, 0xE0D7, 0x96FF, 0xE4BD, 0x9700, 0xBBDD,\n\t0x9702, 0xE8AF, 0x9704, 0xBE5D, 0x9705, 0xE8AD, 0x9706, 0xBE5E,\t0x9707, 0xBE5F, 0x9708, 0xE8AE, 0x9709, 0xBE60, 0x970B, 0xEC51,\n\t0x970D, 0xC04E, 0x970E, 0xC04B, 0x970F, 0xC050, 0x9710, 0xEC53,\t0x9711, 0xC04C, 0x9712, 0xEC52, 0x9713, 0xC04F, 0x9716, 0xC04D,\n\t0x9718, 0xEEF9, 0x9719, 0xEEFB, 0x971C, 0xC1F7, 0x971D, 0xEEFA,\t0x971E, 0xC1F8, 0x971F, 0xEEF8, 0x9720, 0xEEF7, 0x9722, 0xF177,\n\t0x9723, 0xF176, 0x9724, 0xC2FC, 0x9725, 0xF178, 0x9726, 0xF37E,\t0x9727, 0xC3FA, 0x9728, 0xF37D, 0x9729, 0xF37A, 0x972A, 0xC3F9,\n\t0x972B, 0xF37B, 0x972C, 0xF37C, 0x972E, 0xF548, 0x972F, 0xF549,\t0x9730, 0xC4C5, 0x9732, 0xC553, 0x9735, 0xF66E, 0x9738, 0xC551,\n\t0x9739, 0xC552, 0x973A, 0xF66F, 0x973D, 0xC5B4, 0x973E, 0xC5B5,\t0x973F, 0xF771, 0x9742, 0xC645, 0x9743, 0xF8CF, 0x9744, 0xC647,\n\t0x9746, 0xF8CE, 0x9747, 0xF8D0, 0x9748, 0xC646, 0x9749, 0xF957,\t0x974B, 0xF9AD, 0x9752, 0xAB43, 0x9756, 0xB974, 0x9758, 0xE4BE,\n\t0x975A, 0xE8B0, 0x975B, 0xC051, 0x975C, 0xC052, 0x975E, 0xAB44,\t0x9760, 0xBE61, 0x9761, 0xC3FB, 0x9762, 0xADB1, 0x9766, 0xC053,\n\t0x9768, 0xC5E2, 0x9769, 0xADB2, 0x976A, 0xD84D, 0x976C, 0xDCA9,\t0x976E, 0xDCAB, 0x9770, 0xDCAA, 0x9772, 0xE0DD, 0x9773, 0xE0DA,\n\t0x9774, 0xB975, 0x9776, 0xB976, 0x9777, 0xE0DB, 0x9778, 0xE0DC,\t0x977A, 0xE4C0, 0x977B, 0xE4C5, 0x977C, 0xBBDE, 0x977D, 0xE4BF,\n\t0x977E, 0xE4C1, 0x977F, 0xE4C8, 0x9780, 0xE4C3, 0x9781, 0xE4C7,\t0x9782, 0xE4C4, 0x9783, 0xE4C2, 0x9784, 0xE4C6, 0x9785, 0xBBDF,\n\t0x9788, 0xE8B3, 0x978A, 0xE8B1, 0x978B, 0xBE63, 0x978D, 0xBE62,\t0x978E, 0xE8B2, 0x978F, 0xBE64, 0x9794, 0xEC56, 0x9797, 0xEC55,\n\t0x9798, 0xC054, 0x9799, 0xEC54, 0x979A, 0xEEFC, 0x979C, 0xEEFE,\t0x979D, 0xEF41, 0x979E, 0xEF40, 0x97A0, 0xC1F9, 0x97A1, 0xEEFD,\n\t0x97A2, 0xF1A1, 0x97A3, 0xC2FD, 0x97A4, 0xF17D, 0x97A5, 0xF1A2,\t0x97A6, 0xC2FE, 0x97A8, 0xF17B, 0x97AA, 0xF17E, 0x97AB, 0xF17C,\n\t0x97AC, 0xF179, 0x97AD, 0xC340, 0x97AE, 0xF17A, 0x97B3, 0xF3A1,\t0x97B6, 0xF3A3, 0x97B7, 0xF3A2, 0x97B9, 0xF54A, 0x97BB, 0xF54B,\n\t0x97BF, 0xF670, 0x97C1, 0xC5B7, 0x97C3, 0xC5B6, 0x97C4, 0xF84F,\t0x97C5, 0xF850, 0x97C6, 0xC648, 0x97C7, 0xF8D1, 0x97C9, 0xC669,\n\t0x97CB, 0xADB3, 0x97CC, 0xB6B4, 0x97CD, 0xE4CA, 0x97CE, 0xE4C9,\t0x97CF, 0xE8B5, 0x97D0, 0xE8B4, 0x97D3, 0xC1FA, 0x97D4, 0xEF43,\n\t0x97D5, 0xEF42, 0x97D6, 0xF1A5, 0x97D7, 0xF1A3, 0x97D8, 0xF1A6,\t0x97D9, 0xF1A4, 0x97DC, 0xC3FC, 0x97DD, 0xF3A4, 0x97DE, 0xF3A5,\n\t0x97DF, 0xF3A6, 0x97E1, 0xF671, 0x97E3, 0xF772, 0x97E5, 0xF8D2,\t0x97ED, 0xADB4, 0x97F0, 0xEC57, 0x97F1, 0xEF44, 0x97F3, 0xADB5,\n\t0x97F6, 0xBBE0, 0x97F8, 0xEC58, 0x97F9, 0xC341, 0x97FA, 0xF1A7,\t0x97FB, 0xC3FD, 0x97FD, 0xF54C, 0x97FE, 0xF54D, 0x97FF, 0xC554,\n\t0x9800, 0xF851, 0x9801, 0xADB6, 0x9802, 0xB3BB, 0x9803, 0xB3BC,\t0x9804, 0xD84E, 0x9805, 0xB6B5, 0x9806, 0xB6B6, 0x9807, 0xDCAC,\n\t0x9808, 0xB6B7, 0x980A, 0xB97A, 0x980C, 0xB97C, 0x980D, 0xE0DF,\t0x980E, 0xE0E0, 0x980F, 0xE0DE, 0x9810, 0xB977, 0x9811, 0xB978,\n\t0x9812, 0xB97B, 0x9813, 0xB979, 0x9816, 0xE4CB, 0x9817, 0xBBE1,\t0x9818, 0xBBE2, 0x981B, 0xE8BC, 0x981C, 0xBE67, 0x981D, 0xE8B7,\n\t0x981E, 0xE8B6, 0x9820, 0xE8BB, 0x9821, 0xBE65, 0x9824, 0xC05B,\t0x9826, 0xE8B8, 0x9827, 0xE8BD, 0x9828, 0xE8BA, 0x9829, 0xE8B9,\n\t0x982B, 0xBE66, 0x982D, 0xC059, 0x982F, 0xEC5A, 0x9830, 0xC055,\t0x9832, 0xEC5B, 0x9835, 0xEC59, 0x9837, 0xC058, 0x9838, 0xC056,\n\t0x9839, 0xC05A, 0x983B, 0xC057, 0x9841, 0xEF45, 0x9843, 0xEF4A,\t0x9844, 0xEF46, 0x9845, 0xEF49, 0x9846, 0xC1FB, 0x9848, 0xEDD4,\n\t0x9849, 0xEF48, 0x984A, 0xEF47, 0x984C, 0xC344, 0x984D, 0xC342,\t0x984E, 0xC345, 0x984F, 0xC343, 0x9850, 0xF1A8, 0x9851, 0xF1A9,\n\t0x9852, 0xF1AA, 0x9853, 0xC346, 0x9857, 0xF3AA, 0x9858, 0xC440,\t0x9859, 0xF3A8, 0x985B, 0xC441, 0x985C, 0xF3A7, 0x985D, 0xF3A9,\n\t0x985E, 0xC3FE, 0x985F, 0xF551, 0x9860, 0xF54E, 0x9862, 0xF54F,\t0x9863, 0xF550, 0x9864, 0xF672, 0x9865, 0xC556, 0x9867, 0xC555,\n\t0x9869, 0xF774, 0x986A, 0xF773, 0x986B, 0xC5B8, 0x986F, 0xC5E3,\t0x9870, 0xC649, 0x9871, 0xC660, 0x9872, 0xF958, 0x9873, 0xF9AE,\n\t0x9874, 0xF9AF, 0x98A8, 0xADB7, 0x98A9, 0xDCAD, 0x98AC, 0xE0E1,\t0x98AD, 0xE4CC, 0x98AE, 0xE4CD, 0x98AF, 0xBBE3, 0x98B1, 0xBBE4,\n\t0x98B2, 0xE8BE, 0x98B3, 0xBE68, 0x98B6, 0xC1FC, 0x98B8, 0xF1AB,\t0x98BA, 0xC347, 0x98BB, 0xF3AD, 0x98BC, 0xC442, 0x98BD, 0xF3AC,\n\t0x98BE, 0xF3AE, 0x98BF, 0xF3AB, 0x98C0, 0xF675, 0x98C1, 0xF552,\t0x98C2, 0xF553, 0x98C4, 0xC4C6, 0x98C6, 0xF674, 0x98C9, 0xF673,\n\t0x98CB, 0xF775, 0x98CC, 0xF9B0, 0x98DB, 0xADB8, 0x98DF, 0xADB9,\t0x98E2, 0xB0A7, 0x98E3, 0xD448, 0x98E5, 0xD84F, 0x98E7, 0xB6B8,\n\t0x98E9, 0xB6BB, 0x98EA, 0xB6B9, 0x98EB, 0xDCAE, 0x98ED, 0xB6BD,\t0x98EF, 0xB6BA, 0x98F2, 0xB6BC, 0x98F4, 0xB97E, 0x98F6, 0xE0E2,\n\t0x98F9, 0xE0E3, 0x98FA, 0xE8C0, 0x98FC, 0xB97D, 0x98FD, 0xB9A1,\t0x98FE, 0xB9A2, 0x9900, 0xE4CF, 0x9902, 0xE4CE, 0x9903, 0xBBE5,\n\t0x9905, 0xBBE6, 0x9907, 0xE4D0, 0x9908, 0xE8BF, 0x9909, 0xBBE8,\t0x990A, 0xBE69, 0x990C, 0xBBE7, 0x9910, 0xC05C, 0x9911, 0xE8C1,\n\t0x9912, 0xBE6B, 0x9913, 0xBE6A, 0x9914, 0xE8C2, 0x9915, 0xE8C5,\t0x9916, 0xE8C3, 0x9917, 0xE8C4, 0x9918, 0xBE6C, 0x991A, 0xC061,\n\t0x991B, 0xC05F, 0x991E, 0xC05E, 0x991F, 0xEC5D, 0x9921, 0xC060,\t0x9924, 0xEC5C, 0x9925, 0xEF4B, 0x9927, 0xEC5E, 0x9928, 0xC05D,\n\t0x9929, 0xEC5F, 0x992A, 0xEF4E, 0x992B, 0xEF4C, 0x992C, 0xEF4D,\t0x992D, 0xEF52, 0x992E, 0xC34B, 0x992F, 0xEF51, 0x9930, 0xEF54,\n\t0x9931, 0xEF53, 0x9932, 0xEF50, 0x9933, 0xEF4F, 0x9935, 0xC1FD,\t0x993A, 0xF1AE, 0x993C, 0xF1AD, 0x993D, 0xC34A, 0x993E, 0xC348,\n\t0x993F, 0xC349, 0x9941, 0xF1AC, 0x9943, 0xF3B1, 0x9945, 0xC443,\t0x9947, 0xF3B0, 0x9948, 0xF3AF, 0x9949, 0xC444, 0x994B, 0xF558,\n\t0x994C, 0xF557, 0x994E, 0xF555, 0x9950, 0xF554, 0x9951, 0xC4C8,\t0x9952, 0xC4C7, 0x9953, 0xF559, 0x9954, 0xF776, 0x9955, 0xC5B9,\n\t0x9956, 0xF677, 0x9957, 0xC557, 0x9958, 0xF676, 0x9959, 0xF556,\t0x995B, 0xF777, 0x995C, 0xC5E4, 0x995E, 0xC661, 0x995F, 0xF959,\n\t0x9961, 0xF9B1, 0x9996, 0xADBA, 0x9997, 0xD850, 0x9998, 0xEF55,\t0x9999, 0xADBB, 0x999C, 0xE4D2, 0x999D, 0xE4D1, 0x999E, 0xEC60,\n\t0x99A1, 0xEF57, 0x99A3, 0xEF56, 0x99A5, 0xC34C, 0x99A6, 0xF3B2,\t0x99A7, 0xF3B3, 0x99A8, 0xC4C9, 0x99AB, 0xF9B2, 0x99AC, 0xB0A8,\n\t0x99AD, 0xB6BF, 0x99AE, 0xB6BE, 0x99AF, 0xE0E4, 0x99B0, 0xE0E6,\t0x99B1, 0xB9A4, 0x99B2, 0xE0E5, 0x99B3, 0xB9A3, 0x99B4, 0xB9A5,\n\t0x99B5, 0xE0E7, 0x99B9, 0xE4D4, 0x99BA, 0xE4D6, 0x99BB, 0xE4D5,\t0x99BD, 0xE4D8, 0x99C1, 0xBBE9, 0x99C2, 0xE4D7, 0x99C3, 0xE4D3,\n\t0x99C7, 0xE4D9, 0x99C9, 0xE8CC, 0x99CB, 0xE8CF, 0x99CC, 0xE8D1,\t0x99CD, 0xE8C7, 0x99CE, 0xE8CB, 0x99CF, 0xE8C8, 0x99D0, 0xBE6E,\n\t0x99D1, 0xBE71, 0x99D2, 0xBE73, 0x99D3, 0xE8C9, 0x99D4, 0xE8CA,\t0x99D5, 0xBE72, 0x99D6, 0xE8CD, 0x99D7, 0xE8D0, 0x99D8, 0xE8CE,\n\t0x99D9, 0xBE74, 0x99DB, 0xBE70, 0x99DC, 0xE8C6, 0x99DD, 0xBE6D,\t0x99DF, 0xBE6F, 0x99E2, 0xC063, 0x99E3, 0xEC66, 0x99E4, 0xEC64,\n\t0x99E5, 0xEC63, 0x99E7, 0xEC69, 0x99E9, 0xEC68, 0x99EA, 0xEC67,\t0x99EC, 0xEC62, 0x99ED, 0xC062, 0x99EE, 0xEC61, 0x99F0, 0xEC65,\n\t0x99F1, 0xC064, 0x99F4, 0xEF5A, 0x99F6, 0xEF5E, 0x99F7, 0xEF5B,\t0x99F8, 0xEF5D, 0x99F9, 0xEF5C, 0x99FA, 0xEF59, 0x99FB, 0xEF5F,\n\t0x99FC, 0xEF62, 0x99FD, 0xEF60, 0x99FE, 0xEF61, 0x99FF, 0xC240,\t0x9A01, 0xC1FE, 0x9A02, 0xEF58, 0x9A03, 0xEF63, 0x9A04, 0xF1B3,\n\t0x9A05, 0xF1B6, 0x9A06, 0xF1B8, 0x9A07, 0xF1B7, 0x9A09, 0xF1B1,\t0x9A0A, 0xF1B5, 0x9A0B, 0xF1B0, 0x9A0D, 0xF1B2, 0x9A0E, 0xC34D,\n\t0x9A0F, 0xF1AF, 0x9A11, 0xF1B4, 0x9A14, 0xF3C0, 0x9A15, 0xF3B5,\t0x9A16, 0xC445, 0x9A19, 0xC446, 0x9A1A, 0xF3B4, 0x9A1B, 0xF3B9,\n\t0x9A1C, 0xF3BF, 0x9A1D, 0xF3B7, 0x9A1E, 0xF3BE, 0x9A20, 0xF3BB,\t0x9A22, 0xF3BA, 0x9A23, 0xF3BD, 0x9A24, 0xF3B8, 0x9A25, 0xF3B6,\n\t0x9A27, 0xF3BC, 0x9A29, 0xF560, 0x9A2A, 0xF55E, 0x9A2B, 0xC4CA,\t0x9A2C, 0xF55D, 0x9A2D, 0xF563, 0x9A2E, 0xF561, 0x9A30, 0xC4CB,\n\t0x9A31, 0xF55C, 0x9A32, 0xF55A, 0x9A34, 0xF55B, 0x9A35, 0xC4CD,\t0x9A36, 0xF55F, 0x9A37, 0xC4CC, 0x9A38, 0xF562, 0x9A39, 0xF678,\n\t0x9A3A, 0xF67E, 0x9A3D, 0xF679, 0x9A3E, 0xC55B, 0x9A3F, 0xF6A1,\t0x9A40, 0xC55A, 0x9A41, 0xF67D, 0x9A42, 0xF67C, 0x9A43, 0xC559,\n\t0x9A44, 0xF67B, 0x9A45, 0xC558, 0x9A46, 0xF67A, 0x9A48, 0xF77D,\t0x9A49, 0xF7A1, 0x9A4A, 0xF77E, 0x9A4C, 0xF77B, 0x9A4D, 0xC5BB,\n\t0x9A4E, 0xF778, 0x9A4F, 0xF77C, 0x9A50, 0xF7A3, 0x9A52, 0xF7A2,\t0x9A53, 0xF779, 0x9A54, 0xF77A, 0x9A55, 0xC5BA, 0x9A56, 0xF852,\n\t0x9A57, 0xC5E7, 0x9A59, 0xF853, 0x9A5A, 0xC5E5, 0x9A5B, 0xC5E6,\t0x9A5E, 0xF8D3, 0x9A5F, 0xC64A, 0x9A60, 0xF976, 0x9A62, 0xC66A,\n\t0x9A64, 0xF9B3, 0x9A65, 0xC66B, 0x9A66, 0xF9B4, 0x9A67, 0xF9B5,\t0x9A68, 0xF9C3, 0x9A69, 0xF9C2, 0x9A6A, 0xC67A, 0x9A6B, 0xF9CD,\n\t0x9AA8, 0xB0A9, 0x9AAB, 0xE0E9, 0x9AAD, 0xE0E8, 0x9AAF, 0xBBEA,\t0x9AB0, 0xBBEB, 0x9AB1, 0xE4DA, 0x9AB3, 0xE8D2, 0x9AB4, 0xEC6C,\n\t0x9AB7, 0xBE75, 0x9AB8, 0xC065, 0x9AB9, 0xEC6A, 0x9ABB, 0xEC6D,\t0x9ABC, 0xC066, 0x9ABE, 0xEF64, 0x9ABF, 0xEC6B, 0x9AC0, 0xF1B9,\n\t0x9AC1, 0xC34E, 0x9AC2, 0xF3C1, 0x9AC6, 0xF566, 0x9AC7, 0xF564,\t0x9ACA, 0xF565, 0x9ACD, 0xF6A2, 0x9ACF, 0xC55C, 0x9AD0, 0xF7A4,\n\t0x9AD1, 0xC5EA, 0x9AD2, 0xC5BC, 0x9AD3, 0xC5E8, 0x9AD4, 0xC5E9,\t0x9AD5, 0xF8D4, 0x9AD6, 0xC662, 0x9AD8, 0xB0AA, 0x9ADC, 0xF1BA,\n\t0x9ADF, 0xD449, 0x9AE1, 0xB9A6, 0x9AE3, 0xE4DB, 0x9AE6, 0xBBEC,\t0x9AE7, 0xE4DC, 0x9AEB, 0xE8D4, 0x9AEC, 0xE8D3, 0x9AED, 0xC068,\n\t0x9AEE, 0xBE76, 0x9AEF, 0xBE77, 0x9AF1, 0xE8D7, 0x9AF2, 0xE8D6,\t0x9AF3, 0xE8D5, 0x9AF6, 0xEC6E, 0x9AF7, 0xEC71, 0x9AF9, 0xEC70,\n\t0x9AFA, 0xEC6F, 0x9AFB, 0xC067, 0x9AFC, 0xEF68, 0x9AFD, 0xEF66,\t0x9AFE, 0xEF65, 0x9B01, 0xEF67, 0x9B03, 0xC34F, 0x9B04, 0xF1BC,\n\t0x9B05, 0xF1BD, 0x9B06, 0xC350, 0x9B08, 0xF1BB, 0x9B0A, 0xF3C3,\t0x9B0B, 0xF3C2, 0x9B0C, 0xF3C5, 0x9B0D, 0xC447, 0x9B0E, 0xF3C4,\n\t0x9B10, 0xF567, 0x9B11, 0xF569, 0x9B12, 0xF568, 0x9B15, 0xF6A3,\t0x9B16, 0xF6A6, 0x9B17, 0xF6A4, 0x9B18, 0xF6A5, 0x9B19, 0xF7A5,\n\t0x9B1A, 0xC5BD, 0x9B1E, 0xF854, 0x9B1F, 0xF855, 0x9B20, 0xF856,\t0x9B22, 0xC64B, 0x9B23, 0xC663, 0x9B24, 0xF9B6, 0x9B25, 0xB0AB,\n\t0x9B27, 0xBE78, 0x9B28, 0xC069, 0x9B29, 0xF1BE, 0x9B2B, 0xF7A6,\t0x9B2E, 0xF9C4, 0x9B2F, 0xD44A, 0x9B31, 0xC67B, 0x9B32, 0xB0AC,\n\t0x9B33, 0xEC72, 0x9B35, 0xF1BF, 0x9B37, 0xF3C6, 0x9B3A, 0xF6A7,\t0x9B3B, 0xF7A7, 0x9B3C, 0xB0AD, 0x9B3E, 0xE4DD, 0x9B3F, 0xE4DE,\n\t0x9B41, 0xBBED, 0x9B42, 0xBBEE, 0x9B43, 0xE8D9, 0x9B44, 0xBE7A,\t0x9B45, 0xBE79, 0x9B46, 0xE8D8, 0x9B48, 0xEF69, 0x9B4A, 0xF1C0,\n\t0x9B4B, 0xF1C2, 0x9B4C, 0xF1C1, 0x9B4D, 0xC353, 0x9B4E, 0xC352,\t0x9B4F, 0xC351, 0x9B51, 0xC55E, 0x9B52, 0xF6A8, 0x9B54, 0xC55D,\n\t0x9B55, 0xF7A9, 0x9B56, 0xF7A8, 0x9B58, 0xC64C, 0x9B59, 0xF8D5,\t0x9B5A, 0xB3BD, 0x9B5B, 0xE0EA, 0x9B5F, 0xE4E1, 0x9B60, 0xE4DF,\n\t0x9B61, 0xE4E0, 0x9B64, 0xE8E2, 0x9B66, 0xE8DD, 0x9B67, 0xE8DA,\t0x9B68, 0xE8E1, 0x9B6C, 0xE8E3, 0x9B6F, 0xBE7C, 0x9B70, 0xE8E0,\n\t0x9B71, 0xE8DC, 0x9B74, 0xE8DB, 0x9B75, 0xE8DF, 0x9B76, 0xE8DE,\t0x9B77, 0xBE7B, 0x9B7A, 0xEC7D, 0x9B7B, 0xEC78, 0x9B7C, 0xEC76,\n\t0x9B7D, 0xECA1, 0x9B7E, 0xEC77, 0x9B80, 0xEC73, 0x9B82, 0xEC79,\t0x9B85, 0xEC74, 0x9B86, 0xEF72, 0x9B87, 0xEC75, 0x9B88, 0xECA2,\n\t0x9B90, 0xEC7C, 0x9B91, 0xC06A, 0x9B92, 0xEC7B, 0x9B93, 0xEC7A,\t0x9B95, 0xEC7E, 0x9B9A, 0xEF6A, 0x9B9B, 0xEF6D, 0x9B9E, 0xEF6C,\n\t0x9BA0, 0xEF74, 0x9BA1, 0xEF6F, 0x9BA2, 0xEF73, 0x9BA4, 0xEF71,\t0x9BA5, 0xEF70, 0x9BA6, 0xEF6E, 0x9BA8, 0xEF6B, 0x9BAA, 0xC243,\n\t0x9BAB, 0xC242, 0x9BAD, 0xC244, 0x9BAE, 0xC241, 0x9BAF, 0xEF75,\t0x9BB5, 0xF1C8, 0x9BB6, 0xF1CB, 0x9BB8, 0xF1C9, 0x9BB9, 0xF1CD,\n\t0x9BBD, 0xF1CE, 0x9BBF, 0xF1C6, 0x9BC0, 0xC358, 0x9BC1, 0xF1C7,\t0x9BC3, 0xF1C5, 0x9BC4, 0xF1CC, 0x9BC6, 0xF1C4, 0x9BC7, 0xF1C3,\n\t0x9BC8, 0xC357, 0x9BC9, 0xC355, 0x9BCA, 0xC354, 0x9BD3, 0xF1CA,\t0x9BD4, 0xF3CF, 0x9BD5, 0xF3D5, 0x9BD6, 0xC44A, 0x9BD7, 0xF3D0,\n\t0x9BD9, 0xF3D3, 0x9BDA, 0xF3D7, 0x9BDB, 0xC44B, 0x9BDC, 0xF3D2,\t0x9BDE, 0xF3CA, 0x9BE0, 0xF3C9, 0x9BE1, 0xF3D6, 0x9BE2, 0xF3CD,\n\t0x9BE4, 0xF3CB, 0x9BE5, 0xF3D4, 0x9BE6, 0xF3CC, 0x9BE7, 0xC449,\t0x9BE8, 0xC448, 0x9BEA, 0xF3C7, 0x9BEB, 0xF3C8, 0x9BEC, 0xF3D1,\n\t0x9BF0, 0xF3CE, 0x9BF7, 0xF56C, 0x9BF8, 0xF56F, 0x9BFD, 0xC356,\t0x9C05, 0xF56D, 0x9C06, 0xF573, 0x9C07, 0xF571, 0x9C08, 0xF56B,\n\t0x9C09, 0xF576, 0x9C0B, 0xF56A, 0x9C0D, 0xC4CF, 0x9C0E, 0xF572,\t0x9C12, 0xF56E, 0x9C13, 0xC4CE, 0x9C14, 0xF575, 0x9C17, 0xF574,\n\t0x9C1C, 0xF6AB, 0x9C1D, 0xF6AA, 0x9C21, 0xF6B1, 0x9C23, 0xF6AD,\t0x9C24, 0xF6B0, 0x9C25, 0xC560, 0x9C28, 0xF6AE, 0x9C29, 0xF6AF,\n\t0x9C2B, 0xF6A9, 0x9C2C, 0xF6AC, 0x9C2D, 0xC55F, 0x9C31, 0xC5BF,\t0x9C32, 0xF7B4, 0x9C33, 0xF7AF, 0x9C34, 0xF7B3, 0x9C36, 0xF7B6,\n\t0x9C37, 0xF7B2, 0x9C39, 0xF7AE, 0x9C3B, 0xC5C1, 0x9C3C, 0xF7B1,\t0x9C3D, 0xF7B5, 0x9C3E, 0xC5C0, 0x9C3F, 0xF7AC, 0x9C40, 0xF570,\n\t0x9C41, 0xF7B0, 0x9C44, 0xF7AD, 0x9C46, 0xF7AA, 0x9C48, 0xF7AB,\t0x9C49, 0xC5BE, 0x9C4A, 0xF85A, 0x9C4B, 0xF85C, 0x9C4C, 0xF85F,\n\t0x9C4D, 0xF85B, 0x9C4E, 0xF860, 0x9C50, 0xF859, 0x9C52, 0xF857,\t0x9C54, 0xC5EB, 0x9C55, 0xF85D, 0x9C56, 0xC5ED, 0x9C57, 0xC5EC,\n\t0x9C58, 0xF858, 0x9C59, 0xF85E, 0x9C5E, 0xF8DA, 0x9C5F, 0xC64D,\t0x9C60, 0xF8DB, 0x9C62, 0xF8D9, 0x9C63, 0xF8D6, 0x9C66, 0xF8D8,\n\t0x9C67, 0xF8D7, 0x9C68, 0xF95A, 0x9C6D, 0xF95C, 0x9C6E, 0xF95B,\t0x9C71, 0xF979, 0x9C73, 0xF978, 0x9C74, 0xF977, 0x9C75, 0xF97A,\n\t0x9C77, 0xC673, 0x9C78, 0xC674, 0x9C79, 0xF9CA, 0x9C7A, 0xF9CE,\t0x9CE5, 0xB3BE, 0x9CE6, 0xDCAF, 0x9CE7, 0xE0ED, 0x9CE9, 0xB9A7,\n\t0x9CEA, 0xE0EB, 0x9CED, 0xE0EC, 0x9CF1, 0xE4E2, 0x9CF2, 0xE4E3,\t0x9CF3, 0xBBF1, 0x9CF4, 0xBBEF, 0x9CF5, 0xE4E4, 0x9CF6, 0xBBF0,\n\t0x9CF7, 0xE8E8, 0x9CF9, 0xE8EB, 0x9CFA, 0xE8E5, 0x9CFB, 0xE8EC,\t0x9CFC, 0xE8E4, 0x9CFD, 0xE8E6, 0x9CFF, 0xE8E7, 0x9D00, 0xE8EA,\n\t0x9D03, 0xBEA1, 0x9D04, 0xE8EF, 0x9D05, 0xE8EE, 0x9D06, 0xBE7D,\t0x9D07, 0xE8E9, 0x9D08, 0xE8ED, 0x9D09, 0xBE7E, 0x9D10, 0xECAC,\n\t0x9D12, 0xC06F, 0x9D14, 0xECA7, 0x9D15, 0xC06B, 0x9D17, 0xECA4,\t0x9D18, 0xECAA, 0x9D19, 0xECAD, 0x9D1B, 0xC070, 0x9D1D, 0xECA9,\n\t0x9D1E, 0xECA6, 0x9D1F, 0xECAE, 0x9D20, 0xECA5, 0x9D22, 0xECAB,\t0x9D23, 0xC06C, 0x9D25, 0xECA3, 0x9D26, 0xC06D, 0x9D28, 0xC06E,\n\t0x9D29, 0xECA8, 0x9D2D, 0xEFA9, 0x9D2E, 0xEF7A, 0x9D2F, 0xEF7B,\t0x9D30, 0xEF7E, 0x9D31, 0xEF7C, 0x9D33, 0xEF76, 0x9D36, 0xEF79,\n\t0x9D37, 0xEFA5, 0x9D38, 0xEF7D, 0x9D3B, 0xC245, 0x9D3D, 0xEFA7,\t0x9D3E, 0xEFA4, 0x9D3F, 0xC246, 0x9D40, 0xEFA6, 0x9D41, 0xEF77,\n\t0x9D42, 0xEFA2, 0x9D43, 0xEFA3, 0x9D45, 0xEFA1, 0x9D4A, 0xF1D2,\t0x9D4B, 0xF1D4, 0x9D4C, 0xF1D7, 0x9D4F, 0xF1D1, 0x9D51, 0xC359,\n\t0x9D52, 0xF1D9, 0x9D53, 0xF1D0, 0x9D54, 0xF1DA, 0x9D56, 0xF1D6,\t0x9D57, 0xF1D8, 0x9D58, 0xF1DC, 0x9D59, 0xF1D5, 0x9D5A, 0xF1DD,\n\t0x9D5B, 0xF1D3, 0x9D5C, 0xF1CF, 0x9D5D, 0xC35A, 0x9D5F, 0xF1DB,\t0x9D60, 0xC35B, 0x9D61, 0xC44D, 0x9D67, 0xEF78, 0x9D68, 0xF3F1,\n\t0x9D69, 0xF3E8, 0x9D6A, 0xC44F, 0x9D6B, 0xF3E4, 0x9D6C, 0xC450,\t0x9D6F, 0xF3ED, 0x9D70, 0xF3E7, 0x9D71, 0xF3DD, 0x9D72, 0xC44E,\n\t0x9D73, 0xF3EA, 0x9D74, 0xF3E5, 0x9D75, 0xF3E6, 0x9D77, 0xF3D8,\t0x9D78, 0xF3DF, 0x9D79, 0xF3EE, 0x9D7B, 0xF3EB, 0x9D7D, 0xF3E3,\n\t0x9D7F, 0xF3EF, 0x9D80, 0xF3DE, 0x9D81, 0xF3D9, 0x9D82, 0xF3EC,\t0x9D84, 0xF3DB, 0x9D85, 0xF3E9, 0x9D86, 0xF3E0, 0x9D87, 0xF3F0,\n\t0x9D88, 0xF3DC, 0x9D89, 0xC44C, 0x9D8A, 0xF3DA, 0x9D8B, 0xF3E1,\t0x9D8C, 0xF3E2, 0x9D90, 0xF57D, 0x9D92, 0xF57B, 0x9D94, 0xF5A2,\n\t0x9D96, 0xF5AE, 0x9D97, 0xF5A5, 0x9D98, 0xF57C, 0x9D99, 0xF578,\t0x9D9A, 0xF5A7, 0x9D9B, 0xF57E, 0x9D9C, 0xF5A3, 0x9D9D, 0xF57A,\n\t0x9D9E, 0xF5AA, 0x9D9F, 0xF577, 0x9DA0, 0xF5A1, 0x9DA1, 0xF5A6,\t0x9DA2, 0xF5A8, 0x9DA3, 0xF5AB, 0x9DA4, 0xF579, 0x9DA6, 0xF5AF,\n\t0x9DA7, 0xF5B0, 0x9DA8, 0xF5A9, 0x9DA9, 0xF5AD, 0x9DAA, 0xF5A4,\t0x9DAC, 0xF6C1, 0x9DAD, 0xF6C4, 0x9DAF, 0xC561, 0x9DB1, 0xF6C3,\n\t0x9DB2, 0xF6C8, 0x9DB3, 0xF6C6, 0x9DB4, 0xC562, 0x9DB5, 0xF6BD,\t0x9DB6, 0xF6B3, 0x9DB7, 0xF6B2, 0x9DB8, 0xC564, 0x9DB9, 0xF6BF,\n\t0x9DBA, 0xF6C0, 0x9DBB, 0xF6BC, 0x9DBC, 0xF6B4, 0x9DBE, 0xF6B9,\t0x9DBF, 0xF5AC, 0x9DC1, 0xF6B5, 0x9DC2, 0xC563, 0x9DC3, 0xF6BB,\n\t0x9DC5, 0xF6BA, 0x9DC7, 0xF6B6, 0x9DC8, 0xF6C2, 0x9DCA, 0xF6B7,\t0x9DCB, 0xF7BB, 0x9DCC, 0xF6C5, 0x9DCD, 0xF6C7, 0x9DCE, 0xF6BE,\n\t0x9DCF, 0xF6B8, 0x9DD0, 0xF7BC, 0x9DD1, 0xF7BE, 0x9DD2, 0xF7B8,\t0x9DD3, 0xC5C2, 0x9DD5, 0xF7C5, 0x9DD6, 0xF7C3, 0x9DD7, 0xC5C3,\n\t0x9DD8, 0xF7C2, 0x9DD9, 0xF7C1, 0x9DDA, 0xF7BA, 0x9DDB, 0xF7B7,\t0x9DDC, 0xF7BD, 0x9DDD, 0xF7C6, 0x9DDE, 0xF7B9, 0x9DDF, 0xF7BF,\n\t0x9DE1, 0xF869, 0x9DE2, 0xF86E, 0x9DE3, 0xF864, 0x9DE4, 0xF867,\t0x9DE5, 0xC5EE, 0x9DE6, 0xF86B, 0x9DE8, 0xF872, 0x9DE9, 0xF7C0,\n\t0x9DEB, 0xF865, 0x9DEC, 0xF86F, 0x9DED, 0xF873, 0x9DEE, 0xF86A,\t0x9DEF, 0xF863, 0x9DF0, 0xF86D, 0x9DF2, 0xF86C, 0x9DF3, 0xF871,\n\t0x9DF4, 0xF870, 0x9DF5, 0xF7C4, 0x9DF6, 0xF868, 0x9DF7, 0xF862,\t0x9DF8, 0xF866, 0x9DF9, 0xC64E, 0x9DFA, 0xC64F, 0x9DFB, 0xF861,\n\t0x9DFD, 0xF8E6, 0x9DFE, 0xF8DD, 0x9DFF, 0xF8E5, 0x9E00, 0xF8E2,\t0x9E01, 0xF8E3, 0x9E02, 0xF8DC, 0x9E03, 0xF8DF, 0x9E04, 0xF8E7,\n\t0x9E05, 0xF8E1, 0x9E06, 0xF8E0, 0x9E07, 0xF8DE, 0x9E09, 0xF8E4,\t0x9E0B, 0xF95D, 0x9E0D, 0xF95E, 0x9E0F, 0xF960, 0x9E10, 0xF95F,\n\t0x9E11, 0xF962, 0x9E12, 0xF961, 0x9E13, 0xF97C, 0x9E14, 0xF97B,\t0x9E15, 0xF9B7, 0x9E17, 0xF9B8, 0x9E19, 0xF9C5, 0x9E1A, 0xC678,\n\t0x9E1B, 0xC67C, 0x9E1D, 0xF9CF, 0x9E1E, 0xC67D, 0x9E75, 0xB3BF,\t0x9E79, 0xC4D0, 0x9E7A, 0xF6C9, 0x9E7C, 0xC650, 0x9E7D, 0xC651,\n\t0x9E7F, 0xB3C0, 0x9E80, 0xE0EE, 0x9E82, 0xB9A8, 0x9E83, 0xE8F0,\t0x9E86, 0xECB0, 0x9E87, 0xECB1, 0x9E88, 0xECAF, 0x9E89, 0xEFAB,\n\t0x9E8A, 0xEFAA, 0x9E8B, 0xC247, 0x9E8C, 0xF1DF, 0x9E8D, 0xEFAC,\t0x9E8E, 0xF1DE, 0x9E91, 0xF3F3, 0x9E92, 0xC451, 0x9E93, 0xC453,\n\t0x9E94, 0xF3F2, 0x9E97, 0xC452, 0x9E99, 0xF5B1, 0x9E9A, 0xF5B3,\t0x9E9B, 0xF5B2, 0x9E9C, 0xF6CA, 0x9E9D, 0xC565, 0x9E9F, 0xC5EF,\n\t0x9EA0, 0xF8E8, 0x9EA1, 0xF963, 0x9EA4, 0xF9D2, 0x9EA5, 0xB3C1,\t0x9EA7, 0xE4E5, 0x9EA9, 0xBEA2, 0x9EAD, 0xECB3, 0x9EAE, 0xECB2,\n\t0x9EB0, 0xEFAD, 0x9EB4, 0xC454, 0x9EB5, 0xC4D1, 0x9EB6, 0xF7C7,\t0x9EB7, 0xF9CB, 0x9EBB, 0xB3C2, 0x9EBC, 0xBBF2, 0x9EBE, 0xBEA3,\n\t0x9EC0, 0xF3F4, 0x9EC2, 0xF874, 0x9EC3, 0xB6C0, 0x9EC8, 0xEFAE,\t0x9ECC, 0xC664, 0x9ECD, 0xB6C1, 0x9ECE, 0xBEA4, 0x9ECF, 0xC248,\n\t0x9ED0, 0xF875, 0x9ED1, 0xB6C2, 0x9ED3, 0xE8F1, 0x9ED4, 0xC072,\t0x9ED5, 0xECB4, 0x9ED6, 0xECB5, 0x9ED8, 0xC071, 0x9EDA, 0xEFAF,\n\t0x9EDB, 0xC24C, 0x9EDC, 0xC24A, 0x9EDD, 0xC24B, 0x9EDE, 0xC249,\t0x9EDF, 0xF1E0, 0x9EE0, 0xC35C, 0x9EE4, 0xF5B5, 0x9EE5, 0xF5B4,\n\t0x9EE6, 0xF5B7, 0x9EE7, 0xF5B6, 0x9EE8, 0xC4D2, 0x9EEB, 0xF6CB,\t0x9EED, 0xF6CD, 0x9EEE, 0xF6CC, 0x9EEF, 0xC566, 0x9EF0, 0xF7C8,\n\t0x9EF2, 0xF876, 0x9EF3, 0xF877, 0x9EF4, 0xC5F0, 0x9EF5, 0xF964,\t0x9EF6, 0xF97D, 0x9EF7, 0xC675, 0x9EF9, 0xDCB0, 0x9EFA, 0xECB6,\n\t0x9EFB, 0xEFB0, 0x9EFC, 0xF3F5, 0x9EFD, 0xE0EF, 0x9EFF, 0xEFB1,\t0x9F00, 0xF1E2, 0x9F01, 0xF1E1, 0x9F06, 0xF878, 0x9F07, 0xC652,\n\t0x9F09, 0xF965, 0x9F0A, 0xF97E, 0x9F0E, 0xB9A9, 0x9F0F, 0xE8F2,\t0x9F10, 0xE8F3, 0x9F12, 0xECB7, 0x9F13, 0xB9AA, 0x9F15, 0xC35D,\n\t0x9F16, 0xF1E3, 0x9F18, 0xF6CF, 0x9F19, 0xC567, 0x9F1A, 0xF6D0,\t0x9F1B, 0xF6CE, 0x9F1C, 0xF879, 0x9F1E, 0xF8E9, 0x9F20, 0xB9AB,\n\t0x9F22, 0xEFB4, 0x9F23, 0xEFB3, 0x9F24, 0xEFB2, 0x9F25, 0xF1E4,\t0x9F28, 0xF1E8, 0x9F29, 0xF1E7, 0x9F2A, 0xF1E6, 0x9F2B, 0xF1E5,\n\t0x9F2C, 0xC35E, 0x9F2D, 0xF3F6, 0x9F2E, 0xF5B9, 0x9F2F, 0xC4D3,\t0x9F30, 0xF5B8, 0x9F31, 0xF6D1, 0x9F32, 0xF7CB, 0x9F33, 0xF7CA,\n\t0x9F34, 0xC5C4, 0x9F35, 0xF7C9, 0x9F36, 0xF87C, 0x9F37, 0xF87B,\t0x9F38, 0xF87A, 0x9F3B, 0xBBF3, 0x9F3D, 0xECB8, 0x9F3E, 0xC24D,\n\t0x9F40, 0xF3F7, 0x9F41, 0xF3F8, 0x9F42, 0xF7CC, 0x9F43, 0xF87D,\t0x9F46, 0xF8EA, 0x9F47, 0xF966, 0x9F48, 0xF9B9, 0x9F49, 0xF9D4,\n\t0x9F4A, 0xBBF4, 0x9F4B, 0xC24E, 0x9F4C, 0xF1E9, 0x9F4D, 0xF3F9,\t0x9F4E, 0xF6D2, 0x9F4F, 0xF87E, 0x9F52, 0xBEA6, 0x9F54, 0xEFB5,\n\t0x9F55, 0xF1EA, 0x9F56, 0xF3FA, 0x9F57, 0xF3FB, 0x9F58, 0xF3FC,\t0x9F59, 0xF5BE, 0x9F5B, 0xF5BA, 0x9F5C, 0xC568, 0x9F5D, 0xF5BD,\n\t0x9F5E, 0xF5BC, 0x9F5F, 0xC4D4, 0x9F60, 0xF5BB, 0x9F61, 0xC4D6,\t0x9F63, 0xC4D5, 0x9F64, 0xF6D4, 0x9F65, 0xF6D3, 0x9F66, 0xC569,\n\t0x9F67, 0xC56A, 0x9F6A, 0xC5C6, 0x9F6B, 0xF7CD, 0x9F6C, 0xC5C5,\t0x9F6E, 0xF8A3, 0x9F6F, 0xF8A4, 0x9F70, 0xF8A2, 0x9F71, 0xF8A1,\n\t0x9F72, 0xC654, 0x9F74, 0xF8EB, 0x9F75, 0xF8EC, 0x9F76, 0xF8ED,\t0x9F77, 0xC653, 0x9F78, 0xF967, 0x9F79, 0xF96A, 0x9F7A, 0xF969,\n\t0x9F7B, 0xF968, 0x9F7E, 0xF9D3, 0x9F8D, 0xC073, 0x9F90, 0xC365,\t0x9F91, 0xF5BF, 0x9F92, 0xF6D5, 0x9F94, 0xC5C7, 0x9F95, 0xF7CE,\n\t0x9F98, 0xF9D5, 0x9F9C, 0xC074, 0x9FA0, 0xEFB6, 0x9FA2, 0xF7CF,\t0x9FA4, 0xF9A1, 0xFA0C, 0xC94A, 0xFA0D, 0xDDFC, 0xFE30, 0xA14A,\n\t0xFE31, 0xA157, 0xFE33, 0xA159, 0xFE34, 0xA15B, 0xFE35, 0xA15F,\t0xFE36, 0xA160, 0xFE37, 0xA163, 0xFE38, 0xA164, 0xFE39, 0xA167,\n\t0xFE3A, 0xA168, 0xFE3B, 0xA16B, 0xFE3C, 0xA16C, 0xFE3D, 0xA16F,\t0xFE3E, 0xA170, 0xFE3F, 0xA173, 0xFE40, 0xA174, 0xFE41, 0xA177,\n\t0xFE42, 0xA178, 0xFE43, 0xA17B, 0xFE44, 0xA17C, 0xFE49, 0xA1C6,\t0xFE4A, 0xA1C7, 0xFE4B, 0xA1CA, 0xFE4C, 0xA1CB, 0xFE4D, 0xA1C8,\n\t0xFE4E, 0xA1C9, 0xFE4F, 0xA15C, 0xFE50, 0xA14D, 0xFE51, 0xA14E,\t0xFE52, 0xA14F, 0xFE54, 0xA151, 0xFE55, 0xA152, 0xFE56, 0xA153,\n\t0xFE57, 0xA154, 0xFE59, 0xA17D, 0xFE5A, 0xA17E, 0xFE5B, 0xA1A1,\t0xFE5C, 0xA1A2, 0xFE5D, 0xA1A3, 0xFE5E, 0xA1A4, 0xFE5F, 0xA1CC,\n\t0xFE60, 0xA1CD, 0xFE61, 0xA1CE, 0xFE62, 0xA1DE, 0xFE63, 0xA1DF,\t0xFE64, 0xA1E0, 0xFE65, 0xA1E1, 0xFE66, 0xA1E2, 0xFE68, 0xA242,\n\t0xFE69, 0xA24C, 0xFE6A, 0xA24D, 0xFE6B, 0xA24E, 0xFF01, 0xA149,\t0xFF03, 0xA1AD, 0xFF04, 0xA243, 0xFF05, 0xA248, 0xFF06, 0xA1AE,\n\t0xFF08, 0xA15D, 0xFF09, 0xA15E, 0xFF0A, 0xA1AF, 0xFF0B, 0xA1CF,\t0xFF0C, 0xA141, 0xFF0D, 0xA1D0, 0xFF0E, 0xA144, 0xFF0F, 0xA1FE,\n\t0xFF10, 0xA2AF, 0xFF11, 0xA2B0, 0xFF12, 0xA2B1, 0xFF13, 0xA2B2,\t0xFF14, 0xA2B3, 0xFF15, 0xA2B4, 0xFF16, 0xA2B5, 0xFF17, 0xA2B6,\n\t0xFF18, 0xA2B7, 0xFF19, 0xA2B8, 0xFF1A, 0xA147, 0xFF1B, 0xA146,\t0xFF1C, 0xA1D5, 0xFF1D, 0xA1D7, 0xFF1E, 0xA1D6, 0xFF1F, 0xA148,\n\t0xFF20, 0xA249, 0xFF21, 0xA2CF, 0xFF22, 0xA2D0, 0xFF23, 0xA2D1,\t0xFF24, 0xA2D2, 0xFF25, 0xA2D3, 0xFF26, 0xA2D4, 0xFF27, 0xA2D5,\n\t0xFF28, 0xA2D6, 0xFF29, 0xA2D7, 0xFF2A, 0xA2D8, 0xFF2B, 0xA2D9,\t0xFF2C, 0xA2DA, 0xFF2D, 0xA2DB, 0xFF2E, 0xA2DC, 0xFF2F, 0xA2DD,\n\t0xFF30, 0xA2DE, 0xFF31, 0xA2DF, 0xFF32, 0xA2E0, 0xFF33, 0xA2E1,\t0xFF34, 0xA2E2, 0xFF35, 0xA2E3, 0xFF36, 0xA2E4, 0xFF37, 0xA2E5,\n\t0xFF38, 0xA2E6, 0xFF39, 0xA2E7, 0xFF3A, 0xA2E8, 0xFF3C, 0xA240,\t0xFF3F, 0xA1C4, 0xFF41, 0xA2E9, 0xFF42, 0xA2EA, 0xFF43, 0xA2EB,\n\t0xFF44, 0xA2EC, 0xFF45, 0xA2ED, 0xFF46, 0xA2EE, 0xFF47, 0xA2EF,\t0xFF48, 0xA2F0, 0xFF49, 0xA2F1, 0xFF4A, 0xA2F2, 0xFF4B, 0xA2F3,\n\t0xFF4C, 0xA2F4, 0xFF4D, 0xA2F5, 0xFF4E, 0xA2F6, 0xFF4F, 0xA2F7,\t0xFF50, 0xA2F8, 0xFF51, 0xA2F9, 0xFF52, 0xA2FA, 0xFF53, 0xA2FB,\n\t0xFF54, 0xA2FC, 0xFF55, 0xA2FD, 0xFF56, 0xA2FE, 0xFF57, 0xA340,\t0xFF58, 0xA341, 0xFF59, 0xA342, 0xFF5A, 0xA343, 0xFF5B, 0xA161,\n\t0xFF5C, 0xA155, 0xFF5D, 0xA162, 0xFF5E, 0xA1E3, 0xFFE0, 0xA246,\t0xFFE1, 0xA247, 0xFFE3, 0xA1C3, 0xFFE5, 0xA244, 0, 0\n};\n\nstatic const WCHAR oem2uni950[] = {\t/* Big5 --> Unicode pairs */\n\t0xA140, 0x3000, 0xA141, 0xFF0C, 0xA142, 0x3001, 0xA143, 0x3002,\t0xA144, 0xFF0E, 0xA145, 0x2027, 0xA146, 0xFF1B, 0xA147, 0xFF1A,\n\t0xA148, 0xFF1F, 0xA149, 0xFF01, 0xA14A, 0xFE30, 0xA14B, 0x2026,\t0xA14C, 0x2025, 0xA14D, 0xFE50, 0xA14E, 0xFE51, 0xA14F, 0xFE52,\n\t0xA150, 0x00B7, 0xA151, 0xFE54, 0xA152, 0xFE55, 0xA153, 0xFE56,\t0xA154, 0xFE57, 0xA155, 0xFF5C, 0xA156, 0x2013, 0xA157, 0xFE31,\n\t0xA158, 0x2014, 0xA159, 0xFE33, 0xA15A, 0x2574, 0xA15B, 0xFE34,\t0xA15C, 0xFE4F, 0xA15D, 0xFF08, 0xA15E, 0xFF09, 0xA15F, 0xFE35,\n\t0xA160, 0xFE36, 0xA161, 0xFF5B, 0xA162, 0xFF5D, 0xA163, 0xFE37,\t0xA164, 0xFE38, 0xA165, 0x3014, 0xA166, 0x3015, 0xA167, 0xFE39,\n\t0xA168, 0xFE3A, 0xA169, 0x3010, 0xA16A, 0x3011, 0xA16B, 0xFE3B,\t0xA16C, 0xFE3C, 0xA16D, 0x300A, 0xA16E, 0x300B, 0xA16F, 0xFE3D,\n\t0xA170, 0xFE3E, 0xA171, 0x3008, 0xA172, 0x3009, 0xA173, 0xFE3F,\t0xA174, 0xFE40, 0xA175, 0x300C, 0xA176, 0x300D, 0xA177, 0xFE41,\n\t0xA178, 0xFE42, 0xA179, 0x300E, 0xA17A, 0x300F, 0xA17B, 0xFE43,\t0xA17C, 0xFE44, 0xA17D, 0xFE59, 0xA17E, 0xFE5A, 0xA1A1, 0xFE5B,\n\t0xA1A2, 0xFE5C, 0xA1A3, 0xFE5D, 0xA1A4, 0xFE5E, 0xA1A5, 0x2018,\t0xA1A6, 0x2019, 0xA1A7, 0x201C, 0xA1A8, 0x201D, 0xA1A9, 0x301D,\n\t0xA1AA, 0x301E, 0xA1AB, 0x2035, 0xA1AC, 0x2032, 0xA1AD, 0xFF03,\t0xA1AE, 0xFF06, 0xA1AF, 0xFF0A, 0xA1B0, 0x203B, 0xA1B1, 0x00A7,\n\t0xA1B2, 0x3003, 0xA1B3, 0x25CB, 0xA1B4, 0x25CF, 0xA1B5, 0x25B3,\t0xA1B6, 0x25B2, 0xA1B7, 0x25CE, 0xA1B8, 0x2606, 0xA1B9, 0x2605,\n\t0xA1BA, 0x25C7, 0xA1BB, 0x25C6, 0xA1BC, 0x25A1, 0xA1BD, 0x25A0,\t0xA1BE, 0x25BD, 0xA1BF, 0x25BC, 0xA1C0, 0x32A3, 0xA1C1, 0x2105,\n\t0xA1C2, 0x00AF, 0xA1C3, 0xFFE3, 0xA1C4, 0xFF3F, 0xA1C5, 0x02CD,\t0xA1C6, 0xFE49, 0xA1C7, 0xFE4A, 0xA1C8, 0xFE4D, 0xA1C9, 0xFE4E,\n\t0xA1CA, 0xFE4B, 0xA1CB, 0xFE4C, 0xA1CC, 0xFE5F, 0xA1CD, 0xFE60,\t0xA1CE, 0xFE61, 0xA1CF, 0xFF0B, 0xA1D0, 0xFF0D, 0xA1D1, 0x00D7,\n\t0xA1D2, 0x00F7, 0xA1D3, 0x00B1, 0xA1D4, 0x221A, 0xA1D5, 0xFF1C,\t0xA1D6, 0xFF1E, 0xA1D7, 0xFF1D, 0xA1D8, 0x2266, 0xA1D9, 0x2267,\n\t0xA1DA, 0x2260, 0xA1DB, 0x221E, 0xA1DC, 0x2252, 0xA1DD, 0x2261,\t0xA1DE, 0xFE62, 0xA1DF, 0xFE63, 0xA1E0, 0xFE64, 0xA1E1, 0xFE65,\n\t0xA1E2, 0xFE66, 0xA1E3, 0xFF5E, 0xA1E4, 0x2229, 0xA1E5, 0x222A,\t0xA1E6, 0x22A5, 0xA1E7, 0x2220, 0xA1E8, 0x221F, 0xA1E9, 0x22BF,\n\t0xA1EA, 0x33D2, 0xA1EB, 0x33D1, 0xA1EC, 0x222B, 0xA1ED, 0x222E,\t0xA1EE, 0x2235, 0xA1EF, 0x2234, 0xA1F0, 0x2640, 0xA1F1, 0x2642,\n\t0xA1F2, 0x2295, 0xA1F3, 0x2299, 0xA1F4, 0x2191, 0xA1F5, 0x2193,\t0xA1F6, 0x2190, 0xA1F7, 0x2192, 0xA1F8, 0x2196, 0xA1F9, 0x2197,\n\t0xA1FA, 0x2199, 0xA1FB, 0x2198, 0xA1FC, 0x2225, 0xA1FD, 0x2223,\t0xA1FE, 0xFF0F, 0xA240, 0xFF3C, 0xA241, 0x2215, 0xA242, 0xFE68,\n\t0xA243, 0xFF04, 0xA244, 0xFFE5, 0xA245, 0x3012, 0xA246, 0xFFE0,\t0xA247, 0xFFE1, 0xA248, 0xFF05, 0xA249, 0xFF20, 0xA24A, 0x2103,\n\t0xA24B, 0x2109, 0xA24C, 0xFE69, 0xA24D, 0xFE6A, 0xA24E, 0xFE6B,\t0xA24F, 0x33D5, 0xA250, 0x339C, 0xA251, 0x339D, 0xA252, 0x339E,\n\t0xA253, 0x33CE, 0xA254, 0x33A1, 0xA255, 0x338E, 0xA256, 0x338F,\t0xA257, 0x33C4, 0xA258, 0x00B0, 0xA259, 0x5159, 0xA25A, 0x515B,\n\t0xA25B, 0x515E, 0xA25C, 0x515D, 0xA25D, 0x5161, 0xA25E, 0x5163,\t0xA25F, 0x55E7, 0xA260, 0x74E9, 0xA261, 0x7CCE, 0xA262, 0x2581,\n\t0xA263, 0x2582, 0xA264, 0x2583, 0xA265, 0x2584, 0xA266, 0x2585,\t0xA267, 0x2586, 0xA268, 0x2587, 0xA269, 0x2588, 0xA26A, 0x258F,\n\t0xA26B, 0x258E, 0xA26C, 0x258D, 0xA26D, 0x258C, 0xA26E, 0x258B,\t0xA26F, 0x258A, 0xA270, 0x2589, 0xA271, 0x253C, 0xA272, 0x2534,\n\t0xA273, 0x252C, 0xA274, 0x2524, 0xA275, 0x251C, 0xA276, 0x2594,\t0xA277, 0x2500, 0xA278, 0x2502, 0xA279, 0x2595, 0xA27A, 0x250C,\n\t0xA27B, 0x2510, 0xA27C, 0x2514, 0xA27D, 0x2518, 0xA27E, 0x256D,\t0xA2A1, 0x256E, 0xA2A2, 0x2570, 0xA2A3, 0x256F, 0xA2A4, 0x2550,\n\t0xA2A5, 0x255E, 0xA2A6, 0x256A, 0xA2A7, 0x2561, 0xA2A8, 0x25E2,\t0xA2A9, 0x25E3, 0xA2AA, 0x25E5, 0xA2AB, 0x25E4, 0xA2AC, 0x2571,\n\t0xA2AD, 0x2572, 0xA2AE, 0x2573, 0xA2AF, 0xFF10, 0xA2B0, 0xFF11,\t0xA2B1, 0xFF12, 0xA2B2, 0xFF13, 0xA2B3, 0xFF14, 0xA2B4, 0xFF15,\n\t0xA2B5, 0xFF16, 0xA2B6, 0xFF17, 0xA2B7, 0xFF18, 0xA2B8, 0xFF19,\t0xA2B9, 0x2160, 0xA2BA, 0x2161, 0xA2BB, 0x2162, 0xA2BC, 0x2163,\n\t0xA2BD, 0x2164, 0xA2BE, 0x2165, 0xA2BF, 0x2166, 0xA2C0, 0x2167,\t0xA2C1, 0x2168, 0xA2C2, 0x2169, 0xA2C3, 0x3021, 0xA2C4, 0x3022,\n\t0xA2C5, 0x3023, 0xA2C6, 0x3024, 0xA2C7, 0x3025, 0xA2C8, 0x3026,\t0xA2C9, 0x3027, 0xA2CA, 0x3028, 0xA2CB, 0x3029, 0xA2CC, 0x5341,\n\t0xA2CD, 0x5344, 0xA2CE, 0x5345, 0xA2CF, 0xFF21, 0xA2D0, 0xFF22,\t0xA2D1, 0xFF23, 0xA2D2, 0xFF24, 0xA2D3, 0xFF25, 0xA2D4, 0xFF26,\n\t0xA2D5, 0xFF27, 0xA2D6, 0xFF28, 0xA2D7, 0xFF29, 0xA2D8, 0xFF2A,\t0xA2D9, 0xFF2B, 0xA2DA, 0xFF2C, 0xA2DB, 0xFF2D, 0xA2DC, 0xFF2E,\n\t0xA2DD, 0xFF2F, 0xA2DE, 0xFF30, 0xA2DF, 0xFF31, 0xA2E0, 0xFF32,\t0xA2E1, 0xFF33, 0xA2E2, 0xFF34, 0xA2E3, 0xFF35, 0xA2E4, 0xFF36,\n\t0xA2E5, 0xFF37, 0xA2E6, 0xFF38, 0xA2E7, 0xFF39, 0xA2E8, 0xFF3A,\t0xA2E9, 0xFF41, 0xA2EA, 0xFF42, 0xA2EB, 0xFF43, 0xA2EC, 0xFF44,\n\t0xA2ED, 0xFF45, 0xA2EE, 0xFF46, 0xA2EF, 0xFF47, 0xA2F0, 0xFF48,\t0xA2F1, 0xFF49, 0xA2F2, 0xFF4A, 0xA2F3, 0xFF4B, 0xA2F4, 0xFF4C,\n\t0xA2F5, 0xFF4D, 0xA2F6, 0xFF4E, 0xA2F7, 0xFF4F, 0xA2F8, 0xFF50,\t0xA2F9, 0xFF51, 0xA2FA, 0xFF52, 0xA2FB, 0xFF53, 0xA2FC, 0xFF54,\n\t0xA2FD, 0xFF55, 0xA2FE, 0xFF56, 0xA340, 0xFF57, 0xA341, 0xFF58,\t0xA342, 0xFF59, 0xA343, 0xFF5A, 0xA344, 0x0391, 0xA345, 0x0392,\n\t0xA346, 0x0393, 0xA347, 0x0394, 0xA348, 0x0395, 0xA349, 0x0396,\t0xA34A, 0x0397, 0xA34B, 0x0398, 0xA34C, 0x0399, 0xA34D, 0x039A,\n\t0xA34E, 0x039B, 0xA34F, 0x039C, 0xA350, 0x039D, 0xA351, 0x039E,\t0xA352, 0x039F, 0xA353, 0x03A0, 0xA354, 0x03A1, 0xA355, 0x03A3,\n\t0xA356, 0x03A4, 0xA357, 0x03A5, 0xA358, 0x03A6, 0xA359, 0x03A7,\t0xA35A, 0x03A8, 0xA35B, 0x03A9, 0xA35C, 0x03B1, 0xA35D, 0x03B2,\n\t0xA35E, 0x03B3, 0xA35F, 0x03B4, 0xA360, 0x03B5, 0xA361, 0x03B6,\t0xA362, 0x03B7, 0xA363, 0x03B8, 0xA364, 0x03B9, 0xA365, 0x03BA,\n\t0xA366, 0x03BB, 0xA367, 0x03BC, 0xA368, 0x03BD, 0xA369, 0x03BE,\t0xA36A, 0x03BF, 0xA36B, 0x03C0, 0xA36C, 0x03C1, 0xA36D, 0x03C3,\n\t0xA36E, 0x03C4, 0xA36F, 0x03C5, 0xA370, 0x03C6, 0xA371, 0x03C7,\t0xA372, 0x03C8, 0xA373, 0x03C9, 0xA374, 0x3105, 0xA375, 0x3106,\n\t0xA376, 0x3107, 0xA377, 0x3108, 0xA378, 0x3109, 0xA379, 0x310A,\t0xA37A, 0x310B, 0xA37B, 0x310C, 0xA37C, 0x310D, 0xA37D, 0x310E,\n\t0xA37E, 0x310F, 0xA3A1, 0x3110, 0xA3A2, 0x3111, 0xA3A3, 0x3112,\t0xA3A4, 0x3113, 0xA3A5, 0x3114, 0xA3A6, 0x3115, 0xA3A7, 0x3116,\n\t0xA3A8, 0x3117, 0xA3A9, 0x3118, 0xA3AA, 0x3119, 0xA3AB, 0x311A,\t0xA3AC, 0x311B, 0xA3AD, 0x311C, 0xA3AE, 0x311D, 0xA3AF, 0x311E,\n\t0xA3B0, 0x311F, 0xA3B1, 0x3120, 0xA3B2, 0x3121, 0xA3B3, 0x3122,\t0xA3B4, 0x3123, 0xA3B5, 0x3124, 0xA3B6, 0x3125, 0xA3B7, 0x3126,\n\t0xA3B8, 0x3127, 0xA3B9, 0x3128, 0xA3BA, 0x3129, 0xA3BB, 0x02D9,\t0xA3BC, 0x02C9, 0xA3BD, 0x02CA, 0xA3BE, 0x02C7, 0xA3BF, 0x02CB,\n\t0xA3E1, 0x20AC, 0xA440, 0x4E00, 0xA441, 0x4E59, 0xA442, 0x4E01,\t0xA443, 0x4E03, 0xA444, 0x4E43, 0xA445, 0x4E5D, 0xA446, 0x4E86,\n\t0xA447, 0x4E8C, 0xA448, 0x4EBA, 0xA449, 0x513F, 0xA44A, 0x5165,\t0xA44B, 0x516B, 0xA44C, 0x51E0, 0xA44D, 0x5200, 0xA44E, 0x5201,\n\t0xA44F, 0x529B, 0xA450, 0x5315, 0xA451, 0x5341, 0xA452, 0x535C,\t0xA453, 0x53C8, 0xA454, 0x4E09, 0xA455, 0x4E0B, 0xA456, 0x4E08,\n\t0xA457, 0x4E0A, 0xA458, 0x4E2B, 0xA459, 0x4E38, 0xA45A, 0x51E1,\t0xA45B, 0x4E45, 0xA45C, 0x4E48, 0xA45D, 0x4E5F, 0xA45E, 0x4E5E,\n\t0xA45F, 0x4E8E, 0xA460, 0x4EA1, 0xA461, 0x5140, 0xA462, 0x5203,\t0xA463, 0x52FA, 0xA464, 0x5343, 0xA465, 0x53C9, 0xA466, 0x53E3,\n\t0xA467, 0x571F, 0xA468, 0x58EB, 0xA469, 0x5915, 0xA46A, 0x5927,\t0xA46B, 0x5973, 0xA46C, 0x5B50, 0xA46D, 0x5B51, 0xA46E, 0x5B53,\n\t0xA46F, 0x5BF8, 0xA470, 0x5C0F, 0xA471, 0x5C22, 0xA472, 0x5C38,\t0xA473, 0x5C71, 0xA474, 0x5DDD, 0xA475, 0x5DE5, 0xA476, 0x5DF1,\n\t0xA477, 0x5DF2, 0xA478, 0x5DF3, 0xA479, 0x5DFE, 0xA47A, 0x5E72,\t0xA47B, 0x5EFE, 0xA47C, 0x5F0B, 0xA47D, 0x5F13, 0xA47E, 0x624D,\n\t0xA4A1, 0x4E11, 0xA4A2, 0x4E10, 0xA4A3, 0x4E0D, 0xA4A4, 0x4E2D,\t0xA4A5, 0x4E30, 0xA4A6, 0x4E39, 0xA4A7, 0x4E4B, 0xA4A8, 0x5C39,\n\t0xA4A9, 0x4E88, 0xA4AA, 0x4E91, 0xA4AB, 0x4E95, 0xA4AC, 0x4E92,\t0xA4AD, 0x4E94, 0xA4AE, 0x4EA2, 0xA4AF, 0x4EC1, 0xA4B0, 0x4EC0,\n\t0xA4B1, 0x4EC3, 0xA4B2, 0x4EC6, 0xA4B3, 0x4EC7, 0xA4B4, 0x4ECD,\t0xA4B5, 0x4ECA, 0xA4B6, 0x4ECB, 0xA4B7, 0x4EC4, 0xA4B8, 0x5143,\n\t0xA4B9, 0x5141, 0xA4BA, 0x5167, 0xA4BB, 0x516D, 0xA4BC, 0x516E,\t0xA4BD, 0x516C, 0xA4BE, 0x5197, 0xA4BF, 0x51F6, 0xA4C0, 0x5206,\n\t0xA4C1, 0x5207, 0xA4C2, 0x5208, 0xA4C3, 0x52FB, 0xA4C4, 0x52FE,\t0xA4C5, 0x52FF, 0xA4C6, 0x5316, 0xA4C7, 0x5339, 0xA4C8, 0x5348,\n\t0xA4C9, 0x5347, 0xA4CA, 0x5345, 0xA4CB, 0x535E, 0xA4CC, 0x5384,\t0xA4CD, 0x53CB, 0xA4CE, 0x53CA, 0xA4CF, 0x53CD, 0xA4D0, 0x58EC,\n\t0xA4D1, 0x5929, 0xA4D2, 0x592B, 0xA4D3, 0x592A, 0xA4D4, 0x592D,\t0xA4D5, 0x5B54, 0xA4D6, 0x5C11, 0xA4D7, 0x5C24, 0xA4D8, 0x5C3A,\n\t0xA4D9, 0x5C6F, 0xA4DA, 0x5DF4, 0xA4DB, 0x5E7B, 0xA4DC, 0x5EFF,\t0xA4DD, 0x5F14, 0xA4DE, 0x5F15, 0xA4DF, 0x5FC3, 0xA4E0, 0x6208,\n\t0xA4E1, 0x6236, 0xA4E2, 0x624B, 0xA4E3, 0x624E, 0xA4E4, 0x652F,\t0xA4E5, 0x6587, 0xA4E6, 0x6597, 0xA4E7, 0x65A4, 0xA4E8, 0x65B9,\n\t0xA4E9, 0x65E5, 0xA4EA, 0x66F0, 0xA4EB, 0x6708, 0xA4EC, 0x6728,\t0xA4ED, 0x6B20, 0xA4EE, 0x6B62, 0xA4EF, 0x6B79, 0xA4F0, 0x6BCB,\n\t0xA4F1, 0x6BD4, 0xA4F2, 0x6BDB, 0xA4F3, 0x6C0F, 0xA4F4, 0x6C34,\t0xA4F5, 0x706B, 0xA4F6, 0x722A, 0xA4F7, 0x7236, 0xA4F8, 0x723B,\n\t0xA4F9, 0x7247, 0xA4FA, 0x7259, 0xA4FB, 0x725B, 0xA4FC, 0x72AC,\t0xA4FD, 0x738B, 0xA4FE, 0x4E19, 0xA540, 0x4E16, 0xA541, 0x4E15,\n\t0xA542, 0x4E14, 0xA543, 0x4E18, 0xA544, 0x4E3B, 0xA545, 0x4E4D,\t0xA546, 0x4E4F, 0xA547, 0x4E4E, 0xA548, 0x4EE5, 0xA549, 0x4ED8,\n\t0xA54A, 0x4ED4, 0xA54B, 0x4ED5, 0xA54C, 0x4ED6, 0xA54D, 0x4ED7,\t0xA54E, 0x4EE3, 0xA54F, 0x4EE4, 0xA550, 0x4ED9, 0xA551, 0x4EDE,\n\t0xA552, 0x5145, 0xA553, 0x5144, 0xA554, 0x5189, 0xA555, 0x518A,\t0xA556, 0x51AC, 0xA557, 0x51F9, 0xA558, 0x51FA, 0xA559, 0x51F8,\n\t0xA55A, 0x520A, 0xA55B, 0x52A0, 0xA55C, 0x529F, 0xA55D, 0x5305,\t0xA55E, 0x5306, 0xA55F, 0x5317, 0xA560, 0x531D, 0xA561, 0x4EDF,\n\t0xA562, 0x534A, 0xA563, 0x5349, 0xA564, 0x5361, 0xA565, 0x5360,\t0xA566, 0x536F, 0xA567, 0x536E, 0xA568, 0x53BB, 0xA569, 0x53EF,\n\t0xA56A, 0x53E4, 0xA56B, 0x53F3, 0xA56C, 0x53EC, 0xA56D, 0x53EE,\t0xA56E, 0x53E9, 0xA56F, 0x53E8, 0xA570, 0x53FC, 0xA571, 0x53F8,\n\t0xA572, 0x53F5, 0xA573, 0x53EB, 0xA574, 0x53E6, 0xA575, 0x53EA,\t0xA576, 0x53F2, 0xA577, 0x53F1, 0xA578, 0x53F0, 0xA579, 0x53E5,\n\t0xA57A, 0x53ED, 0xA57B, 0x53FB, 0xA57C, 0x56DB, 0xA57D, 0x56DA,\t0xA57E, 0x5916, 0xA5A1, 0x592E, 0xA5A2, 0x5931, 0xA5A3, 0x5974,\n\t0xA5A4, 0x5976, 0xA5A5, 0x5B55, 0xA5A6, 0x5B83, 0xA5A7, 0x5C3C,\t0xA5A8, 0x5DE8, 0xA5A9, 0x5DE7, 0xA5AA, 0x5DE6, 0xA5AB, 0x5E02,\n\t0xA5AC, 0x5E03, 0xA5AD, 0x5E73, 0xA5AE, 0x5E7C, 0xA5AF, 0x5F01,\t0xA5B0, 0x5F18, 0xA5B1, 0x5F17, 0xA5B2, 0x5FC5, 0xA5B3, 0x620A,\n\t0xA5B4, 0x6253, 0xA5B5, 0x6254, 0xA5B6, 0x6252, 0xA5B7, 0x6251,\t0xA5B8, 0x65A5, 0xA5B9, 0x65E6, 0xA5BA, 0x672E, 0xA5BB, 0x672C,\n\t0xA5BC, 0x672A, 0xA5BD, 0x672B, 0xA5BE, 0x672D, 0xA5BF, 0x6B63,\t0xA5C0, 0x6BCD, 0xA5C1, 0x6C11, 0xA5C2, 0x6C10, 0xA5C3, 0x6C38,\n\t0xA5C4, 0x6C41, 0xA5C5, 0x6C40, 0xA5C6, 0x6C3E, 0xA5C7, 0x72AF,\t0xA5C8, 0x7384, 0xA5C9, 0x7389, 0xA5CA, 0x74DC, 0xA5CB, 0x74E6,\n\t0xA5CC, 0x7518, 0xA5CD, 0x751F, 0xA5CE, 0x7528, 0xA5CF, 0x7529,\t0xA5D0, 0x7530, 0xA5D1, 0x7531, 0xA5D2, 0x7532, 0xA5D3, 0x7533,\n\t0xA5D4, 0x758B, 0xA5D5, 0x767D, 0xA5D6, 0x76AE, 0xA5D7, 0x76BF,\t0xA5D8, 0x76EE, 0xA5D9, 0x77DB, 0xA5DA, 0x77E2, 0xA5DB, 0x77F3,\n\t0xA5DC, 0x793A, 0xA5DD, 0x79BE, 0xA5DE, 0x7A74, 0xA5DF, 0x7ACB,\t0xA5E0, 0x4E1E, 0xA5E1, 0x4E1F, 0xA5E2, 0x4E52, 0xA5E3, 0x4E53,\n\t0xA5E4, 0x4E69, 0xA5E5, 0x4E99, 0xA5E6, 0x4EA4, 0xA5E7, 0x4EA6,\t0xA5E8, 0x4EA5, 0xA5E9, 0x4EFF, 0xA5EA, 0x4F09, 0xA5EB, 0x4F19,\n\t0xA5EC, 0x4F0A, 0xA5ED, 0x4F15, 0xA5EE, 0x4F0D, 0xA5EF, 0x4F10,\t0xA5F0, 0x4F11, 0xA5F1, 0x4F0F, 0xA5F2, 0x4EF2, 0xA5F3, 0x4EF6,\n\t0xA5F4, 0x4EFB, 0xA5F5, 0x4EF0, 0xA5F6, 0x4EF3, 0xA5F7, 0x4EFD,\t0xA5F8, 0x4F01, 0xA5F9, 0x4F0B, 0xA5FA, 0x5149, 0xA5FB, 0x5147,\n\t0xA5FC, 0x5146, 0xA5FD, 0x5148, 0xA5FE, 0x5168, 0xA640, 0x5171,\t0xA641, 0x518D, 0xA642, 0x51B0, 0xA643, 0x5217, 0xA644, 0x5211,\n\t0xA645, 0x5212, 0xA646, 0x520E, 0xA647, 0x5216, 0xA648, 0x52A3,\t0xA649, 0x5308, 0xA64A, 0x5321, 0xA64B, 0x5320, 0xA64C, 0x5370,\n\t0xA64D, 0x5371, 0xA64E, 0x5409, 0xA64F, 0x540F, 0xA650, 0x540C,\t0xA651, 0x540A, 0xA652, 0x5410, 0xA653, 0x5401, 0xA654, 0x540B,\n\t0xA655, 0x5404, 0xA656, 0x5411, 0xA657, 0x540D, 0xA658, 0x5408,\t0xA659, 0x5403, 0xA65A, 0x540E, 0xA65B, 0x5406, 0xA65C, 0x5412,\n\t0xA65D, 0x56E0, 0xA65E, 0x56DE, 0xA65F, 0x56DD, 0xA660, 0x5733,\t0xA661, 0x5730, 0xA662, 0x5728, 0xA663, 0x572D, 0xA664, 0x572C,\n\t0xA665, 0x572F, 0xA666, 0x5729, 0xA667, 0x5919, 0xA668, 0x591A,\t0xA669, 0x5937, 0xA66A, 0x5938, 0xA66B, 0x5984, 0xA66C, 0x5978,\n\t0xA66D, 0x5983, 0xA66E, 0x597D, 0xA66F, 0x5979, 0xA670, 0x5982,\t0xA671, 0x5981, 0xA672, 0x5B57, 0xA673, 0x5B58, 0xA674, 0x5B87,\n\t0xA675, 0x5B88, 0xA676, 0x5B85, 0xA677, 0x5B89, 0xA678, 0x5BFA,\t0xA679, 0x5C16, 0xA67A, 0x5C79, 0xA67B, 0x5DDE, 0xA67C, 0x5E06,\n\t0xA67D, 0x5E76, 0xA67E, 0x5E74, 0xA6A1, 0x5F0F, 0xA6A2, 0x5F1B,\t0xA6A3, 0x5FD9, 0xA6A4, 0x5FD6, 0xA6A5, 0x620E, 0xA6A6, 0x620C,\n\t0xA6A7, 0x620D, 0xA6A8, 0x6210, 0xA6A9, 0x6263, 0xA6AA, 0x625B,\t0xA6AB, 0x6258, 0xA6AC, 0x6536, 0xA6AD, 0x65E9, 0xA6AE, 0x65E8,\n\t0xA6AF, 0x65EC, 0xA6B0, 0x65ED, 0xA6B1, 0x66F2, 0xA6B2, 0x66F3,\t0xA6B3, 0x6709, 0xA6B4, 0x673D, 0xA6B5, 0x6734, 0xA6B6, 0x6731,\n\t0xA6B7, 0x6735, 0xA6B8, 0x6B21, 0xA6B9, 0x6B64, 0xA6BA, 0x6B7B,\t0xA6BB, 0x6C16, 0xA6BC, 0x6C5D, 0xA6BD, 0x6C57, 0xA6BE, 0x6C59,\n\t0xA6BF, 0x6C5F, 0xA6C0, 0x6C60, 0xA6C1, 0x6C50, 0xA6C2, 0x6C55,\t0xA6C3, 0x6C61, 0xA6C4, 0x6C5B, 0xA6C5, 0x6C4D, 0xA6C6, 0x6C4E,\n\t0xA6C7, 0x7070, 0xA6C8, 0x725F, 0xA6C9, 0x725D, 0xA6CA, 0x767E,\t0xA6CB, 0x7AF9, 0xA6CC, 0x7C73, 0xA6CD, 0x7CF8, 0xA6CE, 0x7F36,\n\t0xA6CF, 0x7F8A, 0xA6D0, 0x7FBD, 0xA6D1, 0x8001, 0xA6D2, 0x8003,\t0xA6D3, 0x800C, 0xA6D4, 0x8012, 0xA6D5, 0x8033, 0xA6D6, 0x807F,\n\t0xA6D7, 0x8089, 0xA6D8, 0x808B, 0xA6D9, 0x808C, 0xA6DA, 0x81E3,\t0xA6DB, 0x81EA, 0xA6DC, 0x81F3, 0xA6DD, 0x81FC, 0xA6DE, 0x820C,\n\t0xA6DF, 0x821B, 0xA6E0, 0x821F, 0xA6E1, 0x826E, 0xA6E2, 0x8272,\t0xA6E3, 0x827E, 0xA6E4, 0x866B, 0xA6E5, 0x8840, 0xA6E6, 0x884C,\n\t0xA6E7, 0x8863, 0xA6E8, 0x897F, 0xA6E9, 0x9621, 0xA6EA, 0x4E32,\t0xA6EB, 0x4EA8, 0xA6EC, 0x4F4D, 0xA6ED, 0x4F4F, 0xA6EE, 0x4F47,\n\t0xA6EF, 0x4F57, 0xA6F0, 0x4F5E, 0xA6F1, 0x4F34, 0xA6F2, 0x4F5B,\t0xA6F3, 0x4F55, 0xA6F4, 0x4F30, 0xA6F5, 0x4F50, 0xA6F6, 0x4F51,\n\t0xA6F7, 0x4F3D, 0xA6F8, 0x4F3A, 0xA6F9, 0x4F38, 0xA6FA, 0x4F43,\t0xA6FB, 0x4F54, 0xA6FC, 0x4F3C, 0xA6FD, 0x4F46, 0xA6FE, 0x4F63,\n\t0xA740, 0x4F5C, 0xA741, 0x4F60, 0xA742, 0x4F2F, 0xA743, 0x4F4E,\t0xA744, 0x4F36, 0xA745, 0x4F59, 0xA746, 0x4F5D, 0xA747, 0x4F48,\n\t0xA748, 0x4F5A, 0xA749, 0x514C, 0xA74A, 0x514B, 0xA74B, 0x514D,\t0xA74C, 0x5175, 0xA74D, 0x51B6, 0xA74E, 0x51B7, 0xA74F, 0x5225,\n\t0xA750, 0x5224, 0xA751, 0x5229, 0xA752, 0x522A, 0xA753, 0x5228,\t0xA754, 0x52AB, 0xA755, 0x52A9, 0xA756, 0x52AA, 0xA757, 0x52AC,\n\t0xA758, 0x5323, 0xA759, 0x5373, 0xA75A, 0x5375, 0xA75B, 0x541D,\t0xA75C, 0x542D, 0xA75D, 0x541E, 0xA75E, 0x543E, 0xA75F, 0x5426,\n\t0xA760, 0x544E, 0xA761, 0x5427, 0xA762, 0x5446, 0xA763, 0x5443,\t0xA764, 0x5433, 0xA765, 0x5448, 0xA766, 0x5442, 0xA767, 0x541B,\n\t0xA768, 0x5429, 0xA769, 0x544A, 0xA76A, 0x5439, 0xA76B, 0x543B,\t0xA76C, 0x5438, 0xA76D, 0x542E, 0xA76E, 0x5435, 0xA76F, 0x5436,\n\t0xA770, 0x5420, 0xA771, 0x543C, 0xA772, 0x5440, 0xA773, 0x5431,\t0xA774, 0x542B, 0xA775, 0x541F, 0xA776, 0x542C, 0xA777, 0x56EA,\n\t0xA778, 0x56F0, 0xA779, 0x56E4, 0xA77A, 0x56EB, 0xA77B, 0x574A,\t0xA77C, 0x5751, 0xA77D, 0x5740, 0xA77E, 0x574D, 0xA7A1, 0x5747,\n\t0xA7A2, 0x574E, 0xA7A3, 0x573E, 0xA7A4, 0x5750, 0xA7A5, 0x574F,\t0xA7A6, 0x573B, 0xA7A7, 0x58EF, 0xA7A8, 0x593E, 0xA7A9, 0x599D,\n\t0xA7AA, 0x5992, 0xA7AB, 0x59A8, 0xA7AC, 0x599E, 0xA7AD, 0x59A3,\t0xA7AE, 0x5999, 0xA7AF, 0x5996, 0xA7B0, 0x598D, 0xA7B1, 0x59A4,\n\t0xA7B2, 0x5993, 0xA7B3, 0x598A, 0xA7B4, 0x59A5, 0xA7B5, 0x5B5D,\t0xA7B6, 0x5B5C, 0xA7B7, 0x5B5A, 0xA7B8, 0x5B5B, 0xA7B9, 0x5B8C,\n\t0xA7BA, 0x5B8B, 0xA7BB, 0x5B8F, 0xA7BC, 0x5C2C, 0xA7BD, 0x5C40,\t0xA7BE, 0x5C41, 0xA7BF, 0x5C3F, 0xA7C0, 0x5C3E, 0xA7C1, 0x5C90,\n\t0xA7C2, 0x5C91, 0xA7C3, 0x5C94, 0xA7C4, 0x5C8C, 0xA7C5, 0x5DEB,\t0xA7C6, 0x5E0C, 0xA7C7, 0x5E8F, 0xA7C8, 0x5E87, 0xA7C9, 0x5E8A,\n\t0xA7CA, 0x5EF7, 0xA7CB, 0x5F04, 0xA7CC, 0x5F1F, 0xA7CD, 0x5F64,\t0xA7CE, 0x5F62, 0xA7CF, 0x5F77, 0xA7D0, 0x5F79, 0xA7D1, 0x5FD8,\n\t0xA7D2, 0x5FCC, 0xA7D3, 0x5FD7, 0xA7D4, 0x5FCD, 0xA7D5, 0x5FF1,\t0xA7D6, 0x5FEB, 0xA7D7, 0x5FF8, 0xA7D8, 0x5FEA, 0xA7D9, 0x6212,\n\t0xA7DA, 0x6211, 0xA7DB, 0x6284, 0xA7DC, 0x6297, 0xA7DD, 0x6296,\t0xA7DE, 0x6280, 0xA7DF, 0x6276, 0xA7E0, 0x6289, 0xA7E1, 0x626D,\n\t0xA7E2, 0x628A, 0xA7E3, 0x627C, 0xA7E4, 0x627E, 0xA7E5, 0x6279,\t0xA7E6, 0x6273, 0xA7E7, 0x6292, 0xA7E8, 0x626F, 0xA7E9, 0x6298,\n\t0xA7EA, 0x626E, 0xA7EB, 0x6295, 0xA7EC, 0x6293, 0xA7ED, 0x6291,\t0xA7EE, 0x6286, 0xA7EF, 0x6539, 0xA7F0, 0x653B, 0xA7F1, 0x6538,\n\t0xA7F2, 0x65F1, 0xA7F3, 0x66F4, 0xA7F4, 0x675F, 0xA7F5, 0x674E,\t0xA7F6, 0x674F, 0xA7F7, 0x6750, 0xA7F8, 0x6751, 0xA7F9, 0x675C,\n\t0xA7FA, 0x6756, 0xA7FB, 0x675E, 0xA7FC, 0x6749, 0xA7FD, 0x6746,\t0xA7FE, 0x6760, 0xA840, 0x6753, 0xA841, 0x6757, 0xA842, 0x6B65,\n\t0xA843, 0x6BCF, 0xA844, 0x6C42, 0xA845, 0x6C5E, 0xA846, 0x6C99,\t0xA847, 0x6C81, 0xA848, 0x6C88, 0xA849, 0x6C89, 0xA84A, 0x6C85,\n\t0xA84B, 0x6C9B, 0xA84C, 0x6C6A, 0xA84D, 0x6C7A, 0xA84E, 0x6C90,\t0xA84F, 0x6C70, 0xA850, 0x6C8C, 0xA851, 0x6C68, 0xA852, 0x6C96,\n\t0xA853, 0x6C92, 0xA854, 0x6C7D, 0xA855, 0x6C83, 0xA856, 0x6C72,\t0xA857, 0x6C7E, 0xA858, 0x6C74, 0xA859, 0x6C86, 0xA85A, 0x6C76,\n\t0xA85B, 0x6C8D, 0xA85C, 0x6C94, 0xA85D, 0x6C98, 0xA85E, 0x6C82,\t0xA85F, 0x7076, 0xA860, 0x707C, 0xA861, 0x707D, 0xA862, 0x7078,\n\t0xA863, 0x7262, 0xA864, 0x7261, 0xA865, 0x7260, 0xA866, 0x72C4,\t0xA867, 0x72C2, 0xA868, 0x7396, 0xA869, 0x752C, 0xA86A, 0x752B,\n\t0xA86B, 0x7537, 0xA86C, 0x7538, 0xA86D, 0x7682, 0xA86E, 0x76EF,\t0xA86F, 0x77E3, 0xA870, 0x79C1, 0xA871, 0x79C0, 0xA872, 0x79BF,\n\t0xA873, 0x7A76, 0xA874, 0x7CFB, 0xA875, 0x7F55, 0xA876, 0x8096,\t0xA877, 0x8093, 0xA878, 0x809D, 0xA879, 0x8098, 0xA87A, 0x809B,\n\t0xA87B, 0x809A, 0xA87C, 0x80B2, 0xA87D, 0x826F, 0xA87E, 0x8292,\t0xA8A1, 0x828B, 0xA8A2, 0x828D, 0xA8A3, 0x898B, 0xA8A4, 0x89D2,\n\t0xA8A5, 0x8A00, 0xA8A6, 0x8C37, 0xA8A7, 0x8C46, 0xA8A8, 0x8C55,\t0xA8A9, 0x8C9D, 0xA8AA, 0x8D64, 0xA8AB, 0x8D70, 0xA8AC, 0x8DB3,\n\t0xA8AD, 0x8EAB, 0xA8AE, 0x8ECA, 0xA8AF, 0x8F9B, 0xA8B0, 0x8FB0,\t0xA8B1, 0x8FC2, 0xA8B2, 0x8FC6, 0xA8B3, 0x8FC5, 0xA8B4, 0x8FC4,\n\t0xA8B5, 0x5DE1, 0xA8B6, 0x9091, 0xA8B7, 0x90A2, 0xA8B8, 0x90AA,\t0xA8B9, 0x90A6, 0xA8BA, 0x90A3, 0xA8BB, 0x9149, 0xA8BC, 0x91C6,\n\t0xA8BD, 0x91CC, 0xA8BE, 0x9632, 0xA8BF, 0x962E, 0xA8C0, 0x9631,\t0xA8C1, 0x962A, 0xA8C2, 0x962C, 0xA8C3, 0x4E26, 0xA8C4, 0x4E56,\n\t0xA8C5, 0x4E73, 0xA8C6, 0x4E8B, 0xA8C7, 0x4E9B, 0xA8C8, 0x4E9E,\t0xA8C9, 0x4EAB, 0xA8CA, 0x4EAC, 0xA8CB, 0x4F6F, 0xA8CC, 0x4F9D,\n\t0xA8CD, 0x4F8D, 0xA8CE, 0x4F73, 0xA8CF, 0x4F7F, 0xA8D0, 0x4F6C,\t0xA8D1, 0x4F9B, 0xA8D2, 0x4F8B, 0xA8D3, 0x4F86, 0xA8D4, 0x4F83,\n\t0xA8D5, 0x4F70, 0xA8D6, 0x4F75, 0xA8D7, 0x4F88, 0xA8D8, 0x4F69,\t0xA8D9, 0x4F7B, 0xA8DA, 0x4F96, 0xA8DB, 0x4F7E, 0xA8DC, 0x4F8F,\n\t0xA8DD, 0x4F91, 0xA8DE, 0x4F7A, 0xA8DF, 0x5154, 0xA8E0, 0x5152,\t0xA8E1, 0x5155, 0xA8E2, 0x5169, 0xA8E3, 0x5177, 0xA8E4, 0x5176,\n\t0xA8E5, 0x5178, 0xA8E6, 0x51BD, 0xA8E7, 0x51FD, 0xA8E8, 0x523B,\t0xA8E9, 0x5238, 0xA8EA, 0x5237, 0xA8EB, 0x523A, 0xA8EC, 0x5230,\n\t0xA8ED, 0x522E, 0xA8EE, 0x5236, 0xA8EF, 0x5241, 0xA8F0, 0x52BE,\t0xA8F1, 0x52BB, 0xA8F2, 0x5352, 0xA8F3, 0x5354, 0xA8F4, 0x5353,\n\t0xA8F5, 0x5351, 0xA8F6, 0x5366, 0xA8F7, 0x5377, 0xA8F8, 0x5378,\t0xA8F9, 0x5379, 0xA8FA, 0x53D6, 0xA8FB, 0x53D4, 0xA8FC, 0x53D7,\n\t0xA8FD, 0x5473, 0xA8FE, 0x5475, 0xA940, 0x5496, 0xA941, 0x5478,\t0xA942, 0x5495, 0xA943, 0x5480, 0xA944, 0x547B, 0xA945, 0x5477,\n\t0xA946, 0x5484, 0xA947, 0x5492, 0xA948, 0x5486, 0xA949, 0x547C,\t0xA94A, 0x5490, 0xA94B, 0x5471, 0xA94C, 0x5476, 0xA94D, 0x548C,\n\t0xA94E, 0x549A, 0xA94F, 0x5462, 0xA950, 0x5468, 0xA951, 0x548B,\t0xA952, 0x547D, 0xA953, 0x548E, 0xA954, 0x56FA, 0xA955, 0x5783,\n\t0xA956, 0x5777, 0xA957, 0x576A, 0xA958, 0x5769, 0xA959, 0x5761,\t0xA95A, 0x5766, 0xA95B, 0x5764, 0xA95C, 0x577C, 0xA95D, 0x591C,\n\t0xA95E, 0x5949, 0xA95F, 0x5947, 0xA960, 0x5948, 0xA961, 0x5944,\t0xA962, 0x5954, 0xA963, 0x59BE, 0xA964, 0x59BB, 0xA965, 0x59D4,\n\t0xA966, 0x59B9, 0xA967, 0x59AE, 0xA968, 0x59D1, 0xA969, 0x59C6,\t0xA96A, 0x59D0, 0xA96B, 0x59CD, 0xA96C, 0x59CB, 0xA96D, 0x59D3,\n\t0xA96E, 0x59CA, 0xA96F, 0x59AF, 0xA970, 0x59B3, 0xA971, 0x59D2,\t0xA972, 0x59C5, 0xA973, 0x5B5F, 0xA974, 0x5B64, 0xA975, 0x5B63,\n\t0xA976, 0x5B97, 0xA977, 0x5B9A, 0xA978, 0x5B98, 0xA979, 0x5B9C,\t0xA97A, 0x5B99, 0xA97B, 0x5B9B, 0xA97C, 0x5C1A, 0xA97D, 0x5C48,\n\t0xA97E, 0x5C45, 0xA9A1, 0x5C46, 0xA9A2, 0x5CB7, 0xA9A3, 0x5CA1,\t0xA9A4, 0x5CB8, 0xA9A5, 0x5CA9, 0xA9A6, 0x5CAB, 0xA9A7, 0x5CB1,\n\t0xA9A8, 0x5CB3, 0xA9A9, 0x5E18, 0xA9AA, 0x5E1A, 0xA9AB, 0x5E16,\t0xA9AC, 0x5E15, 0xA9AD, 0x5E1B, 0xA9AE, 0x5E11, 0xA9AF, 0x5E78,\n\t0xA9B0, 0x5E9A, 0xA9B1, 0x5E97, 0xA9B2, 0x5E9C, 0xA9B3, 0x5E95,\t0xA9B4, 0x5E96, 0xA9B5, 0x5EF6, 0xA9B6, 0x5F26, 0xA9B7, 0x5F27,\n\t0xA9B8, 0x5F29, 0xA9B9, 0x5F80, 0xA9BA, 0x5F81, 0xA9BB, 0x5F7F,\t0xA9BC, 0x5F7C, 0xA9BD, 0x5FDD, 0xA9BE, 0x5FE0, 0xA9BF, 0x5FFD,\n\t0xA9C0, 0x5FF5, 0xA9C1, 0x5FFF, 0xA9C2, 0x600F, 0xA9C3, 0x6014,\t0xA9C4, 0x602F, 0xA9C5, 0x6035, 0xA9C6, 0x6016, 0xA9C7, 0x602A,\n\t0xA9C8, 0x6015, 0xA9C9, 0x6021, 0xA9CA, 0x6027, 0xA9CB, 0x6029,\t0xA9CC, 0x602B, 0xA9CD, 0x601B, 0xA9CE, 0x6216, 0xA9CF, 0x6215,\n\t0xA9D0, 0x623F, 0xA9D1, 0x623E, 0xA9D2, 0x6240, 0xA9D3, 0x627F,\t0xA9D4, 0x62C9, 0xA9D5, 0x62CC, 0xA9D6, 0x62C4, 0xA9D7, 0x62BF,\n\t0xA9D8, 0x62C2, 0xA9D9, 0x62B9, 0xA9DA, 0x62D2, 0xA9DB, 0x62DB,\t0xA9DC, 0x62AB, 0xA9DD, 0x62D3, 0xA9DE, 0x62D4, 0xA9DF, 0x62CB,\n\t0xA9E0, 0x62C8, 0xA9E1, 0x62A8, 0xA9E2, 0x62BD, 0xA9E3, 0x62BC,\t0xA9E4, 0x62D0, 0xA9E5, 0x62D9, 0xA9E6, 0x62C7, 0xA9E7, 0x62CD,\n\t0xA9E8, 0x62B5, 0xA9E9, 0x62DA, 0xA9EA, 0x62B1, 0xA9EB, 0x62D8,\t0xA9EC, 0x62D6, 0xA9ED, 0x62D7, 0xA9EE, 0x62C6, 0xA9EF, 0x62AC,\n\t0xA9F0, 0x62CE, 0xA9F1, 0x653E, 0xA9F2, 0x65A7, 0xA9F3, 0x65BC,\t0xA9F4, 0x65FA, 0xA9F5, 0x6614, 0xA9F6, 0x6613, 0xA9F7, 0x660C,\n\t0xA9F8, 0x6606, 0xA9F9, 0x6602, 0xA9FA, 0x660E, 0xA9FB, 0x6600,\t0xA9FC, 0x660F, 0xA9FD, 0x6615, 0xA9FE, 0x660A, 0xAA40, 0x6607,\n\t0xAA41, 0x670D, 0xAA42, 0x670B, 0xAA43, 0x676D, 0xAA44, 0x678B,\t0xAA45, 0x6795, 0xAA46, 0x6771, 0xAA47, 0x679C, 0xAA48, 0x6773,\n\t0xAA49, 0x6777, 0xAA4A, 0x6787, 0xAA4B, 0x679D, 0xAA4C, 0x6797,\t0xAA4D, 0x676F, 0xAA4E, 0x6770, 0xAA4F, 0x677F, 0xAA50, 0x6789,\n\t0xAA51, 0x677E, 0xAA52, 0x6790, 0xAA53, 0x6775, 0xAA54, 0x679A,\t0xAA55, 0x6793, 0xAA56, 0x677C, 0xAA57, 0x676A, 0xAA58, 0x6772,\n\t0xAA59, 0x6B23, 0xAA5A, 0x6B66, 0xAA5B, 0x6B67, 0xAA5C, 0x6B7F,\t0xAA5D, 0x6C13, 0xAA5E, 0x6C1B, 0xAA5F, 0x6CE3, 0xAA60, 0x6CE8,\n\t0xAA61, 0x6CF3, 0xAA62, 0x6CB1, 0xAA63, 0x6CCC, 0xAA64, 0x6CE5,\t0xAA65, 0x6CB3, 0xAA66, 0x6CBD, 0xAA67, 0x6CBE, 0xAA68, 0x6CBC,\n\t0xAA69, 0x6CE2, 0xAA6A, 0x6CAB, 0xAA6B, 0x6CD5, 0xAA6C, 0x6CD3,\t0xAA6D, 0x6CB8, 0xAA6E, 0x6CC4, 0xAA6F, 0x6CB9, 0xAA70, 0x6CC1,\n\t0xAA71, 0x6CAE, 0xAA72, 0x6CD7, 0xAA73, 0x6CC5, 0xAA74, 0x6CF1,\t0xAA75, 0x6CBF, 0xAA76, 0x6CBB, 0xAA77, 0x6CE1, 0xAA78, 0x6CDB,\n\t0xAA79, 0x6CCA, 0xAA7A, 0x6CAC, 0xAA7B, 0x6CEF, 0xAA7C, 0x6CDC,\t0xAA7D, 0x6CD6, 0xAA7E, 0x6CE0, 0xAAA1, 0x7095, 0xAAA2, 0x708E,\n\t0xAAA3, 0x7092, 0xAAA4, 0x708A, 0xAAA5, 0x7099, 0xAAA6, 0x722C,\t0xAAA7, 0x722D, 0xAAA8, 0x7238, 0xAAA9, 0x7248, 0xAAAA, 0x7267,\n\t0xAAAB, 0x7269, 0xAAAC, 0x72C0, 0xAAAD, 0x72CE, 0xAAAE, 0x72D9,\t0xAAAF, 0x72D7, 0xAAB0, 0x72D0, 0xAAB1, 0x73A9, 0xAAB2, 0x73A8,\n\t0xAAB3, 0x739F, 0xAAB4, 0x73AB, 0xAAB5, 0x73A5, 0xAAB6, 0x753D,\t0xAAB7, 0x759D, 0xAAB8, 0x7599, 0xAAB9, 0x759A, 0xAABA, 0x7684,\n\t0xAABB, 0x76C2, 0xAABC, 0x76F2, 0xAABD, 0x76F4, 0xAABE, 0x77E5,\t0xAABF, 0x77FD, 0xAAC0, 0x793E, 0xAAC1, 0x7940, 0xAAC2, 0x7941,\n\t0xAAC3, 0x79C9, 0xAAC4, 0x79C8, 0xAAC5, 0x7A7A, 0xAAC6, 0x7A79,\t0xAAC7, 0x7AFA, 0xAAC8, 0x7CFE, 0xAAC9, 0x7F54, 0xAACA, 0x7F8C,\n\t0xAACB, 0x7F8B, 0xAACC, 0x8005, 0xAACD, 0x80BA, 0xAACE, 0x80A5,\t0xAACF, 0x80A2, 0xAAD0, 0x80B1, 0xAAD1, 0x80A1, 0xAAD2, 0x80AB,\n\t0xAAD3, 0x80A9, 0xAAD4, 0x80B4, 0xAAD5, 0x80AA, 0xAAD6, 0x80AF,\t0xAAD7, 0x81E5, 0xAAD8, 0x81FE, 0xAAD9, 0x820D, 0xAADA, 0x82B3,\n\t0xAADB, 0x829D, 0xAADC, 0x8299, 0xAADD, 0x82AD, 0xAADE, 0x82BD,\t0xAADF, 0x829F, 0xAAE0, 0x82B9, 0xAAE1, 0x82B1, 0xAAE2, 0x82AC,\n\t0xAAE3, 0x82A5, 0xAAE4, 0x82AF, 0xAAE5, 0x82B8, 0xAAE6, 0x82A3,\t0xAAE7, 0x82B0, 0xAAE8, 0x82BE, 0xAAE9, 0x82B7, 0xAAEA, 0x864E,\n\t0xAAEB, 0x8671, 0xAAEC, 0x521D, 0xAAED, 0x8868, 0xAAEE, 0x8ECB,\t0xAAEF, 0x8FCE, 0xAAF0, 0x8FD4, 0xAAF1, 0x8FD1, 0xAAF2, 0x90B5,\n\t0xAAF3, 0x90B8, 0xAAF4, 0x90B1, 0xAAF5, 0x90B6, 0xAAF6, 0x91C7,\t0xAAF7, 0x91D1, 0xAAF8, 0x9577, 0xAAF9, 0x9580, 0xAAFA, 0x961C,\n\t0xAAFB, 0x9640, 0xAAFC, 0x963F, 0xAAFD, 0x963B, 0xAAFE, 0x9644,\t0xAB40, 0x9642, 0xAB41, 0x96B9, 0xAB42, 0x96E8, 0xAB43, 0x9752,\n\t0xAB44, 0x975E, 0xAB45, 0x4E9F, 0xAB46, 0x4EAD, 0xAB47, 0x4EAE,\t0xAB48, 0x4FE1, 0xAB49, 0x4FB5, 0xAB4A, 0x4FAF, 0xAB4B, 0x4FBF,\n\t0xAB4C, 0x4FE0, 0xAB4D, 0x4FD1, 0xAB4E, 0x4FCF, 0xAB4F, 0x4FDD,\t0xAB50, 0x4FC3, 0xAB51, 0x4FB6, 0xAB52, 0x4FD8, 0xAB53, 0x4FDF,\n\t0xAB54, 0x4FCA, 0xAB55, 0x4FD7, 0xAB56, 0x4FAE, 0xAB57, 0x4FD0,\t0xAB58, 0x4FC4, 0xAB59, 0x4FC2, 0xAB5A, 0x4FDA, 0xAB5B, 0x4FCE,\n\t0xAB5C, 0x4FDE, 0xAB5D, 0x4FB7, 0xAB5E, 0x5157, 0xAB5F, 0x5192,\t0xAB60, 0x5191, 0xAB61, 0x51A0, 0xAB62, 0x524E, 0xAB63, 0x5243,\n\t0xAB64, 0x524A, 0xAB65, 0x524D, 0xAB66, 0x524C, 0xAB67, 0x524B,\t0xAB68, 0x5247, 0xAB69, 0x52C7, 0xAB6A, 0x52C9, 0xAB6B, 0x52C3,\n\t0xAB6C, 0x52C1, 0xAB6D, 0x530D, 0xAB6E, 0x5357, 0xAB6F, 0x537B,\t0xAB70, 0x539A, 0xAB71, 0x53DB, 0xAB72, 0x54AC, 0xAB73, 0x54C0,\n\t0xAB74, 0x54A8, 0xAB75, 0x54CE, 0xAB76, 0x54C9, 0xAB77, 0x54B8,\t0xAB78, 0x54A6, 0xAB79, 0x54B3, 0xAB7A, 0x54C7, 0xAB7B, 0x54C2,\n\t0xAB7C, 0x54BD, 0xAB7D, 0x54AA, 0xAB7E, 0x54C1, 0xABA1, 0x54C4,\t0xABA2, 0x54C8, 0xABA3, 0x54AF, 0xABA4, 0x54AB, 0xABA5, 0x54B1,\n\t0xABA6, 0x54BB, 0xABA7, 0x54A9, 0xABA8, 0x54A7, 0xABA9, 0x54BF,\t0xABAA, 0x56FF, 0xABAB, 0x5782, 0xABAC, 0x578B, 0xABAD, 0x57A0,\n\t0xABAE, 0x57A3, 0xABAF, 0x57A2, 0xABB0, 0x57CE, 0xABB1, 0x57AE,\t0xABB2, 0x5793, 0xABB3, 0x5955, 0xABB4, 0x5951, 0xABB5, 0x594F,\n\t0xABB6, 0x594E, 0xABB7, 0x5950, 0xABB8, 0x59DC, 0xABB9, 0x59D8,\t0xABBA, 0x59FF, 0xABBB, 0x59E3, 0xABBC, 0x59E8, 0xABBD, 0x5A03,\n\t0xABBE, 0x59E5, 0xABBF, 0x59EA, 0xABC0, 0x59DA, 0xABC1, 0x59E6,\t0xABC2, 0x5A01, 0xABC3, 0x59FB, 0xABC4, 0x5B69, 0xABC5, 0x5BA3,\n\t0xABC6, 0x5BA6, 0xABC7, 0x5BA4, 0xABC8, 0x5BA2, 0xABC9, 0x5BA5,\t0xABCA, 0x5C01, 0xABCB, 0x5C4E, 0xABCC, 0x5C4F, 0xABCD, 0x5C4D,\n\t0xABCE, 0x5C4B, 0xABCF, 0x5CD9, 0xABD0, 0x5CD2, 0xABD1, 0x5DF7,\t0xABD2, 0x5E1D, 0xABD3, 0x5E25, 0xABD4, 0x5E1F, 0xABD5, 0x5E7D,\n\t0xABD6, 0x5EA0, 0xABD7, 0x5EA6, 0xABD8, 0x5EFA, 0xABD9, 0x5F08,\t0xABDA, 0x5F2D, 0xABDB, 0x5F65, 0xABDC, 0x5F88, 0xABDD, 0x5F85,\n\t0xABDE, 0x5F8A, 0xABDF, 0x5F8B, 0xABE0, 0x5F87, 0xABE1, 0x5F8C,\t0xABE2, 0x5F89, 0xABE3, 0x6012, 0xABE4, 0x601D, 0xABE5, 0x6020,\n\t0xABE6, 0x6025, 0xABE7, 0x600E, 0xABE8, 0x6028, 0xABE9, 0x604D,\t0xABEA, 0x6070, 0xABEB, 0x6068, 0xABEC, 0x6062, 0xABED, 0x6046,\n\t0xABEE, 0x6043, 0xABEF, 0x606C, 0xABF0, 0x606B, 0xABF1, 0x606A,\t0xABF2, 0x6064, 0xABF3, 0x6241, 0xABF4, 0x62DC, 0xABF5, 0x6316,\n\t0xABF6, 0x6309, 0xABF7, 0x62FC, 0xABF8, 0x62ED, 0xABF9, 0x6301,\t0xABFA, 0x62EE, 0xABFB, 0x62FD, 0xABFC, 0x6307, 0xABFD, 0x62F1,\n\t0xABFE, 0x62F7, 0xAC40, 0x62EF, 0xAC41, 0x62EC, 0xAC42, 0x62FE,\t0xAC43, 0x62F4, 0xAC44, 0x6311, 0xAC45, 0x6302, 0xAC46, 0x653F,\n\t0xAC47, 0x6545, 0xAC48, 0x65AB, 0xAC49, 0x65BD, 0xAC4A, 0x65E2,\t0xAC4B, 0x6625, 0xAC4C, 0x662D, 0xAC4D, 0x6620, 0xAC4E, 0x6627,\n\t0xAC4F, 0x662F, 0xAC50, 0x661F, 0xAC51, 0x6628, 0xAC52, 0x6631,\t0xAC53, 0x6624, 0xAC54, 0x66F7, 0xAC55, 0x67FF, 0xAC56, 0x67D3,\n\t0xAC57, 0x67F1, 0xAC58, 0x67D4, 0xAC59, 0x67D0, 0xAC5A, 0x67EC,\t0xAC5B, 0x67B6, 0xAC5C, 0x67AF, 0xAC5D, 0x67F5, 0xAC5E, 0x67E9,\n\t0xAC5F, 0x67EF, 0xAC60, 0x67C4, 0xAC61, 0x67D1, 0xAC62, 0x67B4,\t0xAC63, 0x67DA, 0xAC64, 0x67E5, 0xAC65, 0x67B8, 0xAC66, 0x67CF,\n\t0xAC67, 0x67DE, 0xAC68, 0x67F3, 0xAC69, 0x67B0, 0xAC6A, 0x67D9,\t0xAC6B, 0x67E2, 0xAC6C, 0x67DD, 0xAC6D, 0x67D2, 0xAC6E, 0x6B6A,\n\t0xAC6F, 0x6B83, 0xAC70, 0x6B86, 0xAC71, 0x6BB5, 0xAC72, 0x6BD2,\t0xAC73, 0x6BD7, 0xAC74, 0x6C1F, 0xAC75, 0x6CC9, 0xAC76, 0x6D0B,\n\t0xAC77, 0x6D32, 0xAC78, 0x6D2A, 0xAC79, 0x6D41, 0xAC7A, 0x6D25,\t0xAC7B, 0x6D0C, 0xAC7C, 0x6D31, 0xAC7D, 0x6D1E, 0xAC7E, 0x6D17,\n\t0xACA1, 0x6D3B, 0xACA2, 0x6D3D, 0xACA3, 0x6D3E, 0xACA4, 0x6D36,\t0xACA5, 0x6D1B, 0xACA6, 0x6CF5, 0xACA7, 0x6D39, 0xACA8, 0x6D27,\n\t0xACA9, 0x6D38, 0xACAA, 0x6D29, 0xACAB, 0x6D2E, 0xACAC, 0x6D35,\t0xACAD, 0x6D0E, 0xACAE, 0x6D2B, 0xACAF, 0x70AB, 0xACB0, 0x70BA,\n\t0xACB1, 0x70B3, 0xACB2, 0x70AC, 0xACB3, 0x70AF, 0xACB4, 0x70AD,\t0xACB5, 0x70B8, 0xACB6, 0x70AE, 0xACB7, 0x70A4, 0xACB8, 0x7230,\n\t0xACB9, 0x7272, 0xACBA, 0x726F, 0xACBB, 0x7274, 0xACBC, 0x72E9,\t0xACBD, 0x72E0, 0xACBE, 0x72E1, 0xACBF, 0x73B7, 0xACC0, 0x73CA,\n\t0xACC1, 0x73BB, 0xACC2, 0x73B2, 0xACC3, 0x73CD, 0xACC4, 0x73C0,\t0xACC5, 0x73B3, 0xACC6, 0x751A, 0xACC7, 0x752D, 0xACC8, 0x754F,\n\t0xACC9, 0x754C, 0xACCA, 0x754E, 0xACCB, 0x754B, 0xACCC, 0x75AB,\t0xACCD, 0x75A4, 0xACCE, 0x75A5, 0xACCF, 0x75A2, 0xACD0, 0x75A3,\n\t0xACD1, 0x7678, 0xACD2, 0x7686, 0xACD3, 0x7687, 0xACD4, 0x7688,\t0xACD5, 0x76C8, 0xACD6, 0x76C6, 0xACD7, 0x76C3, 0xACD8, 0x76C5,\n\t0xACD9, 0x7701, 0xACDA, 0x76F9, 0xACDB, 0x76F8, 0xACDC, 0x7709,\t0xACDD, 0x770B, 0xACDE, 0x76FE, 0xACDF, 0x76FC, 0xACE0, 0x7707,\n\t0xACE1, 0x77DC, 0xACE2, 0x7802, 0xACE3, 0x7814, 0xACE4, 0x780C,\t0xACE5, 0x780D, 0xACE6, 0x7946, 0xACE7, 0x7949, 0xACE8, 0x7948,\n\t0xACE9, 0x7947, 0xACEA, 0x79B9, 0xACEB, 0x79BA, 0xACEC, 0x79D1,\t0xACED, 0x79D2, 0xACEE, 0x79CB, 0xACEF, 0x7A7F, 0xACF0, 0x7A81,\n\t0xACF1, 0x7AFF, 0xACF2, 0x7AFD, 0xACF3, 0x7C7D, 0xACF4, 0x7D02,\t0xACF5, 0x7D05, 0xACF6, 0x7D00, 0xACF7, 0x7D09, 0xACF8, 0x7D07,\n\t0xACF9, 0x7D04, 0xACFA, 0x7D06, 0xACFB, 0x7F38, 0xACFC, 0x7F8E,\t0xACFD, 0x7FBF, 0xACFE, 0x8004, 0xAD40, 0x8010, 0xAD41, 0x800D,\n\t0xAD42, 0x8011, 0xAD43, 0x8036, 0xAD44, 0x80D6, 0xAD45, 0x80E5,\t0xAD46, 0x80DA, 0xAD47, 0x80C3, 0xAD48, 0x80C4, 0xAD49, 0x80CC,\n\t0xAD4A, 0x80E1, 0xAD4B, 0x80DB, 0xAD4C, 0x80CE, 0xAD4D, 0x80DE,\t0xAD4E, 0x80E4, 0xAD4F, 0x80DD, 0xAD50, 0x81F4, 0xAD51, 0x8222,\n\t0xAD52, 0x82E7, 0xAD53, 0x8303, 0xAD54, 0x8305, 0xAD55, 0x82E3,\t0xAD56, 0x82DB, 0xAD57, 0x82E6, 0xAD58, 0x8304, 0xAD59, 0x82E5,\n\t0xAD5A, 0x8302, 0xAD5B, 0x8309, 0xAD5C, 0x82D2, 0xAD5D, 0x82D7,\t0xAD5E, 0x82F1, 0xAD5F, 0x8301, 0xAD60, 0x82DC, 0xAD61, 0x82D4,\n\t0xAD62, 0x82D1, 0xAD63, 0x82DE, 0xAD64, 0x82D3, 0xAD65, 0x82DF,\t0xAD66, 0x82EF, 0xAD67, 0x8306, 0xAD68, 0x8650, 0xAD69, 0x8679,\n\t0xAD6A, 0x867B, 0xAD6B, 0x867A, 0xAD6C, 0x884D, 0xAD6D, 0x886B,\t0xAD6E, 0x8981, 0xAD6F, 0x89D4, 0xAD70, 0x8A08, 0xAD71, 0x8A02,\n\t0xAD72, 0x8A03, 0xAD73, 0x8C9E, 0xAD74, 0x8CA0, 0xAD75, 0x8D74,\t0xAD76, 0x8D73, 0xAD77, 0x8DB4, 0xAD78, 0x8ECD, 0xAD79, 0x8ECC,\n\t0xAD7A, 0x8FF0, 0xAD7B, 0x8FE6, 0xAD7C, 0x8FE2, 0xAD7D, 0x8FEA,\t0xAD7E, 0x8FE5, 0xADA1, 0x8FED, 0xADA2, 0x8FEB, 0xADA3, 0x8FE4,\n\t0xADA4, 0x8FE8, 0xADA5, 0x90CA, 0xADA6, 0x90CE, 0xADA7, 0x90C1,\t0xADA8, 0x90C3, 0xADA9, 0x914B, 0xADAA, 0x914A, 0xADAB, 0x91CD,\n\t0xADAC, 0x9582, 0xADAD, 0x9650, 0xADAE, 0x964B, 0xADAF, 0x964C,\t0xADB0, 0x964D, 0xADB1, 0x9762, 0xADB2, 0x9769, 0xADB3, 0x97CB,\n\t0xADB4, 0x97ED, 0xADB5, 0x97F3, 0xADB6, 0x9801, 0xADB7, 0x98A8,\t0xADB8, 0x98DB, 0xADB9, 0x98DF, 0xADBA, 0x9996, 0xADBB, 0x9999,\n\t0xADBC, 0x4E58, 0xADBD, 0x4EB3, 0xADBE, 0x500C, 0xADBF, 0x500D,\t0xADC0, 0x5023, 0xADC1, 0x4FEF, 0xADC2, 0x5026, 0xADC3, 0x5025,\n\t0xADC4, 0x4FF8, 0xADC5, 0x5029, 0xADC6, 0x5016, 0xADC7, 0x5006,\t0xADC8, 0x503C, 0xADC9, 0x501F, 0xADCA, 0x501A, 0xADCB, 0x5012,\n\t0xADCC, 0x5011, 0xADCD, 0x4FFA, 0xADCE, 0x5000, 0xADCF, 0x5014,\t0xADD0, 0x5028, 0xADD1, 0x4FF1, 0xADD2, 0x5021, 0xADD3, 0x500B,\n\t0xADD4, 0x5019, 0xADD5, 0x5018, 0xADD6, 0x4FF3, 0xADD7, 0x4FEE,\t0xADD8, 0x502D, 0xADD9, 0x502A, 0xADDA, 0x4FFE, 0xADDB, 0x502B,\n\t0xADDC, 0x5009, 0xADDD, 0x517C, 0xADDE, 0x51A4, 0xADDF, 0x51A5,\t0xADE0, 0x51A2, 0xADE1, 0x51CD, 0xADE2, 0x51CC, 0xADE3, 0x51C6,\n\t0xADE4, 0x51CB, 0xADE5, 0x5256, 0xADE6, 0x525C, 0xADE7, 0x5254,\t0xADE8, 0x525B, 0xADE9, 0x525D, 0xADEA, 0x532A, 0xADEB, 0x537F,\n\t0xADEC, 0x539F, 0xADED, 0x539D, 0xADEE, 0x53DF, 0xADEF, 0x54E8,\t0xADF0, 0x5510, 0xADF1, 0x5501, 0xADF2, 0x5537, 0xADF3, 0x54FC,\n\t0xADF4, 0x54E5, 0xADF5, 0x54F2, 0xADF6, 0x5506, 0xADF7, 0x54FA,\t0xADF8, 0x5514, 0xADF9, 0x54E9, 0xADFA, 0x54ED, 0xADFB, 0x54E1,\n\t0xADFC, 0x5509, 0xADFD, 0x54EE, 0xADFE, 0x54EA, 0xAE40, 0x54E6,\t0xAE41, 0x5527, 0xAE42, 0x5507, 0xAE43, 0x54FD, 0xAE44, 0x550F,\n\t0xAE45, 0x5703, 0xAE46, 0x5704, 0xAE47, 0x57C2, 0xAE48, 0x57D4,\t0xAE49, 0x57CB, 0xAE4A, 0x57C3, 0xAE4B, 0x5809, 0xAE4C, 0x590F,\n\t0xAE4D, 0x5957, 0xAE4E, 0x5958, 0xAE4F, 0x595A, 0xAE50, 0x5A11,\t0xAE51, 0x5A18, 0xAE52, 0x5A1C, 0xAE53, 0x5A1F, 0xAE54, 0x5A1B,\n\t0xAE55, 0x5A13, 0xAE56, 0x59EC, 0xAE57, 0x5A20, 0xAE58, 0x5A23,\t0xAE59, 0x5A29, 0xAE5A, 0x5A25, 0xAE5B, 0x5A0C, 0xAE5C, 0x5A09,\n\t0xAE5D, 0x5B6B, 0xAE5E, 0x5C58, 0xAE5F, 0x5BB0, 0xAE60, 0x5BB3,\t0xAE61, 0x5BB6, 0xAE62, 0x5BB4, 0xAE63, 0x5BAE, 0xAE64, 0x5BB5,\n\t0xAE65, 0x5BB9, 0xAE66, 0x5BB8, 0xAE67, 0x5C04, 0xAE68, 0x5C51,\t0xAE69, 0x5C55, 0xAE6A, 0x5C50, 0xAE6B, 0x5CED, 0xAE6C, 0x5CFD,\n\t0xAE6D, 0x5CFB, 0xAE6E, 0x5CEA, 0xAE6F, 0x5CE8, 0xAE70, 0x5CF0,\t0xAE71, 0x5CF6, 0xAE72, 0x5D01, 0xAE73, 0x5CF4, 0xAE74, 0x5DEE,\n\t0xAE75, 0x5E2D, 0xAE76, 0x5E2B, 0xAE77, 0x5EAB, 0xAE78, 0x5EAD,\t0xAE79, 0x5EA7, 0xAE7A, 0x5F31, 0xAE7B, 0x5F92, 0xAE7C, 0x5F91,\n\t0xAE7D, 0x5F90, 0xAE7E, 0x6059, 0xAEA1, 0x6063, 0xAEA2, 0x6065,\t0xAEA3, 0x6050, 0xAEA4, 0x6055, 0xAEA5, 0x606D, 0xAEA6, 0x6069,\n\t0xAEA7, 0x606F, 0xAEA8, 0x6084, 0xAEA9, 0x609F, 0xAEAA, 0x609A,\t0xAEAB, 0x608D, 0xAEAC, 0x6094, 0xAEAD, 0x608C, 0xAEAE, 0x6085,\n\t0xAEAF, 0x6096, 0xAEB0, 0x6247, 0xAEB1, 0x62F3, 0xAEB2, 0x6308,\t0xAEB3, 0x62FF, 0xAEB4, 0x634E, 0xAEB5, 0x633E, 0xAEB6, 0x632F,\n\t0xAEB7, 0x6355, 0xAEB8, 0x6342, 0xAEB9, 0x6346, 0xAEBA, 0x634F,\t0xAEBB, 0x6349, 0xAEBC, 0x633A, 0xAEBD, 0x6350, 0xAEBE, 0x633D,\n\t0xAEBF, 0x632A, 0xAEC0, 0x632B, 0xAEC1, 0x6328, 0xAEC2, 0x634D,\t0xAEC3, 0x634C, 0xAEC4, 0x6548, 0xAEC5, 0x6549, 0xAEC6, 0x6599,\n\t0xAEC7, 0x65C1, 0xAEC8, 0x65C5, 0xAEC9, 0x6642, 0xAECA, 0x6649,\t0xAECB, 0x664F, 0xAECC, 0x6643, 0xAECD, 0x6652, 0xAECE, 0x664C,\n\t0xAECF, 0x6645, 0xAED0, 0x6641, 0xAED1, 0x66F8, 0xAED2, 0x6714,\t0xAED3, 0x6715, 0xAED4, 0x6717, 0xAED5, 0x6821, 0xAED6, 0x6838,\n\t0xAED7, 0x6848, 0xAED8, 0x6846, 0xAED9, 0x6853, 0xAEDA, 0x6839,\t0xAEDB, 0x6842, 0xAEDC, 0x6854, 0xAEDD, 0x6829, 0xAEDE, 0x68B3,\n\t0xAEDF, 0x6817, 0xAEE0, 0x684C, 0xAEE1, 0x6851, 0xAEE2, 0x683D,\t0xAEE3, 0x67F4, 0xAEE4, 0x6850, 0xAEE5, 0x6840, 0xAEE6, 0x683C,\n\t0xAEE7, 0x6843, 0xAEE8, 0x682A, 0xAEE9, 0x6845, 0xAEEA, 0x6813,\t0xAEEB, 0x6818, 0xAEEC, 0x6841, 0xAEED, 0x6B8A, 0xAEEE, 0x6B89,\n\t0xAEEF, 0x6BB7, 0xAEF0, 0x6C23, 0xAEF1, 0x6C27, 0xAEF2, 0x6C28,\t0xAEF3, 0x6C26, 0xAEF4, 0x6C24, 0xAEF5, 0x6CF0, 0xAEF6, 0x6D6A,\n\t0xAEF7, 0x6D95, 0xAEF8, 0x6D88, 0xAEF9, 0x6D87, 0xAEFA, 0x6D66,\t0xAEFB, 0x6D78, 0xAEFC, 0x6D77, 0xAEFD, 0x6D59, 0xAEFE, 0x6D93,\n\t0xAF40, 0x6D6C, 0xAF41, 0x6D89, 0xAF42, 0x6D6E, 0xAF43, 0x6D5A,\t0xAF44, 0x6D74, 0xAF45, 0x6D69, 0xAF46, 0x6D8C, 0xAF47, 0x6D8A,\n\t0xAF48, 0x6D79, 0xAF49, 0x6D85, 0xAF4A, 0x6D65, 0xAF4B, 0x6D94,\t0xAF4C, 0x70CA, 0xAF4D, 0x70D8, 0xAF4E, 0x70E4, 0xAF4F, 0x70D9,\n\t0xAF50, 0x70C8, 0xAF51, 0x70CF, 0xAF52, 0x7239, 0xAF53, 0x7279,\t0xAF54, 0x72FC, 0xAF55, 0x72F9, 0xAF56, 0x72FD, 0xAF57, 0x72F8,\n\t0xAF58, 0x72F7, 0xAF59, 0x7386, 0xAF5A, 0x73ED, 0xAF5B, 0x7409,\t0xAF5C, 0x73EE, 0xAF5D, 0x73E0, 0xAF5E, 0x73EA, 0xAF5F, 0x73DE,\n\t0xAF60, 0x7554, 0xAF61, 0x755D, 0xAF62, 0x755C, 0xAF63, 0x755A,\t0xAF64, 0x7559, 0xAF65, 0x75BE, 0xAF66, 0x75C5, 0xAF67, 0x75C7,\n\t0xAF68, 0x75B2, 0xAF69, 0x75B3, 0xAF6A, 0x75BD, 0xAF6B, 0x75BC,\t0xAF6C, 0x75B9, 0xAF6D, 0x75C2, 0xAF6E, 0x75B8, 0xAF6F, 0x768B,\n\t0xAF70, 0x76B0, 0xAF71, 0x76CA, 0xAF72, 0x76CD, 0xAF73, 0x76CE,\t0xAF74, 0x7729, 0xAF75, 0x771F, 0xAF76, 0x7720, 0xAF77, 0x7728,\n\t0xAF78, 0x77E9, 0xAF79, 0x7830, 0xAF7A, 0x7827, 0xAF7B, 0x7838,\t0xAF7C, 0x781D, 0xAF7D, 0x7834, 0xAF7E, 0x7837, 0xAFA1, 0x7825,\n\t0xAFA2, 0x782D, 0xAFA3, 0x7820, 0xAFA4, 0x781F, 0xAFA5, 0x7832,\t0xAFA6, 0x7955, 0xAFA7, 0x7950, 0xAFA8, 0x7960, 0xAFA9, 0x795F,\n\t0xAFAA, 0x7956, 0xAFAB, 0x795E, 0xAFAC, 0x795D, 0xAFAD, 0x7957,\t0xAFAE, 0x795A, 0xAFAF, 0x79E4, 0xAFB0, 0x79E3, 0xAFB1, 0x79E7,\n\t0xAFB2, 0x79DF, 0xAFB3, 0x79E6, 0xAFB4, 0x79E9, 0xAFB5, 0x79D8,\t0xAFB6, 0x7A84, 0xAFB7, 0x7A88, 0xAFB8, 0x7AD9, 0xAFB9, 0x7B06,\n\t0xAFBA, 0x7B11, 0xAFBB, 0x7C89, 0xAFBC, 0x7D21, 0xAFBD, 0x7D17,\t0xAFBE, 0x7D0B, 0xAFBF, 0x7D0A, 0xAFC0, 0x7D20, 0xAFC1, 0x7D22,\n\t0xAFC2, 0x7D14, 0xAFC3, 0x7D10, 0xAFC4, 0x7D15, 0xAFC5, 0x7D1A,\t0xAFC6, 0x7D1C, 0xAFC7, 0x7D0D, 0xAFC8, 0x7D19, 0xAFC9, 0x7D1B,\n\t0xAFCA, 0x7F3A, 0xAFCB, 0x7F5F, 0xAFCC, 0x7F94, 0xAFCD, 0x7FC5,\t0xAFCE, 0x7FC1, 0xAFCF, 0x8006, 0xAFD0, 0x8018, 0xAFD1, 0x8015,\n\t0xAFD2, 0x8019, 0xAFD3, 0x8017, 0xAFD4, 0x803D, 0xAFD5, 0x803F,\t0xAFD6, 0x80F1, 0xAFD7, 0x8102, 0xAFD8, 0x80F0, 0xAFD9, 0x8105,\n\t0xAFDA, 0x80ED, 0xAFDB, 0x80F4, 0xAFDC, 0x8106, 0xAFDD, 0x80F8,\t0xAFDE, 0x80F3, 0xAFDF, 0x8108, 0xAFE0, 0x80FD, 0xAFE1, 0x810A,\n\t0xAFE2, 0x80FC, 0xAFE3, 0x80EF, 0xAFE4, 0x81ED, 0xAFE5, 0x81EC,\t0xAFE6, 0x8200, 0xAFE7, 0x8210, 0xAFE8, 0x822A, 0xAFE9, 0x822B,\n\t0xAFEA, 0x8228, 0xAFEB, 0x822C, 0xAFEC, 0x82BB, 0xAFED, 0x832B,\t0xAFEE, 0x8352, 0xAFEF, 0x8354, 0xAFF0, 0x834A, 0xAFF1, 0x8338,\n\t0xAFF2, 0x8350, 0xAFF3, 0x8349, 0xAFF4, 0x8335, 0xAFF5, 0x8334,\t0xAFF6, 0x834F, 0xAFF7, 0x8332, 0xAFF8, 0x8339, 0xAFF9, 0x8336,\n\t0xAFFA, 0x8317, 0xAFFB, 0x8340, 0xAFFC, 0x8331, 0xAFFD, 0x8328,\t0xAFFE, 0x8343, 0xB040, 0x8654, 0xB041, 0x868A, 0xB042, 0x86AA,\n\t0xB043, 0x8693, 0xB044, 0x86A4, 0xB045, 0x86A9, 0xB046, 0x868C,\t0xB047, 0x86A3, 0xB048, 0x869C, 0xB049, 0x8870, 0xB04A, 0x8877,\n\t0xB04B, 0x8881, 0xB04C, 0x8882, 0xB04D, 0x887D, 0xB04E, 0x8879,\t0xB04F, 0x8A18, 0xB050, 0x8A10, 0xB051, 0x8A0E, 0xB052, 0x8A0C,\n\t0xB053, 0x8A15, 0xB054, 0x8A0A, 0xB055, 0x8A17, 0xB056, 0x8A13,\t0xB057, 0x8A16, 0xB058, 0x8A0F, 0xB059, 0x8A11, 0xB05A, 0x8C48,\n\t0xB05B, 0x8C7A, 0xB05C, 0x8C79, 0xB05D, 0x8CA1, 0xB05E, 0x8CA2,\t0xB05F, 0x8D77, 0xB060, 0x8EAC, 0xB061, 0x8ED2, 0xB062, 0x8ED4,\n\t0xB063, 0x8ECF, 0xB064, 0x8FB1, 0xB065, 0x9001, 0xB066, 0x9006,\t0xB067, 0x8FF7, 0xB068, 0x9000, 0xB069, 0x8FFA, 0xB06A, 0x8FF4,\n\t0xB06B, 0x9003, 0xB06C, 0x8FFD, 0xB06D, 0x9005, 0xB06E, 0x8FF8,\t0xB06F, 0x9095, 0xB070, 0x90E1, 0xB071, 0x90DD, 0xB072, 0x90E2,\n\t0xB073, 0x9152, 0xB074, 0x914D, 0xB075, 0x914C, 0xB076, 0x91D8,\t0xB077, 0x91DD, 0xB078, 0x91D7, 0xB079, 0x91DC, 0xB07A, 0x91D9,\n\t0xB07B, 0x9583, 0xB07C, 0x9662, 0xB07D, 0x9663, 0xB07E, 0x9661,\t0xB0A1, 0x965B, 0xB0A2, 0x965D, 0xB0A3, 0x9664, 0xB0A4, 0x9658,\n\t0xB0A5, 0x965E, 0xB0A6, 0x96BB, 0xB0A7, 0x98E2, 0xB0A8, 0x99AC,\t0xB0A9, 0x9AA8, 0xB0AA, 0x9AD8, 0xB0AB, 0x9B25, 0xB0AC, 0x9B32,\n\t0xB0AD, 0x9B3C, 0xB0AE, 0x4E7E, 0xB0AF, 0x507A, 0xB0B0, 0x507D,\t0xB0B1, 0x505C, 0xB0B2, 0x5047, 0xB0B3, 0x5043, 0xB0B4, 0x504C,\n\t0xB0B5, 0x505A, 0xB0B6, 0x5049, 0xB0B7, 0x5065, 0xB0B8, 0x5076,\t0xB0B9, 0x504E, 0xB0BA, 0x5055, 0xB0BB, 0x5075, 0xB0BC, 0x5074,\n\t0xB0BD, 0x5077, 0xB0BE, 0x504F, 0xB0BF, 0x500F, 0xB0C0, 0x506F,\t0xB0C1, 0x506D, 0xB0C2, 0x515C, 0xB0C3, 0x5195, 0xB0C4, 0x51F0,\n\t0xB0C5, 0x526A, 0xB0C6, 0x526F, 0xB0C7, 0x52D2, 0xB0C8, 0x52D9,\t0xB0C9, 0x52D8, 0xB0CA, 0x52D5, 0xB0CB, 0x5310, 0xB0CC, 0x530F,\n\t0xB0CD, 0x5319, 0xB0CE, 0x533F, 0xB0CF, 0x5340, 0xB0D0, 0x533E,\t0xB0D1, 0x53C3, 0xB0D2, 0x66FC, 0xB0D3, 0x5546, 0xB0D4, 0x556A,\n\t0xB0D5, 0x5566, 0xB0D6, 0x5544, 0xB0D7, 0x555E, 0xB0D8, 0x5561,\t0xB0D9, 0x5543, 0xB0DA, 0x554A, 0xB0DB, 0x5531, 0xB0DC, 0x5556,\n\t0xB0DD, 0x554F, 0xB0DE, 0x5555, 0xB0DF, 0x552F, 0xB0E0, 0x5564,\t0xB0E1, 0x5538, 0xB0E2, 0x552E, 0xB0E3, 0x555C, 0xB0E4, 0x552C,\n\t0xB0E5, 0x5563, 0xB0E6, 0x5533, 0xB0E7, 0x5541, 0xB0E8, 0x5557,\t0xB0E9, 0x5708, 0xB0EA, 0x570B, 0xB0EB, 0x5709, 0xB0EC, 0x57DF,\n\t0xB0ED, 0x5805, 0xB0EE, 0x580A, 0xB0EF, 0x5806, 0xB0F0, 0x57E0,\t0xB0F1, 0x57E4, 0xB0F2, 0x57FA, 0xB0F3, 0x5802, 0xB0F4, 0x5835,\n\t0xB0F5, 0x57F7, 0xB0F6, 0x57F9, 0xB0F7, 0x5920, 0xB0F8, 0x5962,\t0xB0F9, 0x5A36, 0xB0FA, 0x5A41, 0xB0FB, 0x5A49, 0xB0FC, 0x5A66,\n\t0xB0FD, 0x5A6A, 0xB0FE, 0x5A40, 0xB140, 0x5A3C, 0xB141, 0x5A62,\t0xB142, 0x5A5A, 0xB143, 0x5A46, 0xB144, 0x5A4A, 0xB145, 0x5B70,\n\t0xB146, 0x5BC7, 0xB147, 0x5BC5, 0xB148, 0x5BC4, 0xB149, 0x5BC2,\t0xB14A, 0x5BBF, 0xB14B, 0x5BC6, 0xB14C, 0x5C09, 0xB14D, 0x5C08,\n\t0xB14E, 0x5C07, 0xB14F, 0x5C60, 0xB150, 0x5C5C, 0xB151, 0x5C5D,\t0xB152, 0x5D07, 0xB153, 0x5D06, 0xB154, 0x5D0E, 0xB155, 0x5D1B,\n\t0xB156, 0x5D16, 0xB157, 0x5D22, 0xB158, 0x5D11, 0xB159, 0x5D29,\t0xB15A, 0x5D14, 0xB15B, 0x5D19, 0xB15C, 0x5D24, 0xB15D, 0x5D27,\n\t0xB15E, 0x5D17, 0xB15F, 0x5DE2, 0xB160, 0x5E38, 0xB161, 0x5E36,\t0xB162, 0x5E33, 0xB163, 0x5E37, 0xB164, 0x5EB7, 0xB165, 0x5EB8,\n\t0xB166, 0x5EB6, 0xB167, 0x5EB5, 0xB168, 0x5EBE, 0xB169, 0x5F35,\t0xB16A, 0x5F37, 0xB16B, 0x5F57, 0xB16C, 0x5F6C, 0xB16D, 0x5F69,\n\t0xB16E, 0x5F6B, 0xB16F, 0x5F97, 0xB170, 0x5F99, 0xB171, 0x5F9E,\t0xB172, 0x5F98, 0xB173, 0x5FA1, 0xB174, 0x5FA0, 0xB175, 0x5F9C,\n\t0xB176, 0x607F, 0xB177, 0x60A3, 0xB178, 0x6089, 0xB179, 0x60A0,\t0xB17A, 0x60A8, 0xB17B, 0x60CB, 0xB17C, 0x60B4, 0xB17D, 0x60E6,\n\t0xB17E, 0x60BD, 0xB1A1, 0x60C5, 0xB1A2, 0x60BB, 0xB1A3, 0x60B5,\t0xB1A4, 0x60DC, 0xB1A5, 0x60BC, 0xB1A6, 0x60D8, 0xB1A7, 0x60D5,\n\t0xB1A8, 0x60C6, 0xB1A9, 0x60DF, 0xB1AA, 0x60B8, 0xB1AB, 0x60DA,\t0xB1AC, 0x60C7, 0xB1AD, 0x621A, 0xB1AE, 0x621B, 0xB1AF, 0x6248,\n\t0xB1B0, 0x63A0, 0xB1B1, 0x63A7, 0xB1B2, 0x6372, 0xB1B3, 0x6396,\t0xB1B4, 0x63A2, 0xB1B5, 0x63A5, 0xB1B6, 0x6377, 0xB1B7, 0x6367,\n\t0xB1B8, 0x6398, 0xB1B9, 0x63AA, 0xB1BA, 0x6371, 0xB1BB, 0x63A9,\t0xB1BC, 0x6389, 0xB1BD, 0x6383, 0xB1BE, 0x639B, 0xB1BF, 0x636B,\n\t0xB1C0, 0x63A8, 0xB1C1, 0x6384, 0xB1C2, 0x6388, 0xB1C3, 0x6399,\t0xB1C4, 0x63A1, 0xB1C5, 0x63AC, 0xB1C6, 0x6392, 0xB1C7, 0x638F,\n\t0xB1C8, 0x6380, 0xB1C9, 0x637B, 0xB1CA, 0x6369, 0xB1CB, 0x6368,\t0xB1CC, 0x637A, 0xB1CD, 0x655D, 0xB1CE, 0x6556, 0xB1CF, 0x6551,\n\t0xB1D0, 0x6559, 0xB1D1, 0x6557, 0xB1D2, 0x555F, 0xB1D3, 0x654F,\t0xB1D4, 0x6558, 0xB1D5, 0x6555, 0xB1D6, 0x6554, 0xB1D7, 0x659C,\n\t0xB1D8, 0x659B, 0xB1D9, 0x65AC, 0xB1DA, 0x65CF, 0xB1DB, 0x65CB,\t0xB1DC, 0x65CC, 0xB1DD, 0x65CE, 0xB1DE, 0x665D, 0xB1DF, 0x665A,\n\t0xB1E0, 0x6664, 0xB1E1, 0x6668, 0xB1E2, 0x6666, 0xB1E3, 0x665E,\t0xB1E4, 0x66F9, 0xB1E5, 0x52D7, 0xB1E6, 0x671B, 0xB1E7, 0x6881,\n\t0xB1E8, 0x68AF, 0xB1E9, 0x68A2, 0xB1EA, 0x6893, 0xB1EB, 0x68B5,\t0xB1EC, 0x687F, 0xB1ED, 0x6876, 0xB1EE, 0x68B1, 0xB1EF, 0x68A7,\n\t0xB1F0, 0x6897, 0xB1F1, 0x68B0, 0xB1F2, 0x6883, 0xB1F3, 0x68C4,\t0xB1F4, 0x68AD, 0xB1F5, 0x6886, 0xB1F6, 0x6885, 0xB1F7, 0x6894,\n\t0xB1F8, 0x689D, 0xB1F9, 0x68A8, 0xB1FA, 0x689F, 0xB1FB, 0x68A1,\t0xB1FC, 0x6882, 0xB1FD, 0x6B32, 0xB1FE, 0x6BBA, 0xB240, 0x6BEB,\n\t0xB241, 0x6BEC, 0xB242, 0x6C2B, 0xB243, 0x6D8E, 0xB244, 0x6DBC,\t0xB245, 0x6DF3, 0xB246, 0x6DD9, 0xB247, 0x6DB2, 0xB248, 0x6DE1,\n\t0xB249, 0x6DCC, 0xB24A, 0x6DE4, 0xB24B, 0x6DFB, 0xB24C, 0x6DFA,\t0xB24D, 0x6E05, 0xB24E, 0x6DC7, 0xB24F, 0x6DCB, 0xB250, 0x6DAF,\n\t0xB251, 0x6DD1, 0xB252, 0x6DAE, 0xB253, 0x6DDE, 0xB254, 0x6DF9,\t0xB255, 0x6DB8, 0xB256, 0x6DF7, 0xB257, 0x6DF5, 0xB258, 0x6DC5,\n\t0xB259, 0x6DD2, 0xB25A, 0x6E1A, 0xB25B, 0x6DB5, 0xB25C, 0x6DDA,\t0xB25D, 0x6DEB, 0xB25E, 0x6DD8, 0xB25F, 0x6DEA, 0xB260, 0x6DF1,\n\t0xB261, 0x6DEE, 0xB262, 0x6DE8, 0xB263, 0x6DC6, 0xB264, 0x6DC4,\t0xB265, 0x6DAA, 0xB266, 0x6DEC, 0xB267, 0x6DBF, 0xB268, 0x6DE6,\n\t0xB269, 0x70F9, 0xB26A, 0x7109, 0xB26B, 0x710A, 0xB26C, 0x70FD,\t0xB26D, 0x70EF, 0xB26E, 0x723D, 0xB26F, 0x727D, 0xB270, 0x7281,\n\t0xB271, 0x731C, 0xB272, 0x731B, 0xB273, 0x7316, 0xB274, 0x7313,\t0xB275, 0x7319, 0xB276, 0x7387, 0xB277, 0x7405, 0xB278, 0x740A,\n\t0xB279, 0x7403, 0xB27A, 0x7406, 0xB27B, 0x73FE, 0xB27C, 0x740D,\t0xB27D, 0x74E0, 0xB27E, 0x74F6, 0xB2A1, 0x74F7, 0xB2A2, 0x751C,\n\t0xB2A3, 0x7522, 0xB2A4, 0x7565, 0xB2A5, 0x7566, 0xB2A6, 0x7562,\t0xB2A7, 0x7570, 0xB2A8, 0x758F, 0xB2A9, 0x75D4, 0xB2AA, 0x75D5,\n\t0xB2AB, 0x75B5, 0xB2AC, 0x75CA, 0xB2AD, 0x75CD, 0xB2AE, 0x768E,\t0xB2AF, 0x76D4, 0xB2B0, 0x76D2, 0xB2B1, 0x76DB, 0xB2B2, 0x7737,\n\t0xB2B3, 0x773E, 0xB2B4, 0x773C, 0xB2B5, 0x7736, 0xB2B6, 0x7738,\t0xB2B7, 0x773A, 0xB2B8, 0x786B, 0xB2B9, 0x7843, 0xB2BA, 0x784E,\n\t0xB2BB, 0x7965, 0xB2BC, 0x7968, 0xB2BD, 0x796D, 0xB2BE, 0x79FB,\t0xB2BF, 0x7A92, 0xB2C0, 0x7A95, 0xB2C1, 0x7B20, 0xB2C2, 0x7B28,\n\t0xB2C3, 0x7B1B, 0xB2C4, 0x7B2C, 0xB2C5, 0x7B26, 0xB2C6, 0x7B19,\t0xB2C7, 0x7B1E, 0xB2C8, 0x7B2E, 0xB2C9, 0x7C92, 0xB2CA, 0x7C97,\n\t0xB2CB, 0x7C95, 0xB2CC, 0x7D46, 0xB2CD, 0x7D43, 0xB2CE, 0x7D71,\t0xB2CF, 0x7D2E, 0xB2D0, 0x7D39, 0xB2D1, 0x7D3C, 0xB2D2, 0x7D40,\n\t0xB2D3, 0x7D30, 0xB2D4, 0x7D33, 0xB2D5, 0x7D44, 0xB2D6, 0x7D2F,\t0xB2D7, 0x7D42, 0xB2D8, 0x7D32, 0xB2D9, 0x7D31, 0xB2DA, 0x7F3D,\n\t0xB2DB, 0x7F9E, 0xB2DC, 0x7F9A, 0xB2DD, 0x7FCC, 0xB2DE, 0x7FCE,\t0xB2DF, 0x7FD2, 0xB2E0, 0x801C, 0xB2E1, 0x804A, 0xB2E2, 0x8046,\n\t0xB2E3, 0x812F, 0xB2E4, 0x8116, 0xB2E5, 0x8123, 0xB2E6, 0x812B,\t0xB2E7, 0x8129, 0xB2E8, 0x8130, 0xB2E9, 0x8124, 0xB2EA, 0x8202,\n\t0xB2EB, 0x8235, 0xB2EC, 0x8237, 0xB2ED, 0x8236, 0xB2EE, 0x8239,\t0xB2EF, 0x838E, 0xB2F0, 0x839E, 0xB2F1, 0x8398, 0xB2F2, 0x8378,\n\t0xB2F3, 0x83A2, 0xB2F4, 0x8396, 0xB2F5, 0x83BD, 0xB2F6, 0x83AB,\t0xB2F7, 0x8392, 0xB2F8, 0x838A, 0xB2F9, 0x8393, 0xB2FA, 0x8389,\n\t0xB2FB, 0x83A0, 0xB2FC, 0x8377, 0xB2FD, 0x837B, 0xB2FE, 0x837C,\t0xB340, 0x8386, 0xB341, 0x83A7, 0xB342, 0x8655, 0xB343, 0x5F6A,\n\t0xB344, 0x86C7, 0xB345, 0x86C0, 0xB346, 0x86B6, 0xB347, 0x86C4,\t0xB348, 0x86B5, 0xB349, 0x86C6, 0xB34A, 0x86CB, 0xB34B, 0x86B1,\n\t0xB34C, 0x86AF, 0xB34D, 0x86C9, 0xB34E, 0x8853, 0xB34F, 0x889E,\t0xB350, 0x8888, 0xB351, 0x88AB, 0xB352, 0x8892, 0xB353, 0x8896,\n\t0xB354, 0x888D, 0xB355, 0x888B, 0xB356, 0x8993, 0xB357, 0x898F,\t0xB358, 0x8A2A, 0xB359, 0x8A1D, 0xB35A, 0x8A23, 0xB35B, 0x8A25,\n\t0xB35C, 0x8A31, 0xB35D, 0x8A2D, 0xB35E, 0x8A1F, 0xB35F, 0x8A1B,\t0xB360, 0x8A22, 0xB361, 0x8C49, 0xB362, 0x8C5A, 0xB363, 0x8CA9,\n\t0xB364, 0x8CAC, 0xB365, 0x8CAB, 0xB366, 0x8CA8, 0xB367, 0x8CAA,\t0xB368, 0x8CA7, 0xB369, 0x8D67, 0xB36A, 0x8D66, 0xB36B, 0x8DBE,\n\t0xB36C, 0x8DBA, 0xB36D, 0x8EDB, 0xB36E, 0x8EDF, 0xB36F, 0x9019,\t0xB370, 0x900D, 0xB371, 0x901A, 0xB372, 0x9017, 0xB373, 0x9023,\n\t0xB374, 0x901F, 0xB375, 0x901D, 0xB376, 0x9010, 0xB377, 0x9015,\t0xB378, 0x901E, 0xB379, 0x9020, 0xB37A, 0x900F, 0xB37B, 0x9022,\n\t0xB37C, 0x9016, 0xB37D, 0x901B, 0xB37E, 0x9014, 0xB3A1, 0x90E8,\t0xB3A2, 0x90ED, 0xB3A3, 0x90FD, 0xB3A4, 0x9157, 0xB3A5, 0x91CE,\n\t0xB3A6, 0x91F5, 0xB3A7, 0x91E6, 0xB3A8, 0x91E3, 0xB3A9, 0x91E7,\t0xB3AA, 0x91ED, 0xB3AB, 0x91E9, 0xB3AC, 0x9589, 0xB3AD, 0x966A,\n\t0xB3AE, 0x9675, 0xB3AF, 0x9673, 0xB3B0, 0x9678, 0xB3B1, 0x9670,\t0xB3B2, 0x9674, 0xB3B3, 0x9676, 0xB3B4, 0x9677, 0xB3B5, 0x966C,\n\t0xB3B6, 0x96C0, 0xB3B7, 0x96EA, 0xB3B8, 0x96E9, 0xB3B9, 0x7AE0,\t0xB3BA, 0x7ADF, 0xB3BB, 0x9802, 0xB3BC, 0x9803, 0xB3BD, 0x9B5A,\n\t0xB3BE, 0x9CE5, 0xB3BF, 0x9E75, 0xB3C0, 0x9E7F, 0xB3C1, 0x9EA5,\t0xB3C2, 0x9EBB, 0xB3C3, 0x50A2, 0xB3C4, 0x508D, 0xB3C5, 0x5085,\n\t0xB3C6, 0x5099, 0xB3C7, 0x5091, 0xB3C8, 0x5080, 0xB3C9, 0x5096,\t0xB3CA, 0x5098, 0xB3CB, 0x509A, 0xB3CC, 0x6700, 0xB3CD, 0x51F1,\n\t0xB3CE, 0x5272, 0xB3CF, 0x5274, 0xB3D0, 0x5275, 0xB3D1, 0x5269,\t0xB3D2, 0x52DE, 0xB3D3, 0x52DD, 0xB3D4, 0x52DB, 0xB3D5, 0x535A,\n\t0xB3D6, 0x53A5, 0xB3D7, 0x557B, 0xB3D8, 0x5580, 0xB3D9, 0x55A7,\t0xB3DA, 0x557C, 0xB3DB, 0x558A, 0xB3DC, 0x559D, 0xB3DD, 0x5598,\n\t0xB3DE, 0x5582, 0xB3DF, 0x559C, 0xB3E0, 0x55AA, 0xB3E1, 0x5594,\t0xB3E2, 0x5587, 0xB3E3, 0x558B, 0xB3E4, 0x5583, 0xB3E5, 0x55B3,\n\t0xB3E6, 0x55AE, 0xB3E7, 0x559F, 0xB3E8, 0x553E, 0xB3E9, 0x55B2,\t0xB3EA, 0x559A, 0xB3EB, 0x55BB, 0xB3EC, 0x55AC, 0xB3ED, 0x55B1,\n\t0xB3EE, 0x557E, 0xB3EF, 0x5589, 0xB3F0, 0x55AB, 0xB3F1, 0x5599,\t0xB3F2, 0x570D, 0xB3F3, 0x582F, 0xB3F4, 0x582A, 0xB3F5, 0x5834,\n\t0xB3F6, 0x5824, 0xB3F7, 0x5830, 0xB3F8, 0x5831, 0xB3F9, 0x5821,\t0xB3FA, 0x581D, 0xB3FB, 0x5820, 0xB3FC, 0x58F9, 0xB3FD, 0x58FA,\n\t0xB3FE, 0x5960, 0xB440, 0x5A77, 0xB441, 0x5A9A, 0xB442, 0x5A7F,\t0xB443, 0x5A92, 0xB444, 0x5A9B, 0xB445, 0x5AA7, 0xB446, 0x5B73,\n\t0xB447, 0x5B71, 0xB448, 0x5BD2, 0xB449, 0x5BCC, 0xB44A, 0x5BD3,\t0xB44B, 0x5BD0, 0xB44C, 0x5C0A, 0xB44D, 0x5C0B, 0xB44E, 0x5C31,\n\t0xB44F, 0x5D4C, 0xB450, 0x5D50, 0xB451, 0x5D34, 0xB452, 0x5D47,\t0xB453, 0x5DFD, 0xB454, 0x5E45, 0xB455, 0x5E3D, 0xB456, 0x5E40,\n\t0xB457, 0x5E43, 0xB458, 0x5E7E, 0xB459, 0x5ECA, 0xB45A, 0x5EC1,\t0xB45B, 0x5EC2, 0xB45C, 0x5EC4, 0xB45D, 0x5F3C, 0xB45E, 0x5F6D,\n\t0xB45F, 0x5FA9, 0xB460, 0x5FAA, 0xB461, 0x5FA8, 0xB462, 0x60D1,\t0xB463, 0x60E1, 0xB464, 0x60B2, 0xB465, 0x60B6, 0xB466, 0x60E0,\n\t0xB467, 0x611C, 0xB468, 0x6123, 0xB469, 0x60FA, 0xB46A, 0x6115,\t0xB46B, 0x60F0, 0xB46C, 0x60FB, 0xB46D, 0x60F4, 0xB46E, 0x6168,\n\t0xB46F, 0x60F1, 0xB470, 0x610E, 0xB471, 0x60F6, 0xB472, 0x6109,\t0xB473, 0x6100, 0xB474, 0x6112, 0xB475, 0x621F, 0xB476, 0x6249,\n\t0xB477, 0x63A3, 0xB478, 0x638C, 0xB479, 0x63CF, 0xB47A, 0x63C0,\t0xB47B, 0x63E9, 0xB47C, 0x63C9, 0xB47D, 0x63C6, 0xB47E, 0x63CD,\n\t0xB4A1, 0x63D2, 0xB4A2, 0x63E3, 0xB4A3, 0x63D0, 0xB4A4, 0x63E1,\t0xB4A5, 0x63D6, 0xB4A6, 0x63ED, 0xB4A7, 0x63EE, 0xB4A8, 0x6376,\n\t0xB4A9, 0x63F4, 0xB4AA, 0x63EA, 0xB4AB, 0x63DB, 0xB4AC, 0x6452,\t0xB4AD, 0x63DA, 0xB4AE, 0x63F9, 0xB4AF, 0x655E, 0xB4B0, 0x6566,\n\t0xB4B1, 0x6562, 0xB4B2, 0x6563, 0xB4B3, 0x6591, 0xB4B4, 0x6590,\t0xB4B5, 0x65AF, 0xB4B6, 0x666E, 0xB4B7, 0x6670, 0xB4B8, 0x6674,\n\t0xB4B9, 0x6676, 0xB4BA, 0x666F, 0xB4BB, 0x6691, 0xB4BC, 0x667A,\t0xB4BD, 0x667E, 0xB4BE, 0x6677, 0xB4BF, 0x66FE, 0xB4C0, 0x66FF,\n\t0xB4C1, 0x671F, 0xB4C2, 0x671D, 0xB4C3, 0x68FA, 0xB4C4, 0x68D5,\t0xB4C5, 0x68E0, 0xB4C6, 0x68D8, 0xB4C7, 0x68D7, 0xB4C8, 0x6905,\n\t0xB4C9, 0x68DF, 0xB4CA, 0x68F5, 0xB4CB, 0x68EE, 0xB4CC, 0x68E7,\t0xB4CD, 0x68F9, 0xB4CE, 0x68D2, 0xB4CF, 0x68F2, 0xB4D0, 0x68E3,\n\t0xB4D1, 0x68CB, 0xB4D2, 0x68CD, 0xB4D3, 0x690D, 0xB4D4, 0x6912,\t0xB4D5, 0x690E, 0xB4D6, 0x68C9, 0xB4D7, 0x68DA, 0xB4D8, 0x696E,\n\t0xB4D9, 0x68FB, 0xB4DA, 0x6B3E, 0xB4DB, 0x6B3A, 0xB4DC, 0x6B3D,\t0xB4DD, 0x6B98, 0xB4DE, 0x6B96, 0xB4DF, 0x6BBC, 0xB4E0, 0x6BEF,\n\t0xB4E1, 0x6C2E, 0xB4E2, 0x6C2F, 0xB4E3, 0x6C2C, 0xB4E4, 0x6E2F,\t0xB4E5, 0x6E38, 0xB4E6, 0x6E54, 0xB4E7, 0x6E21, 0xB4E8, 0x6E32,\n\t0xB4E9, 0x6E67, 0xB4EA, 0x6E4A, 0xB4EB, 0x6E20, 0xB4EC, 0x6E25,\t0xB4ED, 0x6E23, 0xB4EE, 0x6E1B, 0xB4EF, 0x6E5B, 0xB4F0, 0x6E58,\n\t0xB4F1, 0x6E24, 0xB4F2, 0x6E56, 0xB4F3, 0x6E6E, 0xB4F4, 0x6E2D,\t0xB4F5, 0x6E26, 0xB4F6, 0x6E6F, 0xB4F7, 0x6E34, 0xB4F8, 0x6E4D,\n\t0xB4F9, 0x6E3A, 0xB4FA, 0x6E2C, 0xB4FB, 0x6E43, 0xB4FC, 0x6E1D,\t0xB4FD, 0x6E3E, 0xB4FE, 0x6ECB, 0xB540, 0x6E89, 0xB541, 0x6E19,\n\t0xB542, 0x6E4E, 0xB543, 0x6E63, 0xB544, 0x6E44, 0xB545, 0x6E72,\t0xB546, 0x6E69, 0xB547, 0x6E5F, 0xB548, 0x7119, 0xB549, 0x711A,\n\t0xB54A, 0x7126, 0xB54B, 0x7130, 0xB54C, 0x7121, 0xB54D, 0x7136,\t0xB54E, 0x716E, 0xB54F, 0x711C, 0xB550, 0x724C, 0xB551, 0x7284,\n\t0xB552, 0x7280, 0xB553, 0x7336, 0xB554, 0x7325, 0xB555, 0x7334,\t0xB556, 0x7329, 0xB557, 0x743A, 0xB558, 0x742A, 0xB559, 0x7433,\n\t0xB55A, 0x7422, 0xB55B, 0x7425, 0xB55C, 0x7435, 0xB55D, 0x7436,\t0xB55E, 0x7434, 0xB55F, 0x742F, 0xB560, 0x741B, 0xB561, 0x7426,\n\t0xB562, 0x7428, 0xB563, 0x7525, 0xB564, 0x7526, 0xB565, 0x756B,\t0xB566, 0x756A, 0xB567, 0x75E2, 0xB568, 0x75DB, 0xB569, 0x75E3,\n\t0xB56A, 0x75D9, 0xB56B, 0x75D8, 0xB56C, 0x75DE, 0xB56D, 0x75E0,\t0xB56E, 0x767B, 0xB56F, 0x767C, 0xB570, 0x7696, 0xB571, 0x7693,\n\t0xB572, 0x76B4, 0xB573, 0x76DC, 0xB574, 0x774F, 0xB575, 0x77ED,\t0xB576, 0x785D, 0xB577, 0x786C, 0xB578, 0x786F, 0xB579, 0x7A0D,\n\t0xB57A, 0x7A08, 0xB57B, 0x7A0B, 0xB57C, 0x7A05, 0xB57D, 0x7A00,\t0xB57E, 0x7A98, 0xB5A1, 0x7A97, 0xB5A2, 0x7A96, 0xB5A3, 0x7AE5,\n\t0xB5A4, 0x7AE3, 0xB5A5, 0x7B49, 0xB5A6, 0x7B56, 0xB5A7, 0x7B46,\t0xB5A8, 0x7B50, 0xB5A9, 0x7B52, 0xB5AA, 0x7B54, 0xB5AB, 0x7B4D,\n\t0xB5AC, 0x7B4B, 0xB5AD, 0x7B4F, 0xB5AE, 0x7B51, 0xB5AF, 0x7C9F,\t0xB5B0, 0x7CA5, 0xB5B1, 0x7D5E, 0xB5B2, 0x7D50, 0xB5B3, 0x7D68,\n\t0xB5B4, 0x7D55, 0xB5B5, 0x7D2B, 0xB5B6, 0x7D6E, 0xB5B7, 0x7D72,\t0xB5B8, 0x7D61, 0xB5B9, 0x7D66, 0xB5BA, 0x7D62, 0xB5BB, 0x7D70,\n\t0xB5BC, 0x7D73, 0xB5BD, 0x5584, 0xB5BE, 0x7FD4, 0xB5BF, 0x7FD5,\t0xB5C0, 0x800B, 0xB5C1, 0x8052, 0xB5C2, 0x8085, 0xB5C3, 0x8155,\n\t0xB5C4, 0x8154, 0xB5C5, 0x814B, 0xB5C6, 0x8151, 0xB5C7, 0x814E,\t0xB5C8, 0x8139, 0xB5C9, 0x8146, 0xB5CA, 0x813E, 0xB5CB, 0x814C,\n\t0xB5CC, 0x8153, 0xB5CD, 0x8174, 0xB5CE, 0x8212, 0xB5CF, 0x821C,\t0xB5D0, 0x83E9, 0xB5D1, 0x8403, 0xB5D2, 0x83F8, 0xB5D3, 0x840D,\n\t0xB5D4, 0x83E0, 0xB5D5, 0x83C5, 0xB5D6, 0x840B, 0xB5D7, 0x83C1,\t0xB5D8, 0x83EF, 0xB5D9, 0x83F1, 0xB5DA, 0x83F4, 0xB5DB, 0x8457,\n\t0xB5DC, 0x840A, 0xB5DD, 0x83F0, 0xB5DE, 0x840C, 0xB5DF, 0x83CC,\t0xB5E0, 0x83FD, 0xB5E1, 0x83F2, 0xB5E2, 0x83CA, 0xB5E3, 0x8438,\n\t0xB5E4, 0x840E, 0xB5E5, 0x8404, 0xB5E6, 0x83DC, 0xB5E7, 0x8407,\t0xB5E8, 0x83D4, 0xB5E9, 0x83DF, 0xB5EA, 0x865B, 0xB5EB, 0x86DF,\n\t0xB5EC, 0x86D9, 0xB5ED, 0x86ED, 0xB5EE, 0x86D4, 0xB5EF, 0x86DB,\t0xB5F0, 0x86E4, 0xB5F1, 0x86D0, 0xB5F2, 0x86DE, 0xB5F3, 0x8857,\n\t0xB5F4, 0x88C1, 0xB5F5, 0x88C2, 0xB5F6, 0x88B1, 0xB5F7, 0x8983,\t0xB5F8, 0x8996, 0xB5F9, 0x8A3B, 0xB5FA, 0x8A60, 0xB5FB, 0x8A55,\n\t0xB5FC, 0x8A5E, 0xB5FD, 0x8A3C, 0xB5FE, 0x8A41, 0xB640, 0x8A54,\t0xB641, 0x8A5B, 0xB642, 0x8A50, 0xB643, 0x8A46, 0xB644, 0x8A34,\n\t0xB645, 0x8A3A, 0xB646, 0x8A36, 0xB647, 0x8A56, 0xB648, 0x8C61,\t0xB649, 0x8C82, 0xB64A, 0x8CAF, 0xB64B, 0x8CBC, 0xB64C, 0x8CB3,\n\t0xB64D, 0x8CBD, 0xB64E, 0x8CC1, 0xB64F, 0x8CBB, 0xB650, 0x8CC0,\t0xB651, 0x8CB4, 0xB652, 0x8CB7, 0xB653, 0x8CB6, 0xB654, 0x8CBF,\n\t0xB655, 0x8CB8, 0xB656, 0x8D8A, 0xB657, 0x8D85, 0xB658, 0x8D81,\t0xB659, 0x8DCE, 0xB65A, 0x8DDD, 0xB65B, 0x8DCB, 0xB65C, 0x8DDA,\n\t0xB65D, 0x8DD1, 0xB65E, 0x8DCC, 0xB65F, 0x8DDB, 0xB660, 0x8DC6,\t0xB661, 0x8EFB, 0xB662, 0x8EF8, 0xB663, 0x8EFC, 0xB664, 0x8F9C,\n\t0xB665, 0x902E, 0xB666, 0x9035, 0xB667, 0x9031, 0xB668, 0x9038,\t0xB669, 0x9032, 0xB66A, 0x9036, 0xB66B, 0x9102, 0xB66C, 0x90F5,\n\t0xB66D, 0x9109, 0xB66E, 0x90FE, 0xB66F, 0x9163, 0xB670, 0x9165,\t0xB671, 0x91CF, 0xB672, 0x9214, 0xB673, 0x9215, 0xB674, 0x9223,\n\t0xB675, 0x9209, 0xB676, 0x921E, 0xB677, 0x920D, 0xB678, 0x9210,\t0xB679, 0x9207, 0xB67A, 0x9211, 0xB67B, 0x9594, 0xB67C, 0x958F,\n\t0xB67D, 0x958B, 0xB67E, 0x9591, 0xB6A1, 0x9593, 0xB6A2, 0x9592,\t0xB6A3, 0x958E, 0xB6A4, 0x968A, 0xB6A5, 0x968E, 0xB6A6, 0x968B,\n\t0xB6A7, 0x967D, 0xB6A8, 0x9685, 0xB6A9, 0x9686, 0xB6AA, 0x968D,\t0xB6AB, 0x9672, 0xB6AC, 0x9684, 0xB6AD, 0x96C1, 0xB6AE, 0x96C5,\n\t0xB6AF, 0x96C4, 0xB6B0, 0x96C6, 0xB6B1, 0x96C7, 0xB6B2, 0x96EF,\t0xB6B3, 0x96F2, 0xB6B4, 0x97CC, 0xB6B5, 0x9805, 0xB6B6, 0x9806,\n\t0xB6B7, 0x9808, 0xB6B8, 0x98E7, 0xB6B9, 0x98EA, 0xB6BA, 0x98EF,\t0xB6BB, 0x98E9, 0xB6BC, 0x98F2, 0xB6BD, 0x98ED, 0xB6BE, 0x99AE,\n\t0xB6BF, 0x99AD, 0xB6C0, 0x9EC3, 0xB6C1, 0x9ECD, 0xB6C2, 0x9ED1,\t0xB6C3, 0x4E82, 0xB6C4, 0x50AD, 0xB6C5, 0x50B5, 0xB6C6, 0x50B2,\n\t0xB6C7, 0x50B3, 0xB6C8, 0x50C5, 0xB6C9, 0x50BE, 0xB6CA, 0x50AC,\t0xB6CB, 0x50B7, 0xB6CC, 0x50BB, 0xB6CD, 0x50AF, 0xB6CE, 0x50C7,\n\t0xB6CF, 0x527F, 0xB6D0, 0x5277, 0xB6D1, 0x527D, 0xB6D2, 0x52DF,\t0xB6D3, 0x52E6, 0xB6D4, 0x52E4, 0xB6D5, 0x52E2, 0xB6D6, 0x52E3,\n\t0xB6D7, 0x532F, 0xB6D8, 0x55DF, 0xB6D9, 0x55E8, 0xB6DA, 0x55D3,\t0xB6DB, 0x55E6, 0xB6DC, 0x55CE, 0xB6DD, 0x55DC, 0xB6DE, 0x55C7,\n\t0xB6DF, 0x55D1, 0xB6E0, 0x55E3, 0xB6E1, 0x55E4, 0xB6E2, 0x55EF,\t0xB6E3, 0x55DA, 0xB6E4, 0x55E1, 0xB6E5, 0x55C5, 0xB6E6, 0x55C6,\n\t0xB6E7, 0x55E5, 0xB6E8, 0x55C9, 0xB6E9, 0x5712, 0xB6EA, 0x5713,\t0xB6EB, 0x585E, 0xB6EC, 0x5851, 0xB6ED, 0x5858, 0xB6EE, 0x5857,\n\t0xB6EF, 0x585A, 0xB6F0, 0x5854, 0xB6F1, 0x586B, 0xB6F2, 0x584C,\t0xB6F3, 0x586D, 0xB6F4, 0x584A, 0xB6F5, 0x5862, 0xB6F6, 0x5852,\n\t0xB6F7, 0x584B, 0xB6F8, 0x5967, 0xB6F9, 0x5AC1, 0xB6FA, 0x5AC9,\t0xB6FB, 0x5ACC, 0xB6FC, 0x5ABE, 0xB6FD, 0x5ABD, 0xB6FE, 0x5ABC,\n\t0xB740, 0x5AB3, 0xB741, 0x5AC2, 0xB742, 0x5AB2, 0xB743, 0x5D69,\t0xB744, 0x5D6F, 0xB745, 0x5E4C, 0xB746, 0x5E79, 0xB747, 0x5EC9,\n\t0xB748, 0x5EC8, 0xB749, 0x5F12, 0xB74A, 0x5F59, 0xB74B, 0x5FAC,\t0xB74C, 0x5FAE, 0xB74D, 0x611A, 0xB74E, 0x610F, 0xB74F, 0x6148,\n\t0xB750, 0x611F, 0xB751, 0x60F3, 0xB752, 0x611B, 0xB753, 0x60F9,\t0xB754, 0x6101, 0xB755, 0x6108, 0xB756, 0x614E, 0xB757, 0x614C,\n\t0xB758, 0x6144, 0xB759, 0x614D, 0xB75A, 0x613E, 0xB75B, 0x6134,\t0xB75C, 0x6127, 0xB75D, 0x610D, 0xB75E, 0x6106, 0xB75F, 0x6137,\n\t0xB760, 0x6221, 0xB761, 0x6222, 0xB762, 0x6413, 0xB763, 0x643E,\t0xB764, 0x641E, 0xB765, 0x642A, 0xB766, 0x642D, 0xB767, 0x643D,\n\t0xB768, 0x642C, 0xB769, 0x640F, 0xB76A, 0x641C, 0xB76B, 0x6414,\t0xB76C, 0x640D, 0xB76D, 0x6436, 0xB76E, 0x6416, 0xB76F, 0x6417,\n\t0xB770, 0x6406, 0xB771, 0x656C, 0xB772, 0x659F, 0xB773, 0x65B0,\t0xB774, 0x6697, 0xB775, 0x6689, 0xB776, 0x6687, 0xB777, 0x6688,\n\t0xB778, 0x6696, 0xB779, 0x6684, 0xB77A, 0x6698, 0xB77B, 0x668D,\t0xB77C, 0x6703, 0xB77D, 0x6994, 0xB77E, 0x696D, 0xB7A1, 0x695A,\n\t0xB7A2, 0x6977, 0xB7A3, 0x6960, 0xB7A4, 0x6954, 0xB7A5, 0x6975,\t0xB7A6, 0x6930, 0xB7A7, 0x6982, 0xB7A8, 0x694A, 0xB7A9, 0x6968,\n\t0xB7AA, 0x696B, 0xB7AB, 0x695E, 0xB7AC, 0x6953, 0xB7AD, 0x6979,\t0xB7AE, 0x6986, 0xB7AF, 0x695D, 0xB7B0, 0x6963, 0xB7B1, 0x695B,\n\t0xB7B2, 0x6B47, 0xB7B3, 0x6B72, 0xB7B4, 0x6BC0, 0xB7B5, 0x6BBF,\t0xB7B6, 0x6BD3, 0xB7B7, 0x6BFD, 0xB7B8, 0x6EA2, 0xB7B9, 0x6EAF,\n\t0xB7BA, 0x6ED3, 0xB7BB, 0x6EB6, 0xB7BC, 0x6EC2, 0xB7BD, 0x6E90,\t0xB7BE, 0x6E9D, 0xB7BF, 0x6EC7, 0xB7C0, 0x6EC5, 0xB7C1, 0x6EA5,\n\t0xB7C2, 0x6E98, 0xB7C3, 0x6EBC, 0xB7C4, 0x6EBA, 0xB7C5, 0x6EAB,\t0xB7C6, 0x6ED1, 0xB7C7, 0x6E96, 0xB7C8, 0x6E9C, 0xB7C9, 0x6EC4,\n\t0xB7CA, 0x6ED4, 0xB7CB, 0x6EAA, 0xB7CC, 0x6EA7, 0xB7CD, 0x6EB4,\t0xB7CE, 0x714E, 0xB7CF, 0x7159, 0xB7D0, 0x7169, 0xB7D1, 0x7164,\n\t0xB7D2, 0x7149, 0xB7D3, 0x7167, 0xB7D4, 0x715C, 0xB7D5, 0x716C,\t0xB7D6, 0x7166, 0xB7D7, 0x714C, 0xB7D8, 0x7165, 0xB7D9, 0x715E,\n\t0xB7DA, 0x7146, 0xB7DB, 0x7168, 0xB7DC, 0x7156, 0xB7DD, 0x723A,\t0xB7DE, 0x7252, 0xB7DF, 0x7337, 0xB7E0, 0x7345, 0xB7E1, 0x733F,\n\t0xB7E2, 0x733E, 0xB7E3, 0x746F, 0xB7E4, 0x745A, 0xB7E5, 0x7455,\t0xB7E6, 0x745F, 0xB7E7, 0x745E, 0xB7E8, 0x7441, 0xB7E9, 0x743F,\n\t0xB7EA, 0x7459, 0xB7EB, 0x745B, 0xB7EC, 0x745C, 0xB7ED, 0x7576,\t0xB7EE, 0x7578, 0xB7EF, 0x7600, 0xB7F0, 0x75F0, 0xB7F1, 0x7601,\n\t0xB7F2, 0x75F2, 0xB7F3, 0x75F1, 0xB7F4, 0x75FA, 0xB7F5, 0x75FF,\t0xB7F6, 0x75F4, 0xB7F7, 0x75F3, 0xB7F8, 0x76DE, 0xB7F9, 0x76DF,\n\t0xB7FA, 0x775B, 0xB7FB, 0x776B, 0xB7FC, 0x7766, 0xB7FD, 0x775E,\t0xB7FE, 0x7763, 0xB840, 0x7779, 0xB841, 0x776A, 0xB842, 0x776C,\n\t0xB843, 0x775C, 0xB844, 0x7765, 0xB845, 0x7768, 0xB846, 0x7762,\t0xB847, 0x77EE, 0xB848, 0x788E, 0xB849, 0x78B0, 0xB84A, 0x7897,\n\t0xB84B, 0x7898, 0xB84C, 0x788C, 0xB84D, 0x7889, 0xB84E, 0x787C,\t0xB84F, 0x7891, 0xB850, 0x7893, 0xB851, 0x787F, 0xB852, 0x797A,\n\t0xB853, 0x797F, 0xB854, 0x7981, 0xB855, 0x842C, 0xB856, 0x79BD,\t0xB857, 0x7A1C, 0xB858, 0x7A1A, 0xB859, 0x7A20, 0xB85A, 0x7A14,\n\t0xB85B, 0x7A1F, 0xB85C, 0x7A1E, 0xB85D, 0x7A9F, 0xB85E, 0x7AA0,\t0xB85F, 0x7B77, 0xB860, 0x7BC0, 0xB861, 0x7B60, 0xB862, 0x7B6E,\n\t0xB863, 0x7B67, 0xB864, 0x7CB1, 0xB865, 0x7CB3, 0xB866, 0x7CB5,\t0xB867, 0x7D93, 0xB868, 0x7D79, 0xB869, 0x7D91, 0xB86A, 0x7D81,\n\t0xB86B, 0x7D8F, 0xB86C, 0x7D5B, 0xB86D, 0x7F6E, 0xB86E, 0x7F69,\t0xB86F, 0x7F6A, 0xB870, 0x7F72, 0xB871, 0x7FA9, 0xB872, 0x7FA8,\n\t0xB873, 0x7FA4, 0xB874, 0x8056, 0xB875, 0x8058, 0xB876, 0x8086,\t0xB877, 0x8084, 0xB878, 0x8171, 0xB879, 0x8170, 0xB87A, 0x8178,\n\t0xB87B, 0x8165, 0xB87C, 0x816E, 0xB87D, 0x8173, 0xB87E, 0x816B,\t0xB8A1, 0x8179, 0xB8A2, 0x817A, 0xB8A3, 0x8166, 0xB8A4, 0x8205,\n\t0xB8A5, 0x8247, 0xB8A6, 0x8482, 0xB8A7, 0x8477, 0xB8A8, 0x843D,\t0xB8A9, 0x8431, 0xB8AA, 0x8475, 0xB8AB, 0x8466, 0xB8AC, 0x846B,\n\t0xB8AD, 0x8449, 0xB8AE, 0x846C, 0xB8AF, 0x845B, 0xB8B0, 0x843C,\t0xB8B1, 0x8435, 0xB8B2, 0x8461, 0xB8B3, 0x8463, 0xB8B4, 0x8469,\n\t0xB8B5, 0x846D, 0xB8B6, 0x8446, 0xB8B7, 0x865E, 0xB8B8, 0x865C,\t0xB8B9, 0x865F, 0xB8BA, 0x86F9, 0xB8BB, 0x8713, 0xB8BC, 0x8708,\n\t0xB8BD, 0x8707, 0xB8BE, 0x8700, 0xB8BF, 0x86FE, 0xB8C0, 0x86FB,\t0xB8C1, 0x8702, 0xB8C2, 0x8703, 0xB8C3, 0x8706, 0xB8C4, 0x870A,\n\t0xB8C5, 0x8859, 0xB8C6, 0x88DF, 0xB8C7, 0x88D4, 0xB8C8, 0x88D9,\t0xB8C9, 0x88DC, 0xB8CA, 0x88D8, 0xB8CB, 0x88DD, 0xB8CC, 0x88E1,\n\t0xB8CD, 0x88CA, 0xB8CE, 0x88D5, 0xB8CF, 0x88D2, 0xB8D0, 0x899C,\t0xB8D1, 0x89E3, 0xB8D2, 0x8A6B, 0xB8D3, 0x8A72, 0xB8D4, 0x8A73,\n\t0xB8D5, 0x8A66, 0xB8D6, 0x8A69, 0xB8D7, 0x8A70, 0xB8D8, 0x8A87,\t0xB8D9, 0x8A7C, 0xB8DA, 0x8A63, 0xB8DB, 0x8AA0, 0xB8DC, 0x8A71,\n\t0xB8DD, 0x8A85, 0xB8DE, 0x8A6D, 0xB8DF, 0x8A62, 0xB8E0, 0x8A6E,\t0xB8E1, 0x8A6C, 0xB8E2, 0x8A79, 0xB8E3, 0x8A7B, 0xB8E4, 0x8A3E,\n\t0xB8E5, 0x8A68, 0xB8E6, 0x8C62, 0xB8E7, 0x8C8A, 0xB8E8, 0x8C89,\t0xB8E9, 0x8CCA, 0xB8EA, 0x8CC7, 0xB8EB, 0x8CC8, 0xB8EC, 0x8CC4,\n\t0xB8ED, 0x8CB2, 0xB8EE, 0x8CC3, 0xB8EF, 0x8CC2, 0xB8F0, 0x8CC5,\t0xB8F1, 0x8DE1, 0xB8F2, 0x8DDF, 0xB8F3, 0x8DE8, 0xB8F4, 0x8DEF,\n\t0xB8F5, 0x8DF3, 0xB8F6, 0x8DFA, 0xB8F7, 0x8DEA, 0xB8F8, 0x8DE4,\t0xB8F9, 0x8DE6, 0xB8FA, 0x8EB2, 0xB8FB, 0x8F03, 0xB8FC, 0x8F09,\n\t0xB8FD, 0x8EFE, 0xB8FE, 0x8F0A, 0xB940, 0x8F9F, 0xB941, 0x8FB2,\t0xB942, 0x904B, 0xB943, 0x904A, 0xB944, 0x9053, 0xB945, 0x9042,\n\t0xB946, 0x9054, 0xB947, 0x903C, 0xB948, 0x9055, 0xB949, 0x9050,\t0xB94A, 0x9047, 0xB94B, 0x904F, 0xB94C, 0x904E, 0xB94D, 0x904D,\n\t0xB94E, 0x9051, 0xB94F, 0x903E, 0xB950, 0x9041, 0xB951, 0x9112,\t0xB952, 0x9117, 0xB953, 0x916C, 0xB954, 0x916A, 0xB955, 0x9169,\n\t0xB956, 0x91C9, 0xB957, 0x9237, 0xB958, 0x9257, 0xB959, 0x9238,\t0xB95A, 0x923D, 0xB95B, 0x9240, 0xB95C, 0x923E, 0xB95D, 0x925B,\n\t0xB95E, 0x924B, 0xB95F, 0x9264, 0xB960, 0x9251, 0xB961, 0x9234,\t0xB962, 0x9249, 0xB963, 0x924D, 0xB964, 0x9245, 0xB965, 0x9239,\n\t0xB966, 0x923F, 0xB967, 0x925A, 0xB968, 0x9598, 0xB969, 0x9698,\t0xB96A, 0x9694, 0xB96B, 0x9695, 0xB96C, 0x96CD, 0xB96D, 0x96CB,\n\t0xB96E, 0x96C9, 0xB96F, 0x96CA, 0xB970, 0x96F7, 0xB971, 0x96FB,\t0xB972, 0x96F9, 0xB973, 0x96F6, 0xB974, 0x9756, 0xB975, 0x9774,\n\t0xB976, 0x9776, 0xB977, 0x9810, 0xB978, 0x9811, 0xB979, 0x9813,\t0xB97A, 0x980A, 0xB97B, 0x9812, 0xB97C, 0x980C, 0xB97D, 0x98FC,\n\t0xB97E, 0x98F4, 0xB9A1, 0x98FD, 0xB9A2, 0x98FE, 0xB9A3, 0x99B3,\t0xB9A4, 0x99B1, 0xB9A5, 0x99B4, 0xB9A6, 0x9AE1, 0xB9A7, 0x9CE9,\n\t0xB9A8, 0x9E82, 0xB9A9, 0x9F0E, 0xB9AA, 0x9F13, 0xB9AB, 0x9F20,\t0xB9AC, 0x50E7, 0xB9AD, 0x50EE, 0xB9AE, 0x50E5, 0xB9AF, 0x50D6,\n\t0xB9B0, 0x50ED, 0xB9B1, 0x50DA, 0xB9B2, 0x50D5, 0xB9B3, 0x50CF,\t0xB9B4, 0x50D1, 0xB9B5, 0x50F1, 0xB9B6, 0x50CE, 0xB9B7, 0x50E9,\n\t0xB9B8, 0x5162, 0xB9B9, 0x51F3, 0xB9BA, 0x5283, 0xB9BB, 0x5282,\t0xB9BC, 0x5331, 0xB9BD, 0x53AD, 0xB9BE, 0x55FE, 0xB9BF, 0x5600,\n\t0xB9C0, 0x561B, 0xB9C1, 0x5617, 0xB9C2, 0x55FD, 0xB9C3, 0x5614,\t0xB9C4, 0x5606, 0xB9C5, 0x5609, 0xB9C6, 0x560D, 0xB9C7, 0x560E,\n\t0xB9C8, 0x55F7, 0xB9C9, 0x5616, 0xB9CA, 0x561F, 0xB9CB, 0x5608,\t0xB9CC, 0x5610, 0xB9CD, 0x55F6, 0xB9CE, 0x5718, 0xB9CF, 0x5716,\n\t0xB9D0, 0x5875, 0xB9D1, 0x587E, 0xB9D2, 0x5883, 0xB9D3, 0x5893,\t0xB9D4, 0x588A, 0xB9D5, 0x5879, 0xB9D6, 0x5885, 0xB9D7, 0x587D,\n\t0xB9D8, 0x58FD, 0xB9D9, 0x5925, 0xB9DA, 0x5922, 0xB9DB, 0x5924,\t0xB9DC, 0x596A, 0xB9DD, 0x5969, 0xB9DE, 0x5AE1, 0xB9DF, 0x5AE6,\n\t0xB9E0, 0x5AE9, 0xB9E1, 0x5AD7, 0xB9E2, 0x5AD6, 0xB9E3, 0x5AD8,\t0xB9E4, 0x5AE3, 0xB9E5, 0x5B75, 0xB9E6, 0x5BDE, 0xB9E7, 0x5BE7,\n\t0xB9E8, 0x5BE1, 0xB9E9, 0x5BE5, 0xB9EA, 0x5BE6, 0xB9EB, 0x5BE8,\t0xB9EC, 0x5BE2, 0xB9ED, 0x5BE4, 0xB9EE, 0x5BDF, 0xB9EF, 0x5C0D,\n\t0xB9F0, 0x5C62, 0xB9F1, 0x5D84, 0xB9F2, 0x5D87, 0xB9F3, 0x5E5B,\t0xB9F4, 0x5E63, 0xB9F5, 0x5E55, 0xB9F6, 0x5E57, 0xB9F7, 0x5E54,\n\t0xB9F8, 0x5ED3, 0xB9F9, 0x5ED6, 0xB9FA, 0x5F0A, 0xB9FB, 0x5F46,\t0xB9FC, 0x5F70, 0xB9FD, 0x5FB9, 0xB9FE, 0x6147, 0xBA40, 0x613F,\n\t0xBA41, 0x614B, 0xBA42, 0x6177, 0xBA43, 0x6162, 0xBA44, 0x6163,\t0xBA45, 0x615F, 0xBA46, 0x615A, 0xBA47, 0x6158, 0xBA48, 0x6175,\n\t0xBA49, 0x622A, 0xBA4A, 0x6487, 0xBA4B, 0x6458, 0xBA4C, 0x6454,\t0xBA4D, 0x64A4, 0xBA4E, 0x6478, 0xBA4F, 0x645F, 0xBA50, 0x647A,\n\t0xBA51, 0x6451, 0xBA52, 0x6467, 0xBA53, 0x6434, 0xBA54, 0x646D,\t0xBA55, 0x647B, 0xBA56, 0x6572, 0xBA57, 0x65A1, 0xBA58, 0x65D7,\n\t0xBA59, 0x65D6, 0xBA5A, 0x66A2, 0xBA5B, 0x66A8, 0xBA5C, 0x669D,\t0xBA5D, 0x699C, 0xBA5E, 0x69A8, 0xBA5F, 0x6995, 0xBA60, 0x69C1,\n\t0xBA61, 0x69AE, 0xBA62, 0x69D3, 0xBA63, 0x69CB, 0xBA64, 0x699B,\t0xBA65, 0x69B7, 0xBA66, 0x69BB, 0xBA67, 0x69AB, 0xBA68, 0x69B4,\n\t0xBA69, 0x69D0, 0xBA6A, 0x69CD, 0xBA6B, 0x69AD, 0xBA6C, 0x69CC,\t0xBA6D, 0x69A6, 0xBA6E, 0x69C3, 0xBA6F, 0x69A3, 0xBA70, 0x6B49,\n\t0xBA71, 0x6B4C, 0xBA72, 0x6C33, 0xBA73, 0x6F33, 0xBA74, 0x6F14,\t0xBA75, 0x6EFE, 0xBA76, 0x6F13, 0xBA77, 0x6EF4, 0xBA78, 0x6F29,\n\t0xBA79, 0x6F3E, 0xBA7A, 0x6F20, 0xBA7B, 0x6F2C, 0xBA7C, 0x6F0F,\t0xBA7D, 0x6F02, 0xBA7E, 0x6F22, 0xBAA1, 0x6EFF, 0xBAA2, 0x6EEF,\n\t0xBAA3, 0x6F06, 0xBAA4, 0x6F31, 0xBAA5, 0x6F38, 0xBAA6, 0x6F32,\t0xBAA7, 0x6F23, 0xBAA8, 0x6F15, 0xBAA9, 0x6F2B, 0xBAAA, 0x6F2F,\n\t0xBAAB, 0x6F88, 0xBAAC, 0x6F2A, 0xBAAD, 0x6EEC, 0xBAAE, 0x6F01,\t0xBAAF, 0x6EF2, 0xBAB0, 0x6ECC, 0xBAB1, 0x6EF7, 0xBAB2, 0x7194,\n\t0xBAB3, 0x7199, 0xBAB4, 0x717D, 0xBAB5, 0x718A, 0xBAB6, 0x7184,\t0xBAB7, 0x7192, 0xBAB8, 0x723E, 0xBAB9, 0x7292, 0xBABA, 0x7296,\n\t0xBABB, 0x7344, 0xBABC, 0x7350, 0xBABD, 0x7464, 0xBABE, 0x7463,\t0xBABF, 0x746A, 0xBAC0, 0x7470, 0xBAC1, 0x746D, 0xBAC2, 0x7504,\n\t0xBAC3, 0x7591, 0xBAC4, 0x7627, 0xBAC5, 0x760D, 0xBAC6, 0x760B,\t0xBAC7, 0x7609, 0xBAC8, 0x7613, 0xBAC9, 0x76E1, 0xBACA, 0x76E3,\n\t0xBACB, 0x7784, 0xBACC, 0x777D, 0xBACD, 0x777F, 0xBACE, 0x7761,\t0xBACF, 0x78C1, 0xBAD0, 0x789F, 0xBAD1, 0x78A7, 0xBAD2, 0x78B3,\n\t0xBAD3, 0x78A9, 0xBAD4, 0x78A3, 0xBAD5, 0x798E, 0xBAD6, 0x798F,\t0xBAD7, 0x798D, 0xBAD8, 0x7A2E, 0xBAD9, 0x7A31, 0xBADA, 0x7AAA,\n\t0xBADB, 0x7AA9, 0xBADC, 0x7AED, 0xBADD, 0x7AEF, 0xBADE, 0x7BA1,\t0xBADF, 0x7B95, 0xBAE0, 0x7B8B, 0xBAE1, 0x7B75, 0xBAE2, 0x7B97,\n\t0xBAE3, 0x7B9D, 0xBAE4, 0x7B94, 0xBAE5, 0x7B8F, 0xBAE6, 0x7BB8,\t0xBAE7, 0x7B87, 0xBAE8, 0x7B84, 0xBAE9, 0x7CB9, 0xBAEA, 0x7CBD,\n\t0xBAEB, 0x7CBE, 0xBAEC, 0x7DBB, 0xBAED, 0x7DB0, 0xBAEE, 0x7D9C,\t0xBAEF, 0x7DBD, 0xBAF0, 0x7DBE, 0xBAF1, 0x7DA0, 0xBAF2, 0x7DCA,\n\t0xBAF3, 0x7DB4, 0xBAF4, 0x7DB2, 0xBAF5, 0x7DB1, 0xBAF6, 0x7DBA,\t0xBAF7, 0x7DA2, 0xBAF8, 0x7DBF, 0xBAF9, 0x7DB5, 0xBAFA, 0x7DB8,\n\t0xBAFB, 0x7DAD, 0xBAFC, 0x7DD2, 0xBAFD, 0x7DC7, 0xBAFE, 0x7DAC,\t0xBB40, 0x7F70, 0xBB41, 0x7FE0, 0xBB42, 0x7FE1, 0xBB43, 0x7FDF,\n\t0xBB44, 0x805E, 0xBB45, 0x805A, 0xBB46, 0x8087, 0xBB47, 0x8150,\t0xBB48, 0x8180, 0xBB49, 0x818F, 0xBB4A, 0x8188, 0xBB4B, 0x818A,\n\t0xBB4C, 0x817F, 0xBB4D, 0x8182, 0xBB4E, 0x81E7, 0xBB4F, 0x81FA,\t0xBB50, 0x8207, 0xBB51, 0x8214, 0xBB52, 0x821E, 0xBB53, 0x824B,\n\t0xBB54, 0x84C9, 0xBB55, 0x84BF, 0xBB56, 0x84C6, 0xBB57, 0x84C4,\t0xBB58, 0x8499, 0xBB59, 0x849E, 0xBB5A, 0x84B2, 0xBB5B, 0x849C,\n\t0xBB5C, 0x84CB, 0xBB5D, 0x84B8, 0xBB5E, 0x84C0, 0xBB5F, 0x84D3,\t0xBB60, 0x8490, 0xBB61, 0x84BC, 0xBB62, 0x84D1, 0xBB63, 0x84CA,\n\t0xBB64, 0x873F, 0xBB65, 0x871C, 0xBB66, 0x873B, 0xBB67, 0x8722,\t0xBB68, 0x8725, 0xBB69, 0x8734, 0xBB6A, 0x8718, 0xBB6B, 0x8755,\n\t0xBB6C, 0x8737, 0xBB6D, 0x8729, 0xBB6E, 0x88F3, 0xBB6F, 0x8902,\t0xBB70, 0x88F4, 0xBB71, 0x88F9, 0xBB72, 0x88F8, 0xBB73, 0x88FD,\n\t0xBB74, 0x88E8, 0xBB75, 0x891A, 0xBB76, 0x88EF, 0xBB77, 0x8AA6,\t0xBB78, 0x8A8C, 0xBB79, 0x8A9E, 0xBB7A, 0x8AA3, 0xBB7B, 0x8A8D,\n\t0xBB7C, 0x8AA1, 0xBB7D, 0x8A93, 0xBB7E, 0x8AA4, 0xBBA1, 0x8AAA,\t0xBBA2, 0x8AA5, 0xBBA3, 0x8AA8, 0xBBA4, 0x8A98, 0xBBA5, 0x8A91,\n\t0xBBA6, 0x8A9A, 0xBBA7, 0x8AA7, 0xBBA8, 0x8C6A, 0xBBA9, 0x8C8D,\t0xBBAA, 0x8C8C, 0xBBAB, 0x8CD3, 0xBBAC, 0x8CD1, 0xBBAD, 0x8CD2,\n\t0xBBAE, 0x8D6B, 0xBBAF, 0x8D99, 0xBBB0, 0x8D95, 0xBBB1, 0x8DFC,\t0xBBB2, 0x8F14, 0xBBB3, 0x8F12, 0xBBB4, 0x8F15, 0xBBB5, 0x8F13,\n\t0xBBB6, 0x8FA3, 0xBBB7, 0x9060, 0xBBB8, 0x9058, 0xBBB9, 0x905C,\t0xBBBA, 0x9063, 0xBBBB, 0x9059, 0xBBBC, 0x905E, 0xBBBD, 0x9062,\n\t0xBBBE, 0x905D, 0xBBBF, 0x905B, 0xBBC0, 0x9119, 0xBBC1, 0x9118,\t0xBBC2, 0x911E, 0xBBC3, 0x9175, 0xBBC4, 0x9178, 0xBBC5, 0x9177,\n\t0xBBC6, 0x9174, 0xBBC7, 0x9278, 0xBBC8, 0x9280, 0xBBC9, 0x9285,\t0xBBCA, 0x9298, 0xBBCB, 0x9296, 0xBBCC, 0x927B, 0xBBCD, 0x9293,\n\t0xBBCE, 0x929C, 0xBBCF, 0x92A8, 0xBBD0, 0x927C, 0xBBD1, 0x9291,\t0xBBD2, 0x95A1, 0xBBD3, 0x95A8, 0xBBD4, 0x95A9, 0xBBD5, 0x95A3,\n\t0xBBD6, 0x95A5, 0xBBD7, 0x95A4, 0xBBD8, 0x9699, 0xBBD9, 0x969C,\t0xBBDA, 0x969B, 0xBBDB, 0x96CC, 0xBBDC, 0x96D2, 0xBBDD, 0x9700,\n\t0xBBDE, 0x977C, 0xBBDF, 0x9785, 0xBBE0, 0x97F6, 0xBBE1, 0x9817,\t0xBBE2, 0x9818, 0xBBE3, 0x98AF, 0xBBE4, 0x98B1, 0xBBE5, 0x9903,\n\t0xBBE6, 0x9905, 0xBBE7, 0x990C, 0xBBE8, 0x9909, 0xBBE9, 0x99C1,\t0xBBEA, 0x9AAF, 0xBBEB, 0x9AB0, 0xBBEC, 0x9AE6, 0xBBED, 0x9B41,\n\t0xBBEE, 0x9B42, 0xBBEF, 0x9CF4, 0xBBF0, 0x9CF6, 0xBBF1, 0x9CF3,\t0xBBF2, 0x9EBC, 0xBBF3, 0x9F3B, 0xBBF4, 0x9F4A, 0xBBF5, 0x5104,\n\t0xBBF6, 0x5100, 0xBBF7, 0x50FB, 0xBBF8, 0x50F5, 0xBBF9, 0x50F9,\t0xBBFA, 0x5102, 0xBBFB, 0x5108, 0xBBFC, 0x5109, 0xBBFD, 0x5105,\n\t0xBBFE, 0x51DC, 0xBC40, 0x5287, 0xBC41, 0x5288, 0xBC42, 0x5289,\t0xBC43, 0x528D, 0xBC44, 0x528A, 0xBC45, 0x52F0, 0xBC46, 0x53B2,\n\t0xBC47, 0x562E, 0xBC48, 0x563B, 0xBC49, 0x5639, 0xBC4A, 0x5632,\t0xBC4B, 0x563F, 0xBC4C, 0x5634, 0xBC4D, 0x5629, 0xBC4E, 0x5653,\n\t0xBC4F, 0x564E, 0xBC50, 0x5657, 0xBC51, 0x5674, 0xBC52, 0x5636,\t0xBC53, 0x562F, 0xBC54, 0x5630, 0xBC55, 0x5880, 0xBC56, 0x589F,\n\t0xBC57, 0x589E, 0xBC58, 0x58B3, 0xBC59, 0x589C, 0xBC5A, 0x58AE,\t0xBC5B, 0x58A9, 0xBC5C, 0x58A6, 0xBC5D, 0x596D, 0xBC5E, 0x5B09,\n\t0xBC5F, 0x5AFB, 0xBC60, 0x5B0B, 0xBC61, 0x5AF5, 0xBC62, 0x5B0C,\t0xBC63, 0x5B08, 0xBC64, 0x5BEE, 0xBC65, 0x5BEC, 0xBC66, 0x5BE9,\n\t0xBC67, 0x5BEB, 0xBC68, 0x5C64, 0xBC69, 0x5C65, 0xBC6A, 0x5D9D,\t0xBC6B, 0x5D94, 0xBC6C, 0x5E62, 0xBC6D, 0x5E5F, 0xBC6E, 0x5E61,\n\t0xBC6F, 0x5EE2, 0xBC70, 0x5EDA, 0xBC71, 0x5EDF, 0xBC72, 0x5EDD,\t0xBC73, 0x5EE3, 0xBC74, 0x5EE0, 0xBC75, 0x5F48, 0xBC76, 0x5F71,\n\t0xBC77, 0x5FB7, 0xBC78, 0x5FB5, 0xBC79, 0x6176, 0xBC7A, 0x6167,\t0xBC7B, 0x616E, 0xBC7C, 0x615D, 0xBC7D, 0x6155, 0xBC7E, 0x6182,\n\t0xBCA1, 0x617C, 0xBCA2, 0x6170, 0xBCA3, 0x616B, 0xBCA4, 0x617E,\t0xBCA5, 0x61A7, 0xBCA6, 0x6190, 0xBCA7, 0x61AB, 0xBCA8, 0x618E,\n\t0xBCA9, 0x61AC, 0xBCAA, 0x619A, 0xBCAB, 0x61A4, 0xBCAC, 0x6194,\t0xBCAD, 0x61AE, 0xBCAE, 0x622E, 0xBCAF, 0x6469, 0xBCB0, 0x646F,\n\t0xBCB1, 0x6479, 0xBCB2, 0x649E, 0xBCB3, 0x64B2, 0xBCB4, 0x6488,\t0xBCB5, 0x6490, 0xBCB6, 0x64B0, 0xBCB7, 0x64A5, 0xBCB8, 0x6493,\n\t0xBCB9, 0x6495, 0xBCBA, 0x64A9, 0xBCBB, 0x6492, 0xBCBC, 0x64AE,\t0xBCBD, 0x64AD, 0xBCBE, 0x64AB, 0xBCBF, 0x649A, 0xBCC0, 0x64AC,\n\t0xBCC1, 0x6499, 0xBCC2, 0x64A2, 0xBCC3, 0x64B3, 0xBCC4, 0x6575,\t0xBCC5, 0x6577, 0xBCC6, 0x6578, 0xBCC7, 0x66AE, 0xBCC8, 0x66AB,\n\t0xBCC9, 0x66B4, 0xBCCA, 0x66B1, 0xBCCB, 0x6A23, 0xBCCC, 0x6A1F,\t0xBCCD, 0x69E8, 0xBCCE, 0x6A01, 0xBCCF, 0x6A1E, 0xBCD0, 0x6A19,\n\t0xBCD1, 0x69FD, 0xBCD2, 0x6A21, 0xBCD3, 0x6A13, 0xBCD4, 0x6A0A,\t0xBCD5, 0x69F3, 0xBCD6, 0x6A02, 0xBCD7, 0x6A05, 0xBCD8, 0x69ED,\n\t0xBCD9, 0x6A11, 0xBCDA, 0x6B50, 0xBCDB, 0x6B4E, 0xBCDC, 0x6BA4,\t0xBCDD, 0x6BC5, 0xBCDE, 0x6BC6, 0xBCDF, 0x6F3F, 0xBCE0, 0x6F7C,\n\t0xBCE1, 0x6F84, 0xBCE2, 0x6F51, 0xBCE3, 0x6F66, 0xBCE4, 0x6F54,\t0xBCE5, 0x6F86, 0xBCE6, 0x6F6D, 0xBCE7, 0x6F5B, 0xBCE8, 0x6F78,\n\t0xBCE9, 0x6F6E, 0xBCEA, 0x6F8E, 0xBCEB, 0x6F7A, 0xBCEC, 0x6F70,\t0xBCED, 0x6F64, 0xBCEE, 0x6F97, 0xBCEF, 0x6F58, 0xBCF0, 0x6ED5,\n\t0xBCF1, 0x6F6F, 0xBCF2, 0x6F60, 0xBCF3, 0x6F5F, 0xBCF4, 0x719F,\t0xBCF5, 0x71AC, 0xBCF6, 0x71B1, 0xBCF7, 0x71A8, 0xBCF8, 0x7256,\n\t0xBCF9, 0x729B, 0xBCFA, 0x734E, 0xBCFB, 0x7357, 0xBCFC, 0x7469,\t0xBCFD, 0x748B, 0xBCFE, 0x7483, 0xBD40, 0x747E, 0xBD41, 0x7480,\n\t0xBD42, 0x757F, 0xBD43, 0x7620, 0xBD44, 0x7629, 0xBD45, 0x761F,\t0xBD46, 0x7624, 0xBD47, 0x7626, 0xBD48, 0x7621, 0xBD49, 0x7622,\n\t0xBD4A, 0x769A, 0xBD4B, 0x76BA, 0xBD4C, 0x76E4, 0xBD4D, 0x778E,\t0xBD4E, 0x7787, 0xBD4F, 0x778C, 0xBD50, 0x7791, 0xBD51, 0x778B,\n\t0xBD52, 0x78CB, 0xBD53, 0x78C5, 0xBD54, 0x78BA, 0xBD55, 0x78CA,\t0xBD56, 0x78BE, 0xBD57, 0x78D5, 0xBD58, 0x78BC, 0xBD59, 0x78D0,\n\t0xBD5A, 0x7A3F, 0xBD5B, 0x7A3C, 0xBD5C, 0x7A40, 0xBD5D, 0x7A3D,\t0xBD5E, 0x7A37, 0xBD5F, 0x7A3B, 0xBD60, 0x7AAF, 0xBD61, 0x7AAE,\n\t0xBD62, 0x7BAD, 0xBD63, 0x7BB1, 0xBD64, 0x7BC4, 0xBD65, 0x7BB4,\t0xBD66, 0x7BC6, 0xBD67, 0x7BC7, 0xBD68, 0x7BC1, 0xBD69, 0x7BA0,\n\t0xBD6A, 0x7BCC, 0xBD6B, 0x7CCA, 0xBD6C, 0x7DE0, 0xBD6D, 0x7DF4,\t0xBD6E, 0x7DEF, 0xBD6F, 0x7DFB, 0xBD70, 0x7DD8, 0xBD71, 0x7DEC,\n\t0xBD72, 0x7DDD, 0xBD73, 0x7DE8, 0xBD74, 0x7DE3, 0xBD75, 0x7DDA,\t0xBD76, 0x7DDE, 0xBD77, 0x7DE9, 0xBD78, 0x7D9E, 0xBD79, 0x7DD9,\n\t0xBD7A, 0x7DF2, 0xBD7B, 0x7DF9, 0xBD7C, 0x7F75, 0xBD7D, 0x7F77,\t0xBD7E, 0x7FAF, 0xBDA1, 0x7FE9, 0xBDA2, 0x8026, 0xBDA3, 0x819B,\n\t0xBDA4, 0x819C, 0xBDA5, 0x819D, 0xBDA6, 0x81A0, 0xBDA7, 0x819A,\t0xBDA8, 0x8198, 0xBDA9, 0x8517, 0xBDAA, 0x853D, 0xBDAB, 0x851A,\n\t0xBDAC, 0x84EE, 0xBDAD, 0x852C, 0xBDAE, 0x852D, 0xBDAF, 0x8513,\t0xBDB0, 0x8511, 0xBDB1, 0x8523, 0xBDB2, 0x8521, 0xBDB3, 0x8514,\n\t0xBDB4, 0x84EC, 0xBDB5, 0x8525, 0xBDB6, 0x84FF, 0xBDB7, 0x8506,\t0xBDB8, 0x8782, 0xBDB9, 0x8774, 0xBDBA, 0x8776, 0xBDBB, 0x8760,\n\t0xBDBC, 0x8766, 0xBDBD, 0x8778, 0xBDBE, 0x8768, 0xBDBF, 0x8759,\t0xBDC0, 0x8757, 0xBDC1, 0x874C, 0xBDC2, 0x8753, 0xBDC3, 0x885B,\n\t0xBDC4, 0x885D, 0xBDC5, 0x8910, 0xBDC6, 0x8907, 0xBDC7, 0x8912,\t0xBDC8, 0x8913, 0xBDC9, 0x8915, 0xBDCA, 0x890A, 0xBDCB, 0x8ABC,\n\t0xBDCC, 0x8AD2, 0xBDCD, 0x8AC7, 0xBDCE, 0x8AC4, 0xBDCF, 0x8A95,\t0xBDD0, 0x8ACB, 0xBDD1, 0x8AF8, 0xBDD2, 0x8AB2, 0xBDD3, 0x8AC9,\n\t0xBDD4, 0x8AC2, 0xBDD5, 0x8ABF, 0xBDD6, 0x8AB0, 0xBDD7, 0x8AD6,\t0xBDD8, 0x8ACD, 0xBDD9, 0x8AB6, 0xBDDA, 0x8AB9, 0xBDDB, 0x8ADB,\n\t0xBDDC, 0x8C4C, 0xBDDD, 0x8C4E, 0xBDDE, 0x8C6C, 0xBDDF, 0x8CE0,\t0xBDE0, 0x8CDE, 0xBDE1, 0x8CE6, 0xBDE2, 0x8CE4, 0xBDE3, 0x8CEC,\n\t0xBDE4, 0x8CED, 0xBDE5, 0x8CE2, 0xBDE6, 0x8CE3, 0xBDE7, 0x8CDC,\t0xBDE8, 0x8CEA, 0xBDE9, 0x8CE1, 0xBDEA, 0x8D6D, 0xBDEB, 0x8D9F,\n\t0xBDEC, 0x8DA3, 0xBDED, 0x8E2B, 0xBDEE, 0x8E10, 0xBDEF, 0x8E1D,\t0xBDF0, 0x8E22, 0xBDF1, 0x8E0F, 0xBDF2, 0x8E29, 0xBDF3, 0x8E1F,\n\t0xBDF4, 0x8E21, 0xBDF5, 0x8E1E, 0xBDF6, 0x8EBA, 0xBDF7, 0x8F1D,\t0xBDF8, 0x8F1B, 0xBDF9, 0x8F1F, 0xBDFA, 0x8F29, 0xBDFB, 0x8F26,\n\t0xBDFC, 0x8F2A, 0xBDFD, 0x8F1C, 0xBDFE, 0x8F1E, 0xBE40, 0x8F25,\t0xBE41, 0x9069, 0xBE42, 0x906E, 0xBE43, 0x9068, 0xBE44, 0x906D,\n\t0xBE45, 0x9077, 0xBE46, 0x9130, 0xBE47, 0x912D, 0xBE48, 0x9127,\t0xBE49, 0x9131, 0xBE4A, 0x9187, 0xBE4B, 0x9189, 0xBE4C, 0x918B,\n\t0xBE4D, 0x9183, 0xBE4E, 0x92C5, 0xBE4F, 0x92BB, 0xBE50, 0x92B7,\t0xBE51, 0x92EA, 0xBE52, 0x92AC, 0xBE53, 0x92E4, 0xBE54, 0x92C1,\n\t0xBE55, 0x92B3, 0xBE56, 0x92BC, 0xBE57, 0x92D2, 0xBE58, 0x92C7,\t0xBE59, 0x92F0, 0xBE5A, 0x92B2, 0xBE5B, 0x95AD, 0xBE5C, 0x95B1,\n\t0xBE5D, 0x9704, 0xBE5E, 0x9706, 0xBE5F, 0x9707, 0xBE60, 0x9709,\t0xBE61, 0x9760, 0xBE62, 0x978D, 0xBE63, 0x978B, 0xBE64, 0x978F,\n\t0xBE65, 0x9821, 0xBE66, 0x982B, 0xBE67, 0x981C, 0xBE68, 0x98B3,\t0xBE69, 0x990A, 0xBE6A, 0x9913, 0xBE6B, 0x9912, 0xBE6C, 0x9918,\n\t0xBE6D, 0x99DD, 0xBE6E, 0x99D0, 0xBE6F, 0x99DF, 0xBE70, 0x99DB,\t0xBE71, 0x99D1, 0xBE72, 0x99D5, 0xBE73, 0x99D2, 0xBE74, 0x99D9,\n\t0xBE75, 0x9AB7, 0xBE76, 0x9AEE, 0xBE77, 0x9AEF, 0xBE78, 0x9B27,\t0xBE79, 0x9B45, 0xBE7A, 0x9B44, 0xBE7B, 0x9B77, 0xBE7C, 0x9B6F,\n\t0xBE7D, 0x9D06, 0xBE7E, 0x9D09, 0xBEA1, 0x9D03, 0xBEA2, 0x9EA9,\t0xBEA3, 0x9EBE, 0xBEA4, 0x9ECE, 0xBEA5, 0x58A8, 0xBEA6, 0x9F52,\n\t0xBEA7, 0x5112, 0xBEA8, 0x5118, 0xBEA9, 0x5114, 0xBEAA, 0x5110,\t0xBEAB, 0x5115, 0xBEAC, 0x5180, 0xBEAD, 0x51AA, 0xBEAE, 0x51DD,\n\t0xBEAF, 0x5291, 0xBEB0, 0x5293, 0xBEB1, 0x52F3, 0xBEB2, 0x5659,\t0xBEB3, 0x566B, 0xBEB4, 0x5679, 0xBEB5, 0x5669, 0xBEB6, 0x5664,\n\t0xBEB7, 0x5678, 0xBEB8, 0x566A, 0xBEB9, 0x5668, 0xBEBA, 0x5665,\t0xBEBB, 0x5671, 0xBEBC, 0x566F, 0xBEBD, 0x566C, 0xBEBE, 0x5662,\n\t0xBEBF, 0x5676, 0xBEC0, 0x58C1, 0xBEC1, 0x58BE, 0xBEC2, 0x58C7,\t0xBEC3, 0x58C5, 0xBEC4, 0x596E, 0xBEC5, 0x5B1D, 0xBEC6, 0x5B34,\n\t0xBEC7, 0x5B78, 0xBEC8, 0x5BF0, 0xBEC9, 0x5C0E, 0xBECA, 0x5F4A,\t0xBECB, 0x61B2, 0xBECC, 0x6191, 0xBECD, 0x61A9, 0xBECE, 0x618A,\n\t0xBECF, 0x61CD, 0xBED0, 0x61B6, 0xBED1, 0x61BE, 0xBED2, 0x61CA,\t0xBED3, 0x61C8, 0xBED4, 0x6230, 0xBED5, 0x64C5, 0xBED6, 0x64C1,\n\t0xBED7, 0x64CB, 0xBED8, 0x64BB, 0xBED9, 0x64BC, 0xBEDA, 0x64DA,\t0xBEDB, 0x64C4, 0xBEDC, 0x64C7, 0xBEDD, 0x64C2, 0xBEDE, 0x64CD,\n\t0xBEDF, 0x64BF, 0xBEE0, 0x64D2, 0xBEE1, 0x64D4, 0xBEE2, 0x64BE,\t0xBEE3, 0x6574, 0xBEE4, 0x66C6, 0xBEE5, 0x66C9, 0xBEE6, 0x66B9,\n\t0xBEE7, 0x66C4, 0xBEE8, 0x66C7, 0xBEE9, 0x66B8, 0xBEEA, 0x6A3D,\t0xBEEB, 0x6A38, 0xBEEC, 0x6A3A, 0xBEED, 0x6A59, 0xBEEE, 0x6A6B,\n\t0xBEEF, 0x6A58, 0xBEF0, 0x6A39, 0xBEF1, 0x6A44, 0xBEF2, 0x6A62,\t0xBEF3, 0x6A61, 0xBEF4, 0x6A4B, 0xBEF5, 0x6A47, 0xBEF6, 0x6A35,\n\t0xBEF7, 0x6A5F, 0xBEF8, 0x6A48, 0xBEF9, 0x6B59, 0xBEFA, 0x6B77,\t0xBEFB, 0x6C05, 0xBEFC, 0x6FC2, 0xBEFD, 0x6FB1, 0xBEFE, 0x6FA1,\n\t0xBF40, 0x6FC3, 0xBF41, 0x6FA4, 0xBF42, 0x6FC1, 0xBF43, 0x6FA7,\t0xBF44, 0x6FB3, 0xBF45, 0x6FC0, 0xBF46, 0x6FB9, 0xBF47, 0x6FB6,\n\t0xBF48, 0x6FA6, 0xBF49, 0x6FA0, 0xBF4A, 0x6FB4, 0xBF4B, 0x71BE,\t0xBF4C, 0x71C9, 0xBF4D, 0x71D0, 0xBF4E, 0x71D2, 0xBF4F, 0x71C8,\n\t0xBF50, 0x71D5, 0xBF51, 0x71B9, 0xBF52, 0x71CE, 0xBF53, 0x71D9,\t0xBF54, 0x71DC, 0xBF55, 0x71C3, 0xBF56, 0x71C4, 0xBF57, 0x7368,\n\t0xBF58, 0x749C, 0xBF59, 0x74A3, 0xBF5A, 0x7498, 0xBF5B, 0x749F,\t0xBF5C, 0x749E, 0xBF5D, 0x74E2, 0xBF5E, 0x750C, 0xBF5F, 0x750D,\n\t0xBF60, 0x7634, 0xBF61, 0x7638, 0xBF62, 0x763A, 0xBF63, 0x76E7,\t0xBF64, 0x76E5, 0xBF65, 0x77A0, 0xBF66, 0x779E, 0xBF67, 0x779F,\n\t0xBF68, 0x77A5, 0xBF69, 0x78E8, 0xBF6A, 0x78DA, 0xBF6B, 0x78EC,\t0xBF6C, 0x78E7, 0xBF6D, 0x79A6, 0xBF6E, 0x7A4D, 0xBF6F, 0x7A4E,\n\t0xBF70, 0x7A46, 0xBF71, 0x7A4C, 0xBF72, 0x7A4B, 0xBF73, 0x7ABA,\t0xBF74, 0x7BD9, 0xBF75, 0x7C11, 0xBF76, 0x7BC9, 0xBF77, 0x7BE4,\n\t0xBF78, 0x7BDB, 0xBF79, 0x7BE1, 0xBF7A, 0x7BE9, 0xBF7B, 0x7BE6,\t0xBF7C, 0x7CD5, 0xBF7D, 0x7CD6, 0xBF7E, 0x7E0A, 0xBFA1, 0x7E11,\n\t0xBFA2, 0x7E08, 0xBFA3, 0x7E1B, 0xBFA4, 0x7E23, 0xBFA5, 0x7E1E,\t0xBFA6, 0x7E1D, 0xBFA7, 0x7E09, 0xBFA8, 0x7E10, 0xBFA9, 0x7F79,\n\t0xBFAA, 0x7FB2, 0xBFAB, 0x7FF0, 0xBFAC, 0x7FF1, 0xBFAD, 0x7FEE,\t0xBFAE, 0x8028, 0xBFAF, 0x81B3, 0xBFB0, 0x81A9, 0xBFB1, 0x81A8,\n\t0xBFB2, 0x81FB, 0xBFB3, 0x8208, 0xBFB4, 0x8258, 0xBFB5, 0x8259,\t0xBFB6, 0x854A, 0xBFB7, 0x8559, 0xBFB8, 0x8548, 0xBFB9, 0x8568,\n\t0xBFBA, 0x8569, 0xBFBB, 0x8543, 0xBFBC, 0x8549, 0xBFBD, 0x856D,\t0xBFBE, 0x856A, 0xBFBF, 0x855E, 0xBFC0, 0x8783, 0xBFC1, 0x879F,\n\t0xBFC2, 0x879E, 0xBFC3, 0x87A2, 0xBFC4, 0x878D, 0xBFC5, 0x8861,\t0xBFC6, 0x892A, 0xBFC7, 0x8932, 0xBFC8, 0x8925, 0xBFC9, 0x892B,\n\t0xBFCA, 0x8921, 0xBFCB, 0x89AA, 0xBFCC, 0x89A6, 0xBFCD, 0x8AE6,\t0xBFCE, 0x8AFA, 0xBFCF, 0x8AEB, 0xBFD0, 0x8AF1, 0xBFD1, 0x8B00,\n\t0xBFD2, 0x8ADC, 0xBFD3, 0x8AE7, 0xBFD4, 0x8AEE, 0xBFD5, 0x8AFE,\t0xBFD6, 0x8B01, 0xBFD7, 0x8B02, 0xBFD8, 0x8AF7, 0xBFD9, 0x8AED,\n\t0xBFDA, 0x8AF3, 0xBFDB, 0x8AF6, 0xBFDC, 0x8AFC, 0xBFDD, 0x8C6B,\t0xBFDE, 0x8C6D, 0xBFDF, 0x8C93, 0xBFE0, 0x8CF4, 0xBFE1, 0x8E44,\n\t0xBFE2, 0x8E31, 0xBFE3, 0x8E34, 0xBFE4, 0x8E42, 0xBFE5, 0x8E39,\t0xBFE6, 0x8E35, 0xBFE7, 0x8F3B, 0xBFE8, 0x8F2F, 0xBFE9, 0x8F38,\n\t0xBFEA, 0x8F33, 0xBFEB, 0x8FA8, 0xBFEC, 0x8FA6, 0xBFED, 0x9075,\t0xBFEE, 0x9074, 0xBFEF, 0x9078, 0xBFF0, 0x9072, 0xBFF1, 0x907C,\n\t0xBFF2, 0x907A, 0xBFF3, 0x9134, 0xBFF4, 0x9192, 0xBFF5, 0x9320,\t0xBFF6, 0x9336, 0xBFF7, 0x92F8, 0xBFF8, 0x9333, 0xBFF9, 0x932F,\n\t0xBFFA, 0x9322, 0xBFFB, 0x92FC, 0xBFFC, 0x932B, 0xBFFD, 0x9304,\t0xBFFE, 0x931A, 0xC040, 0x9310, 0xC041, 0x9326, 0xC042, 0x9321,\n\t0xC043, 0x9315, 0xC044, 0x932E, 0xC045, 0x9319, 0xC046, 0x95BB,\t0xC047, 0x96A7, 0xC048, 0x96A8, 0xC049, 0x96AA, 0xC04A, 0x96D5,\n\t0xC04B, 0x970E, 0xC04C, 0x9711, 0xC04D, 0x9716, 0xC04E, 0x970D,\t0xC04F, 0x9713, 0xC050, 0x970F, 0xC051, 0x975B, 0xC052, 0x975C,\n\t0xC053, 0x9766, 0xC054, 0x9798, 0xC055, 0x9830, 0xC056, 0x9838,\t0xC057, 0x983B, 0xC058, 0x9837, 0xC059, 0x982D, 0xC05A, 0x9839,\n\t0xC05B, 0x9824, 0xC05C, 0x9910, 0xC05D, 0x9928, 0xC05E, 0x991E,\t0xC05F, 0x991B, 0xC060, 0x9921, 0xC061, 0x991A, 0xC062, 0x99ED,\n\t0xC063, 0x99E2, 0xC064, 0x99F1, 0xC065, 0x9AB8, 0xC066, 0x9ABC,\t0xC067, 0x9AFB, 0xC068, 0x9AED, 0xC069, 0x9B28, 0xC06A, 0x9B91,\n\t0xC06B, 0x9D15, 0xC06C, 0x9D23, 0xC06D, 0x9D26, 0xC06E, 0x9D28,\t0xC06F, 0x9D12, 0xC070, 0x9D1B, 0xC071, 0x9ED8, 0xC072, 0x9ED4,\n\t0xC073, 0x9F8D, 0xC074, 0x9F9C, 0xC075, 0x512A, 0xC076, 0x511F,\t0xC077, 0x5121, 0xC078, 0x5132, 0xC079, 0x52F5, 0xC07A, 0x568E,\n\t0xC07B, 0x5680, 0xC07C, 0x5690, 0xC07D, 0x5685, 0xC07E, 0x5687,\t0xC0A1, 0x568F, 0xC0A2, 0x58D5, 0xC0A3, 0x58D3, 0xC0A4, 0x58D1,\n\t0xC0A5, 0x58CE, 0xC0A6, 0x5B30, 0xC0A7, 0x5B2A, 0xC0A8, 0x5B24,\t0xC0A9, 0x5B7A, 0xC0AA, 0x5C37, 0xC0AB, 0x5C68, 0xC0AC, 0x5DBC,\n\t0xC0AD, 0x5DBA, 0xC0AE, 0x5DBD, 0xC0AF, 0x5DB8, 0xC0B0, 0x5E6B,\t0xC0B1, 0x5F4C, 0xC0B2, 0x5FBD, 0xC0B3, 0x61C9, 0xC0B4, 0x61C2,\n\t0xC0B5, 0x61C7, 0xC0B6, 0x61E6, 0xC0B7, 0x61CB, 0xC0B8, 0x6232,\t0xC0B9, 0x6234, 0xC0BA, 0x64CE, 0xC0BB, 0x64CA, 0xC0BC, 0x64D8,\n\t0xC0BD, 0x64E0, 0xC0BE, 0x64F0, 0xC0BF, 0x64E6, 0xC0C0, 0x64EC,\t0xC0C1, 0x64F1, 0xC0C2, 0x64E2, 0xC0C3, 0x64ED, 0xC0C4, 0x6582,\n\t0xC0C5, 0x6583, 0xC0C6, 0x66D9, 0xC0C7, 0x66D6, 0xC0C8, 0x6A80,\t0xC0C9, 0x6A94, 0xC0CA, 0x6A84, 0xC0CB, 0x6AA2, 0xC0CC, 0x6A9C,\n\t0xC0CD, 0x6ADB, 0xC0CE, 0x6AA3, 0xC0CF, 0x6A7E, 0xC0D0, 0x6A97,\t0xC0D1, 0x6A90, 0xC0D2, 0x6AA0, 0xC0D3, 0x6B5C, 0xC0D4, 0x6BAE,\n\t0xC0D5, 0x6BDA, 0xC0D6, 0x6C08, 0xC0D7, 0x6FD8, 0xC0D8, 0x6FF1,\t0xC0D9, 0x6FDF, 0xC0DA, 0x6FE0, 0xC0DB, 0x6FDB, 0xC0DC, 0x6FE4,\n\t0xC0DD, 0x6FEB, 0xC0DE, 0x6FEF, 0xC0DF, 0x6F80, 0xC0E0, 0x6FEC,\t0xC0E1, 0x6FE1, 0xC0E2, 0x6FE9, 0xC0E3, 0x6FD5, 0xC0E4, 0x6FEE,\n\t0xC0E5, 0x6FF0, 0xC0E6, 0x71E7, 0xC0E7, 0x71DF, 0xC0E8, 0x71EE,\t0xC0E9, 0x71E6, 0xC0EA, 0x71E5, 0xC0EB, 0x71ED, 0xC0EC, 0x71EC,\n\t0xC0ED, 0x71F4, 0xC0EE, 0x71E0, 0xC0EF, 0x7235, 0xC0F0, 0x7246,\t0xC0F1, 0x7370, 0xC0F2, 0x7372, 0xC0F3, 0x74A9, 0xC0F4, 0x74B0,\n\t0xC0F5, 0x74A6, 0xC0F6, 0x74A8, 0xC0F7, 0x7646, 0xC0F8, 0x7642,\t0xC0F9, 0x764C, 0xC0FA, 0x76EA, 0xC0FB, 0x77B3, 0xC0FC, 0x77AA,\n\t0xC0FD, 0x77B0, 0xC0FE, 0x77AC, 0xC140, 0x77A7, 0xC141, 0x77AD,\t0xC142, 0x77EF, 0xC143, 0x78F7, 0xC144, 0x78FA, 0xC145, 0x78F4,\n\t0xC146, 0x78EF, 0xC147, 0x7901, 0xC148, 0x79A7, 0xC149, 0x79AA,\t0xC14A, 0x7A57, 0xC14B, 0x7ABF, 0xC14C, 0x7C07, 0xC14D, 0x7C0D,\n\t0xC14E, 0x7BFE, 0xC14F, 0x7BF7, 0xC150, 0x7C0C, 0xC151, 0x7BE0,\t0xC152, 0x7CE0, 0xC153, 0x7CDC, 0xC154, 0x7CDE, 0xC155, 0x7CE2,\n\t0xC156, 0x7CDF, 0xC157, 0x7CD9, 0xC158, 0x7CDD, 0xC159, 0x7E2E,\t0xC15A, 0x7E3E, 0xC15B, 0x7E46, 0xC15C, 0x7E37, 0xC15D, 0x7E32,\n\t0xC15E, 0x7E43, 0xC15F, 0x7E2B, 0xC160, 0x7E3D, 0xC161, 0x7E31,\t0xC162, 0x7E45, 0xC163, 0x7E41, 0xC164, 0x7E34, 0xC165, 0x7E39,\n\t0xC166, 0x7E48, 0xC167, 0x7E35, 0xC168, 0x7E3F, 0xC169, 0x7E2F,\t0xC16A, 0x7F44, 0xC16B, 0x7FF3, 0xC16C, 0x7FFC, 0xC16D, 0x8071,\n\t0xC16E, 0x8072, 0xC16F, 0x8070, 0xC170, 0x806F, 0xC171, 0x8073,\t0xC172, 0x81C6, 0xC173, 0x81C3, 0xC174, 0x81BA, 0xC175, 0x81C2,\n\t0xC176, 0x81C0, 0xC177, 0x81BF, 0xC178, 0x81BD, 0xC179, 0x81C9,\t0xC17A, 0x81BE, 0xC17B, 0x81E8, 0xC17C, 0x8209, 0xC17D, 0x8271,\n\t0xC17E, 0x85AA, 0xC1A1, 0x8584, 0xC1A2, 0x857E, 0xC1A3, 0x859C,\t0xC1A4, 0x8591, 0xC1A5, 0x8594, 0xC1A6, 0x85AF, 0xC1A7, 0x859B,\n\t0xC1A8, 0x8587, 0xC1A9, 0x85A8, 0xC1AA, 0x858A, 0xC1AB, 0x8667,\t0xC1AC, 0x87C0, 0xC1AD, 0x87D1, 0xC1AE, 0x87B3, 0xC1AF, 0x87D2,\n\t0xC1B0, 0x87C6, 0xC1B1, 0x87AB, 0xC1B2, 0x87BB, 0xC1B3, 0x87BA,\t0xC1B4, 0x87C8, 0xC1B5, 0x87CB, 0xC1B6, 0x893B, 0xC1B7, 0x8936,\n\t0xC1B8, 0x8944, 0xC1B9, 0x8938, 0xC1BA, 0x893D, 0xC1BB, 0x89AC,\t0xC1BC, 0x8B0E, 0xC1BD, 0x8B17, 0xC1BE, 0x8B19, 0xC1BF, 0x8B1B,\n\t0xC1C0, 0x8B0A, 0xC1C1, 0x8B20, 0xC1C2, 0x8B1D, 0xC1C3, 0x8B04,\t0xC1C4, 0x8B10, 0xC1C5, 0x8C41, 0xC1C6, 0x8C3F, 0xC1C7, 0x8C73,\n\t0xC1C8, 0x8CFA, 0xC1C9, 0x8CFD, 0xC1CA, 0x8CFC, 0xC1CB, 0x8CF8,\t0xC1CC, 0x8CFB, 0xC1CD, 0x8DA8, 0xC1CE, 0x8E49, 0xC1CF, 0x8E4B,\n\t0xC1D0, 0x8E48, 0xC1D1, 0x8E4A, 0xC1D2, 0x8F44, 0xC1D3, 0x8F3E,\t0xC1D4, 0x8F42, 0xC1D5, 0x8F45, 0xC1D6, 0x8F3F, 0xC1D7, 0x907F,\n\t0xC1D8, 0x907D, 0xC1D9, 0x9084, 0xC1DA, 0x9081, 0xC1DB, 0x9082,\t0xC1DC, 0x9080, 0xC1DD, 0x9139, 0xC1DE, 0x91A3, 0xC1DF, 0x919E,\n\t0xC1E0, 0x919C, 0xC1E1, 0x934D, 0xC1E2, 0x9382, 0xC1E3, 0x9328,\t0xC1E4, 0x9375, 0xC1E5, 0x934A, 0xC1E6, 0x9365, 0xC1E7, 0x934B,\n\t0xC1E8, 0x9318, 0xC1E9, 0x937E, 0xC1EA, 0x936C, 0xC1EB, 0x935B,\t0xC1EC, 0x9370, 0xC1ED, 0x935A, 0xC1EE, 0x9354, 0xC1EF, 0x95CA,\n\t0xC1F0, 0x95CB, 0xC1F1, 0x95CC, 0xC1F2, 0x95C8, 0xC1F3, 0x95C6,\t0xC1F4, 0x96B1, 0xC1F5, 0x96B8, 0xC1F6, 0x96D6, 0xC1F7, 0x971C,\n\t0xC1F8, 0x971E, 0xC1F9, 0x97A0, 0xC1FA, 0x97D3, 0xC1FB, 0x9846,\t0xC1FC, 0x98B6, 0xC1FD, 0x9935, 0xC1FE, 0x9A01, 0xC240, 0x99FF,\n\t0xC241, 0x9BAE, 0xC242, 0x9BAB, 0xC243, 0x9BAA, 0xC244, 0x9BAD,\t0xC245, 0x9D3B, 0xC246, 0x9D3F, 0xC247, 0x9E8B, 0xC248, 0x9ECF,\n\t0xC249, 0x9EDE, 0xC24A, 0x9EDC, 0xC24B, 0x9EDD, 0xC24C, 0x9EDB,\t0xC24D, 0x9F3E, 0xC24E, 0x9F4B, 0xC24F, 0x53E2, 0xC250, 0x5695,\n\t0xC251, 0x56AE, 0xC252, 0x58D9, 0xC253, 0x58D8, 0xC254, 0x5B38,\t0xC255, 0x5F5D, 0xC256, 0x61E3, 0xC257, 0x6233, 0xC258, 0x64F4,\n\t0xC259, 0x64F2, 0xC25A, 0x64FE, 0xC25B, 0x6506, 0xC25C, 0x64FA,\t0xC25D, 0x64FB, 0xC25E, 0x64F7, 0xC25F, 0x65B7, 0xC260, 0x66DC,\n\t0xC261, 0x6726, 0xC262, 0x6AB3, 0xC263, 0x6AAC, 0xC264, 0x6AC3,\t0xC265, 0x6ABB, 0xC266, 0x6AB8, 0xC267, 0x6AC2, 0xC268, 0x6AAE,\n\t0xC269, 0x6AAF, 0xC26A, 0x6B5F, 0xC26B, 0x6B78, 0xC26C, 0x6BAF,\t0xC26D, 0x7009, 0xC26E, 0x700B, 0xC26F, 0x6FFE, 0xC270, 0x7006,\n\t0xC271, 0x6FFA, 0xC272, 0x7011, 0xC273, 0x700F, 0xC274, 0x71FB,\t0xC275, 0x71FC, 0xC276, 0x71FE, 0xC277, 0x71F8, 0xC278, 0x7377,\n\t0xC279, 0x7375, 0xC27A, 0x74A7, 0xC27B, 0x74BF, 0xC27C, 0x7515,\t0xC27D, 0x7656, 0xC27E, 0x7658, 0xC2A1, 0x7652, 0xC2A2, 0x77BD,\n\t0xC2A3, 0x77BF, 0xC2A4, 0x77BB, 0xC2A5, 0x77BC, 0xC2A6, 0x790E,\t0xC2A7, 0x79AE, 0xC2A8, 0x7A61, 0xC2A9, 0x7A62, 0xC2AA, 0x7A60,\n\t0xC2AB, 0x7AC4, 0xC2AC, 0x7AC5, 0xC2AD, 0x7C2B, 0xC2AE, 0x7C27,\t0xC2AF, 0x7C2A, 0xC2B0, 0x7C1E, 0xC2B1, 0x7C23, 0xC2B2, 0x7C21,\n\t0xC2B3, 0x7CE7, 0xC2B4, 0x7E54, 0xC2B5, 0x7E55, 0xC2B6, 0x7E5E,\t0xC2B7, 0x7E5A, 0xC2B8, 0x7E61, 0xC2B9, 0x7E52, 0xC2BA, 0x7E59,\n\t0xC2BB, 0x7F48, 0xC2BC, 0x7FF9, 0xC2BD, 0x7FFB, 0xC2BE, 0x8077,\t0xC2BF, 0x8076, 0xC2C0, 0x81CD, 0xC2C1, 0x81CF, 0xC2C2, 0x820A,\n\t0xC2C3, 0x85CF, 0xC2C4, 0x85A9, 0xC2C5, 0x85CD, 0xC2C6, 0x85D0,\t0xC2C7, 0x85C9, 0xC2C8, 0x85B0, 0xC2C9, 0x85BA, 0xC2CA, 0x85B9,\n\t0xC2CB, 0x85A6, 0xC2CC, 0x87EF, 0xC2CD, 0x87EC, 0xC2CE, 0x87F2,\t0xC2CF, 0x87E0, 0xC2D0, 0x8986, 0xC2D1, 0x89B2, 0xC2D2, 0x89F4,\n\t0xC2D3, 0x8B28, 0xC2D4, 0x8B39, 0xC2D5, 0x8B2C, 0xC2D6, 0x8B2B,\t0xC2D7, 0x8C50, 0xC2D8, 0x8D05, 0xC2D9, 0x8E59, 0xC2DA, 0x8E63,\n\t0xC2DB, 0x8E66, 0xC2DC, 0x8E64, 0xC2DD, 0x8E5F, 0xC2DE, 0x8E55,\t0xC2DF, 0x8EC0, 0xC2E0, 0x8F49, 0xC2E1, 0x8F4D, 0xC2E2, 0x9087,\n\t0xC2E3, 0x9083, 0xC2E4, 0x9088, 0xC2E5, 0x91AB, 0xC2E6, 0x91AC,\t0xC2E7, 0x91D0, 0xC2E8, 0x9394, 0xC2E9, 0x938A, 0xC2EA, 0x9396,\n\t0xC2EB, 0x93A2, 0xC2EC, 0x93B3, 0xC2ED, 0x93AE, 0xC2EE, 0x93AC,\t0xC2EF, 0x93B0, 0xC2F0, 0x9398, 0xC2F1, 0x939A, 0xC2F2, 0x9397,\n\t0xC2F3, 0x95D4, 0xC2F4, 0x95D6, 0xC2F5, 0x95D0, 0xC2F6, 0x95D5,\t0xC2F7, 0x96E2, 0xC2F8, 0x96DC, 0xC2F9, 0x96D9, 0xC2FA, 0x96DB,\n\t0xC2FB, 0x96DE, 0xC2FC, 0x9724, 0xC2FD, 0x97A3, 0xC2FE, 0x97A6,\t0xC340, 0x97AD, 0xC341, 0x97F9, 0xC342, 0x984D, 0xC343, 0x984F,\n\t0xC344, 0x984C, 0xC345, 0x984E, 0xC346, 0x9853, 0xC347, 0x98BA,\t0xC348, 0x993E, 0xC349, 0x993F, 0xC34A, 0x993D, 0xC34B, 0x992E,\n\t0xC34C, 0x99A5, 0xC34D, 0x9A0E, 0xC34E, 0x9AC1, 0xC34F, 0x9B03,\t0xC350, 0x9B06, 0xC351, 0x9B4F, 0xC352, 0x9B4E, 0xC353, 0x9B4D,\n\t0xC354, 0x9BCA, 0xC355, 0x9BC9, 0xC356, 0x9BFD, 0xC357, 0x9BC8,\t0xC358, 0x9BC0, 0xC359, 0x9D51, 0xC35A, 0x9D5D, 0xC35B, 0x9D60,\n\t0xC35C, 0x9EE0, 0xC35D, 0x9F15, 0xC35E, 0x9F2C, 0xC35F, 0x5133,\t0xC360, 0x56A5, 0xC361, 0x58DE, 0xC362, 0x58DF, 0xC363, 0x58E2,\n\t0xC364, 0x5BF5, 0xC365, 0x9F90, 0xC366, 0x5EEC, 0xC367, 0x61F2,\t0xC368, 0x61F7, 0xC369, 0x61F6, 0xC36A, 0x61F5, 0xC36B, 0x6500,\n\t0xC36C, 0x650F, 0xC36D, 0x66E0, 0xC36E, 0x66DD, 0xC36F, 0x6AE5,\t0xC370, 0x6ADD, 0xC371, 0x6ADA, 0xC372, 0x6AD3, 0xC373, 0x701B,\n\t0xC374, 0x701F, 0xC375, 0x7028, 0xC376, 0x701A, 0xC377, 0x701D,\t0xC378, 0x7015, 0xC379, 0x7018, 0xC37A, 0x7206, 0xC37B, 0x720D,\n\t0xC37C, 0x7258, 0xC37D, 0x72A2, 0xC37E, 0x7378, 0xC3A1, 0x737A,\t0xC3A2, 0x74BD, 0xC3A3, 0x74CA, 0xC3A4, 0x74E3, 0xC3A5, 0x7587,\n\t0xC3A6, 0x7586, 0xC3A7, 0x765F, 0xC3A8, 0x7661, 0xC3A9, 0x77C7,\t0xC3AA, 0x7919, 0xC3AB, 0x79B1, 0xC3AC, 0x7A6B, 0xC3AD, 0x7A69,\n\t0xC3AE, 0x7C3E, 0xC3AF, 0x7C3F, 0xC3B0, 0x7C38, 0xC3B1, 0x7C3D,\t0xC3B2, 0x7C37, 0xC3B3, 0x7C40, 0xC3B4, 0x7E6B, 0xC3B5, 0x7E6D,\n\t0xC3B6, 0x7E79, 0xC3B7, 0x7E69, 0xC3B8, 0x7E6A, 0xC3B9, 0x7F85,\t0xC3BA, 0x7E73, 0xC3BB, 0x7FB6, 0xC3BC, 0x7FB9, 0xC3BD, 0x7FB8,\n\t0xC3BE, 0x81D8, 0xC3BF, 0x85E9, 0xC3C0, 0x85DD, 0xC3C1, 0x85EA,\t0xC3C2, 0x85D5, 0xC3C3, 0x85E4, 0xC3C4, 0x85E5, 0xC3C5, 0x85F7,\n\t0xC3C6, 0x87FB, 0xC3C7, 0x8805, 0xC3C8, 0x880D, 0xC3C9, 0x87F9,\t0xC3CA, 0x87FE, 0xC3CB, 0x8960, 0xC3CC, 0x895F, 0xC3CD, 0x8956,\n\t0xC3CE, 0x895E, 0xC3CF, 0x8B41, 0xC3D0, 0x8B5C, 0xC3D1, 0x8B58,\t0xC3D2, 0x8B49, 0xC3D3, 0x8B5A, 0xC3D4, 0x8B4E, 0xC3D5, 0x8B4F,\n\t0xC3D6, 0x8B46, 0xC3D7, 0x8B59, 0xC3D8, 0x8D08, 0xC3D9, 0x8D0A,\t0xC3DA, 0x8E7C, 0xC3DB, 0x8E72, 0xC3DC, 0x8E87, 0xC3DD, 0x8E76,\n\t0xC3DE, 0x8E6C, 0xC3DF, 0x8E7A, 0xC3E0, 0x8E74, 0xC3E1, 0x8F54,\t0xC3E2, 0x8F4E, 0xC3E3, 0x8FAD, 0xC3E4, 0x908A, 0xC3E5, 0x908B,\n\t0xC3E6, 0x91B1, 0xC3E7, 0x91AE, 0xC3E8, 0x93E1, 0xC3E9, 0x93D1,\t0xC3EA, 0x93DF, 0xC3EB, 0x93C3, 0xC3EC, 0x93C8, 0xC3ED, 0x93DC,\n\t0xC3EE, 0x93DD, 0xC3EF, 0x93D6, 0xC3F0, 0x93E2, 0xC3F1, 0x93CD,\t0xC3F2, 0x93D8, 0xC3F3, 0x93E4, 0xC3F4, 0x93D7, 0xC3F5, 0x93E8,\n\t0xC3F6, 0x95DC, 0xC3F7, 0x96B4, 0xC3F8, 0x96E3, 0xC3F9, 0x972A,\t0xC3FA, 0x9727, 0xC3FB, 0x9761, 0xC3FC, 0x97DC, 0xC3FD, 0x97FB,\n\t0xC3FE, 0x985E, 0xC440, 0x9858, 0xC441, 0x985B, 0xC442, 0x98BC,\t0xC443, 0x9945, 0xC444, 0x9949, 0xC445, 0x9A16, 0xC446, 0x9A19,\n\t0xC447, 0x9B0D, 0xC448, 0x9BE8, 0xC449, 0x9BE7, 0xC44A, 0x9BD6,\t0xC44B, 0x9BDB, 0xC44C, 0x9D89, 0xC44D, 0x9D61, 0xC44E, 0x9D72,\n\t0xC44F, 0x9D6A, 0xC450, 0x9D6C, 0xC451, 0x9E92, 0xC452, 0x9E97,\t0xC453, 0x9E93, 0xC454, 0x9EB4, 0xC455, 0x52F8, 0xC456, 0x56A8,\n\t0xC457, 0x56B7, 0xC458, 0x56B6, 0xC459, 0x56B4, 0xC45A, 0x56BC,\t0xC45B, 0x58E4, 0xC45C, 0x5B40, 0xC45D, 0x5B43, 0xC45E, 0x5B7D,\n\t0xC45F, 0x5BF6, 0xC460, 0x5DC9, 0xC461, 0x61F8, 0xC462, 0x61FA,\t0xC463, 0x6518, 0xC464, 0x6514, 0xC465, 0x6519, 0xC466, 0x66E6,\n\t0xC467, 0x6727, 0xC468, 0x6AEC, 0xC469, 0x703E, 0xC46A, 0x7030,\t0xC46B, 0x7032, 0xC46C, 0x7210, 0xC46D, 0x737B, 0xC46E, 0x74CF,\n\t0xC46F, 0x7662, 0xC470, 0x7665, 0xC471, 0x7926, 0xC472, 0x792A,\t0xC473, 0x792C, 0xC474, 0x792B, 0xC475, 0x7AC7, 0xC476, 0x7AF6,\n\t0xC477, 0x7C4C, 0xC478, 0x7C43, 0xC479, 0x7C4D, 0xC47A, 0x7CEF,\t0xC47B, 0x7CF0, 0xC47C, 0x8FAE, 0xC47D, 0x7E7D, 0xC47E, 0x7E7C,\n\t0xC4A1, 0x7E82, 0xC4A2, 0x7F4C, 0xC4A3, 0x8000, 0xC4A4, 0x81DA,\t0xC4A5, 0x8266, 0xC4A6, 0x85FB, 0xC4A7, 0x85F9, 0xC4A8, 0x8611,\n\t0xC4A9, 0x85FA, 0xC4AA, 0x8606, 0xC4AB, 0x860B, 0xC4AC, 0x8607,\t0xC4AD, 0x860A, 0xC4AE, 0x8814, 0xC4AF, 0x8815, 0xC4B0, 0x8964,\n\t0xC4B1, 0x89BA, 0xC4B2, 0x89F8, 0xC4B3, 0x8B70, 0xC4B4, 0x8B6C,\t0xC4B5, 0x8B66, 0xC4B6, 0x8B6F, 0xC4B7, 0x8B5F, 0xC4B8, 0x8B6B,\n\t0xC4B9, 0x8D0F, 0xC4BA, 0x8D0D, 0xC4BB, 0x8E89, 0xC4BC, 0x8E81,\t0xC4BD, 0x8E85, 0xC4BE, 0x8E82, 0xC4BF, 0x91B4, 0xC4C0, 0x91CB,\n\t0xC4C1, 0x9418, 0xC4C2, 0x9403, 0xC4C3, 0x93FD, 0xC4C4, 0x95E1,\t0xC4C5, 0x9730, 0xC4C6, 0x98C4, 0xC4C7, 0x9952, 0xC4C8, 0x9951,\n\t0xC4C9, 0x99A8, 0xC4CA, 0x9A2B, 0xC4CB, 0x9A30, 0xC4CC, 0x9A37,\t0xC4CD, 0x9A35, 0xC4CE, 0x9C13, 0xC4CF, 0x9C0D, 0xC4D0, 0x9E79,\n\t0xC4D1, 0x9EB5, 0xC4D2, 0x9EE8, 0xC4D3, 0x9F2F, 0xC4D4, 0x9F5F,\t0xC4D5, 0x9F63, 0xC4D6, 0x9F61, 0xC4D7, 0x5137, 0xC4D8, 0x5138,\n\t0xC4D9, 0x56C1, 0xC4DA, 0x56C0, 0xC4DB, 0x56C2, 0xC4DC, 0x5914,\t0xC4DD, 0x5C6C, 0xC4DE, 0x5DCD, 0xC4DF, 0x61FC, 0xC4E0, 0x61FE,\n\t0xC4E1, 0x651D, 0xC4E2, 0x651C, 0xC4E3, 0x6595, 0xC4E4, 0x66E9,\t0xC4E5, 0x6AFB, 0xC4E6, 0x6B04, 0xC4E7, 0x6AFA, 0xC4E8, 0x6BB2,\n\t0xC4E9, 0x704C, 0xC4EA, 0x721B, 0xC4EB, 0x72A7, 0xC4EC, 0x74D6,\t0xC4ED, 0x74D4, 0xC4EE, 0x7669, 0xC4EF, 0x77D3, 0xC4F0, 0x7C50,\n\t0xC4F1, 0x7E8F, 0xC4F2, 0x7E8C, 0xC4F3, 0x7FBC, 0xC4F4, 0x8617,\t0xC4F5, 0x862D, 0xC4F6, 0x861A, 0xC4F7, 0x8823, 0xC4F8, 0x8822,\n\t0xC4F9, 0x8821, 0xC4FA, 0x881F, 0xC4FB, 0x896A, 0xC4FC, 0x896C,\t0xC4FD, 0x89BD, 0xC4FE, 0x8B74, 0xC540, 0x8B77, 0xC541, 0x8B7D,\n\t0xC542, 0x8D13, 0xC543, 0x8E8A, 0xC544, 0x8E8D, 0xC545, 0x8E8B,\t0xC546, 0x8F5F, 0xC547, 0x8FAF, 0xC548, 0x91BA, 0xC549, 0x942E,\n\t0xC54A, 0x9433, 0xC54B, 0x9435, 0xC54C, 0x943A, 0xC54D, 0x9438,\t0xC54E, 0x9432, 0xC54F, 0x942B, 0xC550, 0x95E2, 0xC551, 0x9738,\n\t0xC552, 0x9739, 0xC553, 0x9732, 0xC554, 0x97FF, 0xC555, 0x9867,\t0xC556, 0x9865, 0xC557, 0x9957, 0xC558, 0x9A45, 0xC559, 0x9A43,\n\t0xC55A, 0x9A40, 0xC55B, 0x9A3E, 0xC55C, 0x9ACF, 0xC55D, 0x9B54,\t0xC55E, 0x9B51, 0xC55F, 0x9C2D, 0xC560, 0x9C25, 0xC561, 0x9DAF,\n\t0xC562, 0x9DB4, 0xC563, 0x9DC2, 0xC564, 0x9DB8, 0xC565, 0x9E9D,\t0xC566, 0x9EEF, 0xC567, 0x9F19, 0xC568, 0x9F5C, 0xC569, 0x9F66,\n\t0xC56A, 0x9F67, 0xC56B, 0x513C, 0xC56C, 0x513B, 0xC56D, 0x56C8,\t0xC56E, 0x56CA, 0xC56F, 0x56C9, 0xC570, 0x5B7F, 0xC571, 0x5DD4,\n\t0xC572, 0x5DD2, 0xC573, 0x5F4E, 0xC574, 0x61FF, 0xC575, 0x6524,\t0xC576, 0x6B0A, 0xC577, 0x6B61, 0xC578, 0x7051, 0xC579, 0x7058,\n\t0xC57A, 0x7380, 0xC57B, 0x74E4, 0xC57C, 0x758A, 0xC57D, 0x766E,\t0xC57E, 0x766C, 0xC5A1, 0x79B3, 0xC5A2, 0x7C60, 0xC5A3, 0x7C5F,\n\t0xC5A4, 0x807E, 0xC5A5, 0x807D, 0xC5A6, 0x81DF, 0xC5A7, 0x8972,\t0xC5A8, 0x896F, 0xC5A9, 0x89FC, 0xC5AA, 0x8B80, 0xC5AB, 0x8D16,\n\t0xC5AC, 0x8D17, 0xC5AD, 0x8E91, 0xC5AE, 0x8E93, 0xC5AF, 0x8F61,\t0xC5B0, 0x9148, 0xC5B1, 0x9444, 0xC5B2, 0x9451, 0xC5B3, 0x9452,\n\t0xC5B4, 0x973D, 0xC5B5, 0x973E, 0xC5B6, 0x97C3, 0xC5B7, 0x97C1,\t0xC5B8, 0x986B, 0xC5B9, 0x9955, 0xC5BA, 0x9A55, 0xC5BB, 0x9A4D,\n\t0xC5BC, 0x9AD2, 0xC5BD, 0x9B1A, 0xC5BE, 0x9C49, 0xC5BF, 0x9C31,\t0xC5C0, 0x9C3E, 0xC5C1, 0x9C3B, 0xC5C2, 0x9DD3, 0xC5C3, 0x9DD7,\n\t0xC5C4, 0x9F34, 0xC5C5, 0x9F6C, 0xC5C6, 0x9F6A, 0xC5C7, 0x9F94,\t0xC5C8, 0x56CC, 0xC5C9, 0x5DD6, 0xC5CA, 0x6200, 0xC5CB, 0x6523,\n\t0xC5CC, 0x652B, 0xC5CD, 0x652A, 0xC5CE, 0x66EC, 0xC5CF, 0x6B10,\t0xC5D0, 0x74DA, 0xC5D1, 0x7ACA, 0xC5D2, 0x7C64, 0xC5D3, 0x7C63,\n\t0xC5D4, 0x7C65, 0xC5D5, 0x7E93, 0xC5D6, 0x7E96, 0xC5D7, 0x7E94,\t0xC5D8, 0x81E2, 0xC5D9, 0x8638, 0xC5DA, 0x863F, 0xC5DB, 0x8831,\n\t0xC5DC, 0x8B8A, 0xC5DD, 0x9090, 0xC5DE, 0x908F, 0xC5DF, 0x9463,\t0xC5E0, 0x9460, 0xC5E1, 0x9464, 0xC5E2, 0x9768, 0xC5E3, 0x986F,\n\t0xC5E4, 0x995C, 0xC5E5, 0x9A5A, 0xC5E6, 0x9A5B, 0xC5E7, 0x9A57,\t0xC5E8, 0x9AD3, 0xC5E9, 0x9AD4, 0xC5EA, 0x9AD1, 0xC5EB, 0x9C54,\n\t0xC5EC, 0x9C57, 0xC5ED, 0x9C56, 0xC5EE, 0x9DE5, 0xC5EF, 0x9E9F,\t0xC5F0, 0x9EF4, 0xC5F1, 0x56D1, 0xC5F2, 0x58E9, 0xC5F3, 0x652C,\n\t0xC5F4, 0x705E, 0xC5F5, 0x7671, 0xC5F6, 0x7672, 0xC5F7, 0x77D7,\t0xC5F8, 0x7F50, 0xC5F9, 0x7F88, 0xC5FA, 0x8836, 0xC5FB, 0x8839,\n\t0xC5FC, 0x8862, 0xC5FD, 0x8B93, 0xC5FE, 0x8B92, 0xC640, 0x8B96,\t0xC641, 0x8277, 0xC642, 0x8D1B, 0xC643, 0x91C0, 0xC644, 0x946A,\n\t0xC645, 0x9742, 0xC646, 0x9748, 0xC647, 0x9744, 0xC648, 0x97C6,\t0xC649, 0x9870, 0xC64A, 0x9A5F, 0xC64B, 0x9B22, 0xC64C, 0x9B58,\n\t0xC64D, 0x9C5F, 0xC64E, 0x9DF9, 0xC64F, 0x9DFA, 0xC650, 0x9E7C,\t0xC651, 0x9E7D, 0xC652, 0x9F07, 0xC653, 0x9F77, 0xC654, 0x9F72,\n\t0xC655, 0x5EF3, 0xC656, 0x6B16, 0xC657, 0x7063, 0xC658, 0x7C6C,\t0xC659, 0x7C6E, 0xC65A, 0x883B, 0xC65B, 0x89C0, 0xC65C, 0x8EA1,\n\t0xC65D, 0x91C1, 0xC65E, 0x9472, 0xC65F, 0x9470, 0xC660, 0x9871,\t0xC661, 0x995E, 0xC662, 0x9AD6, 0xC663, 0x9B23, 0xC664, 0x9ECC,\n\t0xC665, 0x7064, 0xC666, 0x77DA, 0xC667, 0x8B9A, 0xC668, 0x9477,\t0xC669, 0x97C9, 0xC66A, 0x9A62, 0xC66B, 0x9A65, 0xC66C, 0x7E9C,\n\t0xC66D, 0x8B9C, 0xC66E, 0x8EAA, 0xC66F, 0x91C5, 0xC670, 0x947D,\t0xC671, 0x947E, 0xC672, 0x947C, 0xC673, 0x9C77, 0xC674, 0x9C78,\n\t0xC675, 0x9EF7, 0xC676, 0x8C54, 0xC677, 0x947F, 0xC678, 0x9E1A,\t0xC679, 0x7228, 0xC67A, 0x9A6A, 0xC67B, 0x9B31, 0xC67C, 0x9E1B,\n\t0xC67D, 0x9E1E, 0xC67E, 0x7C72, 0xC940, 0x4E42, 0xC941, 0x4E5C,\t0xC942, 0x51F5, 0xC943, 0x531A, 0xC944, 0x5382, 0xC945, 0x4E07,\n\t0xC946, 0x4E0C, 0xC947, 0x4E47, 0xC948, 0x4E8D, 0xC949, 0x56D7,\t0xC94A, 0xFA0C, 0xC94B, 0x5C6E, 0xC94C, 0x5F73, 0xC94D, 0x4E0F,\n\t0xC94E, 0x5187, 0xC94F, 0x4E0E, 0xC950, 0x4E2E, 0xC951, 0x4E93,\t0xC952, 0x4EC2, 0xC953, 0x4EC9, 0xC954, 0x4EC8, 0xC955, 0x5198,\n\t0xC956, 0x52FC, 0xC957, 0x536C, 0xC958, 0x53B9, 0xC959, 0x5720,\t0xC95A, 0x5903, 0xC95B, 0x592C, 0xC95C, 0x5C10, 0xC95D, 0x5DFF,\n\t0xC95E, 0x65E1, 0xC95F, 0x6BB3, 0xC960, 0x6BCC, 0xC961, 0x6C14,\t0xC962, 0x723F, 0xC963, 0x4E31, 0xC964, 0x4E3C, 0xC965, 0x4EE8,\n\t0xC966, 0x4EDC, 0xC967, 0x4EE9, 0xC968, 0x4EE1, 0xC969, 0x4EDD,\t0xC96A, 0x4EDA, 0xC96B, 0x520C, 0xC96C, 0x531C, 0xC96D, 0x534C,\n\t0xC96E, 0x5722, 0xC96F, 0x5723, 0xC970, 0x5917, 0xC971, 0x592F,\t0xC972, 0x5B81, 0xC973, 0x5B84, 0xC974, 0x5C12, 0xC975, 0x5C3B,\n\t0xC976, 0x5C74, 0xC977, 0x5C73, 0xC978, 0x5E04, 0xC979, 0x5E80,\t0xC97A, 0x5E82, 0xC97B, 0x5FC9, 0xC97C, 0x6209, 0xC97D, 0x6250,\n\t0xC97E, 0x6C15, 0xC9A1, 0x6C36, 0xC9A2, 0x6C43, 0xC9A3, 0x6C3F,\t0xC9A4, 0x6C3B, 0xC9A5, 0x72AE, 0xC9A6, 0x72B0, 0xC9A7, 0x738A,\n\t0xC9A8, 0x79B8, 0xC9A9, 0x808A, 0xC9AA, 0x961E, 0xC9AB, 0x4F0E,\t0xC9AC, 0x4F18, 0xC9AD, 0x4F2C, 0xC9AE, 0x4EF5, 0xC9AF, 0x4F14,\n\t0xC9B0, 0x4EF1, 0xC9B1, 0x4F00, 0xC9B2, 0x4EF7, 0xC9B3, 0x4F08,\t0xC9B4, 0x4F1D, 0xC9B5, 0x4F02, 0xC9B6, 0x4F05, 0xC9B7, 0x4F22,\n\t0xC9B8, 0x4F13, 0xC9B9, 0x4F04, 0xC9BA, 0x4EF4, 0xC9BB, 0x4F12,\t0xC9BC, 0x51B1, 0xC9BD, 0x5213, 0xC9BE, 0x5209, 0xC9BF, 0x5210,\n\t0xC9C0, 0x52A6, 0xC9C1, 0x5322, 0xC9C2, 0x531F, 0xC9C3, 0x534D,\t0xC9C4, 0x538A, 0xC9C5, 0x5407, 0xC9C6, 0x56E1, 0xC9C7, 0x56DF,\n\t0xC9C8, 0x572E, 0xC9C9, 0x572A, 0xC9CA, 0x5734, 0xC9CB, 0x593C,\t0xC9CC, 0x5980, 0xC9CD, 0x597C, 0xC9CE, 0x5985, 0xC9CF, 0x597B,\n\t0xC9D0, 0x597E, 0xC9D1, 0x5977, 0xC9D2, 0x597F, 0xC9D3, 0x5B56,\t0xC9D4, 0x5C15, 0xC9D5, 0x5C25, 0xC9D6, 0x5C7C, 0xC9D7, 0x5C7A,\n\t0xC9D8, 0x5C7B, 0xC9D9, 0x5C7E, 0xC9DA, 0x5DDF, 0xC9DB, 0x5E75,\t0xC9DC, 0x5E84, 0xC9DD, 0x5F02, 0xC9DE, 0x5F1A, 0xC9DF, 0x5F74,\n\t0xC9E0, 0x5FD5, 0xC9E1, 0x5FD4, 0xC9E2, 0x5FCF, 0xC9E3, 0x625C,\t0xC9E4, 0x625E, 0xC9E5, 0x6264, 0xC9E6, 0x6261, 0xC9E7, 0x6266,\n\t0xC9E8, 0x6262, 0xC9E9, 0x6259, 0xC9EA, 0x6260, 0xC9EB, 0x625A,\t0xC9EC, 0x6265, 0xC9ED, 0x65EF, 0xC9EE, 0x65EE, 0xC9EF, 0x673E,\n\t0xC9F0, 0x6739, 0xC9F1, 0x6738, 0xC9F2, 0x673B, 0xC9F3, 0x673A,\t0xC9F4, 0x673F, 0xC9F5, 0x673C, 0xC9F6, 0x6733, 0xC9F7, 0x6C18,\n\t0xC9F8, 0x6C46, 0xC9F9, 0x6C52, 0xC9FA, 0x6C5C, 0xC9FB, 0x6C4F,\t0xC9FC, 0x6C4A, 0xC9FD, 0x6C54, 0xC9FE, 0x6C4B, 0xCA40, 0x6C4C,\n\t0xCA41, 0x7071, 0xCA42, 0x725E, 0xCA43, 0x72B4, 0xCA44, 0x72B5,\t0xCA45, 0x738E, 0xCA46, 0x752A, 0xCA47, 0x767F, 0xCA48, 0x7A75,\n\t0xCA49, 0x7F51, 0xCA4A, 0x8278, 0xCA4B, 0x827C, 0xCA4C, 0x8280,\t0xCA4D, 0x827D, 0xCA4E, 0x827F, 0xCA4F, 0x864D, 0xCA50, 0x897E,\n\t0xCA51, 0x9099, 0xCA52, 0x9097, 0xCA53, 0x9098, 0xCA54, 0x909B,\t0xCA55, 0x9094, 0xCA56, 0x9622, 0xCA57, 0x9624, 0xCA58, 0x9620,\n\t0xCA59, 0x9623, 0xCA5A, 0x4F56, 0xCA5B, 0x4F3B, 0xCA5C, 0x4F62,\t0xCA5D, 0x4F49, 0xCA5E, 0x4F53, 0xCA5F, 0x4F64, 0xCA60, 0x4F3E,\n\t0xCA61, 0x4F67, 0xCA62, 0x4F52, 0xCA63, 0x4F5F, 0xCA64, 0x4F41,\t0xCA65, 0x4F58, 0xCA66, 0x4F2D, 0xCA67, 0x4F33, 0xCA68, 0x4F3F,\n\t0xCA69, 0x4F61, 0xCA6A, 0x518F, 0xCA6B, 0x51B9, 0xCA6C, 0x521C,\t0xCA6D, 0x521E, 0xCA6E, 0x5221, 0xCA6F, 0x52AD, 0xCA70, 0x52AE,\n\t0xCA71, 0x5309, 0xCA72, 0x5363, 0xCA73, 0x5372, 0xCA74, 0x538E,\t0xCA75, 0x538F, 0xCA76, 0x5430, 0xCA77, 0x5437, 0xCA78, 0x542A,\n\t0xCA79, 0x5454, 0xCA7A, 0x5445, 0xCA7B, 0x5419, 0xCA7C, 0x541C,\t0xCA7D, 0x5425, 0xCA7E, 0x5418, 0xCAA1, 0x543D, 0xCAA2, 0x544F,\n\t0xCAA3, 0x5441, 0xCAA4, 0x5428, 0xCAA5, 0x5424, 0xCAA6, 0x5447,\t0xCAA7, 0x56EE, 0xCAA8, 0x56E7, 0xCAA9, 0x56E5, 0xCAAA, 0x5741,\n\t0xCAAB, 0x5745, 0xCAAC, 0x574C, 0xCAAD, 0x5749, 0xCAAE, 0x574B,\t0xCAAF, 0x5752, 0xCAB0, 0x5906, 0xCAB1, 0x5940, 0xCAB2, 0x59A6,\n\t0xCAB3, 0x5998, 0xCAB4, 0x59A0, 0xCAB5, 0x5997, 0xCAB6, 0x598E,\t0xCAB7, 0x59A2, 0xCAB8, 0x5990, 0xCAB9, 0x598F, 0xCABA, 0x59A7,\n\t0xCABB, 0x59A1, 0xCABC, 0x5B8E, 0xCABD, 0x5B92, 0xCABE, 0x5C28,\t0xCABF, 0x5C2A, 0xCAC0, 0x5C8D, 0xCAC1, 0x5C8F, 0xCAC2, 0x5C88,\n\t0xCAC3, 0x5C8B, 0xCAC4, 0x5C89, 0xCAC5, 0x5C92, 0xCAC6, 0x5C8A,\t0xCAC7, 0x5C86, 0xCAC8, 0x5C93, 0xCAC9, 0x5C95, 0xCACA, 0x5DE0,\n\t0xCACB, 0x5E0A, 0xCACC, 0x5E0E, 0xCACD, 0x5E8B, 0xCACE, 0x5E89,\t0xCACF, 0x5E8C, 0xCAD0, 0x5E88, 0xCAD1, 0x5E8D, 0xCAD2, 0x5F05,\n\t0xCAD3, 0x5F1D, 0xCAD4, 0x5F78, 0xCAD5, 0x5F76, 0xCAD6, 0x5FD2,\t0xCAD7, 0x5FD1, 0xCAD8, 0x5FD0, 0xCAD9, 0x5FED, 0xCADA, 0x5FE8,\n\t0xCADB, 0x5FEE, 0xCADC, 0x5FF3, 0xCADD, 0x5FE1, 0xCADE, 0x5FE4,\t0xCADF, 0x5FE3, 0xCAE0, 0x5FFA, 0xCAE1, 0x5FEF, 0xCAE2, 0x5FF7,\n\t0xCAE3, 0x5FFB, 0xCAE4, 0x6000, 0xCAE5, 0x5FF4, 0xCAE6, 0x623A,\t0xCAE7, 0x6283, 0xCAE8, 0x628C, 0xCAE9, 0x628E, 0xCAEA, 0x628F,\n\t0xCAEB, 0x6294, 0xCAEC, 0x6287, 0xCAED, 0x6271, 0xCAEE, 0x627B,\t0xCAEF, 0x627A, 0xCAF0, 0x6270, 0xCAF1, 0x6281, 0xCAF2, 0x6288,\n\t0xCAF3, 0x6277, 0xCAF4, 0x627D, 0xCAF5, 0x6272, 0xCAF6, 0x6274,\t0xCAF7, 0x6537, 0xCAF8, 0x65F0, 0xCAF9, 0x65F4, 0xCAFA, 0x65F3,\n\t0xCAFB, 0x65F2, 0xCAFC, 0x65F5, 0xCAFD, 0x6745, 0xCAFE, 0x6747,\t0xCB40, 0x6759, 0xCB41, 0x6755, 0xCB42, 0x674C, 0xCB43, 0x6748,\n\t0xCB44, 0x675D, 0xCB45, 0x674D, 0xCB46, 0x675A, 0xCB47, 0x674B,\t0xCB48, 0x6BD0, 0xCB49, 0x6C19, 0xCB4A, 0x6C1A, 0xCB4B, 0x6C78,\n\t0xCB4C, 0x6C67, 0xCB4D, 0x6C6B, 0xCB4E, 0x6C84, 0xCB4F, 0x6C8B,\t0xCB50, 0x6C8F, 0xCB51, 0x6C71, 0xCB52, 0x6C6F, 0xCB53, 0x6C69,\n\t0xCB54, 0x6C9A, 0xCB55, 0x6C6D, 0xCB56, 0x6C87, 0xCB57, 0x6C95,\t0xCB58, 0x6C9C, 0xCB59, 0x6C66, 0xCB5A, 0x6C73, 0xCB5B, 0x6C65,\n\t0xCB5C, 0x6C7B, 0xCB5D, 0x6C8E, 0xCB5E, 0x7074, 0xCB5F, 0x707A,\t0xCB60, 0x7263, 0xCB61, 0x72BF, 0xCB62, 0x72BD, 0xCB63, 0x72C3,\n\t0xCB64, 0x72C6, 0xCB65, 0x72C1, 0xCB66, 0x72BA, 0xCB67, 0x72C5,\t0xCB68, 0x7395, 0xCB69, 0x7397, 0xCB6A, 0x7393, 0xCB6B, 0x7394,\n\t0xCB6C, 0x7392, 0xCB6D, 0x753A, 0xCB6E, 0x7539, 0xCB6F, 0x7594,\t0xCB70, 0x7595, 0xCB71, 0x7681, 0xCB72, 0x793D, 0xCB73, 0x8034,\n\t0xCB74, 0x8095, 0xCB75, 0x8099, 0xCB76, 0x8090, 0xCB77, 0x8092,\t0xCB78, 0x809C, 0xCB79, 0x8290, 0xCB7A, 0x828F, 0xCB7B, 0x8285,\n\t0xCB7C, 0x828E, 0xCB7D, 0x8291, 0xCB7E, 0x8293, 0xCBA1, 0x828A,\t0xCBA2, 0x8283, 0xCBA3, 0x8284, 0xCBA4, 0x8C78, 0xCBA5, 0x8FC9,\n\t0xCBA6, 0x8FBF, 0xCBA7, 0x909F, 0xCBA8, 0x90A1, 0xCBA9, 0x90A5,\t0xCBAA, 0x909E, 0xCBAB, 0x90A7, 0xCBAC, 0x90A0, 0xCBAD, 0x9630,\n\t0xCBAE, 0x9628, 0xCBAF, 0x962F, 0xCBB0, 0x962D, 0xCBB1, 0x4E33,\t0xCBB2, 0x4F98, 0xCBB3, 0x4F7C, 0xCBB4, 0x4F85, 0xCBB5, 0x4F7D,\n\t0xCBB6, 0x4F80, 0xCBB7, 0x4F87, 0xCBB8, 0x4F76, 0xCBB9, 0x4F74,\t0xCBBA, 0x4F89, 0xCBBB, 0x4F84, 0xCBBC, 0x4F77, 0xCBBD, 0x4F4C,\n\t0xCBBE, 0x4F97, 0xCBBF, 0x4F6A, 0xCBC0, 0x4F9A, 0xCBC1, 0x4F79,\t0xCBC2, 0x4F81, 0xCBC3, 0x4F78, 0xCBC4, 0x4F90, 0xCBC5, 0x4F9C,\n\t0xCBC6, 0x4F94, 0xCBC7, 0x4F9E, 0xCBC8, 0x4F92, 0xCBC9, 0x4F82,\t0xCBCA, 0x4F95, 0xCBCB, 0x4F6B, 0xCBCC, 0x4F6E, 0xCBCD, 0x519E,\n\t0xCBCE, 0x51BC, 0xCBCF, 0x51BE, 0xCBD0, 0x5235, 0xCBD1, 0x5232,\t0xCBD2, 0x5233, 0xCBD3, 0x5246, 0xCBD4, 0x5231, 0xCBD5, 0x52BC,\n\t0xCBD6, 0x530A, 0xCBD7, 0x530B, 0xCBD8, 0x533C, 0xCBD9, 0x5392,\t0xCBDA, 0x5394, 0xCBDB, 0x5487, 0xCBDC, 0x547F, 0xCBDD, 0x5481,\n\t0xCBDE, 0x5491, 0xCBDF, 0x5482, 0xCBE0, 0x5488, 0xCBE1, 0x546B,\t0xCBE2, 0x547A, 0xCBE3, 0x547E, 0xCBE4, 0x5465, 0xCBE5, 0x546C,\n\t0xCBE6, 0x5474, 0xCBE7, 0x5466, 0xCBE8, 0x548D, 0xCBE9, 0x546F,\t0xCBEA, 0x5461, 0xCBEB, 0x5460, 0xCBEC, 0x5498, 0xCBED, 0x5463,\n\t0xCBEE, 0x5467, 0xCBEF, 0x5464, 0xCBF0, 0x56F7, 0xCBF1, 0x56F9,\t0xCBF2, 0x576F, 0xCBF3, 0x5772, 0xCBF4, 0x576D, 0xCBF5, 0x576B,\n\t0xCBF6, 0x5771, 0xCBF7, 0x5770, 0xCBF8, 0x5776, 0xCBF9, 0x5780,\t0xCBFA, 0x5775, 0xCBFB, 0x577B, 0xCBFC, 0x5773, 0xCBFD, 0x5774,\n\t0xCBFE, 0x5762, 0xCC40, 0x5768, 0xCC41, 0x577D, 0xCC42, 0x590C,\t0xCC43, 0x5945, 0xCC44, 0x59B5, 0xCC45, 0x59BA, 0xCC46, 0x59CF,\n\t0xCC47, 0x59CE, 0xCC48, 0x59B2, 0xCC49, 0x59CC, 0xCC4A, 0x59C1,\t0xCC4B, 0x59B6, 0xCC4C, 0x59BC, 0xCC4D, 0x59C3, 0xCC4E, 0x59D6,\n\t0xCC4F, 0x59B1, 0xCC50, 0x59BD, 0xCC51, 0x59C0, 0xCC52, 0x59C8,\t0xCC53, 0x59B4, 0xCC54, 0x59C7, 0xCC55, 0x5B62, 0xCC56, 0x5B65,\n\t0xCC57, 0x5B93, 0xCC58, 0x5B95, 0xCC59, 0x5C44, 0xCC5A, 0x5C47,\t0xCC5B, 0x5CAE, 0xCC5C, 0x5CA4, 0xCC5D, 0x5CA0, 0xCC5E, 0x5CB5,\n\t0xCC5F, 0x5CAF, 0xCC60, 0x5CA8, 0xCC61, 0x5CAC, 0xCC62, 0x5C9F,\t0xCC63, 0x5CA3, 0xCC64, 0x5CAD, 0xCC65, 0x5CA2, 0xCC66, 0x5CAA,\n\t0xCC67, 0x5CA7, 0xCC68, 0x5C9D, 0xCC69, 0x5CA5, 0xCC6A, 0x5CB6,\t0xCC6B, 0x5CB0, 0xCC6C, 0x5CA6, 0xCC6D, 0x5E17, 0xCC6E, 0x5E14,\n\t0xCC6F, 0x5E19, 0xCC70, 0x5F28, 0xCC71, 0x5F22, 0xCC72, 0x5F23,\t0xCC73, 0x5F24, 0xCC74, 0x5F54, 0xCC75, 0x5F82, 0xCC76, 0x5F7E,\n\t0xCC77, 0x5F7D, 0xCC78, 0x5FDE, 0xCC79, 0x5FE5, 0xCC7A, 0x602D,\t0xCC7B, 0x6026, 0xCC7C, 0x6019, 0xCC7D, 0x6032, 0xCC7E, 0x600B,\n\t0xCCA1, 0x6034, 0xCCA2, 0x600A, 0xCCA3, 0x6017, 0xCCA4, 0x6033,\t0xCCA5, 0x601A, 0xCCA6, 0x601E, 0xCCA7, 0x602C, 0xCCA8, 0x6022,\n\t0xCCA9, 0x600D, 0xCCAA, 0x6010, 0xCCAB, 0x602E, 0xCCAC, 0x6013,\t0xCCAD, 0x6011, 0xCCAE, 0x600C, 0xCCAF, 0x6009, 0xCCB0, 0x601C,\n\t0xCCB1, 0x6214, 0xCCB2, 0x623D, 0xCCB3, 0x62AD, 0xCCB4, 0x62B4,\t0xCCB5, 0x62D1, 0xCCB6, 0x62BE, 0xCCB7, 0x62AA, 0xCCB8, 0x62B6,\n\t0xCCB9, 0x62CA, 0xCCBA, 0x62AE, 0xCCBB, 0x62B3, 0xCCBC, 0x62AF,\t0xCCBD, 0x62BB, 0xCCBE, 0x62A9, 0xCCBF, 0x62B0, 0xCCC0, 0x62B8,\n\t0xCCC1, 0x653D, 0xCCC2, 0x65A8, 0xCCC3, 0x65BB, 0xCCC4, 0x6609,\t0xCCC5, 0x65FC, 0xCCC6, 0x6604, 0xCCC7, 0x6612, 0xCCC8, 0x6608,\n\t0xCCC9, 0x65FB, 0xCCCA, 0x6603, 0xCCCB, 0x660B, 0xCCCC, 0x660D,\t0xCCCD, 0x6605, 0xCCCE, 0x65FD, 0xCCCF, 0x6611, 0xCCD0, 0x6610,\n\t0xCCD1, 0x66F6, 0xCCD2, 0x670A, 0xCCD3, 0x6785, 0xCCD4, 0x676C,\t0xCCD5, 0x678E, 0xCCD6, 0x6792, 0xCCD7, 0x6776, 0xCCD8, 0x677B,\n\t0xCCD9, 0x6798, 0xCCDA, 0x6786, 0xCCDB, 0x6784, 0xCCDC, 0x6774,\t0xCCDD, 0x678D, 0xCCDE, 0x678C, 0xCCDF, 0x677A, 0xCCE0, 0x679F,\n\t0xCCE1, 0x6791, 0xCCE2, 0x6799, 0xCCE3, 0x6783, 0xCCE4, 0x677D,\t0xCCE5, 0x6781, 0xCCE6, 0x6778, 0xCCE7, 0x6779, 0xCCE8, 0x6794,\n\t0xCCE9, 0x6B25, 0xCCEA, 0x6B80, 0xCCEB, 0x6B7E, 0xCCEC, 0x6BDE,\t0xCCED, 0x6C1D, 0xCCEE, 0x6C93, 0xCCEF, 0x6CEC, 0xCCF0, 0x6CEB,\n\t0xCCF1, 0x6CEE, 0xCCF2, 0x6CD9, 0xCCF3, 0x6CB6, 0xCCF4, 0x6CD4,\t0xCCF5, 0x6CAD, 0xCCF6, 0x6CE7, 0xCCF7, 0x6CB7, 0xCCF8, 0x6CD0,\n\t0xCCF9, 0x6CC2, 0xCCFA, 0x6CBA, 0xCCFB, 0x6CC3, 0xCCFC, 0x6CC6,\t0xCCFD, 0x6CED, 0xCCFE, 0x6CF2, 0xCD40, 0x6CD2, 0xCD41, 0x6CDD,\n\t0xCD42, 0x6CB4, 0xCD43, 0x6C8A, 0xCD44, 0x6C9D, 0xCD45, 0x6C80,\t0xCD46, 0x6CDE, 0xCD47, 0x6CC0, 0xCD48, 0x6D30, 0xCD49, 0x6CCD,\n\t0xCD4A, 0x6CC7, 0xCD4B, 0x6CB0, 0xCD4C, 0x6CF9, 0xCD4D, 0x6CCF,\t0xCD4E, 0x6CE9, 0xCD4F, 0x6CD1, 0xCD50, 0x7094, 0xCD51, 0x7098,\n\t0xCD52, 0x7085, 0xCD53, 0x7093, 0xCD54, 0x7086, 0xCD55, 0x7084,\t0xCD56, 0x7091, 0xCD57, 0x7096, 0xCD58, 0x7082, 0xCD59, 0x709A,\n\t0xCD5A, 0x7083, 0xCD5B, 0x726A, 0xCD5C, 0x72D6, 0xCD5D, 0x72CB,\t0xCD5E, 0x72D8, 0xCD5F, 0x72C9, 0xCD60, 0x72DC, 0xCD61, 0x72D2,\n\t0xCD62, 0x72D4, 0xCD63, 0x72DA, 0xCD64, 0x72CC, 0xCD65, 0x72D1,\t0xCD66, 0x73A4, 0xCD67, 0x73A1, 0xCD68, 0x73AD, 0xCD69, 0x73A6,\n\t0xCD6A, 0x73A2, 0xCD6B, 0x73A0, 0xCD6C, 0x73AC, 0xCD6D, 0x739D,\t0xCD6E, 0x74DD, 0xCD6F, 0x74E8, 0xCD70, 0x753F, 0xCD71, 0x7540,\n\t0xCD72, 0x753E, 0xCD73, 0x758C, 0xCD74, 0x7598, 0xCD75, 0x76AF,\t0xCD76, 0x76F3, 0xCD77, 0x76F1, 0xCD78, 0x76F0, 0xCD79, 0x76F5,\n\t0xCD7A, 0x77F8, 0xCD7B, 0x77FC, 0xCD7C, 0x77F9, 0xCD7D, 0x77FB,\t0xCD7E, 0x77FA, 0xCDA1, 0x77F7, 0xCDA2, 0x7942, 0xCDA3, 0x793F,\n\t0xCDA4, 0x79C5, 0xCDA5, 0x7A78, 0xCDA6, 0x7A7B, 0xCDA7, 0x7AFB,\t0xCDA8, 0x7C75, 0xCDA9, 0x7CFD, 0xCDAA, 0x8035, 0xCDAB, 0x808F,\n\t0xCDAC, 0x80AE, 0xCDAD, 0x80A3, 0xCDAE, 0x80B8, 0xCDAF, 0x80B5,\t0xCDB0, 0x80AD, 0xCDB1, 0x8220, 0xCDB2, 0x82A0, 0xCDB3, 0x82C0,\n\t0xCDB4, 0x82AB, 0xCDB5, 0x829A, 0xCDB6, 0x8298, 0xCDB7, 0x829B,\t0xCDB8, 0x82B5, 0xCDB9, 0x82A7, 0xCDBA, 0x82AE, 0xCDBB, 0x82BC,\n\t0xCDBC, 0x829E, 0xCDBD, 0x82BA, 0xCDBE, 0x82B4, 0xCDBF, 0x82A8,\t0xCDC0, 0x82A1, 0xCDC1, 0x82A9, 0xCDC2, 0x82C2, 0xCDC3, 0x82A4,\n\t0xCDC4, 0x82C3, 0xCDC5, 0x82B6, 0xCDC6, 0x82A2, 0xCDC7, 0x8670,\t0xCDC8, 0x866F, 0xCDC9, 0x866D, 0xCDCA, 0x866E, 0xCDCB, 0x8C56,\n\t0xCDCC, 0x8FD2, 0xCDCD, 0x8FCB, 0xCDCE, 0x8FD3, 0xCDCF, 0x8FCD,\t0xCDD0, 0x8FD6, 0xCDD1, 0x8FD5, 0xCDD2, 0x8FD7, 0xCDD3, 0x90B2,\n\t0xCDD4, 0x90B4, 0xCDD5, 0x90AF, 0xCDD6, 0x90B3, 0xCDD7, 0x90B0,\t0xCDD8, 0x9639, 0xCDD9, 0x963D, 0xCDDA, 0x963C, 0xCDDB, 0x963A,\n\t0xCDDC, 0x9643, 0xCDDD, 0x4FCD, 0xCDDE, 0x4FC5, 0xCDDF, 0x4FD3,\t0xCDE0, 0x4FB2, 0xCDE1, 0x4FC9, 0xCDE2, 0x4FCB, 0xCDE3, 0x4FC1,\n\t0xCDE4, 0x4FD4, 0xCDE5, 0x4FDC, 0xCDE6, 0x4FD9, 0xCDE7, 0x4FBB,\t0xCDE8, 0x4FB3, 0xCDE9, 0x4FDB, 0xCDEA, 0x4FC7, 0xCDEB, 0x4FD6,\n\t0xCDEC, 0x4FBA, 0xCDED, 0x4FC0, 0xCDEE, 0x4FB9, 0xCDEF, 0x4FEC,\t0xCDF0, 0x5244, 0xCDF1, 0x5249, 0xCDF2, 0x52C0, 0xCDF3, 0x52C2,\n\t0xCDF4, 0x533D, 0xCDF5, 0x537C, 0xCDF6, 0x5397, 0xCDF7, 0x5396,\t0xCDF8, 0x5399, 0xCDF9, 0x5398, 0xCDFA, 0x54BA, 0xCDFB, 0x54A1,\n\t0xCDFC, 0x54AD, 0xCDFD, 0x54A5, 0xCDFE, 0x54CF, 0xCE40, 0x54C3,\t0xCE41, 0x830D, 0xCE42, 0x54B7, 0xCE43, 0x54AE, 0xCE44, 0x54D6,\n\t0xCE45, 0x54B6, 0xCE46, 0x54C5, 0xCE47, 0x54C6, 0xCE48, 0x54A0,\t0xCE49, 0x5470, 0xCE4A, 0x54BC, 0xCE4B, 0x54A2, 0xCE4C, 0x54BE,\n\t0xCE4D, 0x5472, 0xCE4E, 0x54DE, 0xCE4F, 0x54B0, 0xCE50, 0x57B5,\t0xCE51, 0x579E, 0xCE52, 0x579F, 0xCE53, 0x57A4, 0xCE54, 0x578C,\n\t0xCE55, 0x5797, 0xCE56, 0x579D, 0xCE57, 0x579B, 0xCE58, 0x5794,\t0xCE59, 0x5798, 0xCE5A, 0x578F, 0xCE5B, 0x5799, 0xCE5C, 0x57A5,\n\t0xCE5D, 0x579A, 0xCE5E, 0x5795, 0xCE5F, 0x58F4, 0xCE60, 0x590D,\t0xCE61, 0x5953, 0xCE62, 0x59E1, 0xCE63, 0x59DE, 0xCE64, 0x59EE,\n\t0xCE65, 0x5A00, 0xCE66, 0x59F1, 0xCE67, 0x59DD, 0xCE68, 0x59FA,\t0xCE69, 0x59FD, 0xCE6A, 0x59FC, 0xCE6B, 0x59F6, 0xCE6C, 0x59E4,\n\t0xCE6D, 0x59F2, 0xCE6E, 0x59F7, 0xCE6F, 0x59DB, 0xCE70, 0x59E9,\t0xCE71, 0x59F3, 0xCE72, 0x59F5, 0xCE73, 0x59E0, 0xCE74, 0x59FE,\n\t0xCE75, 0x59F4, 0xCE76, 0x59ED, 0xCE77, 0x5BA8, 0xCE78, 0x5C4C,\t0xCE79, 0x5CD0, 0xCE7A, 0x5CD8, 0xCE7B, 0x5CCC, 0xCE7C, 0x5CD7,\n\t0xCE7D, 0x5CCB, 0xCE7E, 0x5CDB, 0xCEA1, 0x5CDE, 0xCEA2, 0x5CDA,\t0xCEA3, 0x5CC9, 0xCEA4, 0x5CC7, 0xCEA5, 0x5CCA, 0xCEA6, 0x5CD6,\n\t0xCEA7, 0x5CD3, 0xCEA8, 0x5CD4, 0xCEA9, 0x5CCF, 0xCEAA, 0x5CC8,\t0xCEAB, 0x5CC6, 0xCEAC, 0x5CCE, 0xCEAD, 0x5CDF, 0xCEAE, 0x5CF8,\n\t0xCEAF, 0x5DF9, 0xCEB0, 0x5E21, 0xCEB1, 0x5E22, 0xCEB2, 0x5E23,\t0xCEB3, 0x5E20, 0xCEB4, 0x5E24, 0xCEB5, 0x5EB0, 0xCEB6, 0x5EA4,\n\t0xCEB7, 0x5EA2, 0xCEB8, 0x5E9B, 0xCEB9, 0x5EA3, 0xCEBA, 0x5EA5,\t0xCEBB, 0x5F07, 0xCEBC, 0x5F2E, 0xCEBD, 0x5F56, 0xCEBE, 0x5F86,\n\t0xCEBF, 0x6037, 0xCEC0, 0x6039, 0xCEC1, 0x6054, 0xCEC2, 0x6072,\t0xCEC3, 0x605E, 0xCEC4, 0x6045, 0xCEC5, 0x6053, 0xCEC6, 0x6047,\n\t0xCEC7, 0x6049, 0xCEC8, 0x605B, 0xCEC9, 0x604C, 0xCECA, 0x6040,\t0xCECB, 0x6042, 0xCECC, 0x605F, 0xCECD, 0x6024, 0xCECE, 0x6044,\n\t0xCECF, 0x6058, 0xCED0, 0x6066, 0xCED1, 0x606E, 0xCED2, 0x6242,\t0xCED3, 0x6243, 0xCED4, 0x62CF, 0xCED5, 0x630D, 0xCED6, 0x630B,\n\t0xCED7, 0x62F5, 0xCED8, 0x630E, 0xCED9, 0x6303, 0xCEDA, 0x62EB,\t0xCEDB, 0x62F9, 0xCEDC, 0x630F, 0xCEDD, 0x630C, 0xCEDE, 0x62F8,\n\t0xCEDF, 0x62F6, 0xCEE0, 0x6300, 0xCEE1, 0x6313, 0xCEE2, 0x6314,\t0xCEE3, 0x62FA, 0xCEE4, 0x6315, 0xCEE5, 0x62FB, 0xCEE6, 0x62F0,\n\t0xCEE7, 0x6541, 0xCEE8, 0x6543, 0xCEE9, 0x65AA, 0xCEEA, 0x65BF,\t0xCEEB, 0x6636, 0xCEEC, 0x6621, 0xCEED, 0x6632, 0xCEEE, 0x6635,\n\t0xCEEF, 0x661C, 0xCEF0, 0x6626, 0xCEF1, 0x6622, 0xCEF2, 0x6633,\t0xCEF3, 0x662B, 0xCEF4, 0x663A, 0xCEF5, 0x661D, 0xCEF6, 0x6634,\n\t0xCEF7, 0x6639, 0xCEF8, 0x662E, 0xCEF9, 0x670F, 0xCEFA, 0x6710,\t0xCEFB, 0x67C1, 0xCEFC, 0x67F2, 0xCEFD, 0x67C8, 0xCEFE, 0x67BA,\n\t0xCF40, 0x67DC, 0xCF41, 0x67BB, 0xCF42, 0x67F8, 0xCF43, 0x67D8,\t0xCF44, 0x67C0, 0xCF45, 0x67B7, 0xCF46, 0x67C5, 0xCF47, 0x67EB,\n\t0xCF48, 0x67E4, 0xCF49, 0x67DF, 0xCF4A, 0x67B5, 0xCF4B, 0x67CD,\t0xCF4C, 0x67B3, 0xCF4D, 0x67F7, 0xCF4E, 0x67F6, 0xCF4F, 0x67EE,\n\t0xCF50, 0x67E3, 0xCF51, 0x67C2, 0xCF52, 0x67B9, 0xCF53, 0x67CE,\t0xCF54, 0x67E7, 0xCF55, 0x67F0, 0xCF56, 0x67B2, 0xCF57, 0x67FC,\n\t0xCF58, 0x67C6, 0xCF59, 0x67ED, 0xCF5A, 0x67CC, 0xCF5B, 0x67AE,\t0xCF5C, 0x67E6, 0xCF5D, 0x67DB, 0xCF5E, 0x67FA, 0xCF5F, 0x67C9,\n\t0xCF60, 0x67CA, 0xCF61, 0x67C3, 0xCF62, 0x67EA, 0xCF63, 0x67CB,\t0xCF64, 0x6B28, 0xCF65, 0x6B82, 0xCF66, 0x6B84, 0xCF67, 0x6BB6,\n\t0xCF68, 0x6BD6, 0xCF69, 0x6BD8, 0xCF6A, 0x6BE0, 0xCF6B, 0x6C20,\t0xCF6C, 0x6C21, 0xCF6D, 0x6D28, 0xCF6E, 0x6D34, 0xCF6F, 0x6D2D,\n\t0xCF70, 0x6D1F, 0xCF71, 0x6D3C, 0xCF72, 0x6D3F, 0xCF73, 0x6D12,\t0xCF74, 0x6D0A, 0xCF75, 0x6CDA, 0xCF76, 0x6D33, 0xCF77, 0x6D04,\n\t0xCF78, 0x6D19, 0xCF79, 0x6D3A, 0xCF7A, 0x6D1A, 0xCF7B, 0x6D11,\t0xCF7C, 0x6D00, 0xCF7D, 0x6D1D, 0xCF7E, 0x6D42, 0xCFA1, 0x6D01,\n\t0xCFA2, 0x6D18, 0xCFA3, 0x6D37, 0xCFA4, 0x6D03, 0xCFA5, 0x6D0F,\t0xCFA6, 0x6D40, 0xCFA7, 0x6D07, 0xCFA8, 0x6D20, 0xCFA9, 0x6D2C,\n\t0xCFAA, 0x6D08, 0xCFAB, 0x6D22, 0xCFAC, 0x6D09, 0xCFAD, 0x6D10,\t0xCFAE, 0x70B7, 0xCFAF, 0x709F, 0xCFB0, 0x70BE, 0xCFB1, 0x70B1,\n\t0xCFB2, 0x70B0, 0xCFB3, 0x70A1, 0xCFB4, 0x70B4, 0xCFB5, 0x70B5,\t0xCFB6, 0x70A9, 0xCFB7, 0x7241, 0xCFB8, 0x7249, 0xCFB9, 0x724A,\n\t0xCFBA, 0x726C, 0xCFBB, 0x7270, 0xCFBC, 0x7273, 0xCFBD, 0x726E,\t0xCFBE, 0x72CA, 0xCFBF, 0x72E4, 0xCFC0, 0x72E8, 0xCFC1, 0x72EB,\n\t0xCFC2, 0x72DF, 0xCFC3, 0x72EA, 0xCFC4, 0x72E6, 0xCFC5, 0x72E3,\t0xCFC6, 0x7385, 0xCFC7, 0x73CC, 0xCFC8, 0x73C2, 0xCFC9, 0x73C8,\n\t0xCFCA, 0x73C5, 0xCFCB, 0x73B9, 0xCFCC, 0x73B6, 0xCFCD, 0x73B5,\t0xCFCE, 0x73B4, 0xCFCF, 0x73EB, 0xCFD0, 0x73BF, 0xCFD1, 0x73C7,\n\t0xCFD2, 0x73BE, 0xCFD3, 0x73C3, 0xCFD4, 0x73C6, 0xCFD5, 0x73B8,\t0xCFD6, 0x73CB, 0xCFD7, 0x74EC, 0xCFD8, 0x74EE, 0xCFD9, 0x752E,\n\t0xCFDA, 0x7547, 0xCFDB, 0x7548, 0xCFDC, 0x75A7, 0xCFDD, 0x75AA,\t0xCFDE, 0x7679, 0xCFDF, 0x76C4, 0xCFE0, 0x7708, 0xCFE1, 0x7703,\n\t0xCFE2, 0x7704, 0xCFE3, 0x7705, 0xCFE4, 0x770A, 0xCFE5, 0x76F7,\t0xCFE6, 0x76FB, 0xCFE7, 0x76FA, 0xCFE8, 0x77E7, 0xCFE9, 0x77E8,\n\t0xCFEA, 0x7806, 0xCFEB, 0x7811, 0xCFEC, 0x7812, 0xCFED, 0x7805,\t0xCFEE, 0x7810, 0xCFEF, 0x780F, 0xCFF0, 0x780E, 0xCFF1, 0x7809,\n\t0xCFF2, 0x7803, 0xCFF3, 0x7813, 0xCFF4, 0x794A, 0xCFF5, 0x794C,\t0xCFF6, 0x794B, 0xCFF7, 0x7945, 0xCFF8, 0x7944, 0xCFF9, 0x79D5,\n\t0xCFFA, 0x79CD, 0xCFFB, 0x79CF, 0xCFFC, 0x79D6, 0xCFFD, 0x79CE,\t0xCFFE, 0x7A80, 0xD040, 0x7A7E, 0xD041, 0x7AD1, 0xD042, 0x7B00,\n\t0xD043, 0x7B01, 0xD044, 0x7C7A, 0xD045, 0x7C78, 0xD046, 0x7C79,\t0xD047, 0x7C7F, 0xD048, 0x7C80, 0xD049, 0x7C81, 0xD04A, 0x7D03,\n\t0xD04B, 0x7D08, 0xD04C, 0x7D01, 0xD04D, 0x7F58, 0xD04E, 0x7F91,\t0xD04F, 0x7F8D, 0xD050, 0x7FBE, 0xD051, 0x8007, 0xD052, 0x800E,\n\t0xD053, 0x800F, 0xD054, 0x8014, 0xD055, 0x8037, 0xD056, 0x80D8,\t0xD057, 0x80C7, 0xD058, 0x80E0, 0xD059, 0x80D1, 0xD05A, 0x80C8,\n\t0xD05B, 0x80C2, 0xD05C, 0x80D0, 0xD05D, 0x80C5, 0xD05E, 0x80E3,\t0xD05F, 0x80D9, 0xD060, 0x80DC, 0xD061, 0x80CA, 0xD062, 0x80D5,\n\t0xD063, 0x80C9, 0xD064, 0x80CF, 0xD065, 0x80D7, 0xD066, 0x80E6,\t0xD067, 0x80CD, 0xD068, 0x81FF, 0xD069, 0x8221, 0xD06A, 0x8294,\n\t0xD06B, 0x82D9, 0xD06C, 0x82FE, 0xD06D, 0x82F9, 0xD06E, 0x8307,\t0xD06F, 0x82E8, 0xD070, 0x8300, 0xD071, 0x82D5, 0xD072, 0x833A,\n\t0xD073, 0x82EB, 0xD074, 0x82D6, 0xD075, 0x82F4, 0xD076, 0x82EC,\t0xD077, 0x82E1, 0xD078, 0x82F2, 0xD079, 0x82F5, 0xD07A, 0x830C,\n\t0xD07B, 0x82FB, 0xD07C, 0x82F6, 0xD07D, 0x82F0, 0xD07E, 0x82EA,\t0xD0A1, 0x82E4, 0xD0A2, 0x82E0, 0xD0A3, 0x82FA, 0xD0A4, 0x82F3,\n\t0xD0A5, 0x82ED, 0xD0A6, 0x8677, 0xD0A7, 0x8674, 0xD0A8, 0x867C,\t0xD0A9, 0x8673, 0xD0AA, 0x8841, 0xD0AB, 0x884E, 0xD0AC, 0x8867,\n\t0xD0AD, 0x886A, 0xD0AE, 0x8869, 0xD0AF, 0x89D3, 0xD0B0, 0x8A04,\t0xD0B1, 0x8A07, 0xD0B2, 0x8D72, 0xD0B3, 0x8FE3, 0xD0B4, 0x8FE1,\n\t0xD0B5, 0x8FEE, 0xD0B6, 0x8FE0, 0xD0B7, 0x90F1, 0xD0B8, 0x90BD,\t0xD0B9, 0x90BF, 0xD0BA, 0x90D5, 0xD0BB, 0x90C5, 0xD0BC, 0x90BE,\n\t0xD0BD, 0x90C7, 0xD0BE, 0x90CB, 0xD0BF, 0x90C8, 0xD0C0, 0x91D4,\t0xD0C1, 0x91D3, 0xD0C2, 0x9654, 0xD0C3, 0x964F, 0xD0C4, 0x9651,\n\t0xD0C5, 0x9653, 0xD0C6, 0x964A, 0xD0C7, 0x964E, 0xD0C8, 0x501E,\t0xD0C9, 0x5005, 0xD0CA, 0x5007, 0xD0CB, 0x5013, 0xD0CC, 0x5022,\n\t0xD0CD, 0x5030, 0xD0CE, 0x501B, 0xD0CF, 0x4FF5, 0xD0D0, 0x4FF4,\t0xD0D1, 0x5033, 0xD0D2, 0x5037, 0xD0D3, 0x502C, 0xD0D4, 0x4FF6,\n\t0xD0D5, 0x4FF7, 0xD0D6, 0x5017, 0xD0D7, 0x501C, 0xD0D8, 0x5020,\t0xD0D9, 0x5027, 0xD0DA, 0x5035, 0xD0DB, 0x502F, 0xD0DC, 0x5031,\n\t0xD0DD, 0x500E, 0xD0DE, 0x515A, 0xD0DF, 0x5194, 0xD0E0, 0x5193,\t0xD0E1, 0x51CA, 0xD0E2, 0x51C4, 0xD0E3, 0x51C5, 0xD0E4, 0x51C8,\n\t0xD0E5, 0x51CE, 0xD0E6, 0x5261, 0xD0E7, 0x525A, 0xD0E8, 0x5252,\t0xD0E9, 0x525E, 0xD0EA, 0x525F, 0xD0EB, 0x5255, 0xD0EC, 0x5262,\n\t0xD0ED, 0x52CD, 0xD0EE, 0x530E, 0xD0EF, 0x539E, 0xD0F0, 0x5526,\t0xD0F1, 0x54E2, 0xD0F2, 0x5517, 0xD0F3, 0x5512, 0xD0F4, 0x54E7,\n\t0xD0F5, 0x54F3, 0xD0F6, 0x54E4, 0xD0F7, 0x551A, 0xD0F8, 0x54FF,\t0xD0F9, 0x5504, 0xD0FA, 0x5508, 0xD0FB, 0x54EB, 0xD0FC, 0x5511,\n\t0xD0FD, 0x5505, 0xD0FE, 0x54F1, 0xD140, 0x550A, 0xD141, 0x54FB,\t0xD142, 0x54F7, 0xD143, 0x54F8, 0xD144, 0x54E0, 0xD145, 0x550E,\n\t0xD146, 0x5503, 0xD147, 0x550B, 0xD148, 0x5701, 0xD149, 0x5702,\t0xD14A, 0x57CC, 0xD14B, 0x5832, 0xD14C, 0x57D5, 0xD14D, 0x57D2,\n\t0xD14E, 0x57BA, 0xD14F, 0x57C6, 0xD150, 0x57BD, 0xD151, 0x57BC,\t0xD152, 0x57B8, 0xD153, 0x57B6, 0xD154, 0x57BF, 0xD155, 0x57C7,\n\t0xD156, 0x57D0, 0xD157, 0x57B9, 0xD158, 0x57C1, 0xD159, 0x590E,\t0xD15A, 0x594A, 0xD15B, 0x5A19, 0xD15C, 0x5A16, 0xD15D, 0x5A2D,\n\t0xD15E, 0x5A2E, 0xD15F, 0x5A15, 0xD160, 0x5A0F, 0xD161, 0x5A17,\t0xD162, 0x5A0A, 0xD163, 0x5A1E, 0xD164, 0x5A33, 0xD165, 0x5B6C,\n\t0xD166, 0x5BA7, 0xD167, 0x5BAD, 0xD168, 0x5BAC, 0xD169, 0x5C03,\t0xD16A, 0x5C56, 0xD16B, 0x5C54, 0xD16C, 0x5CEC, 0xD16D, 0x5CFF,\n\t0xD16E, 0x5CEE, 0xD16F, 0x5CF1, 0xD170, 0x5CF7, 0xD171, 0x5D00,\t0xD172, 0x5CF9, 0xD173, 0x5E29, 0xD174, 0x5E28, 0xD175, 0x5EA8,\n\t0xD176, 0x5EAE, 0xD177, 0x5EAA, 0xD178, 0x5EAC, 0xD179, 0x5F33,\t0xD17A, 0x5F30, 0xD17B, 0x5F67, 0xD17C, 0x605D, 0xD17D, 0x605A,\n\t0xD17E, 0x6067, 0xD1A1, 0x6041, 0xD1A2, 0x60A2, 0xD1A3, 0x6088,\t0xD1A4, 0x6080, 0xD1A5, 0x6092, 0xD1A6, 0x6081, 0xD1A7, 0x609D,\n\t0xD1A8, 0x6083, 0xD1A9, 0x6095, 0xD1AA, 0x609B, 0xD1AB, 0x6097,\t0xD1AC, 0x6087, 0xD1AD, 0x609C, 0xD1AE, 0x608E, 0xD1AF, 0x6219,\n\t0xD1B0, 0x6246, 0xD1B1, 0x62F2, 0xD1B2, 0x6310, 0xD1B3, 0x6356,\t0xD1B4, 0x632C, 0xD1B5, 0x6344, 0xD1B6, 0x6345, 0xD1B7, 0x6336,\n\t0xD1B8, 0x6343, 0xD1B9, 0x63E4, 0xD1BA, 0x6339, 0xD1BB, 0x634B,\t0xD1BC, 0x634A, 0xD1BD, 0x633C, 0xD1BE, 0x6329, 0xD1BF, 0x6341,\n\t0xD1C0, 0x6334, 0xD1C1, 0x6358, 0xD1C2, 0x6354, 0xD1C3, 0x6359,\t0xD1C4, 0x632D, 0xD1C5, 0x6347, 0xD1C6, 0x6333, 0xD1C7, 0x635A,\n\t0xD1C8, 0x6351, 0xD1C9, 0x6338, 0xD1CA, 0x6357, 0xD1CB, 0x6340,\t0xD1CC, 0x6348, 0xD1CD, 0x654A, 0xD1CE, 0x6546, 0xD1CF, 0x65C6,\n\t0xD1D0, 0x65C3, 0xD1D1, 0x65C4, 0xD1D2, 0x65C2, 0xD1D3, 0x664A,\t0xD1D4, 0x665F, 0xD1D5, 0x6647, 0xD1D6, 0x6651, 0xD1D7, 0x6712,\n\t0xD1D8, 0x6713, 0xD1D9, 0x681F, 0xD1DA, 0x681A, 0xD1DB, 0x6849,\t0xD1DC, 0x6832, 0xD1DD, 0x6833, 0xD1DE, 0x683B, 0xD1DF, 0x684B,\n\t0xD1E0, 0x684F, 0xD1E1, 0x6816, 0xD1E2, 0x6831, 0xD1E3, 0x681C,\t0xD1E4, 0x6835, 0xD1E5, 0x682B, 0xD1E6, 0x682D, 0xD1E7, 0x682F,\n\t0xD1E8, 0x684E, 0xD1E9, 0x6844, 0xD1EA, 0x6834, 0xD1EB, 0x681D,\t0xD1EC, 0x6812, 0xD1ED, 0x6814, 0xD1EE, 0x6826, 0xD1EF, 0x6828,\n\t0xD1F0, 0x682E, 0xD1F1, 0x684D, 0xD1F2, 0x683A, 0xD1F3, 0x6825,\t0xD1F4, 0x6820, 0xD1F5, 0x6B2C, 0xD1F6, 0x6B2F, 0xD1F7, 0x6B2D,\n\t0xD1F8, 0x6B31, 0xD1F9, 0x6B34, 0xD1FA, 0x6B6D, 0xD1FB, 0x8082,\t0xD1FC, 0x6B88, 0xD1FD, 0x6BE6, 0xD1FE, 0x6BE4, 0xD240, 0x6BE8,\n\t0xD241, 0x6BE3, 0xD242, 0x6BE2, 0xD243, 0x6BE7, 0xD244, 0x6C25,\t0xD245, 0x6D7A, 0xD246, 0x6D63, 0xD247, 0x6D64, 0xD248, 0x6D76,\n\t0xD249, 0x6D0D, 0xD24A, 0x6D61, 0xD24B, 0x6D92, 0xD24C, 0x6D58,\t0xD24D, 0x6D62, 0xD24E, 0x6D6D, 0xD24F, 0x6D6F, 0xD250, 0x6D91,\n\t0xD251, 0x6D8D, 0xD252, 0x6DEF, 0xD253, 0x6D7F, 0xD254, 0x6D86,\t0xD255, 0x6D5E, 0xD256, 0x6D67, 0xD257, 0x6D60, 0xD258, 0x6D97,\n\t0xD259, 0x6D70, 0xD25A, 0x6D7C, 0xD25B, 0x6D5F, 0xD25C, 0x6D82,\t0xD25D, 0x6D98, 0xD25E, 0x6D2F, 0xD25F, 0x6D68, 0xD260, 0x6D8B,\n\t0xD261, 0x6D7E, 0xD262, 0x6D80, 0xD263, 0x6D84, 0xD264, 0x6D16,\t0xD265, 0x6D83, 0xD266, 0x6D7B, 0xD267, 0x6D7D, 0xD268, 0x6D75,\n\t0xD269, 0x6D90, 0xD26A, 0x70DC, 0xD26B, 0x70D3, 0xD26C, 0x70D1,\t0xD26D, 0x70DD, 0xD26E, 0x70CB, 0xD26F, 0x7F39, 0xD270, 0x70E2,\n\t0xD271, 0x70D7, 0xD272, 0x70D2, 0xD273, 0x70DE, 0xD274, 0x70E0,\t0xD275, 0x70D4, 0xD276, 0x70CD, 0xD277, 0x70C5, 0xD278, 0x70C6,\n\t0xD279, 0x70C7, 0xD27A, 0x70DA, 0xD27B, 0x70CE, 0xD27C, 0x70E1,\t0xD27D, 0x7242, 0xD27E, 0x7278, 0xD2A1, 0x7277, 0xD2A2, 0x7276,\n\t0xD2A3, 0x7300, 0xD2A4, 0x72FA, 0xD2A5, 0x72F4, 0xD2A6, 0x72FE,\t0xD2A7, 0x72F6, 0xD2A8, 0x72F3, 0xD2A9, 0x72FB, 0xD2AA, 0x7301,\n\t0xD2AB, 0x73D3, 0xD2AC, 0x73D9, 0xD2AD, 0x73E5, 0xD2AE, 0x73D6,\t0xD2AF, 0x73BC, 0xD2B0, 0x73E7, 0xD2B1, 0x73E3, 0xD2B2, 0x73E9,\n\t0xD2B3, 0x73DC, 0xD2B4, 0x73D2, 0xD2B5, 0x73DB, 0xD2B6, 0x73D4,\t0xD2B7, 0x73DD, 0xD2B8, 0x73DA, 0xD2B9, 0x73D7, 0xD2BA, 0x73D8,\n\t0xD2BB, 0x73E8, 0xD2BC, 0x74DE, 0xD2BD, 0x74DF, 0xD2BE, 0x74F4,\t0xD2BF, 0x74F5, 0xD2C0, 0x7521, 0xD2C1, 0x755B, 0xD2C2, 0x755F,\n\t0xD2C3, 0x75B0, 0xD2C4, 0x75C1, 0xD2C5, 0x75BB, 0xD2C6, 0x75C4,\t0xD2C7, 0x75C0, 0xD2C8, 0x75BF, 0xD2C9, 0x75B6, 0xD2CA, 0x75BA,\n\t0xD2CB, 0x768A, 0xD2CC, 0x76C9, 0xD2CD, 0x771D, 0xD2CE, 0x771B,\t0xD2CF, 0x7710, 0xD2D0, 0x7713, 0xD2D1, 0x7712, 0xD2D2, 0x7723,\n\t0xD2D3, 0x7711, 0xD2D4, 0x7715, 0xD2D5, 0x7719, 0xD2D6, 0x771A,\t0xD2D7, 0x7722, 0xD2D8, 0x7727, 0xD2D9, 0x7823, 0xD2DA, 0x782C,\n\t0xD2DB, 0x7822, 0xD2DC, 0x7835, 0xD2DD, 0x782F, 0xD2DE, 0x7828,\t0xD2DF, 0x782E, 0xD2E0, 0x782B, 0xD2E1, 0x7821, 0xD2E2, 0x7829,\n\t0xD2E3, 0x7833, 0xD2E4, 0x782A, 0xD2E5, 0x7831, 0xD2E6, 0x7954,\t0xD2E7, 0x795B, 0xD2E8, 0x794F, 0xD2E9, 0x795C, 0xD2EA, 0x7953,\n\t0xD2EB, 0x7952, 0xD2EC, 0x7951, 0xD2ED, 0x79EB, 0xD2EE, 0x79EC,\t0xD2EF, 0x79E0, 0xD2F0, 0x79EE, 0xD2F1, 0x79ED, 0xD2F2, 0x79EA,\n\t0xD2F3, 0x79DC, 0xD2F4, 0x79DE, 0xD2F5, 0x79DD, 0xD2F6, 0x7A86,\t0xD2F7, 0x7A89, 0xD2F8, 0x7A85, 0xD2F9, 0x7A8B, 0xD2FA, 0x7A8C,\n\t0xD2FB, 0x7A8A, 0xD2FC, 0x7A87, 0xD2FD, 0x7AD8, 0xD2FE, 0x7B10,\t0xD340, 0x7B04, 0xD341, 0x7B13, 0xD342, 0x7B05, 0xD343, 0x7B0F,\n\t0xD344, 0x7B08, 0xD345, 0x7B0A, 0xD346, 0x7B0E, 0xD347, 0x7B09,\t0xD348, 0x7B12, 0xD349, 0x7C84, 0xD34A, 0x7C91, 0xD34B, 0x7C8A,\n\t0xD34C, 0x7C8C, 0xD34D, 0x7C88, 0xD34E, 0x7C8D, 0xD34F, 0x7C85,\t0xD350, 0x7D1E, 0xD351, 0x7D1D, 0xD352, 0x7D11, 0xD353, 0x7D0E,\n\t0xD354, 0x7D18, 0xD355, 0x7D16, 0xD356, 0x7D13, 0xD357, 0x7D1F,\t0xD358, 0x7D12, 0xD359, 0x7D0F, 0xD35A, 0x7D0C, 0xD35B, 0x7F5C,\n\t0xD35C, 0x7F61, 0xD35D, 0x7F5E, 0xD35E, 0x7F60, 0xD35F, 0x7F5D,\t0xD360, 0x7F5B, 0xD361, 0x7F96, 0xD362, 0x7F92, 0xD363, 0x7FC3,\n\t0xD364, 0x7FC2, 0xD365, 0x7FC0, 0xD366, 0x8016, 0xD367, 0x803E,\t0xD368, 0x8039, 0xD369, 0x80FA, 0xD36A, 0x80F2, 0xD36B, 0x80F9,\n\t0xD36C, 0x80F5, 0xD36D, 0x8101, 0xD36E, 0x80FB, 0xD36F, 0x8100,\t0xD370, 0x8201, 0xD371, 0x822F, 0xD372, 0x8225, 0xD373, 0x8333,\n\t0xD374, 0x832D, 0xD375, 0x8344, 0xD376, 0x8319, 0xD377, 0x8351,\t0xD378, 0x8325, 0xD379, 0x8356, 0xD37A, 0x833F, 0xD37B, 0x8341,\n\t0xD37C, 0x8326, 0xD37D, 0x831C, 0xD37E, 0x8322, 0xD3A1, 0x8342,\t0xD3A2, 0x834E, 0xD3A3, 0x831B, 0xD3A4, 0x832A, 0xD3A5, 0x8308,\n\t0xD3A6, 0x833C, 0xD3A7, 0x834D, 0xD3A8, 0x8316, 0xD3A9, 0x8324,\t0xD3AA, 0x8320, 0xD3AB, 0x8337, 0xD3AC, 0x832F, 0xD3AD, 0x8329,\n\t0xD3AE, 0x8347, 0xD3AF, 0x8345, 0xD3B0, 0x834C, 0xD3B1, 0x8353,\t0xD3B2, 0x831E, 0xD3B3, 0x832C, 0xD3B4, 0x834B, 0xD3B5, 0x8327,\n\t0xD3B6, 0x8348, 0xD3B7, 0x8653, 0xD3B8, 0x8652, 0xD3B9, 0x86A2,\t0xD3BA, 0x86A8, 0xD3BB, 0x8696, 0xD3BC, 0x868D, 0xD3BD, 0x8691,\n\t0xD3BE, 0x869E, 0xD3BF, 0x8687, 0xD3C0, 0x8697, 0xD3C1, 0x8686,\t0xD3C2, 0x868B, 0xD3C3, 0x869A, 0xD3C4, 0x8685, 0xD3C5, 0x86A5,\n\t0xD3C6, 0x8699, 0xD3C7, 0x86A1, 0xD3C8, 0x86A7, 0xD3C9, 0x8695,\t0xD3CA, 0x8698, 0xD3CB, 0x868E, 0xD3CC, 0x869D, 0xD3CD, 0x8690,\n\t0xD3CE, 0x8694, 0xD3CF, 0x8843, 0xD3D0, 0x8844, 0xD3D1, 0x886D,\t0xD3D2, 0x8875, 0xD3D3, 0x8876, 0xD3D4, 0x8872, 0xD3D5, 0x8880,\n\t0xD3D6, 0x8871, 0xD3D7, 0x887F, 0xD3D8, 0x886F, 0xD3D9, 0x8883,\t0xD3DA, 0x887E, 0xD3DB, 0x8874, 0xD3DC, 0x887C, 0xD3DD, 0x8A12,\n\t0xD3DE, 0x8C47, 0xD3DF, 0x8C57, 0xD3E0, 0x8C7B, 0xD3E1, 0x8CA4,\t0xD3E2, 0x8CA3, 0xD3E3, 0x8D76, 0xD3E4, 0x8D78, 0xD3E5, 0x8DB5,\n\t0xD3E6, 0x8DB7, 0xD3E7, 0x8DB6, 0xD3E8, 0x8ED1, 0xD3E9, 0x8ED3,\t0xD3EA, 0x8FFE, 0xD3EB, 0x8FF5, 0xD3EC, 0x9002, 0xD3ED, 0x8FFF,\n\t0xD3EE, 0x8FFB, 0xD3EF, 0x9004, 0xD3F0, 0x8FFC, 0xD3F1, 0x8FF6,\t0xD3F2, 0x90D6, 0xD3F3, 0x90E0, 0xD3F4, 0x90D9, 0xD3F5, 0x90DA,\n\t0xD3F6, 0x90E3, 0xD3F7, 0x90DF, 0xD3F8, 0x90E5, 0xD3F9, 0x90D8,\t0xD3FA, 0x90DB, 0xD3FB, 0x90D7, 0xD3FC, 0x90DC, 0xD3FD, 0x90E4,\n\t0xD3FE, 0x9150, 0xD440, 0x914E, 0xD441, 0x914F, 0xD442, 0x91D5,\t0xD443, 0x91E2, 0xD444, 0x91DA, 0xD445, 0x965C, 0xD446, 0x965F,\n\t0xD447, 0x96BC, 0xD448, 0x98E3, 0xD449, 0x9ADF, 0xD44A, 0x9B2F,\t0xD44B, 0x4E7F, 0xD44C, 0x5070, 0xD44D, 0x506A, 0xD44E, 0x5061,\n\t0xD44F, 0x505E, 0xD450, 0x5060, 0xD451, 0x5053, 0xD452, 0x504B,\t0xD453, 0x505D, 0xD454, 0x5072, 0xD455, 0x5048, 0xD456, 0x504D,\n\t0xD457, 0x5041, 0xD458, 0x505B, 0xD459, 0x504A, 0xD45A, 0x5062,\t0xD45B, 0x5015, 0xD45C, 0x5045, 0xD45D, 0x505F, 0xD45E, 0x5069,\n\t0xD45F, 0x506B, 0xD460, 0x5063, 0xD461, 0x5064, 0xD462, 0x5046,\t0xD463, 0x5040, 0xD464, 0x506E, 0xD465, 0x5073, 0xD466, 0x5057,\n\t0xD467, 0x5051, 0xD468, 0x51D0, 0xD469, 0x526B, 0xD46A, 0x526D,\t0xD46B, 0x526C, 0xD46C, 0x526E, 0xD46D, 0x52D6, 0xD46E, 0x52D3,\n\t0xD46F, 0x532D, 0xD470, 0x539C, 0xD471, 0x5575, 0xD472, 0x5576,\t0xD473, 0x553C, 0xD474, 0x554D, 0xD475, 0x5550, 0xD476, 0x5534,\n\t0xD477, 0x552A, 0xD478, 0x5551, 0xD479, 0x5562, 0xD47A, 0x5536,\t0xD47B, 0x5535, 0xD47C, 0x5530, 0xD47D, 0x5552, 0xD47E, 0x5545,\n\t0xD4A1, 0x550C, 0xD4A2, 0x5532, 0xD4A3, 0x5565, 0xD4A4, 0x554E,\t0xD4A5, 0x5539, 0xD4A6, 0x5548, 0xD4A7, 0x552D, 0xD4A8, 0x553B,\n\t0xD4A9, 0x5540, 0xD4AA, 0x554B, 0xD4AB, 0x570A, 0xD4AC, 0x5707,\t0xD4AD, 0x57FB, 0xD4AE, 0x5814, 0xD4AF, 0x57E2, 0xD4B0, 0x57F6,\n\t0xD4B1, 0x57DC, 0xD4B2, 0x57F4, 0xD4B3, 0x5800, 0xD4B4, 0x57ED,\t0xD4B5, 0x57FD, 0xD4B6, 0x5808, 0xD4B7, 0x57F8, 0xD4B8, 0x580B,\n\t0xD4B9, 0x57F3, 0xD4BA, 0x57CF, 0xD4BB, 0x5807, 0xD4BC, 0x57EE,\t0xD4BD, 0x57E3, 0xD4BE, 0x57F2, 0xD4BF, 0x57E5, 0xD4C0, 0x57EC,\n\t0xD4C1, 0x57E1, 0xD4C2, 0x580E, 0xD4C3, 0x57FC, 0xD4C4, 0x5810,\t0xD4C5, 0x57E7, 0xD4C6, 0x5801, 0xD4C7, 0x580C, 0xD4C8, 0x57F1,\n\t0xD4C9, 0x57E9, 0xD4CA, 0x57F0, 0xD4CB, 0x580D, 0xD4CC, 0x5804,\t0xD4CD, 0x595C, 0xD4CE, 0x5A60, 0xD4CF, 0x5A58, 0xD4D0, 0x5A55,\n\t0xD4D1, 0x5A67, 0xD4D2, 0x5A5E, 0xD4D3, 0x5A38, 0xD4D4, 0x5A35,\t0xD4D5, 0x5A6D, 0xD4D6, 0x5A50, 0xD4D7, 0x5A5F, 0xD4D8, 0x5A65,\n\t0xD4D9, 0x5A6C, 0xD4DA, 0x5A53, 0xD4DB, 0x5A64, 0xD4DC, 0x5A57,\t0xD4DD, 0x5A43, 0xD4DE, 0x5A5D, 0xD4DF, 0x5A52, 0xD4E0, 0x5A44,\n\t0xD4E1, 0x5A5B, 0xD4E2, 0x5A48, 0xD4E3, 0x5A8E, 0xD4E4, 0x5A3E,\t0xD4E5, 0x5A4D, 0xD4E6, 0x5A39, 0xD4E7, 0x5A4C, 0xD4E8, 0x5A70,\n\t0xD4E9, 0x5A69, 0xD4EA, 0x5A47, 0xD4EB, 0x5A51, 0xD4EC, 0x5A56,\t0xD4ED, 0x5A42, 0xD4EE, 0x5A5C, 0xD4EF, 0x5B72, 0xD4F0, 0x5B6E,\n\t0xD4F1, 0x5BC1, 0xD4F2, 0x5BC0, 0xD4F3, 0x5C59, 0xD4F4, 0x5D1E,\t0xD4F5, 0x5D0B, 0xD4F6, 0x5D1D, 0xD4F7, 0x5D1A, 0xD4F8, 0x5D20,\n\t0xD4F9, 0x5D0C, 0xD4FA, 0x5D28, 0xD4FB, 0x5D0D, 0xD4FC, 0x5D26,\t0xD4FD, 0x5D25, 0xD4FE, 0x5D0F, 0xD540, 0x5D30, 0xD541, 0x5D12,\n\t0xD542, 0x5D23, 0xD543, 0x5D1F, 0xD544, 0x5D2E, 0xD545, 0x5E3E,\t0xD546, 0x5E34, 0xD547, 0x5EB1, 0xD548, 0x5EB4, 0xD549, 0x5EB9,\n\t0xD54A, 0x5EB2, 0xD54B, 0x5EB3, 0xD54C, 0x5F36, 0xD54D, 0x5F38,\t0xD54E, 0x5F9B, 0xD54F, 0x5F96, 0xD550, 0x5F9F, 0xD551, 0x608A,\n\t0xD552, 0x6090, 0xD553, 0x6086, 0xD554, 0x60BE, 0xD555, 0x60B0,\t0xD556, 0x60BA, 0xD557, 0x60D3, 0xD558, 0x60D4, 0xD559, 0x60CF,\n\t0xD55A, 0x60E4, 0xD55B, 0x60D9, 0xD55C, 0x60DD, 0xD55D, 0x60C8,\t0xD55E, 0x60B1, 0xD55F, 0x60DB, 0xD560, 0x60B7, 0xD561, 0x60CA,\n\t0xD562, 0x60BF, 0xD563, 0x60C3, 0xD564, 0x60CD, 0xD565, 0x60C0,\t0xD566, 0x6332, 0xD567, 0x6365, 0xD568, 0x638A, 0xD569, 0x6382,\n\t0xD56A, 0x637D, 0xD56B, 0x63BD, 0xD56C, 0x639E, 0xD56D, 0x63AD,\t0xD56E, 0x639D, 0xD56F, 0x6397, 0xD570, 0x63AB, 0xD571, 0x638E,\n\t0xD572, 0x636F, 0xD573, 0x6387, 0xD574, 0x6390, 0xD575, 0x636E,\t0xD576, 0x63AF, 0xD577, 0x6375, 0xD578, 0x639C, 0xD579, 0x636D,\n\t0xD57A, 0x63AE, 0xD57B, 0x637C, 0xD57C, 0x63A4, 0xD57D, 0x633B,\t0xD57E, 0x639F, 0xD5A1, 0x6378, 0xD5A2, 0x6385, 0xD5A3, 0x6381,\n\t0xD5A4, 0x6391, 0xD5A5, 0x638D, 0xD5A6, 0x6370, 0xD5A7, 0x6553,\t0xD5A8, 0x65CD, 0xD5A9, 0x6665, 0xD5AA, 0x6661, 0xD5AB, 0x665B,\n\t0xD5AC, 0x6659, 0xD5AD, 0x665C, 0xD5AE, 0x6662, 0xD5AF, 0x6718,\t0xD5B0, 0x6879, 0xD5B1, 0x6887, 0xD5B2, 0x6890, 0xD5B3, 0x689C,\n\t0xD5B4, 0x686D, 0xD5B5, 0x686E, 0xD5B6, 0x68AE, 0xD5B7, 0x68AB,\t0xD5B8, 0x6956, 0xD5B9, 0x686F, 0xD5BA, 0x68A3, 0xD5BB, 0x68AC,\n\t0xD5BC, 0x68A9, 0xD5BD, 0x6875, 0xD5BE, 0x6874, 0xD5BF, 0x68B2,\t0xD5C0, 0x688F, 0xD5C1, 0x6877, 0xD5C2, 0x6892, 0xD5C3, 0x687C,\n\t0xD5C4, 0x686B, 0xD5C5, 0x6872, 0xD5C6, 0x68AA, 0xD5C7, 0x6880,\t0xD5C8, 0x6871, 0xD5C9, 0x687E, 0xD5CA, 0x689B, 0xD5CB, 0x6896,\n\t0xD5CC, 0x688B, 0xD5CD, 0x68A0, 0xD5CE, 0x6889, 0xD5CF, 0x68A4,\t0xD5D0, 0x6878, 0xD5D1, 0x687B, 0xD5D2, 0x6891, 0xD5D3, 0x688C,\n\t0xD5D4, 0x688A, 0xD5D5, 0x687D, 0xD5D6, 0x6B36, 0xD5D7, 0x6B33,\t0xD5D8, 0x6B37, 0xD5D9, 0x6B38, 0xD5DA, 0x6B91, 0xD5DB, 0x6B8F,\n\t0xD5DC, 0x6B8D, 0xD5DD, 0x6B8E, 0xD5DE, 0x6B8C, 0xD5DF, 0x6C2A,\t0xD5E0, 0x6DC0, 0xD5E1, 0x6DAB, 0xD5E2, 0x6DB4, 0xD5E3, 0x6DB3,\n\t0xD5E4, 0x6E74, 0xD5E5, 0x6DAC, 0xD5E6, 0x6DE9, 0xD5E7, 0x6DE2,\t0xD5E8, 0x6DB7, 0xD5E9, 0x6DF6, 0xD5EA, 0x6DD4, 0xD5EB, 0x6E00,\n\t0xD5EC, 0x6DC8, 0xD5ED, 0x6DE0, 0xD5EE, 0x6DDF, 0xD5EF, 0x6DD6,\t0xD5F0, 0x6DBE, 0xD5F1, 0x6DE5, 0xD5F2, 0x6DDC, 0xD5F3, 0x6DDD,\n\t0xD5F4, 0x6DDB, 0xD5F5, 0x6DF4, 0xD5F6, 0x6DCA, 0xD5F7, 0x6DBD,\t0xD5F8, 0x6DED, 0xD5F9, 0x6DF0, 0xD5FA, 0x6DBA, 0xD5FB, 0x6DD5,\n\t0xD5FC, 0x6DC2, 0xD5FD, 0x6DCF, 0xD5FE, 0x6DC9, 0xD640, 0x6DD0,\t0xD641, 0x6DF2, 0xD642, 0x6DD3, 0xD643, 0x6DFD, 0xD644, 0x6DD7,\n\t0xD645, 0x6DCD, 0xD646, 0x6DE3, 0xD647, 0x6DBB, 0xD648, 0x70FA,\t0xD649, 0x710D, 0xD64A, 0x70F7, 0xD64B, 0x7117, 0xD64C, 0x70F4,\n\t0xD64D, 0x710C, 0xD64E, 0x70F0, 0xD64F, 0x7104, 0xD650, 0x70F3,\t0xD651, 0x7110, 0xD652, 0x70FC, 0xD653, 0x70FF, 0xD654, 0x7106,\n\t0xD655, 0x7113, 0xD656, 0x7100, 0xD657, 0x70F8, 0xD658, 0x70F6,\t0xD659, 0x710B, 0xD65A, 0x7102, 0xD65B, 0x710E, 0xD65C, 0x727E,\n\t0xD65D, 0x727B, 0xD65E, 0x727C, 0xD65F, 0x727F, 0xD660, 0x731D,\t0xD661, 0x7317, 0xD662, 0x7307, 0xD663, 0x7311, 0xD664, 0x7318,\n\t0xD665, 0x730A, 0xD666, 0x7308, 0xD667, 0x72FF, 0xD668, 0x730F,\t0xD669, 0x731E, 0xD66A, 0x7388, 0xD66B, 0x73F6, 0xD66C, 0x73F8,\n\t0xD66D, 0x73F5, 0xD66E, 0x7404, 0xD66F, 0x7401, 0xD670, 0x73FD,\t0xD671, 0x7407, 0xD672, 0x7400, 0xD673, 0x73FA, 0xD674, 0x73FC,\n\t0xD675, 0x73FF, 0xD676, 0x740C, 0xD677, 0x740B, 0xD678, 0x73F4,\t0xD679, 0x7408, 0xD67A, 0x7564, 0xD67B, 0x7563, 0xD67C, 0x75CE,\n\t0xD67D, 0x75D2, 0xD67E, 0x75CF, 0xD6A1, 0x75CB, 0xD6A2, 0x75CC,\t0xD6A3, 0x75D1, 0xD6A4, 0x75D0, 0xD6A5, 0x768F, 0xD6A6, 0x7689,\n\t0xD6A7, 0x76D3, 0xD6A8, 0x7739, 0xD6A9, 0x772F, 0xD6AA, 0x772D,\t0xD6AB, 0x7731, 0xD6AC, 0x7732, 0xD6AD, 0x7734, 0xD6AE, 0x7733,\n\t0xD6AF, 0x773D, 0xD6B0, 0x7725, 0xD6B1, 0x773B, 0xD6B2, 0x7735,\t0xD6B3, 0x7848, 0xD6B4, 0x7852, 0xD6B5, 0x7849, 0xD6B6, 0x784D,\n\t0xD6B7, 0x784A, 0xD6B8, 0x784C, 0xD6B9, 0x7826, 0xD6BA, 0x7845,\t0xD6BB, 0x7850, 0xD6BC, 0x7964, 0xD6BD, 0x7967, 0xD6BE, 0x7969,\n\t0xD6BF, 0x796A, 0xD6C0, 0x7963, 0xD6C1, 0x796B, 0xD6C2, 0x7961,\t0xD6C3, 0x79BB, 0xD6C4, 0x79FA, 0xD6C5, 0x79F8, 0xD6C6, 0x79F6,\n\t0xD6C7, 0x79F7, 0xD6C8, 0x7A8F, 0xD6C9, 0x7A94, 0xD6CA, 0x7A90,\t0xD6CB, 0x7B35, 0xD6CC, 0x7B47, 0xD6CD, 0x7B34, 0xD6CE, 0x7B25,\n\t0xD6CF, 0x7B30, 0xD6D0, 0x7B22, 0xD6D1, 0x7B24, 0xD6D2, 0x7B33,\t0xD6D3, 0x7B18, 0xD6D4, 0x7B2A, 0xD6D5, 0x7B1D, 0xD6D6, 0x7B31,\n\t0xD6D7, 0x7B2B, 0xD6D8, 0x7B2D, 0xD6D9, 0x7B2F, 0xD6DA, 0x7B32,\t0xD6DB, 0x7B38, 0xD6DC, 0x7B1A, 0xD6DD, 0x7B23, 0xD6DE, 0x7C94,\n\t0xD6DF, 0x7C98, 0xD6E0, 0x7C96, 0xD6E1, 0x7CA3, 0xD6E2, 0x7D35,\t0xD6E3, 0x7D3D, 0xD6E4, 0x7D38, 0xD6E5, 0x7D36, 0xD6E6, 0x7D3A,\n\t0xD6E7, 0x7D45, 0xD6E8, 0x7D2C, 0xD6E9, 0x7D29, 0xD6EA, 0x7D41,\t0xD6EB, 0x7D47, 0xD6EC, 0x7D3E, 0xD6ED, 0x7D3F, 0xD6EE, 0x7D4A,\n\t0xD6EF, 0x7D3B, 0xD6F0, 0x7D28, 0xD6F1, 0x7F63, 0xD6F2, 0x7F95,\t0xD6F3, 0x7F9C, 0xD6F4, 0x7F9D, 0xD6F5, 0x7F9B, 0xD6F6, 0x7FCA,\n\t0xD6F7, 0x7FCB, 0xD6F8, 0x7FCD, 0xD6F9, 0x7FD0, 0xD6FA, 0x7FD1,\t0xD6FB, 0x7FC7, 0xD6FC, 0x7FCF, 0xD6FD, 0x7FC9, 0xD6FE, 0x801F,\n\t0xD740, 0x801E, 0xD741, 0x801B, 0xD742, 0x8047, 0xD743, 0x8043,\t0xD744, 0x8048, 0xD745, 0x8118, 0xD746, 0x8125, 0xD747, 0x8119,\n\t0xD748, 0x811B, 0xD749, 0x812D, 0xD74A, 0x811F, 0xD74B, 0x812C,\t0xD74C, 0x811E, 0xD74D, 0x8121, 0xD74E, 0x8115, 0xD74F, 0x8127,\n\t0xD750, 0x811D, 0xD751, 0x8122, 0xD752, 0x8211, 0xD753, 0x8238,\t0xD754, 0x8233, 0xD755, 0x823A, 0xD756, 0x8234, 0xD757, 0x8232,\n\t0xD758, 0x8274, 0xD759, 0x8390, 0xD75A, 0x83A3, 0xD75B, 0x83A8,\t0xD75C, 0x838D, 0xD75D, 0x837A, 0xD75E, 0x8373, 0xD75F, 0x83A4,\n\t0xD760, 0x8374, 0xD761, 0x838F, 0xD762, 0x8381, 0xD763, 0x8395,\t0xD764, 0x8399, 0xD765, 0x8375, 0xD766, 0x8394, 0xD767, 0x83A9,\n\t0xD768, 0x837D, 0xD769, 0x8383, 0xD76A, 0x838C, 0xD76B, 0x839D,\t0xD76C, 0x839B, 0xD76D, 0x83AA, 0xD76E, 0x838B, 0xD76F, 0x837E,\n\t0xD770, 0x83A5, 0xD771, 0x83AF, 0xD772, 0x8388, 0xD773, 0x8397,\t0xD774, 0x83B0, 0xD775, 0x837F, 0xD776, 0x83A6, 0xD777, 0x8387,\n\t0xD778, 0x83AE, 0xD779, 0x8376, 0xD77A, 0x839A, 0xD77B, 0x8659,\t0xD77C, 0x8656, 0xD77D, 0x86BF, 0xD77E, 0x86B7, 0xD7A1, 0x86C2,\n\t0xD7A2, 0x86C1, 0xD7A3, 0x86C5, 0xD7A4, 0x86BA, 0xD7A5, 0x86B0,\t0xD7A6, 0x86C8, 0xD7A7, 0x86B9, 0xD7A8, 0x86B3, 0xD7A9, 0x86B8,\n\t0xD7AA, 0x86CC, 0xD7AB, 0x86B4, 0xD7AC, 0x86BB, 0xD7AD, 0x86BC,\t0xD7AE, 0x86C3, 0xD7AF, 0x86BD, 0xD7B0, 0x86BE, 0xD7B1, 0x8852,\n\t0xD7B2, 0x8889, 0xD7B3, 0x8895, 0xD7B4, 0x88A8, 0xD7B5, 0x88A2,\t0xD7B6, 0x88AA, 0xD7B7, 0x889A, 0xD7B8, 0x8891, 0xD7B9, 0x88A1,\n\t0xD7BA, 0x889F, 0xD7BB, 0x8898, 0xD7BC, 0x88A7, 0xD7BD, 0x8899,\t0xD7BE, 0x889B, 0xD7BF, 0x8897, 0xD7C0, 0x88A4, 0xD7C1, 0x88AC,\n\t0xD7C2, 0x888C, 0xD7C3, 0x8893, 0xD7C4, 0x888E, 0xD7C5, 0x8982,\t0xD7C6, 0x89D6, 0xD7C7, 0x89D9, 0xD7C8, 0x89D5, 0xD7C9, 0x8A30,\n\t0xD7CA, 0x8A27, 0xD7CB, 0x8A2C, 0xD7CC, 0x8A1E, 0xD7CD, 0x8C39,\t0xD7CE, 0x8C3B, 0xD7CF, 0x8C5C, 0xD7D0, 0x8C5D, 0xD7D1, 0x8C7D,\n\t0xD7D2, 0x8CA5, 0xD7D3, 0x8D7D, 0xD7D4, 0x8D7B, 0xD7D5, 0x8D79,\t0xD7D6, 0x8DBC, 0xD7D7, 0x8DC2, 0xD7D8, 0x8DB9, 0xD7D9, 0x8DBF,\n\t0xD7DA, 0x8DC1, 0xD7DB, 0x8ED8, 0xD7DC, 0x8EDE, 0xD7DD, 0x8EDD,\t0xD7DE, 0x8EDC, 0xD7DF, 0x8ED7, 0xD7E0, 0x8EE0, 0xD7E1, 0x8EE1,\n\t0xD7E2, 0x9024, 0xD7E3, 0x900B, 0xD7E4, 0x9011, 0xD7E5, 0x901C,\t0xD7E6, 0x900C, 0xD7E7, 0x9021, 0xD7E8, 0x90EF, 0xD7E9, 0x90EA,\n\t0xD7EA, 0x90F0, 0xD7EB, 0x90F4, 0xD7EC, 0x90F2, 0xD7ED, 0x90F3,\t0xD7EE, 0x90D4, 0xD7EF, 0x90EB, 0xD7F0, 0x90EC, 0xD7F1, 0x90E9,\n\t0xD7F2, 0x9156, 0xD7F3, 0x9158, 0xD7F4, 0x915A, 0xD7F5, 0x9153,\t0xD7F6, 0x9155, 0xD7F7, 0x91EC, 0xD7F8, 0x91F4, 0xD7F9, 0x91F1,\n\t0xD7FA, 0x91F3, 0xD7FB, 0x91F8, 0xD7FC, 0x91E4, 0xD7FD, 0x91F9,\t0xD7FE, 0x91EA, 0xD840, 0x91EB, 0xD841, 0x91F7, 0xD842, 0x91E8,\n\t0xD843, 0x91EE, 0xD844, 0x957A, 0xD845, 0x9586, 0xD846, 0x9588,\t0xD847, 0x967C, 0xD848, 0x966D, 0xD849, 0x966B, 0xD84A, 0x9671,\n\t0xD84B, 0x966F, 0xD84C, 0x96BF, 0xD84D, 0x976A, 0xD84E, 0x9804,\t0xD84F, 0x98E5, 0xD850, 0x9997, 0xD851, 0x509B, 0xD852, 0x5095,\n\t0xD853, 0x5094, 0xD854, 0x509E, 0xD855, 0x508B, 0xD856, 0x50A3,\t0xD857, 0x5083, 0xD858, 0x508C, 0xD859, 0x508E, 0xD85A, 0x509D,\n\t0xD85B, 0x5068, 0xD85C, 0x509C, 0xD85D, 0x5092, 0xD85E, 0x5082,\t0xD85F, 0x5087, 0xD860, 0x515F, 0xD861, 0x51D4, 0xD862, 0x5312,\n\t0xD863, 0x5311, 0xD864, 0x53A4, 0xD865, 0x53A7, 0xD866, 0x5591,\t0xD867, 0x55A8, 0xD868, 0x55A5, 0xD869, 0x55AD, 0xD86A, 0x5577,\n\t0xD86B, 0x5645, 0xD86C, 0x55A2, 0xD86D, 0x5593, 0xD86E, 0x5588,\t0xD86F, 0x558F, 0xD870, 0x55B5, 0xD871, 0x5581, 0xD872, 0x55A3,\n\t0xD873, 0x5592, 0xD874, 0x55A4, 0xD875, 0x557D, 0xD876, 0x558C,\t0xD877, 0x55A6, 0xD878, 0x557F, 0xD879, 0x5595, 0xD87A, 0x55A1,\n\t0xD87B, 0x558E, 0xD87C, 0x570C, 0xD87D, 0x5829, 0xD87E, 0x5837,\t0xD8A1, 0x5819, 0xD8A2, 0x581E, 0xD8A3, 0x5827, 0xD8A4, 0x5823,\n\t0xD8A5, 0x5828, 0xD8A6, 0x57F5, 0xD8A7, 0x5848, 0xD8A8, 0x5825,\t0xD8A9, 0x581C, 0xD8AA, 0x581B, 0xD8AB, 0x5833, 0xD8AC, 0x583F,\n\t0xD8AD, 0x5836, 0xD8AE, 0x582E, 0xD8AF, 0x5839, 0xD8B0, 0x5838,\t0xD8B1, 0x582D, 0xD8B2, 0x582C, 0xD8B3, 0x583B, 0xD8B4, 0x5961,\n\t0xD8B5, 0x5AAF, 0xD8B6, 0x5A94, 0xD8B7, 0x5A9F, 0xD8B8, 0x5A7A,\t0xD8B9, 0x5AA2, 0xD8BA, 0x5A9E, 0xD8BB, 0x5A78, 0xD8BC, 0x5AA6,\n\t0xD8BD, 0x5A7C, 0xD8BE, 0x5AA5, 0xD8BF, 0x5AAC, 0xD8C0, 0x5A95,\t0xD8C1, 0x5AAE, 0xD8C2, 0x5A37, 0xD8C3, 0x5A84, 0xD8C4, 0x5A8A,\n\t0xD8C5, 0x5A97, 0xD8C6, 0x5A83, 0xD8C7, 0x5A8B, 0xD8C8, 0x5AA9,\t0xD8C9, 0x5A7B, 0xD8CA, 0x5A7D, 0xD8CB, 0x5A8C, 0xD8CC, 0x5A9C,\n\t0xD8CD, 0x5A8F, 0xD8CE, 0x5A93, 0xD8CF, 0x5A9D, 0xD8D0, 0x5BEA,\t0xD8D1, 0x5BCD, 0xD8D2, 0x5BCB, 0xD8D3, 0x5BD4, 0xD8D4, 0x5BD1,\n\t0xD8D5, 0x5BCA, 0xD8D6, 0x5BCE, 0xD8D7, 0x5C0C, 0xD8D8, 0x5C30,\t0xD8D9, 0x5D37, 0xD8DA, 0x5D43, 0xD8DB, 0x5D6B, 0xD8DC, 0x5D41,\n\t0xD8DD, 0x5D4B, 0xD8DE, 0x5D3F, 0xD8DF, 0x5D35, 0xD8E0, 0x5D51,\t0xD8E1, 0x5D4E, 0xD8E2, 0x5D55, 0xD8E3, 0x5D33, 0xD8E4, 0x5D3A,\n\t0xD8E5, 0x5D52, 0xD8E6, 0x5D3D, 0xD8E7, 0x5D31, 0xD8E8, 0x5D59,\t0xD8E9, 0x5D42, 0xD8EA, 0x5D39, 0xD8EB, 0x5D49, 0xD8EC, 0x5D38,\n\t0xD8ED, 0x5D3C, 0xD8EE, 0x5D32, 0xD8EF, 0x5D36, 0xD8F0, 0x5D40,\t0xD8F1, 0x5D45, 0xD8F2, 0x5E44, 0xD8F3, 0x5E41, 0xD8F4, 0x5F58,\n\t0xD8F5, 0x5FA6, 0xD8F6, 0x5FA5, 0xD8F7, 0x5FAB, 0xD8F8, 0x60C9,\t0xD8F9, 0x60B9, 0xD8FA, 0x60CC, 0xD8FB, 0x60E2, 0xD8FC, 0x60CE,\n\t0xD8FD, 0x60C4, 0xD8FE, 0x6114, 0xD940, 0x60F2, 0xD941, 0x610A,\t0xD942, 0x6116, 0xD943, 0x6105, 0xD944, 0x60F5, 0xD945, 0x6113,\n\t0xD946, 0x60F8, 0xD947, 0x60FC, 0xD948, 0x60FE, 0xD949, 0x60C1,\t0xD94A, 0x6103, 0xD94B, 0x6118, 0xD94C, 0x611D, 0xD94D, 0x6110,\n\t0xD94E, 0x60FF, 0xD94F, 0x6104, 0xD950, 0x610B, 0xD951, 0x624A,\t0xD952, 0x6394, 0xD953, 0x63B1, 0xD954, 0x63B0, 0xD955, 0x63CE,\n\t0xD956, 0x63E5, 0xD957, 0x63E8, 0xD958, 0x63EF, 0xD959, 0x63C3,\t0xD95A, 0x649D, 0xD95B, 0x63F3, 0xD95C, 0x63CA, 0xD95D, 0x63E0,\n\t0xD95E, 0x63F6, 0xD95F, 0x63D5, 0xD960, 0x63F2, 0xD961, 0x63F5,\t0xD962, 0x6461, 0xD963, 0x63DF, 0xD964, 0x63BE, 0xD965, 0x63DD,\n\t0xD966, 0x63DC, 0xD967, 0x63C4, 0xD968, 0x63D8, 0xD969, 0x63D3,\t0xD96A, 0x63C2, 0xD96B, 0x63C7, 0xD96C, 0x63CC, 0xD96D, 0x63CB,\n\t0xD96E, 0x63C8, 0xD96F, 0x63F0, 0xD970, 0x63D7, 0xD971, 0x63D9,\t0xD972, 0x6532, 0xD973, 0x6567, 0xD974, 0x656A, 0xD975, 0x6564,\n\t0xD976, 0x655C, 0xD977, 0x6568, 0xD978, 0x6565, 0xD979, 0x658C,\t0xD97A, 0x659D, 0xD97B, 0x659E, 0xD97C, 0x65AE, 0xD97D, 0x65D0,\n\t0xD97E, 0x65D2, 0xD9A1, 0x667C, 0xD9A2, 0x666C, 0xD9A3, 0x667B,\t0xD9A4, 0x6680, 0xD9A5, 0x6671, 0xD9A6, 0x6679, 0xD9A7, 0x666A,\n\t0xD9A8, 0x6672, 0xD9A9, 0x6701, 0xD9AA, 0x690C, 0xD9AB, 0x68D3,\t0xD9AC, 0x6904, 0xD9AD, 0x68DC, 0xD9AE, 0x692A, 0xD9AF, 0x68EC,\n\t0xD9B0, 0x68EA, 0xD9B1, 0x68F1, 0xD9B2, 0x690F, 0xD9B3, 0x68D6,\t0xD9B4, 0x68F7, 0xD9B5, 0x68EB, 0xD9B6, 0x68E4, 0xD9B7, 0x68F6,\n\t0xD9B8, 0x6913, 0xD9B9, 0x6910, 0xD9BA, 0x68F3, 0xD9BB, 0x68E1,\t0xD9BC, 0x6907, 0xD9BD, 0x68CC, 0xD9BE, 0x6908, 0xD9BF, 0x6970,\n\t0xD9C0, 0x68B4, 0xD9C1, 0x6911, 0xD9C2, 0x68EF, 0xD9C3, 0x68C6,\t0xD9C4, 0x6914, 0xD9C5, 0x68F8, 0xD9C6, 0x68D0, 0xD9C7, 0x68FD,\n\t0xD9C8, 0x68FC, 0xD9C9, 0x68E8, 0xD9CA, 0x690B, 0xD9CB, 0x690A,\t0xD9CC, 0x6917, 0xD9CD, 0x68CE, 0xD9CE, 0x68C8, 0xD9CF, 0x68DD,\n\t0xD9D0, 0x68DE, 0xD9D1, 0x68E6, 0xD9D2, 0x68F4, 0xD9D3, 0x68D1,\t0xD9D4, 0x6906, 0xD9D5, 0x68D4, 0xD9D6, 0x68E9, 0xD9D7, 0x6915,\n\t0xD9D8, 0x6925, 0xD9D9, 0x68C7, 0xD9DA, 0x6B39, 0xD9DB, 0x6B3B,\t0xD9DC, 0x6B3F, 0xD9DD, 0x6B3C, 0xD9DE, 0x6B94, 0xD9DF, 0x6B97,\n\t0xD9E0, 0x6B99, 0xD9E1, 0x6B95, 0xD9E2, 0x6BBD, 0xD9E3, 0x6BF0,\t0xD9E4, 0x6BF2, 0xD9E5, 0x6BF3, 0xD9E6, 0x6C30, 0xD9E7, 0x6DFC,\n\t0xD9E8, 0x6E46, 0xD9E9, 0x6E47, 0xD9EA, 0x6E1F, 0xD9EB, 0x6E49,\t0xD9EC, 0x6E88, 0xD9ED, 0x6E3C, 0xD9EE, 0x6E3D, 0xD9EF, 0x6E45,\n\t0xD9F0, 0x6E62, 0xD9F1, 0x6E2B, 0xD9F2, 0x6E3F, 0xD9F3, 0x6E41,\t0xD9F4, 0x6E5D, 0xD9F5, 0x6E73, 0xD9F6, 0x6E1C, 0xD9F7, 0x6E33,\n\t0xD9F8, 0x6E4B, 0xD9F9, 0x6E40, 0xD9FA, 0x6E51, 0xD9FB, 0x6E3B,\t0xD9FC, 0x6E03, 0xD9FD, 0x6E2E, 0xD9FE, 0x6E5E, 0xDA40, 0x6E68,\n\t0xDA41, 0x6E5C, 0xDA42, 0x6E61, 0xDA43, 0x6E31, 0xDA44, 0x6E28,\t0xDA45, 0x6E60, 0xDA46, 0x6E71, 0xDA47, 0x6E6B, 0xDA48, 0x6E39,\n\t0xDA49, 0x6E22, 0xDA4A, 0x6E30, 0xDA4B, 0x6E53, 0xDA4C, 0x6E65,\t0xDA4D, 0x6E27, 0xDA4E, 0x6E78, 0xDA4F, 0x6E64, 0xDA50, 0x6E77,\n\t0xDA51, 0x6E55, 0xDA52, 0x6E79, 0xDA53, 0x6E52, 0xDA54, 0x6E66,\t0xDA55, 0x6E35, 0xDA56, 0x6E36, 0xDA57, 0x6E5A, 0xDA58, 0x7120,\n\t0xDA59, 0x711E, 0xDA5A, 0x712F, 0xDA5B, 0x70FB, 0xDA5C, 0x712E,\t0xDA5D, 0x7131, 0xDA5E, 0x7123, 0xDA5F, 0x7125, 0xDA60, 0x7122,\n\t0xDA61, 0x7132, 0xDA62, 0x711F, 0xDA63, 0x7128, 0xDA64, 0x713A,\t0xDA65, 0x711B, 0xDA66, 0x724B, 0xDA67, 0x725A, 0xDA68, 0x7288,\n\t0xDA69, 0x7289, 0xDA6A, 0x7286, 0xDA6B, 0x7285, 0xDA6C, 0x728B,\t0xDA6D, 0x7312, 0xDA6E, 0x730B, 0xDA6F, 0x7330, 0xDA70, 0x7322,\n\t0xDA71, 0x7331, 0xDA72, 0x7333, 0xDA73, 0x7327, 0xDA74, 0x7332,\t0xDA75, 0x732D, 0xDA76, 0x7326, 0xDA77, 0x7323, 0xDA78, 0x7335,\n\t0xDA79, 0x730C, 0xDA7A, 0x742E, 0xDA7B, 0x742C, 0xDA7C, 0x7430,\t0xDA7D, 0x742B, 0xDA7E, 0x7416, 0xDAA1, 0x741A, 0xDAA2, 0x7421,\n\t0xDAA3, 0x742D, 0xDAA4, 0x7431, 0xDAA5, 0x7424, 0xDAA6, 0x7423,\t0xDAA7, 0x741D, 0xDAA8, 0x7429, 0xDAA9, 0x7420, 0xDAAA, 0x7432,\n\t0xDAAB, 0x74FB, 0xDAAC, 0x752F, 0xDAAD, 0x756F, 0xDAAE, 0x756C,\t0xDAAF, 0x75E7, 0xDAB0, 0x75DA, 0xDAB1, 0x75E1, 0xDAB2, 0x75E6,\n\t0xDAB3, 0x75DD, 0xDAB4, 0x75DF, 0xDAB5, 0x75E4, 0xDAB6, 0x75D7,\t0xDAB7, 0x7695, 0xDAB8, 0x7692, 0xDAB9, 0x76DA, 0xDABA, 0x7746,\n\t0xDABB, 0x7747, 0xDABC, 0x7744, 0xDABD, 0x774D, 0xDABE, 0x7745,\t0xDABF, 0x774A, 0xDAC0, 0x774E, 0xDAC1, 0x774B, 0xDAC2, 0x774C,\n\t0xDAC3, 0x77DE, 0xDAC4, 0x77EC, 0xDAC5, 0x7860, 0xDAC6, 0x7864,\t0xDAC7, 0x7865, 0xDAC8, 0x785C, 0xDAC9, 0x786D, 0xDACA, 0x7871,\n\t0xDACB, 0x786A, 0xDACC, 0x786E, 0xDACD, 0x7870, 0xDACE, 0x7869,\t0xDACF, 0x7868, 0xDAD0, 0x785E, 0xDAD1, 0x7862, 0xDAD2, 0x7974,\n\t0xDAD3, 0x7973, 0xDAD4, 0x7972, 0xDAD5, 0x7970, 0xDAD6, 0x7A02,\t0xDAD7, 0x7A0A, 0xDAD8, 0x7A03, 0xDAD9, 0x7A0C, 0xDADA, 0x7A04,\n\t0xDADB, 0x7A99, 0xDADC, 0x7AE6, 0xDADD, 0x7AE4, 0xDADE, 0x7B4A,\t0xDADF, 0x7B3B, 0xDAE0, 0x7B44, 0xDAE1, 0x7B48, 0xDAE2, 0x7B4C,\n\t0xDAE3, 0x7B4E, 0xDAE4, 0x7B40, 0xDAE5, 0x7B58, 0xDAE6, 0x7B45,\t0xDAE7, 0x7CA2, 0xDAE8, 0x7C9E, 0xDAE9, 0x7CA8, 0xDAEA, 0x7CA1,\n\t0xDAEB, 0x7D58, 0xDAEC, 0x7D6F, 0xDAED, 0x7D63, 0xDAEE, 0x7D53,\t0xDAEF, 0x7D56, 0xDAF0, 0x7D67, 0xDAF1, 0x7D6A, 0xDAF2, 0x7D4F,\n\t0xDAF3, 0x7D6D, 0xDAF4, 0x7D5C, 0xDAF5, 0x7D6B, 0xDAF6, 0x7D52,\t0xDAF7, 0x7D54, 0xDAF8, 0x7D69, 0xDAF9, 0x7D51, 0xDAFA, 0x7D5F,\n\t0xDAFB, 0x7D4E, 0xDAFC, 0x7F3E, 0xDAFD, 0x7F3F, 0xDAFE, 0x7F65,\t0xDB40, 0x7F66, 0xDB41, 0x7FA2, 0xDB42, 0x7FA0, 0xDB43, 0x7FA1,\n\t0xDB44, 0x7FD7, 0xDB45, 0x8051, 0xDB46, 0x804F, 0xDB47, 0x8050,\t0xDB48, 0x80FE, 0xDB49, 0x80D4, 0xDB4A, 0x8143, 0xDB4B, 0x814A,\n\t0xDB4C, 0x8152, 0xDB4D, 0x814F, 0xDB4E, 0x8147, 0xDB4F, 0x813D,\t0xDB50, 0x814D, 0xDB51, 0x813A, 0xDB52, 0x81E6, 0xDB53, 0x81EE,\n\t0xDB54, 0x81F7, 0xDB55, 0x81F8, 0xDB56, 0x81F9, 0xDB57, 0x8204,\t0xDB58, 0x823C, 0xDB59, 0x823D, 0xDB5A, 0x823F, 0xDB5B, 0x8275,\n\t0xDB5C, 0x833B, 0xDB5D, 0x83CF, 0xDB5E, 0x83F9, 0xDB5F, 0x8423,\t0xDB60, 0x83C0, 0xDB61, 0x83E8, 0xDB62, 0x8412, 0xDB63, 0x83E7,\n\t0xDB64, 0x83E4, 0xDB65, 0x83FC, 0xDB66, 0x83F6, 0xDB67, 0x8410,\t0xDB68, 0x83C6, 0xDB69, 0x83C8, 0xDB6A, 0x83EB, 0xDB6B, 0x83E3,\n\t0xDB6C, 0x83BF, 0xDB6D, 0x8401, 0xDB6E, 0x83DD, 0xDB6F, 0x83E5,\t0xDB70, 0x83D8, 0xDB71, 0x83FF, 0xDB72, 0x83E1, 0xDB73, 0x83CB,\n\t0xDB74, 0x83CE, 0xDB75, 0x83D6, 0xDB76, 0x83F5, 0xDB77, 0x83C9,\t0xDB78, 0x8409, 0xDB79, 0x840F, 0xDB7A, 0x83DE, 0xDB7B, 0x8411,\n\t0xDB7C, 0x8406, 0xDB7D, 0x83C2, 0xDB7E, 0x83F3, 0xDBA1, 0x83D5,\t0xDBA2, 0x83FA, 0xDBA3, 0x83C7, 0xDBA4, 0x83D1, 0xDBA5, 0x83EA,\n\t0xDBA6, 0x8413, 0xDBA7, 0x83C3, 0xDBA8, 0x83EC, 0xDBA9, 0x83EE,\t0xDBAA, 0x83C4, 0xDBAB, 0x83FB, 0xDBAC, 0x83D7, 0xDBAD, 0x83E2,\n\t0xDBAE, 0x841B, 0xDBAF, 0x83DB, 0xDBB0, 0x83FE, 0xDBB1, 0x86D8,\t0xDBB2, 0x86E2, 0xDBB3, 0x86E6, 0xDBB4, 0x86D3, 0xDBB5, 0x86E3,\n\t0xDBB6, 0x86DA, 0xDBB7, 0x86EA, 0xDBB8, 0x86DD, 0xDBB9, 0x86EB,\t0xDBBA, 0x86DC, 0xDBBB, 0x86EC, 0xDBBC, 0x86E9, 0xDBBD, 0x86D7,\n\t0xDBBE, 0x86E8, 0xDBBF, 0x86D1, 0xDBC0, 0x8848, 0xDBC1, 0x8856,\t0xDBC2, 0x8855, 0xDBC3, 0x88BA, 0xDBC4, 0x88D7, 0xDBC5, 0x88B9,\n\t0xDBC6, 0x88B8, 0xDBC7, 0x88C0, 0xDBC8, 0x88BE, 0xDBC9, 0x88B6,\t0xDBCA, 0x88BC, 0xDBCB, 0x88B7, 0xDBCC, 0x88BD, 0xDBCD, 0x88B2,\n\t0xDBCE, 0x8901, 0xDBCF, 0x88C9, 0xDBD0, 0x8995, 0xDBD1, 0x8998,\t0xDBD2, 0x8997, 0xDBD3, 0x89DD, 0xDBD4, 0x89DA, 0xDBD5, 0x89DB,\n\t0xDBD6, 0x8A4E, 0xDBD7, 0x8A4D, 0xDBD8, 0x8A39, 0xDBD9, 0x8A59,\t0xDBDA, 0x8A40, 0xDBDB, 0x8A57, 0xDBDC, 0x8A58, 0xDBDD, 0x8A44,\n\t0xDBDE, 0x8A45, 0xDBDF, 0x8A52, 0xDBE0, 0x8A48, 0xDBE1, 0x8A51,\t0xDBE2, 0x8A4A, 0xDBE3, 0x8A4C, 0xDBE4, 0x8A4F, 0xDBE5, 0x8C5F,\n\t0xDBE6, 0x8C81, 0xDBE7, 0x8C80, 0xDBE8, 0x8CBA, 0xDBE9, 0x8CBE,\t0xDBEA, 0x8CB0, 0xDBEB, 0x8CB9, 0xDBEC, 0x8CB5, 0xDBED, 0x8D84,\n\t0xDBEE, 0x8D80, 0xDBEF, 0x8D89, 0xDBF0, 0x8DD8, 0xDBF1, 0x8DD3,\t0xDBF2, 0x8DCD, 0xDBF3, 0x8DC7, 0xDBF4, 0x8DD6, 0xDBF5, 0x8DDC,\n\t0xDBF6, 0x8DCF, 0xDBF7, 0x8DD5, 0xDBF8, 0x8DD9, 0xDBF9, 0x8DC8,\t0xDBFA, 0x8DD7, 0xDBFB, 0x8DC5, 0xDBFC, 0x8EEF, 0xDBFD, 0x8EF7,\n\t0xDBFE, 0x8EFA, 0xDC40, 0x8EF9, 0xDC41, 0x8EE6, 0xDC42, 0x8EEE,\t0xDC43, 0x8EE5, 0xDC44, 0x8EF5, 0xDC45, 0x8EE7, 0xDC46, 0x8EE8,\n\t0xDC47, 0x8EF6, 0xDC48, 0x8EEB, 0xDC49, 0x8EF1, 0xDC4A, 0x8EEC,\t0xDC4B, 0x8EF4, 0xDC4C, 0x8EE9, 0xDC4D, 0x902D, 0xDC4E, 0x9034,\n\t0xDC4F, 0x902F, 0xDC50, 0x9106, 0xDC51, 0x912C, 0xDC52, 0x9104,\t0xDC53, 0x90FF, 0xDC54, 0x90FC, 0xDC55, 0x9108, 0xDC56, 0x90F9,\n\t0xDC57, 0x90FB, 0xDC58, 0x9101, 0xDC59, 0x9100, 0xDC5A, 0x9107,\t0xDC5B, 0x9105, 0xDC5C, 0x9103, 0xDC5D, 0x9161, 0xDC5E, 0x9164,\n\t0xDC5F, 0x915F, 0xDC60, 0x9162, 0xDC61, 0x9160, 0xDC62, 0x9201,\t0xDC63, 0x920A, 0xDC64, 0x9225, 0xDC65, 0x9203, 0xDC66, 0x921A,\n\t0xDC67, 0x9226, 0xDC68, 0x920F, 0xDC69, 0x920C, 0xDC6A, 0x9200,\t0xDC6B, 0x9212, 0xDC6C, 0x91FF, 0xDC6D, 0x91FD, 0xDC6E, 0x9206,\n\t0xDC6F, 0x9204, 0xDC70, 0x9227, 0xDC71, 0x9202, 0xDC72, 0x921C,\t0xDC73, 0x9224, 0xDC74, 0x9219, 0xDC75, 0x9217, 0xDC76, 0x9205,\n\t0xDC77, 0x9216, 0xDC78, 0x957B, 0xDC79, 0x958D, 0xDC7A, 0x958C,\t0xDC7B, 0x9590, 0xDC7C, 0x9687, 0xDC7D, 0x967E, 0xDC7E, 0x9688,\n\t0xDCA1, 0x9689, 0xDCA2, 0x9683, 0xDCA3, 0x9680, 0xDCA4, 0x96C2,\t0xDCA5, 0x96C8, 0xDCA6, 0x96C3, 0xDCA7, 0x96F1, 0xDCA8, 0x96F0,\n\t0xDCA9, 0x976C, 0xDCAA, 0x9770, 0xDCAB, 0x976E, 0xDCAC, 0x9807,\t0xDCAD, 0x98A9, 0xDCAE, 0x98EB, 0xDCAF, 0x9CE6, 0xDCB0, 0x9EF9,\n\t0xDCB1, 0x4E83, 0xDCB2, 0x4E84, 0xDCB3, 0x4EB6, 0xDCB4, 0x50BD,\t0xDCB5, 0x50BF, 0xDCB6, 0x50C6, 0xDCB7, 0x50AE, 0xDCB8, 0x50C4,\n\t0xDCB9, 0x50CA, 0xDCBA, 0x50B4, 0xDCBB, 0x50C8, 0xDCBC, 0x50C2,\t0xDCBD, 0x50B0, 0xDCBE, 0x50C1, 0xDCBF, 0x50BA, 0xDCC0, 0x50B1,\n\t0xDCC1, 0x50CB, 0xDCC2, 0x50C9, 0xDCC3, 0x50B6, 0xDCC4, 0x50B8,\t0xDCC5, 0x51D7, 0xDCC6, 0x527A, 0xDCC7, 0x5278, 0xDCC8, 0x527B,\n\t0xDCC9, 0x527C, 0xDCCA, 0x55C3, 0xDCCB, 0x55DB, 0xDCCC, 0x55CC,\t0xDCCD, 0x55D0, 0xDCCE, 0x55CB, 0xDCCF, 0x55CA, 0xDCD0, 0x55DD,\n\t0xDCD1, 0x55C0, 0xDCD2, 0x55D4, 0xDCD3, 0x55C4, 0xDCD4, 0x55E9,\t0xDCD5, 0x55BF, 0xDCD6, 0x55D2, 0xDCD7, 0x558D, 0xDCD8, 0x55CF,\n\t0xDCD9, 0x55D5, 0xDCDA, 0x55E2, 0xDCDB, 0x55D6, 0xDCDC, 0x55C8,\t0xDCDD, 0x55F2, 0xDCDE, 0x55CD, 0xDCDF, 0x55D9, 0xDCE0, 0x55C2,\n\t0xDCE1, 0x5714, 0xDCE2, 0x5853, 0xDCE3, 0x5868, 0xDCE4, 0x5864,\t0xDCE5, 0x584F, 0xDCE6, 0x584D, 0xDCE7, 0x5849, 0xDCE8, 0x586F,\n\t0xDCE9, 0x5855, 0xDCEA, 0x584E, 0xDCEB, 0x585D, 0xDCEC, 0x5859,\t0xDCED, 0x5865, 0xDCEE, 0x585B, 0xDCEF, 0x583D, 0xDCF0, 0x5863,\n\t0xDCF1, 0x5871, 0xDCF2, 0x58FC, 0xDCF3, 0x5AC7, 0xDCF4, 0x5AC4,\t0xDCF5, 0x5ACB, 0xDCF6, 0x5ABA, 0xDCF7, 0x5AB8, 0xDCF8, 0x5AB1,\n\t0xDCF9, 0x5AB5, 0xDCFA, 0x5AB0, 0xDCFB, 0x5ABF, 0xDCFC, 0x5AC8,\t0xDCFD, 0x5ABB, 0xDCFE, 0x5AC6, 0xDD40, 0x5AB7, 0xDD41, 0x5AC0,\n\t0xDD42, 0x5ACA, 0xDD43, 0x5AB4, 0xDD44, 0x5AB6, 0xDD45, 0x5ACD,\t0xDD46, 0x5AB9, 0xDD47, 0x5A90, 0xDD48, 0x5BD6, 0xDD49, 0x5BD8,\n\t0xDD4A, 0x5BD9, 0xDD4B, 0x5C1F, 0xDD4C, 0x5C33, 0xDD4D, 0x5D71,\t0xDD4E, 0x5D63, 0xDD4F, 0x5D4A, 0xDD50, 0x5D65, 0xDD51, 0x5D72,\n\t0xDD52, 0x5D6C, 0xDD53, 0x5D5E, 0xDD54, 0x5D68, 0xDD55, 0x5D67,\t0xDD56, 0x5D62, 0xDD57, 0x5DF0, 0xDD58, 0x5E4F, 0xDD59, 0x5E4E,\n\t0xDD5A, 0x5E4A, 0xDD5B, 0x5E4D, 0xDD5C, 0x5E4B, 0xDD5D, 0x5EC5,\t0xDD5E, 0x5ECC, 0xDD5F, 0x5EC6, 0xDD60, 0x5ECB, 0xDD61, 0x5EC7,\n\t0xDD62, 0x5F40, 0xDD63, 0x5FAF, 0xDD64, 0x5FAD, 0xDD65, 0x60F7,\t0xDD66, 0x6149, 0xDD67, 0x614A, 0xDD68, 0x612B, 0xDD69, 0x6145,\n\t0xDD6A, 0x6136, 0xDD6B, 0x6132, 0xDD6C, 0x612E, 0xDD6D, 0x6146,\t0xDD6E, 0x612F, 0xDD6F, 0x614F, 0xDD70, 0x6129, 0xDD71, 0x6140,\n\t0xDD72, 0x6220, 0xDD73, 0x9168, 0xDD74, 0x6223, 0xDD75, 0x6225,\t0xDD76, 0x6224, 0xDD77, 0x63C5, 0xDD78, 0x63F1, 0xDD79, 0x63EB,\n\t0xDD7A, 0x6410, 0xDD7B, 0x6412, 0xDD7C, 0x6409, 0xDD7D, 0x6420,\t0xDD7E, 0x6424, 0xDDA1, 0x6433, 0xDDA2, 0x6443, 0xDDA3, 0x641F,\n\t0xDDA4, 0x6415, 0xDDA5, 0x6418, 0xDDA6, 0x6439, 0xDDA7, 0x6437,\t0xDDA8, 0x6422, 0xDDA9, 0x6423, 0xDDAA, 0x640C, 0xDDAB, 0x6426,\n\t0xDDAC, 0x6430, 0xDDAD, 0x6428, 0xDDAE, 0x6441, 0xDDAF, 0x6435,\t0xDDB0, 0x642F, 0xDDB1, 0x640A, 0xDDB2, 0x641A, 0xDDB3, 0x6440,\n\t0xDDB4, 0x6425, 0xDDB5, 0x6427, 0xDDB6, 0x640B, 0xDDB7, 0x63E7,\t0xDDB8, 0x641B, 0xDDB9, 0x642E, 0xDDBA, 0x6421, 0xDDBB, 0x640E,\n\t0xDDBC, 0x656F, 0xDDBD, 0x6592, 0xDDBE, 0x65D3, 0xDDBF, 0x6686,\t0xDDC0, 0x668C, 0xDDC1, 0x6695, 0xDDC2, 0x6690, 0xDDC3, 0x668B,\n\t0xDDC4, 0x668A, 0xDDC5, 0x6699, 0xDDC6, 0x6694, 0xDDC7, 0x6678,\t0xDDC8, 0x6720, 0xDDC9, 0x6966, 0xDDCA, 0x695F, 0xDDCB, 0x6938,\n\t0xDDCC, 0x694E, 0xDDCD, 0x6962, 0xDDCE, 0x6971, 0xDDCF, 0x693F,\t0xDDD0, 0x6945, 0xDDD1, 0x696A, 0xDDD2, 0x6939, 0xDDD3, 0x6942,\n\t0xDDD4, 0x6957, 0xDDD5, 0x6959, 0xDDD6, 0x697A, 0xDDD7, 0x6948,\t0xDDD8, 0x6949, 0xDDD9, 0x6935, 0xDDDA, 0x696C, 0xDDDB, 0x6933,\n\t0xDDDC, 0x693D, 0xDDDD, 0x6965, 0xDDDE, 0x68F0, 0xDDDF, 0x6978,\t0xDDE0, 0x6934, 0xDDE1, 0x6969, 0xDDE2, 0x6940, 0xDDE3, 0x696F,\n\t0xDDE4, 0x6944, 0xDDE5, 0x6976, 0xDDE6, 0x6958, 0xDDE7, 0x6941,\t0xDDE8, 0x6974, 0xDDE9, 0x694C, 0xDDEA, 0x693B, 0xDDEB, 0x694B,\n\t0xDDEC, 0x6937, 0xDDED, 0x695C, 0xDDEE, 0x694F, 0xDDEF, 0x6951,\t0xDDF0, 0x6932, 0xDDF1, 0x6952, 0xDDF2, 0x692F, 0xDDF3, 0x697B,\n\t0xDDF4, 0x693C, 0xDDF5, 0x6B46, 0xDDF6, 0x6B45, 0xDDF7, 0x6B43,\t0xDDF8, 0x6B42, 0xDDF9, 0x6B48, 0xDDFA, 0x6B41, 0xDDFB, 0x6B9B,\n\t0xDDFC, 0xFA0D, 0xDDFD, 0x6BFB, 0xDDFE, 0x6BFC, 0xDE40, 0x6BF9,\t0xDE41, 0x6BF7, 0xDE42, 0x6BF8, 0xDE43, 0x6E9B, 0xDE44, 0x6ED6,\n\t0xDE45, 0x6EC8, 0xDE46, 0x6E8F, 0xDE47, 0x6EC0, 0xDE48, 0x6E9F,\t0xDE49, 0x6E93, 0xDE4A, 0x6E94, 0xDE4B, 0x6EA0, 0xDE4C, 0x6EB1,\n\t0xDE4D, 0x6EB9, 0xDE4E, 0x6EC6, 0xDE4F, 0x6ED2, 0xDE50, 0x6EBD,\t0xDE51, 0x6EC1, 0xDE52, 0x6E9E, 0xDE53, 0x6EC9, 0xDE54, 0x6EB7,\n\t0xDE55, 0x6EB0, 0xDE56, 0x6ECD, 0xDE57, 0x6EA6, 0xDE58, 0x6ECF,\t0xDE59, 0x6EB2, 0xDE5A, 0x6EBE, 0xDE5B, 0x6EC3, 0xDE5C, 0x6EDC,\n\t0xDE5D, 0x6ED8, 0xDE5E, 0x6E99, 0xDE5F, 0x6E92, 0xDE60, 0x6E8E,\t0xDE61, 0x6E8D, 0xDE62, 0x6EA4, 0xDE63, 0x6EA1, 0xDE64, 0x6EBF,\n\t0xDE65, 0x6EB3, 0xDE66, 0x6ED0, 0xDE67, 0x6ECA, 0xDE68, 0x6E97,\t0xDE69, 0x6EAE, 0xDE6A, 0x6EA3, 0xDE6B, 0x7147, 0xDE6C, 0x7154,\n\t0xDE6D, 0x7152, 0xDE6E, 0x7163, 0xDE6F, 0x7160, 0xDE70, 0x7141,\t0xDE71, 0x715D, 0xDE72, 0x7162, 0xDE73, 0x7172, 0xDE74, 0x7178,\n\t0xDE75, 0x716A, 0xDE76, 0x7161, 0xDE77, 0x7142, 0xDE78, 0x7158,\t0xDE79, 0x7143, 0xDE7A, 0x714B, 0xDE7B, 0x7170, 0xDE7C, 0x715F,\n\t0xDE7D, 0x7150, 0xDE7E, 0x7153, 0xDEA1, 0x7144, 0xDEA2, 0x714D,\t0xDEA3, 0x715A, 0xDEA4, 0x724F, 0xDEA5, 0x728D, 0xDEA6, 0x728C,\n\t0xDEA7, 0x7291, 0xDEA8, 0x7290, 0xDEA9, 0x728E, 0xDEAA, 0x733C,\t0xDEAB, 0x7342, 0xDEAC, 0x733B, 0xDEAD, 0x733A, 0xDEAE, 0x7340,\n\t0xDEAF, 0x734A, 0xDEB0, 0x7349, 0xDEB1, 0x7444, 0xDEB2, 0x744A,\t0xDEB3, 0x744B, 0xDEB4, 0x7452, 0xDEB5, 0x7451, 0xDEB6, 0x7457,\n\t0xDEB7, 0x7440, 0xDEB8, 0x744F, 0xDEB9, 0x7450, 0xDEBA, 0x744E,\t0xDEBB, 0x7442, 0xDEBC, 0x7446, 0xDEBD, 0x744D, 0xDEBE, 0x7454,\n\t0xDEBF, 0x74E1, 0xDEC0, 0x74FF, 0xDEC1, 0x74FE, 0xDEC2, 0x74FD,\t0xDEC3, 0x751D, 0xDEC4, 0x7579, 0xDEC5, 0x7577, 0xDEC6, 0x6983,\n\t0xDEC7, 0x75EF, 0xDEC8, 0x760F, 0xDEC9, 0x7603, 0xDECA, 0x75F7,\t0xDECB, 0x75FE, 0xDECC, 0x75FC, 0xDECD, 0x75F9, 0xDECE, 0x75F8,\n\t0xDECF, 0x7610, 0xDED0, 0x75FB, 0xDED1, 0x75F6, 0xDED2, 0x75ED,\t0xDED3, 0x75F5, 0xDED4, 0x75FD, 0xDED5, 0x7699, 0xDED6, 0x76B5,\n\t0xDED7, 0x76DD, 0xDED8, 0x7755, 0xDED9, 0x775F, 0xDEDA, 0x7760,\t0xDEDB, 0x7752, 0xDEDC, 0x7756, 0xDEDD, 0x775A, 0xDEDE, 0x7769,\n\t0xDEDF, 0x7767, 0xDEE0, 0x7754, 0xDEE1, 0x7759, 0xDEE2, 0x776D,\t0xDEE3, 0x77E0, 0xDEE4, 0x7887, 0xDEE5, 0x789A, 0xDEE6, 0x7894,\n\t0xDEE7, 0x788F, 0xDEE8, 0x7884, 0xDEE9, 0x7895, 0xDEEA, 0x7885,\t0xDEEB, 0x7886, 0xDEEC, 0x78A1, 0xDEED, 0x7883, 0xDEEE, 0x7879,\n\t0xDEEF, 0x7899, 0xDEF0, 0x7880, 0xDEF1, 0x7896, 0xDEF2, 0x787B,\t0xDEF3, 0x797C, 0xDEF4, 0x7982, 0xDEF5, 0x797D, 0xDEF6, 0x7979,\n\t0xDEF7, 0x7A11, 0xDEF8, 0x7A18, 0xDEF9, 0x7A19, 0xDEFA, 0x7A12,\t0xDEFB, 0x7A17, 0xDEFC, 0x7A15, 0xDEFD, 0x7A22, 0xDEFE, 0x7A13,\n\t0xDF40, 0x7A1B, 0xDF41, 0x7A10, 0xDF42, 0x7AA3, 0xDF43, 0x7AA2,\t0xDF44, 0x7A9E, 0xDF45, 0x7AEB, 0xDF46, 0x7B66, 0xDF47, 0x7B64,\n\t0xDF48, 0x7B6D, 0xDF49, 0x7B74, 0xDF4A, 0x7B69, 0xDF4B, 0x7B72,\t0xDF4C, 0x7B65, 0xDF4D, 0x7B73, 0xDF4E, 0x7B71, 0xDF4F, 0x7B70,\n\t0xDF50, 0x7B61, 0xDF51, 0x7B78, 0xDF52, 0x7B76, 0xDF53, 0x7B63,\t0xDF54, 0x7CB2, 0xDF55, 0x7CB4, 0xDF56, 0x7CAF, 0xDF57, 0x7D88,\n\t0xDF58, 0x7D86, 0xDF59, 0x7D80, 0xDF5A, 0x7D8D, 0xDF5B, 0x7D7F,\t0xDF5C, 0x7D85, 0xDF5D, 0x7D7A, 0xDF5E, 0x7D8E, 0xDF5F, 0x7D7B,\n\t0xDF60, 0x7D83, 0xDF61, 0x7D7C, 0xDF62, 0x7D8C, 0xDF63, 0x7D94,\t0xDF64, 0x7D84, 0xDF65, 0x7D7D, 0xDF66, 0x7D92, 0xDF67, 0x7F6D,\n\t0xDF68, 0x7F6B, 0xDF69, 0x7F67, 0xDF6A, 0x7F68, 0xDF6B, 0x7F6C,\t0xDF6C, 0x7FA6, 0xDF6D, 0x7FA5, 0xDF6E, 0x7FA7, 0xDF6F, 0x7FDB,\n\t0xDF70, 0x7FDC, 0xDF71, 0x8021, 0xDF72, 0x8164, 0xDF73, 0x8160,\t0xDF74, 0x8177, 0xDF75, 0x815C, 0xDF76, 0x8169, 0xDF77, 0x815B,\n\t0xDF78, 0x8162, 0xDF79, 0x8172, 0xDF7A, 0x6721, 0xDF7B, 0x815E,\t0xDF7C, 0x8176, 0xDF7D, 0x8167, 0xDF7E, 0x816F, 0xDFA1, 0x8144,\n\t0xDFA2, 0x8161, 0xDFA3, 0x821D, 0xDFA4, 0x8249, 0xDFA5, 0x8244,\t0xDFA6, 0x8240, 0xDFA7, 0x8242, 0xDFA8, 0x8245, 0xDFA9, 0x84F1,\n\t0xDFAA, 0x843F, 0xDFAB, 0x8456, 0xDFAC, 0x8476, 0xDFAD, 0x8479,\t0xDFAE, 0x848F, 0xDFAF, 0x848D, 0xDFB0, 0x8465, 0xDFB1, 0x8451,\n\t0xDFB2, 0x8440, 0xDFB3, 0x8486, 0xDFB4, 0x8467, 0xDFB5, 0x8430,\t0xDFB6, 0x844D, 0xDFB7, 0x847D, 0xDFB8, 0x845A, 0xDFB9, 0x8459,\n\t0xDFBA, 0x8474, 0xDFBB, 0x8473, 0xDFBC, 0x845D, 0xDFBD, 0x8507,\t0xDFBE, 0x845E, 0xDFBF, 0x8437, 0xDFC0, 0x843A, 0xDFC1, 0x8434,\n\t0xDFC2, 0x847A, 0xDFC3, 0x8443, 0xDFC4, 0x8478, 0xDFC5, 0x8432,\t0xDFC6, 0x8445, 0xDFC7, 0x8429, 0xDFC8, 0x83D9, 0xDFC9, 0x844B,\n\t0xDFCA, 0x842F, 0xDFCB, 0x8442, 0xDFCC, 0x842D, 0xDFCD, 0x845F,\t0xDFCE, 0x8470, 0xDFCF, 0x8439, 0xDFD0, 0x844E, 0xDFD1, 0x844C,\n\t0xDFD2, 0x8452, 0xDFD3, 0x846F, 0xDFD4, 0x84C5, 0xDFD5, 0x848E,\t0xDFD6, 0x843B, 0xDFD7, 0x8447, 0xDFD8, 0x8436, 0xDFD9, 0x8433,\n\t0xDFDA, 0x8468, 0xDFDB, 0x847E, 0xDFDC, 0x8444, 0xDFDD, 0x842B,\t0xDFDE, 0x8460, 0xDFDF, 0x8454, 0xDFE0, 0x846E, 0xDFE1, 0x8450,\n\t0xDFE2, 0x870B, 0xDFE3, 0x8704, 0xDFE4, 0x86F7, 0xDFE5, 0x870C,\t0xDFE6, 0x86FA, 0xDFE7, 0x86D6, 0xDFE8, 0x86F5, 0xDFE9, 0x874D,\n\t0xDFEA, 0x86F8, 0xDFEB, 0x870E, 0xDFEC, 0x8709, 0xDFED, 0x8701,\t0xDFEE, 0x86F6, 0xDFEF, 0x870D, 0xDFF0, 0x8705, 0xDFF1, 0x88D6,\n\t0xDFF2, 0x88CB, 0xDFF3, 0x88CD, 0xDFF4, 0x88CE, 0xDFF5, 0x88DE,\t0xDFF6, 0x88DB, 0xDFF7, 0x88DA, 0xDFF8, 0x88CC, 0xDFF9, 0x88D0,\n\t0xDFFA, 0x8985, 0xDFFB, 0x899B, 0xDFFC, 0x89DF, 0xDFFD, 0x89E5,\t0xDFFE, 0x89E4, 0xE040, 0x89E1, 0xE041, 0x89E0, 0xE042, 0x89E2,\n\t0xE043, 0x89DC, 0xE044, 0x89E6, 0xE045, 0x8A76, 0xE046, 0x8A86,\t0xE047, 0x8A7F, 0xE048, 0x8A61, 0xE049, 0x8A3F, 0xE04A, 0x8A77,\n\t0xE04B, 0x8A82, 0xE04C, 0x8A84, 0xE04D, 0x8A75, 0xE04E, 0x8A83,\t0xE04F, 0x8A81, 0xE050, 0x8A74, 0xE051, 0x8A7A, 0xE052, 0x8C3C,\n\t0xE053, 0x8C4B, 0xE054, 0x8C4A, 0xE055, 0x8C65, 0xE056, 0x8C64,\t0xE057, 0x8C66, 0xE058, 0x8C86, 0xE059, 0x8C84, 0xE05A, 0x8C85,\n\t0xE05B, 0x8CCC, 0xE05C, 0x8D68, 0xE05D, 0x8D69, 0xE05E, 0x8D91,\t0xE05F, 0x8D8C, 0xE060, 0x8D8E, 0xE061, 0x8D8F, 0xE062, 0x8D8D,\n\t0xE063, 0x8D93, 0xE064, 0x8D94, 0xE065, 0x8D90, 0xE066, 0x8D92,\t0xE067, 0x8DF0, 0xE068, 0x8DE0, 0xE069, 0x8DEC, 0xE06A, 0x8DF1,\n\t0xE06B, 0x8DEE, 0xE06C, 0x8DD0, 0xE06D, 0x8DE9, 0xE06E, 0x8DE3,\t0xE06F, 0x8DE2, 0xE070, 0x8DE7, 0xE071, 0x8DF2, 0xE072, 0x8DEB,\n\t0xE073, 0x8DF4, 0xE074, 0x8F06, 0xE075, 0x8EFF, 0xE076, 0x8F01,\t0xE077, 0x8F00, 0xE078, 0x8F05, 0xE079, 0x8F07, 0xE07A, 0x8F08,\n\t0xE07B, 0x8F02, 0xE07C, 0x8F0B, 0xE07D, 0x9052, 0xE07E, 0x903F,\t0xE0A1, 0x9044, 0xE0A2, 0x9049, 0xE0A3, 0x903D, 0xE0A4, 0x9110,\n\t0xE0A5, 0x910D, 0xE0A6, 0x910F, 0xE0A7, 0x9111, 0xE0A8, 0x9116,\t0xE0A9, 0x9114, 0xE0AA, 0x910B, 0xE0AB, 0x910E, 0xE0AC, 0x916E,\n\t0xE0AD, 0x916F, 0xE0AE, 0x9248, 0xE0AF, 0x9252, 0xE0B0, 0x9230,\t0xE0B1, 0x923A, 0xE0B2, 0x9266, 0xE0B3, 0x9233, 0xE0B4, 0x9265,\n\t0xE0B5, 0x925E, 0xE0B6, 0x9283, 0xE0B7, 0x922E, 0xE0B8, 0x924A,\t0xE0B9, 0x9246, 0xE0BA, 0x926D, 0xE0BB, 0x926C, 0xE0BC, 0x924F,\n\t0xE0BD, 0x9260, 0xE0BE, 0x9267, 0xE0BF, 0x926F, 0xE0C0, 0x9236,\t0xE0C1, 0x9261, 0xE0C2, 0x9270, 0xE0C3, 0x9231, 0xE0C4, 0x9254,\n\t0xE0C5, 0x9263, 0xE0C6, 0x9250, 0xE0C7, 0x9272, 0xE0C8, 0x924E,\t0xE0C9, 0x9253, 0xE0CA, 0x924C, 0xE0CB, 0x9256, 0xE0CC, 0x9232,\n\t0xE0CD, 0x959F, 0xE0CE, 0x959C, 0xE0CF, 0x959E, 0xE0D0, 0x959B,\t0xE0D1, 0x9692, 0xE0D2, 0x9693, 0xE0D3, 0x9691, 0xE0D4, 0x9697,\n\t0xE0D5, 0x96CE, 0xE0D6, 0x96FA, 0xE0D7, 0x96FD, 0xE0D8, 0x96F8,\t0xE0D9, 0x96F5, 0xE0DA, 0x9773, 0xE0DB, 0x9777, 0xE0DC, 0x9778,\n\t0xE0DD, 0x9772, 0xE0DE, 0x980F, 0xE0DF, 0x980D, 0xE0E0, 0x980E,\t0xE0E1, 0x98AC, 0xE0E2, 0x98F6, 0xE0E3, 0x98F9, 0xE0E4, 0x99AF,\n\t0xE0E5, 0x99B2, 0xE0E6, 0x99B0, 0xE0E7, 0x99B5, 0xE0E8, 0x9AAD,\t0xE0E9, 0x9AAB, 0xE0EA, 0x9B5B, 0xE0EB, 0x9CEA, 0xE0EC, 0x9CED,\n\t0xE0ED, 0x9CE7, 0xE0EE, 0x9E80, 0xE0EF, 0x9EFD, 0xE0F0, 0x50E6,\t0xE0F1, 0x50D4, 0xE0F2, 0x50D7, 0xE0F3, 0x50E8, 0xE0F4, 0x50F3,\n\t0xE0F5, 0x50DB, 0xE0F6, 0x50EA, 0xE0F7, 0x50DD, 0xE0F8, 0x50E4,\t0xE0F9, 0x50D3, 0xE0FA, 0x50EC, 0xE0FB, 0x50F0, 0xE0FC, 0x50EF,\n\t0xE0FD, 0x50E3, 0xE0FE, 0x50E0, 0xE140, 0x51D8, 0xE141, 0x5280,\t0xE142, 0x5281, 0xE143, 0x52E9, 0xE144, 0x52EB, 0xE145, 0x5330,\n\t0xE146, 0x53AC, 0xE147, 0x5627, 0xE148, 0x5615, 0xE149, 0x560C,\t0xE14A, 0x5612, 0xE14B, 0x55FC, 0xE14C, 0x560F, 0xE14D, 0x561C,\n\t0xE14E, 0x5601, 0xE14F, 0x5613, 0xE150, 0x5602, 0xE151, 0x55FA,\t0xE152, 0x561D, 0xE153, 0x5604, 0xE154, 0x55FF, 0xE155, 0x55F9,\n\t0xE156, 0x5889, 0xE157, 0x587C, 0xE158, 0x5890, 0xE159, 0x5898,\t0xE15A, 0x5886, 0xE15B, 0x5881, 0xE15C, 0x587F, 0xE15D, 0x5874,\n\t0xE15E, 0x588B, 0xE15F, 0x587A, 0xE160, 0x5887, 0xE161, 0x5891,\t0xE162, 0x588E, 0xE163, 0x5876, 0xE164, 0x5882, 0xE165, 0x5888,\n\t0xE166, 0x587B, 0xE167, 0x5894, 0xE168, 0x588F, 0xE169, 0x58FE,\t0xE16A, 0x596B, 0xE16B, 0x5ADC, 0xE16C, 0x5AEE, 0xE16D, 0x5AE5,\n\t0xE16E, 0x5AD5, 0xE16F, 0x5AEA, 0xE170, 0x5ADA, 0xE171, 0x5AED,\t0xE172, 0x5AEB, 0xE173, 0x5AF3, 0xE174, 0x5AE2, 0xE175, 0x5AE0,\n\t0xE176, 0x5ADB, 0xE177, 0x5AEC, 0xE178, 0x5ADE, 0xE179, 0x5ADD,\t0xE17A, 0x5AD9, 0xE17B, 0x5AE8, 0xE17C, 0x5ADF, 0xE17D, 0x5B77,\n\t0xE17E, 0x5BE0, 0xE1A1, 0x5BE3, 0xE1A2, 0x5C63, 0xE1A3, 0x5D82,\t0xE1A4, 0x5D80, 0xE1A5, 0x5D7D, 0xE1A6, 0x5D86, 0xE1A7, 0x5D7A,\n\t0xE1A8, 0x5D81, 0xE1A9, 0x5D77, 0xE1AA, 0x5D8A, 0xE1AB, 0x5D89,\t0xE1AC, 0x5D88, 0xE1AD, 0x5D7E, 0xE1AE, 0x5D7C, 0xE1AF, 0x5D8D,\n\t0xE1B0, 0x5D79, 0xE1B1, 0x5D7F, 0xE1B2, 0x5E58, 0xE1B3, 0x5E59,\t0xE1B4, 0x5E53, 0xE1B5, 0x5ED8, 0xE1B6, 0x5ED1, 0xE1B7, 0x5ED7,\n\t0xE1B8, 0x5ECE, 0xE1B9, 0x5EDC, 0xE1BA, 0x5ED5, 0xE1BB, 0x5ED9,\t0xE1BC, 0x5ED2, 0xE1BD, 0x5ED4, 0xE1BE, 0x5F44, 0xE1BF, 0x5F43,\n\t0xE1C0, 0x5F6F, 0xE1C1, 0x5FB6, 0xE1C2, 0x612C, 0xE1C3, 0x6128,\t0xE1C4, 0x6141, 0xE1C5, 0x615E, 0xE1C6, 0x6171, 0xE1C7, 0x6173,\n\t0xE1C8, 0x6152, 0xE1C9, 0x6153, 0xE1CA, 0x6172, 0xE1CB, 0x616C,\t0xE1CC, 0x6180, 0xE1CD, 0x6174, 0xE1CE, 0x6154, 0xE1CF, 0x617A,\n\t0xE1D0, 0x615B, 0xE1D1, 0x6165, 0xE1D2, 0x613B, 0xE1D3, 0x616A,\t0xE1D4, 0x6161, 0xE1D5, 0x6156, 0xE1D6, 0x6229, 0xE1D7, 0x6227,\n\t0xE1D8, 0x622B, 0xE1D9, 0x642B, 0xE1DA, 0x644D, 0xE1DB, 0x645B,\t0xE1DC, 0x645D, 0xE1DD, 0x6474, 0xE1DE, 0x6476, 0xE1DF, 0x6472,\n\t0xE1E0, 0x6473, 0xE1E1, 0x647D, 0xE1E2, 0x6475, 0xE1E3, 0x6466,\t0xE1E4, 0x64A6, 0xE1E5, 0x644E, 0xE1E6, 0x6482, 0xE1E7, 0x645E,\n\t0xE1E8, 0x645C, 0xE1E9, 0x644B, 0xE1EA, 0x6453, 0xE1EB, 0x6460,\t0xE1EC, 0x6450, 0xE1ED, 0x647F, 0xE1EE, 0x643F, 0xE1EF, 0x646C,\n\t0xE1F0, 0x646B, 0xE1F1, 0x6459, 0xE1F2, 0x6465, 0xE1F3, 0x6477,\t0xE1F4, 0x6573, 0xE1F5, 0x65A0, 0xE1F6, 0x66A1, 0xE1F7, 0x66A0,\n\t0xE1F8, 0x669F, 0xE1F9, 0x6705, 0xE1FA, 0x6704, 0xE1FB, 0x6722,\t0xE1FC, 0x69B1, 0xE1FD, 0x69B6, 0xE1FE, 0x69C9, 0xE240, 0x69A0,\n\t0xE241, 0x69CE, 0xE242, 0x6996, 0xE243, 0x69B0, 0xE244, 0x69AC,\t0xE245, 0x69BC, 0xE246, 0x6991, 0xE247, 0x6999, 0xE248, 0x698E,\n\t0xE249, 0x69A7, 0xE24A, 0x698D, 0xE24B, 0x69A9, 0xE24C, 0x69BE,\t0xE24D, 0x69AF, 0xE24E, 0x69BF, 0xE24F, 0x69C4, 0xE250, 0x69BD,\n\t0xE251, 0x69A4, 0xE252, 0x69D4, 0xE253, 0x69B9, 0xE254, 0x69CA,\t0xE255, 0x699A, 0xE256, 0x69CF, 0xE257, 0x69B3, 0xE258, 0x6993,\n\t0xE259, 0x69AA, 0xE25A, 0x69A1, 0xE25B, 0x699E, 0xE25C, 0x69D9,\t0xE25D, 0x6997, 0xE25E, 0x6990, 0xE25F, 0x69C2, 0xE260, 0x69B5,\n\t0xE261, 0x69A5, 0xE262, 0x69C6, 0xE263, 0x6B4A, 0xE264, 0x6B4D,\t0xE265, 0x6B4B, 0xE266, 0x6B9E, 0xE267, 0x6B9F, 0xE268, 0x6BA0,\n\t0xE269, 0x6BC3, 0xE26A, 0x6BC4, 0xE26B, 0x6BFE, 0xE26C, 0x6ECE,\t0xE26D, 0x6EF5, 0xE26E, 0x6EF1, 0xE26F, 0x6F03, 0xE270, 0x6F25,\n\t0xE271, 0x6EF8, 0xE272, 0x6F37, 0xE273, 0x6EFB, 0xE274, 0x6F2E,\t0xE275, 0x6F09, 0xE276, 0x6F4E, 0xE277, 0x6F19, 0xE278, 0x6F1A,\n\t0xE279, 0x6F27, 0xE27A, 0x6F18, 0xE27B, 0x6F3B, 0xE27C, 0x6F12,\t0xE27D, 0x6EED, 0xE27E, 0x6F0A, 0xE2A1, 0x6F36, 0xE2A2, 0x6F73,\n\t0xE2A3, 0x6EF9, 0xE2A4, 0x6EEE, 0xE2A5, 0x6F2D, 0xE2A6, 0x6F40,\t0xE2A7, 0x6F30, 0xE2A8, 0x6F3C, 0xE2A9, 0x6F35, 0xE2AA, 0x6EEB,\n\t0xE2AB, 0x6F07, 0xE2AC, 0x6F0E, 0xE2AD, 0x6F43, 0xE2AE, 0x6F05,\t0xE2AF, 0x6EFD, 0xE2B0, 0x6EF6, 0xE2B1, 0x6F39, 0xE2B2, 0x6F1C,\n\t0xE2B3, 0x6EFC, 0xE2B4, 0x6F3A, 0xE2B5, 0x6F1F, 0xE2B6, 0x6F0D,\t0xE2B7, 0x6F1E, 0xE2B8, 0x6F08, 0xE2B9, 0x6F21, 0xE2BA, 0x7187,\n\t0xE2BB, 0x7190, 0xE2BC, 0x7189, 0xE2BD, 0x7180, 0xE2BE, 0x7185,\t0xE2BF, 0x7182, 0xE2C0, 0x718F, 0xE2C1, 0x717B, 0xE2C2, 0x7186,\n\t0xE2C3, 0x7181, 0xE2C4, 0x7197, 0xE2C5, 0x7244, 0xE2C6, 0x7253,\t0xE2C7, 0x7297, 0xE2C8, 0x7295, 0xE2C9, 0x7293, 0xE2CA, 0x7343,\n\t0xE2CB, 0x734D, 0xE2CC, 0x7351, 0xE2CD, 0x734C, 0xE2CE, 0x7462,\t0xE2CF, 0x7473, 0xE2D0, 0x7471, 0xE2D1, 0x7475, 0xE2D2, 0x7472,\n\t0xE2D3, 0x7467, 0xE2D4, 0x746E, 0xE2D5, 0x7500, 0xE2D6, 0x7502,\t0xE2D7, 0x7503, 0xE2D8, 0x757D, 0xE2D9, 0x7590, 0xE2DA, 0x7616,\n\t0xE2DB, 0x7608, 0xE2DC, 0x760C, 0xE2DD, 0x7615, 0xE2DE, 0x7611,\t0xE2DF, 0x760A, 0xE2E0, 0x7614, 0xE2E1, 0x76B8, 0xE2E2, 0x7781,\n\t0xE2E3, 0x777C, 0xE2E4, 0x7785, 0xE2E5, 0x7782, 0xE2E6, 0x776E,\t0xE2E7, 0x7780, 0xE2E8, 0x776F, 0xE2E9, 0x777E, 0xE2EA, 0x7783,\n\t0xE2EB, 0x78B2, 0xE2EC, 0x78AA, 0xE2ED, 0x78B4, 0xE2EE, 0x78AD,\t0xE2EF, 0x78A8, 0xE2F0, 0x787E, 0xE2F1, 0x78AB, 0xE2F2, 0x789E,\n\t0xE2F3, 0x78A5, 0xE2F4, 0x78A0, 0xE2F5, 0x78AC, 0xE2F6, 0x78A2,\t0xE2F7, 0x78A4, 0xE2F8, 0x7998, 0xE2F9, 0x798A, 0xE2FA, 0x798B,\n\t0xE2FB, 0x7996, 0xE2FC, 0x7995, 0xE2FD, 0x7994, 0xE2FE, 0x7993,\t0xE340, 0x7997, 0xE341, 0x7988, 0xE342, 0x7992, 0xE343, 0x7990,\n\t0xE344, 0x7A2B, 0xE345, 0x7A4A, 0xE346, 0x7A30, 0xE347, 0x7A2F,\t0xE348, 0x7A28, 0xE349, 0x7A26, 0xE34A, 0x7AA8, 0xE34B, 0x7AAB,\n\t0xE34C, 0x7AAC, 0xE34D, 0x7AEE, 0xE34E, 0x7B88, 0xE34F, 0x7B9C,\t0xE350, 0x7B8A, 0xE351, 0x7B91, 0xE352, 0x7B90, 0xE353, 0x7B96,\n\t0xE354, 0x7B8D, 0xE355, 0x7B8C, 0xE356, 0x7B9B, 0xE357, 0x7B8E,\t0xE358, 0x7B85, 0xE359, 0x7B98, 0xE35A, 0x5284, 0xE35B, 0x7B99,\n\t0xE35C, 0x7BA4, 0xE35D, 0x7B82, 0xE35E, 0x7CBB, 0xE35F, 0x7CBF,\t0xE360, 0x7CBC, 0xE361, 0x7CBA, 0xE362, 0x7DA7, 0xE363, 0x7DB7,\n\t0xE364, 0x7DC2, 0xE365, 0x7DA3, 0xE366, 0x7DAA, 0xE367, 0x7DC1,\t0xE368, 0x7DC0, 0xE369, 0x7DC5, 0xE36A, 0x7D9D, 0xE36B, 0x7DCE,\n\t0xE36C, 0x7DC4, 0xE36D, 0x7DC6, 0xE36E, 0x7DCB, 0xE36F, 0x7DCC,\t0xE370, 0x7DAF, 0xE371, 0x7DB9, 0xE372, 0x7D96, 0xE373, 0x7DBC,\n\t0xE374, 0x7D9F, 0xE375, 0x7DA6, 0xE376, 0x7DAE, 0xE377, 0x7DA9,\t0xE378, 0x7DA1, 0xE379, 0x7DC9, 0xE37A, 0x7F73, 0xE37B, 0x7FE2,\n\t0xE37C, 0x7FE3, 0xE37D, 0x7FE5, 0xE37E, 0x7FDE, 0xE3A1, 0x8024,\t0xE3A2, 0x805D, 0xE3A3, 0x805C, 0xE3A4, 0x8189, 0xE3A5, 0x8186,\n\t0xE3A6, 0x8183, 0xE3A7, 0x8187, 0xE3A8, 0x818D, 0xE3A9, 0x818C,\t0xE3AA, 0x818B, 0xE3AB, 0x8215, 0xE3AC, 0x8497, 0xE3AD, 0x84A4,\n\t0xE3AE, 0x84A1, 0xE3AF, 0x849F, 0xE3B0, 0x84BA, 0xE3B1, 0x84CE,\t0xE3B2, 0x84C2, 0xE3B3, 0x84AC, 0xE3B4, 0x84AE, 0xE3B5, 0x84AB,\n\t0xE3B6, 0x84B9, 0xE3B7, 0x84B4, 0xE3B8, 0x84C1, 0xE3B9, 0x84CD,\t0xE3BA, 0x84AA, 0xE3BB, 0x849A, 0xE3BC, 0x84B1, 0xE3BD, 0x84D0,\n\t0xE3BE, 0x849D, 0xE3BF, 0x84A7, 0xE3C0, 0x84BB, 0xE3C1, 0x84A2,\t0xE3C2, 0x8494, 0xE3C3, 0x84C7, 0xE3C4, 0x84CC, 0xE3C5, 0x849B,\n\t0xE3C6, 0x84A9, 0xE3C7, 0x84AF, 0xE3C8, 0x84A8, 0xE3C9, 0x84D6,\t0xE3CA, 0x8498, 0xE3CB, 0x84B6, 0xE3CC, 0x84CF, 0xE3CD, 0x84A0,\n\t0xE3CE, 0x84D7, 0xE3CF, 0x84D4, 0xE3D0, 0x84D2, 0xE3D1, 0x84DB,\t0xE3D2, 0x84B0, 0xE3D3, 0x8491, 0xE3D4, 0x8661, 0xE3D5, 0x8733,\n\t0xE3D6, 0x8723, 0xE3D7, 0x8728, 0xE3D8, 0x876B, 0xE3D9, 0x8740,\t0xE3DA, 0x872E, 0xE3DB, 0x871E, 0xE3DC, 0x8721, 0xE3DD, 0x8719,\n\t0xE3DE, 0x871B, 0xE3DF, 0x8743, 0xE3E0, 0x872C, 0xE3E1, 0x8741,\t0xE3E2, 0x873E, 0xE3E3, 0x8746, 0xE3E4, 0x8720, 0xE3E5, 0x8732,\n\t0xE3E6, 0x872A, 0xE3E7, 0x872D, 0xE3E8, 0x873C, 0xE3E9, 0x8712,\t0xE3EA, 0x873A, 0xE3EB, 0x8731, 0xE3EC, 0x8735, 0xE3ED, 0x8742,\n\t0xE3EE, 0x8726, 0xE3EF, 0x8727, 0xE3F0, 0x8738, 0xE3F1, 0x8724,\t0xE3F2, 0x871A, 0xE3F3, 0x8730, 0xE3F4, 0x8711, 0xE3F5, 0x88F7,\n\t0xE3F6, 0x88E7, 0xE3F7, 0x88F1, 0xE3F8, 0x88F2, 0xE3F9, 0x88FA,\t0xE3FA, 0x88FE, 0xE3FB, 0x88EE, 0xE3FC, 0x88FC, 0xE3FD, 0x88F6,\n\t0xE3FE, 0x88FB, 0xE440, 0x88F0, 0xE441, 0x88EC, 0xE442, 0x88EB,\t0xE443, 0x899D, 0xE444, 0x89A1, 0xE445, 0x899F, 0xE446, 0x899E,\n\t0xE447, 0x89E9, 0xE448, 0x89EB, 0xE449, 0x89E8, 0xE44A, 0x8AAB,\t0xE44B, 0x8A99, 0xE44C, 0x8A8B, 0xE44D, 0x8A92, 0xE44E, 0x8A8F,\n\t0xE44F, 0x8A96, 0xE450, 0x8C3D, 0xE451, 0x8C68, 0xE452, 0x8C69,\t0xE453, 0x8CD5, 0xE454, 0x8CCF, 0xE455, 0x8CD7, 0xE456, 0x8D96,\n\t0xE457, 0x8E09, 0xE458, 0x8E02, 0xE459, 0x8DFF, 0xE45A, 0x8E0D,\t0xE45B, 0x8DFD, 0xE45C, 0x8E0A, 0xE45D, 0x8E03, 0xE45E, 0x8E07,\n\t0xE45F, 0x8E06, 0xE460, 0x8E05, 0xE461, 0x8DFE, 0xE462, 0x8E00,\t0xE463, 0x8E04, 0xE464, 0x8F10, 0xE465, 0x8F11, 0xE466, 0x8F0E,\n\t0xE467, 0x8F0D, 0xE468, 0x9123, 0xE469, 0x911C, 0xE46A, 0x9120,\t0xE46B, 0x9122, 0xE46C, 0x911F, 0xE46D, 0x911D, 0xE46E, 0x911A,\n\t0xE46F, 0x9124, 0xE470, 0x9121, 0xE471, 0x911B, 0xE472, 0x917A,\t0xE473, 0x9172, 0xE474, 0x9179, 0xE475, 0x9173, 0xE476, 0x92A5,\n\t0xE477, 0x92A4, 0xE478, 0x9276, 0xE479, 0x929B, 0xE47A, 0x927A,\t0xE47B, 0x92A0, 0xE47C, 0x9294, 0xE47D, 0x92AA, 0xE47E, 0x928D,\n\t0xE4A1, 0x92A6, 0xE4A2, 0x929A, 0xE4A3, 0x92AB, 0xE4A4, 0x9279,\t0xE4A5, 0x9297, 0xE4A6, 0x927F, 0xE4A7, 0x92A3, 0xE4A8, 0x92EE,\n\t0xE4A9, 0x928E, 0xE4AA, 0x9282, 0xE4AB, 0x9295, 0xE4AC, 0x92A2,\t0xE4AD, 0x927D, 0xE4AE, 0x9288, 0xE4AF, 0x92A1, 0xE4B0, 0x928A,\n\t0xE4B1, 0x9286, 0xE4B2, 0x928C, 0xE4B3, 0x9299, 0xE4B4, 0x92A7,\t0xE4B5, 0x927E, 0xE4B6, 0x9287, 0xE4B7, 0x92A9, 0xE4B8, 0x929D,\n\t0xE4B9, 0x928B, 0xE4BA, 0x922D, 0xE4BB, 0x969E, 0xE4BC, 0x96A1,\t0xE4BD, 0x96FF, 0xE4BE, 0x9758, 0xE4BF, 0x977D, 0xE4C0, 0x977A,\n\t0xE4C1, 0x977E, 0xE4C2, 0x9783, 0xE4C3, 0x9780, 0xE4C4, 0x9782,\t0xE4C5, 0x977B, 0xE4C6, 0x9784, 0xE4C7, 0x9781, 0xE4C8, 0x977F,\n\t0xE4C9, 0x97CE, 0xE4CA, 0x97CD, 0xE4CB, 0x9816, 0xE4CC, 0x98AD,\t0xE4CD, 0x98AE, 0xE4CE, 0x9902, 0xE4CF, 0x9900, 0xE4D0, 0x9907,\n\t0xE4D1, 0x999D, 0xE4D2, 0x999C, 0xE4D3, 0x99C3, 0xE4D4, 0x99B9,\t0xE4D5, 0x99BB, 0xE4D6, 0x99BA, 0xE4D7, 0x99C2, 0xE4D8, 0x99BD,\n\t0xE4D9, 0x99C7, 0xE4DA, 0x9AB1, 0xE4DB, 0x9AE3, 0xE4DC, 0x9AE7,\t0xE4DD, 0x9B3E, 0xE4DE, 0x9B3F, 0xE4DF, 0x9B60, 0xE4E0, 0x9B61,\n\t0xE4E1, 0x9B5F, 0xE4E2, 0x9CF1, 0xE4E3, 0x9CF2, 0xE4E4, 0x9CF5,\t0xE4E5, 0x9EA7, 0xE4E6, 0x50FF, 0xE4E7, 0x5103, 0xE4E8, 0x5130,\n\t0xE4E9, 0x50F8, 0xE4EA, 0x5106, 0xE4EB, 0x5107, 0xE4EC, 0x50F6,\t0xE4ED, 0x50FE, 0xE4EE, 0x510B, 0xE4EF, 0x510C, 0xE4F0, 0x50FD,\n\t0xE4F1, 0x510A, 0xE4F2, 0x528B, 0xE4F3, 0x528C, 0xE4F4, 0x52F1,\t0xE4F5, 0x52EF, 0xE4F6, 0x5648, 0xE4F7, 0x5642, 0xE4F8, 0x564C,\n\t0xE4F9, 0x5635, 0xE4FA, 0x5641, 0xE4FB, 0x564A, 0xE4FC, 0x5649,\t0xE4FD, 0x5646, 0xE4FE, 0x5658, 0xE540, 0x565A, 0xE541, 0x5640,\n\t0xE542, 0x5633, 0xE543, 0x563D, 0xE544, 0x562C, 0xE545, 0x563E,\t0xE546, 0x5638, 0xE547, 0x562A, 0xE548, 0x563A, 0xE549, 0x571A,\n\t0xE54A, 0x58AB, 0xE54B, 0x589D, 0xE54C, 0x58B1, 0xE54D, 0x58A0,\t0xE54E, 0x58A3, 0xE54F, 0x58AF, 0xE550, 0x58AC, 0xE551, 0x58A5,\n\t0xE552, 0x58A1, 0xE553, 0x58FF, 0xE554, 0x5AFF, 0xE555, 0x5AF4,\t0xE556, 0x5AFD, 0xE557, 0x5AF7, 0xE558, 0x5AF6, 0xE559, 0x5B03,\n\t0xE55A, 0x5AF8, 0xE55B, 0x5B02, 0xE55C, 0x5AF9, 0xE55D, 0x5B01,\t0xE55E, 0x5B07, 0xE55F, 0x5B05, 0xE560, 0x5B0F, 0xE561, 0x5C67,\n\t0xE562, 0x5D99, 0xE563, 0x5D97, 0xE564, 0x5D9F, 0xE565, 0x5D92,\t0xE566, 0x5DA2, 0xE567, 0x5D93, 0xE568, 0x5D95, 0xE569, 0x5DA0,\n\t0xE56A, 0x5D9C, 0xE56B, 0x5DA1, 0xE56C, 0x5D9A, 0xE56D, 0x5D9E,\t0xE56E, 0x5E69, 0xE56F, 0x5E5D, 0xE570, 0x5E60, 0xE571, 0x5E5C,\n\t0xE572, 0x7DF3, 0xE573, 0x5EDB, 0xE574, 0x5EDE, 0xE575, 0x5EE1,\t0xE576, 0x5F49, 0xE577, 0x5FB2, 0xE578, 0x618B, 0xE579, 0x6183,\n\t0xE57A, 0x6179, 0xE57B, 0x61B1, 0xE57C, 0x61B0, 0xE57D, 0x61A2,\t0xE57E, 0x6189, 0xE5A1, 0x619B, 0xE5A2, 0x6193, 0xE5A3, 0x61AF,\n\t0xE5A4, 0x61AD, 0xE5A5, 0x619F, 0xE5A6, 0x6192, 0xE5A7, 0x61AA,\t0xE5A8, 0x61A1, 0xE5A9, 0x618D, 0xE5AA, 0x6166, 0xE5AB, 0x61B3,\n\t0xE5AC, 0x622D, 0xE5AD, 0x646E, 0xE5AE, 0x6470, 0xE5AF, 0x6496,\t0xE5B0, 0x64A0, 0xE5B1, 0x6485, 0xE5B2, 0x6497, 0xE5B3, 0x649C,\n\t0xE5B4, 0x648F, 0xE5B5, 0x648B, 0xE5B6, 0x648A, 0xE5B7, 0x648C,\t0xE5B8, 0x64A3, 0xE5B9, 0x649F, 0xE5BA, 0x6468, 0xE5BB, 0x64B1,\n\t0xE5BC, 0x6498, 0xE5BD, 0x6576, 0xE5BE, 0x657A, 0xE5BF, 0x6579,\t0xE5C0, 0x657B, 0xE5C1, 0x65B2, 0xE5C2, 0x65B3, 0xE5C3, 0x66B5,\n\t0xE5C4, 0x66B0, 0xE5C5, 0x66A9, 0xE5C6, 0x66B2, 0xE5C7, 0x66B7,\t0xE5C8, 0x66AA, 0xE5C9, 0x66AF, 0xE5CA, 0x6A00, 0xE5CB, 0x6A06,\n\t0xE5CC, 0x6A17, 0xE5CD, 0x69E5, 0xE5CE, 0x69F8, 0xE5CF, 0x6A15,\t0xE5D0, 0x69F1, 0xE5D1, 0x69E4, 0xE5D2, 0x6A20, 0xE5D3, 0x69FF,\n\t0xE5D4, 0x69EC, 0xE5D5, 0x69E2, 0xE5D6, 0x6A1B, 0xE5D7, 0x6A1D,\t0xE5D8, 0x69FE, 0xE5D9, 0x6A27, 0xE5DA, 0x69F2, 0xE5DB, 0x69EE,\n\t0xE5DC, 0x6A14, 0xE5DD, 0x69F7, 0xE5DE, 0x69E7, 0xE5DF, 0x6A40,\t0xE5E0, 0x6A08, 0xE5E1, 0x69E6, 0xE5E2, 0x69FB, 0xE5E3, 0x6A0D,\n\t0xE5E4, 0x69FC, 0xE5E5, 0x69EB, 0xE5E6, 0x6A09, 0xE5E7, 0x6A04,\t0xE5E8, 0x6A18, 0xE5E9, 0x6A25, 0xE5EA, 0x6A0F, 0xE5EB, 0x69F6,\n\t0xE5EC, 0x6A26, 0xE5ED, 0x6A07, 0xE5EE, 0x69F4, 0xE5EF, 0x6A16,\t0xE5F0, 0x6B51, 0xE5F1, 0x6BA5, 0xE5F2, 0x6BA3, 0xE5F3, 0x6BA2,\n\t0xE5F4, 0x6BA6, 0xE5F5, 0x6C01, 0xE5F6, 0x6C00, 0xE5F7, 0x6BFF,\t0xE5F8, 0x6C02, 0xE5F9, 0x6F41, 0xE5FA, 0x6F26, 0xE5FB, 0x6F7E,\n\t0xE5FC, 0x6F87, 0xE5FD, 0x6FC6, 0xE5FE, 0x6F92, 0xE640, 0x6F8D,\t0xE641, 0x6F89, 0xE642, 0x6F8C, 0xE643, 0x6F62, 0xE644, 0x6F4F,\n\t0xE645, 0x6F85, 0xE646, 0x6F5A, 0xE647, 0x6F96, 0xE648, 0x6F76,\t0xE649, 0x6F6C, 0xE64A, 0x6F82, 0xE64B, 0x6F55, 0xE64C, 0x6F72,\n\t0xE64D, 0x6F52, 0xE64E, 0x6F50, 0xE64F, 0x6F57, 0xE650, 0x6F94,\t0xE651, 0x6F93, 0xE652, 0x6F5D, 0xE653, 0x6F00, 0xE654, 0x6F61,\n\t0xE655, 0x6F6B, 0xE656, 0x6F7D, 0xE657, 0x6F67, 0xE658, 0x6F90,\t0xE659, 0x6F53, 0xE65A, 0x6F8B, 0xE65B, 0x6F69, 0xE65C, 0x6F7F,\n\t0xE65D, 0x6F95, 0xE65E, 0x6F63, 0xE65F, 0x6F77, 0xE660, 0x6F6A,\t0xE661, 0x6F7B, 0xE662, 0x71B2, 0xE663, 0x71AF, 0xE664, 0x719B,\n\t0xE665, 0x71B0, 0xE666, 0x71A0, 0xE667, 0x719A, 0xE668, 0x71A9,\t0xE669, 0x71B5, 0xE66A, 0x719D, 0xE66B, 0x71A5, 0xE66C, 0x719E,\n\t0xE66D, 0x71A4, 0xE66E, 0x71A1, 0xE66F, 0x71AA, 0xE670, 0x719C,\t0xE671, 0x71A7, 0xE672, 0x71B3, 0xE673, 0x7298, 0xE674, 0x729A,\n\t0xE675, 0x7358, 0xE676, 0x7352, 0xE677, 0x735E, 0xE678, 0x735F,\t0xE679, 0x7360, 0xE67A, 0x735D, 0xE67B, 0x735B, 0xE67C, 0x7361,\n\t0xE67D, 0x735A, 0xE67E, 0x7359, 0xE6A1, 0x7362, 0xE6A2, 0x7487,\t0xE6A3, 0x7489, 0xE6A4, 0x748A, 0xE6A5, 0x7486, 0xE6A6, 0x7481,\n\t0xE6A7, 0x747D, 0xE6A8, 0x7485, 0xE6A9, 0x7488, 0xE6AA, 0x747C,\t0xE6AB, 0x7479, 0xE6AC, 0x7508, 0xE6AD, 0x7507, 0xE6AE, 0x757E,\n\t0xE6AF, 0x7625, 0xE6B0, 0x761E, 0xE6B1, 0x7619, 0xE6B2, 0x761D,\t0xE6B3, 0x761C, 0xE6B4, 0x7623, 0xE6B5, 0x761A, 0xE6B6, 0x7628,\n\t0xE6B7, 0x761B, 0xE6B8, 0x769C, 0xE6B9, 0x769D, 0xE6BA, 0x769E,\t0xE6BB, 0x769B, 0xE6BC, 0x778D, 0xE6BD, 0x778F, 0xE6BE, 0x7789,\n\t0xE6BF, 0x7788, 0xE6C0, 0x78CD, 0xE6C1, 0x78BB, 0xE6C2, 0x78CF,\t0xE6C3, 0x78CC, 0xE6C4, 0x78D1, 0xE6C5, 0x78CE, 0xE6C6, 0x78D4,\n\t0xE6C7, 0x78C8, 0xE6C8, 0x78C3, 0xE6C9, 0x78C4, 0xE6CA, 0x78C9,\t0xE6CB, 0x799A, 0xE6CC, 0x79A1, 0xE6CD, 0x79A0, 0xE6CE, 0x799C,\n\t0xE6CF, 0x79A2, 0xE6D0, 0x799B, 0xE6D1, 0x6B76, 0xE6D2, 0x7A39,\t0xE6D3, 0x7AB2, 0xE6D4, 0x7AB4, 0xE6D5, 0x7AB3, 0xE6D6, 0x7BB7,\n\t0xE6D7, 0x7BCB, 0xE6D8, 0x7BBE, 0xE6D9, 0x7BAC, 0xE6DA, 0x7BCE,\t0xE6DB, 0x7BAF, 0xE6DC, 0x7BB9, 0xE6DD, 0x7BCA, 0xE6DE, 0x7BB5,\n\t0xE6DF, 0x7CC5, 0xE6E0, 0x7CC8, 0xE6E1, 0x7CCC, 0xE6E2, 0x7CCB,\t0xE6E3, 0x7DF7, 0xE6E4, 0x7DDB, 0xE6E5, 0x7DEA, 0xE6E6, 0x7DE7,\n\t0xE6E7, 0x7DD7, 0xE6E8, 0x7DE1, 0xE6E9, 0x7E03, 0xE6EA, 0x7DFA,\t0xE6EB, 0x7DE6, 0xE6EC, 0x7DF6, 0xE6ED, 0x7DF1, 0xE6EE, 0x7DF0,\n\t0xE6EF, 0x7DEE, 0xE6F0, 0x7DDF, 0xE6F1, 0x7F76, 0xE6F2, 0x7FAC,\t0xE6F3, 0x7FB0, 0xE6F4, 0x7FAD, 0xE6F5, 0x7FED, 0xE6F6, 0x7FEB,\n\t0xE6F7, 0x7FEA, 0xE6F8, 0x7FEC, 0xE6F9, 0x7FE6, 0xE6FA, 0x7FE8,\t0xE6FB, 0x8064, 0xE6FC, 0x8067, 0xE6FD, 0x81A3, 0xE6FE, 0x819F,\n\t0xE740, 0x819E, 0xE741, 0x8195, 0xE742, 0x81A2, 0xE743, 0x8199,\t0xE744, 0x8197, 0xE745, 0x8216, 0xE746, 0x824F, 0xE747, 0x8253,\n\t0xE748, 0x8252, 0xE749, 0x8250, 0xE74A, 0x824E, 0xE74B, 0x8251,\t0xE74C, 0x8524, 0xE74D, 0x853B, 0xE74E, 0x850F, 0xE74F, 0x8500,\n\t0xE750, 0x8529, 0xE751, 0x850E, 0xE752, 0x8509, 0xE753, 0x850D,\t0xE754, 0x851F, 0xE755, 0x850A, 0xE756, 0x8527, 0xE757, 0x851C,\n\t0xE758, 0x84FB, 0xE759, 0x852B, 0xE75A, 0x84FA, 0xE75B, 0x8508,\t0xE75C, 0x850C, 0xE75D, 0x84F4, 0xE75E, 0x852A, 0xE75F, 0x84F2,\n\t0xE760, 0x8515, 0xE761, 0x84F7, 0xE762, 0x84EB, 0xE763, 0x84F3,\t0xE764, 0x84FC, 0xE765, 0x8512, 0xE766, 0x84EA, 0xE767, 0x84E9,\n\t0xE768, 0x8516, 0xE769, 0x84FE, 0xE76A, 0x8528, 0xE76B, 0x851D,\t0xE76C, 0x852E, 0xE76D, 0x8502, 0xE76E, 0x84FD, 0xE76F, 0x851E,\n\t0xE770, 0x84F6, 0xE771, 0x8531, 0xE772, 0x8526, 0xE773, 0x84E7,\t0xE774, 0x84E8, 0xE775, 0x84F0, 0xE776, 0x84EF, 0xE777, 0x84F9,\n\t0xE778, 0x8518, 0xE779, 0x8520, 0xE77A, 0x8530, 0xE77B, 0x850B,\t0xE77C, 0x8519, 0xE77D, 0x852F, 0xE77E, 0x8662, 0xE7A1, 0x8756,\n\t0xE7A2, 0x8763, 0xE7A3, 0x8764, 0xE7A4, 0x8777, 0xE7A5, 0x87E1,\t0xE7A6, 0x8773, 0xE7A7, 0x8758, 0xE7A8, 0x8754, 0xE7A9, 0x875B,\n\t0xE7AA, 0x8752, 0xE7AB, 0x8761, 0xE7AC, 0x875A, 0xE7AD, 0x8751,\t0xE7AE, 0x875E, 0xE7AF, 0x876D, 0xE7B0, 0x876A, 0xE7B1, 0x8750,\n\t0xE7B2, 0x874E, 0xE7B3, 0x875F, 0xE7B4, 0x875D, 0xE7B5, 0x876F,\t0xE7B6, 0x876C, 0xE7B7, 0x877A, 0xE7B8, 0x876E, 0xE7B9, 0x875C,\n\t0xE7BA, 0x8765, 0xE7BB, 0x874F, 0xE7BC, 0x877B, 0xE7BD, 0x8775,\t0xE7BE, 0x8762, 0xE7BF, 0x8767, 0xE7C0, 0x8769, 0xE7C1, 0x885A,\n\t0xE7C2, 0x8905, 0xE7C3, 0x890C, 0xE7C4, 0x8914, 0xE7C5, 0x890B,\t0xE7C6, 0x8917, 0xE7C7, 0x8918, 0xE7C8, 0x8919, 0xE7C9, 0x8906,\n\t0xE7CA, 0x8916, 0xE7CB, 0x8911, 0xE7CC, 0x890E, 0xE7CD, 0x8909,\t0xE7CE, 0x89A2, 0xE7CF, 0x89A4, 0xE7D0, 0x89A3, 0xE7D1, 0x89ED,\n\t0xE7D2, 0x89F0, 0xE7D3, 0x89EC, 0xE7D4, 0x8ACF, 0xE7D5, 0x8AC6,\t0xE7D6, 0x8AB8, 0xE7D7, 0x8AD3, 0xE7D8, 0x8AD1, 0xE7D9, 0x8AD4,\n\t0xE7DA, 0x8AD5, 0xE7DB, 0x8ABB, 0xE7DC, 0x8AD7, 0xE7DD, 0x8ABE,\t0xE7DE, 0x8AC0, 0xE7DF, 0x8AC5, 0xE7E0, 0x8AD8, 0xE7E1, 0x8AC3,\n\t0xE7E2, 0x8ABA, 0xE7E3, 0x8ABD, 0xE7E4, 0x8AD9, 0xE7E5, 0x8C3E,\t0xE7E6, 0x8C4D, 0xE7E7, 0x8C8F, 0xE7E8, 0x8CE5, 0xE7E9, 0x8CDF,\n\t0xE7EA, 0x8CD9, 0xE7EB, 0x8CE8, 0xE7EC, 0x8CDA, 0xE7ED, 0x8CDD,\t0xE7EE, 0x8CE7, 0xE7EF, 0x8DA0, 0xE7F0, 0x8D9C, 0xE7F1, 0x8DA1,\n\t0xE7F2, 0x8D9B, 0xE7F3, 0x8E20, 0xE7F4, 0x8E23, 0xE7F5, 0x8E25,\t0xE7F6, 0x8E24, 0xE7F7, 0x8E2E, 0xE7F8, 0x8E15, 0xE7F9, 0x8E1B,\n\t0xE7FA, 0x8E16, 0xE7FB, 0x8E11, 0xE7FC, 0x8E19, 0xE7FD, 0x8E26,\t0xE7FE, 0x8E27, 0xE840, 0x8E14, 0xE841, 0x8E12, 0xE842, 0x8E18,\n\t0xE843, 0x8E13, 0xE844, 0x8E1C, 0xE845, 0x8E17, 0xE846, 0x8E1A,\t0xE847, 0x8F2C, 0xE848, 0x8F24, 0xE849, 0x8F18, 0xE84A, 0x8F1A,\n\t0xE84B, 0x8F20, 0xE84C, 0x8F23, 0xE84D, 0x8F16, 0xE84E, 0x8F17,\t0xE84F, 0x9073, 0xE850, 0x9070, 0xE851, 0x906F, 0xE852, 0x9067,\n\t0xE853, 0x906B, 0xE854, 0x912F, 0xE855, 0x912B, 0xE856, 0x9129,\t0xE857, 0x912A, 0xE858, 0x9132, 0xE859, 0x9126, 0xE85A, 0x912E,\n\t0xE85B, 0x9185, 0xE85C, 0x9186, 0xE85D, 0x918A, 0xE85E, 0x9181,\t0xE85F, 0x9182, 0xE860, 0x9184, 0xE861, 0x9180, 0xE862, 0x92D0,\n\t0xE863, 0x92C3, 0xE864, 0x92C4, 0xE865, 0x92C0, 0xE866, 0x92D9,\t0xE867, 0x92B6, 0xE868, 0x92CF, 0xE869, 0x92F1, 0xE86A, 0x92DF,\n\t0xE86B, 0x92D8, 0xE86C, 0x92E9, 0xE86D, 0x92D7, 0xE86E, 0x92DD,\t0xE86F, 0x92CC, 0xE870, 0x92EF, 0xE871, 0x92C2, 0xE872, 0x92E8,\n\t0xE873, 0x92CA, 0xE874, 0x92C8, 0xE875, 0x92CE, 0xE876, 0x92E6,\t0xE877, 0x92CD, 0xE878, 0x92D5, 0xE879, 0x92C9, 0xE87A, 0x92E0,\n\t0xE87B, 0x92DE, 0xE87C, 0x92E7, 0xE87D, 0x92D1, 0xE87E, 0x92D3,\t0xE8A1, 0x92B5, 0xE8A2, 0x92E1, 0xE8A3, 0x92C6, 0xE8A4, 0x92B4,\n\t0xE8A5, 0x957C, 0xE8A6, 0x95AC, 0xE8A7, 0x95AB, 0xE8A8, 0x95AE,\t0xE8A9, 0x95B0, 0xE8AA, 0x96A4, 0xE8AB, 0x96A2, 0xE8AC, 0x96D3,\n\t0xE8AD, 0x9705, 0xE8AE, 0x9708, 0xE8AF, 0x9702, 0xE8B0, 0x975A,\t0xE8B1, 0x978A, 0xE8B2, 0x978E, 0xE8B3, 0x9788, 0xE8B4, 0x97D0,\n\t0xE8B5, 0x97CF, 0xE8B6, 0x981E, 0xE8B7, 0x981D, 0xE8B8, 0x9826,\t0xE8B9, 0x9829, 0xE8BA, 0x9828, 0xE8BB, 0x9820, 0xE8BC, 0x981B,\n\t0xE8BD, 0x9827, 0xE8BE, 0x98B2, 0xE8BF, 0x9908, 0xE8C0, 0x98FA,\t0xE8C1, 0x9911, 0xE8C2, 0x9914, 0xE8C3, 0x9916, 0xE8C4, 0x9917,\n\t0xE8C5, 0x9915, 0xE8C6, 0x99DC, 0xE8C7, 0x99CD, 0xE8C8, 0x99CF,\t0xE8C9, 0x99D3, 0xE8CA, 0x99D4, 0xE8CB, 0x99CE, 0xE8CC, 0x99C9,\n\t0xE8CD, 0x99D6, 0xE8CE, 0x99D8, 0xE8CF, 0x99CB, 0xE8D0, 0x99D7,\t0xE8D1, 0x99CC, 0xE8D2, 0x9AB3, 0xE8D3, 0x9AEC, 0xE8D4, 0x9AEB,\n\t0xE8D5, 0x9AF3, 0xE8D6, 0x9AF2, 0xE8D7, 0x9AF1, 0xE8D8, 0x9B46,\t0xE8D9, 0x9B43, 0xE8DA, 0x9B67, 0xE8DB, 0x9B74, 0xE8DC, 0x9B71,\n\t0xE8DD, 0x9B66, 0xE8DE, 0x9B76, 0xE8DF, 0x9B75, 0xE8E0, 0x9B70,\t0xE8E1, 0x9B68, 0xE8E2, 0x9B64, 0xE8E3, 0x9B6C, 0xE8E4, 0x9CFC,\n\t0xE8E5, 0x9CFA, 0xE8E6, 0x9CFD, 0xE8E7, 0x9CFF, 0xE8E8, 0x9CF7,\t0xE8E9, 0x9D07, 0xE8EA, 0x9D00, 0xE8EB, 0x9CF9, 0xE8EC, 0x9CFB,\n\t0xE8ED, 0x9D08, 0xE8EE, 0x9D05, 0xE8EF, 0x9D04, 0xE8F0, 0x9E83,\t0xE8F1, 0x9ED3, 0xE8F2, 0x9F0F, 0xE8F3, 0x9F10, 0xE8F4, 0x511C,\n\t0xE8F5, 0x5113, 0xE8F6, 0x5117, 0xE8F7, 0x511A, 0xE8F8, 0x5111,\t0xE8F9, 0x51DE, 0xE8FA, 0x5334, 0xE8FB, 0x53E1, 0xE8FC, 0x5670,\n\t0xE8FD, 0x5660, 0xE8FE, 0x566E, 0xE940, 0x5673, 0xE941, 0x5666,\t0xE942, 0x5663, 0xE943, 0x566D, 0xE944, 0x5672, 0xE945, 0x565E,\n\t0xE946, 0x5677, 0xE947, 0x571C, 0xE948, 0x571B, 0xE949, 0x58C8,\t0xE94A, 0x58BD, 0xE94B, 0x58C9, 0xE94C, 0x58BF, 0xE94D, 0x58BA,\n\t0xE94E, 0x58C2, 0xE94F, 0x58BC, 0xE950, 0x58C6, 0xE951, 0x5B17,\t0xE952, 0x5B19, 0xE953, 0x5B1B, 0xE954, 0x5B21, 0xE955, 0x5B14,\n\t0xE956, 0x5B13, 0xE957, 0x5B10, 0xE958, 0x5B16, 0xE959, 0x5B28,\t0xE95A, 0x5B1A, 0xE95B, 0x5B20, 0xE95C, 0x5B1E, 0xE95D, 0x5BEF,\n\t0xE95E, 0x5DAC, 0xE95F, 0x5DB1, 0xE960, 0x5DA9, 0xE961, 0x5DA7,\t0xE962, 0x5DB5, 0xE963, 0x5DB0, 0xE964, 0x5DAE, 0xE965, 0x5DAA,\n\t0xE966, 0x5DA8, 0xE967, 0x5DB2, 0xE968, 0x5DAD, 0xE969, 0x5DAF,\t0xE96A, 0x5DB4, 0xE96B, 0x5E67, 0xE96C, 0x5E68, 0xE96D, 0x5E66,\n\t0xE96E, 0x5E6F, 0xE96F, 0x5EE9, 0xE970, 0x5EE7, 0xE971, 0x5EE6,\t0xE972, 0x5EE8, 0xE973, 0x5EE5, 0xE974, 0x5F4B, 0xE975, 0x5FBC,\n\t0xE976, 0x619D, 0xE977, 0x61A8, 0xE978, 0x6196, 0xE979, 0x61C5,\t0xE97A, 0x61B4, 0xE97B, 0x61C6, 0xE97C, 0x61C1, 0xE97D, 0x61CC,\n\t0xE97E, 0x61BA, 0xE9A1, 0x61BF, 0xE9A2, 0x61B8, 0xE9A3, 0x618C,\t0xE9A4, 0x64D7, 0xE9A5, 0x64D6, 0xE9A6, 0x64D0, 0xE9A7, 0x64CF,\n\t0xE9A8, 0x64C9, 0xE9A9, 0x64BD, 0xE9AA, 0x6489, 0xE9AB, 0x64C3,\t0xE9AC, 0x64DB, 0xE9AD, 0x64F3, 0xE9AE, 0x64D9, 0xE9AF, 0x6533,\n\t0xE9B0, 0x657F, 0xE9B1, 0x657C, 0xE9B2, 0x65A2, 0xE9B3, 0x66C8,\t0xE9B4, 0x66BE, 0xE9B5, 0x66C0, 0xE9B6, 0x66CA, 0xE9B7, 0x66CB,\n\t0xE9B8, 0x66CF, 0xE9B9, 0x66BD, 0xE9BA, 0x66BB, 0xE9BB, 0x66BA,\t0xE9BC, 0x66CC, 0xE9BD, 0x6723, 0xE9BE, 0x6A34, 0xE9BF, 0x6A66,\n\t0xE9C0, 0x6A49, 0xE9C1, 0x6A67, 0xE9C2, 0x6A32, 0xE9C3, 0x6A68,\t0xE9C4, 0x6A3E, 0xE9C5, 0x6A5D, 0xE9C6, 0x6A6D, 0xE9C7, 0x6A76,\n\t0xE9C8, 0x6A5B, 0xE9C9, 0x6A51, 0xE9CA, 0x6A28, 0xE9CB, 0x6A5A,\t0xE9CC, 0x6A3B, 0xE9CD, 0x6A3F, 0xE9CE, 0x6A41, 0xE9CF, 0x6A6A,\n\t0xE9D0, 0x6A64, 0xE9D1, 0x6A50, 0xE9D2, 0x6A4F, 0xE9D3, 0x6A54,\t0xE9D4, 0x6A6F, 0xE9D5, 0x6A69, 0xE9D6, 0x6A60, 0xE9D7, 0x6A3C,\n\t0xE9D8, 0x6A5E, 0xE9D9, 0x6A56, 0xE9DA, 0x6A55, 0xE9DB, 0x6A4D,\t0xE9DC, 0x6A4E, 0xE9DD, 0x6A46, 0xE9DE, 0x6B55, 0xE9DF, 0x6B54,\n\t0xE9E0, 0x6B56, 0xE9E1, 0x6BA7, 0xE9E2, 0x6BAA, 0xE9E3, 0x6BAB,\t0xE9E4, 0x6BC8, 0xE9E5, 0x6BC7, 0xE9E6, 0x6C04, 0xE9E7, 0x6C03,\n\t0xE9E8, 0x6C06, 0xE9E9, 0x6FAD, 0xE9EA, 0x6FCB, 0xE9EB, 0x6FA3,\t0xE9EC, 0x6FC7, 0xE9ED, 0x6FBC, 0xE9EE, 0x6FCE, 0xE9EF, 0x6FC8,\n\t0xE9F0, 0x6F5E, 0xE9F1, 0x6FC4, 0xE9F2, 0x6FBD, 0xE9F3, 0x6F9E,\t0xE9F4, 0x6FCA, 0xE9F5, 0x6FA8, 0xE9F6, 0x7004, 0xE9F7, 0x6FA5,\n\t0xE9F8, 0x6FAE, 0xE9F9, 0x6FBA, 0xE9FA, 0x6FAC, 0xE9FB, 0x6FAA,\t0xE9FC, 0x6FCF, 0xE9FD, 0x6FBF, 0xE9FE, 0x6FB8, 0xEA40, 0x6FA2,\n\t0xEA41, 0x6FC9, 0xEA42, 0x6FAB, 0xEA43, 0x6FCD, 0xEA44, 0x6FAF,\t0xEA45, 0x6FB2, 0xEA46, 0x6FB0, 0xEA47, 0x71C5, 0xEA48, 0x71C2,\n\t0xEA49, 0x71BF, 0xEA4A, 0x71B8, 0xEA4B, 0x71D6, 0xEA4C, 0x71C0,\t0xEA4D, 0x71C1, 0xEA4E, 0x71CB, 0xEA4F, 0x71D4, 0xEA50, 0x71CA,\n\t0xEA51, 0x71C7, 0xEA52, 0x71CF, 0xEA53, 0x71BD, 0xEA54, 0x71D8,\t0xEA55, 0x71BC, 0xEA56, 0x71C6, 0xEA57, 0x71DA, 0xEA58, 0x71DB,\n\t0xEA59, 0x729D, 0xEA5A, 0x729E, 0xEA5B, 0x7369, 0xEA5C, 0x7366,\t0xEA5D, 0x7367, 0xEA5E, 0x736C, 0xEA5F, 0x7365, 0xEA60, 0x736B,\n\t0xEA61, 0x736A, 0xEA62, 0x747F, 0xEA63, 0x749A, 0xEA64, 0x74A0,\t0xEA65, 0x7494, 0xEA66, 0x7492, 0xEA67, 0x7495, 0xEA68, 0x74A1,\n\t0xEA69, 0x750B, 0xEA6A, 0x7580, 0xEA6B, 0x762F, 0xEA6C, 0x762D,\t0xEA6D, 0x7631, 0xEA6E, 0x763D, 0xEA6F, 0x7633, 0xEA70, 0x763C,\n\t0xEA71, 0x7635, 0xEA72, 0x7632, 0xEA73, 0x7630, 0xEA74, 0x76BB,\t0xEA75, 0x76E6, 0xEA76, 0x779A, 0xEA77, 0x779D, 0xEA78, 0x77A1,\n\t0xEA79, 0x779C, 0xEA7A, 0x779B, 0xEA7B, 0x77A2, 0xEA7C, 0x77A3,\t0xEA7D, 0x7795, 0xEA7E, 0x7799, 0xEAA1, 0x7797, 0xEAA2, 0x78DD,\n\t0xEAA3, 0x78E9, 0xEAA4, 0x78E5, 0xEAA5, 0x78EA, 0xEAA6, 0x78DE,\t0xEAA7, 0x78E3, 0xEAA8, 0x78DB, 0xEAA9, 0x78E1, 0xEAAA, 0x78E2,\n\t0xEAAB, 0x78ED, 0xEAAC, 0x78DF, 0xEAAD, 0x78E0, 0xEAAE, 0x79A4,\t0xEAAF, 0x7A44, 0xEAB0, 0x7A48, 0xEAB1, 0x7A47, 0xEAB2, 0x7AB6,\n\t0xEAB3, 0x7AB8, 0xEAB4, 0x7AB5, 0xEAB5, 0x7AB1, 0xEAB6, 0x7AB7,\t0xEAB7, 0x7BDE, 0xEAB8, 0x7BE3, 0xEAB9, 0x7BE7, 0xEABA, 0x7BDD,\n\t0xEABB, 0x7BD5, 0xEABC, 0x7BE5, 0xEABD, 0x7BDA, 0xEABE, 0x7BE8,\t0xEABF, 0x7BF9, 0xEAC0, 0x7BD4, 0xEAC1, 0x7BEA, 0xEAC2, 0x7BE2,\n\t0xEAC3, 0x7BDC, 0xEAC4, 0x7BEB, 0xEAC5, 0x7BD8, 0xEAC6, 0x7BDF,\t0xEAC7, 0x7CD2, 0xEAC8, 0x7CD4, 0xEAC9, 0x7CD7, 0xEACA, 0x7CD0,\n\t0xEACB, 0x7CD1, 0xEACC, 0x7E12, 0xEACD, 0x7E21, 0xEACE, 0x7E17,\t0xEACF, 0x7E0C, 0xEAD0, 0x7E1F, 0xEAD1, 0x7E20, 0xEAD2, 0x7E13,\n\t0xEAD3, 0x7E0E, 0xEAD4, 0x7E1C, 0xEAD5, 0x7E15, 0xEAD6, 0x7E1A,\t0xEAD7, 0x7E22, 0xEAD8, 0x7E0B, 0xEAD9, 0x7E0F, 0xEADA, 0x7E16,\n\t0xEADB, 0x7E0D, 0xEADC, 0x7E14, 0xEADD, 0x7E25, 0xEADE, 0x7E24,\t0xEADF, 0x7F43, 0xEAE0, 0x7F7B, 0xEAE1, 0x7F7C, 0xEAE2, 0x7F7A,\n\t0xEAE3, 0x7FB1, 0xEAE4, 0x7FEF, 0xEAE5, 0x802A, 0xEAE6, 0x8029,\t0xEAE7, 0x806C, 0xEAE8, 0x81B1, 0xEAE9, 0x81A6, 0xEAEA, 0x81AE,\n\t0xEAEB, 0x81B9, 0xEAEC, 0x81B5, 0xEAED, 0x81AB, 0xEAEE, 0x81B0,\t0xEAEF, 0x81AC, 0xEAF0, 0x81B4, 0xEAF1, 0x81B2, 0xEAF2, 0x81B7,\n\t0xEAF3, 0x81A7, 0xEAF4, 0x81F2, 0xEAF5, 0x8255, 0xEAF6, 0x8256,\t0xEAF7, 0x8257, 0xEAF8, 0x8556, 0xEAF9, 0x8545, 0xEAFA, 0x856B,\n\t0xEAFB, 0x854D, 0xEAFC, 0x8553, 0xEAFD, 0x8561, 0xEAFE, 0x8558,\t0xEB40, 0x8540, 0xEB41, 0x8546, 0xEB42, 0x8564, 0xEB43, 0x8541,\n\t0xEB44, 0x8562, 0xEB45, 0x8544, 0xEB46, 0x8551, 0xEB47, 0x8547,\t0xEB48, 0x8563, 0xEB49, 0x853E, 0xEB4A, 0x855B, 0xEB4B, 0x8571,\n\t0xEB4C, 0x854E, 0xEB4D, 0x856E, 0xEB4E, 0x8575, 0xEB4F, 0x8555,\t0xEB50, 0x8567, 0xEB51, 0x8560, 0xEB52, 0x858C, 0xEB53, 0x8566,\n\t0xEB54, 0x855D, 0xEB55, 0x8554, 0xEB56, 0x8565, 0xEB57, 0x856C,\t0xEB58, 0x8663, 0xEB59, 0x8665, 0xEB5A, 0x8664, 0xEB5B, 0x879B,\n\t0xEB5C, 0x878F, 0xEB5D, 0x8797, 0xEB5E, 0x8793, 0xEB5F, 0x8792,\t0xEB60, 0x8788, 0xEB61, 0x8781, 0xEB62, 0x8796, 0xEB63, 0x8798,\n\t0xEB64, 0x8779, 0xEB65, 0x8787, 0xEB66, 0x87A3, 0xEB67, 0x8785,\t0xEB68, 0x8790, 0xEB69, 0x8791, 0xEB6A, 0x879D, 0xEB6B, 0x8784,\n\t0xEB6C, 0x8794, 0xEB6D, 0x879C, 0xEB6E, 0x879A, 0xEB6F, 0x8789,\t0xEB70, 0x891E, 0xEB71, 0x8926, 0xEB72, 0x8930, 0xEB73, 0x892D,\n\t0xEB74, 0x892E, 0xEB75, 0x8927, 0xEB76, 0x8931, 0xEB77, 0x8922,\t0xEB78, 0x8929, 0xEB79, 0x8923, 0xEB7A, 0x892F, 0xEB7B, 0x892C,\n\t0xEB7C, 0x891F, 0xEB7D, 0x89F1, 0xEB7E, 0x8AE0, 0xEBA1, 0x8AE2,\t0xEBA2, 0x8AF2, 0xEBA3, 0x8AF4, 0xEBA4, 0x8AF5, 0xEBA5, 0x8ADD,\n\t0xEBA6, 0x8B14, 0xEBA7, 0x8AE4, 0xEBA8, 0x8ADF, 0xEBA9, 0x8AF0,\t0xEBAA, 0x8AC8, 0xEBAB, 0x8ADE, 0xEBAC, 0x8AE1, 0xEBAD, 0x8AE8,\n\t0xEBAE, 0x8AFF, 0xEBAF, 0x8AEF, 0xEBB0, 0x8AFB, 0xEBB1, 0x8C91,\t0xEBB2, 0x8C92, 0xEBB3, 0x8C90, 0xEBB4, 0x8CF5, 0xEBB5, 0x8CEE,\n\t0xEBB6, 0x8CF1, 0xEBB7, 0x8CF0, 0xEBB8, 0x8CF3, 0xEBB9, 0x8D6C,\t0xEBBA, 0x8D6E, 0xEBBB, 0x8DA5, 0xEBBC, 0x8DA7, 0xEBBD, 0x8E33,\n\t0xEBBE, 0x8E3E, 0xEBBF, 0x8E38, 0xEBC0, 0x8E40, 0xEBC1, 0x8E45,\t0xEBC2, 0x8E36, 0xEBC3, 0x8E3C, 0xEBC4, 0x8E3D, 0xEBC5, 0x8E41,\n\t0xEBC6, 0x8E30, 0xEBC7, 0x8E3F, 0xEBC8, 0x8EBD, 0xEBC9, 0x8F36,\t0xEBCA, 0x8F2E, 0xEBCB, 0x8F35, 0xEBCC, 0x8F32, 0xEBCD, 0x8F39,\n\t0xEBCE, 0x8F37, 0xEBCF, 0x8F34, 0xEBD0, 0x9076, 0xEBD1, 0x9079,\t0xEBD2, 0x907B, 0xEBD3, 0x9086, 0xEBD4, 0x90FA, 0xEBD5, 0x9133,\n\t0xEBD6, 0x9135, 0xEBD7, 0x9136, 0xEBD8, 0x9193, 0xEBD9, 0x9190,\t0xEBDA, 0x9191, 0xEBDB, 0x918D, 0xEBDC, 0x918F, 0xEBDD, 0x9327,\n\t0xEBDE, 0x931E, 0xEBDF, 0x9308, 0xEBE0, 0x931F, 0xEBE1, 0x9306,\t0xEBE2, 0x930F, 0xEBE3, 0x937A, 0xEBE4, 0x9338, 0xEBE5, 0x933C,\n\t0xEBE6, 0x931B, 0xEBE7, 0x9323, 0xEBE8, 0x9312, 0xEBE9, 0x9301,\t0xEBEA, 0x9346, 0xEBEB, 0x932D, 0xEBEC, 0x930E, 0xEBED, 0x930D,\n\t0xEBEE, 0x92CB, 0xEBEF, 0x931D, 0xEBF0, 0x92FA, 0xEBF1, 0x9325,\t0xEBF2, 0x9313, 0xEBF3, 0x92F9, 0xEBF4, 0x92F7, 0xEBF5, 0x9334,\n\t0xEBF6, 0x9302, 0xEBF7, 0x9324, 0xEBF8, 0x92FF, 0xEBF9, 0x9329,\t0xEBFA, 0x9339, 0xEBFB, 0x9335, 0xEBFC, 0x932A, 0xEBFD, 0x9314,\n\t0xEBFE, 0x930C, 0xEC40, 0x930B, 0xEC41, 0x92FE, 0xEC42, 0x9309,\t0xEC43, 0x9300, 0xEC44, 0x92FB, 0xEC45, 0x9316, 0xEC46, 0x95BC,\n\t0xEC47, 0x95CD, 0xEC48, 0x95BE, 0xEC49, 0x95B9, 0xEC4A, 0x95BA,\t0xEC4B, 0x95B6, 0xEC4C, 0x95BF, 0xEC4D, 0x95B5, 0xEC4E, 0x95BD,\n\t0xEC4F, 0x96A9, 0xEC50, 0x96D4, 0xEC51, 0x970B, 0xEC52, 0x9712,\t0xEC53, 0x9710, 0xEC54, 0x9799, 0xEC55, 0x9797, 0xEC56, 0x9794,\n\t0xEC57, 0x97F0, 0xEC58, 0x97F8, 0xEC59, 0x9835, 0xEC5A, 0x982F,\t0xEC5B, 0x9832, 0xEC5C, 0x9924, 0xEC5D, 0x991F, 0xEC5E, 0x9927,\n\t0xEC5F, 0x9929, 0xEC60, 0x999E, 0xEC61, 0x99EE, 0xEC62, 0x99EC,\t0xEC63, 0x99E5, 0xEC64, 0x99E4, 0xEC65, 0x99F0, 0xEC66, 0x99E3,\n\t0xEC67, 0x99EA, 0xEC68, 0x99E9, 0xEC69, 0x99E7, 0xEC6A, 0x9AB9,\t0xEC6B, 0x9ABF, 0xEC6C, 0x9AB4, 0xEC6D, 0x9ABB, 0xEC6E, 0x9AF6,\n\t0xEC6F, 0x9AFA, 0xEC70, 0x9AF9, 0xEC71, 0x9AF7, 0xEC72, 0x9B33,\t0xEC73, 0x9B80, 0xEC74, 0x9B85, 0xEC75, 0x9B87, 0xEC76, 0x9B7C,\n\t0xEC77, 0x9B7E, 0xEC78, 0x9B7B, 0xEC79, 0x9B82, 0xEC7A, 0x9B93,\t0xEC7B, 0x9B92, 0xEC7C, 0x9B90, 0xEC7D, 0x9B7A, 0xEC7E, 0x9B95,\n\t0xECA1, 0x9B7D, 0xECA2, 0x9B88, 0xECA3, 0x9D25, 0xECA4, 0x9D17,\t0xECA5, 0x9D20, 0xECA6, 0x9D1E, 0xECA7, 0x9D14, 0xECA8, 0x9D29,\n\t0xECA9, 0x9D1D, 0xECAA, 0x9D18, 0xECAB, 0x9D22, 0xECAC, 0x9D10,\t0xECAD, 0x9D19, 0xECAE, 0x9D1F, 0xECAF, 0x9E88, 0xECB0, 0x9E86,\n\t0xECB1, 0x9E87, 0xECB2, 0x9EAE, 0xECB3, 0x9EAD, 0xECB4, 0x9ED5,\t0xECB5, 0x9ED6, 0xECB6, 0x9EFA, 0xECB7, 0x9F12, 0xECB8, 0x9F3D,\n\t0xECB9, 0x5126, 0xECBA, 0x5125, 0xECBB, 0x5122, 0xECBC, 0x5124,\t0xECBD, 0x5120, 0xECBE, 0x5129, 0xECBF, 0x52F4, 0xECC0, 0x5693,\n\t0xECC1, 0x568C, 0xECC2, 0x568D, 0xECC3, 0x5686, 0xECC4, 0x5684,\t0xECC5, 0x5683, 0xECC6, 0x567E, 0xECC7, 0x5682, 0xECC8, 0x567F,\n\t0xECC9, 0x5681, 0xECCA, 0x58D6, 0xECCB, 0x58D4, 0xECCC, 0x58CF,\t0xECCD, 0x58D2, 0xECCE, 0x5B2D, 0xECCF, 0x5B25, 0xECD0, 0x5B32,\n\t0xECD1, 0x5B23, 0xECD2, 0x5B2C, 0xECD3, 0x5B27, 0xECD4, 0x5B26,\t0xECD5, 0x5B2F, 0xECD6, 0x5B2E, 0xECD7, 0x5B7B, 0xECD8, 0x5BF1,\n\t0xECD9, 0x5BF2, 0xECDA, 0x5DB7, 0xECDB, 0x5E6C, 0xECDC, 0x5E6A,\t0xECDD, 0x5FBE, 0xECDE, 0x5FBB, 0xECDF, 0x61C3, 0xECE0, 0x61B5,\n\t0xECE1, 0x61BC, 0xECE2, 0x61E7, 0xECE3, 0x61E0, 0xECE4, 0x61E5,\t0xECE5, 0x61E4, 0xECE6, 0x61E8, 0xECE7, 0x61DE, 0xECE8, 0x64EF,\n\t0xECE9, 0x64E9, 0xECEA, 0x64E3, 0xECEB, 0x64EB, 0xECEC, 0x64E4,\t0xECED, 0x64E8, 0xECEE, 0x6581, 0xECEF, 0x6580, 0xECF0, 0x65B6,\n\t0xECF1, 0x65DA, 0xECF2, 0x66D2, 0xECF3, 0x6A8D, 0xECF4, 0x6A96,\t0xECF5, 0x6A81, 0xECF6, 0x6AA5, 0xECF7, 0x6A89, 0xECF8, 0x6A9F,\n\t0xECF9, 0x6A9B, 0xECFA, 0x6AA1, 0xECFB, 0x6A9E, 0xECFC, 0x6A87,\t0xECFD, 0x6A93, 0xECFE, 0x6A8E, 0xED40, 0x6A95, 0xED41, 0x6A83,\n\t0xED42, 0x6AA8, 0xED43, 0x6AA4, 0xED44, 0x6A91, 0xED45, 0x6A7F,\t0xED46, 0x6AA6, 0xED47, 0x6A9A, 0xED48, 0x6A85, 0xED49, 0x6A8C,\n\t0xED4A, 0x6A92, 0xED4B, 0x6B5B, 0xED4C, 0x6BAD, 0xED4D, 0x6C09,\t0xED4E, 0x6FCC, 0xED4F, 0x6FA9, 0xED50, 0x6FF4, 0xED51, 0x6FD4,\n\t0xED52, 0x6FE3, 0xED53, 0x6FDC, 0xED54, 0x6FED, 0xED55, 0x6FE7,\t0xED56, 0x6FE6, 0xED57, 0x6FDE, 0xED58, 0x6FF2, 0xED59, 0x6FDD,\n\t0xED5A, 0x6FE2, 0xED5B, 0x6FE8, 0xED5C, 0x71E1, 0xED5D, 0x71F1,\t0xED5E, 0x71E8, 0xED5F, 0x71F2, 0xED60, 0x71E4, 0xED61, 0x71F0,\n\t0xED62, 0x71E2, 0xED63, 0x7373, 0xED64, 0x736E, 0xED65, 0x736F,\t0xED66, 0x7497, 0xED67, 0x74B2, 0xED68, 0x74AB, 0xED69, 0x7490,\n\t0xED6A, 0x74AA, 0xED6B, 0x74AD, 0xED6C, 0x74B1, 0xED6D, 0x74A5,\t0xED6E, 0x74AF, 0xED6F, 0x7510, 0xED70, 0x7511, 0xED71, 0x7512,\n\t0xED72, 0x750F, 0xED73, 0x7584, 0xED74, 0x7643, 0xED75, 0x7648,\t0xED76, 0x7649, 0xED77, 0x7647, 0xED78, 0x76A4, 0xED79, 0x76E9,\n\t0xED7A, 0x77B5, 0xED7B, 0x77AB, 0xED7C, 0x77B2, 0xED7D, 0x77B7,\t0xED7E, 0x77B6, 0xEDA1, 0x77B4, 0xEDA2, 0x77B1, 0xEDA3, 0x77A8,\n\t0xEDA4, 0x77F0, 0xEDA5, 0x78F3, 0xEDA6, 0x78FD, 0xEDA7, 0x7902,\t0xEDA8, 0x78FB, 0xEDA9, 0x78FC, 0xEDAA, 0x78F2, 0xEDAB, 0x7905,\n\t0xEDAC, 0x78F9, 0xEDAD, 0x78FE, 0xEDAE, 0x7904, 0xEDAF, 0x79AB,\t0xEDB0, 0x79A8, 0xEDB1, 0x7A5C, 0xEDB2, 0x7A5B, 0xEDB3, 0x7A56,\n\t0xEDB4, 0x7A58, 0xEDB5, 0x7A54, 0xEDB6, 0x7A5A, 0xEDB7, 0x7ABE,\t0xEDB8, 0x7AC0, 0xEDB9, 0x7AC1, 0xEDBA, 0x7C05, 0xEDBB, 0x7C0F,\n\t0xEDBC, 0x7BF2, 0xEDBD, 0x7C00, 0xEDBE, 0x7BFF, 0xEDBF, 0x7BFB,\t0xEDC0, 0x7C0E, 0xEDC1, 0x7BF4, 0xEDC2, 0x7C0B, 0xEDC3, 0x7BF3,\n\t0xEDC4, 0x7C02, 0xEDC5, 0x7C09, 0xEDC6, 0x7C03, 0xEDC7, 0x7C01,\t0xEDC8, 0x7BF8, 0xEDC9, 0x7BFD, 0xEDCA, 0x7C06, 0xEDCB, 0x7BF0,\n\t0xEDCC, 0x7BF1, 0xEDCD, 0x7C10, 0xEDCE, 0x7C0A, 0xEDCF, 0x7CE8,\t0xEDD0, 0x7E2D, 0xEDD1, 0x7E3C, 0xEDD2, 0x7E42, 0xEDD3, 0x7E33,\n\t0xEDD4, 0x9848, 0xEDD5, 0x7E38, 0xEDD6, 0x7E2A, 0xEDD7, 0x7E49,\t0xEDD8, 0x7E40, 0xEDD9, 0x7E47, 0xEDDA, 0x7E29, 0xEDDB, 0x7E4C,\n\t0xEDDC, 0x7E30, 0xEDDD, 0x7E3B, 0xEDDE, 0x7E36, 0xEDDF, 0x7E44,\t0xEDE0, 0x7E3A, 0xEDE1, 0x7F45, 0xEDE2, 0x7F7F, 0xEDE3, 0x7F7E,\n\t0xEDE4, 0x7F7D, 0xEDE5, 0x7FF4, 0xEDE6, 0x7FF2, 0xEDE7, 0x802C,\t0xEDE8, 0x81BB, 0xEDE9, 0x81C4, 0xEDEA, 0x81CC, 0xEDEB, 0x81CA,\n\t0xEDEC, 0x81C5, 0xEDED, 0x81C7, 0xEDEE, 0x81BC, 0xEDEF, 0x81E9,\t0xEDF0, 0x825B, 0xEDF1, 0x825A, 0xEDF2, 0x825C, 0xEDF3, 0x8583,\n\t0xEDF4, 0x8580, 0xEDF5, 0x858F, 0xEDF6, 0x85A7, 0xEDF7, 0x8595,\t0xEDF8, 0x85A0, 0xEDF9, 0x858B, 0xEDFA, 0x85A3, 0xEDFB, 0x857B,\n\t0xEDFC, 0x85A4, 0xEDFD, 0x859A, 0xEDFE, 0x859E, 0xEE40, 0x8577,\t0xEE41, 0x857C, 0xEE42, 0x8589, 0xEE43, 0x85A1, 0xEE44, 0x857A,\n\t0xEE45, 0x8578, 0xEE46, 0x8557, 0xEE47, 0x858E, 0xEE48, 0x8596,\t0xEE49, 0x8586, 0xEE4A, 0x858D, 0xEE4B, 0x8599, 0xEE4C, 0x859D,\n\t0xEE4D, 0x8581, 0xEE4E, 0x85A2, 0xEE4F, 0x8582, 0xEE50, 0x8588,\t0xEE51, 0x8585, 0xEE52, 0x8579, 0xEE53, 0x8576, 0xEE54, 0x8598,\n\t0xEE55, 0x8590, 0xEE56, 0x859F, 0xEE57, 0x8668, 0xEE58, 0x87BE,\t0xEE59, 0x87AA, 0xEE5A, 0x87AD, 0xEE5B, 0x87C5, 0xEE5C, 0x87B0,\n\t0xEE5D, 0x87AC, 0xEE5E, 0x87B9, 0xEE5F, 0x87B5, 0xEE60, 0x87BC,\t0xEE61, 0x87AE, 0xEE62, 0x87C9, 0xEE63, 0x87C3, 0xEE64, 0x87C2,\n\t0xEE65, 0x87CC, 0xEE66, 0x87B7, 0xEE67, 0x87AF, 0xEE68, 0x87C4,\t0xEE69, 0x87CA, 0xEE6A, 0x87B4, 0xEE6B, 0x87B6, 0xEE6C, 0x87BF,\n\t0xEE6D, 0x87B8, 0xEE6E, 0x87BD, 0xEE6F, 0x87DE, 0xEE70, 0x87B2,\t0xEE71, 0x8935, 0xEE72, 0x8933, 0xEE73, 0x893C, 0xEE74, 0x893E,\n\t0xEE75, 0x8941, 0xEE76, 0x8952, 0xEE77, 0x8937, 0xEE78, 0x8942,\t0xEE79, 0x89AD, 0xEE7A, 0x89AF, 0xEE7B, 0x89AE, 0xEE7C, 0x89F2,\n\t0xEE7D, 0x89F3, 0xEE7E, 0x8B1E, 0xEEA1, 0x8B18, 0xEEA2, 0x8B16,\t0xEEA3, 0x8B11, 0xEEA4, 0x8B05, 0xEEA5, 0x8B0B, 0xEEA6, 0x8B22,\n\t0xEEA7, 0x8B0F, 0xEEA8, 0x8B12, 0xEEA9, 0x8B15, 0xEEAA, 0x8B07,\t0xEEAB, 0x8B0D, 0xEEAC, 0x8B08, 0xEEAD, 0x8B06, 0xEEAE, 0x8B1C,\n\t0xEEAF, 0x8B13, 0xEEB0, 0x8B1A, 0xEEB1, 0x8C4F, 0xEEB2, 0x8C70,\t0xEEB3, 0x8C72, 0xEEB4, 0x8C71, 0xEEB5, 0x8C6F, 0xEEB6, 0x8C95,\n\t0xEEB7, 0x8C94, 0xEEB8, 0x8CF9, 0xEEB9, 0x8D6F, 0xEEBA, 0x8E4E,\t0xEEBB, 0x8E4D, 0xEEBC, 0x8E53, 0xEEBD, 0x8E50, 0xEEBE, 0x8E4C,\n\t0xEEBF, 0x8E47, 0xEEC0, 0x8F43, 0xEEC1, 0x8F40, 0xEEC2, 0x9085,\t0xEEC3, 0x907E, 0xEEC4, 0x9138, 0xEEC5, 0x919A, 0xEEC6, 0x91A2,\n\t0xEEC7, 0x919B, 0xEEC8, 0x9199, 0xEEC9, 0x919F, 0xEECA, 0x91A1,\t0xEECB, 0x919D, 0xEECC, 0x91A0, 0xEECD, 0x93A1, 0xEECE, 0x9383,\n\t0xEECF, 0x93AF, 0xEED0, 0x9364, 0xEED1, 0x9356, 0xEED2, 0x9347,\t0xEED3, 0x937C, 0xEED4, 0x9358, 0xEED5, 0x935C, 0xEED6, 0x9376,\n\t0xEED7, 0x9349, 0xEED8, 0x9350, 0xEED9, 0x9351, 0xEEDA, 0x9360,\t0xEEDB, 0x936D, 0xEEDC, 0x938F, 0xEEDD, 0x934C, 0xEEDE, 0x936A,\n\t0xEEDF, 0x9379, 0xEEE0, 0x9357, 0xEEE1, 0x9355, 0xEEE2, 0x9352,\t0xEEE3, 0x934F, 0xEEE4, 0x9371, 0xEEE5, 0x9377, 0xEEE6, 0x937B,\n\t0xEEE7, 0x9361, 0xEEE8, 0x935E, 0xEEE9, 0x9363, 0xEEEA, 0x9367,\t0xEEEB, 0x9380, 0xEEEC, 0x934E, 0xEEED, 0x9359, 0xEEEE, 0x95C7,\n\t0xEEEF, 0x95C0, 0xEEF0, 0x95C9, 0xEEF1, 0x95C3, 0xEEF2, 0x95C5,\t0xEEF3, 0x95B7, 0xEEF4, 0x96AE, 0xEEF5, 0x96B0, 0xEEF6, 0x96AC,\n\t0xEEF7, 0x9720, 0xEEF8, 0x971F, 0xEEF9, 0x9718, 0xEEFA, 0x971D,\t0xEEFB, 0x9719, 0xEEFC, 0x979A, 0xEEFD, 0x97A1, 0xEEFE, 0x979C,\n\t0xEF40, 0x979E, 0xEF41, 0x979D, 0xEF42, 0x97D5, 0xEF43, 0x97D4,\t0xEF44, 0x97F1, 0xEF45, 0x9841, 0xEF46, 0x9844, 0xEF47, 0x984A,\n\t0xEF48, 0x9849, 0xEF49, 0x9845, 0xEF4A, 0x9843, 0xEF4B, 0x9925,\t0xEF4C, 0x992B, 0xEF4D, 0x992C, 0xEF4E, 0x992A, 0xEF4F, 0x9933,\n\t0xEF50, 0x9932, 0xEF51, 0x992F, 0xEF52, 0x992D, 0xEF53, 0x9931,\t0xEF54, 0x9930, 0xEF55, 0x9998, 0xEF56, 0x99A3, 0xEF57, 0x99A1,\n\t0xEF58, 0x9A02, 0xEF59, 0x99FA, 0xEF5A, 0x99F4, 0xEF5B, 0x99F7,\t0xEF5C, 0x99F9, 0xEF5D, 0x99F8, 0xEF5E, 0x99F6, 0xEF5F, 0x99FB,\n\t0xEF60, 0x99FD, 0xEF61, 0x99FE, 0xEF62, 0x99FC, 0xEF63, 0x9A03,\t0xEF64, 0x9ABE, 0xEF65, 0x9AFE, 0xEF66, 0x9AFD, 0xEF67, 0x9B01,\n\t0xEF68, 0x9AFC, 0xEF69, 0x9B48, 0xEF6A, 0x9B9A, 0xEF6B, 0x9BA8,\t0xEF6C, 0x9B9E, 0xEF6D, 0x9B9B, 0xEF6E, 0x9BA6, 0xEF6F, 0x9BA1,\n\t0xEF70, 0x9BA5, 0xEF71, 0x9BA4, 0xEF72, 0x9B86, 0xEF73, 0x9BA2,\t0xEF74, 0x9BA0, 0xEF75, 0x9BAF, 0xEF76, 0x9D33, 0xEF77, 0x9D41,\n\t0xEF78, 0x9D67, 0xEF79, 0x9D36, 0xEF7A, 0x9D2E, 0xEF7B, 0x9D2F,\t0xEF7C, 0x9D31, 0xEF7D, 0x9D38, 0xEF7E, 0x9D30, 0xEFA1, 0x9D45,\n\t0xEFA2, 0x9D42, 0xEFA3, 0x9D43, 0xEFA4, 0x9D3E, 0xEFA5, 0x9D37,\t0xEFA6, 0x9D40, 0xEFA7, 0x9D3D, 0xEFA8, 0x7FF5, 0xEFA9, 0x9D2D,\n\t0xEFAA, 0x9E8A, 0xEFAB, 0x9E89, 0xEFAC, 0x9E8D, 0xEFAD, 0x9EB0,\t0xEFAE, 0x9EC8, 0xEFAF, 0x9EDA, 0xEFB0, 0x9EFB, 0xEFB1, 0x9EFF,\n\t0xEFB2, 0x9F24, 0xEFB3, 0x9F23, 0xEFB4, 0x9F22, 0xEFB5, 0x9F54,\t0xEFB6, 0x9FA0, 0xEFB7, 0x5131, 0xEFB8, 0x512D, 0xEFB9, 0x512E,\n\t0xEFBA, 0x5698, 0xEFBB, 0x569C, 0xEFBC, 0x5697, 0xEFBD, 0x569A,\t0xEFBE, 0x569D, 0xEFBF, 0x5699, 0xEFC0, 0x5970, 0xEFC1, 0x5B3C,\n\t0xEFC2, 0x5C69, 0xEFC3, 0x5C6A, 0xEFC4, 0x5DC0, 0xEFC5, 0x5E6D,\t0xEFC6, 0x5E6E, 0xEFC7, 0x61D8, 0xEFC8, 0x61DF, 0xEFC9, 0x61ED,\n\t0xEFCA, 0x61EE, 0xEFCB, 0x61F1, 0xEFCC, 0x61EA, 0xEFCD, 0x61F0,\t0xEFCE, 0x61EB, 0xEFCF, 0x61D6, 0xEFD0, 0x61E9, 0xEFD1, 0x64FF,\n\t0xEFD2, 0x6504, 0xEFD3, 0x64FD, 0xEFD4, 0x64F8, 0xEFD5, 0x6501,\t0xEFD6, 0x6503, 0xEFD7, 0x64FC, 0xEFD8, 0x6594, 0xEFD9, 0x65DB,\n\t0xEFDA, 0x66DA, 0xEFDB, 0x66DB, 0xEFDC, 0x66D8, 0xEFDD, 0x6AC5,\t0xEFDE, 0x6AB9, 0xEFDF, 0x6ABD, 0xEFE0, 0x6AE1, 0xEFE1, 0x6AC6,\n\t0xEFE2, 0x6ABA, 0xEFE3, 0x6AB6, 0xEFE4, 0x6AB7, 0xEFE5, 0x6AC7,\t0xEFE6, 0x6AB4, 0xEFE7, 0x6AAD, 0xEFE8, 0x6B5E, 0xEFE9, 0x6BC9,\n\t0xEFEA, 0x6C0B, 0xEFEB, 0x7007, 0xEFEC, 0x700C, 0xEFED, 0x700D,\t0xEFEE, 0x7001, 0xEFEF, 0x7005, 0xEFF0, 0x7014, 0xEFF1, 0x700E,\n\t0xEFF2, 0x6FFF, 0xEFF3, 0x7000, 0xEFF4, 0x6FFB, 0xEFF5, 0x7026,\t0xEFF6, 0x6FFC, 0xEFF7, 0x6FF7, 0xEFF8, 0x700A, 0xEFF9, 0x7201,\n\t0xEFFA, 0x71FF, 0xEFFB, 0x71F9, 0xEFFC, 0x7203, 0xEFFD, 0x71FD,\t0xEFFE, 0x7376, 0xF040, 0x74B8, 0xF041, 0x74C0, 0xF042, 0x74B5,\n\t0xF043, 0x74C1, 0xF044, 0x74BE, 0xF045, 0x74B6, 0xF046, 0x74BB,\t0xF047, 0x74C2, 0xF048, 0x7514, 0xF049, 0x7513, 0xF04A, 0x765C,\n\t0xF04B, 0x7664, 0xF04C, 0x7659, 0xF04D, 0x7650, 0xF04E, 0x7653,\t0xF04F, 0x7657, 0xF050, 0x765A, 0xF051, 0x76A6, 0xF052, 0x76BD,\n\t0xF053, 0x76EC, 0xF054, 0x77C2, 0xF055, 0x77BA, 0xF056, 0x78FF,\t0xF057, 0x790C, 0xF058, 0x7913, 0xF059, 0x7914, 0xF05A, 0x7909,\n\t0xF05B, 0x7910, 0xF05C, 0x7912, 0xF05D, 0x7911, 0xF05E, 0x79AD,\t0xF05F, 0x79AC, 0xF060, 0x7A5F, 0xF061, 0x7C1C, 0xF062, 0x7C29,\n\t0xF063, 0x7C19, 0xF064, 0x7C20, 0xF065, 0x7C1F, 0xF066, 0x7C2D,\t0xF067, 0x7C1D, 0xF068, 0x7C26, 0xF069, 0x7C28, 0xF06A, 0x7C22,\n\t0xF06B, 0x7C25, 0xF06C, 0x7C30, 0xF06D, 0x7E5C, 0xF06E, 0x7E50,\t0xF06F, 0x7E56, 0xF070, 0x7E63, 0xF071, 0x7E58, 0xF072, 0x7E62,\n\t0xF073, 0x7E5F, 0xF074, 0x7E51, 0xF075, 0x7E60, 0xF076, 0x7E57,\t0xF077, 0x7E53, 0xF078, 0x7FB5, 0xF079, 0x7FB3, 0xF07A, 0x7FF7,\n\t0xF07B, 0x7FF8, 0xF07C, 0x8075, 0xF07D, 0x81D1, 0xF07E, 0x81D2,\t0xF0A1, 0x81D0, 0xF0A2, 0x825F, 0xF0A3, 0x825E, 0xF0A4, 0x85B4,\n\t0xF0A5, 0x85C6, 0xF0A6, 0x85C0, 0xF0A7, 0x85C3, 0xF0A8, 0x85C2,\t0xF0A9, 0x85B3, 0xF0AA, 0x85B5, 0xF0AB, 0x85BD, 0xF0AC, 0x85C7,\n\t0xF0AD, 0x85C4, 0xF0AE, 0x85BF, 0xF0AF, 0x85CB, 0xF0B0, 0x85CE,\t0xF0B1, 0x85C8, 0xF0B2, 0x85C5, 0xF0B3, 0x85B1, 0xF0B4, 0x85B6,\n\t0xF0B5, 0x85D2, 0xF0B6, 0x8624, 0xF0B7, 0x85B8, 0xF0B8, 0x85B7,\t0xF0B9, 0x85BE, 0xF0BA, 0x8669, 0xF0BB, 0x87E7, 0xF0BC, 0x87E6,\n\t0xF0BD, 0x87E2, 0xF0BE, 0x87DB, 0xF0BF, 0x87EB, 0xF0C0, 0x87EA,\t0xF0C1, 0x87E5, 0xF0C2, 0x87DF, 0xF0C3, 0x87F3, 0xF0C4, 0x87E4,\n\t0xF0C5, 0x87D4, 0xF0C6, 0x87DC, 0xF0C7, 0x87D3, 0xF0C8, 0x87ED,\t0xF0C9, 0x87D8, 0xF0CA, 0x87E3, 0xF0CB, 0x87A4, 0xF0CC, 0x87D7,\n\t0xF0CD, 0x87D9, 0xF0CE, 0x8801, 0xF0CF, 0x87F4, 0xF0D0, 0x87E8,\t0xF0D1, 0x87DD, 0xF0D2, 0x8953, 0xF0D3, 0x894B, 0xF0D4, 0x894F,\n\t0xF0D5, 0x894C, 0xF0D6, 0x8946, 0xF0D7, 0x8950, 0xF0D8, 0x8951,\t0xF0D9, 0x8949, 0xF0DA, 0x8B2A, 0xF0DB, 0x8B27, 0xF0DC, 0x8B23,\n\t0xF0DD, 0x8B33, 0xF0DE, 0x8B30, 0xF0DF, 0x8B35, 0xF0E0, 0x8B47,\t0xF0E1, 0x8B2F, 0xF0E2, 0x8B3C, 0xF0E3, 0x8B3E, 0xF0E4, 0x8B31,\n\t0xF0E5, 0x8B25, 0xF0E6, 0x8B37, 0xF0E7, 0x8B26, 0xF0E8, 0x8B36,\t0xF0E9, 0x8B2E, 0xF0EA, 0x8B24, 0xF0EB, 0x8B3B, 0xF0EC, 0x8B3D,\n\t0xF0ED, 0x8B3A, 0xF0EE, 0x8C42, 0xF0EF, 0x8C75, 0xF0F0, 0x8C99,\t0xF0F1, 0x8C98, 0xF0F2, 0x8C97, 0xF0F3, 0x8CFE, 0xF0F4, 0x8D04,\n\t0xF0F5, 0x8D02, 0xF0F6, 0x8D00, 0xF0F7, 0x8E5C, 0xF0F8, 0x8E62,\t0xF0F9, 0x8E60, 0xF0FA, 0x8E57, 0xF0FB, 0x8E56, 0xF0FC, 0x8E5E,\n\t0xF0FD, 0x8E65, 0xF0FE, 0x8E67, 0xF140, 0x8E5B, 0xF141, 0x8E5A,\t0xF142, 0x8E61, 0xF143, 0x8E5D, 0xF144, 0x8E69, 0xF145, 0x8E54,\n\t0xF146, 0x8F46, 0xF147, 0x8F47, 0xF148, 0x8F48, 0xF149, 0x8F4B,\t0xF14A, 0x9128, 0xF14B, 0x913A, 0xF14C, 0x913B, 0xF14D, 0x913E,\n\t0xF14E, 0x91A8, 0xF14F, 0x91A5, 0xF150, 0x91A7, 0xF151, 0x91AF,\t0xF152, 0x91AA, 0xF153, 0x93B5, 0xF154, 0x938C, 0xF155, 0x9392,\n\t0xF156, 0x93B7, 0xF157, 0x939B, 0xF158, 0x939D, 0xF159, 0x9389,\t0xF15A, 0x93A7, 0xF15B, 0x938E, 0xF15C, 0x93AA, 0xF15D, 0x939E,\n\t0xF15E, 0x93A6, 0xF15F, 0x9395, 0xF160, 0x9388, 0xF161, 0x9399,\t0xF162, 0x939F, 0xF163, 0x938D, 0xF164, 0x93B1, 0xF165, 0x9391,\n\t0xF166, 0x93B2, 0xF167, 0x93A4, 0xF168, 0x93A8, 0xF169, 0x93B4,\t0xF16A, 0x93A3, 0xF16B, 0x93A5, 0xF16C, 0x95D2, 0xF16D, 0x95D3,\n\t0xF16E, 0x95D1, 0xF16F, 0x96B3, 0xF170, 0x96D7, 0xF171, 0x96DA,\t0xF172, 0x5DC2, 0xF173, 0x96DF, 0xF174, 0x96D8, 0xF175, 0x96DD,\n\t0xF176, 0x9723, 0xF177, 0x9722, 0xF178, 0x9725, 0xF179, 0x97AC,\t0xF17A, 0x97AE, 0xF17B, 0x97A8, 0xF17C, 0x97AB, 0xF17D, 0x97A4,\n\t0xF17E, 0x97AA, 0xF1A1, 0x97A2, 0xF1A2, 0x97A5, 0xF1A3, 0x97D7,\t0xF1A4, 0x97D9, 0xF1A5, 0x97D6, 0xF1A6, 0x97D8, 0xF1A7, 0x97FA,\n\t0xF1A8, 0x9850, 0xF1A9, 0x9851, 0xF1AA, 0x9852, 0xF1AB, 0x98B8,\t0xF1AC, 0x9941, 0xF1AD, 0x993C, 0xF1AE, 0x993A, 0xF1AF, 0x9A0F,\n\t0xF1B0, 0x9A0B, 0xF1B1, 0x9A09, 0xF1B2, 0x9A0D, 0xF1B3, 0x9A04,\t0xF1B4, 0x9A11, 0xF1B5, 0x9A0A, 0xF1B6, 0x9A05, 0xF1B7, 0x9A07,\n\t0xF1B8, 0x9A06, 0xF1B9, 0x9AC0, 0xF1BA, 0x9ADC, 0xF1BB, 0x9B08,\t0xF1BC, 0x9B04, 0xF1BD, 0x9B05, 0xF1BE, 0x9B29, 0xF1BF, 0x9B35,\n\t0xF1C0, 0x9B4A, 0xF1C1, 0x9B4C, 0xF1C2, 0x9B4B, 0xF1C3, 0x9BC7,\t0xF1C4, 0x9BC6, 0xF1C5, 0x9BC3, 0xF1C6, 0x9BBF, 0xF1C7, 0x9BC1,\n\t0xF1C8, 0x9BB5, 0xF1C9, 0x9BB8, 0xF1CA, 0x9BD3, 0xF1CB, 0x9BB6,\t0xF1CC, 0x9BC4, 0xF1CD, 0x9BB9, 0xF1CE, 0x9BBD, 0xF1CF, 0x9D5C,\n\t0xF1D0, 0x9D53, 0xF1D1, 0x9D4F, 0xF1D2, 0x9D4A, 0xF1D3, 0x9D5B,\t0xF1D4, 0x9D4B, 0xF1D5, 0x9D59, 0xF1D6, 0x9D56, 0xF1D7, 0x9D4C,\n\t0xF1D8, 0x9D57, 0xF1D9, 0x9D52, 0xF1DA, 0x9D54, 0xF1DB, 0x9D5F,\t0xF1DC, 0x9D58, 0xF1DD, 0x9D5A, 0xF1DE, 0x9E8E, 0xF1DF, 0x9E8C,\n\t0xF1E0, 0x9EDF, 0xF1E1, 0x9F01, 0xF1E2, 0x9F00, 0xF1E3, 0x9F16,\t0xF1E4, 0x9F25, 0xF1E5, 0x9F2B, 0xF1E6, 0x9F2A, 0xF1E7, 0x9F29,\n\t0xF1E8, 0x9F28, 0xF1E9, 0x9F4C, 0xF1EA, 0x9F55, 0xF1EB, 0x5134,\t0xF1EC, 0x5135, 0xF1ED, 0x5296, 0xF1EE, 0x52F7, 0xF1EF, 0x53B4,\n\t0xF1F0, 0x56AB, 0xF1F1, 0x56AD, 0xF1F2, 0x56A6, 0xF1F3, 0x56A7,\t0xF1F4, 0x56AA, 0xF1F5, 0x56AC, 0xF1F6, 0x58DA, 0xF1F7, 0x58DD,\n\t0xF1F8, 0x58DB, 0xF1F9, 0x5912, 0xF1FA, 0x5B3D, 0xF1FB, 0x5B3E,\t0xF1FC, 0x5B3F, 0xF1FD, 0x5DC3, 0xF1FE, 0x5E70, 0xF240, 0x5FBF,\n\t0xF241, 0x61FB, 0xF242, 0x6507, 0xF243, 0x6510, 0xF244, 0x650D,\t0xF245, 0x6509, 0xF246, 0x650C, 0xF247, 0x650E, 0xF248, 0x6584,\n\t0xF249, 0x65DE, 0xF24A, 0x65DD, 0xF24B, 0x66DE, 0xF24C, 0x6AE7,\t0xF24D, 0x6AE0, 0xF24E, 0x6ACC, 0xF24F, 0x6AD1, 0xF250, 0x6AD9,\n\t0xF251, 0x6ACB, 0xF252, 0x6ADF, 0xF253, 0x6ADC, 0xF254, 0x6AD0,\t0xF255, 0x6AEB, 0xF256, 0x6ACF, 0xF257, 0x6ACD, 0xF258, 0x6ADE,\n\t0xF259, 0x6B60, 0xF25A, 0x6BB0, 0xF25B, 0x6C0C, 0xF25C, 0x7019,\t0xF25D, 0x7027, 0xF25E, 0x7020, 0xF25F, 0x7016, 0xF260, 0x702B,\n\t0xF261, 0x7021, 0xF262, 0x7022, 0xF263, 0x7023, 0xF264, 0x7029,\t0xF265, 0x7017, 0xF266, 0x7024, 0xF267, 0x701C, 0xF268, 0x702A,\n\t0xF269, 0x720C, 0xF26A, 0x720A, 0xF26B, 0x7207, 0xF26C, 0x7202,\t0xF26D, 0x7205, 0xF26E, 0x72A5, 0xF26F, 0x72A6, 0xF270, 0x72A4,\n\t0xF271, 0x72A3, 0xF272, 0x72A1, 0xF273, 0x74CB, 0xF274, 0x74C5,\t0xF275, 0x74B7, 0xF276, 0x74C3, 0xF277, 0x7516, 0xF278, 0x7660,\n\t0xF279, 0x77C9, 0xF27A, 0x77CA, 0xF27B, 0x77C4, 0xF27C, 0x77F1,\t0xF27D, 0x791D, 0xF27E, 0x791B, 0xF2A1, 0x7921, 0xF2A2, 0x791C,\n\t0xF2A3, 0x7917, 0xF2A4, 0x791E, 0xF2A5, 0x79B0, 0xF2A6, 0x7A67,\t0xF2A7, 0x7A68, 0xF2A8, 0x7C33, 0xF2A9, 0x7C3C, 0xF2AA, 0x7C39,\n\t0xF2AB, 0x7C2C, 0xF2AC, 0x7C3B, 0xF2AD, 0x7CEC, 0xF2AE, 0x7CEA,\t0xF2AF, 0x7E76, 0xF2B0, 0x7E75, 0xF2B1, 0x7E78, 0xF2B2, 0x7E70,\n\t0xF2B3, 0x7E77, 0xF2B4, 0x7E6F, 0xF2B5, 0x7E7A, 0xF2B6, 0x7E72,\t0xF2B7, 0x7E74, 0xF2B8, 0x7E68, 0xF2B9, 0x7F4B, 0xF2BA, 0x7F4A,\n\t0xF2BB, 0x7F83, 0xF2BC, 0x7F86, 0xF2BD, 0x7FB7, 0xF2BE, 0x7FFD,\t0xF2BF, 0x7FFE, 0xF2C0, 0x8078, 0xF2C1, 0x81D7, 0xF2C2, 0x81D5,\n\t0xF2C3, 0x8264, 0xF2C4, 0x8261, 0xF2C5, 0x8263, 0xF2C6, 0x85EB,\t0xF2C7, 0x85F1, 0xF2C8, 0x85ED, 0xF2C9, 0x85D9, 0xF2CA, 0x85E1,\n\t0xF2CB, 0x85E8, 0xF2CC, 0x85DA, 0xF2CD, 0x85D7, 0xF2CE, 0x85EC,\t0xF2CF, 0x85F2, 0xF2D0, 0x85F8, 0xF2D1, 0x85D8, 0xF2D2, 0x85DF,\n\t0xF2D3, 0x85E3, 0xF2D4, 0x85DC, 0xF2D5, 0x85D1, 0xF2D6, 0x85F0,\t0xF2D7, 0x85E6, 0xF2D8, 0x85EF, 0xF2D9, 0x85DE, 0xF2DA, 0x85E2,\n\t0xF2DB, 0x8800, 0xF2DC, 0x87FA, 0xF2DD, 0x8803, 0xF2DE, 0x87F6,\t0xF2DF, 0x87F7, 0xF2E0, 0x8809, 0xF2E1, 0x880C, 0xF2E2, 0x880B,\n\t0xF2E3, 0x8806, 0xF2E4, 0x87FC, 0xF2E5, 0x8808, 0xF2E6, 0x87FF,\t0xF2E7, 0x880A, 0xF2E8, 0x8802, 0xF2E9, 0x8962, 0xF2EA, 0x895A,\n\t0xF2EB, 0x895B, 0xF2EC, 0x8957, 0xF2ED, 0x8961, 0xF2EE, 0x895C,\t0xF2EF, 0x8958, 0xF2F0, 0x895D, 0xF2F1, 0x8959, 0xF2F2, 0x8988,\n\t0xF2F3, 0x89B7, 0xF2F4, 0x89B6, 0xF2F5, 0x89F6, 0xF2F6, 0x8B50,\t0xF2F7, 0x8B48, 0xF2F8, 0x8B4A, 0xF2F9, 0x8B40, 0xF2FA, 0x8B53,\n\t0xF2FB, 0x8B56, 0xF2FC, 0x8B54, 0xF2FD, 0x8B4B, 0xF2FE, 0x8B55,\t0xF340, 0x8B51, 0xF341, 0x8B42, 0xF342, 0x8B52, 0xF343, 0x8B57,\n\t0xF344, 0x8C43, 0xF345, 0x8C77, 0xF346, 0x8C76, 0xF347, 0x8C9A,\t0xF348, 0x8D06, 0xF349, 0x8D07, 0xF34A, 0x8D09, 0xF34B, 0x8DAC,\n\t0xF34C, 0x8DAA, 0xF34D, 0x8DAD, 0xF34E, 0x8DAB, 0xF34F, 0x8E6D,\t0xF350, 0x8E78, 0xF351, 0x8E73, 0xF352, 0x8E6A, 0xF353, 0x8E6F,\n\t0xF354, 0x8E7B, 0xF355, 0x8EC2, 0xF356, 0x8F52, 0xF357, 0x8F51,\t0xF358, 0x8F4F, 0xF359, 0x8F50, 0xF35A, 0x8F53, 0xF35B, 0x8FB4,\n\t0xF35C, 0x9140, 0xF35D, 0x913F, 0xF35E, 0x91B0, 0xF35F, 0x91AD,\t0xF360, 0x93DE, 0xF361, 0x93C7, 0xF362, 0x93CF, 0xF363, 0x93C2,\n\t0xF364, 0x93DA, 0xF365, 0x93D0, 0xF366, 0x93F9, 0xF367, 0x93EC,\t0xF368, 0x93CC, 0xF369, 0x93D9, 0xF36A, 0x93A9, 0xF36B, 0x93E6,\n\t0xF36C, 0x93CA, 0xF36D, 0x93D4, 0xF36E, 0x93EE, 0xF36F, 0x93E3,\t0xF370, 0x93D5, 0xF371, 0x93C4, 0xF372, 0x93CE, 0xF373, 0x93C0,\n\t0xF374, 0x93D2, 0xF375, 0x93E7, 0xF376, 0x957D, 0xF377, 0x95DA,\t0xF378, 0x95DB, 0xF379, 0x96E1, 0xF37A, 0x9729, 0xF37B, 0x972B,\n\t0xF37C, 0x972C, 0xF37D, 0x9728, 0xF37E, 0x9726, 0xF3A1, 0x97B3,\t0xF3A2, 0x97B7, 0xF3A3, 0x97B6, 0xF3A4, 0x97DD, 0xF3A5, 0x97DE,\n\t0xF3A6, 0x97DF, 0xF3A7, 0x985C, 0xF3A8, 0x9859, 0xF3A9, 0x985D,\t0xF3AA, 0x9857, 0xF3AB, 0x98BF, 0xF3AC, 0x98BD, 0xF3AD, 0x98BB,\n\t0xF3AE, 0x98BE, 0xF3AF, 0x9948, 0xF3B0, 0x9947, 0xF3B1, 0x9943,\t0xF3B2, 0x99A6, 0xF3B3, 0x99A7, 0xF3B4, 0x9A1A, 0xF3B5, 0x9A15,\n\t0xF3B6, 0x9A25, 0xF3B7, 0x9A1D, 0xF3B8, 0x9A24, 0xF3B9, 0x9A1B,\t0xF3BA, 0x9A22, 0xF3BB, 0x9A20, 0xF3BC, 0x9A27, 0xF3BD, 0x9A23,\n\t0xF3BE, 0x9A1E, 0xF3BF, 0x9A1C, 0xF3C0, 0x9A14, 0xF3C1, 0x9AC2,\t0xF3C2, 0x9B0B, 0xF3C3, 0x9B0A, 0xF3C4, 0x9B0E, 0xF3C5, 0x9B0C,\n\t0xF3C6, 0x9B37, 0xF3C7, 0x9BEA, 0xF3C8, 0x9BEB, 0xF3C9, 0x9BE0,\t0xF3CA, 0x9BDE, 0xF3CB, 0x9BE4, 0xF3CC, 0x9BE6, 0xF3CD, 0x9BE2,\n\t0xF3CE, 0x9BF0, 0xF3CF, 0x9BD4, 0xF3D0, 0x9BD7, 0xF3D1, 0x9BEC,\t0xF3D2, 0x9BDC, 0xF3D3, 0x9BD9, 0xF3D4, 0x9BE5, 0xF3D5, 0x9BD5,\n\t0xF3D6, 0x9BE1, 0xF3D7, 0x9BDA, 0xF3D8, 0x9D77, 0xF3D9, 0x9D81,\t0xF3DA, 0x9D8A, 0xF3DB, 0x9D84, 0xF3DC, 0x9D88, 0xF3DD, 0x9D71,\n\t0xF3DE, 0x9D80, 0xF3DF, 0x9D78, 0xF3E0, 0x9D86, 0xF3E1, 0x9D8B,\t0xF3E2, 0x9D8C, 0xF3E3, 0x9D7D, 0xF3E4, 0x9D6B, 0xF3E5, 0x9D74,\n\t0xF3E6, 0x9D75, 0xF3E7, 0x9D70, 0xF3E8, 0x9D69, 0xF3E9, 0x9D85,\t0xF3EA, 0x9D73, 0xF3EB, 0x9D7B, 0xF3EC, 0x9D82, 0xF3ED, 0x9D6F,\n\t0xF3EE, 0x9D79, 0xF3EF, 0x9D7F, 0xF3F0, 0x9D87, 0xF3F1, 0x9D68,\t0xF3F2, 0x9E94, 0xF3F3, 0x9E91, 0xF3F4, 0x9EC0, 0xF3F5, 0x9EFC,\n\t0xF3F6, 0x9F2D, 0xF3F7, 0x9F40, 0xF3F8, 0x9F41, 0xF3F9, 0x9F4D,\t0xF3FA, 0x9F56, 0xF3FB, 0x9F57, 0xF3FC, 0x9F58, 0xF3FD, 0x5337,\n\t0xF3FE, 0x56B2, 0xF440, 0x56B5, 0xF441, 0x56B3, 0xF442, 0x58E3,\t0xF443, 0x5B45, 0xF444, 0x5DC6, 0xF445, 0x5DC7, 0xF446, 0x5EEE,\n\t0xF447, 0x5EEF, 0xF448, 0x5FC0, 0xF449, 0x5FC1, 0xF44A, 0x61F9,\t0xF44B, 0x6517, 0xF44C, 0x6516, 0xF44D, 0x6515, 0xF44E, 0x6513,\n\t0xF44F, 0x65DF, 0xF450, 0x66E8, 0xF451, 0x66E3, 0xF452, 0x66E4,\t0xF453, 0x6AF3, 0xF454, 0x6AF0, 0xF455, 0x6AEA, 0xF456, 0x6AE8,\n\t0xF457, 0x6AF9, 0xF458, 0x6AF1, 0xF459, 0x6AEE, 0xF45A, 0x6AEF,\t0xF45B, 0x703C, 0xF45C, 0x7035, 0xF45D, 0x702F, 0xF45E, 0x7037,\n\t0xF45F, 0x7034, 0xF460, 0x7031, 0xF461, 0x7042, 0xF462, 0x7038,\t0xF463, 0x703F, 0xF464, 0x703A, 0xF465, 0x7039, 0xF466, 0x7040,\n\t0xF467, 0x703B, 0xF468, 0x7033, 0xF469, 0x7041, 0xF46A, 0x7213,\t0xF46B, 0x7214, 0xF46C, 0x72A8, 0xF46D, 0x737D, 0xF46E, 0x737C,\n\t0xF46F, 0x74BA, 0xF470, 0x76AB, 0xF471, 0x76AA, 0xF472, 0x76BE,\t0xF473, 0x76ED, 0xF474, 0x77CC, 0xF475, 0x77CE, 0xF476, 0x77CF,\n\t0xF477, 0x77CD, 0xF478, 0x77F2, 0xF479, 0x7925, 0xF47A, 0x7923,\t0xF47B, 0x7927, 0xF47C, 0x7928, 0xF47D, 0x7924, 0xF47E, 0x7929,\n\t0xF4A1, 0x79B2, 0xF4A2, 0x7A6E, 0xF4A3, 0x7A6C, 0xF4A4, 0x7A6D,\t0xF4A5, 0x7AF7, 0xF4A6, 0x7C49, 0xF4A7, 0x7C48, 0xF4A8, 0x7C4A,\n\t0xF4A9, 0x7C47, 0xF4AA, 0x7C45, 0xF4AB, 0x7CEE, 0xF4AC, 0x7E7B,\t0xF4AD, 0x7E7E, 0xF4AE, 0x7E81, 0xF4AF, 0x7E80, 0xF4B0, 0x7FBA,\n\t0xF4B1, 0x7FFF, 0xF4B2, 0x8079, 0xF4B3, 0x81DB, 0xF4B4, 0x81D9,\t0xF4B5, 0x820B, 0xF4B6, 0x8268, 0xF4B7, 0x8269, 0xF4B8, 0x8622,\n\t0xF4B9, 0x85FF, 0xF4BA, 0x8601, 0xF4BB, 0x85FE, 0xF4BC, 0x861B,\t0xF4BD, 0x8600, 0xF4BE, 0x85F6, 0xF4BF, 0x8604, 0xF4C0, 0x8609,\n\t0xF4C1, 0x8605, 0xF4C2, 0x860C, 0xF4C3, 0x85FD, 0xF4C4, 0x8819,\t0xF4C5, 0x8810, 0xF4C6, 0x8811, 0xF4C7, 0x8817, 0xF4C8, 0x8813,\n\t0xF4C9, 0x8816, 0xF4CA, 0x8963, 0xF4CB, 0x8966, 0xF4CC, 0x89B9,\t0xF4CD, 0x89F7, 0xF4CE, 0x8B60, 0xF4CF, 0x8B6A, 0xF4D0, 0x8B5D,\n\t0xF4D1, 0x8B68, 0xF4D2, 0x8B63, 0xF4D3, 0x8B65, 0xF4D4, 0x8B67,\t0xF4D5, 0x8B6D, 0xF4D6, 0x8DAE, 0xF4D7, 0x8E86, 0xF4D8, 0x8E88,\n\t0xF4D9, 0x8E84, 0xF4DA, 0x8F59, 0xF4DB, 0x8F56, 0xF4DC, 0x8F57,\t0xF4DD, 0x8F55, 0xF4DE, 0x8F58, 0xF4DF, 0x8F5A, 0xF4E0, 0x908D,\n\t0xF4E1, 0x9143, 0xF4E2, 0x9141, 0xF4E3, 0x91B7, 0xF4E4, 0x91B5,\t0xF4E5, 0x91B2, 0xF4E6, 0x91B3, 0xF4E7, 0x940B, 0xF4E8, 0x9413,\n\t0xF4E9, 0x93FB, 0xF4EA, 0x9420, 0xF4EB, 0x940F, 0xF4EC, 0x9414,\t0xF4ED, 0x93FE, 0xF4EE, 0x9415, 0xF4EF, 0x9410, 0xF4F0, 0x9428,\n\t0xF4F1, 0x9419, 0xF4F2, 0x940D, 0xF4F3, 0x93F5, 0xF4F4, 0x9400,\t0xF4F5, 0x93F7, 0xF4F6, 0x9407, 0xF4F7, 0x940E, 0xF4F8, 0x9416,\n\t0xF4F9, 0x9412, 0xF4FA, 0x93FA, 0xF4FB, 0x9409, 0xF4FC, 0x93F8,\t0xF4FD, 0x940A, 0xF4FE, 0x93FF, 0xF540, 0x93FC, 0xF541, 0x940C,\n\t0xF542, 0x93F6, 0xF543, 0x9411, 0xF544, 0x9406, 0xF545, 0x95DE,\t0xF546, 0x95E0, 0xF547, 0x95DF, 0xF548, 0x972E, 0xF549, 0x972F,\n\t0xF54A, 0x97B9, 0xF54B, 0x97BB, 0xF54C, 0x97FD, 0xF54D, 0x97FE,\t0xF54E, 0x9860, 0xF54F, 0x9862, 0xF550, 0x9863, 0xF551, 0x985F,\n\t0xF552, 0x98C1, 0xF553, 0x98C2, 0xF554, 0x9950, 0xF555, 0x994E,\t0xF556, 0x9959, 0xF557, 0x994C, 0xF558, 0x994B, 0xF559, 0x9953,\n\t0xF55A, 0x9A32, 0xF55B, 0x9A34, 0xF55C, 0x9A31, 0xF55D, 0x9A2C,\t0xF55E, 0x9A2A, 0xF55F, 0x9A36, 0xF560, 0x9A29, 0xF561, 0x9A2E,\n\t0xF562, 0x9A38, 0xF563, 0x9A2D, 0xF564, 0x9AC7, 0xF565, 0x9ACA,\t0xF566, 0x9AC6, 0xF567, 0x9B10, 0xF568, 0x9B12, 0xF569, 0x9B11,\n\t0xF56A, 0x9C0B, 0xF56B, 0x9C08, 0xF56C, 0x9BF7, 0xF56D, 0x9C05,\t0xF56E, 0x9C12, 0xF56F, 0x9BF8, 0xF570, 0x9C40, 0xF571, 0x9C07,\n\t0xF572, 0x9C0E, 0xF573, 0x9C06, 0xF574, 0x9C17, 0xF575, 0x9C14,\t0xF576, 0x9C09, 0xF577, 0x9D9F, 0xF578, 0x9D99, 0xF579, 0x9DA4,\n\t0xF57A, 0x9D9D, 0xF57B, 0x9D92, 0xF57C, 0x9D98, 0xF57D, 0x9D90,\t0xF57E, 0x9D9B, 0xF5A1, 0x9DA0, 0xF5A2, 0x9D94, 0xF5A3, 0x9D9C,\n\t0xF5A4, 0x9DAA, 0xF5A5, 0x9D97, 0xF5A6, 0x9DA1, 0xF5A7, 0x9D9A,\t0xF5A8, 0x9DA2, 0xF5A9, 0x9DA8, 0xF5AA, 0x9D9E, 0xF5AB, 0x9DA3,\n\t0xF5AC, 0x9DBF, 0xF5AD, 0x9DA9, 0xF5AE, 0x9D96, 0xF5AF, 0x9DA6,\t0xF5B0, 0x9DA7, 0xF5B1, 0x9E99, 0xF5B2, 0x9E9B, 0xF5B3, 0x9E9A,\n\t0xF5B4, 0x9EE5, 0xF5B5, 0x9EE4, 0xF5B6, 0x9EE7, 0xF5B7, 0x9EE6,\t0xF5B8, 0x9F30, 0xF5B9, 0x9F2E, 0xF5BA, 0x9F5B, 0xF5BB, 0x9F60,\n\t0xF5BC, 0x9F5E, 0xF5BD, 0x9F5D, 0xF5BE, 0x9F59, 0xF5BF, 0x9F91,\t0xF5C0, 0x513A, 0xF5C1, 0x5139, 0xF5C2, 0x5298, 0xF5C3, 0x5297,\n\t0xF5C4, 0x56C3, 0xF5C5, 0x56BD, 0xF5C6, 0x56BE, 0xF5C7, 0x5B48,\t0xF5C8, 0x5B47, 0xF5C9, 0x5DCB, 0xF5CA, 0x5DCF, 0xF5CB, 0x5EF1,\n\t0xF5CC, 0x61FD, 0xF5CD, 0x651B, 0xF5CE, 0x6B02, 0xF5CF, 0x6AFC,\t0xF5D0, 0x6B03, 0xF5D1, 0x6AF8, 0xF5D2, 0x6B00, 0xF5D3, 0x7043,\n\t0xF5D4, 0x7044, 0xF5D5, 0x704A, 0xF5D6, 0x7048, 0xF5D7, 0x7049,\t0xF5D8, 0x7045, 0xF5D9, 0x7046, 0xF5DA, 0x721D, 0xF5DB, 0x721A,\n\t0xF5DC, 0x7219, 0xF5DD, 0x737E, 0xF5DE, 0x7517, 0xF5DF, 0x766A,\t0xF5E0, 0x77D0, 0xF5E1, 0x792D, 0xF5E2, 0x7931, 0xF5E3, 0x792F,\n\t0xF5E4, 0x7C54, 0xF5E5, 0x7C53, 0xF5E6, 0x7CF2, 0xF5E7, 0x7E8A,\t0xF5E8, 0x7E87, 0xF5E9, 0x7E88, 0xF5EA, 0x7E8B, 0xF5EB, 0x7E86,\n\t0xF5EC, 0x7E8D, 0xF5ED, 0x7F4D, 0xF5EE, 0x7FBB, 0xF5EF, 0x8030,\t0xF5F0, 0x81DD, 0xF5F1, 0x8618, 0xF5F2, 0x862A, 0xF5F3, 0x8626,\n\t0xF5F4, 0x861F, 0xF5F5, 0x8623, 0xF5F6, 0x861C, 0xF5F7, 0x8619,\t0xF5F8, 0x8627, 0xF5F9, 0x862E, 0xF5FA, 0x8621, 0xF5FB, 0x8620,\n\t0xF5FC, 0x8629, 0xF5FD, 0x861E, 0xF5FE, 0x8625, 0xF640, 0x8829,\t0xF641, 0x881D, 0xF642, 0x881B, 0xF643, 0x8820, 0xF644, 0x8824,\n\t0xF645, 0x881C, 0xF646, 0x882B, 0xF647, 0x884A, 0xF648, 0x896D,\t0xF649, 0x8969, 0xF64A, 0x896E, 0xF64B, 0x896B, 0xF64C, 0x89FA,\n\t0xF64D, 0x8B79, 0xF64E, 0x8B78, 0xF64F, 0x8B45, 0xF650, 0x8B7A,\t0xF651, 0x8B7B, 0xF652, 0x8D10, 0xF653, 0x8D14, 0xF654, 0x8DAF,\n\t0xF655, 0x8E8E, 0xF656, 0x8E8C, 0xF657, 0x8F5E, 0xF658, 0x8F5B,\t0xF659, 0x8F5D, 0xF65A, 0x9146, 0xF65B, 0x9144, 0xF65C, 0x9145,\n\t0xF65D, 0x91B9, 0xF65E, 0x943F, 0xF65F, 0x943B, 0xF660, 0x9436,\t0xF661, 0x9429, 0xF662, 0x943D, 0xF663, 0x943C, 0xF664, 0x9430,\n\t0xF665, 0x9439, 0xF666, 0x942A, 0xF667, 0x9437, 0xF668, 0x942C,\t0xF669, 0x9440, 0xF66A, 0x9431, 0xF66B, 0x95E5, 0xF66C, 0x95E4,\n\t0xF66D, 0x95E3, 0xF66E, 0x9735, 0xF66F, 0x973A, 0xF670, 0x97BF,\t0xF671, 0x97E1, 0xF672, 0x9864, 0xF673, 0x98C9, 0xF674, 0x98C6,\n\t0xF675, 0x98C0, 0xF676, 0x9958, 0xF677, 0x9956, 0xF678, 0x9A39,\t0xF679, 0x9A3D, 0xF67A, 0x9A46, 0xF67B, 0x9A44, 0xF67C, 0x9A42,\n\t0xF67D, 0x9A41, 0xF67E, 0x9A3A, 0xF6A1, 0x9A3F, 0xF6A2, 0x9ACD,\t0xF6A3, 0x9B15, 0xF6A4, 0x9B17, 0xF6A5, 0x9B18, 0xF6A6, 0x9B16,\n\t0xF6A7, 0x9B3A, 0xF6A8, 0x9B52, 0xF6A9, 0x9C2B, 0xF6AA, 0x9C1D,\t0xF6AB, 0x9C1C, 0xF6AC, 0x9C2C, 0xF6AD, 0x9C23, 0xF6AE, 0x9C28,\n\t0xF6AF, 0x9C29, 0xF6B0, 0x9C24, 0xF6B1, 0x9C21, 0xF6B2, 0x9DB7,\t0xF6B3, 0x9DB6, 0xF6B4, 0x9DBC, 0xF6B5, 0x9DC1, 0xF6B6, 0x9DC7,\n\t0xF6B7, 0x9DCA, 0xF6B8, 0x9DCF, 0xF6B9, 0x9DBE, 0xF6BA, 0x9DC5,\t0xF6BB, 0x9DC3, 0xF6BC, 0x9DBB, 0xF6BD, 0x9DB5, 0xF6BE, 0x9DCE,\n\t0xF6BF, 0x9DB9, 0xF6C0, 0x9DBA, 0xF6C1, 0x9DAC, 0xF6C2, 0x9DC8,\t0xF6C3, 0x9DB1, 0xF6C4, 0x9DAD, 0xF6C5, 0x9DCC, 0xF6C6, 0x9DB3,\n\t0xF6C7, 0x9DCD, 0xF6C8, 0x9DB2, 0xF6C9, 0x9E7A, 0xF6CA, 0x9E9C,\t0xF6CB, 0x9EEB, 0xF6CC, 0x9EEE, 0xF6CD, 0x9EED, 0xF6CE, 0x9F1B,\n\t0xF6CF, 0x9F18, 0xF6D0, 0x9F1A, 0xF6D1, 0x9F31, 0xF6D2, 0x9F4E,\t0xF6D3, 0x9F65, 0xF6D4, 0x9F64, 0xF6D5, 0x9F92, 0xF6D6, 0x4EB9,\n\t0xF6D7, 0x56C6, 0xF6D8, 0x56C5, 0xF6D9, 0x56CB, 0xF6DA, 0x5971,\t0xF6DB, 0x5B4B, 0xF6DC, 0x5B4C, 0xF6DD, 0x5DD5, 0xF6DE, 0x5DD1,\n\t0xF6DF, 0x5EF2, 0xF6E0, 0x6521, 0xF6E1, 0x6520, 0xF6E2, 0x6526,\t0xF6E3, 0x6522, 0xF6E4, 0x6B0B, 0xF6E5, 0x6B08, 0xF6E6, 0x6B09,\n\t0xF6E7, 0x6C0D, 0xF6E8, 0x7055, 0xF6E9, 0x7056, 0xF6EA, 0x7057,\t0xF6EB, 0x7052, 0xF6EC, 0x721E, 0xF6ED, 0x721F, 0xF6EE, 0x72A9,\n\t0xF6EF, 0x737F, 0xF6F0, 0x74D8, 0xF6F1, 0x74D5, 0xF6F2, 0x74D9,\t0xF6F3, 0x74D7, 0xF6F4, 0x766D, 0xF6F5, 0x76AD, 0xF6F6, 0x7935,\n\t0xF6F7, 0x79B4, 0xF6F8, 0x7A70, 0xF6F9, 0x7A71, 0xF6FA, 0x7C57,\t0xF6FB, 0x7C5C, 0xF6FC, 0x7C59, 0xF6FD, 0x7C5B, 0xF6FE, 0x7C5A,\n\t0xF740, 0x7CF4, 0xF741, 0x7CF1, 0xF742, 0x7E91, 0xF743, 0x7F4F,\t0xF744, 0x7F87, 0xF745, 0x81DE, 0xF746, 0x826B, 0xF747, 0x8634,\n\t0xF748, 0x8635, 0xF749, 0x8633, 0xF74A, 0x862C, 0xF74B, 0x8632,\t0xF74C, 0x8636, 0xF74D, 0x882C, 0xF74E, 0x8828, 0xF74F, 0x8826,\n\t0xF750, 0x882A, 0xF751, 0x8825, 0xF752, 0x8971, 0xF753, 0x89BF,\t0xF754, 0x89BE, 0xF755, 0x89FB, 0xF756, 0x8B7E, 0xF757, 0x8B84,\n\t0xF758, 0x8B82, 0xF759, 0x8B86, 0xF75A, 0x8B85, 0xF75B, 0x8B7F,\t0xF75C, 0x8D15, 0xF75D, 0x8E95, 0xF75E, 0x8E94, 0xF75F, 0x8E9A,\n\t0xF760, 0x8E92, 0xF761, 0x8E90, 0xF762, 0x8E96, 0xF763, 0x8E97,\t0xF764, 0x8F60, 0xF765, 0x8F62, 0xF766, 0x9147, 0xF767, 0x944C,\n\t0xF768, 0x9450, 0xF769, 0x944A, 0xF76A, 0x944B, 0xF76B, 0x944F,\t0xF76C, 0x9447, 0xF76D, 0x9445, 0xF76E, 0x9448, 0xF76F, 0x9449,\n\t0xF770, 0x9446, 0xF771, 0x973F, 0xF772, 0x97E3, 0xF773, 0x986A,\t0xF774, 0x9869, 0xF775, 0x98CB, 0xF776, 0x9954, 0xF777, 0x995B,\n\t0xF778, 0x9A4E, 0xF779, 0x9A53, 0xF77A, 0x9A54, 0xF77B, 0x9A4C,\t0xF77C, 0x9A4F, 0xF77D, 0x9A48, 0xF77E, 0x9A4A, 0xF7A1, 0x9A49,\n\t0xF7A2, 0x9A52, 0xF7A3, 0x9A50, 0xF7A4, 0x9AD0, 0xF7A5, 0x9B19,\t0xF7A6, 0x9B2B, 0xF7A7, 0x9B3B, 0xF7A8, 0x9B56, 0xF7A9, 0x9B55,\n\t0xF7AA, 0x9C46, 0xF7AB, 0x9C48, 0xF7AC, 0x9C3F, 0xF7AD, 0x9C44,\t0xF7AE, 0x9C39, 0xF7AF, 0x9C33, 0xF7B0, 0x9C41, 0xF7B1, 0x9C3C,\n\t0xF7B2, 0x9C37, 0xF7B3, 0x9C34, 0xF7B4, 0x9C32, 0xF7B5, 0x9C3D,\t0xF7B6, 0x9C36, 0xF7B7, 0x9DDB, 0xF7B8, 0x9DD2, 0xF7B9, 0x9DDE,\n\t0xF7BA, 0x9DDA, 0xF7BB, 0x9DCB, 0xF7BC, 0x9DD0, 0xF7BD, 0x9DDC,\t0xF7BE, 0x9DD1, 0xF7BF, 0x9DDF, 0xF7C0, 0x9DE9, 0xF7C1, 0x9DD9,\n\t0xF7C2, 0x9DD8, 0xF7C3, 0x9DD6, 0xF7C4, 0x9DF5, 0xF7C5, 0x9DD5,\t0xF7C6, 0x9DDD, 0xF7C7, 0x9EB6, 0xF7C8, 0x9EF0, 0xF7C9, 0x9F35,\n\t0xF7CA, 0x9F33, 0xF7CB, 0x9F32, 0xF7CC, 0x9F42, 0xF7CD, 0x9F6B,\t0xF7CE, 0x9F95, 0xF7CF, 0x9FA2, 0xF7D0, 0x513D, 0xF7D1, 0x5299,\n\t0xF7D2, 0x58E8, 0xF7D3, 0x58E7, 0xF7D4, 0x5972, 0xF7D5, 0x5B4D,\t0xF7D6, 0x5DD8, 0xF7D7, 0x882F, 0xF7D8, 0x5F4F, 0xF7D9, 0x6201,\n\t0xF7DA, 0x6203, 0xF7DB, 0x6204, 0xF7DC, 0x6529, 0xF7DD, 0x6525,\t0xF7DE, 0x6596, 0xF7DF, 0x66EB, 0xF7E0, 0x6B11, 0xF7E1, 0x6B12,\n\t0xF7E2, 0x6B0F, 0xF7E3, 0x6BCA, 0xF7E4, 0x705B, 0xF7E5, 0x705A,\t0xF7E6, 0x7222, 0xF7E7, 0x7382, 0xF7E8, 0x7381, 0xF7E9, 0x7383,\n\t0xF7EA, 0x7670, 0xF7EB, 0x77D4, 0xF7EC, 0x7C67, 0xF7ED, 0x7C66,\t0xF7EE, 0x7E95, 0xF7EF, 0x826C, 0xF7F0, 0x863A, 0xF7F1, 0x8640,\n\t0xF7F2, 0x8639, 0xF7F3, 0x863C, 0xF7F4, 0x8631, 0xF7F5, 0x863B,\t0xF7F6, 0x863E, 0xF7F7, 0x8830, 0xF7F8, 0x8832, 0xF7F9, 0x882E,\n\t0xF7FA, 0x8833, 0xF7FB, 0x8976, 0xF7FC, 0x8974, 0xF7FD, 0x8973,\t0xF7FE, 0x89FE, 0xF840, 0x8B8C, 0xF841, 0x8B8E, 0xF842, 0x8B8B,\n\t0xF843, 0x8B88, 0xF844, 0x8C45, 0xF845, 0x8D19, 0xF846, 0x8E98,\t0xF847, 0x8F64, 0xF848, 0x8F63, 0xF849, 0x91BC, 0xF84A, 0x9462,\n\t0xF84B, 0x9455, 0xF84C, 0x945D, 0xF84D, 0x9457, 0xF84E, 0x945E,\t0xF84F, 0x97C4, 0xF850, 0x97C5, 0xF851, 0x9800, 0xF852, 0x9A56,\n\t0xF853, 0x9A59, 0xF854, 0x9B1E, 0xF855, 0x9B1F, 0xF856, 0x9B20,\t0xF857, 0x9C52, 0xF858, 0x9C58, 0xF859, 0x9C50, 0xF85A, 0x9C4A,\n\t0xF85B, 0x9C4D, 0xF85C, 0x9C4B, 0xF85D, 0x9C55, 0xF85E, 0x9C59,\t0xF85F, 0x9C4C, 0xF860, 0x9C4E, 0xF861, 0x9DFB, 0xF862, 0x9DF7,\n\t0xF863, 0x9DEF, 0xF864, 0x9DE3, 0xF865, 0x9DEB, 0xF866, 0x9DF8,\t0xF867, 0x9DE4, 0xF868, 0x9DF6, 0xF869, 0x9DE1, 0xF86A, 0x9DEE,\n\t0xF86B, 0x9DE6, 0xF86C, 0x9DF2, 0xF86D, 0x9DF0, 0xF86E, 0x9DE2,\t0xF86F, 0x9DEC, 0xF870, 0x9DF4, 0xF871, 0x9DF3, 0xF872, 0x9DE8,\n\t0xF873, 0x9DED, 0xF874, 0x9EC2, 0xF875, 0x9ED0, 0xF876, 0x9EF2,\t0xF877, 0x9EF3, 0xF878, 0x9F06, 0xF879, 0x9F1C, 0xF87A, 0x9F38,\n\t0xF87B, 0x9F37, 0xF87C, 0x9F36, 0xF87D, 0x9F43, 0xF87E, 0x9F4F,\t0xF8A1, 0x9F71, 0xF8A2, 0x9F70, 0xF8A3, 0x9F6E, 0xF8A4, 0x9F6F,\n\t0xF8A5, 0x56D3, 0xF8A6, 0x56CD, 0xF8A7, 0x5B4E, 0xF8A8, 0x5C6D,\t0xF8A9, 0x652D, 0xF8AA, 0x66ED, 0xF8AB, 0x66EE, 0xF8AC, 0x6B13,\n\t0xF8AD, 0x705F, 0xF8AE, 0x7061, 0xF8AF, 0x705D, 0xF8B0, 0x7060,\t0xF8B1, 0x7223, 0xF8B2, 0x74DB, 0xF8B3, 0x74E5, 0xF8B4, 0x77D5,\n\t0xF8B5, 0x7938, 0xF8B6, 0x79B7, 0xF8B7, 0x79B6, 0xF8B8, 0x7C6A,\t0xF8B9, 0x7E97, 0xF8BA, 0x7F89, 0xF8BB, 0x826D, 0xF8BC, 0x8643,\n\t0xF8BD, 0x8838, 0xF8BE, 0x8837, 0xF8BF, 0x8835, 0xF8C0, 0x884B,\t0xF8C1, 0x8B94, 0xF8C2, 0x8B95, 0xF8C3, 0x8E9E, 0xF8C4, 0x8E9F,\n\t0xF8C5, 0x8EA0, 0xF8C6, 0x8E9D, 0xF8C7, 0x91BE, 0xF8C8, 0x91BD,\t0xF8C9, 0x91C2, 0xF8CA, 0x946B, 0xF8CB, 0x9468, 0xF8CC, 0x9469,\n\t0xF8CD, 0x96E5, 0xF8CE, 0x9746, 0xF8CF, 0x9743, 0xF8D0, 0x9747,\t0xF8D1, 0x97C7, 0xF8D2, 0x97E5, 0xF8D3, 0x9A5E, 0xF8D4, 0x9AD5,\n\t0xF8D5, 0x9B59, 0xF8D6, 0x9C63, 0xF8D7, 0x9C67, 0xF8D8, 0x9C66,\t0xF8D9, 0x9C62, 0xF8DA, 0x9C5E, 0xF8DB, 0x9C60, 0xF8DC, 0x9E02,\n\t0xF8DD, 0x9DFE, 0xF8DE, 0x9E07, 0xF8DF, 0x9E03, 0xF8E0, 0x9E06,\t0xF8E1, 0x9E05, 0xF8E2, 0x9E00, 0xF8E3, 0x9E01, 0xF8E4, 0x9E09,\n\t0xF8E5, 0x9DFF, 0xF8E6, 0x9DFD, 0xF8E7, 0x9E04, 0xF8E8, 0x9EA0,\t0xF8E9, 0x9F1E, 0xF8EA, 0x9F46, 0xF8EB, 0x9F74, 0xF8EC, 0x9F75,\n\t0xF8ED, 0x9F76, 0xF8EE, 0x56D4, 0xF8EF, 0x652E, 0xF8F0, 0x65B8,\t0xF8F1, 0x6B18, 0xF8F2, 0x6B19, 0xF8F3, 0x6B17, 0xF8F4, 0x6B1A,\n\t0xF8F5, 0x7062, 0xF8F6, 0x7226, 0xF8F7, 0x72AA, 0xF8F8, 0x77D8,\t0xF8F9, 0x77D9, 0xF8FA, 0x7939, 0xF8FB, 0x7C69, 0xF8FC, 0x7C6B,\n\t0xF8FD, 0x7CF6, 0xF8FE, 0x7E9A, 0xF940, 0x7E98, 0xF941, 0x7E9B,\t0xF942, 0x7E99, 0xF943, 0x81E0, 0xF944, 0x81E1, 0xF945, 0x8646,\n\t0xF946, 0x8647, 0xF947, 0x8648, 0xF948, 0x8979, 0xF949, 0x897A,\t0xF94A, 0x897C, 0xF94B, 0x897B, 0xF94C, 0x89FF, 0xF94D, 0x8B98,\n\t0xF94E, 0x8B99, 0xF94F, 0x8EA5, 0xF950, 0x8EA4, 0xF951, 0x8EA3,\t0xF952, 0x946E, 0xF953, 0x946D, 0xF954, 0x946F, 0xF955, 0x9471,\n\t0xF956, 0x9473, 0xF957, 0x9749, 0xF958, 0x9872, 0xF959, 0x995F,\t0xF95A, 0x9C68, 0xF95B, 0x9C6E, 0xF95C, 0x9C6D, 0xF95D, 0x9E0B,\n\t0xF95E, 0x9E0D, 0xF95F, 0x9E10, 0xF960, 0x9E0F, 0xF961, 0x9E12,\t0xF962, 0x9E11, 0xF963, 0x9EA1, 0xF964, 0x9EF5, 0xF965, 0x9F09,\n\t0xF966, 0x9F47, 0xF967, 0x9F78, 0xF968, 0x9F7B, 0xF969, 0x9F7A,\t0xF96A, 0x9F79, 0xF96B, 0x571E, 0xF96C, 0x7066, 0xF96D, 0x7C6F,\n\t0xF96E, 0x883C, 0xF96F, 0x8DB2, 0xF970, 0x8EA6, 0xF971, 0x91C3,\t0xF972, 0x9474, 0xF973, 0x9478, 0xF974, 0x9476, 0xF975, 0x9475,\n\t0xF976, 0x9A60, 0xF977, 0x9C74, 0xF978, 0x9C73, 0xF979, 0x9C71,\t0xF97A, 0x9C75, 0xF97B, 0x9E14, 0xF97C, 0x9E13, 0xF97D, 0x9EF6,\n\t0xF97E, 0x9F0A, 0xF9A1, 0x9FA4, 0xF9A2, 0x7068, 0xF9A3, 0x7065,\t0xF9A4, 0x7CF7, 0xF9A5, 0x866A, 0xF9A6, 0x883E, 0xF9A7, 0x883D,\n\t0xF9A8, 0x883F, 0xF9A9, 0x8B9E, 0xF9AA, 0x8C9C, 0xF9AB, 0x8EA9,\t0xF9AC, 0x8EC9, 0xF9AD, 0x974B, 0xF9AE, 0x9873, 0xF9AF, 0x9874,\n\t0xF9B0, 0x98CC, 0xF9B1, 0x9961, 0xF9B2, 0x99AB, 0xF9B3, 0x9A64,\t0xF9B4, 0x9A66, 0xF9B5, 0x9A67, 0xF9B6, 0x9B24, 0xF9B7, 0x9E15,\n\t0xF9B8, 0x9E17, 0xF9B9, 0x9F48, 0xF9BA, 0x6207, 0xF9BB, 0x6B1E,\t0xF9BC, 0x7227, 0xF9BD, 0x864C, 0xF9BE, 0x8EA8, 0xF9BF, 0x9482,\n\t0xF9C0, 0x9480, 0xF9C1, 0x9481, 0xF9C2, 0x9A69, 0xF9C3, 0x9A68,\t0xF9C4, 0x9B2E, 0xF9C5, 0x9E19, 0xF9C6, 0x7229, 0xF9C7, 0x864B,\n\t0xF9C8, 0x8B9F, 0xF9C9, 0x9483, 0xF9CA, 0x9C79, 0xF9CB, 0x9EB7,\t0xF9CC, 0x7675, 0xF9CD, 0x9A6B, 0xF9CE, 0x9C7A, 0xF9CF, 0x9E1D,\n\t0xF9D0, 0x7069, 0xF9D1, 0x706A, 0xF9D2, 0x9EA4, 0xF9D3, 0x9F7E,\t0xF9D4, 0x9F49, 0xF9D5, 0x9F98, 0xF9D6, 0x7881, 0xF9D7, 0x92B9,\n\t0xF9D8, 0x88CF, 0xF9D9, 0x58BB, 0xF9DA, 0x6052, 0xF9DB, 0x7CA7,\t0xF9DC, 0x5AFA, 0xF9DD, 0x2554, 0xF9DE, 0x2566, 0xF9DF, 0x2557,\n\t0xF9E0, 0x2560, 0xF9E1, 0x256C, 0xF9E2, 0x2563, 0xF9E3, 0x255A,\t0xF9E4, 0x2569, 0xF9E5, 0x255D, 0xF9E6, 0x2552, 0xF9E7, 0x2564,\n\t0xF9E8, 0x2555, 0xF9E9, 0x255E, 0xF9EA, 0x256A, 0xF9EB, 0x2561,\t0xF9EC, 0x2558, 0xF9ED, 0x2567, 0xF9EE, 0x255B, 0xF9EF, 0x2553,\n\t0xF9F0, 0x2565, 0xF9F1, 0x2556, 0xF9F2, 0x255F, 0xF9F3, 0x256B,\t0xF9F4, 0x2562, 0xF9F5, 0x2559, 0xF9F6, 0x2568, 0xF9F7, 0x255C,\n\t0xF9F8, 0x2551, 0xF9F9, 0x2550, 0xF9FA, 0x256D, 0xF9FB, 0x256E,\t0xF9FC, 0x2570, 0xF9FD, 0x256F, 0xF9FE, 0x2593, 0, 0\n};\n#endif\n\n#if FF_CODE_PAGE == 437 || FF_CODE_PAGE == 0\nstatic const WCHAR uc437[] = {\t/*  CP437(U.S.) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 720 || FF_CODE_PAGE == 0\nstatic const WCHAR uc720[] = {\t/*  CP720(Arabic) to Unicode conversion table */\n\t0x0000, 0x0000, 0x00E9, 0x00E2, 0x0000, 0x00E0, 0x0000, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0000, 0x0000, 0x0000,\n\t0x0000, 0x0651, 0x0652, 0x00F4, 0x00A4, 0x0640, 0x00FB, 0x00F9, 0x0621, 0x0622, 0x0623, 0x0624, 0x00A3, 0x0625, 0x0626, 0x0627,\n\t0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0641, 0x00B5, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A,\n\t0x2261, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 0x0650, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 737 || FF_CODE_PAGE == 0\nstatic const WCHAR uc737[] = {\t/*  CP737(Greek) to Unicode conversion table */\n\t0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, 0x03A0,\n\t0x03A1, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8,\n\t0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03C9, 0x03AC, 0x03AD, 0x03AE, 0x03CA, 0x03AF, 0x03CC, 0x03CD, 0x03CB, 0x03CE, 0x0386, 0x0388, 0x0389, 0x038A, 0x038C, 0x038E,\n\t0x038F, 0x00B1, 0x2265, 0x2264, 0x03AA, 0x03AB, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 771 || FF_CODE_PAGE == 0\nstatic const WCHAR uc771[] = {\t/*  CP771(KBL) to Unicode conversion table */\n\t0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,\n\t0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,\n\t0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x0104, 0x0105, 0x010C, 0x010D,\n\t0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,\n\t0x0118, 0x0119, 0x0116, 0x0117, 0x012E, 0x012F, 0x0160, 0x0161, 0x0172, 0x0173, 0x016A, 0x016B, 0x017D, 0x017E, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 775 || FF_CODE_PAGE == 0\nstatic const WCHAR uc775[] = {\t/*  CP775(Baltic) to Unicode conversion table */\n\t0x0106, 0x00FC, 0x00E9, 0x0101, 0x00E4, 0x0123, 0x00E5, 0x0107, 0x0142, 0x0113, 0x0156, 0x0157, 0x012B, 0x0179, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x014D, 0x00F6, 0x0122, 0x00A2, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x00A4,\n\t0x0100, 0x012A, 0x00F3, 0x017B, 0x017C, 0x017A, 0x201D, 0x00A6, 0x00A9, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x0141, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0104, 0x010C, 0x0118, 0x0116, 0x2563, 0x2551, 0x2557, 0x255D, 0x012E, 0x0160, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0172, 0x016A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x017D,\n\t0x0105, 0x010D, 0x0119, 0x0117, 0x012F, 0x0161, 0x0173, 0x016B, 0x017E, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x00D3, 0x00DF, 0x014C, 0x0143, 0x00F5, 0x00D5, 0x00B5, 0x0144, 0x0136, 0x0137, 0x013B, 0x013C, 0x0146, 0x0112, 0x0145, 0x2019,\n\t0x00AD, 0x00B1, 0x201C, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x201E, 0x00B0, 0x2219, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 850 || FF_CODE_PAGE == 0\nstatic const WCHAR uc850[] = {\t/*  CP850(Latin 1) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x00D7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,\n\t0x00F0, 0x00D0, 0x00CA, 0x00CB, 0x00C8, 0x0131, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,\n\t0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x00FE, 0x00DE, 0x00DA, 0x00DB, 0x00D9, 0x00FD, 0x00DD, 0x00AF, 0x00B4,\n\t0x00AD, 0x00B1, 0x2017, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 852 || FF_CODE_PAGE == 0\nstatic const WCHAR uc852[] = {\t/*  CP852(Latin 2) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x016F, 0x0107, 0x00E7, 0x0142, 0x00EB, 0x0150, 0x0151, 0x00EE, 0x0179, 0x00C4, 0x0106,\n\t0x00C9, 0x0139, 0x013A, 0x00F4, 0x00F6, 0x013D, 0x013E, 0x015A, 0x015B, 0x00D6, 0x00DC, 0x0164, 0x0165, 0x0141, 0x00D7, 0x010D,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x0104, 0x0105, 0x017D, 0x017E, 0x0118, 0x0119, 0x00AC, 0x017A, 0x010C, 0x015F, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x011A, 0x015E, 0x2563, 0x2551, 0x2557, 0x255D, 0x017B, 0x017C, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0102, 0x0103, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,\n\t0x0111, 0x0110, 0x010E, 0x00CB, 0x010F, 0x0147, 0x00CD, 0x00CE, 0x011B, 0x2518, 0x250C, 0x2588, 0x2584, 0x0162, 0x016E, 0x2580,\n\t0x00D3, 0x00DF, 0x00D4, 0x0143, 0x0144, 0x0148, 0x0160, 0x0161, 0x0154, 0x00DA, 0x0155, 0x0170, 0x00FD, 0x00DD, 0x0163, 0x00B4,\n\t0x00AD, 0x02DD, 0x02DB, 0x02C7, 0x02D8, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x02D9, 0x0171, 0x0158, 0x0159, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 855 || FF_CODE_PAGE == 0\nstatic const WCHAR uc855[] = {\t/*  CP855(Cyrillic) to Unicode conversion table */\n\t0x0452, 0x0402, 0x0453, 0x0403, 0x0451, 0x0401, 0x0454, 0x0404, 0x0455, 0x0405, 0x0456, 0x0406, 0x0457, 0x0407, 0x0458, 0x0408,\n\t0x0459, 0x0409, 0x045A, 0x040A, 0x045B, 0x040B, 0x045C, 0x040C, 0x045E, 0x040E, 0x045F, 0x040F, 0x044E, 0x042E, 0x044A, 0x042A,\n\t0x0430, 0x0410, 0x0431, 0x0411, 0x0446, 0x0426, 0x0434, 0x0414, 0x0435, 0x0415, 0x0444, 0x0424, 0x0433, 0x0413, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x0445, 0x0425, 0x0438, 0x0418, 0x2563, 0x2551, 0x2557, 0x255D, 0x0439, 0x0419, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x043A, 0x041A, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,\n\t0x043B, 0x041B, 0x043C, 0x041C, 0x043D, 0x041D, 0x043E, 0x041E, 0x043F, 0x2518, 0x250C, 0x2588, 0x2584, 0x041F, 0x044F, 0x2580,\n\t0x042F, 0x0440, 0x0420, 0x0441, 0x0421, 0x0442, 0x0422, 0x0443, 0x0423, 0x0436, 0x0416, 0x0432, 0x0412, 0x044C, 0x042C, 0x2116,\n\t0x00AD, 0x044B, 0x042B, 0x0437, 0x0417, 0x0448, 0x0428, 0x044D, 0x042D, 0x0449, 0x0429, 0x0447, 0x0427, 0x00A7, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 857 || FF_CODE_PAGE == 0\nstatic const WCHAR uc857[] = {\t/*  CP857(Turkish) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x0131, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x0130, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x015E, 0x015F,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x011E, 0x011F, 0x00BF, 0x00AE, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x00C1, 0x00C2, 0x00C0, 0x00A9, 0x2563, 0x2551, 0x2557, 0x255D, 0x00A2, 0x00A5, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x00E3, 0x00C3, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x00A4,\n\t0x00BA, 0x00AA, 0x00CA, 0x00CB, 0x00C8, 0x0000, 0x00CD, 0x00CE, 0x00CF, 0x2518, 0x250C, 0x2588, 0x2584, 0x00A6, 0x00CC, 0x2580,\n\t0x00D3, 0x00DF, 0x00D4, 0x00D2, 0x00F5, 0x00D5, 0x00B5, 0x0000, 0x00D7, 0x00DA, 0x00DB, 0x00D9, 0x00EC, 0x00FF, 0x00AF, 0x00B4,\n\t0x00AD, 0x00B1, 0x0000, 0x00BE, 0x00B6, 0x00A7, 0x00F7, 0x00B8, 0x00B0, 0x00A8, 0x00B7, 0x00B9, 0x00B3, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 860 || FF_CODE_PAGE == 0\nstatic const WCHAR uc860[] = {\t/*  CP860(Portuguese) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E3, 0x00E0, 0x00C1, 0x00E7, 0x00EA, 0x00CA, 0x00E8, 0x00CD, 0x00D4, 0x00EC, 0x00C3, 0x00C2,\n\t0x00C9, 0x00C0, 0x00C8, 0x00F4, 0x00F5, 0x00F2, 0x00DA, 0x00F9, 0x00CC, 0x00D5, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x20A7, 0x00D3,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x00D2, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 861 || FF_CODE_PAGE == 0\nstatic const WCHAR uc861[] = {\t/*  CP861(Icelandic) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00D0, 0x00F0, 0x00DE, 0x00C4, 0x00C5,\n\t0x00C9, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00FE, 0x00FB, 0x00DD, 0x00FD, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00C1, 0x00CD, 0x00D3, 0x00DA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 862 || FF_CODE_PAGE == 0\nstatic const WCHAR uc862[] = {\t/*  CP862(Hebrew) to Unicode conversion table */\n\t0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,\n\t0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x00A2, 0x00A3, 0x00A5, 0x20A7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 863 || FF_CODE_PAGE == 0\nstatic const WCHAR uc863[] = {\t/*  CP863(Canadian French) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00C2, 0x00E0, 0x00B6, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x2017, 0x00C0,\n\t0x00C9, 0x00C8, 0x00CA, 0x00F4, 0x00CB, 0x00CF, 0x00FB, 0x00F9, 0x00A4, 0x00D4, 0x00DC, 0x00A2, 0x00A3, 0x00D9, 0x00DB, 0x0192,\n\t0x00A6, 0x00B4, 0x00F3, 0x00FA, 0x00A8, 0x00BB, 0x00B3, 0x00AF, 0x00CE, 0x3210, 0x00AC, 0x00BD, 0x00BC, 0x00BE, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2219,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 864 || FF_CODE_PAGE == 0\nstatic const WCHAR uc864[] = {\t/*  CP864(Arabic) to Unicode conversion table */\n\t0x00B0, 0x00B7, 0x2219, 0x221A, 0x2592, 0x2500, 0x2502, 0x253C, 0x2524, 0x252C, 0x251C, 0x2534, 0x2510, 0x250C, 0x2514, 0x2518,\n\t0x03B2, 0x221E, 0x03C6, 0x00B1, 0x00BD, 0x00BC, 0x2248, 0x00AB, 0x00BB, 0xFEF7, 0xFEF8, 0x0000, 0x0000, 0xFEFB, 0xFEFC, 0x0000,\n\t0x00A0, 0x00AD, 0xFE82, 0x00A3, 0x00A4, 0xFE84, 0x0000, 0x20AC, 0xFE8E, 0xFE8F, 0xFE95, 0xFE99, 0x060C, 0xFE9D, 0xFEA1, 0xFEA5,\n\t0x0660, 0x0661, 0x0662, 0x0663, 0x0664, 0x0665, 0x0666, 0x0667, 0x0668, 0x0669, 0xFED1, 0x061B, 0xFEB1, 0xFEB5, 0xFEB9, 0x061F,\n\t0x00A2, 0xFE80, 0xFE81, 0xFE83, 0xFE85, 0xFECA, 0xFE8B, 0xFE8D, 0xFE91, 0xFE93, 0xFE97, 0xFE9B, 0xFE9F, 0xFEA3, 0xFEA7, 0xFEA9,\n\t0xFEAB, 0xFEAD, 0xFEAF, 0xFEB3, 0xFEB7, 0xFEBB, 0xFEBF, 0xFEC1, 0xFEC5, 0xFECB, 0xFECF, 0x00A6, 0x00AC, 0x00F7, 0x00D7, 0xFEC9,\n\t0x0640, 0xFED3, 0xFED7, 0xFEDB, 0xFEDF, 0xFEE3, 0xFEE7, 0xFEEB, 0xFEED, 0xFEEF, 0xFEF3, 0xFEBD, 0xFECC, 0xFECE, 0xFECD, 0xFEE1,\n\t0xFE7D, 0x0651, 0xFEE5, 0xFEE9, 0xFEEC, 0xFEF0, 0xFEF2, 0xFED0, 0xFED5, 0xFEF5, 0xFEF6, 0xFEDD, 0xFED9, 0xFEF1, 0x25A0, 0x0000\n};\n#endif\n#if FF_CODE_PAGE == 865 || FF_CODE_PAGE == 0\nstatic const WCHAR uc865[] = {\t/*  CP865(Nordic) to Unicode conversion table */\n\t0x00C7, 0x00FC, 0x00E9, 0x00E2, 0x00E4, 0x00E0, 0x00E5, 0x00E7, 0x00EA, 0x00EB, 0x00E8, 0x00EF, 0x00EE, 0x00EC, 0x00C4, 0x00C5,\n\t0x00C5, 0x00E6, 0x00C6, 0x00F4, 0x00F6, 0x00F2, 0x00FB, 0x00F9, 0x00FF, 0x00D6, 0x00DC, 0x00F8, 0x00A3, 0x00D8, 0x20A7, 0x0192,\n\t0x00E1, 0x00ED, 0x00F3, 0x00FA, 0x00F1, 0x00D1, 0x00AA, 0x00BA, 0x00BF, 0x2310, 0x00AC, 0x00BD, 0x00BC, 0x00A1, 0x00AB, 0x00A4,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x2558, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x03B1, 0x00DF, 0x0393, 0x03C0, 0x03A3, 0x03C3, 0x00B5, 0x03C4, 0x03A6, 0x0398, 0x03A9, 0x03B4, 0x221E, 0x03C6, 0x03B5, 0x2229,\n\t0x2261, 0x00B1, 0x2265, 0x2264, 0x2320, 0x2321, 0x00F7, 0x2248, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x207F, 0x00B2, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 866 || FF_CODE_PAGE == 0\nstatic const WCHAR uc866[] = {\t/*  CP866(Russian) to Unicode conversion table */\n\t0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,\n\t0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,\n\t0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x2561, 0x2562, 0x2556, 0x2555, 0x2563, 0x2551, 0x2557, 0x255D, 0x255C, 0x255B, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x255E, 0x255F, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x2567,\n\t0x2568, 0x2564, 0x2565, 0x2559, 0x2558, 0x2552, 0x2553, 0x256B, 0x256A, 0x2518, 0x250C, 0x2588, 0x2584, 0x258C, 0x2590, 0x2580,\n\t0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,\n\t0x0401, 0x0451, 0x0404, 0x0454, 0x0407, 0x0457, 0x040E, 0x045E, 0x00B0, 0x2219, 0x00B7, 0x221A, 0x2116, 0x00A4, 0x25A0, 0x00A0\n};\n#endif\n#if FF_CODE_PAGE == 869 || FF_CODE_PAGE == 0\nstatic const WCHAR uc869[] = {\t/*  CP869(Greek 2) to Unicode conversion table */\n\t0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x00B7, 0x0386, 0x00B7, 0x00B7, 0x00AC, 0x00A6, 0x2018, 0x2019, 0x0388, 0x2015, 0x0389,\n\t0x038A, 0x03AA, 0x038C, 0x00B7, 0x00B7, 0x038E, 0x03AB, 0x00A9, 0x038F, 0x00B2, 0x00B3, 0x03AC, 0x00A3, 0x03AD, 0x03AE, 0x03AF,\n\t0x03CA, 0x0390, 0x03CC, 0x03CD, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x00BD, 0x0398, 0x0399, 0x00AB, 0x00BB,\n\t0x2591, 0x2592, 0x2593, 0x2502, 0x2524, 0x039A, 0x039B, 0x039C, 0x039D, 0x2563, 0x2551, 0x2557, 0x255D, 0x039E, 0x039F, 0x2510,\n\t0x2514, 0x2534, 0x252C, 0x251C, 0x2500, 0x253C, 0x0A30, 0x03A1, 0x255A, 0x2554, 0x2569, 0x2566, 0x2560, 0x2550, 0x256C, 0x03A3,\n\t0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03B1, 0x03B2, 0x03B3, 0x2518, 0x250C, 0x2588, 0x2584, 0x03B4, 0x03B5, 0x2580,\n\t0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, 0x03C0, 0x03C1, 0x03C3, 0x03C2, 0x03C4, 0x0384,\n\t0x00AD, 0x00B1, 0x03C5, 0x03C6, 0x03C7, 0x00A7, 0x03C8, 0x0385, 0x00B0, 0x00A8, 0x03C9, 0x03CB, 0x03B0, 0x03CE, 0x25A0, 0x00A0\n};\n#endif\n\n\n\n\n/*------------------------------------------------------------------------*/\n/* OEM <==> Unicode Conversions for Static Code Page Configuration with   */\n/* SBCS Fixed Code Page                                                   */\n/*------------------------------------------------------------------------*/\n\n#if FF_CODE_PAGE != 0 && FF_CODE_PAGE < 900\nWCHAR ff_uni2oem (\t/* Returns OEM code character, zero on error */\n\tDWORD\tuni,\t/* UTF-16 encoded character to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tWCHAR c = 0;\n\tconst WCHAR* p = CVTBL(uc, FF_CODE_PAGE);\n\n\n\tif (uni < 0x80) {\t/* ASCII? */\n\t\tc = (WCHAR)uni;\n\n\t} else {\t\t\t/* Non-ASCII */\n\t\tif (uni < 0x10000 && cp == FF_CODE_PAGE) {\t/* Is it in BMP and valid code page? */\n\t\t\tfor (c = 0; c < 0x80 && uni != p[c]; c++) ;\n\t\t\tc = (c + 0x80) & 0xFF;\n\t\t}\n\t}\n\n\treturn c;\n}\n\nWCHAR ff_oem2uni (\t/* Returns Unicode character in UTF-16, zero on error */\n\tWCHAR\toem,\t/* OEM code to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tWCHAR c = 0;\n\tconst WCHAR* p = CVTBL(uc, FF_CODE_PAGE);\n\n\n\tif (oem < 0x80) {\t/* ASCII? */\n\t\tc = oem;\n\n\t} else {\t\t\t/* Extended char */\n\t\tif (cp == FF_CODE_PAGE) {\t/* Is it a valid code page? */\n\t\t\tif (oem < 0x100) c = p[oem - 0x80];\n\t\t}\n\t}\n\n\treturn c;\n}\n\n#endif\n\n\n\n/*------------------------------------------------------------------------*/\n/* OEM <==> Unicode Conversions for Static Code Page Configuration with   */\n/* DBCS Fixed Code Page                                                   */\n/*------------------------------------------------------------------------*/\n\n#if FF_CODE_PAGE >= 900\nWCHAR ff_uni2oem (\t/* Returns OEM code character, zero on error */\n\tDWORD\tuni,\t/* UTF-16 encoded character to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tconst WCHAR* p;\n\tWCHAR c = 0, uc;\n\tUINT i = 0, n, li, hi;\n\n\n\tif (uni < 0x80) {\t/* ASCII? */\n\t\tc = (WCHAR)uni;\n\n\t} else {\t\t\t/* Non-ASCII */\n\t\tif (uni < 0x10000 && cp == FF_CODE_PAGE) {\t/* Is it in BMP and valid code page? */\n\t\t\tuc = (WCHAR)uni;\n\t\t\tp = CVTBL(uni2oem, FF_CODE_PAGE);\n\t\t\thi = sizeof CVTBL(uni2oem, FF_CODE_PAGE) / 4 - 1;\n\t\t\tli = 0;\n\t\t\tfor (n = 16; n; n--) {\n\t\t\t\ti = li + (hi - li) / 2;\n\t\t\t\tif (uc == p[i * 2]) break;\n\t\t\t\tif (uc > p[i * 2]) {\n\t\t\t\t\tli = i;\n\t\t\t\t} else {\n\t\t\t\t\thi = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (n != 0) c = p[i * 2 + 1];\n\t\t}\n\t}\n\n\treturn c;\n}\n\n\nWCHAR ff_oem2uni (\t/* Returns Unicode character in UTF-16, zero on error */\n\tWCHAR\toem,\t/* OEM code to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tconst WCHAR* p;\n\tWCHAR c = 0;\n\tUINT i = 0, n, li, hi;\n\n\n\tif (oem < 0x80) {\t/* ASCII? */\n\t\tc = oem;\n\n\t} else {\t\t\t/* Extended char */\n\t\tif (cp == FF_CODE_PAGE) {\t/* Is it valid code page? */\n\t\t\tp = CVTBL(oem2uni, FF_CODE_PAGE);\n\t\t\thi = sizeof CVTBL(oem2uni, FF_CODE_PAGE) / 4 - 1;\n\t\t\tli = 0;\n\t\t\tfor (n = 16; n; n--) {\n\t\t\t\ti = li + (hi - li) / 2;\n\t\t\t\tif (oem == p[i * 2]) break;\n\t\t\t\tif (oem > p[i * 2]) {\n\t\t\t\t\tli = i;\n\t\t\t\t} else {\n\t\t\t\t\thi = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (n != 0) c = p[i * 2 + 1];\n\t\t}\n\t}\n\n\treturn c;\n}\n#endif\n\n\n\n/*------------------------------------------------------------------------*/\n/* OEM <==> Unicode Conversions for Dynamic Code Page Configuration       */\n/*------------------------------------------------------------------------*/\n\n#if FF_CODE_PAGE == 0\n\nstatic const WORD cp_code[]          = {  437,   720,   737,   771,   775,   850,   852,   855,   857,   860,   861,   862,   863,   864,   865,   866,   869, 0};\nstatic const WCHAR* const cp_table[] = {uc437, uc720, uc737, uc771, uc775, uc850, uc852, uc855, uc857, uc860, uc861, uc862, uc863, uc864, uc865, uc866, uc869, 0};\n\n\nWCHAR ff_uni2oem (\t/* Returns OEM code character, zero on error */\n\tDWORD\tuni,\t/* UTF-16 encoded character to be converted */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tconst WCHAR* p;\n\tWCHAR c = 0, uc;\n\tUINT i, n, li, hi;\n\n\n\tif (uni < 0x80) {\t/* ASCII? */\n\t\tc = (WCHAR)uni;\n\n\t} else {\t\t\t/* Non-ASCII */\n\t\tif (uni < 0x10000) { /* Is it in BMP? */\n\t\t\tuc = (WCHAR)uni;\n\t\t\tp = 0;\n\t\t\tif (cp < 900) {\t/* SBCS */\n\t\t\t\tfor (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ;\t\t/* Get conversion table */\n\t\t\t\tp = cp_table[i];\n\t\t\t\tif (p) {\t/* Is it valid code page ? */\n\t\t\t\t\tfor (c = 0; c < 0x80 && uc != p[c]; c++) ;\t/* Find OEM code in the table */\n\t\t\t\t\tc = (c + 0x80) & 0xFF;\n\t\t\t\t}\n\t\t\t} else {\t/* DBCS */\n\t\t\t\tswitch (cp) {\t/* Get conversion table */\n\t\t\t\tcase 932 : p = uni2oem932; hi = sizeof uni2oem932 / 4 - 1; break;\n\t\t\t\tcase 936 : p = uni2oem936; hi = sizeof uni2oem936 / 4 - 1; break;\n\t\t\t\tcase 949 : p = uni2oem949; hi = sizeof uni2oem949 / 4 - 1; break;\n\t\t\t\tcase 950 : p = uni2oem950; hi = sizeof uni2oem950 / 4 - 1; break;\n\t\t\t\t}\n\t\t\t\tif (p) {\t/* Is it valid code page? */\n\t\t\t\t\tli = 0;\n\t\t\t\t\tfor (n = 16; n; n--) {\t/* Find OEM code */\n\t\t\t\t\t\ti = li + (hi - li) / 2;\n\t\t\t\t\t\tif (uc == p[i * 2]) break;\n\t\t\t\t\t\tif (uc > p[i * 2]) {\n\t\t\t\t\t\t\tli = i;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\thi = i;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (n != 0) c = p[i * 2 + 1];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn c;\n}\n\n\nWCHAR ff_oem2uni (\t/* Returns Unicode character in UTF-16, zero on error */\n\tWCHAR\toem,\t/* OEM code to be converted (DBC if >=0x100) */\n\tWORD\tcp\t\t/* Code page for the conversion */\n)\n{\n\tconst WCHAR* p;\n\tWCHAR c = 0;\n\tUINT i, n, li, hi;\n\n\n\tif (oem < 0x80) {\t/* ASCII? */\n\t\tc = oem;\n\n\t} else {\t\t\t/* Extended char */\n\t\tp = 0;\n\t\tif (cp < 900) {\t/* SBCS */\n\t\t\tfor (i = 0; cp_code[i] != 0 && cp_code[i] != cp; i++) ;\t\t/* Get table */\n\t\t\tp = cp_table[i];\n\t\t\tif (p) {\t/* Is it a valid CP ? */\n\t\t\t\tif (oem < 0x100) c = p[oem - 0x80];\n\t\t\t}\n\t\t} else {\t/* DBCS */\n\t\t\tswitch (cp) {\n\t\t\tcase 932 : p = oem2uni932; hi = sizeof oem2uni932 / 4 - 1; break;\n\t\t\tcase 936 : p = oem2uni936; hi = sizeof oem2uni936 / 4 - 1; break;\n\t\t\tcase 949 : p = oem2uni949; hi = sizeof oem2uni949 / 4 - 1; break;\n\t\t\tcase 950 : p = oem2uni950; hi = sizeof oem2uni950 / 4 - 1; break;\n\t\t\t}\n\t\t\tif (p) {\n\t\t\t\tli = 0;\n\t\t\t\tfor (n = 16; n; n--) {\n\t\t\t\t\ti = li + (hi - li) / 2;\n\t\t\t\t\tif (oem == p[i * 2]) break;\n\t\t\t\t\tif (oem > p[i * 2]) {\n\t\t\t\t\t\tli = i;\n\t\t\t\t\t} else {\n\t\t\t\t\t\thi = i;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (n != 0) c = p[i * 2 + 1];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn c;\n}\n#endif\n\n\n\n/*------------------------------------------------------------------------*/\n/* Unicode Up-case Conversion                                             */\n/*------------------------------------------------------------------------*/\n\nDWORD ff_wtoupper (\t/* Returns up-converted code point */\n\tDWORD uni\t\t/* Unicode code point to be up-converted */\n)\n{\n\tconst WORD* p;\n\tWORD uc, bc, nc, cmd;\n\tstatic const WORD cvt1[] = {\t/* Compressed up conversion table for U+0000 - U+0FFF */\n\t\t/* Basic Latin */\n\t\t0x0061,0x031A,\n\t\t/* Latin-1 Supplement */\n\t\t0x00E0,0x0317,\n\t\t0x00F8,0x0307,\n\t\t0x00FF,0x0001,0x0178,\n\t\t/* Latin Extended-A */\n\t\t0x0100,0x0130,\n\t\t0x0132,0x0106,\n\t\t0x0139,0x0110,\n\t\t0x014A,0x012E,\n\t\t0x0179,0x0106,\n\t\t/* Latin Extended-B */\n\t\t0x0180,0x004D,0x0243,0x0181,0x0182,0x0182,0x0184,0x0184,0x0186,0x0187,0x0187,0x0189,0x018A,0x018B,0x018B,0x018D,0x018E,0x018F,0x0190,0x0191,0x0191,0x0193,0x0194,0x01F6,0x0196,0x0197,0x0198,0x0198,0x023D,0x019B,0x019C,0x019D,0x0220,0x019F,0x01A0,0x01A0,0x01A2,0x01A2,0x01A4,0x01A4,0x01A6,0x01A7,0x01A7,0x01A9,0x01AA,0x01AB,0x01AC,0x01AC,0x01AE,0x01AF,0x01AF,0x01B1,0x01B2,0x01B3,0x01B3,0x01B5,0x01B5,0x01B7,0x01B8,0x01B8,0x01BA,0x01BB,0x01BC,0x01BC,0x01BE,0x01F7,0x01C0,0x01C1,0x01C2,0x01C3,0x01C4,0x01C5,0x01C4,0x01C7,0x01C8,0x01C7,0x01CA,0x01CB,0x01CA,\n\t\t0x01CD,0x0110,\n\t\t0x01DD,0x0001,0x018E,\n\t\t0x01DE,0x0112,\n\t\t0x01F3,0x0003,0x01F1,0x01F4,0x01F4,\n\t\t0x01F8,0x0128,\n\t\t0x0222,0x0112,\n\t\t0x023A,0x0009,0x2C65,0x023B,0x023B,0x023D,0x2C66,0x023F,0x0240,0x0241,0x0241,\n\t\t0x0246,0x010A,\n\t\t/* IPA Extensions */\n\t\t0x0253,0x0040,0x0181,0x0186,0x0255,0x0189,0x018A,0x0258,0x018F,0x025A,0x0190,0x025C,0x025D,0x025E,0x025F,0x0193,0x0261,0x0262,0x0194,0x0264,0x0265,0x0266,0x0267,0x0197,0x0196,0x026A,0x2C62,0x026C,0x026D,0x026E,0x019C,0x0270,0x0271,0x019D,0x0273,0x0274,0x019F,0x0276,0x0277,0x0278,0x0279,0x027A,0x027B,0x027C,0x2C64,0x027E,0x027F,0x01A6,0x0281,0x0282,0x01A9,0x0284,0x0285,0x0286,0x0287,0x01AE,0x0244,0x01B1,0x01B2,0x0245,0x028D,0x028E,0x028F,0x0290,0x0291,0x01B7,\n\t\t/* Greek, Coptic */\n\t\t0x037B,0x0003,0x03FD,0x03FE,0x03FF,\n\t\t0x03AC,0x0004,0x0386,0x0388,0x0389,0x038A,\n\t\t0x03B1,0x0311,\n\t\t0x03C2,0x0002,0x03A3,0x03A3,\n\t\t0x03C4,0x0308,\n\t\t0x03CC,0x0003,0x038C,0x038E,0x038F,\n\t\t0x03D8,0x0118,\n\t\t0x03F2,0x000A,0x03F9,0x03F3,0x03F4,0x03F5,0x03F6,0x03F7,0x03F7,0x03F9,0x03FA,0x03FA,\n\t\t/* Cyrillic */\n\t\t0x0430,0x0320,\n\t\t0x0450,0x0710,\n\t\t0x0460,0x0122,\n\t\t0x048A,0x0136,\n\t\t0x04C1,0x010E,\n\t\t0x04CF,0x0001,0x04C0,\n\t\t0x04D0,0x0144,\n\t\t/* Armenian */\n\t\t0x0561,0x0426,\n\n\t\t0x0000\t/* EOT */\n\t};\n\tstatic const WORD cvt2[] = {\t/* Compressed up conversion table for U+1000 - U+FFFF */\n\t\t/* Phonetic Extensions */\n\t\t0x1D7D,0x0001,0x2C63,\n\t\t/* Latin Extended Additional */\n\t\t0x1E00,0x0196,\n\t\t0x1EA0,0x015A,\n\t\t/* Greek Extended */\n\t\t0x1F00,0x0608,\n\t\t0x1F10,0x0606,\n\t\t0x1F20,0x0608,\n\t\t0x1F30,0x0608,\n\t\t0x1F40,0x0606,\n\t\t0x1F51,0x0007,0x1F59,0x1F52,0x1F5B,0x1F54,0x1F5D,0x1F56,0x1F5F,\n\t\t0x1F60,0x0608,\n\t\t0x1F70,0x000E,0x1FBA,0x1FBB,0x1FC8,0x1FC9,0x1FCA,0x1FCB,0x1FDA,0x1FDB,0x1FF8,0x1FF9,0x1FEA,0x1FEB,0x1FFA,0x1FFB,\n\t\t0x1F80,0x0608,\n\t\t0x1F90,0x0608,\n\t\t0x1FA0,0x0608,\n\t\t0x1FB0,0x0004,0x1FB8,0x1FB9,0x1FB2,0x1FBC,\n\t\t0x1FCC,0x0001,0x1FC3,\n\t\t0x1FD0,0x0602,\n\t\t0x1FE0,0x0602,\n\t\t0x1FE5,0x0001,0x1FEC,\n\t\t0x1FF3,0x0001,0x1FFC,\n\t\t/* Letterlike Symbols */\n\t\t0x214E,0x0001,0x2132,\n\t\t/* Number forms */\n\t\t0x2170,0x0210,\n\t\t0x2184,0x0001,0x2183,\n\t\t/* Enclosed Alphanumerics */\n\t\t0x24D0,0x051A,\n\t\t0x2C30,0x042F,\n\t\t/* Latin Extended-C */\n\t\t0x2C60,0x0102,\n\t\t0x2C67,0x0106, 0x2C75,0x0102,\n\t\t/* Coptic */\n\t\t0x2C80,0x0164,\n\t\t/* Georgian Supplement */\n\t\t0x2D00,0x0826,\n\t\t/* Full-width */\n\t\t0xFF41,0x031A,\n\n\t\t0x0000\t/* EOT */\n\t};\n\n\n\tif (uni < 0x10000) {\t/* Is it in BMP? */\n\t\tuc = (WORD)uni;\n\t\tp = uc < 0x1000 ? cvt1 : cvt2;\n\t\tfor (;;) {\n\t\t\tbc = *p++;\t\t\t\t\t\t\t\t/* Get the block base */\n\t\t\tif (bc == 0 || uc < bc) break;\t\t\t/* Not matched? */\n\t\t\tnc = *p++; cmd = nc >> 8; nc &= 0xFF;\t/* Get processing command and block size */\n\t\t\tif (uc < bc + nc) {\t/* In the block? */\n\t\t\t\tswitch (cmd) {\n\t\t\t\tcase 0:\tuc = p[uc - bc]; break;\t\t/* Table conversion */\n\t\t\t\tcase 1:\tuc -= (uc - bc) & 1; break;\t/* Case pairs */\n\t\t\t\tcase 2: uc -= 16; break;\t\t\t/* Shift -16 */\n\t\t\t\tcase 3:\tuc -= 32; break;\t\t\t/* Shift -32 */\n\t\t\t\tcase 4:\tuc -= 48; break;\t\t\t/* Shift -48 */\n\t\t\t\tcase 5:\tuc -= 26; break;\t\t\t/* Shift -26 */\n\t\t\t\tcase 6:\tuc += 8; break;\t\t\t\t/* Shift +8 */\n\t\t\t\tcase 7: uc -= 80; break;\t\t\t/* Shift -80 */\n\t\t\t\tcase 8:\tuc -= 0x1C60; break;\t\t/* Shift -0x1C60 */\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (cmd == 0) p += nc;\t/* Skip table if needed */\n\t\t}\n\t\tuni = uc;\n\t}\n\n\treturn uni;\n}\n\n\n#endif /* #if FF_USE_LFN != 0 */\n"
  },
  {
    "path": "lib/networking/dhserver.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 by Sergey Fetisov <fsenok@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include \"dhserver.h\"\n\n/* DHCP message type */\n#define DHCP_DISCOVER       1\n#define DHCP_OFFER          2\n#define DHCP_REQUEST        3\n#define DHCP_DECLINE        4\n#define DHCP_ACK            5\n#define DHCP_NAK            6\n#define DHCP_RELEASE        7\n#define DHCP_INFORM         8\n\n/* DHCP options */\nenum DHCP_OPTIONS\n{\n\tDHCP_PAD                    = 0,\n\tDHCP_SUBNETMASK             = 1,\n\tDHCP_ROUTER                 = 3,\n\tDHCP_DNSSERVER              = 6,\n\tDHCP_HOSTNAME               = 12,\n\tDHCP_DNSDOMAIN              = 15,\n\tDHCP_MTU                    = 26,\n\tDHCP_BROADCAST              = 28,\n\tDHCP_PERFORMROUTERDISC      = 31,\n\tDHCP_STATICROUTE            = 33,\n\tDHCP_NISDOMAIN              = 40,\n\tDHCP_NISSERVER              = 41,\n\tDHCP_NTPSERVER              = 42,\n\tDHCP_VENDOR                 = 43,\n\tDHCP_IPADDRESS              = 50,\n\tDHCP_LEASETIME              = 51,\n\tDHCP_OPTIONSOVERLOADED      = 52,\n\tDHCP_MESSAGETYPE            = 53,\n\tDHCP_SERVERID               = 54,\n\tDHCP_PARAMETERREQUESTLIST   = 55,\n\tDHCP_MESSAGE                = 56,\n\tDHCP_MAXMESSAGESIZE         = 57,\n\tDHCP_RENEWALTIME            = 58,\n\tDHCP_REBINDTIME             = 59,\n\tDHCP_CLASSID                = 60,\n\tDHCP_CLIENTID               = 61,\n\tDHCP_USERCLASS              = 77,  /* RFC 3004 */\n\tDHCP_FQDN                   = 81,\n\tDHCP_DNSSEARCH              = 119, /* RFC 3397 */\n\tDHCP_CSR                    = 121, /* RFC 3442 */\n\tDHCP_MSCSR                  = 249, /* MS code for RFC 3442 */\n\tDHCP_END                    = 255\n};\n\ntypedef struct\n{\n    uint8_t  dp_op;           /* packet opcode type */\n    uint8_t  dp_htype;        /* hardware addr type */\n    uint8_t  dp_hlen;         /* hardware addr length */\n    uint8_t  dp_hops;         /* gateway hops */\n    uint32_t dp_xid;          /* transaction ID */\n    uint16_t dp_secs;         /* seconds since boot began */\n    uint16_t dp_flags;\n    uint8_t  dp_ciaddr[4];    /* client IP address */\n    uint8_t  dp_yiaddr[4];    /* 'your' IP address */\n    uint8_t  dp_siaddr[4];    /* server IP address */\n    uint8_t  dp_giaddr[4];    /* gateway IP address */\n    uint8_t  dp_chaddr[16];   /* client hardware address */\n    uint8_t  dp_legacy[192];\n    uint8_t  dp_magic[4];\n    uint8_t  dp_options[275]; /* options area */\n} DHCP_TYPE;\n\nDHCP_TYPE dhcp_data;\nstatic struct udp_pcb *pcb = NULL;\nstatic const dhcp_config_t *config = NULL;\n\nchar magic_cookie[] = {0x63,0x82,0x53,0x63};\n\nstatic ip4_addr_t get_ip(const uint8_t *pnt)\n{\n  ip4_addr_t result;\n  memcpy(&result, pnt, sizeof(result));\n  return result;\n}\n\nstatic void set_ip(uint8_t *pnt, ip4_addr_t value)\n{\n  memcpy(pnt, &value.addr, sizeof(value.addr));\n}\n\nstatic dhcp_entry_t *entry_by_ip(ip4_addr_t ip)\n{\n\tint i;\n\tfor (i = 0; i < config->num_entry; i++)\n\t\tif (config->entries[i].addr.addr == ip.addr)\n\t\t\treturn &config->entries[i];\n\treturn NULL;\n}\n\nstatic dhcp_entry_t *entry_by_mac(uint8_t *mac)\n{\n\tint i;\n\tfor (i = 0; i < config->num_entry; i++)\n\t\tif (memcmp(config->entries[i].mac, mac, 6) == 0)\n\t\t\treturn &config->entries[i];\n\treturn NULL;\n}\n\nstatic __inline bool is_vacant(dhcp_entry_t *entry)\n{\n\treturn memcmp(\"\\0\\0\\0\\0\\0\", entry->mac, 6) == 0;\n}\n\nstatic dhcp_entry_t *vacant_address(void)\n{\n\tint i;\n\tfor (i = 0; i < config->num_entry; i++)\n\t\tif (is_vacant(config->entries + i))\n\t\t\treturn config->entries + i;\n\treturn NULL;\n}\n\nstatic __inline void free_entry(dhcp_entry_t *entry)\n{\n\tmemset(entry->mac, 0, 6);\n}\n\nstatic uint8_t *find_dhcp_option(uint8_t *attrs, int size, uint8_t attr)\n{\n\tint i = 0;\n\twhile ((i + 1) < size)\n\t{\n\t\tint next = i + attrs[i + 1] + 2;\n\t\tif (next > size) return NULL;\n\t\tif (attrs[i] == attr)\n\t\t\treturn attrs + i;\n\t\ti = next;\n\t}\n\treturn NULL;\n}\n\nstatic int fill_options(void *dest,\n\tuint8_t msg_type,\n\tconst char *domain,\n\tip4_addr_t dns,\n\tint lease_time,\n\tip4_addr_t serverid,\n\tip4_addr_t router,\n\tip4_addr_t subnet)\n{\n\tuint8_t *ptr = (uint8_t *)dest;\n\t/* ACK message type */\n\t*ptr++ = 53;\n\t*ptr++ = 1;\n\t*ptr++ = msg_type;\n\n\t/* dhcp server identifier */\n\t*ptr++ = DHCP_SERVERID;\n\t*ptr++ = 4;\n\tset_ip(ptr, serverid);\n\tptr += 4;\n\n\t/* lease time */\n\t*ptr++ = DHCP_LEASETIME;\n\t*ptr++ = 4;\n\t*ptr++ = (lease_time >> 24) & 0xFF;\n\t*ptr++ = (lease_time >> 16) & 0xFF;\n\t*ptr++ = (lease_time >> 8) & 0xFF;\n\t*ptr++ = (lease_time >> 0) & 0xFF;\n\n\t/* subnet mask */\n\t*ptr++ = DHCP_SUBNETMASK;\n\t*ptr++ = 4;\n\tset_ip(ptr, subnet);\n\tptr += 4;\n\n\t/* router */\n\tif (router.addr != 0)\n\t{\n\t\t*ptr++ = DHCP_ROUTER;\n\t\t*ptr++ = 4;\n\t\tset_ip(ptr, router);\n\t\tptr += 4;\n\t}\n\n\t/* domain name */\n\tif (domain != NULL)\n\t{\n\t\tint len = strlen(domain);\n\t\t*ptr++ = DHCP_DNSDOMAIN;\n\t\t*ptr++ = len;\n\t\tmemcpy(ptr, domain, len);\n\t\tptr += len;\n\t}\n\n\t/* domain name server (DNS) */\n\tif (dns.addr != 0)\n\t{\n\t\t*ptr++ = DHCP_DNSSERVER;\n\t\t*ptr++ = 4;\n\t\tset_ip(ptr, dns);\n\t\tptr += 4;\n\t}\n\n\t/* end */\n\t*ptr++ = DHCP_END;\n\treturn ptr - (uint8_t *)dest;\n}\n\n\n/*\n * RFC 2131 Section 4.1 compliant destination address selection\n */\nstatic ip_addr_t get_dhcp_destination(struct netif *netif, const DHCP_TYPE *dhcp,\n                                const ip4_addr_t *yiaddr, bool is_nak)\n{\n    ip4_addr_t giaddr = get_ip(dhcp->dp_giaddr);\n    ip4_addr_t ciaddr = get_ip(dhcp->dp_ciaddr);\n    bool giaddr_zero = ip4_addr_isany_val(giaddr);\n    bool ciaddr_zero = ip4_addr_isany_val(ciaddr);\n    bool broadcast_flag = (dhcp->dp_flags & htons(0x8000)) != 0;\n\tip_addr_t dest_addr;\n\n    if (!giaddr_zero) {\n        // If giaddr is not zero, send to giaddr (relay agent)\n        ip_addr_set_ip4_u32(&dest_addr, giaddr.addr);\n        return dest_addr;\n    }\n\n    if (is_nak) {\n        // RFC 2131: \"In all cases, when 'giaddr' is zero,\n        // the server broadcasts any DHCPNAK messages to 0xffffffff\"\n        goto dest_broadcast;\n    }\n\n    if (!ciaddr_zero) {\n        // RFC 2131: \"If the 'giaddr' field is zero and the 'ciaddr' field is nonzero,\n        // then the server unicasts DHCPOFFER and DHCPACK messages to the address in 'ciaddr'\"\n        ip_addr_set_ip4_u32(&dest_addr, ciaddr.addr);\n        return dest_addr;\n    }\n\n    if (broadcast_flag) {\n        // RFC 2131: \"If 'giaddr' is zero and 'ciaddr' is zero, and the broadcast bit is set,\n        // then the server broadcasts DHCPOFFER and DHCPACK messages to 0xffffffff\"\n        goto dest_broadcast;\n    }\n\n    // RFC 2131: \"If the broadcast bit is not set and 'giaddr' is zero and 'ciaddr' is zero,\n    // then the server unicasts DHCPOFFER and DHCPACK messages to the client's hardware\n    // address and 'yiaddr' address\"\n    if (yiaddr && !ip4_addr_isany(yiaddr)) {\n        ip_addr_set_ip4_u32(&dest_addr, yiaddr->addr);\n        // TODO: This requires ARP table manipulation to associate yiaddr with client MAC\n        // For now, fall back to broadcast as this is complex to implement correctly\n        goto dest_broadcast;\n    }\n\ndest_broadcast:\n    ip_addr_set_ip4_u32(&dest_addr,\n        ip4_addr_get_u32(netif_ip4_addr(netif)) | ~ip4_addr_get_u32(netif_ip4_netmask(netif)));\n    return dest_addr;\n\n}\n\nstatic void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n\tuint8_t *ptr;\n\tdhcp_entry_t *entry;\n\tstruct pbuf *pp;\n\tstruct netif *netif = netif_get_by_index(p->if_idx);\n\tip_addr_t dest_addr;\n\n\t(void)arg;\n\t(void)addr;\n\n\tunsigned n = p->len;\n\tif (n > sizeof(dhcp_data)) n = sizeof(dhcp_data);\n\tmemcpy(&dhcp_data, p->payload, n);\n\n\tptr = find_dhcp_option(dhcp_data.dp_options, sizeof(dhcp_data.dp_options), DHCP_MESSAGETYPE);\n\tif (ptr == NULL)\n\t{\n\t\tpbuf_free(p);\n\t\treturn;\n\t}\n\n\tswitch (ptr[2])\n\t{\n\t\tcase DHCP_DISCOVER:\n\t\t\tentry = entry_by_mac(dhcp_data.dp_chaddr);\n\t\t\tif (entry == NULL) entry = vacant_address();\n\t\t\tif (entry == NULL) break;\n\t\t\tdhcp_data.dp_op = 2; /* reply */\n\t\t\tdhcp_data.dp_secs = 0;\n\t\t\tdhcp_data.dp_flags = 0;\n\t\t\tset_ip(dhcp_data.dp_yiaddr, entry->addr);\n\t\t\tmemcpy(dhcp_data.dp_magic, magic_cookie, 4);\n\n\t\t\tmemset(dhcp_data.dp_options, 0, sizeof(dhcp_data.dp_options));\n\n\t\t\tfill_options(dhcp_data.dp_options,\n\t\t\t\tDHCP_OFFER,\n\t\t\t\tconfig->domain,\n\t\t\t\tconfig->dns,\n\t\t\t\tentry->lease,\n\t\t\t\t*netif_ip4_addr(netif),\n\t\t\t\tconfig->router,\n\t\t\t\t*netif_ip4_netmask(netif));\n\n\t\t\tpp = pbuf_alloc(PBUF_TRANSPORT, sizeof(dhcp_data), PBUF_POOL);\n\t\t\tif (pp == NULL) break;\n\t\t\tmemcpy(pp->payload, &dhcp_data, sizeof(dhcp_data));\n\t\t\t// RFC 2131 compliant destination selection for DHCP OFFER\n\t\t\tdest_addr = get_dhcp_destination(netif, &dhcp_data, &entry->addr, false);\n\t\t\tudp_sendto(upcb, pp, &dest_addr, port);\n\t\t\tpbuf_free(pp);\n\t\t\tbreak;\n\n\t\tcase DHCP_REQUEST:\n\t\t\t/* 1. find requested ipaddr in option list */\n\t\t\tptr = find_dhcp_option(dhcp_data.dp_options, sizeof(dhcp_data.dp_options), DHCP_IPADDRESS);\n\t\t\tif (ptr == NULL) break;\n\t\t\tif (ptr[1] != 4) break;\n\t\t\tptr += 2;\n\n\t\t\t/* 2. does hw-address registered? */\n\t\t\tentry = entry_by_mac(dhcp_data.dp_chaddr);\n\t\t\tif (entry != NULL) free_entry(entry);\n\n\t\t\t/* 3. find requested ipaddr */\n\t\t\tentry = entry_by_ip(get_ip(ptr));\n\t\t\tif (entry == NULL) break;\n\t\t\tif (!is_vacant(entry)) break;\n\n\t\t\t/* 4. fill struct fields */\n\t\t\tmemcpy(dhcp_data.dp_yiaddr, ptr, 4);\n\t\t\tdhcp_data.dp_op = 2; /* reply */\n\t\t\tdhcp_data.dp_secs = 0;\n\t\t\tdhcp_data.dp_flags = 0;\n\t\t\tmemcpy(dhcp_data.dp_magic, magic_cookie, 4);\n\n\t\t\t/* 5. fill options */\n\t\t\tmemset(dhcp_data.dp_options, 0, sizeof(dhcp_data.dp_options));\n\n\t\t\tfill_options(dhcp_data.dp_options,\n\t\t\t\tDHCP_ACK,\n\t\t\t\tconfig->domain,\n\t\t\t\tconfig->dns,\n\t\t\t\tentry->lease,\n\t\t\t\t*netif_ip4_addr(netif),\n\t\t\t\tconfig->router,\n\t\t\t\t*netif_ip4_netmask(netif));\n\n\t\t\t/* 6. send ACK */\n\t\t\tpp = pbuf_alloc(PBUF_TRANSPORT, sizeof(dhcp_data), PBUF_POOL);\n\t\t\tif (pp == NULL) break;\n\t\t\tmemcpy(entry->mac, dhcp_data.dp_chaddr, 6);\n\t\t\tmemcpy(pp->payload, &dhcp_data, sizeof(dhcp_data));\n\t\t\t// RFC 2131 compliant destination selection for DHCP ACK\n\t\t\tdest_addr = get_dhcp_destination(netif, &dhcp_data, &entry->addr, false);\n\t\t\tudp_sendto(upcb, pp, &dest_addr, port);\n\t\t\tpbuf_free(pp);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\t\tbreak;\n\t}\n\tpbuf_free(p);\n}\n\nerr_t dhserv_init(const dhcp_config_t *c)\n{\n\terr_t err;\n\tudp_init();\n\tdhserv_free();\n\tpcb = udp_new();\n\tif (pcb == NULL)\n\t\treturn ERR_MEM;\n\terr = udp_bind(pcb, IP_ADDR_ANY, c->port);\n\tif (err != ERR_OK)\n\t{\n\t\tdhserv_free();\n\t\treturn err;\n\t}\n\tudp_recv(pcb, udp_recv_proc, NULL);\n\tconfig = c;\n\treturn ERR_OK;\n}\n\nvoid dhserv_free(void)\n{\n\tif (pcb == NULL) return;\n\tudp_remove(pcb);\n\tpcb = NULL;\n}\n"
  },
  {
    "path": "lib/networking/dhserver.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 by Sergey Fetisov <fsenok@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/*\n * version: 1.0 demo (7.02.2015)\n * brief:   tiny dhcp ipv4 server using lwip (pcb)\n * ref:     https://lists.gnu.org/archive/html/lwip-users/2012-12/msg00016.html\n */\n\n#ifndef DHSERVER_H\n#define DHSERVER_H\n\n#include <stdint.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <string.h>\n#include \"lwip/err.h\"\n#include \"lwip/udp.h\"\n#include \"netif/etharp.h\"\n\ntypedef struct dhcp_entry\n{\n\tuint8_t    mac[6];\n\tip4_addr_t addr;\n\tuint32_t   lease;\n} dhcp_entry_t;\n\ntypedef struct dhcp_config\n{\n\tip4_addr_t    router;\n\tuint16_t      port;\n\tip4_addr_t    dns;\n\tconst char   *domain;\n\tint           num_entry;\n\tdhcp_entry_t *entries;\n} dhcp_config_t;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nerr_t dhserv_init(const dhcp_config_t *c);\nvoid dhserv_free(void);\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* DHSERVER_H */\n"
  },
  {
    "path": "lib/networking/dnserver.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 by Sergey Fetisov <fsenok@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/*\n * version: 1.0 demo (7.02.2015)\n * brief:   tiny dns ipv4 server using lwip (pcb)\n */\n\n#include \"dnserver.h\"\n\n#define DNS_MAX_HOST_NAME_LEN 128\n\nstatic struct udp_pcb *pcb = NULL;\ndns_query_proc_t query_proc = NULL;\n\n#pragma pack(push, 1)\ntypedef struct\n{\n#if BYTE_ORDER == LITTLE_ENDIAN\n\tuint8_t rd: 1,     /* Recursion Desired */\n\t        tc: 1,     /* Truncation Flag */\n\t        aa: 1,     /* Authoritative Answer Flag */\n\t        opcode: 4, /* Operation code */\n\t        qr: 1;     /* Query/Response Flag */\n\tuint8_t rcode: 4,  /* Response Code */\n\t        z: 3,      /* Zero */\n\t        ra: 1;     /* Recursion Available */\n#else\n\tuint8_t qr: 1,     /* Query/Response Flag */\n\t        opcode: 4, /* Operation code */\n\t        aa: 1,     /* Authoritative Answer Flag */\n\t        tc: 1,     /* Truncation Flag */\n\t        rd: 1;     /* Recursion Desired */\n\tuint8_t ra: 1,     /* Recursion Available */\n\t        z: 3,      /* Zero */\n\t        rcode: 4;  /* Response Code */\n#endif\n} dns_header_flags_t;\n\ntypedef struct\n{\n\tuint16_t id;\n\tdns_header_flags_t flags;\n\tuint16_t n_record[4];\n} dns_header_t;\n\ntypedef struct dns_answer\n{\n\tuint16_t name;\n\tuint16_t type;\n\tuint16_t Class;\n\tuint32_t ttl;\n\tuint16_t len;\n\tuint32_t addr;\n} dns_answer_t;\n#pragma pack(pop)\n\ntypedef struct dns_query\n{\n\tchar name[DNS_MAX_HOST_NAME_LEN];\n\tuint16_t type;\n\tuint16_t Class;\n} dns_query_t;\n\nstatic uint16_t get_uint16(const uint8_t *pnt)\n{\n  uint16_t result;\n  memcpy(&result, pnt, sizeof(result));\n  return result;\n}\n\nstatic int parse_next_query(void *data, int size, dns_query_t *query)\n{\n\tint len;\n\tint labels;\n\tuint8_t *ptr;\n\n\tlen = 0;\n\tlabels = 0;\n\tptr = (uint8_t *)data;\n\n\twhile (true)\n\t{\n\t\tuint8_t lable_len;\n\t\tif (size <= 0) return -1;\n\t\tlable_len = *ptr++;\n\t\tsize--;\n\t\tif (lable_len == 0) break;\n\t\tif (labels > 0)\n\t\t{\n\t\t\tif (len == DNS_MAX_HOST_NAME_LEN) return -2;\n\t\t\tquery->name[len++] = '.';\n\t\t}\n\t\tif (lable_len > size) return -1;\n\t\tif (len + lable_len >= DNS_MAX_HOST_NAME_LEN) return -2;\n\t\tmemcpy(&query->name[len], ptr, lable_len);\n\t\tlen += lable_len;\n\t\tptr += lable_len;\n\t\tsize -= lable_len;\n\t\tlabels++;\n\t}\n\n\tif (size < 4) return -1;\n\tquery->name[len] = 0;\n\tquery->type = get_uint16(ptr);\n\tptr += 2;\n\tquery->Class = get_uint16(ptr);\n\tptr += 2;\n\treturn ptr - (uint8_t *)data;\n}\n\nstatic void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)\n{\n\tint len;\n\tdns_header_t *header;\n\tstatic dns_query_t query;\n\tstruct pbuf *out;\n\tip4_addr_t host_addr;\n\tdns_answer_t *answer;\n\n\t(void)arg;\n\n\tif (p->len <= sizeof(dns_header_t)) goto error;\n\theader = (dns_header_t *)p->payload;\n\tif (header->flags.qr != 0) goto error;\n\tif (ntohs(header->n_record[0]) != 1) goto error;\n\n\tlen = parse_next_query(header + 1, p->len - sizeof(dns_header_t), &query);\n\tif (len < 0) goto error;\n\tif (!query_proc(query.name, &host_addr)) goto error;\n\n\tlen += sizeof(dns_header_t);\n\tout = pbuf_alloc(PBUF_TRANSPORT, len + 16, PBUF_POOL);\n\tif (out == NULL) goto error;\n\n\tmemcpy(out->payload, p->payload, len);\n\theader = (dns_header_t *)out->payload;\n\theader->flags.qr = 1;\n\theader->n_record[1] = htons(1);\n\tanswer = (struct dns_answer *)((uint8_t *)out->payload + len);\n\tanswer->name = htons(0xC00C);\n\tanswer->type = htons(1);\n\tanswer->Class = htons(1);\n\tanswer->ttl = htonl(32);\n\tanswer->len = htons(4);\n\tanswer->addr = host_addr.addr;\n\n\tudp_sendto(upcb, out, addr, port);\n\tpbuf_free(out);\n\nerror:\n\tpbuf_free(p);\n}\n\nerr_t dnserv_init(const ip_addr_t *bind, uint16_t port, dns_query_proc_t qp)\n{\n\terr_t err;\n\tudp_init();\n\tdnserv_free();\n\tpcb = udp_new();\n\tif (pcb == NULL)\n\t\treturn ERR_MEM;\n\terr = udp_bind(pcb, bind, port);\n\tif (err != ERR_OK)\n\t{\n\t\tdnserv_free();\n\t\treturn err;\n\t}\n\tudp_recv(pcb, udp_recv_proc, NULL);\n\tquery_proc = qp;\n\treturn ERR_OK;\n}\n\nvoid dnserv_free(void)\n{\n\tif (pcb == NULL) return;\n\tudp_remove(pcb);\n\tpcb = NULL;\n}\n"
  },
  {
    "path": "lib/networking/dnserver.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 by Sergey Fetisov <fsenok@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/*\n * version: 1.0 demo (7.02.2015)\n * brief:   tiny dns ipv4 server using lwip (pcb)\n */\n\n#ifndef DNSERVER\n#define DNSERVER\n\n#include <stdint.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <string.h>\n#include \"lwip/def.h\"\n#include \"lwip/err.h\"\n#include \"lwip/udp.h\"\n#include \"netif/etharp.h\"\n\ntypedef bool (*dns_query_proc_t)(const char *name, ip4_addr_t *addr);\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nerr_t dnserv_init(const ip_addr_t *bind, uint16_t port, dns_query_proc_t query_proc);\nvoid  dnserv_free(void);\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "lib/networking/ndis.h",
    "content": "/* This file has been prepared for Doxygen automatic documentation generation.*/\n/*! \\file ndis.h ***************************************************************\n *\n * \\brief\n *      This file contains the possible external configuration of the USB.\n *\n * \\addtogroup usbstick\n *\n *\n ******************************************************************************/\n\n/**\n \\ingroup usbstick\n \\defgroup RNDIS RNDIS Support\n @{\n */\n\n/*\n * ndis.h\n *\n * Modified by Colin O'Flynn <coflynn@newae.com>\n * ntddndis.h modified by Benedikt Spranger <b.spranger@pengutronix.de>\n *\n * Thanks to the cygwin development team,\n * especially to Casper S. Hornstrup <chorns@users.sourceforge.net>\n *\n * THIS SOFTWARE IS NOT COPYRIGHTED\n *\n * This source code is offered for use in the public domain. You may\n * use, modify or distribute it freely.\n *\n * This code is distributed in the hope that it will be useful but\n * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY\n * DISCLAIMED. This includes but is not limited to warranties of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n *\n */\n\n#ifndef _LINUX_NDIS_H\n#define _LINUX_NDIS_H\n\n\n#define NDIS_STATUS_MULTICAST_FULL\t      0xC0010009\n#define NDIS_STATUS_MULTICAST_EXISTS      0xC001000A\n#define NDIS_STATUS_MULTICAST_NOT_FOUND   0xC001000B\n\n/* from drivers/net/sk98lin/h/skgepnmi.h */\n#define OID_PNP_CAPABILITIES                    0xFD010100\n#define OID_PNP_SET_POWER                       0xFD010101\n#define OID_PNP_QUERY_POWER                     0xFD010102\n#define OID_PNP_ADD_WAKE_UP_PATTERN             0xFD010103\n#define OID_PNP_REMOVE_WAKE_UP_PATTERN          0xFD010104\n#define OID_PNP_ENABLE_WAKE_UP                  0xFD010106\n\nenum NDIS_DEVICE_POWER_STATE {\n\tNdisDeviceStateUnspecified = 0,\n\tNdisDeviceStateD0,\n\tNdisDeviceStateD1,\n\tNdisDeviceStateD2,\n\tNdisDeviceStateD3,\n\tNdisDeviceStateMaximum\n};\n\nstruct NDIS_PM_WAKE_UP_CAPABILITIES {\n\tenum NDIS_DEVICE_POWER_STATE  MinMagicPacketWakeUp;\n\tenum NDIS_DEVICE_POWER_STATE  MinPatternWakeUp;\n\tenum NDIS_DEVICE_POWER_STATE  MinLinkChangeWakeUp;\n};\n\n/* NDIS_PNP_CAPABILITIES.Flags constants */\n#define NDIS_DEVICE_WAKE_UP_ENABLE                0x00000001\n#define NDIS_DEVICE_WAKE_ON_PATTERN_MATCH_ENABLE  0x00000002\n#define NDIS_DEVICE_WAKE_ON_MAGIC_PACKET_ENABLE   0x00000004\n\n/*\nstruct NDIS_PNP_CAPABILITIES {\n\t__le32\t\t\t\t\tFlags;\n\tstruct NDIS_PM_WAKE_UP_CAPABILITIES\tWakeUpCapabilities;\n};\n\nstruct NDIS_PM_PACKET_PATTERN {\n\t__le32\tPriority;\n\t__le32\tReserved;\n\t__le32\tMaskSize;\n\t__le32\tPatternOffset;\n\t__le32\tPatternSize;\n\t__le32\tPatternFlags;\n};\n*/\n\n/* Required Object IDs (OIDs) */\n#define OID_GEN_SUPPORTED_LIST            0x00010101\n#define OID_GEN_HARDWARE_STATUS           0x00010102\n#define OID_GEN_MEDIA_SUPPORTED           0x00010103\n#define OID_GEN_MEDIA_IN_USE              0x00010104\n#define OID_GEN_MAXIMUM_LOOKAHEAD         0x00010105\n#define OID_GEN_MAXIMUM_FRAME_SIZE        0x00010106\n#define OID_GEN_LINK_SPEED                0x00010107\n#define OID_GEN_TRANSMIT_BUFFER_SPACE     0x00010108\n#define OID_GEN_RECEIVE_BUFFER_SPACE      0x00010109\n#define OID_GEN_TRANSMIT_BLOCK_SIZE       0x0001010A\n#define OID_GEN_RECEIVE_BLOCK_SIZE        0x0001010B\n#define OID_GEN_VENDOR_ID                 0x0001010C\n#define OID_GEN_VENDOR_DESCRIPTION        0x0001010D\n#define OID_GEN_CURRENT_PACKET_FILTER     0x0001010E\n#define OID_GEN_CURRENT_LOOKAHEAD         0x0001010F\n#define OID_GEN_DRIVER_VERSION            0x00010110\n#define OID_GEN_MAXIMUM_TOTAL_SIZE        0x00010111\n#define OID_GEN_PROTOCOL_OPTIONS          0x00010112\n#define OID_GEN_MAC_OPTIONS               0x00010113\n#define OID_GEN_MEDIA_CONNECT_STATUS      0x00010114\n#define OID_GEN_MAXIMUM_SEND_PACKETS      0x00010115\n#define OID_GEN_VENDOR_DRIVER_VERSION     0x00010116\n#define OID_GEN_SUPPORTED_GUIDS           0x00010117\n#define OID_GEN_NETWORK_LAYER_ADDRESSES   0x00010118\n#define OID_GEN_TRANSPORT_HEADER_OFFSET   0x00010119\n#define OID_GEN_MACHINE_NAME              0x0001021A\n#define OID_GEN_RNDIS_CONFIG_PARAMETER    0x0001021B\n#define OID_GEN_VLAN_ID                   0x0001021C\n\n/* Optional OIDs */\n#define OID_GEN_MEDIA_CAPABILITIES        0x00010201\n#define OID_GEN_PHYSICAL_MEDIUM           0x00010202\n\n/* Required statistics OIDs */\n#define OID_GEN_XMIT_OK                   0x00020101\n#define OID_GEN_RCV_OK                    0x00020102\n#define OID_GEN_XMIT_ERROR                0x00020103\n#define OID_GEN_RCV_ERROR                 0x00020104\n#define OID_GEN_RCV_NO_BUFFER             0x00020105\n\n/* Optional statistics OIDs */\n#define OID_GEN_DIRECTED_BYTES_XMIT       0x00020201\n#define OID_GEN_DIRECTED_FRAMES_XMIT      0x00020202\n#define OID_GEN_MULTICAST_BYTES_XMIT      0x00020203\n#define OID_GEN_MULTICAST_FRAMES_XMIT     0x00020204\n#define OID_GEN_BROADCAST_BYTES_XMIT      0x00020205\n#define OID_GEN_BROADCAST_FRAMES_XMIT     0x00020206\n#define OID_GEN_DIRECTED_BYTES_RCV        0x00020207\n#define OID_GEN_DIRECTED_FRAMES_RCV       0x00020208\n#define OID_GEN_MULTICAST_BYTES_RCV       0x00020209\n#define OID_GEN_MULTICAST_FRAMES_RCV      0x0002020A\n#define OID_GEN_BROADCAST_BYTES_RCV       0x0002020B\n#define OID_GEN_BROADCAST_FRAMES_RCV      0x0002020C\n#define OID_GEN_RCV_CRC_ERROR             0x0002020D\n#define OID_GEN_TRANSMIT_QUEUE_LENGTH     0x0002020E\n#define OID_GEN_GET_TIME_CAPS             0x0002020F\n#define OID_GEN_GET_NETCARD_TIME          0x00020210\n#define OID_GEN_NETCARD_LOAD              0x00020211\n#define OID_GEN_DEVICE_PROFILE            0x00020212\n#define OID_GEN_INIT_TIME_MS              0x00020213\n#define OID_GEN_RESET_COUNTS              0x00020214\n#define OID_GEN_MEDIA_SENSE_COUNTS        0x00020215\n#define OID_GEN_FRIENDLY_NAME             0x00020216\n#define OID_GEN_MINIPORT_INFO             0x00020217\n#define OID_GEN_RESET_VERIFY_PARAMETERS   0x00020218\n\n/* IEEE 802.3 (Ethernet) OIDs */\n#define NDIS_802_3_MAC_OPTION_PRIORITY    0x00000001\n\n#define OID_802_3_PERMANENT_ADDRESS       0x01010101\n#define OID_802_3_CURRENT_ADDRESS         0x01010102\n#define OID_802_3_MULTICAST_LIST          0x01010103\n#define OID_802_3_MAXIMUM_LIST_SIZE       0x01010104\n#define OID_802_3_MAC_OPTIONS             0x01010105\n#define OID_802_3_RCV_ERROR_ALIGNMENT     0x01020101\n#define OID_802_3_XMIT_ONE_COLLISION      0x01020102\n#define OID_802_3_XMIT_MORE_COLLISIONS    0x01020103\n#define OID_802_3_XMIT_DEFERRED           0x01020201\n#define OID_802_3_XMIT_MAX_COLLISIONS     0x01020202\n#define OID_802_3_RCV_OVERRUN             0x01020203\n#define OID_802_3_XMIT_UNDERRUN           0x01020204\n#define OID_802_3_XMIT_HEARTBEAT_FAILURE  0x01020205\n#define OID_802_3_XMIT_TIMES_CRS_LOST     0x01020206\n#define OID_802_3_XMIT_LATE_COLLISIONS    0x01020207\n\n/* Wireless LAN OIDs */\n/* Mandatory */\n#define OID_802_11_BSSID                  0x0D010101 /* Q  S     */\n#define OID_802_11_SSID                   0x0D010102 /* Q  S     */\n#define OID_802_11_NETWORK_TYPE_IN_USE    0x0D010204 /* Q  S     */\n#define OID_802_11_RSSI                   0x0D010206 /* Q      I */\n#define OID_802_11_BSSID_LIST             0x0D010217 /* Q        */\n#define OID_802_11_BSSID_LIST_SCAN        0x0D01011A /*    S     */\n#define OID_802_11_INFRASTRUCTURE_MODE    0x0D010108 /* Q  S     */\n#define OID_802_11_SUPPORTED_RATES        0x0D01020E /* Q        */\n#define OID_802_11_CONFIGURATION          0x0D010211 /* Q  S     */\n#define OID_802_11_ADD_WEP                0x0D010113 /*    S     */\n#define OID_802_11_WEP_STATUS             0x0D01011B /* Q  S     */\n#define OID_802_11_REMOVE_WEP             0x0D010114 /*    S     */\n#define OID_802_11_DISASSOCIATE           0x0D010115 /*    S     */\n#define OID_802_11_AUTHENTICATION_MODE    0x0D010118 /* Q  S     */\n#define OID_802_11_RELOAD_DEFAULTS        0x0D01011C /*    S     */\n\n\n\n/* OID_GEN_MINIPORT_INFO constants */\n#define NDIS_MINIPORT_BUS_MASTER                      0x00000001\n#define NDIS_MINIPORT_WDM_DRIVER                      0x00000002\n#define NDIS_MINIPORT_SG_LIST                         0x00000004\n#define NDIS_MINIPORT_SUPPORTS_MEDIA_QUERY            0x00000008\n#define NDIS_MINIPORT_INDICATES_PACKETS               0x00000010\n#define NDIS_MINIPORT_IGNORE_PACKET_QUEUE             0x00000020\n#define NDIS_MINIPORT_IGNORE_REQUEST_QUEUE            0x00000040\n#define NDIS_MINIPORT_IGNORE_TOKEN_RING_ERRORS        0x00000080\n#define NDIS_MINIPORT_INTERMEDIATE_DRIVER             0x00000100\n#define NDIS_MINIPORT_IS_NDIS_5                       0x00000200\n#define NDIS_MINIPORT_IS_CO                           0x00000400\n#define NDIS_MINIPORT_DESERIALIZE                     0x00000800\n#define NDIS_MINIPORT_REQUIRES_MEDIA_POLLING          0x00001000\n#define NDIS_MINIPORT_SUPPORTS_MEDIA_SENSE            0x00002000\n#define NDIS_MINIPORT_NETBOOT_CARD                    0x00004000\n#define NDIS_MINIPORT_PM_SUPPORTED                    0x00008000\n#define NDIS_MINIPORT_SUPPORTS_MAC_ADDRESS_OVERWRITE  0x00010000\n#define NDIS_MINIPORT_USES_SAFE_BUFFER_APIS           0x00020000\n#define NDIS_MINIPORT_HIDDEN                          0x00040000\n#define NDIS_MINIPORT_SWENUM                          0x00080000\n#define NDIS_MINIPORT_SURPRISE_REMOVE_OK              0x00100000\n#define NDIS_MINIPORT_NO_HALT_ON_SUSPEND              0x00200000\n#define NDIS_MINIPORT_HARDWARE_DEVICE                 0x00400000\n#define NDIS_MINIPORT_SUPPORTS_CANCEL_SEND_PACKETS    0x00800000\n#define NDIS_MINIPORT_64BITS_DMA                      0x01000000\n\n#define NDIS_MEDIUM_802_3\t\t0x00000000\n#define NDIS_MEDIUM_802_5\t\t0x00000001\n#define NDIS_MEDIUM_FDDI\t\t0x00000002\n#define NDIS_MEDIUM_WAN\t\t\t0x00000003\n#define NDIS_MEDIUM_LOCAL_TALK\t\t0x00000004\n#define NDIS_MEDIUM_DIX\t\t\t0x00000005\n#define NDIS_MEDIUM_ARCENT_RAW\t\t0x00000006\n#define NDIS_MEDIUM_ARCENT_878_2\t0x00000007\n#define NDIS_MEDIUM_ATM\t\t\t0x00000008\n#define NDIS_MEDIUM_WIRELESS_LAN\t0x00000009\n#define NDIS_MEDIUM_IRDA\t\t0x0000000A\n#define NDIS_MEDIUM_BPC\t\t\t0x0000000B\n#define NDIS_MEDIUM_CO_WAN\t\t0x0000000C\n#define NDIS_MEDIUM_1394\t\t0x0000000D\n\n#define NDIS_PACKET_TYPE_DIRECTED\t0x00000001\n#define NDIS_PACKET_TYPE_MULTICAST\t0x00000002\n#define NDIS_PACKET_TYPE_ALL_MULTICAST\t0x00000004\n#define NDIS_PACKET_TYPE_BROADCAST\t0x00000008\n#define NDIS_PACKET_TYPE_SOURCE_ROUTING\t0x00000010\n#define NDIS_PACKET_TYPE_PROMISCUOUS\t0x00000020\n#define NDIS_PACKET_TYPE_SMT\t\t0x00000040\n#define NDIS_PACKET_TYPE_ALL_LOCAL\t0x00000080\n#define NDIS_PACKET_TYPE_GROUP\t\t0x00000100\n#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL\t0x00000200\n#define NDIS_PACKET_TYPE_FUNCTIONAL\t0x00000400\n#define NDIS_PACKET_TYPE_MAC_FRAME\t0x00000800\n\n#define NDIS_MEDIA_STATE_CONNECTED\t0x00000000\n#define NDIS_MEDIA_STATE_DISCONNECTED\t0x00000001\n\n#define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA     0x00000001\n#define NDIS_MAC_OPTION_RECEIVE_SERIALIZED      0x00000002\n#define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND      0x00000004\n#define NDIS_MAC_OPTION_NO_LOOPBACK             0x00000008\n#define NDIS_MAC_OPTION_FULL_DUPLEX             0x00000010\n#define NDIS_MAC_OPTION_EOTX_INDICATION         0x00000020\n#define NDIS_MAC_OPTION_8021P_PRIORITY          0x00000040\n#define NDIS_MAC_OPTION_RESERVED                0x80000000\n\n#endif /* _LINUX_NDIS_H */\n\n/** @} */\n"
  },
  {
    "path": "lib/networking/rndis_protocol.h",
    "content": "/**\n * \\file rndis_protocol.h\n *         RNDIS Defines\n *\n * \\author\n *         Colin O'Flynn <coflynn@newae.com>\n *\n * \\addtogroup usbstick\n */\n\n/* Copyright (c) 2008  Colin O'Flynn\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\n     notice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above copyright\n     notice, this list of conditions and the following disclaimer in\n     the documentation and/or other materials provided with the\n     distribution.\n   * Neither the name of the copyright holders nor the names of\n     contributors may be used to endorse or promote products derived\n     from this software without specific prior written permission.\n\n  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n  POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef _RNDIS_H\n#define _RNDIS_H\n\n/**\n  \\addtogroup RNDIS\n  @{\n  */\n\n#include <stdint.h>\n\n#define RNDIS_MAJOR_VERSION\t1\n#define RNDIS_MINOR_VERSION 0\n\n#define RNDIS_STATUS_SUCCESS            0X00000000\n#define RNDIS_STATUS_FAILURE            0XC0000001\n#define RNDIS_STATUS_INVALID_DATA       0XC0010015\n#define RNDIS_STATUS_NOT_SUPPORTED      0XC00000BB\n#define RNDIS_STATUS_MEDIA_CONNECT      0X4001000B\n#define RNDIS_STATUS_MEDIA_DISCONNECT   0X4001000C\n\n\n/* Message set for Connectionless (802.3) Devices */\n#define REMOTE_NDIS_PACKET_MSG          0x00000001\n#define REMOTE_NDIS_INITIALIZE_MSG      0X00000002\n#define REMOTE_NDIS_HALT_MSG            0X00000003\n#define REMOTE_NDIS_QUERY_MSG           0X00000004\n#define REMOTE_NDIS_SET_MSG             0X00000005\n#define REMOTE_NDIS_RESET_MSG           0X00000006\n#define REMOTE_NDIS_INDICATE_STATUS_MSG 0X00000007\n#define REMOTE_NDIS_KEEPALIVE_MSG       0X00000008\n#define REMOTE_NDIS_INITIALIZE_CMPLT    0X80000002\n#define REMOTE_NDIS_QUERY_CMPLT         0X80000004\n#define REMOTE_NDIS_SET_CMPLT           0X80000005\n#define REMOTE_NDIS_RESET_CMPLT         0X80000006\n#define REMOTE_NDIS_KEEPALIVE_CMPLT     0X80000008\n\ntypedef uint32_t rndis_MessageType_t;\ntypedef uint32_t rndis_MessageLength_t;\ntypedef uint32_t rndis_RequestId_t;\ntypedef uint32_t rndis_MajorVersion_t;\ntypedef uint32_t rndis_MinorVersion_t;\ntypedef uint32_t rndis_MaxTransferSize_t;\ntypedef uint32_t rndis_Status_t;\n\n\n/* Device Flags */\n#define RNDIS_DF_CONNECTIONLESS      0x00000001\n#define RNDIS_DF_CONNECTION_ORIENTED 0x00000002\ntypedef uint32_t rndis_DeviceFlags_t;\n\n/* Mediums */\n#define RNDIS_MEDIUM_802_3           0x00000000\ntypedef uint32_t rndis_Medium_t;\n\n\ntypedef uint32_t rndis_MaxPacketsPerTransfer_t;\ntypedef uint32_t rndis_PacketAlignmentFactor_t;\ntypedef uint32_t rndis_AfListOffset_t;\ntypedef uint32_t rndis_AfListSize_t;\n\n/*** Remote NDIS Generic Message type ***/\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\t} rndis_generic_msg_t;\n\n\n/*** Remote NDIS Initialize Message ***/\ntypedef struct{\n\trndis_MessageType_t \tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\trndis_MajorVersion_t\tMajorVersion;\n\trndis_MinorVersion_t\tMinorVersion;\n\trndis_MaxTransferSize_t\tMaxTransferSize;\n\t} rndis_initialize_msg_t;\n\n/* Response: */\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\trndis_Status_t\t\t\tStatus;\n\trndis_MajorVersion_t\tMajorVersion;\n\trndis_MinorVersion_t\tMinorVersion;\n\trndis_DeviceFlags_t\t\tDeviceFlags;\n\trndis_Medium_t\t\t\tMedium;\n\trndis_MaxPacketsPerTransfer_t \tMaxPacketsPerTransfer;\n\trndis_MaxTransferSize_t\t\t\tMaxTransferSize;\n\trndis_PacketAlignmentFactor_t \tPacketAlignmentFactor;\n\trndis_AfListOffset_t\tAfListOffset;\n\trndis_AfListSize_t\t\tAfListSize;\n\t} rndis_initialize_cmplt_t;\n\n\n/*** Remote NDIS Halt Message ***/\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\t} rndis_halt_msg_t;\n\ntypedef uint32_t rndis_Oid_t;\ntypedef uint32_t rndis_InformationBufferLength_t;\ntypedef uint32_t rndis_InformationBufferOffset_t;\ntypedef uint32_t rndis_DeviceVcHandle_t;\n\n/*** Remote NDIS Query Message ***/\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\trndis_Oid_t\t\t\t\tOid;\n\trndis_InformationBufferLength_t\tInformationBufferLength;\n\trndis_InformationBufferOffset_t\tInformationBufferOffset;\n\trndis_DeviceVcHandle_t\t\t\tDeviceVcHandle;\n\t}  rndis_query_msg_t;\n\n/* Response: */\n\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\trndis_Status_t\t\t\tStatus;\n\trndis_InformationBufferLength_t\tInformationBufferLength;\n\trndis_InformationBufferOffset_t\tInformationBufferOffset;\n\t} rndis_query_cmplt_t;\n\n/*** Remote NDIS Set Message ***/\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\trndis_Oid_t\t\t\t\tOid;\n\trndis_InformationBufferLength_t\tInformationBufferLength;\n\trndis_InformationBufferOffset_t\tInformationBufferOffset;\n\trndis_DeviceVcHandle_t\t\t\tDeviceVcHandle;\n\t} rndis_set_msg_t;\n\n/* Response */\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\trndis_Status_t\t\t\tStatus;\n\t}rndis_set_cmplt_t;\n\n/* Information buffer layout for OID_GEN_RNDIS_CONFIG_PARAMETER */\ntypedef uint32_t rndis_ParameterNameOffset_t;\ntypedef uint32_t rndis_ParameterNameLength_t;\ntypedef uint32_t rndis_ParameterType_t;\ntypedef uint32_t rndis_ParameterValueOffset_t;\ntypedef uint32_t rndis_ParameterValueLength_t;\n\n#define PARAMETER_TYPE_STRING\t\t2\n#define PARAMETER_TYPE_NUMERICAL\t0\n\ntypedef struct{\n\trndis_ParameterNameOffset_t\t\tParameterNameOffset;\n\trndis_ParameterNameLength_t\t\tParameterNameLength;\n\trndis_ParameterType_t\t\t\tParameterType;\n\trndis_ParameterValueOffset_t\tParameterValueOffset;\n\trndis_ParameterValueLength_t\tParameterValueLength;\n\t}rndis_config_parameter_t;\n\ntypedef uint32_t rndis_Reserved_t;\n\n/*** Remote NDIS Soft Reset Message ***/\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_Reserved_t\t\tReserved;\n\t} rndis_reset_msg_t;\n\ntypedef uint32_t rndis_AddressingReset_t;\n\n/* Response: */\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_Status_t\t\t\tStatus;\n\trndis_AddressingReset_t\tAddressingReset;\n\t}  rndis_reset_cmplt_t;\n\n/*** Remote NDIS Indicate Status Message ***/\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_Status_t\t\t\tStatus;\n\trndis_Status_t\t\t\tStatusBufferLength;\n\trndis_Status_t\t\t\tStatusBufferOffset;\n\t}  rndis_indicate_status_t;\n\ntypedef uint32_t rndis_DiagStatus_t;\ntypedef uint32_t rndis_ErrorOffset_t;\n\ntypedef struct {\n\trndis_DiagStatus_t\t\tDiagStatus;\n\trndis_ErrorOffset_t\t\tErrorOffset;\n\t}rndis_diagnostic_info_t;\n\n/*** Remote NDIS Keepalive Message */\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\t}rndis_keepalive_msg_t;\n\n/* Response: */\ntypedef struct{\n\trndis_MessageType_t\t\tMessageType;\n\trndis_MessageLength_t\tMessageLength;\n\trndis_RequestId_t\t\tRequestId;\n\trndis_Status_t\t\t\tStatus;\n\t}rndis_keepalive_cmplt_t;\n\n/*** Remote NDIS Data Packet ***/\n\ntypedef uint32_t rndis_DataOffset_t;\ntypedef uint32_t rndis_DataLength_t;\ntypedef uint32_t rndis_OOBDataOffset_t;\ntypedef uint32_t rndis_OOBDataLength_t;\ntypedef uint32_t rndis_NumOOBDataElements_t;\ntypedef uint32_t rndis_PerPacketInfoOffset_t;\ntypedef uint32_t rndis_PerPacketInfoLength_t;\n\ntypedef struct{\n\trndis_MessageType_t\t\t\tMessageType;\n\trndis_MessageLength_t\t\tMessageLength;\n\trndis_DataOffset_t\t\t\tDataOffset;\n\trndis_DataLength_t\t\t\tDataLength;\n\trndis_OOBDataOffset_t\t\tOOBDataOffset;\n\trndis_OOBDataLength_t\t\tOOBDataLength;\n\trndis_NumOOBDataElements_t\tNumOOBDataElements;\n\trndis_PerPacketInfoOffset_t\tPerPacketInfoOffset;\n\trndis_PerPacketInfoLength_t PerPacketInfoLength;\n\trndis_DeviceVcHandle_t\t\tDeviceVcHandle;\n\trndis_Reserved_t\t\t\tReserved;\n\t}rndis_data_packet_t;\n\ntypedef uint32_t rndis_ClassInformationOffset_t;\ntypedef uint32_t rndis_Size_t;\ntypedef uint32_t rndis_Type_t;\n\ntypedef struct{\n\trndis_Size_t\t\t\t\t\tSize;\n\trndis_Type_t\t\t\t\t\tType;\n\trndis_ClassInformationOffset_t\tClassInformationType;\n\t}rndis_OOB_packet_t;\n\n#include \"ndis.h\"\n\ntypedef enum rnids_state_e {\n\trndis_uninitialized,\n\trndis_initialized,\n\trndis_data_initialized\n\t} rndis_state_t;\n\ntypedef struct {\n\tuint32_t\t\ttxok;\n\tuint32_t\t\trxok;\n\tuint32_t\t\ttxbad;\n\tuint32_t\t\trxbad;\n} usb_eth_stat_t;\n\n#endif /* _RNDIS_H */\n\n/** @} */\n"
  },
  {
    "path": "lib/networking/rndis_reports.c",
    "content": "/*\n  The original version of this code was lrndis/usbd_rndis_core.c from https://github.com/fetisov/lrndis\n  It has since been overhauled to suit this application\n*/\n\n/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2015 by Sergey Fetisov <fsenok@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <stdalign.h>\n#include <string.h>\n#include \"tusb.h\"\n\n#if CFG_TUD_ECM_RNDIS\n\n#include \"rndis_protocol.h\"\n#include \"netif/ethernet.h\"\n\n#define RNDIS_LINK_SPEED 12000000                       /* Link baudrate (12Mbit/s for USB-FS) */\n#define RNDIS_VENDOR     \"TinyUSB\"                      /* NIC vendor name */\n\nstatic const uint8_t *const station_hwaddr = tud_network_mac_address;\nstatic const uint8_t *const permanent_hwaddr = tud_network_mac_address;\n\nstatic usb_eth_stat_t usb_eth_stat = { 0, 0, 0, 0 };\nstatic uint32_t oid_packet_filter = 0x0000000;\nTU_ATTR_UNUSED static rndis_state_t rndis_state;\n\nstatic const uint32_t OIDSupportedList[] =\n{\n  OID_GEN_SUPPORTED_LIST,\n  OID_GEN_HARDWARE_STATUS,\n  OID_GEN_MEDIA_SUPPORTED,\n  OID_GEN_MEDIA_IN_USE,\n  OID_GEN_MAXIMUM_FRAME_SIZE,\n  OID_GEN_LINK_SPEED,\n  OID_GEN_TRANSMIT_BLOCK_SIZE,\n  OID_GEN_RECEIVE_BLOCK_SIZE,\n  OID_GEN_VENDOR_ID,\n  OID_GEN_VENDOR_DESCRIPTION,\n  OID_GEN_VENDOR_DRIVER_VERSION,\n  OID_GEN_CURRENT_PACKET_FILTER,\n  OID_GEN_MAXIMUM_TOTAL_SIZE,\n  OID_GEN_PROTOCOL_OPTIONS,\n  OID_GEN_MAC_OPTIONS,\n  OID_GEN_MEDIA_CONNECT_STATUS,\n  OID_GEN_MAXIMUM_SEND_PACKETS,\n  OID_802_3_PERMANENT_ADDRESS,\n  OID_802_3_CURRENT_ADDRESS,\n  OID_802_3_MULTICAST_LIST,\n  OID_802_3_MAXIMUM_LIST_SIZE,\n  OID_802_3_MAC_OPTIONS\n};\n\n#define OID_LIST_LENGTH TU_ARRAY_SIZE(OIDSupportedList)\n#define ENC_BUF_SIZE    (OID_LIST_LENGTH * 4 + 32)\n\nstatic void *encapsulated_buffer;\n\nstatic void rndis_report(void) {\n  uint8_t ndis_report[8] = { 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00 };\n  netd_report(ndis_report, sizeof(ndis_report));\n}\n\nstatic void rndis_query_cmplt32(int status, uint32_t data)\n{\n  rndis_query_cmplt_t *c;\n  c = (rndis_query_cmplt_t *)encapsulated_buffer;\n  c->MessageType = REMOTE_NDIS_QUERY_CMPLT;\n  c->MessageLength = sizeof(rndis_query_cmplt_t) + 4;\n  c->InformationBufferLength = 4;\n  c->InformationBufferOffset = 16;\n  c->Status = status;\n  memcpy(c + 1, &data, sizeof(data));\n  rndis_report();\n}\n\nstatic void rndis_query_cmplt(int status, const void *data, int size)\n{\n  rndis_query_cmplt_t *c;\n  c = (rndis_query_cmplt_t *)encapsulated_buffer;\n  c->MessageType = REMOTE_NDIS_QUERY_CMPLT;\n  c->MessageLength = sizeof(rndis_query_cmplt_t) + size;\n  c->InformationBufferLength = size;\n  c->InformationBufferOffset = 16;\n  c->Status = status;\n  memcpy(c + 1, data, size);\n  rndis_report();\n}\n\n#define MAC_OPT NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA | \\\n                NDIS_MAC_OPTION_RECEIVE_SERIALIZED  | \\\n                NDIS_MAC_OPTION_TRANSFERS_NOT_PEND  | \\\n                NDIS_MAC_OPTION_NO_LOOPBACK\n\nstatic const char *rndis_vendor = RNDIS_VENDOR;\n\nstatic void rndis_query(void)\n{\n  switch (((rndis_query_msg_t *)encapsulated_buffer)->Oid)\n  {\n    case OID_GEN_SUPPORTED_LIST:         rndis_query_cmplt(RNDIS_STATUS_SUCCESS, OIDSupportedList, 4 * OID_LIST_LENGTH); return;\n    case OID_GEN_VENDOR_DRIVER_VERSION:  rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0x00001000);  return;\n    case OID_802_3_CURRENT_ADDRESS:      rndis_query_cmplt(RNDIS_STATUS_SUCCESS, station_hwaddr, 6); return;\n    case OID_802_3_PERMANENT_ADDRESS:    rndis_query_cmplt(RNDIS_STATUS_SUCCESS, permanent_hwaddr, 6); return;\n    case OID_GEN_MEDIA_SUPPORTED:        rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); return;\n    case OID_GEN_MEDIA_IN_USE:           rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); return;\n    case OID_GEN_PHYSICAL_MEDIUM:        rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIUM_802_3); return;\n    case OID_GEN_HARDWARE_STATUS:        rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return;\n    case OID_GEN_LINK_SPEED:             rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, RNDIS_LINK_SPEED / 100); return;\n    case OID_GEN_VENDOR_ID:              rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0x00FFFFFF); return;\n    case OID_GEN_VENDOR_DESCRIPTION:     rndis_query_cmplt(RNDIS_STATUS_SUCCESS, rndis_vendor, strlen(rndis_vendor) + 1); return;\n    case OID_GEN_CURRENT_PACKET_FILTER:  rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, oid_packet_filter); return;\n    case OID_GEN_MAXIMUM_FRAME_SIZE:     rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU - SIZEOF_ETH_HDR); return;\n    case OID_GEN_MAXIMUM_TOTAL_SIZE:     rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); return;\n    case OID_GEN_TRANSMIT_BLOCK_SIZE:    rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); return;\n    case OID_GEN_RECEIVE_BLOCK_SIZE:     rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, CFG_TUD_NET_MTU); return;\n    case OID_GEN_MEDIA_CONNECT_STATUS:   rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, NDIS_MEDIA_STATE_CONNECTED); return;\n    case OID_GEN_RNDIS_CONFIG_PARAMETER: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return;\n    case OID_802_3_MAXIMUM_LIST_SIZE:    rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 1); return;\n    case OID_802_3_MULTICAST_LIST:       rndis_query_cmplt32(RNDIS_STATUS_NOT_SUPPORTED, 0); return;\n    case OID_802_3_MAC_OPTIONS:          rndis_query_cmplt32(RNDIS_STATUS_NOT_SUPPORTED, 0); return;\n    case OID_GEN_MAC_OPTIONS:            rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, /*MAC_OPT*/ 0); return;\n    case OID_802_3_RCV_ERROR_ALIGNMENT:  rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return;\n    case OID_802_3_XMIT_ONE_COLLISION:   rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return;\n    case OID_802_3_XMIT_MORE_COLLISIONS: rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return;\n    case OID_GEN_XMIT_OK:                rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.txok); return;\n    case OID_GEN_RCV_OK:                 rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.rxok); return;\n    case OID_GEN_RCV_ERROR:              rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.rxbad); return;\n    case OID_GEN_XMIT_ERROR:             rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, usb_eth_stat.txbad); return;\n    case OID_GEN_RCV_NO_BUFFER:          rndis_query_cmplt32(RNDIS_STATUS_SUCCESS, 0); return;\n    default:                             rndis_query_cmplt(RNDIS_STATUS_FAILURE, NULL, 0); return;\n  }\n}\n\n#define INFBUF  ((uint8_t *)&(m->RequestId) + m->InformationBufferOffset)\n\nstatic void rndis_handle_config_parm(const char *data, int keyoffset, int valoffset, int keylen, int vallen)\n{\n    (void)data;\n    (void)keyoffset;\n    (void)valoffset;\n    (void)keylen;\n    (void)vallen;\n}\n\nstatic void rndis_packetFilter(uint32_t newfilter)\n{\n    (void)newfilter;\n}\n\nstatic void rndis_handle_set_msg(void)\n{\n  rndis_set_cmplt_t *c;\n  rndis_set_msg_t *m;\n  rndis_Oid_t oid;\n\n  c = (rndis_set_cmplt_t *)encapsulated_buffer;\n  m = (rndis_set_msg_t *)encapsulated_buffer;\n\n  oid = m->Oid;\n  c->MessageType = REMOTE_NDIS_SET_CMPLT;\n  c->MessageLength = sizeof(rndis_set_cmplt_t);\n  c->Status = RNDIS_STATUS_SUCCESS;\n\n  switch (oid)\n  {\n    /* Parameters set up in 'Advanced' tab */\n    case OID_GEN_RNDIS_CONFIG_PARAMETER:\n      {\n        rndis_config_parameter_t *p;\n        char *ptr = (char *)m;\n        ptr += sizeof(rndis_generic_msg_t);\n        ptr += m->InformationBufferOffset;\n        p = (rndis_config_parameter_t *) ((void*) ptr);\n        rndis_handle_config_parm(ptr, p->ParameterNameOffset, p->ParameterValueOffset, p->ParameterNameLength, p->ParameterValueLength);\n      }\n      break;\n\n    /* Mandatory general OIDs */\n    case OID_GEN_CURRENT_PACKET_FILTER:\n      memcpy(&oid_packet_filter, INFBUF, 4);\n      if (oid_packet_filter)\n      {\n        rndis_packetFilter(oid_packet_filter);\n        rndis_state = rndis_data_initialized;\n      }\n      else\n      {\n        rndis_state = rndis_initialized;\n      }\n      break;\n\n    case OID_GEN_CURRENT_LOOKAHEAD:\n      break;\n\n    case OID_GEN_PROTOCOL_OPTIONS:\n      break;\n\n    /* Mandatory 802_3 OIDs */\n    case OID_802_3_MULTICAST_LIST:\n      break;\n\n    /* Power Management: fails for now */\n    case OID_PNP_ADD_WAKE_UP_PATTERN:\n    case OID_PNP_REMOVE_WAKE_UP_PATTERN:\n    case OID_PNP_ENABLE_WAKE_UP:\n    default:\n      c->Status = RNDIS_STATUS_FAILURE;\n      break;\n  }\n\n  /* c->MessageID is same as before */\n  rndis_report();\n  return;\n}\n\nvoid rndis_class_set_handler(uint8_t *data, int size)\n{\n  encapsulated_buffer = data;\n  (void)size;\n\n  switch (((rndis_generic_msg_t *)encapsulated_buffer)->MessageType)\n  {\n    case REMOTE_NDIS_INITIALIZE_MSG:\n      {\n        rndis_initialize_cmplt_t *m;\n        m = ((rndis_initialize_cmplt_t *)encapsulated_buffer);\n        /* m->MessageID is same as before */\n        m->MessageType = REMOTE_NDIS_INITIALIZE_CMPLT;\n        m->MessageLength = sizeof(rndis_initialize_cmplt_t);\n        m->MajorVersion = RNDIS_MAJOR_VERSION;\n        m->MinorVersion = RNDIS_MINOR_VERSION;\n        m->Status = RNDIS_STATUS_SUCCESS;\n        m->DeviceFlags = RNDIS_DF_CONNECTIONLESS;\n        m->Medium = RNDIS_MEDIUM_802_3;\n        m->MaxPacketsPerTransfer = 1;\n        m->MaxTransferSize = CFG_TUD_NET_MTU + sizeof(rndis_data_packet_t);\n        m->PacketAlignmentFactor = 0;\n        m->AfListOffset = 0;\n        m->AfListSize = 0;\n        rndis_state = rndis_initialized;\n        rndis_report();\n      }\n      break;\n\n    case REMOTE_NDIS_QUERY_MSG:\n      rndis_query();\n      break;\n\n    case REMOTE_NDIS_SET_MSG:\n      rndis_handle_set_msg();\n      break;\n\n    case REMOTE_NDIS_RESET_MSG:\n      {\n        rndis_reset_cmplt_t * m;\n        m = ((rndis_reset_cmplt_t *)encapsulated_buffer);\n        rndis_state = rndis_uninitialized;\n        m->MessageType = REMOTE_NDIS_RESET_CMPLT;\n        m->MessageLength = sizeof(rndis_reset_cmplt_t);\n        m->Status = RNDIS_STATUS_SUCCESS;\n        m->AddressingReset = 1; /* Make it look like we did something */\n          /* m->AddressingReset = 0; - Windows halts if set to 1 for some reason */\n        rndis_report();\n      }\n      break;\n\n    case REMOTE_NDIS_KEEPALIVE_MSG:\n      {\n        rndis_keepalive_cmplt_t * m;\n        m = (rndis_keepalive_cmplt_t *)encapsulated_buffer;\n        m->MessageType = REMOTE_NDIS_KEEPALIVE_CMPLT;\n        m->MessageLength = sizeof(rndis_keepalive_cmplt_t);\n        m->Status = RNDIS_STATUS_SUCCESS;\n      }\n      /* We have data to send back */\n      rndis_report();\n      break;\n\n    default:\n      break;\n  }\n}\n\n#endif\n"
  },
  {
    "path": "lib/rt-thread/SConscript",
    "content": "import rtconfig\nfrom building import *\n\ncwd     = GetCurrentDir()\nsrc     = Split(\"\"\"\n../../src/tusb.c\n../../src/common/tusb_fifo.c\n./tusb_rt_thread_port.c\n\"\"\")\npath = [cwd, cwd + \"/../../src\"]\n\nLOCAL_CFLAGS = ''\n\n# for device stack\nif GetDepend([\"PKG_TINYUSB_DEVICE_ENABLE\"]):\n    src += [\"../../src/device/usbd.c\",\n            \"../../src/device/usbd_control.c\"]\n    # BSP\n    if GetDepend([\"SOC_FAMILY_STM32\"]):\n        src += [\"../../src/portable/synopsys/dwc2/dcd_dwc2.c\",\n                \"../../src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c\",\n                \"../../src/portable/st/stm32_fsdev/fsdev_common.c\"]\n\n    if GetDepend([\"SOC_NRF52840\"]):\n        src += [\"../../src/portable/nordic/nrf5x/dcd_nrf5x.c\"]\n\n    if GetDepend([\"SOC_FAMILY_RENESAS\"]):\n        src += [\"../../src/portable/renesas/rusb2/dcd_rusb2.c\",\n                \"../../src/portable/renesas/rusb2/rusb2_common.c\"]\n\n    # Device class\n    if GetDepend([\"PKG_TINYUSB_DEVICE_UVC\"]):\n        src += [\"../../src/class/video/video_device.c\"]\n    if GetDepend([\"PKG_TINYUSB_DEVICE_CDC\"]):\n        src += [\"../../src/class/cdc/cdc_device.c\"]\n    if GetDepend([\"PKG_TINYUSB_DEVICE_MSC\"]):\n        src += [\"../../src/class/msc/msc_device.c\", \"port/msc_device_port.c\"]\n    if GetDepend([\"PKG_TINYUSB_DEVICE_MTP\"]):\n        src += [\"../../src/class/mtp/mtp_device.c\"]\n    if GetDepend([\"PKG_TINYUSB_DEVICE_HID\"]):\n        src += [\"../../src/class/hid/hid_device.c\"]\n\n# for host stack\nif GetDepend([\"PKG_TINYUSB_HOST_ENABLE\"]):\n    src += [\"../../src/host/usbh.c\", \"../../src/host/hub.c\"]\n\n    if GetDepend([\"SOC_FAMILY_RENESAS\"]):\n        src += [\"../../src/portable/renesas/rusb2/hcd_rusb2.c\",\n                \"../../src/portable/renesas/rusb2/rusb2_common.c\"]\n\n\nif rtconfig.PLATFORM == 'gcc' or rtconfig.PLATFORM == 'armclang': # GCC or Keil AC6\n    LOCAL_CFLAGS += ' -std=c99'\nelif rtconfig.PLATFORM == 'armcc': # Keil AC5\n    LOCAL_CFLAGS += ' --c99 --gnu'\n\ngroup = DefineGroup('TinyUSB', src, depend = ['PKG_USING_TINYUSB'], CPPPATH = path, LOCAL_CFLAGS = LOCAL_CFLAGS)\n\nReturn('group')\n"
  },
  {
    "path": "lib/rt-thread/port/msc_device_port.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifdef __RTTHREAD__\n#include <tusb.h>\n#include <stdint.h>\n\n#include <board.h>\n#include <rtdevice.h>\n\nstatic bool ejected = false;\nstatic rt_device_t flash_device;\nstatic struct rt_device_blk_geometry blk_geom;\n\n#ifdef __CC_ARM\nuint16_t __builtin_bswap16(uint16_t x)\n{\n    return (x << 8) | (x >> 8);\n}\n#endif\n\nvoid tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4])\n{\n    (void) lun;\n\n    const char vid[] = PKG_TINYUSB_DEVICE_MSC_VID;\n    const char pid[] = PKG_TINYUSB_DEVICE_MSC_PID;\n    const char rev[] = PKG_TINYUSB_DEVICE_MSC_REV;\n\n    memcpy(vendor_id, vid, strlen(vid));\n    memcpy(product_id, pid, strlen(pid));\n    memcpy(product_rev, rev, strlen(rev));\n}\n\nbool tud_msc_test_unit_ready_cb(uint8_t lun)\n{\n    (void) lun;\n\n    if (ejected)\n    {\n        tud_msc_set_sense(lun, SCSI_SENSE_NOT_READY, 0x3a, 0x00);\n        return false;\n    }\n\n    if (flash_device == NULL)\n    {\n        flash_device = rt_device_find(PKG_TINYUSB_DEVICE_MSC_NAME);\n    }\n    if (flash_device != NULL)\n    {\n        static uint8_t open_flg = 0;\n        if (!open_flg)\n        {\n            open_flg = 1;\n            rt_device_open(flash_device, 0);\n        }\n\n        rt_device_control(flash_device, RT_DEVICE_CTRL_BLK_GETGEOME, &blk_geom);\n        return true;\n    }\n\n    return false;\n}\n\nvoid tud_msc_capacity_cb(uint8_t lun, uint32_t *block_count, uint16_t *block_size)\n{\n    (void) lun;\n\n    *block_count = blk_geom.sector_count;\n    *block_size  = blk_geom.bytes_per_sector;\n}\n\nbool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject)\n{\n    (void) lun;\n    (void) power_condition;\n\n    if (load_eject)\n    {\n        if (start)\n        {\n            ejected = false;\n        } else {\n            // unload disk storage\n            ejected = true;\n        }\n    }\n\n    return true;\n}\n\nint32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void *buffer, uint32_t bufsize)\n{\n    (void) lun;\n    (void) offset;\n    (void) bufsize;\n\n    return (int32_t) rt_device_read(flash_device, (rt_off_t) lba, buffer, 1) * blk_geom.bytes_per_sector;\n}\n\nint32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t *buffer, uint32_t bufsize)\n{\n    (void) lun;\n    (void) offset;\n    (void) bufsize;\n\n    return (int32_t) rt_device_write(flash_device, (rt_off_t) lba, buffer, 1) * blk_geom.bytes_per_sector;\n}\n\nint32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer, uint16_t bufsize)\n{\n    void const *response = NULL;\n    uint16_t resplen = 0;\n\n    // most scsi handled is input\n    bool in_xfer = true;\n\n    switch (scsi_cmd[0])\n    {\n        case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL:\n            // Host is about to read/write etc ... better not to disconnect disk\n            resplen = 0;\n            break;\n\n        default:\n            // Set Sense = Invalid Command Operation\n            tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);\n\n            // negative means error -> tinyusb could stall and/or response with failed status\n            resplen = -1;\n            break;\n    }\n\n    // return resplen must not larger than bufsize\n    if (resplen > bufsize) resplen = bufsize;\n\n    if (response && (resplen > 0))\n    {\n        if (in_xfer)\n        {\n            memcpy(buffer, response, resplen);\n        } else {\n            // SCSI output\n        }\n    }\n\n    return resplen;\n}\n#endif /*__RTTHREAD__*/\n"
  },
  {
    "path": "lib/rt-thread/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __RTTHREAD__\n#include <rtconfig.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n#if   defined(SOC_SERIES_STM32F0)\n#define CFG_TUSB_MCU    OPT_MCU_STM32F0\n#elif defined(SOC_SERIES_STM32F1)\n#define CFG_TUSB_MCU    OPT_MCU_STM32F1\n#elif defined(SOC_SERIES_STM32F2)\n#define CFG_TUSB_MCU    OPT_MCU_STM32F2\n#elif defined(SOC_SERIES_STM32F3)\n#define CFG_TUSB_MCU    OPT_MCU_STM32F3\n#elif defined(SOC_SERIES_STM32F4)\n#define CFG_TUSB_MCU    OPT_MCU_STM32F4\n#elif defined(SOC_SERIES_STM32F7)\n#define CFG_TUSB_MCU    OPT_MCU_STM32F7\n#elif defined(SOC_SERIES_STM32H7)\n#define CFG_TUSB_MCU    OPT_MCU_STM32H7\n#elif defined(SOC_SERIES_STM32L0)\n#define CFG_TUSB_MCU    OPT_MCU_STM32L0\n#elif defined(SOC_SERIES_STM32L1)\n#define CFG_TUSB_MCU    OPT_MCU_STM32L1\n#elif defined(SOC_SERIES_STM32L4)\n#define CFG_TUSB_MCU    OPT_MCU_STM32L4\n#elif defined(SOC_NRF52840)\n#define CFG_TUSB_MCU    OPT_MCU_NRF5X\n#elif defined(SOC_HPM6000)\n#define CFG_TUSB_MCU    OPT_MCU_HPM\n#elif defined(SOC_RP2040)\n#define CFG_TUSB_MCU    OPT_MCU_RP2040\n#elif defined(SOC_FAMILY_RENESAS)\n#define CFG_TUSB_MCU    OPT_MCU_RAXXX\n#else\n#error \"Not support for current MCU\"\n#endif\n\n#define CFG_TUSB_OS OPT_OS_RTTHREAD\n\n//--------------------------------------------------------------------\n// DEBUG CONFIGURATION\n//--------------------------------------------------------------------\n#ifdef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG_PRINTF rt_kprintf\n#endif /* CFG_TUSB_DEBUG */\n\n#ifndef BOARD_DEVICE_RHPORT_NUM\n#define BOARD_DEVICE_RHPORT_NUM     PKG_TINYUSB_RHPORT_NUM\n#endif\n\n#ifndef BOARD_DEVICE_RHPORT_SPEED\n#define BOARD_DEVICE_RHPORT_SPEED   PKG_TINYUSB_DEVICE_PORT_SPEED\n#endif\n\n#if   BOARD_DEVICE_RHPORT_NUM == 0\n#define CFG_TUSB_RHPORT0_MODE     (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED)\n#elif BOARD_DEVICE_RHPORT_NUM == 1\n#define CFG_TUSB_RHPORT1_MODE     (OPT_MODE_DEVICE | BOARD_DEVICE_RHPORT_SPEED)\n#else\n  #error \"Incorrect RHPort configuration\"\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION        rt_section(PKG_TINYUSB_MEM_SECTION)\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN          rt_align(PKG_TINYUSB_MEM_ALIGN)\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n#if defined(PKG_TINYUSB_DEVICE_ENABLE)\n  #define CFG_TUD_ENABLED             (1)\n#else\n  #define CFG_TUD_ENABLED             (0)\n#endif\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE        PKG_TINYUSB_EDPT0_SIZE\n#endif\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE        PKG_TINYUSB_DEVICE_CDC_RX_BUFSIZE\n#define CFG_TUD_CDC_TX_BUFSIZE        PKG_TINYUSB_DEVICE_CDC_TX_BUFSIZE\n\n#define CFG_TUD_MSC_EP_BUFSIZE        PKG_TINYUSB_DEVICE_MSC_EP_BUFSIZE\n\n#define CFG_TUD_HID_EP_BUFSIZE        PKG_TINYUSB_DEVICE_HID_EP_BUFSIZE\n\n#ifndef PKG_TINYUSB_DEVICE_CDC_STRING\n#define PKG_TINYUSB_DEVICE_CDC_STRING \"\"\n#endif\n\n#ifndef PKG_TINYUSB_DEVICE_MSC_STRING\n#define PKG_TINYUSB_DEVICE_MSC_STRING \"\"\n#endif\n\n#ifndef PKG_TINYUSB_DEVICE_HID_STRING\n#define PKG_TINYUSB_DEVICE_HID_STRING \"\"\n#endif\n\n//--------------------------------------------------------------------\n// HOST CONFIGURATION\n//--------------------------------------------------------------------\n#if defined(PKG_TINYUSB_HOST_ENABLE)\n  #define CFG_TUH_ENABLED             (1)\n#else\n  #define CFG_TUH_ENABLED             (0)\n#endif\n\n#if (PKG_TINYUSB_HOST_PORT == 0) && defined(PKG_TINYUSB_HOST_ENABLE)\n#undef CFG_TUSB_RHPORT0_MODE\n#define CFG_TUSB_RHPORT0_MODE     (OPT_MODE_HOST | PKG_TINYUSB_HOST_PORT_SPEED)\n#endif\n\n#if (PKG_TINYUSB_HOST_PORT == 1) && defined(PKG_TINYUSB_HOST_ENABLE)\n#undef CFG_TUSB_RHPORT1_MODE\n#define CFG_TUSB_RHPORT1_MODE     (OPT_MODE_HOST | PKG_TINYUSB_HOST_PORT_SPEED)\n#endif\n\n#define BOARD_TUH_RHPORT            PKG_TINYUSB_HOST_PORT // FULL SPEED\n#define BOARD_TUH_MAX_SPEED         PKG_TINYUSB_HOST_PORT_SPEED\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUH_MAX_SPEED           BOARD_TUH_MAX_SPEED\n\n//------------------------- Board Specific --------------------------\n\n// RHPort number used for host can be defined by board.mk, default to port 0\n#ifndef BOARD_TUH_RHPORT\n#define BOARD_TUH_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUH_MAX_SPEED\n#define BOARD_TUH_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n// Size of buffer to hold descriptors and other data used for enumeration\n#define CFG_TUH_ENUMERATION_BUFSIZE 256\n\n#define CFG_TUH_HUB                 2 // number of supported hubs\n#define CFG_TUH_CDC                 0 // CDC ACM\n#define CFG_TUH_CDC_FTDI            0 // FTDI Serial.  FTDI is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_CDC_CP210X          0 // CP210x Serial. CP210X is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_CDC_CH34X           0 // CH340 or CH341 Serial. CH34X is not part of CDC class, only to re-use CDC driver API\n#define CFG_TUH_HID                 0 // typical keyboard + mouse device can have 3-4 HID interfaces\n#define CFG_TUH_MSC                 0\n//#define CFG_TUH_VENDOR              3\n\n// max device support (excluding hub device): 1 hub typically has 4 ports\n#define CFG_TUH_DEVICE_MAX          (3*CFG_TUH_HUB + 1)\n\n//------------- HID -------------//\n#define CFG_TUH_HID_EPIN_BUFSIZE    64\n#define CFG_TUH_HID_EPOUT_BUFSIZE   64\n\n//------------- CDC -------------//\n\n// Set Line Control state on enumeration/mounted:\n// DTR ( bit 0), RTS (bit 1)\n#define CFG_TUH_CDC_LINE_CONTROL_ON_ENUM    0x03\n\n// Set Line Coding on enumeration/mounted, value for cdc_line_coding_t\n// bit rate = 115200, 1 stop bit, no parity, 8 bit data width\n#define CFG_TUH_CDC_LINE_CODING_ON_ENUM   { 115200, CDC_LINE_CODING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 }\n\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif /*__RTTHREAD__*/\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "lib/rt-thread/tusb_rt_thread_port.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifdef __RTTHREAD__\n#include <rtthread.h>\n\n#define  DBG_TAG  \"TinyUSB\"\n#define  DBG_LVL  DBG_INFO\n#include <rtdbg.h>\n#include <tusb.h>\n\n#ifndef RT_USING_HEAP\n/* if there is not enable heap, we should use static thread and stack. */\nstatic rt_uint8_t tusb_stack[PKG_TINYUSB_STACK_SIZE];\nstatic struct rt_thread tusb_thread;\n#endif /* RT_USING_HEAP */\n\nextern int tusb_board_init(void);\n\nstatic void tusb_thread_entry(void *parameter)\n{\n    (void) parameter;\n    while (1)\n    {\n#if CFG_TUH_ENABLED\n        tuh_task();\n#endif\n#if CFG_TUD_ENABLED\n        tud_task();\n#endif\n    }\n}\n\nstatic int init_tinyusb(void)\n{\n    rt_thread_t tid;\n\n    tusb_board_init();\n    tusb_init();\n\n#ifdef RT_USING_HEAP\n    tid = rt_thread_create(\"tusb\", tusb_thread_entry, RT_NULL,\n                           PKG_TINYUSB_STACK_SIZE,\n                           PKG_TINYUSB_THREAD_PRIORITY, 10);\n    if (tid == RT_NULL)\n#else\n    rt_err_t result;\n\n    tid = &tusb_thread;\n    result = rt_thread_init(tid, \"tusb\", tusb_thread_entry, RT_NULL,\n                            tusb_stack, sizeof(tusb_stack), 4, 10);\n    if (result != RT_EOK)\n#endif /* RT_USING_HEAP */\n    {\n        LOG_E(\"Fail to create TinyUSB thread\");\n        return -1;\n    }\n\n    rt_thread_startup(tid);\n\n    return 0;\n}\nINIT_APP_EXPORT(init_tinyusb);\n#endif /*__RTTHREAD__*/\n"
  },
  {
    "path": "library.json",
    "content": "{\n    \"name\": \"TinyUSB\",\n    \"version\": \"0.20.0\",\n    \"description\": \"TinyUSB is an open-source cross-platform USB Host/Device stack for embedded system, designed to be memory-safe with no dynamic allocation and thread-safe with all interrupt events are deferred then handled in the non-ISR task function.\",\n    \"keywords\": \"usb, host, device\",\n    \"repository\":\n    {\n      \"type\": \"git\",\n      \"url\": \"https://github.com/hathach/tinyusb.git\"\n    },\n    \"authors\":\n    [\n      {\n        \"name\": \"Ha Thach\",\n        \"email\": \"thach@tinyusb.org\",\n        \"maintainer\": true\n      }\n    ],\n    \"license\": \"MIT\",\n    \"homepage\": \"https://www.tinyusb.org/\",\n    \"frameworks\": \"*\",\n    \"platforms\": \"*\"\n}\n"
  },
  {
    "path": "pkg.yml",
    "content": "pkg.name: tinyusb\npkg.description: An open source cross-platform USB stack for embedded system\npkg.author: \"Ha Thach <thach@tinyusb.org>\"\npkg.homepage: \"https://github.com/hathach/tinyusb\"\npkg.keywords:\n    - usb\n\npkg.type: sdk\n\npkg.deps:\n    - \"@apache-mynewt-core/kernel/os\"\n\npkg.include_dirs:\n    - src\n"
  },
  {
    "path": "repository.yml",
    "content": "repo.name: tinyusb\nrepo.versions:\n    \"0.0.0\": \"master\"\n    \"0.5.0\": \"0.5.0\"\n    \"0.6.0\": \"0.6.0\"\n    \"0.7.0\": \"0.7.0\"\n    \"0.8.0\": \"0.8.0\"\n    \"0.9.0\": \"0.9.0\"\n    \"0.10.0\": \"0.10.0\"\n    \"0.10.1\": \"0.10.1\"\n    \"0.11.0\": \"0.11.0\"\n    \"0.12.0\": \"0.12.0\"\n    \"0.13.0\": \"0.13.0\"\n    \"0.14.0\": \"0.14.0\"\n    \"0.15.0\": \"0.15.0\"\n    \"0.16.0\": \"0.16.0\"\n    \"0.17.0\": \"0.17.0\"\n    \"0.18.0\": \"0.18.0\"\n    \"0.19.0\": \"0.19.0\"\n    \"0.20.0\": \"0.20.0\"\n    \"0-latest\": \"0.20.0\"\n    \"0-dev\": \"0.0.0\"\n"
  },
  {
    "path": "sonar-project.properties",
    "content": "sonar.projectKey=hathach_tinyusb\nsonar.organization=hathach\n\n\n# This is the name and version displayed in the SonarCloud UI.\nsonar.projectName=tinyusb\nsonar.projectVersion=0.20.0\n\n\n# Path is relative to the sonar-project.properties file. Replace \"\\\" by \"/\" on Windows.\n#sonar.sources=.\nsonar.exclusions=lib/**,hw/mcu/**,test/**\n\n# Encoding of the source code. Default is default system encoding\n#sonar.sourceEncoding=UTF-8\n"
  },
  {
    "path": "src/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\n# Get TinyUSB sources. Note: DCD and HCD drivers are not included\nfunction(tinyusb_sources_get OUTPUT_VAR)\n  set(${OUTPUT_VAR}\n    # common\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/tusb.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/common/tusb_fifo.c\n    # device\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/device/usbd.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/device/usbd_control.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/audio/audio_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/cdc/cdc_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/dfu/dfu_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/dfu/dfu_rt_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/hid/hid_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/midi/midi_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/msc/msc_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/mtp/mtp_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/net/ecm_rndis_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/net/ncm_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/printer/printer_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/usbtmc/usbtmc_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/vendor/vendor_device.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/video/video_device.c\n    # host\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/host/usbh.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/host/hub.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/cdc/cdc_host.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/hid/hid_host.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/midi/midi_host.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/msc/msc_host.c\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/class/vendor/vendor_host.c\n    # typec\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/typec/usbc.c\n    PARENT_SCOPE\n    )\nendfunction()\n\n# Add tinyusb to a existing target\nfunction(tinyusb_target_add TARGET)\n  tinyusb_sources_get(TINYUSB_SRC)\n  target_sources(${TARGET} PRIVATE ${TINYUSB_SRC})\n  target_include_directories(${TARGET} PUBLIC\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}\n    # TODO for net driver, should be removed/changed\n    ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../lib/networking\n    )\nendfunction()\n"
  },
  {
    "path": "src/class/audio/audio.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Reinhard Panhuber\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/** \\ingroup group_class\n *  \\defgroup ClassDriver_Audio Audio\n *            Currently only MIDI subclass is supported\n *  @{ */\n\n#ifndef TUSB_AUDIO_H__\n#define TUSB_AUDIO_H__\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// GENERIC AUDIO CLASS CODES (COMMON TO UAC1 AND UAC2)\n//--------------------------------------------------------------------+\n\n/// A.2 - Audio Function Subclass Codes\ntypedef enum {\n  AUDIO_FUNCTION_SUBCLASS_UNDEFINED = 0x00,\n} audio_function_subclass_type_t;\n\n/// A.3 - Audio Function Protocol Codes\ntypedef enum {\n  AUDIO_FUNC_PROTOCOL_CODE_UNDEF = 0x00,\n  AUDIO_FUNC_PROTOCOL_CODE_V1 = 0x00,///< Version 1.0 - same as undefined for backward compatibility\n  AUDIO_FUNC_PROTOCOL_CODE_V2 = 0x20,///< Version 2.0\n} audio_function_protocol_code_t;\n\n/// A.5 - Audio Interface Subclass Codes\ntypedef enum {\n  AUDIO_SUBCLASS_UNDEFINED = 0x00,\n  AUDIO_SUBCLASS_CONTROL,       ///< Audio Control\n  AUDIO_SUBCLASS_STREAMING,     ///< Audio Streaming\n  AUDIO_SUBCLASS_MIDI_STREAMING,///< MIDI Streaming\n} audio_subclass_type_t;\n\n/// A.6 - Audio Interface Protocol Codes\ntypedef enum {\n  AUDIO_INT_PROTOCOL_CODE_UNDEF = 0x00,\n  AUDIO_INT_PROTOCOL_CODE_V1 = 0x00,///< Version 1.0 - same as undefined for backward compatibility\n  AUDIO_INT_PROTOCOL_CODE_V2 = 0x20,///< Version 2.0\n} audio_interface_protocol_code_t;\n\n/// Terminal Types\n\n/// 2.1 - Audio Class-Terminal Types\ntypedef enum {\n  AUDIO_TERM_TYPE_USB_UNDEFINED = 0x0100,\n  AUDIO_TERM_TYPE_USB_STREAMING = 0x0101,\n  AUDIO_TERM_TYPE_USB_VENDOR_SPEC = 0x01FF,\n} audio_terminal_type_t;\n\n/// 2.2 - Audio Class-Input Terminal Types\ntypedef enum {\n  AUDIO_TERM_TYPE_IN_UNDEFINED = 0x0200,\n  AUDIO_TERM_TYPE_IN_GENERIC_MIC = 0x0201,\n  AUDIO_TERM_TYPE_IN_DESKTOP_MIC = 0x0202,\n  AUDIO_TERM_TYPE_IN_PERSONAL_MIC = 0x0203,\n  AUDIO_TERM_TYPE_IN_OMNI_MIC = 0x0204,\n  AUDIO_TERM_TYPE_IN_ARRAY_MIC = 0x0205,\n  AUDIO_TERM_TYPE_IN_PROC_ARRAY_MIC = 0x0206,\n} audio_terminal_input_type_t;\n\n/// 2.3 - Audio Class-Output Terminal Types\ntypedef enum {\n  AUDIO_TERM_TYPE_OUT_UNDEFINED = 0x0300,\n  AUDIO_TERM_TYPE_OUT_GENERIC_SPEAKER = 0x0301,\n  AUDIO_TERM_TYPE_OUT_HEADPHONES = 0x0302,\n  AUDIO_TERM_TYPE_OUT_HEAD_MNT_DISP_AUIDO = 0x0303,\n  AUDIO_TERM_TYPE_OUT_DESKTOP_SPEAKER = 0x0304,\n  AUDIO_TERM_TYPE_OUT_ROOM_SPEAKER = 0x0305,\n  AUDIO_TERM_TYPE_OUT_COMMUNICATION_SPEAKER = 0x0306,\n  AUDIO_TERM_TYPE_OUT_LOW_FRQ_EFFECTS_SPEAKER = 0x0307,\n} audio_terminal_output_type_t;\n\n/// Rest is yet to be implemented\n\n//--------------------------------------------------------------------+\n// USB AUDIO CLASS 1.0 (UAC1) DEFINITIONS\n//--------------------------------------------------------------------+\n\n/// A.5 - Audio Class-Specific AC Interface Descriptor Subtypes UAC1\ntypedef enum {\n  AUDIO10_CS_AC_INTERFACE_AC_DESCRIPTOR_UNDEF = 0x00,\n  AUDIO10_CS_AC_INTERFACE_HEADER = 0x01,\n  AUDIO10_CS_AC_INTERFACE_INPUT_TERMINAL = 0x02,\n  AUDIO10_CS_AC_INTERFACE_OUTPUT_TERMINAL = 0x03,\n  AUDIO10_CS_AC_INTERFACE_MIXER_UNIT = 0x04,\n  AUDIO10_CS_AC_INTERFACE_SELECTOR_UNIT = 0x05,\n  AUDIO10_CS_AC_INTERFACE_FEATURE_UNIT = 0x06,\n  AUDIO10_CS_AC_INTERFACE_PROCESSING_UNIT = 0x07,\n  AUDIO10_CS_AC_INTERFACE_EXTENSION_UNIT = 0x08,\n} audio10_cs_ac_interface_subtype_t;\n\n/// A.6 - Audio Class-Specific AS Interface Descriptor Subtypes UAC1\ntypedef enum {\n  AUDIO10_CS_AS_INTERFACE_AS_DESCRIPTOR_UNDEF = 0x00,\n  AUDIO10_CS_AS_INTERFACE_AS_GENERAL = 0x01,\n  AUDIO10_CS_AS_INTERFACE_FORMAT_TYPE = 0x02,\n} audio10_cs_as_interface_subtype_t;\n\n/// A.8 - Audio Class-Specific EP Descriptor Subtypes UAC1\ntypedef enum {\n  AUDIO10_CS_EP_SUBTYPE_UNDEF = 0x00,\n  AUDIO10_CS_EP_SUBTYPE_GENERAL = 0x01,\n} audio10_cs_ep_subtype_t;\n\n/// A.9 - Audio Class-Specific Request Codes UAC1\ntypedef enum {\n  AUDIO10_CS_REQ_UNDEF = 0x00,\n  AUDIO10_CS_REQ_SET_CUR = 0x01,\n  AUDIO10_CS_REQ_GET_CUR = 0x81,\n  AUDIO10_CS_REQ_SET_MIN = 0x02,\n  AUDIO10_CS_REQ_GET_MIN = 0x82,\n  AUDIO10_CS_REQ_SET_MAX = 0x03,\n  AUDIO10_CS_REQ_GET_MAX = 0x83,\n  AUDIO10_CS_REQ_SET_RES = 0x04,\n  AUDIO10_CS_REQ_GET_RES = 0x84,\n  AUDIO10_CS_REQ_SET_MEM = 0x05,\n  AUDIO10_CS_REQ_GET_MEM = 0x85,\n  AUDIO10_CS_REQ_GET_STAT = 0xFF,\n} audio10_cs_req_t;\n\n/// A.10.1 - Terminal Control Selectors UAC1\ntypedef enum {\n  AUDIO10_TE_CTRL_UNDEF = 0x00,\n  AUDIO10_TE_CTRL_COPY_PROTECT = 0x01,\n} audio10_terminal_control_selector_t;\n\n/// A.10.2 - Feature Unit Control Selectors UAC1\ntypedef enum {\n  AUDIO10_FU_CTRL_UNDEF = 0x00,\n  AUDIO10_FU_CTRL_MUTE = 0x01,\n  AUDIO10_FU_CTRL_VOLUME = 0x02,\n  AUDIO10_FU_CTRL_BASS = 0x03,\n  AUDIO10_FU_CTRL_MID = 0x04,\n  AUDIO10_FU_CTRL_TREBLE = 0x05,\n  AUDIO10_FU_CTRL_GRAPHIC_EQUALIZER = 0x06,\n  AUDIO10_FU_CTRL_AGC = 0x07,\n  AUDIO10_FU_CTRL_DELAY = 0x08,\n  AUDIO10_FU_CTRL_BASS_BOOST = 0x09,\n  AUDIO10_FU_CTRL_LOUDNESS = 0x0A,\n} audio10_feature_unit_control_selector_t;\n\n/// A.10.3.1 - Up/Down-mix Processing Unit Control Selectors UAC1\ntypedef enum {\n  AUDIO10_UD_CTRL_UNDEF = 0x00,\n  AUDIO10_UD_CTRL_ENABLE = 0x01,\n  AUDIO10_UD_CTRL_MODE_SELECT = 0x02,\n} audio10_up_down_mix_control_selector_t;\n\n/// A.10.3.2 - Dolby Prologic Processing Unit Control Selectors UAC1\ntypedef enum {\n  AUDIO10_DP_CTRL_UNDEF = 0x00,\n  AUDIO10_DP_CTRL_ENABLE = 0x01,\n  AUDIO10_DP_CTRL_MODE_SELECT = 0x02,\n} audio10_dolby_prologic_control_selector_t;\n\n/// A.10.3.3 - 3D Stereo Extender Processing Unit Control Selectors UAC1\ntypedef enum {\n  AUDIO10_3D_CTRL_UNDEF = 0x00,\n  AUDIO10_3D_CTRL_ENABLE = 0x01,\n  AUDIO10_3D_CTRL_SPACIOUSNESS = 0x02,\n} audio10_3d_stereo_extender_control_selector_t;\n\n/// A.10.3.4 - Reverberation Processing Unit Control Selectors UAC1\ntypedef enum {\n  AUDIO10_RV_CTRL_UNDEF = 0x00,\n  AUDIO10_RV_CTRL_ENABLE = 0x01,\n  AUDIO10_RV_CTRL_REVERB_LEVEL = 0x02,\n  AUDIO10_RV_CTRL_REVERB_TIME = 0x03,\n  AUDIO10_RV_CTRL_REVERB_FEEDBACK = 0x04,\n} audio10_reverberation_control_selector_t;\n\n/// A.10.3.5 - Chorus Processing Unit Control Selectors UAC1\ntypedef enum {\n  AUDIO10_CH_CTRL_UNDEF = 0x00,\n  AUDIO10_CH_CTRL_ENABLE = 0x01,\n  AUDIO10_CH_CTRL_CHORUS_LEVEL = 0x02,\n  AUDIO10_CH_CTRL_CHORUS_RATE = 0x03,\n  AUDIO10_CH_CTRL_CHORUS_DEPTH = 0x04,\n} audio10_chorus_control_selector_t;\n\n/// A.10.3.6 - Dynamic Range Compressor Processing Unit Control Selectors UAC1\ntypedef enum {\n  AUDIO10_DR_CTRL_UNDEF = 0x00,\n  AUDIO10_DR_CTRL_ENABLE = 0x01,\n  AUDIO10_DR_CTRL_COMPRESSION_RATE = 0x02,\n  AUDIO10_DR_CTRL_MAXAMPL = 0x03,\n  AUDIO10_DR_CTRL_THRESHOLD = 0x04,\n  AUDIO10_DR_CTRL_ATTACK_TIME = 0x05,\n  AUDIO10_DR_CTRL_RELEASE_TIME = 0x06,\n} audio10_dynamic_range_compression_control_selector_t;\n\n/// A.10.4 - Extension Unit Control Selectors UAC1\ntypedef enum {\n  AUDIO10_XU_CTRL_UNDEF = 0x00,\n  AUDIO10_XU_CTRL_ENABLE = 0x01,\n} audio10_extension_unit_control_selector_t;\n\n/// A.10.5 - Endpoint Control Selectors UAC1\ntypedef enum {\n  AUDIO10_EP_CTRL_UNDEF = 0x00,\n  AUDIO10_EP_CTRL_SAMPLING_FREQ = 0x01,\n  AUDIO10_EP_CTRL_PITCH = 0x02,\n} audio10_ep_control_selector_t;\n\n/// Audio Class-Specific AS Isochronous Data EP Attributes UAC1\ntypedef enum {\n  AUDIO10_CS_AS_ISO_DATA_EP_ATT_MAX_PACKETS_ONLY = 0x80,\n  AUDIO10_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK = 0x00,\n  AUDIO10_CS_AS_ISO_DATA_EP_ATT_SAMPLING_FRQ = 0x01,\n  AUDIO10_CS_AS_ISO_DATA_EP_ATT_PITCH = 0x02,\n} audio10_cs_as_iso_data_ep_attribute_t;\n\n/// Audio Class-Specific AS Isochronous Data EP Lock Delay Units UAC1\ntypedef enum {\n  AUDIO10_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED = 0x00,\n  AUDIO10_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC = 0x01,\n  AUDIO10_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_PCM_SAMPLES = 0x02,\n} audio10_cs_as_iso_data_ep_lock_delay_unit_t;\n\n/// Audio Class-Feature Unit Controls UAC1\ntypedef enum {\n  AUDIO10_FU_CONTROL_BM_MUTE = 1 << 0,\n  AUDIO10_FU_CONTROL_BM_VOLUME = 1 << 1,\n  AUDIO10_FU_CONTROL_BM_BASS = 1 << 2,\n  AUDIO10_FU_CONTROL_BM_MID = 1 << 3,\n  AUDIO10_FU_CONTROL_BM_TREBLE = 1 << 4,\n  AUDIO10_FU_CONTROL_BM_GRAPHIC_EQUALIZER = 1 << 5,\n  AUDIO10_FU_CONTROL_BM_AGC = 1 << 6,\n  AUDIO10_FU_CONTROL_BM_DELAY = 1 << 7,\n  AUDIO10_FU_CONTROL_BM_BASS_BOOST = 1 << 8,\n  AUDIO10_FU_CONTROL_BM_LOUDNESS = 1 << 9,\n} audio10_feature_unit_control_bitmap_t;\n\n/// A.1 - Audio Class-Format Type Codes UAC1\ntypedef enum {\n  AUDIO10_FORMAT_TYPE_UNDEFINED = 0x00,\n  AUDIO10_FORMAT_TYPE_I = 0x01,\n  AUDIO10_FORMAT_TYPE_II = 0x02,\n  AUDIO10_FORMAT_TYPE_III = 0x03,\n} audio10_format_type_t;\n\n// A.1.1 - Audio Class-Audio Data Format Type I UAC1\ntypedef enum {\n  AUDIO10_DATA_FORMAT_TYPE_I_PCM = 0x0001,\n  AUDIO10_DATA_FORMAT_TYPE_I_PCM8 = 0x0002,\n  AUDIO10_DATA_FORMAT_TYPE_I_IEEE_FLOAT = 0x0003,\n  AUDIO10_DATA_FORMAT_TYPE_I_ALAW = 0x0004,\n  AUDIO10_DATA_FORMAT_TYPE_I_MULAW = 0x0005,\n} audio10_data_format_type_I_t;\n\n// A.1.2 - Audio Class-Audio Data Format Type II UAC1\ntypedef enum {\n  AUDIO10_DATA_FORMAT_TYPE_II_MPEG = 0x1001,\n  AUDIO10_DATA_FORMAT_TYPE_II_AC3 = 0x1002,\n} audio10_data_format_type_II_t;\n\n// A.1.3 - Audio Class-Audio Data Format Type III UAC1\ntypedef enum {\n  AUDIO10_DATA_FORMAT_TYPE_III_IEC1937_AC3_1 = 0x2001,\n  AUDIO10_DATA_FORMAT_TYPE_III_IEC1937_MPEG1_L1_1 = 0x2002,\n  AUDIO10_DATA_FORMAT_TYPE_III_IEC1937_MPEG1_L23_1 = 0x2003,\n  AUDIO10_DATA_FORMAT_TYPE_III_IEC1937_MPEG2_EXT_1 = 0x2004,\n  AUDIO10_DATA_FORMAT_TYPE_III_IEC1937_MPEG2_L1_LS_1 = 0x2005,\n  AUDIO10_DATA_FORMAT_TYPE_III_IEC1937_MPEG2_L23_LS_1 = 0x2006,\n} audio10_data_format_type_III_t;\n\n/// Audio Class-Audio Channel Configuration UAC1 (Table A-7)\ntypedef enum {\n  AUDIO10_CHANNEL_CONFIG_NON_PREDEFINED = 0x0000,\n  AUDIO10_CHANNEL_CONFIG_LEFT_FRONT = 0x0001,\n  AUDIO10_CHANNEL_CONFIG_RIGHT_FRONT = 0x0002,\n  AUDIO10_CHANNEL_CONFIG_CENTER_FRONT = 0x0004,\n  AUDIO10_CHANNEL_CONFIG_LOW_FRQ_EFFECTS = 0x0008,\n  AUDIO10_CHANNEL_CONFIG_LEFT_SURROUND = 0x0010,\n  AUDIO10_CHANNEL_CONFIG_RIGHT_SURROUND = 0x0020,\n  AUDIO10_CHANNEL_CONFIG_LEFT_OF_CENTER = 0x0040,\n  AUDIO10_CHANNEL_CONFIG_RIGHT_OF_CENTER = 0x0080,\n  AUDIO10_CHANNEL_CONFIG_SURROUND = 0x0100,\n  AUDIO10_CHANNEL_CONFIG_SIDE_LEFT = 0x0200,\n  AUDIO10_CHANNEL_CONFIG_SIDE_RIGHT = 0x0400,\n  AUDIO10_CHANNEL_CONFIG_TOP = 0x0800,\n} audio10_channel_config_t;\n\n\n//--------------------------------------------------------------------+\n// USB AUDIO CLASS 1.0 (UAC1) DESCRIPTORS\n//--------------------------------------------------------------------+\n\n/// AUDIO Class-Specific AC Interface Header Descriptor UAC1 (4.3.2)\n#define audio10_desc_cs_ac_interface_n_t(numInterfaces)                                                                                          \\\n  struct TU_ATTR_PACKED {                                                                                                                        \\\n    uint8_t bLength;                      /* Size of this descriptor in bytes: 8+n. */                                                           \\\n    uint8_t bDescriptorType;              /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                                                  \\\n    uint8_t bDescriptorSubType;           /* Descriptor SubType. Value: AUDIO10_CS_AC_INTERFACE_HEADER. */                                       \\\n    uint16_t bcdADC;                      /* Audio Device Class Specification Release Number in Binary-Coded Decimal. Value: 0x0100 for UAC1. */ \\\n    uint16_t wTotalLength;                /* Total number of bytes returned for the class-specific AudioControl interface descriptor. */         \\\n    uint8_t bInCollection;                /* The number of AudioStreaming and MIDIStreaming interfaces in the Audio Interface Collection. */     \\\n    uint8_t baInterfaceNr[numInterfaces]; /* Interface number of the AudioStreaming or MIDIStreaming interface in the Collection. */             \\\n  }\n\n/// AUDIO Input Terminal Descriptor UAC1 (4.3.2.1)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor in bytes: 12.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO10_CS_AC_INTERFACE_INPUT_TERMINAL.\n  uint8_t bTerminalID;       ///< Constant uniquely identifying the Terminal within the audio function.\n  uint16_t wTerminalType;    ///< Constant characterizing the type of Terminal.\n  uint8_t bAssocTerminal;    ///< ID of the Output Terminal to which this Input Terminal is associated.\n  uint8_t bNrChannels;       ///< Number of logical output channels in the Terminal's output audio channel cluster.\n  uint16_t wChannelConfig;   ///< Describes the spatial location of the logical channels.\n  uint8_t iChannelNames;     ///< Index of a string descriptor, describing the name of the first logical channel.\n  uint8_t iTerminal;         ///< Index of a string descriptor, describing the Input Terminal.\n} audio10_desc_input_terminal_t;\n\n/// AUDIO Output Terminal Descriptor UAC1 (4.3.2.2)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor in bytes: 9.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO10_CS_AC_INTERFACE_OUTPUT_TERMINAL.\n  uint8_t bTerminalID;       ///< Constant uniquely identifying the Terminal within the audio function.\n  uint16_t wTerminalType;    ///< Constant characterizing the type of Terminal.\n  uint8_t bAssocTerminal;    ///< Constant, identifying the Input Terminal to which this Output Terminal is associated.\n  uint8_t bSourceID;         ///< ID of the Unit or Terminal to which this Terminal is connected.\n  uint8_t iTerminal;         ///< Index of a string descriptor, describing the Output Terminal.\n} audio10_desc_output_terminal_t;\n\n/// AUDIO Mixer Unit Descriptor UAC1 (4.3.2.3)\n#define audio10_desc_mixer_unit_n_t(numInputPins, numControlBytes)                                                                 \\\n  struct TU_ATTR_PACKED {                                                                                                          \\\n    uint8_t bLength;                     /* Size of this descriptor in bytes: 10+p+n. */                                           \\\n    uint8_t bDescriptorType;             /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                                     \\\n    uint8_t bDescriptorSubType;          /* Descriptor SubType. Value: AUDIO10_CS_AC_INTERFACE_MIXER_UNIT. */                      \\\n    uint8_t bUnitID;                     /* Constant uniquely identifying the Unit within the audio function. */                   \\\n    uint8_t bNrInPins;                   /* Number of Input Pins of this Unit: p. */                                               \\\n    uint8_t baSourceID[numInputPins];    /* ID of the Unit or Terminal to which Input Pins of this Mixer Unit are connected. */    \\\n    uint8_t bNrChannels;                 /* Number of logical output channels in the Mixer Unit's output audio channel cluster. */ \\\n    uint16_t wChannelConfig;             /* Describes the spatial location of the logical channels. */                             \\\n    uint8_t iChannelNames;               /* Index of a string descriptor, describing the name of the first logical channel. */     \\\n    uint8_t bmControls[numControlBytes]; /* Mixer Unit Controls bitmap. */                                                         \\\n    uint8_t iMixer;                      /* Index of a string descriptor, describing the Mixer Unit. */                            \\\n  }\n\n/// AUDIO Selector Unit Descriptor UAC1 (4.3.2.4)\n#define audio10_desc_selector_unit_n_t(numInputPins)                                                                            \\\n  struct TU_ATTR_PACKED {                                                                                                       \\\n    uint8_t bLength;                  /* Size of this descriptor in bytes: 6+p. */                                              \\\n    uint8_t bDescriptorType;          /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                                     \\\n    uint8_t bDescriptorSubType;       /* Descriptor SubType. Value: AUDIO10_CS_AC_INTERFACE_SELECTOR_UNIT. */                   \\\n    uint8_t bUnitID;                  /* Constant uniquely identifying the Unit within the audio function. */                   \\\n    uint8_t bNrInPins;                /* Number of Input Pins of this Unit: p. */                                               \\\n    uint8_t baSourceID[numInputPins]; /* ID of the Unit or Terminal to which Input Pins of this Selector Unit are connected. */ \\\n    uint8_t iSelector;                /* Index of a string descriptor, describing the Selector Unit. */                         \\\n  }\n\n/// AUDIO Feature Unit Descriptor UAC1 (4.3.2.5)\n#define audio10_desc_feature_unit_n_t(numChannels, controlSize)                                                                     \\\n  struct TU_ATTR_PACKED {                                                                                                           \\\n    uint8_t bLength;                                      /* Size of this descriptor in bytes: 7+(ch+1)*n. */                       \\\n    uint8_t bDescriptorType;                              /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                     \\\n    uint8_t bDescriptorSubType;                           /* Descriptor SubType. Value: AUDIO10_CS_AC_INTERFACE_FEATURE_UNIT. */    \\\n    uint8_t bUnitID;                                      /* Constant uniquely identifying the Unit within the audio function. */   \\\n    uint8_t bSourceID;                                    /* ID of the Unit or Terminal to which this Feature Unit is connected. */ \\\n    uint8_t bControlSize;                                 /* Size in bytes of an element of the bmaControls() array. */             \\\n    uint8_t bmaControls[(numChannels + 1) * controlSize]; /* Control bitmaps for master + logical channels. */                      \\\n    uint8_t iFeature;                                     /* Index of a string descriptor, describing this Feature Unit. */         \\\n  }\n\n/// AUDIO Processing Unit Descriptor UAC1 (4.3.2.6)\n#define audio10_desc_processing_unit_n_t(numInputPins, numControlBytes)                                                                 \\\n  struct TU_ATTR_PACKED {                                                                                                               \\\n    uint8_t bLength;                     /* Size of this descriptor in bytes: 13+p+n. */                                                \\\n    uint8_t bDescriptorType;             /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                                          \\\n    uint8_t bDescriptorSubType;          /* Descriptor SubType. Value: AUDIO10_CS_AC_INTERFACE_PROCESSING_UNIT. */                      \\\n    uint8_t bUnitID;                     /* Constant uniquely identifying the Unit within the audio function. */                        \\\n    uint16_t wProcessType;               /* Constant identifying the type of processing this Unit is performing. */                     \\\n    uint8_t bNrInPins;                   /* Number of Input Pins of this Unit: p. */                                                    \\\n    uint8_t baSourceID[numInputPins];    /* ID of the Unit or Terminal to which Input Pins of this Processing Unit are connected. */    \\\n    uint8_t bNrChannels;                 /* Number of logical output channels in the Processing Unit's output audio channel cluster. */ \\\n    uint16_t wChannelConfig;             /* Describes the spatial location of the logical channels. */                                  \\\n    uint8_t iChannelNames;               /* Index of a string descriptor, describing the name of the first logical channel. */          \\\n    uint8_t bControlSize;                /* Size in bytes of the bmControls field. */                                                   \\\n    uint8_t bmControls[numControlBytes]; /* Processing Unit Controls bitmap. */                                                         \\\n    uint8_t iProcessing;                 /* Index of a string descriptor, describing the Processing Unit. */                            \\\n  }\n\n/// AUDIO Extension Unit Descriptor UAC1 (4.3.2.7)\n#define audio10_desc_extension_unit_n_t(numInputPins, numControlBytes)                                                                 \\\n  struct TU_ATTR_PACKED {                                                                                                              \\\n    uint8_t bLength;                     /* Size of this descriptor in bytes: 13+p+n. */                                               \\\n    uint8_t bDescriptorType;             /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                                         \\\n    uint8_t bDescriptorSubType;          /* Descriptor SubType. Value: AUDIO10_CS_AC_INTERFACE_EXTENSION_UNIT. */                      \\\n    uint8_t bUnitID;                     /* Constant uniquely identifying the Unit within the audio function. */                       \\\n    uint16_t wExtensionCode;             /* Vendor-specific code identifying the Extension Unit. */                                    \\\n    uint8_t bNrInPins;                   /* Number of Input Pins of this Unit: p. */                                                   \\\n    uint8_t baSourceID[numInputPins];    /* ID of the Unit or Terminal to which Input Pins of this Extension Unit are connected. */    \\\n    uint8_t bNrChannels;                 /* Number of logical output channels in the Extension Unit's output audio channel cluster. */ \\\n    uint16_t wChannelConfig;             /* Describes the spatial location of the logical channels. */                                 \\\n    uint8_t iChannelNames;               /* Index of a string descriptor, describing the name of the first logical channel. */         \\\n    uint8_t bControlSize;                /* Size in bytes of the bmControls field. */                                                  \\\n    uint8_t bmControls[numControlBytes]; /* Extension Unit Controls bitmap. */                                                         \\\n    uint8_t iExtension;                  /* Index of a string descriptor, describing the Extension Unit. */                            \\\n  }\n\n/// AUDIO Class-Specific AS Interface Descriptor UAC1 (4.5.2)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor in bytes: 7.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO10_CS_AS_INTERFACE_AS_GENERAL.\n  uint8_t bTerminalLink;     ///< The Terminal ID of the Terminal to which the endpoint of this interface is connected.\n  uint8_t bDelay;            ///< Expressed in number of frames.\n  uint16_t wFormatTag;       ///< The Audio Data Format that has to be used to communicate with this interface.\n} audio10_desc_cs_as_interface_t;\n\n/// AUDIO Type I Format Type Descriptor UAC1 (2.2.5)\n#define audio10_desc_type_I_format_n_t(numSamFreq)                                                                            \\\n  struct TU_ATTR_PACKED {                                                                                                     \\\n    uint8_t bLength;                  /* Size of this descriptor in bytes: 8+(ns*3). */                                       \\\n    uint8_t bDescriptorType;          /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                                   \\\n    uint8_t bDescriptorSubType;       /* Descriptor SubType. Value: AUDIO10_CS_AS_INTERFACE_FORMAT_TYPE. */                   \\\n    uint8_t bFormatType;              /* Constant identifying the Format Type the AudioStreaming interface is using. */       \\\n    uint8_t bNrChannels;              /* Indicates the number of physical channels in the audio data stream. */               \\\n    uint8_t bSubFrameSize;            /* The number of bytes occupied by one audio subframe. */                               \\\n    uint8_t bBitResolution;           /* The number of effectively used bits from the available bits in an audio subframe. */ \\\n    uint8_t bSamFreqType;             /* Indicates how the sampling frequency can be programmed. */                           \\\n    uint8_t tSamFreq[numSamFreq * 3]; /* Sampling frequency or lower/upper bounds in Hz for the sampling frequency range. */  \\\n  }\n\n/// AUDIO Type II Format Type Descriptor UAC1 (2.3.5)\n#define audio10_desc_type_II_format_n_t(numSamFreq)                                                                          \\\n  struct TU_ATTR_PACKED {                                                                                                    \\\n    uint8_t bLength;                  /* Size of this descriptor in bytes: 9+(ns*3). */                                      \\\n    uint8_t bDescriptorType;          /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                                  \\\n    uint8_t bDescriptorSubType;       /* Descriptor SubType. Value: AUDIO10_CS_AS_INTERFACE_FORMAT_TYPE. */                  \\\n    uint8_t bFormatType;              /* Constant identifying the Format Type the AudioStreaming interface is using. */      \\\n    uint16_t wMaxBitRate;             /* Indicates the maximum number of bits per second this interface can handle. */       \\\n    uint16_t wSamplesPerFrame;        /* Indicates the number of PCM audio samples contained in one encoded audio frame. */  \\\n    uint8_t bSamFreqType;             /* Indicates how the sampling frequency can be programmed. */                          \\\n    uint8_t tSamFreq[numSamFreq * 3]; /* Sampling frequency or lower/upper bounds in Hz for the sampling frequency range. */ \\\n  }\n\n/// AUDIO Type III Format Type Descriptor UAC1 (2.4.5)\n#define audio10_desc_type_III_format_n_t(numSamFreq)                                                                          \\\n  struct TU_ATTR_PACKED {                                                                                                     \\\n    uint8_t bLength;                  /* Size of this descriptor in bytes: 8+(ns*3). */                                       \\\n    uint8_t bDescriptorType;          /* Descriptor Type. Value: TUSB_DESC_CS_INTERFACE. */                                   \\\n    uint8_t bDescriptorSubType;       /* Descriptor SubType. Value: AUDIO10_CS_AS_INTERFACE_FORMAT_TYPE. */                   \\\n    uint8_t bFormatType;              /* Constant identifying the Format Type the AudioStreaming interface is using. */       \\\n    uint8_t bNrChannels;              /* Indicates the number of physical channels in the audio data stream. */               \\\n    uint8_t bSubFrameSize;            /* The number of bytes occupied by one audio subframe. */                               \\\n    uint8_t bBitResolution;           /* The number of effectively used bits from the available bits in an audio subframe. */ \\\n    uint8_t bSamFreqType;             /* Indicates how the sampling frequency can be programmed. */                           \\\n    uint8_t tSamFreq[numSamFreq * 3]; /* Sampling frequency or lower/upper bounds in Hz for the sampling frequency range. */  \\\n  }\n\n/// Standard AS Isochronous Audio Data Endpoint Descriptor UAC1 (4.6.1.1)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;         ///< Size of this descriptor in bytes: 9.\n  uint8_t bDescriptorType; ///< Descriptor Type. Value: TUSB_DESC_ENDPOINT.\n  uint8_t bEndpointAddress;///< The address of the endpoint on the USB device described by this descriptor.\n  struct TU_ATTR_PACKED {\n    uint8_t xfer  : 2;        // Control, ISO, Bulk, Interrupt\n    uint8_t sync  : 2;        // None, Asynchronous, Adaptive, Synchronous\n    uint8_t usage : 2;        // Data, Feedback, Implicit feedback\n    uint8_t       : 2;\n  } bmAttributes;\n  uint16_t wMaxPacketSize; ///< Maximum packet size this endpoint is capable of sending or receiving when this configuration is selected.\n  uint8_t bInterval;       ///< Interval for polling endpoint for data transfers.\n  uint8_t bRefresh;        ///< The rate at which the endpoint is refreshed.\n  uint8_t bSynchAddress;   ///< The address of the endpoint used to send synchronization information for the data endpoint.\n} audio10_desc_as_iso_data_ep_t;\n\n/// AUDIO Class-Specific AS Isochronous Audio Data Endpoint Descriptor UAC1 (4.6.1.2)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor in bytes: 7.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_ENDPOINT.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO10_CS_EP_SUBTYPE_GENERAL.\n  uint8_t bmAttributes;      ///< Bit 0: Sampling Frequency, Bit 1: Pitch, Bit 7: MaxPacketsOnly.\n  uint8_t bLockDelayUnits;   ///< Indicates the units used for the wLockDelay field.\n  uint16_t wLockDelay;       ///< Indicates the time it takes this endpoint to reliably lock its internal clock recovery circuitry.\n} audio10_desc_cs_as_iso_data_ep_t;\n\n/// AUDIO Interrupt Data Message Format UAC1 (3.7.1.2)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bStatusType;///< Indicates the type of status information being reported.\n  uint8_t bOriginator;///< Indicates the entity that originated this status information.\n} audio10_interrupt_data_t;\n\n//--------------------------------------------------------------------+\n// USB AUDIO CLASS 2.0 (UAC2) DEFINITIONS\n//--------------------------------------------------------------------+\n\n/// A.7 - Audio Function Category Codes\ntypedef enum {\n  AUDIO20_FUNC_UNDEF = 0x00,\n  AUDIO20_FUNC_DESKTOP_SPEAKER = 0x01,\n  AUDIO20_FUNC_HOME_THEATER = 0x02,\n  AUDIO20_FUNC_MICROPHONE = 0x03,\n  AUDIO20_FUNC_HEADSET = 0x04,\n  AUDIO20_FUNC_TELEPHONE = 0x05,\n  AUDIO20_FUNC_CONVERTER = 0x06,\n  AUDIO20_FUNC_SOUND_RECODER = 0x07,\n  AUDIO20_FUNC_IO_BOX = 0x08,\n  AUDIO20_FUNC_MUSICAL_INSTRUMENT = 0x09,\n  AUDIO20_FUNC_PRO_AUDIO = 0x0A,\n  AUDIO20_FUNC_AUDIO_VIDEO = 0x0B,\n  AUDIO20_FUNC_CONTROL_PANEL = 0x0C,\n  AUDIO20_FUNC_OTHER = 0xFF,\n} audio20_function_code_t;\n\n/// A.9 - Audio Class-Specific AC Interface Descriptor Subtypes UAC2\ntypedef enum {\n  AUDIO20_CS_AC_INTERFACE_AC_DESCRIPTOR_UNDEF = 0x00,\n  AUDIO20_CS_AC_INTERFACE_HEADER = 0x01,\n  AUDIO20_CS_AC_INTERFACE_INPUT_TERMINAL = 0x02,\n  AUDIO20_CS_AC_INTERFACE_OUTPUT_TERMINAL = 0x03,\n  AUDIO20_CS_AC_INTERFACE_MIXER_UNIT = 0x04,\n  AUDIO20_CS_AC_INTERFACE_SELECTOR_UNIT = 0x05,\n  AUDIO20_CS_AC_INTERFACE_FEATURE_UNIT = 0x06,\n  AUDIO20_CS_AC_INTERFACE_EFFECT_UNIT = 0x07,\n  AUDIO20_CS_AC_INTERFACE_PROCESSING_UNIT = 0x08,\n  AUDIO20_CS_AC_INTERFACE_EXTENSION_UNIT = 0x09,\n  AUDIO20_CS_AC_INTERFACE_CLOCK_SOURCE = 0x0A,\n  AUDIO20_CS_AC_INTERFACE_CLOCK_SELECTOR = 0x0B,\n  AUDIO20_CS_AC_INTERFACE_CLOCK_MULTIPLIER = 0x0C,\n  AUDIO20_CS_AC_INTERFACE_SAMPLE_RATE_CONVERTER = 0x0D,\n} audio20_cs_ac_interface_subtype_t;\n\n/// A.10 - Audio Class-Specific AS Interface Descriptor Subtypes UAC2\ntypedef enum {\n  AUDIO20_CS_AS_INTERFACE_AS_DESCRIPTOR_UNDEF = 0x00,\n  AUDIO20_CS_AS_INTERFACE_AS_GENERAL = 0x01,\n  AUDIO20_CS_AS_INTERFACE_FORMAT_TYPE = 0x02,\n  AUDIO20_CS_AS_INTERFACE_ENCODER = 0x03,\n  AUDIO20_CS_AS_INTERFACE_DECODER = 0x04,\n} audio20_cs_as_interface_subtype_t;\n\n/// A.11 - Effect Unit Effect Types\ntypedef enum {\n  AUDIO20_EFFECT_TYPE_UNDEF = 0x00,\n  AUDIO20_EFFECT_TYPE_PARAM_EQ_SECTION = 0x01,\n  AUDIO20_EFFECT_TYPE_REVERBERATION = 0x02,\n  AUDIO20_EFFECT_TYPE_MOD_DELAY = 0x03,\n  AUDIO20_EFFECT_TYPE_DYN_RANGE_COMP = 0x04,\n} audio20_effect_unit_effect_type_t;\n\n/// A.12 - Processing Unit Process Types\ntypedef enum {\n  AUDIO20_PROCESS_TYPE_UNDEF = 0x00,\n  AUDIO20_PROCESS_TYPE_UP_DOWN_MIX = 0x01,\n  AUDIO20_PROCESS_TYPE_DOLBY_PROLOGIC = 0x02,\n  AUDIO20_PROCESS_TYPE_STEREO_EXTENDER = 0x03,\n} audio20_processing_unit_process_type_t;\n\n/// A.13 - Audio Class-Specific EP Descriptor Subtypes UAC2\ntypedef enum {\n  AUDIO20_CS_EP_SUBTYPE_UNDEF = 0x00,\n  AUDIO20_CS_EP_SUBTYPE_GENERAL = 0x01,\n} audio20_cs_ep_subtype_t;\n\n/// A.14 - Audio Class-Specific Request Codes UAC2\ntypedef enum {\n  AUDIO20_CS_REQ_UNDEF = 0x00,\n  AUDIO20_CS_REQ_CUR = 0x01,\n  AUDIO20_CS_REQ_RANGE = 0x02,\n  AUDIO20_CS_REQ_MEM = 0x03,\n} audio20_cs_req_t;\n\n/// A.17 - Control Selector Codes UAC2\n\n/// A.17.1 - Clock Source Control Selectors\ntypedef enum {\n  AUDIO20_CS_CTRL_UNDEF = 0x00,\n  AUDIO20_CS_CTRL_SAM_FREQ = 0x01,\n  AUDIO20_CS_CTRL_CLK_VALID = 0x02,\n} audio20_clock_src_control_selector_t;\n\n/// A.17.2 - Clock Selector Control Selectors\ntypedef enum {\n  AUDIO20_CX_CTRL_UNDEF = 0x00,\n  AUDIO20_CX_CTRL_CONTROL = 0x01,\n} audio20_clock_sel_control_selector_t;\n\n/// A.17.3 - Clock Multiplier Control Selectors\ntypedef enum {\n  AUDIO20_CM_CTRL_UNDEF = 0x00,\n  AUDIO20_CM_CTRL_NUMERATOR_CONTROL = 0x01,\n  AUDIO20_CM_CTRL_DENOMINATOR_CONTROL = 0x02,\n} audio20_clock_mul_control_selector_t;\n\n/// A.17.4 - Terminal Control Selectors UAC2\ntypedef enum {\n  AUDIO20_TE_CTRL_UNDEF = 0x00,\n  AUDIO20_TE_CTRL_COPY_PROTECT = 0x01,\n  AUDIO20_TE_CTRL_CONNECTOR = 0x02,\n  AUDIO20_TE_CTRL_OVERLOAD = 0x03,\n  AUDIO20_TE_CTRL_CLUSTER = 0x04,\n  AUDIO20_TE_CTRL_UNDERFLOW = 0x05,\n  AUDIO20_TE_CTRL_OVERFLOW = 0x06,\n  AUDIO20_TE_CTRL_LATENCY = 0x07,\n} audio20_terminal_control_selector_t;\n\n/// A.17.5 - Mixer Control Selectors\ntypedef enum {\n  AUDIO20_MU_CTRL_UNDEF = 0x00,\n  AUDIO20_MU_CTRL_MIXER = 0x01,\n  AUDIO20_MU_CTRL_CLUSTER = 0x02,\n  AUDIO20_MU_CTRL_UNDERFLOW = 0x03,\n  AUDIO20_MU_CTRL_OVERFLOW = 0x04,\n  AUDIO20_MU_CTRL_LATENCY = 0x05,\n} audio20_mixer_control_selector_t;\n\n/// A.17.6 - Selector Control Selectors\ntypedef enum {\n  AUDIO20_SU_CTRL_UNDEF = 0x00,\n  AUDIO20_SU_CTRL_SELECTOR = 0x01,\n  AUDIO20_SU_CTRL_LATENCY = 0x02,\n} audio20_sel_control_selector_t;\n\n/// A.17.7 - Feature Unit Control Selectors UAC2\ntypedef enum {\n  AUDIO20_FU_CTRL_UNDEF = 0x00,\n  AUDIO20_FU_CTRL_MUTE = 0x01,\n  AUDIO20_FU_CTRL_VOLUME = 0x02,\n  AUDIO20_FU_CTRL_BASS = 0x03,\n  AUDIO20_FU_CTRL_MID = 0x04,\n  AUDIO20_FU_CTRL_TREBLE = 0x05,\n  AUDIO20_FU_CTRL_GRAPHIC_EQUALIZER = 0x06,\n  AUDIO20_FU_CTRL_AGC = 0x07,\n  AUDIO20_FU_CTRL_DELAY = 0x08,\n  AUDIO20_FU_CTRL_BASS_BOOST = 0x09,\n  AUDIO20_FU_CTRL_LOUDNESS = 0x0A,\n  AUDIO20_FU_CTRL_INPUT_GAIN = 0x0B,\n  AUDIO20_FU_CTRL_GAIN_PAD = 0x0C,\n  AUDIO20_FU_CTRL_INVERTER = 0x0D,\n  AUDIO20_FU_CTRL_UNDERFLOW = 0x0E,\n  AUDIO20_FU_CTRL_OVERVLOW = 0x0F,\n  AUDIO20_FU_CTRL_LATENCY = 0x10,\n} audio20_feature_unit_control_selector_t;\n\n/// A.17.8 Effect Unit Control Selectors\n\n/// A.17.8.1 Parametric Equalizer Section Effect Unit Control Selectors\ntypedef enum {\n  AUDIO20_PE_CTRL_UNDEF = 0x00,\n  AUDIO20_PE_CTRL_ENABLE = 0x01,\n  AUDIO20_PE_CTRL_CENTERFREQ = 0x02,\n  AUDIO20_PE_CTRL_QFACTOR = 0x03,\n  AUDIO20_PE_CTRL_GAIN = 0x04,\n  AUDIO20_PE_CTRL_UNDERFLOW = 0x05,\n  AUDIO20_PE_CTRL_OVERFLOW = 0x06,\n  AUDIO20_PE_CTRL_LATENCY = 0x07,\n} audio20_parametric_equalizer_control_selector_t;\n\n/// A.17.8.2 Reverberation Effect Unit Control Selectors\ntypedef enum {\n  AUDIO20_RV_CTRL_UNDEF = 0x00,\n  AUDIO20_RV_CTRL_ENABLE = 0x01,\n  AUDIO20_RV_CTRL_TYPE = 0x02,\n  AUDIO20_RV_CTRL_LEVEL = 0x03,\n  AUDIO20_RV_CTRL_TIME = 0x04,\n  AUDIO20_RV_CTRL_FEEDBACK = 0x05,\n  AUDIO20_RV_CTRL_PREDELAY = 0x06,\n  AUDIO20_RV_CTRL_DENSITY = 0x07,\n  AUDIO20_RV_CTRL_HIFREQ_ROLLOFF = 0x08,\n  AUDIO20_RV_CTRL_UNDERFLOW = 0x09,\n  AUDIO20_RV_CTRL_OVERFLOW = 0x0A,\n  AUDIO20_RV_CTRL_LATENCY = 0x0B,\n} audio20_reverberation_effect_control_selector_t;\n\n/// A.17.8.3 Modulation Delay Effect Unit Control Selectors\ntypedef enum {\n  AUDIO20_MD_CTRL_UNDEF = 0x00,\n  AUDIO20_MD_CTRL_ENABLE = 0x01,\n  AUDIO20_MD_CTRL_BALANCE = 0x02,\n  AUDIO20_MD_CTRL_RATE = 0x03,\n  AUDIO20_MD_CTRL_DEPTH = 0x04,\n  AUDIO20_MD_CTRL_TIME = 0x05,\n  AUDIO20_MD_CTRL_FEEDBACK = 0x06,\n  AUDIO20_MD_CTRL_UNDERFLOW = 0x07,\n  AUDIO20_MD_CTRL_OVERFLOW = 0x08,\n  AUDIO20_MD_CTRL_LATENCY = 0x09,\n} audio20_modulation_delay_control_selector_t;\n\n/// A.17.8.4 Dynamic Range Compressor Effect Unit Control Selectors\ntypedef enum {\n  AUDIO20_DR_CTRL_UNDEF = 0x00,\n  AUDIO20_DR_CTRL_ENABLE = 0x01,\n  AUDIO20_DR_CTRL_COMPRESSION_RATE = 0x02,\n  AUDIO20_DR_CTRL_MAXAMPL = 0x03,\n  AUDIO20_DR_CTRL_THRESHOLD = 0x04,\n  AUDIO20_DR_CTRL_ATTACK_TIME = 0x05,\n  AUDIO20_DR_CTRL_RELEASE_TIME = 0x06,\n  AUDIO20_DR_CTRL_UNDERFLOW = 0x07,\n  AUDIO20_DR_CTRL_OVERFLOW = 0x08,\n  AUDIO20_DR_CTRL_LATENCY = 0x09,\n} audio20_dynamic_range_compression_control_selector_t;\n\n/// A.17.9 Processing Unit Control Selectors\n\n/// A.17.9.1 Up/Down-mix Processing Unit Control Selectors\ntypedef enum {\n  AUDIO20_UD_CTRL_UNDEF = 0x00,\n  AUDIO20_UD_CTRL_ENABLE = 0x01,\n  AUDIO20_UD_CTRL_MODE_SELECT = 0x02,\n  AUDIO20_UD_CTRL_CLUSTER = 0x03,\n  AUDIO20_UD_CTRL_UNDERFLOW = 0x04,\n  AUDIO20_UD_CTRL_OVERFLOW = 0x05,\n  AUDIO20_UD_CTRL_LATENCY = 0x06,\n} audio20_up_down_mix_control_selector_t;\n\n/// A.17.9.2 Dolby Prologic ™ Processing Unit Control Selectors\ntypedef enum {\n  AUDIO20_DP_CTRL_UNDEF = 0x00,\n  AUDIO20_DP_CTRL_ENABLE = 0x01,\n  AUDIO20_DP_CTRL_MODE_SELECT = 0x02,\n  AUDIO20_DP_CTRL_CLUSTER = 0x03,\n  AUDIO20_DP_CTRL_UNDERFLOW = 0x04,\n  AUDIO20_DP_CTRL_OVERFLOW = 0x05,\n  AUDIO20_DP_CTRL_LATENCY = 0x06,\n} audio20_dolby_prologic_control_selector_t;\n\n/// A.17.9.3 Stereo Extender Processing Unit Control Selectors\ntypedef enum {\n  AUDIO20_ST_EXT_CTRL_UNDEF = 0x00,\n  AUDIO20_ST_EXT_CTRL_ENABLE = 0x01,\n  AUDIO20_ST_EXT_CTRL_WIDTH = 0x02,\n  AUDIO20_ST_EXT_CTRL_UNDERFLOW = 0x03,\n  AUDIO20_ST_EXT_CTRL_OVERFLOW = 0x04,\n  AUDIO20_ST_EXT_CTRL_LATENCY = 0x05,\n} audio20_stereo_extender_control_selector_t;\n\n/// A.17.10 Extension Unit Control Selectors\ntypedef enum {\n  AUDIO20_XU_CTRL_UNDEF = 0x00,\n  AUDIO20_XU_CTRL_ENABLE = 0x01,\n  AUDIO20_XU_CTRL_CLUSTER = 0x02,\n  AUDIO20_XU_CTRL_UNDERFLOW = 0x03,\n  AUDIO20_XU_CTRL_OVERFLOW = 0x04,\n  AUDIO20_XU_CTRL_LATENCY = 0x05,\n} audio20_extension_unit_control_selector_t;\n\n/// A.17.11 AudioStreaming Interface Control Selectors\ntypedef enum {\n  AUDIO20_AS_CTRL_UNDEF = 0x00,\n  AUDIO20_AS_CTRL_ACT_ALT_SETTING = 0x01,\n  AUDIO20_AS_CTRL_VAL_ALT_SETTINGS = 0x02,\n  AUDIO20_AS_CTRL_AUDIO_DATA_FORMAT = 0x03,\n} audio20_audiostreaming_interface_control_selector_t;\n\n/// A.17.12 Encoder Control Selectors\ntypedef enum {\n  AUDIO20_EN_CTRL_UNDEF = 0x00,\n  AUDIO20_EN_CTRL_BIT_RATE = 0x01,\n  AUDIO20_EN_CTRL_QUALITY = 0x02,\n  AUDIO20_EN_CTRL_VBR = 0x03,\n  AUDIO20_EN_CTRL_TYPE = 0x04,\n  AUDIO20_EN_CTRL_UNDERFLOW = 0x05,\n  AUDIO20_EN_CTRL_OVERFLOW = 0x06,\n  AUDIO20_EN_CTRL_ENCODER_ERROR = 0x07,\n  AUDIO20_EN_CTRL_PARAM1 = 0x08,\n  AUDIO20_EN_CTRL_PARAM2 = 0x09,\n  AUDIO20_EN_CTRL_PARAM3 = 0x0A,\n  AUDIO20_EN_CTRL_PARAM4 = 0x0B,\n  AUDIO20_EN_CTRL_PARAM5 = 0x0C,\n  AUDIO20_EN_CTRL_PARAM6 = 0x0D,\n  AUDIO20_EN_CTRL_PARAM7 = 0x0E,\n  AUDIO20_EN_CTRL_PARAM8 = 0x0F,\n} audio20_encoder_control_selector_t;\n\n/// A.17.13 Decoder Control Selectors\n\n/// A.17.13.1 MPEG Decoder Control Selectors\ntypedef enum {\n  AUDIO20_MPD_CTRL_UNDEF = 0x00,\n  AUDIO20_MPD_CTRL_DUAL_CHANNEL = 0x01,\n  AUDIO20_MPD_CTRL_SECOND_STEREO = 0x02,\n  AUDIO20_MPD_CTRL_MULTILINGUAL = 0x03,\n  AUDIO20_MPD_CTRL_DYN_RANGE = 0x04,\n  AUDIO20_MPD_CTRL_SCALING = 0x05,\n  AUDIO20_MPD_CTRL_HILO_SCALING = 0x06,\n  AUDIO20_MPD_CTRL_UNDERFLOW = 0x07,\n  AUDIO20_MPD_CTRL_OVERFLOW = 0x08,\n  AUDIO20_MPD_CTRL_DECODER_ERROR = 0x09,\n} audio20_MPEG_decoder_control_selector_t;\n\n/// A.17.13.2 AC-3 Decoder Control Selectors\ntypedef enum {\n  AUDIO20_AD_CTRL_UNDEF = 0x00,\n  AUDIO20_AD_CTRL_MODE = 0x01,\n  AUDIO20_AD_CTRL_DYN_RANGE = 0x02,\n  AUDIO20_AD_CTRL_SCALING = 0x03,\n  AUDIO20_AD_CTRL_HILO_SCALING = 0x04,\n  AUDIO20_AD_CTRL_UNDERFLOW = 0x05,\n  AUDIO20_AD_CTRL_OVERFLOW = 0x06,\n  AUDIO20_AD_CTRL_DECODER_ERROR = 0x07,\n} audio20_AC3_decoder_control_selector_t;\n\n/// A.17.13.3 WMA Decoder Control Selectors\ntypedef enum {\n  AUDIO20_WD_CTRL_UNDEF = 0x00,\n  AUDIO20_WD_CTRL_UNDERFLOW = 0x01,\n  AUDIO20_WD_CTRL_OVERFLOW = 0x02,\n  AUDIO20_WD_CTRL_DECODER_ERROR = 0x03,\n} audio20_WMA_decoder_control_selector_t;\n\n/// A.17.13.4 DTS Decoder Control Selectors\ntypedef enum {\n  AUDIO20_DD_CTRL_UNDEF = 0x00,\n  AUDIO20_DD_CTRL_UNDERFLOW = 0x01,\n  AUDIO20_DD_CTRL_OVERFLOW = 0x02,\n  AUDIO20_DD_CTRL_DECODER_ERROR = 0x03,\n} audio20_DTS_decoder_control_selector_t;\n\n/// A.17.14 Endpoint Control Selectors\ntypedef enum {\n  AUDIO20_EP_CTRL_UNDEF = 0x00,\n  AUDIO20_EP_CTRL_PITCH = 0x01,\n  AUDIO20_EP_CTRL_DATA_OVERRUN = 0x02,\n  AUDIO20_EP_CTRL_DATA_UNDERRUN = 0x03,\n} audio20_EP_control_selector_t;\n\n/// Additional Audio Device Class Codes - Source: Audio Data Formats\n\n/// A.1 - Audio Class-Format Type Codes UAC2\ntypedef enum {\n  AUDIO20_FORMAT_TYPE_UNDEFINED = 0x00,\n  AUDIO20_FORMAT_TYPE_I = 0x01,\n  AUDIO20_FORMAT_TYPE_II = 0x02,\n  AUDIO20_FORMAT_TYPE_III = 0x03,\n  AUDIO20_FORMAT_TYPE_IV = 0x04,\n  AUDIO20_EXT_FORMAT_TYPE_I = 0x81,\n  AUDIO20_EXT_FORMAT_TYPE_II = 0x82,\n  AUDIO20_EXT_FORMAT_TYPE_III = 0x83,\n} audio20_format_type_t;\n\n// A.2.1 - Audio Class-Audio Data Format Type I UAC2\ntypedef enum {\n  AUDIO20_DATA_FORMAT_TYPE_I_PCM = 1 << 0,\n  AUDIO20_DATA_FORMAT_TYPE_I_PCM8 = 1 << 1,\n  AUDIO20_DATA_FORMAT_TYPE_I_IEEE_FLOAT = 1 << 2,\n  AUDIO20_DATA_FORMAT_TYPE_I_ALAW = 1 << 3,\n  AUDIO20_DATA_FORMAT_TYPE_I_MULAW = 1 << 4,\n  AUDIO20_DATA_FORMAT_TYPE_I_RAW_DATA = 0x80000000u,\n} audio20_data_format_type_I_t;\n\n/// Audio Class-Audio Channel Configuration UAC2 (Table A-11)\ntypedef enum {\n  AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED = 0x00000000,\n  AUDIO20_CHANNEL_CONFIG_FRONT_LEFT = 0x00000001,\n  AUDIO20_CHANNEL_CONFIG_FRONT_RIGHT = 0x00000002,\n  AUDIO20_CHANNEL_CONFIG_FRONT_CENTER = 0x00000004,\n  AUDIO20_CHANNEL_CONFIG_LOW_FRQ_EFFECTS = 0x00000008,\n  AUDIO20_CHANNEL_CONFIG_BACK_LEFT = 0x00000010,\n  AUDIO20_CHANNEL_CONFIG_BACK_RIGHT = 0x00000020,\n  AUDIO20_CHANNEL_CONFIG_FRONT_LEFT_OF_CENTER = 0x00000040,\n  AUDIO20_CHANNEL_CONFIG_FRONT_RIGHT_OF_CENTER = 0x00000080,\n  AUDIO20_CHANNEL_CONFIG_BACK_CENTER = 0x00000100,\n  AUDIO20_CHANNEL_CONFIG_SIDE_LEFT = 0x00000200,\n  AUDIO20_CHANNEL_CONFIG_SIDE_RIGHT = 0x00000400,\n  AUDIO20_CHANNEL_CONFIG_TOP_CENTER = 0x00000800,\n  AUDIO20_CHANNEL_CONFIG_TOP_FRONT_LEFT = 0x00001000,\n  AUDIO20_CHANNEL_CONFIG_TOP_FRONT_CENTER = 0x00002000,\n  AUDIO20_CHANNEL_CONFIG_TOP_FRONT_RIGHT = 0x00004000,\n  AUDIO20_CHANNEL_CONFIG_TOP_BACK_LEFT = 0x00008000,\n  AUDIO20_CHANNEL_CONFIG_TOP_BACK_CENTER = 0x00010000,\n  AUDIO20_CHANNEL_CONFIG_TOP_BACK_RIGHT = 0x00020000,\n  AUDIO20_CHANNEL_CONFIG_TOP_FRONT_LEFT_OF_CENTER = 0x00040000,\n  AUDIO20_CHANNEL_CONFIG_TOP_FRONT_RIGHT_OF_CENTER = 0x00080000,\n  AUDIO20_CHANNEL_CONFIG_LEFT_LOW_FRQ_EFFECTS = 0x00100000,\n  AUDIO20_CHANNEL_CONFIG_RIGHT_LOW_FRQ_EFFECTS = 0x00200000,\n  AUDIO20_CHANNEL_CONFIG_TOP_SIDE_LEFT = 0x00400000,\n  AUDIO20_CHANNEL_CONFIG_TOP_SIDE_RIGHT = 0x00800000,\n  AUDIO20_CHANNEL_CONFIG_BOTTOM_CENTER = 0x01000000,\n  AUDIO20_CHANNEL_CONFIG_BACK_LEFT_OF_CENTER = 0x02000000,\n  AUDIO20_CHANNEL_CONFIG_BACK_RIGHT_OF_CENTER = 0x04000000,\n  AUDIO20_CHANNEL_CONFIG_RAW_DATA = 0x80000000u,\n} audio20_channel_config_t;\n\n/// All remaining definitions are taken from the descriptor descriptions in the UAC2 main specification\n\n/// Audio Class-Control Values UAC2\ntypedef enum {\n  AUDIO20_CTRL_NONE = 0x00,///< No Host access\n  AUDIO20_CTRL_R = 0x01,   ///< Host read access only\n  AUDIO20_CTRL_RW = 0x03,  ///< Host read write access\n} audio20_control_t;\n\n/// Audio Class-Specific AC Interface Descriptor Controls UAC2\ntypedef enum {\n  AUDIO20_CS_AS_INTERFACE_CTRL_LATENCY_POS = 0,\n} audio20_cs_ac_interface_control_pos_t;\n\n/// Audio Class-Specific AS Interface Descriptor Controls UAC2\ntypedef enum {\n  AUDIO20_CS_AS_INTERFACE_CTRL_ACTIVE_ALT_SET_POS = 0,\n  AUDIO20_CS_AS_INTERFACE_CTRL_VALID_ALT_SET_POS = 2,\n} audio20_cs_as_interface_control_pos_t;\n\n/// Audio Class-Specific AS Isochronous Data EP Attributes UAC2\ntypedef enum {\n  AUDIO20_CS_AS_ISO_DATA_EP_ATT_MAX_PACKETS_ONLY = 0x80,\n  AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK = 0x00,\n} audio20_cs_as_iso_data_ep_attribute_t;\n\n/// Audio Class-Specific AS Isochronous Data EP Controls UAC2\ntypedef enum {\n  AUDIO20_CS_AS_ISO_DATA_EP_CTRL_PITCH_POS = 0,\n  AUDIO20_CS_AS_ISO_DATA_EP_CTRL_DATA_OVERRUN_POS = 2,\n  AUDIO20_CS_AS_ISO_DATA_EP_CTRL_DATA_UNDERRUN_POS = 4,\n} audio20_cs_as_iso_data_ep_control_pos_t;\n\n/// Audio Class-Specific AS Isochronous Data EP Lock Delay Units UAC2\ntypedef enum {\n  AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED = 0x00,\n  AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC = 0x01,\n  AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_PCM_SAMPLES = 0x02,\n} audio20_cs_as_iso_data_ep_lock_delay_unit_t;\n\n/// Audio Class-Clock Source Attributes UAC2\ntypedef enum {\n  AUDIO20_CLOCK_SOURCE_ATT_EXT_CLK = 0x00,\n  AUDIO20_CLOCK_SOURCE_ATT_INT_FIX_CLK = 0x01,\n  AUDIO20_CLOCK_SOURCE_ATT_INT_VAR_CLK = 0x02,\n  AUDIO20_CLOCK_SOURCE_ATT_INT_PRO_CLK = 0x03,\n  AUDIO20_CLOCK_SOURCE_ATT_CLK_SYC_SOF = 0x04,\n} audio20_clock_source_attribute_t;\n\n/// Audio Class-Clock Source Controls UAC2\ntypedef enum {\n  AUDIO20_CLOCK_SOURCE_CTRL_CLK_FRQ_POS = 0,\n  AUDIO20_CLOCK_SOURCE_CTRL_CLK_VAL_POS = 2,\n} audio20_clock_source_control_pos_t;\n\n/// Audio Class-Clock Selector Controls UAC2\ntypedef enum {\n  AUDIO20_CLOCK_SELECTOR_CTRL_POS = 0,\n} audio20_clock_selector_control_pos_t;\n\n/// Audio Class-Clock Multiplier Controls UAC2\ntypedef enum {\n  AUDIO20_CLOCK_MULTIPLIER_CTRL_NUMERATOR_POS = 0,\n  AUDIO20_CLOCK_MULTIPLIER_CTRL_DENOMINATOR_POS = 2,\n} audio20_clock_multiplier_control_pos_t;\n\n/// Audio Class-Input Terminal Controls UAC2\ntypedef enum {\n  AUDIO20_IN_TERM_CTRL_CPY_PROT_POS = 0,\n  AUDIO20_IN_TERM_CTRL_CONNECTOR_POS = 2,\n  AUDIO20_IN_TERM_CTRL_OVERLOAD_POS = 4,\n  AUDIO20_IN_TERM_CTRL_CLUSTER_POS = 6,\n  AUDIO20_IN_TERM_CTRL_UNDERFLOW_POS = 8,\n  AUDIO20_IN_TERM_CTRL_OVERFLOW_POS = 10,\n} audio20_terminal_input_control_pos_t;\n\n/// Audio Class-Output Terminal Controls UAC2\ntypedef enum {\n  AUDIO20_OUT_TERM_CTRL_CPY_PROT_POS = 0,\n  AUDIO20_OUT_TERM_CTRL_CONNECTOR_POS = 2,\n  AUDIO20_OUT_TERM_CTRL_OVERLOAD_POS = 4,\n  AUDIO20_OUT_TERM_CTRL_UNDERFLOW_POS = 6,\n  AUDIO20_OUT_TERM_CTRL_OVERFLOW_POS = 8,\n} audio20_terminal_output_control_pos_t;\n\n/// Audio Class-Feature Unit Controls UAC2\ntypedef enum {\n  AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS = 0,\n  AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS = 2,\n  AUDIO20_FEATURE_UNIT_CTRL_BASS_POS = 4,\n  AUDIO20_FEATURE_UNIT_CTRL_MID_POS = 6,\n  AUDIO20_FEATURE_UNIT_CTRL_TREBLE_POS = 8,\n  AUDIO20_FEATURE_UNIT_CTRL_GRAPHIC_EQU_POS = 10,\n  AUDIO20_FEATURE_UNIT_CTRL_AGC_POS = 12,\n  AUDIO20_FEATURE_UNIT_CTRL_DELAY_POS = 14,\n  AUDIO20_FEATURE_UNIT_CTRL_BASS_BOOST_POS = 16,\n  AUDIO20_FEATURE_UNIT_CTRL_LOUDNESS_POS = 18,\n  AUDIO20_FEATURE_UNIT_CTRL_INPUT_GAIN_POS = 20,\n  AUDIO20_FEATURE_UNIT_CTRL_INPUT_GAIN_PAD_POS = 22,\n  AUDIO20_FEATURE_UNIT_CTRL_PHASE_INV_POS = 24,\n  AUDIO20_FEATURE_UNIT_CTRL_UNDERFLOW_POS = 26,\n  AUDIO20_FEATURE_UNIT_CTRL_OVERFLOW_POS = 28,\n} audio20_feature_unit_control_pos_t;\n\n//--------------------------------------------------------------------+\n// USB AUDIO CLASS 2.0 (UAC2) DESCRIPTORS\n//--------------------------------------------------------------------+\n\n/// AUDIO Channel Cluster Descriptor UAC2 (4.1)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bNrChannels;                     ///< Number of channels currently connected.\n  uint32_t bmChannelConfig;///< Bitmap according to 'audio20_channel_config_t' with a 1 set if channel is connected and 0 else. In case channels are non-predefined ignore them here (see UAC2 specification 4.1 Audio Channel Cluster Descriptor.\n  uint8_t iChannelNames;                   ///< Index of a string descriptor, describing the name of the first inserted channel with a non-predefined spatial location.\n} audio20_desc_channel_cluster_t;\n\n/// AUDIO Class-Specific AC Interface Header Descriptor UAC2 (4.7.2)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor in bytes: 9.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_AC_INTERFACE_HEADER.\n  uint16_t bcdADC;           ///< Audio Device Class Specification Release Number in Binary-Coded Decimal. Value: U16_TO_U8S_LE(0x0200).\n  uint8_t bCategory;         ///< Constant, indicating the primary use of this audio function, as intended by the manufacturer. See: audio20_function_code_t.\n  uint16_t wTotalLength;     ///< Total number of bytes returned for the class-specific AudioControl interface descriptor. Includes the combined length of this descriptor header and all Clock Source, Unit and Terminal descriptors.\n  uint8_t bmControls;        ///< See: audio20_cs_ac_interface_control_pos_t.\n} audio20_desc_cs_ac_interface_t;\nTU_VERIFY_STATIC(sizeof(audio20_desc_cs_ac_interface_t) == 9, \"size is not correct\");\n\n/// AUDIO Clock Source Descriptor UAC2 (4.7.2.1)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor in bytes: 8.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_AC_INTERFACE_CLOCK_SOURCE.\n  uint8_t bClockID;          ///< Constant uniquely identifying the Clock Source Entity within the audio function. This value is used in all requests to address this Entity.\n  uint8_t bmAttributes;      ///< See: audio20_clock_source_attribute_t.\n  uint8_t bmControls;        ///< See: audio20_clock_source_control_pos_t.\n  uint8_t bAssocTerminal;    ///< Terminal ID of the Terminal that is associated with this Clock Source.\n  uint8_t iClockSource;      ///< Index of a string descriptor, describing the Clock Source Entity.\n} audio20_desc_clock_source_t;\n\n/// AUDIO Clock Selector Descriptor UAC2 (4.7.2.2) for ONE pin\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor, in bytes: 7+p.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_AC_INTERFACE_CLOCK_SELECTOR.\n  uint8_t bClockID;          ///< Constant uniquely identifying the Clock Selector Entity within the audio function. This value is used in all requests to address this Entity.\n  uint8_t bNrInPins;         ///< Number of Input Pins of this Unit: p = 1 thus bNrInPins = 1.\n  uint8_t baCSourceID;       ///< ID of the Clock Entity to which the first Clock Input Pin of this Clock Selector Entity is connected..\n  uint8_t bmControls;        ///< See: audio20_clock_selector_control_pos_t.\n  uint8_t iClockSource;      ///< Index of a string descriptor, describing the Clock Selector Entity.\n} audio20_desc_clock_selector_t;\n\n/// AUDIO Clock Selector Descriptor (4.7.2.2) for multiple pins\n#define audio20_desc_clock_selector_n_t(source_num) \\\n  struct TU_ATTR_PACKED {                           \\\n    uint8_t bLength;                                \\\n    uint8_t bDescriptorType;                        \\\n    uint8_t bDescriptorSubType;                     \\\n    uint8_t bClockID;                               \\\n    uint8_t bNrInPins;                              \\\n    struct TU_ATTR_PACKED {                         \\\n      uint8_t baSourceID;                           \\\n    } sourceID[source_num];                         \\\n    uint8_t bmControls;                             \\\n    uint8_t iClockSource;                           \\\n  }\n\n/// AUDIO Clock Multiplier Descriptor UAC2 (4.7.2.3)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor, in bytes: 7.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_AC_INTERFACE_CLOCK_MULTIPLIER.\n  uint8_t bClockID;          ///< Constant uniquely identifying the Clock Multiplier Entity within the audio function. This value is used in all requests to address this Entity.\n  uint8_t bCSourceID;        ///< ID of the Clock Entity to which the last Clock Input Pin of this Clock Selector Entity is connected.\n  uint8_t bmControls;        ///< See: audio20_clock_multiplier_control_pos_t.\n  uint8_t iClockSource;      ///< Index of a string descriptor, describing the Clock Multiplier Entity.\n} audio20_desc_clock_multiplier_t;\n\n/// AUDIO Input Terminal Descriptor(4.7.2.4)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor, in bytes: 17.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO_CS_AC_INTERFACE_INPUT_TERMINAL.\n  uint8_t bTerminalID;       ///< Constant uniquely identifying the Terminal within the audio function. This value is used in all requests to address this terminal.\n  uint16_t wTerminalType;    ///< Constant characterizing the type of Terminal. See: audio_terminal_type_t for USB streaming and audio_terminal_input_type_t for other input types.\n  uint8_t bAssocTerminal;    ///< ID of the Output Terminal to which this Input Terminal is associated.\n  uint8_t bCSourceID;        ///< ID of the Clock Entity to which this Input Terminal is connected.\n  uint8_t bNrChannels;       ///< Number of logical output channels in the Terminal’s output audio channel cluster.\n  uint32_t bmChannelConfig;  ///< Describes the spatial location of the logical channels. See:audio20_channel_config_t.\n  uint8_t iChannelNames;     ///< Index of a string descriptor, describing the name of the first logical channel.\n  uint16_t bmControls;       ///< See: audio_terminal_input_control_pos_t.\n  uint8_t iTerminal;         ///< Index of a string descriptor, describing the Input Terminal.\n} audio20_desc_input_terminal_t;\n\n/// AUDIO Output Terminal Descriptor UAC2 (4.7.2.5)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor, in bytes: 12.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_AC_INTERFACE_OUTPUT_TERMINAL.\n  uint8_t bTerminalID;       ///< Constant uniquely identifying the Terminal within the audio function. This value is used in all requests to address this Terminal.\n  uint16_t wTerminalType;    ///< Constant characterizing the type of Terminal. See: audio20_terminal_type_t for USB streaming and audio20_terminal_output_type_t for other output types.\n  uint8_t bAssocTerminal;    ///< Constant, identifying the Input Terminal to which this Output Terminal is associated.\n  uint8_t bSourceID;         ///< ID of the Unit or Terminal to which this Terminal is connected.\n  uint8_t bCSourceID;        ///< ID of the Clock Entity to which this Output Terminal is connected.\n  uint16_t bmControls;       ///< See: audio20_terminal_output_control_pos_t.\n  uint8_t iTerminal;         ///< Index of a string descriptor, describing the Output Terminal.\n} audio20_desc_output_terminal_t;\n\n/// AUDIO Feature Unit Descriptor UAC2 (4.7.2.8) for ONE channel\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor, in bytes: 14.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_AC_INTERFACE_FEATURE_UNIT.\n  uint8_t bUnitID;           ///< Constant uniquely identifying the Unit within the audio function. This value is used in all requests to address this Unit.\n  uint8_t bSourceID;         ///< ID of the Unit or Terminal to which this Feature Unit is connected.\n  struct TU_ATTR_PACKED {\n    uint32_t bmaControls;///< See: audio20_feature_unit_control_pos_t. Controls0 is master channel 0 (always present) and Controls1 is logical channel 1.\n  } controls[2];\n  uint8_t iTerminal;///< Index of a string descriptor, describing this Feature Unit.\n} audio20_desc_feature_unit_t;\n\n/// AUDIO Feature Unit Descriptor(4.7.2.8) for multiple channels\n#define audio20_desc_feature_unit_n_t(ch_num) \\\n  struct TU_ATTR_PACKED {                     \\\n    uint8_t bLength; /* 6+(ch_num+1)*4 */     \\\n    uint8_t bDescriptorType;                  \\\n    uint8_t bDescriptorSubType;               \\\n    uint8_t bUnitID;                          \\\n    uint8_t bSourceID;                        \\\n    struct TU_ATTR_PACKED {                   \\\n      uint32_t bmaControls;                   \\\n    } controls[ch_num + 1];                   \\\n    uint8_t iTerminal;                        \\\n  }\n\n/// AUDIO Class-Specific AS Interface Descriptor(4.9.2)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor, in bytes: 16.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_AS_INTERFACE_AS_GENERAL.\n  uint8_t bTerminalLink;     ///< The Terminal ID of the Terminal to which this interface is connected.\n  uint8_t bmControls;        ///< See: audio20_cs_as_interface_control_pos_t.\n  uint8_t bFormatType;       ///< Constant identifying the Format Type the AudioStreaming interface is using. See: audio20_format_type_t.\n  uint32_t bmFormats;        ///< The Audio Data Format(s) that can be used to communicate with this interface.See: audio20_data_format_type_I_t.\n  uint8_t bNrChannels;       ///< Number of physical channels in the AS Interface audio channel cluster.\n  uint32_t bmChannelConfig;  ///< Describes the spatial location of the physical channels. See: audio20_channel_config_t.\n  uint8_t iChannelNames;     ///< Index of a string descriptor, describing the name of the first physical channel.\n} audio20_desc_cs_as_interface_t;\n\n/// AUDIO Type I Format Type Descriptor(2.3.1.6 - Audio Formats)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor, in bytes: 6.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_INTERFACE.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_AS_INTERFACE_FORMAT_TYPE.\n  uint8_t bFormatType;       ///< Constant identifying the Format Type the AudioStreaming interface is using. Value: AUDIO20_FORMAT_TYPE_I.\n  uint8_t bSubslotSize;      ///< The number of bytes occupied by one audio subslot. Can be 1, 2, 3 or 4.\n  uint8_t bBitResolution;    ///< The number of effectively used bits from the available bits in an audio subslot.\n} audio20_desc_type_I_format_t;\n\n/// AUDIO Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor, in bytes: 8.\n  uint8_t bDescriptorType;   ///< Descriptor Type. Value: TUSB_DESC_CS_ENDPOINT.\n  uint8_t bDescriptorSubType;///< Descriptor SubType. Value: AUDIO20_CS_EP_SUBTYPE_GENERAL.\n  uint8_t bmAttributes;      ///< See: audio20_cs_as_iso_data_ep_attribute_t.\n  uint8_t bmControls;        ///< See: audio20_cs_as_iso_data_ep_control_pos_t.\n  uint8_t bLockDelayUnits;   ///< Indicates the units used for the wLockDelay field. See: audio20_cs_as_iso_data_ep_lock_delay_unit_t.\n  uint16_t wLockDelay;       ///< Indicates the time it takes this endpoint to reliably lock its internal clock recovery circuitry. Units used depend on the value of the bLockDelayUnits field.\n} audio20_desc_cs_as_iso_data_ep_t;\n\n// 5.2.2 Control Request Layout\ntypedef struct TU_ATTR_PACKED {\n  union {\n    struct TU_ATTR_PACKED {\n      uint8_t recipient : 5;///< Recipient type tusb_request_recipient_t.\n      uint8_t type : 2;     ///< Request type tusb_request_type_t.\n      uint8_t direction : 1;///< Direction type. tusb_dir_t\n    } bmRequestType_bit;\n\n    uint8_t bmRequestType;\n  };\n\n  uint8_t bRequest;///< Request type audio_cs_req_t\n  uint8_t bChannelNumber;\n  uint8_t bControlSelector;\n  union {\n    uint8_t bInterface;\n    uint8_t bEndpoint;\n  };\n  uint8_t bEntityID;\n  uint16_t wLength;\n} audio20_control_request_t;\n\n//// 5.2.3 Control Request Parameter Block Layout\n\n// 5.2.3.1 1-byte Control CUR Parameter Block\ntypedef struct TU_ATTR_PACKED {\n  int8_t bCur;///< The setting for the CUR attribute of the addressed Control\n} audio20_control_cur_1_t;\n\n// 5.2.3.2 2-byte Control CUR Parameter Block\ntypedef struct TU_ATTR_PACKED {\n  int16_t bCur;///< The setting for the CUR attribute of the addressed Control\n} audio20_control_cur_2_t;\n\n// 5.2.3.3 4-byte Control CUR Parameter Block\ntypedef struct TU_ATTR_PACKED {\n  int32_t bCur;///< The setting for the CUR attribute of the addressed Control\n} audio20_control_cur_4_t;\n\n// Use the following ONLY for RECEIVED data - compiler does not know how many subranges are defined! Use the #define macros below for predefined lengths.\n\n// 5.2.3.1 1-byte Control RANGE Parameter Block\n#define audio20_control_range_1_n_t(numSubRanges)                                                      \\\n  struct TU_ATTR_PACKED {                                                                              \\\n    uint16_t wNumSubRanges;                                                                            \\\n    struct TU_ATTR_PACKED {                                                                            \\\n      int8_t bMin;  /*The setting for the MIN attribute of the nth subrange of the addressed Control*/ \\\n      int8_t bMax;  /*The setting for the MAX attribute of the nth subrange of the addressed Control*/ \\\n      uint8_t bRes; /*The setting for the RES attribute of the nth subrange of the addressed Control*/ \\\n    } subrange[numSubRanges];                                                                          \\\n  }\n\n/// 5.2.3.2 2-byte Control RANGE Parameter Block\n#define audio20_control_range_2_n_t(numSubRanges)                                                       \\\n  struct TU_ATTR_PACKED {                                                                               \\\n    uint16_t wNumSubRanges;                                                                             \\\n    struct TU_ATTR_PACKED {                                                                             \\\n      int16_t bMin;  /*The setting for the MIN attribute of the nth subrange of the addressed Control*/ \\\n      int16_t bMax;  /*The setting for the MAX attribute of the nth subrange of the addressed Control*/ \\\n      uint16_t bRes; /*The setting for the RES attribute of the nth subrange of the addressed Control*/ \\\n    } subrange[numSubRanges];                                                                           \\\n  }\n\n// 5.2.3.3 4-byte Control RANGE Parameter Block\n#define audio20_control_range_4_n_t(numSubRanges)                                                       \\\n  struct TU_ATTR_PACKED {                                                                               \\\n    uint16_t wNumSubRanges;                                                                             \\\n    struct TU_ATTR_PACKED {                                                                             \\\n      int32_t bMin;  /*The setting for the MIN attribute of the nth subrange of the addressed Control*/ \\\n      int32_t bMax;  /*The setting for the MAX attribute of the nth subrange of the addressed Control*/ \\\n      uint32_t bRes; /*The setting for the RES attribute of the nth subrange of the addressed Control*/ \\\n    } subrange[numSubRanges];                                                                           \\\n  }\n\n// 6.1 Interrupt Data Message Format\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bInfo;\n  uint8_t bAttribute;\n  union {\n    uint16_t wValue;\n    struct {\n      uint8_t wValue_cn_or_mcn;\n      uint8_t wValue_cs;\n    };\n  };\n  union {\n    uint16_t wIndex;\n    struct {\n      uint8_t wIndex_ep_or_int;\n      uint8_t wIndex_entity_id;\n    };\n  };\n} audio20_interrupt_data_t;\n\n//--------------------------------------------------------------------+\n// APPLICATION HELPER DEFINITIONS\n//--------------------------------------------------------------------+\n\n// Combined Interrupt Data Message Format for both UAC1 and UAC2\ntypedef union {\n  audio10_interrupt_data_t v1;\n  audio20_interrupt_data_t v2;\n} audio_interrupt_data_t;\n\n// MIDI1.0 use the same CS AC Interface Descriptor as UAC1\ntypedef audio10_desc_cs_ac_interface_n_t(1) midi10_desc_cs_ac_interface_t;\n\n// UAC1.0 AC Interface Descriptor with 1 interface, used to read fields other than baInterfaceNr\ntypedef audio10_desc_cs_ac_interface_n_t(1) audio10_desc_cs_ac_interface_1_t;\n\n/** @} */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n/** @} */\n"
  },
  {
    "path": "src/class/audio/audio_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Reinhard Panhuber, Jerzy Kasenberg\n * Copyright (c) 2023 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/*\n * This driver supports at most one out EP, one in EP, one control EP, and one feedback EP and one alternative interface other than zero. Hence, only one input terminal and one output terminal are support, if you need more adjust the driver!\n * It supports multiple TX and RX channels.\n *\n * In case you need more alternate interfaces, you need to define additional defines for this specific alternate interface. Just define them and set them in the set_interface function.\n *\n * There are three data flow structures currently implemented, where at least one SW-FIFO is used to decouple the asynchronous processes MCU vs. host\n *\n * 1. Input data -> SW-FIFO -> MCU USB\n *\n * The most easiest version, available in case the target MCU can handle the software FIFO (SW-FIFO) and if it is implemented in the device driver (if yes then dcd_edpt_xfer_fifo() is available)\n *\n * 2. Input data -> SW-FIFO -> Linear buffer -> MCU USB\n *\n * In case the target MCU can not handle a SW-FIFO, a linear buffer is used. This uses the default function dcd_edpt_xfer(). In this case more memory is required.\n *\n * 3. (Input data 1 | Input data 2 | ... | Input data N) ->  (SW-FIFO 1 | SW-FIFO 2 | ... | SW-FIFO N) -> Linear buffer -> MCU USB\n *\n * This case is used if you have more channels which need to be combined into one stream. Every channel has its own SW-FIFO. All data is encoded into an Linear buffer.\n *\n * The same holds in the RX case.\n *\n * */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_AUDIO)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"audio_device.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n// Declaration of buffers\n\n// Check for maximum supported numbers\n#if CFG_TUD_AUDIO > 3\n  #error Maximum number of audio functions restricted to three!\n#endif\n\n// Put swap buffer in USB section only if necessary\n#if !CFG_TUD_EDPT_DEDICATED_HWFIFO\n  #define IN_SW_BUF_MEM_ATTR TU_ATTR_ALIGNED(4)\n#else\n  #define IN_SW_BUF_MEM_ATTR CFG_TUD_MEM_SECTION CFG_TUD_MEM_ALIGN\n#endif\n#if !CFG_TUD_EDPT_DEDICATED_HWFIFO\n  #define OUT_SW_BUF_MEM_ATTR TU_ATTR_ALIGNED(4)\n#else\n  #define OUT_SW_BUF_MEM_ATTR CFG_TUD_MEM_SECTION CFG_TUD_MEM_ALIGN\n#endif\n\n// EP IN software buffers\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\ntu_static IN_SW_BUF_MEM_ATTR struct {\n  #if CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ > 0\n  TUD_EPBUF_DEF(buf_1, CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ);\n  #endif\n  #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ > 0\n  TUD_EPBUF_DEF(buf_2, CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ);\n  #endif\n  #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ > 0\n  TUD_EPBUF_DEF(buf_3, CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ);\n  #endif\n} ep_in_sw_buf;\n#endif// CFG_TUD_AUDIO_ENABLE_EP_IN\n\n// Linear buffer TX in case:\n// - target MCU is not capable of handling a ring buffer FIFO e.g. no hardware buffer is available or driver is would need to be changed dramatically OR\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_EDPT_DEDICATED_HWFIFO\ntu_static CFG_TUD_MEM_SECTION struct {\n  #if CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX > 0\n  TUD_EPBUF_DEF(buf_1, CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX);\n  #endif\n  #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX > 0\n  TUD_EPBUF_DEF(buf_2, CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX);\n  #endif\n  #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX > 0\n  TUD_EPBUF_DEF(buf_3, CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX);\n  #endif\n} lin_buf_in;\n#endif// CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_EDPT_DEDICATED_HWFIFO\n\n// EP OUT software buffers\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\ntu_static OUT_SW_BUF_MEM_ATTR struct {\n  #if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ > 0\n  TUD_EPBUF_DEF(buf_1, CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ);\n  #endif\n  #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ > 0\n  TUD_EPBUF_DEF(buf_2, CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ);\n  #endif\n  #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ > 0\n  TUD_EPBUF_DEF(buf_3, CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ);\n  #endif\n} ep_out_sw_buf;\n#endif// CFG_TUD_AUDIO_ENABLE_EP_OUT\n\n// Linear buffer RX in case:\n// - target MCU is not capable of handling a ring buffer FIFO e.g. no hardware buffer is available or driver is would need to be changed dramatically OR\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && !CFG_TUD_EDPT_DEDICATED_HWFIFO\ntu_static CFG_TUD_MEM_SECTION struct {\n  #if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX > 0\n  TUD_EPBUF_DEF(buf_1, CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX);\n  #endif\n  #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX > 0\n  TUD_EPBUF_DEF(buf_2, CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX);\n  #endif\n  #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX > 0\n  TUD_EPBUF_DEF(buf_3, CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX);\n  #endif\n} lin_buf_out;\n#endif// CFG_TUD_AUDIO_ENABLE_EP_OUT && !CFG_TUD_EDPT_DEDICATED_HWFIFO\n\n// Control buffer\n#if CFG_TUD_AUDIO_CTRL_BUF_SZ > CFG_TUD_ENDPOINT0_BUFSIZE\ntu_static CFG_TUD_MEM_ALIGN uint8_t ctrl_buf[CFG_TUD_AUDIO_CTRL_BUF_SZ];\n#endif\n\n// Aligned buffer for feedback EP\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\ntu_static CFG_TUD_MEM_SECTION struct {\n  #if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX > 0\n  TUD_EPBUF_TYPE_DEF(uint32_t, buf_1);\n  #endif\n  #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX > 0\n  TUD_EPBUF_TYPE_DEF(uint32_t, buf_2);\n  #endif\n  #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX > 0\n  TUD_EPBUF_TYPE_DEF(uint32_t, buf_3);\n  #endif\n} fb_ep_buf;\n#endif\n\n// Aligned buffer for interrupt EP\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\ntu_static CFG_TUD_MEM_SECTION struct {\n  TUD_EPBUF_DEF(buf, CFG_TUD_AUDIO_INTERRUPT_EP_SZ);\n} int_ep_buf[CFG_TUD_AUDIO];\n#endif\n\ntypedef struct\n{\n  uint8_t rhport;\n  uint8_t const *p_desc;// Pointer pointing to Standard AC Interface Descriptor(4.7.1) - Audio Control descriptor defining audio function\n  uint8_t const *p_desc_as;// Pointer pointing to 1st Standard AS Interface Descriptor(4.9.1) - Audio Streaming descriptor defining audio function\n  uint16_t desc_length;// Length of audio function descriptor\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n  uint8_t ep_in;            // TX audio data EP.\n  uint16_t ep_in_sz;        // Current size of TX EP\n  uint8_t ep_in_as_intf_num;// Corresponding Standard AS Interface Descriptor (4.9.1) belonging to output terminal to which this EP belongs - 0 is invalid (this fits to UAC2 specification since AS interfaces can not have interface number equal to zero)\n  uint8_t ep_in_alt;        // Current alternate setting of TX EP\n  uint16_t ep_in_fifo_threshold;// Target size for the EP IN FIFO.\n  #endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n  uint8_t ep_out;            // Incoming (into uC) audio data EP.\n  uint16_t ep_out_sz;        // Current size of RX EP\n  uint8_t ep_out_as_intf_num;// Corresponding Standard AS Interface Descriptor (4.9.1) belonging to input terminal to which this EP belongs - 0 is invalid (this fits to UAC2 specification since AS interfaces can not have interface number equal to zero)\n  uint8_t ep_out_alt;        // Current alternate setting of RX EP\n  #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n  uint8_t ep_fb;// Feedback EP.\n  #endif\n\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\n  uint8_t ep_int;// Audio control interrupt EP.\n#endif\n\n  bool mounted;// Device opened\n\n#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n  struct {\n    uint32_t value;    // Feedback value for asynchronous mode (in 16.16 format).\n    uint32_t min_value;// min value according to UAC2 FMT-2.0 section 2.3.1.1.\n    uint32_t max_value;// max value according to UAC2 FMT-2.0 section 2.3.1.1.\n\n    uint8_t frame_shift;// bInterval-1 in unit of frame (FS), micro-frame (HS)\n    uint8_t compute_method;\n    union {\n      uint8_t power_of_2;// pre-computed power of 2 shift\n      float float_const; // pre-computed float constant\n\n      struct {\n        uint32_t sample_freq;\n        uint32_t mclk_freq;\n      } fixed;\n\n      struct {\n        uint32_t nom_value;    // In 16.16 format\n        uint32_t fifo_lvl_avg; // In 16.16 format\n        uint16_t fifo_lvl_thr; // fifo level threshold\n        uint16_t rate_const[2];// pre-computed feedback/fifo_depth rate\n      } fifo_count;\n    } compute;\n\n  } feedback;\n#endif// CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n  uint32_t sample_rate_tx;\n  uint16_t packet_sz_tx[3];\n  uint8_t bclock_id_tx;\n  uint8_t interval_tx;\n  uint8_t format_type_tx;\n  uint8_t n_channels_tx;\n  uint8_t n_bytes_per_sample_tx;\n#endif\n\n  /*------------- From this point, data is not cleared by bus reset -------------*/\n\n// EP Transfer buffers and FIFOs\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n  tu_fifo_t ep_out_ff;\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n  tu_fifo_t ep_in_ff;\n#endif\n\n// Linear buffer in case target MCU is not capable of handling a ring buffer FIFO e.g. no hardware buffer is available or driver is would need to be changed dramatically\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && !CFG_TUD_EDPT_DEDICATED_HWFIFO\n  uint8_t *lin_buf_out;\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && !CFG_TUD_EDPT_DEDICATED_HWFIFO\n  uint8_t *lin_buf_in;\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n  uint32_t *fb_buf;\n#endif\n} audiod_function_t;\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n#define ITF_MEM_RESET_SIZE offsetof(audiod_function_t, ep_out_ff)\n#else\n#define ITF_MEM_RESET_SIZE offsetof(audiod_function_t, ep_in_ff)\n#endif\n\n//--------------------------------------------------------------------+\n// WEAK FUNCTION STUBS\n//--------------------------------------------------------------------+\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\nTU_ATTR_WEAK bool tud_audio_tx_done_isr(uint8_t rhport, uint16_t n_bytes_sent, uint8_t func_id, uint8_t ep_in, uint8_t cur_alt_setting) {\n  (void) rhport;\n  (void) n_bytes_sent;\n  (void) func_id;\n  (void) ep_in;\n  (void) cur_alt_setting;\n  return true;\n}\n\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\nTU_ATTR_WEAK bool tud_audio_rx_done_isr(uint8_t rhport, uint16_t n_bytes_received, uint8_t func_id, uint8_t ep_out, uint8_t cur_alt_setting) {\n  (void) rhport;\n  (void) n_bytes_received;\n  (void) func_id;\n  (void) ep_out;\n  (void) cur_alt_setting;\n  return true;\n}\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\nTU_ATTR_WEAK void tud_audio_feedback_params_cb(uint8_t func_id, uint8_t alt_itf, audio_feedback_params_t *feedback_param) {\n  (void) func_id;\n  (void) alt_itf;\n  feedback_param->method = AUDIO_FEEDBACK_METHOD_DISABLED;\n}\n\nTU_ATTR_WEAK TU_ATTR_FAST_FUNC void tud_audio_feedback_interval_isr(uint8_t func_id, uint32_t frame_number, uint8_t interval_shift) {\n  (void) func_id;\n  (void) frame_number;\n  (void) interval_shift;\n}\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\nTU_ATTR_WEAK void tud_audio_int_done_cb(uint8_t rhport) {\n  (void) rhport;\n}\n#endif\n\n// Invoked when audio set interface request received\nTU_ATTR_WEAK bool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  (void) p_request;\n  return true;\n}\n\n// Invoked when audio set interface request received which closes an EP\nTU_ATTR_WEAK bool tud_audio_set_itf_close_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  (void) p_request;\n  return true;\n}\n\n// Invoked when audio class specific set request received for an EP\nTU_ATTR_WEAK bool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) p_request;\n  (void) pBuff;\n  TU_LOG2(\"  No EP set request callback available!\\r\\n\");\n  return false;// In case no callback function is present or request can not be conducted we stall it\n}\n\n// Invoked when audio class specific set request received for an interface\nTU_ATTR_WEAK bool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) p_request;\n  (void) pBuff;\n  TU_LOG2(\"  No interface set request callback available!\\r\\n\");\n  return false;// In case no callback function is present or request can not be conducted we stall it\n}\n\n// Invoked when audio class specific set request received for an entity\nTU_ATTR_WEAK bool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request, uint8_t *pBuff) {\n  (void) rhport;\n  (void) p_request;\n  (void) pBuff;\n  TU_LOG2(\"  No entity set request callback available!\\r\\n\");\n  return false;// In case no callback function is present or request can not be conducted we stall it\n}\n\n// Invoked when audio class specific get request received for an EP\nTU_ATTR_WEAK bool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  (void) p_request;\n  TU_LOG2(\"  No EP get request callback available!\\r\\n\");\n  return false;// Stall\n}\n\n// Invoked when audio class specific get request received for an interface\nTU_ATTR_WEAK bool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  (void) p_request;\n  TU_LOG2(\"  No interface get request callback available!\\r\\n\");\n  return false;// Stall\n}\n\n// Invoked when audio class specific get request received for an entity\nTU_ATTR_WEAK bool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n  (void) p_request;\n  TU_LOG2(\"  No entity get request callback available!\\r\\n\");\n  return false;// Stall\n}\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\ntu_static CFG_TUD_MEM_SECTION audiod_function_t _audiod_fct[CFG_TUD_AUDIO];\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\nstatic bool audiod_rx_xfer_isr(uint8_t rhport, audiod_function_t* audio, uint16_t n_bytes_received);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\nstatic bool audiod_tx_xfer_isr(uint8_t rhport, audiod_function_t* audio, uint16_t n_bytes_sent);\n#endif\n\nstatic bool audiod_get_interface(uint8_t rhport, tusb_control_request_t const *p_request);\nstatic bool audiod_set_interface(uint8_t rhport, tusb_control_request_t const *p_request);\n\nstatic bool audiod_verify_entity_exists(uint8_t itf, uint8_t entityID, uint8_t *func_id);\nstatic bool audiod_verify_itf_exists(uint8_t itf, uint8_t *func_id);\nstatic bool audiod_verify_ep_exists(uint8_t ep, uint8_t *func_id);\nstatic inline uint8_t audiod_get_audio_fct_idx(audiod_function_t *audio);\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\nstatic void audiod_parse_flow_control_params(audiod_function_t *audio, uint8_t const *p_desc);\nstatic bool audiod_calc_tx_packet_sz(audiod_function_t *audio);\nstatic uint16_t audiod_tx_packet_size(const uint16_t *nominal_size, uint16_t data_count, uint16_t fifo_depth, uint16_t fifo_threshold, uint16_t max_size);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\nstatic bool audiod_fb_params_prepare(uint8_t func_id, uint8_t alt);\nstatic void audiod_fb_fifo_count_update(audiod_function_t *audio, uint16_t lvl_new);\n#endif\n\nbool tud_audio_n_mounted(uint8_t func_id) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO);\n  audiod_function_t *audio = &_audiod_fct[func_id];\n\n  return audio->mounted;\n}\n\nstatic inline uint8_t* get_ctrl_buffer(void) {\n  // Use EP0 buffer if it is large enough, otherwise use dedicated buffer\n  #if CFG_TUD_AUDIO_CTRL_BUF_SZ > CFG_TUD_ENDPOINT0_BUFSIZE\n  return ctrl_buf;\n  #else\n  return usbd_get_ctrl_buf();\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// READ API\n//--------------------------------------------------------------------+\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n\nuint16_t tud_audio_n_available(uint8_t func_id) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL);\n  return tu_fifo_count(&_audiod_fct[func_id].ep_out_ff);\n}\n\nuint16_t tud_audio_n_read(uint8_t func_id, void *buffer, uint16_t bufsize) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL);\n  return tu_fifo_read_n(&_audiod_fct[func_id].ep_out_ff, buffer, bufsize);\n}\n\nbool tud_audio_n_clear_ep_out_ff(uint8_t func_id) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL);\n  tu_fifo_clear(&_audiod_fct[func_id].ep_out_ff);\n  return true;\n}\n\ntu_fifo_t *tud_audio_n_get_ep_out_ff(uint8_t func_id) {\n  if (func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL) {\n    return &_audiod_fct[func_id].ep_out_ff;\n  }\n  return NULL;\n}\n\nstatic bool audiod_rx_xfer_isr(uint8_t rhport, audiod_function_t* audio, uint16_t n_bytes_received) {\n  uint8_t idx_audio_fct = audiod_get_audio_fct_idx(audio);\n\n  #if !CFG_TUD_EDPT_DEDICATED_HWFIFO\n  // Data currently is in linear buffer, copy into EP OUT FIFO\n  TU_VERIFY(0 < tu_fifo_write_n(&audio->ep_out_ff, audio->lin_buf_out, n_bytes_received));\n\n  // Schedule for next receive\n  TU_VERIFY(usbd_edpt_xfer(rhport, audio->ep_out, audio->lin_buf_out, audio->ep_out_sz, true));\n  #else\n  // Data is already placed in EP FIFO, schedule for next receive\n  TU_VERIFY(usbd_edpt_xfer_fifo(rhport, audio->ep_out, &audio->ep_out_ff, audio->ep_out_sz, true));\n  #endif\n\n  #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n  if (audio->feedback.compute_method == AUDIO_FEEDBACK_METHOD_FIFO_COUNT) {\n    audiod_fb_fifo_count_update(audio, tu_fifo_count(&audio->ep_out_ff));\n  }\n  #endif\n\n  // Call a weak callback here - a possibility for user to get informed an audio packet was received and data gets now loaded into EP FIFO\n  TU_VERIFY(tud_audio_rx_done_isr(rhport, n_bytes_received, idx_audio_fct, audio->ep_out, audio->ep_out_alt));\n\n  return true;\n}\n\n#endif//CFG_TUD_AUDIO_ENABLE_EP_OUT\n\n//--------------------------------------------------------------------+\n// WRITE API\n//--------------------------------------------------------------------+\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n\nuint16_t tud_audio_n_write(uint8_t func_id, const void *data, uint16_t len) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL);\n  return tu_fifo_write_n(&_audiod_fct[func_id].ep_in_ff, data, len);\n}\n\nbool tud_audio_n_clear_ep_in_ff(uint8_t func_id) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL);\n  tu_fifo_clear(&_audiod_fct[func_id].ep_in_ff);\n  return true;\n}\n\ntu_fifo_t *tud_audio_n_get_ep_in_ff(uint8_t func_id) {\n  if (func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL) {\n    return &_audiod_fct[func_id].ep_in_ff;\n  }\n  return NULL;\n}\n\nuint16_t tud_audio_n_get_ep_in_fifo_threshold(uint8_t func_id) {\n  if (func_id < CFG_TUD_AUDIO) return _audiod_fct[func_id].ep_in_fifo_threshold;\n  return 0;\n}\n\nvoid tud_audio_n_set_ep_in_fifo_threshold(uint8_t func_id, uint16_t threshold) {\n  if (func_id < CFG_TUD_AUDIO && threshold < _audiod_fct[func_id].ep_in_ff.depth) {\n    _audiod_fct[func_id].ep_in_fifo_threshold = threshold;\n  }\n}\n\nstatic bool audiod_tx_xfer_isr(uint8_t rhport, audiod_function_t * audio, uint16_t n_bytes_sent) {\n  uint8_t idx_audio_fct = audiod_get_audio_fct_idx(audio);\n\n  // Only send something if current alternate interface is not 0 as in this case nothing is to be sent due to UAC2 specifications\n  if (audio->ep_in_alt == 0) { return false; }\n\n  // Send everything in ISO EP FIFO\n  uint16_t n_bytes_tx;\n\n  #if CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n  // packet_sz_tx is based on total packet size, here we want size for each support buffer.\n  n_bytes_tx = audiod_tx_packet_size(audio->packet_sz_tx, tu_fifo_count(&audio->ep_in_ff), audio->ep_in_ff.depth, audio->ep_in_fifo_threshold, audio->ep_in_sz);\n  #else\n  n_bytes_tx = tu_min16(tu_fifo_count(&audio->ep_in_ff), audio->ep_in_sz);// Limit up to max packet size, more can not be done for ISO\n  #endif\n  #if !CFG_TUD_EDPT_DEDICATED_HWFIFO\n  tu_fifo_read_n(&audio->ep_in_ff, audio->lin_buf_in, n_bytes_tx);\n  TU_VERIFY(usbd_edpt_xfer(rhport, audio->ep_in, audio->lin_buf_in, n_bytes_tx, true));\n  #else\n  // Send everything in ISO EP FIFO\n  TU_VERIFY(usbd_edpt_xfer_fifo(rhport, audio->ep_in, &audio->ep_in_ff, n_bytes_tx, true));\n  #endif\n\n  // Call a weak callback here - a possibility for user to get informed former TX was completed and data gets now loaded into EP in buffer\n  TU_VERIFY(tud_audio_tx_done_isr(rhport, n_bytes_sent, idx_audio_fct, audio->ep_in, audio->ep_in_alt));\n\n  return true;\n}\n\n#endif\n\n//--------------------------------------------------------------------+\n// OTHER API\n//--------------------------------------------------------------------+\n\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\n// If no interrupt transmit is pending bytes get written into buffer and a transmit is scheduled - once transmit completed tud_audio_int_done_cb() is called in inform user\nbool tud_audio_int_n_write(uint8_t func_id, const audio_interrupt_data_t *data) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL);\n\n  TU_VERIFY(_audiod_fct[func_id].ep_int != 0);\n\n  // We write directly into the EP's buffer - abort if previous transfer not complete\n  TU_VERIFY(usbd_edpt_claim(_audiod_fct[func_id].rhport, _audiod_fct[func_id].ep_int));\n\n  uint8_t size = tud_audio_n_version(func_id) == 2 ? sizeof(audio20_interrupt_data_t) : sizeof(audio10_interrupt_data_t);\n\n  // INT EP buffer must be large enough\n  TU_ASSERT(size <= sizeof(int_ep_buf[func_id].buf));\n\n  // Check length\n  if (tu_memcpy_s(int_ep_buf[func_id].buf, sizeof(int_ep_buf[func_id].buf), data, size) == 0) {\n    // Schedule transmit\n    TU_ASSERT(usbd_edpt_xfer(_audiod_fct[func_id].rhport, _audiod_fct[func_id].ep_int, int_ep_buf[func_id].buf, size, false));\n  } else {\n    // Release endpoint since we don't make any transfer\n    usbd_edpt_release(_audiod_fct[func_id].rhport, _audiod_fct[func_id].ep_int);\n  }\n\n  return true;\n}\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n// This function is called once a transmit of a feedback packet was successfully completed. Here, we get the next feedback value to be sent\nstatic inline bool audiod_fb_send(uint8_t func_id, bool is_isr) {\n  audiod_function_t *audio = &_audiod_fct[func_id];\n  uint8_t uac_version = tud_audio_n_version(func_id);\n  // Format the feedback value\n  if (uac_version == 1) {\n    uint8_t *fb = (uint8_t *) audio->fb_buf;\n\n    // For FS format is 10.14\n    *(fb++) = (audio->feedback.value >> 2) & 0xFF;\n    *(fb++) = (audio->feedback.value >> 10) & 0xFF;\n    *(fb++) = (audio->feedback.value >> 18) & 0xFF;\n    *fb = 0;\n  } else {\n    *audio->fb_buf = audio->feedback.value;\n  }\n\n  return usbd_edpt_xfer(audio->rhport, audio->ep_fb, (uint8_t *) audio->fb_buf, uac_version == 1 ? 3 : 4, is_isr);\n}\n\nuint32_t tud_audio_feedback_update(uint8_t func_id, uint32_t cycles) {\n  audiod_function_t *audio = &_audiod_fct[func_id];\n  uint32_t feedback;\n\n  switch (audio->feedback.compute_method) {\n    case AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2:\n      feedback = (cycles << audio->feedback.compute.power_of_2);\n      break;\n\n    case AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT:\n      feedback = (uint32_t) ((float) cycles * audio->feedback.compute.float_const);\n      break;\n\n    case AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED: {\n      uint64_t fb64 = (((uint64_t) cycles) * audio->feedback.compute.fixed.sample_freq) << (16 - (audio->feedback.frame_shift - 1));\n      feedback = (uint32_t) (fb64 / audio->feedback.compute.fixed.mclk_freq);\n    } break;\n\n    default:\n      return 0;\n  }\n\n  // For Windows: https://docs.microsoft.com/en-us/windows-hardware/drivers/audio/usb-2-0-audio-drivers\n  // The size of isochronous packets created by the device must be within the limits specified in FMT-2.0 section 2.3.1.1.\n  // This means that the deviation of actual packet size from nominal size must not exceed +/- one audio slot\n  // (audio slot = channel count samples).\n  if (feedback > audio->feedback.max_value) {\n    feedback = audio->feedback.max_value;\n  }\n  if (feedback < audio->feedback.min_value) {\n    feedback = audio->feedback.min_value;\n  }\n\n  tud_audio_n_fb_set(func_id, feedback);\n\n  return feedback;\n}\n\nbool tud_audio_n_fb_set(uint8_t func_id, uint32_t feedback) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL);\n\n  _audiod_fct[func_id].feedback.value = feedback;\n\n  return true;\n}\n#endif\n\nuint8_t tud_audio_n_version(uint8_t func_id) {\n  TU_VERIFY(func_id < CFG_TUD_AUDIO && _audiod_fct[func_id].p_desc != NULL);\n\n  uint8_t bIntfProtocol = ((tusb_desc_interface_t const *)_audiod_fct[func_id].p_desc)->bInterfaceProtocol;\n\n  if (bIntfProtocol == AUDIO_INT_PROTOCOL_CODE_V1) {\n    return 1;\n  } else if (bIntfProtocol == AUDIO_INT_PROTOCOL_CODE_V2) {\n    return 2;\n  } else {\n    return 0; // Unknown version\n  }\n}\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid audiod_init(void) {\n  tu_memclr(_audiod_fct, sizeof(_audiod_fct));\n\n  for (uint8_t i = 0; i < CFG_TUD_AUDIO; i++) {\n    audiod_function_t *audio = &_audiod_fct[i];\n\n      // Initialize IN EP FIFO if required\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n    switch (i) {\n  #if CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ > 0\n      case 0:\n        tu_fifo_config(&audio->ep_in_ff, ep_in_sw_buf.buf_1, CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ, true);\n        break;\n  #endif\n  #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ > 0\n      case 1:\n        tu_fifo_config(&audio->ep_in_ff, ep_in_sw_buf.buf_2, CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ, true);\n        break;\n  #endif\n  #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ > 0\n      case 2:\n        tu_fifo_config(&audio->ep_in_ff, ep_in_sw_buf.buf_3, CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ, true);\n        break;\n  #endif\n    }\n\n    // Initialize linear buffers\n  #if !CFG_TUD_EDPT_DEDICATED_HWFIFO\n    switch (i) {\n    #if CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX > 0\n      case 0:\n        audio->lin_buf_in = lin_buf_in.buf_1;\n        break;\n    #endif\n    #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX > 0\n      case 1:\n        audio->lin_buf_in = lin_buf_in.buf_2;\n        break;\n    #endif\n    #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX > 0\n      case 2:\n        audio->lin_buf_in = lin_buf_in.buf_3;\n        break;\n    #endif\n    }\n  #endif// !CFG_TUD_EDPT_DEDICATED_HWFIFO\n#endif// CFG_TUD_AUDIO_ENABLE_EP_IN\n\n      // Initialize OUT EP FIFO if required\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n    switch (i) {\n  #if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ > 0\n      case 0:\n        tu_fifo_config(&audio->ep_out_ff, ep_out_sw_buf.buf_1, CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ, true);\n        break;\n  #endif\n  #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ > 0\n      case 1:\n        tu_fifo_config(&audio->ep_out_ff, ep_out_sw_buf.buf_2, CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ, true);\n        break;\n  #endif\n  #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ > 0\n      case 2:\n        tu_fifo_config(&audio->ep_out_ff, ep_out_sw_buf.buf_3, CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ, true);\n        break;\n  #endif\n    }\n\n  #if !CFG_TUD_EDPT_DEDICATED_HWFIFO\n    // Initialize linear buffers\n    switch (i) {\n    #if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX > 0\n      case 0:\n        audio->lin_buf_out = lin_buf_out.buf_1;\n        break;\n    #endif\n    #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX > 0\n      case 1:\n        audio->lin_buf_out = lin_buf_out.buf_2;\n        break;\n    #endif\n    #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX > 0\n      case 2:\n        audio->lin_buf_out = lin_buf_out.buf_3;\n        break;\n    #endif\n    }\n  #endif// !CFG_TUD_EDPT_DEDICATED_HWFIFO\n#endif// CFG_TUD_AUDIO_ENABLE_EP_OUT\n\n#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n    switch (i) {\n  #if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX > 0\n      case 0:\n        audio->fb_buf = &fb_ep_buf.buf_1;\n        break;\n  #endif\n  #if CFG_TUD_AUDIO > 1 && CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX > 0\n      case 1:\n        audio->fb_buf = &fb_ep_buf.buf_2;\n        break;\n  #endif\n  #if CFG_TUD_AUDIO > 2 && CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX > 0\n      case 2:\n        audio->fb_buf = &fb_ep_buf.buf_3;\n        break;\n  #endif\n    }\n#endif// CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n  }\n}\n\nbool audiod_deinit(void) {\n  return false;// TODO not implemented yet\n}\n\nvoid audiod_reset(uint8_t rhport) {\n  (void) rhport;\n\n  for (uint8_t i = 0; i < CFG_TUD_AUDIO; i++) {\n    audiod_function_t *audio = &_audiod_fct[i];\n    tu_memclr(audio, ITF_MEM_RESET_SIZE);\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n    tu_fifo_clear(&audio->ep_in_ff);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n    tu_fifo_clear(&audio->ep_out_ff);\n#endif\n  }\n}\n\nuint16_t audiod_open(uint8_t rhport, tusb_desc_interface_t const *itf_desc, uint16_t max_len) {\n  (void) max_len;\n\n  TU_VERIFY(TUSB_CLASS_AUDIO == itf_desc->bInterfaceClass &&\n            AUDIO_SUBCLASS_CONTROL == itf_desc->bInterfaceSubClass, 0);\n\n  // Verify version is correct - this check can be omitted\n  TU_VERIFY(itf_desc->bInterfaceProtocol == AUDIO_INT_PROTOCOL_CODE_V1 ||\n            itf_desc->bInterfaceProtocol == AUDIO_INT_PROTOCOL_CODE_V2, 0);\n\n  // Verify 2nd interface descriptor is Audio Streaming to avoid mess with MIDI class\n  // Audio Control interface is followed by Audio Streaming interface(s)\n  // MIDI class also starts with Audio Control but is followed by MIDI Streaming\n  {\n    uint8_t const *p_desc = (uint8_t const *) itf_desc;\n    uint8_t const *p_desc_end = p_desc + max_len;\n\n    // Advance to next interface descriptor\n    p_desc = tu_desc_next(p_desc);\n    while (tu_desc_in_bounds(p_desc, p_desc_end) && tu_desc_type(p_desc) != TUSB_DESC_INTERFACE) {\n      p_desc = tu_desc_next(p_desc);\n    }\n\n    // Verify next interface is Audio Streaming (subclass 2), not MIDI Streaming (subclass 3)\n    if (p_desc_end - p_desc >= (int)sizeof(tusb_desc_interface_t)) {\n      tusb_desc_interface_t const *next_itf = (tusb_desc_interface_t const *) p_desc;\n      TU_VERIFY(next_itf->bInterfaceClass == TUSB_CLASS_AUDIO &&\n                next_itf->bInterfaceSubClass == AUDIO_SUBCLASS_STREAMING, 0);\n    } else {\n      // No further interface found or not enough bytes for interface descriptor\n      return 0;\n    }\n  }\n\n  // Verify interrupt control EP is enabled if demanded by descriptor\n  TU_ASSERT(itf_desc->bNumEndpoints <= 1, 0);// 0 or 1 EPs are allowed\n  if (itf_desc->bNumEndpoints == 1) {\n    TU_ASSERT(CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP, 0);\n  }\n\n  // Alternate setting MUST be zero - this check can be omitted\n  TU_VERIFY(itf_desc->bAlternateSetting == 0, 0);\n\n  // Find available audio driver interface\n  uint8_t i;\n  for (i = 0; i < CFG_TUD_AUDIO; i++) {\n    if (!_audiod_fct[i].p_desc) {\n      _audiod_fct[i].p_desc = (uint8_t const *) itf_desc;// Save pointer to AC descriptor which is by specification always the first one\n      _audiod_fct[i].rhport = rhport;\n\n      // Calculate descriptor length\n      {\n        uint8_t const *p_desc = (uint8_t const *) itf_desc;\n        uint8_t const *p_desc_end = p_desc + max_len;\n        uint16_t total_len = sizeof(tusb_desc_interface_t);\n        // Skip Standard AC interface descriptor\n        p_desc = tu_desc_next(p_desc);\n        while (p_desc_end - p_desc > 0) {\n          // Stop if:\n          // - Non audio streaming interface descriptor found\n          // - IAD found\n          if ((tu_desc_type(p_desc) == TUSB_DESC_INTERFACE &&\n              !(((tusb_desc_interface_t const *) p_desc)->bInterfaceClass == TUSB_CLASS_AUDIO && ((tusb_desc_interface_t const *) p_desc)->bInterfaceSubClass == AUDIO_SUBCLASS_STREAMING))\n              || tu_desc_type(p_desc) == TUSB_DESC_INTERFACE_ASSOCIATION) {\n            break;\n          } else if (tu_desc_type(p_desc) == TUSB_DESC_INTERFACE && ((tusb_desc_interface_t const *) p_desc)->bInterfaceSubClass == AUDIO_SUBCLASS_STREAMING) {\n            if (_audiod_fct[i].p_desc_as == NULL) {\n              _audiod_fct[i].p_desc_as = p_desc;\n            }\n          } else {\n            // nothing to do\n          }\n          total_len += p_desc[0];\n          p_desc = tu_desc_next(p_desc);\n        }\n        _audiod_fct[i].desc_length = total_len;\n      }\n\n#ifdef TUP_DCD_EDPT_ISO_ALLOC\n      {\n  #if CFG_TUD_AUDIO_ENABLE_EP_IN\n        uint8_t ep_in = 0;\n        uint16_t ep_in_size = 0;\n  #endif\n\n  #if CFG_TUD_AUDIO_ENABLE_EP_OUT\n        uint8_t ep_out = 0;\n        uint16_t ep_out_size = 0;\n  #endif\n\n  #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n        uint8_t ep_fb = 0;\n  #endif\n        uint8_t const *p_desc = _audiod_fct[i].p_desc;\n        uint8_t const *p_desc_end = p_desc + _audiod_fct[i].desc_length;\n        // Condition modified from p_desc < p_desc_end to prevent gcc>=12 strict-overflow warning\n        while (p_desc_end - p_desc > 0) {\n          if (tu_desc_type(p_desc) == TUSB_DESC_ENDPOINT) {\n            // Unified UAC1/UAC2 endpoint processing\n            tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) p_desc;\n            bool is_feedback_ep = false;\n            bool is_data_ep = false;\n\n            if (tud_audio_n_version(i) == 1) {\n              // UAC1: Use bRefresh field to distinguish endpoint types\n              audio10_desc_as_iso_data_ep_t const *desc_ep_uac1 = (audio10_desc_as_iso_data_ep_t const *) p_desc;\n              is_data_ep = (desc_ep_uac1->bmAttributes.sync != TUSB_ISO_EP_ATT_NO_SYNC);\n              is_feedback_ep = (desc_ep_uac1->bmAttributes.sync == TUSB_ISO_EP_ATT_NO_SYNC);\n            } else {\n              // UAC2: Use bmAttributes.usage to distinguish endpoint types\n              is_data_ep = (desc_ep->bmAttributes.usage == 0 || desc_ep->bmAttributes.usage == 2);\n              is_feedback_ep = (desc_ep->bmAttributes.usage == 1);\n            }\n\n    #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n            // Explicit feedback EP\n            if (is_feedback_ep) {\n              ep_fb = desc_ep->bEndpointAddress;\n            }\n    #else\n            (void) is_feedback_ep;\n    #endif\n    #if CFG_TUD_AUDIO_ENABLE_EP_IN\n            // Data or data with implicit feedback IN EP\n            if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN && is_data_ep) {\n              ep_in = desc_ep->bEndpointAddress;\n              ep_in_size = TU_MAX(tu_edpt_packet_size(desc_ep), ep_in_size);\n            }\n    #endif\n    #if CFG_TUD_AUDIO_ENABLE_EP_OUT\n            // Data OUT EP\n            if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_OUT && is_data_ep) {\n              ep_out = desc_ep->bEndpointAddress;\n              ep_out_size = TU_MAX(tu_edpt_packet_size(desc_ep), ep_out_size);\n            }\n    #endif\n          }\n\n          p_desc = tu_desc_next(p_desc);\n        }\n\n  #if CFG_TUD_AUDIO_ENABLE_EP_IN\n        if (ep_in != 0) {\n          usbd_edpt_iso_alloc(rhport, ep_in, ep_in_size);\n        }\n  #endif\n\n  #if CFG_TUD_AUDIO_ENABLE_EP_OUT\n        if (ep_out != 0) {\n          usbd_edpt_iso_alloc(rhport, ep_out, ep_out_size);\n        }\n  #endif\n\n  #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n        if (ep_fb != 0) {\n          usbd_edpt_iso_alloc(rhport, ep_fb, 4);\n        }\n  #endif\n      }\n#endif// TUP_DCD_EDPT_ISO_ALLOC\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n      {\n        uint8_t const *p_desc = _audiod_fct[i].p_desc;\n        uint8_t const *p_desc_end = p_desc + _audiod_fct[i].desc_length;\n        // Condition modified from p_desc < p_desc_end to prevent gcc>=12 strict-overflow warning\n        while (p_desc_end - p_desc > 0) {\n          if (tu_desc_type(p_desc) == TUSB_DESC_ENDPOINT) {\n            tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) p_desc;\n            if (desc_ep->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS) {\n              // For data or data with implicit feedback IN EP\n              // For UAC1 this is always the case since there is no usage field\n              if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN\n                  && (desc_ep->bmAttributes.usage == 0 || desc_ep->bmAttributes.usage == 2)) {\n                _audiod_fct[i].interval_tx = desc_ep->bInterval;\n              }\n            }\n          } else if (tud_audio_n_version(i) == 2 &&\n              tu_desc_type(p_desc) == TUSB_DESC_CS_INTERFACE && tu_desc_subtype(p_desc) == AUDIO20_CS_AC_INTERFACE_OUTPUT_TERMINAL) {\n              // For UAC2 only, UAC1 doesn't have a clock source\n            if (tu_unaligned_read16(p_desc + 4) == AUDIO_TERM_TYPE_USB_STREAMING) {\n              _audiod_fct[i].bclock_id_tx = p_desc[8];\n            }\n          } else {\n            // nothing to do\n          }\n          p_desc = tu_desc_next(p_desc);\n        }\n      }\n#endif// CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\n      {\n        uint8_t const *p_desc = _audiod_fct[i].p_desc;\n        uint8_t const *p_desc_end = p_desc + _audiod_fct[i].desc_length;\n        // Condition modified from p_desc < p_desc_end to prevent gcc>=12 strict-overflow warning\n        while (p_desc_end - p_desc > 0) {\n          // For each endpoint\n          if (tu_desc_type(p_desc) == TUSB_DESC_ENDPOINT) {\n            tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) p_desc;\n            uint8_t const ep_addr = desc_ep->bEndpointAddress;\n            // If endpoint is input-direction and interrupt-type\n            if (tu_edpt_dir(ep_addr) == TUSB_DIR_IN && desc_ep->bmAttributes.xfer == TUSB_XFER_INTERRUPT) {\n              // Store endpoint number and open endpoint\n              _audiod_fct[i].ep_int = ep_addr;\n              TU_ASSERT(usbd_edpt_open(_audiod_fct[i].rhport, desc_ep));\n            }\n          }\n          p_desc = tu_desc_next(p_desc);\n        }\n      }\n#endif\n\n      _audiod_fct[i].mounted = true;\n      break;\n    }\n  }\n\n  // Verify we found a free one\n  TU_ASSERT(i < CFG_TUD_AUDIO);\n\n  // This is all we need so far - the EPs are setup by a later set_interface request (as per UAC2 specification)\n  uint16_t drv_len = _audiod_fct[i].desc_length;\n\n  return drv_len;\n}\n\nstatic bool audiod_get_interface(uint8_t rhport, tusb_control_request_t const *p_request) {\n  uint8_t const itf = tu_u16_low(p_request->wIndex);\n\n  // Find index of audio streaming interface\n  uint8_t func_id;\n  TU_VERIFY(audiod_verify_itf_exists(itf, &func_id));\n\n  // Default to 0 if interface not yet activated\n  uint8_t alt = 0;\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n  if (_audiod_fct[func_id].ep_in_as_intf_num == itf) {\n    alt = _audiod_fct[func_id].ep_in_alt;\n  }\n#endif\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n  if (_audiod_fct[func_id].ep_out_as_intf_num == itf) {\n    alt = _audiod_fct[func_id].ep_out_alt;\n  }\n#endif\n\n  TU_VERIFY(tud_control_xfer(rhport, p_request, &alt, 1));\n\n  TU_LOG2(\"  Get itf: %u - current alt: %u\\r\\n\", itf, alt);\n\n  return true;\n}\n\nstatic bool audiod_set_interface(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Here we need to do the following:\n\n  // 1. Find the audio driver assigned to the given interface to be set\n  // Since one audio driver interface has to be able to cover an unknown number of interfaces (AC, AS + its alternate settings), the best memory efficient way to solve this is to always search through the descriptors.\n  // The audio driver is mapped to an audio function by a reference pointer to the corresponding AC interface of this audio function which serves as a starting point for searching\n\n  // 2. Close EPs which are currently open\n  // To do so it is not necessary to know the current active alternate interface since we already save the current EP addresses - we simply close them\n\n  // 3. Open new EP\n\n  uint8_t const itf = tu_u16_low(p_request->wIndex);\n  uint8_t const alt = tu_u16_low(p_request->wValue);\n\n  TU_LOG2(\"  Set itf: %u - alt: %u\\r\\n\", itf, alt);\n\n  // Find index of audio streaming interface and index of interface\n  uint8_t func_id;\n  TU_VERIFY(audiod_verify_itf_exists(itf, &func_id));\n\n  audiod_function_t *audio = &_audiod_fct[func_id];\n\n// Look if there is an EP to be closed - for this driver, there are only 3 possible EPs which may be closed (only AS related EPs can be closed, AC EP (if present) is always open)\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n  if (audio->ep_in_as_intf_num == itf) {\n    audio->ep_in_as_intf_num = 0;\n    audio->ep_in_alt = 0;\n  #ifndef TUP_DCD_EDPT_ISO_ALLOC\n    usbd_edpt_close(rhport, audio->ep_in);\n  #endif\n\n    // Clear FIFOs, since data is no longer valid\n    tu_fifo_clear(&audio->ep_in_ff);\n\n    // Invoke callback - can be used to stop data sampling\n    TU_VERIFY(tud_audio_set_itf_close_ep_cb(rhport, p_request));\n\n    audio->ep_in = 0;// Necessary?\n\n  #if CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n    audio->packet_sz_tx[0] = 0;\n    audio->packet_sz_tx[1] = 0;\n    audio->packet_sz_tx[2] = 0;\n  #endif\n  }\n#endif// CFG_TUD_AUDIO_ENABLE_EP_IN\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n  if (audio->ep_out_as_intf_num == itf) {\n    audio->ep_out_as_intf_num = 0;\n    audio->ep_out_alt = 0;\n  #ifndef TUP_DCD_EDPT_ISO_ALLOC\n    usbd_edpt_close(rhport, audio->ep_out);\n  #endif\n\n    // Clear FIFOs, since data is no longer valid\n    tu_fifo_clear(&audio->ep_out_ff);\n\n    // Invoke callback - can be used to stop data sampling\n    TU_VERIFY(tud_audio_set_itf_close_ep_cb(rhport, p_request));\n\n    audio->ep_out = 0;// Necessary?\n\n    // Close corresponding feedback EP\n  #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n    #ifndef TUP_DCD_EDPT_ISO_ALLOC\n    usbd_edpt_close(rhport, audio->ep_fb);\n    #endif\n    audio->ep_fb = 0;\n    tu_memclr(&audio->feedback, sizeof(audio->feedback));\n  #endif\n  }\n#endif// CFG_TUD_AUDIO_ENABLE_EP_OUT\n\n  // Open new EP if necessary - EPs are only to be closed or opened for AS interfaces - Look for AS interface with correct alternate interface\n\n  uint8_t const *p_desc = audio->p_desc_as;\n  // Get pointer at end\n  uint8_t const *p_desc_end = audio->p_desc + audio->desc_length;\n\n  // p_desc starts at required interface with alternate setting zero\n  // Condition modified from p_desc < p_desc_end to prevent gcc>=12 strict-overflow warning\n  while (p_desc_end - p_desc > 0) {\n    // Find correct interface\n    if (tu_desc_type(p_desc) == TUSB_DESC_INTERFACE && ((tusb_desc_interface_t const *) p_desc)->bInterfaceNumber == itf && ((tusb_desc_interface_t const *) p_desc)->bAlternateSetting == alt) {\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n      uint8_t const *p_desc_parse_for_params = p_desc;\n#endif\n      // From this point forward follow the EP descriptors associated to the current alternate setting interface - Open EPs if necessary\n      uint8_t foundEPs = 0, nEps = ((tusb_desc_interface_t const *) p_desc)->bNumEndpoints;\n      // Condition modified from p_desc < p_desc_end to prevent gcc>=12 strict-overflow warning\n      while (foundEPs < nEps && (p_desc_end - p_desc > 0)) {\n        if (tu_desc_type(p_desc) == TUSB_DESC_ENDPOINT) {\n          tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) p_desc;\n#ifdef TUP_DCD_EDPT_ISO_ALLOC\n          TU_ASSERT(usbd_edpt_iso_activate(rhport, desc_ep));\n#else\n          TU_ASSERT(usbd_edpt_open(rhport, desc_ep));\n#endif\n          uint8_t const ep_addr = desc_ep->bEndpointAddress;\n\n          bool is_feedback_ep = false;\n          bool is_data_ep = false;\n\n          if (tud_audio_n_version(func_id) == 1) {\n            // UAC1: Use bRefresh field to distinguish endpoint types\n            audio10_desc_as_iso_data_ep_t const *desc_ep_uac1 = (audio10_desc_as_iso_data_ep_t const *) p_desc;\n            is_data_ep = (desc_ep_uac1->bmAttributes.sync != TUSB_ISO_EP_ATT_NO_SYNC);\n            is_feedback_ep = (desc_ep_uac1->bmAttributes.sync == TUSB_ISO_EP_ATT_NO_SYNC);\n          } else {\n            // UAC2: Use bmAttributes.usage to distinguish endpoint types\n            is_data_ep = (desc_ep->bmAttributes.usage == 0 || desc_ep->bmAttributes.usage == 2);\n            is_feedback_ep = (desc_ep->bmAttributes.usage == 1);\n          }\n\n          //TODO: We need to set EP non busy since this is not taken care of right now in ep_close() - THIS IS A WORKAROUND!\n          usbd_edpt_clear_stall(rhport, ep_addr);\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n          // For data or data with implicit feedback IN EP\n          if (tu_edpt_dir(ep_addr) == TUSB_DIR_IN && is_data_ep)\n          {\n            // Save address\n            audio->ep_in = ep_addr;\n            audio->ep_in_as_intf_num = itf;\n            audio->ep_in_alt = alt;\n            audio->ep_in_sz = tu_edpt_packet_size(desc_ep);\n            // Set the default EP IN FIFO threshold to half fifo depth.\n            audio->ep_in_fifo_threshold = audio->ep_in_ff.depth / 2;\n\n            // If flow control is enabled, parse for the corresponding parameters - doing this here means only AS interfaces with EPs get scanned for parameters\n  #if  CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n            audiod_parse_flow_control_params(audio, p_desc_parse_for_params);\n  #endif\n            // Schedule first transmit if alternate interface is not zero, as sample data is available a ZLP is loaded\n  #if !CFG_TUD_EDPT_DEDICATED_HWFIFO\n            TU_VERIFY(usbd_edpt_xfer(rhport, audio->ep_in, audio->lin_buf_in, 0, false));\n  #else\n            // Send everything in ISO EP FIFO\n            TU_VERIFY(usbd_edpt_xfer_fifo(rhport, audio->ep_in, &audio->ep_in_ff, 0, false));\n  #endif\n          }\n#endif// CFG_TUD_AUDIO_ENABLE_EP_IN\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n          // Checking usage not necessary\n          if (tu_edpt_dir(ep_addr) == TUSB_DIR_OUT && is_data_ep) {\n            // Save address\n            audio->ep_out = ep_addr;\n            audio->ep_out_as_intf_num = itf;\n            audio->ep_out_alt = alt;\n            audio->ep_out_sz = tu_edpt_packet_size(desc_ep);\n\n            // Prepare for incoming data\n  #if !CFG_TUD_EDPT_DEDICATED_HWFIFO\n            TU_VERIFY(usbd_edpt_xfer(rhport, audio->ep_out, audio->lin_buf_out, audio->ep_out_sz, false));\n  #else\n            TU_VERIFY(usbd_edpt_xfer_fifo(rhport, audio->ep_out, &audio->ep_out_ff, audio->ep_out_sz, false));\n  #endif\n          }\n\n  #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n          // Check if usage is explicit data feedback\n          if (is_feedback_ep) {\n            audio->ep_fb = ep_addr;\n            audio->feedback.frame_shift = desc_ep->bInterval - 1;\n            // Schedule first feedback transmit\n            audiod_fb_send(func_id, false);\n          }\n  #else\n          (void) is_feedback_ep;\n  #endif\n#else\n        (void) is_feedback_ep;\n#endif// CFG_TUD_AUDIO_ENABLE_EP_OUT\n\n          foundEPs += 1;\n        }\n        p_desc = tu_desc_next(p_desc);\n      }\n\n      TU_VERIFY(foundEPs == nEps);\n\n      // Invoke one callback for a final set interface\n      TU_VERIFY(tud_audio_set_itf_cb(rhport, p_request));\n\n#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n      // Prepare feedback computation parameters\n      TU_VERIFY(audiod_fb_params_prepare(func_id, alt));\n#endif// CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n\n      // We are done - abort loop\n      break;\n    }\n\n    // Moving forward\n    p_desc = tu_desc_next(p_desc);\n  }\n\n#if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n  // Disable SOF interrupt if no driver has any enabled feedback EP\n  bool enable_sof = false;\n  for (uint8_t i = 0; i < CFG_TUD_AUDIO; i++) {\n    if (_audiod_fct[i].ep_fb != 0 &&\n        (_audiod_fct[i].feedback.compute_method == AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED ||\n         _audiod_fct[i].feedback.compute_method == AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT ||\n         _audiod_fct[i].feedback.compute_method == AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2)) {\n      enable_sof = true;\n      break;\n    }\n  }\n  usbd_sof_enable(rhport, SOF_CONSUMER_AUDIO, enable_sof);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n  audiod_calc_tx_packet_sz(audio);\n#endif\n\n  tud_control_status(rhport, p_request);\n\n  return true;\n}\n\n// Invoked when class request DATA stage is finished.\n// return false to stall control EP (e.g Host send non-sense DATA)\nstatic bool audiod_control_complete(uint8_t rhport, tusb_control_request_t const *p_request) {\n  // Handle audio class specific set requests\n  if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS && p_request->bmRequestType_bit.direction == TUSB_DIR_OUT) {\n    uint8_t func_id;\n\n    switch (p_request->bmRequestType_bit.recipient) {\n      case TUSB_REQ_RCPT_INTERFACE: {\n        uint8_t itf = TU_U16_LOW(p_request->wIndex);\n        uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n        if (entityID != 0) {\n          // Check if entity is present and get corresponding driver index\n          TU_VERIFY(audiod_verify_entity_exists(itf, entityID, &func_id));\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n          if (tud_audio_n_version(func_id) == 2) {\n            uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n            if (_audiod_fct[func_id].bclock_id_tx == entityID && ctrlSel == AUDIO20_CS_CTRL_SAM_FREQ && p_request->bRequest == AUDIO20_CS_REQ_CUR) {\n              _audiod_fct[func_id].sample_rate_tx = tu_unaligned_read32(get_ctrl_buffer());\n              audiod_calc_tx_packet_sz(&_audiod_fct[func_id]);\n            }\n          }\n#endif\n\n          // Invoke callback\n          return tud_audio_set_req_entity_cb(rhport, p_request, get_ctrl_buffer());\n        } else {\n          // Find index of audio driver structure and verify interface really exists\n          TU_VERIFY(audiod_verify_itf_exists(itf, &func_id));\n\n          // Invoke callback\n          return tud_audio_set_req_itf_cb(rhport, p_request, get_ctrl_buffer());\n        }\n      } break;\n\n      case TUSB_REQ_RCPT_ENDPOINT: {\n        uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n        // Check if entity is present and get corresponding driver index\n        TU_VERIFY(audiod_verify_ep_exists(ep, &func_id));\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n          if (tud_audio_n_version(func_id) == 1) {\n            if (_audiod_fct[func_id].ep_in == ep) {\n              uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n              if (ctrlSel == AUDIO10_EP_CTRL_SAMPLING_FREQ && p_request->bRequest == AUDIO10_CS_REQ_SET_CUR) {\n                _audiod_fct[func_id].sample_rate_tx = tu_unaligned_read32(get_ctrl_buffer()) & 0x00FFFFFF;\n                audiod_calc_tx_packet_sz(&_audiod_fct[func_id]);\n              }\n            }\n          }\n#endif\n\n          // Invoke callback\n          bool ret = tud_audio_set_req_ep_cb(rhport, p_request, get_ctrl_buffer());\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n          if (ret && tud_audio_n_version(func_id) == 1) {\n            if (_audiod_fct[func_id].ep_out == ep) {\n              uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n              if (ctrlSel == AUDIO10_EP_CTRL_SAMPLING_FREQ && p_request->bRequest == AUDIO10_CS_REQ_SET_CUR) {\n                audiod_fb_params_prepare(func_id, _audiod_fct[func_id].ep_out_alt);\n              }\n            }\n          }\n#endif\n        return ret;\n      } break;\n      // Unknown/Unsupported recipient\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n  return true;\n}\n\n// Handle class control request\n// return false to stall control endpoint (e.g unsupported request)\nstatic bool audiod_control_request(uint8_t rhport, tusb_control_request_t const *p_request) {\n  (void) rhport;\n\n  // Handle standard requests - standard set requests usually have no data stage so we also handle set requests here\n  if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) {\n    switch (p_request->bRequest) {\n      case TUSB_REQ_GET_INTERFACE:\n        return audiod_get_interface(rhport, p_request);\n\n      case TUSB_REQ_SET_INTERFACE:\n        return audiod_set_interface(rhport, p_request);\n\n      case TUSB_REQ_CLEAR_FEATURE:\n        return true;\n\n      // Unknown/Unsupported request\n      default:\n        TU_BREAKPOINT();\n        return false;\n    }\n  }\n\n  // Handle class requests\n  if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS) {\n    uint8_t itf = TU_U16_LOW(p_request->wIndex);\n    uint8_t func_id;\n\n    // Conduct checks which depend on the recipient\n    switch (p_request->bmRequestType_bit.recipient) {\n      case TUSB_REQ_RCPT_INTERFACE: {\n        uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n        // Verify if entity is present\n        if (entityID != 0) {\n          // Find index of audio driver structure and verify entity really exists\n          TU_VERIFY(audiod_verify_entity_exists(itf, entityID, &func_id));\n\n          // In case we got a get request invoke callback - callback needs to answer as defined in UAC2 specification page 89 - 5. Requests\n          if (p_request->bmRequestType_bit.direction == TUSB_DIR_IN) {\n            return tud_audio_get_req_entity_cb(rhport, p_request);\n          }\n        } else {\n          // Find index of audio driver structure and verify interface really exists\n          TU_VERIFY(audiod_verify_itf_exists(itf, &func_id));\n\n          // In case we got a get request invoke callback - callback needs to answer as defined in UAC2 specification page 89 - 5. Requests\n          if (p_request->bmRequestType_bit.direction == TUSB_DIR_IN) {\n            return tud_audio_get_req_itf_cb(rhport, p_request);\n          }\n        }\n      } break;\n\n      case TUSB_REQ_RCPT_ENDPOINT: {\n        uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n        // Find index of audio driver structure and verify EP really exists\n        TU_VERIFY(audiod_verify_ep_exists(ep, &func_id));\n\n        // In case we got a get request invoke callback - callback needs to answer as defined in UAC2 specification page 89 - 5. Requests\n        if (p_request->bmRequestType_bit.direction == TUSB_DIR_IN) {\n          return tud_audio_get_req_ep_cb(rhport, p_request);\n        }\n      } break;\n\n      // Unknown/Unsupported recipient\n      default:\n        TU_LOG2(\"  Unsupported recipient: %d\\r\\n\", p_request->bmRequestType_bit.recipient);\n        TU_BREAKPOINT();\n        return false;\n    }\n\n    // If we end here, the received request is a set request - we schedule a receive for the data stage and return true here. We handle the rest later in audiod_control_complete() once the data stage was finished\n    TU_VERIFY(tud_control_xfer(rhport, p_request, get_ctrl_buffer(), CFG_TUD_AUDIO_CTRL_BUF_SZ));\n    return true;\n  }\n\n  // There went something wrong - unsupported control request type\n  TU_BREAKPOINT();\n  return false;\n}\n\nbool audiod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request) {\n  if (stage == CONTROL_STAGE_SETUP) {\n    return audiod_control_request(rhport, request);\n  } else if (stage == CONTROL_STAGE_DATA) {\n    return audiod_control_complete(rhport, request);\n  } else {\n    // nothing to do\n  }\n\n  return true;\n}\n\nbool audiod_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void) result;\n  (void) xferred_bytes;\n\n  #if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\n  // Search for interface belonging to given end point address and proceed as required\n  for (uint8_t func_id = 0; func_id < CFG_TUD_AUDIO; func_id++) {\n    audiod_function_t *audio = &_audiod_fct[func_id];\n\n    // Data transmission of control interrupt finished\n    if (audio->ep_int == ep_addr) {\n      // According to USB2 specification, maximum payload of interrupt EP is 8 bytes on low speed, 64 bytes on full speed, and 1024 bytes on high speed (but only if an alternate interface other than 0 is used - see specification p. 49)\n      // In case there is nothing to send we have to return a NAK - this is taken care of by PHY ???\n      // In case of an erroneous transmission a retransmission is conducted - this is taken care of by PHY ???\n\n      // I assume here, that things above are handled by PHY\n      // All transmission is done - what remains to do is to inform job was completed\n\n      tud_audio_int_done_cb(rhport);\n      return true;\n    }\n\n  }\n  #else\n  (void) rhport;\n  (void) ep_addr;\n  #endif\n\n  return false;\n}\n\nbool audiod_xfer_isr(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void) result;\n  (void) xferred_bytes;\n\n  // Search for interface belonging to given end point address and proceed as required\n  for (uint8_t func_id = 0; func_id < CFG_TUD_AUDIO; func_id++)\n  {\n    audiod_function_t* audio = &_audiod_fct[func_id];\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n\n    // Data transmission of audio packet finished\n    if (audio->ep_in == ep_addr) {\n      // USB 2.0, section 5.6.4, third paragraph, states \"An isochronous endpoint must specify its required bus access period. However, an isochronous endpoint must be prepared to handle poll rates faster than the one specified.\"\n      // That paragraph goes on to say \"An isochronous IN endpoint must return a zero-length packet whenever data is requested at a faster interval than the specified interval and data is not available.\"\n      // This can only be solved reliably if we load a ZLP after every IN transmission since we can not say if the host requests samples earlier than we declared! Once all samples are collected we overwrite the loaded ZLP.\n\n      // Check if there is data to load into EPs buffer - if not load it with ZLP\n      // Be aware - we as a device are not able to know if the host polls for data with a faster rate as we stated this in the descriptors. Therefore we always have to put something into the EPs buffer. However, once we did that, there is no way of aborting this or replacing what we put into the buffer before!\n      // This is the only place where we can fill something into the EPs buffer!\n\n      // Load new data\n      audiod_tx_xfer_isr(rhport, audio, (uint16_t) xferred_bytes);\n      return true;\n    }\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n    // New audio packet received\n    if (audio->ep_out == ep_addr) {\n      audiod_rx_xfer_isr(rhport, audio, (uint16_t) xferred_bytes);\n      return true;\n    }\n  #if CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n    // Transmission of feedback EP finished\n    if (audio->ep_fb == ep_addr) {\n      // Schedule a transmit with the new value if EP is not busy\n      // Schedule next transmission - value is changed bytud_audio_n_fb_set() in the meantime or the old value gets sent\n      audiod_fb_send(func_id, true);\n      return true;\n    }\n  #endif\n#endif\n  }\n\n  return false;\n}\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n\nstatic bool audiod_fb_params_prepare(uint8_t func_id, uint8_t alt) {\n  audiod_function_t *audio = &_audiod_fct[func_id];\n\n  // Prepare feedback computation if endpoint is available\n  if (audio->ep_fb != 0) {\n    audio_feedback_params_t fb_param = {0};\n\n    tud_audio_feedback_params_cb(func_id, alt, &fb_param);\n    audio->feedback.compute_method = fb_param.method;\n\n    // Minimal/Maximum value in 16.16 format for full speed (1ms per frame) or high speed (125 us per frame)\n    uint32_t const frame_div = (TUSB_SPEED_FULL == tud_speed_get()) ? 1000 : 8000;\n    audio->feedback.min_value = ((fb_param.sample_freq - 1) / frame_div) << 16;\n    audio->feedback.max_value = (fb_param.sample_freq / frame_div + 1) << 16;\n\n    switch (fb_param.method) {\n      case AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED:\n      case AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT:\n      case AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2: {\n        // Check if frame interval is within sane limits\n        // The interval value n_frames was taken from the descriptors within audiod_set_interface()\n\n        // n_frames_min is ceil(2^10 * f_s / f_m) for full speed and ceil(2^13 * f_s / f_m) for high speed\n        // this lower limit ensures the measures feedback value has sufficient precision\n        uint32_t const k = (TUSB_SPEED_FULL == tud_speed_get()) ? 10 : 13;\n        uint32_t const n_frame = (1UL << audio->feedback.frame_shift);\n\n        if ((((1UL << k) * fb_param.sample_freq / fb_param.frequency.mclk_freq) + 1) > n_frame) {\n          TU_LOG1(\"  UAC2 feedback interval too small\\r\\n\");\n          TU_BREAKPOINT();\n          return false;\n        }\n\n        // Check if parameters really allow for a power of two division\n        if ((fb_param.frequency.mclk_freq % fb_param.sample_freq) == 0 && tu_is_power_of_two(fb_param.frequency.mclk_freq / fb_param.sample_freq)) {\n          audio->feedback.compute_method = AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2;\n          audio->feedback.compute.power_of_2 = (uint8_t) (16 - (audio->feedback.frame_shift - 1) - tu_log2(fb_param.frequency.mclk_freq / fb_param.sample_freq));\n        } else if (audio->feedback.compute_method == AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT) {\n          audio->feedback.compute.float_const = (float) fb_param.sample_freq / (float) fb_param.frequency.mclk_freq * (1UL << (16 - (audio->feedback.frame_shift - 1)));\n        } else {\n          audio->feedback.compute.fixed.sample_freq = fb_param.sample_freq;\n          audio->feedback.compute.fixed.mclk_freq = fb_param.frequency.mclk_freq;\n        }\n      } break;\n\n      case AUDIO_FEEDBACK_METHOD_FIFO_COUNT: {\n        // Determine FIFO threshold\n        uint16_t fifo_threshold = fb_param.fifo_count.fifo_threshold ? fb_param.fifo_count.fifo_threshold : tu_fifo_depth(&audio->ep_out_ff) / 2;\n        audio->feedback.compute.fifo_count.fifo_lvl_thr = fifo_threshold;\n        audio->feedback.compute.fifo_count.fifo_lvl_avg = ((uint32_t) fifo_threshold) << 16;\n        // Avoid 64bit division\n        uint32_t nominal = ((fb_param.sample_freq / 100) << 16) / (frame_div / 100);\n        audio->feedback.compute.fifo_count.nom_value = nominal;\n        audio->feedback.compute.fifo_count.rate_const[0] = (uint16_t) ((audio->feedback.max_value - nominal) / fifo_threshold);\n        audio->feedback.compute.fifo_count.rate_const[1] = (uint16_t) ((nominal - audio->feedback.min_value) / fifo_threshold);\n        // On HS feedback is more sensitive since packet size can vary every MSOF, could cause instability\n        if (tud_speed_get() == TUSB_SPEED_HIGH) {\n          audio->feedback.compute.fifo_count.rate_const[0] /= 8;\n          audio->feedback.compute.fifo_count.rate_const[1] /= 8;\n        }\n      } break;\n\n      // nothing to do\n      default:\n        break;\n    }\n  }\n\n  return true;\n}\n\nstatic void audiod_fb_fifo_count_update(audiod_function_t *audio, uint16_t lvl_new) {\n  /* Low-pass (averaging) filter */\n  uint32_t lvl = audio->feedback.compute.fifo_count.fifo_lvl_avg;\n  lvl = (uint32_t) (((uint64_t) lvl * 63 + ((uint32_t) lvl_new << 16)) >> 6);\n  audio->feedback.compute.fifo_count.fifo_lvl_avg = lvl;\n\n  uint32_t const ff_lvl = lvl >> 16;\n  uint16_t const ff_thr = audio->feedback.compute.fifo_count.fifo_lvl_thr;\n  uint16_t const *rate = audio->feedback.compute.fifo_count.rate_const;\n\n  uint32_t feedback;\n\n  if (ff_lvl < ff_thr) {\n    feedback = audio->feedback.compute.fifo_count.nom_value + (ff_thr - ff_lvl) * rate[0];\n  } else {\n    feedback = audio->feedback.compute.fifo_count.nom_value - (ff_lvl - ff_thr) * rate[1];\n  }\n\n  if (feedback > audio->feedback.max_value) {\n    feedback = audio->feedback.max_value;\n  }\n  if (feedback < audio->feedback.min_value) {\n    feedback = audio->feedback.min_value;\n  }\n  audio->feedback.value = feedback;\n}\n\n#endif\n\nTU_ATTR_FAST_FUNC void audiod_sof_isr(uint8_t rhport, uint32_t frame_count) {\n  (void) rhport;\n  (void) frame_count;\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n  // Determine feedback value - The feedback method is described in 5.12.4.2 of the USB 2.0 spec\n  // Boiled down, the feedback value Ff = n_samples / (micro)frame.\n  // Since an accuracy of less than 1 Sample / second is desired, at least n_frames = ceil(2^K * f_s / f_m) frames need to be measured, where K = 10 for full speed and K = 13 for high speed, f_s is the sampling frequency e.g. 48 kHz and f_m is the cpu clock frequency e.g. 100 MHz (or any other master clock whose clock count is available and locked to f_s)\n  // The update interval in the (4.10.2.1) Feedback Endpoint Descriptor must be less or equal to 2^(K - P), where P = min( ceil(log2(f_m / f_s)), K)\n  // feedback = n_cycles / n_frames * f_s / f_m in 16.16 format, where n_cycles are the number of main clock cycles within fb_n_frames\n\n  // Iterate over audio functions and set feedback value\n  for (uint8_t i = 0; i < CFG_TUD_AUDIO; i++) {\n    audiod_function_t *audio = &_audiod_fct[i];\n\n    if (audio->ep_fb != 0) {\n      // HS shift need to be adjusted since SOF event is generated for frame only\n      uint8_t const hs_adjust = (TUSB_SPEED_HIGH == tud_speed_get()) ? 3 : 0;\n      uint32_t const interval = 1UL << (audio->feedback.frame_shift - hs_adjust);\n      if (0 == (frame_count & (interval - 1))) {\n        tud_audio_feedback_interval_isr(i, frame_count, audio->feedback.frame_shift);\n      }\n    }\n  }\n#endif// CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n}\n\nbool tud_audio_buffer_and_schedule_control_xfer(uint8_t rhport, tusb_control_request_t const *p_request, void *data, uint16_t len) {\n  // Handles only sending of data not receiving\n  if (p_request->bmRequestType_bit.direction == TUSB_DIR_OUT) return false;\n\n  // Get corresponding driver index\n  uint8_t func_id;\n  uint8_t itf = TU_U16_LOW(p_request->wIndex);\n\n  // Conduct checks which depend on the recipient\n  switch (p_request->bmRequestType_bit.recipient) {\n    case TUSB_REQ_RCPT_INTERFACE: {\n      uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n\n      // Verify if entity is present\n      if (entityID != 0) {\n        // Find index of audio driver structure and verify entity really exists\n        TU_VERIFY(audiod_verify_entity_exists(itf, entityID, &func_id));\n      } else {\n        // Find index of audio driver structure and verify interface really exists\n        TU_VERIFY(audiod_verify_itf_exists(itf, &func_id));\n      }\n    } break;\n\n    case TUSB_REQ_RCPT_ENDPOINT: {\n      uint8_t ep = TU_U16_LOW(p_request->wIndex);\n\n      // Find index of audio driver structure and verify EP really exists\n      TU_VERIFY(audiod_verify_ep_exists(ep, &func_id));\n    } break;\n\n    // Unknown/Unsupported recipient\n    default:\n      TU_LOG2(\"  Unsupported recipient: %d\\r\\n\", p_request->bmRequestType_bit.recipient);\n      TU_BREAKPOINT();\n      return false;\n  }\n\n  // Copy into buffer\n  TU_VERIFY(0 == tu_memcpy_s(get_ctrl_buffer(), CFG_TUD_AUDIO_CTRL_BUF_SZ, data, (size_t) len));\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n  if (tud_audio_n_version(func_id) == 2) {\n    // Find data for sampling_frequency_control\n    if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS && p_request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE) {\n      uint8_t entityID = TU_U16_HIGH(p_request->wIndex);\n      uint8_t ctrlSel = TU_U16_HIGH(p_request->wValue);\n      if (_audiod_fct[func_id].bclock_id_tx == entityID && ctrlSel == AUDIO20_CS_CTRL_SAM_FREQ && p_request->bRequest == AUDIO20_CS_REQ_CUR) {\n        _audiod_fct[func_id].sample_rate_tx = tu_unaligned_read32(get_ctrl_buffer());\n        audiod_calc_tx_packet_sz(&_audiod_fct[func_id]);\n      }\n    }\n  }\n#endif\n\n  // Schedule transmit\n  return tud_control_xfer(rhport, p_request, get_ctrl_buffer(), len);\n}\n\n// Verify an entity with the given ID exists and returns also the corresponding driver index\nstatic bool audiod_verify_entity_exists(uint8_t itf, uint8_t entityID, uint8_t *func_id) {\n  uint8_t i;\n  for (i = 0; i < CFG_TUD_AUDIO; i++) {\n    // Look for the correct driver by checking if the unique standard AC interface number fits\n    if (_audiod_fct[i].p_desc && ((tusb_desc_interface_t const *) _audiod_fct[i].p_desc)->bInterfaceNumber == itf) {\n      // Get pointers after class specific AC descriptors and end of AC descriptors - entities are defined in between\n      uint8_t const *p_desc = tu_desc_next(_audiod_fct[i].p_desc);// Points to CS AC descriptor\n      p_desc = tu_desc_next(p_desc);// Get past CS AC descriptor\n\n      while (_audiod_fct[i].p_desc_as - p_desc > 0) {\n        // Entity IDs are always at offset 3\n        if (p_desc[3] == entityID) {\n          *func_id = i;\n          return true;\n        }\n        p_desc = tu_desc_next(p_desc);\n      }\n    }\n  }\n  return false;\n}\n\nstatic bool audiod_verify_itf_exists(uint8_t itf, uint8_t *func_id) {\n  uint8_t i;\n  for (i = 0; i < CFG_TUD_AUDIO; i++) {\n    if (_audiod_fct[i].p_desc != NULL) {\n      // Get pointer at beginning and end\n      uint8_t const *p_desc = _audiod_fct[i].p_desc;\n      uint8_t const *p_desc_end = _audiod_fct[i].p_desc + _audiod_fct[i].desc_length;\n      // Condition modified from p_desc < p_desc_end to prevent gcc>=12 strict-overflow warning\n      while (p_desc_end - p_desc > 0) {\n        if (tu_desc_type(p_desc) == TUSB_DESC_INTERFACE && ((tusb_desc_interface_t const *)p_desc)->bInterfaceNumber == itf) {\n          *func_id = i;\n          return true;\n        }\n        p_desc = tu_desc_next(p_desc);\n      }\n    }\n  }\n  return false;\n}\n\nstatic bool audiod_verify_ep_exists(uint8_t ep, uint8_t *func_id) {\n  uint8_t i;\n  for (i = 0; i < CFG_TUD_AUDIO; i++) {\n    if (_audiod_fct[i].p_desc) {\n      // Get pointer at end\n      uint8_t const *p_desc_end = _audiod_fct[i].p_desc + _audiod_fct[i].desc_length;\n\n      // Advance past AC descriptors - EP we look for are streaming EPs\n      uint8_t const *p_desc = _audiod_fct[i].p_desc_as;\n\n      // Condition modified from p_desc < p_desc_end to prevent gcc>=12 strict-overflow warning\n      while (p_desc_end - p_desc > 0) {\n        if (tu_desc_type(p_desc) == TUSB_DESC_ENDPOINT && ((tusb_desc_endpoint_t const *) p_desc)->bEndpointAddress == ep) {\n          *func_id = i;\n          return true;\n        }\n        p_desc = tu_desc_next(p_desc);\n      }\n    }\n  }\n  return false;\n}\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\nstatic void audiod_parse_flow_control_params(audiod_function_t *audio, uint8_t const *p_desc) {\n\n  p_desc = tu_desc_next(p_desc);// Exclude standard AS interface descriptor of current alternate interface descriptor\n\n  if (tud_audio_n_version(audiod_get_audio_fct_idx(audio)) == 1) {\n    p_desc = tu_desc_next(p_desc);// Exclude Class-Specific AS Interface Descriptor(4.5.2) to get to format type descriptor\n    if (tu_desc_type(p_desc) == TUSB_DESC_CS_INTERFACE && tu_desc_subtype(p_desc) == AUDIO10_CS_AS_INTERFACE_FORMAT_TYPE) {\n      audio->format_type_tx = ((audio10_desc_type_I_format_n_t(1) const *) p_desc)->bFormatType;\n      if (audio->format_type_tx == AUDIO10_FORMAT_TYPE_I) {\n        audio->n_channels_tx = ((audio10_desc_type_I_format_n_t(1) const *) p_desc)->bNrChannels;\n        audio->n_bytes_per_sample_tx = ((audio10_desc_type_I_format_n_t(1) const *) p_desc)->bSubFrameSize;\n        // Save sample rate - needed when EP doesn't support setting sample rate\n        audio->sample_rate_tx = tu_unaligned_read32(((audio10_desc_type_I_format_n_t(1) const *) p_desc)->tSamFreq) & 0x00FFFFFF;\n      }\n    }\n  } else {\n    // Look for a Class-Specific AS Interface Descriptor(4.9.2) to verify format type and format and also to get number of physical channels\n    if (tu_desc_type(p_desc) == TUSB_DESC_CS_INTERFACE && tu_desc_subtype(p_desc) == AUDIO20_CS_AS_INTERFACE_AS_GENERAL) {\n      audio->n_channels_tx = ((audio20_desc_cs_as_interface_t const *) p_desc)->bNrChannels;\n      audio->format_type_tx = ((audio20_desc_cs_as_interface_t const *) p_desc)->bFormatType;\n      // Look for a Type I Format Type Descriptor(2.3.1.6 - Audio Formats)\n      p_desc = tu_desc_next(p_desc);\n      if (tu_desc_type(p_desc) == TUSB_DESC_CS_INTERFACE && tu_desc_subtype(p_desc) == AUDIO20_CS_AS_INTERFACE_FORMAT_TYPE && ((audio20_desc_type_I_format_t const *) p_desc)->bFormatType == AUDIO20_FORMAT_TYPE_I) {\n        audio->n_bytes_per_sample_tx = ((audio20_desc_type_I_format_t const *) p_desc)->bSubslotSize;\n      }\n    }\n  }\n}\n\nstatic bool audiod_calc_tx_packet_sz(audiod_function_t *audio) {\n  // AUDIO20_FORMAT_TYPE_I = AUDIO10_FORMAT_TYPE_I\n  TU_VERIFY(audio->format_type_tx == AUDIO20_FORMAT_TYPE_I);\n  TU_VERIFY(audio->n_channels_tx);\n  TU_VERIFY(audio->n_bytes_per_sample_tx);\n  TU_VERIFY(audio->interval_tx);\n  TU_VERIFY(audio->sample_rate_tx);\n\n  const uint8_t interval = (tud_speed_get() == TUSB_SPEED_FULL) ? audio->interval_tx : 1 << (audio->interval_tx - 1);\n\n  const uint16_t sample_normimal = (uint16_t) (audio->sample_rate_tx * interval / ((tud_speed_get() == TUSB_SPEED_FULL) ? 1000 : 8000));\n  const uint16_t sample_reminder = (uint16_t) (audio->sample_rate_tx * interval % ((tud_speed_get() == TUSB_SPEED_FULL) ? 1000 : 8000));\n\n  const uint16_t packet_sz_tx_min = (uint16_t) ((sample_normimal - 1) * audio->n_channels_tx * audio->n_bytes_per_sample_tx);\n  const uint16_t packet_sz_tx_norm = (uint16_t) (sample_normimal * audio->n_channels_tx * audio->n_bytes_per_sample_tx);\n  const uint16_t packet_sz_tx_max = (uint16_t) ((sample_normimal + 1) * audio->n_channels_tx * audio->n_bytes_per_sample_tx);\n\n  // Endpoint size must larger than packet size\n  TU_ASSERT(packet_sz_tx_max <= audio->ep_in_sz);\n\n  // Frmt20.pdf 2.3.1.1 USB Packets\n  if (sample_reminder) {\n    // All virtual frame packets must either contain INT(nav) audio slots (small VFP) or INT(nav)+1 (large VFP) audio slots\n    audio->packet_sz_tx[0] = packet_sz_tx_norm;\n    audio->packet_sz_tx[1] = packet_sz_tx_norm;\n    audio->packet_sz_tx[2] = packet_sz_tx_max;\n  } else {\n    // In the case where nav = INT(nav), ni may vary between INT(nav)-1 (small VFP), INT(nav)\n    // (medium VFP) and INT(nav)+1 (large VFP).\n    audio->packet_sz_tx[0] = packet_sz_tx_min;\n    audio->packet_sz_tx[1] = packet_sz_tx_norm;\n    audio->packet_sz_tx[2] = packet_sz_tx_max;\n  }\n\n  return true;\n}\n\nstatic uint16_t audiod_tx_packet_size(const uint16_t *nominal_size, uint16_t data_count, uint16_t fifo_depth, uint16_t fifo_threshold, uint16_t max_depth) {\n  // Flow control need a FIFO size of at least 4*Navg\n  if (nominal_size[1] && nominal_size[1] <= fifo_depth * 4) {\n    // Use blackout to prioritize normal size packet\n    static int ctrl_blackout = 0;\n    uint16_t packet_size;\n    uint16_t slot_size = nominal_size[2] - nominal_size[1];\n    if (data_count < nominal_size[0]) {\n      // If you get here frequently, then your I2S clock deviation is too big !\n      packet_size = 0;\n    } else if (data_count < (fifo_threshold - slot_size) && !ctrl_blackout) {\n      packet_size = nominal_size[0];\n      ctrl_blackout = 10;\n    } else if (data_count > (fifo_threshold + slot_size) && !ctrl_blackout) {\n      packet_size = nominal_size[2];\n      if (nominal_size[0] == nominal_size[1]) {\n        // nav > INT(nav), eg. 44.1k, 88.2k\n        ctrl_blackout = 0;\n      } else {\n        // nav = INT(nav), eg. 48k, 96k\n        ctrl_blackout = 10;\n      }\n    } else {\n      packet_size = nominal_size[1];\n      if (ctrl_blackout) {\n        ctrl_blackout--;\n      }\n    }\n    // Normally this cap is not necessary\n    return tu_min16(packet_size, max_depth);\n  } else {\n    return tu_min16(data_count, max_depth);\n  }\n}\n\n#endif\n\n// No security checks here - internal function only which should always succeed\nstatic inline uint8_t audiod_get_audio_fct_idx(audiod_function_t *audio) {\n  return (uint8_t) (audio - _audiod_fct);\n}\n\n#endif // (CFG_TUD_ENABLED && CFG_TUD_AUDIO)\n"
  },
  {
    "path": "src/class/audio/audio_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Reinhard Panhuber\n * Copyright (c) 2023 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_AUDIO_DEVICE_H_\n#define TUSB_AUDIO_DEVICE_H_\n\n#include \"audio.h\"\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n\n// All sizes are in bytes!\n\n// Size of control buffer used to receive and send control messages via EP0 - has to be big enough to hold your\n// biggest request structure e.g. range requests with multiple intervals defined or cluster descriptors\n#ifndef CFG_TUD_AUDIO_CTRL_BUF_SZ\n#define CFG_TUD_AUDIO_CTRL_BUF_SZ    64\n#endif\n\n// End point sizes IN BYTES - Limits: Full Speed <= 1023, High Speed <= 1024\n#ifndef CFG_TUD_AUDIO_ENABLE_EP_IN\n#define CFG_TUD_AUDIO_ENABLE_EP_IN 0   // TX\n#endif\n\n#ifndef CFG_TUD_AUDIO_ENABLE_EP_OUT\n#define CFG_TUD_AUDIO_ENABLE_EP_OUT 0  // RX\n#endif\n\n// Maximum EP sizes for all alternate AS interface settings - used for checks and buffer allocation\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n#ifndef CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX\n#error You must tell the driver the biggest EP IN size!\n#endif\n#if CFG_TUD_AUDIO > 1\n#ifndef CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX\n#error You must tell the driver the biggest EP IN size!\n#endif\n#endif\n#if CFG_TUD_AUDIO > 2\n#ifndef CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX\n#error You must tell the driver the biggest EP IN size!\n#endif\n#endif\n#endif // CFG_TUD_AUDIO_ENABLE_EP_IN\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n#ifndef CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX\n#error You must tell the driver the biggest EP OUT size!\n#endif\n#if CFG_TUD_AUDIO > 1\n#ifndef CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX\n#error You must tell the driver the biggest EP OUT size!\n#endif\n#endif\n#if CFG_TUD_AUDIO > 2\n#ifndef CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX\n#error You must tell the driver the biggest EP OUT size!\n#endif\n#endif\n#endif // CFG_TUD_AUDIO_ENABLE_EP_OUT\n\n// Software EP FIFO buffer sizes - must be >= max EP SIZEs!\n#ifndef CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ\n#define CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ                0\n#endif\n#ifndef CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ\n#define CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ                0\n#endif\n#ifndef CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ\n#define CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ                0\n#endif\n\n#ifndef CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ\n#define CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ               0\n#endif\n#ifndef CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ\n#define CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ               0\n#endif\n#ifndef CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ\n#define CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ               0\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n#if CFG_TUD_AUDIO_FUNC_1_EP_IN_SW_BUF_SZ < CFG_TUD_AUDIO_FUNC_1_EP_IN_SZ_MAX\n#error EP software buffer size MUST BE at least as big as maximum EP size\n#endif\n\n#if CFG_TUD_AUDIO > 1\n#if CFG_TUD_AUDIO_FUNC_2_EP_IN_SW_BUF_SZ < CFG_TUD_AUDIO_FUNC_2_EP_IN_SZ_MAX\n#error EP software buffer size MUST BE at least as big as maximum EP size\n#endif\n#endif\n\n#if CFG_TUD_AUDIO > 2\n#if CFG_TUD_AUDIO_FUNC_3_EP_IN_SW_BUF_SZ < CFG_TUD_AUDIO_FUNC_3_EP_IN_SZ_MAX\n#error EP software buffer size MUST BE at least as big as maximum EP size\n#endif\n#endif\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n#if CFG_TUD_AUDIO_FUNC_1_EP_OUT_SW_BUF_SZ < CFG_TUD_AUDIO_FUNC_1_EP_OUT_SZ_MAX\n#error EP software buffer size MUST BE at least as big as maximum EP size\n#endif\n\n#if CFG_TUD_AUDIO > 1\n#if CFG_TUD_AUDIO_FUNC_2_EP_OUT_SW_BUF_SZ < CFG_TUD_AUDIO_FUNC_2_EP_OUT_SZ_MAX\n#error EP software buffer size MUST BE at least as big as maximum EP size\n#endif\n#endif\n\n#if CFG_TUD_AUDIO > 2\n#if CFG_TUD_AUDIO_FUNC_3_EP_OUT_SW_BUF_SZ < CFG_TUD_AUDIO_FUNC_3_EP_OUT_SZ_MAX\n#error EP software buffer size MUST BE at least as big as maximum EP size\n#endif\n#endif\n#endif\n\n// (For TYPE-I format only) Flow control is necessary to allow IN ep send correct amount of data, unless it's a\n// virtual device where data is perfectly synchronized to USB clock.\n#ifndef CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL\n#define CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL  1\n#endif\n\n// Enable/disable feedback EP (required for asynchronous RX applications)\n#ifndef CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n#define CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP                    0                             // Feedback - 0 or 1\n#endif\n\n// Enable/disable interrupt EP (required for notifying host of control changes)\n#ifndef CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\n#define CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP                   0                             // Feedback - 0 or 1\n#endif\n\n// Audio control interrupt EP - 6 Bytes according to UAC 2 specification (p. 74)\n#define CFG_TUD_AUDIO_INTERRUPT_EP_SZ                       6\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** \\addtogroup AUDIO_Serial Serial\n *  @{\n *  \\defgroup   AUDIO_Serial_Device Device\n *  @{ */\n\n//--------------------------------------------------------------------+\n// Application API (Multiple Interfaces)\n// CFG_TUD_AUDIO > 1\n//--------------------------------------------------------------------+\nbool tud_audio_n_mounted(uint8_t func_id);\nuint8_t tud_audio_n_version(uint8_t func_id);\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\nuint16_t   tud_audio_n_available       (uint8_t func_id);\nuint16_t   tud_audio_n_read            (uint8_t func_id, void* buffer, uint16_t bufsize);\nbool       tud_audio_n_clear_ep_out_ff (uint8_t func_id);\ntu_fifo_t* tud_audio_n_get_ep_out_ff   (uint8_t func_id);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\nuint16_t   tud_audio_n_write          (uint8_t func_id, const void * data, uint16_t len);\nbool       tud_audio_n_clear_ep_in_ff (uint8_t func_id);\ntu_fifo_t* tud_audio_n_get_ep_in_ff   (uint8_t func_id);\nuint16_t   tud_audio_n_get_ep_in_fifo_threshold(uint8_t func_id);\nvoid       tud_audio_n_set_ep_in_fifo_threshold(uint8_t func_id, uint16_t threshold);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\nbool    tud_audio_int_n_write                     (uint8_t func_id, const audio_interrupt_data_t * data);\n#endif\n\n//--------------------------------------------------------------------+\n// Application API (Interface0)\n//--------------------------------------------------------------------+\nstatic inline bool         tud_audio_mounted                (void);\nstatic inline uint8_t      tud_audio_version                (void);\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\nstatic inline uint16_t   tud_audio_available       (void);\nstatic inline bool       tud_audio_clear_ep_out_ff (void);\nstatic inline uint16_t   tud_audio_read            (void* buffer, uint16_t bufsize);\nstatic inline tu_fifo_t* tud_audio_get_ep_out_ff   (void);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\nstatic inline uint16_t   tud_audio_write          (const void * data, uint16_t len);\nstatic inline bool       tud_audio_clear_ep_in_ff (void);\nstatic inline tu_fifo_t* tud_audio_get_ep_in_ff   (void);\n#endif\n\n// INT CTR API\n\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\nstatic inline bool tud_audio_int_write                      (const audio_interrupt_data_t * data);\n#endif\n\n// Buffer control EP data and schedule a transmit\n// This function is intended to be used if you do not have a persistent buffer or memory location available\n// (e.g. non-local variables) and need to answer onto a get request. This function buffers your answer request\n// frame into the control buffer of the corresponding audio driver and schedules a transmit for sending it.\n// Since transmission is triggered via interrupts, a persistent memory location is required onto which the buffer\n// pointer in pointing. If you already have such available you may directly use 'tud_control_xfer(...)'. In this\n// case data does not need to be copied into an additional buffer and you save some time.\n// If the request's wLength is zero, a status packet is sent instead.\nbool tud_audio_buffer_and_schedule_control_xfer(uint8_t rhport, tusb_control_request_t const * p_request,\n                                                 void* data, uint16_t len);\n\n//--------------------------------------------------------------------+\n// Application Callback API\n//--------------------------------------------------------------------+\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n// Invoked in ISR context once an audio packet was sent successfully.\n// Normally this function is not needed, since the data transfer should be driven by audio clock (i.e. I2S clock),\n// call tud_audio_write() in I2S receive callback.\nbool tud_audio_tx_done_isr(uint8_t rhport, uint16_t n_bytes_sent, uint8_t func_id, uint8_t ep_in,\n                           uint8_t cur_alt_setting);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n// Invoked in ISR context once an audio packet was received successfully.\n// Normally this function is not needed, since the data transfer should be driven by audio clock (i.e. I2S clock),\n// call tud_audio_read() in I2S transmit callback.\nbool tud_audio_rx_done_isr(uint8_t rhport, uint16_t n_bytes_received, uint8_t func_id, uint8_t ep_out,\n                           uint8_t cur_alt_setting);\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n\n// Note about feedback calculation\n//\n// Option 1 - AUDIO_FEEDBACK_METHOD_FIFO_COUNT\n// Feedback value is calculated within the audio driver by regulating the FIFO level to half fill.\n// Advantage: No SOF interrupt is enabled, hence the CPU need not to handle an ISR every 1ms or 125us and thus\n// less CPU load, well tested (Windows, Linux, OSX) with a reliable result so far.\n// Disadvantage: A FIFO of minimal 4 frames is needed to compensate for jitter, an average delay of 2 frames is\n// introduced.\n//\n// Option 2 - AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED / AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT\n// Feedback value is calculated within the audio driver by use of SOF interrupt. The driver needs information\n// about the master clock f_m from which the audio sample frequency f_s is derived, f_s itself, and the cycle\n// count of f_m at time of the SOF interrupt (e.g. by use of a hardware counter).\n// See tud_audio_set_fb_params() and tud_audio_feedback_update()\n// Advantage: Reduced jitter in the feedback value computation, hence, the receive FIFO can be smaller and thus a\n// smaller delay is possible.\n// Disadvantage: higher CPU load due to SOF ISR handling every frame i.e. 1ms or 125us. (The most critical point\n// is the reading of the cycle counter value of f_m. It is read from within the SOF ISR - see: audiod_sof() -,\n// hence, the ISR must has a high priority such that no software dependent \"random\" delay i.e. jitter is\n// introduced). Long-term drift will cause the FIFO under/overflow, you still needs to correct it somehow.\n//\n// Option 3 - manual\n// Determined by the user itself and set by use of tud_audio_n_fb_set(). The feedback value may be determined\n// e.g. from some fill status of some FIFO buffer.\n// Advantage: No ISR interrupt is enabled, hence the CPU need not to handle an ISR every 1ms or 125us and thus\n// less CPU load.\n// Disadvantage: typically a larger FIFO is needed to compensate for jitter (e.g. 6 frames), i.e. a larger delay\n// is introduced.\n\n\n// This function is used to provide data rate feedback from an asynchronous sink. Feedback value will be sent at\n// FB endpoint interval till it's changed.\n//\n// The feedback format is specified to be 16.16 for HS and 10.14 for FS devices (see Universal Serial Bus\n// Specification Revision 2.0 5.12.4.2). For simplicity, this function always uses 16.16 format. For FS devices,\n// the driver will automatically convert the value to 10.14 format.\n//\n// Note that due to a bug in its USB Audio 2.0 driver, Windows currently requires 16.16 format for _all_ USB 2.0\n// devices. On Linux and it seems the driver can work with either format.\n//\n// Feedback value can be determined from within the SOF ISR of the audio driver. This should reduce jitter. If the\n// feature is used, the user can not set the feedback value.\n//\n// Determine feedback value - The feedback method is described in 5.12.4.2 of the USB 2.0 spec\n// Boiled down, the feedback value Ff = n_samples / (micro)frame.\n// Since an accuracy of less than 1 Sample / second is desired, at least n_frames = ceil(2^K * f_s / f_m) frames\n// need to be measured, where K = 10 for full speed and K = 13 for high speed, f_s is the sampling frequency\n// e.g. 48 kHz and f_m is the cpu clock frequency e.g. 100 MHz (or any other master clock whose clock count is\n// available and locked to f_s)\n// The update interval in the (4.10.2.1) Feedback Endpoint Descriptor must be less or equal to 2^(K - P), where\n// P = min( ceil(log2(f_m / f_s)), K)\n// feedback = n_cycles / n_frames * f_s / f_m in 16.16 format, where n_cycles are the number of main clock cycles\n// within fb_n_frames\nbool tud_audio_n_fb_set(uint8_t func_id, uint32_t feedback);\n\n// Update feedback value with passed MCLK cycles since last time this update function is called.\n// Typically called within tud_audio_sof_isr(). Required tud_audio_feedback_params_cb() is implemented\n// This function will also call tud_audio_feedback_set()\n// return feedback value in 16.16 for reference (0 for error)\n// Example :\n//   binterval=3 (4ms); FS = 48kHz; MCLK = 12.288MHz\n//   In 4 SOF MCLK counted 49152 cycles\nuint32_t tud_audio_feedback_update(uint8_t func_id, uint32_t cycles);\n\nenum {\n  AUDIO_FEEDBACK_METHOD_DISABLED,\n  AUDIO_FEEDBACK_METHOD_FREQUENCY_FIXED,\n  AUDIO_FEEDBACK_METHOD_FREQUENCY_FLOAT,\n  AUDIO_FEEDBACK_METHOD_FREQUENCY_POWER_OF_2, // For driver internal use only\n  AUDIO_FEEDBACK_METHOD_FIFO_COUNT\n};\n\ntypedef struct {\n  uint8_t method;\n  uint32_t sample_freq;   //  sample frequency in Hz\n\n  union {\n    struct {\n      uint32_t mclk_freq; // Main clock frequency in Hz i.e. master clock to which sample clock is based on\n    } frequency;\n    struct {\n      uint16_t fifo_threshold;  // Target FIFO threshold level, default to half FIFO if not set\n    } fifo_count;\n  };\n} audio_feedback_params_t;\n\n// Invoked when needed to set feedback parameters\nvoid tud_audio_feedback_params_cb(uint8_t func_id, uint8_t alt_itf, audio_feedback_params_t* feedback_param);\n\n// Callback in ISR context, invoked periodically according to feedback endpoint bInterval.\n// Could be used to compute and update feedback value, should be placed in RAM if possible\n// frame_number  : current SOF count\n// interval_shift: number of bit shift i.e log2(interval) from Feedback endpoint descriptor\nTU_ATTR_FAST_FUNC void tud_audio_feedback_interval_isr(uint8_t func_id, uint32_t frame_number, uint8_t interval_shift);\n#endif // CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\n\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\n// Invoked when an interrupt notification transfer is complete\nvoid tud_audio_int_done_cb(uint8_t rhport);\n#endif\n\n// Invoked when audio set interface request received\nbool tud_audio_set_itf_cb(uint8_t rhport, tusb_control_request_t const * p_request);\n\n// Invoked when audio set interface request received which closes an EP\nbool tud_audio_set_itf_close_ep_cb(uint8_t rhport, tusb_control_request_t const * p_request);\n\n// backward compatible for typo\n#define tud_audio_set_itf_close_EP_cb   tud_audio_set_itf_close_ep_cb\n\n// Invoked when audio class specific set request received for an EP\nbool tud_audio_set_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_request, uint8_t *pBuff);\n\n// Invoked when audio class specific set request received for an interface\nbool tud_audio_set_req_itf_cb(uint8_t rhport, tusb_control_request_t const * p_request, uint8_t *pBuff);\n\n// Invoked when audio class specific set request received for an entity\nbool tud_audio_set_req_entity_cb(uint8_t rhport, tusb_control_request_t const * p_request, uint8_t *pBuff);\n\n// Invoked when audio class specific get request received for an EP\nbool tud_audio_get_req_ep_cb(uint8_t rhport, tusb_control_request_t const * p_request);\n\n// Invoked when audio class specific get request received for an interface\nbool tud_audio_get_req_itf_cb(uint8_t rhport, tusb_control_request_t const * p_request);\n\n// Invoked when audio class specific get request received for an entity\nbool tud_audio_get_req_entity_cb(uint8_t rhport, tusb_control_request_t const * p_request);\n\n//--------------------------------------------------------------------+\n// Inline Functions\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_audio_mounted(void) {\n  return tud_audio_n_mounted(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tud_audio_version(void) {\n  return tud_audio_n_version(0);\n}\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tud_audio_available(void) {\n  return tud_audio_n_available(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tud_audio_read(void* buffer, uint16_t bufsize) {\n  return tud_audio_n_read(0, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_audio_clear_ep_out_ff(void) {\n  return tud_audio_n_clear_ep_out_ff(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tu_fifo_t* tud_audio_get_ep_out_ff(void) {\n  return tud_audio_n_get_ep_out_ff(0);\n}\n\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_IN\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tud_audio_write(const void * data, uint16_t len) {\n  return tud_audio_n_write(0, data, len);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_audio_clear_ep_in_ff(void) {\n  return tud_audio_n_clear_ep_in_ff(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tu_fifo_t* tud_audio_get_ep_in_ff(void) {\n  return tud_audio_n_get_ep_in_ff(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tud_audio_get_ep_in_fifo_threshold(void)\n{\n  return tud_audio_n_get_ep_in_fifo_threshold(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tud_audio_set_ep_in_fifo_threshold(uint16_t threshold)\n{\n  tud_audio_n_set_ep_in_fifo_threshold(0, threshold);\n}\n\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_INTERRUPT_EP\nTU_ATTR_ALWAYS_INLINE static inline bool tud_audio_int_write(const audio_interrupt_data_t * data) {\n  return tud_audio_int_n_write(0, data);\n}\n#endif\n\n#if CFG_TUD_AUDIO_ENABLE_EP_OUT && CFG_TUD_AUDIO_ENABLE_FEEDBACK_EP\nTU_ATTR_ALWAYS_INLINE static inline bool tud_audio_fb_set(uint32_t feedback) {\n  return tud_audio_n_fb_set(0, feedback);\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     audiod_init           (void);\nbool     audiod_deinit         (void);\nvoid     audiod_reset          (uint8_t rhport);\nuint16_t audiod_open           (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     audiod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\nbool     audiod_xfer_cb        (uint8_t rhport, uint8_t edpt_addr, xfer_result_t result, uint32_t xferred_bytes);\nbool     audiod_xfer_isr       (uint8_t rhport, uint8_t edpt_addr, xfer_result_t result, uint32_t xferred_bytes);\nvoid     audiod_sof_isr        (uint8_t rhport, uint32_t frame_count);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_AUDIO_DEVICE_H_ */\n\n/** @} */\n/** @} */\n"
  },
  {
    "path": "src/class/bth/bth_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_BTH)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"bth_device.h\"\n#include <device/usbd_pvt.h>\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t itf_num;\n  uint8_t ep_ev;\n  uint8_t ep_acl_in;\n  uint16_t ep_acl_in_pkt_sz;\n  uint8_t ep_acl_out;\n  uint8_t ep_voice[2];// Not used yet\n  uint8_t ep_voice_size[2][CFG_TUD_BTH_ISO_ALT_COUNT];\n\n  // Previous amount of bytes sent when issuing ZLP\n  uint32_t prev_xferred_bytes;\n} btd_interface_t;\n\ntypedef struct {\n  TUD_EPBUF_DEF(epout_buf, CFG_TUD_BTH_DATA_EPSIZE);\n  TUD_EPBUF_TYPE_DEF(bt_hci_cmd_t, hci_cmd);\n} btd_epbuf_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nstatic btd_interface_t _btd_itf;\nCFG_TUD_MEM_SECTION static btd_epbuf_t _btd_epbuf;\n\nstatic bool bt_tx_data(uint8_t ep, void *data, uint16_t len) {\n  uint8_t const rhport = 0;\n\n  // skip if previous transfer not complete\n  TU_VERIFY(!usbd_edpt_busy(rhport, ep));\n\n  TU_ASSERT(usbd_edpt_xfer(rhport, ep, data, len, false));\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_bt_hci_cmd_cb(void *hci_cmd, size_t cmd_len) {\n  (void) hci_cmd;\n  (void) cmd_len;\n}\n\nTU_ATTR_WEAK void tud_bt_acl_data_received_cb(void *acl_data, uint16_t data_len) {\n  (void) acl_data;\n  (void) data_len;\n}\n\nTU_ATTR_WEAK void tud_bt_event_sent_cb(uint16_t sent_bytes) {\n  (void) sent_bytes;\n}\n\nTU_ATTR_WEAK void tud_bt_acl_data_sent_cb(uint16_t sent_bytes) {\n  (void) sent_bytes;\n}\n\n//--------------------------------------------------------------------+\n// READ API\n//--------------------------------------------------------------------+\n\n\n//--------------------------------------------------------------------+\n// WRITE API\n//--------------------------------------------------------------------+\n\nbool tud_bt_event_send(void *event, uint16_t event_len) {\n  return bt_tx_data(_btd_itf.ep_ev, event, event_len);\n}\n\nbool tud_bt_acl_data_send(void *event, uint16_t event_len) {\n  return bt_tx_data(_btd_itf.ep_acl_in, event, event_len);\n}\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid btd_init(void) {\n  tu_memclr(&_btd_itf, sizeof(_btd_itf));\n}\n\nbool btd_deinit(void) {\n  return true;\n}\n\nvoid btd_reset(uint8_t rhport) {\n  (void) rhport;\n}\n\nuint16_t btd_open(uint8_t rhport, tusb_desc_interface_t const *itf_desc, uint16_t max_len) {\n  tusb_desc_endpoint_t const *desc_ep;\n  uint16_t drv_len = 0;\n  // Size of single alternative of ISO interface\n  const uint16_t iso_alt_itf_size = sizeof(tusb_desc_interface_t) + 2 * sizeof(tusb_desc_endpoint_t);\n  // Size of hci interface\n  const uint16_t hci_itf_size = sizeof(tusb_desc_interface_t) + 3 * sizeof(tusb_desc_endpoint_t);\n  // Ensure this is BT Primary Controller\n  TU_VERIFY(TUSB_CLASS_WIRELESS_CONTROLLER == itf_desc->bInterfaceClass &&\n                TUD_BT_APP_SUBCLASS == itf_desc->bInterfaceSubClass &&\n                TUD_BT_PROTOCOL_PRIMARY_CONTROLLER == itf_desc->bInterfaceProtocol,\n            0);\n\n  TU_ASSERT(itf_desc->bNumEndpoints == 3 && max_len >= hci_itf_size);\n\n  _btd_itf.itf_num = itf_desc->bInterfaceNumber;\n\n  desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(itf_desc);\n\n  TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && TUSB_XFER_INTERRUPT == desc_ep->bmAttributes.xfer, 0);\n  TU_ASSERT(usbd_edpt_open(rhport, desc_ep), 0);\n  _btd_itf.ep_ev = desc_ep->bEndpointAddress;\n\n  desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(desc_ep);\n\n  // Open endpoint pair\n  TU_ASSERT(usbd_open_edpt_pair(rhport, (uint8_t const *) desc_ep, 2,\n                                TUSB_XFER_BULK, &_btd_itf.ep_acl_out,\n                                &_btd_itf.ep_acl_in),\n            0);\n\n  // Save acl in endpoint max packet size\n  tusb_desc_endpoint_t const *desc_ep_acl_in = desc_ep;\n  for (size_t p = 0; p < 2; p++) {\n    if (tu_edpt_dir(desc_ep_acl_in->bEndpointAddress) == TUSB_DIR_IN) {\n      _btd_itf.ep_acl_in_pkt_sz = tu_edpt_packet_size(desc_ep_acl_in);\n      break;\n    }\n    desc_ep_acl_in = (tusb_desc_endpoint_t const *) tu_desc_next(desc_ep_acl_in);\n  }\n\n  itf_desc = (tusb_desc_interface_t const *) tu_desc_next(tu_desc_next(desc_ep));\n\n  // Prepare for incoming data from host\n  TU_ASSERT(usbd_edpt_xfer(rhport, _btd_itf.ep_acl_out, _btd_epbuf.epout_buf, CFG_TUD_BTH_DATA_EPSIZE, false), 0);\n\n  drv_len = hci_itf_size;\n\n  // Ensure this is still BT Primary Controller\n  TU_ASSERT(TUSB_CLASS_WIRELESS_CONTROLLER == itf_desc->bInterfaceClass &&\n                TUD_BT_APP_SUBCLASS == itf_desc->bInterfaceSubClass &&\n                TUD_BT_PROTOCOL_PRIMARY_CONTROLLER == itf_desc->bInterfaceProtocol,\n            0);\n  TU_ASSERT(itf_desc->bNumEndpoints == 2 && max_len >= iso_alt_itf_size + drv_len);\n\n  uint8_t dir;\n\n  desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(itf_desc);\n  TU_ASSERT(itf_desc->bAlternateSetting < CFG_TUD_BTH_ISO_ALT_COUNT, 0);\n  TU_ASSERT(desc_ep->bDescriptorType == TUSB_DESC_ENDPOINT, 0);\n  dir = tu_edpt_dir(desc_ep->bEndpointAddress);\n  _btd_itf.ep_voice[dir] = desc_ep->bEndpointAddress;\n  // Store endpoint size for alternative\n  _btd_itf.ep_voice_size[dir][itf_desc->bAlternateSetting] = (uint8_t) tu_edpt_packet_size(desc_ep);\n\n  desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(desc_ep);\n  TU_ASSERT(desc_ep->bDescriptorType == TUSB_DESC_ENDPOINT, 0);\n  dir = tu_edpt_dir(desc_ep->bEndpointAddress);\n  _btd_itf.ep_voice[dir] = desc_ep->bEndpointAddress;\n  // Store endpoint size for alternative\n  _btd_itf.ep_voice_size[dir][itf_desc->bAlternateSetting] = (uint8_t) tu_edpt_packet_size(desc_ep);\n  drv_len += iso_alt_itf_size;\n\n  for (int i = 1; i < CFG_TUD_BTH_ISO_ALT_COUNT && drv_len + iso_alt_itf_size <= max_len; ++i) {\n    // Make sure rest of alternatives matches\n    itf_desc = (tusb_desc_interface_t const *) tu_desc_next(desc_ep);\n    if (itf_desc->bDescriptorType != TUSB_DESC_INTERFACE ||\n        TUSB_CLASS_WIRELESS_CONTROLLER != itf_desc->bInterfaceClass ||\n        TUD_BT_APP_SUBCLASS != itf_desc->bInterfaceSubClass ||\n        TUD_BT_PROTOCOL_PRIMARY_CONTROLLER != itf_desc->bInterfaceProtocol) {\n      // Not an Iso interface instance\n      break;\n    }\n    TU_ASSERT(itf_desc->bAlternateSetting < CFG_TUD_BTH_ISO_ALT_COUNT, 0);\n\n    desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(itf_desc);\n    dir = tu_edpt_dir(desc_ep->bEndpointAddress);\n    // Verify that alternative endpoint are same as first ones\n    TU_ASSERT(desc_ep->bDescriptorType == TUSB_DESC_ENDPOINT &&\n                  _btd_itf.ep_voice[dir] == desc_ep->bEndpointAddress,\n              0);\n    _btd_itf.ep_voice_size[dir][itf_desc->bAlternateSetting] = (uint8_t) tu_edpt_packet_size(desc_ep);\n\n    desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(desc_ep);\n    dir = tu_edpt_dir(desc_ep->bEndpointAddress);\n    // Verify that alternative endpoint are same as first ones\n    TU_ASSERT(desc_ep->bDescriptorType == TUSB_DESC_ENDPOINT &&\n                  _btd_itf.ep_voice[dir] == desc_ep->bEndpointAddress,\n              0);\n    _btd_itf.ep_voice_size[dir][itf_desc->bAlternateSetting] = (uint8_t) tu_edpt_packet_size(desc_ep);\n    drv_len += iso_alt_itf_size;\n  }\n\n  return drv_len;\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool btd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request) {\n  (void) rhport;\n\n  if (stage == CONTROL_STAGE_SETUP) {\n    if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS &&\n        request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE) {\n      // HCI command packet addressing for single function Primary Controllers\n      // also compatible with historical mode if enabled\n      TU_VERIFY((request->bRequest == 0 && request->wValue == 0 && request->wIndex == 0) ||\n                (CFG_TUD_BTH_HISTORICAL_COMPATIBLE && request->bRequest == 0xe0));\n    } else if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE) {\n      if (request->bRequest == TUSB_REQ_SET_INTERFACE && _btd_itf.itf_num + 1 == request->wIndex) {\n        // TODO: Set interface it would involve changing size of endpoint size\n      } else {\n        // HCI command packet for Primary Controller function in a composite device\n        TU_VERIFY(request->bRequest == 0 && request->wValue == 0 && request->wIndex == _btd_itf.itf_num);\n      }\n    } else\n      return false;\n\n    return tud_control_xfer(rhport, request, &_btd_epbuf.hci_cmd, sizeof(bt_hci_cmd_t));\n  } else if (stage == CONTROL_STAGE_DATA) {\n    // Handle class request only\n    TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);\n\n    tud_bt_hci_cmd_cb(&_btd_epbuf.hci_cmd, tu_min16(request->wLength, sizeof(bt_hci_cmd_t)));\n  }\n\n  return true;\n}\n\nbool btd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result,\n                 uint32_t xferred_bytes) {\n  // received new data from host\n  if (ep_addr == _btd_itf.ep_acl_out) {\n    tud_bt_acl_data_received_cb(_btd_epbuf.epout_buf, xferred_bytes);\n\n    // prepare for next data\n    TU_ASSERT(usbd_edpt_xfer(rhport, _btd_itf.ep_acl_out, _btd_epbuf.epout_buf, CFG_TUD_BTH_DATA_EPSIZE, false));\n  } else if (ep_addr == _btd_itf.ep_ev) {\n    tud_bt_event_sent_cb((uint16_t) xferred_bytes);\n  } else if (ep_addr == _btd_itf.ep_acl_in) {\n    if ((result == XFER_RESULT_SUCCESS) && (xferred_bytes > 0) &&\n        ((xferred_bytes & (_btd_itf.ep_acl_in_pkt_sz - 1)) == 0)) {\n      // Save number of transferred bytes\n      _btd_itf.prev_xferred_bytes = xferred_bytes;\n\n      // Send zero-length packet\n      tud_bt_acl_data_send(NULL, 0);\n    } else {\n      if (xferred_bytes == 0) {\n        xferred_bytes = _btd_itf.prev_xferred_bytes;\n        _btd_itf.prev_xferred_bytes = 0;\n      }\n      tud_bt_acl_data_sent_cb((uint16_t) xferred_bytes);\n    }\n  }\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/bth/bth_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_BTH_DEVICE_H_\n#define TUSB_BTH_DEVICE_H_\n\n#include <common/tusb_common.h>\n#include <device/usbd.h>\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n#ifndef CFG_TUD_BTH_EVENT_EPSIZE\n#define CFG_TUD_BTH_EVENT_EPSIZE     16\n#endif\n\n#ifndef CFG_TUD_BTH_DATA_EPSIZE\n#define CFG_TUD_BTH_DATA_EPSIZE      64\n#endif\n\n// Allow BTH class to work in historically compatibility mode where the bRequest is always 0xe0.\n// See Bluetooth Core v5.3, Vol. 4, Part B, Section 2.2\n#ifndef CFG_TUD_BTH_HISTORICAL_COMPATIBLE\n#define CFG_TUD_BTH_HISTORICAL_COMPATIBLE 0\n#endif\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint16_t op_code;\n  uint8_t param_length;\n  uint8_t param[255];\n} bt_hci_cmd_t;\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Application Callback API (weak is optional)\n//--------------------------------------------------------------------+\n\n// Invoked when HCI command was received over USB from Bluetooth host.\n// Detailed format is described in Bluetooth core specification Vol 2,\n// Part E, 5.4.1.\n// Length of the command is from 3 bytes (2 bytes for OpCode,\n// 1 byte for parameter total length) to 258.\nvoid tud_bt_hci_cmd_cb(void *hci_cmd, size_t cmd_len);\n\n// Invoked when ACL data was received over USB from Bluetooth host.\n// Detailed format is described in Bluetooth core specification Vol 2,\n// Part E, 5.4.2.\n// Length is from 4 bytes, (12 bits for Handle, 4 bits for flags\n// and 16 bits for data total length) to endpoint size.\nvoid tud_bt_acl_data_received_cb(void *acl_data, uint16_t data_len);\n\n// Called when event sent with tud_bt_event_send() was delivered to BT stack.\n// Controller can release/reuse buffer with Event packet at this point.\nvoid tud_bt_event_sent_cb(uint16_t sent_bytes);\n\n// Called when ACL data that was sent with tud_bt_acl_data_send()\n// was delivered to BT stack.\n// Controller can release/reuse buffer with ACL packet at this point.\nvoid tud_bt_acl_data_sent_cb(uint16_t sent_bytes);\n\n// Bluetooth controller calls this function when it wants to send even packet\n// as described in Bluetooth core specification Vol 2, Part E, 5.4.4.\n// Event has at least 2 bytes, first is Event code second contains parameter\n// total length. Controller can release/reuse event memory after\n// tud_bt_event_sent_cb() is called.\nbool tud_bt_event_send(void *event, uint16_t event_len);\n\n// Bluetooth controller calls this to send ACL data packet\n// as described in Bluetooth core specification Vol 2, Part E, 5.4.2\n// Minimum length is 4 bytes, (12 bits for Handle, 4 bits for flags\n// and 16 bits for data total length). Upper limit is not limited\n// to endpoint size since buffer is allocate by controller\n// and must not be reused till tud_bt_acl_data_sent_cb() is called.\nbool tud_bt_acl_data_send(void *acl_data, uint16_t data_len);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     btd_init            (void);\nbool     btd_deinit          (void);\nvoid     btd_reset           (uint8_t rhport);\nuint16_t btd_open            (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     btd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const *request);\nbool     btd_xfer_cb         (uint8_t rhport, uint8_t edpt_addr, xfer_result_t result, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_BTH_DEVICE_H_ */\n"
  },
  {
    "path": "src/class/cdc/cdc.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/** \\ingroup group_class\n *  \\defgroup ClassDriver_CDC Communication Device Class (CDC)\n *            Currently only Abstract Control Model subclass is supported\n *  @{ */\n\n#ifndef TUSB_CDC_H__\n#define TUSB_CDC_H__\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n/** \\defgroup ClassDriver_CDC_Common Common Definitions\n *  @{ */\n\n//--------------------------------------------------------------------+\n// CDC Communication Interface Class\n//--------------------------------------------------------------------+\n\n/// Communication Interface Subclass Codes\ntypedef enum\n{\n  CDC_COMM_SUBCLASS_DIRECT_LINE_CONTROL_MODEL      = 0x01 , ///< Direct Line Control Model         [USBPSTN1.2]\n  CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL         = 0x02 , ///< Abstract Control Model            [USBPSTN1.2]\n  CDC_COMM_SUBCLASS_TELEPHONE_CONTROL_MODEL        = 0x03 , ///< Telephone Control Model           [USBPSTN1.2]\n  CDC_COMM_SUBCLASS_MULTICHANNEL_CONTROL_MODEL     = 0x04 , ///< Multi-Channel Control Model       [USBISDN1.2]\n  CDC_COMM_SUBCLASS_CAPI_CONTROL_MODEL             = 0x05 , ///< CAPI Control Model                [USBISDN1.2]\n  CDC_COMM_SUBCLASS_ETHERNET_CONTROL_MODEL         = 0x06 , ///< Ethernet Networking Control Model [USBECM1.2]\n  CDC_COMM_SUBCLASS_ATM_NETWORKING_CONTROL_MODEL   = 0x07 , ///< ATM Networking Control Model      [USBATM1.2]\n  CDC_COMM_SUBCLASS_WIRELESS_HANDSET_CONTROL_MODEL = 0x08 , ///< Wireless Handset Control Model    [USBWMC1.1]\n  CDC_COMM_SUBCLASS_DEVICE_MANAGEMENT              = 0x09 , ///< Device Management                 [USBWMC1.1]\n  CDC_COMM_SUBCLASS_MOBILE_DIRECT_LINE_MODEL       = 0x0A , ///< Mobile Direct Line Model          [USBWMC1.1]\n  CDC_COMM_SUBCLASS_OBEX                           = 0x0B , ///< OBEX                              [USBWMC1.1]\n  CDC_COMM_SUBCLASS_ETHERNET_EMULATION_MODEL       = 0x0C , ///< Ethernet Emulation Model          [USBEEM1.0]\n  CDC_COMM_SUBCLASS_NETWORK_CONTROL_MODEL          = 0x0D   ///< Network Control Model             [USBNCM1.0]\n} cdc_comm_sublcass_type_t;\n\n/// Communication Interface Protocol Codes\ntypedef enum\n{\n  CDC_COMM_PROTOCOL_NONE                          = 0x00 , ///< No specific protocol\n  CDC_COMM_PROTOCOL_ATCOMMAND                     = 0x01 , ///< AT Commands: V.250 etc\n  CDC_COMM_PROTOCOL_ATCOMMAND_PCCA_101            = 0x02 , ///< AT Commands defined by PCCA-101\n  CDC_COMM_PROTOCOL_ATCOMMAND_PCCA_101_AND_ANNEXO = 0x03 , ///< AT Commands defined by PCCA-101 & Annex O\n  CDC_COMM_PROTOCOL_ATCOMMAND_GSM_707             = 0x04 , ///< AT Commands defined by GSM 07.07\n  CDC_COMM_PROTOCOL_ATCOMMAND_3GPP_27007          = 0x05 , ///< AT Commands defined by 3GPP 27.007\n  CDC_COMM_PROTOCOL_ATCOMMAND_CDMA                = 0x06 , ///< AT Commands defined by TIA for CDMA\n  CDC_COMM_PROTOCOL_ETHERNET_EMULATION_MODEL      = 0x07   ///< Ethernet Emulation Model\n} cdc_comm_protocol_type_t;\n\n//------------- SubType Descriptor in COMM Functional Descriptor -------------//\n/// Communication Interface SubType Descriptor\ntypedef enum\n{\n  CDC_FUNC_DESC_HEADER                                           = 0x00 , ///< Header Functional Descriptor, which marks the beginning of the concatenated set of functional descriptors for the interface.\n  CDC_FUNC_DESC_CALL_MANAGEMENT                                  = 0x01 , ///< Call Management Functional Descriptor.\n  CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT                      = 0x02 , ///< Abstract Control Management Functional Descriptor.\n  CDC_FUNC_DESC_DIRECT_LINE_MANAGEMENT                           = 0x03 , ///< Direct Line Management Functional Descriptor.\n  CDC_FUNC_DESC_TELEPHONE_RINGER                                 = 0x04 , ///< Telephone Ringer Functional Descriptor.\n  CDC_FUNC_DESC_TELEPHONE_CALL_AND_LINE_STATE_REPORTING_CAPACITY = 0x05 , ///< Telephone Call and Line State Reporting Capabilities Functional Descriptor.\n  CDC_FUNC_DESC_UNION                                            = 0x06 , ///< Union Functional Descriptor\n  CDC_FUNC_DESC_COUNTRY_SELECTION                                = 0x07 , ///< Country Selection Functional Descriptor\n  CDC_FUNC_DESC_TELEPHONE_OPERATIONAL_MODES                      = 0x08 , ///< Telephone Operational ModesFunctional Descriptor\n  CDC_FUNC_DESC_USB_TERMINAL                                     = 0x09 , ///< USB Terminal Functional Descriptor\n  CDC_FUNC_DESC_NETWORK_CHANNEL_TERMINAL                         = 0x0A , ///< Network Channel Terminal Descriptor\n  CDC_FUNC_DESC_PROTOCOL_UNIT                                    = 0x0B , ///< Protocol Unit Functional Descriptor\n  CDC_FUNC_DESC_EXTENSION_UNIT                                   = 0x0C , ///< Extension Unit Functional Descriptor\n  CDC_FUNC_DESC_MULTICHANEL_MANAGEMENT                           = 0x0D , ///< Multi-Channel Management Functional Descriptor\n  CDC_FUNC_DESC_CAPI_CONTROL_MANAGEMENT                          = 0x0E , ///< CAPI Control Management Functional Descriptor\n  CDC_FUNC_DESC_ETHERNET_NETWORKING                              = 0x0F , ///< Ethernet Networking Functional Descriptor\n  CDC_FUNC_DESC_ATM_NETWORKING                                   = 0x10 , ///< ATM Networking Functional Descriptor\n  CDC_FUNC_DESC_WIRELESS_HANDSET_CONTROL_MODEL                   = 0x11 , ///< Wireless Handset Control Model Functional Descriptor\n  CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL                         = 0x12 , ///< Mobile Direct Line Model Functional Descriptor\n  CDC_FUNC_DESC_MOBILE_DIRECT_LINE_MODEL_DETAIL                  = 0x13 , ///< MDLM Detail Functional Descriptor\n  CDC_FUNC_DESC_DEVICE_MANAGEMENT_MODEL                          = 0x14 , ///< Device Management Model Functional Descriptor\n  CDC_FUNC_DESC_OBEX                                             = 0x15 , ///< OBEX Functional Descriptor\n  CDC_FUNC_DESC_COMMAND_SET                                      = 0x16 , ///< Command Set Functional Descriptor\n  CDC_FUNC_DESC_COMMAND_SET_DETAIL                               = 0x17 , ///< Command Set Detail Functional Descriptor\n  CDC_FUNC_DESC_TELEPHONE_CONTROL_MODEL                          = 0x18 , ///< Telephone Control Model Functional Descriptor\n  CDC_FUNC_DESC_OBEX_SERVICE_IDENTIFIER                          = 0x19 , ///< OBEX Service Identifier Functional Descriptor\n  CDC_FUNC_DESC_NCM                                              = 0x1A , ///< NCM Functional Descriptor\n}cdc_func_desc_type_t;\n\n//--------------------------------------------------------------------+\n// CDC Data Interface Class\n//--------------------------------------------------------------------+\n\n// SUBCLASS code of Data Interface is not used and should/must be zero\n\n// Data Interface Protocol Codes\ntypedef enum{\n  CDC_DATA_PROTOCOL_ISDN_BRI                               = 0x30, ///< Physical interface protocol for ISDN BRI\n  CDC_DATA_PROTOCOL_HDLC                                   = 0x31, ///< HDLC\n  CDC_DATA_PROTOCOL_TRANSPARENT                            = 0x32, ///< Transparent\n  CDC_DATA_PROTOCOL_Q921_MANAGEMENT                        = 0x50, ///< Management protocol for Q.921 data link protocol\n  CDC_DATA_PROTOCOL_Q921_DATA_LINK                         = 0x51, ///< Data link protocol for Q.931\n  CDC_DATA_PROTOCOL_Q921_TEI_MULTIPLEXOR                   = 0x52, ///< TEI-multiplexor for Q.921 data link protocol\n  CDC_DATA_PROTOCOL_V42BIS_DATA_COMPRESSION                = 0x90, ///< Data compression procedures\n  CDC_DATA_PROTOCOL_EURO_ISDN                              = 0x91, ///< Euro-ISDN protocol control\n  CDC_DATA_PROTOCOL_V24_RATE_ADAPTION_TO_ISDN              = 0x92, ///< V.24 rate adaptation to ISDN\n  CDC_DATA_PROTOCOL_CAPI_COMMAND                           = 0x93, ///< CAPI Commands\n  CDC_DATA_PROTOCOL_HOST_BASED_DRIVER                      = 0xFD, ///< Host based driver. Note: This protocol code should only be used in messages between host and device to identify the host driver portion of a protocol stack.\n  CDC_DATA_PROTOCOL_IN_PROTOCOL_UNIT_FUNCTIONAL_DESCRIPTOR = 0xFE  ///< The protocol(s) are described using a ProtocolUnit Functional Descriptors on Communications Class Interface\n}cdc_data_protocol_type_t;\n\n//--------------------------------------------------------------------+\n// Management Element Request (Control Endpoint)\n//--------------------------------------------------------------------+\n\n/// Communication Interface Management Element Request Codes\ntypedef enum {\n  CDC_REQUEST_SEND_ENCAPSULATED_COMMAND                    = 0x00, ///< is used to issue a command in the format of the supported control protocol of the Communications Class interface\n  CDC_REQUEST_GET_ENCAPSULATED_RESPONSE                    = 0x01, ///< is used to request a response in the format of the supported control protocol of the Communications Class interface.\n  CDC_REQUEST_SET_COMM_FEATURE                             = 0x02,\n  CDC_REQUEST_GET_COMM_FEATURE                             = 0x03,\n  CDC_REQUEST_CLEAR_COMM_FEATURE                           = 0x04,\n\n  CDC_REQUEST_SET_AUX_LINE_STATE                           = 0x10,\n  CDC_REQUEST_SET_HOOK_STATE                               = 0x11,\n  CDC_REQUEST_PULSE_SETUP                                  = 0x12,\n  CDC_REQUEST_SEND_PULSE                                   = 0x13,\n  CDC_REQUEST_SET_PULSE_TIME                               = 0x14,\n  CDC_REQUEST_RING_AUX_JACK                                = 0x15,\n\n  CDC_REQUEST_SET_LINE_CODING                              = 0x20,\n  CDC_REQUEST_GET_LINE_CODING                              = 0x21,\n  CDC_REQUEST_SET_CONTROL_LINE_STATE                       = 0x22,\n  CDC_REQUEST_SEND_BREAK                                   = 0x23,\n\n  CDC_REQUEST_SET_RINGER_PARMS                             = 0x30,\n  CDC_REQUEST_GET_RINGER_PARMS                             = 0x31,\n  CDC_REQUEST_SET_OPERATION_PARMS                          = 0x32,\n  CDC_REQUEST_GET_OPERATION_PARMS                          = 0x33,\n  CDC_REQUEST_SET_LINE_PARMS                               = 0x34,\n  CDC_REQUEST_GET_LINE_PARMS                               = 0x35,\n  CDC_REQUEST_DIAL_DIGITS                                  = 0x36,\n  CDC_REQUEST_SET_UNIT_PARAMETER                           = 0x37,\n  CDC_REQUEST_GET_UNIT_PARAMETER                           = 0x38,\n  CDC_REQUEST_CLEAR_UNIT_PARAMETER                         = 0x39,\n  CDC_REQUEST_GET_PROFILE                                  = 0x3A,\n\n  CDC_REQUEST_SET_ETHERNET_MULTICAST_FILTERS               = 0x40,\n  CDC_REQUEST_SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x41,\n  CDC_REQUEST_GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x42,\n  CDC_REQUEST_SET_ETHERNET_PACKET_FILTER                   = 0x43,\n  CDC_REQUEST_GET_ETHERNET_STATISTIC                       = 0x44,\n\n  CDC_REQUEST_SET_ATM_DATA_FORMAT                          = 0x50,\n  CDC_REQUEST_GET_ATM_DEVICE_STATISTICS                    = 0x51,\n  CDC_REQUEST_SET_ATM_DEFAULT_VC                           = 0x52,\n  CDC_REQUEST_GET_ATM_VC_STATISTICS                        = 0x53,\n\n  CDC_REQUEST_MDLM_SEMANTIC_MODEL                          = 0x60,\n} cdc_management_request_t;\n\ntypedef enum {\n  CDC_CONTROL_LINE_STATE_DTR = 0x01,\n  CDC_CONTROL_LINE_STATE_RTS = 0x02,\n} cdc_control_line_state_t;\n\ntypedef enum {\n  CDC_LINE_CODING_STOP_BITS_1   = 0, // 1   bit\n  CDC_LINE_CODING_STOP_BITS_1_5 = 1, // 1.5 bits\n  CDC_LINE_CODING_STOP_BITS_2   = 2, // 2   bits\n} cdc_line_coding_stopbits_t;\n\n#define CDC_LINE_CODING_STOP_BITS_TEXT(STOP_BITS) (          \\\n  (STOP_BITS) == CDC_LINE_CODING_STOP_BITS_1   ? \"1\" :       \\\n  (STOP_BITS) == CDC_LINE_CODING_STOP_BITS_1_5 ? \"1.5\" :     \\\n  (STOP_BITS) == CDC_LINE_CODING_STOP_BITS_2   ? \"2\"   : \"?\" )\n\n// TODO Backward compatible for typos. Maybe removed in the future release\n#define CDC_LINE_CONDING_STOP_BITS_1   CDC_LINE_CODING_STOP_BITS_1\n#define CDC_LINE_CONDING_STOP_BITS_1_5 CDC_LINE_CODING_STOP_BITS_1_5\n#define CDC_LINE_CONDING_STOP_BITS_2   CDC_LINE_CODING_STOP_BITS_2\n\ntypedef enum {\n  CDC_LINE_CODING_PARITY_NONE  = 0,\n  CDC_LINE_CODING_PARITY_ODD   = 1,\n  CDC_LINE_CODING_PARITY_EVEN  = 2,\n  CDC_LINE_CODING_PARITY_MARK  = 3,\n  CDC_LINE_CODING_PARITY_SPACE = 4,\n} cdc_line_coding_parity_t;\n\n#define CDC_LINE_CODING_PARITY_CHAR(PARITY) (        \\\n  (PARITY) == CDC_LINE_CODING_PARITY_NONE  ? 'N' :     \\\n  (PARITY) == CDC_LINE_CODING_PARITY_ODD   ? 'O' :     \\\n  (PARITY) == CDC_LINE_CODING_PARITY_EVEN  ? 'E' :     \\\n  (PARITY) == CDC_LINE_CODING_PARITY_MARK  ? 'M' :     \\\n  (PARITY) == CDC_LINE_CODING_PARITY_SPACE ? 'S' : '?' )\n\n//--------------------------------------------------------------------+\n// Management Element Notification (Notification Endpoint)\n//--------------------------------------------------------------------+\n\n#define CDC_REQ_TYPE_NOTIF 0xA1 ///< Direction IN; Type Class; Recipient Interface\n\n/// 6.3 Notification Codes\ntypedef enum {\n  CDC_NOTIF_NETWORK_CONNECTION               = 0x00, // notify the host about network connection status.\n  CDC_NOTIF_RESPONSE_AVAILABLE               = 0x01, // notify the host that a response is available.\n  CDC_NOTIF_AUX_JACK_HOOK_STATE              = 0x08,\n  CDC_NOTIF_RING_DETECT                      = 0x09,\n  CDC_NOTIF_SERIAL_STATE                     = 0x20,\n  CDC_NOTIF_CALL_STATE_CHANGE                = 0x28,\n  CDC_NOTIF_LINE_STATE_CHANGE                = 0x29,\n  CDC_NOTIF_CONNECTION_SPEED_CHANGE          = 0x2A, // notify the host-networking driver that a change in either the upstream or the downstream bit rate of the connection has occurred\n  CDC_NOTIF_MDLM_SEMANTIC_MODEL_NOTIFICATION = 0x40,\n} cdc_notify_request_t;\n\n//--------------------------------------------------------------------+\n// Class Specific Functional Descriptor (Communication Interface)\n//--------------------------------------------------------------------+\n\n// Start of all packed definitions for compiler without per-type packed\nTU_ATTR_PACKED_BEGIN\nTU_ATTR_BIT_FIELD_ORDER_BEGIN\n\n/// Header Functional Descriptor (Communication Interface)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength            ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType    ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUNC_DESC_\n  uint16_t bcdCDC            ; ///< CDC release number in Binary-Coded Decimal\n}cdc_desc_func_header_t;\n\n/// Union Functional Descriptor (Communication Interface)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength                  ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType          ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType       ; ///< Descriptor SubType one of above CDC_FUCN_DESC_\n  uint8_t bControlInterface        ; ///< Interface number of Communication Interface\n  uint8_t bSubordinateInterface    ; ///< Array of Interface number of Data Interface\n}cdc_desc_func_union_t;\n\n#define cdc_desc_func_union_n_t(no_slave)\\\n struct TU_ATTR_PACKED {                   \\\n  uint8_t bLength                         ;\\\n  uint8_t bDescriptorType                 ;\\\n  uint8_t bDescriptorSubType              ;\\\n  uint8_t bControlInterface               ;\\\n  uint8_t bSubordinateInterface[no_slave] ;\\\n}\n\n/// Country Selection Functional Descriptor (Communication Interface)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength             ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType     ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType  ; ///< Descriptor SubType one of above CDC_FUCN_DESC_\n  uint8_t iCountryCodeRelDate ; ///< Index of a string giving the release date for the implemented ISO 3166 Country Codes.\n  uint16_t wCountryCode       ; ///< Country code in the format as defined in [ISO3166], release date as specified inoffset 3 for the first supported country.\n} cdc_desc_func_country_selection_t;\n\n#define cdc_desc_func_country_selection_n_t(no_country) \\\n  struct TU_ATTR_PACKED {            \\\n  uint8_t bLength                   ;\\\n  uint8_t bDescriptorType           ;\\\n  uint8_t bDescriptorSubType        ;\\\n  uint8_t iCountryCodeRelDate       ;\\\n  uint16_t wCountryCode[no_country] ;\\\n}\n\n//--------------------------------------------------------------------+\n// PUBLIC SWITCHED TELEPHONE NETWORK (PSTN) SUBCLASS\n//--------------------------------------------------------------------+\n\n/// \\brief Call Management Functional Descriptor\n/// \\details This functional descriptor describes the processing of calls for the Communications Class interface.\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength            ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType    ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_\n\n  struct {\n    uint8_t handle_call    : 1; ///< 0 - Device sends/receives call management information only over the Communications Class interface. 1 - Device can send/receive call management information over a Data Class interface.\n    uint8_t send_recv_call : 1; ///< 0 - Device does not handle call management itself. 1 - Device handles call management itself.\n    uint8_t TU_RESERVED    : 6;\n  } bmCapabilities;\n\n  uint8_t bDataInterface;\n}cdc_desc_func_call_management_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t support_comm_request                    : 1; ///< Device supports the request combination of Set_Comm_Feature, Clear_Comm_Feature, and Get_Comm_Feature.\n  uint8_t support_line_request                    : 1; ///< Device supports the request combination of Set_Line_Coding, Set_Control_Line_State, Get_Line_Coding, and the notification Serial_State.\n  uint8_t support_send_break                      : 1; ///< Device supports the request Send_Break\n  uint8_t support_notification_network_connection : 1; ///< Device supports the notification Network_Connection.\n  uint8_t TU_RESERVED                             : 4;\n}cdc_acm_capability_t;\n\nTU_VERIFY_STATIC(sizeof(cdc_acm_capability_t) == 1, \"mostly problem with compiler\");\n\n/// Abstract Control Management Functional Descriptor\n/// This functional descriptor describes the commands supported by by the Communications Class interface with SubClass code of \\ref CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength                  ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType          ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType       ; ///< Descriptor SubType one of above CDC_FUCN_DESC_\n  cdc_acm_capability_t bmCapabilities ;\n}cdc_desc_func_acm_t;\n\n/// \\brief Direct Line Management Functional Descriptor\n/// \\details This functional descriptor describes the commands supported by the Communications Class interface with SubClass code of \\ref CDC_FUNC_DESC_DIRECT_LINE_MANAGEMENT\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength            ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType    ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_\n  struct {\n    uint8_t require_pulse_setup   : 1; ///< Device requires extra Pulse_Setup request during pulse dialing sequence to disengage holding circuit.\n    uint8_t support_aux_request   : 1; ///< Device supports the request combination of Set_Aux_Line_State, Ring_Aux_Jack, and notification Aux_Jack_Hook_State.\n    uint8_t support_pulse_request : 1; ///< Device supports the request combination of Pulse_Setup, Send_Pulse, and Set_Pulse_Time.\n    uint8_t TU_RESERVED           : 5;\n  } bmCapabilities;\n}cdc_desc_func_direct_line_management_t;\n\n/// \\brief Telephone Ringer Functional Descriptor\n/// \\details The Telephone Ringer functional descriptor describes the ringer capabilities supported by the Communications Class interface,\n/// with the SubClass code of \\ref CDC_COMM_SUBCLASS_TELEPHONE_CONTROL_MODEL\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t bLength            ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType    ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_\n  uint8_t bRingerVolSteps    ;\n  uint8_t bNumRingerPatterns ;\n}cdc_desc_func_telephone_ringer_t;\n\n/// \\brief Telephone Operational Modes Functional Descriptor\n/// \\details The Telephone Operational Modes functional descriptor describes the operational modes supported by\n/// the Communications Class interface, with the SubClass code of \\ref CDC_COMM_SUBCLASS_TELEPHONE_CONTROL_MODEL\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t bLength            ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType    ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_\n  struct {\n    uint8_t simple_mode           : 1;\n    uint8_t standalone_mode       : 1;\n    uint8_t computer_centric_mode : 1;\n    uint8_t TU_RESERVED           : 5;\n  } bmCapabilities;\n}cdc_desc_func_telephone_operational_modes_t;\n\n/// \\brief Telephone Call and Line State Reporting Capabilities Descriptor\n/// \\details The Telephone Call and Line State Reporting Capabilities functional descriptor describes the abilities of a\n/// telephone device to report optional call and line states.\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t bLength            ; ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType    ; ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType ; ///< Descriptor SubType one of above CDC_FUCN_DESC_\n  struct {\n    uint32_t interrupted_dialtone   : 1; ///< 0 : Reports only dialtone (does not differentiate between normal and interrupted dialtone). 1 : Reports interrupted dialtone in addition to normal dialtone\n    uint32_t ringback_busy_fastbusy : 1; ///< 0 : Reports only dialing state. 1 : Reports ringback, busy, and fast busy states.\n    uint32_t caller_id              : 1; ///< 0 : Does not report caller ID. 1 : Reports caller ID information.\n    uint32_t incoming_distinctive   : 1; ///< 0 : Reports only incoming ringing. 1 : Reports incoming distinctive ringing patterns.\n    uint32_t dual_tone_multi_freq   : 1; ///< 0 : Cannot report dual tone multi-frequency (DTMF) digits input remotely over the telephone line. 1 : Can report DTMF digits input remotely over the telephone line.\n    uint32_t line_state_change      : 1; ///< 0 : Does not support line state change notification. 1 : Does support line state change notification\n    uint32_t TU_RESERVED0           : 2;\n    uint32_t TU_RESERVED1           : 16;\n    uint32_t TU_RESERVED2           : 8;\n  } bmCapabilities;\n}cdc_desc_func_telephone_call_state_reporting_capabilities_t;\n\n// TODO remove\nTU_ATTR_ALWAYS_INLINE static inline uint8_t cdc_functional_desc_typeof(uint8_t const * p_desc) {\n  return p_desc[2];\n}\n\n//--------------------------------------------------------------------+\n// Requests\n//--------------------------------------------------------------------+\ntypedef struct TU_ATTR_PACKED {\n  uint32_t bit_rate;\n  uint8_t  stop_bits; ///< 0: 1 stop bit - 1: 1.5 stop bits - 2: 2 stop bits\n  uint8_t  parity;    ///< 0: None - 1: Odd - 2: Even - 3: Mark - 4: Space\n  uint8_t  data_bits; ///< can be 5, 6, 7, 8 or 16\n} cdc_line_coding_t;\n\nTU_VERIFY_STATIC(sizeof(cdc_line_coding_t) == 7, \"size is not correct\");\n\ntypedef union TU_ATTR_PACKED {\n  struct TU_ATTR_PACKED {\n    uint8_t dtr : 1;\n    uint8_t rts : 1;\n    uint8_t     : 6;\n  };\n  uint8_t value;\n} cdc_line_control_state_t;\n\nTU_VERIFY_STATIC(sizeof(cdc_line_control_state_t) == 1, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// Notifications\n//--------------------------------------------------------------------+\n// PSTN 1.2 section 6.5.4 table 31\ntypedef union TU_ATTR_PACKED {\n  struct TU_ATTR_PACKED {\n    uint16_t bRxCarrier  : 1; // DCD\n    uint16_t bTxCarrier  : 1; // DSR\n    uint16_t bBreak      : 1; // Break Detected\n    uint16_t bRingSignal : 1;\n    uint16_t bFraming    : 1;\n    uint16_t bParity     : 1;\n    uint16_t bOverRun    : 1;\n    uint16_t             : 9;\n  };\n  struct TU_ATTR_PACKED {\n    uint16_t dcd : 1;\n    uint16_t dsr : 1;\n    uint16_t brk : 1;\n    uint16_t     :13;\n  };\n  uint16_t value;\n} cdc_notify_uart_state_t;\n\nTU_VERIFY_STATIC(sizeof(cdc_notify_uart_state_t) == 2, \"size is not correct\");\n\n// CDC 1.2 section 6.3.3 table 21\ntypedef struct TU_ATTR_PACKED {\n  uint32_t upstream_bitrate;\n  uint32_t downstream_bitrate;\n} cdc_notify_conn_speed_change_t;\n\ntypedef struct TU_ATTR_PACKED {\n  tusb_control_request_t request;\n  union {\n    cdc_notify_uart_state_t serial_state;\n    cdc_notify_conn_speed_change_t conn_speed_change;\n  };\n} cdc_notify_msg_t;\n\nTU_VERIFY_STATIC(sizeof(cdc_notify_msg_t) == 16, \"size is not correct\");\n\nTU_ATTR_PACKED_END  // End of all packed definitions\nTU_ATTR_BIT_FIELD_ORDER_END\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n\n/** @} */\n"
  },
  {
    "path": "src/class/cdc/cdc_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_CDC)\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"cdc_device.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUD_CDC_LOG_LEVEL\n  #define CFG_TUD_CDC_LOG_LEVEL   CFG_TUD_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUD_CDC_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t rhport;\n  uint8_t itf_num;\n  uint8_t ep_notify;\n  uint8_t line_state; // Bit 0: DTR, Bit 1: RTS\n\n  /*------------- From this point, data is not cleared by bus reset -------------*/\n  TU_ATTR_ALIGNED(4) cdc_line_coding_t line_coding;\n  char wanted_char;\n\n  tu_edpt_stream_t tx_stream;\n  tu_edpt_stream_t rx_stream;\n\n  uint8_t tx_ff_buf[CFG_TUD_CDC_TX_BUFSIZE];\n  uint8_t rx_ff_buf[CFG_TUD_CDC_RX_BUFSIZE];\n} cdcd_interface_t;\n\n#define ITF_MEM_RESET_SIZE offsetof(cdcd_interface_t, line_coding)\n\n// Skip local EP buffer if dedicated hw FIFO is supported\n#if CFG_TUD_EDPT_DEDICATED_HWFIFO == 0\ntypedef struct {\n  TUD_EPBUF_DEF(epout, CFG_TUD_CDC_RX_EPSIZE);\n  TUD_EPBUF_DEF(epin, CFG_TUD_CDC_TX_EPSIZE);\n\n  #if CFG_TUD_CDC_NOTIFY\n  TUD_EPBUF_TYPE_DEF(cdc_notify_msg_t, epnotify);\n  #endif\n} cdcd_epbuf_t;\n\nCFG_TUD_MEM_SECTION static cdcd_epbuf_t _cdcd_epbuf[CFG_TUD_CDC];\n#endif\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_cdc_rx_cb(uint8_t itf) {\n  (void)itf;\n}\n\nTU_ATTR_WEAK void tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char) {\n  (void)itf;\n  (void)wanted_char;\n}\n\nTU_ATTR_WEAK void tud_cdc_tx_complete_cb(uint8_t itf) {\n  (void)itf;\n}\n\nTU_ATTR_WEAK void tud_cdc_notify_complete_cb(uint8_t itf) {\n  (void)itf;\n}\n\nTU_ATTR_WEAK void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {\n  (void)itf;\n  (void)dtr;\n  (void)rts;\n}\n\nTU_ATTR_WEAK void tud_cdc_line_coding_cb(uint8_t itf, const cdc_line_coding_t *p_line_coding) {\n  (void)itf;\n  (void)p_line_coding;\n}\n\nTU_ATTR_WEAK void tud_cdc_send_break_cb(uint8_t itf, uint16_t duration_ms) {\n  (void)itf;\n  (void)duration_ms;\n}\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nstatic cdcd_interface_t _cdcd_itf[CFG_TUD_CDC];\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t find_cdc_itf(uint8_t ep_addr) {\n  for (uint8_t idx = 0; idx < CFG_TUD_CDC; idx++) {\n    const cdcd_interface_t *p_cdc = &_cdcd_itf[idx];\n    if (ep_addr == p_cdc->rx_stream.ep_addr || ep_addr == p_cdc->tx_stream.ep_addr ||\n        (ep_addr == p_cdc->ep_notify && ep_addr != 0)) {\n      return idx;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\n//--------------------------------------------------------------------+\n// APPLICATION API\n//--------------------------------------------------------------------+\nbool tud_cdc_n_ready(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_CDC);\n  TU_VERIFY(tud_ready());\n  const cdcd_interface_t *p_cdc = &_cdcd_itf[itf];\n\n  const bool in_opened  = tu_edpt_stream_is_opened(&p_cdc->tx_stream);\n  const bool out_opened = tu_edpt_stream_is_opened(&p_cdc->rx_stream);\n  return in_opened && out_opened;\n}\n\nbool tud_cdc_n_connected(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_CDC);\n  TU_VERIFY(tud_ready());\n  // DTR (bit 0) active  is considered as connected\n  return tu_bit_test(_cdcd_itf[itf].line_state, 0);\n}\n\nuint8_t tud_cdc_n_get_line_state(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_CDC, 0);\n  return _cdcd_itf[itf].line_state;\n}\n\nvoid tud_cdc_n_get_line_coding(uint8_t itf, cdc_line_coding_t *coding) {\n  TU_VERIFY(itf < CFG_TUD_CDC, );\n  (*coding) = _cdcd_itf[itf].line_coding;\n}\n\n#if CFG_TUD_CDC_NOTIFY\nbool tud_cdc_n_notify_msg(uint8_t itf, cdc_notify_msg_t *msg) {\n  TU_VERIFY(itf < CFG_TUD_CDC);\n  const cdcd_interface_t *p_cdc = &_cdcd_itf[itf];\n  TU_VERIFY(tud_ready() && p_cdc->ep_notify != 0);\n  TU_VERIFY(usbd_edpt_claim(p_cdc->rhport, p_cdc->ep_notify));\n\n    #if CFG_TUD_EDPT_DEDICATED_HWFIFO\n  cdc_notify_msg_t *msg_epbuf = msg;\n    #else\n  cdc_notify_msg_t *msg_epbuf = &_cdcd_epbuf[itf].epnotify;\n  *msg_epbuf                  = *msg;\n    #endif\n\n  msg_epbuf->request.wIndex = p_cdc->itf_num;\n\n  return usbd_edpt_xfer(p_cdc->rhport, p_cdc->ep_notify, (uint8_t *)msg_epbuf, 8 + msg_epbuf->request.wLength, false);\n}\n#endif\n\nvoid tud_cdc_n_set_wanted_char(uint8_t itf, char wanted) {\n  TU_VERIFY(itf < CFG_TUD_CDC, );\n  _cdcd_itf[itf].wanted_char = wanted;\n}\n\n//--------------------------------------------------------------------+\n// READ API\n//--------------------------------------------------------------------+\nuint32_t tud_cdc_n_available(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_CDC, 0);\n  return tu_edpt_stream_read_available(&_cdcd_itf[itf].rx_stream);\n}\n\nuint32_t tud_cdc_n_read(uint8_t itf, void* buffer, uint32_t bufsize) {\n  TU_VERIFY(itf < CFG_TUD_CDC, 0);\n  cdcd_interface_t *p_cdc = &_cdcd_itf[itf];\n  return tu_edpt_stream_read(&p_cdc->rx_stream, buffer, bufsize);\n}\n\nbool tud_cdc_n_peek(uint8_t itf, uint8_t *chr) {\n  TU_VERIFY(itf < CFG_TUD_CDC);\n  return tu_edpt_stream_peek(&_cdcd_itf[itf].rx_stream, chr);\n}\n\nvoid tud_cdc_n_read_flush(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_CDC, );\n  cdcd_interface_t *p_cdc = &_cdcd_itf[itf];\n  tu_edpt_stream_clear(&p_cdc->rx_stream);\n  tu_edpt_stream_read_xfer(&p_cdc->rx_stream);\n}\n\n//--------------------------------------------------------------------+\n// WRITE API\n//--------------------------------------------------------------------+\nuint32_t tud_cdc_n_write(uint8_t itf, const void* buffer, uint32_t bufsize) {\n  TU_VERIFY(itf < CFG_TUD_CDC, 0);\n  cdcd_interface_t *p_cdc = &_cdcd_itf[itf];\n  return tu_edpt_stream_write(&p_cdc->tx_stream, buffer, bufsize);\n}\n\nuint32_t tud_cdc_n_write_flush(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_CDC, 0);\n  cdcd_interface_t *p_cdc = &_cdcd_itf[itf];\n  return tu_edpt_stream_write_xfer(&p_cdc->tx_stream);\n}\n\nuint32_t tud_cdc_n_write_available(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_CDC, 0);\n  cdcd_interface_t *p_cdc = &_cdcd_itf[itf];\n  return tu_edpt_stream_write_available(&p_cdc->tx_stream);\n}\n\nbool tud_cdc_n_write_clear(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_CDC);\n  cdcd_interface_t *p_cdc = &_cdcd_itf[itf];\n  tu_edpt_stream_clear(&p_cdc->tx_stream);\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid cdcd_init(void) {\n  tu_memclr(_cdcd_itf, sizeof(_cdcd_itf));\n  for (uint8_t i = 0; i < CFG_TUD_CDC; i++) {\n    cdcd_interface_t *p_cdc   = &_cdcd_itf[i];\n    p_cdc->wanted_char = (char) -1;\n\n    // default line coding is : stop bit = 1, parity = none, data bits = 8\n    p_cdc->line_coding.bit_rate = 115200;\n    p_cdc->line_coding.stop_bits = 0;\n    p_cdc->line_coding.parity = 0;\n    p_cdc->line_coding.data_bits = 8;\n\n  #if CFG_TUD_EDPT_DEDICATED_HWFIFO\n    uint8_t *epout_buf = NULL;\n    uint8_t *epin_buf  = NULL;\n  #else\n    uint8_t *epout_buf = _cdcd_epbuf[i].epout;\n    uint8_t *epin_buf  = _cdcd_epbuf[i].epin;\n  #endif\n\n    tu_edpt_stream_init(&p_cdc->rx_stream, false, false, false, p_cdc->rx_ff_buf, CFG_TUD_CDC_RX_BUFSIZE, epout_buf);\n\n    // TX fifo can be configured to change to overwritable if not connected (DTR bit not set). Without DTR we do not\n    // know if data is actually polled by terminal. This way the most current data is prioritized.\n    // Default: is overwritable\n    tu_edpt_stream_init(&p_cdc->tx_stream, false, true, CFG_TUD_CDC_TX_OVERWRITABLE_IF_NOT_CONNECTED, p_cdc->tx_ff_buf,\n                        CFG_TUD_CDC_TX_BUFSIZE, epin_buf);\n  }\n}\n\nbool cdcd_deinit(void) {\n  for (uint8_t i = 0; i < CFG_TUD_CDC; i++) {\n    cdcd_interface_t* p_cdc = &_cdcd_itf[i];\n    tu_edpt_stream_deinit(&p_cdc->rx_stream);\n    tu_edpt_stream_deinit(&p_cdc->tx_stream);\n  }\n  return true;\n}\n\nvoid cdcd_reset(uint8_t rhport) {\n  (void) rhport;\n\n  for (uint8_t i = 0; i < CFG_TUD_CDC; i++) {\n    cdcd_interface_t* p_cdc = &_cdcd_itf[i];\n    tu_memclr(p_cdc, ITF_MEM_RESET_SIZE);\n\n    tu_fifo_set_overwritable(&p_cdc->tx_stream.ff, CFG_TUD_CDC_TX_OVERWRITABLE_IF_NOT_CONNECTED); // back to default\n    tu_edpt_stream_close(&p_cdc->rx_stream);\n    tu_edpt_stream_close(&p_cdc->tx_stream);\n  }\n}\n\nuint16_t cdcd_open(uint8_t rhport, const tusb_desc_interface_t* itf_desc, uint16_t max_len) {\n  // Only support ACM subclass\n  TU_VERIFY(TUSB_CLASS_CDC == itf_desc->bInterfaceClass &&\n              CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL == itf_desc->bInterfaceSubClass,\n            0);\n\n  const uint8_t cdc_id = find_cdc_itf(0); // Find available interface\n  TU_ASSERT(cdc_id < CFG_TUD_CDC, 0);\n  cdcd_interface_t *p_cdc = &_cdcd_itf[cdc_id];\n\n  //------------- Control Interface -------------//\n  p_cdc->rhport = rhport;\n  p_cdc->itf_num = itf_desc->bInterfaceNumber;\n\n  const uint8_t *p_desc   = (const uint8_t *)itf_desc;\n  const uint8_t *desc_end = p_desc + max_len;\n\n  // Skip all class-specific descriptor\n  p_desc = tu_desc_next(itf_desc);\n  while (tu_desc_in_bounds(p_desc, desc_end) && TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc)) {\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  // notification endpoint (optional)\n  if (TUSB_DESC_ENDPOINT == tu_desc_type(p_desc)) {\n    const tusb_desc_endpoint_t* desc_ep = (const tusb_desc_endpoint_t*) p_desc;\n    TU_ASSERT(usbd_edpt_open(rhport, desc_ep), 0);\n    p_cdc->ep_notify = desc_ep->bEndpointAddress;\n\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  //------------- Data Interface (optional) -------------//\n  if (TUSB_DESC_INTERFACE == tu_desc_type(p_desc)) {\n    const tusb_desc_interface_t *data_itf_desc = (const tusb_desc_interface_t *)p_desc;\n    if (TUSB_CLASS_CDC_DATA == data_itf_desc->bInterfaceClass) {\n      for (uint8_t e = 0; e < data_itf_desc->bNumEndpoints; e++) {\n        if (!tu_desc_in_bounds(p_desc, desc_end)) {\n          break;\n        }\n        p_desc = tu_desc_next(p_desc);\n\n        const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)p_desc;\n        TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && TUSB_XFER_BULK == desc_ep->bmAttributes.xfer, 0);\n\n        TU_ASSERT(usbd_edpt_open(rhport, desc_ep), 0);\n        if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN) {\n          tu_edpt_stream_t *stream_tx = &p_cdc->tx_stream;\n          tu_edpt_stream_open(stream_tx, rhport, desc_ep, CFG_TUD_CDC_TX_EPSIZE);\n\n  #if CFG_TUD_CDC_TX_PERSISTENT\n          tu_edpt_stream_write_xfer(stream_tx); // flush pending data\n  #else\n          tu_edpt_stream_clear(stream_tx);\n  #endif\n        } else {\n          tu_edpt_stream_t *stream_rx = &p_cdc->rx_stream;\n  #if CFG_TUD_CDC_RX_NEED_ZLP\n          const uint16_t xfer_len = CFG_TUD_CDC_RX_EPSIZE;\n  #else\n          const uint16_t xfer_len = tu_edpt_packet_size(desc_ep);\n  #endif\n\n          tu_edpt_stream_open(stream_rx, rhport, desc_ep, xfer_len);\n\n  #if !CFG_TUD_CDC_RX_PERSISTENT\n          tu_edpt_stream_clear(stream_rx);\n  #endif\n\n          TU_ASSERT(tu_edpt_stream_read_xfer(stream_rx) > 0, 0); // prepare for incoming data\n        }\n      }\n\n      p_desc = tu_desc_next(p_desc);\n    }\n  }\n\n  return (uint16_t)(p_desc - (const uint8_t *)itf_desc);\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool cdcd_control_xfer_cb(uint8_t rhport, uint8_t stage, const tusb_control_request_t* request) {\n  // Handle class request only\n  TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);\n\n  uint8_t itf;\n  cdcd_interface_t* p_cdc;\n\n  // Identify which interface to use\n  for (itf = 0; itf < CFG_TUD_CDC; itf++) {\n    p_cdc = &_cdcd_itf[itf];\n    if (p_cdc->itf_num == request->wIndex) {\n      break;\n    }\n  }\n  TU_VERIFY(itf < CFG_TUD_CDC);\n\n  switch (request->bRequest) {\n    case CDC_REQUEST_SET_LINE_CODING:\n      if (stage == CONTROL_STAGE_SETUP) {\n        TU_LOG_DRV(\"  Set Line Coding\\r\\n\");\n        tud_control_xfer(rhport, request, &p_cdc->line_coding, sizeof(cdc_line_coding_t));\n      } else if (stage == CONTROL_STAGE_ACK) {\n        tud_cdc_line_coding_cb(itf, &p_cdc->line_coding);\n      } else {\n        // nothing to do\n      }\n      break;\n\n    case CDC_REQUEST_GET_LINE_CODING:\n      if (stage == CONTROL_STAGE_SETUP) {\n        TU_LOG_DRV(\"  Get Line Coding\\r\\n\");\n        tud_control_xfer(rhport, request, &p_cdc->line_coding, sizeof(cdc_line_coding_t));\n      }\n      break;\n\n    case CDC_REQUEST_SET_CONTROL_LINE_STATE:\n      if (stage == CONTROL_STAGE_SETUP) {\n        tud_control_status(rhport, request);\n      } else if (stage == CONTROL_STAGE_ACK) {\n        // CDC PSTN v1.2 section 6.3.12\n        // Bit 0: Indicates if DTE is present or not.\n        //        This signal corresponds to V.24 signal 108/2 and RS-232 signal DTR (Data Terminal Ready)\n        // Bit 1: Carrier control for half-duplex modems.\n        //        This signal corresponds to V.24 signal 105 and RS-232 signal RTS (Request to Send)\n        bool const dtr = tu_bit_test(request->wValue, 0);\n        bool const rts = tu_bit_test(request->wValue, 1);\n\n        p_cdc->line_state = (uint8_t) request->wValue;\n\n        // If enabled: fifo overwriting is disabled if DTR bit is set and vice versa\n  #if CFG_TUD_CDC_TX_OVERWRITABLE_IF_NOT_CONNECTED\n        const bool is_overwritable = !dtr;\n  #else\n        const bool is_overwritable = false;\n  #endif\n\n        tu_fifo_set_overwritable(&p_cdc->tx_stream.ff, is_overwritable);\n        TU_LOG_DRV(\"  Set Control Line State: DTR = %d, RTS = %d\\r\\n\", dtr, rts);\n        tud_cdc_line_state_cb(itf, dtr, rts); // invoke callback\n      } else {\n        // nothing to do\n      }\n      break;\n\n    case CDC_REQUEST_SEND_BREAK:\n      if (stage == CONTROL_STAGE_SETUP) {\n        tud_control_status(rhport, request);\n      } else if (stage == CONTROL_STAGE_ACK) {\n        TU_LOG_DRV(\"  Send Break\\r\\n\");\n        tud_cdc_send_break_cb(itf, request->wValue);\n      } else {\n        // nothing to do\n      }\n      break;\n\n    default:\n      return false; // stall unsupported request\n  }\n\n  return true;\n}\n\nbool cdcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void)rhport;\n  (void)result;\n\n  uint8_t itf = find_cdc_itf(ep_addr);\n  TU_ASSERT(itf < CFG_TUD_CDC);\n  cdcd_interface_t *p_cdc     = &_cdcd_itf[itf];\n  tu_edpt_stream_t *stream_rx = &p_cdc->rx_stream;\n  tu_edpt_stream_t *stream_tx = &p_cdc->tx_stream;\n\n  // Received new data, move to fifo\n  if (ep_addr == stream_rx->ep_addr) {\n    tu_edpt_stream_read_xfer_complete(stream_rx, xferred_bytes);\n\n    // Check for wanted char and invoke wanted callback\n    if (((signed char)p_cdc->wanted_char) != -1) {\n      tu_fifo_buffer_info_t buf_info;\n      tu_fifo_get_read_info(&stream_rx->ff, &buf_info);\n\n      // find backward\n      uint8_t *ptr;\n      if (buf_info.wrapped.len > 0) {\n        ptr = buf_info.wrapped.ptr + buf_info.wrapped.len - 1; // last byte of wrap buffer\n      } else if (buf_info.linear.len > 0) {\n        ptr = buf_info.linear.ptr + buf_info.linear.len - 1;   // last byte of linear buffer\n      } else {\n        ptr = NULL;                                      // no data\n      }\n\n      if (ptr != NULL) {\n        for (uint32_t i = 0; i < xferred_bytes; i++) {\n          if (p_cdc->wanted_char == (char)*ptr) {\n            tud_cdc_rx_wanted_cb(itf, p_cdc->wanted_char);\n            break; // only invoke once per transfer, even if multiple wanted chars are present\n          }\n\n          if (ptr == buf_info.wrapped.ptr) {\n            ptr = buf_info.linear.ptr + buf_info.linear.len - 1; // last byte of linear buffer\n          } else if (ptr == buf_info.linear.ptr) {\n            break;                                         // reached the beginning\n          } else {\n            ptr--;\n          }\n        }\n      }\n    }\n\n    // invoke receive callback if there is still data\n    if (!tu_edpt_stream_empty(stream_rx)) {\n      tud_cdc_rx_cb(itf);\n    }\n\n    tu_edpt_stream_read_xfer(stream_rx); // prepare for more data\n  }\n\n  // Data sent to host, we continue to fetch from tx fifo to send.\n  // Note: This will cause incorrect baudrate set in line coding. Though maybe the baudrate is not really important!\n  if (ep_addr == stream_tx->ep_addr) {\n    tud_cdc_tx_complete_cb(itf); // invoke callback to possibly refill tx fifo\n\n    if (0 == tu_edpt_stream_write_xfer(stream_tx)) {\n      // If there is no data left, a ZLP should be sent if needed\n      tu_edpt_stream_write_zlp_if_needed(stream_tx, xferred_bytes);\n    }\n  }\n\n  // Sent notification to host\n  if (ep_addr == p_cdc->ep_notify) {\n    tud_cdc_notify_complete_cb(itf);\n  }\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/cdc/cdc_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_CDC_DEVICE_H_\n#define TUSB_CDC_DEVICE_H_\n\n#include \"cdc.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n#ifndef CFG_TUD_CDC_NOTIFY\n  #define CFG_TUD_CDC_NOTIFY    0\n#endif\n\n#ifndef CFG_TUD_CDC_TX_BUFSIZE\n  #define CFG_TUD_CDC_TX_BUFSIZE TUD_EPSIZE_BULK_MAX\n#endif\n\n#ifndef CFG_TUD_CDC_RX_BUFSIZE\n  #define CFG_TUD_CDC_RX_BUFSIZE TUD_EPSIZE_BULK_MAX\n#endif\n\n// EP_BUFSIZE is separated to RX_EPSIZE and TX_EPSIZE\n#ifndef CFG_TUD_CDC_RX_EPSIZE\n  #ifdef CFG_TUD_CDC_EP_BUFSIZE\n    #define CFG_TUD_CDC_RX_EPSIZE CFG_TUD_CDC_EP_BUFSIZE\n  #else\n    #define CFG_TUD_CDC_RX_EPSIZE TUD_EPSIZE_BULK_MAX\n  #endif\n#endif\n\n#ifndef CFG_TUD_CDC_TX_EPSIZE\n  #ifdef CFG_TUD_CDC_EP_BUFSIZE\n    #define CFG_TUD_CDC_TX_EPSIZE  CFG_TUD_CDC_EP_BUFSIZE\n  #else\n    #define CFG_TUD_CDC_TX_EPSIZE TUD_EPSIZE_BULK_MAX\n  #endif\n#endif\n\n// Enable multi-packet RX transfer with ZLP termination for better throughput. Requires host support for ZLP.\n#ifndef CFG_TUD_CDC_RX_NEED_ZLP\n  #define CFG_TUD_CDC_RX_NEED_ZLP 0\n#endif\n\n// Keep rx fifo data even with bus reset or disconnect\n#ifndef CFG_TUD_CDC_RX_PERSISTENT\n  #define CFG_TUD_CDC_RX_PERSISTENT 0\n#endif\n\n// Keep tx fifo data even with bus reset or disconnect\n#ifndef CFG_TUD_CDC_TX_PERSISTENT\n  #define CFG_TUD_CDC_TX_PERSISTENT 0\n#endif\n\n// If not connected, tx fifo can be overwritten\n#ifndef CFG_TUD_CDC_TX_OVERWRITABLE_IF_NOT_CONNECTED\n  #define CFG_TUD_CDC_TX_OVERWRITABLE_IF_NOT_CONNECTED 1\n#endif\n\n// Backward compatible: tud_cdc_configure_t and tud_cdc_configure() are no longer used.\n// Configuration is now done via compile-time macros above.\ntypedef struct {\n  bool rx_persistent;\n  bool tx_persistent;\n  bool tx_overwritabe_if_not_connected;\n} tud_cdc_configure_t;\n\n#define tud_cdc_configure(_cfg)          ((void)(_cfg))\n#define tud_cdc_configure_fifo_t         tud_cdc_configure_t\n#define tud_cdc_configure_fifo(_cfg)     ((void)(_cfg))\n\n//--------------------------------------------------------------------+\n// Application API (Multiple Ports) i.e. CFG_TUD_CDC > 1\n//--------------------------------------------------------------------+\n\n// Check if the interface is ready\nbool tud_cdc_n_ready(uint8_t itf);\n\n// Check if the terminal is connected to this port\nbool tud_cdc_n_connected(uint8_t itf);\n\n// Get the current line state. Bit 0:  DTR (Data Terminal Ready), Bit 1: RTS (Request to Send)\nuint8_t tud_cdc_n_get_line_state(uint8_t itf);\n\n// Get current line encoding: bit rate, stop bits parity etc ..\nvoid tud_cdc_n_get_line_coding(uint8_t itf, cdc_line_coding_t* coding);\n\n// Set special character that will trigger tud_cdc_rx_wanted_cb() callback on receiving\nvoid tud_cdc_n_set_wanted_char(uint8_t itf, char wanted);\n\n// Get the number of bytes available for reading\nuint32_t tud_cdc_n_available(uint8_t itf);\n\n// Read received bytes\nuint32_t tud_cdc_n_read(uint8_t itf, void* buffer, uint32_t bufsize);\n\n// Read a byte, return -1 if there is none\nTU_ATTR_ALWAYS_INLINE static inline int32_t tud_cdc_n_read_char(uint8_t itf) {\n  uint8_t ch;\n  return tud_cdc_n_read(itf, &ch, 1) ? (int32_t) ch : -1;\n}\n\n// Clear the received FIFO\nvoid tud_cdc_n_read_flush(uint8_t itf);\n\n// Get a byte from FIFO without removing it\nbool tud_cdc_n_peek(uint8_t itf, uint8_t* ui8);\n\n// Write bytes to TX FIFO, data may remain in the FIFO for a while\nuint32_t tud_cdc_n_write(uint8_t itf, void const* buffer, uint32_t bufsize);\n\n// Write a byte\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_n_write_char(uint8_t itf, char ch) {\n  return tud_cdc_n_write(itf, &ch, 1);\n}\n\n// Write a null-terminated string\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_n_write_str(uint8_t itf, char const* str) {\n  return tud_cdc_n_write(itf, str, strlen(str));\n}\n\n// Force sending data if possible, return number of forced bytes\nuint32_t tud_cdc_n_write_flush(uint8_t itf);\n\n// Return the number of bytes (characters) available for writing to TX FIFO buffer in a single n_write operation.\nuint32_t tud_cdc_n_write_available(uint8_t itf);\n\n// Clear the TX FIFO\nbool tud_cdc_n_write_clear(uint8_t itf);\n\n#if CFG_TUD_CDC_NOTIFY\nbool tud_cdc_n_notify_msg(uint8_t itf, cdc_notify_msg_t *msg);\n\n// Send UART status notification: DCD, DSR etc ..\nTU_ATTR_ALWAYS_INLINE static inline bool tud_cdc_n_notify_uart_state(uint8_t                        itf,\n                                                                     const cdc_notify_uart_state_t *state) {\n  cdc_notify_msg_t notify_msg;\n  notify_msg.request.bmRequestType = CDC_REQ_TYPE_NOTIF;\n  notify_msg.request.bRequest      = CDC_NOTIF_SERIAL_STATE;\n  notify_msg.request.wValue        = 0;\n  notify_msg.request.wIndex        = 0; // filled later\n  notify_msg.request.wLength       = sizeof(cdc_notify_uart_state_t);\n  notify_msg.serial_state          = *state;\n  return tud_cdc_n_notify_msg(itf, &notify_msg);\n}\n\n// Send connection speed change notification\nTU_ATTR_ALWAYS_INLINE static inline bool\ntud_cdc_n_notify_conn_speed_change(uint8_t itf, const cdc_notify_conn_speed_change_t *conn_speed_change) {\n  cdc_notify_msg_t notify_msg;\n  notify_msg.request.bmRequestType = CDC_REQ_TYPE_NOTIF;\n  notify_msg.request.bRequest      = CDC_NOTIF_CONNECTION_SPEED_CHANGE;\n  notify_msg.request.wValue        = 0;\n  notify_msg.request.wIndex        = 0; // filled later\n  notify_msg.request.wLength       = sizeof(cdc_notify_conn_speed_change_t);\n  notify_msg.conn_speed_change     = *conn_speed_change;\n  return tud_cdc_n_notify_msg(itf, &notify_msg);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_cdc_notify_msg(cdc_notify_msg_t *msg) {\n  return tud_cdc_n_notify_msg(0, msg);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_cdc_notify_uart_state(const cdc_notify_uart_state_t* state) {\n return tud_cdc_n_notify_uart_state(0, state);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_cdc_notify_conn_speed_change(const cdc_notify_conn_speed_change_t* conn_speed_change) {\n  return tud_cdc_n_notify_conn_speed_change(0, conn_speed_change);\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Application API (Single Port)\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_cdc_ready(void) {\n  return tud_cdc_n_ready(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_cdc_connected(void) {\n  return tud_cdc_n_connected(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tud_cdc_get_line_state(void) {\n  return tud_cdc_n_get_line_state(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tud_cdc_get_line_coding(cdc_line_coding_t* coding) {\n  tud_cdc_n_get_line_coding(0, coding);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tud_cdc_set_wanted_char(char wanted) {\n  tud_cdc_n_set_wanted_char(0, wanted);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_available(void) {\n  return tud_cdc_n_available(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline int32_t tud_cdc_read_char(void) {\n  return tud_cdc_n_read_char(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_read(void* buffer, uint32_t bufsize) {\n  return tud_cdc_n_read(0, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tud_cdc_read_flush(void) {\n  tud_cdc_n_read_flush(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_cdc_peek(uint8_t* ui8) {\n  return tud_cdc_n_peek(0, ui8);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_write_char(char ch) {\n  return tud_cdc_n_write_char(0, ch);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_write(void const* buffer, uint32_t bufsize) {\n  return tud_cdc_n_write(0, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_write_str(char const* str) {\n  return tud_cdc_n_write_str(0, str);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_write_flush(void) {\n  return tud_cdc_n_write_flush(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_cdc_write_available(void) {\n  return tud_cdc_n_write_available(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_cdc_write_clear(void) {\n  return tud_cdc_n_write_clear(0);\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API\n//--------------------------------------------------------------------+\n\n// Invoked when received new data\nvoid tud_cdc_rx_cb(uint8_t itf);\n\n// Invoked when received `wanted_char`\nvoid tud_cdc_rx_wanted_cb(uint8_t itf, char wanted_char);\n\n// Invoked when a TX is complete and therefore space becomes available in TX buffer\nvoid tud_cdc_tx_complete_cb(uint8_t itf);\n\n// Invoked when a notification is sent to host\nvoid tud_cdc_notify_complete_cb(uint8_t itf);\n\n// Invoked when line state DTR & RTS are changed via SET_CONTROL_LINE_STATE\nvoid tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts);\n\n// Invoked when line coding is change via SET_LINE_CODING\nvoid tud_cdc_line_coding_cb(uint8_t itf, cdc_line_coding_t const* p_line_coding);\n\n// Invoked when received send break\n// \\param[in]  itf  interface for which send break was received.\n// \\param[in]  duration_ms  the length of time, in milliseconds, of the break signal. If a value of FFFFh, then the\n//                          device will send a break until another SendBreak request is received with value 0000h.\nvoid tud_cdc_send_break_cb(uint8_t itf, uint16_t duration_ms);\n\n//--------------------------------------------------------------------+\n// INTERNAL USBD-CLASS DRIVER API\n//--------------------------------------------------------------------+\nvoid     cdcd_init            (void);\nbool     cdcd_deinit          (void);\nvoid     cdcd_reset           (uint8_t rhport);\nuint16_t cdcd_open            (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     cdcd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\nbool     cdcd_xfer_cb         (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CDC_DEVICE_H_ */\n"
  },
  {
    "path": "src/class/cdc/cdc_host.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n *\n * Contribution\n * - Heiko Kuester: add support of CH34x & PL2303, improve support of FTDI & CP210x\n */\n\n#include \"tusb_option.h\"\n\n#include <stdint.h>\n\n#if (CFG_TUH_ENABLED && CFG_TUH_CDC)\n\n#include \"host/usbh.h\"\n#include \"host/usbh_pvt.h\"\n\n#include \"cdc_host.h\"\n#include \"serial/ftdi_sio.h\"\n#include \"serial/cp210x.h\"\n#include \"serial/ch34x.h\"\n#include \"serial/pl2303.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n  #ifndef CFG_TUH_CDC_LOG_LEVEL\n    #define CFG_TUH_CDC_LOG_LEVEL 2\n  #endif\n\n  #define TU_LOG_DRV(...) TU_LOG(CFG_TUH_CDC_LOG_LEVEL, __VA_ARGS__)\n  #define TU_LOG_CDC(_cdc, _format, ...)                                                \\\n    TU_LOG_DRV(\"[:%u:%u] CDCh %s \" _format \"\\r\\n\", _cdc->daddr, _cdc->bInterfaceNumber, \\\n               serial_drivers[_cdc->serial_drid].name, ##__VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// Host CDC Interface\n//--------------------------------------------------------------------+\n\ntypedef struct {\n  uint8_t daddr;\n  uint8_t bInterfaceNumber;\n  uint8_t bInterfaceSubClass;\n  uint8_t bInterfaceProtocol;\n\n  uint8_t ep_notif;\n  uint8_t serial_drid; // Serial Driver ID\n  bool mounted;        // Enumeration is complete\n\n  struct {\n    TU_ATTR_ALIGNED(4) cdc_line_coding_t coding; // Baudrate, stop bits, parity, data width\n    cdc_line_control_state_t control_state;      // DTR, RTS\n  } line, requested_line;\n\n  tuh_xfer_cb_t user_complete_cb; // required since we handle request internally first\n\n  union {\n    struct {\n      cdc_acm_capability_t capability;\n    } acm;\n\n    #if CFG_TUH_CDC_FTDI\n    ftdi_private_t ftdi;\n    #endif\n\n    #if CFG_TUH_CDC_PL2303\n    pl2303_private_t pl2303;\n    #endif\n  };\n\n  struct {\n    tu_edpt_stream_t tx;\n    tu_edpt_stream_t rx;\n\n    uint8_t tx_ff_buf[CFG_TUH_CDC_TX_BUFSIZE];\n    uint8_t rx_ff_buf[CFG_TUH_CDC_RX_BUFSIZE];\n  } stream;\n} cdch_interface_t;\n\ntypedef struct {\n  TUH_EPBUF_DEF(tx, CFG_TUH_CDC_TX_EPSIZE);\n  TUH_EPBUF_DEF(rx, CFG_TUH_CDC_RX_EPSIZE);\n} cdch_epbuf_t;\n\nstatic cdch_interface_t cdch_data[CFG_TUH_CDC];\nCFG_TUH_MEM_SECTION static cdch_epbuf_t cdch_epbuf[CFG_TUH_CDC];\n\n//--------------------------------------------------------------------+\n// Serial Driver\n//--------------------------------------------------------------------+\n\n// General driver\nstatic void cdch_process_set_config(tuh_xfer_t *xfer);\nstatic void cdch_process_line_state_on_enum(tuh_xfer_t *xfer); // invoked after set config is processed\nstatic void cdch_internal_control_complete(tuh_xfer_t *xfer);\nstatic void cdch_set_line_coding_stage1_baudrate_complete(tuh_xfer_t *xfer);\nstatic void cdch_set_line_coding_stage2_data_format_complete(tuh_xfer_t *xfer);\n\n//------------- ACM prototypes -------------//\nstatic uint16_t acm_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nstatic bool     acm_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic void     acm_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic bool     acm_set_line_coding(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\nstatic bool     acm_set_control_line_state(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n  //------------- FTDI prototypes -------------//\n  #if CFG_TUH_CDC_FTDI\nstatic uint16_t const ftdi_vid_pid_list[][2] = {CFG_TUH_CDC_FTDI_VID_PID_LIST};\n\nstatic uint16_t ftdi_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nstatic bool     ftdi_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic void     ftdi_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic bool     ftdi_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\nstatic bool     ftdi_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\nstatic bool     ftdi_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n  #endif\n\n  //------------- CP210X prototypes -------------//\n  #if CFG_TUH_CDC_CP210X\nstatic uint16_t const cp210x_vid_pid_list[][2] = {CFG_TUH_CDC_CP210X_VID_PID_LIST};\n\nstatic uint16_t cp210x_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nstatic bool     cp210x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic void     cp210x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic bool     cp210x_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\nstatic bool     cp210x_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\nstatic bool     cp210x_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n  #endif\n\n  //------------- CH34x prototypes -------------//\n  #if CFG_TUH_CDC_CH34X\nstatic uint16_t const ch34x_vid_pid_list[][2] = {CFG_TUH_CDC_CH34X_VID_PID_LIST};\n\nstatic uint16_t ch34x_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nstatic bool     ch34x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic void     ch34x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic bool     ch34x_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\nstatic bool     ch34x_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\nstatic bool     ch34x_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n  #endif\n\n  //------------- PL2303 prototypes -------------//\n  #if CFG_TUH_CDC_PL2303\nstatic uint16_t const pl2303_vid_pid_list[][2] = {CFG_TUH_CDC_PL2303_VID_PID_LIST};\nstatic const pl2303_type_data_t pl2303_type_data[PL2303_TYPE_COUNT] = {PL2303_TYPE_DATA};\n\nstatic uint16_t pl2303_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nstatic bool     pl2303_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic void     pl2303_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\nstatic bool     pl2303_set_line_coding(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\nstatic bool     pl2303_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n  #endif\n\n//------------- Common -------------//\nenum {\n  SERIAL_DRIVER_ACM = 0,\n\n#if CFG_TUH_CDC_FTDI\n  SERIAL_DRIVER_FTDI,\n#endif\n\n#if CFG_TUH_CDC_CP210X\n  SERIAL_DRIVER_CP210X,\n#endif\n\n#if CFG_TUH_CDC_CH34X\n  SERIAL_DRIVER_CH34X,\n#endif\n\n#if CFG_TUH_CDC_PL2303\n  SERIAL_DRIVER_PL2303,\n#endif\n\n  SERIAL_DRIVER_COUNT\n};\n\ntypedef bool (*serial_driver_func_t)(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\ntypedef struct {\n  const uint16_t (*vid_pid_list)[2];\n  const uint16_t vid_pid_count;\n  uint16_t (*const open)(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\n  bool (*const process_set_config)(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\n  // internal request complete handler to update line state\n  void (*const request_complete)(cdch_interface_t *p_cdc, tuh_xfer_t *xfer);\n\n  serial_driver_func_t set_control_line_state, set_baudrate, set_data_format, set_line_coding;\n\n  #if CFG_TUSB_DEBUG && CFG_TUSB_DEBUG >= CFG_TUH_CDC_LOG_LEVEL\n  const char * name;\n  #endif\n} cdch_serial_driver_t;\n\n#if CFG_TUSB_DEBUG >= CFG_TUH_CDC_LOG_LEVEL\n  #define DRIVER_NAME_DECLARE(_str)  .name = _str\n#else\n  #define DRIVER_NAME_DECLARE(_str)\n#endif\n\n// clang-format off\n// Note driver list must be in the same order as SERIAL_DRIVER enum\nstatic const cdch_serial_driver_t serial_drivers[] = {\n  {\n    .vid_pid_list           = NULL,\n    .vid_pid_count          = 0,\n    .open                   = acm_open,\n    .process_set_config     = acm_process_set_config,\n    .request_complete       = acm_internal_control_complete,\n    .set_control_line_state = acm_set_control_line_state,\n    .set_baudrate           = acm_set_line_coding,\n    .set_data_format        = acm_set_line_coding,\n    .set_line_coding        = acm_set_line_coding,\n    DRIVER_NAME_DECLARE(\"ACM\")\n  },\n\n  #if CFG_TUH_CDC_FTDI\n  {\n    .vid_pid_list           = ftdi_vid_pid_list,\n    .vid_pid_count          = TU_ARRAY_SIZE(ftdi_vid_pid_list),\n    .open                   = ftdi_open,\n    .process_set_config     = ftdi_process_set_config,\n    .request_complete       = ftdi_internal_control_complete,\n    .set_control_line_state = ftdi_set_modem_ctrl,\n    .set_baudrate           = ftdi_set_baudrate,\n    .set_data_format        = ftdi_set_data_format,\n    .set_line_coding        = NULL, // 2 stage set line coding\n    DRIVER_NAME_DECLARE(\"FTDI\")\n  },\n  #endif\n\n  #if CFG_TUH_CDC_CP210X\n  {\n    .vid_pid_list           = cp210x_vid_pid_list,\n    .vid_pid_count          = TU_ARRAY_SIZE(cp210x_vid_pid_list),\n    .open                   = cp210x_open,\n    .process_set_config     = cp210x_process_set_config,\n    .request_complete       = cp210x_internal_control_complete,\n    .set_control_line_state = cp210x_set_modem_ctrl,\n    .set_baudrate           = cp210x_set_baudrate,\n    .set_data_format        = cp210x_set_data_format,\n    .set_line_coding        = NULL, // 2 stage set line coding\n    DRIVER_NAME_DECLARE(\"CP210x\")\n  },\n  #endif\n\n  #if CFG_TUH_CDC_CH34X\n  {\n    .vid_pid_list           = ch34x_vid_pid_list,\n    .vid_pid_count          = TU_ARRAY_SIZE(ch34x_vid_pid_list),\n    .open                   = ch34x_open,\n    .process_set_config     = ch34x_process_set_config,\n    .request_complete       = ch34x_internal_control_complete,\n\n    .set_control_line_state = ch34x_set_modem_ctrl,\n    .set_baudrate           = ch34x_set_baudrate,\n    .set_data_format        = ch34x_set_data_format,\n    .set_line_coding        = NULL, // 2 stage set line coding\n    DRIVER_NAME_DECLARE(\"CH34x\")\n  },\n  #endif\n\n  #if CFG_TUH_CDC_PL2303\n  {\n    .vid_pid_list           = pl2303_vid_pid_list,\n    .vid_pid_count          = TU_ARRAY_SIZE(pl2303_vid_pid_list),\n    .open                   = pl2303_open,\n    .process_set_config     = pl2303_process_set_config,\n    .request_complete       = pl2303_internal_control_complete,\n    .set_control_line_state = pl2303_set_modem_ctrl,\n    .set_baudrate           = pl2303_set_line_coding,\n    .set_data_format        = pl2303_set_line_coding,\n    .set_line_coding        = pl2303_set_line_coding,\n    DRIVER_NAME_DECLARE(\"PL2303\")\n  }\n  #endif\n};\n// clang-format on\n\nTU_VERIFY_STATIC(TU_ARRAY_SIZE(serial_drivers) == SERIAL_DRIVER_COUNT, \"Serial driver count mismatch\");\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nstatic bool open_ep_stream_pair(cdch_interface_t *p_cdc, const tusb_desc_endpoint_t *desc_ep);\n\nTU_ATTR_ALWAYS_INLINE static inline cdch_interface_t * get_itf(uint8_t idx) {\n  TU_ASSERT(idx < CFG_TUH_CDC, NULL);\n  cdch_interface_t * p_cdc = &cdch_data[idx];\n  return (p_cdc->daddr != 0) ? p_cdc : NULL;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t get_idx_by_ptr(cdch_interface_t* p_cdc) {\n  return (uint8_t) (p_cdc - cdch_data);\n}\n\nstatic inline uint8_t get_idx_by_ep_addr(uint8_t daddr, uint8_t ep_addr) {\n  for(uint8_t i=0; i<CFG_TUH_CDC; i++) {\n    cdch_interface_t * p_cdc = &cdch_data[i];\n    if ((p_cdc->daddr == daddr) &&\n         (ep_addr == p_cdc->ep_notif || ep_addr == p_cdc->stream.rx.ep_addr || ep_addr == p_cdc->stream.tx.ep_addr)) {\n      return i;\n    }\n  }\n\n  return TUSB_INDEX_INVALID_8;\n}\n\n// determine the interface from the completed transfer\nstatic cdch_interface_t* get_itf_by_xfer(const tuh_xfer_t * xfer) {\n  TU_VERIFY(xfer->daddr != 0, NULL);\n  for(uint8_t i=0; i<CFG_TUH_CDC; i++) {\n    cdch_interface_t * p_cdc = &cdch_data[i];\n    if (p_cdc->daddr == xfer->daddr) {\n      switch (p_cdc->serial_drid) {\n        #if CFG_TUH_CDC_CP210X\n        case SERIAL_DRIVER_CP210X:\n        #endif\n        case SERIAL_DRIVER_ACM: {\n          // Driver use wIndex for bInterfaceNumber\n          const uint8_t itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n          if (p_cdc->bInterfaceNumber == itf_num) {\n            return p_cdc;\n          }\n          break;\n        }\n\n        #if CFG_TUH_CDC_FTDI\n        case SERIAL_DRIVER_FTDI: {\n          // FTDI uses wIndex for channel number, if channel is 0 then it is the default channel\n          const uint8_t channel = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n          if (p_cdc->ftdi.channel == 0 || p_cdc->ftdi.channel == channel) {\n            return p_cdc;\n          }\n          break;\n        }\n        #endif\n\n        #if CFG_TUH_CDC_CH34X\n        case SERIAL_DRIVER_CH34X:\n          // ch34x has only one interface\n          return p_cdc;\n        #endif\n\n        #if CFG_TUH_CDC_PL2303\n        case SERIAL_DRIVER_PL2303:\n          // pl2303 has only one interface\n          return p_cdc;\n        #endif\n\n        default:\n          break; // unknown driver\n      }\n    }\n  }\n\n  return NULL;\n}\n\nstatic cdch_interface_t * make_new_itf(uint8_t daddr, tusb_desc_interface_t const * itf_desc) {\n  for(uint8_t i=0; i<CFG_TUH_CDC; i++) {\n    if (cdch_data[i].daddr == 0) {\n      cdch_interface_t * p_cdc = &cdch_data[i];\n      p_cdc->daddr              = daddr;\n      p_cdc->bInterfaceNumber   = itf_desc->bInterfaceNumber;\n      p_cdc->bInterfaceSubClass = itf_desc->bInterfaceSubClass;\n      p_cdc->bInterfaceProtocol = itf_desc->bInterfaceProtocol;\n      p_cdc->line.coding        = (cdc_line_coding_t) { 0, 0, 0, 0 };\n      p_cdc->line.control_state.value = 0;\n      return p_cdc;\n    }\n  }\n\n  return NULL;\n}\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tuh_cdc_mount_cb(uint8_t idx) {\n  (void) idx;\n}\n\nTU_ATTR_WEAK void tuh_cdc_umount_cb(uint8_t idx) {\n  (void) idx;\n}\n\nTU_ATTR_WEAK void tuh_cdc_rx_cb(uint8_t idx) {\n  (void) idx;\n}\n\nTU_ATTR_WEAK void tuh_cdc_tx_complete_cb(uint8_t idx) {\n  (void) idx;\n}\n\n//--------------------------------------------------------------------+\n// APPLICATION API\n//--------------------------------------------------------------------+\n\nuint8_t tuh_cdc_itf_get_index(uint8_t daddr, uint8_t itf_num) {\n  for (uint8_t i = 0; i < CFG_TUH_CDC; i++) {\n    const cdch_interface_t * p_cdc = &cdch_data[i];\n    if (p_cdc->daddr == daddr && p_cdc->bInterfaceNumber == itf_num) { return i; }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\nbool tuh_cdc_itf_get_info(uint8_t idx, tuh_itf_info_t * info) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc && info);\n\n  info->daddr = p_cdc->daddr;\n\n  // re-construct interface descriptor\n  tusb_desc_interface_t * desc = &info->desc;\n  desc->bLength            = sizeof(tusb_desc_interface_t);\n  desc->bDescriptorType    = TUSB_DESC_INTERFACE;\n\n  desc->bInterfaceNumber   = p_cdc->bInterfaceNumber;\n  desc->bAlternateSetting  = 0;\n  desc->bNumEndpoints      = 2u + (p_cdc->ep_notif ? 1u : 0u);\n  desc->bInterfaceClass    = TUSB_CLASS_CDC;\n  desc->bInterfaceSubClass = p_cdc->bInterfaceSubClass;\n  desc->bInterfaceProtocol = p_cdc->bInterfaceProtocol;\n  desc->iInterface         = 0; // not used yet\n\n  return true;\n}\n\nbool tuh_cdc_mounted(uint8_t idx) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  return p_cdc->mounted;\n}\n\nbool tuh_cdc_get_control_line_state_local(uint8_t idx, uint16_t* line_state) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  *line_state = p_cdc->line.control_state.value;\n  return true;\n}\n\nbool tuh_cdc_get_line_coding_local(uint8_t idx, cdc_line_coding_t * line_coding) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  *line_coding = p_cdc->line.coding;\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Write\n//--------------------------------------------------------------------+\n\nuint32_t tuh_cdc_write(uint8_t idx, void const * buffer, uint32_t bufsize) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  return tu_edpt_stream_write(&p_cdc->stream.tx, buffer, bufsize);\n}\n\nuint32_t tuh_cdc_write_flush(uint8_t idx) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  return tu_edpt_stream_write_xfer(&p_cdc->stream.tx);\n}\n\nbool tuh_cdc_write_clear(uint8_t idx) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  tu_edpt_stream_clear(&p_cdc->stream.tx);\n  return true;\n}\n\nuint32_t tuh_cdc_write_available(uint8_t idx) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  return tu_edpt_stream_write_available(&p_cdc->stream.tx);\n}\n\n//--------------------------------------------------------------------+\n// Read\n//--------------------------------------------------------------------+\n\nuint32_t tuh_cdc_read (uint8_t idx, void * buffer, uint32_t bufsize) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  return tu_edpt_stream_read(&p_cdc->stream.rx, buffer, bufsize);\n}\n\nuint32_t tuh_cdc_read_available(uint8_t idx) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  return tu_edpt_stream_read_available(&p_cdc->stream.rx);\n}\n\nbool tuh_cdc_peek(uint8_t idx, uint8_t * ch) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n  return tu_edpt_stream_peek(&p_cdc->stream.rx, ch);\n}\n\nbool tuh_cdc_read_clear (uint8_t idx) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc);\n\n  tu_edpt_stream_clear(&p_cdc->stream.rx);\n  (void)tu_edpt_stream_read_xfer(&p_cdc->stream.rx);\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Control Endpoint API\n//--------------------------------------------------------------------+\n\nbool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  cdch_interface_t * p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);\n  TU_LOG_CDC(p_cdc, \"set control line state dtr = %u rts = %u\", p_cdc->requested_line.control_state.dtr, p_cdc->requested_line.control_state.rts);\n  const cdch_serial_driver_t * driver = &serial_drivers[p_cdc->serial_drid];\n\n  p_cdc->requested_line.control_state.value = (uint8_t) line_state;\n  p_cdc->user_complete_cb = complete_cb;\n  TU_VERIFY(driver->set_control_line_state(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));\n\n  if (!complete_cb) {\n    // blocking, update line state if request was successful\n    p_cdc->line.control_state.value = (uint8_t) line_state;\n  }\n\n  return true;\n}\n\nbool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  cdch_interface_t *p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);\n  TU_LOG_CDC(p_cdc, \"set baudrate %lu\", baudrate);\n  const cdch_serial_driver_t *driver = &serial_drivers[p_cdc->serial_drid];\n\n  p_cdc->requested_line = p_cdc->line; // keep current line coding\n  p_cdc->requested_line.coding.bit_rate = baudrate;\n  p_cdc->user_complete_cb = complete_cb;\n  TU_VERIFY(driver->set_baudrate(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));\n\n  if (!complete_cb) {\n    p_cdc->line.coding.bit_rate = baudrate;\n  }\n\n  return true;\n}\n\nbool tuh_cdc_set_data_format(uint8_t idx, uint8_t stop_bits, uint8_t parity, uint8_t data_bits,\n                             tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  cdch_interface_t *p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);\n  TU_LOG_CDC(p_cdc, \"set data format %u%c%s\",\n               data_bits, CDC_LINE_CODING_PARITY_CHAR(parity),\n               CDC_LINE_CODING_STOP_BITS_TEXT(stop_bits));\n  const cdch_serial_driver_t *driver = &serial_drivers[p_cdc->serial_drid];\n\n  p_cdc->requested_line = p_cdc->line; // keep current line coding\n  p_cdc->requested_line.coding.stop_bits = stop_bits;\n  p_cdc->requested_line.coding.parity    = parity;\n  p_cdc->requested_line.coding.data_bits = data_bits;\n\n  p_cdc->user_complete_cb = complete_cb;\n  TU_VERIFY(driver->set_data_format(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));\n\n  if (!complete_cb) {\n    // blocking\n    p_cdc->line.coding.stop_bits = stop_bits;\n    p_cdc->line.coding.parity    = parity;\n    p_cdc->line.coding.data_bits = data_bits;\n  }\n\n  return true;\n}\n\nbool tuh_cdc_set_line_coding(uint8_t idx, cdc_line_coding_t const *line_coding,\n                             tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  cdch_interface_t *p_cdc = get_itf(idx);\n  TU_VERIFY(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);\n  TU_LOG_CDC(p_cdc, \"set line coding %lu %u%c%s\",\n               line_coding->bit_rate, line_coding->data_bits,\n               CDC_LINE_CODING_PARITY_CHAR(line_coding->parity),\n               CDC_LINE_CODING_STOP_BITS_TEXT(line_coding->stop_bits));\n  cdch_serial_driver_t const *driver = &serial_drivers[p_cdc->serial_drid];\n  p_cdc->requested_line.coding = *line_coding;\n  p_cdc->user_complete_cb = complete_cb;\n\n  if (driver->set_line_coding != NULL) {\n    // driver support set_line_coding request\n    TU_VERIFY(driver->set_line_coding(p_cdc, complete_cb ? cdch_internal_control_complete : NULL, user_data));\n\n    if (!complete_cb) {\n      p_cdc->line.coding = *line_coding;\n    }\n  } else {\n    // driver does not support set_line_coding and need 2 stage to set baudrate and data format separately\n    if (complete_cb != NULL) {\n      // non-blocking\n      TU_VERIFY(driver->set_baudrate(p_cdc, cdch_set_line_coding_stage1_baudrate_complete, user_data));\n    } else {\n      // blocking\n      xfer_result_t result = XFER_RESULT_INVALID;\n\n      TU_VERIFY(driver->set_baudrate(p_cdc, NULL, (uintptr_t) &result));\n      if (user_data != 0) {\n        *((xfer_result_t *) user_data) = result;\n      }\n      TU_VERIFY(result == XFER_RESULT_SUCCESS);\n      p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate; // update baudrate\n\n      result = XFER_RESULT_INVALID;\n      TU_VERIFY(driver->set_data_format(p_cdc, NULL, (uintptr_t) &result));\n      if (user_data != 0) {\n        *((xfer_result_t *) user_data) = result;\n      }\n      TU_VERIFY(result == XFER_RESULT_SUCCESS);\n      p_cdc->line.coding = p_cdc->requested_line.coding; // update data format\n    }\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// CLASS-USBH API\n//--------------------------------------------------------------------+\n\nbool cdch_init(void) {\n  TU_LOG_DRV(\"sizeof(cdch_interface_t) = %u\\r\\n\", sizeof(cdch_interface_t));\n  tu_memclr(cdch_data, sizeof(cdch_data));\n  for (size_t i = 0; i < CFG_TUH_CDC; i++) {\n    cdch_interface_t *p_cdc = &cdch_data[i];\n    cdch_epbuf_t *epbuf = &cdch_epbuf[i];\n    TU_ASSERT(tu_edpt_stream_init(&p_cdc->stream.tx, true, true, false, p_cdc->stream.tx_ff_buf,\n                                  CFG_TUH_CDC_TX_BUFSIZE, epbuf->tx));\n    TU_ASSERT(tu_edpt_stream_init(&p_cdc->stream.rx, true, false, false, p_cdc->stream.rx_ff_buf,\n                                  CFG_TUH_CDC_RX_BUFSIZE, epbuf->rx));\n  }\n\n  return true;\n}\n\nbool cdch_deinit(void) {\n  for (size_t i = 0; i < CFG_TUH_CDC; i++) {\n    cdch_interface_t *p_cdc = &cdch_data[i];\n    (void)tu_edpt_stream_deinit(&p_cdc->stream.tx);\n    (void)tu_edpt_stream_deinit(&p_cdc->stream.rx);\n  }\n  return true;\n}\n\nvoid cdch_close(uint8_t daddr) {\n  for (uint8_t idx = 0; idx < CFG_TUH_CDC; idx++) {\n    cdch_interface_t *p_cdc = &cdch_data[idx];\n    if (p_cdc->daddr == daddr) {\n      TU_LOG_CDC(p_cdc, \"close\");\n      tuh_cdc_umount_cb(idx); // invoke callback\n\n      p_cdc->daddr            = 0;\n      p_cdc->bInterfaceNumber = 0;\n      p_cdc->mounted = false;\n      tu_edpt_stream_close(&p_cdc->stream.tx);\n      tu_edpt_stream_close(&p_cdc->stream.rx);\n    }\n  }\n}\n\nbool cdch_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes) {\n  // TODO handle stall response, retry failed transfer ...\n  TU_VERIFY(event == XFER_RESULT_SUCCESS);\n\n  uint8_t const idx = get_idx_by_ep_addr(daddr, ep_addr);\n  cdch_interface_t *p_cdc = get_itf(idx);\n  TU_ASSERT(p_cdc);\n\n  if (ep_addr == p_cdc->stream.tx.ep_addr) {\n    tuh_cdc_tx_complete_cb(idx); // invoke transmit complete callback\n\n    if (0 == tu_edpt_stream_write_xfer(&p_cdc->stream.tx)) {\n      // If there is no data left, a ZLP should be sent if:\n      // - xferred_bytes is multiple of EP Packet size and not zero\n      (void)tu_edpt_stream_write_zlp_if_needed(&p_cdc->stream.tx, xferred_bytes);\n    }\n  } else if (ep_addr == p_cdc->stream.rx.ep_addr) {\n    #if CFG_TUH_CDC_FTDI\n    if (p_cdc->serial_drid == SERIAL_DRIVER_FTDI) {\n      // FTDI reserve 2 bytes for status\n      // uint8_t status[2] = {p_cdc->stream.rx.ep_buf[0], p_cdc->stream.rx.ep_buf[1]};\n      if (xferred_bytes > 2) {\n        tu_edpt_stream_read_xfer_complete_with_buf(&p_cdc->stream.rx, p_cdc->stream.rx.ep_buf + 2, xferred_bytes - 2);\n\n        tuh_cdc_rx_cb(idx); // invoke receive callback\n      }\n    } else\n    #endif\n    {\n      tu_edpt_stream_read_xfer_complete(&p_cdc->stream.rx, xferred_bytes);\n      tuh_cdc_rx_cb(idx); // invoke receive callback\n    }\n\n    // prepare for next transfer if needed\n    tu_edpt_stream_read_xfer(&p_cdc->stream.rx);\n  } else if (ep_addr == p_cdc->ep_notif) {\n    // TODO handle notification endpoint\n  } else {\n    return false;\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Enumeration\n//--------------------------------------------------------------------+\nstatic bool open_ep_stream_pair(cdch_interface_t *p_cdc, tusb_desc_endpoint_t const *desc_ep) {\n  for (size_t i = 0; i < 2; i++) {\n    TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && TUSB_XFER_BULK == desc_ep->bmAttributes.xfer, 0);\n    TU_ASSERT(tuh_edpt_open(p_cdc->daddr, desc_ep));\n    const uint8_t     ep_dir = tu_edpt_dir(desc_ep->bEndpointAddress);\n    tu_edpt_stream_t *stream = (ep_dir == TUSB_DIR_IN) ? &p_cdc->stream.rx : &p_cdc->stream.tx;\n    tu_edpt_stream_open(stream, p_cdc->daddr, desc_ep, tu_edpt_packet_size(desc_ep));\n    tu_edpt_stream_clear(stream);\n\n    desc_ep = (const tusb_desc_endpoint_t *)tu_desc_next(desc_ep);\n  }\n\n  return true;\n}\n\nuint16_t cdch_open(uint8_t rhport, uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {\n  (void)rhport;\n  // For CDC: only support ACM subclass\n  // Note: Protocol 0xFF can be RNDIS device\n  if (TUSB_CLASS_CDC == itf_desc->bInterfaceClass &&\n      CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL == itf_desc->bInterfaceSubClass) {\n    return acm_open(daddr, itf_desc, max_len);\n  } else if (SERIAL_DRIVER_COUNT > 1 &&\n             TUSB_CLASS_VENDOR_SPECIFIC == itf_desc->bInterfaceClass) {\n    uint16_t vid, pid;\n    TU_VERIFY(tuh_vid_pid_get(daddr, &vid, &pid), 0);\n\n    for (size_t drv = 1; drv < SERIAL_DRIVER_COUNT; drv++) {\n      const cdch_serial_driver_t *driver = &serial_drivers[drv];\n      for (size_t i = 0; i < driver->vid_pid_count; i++) {\n        if (driver->vid_pid_list[i][0] == vid && driver->vid_pid_list[i][1] == pid) {\n          const uint16_t drv_len = driver->open(daddr, itf_desc, max_len);\n          TU_LOG_DRV(\"[:%u:%u] CDCh %s open %s\\r\\n\", daddr, itf_desc->bInterfaceNumber, driver->name,\n                     drv_len > 0 ? \"OK\" : \"FAILED\");\n          return drv_len;\n        }\n      }\n    }\n  } else {\n    // not supported class\n  }\n\n  return 0;\n}\n\nstatic void set_config_complete(cdch_interface_t *p_cdc, bool success) {\n  if (success) {\n    const uint8_t idx = get_idx_by_ptr(p_cdc);\n    p_cdc->mounted    = true;\n    tuh_cdc_mount_cb(idx);\n    // Prepare for incoming data\n    tu_edpt_stream_read_xfer(&p_cdc->stream.rx);\n  } else {\n    // clear the interface entry\n    p_cdc->daddr            = 0;\n    p_cdc->bInterfaceNumber = 0;\n  }\n\n  // notify usbh that driver enumeration is complete\n  const uint8_t itf_offset = (p_cdc->serial_drid == SERIAL_DRIVER_ACM) ? 1 : 0;\n  usbh_driver_set_config_complete(p_cdc->daddr, p_cdc->bInterfaceNumber + itf_offset);\n}\n\nbool cdch_set_config(uint8_t daddr, uint8_t itf_num) {\n  const uint8_t     idx   = tuh_cdc_itf_get_index(daddr, itf_num);\n  cdch_interface_t *p_cdc = get_itf(idx);\n  TU_ASSERT(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT);\n  TU_LOG_CDC(p_cdc, \"set config\");\n\n  // fake transfer to kick-off process_set_config()\n  tusb_control_request_t request;\n  request.wIndex = tu_htole16((uint16_t)itf_num);\n\n  tuh_xfer_t xfer;\n  xfer.daddr       = daddr;\n  xfer.ep_addr     = 0;\n  xfer.result      = XFER_RESULT_SUCCESS;\n  xfer.setup       = &request;\n  xfer.complete_cb = NULL;\n  xfer.buffer      = NULL;\n  xfer.user_data   = 0; // initial state 0\n\n  const cdch_serial_driver_t *driver = &serial_drivers[p_cdc->serial_drid];\n  if (!driver->process_set_config(p_cdc, &xfer)) {\n    set_config_complete(p_cdc, false);\n  }\n\n  return true;\n}\n\nstatic void cdch_process_set_config(tuh_xfer_t *xfer) {\n  cdch_interface_t *p_cdc = get_itf_by_xfer(xfer);\n  TU_ASSERT(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT,);\n  TU_LOG_DRV(\"  state = %u\\r\\n\", xfer->user_data);\n  const cdch_serial_driver_t *driver = &serial_drivers[p_cdc->serial_drid];\n\n  if (!driver->process_set_config(p_cdc, xfer)) {\n    set_config_complete(p_cdc, false);\n  }\n}\n\n// return false if there is no active transfer\nstatic bool set_line_state_on_enum(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  enum {\n    ENUM_SET_LINE_CODING = 0,\n    ENUM_SET_LINE_CONTROL,\n    ENUM_SET_LINE_COMPLETE,\n  };\n  #ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM\n  const uint8_t idx = get_idx_by_ptr(p_cdc);\n  #endif\n  const uintptr_t state = xfer->user_data;\n\n  switch (state) {\n    case ENUM_SET_LINE_CODING: {\n      #ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM\n      #if CFG_TUH_CDC_CH34X\n      // ch34x already set line coding in serial init\n      if (p_cdc->serial_drid != SERIAL_DRIVER_CH34X)\n      #endif\n      {\n        const cdc_line_coding_t line_coding = (cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM;\n        TU_ASSERT(tuh_cdc_set_line_coding(idx, &line_coding,\n                                          cdch_process_line_state_on_enum, ENUM_SET_LINE_CONTROL));\n        break;\n      }\n      #endif\n      TU_ATTR_FALLTHROUGH;\n    }\n\n    case ENUM_SET_LINE_CONTROL:\n      #ifdef CFG_TUH_CDC_LINE_CONTROL_ON_ENUM\n      TU_ASSERT(tuh_cdc_set_control_line_state(idx, CFG_TUH_CDC_LINE_CONTROL_ON_ENUM,\n                                               cdch_process_line_state_on_enum, ENUM_SET_LINE_COMPLETE));\n      break;\n      #else\n      TU_ATTR_FALLTHROUGH;\n      #endif\n\n    case ENUM_SET_LINE_COMPLETE:\n      set_config_complete(p_cdc, true);\n      break;\n\n    default:\n      return false;\n  }\n\n  return true;\n}\n\nstatic void cdch_process_line_state_on_enum(tuh_xfer_t *xfer) {\n  cdch_interface_t *p_cdc = get_itf_by_xfer(xfer);\n  TU_ASSERT(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT,);\n  if (xfer->result != XFER_RESULT_SUCCESS || !set_line_state_on_enum(p_cdc, xfer)) {\n    set_config_complete(p_cdc, false);\n  }\n}\n\n\nstatic void cdch_internal_control_complete(tuh_xfer_t *xfer) {\n  cdch_interface_t *p_cdc = get_itf_by_xfer(xfer);\n  TU_ASSERT(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT,);\n  TU_LOG_DRV(\"  request result = %u\\r\\n\", xfer->result);\n  const cdch_serial_driver_t *driver = &serial_drivers[p_cdc->serial_drid];\n  driver->request_complete(p_cdc, xfer);\n\n  // Invoke application callback\n  xfer->complete_cb = p_cdc->user_complete_cb;\n  if (xfer->complete_cb != NULL) {\n    xfer->complete_cb(xfer);\n  }\n}\n\nstatic void cdch_set_line_coding_stage1_baudrate_complete(tuh_xfer_t *xfer) {\n  cdch_interface_t *p_cdc = get_itf_by_xfer(xfer);\n  TU_ASSERT(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT,);\n  TU_LOG_DRV(\"  stage1 set baudrate result = %u\\r\\n\", xfer->result);\n  const cdch_serial_driver_t *driver = &serial_drivers[p_cdc->serial_drid];\n\n  if (xfer->result == XFER_RESULT_SUCCESS) {\n    p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate; // update baudrate\n    TU_ASSERT(driver->set_data_format(p_cdc, cdch_set_line_coding_stage2_data_format_complete, xfer->user_data),);\n  } else {\n    xfer->complete_cb = p_cdc->user_complete_cb;\n    if (xfer->complete_cb != NULL) {\n      xfer->complete_cb(xfer);\n    }\n  }\n}\n\nstatic void cdch_set_line_coding_stage2_data_format_complete(tuh_xfer_t *xfer) {\n  cdch_interface_t *p_cdc = get_itf_by_xfer(xfer);\n  TU_ASSERT(p_cdc && p_cdc->serial_drid < SERIAL_DRIVER_COUNT,);\n  TU_LOG_DRV(\"  stage2 set data format result = %u\\r\\n\", xfer->result);\n\n  if (xfer->result == XFER_RESULT_SUCCESS) {\n    p_cdc->line.coding = p_cdc->requested_line.coding; // update data format\n  }\n\n  xfer->complete_cb = p_cdc->user_complete_cb;\n  if (xfer->complete_cb != NULL) {\n    xfer->complete_cb(xfer);\n  }\n}\n\n//--------------------------------------------------------------------+\n// ACM\n//--------------------------------------------------------------------+\n\n// internal control complete to update state such as line state, encoding\nstatic void acm_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  TU_VERIFY (xfer->result == XFER_RESULT_SUCCESS,);\n  const tusb_control_request_t * setup = xfer->setup;\n\n  switch (setup->bRequest) {\n    case CDC_REQUEST_SET_CONTROL_LINE_STATE:\n      p_cdc->line.control_state = p_cdc->requested_line.control_state;\n      break;\n\n    case CDC_REQUEST_SET_LINE_CODING:\n      p_cdc->line.coding = p_cdc->requested_line.coding;\n      break;\n\n    default:\n      break; // unknown request\n  }\n}\n\nstatic bool acm_set_control_line_state(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_VERIFY(p_cdc->acm.capability.support_line_request != 0);\n\n  const tusb_control_request_t request = {\n    .bmRequestType_bit = {\n      .recipient = TUSB_REQ_RCPT_INTERFACE,\n      .type      = TUSB_REQ_TYPE_CLASS,\n      .direction = TUSB_DIR_OUT\n    },\n    .bRequest = CDC_REQUEST_SET_CONTROL_LINE_STATE,\n    .wValue   = tu_htole16((uint16_t) p_cdc->requested_line.control_state.value),\n    .wIndex   = tu_htole16((uint16_t) p_cdc->bInterfaceNumber),\n    .wLength  = 0\n  };\n\n  tuh_xfer_t xfer = {\n    .daddr       = p_cdc->daddr,\n    .ep_addr     = 0,\n    .setup       = &request,\n    .buffer      = NULL,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nstatic bool acm_set_line_coding(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_VERIFY(p_cdc->acm.capability.support_line_request != 0);\n  TU_VERIFY((p_cdc->requested_line.coding.data_bits >= 5 && p_cdc->requested_line.coding.data_bits <= 8) ||\n            p_cdc->requested_line.coding.data_bits == 16);\n\n  tusb_control_request_t const request = {\n    .bmRequestType_bit = {\n      .recipient = TUSB_REQ_RCPT_INTERFACE,\n      .type      = TUSB_REQ_TYPE_CLASS,\n      .direction = TUSB_DIR_OUT\n    },\n    .bRequest = CDC_REQUEST_SET_LINE_CODING,\n    .wValue   = 0,\n    .wIndex   = tu_htole16((uint16_t) p_cdc->bInterfaceNumber),\n    .wLength  = tu_htole16((uint16_t) sizeof(cdc_line_coding_t))\n  };\n\n  // use usbh enum buf to hold line coding since user line_coding variable does not live long enough\n  uint8_t *enum_buf = usbh_get_enum_buf();\n  memcpy(enum_buf, &p_cdc->requested_line.coding, sizeof(cdc_line_coding_t));\n\n  tuh_xfer_t xfer = {\n    .daddr       = p_cdc->daddr,\n    .ep_addr     = 0,\n    .setup       = &request,\n    .buffer      = enum_buf,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\n//------------- Enumeration -------------//\nenum {\n  CONFIG_ACM_COMPLETE = 0\n};\n\nstatic uint16_t acm_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {\n  const uint8_t *p_desc   = (const uint8_t *)itf_desc;\n  const uint8_t *desc_end = p_desc + max_len;\n\n  cdch_interface_t *p_cdc = make_new_itf(daddr, itf_desc);\n  TU_VERIFY(p_cdc, 0);\n  p_cdc->serial_drid = SERIAL_DRIVER_ACM;\n\n  //------------- Control Interface -------------//\n  p_desc = tu_desc_next(p_desc);\n\n  // Communication Functional Descriptors\n  while ((p_desc < desc_end) && (TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc))) {\n    if (CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT == cdc_functional_desc_typeof(p_desc)) {\n      // save ACM bmCapabilities\n      p_cdc->acm.capability = ((cdc_desc_func_acm_t const *) p_desc)->bmCapabilities;\n    }\n\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  // Open notification endpoint of control interface if any\n  if (itf_desc->bNumEndpoints == 1) {\n    TU_ASSERT(TUSB_DESC_ENDPOINT == tu_desc_type(p_desc), 0);\n    const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)p_desc;\n    TU_ASSERT(tuh_edpt_open(daddr, desc_ep), 0);\n    p_cdc->ep_notif = desc_ep->bEndpointAddress;\n\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  //------------- Data Interface (if any) -------------//\n  if (TUSB_DESC_INTERFACE == tu_desc_type(p_desc)) {\n    const tusb_desc_interface_t *data_itf = (const tusb_desc_interface_t *)p_desc;\n    if (data_itf->bInterfaceClass == TUSB_CLASS_CDC_DATA) {\n      p_desc = tu_desc_next(p_desc); // next to endpoint descriptor\n\n      // data endpoints expected to be in pairs\n      TU_ASSERT(open_ep_stream_pair(p_cdc, (const tusb_desc_endpoint_t *)p_desc), 0);\n      p_desc += data_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t);\n    }\n  }\n\n  return (uint16_t)((uintptr_t)p_desc - (uintptr_t)itf_desc);\n}\n\nstatic bool acm_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS);\n  (void) p_cdc;\n  const uintptr_t state = xfer->user_data;\n\n  switch (state) {\n    case CONFIG_ACM_COMPLETE: {\n      xfer->user_data = 0; // kick-off set line state on enum\n      cdch_process_line_state_on_enum(xfer);\n      break;\n    }\n\n    default:\n      return false; // invalid state\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// FTDI\n//--------------------------------------------------------------------+\n#if CFG_TUH_CDC_FTDI\n\nstatic bool ftdi_determine_type(cdch_interface_t *p_cdc);\nstatic uint32_t ftdi_get_divisor(cdch_interface_t *p_cdc);\n\n//------------- Control Request -------------//\n\n// set request without data\nstatic bool ftdi_set_request(cdch_interface_t *p_cdc, uint8_t request, uint8_t requesttype,\n                             uint16_t value, uint16_t index, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  tusb_control_request_t const request_setup = {\n    .bmRequestType = requesttype,\n    .bRequest      = request,\n    .wValue        = tu_htole16(value),\n    .wIndex        = tu_htole16(index),\n    .wLength       = 0\n  };\n\n  tuh_xfer_t xfer = {\n    .daddr       = p_cdc->daddr,\n    .ep_addr     = 0,\n    .setup       = &request_setup,\n    .buffer      = NULL,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\n#ifdef CFG_TUH_CDC_FTDI_LATENCY\nstatic int8_t ftdi_write_latency_timer(cdch_interface_t * p_cdc, uint16_t latency,\n                                       tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  if (p_cdc->ftdi.chip_type == FTDI_SIO /* || p_cdc->ftdi.chip_type == FT232A */ )\n    return FTDI_NOT_POSSIBLE;\n  return ftdi_set_request(p_cdc, FTDI_SIO_SET_LATENCY_TIMER_REQUEST, FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE,\n                          latency, p_cdc->ftdi.channel, complete_cb, user_data) ? FTDI_REQUESTED : FTDI_FAIL;\n}\n#endif\n\nstatic inline bool ftdi_sio_reset(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return ftdi_set_request(p_cdc, FTDI_SIO_RESET_REQUEST, FTDI_SIO_RESET_REQUEST_TYPE, FTDI_SIO_RESET_SIO,\n                          p_cdc->ftdi.channel, complete_cb, user_data);\n}\n\n\n//------------- Driver API -------------//\n\n// internal control complete to update state such as line state, line_coding\nstatic void ftdi_internal_control_complete(cdch_interface_t* p_cdc, tuh_xfer_t *xfer) {\n  const tusb_control_request_t * setup = xfer->setup;\n  if (xfer->result == XFER_RESULT_SUCCESS) {\n    if (setup->bRequest      == FTDI_SIO_SET_MODEM_CTRL_REQUEST &&\n        setup->bmRequestType == FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE ) {\n      p_cdc->line.control_state = p_cdc->requested_line.control_state;\n    }\n    if (setup->bRequest      == FTDI_SIO_SET_DATA_REQUEST &&\n        setup->bmRequestType == FTDI_SIO_SET_DATA_REQUEST_TYPE ) {\n      p_cdc->line.coding.stop_bits = p_cdc->requested_line.coding.stop_bits;\n      p_cdc->line.coding.parity    = p_cdc->requested_line.coding.parity;\n      p_cdc->line.coding.data_bits = p_cdc->requested_line.coding.data_bits;\n    }\n    if (setup->bRequest      == FTDI_SIO_SET_BAUDRATE_REQUEST &&\n        setup->bmRequestType == FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE ) {\n      p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;\n    }\n  }\n}\n\nstatic bool ftdi_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_VERIFY(p_cdc->requested_line.coding.data_bits >= 7 && p_cdc->requested_line.coding.data_bits <= 8, 0);\n  uint16_t value = (uint16_t) ((p_cdc->requested_line.coding.data_bits & 0xfUL) |       // data bit quantity is stored in bits 0-3\n                               (p_cdc->requested_line.coding.parity    & 0x7UL) << 8 |  // parity is stored in bits 8-10, same coding\n                               (p_cdc->requested_line.coding.stop_bits & 0x3UL) << 11); // stop bits quantity is stored in bits 11-12, same coding\n                                                                                        // not each FTDI supports 1.5 stop bits\n  return ftdi_set_request(p_cdc, FTDI_SIO_SET_DATA_REQUEST, FTDI_SIO_SET_DATA_REQUEST_TYPE,\n                          value, p_cdc->ftdi.channel, complete_cb, user_data);\n}\n\nstatic bool ftdi_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  uint32_t index_value = ftdi_get_divisor(p_cdc);\n  TU_VERIFY(index_value != 0);\n  uint16_t value = (uint16_t) index_value;\n  uint16_t index = (uint16_t) (index_value >> 16);\n  if (p_cdc->ftdi.channel != 0) {\n    index = (uint16_t) ((index << 8) | p_cdc->ftdi.channel);\n  }\n\n  return ftdi_set_request(p_cdc, FTDI_SIO_SET_BAUDRATE_REQUEST, FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE,\n                          value, index, complete_cb, user_data);\n}\n\nstatic bool ftdi_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  uint16_t line_state = (uint16_t) ((p_cdc->requested_line.control_state.dtr ? FTDI_SIO_SET_DTR_HIGH : FTDI_SIO_SET_DTR_LOW) |\n                                    (p_cdc->requested_line.control_state.rts ? FTDI_SIO_SET_RTS_HIGH : FTDI_SIO_SET_RTS_LOW));\n  return ftdi_set_request(p_cdc, FTDI_SIO_SET_MODEM_CTRL_REQUEST, FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE,\n                          line_state, p_cdc->ftdi.channel, complete_cb ? cdch_internal_control_complete : NULL, user_data);\n}\n\n//------------- Enumeration -------------//\nenum {\n  CONFIG_FTDI_DETERMINE_TYPE = 0,\n  CONFIG_FTDI_WRITE_LATENCY,\n  CONFIG_FTDI_SIO_RESET,\n  CONFIG_FTDI_FLOW_CONTROL,\n  CONFIG_FTDI_COMPLETE\n};\n\nstatic uint16_t ftdi_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {\n  // FTDI Interface includes 1 vendor interface + 2 bulk endpoints\n  TU_VERIFY(itf_desc->bInterfaceSubClass == 0xff && itf_desc->bInterfaceProtocol == 0xff &&\n              itf_desc->bNumEndpoints == 2,\n            0);\n  const uint16_t drv_len =\n    (uint16_t)(sizeof(tusb_desc_interface_t) + itf_desc->bNumEndpoints * sizeof(tusb_desc_endpoint_t));\n  TU_VERIFY(drv_len <= max_len, 0);\n\n  cdch_interface_t *p_cdc = make_new_itf(daddr, itf_desc);\n  TU_VERIFY(p_cdc, 0);\n\n  p_cdc->serial_drid = SERIAL_DRIVER_FTDI;\n\n  // endpoint pair\n  const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)tu_desc_next(itf_desc);\n\n  /* NOTE: Some users have programmed FT232R/FT245R devices\n   * with an endpoint size of 0 !!! */\n  TU_ASSERT(desc_ep->wMaxPacketSize != 0, 0);\n\n  TU_ASSERT(open_ep_stream_pair(p_cdc, desc_ep), 0);\n\n  return drv_len;\n}\n\nstatic bool ftdi_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS);\n  const uintptr_t state = xfer->user_data;\n  switch (state) {\n    // from here sequence overtaken from Linux Kernel function ftdi_port_probe()\n    case CONFIG_FTDI_DETERMINE_TYPE:\n      // determine type\n      TU_ASSERT(ftdi_determine_type(p_cdc));\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_FTDI_WRITE_LATENCY:\n      #ifdef CFG_TUH_CDC_FTDI_LATENCY\n      int8_t result = ftdi_write_latency_timer(p_cdc, CFG_TUH_CDC_FTDI_LATENCY, ftdi_process_config,\n                                               CONFIG_FTDI_SIO_RESET);\n      TU_ASSERT(result != FTDI_FAIL);\n      if (result == FTDI_REQUESTED) {\n        break;\n      }// else FTDI_NOT_POSSIBLE => continue directly with next state\n      #endif\n      TU_ATTR_FALLTHROUGH;\n\n      // from here sequence overtaken from Linux Kernel function ftdi_open()\n    case CONFIG_FTDI_SIO_RESET:\n      TU_ASSERT(ftdi_sio_reset(p_cdc, cdch_process_set_config, CONFIG_FTDI_FLOW_CONTROL));\n      break;\n\n    case CONFIG_FTDI_FLOW_CONTROL:\n      // disable flow control\n      TU_ASSERT(ftdi_set_request(p_cdc, FTDI_SIO_SET_FLOW_CTRL_REQUEST, FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE, FTDI_SIO_DISABLE_FLOW_CTRL,\n                                 p_cdc->ftdi.channel, cdch_process_set_config, CONFIG_FTDI_COMPLETE));\n      break;\n\n    case CONFIG_FTDI_COMPLETE: {\n      xfer->user_data = 0; // kick-off set line state on enum\n      cdch_process_line_state_on_enum(xfer);\n      break;\n    }\n\n    default:\n      return false;\n  }\n\n  return true;\n}\n\n//------------- Helper -------------//\n\nstatic bool ftdi_determine_type(cdch_interface_t *p_cdc) {\n  tusb_desc_device_t desc_dev;\n  TU_VERIFY(tuh_descriptor_get_device_local(p_cdc->daddr, &desc_dev));\n  uint16_t const version = desc_dev.bcdDevice;\n  uint8_t const itf_num = p_cdc->bInterfaceNumber;\n\n  p_cdc->ftdi.chip_type = FTDI_UNKNOWN;\n\n  /* Assume Hi-Speed type */\n  p_cdc->ftdi.channel = CHANNEL_A + itf_num;\n\n  switch (version) {\n    case 0x200:\n      // FT232A not supported to keep it simple (no extra _read_latency_timer()) not testable\n      // p_cdc->ftdi.chip_type = FT232A;\n      // p_cdc->ftdi.baud_base = 48000000 / 2;\n      // p_cdc->ftdi.channel = 0;\n      // /*\n      //  * FT232B devices have a bug where bcdDevice gets set to 0x200\n      //  * when iSerialNumber is 0. Assume it is an FT232B in case the\n      //  * latency timer is readable.\n      //  */\n      // if (desc->iSerialNumber == 0 &&\n      //     _read_latency_timer(port) >= 0) {\n      //   p_cdc->ftdi.chip_type = FTDI_FT232B;\n      // }\n      break;\n\n    case 0x400 : p_cdc->ftdi.chip_type = FTDI_FT232B; p_cdc->ftdi.channel = 0; break;\n    case 0x500 : p_cdc->ftdi.chip_type = FTDI_FT2232C; break;\n    case 0x600 : p_cdc->ftdi.chip_type = FTDI_FT232R; p_cdc->ftdi.channel = 0; break;\n    case 0x700 : p_cdc->ftdi.chip_type = FTDI_FT2232H; break;\n    case 0x800 : p_cdc->ftdi.chip_type = FTDI_FT4232H; break;\n    case 0x900 : p_cdc->ftdi.chip_type = FTDI_FT232H; break;\n    case 0x1000: p_cdc->ftdi.chip_type = FTDI_FTX; break;\n    case 0x2800: p_cdc->ftdi.chip_type = FTDI_FT2233HP; break;\n    case 0x2900: p_cdc->ftdi.chip_type = FTDI_FT4233HP; break;\n    case 0x3000: p_cdc->ftdi.chip_type = FTDI_FT2232HP; break;\n    case 0x3100: p_cdc->ftdi.chip_type = FTDI_FT4232HP; break;\n    case 0x3200: p_cdc->ftdi.chip_type = FTDI_FT233HP; break;\n    case 0x3300: p_cdc->ftdi.chip_type = FTDI_FT232HP; break;\n    case 0x3600: p_cdc->ftdi.chip_type = FTDI_FT4232HA; break;\n\n    default:\n      if (version < 0x200) {\n        p_cdc->ftdi.chip_type = FTDI_SIO;\n        p_cdc->ftdi.channel = 0;\n      }\n      break;\n  }\n\n  #if CFG_TUSB_DEBUG >= CFG_TUH_CDC_LOG_LEVEL\n  const char * ftdi_chip_name[] = { FTDI_CHIP_NAMES };\n  TU_LOG_CDC(p_cdc, \"%s detected (bcdDevice = 0x%04x)\",\n               ftdi_chip_name[p_cdc->ftdi.chip_type], version);\n  #endif\n\n  return (p_cdc->ftdi.chip_type != FTDI_UNKNOWN);\n}\n\n// FT232A not supported\n//static uint32_t ftdi_232am_baud_base_to_divisor(uint32_t baud, uint32_t base)\n//{\n//  uint32_t divisor;\n//  /* divisor shifted 3 bits to the left */\n//  uint32_t divisor3 = DIV_ROUND_CLOSEST(base, 2 * baud);\n//  if ((divisor3 & 0x7) == 7)\n//    divisor3++; /* round x.7/8 up to x+1 */\n//  divisor = divisor3 >> 3;\n//  divisor3 &= 0x7;\n//  if (divisor3 == 1)\n//    divisor |= 0xc000;  /* +0.125 */\n//  else if (divisor3 >= 4)\n//    divisor |= 0x4000;  /* +0.5 */\n//  else if (divisor3 != 0)\n//    divisor |= 0x8000;  /* +0.25 */\n//  else if (divisor == 1)\n//    divisor = 0;    /* special case for maximum baud rate */\n//  return divisor;\n//}\n\n// FT232A not supported\n//static inline uint32_t ftdi_232am_baud_to_divisor(uint32_t baud)\n//{\n//   return ftdi_232am_baud_base_to_divisor(baud, (uint32_t) 48000000);\n//}\n\nstatic uint32_t ftdi_232bm_baud_base_to_divisor(uint32_t baud, uint32_t base) {\n  uint8_t divfrac[8] = {0, 3, 2, 4, 1, 5, 6, 7};\n  uint32_t divisor;\n  /* divisor shifted 3 bits to the left */\n  uint32_t divisor3 = tu_div_round_nearest(base, 2 * baud);\n  divisor = divisor3 >> 3;\n  divisor |= (uint32_t) divfrac[divisor3 & 0x7] << 14;\n  /* Deal with special cases for highest baud rates. */\n  if (divisor == 1) /* 1.0 */ {\n    divisor = 0;\n  } else if (divisor == 0x4001) /* 1.5 */ {\n    divisor = 1;\n  } else {\n    // nothing to do\n  }\n  return divisor;\n}\n\nstatic inline uint32_t ftdi_232bm_baud_to_divisor(uint32_t baud) {\n  return ftdi_232bm_baud_base_to_divisor(baud, 48000000);\n}\n\nstatic uint32_t ftdi_2232h_baud_base_to_divisor(uint32_t baud, uint32_t base) {\n  static const unsigned char divfrac[8] = {0, 3, 2, 4, 1, 5, 6, 7};\n  uint32_t divisor;\n  uint32_t divisor3;\n\n  /* hi-speed baud rate is 10-bit sampling instead of 16-bit */\n  divisor3 = tu_div_round_nearest(8 * base, 10 * baud);\n\n  divisor = divisor3 >> 3;\n  divisor |= (uint32_t) divfrac[divisor3 & 0x7] << 14;\n  /* Deal with special cases for highest baud rates. */\n  if (divisor == 1) /* 1.0 */ {\n    divisor = 0;\n  } else if (divisor == 0x4001) /* 1.5 */ {\n    divisor = 1;\n  } else {\n    // nothing to do\n  }\n\n  /* Set this bit to turn off a divide by 2.5 on baud rate generator\n   * This enables baud rates up to 12Mbaud but cannot reach below 1200\n   * baud with this bit set */\n  divisor |= 0x00020000;\n  return divisor;\n}\n\nstatic inline uint32_t ftdi_2232h_baud_to_divisor(uint32_t baud) {\n  return ftdi_2232h_baud_base_to_divisor(baud, (uint32_t) 120000000);\n}\n\nstatic inline uint32_t ftdi_get_divisor(cdch_interface_t *p_cdc) {\n  uint32_t baud = p_cdc->requested_line.coding.bit_rate;\n  uint32_t div_value = 0;\n  TU_VERIFY(baud != 0);\n\n  switch (p_cdc->ftdi.chip_type) {\n    case FTDI_UNKNOWN:\n      return 0;\n    case FTDI_SIO:\n      switch (baud) {\n        case 300: div_value = ftdi_sio_b300; break;\n        case 600: div_value = ftdi_sio_b600; break;\n        case 1200: div_value = ftdi_sio_b1200; break;\n        case 2400: div_value = ftdi_sio_b2400; break;\n        case 4800: div_value = ftdi_sio_b4800; break;\n        case 9600: div_value = ftdi_sio_b9600; break;\n        case 19200: div_value = ftdi_sio_b19200; break;\n        case 38400: div_value = ftdi_sio_b38400; break;\n        case 57600: div_value = ftdi_sio_b57600;  break;\n        case 115200: div_value = ftdi_sio_b115200; break;\n        default:\n          // Baudrate not supported\n          return 0;\n          break;\n      }\n      break;\n      // FT232A not supported\n      // case FT232A:\n      //   if (baud <= 3000000) {\n      //     div_value = ftdi_232am_baud_to_divisor(baud);\n      //   } else {\n      //     // Baud rate too high!\n      //     baud = 9600;\n      //     div_value = ftdi_232am_baud_to_divisor(9600);\n      //     div_okay = false;\n      //   }\n      //   break;\n    case FTDI_FT232B:\n    case FTDI_FT2232C:\n    case FTDI_FT232R:\n    case FTDI_FTX:\n      TU_VERIFY(baud <= 3000000); // else Baud rate too high!\n      div_value = ftdi_232bm_baud_to_divisor(baud);\n      break;\n    case FTDI_FT232H:\n    case FTDI_FT2232H:\n    case FTDI_FT4232H:\n    case FTDI_FT4232HA:\n    case FTDI_FT232HP:\n    case FTDI_FT233HP:\n    case FTDI_FT2232HP:\n    case FTDI_FT2233HP:\n    case FTDI_FT4232HP:\n    case FTDI_FT4233HP:\n    default:\n      TU_VERIFY(baud <= 12000000); // else Baud rate too high!\n      if (baud >= 1200) {\n        div_value = ftdi_2232h_baud_to_divisor(baud);\n      } else {\n        div_value = ftdi_232bm_baud_to_divisor(baud);\n      }\n      break;\n  }\n\n  TU_LOG_CDC(p_cdc, \"Baudrate divisor = 0x%lu\", div_value);\n\n  return div_value;\n}\n\n#endif\n\n//--------------------------------------------------------------------+\n// CP210x\n//--------------------------------------------------------------------+\n#if CFG_TUH_CDC_CP210X\n\n//------------- Control Request -------------//\n\nstatic bool cp210x_set_request(cdch_interface_t * p_cdc, uint8_t command, uint16_t value,\n                               uint8_t * buffer, uint16_t length, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  tusb_control_request_t const request = {\n    .bmRequestType_bit = {\n      .recipient = TUSB_REQ_RCPT_INTERFACE,\n      .type      = TUSB_REQ_TYPE_VENDOR,\n      .direction = TUSB_DIR_OUT\n    },\n    .bRequest = command,\n    .wValue   = tu_htole16(value),\n    .wIndex   = tu_htole16((uint16_t) p_cdc->bInterfaceNumber),\n    .wLength  = tu_htole16(length)\n  };\n\n  // use usbh enum buf since application variable does not live long enough\n  uint8_t * enum_buf = NULL;\n\n  if (buffer && length > 0) {\n    enum_buf = usbh_get_enum_buf();\n    tu_memcpy_s(enum_buf, CFG_TUH_ENUMERATION_BUFSIZE, buffer, length);\n  }\n\n  tuh_xfer_t xfer = {\n    .daddr       = p_cdc->daddr,\n    .ep_addr     = 0,\n    .setup       = &request,\n    .buffer      = enum_buf,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool cp210x_ifc_enable(cdch_interface_t *p_cdc, uint16_t enabled, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return cp210x_set_request(p_cdc, CP210X_IFC_ENABLE, enabled, NULL, 0, complete_cb, user_data);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool cp210x_set_mhs(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  // CP210x has the same bit coding\n  return cp210x_set_request(p_cdc, CP210X_SET_MHS,\n                            (uint16_t) (CP210X_CONTROL_WRITE_DTR | CP210X_CONTROL_WRITE_RTS | p_cdc->requested_line.control_state.value),\n                            NULL, 0, complete_cb, user_data);\n}\n\n//------------- Driver API -------------//\n\n// internal control complete to update state such as line state, encoding\nstatic void cp210x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);\n  switch (xfer->setup->bRequest) {\n    case CP210X_SET_MHS:\n      p_cdc->line.control_state = p_cdc->requested_line.control_state;\n      break;\n\n    case CP210X_SET_LINE_CTL:\n      p_cdc->line.coding.stop_bits = p_cdc->requested_line.coding.stop_bits;\n      p_cdc->line.coding.parity    = p_cdc->requested_line.coding.parity;\n      p_cdc->line.coding.data_bits = p_cdc->requested_line.coding.data_bits;\n      break;\n\n    case CP210X_SET_BAUDRATE:\n      p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;\n      break;\n\n    default:\n      break; // unsupported request\n  }\n}\n\nstatic bool cp210x_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  // Not every baud rate is supported. See datasheets and AN205 \"CP210x Baud Rate Support\"\n  uint32_t baud_le = tu_htole32(p_cdc->requested_line.coding.bit_rate);\n  return cp210x_set_request(p_cdc, CP210X_SET_BAUDRATE, 0, (uint8_t *) &baud_le, 4, complete_cb, user_data);\n}\n\nstatic bool cp210x_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_VERIFY(p_cdc->requested_line.coding.data_bits >= 5 && p_cdc->requested_line.coding.data_bits <= 8, 0);\n  uint16_t lcr = (uint16_t) ((p_cdc->requested_line.coding.data_bits & 0xfUL) << 8 | // data bit quantity is stored in bits 8-11\n                             (p_cdc->requested_line.coding.parity    & 0xfUL) << 4 | // parity is stored in bits 4-7, same coding\n                             (p_cdc->requested_line.coding.stop_bits & 0xfUL));      // parity is stored in bits 0-3, same coding\n\n  return cp210x_set_request(p_cdc, CP210X_SET_LINE_CTL, lcr, NULL, 0, complete_cb, user_data);\n}\n\nstatic bool cp210x_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return cp210x_set_mhs(p_cdc, complete_cb, user_data);\n}\n\n//------------- Enumeration -------------//\n\nenum {\n  CONFIG_CP210X_IFC_ENABLE = 0,\n  CONFIG_CP210X_COMPLETE\n};\n\nstatic uint16_t cp210x_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {\n  // CP210x Interface includes 1 vendor interface + 2 bulk endpoints\n  TU_VERIFY(itf_desc->bInterfaceSubClass == 0 && itf_desc->bInterfaceProtocol == 0 && itf_desc->bNumEndpoints == 2, 0);\n  const uint16_t drv_len =\n    (uint16_t)(sizeof(tusb_desc_interface_t) + itf_desc->bNumEndpoints * sizeof(tusb_desc_endpoint_t));\n  TU_VERIFY(drv_len <= max_len, 0);\n\n  cdch_interface_t *p_cdc = make_new_itf(daddr, itf_desc);\n  TU_VERIFY(p_cdc, 0);\n\n  p_cdc->serial_drid = SERIAL_DRIVER_CP210X;\n\n  // data endpoints expected to be in pairs\n  const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)tu_desc_next(itf_desc);\n  TU_ASSERT(open_ep_stream_pair(p_cdc, desc_ep));\n\n  return drv_len;\n}\n\nstatic bool cp210x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS);\n  const uintptr_t state = xfer->user_data;\n\n    switch (state) {\n    case CONFIG_CP210X_IFC_ENABLE:\n      TU_ASSERT(cp210x_ifc_enable(p_cdc, CP210X_UART_ENABLE, cdch_process_set_config, CONFIG_CP210X_COMPLETE));\n      break;\n\n    case CONFIG_CP210X_COMPLETE:\n      xfer->user_data = 0;// kick-off set line state on enum\n      cdch_process_line_state_on_enum(xfer);\n      break;\n\n    default:\n      return false;\n  }\n\n  return true;\n}\n\n#endif\n\n//--------------------------------------------------------------------+\n// CH34x (CH340 & CH341)\n//--------------------------------------------------------------------+\n\n#if CFG_TUH_CDC_CH34X\n\nstatic uint8_t ch34x_get_lcr(cdch_interface_t *p_cdc);\nstatic uint16_t ch34x_get_divisor_prescaler(cdch_interface_t *p_cdc);\n\n//------------- Control Request -------------//\n\nstatic bool ch34x_set_request(cdch_interface_t *p_cdc, uint8_t direction, uint8_t request,\n                              uint16_t value, uint16_t index, uint8_t *buffer, uint16_t length,\n                              tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  tusb_control_request_t const request_setup = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_DEVICE,\n          .type      = TUSB_REQ_TYPE_VENDOR,\n          .direction = direction & 0x01u\n      },\n      .bRequest = request,\n      .wValue   = tu_htole16(value),\n      .wIndex   = tu_htole16(index),\n      .wLength  = tu_htole16(length)\n  };\n\n  // use usbh enum buf since application variable does not live long enough\n  uint8_t *enum_buf = NULL;\n\n  if (buffer && length > 0) {\n    enum_buf = usbh_get_enum_buf();\n    if (direction == TUSB_DIR_OUT) {\n      tu_memcpy_s(enum_buf, CFG_TUH_ENUMERATION_BUFSIZE, buffer, length);\n    }\n  }\n\n  tuh_xfer_t xfer = {\n      .daddr       = p_cdc->daddr,\n      .ep_addr     = 0,\n      .setup       = &request_setup,\n      .buffer      = enum_buf,\n      .complete_cb = complete_cb,\n      .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool ch34x_control_out(cdch_interface_t *p_cdc, uint8_t request, uint16_t value, uint16_t index,\n                                                           tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return ch34x_set_request(p_cdc, TUSB_DIR_OUT, request, value, index, NULL, 0, complete_cb, user_data);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool ch34x_control_in(cdch_interface_t *p_cdc, uint8_t request, uint16_t value, uint16_t index,\n                                                          uint8_t *buffer, uint16_t buffersize, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return ch34x_set_request(p_cdc, TUSB_DIR_IN, request, value, index, buffer, buffersize,\n                           complete_cb, user_data);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool ch34x_write_reg(cdch_interface_t *p_cdc, uint16_t reg, uint16_t reg_value,\n                                                         tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return ch34x_control_out(p_cdc, CH34X_REQ_WRITE_REG, reg, reg_value, complete_cb, user_data);\n}\n\n//static bool ch34x_read_reg_request ( cdch_interface_t * p_cdc, uint16_t reg,\n//                                     uint8_t *buffer, uint16_t buffersize, tuh_xfer_cb_t complete_cb, uintptr_t user_data )\n//{\n//  return ch34x_control_in ( p_cdc, CH34X_REQ_READ_REG, reg, 0, buffer, buffersize, complete_cb, user_data );\n//}\n\n//------------- Driver API -------------//\n\n// internal control complete to update state such as line state, encoding\nstatic void ch34x_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);\n  switch (xfer->setup->bRequest) {\n    case CH34X_REQ_WRITE_REG:\n      // register write request\n      switch (tu_le16toh(xfer->setup->wValue)) {\n        case CH34X_REG16_DIVISOR_PRESCALER:\n          // baudrate\n          p_cdc->line.coding.bit_rate = p_cdc->requested_line.coding.bit_rate;\n          break;\n\n        case CH32X_REG16_LCR2_LCR:\n          // data format\n          p_cdc->line.coding.stop_bits = p_cdc->requested_line.coding.stop_bits;\n          p_cdc->line.coding.parity    = p_cdc->requested_line.coding.parity;\n          p_cdc->line.coding.data_bits = p_cdc->requested_line.coding.data_bits;\n          break;\n\n        default:\n          break; // unsupported\n      }\n      break;\n\n    case CH34X_REQ_MODEM_CTRL:\n      p_cdc->line.control_state = p_cdc->requested_line.control_state;\n      break;\n\n    default:\n      break; // unsupported request\n  }\n}\n\nstatic bool ch34x_set_data_format(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  const uint8_t lcr = ch34x_get_lcr(p_cdc);\n  TU_VERIFY(lcr > 0);\n  return ch34x_write_reg(p_cdc, CH32X_REG16_LCR2_LCR, lcr, complete_cb, user_data);\n}\n\nstatic bool ch34x_set_baudrate(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  const uint16_t div_ps = ch34x_get_divisor_prescaler(p_cdc);\n  TU_VERIFY(div_ps > 0);\n  return ch34x_write_reg(p_cdc, CH34X_REG16_DIVISOR_PRESCALER, div_ps, complete_cb, user_data);\n}\n\nstatic bool ch34x_set_modem_ctrl(cdch_interface_t * p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  // CH34x signals are inverted\n  uint8_t control = ~((p_cdc->requested_line.control_state.rts ? CH34X_BIT_RTS : 0) |\n                      (p_cdc->requested_line.control_state.dtr ? CH34X_BIT_DTR : 0));\n  return ch34x_control_out(p_cdc, CH34X_REQ_MODEM_CTRL, control, 0, complete_cb, user_data);\n}\n\n//------------- Enumeration -------------//\n\nenum {\n  CONFIG_CH34X_READ_VERSION = 0,\n  CONFIG_CH34X_SERIAL_INIT,\n  CONFIG_CH34X_SPECIAL_REG_WRITE,\n  CONFIG_CH34X_FLOW_CONTROL,\n  CONFIG_CH34X_COMPLETE\n};\n\nstatic uint16_t ch34x_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {\n  // CH34x Interface includes 1 vendor interface + 2 bulk + 1 interrupt endpoints\n  TU_VERIFY(itf_desc->bNumEndpoints == 3, 0);\n  const uint16_t drv_len =\n    (uint16_t)(sizeof(tusb_desc_interface_t) + itf_desc->bNumEndpoints * sizeof(tusb_desc_endpoint_t));\n  TU_VERIFY(drv_len <= max_len, 0);\n\n  cdch_interface_t * p_cdc = make_new_itf(daddr, itf_desc);\n  TU_VERIFY(p_cdc, 0);\n\n  p_cdc->serial_drid = SERIAL_DRIVER_CH34X;\n\n  const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)tu_desc_next(itf_desc);\n\n  // data endpoints expected to be in pairs\n  TU_ASSERT(open_ep_stream_pair(p_cdc, desc_ep), 0);\n  desc_ep = (const tusb_desc_endpoint_t *)((uintptr_t)desc_ep + 2 * sizeof(tusb_desc_endpoint_t));\n\n  // Interrupt endpoint: not used for now\n  TU_ASSERT(TUSB_DESC_ENDPOINT == tu_desc_type(desc_ep) && TUSB_XFER_INTERRUPT == desc_ep->bmAttributes.xfer, 0);\n  TU_ASSERT(tuh_edpt_open(daddr, desc_ep), 0);\n  p_cdc->ep_notif = desc_ep->bEndpointAddress;\n\n  return drv_len;\n}\n\nstatic bool ch34x_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS);\n  const uintptr_t state = xfer->user_data;\n\n  switch (state) {\n    case CONFIG_CH34X_READ_VERSION: {\n      uint8_t* enum_buf = usbh_get_enum_buf();\n      TU_ASSERT(ch34x_control_in(p_cdc, CH34X_REQ_READ_VERSION, 0, 0, enum_buf, 2,\n                                 cdch_process_set_config, CONFIG_CH34X_SERIAL_INIT));\n      break;\n    }\n\n    case CONFIG_CH34X_SERIAL_INIT: {\n      // handle version read data, set CH34x line coding (incl. baudrate)\n      uint8_t const version = xfer->buffer[0];\n      TU_LOG_CDC(p_cdc, \"Chip Version = 0x%02x\", version);\n      // only versions >= 0x30 are tested, below 0x30 seems having other programming\n      // see drivers from WCH vendor, Linux kernel and FreeBSD\n      if (version >= 0x30) {\n        // init CH34x with line coding\n        p_cdc->requested_line.coding = (cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM_CH34X;\n        uint16_t const div_ps = ch34x_get_divisor_prescaler(p_cdc);\n        uint8_t const lcr = ch34x_get_lcr(p_cdc);\n        TU_ASSERT(div_ps != 0 && lcr != 0);\n        TU_ASSERT(ch34x_control_out(p_cdc, CH34X_REQ_SERIAL_INIT, tu_u16(lcr, 0x9c), div_ps,\n                                    cdch_process_set_config, CONFIG_CH34X_SPECIAL_REG_WRITE));\n      }\n      break;\n    }\n\n    case CONFIG_CH34X_SPECIAL_REG_WRITE:\n      // overtake line coding and do special reg write, purpose unknown, overtaken from WCH driver\n      p_cdc->line.coding = (cdc_line_coding_t) CFG_TUH_CDC_LINE_CODING_ON_ENUM_CH34X;\n      TU_ASSERT(ch34x_write_reg(p_cdc, TU_U16(CH341_REG_0x0F, CH341_REG_0x2C), 0x0007,\n                                cdch_process_set_config, CONFIG_CH34X_FLOW_CONTROL));\n      break;\n\n    case CONFIG_CH34X_FLOW_CONTROL:\n      // no hardware flow control\n      TU_ASSERT(ch34x_write_reg(p_cdc, TU_U16(CH341_REG_0x27, CH341_REG_0x27), 0x0000,\n                                cdch_process_set_config, CONFIG_CH34X_COMPLETE));\n      break;\n\n    case CONFIG_CH34X_COMPLETE:\n      xfer->user_data = 0; // kick-off set line state on enum\n      cdch_process_line_state_on_enum(xfer);\n      break;\n\n    default:\n      return false;\n  }\n\n  return true;\n}\n\n//------------- Helper -------------//\n\n// calculate divisor and prescaler for baudrate, return it as 16-bit combined value\nstatic uint16_t ch34x_get_divisor_prescaler(cdch_interface_t *p_cdc) {\n  uint32_t const baval = p_cdc->requested_line.coding.bit_rate;\n  uint8_t a;\n  uint8_t b;\n  uint32_t c;\n\n  TU_VERIFY(baval != 0 && baval <= 2000000, 0);\n  switch (baval) {\n    case 921600:\n      a = 0xf3;\n      b = 7;\n      break;\n\n    case 307200:\n      a = 0xd9;\n      b = 7;\n      break;\n\n    default:\n      if (baval > 6000000 / 255) {\n        b = 3;\n        c = 6000000;\n      } else if (baval > 750000 / 255) {\n        b = 2;\n        c = 750000;\n      } else if (baval > 93750 / 255) {\n        b = 1;\n        c = 93750;\n      } else {\n        b = 0;\n        c = 11719;\n      }\n      a = (uint8_t) (c / baval);\n      if (a == 0 || a == 0xFF) {\n        return 0;\n      }\n      if ((c / a - baval) > (baval - c / (a + 1))) {\n        a++;\n      }\n      a = (uint8_t) (256 - a);\n      break;\n  }\n\n  // reg divisor = a, reg prescaler = b\n  // According to linux code we need to set bit 7 of UCHCOM_REG_BPS_PRE,\n  // otherwise the chip will buffer data.\n  return (uint16_t) ((uint16_t) a << 8 | 0x80 | b);\n}\n\n// calculate lcr value from data coding\nstatic uint8_t ch34x_get_lcr(cdch_interface_t *p_cdc) {\n  uint8_t const stop_bits = p_cdc->requested_line.coding.stop_bits;\n  uint8_t const parity = p_cdc->requested_line.coding.parity;\n  uint8_t const data_bits = p_cdc->requested_line.coding.data_bits;\n\n  uint8_t lcr = CH34X_LCR_ENABLE_RX | CH34X_LCR_ENABLE_TX;\n  TU_VERIFY(data_bits >= 5 && data_bits <= 8);\n  lcr |= (uint8_t) (data_bits - 5);\n\n  switch (parity) {\n    case CDC_LINE_CODING_PARITY_NONE:\n      break;\n\n    case CDC_LINE_CODING_PARITY_ODD:\n      lcr |= CH34X_LCR_ENABLE_PAR;\n      break;\n\n    case CDC_LINE_CODING_PARITY_EVEN:\n      lcr |= CH34X_LCR_ENABLE_PAR | CH34X_LCR_PAR_EVEN;\n      break;\n\n    case CDC_LINE_CODING_PARITY_MARK:\n      lcr |= CH34X_LCR_ENABLE_PAR | CH34X_LCR_MARK_SPACE;\n      break;\n\n    case CDC_LINE_CODING_PARITY_SPACE:\n      lcr |= CH34X_LCR_ENABLE_PAR | CH34X_LCR_MARK_SPACE | CH34X_LCR_PAR_EVEN;\n      break;\n\n    default:\n      break; // invalid parity\n  }\n\n  // 1.5 stop bits not supported\n  TU_VERIFY(stop_bits != CDC_LINE_CODING_STOP_BITS_1_5);\n  if (stop_bits == CDC_LINE_CODING_STOP_BITS_2) {\n    lcr |= CH34X_LCR_STOP_BITS_2;\n  }\n\n  return lcr;\n}\n\n#endif // CFG_TUH_CDC_CH34X\n\n//--------------------------------------------------------------------+\n// PL2303\n//--------------------------------------------------------------------+\n#if CFG_TUH_CDC_PL2303\n\nstatic pl2303_type_t pl2303_detect_type(cdch_interface_t *p_cdc, uint8_t step);\nstatic bool pl2303_encode_baud_rate(cdch_interface_t *p_cdc, uint8_t buf[PL2303_LINE_CODING_BAUDRATE_BUFSIZE]);\n\n//------------- Control Request -------------//\nstatic bool pl2303_set_request(cdch_interface_t *p_cdc, uint8_t request, uint8_t requesttype,\n                               uint16_t value, uint16_t index, uint8_t *buffer, uint16_t length,\n                               tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  tusb_control_request_t const request_setup = {\n    .bmRequestType = requesttype,\n    .bRequest      = request,\n    .wValue        = tu_htole16(value),\n    .wIndex        = tu_htole16(index),\n    .wLength       = tu_htole16(length)\n  };\n\n  // use usbh enum buf since application variable does not live long enough\n  uint8_t *enum_buf = NULL;\n\n  if (buffer && length > 0) {\n    enum_buf = usbh_get_enum_buf();\n    if (request_setup.bmRequestType_bit.direction == TUSB_DIR_OUT) {\n      tu_memcpy_s(enum_buf, CFG_TUH_ENUMERATION_BUFSIZE, buffer, length);\n    }\n  }\n\n  tuh_xfer_t xfer = {\n    .daddr       = p_cdc->daddr,\n    .ep_addr     = 0,\n    .setup       = &request_setup,\n    .buffer      = enum_buf,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nstatic bool pl2303_vendor_read(cdch_interface_t *p_cdc, uint16_t value, uint8_t *buf,\n                               tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  uint8_t request = p_cdc->pl2303.type == PL2303_TYPE_HXN ? PL2303_VENDOR_READ_NREQUEST : PL2303_VENDOR_READ_REQUEST;\n  return pl2303_set_request(p_cdc, request, PL2303_VENDOR_READ_REQUEST_TYPE, value, 0, buf, 1, complete_cb, user_data);\n}\n\nstatic bool pl2303_vendor_write(cdch_interface_t *p_cdc, uint16_t value, uint16_t index,\n                                tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  uint8_t request = p_cdc->pl2303.type == PL2303_TYPE_HXN ? PL2303_VENDOR_WRITE_NREQUEST : PL2303_VENDOR_WRITE_REQUEST;\n  return pl2303_set_request(p_cdc, request, PL2303_VENDOR_WRITE_REQUEST_TYPE, value, index, NULL, 0, complete_cb, user_data);\n}\n\nstatic inline bool pl2303_supports_hx_status(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  uint8_t buf = 0;\n  return pl2303_set_request(p_cdc, PL2303_VENDOR_READ_REQUEST, PL2303_VENDOR_READ_REQUEST_TYPE, PL2303_READ_TYPE_HX_STATUS, 0,\n                            &buf, 1, complete_cb, user_data);\n}\n\n//static bool pl2303_get_line_request(cdch_interface_t * p_cdc, uint8_t buf[PL2303_LINE_CODING_BUFSIZE]) {\n//  return pl2303_set_request(p_cdc, PL2303_GET_LINE_REQUEST, PL2303_GET_LINE_REQUEST_TYPE, 0, 0, buf, PL2303_LINE_CODING_BUFSIZE);\n//}\n\n//static bool pl2303_set_break(cdch_interface_t * p_cdc, bool enable) {\n//  uint16_t state = enable ? PL2303_BREAK_ON : PL2303_BREAK_OFF;\n//  return pl2303_set_request(p_cdc, PL2303_BREAK_REQUEST, PL2303_BREAK_REQUEST_TYPE, state, 0, NULL, 0);\n//}\n\nstatic inline bool\npl2303_clear_halt(cdch_interface_t *p_cdc, uint8_t endp, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  /* we don't care if it wasn't halted first. in fact some devices\n   * (like some ibmcam model 1 units) seem to expect hosts to make\n   * this request for iso endpoints, which can't halt!\n   */\n  return pl2303_set_request(\n      p_cdc, TUSB_REQ_CLEAR_FEATURE, PL2303_CLEAR_HALT_REQUEST_TYPE, TUSB_REQ_FEATURE_EDPT_HALT, endp, NULL, 0,\n      complete_cb, user_data);\n}\n\n//------------- Driver API -------------//\n\n// internal control complete to update state such as line state, encoding\nstatic void pl2303_internal_control_complete(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  TU_VERIFY(xfer->result == XFER_RESULT_SUCCESS,);\n  if (xfer->setup->bRequest == PL2303_SET_LINE_REQUEST &&\n      xfer->setup->bmRequestType == PL2303_SET_LINE_REQUEST_TYPE) {\n    p_cdc->line.coding = p_cdc->requested_line.coding;\n  }\n  if (xfer->setup->bRequest == PL2303_SET_CONTROL_REQUEST &&\n      xfer->setup->bmRequestType == PL2303_SET_CONTROL_REQUEST_TYPE) {\n    p_cdc->line.control_state = p_cdc->requested_line.control_state;\n  }\n}\n\nstatic bool pl2303_set_line_coding(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  // the caller has to precheck, that the new line coding different than the current, else false returned\n  uint8_t buf[PL2303_LINE_CODING_BUFSIZE];\n  /*\n   * Some PL2303 are known to lose bytes if you change serial settings\n   * even to the same values as before. Thus we actually need to filter\n   * in this specific case.\n   */\n  TU_VERIFY(p_cdc->requested_line.coding.data_bits != p_cdc->line.coding.data_bits ||\n            p_cdc->requested_line.coding.stop_bits != p_cdc->line.coding.stop_bits ||\n            p_cdc->requested_line.coding.parity    != p_cdc->line.coding.parity    ||\n            p_cdc->requested_line.coding.bit_rate  != p_cdc->line.coding.bit_rate );\n\n  /* For reference buf[6] data bits value */\n  TU_VERIFY(p_cdc->requested_line.coding.data_bits >= 5 && p_cdc->requested_line.coding.data_bits <= 8, 0);\n  buf[6] = p_cdc->requested_line.coding.data_bits;\n\n  /* For reference buf[0]:buf[3] baud rate value */\n  TU_VERIFY(pl2303_encode_baud_rate(p_cdc, &buf[0]));\n\n  /* For reference buf[4]=0 is 1 stop bits */\n  /* For reference buf[4]=1 is 1.5 stop bits */\n  /* For reference buf[4]=2 is 2 stop bits */\n  buf[4] = p_cdc->requested_line.coding.stop_bits; // PL2303 has the same coding\n\n  /* For reference buf[5]=0 is none parity */\n  /* For reference buf[5]=1 is odd parity */\n  /* For reference buf[5]=2 is even parity */\n  /* For reference buf[5]=3 is mark parity */\n  /* For reference buf[5]=4 is space parity */\n  buf[5] = p_cdc->requested_line.coding.parity; // PL2303 has the same coding\n\n  return pl2303_set_request(p_cdc, PL2303_SET_LINE_REQUEST, PL2303_SET_LINE_REQUEST_TYPE, 0, 0,\n                            buf, PL2303_LINE_CODING_BUFSIZE, complete_cb, user_data);\n}\n\nstatic bool pl2303_set_modem_ctrl(cdch_interface_t *p_cdc, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  // PL2303 has the same bit coding\n  return pl2303_set_request(p_cdc, PL2303_SET_CONTROL_REQUEST, PL2303_SET_CONTROL_REQUEST_TYPE,\n                            p_cdc->requested_line.control_state.value, 0, NULL, 0, complete_cb, user_data);\n}\n\n//------------- Enumeration -------------//\n\nenum {\n  CONFIG_PL2303_DETECT_TYPE = 0,\n  CONFIG_PL2303_READ1,\n  CONFIG_PL2303_WRITE1,\n  CONFIG_PL2303_READ2,\n  CONFIG_PL2303_READ3,\n  CONFIG_PL2303_READ4,\n  CONFIG_PL2303_WRITE2,\n  CONFIG_PL2303_READ5,\n  CONFIG_PL2303_READ6,\n  CONFIG_PL2303_WRITE3,\n  CONFIG_PL2303_WRITE4,\n  CONFIG_PL2303_WRITE5,\n  CONFIG_PL2303_RESET_ENDP1,\n  CONFIG_PL2303_RESET_ENDP2,\n//  CONFIG_PL2303_FLOW_CTRL_READ,\n//  CONFIG_PL2303_FLOW_CTRL_WRITE,\n  CONFIG_PL2303_COMPLETE\n};\n\nstatic uint16_t pl2303_open(uint8_t daddr, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {\n  // PL2303 Interface includes 1 vendor interface + 1 interrupt endpoints + 2 bulk\n  TU_VERIFY(itf_desc->bNumEndpoints == 3, 0);\n  const uint16_t drv_len =\n    (uint16_t)(sizeof(tusb_desc_interface_t) + itf_desc->bNumEndpoints * sizeof(tusb_desc_endpoint_t));\n  TU_VERIFY(drv_len <= max_len, 0);\n\n  cdch_interface_t *p_cdc = make_new_itf(daddr, itf_desc);\n  TU_VERIFY(p_cdc, 0);\n\n  p_cdc->serial_drid = SERIAL_DRIVER_PL2303;\n  p_cdc->pl2303.quirks = 0;\n  p_cdc->pl2303.supports_hx_status = false;\n\n  tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) tu_desc_next(itf_desc);\n\n  // Interrupt endpoint: not used for now\n  TU_ASSERT(TUSB_DESC_ENDPOINT == tu_desc_type(desc_ep) && TUSB_XFER_INTERRUPT == desc_ep->bmAttributes.xfer, 0);\n  TU_ASSERT(tuh_edpt_open(daddr, desc_ep), 0);\n  p_cdc->ep_notif = desc_ep->bEndpointAddress;\n  desc_ep += 1;\n\n  // data endpoints expected to be in pairs\n  TU_ASSERT(open_ep_stream_pair(p_cdc, desc_ep), 0);\n\n  return drv_len;\n}\n\nstatic bool pl2303_process_set_config(cdch_interface_t *p_cdc, tuh_xfer_t *xfer) {\n  // state CONFIG_PL2303_READ1 may have no success due to expected stall by pl2303_supports_hx_status()\n  const uintptr_t state = xfer->user_data;\n  TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS || state == CONFIG_PL2303_READ1);\n  uint8_t* enum_buf = usbh_get_enum_buf();\n  pl2303_type_t type;\n\n  switch (state) {\n    // from here sequence overtaken from Linux Kernel function pl2303_startup()\n    case CONFIG_PL2303_DETECT_TYPE:\n      // get type and quirks (step 1)\n      type = pl2303_detect_type(p_cdc, 1);\n      TU_ASSERT(type != PL2303_TYPE_UNKNOWN);\n      if (type == PL2303_TYPE_NEED_SUPPORTS_HX_STATUS) {\n        TU_ASSERT(pl2303_supports_hx_status(p_cdc, cdch_process_set_config, CONFIG_PL2303_READ1));\n        break;\n      }\n      // no transfer triggered and continue with CONFIG_PL2303_READ1\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_READ1:\n      // get supports_hx_status, type and quirks (step 2), do special read\n      // will not be true, if coming directly from previous case\n      if (xfer->user_data == CONFIG_PL2303_READ1 && xfer->result == XFER_RESULT_SUCCESS) {\n        p_cdc->pl2303.supports_hx_status = true;\n      }\n      type = pl2303_detect_type(p_cdc, 2); // step 2 now with supports_hx_status\n      TU_ASSERT(type != PL2303_TYPE_UNKNOWN);\n      TU_LOG_DRV(\"  PL2303 type detected: %u\\r\\n\", type);\n\n      p_cdc->pl2303.type = type;\n      p_cdc->pl2303.quirks |= pl2303_type_data[type].quirks;\n\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_read(p_cdc, 0x8484, enum_buf, cdch_process_set_config, CONFIG_PL2303_WRITE1));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_WRITE1:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_write(p_cdc, 0x0404, 0, cdch_process_set_config, CONFIG_PL2303_READ2));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_READ2:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_read(p_cdc, 0x8484, enum_buf, cdch_process_set_config, CONFIG_PL2303_READ3));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_READ3:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_read(p_cdc, 0x8383, enum_buf, cdch_process_set_config, CONFIG_PL2303_READ4));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_READ4:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_read(p_cdc, 0x8484, enum_buf, cdch_process_set_config, CONFIG_PL2303_WRITE2));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_WRITE2:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_write(p_cdc, 0x0404, 1, cdch_process_set_config, CONFIG_PL2303_READ5));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_READ5:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_read(p_cdc, 0x8484, enum_buf, cdch_process_set_config, CONFIG_PL2303_READ6));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_READ6:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_read(p_cdc, 0x8383, enum_buf, cdch_process_set_config, CONFIG_PL2303_WRITE3));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_WRITE3:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_write(p_cdc, 0, 1, cdch_process_set_config, CONFIG_PL2303_WRITE4));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_WRITE4:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        TU_ASSERT(pl2303_vendor_write(p_cdc, 1, 0, cdch_process_set_config, CONFIG_PL2303_WRITE5));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    case CONFIG_PL2303_WRITE5:\n      // purpose unknown, overtaken from Linux Kernel driver\n      if (p_cdc->pl2303.type != PL2303_TYPE_HXN) {\n        uint16_t const windex = (p_cdc->pl2303.quirks & PL2303_QUIRK_LEGACY) ? 0x24 : 0x44;\n        TU_ASSERT(pl2303_vendor_write(p_cdc, 2, windex, cdch_process_set_config, CONFIG_PL2303_RESET_ENDP1));\n        break;\n      }// else: continue with next step\n      TU_ATTR_FALLTHROUGH;\n\n    // from here sequence overtaken from Linux Kernel function pl2303_open()\n    case CONFIG_PL2303_RESET_ENDP1:\n      // step 1\n      if (p_cdc->pl2303.quirks & PL2303_QUIRK_LEGACY) {\n        TU_ASSERT(pl2303_clear_halt(p_cdc, PL2303_OUT_EP, cdch_process_set_config, CONFIG_PL2303_RESET_ENDP2));\n      } else {\n        /* reset upstream data pipes */\n        if (p_cdc->pl2303.type == PL2303_TYPE_HXN) {\n          TU_ASSERT(pl2303_vendor_write(p_cdc, PL2303_HXN_RESET_REG,// skip CONFIG_PL2303_RESET_ENDP2, no 2nd step\n                                        PL2303_HXN_RESET_UPSTREAM_PIPE | PL2303_HXN_RESET_DOWNSTREAM_PIPE,\n                                        cdch_process_set_config, CONFIG_PL2303_COMPLETE));\n        } else {\n          pl2303_vendor_write(p_cdc, 8, 0, cdch_process_set_config, CONFIG_PL2303_RESET_ENDP2);\n        }\n      }\n      break;\n\n    case CONFIG_PL2303_RESET_ENDP2:\n      // step 2\n      if (p_cdc->pl2303.quirks & PL2303_QUIRK_LEGACY) {\n        TU_ASSERT(pl2303_clear_halt(p_cdc, PL2303_IN_EP, cdch_process_set_config, CONFIG_PL2303_COMPLETE));\n      } else {\n        /* reset upstream data pipes */\n        if (p_cdc->pl2303.type == PL2303_TYPE_HXN) {\n          // here nothing to do, only structure of previous step overtaken for better reading and comparison\n        } else {\n          TU_ASSERT(pl2303_vendor_write(p_cdc, 9, 0, cdch_process_set_config, CONFIG_PL2303_COMPLETE));\n        }\n      }\n      break;\n\n  // skipped, because it's not working with each PL230x. flow control can be also set by PL2303 EEPROM Writer Program\n  //    case CONFIG_PL2303_FLOW_CTRL_READ:\n  //      // read flow control register for modify & write back in next step\n  //      if (p_cdc->pl2303.type == PL2303_TYPE_HXN) {\n  //        TU_LOG_P_CDC ( \"1\\r\\n\" );\n  //        TU_ASSERT(pl2303_vendor_read(p_cdc, PL2303_HXN_FLOWCTRL_REG, &buf,\n  //                                     cdch_process_set_config, CONFIG_PL2303_FLOW_CTRL_WRITE));\n  //      } else {\n  //        TU_LOG_P_CDC ( \"2\\r\\n\" );\n  //        TU_ASSERT(pl2303_vendor_read(p_cdc, 0, &buf, cdch_process_set_config, CONFIG_PL2303_FLOW_CTRL_WRITE));\n  //      }\n  //      break;\n  //\n  //    case CONFIG_PL2303_FLOW_CTRL_WRITE:\n  //      // no flow control\n  //      buf = xfer->buffer[0];\n  //      if (p_cdc->pl2303.type == PL2303_TYPE_HXN) {\n  //        buf &= (uint8_t) ~PL2303_HXN_FLOWCTRL_MASK;\n  //        buf |= PL2303_HXN_FLOWCTRL_NONE;\n  //        TU_ASSERT(pl2303_vendor_write(p_cdc, PL2303_HXN_FLOWCTRL_REG, buf,\n  //                                      cdch_process_set_config, CONFIG_PL2303_COMPLETE));\n  //      } else {\n  //        buf &= (uint8_t) ~PL2303_FLOWCTRL_MASK;\n  //        TU_ASSERT(pl2303_vendor_write(p_cdc, 0, buf,\n  //                                      cdch_process_set_config, CONFIG_PL2303_COMPLETE));\n  //      }\n  //      break;\n\n    case CONFIG_PL2303_COMPLETE:\n      xfer->user_data = 0; // kick-off set line state on enum\n      cdch_process_line_state_on_enum(xfer);\n      break;\n\n    default:\n      return false;\n  }\n\n  return true;\n}\n\n//------------- Helper -------------//\n\nstatic pl2303_type_t pl2303_detect_type(cdch_interface_t *p_cdc, uint8_t step) {\n  tusb_desc_device_t desc_dev;\n  TU_VERIFY(tuh_descriptor_get_device_local(p_cdc->daddr, &desc_dev), PL2303_TYPE_UNKNOWN);\n\n  // Legacy PL2303H, variants 0 and 1 (difference unknown).\n  if (desc_dev.bDeviceClass == 0x02) {\n    return PL2303_TYPE_H; /* variant 0 */\n  }\n\n  if (desc_dev.bMaxPacketSize0 != 0x40) {\n    if (desc_dev.bDeviceClass == 0x00 || desc_dev.bDeviceClass == 0xff) {\n      return PL2303_TYPE_H; /* variant 1 */\n    }\n    return PL2303_TYPE_H; /* variant 0 */\n  }\n\n  switch (desc_dev.bcdUSB) {\n    case 0x101:\n      /* USB 1.0.1? Let's assume they meant 1.1... */\n      TU_ATTR_FALLTHROUGH;\n    case 0x110:\n      switch (desc_dev.bcdDevice) {\n        case 0x300: return PL2303_TYPE_HX;\n        case 0x400: return PL2303_TYPE_HXD;\n        default: return PL2303_TYPE_HX;\n      }\n      break;\n\n    case 0x200:\n      switch (desc_dev.bcdDevice) {\n        case 0x100: /* GC */\n        case 0x105:\n          return PL2303_TYPE_HXN;\n\n        case 0x300: /* GT / TA */\n          if (step == 1) {\n            // step 1 trigger pl2303_supports_hx_status() request\n            return PL2303_TYPE_NEED_SUPPORTS_HX_STATUS;\n          } else {\n            // step 2 use supports_hx_status\n            if (p_cdc->pl2303.supports_hx_status) {\n              return PL2303_TYPE_TA;\n            }\n          }\n          TU_ATTR_FALLTHROUGH;\n        case 0x305:\n        case 0x400: /* GL */\n        case 0x405:\n          return PL2303_TYPE_HXN;\n\n        case 0x500: /* GE / TB */\n          if (step == 1) {\n            // step 1 trigger pl2303_supports_hx_status() request\n            return PL2303_TYPE_NEED_SUPPORTS_HX_STATUS;\n          } else {\n            // step 2 use supports_hx_status\n            if (p_cdc->pl2303.supports_hx_status) {\n              return PL2303_TYPE_TB;\n            }\n          }\n          TU_ATTR_FALLTHROUGH;\n        case 0x505:\n        case 0x600: /* GS */\n        case 0x605:\n        case 0x700: /* GR */\n        case 0x705:\n          return PL2303_TYPE_HXN;\n\n        default:\n          break; // unknown device\n      }\n      break;\n\n    default:\n      break; // unknown device\n  }\n\n  TU_LOG_CDC(p_cdc, \"unknown device type bcdUSB = 0x%04x\", desc_dev.bcdUSB);\n  return PL2303_TYPE_UNKNOWN;\n}\n\n/*\n * Returns the nearest supported baud rate that can be set directly without\n * using divisors.\n */\nstatic uint32_t pl2303_get_supported_baud_rate(uint32_t baud) {\n  static const uint32_t baud_sup[] = {\n    75, 150, 300, 600, 1200, 1800, 2400, 3600, 4800, 7200, 9600,\n    14400, 19200, 28800, 38400, 57600, 115200, 230400, 460800,\n    614400, 921600, 1228800, 2457600, 3000000, 6000000\n  };\n\n  uint8_t i;\n  for (i = 0; i < TU_ARRAY_SIZE(baud_sup); ++i) {\n    if (baud_sup[i] > baud) {\n      break;\n    }\n  }\n\n  if (i == TU_ARRAY_SIZE(baud_sup)) {\n    baud = baud_sup[i - 1];\n  } else if (i > 0 && (baud_sup[i] - baud) > (baud - baud_sup[i - 1])) {\n    baud = baud_sup[i - 1];\n  } else {\n    baud = baud_sup[i];\n  }\n\n  return baud;\n}\n\n/*\n * NOTE: If unsupported baud rates are set directly, the PL2303 seems to\n *       use 9600 baud.\n */\nstatic uint32_t pl2303_encode_baud_rate_direct(uint8_t buf[PL2303_LINE_CODING_BAUDRATE_BUFSIZE], uint32_t baud) {\n  uint32_t baud_le = tu_htole32(baud);\n  buf[0] = (uint8_t) ( baud_le        & 0xff);\n  buf[1] = (uint8_t) ((baud_le >>  8) & 0xff);\n  buf[2] = (uint8_t) ((baud_le >> 16) & 0xff);\n  buf[3] = (uint8_t) ((baud_le >> 24) & 0xff);\n\n  return baud;\n}\n\nstatic uint32_t pl2303_encode_baud_rate_divisor(uint8_t buf[PL2303_LINE_CODING_BAUDRATE_BUFSIZE], uint32_t baud) {\n  uint32_t baseline, mantissa, exponent;\n\n  /*\n   * Apparently the formula is:\n   *   baudrate = 12M * 32 / (mantissa * 4^exponent)\n   * where\n   *   mantissa = buf[8:0]\n   *   exponent = buf[11:9]\n   */\n  baseline = 12000000 * 32;\n  mantissa = baseline / baud;\n  if (mantissa == 0) {\n    mantissa = 1; /* Avoid dividing by zero if baud > 32 * 12M. */\n  }\n  exponent = 0;\n  while (mantissa >= 512) {\n    if (exponent < 7) {\n      mantissa >>= 2; /* divide by 4 */\n      exponent++;\n    } else {\n      /* Exponent is maxed. Trim mantissa and leave. */\n      mantissa = 511;\n      break;\n    }\n  }\n\n  buf[3] = 0x80;\n  buf[2] = 0;\n  buf[1] = (uint8_t) ((exponent << 1 | mantissa >> 8) & 0xff);\n  buf[0] = (uint8_t) (mantissa & 0xff);\n\n  /* Calculate and return the exact baud rate. */\n  baud = (baseline / mantissa) >> (exponent << 1);\n\n  return baud;\n}\n\nstatic uint32_t pl2303_encode_baud_rate_divisor_alt(uint8_t buf[PL2303_LINE_CODING_BAUDRATE_BUFSIZE], uint32_t baud) {\n  uint32_t baseline, mantissa, exponent;\n\n  /*\n   * Apparently, for the TA version the formula is:\n   *   baudrate = 12M * 32 / (mantissa * 2^exponent)\n   * where\n   *   mantissa = buf[10:0]\n   *   exponent = buf[15:13 16]\n   */\n  baseline = 12000000 * 32;\n  mantissa = baseline / baud;\n  if (mantissa == 0) {\n    mantissa = 1; /* Avoid dividing by zero if baud > 32 * 12M. */\n  }\n  exponent = 0;\n  while (mantissa >= 2048) {\n    if (exponent < 15) {\n      mantissa >>= 1; /* divide by 2 */\n      exponent++;\n    } else {\n      /* Exponent is maxed. Trim mantissa and leave. */\n      mantissa = 2047;\n      break;\n    }\n  }\n\n  buf[3] = 0x80;\n  buf[2] = (uint8_t) (exponent & 0x01);\n  buf[1] = (uint8_t) (((exponent & (uint32_t) ~0x01) << 4 | mantissa >> 8) & 0xff);\n  buf[0] = (uint8_t) (mantissa & 0xff);\n\n  /* Calculate and return the exact baud rate. */\n  baud = (baseline / mantissa) >> exponent;\n\n  return baud;\n}\n\nstatic bool pl2303_encode_baud_rate(cdch_interface_t *p_cdc, uint8_t buf[PL2303_LINE_CODING_BAUDRATE_BUFSIZE]) {\n  uint32_t baud = p_cdc->requested_line.coding.bit_rate;\n  uint32_t baud_sup;\n  const pl2303_type_data_t* type_data = &pl2303_type_data[p_cdc->pl2303.type];\n\n  TU_VERIFY(baud && baud <= type_data->max_baud_rate);\n  /*\n   * Use direct method for supported baud rates, otherwise use divisors.\n   * Newer chip types do not support divisor encoding.\n   */\n  if (type_data->no_divisors != 0) {\n    baud_sup = baud;\n  } else {\n    baud_sup = pl2303_get_supported_baud_rate(baud);\n  }\n\n  if (baud == baud_sup) {\n    baud = pl2303_encode_baud_rate_direct(buf, baud);\n  } else if (type_data->alt_divisors != 0) {\n    baud = pl2303_encode_baud_rate_divisor_alt(buf, baud);\n  } else {\n    baud = pl2303_encode_baud_rate_divisor(buf, baud);\n  }\n  TU_LOG_CDC(p_cdc, \"real baudrate %lu\", baud);\n\n  return true;\n}\n\n#endif // CFG_TUH_CDC_PL2303\n\n#endif\n"
  },
  {
    "path": "src/class/cdc/cdc_host.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_CDC_HOST_H_\n#define TUSB_CDC_HOST_H_\n\n#include \"cdc.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n\n// RX FIFO size\n#ifndef CFG_TUH_CDC_RX_BUFSIZE\n  #define CFG_TUH_CDC_RX_BUFSIZE TUH_EPSIZE_BULK_MAX\n#endif\n\n// RX Endpoint size\n#ifndef CFG_TUH_CDC_RX_EPSIZE\n  #define CFG_TUH_CDC_RX_EPSIZE TUH_EPSIZE_BULK_MAX\n#endif\n\n// TX FIFO size\n#ifndef CFG_TUH_CDC_TX_BUFSIZE\n  #define CFG_TUH_CDC_TX_BUFSIZE TUH_EPSIZE_BULK_MAX\n#endif\n\n// TX Endpoint size\n#ifndef CFG_TUH_CDC_TX_EPSIZE\n  #define CFG_TUH_CDC_TX_EPSIZE TUH_EPSIZE_BULK_MAX\n#endif\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// Get Interface index from device address + interface number\n// return TUSB_INDEX_INVALID_8 (0xFF) if not found\nuint8_t tuh_cdc_itf_get_index(uint8_t daddr, uint8_t itf_num);\n\n// Get Interface information\n// return true if index is correct and interface is currently mounted\nbool tuh_cdc_itf_get_info(uint8_t idx, tuh_itf_info_t *info);\n\n// Check if an interface is mounted\nbool tuh_cdc_mounted(uint8_t idx);\n\n// Get local (cached) line state\n// This function should return correct values if tuh_cdc_set_control_line_state() / tuh_cdc_get_control_line_state()\n// are invoked previously or CFG_TUH_CDC_LINE_STATE_ON_ENUM is defined.\nbool tuh_cdc_get_control_line_state_local(uint8_t idx, uint16_t *line_state);\n\n// Get current DTR status\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_cdc_get_dtr(uint8_t idx) {\n  uint16_t line_state;\n  TU_VERIFY(tuh_cdc_get_control_line_state_local(idx, &line_state));\n  return (line_state & CDC_CONTROL_LINE_STATE_DTR) != 0;\n}\n\n// Get current RTS status\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_cdc_get_rts(uint8_t idx) {\n  uint16_t line_state;\n  TU_VERIFY(tuh_cdc_get_control_line_state_local(idx, &line_state));\n  return (line_state & CDC_CONTROL_LINE_STATE_RTS) != 0;\n}\n\n// Check if interface is connected (DTR active)\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_cdc_connected(uint8_t idx) {\n  return tuh_cdc_get_dtr(idx);\n}\n\n// Get local (saved/cached) version of line coding.\n// This function should return correct values if tuh_cdc_set_line_coding() / tuh_cdc_get_line_coding()\n// are invoked previously or CFG_TUH_CDC_LINE_CODING_ON_ENUM is defined.\n// NOTE: This function does not make any USB transfer request to device.\nbool tuh_cdc_get_line_coding_local(uint8_t idx, cdc_line_coding_t *line_coding);\n\n#define tuh_cdc_get_local_line_coding tuh_cdc_get_line_coding_local // backward compatibility\n\n//--------------------------------------------------------------------+\n// Write API\n//--------------------------------------------------------------------+\n\n// Get the number of bytes available for writing\nuint32_t tuh_cdc_write_available(uint8_t idx);\n\n// Write to cdc interface\nuint32_t tuh_cdc_write(uint8_t idx, const void *buffer, uint32_t bufsize);\n\n// Force sending data if possible, return number of forced bytes\nuint32_t tuh_cdc_write_flush(uint8_t idx);\n\n// Clear the transmit FIFO\nbool tuh_cdc_write_clear(uint8_t idx);\n\n//--------------------------------------------------------------------+\n// Read API\n//--------------------------------------------------------------------+\n\n// Get the number of bytes available for reading\nuint32_t tuh_cdc_read_available(uint8_t idx);\n\n// Read from cdc interface\nuint32_t tuh_cdc_read(uint8_t idx, void *buffer, uint32_t bufsize);\n\n// Get a byte from RX FIFO without removing it\nbool tuh_cdc_peek(uint8_t idx, uint8_t *ch);\n\n// Clear the received FIFO\nbool tuh_cdc_read_clear(uint8_t idx);\n\n//--------------------------------------------------------------------+\n// Control Request API\n// Each Function will make a USB control transfer request to/from device\n// - If complete_cb is provided, the function will return immediately and invoke\n// the callback when request is complete.\n// - If complete_cb is NULL, the function will block until request is complete.\n// In this case, user_data should be usb_xfer_result_t* to hold the transfer result.\n//--------------------------------------------------------------------+\n\n// Request to Set Control Line State: DTR (bit 0), RTS (bit 1)\nbool tuh_cdc_set_control_line_state(uint8_t idx, uint16_t line_state, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Request to Set DTR\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_cdc_set_dtr(uint8_t idx, bool dtr_state, tuh_xfer_cb_t complete_cb,\n                                                         uintptr_t user_data) {\n  cdc_line_control_state_t line_state = {.dtr = dtr_state};\n  line_state.rts                      = tuh_cdc_get_rts(idx);\n  return tuh_cdc_set_control_line_state(idx, line_state.value, complete_cb, user_data);\n}\n\n// Request to Set RTS\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_cdc_set_rts(uint8_t idx, bool rts_state, tuh_xfer_cb_t complete_cb,\n                                                         uintptr_t user_data) {\n  cdc_line_control_state_t line_state = {.rts = rts_state};\n  line_state.dtr                      = tuh_cdc_get_dtr(idx);\n  return tuh_cdc_set_control_line_state(idx, line_state.value, complete_cb, user_data);\n}\n\n// Request to set baudrate\nbool tuh_cdc_set_baudrate(uint8_t idx, uint32_t baudrate, tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Request to set data format\nbool tuh_cdc_set_data_format(uint8_t idx, uint8_t stop_bits, uint8_t parity, uint8_t data_bits,\n                             tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Request to Set Line Coding = baudrate + data format\n// Note: only implemented by ACM and CH34x, not supported by FTDI and CP210x yet\nbool tuh_cdc_set_line_coding(uint8_t idx, const cdc_line_coding_t *line_coding, tuh_xfer_cb_t complete_cb,\n                             uintptr_t user_data);\n\n// Request to Get Line Coding (ACM only)\n// Should only use if tuh_cdc_set_line_coding() / tuh_cdc_get_line_coding() never got invoked and\n// CFG_TUH_CDC_LINE_CODING_ON_ENUM is not defined\n// bool tuh_cdc_get_line_coding(uint8_t idx, cdc_line_coding_t* coding);\n\n// Connect by set both DTR, RTS\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_cdc_connect(uint8_t idx, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return tuh_cdc_set_control_line_state(idx, CDC_CONTROL_LINE_STATE_DTR | CDC_CONTROL_LINE_STATE_RTS, complete_cb,\n                                        user_data);\n}\n\n// Disconnect by clear both DTR, RTS\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_cdc_disconnect(uint8_t idx, tuh_xfer_cb_t complete_cb,\n                                                            uintptr_t user_data) {\n  return tuh_cdc_set_control_line_state(idx, 0x00, complete_cb, user_data);\n}\n\n//--------------------------------------------------------------------+\n// Control Request Sync API\n// Each Function will make a USB control transfer request to/from device the function will block until request is\n// complete. The function will return the transfer request result\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_cdc_set_control_line_state_sync(uint8_t  idx,\n                                                                                           uint16_t line_state) {\n  TU_API_SYNC(tuh_cdc_set_control_line_state, idx, line_state);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_cdc_set_dtr_sync(uint8_t idx, bool dtr_state) {\n  TU_API_SYNC(tuh_cdc_set_dtr, idx, dtr_state);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_cdc_set_rts_sync(uint8_t idx, bool rts_state) {\n  TU_API_SYNC(tuh_cdc_set_rts, idx, rts_state);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_cdc_set_baudrate_sync(uint8_t idx, uint32_t baudrate) {\n  TU_API_SYNC(tuh_cdc_set_baudrate, idx, baudrate);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_cdc_set_data_format_sync(uint8_t idx, uint8_t stop_bits,\n                                                                                    uint8_t parity, uint8_t data_bits) {\n  TU_API_SYNC(tuh_cdc_set_data_format, idx, stop_bits, parity, data_bits);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t\ntuh_cdc_set_line_coding_sync(uint8_t idx, const cdc_line_coding_t *line_coding) {\n  TU_API_SYNC(tuh_cdc_set_line_coding, idx, line_coding);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_cdc_connect_sync(uint8_t idx) {\n  TU_API_SYNC(tuh_cdc_connect, idx);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_cdc_disconnect_sync(uint8_t idx) {\n  TU_API_SYNC(tuh_cdc_disconnect, idx);\n}\n\n//--------------------------------------------------------------------+\n// CDC APPLICATION CALLBACKS\n//--------------------------------------------------------------------+\n\n// Invoked when a device with CDC interface is mounted\n// idx is index of cdc interface in the internal pool.\nextern void tuh_cdc_mount_cb(uint8_t idx);\n\n// Invoked when a device with CDC interface is unmounted\nextern void tuh_cdc_umount_cb(uint8_t idx);\n\n// Invoked when received new data\nextern void tuh_cdc_rx_cb(uint8_t idx);\n\n// Invoked when a TX is complete and therefore space becomes available in TX buffer\nextern void tuh_cdc_tx_complete_cb(uint8_t idx);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nbool     cdch_init(void);\nbool     cdch_deinit(void);\nuint16_t cdch_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nbool     cdch_set_config(uint8_t dev_addr, uint8_t itf_num);\nbool     cdch_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\nvoid     cdch_close(uint8_t dev_addr);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_CDC_HOST_H_ */\n"
  },
  {
    "path": "src/class/cdc/cdc_rndis.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/** \\ingroup ClassDriver_CDC Communication Device Class (CDC)\n * \\defgroup CDC_RNDIS Remote Network Driver Interface Specification (RNDIS)\n *  @{\n *  \\defgroup CDC_RNDIS_Common Common Definitions\n *  @{ */\n\n#ifndef TUSB_CDC_RNDIS_H_\n#define TUSB_CDC_RNDIS_H_\n\n#include \"cdc.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifdef __CC_ARM\n#pragma diag_suppress 66 // Suppress Keil warnings #66-D: enumeration value is out of \"int\" range\n#endif\n\n/// RNDIS Message Types\ntypedef enum\n{\n  RNDIS_MSG_PACKET           = 0x00000001UL, ///< The host and device use this to send network data to one another.\n\n  RNDIS_MSG_INITIALIZE       = 0x00000002UL, ///< Sent by the host to initialize the device.\n  RNDIS_MSG_INITIALIZE_CMPLT = 0x80000002UL, ///< Device response to an initialize message.\n\n  RNDIS_MSG_HALT             = 0x00000003UL, ///< Sent by the host to halt the device. This does not have a response. It is optional for the device to send this message to the host.\n\n  RNDIS_MSG_QUERY            = 0x00000004UL, ///< Sent by the host to send a query OID.\n  RNDIS_MSG_QUERY_CMPLT      = 0x80000004UL, ///< Device response to a query OID.\n\n  RNDIS_MSG_SET              = 0x00000005UL, ///< Sent by the host to send a set OID.\n  RNDIS_MSG_SET_CMPLT        = 0x80000005UL, ///< Device response to a set OID.\n\n  RNDIS_MSG_RESET            = 0x00000006UL, ///< Sent by the host to perform a soft reset on the device.\n  RNDIS_MSG_RESET_CMPLT      = 0x80000006UL, ///< Device response to reset message.\n\n  RNDIS_MSG_INDICATE_STATUS  = 0x00000007UL, ///< Sent by the device to indicate its status or an error when an unrecognized message is received.\n\n  RNDIS_MSG_KEEP_ALIVE       = 0x00000008UL, ///< During idle periods, sent every few seconds by the host to check that the device is still responsive. It is optional for the device to send this message to check if the host is active.\n  RNDIS_MSG_KEEP_ALIVE_CMPLT = 0x80000008UL  ///< The device response to a keepalivemessage. The host can respond with this message to a keepalive message from the device when the device implements the optional KeepAliveTimer.\n}rndis_msg_type_t;\n\n/// RNDIS Message Status Values\ntypedef enum\n{\n  RNDIS_STATUS_SUCCESS          = 0x00000000UL, ///< Success\n  RNDIS_STATUS_FAILURE          = 0xC0000001UL, ///< Unspecified error\n  RNDIS_STATUS_INVALID_DATA     = 0xC0010015UL, ///< Invalid data error\n  RNDIS_STATUS_NOT_SUPPORTED    = 0xC00000BBUL, ///< Unsupported request error\n  RNDIS_STATUS_MEDIA_CONNECT    = 0x4001000BUL, ///< Device is connected to a network medium.\n  RNDIS_STATUS_MEDIA_DISCONNECT = 0x4001000CUL  ///< Device is disconnected from the medium.\n}rndis_msg_status_t;\n\n#ifdef __CC_ARM\n#pragma diag_default 66 // return Keil 66 to normal severity\n#endif\n\n//--------------------------------------------------------------------+\n// MESSAGE STRUCTURE\n//--------------------------------------------------------------------+\n\n//------------- Initialize -------------//\n/// \\brief Initialize Message\n/// \\details This message MUST be sent by the host to initialize the device.\ntypedef struct {\n  uint32_t type          ; ///< Message type, must be \\ref RNDIS_MSG_INITIALIZE\n  uint32_t length        ; ///< Message length in bytes, must be 0x18\n  uint32_t request_id    ; ///< A 32-bit integer value, generated by the host, used to match the host's sent request to the response from the device.\n  uint32_t major_version ; ///< The major version of the RNDIS Protocol implemented by the host.\n  uint32_t minor_version ; ///< The minor version of the RNDIS Protocol implemented by the host\n  uint32_t max_xfer_size ; ///< The maximum size, in bytes, of any single bus data transfer that the host expects to receive from the device.\n}rndis_msg_initialize_t;\n\n/// \\brief Initialize Complete Message\n/// \\details This message MUST be sent by the device in response to an initialize message.\ntypedef struct {\n  uint32_t type                    ; ///< Message Type, must be \\ref RNDIS_MSG_INITIALIZE_CMPLT\n  uint32_t length                  ; ///< Message length in bytes, must be 0x30\n  uint32_t request_id              ; ///< A 32-bit integer value from \\a request_id field of the \\ref rndis_msg_initialize_t to which this message is a response.\n  uint32_t status                  ; ///< The initialization status of the device, has value from \\ref rndis_msg_status_t\n  uint32_t major_version           ; ///< the highest-numbered RNDIS Protocol version supported by the device.\n  uint32_t minor_version           ; ///< the highest-numbered RNDIS Protocol version supported by the device.\n  uint32_t device_flags            ; ///< MUST be set to 0x000000010. Other values are reserved for future use.\n  uint32_t medium                  ; ///< is 0x00 for RNDIS_MEDIUM_802_3\n  uint32_t max_packet_per_xfer     ; ///< The maximum number of concatenated \\ref RNDIS_MSG_PACKET messages that the device can handle in a single bus transfer to it. This value MUST be at least 1.\n  uint32_t max_xfer_size           ; ///< The maximum size, in bytes, of any single bus data transfer that the device expects to receive from the host.\n  uint32_t packet_alignment_factor ; ///< The byte alignment the device expects for each RNDIS message that is part of a multimessage transfer to it. The value is specified as an exponent of 2; for example, the host uses 2<SUP>{PacketAlignmentFactor}</SUP> as the alignment value.\n  uint32_t reserved[2]             ;\n} rndis_msg_initialize_cmplt_t;\n\n//------------- Query -------------//\n/// \\brief Query Message\n/// \\details This message MUST be sent by the host to query an OID.\ntypedef struct {\n  uint32_t type          ; ///< Message Type, must be \\ref RNDIS_MSG_QUERY\n  uint32_t length        ; ///< Message length in bytes, including the header and the \\a oid_buffer\n  uint32_t request_id    ; ///< A 32-bit integer value, generated by the host, used to match the host's sent request to the response from the device.\n  uint32_t oid           ; ///< The integer value of the host operating system-defined identifier, for the parameter of the device being queried for.\n  uint32_t buffer_length ; ///< The length, in bytes, of the input data required for the OID query. This MUST be set to 0 when there is no input data associated with the OID.\n  uint32_t buffer_offset ; ///< The offset, in bytes, from the beginning of \\a request_id field where the input data for the query is located in the message. This value MUST be set to 0 when there is no input data associated with the OID.\n  uint32_t reserved      ;\n  uint8_t  oid_buffer[]  ; ///< Flexible array contains the input data supplied by the host, required for the OID query request processing by the device, as per the host NDIS specification.\n} rndis_msg_query_t, rndis_msg_set_t;\n\nTU_VERIFY_STATIC(sizeof(rndis_msg_query_t) == 28, \"Make sure flexible array member does not affect layout\");\n\n/// \\brief Query Complete Message\n/// \\details This message MUST be sent by the device in response to a query OID message.\ntypedef struct {\n  uint32_t type          ; ///< Message Type, must be \\ref RNDIS_MSG_QUERY_CMPLT\n  uint32_t length        ; ///< Message length in bytes, including the header and the \\a oid_buffer\n  uint32_t request_id    ; ///< A 32-bit integer value from \\a request_id field of the \\ref rndis_msg_query_t to which this message is a response.\n  uint32_t status        ; ///< The status of processing for the query request, has value from \\ref rndis_msg_status_t.\n  uint32_t buffer_length ; ///< The length, in bytes, of the data in the response to the query. This MUST be set to 0 when there is no OIDInputBuffer.\n  uint32_t buffer_offset ; ///< The offset, in bytes, from the beginning of \\a request_id field where the response data for the query is located in the message. This MUST be set to 0 when there is no \\ref oid_buffer.\n  uint8_t  oid_buffer[]  ; ///< Flexible array member contains the response data to the OID query request as specified by the host.\n} rndis_msg_query_cmplt_t;\n\nTU_VERIFY_STATIC(sizeof(rndis_msg_query_cmplt_t) == 24, \"Make sure flexible array member does not affect layout\");\n\n//------------- Reset -------------//\n/// \\brief Reset Message\n/// \\details This message MUST be sent by the host to perform a soft reset on the device.\ntypedef struct {\n  uint32_t type     ; ///< Message Type, must be \\ref RNDIS_MSG_RESET\n  uint32_t length   ; ///< Message length in bytes, MUST be 0x06\n  uint32_t reserved ;\n} rndis_msg_reset_t;\n\n/// \\brief Reset Complete Message\n/// \\details This message MUST be sent by the device in response to a reset message.\ntypedef struct {\n  uint32_t type             ; ///< Message Type, must be \\ref RNDIS_MSG_RESET_CMPLT\n  uint32_t length           ; ///< Message length in bytes, MUST be 0x10\n  uint32_t status           ; ///< The status of processing for the \\ref rndis_msg_reset_t, has value from \\ref rndis_msg_status_t.\n  uint32_t addressing_reset ; ///< This field indicates whether the addressing information, which is the multicast address list or packet filter, has been lost during the reset operation. This MUST be set to 0x00000001 if the device requires that the host to resend addressing information or MUST be set to zero otherwise.\n} rndis_msg_reset_cmplt_t;\n\n//typedef struct {\n//  uint32_t type;\n//  uint32_t length;\n//  uint32_t status;\n//  uint32_t buffer_length;\n//  uint32_t buffer_offset;\n//  uint32_t diagnostic_status; // optional\n//  uint32_t diagnostic_error_offset; // optional\n//  uint32_t status_buffer[0]; // optional\n//} rndis_msg_indicate_status_t;\n\n/// \\brief Keep Alive Message\n/// \\details This message MUST be sent by the host to check that device is still responsive. It is optional for the device to send this message to check if the host is active\ntypedef struct {\n  uint32_t type       ; ///< Message Type\n  uint32_t length     ; ///< Message length in bytes, MUST be 0x10\n  uint32_t request_id ;\n} rndis_msg_keep_alive_t, rndis_msg_halt_t;\n\n/// \\brief Set Complete Message\n/// \\brief This message MUST be sent in response to a the request message\ntypedef struct {\n  uint32_t type       ; ///< Message Type\n  uint32_t length     ; ///< Message length in bytes, MUST be 0x10\n  uint32_t request_id ; ///< must be the same as requesting message\n  uint32_t status     ; ///< The status of processing for the request message request by the device to which this message is the response.\n} rndis_msg_set_cmplt_t, rndis_msg_keep_alive_cmplt_t;\n\n/// \\brief Packet Data Message\n/// \\brief This message MUST be used by the host and the device to send network data to one another.\ntypedef struct {\n  uint32_t type                          ; ///< Message Type, must be \\ref RNDIS_MSG_PACKET\n  uint32_t length                        ; ///< Message length in bytes, The total length of this RNDIS message including the header, payload, and padding.\n  uint32_t data_offset                   ; ///< Specifies the offset, in bytes, from the start of this \\a data_offset field of this message to the start of the data. This MUST be an integer multiple of 4.\n  uint32_t data_length                   ; ///< Specifies the number of bytes in the payload of this message.\n  uint32_t out_of_band_data_offet        ; ///< Specifies the offset, in bytes, of the first out-of-band data record from the start of the DataOffset field in this message. MUST be an integer multiple of 4 when out-of-band data is present or set to 0 otherwise. When there are multiple out-ofband data records, each subsequent record MUST immediately follow the previous out-of-band data record.\n  uint32_t out_of_band_data_length       ; ///< Specifies, in bytes, the total length of the out-of-band data.\n  uint32_t num_out_of_band_data_elements ; ///< Specifies the number of out-of-band records in this message.\n  uint32_t per_packet_info_offset        ; ///< Specifies the offset, in bytes, of the start of per-packet-info data record from the start of the \\a data_offset field in this message. MUST be an integer multiple of 4 when per-packet-info data record is present or MUST be set to 0 otherwise. When there are multiple per-packet-info data records, each subsequent record MUST immediately follow the previous record.\n  uint32_t per_packet_info_length        ; ///< Specifies, in bytes, the total length of per-packetinformation contained in this message.\n  uint32_t reserved[2]                   ;\n  uint32_t payload[0]                    ; ///< Network data contained in this message.\n\n  // uint8_t  padding[0]\n  // Additional bytes of zeros added at the end of the message to comply with\n  // the internal and external padding requirements. Internal padding SHOULD be as per the\n  // specification of the out-of-band data record and per-packet-info data record. The external\n  //padding size SHOULD be determined based on the PacketAlignmentFactor field specification\n  //in REMOTE_NDIS_INITIALIZE_CMPLT message by the device, when multiple\n  //REMOTE_NDIS_PACKET_MSG messages are bundled together in a single bus-native message.\n  //In this case, all but the very last REMOTE_NDIS_PACKET_MSG MUST respect the\n  //PacketAlignmentFactor field.\n\n  // rndis_msg_packet_t [0] : (optional) more packet if multiple packet per bus transaction is supported\n} rndis_msg_packet_t;\n\n\ntypedef struct {\n  uint32_t size    ; ///< Length, in bytes, of this header and appended data and padding. This value MUST be an integer multiple of 4.\n  uint32_t type    ; ///< MUST be as per host operating system specification.\n  uint32_t offset  ; ///< The byte offset from the beginning of this record to the beginning of data.\n  uint32_t data[0] ; ///< Flexible array contains data\n} rndis_msg_out_of_band_data_t, rndis_msg_per_packet_info_t;\n\n//--------------------------------------------------------------------+\n// NDIS Object ID\n//--------------------------------------------------------------------+\n\n/// NDIS Object ID\ntypedef enum\n{\n  //------------- General Required OIDs -------------//\n  RNDIS_OID_GEN_SUPPORTED_LIST          = 0x00010101, ///< List of supported OIDs\n  RNDIS_OID_GEN_HARDWARE_STATUS         = 0x00010102, ///< Hardware status\n  RNDIS_OID_GEN_MEDIA_SUPPORTED         = 0x00010103, ///< Media types supported (encoded)\n  RNDIS_OID_GEN_MEDIA_IN_USE            = 0x00010104, ///< Media types in use (encoded)\n  RNDIS_OID_GEN_MAXIMUM_LOOKAHEAD       = 0x00010105, ///<\n  RNDIS_OID_GEN_MAXIMUM_FRAME_SIZE      = 0x00010106, ///< Maximum frame size in bytes\n  RNDIS_OID_GEN_LINK_SPEED              = 0x00010107, ///< Link speed in units of 100 bps\n  RNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE   = 0x00010108, ///< Transmit buffer space\n  RNDIS_OID_GEN_RECEIVE_BUFFER_SPACE    = 0x00010109, ///< Receive buffer space\n  RNDIS_OID_GEN_TRANSMIT_BLOCK_SIZE     = 0x0001010A, ///< Minimum amount of storage, in bytes, that a single packet occupies in the transmit buffer space of the NIC\n  RNDIS_OID_GEN_RECEIVE_BLOCK_SIZE      = 0x0001010B, ///< Amount of storage, in bytes, that a single packet occupies in the receive buffer space of the NIC\n  RNDIS_OID_GEN_VENDOR_ID               = 0x0001010C, ///< Vendor NIC code\n  RNDIS_OID_GEN_VENDOR_DESCRIPTION      = 0x0001010D, ///< Vendor network card description\n  RNDIS_OID_GEN_CURRENT_PACKET_FILTER   = 0x0001010E, ///< Current packet filter (encoded)\n  RNDIS_OID_GEN_CURRENT_LOOKAHEAD       = 0x0001010F, ///< Current lookahead size in bytes\n  RNDIS_OID_GEN_DRIVER_VERSION          = 0x00010110, ///< NDIS version number used by the driver\n  RNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE      = 0x00010111, ///< Maximum total packet length in bytes\n  RNDIS_OID_GEN_PROTOCOL_OPTIONS        = 0x00010112, ///< Optional protocol flags (encoded)\n  RNDIS_OID_GEN_MAC_OPTIONS             = 0x00010113, ///< Optional NIC flags (encoded)\n  RNDIS_OID_GEN_MEDIA_CONNECT_STATUS    = 0x00010114, ///< Whether the NIC is connected to the network\n  RNDIS_OID_GEN_MAXIMUM_SEND_PACKETS    = 0x00010115, ///< The maximum number of send packets the driver can accept per call to its MiniportSendPacketsfunction\n\n  //------------- General Optional OIDs -------------//\n  RNDIS_OID_GEN_VENDOR_DRIVER_VERSION   = 0x00010116, ///< Vendor-assigned version number of the driver\n  RNDIS_OID_GEN_SUPPORTED_GUIDS         = 0x00010117, ///< The custom GUIDs (Globally Unique Identifier) supported by the miniport driver\n  RNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES = 0x00010118, ///< List of network-layer addresses associated with the binding between a transport and the driver\n  RNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET = 0x00010119, ///< Size of packets' additional headers\n  RNDIS_OID_GEN_MEDIA_CAPABILITIES      = 0x00010201, ///<\n  RNDIS_OID_GEN_PHYSICAL_MEDIUM         = 0x00010202, ///< Physical media supported by the miniport driver (encoded)\n\n  //------------- 802.3 Objects (Ethernet) -------------//\n  RNDIS_OID_802_3_PERMANENT_ADDRESS     = 0x01010101, ///< Permanent station address\n  RNDIS_OID_802_3_CURRENT_ADDRESS       = 0x01010102, ///< Current station address\n  RNDIS_OID_802_3_MULTICAST_LIST        = 0x01010103, ///< Current multicast address list\n  RNDIS_OID_802_3_MAXIMUM_LIST_SIZE     = 0x01010104, ///< Maximum size of multicast address list\n} rndis_oid_type_t;\n\n/// RNDIS Packet Filter Bits \\ref RNDIS_OID_GEN_CURRENT_PACKET_FILTER.\ntypedef enum\n{\n  RNDIS_PACKET_TYPE_DIRECTED              = 0x00000001, ///< Directed packets. Directed packets contain a destination address equal to the station address of the NIC.\n  RNDIS_PACKET_TYPE_MULTICAST             = 0x00000002, ///< Multicast address packets sent to addresses in the multicast address list.\n  RNDIS_PACKET_TYPE_ALL_MULTICAST         = 0x00000004, ///< All multicast address packets, not just the ones enumerated in the multicast address list.\n  RNDIS_PACKET_TYPE_BROADCAST             = 0x00000008, ///< Broadcast packets.\n  RNDIS_PACKET_TYPE_SOURCE_ROUTING        = 0x00000010, ///< All source routing packets. If the protocol driver sets this bit, the NDIS library attempts to act as a source routing bridge.\n  RNDIS_PACKET_TYPE_PROMISCUOUS           = 0x00000020, ///< Specifies all packets regardless of whether VLAN filtering is enabled or not and whether the VLAN identifier matches or not.\n  RNDIS_PACKET_TYPE_SMT                   = 0x00000040, ///< SMT packets that an FDDI NIC receives.\n  RNDIS_PACKET_TYPE_ALL_LOCAL             = 0x00000080, ///< All packets sent by installed protocols and all packets indicated by the NIC that is identified by a given NdisBindingHandle.\n  RNDIS_PACKET_TYPE_GROUP                 = 0x00001000, ///< Packets sent to the current group address.\n  RNDIS_PACKET_TYPE_ALL_FUNCTIONAL        = 0x00002000, ///< All functional address packets, not just the ones in the current functional address.\n  RNDIS_PACKET_TYPE_FUNCTIONAL            = 0x00004000, ///< Functional address packets sent to addresses included in the current functional address.\n  RNDIS_PACKET_TYPE_MAC_FRAME             = 0x00008000, ///< NIC driver frames that a Token Ring NIC receives.\n  RNDIS_PACKET_TYPE_NO_LOCAL              = 0x00010000,\n} rndis_packet_filter_type_t;\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CDC_RNDIS_H_ */\n\n/** @} */\n/** @} */\n"
  },
  {
    "path": "src/class/cdc/serial/ch34x.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Heiko Kuester\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_CH34X_H\n#define TUSB_CH34X_H\n\n// There is no official documentation for the CH34x (CH340, CH341) chips. Reference can be found\n// - https://github.com/WCHSoftGroup/ch341ser_linux\n// - https://github.com/torvalds/linux/blob/master/drivers/usb/serial/ch341.c\n// - https://github.com/freebsd/freebsd-src/blob/main/sys/dev/usb/serial/uchcom.c\n\n// set line_coding @ enumeration\n#ifdef CFG_TUH_CDC_LINE_CODING_ON_ENUM\n  #define CFG_TUH_CDC_LINE_CODING_ON_ENUM_CH34X CFG_TUH_CDC_LINE_CODING_ON_ENUM\n#else // this default is necessary to work properly\n  #define CFG_TUH_CDC_LINE_CODING_ON_ENUM_CH34X { 9600, CDC_LINE_CONDING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 }\n#endif\n\n// USB requests\n#define CH34X_REQ_READ_VERSION        0x5F // dec  95\n#define CH34X_REQ_WRITE_REG           0x9A // dec 154\n#define CH34X_REQ_READ_REG            0x95 // dec 149\n#define CH34X_REQ_SERIAL_INIT         0xA1 // dec 161\n#define CH34X_REQ_MODEM_CTRL          0xA4 // dev 164\n\n// registers\n#define CH34X_REG_BREAK               0x05\n#define CH34X_REG_PRESCALER           0x12\n#define CH34X_REG_DIVISOR             0x13\n#define CH34X_REG_LCR                 0x18\n#define CH34X_REG_LCR2                0x25\n#define CH34X_REG_MCR_MSR             0x06\n#define CH34X_REG_MCR_MSR2            0x07\n#define CH34X_NBREAK_BITS             0x01\n\n#define CH341_REG_0x0F                0x0F // undocumented register\n#define CH341_REG_0x2C                0x2C // undocumented register\n#define CH341_REG_0x27                0x27 // hardware flow control (cts/rts)\n\n#define CH34X_REG16_DIVISOR_PRESCALER TU_U16(CH34X_REG_DIVISOR, CH34X_REG_PRESCALER)\n#define CH32X_REG16_LCR2_LCR          TU_U16(CH34X_REG_LCR2, CH34X_REG_LCR)\n\n// modem control bits\n#define CH34X_BIT_RTS                 (1 << 6)\n#define CH34X_BIT_DTR                 (1 << 5)\n\n// line control bits\n#define CH34X_LCR_ENABLE_RX           0x80\n#define CH34X_LCR_ENABLE_TX           0x40\n#define CH34X_LCR_MARK_SPACE          0x20\n#define CH34X_LCR_PAR_EVEN            0x10\n#define CH34X_LCR_ENABLE_PAR          0x08\n#define CH34X_LCR_PAR_MASK            0x38 // all parity bits\n#define CH34X_LCR_STOP_BITS_2         0x04\n#define CH34X_LCR_CS8                 0x03\n#define CH34X_LCR_CS7                 0x02\n#define CH34X_LCR_CS6                 0x01\n#define CH34X_LCR_CS5                 0x00\n#define CH34X_LCR_CS_MASK             0x03 // all CSx bits\n\n#endif // TUSB_CH34X_H\n"
  },
  {
    "path": "src/class/cdc/serial/cp210x.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (thach@tinyusb.org) for Adafruit Industries\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#ifndef TUSB_CP210X_H\n#define TUSB_CP210X_H\n\n// Protocol details can be found at AN571: CP210x Virtual COM Port Interface\n// https://www.silabs.com/documents/public/application-notes/AN571.pdf\n\n// parts are overtaken from vendors driver\n// https://www.silabs.com/documents/public/software/cp210x-3.1.0.tar.gz\n\n// Config request codes\n#define CP210X_IFC_ENABLE      0x00\n#define CP210X_SET_BAUDDIV     0x01\n#define CP210X_GET_BAUDDIV     0x02\n#define CP210X_SET_LINE_CTL    0x03 // Set parity, data bits, stop bits\n#define CP210X_GET_LINE_CTL    0x04\n#define CP210X_SET_BREAK       0x05\n#define CP210X_IMM_CHAR        0x06\n#define CP210X_SET_MHS         0x07 // Set DTR, RTS\n#define CP210X_GET_MDMSTS      0x08 // Get modem status (DTR, RTS, CTS, DSR, RI, DCD)\n#define CP210X_SET_XON         0x09\n#define CP210X_SET_XOFF        0x0A\n#define CP210X_SET_EVENTMASK   0x0B\n#define CP210X_GET_EVENTMASK   0x0C\n#define CP210X_SET_CHAR        0x0D\n#define CP210X_GET_CHARS       0x0E\n#define CP210X_GET_PROPS       0x0F\n#define CP210X_GET_COMM_STATUS 0x10\n#define CP210X_RESET           0x11\n#define CP210X_PURGE           0x12\n#define CP210X_SET_FLOW        0x13\n#define CP210X_GET_FLOW        0x14\n#define CP210X_EMBED_EVENTS    0x15\n#define CP210X_GET_EVENTSTATE  0x16\n#define CP210X_SET_CHARS       0x19\n#define CP210X_GET_BAUDRATE    0x1D\n#define CP210X_SET_BAUDRATE    0x1E\n#define CP210X_VENDOR_SPECIFIC 0xFF // GPIO, Recipient must be Device\n\n// SILABSER_IFC_ENABLE_REQUEST_CODE\n#define CP210X_UART_ENABLE              0x0001\n#define CP210X_UART_DISABLE             0x0000\n\n// SILABSER_SET_BAUDDIV_REQUEST_CODE\n#define CP210X_BAUD_RATE_GEN_FREQ     0x384000\n\n// SILABSER_SET_LINE_CTL_REQUEST_CODE\n#define CP210X_BITS_DATA_MASK           0x0f00\n#define CP210X_BITS_DATA_5              0x0500\n#define CP210X_BITS_DATA_6              0x0600\n#define CP210X_BITS_DATA_7              0x0700\n#define CP210X_BITS_DATA_8              0x0800\n#define CP210X_BITS_DATA_9              0x0900\n\n#define CP210X_BITS_PARITY_MASK         0x00f0\n#define CP210X_BITS_PARITY_NONE         0x0000\n#define CP210X_BITS_PARITY_ODD          0x0010\n#define CP210X_BITS_PARITY_EVEN         0x0020\n#define CP210X_BITS_PARITY_MARK         0x0030\n#define CP210X_BITS_PARITY_SPACE        0x0040\n\n#define CP210X_BITS_STOP_MASK           0x000f\n#define CP210X_BITS_STOP_1              0x0000\n#define CP210X_BITS_STOP_1_5            0x0001\n#define CP210X_BITS_STOP_2              0x0002\n\n// SILABSER_SET_BREAK_REQUEST_CODE\n#define CP210X_BREAK_ON                 0x0001\n#define CP210X_BREAK_OFF                0x0000\n\n// SILABSER_SET_MHS_REQUEST_CODE\n#define CP210X_MCR_DTR                  0x0001\n#define CP210X_MCR_RTS                  0x0002\n#define CP210X_MCR_ALL                  0x0003\n#define CP210X_MSR_CTS                  0x0010\n#define CP210X_MSR_DSR                  0x0020\n#define CP210X_MSR_RING                 0x0040\n#define CP210X_MSR_DCD                  0x0080\n#define CP210X_MSR_ALL                  0x00F0\n\n#define CP210X_CONTROL_WRITE_DTR        0x0100UL\n#define CP210X_CONTROL_WRITE_RTS        0x0200UL\n\n#define CP210X_LSR_BREAK                0x0001\n#define CP210X_LSR_FRAMING_ERROR        0x0002\n#define CP210X_LSR_HW_OVERRUN           0x0004\n#define CP210X_LSR_QUEUE_OVERRUN        0x0008\n#define CP210X_LSR_PARITY_ERROR         0x0010\n#define CP210X_LSR_ALL                  0x001F\n\n#endif //TUSB_CP210X_H\n"
  },
  {
    "path": "src/class/cdc/serial/ftdi_sio.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (thach@tinyusb.org) for Adafruit Industries\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#ifndef TUSB_FTDI_SIO_H\n#define TUSB_FTDI_SIO_H\n\n#include <stdint.h>\n\n// Commands\n#define FTDI_SIO_RESET                0 // Reset the port\n#define FTDI_SIO_MODEM_CTRL           1 // Set the modem control register\n#define FTDI_SIO_SET_FLOW_CTRL        2 // Set flow control register\n#define FTDI_SIO_SET_BAUD_RATE        3 // Set baud rate\n#define FTDI_SIO_SET_DATA             4 // Set the data characteristics of the port\n#define FTDI_SIO_GET_MODEM_STATUS     5 // Retrieve current value of modem status register\n#define FTDI_SIO_SET_EVENT_CHAR       6 // Set the event character\n#define FTDI_SIO_SET_ERROR_CHAR       7 // Set the error character\n#define FTDI_SIO_SET_LATENCY_TIMER    9 // Set the latency timer\n#define FTDI_SIO_GET_LATENCY_TIMER   10 // Get the latency timer\n#define FTDI_SIO_SET_BITMODE         11 // Set bitbang mode\n#define FTDI_SIO_READ_PINS           12 // Read immediate value of pins\n#define FTDI_SIO_READ_EEPROM       0x90 // Read EEPROM\n\n// Channel indices for FT2232, FT2232H and FT4232H devices\n#define CHANNEL_A 1\n#define CHANNEL_B 2\n#define CHANNEL_C 3\n#define CHANNEL_D 4\n\n// Port Identifier Table\n#define PIT_DEFAULT  0 // SIOA\n#define PIT_SIOA     1 // SIOA\n// The device this driver is tested with one has only one port\n#define PIT_SIOB     2 // SIOB\n#define PIT_PARALLEL 3 // Parallel\n\n// FTDI_SIO_RESET\n#define FTDI_SIO_RESET_REQUEST                    FTDI_SIO_RESET\n#define FTDI_SIO_RESET_REQUEST_TYPE               0x40\n#define FTDI_SIO_RESET_SIO                        0\n#define FTDI_SIO_RESET_PURGE_RX                   1\n#define FTDI_SIO_RESET_PURGE_TX                   2\n\n// FTDI_SIO_SET_BAUDRATE\n#define FTDI_SIO_SET_BAUDRATE_REQUEST_TYPE        0x40\n#define FTDI_SIO_SET_BAUDRATE_REQUEST             3\n\nenum ftdi_sio_baudrate {\n  ftdi_sio_b300 = 0,\n  ftdi_sio_b600 = 1,\n  ftdi_sio_b1200 = 2,\n  ftdi_sio_b2400 = 3,\n  ftdi_sio_b4800 = 4,\n  ftdi_sio_b9600 = 5,\n  ftdi_sio_b19200 = 6,\n  ftdi_sio_b38400 = 7,\n  ftdi_sio_b57600 = 8,\n  ftdi_sio_b115200 = 9\n};\n\n// FTDI_SIO_SET_DATA\n#define FTDI_SIO_SET_DATA_REQUEST                 FTDI_SIO_SET_DATA\n#define FTDI_SIO_SET_DATA_REQUEST_TYPE            0x40\n#define FTDI_SIO_SET_DATA_PARITY_NONE             (0x0 << 8)\n#define FTDI_SIO_SET_DATA_PARITY_ODD              (0x1 << 8)\n#define FTDI_SIO_SET_DATA_PARITY_EVEN             (0x2 << 8)\n#define FTDI_SIO_SET_DATA_PARITY_MARK             (0x3 << 8)\n#define FTDI_SIO_SET_DATA_PARITY_SPACE            (0x4 << 8)\n#define FTDI_SIO_SET_DATA_STOP_BITS_1             (0x0 << 11) // same coding as ACM\n#define FTDI_SIO_SET_DATA_STOP_BITS_15            (0x1 << 11) // 1.5 not supported, for future use?\n#define FTDI_SIO_SET_DATA_STOP_BITS_2             (0x2 << 11)\n#define FTDI_SIO_SET_BREAK                        (0x1 << 14)\n\n// FTDI_SIO_MODEM_CTRL\n#define FTDI_SIO_SET_MODEM_CTRL_REQUEST_TYPE      0x40\n#define FTDI_SIO_SET_MODEM_CTRL_REQUEST           FTDI_SIO_MODEM_CTRL\n\n#define FTDI_SIO_SET_DTR_MASK                     0x1UL\n#define FTDI_SIO_SET_DTR_HIGH                     ((FTDI_SIO_SET_DTR_MASK << 8) | 1UL)\n#define FTDI_SIO_SET_DTR_LOW                      ((FTDI_SIO_SET_DTR_MASK << 8) | 0UL)\n#define FTDI_SIO_SET_RTS_MASK                     0x2UL\n#define FTDI_SIO_SET_RTS_HIGH                     ((FTDI_SIO_SET_RTS_MASK << 8) | 2UL)\n#define FTDI_SIO_SET_RTS_LOW                      ((FTDI_SIO_SET_RTS_MASK << 8) | 0UL)\n\n// FTDI_SIO_SET_FLOW_CTRL\n#define FTDI_SIO_SET_FLOW_CTRL_REQUEST_TYPE       0x40\n#define FTDI_SIO_SET_FLOW_CTRL_REQUEST            FTDI_SIO_SET_FLOW_CTRL\n#define FTDI_SIO_DISABLE_FLOW_CTRL                0x0\n#define FTDI_SIO_RTS_CTS_HS                       (0x1 << 8)\n#define FTDI_SIO_DTR_DSR_HS                       (0x2 << 8)\n#define FTDI_SIO_XON_XOFF_HS                      (0x4 << 8)\n\n// FTDI_SIO_GET_LATENCY_TIMER\n#define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST       FTDI_SIO_GET_LATENCY_TIMER\n#define  FTDI_SIO_GET_LATENCY_TIMER_REQUEST_TYPE  0xC0\n\n// FTDI_SIO_SET_LATENCY_TIMER\n#define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST       FTDI_SIO_SET_LATENCY_TIMER\n#define  FTDI_SIO_SET_LATENCY_TIMER_REQUEST_TYPE  0x40\n\n// FTDI_SIO_SET_EVENT_CHAR\n#define  FTDI_SIO_SET_EVENT_CHAR_REQUEST          FTDI_SIO_SET_EVENT_CHAR\n#define  FTDI_SIO_SET_EVENT_CHAR_REQUEST_TYPE     0x40\n\n// FTDI_SIO_GET_MODEM_STATUS\n#define FTDI_SIO_GET_MODEM_STATUS_REQUEST_TYPE    0xc0\n#define FTDI_SIO_GET_MODEM_STATUS_REQUEST         FTDI_SIO_GET_MODEM_STATUS\n#define FTDI_SIO_CTS_MASK                         0x10\n#define FTDI_SIO_DSR_MASK                         0x20\n#define FTDI_SIO_RI_MASK                          0x40\n#define FTDI_SIO_RLSD_MASK                        0x80\n\n// FTDI_SIO_SET_BITMODE\n#define FTDI_SIO_SET_BITMODE_REQUEST_TYPE         0x40\n#define FTDI_SIO_SET_BITMODE_REQUEST              FTDI_SIO_SET_BITMODE\n\n// Possible bitmodes for FTDI_SIO_SET_BITMODE_REQUEST\n#define FTDI_SIO_BITMODE_RESET                    0x00\n#define FTDI_SIO_BITMODE_CBUS                     0x20\n\n// FTDI_SIO_READ_PINS\n#define FTDI_SIO_READ_PINS_REQUEST_TYPE           0xc0\n#define FTDI_SIO_READ_PINS_REQUEST                FTDI_SIO_READ_PINS\n\n// FTDI_SIO_READ_EEPROM\n#define FTDI_SIO_READ_EEPROM_REQUEST_TYPE         0xc0\n#define FTDI_SIO_READ_EEPROM_REQUEST              FTDI_SIO_READ_EEPROM\n\n#define FTDI_FTX_CBUS_MUX_GPIO    0x8\n#define FTDI_FT232R_CBUS_MUX_GPIO 0xa\n\n#define FTDI_RS0_CTS  (1 << 4)\n#define FTDI_RS0_DSR  (1 << 5)\n#define FTDI_RS0_RI   (1 << 6)\n#define FTDI_RS0_RLSD (1 << 7)\n\n#define FTDI_RS_DR    1\n#define FTDI_RS_OE    (1 << 1)\n#define FTDI_RS_PE    (1 << 2)\n#define FTDI_RS_FE    (1 << 3)\n#define FTDI_RS_BI    (1 << 4)\n#define FTDI_RS_THRE  (1 << 5)\n#define FTDI_RS_TEMT  (1 << 6)\n#define FTDI_RS_FIFO  (1 << 7)\n\n// chip types and names\ntypedef enum ftdi_chip_type {\n  FTDI_SIO = 0,\n//  FTDI_FT232A,\n  FTDI_FT232B,\n  FTDI_FT2232C,\n  FTDI_FT232R,\n  FTDI_FT232H,\n  FTDI_FT2232H,\n  FTDI_FT4232H,\n  FTDI_FT4232HA,\n  FTDI_FT232HP,\n  FTDI_FT233HP,\n  FTDI_FT2232HP,\n  FTDI_FT2233HP,\n  FTDI_FT4232HP,\n  FTDI_FT4233HP,\n  FTDI_FTX,\n  FTDI_UNKNOWN\n} ftdi_chip_type_t;\n\n#define FTDI_CHIP_NAMES \\\n  [FTDI_SIO]       = \"SIO\", /* the serial part of FT8U100AX */ \\\n/*  [FTDI_FT232A]    = \"FT232A\", */ \\\n  [FTDI_FT232B]    = \"FT232B\", \\\n  [FTDI_FT2232C]   = \"FT2232C/D\", \\\n  [FTDI_FT232R]    = \"FT232R\", \\\n  [FTDI_FT232H]    = \"FT232H\", \\\n  [FTDI_FT2232H]   = \"FTDI_FT2232H\", \\\n  [FTDI_FT4232H]   = \"FT4232H\", \\\n  [FTDI_FT4232HA]  = \"FT4232HA\", \\\n  [FTDI_FT232HP]   = \"FT232HP\", \\\n  [FTDI_FT233HP]   = \"FT233HP\", \\\n  [FTDI_FT2232HP]  = \"FT2232HP\", \\\n  [FTDI_FT2233HP]  = \"FT2233HP\", \\\n  [FTDI_FT4232HP]  = \"FT4232HP\", \\\n  [FTDI_FT4233HP]  = \"FT4233HP\", \\\n  [FTDI_FTX]       = \"FT-X\", \\\n  [FTDI_UNKNOWN]   = \"UNKNOWN\"\n\n// private interface data\ntypedef struct ftdi_private {\n  ftdi_chip_type_t chip_type;\n  uint8_t channel;                  // channel index, or 0 for legacy types\n} ftdi_private_t;\n\n#define FTDI_OK           true\n#define FTDI_FAIL         false\n#define FTDI_NOT_POSSIBLE -1\n#define FTDI_REQUESTED    -2\n\n#endif //TUSB_FTDI_SIO_H\n"
  },
  {
    "path": "src/class/cdc/serial/pl2303.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Heiko Kuester\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_PL2303_H\n#define TUSB_PL2303_H\n\n#include <stdbool.h>\n#include <stdint.h>\n\n// There is no official documentation for the PL2303 chips.\n// Reference can be found\n// - https://github.com/torvalds/linux/blob/master/drivers/usb/serial/pl2303.h and\n//   https://github.com/torvalds/linux/blob/master/drivers/usb/serial/pl2303.c\n// - https://github.com/freebsd/freebsd-src/blob/main/sys/dev/usb/serial/uplcom.c\n\n// quirks\n#define PL2303_QUIRK_UART_STATE_IDX0      1\n#define PL2303_QUIRK_LEGACY               2\n#define PL2303_QUIRK_ENDPOINT_HACK        4\n\n// requests and bits\n#define PL2303_SET_LINE_REQUEST_TYPE      0x21    // class request host to device interface\n#define PL2303_SET_LINE_REQUEST           0x20    // dec 32\n\n#define PL2303_SET_CONTROL_REQUEST_TYPE   0x21    // class request host to device interface\n#define PL2303_SET_CONTROL_REQUEST        0x22    // dec 34\n#define PL2303_CONTROL_DTR                0x01    // dec 1\n#define PL2303_CONTROL_RTS                0x02    // dec 2\n\n#define PL2303_BREAK_REQUEST_TYPE         0x21    // class request host to device interface\n#define PL2303_BREAK_REQUEST              0x23    // dec 35\n#define PL2303_BREAK_ON                   0xffff\n#define PL2303_BREAK_OFF                  0x0000\n\n#define PL2303_GET_LINE_REQUEST_TYPE      0xa1    // class request device to host interface\n#define PL2303_GET_LINE_REQUEST           0x21    // dec 33\n\n#define PL2303_VENDOR_WRITE_REQUEST_TYPE  0x40    // vendor request host to device interface\n#define PL2303_VENDOR_WRITE_REQUEST       0x01    // dec 1\n#define PL2303_VENDOR_WRITE_NREQUEST      0x80    // dec 128\n\n#define PL2303_VENDOR_READ_REQUEST_TYPE   0xc0    // vendor request device to host interface\n#define PL2303_VENDOR_READ_REQUEST        0x01    // dec 1\n#define PL2303_VENDOR_READ_NREQUEST       0x81    // dec 129\n\n#define PL2303_UART_STATE_INDEX           8\n#define PL2303_UART_STATE_MSR_MASK        0x8b\n#define PL2303_UART_STATE_TRANSIENT_MASK  0x74\n#define PL2303_UART_DCD                   0x01\n#define PL2303_UART_DSR                   0x02\n#define PL2303_UART_BREAK_ERROR           0x04\n#define PL2303_UART_RING                  0x08\n#define PL2303_UART_FRAME_ERROR           0x10\n#define PL2303_UART_PARITY_ERROR          0x20\n#define PL2303_UART_OVERRUN_ERROR         0x40\n#define PL2303_UART_CTS                   0x80\n\n#define PL2303_FLOWCTRL_MASK              0xf0\n\n#define PL2303_CLEAR_HALT_REQUEST_TYPE    0x02    // standard request host to device endpoint\n\n// registers via vendor read/write requests\n#define PL2303_READ_TYPE_HX_STATUS        0x8080\n\n#define PL2303_HXN_RESET_REG              0x07\n#define PL2303_HXN_RESET_UPSTREAM_PIPE    0x02\n#define PL2303_HXN_RESET_DOWNSTREAM_PIPE  0x01\n\n#define PL2303_HXN_FLOWCTRL_REG           0x0a\n#define PL2303_HXN_FLOWCTRL_MASK          0x1c\n#define PL2303_HXN_FLOWCTRL_NONE          0x1c\n#define PL2303_HXN_FLOWCTRL_RTS_CTS       0x18\n#define PL2303_HXN_FLOWCTRL_XON_XOFF      0x0c\n\n// type data\ntypedef enum pl2303_type {\n  PL2303_TYPE_H = 0, // 0\n  PL2303_TYPE_HX,    // 1\n  PL2303_TYPE_TA,    // 2\n  PL2303_TYPE_TB,    // 3\n  PL2303_TYPE_HXD,   // 4\n  PL2303_TYPE_HXN,   // 5\n  PL2303_TYPE_COUNT,\n  PL2303_TYPE_NEED_SUPPORTS_HX_STATUS,\n  PL2303_TYPE_UNKNOWN,\n} pl2303_type_t;\n\ntypedef struct pl2303_type_data {\n  uint32_t max_baud_rate;\n  uint8_t  quirks;\n  uint8_t  no_autoxonxoff : 1;\n  uint8_t  no_divisors    : 1;\n  uint8_t  alt_divisors   : 1;\n} pl2303_type_data_t;\n\n#define PL2303_TYPE_DATA \\\n  [PL2303_TYPE_H] = { \\\n    .max_baud_rate = 1228800, .quirks = PL2303_QUIRK_LEGACY, \\\n    .no_autoxonxoff = 1, .no_divisors = 0, .alt_divisors = 0 \\\n  }, \\\n  [PL2303_TYPE_HX] = { \\\n    .max_baud_rate = 6000000, .quirks = 0, \\\n    .no_autoxonxoff = 0, .no_divisors = 0, .alt_divisors = 0 \\\n  }, \\\n  [PL2303_TYPE_TA] = { \\\n    .max_baud_rate = 6000000, .quirks = 0, \\\n    .no_autoxonxoff = 0, .no_divisors = 0, .alt_divisors = 1 \\\n  }, \\\n  [PL2303_TYPE_TB] = { \\\n    .max_baud_rate = 12000000, .quirks = 0, \\\n    .no_autoxonxoff = 0, .no_divisors = 0, .alt_divisors = 1 \\\n  }, \\\n  [PL2303_TYPE_HXD] = { \\\n    .max_baud_rate = 12000000, .quirks = 0, \\\n    .no_autoxonxoff = 0, .no_divisors = 0, .alt_divisors = 0 \\\n  }, \\\n  [PL2303_TYPE_HXN] = { \\\n    .max_baud_rate = 12000000, .quirks = 0, \\\n    .no_autoxonxoff = 0, .no_divisors = 1, .alt_divisors = 0 \\\n  }\n\ntypedef struct TU_ATTR_PACKED {\n  pl2303_type_t type;\n  uint8_t quirks;\n  bool supports_hx_status;\n} pl2303_private_t;\n\n// buffer sizes for line coding data\n#define PL2303_LINE_CODING_BUFSIZE          7\n#define PL2303_LINE_CODING_BAUDRATE_BUFSIZE 4\n\n// bulk endpoints\n#define PL2303_OUT_EP                       0x02\n#define PL2303_IN_EP                        0x83\n\n#endif // TUSB_PL2303_H\n"
  },
  {
    "path": "src/class/dfu/dfu.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 XMOS LIMITED\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DFU_H_\n#define TUSB_DFU_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Common Definitions\n//--------------------------------------------------------------------+\n\n// DFU Protocol\ntypedef enum\n{\n  DFU_PROTOCOL_RT  = 0x01,\n  DFU_PROTOCOL_DFU = 0x02,\n} dfu_protocol_type_t;\n\n// DFU Descriptor Type\ntypedef enum\n{\n  DFU_DESC_FUNCTIONAL = 0x21,\n} dfu_descriptor_type_t;\n\n// DFU Requests\ntypedef enum {\n  DFU_REQUEST_DETACH         = 0,\n  DFU_REQUEST_DNLOAD         = 1,\n  DFU_REQUEST_UPLOAD         = 2,\n  DFU_REQUEST_GETSTATUS      = 3,\n  DFU_REQUEST_CLRSTATUS      = 4,\n  DFU_REQUEST_GETSTATE       = 5,\n  DFU_REQUEST_ABORT          = 6,\n} dfu_requests_t;\n\n// DFU States\ntypedef enum {\n  APP_IDLE                   = 0,\n  APP_DETACH                 = 1,\n  DFU_IDLE                   = 2,\n  DFU_DNLOAD_SYNC            = 3,\n  DFU_DNBUSY                 = 4,\n  DFU_DNLOAD_IDLE            = 5,\n  DFU_MANIFEST_SYNC          = 6,\n  DFU_MANIFEST               = 7,\n  DFU_MANIFEST_WAIT_RESET    = 8,\n  DFU_UPLOAD_IDLE            = 9,\n  DFU_ERROR                  = 10,\n} dfu_state_t;\n\n// DFU Status\ntypedef enum {\n  DFU_STATUS_OK               = 0x00,\n  DFU_STATUS_ERR_TARGET       = 0x01,\n  DFU_STATUS_ERR_FILE         = 0x02,\n  DFU_STATUS_ERR_WRITE        = 0x03,\n  DFU_STATUS_ERR_ERASE        = 0x04,\n  DFU_STATUS_ERR_CHECK_ERASED = 0x05,\n  DFU_STATUS_ERR_PROG         = 0x06,\n  DFU_STATUS_ERR_VERIFY       = 0x07,\n  DFU_STATUS_ERR_ADDRESS      = 0x08,\n  DFU_STATUS_ERR_NOTDONE      = 0x09,\n  DFU_STATUS_ERR_FIRMWARE     = 0x0A,\n  DFU_STATUS_ERR_VENDOR       = 0x0B,\n  DFU_STATUS_ERR_USBR         = 0x0C,\n  DFU_STATUS_ERR_POR          = 0x0D,\n  DFU_STATUS_ERR_UNKNOWN      = 0x0E,\n  DFU_STATUS_ERR_STALLEDPKT   = 0x0F,\n} dfu_status_t;\n\n#define DFU_ATTR_CAN_DOWNLOAD              (1u << 0)\n#define DFU_ATTR_CAN_UPLOAD                (1u << 1)\n#define DFU_ATTR_MANIFESTATION_TOLERANT    (1u << 2)\n#define DFU_ATTR_WILL_DETACH               (1u << 3)\n\n// DFU Status Request Payload\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t bStatus;\n  uint8_t bwPollTimeout[3];\n  uint8_t bState;\n  uint8_t iString;\n} dfu_status_response_t;\n\nTU_VERIFY_STATIC( sizeof(dfu_status_response_t) == 6, \"size is not correct\");\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_DFU_H_ */\n"
  },
  {
    "path": "src/class/dfu/dfu_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 XMOS LIMITED\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_DFU)\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"dfu_device.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUD_DFU_LOG_LEVEL\n  #define CFG_TUD_DFU_LOG_LEVEL   CFG_TUD_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUD_DFU_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t attrs;\n  uint8_t alt;\n  uint8_t state;\n  uint8_t status;\n\n  bool     flashing_in_progress;\n  uint16_t block;\n  uint16_t length;\n} dfu_state_ctx_t;\n\nstatic dfu_state_ctx_t _dfu_ctx;\n\n#if CFG_TUD_DFU_XFER_BUFSIZE > CFG_TUD_ENDPOINT0_BUFSIZE\nTU_ATTR_ALIGNED(4) uint8_t _transfer_buf[CFG_TUD_DFU_XFER_BUFSIZE];\n#endif\n\nstatic void reset_state(void) {\n  _dfu_ctx.state = DFU_IDLE;\n  _dfu_ctx.status = DFU_STATUS_OK;\n  _dfu_ctx.flashing_in_progress = false;\n}\n\nstatic inline uint8_t* get_xfer_buffer(void) {\n  // Use EP0 buffer if it is large enough, otherwise use dedicated buffer\n  #if CFG_TUD_DFU_XFER_BUFSIZE > CFG_TUD_ENDPOINT0_BUFSIZE\n  return _transfer_buf;\n  #else\n  return usbd_get_ctrl_buf();\n  #endif\n}\n\nstatic bool reply_getstatus(uint8_t rhport, const tusb_control_request_t* request, dfu_state_t state, dfu_status_t status, uint32_t timeout);\nstatic bool process_download_get_status(uint8_t rhport, uint8_t stage, const tusb_control_request_t* request);\nstatic bool process_manifest_get_status(uint8_t rhport, uint8_t stage, const tusb_control_request_t* request);\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_dfu_detach_cb(void) {\n}\n\nTU_ATTR_WEAK void tud_dfu_abort_cb(uint8_t alt) {\n  (void) alt;\n}\n\nTU_ATTR_WEAK uint16_t tud_dfu_upload_cb(uint8_t alt, uint16_t block_num, uint8_t* data, uint16_t length) {\n  (void) alt;\n  (void) block_num;\n  (void) data;\n  (void) length;\n  return 0;\n}\n\n//--------------------------------------------------------------------+\n// Debug\n//--------------------------------------------------------------------+\n#if CFG_TUSB_DEBUG >= 2\n\ntu_static tu_lookup_entry_t const _dfu_request_lookup[] = {\n  { .key = DFU_REQUEST_DETACH   , .data = \"DETACH\"    },\n  { .key = DFU_REQUEST_DNLOAD   , .data = \"DNLOAD\"    },\n  { .key = DFU_REQUEST_UPLOAD   , .data = \"UPLOAD\"    },\n  { .key = DFU_REQUEST_GETSTATUS, .data = \"GETSTATUS\" },\n  { .key = DFU_REQUEST_CLRSTATUS, .data = \"CLRSTATUS\" },\n  { .key = DFU_REQUEST_GETSTATE , .data = \"GETSTATE\"  },\n  { .key = DFU_REQUEST_ABORT    , .data = \"ABORT\"     },\n};\n\ntu_static tu_lookup_table_t const _dfu_request_table = {\n  .count = TU_ARRAY_SIZE(_dfu_request_lookup),\n  .items = _dfu_request_lookup\n};\n\ntu_static tu_lookup_entry_t const _dfu_state_lookup[] = {\n  { .key = APP_IDLE               , .data = \"APP_IDLE\"            },\n  { .key = APP_DETACH             , .data = \"APP_DETACH\"          },\n  { .key = DFU_IDLE               , .data = \"IDLE\"                },\n  { .key = DFU_DNLOAD_SYNC        , .data = \"DNLOAD_SYNC\"         },\n  { .key = DFU_DNBUSY             , .data = \"DNBUSY\"              },\n  { .key = DFU_DNLOAD_IDLE        , .data = \"DNLOAD_IDLE\"         },\n  { .key = DFU_MANIFEST_SYNC      , .data = \"MANIFEST_SYNC\"       },\n  { .key = DFU_MANIFEST           , .data = \"MANIFEST\"            },\n  { .key = DFU_MANIFEST_WAIT_RESET, .data = \"MANIFEST_WAIT_RESET\" },\n  { .key = DFU_UPLOAD_IDLE        , .data = \"UPLOAD_IDLE\"         },\n  { .key = DFU_ERROR              , .data = \"ERROR\"               },\n};\n\ntu_static tu_lookup_table_t const _dfu_state_table = {\n  .count = TU_ARRAY_SIZE(_dfu_state_lookup),\n  .items = _dfu_state_lookup\n};\n\ntu_static tu_lookup_entry_t const _dfu_status_lookup[] = {\n  { .key = DFU_STATUS_OK               , .data = \"OK\"              },\n  { .key = DFU_STATUS_ERR_TARGET       , .data = \"errTARGET\"       },\n  { .key = DFU_STATUS_ERR_FILE         , .data = \"errFILE\"         },\n  { .key = DFU_STATUS_ERR_WRITE        , .data = \"errWRITE\"        },\n  { .key = DFU_STATUS_ERR_ERASE        , .data = \"errERASE\"        },\n  { .key = DFU_STATUS_ERR_CHECK_ERASED , .data = \"errCHECK_ERASED\" },\n  { .key = DFU_STATUS_ERR_PROG         , .data = \"errPROG\"         },\n  { .key = DFU_STATUS_ERR_VERIFY       , .data = \"errVERIFY\"       },\n  { .key = DFU_STATUS_ERR_ADDRESS      , .data = \"errADDRESS\"      },\n  { .key = DFU_STATUS_ERR_NOTDONE      , .data = \"errNOTDONE\"      },\n  { .key = DFU_STATUS_ERR_FIRMWARE     , .data = \"errFIRMWARE\"     },\n  { .key = DFU_STATUS_ERR_VENDOR       , .data = \"errVENDOR\"       },\n  { .key = DFU_STATUS_ERR_USBR         , .data = \"errUSBR\"         },\n  { .key = DFU_STATUS_ERR_POR          , .data = \"errPOR\"          },\n  { .key = DFU_STATUS_ERR_UNKNOWN      , .data = \"errUNKNOWN\"      },\n  { .key = DFU_STATUS_ERR_STALLEDPKT   , .data = \"errSTALLEDPKT\"   },\n};\n\ntu_static tu_lookup_table_t const _dfu_status_table = {\n  .count = TU_ARRAY_SIZE(_dfu_status_lookup),\n  .items = _dfu_status_lookup\n};\n\n#endif\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid dfu_moded_reset(uint8_t rhport) {\n  (void) rhport;\n  _dfu_ctx.attrs = 0;\n  _dfu_ctx.alt = 0;\n  reset_state();\n}\n\nvoid dfu_moded_init(void) {\n  dfu_moded_reset(0);\n}\n\nbool dfu_moded_deinit(void) {\n  return true;\n}\n\nuint16_t dfu_moded_open(uint8_t rhport, const tusb_desc_interface_t* itf_desc, uint16_t max_len) {\n  (void) rhport;\n\n  //------------- Interface (with Alt) descriptor -------------//\n  const uint8_t itf_num = itf_desc->bInterfaceNumber;\n  uint8_t alt_count = 0;\n\n  uint16_t drv_len = 0;\n  TU_VERIFY(itf_desc->bInterfaceSubClass == TUD_DFU_APP_SUBCLASS && itf_desc->bInterfaceProtocol == DFU_PROTOCOL_DFU, 0);\n\n  while(itf_desc->bInterfaceSubClass == TUD_DFU_APP_SUBCLASS && itf_desc->bInterfaceProtocol == DFU_PROTOCOL_DFU) {\n    TU_ASSERT(max_len > drv_len, 0);\n\n    // Alternate must have the same interface number\n    TU_ASSERT(itf_desc->bInterfaceNumber == itf_num, 0);\n\n    // Alt should increase by one every time\n    TU_ASSERT(itf_desc->bAlternateSetting == alt_count, 0);\n    alt_count++;\n\n    drv_len += tu_desc_len(itf_desc);\n    itf_desc = (const tusb_desc_interface_t*) tu_desc_next(itf_desc);\n  }\n\n  //------------- DFU Functional descriptor -------------//\n  const tusb_desc_dfu_functional_t*func_desc = (const tusb_desc_dfu_functional_t*) itf_desc;\n  TU_ASSERT(tu_desc_type(func_desc) == TUSB_DESC_FUNCTIONAL, 0);\n  drv_len += sizeof(tusb_desc_dfu_functional_t);\n\n  _dfu_ctx.attrs = func_desc->bAttributes;\n\n  // CFG_TUD_DFU_XFER_BUFSIZE has to be set to the buffer size used in TUD_DFU_DESCRIPTOR\n  const uint16_t transfer_size = tu_le16toh( tu_unaligned_read16((const uint8_t*) func_desc + offsetof(tusb_desc_dfu_functional_t, wTransferSize)) );\n  TU_ASSERT(transfer_size <= CFG_TUD_DFU_XFER_BUFSIZE, drv_len);\n\n  return drv_len;\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, const tusb_control_request_t* request) {\n  TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);\n  TU_LOG_DRV(\"  DFU State  : %s, Status: %s\\r\\n\", tu_lookup_find(&_dfu_state_table, _dfu_ctx.state), tu_lookup_find(&_dfu_status_table, _dfu_ctx.status));\n\n  if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) {\n    // Standard request include GET/SET_INTERFACE\n    switch (request->bRequest) {\n      case TUSB_REQ_SET_INTERFACE:\n        if (stage == CONTROL_STAGE_SETUP) {\n          // Switch Alt interface and reset state machine\n          _dfu_ctx.alt = (uint8_t)request->wValue;\n          reset_state();\n          return tud_control_status(rhport, request);\n        }\n        break;\n\n      case TUSB_REQ_GET_INTERFACE:\n        if (stage == CONTROL_STAGE_SETUP) {\n          return tud_control_xfer(rhport, request, &_dfu_ctx.alt, 1);\n        }\n        break;\n\n      // unsupported request\n      default: return false;\n    }\n  } else if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS) {\n    TU_LOG_DRV(\"  DFU Request: %s\\r\\n\", tu_lookup_find(&_dfu_request_table, request->bRequest));\n\n    // Class request\n    switch (request->bRequest) {\n      case DFU_REQUEST_DETACH:\n        if (stage == CONTROL_STAGE_SETUP) {\n          tud_control_status(rhport, request);\n        } else if (stage == CONTROL_STAGE_ACK) {\n          tud_dfu_detach_cb();\n        } else {\n          // nothing to do\n        }\n        break;\n\n      case DFU_REQUEST_CLRSTATUS:\n        if (stage == CONTROL_STAGE_SETUP) {\n          reset_state();\n          tud_control_status(rhport, request);\n        }\n        break;\n\n      case DFU_REQUEST_GETSTATE:\n        if (stage == CONTROL_STAGE_SETUP) {\n          tud_control_xfer(rhport, request, &_dfu_ctx.state, 1);\n        }\n        break;\n\n      case DFU_REQUEST_ABORT:\n        if (stage == CONTROL_STAGE_SETUP) {\n          reset_state();\n          tud_control_status(rhport, request);\n        } else if (stage == CONTROL_STAGE_ACK) {\n          tud_dfu_abort_cb(_dfu_ctx.alt);\n        } else {\n          // nothing to do\n        }\n        break;\n\n      case DFU_REQUEST_UPLOAD:\n        if (stage == CONTROL_STAGE_SETUP) {\n          TU_VERIFY(_dfu_ctx.attrs & DFU_ATTR_CAN_UPLOAD);\n          TU_VERIFY(request->wLength <= CFG_TUD_DFU_XFER_BUFSIZE);\n\n          const uint16_t xfer_len = tud_dfu_upload_cb(_dfu_ctx.alt, request->wValue, get_xfer_buffer(),\n                                                      request->wLength);\n\n          return tud_control_xfer(rhport, request, get_xfer_buffer(), xfer_len);\n        }\n        break;\n\n      case DFU_REQUEST_DNLOAD:\n        if (stage == CONTROL_STAGE_SETUP) {\n          TU_VERIFY(_dfu_ctx.attrs & DFU_ATTR_CAN_DOWNLOAD);\n          TU_VERIFY(_dfu_ctx.state == DFU_IDLE || _dfu_ctx.state == DFU_DNLOAD_IDLE);\n          TU_VERIFY(request->wLength <= CFG_TUD_DFU_XFER_BUFSIZE);\n\n          // set to true for both download and manifest\n          _dfu_ctx.flashing_in_progress = true;\n\n          // save block and length for flashing\n          _dfu_ctx.block = request->wValue;\n          _dfu_ctx.length = request->wLength;\n\n          if (request->wLength > 0) {\n            // Download with payload -> transition to DOWNLOAD SYNC\n            _dfu_ctx.state = DFU_DNLOAD_SYNC;\n            return tud_control_xfer(rhport, request, get_xfer_buffer(), request->wLength);\n          } else {\n            // Download is complete -> transition to MANIFEST SYNC\n            _dfu_ctx.state = DFU_MANIFEST_SYNC;\n            return tud_control_status(rhport, request);\n          }\n        }\n        break;\n\n      case DFU_REQUEST_GETSTATUS:\n        switch (_dfu_ctx.state) {\n          case DFU_DNLOAD_SYNC:\n            return process_download_get_status(rhport, stage, request);\n            break;\n\n          case DFU_MANIFEST_SYNC:\n            return process_manifest_get_status(rhport, stage, request);\n            break;\n\n          default:\n            if (stage == CONTROL_STAGE_SETUP) {\n              return reply_getstatus(rhport, request, (dfu_state_t) _dfu_ctx.state, (dfu_status_t) _dfu_ctx.status, 0);\n            }\n            break;\n        }\n        break;\n\n      default: return false; // stall unsupported request\n    }\n  } else {\n    return false; // unsupported request\n  }\n\n  return true;\n}\n\nvoid tud_dfu_finish_flashing(uint8_t status) {\n  _dfu_ctx.flashing_in_progress = false;\n\n  if (status == DFU_STATUS_OK) {\n    if (_dfu_ctx.state == DFU_DNBUSY) {\n      _dfu_ctx.state = DFU_DNLOAD_SYNC;\n    } else if (_dfu_ctx.state == DFU_MANIFEST) {\n      _dfu_ctx.state = (_dfu_ctx.attrs & DFU_ATTR_MANIFESTATION_TOLERANT)\n                         ? DFU_MANIFEST_SYNC\n                         : DFU_MANIFEST_WAIT_RESET;\n    } else {\n      // nothing to do\n    }\n  } else {\n    // failed while flashing, move to dfuError\n    _dfu_ctx.state = DFU_ERROR;\n    _dfu_ctx.status = (dfu_status_t)status;\n  }\n}\n\nstatic bool process_download_get_status(uint8_t rhport, uint8_t stage, const tusb_control_request_t* request) {\n  if (stage == CONTROL_STAGE_SETUP) {\n    // only transition to next state on CONTROL_STAGE_ACK\n    dfu_state_t next_state;\n    uint32_t timeout;\n\n    if (_dfu_ctx.flashing_in_progress) {\n      next_state = DFU_DNBUSY;\n      timeout = tud_dfu_get_timeout_cb(_dfu_ctx.alt, (uint8_t)next_state);\n    } else {\n      next_state = DFU_DNLOAD_IDLE;\n      timeout = 0;\n    }\n\n    return reply_getstatus(rhport, request, next_state, (dfu_status_t) _dfu_ctx.status, timeout);\n  } else if (stage == CONTROL_STAGE_ACK) {\n    if (_dfu_ctx.flashing_in_progress) {\n      _dfu_ctx.state = DFU_DNBUSY;\n      tud_dfu_download_cb(_dfu_ctx.alt, _dfu_ctx.block, get_xfer_buffer(), _dfu_ctx.length);\n    } else {\n      _dfu_ctx.state = DFU_DNLOAD_IDLE;\n    }\n  } else {\n    // nothing to do\n  }\n\n  return true;\n}\n\nstatic bool process_manifest_get_status(uint8_t rhport, uint8_t stage, const tusb_control_request_t* request) {\n  if (stage == CONTROL_STAGE_SETUP) {\n    // only transition to next state on CONTROL_STAGE_ACK\n    dfu_state_t next_state;\n    uint32_t timeout;\n\n    if (_dfu_ctx.flashing_in_progress) {\n      next_state = DFU_MANIFEST;\n      timeout = tud_dfu_get_timeout_cb(_dfu_ctx.alt, next_state);\n    } else {\n      next_state = DFU_IDLE;\n      timeout = 0;\n    }\n\n    return reply_getstatus(rhport, request, next_state, (dfu_status_t) _dfu_ctx.status, timeout);\n  } else if (stage == CONTROL_STAGE_ACK) {\n    if (_dfu_ctx.flashing_in_progress) {\n      _dfu_ctx.state = DFU_MANIFEST;\n      tud_dfu_manifest_cb(_dfu_ctx.alt);\n    } else {\n      _dfu_ctx.state = DFU_IDLE;\n    }\n  } else {\n    // nothing to do\n  }\n\n  return true;\n}\n\nstatic bool reply_getstatus(uint8_t rhport, const tusb_control_request_t* request, dfu_state_t state,\n                            dfu_status_t status, uint32_t timeout) {\n  dfu_status_response_t resp;\n  resp.bStatus = (uint8_t)status;\n  resp.bwPollTimeout[0] = TU_U32_BYTE0(timeout);\n  resp.bwPollTimeout[1] = TU_U32_BYTE1(timeout);\n  resp.bwPollTimeout[2] = TU_U32_BYTE2(timeout);\n  resp.bState = (uint8_t)state;\n  resp.iString = 0;\n\n  return tud_control_xfer(rhport, request, &resp, sizeof(dfu_status_response_t));\n}\n\n#endif\n"
  },
  {
    "path": "src/class/dfu/dfu_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 XMOS LIMITED\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DFU_DEVICE_H_\n#define TUSB_DFU_DEVICE_H_\n\n#include \"dfu.h\"\n\n#ifdef __cplusplus\n  extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Class Driver Default Configure & Validation\n//--------------------------------------------------------------------+\n\n#if !defined(CFG_TUD_DFU_XFER_BUFSIZE)\n  #error \"CFG_TUD_DFU_XFER_BUFSIZE must be defined, it has to be set to the buffer size used in TUD_DFU_DESCRIPTOR\"\n#endif\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// Must be called when the application is done with flashing started by\n// tud_dfu_download_cb() and tud_dfu_manifest_cb().\n// status is DFU_STATUS_OK if successful, any other error status will cause state to enter dfuError\nvoid tud_dfu_finish_flashing(uint8_t status);\n\n//--------------------------------------------------------------------+\n// Application Callback API (weak is optional)\n//--------------------------------------------------------------------+\n\n// Note: alt is used as the partition number, in order to support multiple partitions like FLASH, EEPROM, etc.\n\n// Invoked right before tud_dfu_download_cb() (state=DFU_DNBUSY) or tud_dfu_manifest_cb() (state=DFU_MANIFEST)\n// Application return timeout in milliseconds (bwPollTimeout) for the next download/manifest operation.\n// During this period, USB host won't try to communicate with us.\nuint32_t tud_dfu_get_timeout_cb(uint8_t alt, uint8_t state);\n\n// Invoked when received DFU_DNLOAD (wLength>0) following by DFU_GETSTATUS (state=DFU_DNBUSY) requests\n// This callback could be returned before flashing op is complete (async).\n// Once finished flashing, application must call tud_dfu_finish_flashing()\nvoid tud_dfu_download_cb (uint8_t alt, uint16_t block_num, uint8_t const *data, uint16_t length);\n\n// Invoked when download process is complete, received DFU_DNLOAD (wLength=0) following by DFU_GETSTATUS (state=Manifest)\n// Application can do checksum, or actual flashing if buffered entire image previously.\n// Once finished flashing, application must call tud_dfu_finish_flashing()\nvoid tud_dfu_manifest_cb(uint8_t alt);\n\n// Invoked when received DFU_UPLOAD request\n// Application must populate data with up to length bytes and\n// Return the number of written bytes\nuint16_t tud_dfu_upload_cb(uint8_t alt, uint16_t block_num, uint8_t* data, uint16_t length);\n\n// Invoked when a DFU_DETACH request is received\nvoid tud_dfu_detach_cb(void);\n\n// Invoked when the Host has terminated a download or upload transfer\nvoid tud_dfu_abort_cb(uint8_t alt);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     dfu_moded_init(void);\nbool     dfu_moded_deinit(void);\nvoid     dfu_moded_reset(uint8_t rhport);\nuint16_t dfu_moded_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     dfu_moded_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_DFU_MODE_DEVICE_H_ */\n"
  },
  {
    "path": "src/class/dfu/dfu_rt_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Sylvain Munaut <tnt@246tNt.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_DFU_RUNTIME)\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"dfu_rt_device.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUD_DFU_RUNTIME_LOG_LEVEL\n  #define CFG_TUD_DFU_RUNTIME_LOG_LEVEL   CFG_TUD_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUD_DFU_RUNTIME_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid dfu_rtd_init(void) {\n}\n\nbool dfu_rtd_deinit(void) {\n  return true;\n}\n\nvoid dfu_rtd_reset(uint8_t rhport) {\n  (void) rhport;\n}\n\nuint16_t dfu_rtd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len)\n{\n  (void) rhport;\n  (void) max_len;\n\n  // Ensure this is DFU Runtime\n  TU_VERIFY((itf_desc->bInterfaceSubClass == TUD_DFU_APP_SUBCLASS) &&\n            (itf_desc->bInterfaceProtocol == DFU_PROTOCOL_RT), 0);\n\n  uint8_t const * p_desc = tu_desc_next( itf_desc );\n  uint16_t drv_len = sizeof(tusb_desc_interface_t);\n\n  if ( TUSB_DESC_FUNCTIONAL == tu_desc_type(p_desc) )\n  {\n    drv_len += tu_desc_len(p_desc);\n    p_desc   = tu_desc_next(p_desc);\n  }\n\n  return drv_len;\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool dfu_rtd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request)\n{\n  // nothing to do with DATA or ACK stage\n  if ( stage != CONTROL_STAGE_SETUP ) return true;\n\n  TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);\n\n  // dfu-util will try to claim the interface with SET_INTERFACE request before sending DFU request\n  if ( TUSB_REQ_TYPE_STANDARD == request->bmRequestType_bit.type &&\n       TUSB_REQ_SET_INTERFACE == request->bRequest )\n  {\n    tud_control_status(rhport, request);\n    return true;\n  }\n\n  // Handle class request only from here\n  TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);\n\n  switch (request->bRequest)\n  {\n    case DFU_REQUEST_DETACH:\n    {\n      TU_LOG_DRV(\"  DFU RT Request: DETACH\\r\\n\");\n      tud_control_status(rhport, request);\n      tud_dfu_runtime_reboot_to_dfu_cb();\n    }\n    break;\n\n    case DFU_REQUEST_GETSTATUS:\n    {\n      TU_LOG_DRV(\"  DFU RT Request: GETSTATUS\\r\\n\");\n      dfu_status_response_t resp;\n      // Status = OK, Poll timeout is ignored during RT, State = APP_IDLE, IString = 0\n      TU_VERIFY(tu_memset_s(&resp, sizeof(resp), 0x00, sizeof(resp))==0);\n      tud_control_xfer(rhport, request, &resp, sizeof(dfu_status_response_t));\n    }\n    break;\n\n    default:\n    {\n      TU_LOG_DRV(\"  DFU RT Unexpected Request: %d\\r\\n\", request->bRequest);\n      return false; // stall unsupported request\n    }\n  }\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/dfu/dfu_rt_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Sylvain Munaut <tnt@246tNt.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DFU_RT_DEVICE_H_\n#define TUSB_DFU_RT_DEVICE_H_\n\n#include \"dfu.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Application Callback API (weak is optional)\n//--------------------------------------------------------------------+\n// Invoked when a DFU_DETACH request is received and bitWillDetach is set\nvoid tud_dfu_runtime_reboot_to_dfu_cb(void);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     dfu_rtd_init(void);\nbool     dfu_rtd_deinit(void);\nvoid     dfu_rtd_reset(uint8_t rhport);\nuint16_t dfu_rtd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     dfu_rtd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_DFU_RT_DEVICE_H_ */\n"
  },
  {
    "path": "src/class/hid/hid.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/** \\ingroup group_class\n *  \\defgroup ClassDriver_HID Human Interface Device (HID)\n *  @{ */\n\n#ifndef TUSB_HID_H_\n#define TUSB_HID_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Common Definitions\n//--------------------------------------------------------------------+\n/** \\defgroup ClassDriver_HID_Common Common Definitions\n *  @{ */\n\n/// USB HID Descriptor\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t  bLength;         /**< Numeric expression that is the total size of the HID descriptor */\n  uint8_t  bDescriptorType; /**< Constant name specifying type of HID descriptor. */\n\n  uint16_t bcdHID;          /**< Numeric expression identifying the HID Class Specification release */\n  uint8_t  bCountryCode;    /**< Numeric expression identifying country code of the localized hardware.  */\n  uint8_t  bNumDescriptors; /**< Numeric expression specifying the number of class descriptors */\n\n  uint8_t  bReportType;     /**< Type of HID class report. */\n  uint16_t wReportLength;   /**< the total size of the Report descriptor. */\n} tusb_hid_descriptor_hid_t;\n\n/// HID Subclass\ntypedef enum\n{\n  HID_SUBCLASS_NONE = 0, ///< No Subclass\n  HID_SUBCLASS_BOOT = 1  ///< Boot Interface Subclass\n}hid_subclass_enum_t;\n\n/// HID Interface Protocol\ntypedef enum\n{\n  HID_ITF_PROTOCOL_NONE     = 0, ///< None\n  HID_ITF_PROTOCOL_KEYBOARD = 1, ///< Keyboard\n  HID_ITF_PROTOCOL_MOUSE    = 2  ///< Mouse\n}hid_interface_protocol_enum_t;\n\n/// HID Descriptor Type\ntypedef enum\n{\n  HID_DESC_TYPE_HID      = 0x21, ///< HID Descriptor\n  HID_DESC_TYPE_REPORT   = 0x22, ///< Report Descriptor\n  HID_DESC_TYPE_PHYSICAL = 0x23  ///< Physical Descriptor\n}hid_descriptor_enum_t;\n\n/// HID Request Report Type\ntypedef enum\n{\n  HID_REPORT_TYPE_INVALID = 0,\n  HID_REPORT_TYPE_INPUT,      ///< Input\n  HID_REPORT_TYPE_OUTPUT,     ///< Output\n  HID_REPORT_TYPE_FEATURE     ///< Feature\n}hid_report_type_t;\n\n/// HID Class Specific Control Request\ntypedef enum\n{\n  HID_REQ_CONTROL_GET_REPORT   = 0x01, ///< Get Report\n  HID_REQ_CONTROL_GET_IDLE     = 0x02, ///< Get Idle\n  HID_REQ_CONTROL_GET_PROTOCOL = 0x03, ///< Get Protocol\n  HID_REQ_CONTROL_SET_REPORT   = 0x09, ///< Set Report\n  HID_REQ_CONTROL_SET_IDLE     = 0x0a, ///< Set Idle\n  HID_REQ_CONTROL_SET_PROTOCOL = 0x0b  ///< Set Protocol\n}hid_request_enum_t;\n\n/// HID Local Code\ntypedef enum\n{\n  HID_LOCAL_NotSupported = 0   , ///< NotSupported\n  HID_LOCAL_Arabic             , ///< Arabic\n  HID_LOCAL_Belgian            , ///< Belgian\n  HID_LOCAL_Canadian_Bilingual , ///< Canadian_Bilingual\n  HID_LOCAL_Canadian_French    , ///< Canadian_French\n  HID_LOCAL_Czech_Republic     , ///< Czech_Republic\n  HID_LOCAL_Danish             , ///< Danish\n  HID_LOCAL_Finnish            , ///< Finnish\n  HID_LOCAL_French             , ///< French\n  HID_LOCAL_German             , ///< German\n  HID_LOCAL_Greek              , ///< Greek\n  HID_LOCAL_Hebrew             , ///< Hebrew\n  HID_LOCAL_Hungary            , ///< Hungary\n  HID_LOCAL_International      , ///< International\n  HID_LOCAL_Italian            , ///< Italian\n  HID_LOCAL_Japan_Katakana     , ///< Japan_Katakana\n  HID_LOCAL_Korean             , ///< Korean\n  HID_LOCAL_Latin_American     , ///< Latin_American\n  HID_LOCAL_Netherlands_Dutch  , ///< Netherlands/Dutch\n  HID_LOCAL_Norwegian          , ///< Norwegian\n  HID_LOCAL_Persian_Farsi      , ///< Persian (Farsi)\n  HID_LOCAL_Poland             , ///< Poland\n  HID_LOCAL_Portuguese         , ///< Portuguese\n  HID_LOCAL_Russia             , ///< Russia\n  HID_LOCAL_Slovakia           , ///< Slovakia\n  HID_LOCAL_Spanish            , ///< Spanish\n  HID_LOCAL_Swedish            , ///< Swedish\n  HID_LOCAL_Swiss_French       , ///< Swiss/French\n  HID_LOCAL_Swiss_German       , ///< Swiss/German\n  HID_LOCAL_Switzerland        , ///< Switzerland\n  HID_LOCAL_Taiwan             , ///< Taiwan\n  HID_LOCAL_Turkish_Q          , ///< Turkish-Q\n  HID_LOCAL_UK                 , ///< UK\n  HID_LOCAL_US                 , ///< US\n  HID_LOCAL_Yugoslavia         , ///< Yugoslavia\n  HID_LOCAL_Turkish_F            ///< Turkish-F\n} hid_local_enum_t;\n\n// HID protocol value used by GetProtocol / SetProtocol\ntypedef enum\n{\n  HID_PROTOCOL_BOOT = 0,\n  HID_PROTOCOL_REPORT = 1\n} hid_protocol_mode_enum_t;\n\n/** @} */\n\n//--------------------------------------------------------------------+\n// GAMEPAD\n//--------------------------------------------------------------------+\n/** \\addtogroup ClassDriver_HID_Gamepad Gamepad\n *  @{ */\n\n/* From https://www.kernel.org/doc/html/latest/input/gamepad.html\n          ____________________________              __\n         / [__ZL__]          [__ZR__] \\               |\n        / [__ TL __]        [__ TR __] \\              | Front Triggers\n     __/________________________________\\__         __|\n    /                                  _   \\          |\n   /      /\\           __             (N)   \\         |\n  /       ||      __  |MO|  __     _       _ \\        | Main Pad\n |    <===DP===> |SE|      |ST|   (W) -|- (E) |       |\n  \\       ||    ___          ___       _     /        |\n  /\\      \\/   /   \\        /   \\     (S)   /\\      __|\n /  \\________ | LS  | ____ |  RS | ________/  \\       |\n|         /  \\ \\___/ /    \\ \\___/ /  \\         |      | Control Sticks\n|        /    \\_____/      \\_____/    \\        |    __|\n|       /                              \\       |\n \\_____/                                \\_____/\n\n     |________|______|    |______|___________|\n       D-Pad    Left       Right   Action Pad\n               Stick       Stick\n\n                 |_____________|\n                    Menu Pad\n\n  Most gamepads have the following features:\n  - Action-Pad 4 buttons in diamonds-shape (on the right side) NORTH, SOUTH, WEST and EAST.\n  - D-Pad (Direction-pad) 4 buttons (on the left side) that point up, down, left and right.\n  - Menu-Pad Different constellations, but most-times 2 buttons: SELECT - START.\n  - Analog-Sticks provide freely moveable sticks to control directions, Analog-sticks may also\n  provide a digital button if you press them.\n  - Triggers are located on the upper-side of the pad in vertical direction. The upper buttons\n  are normally named Left- and Right-Triggers, the lower buttons Z-Left and Z-Right.\n  - Rumble Many devices provide force-feedback features. But are mostly just simple rumble motors.\n */\n\n/// HID Gamepad Protocol Report.\ntypedef struct TU_ATTR_PACKED\n{\n  int8_t  x;         ///< Delta x  movement of left analog-stick\n  int8_t  y;         ///< Delta y  movement of left analog-stick\n  int8_t  z;         ///< Delta z  movement of right analog-joystick\n  int8_t  rz;        ///< Delta Rz movement of right analog-joystick\n  int8_t  rx;        ///< Delta Rx movement of analog left trigger\n  int8_t  ry;        ///< Delta Ry movement of analog right trigger\n  uint8_t hat;       ///< Buttons mask for currently pressed buttons in the DPad/hat\n  uint32_t buttons;  ///< Buttons mask for currently pressed buttons\n}hid_gamepad_report_t;\n\n/// Standard Gamepad Buttons Bitmap\ntypedef enum\n{\n  GAMEPAD_BUTTON_0  = TU_BIT(0),\n  GAMEPAD_BUTTON_1  = TU_BIT(1),\n  GAMEPAD_BUTTON_2  = TU_BIT(2),\n  GAMEPAD_BUTTON_3  = TU_BIT(3),\n  GAMEPAD_BUTTON_4  = TU_BIT(4),\n  GAMEPAD_BUTTON_5  = TU_BIT(5),\n  GAMEPAD_BUTTON_6  = TU_BIT(6),\n  GAMEPAD_BUTTON_7  = TU_BIT(7),\n  GAMEPAD_BUTTON_8  = TU_BIT(8),\n  GAMEPAD_BUTTON_9  = TU_BIT(9),\n  GAMEPAD_BUTTON_10 = TU_BIT(10),\n  GAMEPAD_BUTTON_11 = TU_BIT(11),\n  GAMEPAD_BUTTON_12 = TU_BIT(12),\n  GAMEPAD_BUTTON_13 = TU_BIT(13),\n  GAMEPAD_BUTTON_14 = TU_BIT(14),\n  GAMEPAD_BUTTON_15 = TU_BIT(15),\n  GAMEPAD_BUTTON_16 = TU_BIT(16),\n  GAMEPAD_BUTTON_17 = TU_BIT(17),\n  GAMEPAD_BUTTON_18 = TU_BIT(18),\n  GAMEPAD_BUTTON_19 = TU_BIT(19),\n  GAMEPAD_BUTTON_20 = TU_BIT(20),\n  GAMEPAD_BUTTON_21 = TU_BIT(21),\n  GAMEPAD_BUTTON_22 = TU_BIT(22),\n  GAMEPAD_BUTTON_23 = TU_BIT(23),\n  GAMEPAD_BUTTON_24 = TU_BIT(24),\n  GAMEPAD_BUTTON_25 = TU_BIT(25),\n  GAMEPAD_BUTTON_26 = TU_BIT(26),\n  GAMEPAD_BUTTON_27 = TU_BIT(27),\n  GAMEPAD_BUTTON_28 = TU_BIT(28),\n  GAMEPAD_BUTTON_29 = TU_BIT(29),\n  GAMEPAD_BUTTON_30 = TU_BIT(30),\n  GAMEPAD_BUTTON_31 = TU_BIT(31),\n}hid_gamepad_button_bm_t;\n\n/// Standard Gamepad Buttons Naming from Linux input event codes\n/// https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h\n#define GAMEPAD_BUTTON_A       GAMEPAD_BUTTON_0\n#define GAMEPAD_BUTTON_SOUTH   GAMEPAD_BUTTON_0\n\n#define GAMEPAD_BUTTON_B       GAMEPAD_BUTTON_1\n#define GAMEPAD_BUTTON_EAST    GAMEPAD_BUTTON_1\n\n#define GAMEPAD_BUTTON_C       GAMEPAD_BUTTON_2\n\n#define GAMEPAD_BUTTON_X       GAMEPAD_BUTTON_3\n#define GAMEPAD_BUTTON_NORTH   GAMEPAD_BUTTON_3\n\n#define GAMEPAD_BUTTON_Y       GAMEPAD_BUTTON_4\n#define GAMEPAD_BUTTON_WEST    GAMEPAD_BUTTON_4\n\n#define GAMEPAD_BUTTON_Z       GAMEPAD_BUTTON_5\n#define GAMEPAD_BUTTON_TL      GAMEPAD_BUTTON_6\n#define GAMEPAD_BUTTON_TR      GAMEPAD_BUTTON_7\n#define GAMEPAD_BUTTON_TL2     GAMEPAD_BUTTON_8\n#define GAMEPAD_BUTTON_TR2     GAMEPAD_BUTTON_9\n#define GAMEPAD_BUTTON_SELECT  GAMEPAD_BUTTON_10\n#define GAMEPAD_BUTTON_START   GAMEPAD_BUTTON_11\n#define GAMEPAD_BUTTON_MODE    GAMEPAD_BUTTON_12\n#define GAMEPAD_BUTTON_THUMBL  GAMEPAD_BUTTON_13\n#define GAMEPAD_BUTTON_THUMBR  GAMEPAD_BUTTON_14\n\n/// Standard Gamepad HAT/DPAD Buttons (from Linux input event codes)\ntypedef enum\n{\n  GAMEPAD_HAT_CENTERED   = 0,  ///< DPAD_CENTERED\n  GAMEPAD_HAT_UP         = 1,  ///< DPAD_UP\n  GAMEPAD_HAT_UP_RIGHT   = 2,  ///< DPAD_UP_RIGHT\n  GAMEPAD_HAT_RIGHT      = 3,  ///< DPAD_RIGHT\n  GAMEPAD_HAT_DOWN_RIGHT = 4,  ///< DPAD_DOWN_RIGHT\n  GAMEPAD_HAT_DOWN       = 5,  ///< DPAD_DOWN\n  GAMEPAD_HAT_DOWN_LEFT  = 6,  ///< DPAD_DOWN_LEFT\n  GAMEPAD_HAT_LEFT       = 7,  ///< DPAD_LEFT\n  GAMEPAD_HAT_UP_LEFT    = 8,  ///< DPAD_UP_LEFT\n}hid_gamepad_hat_t;\n\n/// @}\n\n//--------------------------------------------------------------------+\n// MOUSE\n//--------------------------------------------------------------------+\n/** \\addtogroup ClassDriver_HID_Mouse Mouse\n *  @{ */\n\n/// Standard HID Boot Protocol Mouse Report.\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t buttons; /**< buttons mask for currently pressed buttons in the mouse. */\n  int8_t  x;       /**< Current delta x movement of the mouse. */\n  int8_t  y;       /**< Current delta y movement on the mouse. */\n  int8_t  wheel;   /**< Current delta wheel movement on the mouse. */\n  int8_t  pan;     // using AC Pan\n} hid_mouse_report_t;\n\n\n// Absolute Mouse: same as the Standard (relative) Mouse Report but\n// with int16_t instead of int8_t for X and Y coordinates.\ntypedef struct TU_ATTR_PACKED\n{\n    uint8_t buttons; /**< buttons mask for currently pressed buttons in the mouse. */\n    int16_t x;       /**< Current x position of the mouse. */\n    int16_t y;       /**< Current y position of the mouse. */\n    int8_t wheel;    /**< Current delta wheel movement on the mouse. */\n    int8_t pan;      // using AC Pan\n} hid_abs_mouse_report_t;\n\n\n/// Standard Mouse Buttons Bitmap\ntypedef enum\n{\n  MOUSE_BUTTON_LEFT     = TU_BIT(0), ///< Left button\n  MOUSE_BUTTON_RIGHT    = TU_BIT(1), ///< Right button\n  MOUSE_BUTTON_MIDDLE   = TU_BIT(2), ///< Middle button\n  MOUSE_BUTTON_BACKWARD = TU_BIT(3), ///< Backward button,\n  MOUSE_BUTTON_FORWARD  = TU_BIT(4), ///< Forward button,\n}hid_mouse_button_bm_t;\n\n/// @}\n\n//--------------------------------------------------------------------+\n// Digitizer Stylus Pen\n//--------------------------------------------------------------------+\n/** \\addtogroup ClassDriver_HID_Stylus Stylus\n *  @{ */\n\n// Standard Stylus Pen Report.\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t attr;    /**< Attribute mask for describing current status of the stylus pen. */\n  uint16_t x;      /**< Current x position of the mouse. */\n  uint16_t y;      /**< Current y position of the mouse. */\n} hid_stylus_report_t;\n\n// Standard Stylus Pen Attributes Bitmap.\ntypedef enum\n{\n  STYLUS_ATTR_TIP_SWITCH = TU_BIT(0), ///< Tip switch\n  STYLUS_ATTR_IN_RANGE   = TU_BIT(1), ///< In-range bit.\n} hid_stylus_attr_bm_t;\n\n/// @}\n\n//--------------------------------------------------------------------+\n// Keyboard\n//--------------------------------------------------------------------+\n/** \\addtogroup ClassDriver_HID_Keyboard Keyboard\n *  @{ */\n\n/// Standard HID Boot Protocol Keyboard Report.\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t modifier;   /**< Keyboard modifier (KEYBOARD_MODIFIER_* masks). */\n  uint8_t reserved;   /**< Reserved for OEM use, always set to 0. */\n  uint8_t keycode[6]; /**< Key codes of the currently pressed keys. */\n} hid_keyboard_report_t;\n\n/// Keyboard modifier codes bitmap\ntypedef enum\n{\n  KEYBOARD_MODIFIER_LEFTCTRL   = TU_BIT(0), ///< Left Control\n  KEYBOARD_MODIFIER_LEFTSHIFT  = TU_BIT(1), ///< Left Shift\n  KEYBOARD_MODIFIER_LEFTALT    = TU_BIT(2), ///< Left Alt\n  KEYBOARD_MODIFIER_LEFTGUI    = TU_BIT(3), ///< Left Window\n  KEYBOARD_MODIFIER_RIGHTCTRL  = TU_BIT(4), ///< Right Control\n  KEYBOARD_MODIFIER_RIGHTSHIFT = TU_BIT(5), ///< Right Shift\n  KEYBOARD_MODIFIER_RIGHTALT   = TU_BIT(6), ///< Right Alt\n  KEYBOARD_MODIFIER_RIGHTGUI   = TU_BIT(7)  ///< Right Window\n}hid_keyboard_modifier_bm_t;\n\ntypedef enum\n{\n  KEYBOARD_LED_NUMLOCK    = TU_BIT(0), ///< Num Lock LED\n  KEYBOARD_LED_CAPSLOCK   = TU_BIT(1), ///< Caps Lock LED\n  KEYBOARD_LED_SCROLLLOCK = TU_BIT(2), ///< Scroll Lock LED\n  KEYBOARD_LED_COMPOSE    = TU_BIT(3), ///< Composition Mode\n  KEYBOARD_LED_KANA       = TU_BIT(4) ///< Kana mode\n}hid_keyboard_led_bm_t;\n\n/// @}\n\n//--------------------------------------------------------------------+\n// HID KEYCODE\n//--------------------------------------------------------------------+\n#define HID_KEY_NONE                        0x00\n#define HID_KEY_A                           0x04\n#define HID_KEY_B                           0x05\n#define HID_KEY_C                           0x06\n#define HID_KEY_D                           0x07\n#define HID_KEY_E                           0x08\n#define HID_KEY_F                           0x09\n#define HID_KEY_G                           0x0A\n#define HID_KEY_H                           0x0B\n#define HID_KEY_I                           0x0C\n#define HID_KEY_J                           0x0D\n#define HID_KEY_K                           0x0E\n#define HID_KEY_L                           0x0F\n#define HID_KEY_M                           0x10\n#define HID_KEY_N                           0x11\n#define HID_KEY_O                           0x12\n#define HID_KEY_P                           0x13\n#define HID_KEY_Q                           0x14\n#define HID_KEY_R                           0x15\n#define HID_KEY_S                           0x16\n#define HID_KEY_T                           0x17\n#define HID_KEY_U                           0x18\n#define HID_KEY_V                           0x19\n#define HID_KEY_W                           0x1A\n#define HID_KEY_X                           0x1B\n#define HID_KEY_Y                           0x1C\n#define HID_KEY_Z                           0x1D\n#define HID_KEY_1                           0x1E\n#define HID_KEY_2                           0x1F\n#define HID_KEY_3                           0x20\n#define HID_KEY_4                           0x21\n#define HID_KEY_5                           0x22\n#define HID_KEY_6                           0x23\n#define HID_KEY_7                           0x24\n#define HID_KEY_8                           0x25\n#define HID_KEY_9                           0x26\n#define HID_KEY_0                           0x27\n#define HID_KEY_ENTER                       0x28\n#define HID_KEY_ESCAPE                      0x29\n#define HID_KEY_BACKSPACE                   0x2A\n#define HID_KEY_TAB                         0x2B\n#define HID_KEY_SPACE                       0x2C\n#define HID_KEY_MINUS                       0x2D\n#define HID_KEY_EQUAL                       0x2E\n#define HID_KEY_BRACKET_LEFT                0x2F\n#define HID_KEY_BRACKET_RIGHT               0x30\n#define HID_KEY_BACKSLASH                   0x31\n#define HID_KEY_EUROPE_1                    0x32\n#define HID_KEY_SEMICOLON                   0x33\n#define HID_KEY_APOSTROPHE                  0x34\n#define HID_KEY_GRAVE                       0x35\n#define HID_KEY_COMMA                       0x36\n#define HID_KEY_PERIOD                      0x37\n#define HID_KEY_SLASH                       0x38\n#define HID_KEY_CAPS_LOCK                   0x39\n#define HID_KEY_F1                          0x3A\n#define HID_KEY_F2                          0x3B\n#define HID_KEY_F3                          0x3C\n#define HID_KEY_F4                          0x3D\n#define HID_KEY_F5                          0x3E\n#define HID_KEY_F6                          0x3F\n#define HID_KEY_F7                          0x40\n#define HID_KEY_F8                          0x41\n#define HID_KEY_F9                          0x42\n#define HID_KEY_F10                         0x43\n#define HID_KEY_F11                         0x44\n#define HID_KEY_F12                         0x45\n#define HID_KEY_PRINT_SCREEN                0x46\n#define HID_KEY_SCROLL_LOCK                 0x47\n#define HID_KEY_PAUSE                       0x48\n#define HID_KEY_INSERT                      0x49\n#define HID_KEY_HOME                        0x4A\n#define HID_KEY_PAGE_UP                     0x4B\n#define HID_KEY_DELETE                      0x4C\n#define HID_KEY_END                         0x4D\n#define HID_KEY_PAGE_DOWN                   0x4E\n#define HID_KEY_ARROW_RIGHT                 0x4F\n#define HID_KEY_ARROW_LEFT                  0x50\n#define HID_KEY_ARROW_DOWN                  0x51\n#define HID_KEY_ARROW_UP                    0x52\n#define HID_KEY_NUM_LOCK                    0x53\n#define HID_KEY_KEYPAD_DIVIDE               0x54\n#define HID_KEY_KEYPAD_MULTIPLY             0x55\n#define HID_KEY_KEYPAD_SUBTRACT             0x56\n#define HID_KEY_KEYPAD_ADD                  0x57\n#define HID_KEY_KEYPAD_ENTER                0x58\n#define HID_KEY_KEYPAD_1                    0x59\n#define HID_KEY_KEYPAD_2                    0x5A\n#define HID_KEY_KEYPAD_3                    0x5B\n#define HID_KEY_KEYPAD_4                    0x5C\n#define HID_KEY_KEYPAD_5                    0x5D\n#define HID_KEY_KEYPAD_6                    0x5E\n#define HID_KEY_KEYPAD_7                    0x5F\n#define HID_KEY_KEYPAD_8                    0x60\n#define HID_KEY_KEYPAD_9                    0x61\n#define HID_KEY_KEYPAD_0                    0x62\n#define HID_KEY_KEYPAD_DECIMAL              0x63\n#define HID_KEY_EUROPE_2                    0x64\n#define HID_KEY_APPLICATION                 0x65\n#define HID_KEY_POWER                       0x66\n#define HID_KEY_KEYPAD_EQUAL                0x67\n#define HID_KEY_F13                         0x68\n#define HID_KEY_F14                         0x69\n#define HID_KEY_F15                         0x6A\n#define HID_KEY_F16                         0x6B\n#define HID_KEY_F17                         0x6C\n#define HID_KEY_F18                         0x6D\n#define HID_KEY_F19                         0x6E\n#define HID_KEY_F20                         0x6F\n#define HID_KEY_F21                         0x70\n#define HID_KEY_F22                         0x71\n#define HID_KEY_F23                         0x72\n#define HID_KEY_F24                         0x73\n#define HID_KEY_EXECUTE                     0x74\n#define HID_KEY_HELP                        0x75\n#define HID_KEY_MENU                        0x76\n#define HID_KEY_SELECT                      0x77\n#define HID_KEY_STOP                        0x78\n#define HID_KEY_AGAIN                       0x79\n#define HID_KEY_UNDO                        0x7A\n#define HID_KEY_CUT                         0x7B\n#define HID_KEY_COPY                        0x7C\n#define HID_KEY_PASTE                       0x7D\n#define HID_KEY_FIND                        0x7E\n#define HID_KEY_MUTE                        0x7F\n#define HID_KEY_VOLUME_UP                   0x80\n#define HID_KEY_VOLUME_DOWN                 0x81\n#define HID_KEY_LOCKING_CAPS_LOCK           0x82\n#define HID_KEY_LOCKING_NUM_LOCK            0x83\n#define HID_KEY_LOCKING_SCROLL_LOCK         0x84\n#define HID_KEY_KEYPAD_COMMA                0x85\n#define HID_KEY_KEYPAD_EQUAL_SIGN           0x86\n#define HID_KEY_KANJI1                      0x87\n#define HID_KEY_KANJI2                      0x88\n#define HID_KEY_KANJI3                      0x89\n#define HID_KEY_KANJI4                      0x8A\n#define HID_KEY_KANJI5                      0x8B\n#define HID_KEY_KANJI6                      0x8C\n#define HID_KEY_KANJI7                      0x8D\n#define HID_KEY_KANJI8                      0x8E\n#define HID_KEY_KANJI9                      0x8F\n#define HID_KEY_LANG1                       0x90\n#define HID_KEY_LANG2                       0x91\n#define HID_KEY_LANG3                       0x92\n#define HID_KEY_LANG4                       0x93\n#define HID_KEY_LANG5                       0x94\n#define HID_KEY_LANG6                       0x95\n#define HID_KEY_LANG7                       0x96\n#define HID_KEY_LANG8                       0x97\n#define HID_KEY_LANG9                       0x98\n#define HID_KEY_ALTERNATE_ERASE             0x99\n#define HID_KEY_SYSREQ_ATTENTION            0x9A\n#define HID_KEY_CANCEL                      0x9B\n#define HID_KEY_CLEAR                       0x9C\n#define HID_KEY_PRIOR                       0x9D\n#define HID_KEY_RETURN                      0x9E\n#define HID_KEY_SEPARATOR                   0x9F\n#define HID_KEY_OUT                         0xA0\n#define HID_KEY_OPER                        0xA1\n#define HID_KEY_CLEAR_AGAIN                 0xA2\n#define HID_KEY_CRSEL_PROPS                 0xA3\n#define HID_KEY_EXSEL                       0xA4\n// RESERVED\t\t\t\t\t                        0xA5-AF\n#define HID_KEY_KEYPAD_00                   0xB0\n#define HID_KEY_KEYPAD_000                  0xB1\n#define HID_KEY_THOUSANDS_SEPARATOR         0xB2\n#define HID_KEY_DECIMAL_SEPARATOR           0xB3\n#define HID_KEY_CURRENCY_UNIT               0xB4\n#define HID_KEY_CURRENCY_SUBUNIT            0xB5\n#define HID_KEY_KEYPAD_LEFT_PARENTHESIS     0xB6\n#define HID_KEY_KEYPAD_RIGHT_PARENTHESIS    0xB7\n#define HID_KEY_KEYPAD_LEFT_BRACE           0xB8\n#define HID_KEY_KEYPAD_RIGHT_BRACE          0xB9\n#define HID_KEY_KEYPAD_TAB                  0xBA\n#define HID_KEY_KEYPAD_BACKSPACE            0xBB\n#define HID_KEY_KEYPAD_A                    0xBC\n#define HID_KEY_KEYPAD_B                    0xBD\n#define HID_KEY_KEYPAD_C                    0xBE\n#define HID_KEY_KEYPAD_D                    0xBF\n#define HID_KEY_KEYPAD_E                    0xC0\n#define HID_KEY_KEYPAD_F                    0xC1\n#define HID_KEY_KEYPAD_XOR                  0xC2\n#define HID_KEY_KEYPAD_CARET                0xC3\n#define HID_KEY_KEYPAD_PERCENT              0xC4\n#define HID_KEY_KEYPAD_LESS_THAN            0xC5\n#define HID_KEY_KEYPAD_GREATER_THAN         0xC6\n#define HID_KEY_KEYPAD_AMPERSAND            0xC7\n#define HID_KEY_KEYPAD_DOUBLE_AMPERSAND     0xC8\n#define HID_KEY_KEYPAD_VERTICAL_BAR         0xC9\n#define HID_KEY_KEYPAD_DOUBLE_VERTICAL_BAR  0xCA\n#define HID_KEY_KEYPAD_COLON                0xCB\n#define HID_KEY_KEYPAD_HASH                 0xCC\n#define HID_KEY_KEYPAD_SPACE                0xCD\n#define HID_KEY_KEYPAD_AT                   0xCE\n#define HID_KEY_KEYPAD_EXCLAMATION          0xCF\n#define HID_KEY_KEYPAD_MEMORY_STORE         0xD0\n#define HID_KEY_KEYPAD_MEMORY_RECALL        0xD1\n#define HID_KEY_KEYPAD_MEMORY_CLEAR         0xD2\n#define HID_KEY_KEYPAD_MEMORY_ADD           0xD3\n#define HID_KEY_KEYPAD_MEMORY_SUBTRACT      0xD4\n#define HID_KEY_KEYPAD_MEMORY_MULTIPLY      0xD5\n#define HID_KEY_KEYPAD_MEMORY_DIVIDE        0xD6\n#define HID_KEY_KEYPAD_PLUS_MINUS           0xD7\n#define HID_KEY_KEYPAD_CLEAR                0xD8\n#define HID_KEY_KEYPAD_CLEAR_ENTRY          0xD9\n#define HID_KEY_KEYPAD_BINARY               0xDA\n#define HID_KEY_KEYPAD_OCTAL                0xDB\n#define HID_KEY_KEYPAD_DECIMAL_2            0xDC\n#define HID_KEY_KEYPAD_HEXADECIMAL          0xDD\n// RESERVED\t\t\t\t\t                        0xDE-DF\n#define HID_KEY_CONTROL_LEFT                0xE0\n#define HID_KEY_SHIFT_LEFT                  0xE1\n#define HID_KEY_ALT_LEFT                    0xE2\n#define HID_KEY_GUI_LEFT                    0xE3\n#define HID_KEY_CONTROL_RIGHT               0xE4\n#define HID_KEY_SHIFT_RIGHT                 0xE5\n#define HID_KEY_ALT_RIGHT                   0xE6\n#define HID_KEY_GUI_RIGHT                   0xE7\n\n\n//--------------------------------------------------------------------+\n// REPORT DESCRIPTOR\n//--------------------------------------------------------------------+\n\n//------------- ITEM & TAG -------------//\n#define HID_REPORT_DATA_0(data)\n#define HID_REPORT_DATA_1(data) , data\n#define HID_REPORT_DATA_2(data) , U16_TO_U8S_LE(data)\n#define HID_REPORT_DATA_3(data) , U32_TO_U8S_LE(data)\n\n#define HID_REPORT_ITEM(data, tag, type, size) \\\n  (((tag) << 4) | ((type) << 2) | (size)) HID_REPORT_DATA_##size(data)\n\n// Report Item Types\nenum {\n  RI_TYPE_MAIN   = 0,\n  RI_TYPE_GLOBAL = 1,\n  RI_TYPE_LOCAL  = 2\n};\n\n//------------- Main Items - HID 1.11 section 6.2.2.4 -------------//\n\n// Report Item Main group\nenum {\n  RI_MAIN_INPUT          = 8,\n  RI_MAIN_OUTPUT         = 9,\n  RI_MAIN_COLLECTION     = 10,\n  RI_MAIN_FEATURE        = 11,\n  RI_MAIN_COLLECTION_END = 12\n};\n\n#define HID_INPUT(x)           HID_REPORT_ITEM(x, RI_MAIN_INPUT         , RI_TYPE_MAIN, 1)\n#define HID_OUTPUT(x)          HID_REPORT_ITEM(x, RI_MAIN_OUTPUT        , RI_TYPE_MAIN, 1)\n#define HID_COLLECTION(x)      HID_REPORT_ITEM(x, RI_MAIN_COLLECTION    , RI_TYPE_MAIN, 1)\n#define HID_FEATURE(x)         HID_REPORT_ITEM(x, RI_MAIN_FEATURE       , RI_TYPE_MAIN, 1)\n#define HID_COLLECTION_END     HID_REPORT_ITEM(x, RI_MAIN_COLLECTION_END, RI_TYPE_MAIN, 0)\n\n//------------- Input, Output, Feature - HID 1.11 section 6.2.2.5 -------------//\n#define HID_DATA             (0<<0)\n#define HID_CONSTANT         (1<<0)\n\n#define HID_ARRAY            (0<<1)\n#define HID_VARIABLE         (1<<1)\n\n#define HID_ABSOLUTE         (0<<2)\n#define HID_RELATIVE         (1<<2)\n\n#define HID_WRAP_NO          (0<<3)\n#define HID_WRAP             (1<<3)\n\n#define HID_LINEAR           (0<<4)\n#define HID_NONLINEAR        (1<<4)\n\n#define HID_PREFERRED_STATE  (0<<5)\n#define HID_PREFERRED_NO     (1<<5)\n\n#define HID_NO_NULL_POSITION (0<<6)\n#define HID_NULL_STATE       (1<<6)\n\n#define HID_NON_VOLATILE     (0<<7)\n#define HID_VOLATILE         (1<<7)\n\n#define HID_BITFIELD         (0<<8)\n#define HID_BUFFERED_BYTES   (1<<8)\n\n//------------- Collection Item - HID 1.11 section 6.2.2.6 -------------//\nenum {\n  HID_COLLECTION_PHYSICAL = 0,\n  HID_COLLECTION_APPLICATION,\n  HID_COLLECTION_LOGICAL,\n  HID_COLLECTION_REPORT,\n  HID_COLLECTION_NAMED_ARRAY,\n  HID_COLLECTION_USAGE_SWITCH,\n  HID_COLLECTION_USAGE_MODIFIER\n};\n\n//------------- Global Items - HID 1.11 section 6.2.2.7 -------------//\n\n// Report Item Global group\nenum {\n  RI_GLOBAL_USAGE_PAGE    = 0,\n  RI_GLOBAL_LOGICAL_MIN   = 1,\n  RI_GLOBAL_LOGICAL_MAX   = 2,\n  RI_GLOBAL_PHYSICAL_MIN  = 3,\n  RI_GLOBAL_PHYSICAL_MAX  = 4,\n  RI_GLOBAL_UNIT_EXPONENT = 5,\n  RI_GLOBAL_UNIT          = 6,\n  RI_GLOBAL_REPORT_SIZE   = 7,\n  RI_GLOBAL_REPORT_ID     = 8,\n  RI_GLOBAL_REPORT_COUNT  = 9,\n  RI_GLOBAL_PUSH          = 10,\n  RI_GLOBAL_POP           = 11\n};\n\n#define HID_USAGE_PAGE(x)         HID_REPORT_ITEM(x, RI_GLOBAL_USAGE_PAGE, RI_TYPE_GLOBAL, 1)\n#define HID_USAGE_PAGE_N(x, n)    HID_REPORT_ITEM(x, RI_GLOBAL_USAGE_PAGE, RI_TYPE_GLOBAL, n)\n\n#define HID_LOGICAL_MIN(x)        HID_REPORT_ITEM(x, RI_GLOBAL_LOGICAL_MIN, RI_TYPE_GLOBAL, 1)\n#define HID_LOGICAL_MIN_N(x, n)   HID_REPORT_ITEM(x, RI_GLOBAL_LOGICAL_MIN, RI_TYPE_GLOBAL, n)\n\n#define HID_LOGICAL_MAX(x)        HID_REPORT_ITEM(x, RI_GLOBAL_LOGICAL_MAX, RI_TYPE_GLOBAL, 1)\n#define HID_LOGICAL_MAX_N(x, n)   HID_REPORT_ITEM(x, RI_GLOBAL_LOGICAL_MAX, RI_TYPE_GLOBAL, n)\n\n#define HID_PHYSICAL_MIN(x)       HID_REPORT_ITEM(x, RI_GLOBAL_PHYSICAL_MIN, RI_TYPE_GLOBAL, 1)\n#define HID_PHYSICAL_MIN_N(x, n)  HID_REPORT_ITEM(x, RI_GLOBAL_PHYSICAL_MIN, RI_TYPE_GLOBAL, n)\n\n#define HID_PHYSICAL_MAX(x)       HID_REPORT_ITEM(x, RI_GLOBAL_PHYSICAL_MAX, RI_TYPE_GLOBAL, 1)\n#define HID_PHYSICAL_MAX_N(x, n)  HID_REPORT_ITEM(x, RI_GLOBAL_PHYSICAL_MAX, RI_TYPE_GLOBAL, n)\n\n#define HID_UNIT_EXPONENT(x)      HID_REPORT_ITEM(x, RI_GLOBAL_UNIT_EXPONENT, RI_TYPE_GLOBAL, 1)\n#define HID_UNIT_EXPONENT_N(x, n) HID_REPORT_ITEM(x, RI_GLOBAL_UNIT_EXPONENT, RI_TYPE_GLOBAL, n)\n\n#define HID_UNIT(x)               HID_REPORT_ITEM(x, RI_GLOBAL_UNIT, RI_TYPE_GLOBAL, 1)\n#define HID_UNIT_N(x, n)          HID_REPORT_ITEM(x, RI_GLOBAL_UNIT, RI_TYPE_GLOBAL, n)\n\n#define HID_REPORT_SIZE(x)        HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_SIZE, RI_TYPE_GLOBAL, 1)\n#define HID_REPORT_SIZE_N(x, n)   HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_SIZE, RI_TYPE_GLOBAL, n)\n\n#define HID_REPORT_ID(x)          HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_ID, RI_TYPE_GLOBAL, 1),\n#define HID_REPORT_ID_N(x, n)     HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_ID, RI_TYPE_GLOBAL, n),\n\n#define HID_REPORT_COUNT(x)       HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_COUNT, RI_TYPE_GLOBAL, 1)\n#define HID_REPORT_COUNT_N(x, n)  HID_REPORT_ITEM(x, RI_GLOBAL_REPORT_COUNT, RI_TYPE_GLOBAL, n)\n\n#define HID_PUSH                  HID_REPORT_ITEM(x, RI_GLOBAL_PUSH, RI_TYPE_GLOBAL, 0)\n#define HID_POP                   HID_REPORT_ITEM(x, RI_GLOBAL_POP, RI_TYPE_GLOBAL, 0)\n\n//------------- LOCAL ITEMS 6.2.2.8 -------------//\n\nenum {\n  RI_LOCAL_USAGE            = 0,\n  RI_LOCAL_USAGE_MIN        = 1,\n  RI_LOCAL_USAGE_MAX        = 2,\n  RI_LOCAL_DESIGNATOR_INDEX = 3,\n  RI_LOCAL_DESIGNATOR_MIN   = 4,\n  RI_LOCAL_DESIGNATOR_MAX   = 5,\n  // 6 is reserved\n  RI_LOCAL_STRING_INDEX     = 7,\n  RI_LOCAL_STRING_MIN       = 8,\n  RI_LOCAL_STRING_MAX       = 9,\n  RI_LOCAL_DELIMITER        = 10,\n};\n\n#define HID_USAGE(x)              HID_REPORT_ITEM(x, RI_LOCAL_USAGE, RI_TYPE_LOCAL, 1)\n#define HID_USAGE_N(x, n)         HID_REPORT_ITEM(x, RI_LOCAL_USAGE, RI_TYPE_LOCAL, n)\n\n#define HID_USAGE_MIN(x)          HID_REPORT_ITEM(x, RI_LOCAL_USAGE_MIN, RI_TYPE_LOCAL, 1)\n#define HID_USAGE_MIN_N(x, n)     HID_REPORT_ITEM(x, RI_LOCAL_USAGE_MIN, RI_TYPE_LOCAL, n)\n\n#define HID_USAGE_MAX(x)          HID_REPORT_ITEM(x, RI_LOCAL_USAGE_MAX, RI_TYPE_LOCAL, 1)\n#define HID_USAGE_MAX_N(x, n)     HID_REPORT_ITEM(x, RI_LOCAL_USAGE_MAX, RI_TYPE_LOCAL, n)\n\n//--------------------------------------------------------------------+\n// Usage Table\n/* Usage Types Data\n    Sel  Selector               Array\n    SV   Static Value           Constant, Variable, Absolute\n    SF   Static Flag            Constant, Variable, Absolute\n    DV   Dynamic Value          Constant, Variable, Absolute\n    DF   Dynamic Flag           Constant, Variable, Absolute\n*/\n/* Usage Types Collection\n    NAry  Named Array             Logical\n    CA    Collection Application  Application\n    CL    Collection Logical      Logical\n    CP    Collection Physical     Physical\n    US    Usage Switch            Logical\n    UM    Usage Modifier          Logical\n*/\n//--------------------------------------------------------------------+\n\n/// HID Usage Table - Table 1: Usage Page Summary\nenum {\n  HID_USAGE_PAGE_DESKTOP                   = 0x01,\n  HID_USAGE_PAGE_SIMULATE                  = 0x02,\n  HID_USAGE_PAGE_VIRTUAL_REALITY           = 0x03,\n  HID_USAGE_PAGE_SPORT                     = 0x04,\n  HID_USAGE_PAGE_GAME                      = 0x05,\n  HID_USAGE_PAGE_GENERIC_DEVICE            = 0x06,\n  HID_USAGE_PAGE_KEYBOARD                  = 0x07,\n  HID_USAGE_PAGE_LED                       = 0x08,\n  HID_USAGE_PAGE_BUTTON                    = 0x09,\n  HID_USAGE_PAGE_ORDINAL                   = 0x0a,\n  HID_USAGE_PAGE_TELEPHONY                 = 0x0b,\n  HID_USAGE_PAGE_CONSUMER                  = 0x0c,\n  HID_USAGE_PAGE_DIGITIZER                 = 0x0d,\n  HID_USAGE_PAGE_PID                       = 0x0f,\n  HID_USAGE_PAGE_UNICODE                   = 0x10,\n  HID_USAGE_PAGE_SOC                       = 0x11,\n  HID_USAGE_PAGE_EYE_AND_HEAD_TRACKERS     = 0x12,\n  // 0x13 is reserved\n  HID_USAGE_PAGE_AUXILIARY_DISPLAY         = 0x14,\n  // 0x15 - 0x1f is reserved\n  HID_USAGE_PAGE_SENSORS                   = 0x20,\n  // 0x21 - 0x3f is reserved\n  HID_USAGE_PAGE_MEDICAL_INSTRUMENT        = 0x40,\n  HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION = 0x59,\n  HID_USAGE_PAGE_MONITOR                   = 0x80, // 0x80 - 0x83\n  HID_USAGE_PAGE_POWER                     = 0x84,\n  HID_USAGE_PAGE_BATTERY                   = 0x85,\n  // 0x86 - 0x87 is reserved for Power Device\n  HID_USAGE_PAGE_BARCODE_SCANNER           = 0x8c,\n  HID_USAGE_PAGE_SCALE                     = 0x8d,\n  HID_USAGE_PAGE_MSR                       = 0x8e,\n  HID_USAGE_PAGE_CAMERA                    = 0x90,\n  HID_USAGE_PAGE_ARCADE                    = 0x91,\n  HID_USAGE_PAGE_FIDO                      = 0xF1D0, // FIDO alliance HID usage page\n  HID_USAGE_PAGE_VENDOR                    = 0xFF00  // 0xFF00 - 0xFFFF\n};\n\n/// HID Usage Table - Table 6: Generic Desktop Page\nenum {\n  HID_USAGE_DESKTOP_POINTER                               = 0x01,\n  HID_USAGE_DESKTOP_MOUSE                                 = 0x02,\n  HID_USAGE_DESKTOP_JOYSTICK                              = 0x04,\n  HID_USAGE_DESKTOP_GAMEPAD                               = 0x05,\n  HID_USAGE_DESKTOP_KEYBOARD                              = 0x06,\n  HID_USAGE_DESKTOP_KEYPAD                                = 0x07,\n  HID_USAGE_DESKTOP_MULTI_AXIS_CONTROLLER                 = 0x08,\n  HID_USAGE_DESKTOP_TABLET_PC_SYSTEM                      = 0x09,\n  HID_USAGE_DESKTOP_X                                     = 0x30,\n  HID_USAGE_DESKTOP_Y                                     = 0x31,\n  HID_USAGE_DESKTOP_Z                                     = 0x32,\n  HID_USAGE_DESKTOP_RX                                    = 0x33,\n  HID_USAGE_DESKTOP_RY                                    = 0x34,\n  HID_USAGE_DESKTOP_RZ                                    = 0x35,\n  HID_USAGE_DESKTOP_SLIDER                                = 0x36,\n  HID_USAGE_DESKTOP_DIAL                                  = 0x37,\n  HID_USAGE_DESKTOP_WHEEL                                 = 0x38,\n  HID_USAGE_DESKTOP_HAT_SWITCH                            = 0x39,\n  HID_USAGE_DESKTOP_COUNTED_BUFFER                        = 0x3a,\n  HID_USAGE_DESKTOP_BYTE_COUNT                            = 0x3b,\n  HID_USAGE_DESKTOP_MOTION_WAKEUP                         = 0x3c,\n  HID_USAGE_DESKTOP_START                                 = 0x3d,\n  HID_USAGE_DESKTOP_SELECT                                = 0x3e,\n  HID_USAGE_DESKTOP_VX                                    = 0x40,\n  HID_USAGE_DESKTOP_VY                                    = 0x41,\n  HID_USAGE_DESKTOP_VZ                                    = 0x42,\n  HID_USAGE_DESKTOP_VBRX                                  = 0x43,\n  HID_USAGE_DESKTOP_VBRY                                  = 0x44,\n  HID_USAGE_DESKTOP_VBRZ                                  = 0x45,\n  HID_USAGE_DESKTOP_VNO                                   = 0x46,\n  HID_USAGE_DESKTOP_FEATURE_NOTIFICATION                  = 0x47,\n  HID_USAGE_DESKTOP_RESOLUTION_MULTIPLIER                 = 0x48,\n  HID_USAGE_DESKTOP_SYSTEM_CONTROL                        = 0x80,\n  HID_USAGE_DESKTOP_SYSTEM_POWER_DOWN                     = 0x81,\n  HID_USAGE_DESKTOP_SYSTEM_SLEEP                          = 0x82,\n  HID_USAGE_DESKTOP_SYSTEM_WAKE_UP                        = 0x83,\n  HID_USAGE_DESKTOP_SYSTEM_CONTEXT_MENU                   = 0x84,\n  HID_USAGE_DESKTOP_SYSTEM_MAIN_MENU                      = 0x85,\n  HID_USAGE_DESKTOP_SYSTEM_APP_MENU                       = 0x86,\n  HID_USAGE_DESKTOP_SYSTEM_MENU_HELP                      = 0x87,\n  HID_USAGE_DESKTOP_SYSTEM_MENU_EXIT                      = 0x88,\n  HID_USAGE_DESKTOP_SYSTEM_MENU_SELECT                    = 0x89,\n  HID_USAGE_DESKTOP_SYSTEM_MENU_RIGHT                     = 0x8A,\n  HID_USAGE_DESKTOP_SYSTEM_MENU_LEFT                      = 0x8B,\n  HID_USAGE_DESKTOP_SYSTEM_MENU_UP                        = 0x8C,\n  HID_USAGE_DESKTOP_SYSTEM_MENU_DOWN                      = 0x8D,\n  HID_USAGE_DESKTOP_SYSTEM_COLD_RESTART                   = 0x8E,\n  HID_USAGE_DESKTOP_SYSTEM_WARM_RESTART                   = 0x8F,\n  HID_USAGE_DESKTOP_DPAD_UP                               = 0x90,\n  HID_USAGE_DESKTOP_DPAD_DOWN                             = 0x91,\n  HID_USAGE_DESKTOP_DPAD_RIGHT                            = 0x92,\n  HID_USAGE_DESKTOP_DPAD_LEFT                             = 0x93,\n  HID_USAGE_DESKTOP_SYSTEM_DOCK                           = 0xA0,\n  HID_USAGE_DESKTOP_SYSTEM_UNDOCK                         = 0xA1,\n  HID_USAGE_DESKTOP_SYSTEM_SETUP                          = 0xA2,\n  HID_USAGE_DESKTOP_SYSTEM_BREAK                          = 0xA3,\n  HID_USAGE_DESKTOP_SYSTEM_DEBUGGER_BREAK                 = 0xA4,\n  HID_USAGE_DESKTOP_APPLICATION_BREAK                     = 0xA5,\n  HID_USAGE_DESKTOP_APPLICATION_DEBUGGER_BREAK            = 0xA6,\n  HID_USAGE_DESKTOP_SYSTEM_SPEAKER_MUTE                   = 0xA7,\n  HID_USAGE_DESKTOP_SYSTEM_HIBERNATE                      = 0xA8,\n  HID_USAGE_DESKTOP_SYSTEM_DISPLAY_INVERT                 = 0xB0,\n  HID_USAGE_DESKTOP_SYSTEM_DISPLAY_INTERNAL               = 0xB1,\n  HID_USAGE_DESKTOP_SYSTEM_DISPLAY_EXTERNAL               = 0xB2,\n  HID_USAGE_DESKTOP_SYSTEM_DISPLAY_BOTH                   = 0xB3,\n  HID_USAGE_DESKTOP_SYSTEM_DISPLAY_DUAL                   = 0xB4,\n  HID_USAGE_DESKTOP_SYSTEM_DISPLAY_TOGGLE_INT_EXT         = 0xB5,\n  HID_USAGE_DESKTOP_SYSTEM_DISPLAY_SWAP_PRIMARY_SECONDARY = 0xB6,\n  HID_USAGE_DESKTOP_SYSTEM_DISPLAY_LCD_AUTOSCALE          = 0xB7\n};\n\n/// HID Usage Table: Consumer Page (0x0C)\n/// Only contains controls that supported by Windows (whole list is too long)\nenum {\n  HID_USAGE_CONSUMER_UNASSIGNED                        = 0x0000,\n\n  // Generic Control\n  HID_USAGE_CONSUMER_CONTROL                           = 0x0001,\n  HID_USAGE_CONSUMER_NUMERIC_KEY_PAD                   = 0x0002,\n  HID_USAGE_CONSUMER_PROGRAMMABLE_BUTTONS              = 0x0003,\n  HID_USAGE_CONSUMER_MICROPHONE                        = 0x0004,\n  HID_USAGE_CONSUMER_HEADPHONE                         = 0x0005,\n  HID_USAGE_CONSUMER_GRAPHIC_EQUALIZER                 = 0x0006,\n  // 07-1F Reserved\n\n  HID_USAGE_CONSUMER_PLUS_10                           = 0x0020,\n  HID_USAGE_CONSUMER_PLUS_100                          = 0x0021,\n  HID_USAGE_CONSUMER_AM_PM                             = 0x0022,\n  // 23-3F Reserved\n\n  // Power Control\n  HID_USAGE_CONSUMER_POWER                             = 0x0030,\n  HID_USAGE_CONSUMER_RESET                             = 0x0031,\n  HID_USAGE_CONSUMER_SLEEP                             = 0x0032,\n\n  HID_USAGE_CONSUMER_SLEEP_AFTER                       = 0x0033,\n  HID_USAGE_CONSUMER_SLEEP_MODE                        = 0x0034,\n  HID_USAGE_CONSUMER_ILLUMINATION                      = 0x0035,\n  HID_USAGE_CONSUMER_FUNCTION_BUTTONS                  = 0x0036,\n  // 37-3F Reserved\n  HID_USAGE_CONSUMER_MENU                              = 0x0040,\n  HID_USAGE_CONSUMER_MENU_PICK                         = 0x0041,\n  HID_USAGE_CONSUMER_MENU_UP                           = 0x0042,\n  HID_USAGE_CONSUMER_MENU_DOWN                         = 0x0043,\n  HID_USAGE_CONSUMER_MENU_LEFT                         = 0x0044,\n  HID_USAGE_CONSUMER_MENU_RIGHT                        = 0x0045,\n  HID_USAGE_CONSUMER_MENU_ESCAPE                       = 0x0046,\n  HID_USAGE_CONSUMER_MENU_VALUE_INCREASE               = 0x0047,\n  HID_USAGE_CONSUMER_MENU_VALUE_DECREASE               = 0x0048,\n  // 49-5F Reserved\n  HID_USAGE_CONSUMER_DATA_ON_SCREEN                    = 0x0060,\n  HID_USAGE_CONSUMER_CLOSED_CAPTION                    = 0x0061,\n  HID_USAGE_CONSUMER_CLOSED_CAPTION_SELECT             = 0x0062,\n  HID_USAGE_CONSUMER_VCR_TV                            = 0x0063,\n  HID_USAGE_CONSUMER_BROADCAST_MODE                    = 0x0064,\n  HID_USAGE_CONSUMER_SNAPSHOT                          = 0x0065,\n  HID_USAGE_CONSUMER_STILL                             = 0x0066,\n\n  // 67-7F Reserved\n  // Screen Brightness\n  HID_USAGE_CONSUMER_BRIGHTNESS_INCREMENT              = 0x006F,\n  HID_USAGE_CONSUMER_BRIGHTNESS_DECREMENT              = 0x0070,\n\n  // These HID usages operate only on mobile systems (battery powered) and\n  // require Windows 8 (build 8302 or greater).\n  HID_USAGE_CONSUMER_WIRELESS_RADIO_CONTROLS           = 0x000C,\n  HID_USAGE_CONSUMER_WIRELESS_RADIO_BUTTONS            = 0x00C6,\n  HID_USAGE_CONSUMER_WIRELESS_RADIO_LED                = 0x00C7,\n  HID_USAGE_CONSUMER_WIRELESS_RADIO_SLIDER_SWITCH      = 0x00C8,\n\n  HID_USAGE_CONSUMER_SELECTION                         = 0x0080,\n  HID_USAGE_CONSUMER_ASSIGN_SELECTION                  = 0x0081,\n  HID_USAGE_CONSUMER_MODE_STEP                         = 0x0082,\n  HID_USAGE_CONSUMER_RECALL_LAST                       = 0x0083,\n  HID_USAGE_CONSUMER_ENTER_CHANNEL                     = 0x0084,\n  HID_USAGE_CONSUMER_ORDER_MOVIE                       = 0x0085,\n  HID_USAGE_CONSUMER_CHANNEL                           = 0x0086,\n  HID_USAGE_CONSUMER_MEDIA_SELECTION                   = 0x0087,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_COMPUTER             = 0x0088,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_TV                   = 0x0089,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_WWW                  = 0x008A,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_DVD                  = 0x008B,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_TELEPHONE            = 0x008C,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_PROGRAM_GUIDE        = 0x008D,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_VIDEO_PHONE          = 0x008E,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_GAMES                = 0x008F,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_MESSAGES             = 0x0090,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_CD                   = 0x0091,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_VCR                  = 0x0092,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_TUNER                = 0x0093,\n  HID_USAGE_CONSUMER_QUIT                              = 0x0094,\n  HID_USAGE_CONSUMER_HELP                              = 0x0095,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_TAPE                 = 0x0096,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_CABLE                = 0x0097,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_SATELLITE            = 0x0098,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_SECURITY             = 0x0099,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_HOME                 = 0x009A,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_CALL                 = 0x009B,\n  HID_USAGE_CONSUMER_CHANNEL_INCREMENT                 = 0x009C,\n  HID_USAGE_CONSUMER_CHANNEL_DECREMENT                 = 0x009D,\n  HID_USAGE_CONSUMER_MEDIA_SELECT_SAP                  = 0x009E,\n  // 9F Reserved\n  HID_USAGE_CONSUMER_VCR_PLUS                          = 0x00A0,\n  HID_USAGE_CONSUMER_ONCE                              = 0x00A1,\n  HID_USAGE_CONSUMER_DAILY                             = 0x00A2,\n  HID_USAGE_CONSUMER_WEEKLY                            = 0x00A3,\n  HID_USAGE_CONSUMER_MONTHLY                           = 0x00A4,\n  // A5-AF Reserved\n\n  HID_USAGE_CONSUMER_PLAY                              = 0x00B0,\n  HID_USAGE_CONSUMER_PAUSE                             = 0x00B1,\n  HID_USAGE_CONSUMER_RECORD                            = 0x00B2,\n  HID_USAGE_CONSUMER_FAST_FORWARD                      = 0x00B3,\n  HID_USAGE_CONSUMER_REWIND                            = 0x00B4,\n  HID_USAGE_CONSUMER_SCAN_NEXT_TRACK                   = 0x00B5,\n  HID_USAGE_CONSUMER_SCAN_PREVIOUS_TRACK               = 0x00B6,\n  HID_USAGE_CONSUMER_STOP                              = 0x00B7,\n  HID_USAGE_CONSUMER_EJECT                             = 0x00B8,\n  HID_USAGE_CONSUMER_RANDOM_PLAY                       = 0x00B9,\n  HID_USAGE_CONSUMER_SELECT_DISC                       = 0x00BA,\n  HID_USAGE_CONSUMER_ENTER_DISC                        = 0x00BB,\n  HID_USAGE_CONSUMER_REPEAT                            = 0x00BC,\n  HID_USAGE_CONSUMER_TRACKING                          = 0x00BD,\n  HID_USAGE_CONSUMER_TRACK_NORMAL                      = 0x00BE,\n  HID_USAGE_CONSUMER_SLOW_TRACKING                     = 0x00BF,\n  HID_USAGE_CONSUMER_FRAME_FORWARD                     = 0x00C0,\n  HID_USAGE_CONSUMER_FRAME_BACK                        = 0x00C1,\n  HID_USAGE_CONSUMER_MARK                              = 0x00C2,\n  HID_USAGE_CONSUMER_CLEAR_MARK                        = 0x00C3,\n  HID_USAGE_CONSUMER_REPEAT_FROM_MARK                  = 0x00C4,\n  HID_USAGE_CONSUMER_RETURN_TO_MARK                    = 0x00C5,\n  HID_USAGE_CONSUMER_SEARCH_MARK_FORWARD               = 0x00C6,\n  HID_USAGE_CONSUMER_SEARCH_MARK_BACKWARDS             = 0x00C7,\n  HID_USAGE_CONSUMER_COUNTER_RESET                     = 0x00C8,\n  HID_USAGE_CONSUMER_SHOW_COUNTER                      = 0x00C9,\n  HID_USAGE_CONSUMER_TRACKING_INCREMENT                = 0x00CA,\n  HID_USAGE_CONSUMER_TRACKING_DECREMENT                = 0x00CB,\n  HID_USAGE_CONSUMER_STOP_EJECT                        = 0x00CC,\n\n\n  // Media Control\n  HID_USAGE_CONSUMER_PLAY_PAUSE                        = 0x00CD,\n\n  HID_USAGE_CONSUMER_PLAY_SKIP                         = 0x00CE,\n\n  // CF-DF Reserved\n  HID_USAGE_CONSUMER_VOLUME                            = 0x00E0,\n  HID_USAGE_CONSUMER_BALANCE                           = 0x00E1,\n  HID_USAGE_CONSUMER_MUTE                              = 0x00E2,\n  HID_USAGE_CONSUMER_BASS                              = 0x00E3,\n  HID_USAGE_CONSUMER_TREBLE                            = 0x00E4,\n  HID_USAGE_CONSUMER_BASS_BOOST                        = 0x00E5,\n  HID_USAGE_CONSUMER_SURROUND_MODE                     = 0x00E6,\n  HID_USAGE_CONSUMER_LOUDNESS                          = 0x00E7,\n  HID_USAGE_CONSUMER_MPX                               = 0x00E8,\n  HID_USAGE_CONSUMER_VOLUME_INCREMENT                  = 0x00E9,\n  HID_USAGE_CONSUMER_VOLUME_DECREMENT                  = 0x00EA,\n  // EB-EF Reserved\n  HID_USAGE_CONSUMER_SPEED_SELECT                      = 0x00F0,\n  HID_USAGE_CONSUMER_PLAYBACK_SPEED                    = 0x00F1,\n  HID_USAGE_CONSUMER_STANDARD_PLAY                     = 0x00F2,\n  HID_USAGE_CONSUMER_LONG_PLAY                         = 0x00F3,\n  HID_USAGE_CONSUMER_EXTENDED_PLAY                     = 0x00F4,\n  HID_USAGE_CONSUMER_SLOW                              = 0x00F5,\n  // F6-FF Reserved\n  HID_USAGE_CONSUMER_FAN_ENABLE                        = 0x0100,\n  HID_USAGE_CONSUMER_FAN_SPEED                         = 0x0101,\n  HID_USAGE_CONSUMER_LIGHT_ENABLE                      = 0x0102,\n  HID_USAGE_CONSUMER_LIGHT_ILLUMINATION_LEVEL          = 0x0103,\n  HID_USAGE_CONSUMER_CLIMATE_CONTROL_ENABLE            = 0x0104,\n  HID_USAGE_CONSUMER_ROOM_TEMPERATURE                  = 0x0105,\n  HID_USAGE_CONSUMER_SECURITY_ENABLE                   = 0x0106,\n  HID_USAGE_CONSUMER_FIRE_ALARM                        = 0x0107,\n  HID_USAGE_CONSUMER_POLICE_ALARM                      = 0x0108,\n  HID_USAGE_CONSUMER_PROXIMITY                         = 0x0109,\n  HID_USAGE_CONSUMER_MOTION                            = 0x010A,\n  HID_USAGE_CONSUMER_DURESS_ALARM                      = 0x010B,\n  HID_USAGE_CONSUMER_HOLDUP_ALARM                      = 0x010C,\n  HID_USAGE_CONSUMER_MEDICAL_ALARM                     = 0x010D,\n  // 10E-14F Reserved\n  HID_USAGE_CONSUMER_BALANCE_RIGHT                     = 0x0150,\n  HID_USAGE_CONSUMER_BALANCE_LEFT                      = 0x0151,\n  HID_USAGE_CONSUMER_BASS_INCREMENT                    = 0x0152,\n  HID_USAGE_CONSUMER_BASS_DECREMENT                    = 0x0153,\n  HID_USAGE_CONSUMER_TREBLE_INCREMENT                  = 0x0154,\n  HID_USAGE_CONSUMER_TREBLE_DECREMENT                  = 0x0155,\n\n  // 156-15F Reserved\n  HID_USAGE_CONSUMER_SPEAKER_SYSTEM                    = 0x0160,\n  HID_USAGE_CONSUMER_CHANNEL_LEFT                      = 0x0161,\n  HID_USAGE_CONSUMER_CHANNEL_RIGHT                     = 0x0162,\n  HID_USAGE_CONSUMER_CHANNEL_CENTER                    = 0x0163,\n  HID_USAGE_CONSUMER_CHANNEL_FRONT                     = 0x0164,\n  HID_USAGE_CONSUMER_CHANNEL_CENTER_FRONT              = 0x0165,\n  HID_USAGE_CONSUMER_CHANNEL_SIDE                      = 0x0166,\n  HID_USAGE_CONSUMER_CHANNEL_SURROUND                  = 0x0167,\n  HID_USAGE_CONSUMER_CHANNEL_LOW_FREQUENCY             = 0x0168,\n  // Enhancement\n  // CL 15.12.1\n  HID_USAGE_CONSUMER_CHANNEL_TOP                       = 0x0169,\n  HID_USAGE_CONSUMER_CHANNEL_UNKNOWN                   = 0x016A,\n  // 16B-16F Reserved\n  HID_USAGE_CONSUMER_SUB_CHANNEL                       = 0x0170,\n  HID_USAGE_CONSUMER_SUB_CHANNEL_INCREMENT             = 0x0171,\n  HID_USAGE_CONSUMER_SUB_CHANNEL_DECREMENT             = 0x0172,\n  HID_USAGE_CONSUMER_ALTERNATE_AUDIO_INCREMENT         = 0x0173,\n  HID_USAGE_CONSUMER_ALTERNATE_AUDIO_DECREMENT         = 0x0174,\n  // 175-17F Reserved\n  HID_USAGE_CONSUMER_APPLICATION_LAUNCH_BUTTONS        = 0x0180,\n  HID_USAGE_CONSUMER_AL_LAUNCH_BUTTON_CONFIGURATION    = 0x0181,\n  // Tool\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_PROGRAMMABLE_BUTTON            = 0x0182,\n  // Configuration\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_CONSUMER_CONTROL_CONFIGURATION = 0x0183,\n  // Configuration\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_WORD_PROCESSOR                 = 0x0184,\n  HID_USAGE_CONSUMER_AL_TEXT_EDITOR                    = 0x0185,\n  HID_USAGE_CONSUMER_AL_SPREADSHEET                    = 0x0186,\n  HID_USAGE_CONSUMER_AL_GRAPHICS_EDITOR                = 0x0187,\n  HID_USAGE_CONSUMER_AL_PRESENTATION_APP               = 0x0188,\n  HID_USAGE_CONSUMER_AL_DATABASE_APP                   = 0x0189,\n  HID_USAGE_CONSUMER_AL_EMAIL_READER                   = 0x018A,\n  HID_USAGE_CONSUMER_AL_NEWSREADER                     = 0x018B,\n  HID_USAGE_CONSUMER_AL_VOICEMAIL                      = 0x018C,\n  HID_USAGE_CONSUMER_AL_CONTACTS_ADDRESS_BOOK          = 0x018D,\n  HID_USAGE_CONSUMER_AL_CALENDAR_SCHEDULE              = 0x018E,\n  HID_USAGE_CONSUMER_AL_TASK_PROJECT_MANAGER           = 0x018F,\n  HID_USAGE_CONSUMER_AL_LOG_JOURNAL_TIMECARD           = 0x0190,\n  HID_USAGE_CONSUMER_AL_CHECKBOOK_FINANCE              = 0x0191,\n  HID_USAGE_CONSUMER_AL_CALCULATOR                     = 0x0192,\n  HID_USAGE_CONSUMER_AL_A_V_CAPTURE_PLAYBACK           = 0x0193,\n  HID_USAGE_CONSUMER_AL_LOCAL_MACHINE_BROWSER          = 0x0194,\n  HID_USAGE_CONSUMER_AL_LAN_WAN_BROWSER                = 0x0195,\n  HID_USAGE_CONSUMER_AL_INTERNET_BROWSER               = 0x0196,\n  HID_USAGE_CONSUMER_AL_REMOTE_NETWORKING_ISP          = 0x0197,\n  // Connect\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_NETWORK_CONFERENCE             = 0x0198,\n  HID_USAGE_CONSUMER_AL_NETWORK_CHAT                   = 0x0199,\n  HID_USAGE_CONSUMER_AL_TELEPHONY_DIALER               = 0x019A,\n  HID_USAGE_CONSUMER_AL_LOGON                          = 0x019B,\n  HID_USAGE_CONSUMER_AL_LOGOFF                         = 0x019C,\n  HID_USAGE_CONSUMER_AL_LOGON_LOGOFF                   = 0x019D,\n  HID_USAGE_CONSUMER_AL_TERMINAL_LOCK_SCREENSAVER      = 0x019E,\n  HID_USAGE_CONSUMER_AL_CONTROL_PANEL                  = 0x019F,\n  HID_USAGE_CONSUMER_AL_COMMAND_LINE_PROCESSOR_RUN     = 0x01A0,\n  HID_USAGE_CONSUMER_AL_PROCESS_TASK_MANAGER           = 0x01A1,\n  HID_USAGE_CONSUMER_AL_SELECT_TASK_APPLICATION        = 0x01A2,\n  HID_USAGE_CONSUMER_AL_NEXT_TASK_APPLICATION          = 0x01A3,\n  HID_USAGE_CONSUMER_AL_PREVIOUS_TASK_APPLICATION      = 0x01A4,\n  HID_USAGE_CONSUMER_AL_PREEMPTIVE_HALT                = 0x01A5,\n  // Task_Application\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_INTEGRATED_HELP_CENTER         = 0x01A6,\n  HID_USAGE_CONSUMER_AL_DOCUMENTS                      = 0x01A7,\n  HID_USAGE_CONSUMER_AL_THESAURUS                      = 0x01A8,\n  HID_USAGE_CONSUMER_AL_DICTIONARY                     = 0x01A9,\n  HID_USAGE_CONSUMER_AL_DESKTOP                        = 0x01AA,\n  HID_USAGE_CONSUMER_AL_SPELL_CHECK                    = 0x01AB,\n  HID_USAGE_CONSUMER_AL_GRAMMAR_CHECK                  = 0x01AC,\n  HID_USAGE_CONSUMER_AL_WIRELESS_STATUS                = 0x01AD,\n  HID_USAGE_CONSUMER_AL_KEYBOARD_LAYOUT                = 0x01AE,\n  HID_USAGE_CONSUMER_AL_VIRUS_PROTECTION               = 0x01AF,\n  HID_USAGE_CONSUMER_AL_ENCRYPTION                     = 0x01B0,\n  HID_USAGE_CONSUMER_AL_SCREEN_SAVER                   = 0x01B1,\n  HID_USAGE_CONSUMER_AL_ALARMS                         = 0x01B2,\n  HID_USAGE_CONSUMER_AL_CLOCK                          = 0x01B3,\n  HID_USAGE_CONSUMER_AL_FILE_BROWSER                   = 0x01B4,\n  HID_USAGE_CONSUMER_AL_POWER_STATUS                   = 0x01B5,\n  HID_USAGE_CONSUMER_AL_IMAGE_BROWSER                  = 0x01B6,\n  HID_USAGE_CONSUMER_AL_AUDIO_BROWSER                  = 0x01B7,\n  HID_USAGE_CONSUMER_AL_MOVIE_BROWSER                  = 0x01B8,\n  HID_USAGE_CONSUMER_AL_DIGITAL_RIGHTS_MANAGER         = 0x01B9,\n  HID_USAGE_CONSUMER_AL_DIGITAL_WALLET                 = 0x01BA,\n  // 1BB Reserved\n  HID_USAGE_CONSUMER_AL_INSTANT_MESSAGING              = 0x01BC,\n  HID_USAGE_CONSUMER_AL_OEM_FEATURES_TIPS_TUTORIAL     = 0x01BD,\n  // Browser\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_OEM_HELP                       = 0x01BE,\n  HID_USAGE_CONSUMER_AL_ONLINE_COMMUNITY               = 0x01BF,\n  HID_USAGE_CONSUMER_AL_ENTERTAINMENT_CONTENT          = 0x01C0,\n  // Browser\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_ONLINE_SHOPPING_BROWSER        = 0x01C1,\n  HID_USAGE_CONSUMER_AL_SMARTCARD_INFORMATION_HELP     = 0x01C2,\n  HID_USAGE_CONSUMER_AL_MARKET_MONITOR_FINANCE         = 0x01C3,\n  // Browser\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_CUSTOMIZED_CORPORATE_NEWS      = 0x01C4,\n  // Browser\n  // Sel 15.15\n  HID_USAGE_CONSUMER_AL_ONLINE_ACTIVITY_BROWSER        = 0x01C5,\n  HID_USAGE_CONSUMER_AL_RESEARCH_SEARCH_BROWSER        = 0x01C6,\n  HID_USAGE_CONSUMER_AL_AUDIO_PLAYER                   = 0x01C7,\n  // 1C8-1FF Reserved\n  HID_USAGE_CONSUMER_GENERIC_GUI_APPLICATION           = 0x0200,\n  // ' Controls\n  // '\n  HID_USAGE_CONSUMER_AC_NEW                            = 0x0201,\n  HID_USAGE_CONSUMER_AC_OPEN                           = 0x0202,\n  HID_USAGE_CONSUMER_AC_CLOSE                          = 0x0203,\n  HID_USAGE_CONSUMER_AC_EXIT                           = 0x0204,\n  HID_USAGE_CONSUMER_AC_MAXIMIZE                       = 0x0205,\n  HID_USAGE_CONSUMER_AC_MINIMIZE                       = 0x0206,\n  HID_USAGE_CONSUMER_AC_SAVE                           = 0x0207,\n  HID_USAGE_CONSUMER_AC_PRINT                          = 0x0208,\n  HID_USAGE_CONSUMER_AC_PROPERTIES                     = 0x0209,\n  HID_USAGE_CONSUMER_AC_UNDO                           = 0x021A,\n  HID_USAGE_CONSUMER_AC_COPY                           = 0x021B,\n  HID_USAGE_CONSUMER_AC_CUT                            = 0x021C,\n  HID_USAGE_CONSUMER_AC_PASTE                          = 0x021D,\n  HID_USAGE_CONSUMER_AC_SELECT_ALL                     = 0x021E,\n  HID_USAGE_CONSUMER_AC_FIND                           = 0x021F,\n  HID_USAGE_CONSUMER_AC_FIND_AND_REPLACE               = 0x0220,\n  // Browser/Explorer Specific\n  HID_USAGE_CONSUMER_AC_SEARCH                         = 0x0221,\n  HID_USAGE_CONSUMER_AC_GO_TO                          = 0x0222,\n  HID_USAGE_CONSUMER_AC_HOME                           = 0x0223,\n  HID_USAGE_CONSUMER_AC_BACK                           = 0x0224,\n  HID_USAGE_CONSUMER_AC_FORWARD                        = 0x0225,\n  HID_USAGE_CONSUMER_AC_STOP                           = 0x0226,\n  HID_USAGE_CONSUMER_AC_REFRESH                        = 0x0227,\n  HID_USAGE_CONSUMER_AC_PREVIOUS_LINK                  = 0x0228,\n  HID_USAGE_CONSUMER_AC_NEXT_LINK                      = 0x0229,\n  HID_USAGE_CONSUMER_AC_BOOKMARKS                      = 0x022A,\n  HID_USAGE_CONSUMER_AC_HISTORY                        = 0x022B,\n  HID_USAGE_CONSUMER_AC_SUBSCRIPTIONS                  = 0x022C,\n  HID_USAGE_CONSUMER_AC_ZOOM_IN                        = 0x022D,\n  HID_USAGE_CONSUMER_AC_ZOOM_OUT                       = 0x022E,\n  HID_USAGE_CONSUMER_AC_ZOOM                           = 0x022F,\n  HID_USAGE_CONSUMER_AC_FULL_SCREEN_VIEW               = 0x0230,\n  HID_USAGE_CONSUMER_AC_NORMAL_VIEW                    = 0x0231,\n  HID_USAGE_CONSUMER_AC_VIEW_TOGGLE                    = 0x0232,\n  HID_USAGE_CONSUMER_AC_SCROLL_UP                      = 0x0233,\n  HID_USAGE_CONSUMER_AC_SCROLL_DOWN                    = 0x0234,\n  HID_USAGE_CONSUMER_AC_SCROLL                         = 0x0235,\n  HID_USAGE_CONSUMER_AC_PAN_LEFT                       = 0x0236,\n  HID_USAGE_CONSUMER_AC_PAN_RIGHT                      = 0x0237,\n  // Mouse Horizontal scroll\n  HID_USAGE_CONSUMER_AC_PAN                            = 0x0238,\n  HID_USAGE_CONSUMER_AC_NEW_WINDOW                     = 0x0239,\n  HID_USAGE_CONSUMER_AC_TILE_HORIZONTALLY              = 0x023A,\n  HID_USAGE_CONSUMER_AC_TILE_VERTICALLY                = 0x023B,\n  HID_USAGE_CONSUMER_AC_FORMAT                         = 0x023C,\n  HID_USAGE_CONSUMER_AC_EDIT                           = 0x023D,\n  HID_USAGE_CONSUMER_AC_BOLD                           = 0x023E,\n  HID_USAGE_CONSUMER_AC_ITALICS                        = 0x023F,\n  HID_USAGE_CONSUMER_AC_UNDERLINE                      = 0x0240,\n  HID_USAGE_CONSUMER_AC_STRIKETHROUGH                  = 0x0241,\n  HID_USAGE_CONSUMER_AC_SUBSCRIPT                      = 0x0242,\n  HID_USAGE_CONSUMER_AC_SUPERSCRIPT                    = 0x0243,\n  HID_USAGE_CONSUMER_AC_ALL_CAPS                       = 0x0244,\n  HID_USAGE_CONSUMER_AC_ROTATE                         = 0x0245,\n  HID_USAGE_CONSUMER_AC_RESIZE                         = 0x0246,\n  HID_USAGE_CONSUMER_AC_FLIP_HORIZONTAL                = 0x0247,\n  HID_USAGE_CONSUMER_AC_FLIP_VERTICAL                  = 0x0248,\n  HID_USAGE_CONSUMER_AC_MIRROR_HORIZONTAL              = 0x0249,\n  HID_USAGE_CONSUMER_AC_MIRROR_VERTICAL                = 0x024A,\n  HID_USAGE_CONSUMER_AC_FONT_SELECT                    = 0x024B,\n  HID_USAGE_CONSUMER_AC_FONT_COLOR                     = 0x024C,\n  HID_USAGE_CONSUMER_AC_FONT_SIZE                      = 0x024D,\n  HID_USAGE_CONSUMER_AC_JUSTIFY_LEFT                   = 0x024E,\n  HID_USAGE_CONSUMER_AC_JUSTIFY_CENTER_H               = 0x024F,\n  HID_USAGE_CONSUMER_AC_JUSTIFY_RIGHT                  = 0x0250,\n  HID_USAGE_CONSUMER_AC_JUSTIFY_BLOCK_H                = 0x0251,\n  HID_USAGE_CONSUMER_AC_JUSTIFY_TOP                    = 0x0252,\n  HID_USAGE_CONSUMER_AC_JUSTIFY_CENTER_V               = 0x0253,\n  HID_USAGE_CONSUMER_AC_JUSTIFY_BOTTOM                 = 0x0254,\n  HID_USAGE_CONSUMER_AC_JUSTIFY_BLOCK_V                = 0x0255,\n  HID_USAGE_CONSUMER_AC_INDENT_DECREASE                = 0x0256,\n  HID_USAGE_CONSUMER_AC_INDENT_INCREASE                = 0x0257,\n  HID_USAGE_CONSUMER_AC_NUMBERED_LIST                  = 0x0258,\n  HID_USAGE_CONSUMER_AC_RESTART_NUMBERING              = 0x0259,\n  HID_USAGE_CONSUMER_AC_BULLETED_LIST                  = 0x025A,\n  HID_USAGE_CONSUMER_AC_PROMOTE                        = 0x025B,\n  HID_USAGE_CONSUMER_AC_DEMOTE                         = 0x025C,\n  HID_USAGE_CONSUMER_AC_YES                            = 0x025D,\n  HID_USAGE_CONSUMER_AC_NO                             = 0x025E,\n  HID_USAGE_CONSUMER_AC_CANCEL                         = 0x025F,\n  HID_USAGE_CONSUMER_AC_CATALOG                        = 0x0260,\n  HID_USAGE_CONSUMER_AC_BUY_CHECKOUT                   = 0x0261,\n  HID_USAGE_CONSUMER_AC_ADD_TO_CART                    = 0x0262,\n  HID_USAGE_CONSUMER_AC_EXPAND                         = 0x0263,\n  HID_USAGE_CONSUMER_AC_EXPAND_ALL                     = 0x0264,\n  HID_USAGE_CONSUMER_AC_COLLAPSE                       = 0x0265,\n  HID_USAGE_CONSUMER_AC_COLLAPSE_ALL                   = 0x0266,\n  HID_USAGE_CONSUMER_AC_PRINT_PREVIEW                  = 0x0267,\n  HID_USAGE_CONSUMER_AC_PASTE_SPECIAL                  = 0x0268,\n  HID_USAGE_CONSUMER_AC_INSERT_MODE                    = 0x0269,\n  HID_USAGE_CONSUMER_AC_DELETE                         = 0x026A,\n  HID_USAGE_CONSUMER_AC_LOCK                           = 0x026B,\n  HID_USAGE_CONSUMER_AC_UNLOCK                         = 0x026C,\n  HID_USAGE_CONSUMER_AC_PROTECT                        = 0x026D,\n  HID_USAGE_CONSUMER_AC_UNPROTECT                      = 0x026E,\n  HID_USAGE_CONSUMER_AC_ATTACH_COMMENT                 = 0x026F,\n  HID_USAGE_CONSUMER_AC_DELETE_COMMENT                 = 0x0270,\n  HID_USAGE_CONSUMER_AC_VIEW_COMMENT                   = 0x0271,\n  HID_USAGE_CONSUMER_AC_SELECT_WORD                    = 0x0272,\n  HID_USAGE_CONSUMER_AC_SELECT_SENTENCE                = 0x0273,\n  HID_USAGE_CONSUMER_AC_SELECT_PARAGRAPH               = 0x0274,\n  HID_USAGE_CONSUMER_AC_SELECT_COLUMN                  = 0x0275,\n  HID_USAGE_CONSUMER_AC_SELECT_ROW                     = 0x0276,\n  HID_USAGE_CONSUMER_AC_SELECT_TABLE                   = 0x0277,\n  HID_USAGE_CONSUMER_AC_SELECT_OBJECT                  = 0x0278,\n  HID_USAGE_CONSUMER_AC_REDO_REPEAT                    = 0x0279,\n  HID_USAGE_CONSUMER_AC_SORT                           = 0x027A,\n  HID_USAGE_CONSUMER_AC_SORT_ASCENDING                 = 0x027B,\n  HID_USAGE_CONSUMER_AC_SORT_DESCENDING                = 0x027C,\n  HID_USAGE_CONSUMER_AC_FILTER                         = 0x027D,\n  HID_USAGE_CONSUMER_AC_SET_CLOCK                      = 0x027E,\n  HID_USAGE_CONSUMER_AC_VIEW_CLOCK                     = 0x027F,\n  HID_USAGE_CONSUMER_AC_SELECT_TIME_ZONE               = 0x0280,\n  HID_USAGE_CONSUMER_AC_EDIT_TIME_ZONES                = 0x0281,\n  HID_USAGE_CONSUMER_AC_SET_ALARM                      = 0x0282,\n  HID_USAGE_CONSUMER_AC_CLEAR_ALARM                    = 0x0283,\n  HID_USAGE_CONSUMER_AC_SNOOZE_ALARM                   = 0x0284,\n  HID_USAGE_CONSUMER_AC_RESET_ALARM                    = 0x0285,\n  HID_USAGE_CONSUMER_AC_SYNCHRONIZE                    = 0x0286,\n  HID_USAGE_CONSUMER_AC_SEND_RECEIVE                   = 0x0287,\n  HID_USAGE_CONSUMER_AC_SEND_TO                        = 0x0288,\n  HID_USAGE_CONSUMER_AC_REPLY                          = 0x0289,\n  HID_USAGE_CONSUMER_AC_REPLY_ALL                      = 0x028A,\n  HID_USAGE_CONSUMER_AC_FORWARD_MSG                    = 0x028B,\n  HID_USAGE_CONSUMER_AC_SEND                           = 0x028C,\n  HID_USAGE_CONSUMER_AC_ATTACH_FILE                    = 0x028D,\n  HID_USAGE_CONSUMER_AC_UPLOAD                         = 0x028E,\n  HID_USAGE_CONSUMER_AC_DOWNLOAD_SAVE_TARGET_AS        = 0x028F,\n  HID_USAGE_CONSUMER_AC_SET_BORDERS                    = 0x0290,\n  HID_USAGE_CONSUMER_AC_INSERT_ROW                     = 0x0291,\n  HID_USAGE_CONSUMER_AC_INSERT_COLUMN                  = 0x0292,\n  HID_USAGE_CONSUMER_AC_INSERT_FILE                    = 0x0293,\n  HID_USAGE_CONSUMER_AC_INSERT_PICTURE                 = 0x0294,\n  HID_USAGE_CONSUMER_AC_INSERT_OBJECT                  = 0x0295,\n  HID_USAGE_CONSUMER_AC_INSERT_SYMBOL                  = 0x0296,\n  HID_USAGE_CONSUMER_AC_SAVE_AND_CLOSE                 = 0x0297,\n  HID_USAGE_CONSUMER_AC_RENAME                         = 0x0298,\n  HID_USAGE_CONSUMER_AC_MERGE                          = 0x0299,\n  HID_USAGE_CONSUMER_AC_SPLIT                          = 0x029A,\n  HID_USAGE_CONSUMER_AC_DISRIBUTE_HORIZONTALLY         = 0x029B,\n  HID_USAGE_CONSUMER_AC_DISTRIBUTE_VERTICALLY          = 0x029C,\n  // 29D-FFFF Reserved\n\n};\n\n/// HID Usage Table: Digitizer Page (0x0D)\nenum {\n  HID_USAGE_DIGITIZER_UNDEFINED                           = 0x00,\n  HID_USAGE_DIGITIZER_DIGITIZER                           = 0x01, // CA\n  HID_USAGE_DIGITIZER_PEN                                 = 0x02, // CA\n  HID_USAGE_DIGITIZER_LIGHT_PEN                           = 0x03, // CA\n  HID_USAGE_DIGITIZER_TOUCH_SCREEN                        = 0x04, // CA\n  HID_USAGE_DIGITIZER_TOUCH_PAD                           = 0x05, // CA\n  HID_USAGE_DIGITIZER_WHITEBOARD                          = 0x06, // CA\n  HID_USAGE_DIGITIZER_COORDINATE_MEASURING_MACHINE        = 0x07, // CA\n  HID_USAGE_DIGITIZER_3D_DIGITIZER                        = 0x08, // CA\n  HID_USAGE_DIGITIZER_STEREO_PLOTTER                      = 0x09, // CA\n  HID_USAGE_DIGITIZER_ARTICULATED_ARM                     = 0x0A, // CA\n  HID_USAGE_DIGITIZER_ARMATURE                            = 0x0B, // CA\n  HID_USAGE_DIGITIZER_MULTIPLE_POINT_DIGITIZER            = 0x0C, // CA\n  HID_USAGE_DIGITIZER_FREE_SPACE_WAND                     = 0x0D, // CA\n  HID_USAGE_DIGITIZER_DEVICE_CONFIGURATION                = 0x0E, // CA\n  HID_USAGE_DIGITIZER_CAPACITIVE_HEAT_MAP_DIGITIZER       = 0x0F, // CA\n  // Reserved (0x10 - 0x1F)\n  HID_USAGE_DIGITIZER_STYLUS                              = 0x20, // CA/CL\n  HID_USAGE_DIGITIZER_PUCK                                = 0x21, // CL\n  HID_USAGE_DIGITIZER_FINGER                              = 0x22, // CL\n  HID_USAGE_DIGITIZER_DEVICE_SETTINGS                     = 0x23, // CL\n  HID_USAGE_DIGITIZER_CHARACTER_GESTURE                   = 0x24, // CL\n  // Reserved (0x25 - 0x2F)\n  HID_USAGE_DIGITIZER_TIP_PRESSURE                        = 0x30, // DV\n  HID_USAGE_DIGITIZER_BARREL_PRESSURE                     = 0x31, // DV\n  HID_USAGE_DIGITIZER_IN_RANGE                            = 0x32, // MC\n  HID_USAGE_DIGITIZER_TOUCH                               = 0x33, // MC\n  HID_USAGE_DIGITIZER_UNTOUCH                             = 0x34, // OSC\n  HID_USAGE_DIGITIZER_TAP                                 = 0x35, // OSC\n  HID_USAGE_DIGITIZER_QUALITY                             = 0x36, // DV\n  HID_USAGE_DIGITIZER_DATA_VALID                          = 0x37, // MC\n  HID_USAGE_DIGITIZER_TRANSDUCER_INDEX                    = 0x38, // DV\n  HID_USAGE_DIGITIZER_TABLET_FUNCTION_KEYS                = 0x39, // CL\n  HID_USAGE_DIGITIZER_PROGRAM_CHANGE_KEYS                 = 0x3A, // CL\n  HID_USAGE_DIGITIZER_BATTERY_STRENGTH                    = 0x3B, // DV\n  HID_USAGE_DIGITIZER_INVERT                              = 0x3C, // MC\n  HID_USAGE_DIGITIZER_X_TILT                              = 0x3D, // DV\n  HID_USAGE_DIGITIZER_Y_TILT                              = 0x3E, // DV\n  HID_USAGE_DIGITIZER_AZIMUTH                             = 0x3F, // DV\n  HID_USAGE_DIGITIZER_ALTITUDE                            = 0x40, // DV\n  HID_USAGE_DIGITIZER_TWIST                               = 0x41, // DV\n  HID_USAGE_DIGITIZER_TIP_SWITCH                          = 0x42, // MC\n  HID_USAGE_DIGITIZER_SECONDARY_TIP_SWITCH                = 0x43, // MC\n  HID_USAGE_DIGITIZER_BARREL_SWITCH                       = 0x44, // MC\n  HID_USAGE_DIGITIZER_ERASER                              = 0x45, // MC\n  HID_USAGE_DIGITIZER_TABLET_PICK                         = 0x46, // MC\n  HID_USAGE_DIGITIZER_TOUCH_VALID                         = 0x47, // MC\n  HID_USAGE_DIGITIZER_WIDTH                               = 0x48, // DV\n  HID_USAGE_DIGITIZER_HEIGHT                              = 0x49, // DV\n  // Reserved (0x4A - 0x50)\n  HID_USAGE_DIGITIZER_CONTACT_IDENTIFIER                  = 0x51, // DV\n  HID_USAGE_DIGITIZER_DEVICE_MODE                         = 0x52, // DV\n  HID_USAGE_DIGITIZER_DEVICE_IDENTIFIER                   = 0x53, // DV/SV\n  HID_USAGE_DIGITIZER_CONTACT_COUNT                       = 0x54, // DV\n  HID_USAGE_DIGITIZER_CONTACT_COUNT_MAXIMUM               = 0x55, // SV\n  HID_USAGE_DIGITIZER_SCAN_TIME                           = 0x56, // DV\n  HID_USAGE_DIGITIZER_SURFACE_SWITCH                      = 0x57, // DF\n  HID_USAGE_DIGITIZER_BUTTON_SWITCH                       = 0x58, // DF\n  HID_USAGE_DIGITIZER_PAD_TYPE                            = 0x59, // SF\n  HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL_NUMBER            = 0x5B, // SV\n  HID_USAGE_DIGITIZER_PREFERRED_COLOR                     = 0x5C, // DV\n  HID_USAGE_DIGITIZER_PREFERRED_COLOR_LOCKED              = 0x5D, // MC\n  HID_USAGE_DIGITIZER_PREFERRED_LINE_WIDTH                = 0x5E, // DV\n  HID_USAGE_DIGITIZER_PREFERRED_LINE_WIDTH_LOCKED         = 0x5F, // MC\n  HID_USAGE_DIGITIZER_LATENCY_MODE                        = 0x60, // DF\n  HID_USAGE_DIGITIZER_GESTURE_CHARACTER_QUALITY           = 0x61, // DV\n  HID_USAGE_DIGITIZER_CHARACTER_GESTURE_DATA_LENGTH       = 0x62, // DV\n  HID_USAGE_DIGITIZER_CHARACTER_GESTURE_DATA              = 0x63, // DV\n  HID_USAGE_DIGITIZER_GESTURE_CHARACTER_ENCODING          = 0x64, // NAry\n  HID_USAGE_DIGITIZER_UTF8_CHARACTER_GESTURE_ENCODING     = 0x65, // Sel\n  HID_USAGE_DIGITIZER_UTF16_LE_CHARACTER_GESTURE_ENCODING = 0x66, // Sel\n  HID_USAGE_DIGITIZER_UTF16_BE_CHARACTER_GESTURE_ENCODING = 0x67, // Sel\n  HID_USAGE_DIGITIZER_UTF32_LE_CHARACTER_GESTURE_ENCODING = 0x68, // Sel\n  HID_USAGE_DIGITIZER_UTF32_BE_CHARACTER_GESTURE_ENCODING = 0x69, // Sel\n  HID_USAGE_DIGITIZER_CAPACITIVE_HEAT_MAP_VENDOR_ID       = 0x6A, // SV\n  HID_USAGE_DIGITIZER_CAPACITIVE_HEAT_MAP_VERSION         = 0x6B, // SV\n  HID_USAGE_DIGITIZER_CAPACITIVE_HEAT_MAP_FRAME_DATA      = 0x6C, // DV\n  HID_USAGE_DIGITIZER_GESTURE_CHARACTER_ENABLE            = 0x6D, // DF\n  HID_USAGE_DIGITIZER_TRANSDUCER_SERIAL_NUMBER_PART2      = 0x6E, // SV\n  HID_USAGE_DIGITIZER_NO_PREFERRED_COLOR                  = 0x6F, // DF\n  HID_USAGE_DIGITIZER_PREFERRED_LINE_STYLE                = 0x70, // NAry\n  HID_USAGE_DIGITIZER_PREFERRED_LINE_STYLE_LOCKED         = 0x71, // MC\n  HID_USAGE_DIGITIZER_INK                                 = 0x72, // Sel\n  HID_USAGE_DIGITIZER_PENCIL                              = 0x73, // Sel\n  HID_USAGE_DIGITIZER_HIGHLIGHTER                         = 0x74, // Sel\n  HID_USAGE_DIGITIZER_CHISEL_MARKER                       = 0x75, // Sel\n  HID_USAGE_DIGITIZER_BRUSH                               = 0x76, // Sel\n  HID_USAGE_DIGITIZER_NO_PREFERENCE                       = 0x77, // Sel\n  // Reserved (0x78 - 0x7F)\n  HID_USAGE_DIGITIZER_DIGITIZER_DIAGNOSTIC                = 0x80, // CL\n  HID_USAGE_DIGITIZER_DIGITIZER_ERROR                     = 0x81, // NAry\n  HID_USAGE_DIGITIZER_ERR_NORMAL_STATUS                   = 0x82, // Sel\n  HID_USAGE_DIGITIZER_ERR_TRANSDUCERS_EXCEEDED            = 0x83, // Sel\n  HID_USAGE_DIGITIZER_ERR_FULL_TRANS_FEATURES_UNAVAILABLE = 0x84, // Sel\n  HID_USAGE_DIGITIZER_ERR_CHARGE_LOW                      = 0x85, // Sel\n  // Reserved (0x86 - 0x8F)\n  HID_USAGE_DIGITIZER_TRANSDUCER_SOFTWARE_INFO            = 0x90, // CL\n  HID_USAGE_DIGITIZER_TRANSDUCER_VENDOR_ID                = 0x91, // SV\n  HID_USAGE_DIGITIZER_TRANSDUCER_PRODUCT_ID               = 0x92, // SV\n  HID_USAGE_DIGITIZER_DEVICE_SUPPORTED_PROTOCOLS          = 0x93, // NAry/CL\n  HID_USAGE_DIGITIZER_TRANSDUCER_SUPPORTED_PROTOCOLS      = 0x94, // NAry/CL\n  HID_USAGE_DIGITIZER_NO_PROTOCOL                         = 0x95, // Sel\n  HID_USAGE_DIGITIZER_WACOM_AES_PROTOCOL                  = 0x96, // Sel\n  HID_USAGE_DIGITIZER_USI_PROTOCOL                        = 0x97, // Sel\n  HID_USAGE_DIGITIZER_MICROSOFT_PEN_PROTOCOL              = 0x98, // Sel\n  // Reserved (0x99 - 0x9F)\n  HID_USAGE_DIGITIZER_SUPPORTED_REPORT_RATES              = 0xA0, // SV/CL\n  HID_USAGE_DIGITIZER_REPORT_RATE                         = 0xA1, // DV\n  HID_USAGE_DIGITIZER_TRANSDUCER_CONNECTED                = 0xA2, // SF\n  HID_USAGE_DIGITIZER_SWITCH_DISABLED                     = 0xA3, // Sel\n  HID_USAGE_DIGITIZER_SWITCH_UNIMPLEMENTED                = 0xA4, // Sel\n  HID_USAGE_DIGITIZER_TRANSDUCER_SWITCHES                 = 0xA5, // CL\n  HID_USAGE_DIGITIZER_TRANSDUCER_INDEX_SELECTOR           = 0xA6, // DV\n  // Reserved (0xA7 - 0xAF)\n  HID_USAGE_DIGITIZER_BUTTON_PRESS_THRESHOLD              = 0xB0, // DV\n\n  // Reserved (0xB1 - 0xFFFF)\n};\n\n/// HID Usage Table: Physical Input Device Page (0x0F)\nenum {\n  HID_USAGE_PID_UNDEFINED                                = 0x00,\n  HID_USAGE_PID_PHYSICAL_INPUT_DEVICE                    = 0x01,\n  HID_USAGE_PID_NORMAL                                   = 0x20,\n  HID_USAGE_PID_SET_EFFECT_REPORT                        = 0x21,\n  HID_USAGE_PID_EFFECT_PARAMETER_BLOCK_INDEX             = 0x22,\n  HID_USAGE_PID_PARAMETER_BLOCK_OFFSET                   = 0x23,\n  HID_USAGE_PID_ROM_FLAG                                 = 0x24,\n  HID_USAGE_PID_EFFECT_TYPE                              = 0x25,\n  HID_USAGE_PID_ET_CONSTANTFORCE                         = 0x26,\n  HID_USAGE_PID_ET_RAMP                                  = 0x27,\n  HID_USAGE_PID_ET_CUSTOMFORCE                           = 0x28,\n  HID_USAGE_PID_ET_SQUARE                                = 0x30,\n  HID_USAGE_PID_ET_SINE                                  = 0x31,\n  HID_USAGE_PID_ET_TRIANGLE                              = 0x32,\n  HID_USAGE_PID_ET_SAWTOOTH_UP                           = 0x33,\n  HID_USAGE_PID_ET_SAWTOOTH_DOWN                         = 0x34,\n  HID_USAGE_PID_ET_SPRING                                = 0x40,\n  HID_USAGE_PID_ET_DAMPER                                = 0x41,\n  HID_USAGE_PID_ET_INERTIA                               = 0x42,\n  HID_USAGE_PID_ET_FRICTION                              = 0x43,\n  HID_USAGE_PID_DURATION                                 = 0x50,\n  HID_USAGE_PID_SAMPLE_PERIOD                            = 0x51,\n  HID_USAGE_PID_GAIN                                     = 0x52,\n  HID_USAGE_PID_TRIGGER_BUTTON                           = 0x53,\n  HID_USAGE_PID_TRIGGER_REPEAT_INTERVAL                  = 0x54,\n  HID_USAGE_PID_AXES_ENABLE                              = 0x55,\n  HID_USAGE_PID_DIRECTION_ENABLE                         = 0x56,\n  HID_USAGE_PID_DIRECTION                                = 0x57,\n  HID_USAGE_PID_TYPE_SPECIFIC_BLOCK_OFFSET               = 0x58,\n  HID_USAGE_PID_BLOCK_TYPE                               = 0x59,\n  HID_USAGE_PID_SET_ENVELOPE_REPORT                      = 0x5a,\n  HID_USAGE_PID_ATTACK_LEVEL                             = 0x5b,\n  HID_USAGE_PID_ATTACK_TIME                              = 0x5c,\n  HID_USAGE_PID_FADE_LEVEL                               = 0x5d,\n  HID_USAGE_PID_FADE_TIME                                = 0x5e,\n  HID_USAGE_PID_SET_CONDITION_REPORT                     = 0x5f,\n  HID_USAGE_PID_CENTERPOINT_OFFSET                       = 0x60,\n  HID_USAGE_PID_POSITIVE_COEFFICIENT                     = 0x61,\n  HID_USAGE_PID_NEGATIVE_COEFFICIENT                     = 0x62,\n  HID_USAGE_PID_POSITIVE_SATURATION                      = 0x63,\n  HID_USAGE_PID_NEGATIVE_SATURATION                      = 0x64,\n  HID_USAGE_PID_DEAD_BAND                                = 0x65,\n  HID_USAGE_PID_DOWNLOAD_FORCE_SAMPLE                    = 0x66,\n  HID_USAGE_PID_ISOCH_CUSTOMFORCE_ENABLE                 = 0x67,\n  HID_USAGE_PID_CUSTOMFORCE_DATA_REPORT                  = 0x68,\n  HID_USAGE_PID_CUSTOMFORCE_DATA                         = 0x69,\n  HID_USAGE_PID_CUSTOMFORCE_VENDOR_DEFINED_DATA          = 0x6a,\n  HID_USAGE_PID_SET_CUSTOMFORCE_REPORT                   = 0x6b,\n  HID_USAGE_PID_CUSTOMFORCE_DATA_OFFSET                  = 0x6c,\n  HID_USAGE_PID_SAMPLE_COUNT                             = 0x6d,\n  HID_USAGE_PID_SET_PERIODIC_REPORT                      = 0x6e,\n  HID_USAGE_PID_OFFSET                                   = 0x6f,\n  HID_USAGE_PID_MAGNITUDE                                = 0x70,\n  HID_USAGE_PID_PHASE                                    = 0x71,\n  HID_USAGE_PID_PERIOD                                   = 0x72,\n  HID_USAGE_PID_SET_CONSTANTFORCE_REPORT                 = 0x73,\n  HID_USAGE_PID_SET_RAMPFORCE_REPORT                     = 0x74,\n  HID_USAGE_PID_RAMP_START                               = 0x75,\n  HID_USAGE_PID_RAMP_END                                 = 0x76,\n  HID_USAGE_PID_EFFECT_OPERATION_REPORT                  = 0x77,\n  HID_USAGE_PID_EFFECT_OPERATION                         = 0x78,\n  HID_USAGE_PID_OP_EFFECT_START                          = 0x79,\n  HID_USAGE_PID_OP_EFFECT_START_SOLO                     = 0x7a,\n  HID_USAGE_PID_OP_EFFECT_STOP                           = 0x7b,\n  HID_USAGE_PID_LOOP_COUNT                               = 0x7c,\n  HID_USAGE_PID_DEVICE_GAIN_REPORT                       = 0x7d,\n  HID_USAGE_PID_DEVICE_GAIN                              = 0x7e,\n  HID_USAGE_PID_PARAMETER_BLOCK_POOLS_REPORT             = 0x7f,\n  HID_USAGE_PID_RAM_POOL_SIZE                            = 0x80,\n  HID_USAGE_PID_ROM_POOL_SIZE                            = 0x81,\n  HID_USAGE_PID_ROM_EFFECT_BLOCK_COUNT                   = 0x82,\n  HID_USAGE_PID_SIMULTANEOUS_EFFECTS_MAX                 = 0x83,\n  HID_USAGE_PID_POOL_ALIGNMENT                           = 0x84,\n  HID_USAGE_PID_PARAMETER_BLOCK_MOVE_REPORT              = 0x85,\n  HID_USAGE_PID_MOVE_SOURCE                              = 0x86,\n  HID_USAGE_PID_MOVE_DESTINATION                         = 0x87,\n  HID_USAGE_PID_MOVE_LENGTH                              = 0x88,\n  HID_USAGE_PID_EFFECT_PARAMETER_BLOCK_LOAD_REPORT       = 0x89,\n  HID_USAGE_PID_EFFECT_PARAMETER_BLOCK_LOAD_STATUS       = 0x8b,\n  HID_USAGE_PID_BLOCK_LOAD_SUCCESS                       = 0x8c,\n  HID_USAGE_PID_BLOCK_LOAD_FULL                          = 0x8d,\n  HID_USAGE_PID_BLOCK_LOAD_ERROR                         = 0x8e,\n  HID_USAGE_PID_BLOCK_HANDLE                             = 0x8f,\n  HID_USAGE_PID_EFFECT_PARAMETER_BLOCK_FREE_REPORT       = 0x90,\n  HID_USAGE_PID_TYPE_SPECIFIC_BLOCK_HANDLE               = 0x91,\n  HID_USAGE_PID_PID_STATE_REPORT                         = 0x92,\n  HID_USAGE_PID_EFFECT_PLAYING                           = 0x94,\n  HID_USAGE_PID_PID_DEVICE_CONTROL_REPORT                = 0x95,\n  HID_USAGE_PID_PID_DEVICE_CONTROL                       = 0x96,\n  HID_USAGE_PID_DC_ENABLE_ACTUATORS                      = 0x97,\n  HID_USAGE_PID_DC_DISABLE_ACTUATORS                     = 0x98,\n  HID_USAGE_PID_DC_STOP_ALL_EFFECTS                      = 0x99,\n  HID_USAGE_PID_DC_RESET                                 = 0x9a,\n  HID_USAGE_PID_DC_PAUSE                                 = 0x9b,\n  HID_USAGE_PID_DC_CONTINUE                              = 0x9c,\n  HID_USAGE_PID_DEVICE_PAUSED                            = 0x9f,\n  HID_USAGE_PID_ACTUATORS_ENABLED                        = 0xa0,\n  HID_USAGE_PID_SAFETY_SWITCH                            = 0xa4,\n  HID_USAGE_PID_ACTUATOR_OVERRIDE_SWITCH                 = 0xa5,\n  HID_USAGE_PID_ACTUATOR_POWER                           = 0xa6,\n  HID_USAGE_PID_START_DELAY                              = 0xa7,\n  HID_USAGE_PID_PARAMETER_BLOCK_SIZE                     = 0xa8,\n  HID_USAGE_PID_DEVICEMANAGED_POOL                       = 0xa9,\n  HID_USAGE_PID_SHARED_PARAMETER_BLOCKS                  = 0xaa,\n  HID_USAGE_PID_CREATE_NEW_EFFECT_PARAMETER_BLOCK_REPORT = 0xab,\n  HID_USAGE_PID_RAM_POOL_AVAILABLE                       = 0xac,\n};\n\n/// HID Usage Table - Lighting And Illumination Page (0x59)\nenum {\n  HID_USAGE_LIGHTING_LAMP_ARRAY                          = 0x01,\n  HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT        = 0x02,\n  HID_USAGE_LIGHTING_LAMP_COUNT                          = 0x03,\n  HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS   = 0x04,\n  HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS  = 0x05,\n  HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS   = 0x06,\n  HID_USAGE_LIGHTING_LAMP_ARRAY_KIND                     = 0x07,\n  HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS = 0x08,\n  HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT      = 0x20,\n  HID_USAGE_LIGHTING_LAMP_ID                             = 0x21,\n  HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT     = 0x22,\n  HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS           = 0x23,\n  HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS           = 0x24,\n  HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS           = 0x25,\n  HID_USAGE_LIGHTING_LAMP_PURPOSES                       = 0x26,\n  HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS      = 0x27,\n  HID_USAGE_LIGHTING_RED_LEVEL_COUNT                     = 0x28,\n  HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT                   = 0x29,\n  HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT                    = 0x2A,\n  HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT               = 0x2B,\n  HID_USAGE_LIGHTING_IS_PROGRAMMABLE                     = 0x2C,\n  HID_USAGE_LIGHTING_INPUT_BINDING                       = 0x2D,\n  HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT            = 0x50,\n  HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL                  = 0x51,\n  HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL                = 0x52,\n  HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL                 = 0x53,\n  HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL            = 0x54,\n  HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS                   = 0x55,\n  HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT            = 0x60,\n  HID_USAGE_LIGHTING_LAMP_ID_START                       = 0x61,\n  HID_USAGE_LIGHTING_LAMP_ID_END                         = 0x62,\n  HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT           = 0x70,\n  HID_USAGE_LIGHTING_AUTONOMOUS_MODE                     = 0x71,\n};\n\n/// HID Usage Table: Power Device Page (0x84)\nenum {\n  HID_USAGE_POWER_UNDEFINED              = 0x00,\n  HID_USAGE_POWER_I_NAME                 = 0x01,\n  HID_USAGE_POWER_PRESENT_STATUS         = 0x02,\n  HID_USAGE_POWER_CHANGED_STATUS         = 0x03,\n  HID_USAGE_POWER_UPS                    = 0x04,\n  HID_USAGE_POWER_POWER_SUPPLY           = 0x05,\n  // 06-0F Reserved\n  HID_USAGE_POWER_BATTERY_SYSTEM         = 0x10,\n  HID_USAGE_POWER_BATTERY_SYSTEM_ID      = 0x11,\n  HID_USAGE_POWER_BATTERY                = 0x12,\n  HID_USAGE_POWER_BATTERY_ID             = 0x13,\n  HID_USAGE_POWER_CHARGER                = 0x14,\n  HID_USAGE_POWER_CHARGER_ID             = 0x15,\n  HID_USAGE_POWER_POWER_CONVERTER        = 0x16,\n  HID_USAGE_POWER_POWER_CONVERTER_ID     = 0x17,\n  HID_USAGE_POWER_OUTLET_SYSTEM          = 0x18,\n  HID_USAGE_POWER_OUTLET_SYSTEM_ID       = 0x19,\n  HID_USAGE_POWER_INPUT                  = 0x1A,\n  HID_USAGE_POWER_INPUT_ID               = 0x1B,\n  HID_USAGE_POWER_OUTPUT                 = 0x1C,\n  HID_USAGE_POWER_OUTPUT_ID              = 0x1D,\n  HID_USAGE_POWER_FLOW                   = 0x1E,\n  HID_USAGE_POWER_FLOW_ID                = 0x1F,\n  HID_USAGE_POWER_OUTLET                 = 0x20,\n  HID_USAGE_POWER_OUTLET_ID              = 0x21,\n  HID_USAGE_POWER_GANG                   = 0x22,\n  HID_USAGE_POWER_GANG_ID                = 0x23,\n  HID_USAGE_POWER_POWER_SUMMARY          = 0x24,\n  HID_USAGE_POWER_POWER_SUMMARY_ID       = 0x25,\n  // 26-2F Reserved\n  HID_USAGE_POWER_VOLTAGE                = 0x30,\n  HID_USAGE_POWER_CURRENT                = 0x31,\n  HID_USAGE_POWER_FREQUENCY              = 0x32,\n  HID_USAGE_POWER_APPARENT_POWER         = 0x33,\n  HID_USAGE_POWER_ACTIVE_POWER           = 0x34,\n  HID_USAGE_POWER_PERCENT_LOAD           = 0x35,\n  HID_USAGE_POWER_TEMPERATURE            = 0x36,\n  HID_USAGE_POWER_HUMIDITY               = 0x37,\n  HID_USAGE_POWER_BAD_COUNT              = 0x38,\n  // 39-3F Reserved\n  HID_USAGE_POWER_CONFIG_VOLTAGE         = 0x40,\n  HID_USAGE_POWER_CONFIG_CURRENT         = 0x41,\n  HID_USAGE_POWER_CONFIG_FREQUENCY       = 0x42,\n  HID_USAGE_POWER_CONFIG_APPARENT_POWER  = 0x43,\n  HID_USAGE_POWER_CONFIG_ACTIVE_POWER    = 0x44,\n  HID_USAGE_POWER_CONFIG_PERCENT_LOAD    = 0x45,\n  HID_USAGE_POWER_CONFIG_TEMPERATURE     = 0x46,\n  HID_USAGE_POWER_CONFIG_HUMIDITY        = 0x47,\n  // 48-4F Reserved\n  HID_USAGE_POWER_SWITCH_ON_CONTROL      = 0x50,\n  HID_USAGE_POWER_SWITCH_OFF_CONTROL     = 0x51,\n  HID_USAGE_POWER_TOGGLE_CONTROL         = 0x52,\n  HID_USAGE_POWER_LOW_VOLTAGE_TRANSFER   = 0x53,\n  HID_USAGE_POWER_HIGH_VOLTAGE_TRANSFER  = 0x54,\n  HID_USAGE_POWER_DELAY_BEFORE_REBOOT    = 0x55,\n  HID_USAGE_POWER_DELAY_BEFORE_STARTUP   = 0x56,\n  HID_USAGE_POWER_DELAY_BEFORE_SHUTDOWN  = 0x57,\n  HID_USAGE_POWER_TEST                   = 0x58,\n  HID_USAGE_POWER_MODULE_RESET           = 0x59,\n  HID_USAGE_POWER_AUDIBLE_ALARM_CONTROL  = 0x5A,\n  // 5B-5F Reserved\n  HID_USAGE_POWER_PRESENT                = 0x60,\n  HID_USAGE_POWER_GOOD                   = 0x61,\n  HID_USAGE_POWER_INTERNAL_FAILURE       = 0x62,\n  HID_USAGE_POWER_VOLTAGE_OUT_OF_RANGE   = 0x63,\n  HID_USAGE_POWER_FREQUENCY_OUT_OF_RANGE = 0x64,\n  HID_USAGE_POWER_OVERLOAD               = 0x65,\n  HID_USAGE_POWER_OVER_CHARGED           = 0x66,\n  HID_USAGE_POWER_OVER_TEMPERATURE       = 0x67,\n  HID_USAGE_POWER_SHUTDOWN_REQUESTED     = 0x68,\n  HID_USAGE_POWER_SHUTDOWN_IMMINENT      = 0x69,\n  // 6A Reserved\n  HID_USAGE_POWER_SWITCH_ON_OFF          = 0x6B,\n  HID_USAGE_POWER_SWITCHABLE             = 0x6C,\n  HID_USAGE_POWER_USED                   = 0x6D,\n  HID_USAGE_POWER_BOOST                  = 0x6E,\n  HID_USAGE_POWER_BUCK                   = 0x6F,\n  HID_USAGE_POWER_INITIALIZED            = 0x70,\n  HID_USAGE_POWER_TESTED                 = 0x71,\n  HID_USAGE_POWER_AWAITING_POWER         = 0x72,\n  HID_USAGE_POWER_COMMUNICATION_LOST     = 0x73,\n  // 74-FC Reserved\n  HID_USAGE_POWER_I_MANUFACTURER         = 0xFD,\n  HID_USAGE_POWER_I_PRODUCT              = 0xFE,\n  HID_USAGE_POWER_I_SERIAL_NUMBER        = 0xFF\n};\n\n/// HID Usage Table: Battery System Page (0x85)\nenum {\n  HID_USAGE_BATTERY_UNDEFINED                      = 0x00,\n  HID_USAGE_BATTERY_SMB_BATTERY_MODE               = 0x01,\n  HID_USAGE_BATTERY_SMB_BATTERY_STATUS             = 0x02,\n  HID_USAGE_BATTERY_SMB_ALARM_WARNING              = 0x03,\n  HID_USAGE_BATTERY_SMB_CHARGER_MODE               = 0x04,\n  HID_USAGE_BATTERY_SMB_CHARGER_STATUS             = 0x05,\n  HID_USAGE_BATTERY_SMB_CHARGER_SPEC_INFO          = 0x06,\n  HID_USAGE_BATTERY_SMB_SELECTOR_STATE             = 0x07,\n  HID_USAGE_BATTERY_SMB_SELECTOR_PRESETS           = 0x08,\n  HID_USAGE_BATTERY_SMB_SELECTOR_INFO              = 0x09,\n  // 0A-0F Reserved\n  HID_USAGE_BATTERY_OPTIONAL_MFG_FUNCTION_1        = 0x10,\n  HID_USAGE_BATTERY_OPTIONAL_MFG_FUNCTION_2        = 0x11,\n  HID_USAGE_BATTERY_OPTIONAL_MFG_FUNCTION_3        = 0x12,\n  HID_USAGE_BATTERY_OPTIONAL_MFG_FUNCTION_4        = 0x13,\n  HID_USAGE_BATTERY_OPTIONAL_MFG_FUNCTION_5        = 0x14,\n  HID_USAGE_BATTERY_CONNECTION_TO_SMBUS            = 0x15,\n  HID_USAGE_BATTERY_OUTPUT_CONNECTION              = 0x16,\n  HID_USAGE_BATTERY_CHARGER_CONNECTION             = 0x17,\n  HID_USAGE_BATTERY_BATTERY_INSERTION              = 0x18,\n  HID_USAGE_BATTERY_USE_NEXT                       = 0x19,\n  HID_USAGE_BATTERY_OK_TO_USE                      = 0x1A,\n  HID_USAGE_BATTERY_BATTERY_SUPPORTED              = 0x1B,\n  HID_USAGE_BATTERY_SELECTOR_REVISION              = 0x1C,\n  HID_USAGE_BATTERY_CHARGING_INDICATOR             = 0x1D,\n  // 1E-27 Reserved\n  HID_USAGE_BATTERY_MANUFACTURER_ACCESS            = 0x28,\n  HID_USAGE_BATTERY_REMAINING_CAPACITY_LIMIT       = 0x29,\n  HID_USAGE_BATTERY_REMAINING_TIME_LIMIT           = 0x2A,\n  HID_USAGE_BATTERY_AT_RATE                        = 0x2B,\n  HID_USAGE_BATTERY_CAPACITY_MODE                  = 0x2C,\n  HID_USAGE_BATTERY_BROADCAST_TO_CHARGER           = 0x2D,\n  HID_USAGE_BATTERY_PRIMARY_BATTERY                = 0x2E,\n  HID_USAGE_BATTERY_CHARGE_CONTROLLER              = 0x2F,\n  // 30-3F Reserved\n  HID_USAGE_BATTERY_TERMINATE_CHARGE               = 0x40,\n  HID_USAGE_BATTERY_TERMINATE_DISCHARGE            = 0x41,\n  HID_USAGE_BATTERY_BELOW_REMAINING_CAPACITY_LIMIT = 0x42,\n  HID_USAGE_BATTERY_REMAINING_TIME_LIMIT_EXPIRED   = 0x43,\n  HID_USAGE_BATTERY_CHARGING                       = 0x44,\n  HID_USAGE_BATTERY_DISCHARGING                    = 0x45,\n  HID_USAGE_BATTERY_FULLY_CHARGED                  = 0x46,\n  HID_USAGE_BATTERY_FULLY_DISCHARGED               = 0x47,\n  HID_USAGE_BATTERY_CONDITIONING_FLAG              = 0x48,\n  HID_USAGE_BATTERY_AT_RATE_OK                     = 0x49,\n  HID_USAGE_BATTERY_SMB_ERROR_CODE                 = 0x4A,\n  HID_USAGE_BATTERY_NEED_REPLACEMENT               = 0x4B,\n  // 4C-5F Reserved\n  HID_USAGE_BATTERY_AT_RATE_TIME_TO_FULL           = 0x60,\n  HID_USAGE_BATTERY_AT_RATE_TIME_TO_EMPTY          = 0x61,\n  HID_USAGE_BATTERY_AVERAGE_CURRENT                = 0x62,\n  HID_USAGE_BATTERY_MAX_ERROR                      = 0x63,\n  HID_USAGE_BATTERY_RELATIVE_STATE_OF_CHARGE       = 0x64,\n  HID_USAGE_BATTERY_ABSOLUTE_STATE_OF_CHARGE       = 0x65,\n  HID_USAGE_BATTERY_REMAINING_CAPACITY             = 0x66,\n  HID_USAGE_BATTERY_FULL_CHARGE_CAPACITY           = 0x67,\n  HID_USAGE_BATTERY_RUN_TIME_TO_EMPTY              = 0x68,\n  HID_USAGE_BATTERY_AVERAGE_TIME_TO_EMPTY          = 0x69,\n  HID_USAGE_BATTERY_AVERAGE_TIME_TO_FULL           = 0x6A,\n  HID_USAGE_BATTERY_CYCLE_COUNT                    = 0x6B,\n  // 6C-7F Reserved\n  HID_USAGE_BATTERY_BATT_PACK_MODEL_LEVEL          = 0x80,\n  HID_USAGE_BATTERY_INTERNAL_CHARGE_CONTROLLER     = 0x81,\n  HID_USAGE_BATTERY_PRIMARY_BATTERY_SUPPORT        = 0x82,\n  HID_USAGE_BATTERY_DESIGN_CAPACITY                = 0x83,\n  HID_USAGE_BATTERY_SPECIFICATION_INFO             = 0x84,\n  HID_USAGE_BATTERY_MANUFACTURER_DATE              = 0x85,\n  HID_USAGE_BATTERY_SERIAL_NUMBER                  = 0x86,\n  HID_USAGE_BATTERY_I_MANUFACTURER_NAME            = 0x87,\n  HID_USAGE_BATTERY_I_DEVICE_NAME                  = 0x88,\n  HID_USAGE_BATTERY_I_DEVICE_CHEMISTRY             = 0x89,\n  HID_USAGE_BATTERY_MANUFACTURER_DATA              = 0x8A,\n  HID_USAGE_BATTERY_RECHARGEABLE                   = 0x8B,\n  HID_USAGE_BATTERY_WARNING_CAPACITY_LIMIT         = 0x8C,\n  HID_USAGE_BATTERY_CAPACITY_GRANULARITY_1         = 0x8D,\n  HID_USAGE_BATTERY_CAPACITY_GRANULARITY_2         = 0x8E,\n  HID_USAGE_BATTERY_I_OEMINFORMATION               = 0x8F,\n  // 90-BF Reserved\n  HID_USAGE_BATTERY_INHIBIT_CHARGE                 = 0xC0,\n  HID_USAGE_BATTERY_ENABLE_POLLING                 = 0xC1,\n  HID_USAGE_BATTERY_RESET_TO_ZERO                  = 0xC2,\n  // C3-CF Reserved\n  HID_USAGE_BATTERY_AC_PRESENT                     = 0xD0,\n  HID_USAGE_BATTERY_BATTERY_PRESENT                = 0xD1,\n  HID_USAGE_BATTERY_POWER_FAIL                     = 0xD2,\n  HID_USAGE_BATTERY_ALARM_INHIBITED                = 0xD3,\n  HID_USAGE_BATTERY_THERMISTOR_UNDER_RANGE         = 0xD4,\n  HID_USAGE_BATTERY_THERMISTOR_HOT                 = 0xD5,\n  HID_USAGE_BATTERY_THERMISTOR_COLD                = 0xD6,\n  HID_USAGE_BATTERY_THERMISTOR_OVER_RANGE          = 0xD7,\n  HID_USAGE_BATTERY_VOLTAGE_OUT_OF_RANGE           = 0xD8,\n  HID_USAGE_BATTERY_CURRENT_OUT_OF_RANGE           = 0xD9,\n  HID_USAGE_BATTERY_CURRENT_NOT_REGULATED          = 0xDA,\n  HID_USAGE_BATTERY_VOLTAGE_NOT_REGULATED          = 0xDB,\n  HID_USAGE_BATTERY_MASTER_MODE                    = 0xDC,\n  // DD-EF Reserved\n  HID_USAGE_BATTERY_CHARGER_SELECTOR_SUPPORT       = 0xF0,\n  HID_USAGE_BATTERY_CHARGER_SPEC                   = 0xF1,\n  HID_USAGE_BATTERY_LEVEL_2                        = 0xF2,\n  HID_USAGE_BATTERY_LEVEL_3                        = 0xF3\n  // F4-FF Reserved\n};\n\n/// HID Usage Table: FIDO Alliance Page (0xF1D0)\nenum {\n  HID_USAGE_FIDO_U2FHID   = 0x01, // U2FHID usage for top-level collection\n  HID_USAGE_FIDO_DATA_IN  = 0x20, // Raw IN data report\n  HID_USAGE_FIDO_DATA_OUT = 0x21  // Raw OUT data report\n};\n\n/*--------------------------------------------------------------------\n * ASCII to KEYCODE Conversion\n *  Expand to array of [128][2] (shift, keycode)\n *\n * Usage: example to convert input chr into keyboard report (modifier + keycode)\n *\n *  uint8_t const conv_table[128][2] =  { HID_ASCII_TO_KEYCODE };\n *\n *  uint8_t keycode[6] = { 0 };\n *  uint8_t modifier   = 0;\n *\n *  if ( conv_table[chr][0] ) modifier = KEYBOARD_MODIFIER_LEFTSHIFT;\n *  keycode[0] = conv_table[chr][1];\n *  tud_hid_keyboard_report(report_id, modifier, keycode);\n *\n *--------------------------------------------------------------------*/\n#define HID_ASCII_TO_KEYCODE \\\n    {0, 0                     }, /* 0x00 Null      */ \\\n    {0, 0                     }, /* 0x01           */ \\\n    {0, 0                     }, /* 0x02           */ \\\n    {0, 0                     }, /* 0x03           */ \\\n    {0, 0                     }, /* 0x04           */ \\\n    {0, 0                     }, /* 0x05           */ \\\n    {0, 0                     }, /* 0x06           */ \\\n    {0, 0                     }, /* 0x07           */ \\\n    {0, HID_KEY_BACKSPACE     }, /* 0x08 Backspace */ \\\n    {0, HID_KEY_TAB           }, /* 0x09 Tab       */ \\\n    {0, HID_KEY_ENTER         }, /* 0x0A Line Feed */ \\\n    {0, 0                     }, /* 0x0B           */ \\\n    {0, 0                     }, /* 0x0C           */ \\\n    {0, HID_KEY_ENTER         }, /* 0x0D CR        */ \\\n    {0, 0                     }, /* 0x0E           */ \\\n    {0, 0                     }, /* 0x0F           */ \\\n    {0, 0                     }, /* 0x10           */ \\\n    {0, 0                     }, /* 0x11           */ \\\n    {0, 0                     }, /* 0x12           */ \\\n    {0, 0                     }, /* 0x13           */ \\\n    {0, 0                     }, /* 0x14           */ \\\n    {0, 0                     }, /* 0x15           */ \\\n    {0, 0                     }, /* 0x16           */ \\\n    {0, 0                     }, /* 0x17           */ \\\n    {0, 0                     }, /* 0x18           */ \\\n    {0, 0                     }, /* 0x19           */ \\\n    {0, 0                     }, /* 0x1A           */ \\\n    {0, HID_KEY_ESCAPE        }, /* 0x1B Escape    */ \\\n    {0, 0                     }, /* 0x1C           */ \\\n    {0, 0                     }, /* 0x1D           */ \\\n    {0, 0                     }, /* 0x1E           */ \\\n    {0, 0                     }, /* 0x1F           */ \\\n                                                      \\\n    {0, HID_KEY_SPACE         }, /* 0x20           */ \\\n    {1, HID_KEY_1             }, /* 0x21 !         */ \\\n    {1, HID_KEY_APOSTROPHE    }, /* 0x22 \"         */ \\\n    {1, HID_KEY_3             }, /* 0x23 #         */ \\\n    {1, HID_KEY_4             }, /* 0x24 $         */ \\\n    {1, HID_KEY_5             }, /* 0x25 %         */ \\\n    {1, HID_KEY_7             }, /* 0x26 &         */ \\\n    {0, HID_KEY_APOSTROPHE    }, /* 0x27 '         */ \\\n    {1, HID_KEY_9             }, /* 0x28 (         */ \\\n    {1, HID_KEY_0             }, /* 0x29 )         */ \\\n    {1, HID_KEY_8             }, /* 0x2A *         */ \\\n    {1, HID_KEY_EQUAL         }, /* 0x2B +         */ \\\n    {0, HID_KEY_COMMA         }, /* 0x2C ,         */ \\\n    {0, HID_KEY_MINUS         }, /* 0x2D -         */ \\\n    {0, HID_KEY_PERIOD        }, /* 0x2E .         */ \\\n    {0, HID_KEY_SLASH         }, /* 0x2F /         */ \\\n    {0, HID_KEY_0             }, /* 0x30 0         */ \\\n    {0, HID_KEY_1             }, /* 0x31 1         */ \\\n    {0, HID_KEY_2             }, /* 0x32 2         */ \\\n    {0, HID_KEY_3             }, /* 0x33 3         */ \\\n    {0, HID_KEY_4             }, /* 0x34 4         */ \\\n    {0, HID_KEY_5             }, /* 0x35 5         */ \\\n    {0, HID_KEY_6             }, /* 0x36 6         */ \\\n    {0, HID_KEY_7             }, /* 0x37 7         */ \\\n    {0, HID_KEY_8             }, /* 0x38 8         */ \\\n    {0, HID_KEY_9             }, /* 0x39 9         */ \\\n    {1, HID_KEY_SEMICOLON     }, /* 0x3A :         */ \\\n    {0, HID_KEY_SEMICOLON     }, /* 0x3B ;         */ \\\n    {1, HID_KEY_COMMA         }, /* 0x3C <         */ \\\n    {0, HID_KEY_EQUAL         }, /* 0x3D =         */ \\\n    {1, HID_KEY_PERIOD        }, /* 0x3E >         */ \\\n    {1, HID_KEY_SLASH         }, /* 0x3F ?         */ \\\n                                                      \\\n    {1, HID_KEY_2             }, /* 0x40 @         */ \\\n    {1, HID_KEY_A             }, /* 0x41 A         */ \\\n    {1, HID_KEY_B             }, /* 0x42 B         */ \\\n    {1, HID_KEY_C             }, /* 0x43 C         */ \\\n    {1, HID_KEY_D             }, /* 0x44 D         */ \\\n    {1, HID_KEY_E             }, /* 0x45 E         */ \\\n    {1, HID_KEY_F             }, /* 0x46 F         */ \\\n    {1, HID_KEY_G             }, /* 0x47 G         */ \\\n    {1, HID_KEY_H             }, /* 0x48 H         */ \\\n    {1, HID_KEY_I             }, /* 0x49 I         */ \\\n    {1, HID_KEY_J             }, /* 0x4A J         */ \\\n    {1, HID_KEY_K             }, /* 0x4B K         */ \\\n    {1, HID_KEY_L             }, /* 0x4C L         */ \\\n    {1, HID_KEY_M             }, /* 0x4D M         */ \\\n    {1, HID_KEY_N             }, /* 0x4E N         */ \\\n    {1, HID_KEY_O             }, /* 0x4F O         */ \\\n    {1, HID_KEY_P             }, /* 0x50 P         */ \\\n    {1, HID_KEY_Q             }, /* 0x51 Q         */ \\\n    {1, HID_KEY_R             }, /* 0x52 R         */ \\\n    {1, HID_KEY_S             }, /* 0x53 S         */ \\\n    {1, HID_KEY_T             }, /* 0x55 T         */ \\\n    {1, HID_KEY_U             }, /* 0x55 U         */ \\\n    {1, HID_KEY_V             }, /* 0x56 V         */ \\\n    {1, HID_KEY_W             }, /* 0x57 W         */ \\\n    {1, HID_KEY_X             }, /* 0x58 X         */ \\\n    {1, HID_KEY_Y             }, /* 0x59 Y         */ \\\n    {1, HID_KEY_Z             }, /* 0x5A Z         */ \\\n    {0, HID_KEY_BRACKET_LEFT  }, /* 0x5B [         */ \\\n    {0, HID_KEY_BACKSLASH     }, /* 0x5C '\\'       */ \\\n    {0, HID_KEY_BRACKET_RIGHT }, /* 0x5D ]         */ \\\n    {1, HID_KEY_6             }, /* 0x5E ^         */ \\\n    {1, HID_KEY_MINUS         }, /* 0x5F _         */ \\\n                                                      \\\n    {0, HID_KEY_GRAVE         }, /* 0x60 `         */ \\\n    {0, HID_KEY_A             }, /* 0x61 a         */ \\\n    {0, HID_KEY_B             }, /* 0x62 b         */ \\\n    {0, HID_KEY_C             }, /* 0x63 c         */ \\\n    {0, HID_KEY_D             }, /* 0x66 d         */ \\\n    {0, HID_KEY_E             }, /* 0x65 e         */ \\\n    {0, HID_KEY_F             }, /* 0x66 f         */ \\\n    {0, HID_KEY_G             }, /* 0x67 g         */ \\\n    {0, HID_KEY_H             }, /* 0x68 h         */ \\\n    {0, HID_KEY_I             }, /* 0x69 i         */ \\\n    {0, HID_KEY_J             }, /* 0x6A j         */ \\\n    {0, HID_KEY_K             }, /* 0x6B k         */ \\\n    {0, HID_KEY_L             }, /* 0x6C l         */ \\\n    {0, HID_KEY_M             }, /* 0x6D m         */ \\\n    {0, HID_KEY_N             }, /* 0x6E n         */ \\\n    {0, HID_KEY_O             }, /* 0x6F o         */ \\\n    {0, HID_KEY_P             }, /* 0x70 p         */ \\\n    {0, HID_KEY_Q             }, /* 0x71 q         */ \\\n    {0, HID_KEY_R             }, /* 0x72 r         */ \\\n    {0, HID_KEY_S             }, /* 0x73 s         */ \\\n    {0, HID_KEY_T             }, /* 0x75 t         */ \\\n    {0, HID_KEY_U             }, /* 0x75 u         */ \\\n    {0, HID_KEY_V             }, /* 0x76 v         */ \\\n    {0, HID_KEY_W             }, /* 0x77 w         */ \\\n    {0, HID_KEY_X             }, /* 0x78 x         */ \\\n    {0, HID_KEY_Y             }, /* 0x79 y         */ \\\n    {0, HID_KEY_Z             }, /* 0x7A z         */ \\\n    {1, HID_KEY_BRACKET_LEFT  }, /* 0x7B {         */ \\\n    {1, HID_KEY_BACKSLASH     }, /* 0x7C |         */ \\\n    {1, HID_KEY_BRACKET_RIGHT }, /* 0x7D }         */ \\\n    {1, HID_KEY_GRAVE         }, /* 0x7E ~         */ \\\n    {0, HID_KEY_DELETE        }  /* 0x7F Delete    */ \\\n\n/*--------------------------------------------------------------------\n * KEYCODE to Ascii Conversion\n *  Expand to array of [128][2] (ascii without shift, ascii with shift)\n *\n * Usage: example to convert ascii from keycode (key) and shift modifier (shift).\n * Here we assume key < 128 ( printable )\n *\n *  uint8_t const conv_table[128][2] =  { HID_KEYCODE_TO_ASCII };\n *  char ch = shift ? conv_table[chr][1] : conv_table[chr][0];\n *\n *--------------------------------------------------------------------*/\n#define HID_KEYCODE_TO_ASCII    \\\n    {0     , 0      }, /* 0x00 */ \\\n    {0     , 0      }, /* 0x01 */ \\\n    {0     , 0      }, /* 0x02 */ \\\n    {0     , 0      }, /* 0x03 */ \\\n    {'a'   , 'A'    }, /* 0x04 */ \\\n    {'b'   , 'B'    }, /* 0x05 */ \\\n    {'c'   , 'C'    }, /* 0x06 */ \\\n    {'d'   , 'D'    }, /* 0x07 */ \\\n    {'e'   , 'E'    }, /* 0x08 */ \\\n    {'f'   , 'F'    }, /* 0x09 */ \\\n    {'g'   , 'G'    }, /* 0x0a */ \\\n    {'h'   , 'H'    }, /* 0x0b */ \\\n    {'i'   , 'I'    }, /* 0x0c */ \\\n    {'j'   , 'J'    }, /* 0x0d */ \\\n    {'k'   , 'K'    }, /* 0x0e */ \\\n    {'l'   , 'L'    }, /* 0x0f */ \\\n    {'m'   , 'M'    }, /* 0x10 */ \\\n    {'n'   , 'N'    }, /* 0x11 */ \\\n    {'o'   , 'O'    }, /* 0x12 */ \\\n    {'p'   , 'P'    }, /* 0x13 */ \\\n    {'q'   , 'Q'    }, /* 0x14 */ \\\n    {'r'   , 'R'    }, /* 0x15 */ \\\n    {'s'   , 'S'    }, /* 0x16 */ \\\n    {'t'   , 'T'    }, /* 0x17 */ \\\n    {'u'   , 'U'    }, /* 0x18 */ \\\n    {'v'   , 'V'    }, /* 0x19 */ \\\n    {'w'   , 'W'    }, /* 0x1a */ \\\n    {'x'   , 'X'    }, /* 0x1b */ \\\n    {'y'   , 'Y'    }, /* 0x1c */ \\\n    {'z'   , 'Z'    }, /* 0x1d */ \\\n    {'1'   , '!'    }, /* 0x1e */ \\\n    {'2'   , '@'    }, /* 0x1f */ \\\n    {'3'   , '#'    }, /* 0x20 */ \\\n    {'4'   , '$'    }, /* 0x21 */ \\\n    {'5'   , '%'    }, /* 0x22 */ \\\n    {'6'   , '^'    }, /* 0x23 */ \\\n    {'7'   , '&'    }, /* 0x24 */ \\\n    {'8'   , '*'    }, /* 0x25 */ \\\n    {'9'   , '('    }, /* 0x26 */ \\\n    {'0'   , ')'    }, /* 0x27 */ \\\n    {'\\r'  , '\\r'   }, /* 0x28 */ \\\n    {'\\x1b', '\\x1b' }, /* 0x29 */ \\\n    {'\\b'  , '\\b'   }, /* 0x2a */ \\\n    {'\\t'  , '\\t'   }, /* 0x2b */ \\\n    {' '   , ' '    }, /* 0x2c */ \\\n    {'-'   , '_'    }, /* 0x2d */ \\\n    {'='   , '+'    }, /* 0x2e */ \\\n    {'['   , '{'    }, /* 0x2f */ \\\n    {']'   , '}'    }, /* 0x30 */ \\\n    {'\\\\'  , '|'    }, /* 0x31 */ \\\n    {'#'   , '~'    }, /* 0x32 */ \\\n    {';'   , ':'    }, /* 0x33 */ \\\n    {'\\''  , '\\\"'   }, /* 0x34 */ \\\n    {'`'   , '~'    }, /* 0x35 */ \\\n    {','   , '<'    }, /* 0x36 */ \\\n    {'.'   , '>'    }, /* 0x37 */ \\\n    {'/'   , '?'    }, /* 0x38 */ \\\n                                  \\\n    {0     , 0      }, /* 0x39 */ \\\n    {0     , 0      }, /* 0x3a */ \\\n    {0     , 0      }, /* 0x3b */ \\\n    {0     , 0      }, /* 0x3c */ \\\n    {0     , 0      }, /* 0x3d */ \\\n    {0     , 0      }, /* 0x3e */ \\\n    {0     , 0      }, /* 0x3f */ \\\n    {0     , 0      }, /* 0x40 */ \\\n    {0     , 0      }, /* 0x41 */ \\\n    {0     , 0      }, /* 0x42 */ \\\n    {0     , 0      }, /* 0x43 */ \\\n    {0     , 0      }, /* 0x44 */ \\\n    {0     , 0      }, /* 0x45 */ \\\n    {0     , 0      }, /* 0x46 */ \\\n    {0     , 0      }, /* 0x47 */ \\\n    {0     , 0      }, /* 0x48 */ \\\n    {0     , 0      }, /* 0x49 */ \\\n    {0     , 0      }, /* 0x4a */ \\\n    {0     , 0      }, /* 0x4b */ \\\n    {0     , 0      }, /* 0x4c */ \\\n    {0     , 0      }, /* 0x4d */ \\\n    {0     , 0      }, /* 0x4e */ \\\n    {0     , 0      }, /* 0x4f */ \\\n    {0     , 0      }, /* 0x50 */ \\\n    {0     , 0      }, /* 0x51 */ \\\n    {0     , 0      }, /* 0x52 */ \\\n    {0     , 0      }, /* 0x53 */ \\\n                                  \\\n    {'/'   , '/'    }, /* 0x54 */ \\\n    {'*'   , '*'    }, /* 0x55 */ \\\n    {'-'   , '-'    }, /* 0x56 */ \\\n    {'+'   , '+'    }, /* 0x57 */ \\\n    {'\\r'  , '\\r'   }, /* 0x58 */ \\\n    {'1'   , 0      }, /* 0x59 */ \\\n    {'2'   , 0      }, /* 0x5a */ \\\n    {'3'   , 0      }, /* 0x5b */ \\\n    {'4'   , 0      }, /* 0x5c */ \\\n    {'5'   , '5'    }, /* 0x5d */ \\\n    {'6'   , 0      }, /* 0x5e */ \\\n    {'7'   , 0      }, /* 0x5f */ \\\n    {'8'   , 0      }, /* 0x60 */ \\\n    {'9'   , 0      }, /* 0x61 */ \\\n    {'0'   , 0      }, /* 0x62 */ \\\n    {'.'   , 0      }, /* 0x63 */ \\\n    {0     , 0      }, /* 0x64 */ \\\n    {0     , 0      }, /* 0x65 */ \\\n    {0     , 0      }, /* 0x66 */ \\\n    {'='   , '='    }, /* 0x67 */ \\\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_HID_H__ */\n\n/// @}\n"
  },
  {
    "path": "src/class/hid/hid_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_HID)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"hid_device.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t itf_num;\n  uint8_t ep_in;\n  uint8_t ep_out;       // optional Out endpoint\n  uint8_t itf_protocol; // Boot mouse or keyboard\n\n  uint16_t report_desc_len;\n  uint8_t protocol_mode; // Boot (0) or Report protocol (1)\n  uint8_t idle_rate;     // up to application to handle idle rate\n\n  // TODO save hid descriptor since host can specifically request this after enumeration\n  // Note: HID descriptor may be not available from application after enumeration\n  const tusb_hid_descriptor_hid_t*hid_descriptor;\n} hidd_interface_t;\n\ntypedef struct {\n  TUD_EPBUF_DEF(ctrl , CFG_TUD_HID_EP_BUFSIZE);\n  TUD_EPBUF_DEF(epin , CFG_TUD_HID_EP_BUFSIZE);\n  TUD_EPBUF_DEF(epout, CFG_TUD_HID_EP_BUFSIZE);\n} hidd_epbuf_t;\n\nstatic hidd_interface_t _hidd_itf[CFG_TUD_HID];\nCFG_TUD_MEM_SECTION static hidd_epbuf_t _hidd_epbuf[CFG_TUD_HID];\n\n/*------------- Helpers -------------*/\nTU_ATTR_ALWAYS_INLINE static inline uint8_t get_index_by_itfnum(uint8_t itf_num) {\n  for (uint8_t i = 0; i < CFG_TUD_HID; i++) {\n    if (itf_num == _hidd_itf[i].itf_num) {\n      return i;\n    }\n  }\n  return 0xFF;\n}\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_hid_set_protocol_cb(uint8_t instance, uint8_t protocol) {\n  (void) instance;\n  (void) protocol;\n}\n\nTU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t instance, uint8_t idle_rate) {\n  (void) instance;\n  (void) idle_rate;\n  return true;\n}\n\nTU_ATTR_WEAK void tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_t len) {\n  (void) instance;\n  (void) report;\n  (void) len;\n}\n\n// Invoked when a transfer wasn't successful\nTU_ATTR_WEAK void tud_hid_report_failed_cb(uint8_t instance, hid_report_type_t report_type, uint8_t const* report, uint16_t xferred_bytes) {\n  (void) instance;\n  (void) report_type;\n  (void) report;\n  (void) xferred_bytes;\n}\n\n//--------------------------------------------------------------------+\n// APPLICATION API\n//--------------------------------------------------------------------+\nbool tud_hid_n_ready(uint8_t instance) {\n  uint8_t const rhport = 0;\n  uint8_t const ep_in = _hidd_itf[instance].ep_in;\n  return tud_ready() && (ep_in != 0) && !usbd_edpt_busy(rhport, ep_in);\n}\n\nbool tud_hid_n_report(uint8_t instance, uint8_t report_id, void const *report, uint16_t len) {\n  TU_VERIFY(instance < CFG_TUD_HID);\n  const uint8_t rhport = 0;\n  hidd_interface_t *p_hid = &_hidd_itf[instance];\n  hidd_epbuf_t *p_epbuf = &_hidd_epbuf[instance];\n\n  // claim endpoint\n  TU_VERIFY(usbd_edpt_claim(rhport, p_hid->ep_in));\n\n  // prepare data\n  if (report_id) {\n    p_epbuf->epin[0] = report_id;\n    TU_VERIFY(0 == tu_memcpy_s(p_epbuf->epin + 1, CFG_TUD_HID_EP_BUFSIZE - 1, report, len));\n    len++;\n  } else {\n    TU_VERIFY(0 == tu_memcpy_s(p_epbuf->epin, CFG_TUD_HID_EP_BUFSIZE, report, len));\n  }\n\n  return usbd_edpt_xfer(rhport, p_hid->ep_in, p_epbuf->epin, len, false);\n}\n\nuint8_t tud_hid_n_interface_protocol(uint8_t instance) {\n  return _hidd_itf[instance].itf_protocol;\n}\n\nuint8_t tud_hid_n_get_protocol(uint8_t instance) {\n  return _hidd_itf[instance].protocol_mode;\n}\n\nbool tud_hid_n_keyboard_report(uint8_t instance, uint8_t report_id, uint8_t modifier, const uint8_t keycode[6]) {\n  hid_keyboard_report_t report;\n  report.modifier = modifier;\n  report.reserved = 0;\n\n  if (keycode) {\n    memcpy(report.keycode, keycode, sizeof(report.keycode));\n  } else {\n    tu_memclr(report.keycode, 6);\n  }\n\n  return tud_hid_n_report(instance, report_id, &report, sizeof(report));\n}\n\nbool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id,\n                            uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal) {\n  hid_mouse_report_t report = {\n    .buttons = buttons,\n    .x = x,\n    .y = y,\n    .wheel = vertical,\n    .pan = horizontal\n  };\n\n  return tud_hid_n_report(instance, report_id, &report, sizeof(report));\n}\n\nbool tud_hid_n_abs_mouse_report(uint8_t instance, uint8_t report_id,\n                                uint8_t buttons, int16_t x, int16_t y, int8_t vertical, int8_t horizontal) {\n  hid_abs_mouse_report_t report = {\n    .buttons = buttons,\n    .x = x,\n    .y = y,\n    .wheel = vertical,\n    .pan = horizontal\n  };\n  return tud_hid_n_report(instance, report_id, &report, sizeof(report));\n}\n\nbool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id,\n                              int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons) {\n  hid_gamepad_report_t report = {\n      .x = x,\n      .y = y,\n      .z = z,\n      .rz = rz,\n      .rx = rx,\n      .ry = ry,\n      .hat = hat,\n      .buttons = buttons,\n  };\n\n  return tud_hid_n_report(instance, report_id, &report, sizeof(report));\n}\n\nbool tud_hid_n_stylus_report(uint8_t instance, uint8_t report_id, uint8_t attrs, uint16_t x, uint16_t y) {\n  hid_stylus_report_t report = {\n    .attr = attrs,\n    .x = x,\n    .y = y,\n  };\n\n  return tud_hid_n_report(instance, report_id, &report, sizeof(report));\n}\n\n//--------------------------------------------------------------------+\n// USBD-CLASS API\n//--------------------------------------------------------------------+\nvoid hidd_init(void) {\n  hidd_reset(0);\n}\n\nbool hidd_deinit(void) {\n  return true;\n}\n\nvoid hidd_reset(uint8_t rhport) {\n  (void)rhport;\n  tu_memclr(_hidd_itf, sizeof(_hidd_itf));\n}\n\nuint16_t hidd_open(uint8_t rhport, tusb_desc_interface_t const *desc_itf, uint16_t max_len) {\n  TU_VERIFY(TUSB_CLASS_HID == desc_itf->bInterfaceClass, 0);\n\n  // len = interface + hid + n*endpoints\n  uint16_t const drv_len = (uint16_t) (sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) +\n                                       desc_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t));\n  TU_ASSERT(max_len >= drv_len, 0);\n\n  // Find available interface\n  hidd_interface_t *p_hid;\n  uint8_t hid_id;\n  for (hid_id = 0; hid_id < CFG_TUD_HID; hid_id++) {\n    p_hid = &_hidd_itf[hid_id];\n    if (p_hid->ep_in == 0) {\n      break;\n    }\n  }\n  TU_ASSERT(hid_id < CFG_TUD_HID, 0);\n  hidd_epbuf_t *p_epbuf = &_hidd_epbuf[hid_id];\n\n  uint8_t const *p_desc = (uint8_t const *)desc_itf;\n\n  //------------- HID descriptor -------------//\n  p_desc = tu_desc_next(p_desc);\n  TU_ASSERT(HID_DESC_TYPE_HID == tu_desc_type(p_desc), 0);\n  p_hid->hid_descriptor = (tusb_hid_descriptor_hid_t const *)p_desc;\n\n  //------------- Endpoint Descriptor -------------//\n  p_desc = tu_desc_next(p_desc);\n  TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, desc_itf->bNumEndpoints, TUSB_XFER_INTERRUPT, &p_hid->ep_out, &p_hid->ep_in), 0);\n\n  if (desc_itf->bInterfaceSubClass == HID_SUBCLASS_BOOT) {\n    p_hid->itf_protocol = desc_itf->bInterfaceProtocol;\n  }\n\n  p_hid->protocol_mode = HID_PROTOCOL_REPORT; // Per Specs: default is report mode\n  p_hid->itf_num = desc_itf->bInterfaceNumber;\n\n  // Use offsetof to avoid pointer to the odd/misaligned address\n  p_hid->report_desc_len = tu_unaligned_read16((uint8_t const *)p_hid->hid_descriptor + offsetof(tusb_hid_descriptor_hid_t, wReportLength));\n\n  // Prepare for output endpoint\n  if (p_hid->ep_out) {\n    TU_ASSERT(usbd_edpt_xfer(rhport, p_hid->ep_out, p_epbuf->epout, CFG_TUD_HID_EP_BUFSIZE, false), drv_len);\n  }\n\n  return drv_len;\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool hidd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request) {\n  TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);\n\n  uint8_t const hid_itf = get_index_by_itfnum((uint8_t)request->wIndex);\n  TU_VERIFY(hid_itf < CFG_TUD_HID);\n  hidd_interface_t *p_hid = &_hidd_itf[hid_itf];\n  hidd_epbuf_t *p_epbuf = &_hidd_epbuf[hid_itf];\n\n  if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) {\n    //------------- STD Request -------------//\n    if (stage == CONTROL_STAGE_SETUP) {\n      uint8_t const desc_type = tu_u16_high(request->wValue);\n      // uint8_t const desc_index = tu_u16_low (request->wValue);\n\n      if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID) {\n        TU_VERIFY(p_hid->hid_descriptor);\n        TU_VERIFY(tud_control_xfer(rhport, request, (void *)(uintptr_t)p_hid->hid_descriptor, p_hid->hid_descriptor->bLength));\n      } else if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT) {\n        uint8_t const *desc_report = tud_hid_descriptor_report_cb(hid_itf);\n        tud_control_xfer(rhport, request, (void *)(uintptr_t)desc_report, p_hid->report_desc_len);\n      } else {\n        return false; // stall unsupported request\n      }\n    }\n  } else if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS) {\n    //------------- Class Specific Request -------------//\n    switch (request->bRequest) {\n      case HID_REQ_CONTROL_GET_REPORT:\n        if (stage == CONTROL_STAGE_SETUP) {\n          uint8_t const report_type = tu_u16_high(request->wValue);\n          uint8_t const report_id = tu_u16_low(request->wValue);\n\n          uint8_t* report_buf = p_epbuf->ctrl;\n          uint16_t req_len = tu_min16(request->wLength, CFG_TUD_HID_EP_BUFSIZE);\n          uint16_t xferlen = 0;\n\n          // If host request a specific Report ID, add ID to as 1 byte of response\n          if ((report_id != HID_REPORT_TYPE_INVALID) && (req_len > 1)) {\n            *report_buf++ = report_id;\n            req_len--;\n            xferlen++;\n          }\n\n          xferlen += tud_hid_get_report_cb(hid_itf, report_id, (hid_report_type_t) report_type, report_buf, req_len);\n          TU_ASSERT(xferlen > 0);\n\n          tud_control_xfer(rhport, request, p_epbuf->ctrl, xferlen);\n        }\n        break;\n\n      case HID_REQ_CONTROL_SET_REPORT:\n        if (stage == CONTROL_STAGE_SETUP) {\n          TU_VERIFY(request->wLength <= CFG_TUD_HID_EP_BUFSIZE);\n          tud_control_xfer(rhport, request, p_epbuf->ctrl, request->wLength);\n        } else if (stage == CONTROL_STAGE_ACK) {\n          uint8_t const report_type = tu_u16_high(request->wValue);\n          uint8_t const report_id = tu_u16_low(request->wValue);\n\n          uint8_t const* report_buf = p_epbuf->ctrl;\n          uint16_t report_len = tu_min16(request->wLength, CFG_TUD_HID_EP_BUFSIZE);\n\n          // If host request a specific Report ID, extract report ID in buffer before invoking callback\n          if ((report_id != HID_REPORT_TYPE_INVALID) && (report_len > 1) && (report_id == report_buf[0])) {\n            report_buf++;\n            report_len--;\n          }\n\n          tud_hid_set_report_cb(hid_itf, report_id, (hid_report_type_t) report_type, report_buf, report_len);\n        }\n        break;\n\n      case HID_REQ_CONTROL_SET_IDLE:\n        if (stage == CONTROL_STAGE_SETUP) {\n          p_hid->idle_rate = tu_u16_high(request->wValue);\n          TU_VERIFY(tud_hid_set_idle_cb(hid_itf, p_hid->idle_rate)); // stall if false\n          tud_control_status(rhport, request);\n        }\n        break;\n\n      case HID_REQ_CONTROL_GET_IDLE:\n        if (stage == CONTROL_STAGE_SETUP) {\n          // TODO idle rate of report\n          tud_control_xfer(rhport, request, &p_hid->idle_rate, 1);\n        }\n        break;\n\n      case HID_REQ_CONTROL_GET_PROTOCOL:\n        if (stage == CONTROL_STAGE_SETUP) {\n          tud_control_xfer(rhport, request, &p_hid->protocol_mode, 1);\n        }\n        break;\n\n      case HID_REQ_CONTROL_SET_PROTOCOL:\n        if (stage == CONTROL_STAGE_SETUP) {\n          tud_control_status(rhport, request);\n        } else if (stage == CONTROL_STAGE_ACK) {\n          p_hid->protocol_mode = (uint8_t) request->wValue;\n          tud_hid_set_protocol_cb(hid_itf, p_hid->protocol_mode);\n        }\n        break;\n\n      default:\n        return false; // stall unsupported request\n    }\n  } else {\n    return false; // stall unsupported request\n  }\n\n  return true;\n}\n\nbool hidd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  uint8_t instance;\n  hidd_interface_t *p_hid;\n\n  // Identify which interface to use\n  for (instance = 0; instance < CFG_TUD_HID; instance++) {\n    p_hid = &_hidd_itf[instance];\n    if ((ep_addr == p_hid->ep_out) || (ep_addr == p_hid->ep_in)) {\n      break;\n    }\n  }\n  TU_ASSERT(instance < CFG_TUD_HID);\n  hidd_epbuf_t *p_epbuf = &_hidd_epbuf[instance];\n\n  if (ep_addr == p_hid->ep_in) {\n    // Input report\n    if (XFER_RESULT_SUCCESS == result) {\n      tud_hid_report_complete_cb(instance, p_epbuf->epin, (uint16_t) xferred_bytes);\n    } else {\n      tud_hid_report_failed_cb(instance, HID_REPORT_TYPE_INPUT, p_epbuf->epin, (uint16_t) xferred_bytes);\n    }\n  } else {\n    // Output report\n    if (XFER_RESULT_SUCCESS == result) {\n      tud_hid_set_report_cb(instance, 0, HID_REPORT_TYPE_OUTPUT, p_epbuf->epout, (uint16_t)xferred_bytes);\n    } else {\n      tud_hid_report_failed_cb(instance, HID_REPORT_TYPE_OUTPUT, p_epbuf->epout, (uint16_t) xferred_bytes);\n    }\n\n    // prepare for new transfer\n    TU_ASSERT(usbd_edpt_xfer(rhport, p_hid->ep_out, p_epbuf->epout, CFG_TUD_HID_EP_BUFSIZE, false));\n  }\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/hid/hid_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_HID_DEVICE_H_\n#define TUSB_HID_DEVICE_H_\n\n#include \"hid.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Class Driver Default Configure & Validation\n//--------------------------------------------------------------------+\n\n#if !defined(CFG_TUD_HID_EP_BUFSIZE) & defined(CFG_TUD_HID_BUFSIZE)\n  // TODO warn user to use new name later on\n  // #warning CFG_TUD_HID_BUFSIZE is renamed to CFG_TUD_HID_EP_BUFSIZE, please update to use the new name\n  #define CFG_TUD_HID_EP_BUFSIZE  CFG_TUD_HID_BUFSIZE\n#endif\n\n#ifndef CFG_TUD_HID_EP_BUFSIZE\n  #define CFG_TUD_HID_EP_BUFSIZE     64\n#endif\n\n//--------------------------------------------------------------------+\n// Application API (Multiple Instances) i.e. CFG_TUD_HID > 1\n//--------------------------------------------------------------------+\n\n// Check if the interface is ready to use\nbool tud_hid_n_ready(uint8_t instance);\n\n// Get interface supported protocol (bInterfaceProtocol) check out hid_interface_protocol_enum_t for possible values\nuint8_t tud_hid_n_interface_protocol(uint8_t instance);\n\n// Get current active protocol: HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)\nuint8_t tud_hid_n_get_protocol(uint8_t instance);\n\n// Send report to host\nbool tud_hid_n_report(uint8_t instance, uint8_t report_id, void const* report, uint16_t len);\n\n// KEYBOARD: convenient helper to send keyboard report if application\n// use template layout report as defined by hid_keyboard_report_t\nbool tud_hid_n_keyboard_report(uint8_t instance, uint8_t report_id, uint8_t modifier, const uint8_t keycode[6]);\n\n// MOUSE: convenient helper to send mouse report if application\n// use template layout report as defined by hid_mouse_report_t\nbool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal);\n\n// ABSOLUTE MOUSE: convenient helper to send absolute mouse report if application\n// use template layout report as defined by hid_abs_mouse_report_t\nbool tud_hid_n_abs_mouse_report(uint8_t instance, uint8_t report_id, uint8_t buttons, int16_t x, int16_t y, int8_t vertical, int8_t horizontal);\n\n// Gamepad: convenient helper to send gamepad report if application\n// use template layout report TUD_HID_REPORT_DESC_GAMEPAD\nbool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons);\n\n// STYLUS PEN: convenient helper to send absolute stylus pen report if application\nbool tud_hid_n_stylus_report(uint8_t instance, uint8_t report_id, uint8_t attrs, uint16_t x, uint16_t y);\n\n//--------------------------------------------------------------------+\n// Application API (Single Port)\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline bool tud_hid_ready(void) {\n  return tud_hid_n_ready(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tud_hid_interface_protocol(void) {\n  return tud_hid_n_interface_protocol(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tud_hid_get_protocol(void) {\n  return tud_hid_n_get_protocol(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_hid_report(uint8_t report_id, void const* report, uint16_t len) {\n  return tud_hid_n_report(0, report_id, report, len);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_hid_keyboard_report(uint8_t report_id, uint8_t modifier, const uint8_t keycode[6]) {\n  return tud_hid_n_keyboard_report(0, report_id, modifier, keycode);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal) {\n  return tud_hid_n_mouse_report(0, report_id, buttons, x, y, vertical, horizontal);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_hid_abs_mouse_report(uint8_t report_id, uint8_t buttons, int16_t x, int16_t y, int8_t vertical, int8_t horizontal) {\n  return tud_hid_n_abs_mouse_report(0, report_id, buttons, x, y, vertical, horizontal);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons) {\n  return tud_hid_n_gamepad_report(0, report_id, x, y, z, rz, rx, ry, hat, buttons);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_hid_stylus_report(uint8_t report_id, uint8_t attrs, uint16_t x, uint16_t y) {\n  return tud_hid_n_stylus_report(0, report_id, attrs, x, y);\n}\n\n//--------------------------------------------------------------------+\n// Application Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when received GET HID REPORT DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint8_t const * tud_hid_descriptor_report_cb(uint8_t instance);\n\n// Invoked when received GET_REPORT control request\n// Application must fill buffer report's content and return its length.\n// Return zero will cause the stack to STALL request\nuint16_t tud_hid_get_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t* buffer, uint16_t reqlen);\n\n// Invoked when received SET_REPORT control request or\n// received data on OUT endpoint (Report ID = 0, Type = OUTPUT)\nvoid tud_hid_set_report_cb(uint8_t instance, uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize);\n\n// Invoked when received SET_PROTOCOL request\n// protocol is either HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)\nvoid tud_hid_set_protocol_cb(uint8_t instance, uint8_t protocol);\n\n// Invoked when received SET_IDLE request. return false will stall the request\n// - Idle Rate = 0 : only send report if there is changes, i.e. skip duplication\n// - Idle Rate > 0 : skip duplication, but send at least 1 report every idle rate (in unit of 4 ms).\nbool tud_hid_set_idle_cb(uint8_t instance, uint8_t idle_rate);\n\n// Invoked when sent REPORT successfully to host\n// Application can use this to send the next report\n// Note: For composite reports, report[0] is report ID\nvoid tud_hid_report_complete_cb(uint8_t instance, uint8_t const* report, uint16_t len);\n\n// Invoked when a transfer wasn't successful\nvoid tud_hid_report_failed_cb(uint8_t instance, hid_report_type_t report_type, uint8_t const* report, uint16_t xferred_bytes);\n\n/* --------------------------------------------------------------------+\n * HID Report Descriptor Template\n *\n * Convenient for declaring popular HID device (keyboard, mouse, consumer,\n * gamepad etc...). Templates take \"HID_REPORT_ID(n)\" as input, leave\n * empty if multiple reports is not used\n *\n * - Only 1 report: no parameter\n *      uint8_t const report_desc[] = { TUD_HID_REPORT_DESC_KEYBOARD() };\n *\n * - Multiple Reports: \"HID_REPORT_ID(ID)\" must be passed to template\n *      uint8_t const report_desc[] =\n *      {\n *          TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(1) ) ,\n *          TUD_HID_REPORT_DESC_MOUSE   ( HID_REPORT_ID(2) )\n *      };\n *--------------------------------------------------------------------*/\n\n// Keyboard Report Descriptor Template\n#define TUD_HID_REPORT_DESC_KEYBOARD(...) \\\n  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     )                    ,\\\n  HID_USAGE      ( HID_USAGE_DESKTOP_KEYBOARD )                    ,\\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION )                    ,\\\n    /* Report ID if any */\\\n    __VA_ARGS__ \\\n    /* 8 bits Modifier Keys (Shift, Control, Alt) */ \\\n    HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD )                     ,\\\n      HID_USAGE_MIN    ( 224                                    )  ,\\\n      HID_USAGE_MAX    ( 231                                    )  ,\\\n      HID_LOGICAL_MIN  ( 0                                      )  ,\\\n      HID_LOGICAL_MAX  ( 1                                      )  ,\\\n      HID_REPORT_COUNT ( 8                                      )  ,\\\n      HID_REPORT_SIZE  ( 1                                      )  ,\\\n      HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE )  ,\\\n      /* 8 bit reserved */ \\\n      HID_REPORT_COUNT ( 1                                      )  ,\\\n      HID_REPORT_SIZE  ( 8                                      )  ,\\\n      HID_INPUT        ( HID_CONSTANT                           )  ,\\\n    /* Output 5-bit LED Indicator Kana | Compose | ScrollLock | CapsLock | NumLock */ \\\n    HID_USAGE_PAGE  ( HID_USAGE_PAGE_LED                   )       ,\\\n      HID_USAGE_MIN    ( 1                                       ) ,\\\n      HID_USAGE_MAX    ( 5                                       ) ,\\\n      HID_REPORT_COUNT ( 5                                       ) ,\\\n      HID_REPORT_SIZE  ( 1                                       ) ,\\\n      HID_OUTPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE  ) ,\\\n      /* led padding */ \\\n      HID_REPORT_COUNT ( 1                                       ) ,\\\n      HID_REPORT_SIZE  ( 3                                       ) ,\\\n      HID_OUTPUT       ( HID_CONSTANT                            ) ,\\\n    /* 6-byte Keycodes */ \\\n    HID_USAGE_PAGE ( HID_USAGE_PAGE_KEYBOARD )                     ,\\\n      HID_USAGE_MIN    ( 0                                   )     ,\\\n      HID_USAGE_MAX_N  ( 255, 2                              )     ,\\\n      HID_LOGICAL_MIN  ( 0                                   )     ,\\\n      HID_LOGICAL_MAX_N( 255, 2                              )     ,\\\n      HID_REPORT_COUNT ( 6                                   )     ,\\\n      HID_REPORT_SIZE  ( 8                                   )     ,\\\n      HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE )     ,\\\n  HID_COLLECTION_END \\\n\n// Mouse Report Descriptor Template\n#define TUD_HID_REPORT_DESC_MOUSE(...) \\\n  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP      )                   ,\\\n  HID_USAGE      ( HID_USAGE_DESKTOP_MOUSE     )                   ,\\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION  )                   ,\\\n    /* Report ID if any */\\\n    __VA_ARGS__ \\\n    HID_USAGE      ( HID_USAGE_DESKTOP_POINTER )                   ,\\\n    HID_COLLECTION ( HID_COLLECTION_PHYSICAL   )                   ,\\\n      HID_USAGE_PAGE  ( HID_USAGE_PAGE_BUTTON  )                   ,\\\n        HID_USAGE_MIN   ( 1                                      ) ,\\\n        HID_USAGE_MAX   ( 5                                      ) ,\\\n        HID_LOGICAL_MIN ( 0                                      ) ,\\\n        HID_LOGICAL_MAX ( 1                                      ) ,\\\n        /* Left, Right, Middle, Backward, Forward buttons */ \\\n        HID_REPORT_COUNT( 5                                      ) ,\\\n        HID_REPORT_SIZE ( 1                                      ) ,\\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\\\n        /* 3 bit padding */ \\\n        HID_REPORT_COUNT( 1                                      ) ,\\\n        HID_REPORT_SIZE ( 3                                      ) ,\\\n        HID_INPUT       ( HID_CONSTANT                           ) ,\\\n      HID_USAGE_PAGE  ( HID_USAGE_PAGE_DESKTOP )                   ,\\\n        /* X, Y position [-127, 127] */ \\\n        HID_USAGE       ( HID_USAGE_DESKTOP_X                    ) ,\\\n        HID_USAGE       ( HID_USAGE_DESKTOP_Y                    ) ,\\\n        HID_LOGICAL_MIN ( 0x81                                   ) ,\\\n        HID_LOGICAL_MAX ( 0x7f                                   ) ,\\\n        HID_REPORT_COUNT( 2                                      ) ,\\\n        HID_REPORT_SIZE ( 8                                      ) ,\\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE ) ,\\\n        /* Verital wheel scroll [-127, 127] */ \\\n        HID_USAGE       ( HID_USAGE_DESKTOP_WHEEL                )  ,\\\n        HID_LOGICAL_MIN ( 0x81                                   )  ,\\\n        HID_LOGICAL_MAX ( 0x7f                                   )  ,\\\n        HID_REPORT_COUNT( 1                                      )  ,\\\n        HID_REPORT_SIZE ( 8                                      )  ,\\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE )  ,\\\n      HID_USAGE_PAGE  ( HID_USAGE_PAGE_CONSUMER ), \\\n       /* Horizontal wheel scroll [-127, 127] */ \\\n        HID_USAGE_N     ( HID_USAGE_CONSUMER_AC_PAN, 2           ), \\\n        HID_LOGICAL_MIN ( 0x81                                   ), \\\n        HID_LOGICAL_MAX ( 0x7f                                   ), \\\n        HID_REPORT_COUNT( 1                                      ), \\\n        HID_REPORT_SIZE ( 8                                      ), \\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), \\\n    HID_COLLECTION_END                                            , \\\n  HID_COLLECTION_END \\\n\n// Stylus Pen Report Descriptor Template\n#define TUD_HID_REPORT_DESC_STYLUS_PEN(...) \\\n  HID_USAGE_PAGE ( HID_USAGE_PAGE_DIGITIZER )                     , \\\n  HID_USAGE      ( HID_USAGE_DIGITIZER_PEN )                      , \\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION  )                  , \\\n    /* Report ID if any */\\\n    __VA_ARGS__ \\\n    HID_USAGE    ( HID_USAGE_DIGITIZER_STYLUS                    ), \\\n    HID_COLLECTION ( HID_COLLECTION_PHYSICAL                     ), \\\n        HID_USAGE  ( HID_USAGE_DIGITIZER_TIP_SWITCH              ), \\\n        HID_USAGE  ( HID_USAGE_DIGITIZER_IN_RANGE                ), \\\n        HID_LOGICAL_MIN ( 0                                      ), \\\n        HID_LOGICAL_MAX ( 1                                      ), \\\n        HID_REPORT_SIZE ( 1                                      ), \\\n        HID_REPORT_COUNT( 2                                      ), \\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), \\\n        HID_REPORT_SIZE ( 1                                      ), \\\n        HID_REPORT_COUNT( 6                                      ), \\\n        HID_INPUT       ( HID_CONSTANT | HID_ARRAY | HID_ABSOLUTE), \\\n      HID_USAGE_PAGE    ( HID_USAGE_PAGE_DESKTOP                 ), \\\n        HID_PHYSICAL_MAX_N( 0x7fff, 2                            ), \\\n        HID_LOGICAL_MAX_N ( 0x7fff, 2                            ), \\\n        HID_REPORT_SIZE ( 16                                     ), \\\n        HID_REPORT_COUNT( 1                                      ), \\\n        HID_UNIT_EXPONENT( 0x0f                                  ), \\\n        HID_UNIT        ( HID_VARIABLE | HID_NONLINEAR           ), \\\n        HID_PHYSICAL_MIN( 0                                      ), \\\n        HID_PHYSICAL_MAX( 0                                      ), \\\n        HID_USAGE       ( HID_USAGE_DESKTOP_X                    ), \\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), \\\n        HID_USAGE       ( HID_USAGE_DESKTOP_Y                    ), \\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ), \\\n    HID_COLLECTION_END                                          , \\\n  HID_COLLECTION_END \\\n\n// Absolute Mouse Report Descriptor Template\n#define TUD_HID_REPORT_DESC_ABSMOUSE(...) \\\n  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP      )                   ,\\\n  HID_USAGE      ( HID_USAGE_DESKTOP_MOUSE     )                   ,\\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION  )                   ,\\\n    /* Report ID if any */\\\n    __VA_ARGS__ \\\n    HID_USAGE      ( HID_USAGE_DESKTOP_POINTER )                   ,\\\n    HID_COLLECTION ( HID_COLLECTION_PHYSICAL   )                   ,\\\n      HID_USAGE_PAGE  ( HID_USAGE_PAGE_BUTTON  )                   ,\\\n        HID_USAGE_MIN   ( 1                                      ) ,\\\n        HID_USAGE_MAX   ( 5                                      ) ,\\\n        HID_LOGICAL_MIN ( 0                                      ) ,\\\n        HID_LOGICAL_MAX ( 1                                      ) ,\\\n        /* Left, Right, Middle, Backward, Forward buttons */ \\\n        HID_REPORT_COUNT( 5                                      ) ,\\\n        HID_REPORT_SIZE ( 1                                      ) ,\\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\\\n        /* 3 bit padding */ \\\n        HID_REPORT_COUNT( 1                                      ) ,\\\n        HID_REPORT_SIZE ( 3                                      ) ,\\\n        HID_INPUT       ( HID_CONSTANT                           ) ,\\\n      HID_USAGE_PAGE  ( HID_USAGE_PAGE_DESKTOP )                   ,\\\n        /* X, Y absolute position [0, 32767] */ \\\n        HID_USAGE       ( HID_USAGE_DESKTOP_X                    ) ,\\\n        HID_USAGE       ( HID_USAGE_DESKTOP_Y                    ) ,\\\n        HID_LOGICAL_MIN  ( 0x00                                ) ,\\\n        HID_LOGICAL_MAX_N( 0x7FFF, 2                           ) ,\\\n        HID_REPORT_SIZE  ( 16                                  ) ,\\\n        HID_REPORT_COUNT ( 2                                   ) ,\\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\\\n        /* Vertical wheel scroll [-127, 127] */ \\\n        HID_USAGE       ( HID_USAGE_DESKTOP_WHEEL                )  ,\\\n        HID_LOGICAL_MIN ( 0x81                                   )  ,\\\n        HID_LOGICAL_MAX ( 0x7f                                   )  ,\\\n        HID_REPORT_COUNT( 1                                      )  ,\\\n        HID_REPORT_SIZE ( 8                                      )  ,\\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE )  ,\\\n      HID_USAGE_PAGE  ( HID_USAGE_PAGE_CONSUMER ), \\\n       /* Horizontal wheel scroll [-127, 127] */ \\\n        HID_USAGE_N     ( HID_USAGE_CONSUMER_AC_PAN, 2           ), \\\n        HID_LOGICAL_MIN ( 0x81                                   ), \\\n        HID_LOGICAL_MAX ( 0x7f                                   ), \\\n        HID_REPORT_COUNT( 1                                      ), \\\n        HID_REPORT_SIZE ( 8                                      ), \\\n        HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_RELATIVE ), \\\n    HID_COLLECTION_END                                            , \\\n  HID_COLLECTION_END \\\n\n// Consumer Control Report Descriptor Template\n#define TUD_HID_REPORT_DESC_CONSUMER(...) \\\n  HID_USAGE_PAGE ( HID_USAGE_PAGE_CONSUMER    )              ,\\\n  HID_USAGE      ( HID_USAGE_CONSUMER_CONTROL )              ,\\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION )              ,\\\n    /* Report ID if any */\\\n    __VA_ARGS__ \\\n    HID_LOGICAL_MIN  ( 0x00                                ) ,\\\n    HID_LOGICAL_MAX_N( 0x03FF, 2                           ) ,\\\n    HID_USAGE_MIN    ( 0x00                                ) ,\\\n    HID_USAGE_MAX_N  ( 0x03FF, 2                           ) ,\\\n    HID_REPORT_COUNT ( 1                                   ) ,\\\n    HID_REPORT_SIZE  ( 16                                  ) ,\\\n    HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ) ,\\\n  HID_COLLECTION_END \\\n\n/* System Control Report Descriptor Template\n * 0x00 - do nothing\n * 0x01 - Power Off\n * 0x02 - Standby\n * 0x03 - Wake Host\n */\n#define TUD_HID_REPORT_DESC_SYSTEM_CONTROL(...) \\\n  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP           )        ,\\\n  HID_USAGE      ( HID_USAGE_DESKTOP_SYSTEM_CONTROL )        ,\\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION       )        ,\\\n    /* Report ID if any */\\\n    __VA_ARGS__ \\\n    /* 2 bit system power control */ \\\n    HID_LOGICAL_MIN  ( 1                                   ) ,\\\n    HID_LOGICAL_MAX  ( 3                                   ) ,\\\n    HID_REPORT_COUNT ( 1                                   ) ,\\\n    HID_REPORT_SIZE  ( 2                                   ) ,\\\n    HID_USAGE        ( HID_USAGE_DESKTOP_SYSTEM_POWER_DOWN ) ,\\\n    HID_USAGE        ( HID_USAGE_DESKTOP_SYSTEM_SLEEP      ) ,\\\n    HID_USAGE        ( HID_USAGE_DESKTOP_SYSTEM_WAKE_UP    ) ,\\\n    HID_INPUT        ( HID_DATA | HID_ARRAY | HID_ABSOLUTE ) ,\\\n    /* 6 bit padding */ \\\n    HID_REPORT_COUNT ( 1                                   ) ,\\\n    HID_REPORT_SIZE  ( 6                                   ) ,\\\n    HID_INPUT        ( HID_CONSTANT                        ) ,\\\n  HID_COLLECTION_END \\\n\n// Gamepad Report Descriptor Template\n// with 32 buttons, 2 joysticks and 1 hat/dpad with following layout\n// | X | Y | Z | Rz | Rx | Ry (1 byte each) | hat/DPAD (1 byte) | Button Map (4 bytes) |\n#define TUD_HID_REPORT_DESC_GAMEPAD(...) \\\n  HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     )                 ,\\\n  HID_USAGE      ( HID_USAGE_DESKTOP_GAMEPAD  )                 ,\\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION )                 ,\\\n    /* Report ID if any */\\\n    __VA_ARGS__ \\\n    /* 8 bit X, Y, Z, Rz, Rx, Ry (min -127, max 127 ) */ \\\n    HID_USAGE_PAGE     ( HID_USAGE_PAGE_DESKTOP                 ) ,\\\n    HID_USAGE          ( HID_USAGE_DESKTOP_X                    ) ,\\\n    HID_USAGE          ( HID_USAGE_DESKTOP_Y                    ) ,\\\n    HID_USAGE          ( HID_USAGE_DESKTOP_Z                    ) ,\\\n    HID_USAGE          ( HID_USAGE_DESKTOP_RZ                   ) ,\\\n    HID_USAGE          ( HID_USAGE_DESKTOP_RX                   ) ,\\\n    HID_USAGE          ( HID_USAGE_DESKTOP_RY                   ) ,\\\n    HID_LOGICAL_MIN    ( 0x81                                   ) ,\\\n    HID_LOGICAL_MAX    ( 0x7f                                   ) ,\\\n    HID_REPORT_COUNT   ( 6                                      ) ,\\\n    HID_REPORT_SIZE    ( 8                                      ) ,\\\n    HID_INPUT          ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\\\n    /* 8 bit DPad/Hat Button Map  */ \\\n    HID_USAGE_PAGE     ( HID_USAGE_PAGE_DESKTOP                 ) ,\\\n    HID_USAGE          ( HID_USAGE_DESKTOP_HAT_SWITCH           ) ,\\\n    HID_LOGICAL_MIN    ( 1                                      ) ,\\\n    HID_LOGICAL_MAX    ( 8                                      ) ,\\\n    HID_PHYSICAL_MIN   ( 0                                      ) ,\\\n    HID_PHYSICAL_MAX_N ( 315, 2                                 ) ,\\\n    HID_REPORT_COUNT   ( 1                                      ) ,\\\n    HID_REPORT_SIZE    ( 8                                      ) ,\\\n    HID_INPUT          ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\\\n    /* 32 bit Button Map */ \\\n    HID_USAGE_PAGE     ( HID_USAGE_PAGE_BUTTON                  ) ,\\\n    HID_USAGE_MIN      ( 1                                      ) ,\\\n    HID_USAGE_MAX      ( 32                                     ) ,\\\n    HID_LOGICAL_MIN    ( 0                                      ) ,\\\n    HID_LOGICAL_MAX    ( 1                                      ) ,\\\n    HID_REPORT_COUNT   ( 32                                     ) ,\\\n    HID_REPORT_SIZE    ( 1                                      ) ,\\\n    HID_INPUT          ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\\\n  HID_COLLECTION_END \\\n\n// FIDO U2F Authenticator Descriptor Template\n// - 1st parameter is report size, which is 64 bytes maximum in U2F\n// - 2nd parameter is HID_REPORT_ID(n) (optional)\n#define TUD_HID_REPORT_DESC_FIDO_U2F(report_size, ...) \\\n  HID_USAGE_PAGE_N ( HID_USAGE_PAGE_FIDO, 2                    ) ,\\\n  HID_USAGE      ( HID_USAGE_FIDO_U2FHID                       ) ,\\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION                  ) ,\\\n    /* Report ID if any */ \\\n    __VA_ARGS__ \\\n    /* Usage Data In */ \\\n    HID_USAGE         ( HID_USAGE_FIDO_DATA_IN                 ) ,\\\n    HID_LOGICAL_MIN   ( 0                                      ) ,\\\n    HID_LOGICAL_MAX_N ( 0xff, 2                                ) ,\\\n    HID_REPORT_SIZE   ( 8                                      ) ,\\\n    HID_REPORT_COUNT  ( report_size                            ) ,\\\n    HID_INPUT         ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\\\n    /* Usage Data Out */ \\\n    HID_USAGE         ( HID_USAGE_FIDO_DATA_OUT                ) ,\\\n    HID_LOGICAL_MIN   ( 0                                      ) ,\\\n    HID_LOGICAL_MAX_N ( 0xff, 2                                ) ,\\\n    HID_REPORT_SIZE   ( 8                                      ) ,\\\n    HID_REPORT_COUNT  ( report_size                            ) ,\\\n    HID_OUTPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\\\n  HID_COLLECTION_END \\\n\n// HID Generic Input & Output\n// - 1st parameter is report size (mandatory)\n// - 2nd parameter is report id HID_REPORT_ID(n) (optional)\n#define TUD_HID_REPORT_DESC_GENERIC_INOUT(report_size, ...) \\\n    HID_USAGE_PAGE_N ( HID_USAGE_PAGE_VENDOR, 2   ),\\\n    HID_USAGE        ( 0x01                       ),\\\n    HID_COLLECTION   ( HID_COLLECTION_APPLICATION ),\\\n      /* Report ID if any */\\\n      __VA_ARGS__ \\\n      /* Input */ \\\n      HID_USAGE       ( 0x02                                   ),\\\n      HID_LOGICAL_MIN ( 0x00                                   ),\\\n      HID_LOGICAL_MAX_N ( 0xff, 2                              ),\\\n      HID_REPORT_SIZE ( 8                                      ),\\\n      HID_REPORT_COUNT( report_size                            ),\\\n      HID_INPUT       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\\\n      /* Output */ \\\n      HID_USAGE       ( 0x03                                    ),\\\n      HID_LOGICAL_MIN ( 0x00                                    ),\\\n      HID_LOGICAL_MAX_N ( 0xff, 2                               ),\\\n      HID_REPORT_SIZE ( 8                                       ),\\\n      HID_REPORT_COUNT( report_size                             ),\\\n      HID_OUTPUT      ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE  ),\\\n    HID_COLLECTION_END \\\n\n// HID Lighting and Illumination Report Descriptor Template\n// - 1st parameter is report id (required)\n//   Creates 6 report ids for lighting HID usages in the following order:\n//     report_id+0: HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT\n//     report_id+1: HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT\n//     report_id+2: HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT\n//     report_id+3: HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT\n//     report_id+4: HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT\n//     report_id+5: HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT\n#define TUD_HID_REPORT_DESC_LIGHTING(report_id) \\\n  HID_USAGE_PAGE ( HID_USAGE_PAGE_LIGHTING_AND_ILLUMINATION ),\\\n  HID_USAGE      ( HID_USAGE_LIGHTING_LAMP_ARRAY            ),\\\n  HID_COLLECTION ( HID_COLLECTION_APPLICATION               ),\\\n    /* Lamp Array Attributes Report */ \\\n    HID_REPORT_ID (report_id                                    ) \\\n    HID_USAGE ( HID_USAGE_LIGHTING_LAMP_ARRAY_ATTRIBUTES_REPORT ),\\\n    HID_COLLECTION ( HID_COLLECTION_LOGICAL                     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_COUNT                          ),\\\n      HID_LOGICAL_MIN   ( 0                                                      ),\\\n      HID_LOGICAL_MAX_N ( 65535, 3                                               ),\\\n      HID_REPORT_SIZE   ( 16                                                     ),\\\n      HID_REPORT_COUNT  ( 1                                                      ),\\\n      HID_FEATURE       ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE             ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BOUNDING_BOX_WIDTH_IN_MICROMETERS   ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BOUNDING_BOX_HEIGHT_IN_MICROMETERS  ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BOUNDING_BOX_DEPTH_IN_MICROMETERS   ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_ARRAY_KIND                     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_MIN_UPDATE_INTERVAL_IN_MICROSECONDS ),\\\n      HID_LOGICAL_MIN   ( 0                                                      ),\\\n      HID_LOGICAL_MAX_N ( 2147483647, 3                                          ),\\\n      HID_REPORT_SIZE   ( 32                                                     ),\\\n      HID_REPORT_COUNT  ( 5                                                      ),\\\n      HID_FEATURE       ( HID_CONSTANT | HID_VARIABLE | HID_ABSOLUTE             ),\\\n    HID_COLLECTION_END ,\\\n    /* Lamp Attributes Request Report */ \\\n    HID_REPORT_ID       ( report_id + 1                                     ) \\\n    HID_USAGE           ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_REQUEST_REPORT ),\\\n    HID_COLLECTION      ( HID_COLLECTION_LOGICAL                            ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_ID             ),\\\n      HID_LOGICAL_MIN   ( 0                                      ),\\\n      HID_LOGICAL_MAX_N ( 65535, 3                               ),\\\n      HID_REPORT_SIZE   ( 16                                     ),\\\n      HID_REPORT_COUNT  ( 1                                      ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\\\n    HID_COLLECTION_END ,\\\n    /* Lamp Attributes Response Report */ \\\n    HID_REPORT_ID       ( report_id + 2                                      ) \\\n    HID_USAGE           ( HID_USAGE_LIGHTING_LAMP_ATTRIBUTES_RESPONSE_REPORT ),\\\n    HID_COLLECTION      ( HID_COLLECTION_LOGICAL                             ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_ID                        ),\\\n      HID_LOGICAL_MIN   ( 0                                                 ),\\\n      HID_LOGICAL_MAX_N ( 65535, 3                                          ),\\\n      HID_REPORT_SIZE   ( 16                                                ),\\\n      HID_REPORT_COUNT  ( 1                                                 ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE            ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_POSITION_X_IN_MICROMETERS      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_POSITION_Y_IN_MICROMETERS      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_POSITION_Z_IN_MICROMETERS      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_UPDATE_LATENCY_IN_MICROSECONDS ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_PURPOSES                  ),\\\n      HID_LOGICAL_MIN   ( 0                                                 ),\\\n      HID_LOGICAL_MAX_N ( 2147483647, 3                                     ),\\\n      HID_REPORT_SIZE   ( 32                                                ),\\\n      HID_REPORT_COUNT  ( 5                                                 ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE            ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_LEVEL_COUNT                ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_LEVEL_COUNT              ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_LEVEL_COUNT               ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_LEVEL_COUNT          ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_IS_PROGRAMMABLE                ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INPUT_BINDING                  ),\\\n      HID_LOGICAL_MIN   ( 0                                                 ),\\\n      HID_LOGICAL_MAX_N ( 255, 2                                            ),\\\n      HID_REPORT_SIZE   ( 8                                                 ),\\\n      HID_REPORT_COUNT  ( 6                                                 ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE            ),\\\n    HID_COLLECTION_END ,\\\n    /* Lamp Multi-Update Report */ \\\n    HID_REPORT_ID       ( report_id + 3                               ) \\\n    HID_USAGE           ( HID_USAGE_LIGHTING_LAMP_MULTI_UPDATE_REPORT ),\\\n    HID_COLLECTION      ( HID_COLLECTION_LOGICAL                      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_COUNT               ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS        ),\\\n      HID_LOGICAL_MIN   ( 0                                           ),\\\n      HID_LOGICAL_MAX   ( 8                                           ),\\\n      HID_REPORT_SIZE   ( 8                                           ),\\\n      HID_REPORT_COUNT  ( 2                                           ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_ID                  ),\\\n      HID_LOGICAL_MIN   ( 0                                           ),\\\n      HID_LOGICAL_MAX_N ( 65535, 3                                    ),\\\n      HID_REPORT_SIZE   ( 16                                          ),\\\n      HID_REPORT_COUNT  ( 8                                           ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_LOGICAL_MIN   ( 0                                           ),\\\n      HID_LOGICAL_MAX_N ( 255, 2                                      ),\\\n      HID_REPORT_SIZE   ( 8                                           ),\\\n      HID_REPORT_COUNT  ( 32                                          ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE      ),\\\n    HID_COLLECTION_END ,\\\n    /* Lamp Range Update Report */ \\\n    HID_REPORT_ID       ( report_id + 4 ) \\\n    HID_USAGE           ( HID_USAGE_LIGHTING_LAMP_RANGE_UPDATE_REPORT ),\\\n    HID_COLLECTION      ( HID_COLLECTION_LOGICAL                      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_UPDATE_FLAGS        ),\\\n      HID_LOGICAL_MIN   ( 0                                           ),\\\n      HID_LOGICAL_MAX   ( 8                                           ),\\\n      HID_REPORT_SIZE   ( 8                                           ),\\\n      HID_REPORT_COUNT  ( 1                                           ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_ID_START            ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_LAMP_ID_END              ),\\\n      HID_LOGICAL_MIN   ( 0                                           ),\\\n      HID_LOGICAL_MAX_N ( 65535, 3                                    ),\\\n      HID_REPORT_SIZE   ( 16                                          ),\\\n      HID_REPORT_COUNT  ( 2                                           ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_RED_UPDATE_CHANNEL       ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_GREEN_UPDATE_CHANNEL     ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_BLUE_UPDATE_CHANNEL      ),\\\n      HID_USAGE         ( HID_USAGE_LIGHTING_INTENSITY_UPDATE_CHANNEL ),\\\n      HID_LOGICAL_MIN   ( 0                                           ),\\\n      HID_LOGICAL_MAX_N ( 255, 2                                      ),\\\n      HID_REPORT_SIZE   ( 8                                           ),\\\n      HID_REPORT_COUNT  ( 4                                           ),\\\n      HID_FEATURE       ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE      ),\\\n    HID_COLLECTION_END ,\\\n    /* Lamp Array Control Report */ \\\n    HID_REPORT_ID      ( report_id + 5                                ) \\\n    HID_USAGE          ( HID_USAGE_LIGHTING_LAMP_ARRAY_CONTROL_REPORT ),\\\n    HID_COLLECTION     ( HID_COLLECTION_LOGICAL                       ),\\\n      HID_USAGE        ( HID_USAGE_LIGHTING_AUTONOMOUS_MODE     ),\\\n      HID_LOGICAL_MIN  ( 0                                      ),\\\n      HID_LOGICAL_MAX  ( 1                                      ),\\\n      HID_REPORT_SIZE  ( 8                                      ),\\\n      HID_REPORT_COUNT ( 1                                      ),\\\n      HID_FEATURE      ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ),\\\n    HID_COLLECTION_END ,\\\n  HID_COLLECTION_END \\\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     hidd_init            (void);\nbool     hidd_deinit          (void);\nvoid     hidd_reset           (uint8_t rhport);\nuint16_t hidd_open            (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     hidd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\nbool     hidd_xfer_cb         (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/class/hid/hid_host.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUH_ENABLED && CFG_TUH_HID)\n\n#include \"host/usbh.h\"\n#include \"host/usbh_pvt.h\"\n\n#include \"hid_host.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUH_HID_LOG_LEVEL\n  #define CFG_TUH_HID_LOG_LEVEL   CFG_TUH_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUH_HID_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t daddr;\n  uint8_t itf_num;\n  uint8_t ep_in;\n  uint8_t ep_out;\n\n  bool mounted;           // Enumeration is complete\n  uint8_t itf_protocol;   // None, Keyboard, Mouse\n  uint8_t protocol_mode;  // Boot (0) or Report protocol (1)\n\n  uint8_t report_desc_type;\n  uint16_t report_desc_len;\n\n  uint16_t epin_size;\n  uint16_t epout_size;\n} hidh_interface_t;\n\ntypedef struct {\n  TUH_EPBUF_DEF(epin, CFG_TUH_HID_EPIN_BUFSIZE);\n  TUH_EPBUF_DEF(epout, CFG_TUH_HID_EPOUT_BUFSIZE);\n} hidh_epbuf_t;\n\nstatic hidh_interface_t _hidh_itf[CFG_TUH_HID];\nCFG_TUH_MEM_SECTION static hidh_epbuf_t _hidh_epbuf[CFG_TUH_HID];\n\nstatic uint8_t _hidh_default_protocol = HID_PROTOCOL_BOOT;\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t idx, uint8_t const* report_desc, uint16_t desc_len) {\n  (void) dev_addr;\n  (void) idx;\n  (void) report_desc;\n  (void) desc_len;\n}\n\nTU_ATTR_WEAK void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t idx) {\n  (void) dev_addr;\n  (void) idx;\n}\n\nTU_ATTR_WEAK void tuh_hid_report_sent_cb(uint8_t dev_addr, uint8_t idx, uint8_t const* report, uint16_t len) {\n  (void) dev_addr;\n  (void) idx;\n  (void) report;\n  (void) len;\n}\n\nTU_ATTR_WEAK void tuh_hid_get_report_complete_cb(uint8_t dev_addr, uint8_t idx, uint8_t report_id, uint8_t report_type, uint16_t len) {\n  (void) dev_addr;\n  (void) idx;\n  (void) report_id;\n  (void) report_type;\n  (void) len;\n}\n\nTU_ATTR_WEAK void tuh_hid_set_report_complete_cb(uint8_t dev_addr, uint8_t idx, uint8_t report_id, uint8_t report_type, uint16_t len) {\n  (void) dev_addr;\n  (void) idx;\n  (void) report_id;\n  (void) report_type;\n  (void) len;\n}\n\nTU_ATTR_WEAK void tuh_hid_set_protocol_complete_cb(uint8_t dev_addr, uint8_t idx, uint8_t protocol) {\n  (void) dev_addr;\n  (void) idx;\n  (void) protocol;\n}\n\n//--------------------------------------------------------------------+\n// Helper\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline hidh_interface_t* get_hid_itf(uint8_t daddr, uint8_t idx) {\n  TU_ASSERT(daddr > 0 && idx < CFG_TUH_HID, NULL);\n  hidh_interface_t* p_hid = &_hidh_itf[idx];\n  return (p_hid->daddr == daddr) ? p_hid : NULL;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline hidh_epbuf_t* get_hid_epbuf(uint8_t idx) {\n  return &_hidh_epbuf[idx];\n}\n\n// Get instance ID by endpoint address\nstatic uint8_t get_idx_by_epaddr(uint8_t daddr, uint8_t ep_addr) {\n  for (uint8_t idx = 0; idx < CFG_TUH_HID; idx++) {\n    hidh_interface_t const* p_hid = &_hidh_itf[idx];\n    if (p_hid->daddr == daddr &&\n        (p_hid->ep_in == ep_addr || p_hid->ep_out == ep_addr)) {\n      return idx;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\nstatic hidh_interface_t* find_new_itf(void) {\n  for (uint8_t i = 0; i < CFG_TUH_HID; i++) {\n    if (_hidh_itf[i].daddr == 0) {\n      return &_hidh_itf[i];\n    }\n  }\n  return NULL;\n}\n\n//--------------------------------------------------------------------+\n// Interface API\n//--------------------------------------------------------------------+\nuint8_t tuh_hid_itf_get_count(uint8_t daddr) {\n  uint8_t count = 0;\n  for (uint8_t i = 0; i < CFG_TUH_HID; i++) {\n    if (_hidh_itf[i].daddr == daddr) {\n      count++;\n    }\n  }\n  return count;\n}\n\nuint8_t tuh_hid_itf_get_total_count(void) {\n  uint8_t count = 0;\n  for (uint8_t i = 0; i < CFG_TUH_HID; i++) {\n    if (_hidh_itf[i].daddr != 0) {\n      count++;\n    }\n  }\n  return count;\n}\n\nbool tuh_hid_mounted(uint8_t daddr, uint8_t idx) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid);\n  return p_hid->mounted;\n}\n\nbool tuh_hid_itf_get_info(uint8_t daddr, uint8_t idx, tuh_itf_info_t* info) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid && info);\n\n  info->daddr = daddr;\n\n  // re-construct descriptor\n  tusb_desc_interface_t* desc = &info->desc;\n  desc->bLength = sizeof(tusb_desc_interface_t);\n  desc->bDescriptorType = TUSB_DESC_INTERFACE;\n\n  desc->bInterfaceNumber = p_hid->itf_num;\n  desc->bAlternateSetting = 0;\n  desc->bNumEndpoints = (uint8_t) ((p_hid->ep_in ? 1u : 0u) + (p_hid->ep_out ? 1u : 0u));\n  desc->bInterfaceClass = TUSB_CLASS_HID;\n  desc->bInterfaceSubClass = (p_hid->itf_protocol ? HID_SUBCLASS_BOOT : HID_SUBCLASS_NONE);\n  desc->bInterfaceProtocol = p_hid->itf_protocol;\n  desc->iInterface = 0; // not used yet\n\n  return true;\n}\n\nuint8_t tuh_hid_itf_get_index(uint8_t daddr, uint8_t itf_num) {\n  for (uint8_t idx = 0; idx < CFG_TUH_HID; idx++) {\n    hidh_interface_t const* p_hid = &_hidh_itf[idx];\n    if (p_hid->daddr == daddr && p_hid->itf_num == itf_num) return idx;\n  }\n\n  return TUSB_INDEX_INVALID_8;\n}\n\nuint8_t tuh_hid_interface_protocol(uint8_t daddr, uint8_t idx) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  return p_hid ? p_hid->itf_protocol : 0;\n}\n\n//--------------------------------------------------------------------+\n// Control Endpoint API\n//--------------------------------------------------------------------+\nuint8_t tuh_hid_get_protocol(uint8_t daddr, uint8_t idx) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  return p_hid ? p_hid->protocol_mode : 0;\n}\n\nstatic void set_protocol_complete(tuh_xfer_t* xfer) {\n  uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n  uint8_t const daddr = xfer->daddr;\n  uint8_t const idx = tuh_hid_itf_get_index(daddr, itf_num);\n\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid,);\n\n  if (XFER_RESULT_SUCCESS == xfer->result) {\n    p_hid->protocol_mode = (uint8_t) tu_le16toh(xfer->setup->wValue);\n  }\n\n  tuh_hid_set_protocol_complete_cb(daddr, idx, p_hid->protocol_mode);\n}\n\nvoid tuh_hid_set_default_protocol(uint8_t protocol) {\n  _hidh_default_protocol = protocol;\n}\n\nstatic bool hidh_set_protocol(uint8_t daddr, uint8_t itf_num, uint8_t protocol,\n                               tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_LOG_DRV(\"HID Set Protocol = %d\\r\\n\", protocol);\n\n  tusb_control_request_t const request = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type      = TUSB_REQ_TYPE_CLASS,\n          .direction = TUSB_DIR_OUT\n      },\n      .bRequest = HID_REQ_CONTROL_SET_PROTOCOL,\n      .wValue   = protocol,\n      .wIndex   = itf_num,\n      .wLength  = 0\n  };\n\n  tuh_xfer_t xfer = {\n      .daddr       = daddr,\n      .ep_addr     = 0,\n      .setup       = &request,\n      .buffer      = NULL,\n      .complete_cb = complete_cb,\n      .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nbool tuh_hid_set_protocol(uint8_t daddr, uint8_t idx, uint8_t protocol) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid && p_hid->itf_protocol != HID_ITF_PROTOCOL_NONE);\n\n  return hidh_set_protocol(daddr, p_hid->itf_num, protocol, set_protocol_complete, 0);\n}\n\nstatic void get_report_complete(tuh_xfer_t* xfer) {\n  TU_LOG_DRV(\"HID Get Report complete\\r\\n\");\n\n  uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n  uint8_t const idx = tuh_hid_itf_get_index(xfer->daddr, itf_num);\n\n  uint8_t const report_type = tu_u16_high(xfer->setup->wValue);\n    uint8_t const report_id = tu_u16_low(xfer->setup->wValue);\n\n  tuh_hid_get_report_complete_cb(xfer->daddr, idx, report_id, report_type,\n                                 (xfer->result == XFER_RESULT_SUCCESS) ? xfer->setup->wLength : 0);\n}\n\nbool tuh_hid_get_report(uint8_t daddr, uint8_t idx, uint8_t report_id, uint8_t report_type, void* report, uint16_t len) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid);\n  TU_LOG_DRV(\"HID Get Report: id = %u, type = %u, len = %u\\r\\n\", report_id, report_type, len);\n\n  tusb_control_request_t const request = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type      = TUSB_REQ_TYPE_CLASS,\n          .direction = TUSB_DIR_IN\n      },\n      .bRequest = HID_REQ_CONTROL_GET_REPORT,\n      .wValue   = tu_htole16(tu_u16(report_type, report_id)),\n      .wIndex   = tu_htole16((uint16_t) p_hid->itf_num),\n      .wLength  = len\n  };\n\n  tuh_xfer_t xfer = {\n      .daddr       = daddr,\n      .ep_addr     = 0,\n      .setup       = &request,\n      .buffer      = report,\n      .complete_cb = get_report_complete,\n      .user_data   = 0\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nstatic void set_report_complete(tuh_xfer_t* xfer) {\n  TU_LOG_DRV(\"HID Set Report complete\\r\\n\");\n\n  uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n  uint8_t const idx = tuh_hid_itf_get_index(xfer->daddr, itf_num);\n\n  uint8_t const report_type = tu_u16_high(xfer->setup->wValue);\n  uint8_t const report_id = tu_u16_low(xfer->setup->wValue);\n\n  tuh_hid_set_report_complete_cb(xfer->daddr, idx, report_id, report_type,\n                                 (xfer->result == XFER_RESULT_SUCCESS) ? xfer->setup->wLength : 0);\n}\n\nbool tuh_hid_set_report(uint8_t daddr, uint8_t idx, uint8_t report_id, uint8_t report_type, void* report, uint16_t len) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid);\n  TU_LOG_DRV(\"HID Set Report: id = %u, type = %u, len = %u\\r\\n\", report_id, report_type, len);\n\n  tusb_control_request_t const request = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type      = TUSB_REQ_TYPE_CLASS,\n          .direction = TUSB_DIR_OUT\n      },\n      .bRequest = HID_REQ_CONTROL_SET_REPORT,\n      .wValue   = tu_htole16(tu_u16(report_type, report_id)),\n      .wIndex   = tu_htole16((uint16_t) p_hid->itf_num),\n      .wLength  = len\n  };\n\n  tuh_xfer_t xfer = {\n      .daddr       = daddr,\n      .ep_addr     = 0,\n      .setup       = &request,\n      .buffer      = report,\n      .complete_cb = set_report_complete,\n      .user_data   = 0\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nstatic bool hidh_set_idle(uint8_t daddr, uint8_t itf_num, uint16_t idle_rate,\n                           tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  // SET IDLE request, device can stall if not support this request\n  TU_LOG_DRV(\"HID Set Idle \\r\\n\");\n\n  tusb_control_request_t const request = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type      = TUSB_REQ_TYPE_CLASS,\n          .direction = TUSB_DIR_OUT\n      },\n      .bRequest = HID_REQ_CONTROL_SET_IDLE,\n      .wValue   = tu_htole16(idle_rate),\n      .wIndex   = tu_htole16((uint16_t) itf_num),\n      .wLength  = 0\n  };\n\n  tuh_xfer_t xfer = {\n      .daddr       = daddr,\n      .ep_addr     = 0,\n      .setup       = &request,\n      .buffer      = NULL,\n      .complete_cb = complete_cb,\n      .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\n//--------------------------------------------------------------------+\n// Interrupt Endpoint API\n//--------------------------------------------------------------------+\n\n// Check if HID interface is ready to receive report\nbool tuh_hid_receive_ready(uint8_t dev_addr, uint8_t idx) {\n  hidh_interface_t* p_hid = get_hid_itf(dev_addr, idx);\n  TU_VERIFY(p_hid);\n  return !usbh_edpt_busy(dev_addr, p_hid->ep_in);\n}\n\nbool tuh_hid_receive_report(uint8_t daddr, uint8_t idx) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid);\n  hidh_epbuf_t* epbuf = get_hid_epbuf(idx);\n\n  // claim endpoint\n  TU_VERIFY(usbh_edpt_claim(daddr, p_hid->ep_in));\n\n  if (!usbh_edpt_xfer(daddr, p_hid->ep_in, epbuf->epin, p_hid->epin_size)) {\n    usbh_edpt_release(daddr, p_hid->ep_in);\n    return false;\n  }\n\n  return true;\n}\nbool tuh_hid_receive_abort(uint8_t dev_addr, uint8_t idx) {\n  hidh_interface_t* p_hid = get_hid_itf(dev_addr, idx);\n  TU_VERIFY(p_hid);\n  return tuh_edpt_abort_xfer(dev_addr, p_hid->ep_in);\n}\n\nbool tuh_hid_send_ready(uint8_t dev_addr, uint8_t idx) {\n  hidh_interface_t* p_hid = get_hid_itf(dev_addr, idx);\n  TU_VERIFY(p_hid);\n  return !usbh_edpt_busy(dev_addr, p_hid->ep_out);\n}\n\nbool tuh_hid_send_report(uint8_t daddr, uint8_t idx, uint8_t report_id, const void* report, uint16_t len) {\n  TU_LOG_DRV(\"HID Send Report %d\\r\\n\", report_id);\n\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid);\n  hidh_epbuf_t* epbuf = get_hid_epbuf(idx);\n\n  if (p_hid->ep_out == 0) {\n    // This HID does not have an out endpoint (other than control)\n    return false;\n  } else if (len > CFG_TUH_HID_EPOUT_BUFSIZE ||\n             (report_id != 0 && len > (CFG_TUH_HID_EPOUT_BUFSIZE - 1))) {\n    // ep_out buffer is not large enough to hold contents\n    return false;\n  }\n\n  // claim endpoint\n  TU_VERIFY(usbh_edpt_claim(daddr, p_hid->ep_out));\n\n  if (report_id == 0) {\n    // No report ID in transmission\n    memcpy(&epbuf->epout[0], report, len);\n  } else {\n    epbuf->epout[0] = report_id;\n    memcpy(&epbuf->epout[1], report, len);\n    ++len; // 1 more byte for report_id\n  }\n\n  TU_LOG3_MEM(epbuf->epout, len, 2);\n\n  if (!usbh_edpt_xfer(daddr, p_hid->ep_out, epbuf->epout, len)) {\n    usbh_edpt_release(daddr, p_hid->ep_out);\n    return false;\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// USBH API\n//--------------------------------------------------------------------+\nbool hidh_init(void) {\n  TU_LOG_DRV(\"sizeof(hidh_interface_t) = %u\\r\\n\", sizeof(hidh_interface_t));\n  tu_memclr(_hidh_itf, sizeof(_hidh_itf));\n  return true;\n}\n\nbool hidh_deinit(void) {\n  return true;\n}\n\nbool hidh_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void) result;\n\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n  uint8_t const idx = get_idx_by_epaddr(daddr, ep_addr);\n\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid);\n  hidh_epbuf_t* epbuf = get_hid_epbuf(idx);\n\n  if (dir == TUSB_DIR_IN) {\n    TU_LOG_DRV(\"  [idx=%u] Get Report callback\\r\\n\", idx);\n    TU_LOG3_MEM(epbuf->epin, xferred_bytes, 2);\n    tuh_hid_report_received_cb(daddr, idx, epbuf->epin, (uint16_t) xferred_bytes);\n  } else {\n    tuh_hid_report_sent_cb(daddr, idx, epbuf->epout, (uint16_t) xferred_bytes);\n  }\n\n  return true;\n}\n\nvoid hidh_close(uint8_t daddr) {\n  for (uint8_t i = 0; i < CFG_TUH_HID; i++) {\n    hidh_interface_t* p_hid = &_hidh_itf[i];\n    if (p_hid->daddr == daddr) {\n      TU_LOG_DRV(\"  HIDh close addr = %u index = %u\\r\\n\", daddr, i);\n      tuh_hid_umount_cb(daddr, i);\n      tu_memclr(p_hid, sizeof(hidh_interface_t));\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Enumeration\n//--------------------------------------------------------------------+\nuint16_t hidh_open(uint8_t rhport, uint8_t daddr, const tusb_desc_interface_t *desc_itf, uint16_t max_len) {\n  (void) rhport;\n  (void) max_len;\n\n  TU_VERIFY(TUSB_CLASS_HID == desc_itf->bInterfaceClass, 0);\n  TU_LOG_DRV(\"[%u] HID opening Interface %u\\r\\n\", daddr, desc_itf->bInterfaceNumber);\n\n  // len = interface + hid + n*endpoints\n  const uint16_t drv_len = (uint16_t)(sizeof(tusb_desc_interface_t) + sizeof(tusb_hid_descriptor_hid_t) +\n                                      desc_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t));\n  TU_ASSERT(drv_len <= max_len, 0);\n  const uint8_t *p_desc = (const uint8_t *)desc_itf;\n\n  // HID descriptor: mostly right after interface descriptor, in some rare case it might be after endpoint descriptors\n  p_desc = tu_desc_next(p_desc);\n  const tusb_hid_descriptor_hid_t *desc_hid;\n  if (tu_desc_type(p_desc) == HID_DESC_TYPE_HID) {\n    // HID after interface\n    desc_hid = (const tusb_hid_descriptor_hid_t *)p_desc;\n    p_desc   = tu_desc_next(p_desc);\n  } else {\n    // HID after endpoint\n    desc_hid = (const tusb_hid_descriptor_hid_t *)(p_desc + sizeof(tusb_desc_endpoint_t) * desc_itf->bNumEndpoints);\n    TU_ASSERT(tu_desc_type(desc_hid) == HID_DESC_TYPE_HID, 0);\n  }\n\n  // Allocate new interface\n  hidh_interface_t *p_hid = find_new_itf();\n  TU_ASSERT(p_hid, 0); // not enough interface, try to increase CFG_TUH_HID\n  p_hid->daddr   = daddr;\n  p_hid->itf_num = desc_itf->bInterfaceNumber;\n\n  // Endpoint Descriptors\n  for (uint8_t i = 0; i < desc_itf->bNumEndpoints; i++) {\n    const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)p_desc;\n    TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType, 0);\n    TU_ASSERT(tuh_edpt_open(daddr, desc_ep), 0);\n\n    if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN) {\n      p_hid->ep_in = desc_ep->bEndpointAddress;\n      p_hid->epin_size = tu_edpt_packet_size(desc_ep);\n    } else {\n      p_hid->ep_out = desc_ep->bEndpointAddress;\n      p_hid->epout_size = tu_edpt_packet_size(desc_ep);\n    }\n\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  // Assume bNumDescriptors = 1\n  p_hid->report_desc_type = desc_hid->bReportType;\n  // Use offsetof to avoid pointer to the odd/misaligned address\n  p_hid->report_desc_len = tu_unaligned_read16((uint8_t const*)desc_hid + offsetof(tusb_hid_descriptor_hid_t, wReportLength));\n\n  // Per HID Specs: default is Report protocol\n  p_hid->protocol_mode = HID_PROTOCOL_REPORT;\n  if (HID_SUBCLASS_BOOT == desc_itf->bInterfaceSubClass) {\n    p_hid->itf_protocol = desc_itf->bInterfaceProtocol;\n  }\n\n  return drv_len;\n}\n\n//--------------------------------------------------------------------+\n// Set Configure\n//--------------------------------------------------------------------+\n\nenum {\n  CONFG_SET_IDLE,\n  CONFIG_SET_PROTOCOL,\n  CONFIG_GET_REPORT_DESC,\n  CONFIG_COMPLETE\n};\n\nstatic void config_driver_mount_complete(uint8_t daddr, uint8_t idx, uint8_t const* desc_report, uint16_t desc_len);\nstatic void process_set_config(tuh_xfer_t* xfer);\n\nbool hidh_set_config(uint8_t daddr, uint8_t itf_num) {\n  tusb_control_request_t request;\n  request.wIndex = tu_htole16((uint16_t) itf_num);\n\n  tuh_xfer_t xfer;\n  xfer.daddr = daddr;\n  xfer.result = XFER_RESULT_SUCCESS;\n  xfer.setup = &request;\n  xfer.user_data = CONFG_SET_IDLE;\n\n  // fake request to kick-off the set config process\n  process_set_config(&xfer);\n\n  return true;\n}\n\nstatic void process_set_config(tuh_xfer_t* xfer) {\n  // Stall is a valid response for SET_IDLE, sometime SET_PROTOCOL as well\n  // therefore we could ignore its result\n  if (!(xfer->setup->bRequest == HID_REQ_CONTROL_SET_IDLE ||\n        xfer->setup->bRequest == HID_REQ_CONTROL_SET_PROTOCOL)) {\n    TU_ASSERT(xfer->result == XFER_RESULT_SUCCESS,);\n  }\n\n  uintptr_t const state = xfer->user_data;\n  uint8_t const itf_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n  uint8_t const daddr = xfer->daddr;\n\n  uint8_t const idx = tuh_hid_itf_get_index(daddr, itf_num);\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid,);\n\n  switch (state) {\n    case CONFG_SET_IDLE: {\n      // Idle rate = 0 mean only report when there are changes\n      const uint16_t idle_rate = 0;\n      const uintptr_t next_state = (p_hid->itf_protocol != HID_ITF_PROTOCOL_NONE)\n                                   ? CONFIG_SET_PROTOCOL : CONFIG_GET_REPORT_DESC;\n      hidh_set_idle(daddr, itf_num, idle_rate, process_set_config, next_state);\n      break;\n    }\n\n    case CONFIG_SET_PROTOCOL:\n  #if CFG_TUH_HID_SET_PROTOCOL_ON_ENUM\n      hidh_set_protocol(daddr, p_hid->itf_num, _hidh_default_protocol, process_set_config, CONFIG_GET_REPORT_DESC);\n      break;\n  #else\n      TU_ATTR_FALLTHROUGH;\n  #endif\n\n    case CONFIG_GET_REPORT_DESC:\n      if (xfer->setup->bRequest == HID_REQ_CONTROL_SET_PROTOCOL && xfer->result == XFER_RESULT_SUCCESS) {\n        p_hid->protocol_mode = (uint8_t) tu_le16toh(xfer->setup->wValue);\n      }\n      // Get Report Descriptor if possible\n      // using usbh enumeration buffer since the report descriptor can be very long\n      if (p_hid->report_desc_len > CFG_TUH_ENUMERATION_BUFSIZE) {\n        TU_LOG_DRV(\"HID Skip Report Descriptor since it is too large %u bytes\\r\\n\", p_hid->report_desc_len);\n        config_driver_mount_complete(daddr, idx, NULL, 0);\n      } else {\n        tuh_descriptor_get_hid_report(daddr, itf_num, p_hid->report_desc_type, 0,\n                                      usbh_get_enum_buf(), p_hid->report_desc_len,\n                                      process_set_config, CONFIG_COMPLETE);\n      }\n      break;\n\n    case CONFIG_COMPLETE: {\n      const uint8_t *desc_report = usbh_get_enum_buf();\n      const uint16_t desc_len    = tu_le16toh(xfer->setup->wLength);\n\n      config_driver_mount_complete(daddr, idx, desc_report, desc_len);\n      break;\n    }\n\n    default:\n      break;\n  }\n}\n\nstatic void config_driver_mount_complete(uint8_t daddr, uint8_t idx, uint8_t const* desc_report, uint16_t desc_len) {\n  hidh_interface_t* p_hid = get_hid_itf(daddr, idx);\n  TU_VERIFY(p_hid,);\n  p_hid->mounted = true;\n\n  // enumeration is complete\n  tuh_hid_mount_cb(daddr, idx, desc_report, desc_len);\n\n  // notify usbh that driver enumeration is complete\n  usbh_driver_set_config_complete(daddr, p_hid->itf_num);\n}\n\n//--------------------------------------------------------------------+\n// Report Descriptor Parser\n//--------------------------------------------------------------------+\n\nuint8_t tuh_hid_parse_report_descriptor(tuh_hid_report_info_t* report_info_arr, uint8_t arr_count,\n                                        uint8_t const* desc_report, uint16_t desc_len) {\n  // Report Item 6.2.2.2 USB HID 1.11\n  union TU_ATTR_PACKED {\n    uint8_t byte;\n    struct TU_ATTR_PACKED {\n      uint8_t size : 2;\n      uint8_t type : 2;\n      uint8_t tag : 4;\n    };\n  } header;\n\n  tu_memclr(report_info_arr, arr_count * sizeof(tuh_hid_report_info_t));\n\n  uint8_t report_num = 0;\n  tuh_hid_report_info_t* info = report_info_arr;\n\n  // current parsed report count & size from descriptor\n//  uint8_t ri_report_count = 0;\n//  uint8_t ri_report_size = 0;\n\n  uint8_t ri_collection_depth = 0;\n  while (desc_len && report_num < arr_count) {\n    header.byte = *desc_report++;\n    desc_len--;\n\n    uint8_t const tag = header.tag;\n    uint8_t const type = header.type;\n    uint8_t size = header.size;\n    if (size == 3) {\n      size = 4; // HID 1.11 6.2.2.2 3 is 4 bytes\n    }\n\n    uint8_t const data8 = (size > 0) ? desc_report[0] : 0;\n\n    TU_LOG(3, \"tag = %d, type = %d, size = %d, data = \", tag, type, size);\n    for (uint32_t i = 0; i < size; i++) {\n      TU_LOG(3, \"%02X \", desc_report[i]);\n    }\n    TU_LOG(3, \"\\r\\n\");\n\n    switch (type) {\n      case RI_TYPE_MAIN:\n        switch (tag) {\n          case RI_MAIN_INPUT: break;\n          case RI_MAIN_OUTPUT: break;\n          case RI_MAIN_FEATURE: break;\n          case RI_MAIN_COLLECTION:\n            ri_collection_depth++;\n            break;\n\n          case RI_MAIN_COLLECTION_END:\n            ri_collection_depth--;\n            if (ri_collection_depth == 0) {\n              info++;\n              report_num++;\n            }\n            break;\n\n          default:break;\n        }\n        break;\n\n      case RI_TYPE_GLOBAL:\n        switch (tag) {\n          case RI_GLOBAL_USAGE_PAGE:\n            // only take in account the \"usage page\" before REPORT ID\n            if (ri_collection_depth == 0) memcpy(&info->usage_page, desc_report, size);\n            break;\n\n          case RI_GLOBAL_LOGICAL_MIN: break;\n          case RI_GLOBAL_LOGICAL_MAX: break;\n          case RI_GLOBAL_PHYSICAL_MIN: break;\n          case RI_GLOBAL_PHYSICAL_MAX: break;\n\n          case RI_GLOBAL_REPORT_ID:\n            info->report_id = data8;\n            break;\n\n          case RI_GLOBAL_REPORT_SIZE:\n//            ri_report_size = data8;\n            break;\n\n          case RI_GLOBAL_REPORT_COUNT:\n//            ri_report_count = data8;\n            break;\n\n          case RI_GLOBAL_UNIT_EXPONENT: break;\n          case RI_GLOBAL_UNIT: break;\n          case RI_GLOBAL_PUSH: break;\n          case RI_GLOBAL_POP: break;\n\n          default: break;\n        }\n        break;\n\n      case RI_TYPE_LOCAL:\n        switch (tag) {\n          case RI_LOCAL_USAGE:\n            // only take in account the \"usage\" before starting REPORT ID\n            if (ri_collection_depth == 0) info->usage = data8;\n            break;\n\n          case RI_LOCAL_USAGE_MIN: break;\n          case RI_LOCAL_USAGE_MAX: break;\n          case RI_LOCAL_DESIGNATOR_INDEX: break;\n          case RI_LOCAL_DESIGNATOR_MIN: break;\n          case RI_LOCAL_DESIGNATOR_MAX: break;\n          case RI_LOCAL_STRING_INDEX: break;\n          case RI_LOCAL_STRING_MIN: break;\n          case RI_LOCAL_STRING_MAX: break;\n          case RI_LOCAL_DELIMITER: break;\n          default: break;\n        }\n        break;\n\n        // error\n      default: break;\n    }\n\n    desc_report += size;\n    desc_len -= size;\n  }\n\n  for (uint8_t i = 0; i < report_num; i++) {\n    info = report_info_arr + i;\n    TU_LOG_DRV(\"%u: id = %u, usage_page = %u, usage = %u\\r\\n\", i, info->report_id, info->usage_page, info->usage);\n  }\n\n  return report_num;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/hid/hid_host.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_HID_HOST_H_\n#define TUSB_HID_HOST_H_\n\n#include \"hid.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n// TODO Highspeed interrupt can be up to 512 bytes\n#ifndef CFG_TUH_HID_EPIN_BUFSIZE\n  #define CFG_TUH_HID_EPIN_BUFSIZE 64\n#endif\n\n#ifndef CFG_TUH_HID_EPOUT_BUFSIZE\n  #define CFG_TUH_HID_EPOUT_BUFSIZE 64\n#endif\n\n#ifndef CFG_TUH_HID_SET_PROTOCOL_ON_ENUM\n  #define CFG_TUH_HID_SET_PROTOCOL_ON_ENUM 1\n#endif\n\n//--------------------------------------------------------------------+\n// Interface API\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t  report_id;\n  uint8_t  usage;\n  uint16_t usage_page;\n\n  // TODO still use the endpoint size for now\n  //  uint8_t in_len;      // length of IN report\n  //  uint8_t out_len;     // length of OUT report\n} tuh_hid_report_info_t;\n\n// Get the total number of mounted HID interfaces of a device\nuint8_t tuh_hid_itf_get_count(uint8_t dev_addr);\n\n// Get all mounted interfaces across devices\nuint8_t tuh_hid_itf_get_total_count(void);\n\n// backward compatible rename\n#define tuh_hid_instance_count tuh_hid_itf_get_count\n\n// Get Interface information\nbool tuh_hid_itf_get_info(uint8_t daddr, uint8_t idx, tuh_itf_info_t *itf_info);\n\n// Get Interface index from device address + interface number\n// return TUSB_INDEX_INVALID_8 (0xFF) if not found\nuint8_t tuh_hid_itf_get_index(uint8_t daddr, uint8_t itf_num);\n\n// Get interface supported protocol (bInterfaceProtocol) check out hid_interface_protocol_enum_t for possible values\nuint8_t tuh_hid_interface_protocol(uint8_t dev_addr, uint8_t idx);\n\n// Check if HID interface is mounted\nbool tuh_hid_mounted(uint8_t dev_addr, uint8_t idx);\n\n// Parse report descriptor into array of report_info struct and return number of reports.\n// For complicated report, application should write its own parser.\nTU_ATTR_UNUSED uint8_t tuh_hid_parse_report_descriptor(tuh_hid_report_info_t *reports_info_arr, uint8_t arr_count,\n                                                       const uint8_t *desc_report, uint16_t desc_len);\n\n//--------------------------------------------------------------------+\n// Control Endpoint API\n//--------------------------------------------------------------------+\n\n// Get current protocol: HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)\n// Note: Device will be initialized in Boot protocol for simplicity.\n//       Application can use set_protocol() to switch back to Report protocol.\nuint8_t tuh_hid_get_protocol(uint8_t dev_addr, uint8_t idx);\n\n// Device by default is enumerated in Boot protocol for simplicity. Application\n// can use this to modify the default protocol for next enumeration.\nvoid tuh_hid_set_default_protocol(uint8_t protocol);\n\n// Set protocol to HID_PROTOCOL_BOOT (0) or HID_PROTOCOL_REPORT (1)\n// This function is only supported by Boot interface (tuh_n_hid_interface_protocol() != NONE)\nbool tuh_hid_set_protocol(uint8_t dev_addr, uint8_t idx, uint8_t protocol);\n\n// Get Report using control endpoint\n// report_type is either Input, Output or Feature, (value from hid_report_type_t)\nbool tuh_hid_get_report(uint8_t dev_addr, uint8_t idx, uint8_t report_id, uint8_t report_type, void *report,\n                        uint16_t len);\n\n// Set Report using control endpoint\n// report_type is either Input, Output or Feature, (value from hid_report_type_t)\nbool tuh_hid_set_report(uint8_t dev_addr, uint8_t idx, uint8_t report_id, uint8_t report_type, void *report,\n                        uint16_t len);\n\n//--------------------------------------------------------------------+\n// Interrupt Endpoint API\n//--------------------------------------------------------------------+\n\n// Check if HID interface is ready to receive report\nbool tuh_hid_receive_ready(uint8_t dev_addr, uint8_t idx);\n\n// Try to receive next report on Interrupt Endpoint. Immediately return\n// - true If succeeded, tuh_hid_report_received_cb() callback will be invoked when report is available\n// - false if failed to queue the transfer e.g endpoint is busy\nbool tuh_hid_receive_report(uint8_t dev_addr, uint8_t idx);\n\n// Abort receiving report on Interrupt Endpoint\nbool tuh_hid_receive_abort(uint8_t dev_addr, uint8_t idx);\n\n// Check if HID interface is ready to send report\nbool tuh_hid_send_ready(uint8_t dev_addr, uint8_t idx);\n\n// Send report using interrupt endpoint\n// If report_id > 0 (composite), it will be sent as 1st byte, then report contents. Otherwise only report content is\n// sent.\nbool tuh_hid_send_report(uint8_t dev_addr, uint8_t idx, uint8_t report_id, const void *report, uint16_t len);\n\n//--------------------------------------------------------------------+\n// Callbacks (Weak is optional)\n//--------------------------------------------------------------------+\n\n// Invoked when device with hid interface is mounted\n// Report descriptor is also available for use. tuh_hid_parse_report_descriptor()\n// can be used to parse common/simple enough descriptor.\n// Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, it will be skipped\n// therefore report_desc = NULL, desc_len = 0\nvoid tuh_hid_mount_cb(uint8_t dev_addr, uint8_t idx, const uint8_t *report_desc, uint16_t desc_len);\n\n// Invoked when device with hid interface is un-mounted\nvoid tuh_hid_umount_cb(uint8_t dev_addr, uint8_t idx);\n\n// Invoked when received report from device via interrupt endpoint\n// Note: if there is report ID (composite), it is 1st byte of report\nvoid tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t idx, const uint8_t *report, uint16_t len);\n\n// Invoked when sent report to device successfully via interrupt endpoint\nvoid tuh_hid_report_sent_cb(uint8_t dev_addr, uint8_t idx, const uint8_t *report, uint16_t len);\n\n// Invoked when Get Report to device via either control endpoint\n// len = 0 indicate there is error in the transfer e.g stalled response\nvoid tuh_hid_get_report_complete_cb(uint8_t dev_addr, uint8_t idx, uint8_t report_id, uint8_t report_type,\n                                    uint16_t len);\n\n// Invoked when Sent Report to device via either control endpoint\n// len = 0 indicate there is error in the transfer e.g stalled response\nvoid tuh_hid_set_report_complete_cb(uint8_t dev_addr, uint8_t idx, uint8_t report_id, uint8_t report_type,\n                                    uint16_t len);\n\n// Invoked when Set Protocol request is complete\nvoid tuh_hid_set_protocol_complete_cb(uint8_t dev_addr, uint8_t idx, uint8_t protocol);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nbool     hidh_init(void);\nbool     hidh_deinit(void);\nuint16_t hidh_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *desc_itf, uint16_t max_len);\nbool     hidh_set_config(uint8_t dev_addr, uint8_t itf_num);\nbool     hidh_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\nvoid     hidh_close(uint8_t dev_addr);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_HID_HOST_H_ */\n"
  },
  {
    "path": "src/class/midi/README_midi_host.md",
    "content": "# MIDI HOST DRIVER\nThis README file contains the design notes and limitations of the\nMIDI host driver.\n\n# MAXIMUM NUMBER OF MIDI DEVICES ATTACHED TO HOST\nIn this version of the driver, only one MIDI device is supported. This\nconstraint may change in the future.\n\n# MAXIMUM NUMBER OF ENDPOINTS\nAlthough the USB MIDI 1.0 Class specification allows an arbitrary number\nof endpoints, this driver supports at most one USB BULK DATA IN endpoint\nand one USB BULK DATA OUT endpoint. Each endpoint can support up to 16\nvirtual cables. If a device has multiple IN endpoints or multiple OUT\nendpoints, it will fail to enumerate.\n\nMost USB MIDI devices contain both an IN endpoint and an OUT endpoint,\nbut not all do. For example, some USB pedals only support an OUT endpoint.\nThis driver allows that.\n\n# PUBLIC API\nApplications interact with this driver via 8-bit buffers of MIDI messages\nformed using the rules for sending bytes on a 5-pin DIN cable per the\noriginal MIDI 1.0 specification.\n\nTo send a message to a device, the Host application composes a sequence\nof status and data bytes in a byte array and calls the API function.\nThe arguments of the function are a pointer to the byte array, the number\nof bytes in the array, and the target virtual cable number 0-15.\n\nWhen the host driver receives a message from the device, the host driver\nwill call a callback function that the host application registers. This\ncallback function contains a pointer to a message buffer, a message length,\nand the virtual cable number of the message buffer. One complete bulk IN\nendpoint transfer might contain multiple messages targeted to different\nvirtual cables.\n\n# SUBCLASS AUDIO CONTROL\nA MIDI device does not absolutely need to have an Audio Control Interface,\nunless it adheres to the USB Audio Class 2 spec, but many devices\nhave them even if the devices do not have an audio streaming interface.\nBecause this driver does not support audio streaming, the descriptor parser\nwill skip past any audio control interface and audio streaming interface\nand open only the MIDI interface.\n\nAn audio streaming host driver can use this driver by passing a pointer\nto the MIDI interface descriptor that is found after the audio streaming\ninterface to the midih_open() function. That is, an audio streaming host\ndriver would parse the audio control interface descriptor and then the\naudio streaming interface and endpoint descriptors. When the next descriptor\npointer points to a MIDI interface descriptor, call midih_open() with that\ndescriptor pointer.\n\n# CLASS SPECIFIC INTERFACE AND REQUESTS\nThe host driver does not make use of the information in the class specific\ninterface descriptors. In the future, a public API could be created to\nretrieve the string descriptors for the names of each ELEMENT,\nIN JACK and OUT JACK, and how the device describes the connections.\n\nThis driver also does not support class specific requests to control\nELEMENT items, nor does it support non-MIDI Streaming bulk endpoints.\n\n# MIDI CLASS SPECIFIC DESCRIPTOR TOTAL LENGTH FIELD IGNORED\nI have observed at least one keyboard by a leading manufacturer that\nsets the wTotalLength field of the Class-Specific MS Interface Header\nDescriptor to include the length of the MIDIStreaming Endpoint\nDescriptors. This is wrong per my reading of the specification.\n\n# MESSAGE BUFFER DETAILS\nMessages buffers composed from USB data received on the IN endpoint will never contain\nrunning status because USB MIDI 1.0 class does not support that. Messages\nbuffers to be sent to the device on the OUT endpoint may contain running status\n(the message might come from a UART data stream from a 5-pin DIN MIDI IN\ncable on the host, for example). The driver may in the future correctly compose\n4-byte USB MIDI Class packets using the running status if need be. However,\nit does not currently do that. Also, use of running status is not a good idea\noverall because a single byte error can really mess up the data stream with no\nway to recover until the next non-real time status byte is in the message buffer.\n\nMessage buffers to be sent to the device may contain Real time messages\nsuch as MIDI clock. Real time messages may be inserted in the message\nbyte stream between status and data bytes of another message without disrupting\nthe running status. However, because MIDI 1.0 class messages are sent\nas four byte packets, a real-time message so inserted will be re-ordered\nto be sent to the device in a new 4-byte packet immediately before the\ninterrupted data stream.\n\nReal time messages the device sends to the host can only appear between\nthe status byte and data bytes of the message in System Exclusive messages\nthat are longer than 3 bytes.\n\n# POORLY FORMED USB MIDI DATA PACKETS FROM THE DEVICE\nSome devices do not properly encode the code index number (CIN) for the\nMIDI message status byte even though the 3-byte data payload correctly encodes\nthe MIDI message. This driver looks to the byte after the CIN byte to decide\nhow many bytes to place in the message buffer.\n\nSome devices do not properly encode the virtual cable number. If the virtual\ncable number in the CIN data byte of the packet is not less than bNumEmbMIDIJack\nfor that endpoint, then the host driver assumes virtual cable 0 and does not\nreport an error.\n\nSome MIDI devices will always send back exactly wMaxPacketSize bytes on\nevery endpoint even if only one 4-byte packet is required (e.g., NOTE ON).\nThese devices send packets with 4 packet bytes 0. This driver ignores all\nzero packets without reporting an error.\n\n# ENUMERATION FAILURES\nThe host may fail to enumerate a device if it has too many endpoints, if it has\nif it has a Standard MS Transfer Bulk Data Endpoint Descriptor (not supported),\nif it has a poorly formed descriptor, or if the descriptor is too long for\nthe host to read the whole thing.\n"
  },
  {
    "path": "src/class/midi/midi.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MIDI_H_\n#define TUSB_MIDI_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Constants\n//--------------------------------------------------------------------+\nenum {\n  MIDI_VERSION_1_0 = 0x0100,\n  MIDI_VERSION_2_0 = 0x0200,\n};\n\ntypedef enum {\n  MIDI_CS_INTERFACE_HEADER    = 0x01,\n  MIDI_CS_INTERFACE_IN_JACK   = 0x02,\n  MIDI_CS_INTERFACE_OUT_JACK  = 0x03,\n  MIDI_CS_INTERFACE_ELEMENT   = 0x04,\n} midi_cs_interface_subtype_t;\n\ntypedef enum {\n  MIDI_CS_ENDPOINT_GENERAL = 0x01,\n  MIDI_CS_ENDPOINT_GENERAL_2_0 = 0x02,\n} midi_cs_endpoint_subtype_t;\n\ntypedef enum {\n  MIDI_JACK_EMBEDDED = 0x01,\n  MIDI_JACK_EXTERNAL = 0x02\n} midi_jack_type_t;\n\ntypedef enum {\n  MIDI_CIN_MISC              = 0,\n  MIDI_CIN_CABLE_EVENT       = 1,\n  MIDI_CIN_SYSCOM_2BYTE      = 2, // 2 byte system common message e.g MTC, SongSelect\n  MIDI_CIN_SYSCOM_3BYTE      = 3, // 3 byte system common message e.g SPP\n  MIDI_CIN_SYSEX_START       = 4, // SysEx starts or continue\n  MIDI_CIN_SYSEX_END_1BYTE   = 5, // SysEx ends with 1 data, or 1 byte system common message\n  MIDI_CIN_SYSEX_END_2BYTE   = 6, // SysEx ends with 2 data\n  MIDI_CIN_SYSEX_END_3BYTE   = 7, // SysEx ends with 3 data\n  MIDI_CIN_NOTE_OFF          = 8,\n  MIDI_CIN_NOTE_ON           = 9,\n  MIDI_CIN_POLY_KEYPRESS     = 10,\n  MIDI_CIN_CONTROL_CHANGE    = 11,\n  MIDI_CIN_PROGRAM_CHANGE    = 12,\n  MIDI_CIN_CHANNEL_PRESSURE  = 13,\n  MIDI_CIN_PITCH_BEND_CHANGE = 14,\n  MIDI_CIN_1BYTE_DATA = 15\n} midi_code_index_number_t;\n\n// MIDI 1.0 status byte\nenum {\n  //------------- System Exclusive -------------//\n  MIDI_STATUS_SYSEX_START                    = 0xF0,\n  MIDI_STATUS_SYSEX_END                      = 0xF7,\n\n  //------------- System Common -------------//\n  MIDI_STATUS_SYSCOM_TIME_CODE_QUARTER_FRAME = 0xF1,\n  MIDI_STATUS_SYSCOM_SONG_POSITION_POINTER   = 0xF2,\n  MIDI_STATUS_SYSCOM_SONG_SELECT             = 0xF3,\n  // F4, F5 is undefined\n  MIDI_STATUS_SYSCOM_TUNE_REQUEST            = 0xF6,\n\n  //------------- System RealTime  -------------//\n  MIDI_STATUS_SYSREAL_TIMING_CLOCK           = 0xF8,\n  // 0xF9 is undefined\n  MIDI_STATUS_SYSREAL_START                  = 0xFA,\n  MIDI_STATUS_SYSREAL_CONTINUE               = 0xFB,\n  MIDI_STATUS_SYSREAL_STOP                   = 0xFC,\n  // 0xFD is undefined\n  MIDI_STATUS_SYSREAL_ACTIVE_SENSING         = 0xFE,\n  MIDI_STATUS_SYSREAL_SYSTEM_RESET           = 0xFF,\n};\n\nenum {\n  MIDI_MAX_DATA_VAL = 0x7F,\n};\n\n//--------------------------------------------------------------------+\n// Class Specific Descriptor\n//--------------------------------------------------------------------+\n\n/// MIDI Interface Header Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;           ///< Size of this descriptor in bytes.\n  uint8_t  bDescriptorType;   ///< must be TUSB_DESC_CS_INTERFACE\n  uint8_t  bDescriptorSubType;///< Descriptor SubType\n  uint16_t bcdMSC;            ///< MidiStreaming SubClass release number in Binary-Coded Decimal\n  uint16_t wTotalLength;\n} midi_desc_header_t;\nTU_VERIFY_STATIC(sizeof(midi_desc_header_t) == 7, \"size is not correct\");\n\n/// MIDI In Jack Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;           ///< Size of this descriptor in bytes.\n  uint8_t bDescriptorType;   ///< Descriptor Type, must be Class-Specific\n  uint8_t bDescriptorSubType;///< Descriptor SubType\n  uint8_t bJackType;         ///< Embedded or External\n  uint8_t bJackID;           ///< Unique ID for MIDI IN Jack\n  uint8_t iJack;             ///< string descriptor\n} midi_desc_in_jack_t;\nTU_VERIFY_STATIC(sizeof(midi_desc_in_jack_t) == 6, \"size is not correct\");\n\n/// MIDI Out Jack Descriptor with multiple input pins\n#define midi_desc_out_jack_n_t(input_num) \\\n  struct TU_ATTR_PACKED {                 \\\n    uint8_t bLength;                      \\\n    uint8_t bDescriptorType;              \\\n    uint8_t bDescriptorSubType;           \\\n    uint8_t bJackType;                    \\\n    uint8_t bJackID;                      \\\n    uint8_t bNrInputPins;                 \\\n    struct TU_ATTR_PACKED {               \\\n      uint8_t baSourceID;                 \\\n      uint8_t baSourcePin;                \\\n    } input[input_num];                    \\\n    uint8_t iJack;                        \\\n  }\n\ntypedef midi_desc_out_jack_n_t(1)  midi_desc_out_jack_1in_t; // 1 input\ntypedef midi_desc_out_jack_1in_t midi_desc_out_jack_t; // backward compatible\nTU_VERIFY_STATIC(sizeof(midi_desc_out_jack_1in_t) == 7 + 2 * 1, \"size is not correct\");\n\n/// MIDI Element Descriptor with multiple pins\n#define midi_desc_element_n_t(input_num) \\\n  struct TU_ATTR_PACKED {       \\\n    uint8_t bLength;            \\\n    uint8_t bDescriptorType;    \\\n    uint8_t bDescriptorSubType; \\\n    uint8_t bElementID;         \\\n    uint8_t bNrInputPins;       \\\n    struct TU_ATTR_PACKED {     \\\n        uint8_t baSourceID;     \\\n        uint8_t baSourcePin;    \\\n    } pins[input_num];          \\\n    uint8_t bNrOutputPins;      \\\n    uint8_t bInTerminalLink;    \\\n    uint8_t bOutTerminalLink;   \\\n    uint8_t bElCapsSize;        \\\n    uint16_t bmElementCaps;     \\\n    uint8_t  iElement;          \\\n }\n\n// This descriptor follows the standard bulk data endpoint descriptor\n#define midi_desc_cs_endpoint_n_t(jack_num) \\\n  struct TU_ATTR_PACKED {                   \\\n    uint8_t bLength;                        \\\n    uint8_t bDescriptorType;                \\\n    uint8_t bDescriptorSubType;             \\\n    uint8_t bNumEmbMIDIJack;                \\\n    uint8_t baAssocJackID[jack_num];        \\\n  }\n\ntypedef midi_desc_cs_endpoint_n_t() midi_desc_cs_endpoint_t; // empty/flexible jack list\ntypedef midi_desc_cs_endpoint_n_t(1) midi_desc_cs_endpoint_1jack_t;\n\nTU_VERIFY_STATIC(sizeof(midi_desc_cs_endpoint_1jack_t) == 4+1, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// For Internal Driver Use\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t buffer[4];\n  uint8_t index;\n  uint8_t total;\n} midi_driver_stream_t;\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/class/midi/midi_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && CFG_TUD_MIDI\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"midi_device.h\"\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_midi_rx_cb(uint8_t itf) {\n  (void)itf;\n}\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t rhport;\n  uint8_t itf_num;\n\n  // For Stream read()/write() API\n  // Messages are always 4 bytes long, queue them for reading and writing so the\n  // callers can use the Stream interface with single-byte read/write calls.\n  midi_driver_stream_t stream_write;\n  midi_driver_stream_t stream_read;\n\n  /*------------- From this point, data is not cleared by bus reset -------------*/\n  // Endpoint stream\n  struct {\n    tu_edpt_stream_t tx;\n    tu_edpt_stream_t rx;\n\n    uint8_t rx_ff_buf[CFG_TUD_MIDI_RX_BUFSIZE];\n    uint8_t tx_ff_buf[CFG_TUD_MIDI_TX_BUFSIZE];\n  } ep_stream;\n} midid_interface_t;\n\n#define ITF_MEM_RESET_SIZE offsetof(midid_interface_t, ep_stream)\n\nstatic midid_interface_t _midid_itf[CFG_TUD_MIDI];\n\n  #if CFG_TUD_EDPT_DEDICATED_HWFIFO == 0\n// Endpoint Transfer buffer: not used if dedicated hw FIFO is available\ntypedef struct {\n  TUD_EPBUF_DEF(epin, CFG_TUD_MIDI_TX_EPSIZE);\n  TUD_EPBUF_DEF(epout, CFG_TUD_MIDI_RX_EPSIZE);\n} midid_epbuf_t;\n\nCFG_TUD_MEM_SECTION static midid_epbuf_t _midid_epbuf[CFG_TUD_MIDI];\n  #endif\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nbool tud_midi_n_mounted (uint8_t itf) {\n  midid_interface_t *p_midi = &_midid_itf[itf];\n  const bool tx_opened = tu_edpt_stream_is_opened(&p_midi->ep_stream.tx);\n  const bool rx_opened = tu_edpt_stream_is_opened(&p_midi->ep_stream.rx);\n  return tx_opened && rx_opened;\n}\n\n//--------------------------------------------------------------------+\n// READ API\n//--------------------------------------------------------------------+\nuint32_t tud_midi_n_available(uint8_t itf, uint8_t cable_num) {\n  (void) cable_num;\n  const midid_interface_t    *p_midi = &_midid_itf[itf];\n  const midi_driver_stream_t *stream = &p_midi->stream_read;\n  const tu_edpt_stream_t     *ep_str = &p_midi->ep_stream.rx;\n\n  // when using with packet API stream total & index are both zero\n  return tu_edpt_stream_read_available(ep_str) + (uint8_t)(stream->total - stream->index);\n}\n\nuint32_t tud_midi_n_stream_read(uint8_t itf, uint8_t cable_num, void *buffer, uint32_t bufsize) {\n  (void) cable_num;\n  TU_VERIFY(buffer != NULL && bufsize > 0, 0);\n\n  uint8_t              *buf8   = (uint8_t *)buffer;\n  midid_interface_t    *p_midi = &_midid_itf[itf];\n  midi_driver_stream_t *stream = &p_midi->stream_read;\n\n  uint32_t total_read = 0;\n  while (bufsize > 0) {\n    // Get new packet from fifo, then set packet expected bytes\n    if (stream->total == 0) {\n      if (!tud_midi_n_packet_read(itf, stream->buffer)) {\n        return total_read; // return if there is no more data from fifo\n      }\n\n      const uint8_t code_index = stream->buffer[0] & 0x0f;\n\n      // MIDI 1.0 Table 4-1: Code Index Number Classifications\n      switch (code_index) {\n        case MIDI_CIN_MISC:\n        case MIDI_CIN_CABLE_EVENT:\n          // These are reserved and unused, possibly issue somewhere, skip this packet\n          return 0;\n\n        case MIDI_CIN_SYSEX_END_1BYTE:\n        case MIDI_CIN_1BYTE_DATA:\n          stream->total = 1;\n          break;\n\n        case MIDI_CIN_SYSCOM_2BYTE     :\n        case MIDI_CIN_SYSEX_END_2BYTE  :\n        case MIDI_CIN_PROGRAM_CHANGE   :\n        case MIDI_CIN_CHANNEL_PRESSURE :\n          stream->total = 2;\n          break;\n\n        default:\n          stream->total = 3;\n          break;\n      }\n    }\n\n    // Copy data up to bufsize\n    const uint8_t count = (uint8_t)tu_min32((uint32_t)(stream->total - stream->index), bufsize);\n\n    // Skip the header (1st byte) in the buffer\n    TU_VERIFY(0 == tu_memcpy_s(buf8, bufsize, stream->buffer + 1 + stream->index, count));\n\n    total_read += count;\n    stream->index += count;\n    buf8 += count;\n    bufsize -= count;\n\n    // complete current event packet, reset stream\n    if (stream->total == stream->index) {\n      stream->index = 0;\n      stream->total = 0;\n    }\n  }\n\n  return total_read;\n}\n\n// Note: this function shares stream->buffer with tud_midi_n_stream_read().\n// Do not mix calls to both functions on the same interface.\nuint32_t tud_midi_n_demux_stream_read(uint8_t itf, uint8_t *p_cable_num, void *buffer, uint32_t bufsize) {\n  TU_VERIFY(p_cable_num != NULL && buffer != NULL && bufsize > 0, 0);\n\n  midid_interface_t    *p_midi = &_midid_itf[itf];\n  midi_driver_stream_t *stream = &p_midi->stream_read;\n  tu_edpt_stream_t     *ep_str = &p_midi->ep_stream.rx;\n\n  uint8_t  *buf8 = (uint8_t *)buffer;\n  uint32_t total_read = 0;\n\n  // Initialize to invalid cable so callers can detect \"no data\" even when\n  // the return value is 0.\n  *p_cable_num = 0xff;\n\n  // If there are leftover bytes from a previous partial read, return them first\n  if (stream->total > 0) {\n    *p_cable_num = (stream->buffer[0] >> 4) & 0x0f;\n    const uint8_t count = (uint8_t)tu_min32((uint32_t)(stream->total - stream->index), bufsize);\n    TU_VERIFY(0 == tu_memcpy_s(buf8, bufsize, stream->buffer + 1 + stream->index, count));\n\n    total_read += count;\n    stream->index += count;\n    buf8 += count;\n    bufsize -= count;\n\n    if (stream->total == stream->index) {\n      stream->index = 0;\n      stream->total = 0;\n    }\n\n    if (bufsize == 0) {\n      return total_read;\n    }\n  }\n\n  while (bufsize > 0) {\n    // Peek at next packet header to get cable number without consuming\n    uint8_t one_byte;\n    if (!tu_edpt_stream_peek(ep_str, &one_byte)) {\n      break;\n    }\n\n    const uint8_t next_cable = (one_byte >> 4) & 0x0f;\n\n    // Stop if cable changed (covers both leftover-originated reads and\n    // freshly consumed packets — total_read > 0 in either case)\n    if (total_read > 0 && next_cable != *p_cable_num) {\n      break;\n    }\n    *p_cable_num = next_cable;\n\n    // Consume the packet\n    if (!tud_midi_n_packet_read(itf, stream->buffer)) {\n      break;\n    }\n\n    const uint8_t code_index = stream->buffer[0] & 0x0f;\n    uint8_t msg_bytes;\n\n    // MIDI 1.0 Table 4-1: Code Index Number Classifications\n    switch (code_index) {\n      case MIDI_CIN_MISC:\n      case MIDI_CIN_CABLE_EVENT:\n        // Reserved and unused, skip this packet\n        continue;\n\n      case MIDI_CIN_SYSEX_END_1BYTE:\n      case MIDI_CIN_1BYTE_DATA:\n        msg_bytes = 1;\n        break;\n\n      case MIDI_CIN_SYSCOM_2BYTE:\n      case MIDI_CIN_SYSEX_END_2BYTE:\n      case MIDI_CIN_PROGRAM_CHANGE:\n      case MIDI_CIN_CHANNEL_PRESSURE:\n        msg_bytes = 2;\n        break;\n\n      default:\n        msg_bytes = 3;\n        break;\n    }\n\n    const uint8_t count = (uint8_t)tu_min32((uint32_t)msg_bytes, bufsize);\n    TU_VERIFY(0 == tu_memcpy_s(buf8, bufsize, stream->buffer + 1, count));\n\n    total_read += count;\n    buf8 += count;\n    bufsize -= count;\n\n    if (count < msg_bytes) {\n      // Output buffer full, save remaining for next call\n      stream->total = msg_bytes;\n      stream->index = count;\n    }\n  }\n\n  return total_read;\n}\n\nbool tud_midi_n_packet_read(uint8_t itf, uint8_t packet[4]) {\n  midid_interface_t *p_midi = &_midid_itf[itf];\n  tu_edpt_stream_t  *ep_str = &p_midi->ep_stream.rx;\n  return 4 == tu_edpt_stream_read(ep_str, packet, 4);\n}\n\nuint32_t tud_midi_n_packet_read_n(uint8_t itf, uint8_t packets[], uint32_t max_packets) {\n  midid_interface_t *p_midi = &_midid_itf[itf];\n  tu_edpt_stream_t  *ep_str = &p_midi->ep_stream.rx;\n  const uint32_t num_read = tu_edpt_stream_read(ep_str, packets, 4u * max_packets);\n  return num_read >> 2u;\n}\n\n//--------------------------------------------------------------------+\n// WRITE API\n//--------------------------------------------------------------------+\nuint32_t tud_midi_n_stream_write(uint8_t itf, uint8_t cable_num, const uint8_t *buffer, uint32_t bufsize) {\n  midid_interface_t *p_midi = &_midid_itf[itf];\n  midi_driver_stream_t *stream = &p_midi->stream_write;\n  tu_edpt_stream_t  *ep_str = &p_midi->ep_stream.tx;\n  TU_VERIFY(tu_edpt_stream_is_opened(ep_str), 0);\n\n  uint32_t i = 0;\n  while (i < bufsize) {\n    if (tu_edpt_stream_write_available(ep_str) < 4) {\n      break;\n    }\n\n    const uint8_t data = buffer[i];\n    i++;\n\n    if (stream->index == 0) {\n      //------------- New event packet -------------//\n      const uint8_t msg = data >> 4;\n\n      stream->index     = 2;\n      stream->buffer[1] = data;\n\n      // Check to see if we're still in a SysEx transmit.\n      if (((stream->buffer[0]) & 0xF) == MIDI_CIN_SYSEX_START) {\n        if (data == MIDI_STATUS_SYSEX_END) {\n          stream->buffer[0] = (uint8_t)((cable_num << 4) | MIDI_CIN_SYSEX_END_1BYTE);\n          stream->total     = 2;\n        } else {\n          stream->total = 4;\n        }\n      } else if ((msg >= 0x8 && msg <= 0xB) || msg == 0xE) {\n        // Channel Voice Messages\n        stream->buffer[0] = (uint8_t)((cable_num << 4) | msg);\n        stream->total     = 4;\n      } else if (msg == 0xC || msg == 0xD) {\n        // Channel Voice Messages, two-byte variants (Program Change and Channel Pressure)\n        stream->buffer[0] = (uint8_t)((cable_num << 4) | msg);\n        stream->total     = 3;\n      } else if (msg == 0xf) {\n        // System message\n        if (data == MIDI_STATUS_SYSEX_START) {\n          stream->buffer[0] = MIDI_CIN_SYSEX_START;\n          stream->total     = 4;\n        } else if (data == MIDI_STATUS_SYSCOM_TIME_CODE_QUARTER_FRAME || data == MIDI_STATUS_SYSCOM_SONG_SELECT) {\n          stream->buffer[0] = MIDI_CIN_SYSCOM_2BYTE;\n          stream->total     = 3;\n        } else if (data == MIDI_STATUS_SYSCOM_SONG_POSITION_POINTER) {\n          stream->buffer[0] = MIDI_CIN_SYSCOM_3BYTE;\n          stream->total     = 4;\n        } else {\n          stream->buffer[0] = MIDI_CIN_SYSEX_END_1BYTE;\n          stream->total     = 2;\n        }\n        stream->buffer[0] |= (uint8_t)(cable_num << 4);\n      } else {\n        // Pack individual bytes if we don't support packing them into words.\n        stream->buffer[0] = (uint8_t)(cable_num << 4 | 0xf);\n        stream->buffer[2] = 0;\n        stream->buffer[3] = 0;\n        stream->total     = 2; // index already set to 2\n      }\n    } else {\n      //------------- On-going (buffering) packet -------------//\n      TU_ASSERT(stream->index < 4, i);\n      stream->buffer[stream->index] = data;\n      stream->index++;\n\n      // See if this byte ends a SysEx.\n      if ((stream->buffer[0] & 0xF) == MIDI_CIN_SYSEX_START && data == MIDI_STATUS_SYSEX_END) {\n        stream->buffer[0] = (uint8_t)((cable_num << 4) | (MIDI_CIN_SYSEX_START + (stream->index - 1)));\n        stream->total     = stream->index;\n      }\n    }\n\n    // Send out packet\n    if (stream->index == stream->total) {\n      // zeroes unused bytes\n      for (uint8_t idx = stream->total; idx < 4; idx++) {\n        stream->buffer[idx] = 0;\n      }\n\n      const uint32_t count = tu_edpt_stream_write(ep_str, stream->buffer, 4);\n\n      // complete current event packet, reset stream\n      stream->index = stream->total = 0;\n\n      // FIFO overflown, since we already check fifo remaining. It is probably race condition\n      TU_ASSERT(count == 4, i);\n    }\n  }\n\n  (void)tu_edpt_stream_write_xfer(ep_str);\n\n  return i;\n}\n\nbool tud_midi_n_packet_write (uint8_t itf, const uint8_t packet[4]) {\n  midid_interface_t *p_midi = &_midid_itf[itf];\n  tu_edpt_stream_t  *ep_str = &p_midi->ep_stream.tx;\n  TU_VERIFY(tu_edpt_stream_is_opened(ep_str));\n\n  TU_VERIFY(tu_edpt_stream_write_available(ep_str) >= 4);\n  TU_VERIFY(tu_edpt_stream_write(ep_str, packet, 4) > 0);\n  (void)tu_edpt_stream_write_xfer(ep_str);\n\n  return true;\n}\n\nuint32_t tud_midi_n_packet_write_n(uint8_t itf, const uint8_t packets[], uint32_t n_packets) {\n  midid_interface_t *p_midi = &_midid_itf[itf];\n  tu_edpt_stream_t  *ep_str = &p_midi->ep_stream.tx;\n  TU_VERIFY(tu_edpt_stream_is_opened(ep_str), 0);\n\n  uint32_t n_bytes = tu_edpt_stream_write_available(ep_str);\n  n_bytes          = tu_min32(tu_align4(n_bytes), n_packets << 2u);\n\n  const uint32_t n_write = tu_edpt_stream_write(ep_str, packets, n_bytes);\n  (void)tu_edpt_stream_write_xfer(ep_str);\n\n  return n_write >> 2u;\n}\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid midid_init(void) {\n  tu_memclr(_midid_itf, sizeof(_midid_itf));\n  for (uint8_t i = 0; i < CFG_TUD_MIDI; i++) {\n    midid_interface_t *p_midi  = &_midid_itf[i];\n\n  #if CFG_TUD_EDPT_DEDICATED_HWFIFO\n    uint8_t *epout_buf = NULL;\n    uint8_t *epin_buf  = NULL;\n  #else\n    midid_epbuf_t     *p_epbuf = &_midid_epbuf[i];\n    uint8_t       *epout_buf = p_epbuf->epout;\n    uint8_t       *epin_buf  = p_epbuf->epin;\n  #endif\n\n    tu_edpt_stream_init(&p_midi->ep_stream.rx, false, false, false, p_midi->ep_stream.rx_ff_buf,\n                        CFG_TUD_MIDI_RX_BUFSIZE, epout_buf);\n\n    tu_edpt_stream_init(&p_midi->ep_stream.tx, false, true, false, p_midi->ep_stream.tx_ff_buf, CFG_TUD_MIDI_TX_BUFSIZE,\n                        epin_buf);\n  }\n}\n\nbool midid_deinit(void) {\n  for (uint8_t i = 0; i < CFG_TUD_MIDI; i++) {\n    midid_interface_t *p_midi = &_midid_itf[i];\n    tu_edpt_stream_deinit(&p_midi->ep_stream.rx);\n    tu_edpt_stream_deinit(&p_midi->ep_stream.tx);\n  }\n  return true;\n}\n\nvoid midid_reset(uint8_t rhport) {\n  (void)rhport;\n  for (uint8_t i = 0; i < CFG_TUD_MIDI; i++) {\n    midid_interface_t *p_midi = &_midid_itf[i];\n    tu_memclr(p_midi, ITF_MEM_RESET_SIZE);\n\n    tu_edpt_stream_clear(&p_midi->ep_stream.rx);\n    tu_edpt_stream_close(&p_midi->ep_stream.rx);\n\n    tu_edpt_stream_clear(&p_midi->ep_stream.tx);\n    tu_edpt_stream_close(&p_midi->ep_stream.tx);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t find_midi_itf(uint8_t ep_addr) {\n  for (uint8_t idx = 0; idx < CFG_TUD_MIDI; idx++) {\n    const midid_interface_t *p_midi = &_midid_itf[idx];\n    if (ep_addr == p_midi->ep_stream.rx.ep_addr || ep_addr == p_midi->ep_stream.tx.ep_addr) {\n      return idx;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\nuint16_t midid_open(uint8_t rhport, const tusb_desc_interface_t *desc_itf, uint16_t max_len) {\n  const uint8_t *p_desc   = (const uint8_t *)desc_itf;\n  const uint8_t *desc_end = p_desc + max_len;\n\n  // 1st Interface is Audio Control v1 (optional)\n  if (TUSB_CLASS_AUDIO               == desc_itf->bInterfaceClass    &&\n      AUDIO_SUBCLASS_CONTROL         == desc_itf->bInterfaceSubClass &&\n      AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_itf->bInterfaceProtocol) {\n    p_desc = tu_desc_next(desc_itf);\n    // Skip Class Specific descriptors\n    while (tu_desc_in_bounds(p_desc, desc_end) && TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc)) {\n      p_desc = tu_desc_next(p_desc);\n    }\n  }\n\n  // 2nd Interface is MIDI Streaming\n  TU_VERIFY(TUSB_DESC_INTERFACE == tu_desc_type(p_desc), 0);\n  const tusb_desc_interface_t* desc_midi = (const tusb_desc_interface_t*) p_desc;\n\n  TU_VERIFY(TUSB_CLASS_AUDIO == desc_midi->bInterfaceClass &&\n              AUDIO_SUBCLASS_MIDI_STREAMING == desc_midi->bInterfaceSubClass &&\n              AUDIO_FUNC_PROTOCOL_CODE_UNDEF == desc_midi->bInterfaceProtocol,\n            0);\n\n  uint8_t idx = find_midi_itf(0); // find unused interface\n  TU_ASSERT(idx < CFG_TUD_MIDI, 0);\n  midid_interface_t *p_midi = &_midid_itf[idx];\n\n  p_midi->rhport  = rhport;\n  p_midi->itf_num = desc_midi->bInterfaceNumber;\n  (void) p_midi->itf_num;\n\n  p_desc = tu_desc_next(p_desc);\n\n  // Find and open endpoint descriptors\n  uint8_t found_ep = 0;\n  while ((found_ep < desc_midi->bNumEndpoints) && tu_desc_in_bounds(p_desc, desc_end)) {\n    if (TUSB_DESC_ENDPOINT == tu_desc_type(p_desc)) {\n      const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)p_desc;\n      TU_ASSERT(usbd_edpt_open(rhport, desc_ep), 0);\n      const uint8_t ep_addr = ((const tusb_desc_endpoint_t *)p_desc)->bEndpointAddress;\n\n      if (tu_edpt_dir(ep_addr) == TUSB_DIR_IN) {\n        tu_edpt_stream_t *stream_tx = &p_midi->ep_stream.tx;\n        tu_edpt_stream_open(stream_tx, rhport, desc_ep, CFG_TUD_MIDI_TX_EPSIZE);\n        tu_edpt_stream_clear(stream_tx);\n      } else {\n        tu_edpt_stream_t *stream_rx = &p_midi->ep_stream.rx;\n        tu_edpt_stream_open(stream_rx, rhport, desc_ep, tu_edpt_packet_size(desc_ep));\n        tu_edpt_stream_clear(stream_rx);\n        TU_ASSERT(tu_edpt_stream_read_xfer(stream_rx) > 0, 0);         // prepare to receive data\n      }\n\n      p_desc = tu_desc_next(p_desc);                                   // skip CS Endpoint descriptor\n      found_ep++;\n    }\n\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  return (uint16_t)(p_desc - (const uint8_t *)desc_itf);\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool midid_control_xfer_cb(uint8_t rhport, uint8_t stage, const tusb_control_request_t* request) {\n  (void) rhport; (void) stage; (void) request;\n  return false; // driver doesn't support any request yet\n}\n\nbool midid_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void)rhport;\n  (void)result;\n\n  uint8_t idx = find_midi_itf(ep_addr);\n  TU_ASSERT(idx < CFG_TUD_MIDI);\n  midid_interface_t *p_midi = &_midid_itf[idx];\n\n  tu_edpt_stream_t *ep_st_rx = &p_midi->ep_stream.rx;\n  tu_edpt_stream_t *ep_st_tx = &p_midi->ep_stream.tx;\n\n  if (ep_addr == ep_st_rx->ep_addr) {\n    // Received new data: put into stream's fifo\n    if (result == XFER_RESULT_SUCCESS) {\n      tu_edpt_stream_read_xfer_complete(ep_st_rx, xferred_bytes);\n      tud_midi_rx_cb(idx);                      // invoke callback\n    }\n    tu_edpt_stream_read_xfer(ep_st_rx);         // prepare for next data\n  } else if (ep_addr == ep_st_tx->ep_addr && result == XFER_RESULT_SUCCESS) {\n    // sent complete: try to send more if possible\n    if (0 == tu_edpt_stream_write_xfer(ep_st_tx)) {\n      // If there is no data left, a ZLP should be sent if needed\n      (void)tu_edpt_stream_write_zlp_if_needed(ep_st_tx, xferred_bytes);\n    }\n  } else {\n    return false;\n  }\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/midi/midi_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MIDI_DEVICE_H_\n#define TUSB_MIDI_DEVICE_H_\n\n#include \"class/audio/audio.h\"\n#include \"midi.h\"\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n\n#ifndef CFG_TUD_MIDI_RX_EPSIZE\n  #ifdef CFG_TUD_MIDI_EP_BUFSIZE\n    #define CFG_TUD_MIDI_RX_EPSIZE CFG_TUD_MIDI_EP_BUFSIZE\n  #else\n    #define CFG_TUD_MIDI_RX_EPSIZE TUD_EPSIZE_BULK_MAX\n  #endif\n#endif\n\n#ifndef CFG_TUD_MIDI_TX_EPSIZE\n  #ifdef CFG_TUD_MIDI_EP_BUFSIZE\n    #define CFG_TUD_MIDI_TX_EPSIZE CFG_TUD_MIDI_EP_BUFSIZE\n  #else\n    #define CFG_TUD_MIDI_TX_EPSIZE TUD_EPSIZE_BULK_MAX\n  #endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Application Callback API (optional)\n//--------------------------------------------------------------------+\nvoid tud_midi_rx_cb(uint8_t itf);\n\n//--------------------------------------------------------------------+\n// Application API (Multiple Interfaces)\n// CFG_TUD_MIDI > 1\n//--------------------------------------------------------------------+\n\n// Check if midi interface is mounted\nbool tud_midi_n_mounted(uint8_t itf);\n\n// Get the number of bytes available for reading\nuint32_t tud_midi_n_available(uint8_t itf, uint8_t cable_num);\n\n// Read byte stream (legacy)\nuint32_t tud_midi_n_stream_read(uint8_t itf, uint8_t cable_num, void *buffer, uint32_t bufsize);\n\n// Read byte stream with cable demultiplexing: returns the cable number of the\n// data that was read.  Reads from a single cable per call; stops when the next\n// packet belongs to a different cable so the caller can dispatch per-cable.\n// Note: shares internal state with tud_midi_n_stream_read(); do not mix both\n// on the same interface.\nuint32_t tud_midi_n_demux_stream_read(uint8_t itf, uint8_t *p_cable_num, void *buffer, uint32_t bufsize);\n\n// Write byte Stream (legacy)\nuint32_t tud_midi_n_stream_write(uint8_t itf, uint8_t cable_num, const uint8_t *buffer, uint32_t bufsize);\n\n// Read an event 4-byte packet\nbool tud_midi_n_packet_read(uint8_t itf, uint8_t packet[4]);\n\n// Read multiple event packets, return number of read packets\nuint32_t tud_midi_n_packet_read_n(uint8_t itf, uint8_t packets[], uint32_t max_packets);\n\n// Write an event 4-byte packet\nbool tud_midi_n_packet_write(uint8_t itf, const uint8_t packet[4]);\n\n// Write multiple event packets, return number of written packets\nuint32_t tud_midi_n_packet_write_n(uint8_t itf, const uint8_t packets[], uint32_t n_packets);\n\n//--------------------------------------------------------------------+\n// Application API (Single Interface)\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline bool tud_midi_mounted(void) {\n  return tud_midi_n_mounted(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_midi_available(void) {\n  return tud_midi_n_available(0, 0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_midi_stream_read(void *buffer, uint32_t bufsize) {\n  return tud_midi_n_stream_read(0, 0, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t\ntud_midi_demux_stream_read(uint8_t *p_cable_num, void *buffer, uint32_t bufsize) {\n  return tud_midi_n_demux_stream_read(0, p_cable_num, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t\ntud_midi_stream_write(uint8_t cable_num, const uint8_t *buffer, uint32_t bufsize) {\n  return tud_midi_n_stream_write(0, cable_num, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_midi_packet_read(uint8_t packet[4]) {\n  return tud_midi_n_packet_read(0, packet);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_midi_packet_read_n(uint8_t packets[], uint32_t max_packets) {\n  return tud_midi_n_packet_read_n(0, packets, max_packets);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_midi_packet_write(const uint8_t packet[4]) {\n  return tud_midi_n_packet_write(0, packet);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_midi_packet_write_n(const uint8_t packets[], uint32_t n_packets) {\n  return tud_midi_n_packet_write_n(0, packets, n_packets);\n}\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     midid_init(void);\nbool     midid_deinit(void);\nvoid     midid_reset(uint8_t rhport);\nuint16_t midid_open(uint8_t rhport, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nbool     midid_control_xfer_cb(uint8_t rhport, uint8_t stage, const tusb_control_request_t *request);\nbool     midid_xfer_cb(uint8_t rhport, uint8_t edpt_addr, xfer_result_t result, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/class/midi/midi_host.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUH_ENABLED && CFG_TUH_MIDI)\n\n#include \"host/usbh.h\"\n#include \"host/usbh_pvt.h\"\n\n#include \"midi_host.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUH_MIDI_LOG_LEVEL\n  #define CFG_TUH_MIDI_LOG_LEVEL   CFG_TUH_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUH_MIDI_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tuh_midi_descriptor_cb(uint8_t idx, const tuh_midi_descriptor_cb_t * desc_cb_data) { (void) idx; (void) desc_cb_data; }\nTU_ATTR_WEAK void tuh_midi_mount_cb(uint8_t idx, const tuh_midi_mount_cb_t* mount_cb_data) { (void) idx; (void) mount_cb_data; }\nTU_ATTR_WEAK void tuh_midi_umount_cb(uint8_t idx) { (void) idx; }\nTU_ATTR_WEAK void tuh_midi_rx_cb(uint8_t idx, uint32_t xferred_bytes) { (void) idx; (void) xferred_bytes; }\nTU_ATTR_WEAK void tuh_midi_tx_cb(uint8_t idx, uint32_t xferred_bytes) { (void) idx; (void) xferred_bytes; }\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\ntypedef struct {\n  uint8_t daddr;\n  uint8_t bInterfaceNumber; // interface number of MIDI streaming\n  uint8_t iInterface;\n  uint8_t itf_count;        // number of interfaces including Audio Control + MIDI streaming\n\n  uint8_t rx_cable_count;  // IN endpoint CS descriptor bNumEmbMIDIJack value\n  uint8_t tx_cable_count;  // OUT endpoint CS descriptor bNumEmbMIDIJack value\n\n  #if CFG_TUH_MIDI_STREAM_API\n  // For Stream read()/write() API\n  // Messages are always 4 bytes long, queue them for reading and writing so the\n  // callers can use the Stream interface with single-byte read/write calls.\n  midi_driver_stream_t stream_write;\n  midi_driver_stream_t stream_read;\n  #endif\n\n  // Endpoint stream\n  struct {\n    tu_edpt_stream_t tx;\n    tu_edpt_stream_t rx;\n\n    uint8_t rx_ff_buf[CFG_TUH_MIDI_RX_BUFSIZE];\n    uint8_t tx_ff_buf[CFG_TUH_MIDI_TX_BUFSIZE];\n  } ep_stream;\n\n  bool mounted;\n}midih_interface_t;\n\ntypedef struct {\n  TUH_EPBUF_DEF(tx, TUH_EPSIZE_BULK_MAX);\n  TUH_EPBUF_DEF(rx, TUH_EPSIZE_BULK_MAX);\n} midih_epbuf_t;\n\nstatic midih_interface_t _midi_host[CFG_TUH_MIDI];\nCFG_TUH_MEM_SECTION static midih_epbuf_t _midi_epbuf[CFG_TUH_MIDI];\n\n//--------------------------------------------------------------------+\n// Helper\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline uint8_t find_new_midi_index(void) {\n  for (uint8_t idx = 0; idx < CFG_TUH_MIDI; idx++) {\n    if (_midi_host[idx].daddr == 0) {\n      return idx;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\nstatic inline uint8_t get_idx_by_ep_addr(uint8_t daddr, uint8_t ep_addr) {\n  for (uint8_t idx = 0; idx < CFG_TUH_MIDI; idx++) {\n    const midih_interface_t *p_midi = &_midi_host[idx];\n    if ((p_midi->daddr == daddr) &&\n        (ep_addr == p_midi->ep_stream.rx.ep_addr || ep_addr == p_midi->ep_stream.tx.ep_addr)) {\n      return idx;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\n//--------------------------------------------------------------------+\n// USBH API\n//--------------------------------------------------------------------+\nbool midih_init(void) {\n  tu_memclr(&_midi_host, sizeof(_midi_host));\n  for (int inst = 0; inst < CFG_TUH_MIDI; inst++) {\n    midih_interface_t *p_midi_host = &_midi_host[inst];\n    tu_edpt_stream_init(&p_midi_host->ep_stream.rx, true, false, false,\n      p_midi_host->ep_stream.rx_ff_buf, CFG_TUH_MIDI_RX_BUFSIZE, _midi_epbuf[inst].rx);\n    tu_edpt_stream_init(&p_midi_host->ep_stream.tx, true, true, false,\n      p_midi_host->ep_stream.tx_ff_buf, CFG_TUH_MIDI_TX_BUFSIZE, _midi_epbuf[inst].tx);\n  }\n  return true;\n}\n\nbool midih_deinit(void) {\n  for (size_t i = 0; i < CFG_TUH_MIDI; i++) {\n    midih_interface_t* p_midi = &_midi_host[i];\n    tu_edpt_stream_deinit(&p_midi->ep_stream.rx);\n    tu_edpt_stream_deinit(&p_midi->ep_stream.tx);\n  }\n  return true;\n}\n\nvoid midih_close(uint8_t daddr) {\n  for (uint8_t idx = 0; idx < CFG_TUH_MIDI; idx++) {\n    midih_interface_t* p_midi = &_midi_host[idx];\n    if (p_midi->daddr == daddr) {\n      TU_LOG_DRV(\"  MIDI close addr = %u index = %u\\r\\n\", daddr, idx);\n      tuh_midi_umount_cb(idx);\n\n      p_midi->bInterfaceNumber = 0;\n      p_midi->rx_cable_count = 0;\n      p_midi->tx_cable_count = 0;\n      p_midi->daddr = 0;\n      p_midi->mounted = false;\n#if CFG_TUH_MIDI_STREAM_API\n      tu_memclr(&p_midi->stream_read, sizeof(p_midi->stream_read));\n      tu_memclr(&p_midi->stream_write, sizeof(p_midi->stream_write));\n#endif\n      tu_edpt_stream_close(&p_midi->ep_stream.rx);\n      tu_edpt_stream_close(&p_midi->ep_stream.tx);\n    }\n  }\n}\n\nbool midih_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void) result;\n  const uint8_t idx = get_idx_by_ep_addr(dev_addr, ep_addr);\n  TU_VERIFY(idx < CFG_TUH_MIDI);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  tu_edpt_stream_t  *ep_str_rx = &p_midi->ep_stream.rx;\n  tu_edpt_stream_t  *ep_str_tx = &p_midi->ep_stream.tx;\n\n  if (ep_addr == ep_str_rx->ep_addr) {\n    // receive new data, put it into FIFO and invoke callback if available\n    // Note: some devices send back all zero packets even if there is no data ready\n    if (xferred_bytes && !tu_mem_is_zero(ep_str_rx->ep_buf, xferred_bytes)) {\n      tu_edpt_stream_read_xfer_complete(ep_str_rx, xferred_bytes);\n      tuh_midi_rx_cb(idx, xferred_bytes);\n    }\n\n    tu_edpt_stream_read_xfer(ep_str_rx); // prepare for next transfer\n  } else if (ep_addr == ep_str_tx->ep_addr) {\n    tuh_midi_tx_cb(idx, xferred_bytes);\n\n    if (0 == tu_edpt_stream_write_xfer(ep_str_tx)) {\n      // If there is no data left, a ZLP should be sent if\n      // xferred_bytes is multiple of EP size and not zero\n      tu_edpt_stream_write_zlp_if_needed(ep_str_tx, xferred_bytes);\n    }\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Enumeration\n//--------------------------------------------------------------------+\nuint16_t midih_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *desc_itf, uint16_t max_len) {\n  (void) rhport;\n\n  TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass, 0);\n  const uint8_t *desc_start = (const uint8_t *)desc_itf;\n  const uint8_t *p_desc     = desc_start;\n  const uint8_t *desc_end   = desc_start + max_len;\n\n  const uint8_t idx = find_new_midi_index();\n  TU_VERIFY(idx < CFG_TUH_MIDI, 0);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  p_midi->itf_count = 0;\n\n  tuh_midi_descriptor_cb_t desc_cb = { 0 };\n  desc_cb.jack_num = 0;\n\n  // There can be just a MIDI or an Audio + MIDI interface\n  // - If there is Audio Control Interface + Audio Header descriptor, then skip it.\n  // - If there is an Audio Control Interface + Audio Streaming Interface, then ignore the Audio Streaming Interface.\n  // Future:\n  // Note that if this driver is used with an USB Audio Streaming host driver,\n  // then call that driver first. If the MIDI interface comes before the\n  // audio streaming interface, then the audio driver will have to call this\n  // driver after parsing the audio control interface and then resume parsing\n  // the streaming audio interface.\n  if (AUDIO_SUBCLASS_CONTROL == desc_itf->bInterfaceSubClass) {\n    TU_VERIFY(max_len > 2 * sizeof(tusb_desc_interface_t) + sizeof(midi10_desc_cs_ac_interface_t), 0);\n    p_desc = tu_desc_next(p_desc);\n    TU_VERIFY(tu_desc_type(p_desc) == TUSB_DESC_CS_INTERFACE &&\n                tu_desc_subtype(p_desc) == AUDIO10_CS_AC_INTERFACE_HEADER,\n              0);\n    desc_cb.desc_audio_control = desc_itf;\n\n    p_desc = tu_desc_next(p_desc);\n    desc_itf = (const tusb_desc_interface_t *)p_desc;\n    p_midi->itf_count = 1;\n    // skip non-interface and non-midi streaming descriptors\n    while (tu_desc_in_bounds(p_desc, desc_end) && (desc_itf->bDescriptorType != TUSB_DESC_INTERFACE ||\n                                                   (desc_itf->bInterfaceClass == TUSB_CLASS_AUDIO &&\n                                                    desc_itf->bInterfaceSubClass != AUDIO_SUBCLASS_MIDI_STREAMING))) {\n      if (desc_itf->bDescriptorType == TUSB_DESC_INTERFACE && desc_itf->bAlternateSetting == 0) {\n        p_midi->itf_count++;\n      }\n      p_desc = tu_desc_next(p_desc);\n      desc_itf = (const tusb_desc_interface_t *)p_desc;\n    }\n    TU_VERIFY(p_desc < desc_end, 0);\n    TU_VERIFY(TUSB_CLASS_AUDIO == desc_itf->bInterfaceClass, 0);\n  }\n  TU_VERIFY(AUDIO_SUBCLASS_MIDI_STREAMING == desc_itf->bInterfaceSubClass, 0);\n\n  TU_LOG_DRV(\"MIDI opening Interface %u (addr = %u)\\r\\n\", desc_itf->bInterfaceNumber, dev_addr);\n  p_midi->bInterfaceNumber = desc_itf->bInterfaceNumber;\n  p_midi->iInterface = desc_itf->iInterface;\n  p_midi->itf_count++;\n  desc_cb.desc_midi = desc_itf;\n\n  bool found_new_interface = false;\n  do {\n    p_desc = tu_desc_next(p_desc);\n    if (!tu_desc_in_bounds(p_desc, desc_end)) {\n      break;\n    }\n    switch (tu_desc_type(p_desc)) {\n      case TUSB_DESC_INTERFACE:\n        found_new_interface = true;\n        break;\n\n      case TUSB_DESC_CS_INTERFACE:\n        switch (tu_desc_subtype(p_desc)) {\n          case MIDI_CS_INTERFACE_HEADER:\n            TU_LOG_DRV(\"  Interface Header descriptor\\r\\n\");\n            desc_cb.desc_header = p_desc;\n            break;\n\n          case MIDI_CS_INTERFACE_IN_JACK:\n          case MIDI_CS_INTERFACE_OUT_JACK: {\n            TU_LOG_DRV(\"  Jack %s %s descriptor \\r\\n\",\n                       tu_desc_subtype(p_desc) == MIDI_CS_INTERFACE_IN_JACK ? \"IN\" : \"OUT\",\n                       p_desc[3] == MIDI_JACK_EXTERNAL ? \"External\" : \"Embedded\");\n            if (desc_cb.jack_num < TU_ARRAY_SIZE(desc_cb.desc_jack)) {\n                desc_cb.desc_jack[desc_cb.jack_num++] = p_desc;\n            }\n            break;\n          }\n\n          case MIDI_CS_INTERFACE_ELEMENT:\n            TU_LOG_DRV(\"  Element descriptor\\r\\n\");\n            desc_cb.desc_element = p_desc;\n            break;\n\n          default:\n            TU_LOG_DRV(\"  Unknown CS Interface sub-type %u\\r\\n\", tu_desc_subtype(p_desc));\n            break;\n        }\n        break;\n\n      case TUSB_DESC_ENDPOINT: {\n        const tusb_desc_endpoint_t *p_ep = (const tusb_desc_endpoint_t *) p_desc;\n\n        p_desc = tu_desc_next(p_desc); // next to CS endpoint\n        TU_VERIFY(tu_desc_in_bounds(p_desc, desc_end), 0);\n        const midi_desc_cs_endpoint_t *p_csep = (const midi_desc_cs_endpoint_t *) p_desc;\n\n        TU_LOG_DRV(\"  Endpoint and CS_Endpoint descriptor %02x\\r\\n\", p_ep->bEndpointAddress);\n        tu_edpt_stream_t *ep_stream;\n        if (tu_edpt_dir(p_ep->bEndpointAddress) == TUSB_DIR_OUT) {\n          p_midi->tx_cable_count = p_csep->bNumEmbMIDIJack;\n          desc_cb.desc_epout = p_ep;\n          ep_stream              = &p_midi->ep_stream.tx;\n        } else {\n          p_midi->rx_cable_count = p_csep->bNumEmbMIDIJack;\n          desc_cb.desc_epin      = p_ep;\n          ep_stream              = &p_midi->ep_stream.rx;\n        }\n        TU_ASSERT(tuh_edpt_open(dev_addr, p_ep), 0);\n        tu_edpt_stream_open(ep_stream, dev_addr, p_ep, tu_edpt_packet_size(p_ep));\n        tu_edpt_stream_clear(ep_stream);\n\n        break;\n      }\n\n      default: break; // skip unknown descriptor\n    }\n  } while (!found_new_interface);\n\n  desc_cb.desc_midi_total_len = (uint16_t)((uintptr_t)p_desc - (uintptr_t)desc_start);\n\n  p_midi->daddr = dev_addr;\n  tuh_midi_descriptor_cb(idx, &desc_cb);\n\n  return desc_cb.desc_midi_total_len;\n}\n\nbool midih_set_config(uint8_t dev_addr, uint8_t itf_num) {\n  uint8_t idx = tuh_midi_itf_get_index(dev_addr, itf_num);\n  TU_ASSERT(idx < CFG_TUH_MIDI);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  p_midi->mounted = true;\n\n  const tuh_midi_mount_cb_t mount_cb_data = {\n    .daddr = dev_addr,\n    .bInterfaceNumber = p_midi->bInterfaceNumber,\n    .rx_cable_count = p_midi->rx_cable_count,\n    .tx_cable_count = p_midi->tx_cable_count,\n  };\n  tuh_midi_mount_cb(idx, &mount_cb_data);\n\n  tu_edpt_stream_read_xfer(&p_midi->ep_stream.rx); // prepare for incoming data\n\n  // No special config things to do for MIDI\n  usbh_driver_set_config_complete(dev_addr, p_midi->bInterfaceNumber);\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// API\n//--------------------------------------------------------------------+\nbool tuh_midi_mounted(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUH_MIDI);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  return p_midi->mounted;\n}\n\nuint8_t tuh_midi_itf_get_index(uint8_t daddr, uint8_t itf_num) {\n  for (uint8_t idx = 0; idx < CFG_TUH_MIDI; idx++) {\n    const midih_interface_t *p_midi = &_midi_host[idx];\n    if (p_midi->daddr == daddr &&\n        (p_midi->bInterfaceNumber == itf_num ||\n         p_midi->bInterfaceNumber == (uint8_t) (itf_num + p_midi->itf_count - 1))) {\n      return idx;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\nbool tuh_midi_itf_get_info(uint8_t idx, tuh_itf_info_t* info) {\n  midih_interface_t* p_midi = &_midi_host[idx];\n  TU_VERIFY(p_midi && info);\n\n  info->daddr = p_midi->daddr;\n\n  // re-construct descriptor\n  tusb_desc_interface_t* desc = &info->desc;\n  desc->bLength            = sizeof(tusb_desc_interface_t);\n  desc->bDescriptorType    = TUSB_DESC_INTERFACE;\n\n  desc->bInterfaceNumber   = p_midi->bInterfaceNumber;\n  desc->bAlternateSetting = 0;\n  desc->bNumEndpoints     = 0;\n  if (tu_edpt_stream_is_opened(&p_midi->ep_stream.tx)) {\n    desc->bNumEndpoints++;\n  }\n  if (tu_edpt_stream_is_opened(&p_midi->ep_stream.rx)) {\n    desc->bNumEndpoints++;\n  }\n  desc->bInterfaceClass    = TUSB_CLASS_AUDIO;\n  desc->bInterfaceSubClass = AUDIO_SUBCLASS_MIDI_STREAMING;\n  desc->bInterfaceProtocol = 0;\n  desc->iInterface         = p_midi->iInterface;\n\n  return true;\n}\n\nuint8_t tuh_midi_get_tx_cable_count (uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUH_MIDI);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  TU_VERIFY(p_midi->ep_stream.tx.ep_addr != 0, 0);\n  return p_midi->tx_cable_count;\n}\n\nuint8_t tuh_midi_get_rx_cable_count (uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUH_MIDI);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  TU_VERIFY(p_midi->ep_stream.rx.ep_addr != 0, 0);\n  return p_midi->rx_cable_count;\n}\n\nuint32_t tuh_midi_read_available(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUH_MIDI);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  return tu_edpt_stream_read_available(&p_midi->ep_stream.rx);\n}\n\nuint32_t tuh_midi_write_flush(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUH_MIDI);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  return tu_edpt_stream_write_xfer(&p_midi->ep_stream.tx);\n}\n\n//--------------------------------------------------------------------+\n// Packet API\n//--------------------------------------------------------------------+\nuint32_t tuh_midi_packet_read_n(uint8_t idx, uint8_t* buffer, uint32_t bufsize) {\n  TU_VERIFY(idx < CFG_TUH_MIDI && buffer && bufsize > 0, 0);\n  midih_interface_t *p_midi = &_midi_host[idx];\n\n  uint32_t count4 = tu_min32(bufsize, tu_edpt_stream_read_available(&p_midi->ep_stream.rx));\n  count4 = tu_align4(count4); // round down to multiple of 4\n  TU_VERIFY(count4 > 0, 0);\n  return tu_edpt_stream_read(&p_midi->ep_stream.rx, buffer, count4);\n}\n\nuint32_t tuh_midi_packet_write_n(uint8_t idx, const uint8_t* buffer, uint32_t bufsize) {\n  TU_VERIFY(idx < CFG_TUH_MIDI && buffer && bufsize > 0, 0);\n  midih_interface_t *p_midi = &_midi_host[idx];\n\n  const uint32_t bufsize4 = tu_align4(bufsize);\n  TU_VERIFY(bufsize4 > 0, 0);\n  return tu_edpt_stream_write(&p_midi->ep_stream.tx, buffer, bufsize4);\n}\n\n//--------------------------------------------------------------------+\n// Stream API\n//--------------------------------------------------------------------+\n#if CFG_TUH_MIDI_STREAM_API\nuint32_t tuh_midi_stream_write(uint8_t idx, uint8_t cable_num, uint8_t const *buffer, uint32_t bufsize) {\n  TU_VERIFY(idx < CFG_TUH_MIDI && buffer && bufsize > 0);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  TU_VERIFY(cable_num < p_midi->tx_cable_count);\n  midi_driver_stream_t *stream = &p_midi->stream_write;\n\n  uint32_t byte_count = 0;\n  while ((byte_count < bufsize) && (tu_edpt_stream_write_available(&p_midi->ep_stream.tx) >= 4)) {\n    const uint8_t data = buffer[byte_count];\n    byte_count++;\n    if (data >= MIDI_STATUS_SYSREAL_TIMING_CLOCK) {\n      // real-time messages need to be sent right away\n      midi_driver_stream_t streamrt;\n      streamrt.buffer[0] = (uint8_t)((cable_num << 4) | MIDI_CIN_SYSEX_END_1BYTE);\n      streamrt.buffer[1] = data;\n      streamrt.index = 2;\n      streamrt.total = 2;\n      const uint32_t count = tu_edpt_stream_write(&p_midi->ep_stream.tx, streamrt.buffer, 4);\n      TU_ASSERT(count == 4, byte_count); // Check FIFO overflown, since we already check fifo remaining. It is probably race condition\n    } else if (stream->index == 0) {\n      //------------- New event packet -------------//\n\n      uint8_t const msg = data >> 4;\n\n      stream->index = 2;\n      stream->buffer[1] = data;\n\n      // Check to see if we're still in a SysEx transmit.\n      if ((stream->buffer[0] & 0xF) == MIDI_CIN_SYSEX_START) {\n        if (data == MIDI_STATUS_SYSEX_END) {\n          stream->buffer[0] = (uint8_t)((cable_num << 4) | MIDI_CIN_SYSEX_END_1BYTE);\n          stream->total = 2;\n        } else {\n          stream->total = 4;\n        }\n      } else if ((msg >= 0x8 && msg <= 0xB) || msg == 0xE) {\n        // Channel Voice Messages\n        stream->buffer[0] = (uint8_t) ((cable_num << 4) | msg);\n        stream->total = 4;\n      } else if (msg == 0xC || msg == 0xD) {\n        // Channel Voice Messages, two-byte variants (Program Change and Channel Pressure)\n        stream->buffer[0] = (uint8_t) ((cable_num << 4) | msg);\n        stream->total = 3;\n      } else if (msg == 0xf) {\n        // System message\n        if (data == MIDI_STATUS_SYSEX_START) {\n          stream->buffer[0] = MIDI_CIN_SYSEX_START;\n          stream->total = 4;\n        } else if (data == MIDI_STATUS_SYSCOM_TIME_CODE_QUARTER_FRAME || data == MIDI_STATUS_SYSCOM_SONG_SELECT) {\n          stream->buffer[0] = MIDI_CIN_SYSCOM_2BYTE;\n          stream->total = 3;\n        } else if (data == MIDI_STATUS_SYSCOM_SONG_POSITION_POINTER) {\n          stream->buffer[0] = MIDI_CIN_SYSCOM_3BYTE;\n          stream->total = 4;\n        } else {\n          stream->buffer[0] = MIDI_CIN_SYSEX_END_1BYTE;\n          stream->total = 2;\n        }\n        stream->buffer[0] |= (uint8_t)(cable_num << 4);\n      } else {\n        // Pack individual bytes if we don't support packing them into words.\n        stream->buffer[0] = (uint8_t) (cable_num << 4 | 0xf);\n        stream->buffer[2] = 0;\n        stream->buffer[3] = 0;\n        stream->index = 2;\n        stream->total = 2;\n      }\n    } else {\n      //------------- On-going (buffering) packet -------------//\n      TU_ASSERT(stream->index < 4, byte_count);\n      stream->buffer[stream->index] = data;\n      stream->index++;\n      // See if this byte ends a SysEx.\n      if ((stream->buffer[0] & 0xF) == MIDI_CIN_SYSEX_START && data == MIDI_STATUS_SYSEX_END) {\n        stream->buffer[0] = (uint8_t)((cable_num << 4) | (MIDI_CIN_SYSEX_START + (stream->index - 1)));\n        stream->total = stream->index;\n      }\n    }\n\n    // Send out packet\n    if (stream->index >= 2 && stream->index == stream->total) {\n      // zeroes unused bytes\n      for (uint8_t i = stream->total; i < 4; i++) {\n        stream->buffer[i] = 0;\n      }\n      TU_LOG3_MEM(stream->buffer, 4, 2);\n\n      const uint32_t count = tu_edpt_stream_write(&p_midi->ep_stream.tx, stream->buffer, 4);\n\n      // complete current event packet, reset stream\n      stream->index = 0;\n      stream->total = 0;\n\n      // FIFO overflown, since we already check fifo remaining. It is probably race condition\n      TU_ASSERT(count == 4, byte_count);\n    }\n  }\n  return byte_count;\n}\n\nuint32_t tuh_midi_stream_read(uint8_t idx, uint8_t *p_cable_num, uint8_t *p_buffer, uint16_t bufsize) {\n  TU_VERIFY(idx < CFG_TUH_MIDI && p_cable_num && p_buffer && bufsize > 0);\n  midih_interface_t *p_midi = &_midi_host[idx];\n  uint32_t bytes_buffered = 0;\n  uint8_t one_byte;\n  if (!tu_edpt_stream_peek(&p_midi->ep_stream.rx, &one_byte)) {\n    return 0;\n  }\n  *p_cable_num = (one_byte >> 4) & 0xf;\n  uint32_t nread = tu_edpt_stream_read(&p_midi->ep_stream.rx, p_midi->stream_read.buffer, 4);\n  static uint16_t cable_sysex_in_progress;// bit i is set if received MIDI_STATUS_SYSEX_START but not MIDI_STATUS_SYSEX_END\n  while (nread == 4 && bytes_buffered < bufsize) {\n    *p_cable_num = (p_midi->stream_read.buffer[0] >> 4) & 0x0f;\n    uint8_t bytes_to_add_to_stream = 0;\n    if (*p_cable_num < p_midi->rx_cable_count) {\n      // ignore the CIN field; too many devices out there encode this wrong\n      uint8_t status = p_midi->stream_read.buffer[1];\n      uint16_t cable_mask = (uint16_t) (1 << *p_cable_num);\n      if (status <= MIDI_MAX_DATA_VAL || status == MIDI_STATUS_SYSEX_START) {\n        if (status == MIDI_STATUS_SYSEX_START) {\n          cable_sysex_in_progress |= cable_mask;\n        }\n        // only add the packet if a sysex message is in progress\n        if (cable_sysex_in_progress & cable_mask) {\n          ++bytes_to_add_to_stream;\n          for (uint8_t i = 2; i < 4; i++) {\n            if (p_midi->stream_read.buffer[i] <= MIDI_MAX_DATA_VAL) {\n              ++bytes_to_add_to_stream;\n            } else if (p_midi->stream_read.buffer[i] == MIDI_STATUS_SYSEX_END) {\n              ++bytes_to_add_to_stream;\n              cable_sysex_in_progress &= (uint16_t) ~cable_mask;\n              i = 4;// force the loop to exit; I hate break statements in loops\n            }\n          }\n        }\n        else {\n          // bad packet discard\n          nread = tu_edpt_stream_read(&p_midi->ep_stream.rx, p_midi->stream_read.buffer, 4);\n          continue;\n        }\n      } else if (status < MIDI_STATUS_SYSEX_START) {\n        // then it is a channel message either three bytes or two\n        uint8_t fake_cin = (status & 0xf0) >> 4;\n        switch (fake_cin) {\n          case MIDI_CIN_NOTE_OFF:\n          case MIDI_CIN_NOTE_ON:\n          case MIDI_CIN_POLY_KEYPRESS:\n          case MIDI_CIN_CONTROL_CHANGE:\n          case MIDI_CIN_PITCH_BEND_CHANGE:\n            bytes_to_add_to_stream = 3;\n            break;\n          case MIDI_CIN_PROGRAM_CHANGE:\n          case MIDI_CIN_CHANNEL_PRESSURE:\n            bytes_to_add_to_stream = 2;\n            break;\n          default:\n            break;// Should not get this\n        }\n        cable_sysex_in_progress &= (uint16_t) ~cable_mask;\n      } else if (status < MIDI_STATUS_SYSREAL_TIMING_CLOCK) {\n        switch (status) {\n          case MIDI_STATUS_SYSCOM_TIME_CODE_QUARTER_FRAME:\n          case MIDI_STATUS_SYSCOM_SONG_SELECT:\n            bytes_to_add_to_stream = 2;\n            break;\n          case MIDI_STATUS_SYSCOM_SONG_POSITION_POINTER:\n            bytes_to_add_to_stream = 3;\n            break;\n          case MIDI_STATUS_SYSCOM_TUNE_REQUEST:\n          case MIDI_STATUS_SYSEX_END:\n            bytes_to_add_to_stream = 1;\n            break;\n          default:\n            break;\n        }\n        cable_sysex_in_progress &= (uint16_t) ~cable_mask;\n      } else {\n        // Real-time message: can be inserted into a sysex message,\n        // so do don't clear cable_sysex_in_progress bit\n        bytes_to_add_to_stream = 1;\n      }\n    }\n    else {\n      // bad packet discard\n      nread = tu_edpt_stream_read(&p_midi->ep_stream.rx, p_midi->stream_read.buffer, 4);\n      continue;\n    }\n\n    for (uint8_t i = 1; i <= bytes_to_add_to_stream; i++) {\n      *p_buffer++ = p_midi->stream_read.buffer[i];\n    }\n    bytes_buffered += bytes_to_add_to_stream;\n    nread = 0;\n    if (tu_edpt_stream_peek(&p_midi->ep_stream.rx, &one_byte)) {\n      uint8_t new_cable = (one_byte >> 4) & 0xf;\n      if (new_cable == *p_cable_num) {\n        // still on the same cable. Continue reading the stream\n        nread = tu_edpt_stream_read(&p_midi->ep_stream.rx, p_midi->stream_read.buffer, 4);\n      }\n    }\n  }\n\n  return bytes_buffered;\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/class/midi/midi_host.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MIDI_HOST_H_\n#define TUSB_MIDI_HOST_H_\n\n#include \"class/audio/audio.h\"\n#include \"midi.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n#ifndef CFG_TUH_MIDI_RX_BUFSIZE\n  #define CFG_TUH_MIDI_RX_BUFSIZE TUH_EPSIZE_BULK_MAX\n#endif\n\n#ifndef CFG_TUH_MIDI_TX_BUFSIZE\n  #define CFG_TUH_MIDI_TX_BUFSIZE TUH_EPSIZE_BULK_MAX\n#endif\n\n#ifndef CFG_TUH_MIDI_EP_BUFSIZE\n  #define CFG_TUH_MIDI_EP_BUFSIZE TUH_EPSIZE_BULK_MAX\n#endif\n\n// Enable the MIDI stream read/write API. Some library can work with raw USB MIDI packet\n// Disable this can save driver footprint.\n#ifndef CFG_TUH_MIDI_STREAM_API\n  #define CFG_TUH_MIDI_STREAM_API 1\n#endif\n\n//--------------------------------------------------------------------+\n// Application Types\n//--------------------------------------------------------------------+\ntypedef struct {\n  const tusb_desc_interface_t *desc_audio_control;\n  const tusb_desc_interface_t *desc_midi; // start of whole midi interface descriptor\n  uint16_t                     desc_midi_total_len;\n\n  const uint8_t              *desc_header;\n  const uint8_t              *desc_element;\n  const tusb_desc_endpoint_t *desc_epin;  // endpoint IN descriptor, CS_ENDPOINT is right after\n  const tusb_desc_endpoint_t *desc_epout; // endpoint OUT descriptor, CS_ENDPOINT is right after\n\n  uint8_t        jack_num;\n  const uint8_t *desc_jack[32];           // list of jack descriptors (embedded + external)\n} tuh_midi_descriptor_cb_t;\n\ntypedef struct {\n  uint8_t daddr;\n  uint8_t bInterfaceNumber; // interface number of MIDI streaming\n  uint8_t rx_cable_count;\n  uint8_t tx_cable_count;\n} tuh_midi_mount_cb_t;\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// Check if MIDI interface is mounted\nbool tuh_midi_mounted(uint8_t idx);\n\n// Get Interface index from device address + interface number\n// return TUSB_INDEX_INVALID_8 (0xFF) if not found\nuint8_t tuh_midi_itf_get_index(uint8_t daddr, uint8_t itf_num);\n\n// Get Interface information\n// return true if index is correct and interface is currently mounted\nbool tuh_midi_itf_get_info(uint8_t idx, tuh_itf_info_t *info);\n\n// return the number of virtual midi cables on the device's IN endpoint\nuint8_t tuh_midi_get_rx_cable_count(uint8_t idx);\n\n// return the number of virtual midi cables on the device's OUT endpoint\nuint8_t tuh_midi_get_tx_cable_count(uint8_t idx);\n\n// return the raw number of bytes available.\n// Note: this is related but not the same as number of stream bytes available.\nuint32_t tuh_midi_read_available(uint8_t idx);\n\n// Send any queued packets to the device if the host hardware is able to do it\n// Returns the number of bytes flushed to the host hardware or 0 if\n// the host hardware is busy or there is nothing in queue to send.\nuint32_t tuh_midi_write_flush(uint8_t idx);\n\n//--------------------------------------------------------------------+\n// Packet API\n//--------------------------------------------------------------------+\n\n// Read all available MIDI packets from the connected device\n// Return number of bytes read (always multiple of 4)\nuint32_t tuh_midi_packet_read_n(uint8_t idx, uint8_t *buffer, uint32_t bufsize);\n\n// Read a raw MIDI packet from the connected device\n// Return true if a packet was returned\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_midi_packet_read(uint8_t idx, uint8_t packet[4]) {\n  return 4 == tuh_midi_packet_read_n(idx, packet, 4);\n}\n\n// Write all 4-byte packets, data is locally buffered and only transferred when buffered bytes\n// reach the endpoint packet size or tuh_midi_write_flush() is called\nuint32_t tuh_midi_packet_write_n(uint8_t idx, const uint8_t *buffer, uint32_t bufsize);\n\n// Write a 4-bytes packet to the device.\n// Returns true if the packet was successfully queued.\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_midi_packet_write(uint8_t idx, const uint8_t packet[4]) {\n  return 4 == tuh_midi_packet_write_n(idx, packet, 4);\n}\n\n//--------------------------------------------------------------------+\n// Stream API\n//--------------------------------------------------------------------+\n#if CFG_TUH_MIDI_STREAM_API\n\n// Queue a message to the device using stream API. data is locally buffered and only transferred when buffered bytes\n// reach the endpoint packet size or tuh_midi_write_flush() is called\n// Returns number of bytes was successfully queued.\nuint32_t tuh_midi_stream_write(uint8_t idx, uint8_t cable_num, const uint8_t *p_buffer, uint32_t bufsize);\n\n// Get the MIDI stream from the device. Set the value pointed\n// to by p_cable_num to the MIDI cable number intended to receive it.\n// The MIDI stream will be stored in the buffer pointed to by p_buffer.\n// Return the number of bytes added to the buffer.\n// Note that this function ignores the CIN field of the MIDI packet\n// because a number of commercial devices out there do not encode\n// it properly.\nuint32_t tuh_midi_stream_read(uint8_t idx, uint8_t *p_cable_num, uint8_t *p_buffer, uint16_t bufsize);\n\n#endif\n\n//--------------------------------------------------------------------+\n// Callbacks (Weak is optional)\n//--------------------------------------------------------------------+\n\n// Invoked when MIDI interface is detected in enumeration. Application can copy/parse descriptor if needed.\n// Note: may be fired before tuh_midi_mount_cb(), therefore midi interface is not mounted/ready.\nvoid tuh_midi_descriptor_cb(uint8_t idx, const tuh_midi_descriptor_cb_t *desc_cb_data);\n\n// Invoked when device with MIDI interface is mounted.\nvoid tuh_midi_mount_cb(uint8_t idx, const tuh_midi_mount_cb_t *mount_cb_data);\n\n// Invoked when device with MIDI interface is un-mounted\nvoid tuh_midi_umount_cb(uint8_t idx);\n\n// Invoked when received new data\nvoid tuh_midi_rx_cb(uint8_t idx, uint32_t xferred_bytes);\n\n// Invoked when a TX is complete and therefore space becomes available in TX buffer\nvoid tuh_midi_tx_cb(uint8_t idx, uint32_t xferred_bytes);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nbool     midih_init(void);\nbool     midih_deinit(void);\nuint16_t midih_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *desc_itf, uint16_t max_len);\nbool     midih_set_config(uint8_t dev_addr, uint8_t itf_num);\nbool     midih_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\nvoid     midih_close(uint8_t daddr);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/class/msc/msc.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MSC_H_\n#define TUSB_MSC_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Mass Storage Class Constant\n//--------------------------------------------------------------------+\n/// MassStorage Subclass\ntypedef enum\n{\n  MSC_SUBCLASS_RBC = 1 , ///< Reduced Block Commands (RBC) T10 Project 1240-D\n  MSC_SUBCLASS_SFF_MMC , ///< SFF-8020i, MMC-2 (ATAPI). Typically used by a CD/DVD device\n  MSC_SUBCLASS_QIC     , ///< QIC-157. Typically used by a tape device\n  MSC_SUBCLASS_UFI     , ///< UFI. Typically used by Floppy Disk Drive (FDD) device\n  MSC_SUBCLASS_SFF     , ///< SFF-8070i. Can be used by Floppy Disk Drive (FDD) device\n  MSC_SUBCLASS_SCSI      ///< SCSI transparent command set\n}msc_subclass_type_t;\n\nenum {\n  MSC_CBW_SIGNATURE = 0x43425355, ///< Constant value of 43425355h (little endian)\n  MSC_CSW_SIGNATURE = 0x53425355  ///< Constant value of 53425355h (little endian)\n};\n\n/// \\brief MassStorage Protocol.\n/// \\details CBI only approved to use with full-speed floppy disk & should not used with highspeed or device other than floppy\ntypedef enum\n{\n  MSC_PROTOCOL_CBI              = 0 ,  ///< Control/Bulk/Interrupt protocol (with command completion interrupt)\n  MSC_PROTOCOL_CBI_NO_INTERRUPT = 1 ,  ///< Control/Bulk/Interrupt protocol (without command completion interrupt)\n  MSC_PROTOCOL_BOT              = 0x50 ///< Bulk-Only Transport\n}msc_protocol_type_t;\n\n/// MassStorage Class-Specific Control Request\ntypedef enum\n{\n  MSC_REQ_GET_MAX_LUN = 254, ///< The Get Max LUN device request is used to determine the number of logical units supported by the device. Logical Unit Numbers on the device shall be numbered contiguously starting from LUN 0 to a maximum LUN of 15\n  MSC_REQ_RESET       = 255  ///< This request is used to reset the mass storage device and its associated interface. This class-specific request shall ready the device for the next CBW from the host.\n}msc_request_type_t;\n\n/// \\brief Command Block Status Values\n/// \\details Indicates the success or failure of the command. The device shall set this byte to zero if the command completed\n/// successfully. A non-zero value shall indicate a failure during command execution according to the following\ntypedef enum\n{\n  MSC_CSW_STATUS_PASSED = 0 , ///< MSC_CSW_STATUS_PASSED\n  MSC_CSW_STATUS_FAILED     , ///< MSC_CSW_STATUS_FAILED\n  MSC_CSW_STATUS_PHASE_ERROR  ///< MSC_CSW_STATUS_PHASE_ERROR\n}msc_csw_status_t;\n\n/// Command Block Wrapper\ntypedef struct TU_ATTR_PACKED\n{\n  uint32_t signature;   ///< Signature that helps identify this data packet as a CBW. The signature field shall contain the value 43425355h (little endian), indicating a CBW.\n  uint32_t tag;         ///< Tag sent by the host. The device shall echo the contents of this field back to the host in the dCSWTagfield of the associated CSW. The dCSWTagpositively associates a CSW with the corresponding CBW.\n  uint32_t total_bytes; ///< The number of bytes of data that the host expects to transfer on the Bulk-In or Bulk-Out endpoint (as indicated by the Direction bit) during the execution of this command. If this field is zero, the device and the host shall transfer no data between the CBW and the associated CSW, and the device shall ignore the value of the Direction bit in bmCBWFlags.\n  uint8_t dir;          ///< Bit 7 of this field define transfer direction \\n - 0 : Data-Out from host to the device. \\n - 1 : Data-In from the device to the host.\n  uint8_t lun;          ///< The device Logical Unit Number (LUN) to which the command block is being sent. For devices that support multiple LUNs, the host shall place into this field the LUN to which this command block is addressed. Otherwise, the host shall set this field to zero.\n  uint8_t cmd_len;      ///< The valid length of the CBWCBin bytes. This defines the valid length of the command block. The only legal values are 1 through 16\n  uint8_t command[16];  ///< The command block to be executed by the device. The device shall interpret the first cmd_len bytes in this field as a command block\n}msc_cbw_t;\n\nTU_VERIFY_STATIC(sizeof(msc_cbw_t) == 31, \"size is not correct\");\n\n/// Command Status Wrapper\ntypedef struct TU_ATTR_PACKED\n{\n  uint32_t signature    ; ///< Signature that helps identify this data packet as a CSW. The signature field shall contain the value 53425355h (little endian), indicating CSW.\n  uint32_t tag          ; ///< The device shall set this field to the value received in the dCBWTag of the associated CBW.\n  uint32_t data_residue ; ///< For Data-Out the device shall report in the dCSWDataResidue the difference between the amount of data expected as stated in the dCBWDataTransferLength, and the actual amount of data processed by the device. For Data-In the device shall report in the dCSWDataResiduethe difference between the amount of data expected as stated in the dCBWDataTransferLengthand the actual amount of relevant data sent by the device\n  uint8_t  status       ; ///< indicates the success or failure of the command. Values from \\ref msc_csw_status_t\n}msc_csw_t;\n\nTU_VERIFY_STATIC(sizeof(msc_csw_t) == 13, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// SCSI Constant\n//--------------------------------------------------------------------+\n\n/// SCSI Command Operation Code\ntypedef enum {\n  SCSI_CMD_TEST_UNIT_READY              = 0x00, ///< The SCSI Test Unit Ready command is used to determine if a device is ready to transfer data (read/write), i.e. if a disk has spun up, if a tape is loaded and ready etc. The device does not perform a self-test operation.\n  SCSI_CMD_INQUIRY                      = 0x12, ///< The SCSI Inquiry command is used to obtain basic information from a target device.\n  SCSI_CMD_MODE_SELECT_6                = 0x15, ///<  provides a means for the application client to specify medium, logical unit, or peripheral device parameters to the device server. Device servers that implement the MODE SELECT(6) command shall also implement the MODE SENSE(6) command. Application clients should issue MODE SENSE(6) prior to each MODE SELECT(6) to determine supported mode pages, page lengths, and other parameters.\n  SCSI_CMD_MODE_SENSE_6                 = 0x1A, ///< provides a means for a device server to report parameters to an application client. It is a complementary command to the MODE SELECT(6) command. Device servers that implement the MODE SENSE(6) command shall also implement the MODE SELECT(6) command.\n  SCSI_CMD_START_STOP_UNIT              = 0x1B,\n  SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL = 0x1E,\n  SCSI_CMD_READ_CAPACITY_10             = 0x25, ///< The SCSI Read Capacity command is used to obtain data capacity information from a target device.\n  SCSI_CMD_REQUEST_SENSE                = 0x03, ///< The SCSI Request Sense command is part of the SCSI computer protocol standard. This command is used to obtain sense data -- status/error information -- from a target device.\n  SCSI_CMD_READ_FORMAT_CAPACITY         = 0x23, ///< The command allows the Host to request a list of the possible format capacities for an installed writable media. This command also has the capability to report the writable capacity for a media when it is installed\n  SCSI_CMD_READ_10                      = 0x28, ///< The READ (10) command requests that the device server read the specified logical block(s) and transfer them to the data-in buffer.\n  SCSI_CMD_WRITE_10                     = 0x2A, ///< The WRITE (10) command requests that the device server transfer the specified logical block(s) from the data-out buffer and write them.\n}scsi_cmd_type_t;\n\n/// SCSI Sense Key\ntypedef enum {\n  SCSI_SENSE_NONE            = 0x00, ///< no specific Sense Key. This would be the case for a successful command\n  SCSI_SENSE_RECOVERED_ERROR = 0x01, ///< Indicates the last command completed successfully with some recovery action performed by the disc drive.\n  SCSI_SENSE_NOT_READY       = 0x02, ///< Indicates the logical unit addressed cannot be accessed.\n  SCSI_SENSE_MEDIUM_ERROR    = 0x03, ///< Indicates the command terminated with a non-recovered error condition.\n  SCSI_SENSE_HARDWARE_ERROR  = 0x04, ///< Indicates the disc drive detected a nonrecoverable hardware failure while performing the command or during a self test.\n  SCSI_SENSE_ILLEGAL_REQUEST = 0x05, ///< Indicates an illegal parameter in the command descriptor block or in the additional parameters\n  SCSI_SENSE_UNIT_ATTENTION  = 0x06, ///< Indicates the disc drive may have been reset.\n  SCSI_SENSE_DATA_PROTECT    = 0x07, ///< Indicates that a command that reads or writes the medium was attempted on a block that is protected from this operation. The read or write operation is not performed.\n  SCSI_SENSE_FIRMWARE_ERROR  = 0x08, ///< Vendor specific sense key.\n  SCSI_SENSE_ABORTED_COMMAND = 0x0b, ///< Indicates the disc drive aborted the command.\n  SCSI_SENSE_EQUAL           = 0x0c, ///< Indicates a SEARCH DATA command has satisfied an equal comparison.\n  SCSI_SENSE_VOLUME_OVERFLOW = 0x0d, ///< Indicates a buffered peripheral device has reached the end of medium partition and data remains in the buffer that has not been written to the medium.\n  SCSI_SENSE_MISCOMPARE      = 0x0e  ///< Indicates that the source data did not match the data read from the medium.\n}scsi_sense_key_type_t;\n\n\ntypedef enum {\n  SCSI_PDT_DIRECT_ACCESS = 0x0,\n  SCSI_PDT_SEQUENTIAL_ACCESS = 0x1,\n  SCSI_PDT_PRINTER = 0x2,\n  SCSI_PDT_PROCESSOR = 0x3,\n  SCSI_PDT_WRITE_ONCE = 0x4,\n  SCSI_PDT_CD_DVD = 0x5,\n  SCSI_PDT_SCANNER = 0x6,\n  SCSI_PDT_OPTICAL_DEVICE = 0x7,\n  SCSI_PDT_MEDIUM_CHANGER = 0x8,\n  SCSI_PDT_COMMUNICATIONS = 0x9, // obsolete\n  SCSI_PDT_RAID = 0x0c,\n  SCSI_PDT_ENCLOSURE_SERVICES = 0x0d,\n  SCSI_PDT_SIMPLIFIED_DIRECT_ACCESS = 0x0e,\n  SCSI_PDT_OPTICAL_CARD_READER = 0x0f,\n  SCSI_PDT_BRIDGE = 0x10, ///< Bridge device, e.g. USB to SCSI bridge\n  SCSI_PDT_OBJECT_BASED_STORAGE = 0x11, ///< Object-based storage device\n  SCSI_PDT_AUTOMATION_DRIVE_INTERFACE = 0x12, ///< Automation/Drive Interface (ADI) device\n} scsi_peripheral_device_type_t;\n\n//--------------------------------------------------------------------+\n// SCSI Primary Command (SPC-4)\n//--------------------------------------------------------------------+\n\n/// SCSI Test Unit Ready Command\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t cmd_code    ; ///< SCSI OpCode for \\ref SCSI_CMD_TEST_UNIT_READY\n  uint8_t lun         ; ///< Logical Unit\n  uint8_t reserved[3] ;\n  uint8_t control     ;\n} scsi_test_unit_ready_t;\n\nTU_VERIFY_STATIC(sizeof(scsi_test_unit_ready_t) == 6, \"size is not correct\");\n\n/// SCSI Inquiry Command\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t cmd_code     ; ///< SCSI OpCode for \\ref SCSI_CMD_INQUIRY\n  uint8_t reserved1    ;\n  uint8_t page_code    ;\n  uint8_t reserved2    ;\n  uint8_t alloc_length ; ///< specifies the maximum number of bytes that USB host has allocated in the Data-In Buffer. An allocation length of zero specifies that no data shall be transferred.\n  uint8_t control      ;\n} scsi_inquiry_t, scsi_request_sense_t;\n\nTU_VERIFY_STATIC(sizeof(scsi_inquiry_t) == 6, \"size is not correct\");\n\n/// SCSI Inquiry Response Data\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t peripheral_device_type     : 5;\n  uint8_t peripheral_qualifier       : 3;\n\n  uint8_t                            : 7;\n  uint8_t is_removable               : 1;\n\n  uint8_t version;\n\n  uint8_t response_data_format       : 4;\n  uint8_t hierarchical_support       : 1;\n  uint8_t normal_aca                 : 1;\n  uint8_t                            : 2;\n\n  uint8_t additional_length;\n\n  uint8_t protect                    : 1;\n  uint8_t                            : 2;\n  uint8_t third_party_copy           : 1;\n  uint8_t target_port_group_support  : 2;\n  uint8_t access_control_coordinator : 1;\n  uint8_t scc_support                : 1;\n\n  uint8_t addr16                     : 1;\n  uint8_t                            : 3;\n  uint8_t multi_port                 : 1;\n  uint8_t                            : 1; // vendor specific\n  uint8_t enclosure_service          : 1;\n  uint8_t                            : 1;\n\n  uint8_t                            : 1; // vendor specific\n  uint8_t cmd_que                    : 1;\n  uint8_t                            : 2;\n  uint8_t sync                       : 1;\n  uint8_t wbus16                     : 1;\n  uint8_t                            : 2;\n\n  uint8_t vendor_id[8]  ; ///< 8 bytes of ASCII data identifying the vendor of the product.\n  uint8_t product_id[16]; ///< 16 bytes of ASCII data defined by the vendor.\n  uint8_t product_rev[4]; ///< 4 bytes of ASCII data defined by the vendor.\n} scsi_inquiry_resp_t;\n\nTU_VERIFY_STATIC(sizeof(scsi_inquiry_resp_t) == 36, \"size is not correct\");\n\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t response_code : 7; ///< 70h - current errors, Fixed Format 71h - deferred errors, Fixed Format\n  uint8_t valid         : 1;\n\n  uint8_t reserved;\n\n  uint8_t sense_key     : 4;\n  uint8_t               : 1;\n  uint8_t ili           : 1; ///< Incorrect length indicator\n  uint8_t end_of_medium : 1;\n  uint8_t filemark      : 1;\n\n  uint32_t information;\n  uint8_t  add_sense_len;\n  uint32_t command_specific_info;\n  uint8_t  add_sense_code;\n  uint8_t  add_sense_qualifier;\n  uint8_t  field_replaceable_unit_code;\n\n  uint8_t  sense_key_specific[3]; ///< sense key specific valid bit is bit 7 of key[0], aka MSB in Big Endian layout\n\n} scsi_sense_fixed_resp_t;\n\nTU_VERIFY_STATIC(sizeof(scsi_sense_fixed_resp_t) == 18, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t cmd_code     ; ///< SCSI OpCode for \\ref SCSI_CMD_MODE_SENSE_6\n\n  uint8_t : 3;\n  uint8_t disable_block_descriptor : 1;\n  uint8_t : 4;\n\n  uint8_t page_code : 6;\n  uint8_t page_control : 2;\n\n  uint8_t subpage_code;\n  uint8_t alloc_length;\n  uint8_t control;\n} scsi_mode_sense6_t;\n\nTU_VERIFY_STATIC( sizeof(scsi_mode_sense6_t) == 6, \"size is not correct\");\n\n// This is only a Mode parameter header(6).\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t data_len;\n  uint8_t medium_type;\n\n  uint8_t reserved : 7;\n  bool write_protected : 1;\n\n  uint8_t block_descriptor_len;\n} scsi_mode_sense6_resp_t;\n\nTU_VERIFY_STATIC( sizeof(scsi_mode_sense6_resp_t) == 4, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t cmd_code; ///< SCSI OpCode for \\ref SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL\n  uint8_t reserved[3];\n  uint8_t prohibit_removal;\n  uint8_t control;\n} scsi_prevent_allow_medium_removal_t;\n\nTU_VERIFY_STATIC( sizeof(scsi_prevent_allow_medium_removal_t) == 6, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t cmd_code;\n\n  uint8_t immded : 1;\n  uint8_t        : 7;\n\n  uint8_t TU_RESERVED;\n\n  uint8_t power_condition_mod : 4;\n  uint8_t                     : 4;\n\n  uint8_t start           : 1;\n  uint8_t load_eject      : 1;\n  uint8_t no_flush        : 1;\n  uint8_t                 : 1;\n  uint8_t power_condition : 4;\n\n  uint8_t control;\n} scsi_start_stop_unit_t;\n\nTU_VERIFY_STATIC( sizeof(scsi_start_stop_unit_t) == 6, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// SCSI MMC\n//--------------------------------------------------------------------+\n/// SCSI Read Format Capacity: Write Capacity\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t cmd_code;\n  uint8_t reserved[6];\n  uint16_t alloc_length;\n  uint8_t control;\n} scsi_read_format_capacity_t;\n\nTU_VERIFY_STATIC( sizeof(scsi_read_format_capacity_t) == 10, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED{\n  uint8_t reserved[3];\n  uint8_t list_length; /// must be 8*n, length in bytes of formattable capacity descriptor followed it.\n\n  uint32_t block_num; /// Number of Logical Blocks\n  uint8_t  descriptor_type; // 00: reserved, 01 unformatted media , 10 Formatted media, 11 No media present\n\n  uint8_t  reserved2;\n  uint16_t block_size_u16;\n\n} scsi_read_format_capacity_data_t;\n\nTU_VERIFY_STATIC( sizeof(scsi_read_format_capacity_data_t) == 12, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// SCSI Block Command (SBC-3)\n// NOTE: All data in SCSI command are in Big Endian\n//--------------------------------------------------------------------+\n\n/// SCSI Read Capacity 10 Command: Read Capacity\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t  cmd_code                 ; ///< SCSI OpCode for \\ref SCSI_CMD_READ_CAPACITY_10\n  uint8_t  reserved1                ;\n  uint32_t lba                      ; ///< The first Logical Block Address (LBA) accessed by this command\n  uint16_t reserved2                ;\n  uint8_t  partial_medium_indicator ;\n  uint8_t  control                  ;\n} scsi_read_capacity10_t;\n\nTU_VERIFY_STATIC(sizeof(scsi_read_capacity10_t) == 10, \"size is not correct\");\n\n/// SCSI Read Capacity 10 Response Data\ntypedef struct {\n  uint32_t last_lba   ; ///< The last Logical Block Address of the device\n  uint32_t block_size ; ///< Block size in bytes\n} scsi_read_capacity10_resp_t;\n\nTU_VERIFY_STATIC(sizeof(scsi_read_capacity10_resp_t) == 8, \"size is not correct\");\n\n/// SCSI Read 10 Command\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t  cmd_code    ; ///< SCSI OpCode\n  uint8_t  reserved    ; // has LUN according to wiki\n  uint32_t lba         ; ///< The first Logical Block Address (LBA) accessed by this command\n  uint8_t  reserved2   ;\n  uint16_t block_count ; ///< Number of Blocks used by this command\n  uint8_t  control     ;\n} scsi_read10_t, scsi_write10_t;\n\nTU_VERIFY_STATIC(sizeof(scsi_read10_t) == 10, \"size is not correct\");\nTU_VERIFY_STATIC(sizeof(scsi_write10_t) == 10, \"size is not correct\");\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_MSC_H_ */\n"
  },
  {
    "path": "src/class/msc/msc_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_MSC)\n\n#include \"device/dcd.h\"         // for faking dcd_event_xfer_complete\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"msc_device.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUD_MSC_LOG_LEVEL\n  #define CFG_TUD_MSC_LOG_LEVEL   CFG_TUD_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUD_MSC_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4]) {\n  (void) lun; (void) vendor_id; (void) product_id; (void) product_rev;\n}\nTU_ATTR_WEAK uint32_t tud_msc_inquiry2_cb(uint8_t lun, scsi_inquiry_resp_t *inquiry_resp, uint32_t bufsize) {\n  (void) lun; (void) inquiry_resp; (void) bufsize;\n  return 0;\n}\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\nenum {\n  MSC_STAGE_CMD  = 0,\n  MSC_STAGE_DATA,\n  MSC_STAGE_STATUS,\n  MSC_STAGE_STATUS_SENT,\n  MSC_STAGE_NEED_RESET,\n};\n\ntypedef struct {\n  TU_ATTR_ALIGNED(4) msc_cbw_t cbw; // 31 bytes\n  uint8_t  rhport;\n\n  TU_ATTR_ALIGNED(4) msc_csw_t csw; // 13 bytes\n  uint8_t  itf_num;\n  uint8_t  ep_in;\n  uint8_t  ep_out;\n\n  uint32_t total_len;   // byte to be transferred, can be smaller than total_bytes in cbw\n  uint32_t xferred_len; // numbered of bytes transferred so far in the Data Stage\n\n  // Bulk Only Transfer (BOT) Protocol\n  uint8_t stage;\n\n  // SCSI Sense Response Data\n  uint8_t sense_key;\n  uint8_t add_sense_code;\n  uint8_t add_sense_qualifier;\n\n  bool pending_io; // pending async IO\n}mscd_interface_t;\n\nstatic mscd_interface_t _mscd_itf;\n\nCFG_TUD_MEM_SECTION static struct {\n  TUD_EPBUF_DEF(buf, CFG_TUD_MSC_EP_BUFSIZE);\n} _mscd_epbuf;\n\nTU_VERIFY_STATIC(CFG_TUD_MSC_EP_BUFSIZE >= 64, \"CFG_TUD_MSC_EP_BUFSIZE must be at least 64\");\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nstatic int32_t proc_builtin_scsi(uint8_t lun, uint8_t const scsi_cmd[16], uint8_t* buffer, uint32_t bufsize);\nstatic void proc_read10_cmd(mscd_interface_t* p_msc);\nstatic void proc_read_io_data(mscd_interface_t* p_msc, int32_t nbytes);\nstatic void proc_write10_cmd(mscd_interface_t* p_msc);\nstatic void proc_write10_host_data(mscd_interface_t* p_msc, uint32_t xferred_bytes);\nstatic void proc_write_io_data(mscd_interface_t* p_msc, uint32_t xferred_bytes, int32_t nbytes);\nstatic bool proc_stage_status(mscd_interface_t* p_msc);\n\nTU_ATTR_ALWAYS_INLINE static inline bool is_data_in(uint8_t dir) {\n  return tu_bit_test(dir, 7);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool send_csw(mscd_interface_t* p_msc) {\n  // Data residue is always = host expect - actual transferred\n  uint8_t rhport = p_msc->rhport;\n  p_msc->csw.data_residue = p_msc->cbw.total_bytes - p_msc->xferred_len;\n  p_msc->stage = MSC_STAGE_STATUS_SENT;\n  memcpy(_mscd_epbuf.buf, &p_msc->csw, sizeof(msc_csw_t)); //-V1086\n  return usbd_edpt_xfer(rhport, p_msc->ep_in , _mscd_epbuf.buf, sizeof(msc_csw_t), false);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool prepare_cbw(mscd_interface_t* p_msc) {\n  uint8_t rhport = p_msc->rhport;\n  p_msc->stage = MSC_STAGE_CMD;\n  return usbd_edpt_xfer(rhport, p_msc->ep_out,  _mscd_epbuf.buf, sizeof(msc_cbw_t), false);\n}\n\nstatic void fail_scsi_op(mscd_interface_t* p_msc, uint8_t status) {\n  msc_cbw_t const * p_cbw = &p_msc->cbw;\n  msc_csw_t       * p_csw = &p_msc->csw;\n  uint8_t rhport = p_msc->rhport;\n\n  p_csw->status       = status;\n  p_csw->data_residue = p_msc->cbw.total_bytes - p_msc->xferred_len;\n  p_msc->stage        = MSC_STAGE_STATUS;\n\n  // failed but sense key is not set: default to Illegal Request\n  if (p_msc->sense_key == 0) {\n    (void) tud_msc_set_sense(p_cbw->lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);\n  }\n\n  // If there is data stage and not yet complete, stall it\n  if (p_cbw->total_bytes && p_csw->data_residue) {\n    if (is_data_in(p_cbw->dir)) {\n      usbd_edpt_stall(rhport, p_msc->ep_in);\n    } else {\n      usbd_edpt_stall(rhport, p_msc->ep_out);\n    }\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t rdwr10_get_lba(uint8_t const command[]) {\n  // use offsetof to avoid pointer to the odd/unaligned address\n  const uint32_t lba = tu_unaligned_read32(command + offsetof(scsi_write10_t, lba));\n  return tu_ntohl(lba); // lba is in Big Endian\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t rdwr10_get_blockcount(msc_cbw_t const* cbw) {\n  uint16_t const block_count = tu_unaligned_read16(cbw->command + offsetof(scsi_write10_t, block_count));\n  return tu_ntohs(block_count);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t rdwr10_get_blocksize(msc_cbw_t const* cbw) {\n  // first extract block count in the command\n  uint16_t const block_count = rdwr10_get_blockcount(cbw);\n  if (block_count == 0) {\n    return 0; // invalid block count\n  }\n  return (uint16_t) (cbw->total_bytes / block_count);\n}\n\nstatic uint8_t rdwr10_validate_cmd(msc_cbw_t const* cbw) {\n  uint8_t status = MSC_CSW_STATUS_PASSED;\n  uint16_t const block_count = rdwr10_get_blockcount(cbw);\n\n  if (cbw->total_bytes == 0) {\n    if (block_count > 0) {\n      TU_LOG_DRV(\"  SCSI case 2 (Hn < Di) or case 3 (Hn < Do) \\r\\n\");\n      status = MSC_CSW_STATUS_PHASE_ERROR;\n    } else {\n      // no data transfer, only exist in complaint test suite\n    }\n  } else {\n    if (SCSI_CMD_READ_10 == cbw->command[0] && !is_data_in(cbw->dir)) {\n      TU_LOG_DRV(\"  SCSI case 10 (Ho <> Di)\\r\\n\");\n      status = MSC_CSW_STATUS_PHASE_ERROR;\n    } else if (SCSI_CMD_WRITE_10 == cbw->command[0] && is_data_in(cbw->dir)) {\n      TU_LOG_DRV(\"  SCSI case 8 (Hi <> Do)\\r\\n\");\n      status = MSC_CSW_STATUS_PHASE_ERROR;\n    } else if (0 == block_count) {\n      TU_LOG_DRV(\"  SCSI case 4 Hi > Dn (READ10) or case 9 Ho > Dn (WRITE10) \\r\\n\");\n      status = MSC_CSW_STATUS_FAILED;\n    } else if (cbw->total_bytes / block_count == 0) {\n      TU_LOG_DRV(\" Computed block size = 0. SCSI case 7 Hi < Di (READ10) or case 13 Ho < Do (WRIT10)\\r\\n\");\n      status = MSC_CSW_STATUS_PHASE_ERROR;\n    } else {\n      // nothing to do\n    }\n  }\n\n  return status;\n}\n\nstatic bool proc_stage_status(mscd_interface_t *p_msc) {\n  uint8_t rhport = p_msc->rhport;\n  msc_cbw_t const *p_cbw = &p_msc->cbw;\n\n  // skip status if epin is currently stalled, will do it when received Clear Stall request\n  if (!usbd_edpt_stalled(rhport, p_msc->ep_in)) {\n    if ((p_cbw->total_bytes > p_msc->xferred_len) && is_data_in(p_cbw->dir)) {\n      // 6.7 The 13 Cases: case 5 (Hi > Di): STALL before status\n      // TU_LOG_DRV(\"  SCSI case 5 (Hi > Di): %lu > %lu\\r\\n\", p_cbw->total_bytes, p_msc->xferred_len);\n      usbd_edpt_stall(rhport, p_msc->ep_in);\n    } else {\n      TU_ASSERT(send_csw(p_msc));\n    }\n  }\n\n  #if TU_CHECK_MCU(OPT_MCU_CXD56)\n  // WORKAROUND: cxd56 has its own nuttx usb stack which does not forward Set/ClearFeature(Endpoint) to DCD.\n  // There is no way for us to know when EP is un-stall, therefore we will unconditionally un-stall here and\n  // hope everything will work\n  if (usbd_edpt_stalled(rhport, p_msc->ep_in)) {\n    usbd_edpt_clear_stall(rhport, p_msc->ep_in);\n    send_csw(p_msc);\n  }\n  #endif\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_msc_read10_complete_cb(uint8_t lun) {\n  (void) lun;\n}\n\nTU_ATTR_WEAK void tud_msc_write10_complete_cb(uint8_t lun) {\n  (void) lun;\n}\n\nTU_ATTR_WEAK void tud_msc_scsi_complete_cb(uint8_t lun, uint8_t const scsi_cmd[16]) {\n  (void) lun;\n  (void) scsi_cmd;\n}\n\nTU_ATTR_WEAK uint8_t tud_msc_get_maxlun_cb(void) {\n  return 1;\n}\n\nTU_ATTR_WEAK bool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject) {\n  (void) lun;\n  (void) power_condition;\n  (void) start;\n  (void) load_eject;\n  return true;\n}\n\nTU_ATTR_WEAK bool tud_msc_prevent_allow_medium_removal_cb(uint8_t lun, uint8_t prohibit_removal, uint8_t control) {\n  (void) lun;\n  (void) prohibit_removal;\n  (void) control;\n  return true;\n}\n\nTU_ATTR_WEAK int32_t tud_msc_request_sense_cb(uint8_t lun, void* buffer, uint16_t bufsize) {\n  (void) lun;\n  (void) buffer;\n  (void) bufsize;\n  return sizeof(scsi_sense_fixed_resp_t);\n}\n\nTU_ATTR_WEAK bool tud_msc_is_writable_cb(uint8_t lun) {\n  (void) lun;\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Debug\n//--------------------------------------------------------------------+\n#if CFG_TUSB_DEBUG >= CFG_TUD_MSC_LOG_LEVEL\n\nTU_ATTR_UNUSED tu_static tu_lookup_entry_t const _msc_scsi_cmd_lookup[] = {\n  { .key = SCSI_CMD_TEST_UNIT_READY              , .data = \"Test Unit Ready\" },\n  { .key = SCSI_CMD_INQUIRY                      , .data = \"Inquiry\" },\n  { .key = SCSI_CMD_MODE_SELECT_6                , .data = \"Mode_Select 6\" },\n  { .key = SCSI_CMD_MODE_SENSE_6                 , .data = \"Mode_Sense 6\" },\n  { .key = SCSI_CMD_START_STOP_UNIT              , .data = \"Start Stop Unit\" },\n  { .key = SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL , .data = \"Prevent/Allow Medium Removal\" },\n  { .key = SCSI_CMD_READ_CAPACITY_10             , .data = \"Read Capacity10\" },\n  { .key = SCSI_CMD_REQUEST_SENSE                , .data = \"Request Sense\" },\n  { .key = SCSI_CMD_READ_FORMAT_CAPACITY         , .data = \"Read Format Capacity\" },\n  { .key = SCSI_CMD_READ_10                      , .data = \"Read10\" },\n  { .key = SCSI_CMD_WRITE_10                     , .data = \"Write10\" }\n};\n\nTU_ATTR_UNUSED tu_static tu_lookup_table_t const _msc_scsi_cmd_table = {\n  .count = TU_ARRAY_SIZE(_msc_scsi_cmd_lookup),\n  .items = _msc_scsi_cmd_lookup\n};\n\n#endif\n\n//--------------------------------------------------------------------+\n// APPLICATION API\n//--------------------------------------------------------------------+\nbool tud_msc_set_sense(uint8_t lun, uint8_t sense_key, uint8_t add_sense_code, uint8_t add_sense_qualifier) {\n  (void) lun;\n  _mscd_itf.sense_key           = sense_key;\n  _mscd_itf.add_sense_code      = add_sense_code;\n  _mscd_itf.add_sense_qualifier = add_sense_qualifier;\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void set_sense_medium_not_present(uint8_t lun) {\n  // default sense is NOT READY, MEDIUM NOT PRESENT\n  (void) tud_msc_set_sense(lun, SCSI_SENSE_NOT_READY, 0x3A, 0x00);\n}\n\nstatic void proc_async_io_done(void *bytes_io) {\n  mscd_interface_t *p_msc = &_mscd_itf;\n  TU_VERIFY(p_msc->pending_io, );\n  const int32_t nbytes = (int32_t) (intptr_t) bytes_io;\n  const uint8_t cmd = p_msc->cbw.command[0];\n\n  p_msc->pending_io = false;\n  switch (cmd) {\n    case SCSI_CMD_READ_10:\n      proc_read_io_data(p_msc, nbytes);\n      break;\n\n    case SCSI_CMD_WRITE_10:\n      proc_write_io_data(p_msc, (uint32_t) nbytes, nbytes);\n      break;\n\n    default: break; // nothing to do\n  }\n\n  // send status if stage is transitioned to STATUS\n  if (p_msc->stage == MSC_STAGE_STATUS) {\n    proc_stage_status(p_msc);\n  }\n}\n\nbool tud_msc_async_io_done(int32_t bytes_io, bool in_isr) {\n  // Precheck to avoid queueing multiple RW done callback\n  TU_VERIFY(_mscd_itf.pending_io);\n  if (bytes_io == 0) {\n    bytes_io = TUD_MSC_RET_ERROR; // 0 is treated as error, no reason to call this with BUSY here\n  }\n  usbd_defer_func(proc_async_io_done, (void *) (intptr_t) bytes_io, in_isr);\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid mscd_init(void) {\n  TU_LOG_INT(CFG_TUD_MSC_LOG_LEVEL, sizeof(mscd_interface_t));\n  tu_memclr(&_mscd_itf, sizeof(mscd_interface_t));\n}\n\nbool mscd_deinit(void) {\n  return true; // nothing to do\n}\n\nvoid mscd_reset(uint8_t rhport) {\n  (void) rhport;\n  tu_memclr(&_mscd_itf, sizeof(mscd_interface_t));\n}\n\nuint16_t mscd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len) {\n  // only support SCSI's BOT protocol\n  TU_VERIFY(TUSB_CLASS_MSC    == itf_desc->bInterfaceClass &&\n            MSC_SUBCLASS_SCSI == itf_desc->bInterfaceSubClass &&\n            MSC_PROTOCOL_BOT  == itf_desc->bInterfaceProtocol, 0);\n  uint16_t const drv_len = sizeof(tusb_desc_interface_t) + 2*sizeof(tusb_desc_endpoint_t);\n  TU_ASSERT(max_len >= drv_len, 0); // Max length must be at least 1 interface + 2 endpoints\n\n  mscd_interface_t * p_msc = &_mscd_itf;\n  p_msc->itf_num = itf_desc->bInterfaceNumber;\n  p_msc->rhport = rhport;\n\n  // Open endpoint pair\n  TU_ASSERT(usbd_open_edpt_pair(rhport, tu_desc_next(itf_desc), 2, TUSB_XFER_BULK, &p_msc->ep_out, &p_msc->ep_in), 0);\n\n  // Prepare for Command Block Wrapper\n  TU_ASSERT(prepare_cbw(p_msc), drv_len);\n\n  return drv_len;\n}\n\nstatic void proc_bot_reset(mscd_interface_t* p_msc) {\n  p_msc->stage       = MSC_STAGE_CMD;\n  p_msc->total_len   = 0;\n  p_msc->xferred_len = 0;\n  p_msc->sense_key           = 0;\n  p_msc->add_sense_code      = 0;\n  p_msc->add_sense_qualifier = 0;\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool mscd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request) {\n  if (stage != CONTROL_STAGE_SETUP) {\n    return true; // nothing to do with DATA & ACK stage\n  }\n\n  mscd_interface_t* p_msc = &_mscd_itf;\n\n  // Clear Endpoint Feature (stall) for recovery\n  if ( TUSB_REQ_TYPE_STANDARD     == request->bmRequestType_bit.type      &&\n       TUSB_REQ_RCPT_ENDPOINT     == request->bmRequestType_bit.recipient &&\n       TUSB_REQ_CLEAR_FEATURE     == request->bRequest                    &&\n       TUSB_REQ_FEATURE_EDPT_HALT == request->wValue ) {\n    uint8_t const ep_addr = tu_u16_low(request->wIndex);\n\n    if (p_msc->stage == MSC_STAGE_NEED_RESET) {\n      // reset recovery is required to recover from this stage\n      // Clear Stall request cannot resolve this -> continue to stall endpoint\n      usbd_edpt_stall(rhport, ep_addr);\n    } else {\n      if (ep_addr == p_msc->ep_in) {\n        if (p_msc->stage == MSC_STAGE_STATUS) {\n          // resume sending SCSI status if we are in this stage previously before stalled\n          TU_ASSERT(send_csw(p_msc));\n        }\n      } else if (ep_addr == p_msc->ep_out) {\n        if (p_msc->stage == MSC_STAGE_CMD) {\n          // part of reset recovery (probably due to invalid CBW) -> prepare for new command\n          // Note: skip if already queued previously\n          if (usbd_edpt_ready(rhport, p_msc->ep_out)) {\n            TU_ASSERT(prepare_cbw(p_msc));\n          }\n        }\n      } else {\n        // nothing to do\n      }\n    }\n\n    return true;\n  }\n\n  // From this point only handle class request only\n  TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);\n\n  switch ( request->bRequest ) {\n    case MSC_REQ_RESET:\n      TU_LOG_DRV(\"  MSC BOT Reset\\r\\n\");\n      TU_VERIFY(request->wValue == 0 && request->wLength == 0);\n      proc_bot_reset(p_msc); // driver state reset\n      tud_control_status(rhport, request);\n    break;\n\n    case MSC_REQ_GET_MAX_LUN: {\n      TU_LOG_DRV(\"  MSC Get Max Lun\\r\\n\");\n      TU_VERIFY(request->wValue == 0 && request->wLength == 1);\n\n      uint8_t maxlun = tud_msc_get_maxlun_cb();\n      TU_VERIFY(maxlun != 0);\n      maxlun--; // MAX LUN is minus 1 by specs\n      tud_control_xfer(rhport, request, &maxlun, 1);\n      break;\n    }\n\n    default: return false; // stall unsupported request\n  }\n\n  return true;\n}\n\nbool mscd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes) {\n  (void) event;\n\n  mscd_interface_t* p_msc = &_mscd_itf;\n  msc_cbw_t * p_cbw = &p_msc->cbw;\n  msc_csw_t * p_csw = &p_msc->csw;\n\n  switch (p_msc->stage) {\n    case MSC_STAGE_CMD: {\n      //------------- new CBW received -------------//\n      // Complete IN while waiting for CMD is usually Status of previous SCSI op, ignore it\n      if (ep_addr != p_msc->ep_out) {\n        return true;\n      }\n\n      const uint32_t signature = tu_le32toh(tu_unaligned_read32(_mscd_epbuf.buf));\n\n      if (!(xferred_bytes == sizeof(msc_cbw_t) && signature == MSC_CBW_SIGNATURE)) {\n        // BOT 6.6.1 If CBW is not valid stall both endpoints until reset recovery\n        TU_LOG_DRV(\"  SCSI CBW is not valid\\r\\n\");\n        p_msc->stage = MSC_STAGE_NEED_RESET;\n        usbd_edpt_stall(rhport, p_msc->ep_in);\n        usbd_edpt_stall(rhport, p_msc->ep_out);\n        return false;\n      }\n\n      memcpy(p_cbw, _mscd_epbuf.buf, sizeof(msc_cbw_t));\n\n      TU_LOG_DRV(\"  SCSI Command [Lun%u]: %s\\r\\n\", p_cbw->lun, tu_lookup_find(&_msc_scsi_cmd_table, p_cbw->command[0]));\n      // TU_LOG_MEM(CFG_TUD_MSC_LOG_LEVEL, p_cbw, xferred_bytes, 2);\n\n      p_csw->signature    = MSC_CSW_SIGNATURE;\n      p_csw->tag          = p_cbw->tag;\n      p_csw->data_residue = 0;\n      p_csw->status       = MSC_CSW_STATUS_PASSED;\n\n      /*------------- Parse command and prepare DATA -------------*/\n      p_msc->stage = MSC_STAGE_DATA;\n      p_msc->total_len = p_cbw->total_bytes;\n      p_msc->xferred_len = 0;\n\n      // Read10 or Write10\n      if ((SCSI_CMD_READ_10 == p_cbw->command[0]) || (SCSI_CMD_WRITE_10 == p_cbw->command[0])) {\n        uint8_t const status = rdwr10_validate_cmd(p_cbw);\n\n        if (status != MSC_CSW_STATUS_PASSED) {\n          fail_scsi_op(p_msc, status);\n        } else if (p_cbw->total_bytes > 0) {\n          if (SCSI_CMD_READ_10 == p_cbw->command[0]) {\n            proc_read10_cmd(p_msc);\n          } else {\n            proc_write10_cmd(p_msc);\n          }\n        } else {\n          // no data transfer, only exist in complaint test suite\n          p_msc->stage = MSC_STAGE_STATUS;\n        }\n      } else {\n        // For other SCSI commands\n        // 1. OUT : queue transfer (invoke app callback after done)\n        // 2. IN & Zero: Process if is built-in, else Invoke app callback. Skip DATA if zero length\n        if ((p_cbw->total_bytes > 0) && !is_data_in(p_cbw->dir)) {\n          if (p_cbw->total_bytes > CFG_TUD_MSC_EP_BUFSIZE) {\n            TU_LOG_DRV(\"  SCSI reject non READ10/WRITE10 with large data\\r\\n\");\n            fail_scsi_op(p_msc, MSC_CSW_STATUS_FAILED);\n          } else {\n            // Didn't check for case 9 (Ho > Dn), which requires examining scsi command first\n            // but it is OK to just receive data then responded with failed status\n            TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_out, _mscd_epbuf.buf, (uint16_t) p_msc->total_len, false));\n          }\n        } else {\n          // First process if it is a built-in commands\n          int32_t resplen = proc_builtin_scsi(p_cbw->lun, p_cbw->command, _mscd_epbuf.buf, CFG_TUD_MSC_EP_BUFSIZE);\n\n          // Invoke user callback if not built-in\n          if ((resplen < 0) && (p_msc->sense_key == 0)) {\n            resplen = tud_msc_scsi_cb(p_cbw->lun, p_cbw->command, _mscd_epbuf.buf, (uint16_t)p_msc->total_len);\n          }\n\n          if (resplen < 0) {\n            // unsupported command\n            TU_LOG_DRV(\"  SCSI unsupported or failed command\\r\\n\");\n            fail_scsi_op(p_msc, MSC_CSW_STATUS_FAILED);\n          } else if (resplen == 0) {\n            if (p_cbw->total_bytes > 0) {\n              // 6.7 The 13 Cases: case 4 (Hi > Dn)\n              // TU_LOG_DRV(\"  SCSI case 4 (Hi > Dn): %lu\\r\\n\", p_cbw->total_bytes);\n              fail_scsi_op(p_msc, MSC_CSW_STATUS_FAILED);\n            } else {\n              // case 1 Hn = Dn: all good\n              p_msc->stage = MSC_STAGE_STATUS;\n            }\n          } else {\n            if (p_cbw->total_bytes == 0) {\n              // 6.7 The 13 Cases: case 2 (Hn < Di)\n              // TU_LOG_DRV(\"  SCSI case 2 (Hn < Di): %lu\\r\\n\", p_cbw->total_bytes);\n              fail_scsi_op(p_msc, MSC_CSW_STATUS_FAILED);\n            } else {\n              // cannot return more than host expect\n              p_msc->total_len = tu_min32((uint32_t)resplen, p_cbw->total_bytes);\n              TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_in, _mscd_epbuf.buf, (uint16_t) p_msc->total_len, false));\n            }\n          }\n        }\n      }\n      break;\n    }\n\n    case MSC_STAGE_DATA:\n      TU_LOG_DRV(\"  SCSI Data [Lun%u]\\r\\n\", p_cbw->lun);\n      TU_ASSERT(xferred_bytes <= CFG_TUD_MSC_EP_BUFSIZE); // sanity check to avoid buffer overflow\n      // TU_LOG_MEM(CFG_TUD_MSC_LOG_LEVEL, _mscd_epbuf.buf, xferred_bytes, 2);\n\n      if (SCSI_CMD_READ_10 == p_cbw->command[0]) {\n        p_msc->xferred_len += xferred_bytes;\n\n        if ( p_msc->xferred_len >= p_msc->total_len ) {\n          // Data Stage is complete\n          p_msc->stage = MSC_STAGE_STATUS;\n        }else {\n          proc_read10_cmd(p_msc);\n        }\n      } else if (SCSI_CMD_WRITE_10 == p_cbw->command[0]) {\n        proc_write10_host_data(p_msc, xferred_bytes);\n      } else {\n        p_msc->xferred_len += xferred_bytes;\n\n        // OUT transfer, invoke callback if needed\n        if ( !is_data_in(p_cbw->dir) ) {\n          int32_t cb_result = tud_msc_scsi_cb(p_cbw->lun, p_cbw->command, _mscd_epbuf.buf, (uint16_t) p_msc->total_len);\n\n          if ( cb_result < 0 ) {\n            // unsupported command\n            TU_LOG_DRV(\"  SCSI unsupported command\\r\\n\");\n            fail_scsi_op(p_msc, MSC_CSW_STATUS_FAILED);\n          }else {\n            // TODO haven't implement this scenario any further yet\n          }\n        }\n\n        if ( p_msc->xferred_len >= p_msc->total_len ) {\n          // Data Stage is complete\n          p_msc->stage = MSC_STAGE_STATUS;\n        } else {\n          // This scenario with command that take more than one transfer is already rejected at Command stage\n          TU_BREAKPOINT();\n        }\n      }\n    break;\n\n    case MSC_STAGE_STATUS:\n      // processed immediately after this switch, supposedly to be empty\n    break;\n\n    case MSC_STAGE_STATUS_SENT:\n      // Status phase is complete\n      if ((ep_addr == p_msc->ep_in) && (xferred_bytes == sizeof(msc_csw_t))) {\n        TU_LOG_DRV(\"  SCSI Status [Lun%u] = %u\\r\\n\", p_cbw->lun, p_csw->status);\n        // TU_LOG_MEM(CFG_TUD_MSC_LOG_LEVEL, p_csw, xferred_bytes, 2);\n\n        // Invoke complete callback if defined\n        // Note: There is racing issue with samd51 + qspi flash testing with arduino\n        // if complete_cb() is invoked after queuing the status.\n        switch (p_cbw->command[0]) {\n          case SCSI_CMD_READ_10:\n            tud_msc_read10_complete_cb(p_cbw->lun);\n            break;\n\n          case SCSI_CMD_WRITE_10:\n            tud_msc_write10_complete_cb(p_cbw->lun);\n            break;\n\n          default:\n            tud_msc_scsi_complete_cb(p_cbw->lun, p_cbw->command);\n            break;\n        }\n\n        if (!usbd_edpt_stalled(rhport, p_msc->ep_out)) {\n          TU_ASSERT(prepare_cbw(p_msc));\n        } else {\n          p_msc->stage = MSC_STAGE_CMD;\n        }\n      } else {\n        // Any xfer ended here is considered unknown error, ignore it\n        TU_LOG1(\"  Warning expect SCSI Status but received unknown data\\r\\n\");\n      }\n      break;\n\n    default: break; // nothing to do\n  }\n\n  if (p_msc->stage == MSC_STAGE_STATUS) {\n    TU_ASSERT(proc_stage_status(p_msc));\n  }\n\n  return true;\n}\n\n/*------------------------------------------------------------------*/\n/* SCSI Command Process\n *------------------------------------------------------------------*/\n\n// return response's length (copied to buffer). Negative if it is not an built-in command or indicate Failed status (CSW)\n// In case of a failed status, sense key must be set for reason of failure\nstatic int32_t proc_builtin_scsi(uint8_t lun, uint8_t const scsi_cmd[16], uint8_t* buffer, uint32_t bufsize) {\n  (void)bufsize; // TODO refractor later\n  int32_t resplen;\n\n  mscd_interface_t* p_msc = &_mscd_itf;\n\n  switch (scsi_cmd[0]) {\n    case SCSI_CMD_TEST_UNIT_READY:\n      resplen = 0;\n      if (!tud_msc_test_unit_ready_cb(lun)) {\n        // Failed status response\n        resplen = -1;\n\n        // set default sense if not set by callback\n        if (p_msc->sense_key == 0) {\n          set_sense_medium_not_present(lun);\n        }\n      }\n      break;\n\n    case SCSI_CMD_START_STOP_UNIT: {\n      resplen = 0;\n      scsi_start_stop_unit_t const* start_stop = (scsi_start_stop_unit_t const*)scsi_cmd;\n      if (!tud_msc_start_stop_cb(lun, start_stop->power_condition, start_stop->start, start_stop->load_eject)) {\n        // Failed status response\n        resplen = -1;\n\n        // set default sense if not set by callback\n        if (p_msc->sense_key == 0) {\n          set_sense_medium_not_present(lun);\n        }\n      }\n      break;\n    }\n\n    case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL: {\n      resplen = 0;\n      scsi_prevent_allow_medium_removal_t const* prevent_allow = (scsi_prevent_allow_medium_removal_t const*)scsi_cmd;\n      if (!tud_msc_prevent_allow_medium_removal_cb(lun, prevent_allow->prohibit_removal, prevent_allow->control)) {\n        // Failed status response\n        resplen = -1;\n\n        // set default sense if not set by callback\n        if (p_msc->sense_key == 0) {\n          set_sense_medium_not_present(lun);\n        }\n      }\n      break;\n    }\n\n    case SCSI_CMD_READ_CAPACITY_10: {\n      uint32_t block_count;\n      uint32_t block_size;\n      uint16_t block_size_u16;\n\n      tud_msc_capacity_cb(lun, &block_count, &block_size_u16);\n      block_size = (uint32_t)block_size_u16;\n\n      // Invalid block size/count from callback, possibly unit is not ready\n      // stall this request, set sense key to NOT READY\n      if (block_count == 0 || block_size == 0) {\n        resplen = -1;\n\n        // set default sense if not set by callback\n        if (p_msc->sense_key == 0) {\n          set_sense_medium_not_present(lun);\n        }\n      } else {\n        scsi_read_capacity10_resp_t read_capa10;\n\n        read_capa10.last_lba = tu_htonl(block_count-1);\n        read_capa10.block_size = tu_htonl(block_size);\n\n        resplen = sizeof(read_capa10);\n        TU_VERIFY(0 == tu_memcpy_s(buffer, bufsize, &read_capa10, (size_t) resplen));\n      }\n      break;\n    }\n\n    case SCSI_CMD_READ_FORMAT_CAPACITY: {\n      scsi_read_format_capacity_data_t read_fmt_capa = {\n        .list_length = 8,\n        .block_num = 0,\n        .descriptor_type = 2, // formatted media\n        .block_size_u16 = 0\n      };\n\n      uint32_t block_count;\n      uint16_t block_size;\n\n      tud_msc_capacity_cb(lun, &block_count, &block_size);\n\n      // Invalid block size/count from callback, possibly unit is not ready\n      // stall this request, set sense key to NOT READY\n      if (block_count == 0 || block_size == 0) {\n        resplen = -1;\n\n        // set default sense if not set by callback\n        if (p_msc->sense_key == 0) {\n          set_sense_medium_not_present(lun);\n        }\n      } else {\n        read_fmt_capa.block_num = tu_htonl(block_count);\n        read_fmt_capa.block_size_u16 = tu_htons(block_size);\n\n        resplen = sizeof(read_fmt_capa);\n        TU_VERIFY(0 == tu_memcpy_s(buffer, bufsize, &read_fmt_capa, (size_t) resplen));\n      }\n      break;\n    }\n\n    case SCSI_CMD_INQUIRY: {\n      scsi_inquiry_resp_t *inquiry_rsp = (scsi_inquiry_resp_t *) buffer;\n      tu_memclr(inquiry_rsp, sizeof(scsi_inquiry_resp_t));\n      inquiry_rsp->is_removable = 1;\n      inquiry_rsp->version = 2;\n      inquiry_rsp->response_data_format = 2;\n      inquiry_rsp->additional_length = sizeof(scsi_inquiry_resp_t) - 5;\n\n      resplen = (int32_t) tud_msc_inquiry2_cb(lun, inquiry_rsp, bufsize);\n      if (resplen == 0) {\n        // stub callback with no response, use v1 callback\n        tud_msc_inquiry_cb(lun, inquiry_rsp->vendor_id, inquiry_rsp->product_id, inquiry_rsp->product_rev);\n        resplen = sizeof(scsi_inquiry_resp_t);\n      }\n      break;\n    }\n\n    case SCSI_CMD_MODE_SENSE_6: {\n      scsi_mode_sense6_resp_t mode_resp = {\n        .data_len = 3,\n        .medium_type = 0,\n        .write_protected = false,\n        .reserved = 0,\n        .block_descriptor_len = 0 // no block descriptor are included\n      };\n\n      bool writable = tud_msc_is_writable_cb(lun);\n\n      mode_resp.write_protected = !writable;\n\n      resplen = sizeof(mode_resp);\n      TU_VERIFY(0 == tu_memcpy_s(buffer, bufsize, &mode_resp, (size_t) resplen));\n      break;\n    }\n\n    case SCSI_CMD_REQUEST_SENSE: {\n      scsi_sense_fixed_resp_t sense_rsp = {\n        .response_code = 0x70, // current, fixed format\n        .valid = 1\n      };\n\n      sense_rsp.add_sense_len = sizeof(scsi_sense_fixed_resp_t) - 8;\n      sense_rsp.sense_key = (uint8_t)(p_msc->sense_key & 0x0F);\n      sense_rsp.add_sense_code = p_msc->add_sense_code;\n      sense_rsp.add_sense_qualifier = p_msc->add_sense_qualifier;\n\n      resplen = sizeof(sense_rsp);\n      TU_VERIFY(0 == tu_memcpy_s(buffer, bufsize, &sense_rsp, (size_t) resplen));\n\n      // request sense callback could overwrite the sense data\n      resplen = tud_msc_request_sense_cb(lun, buffer, (uint16_t)bufsize);\n\n      // Clear sense data after copy\n      (void) tud_msc_set_sense(lun, 0, 0, 0);\n      break;\n    }\n\n    default: resplen = -1;\n      break;\n  }\n\n  return resplen;\n}\n\nstatic void proc_read10_cmd(mscd_interface_t* p_msc) {\n  msc_cbw_t const* p_cbw = &p_msc->cbw;\n  uint16_t const block_sz = rdwr10_get_blocksize(p_cbw); // already verified non-zero\n  TU_VERIFY(block_sz != 0, );\n  // Adjust lba & offset with transferred bytes\n  uint32_t const lba = rdwr10_get_lba(p_cbw->command) + (p_msc->xferred_len / block_sz);\n  uint32_t const offset = p_msc->xferred_len % block_sz;\n\n  // remaining bytes capped at class buffer\n  int32_t nbytes = (int32_t)tu_min32(CFG_TUD_MSC_EP_BUFSIZE, p_cbw->total_bytes - p_msc->xferred_len);\n\n  p_msc->pending_io = true;\n  nbytes = tud_msc_read10_cb(p_cbw->lun, lba, offset, _mscd_epbuf.buf, (uint32_t)nbytes);\n  if (nbytes != TUD_MSC_RET_ASYNC) {\n    p_msc->pending_io = false;\n    proc_read_io_data(p_msc, nbytes);\n  }\n}\n\nstatic void proc_read_io_data(mscd_interface_t* p_msc, int32_t nbytes) {\n  const uint8_t rhport = p_msc->rhport;\n  if (nbytes > 0) {\n    TU_ASSERT(usbd_edpt_xfer(rhport, p_msc->ep_in, _mscd_epbuf.buf, (uint16_t) nbytes, false),);\n  } else {\n    // nbytes is status\n    switch (nbytes) {\n      case TUD_MSC_RET_ERROR:\n        // error -> endpoint is stalled & status in CSW set to failed\n        TU_LOG_DRV(\"  IO read() failed\\r\\n\");\n        set_sense_medium_not_present(p_msc->cbw.lun);\n        fail_scsi_op(p_msc, MSC_CSW_STATUS_FAILED);\n        break;\n\n      case TUD_MSC_RET_BUSY:\n        // not ready yet -> fake a transfer complete so that this driver callback will fire again\n        dcd_event_xfer_complete(rhport, p_msc->ep_in, 0, XFER_RESULT_SUCCESS, false);\n        break;\n\n      default: break; // nothing to do\n    }\n  }\n}\n\nstatic void proc_write10_cmd(mscd_interface_t* p_msc) {\n  msc_cbw_t const* p_cbw = &p_msc->cbw;\n  const bool writable = tud_msc_is_writable_cb(p_cbw->lun);\n\n  if (!writable) {\n    // Not writable, complete this SCSI op with error\n    // Sense = Write protected\n    (void) tud_msc_set_sense(p_cbw->lun, SCSI_SENSE_DATA_PROTECT, 0x27, 0x00);\n    fail_scsi_op(p_msc, MSC_CSW_STATUS_FAILED);\n    return;\n  }\n\n  // remaining bytes capped at class buffer\n  uint16_t nbytes = (uint16_t)tu_min32(CFG_TUD_MSC_EP_BUFSIZE, p_cbw->total_bytes - p_msc->xferred_len);\n  // Write10 callback will be called later when usb transfer complete\n  TU_ASSERT(usbd_edpt_xfer(p_msc->rhport, p_msc->ep_out, _mscd_epbuf.buf, nbytes, false),);\n}\n\n// process new data arrived from WRITE10\nstatic void proc_write10_host_data(mscd_interface_t* p_msc, uint32_t xferred_bytes) {\n  msc_cbw_t const* p_cbw = &p_msc->cbw;\n  uint16_t const block_sz = rdwr10_get_blocksize(p_cbw); // already verified non-zero\n  TU_VERIFY(block_sz != 0, );\n\n  // Adjust lba & offset with transferred bytes\n  uint32_t const lba = rdwr10_get_lba(p_cbw->command) + (p_msc->xferred_len / block_sz);\n  uint32_t const offset = p_msc->xferred_len % block_sz;\n\n  p_msc->pending_io = true;\n  int32_t nbytes =  tud_msc_write10_cb(p_cbw->lun, lba, offset, _mscd_epbuf.buf, xferred_bytes);\n  if (nbytes != TUD_MSC_RET_ASYNC) {\n    p_msc->pending_io = false;\n    proc_write_io_data(p_msc, xferred_bytes, nbytes);\n  }\n}\n\nstatic void proc_write_io_data(mscd_interface_t* p_msc, uint32_t xferred_bytes, int32_t nbytes) {\n  if (nbytes < 0) {\n    // nbytes is status\n    switch (nbytes) {\n      case TUD_MSC_RET_ERROR:\n        // IO error -> failed this scsi op\n        TU_LOG_DRV(\"  IO write() failed\\r\\n\");\n        set_sense_medium_not_present(p_msc->cbw.lun);\n        fail_scsi_op(p_msc, MSC_CSW_STATUS_FAILED);\n        break;\n\n      default: break; // nothing to do\n    }\n  } else {\n    if ((uint32_t)nbytes < xferred_bytes) {\n      // Application consume less than what we got including TUD_MSC_RET_BUSY (0)\n      const uint32_t left_over = xferred_bytes - (uint32_t)nbytes;\n      if (nbytes > 0) {\n        memmove(_mscd_epbuf.buf, _mscd_epbuf.buf + nbytes, left_over);\n      }\n\n      // fake a transfer complete with adjusted parameters --> callback will be invoked with adjusted parameters\n      dcd_event_xfer_complete(p_msc->rhport, p_msc->ep_out, left_over, XFER_RESULT_SUCCESS, false);\n    } else {\n      // Application consume all bytes in our buffer\n      p_msc->xferred_len += xferred_bytes;\n\n      if (p_msc->xferred_len >= p_msc->total_len) {\n        // Data Stage is complete\n        p_msc->stage = MSC_STAGE_STATUS;\n      } else {\n        // prepare to receive more data from host\n        proc_write10_cmd(p_msc);\n      }\n    }\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/class/msc/msc_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MSC_DEVICE_H_\n#define TUSB_MSC_DEVICE_H_\n\n#include \"common/tusb_common.h\"\n#include \"msc.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n\n#if !defined(CFG_TUD_MSC_EP_BUFSIZE) & defined(CFG_TUD_MSC_BUFSIZE)\n  // TODO warn user to use new name later on\n  // #warning CFG_TUD_MSC_BUFSIZE is renamed to CFG_TUD_MSC_EP_BUFSIZE, please update to use the new name\n  #define CFG_TUD_MSC_EP_BUFSIZE  CFG_TUD_MSC_BUFSIZE\n#endif\n\n#ifndef CFG_TUD_MSC_EP_BUFSIZE\n  #error CFG_TUD_MSC_EP_BUFSIZE must be defined, value of a block size should work well, the more the better\n#endif\n\n// Return value of callback functions\nenum {\n  TUD_MSC_RET_BUSY = 0,   // Busy, e.g disk I/O is not ready\n  TUD_MSC_RET_ERROR = -1,\n  TUD_MSC_RET_ASYNC = -2, // Asynchronous IO\n};\n\nTU_VERIFY_STATIC(CFG_TUD_MSC_EP_BUFSIZE < UINT16_MAX, \"Size is not correct\");\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// Set SCSI sense response\nbool tud_msc_set_sense(uint8_t lun, uint8_t sense_key, uint8_t add_sense_code, uint8_t add_sense_qualifier);\n\n// Called by Application once asynchronous I/O operation is done\n// bytes_io is number of bytes in I/O op, typically the bufsize in read/write_cb() or\n// TUD_MSC_RET_ERROR (-1) for error. Note TUD_MSC_RET_BUSY (0) will be treated as error as well.\nbool tud_msc_async_io_done(int32_t bytes_io, bool in_isr);\n\n//--------------------------------------------------------------------+\n// Application Callbacks (WEAK is optional)\n//--------------------------------------------------------------------+\n\n/*\n  Invoked when received SCSI READ10/WRITE10 command\n  - Address = lba * BLOCK_SIZE + offset\n    - offset is only needed if CFG_TUD_MSC_EP_BUFSIZE is smaller than BLOCK_SIZE.\n  - Application fill the buffer (up to bufsize) with address contents and return number of bytes read or status.\n    - 0 < ret < bufsize: These bytes are transferred first and callback will be invoked again for remaining data.\n    - TUD_MSC_RET_BUSY\n        Application is buys e.g disk I/O not ready. Callback will be invoked again with the same parameters later on.\n    - TUD_MSC_RET_ERROR\n        error such as invalid address. This request will be STALLed and scsi command will be failed\n    - TUD_MSC_RET_ASYNC\n        Data I/O will be done asynchronously in a background task. Application should return immediately.\n        tud_msc_async_io_done() must be called once IO/ is done to signal completion.\n*/\nint32_t tud_msc_read10_cb (uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize);\nint32_t tud_msc_write10_cb (uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize);\n\n// Invoked when received SCSI_CMD_INQUIRY, v1, application should use v2 if possible\n// Application fill vendor id, product id and revision with string up to 8, 16, 4 characters respectively\nvoid tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8], uint8_t product_id[16], uint8_t product_rev[4]);\n\n// Invoked when received SCSI_CMD_INQUIRY, v2 with full inquiry response\n// Some inquiry_resp's fields are already filled with default values, application can update them\n// Return length of inquiry response, typically sizeof(scsi_inquiry_resp_t) (36 bytes), can be longer if included vendor data.\nuint32_t tud_msc_inquiry2_cb(uint8_t lun, scsi_inquiry_resp_t *inquiry_resp, uint32_t bufsize);\n\n// Invoked when received Test Unit Ready command.\n// return true allowing host to read/write this LUN e.g SD card inserted\nbool tud_msc_test_unit_ready_cb(uint8_t lun);\n\n// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size\n// Application update block count and block size\nvoid tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size);\n\n/**\n * Invoked when received an SCSI command not in built-in list below.\n * - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, TEST_UNIT_READY, START_STOP_UNIT, MODE_SENSE6, REQUEST_SENSE\n * - READ10 and WRITE10 has their own callbacks\n *\n * \\param[in]   lun         Logical unit number\n * \\param[in]   scsi_cmd    SCSI command contents which application must examine to response accordingly\n * \\param[out]  buffer      Buffer for SCSI Data Stage.\n *                            - For INPUT: application must fill this with response.\n *                            - For OUTPUT it holds the Data from host\n * \\param[in]   bufsize     Buffer's length.\n *\n * \\return      Actual bytes processed, can be zero for no-data command.\n * \\retval      negative    Indicate error e.g unsupported command, tinyusb will \\b STALL the corresponding\n *                          endpoint and return failed status in command status wrapper phase.\n */\nint32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize);\n\n/*------------- Optional callbacks -------------*/\n\n// Invoked when received GET_MAX_LUN request, required for multiple LUNs implementation\nuint8_t tud_msc_get_maxlun_cb(void);\n\n// Invoked when received Start Stop Unit command\n// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage\n// - Start = 1 : active mode, if load_eject = 1 : load disk storage\nbool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject);\n\n//Invoked when we receive the Prevent / Allow Medium Removal command\nbool tud_msc_prevent_allow_medium_removal_cb(uint8_t lun, uint8_t prohibit_removal, uint8_t control);\n\n// Invoked when received REQUEST_SENSE\nint32_t tud_msc_request_sense_cb(uint8_t lun, void* buffer, uint16_t bufsize);\n\n// Invoked when Read10 command is complete\nvoid tud_msc_read10_complete_cb(uint8_t lun);\n\n// Invoke when Write10 command is complete, can be used to flush flash caching\nvoid tud_msc_write10_complete_cb(uint8_t lun);\n\n// Invoked when command in tud_msc_scsi_cb is complete\nvoid tud_msc_scsi_complete_cb(uint8_t lun, uint8_t const scsi_cmd[16]);\n\n// Invoked to check if device is writable as part of SCSI WRITE10\nbool tud_msc_is_writable_cb(uint8_t lun);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     mscd_init            (void);\nbool     mscd_deinit          (void);\nvoid     mscd_reset           (uint8_t rhport);\nuint16_t mscd_open            (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     mscd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * p_request);\nbool     mscd_xfer_cb         (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_MSC_DEVICE_H_ */\n"
  },
  {
    "path": "src/class/msc/msc_host.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && CFG_TUH_MSC\n\n#include \"host/usbh.h\"\n#include \"host/usbh_pvt.h\"\n\n#include \"msc_host.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUH_MSC_LOG_LEVEL\n  #define CFG_TUH_MSC_LOG_LEVEL   CFG_TUH_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUH_MSC_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\nenum {\n  MSC_STAGE_IDLE = 0,\n  MSC_STAGE_CMD,\n  MSC_STAGE_DATA,\n  MSC_STAGE_STATUS,\n};\n\ntypedef struct {\n  uint8_t itf_num;\n  uint8_t ep_in;\n  uint8_t ep_out;\n  uint8_t max_lun;\n\n  volatile bool configured; // Receive SET_CONFIGURE\n  volatile bool mounted;    // Enumeration is complete\n\n  // SCSI command data\n  uint8_t stage;\n  void* buffer;\n  tuh_msc_complete_cb_t complete_cb;\n  uintptr_t complete_arg;\n\n  struct {\n    uint32_t block_size;\n    uint32_t block_count;\n  } capacity[CFG_TUH_MSC_MAXLUN];\n} msch_interface_t;\n\ntypedef struct {\n  TUH_EPBUF_TYPE_DEF(msc_cbw_t, cbw);\n  TUH_EPBUF_TYPE_DEF(msc_csw_t, csw);\n} msch_epbuf_t;\n\nstatic msch_interface_t _msch_itf[CFG_TUH_DEVICE_MAX];\nCFG_TUH_MEM_SECTION static msch_epbuf_t _msch_epbuf[CFG_TUH_DEVICE_MAX];\n\nTU_ATTR_ALWAYS_INLINE static inline msch_interface_t* get_itf(uint8_t daddr) {\n  return &_msch_itf[daddr - 1];\n}\n\nTU_ATTR_ALWAYS_INLINE static inline msch_epbuf_t* get_epbuf(uint8_t daddr) {\n  return &_msch_epbuf[daddr - 1];\n}\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tuh_msc_mount_cb(uint8_t dev_addr) {\n  (void) dev_addr;\n}\n\nTU_ATTR_WEAK void tuh_msc_umount_cb(uint8_t dev_addr) {\n  (void) dev_addr;\n}\n\n//--------------------------------------------------------------------+\n// PUBLIC API\n//--------------------------------------------------------------------+\nuint8_t tuh_msc_get_maxlun(uint8_t dev_addr) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  return p_msc->max_lun;\n}\n\nuint32_t tuh_msc_get_block_count(uint8_t dev_addr, uint8_t lun) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  return p_msc->capacity[lun].block_count;\n}\n\nuint32_t tuh_msc_get_block_size(uint8_t dev_addr, uint8_t lun) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  return p_msc->capacity[lun].block_size;\n}\n\nbool tuh_msc_mounted(uint8_t dev_addr) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  return p_msc->mounted;\n}\n\nbool tuh_msc_ready(uint8_t dev_addr) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  TU_VERIFY(p_msc->mounted);\n  const bool epin_busy = usbh_edpt_busy(dev_addr, p_msc->ep_in);\n  const bool epout_busy = usbh_edpt_busy(dev_addr, p_msc->ep_out);\n  return !epin_busy && !epout_busy;\n}\n\n//--------------------------------------------------------------------+\n// PUBLIC API: SCSI COMMAND\n//--------------------------------------------------------------------+\nstatic inline void cbw_init(msc_cbw_t* cbw, uint8_t lun) {\n  tu_memclr(cbw, sizeof(msc_cbw_t));\n  cbw->signature = MSC_CBW_SIGNATURE;\n  cbw->tag       = 0x54555342; // TUSB\n  cbw->lun       = lun;\n}\n\nbool tuh_msc_scsi_command(uint8_t daddr, msc_cbw_t const* cbw, void* data,\n                          tuh_msc_complete_cb_t complete_cb, uintptr_t arg) {\n  msch_interface_t* p_msc = get_itf(daddr);\n  TU_VERIFY(p_msc->configured);\n\n  // claim endpoint\n  TU_VERIFY(usbh_edpt_claim(daddr, p_msc->ep_out));\n  msch_epbuf_t* epbuf = get_epbuf(daddr);\n\n  epbuf->cbw = *cbw;\n  p_msc->buffer = data;\n  p_msc->complete_cb = complete_cb;\n  p_msc->complete_arg = arg;\n  p_msc->stage = MSC_STAGE_CMD;\n\n  if (!usbh_edpt_xfer(daddr, p_msc->ep_out, (uint8_t*) &epbuf->cbw, sizeof(msc_cbw_t))) {\n    (void) usbh_edpt_release(daddr, p_msc->ep_out);\n    return false;\n  }\n\n  return true;\n}\n\nbool tuh_msc_read_capacity(uint8_t dev_addr, uint8_t lun, scsi_read_capacity10_resp_t* response,\n                           tuh_msc_complete_cb_t complete_cb, uintptr_t arg) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  TU_VERIFY(p_msc->configured);\n\n  msc_cbw_t cbw;\n  cbw_init(&cbw, lun);\n\n  cbw.total_bytes = sizeof(scsi_read_capacity10_resp_t);\n  cbw.dir        = TUSB_DIR_IN_MASK;\n  cbw.cmd_len    = sizeof(scsi_read_capacity10_t);\n  cbw.command[0] = SCSI_CMD_READ_CAPACITY_10;\n\n  return tuh_msc_scsi_command(dev_addr, &cbw, response, complete_cb, arg);\n}\n\nbool tuh_msc_inquiry(uint8_t dev_addr, uint8_t lun, scsi_inquiry_resp_t* response,\n                     tuh_msc_complete_cb_t complete_cb, uintptr_t arg) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  TU_VERIFY(p_msc->mounted);\n\n  msc_cbw_t cbw;\n  cbw_init(&cbw, lun);\n\n  cbw.total_bytes = sizeof(scsi_inquiry_resp_t);\n  cbw.dir         = TUSB_DIR_IN_MASK;\n  cbw.cmd_len     = sizeof(scsi_inquiry_t);\n\n  scsi_inquiry_t const cmd_inquiry = {\n      .cmd_code     = SCSI_CMD_INQUIRY,\n      .alloc_length = sizeof(scsi_inquiry_resp_t)\n  };\n  memcpy(cbw.command, &cmd_inquiry, cbw.cmd_len); //-V1086\n\n  return tuh_msc_scsi_command(dev_addr, &cbw, response, complete_cb, arg);\n}\n\nbool tuh_msc_test_unit_ready(uint8_t dev_addr, uint8_t lun, tuh_msc_complete_cb_t complete_cb, uintptr_t arg) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  TU_VERIFY(p_msc->configured);\n\n  msc_cbw_t cbw;\n  cbw_init(&cbw, lun);\n\n  cbw.total_bytes = 0;\n  cbw.dir        = TUSB_DIR_OUT;\n  cbw.cmd_len    = sizeof(scsi_test_unit_ready_t);\n  cbw.command[0] = SCSI_CMD_TEST_UNIT_READY;\n  cbw.command[1] = lun; // according to wiki TODO need verification\n\n  return tuh_msc_scsi_command(dev_addr, &cbw, NULL, complete_cb, arg);\n}\n\nbool tuh_msc_request_sense(uint8_t dev_addr, uint8_t lun, void* response,\n                           tuh_msc_complete_cb_t complete_cb, uintptr_t arg) {\n  msc_cbw_t cbw;\n  cbw_init(&cbw, lun);\n\n  cbw.total_bytes = 18; // TODO sense response\n  cbw.dir         = TUSB_DIR_IN_MASK;\n  cbw.cmd_len     = sizeof(scsi_request_sense_t);\n\n  scsi_request_sense_t const cmd_request_sense = {\n      .cmd_code     = SCSI_CMD_REQUEST_SENSE,\n      .alloc_length = 18\n  };\n  memcpy(cbw.command, &cmd_request_sense, cbw.cmd_len); //-V1086\n\n  return tuh_msc_scsi_command(dev_addr, &cbw, response, complete_cb, arg);\n}\n\nbool tuh_msc_read10(uint8_t dev_addr, uint8_t lun, void* buffer, uint32_t lba, uint16_t block_count,\n                    tuh_msc_complete_cb_t complete_cb, uintptr_t arg) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  TU_VERIFY(p_msc->mounted);\n\n  msc_cbw_t cbw;\n  cbw_init(&cbw, lun);\n\n  cbw.total_bytes = block_count * p_msc->capacity[lun].block_size;\n  cbw.dir = TUSB_DIR_IN_MASK;\n  cbw.cmd_len = sizeof(scsi_read10_t);\n\n  scsi_read10_t const cmd_read10 = {\n      .cmd_code    = SCSI_CMD_READ_10,\n      .lba         = tu_htonl(lba),\n      .block_count = tu_htons(block_count)\n  };\n  memcpy(cbw.command, &cmd_read10, cbw.cmd_len); //-V1086\n\n  return tuh_msc_scsi_command(dev_addr, &cbw, buffer, complete_cb, arg);\n}\n\nbool tuh_msc_write10(uint8_t dev_addr, uint8_t lun, void const* buffer, uint32_t lba, uint16_t block_count,\n                     tuh_msc_complete_cb_t complete_cb, uintptr_t arg) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  TU_VERIFY(p_msc->mounted);\n\n  msc_cbw_t cbw;\n  cbw_init(&cbw, lun);\n\n  cbw.total_bytes = block_count * p_msc->capacity[lun].block_size;\n  cbw.dir         = TUSB_DIR_OUT;\n  cbw.cmd_len     = sizeof(scsi_write10_t);\n\n  scsi_write10_t const cmd_write10 = {\n      .cmd_code    = SCSI_CMD_WRITE_10,\n      .lba         = tu_htonl(lba),\n      .block_count = tu_htons(block_count)\n  };\n  memcpy(cbw.command, &cmd_write10, cbw.cmd_len); //-V1086\n\n  return tuh_msc_scsi_command(dev_addr, &cbw, (void*) (uintptr_t) buffer, complete_cb, arg);\n}\n\n#if 0\n// MSC interface Reset (not used now)\nbool tuh_msc_reset(uint8_t dev_addr) {\n  tusb_control_request_t const new_request = {\n    .bmRequestType_bit = {\n      .recipient = TUSB_REQ_RCPT_INTERFACE,\n      .type      = TUSB_REQ_TYPE_CLASS,\n      .direction = TUSB_DIR_OUT\n    },\n    .bRequest = MSC_REQ_RESET,\n    .wValue   = 0,\n    .wIndex   = p_msc->itf_num,\n    .wLength  = 0\n  };\n  TU_ASSERT( usbh_control_xfer( dev_addr, &new_request, NULL ) );\n}\n#endif\n\n//--------------------------------------------------------------------+\n// CLASS-USBH API\n//--------------------------------------------------------------------+\nbool msch_init(void) {\n  TU_LOG_DRV(\"sizeof(msch_interface_t) = %u\\r\\n\", sizeof(msch_interface_t));\n  TU_LOG_DRV(\"sizeof(msch_epbuf_t) = %u\\r\\n\", sizeof(msch_epbuf_t));\n  tu_memclr(_msch_itf, sizeof(_msch_itf));\n  return true;\n}\n\nbool msch_deinit(void) {\n  return true;\n}\n\nvoid msch_close(uint8_t dev_addr) {\n  TU_VERIFY(dev_addr <= CFG_TUH_DEVICE_MAX,);\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  TU_VERIFY(p_msc->configured,);\n\n  TU_LOG_DRV(\"  MSCh close addr = %d\\r\\n\", dev_addr);\n\n  // invoke Application Callback\n  if (p_msc->mounted) {\n    tuh_msc_umount_cb(dev_addr);\n  }\n\n  tu_memclr(p_msc, sizeof(msch_interface_t));\n}\n\nbool msch_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes) {\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  msch_epbuf_t* epbuf = get_epbuf(dev_addr);\n  msc_cbw_t const * cbw = &epbuf->cbw;\n  msc_csw_t       * csw = &epbuf->csw;\n\n  switch (p_msc->stage) {\n    case MSC_STAGE_CMD:\n      // Must be Command Block\n      TU_ASSERT(ep_addr == p_msc->ep_out && event == XFER_RESULT_SUCCESS && xferred_bytes == sizeof(msc_cbw_t));\n      if (cbw->total_bytes && p_msc->buffer) {\n        // Data stage if any\n        p_msc->stage = MSC_STAGE_DATA;\n        uint8_t const ep_data = (cbw->dir & TUSB_DIR_IN_MASK) ? p_msc->ep_in : p_msc->ep_out;\n        TU_ASSERT(usbh_edpt_xfer(dev_addr, ep_data, p_msc->buffer, (uint16_t) cbw->total_bytes));\n        break;\n      }\n      TU_ATTR_FALLTHROUGH; // fallthrough to data stage\n\n    case MSC_STAGE_DATA:\n      // Status stage\n      p_msc->stage = MSC_STAGE_STATUS;\n      TU_ASSERT(usbh_edpt_xfer(dev_addr, p_msc->ep_in, (uint8_t*) csw, (uint16_t) sizeof(msc_csw_t)));\n      break;\n\n    case MSC_STAGE_STATUS:\n      // SCSI op is complete\n      p_msc->stage = MSC_STAGE_IDLE;\n      if (p_msc->complete_cb != NULL) {\n        tuh_msc_complete_data_t const cb_data = {\n            .cbw = cbw,\n            .csw = csw,\n            .scsi_data = p_msc->buffer,\n            .user_arg = p_msc->complete_arg\n        };\n        (void) p_msc->complete_cb(dev_addr, &cb_data);\n      }\n      break;\n\n    default:\n      // unknown state\n      break;\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// MSC Enumeration\n//--------------------------------------------------------------------+\nstatic void config_get_maxlun_complete(tuh_xfer_t* xfer);\nstatic bool config_test_unit_ready_complete(uint8_t dev_addr, tuh_msc_complete_data_t const* cb_data);\nstatic bool config_request_sense_complete(uint8_t dev_addr, tuh_msc_complete_data_t const* cb_data);\nstatic bool config_read_capacity_complete(uint8_t dev_addr, tuh_msc_complete_data_t const* cb_data);\n\nuint16_t msch_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *desc_itf, uint16_t max_len) {\n  (void) rhport;\n  TU_VERIFY(MSC_SUBCLASS_SCSI == desc_itf->bInterfaceSubClass && MSC_PROTOCOL_BOT == desc_itf->bInterfaceProtocol, 0);\n\n  // msc driver length is fixed\n  const uint16_t drv_len =\n    (uint16_t)(sizeof(tusb_desc_interface_t) + desc_itf->bNumEndpoints * sizeof(tusb_desc_endpoint_t));\n  TU_ASSERT(drv_len <= max_len, 0);\n\n  msch_interface_t           *p_msc   = get_itf(dev_addr);\n  const tusb_desc_endpoint_t *ep_desc = (const tusb_desc_endpoint_t *)tu_desc_next(desc_itf);\n\n  for (uint32_t i = 0; i < 2; i++) {\n    TU_ASSERT(TUSB_DESC_ENDPOINT == ep_desc->bDescriptorType && TUSB_XFER_BULK == ep_desc->bmAttributes.xfer, 0);\n    TU_ASSERT(tuh_edpt_open(dev_addr, ep_desc), 0);\n\n    if (TUSB_DIR_IN == tu_edpt_dir(ep_desc->bEndpointAddress)) {\n      p_msc->ep_in = ep_desc->bEndpointAddress;\n    } else {\n      p_msc->ep_out = ep_desc->bEndpointAddress;\n    }\n\n    ep_desc = (tusb_desc_endpoint_t const*) tu_desc_next(ep_desc);\n  }\n\n  p_msc->itf_num = desc_itf->bInterfaceNumber;\n\n  return drv_len;\n}\n\nbool msch_set_config(uint8_t daddr, uint8_t itf_num) {\n  msch_interface_t* p_msc = get_itf(daddr);\n  TU_ASSERT(p_msc->itf_num == itf_num);\n  p_msc->configured = true;\n\n  //------------- Get Max Lun -------------//\n  TU_LOG_DRV(\"MSC Get Max Lun\\r\\n\");\n  tusb_control_request_t const request = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type      = TUSB_REQ_TYPE_CLASS,\n          .direction = TUSB_DIR_IN\n      },\n      .bRequest = MSC_REQ_GET_MAX_LUN,\n      .wValue   = 0,\n      .wIndex   = itf_num,\n      .wLength  = 1\n  };\n\n  uint8_t* enum_buf = usbh_get_enum_buf();\n  tuh_xfer_t xfer = {\n      .daddr       = daddr,\n      .ep_addr     = 0,\n      .setup       = &request,\n      .buffer      = enum_buf,\n      .complete_cb = config_get_maxlun_complete,\n      .user_data    = 0\n  };\n  TU_ASSERT(tuh_control_xfer(&xfer));\n\n  return true;\n}\n\nstatic void config_get_maxlun_complete(tuh_xfer_t* xfer) {\n  uint8_t const daddr = xfer->daddr;\n  msch_interface_t* p_msc = get_itf(daddr);\n\n  // MAXLUN's response is minus 1 by specs, STALL means 1\n  if (XFER_RESULT_SUCCESS == xfer->result) {\n    uint8_t* enum_buf = usbh_get_enum_buf();\n    p_msc->max_lun = enum_buf[0] + 1;\n  } else {\n    p_msc->max_lun = 1;\n  }\n\n  TU_LOG_DRV(\"  Max LUN = %u\\r\\n\", p_msc->max_lun);\n\n  // TODO multiple LUN support\n  TU_LOG_DRV(\"SCSI Test Unit Ready\\r\\n\");\n  uint8_t const lun = 0;\n  tuh_msc_test_unit_ready(daddr, lun, config_test_unit_ready_complete, 0);\n}\n\nstatic bool config_test_unit_ready_complete(uint8_t dev_addr, tuh_msc_complete_data_t const* cb_data) {\n  msc_cbw_t const* cbw = cb_data->cbw;\n  msc_csw_t const* csw = cb_data->csw;\n  uint8_t* enum_buf = usbh_get_enum_buf();\n\n  if (csw->status == 0) {\n    // Unit is ready, read its capacity\n    TU_LOG_DRV(\"SCSI Read Capacity\\r\\n\");\n    tuh_msc_read_capacity(dev_addr, cbw->lun, (scsi_read_capacity10_resp_t*) (uintptr_t) enum_buf,\n                          config_read_capacity_complete, 0);\n  } else {\n    // Note: During enumeration, some device fails Test Unit Ready and require a few retries\n    // with Request Sense to start working !!\n    // TODO limit number of retries\n    TU_LOG_DRV(\"SCSI Request Sense\\r\\n\");\n    TU_ASSERT(tuh_msc_request_sense(dev_addr, cbw->lun, enum_buf, config_request_sense_complete, 0));\n  }\n\n  return true;\n}\n\nstatic bool config_request_sense_complete(uint8_t dev_addr, tuh_msc_complete_data_t const* cb_data) {\n  msc_cbw_t const* cbw = cb_data->cbw;\n  msc_csw_t const* csw = cb_data->csw;\n\n  TU_ASSERT(csw->status == 0);\n  TU_ASSERT(tuh_msc_test_unit_ready(dev_addr, cbw->lun, config_test_unit_ready_complete, 0));\n  return true;\n}\n\nstatic bool config_read_capacity_complete(uint8_t dev_addr, tuh_msc_complete_data_t const* cb_data) {\n  msc_cbw_t const* cbw = cb_data->cbw;\n  msc_csw_t const* csw = cb_data->csw;\n  TU_ASSERT(csw->status == 0);\n  msch_interface_t* p_msc = get_itf(dev_addr);\n  uint8_t* enum_buf = usbh_get_enum_buf();\n\n  // Capacity response field: Block size and Last LBA are both Big-Endian\n  scsi_read_capacity10_resp_t* resp = (scsi_read_capacity10_resp_t*) (uintptr_t) enum_buf;\n  p_msc->capacity[cbw->lun].block_count = (uint32_t) (tu_ntohl(resp->last_lba) + 1u);\n  p_msc->capacity[cbw->lun].block_size  = tu_ntohl(resp->block_size);\n\n  // Mark enumeration is complete\n  p_msc->mounted = true;\n  tuh_msc_mount_cb(dev_addr);\n\n  // notify usbh that driver enumeration is complete\n  usbh_driver_set_config_complete(dev_addr, p_msc->itf_num);\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/msc/msc_host.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MSC_HOST_H_\n#define TUSB_MSC_HOST_H_\n\n#include \"msc.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Class Driver Configuration\n//--------------------------------------------------------------------+\n\n#ifndef CFG_TUH_MSC_MAXLUN\n  #define CFG_TUH_MSC_MAXLUN 4\n#endif\n\ntypedef struct {\n  const msc_cbw_t *cbw;       // SCSI command\n  const msc_csw_t *csw;       // SCSI status\n  void            *scsi_data; // SCSI Data\n  uintptr_t        user_arg;  // user argument\n} tuh_msc_complete_data_t;\n\ntypedef bool (*tuh_msc_complete_cb_t)(uint8_t dev_addr, const tuh_msc_complete_data_t *cb_data);\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// Check if device supports MassStorage interface.\n// This function true after tuh_msc_mounted_cb() and false after tuh_msc_unmounted_cb()\nbool tuh_msc_mounted(uint8_t dev_addr);\n\n// Check if the interface is currently ready or busy transferring data\nbool tuh_msc_ready(uint8_t dev_addr);\n\n// Get Max Lun\nuint8_t tuh_msc_get_maxlun(uint8_t dev_addr);\n\n// Get number of block\nuint32_t tuh_msc_get_block_count(uint8_t dev_addr, uint8_t lun);\n\n// Get block size in bytes\nuint32_t tuh_msc_get_block_size(uint8_t dev_addr, uint8_t lun);\n\n// Perform a full SCSI command (cbw, data, csw) in non-blocking manner.\n// Complete callback is invoked when SCSI op is complete.\n// return true if success, false if there is already pending operation.\n// NOTE: buffer must be accessible by USB/DMA controller, aligned correctly and multiple of cache line if enabled\nbool tuh_msc_scsi_command(uint8_t daddr, const msc_cbw_t *cbw, void *data, tuh_msc_complete_cb_t complete_cb,\n                          uintptr_t arg);\n\n// Perform SCSI Inquiry command\n// Complete callback is invoked when SCSI op is complete.\n// NOTE: response must be accessible by USB/DMA controller, aligned correctly and multiple of cache line if enabled\nbool tuh_msc_inquiry(uint8_t dev_addr, uint8_t lun, scsi_inquiry_resp_t *response, tuh_msc_complete_cb_t complete_cb,\n                     uintptr_t arg);\n\n// Perform SCSI Test Unit Ready command\n// Complete callback is invoked when SCSI op is complete.\nbool tuh_msc_test_unit_ready(uint8_t dev_addr, uint8_t lun, tuh_msc_complete_cb_t complete_cb, uintptr_t arg);\n\n// Perform SCSI Request Sense 10 command\n// Complete callback is invoked when SCSI op is complete.\n// NOTE: response must be accessible by USB/DMA controller, aligned correctly and multiple of cache line if enabled\nbool tuh_msc_request_sense(uint8_t dev_addr, uint8_t lun, void *response, tuh_msc_complete_cb_t complete_cb,\n                           uintptr_t arg);\n\n// Perform SCSI Read 10 command. Read n blocks starting from LBA to buffer\n// Complete callback is invoked when SCSI op is complete.\n// NOTE: buffer must be accessible by USB/DMA controller, aligned correctly and multiple of cache line if enabled\nbool tuh_msc_read10(uint8_t dev_addr, uint8_t lun, void *buffer, uint32_t lba, uint16_t block_count,\n                    tuh_msc_complete_cb_t complete_cb, uintptr_t arg);\n\n// Perform SCSI Write 10 command. Write n blocks starting from LBA to device\n// Complete callback is invoked when SCSI op is complete.\n// NOTE: buffer must be accessible by USB/DMA controller, aligned correctly and multiple of cache line if enabled\nbool tuh_msc_write10(uint8_t dev_addr, uint8_t lun, const void *buffer, uint32_t lba, uint16_t block_count,\n                     tuh_msc_complete_cb_t complete_cb, uintptr_t arg);\n\n// Perform SCSI Read Capacity 10 command\n// Complete callback is invoked when SCSI op is complete.\n// Note: during enumeration, host stack already carried out this request. Application can retrieve capacity by\n// simply call tuh_msc_get_block_count() and tuh_msc_get_block_size()\nbool tuh_msc_read_capacity(uint8_t dev_addr, uint8_t lun, scsi_read_capacity10_resp_t *response,\n                           tuh_msc_complete_cb_t complete_cb, uintptr_t arg);\n\n//------------- Application Callback -------------//\n\n// Invoked when a device with MassStorage interface is mounted\nvoid tuh_msc_mount_cb(uint8_t dev_addr);\n\n// Invoked when a device with MassStorage interface is unmounted\nvoid tuh_msc_umount_cb(uint8_t dev_addr);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\n\nbool     msch_init(void);\nbool     msch_deinit(void);\nuint16_t msch_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *desc_itf, uint16_t max_len);\nbool     msch_set_config(uint8_t daddr, uint8_t itf_num);\nvoid     msch_close(uint8_t dev_addr);\nbool     msch_xfer_cb(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/class/mtp/mtp.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ennebi Elettronica (https://ennebielettronica.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MTP_H_\n#define TUSB_MTP_H_\n\n#include \"common/tusb_common.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_MTP)\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Media Transfer Protocol Class Constant\n//--------------------------------------------------------------------+\n\n// Media Transfer Protocol Subclass\ntypedef enum {\n  MTP_SUBCLASS_STILL_IMAGE = 1\n} mtp_subclass_type_t;\n\n// MTP Protocol.\ntypedef enum {\n  MTP_PROTOCOL_PIMA_15470 = 1, ///< Picture Transfer Protocol (PIMA 15470)\n} mtp_protocol_type_t;\n\n// PTP/MTP protocol phases\ntypedef enum {\n  MTP_PHASE_COMMAND = 0,\n  MTP_PHASE_DATA,\n  MTP_PHASE_RESPONSE,\n  MTP_PHASE_ERROR\n} mtp_phase_type_t;\n\n// PTP/MTP Class requests, PIMA 15740-2000: D.5.2\ntypedef enum {\n  MTP_REQ_CANCEL             = 0x64,\n  MTP_REQ_GET_EXT_EVENT_DATA = 0x65,\n  MTP_REQ_RESET              = 0x66,\n  MTP_REQ_GET_DEVICE_STATUS  = 0x67,\n} mtp_class_request_t;\n\n// PTP/MTP Container type\ntypedef enum {\n  MTP_CONTAINER_TYPE_UNDEFINED      = 0,\n  MTP_CONTAINER_TYPE_COMMAND_BLOCK  = 1,\n  MTP_CONTAINER_TYPE_DATA_BLOCK     = 2,\n  MTP_CONTAINER_TYPE_RESPONSE_BLOCK = 3,\n  MTP_CONTAINER_TYPE_EVENT_BLOCK    = 4,\n} mtp_container_type_t;\n\n// MTP 1.1 Appendix A: Object formats\ntypedef enum {\n  // ---- Base formats ----\n  MTP_OBJ_FORMAT_UNDEFINED        = 0x3000u, // Undefined object\n  MTP_OBJ_FORMAT_ASSOCIATION      = 0x3001u, // Association (for example, a folder)\n  MTP_OBJ_FORMAT_SCRIPT           = 0x3002u, // Device model-specific script\n  MTP_OBJ_FORMAT_EXECUTABLE       = 0x3003u, // Device model-specific binary executable\n  MTP_OBJ_FORMAT_TEXT             = 0x3004u, // Text file\n  MTP_OBJ_FORMAT_HTML             = 0x3005u, // Hypertext Markup Language file (text)\n  MTP_OBJ_FORMAT_DPOF             = 0x3006u, // Digital Print Order Format file (text)\n  MTP_OBJ_FORMAT_AIFF             = 0x3007u, // Audio clip (AIFF)\n  MTP_OBJ_FORMAT_WAV              = 0x3008u, // Audio clip (WAV)\n  MTP_OBJ_FORMAT_MP3              = 0x3009u, // MPEG-1 Layer III audio (ISO/IEC 13818-3)\n  MTP_OBJ_FORMAT_AVI              = 0x300Au, // Video clip (AVI)\n  MTP_OBJ_FORMAT_MPEG             = 0x300Bu, // Video clip (MPEG)\n  MTP_OBJ_FORMAT_ASF              = 0x300Cu, // Microsoft Advanced Streaming Format (video)\n\n  // ---- Image formats ----\n  MTP_OBJ_FORMAT_UNDEFINED_IMAGE  = 0x3800u, // Undefined image object\n  MTP_OBJ_FORMAT_EXIF_JPEG        = 0x3801u, // Exchangeable Image Format, JEIDA standard\n  MTP_OBJ_FORMAT_TIFF_EP          = 0x3802u, // Tag Image File Format for Electronic Photography\n  MTP_OBJ_FORMAT_FLASHPIX         = 0x3803u, // Structured Storage Image Format (FlashPix)\n  MTP_OBJ_FORMAT_BMP              = 0x3804u, // Microsoft Windows Bitmap file\n  MTP_OBJ_FORMAT_CIFF             = 0x3805u, // Canon Camera Image File Format\n  MTP_OBJ_FORMAT_UNDEFINED_3806   = 0x3806u, // Reserved / Undefined\n  MTP_OBJ_FORMAT_GIF              = 0x3807u, // Graphics Interchange Format\n  MTP_OBJ_FORMAT_JFIF             = 0x3808u, // JPEG File Interchange Format\n  MTP_OBJ_FORMAT_CD               = 0x3809u, // PhotoCD Image Pac\n  MTP_OBJ_FORMAT_PICT             = 0x380Au, // Quickdraw Image Format\n  MTP_OBJ_FORMAT_PNG              = 0x380Bu, // Portable Network Graphics\n  MTP_OBJ_FORMAT_UNDEFINED_380C   = 0x380Cu, // Reserved / Undefined\n  MTP_OBJ_FORMAT_TIFF             = 0x380Du, // Tag Image File Format (baseline)\n  MTP_OBJ_FORMAT_TIFF_IT          = 0x380Eu, // Tag Image File Format for IT (graphic arts)\n  MTP_OBJ_FORMAT_JP2              = 0x380Fu, // JPEG2000 Baseline File Format\n  MTP_OBJ_FORMAT_JPX              = 0x3810u, // JPEG2000 Extended File Format\n\n  // ---- Firmware & misc ----\n  MTP_OBJ_FORMAT_UNDEFINED_FIRMWARE = 0xB802u, // Undefined Firmware\n  MTP_OBJ_FORMAT_WBMP               = 0xB803u, // Wireless Application Protocol Bitmap Format (.wbmp)\n  MTP_OBJ_FORMAT_WINDOWS_IMAGE      = 0xB881u, // Windows Image Format\n  MTP_OBJ_FORMAT_JPEGXR             = 0xB804u, // JPEG XR (.hdp, .jxr, .wdp)\n\n  // ---- Audio formats ----\n  MTP_OBJ_FORMAT_UNDEFINED_AUDIO  = 0xB900u, // Undefined audio object\n  MTP_OBJ_FORMAT_WMA              = 0xB901u, // Windows Media Audio\n  MTP_OBJ_FORMAT_OGG              = 0xB902u, // OGG container\n  MTP_OBJ_FORMAT_AAC              = 0xB903u, // Advanced Audio Coding (.aac)\n  MTP_OBJ_FORMAT_AUDIBLE          = 0xB904u, // Audible format\n  MTP_OBJ_FORMAT_FLAC             = 0xB906u, // Free Lossless Audio Codec\n  MTP_OBJ_FORMAT_QCELP            = 0xB907u, // Qualcomm Code Excited Linear Prediction (.qcp)\n  MTP_OBJ_FORMAT_AMR              = 0xB908u, // Adaptive Multi-Rate audio (.amr)\n\n  // ---- Video formats ----\n  MTP_OBJ_FORMAT_UNDEFINED_VIDEO  = 0xB980u, // Undefined video object\n  MTP_OBJ_FORMAT_WMV              = 0xB981u, // Windows Media Video\n  MTP_OBJ_FORMAT_MP4              = 0xB982u, // MP4 Container (ISO 14496-1)\n  MTP_OBJ_FORMAT_MP2              = 0xB983u, // MPEG-1 Layer II audio\n  MTP_OBJ_FORMAT_3GP              = 0xB984u, // 3GP Container\n  MTP_OBJ_FORMAT_3G2              = 0xB985u, // 3GPP2 Container\n  MTP_OBJ_FORMAT_AVCHD            = 0xB986u, // AVCHD (MPEG-4 AVC + Dolby Digital)\n  MTP_OBJ_FORMAT_ATSC_TS          = 0xB987u, // ATSC-compliant MPEG-2 Transport Stream\n  MTP_OBJ_FORMAT_DVB_TS           = 0xB988u, // DVB-compliant MPEG-2 Transport Stream\n\n  // ---- Collections ----\n  MTP_OBJ_FORMAT_UNDEFINED_COLLECTION          = 0xBA00u, // Undefined collection\n  MTP_OBJ_FORMAT_ABSTRACT_MULTIMEDIA_ALBUM     = 0xBA01u, // Abstract Multimedia Album\n  MTP_OBJ_FORMAT_ABSTRACT_IMAGE_ALBUM          = 0xBA02u, // Abstract Image Album\n  MTP_OBJ_FORMAT_ABSTRACT_AUDIO_ALBUM          = 0xBA03u, // Abstract Audio Album\n  MTP_OBJ_FORMAT_ABSTRACT_VIDEO_ALBUM          = 0xBA04u, // Abstract Video Album\n  MTP_OBJ_FORMAT_ABSTRACT_AV_PLAYLIST          = 0xBA05u, // Abstract Audio & Video Playlist\n  MTP_OBJ_FORMAT_ABSTRACT_CONTACT_GROUP        = 0xBA06u, // Abstract Contact Group\n  MTP_OBJ_FORMAT_ABSTRACT_MESSAGE_FOLDER       = 0xBA07u, // Abstract Message Folder\n  MTP_OBJ_FORMAT_ABSTRACT_CHAPTERED_PRODUCTION = 0xBA08u, // Abstract Chaptered Production\n  MTP_OBJ_FORMAT_ABSTRACT_AUDIO_PLAYLIST       = 0xBA09u, // Abstract Audio Playlist\n  MTP_OBJ_FORMAT_ABSTRACT_VIDEO_PLAYLIST       = 0xBA0Au, // Abstract Video Playlist\n  MTP_OBJ_FORMAT_ABSTRACT_MEDIACAST            = 0xBA0Bu, // Abstract Mediacast (RSS enclosure)\n\n  // ---- Playlist formats ----\n  MTP_OBJ_FORMAT_WPL_PLAYLIST     = 0xBA10u, // Windows Media Player Playlist (.wpl)\n  MTP_OBJ_FORMAT_M3U_PLAYLIST     = 0xBA11u, // M3U Playlist\n  MTP_OBJ_FORMAT_MPL_PLAYLIST     = 0xBA12u, // MPL Playlist\n  MTP_OBJ_FORMAT_ASX_PLAYLIST     = 0xBA13u, // ASX Playlist\n  MTP_OBJ_FORMAT_PLS_PLAYLIST     = 0xBA14u, // PLS Playlist\n\n  // ---- Document formats ----\n  MTP_OBJ_FORMAT_UNDEFINED_DOC    = 0xBA80u, // Undefined Document\n  MTP_OBJ_FORMAT_ABSTRACT_DOC     = 0xBA81u, // Abstract Document\n  MTP_OBJ_FORMAT_XML_DOC          = 0xBA82u, // XML Document\n  MTP_OBJ_FORMAT_DOC              = 0xBA83u, // Microsoft Word Document\n  MTP_OBJ_FORMAT_MHT_DOC          = 0xBA84u, // MHT Compiled HTML Document\n  MTP_OBJ_FORMAT_XLS              = 0xBA85u, // Microsoft Excel Spreadsheet\n  MTP_OBJ_FORMAT_PPT              = 0xBA86u, // Microsoft PowerPoint Presentation\n\n  // ---- Messaging ----\n  MTP_OBJ_FORMAT_UNDEFINED_MSG    = 0xBB00u, // Undefined Message\n  MTP_OBJ_FORMAT_ABSTRACT_MSG     = 0xBB01u, // Abstract Message\n\n  // ---- Bookmarks ----\n  MTP_OBJ_FORMAT_UNDEFINED_BOOKMARK = 0xBB10u, // Undefined Bookmark\n  MTP_OBJ_FORMAT_ABSTRACT_BOOKMARK  = 0xBB11u, // Abstract Bookmark\n\n  // ---- Appointments ----\n  MTP_OBJ_FORMAT_UNDEFINED_APPT   = 0xBB20u, // Undefined Appointment\n  MTP_OBJ_FORMAT_ABSTRACT_APPT    = 0xBB21u, // Abstract Appointment\n  MTP_OBJ_FORMAT_VCALENDAR1       = 0xBB22u, // vCalendar 1.0\n\n  // ---- Tasks ----\n  MTP_OBJ_FORMAT_UNDEFINED_TASK   = 0xBB40u, // Undefined Task\n  MTP_OBJ_FORMAT_ABSTRACT_TASK    = 0xBB41u, // Abstract Task\n  MTP_OBJ_FORMAT_ICALENDAR        = 0xBB42u, // iCalendar\n\n  // ---- Notes ----\n  MTP_OBJ_FORMAT_UNDEFINED_NOTE   = 0xBB60u, // Undefined Note\n  MTP_OBJ_FORMAT_ABSTRACT_NOTE    = 0xBB61u, // Abstract Note\n\n  // ---- Contacts ----\n  MTP_OBJ_FORMAT_UNDEFINED_CONTACT= 0xBB80u, // Undefined Contact\n  MTP_OBJ_FORMAT_ABSTRACT_CONTACT = 0xBB81u, // Abstract Contact\n  MTP_OBJ_FORMAT_VCARD2           = 0xBB82u, // vCard 2.1\n  MTP_OBJ_FORMAT_VCARD3           = 0xBB83u, // vCard 3.0\n} mtp_object_formats_t;\n\n// MTP 1.1 Appendix B: Object Properties\ntypedef enum {\n  MTP_OBJ_PROP_STORAGE_ID                 = 0xDC01u, // StorageID\n  MTP_OBJ_PROP_OBJECT_FORMAT              = 0xDC02u, // Object Format\n  MTP_OBJ_PROP_PROTECTION_STATUS          = 0xDC03u, // Protection Status\n  MTP_OBJ_PROP_OBJECT_SIZE                = 0xDC04u, // Object Size\n  MTP_OBJ_PROP_ASSOCIATION_TYPE           = 0xDC05u, // Association Type\n  MTP_OBJ_PROP_ASSOCIATION_DESC           = 0xDC06u, // Association Description\n  MTP_OBJ_PROP_OBJECT_FILE_NAME           = 0xDC07u, // Object File Name\n  MTP_OBJ_PROP_DATE_CREATED               = 0xDC08u, // Date Created\n  MTP_OBJ_PROP_DATE_MODIFIED              = 0xDC09u, // Date Modified\n  MTP_OBJ_PROP_KEYWORDS                   = 0xDC0Au, // Keywords\n  MTP_OBJ_PROP_PARENT_OBJECT              = 0xDC0Bu, // Parent Object\n  MTP_OBJ_PROP_ALLOWED_FOLDER_CONTENTS    = 0xDC0Cu, // Allowed Folder Contents\n  MTP_OBJ_PROP_HIDDEN                     = 0xDC0Du, // Hidden\n  MTP_OBJ_PROP_SYSTEM_OBJECT              = 0xDC0Eu, // System Object\n  // 0xDC0F-0xDC40 is reserved\n\n  MTP_OBJ_PROP_PERSISTENT_UID             = 0xDC41u, // Persistent Unique Object Identifier\n  MTP_OBJ_PROP_SYNC_ID                    = 0xDC42u, // SyncID\n  MTP_OBJ_PROP_PROPERTY_BAG               = 0xDC43u, // Property Bag\n  MTP_OBJ_PROP_NAME                       = 0xDC44u, // Name\n  MTP_OBJ_PROP_CREATED_BY                 = 0xDC45u, // Created By\n  MTP_OBJ_PROP_ARTIST                     = 0xDC46u, // Artist\n  MTP_OBJ_PROP_DATE_AUTHORED              = 0xDC47u, // Date Authored\n  MTP_OBJ_PROP_DESCRIPTION                = 0xDC48u, // Description\n  MTP_OBJ_PROP_URL_REFERENCE              = 0xDC49u, // URL Reference\n  MTP_OBJ_PROP_LANGUAGE_LOCALE            = 0xDC4Au, // Language-Locale\n  MTP_OBJ_PROP_COPYRIGHT_INFO             = 0xDC4Bu, // Copyright Information\n  MTP_OBJ_PROP_SOURCE                     = 0xDC4Cu, // Source\n  MTP_OBJ_PROP_ORIGIN_LOCATION            = 0xDC4Du, // Origin Location\n  MTP_OBJ_PROP_DATE_ADDED                 = 0xDC4Eu, // Date Added\n  MTP_OBJ_PROP_NON_CONSUMABLE             = 0xDC4Fu, // Non-Consumable\n  MTP_OBJ_PROP_CORRUPT_UNPLAYABLE         = 0xDC50u, // Corrupt/Unplayable\n  MTP_OBJ_PROP_PRODUCER_SERIAL_NUMBER     = 0xDC51u, // ProducerSerialNumber\n  // 0xDC52-0xDC80 is reserved\n\n  MTP_OBJ_PROP_REP_SAMPLE_FORMAT          = 0xDC81u, // Representative Sample Format\n  MTP_OBJ_PROP_REP_SAMPLE_SIZE            = 0xDC82u, // Representative Sample Size\n  MTP_OBJ_PROP_REP_SAMPLE_HEIGHT          = 0xDC83u, // Representative Sample Height\n  MTP_OBJ_PROP_REP_SAMPLE_WIDTH           = 0xDC84u, // Representative Sample Width\n  MTP_OBJ_PROP_REP_SAMPLE_DURATION        = 0xDC85u, // Representative Sample Duration\n  MTP_OBJ_PROP_REP_SAMPLE_DATA            = 0xDC86u, // Representative Sample Data\n  MTP_OBJ_PROP_WIDTH                      = 0xDC87u, // Width\n  MTP_OBJ_PROP_HEIGHT                     = 0xDC88u, // Height\n  MTP_OBJ_PROP_DURATION                   = 0xDC89u, // Duration\n  MTP_OBJ_PROP_RATING                     = 0xDC8Au, // Rating\n  MTP_OBJ_PROP_TRACK                      = 0xDC8Bu, // Track\n  MTP_OBJ_PROP_GENRE                      = 0xDC8Cu, // Genre\n  MTP_OBJ_PROP_CREDITS                    = 0xDC8Du, // Credits\n  MTP_OBJ_PROP_LYRICS                     = 0xDC8Eu, // Lyrics\n  MTP_OBJ_PROP_SUBSCRIPTION_CONTENT_ID    = 0xDC8Fu, // Subscription Content ID\n  MTP_OBJ_PROP_PRODUCED_BY                = 0xDC90u, // Produced By\n  MTP_OBJ_PROP_USE_COUNT                  = 0xDC91u, // Use Count\n  MTP_OBJ_PROP_SKIP_COUNT                 = 0xDC92u, // Skip Count\n  MTP_OBJ_PROP_LAST_ACCESSED              = 0xDC93u, // Last Accessed\n  MTP_OBJ_PROP_PARENTAL_RATING            = 0xDC94u, // Parental Rating\n  MTP_OBJ_PROP_META_GENRE                 = 0xDC95u, // Meta Genre\n  MTP_OBJ_PROP_COMPOSER                   = 0xDC96u, // Composer\n  MTP_OBJ_PROP_EFFECTIVE_RATING           = 0xDC97u, // Effective Rating\n  MTP_OBJ_PROP_SUBTITLE                   = 0xDC98u, // Subtitle\n  MTP_OBJ_PROP_ORIGINAL_RELEASE_DATE      = 0xDC99u, // Original Release Date\n  MTP_OBJ_PROP_ALBUM_NAME                 = 0xDC9Au, // Album Name\n  MTP_OBJ_PROP_ALBUM_ARTIST               = 0xDC9Bu, // Album Artist\n  MTP_OBJ_PROP_MOOD                       = 0xDC9Cu, // Mood\n  MTP_OBJ_PROP_DRM_STATUS                 = 0xDC9Du, // DRM Status\n  MTP_OBJ_PROP_SUB_DESCRIPTION            = 0xDC9Eu, // Sub Description\n  // 0xDC9F-0xDCD0 is reserved\n\n  MTP_OBJ_PROP_IS_CROPPED                 = 0xDCD1u, // Is Cropped\n  MTP_OBJ_PROP_IS_COLOUR_CORRECTED        = 0xDCD2u, // Is Colour Corrected\n  MTP_OBJ_PROP_IMAGE_BIT_DEPTH            = 0xDCD3u, // Image Bit Depth\n  MTP_OBJ_PROP_FNUMBER                    = 0xDCD4u, // Fnumber (aperture ×100)\n  MTP_OBJ_PROP_EXPOSURE_TIME              = 0xDCD5u, // Exposure Time (sec ×10,000)\n  MTP_OBJ_PROP_EXPOSURE_INDEX             = 0xDCD6u, // Exposure Index (ISO)\n  // 0xDCD7-0xDCDF is reserved\n\n  MTP_OBJ_PROP_DISPLAY_NAME               = 0xDCE0u, // Display Name\n  MTP_OBJ_PROP_BODY_TEXT                  = 0xDCE1u, // Body Text\n  MTP_OBJ_PROP_SUBJECT                    = 0xDCE2u, // Subject\n  MTP_OBJ_PROP_PRIORITY                   = 0xDCE3u, // Priority\n  // 0xDCE4-0xDCFF is reserved\n\n  MTP_OBJ_PROP_GIVEN_NAME                 = 0xDD00u, // Given Name\n  MTP_OBJ_PROP_MIDDLE_NAMES               = 0xDD01u, // Middle Names\n  MTP_OBJ_PROP_FAMILY_NAME                = 0xDD02u, // Family Name\n  MTP_OBJ_PROP_PREFIX                     = 0xDD03u, // Prefix\n  MTP_OBJ_PROP_SUFFIX                     = 0xDD04u, // Suffix\n  MTP_OBJ_PROP_PHONETIC_GIVEN_NAME        = 0xDD05u, // Phonetic Given Name\n  MTP_OBJ_PROP_PHONETIC_FAMILY_NAME       = 0xDD06u, // Phonetic Family Name\n  MTP_OBJ_PROP_EMAIL_PRIMARY              = 0xDD07u, // Email Primary\n  MTP_OBJ_PROP_EMAIL_PERSONAL_1           = 0xDD08u, // Email Personal 1\n  MTP_OBJ_PROP_EMAIL_PERSONAL_2           = 0xDD09u, // Email Personal 2\n  MTP_OBJ_PROP_EMAIL_BUSINESS_1           = 0xDD0Au, // Email Business 1\n  MTP_OBJ_PROP_EMAIL_BUSINESS_2           = 0xDD0Bu, // Email Business 2\n  MTP_OBJ_PROP_EMAIL_OTHERS               = 0xDD0Cu, // Email Others\n  MTP_OBJ_PROP_PHONE_PRIMARY              = 0xDD0Du, // Phone Number Primary\n  MTP_OBJ_PROP_PHONE_PERSONAL_1           = 0xDD0Eu, // Phone Number Personal\n  MTP_OBJ_PROP_PHONE_PERSONAL_2           = 0xDD0Fu, // Phone Number Personal 2\n  MTP_OBJ_PROP_PHONE_BUSINESS_1           = 0xDD10u, // Phone Number Business\n  MTP_OBJ_PROP_PHONE_BUSINESS_2           = 0xDD11u, // Phone Number Business 2\n  MTP_OBJ_PROP_PHONE_MOBILE_1             = 0xDD12u, // Phone Number Mobile\n  MTP_OBJ_PROP_PHONE_MOBILE_2             = 0xDD13u, // Phone Number Mobile 2\n  MTP_OBJ_PROP_FAX_PRIMARY                = 0xDD14u, // Fax Number Primary\n  MTP_OBJ_PROP_FAX_PERSONAL               = 0xDD15u, // Fax Number Personal\n  MTP_OBJ_PROP_FAX_BUSINESS               = 0xDD16u, // Fax Number Business\n  MTP_OBJ_PROP_PAGER_NUMBER               = 0xDD17u, // Pager Number\n  MTP_OBJ_PROP_PHONE_OTHERS               = 0xDD18u, // Phone Number Others\n  MTP_OBJ_PROP_WEB_PRIMARY                = 0xDD19u, // Primary Web Address\n  MTP_OBJ_PROP_WEB_PERSONAL               = 0xDD1Au, // Personal Web Address\n  MTP_OBJ_PROP_WEB_BUSINESS               = 0xDD1Bu, // Business Web Address\n  MTP_OBJ_PROP_IM_ADDRESS_1               = 0xDD1Cu, // Instant Messenger Address\n  MTP_OBJ_PROP_IM_ADDRESS_2               = 0xDD1Du, // Instant Messenger Address 2\n  MTP_OBJ_PROP_IM_ADDRESS_3               = 0xDD1Eu, // Instant Messenger Address 3\n  MTP_OBJ_PROP_ADDR_PERSONAL_FULL         = 0xDD1Fu, // Postal Address Personal Full\n  MTP_OBJ_PROP_ADDR_PERSONAL_LINE1        = 0xDD20u, // Postal Address Personal Line 1\n  MTP_OBJ_PROP_ADDR_PERSONAL_LINE2        = 0xDD21u, // Postal Address Personal Line 2\n  MTP_OBJ_PROP_ADDR_PERSONAL_CITY         = 0xDD22u, // Postal Address Personal City\n  MTP_OBJ_PROP_ADDR_PERSONAL_REGION       = 0xDD23u, // Postal Address Personal Region\n  MTP_OBJ_PROP_ADDR_PERSONAL_POSTAL_CODE  = 0xDD24u, // Postal Address Personal Postal Code\n  MTP_OBJ_PROP_ADDR_PERSONAL_COUNTRY      = 0xDD25u, // Postal Address Personal Country\n  MTP_OBJ_PROP_ADDR_BUSINESS_FULL         = 0xDD26u, // Postal Address Business Full\n  MTP_OBJ_PROP_ADDR_BUSINESS_LINE1        = 0xDD27u, // Postal Address Business Line 1\n  MTP_OBJ_PROP_ADDR_BUSINESS_LINE2        = 0xDD28u, // Postal Address Business Line 2\n  MTP_OBJ_PROP_ADDR_BUSINESS_CITY         = 0xDD29u, // Postal Address Business City\n  MTP_OBJ_PROP_ADDR_BUSINESS_REGION       = 0xDD2Au, // Postal Address Business Region\n  MTP_OBJ_PROP_ADDR_BUSINESS_POSTAL_CODE  = 0xDD2Bu, // Postal Address Business Postal Code\n  MTP_OBJ_PROP_ADDR_BUSINESS_COUNTRY      = 0xDD2Cu, // Postal Address Business Country\n  MTP_OBJ_PROP_ADDR_OTHER_FULL            = 0xDD2Du, // Postal Address Other Full\n  MTP_OBJ_PROP_ADDR_OTHER_LINE1           = 0xDD2Eu, // Postal Address Other Line 1\n  MTP_OBJ_PROP_ADDR_OTHER_LINE2           = 0xDD2Fu, // Postal Address Other Line 2\n  MTP_OBJ_PROP_ADDR_OTHER_CITY            = 0xDD30u, // Postal Address Other City\n  MTP_OBJ_PROP_ADDR_OTHER_REGION          = 0xDD31u, // Postal Address Other Region\n  MTP_OBJ_PROP_ADDR_OTHER_POSTAL_CODE     = 0xDD32u, // Postal Address Other Postal Code\n  MTP_OBJ_PROP_ADDR_OTHER_COUNTRY         = 0xDD33u, // Postal Address Other Country\n  MTP_OBJ_PROP_ORGANIZATION_NAME          = 0xDD34u, // Organization Name\n  MTP_OBJ_PROP_PHONETIC_ORG_NAME          = 0xDD35u, // Phonetic Organization Name\n  MTP_OBJ_PROP_ROLE                       = 0xDD36u, // Role\n  MTP_OBJ_PROP_BIRTHDATE                  = 0xDD37u, // Birthdate\n  // 0xDD38-0xDD3F is reserved\n\n  MTP_OBJ_PROP_MESSAGE_TO                 = 0xDD40u, // Message To\n  MTP_OBJ_PROP_MESSAGE_CC                 = 0xDD41u, // Message CC\n  MTP_OBJ_PROP_MESSAGE_BCC                = 0xDD42u, // Message BCC\n  MTP_OBJ_PROP_MESSAGE_READ               = 0xDD43u, // Message Read\n  MTP_OBJ_PROP_MESSAGE_RECEIVED_TIME      = 0xDD44u, // Message Received Time\n  MTP_OBJ_PROP_MESSAGE_SENDER             = 0xDD45u, // Message Sender\n  // 0xDD46-0xDD4F is reserved\n\n  MTP_OBJ_PROP_ACTIVITY_BEGIN_TIME        = 0xDD50u, // Activity Begin Time\n  MTP_OBJ_PROP_ACTIVITY_END_TIME          = 0xDD51u, // Activity End Time\n  MTP_OBJ_PROP_ACTIVITY_LOCATION          = 0xDD52u, // Activity Location\n  // 0xDD53 is reserved\n  MTP_OBJ_PROP_ACTIVITY_REQUIRED_ATTENDEES= 0xDD54u, // Activity Required Attendees\n  MTP_OBJ_PROP_ACTIVITY_OPTIONAL_ATTENDEES= 0xDD55u, // Activity Optional Attendees\n  MTP_OBJ_PROP_ACTIVITY_RESOURCES         = 0xDD56u, // Activity Resources\n  MTP_OBJ_PROP_ACTIVITY_ACCEPTED          = 0xDD57u, // Activity Accepted\n  MTP_OBJ_PROP_ACTIVITY_TENTATIVE         = 0xDD58u, // Activity Tentative\n  MTP_OBJ_PROP_ACTIVITY_DECLINED          = 0xDD59u, // Activity Declined\n  MTP_OBJ_PROP_ACTIVITY_REMINDER_TIME     = 0xDD5Au, // Activity Reminder Time\n  MTP_OBJ_PROP_ACTIVITY_OWNER             = 0xDD5Bu, // Activity Owner\n  MTP_OBJ_PROP_ACTIVITY_STATUS            = 0xDD5Cu, // Activity Status\n  MTP_OBJ_PROP_OWNER                      = 0xDD5Du, // Owner\n  MTP_OBJ_PROP_EDITOR                     = 0xDD5Eu, // Editor\n  MTP_OBJ_PROP_WEBMASTER                  = 0xDD5Fu, // Webmaster\n\n  MTP_OBJ_PROP_URL_SOURCE                 = 0xDD60u, // URL Source\n  MTP_OBJ_PROP_URL_DESTINATION            = 0xDD61u, // URL Destination\n  MTP_OBJ_PROP_TIME_BOOKMARK              = 0xDD62u, // Time Bookmark\n  MTP_OBJ_PROP_OBJECT_BOOKMARK            = 0xDD63u, // Object Bookmark\n  MTP_OBJ_PROP_BYTE_BOOKMARK              = 0xDD64u, // Byte Bookmark\n  // 0xDD65-0xDD6F is reserved\n\n  MTP_OBJ_PROP_LAST_BUILD_DATE            = 0xDD70u, // Last Build Date\n  MTP_OBJ_PROP_TIME_TO_LIVE               = 0xDD71u, // Time to Live (minutes)\n  MTP_OBJ_PROP_MEDIA_GUID                 = 0xDD72u, // Media GUID\n  // 0xDD73-0xDDFF is reserved\n\n  // media encoding\n  MTP_OBJ_PROP_TOTAL_BITRATE              = 0xDE91u, // Total BitRate\n  MTP_OBJ_PROP_BITRATE_TYPE               = 0xDE92u, // Bitrate Type\n  MTP_OBJ_PROP_SAMPLE_RATE                = 0xDE93u, // Sample Rate\n  MTP_OBJ_PROP_NUM_CHANNELS               = 0xDE94u, // Number Of Channels\n  MTP_OBJ_PROP_AUDIO_BITDEPTH             = 0xDE95u, // Audio BitDepth\n  // 0xDE96 is reserved\n  MTP_OBJ_PROP_SCAN_TYPE                  = 0xDE97u, // Scan Type\n  // 0xDE98 is reserved\n  MTP_OBJ_PROP_AUDIO_WAVE_CODEC           = 0xDE99u, // Audio WAVE Codec\n  MTP_OBJ_PROP_AUDIO_BITRATE              = 0xDE9Au, // Audio BitRate\n  MTP_OBJ_PROP_VIDEO_FOURCC_CODEC         = 0xDE9Bu, // Video FourCC Codec\n  MTP_OBJ_PROP_VIDEO_BITRATE              = 0xDE9Cu, // Video BitRate\n  MTP_OBJ_PROP_FRAMES_PER_KSEC            = 0xDE9Du, // Frames Per Thousand Seconds\n  MTP_OBJ_PROP_KEYFRAME_DISTANCE          = 0xDE9Eu, // KeyFrame Distance (ms)\n  MTP_OBJ_PROP_BUFFER_SIZE                = 0xDE9Fu, // Buffer Size\n  MTP_OBJ_PROP_ENCODING_QUALITY           = 0xDEA0u, // Encoding Quality\n  MTP_OBJ_PROP_ENCODING_PROFILE           = 0xDEA1u  // Encoding Profile\n} mtp_object_properties_t;\n\n\n// MTP 1.1 Appendeix C: Device Properties\ntypedef enum {\n  MTP_DEV_PROP_UNDEFINED                      = 0x5000u,\n  MTP_DEV_PROP_BATTERY_LEVEL                  = 0x5001u,\n  MTP_DEV_PROP_FUNCTIONAL_MODE                = 0x5002u,\n  MTP_DEV_PROP_IMAGE_SIZE                     = 0x5003u,\n  MTP_DEV_PROP_COMPRESSION_SETTING            = 0x5004u,\n  MTP_DEV_PROP_WHITE_BALANCE                  = 0x5005u,\n  MTP_DEV_PROP_RGB_GAIN                       = 0x5006u,\n  MTP_DEV_PROP_F_NUMBER                       = 0x5007u,\n  MTP_DEV_PROP_FOCAL_LENGTH                   = 0x5008u,\n  MTP_DEV_PROP_FOCUS_DISTANCE                 = 0x5009u,\n  MTP_DEV_PROP_FOCUS_MODE                     = 0x500Au,\n  MTP_DEV_PROP_EXPOSURE_METERING_MODE         = 0x500Bu,\n  MTP_DEV_PROP_FLASH_MODE                     = 0x500Cu,\n  MTP_DEV_PROP_EXPOSURE_TIME                  = 0x500Du,\n  MTP_DEV_PROP_EXPOSURE_PROGRAM_MODE          = 0x500Eu,\n  MTP_DEV_PROP_EXPOSURE_INDEX                 = 0x500Fu,\n  MTP_DEV_PROP_EXPOSURE_BIAS_COMPENSATION     = 0x5010u,\n  MTP_DEV_PROP_DATE_TIME                      = 0x5011u,\n  MTP_DEV_PROP_CAPTURE_DELAY                  = 0x5012u,\n  MTP_DEV_PROP_STILL_CAPTURE_MODE             = 0x5013u,\n  MTP_DEV_PROP_CONTRAST                       = 0x5014u,\n  MTP_DEV_PROP_SHARPNESS                      = 0x5015u,\n  MTP_DEV_PROP_DIGITAL_ZOOM                   = 0x5016u,\n  MTP_DEV_PROP_EFFECT_MODE                    = 0x5017u,\n  MTP_DEV_PROP_BURST_NUMBER                   = 0x5018u,\n  MTP_DEV_PROP_BURST_INTERVAL                 = 0x5019u,\n  MTP_DEV_PROP_TIMELAPSE_NUMBER               = 0x501Au,\n  MTP_DEV_PROP_TIMELAPSE_INTERVAL             = 0x501Bu,\n  MTP_DEV_PROP_FOCUS_METERING_MODE            = 0x501Cu,\n  MTP_DEV_PROP_UPLOAD_URL                     = 0x501Du,\n  MTP_DEV_PROP_ARTIST                         = 0x501Eu,\n  MTP_DEV_PROP_COPYRIGHT_INFO                 = 0x501Fu,\n  MTP_DEV_PROP_SYNCHRONIZTION_PARTNER         = 0xD401,\n  MTP_DEV_PROP_DEVICE_FRIENDLY_NAME           = 0xD402u,\n  MTP_DEV_PROP_VOLUME                         = 0xD403u,\n  MTP_DEV_PROP_SUPPORTED_FORMATS_ORDERED      = 0xD404u,\n  MTP_DEV_PROP_DEVICE_ICON                    = 0xD405u,\n  MTP_DEV_PROP_SECTION_INITIATOR_VERSION_INFO = 0xD406u,\n  MTP_DEV_PROP_PERCEIVED_DEVICE_TYPE          = 0xD407u,\n  MTP_DEV_PROP_PLAYBACK_RATE                  = 0xD410u,\n  MTP_DEV_PROP_PLAYBACK_OBJECT                = 0xD411u,\n  MTP_DEV_PROP_PLAYBACK_CONTAINER_INDEX       = 0xD412u,\n} mtp_event_properties_t;\n\n// MTP 1.1 Appendix D: Operations\ntypedef enum {\n  MTP_OP_UNDEFINED                  = 0x1000u,\n  MTP_OP_GET_DEVICE_INFO            = 0x1001u,\n  MTP_OP_OPEN_SESSION               = 0x1002u,\n  MTP_OP_CLOSE_SESSION              = 0x1003u,\n  MTP_OP_GET_STORAGE_IDS            = 0x1004u,\n  MTP_OP_GET_STORAGE_INFO           = 0x1005u,\n  MTP_OP_GET_NUM_OBJECTS            = 0x1006u,\n  MTP_OP_GET_OBJECT_HANDLES         = 0x1007u,\n  MTP_OP_GET_OBJECT_INFO            = 0x1008u,\n  MTP_OP_GET_OBJECT                 = 0x1009u,\n  MTP_OP_GET_THUMB                  = 0x100Au,\n  MTP_OP_DELETE_OBJECT              = 0x100Bu,\n  MTP_OP_SEND_OBJECT_INFO           = 0x100Cu,\n  MTP_OP_SEND_OBJECT                = 0x100Du,\n  MTP_OP_INITIATE_CAPTURE           = 0x100Eu,\n  MTP_OP_FORMAT_STORE               = 0x100Fu,\n  MTP_OP_RESET_DEVICE               = 0x1010u,\n  MTP_OP_SELF_TEST                  = 0x1011u,\n  MTP_OP_SET_OBJECT_PROTECTION      = 0x1012u,\n  MTP_OP_POWER_DOWN                 = 0x1013u,\n  MTP_OP_GET_DEVICE_PROP_DESC       = 0x1014u,\n  MTP_OP_GET_DEVICE_PROP_VALUE      = 0x1015u,\n  MTP_OP_SET_DEVICE_PROP_VALUE      = 0x1016u,\n  MTP_OP_RESET_DEVICE_PROP_VALUE    = 0x1017u,\n  MTP_OP_TERMINATE_OPEN_CAPTURE     = 0x1018u,\n  MTP_OP_MOVE_OBJECT                = 0x1019u,\n  MTP_OP_COPY_OBJECT                = 0x101Au,\n  MTP_OP_GET_PARTIAL_OBJECT         = 0x101Bu,\n  MTP_OP_INITIATE_OPEN_CAPTURE      = 0x101Bu,\n  MTP_OP_GET_OBJECT_PROPS_SUPPORTED = 0x9801u,\n  MTP_OP_GET_OBJECT_PROP_DESC       = 0x9802u,\n  MTP_OP_GET_OBJECT_PROP_VALUE      = 0x9803u,\n  MTP_OP_SET_OBJECT_PROP_VALUE      = 0x9804u,\n  MTP_OP_GET_OBJECT_PROPLIST        = 0x9805u,\n  MTP_OP_GET_OBJECT_PROP_REFERENCES = 0x9810u,\n\n  MTP_OP_GET_SERVICE_IDS            = 0x9301u,\n  MTP_OP_GET_SERVICE_INFO           = 0x9302u,\n  MTP_OP_GET_SERVICE_CAPABILITIES   = 0x9303u,\n  MTP_OP_GET_SERVICE_PROP_DESC      = 0x9304u,\n\n  // Appendix E: Enhanced Operations\n  MTP_OP_GET_OBJECT_PROP_LIST         = 0x9805u,\n  MTP_OP_SET_OBJECT_PROP_LIST         = 0x9806u,\n  MTP_OP_GET_INTERDEPENDENT_PROP_DESC = 0x9807u,\n  MTP_OP_SEND_OBJECT_PROP_LIST        = 0x9808u,\n} mtp_operation_code_t;\n\n// Appendix F: Responses\ntypedef enum {\n  MTP_RESP_UNDEFINED                           = 0x2000u,\n  MTP_RESP_OK                                  = 0x2001u,\n  MTP_RESP_GENERAL_ERROR                       = 0x2002u,\n  MTP_RESP_SESSION_NOT_OPEN                    = 0x2003u,\n  MTP_RESP_INVALID_TRANSACTION_ID              = 0x2004u,\n  MTP_RESP_OPERATION_NOT_SUPPORTED             = 0x2005u,\n  MTP_RESP_PARAMETER_NOT_SUPPORTED             = 0x2006u,\n  MTP_RESP_INCOMPLETE_TRANSFER                 = 0x2007u,\n  MTP_RESP_INVALID_STORAGE_ID                  = 0x2008u,\n  MTP_RESP_INVALID_OBJECT_HANDLE               = 0x2009u,\n  MTP_RESP_DEVICE_PROP_NOT_SUPPORTED           = 0x200Au,\n  MTP_RESP_INVALID_OBJECT_FORMAT_CODE          = 0x200Bu,\n  MTP_RESP_STORE_FULL                          = 0x200Cu,\n  MTP_RESP_OBJECT_WRITE_PROTECTED              = 0x200Du,\n  MPT_RESC_STORE_READ_ONLY                     = 0x200Eu,\n  MTP_RESP_ACCESS_DENIED                       = 0x200Fu,\n  MTP_RESP_NO_THUMBNAIL_PRESENT                = 0x2010u,\n  MTP_RESP_SELF_TEST_FAILED                    = 0x2011u,\n  MTP_RESP_PARTIAL_DELETION                    = 0x2012u,\n  MTP_RESP_STORE_NOT_AVAILABLE                 = 0x2013u,\n  MTP_RESP_SPECIFICATION_BY_FORMAT_UNSUPPORTED = 0x2014u,\n  MTP_RESP_NO_VALID_OBJECTINFO                 = 0x2015u,\n  MTP_RESP_INVALID_CODE_FORMAT                 = 0x2016u,\n  MTP_RESP_UNKNOWN_VENDOR_CODE                 = 0x2017u,\n  MTP_RESP_CAPTURE_ALREADY_TERMINATED          = 0x2018u,\n  MTP_RESP_DEVICE_BUSY                         = 0x2019u,\n  MTP_RESP_INVALID_PARENT_OBJECT               = 0x201Au,\n  MTP_RESP_INVALID_DEVICE_PROP_FORMAT          = 0x201Bu,\n  MTP_RESP_INVALID_DEVICE_PROP_VALUE           = 0x201Cu,\n  MTP_RESP_INVALID_PARAMETER                   = 0x201Du,\n  MTP_RESP_SESSION_ALREADY_OPEN                = 0x201Eu,\n  MTP_RESP_TRANSACTION_CANCELLED               = 0x201Fu,\n  MTP_RESP_SPEC_OF_DESTINATION_UNSUPPORTED     = 0x2020u,\n\n  MTP_RESP_INVALID_OBJECT_PROP_CODE            = 0xA801u,\n  MTP_RESP_INVALID_OBJECT_PROP_FORMAT          = 0xA802u,\n  MTP_RESP_INVALID_OBJECT_PROP_VALUE           = 0xA803u,\n  MTP_RESP_INVALID_OBJECT_REFERENCE            = 0xA804u,\n  MTP_RESP_GROUP_NOT_SUPPORTED                 = 0xA805u,\n  MTP_RESP_INVALID_DATASET                     = 0xA806u,\n  MTP_RESP_SPEC_BY_GROUP_UNSUPPORTED           = 0xA807u,\n  MTP_RESP_SPEC_BY_DEPTH_UNSUPPORTED           = 0xA808u,\n  MTP_RESP_OBJECT_TOO_LARGE                    = 0xA809u,\n  MTP_RESP_OBJECT_PROP_NOT_SUPPORTED           = 0xA80Au,\n} mtp_response_t;\n\n// Appendix G: Events\ntypedef enum {\n  MTP_EVENT_UNDEFINED                 = 0x4000,\n  MTP_EVENT_CANCEL_TRANSACTION        = 0x4001,\n  MTP_EVENT_OBJECT_ADDED              = 0x4002,\n  MTP_EVENT_OBJECT_REMOVED            = 0x4003,\n  MTP_EVENT_STORE_ADDED               = 0x4004,\n  MTP_EVENT_STORE_REMOVED             = 0x4005,\n  MTP_EVENT_DEVICE_PROP_CHANGED       = 0x4006,\n  MTP_EVENT_OBJECT_INFO_CHANGED       = 0x4007,\n  MTP_EVENT_DEVICE_INFO_CHANGED       = 0x4008,\n  MTP_EVENT_REQUEST_OBJECT_TRANSFER   = 0x4009,\n  MTP_EVENT_STORE_FULL                = 0x400Au,\n  MTP_EVENT_DEVICE_RESET              = 0x400Bu,\n  MTP_EVENT_STORAGE_INFO_CHANGED      = 0x400Cu,\n  MTP_EVENT_CAPTURE_COMPLETE          = 0x400Du,\n  MTP_EVENT_UNREPORTED_STATUS         = 0x400Eu,\n  MTP_EVENT_OBJECT_PROP_CHANGED       = 0xC801u,\n  MTP_EVENT_OBJECT_PROP_DESC_CHANGED  = 0xC802u,\n  MTP_EVENT_OBJECT_REFERENCES_CHANGED = 0xC803u,\n} mtp_event_code_t;\n\n// Datatypes\ntypedef enum {\n  MTP_DATA_TYPE_UNDEFINED = 0x0000u,\n  // scalars\n  MTP_DATA_TYPE_INT8      = 0x0001u,\n  MTP_DATA_TYPE_UINT8     = 0x0002u,\n  MTP_DATA_TYPE_INT16     = 0x0003u,\n  MTP_DATA_TYPE_UINT16    = 0x0004u,\n  MTP_DATA_TYPE_INT32     = 0x0005u,\n  MTP_DATA_TYPE_UINT32    = 0x0006u,\n  MTP_DATA_TYPE_INT64     = 0x0007u,\n  MTP_DATA_TYPE_UINT64    = 0x0008u,\n  MTP_DATA_TYPE_INT128    = 0x0009u,\n  MTP_DATA_TYPE_UINT128   = 0x000Au,\n  // array\n  MTP_DATA_TYPE_AINT8     = 0x4001u,\n  MTP_DATA_TYPE_AUINT8    = 0x4002u,\n  MTP_DATA_TYPE_AINT16    = 0x4003u,\n  MTP_DATA_TYPE_AUINT16   = 0x4004u,\n  MTP_DATA_TYPE_AINT32    = 0x4005u,\n  MTP_DATA_TYPE_AUINT32   = 0x4006u,\n  MTP_DATA_TYPE_AINT64    = 0x4007u,\n  MTP_DATA_TYPE_AUINT64   = 0x4008u,\n  MTP_DATA_TYPE_AINT128   = 0x4009u,\n  MTP_DATA_TYPE_AUINT128  = 0x400Au,\n  MTP_DATA_TYPE_STR       = 0xFFFFu,\n} mtp_data_type_t;\n\n// Get/Set\ntypedef enum {\n  MTP_MODE_GET     = 0x00u,\n  MTP_MODE_GET_SET = 0x01u,\n} mtp_mode_get_set_t;\n\ntypedef enum {\n  MTP_STORAGE_TYPE_UNDEFINED     = 0x0000u,\n  MTP_STORAGE_TYPE_FIXED_ROM     = 0x0001u,\n  MTP_STORAGE_TYPE_REMOVABLE_ROM = 0x0002u,\n  MTP_STORAGE_TYPE_FIXED_RAM     = 0x0003u,\n  MTP_STORAGE_TYPE_REMOVABLE_RAM = 0x0004u,\n} mtp_storage_type_t;\n\ntypedef enum {\n  MTP_FILESYSTEM_TYPE_UNDEFINED            = 0x0000u,\n  MTP_FILESYSTEM_TYPE_GENERIC_FLAT         = 0x0001u,\n  MTP_FILESYSTEM_TYPE_GENERIC_HIERARCHICAL = 0x0002u,\n  MTP_FILESYSTEM_TYPE_DCF                  = 0x0003u,\n} mtp_filesystem_type_t;\n\ntypedef enum {\n  MTP_ACCESS_CAPABILITY_READ_WRITE                        = 0x0000u,\n  MTP_ACCESS_CAPABILITY_READ_ONLY_WITHOUT_OBJECT_DELETION = 0x0001u,\n  MTP_ACCESS_CAPABILITY_READ_ONLY_WITH_OBJECT_DELETION    = 0x0002u,\n} mtp_access_capability_t;\n\ntypedef enum {\n  MTP_PROTECTION_STATUS_NO_PROTECTION  = 0x0000u,\n  MTP_PROTECTION_STATUS_READ_ONLY      = 0x0001u,\n  MTP_PROTECTION_STATUS_READ_ONLY_DATA = 0x8002u,\n  MTP_PROTECTION_NON_TRANSFERABLE_DATA = 0x8003u,\n} mtp_protection_status_t;\n\ntypedef enum {\n  MTP_ASSOCIATION_UNDEFINED            = 0x0000u,\n  MTP_ASSOCIATION_GENERIC_FOLDER       = 0x0001u,\n  MTP_ASSOCIATION_ALBUM                = 0x0002u,\n  MTP_ASSOCIATION_TIME_SEQUENCE        = 0x0003u,\n  MTP_ASSOCIATION_HORIZONTAL_PANORAMIC = 0x0004u,\n  MTP_ASSOCIATION_VERTICAL_PANORAMIC   = 0x0005u,\n  MTP_ASSOCIATION_2D_PANORAMIC         = 0x0006u,\n  MTP_ASSOCIATION_ANCILLARY_DATA       = 0x0007u,\n} mtp_association_t;\n\n//--------------------------------------------------------------------+\n// Data structures\n//--------------------------------------------------------------------+\ntypedef struct TU_ATTR_PACKED {\n  uint32_t len;\n  uint16_t type;\n  uint16_t code;\n  uint32_t transaction_id;\n} mtp_container_header_t;\nTU_VERIFY_STATIC(sizeof(mtp_container_header_t) == 12, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED {\n  mtp_container_header_t header;\n  uint32_t params[5];\n} mtp_container_command_t;\nTU_VERIFY_STATIC(sizeof(mtp_container_command_t) == 32, \"size is not correct\");\n\n// PTP/MTP Generic container\ntypedef struct TU_ATTR_PACKED {\n  mtp_container_header_t header;\n  uint8_t payload[(CFG_TUD_MTP_EP_BUFSIZE - sizeof(mtp_container_header_t))];\n} mtp_generic_container_t;\n\ntypedef struct {\n  mtp_container_header_t* header;\n  union {\n    uint8_t*  payload;\n    uint16_t* payload16;\n    uint32_t* payload32;\n  };\n  uint32_t payload_bytes; // available bytes for read/write\n} mtp_container_info_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint16_t code;\n  uint32_t session_id;\n  uint32_t transaction_id;\n  uint32_t params[3];\n} mtp_event_t;\nTU_VERIFY_STATIC(sizeof(mtp_event_t) == 22, \"size is not correct\");\n\n#define mtp_string_t(_nchars) \\\n  struct TU_ATTR_PACKED { \\\n    uint8_t count; /* in characters including null */ \\\n    uint16_t utf16[_nchars]; \\\n  }\n\n#define mtp_array_t(_type, _count) \\\n   struct TU_ATTR_PACKED { \\\n     uint32_t count; \\\n     _type arr[_count];\\\n   }\n\n#define mtp_aint8_t(_count)  mtp_array_t(int8_t, _count)\n#define mtp_auint16_t(_count) mtp_array_t(uint16_t, _count)\n#define mtp_auint32_t(_count) mtp_array_t(uint32_t, _count)\n#define mtp_auint64_t(_count) mtp_array_t(uint64_t, _count)\n\n#define MTP_STORAGE_INFO_STRUCT(_storage_desc_chars, _volume_id_chars) \\\n  struct TU_ATTR_PACKED { \\\n    uint16_t storage_type; \\\n    uint16_t filesystem_type; \\\n    uint16_t access_capability; \\\n    uint64_t max_capacity_in_bytes; \\\n    uint64_t free_space_in_bytes; \\\n    uint32_t free_space_in_objects; \\\n    mtp_string_t(_storage_desc_chars) storage_description; \\\n    mtp_string_t(_volume_id_chars) volume_identifier; \\\n  }\n\n// Object Info Dataset without dynamic string: filename, date_created, date_modified, keywords\ntypedef struct TU_ATTR_PACKED {\n  uint32_t storage_id;\n  uint16_t object_format;\n  uint16_t protection_status;\n  uint32_t object_compressed_size;\n  uint16_t thumb_format;\n  uint32_t thumb_compressed_size;\n  uint32_t thumb_pix_width;\n  uint32_t thumb_pix_height;\n  uint32_t image_pix_width;\n  uint32_t image_pix_height;\n  uint32_t image_bit_depth;\n  uint32_t parent_object; // 0: root\n  uint16_t association_type;\n  uint32_t association_desc;\n  uint32_t sequence_number;\n  // mtp_string_t() filename\n  // mtp_string_t() date_created\n  // mtp_string_t() date_modified\n  // mtp_string_t() keywords\n} mtp_object_info_header_t;\n\n// Device property desc up to get/set\ntypedef struct TU_ATTR_PACKED {\n  uint16_t device_property_code;\n  uint16_t datatype;\n  uint8_t  get_set;\n} mtp_device_prop_desc_header_t;\n\n// The following fields will be dynamically added to the struct at runtime:\n// - wstring factory_def_value;\n// - wstring current_value_len;\n// - uint8_t form_flag;\n\n// no form\n#define MTP_DEVICE_PROPERTIES_STRUCT(_type) \\\n   struct TU_ATTR_PACKED { \\\n     uint16_t device_property_code; \\\n     uint16_t datatype; \\\n     uint8_t get_set; \\\n     _type factory_default; \\\n     _type current_value; \\\n     uint8_t form_flag; /* 0: none, 1: range, 2: enum */ \\\n   };\n\ntypedef struct TU_ATTR_PACKED {\n  uint16_t code;\n  uint32_t transaction_id;\n} mtp_request_reset_cancel_data_t;\nTU_VERIFY_STATIC(sizeof(mtp_request_reset_cancel_data_t) == 6, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// Container helper function\n// return number of bytes added\n//--------------------------------------------------------------------+\n\n// return payload buffer for next write\nTU_ATTR_ALWAYS_INLINE static inline uint8_t* mtp_container_payload_ptr(mtp_container_info_t* p_container) {\n  // only 1st packet include header\n  uint32_t pos = p_container->header->len - sizeof(mtp_container_header_t);\n  while (pos > CFG_TUD_MTP_EP_BUFSIZE) {\n    pos -= CFG_TUD_MTP_EP_BUFSIZE;\n  }\n  return p_container->payload + pos;\n}\n\n// only add_raw does partial copy\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_raw(mtp_container_info_t* p_container, const void* data, uint32_t len) {\n  uint8_t* buf = mtp_container_payload_ptr(p_container);\n  const uint32_t added_len = tu_min32(len, CFG_TUD_MTP_EP_BUFSIZE - p_container->header->len);\n  if (added_len > 0) {\n    memcpy(buf, data, added_len);\n  }\n  p_container->header->len += len; // always increase len, even partial copy\n  return added_len;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_array(mtp_container_info_t* p_container, uint8_t scalar_size, uint32_t count, const void* data) {\n  const uint32_t added_len = 4 + count * scalar_size;\n  TU_ASSERT(p_container->header->len + added_len < CFG_TUD_MTP_EP_BUFSIZE, 0);\n  uint8_t* buf = p_container->payload + p_container->header->len - sizeof(mtp_container_header_t);\n\n  tu_unaligned_write32(buf, count);\n  p_container->header->len += 4;\n  buf += 4;\n\n  memcpy(buf, data, count * scalar_size);\n  p_container->header->len += count * scalar_size;\n\n  return added_len;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_string(mtp_container_info_t* p_container, uint16_t* utf16) {\n  uint8_t count = 0;\n  while (utf16[count] != 0u) {\n    count++;\n  }\n  const uint32_t added_len = 1u + (uint32_t) count * 2u;\n  TU_ASSERT(p_container->header->len + added_len < CFG_TUD_MTP_EP_BUFSIZE, 0);\n  uint8_t* buf = p_container->payload + p_container->header->len - sizeof(mtp_container_header_t);\n\n  *buf++ = count;\n  p_container->header->len++;\n\n  memcpy(buf, utf16, 2u * (uint32_t) count);\n  p_container->header->len += 2u * count;\n\n  return added_len;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_cstring(mtp_container_info_t* p_container, const char* str) {\n  const uint8_t len = (uint8_t) (strlen(str) + 1); // include null\n  TU_ASSERT(p_container->header->len + 1 + 2 * len < CFG_TUD_MTP_EP_BUFSIZE, 0);\n  uint8_t* buf = p_container->payload + p_container->header->len - sizeof(mtp_container_header_t);\n\n  if (len == 1) {\n    // empty string (null only): single zero byte\n    *buf = 0;\n    p_container->header->len++;\n    return 1u;\n  } else {\n    *buf++ = len;\n    p_container->header->len++;\n\n    for (uint8_t i = 0; i < len; i++) {\n      buf[0] = str[i];\n      buf[1] = 0;\n      buf += 2;\n      p_container->header->len += 2;\n    }\n    return 1u + 2u * len;\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_uint8(mtp_container_info_t* p_container, uint8_t data) {\n  return mtp_container_add_raw(p_container, &data, 1);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_uint16(mtp_container_info_t* p_container, uint16_t data) {\n  return mtp_container_add_raw(p_container, &data, 2);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_uint32(mtp_container_info_t* p_container, uint32_t data) {\n  return mtp_container_add_raw(p_container, &data, 4);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_uint64(mtp_container_info_t* p_container, uint64_t data) {\n  return mtp_container_add_raw(p_container, &data, 8);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_uint128(mtp_container_info_t* p_container, const void* data) {\n  return mtp_container_add_raw(p_container, data, 16);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_auint8(mtp_container_info_t* p_container, uint32_t count, const uint8_t* data) {\n  return mtp_container_add_array(p_container, sizeof(uint8_t), count, data);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_auint16(mtp_container_info_t* p_container, uint32_t count, const uint16_t* data) {\n  return mtp_container_add_array(p_container, sizeof(uint16_t), count, data);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_add_auint32(mtp_container_info_t* p_container, uint32_t count, const uint32_t* data) {\n  return mtp_container_add_array(p_container, sizeof(uint32_t), count, data);\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline uint32_t mtp_container_get_string(uint8_t* buf, uint16_t utf16[]) {\n  size_t nchars = *buf++;\n  memcpy(utf16, buf, 2u * nchars);\n  return 1u + 2u * nchars;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "src/class/mtp/mtp_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ennebi Elettronica (https://ennebielettronica.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_MTP)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"device/dcd.h\"\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"mtp_device.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUD_MTP_LOG_LEVEL\n  #define CFG_TUD_MTP_LOG_LEVEL   CFG_TUD_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUD_MTP_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK bool tud_mtp_request_cancel_cb(tud_mtp_request_cb_data_t* cb_data) {\n  (void) cb_data;\n  return false;\n}\nTU_ATTR_WEAK bool tud_mtp_request_device_reset_cb(tud_mtp_request_cb_data_t* cb_data) {\n  (void) cb_data;\n  return false;\n}\nTU_ATTR_WEAK int32_t tud_mtp_request_get_extended_event_cb(tud_mtp_request_cb_data_t* cb_data) {\n  (void) cb_data;\n  return -1;\n}\nTU_ATTR_WEAK int32_t tud_mtp_request_get_device_status_cb(tud_mtp_request_cb_data_t* cb_data) {\n  (void) cb_data;\n  return -1;\n}\nTU_ATTR_WEAK bool tud_mtp_request_vendor_cb(tud_mtp_request_cb_data_t* cb_data) {\n  (void) cb_data;\n  return false;\n}\nTU_ATTR_WEAK int32_t tud_mtp_command_received_cb(tud_mtp_cb_data_t * cb_data) {\n  (void) cb_data;\n  return -1;\n}\nTU_ATTR_WEAK int32_t tud_mtp_data_xfer_cb(tud_mtp_cb_data_t* cb_data) {\n  (void) cb_data;\n  return -1;\n}\nTU_ATTR_WEAK int32_t tud_mtp_data_complete_cb(tud_mtp_cb_data_t* cb_data) {\n  (void) cb_data;\n  return -1;\n}\nTU_ATTR_WEAK int32_t tud_mtp_response_complete_cb(tud_mtp_cb_data_t* cb_data) {\n  (void) cb_data;\n  return -1;\n}\n\n//--------------------------------------------------------------------+\n// STRUCT\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t rhport;\n  uint8_t itf_num;\n  uint8_t ep_in;\n  uint8_t ep_out;\n\n  uint8_t ep_event;\n  uint8_t ep_sz_fs;\n  // Bulk Only Transfer (BOT) Protocol\n  uint8_t  phase;\n\n  uint32_t total_len;\n  uint32_t xferred_len;\n\n  uint32_t session_id;\n  mtp_container_command_t command;\n  mtp_container_header_t io_header;\n\n  TU_ATTR_ALIGNED(4) uint8_t control_buf[CFG_TUD_MTP_EP_CONTROL_BUFSIZE];\n} mtpd_interface_t;\n\ntypedef struct {\n  TUD_EPBUF_DEF(buf, CFG_TUD_MTP_EP_BUFSIZE);\n  TUD_EPBUF_TYPE_DEF(mtp_event_t, buf_event);\n} mtpd_epbuf_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nstatic mtpd_interface_t _mtpd_itf;\nCFG_TUD_MEM_SECTION static mtpd_epbuf_t _mtpd_epbuf;\n\nstatic void preprocess_cmd(mtpd_interface_t* p_mtp, tud_mtp_cb_data_t* cb_data);\n\n//--------------------------------------------------------------------+\n// Debug\n//--------------------------------------------------------------------+\n#if CFG_TUSB_DEBUG >= CFG_TUD_MTP_LOG_LEVEL\n\nTU_ATTR_UNUSED static tu_lookup_entry_t const _mpt_op_lookup[] = {\n{.key = MTP_OP_UNDEFINED                    , .data = \"Undefined\"                 } ,\n{.key = MTP_OP_GET_DEVICE_INFO              , .data = \"GetDeviceInfo\"             } ,\n{.key = MTP_OP_OPEN_SESSION                 , .data = \"OpenSession\"               } ,\n{.key = MTP_OP_CLOSE_SESSION                , .data = \"CloseSession\"              } ,\n{.key = MTP_OP_GET_STORAGE_IDS              , .data = \"GetStorageIDs\"             } ,\n{.key = MTP_OP_GET_STORAGE_INFO             , .data = \"GetStorageInfo\"            } ,\n{.key = MTP_OP_GET_NUM_OBJECTS              , .data = \"GetNumObjects\"             } ,\n{.key = MTP_OP_GET_OBJECT_HANDLES           , .data = \"GetObjectHandles\"          } ,\n{.key = MTP_OP_GET_OBJECT_INFO              , .data = \"GetObjectInfo\"             } ,\n{.key = MTP_OP_GET_OBJECT                   , .data = \"GetObject\"                 } ,\n{.key = MTP_OP_GET_THUMB                    , .data = \"GetThumb\"                  } ,\n{.key = MTP_OP_DELETE_OBJECT                , .data = \"DeleteObject\"              } ,\n{.key = MTP_OP_SEND_OBJECT_INFO             , .data = \"SendObjectInfo\"            } ,\n{.key = MTP_OP_SEND_OBJECT                  , .data = \"SendObject\"                } ,\n{.key = MTP_OP_INITIATE_CAPTURE             , .data = \"InitiateCapture\"           } ,\n{.key = MTP_OP_FORMAT_STORE                 , .data = \"FormatStore\"               } ,\n{.key = MTP_OP_RESET_DEVICE                 , .data = \"ResetDevice\"               } ,\n{.key = MTP_OP_SELF_TEST                    , .data = \"SelfTest\"                  } ,\n{.key = MTP_OP_SET_OBJECT_PROTECTION        , .data = \"SetObjectProtection\"       } ,\n{.key = MTP_OP_POWER_DOWN                   , .data = \"PowerDown\"                 } ,\n{.key = MTP_OP_GET_DEVICE_PROP_DESC         , .data = \"GetDevicePropDesc\"         } ,\n{.key = MTP_OP_GET_DEVICE_PROP_VALUE        , .data = \"GetDevicePropValue\"        } ,\n{.key = MTP_OP_SET_DEVICE_PROP_VALUE        , .data = \"SetDevicePropValue\"        } ,\n{.key = MTP_OP_RESET_DEVICE_PROP_VALUE      , .data = \"ResetDevicePropValue\"      } ,\n{.key = MTP_OP_TERMINATE_OPEN_CAPTURE       , .data = \"TerminateOpenCapture\"      } ,\n{.key = MTP_OP_MOVE_OBJECT                  , .data = \"MoveObject\"                } ,\n{.key = MTP_OP_COPY_OBJECT                  , .data = \"CopyObject\"                } ,\n{.key = MTP_OP_GET_PARTIAL_OBJECT           , .data = \"GetPartialObject\"          } ,\n{.key = MTP_OP_INITIATE_OPEN_CAPTURE        , .data = \"InitiateOpenCapture\"       } ,\n{.key = MTP_OP_GET_OBJECT_PROPS_SUPPORTED   , .data = \"GetObjectPropsSupported\"   } ,\n{.key = MTP_OP_GET_OBJECT_PROP_DESC         , .data = \"GetObjectPropDesc\"         } ,\n{.key = MTP_OP_GET_OBJECT_PROP_VALUE        , .data = \"GetObjectPropValue\"        } ,\n{.key = MTP_OP_SET_OBJECT_PROP_VALUE        , .data = \"SetObjectPropValue\"        } ,\n{.key = MTP_OP_GET_OBJECT_PROPLIST          , .data = \"GetObjectPropList\"         } ,\n{.key = MTP_OP_GET_OBJECT_PROP_REFERENCES   , .data = \"GetObjectPropReferences\"   } ,\n{.key = MTP_OP_GET_SERVICE_IDS              , .data = \"GetServiceIDs\"             } ,\n{.key = MTP_OP_GET_SERVICE_INFO             , .data = \"GetServiceInfo\"            } ,\n{.key = MTP_OP_GET_SERVICE_CAPABILITIES     , .data = \"GetServiceCapabilities\"    } ,\n{.key = MTP_OP_GET_SERVICE_PROP_DESC        , .data = \"GetServicePropDesc\"        } ,\n{.key = MTP_OP_GET_OBJECT_PROP_LIST         , .data = \"GetObjectPropList\"         } ,\n{.key = MTP_OP_SET_OBJECT_PROP_LIST         , .data = \"SetObjectPropList\"         } ,\n{.key = MTP_OP_GET_INTERDEPENDENT_PROP_DESC , .data = \"GetInterdependentPropDesc\" } ,\n{.key = MTP_OP_SEND_OBJECT_PROP_LIST        , .data = \"SendObjectPropList\"        }\n};\n\nTU_ATTR_UNUSED static tu_lookup_table_t const _mtp_op_table = {\n  .count = TU_ARRAY_SIZE(_mpt_op_lookup),\n  .items = _mpt_op_lookup\n};\n\nTU_ATTR_UNUSED static const char* _mtp_phase_str[] = {\n  \"Command\",\n  \"Data\",\n  \"Response\",\n  \"Error\"\n};\n\n#endif\n\n\n//--------------------------------------------------------------------+\n// Helper\n//--------------------------------------------------------------------+\nstatic bool prepare_new_command(mtpd_interface_t* p_mtp) {\n  p_mtp->phase = MTP_PHASE_COMMAND;\n  return usbd_edpt_xfer(p_mtp->rhport, p_mtp->ep_out, _mtpd_epbuf.buf, CFG_TUD_MTP_EP_BUFSIZE, false);\n}\n\nbool tud_mtp_data_send(mtp_container_info_t *p_container) {\n  mtpd_interface_t *p_mtp = &_mtpd_itf;\n  if (p_mtp->phase == MTP_PHASE_COMMAND) {\n    // 1st data block: header + payload\n    p_mtp->phase = MTP_PHASE_DATA;\n    p_mtp->xferred_len = 0;\n    p_mtp->total_len   = p_container->header->len;\n\n    p_container->header->type           = MTP_CONTAINER_TYPE_DATA_BLOCK;\n    p_container->header->transaction_id = p_mtp->command.header.transaction_id;\n    p_mtp->io_header                    = *p_container->header; // save header for subsequent data\n  }\n\n  const uint16_t xact_len = (uint16_t)tu_min32(p_mtp->total_len - p_mtp->xferred_len, CFG_TUD_MTP_EP_BUFSIZE);\n\n  TU_LOG_DRV(\"  MTP Data IN: xferred_len/total_len=%lu/%lu, xact_len=%u\\r\\n\", p_mtp->xferred_len, p_mtp->total_len,\n             xact_len);\n  if (xact_len) {\n    TU_VERIFY(usbd_edpt_claim(p_mtp->rhport, p_mtp->ep_in));\n    TU_ASSERT(usbd_edpt_xfer(p_mtp->rhport, p_mtp->ep_in, _mtpd_epbuf.buf, xact_len, false));\n  }\n  return true;\n}\n\nbool tud_mtp_data_receive(mtp_container_info_t *p_container) {\n  mtpd_interface_t *p_mtp = &_mtpd_itf;\n  if (p_mtp->phase == MTP_PHASE_COMMAND) {\n    // 1st data block: header + payload\n    p_mtp->phase       = MTP_PHASE_DATA;\n    p_mtp->xferred_len = 0;\n    p_mtp->total_len   = p_container->header->len;\n  }\n\n  // up to buffer size since 1st packet (with header) may also contain payload\n  const uint16_t xact_len = CFG_TUD_MTP_EP_BUFSIZE;\n\n  TU_LOG_DRV(\"  MTP Data OUT: xferred_len/total_len=%lu/%lu, xact_len=%u\\r\\n\", p_mtp->xferred_len, p_mtp->total_len,\n             xact_len);\n  TU_VERIFY(usbd_edpt_claim(p_mtp->rhport, p_mtp->ep_out));\n  TU_ASSERT(usbd_edpt_xfer(p_mtp->rhport, p_mtp->ep_out, _mtpd_epbuf.buf, xact_len, false));\n  return true;\n}\n\nbool tud_mtp_response_send(mtp_container_info_t* p_container) {\n  mtpd_interface_t* p_mtp = &_mtpd_itf;\n  p_mtp->phase = MTP_PHASE_RESPONSE;\n  p_container->header->type = MTP_CONTAINER_TYPE_RESPONSE_BLOCK;\n  p_container->header->transaction_id = p_mtp->command.header.transaction_id;\n  TU_VERIFY(usbd_edpt_claim(p_mtp->rhport, p_mtp->ep_in));\n  return usbd_edpt_xfer(p_mtp->rhport, p_mtp->ep_in, _mtpd_epbuf.buf, (uint16_t) p_container->header->len, false);\n}\n\nbool tud_mtp_mounted(void) {\n  mtpd_interface_t* p_mtp = &_mtpd_itf;\n  return p_mtp->ep_out != 0 && p_mtp->ep_in != 0;\n}\n\nbool tud_mtp_event_send(mtp_event_t* event) {\n  mtpd_interface_t* p_mtp = &_mtpd_itf;\n  TU_VERIFY(p_mtp->ep_event != 0);\n  _mtpd_epbuf.buf_event = *event;\n  TU_VERIFY(usbd_edpt_claim(p_mtp->rhport, p_mtp->ep_event)); // Claim the endpoint\n  return usbd_edpt_xfer(p_mtp->rhport, p_mtp->ep_event, (uint8_t*) &_mtpd_epbuf.buf_event, sizeof(mtp_event_t), false);\n}\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid mtpd_init(void) {\n  tu_memclr(&_mtpd_itf, sizeof(mtpd_interface_t));\n}\n\nbool mtpd_deinit(void) {\n  return true; // nothing to do\n}\n\nvoid mtpd_reset(uint8_t rhport) {\n  (void) rhport;\n  tu_memclr(&_mtpd_itf, sizeof(mtpd_interface_t));\n}\n\nuint16_t mtpd_open(uint8_t rhport, tusb_desc_interface_t const* itf_desc, uint16_t max_len) {\n  // only support PIMA 15470 protocol\n  TU_VERIFY(TUSB_CLASS_IMAGE == itf_desc->bInterfaceClass &&\n            MTP_SUBCLASS_STILL_IMAGE == itf_desc->bInterfaceSubClass &&\n            MTP_PROTOCOL_PIMA_15470 == itf_desc->bInterfaceProtocol, 0);\n\n  // mtp driver length is fixed\n  const uint16_t mtpd_itf_size = sizeof(tusb_desc_interface_t) + 3 * sizeof(tusb_desc_endpoint_t);\n\n  // Max length must be at least 1 interface + 3 endpoints\n  TU_ASSERT(itf_desc->bNumEndpoints == 3 && max_len >= mtpd_itf_size);\n  mtpd_interface_t* p_mtp = &_mtpd_itf;\n  tu_memclr(p_mtp, sizeof(mtpd_interface_t));\n  p_mtp->rhport = rhport;\n  p_mtp->itf_num = itf_desc->bInterfaceNumber;\n\n  // Open interrupt IN endpoint\n  const tusb_desc_endpoint_t* ep_desc_int = (const tusb_desc_endpoint_t*) tu_desc_next(itf_desc);\n  TU_ASSERT(ep_desc_int->bDescriptorType == TUSB_DESC_ENDPOINT && ep_desc_int->bmAttributes.xfer == TUSB_XFER_INTERRUPT, 0);\n  TU_ASSERT(usbd_edpt_open(rhport, ep_desc_int), 0);\n  p_mtp->ep_event = ep_desc_int->bEndpointAddress;\n\n  // Open endpoint pair\n  const tusb_desc_endpoint_t* ep_desc_bulk = (const tusb_desc_endpoint_t*) tu_desc_next(ep_desc_int);\n  TU_ASSERT(usbd_open_edpt_pair(rhport, (const uint8_t*)ep_desc_bulk, 2, TUSB_XFER_BULK, &p_mtp->ep_out, &p_mtp->ep_in), 0);\n  TU_ASSERT(prepare_new_command(p_mtp), 0);\n\n  if (tud_speed_get() == TUSB_SPEED_FULL) {\n    p_mtp->ep_sz_fs = (uint8_t)tu_edpt_packet_size(ep_desc_bulk);\n  }\n\n  return mtpd_itf_size;\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool mtpd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const* request) {\n  mtpd_interface_t* p_mtp = &_mtpd_itf;\n  tud_mtp_request_cb_data_t cb_data = {\n    .idx = 0,\n    .stage = stage,\n    .session_id = p_mtp->session_id,\n    .request = request,\n    .buf = p_mtp->control_buf,\n    .bufsize = tu_le16toh(request->wLength),\n  };\n\n  switch (request->bRequest) {\n    case MTP_REQ_CANCEL:\n      TU_LOG_DRV(\"  MTP request: Cancel\\n\");\n      if (stage == CONTROL_STAGE_SETUP) {\n        return tud_control_xfer(rhport, request, p_mtp->control_buf, CFG_TUD_MTP_EP_CONTROL_BUFSIZE);\n      } else if (stage == CONTROL_STAGE_ACK) {\n        return tud_mtp_request_cancel_cb(&cb_data);\n      }\n      break;\n\n    case MTP_REQ_GET_EXT_EVENT_DATA:\n      TU_LOG_DRV(\"  MTP request: Get Extended Event Data\\n\");\n      if (stage == CONTROL_STAGE_SETUP) {\n        const int32_t len = tud_mtp_request_get_extended_event_cb(&cb_data);\n        TU_VERIFY(len > 0);\n        return tud_control_xfer(rhport,request, p_mtp->control_buf, (uint16_t) len);\n      }\n      break;\n\n    case MTP_REQ_RESET:\n      TU_LOG_DRV(\"  MTP request: Device Reset\\n\");\n      // used by the host to return the Still Image Capture Device to the Idle state after the Bulk-pipe has stalled\n      if (stage == CONTROL_STAGE_SETUP) {\n        // clear stalled\n        if (usbd_edpt_stalled(rhport, p_mtp->ep_out)) {\n          usbd_edpt_clear_stall(rhport, p_mtp->ep_out);\n        }\n        if (usbd_edpt_stalled(rhport, p_mtp->ep_in)) {\n          usbd_edpt_clear_stall(rhport, p_mtp->ep_in);\n        }\n      } else if (stage == CONTROL_STAGE_ACK) {\n        prepare_new_command(p_mtp);\n        return tud_mtp_request_device_reset_cb(&cb_data);\n      }\n      break;\n\n    case MTP_REQ_GET_DEVICE_STATUS: {\n      TU_LOG_DRV(\"  MTP request: Get Device Status\\n\");\n      if (stage == CONTROL_STAGE_SETUP) {\n        const int32_t len = tud_mtp_request_get_device_status_cb(&cb_data);\n        TU_VERIFY(len > 0);\n        return tud_control_xfer(rhport, request, p_mtp->control_buf, (uint16_t) len);\n      }\n      break;\n    }\n\n    default:\n      return tud_mtp_request_vendor_cb(&cb_data);\n  }\n\n  return true;\n}\n\n// Transfer on bulk endpoints\nbool mtpd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes) {\n  if (ep_addr == _mtpd_itf.ep_event) {\n    // nothing to do\n    return true;\n  }\n\n  mtpd_interface_t* p_mtp = &_mtpd_itf;\n  mtp_generic_container_t* p_container = (mtp_generic_container_t*) _mtpd_epbuf.buf;\n\n#if CFG_TUSB_DEBUG >= CFG_TUD_MTP_LOG_LEVEL\n  const uint16_t code = (p_mtp->phase == MTP_PHASE_COMMAND) ? p_container->header.code : p_mtp->command.header.code;\n  TU_LOG_DRV(\"  MTP %s: %s phase\\r\\n\", (const char *) tu_lookup_find(&_mtp_op_table, code),\n    _mtp_phase_str[p_mtp->phase]);\n#endif\n\n  const mtp_container_info_t headered_packet = {\n    .header = &p_container->header,\n    .payload = p_container->payload,\n    .payload_bytes = CFG_TUD_MTP_EP_BUFSIZE - sizeof(mtp_container_header_t)\n  };\n\n  const mtp_container_info_t headerless_packet = {\n    .header = &p_mtp->io_header,\n    .payload = _mtpd_epbuf.buf,\n    .payload_bytes = CFG_TUD_MTP_EP_BUFSIZE\n  };\n\n  tud_mtp_cb_data_t cb_data;\n  cb_data.idx = 0;\n  cb_data.phase = p_mtp->phase;\n  cb_data.session_id = p_mtp->session_id;\n  cb_data.command_container = &p_mtp->command;\n  cb_data.io_container = headered_packet;\n  cb_data.total_xferred_bytes = 0;\n  cb_data.xfer_result = event;\n\n  switch (p_mtp->phase) {\n    case MTP_PHASE_COMMAND: {\n      // received new command\n      TU_VERIFY(ep_addr == p_mtp->ep_out && p_container->header.type == MTP_CONTAINER_TYPE_COMMAND_BLOCK);\n      memcpy(&p_mtp->command, p_container, sizeof(mtp_container_command_t)); // save new command\n      p_container->header.len = sizeof(mtp_container_header_t); // default container to header only\n      preprocess_cmd(p_mtp, &cb_data);\n      if (tud_mtp_command_received_cb(&cb_data) < 0) {\n        p_mtp->phase = MTP_PHASE_ERROR;\n      }\n      break;\n    }\n\n    case MTP_PHASE_DATA: {\n      p_mtp->xferred_len += xferred_bytes;\n      cb_data.total_xferred_bytes = p_mtp->xferred_len;\n\n      const bool is_data_in = (ep_addr == p_mtp->ep_in);\n      // For IN endpoint, threshold is bulk max packet size\n      // For OUT endpoint, threshold is endpoint buffer size, since we always queue fixed size\n      uint16_t threshold;\n      if (is_data_in) {\n        threshold = (p_mtp->ep_sz_fs > 0) ? p_mtp->ep_sz_fs : 512; // full speed bulk if set\n      } else {\n        threshold = CFG_TUD_MTP_EP_BUFSIZE;\n      }\n\n      // Check completion: ZLP, short packet, or total length reached\n      const bool is_complete =\n        (xferred_bytes == 0 || xferred_bytes < threshold || p_mtp->xferred_len >= p_mtp->total_len);\n\n      TU_LOG_DRV(\"  MTP Data %s CB: xferred_bytes=%lu, xferred_len/total_len=%lu/%lu, is_complete=%d\\r\\n\",\n                 is_data_in ? \"IN\" : \"OUT\", xferred_bytes, p_mtp->xferred_len, p_mtp->total_len, is_complete ? 1 : 0);\n\n      // Send/queue ZLP if packet is full-sized but transfer is complete\n      if (is_complete && xferred_bytes > 0 && !(xferred_bytes & (threshold - 1))) {\n        TU_LOG_DRV(\"  queue ZLP\\r\\n\");\n        TU_VERIFY(usbd_edpt_claim(p_mtp->rhport, ep_addr));\n        TU_ASSERT(usbd_edpt_xfer(p_mtp->rhport, ep_addr, NULL, 0, false));\n        return true;\n      }\n\n      if (is_data_in) {\n        // Data In\n        if (is_complete) {\n          cb_data.io_container.header->len = sizeof(mtp_container_header_t);\n          tud_mtp_data_complete_cb(&cb_data);\n        } else {\n          // 2nd+ packet: payload only\n          cb_data.io_container = headerless_packet;\n          tud_mtp_data_xfer_cb(&cb_data);\n        }\n      } else {\n        // Data Out\n        if (p_mtp->xferred_len == xferred_bytes) {\n          // 1st OUT packet: header + payload\n          p_mtp->io_header = p_container->header; // save header for subsequent transaction\n          cb_data.io_container.payload_bytes = xferred_bytes - sizeof(mtp_container_header_t);\n        } else {\n          // 2nd+ packet: payload only\n          cb_data.io_container = headerless_packet;\n          cb_data.io_container.payload_bytes = xferred_bytes;\n        }\n        tud_mtp_data_xfer_cb(&cb_data);\n\n        if (is_complete) {\n          // back to header + payload for response\n          cb_data.io_container = headered_packet;\n          cb_data.io_container.header->len = sizeof(mtp_container_header_t);\n          tud_mtp_data_complete_cb(&cb_data);\n        }\n      }\n      break;\n    }\n\n    case MTP_PHASE_RESPONSE:\n      // response phase is complete -> prepare for new command\n      TU_ASSERT(ep_addr == p_mtp->ep_in);\n      tud_mtp_response_complete_cb(&cb_data);\n      prepare_new_command(p_mtp);\n      break;\n\n    case MTP_PHASE_ERROR:\n      // handled after switch, supposedly to be empty\n      break;\n    default: return false;\n  }\n\n   if (p_mtp->phase == MTP_PHASE_ERROR) {\n    // stall both IN & OUT endpoints\n    usbd_edpt_stall(rhport, p_mtp->ep_out);\n    usbd_edpt_stall(rhport, p_mtp->ep_in);\n  }\n\n  return true;\n}\n\n\n//--------------------------------------------------------------------+\n// MTPD Internal functionality\n//--------------------------------------------------------------------+\n\n// pre-processed commands\nvoid preprocess_cmd(mtpd_interface_t* p_mtp, tud_mtp_cb_data_t* cb_data) {\n  switch (p_mtp->command.header.code) {\n    case MTP_OP_GET_DEVICE_INFO: {\n      tud_mtp_device_info_t dev_info = {\n        .standard_version = 100,\n        .mtp_vendor_extension_id = 6, // MTP specs say 0xFFFFFFFF but libMTP check for value 6\n        .mtp_version = 100,\n        .mtp_extensions = {\n          .count = sizeof(CFG_TUD_MTP_DEVICEINFO_EXTENSIONS),\n          .utf16 = { 0 }\n        },\n        .functional_mode = 0x0000,\n        .supported_operations = {\n          .count = TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_SUPPORTED_OPERATIONS),\n          .arr = { CFG_TUD_MTP_DEVICEINFO_SUPPORTED_OPERATIONS }\n        },\n        .supported_events = {\n          .count = TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_SUPPORTED_EVENTS),\n          .arr = { CFG_TUD_MTP_DEVICEINFO_SUPPORTED_EVENTS }\n        },\n        .supported_device_properties = {\n          .count = TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_SUPPORTED_DEVICE_PROPERTIES),\n          .arr = { CFG_TUD_MTP_DEVICEINFO_SUPPORTED_DEVICE_PROPERTIES }\n        },\n        .capture_formats = {\n          .count = TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_CAPTURE_FORMATS),\n          .arr = { CFG_TUD_MTP_DEVICEINFO_CAPTURE_FORMATS }\n        },\n        .playback_formats = {\n          .count = TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_PLAYBACK_FORMATS),\n          .arr = { CFG_TUD_MTP_DEVICEINFO_PLAYBACK_FORMATS }\n        }\n      };\n\n      for (uint8_t i=0; i < dev_info.mtp_extensions.count; i++) {\n        dev_info.mtp_extensions.utf16[i] = (uint16_t)CFG_TUD_MTP_DEVICEINFO_EXTENSIONS[i];\n      }\n\n      mtp_container_add_raw(&cb_data->io_container, &dev_info, sizeof(tud_mtp_device_info_t));\n      break;\n    }\n\n    default:\n      break;\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/class/mtp/mtp_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ennebi Elettronica (https://ennebielettronica.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MTP_DEVICE_H_\n#define TUSB_MTP_DEVICE_H_\n\n#include \"common/tusb_common.h\"\n#include \"mtp.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_MTP)\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// callback data for Bulk Only Transfer (BOT) protocol\ntypedef struct {\n  uint8_t idx; // mtp instance\n  uint8_t phase; // current phase\n  uint32_t session_id;\n\n  const mtp_container_command_t* command_container;\n  mtp_container_info_t io_container;\n\n  tusb_xfer_result_t xfer_result;\n  uint32_t total_xferred_bytes; // number of bytes transferred so far in this phase\n} tud_mtp_cb_data_t;\n\n// callback data for Control requests\ntypedef struct {\n  uint8_t idx;\n  uint8_t stage; // control stage\n\n  // buffer for data stage\n  uint16_t bufsize;\n  uint8_t* buf;\n\n  const tusb_control_request_t* request;\n\n  uint32_t session_id;\n} tud_mtp_request_cb_data_t;\n\n// Number of supported operations, events, device properties, capture formats, playback formats\n// and max number of characters for strings manufacturer, model, device_version, serial_number\n#define MTP_DEVICE_INFO_STRUCT(_extension_nchars, _op_count, _event_count, _devprop_count, _capture_count, _playback_count) \\\n  struct TU_ATTR_PACKED { \\\n    uint16_t standard_version; \\\n    uint32_t mtp_vendor_extension_id; \\\n    uint16_t mtp_version; \\\n    mtp_string_t(_extension_nchars) mtp_extensions; \\\n    uint16_t functional_mode; \\\n    mtp_auint16_t(_op_count) supported_operations; \\\n    mtp_auint16_t(_event_count) supported_events; \\\n    mtp_auint16_t(_devprop_count) supported_device_properties; \\\n    mtp_auint16_t(_capture_count) capture_formats; \\\n    mtp_auint16_t(_playback_count) playback_formats; \\\n    /* string fields will be added using append function */ \\\n  }\n\ntypedef MTP_DEVICE_INFO_STRUCT( //-V2586 [MISRA-C-18.7] Flexible array members should not be declared\n  sizeof(CFG_TUD_MTP_DEVICEINFO_EXTENSIONS), TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_SUPPORTED_OPERATIONS),\n  TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_SUPPORTED_EVENTS), TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_SUPPORTED_DEVICE_PROPERTIES),\n  TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_CAPTURE_FORMATS), TU_ARGS_NUM(CFG_TUD_MTP_DEVICEINFO_PLAYBACK_FORMATS)\n) tud_mtp_device_info_t;\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// check if mtp interface is mounted\nbool tud_mtp_mounted(void);\n\n// send data phase\nbool tud_mtp_data_send(mtp_container_info_t* p_container);\n\n// receive data phase\nbool tud_mtp_data_receive(mtp_container_info_t* p_container);\n\n// send response\nbool tud_mtp_response_send(mtp_container_info_t* p_container);\n\n// send event notification on event endpoint\nbool tud_mtp_event_send(mtp_event_t* event);\n\n//--------------------------------------------------------------------+\n// Control request Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when received Cancel request. Data is available in callback data's buffer\n// return false to stall the request\nbool tud_mtp_request_cancel_cb(tud_mtp_request_cb_data_t* cb_data);\n\n// Invoked when received Device Reset request\n// return false to stall the request\nbool tud_mtp_request_device_reset_cb(tud_mtp_request_cb_data_t* cb_data);\n\n// Invoked when received Get Extended Event request. Application fill callback data's buffer for response\n// return negative to stall the request\nint32_t tud_mtp_request_get_extended_event_cb(tud_mtp_request_cb_data_t* cb_data);\n\n// Invoked when received Get DeviceStatus request. Application fill callback data's buffer for response\n// return negative to stall the request\nint32_t tud_mtp_request_get_device_status_cb(tud_mtp_request_cb_data_t* cb_data);\n\n// Invoked when received vendor-specific request not in the above standard MTP requests\n// return false to stall the request\nbool tud_mtp_request_vendor_cb(tud_mtp_request_cb_data_t* cb_data);\n\n//--------------------------------------------------------------------+\n// Bulk only protocol Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when new command is received. Application fill the cb_data->io_container and call tud_mtp_data_send() or\n// tud_mtp_response_send() for Data or Response phase.\n// Return negative to stall the endpoints\nint32_t tud_mtp_command_received_cb(tud_mtp_cb_data_t * cb_data);\n\n// Invoked when a data packet is transferred. If data spans over multiple packets, application can use\n// total_xferred_bytes and io_container's payload_bytes to determine the offset and remaining bytes to be transferred.\n// Return negative to stall the endpoints\nint32_t tud_mtp_data_xfer_cb(tud_mtp_cb_data_t* cb_data);\n\n// Invoked when all bytes in DATA phase is complete. A response packet is expected\n// Return negative to stall the endpoints\nint32_t tud_mtp_data_complete_cb(tud_mtp_cb_data_t* cb_data);\n\n// Invoked when response phase is complete\n// Return negative to stall the endpoints\nint32_t tud_mtp_response_complete_cb(tud_mtp_cb_data_t* cb_data);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     mtpd_init            (void);\nbool     mtpd_deinit          (void);\nvoid     mtpd_reset           (uint8_t rhport);\nuint16_t mtpd_open            (uint8_t rhport, tusb_desc_interface_t const *itf_desc, uint16_t max_len);\nbool     mtpd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const *p_request);\nbool     mtpd_xfer_cb         (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n#endif\n"
  },
  {
    "path": "src/class/net/ecm_rndis_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Peter Lawrence\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if ( CFG_TUD_ENABLED && CFG_TUD_ECM_RNDIS )\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"net_device.h\"\n#include \"rndis_protocol.h\"\n\n#define CFG_TUD_NET_PACKET_PREFIX_LEN sizeof(rndis_data_packet_t)\n#define CFG_TUD_NET_PACKET_SUFFIX_LEN 0\n\n#define NETD_PACKET_SIZE  (CFG_TUD_NET_PACKET_PREFIX_LEN + CFG_TUD_NET_MTU + CFG_TUD_NET_PACKET_PREFIX_LEN)\n#define NETD_CONTROL_SIZE 120\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t itf_num;      // Index number of Management Interface, +1 for Data Interface\n  uint8_t itf_data_alt; // Alternate setting of Data Interface. 0 : inactive, 1 : active\n\n  uint8_t ep_notif;\n  uint8_t ep_in;\n  uint8_t ep_out;\n\n  bool ecm_mode;\n\n  // Endpoint descriptor use to open/close when receiving SetInterface\n  // TODO since configuration descriptor may not be long-lived memory, we should\n  // keep a copy of endpoint attribute instead\n  uint8_t const * ecm_desc_epdata;\n} netd_interface_t;\n\ntypedef struct ecm_notify_struct {\n  tusb_control_request_t header;\n  uint32_t downlink, uplink;\n} ecm_notify_t;\n\ntypedef struct {\n  TUD_EPBUF_DEF(rx, NETD_PACKET_SIZE);\n  TUD_EPBUF_DEF(tx, NETD_PACKET_SIZE);\n\n  TUD_EPBUF_DEF(notify, sizeof(ecm_notify_t));\n  TUD_EPBUF_DEF(ctrl, NETD_CONTROL_SIZE);\n} netd_epbuf_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nstatic netd_interface_t _netd_itf;\nCFG_TUD_MEM_SECTION static netd_epbuf_t _netd_epbuf;\nstatic bool can_xmit;\nstatic bool ecm_link_is_up = true;  // Store link state for ECM mode\n\nvoid tud_network_recv_renew(void) {\n  usbd_edpt_xfer(0, _netd_itf.ep_out, _netd_epbuf.rx, NETD_PACKET_SIZE, false);\n}\n\nstatic void do_in_xfer(uint8_t *buf, uint16_t len) {\n  can_xmit = false;\n  usbd_edpt_xfer(0, _netd_itf.ep_in, buf, len, false);\n}\n\nvoid netd_report(uint8_t *buf, uint16_t len) {\n  const uint8_t rhport = 0;\n  len = tu_min16(len, sizeof(ecm_notify_t));\n\n  if (!usbd_edpt_claim(rhport, _netd_itf.ep_notif)) {\n    TU_LOG1(\"ECM: Failed to claim notification endpoint\\n\");\n    return;\n  }\n\n  memcpy(_netd_epbuf.notify, buf, len);\n  usbd_edpt_xfer(rhport, _netd_itf.ep_notif, _netd_epbuf.notify, len, false);\n}\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid netd_init(void) {\n  tu_memclr(&_netd_itf, sizeof(_netd_itf));\n}\n\nbool netd_deinit(void) {\n  return true;\n}\n\nvoid netd_reset(uint8_t rhport) {\n  (void) rhport;\n  netd_init();\n}\n\nuint16_t netd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len) {\n  bool const is_rndis = (TUD_RNDIS_ITF_CLASS    == itf_desc->bInterfaceClass    &&\n                         TUD_RNDIS_ITF_SUBCLASS == itf_desc->bInterfaceSubClass &&\n                         TUD_RNDIS_ITF_PROTOCOL == itf_desc->bInterfaceProtocol);\n\n  bool const is_ecm = (TUSB_CLASS_CDC                           == itf_desc->bInterfaceClass &&\n                       CDC_COMM_SUBCLASS_ETHERNET_CONTROL_MODEL == itf_desc->bInterfaceSubClass &&\n                       0x00                                     == itf_desc->bInterfaceProtocol);\n\n  TU_VERIFY(is_rndis || is_ecm, 0);\n\n  // confirm interface hasn't already been allocated\n  TU_ASSERT(0 == _netd_itf.ep_notif, 0);\n\n  // sanity check the descriptor\n  _netd_itf.ecm_mode = is_ecm;\n\n  //------------- Management Interface -------------//\n  _netd_itf.itf_num = itf_desc->bInterfaceNumber;\n\n  uint16_t drv_len = sizeof(tusb_desc_interface_t);\n  uint8_t const * p_desc = tu_desc_next( itf_desc );\n\n  // Communication Functional Descriptors\n  while (TUSB_DESC_CS_INTERFACE == tu_desc_type(p_desc) && drv_len <= max_len) {\n    drv_len += tu_desc_len(p_desc);\n    p_desc   = tu_desc_next(p_desc);\n  }\n\n  // notification endpoint (if any)\n  if (TUSB_DESC_ENDPOINT == tu_desc_type(p_desc)) {\n    TU_ASSERT(usbd_edpt_open(rhport, (tusb_desc_endpoint_t const *) p_desc), 0);\n\n    _netd_itf.ep_notif = ((tusb_desc_endpoint_t const*)p_desc)->bEndpointAddress;\n\n    drv_len += tu_desc_len(p_desc);\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  //------------- Data Interface -------------//\n  // - RNDIS Data followed immediately by a pair of endpoints\n  // - CDC-ECM data interface has 2 alternate settings\n  //   - 0 : zero endpoints for inactive (default)\n  //   - 1 : IN & OUT endpoints for active networking\n  TU_ASSERT(TUSB_DESC_INTERFACE == tu_desc_type(p_desc), 0);\n\n  do {\n    tusb_desc_interface_t const * data_itf_desc = (tusb_desc_interface_t const *) p_desc;\n    TU_ASSERT(TUSB_CLASS_CDC_DATA == data_itf_desc->bInterfaceClass, 0);\n\n    drv_len += tu_desc_len(p_desc);\n    p_desc   = tu_desc_next(p_desc);\n  } while (_netd_itf.ecm_mode && (TUSB_DESC_INTERFACE == tu_desc_type(p_desc)) && (drv_len <= max_len));\n\n  // Pair of endpoints\n  TU_ASSERT(TUSB_DESC_ENDPOINT == tu_desc_type(p_desc), 0);\n\n  if (_netd_itf.ecm_mode) {\n    // ECM by default is in-active, save the endpoint attribute\n    // to open later when received setInterface\n    _netd_itf.ecm_desc_epdata = p_desc;\n  } else {\n    // Open endpoint pair for RNDIS\n    TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, 2, TUSB_XFER_BULK, &_netd_itf.ep_out, &_netd_itf.ep_in), 0);\n\n    // we are ready to transmit a packet\n    can_xmit = true;\n\n    // prepare for incoming packets\n    tud_network_recv_renew();\n  }\n\n  drv_len += 2*sizeof(tusb_desc_endpoint_t);\n\n  return drv_len;\n}\n\nstatic void ecm_report(bool nc) {\n  ecm_notify_t ecm_notify_nc = {\n    .header = {\n      .bmRequestType = 0xA1,\n      .bRequest = 0, /* NETWORK_CONNECTION aka NetworkConnection */\n      .wValue = ecm_link_is_up ? 1 : 0,   /* Use current link state */\n      .wLength = 0,\n    },\n  };\n\n  const ecm_notify_t ecm_notify_csc = {\n    .header = {\n      .bmRequestType = 0xA1,\n      .bRequest = 0x2A, /* CONNECTION_SPEED_CHANGE aka ConnectionSpeedChange */\n      .wLength = 8,\n    },\n    .downlink = 9728000,\n    .uplink = 9728000,\n  };\n\n  ecm_notify_t notify = (nc) ? ecm_notify_nc : ecm_notify_csc;\n  notify.header.wIndex = _netd_itf.itf_num;\n  netd_report((uint8_t *)&notify, (nc) ? sizeof(notify.header) : sizeof(notify));\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool netd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request) {\n  if (stage == CONTROL_STAGE_SETUP) {\n    switch (request->bmRequestType_bit.type) {\n      case TUSB_REQ_TYPE_STANDARD:\n        switch (request->bRequest) {\n          case TUSB_REQ_GET_INTERFACE: {\n            uint8_t const req_itfnum = (uint8_t)request->wIndex;\n            TU_VERIFY(_netd_itf.itf_num+1 == req_itfnum);\n\n            tud_control_xfer(rhport, request, &_netd_itf.itf_data_alt, 1);\n          }\n          break;\n\n          case TUSB_REQ_SET_INTERFACE: {\n            uint8_t const req_itfnum = (uint8_t)request->wIndex;\n            uint8_t const req_alt = (uint8_t)request->wValue;\n\n            // Only valid for Data Interface with Alternate is either 0 or 1\n            TU_VERIFY(_netd_itf.itf_num+1 == req_itfnum && req_alt < 2);\n\n            // ACM-ECM only: qequest to enable/disable network activities\n            TU_VERIFY(_netd_itf.ecm_mode);\n\n            _netd_itf.itf_data_alt = req_alt;\n\n            if (_netd_itf.itf_data_alt) {\n              // TODO since we don't actually close endpoint\n              // hack here to not re-open it\n              if (_netd_itf.ep_in == 0 && _netd_itf.ep_out == 0) {\n                TU_ASSERT(_netd_itf.ecm_desc_epdata);\n                TU_ASSERT(\n                  usbd_open_edpt_pair(rhport, _netd_itf.ecm_desc_epdata, 2, TUSB_XFER_BULK, &_netd_itf.ep_out, &\n                    _netd_itf.ep_in));\n\n                // TODO should be merge with RNDIS's after endpoint opened\n                // Also should have opposite callback for application to disable network !!\n                can_xmit = true; // we are ready to transmit a packet\n                tud_network_recv_renew(); // prepare for incoming packets\n              }\n            } else {\n              // TODO close the endpoint pair\n              // For now pretend that we did, this should have no harm since host won't try to\n              // communicate with the endpoints again\n              // _netd_itf.ep_in = _netd_itf.ep_out = 0\n            }\n\n            tud_control_status(rhport, request);\n          }\n          break;\n\n          // unsupported request\n          default: return false;\n        }\n        break;\n\n      case TUSB_REQ_TYPE_CLASS:\n        TU_VERIFY(_netd_itf.itf_num == request->wIndex);\n\n        if (_netd_itf.ecm_mode) {\n          /* the only required CDC-ECM Management Element Request is SetEthernetPacketFilter */\n          if (0x43 /* SET_ETHERNET_PACKET_FILTER */ == request->bRequest) {\n            tud_control_xfer(rhport, request, NULL, 0);\n            // Only send connection notification if link is up\n            if (ecm_link_is_up) {\n              ecm_report(true);\n            }\n          }\n        } else {\n          if (request->bmRequestType_bit.direction == TUSB_DIR_IN) {\n            rndis_generic_msg_t* rndis_msg = (rndis_generic_msg_t*)((void*)_netd_epbuf.ctrl);\n            uint32_t msglen = tu_le32toh(rndis_msg->MessageLength);\n            TU_ASSERT(msglen <= NETD_CONTROL_SIZE);\n            tud_control_xfer(rhport, request, _netd_epbuf.ctrl, (uint16_t)msglen);\n          } else {\n            tud_control_xfer(rhport, request, _netd_epbuf.ctrl, NETD_CONTROL_SIZE);\n          }\n        }\n        break;\n\n      // unsupported request\n      default: return false;\n    }\n  } else if (stage == CONTROL_STAGE_DATA) {\n    // Handle RNDIS class control OUT only\n    if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS &&\n        request->bmRequestType_bit.direction == TUSB_DIR_OUT &&\n        _netd_itf.itf_num == request->wIndex) {\n      if (!_netd_itf.ecm_mode) {\n        rndis_class_set_handler(_netd_epbuf.ctrl, request->wLength);\n      }\n    }\n  }\n\n  return true;\n}\n\nstatic void handle_incoming_packet(uint32_t len) {\n  uint8_t* pnt = _netd_epbuf.rx;\n  uint32_t size = 0;\n\n  if (_netd_itf.ecm_mode) {\n    size = len;\n  } else {\n    rndis_data_packet_t* r = (rndis_data_packet_t*)((void*)pnt);\n    if (len >= sizeof(rndis_data_packet_t)) {\n      if ((r->MessageType == REMOTE_NDIS_PACKET_MSG) && (r->MessageLength <= len)) {\n        if ((r->DataOffset + offsetof(rndis_data_packet_t, DataOffset) + r->DataLength) <= len) {\n          pnt = &_netd_epbuf.rx[r->DataOffset + offsetof(rndis_data_packet_t, DataOffset)];\n          size = r->DataLength;\n        }\n      }\n    }\n  }\n\n  if (!tud_network_recv_cb(pnt, (uint16_t)size)) {\n    /* if a buffer was never handled by user code, we must renew on the user's behalf */\n    tud_network_recv_renew();\n  }\n}\n\nbool netd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void)rhport;\n  (void)result;\n\n  /* new packet received */\n  if (ep_addr == _netd_itf.ep_out) {\n    handle_incoming_packet(xferred_bytes);\n  }\n\n  /* data transmission finished */\n  if (ep_addr == _netd_itf.ep_in) {\n    /* TinyUSB requires the class driver to implement ZLP (since ZLP usage is class-specific) */\n\n    if (xferred_bytes && (0 == (xferred_bytes % CFG_TUD_NET_ENDPOINT_SIZE))) {\n      do_in_xfer(NULL, 0); /* a ZLP is needed */\n    } else {\n      /* we're finally finished */\n      can_xmit = true;\n    }\n  }\n\n  if (_netd_itf.ecm_mode && (ep_addr == _netd_itf.ep_notif)) {\n    // Notification transfer complete - endpoint is now free\n    // Don't automatically send speed change notification after link state changes\n  }\n\n  return true;\n}\n\nbool tud_network_can_xmit(uint16_t size) {\n  (void)size;\n  return can_xmit;\n}\n\nvoid tud_network_xmit(void *ref, uint16_t arg) {\n  if (!can_xmit) {\n    return;\n  }\n\n  uint16_t len = (_netd_itf.ecm_mode) ? 0 : CFG_TUD_NET_PACKET_PREFIX_LEN;\n  uint8_t* data = _netd_epbuf.tx + len;\n\n  len += tud_network_xmit_cb(data, ref, arg);\n\n  if (!_netd_itf.ecm_mode) {\n    rndis_data_packet_t *hdr = (rndis_data_packet_t *) ((void*) _netd_epbuf.tx);\n    memset(hdr, 0, sizeof(rndis_data_packet_t));\n    hdr->MessageType = REMOTE_NDIS_PACKET_MSG;\n    hdr->MessageLength = len;\n    hdr->DataOffset = sizeof(rndis_data_packet_t) - offsetof(rndis_data_packet_t, DataOffset);\n    hdr->DataLength = len - sizeof(rndis_data_packet_t);\n  }\n\n  do_in_xfer(_netd_epbuf.tx, len);\n}\n\n// Set the network link state (up/down) and notify the host\nvoid tud_network_link_state(uint8_t rhport, bool is_up) {\n  (void)rhport;\n\n  if (_netd_itf.ecm_mode) {\n    ecm_link_is_up = is_up;\n\n    // For ECM mode, send network connection notification only\n    // Don't trigger speed change notification for link state changes\n    ecm_notify_t notify = {\n      .header = {\n        .bmRequestType = 0xA1,\n        .bRequest = 0,        /* NETWORK_CONNECTION */\n        .wValue = is_up ? 1 : 0,  /* 0 = disconnected, 1 = connected */\n        .wLength = 0,\n      },\n    };\n    notify.header.wIndex = _netd_itf.itf_num;\n    netd_report((uint8_t *)&notify, sizeof(notify.header));\n  } else {\n    // For RNDIS mode, we would need to implement RNDIS status indication\n    // This is more complex and requires RNDIS_INDICATE_STATUS_MSG\n    // For now, RNDIS doesn't support dynamic link state changes\n    (void)is_up;\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/class/net/ncm.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n * Copyright (c) 2024, Hardy Griech\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_NCM_H_\n#define TUSB_NCM_H_\n\n#include \"common/tusb_common.h\"\n\n// NTB buffers size for reception side, must be >> MTU to avoid TCP retransmission (driver issue ?)\n// Linux use 2048 as minimal size\n#ifndef CFG_TUD_NCM_OUT_NTB_MAX_SIZE\n  #define CFG_TUD_NCM_OUT_NTB_MAX_SIZE 3200\n#endif\n\n// NTB buffers size for reception side, must be > MTU\n// Linux use 2048 as minimal size\n#ifndef CFG_TUD_NCM_IN_NTB_MAX_SIZE\n  #define CFG_TUD_NCM_IN_NTB_MAX_SIZE 3200\n#endif\n\n// Number of NTB buffers for reception side\n// Depending on the configuration, this parameter could be increased with the cost of additional RAM requirements\n// On Full-Speed (RP2040) :\n//    1  - good performance\n//    2  - up to 30% more performance with iperf with small packets\n//    >2 - no performance gain\n// On High-Speed (STM32F7) :\n//    No performance gain\n#ifndef CFG_TUD_NCM_OUT_NTB_N\n  #define CFG_TUD_NCM_OUT_NTB_N 1\n#endif\n\n// Number of NTB buffers for transmission side\n// Depending on the configuration, this parameter could be increased with the cost of additional RAM requirements\n// On Full-Speed (RP2040) :\n//    1 - good performance but SystemView shows lost events (on load test)\n//    2 - up to 50% more performance with iperf with small packets, \"tud_network_can_xmit: request blocked\"\n//        happens from time to time with SystemView\n//    3 - \"tud_network_can_xmit: request blocked\" never happens\n//    >3 - no performance gain\n// On High-Speed (STM32F7) :\n//    No performance gain\n#ifndef CFG_TUD_NCM_IN_NTB_N\n  #define CFG_TUD_NCM_IN_NTB_N 1\n#endif\n\n// How many datagrams it is allowed to put into an NTB for transmission side\n#ifndef CFG_TUD_NCM_IN_MAX_DATAGRAMS_PER_NTB\n  #define CFG_TUD_NCM_IN_MAX_DATAGRAMS_PER_NTB 8\n#endif\n\n// This tells the host how many datagrams it is allowed to put into an NTB\n#ifndef CFG_TUD_NCM_OUT_MAX_DATAGRAMS_PER_NTB\n  #define CFG_TUD_NCM_OUT_MAX_DATAGRAMS_PER_NTB 6\n#endif\n\n// Table 6.2 Class-Specific Request Codes for Network Control Model subclass\ntypedef enum\n{\n  NCM_SET_ETHERNET_MULTICAST_FILTERS               = 0x40,\n  NCM_SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x41,\n  NCM_GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x42,\n  NCM_SET_ETHERNET_PACKET_FILTER                   = 0x43,\n  NCM_GET_ETHERNET_STATISTIC                       = 0x44,\n  NCM_GET_NTB_PARAMETERS                           = 0x80,\n  NCM_GET_NET_ADDRESS                              = 0x81,\n  NCM_SET_NET_ADDRESS                              = 0x82,\n  NCM_GET_NTB_FORMAT                               = 0x83,\n  NCM_SET_NTB_FORMAT                               = 0x84,\n  NCM_GET_NTB_INPUT_SIZE                           = 0x85,\n  NCM_SET_NTB_INPUT_SIZE                           = 0x86,\n  NCM_GET_MAX_DATAGRAM_SIZE                        = 0x87,\n  NCM_SET_MAX_DATAGRAM_SIZE                        = 0x88,\n  NCM_GET_CRC_MODE                                 = 0x89,\n  NCM_SET_CRC_MODE                                 = 0x8A,\n} ncm_request_code_t;\n\n#define NTH16_SIGNATURE 0x484D434E\n#define NDP16_SIGNATURE_NCM0 0x304D434E\n#define NDP16_SIGNATURE_NCM1 0x314D434E\n\ntypedef struct TU_ATTR_PACKED {\n  uint16_t wLength;\n  uint16_t bmNtbFormatsSupported;\n  uint32_t dwNtbInMaxSize;\n  uint16_t wNdbInDivisor;\n  uint16_t wNdbInPayloadRemainder;\n  uint16_t wNdbInAlignment;\n  uint16_t wReserved;\n  uint32_t dwNtbOutMaxSize;\n  uint16_t wNdbOutDivisor;\n  uint16_t wNdbOutPayloadRemainder;\n  uint16_t wNdbOutAlignment;\n  uint16_t wNtbOutMaxDatagrams;\n} ntb_parameters_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint32_t dwSignature;\n  uint16_t wHeaderLength;\n  uint16_t wSequence;\n  uint16_t wBlockLength;\n  uint16_t wNdpIndex;\n} nth16_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint16_t wDatagramIndex;\n  uint16_t wDatagramLength;\n} ndp16_datagram_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint32_t dwSignature;\n  uint16_t wLength;\n  uint16_t wNextNdpIndex;\n  //ndp16_datagram_t datagram[];\n} ndp16_t;\n\ntypedef union TU_ATTR_PACKED {\n  struct {\n    nth16_t nth;\n    ndp16_t ndp;\n    ndp16_datagram_t ndp_datagram[CFG_TUD_NCM_IN_MAX_DATAGRAMS_PER_NTB + 1];\n  };\n  uint8_t data[CFG_TUD_NCM_IN_NTB_MAX_SIZE];\n} xmit_ntb_t;\n\ntypedef union TU_ATTR_PACKED {\n  struct {\n    nth16_t nth;\n    // only the header is at a guaranteed position\n  };\n  uint8_t data[CFG_TUD_NCM_OUT_NTB_MAX_SIZE];\n} recv_ntb_t;\n\ntypedef struct {\n  tusb_control_request_t header;\n  uint32_t downlink;\n  uint32_t uplink;\n} ncm_notify_t;\n\n#endif\n"
  },
  {
    "path": "src/class/net/ncm_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2024 Hardy Griech\n * Copyright (c) 2020 Jacob Berg Potter\n * Copyright (c) 2020 Peter Lawrence\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/**\n * Small Glossary (from the spec)\n * --------------\n * Datagram - A collection of bytes forming a single item of information, passed as a unit from source to destination.\n * NCM      - Network Control Model\n * NDP      - NCM Datagram Pointer: NTB structure that delineates Datagrams (typically Ethernet frames) within an NTB\n * NTB      - NCM Transfer Block: a data structure for efficient USB encapsulation of one or more datagrams\n *            Each NTB is designed to be a single USB transfer\n * NTH      - NTB Header: a data structure at the front of each NTB, which provides the information needed to validate\n *            the NTB and begin decoding\n *\n * Some explanations\n * -----------------\n * - rhport        is the USB port of the device, in most cases \"0\"\n * - itf_data_alt  if != 0 -> data xmit/recv are allowed (see spec)\n * - ep_in         IN endpoints take data from the device intended to go in to the host (the device transmits)\n * - ep_out        OUT endpoints send data out of the host to the device (the device receives)\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_NCM)\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"ncm.h\"\n#include \"net_device.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUD_NCM_LOG_LEVEL\n  #define CFG_TUD_NCM_LOG_LEVEL   CFG_TUD_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUD_NCM_LOG_LEVEL, __VA_ARGS__)\n\n// Alignment must be 4\n#define TUD_NCM_ALIGNMENT   4\n// calculate alignment of xmit datagrams within an NTB\n#define XMIT_ALIGN_OFFSET(x) ((TUD_NCM_ALIGNMENT - ((x) & (TUD_NCM_ALIGNMENT - 1))) & (TUD_NCM_ALIGNMENT - 1))\n\n//-----------------------------------------------------------------------------\n//\n// Module global things\n//\n#define XMIT_NTB_N CFG_TUD_NCM_IN_NTB_N\n#define RECV_NTB_N CFG_TUD_NCM_OUT_NTB_N\n\ntypedef struct {\n  // general\n  uint8_t ep_in;        // endpoint for outgoing datagrams (naming is a little bit confusing)\n  uint8_t ep_out;       // endpoint for incoming datagrams (naming is a little bit confusing)\n  uint8_t ep_notif;     // endpoint for notifications\n  uint8_t itf_num;      // interface number\n  uint8_t itf_data_alt; // ==0 -> no endpoints, i.e. no network traffic, ==1 -> normal operation with two endpoints (spec, chapter 5.3)\n  uint8_t rhport;       // storage of \\a rhport because some callbacks are done without it\n\n  // recv handling\n  recv_ntb_t *recv_free_ntb[RECV_NTB_N];                // free list of recv NTBs\n  recv_ntb_t *recv_ready_ntb[RECV_NTB_N];               // NTBs waiting for transmission to glue logic (circular buffer)\n  #if RECV_NTB_N > 1\n  uint8_t recv_ready_head;                              // head index for recv_ready_ntb circular buffer\n  uint8_t recv_ready_tail;                              // tail index for recv_ready_ntb circular buffer\n  uint8_t recv_ready_count;                             // number of elements in recv_ready_ntb circular buffer\n  #endif\n  recv_ntb_t *recv_tinyusb_ntb;                         // buffer for the running transfer TinyUSB -> driver\n  recv_ntb_t *recv_glue_ntb;                            // buffer for the running transfer driver -> glue logic\n  uint16_t recv_glue_ntb_datagram_ndx;                  // index into \\a recv_glue_ntb_datagram\n\n  // xmit handling\n  xmit_ntb_t *xmit_free_ntb[XMIT_NTB_N];                // free list of xmit NTBs\n  xmit_ntb_t *xmit_ready_ntb[XMIT_NTB_N];               // NTBs waiting for transmission to TinyUSB (circular buffer)\n  #if XMIT_NTB_N > 1\n  uint8_t xmit_ready_head;                              // head index for xmit_ready_ntb circular buffer\n  uint8_t xmit_ready_tail;                              // tail index for xmit_ready_ntb circular buffer\n  uint8_t xmit_ready_count;                             // number of elements in xmit_ready_ntb circular buffer\n  #endif\n  xmit_ntb_t *xmit_tinyusb_ntb;                         // buffer for the running transfer driver -> TinyUSB\n  xmit_ntb_t *xmit_glue_ntb;                            // buffer for the running transfer glue logic -> driver\n  uint16_t xmit_sequence;                               // NTB sequence counter\n  uint16_t xmit_glue_ntb_datagram_ndx;                  // index into \\a xmit_glue_ntb_datagram\n\n  // notification handling\n  enum {\n    NOTIFICATION_SPEED,\n    NOTIFICATION_CONNECTED,\n    NOTIFICATION_DONE\n  } notification_xmit_state;                            // state of notification transmission\n  bool notification_xmit_is_running;                    // notification is currently transmitted\n  bool link_is_up;                                      // current link state\n\n  // misc\n  bool tud_network_recv_renew_active;                   // tud_network_recv_renew() is active (avoid recursive invocations)\n  bool tud_network_recv_renew_process_again;            // tud_network_recv_renew() should process again\n} ncm_interface_t;\n\ntypedef struct {\n  struct {\n    TUD_EPBUF_TYPE_DEF(recv_ntb_t, ntb);\n  } recv[RECV_NTB_N];\n\n  struct {\n    TUD_EPBUF_TYPE_DEF(xmit_ntb_t, ntb);\n  } xmit[XMIT_NTB_N];\n\n  TUD_EPBUF_TYPE_DEF(ncm_notify_t, epnotif);\n} ncm_epbuf_t;\n\nstatic ncm_interface_t ncm_interface;\nCFG_TUD_MEM_SECTION static ncm_epbuf_t ncm_epbuf;\n\n/**\n * This is the NTB parameter structure\n *\n * \\attention\n *     We are lucky, that byte order is correct\n */\nTU_ATTR_ALIGNED(4) static const ntb_parameters_t ntb_parameters = {\n  .wLength                  = sizeof(ntb_parameters_t),\n  .bmNtbFormatsSupported    = 0x01,// 16-bit NTB supported\n  .dwNtbInMaxSize           = CFG_TUD_NCM_IN_NTB_MAX_SIZE,\n  .wNdbInDivisor            = 1,\n  .wNdbInPayloadRemainder   = 0,\n  .wNdbInAlignment          = TUD_NCM_ALIGNMENT,\n  .wReserved                = 0,\n  .dwNtbOutMaxSize          = CFG_TUD_NCM_OUT_NTB_MAX_SIZE,\n  .wNdbOutDivisor           = 1,\n  .wNdbOutPayloadRemainder  = 0,\n  .wNdbOutAlignment         = TUD_NCM_ALIGNMENT,\n  .wNtbOutMaxDatagrams      = CFG_TUD_NCM_OUT_MAX_DATAGRAMS_PER_NTB,\n};\n\n// Some confusing remarks about wNtbOutMaxDatagrams...\n//      ==1 -> SystemView packets/s goes up to 2000 and events are lost during startup\n//      ==0 -> SystemView runs fine, iperf shows in wireshark a lot of error\n//      ==6 -> SystemView runs fine, iperf also\n//      >6  -> iperf starts to show errors\n//      -> 6 seems to be the best value.  Why?  Don't know, perhaps only on my system?\n//\n//      iperf:    for MSS in 100 200 400 800 1200 1450 1500; do iperf -c 192.168.14.1 -e -i 1 -M $MSS -l 8192 -P 1; sleep 2; done\n//      sysview:  SYSTICKS_PER_SEC=35000, IDLE_US=1000, PRINT_MOD=1000\n//\n\n//-----------------------------------------------------------------------------\n//\n// everything about notifications\n//\n\n/**\n * Transmit next notification to the host (if appropriate).\n * Notifications are transferred to the host once during connection setup.\n */\nstatic void notification_xmit(uint8_t rhport, bool force_next) {\n  TU_LOG_DRV(\"notification_xmit(%d, %d) - %d %d\\n\", force_next, rhport, ncm_interface.notification_xmit_state, ncm_interface.notification_xmit_is_running);\n\n  if (!force_next && ncm_interface.notification_xmit_is_running) {\n    return;\n  }\n\n  if (ncm_interface.notification_xmit_state == NOTIFICATION_SPEED) {\n    TU_LOG_DRV(\"  NOTIFICATION_SPEED\\n\");\n    ncm_notify_t notify_speed_change = {\n      .header = {\n        .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type = TUSB_REQ_TYPE_CLASS,\n          .direction = TUSB_DIR_IN\n        },\n        .bRequest = CDC_NOTIF_CONNECTION_SPEED_CHANGE,\n        .wValue = 0,\n        .wIndex = ncm_interface.itf_num,\n        .wLength = 8\n      }\n    };\n    if (tud_speed_get() == TUSB_SPEED_HIGH) {\n      notify_speed_change.downlink = 480000000;\n      notify_speed_change.uplink = 480000000;\n    } else {\n      notify_speed_change.downlink = 12000000;\n      notify_speed_change.uplink = 12000000;\n    }\n\n    uint16_t notif_len = sizeof(notify_speed_change.header) + notify_speed_change.header.wLength;\n    ncm_epbuf.epnotif = notify_speed_change;\n    usbd_edpt_xfer(rhport, ncm_interface.ep_notif, (uint8_t*) &ncm_epbuf.epnotif, notif_len, false);\n\n    ncm_interface.notification_xmit_state = NOTIFICATION_CONNECTED;\n    ncm_interface.notification_xmit_is_running = true;\n  } else if (ncm_interface.notification_xmit_state == NOTIFICATION_CONNECTED) {\n    TU_LOG_DRV(\"  NOTIFICATION_CONNECTED\\n\");\n    ncm_notify_t notify_connected = {\n      .header = {\n        .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type = TUSB_REQ_TYPE_CLASS,\n          .direction = TUSB_DIR_IN\n        },\n        .bRequest = CDC_NOTIF_NETWORK_CONNECTION,\n        .wValue = ncm_interface.link_is_up ? 1 : 0,  /* Dynamic link state */\n        .wIndex = ncm_interface.itf_num,\n        .wLength = 0,\n      },\n    };\n\n    uint16_t notif_len = sizeof(notify_connected.header) + notify_connected.header.wLength;\n    ncm_epbuf.epnotif = notify_connected;\n    usbd_edpt_xfer(rhport, ncm_interface.ep_notif, (uint8_t *) &ncm_epbuf.epnotif, notif_len, false);\n\n    ncm_interface.notification_xmit_state = NOTIFICATION_DONE;\n    ncm_interface.notification_xmit_is_running = true;\n  } else {\n    TU_LOG_DRV(\"  NOTIFICATION_FINISHED\\n\");\n    ncm_interface.notification_xmit_is_running = false;\n  }\n} // notification_xmit\n\n//-----------------------------------------------------------------------------\n//\n// everything about packet transmission (driver -> TinyUSB)\n//\n\n/**\n * Put NTB into the transmitter free list.\n */\nstatic void xmit_put_ntb_into_free_list(xmit_ntb_t *free_ntb) {\n  TU_LOG_DRV(\"xmit_put_ntb_into_free_list() - %p\\n\", ncm_interface.xmit_tinyusb_ntb);\n\n  if (free_ntb == NULL) { // can happen due to ZLPs\n    return;\n  }\n\n  for (int i = 0; i < XMIT_NTB_N; ++i) {\n    if (ncm_interface.xmit_free_ntb[i] == NULL) {\n      ncm_interface.xmit_free_ntb[i] = free_ntb;\n      return;\n    }\n  }\n  TU_LOG_DRV(\"(EE) xmit_put_ntb_into_free_list - no entry in free list\\n\");// this should not happen\n} // xmit_put_ntb_into_free_list\n\n/**\n * Get an NTB from the free list\n */\nstatic xmit_ntb_t *xmit_get_free_ntb(void) {\n  TU_LOG_DRV(\"xmit_get_free_ntb()\\n\");\n\n  for (int i = 0; i < XMIT_NTB_N; ++i) {\n    if (ncm_interface.xmit_free_ntb[i] != NULL) {\n      xmit_ntb_t *free = ncm_interface.xmit_free_ntb[i];\n      ncm_interface.xmit_free_ntb[i] = NULL;\n      return free;\n    }\n  }\n  return NULL;\n} // xmit_get_free_ntb\n\n/**\n * Put a filled NTB into the ready list\n */\nstatic void xmit_put_ntb_into_ready_list(xmit_ntb_t *ready_ntb) {\n  TU_LOG_DRV(\"xmit_put_ntb_into_ready_list(%p) %d\\n\", ready_ntb, ready_ntb->nth.wBlockLength);\n\n#if XMIT_NTB_N == 1\n  ncm_interface.xmit_ready_ntb[0] = ready_ntb;\n#else\n  if (ncm_interface.xmit_ready_count >= XMIT_NTB_N) {\n    TU_LOG_DRV(\"(EE) xmit_put_ntb_into_ready_list: ready list full\\n\");// this should not happen\n    return;\n  }\n  ncm_interface.xmit_ready_ntb[ncm_interface.xmit_ready_head] = ready_ntb;\n  ncm_interface.xmit_ready_head = (ncm_interface.xmit_ready_head + 1) % XMIT_NTB_N;\n  ncm_interface.xmit_ready_count++;\n#endif\n} // xmit_put_ntb_into_ready_list\n\n/**\n * Get the next NTB from the ready list (and remove it from the list).\n * If the ready list is empty, return NULL.\n */\nstatic xmit_ntb_t *xmit_get_next_ready_ntb(void) {\n#if XMIT_NTB_N == 1\n  xmit_ntb_t *r = ncm_interface.xmit_ready_ntb[0];\n  ncm_interface.xmit_ready_ntb[0] = NULL;\n  TU_LOG_DRV(\"xmit_get_next_ready_ntb: %p\\n\", r);\n  return r;\n#else\n  if (ncm_interface.xmit_ready_count == 0) {\n    return NULL; // empty\n  }\n\n  xmit_ntb_t *r = ncm_interface.xmit_ready_ntb[ncm_interface.xmit_ready_tail];\n  ncm_interface.xmit_ready_tail = (ncm_interface.xmit_ready_tail + 1) % XMIT_NTB_N;\n  ncm_interface.xmit_ready_count--;\n\n  TU_LOG_DRV(\"xmit_get_next_ready_ntb: %p\\n\", r);\n  return r;\n#endif\n} // xmit_get_next_ready_ntb\n\n/**\n * Transmit a ZLP if required\n *\n * \\note\n *    Insertion of the ZLPs is a little bit different then described in the spec.\n *    But the below implementation actually works.  Don't know if this is a spec\n *    or TinyUSB issue.\n *\n * \\pre\n *    This must be called from netd_xfer_cb() so that ep_in is ready\n */\nstatic bool xmit_insert_required_zlp(uint8_t rhport, uint32_t xferred_bytes) {\n  TU_LOG_DRV(\"xmit_insert_required_zlp(%d,%ld)\\n\", rhport, xferred_bytes);\n\n  if (xferred_bytes == 0 || xferred_bytes % CFG_TUD_NET_ENDPOINT_SIZE != 0) {\n    return false;\n  }\n\n  TU_ASSERT(ncm_interface.itf_data_alt == 1, false);\n  TU_ASSERT(!usbd_edpt_busy(rhport, ncm_interface.ep_in), false);\n\n  TU_LOG_DRV(\"xmit_insert_required_zlp! (%u)\\n\", (unsigned) xferred_bytes);\n\n  // start transmission of the ZLP\n  usbd_edpt_xfer(rhport, ncm_interface.ep_in, NULL, 0, false);\n\n  return true;\n} // xmit_insert_required_zlp\n\n/**\n * Start transmission if it there is a waiting packet and if can be done from interface side.\n */\nstatic void xmit_start_if_possible(uint8_t rhport) {\n  TU_LOG_DRV(\"xmit_start_if_possible()\\n\");\n\n  if (ncm_interface.xmit_tinyusb_ntb != NULL) {\n    TU_LOG_DRV(\"  !xmit_start_if_possible 1\\n\");\n    return;\n  }\n  if (ncm_interface.itf_data_alt != 1) {\n    TU_LOG_DRV(\"(EE) !xmit_start_if_possible 2\\n\");\n    return;\n  }\n  if (usbd_edpt_busy(rhport, ncm_interface.ep_in)) {\n    TU_LOG_DRV(\"  !xmit_start_if_possible 3\\n\");\n    return;\n  }\n\n  ncm_interface.xmit_tinyusb_ntb = xmit_get_next_ready_ntb();\n  if (ncm_interface.xmit_tinyusb_ntb == NULL) {\n    if (ncm_interface.xmit_glue_ntb == NULL || ncm_interface.xmit_glue_ntb_datagram_ndx == 0) {\n      // -> really nothing is waiting\n      return;\n    }\n    ncm_interface.xmit_tinyusb_ntb = ncm_interface.xmit_glue_ntb;\n    ncm_interface.xmit_glue_ntb = NULL;\n  }\n\n  #if CFG_TUD_NCM_LOG_LEVEL >= 3\n  {\n    uint16_t len = ncm_interface.xmit_tinyusb_ntb->nth.wBlockLength;\n    TU_LOG_BUF(3, ncm_interface.xmit_tinyusb_ntb->data[i], len);\n  }\n  #endif\n\n  if (ncm_interface.xmit_glue_ntb_datagram_ndx != 1) {\n    TU_LOG_DRV(\">> %d %d\\n\", ncm_interface.xmit_tinyusb_ntb->nth.wBlockLength, ncm_interface.xmit_glue_ntb_datagram_ndx);\n  }\n\n  // Kick off an endpoint transfer\n  usbd_edpt_xfer(0, ncm_interface.ep_in, ncm_interface.xmit_tinyusb_ntb->data, ncm_interface.xmit_tinyusb_ntb->nth.wBlockLength, false);\n} // xmit_start_if_possible\n\n/**\n * check if a new datagram fits into the current NTB\n */\nstatic bool xmit_requested_datagram_fits_into_current_ntb(uint16_t datagram_size) {\n  TU_LOG_DRV(\"xmit_requested_datagram_fits_into_current_ntb(%d) - %p %p\\n\", datagram_size, ncm_interface.xmit_tinyusb_ntb, ncm_interface.xmit_glue_ntb);\n\n  if (ncm_interface.xmit_glue_ntb == NULL) {\n    return false;\n  }\n  if (ncm_interface.xmit_glue_ntb_datagram_ndx >= CFG_TUD_NCM_IN_MAX_DATAGRAMS_PER_NTB) {\n    return false;\n  }\n  if (ncm_interface.xmit_glue_ntb->nth.wBlockLength + datagram_size + XMIT_ALIGN_OFFSET(datagram_size) > CFG_TUD_NCM_IN_NTB_MAX_SIZE) {\n    return false;\n  }\n  return true;\n} // xmit_requested_datagram_fits_into_current_ntb\n\n/**\n * Setup an NTB for the glue logic\n */\nstatic bool xmit_setup_next_glue_ntb(void) {\n  TU_LOG_DRV(\"xmit_setup_next_glue_ntb - %p\\n\", ncm_interface.xmit_glue_ntb);\n\n  if (ncm_interface.xmit_glue_ntb != NULL) {\n    // put NTB into waiting list (the new datagram did not fit in)\n    xmit_put_ntb_into_ready_list(ncm_interface.xmit_glue_ntb);\n  }\n\n  ncm_interface.xmit_glue_ntb = xmit_get_free_ntb();// get next buffer (if any)\n  if (ncm_interface.xmit_glue_ntb == NULL) {\n    TU_LOG_DRV(\"  xmit_setup_next_glue_ntb - nothing free\\n\");// should happen rarely\n    return false;\n  }\n\n  ncm_interface.xmit_glue_ntb_datagram_ndx = 0;\n\n  xmit_ntb_t *ntb = ncm_interface.xmit_glue_ntb;\n\n  // Fill in NTB header\n  ntb->nth.dwSignature = NTH16_SIGNATURE;\n  ntb->nth.wHeaderLength = sizeof(ntb->nth);\n  ntb->nth.wSequence = ncm_interface.xmit_sequence++;\n  ntb->nth.wBlockLength = sizeof(ntb->nth) + sizeof(ntb->ndp) + sizeof(ntb->ndp_datagram);\n  ntb->nth.wNdpIndex = sizeof(ntb->nth);\n\n  // Fill in NDP16 header and terminator\n  ntb->ndp.dwSignature = NDP16_SIGNATURE_NCM0;\n  ntb->ndp.wLength = sizeof(ntb->ndp) + sizeof(ntb->ndp_datagram);\n  ntb->ndp.wNextNdpIndex = 0;\n\n  memset(ntb->ndp_datagram, 0, sizeof(ntb->ndp_datagram));\n  return true;\n} // xmit_setup_next_glue_ntb\n\n//-----------------------------------------------------------------------------\n//\n// all the recv_*() stuff (TinyUSB -> driver -> glue logic)\n//\n\n/**\n * Return pointer to an available receive buffer or NULL.\n * Returned buffer (if any) has the size \\a CFG_TUD_NCM_OUT_NTB_MAX_SIZE.\n */\nstatic recv_ntb_t *recv_get_free_ntb(void) {\n  TU_LOG_DRV(\"recv_get_free_ntb()\\n\");\n\n  for (int i = 0; i < RECV_NTB_N; ++i) {\n    if (ncm_interface.recv_free_ntb[i] != NULL) {\n      recv_ntb_t *free = ncm_interface.recv_free_ntb[i];\n      ncm_interface.recv_free_ntb[i] = NULL;\n      return free;\n    }\n  }\n  return NULL;\n} // recv_get_free_ntb\n\n/**\n * Get the next NTB from the ready list (and remove it from the list).\n * If the ready list is empty, return NULL.\n */\nstatic recv_ntb_t *recv_get_next_ready_ntb(void) {\n#if RECV_NTB_N == 1\n  recv_ntb_t *r = ncm_interface.recv_ready_ntb[0];\n  ncm_interface.recv_ready_ntb[0] = NULL;\n  TU_LOG_DRV(\"recv_get_next_ready_ntb: %p\\n\", r);\n  return r;\n#else\n  if (ncm_interface.recv_ready_count == 0) {\n    return NULL; // empty\n  }\n\n  recv_ntb_t *r = ncm_interface.recv_ready_ntb[ncm_interface.recv_ready_tail];\n  ncm_interface.recv_ready_tail = (ncm_interface.recv_ready_tail + 1) % RECV_NTB_N;\n  ncm_interface.recv_ready_count--;\n\n  TU_LOG_DRV(\"recv_get_next_ready_ntb: %p\\n\", r);\n  return r;\n#endif\n} // recv_get_next_ready_ntb\n\n/**\n * Put NTB into the receiver free list.\n */\nstatic void recv_put_ntb_into_free_list(recv_ntb_t *free_ntb) {\n  TU_LOG_DRV(\"recv_put_ntb_into_free_list(%p)\\n\", free_ntb);\n\n  for (int i = 0; i < RECV_NTB_N; ++i) {\n    if (ncm_interface.recv_free_ntb[i] == NULL) {\n      ncm_interface.recv_free_ntb[i] = free_ntb;\n      return;\n    }\n  }\n  TU_LOG_DRV(\"(EE) recv_put_ntb_into_free_list - no entry in free list\\n\");// this should not happen\n} // recv_put_ntb_into_free_list\n\n/**\n * \\a ready_ntb holds a validated NTB,\n * put this buffer into the waiting list.\n */\nstatic void recv_put_ntb_into_ready_list(recv_ntb_t *ready_ntb) {\n  TU_LOG_DRV(\"recv_put_ntb_into_ready_list(%p) %d\\n\", ready_ntb, ready_ntb->nth.wBlockLength);\n\n#if RECV_NTB_N == 1\n  ncm_interface.recv_ready_ntb[0] = ready_ntb;\n#else\n  if (ncm_interface.recv_ready_count >= RECV_NTB_N) {\n    TU_LOG_DRV(\"(EE) recv_put_ntb_into_ready_list: ready list full\\n\");// this should not happen\n    return;\n  }\n  ncm_interface.recv_ready_ntb[ncm_interface.recv_ready_head] = ready_ntb;\n  ncm_interface.recv_ready_head = (ncm_interface.recv_ready_head + 1) % RECV_NTB_N;\n  ncm_interface.recv_ready_count++;\n#endif\n} // recv_put_ntb_into_ready_list\n\n/**\n * If possible, start a new reception TinyUSB -> driver.\n */\nstatic void recv_try_to_start_new_reception(uint8_t rhport) {\n  TU_LOG_DRV(\"recv_try_to_start_new_reception(%d)\\n\", rhport);\n\n  if (ncm_interface.itf_data_alt != 1) {\n    return;\n  }\n  if (ncm_interface.recv_tinyusb_ntb != NULL) {\n    return;\n  }\n  if (usbd_edpt_busy(rhport, ncm_interface.ep_out)) {\n    return;\n  }\n\n  ncm_interface.recv_tinyusb_ntb = recv_get_free_ntb();\n  if (ncm_interface.recv_tinyusb_ntb == NULL) {\n    return;\n  }\n\n  // initiate transfer\n  TU_LOG_DRV(\"  start reception\\n\");\n  bool r = usbd_edpt_xfer(rhport, ncm_interface.ep_out, ncm_interface.recv_tinyusb_ntb->data, CFG_TUD_NCM_OUT_NTB_MAX_SIZE, false);\n  if (!r) {\n    recv_put_ntb_into_free_list(ncm_interface.recv_tinyusb_ntb);\n    ncm_interface.recv_tinyusb_ntb = NULL;\n  }\n} // recv_try_to_start_new_reception\n\n/**\n * Validate incoming datagram.\n * \\return true if valid\n *\n * \\note\n *    \\a ndp16->wNextNdpIndex != 0 is not supported\n */\nstatic bool recv_validate_datagram(const recv_ntb_t *ntb, uint32_t len) {\n  const nth16_t *nth16 = &(ntb->nth);\n\n  TU_LOG_DRV(\"recv_validate_datagram(%p, %d)\\n\", ntb, (int) len);\n\n  // check header\n  if (nth16->wHeaderLength != sizeof(nth16_t)) {\n    TU_LOG_DRV(\"(EE) ill nth16 length: %d\\n\", nth16->wHeaderLength);\n    return false;\n  }\n  if (nth16->dwSignature != NTH16_SIGNATURE) {\n    TU_LOG_DRV(\"(EE) ill signature: 0x%08x\\n\", (unsigned) nth16->dwSignature);\n    return false;\n  }\n  if (len < sizeof(nth16_t) + sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t)) {\n    TU_LOG_DRV(\"(EE) ill min len: %lu\\n\", len);\n    return false;\n  }\n  if (nth16->wBlockLength > len) {\n    TU_LOG_DRV(\"(EE) ill block length: %d > %lu\\n\", nth16->wBlockLength, len);\n    return false;\n  }\n  if (nth16->wBlockLength > CFG_TUD_NCM_OUT_NTB_MAX_SIZE) {\n    TU_LOG_DRV(\"(EE) ill block length2: %d > %d\\n\", nth16->wBlockLength, CFG_TUD_NCM_OUT_NTB_MAX_SIZE);\n    return false;\n  }\n  if (nth16->wNdpIndex < sizeof(nth16) || nth16->wNdpIndex > len - (sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t))) {\n    TU_LOG_DRV(\"(EE) ill position of first ndp: %d (%lu)\\n\", nth16->wNdpIndex, len);\n    return false;\n  }\n\n  // check (first) NDP(16)\n  const ndp16_t *ndp16 = (const ndp16_t *) (ntb->data + nth16->wNdpIndex);\n\n  if (ndp16->wLength < sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t)) {\n    TU_LOG_DRV(\"(EE) ill ndp16 length: %d\\n\", ndp16->wLength);\n    return false;\n  }\n  if (ndp16->dwSignature != NDP16_SIGNATURE_NCM0 && ndp16->dwSignature != NDP16_SIGNATURE_NCM1) {\n    TU_LOG_DRV(\"(EE) ill signature: 0x%08x\\n\", (unsigned) ndp16->dwSignature);\n    return false;\n  }\n  if (ndp16->wNextNdpIndex != 0) {\n    TU_LOG_DRV(\"(EE) cannot handle wNextNdpIndex!=0 (%d)\\n\", ndp16->wNextNdpIndex);\n    return false;\n  }\n\n  const ndp16_datagram_t *ndp16_datagram = (const ndp16_datagram_t *) (ntb->data + nth16->wNdpIndex + sizeof(ndp16_t));\n  int ndx = 0;\n  uint16_t max_ndx = (uint16_t) ((ndp16->wLength - sizeof(ndp16_t)) / sizeof(ndp16_datagram_t));\n\n  if (max_ndx > 2) { // number of datagrams in NTB > 1\n    TU_LOG_DRV(\"<< %d (%d)\\n\", max_ndx - 1, ntb->nth.wBlockLength);\n  }\n  if (ndp16_datagram[max_ndx - 1].wDatagramIndex != 0 || ndp16_datagram[max_ndx - 1].wDatagramLength != 0) {\n    TU_LOG_DRV(\"  max_ndx != 0\\n\");\n    return false;\n  }\n  while (ndp16_datagram[ndx].wDatagramIndex != 0 && ndp16_datagram[ndx].wDatagramLength != 0) {\n    TU_LOG_DRV(\"  << %d %d\\n\", ndp16_datagram[ndx].wDatagramIndex, ndp16_datagram[ndx].wDatagramLength);\n    if (ndp16_datagram[ndx].wDatagramIndex > len) {\n      TU_LOG_DRV(\"(EE) ill start of datagram[%d]: %d (%lu)\\n\", ndx, ndp16_datagram[ndx].wDatagramIndex, len);\n      return false;\n    }\n    if (ndp16_datagram[ndx].wDatagramIndex + ndp16_datagram[ndx].wDatagramLength > len) {\n      TU_LOG_DRV(\"(EE) ill end of datagram[%d]: %d (%lu)\\n\", ndx, ndp16_datagram[ndx].wDatagramIndex + ndp16_datagram[ndx].wDatagramLength, len);\n      return false;\n    }\n    ++ndx;\n  }\n\n  #if CFG_TUD_NCM_LOG_LEVEL >= 3\n  TU_LOG_BUF(3, ntb->data[i], len);\n  #endif\n\n  // -> ntb contains a valid packet structure\n  //    ok... I did not check for garbage within the datagram indices...\n  return true;\n} // recv_validate_datagram\n\n/**\n * Transfer the next (pending) datagram to the glue logic and return receive buffer if empty.\n */\nstatic void recv_transfer_datagram_to_glue_logic(void) {\n  TU_LOG_DRV(\"recv_transfer_datagram_to_glue_logic()\\n\");\n\n  if (ncm_interface.recv_glue_ntb == NULL) {\n    ncm_interface.recv_glue_ntb = recv_get_next_ready_ntb();\n    TU_LOG_DRV(\"  new buffer for glue logic: %p\\n\", ncm_interface.recv_glue_ntb);\n    ncm_interface.recv_glue_ntb_datagram_ndx = 0;\n  }\n\n  if (ncm_interface.recv_glue_ntb != NULL) {\n    const ndp16_datagram_t *ndp16_datagram = (ndp16_datagram_t *) (ncm_interface.recv_glue_ntb->data + ncm_interface.recv_glue_ntb->nth.wNdpIndex + sizeof(ndp16_t));\n\n    if (ndp16_datagram[ncm_interface.recv_glue_ntb_datagram_ndx].wDatagramIndex == 0) {\n      TU_LOG_DRV(\"(EE) SOMETHING WENT WRONG 1\\n\");\n    } else if (ndp16_datagram[ncm_interface.recv_glue_ntb_datagram_ndx].wDatagramLength == 0) {\n      TU_LOG_DRV(\"(EE) SOMETHING WENT WRONG 2\\n\");\n    } else {\n      uint16_t datagramIndex = ndp16_datagram[ncm_interface.recv_glue_ntb_datagram_ndx].wDatagramIndex;\n      uint16_t datagramLength = ndp16_datagram[ncm_interface.recv_glue_ntb_datagram_ndx].wDatagramLength;\n\n      TU_LOG_DRV(\"  recv[%d] - %d %d\\n\", ncm_interface.recv_glue_ntb_datagram_ndx, datagramIndex, datagramLength);\n      if (tud_network_recv_cb(ncm_interface.recv_glue_ntb->data + datagramIndex, datagramLength)) {\n        // send datagram successfully to glue logic\n        TU_LOG_DRV(\"    OK\\n\");\n        datagramIndex = ndp16_datagram[ncm_interface.recv_glue_ntb_datagram_ndx + 1].wDatagramIndex;\n        datagramLength = ndp16_datagram[ncm_interface.recv_glue_ntb_datagram_ndx + 1].wDatagramLength;\n\n        if (datagramIndex != 0 && datagramLength != 0) {\n          // -> next datagram\n          ++ncm_interface.recv_glue_ntb_datagram_ndx;\n        } else {\n          // end of datagrams reached\n          recv_put_ntb_into_free_list(ncm_interface.recv_glue_ntb);\n          ncm_interface.recv_glue_ntb = NULL;\n        }\n      }\n    }\n  }\n} // recv_transfer_datagram_to_glue_logic\n\n//-----------------------------------------------------------------------------\n//\n// all the tud_network_*() stuff (glue logic -> driver)\n//\n\n/**\n * Check if the glue logic is allowed to call tud_network_xmit().\n * This function also fetches a next buffer if required, so that tud_network_xmit() is ready for copy\n * and transmission operation.\n */\nbool tud_network_can_xmit(uint16_t size) {\n  TU_LOG_DRV(\"tud_network_can_xmit(%d)\\n\", size);\n\n  TU_ASSERT(size <= CFG_TUD_NCM_IN_NTB_MAX_SIZE - (sizeof(nth16_t) + sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t)), false);\n\n  if (xmit_requested_datagram_fits_into_current_ntb(size) || xmit_setup_next_glue_ntb()) {\n    // -> everything is fine\n    return true;\n  }\n  xmit_start_if_possible(ncm_interface.rhport);\n  TU_LOG_DRV(\"(II) tud_network_can_xmit: request blocked\\n\");// could happen if all xmit buffers are full (but should happen rarely)\n  return false;\n} // tud_network_can_xmit\n\n/**\n * Put a datagram into a waiting NTB.\n * If currently no transmission is started, then initiate transmission.\n */\nvoid tud_network_xmit(void *ref, uint16_t arg) {\n  TU_LOG_DRV(\"tud_network_xmit(%p, %d)\\n\", ref, arg);\n\n  if (ncm_interface.xmit_glue_ntb == NULL) {\n    TU_LOG_DRV(\"(EE) tud_network_xmit: no buffer\\n\");// must not happen (really)\n    return;\n  }\n\n  xmit_ntb_t *ntb = ncm_interface.xmit_glue_ntb;\n\n  // copy new datagram to the end of the current NTB\n  uint16_t size = tud_network_xmit_cb(ntb->data + ntb->nth.wBlockLength, ref, arg);\n\n  // correct NTB internals\n  ntb->ndp_datagram[ncm_interface.xmit_glue_ntb_datagram_ndx].wDatagramIndex = ntb->nth.wBlockLength;\n  ntb->ndp_datagram[ncm_interface.xmit_glue_ntb_datagram_ndx].wDatagramLength = size;\n  ncm_interface.xmit_glue_ntb_datagram_ndx += 1;\n\n  ntb->nth.wBlockLength += (uint16_t) (size + XMIT_ALIGN_OFFSET(size));\n\n  if (ntb->nth.wBlockLength > CFG_TUD_NCM_IN_NTB_MAX_SIZE) {\n    TU_LOG_DRV(\"(EE) tud_network_xmit: buffer overflow\\n\"); // must not happen (really)\n    return;\n  }\n\n  xmit_start_if_possible(ncm_interface.rhport);\n} // tud_network_xmit\n\n/**\n * Keep the receive logic busy and transfer pending packets to the glue logic.\n * Avoid recursive calls due to wrong expectations of the net glue logic,\n * see https://github.com/hathach/tinyusb/issues/2711\n */\nvoid tud_network_recv_renew(void) {\n  TU_LOG_DRV(\"tud_network_recv_renew()\\n\");\n\n  ncm_interface.tud_network_recv_renew_process_again = true;\n\n  if (ncm_interface.tud_network_recv_renew_active) {\n    TU_LOG_DRV(\"Re-entrant into tud_network_recv_renew, will process later\\n\");\n    return;\n  }\n\n  while (ncm_interface.tud_network_recv_renew_process_again) {\n    ncm_interface.tud_network_recv_renew_process_again = false;\n\n    // If the current function is called within recv_transfer_datagram_to_glue_logic,\n    // tud_network_recv_renew_process_again will become true, and the loop will run again\n    // Otherwise the loop will not run again\n    ncm_interface.tud_network_recv_renew_active = true;\n    recv_transfer_datagram_to_glue_logic();\n    ncm_interface.tud_network_recv_renew_active = false;\n  }\n  recv_try_to_start_new_reception(ncm_interface.rhport);\n} // tud_network_recv_renew\n\n/**\n * Same as tud_network_recv_renew() but knows \\a rhport\n */\nstatic void tud_network_recv_renew_r(uint8_t rhport) {\n  TU_LOG_DRV(\"tud_network_recv_renew_r(%d)\\n\", rhport);\n\n  ncm_interface.rhport = rhport;\n  tud_network_recv_renew();\n} // tud_network_recv_renew\n\n/**\n * Set the link state and send notification to host\n */\nvoid tud_network_link_state(uint8_t rhport, bool is_up) {\n  TU_LOG_DRV(\"tud_network_link_state(%d, %d)\\n\", rhport, is_up);\n\n  if (ncm_interface.link_is_up == is_up) {\n    // No change in link state\n    return;\n  }\n\n  ncm_interface.link_is_up = is_up;\n\n  // Only send notification if we have an active data interface\n  if (ncm_interface.itf_data_alt != 1) {\n    TU_LOG_DRV(\"  link state notification skipped (interface not active)\\n\");\n    return;\n  }\n\n  // Reset notification state to send speed change notification first, then link state notification\n  ncm_interface.notification_xmit_state = NOTIFICATION_SPEED;\n\n  // Trigger notification transmission\n  notification_xmit(rhport, false);\n}\n\n//-----------------------------------------------------------------------------\n//\n// all the netd_*() stuff (interface TinyUSB -> driver)\n//\n/**\n * Initialize the driver data structures.\n * Might be called several times.\n */\nvoid netd_init(void) {\n  TU_LOG_DRV(\"netd_init()\\n\");\n\n  memset(&ncm_interface, 0, sizeof(ncm_interface));\n\n  for (int i = 0; i < XMIT_NTB_N; ++i) {\n    ncm_interface.xmit_free_ntb[i] = &ncm_epbuf.xmit[i].ntb;\n  }\n  for (int i = 0; i < RECV_NTB_N; ++i) {\n    ncm_interface.recv_free_ntb[i] = &ncm_epbuf.recv[i].ntb;\n  }\n  // Default link state - can be configured via CFG_TUD_NCM_DEFAULT_LINK_UP\n  #ifdef CFG_TUD_NCM_DEFAULT_LINK_UP\n  ncm_interface.link_is_up = CFG_TUD_NCM_DEFAULT_LINK_UP;\n  #else\n  ncm_interface.link_is_up = true; // Default to link up if not set.\n  #endif\n} // netd_init\n\n/**\n * Deinit driver\n */\nbool netd_deinit(void) {\n  return true;\n}\n\n/**\n * Resets the port.\n * In this driver this is the same as netd_init()\n */\nvoid netd_reset(uint8_t rhport) {\n  (void) rhport;\n\n  netd_init();\n} // netd_reset\n\n/**\n * Open the USB interface.\n * - parse the USB descriptor \\a TUD_CDC_NCM_DESCRIPTOR for itfnum and endpoints\n * - a specific order of elements in the descriptor is tested.\n *\n * \\note\n *   Actually all of the information could be read directly from \\a itf_desc, because the\n *   structure and the values are well known.  But we do it this way.\n *\n * \\post\n * - \\a itf_num set\n * - \\a ep_notif, \\a ep_in and \\a ep_out are set\n * - USB interface is open\n */\nuint16_t netd_open(uint8_t rhport, tusb_desc_interface_t const *itf_desc, uint16_t max_len) {\n  TU_ASSERT(ncm_interface.ep_notif == 0, 0);// assure that the interface is only opened once\n\n  ncm_interface.itf_num = itf_desc->bInterfaceNumber;// management interface\n\n  // skip the two first entries and the following TUSB_DESC_CS_INTERFACE entries\n  uint16_t drv_len = sizeof(tusb_desc_interface_t);\n  uint8_t const *p_desc = tu_desc_next(itf_desc);\n  while (tu_desc_type(p_desc) == TUSB_DESC_CS_INTERFACE && drv_len <= max_len) {\n    drv_len += tu_desc_len(p_desc);\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  // get notification endpoint\n  TU_ASSERT(tu_desc_type(p_desc) == TUSB_DESC_ENDPOINT, 0);\n  TU_ASSERT(usbd_edpt_open(rhport, (tusb_desc_endpoint_t const *) p_desc), 0);\n  ncm_interface.ep_notif = ((tusb_desc_endpoint_t const *) p_desc)->bEndpointAddress;\n  drv_len += tu_desc_len(p_desc);\n  p_desc = tu_desc_next(p_desc);\n\n  // skip the following TUSB_DESC_INTERFACE entries (which must be TUSB_CLASS_CDC_DATA)\n  while (tu_desc_type(p_desc) == TUSB_DESC_INTERFACE && drv_len <= max_len) {\n    tusb_desc_interface_t const *data_itf_desc = (tusb_desc_interface_t const *) p_desc;\n    TU_ASSERT(data_itf_desc->bInterfaceClass == TUSB_CLASS_CDC_DATA, 0);\n\n    drv_len += tu_desc_len(p_desc);\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  // a TUSB_DESC_ENDPOINT (actually two) must follow, open these endpoints\n  TU_ASSERT(tu_desc_type(p_desc) == TUSB_DESC_ENDPOINT, 0);\n  TU_ASSERT(usbd_open_edpt_pair(rhport, p_desc, 2, TUSB_XFER_BULK, &ncm_interface.ep_out, &ncm_interface.ep_in));\n  drv_len += 2 * sizeof(tusb_desc_endpoint_t);\n\n  return drv_len;\n} // netd_open\n\n/**\n * Handle TinyUSB requests to process transfer events.\n */\nbool netd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void) result;\n\n  if (ep_addr == ncm_interface.ep_out) {\n    // new NTB received\n    // - make the NTB valid\n    // - if ready transfer datagrams to the glue logic for further processing\n    // - if there is a free receive buffer, initiate reception\n    if (!recv_validate_datagram(ncm_interface.recv_tinyusb_ntb, xferred_bytes)) {\n      // verification failed: ignore NTB and return it to free\n      TU_LOG_DRV(\"Invalid datatagram. Ignoring NTB\\n\");\n      recv_put_ntb_into_free_list(ncm_interface.recv_tinyusb_ntb);\n    } else {\n      // packet ok -> put it into ready list\n      recv_put_ntb_into_ready_list(ncm_interface.recv_tinyusb_ntb);\n    }\n    ncm_interface.recv_tinyusb_ntb = NULL;\n    tud_network_recv_renew_r(rhport);\n  } else if (ep_addr == ncm_interface.ep_in) {\n    // transmission of an NTB finished\n    // - free the transmitted NTB buffer\n    // - insert ZLPs when necessary\n    // - if there is another transmit NTB waiting, try to start transmission\n    xmit_put_ntb_into_free_list(ncm_interface.xmit_tinyusb_ntb);\n    ncm_interface.xmit_tinyusb_ntb = NULL;\n    if (!xmit_insert_required_zlp(rhport, xferred_bytes)) {\n      xmit_start_if_possible(rhport);\n    }\n  } else if (ep_addr == ncm_interface.ep_notif) {\n    // next transfer on notification channel\n    notification_xmit(rhport, true);\n  }\n\n  return true;\n} // netd_xfer_cb\n\n/**\n * Respond to TinyUSB control requests.\n * At startup transmission of notification packets are done here.\n */\nbool netd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request) {\n  if (stage != CONTROL_STAGE_SETUP) {\n    return true;\n  }\n\n  switch (request->bmRequestType_bit.type) {\n    case TUSB_REQ_TYPE_STANDARD:\n\n      switch (request->bRequest) {\n        case TUSB_REQ_GET_INTERFACE: {\n          TU_VERIFY(ncm_interface.itf_num + 1 == request->wIndex, false);\n\n          tud_control_xfer(rhport, request, &ncm_interface.itf_data_alt, 1);\n        } break;\n\n        case TUSB_REQ_SET_INTERFACE: {\n          TU_VERIFY(ncm_interface.itf_num + 1 == request->wIndex && request->wValue < 2, false);\n\n          ncm_interface.itf_data_alt = (uint8_t) request->wValue;\n\n          if (ncm_interface.itf_data_alt == 1) {\n            tud_network_recv_renew_r(rhport);\n            notification_xmit(rhport, false);\n          } else {\n            // Reset notification state to send link state update when interface is re-activated\n            ncm_interface.notification_xmit_state = NOTIFICATION_SPEED;\n          }\n          tud_control_status(rhport, request);\n        } break;\n\n        // unsupported request\n        default:\n          return false;\n      }\n      break;\n\n    case TUSB_REQ_TYPE_CLASS:\n      TU_VERIFY(ncm_interface.itf_num == request->wIndex, false);\n      switch (request->bRequest) {\n        case NCM_GET_NTB_PARAMETERS: {\n          // transfer NTB parameters to host.\n          tud_control_xfer(rhport, request, (void *) (uintptr_t) &ntb_parameters, sizeof(ntb_parameters));\n        } break;\n\n          // unsupported request\n        default:\n          return false;\n      }\n      break;\n      // unsupported request\n    default:\n      return false;\n  }\n\n  return true;\n} // netd_control_xfer_cb\n\n#endif // ( CFG_TUD_ENABLED && CFG_TUD_NCM )\n"
  },
  {
    "path": "src/class/net/net_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Peter Lawrence\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_NET_DEVICE_H_\n#define TUSB_NET_DEVICE_H_\n\n#include <stdint.h>\n#include \"class/cdc/cdc.h\"\n\n#if CFG_TUD_ECM_RNDIS && CFG_TUD_NCM\n#error \"Cannot enable both ECM_RNDIS and NCM network drivers\"\n#endif\n\n/* declared here, NOT in usb_descriptors.c, so that the driver can intelligently ZLP as needed */\n#define CFG_TUD_NET_ENDPOINT_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n/* Maximum Transmission Unit (in bytes) of the network, including Ethernet header */\n#ifndef CFG_TUD_NET_MTU\n#define CFG_TUD_NET_MTU           1514\n#endif\n\n\n// Table 4.3 Data Class Interface Protocol Codes\ntypedef enum\n{\n  NCM_DATA_PROTOCOL_NETWORK_TRANSFER_BLOCK = 0x01\n} ncm_data_interface_protocol_code_t;\n\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Implemented by Application\n//--------------------------------------------------------------------+\n#if CFG_TUD_ECM_RNDIS\nextern void rndis_class_set_handler(uint8_t *data, int size);\n#endif\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// indicate to network driver that client has finished with the packet provided to network_recv_cb()\nvoid tud_network_recv_renew(void);\n\n// poll network driver for its ability to accept another packet to transmit\nbool tud_network_can_xmit(uint16_t size);\n\n// if network_can_xmit() returns true, network_xmit() can be called once\nvoid tud_network_xmit(void *ref, uint16_t arg);\n\n//--------------------------------------------------------------------+\n// Application Callbacks (WEAK is optional)\n//--------------------------------------------------------------------+\n\n// client must provide this: return false if the packet buffer was not accepted\nbool tud_network_recv_cb(const uint8_t *src, uint16_t size);\n\n// client must provide this: copy from network stack packet pointer to dst\nuint16_t tud_network_xmit_cb(uint8_t *dst, void *ref, uint16_t arg);\n\n//------------- ECM/RNDIS -------------//\n\n// client must provide this: initialize any network state back to the beginning\nvoid tud_network_init_cb(void);\n\n// client must provide this: 48-bit MAC address\n// TODO removed later since it is not part of tinyusb stack\nextern uint8_t tud_network_mac_address[6];\n\n//------------- NCM -------------//\n\n// Set the network link state (up/down) and notify the host\nvoid tud_network_link_state(uint8_t rhport, bool is_up);\n\n//--------------------------------------------------------------------+\n// INTERNAL USBD-CLASS DRIVER API\n//--------------------------------------------------------------------+\nvoid     netd_init            (void);\nbool     netd_deinit          (void);\nvoid     netd_reset           (uint8_t rhport);\nuint16_t netd_open            (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     netd_control_xfer_cb (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\nbool     netd_xfer_cb         (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\nvoid     netd_report          (uint8_t *buf, uint16_t len);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_NET_DEVICE_H_ */\n"
  },
  {
    "path": "src/class/printer/printer.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2026 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_PRINTER_H_\n#define TUSB_PRINTER_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/// Printer Class Specific Control Request\ntypedef enum {\n  TUSB_PRINTER_REQUEST_GET_DEVICE_ID   = 0x00, ///< Get device ID\n  TUSB_PRINTER_REQUEST_GET_PORT_STATUS = 0x01, ///< Get port status\n  TUSB_PRINTER_REQUEST_SOFT_RESET      = 0x02, ///< Soft reset\n} tusb_printer_request_type_t;\n\n/// Printer Port Status (returned by GET_PORT_STATUS request)\n/// USB Printer Class spec 1.1, Section 4.2\ntypedef union TU_ATTR_PACKED {\n  uint8_t status;\n  struct TU_ATTR_PACKED {\n    uint8_t reserved0   : 3; ///< Reserved (bits 0-2)\n    uint8_t not_error   : 1; ///< 1 = no error, 0 = error\n    uint8_t selected    : 1; ///< 1 = selected (online), 0 = not selected\n    uint8_t paper_empty : 1; ///< 1 = paper empty, 0 = paper not empty\n    uint8_t reserved6   : 2; ///< Reserved (bits 6-7)\n  } status_bm;\n} tusb_printer_port_status_t;\n\nTU_VERIFY_STATIC(sizeof(tusb_printer_port_status_t) == 1, \"size is not correct\");\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/class/printer/printer_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2026 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_PRINTER)\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"printer_device.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\ntypedef struct {\n  uint8_t itf_num;\n\n  /*------------- From this point, data is not cleared by bus reset -------------*/\n\n  tu_edpt_stream_t rx_stream;\n  tu_edpt_stream_t tx_stream;\n\n  uint8_t rx_ff_buf[CFG_TUD_PRINTER_RX_BUFSIZE];\n  uint8_t tx_ff_buf[CFG_TUD_PRINTER_TX_BUFSIZE];\n} printer_interface_t;\n\n#define ITF_MEM_RESET_SIZE offsetof(printer_interface_t, rx_stream)\n\n#if CFG_TUD_EDPT_DEDICATED_HWFIFO == 0\ntypedef struct {\n  TUD_EPBUF_DEF(epout, CFG_TUD_PRINTER_RX_EPSIZE);\n  TUD_EPBUF_DEF(epin, CFG_TUD_PRINTER_TX_EPSIZE);\n} printer_epbuf_t;\n\nCFG_TUD_MEM_SECTION static printer_epbuf_t _printer_epbuf[CFG_TUD_PRINTER];\n#endif\n\nstatic printer_interface_t _printer_itf[CFG_TUD_PRINTER];\n\n//--------------------------------------------------------------------+\n// INTERNAL HELPERS\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t _find_itf(uint8_t ep_addr) {\n  for (uint8_t i = 0; i < CFG_TUD_PRINTER; i++) {\n    const printer_interface_t *p = &_printer_itf[i];\n    if (ep_addr == p->rx_stream.ep_addr || ep_addr == p->tx_stream.ep_addr) {\n      return i;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_printer_rx_cb(uint8_t itf) {\n  (void)itf;\n}\n\nTU_ATTR_WEAK void tud_printer_tx_complete_cb(uint8_t itf) {\n  (void)itf;\n}\n\nTU_ATTR_WEAK void tud_printer_request_complete_cb(uint8_t itf, tusb_control_request_t const *request) {\n  (void)itf;\n  (void)request;\n}\n\nTU_ATTR_WEAK uint8_t const *tud_printer_get_device_id_cb(uint8_t itf) {\n  (void)itf;\n  return NULL;\n}\n\nTU_ATTR_WEAK uint8_t tud_printer_get_port_status_cb(uint8_t itf) {\n  (void)itf;\n  return 0x18; // not error, selected, paper not empty\n}\n\nTU_ATTR_WEAK void tud_printer_soft_reset_cb(uint8_t itf) {\n  (void)itf;\n}\n\n//--------------------------------------------------------------------+\n// READ API\n//--------------------------------------------------------------------+\nuint32_t tud_printer_n_read_available(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_PRINTER, 0);\n  return tu_edpt_stream_read_available(&_printer_itf[itf].rx_stream);\n}\n\nuint32_t tud_printer_n_read(uint8_t itf, void *buffer, uint32_t bufsize) {\n  TU_VERIFY(itf < CFG_TUD_PRINTER, 0);\n  return tu_edpt_stream_read(&_printer_itf[itf].rx_stream, buffer, bufsize);\n}\n\nbool tud_printer_n_peek(uint8_t itf, uint8_t *chr) {\n  TU_VERIFY(itf < CFG_TUD_PRINTER);\n  return tu_edpt_stream_peek(&_printer_itf[itf].rx_stream, chr);\n}\n\nvoid tud_printer_n_read_flush(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_PRINTER, );\n  printer_interface_t *p = &_printer_itf[itf];\n  tu_edpt_stream_clear(&p->rx_stream);\n  tu_edpt_stream_read_xfer(&p->rx_stream);\n}\n\n//--------------------------------------------------------------------+\n// WRITE API\n//--------------------------------------------------------------------+\nuint32_t tud_printer_n_write(uint8_t itf, const void *buffer, uint32_t bufsize) {\n  TU_VERIFY(itf < CFG_TUD_PRINTER, 0);\n  return tu_edpt_stream_write(&_printer_itf[itf].tx_stream, buffer, bufsize);\n}\n\nuint32_t tud_printer_n_write_flush(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_PRINTER, 0);\n  return tu_edpt_stream_write_xfer(&_printer_itf[itf].tx_stream);\n}\n\nuint32_t tud_printer_n_write_available(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_PRINTER, 0);\n  return tu_edpt_stream_write_available(&_printer_itf[itf].tx_stream);\n}\n\nbool tud_printer_n_write_clear(uint8_t itf) {\n  TU_VERIFY(itf < CFG_TUD_PRINTER);\n  tu_edpt_stream_clear(&_printer_itf[itf].tx_stream);\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// USBD-CLASS API\n//--------------------------------------------------------------------+\nvoid printerd_init(void) {\n  tu_memclr(_printer_itf, sizeof(_printer_itf));\n\n  for (uint8_t i = 0; i < CFG_TUD_PRINTER; i++) {\n    printer_interface_t *p = &_printer_itf[i];\n\n  #if CFG_TUD_EDPT_DEDICATED_HWFIFO\n    uint8_t *epout_buf = NULL;\n    uint8_t *epin_buf  = NULL;\n  #else\n    uint8_t *epout_buf = _printer_epbuf[i].epout;\n    uint8_t *epin_buf  = _printer_epbuf[i].epin;\n  #endif\n\n    tu_edpt_stream_init(&p->rx_stream, false, false, false,\n                        p->rx_ff_buf, CFG_TUD_PRINTER_RX_BUFSIZE, epout_buf);\n\n    tu_edpt_stream_init(&p->tx_stream, false, true, true,\n                        p->tx_ff_buf, CFG_TUD_PRINTER_TX_BUFSIZE, epin_buf);\n  }\n}\n\nbool printerd_deinit(void) {\n  for (uint8_t i = 0; i < CFG_TUD_PRINTER; i++) {\n    printer_interface_t *p = &_printer_itf[i];\n    tu_edpt_stream_deinit(&p->rx_stream);\n    tu_edpt_stream_deinit(&p->tx_stream);\n  }\n  return true;\n}\n\nvoid printerd_reset(uint8_t rhport) {\n  (void)rhport;\n\n  for (uint8_t i = 0; i < CFG_TUD_PRINTER; i++) {\n    printer_interface_t *p = &_printer_itf[i];\n    tu_memclr(p, ITF_MEM_RESET_SIZE);\n    tu_edpt_stream_close(&p->rx_stream);\n    tu_edpt_stream_close(&p->tx_stream);\n  }\n}\n\nuint16_t printerd_open(uint8_t rhport, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {\n  TU_VERIFY(TUSB_CLASS_PRINTER == itf_desc->bInterfaceClass, 0);\n\n  // Find available interface slot\n  uint8_t const printer_id = _find_itf(0);\n  TU_ASSERT(printer_id < CFG_TUD_PRINTER, 0);\n  printer_interface_t *p = &_printer_itf[printer_id];\n\n  p->itf_num = itf_desc->bInterfaceNumber;\n\n  //------------- Endpoints -------------//\n  const uint8_t *p_desc   = (const uint8_t *)itf_desc;\n  const uint8_t *desc_end = p_desc + max_len;\n  uint16_t drv_len = sizeof(tusb_desc_interface_t);\n\n  p_desc = tu_desc_next(itf_desc);\n  for (uint8_t e = 0; e < itf_desc->bNumEndpoints; e++) {\n    TU_VERIFY(tu_desc_in_bounds(p_desc, desc_end), 0);\n    const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)p_desc;\n    TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && TUSB_XFER_BULK == desc_ep->bmAttributes.xfer, 0);\n\n    TU_ASSERT(usbd_edpt_open(rhport, desc_ep), 0);\n\n    if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN) {\n      tu_edpt_stream_t *stream_tx = &p->tx_stream;\n      tu_edpt_stream_open(stream_tx, rhport, desc_ep, CFG_TUD_PRINTER_TX_EPSIZE);\n      tu_edpt_stream_clear(stream_tx);\n    } else {\n      tu_edpt_stream_t *stream_rx = &p->rx_stream;\n      tu_edpt_stream_open(stream_rx, rhport, desc_ep, tu_edpt_packet_size(desc_ep));\n      tu_edpt_stream_clear(stream_rx);\n      TU_ASSERT(tu_edpt_stream_read_xfer(stream_rx) > 0, 0);\n    }\n\n    drv_len += sizeof(tusb_desc_endpoint_t);\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  return drv_len;\n}\n\nbool printerd_control_xfer_cb(uint8_t rhport, uint8_t stage, const tusb_control_request_t *request) {\n  TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE &&\n    request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);\n\n  // GET_DEVICE_ID: wIndex = (interface_number << 8) | alt_setting\n  // GET_PORT_STATUS / SOFT_RESET: wIndex = interface_number\n  uint8_t itf_num;\n  if (TUSB_PRINTER_REQUEST_GET_DEVICE_ID == request->bRequest) {\n    itf_num = tu_u16_high(request->wIndex);\n  } else {\n    itf_num = tu_u16_low(request->wIndex);\n  }\n\n  // Find the printer instance index from the USB interface number\n  uint8_t itf = TUSB_INDEX_INVALID_8;\n  for (uint8_t i = 0; i < CFG_TUD_PRINTER; i++) {\n    if (_printer_itf[i].itf_num == itf_num) {\n      itf = i;\n      break;\n    }\n  }\n  TU_VERIFY(itf < CFG_TUD_PRINTER);\n\n  // https://www.usb.org/sites/default/files/usbprint11a021811.pdf\n  if (stage == CONTROL_STAGE_SETUP) {\n    switch (request->bRequest) {\n      case TUSB_PRINTER_REQUEST_GET_DEVICE_ID: {\n        const uint8_t *device_id = tud_printer_get_device_id_cb(itf);\n        TU_VERIFY(device_id);\n        const uint16_t total_len = (uint16_t)((device_id[0] << 8) | device_id[1]);\n        return tud_control_xfer(rhport, request, (void *)(uintptr_t)device_id, total_len);\n      }\n\n      case TUSB_PRINTER_REQUEST_GET_PORT_STATUS: {\n        static uint8_t port_status;\n        port_status = tud_printer_get_port_status_cb(itf);\n        return tud_control_xfer(rhport, request, &port_status, sizeof(port_status));\n      }\n\n      case TUSB_PRINTER_REQUEST_SOFT_RESET:\n        tud_printer_soft_reset_cb(itf);\n        tud_control_status(rhport, request);\n        return true;\n\n      default:\n        return false;\n    }\n  } else if (stage == CONTROL_STAGE_ACK) {\n    tud_printer_request_complete_cb(itf, request);\n  }\n\n  return true;\n}\n\nbool printerd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void)rhport;\n  (void)result;\n\n  uint8_t const itf = _find_itf(ep_addr);\n  TU_ASSERT(itf < CFG_TUD_PRINTER);\n  printer_interface_t *p = &_printer_itf[itf];\n\n  // Received new data\n  if (ep_addr == p->rx_stream.ep_addr) {\n    tu_edpt_stream_read_xfer_complete(&p->rx_stream, xferred_bytes);\n\n    if (!tu_edpt_stream_empty(&p->rx_stream)) {\n      tud_printer_rx_cb(itf);\n    }\n\n    tu_edpt_stream_read_xfer(&p->rx_stream);\n  }\n\n  // Data sent to host\n  if (ep_addr == p->tx_stream.ep_addr) {\n    tud_printer_tx_complete_cb(itf);\n\n    if (0 == tu_edpt_stream_write_xfer(&p->tx_stream)) {\n      tu_edpt_stream_write_zlp_if_needed(&p->tx_stream, xferred_bytes);\n    }\n  }\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/printer/printer_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2026 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_PRINTER_DEVICE_H_\n#define TUSB_PRINTER_DEVICE_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"printer.h\"\n\n//--------------------------------------------------------------------+\n// Configuration\n//--------------------------------------------------------------------+\n#ifndef CFG_TUD_PRINTER_RX_EPSIZE\n  #define CFG_TUD_PRINTER_RX_EPSIZE TUD_EPSIZE_BULK_MAX\n#endif\n\n#ifndef CFG_TUD_PRINTER_TX_EPSIZE\n  #define CFG_TUD_PRINTER_TX_EPSIZE TUD_EPSIZE_BULK_MAX\n#endif\n\n//--------------------------------------------------------------------+\n// Application API (Multiple Ports) i.e. CFG_TUD_PRINTER > 1\n//--------------------------------------------------------------------+\n\n// Get the number of bytes available for reading\nuint32_t tud_printer_n_read_available(uint8_t itf);\n\n// Read received bytes\nuint32_t tud_printer_n_read(uint8_t itf, void *buffer, uint32_t bufsize);\n\n// Get the number of bytes available for writing\nuint32_t tud_printer_n_write_available(uint8_t itf);\n\n// Clear the received FIFO\nvoid tud_printer_n_read_flush(uint8_t itf);\n\n// Get a byte from FIFO without removing it\nbool tud_printer_n_peek(uint8_t itf, uint8_t *ui8);\n\n// Write data to host\nuint32_t tud_printer_n_write(uint8_t itf, const void *buffer, uint32_t bufsize);\n\n// Force sending data in the TX FIFO\nuint32_t tud_printer_n_write_flush(uint8_t itf);\n\n// Clear the transmit FIFO\nbool tud_printer_n_write_clear(uint8_t itf);\n\n//--------------------------------------------------------------------+\n// Application API (Single Port)\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_printer_read_available(void) {\n  return tud_printer_n_read_available(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_printer_write_available(void) {\n  return tud_printer_n_write_available(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_printer_read(void *buffer, uint32_t bufsize) {\n  return tud_printer_n_read(0, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tud_printer_read_flush(void) {\n  tud_printer_n_read_flush(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_printer_peek(uint8_t *ui8) {\n  return tud_printer_n_peek(0, ui8);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_printer_write(const void *buffer, uint32_t bufsize) {\n  return tud_printer_n_write(0, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_printer_write_flush(void) {\n  return tud_printer_n_write_flush(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_printer_write_clear(void) {\n  return tud_printer_n_write_clear(0);\n}\n\n//--------------------------------------------------------------------+\n// Application Callback API (weak is optional)\n//--------------------------------------------------------------------+\n\n// Invoked when received new data\nvoid tud_printer_rx_cb(uint8_t itf);\n\n// Invoked when last write transfer is completed\nvoid tud_printer_tx_complete_cb(uint8_t itf);\n\n// Invoked when host requests device ID string (IEEE 1284).\n// Application returns pointer to device ID buffer (must remain valid until transfer completes).\n// First 2 bytes of returned buffer must contain big-endian length (including the 2 length bytes).\nconst uint8_t *tud_printer_get_device_id_cb(uint8_t itf);\n\n// Invoked when host requests port status.\nuint8_t tud_printer_get_port_status_cb(uint8_t itf);\n\n// Invoked when host requests soft reset.\nvoid tud_printer_soft_reset_cb(uint8_t itf);\n\n// Invoked when a control request is completed (GET_DEVICE_ID, GET_PORT_STATUS, etc.)\nvoid tud_printer_request_complete_cb(uint8_t itf, tusb_control_request_t const *request);\n\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     printerd_init(void);\nbool     printerd_deinit(void);\nvoid     printerd_reset(uint8_t rhport);\nuint16_t printerd_open(uint8_t rhport, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nbool     printerd_control_xfer_cb(uint8_t rhport, uint8_t stage, const tusb_control_request_t *request);\nbool     printerd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/class/usbtmc/usbtmc.h",
    "content": "\n/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 N Conrad\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_USBTMC_H__\n#define TUSB_USBTMC_H__\n\n#include \"common/tusb_common.h\"\n\n\n/* Implements USBTMC Revision 1.0, April 14, 2003\n\n String descriptors must have a \"LANGID=0x409\"/US English string.\n Characters must be 0x20 (' ') to 0x7E ('~') ASCII,\n   But MUST not contain: \"/:?\\*\n   Also must not have leading or trailing space (' ')\n Device descriptor must state USB version 0x0200 or greater\n\n If USB488DeviceCapabilites.D2 = 1 (SR1), then there must be a INT endpoint.\n*/\n\n#define USBTMC_VERSION 0x0100\n#define USBTMC_488_VERSION 0x0100\n\ntypedef enum {\n  USBTMC_MSGID_DEV_DEP_MSG_OUT = 1u,\n  USBTMC_MSGID_DEV_DEP_MSG_IN = 2u,\n  USBTMC_MSGID_VENDOR_SPECIFIC_MSG_OUT = 126u,\n  USBTMC_MSGID_VENDOR_SPECIFIC_IN = 127u,\n  USBTMC_MSGID_USB488_TRIGGER = 128u,\n} usbtmc_msgid_enum;\n\n/// \\brief Message header (For BULK OUT and BULK IN); 4 bytes\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t MsgID              ; ///< Message type ID (usbtmc_msgid_enum)\n  uint8_t bTag    \t\t       ; ///< Transfer ID 1<=bTag<=255\n  uint8_t bTagInverse        ; ///< Complement of the tag\n  uint8_t _reserved           ; ///< Must be 0x00\n} usbtmc_msg_header_t;\n\ntypedef struct TU_ATTR_PACKED\n{\n  usbtmc_msg_header_t header;\n  uint8_t data[8];\n} usbtmc_msg_generic_t;\n\n/* Uses on the bulk-out endpoint: */\n// Next 8 bytes are message-specific\ntypedef struct TU_ATTR_PACKED {\n\tusbtmc_msg_header_t header ; ///< Header\n\tuint32_t TransferSize      ; ///< Transfer size; LSB first\n\tstruct TU_ATTR_PACKED\n\t{\n\t  unsigned int EOM  : 1         ; ///< EOM set on last byte\n  } bmTransferAttributes;\n  uint8_t _reserved[3];\n} usbtmc_msg_request_dev_dep_out;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_msg_request_dev_dep_out) == 12u, \"struct wrong length\");\n\n// Next 8 bytes are message-specific\ntypedef struct TU_ATTR_PACKED\n{\n  usbtmc_msg_header_t header ; ///< Header\n  uint32_t TransferSize      ; ///< Transfer size; LSB first\n  struct TU_ATTR_PACKED\n  {\n    unsigned int TermCharEnabled  : 1 ; ///< \"The Bulk-IN transfer must terminate on the specified TermChar.\"; CAPABILITIES must list TermChar\n  } bmTransferAttributes;\n  uint8_t TermChar;\n  uint8_t _reserved[2];\n} usbtmc_msg_request_dev_dep_in;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_msg_request_dev_dep_in) == 12u, \"struct wrong length\");\n\n/* Bulk-in headers */\n\ntypedef struct TU_ATTR_PACKED\n{\n  usbtmc_msg_header_t header;\n  uint32_t TransferSize;\n  struct TU_ATTR_PACKED\n  {\n    uint8_t EOM: 1;           ///< Last byte of transfer is the end of the message\n    uint8_t UsingTermChar: 1; ///< Support TermChar && Request.TermCharEnabled && last char in transfer is TermChar\n  } bmTransferAttributes;\n  uint8_t _reserved[3];\n} usbtmc_msg_dev_dep_msg_in_header_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_msg_dev_dep_msg_in_header_t) == 12u, \"struct wrong length\");\n\n/* Unsupported vendor things.... Are these ever used?*/\n\ntypedef struct TU_ATTR_PACKED\n{\n  usbtmc_msg_header_t header ; ///< Header\n  uint32_t TransferSize      ; ///< Transfer size; LSB first\n  uint8_t _reserved[4];\n} usbtmc_msg_request_vendor_specific_out;\n\n\nTU_VERIFY_STATIC(sizeof(usbtmc_msg_request_vendor_specific_out) == 12u, \"struct wrong length\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  usbtmc_msg_header_t header ; ///< Header\n  uint32_t TransferSize      ; ///< Transfer size; LSB first\n  uint8_t _reserved[4];\n} usbtmc_msg_request_vendor_specific_in;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_msg_request_vendor_specific_in) == 12u, \"struct wrong length\");\n\n// Control request type should use tusb_control_request_t\n\n/*\ntypedef struct TU_ATTR_PACKED {\n  struct {\n    unsigned int Recipient  : 5         ; ///< EOM set on last byte\n    unsigned int Type       : 2         ; ///< EOM set on last byte\n    unsigned int DirectionToHost  : 1   ; ///< 0 is OUT, 1 is IN\n  } bmRequestType;\n  uint8_t bRequest                 ; ///< If bmRequestType.Type = Class, see usmtmc_request_type_enum\n  uint16_t wValue                  ;\n  uint16_t wIndex                  ;\n  uint16_t wLength                 ; // Number of bytes in data stage\n} usbtmc_class_specific_control_req;\n\n*/\n// bulk-in protocol errors\nenum {\n  USBTMC_BULK_IN_ERR_INCOMPLETE_HEADER = 1u,\n  USBTMC_BULK_IN_ERR_UNSUPPORTED = 2u,\n  USBTMC_BULK_IN_ERR_BAD_PARAMETER = 3u,\n  USBTMC_BULK_IN_ERR_DATA_TOO_SHORT = 4u,\n  USBTMC_BULK_IN_ERR_DATA_TOO_LONG = 5u,\n};\n// built-in halt errors\nenum {\n  USBTMC_BULK_IN_ERR = 1u, ///< receives a USBTMC command message that expects a response while a\n                           /// Bulk-IN transfer is in progress\n};\n\ntypedef enum {\n  USBTMC_bREQUEST_INITIATE_ABORT_BULK_OUT      = 1u,\n  USBTMC_bREQUEST_CHECK_ABORT_BULK_OUT_STATUS  = 2u,\n  USBTMC_bREQUEST_INITIATE_ABORT_BULK_IN       = 3u,\n  USBTMC_bREQUEST_CHECK_ABORT_BULK_IN_STATUS   = 4u,\n  USBTMC_bREQUEST_INITIATE_CLEAR               = 5u,\n  USBTMC_bREQUEST_CHECK_CLEAR_STATUS           = 6u,\n  USBTMC_bREQUEST_GET_CAPABILITIES             = 7u,\n\n  USBTMC_bREQUEST_INDICATOR_PULSE               = 64u, // Optional\n\n  /****** USBTMC 488 *************/\n  USB488_bREQUEST_READ_STATUS_BYTE  = 128u,\n  USB488_bREQUEST_REN_CONTROL       = 160u,\n  USB488_bREQUEST_GO_TO_LOCAL       = 161u,\n  USB488_bREQUEST_LOCAL_LOCKOUT     = 162u,\n\n} usmtmc_request_type_enum;\n\ntypedef enum {\n  // The last and first valid bNotify1 for use by the USBTMC class specification.\n  USBTMC_bNOTIFY1_USBTMC_FIRST          = 0x00,\n  USBTMC_bNOTIFY1_USBTMC_LAST           = 0x3F,\n\n  // The last and first valid bNotify1 for use by vendors.\n  USBTMC_bNOTIFY1_VENDOR_SPECIFIC_FIRST = 0x40,\n  USBTMC_bNOTIFY1_VENDOR_SPECIFIC_LAST  = 0x7F,\n\n  // The last and first valid bNotify1 for use by USBTMC subclass specifications.\n  USBTMC_bNOTIFY1_SUBCLASS_FIRST        = 0x80,\n  USBTMC_bNOTIFY1_SUBCLASS_LAST         = 0xFF,\n\n  // From the USB488 Subclass Specification, Section 3.4.\n  USB488_bNOTIFY1_SRQ                   = 0x81,\n} usbtmc_int_in_payload_format;\n\ntypedef enum {\n  USBTMC_STATUS_SUCCESS = 0x01,\n  USBTMC_STATUS_PENDING = 0x02,\n  USBTMC_STATUS_FAILED = 0x80,\n  USBTMC_STATUS_TRANSFER_NOT_IN_PROGRESS = 0x81,\n  USBTMC_STATUS_SPLIT_NOT_IN_PROGRESS = 0x82,\n  USBTMC_STATUS_SPLIT_IN_PROGRESS  = 0x83,\n\n  /****** USBTMC 488 *************/\n  USB488_STATUS_INTERRUPT_IN_BUSY = 0x20\n} usbtmc_status_enum;\n\n/************************************************************\n * Control Responses\n */\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t USBTMC_status;                 ///< usbtmc_status_enum\n  uint8_t _reserved;\n  uint16_t bcdUSBTMC;                    ///< USBTMC_VERSION\n\n  struct TU_ATTR_PACKED\n  {\n    unsigned int listenOnly :1;\n    unsigned int talkOnly :1;\n    unsigned int supportsIndicatorPulse :1;\n  } bmIntfcCapabilities;\n  struct TU_ATTR_PACKED\n  {\n    unsigned int canEndBulkInOnTermChar :1;\n  } bmDevCapabilities;\n  uint8_t _reserved2[6];\n  uint8_t _reserved3[12];\n} usbtmc_response_capabilities_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_response_capabilities_t) == 0x18, \"struct wrong length\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t USBTMC_status;\n  struct TU_ATTR_PACKED\n  {\n    unsigned int BulkInFifoBytes :1;\n  } bmClear;\n} usbtmc_get_clear_status_rsp_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_get_clear_status_rsp_t) == 2u, \"struct wrong length\");\n\n// Used for both abort bulk IN and bulk OUT\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t USBTMC_status;\n  uint8_t bTag;\n} usbtmc_initiate_abort_rsp_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_get_clear_status_rsp_t) == 2u, \"struct wrong length\");\n\n// Used for both check_abort_bulk_in_status and check_abort_bulk_out_status\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t USBTMC_status;\n  struct TU_ATTR_PACKED\n  {\n    unsigned int BulkInFifoBytes : 1; ///< Has queued data or a short packet that is queued\n  } bmAbortBulkIn;\n  uint8_t _reserved[2];               ///< Must be zero\n  uint32_t NBYTES_RXD_TXD;\n} usbtmc_check_abort_bulk_rsp_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_check_abort_bulk_rsp_t) == 8u, \"struct wrong length\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t USBTMC_status;                 ///< usbtmc_status_enum\n  uint8_t _reserved;\n  uint16_t bcdUSBTMC;                    ///< USBTMC_VERSION\n\n  struct TU_ATTR_PACKED\n  {\n    uint8_t listenOnly :1;\n    uint8_t talkOnly :1;\n    uint8_t supportsIndicatorPulse :1;\n  } bmIntfcCapabilities;\n\n  struct TU_ATTR_PACKED\n  {\n    uint8_t canEndBulkInOnTermChar :1;\n  } bmDevCapabilities;\n\n  uint8_t _reserved2[6];\n  uint16_t bcdUSB488;\n\n  struct TU_ATTR_PACKED\n  {\n    uint8_t supportsTrigger :1;\n    uint8_t supportsREN_GTL_LLO :1;\n    uint8_t is488_2 :1;\n  } bmIntfcCapabilities488;\n\n  struct TU_ATTR_PACKED\n  {\n    uint8_t DT1 :1;\n    uint8_t RL1 :1;\n    uint8_t SR1 :1;\n    uint8_t SCPI :1;\n  } bmDevCapabilities488;\n  uint8_t _reserved3[8];\n} usbtmc_response_capabilities_488_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_response_capabilities_488_t) == 0x18, \"struct wrong length\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t USBTMC_status;\n  uint8_t bTag;\n  uint8_t statusByte;\n} usbtmc_read_stb_rsp_488_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_read_stb_rsp_488_t) == 3u, \"struct wrong length\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t bNotify1; // Must be USB488_bNOTIFY1_SRQ\n  uint8_t StatusByte;\n} usbtmc_srq_interrupt_488_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_srq_interrupt_488_t) == 2u, \"struct wrong length\");\n\ntypedef struct TU_ATTR_PACKED\n{\n  struct TU_ATTR_PACKED\n  {\n      unsigned int bTag : 7;\n      unsigned int one  : 1;\n  } bNotify1;\n  uint8_t StatusByte;\n} usbtmc_read_stb_interrupt_488_t;\n\nTU_VERIFY_STATIC(sizeof(usbtmc_read_stb_interrupt_488_t) == 2u, \"struct wrong length\");\n\n#endif\n"
  },
  {
    "path": "src/class/usbtmc/usbtmc_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Nathan Conrad\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/*\n * This library is not fully reentrant, though it is reentrant from the view\n * of either the application layer or the USB stack. Due to its locking,\n * it is not safe to call its functions from interrupts.\n *\n * The one exception is that its functions may not be called from the application\n * until the USB stack is initialized. This should not be a problem since the\n * device shouldn't be sending messages until it receives a request from the\n * host.\n */\n\n\n/*\n * In the case of single-CPU \"no OS\", this task is never preempted other than by\n * interrupts, and the USBTMC code isn't called by interrupts, so all is OK. For \"no OS\",\n * the mutex structure's main effect is to disable the USB interrupts.\n * With an OS, this class driver uses the OSAL to perform locking. The code uses a single lock\n * and does not call outside of this class with a lock held, so deadlocks won't happen.\n */\n\n//Limitations:\n// \"vendor-specific\" commands are handled similar to normal messages, except that the MsgID is changed to \"vendor-specific\".\n// Dealing with \"termchar\" must be handled by the application layer,\n//    though additional error checking is does in this module.\n// talkOnly and listenOnly are NOT supported. They're not permitted\n// in USB488, anyway.\n\n/* Supported:\n *\n * Notification pulse\n * Trigger\n * Read status byte (both by interrupt endpoint and control message)\n *\n */\n\n\n// TODO:\n// USBTMC 3.2.2 error conditions not strictly followed\n// No local lock-out, REN, or GTL.\n// Clear message available status byte at the correct time? (488 4.3.1.3)\n// Ability to defer status byte transmission\n// Transmission of status byte in response to USB488 SRQ condition\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_USBTMC)\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"usbtmc_device.h\"\n\n// Buffer size must be an exact multiple of the max packet size for both\n// bulk  (up to 64 bytes for FS, 512 bytes for HS). In addation, this driver\n// imposes a minimum buffer size of 32 bytes.\n#define USBTMCD_BUFFER_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// Interrupt endpoint buffer size, default to 2 bytes as USB488 specification.\n#ifndef CFG_TUD_USBTMC_INT_EP_SIZE\n  #define CFG_TUD_USBTMC_INT_EP_SIZE 2\n#endif\n\n/*\n * The state machine does not allow simultaneous reading and writing. This is\n * consistent with USBTMC.\n */\n\ntypedef enum {\n  STATE_CLOSED,// Endpoints have not yet been opened since USB reset\n  STATE_NAK,   // Bulk-out endpoint is in NAK state.\n  STATE_IDLE,  // Bulk-out endpoint is waiting for CMD.\n  STATE_RCV,   // Bulk-out is receiving DEV_DEP message\n  STATE_TX_REQUESTED,\n  STATE_TX_INITIATED,\n  STATE_TX_SHORTED,\n  STATE_CLEARING,\n  STATE_ABORTING_BULK_IN,\n  STATE_ABORTING_BULK_IN_SHORTED,// aborting, and short packet has been queued for transmission\n  STATE_ABORTING_BULK_IN_ABORTED,// aborting, and short packet has been transmitted\n  STATE_ABORTING_BULK_OUT,\n  STATE_NUM_STATES\n} usbtmcd_state_enum;\n\n#if (CFG_TUD_USBTMC_ENABLE_488)\ntypedef usbtmc_response_capabilities_488_t usbtmc_capabilities_specific_t;\n#else\ntypedef usbtmc_response_capabilities_t usbtmc_capabilities_specific_t;\n#endif\n\n\ntypedef struct\n{\n  volatile usbtmcd_state_enum state;\n\n  uint8_t itf_id;\n  uint8_t rhport;\n  uint8_t ep_bulk_in;\n  uint8_t ep_bulk_out;\n  uint8_t ep_int_in;\n  uint32_t ep_bulk_in_wMaxPacketSize;\n  uint32_t ep_bulk_out_wMaxPacketSize;\n  uint32_t transfer_size_remaining;// also used for requested length for bulk IN.\n  uint32_t transfer_size_sent;     // To keep track of data bytes that have been queued in FIFO (not header bytes)\n\n  uint8_t lastBulkOutTag;// used for aborts (mostly)\n  uint8_t lastBulkInTag; // used for aborts (mostly)\n\n  uint8_t const *devInBuffer;// pointer to application-layer used for transmissions\n\n  usbtmc_capabilities_specific_t const *capabilities;\n} usbtmc_interface_state_t;\n\ntypedef struct {\n  // IN buffer is only used for first packet, not the remainder in order to deal with prepending header\n  TUD_EPBUF_DEF(epin, USBTMCD_BUFFER_SIZE);\n\n  // OUT buffer receives one packet at a time\n  TUD_EPBUF_DEF(epout, USBTMCD_BUFFER_SIZE);\n\n  // Buffer int msg\n  TUD_EPBUF_DEF(epnotif, CFG_TUD_USBTMC_INT_EP_SIZE);\n} usbtmc_epbuf_t;\n\nstatic usbtmc_interface_state_t usbtmc_state = {\n    .itf_id = 0xFF,\n};\n\nCFG_TUD_MEM_SECTION static usbtmc_epbuf_t usbtmc_epbuf;\n\n// We need all headers to fit in a single packet in this implementation, 32 bytes will fit all standard USBTMC headers\nTU_VERIFY_STATIC(USBTMCD_BUFFER_SIZE >= 32u, \"USBTMC dev buffer size too small\");\n\nstatic bool handle_devMsgOutStart(uint8_t rhport, void *data, size_t len);\nstatic bool handle_devMsgOut(uint8_t rhport, void *data, size_t len, size_t packetLen);\n\n\n// USBTMC Device Callbacks weak implementations\nTU_ATTR_WEAK bool tud_usbtmc_notification_complete_cb(void) {\n  return true;\n}\n\nTU_ATTR_WEAK bool tud_usbtmc_indicator_pulse_cb(tusb_control_request_t const * msg, uint8_t *tmcResult) {\n  (void) msg;\n  (void) tmcResult;\n  return true;\n}\n\n#if (CFG_TUD_USBTMC_ENABLE_488)\nTU_ATTR_WEAK bool tud_usbtmc_msg_trigger_cb(usbtmc_msg_generic_t* msg) {\n  (void) msg;\n  return true;\n}\n#endif\n\n#ifndef NDEBUG\ntu_static uint8_t termChar;\n#endif\n\ntu_static uint8_t termCharRequested = false;\n\ntu_static bool usbtmcVendorSpecificRequested = false;\n\n#if OSAL_MUTEX_REQUIRED\nstatic OSAL_MUTEX_DEF(usbtmcLockBuffer);\n#endif\nosal_mutex_t usbtmcLock;\n\n// Our own private lock, mostly for the state variable.\n#define criticalEnter() \\\n  do { (void) osal_mutex_lock(usbtmcLock, OSAL_TIMEOUT_WAIT_FOREVER); } while (0)\n#define criticalLeave() \\\n  do { (void) osal_mutex_unlock(usbtmcLock); } while (0)\n\nstatic bool atomicChangeState(usbtmcd_state_enum expectedState, usbtmcd_state_enum newState) {\n  bool ret = true;\n  criticalEnter();\n  usbtmcd_state_enum oldState = usbtmc_state.state;\n  if (oldState == expectedState) {\n    usbtmc_state.state = newState;\n  } else {\n    ret = false;\n  }\n  criticalLeave();\n  return ret;\n}\n\n// called from app\n// We keep a reference to the buffer, so it MUST not change until the app is\n// notified that the transfer is complete.\n// length of data is specified in the hdr.\n\n// We can't just send the whole thing at once because we need to concatanate the\n// header with the data.\nbool tud_usbtmc_transmit_dev_msg_data(\n    const void *data, size_t len,\n    bool endOfMessage,\n    bool usingTermChar) {\n  const unsigned int txBufLen = USBTMCD_BUFFER_SIZE;\n\n#ifndef NDEBUG\n  TU_ASSERT(len > 0u);\n  TU_ASSERT(len <= usbtmc_state.transfer_size_remaining);\n  TU_ASSERT(usbtmc_state.transfer_size_sent == 0u);\n  if (usingTermChar) {\n    TU_ASSERT(usbtmc_state.capabilities->bmDevCapabilities.canEndBulkInOnTermChar);\n    TU_ASSERT(termCharRequested);\n    TU_ASSERT(((uint8_t const *) data)[len - 1u] == termChar);\n  }\n#endif\n\n  TU_VERIFY(usbtmc_state.state == STATE_TX_REQUESTED);\n  usbtmc_msg_dev_dep_msg_in_header_t *hdr = (usbtmc_msg_dev_dep_msg_in_header_t *) usbtmc_epbuf.epin;\n  tu_varclr(hdr);\n  if (usbtmcVendorSpecificRequested) {\n    hdr->header.MsgID = USBTMC_MSGID_VENDOR_SPECIFIC_IN;\n  } else {\n    hdr->header.MsgID = USBTMC_MSGID_DEV_DEP_MSG_IN;\n  }\n  hdr->header.bTag = usbtmc_state.lastBulkInTag;\n  hdr->header.bTagInverse = (uint8_t) ~(usbtmc_state.lastBulkInTag);\n  hdr->TransferSize = len;\n  hdr->bmTransferAttributes.EOM = endOfMessage;\n  hdr->bmTransferAttributes.UsingTermChar = usingTermChar;\n\n  // Copy in the header\n  const size_t headerLen = sizeof(*hdr);\n  const size_t dataLen = ((headerLen + hdr->TransferSize) <= txBufLen) ? len : (txBufLen - headerLen);\n  const size_t packetLen = headerLen + dataLen;\n\n  memcpy((uint8_t *) (usbtmc_epbuf.epin) + headerLen, data, dataLen);\n  usbtmc_state.transfer_size_remaining = len - dataLen;\n  usbtmc_state.transfer_size_sent = dataLen;\n  usbtmc_state.devInBuffer = (uint8_t const *) data + (dataLen);\n\n  bool stateChanged =\n      atomicChangeState(STATE_TX_REQUESTED, (packetLen >= txBufLen) ? STATE_TX_INITIATED : STATE_TX_SHORTED);\n  TU_VERIFY(stateChanged);\n  TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, (uint16_t) packetLen, false));\n  return true;\n}\n\nbool tud_usbtmc_transmit_notification_data(const void *data, size_t len) {\n#ifndef NDEBUG\n  TU_ASSERT(len > 0);\n  TU_ASSERT(usbtmc_state.ep_int_in != 0);\n#endif\n  TU_VERIFY(usbd_edpt_busy(usbtmc_state.rhport, usbtmc_state.ep_int_in));\n\n  TU_VERIFY(tu_memcpy_s(usbtmc_epbuf.epnotif, CFG_TUD_USBTMC_INT_EP_SIZE, data, len) == 0);\n  TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_int_in, usbtmc_epbuf.epnotif, (uint16_t) len, false));\n  return true;\n}\n\nvoid usbtmcd_init_cb(void) {\n  usbtmc_state.capabilities = tud_usbtmc_get_capabilities_cb();\n#ifndef NDEBUG\n  #if CFG_TUD_USBTMC_ENABLE_488\n  // Per USB488 spec: table 8\n  TU_ASSERT(!usbtmc_state.capabilities->bmIntfcCapabilities.listenOnly, );\n  TU_ASSERT(!usbtmc_state.capabilities->bmIntfcCapabilities.talkOnly, );\n  #endif\n#endif\n\n  usbtmcLock = osal_mutex_create(&usbtmcLockBuffer);\n}\n\nbool usbtmcd_deinit(void) {\n#if OSAL_MUTEX_REQUIRED\n  osal_mutex_delete(usbtmcLock);\n#endif\n  return true;\n}\n\nuint16_t usbtmcd_open_cb(uint8_t rhport, tusb_desc_interface_t const *itf_desc, uint16_t max_len) {\n  (void) rhport;\n\n  uint16_t drv_len;\n  uint8_t const *p_desc;\n  uint8_t found_endpoints = 0;\n\n  TU_VERIFY(itf_desc->bInterfaceClass == TUD_USBTMC_APP_CLASS, 0);\n  TU_VERIFY(itf_desc->bInterfaceSubClass == TUD_USBTMC_APP_SUBCLASS, 0);\n\n#ifndef NDEBUG\n  // Only 2 or 3 endpoints are allowed for USBTMC.\n  TU_ASSERT((itf_desc->bNumEndpoints == 2) || (itf_desc->bNumEndpoints == 3), 0);\n#endif\n\n  TU_ASSERT(usbtmc_state.state == STATE_CLOSED, 0);\n\n  // Interface\n  drv_len = 0u;\n  p_desc = (uint8_t const *) itf_desc;\n\n  usbtmc_state.itf_id = itf_desc->bInterfaceNumber;\n  usbtmc_state.rhport = rhport;\n\n  while (found_endpoints < itf_desc->bNumEndpoints && drv_len <= max_len) {\n    if (TUSB_DESC_ENDPOINT == p_desc[DESC_OFFSET_TYPE]) {\n      tusb_desc_endpoint_t const *ep_desc = (tusb_desc_endpoint_t const *) p_desc;\n      switch (ep_desc->bmAttributes.xfer) {\n        case TUSB_XFER_BULK:\n          // Ensure  buffer is an exact multiple of the maxPacketSize\n          TU_ASSERT((USBTMCD_BUFFER_SIZE % tu_edpt_packet_size(ep_desc)) == 0, 0);\n          if (tu_edpt_dir(ep_desc->bEndpointAddress) == TUSB_DIR_IN) {\n            usbtmc_state.ep_bulk_in = ep_desc->bEndpointAddress;\n            usbtmc_state.ep_bulk_in_wMaxPacketSize = tu_edpt_packet_size(ep_desc);\n          } else {\n            usbtmc_state.ep_bulk_out = ep_desc->bEndpointAddress;\n            usbtmc_state.ep_bulk_out_wMaxPacketSize = tu_edpt_packet_size(ep_desc);\n          }\n\n          break;\n        case TUSB_XFER_INTERRUPT:\n#ifndef NDEBUG\n          TU_ASSERT(tu_edpt_dir(ep_desc->bEndpointAddress) == TUSB_DIR_IN, 0);\n          TU_ASSERT(usbtmc_state.ep_int_in == 0, 0);\n#endif\n          usbtmc_state.ep_int_in = ep_desc->bEndpointAddress;\n          break;\n        default:\n          TU_ASSERT(false, 0);\n      }\n      TU_ASSERT(usbd_edpt_open(rhport, ep_desc), 0);\n      found_endpoints++;\n    }\n\n    drv_len += tu_desc_len(p_desc);\n    p_desc = tu_desc_next(p_desc);\n  }\n\n// bulk endpoints are required, but interrupt IN is optional\n#ifndef NDEBUG\n  TU_ASSERT(usbtmc_state.ep_bulk_in != 0, 0);\n  TU_ASSERT(usbtmc_state.ep_bulk_out != 0, 0);\n  if (itf_desc->bNumEndpoints == 2) {\n    TU_ASSERT(usbtmc_state.ep_int_in == 0, 0);\n  } else if (itf_desc->bNumEndpoints == 3) {\n    TU_ASSERT(usbtmc_state.ep_int_in != 0, 0);\n  }\n  #if (CFG_TUD_USBTMC_ENABLE_488)\n  if (usbtmc_state.capabilities->bmIntfcCapabilities488.is488_2 ||\n      usbtmc_state.capabilities->bmDevCapabilities488.SR1) {\n    TU_ASSERT(usbtmc_state.ep_int_in != 0, 0);\n  }\n  #endif\n#endif\n  atomicChangeState(STATE_CLOSED, STATE_NAK);\n  tud_usbtmc_open_cb(itf_desc->iInterface);\n\n  return drv_len;\n}\n// Tell USBTMC class to set its bulk-in EP to ACK so that it can\n// receive USBTMC commands.\n// Returns false if it was already in an ACK state or is busy\n// processing a command (such as a clear). Returns true if it was\n// in the NAK state and successfully transitioned to the ACK wait\n// state.\nbool tud_usbtmc_start_bus_read(void) {\n  usbtmcd_state_enum oldState = usbtmc_state.state;\n  switch (oldState) {\n    // These may transition to IDLE\n    case STATE_NAK:\n    case STATE_ABORTING_BULK_IN_ABORTED:\n      TU_VERIFY(atomicChangeState(oldState, STATE_IDLE));\n      break;\n    // When receiving, let it remain receiving\n    case STATE_RCV:\n      break;\n    default:\n      return false;\n  }\n  TU_VERIFY(usbd_edpt_xfer(usbtmc_state.rhport, usbtmc_state.ep_bulk_out, usbtmc_epbuf.epout, (uint16_t) usbtmc_state.ep_bulk_out_wMaxPacketSize, false));\n  return true;\n}\n\nvoid usbtmcd_reset_cb(uint8_t rhport) {\n  (void) rhport;\n  usbtmc_capabilities_specific_t const *capabilities = tud_usbtmc_get_capabilities_cb();\n\n  criticalEnter();\n  tu_varclr(&usbtmc_state);\n  usbtmc_state.capabilities = capabilities;\n  usbtmc_state.itf_id = 0xFFu;\n  criticalLeave();\n}\n\nstatic bool handle_devMsgOutStart(uint8_t rhport, void *data, size_t len) {\n  (void) rhport;\n  // return true upon failure, as we can assume error is being handled elsewhere.\n  TU_VERIFY(atomicChangeState(STATE_IDLE, STATE_RCV), true);\n  usbtmc_state.transfer_size_sent = 0u;\n\n  // must be a header, should have been confirmed before calling here.\n  usbtmc_msg_request_dev_dep_out *msg = (usbtmc_msg_request_dev_dep_out *) data;\n  usbtmc_state.transfer_size_remaining = msg->TransferSize;\n  TU_VERIFY(tud_usbtmc_msgBulkOut_start_cb(msg));\n\n  TU_VERIFY(handle_devMsgOut(rhport, (uint8_t *) data + sizeof(*msg), len - sizeof(*msg), len));\n  usbtmc_state.lastBulkOutTag = msg->header.bTag;\n  return true;\n}\n\nstatic bool handle_devMsgOut(uint8_t rhport, void *data, size_t len, size_t packetLen) {\n  (void) rhport;\n  // return true upon failure, as we can assume error is being handled elsewhere.\n  TU_VERIFY(usbtmc_state.state == STATE_RCV, true);\n\n  bool shortPacket = (packetLen < usbtmc_state.ep_bulk_out_wMaxPacketSize);\n\n  // Packet is to be considered complete when we get enough data or at a short packet.\n  bool atEnd = false;\n  if (len >= usbtmc_state.transfer_size_remaining || shortPacket) {\n    atEnd = true;\n    TU_VERIFY(atomicChangeState(STATE_RCV, STATE_NAK));\n  }\n\n  len = tu_min32(len, usbtmc_state.transfer_size_remaining);\n\n  usbtmc_state.transfer_size_remaining -= len;\n  usbtmc_state.transfer_size_sent += len;\n\n  // App may (should?) call the wait_for_bus() command at this point\n  if (!tud_usbtmc_msg_data_cb(data, len, atEnd)) {\n    // TODO: Go to an error state upon failure other than just stalling the EP?\n    return false;\n  }\n\n\n  return true;\n}\n\nstatic bool handle_devMsgIn(void *data, size_t len) {\n  TU_VERIFY(len == sizeof(usbtmc_msg_request_dev_dep_in));\n  usbtmc_msg_request_dev_dep_in *msg = (usbtmc_msg_request_dev_dep_in *) data;\n  bool stateChanged = atomicChangeState(STATE_IDLE, STATE_TX_REQUESTED);\n  TU_VERIFY(stateChanged);\n  usbtmc_state.lastBulkInTag = msg->header.bTag;\n  usbtmc_state.transfer_size_remaining = msg->TransferSize;\n  usbtmc_state.transfer_size_sent = 0u;\n\n  termCharRequested = msg->bmTransferAttributes.TermCharEnabled;\n\n#ifndef NDEBUG\n  termChar = msg->TermChar;\n#endif\n\n  if (termCharRequested)\n    TU_VERIFY(usbtmc_state.capabilities->bmDevCapabilities.canEndBulkInOnTermChar);\n\n  TU_VERIFY(tud_usbtmc_msgBulkIn_request_cb(msg));\n  return true;\n}\n\nbool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  TU_VERIFY(result == XFER_RESULT_SUCCESS);\n  //uart_tx_str_sync(\"TMC XFER CB\\r\\n\");\n  if (usbtmc_state.state == STATE_CLEARING) {\n    return true; /* I think we can ignore everything here */\n  }\n\n  if (ep_addr == usbtmc_state.ep_bulk_out) {\n    usbtmc_msg_generic_t *msg = NULL;\n\n    switch (usbtmc_state.state) {\n      case STATE_IDLE: {\n        TU_VERIFY(xferred_bytes >= sizeof(usbtmc_msg_generic_t));\n        msg = (usbtmc_msg_generic_t *) (usbtmc_epbuf.epout);\n        uint8_t invInvTag = (uint8_t) ~(msg->header.bTagInverse);\n        TU_VERIFY(msg->header.bTag == invInvTag);\n        TU_VERIFY(msg->header.bTag != 0x00);\n\n        switch (msg->header.MsgID) {\n          case USBTMC_MSGID_DEV_DEP_MSG_OUT:\n            usbtmcVendorSpecificRequested = false;\n            if (!handle_devMsgOutStart(rhport, msg, xferred_bytes)) {\n              usbd_edpt_stall(rhport, usbtmc_state.ep_bulk_out);\n              return false;\n            }\n            break;\n\n          case USBTMC_MSGID_DEV_DEP_MSG_IN:\n            usbtmcVendorSpecificRequested = false;\n            TU_VERIFY(handle_devMsgIn(msg, xferred_bytes));\n            break;\n\n#if (CFG_TUD_USBTMC_ENABLE_488)\n          case USBTMC_MSGID_USB488_TRIGGER:\n            // Spec says we halt the EP if we didn't declare we support it.\n            TU_VERIFY(usbtmc_state.capabilities->bmIntfcCapabilities488.supportsTrigger);\n            TU_VERIFY(tud_usbtmc_msg_trigger_cb(msg));\n\n            break;\n#endif\n          case USBTMC_MSGID_VENDOR_SPECIFIC_MSG_OUT:\n            usbtmcVendorSpecificRequested = true;\n            if (!handle_devMsgOutStart(rhport, msg, xferred_bytes)) {\n              usbd_edpt_stall(rhport, usbtmc_state.ep_bulk_out);\n              return false;\n            }\n            break;\n\n          case USBTMC_MSGID_VENDOR_SPECIFIC_IN:\n            usbtmcVendorSpecificRequested = true;\n            TU_VERIFY(handle_devMsgIn(msg, xferred_bytes));\n            break;\n\n          default:\n            usbd_edpt_stall(rhport, usbtmc_state.ep_bulk_out);\n            return false;\n        }\n        return true;\n      }\n      case STATE_RCV:\n        if (!handle_devMsgOut(rhport, usbtmc_epbuf.epout, xferred_bytes, xferred_bytes)) {\n          usbd_edpt_stall(rhport, usbtmc_state.ep_bulk_out);\n          return false;\n        }\n        return true;\n\n      case STATE_ABORTING_BULK_OUT:\n        // Should be stalled by now, shouldn't have received a packet.\n        return false;\n\n      case STATE_TX_REQUESTED:\n      case STATE_TX_INITIATED:\n      case STATE_ABORTING_BULK_IN:\n      case STATE_ABORTING_BULK_IN_SHORTED:\n      case STATE_ABORTING_BULK_IN_ABORTED:\n      default:\n        return false;\n    }\n  } else if (ep_addr == usbtmc_state.ep_bulk_in) {\n    switch (usbtmc_state.state) {\n      case STATE_TX_SHORTED:\n        TU_VERIFY(atomicChangeState(STATE_TX_SHORTED, STATE_NAK));\n        TU_VERIFY(tud_usbtmc_msgBulkIn_complete_cb());\n        break;\n\n      case STATE_TX_INITIATED:\n        if (usbtmc_state.transfer_size_remaining >= USBTMCD_BUFFER_SIZE) {\n          // Copy buffer to ensure alignment correctness\n          memcpy(usbtmc_epbuf.epin, usbtmc_state.devInBuffer, USBTMCD_BUFFER_SIZE);\n          TU_VERIFY(usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, USBTMCD_BUFFER_SIZE, false));\n          usbtmc_state.devInBuffer += USBTMCD_BUFFER_SIZE;\n          usbtmc_state.transfer_size_remaining -= USBTMCD_BUFFER_SIZE;\n          usbtmc_state.transfer_size_sent += USBTMCD_BUFFER_SIZE;\n        } else// last packet\n        {\n          size_t packetLen = usbtmc_state.transfer_size_remaining;\n          memcpy(usbtmc_epbuf.epin, usbtmc_state.devInBuffer, usbtmc_state.transfer_size_remaining);\n          usbtmc_state.transfer_size_sent += packetLen;\n          usbtmc_state.transfer_size_remaining = 0;\n          usbtmc_state.devInBuffer = NULL;\n          TU_VERIFY(usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, (uint16_t) packetLen, false));\n          if (((packetLen % usbtmc_state.ep_bulk_in_wMaxPacketSize) != 0) || (packetLen == 0)) {\n            usbtmc_state.state = STATE_TX_SHORTED;\n          }\n        }\n        return true;\n\n      case STATE_ABORTING_BULK_IN:\n        // need to send short packet  (ZLP?)\n        TU_VERIFY(usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, (uint16_t) 0u, false));\n        usbtmc_state.state = STATE_ABORTING_BULK_IN_SHORTED;\n        return true;\n\n      case STATE_ABORTING_BULK_IN_SHORTED:\n        /* Done. :)*/\n        usbtmc_state.state = STATE_ABORTING_BULK_IN_ABORTED;\n        return true;\n\n      default:\n        TU_ASSERT(false);\n    }\n  } else if (ep_addr == usbtmc_state.ep_int_in) {\n    TU_VERIFY(tud_usbtmc_notification_complete_cb());\n    return true;\n  }\n  return false;\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool usbtmcd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request) {\n  // nothing to do with DATA and ACK stage\n  if (stage != CONTROL_STAGE_SETUP) return true;\n\n  uint8_t tmcStatusCode = USBTMC_STATUS_FAILED;\n#if (CFG_TUD_USBTMC_ENABLE_488)\n  uint8_t bTag;\n#endif\n\n  if ((request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD) &&\n      (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_ENDPOINT) &&\n      (request->bRequest == TUSB_REQ_CLEAR_FEATURE) &&\n      (request->wValue == TUSB_REQ_FEATURE_EDPT_HALT)) {\n    uint32_t ep_addr = (request->wIndex);\n\n    // At this point, a transfer MAY be in progress. Based on USB spec, when clearing bulk EP HALT,\n    // the EP transfer buffer needs to be cleared and DTOG needs to be reset, even if\n    // the EP is not halted. The only USBD API interface to do this is to stall and then un-stall the EP.\n    if (ep_addr == usbtmc_state.ep_bulk_out) {\n      criticalEnter();\n      usbd_edpt_stall(rhport, (uint8_t) ep_addr);\n      usbd_edpt_clear_stall(rhport, (uint8_t) ep_addr);\n      usbtmc_state.state = STATE_NAK;// USBD core has placed EP in NAK state for us\n      criticalLeave();\n      tud_usbtmc_bulkOut_clearFeature_cb();\n    } else if (ep_addr == usbtmc_state.ep_bulk_in) {\n      usbd_edpt_stall(rhport, (uint8_t) ep_addr);\n      usbd_edpt_clear_stall(rhport, (uint8_t) ep_addr);\n      tud_usbtmc_bulkIn_clearFeature_cb();\n    } else if ((usbtmc_state.ep_int_in != 0) && (ep_addr == usbtmc_state.ep_int_in)) {\n      // Clearing interrupt in EP\n      usbd_edpt_stall(rhport, (uint8_t) ep_addr);\n      usbd_edpt_clear_stall(rhport, (uint8_t) ep_addr);\n    } else {\n      return false;\n    }\n    return true;\n  }\n\n  // Otherwise, we only handle class requests.\n  if (request->bmRequestType_bit.type != TUSB_REQ_TYPE_CLASS) {\n    return false;\n  }\n\n  // Verification that we own the interface is unneeded since it's been routed to us specifically.\n\n  switch (request->bRequest) {\n    // USBTMC required requests\n    case USBTMC_bREQUEST_INITIATE_ABORT_BULK_OUT: {\n      usbtmc_initiate_abort_rsp_t rsp = {\n          .bTag = usbtmc_state.lastBulkOutTag,\n      };\n      TU_VERIFY(request->bmRequestType == 0xA2);// in,class,interface\n      TU_VERIFY(request->wLength == sizeof(rsp));\n      TU_VERIFY(request->wIndex == usbtmc_state.ep_bulk_out);\n\n      // wValue is the requested bTag to abort\n      if (usbtmc_state.state != STATE_RCV) {\n        rsp.USBTMC_status = USBTMC_STATUS_FAILED;\n      } else if (usbtmc_state.lastBulkOutTag == (request->wValue & 0x7Fu)) {\n        rsp.USBTMC_status = USBTMC_STATUS_TRANSFER_NOT_IN_PROGRESS;\n      } else {\n        rsp.USBTMC_status = USBTMC_STATUS_SUCCESS;\n        // Check if we've queued a short packet\n        criticalEnter();\n        usbtmc_state.state = STATE_ABORTING_BULK_OUT;\n        criticalLeave();\n        TU_VERIFY(tud_usbtmc_initiate_abort_bulk_out_cb(&(rsp.USBTMC_status)));\n        usbd_edpt_stall(rhport, usbtmc_state.ep_bulk_out);\n      }\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) &rsp, sizeof(rsp)));\n      return true;\n    }\n\n    case USBTMC_bREQUEST_CHECK_ABORT_BULK_OUT_STATUS: {\n      usbtmc_check_abort_bulk_rsp_t rsp = {\n          .USBTMC_status = USBTMC_STATUS_SUCCESS,\n          .NBYTES_RXD_TXD = usbtmc_state.transfer_size_sent};\n      TU_VERIFY(request->bmRequestType == 0xA2);// in,class,EP\n      TU_VERIFY(request->wLength == sizeof(rsp));\n      TU_VERIFY(request->wIndex == usbtmc_state.ep_bulk_out);\n      TU_VERIFY(tud_usbtmc_check_abort_bulk_out_cb(&rsp));\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) &rsp, sizeof(rsp)));\n      return true;\n    }\n\n    case USBTMC_bREQUEST_INITIATE_ABORT_BULK_IN: {\n      usbtmc_initiate_abort_rsp_t rsp = {\n          .bTag = usbtmc_state.lastBulkInTag,\n      };\n      TU_VERIFY(request->bmRequestType == 0xA2);// in,class,interface\n      TU_VERIFY(request->wLength == sizeof(rsp));\n      TU_VERIFY(request->wIndex == usbtmc_state.ep_bulk_in);\n      // wValue is the requested bTag to abort\n      if ((usbtmc_state.state == STATE_TX_REQUESTED || usbtmc_state.state == STATE_TX_INITIATED) &&\n          usbtmc_state.lastBulkInTag == (request->wValue & 0x7Fu)) {\n        rsp.USBTMC_status = USBTMC_STATUS_SUCCESS;\n        usbtmc_state.transfer_size_remaining = 0u;\n        // Check if we've queued a short packet\n        criticalEnter();\n        usbtmc_state.state = ((usbtmc_state.transfer_size_sent % usbtmc_state.ep_bulk_in_wMaxPacketSize) == 0) ? STATE_ABORTING_BULK_IN : STATE_ABORTING_BULK_IN_SHORTED;\n        criticalLeave();\n        if (usbtmc_state.transfer_size_sent == 0) {\n          // Send short packet, nothing is in the buffer yet\n          TU_VERIFY(usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_epbuf.epin, (uint16_t) 0u, false));\n          usbtmc_state.state = STATE_ABORTING_BULK_IN_SHORTED;\n        }\n        TU_VERIFY(tud_usbtmc_initiate_abort_bulk_in_cb(&(rsp.USBTMC_status)));\n      } else if ((usbtmc_state.state == STATE_TX_REQUESTED || usbtmc_state.state == STATE_TX_INITIATED)) {// FIXME: Unsure how to check  if the OUT endpoint fifo is non-empty....\n        rsp.USBTMC_status = USBTMC_STATUS_TRANSFER_NOT_IN_PROGRESS;\n      } else {\n        rsp.USBTMC_status = USBTMC_STATUS_FAILED;\n      }\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) &rsp, sizeof(rsp)));\n      return true;\n    }\n\n    case USBTMC_bREQUEST_CHECK_ABORT_BULK_IN_STATUS: {\n      TU_VERIFY(request->bmRequestType == 0xA2);// in,class,EP\n      TU_VERIFY(request->wLength == 8u);\n\n      usbtmc_check_abort_bulk_rsp_t rsp =\n          {\n              .USBTMC_status = USBTMC_STATUS_FAILED,\n              .bmAbortBulkIn =\n                  {\n                      .BulkInFifoBytes = (usbtmc_state.state != STATE_ABORTING_BULK_IN_ABORTED)},\n              .NBYTES_RXD_TXD = usbtmc_state.transfer_size_sent,\n          };\n      TU_VERIFY(tud_usbtmc_check_abort_bulk_in_cb(&rsp));\n      criticalEnter();\n      switch (usbtmc_state.state) {\n        case STATE_ABORTING_BULK_IN_ABORTED:\n          rsp.USBTMC_status = USBTMC_STATUS_SUCCESS;\n          usbtmc_state.state = STATE_IDLE;\n          break;\n        case STATE_ABORTING_BULK_IN:\n        case STATE_ABORTING_BULK_OUT:\n          rsp.USBTMC_status = USBTMC_STATUS_PENDING;\n          break;\n        default:\n          break;\n      }\n      criticalLeave();\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) &rsp, sizeof(rsp)));\n\n      return true;\n    }\n\n    case USBTMC_bREQUEST_INITIATE_CLEAR: {\n      TU_VERIFY(request->bmRequestType == 0xA1);// in,class,interface\n      TU_VERIFY(request->wLength == sizeof(tmcStatusCode));\n      // After receiving an INITIATE_CLEAR request, the device must Halt the Bulk-OUT endpoint, queue the\n      // control endpoint response shown in Table 31, and clear all input buffers and output buffers.\n      usbd_edpt_stall(rhport, usbtmc_state.ep_bulk_out);\n      usbtmc_state.transfer_size_remaining = 0;\n      criticalEnter();\n      usbtmc_state.state = STATE_CLEARING;\n      criticalLeave();\n      TU_VERIFY(tud_usbtmc_initiate_clear_cb(&tmcStatusCode));\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) &tmcStatusCode, sizeof(tmcStatusCode)));\n      return true;\n    }\n\n    case USBTMC_bREQUEST_CHECK_CLEAR_STATUS: {\n      TU_VERIFY(request->bmRequestType == 0xA1);// in,class,interface\n      usbtmc_get_clear_status_rsp_t clearStatusRsp = {0};\n      TU_VERIFY(request->wLength == sizeof(clearStatusRsp));\n\n      if (usbd_edpt_busy(rhport, usbtmc_state.ep_bulk_in)) {\n        // Stuff stuck in TX buffer?\n        clearStatusRsp.bmClear.BulkInFifoBytes = 1;\n        clearStatusRsp.USBTMC_status = USBTMC_STATUS_PENDING;\n      } else {\n        // Let app check if it's clear\n        TU_VERIFY(tud_usbtmc_check_clear_cb(&clearStatusRsp));\n      }\n      if (clearStatusRsp.USBTMC_status == USBTMC_STATUS_SUCCESS) {\n        criticalEnter();\n        usbtmc_state.state = STATE_IDLE;\n        criticalLeave();\n      }\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) &clearStatusRsp, sizeof(clearStatusRsp)));\n      return true;\n    }\n\n    case USBTMC_bREQUEST_GET_CAPABILITIES: {\n      TU_VERIFY(request->bmRequestType == 0xA1);// in,class,interface\n      TU_VERIFY(request->wLength == sizeof(*(usbtmc_state.capabilities)));\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) (uintptr_t) usbtmc_state.capabilities, sizeof(*usbtmc_state.capabilities)));\n      return true;\n    }\n      // USBTMC Optional Requests\n\n    case USBTMC_bREQUEST_INDICATOR_PULSE:// Optional\n    {\n      TU_VERIFY(request->bmRequestType == 0xA1);// in,class,interface\n      TU_VERIFY(request->wLength == sizeof(tmcStatusCode));\n      TU_VERIFY(usbtmc_state.capabilities->bmIntfcCapabilities.supportsIndicatorPulse);\n      TU_VERIFY(tud_usbtmc_indicator_pulse_cb(request, &tmcStatusCode));\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) &tmcStatusCode, sizeof(tmcStatusCode)));\n      return true;\n    }\n#if (CFG_TUD_USBTMC_ENABLE_488)\n\n      // USB488 required requests\n    case USB488_bREQUEST_READ_STATUS_BYTE: {\n      usbtmc_read_stb_rsp_488_t rsp;\n      TU_VERIFY(request->bmRequestType == 0xA1); // in,class,interface\n      TU_VERIFY(request->wLength == sizeof(rsp));// in,class,interface\n\n      bTag = request->wValue & 0x7F;\n      TU_VERIFY(request->bmRequestType == 0xA1);\n      TU_VERIFY((request->wValue & (~0x7F)) == 0u);// Other bits are required to be zero (USB488v1.0 Table 11)\n      TU_VERIFY(bTag >= 0x02 && bTag <= 127);\n      TU_VERIFY(request->wIndex == usbtmc_state.itf_id);\n      TU_VERIFY(request->wLength == 0x0003);\n      rsp.bTag = (uint8_t) bTag;\n      if (usbtmc_state.ep_int_in != 0) {\n        rsp.statusByte = 0x00;// Use interrupt endpoint, instead. Must be 0x00 (USB488v1.0 4.3.1.2)\n        if (usbd_edpt_busy(rhport, usbtmc_state.ep_int_in)) {\n          rsp.USBTMC_status = USB488_STATUS_INTERRUPT_IN_BUSY;\n        } else {\n          rsp.USBTMC_status = USBTMC_STATUS_SUCCESS;\n          usbtmc_read_stb_interrupt_488_t intMsg =\n              {\n                  .bNotify1 = {\n                      .one = 1,\n                      .bTag = bTag & 0x7Fu,\n                  },\n                  .StatusByte = tud_usbtmc_get_stb_cb(&(rsp.USBTMC_status))};\n          // Must be queued before control request response sent (USB488v1.0 4.3.1.2)\n          usbd_edpt_xfer(rhport, usbtmc_state.ep_int_in, (void *) &intMsg, sizeof(intMsg), false);\n        }\n      } else {\n        rsp.statusByte = tud_usbtmc_get_stb_cb(&(rsp.USBTMC_status));\n      }\n      TU_VERIFY(tud_control_xfer(rhport, request, (void *) &rsp, sizeof(rsp)));\n      return true;\n    }\n      // USB488 optional requests\n    case USB488_bREQUEST_REN_CONTROL:\n    case USB488_bREQUEST_GO_TO_LOCAL:\n    case USB488_bREQUEST_LOCAL_LOCKOUT: {\n      TU_VERIFY(request->bmRequestType == 0xA1);// in,class,interface\n      return false;\n    }\n#endif\n\n    default:\n      return false;\n  }\n}\n\n#endif /* CFG_TUD_TSMC */\n"
  },
  {
    "path": "src/class/usbtmc/usbtmc_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 N Conrad\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n\n#ifndef CLASS_USBTMC_USBTMC_DEVICE_H_\n#define CLASS_USBTMC_USBTMC_DEVICE_H_\n\n#include \"usbtmc.h\"\n\n// Enable 488 mode by default\n#if !defined(CFG_TUD_USBTMC_ENABLE_488)\n#define CFG_TUD_USBTMC_ENABLE_488 (1)\n#endif\n\n/***********************************************\n *  Functions to be implemented by the class implementation\n */\n\n// In order to proceed, app must call call tud_usbtmc_start_bus_read(rhport) during or soon after:\n// * tud_usbtmc_open_cb\n// * tud_usbtmc_msg_data_cb\n// * tud_usbtmc_msgBulkIn_complete_cb\n// * tud_usbtmc_msg_trigger_cb\n// * (successful) tud_usbtmc_check_abort_bulk_out_cb\n// * (successful) tud_usbtmc_check_abort_bulk_in_cb\n// * (successful) tud_usmtmc_bulkOut_clearFeature_cb\n\n#if (CFG_TUD_USBTMC_ENABLE_488)\nusbtmc_response_capabilities_488_t const * tud_usbtmc_get_capabilities_cb(void);\n#else\nusbtmc_response_capabilities_t const * tud_usbtmc_get_capabilities_cb(void);\n#endif\n\nvoid tud_usbtmc_open_cb(uint8_t interface_id);\n\nbool tud_usbtmc_msgBulkOut_start_cb(usbtmc_msg_request_dev_dep_out const * msgHeader);\n// transfer_complete does not imply that a message is complete.\nbool tud_usbtmc_msg_data_cb( void *data, size_t len, bool transfer_complete);\nvoid tud_usbtmc_bulkOut_clearFeature_cb(void); // Notice to clear and abort the pending BULK out transfer\n\nbool tud_usbtmc_msgBulkIn_request_cb(usbtmc_msg_request_dev_dep_in const * request);\nbool tud_usbtmc_msgBulkIn_complete_cb(void);\nvoid tud_usbtmc_bulkIn_clearFeature_cb(void); // Notice to clear and abort the pending BULK out transfer\n\nbool tud_usbtmc_initiate_abort_bulk_in_cb(uint8_t *tmcResult);\nbool tud_usbtmc_initiate_abort_bulk_out_cb(uint8_t *tmcResult);\nbool tud_usbtmc_initiate_clear_cb(uint8_t *tmcResult);\n\nbool tud_usbtmc_check_abort_bulk_in_cb(usbtmc_check_abort_bulk_rsp_t *rsp);\nbool tud_usbtmc_check_abort_bulk_out_cb(usbtmc_check_abort_bulk_rsp_t *rsp);\nbool tud_usbtmc_check_clear_cb(usbtmc_get_clear_status_rsp_t *rsp);\n\n// The interrupt-IN endpoint buffer was transmitted to the host. Use\n// tud_usbtmc_transmit_notification_data to send another notification.\nbool tud_usbtmc_notification_complete_cb(void);\n\n// Indicator pulse should be 0.5 to 1.0 seconds long\nbool tud_usbtmc_indicator_pulse_cb(tusb_control_request_t const * msg, uint8_t *tmcResult);\n\n#if (CFG_TUD_USBTMC_ENABLE_488)\nuint8_t tud_usbtmc_get_stb_cb(uint8_t *tmcResult);\nbool tud_usbtmc_msg_trigger_cb(usbtmc_msg_generic_t* msg);\n#endif\n\n// Called from app\n//\n// We keep a reference to the buffer, so it MUST not change until the app is\n// notified that the transfer is complete.\nbool tud_usbtmc_transmit_dev_msg_data(\n    const void * data, size_t len,\n    bool endOfMessage, bool usingTermChar);\n\n// Buffers a notification to be sent to the host. The data starts\n// with the bNotify1 field, see the USBTMC Specification, Table 13.\n//\n// If the previous notification data has not yet been sent, this\n// returns false.\n//\n// Requires an interrupt endpoint in the interface.\nbool tud_usbtmc_transmit_notification_data(const void * data, size_t len);\n\nbool tud_usbtmc_start_bus_read(void);\n\n\n/* \"callbacks\" from USB device core */\n\nvoid     usbtmcd_init_cb(void);\nbool     usbtmcd_deinit(void);\nuint16_t usbtmcd_open_cb(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nvoid     usbtmcd_reset_cb(uint8_t rhport);\nbool     usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\nbool     usbtmcd_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\n\n#endif /* CLASS_USBTMC_USBTMC_DEVICE_H_ */\n"
  },
  {
    "path": "src/class/vendor/vendor_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_VENDOR)\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"vendor_device.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t rhport;\n  uint8_t itf_num;\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n  /*------------- From this point, data is not cleared by bus reset -------------*/\n  tu_edpt_stream_t tx_stream;\n  tu_edpt_stream_t rx_stream;\n  uint8_t          tx_ff_buf[CFG_TUD_VENDOR_TX_BUFSIZE];\n  uint8_t          rx_ff_buf[CFG_TUD_VENDOR_RX_BUFSIZE];\n  #else\n  uint8_t  ep_in;\n  uint8_t  ep_out;\n  uint16_t rx_xfer_len;\n  #endif\n} vendord_interface_t;\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n    #define ITF_MEM_RESET_SIZE (offsetof(vendord_interface_t, itf_num) + TU_FIELD_SIZE(vendord_interface_t, itf_num))\n  #else\n    #define ITF_MEM_RESET_SIZE sizeof(vendord_interface_t)\n  #endif\n\nstatic vendord_interface_t _vendord_itf[CFG_TUD_VENDOR];\n\n// Skip local EP buffer if dedicated hw FIFO is supported or no fifo mode\n#if CFG_TUD_EDPT_DEDICATED_HWFIFO == 0 || !CFG_TUD_VENDOR_TXRX_BUFFERED\ntypedef struct {\n  TUD_EPBUF_DEF(epout, CFG_TUD_VENDOR_RX_EPSIZE);\n  TUD_EPBUF_DEF(epin, CFG_TUD_VENDOR_TX_EPSIZE);\n} vendord_epbuf_t;\n\nCFG_TUD_MEM_SECTION static vendord_epbuf_t _vendord_epbuf[CFG_TUD_VENDOR];\n#endif\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_vendor_rx_cb(uint8_t idx, const uint8_t *buffer, uint32_t bufsize) {\n  (void)idx;\n  (void)buffer;\n  (void)bufsize;\n}\n\nTU_ATTR_WEAK void tud_vendor_tx_cb(uint8_t idx, uint32_t sent_bytes) {\n  (void)idx;\n  (void) sent_bytes;\n}\n\nbool tud_vendor_n_mounted(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n  return (p_itf->rx_stream.ep_addr != 0) || (p_itf->tx_stream.ep_addr != 0);\n  #else\n  return (p_itf->ep_out != 0) || (p_itf->ep_in != 0);\n  #endif\n}\n\n//--------------------------------------------------------------------+\n// Read API\n//--------------------------------------------------------------------+\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\nuint32_t tud_vendor_n_available(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR, 0);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n  return tu_edpt_stream_read_available(&p_itf->rx_stream);\n}\n\nbool tud_vendor_n_peek(uint8_t idx, uint8_t *u8) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n  return tu_edpt_stream_peek(&p_itf->rx_stream, u8);\n}\n\nuint32_t tud_vendor_n_read(uint8_t idx, void *buffer, uint32_t bufsize) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR, 0);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n  return tu_edpt_stream_read(&p_itf->rx_stream, buffer, bufsize);\n}\n\nvoid tud_vendor_n_read_flush(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR, );\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n  tu_edpt_stream_clear(&p_itf->rx_stream);\n  tu_edpt_stream_read_xfer(&p_itf->rx_stream);\n}\n  #endif\n\n  #if CFG_TUD_VENDOR_RX_MANUAL_XFER\nbool tud_vendor_n_read_xfer(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n\n    #if CFG_TUD_VENDOR_TXRX_BUFFERED\n  return tu_edpt_stream_read_xfer(&p_itf->rx_stream);\n\n    #else\n  // Non-FIFO mode\n  TU_VERIFY(usbd_edpt_claim(p_itf->rhport, p_itf->ep_out));\n  return usbd_edpt_xfer(p_itf->rhport, p_itf->ep_out, _vendord_epbuf[idx].epout, p_itf->rx_xfer_len, false);\n    #endif\n}\n  #endif\n\n\n//--------------------------------------------------------------------+\n// Write API\n//--------------------------------------------------------------------+\nuint32_t tud_vendor_n_write(uint8_t idx, const void *buffer, uint32_t bufsize) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR, 0);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n  return tu_edpt_stream_write(&p_itf->tx_stream, buffer, (uint16_t)bufsize);\n\n  #else\n  // non-fifo mode: direct transfer\n  TU_VERIFY(usbd_edpt_claim(p_itf->rhport, p_itf->ep_in), 0);\n  const uint32_t xact_len = tu_min32(bufsize, CFG_TUD_VENDOR_TX_EPSIZE);\n  memcpy(_vendord_epbuf[idx].epin, buffer, xact_len);\n  TU_ASSERT(usbd_edpt_xfer(p_itf->rhport, p_itf->ep_in, _vendord_epbuf[idx].epin, (uint16_t)xact_len, false), 0);\n  return xact_len;\n  #endif\n}\n\nuint32_t tud_vendor_n_write_available(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR, 0);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n  return tu_edpt_stream_write_available(&p_itf->tx_stream);\n\n  #else\n  // Non-FIFO mode\n  TU_VERIFY(p_itf->ep_in > 0, 0); // must be opened\n  return usbd_edpt_busy(p_itf->rhport, p_itf->ep_in) ? 0 : CFG_TUD_VENDOR_TX_EPSIZE;\n  #endif\n}\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\nuint32_t tud_vendor_n_write_flush(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR, 0);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n  return tu_edpt_stream_write_xfer(&p_itf->tx_stream);\n}\n\nbool tud_vendor_n_write_clear(uint8_t idx) {\n  TU_VERIFY(idx < CFG_TUD_VENDOR, 0);\n  vendord_interface_t *p_itf = &_vendord_itf[idx];\n  tu_edpt_stream_clear(&p_itf->tx_stream);\n  return true;\n}\n#endif\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid vendord_init(void) {\n  tu_memclr(_vendord_itf, sizeof(_vendord_itf));\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n  for (uint8_t i = 0; i < CFG_TUD_VENDOR; i++) {\n    vendord_interface_t *p_itf = &_vendord_itf[i];\n\n    #if CFG_TUD_EDPT_DEDICATED_HWFIFO\n    uint8_t *epout_buf = NULL;\n    uint8_t *epin_buf  = NULL;\n    #else\n    uint8_t *epout_buf = _vendord_epbuf[i].epout;\n    uint8_t *epin_buf  = _vendord_epbuf[i].epin;\n    #endif\n\n    uint8_t *rx_ff_buf = p_itf->rx_ff_buf;\n    tu_edpt_stream_init(&p_itf->rx_stream, false, false, false, rx_ff_buf, CFG_TUD_VENDOR_RX_BUFSIZE, epout_buf);\n\n    uint8_t *tx_ff_buf = p_itf->tx_ff_buf;\n    tu_edpt_stream_init(&p_itf->tx_stream, false, true, false, tx_ff_buf, CFG_TUD_VENDOR_TX_BUFSIZE, epin_buf);\n  }\n  #endif\n}\n\nbool vendord_deinit(void) {\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n  for (uint8_t i = 0; i < CFG_TUD_VENDOR; i++) {\n    vendord_interface_t *p_itf = &_vendord_itf[i];\n    tu_edpt_stream_deinit(&p_itf->rx_stream);\n    tu_edpt_stream_deinit(&p_itf->tx_stream);\n  }\n  #endif\n  return true;\n}\n\nvoid vendord_reset(uint8_t rhport) {\n  (void) rhport;\n\n  for(uint8_t i=0; i<CFG_TUD_VENDOR; i++) {\n    vendord_interface_t* p_itf = &_vendord_itf[i];\n    tu_memclr(p_itf, ITF_MEM_RESET_SIZE);\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n    tu_edpt_stream_clear(&p_itf->rx_stream);\n    tu_edpt_stream_close(&p_itf->rx_stream);\n    tu_edpt_stream_clear(&p_itf->tx_stream);\n    tu_edpt_stream_close(&p_itf->tx_stream);\n  #endif\n  }\n}\n\n// Find vendor interface by endpoint address\nstatic uint8_t find_vendor_itf(uint8_t ep_addr) {\n  for (uint8_t idx = 0; idx < CFG_TUD_VENDOR; idx++) {\n    const vendord_interface_t *p_vendor = &_vendord_itf[idx];\n    if (ep_addr == 0) {\n      // find unused: require both ep == 0\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n      if (p_vendor->rx_stream.ep_addr == 0 && p_vendor->tx_stream.ep_addr == 0) {\n        return idx;\n      }\n  #else\n      if (p_vendor->ep_out == 0 && p_vendor->ep_in == 0) {\n        return idx;\n      }\n  #endif\n    } else {\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n      if (ep_addr == p_vendor->rx_stream.ep_addr || ep_addr == p_vendor->tx_stream.ep_addr) {\n        return idx;\n      }\n  #else\n      if (ep_addr == p_vendor->ep_out || ep_addr == p_vendor->ep_in) {\n        return idx;\n      }\n  #endif\n    }\n  }\n  return 0xff;\n}\n\nuint16_t vendord_open(uint8_t rhport, const tusb_desc_interface_t *desc_itf, uint16_t max_len) {\n  TU_VERIFY(TUSB_CLASS_VENDOR_SPECIFIC == desc_itf->bInterfaceClass, 0);\n  const uint8_t* desc_end = (const uint8_t*)desc_itf + max_len;\n  const uint8_t* p_desc = tu_desc_next(desc_itf);\n\n  // Find available interface\n  const uint8_t idx = find_vendor_itf(0);\n  TU_ASSERT(idx < CFG_TUD_VENDOR, 0);\n  vendord_interface_t *p_vendor = &_vendord_itf[idx];\n  p_vendor->rhport  = rhport;\n  p_vendor->itf_num = desc_itf->bInterfaceNumber;\n\n  while (tu_desc_in_bounds(p_desc, desc_end)) {\n    const uint8_t desc_type = tu_desc_type(p_desc);\n    if (desc_type == TUSB_DESC_INTERFACE || desc_type == TUSB_DESC_INTERFACE_ASSOCIATION) {\n      break; // end of this interface\n    } else if (desc_type == TUSB_DESC_ENDPOINT) {\n      const tusb_desc_endpoint_t* desc_ep = (const tusb_desc_endpoint_t*) p_desc;\n      TU_ASSERT(usbd_edpt_open(rhport, desc_ep));\n\n      uint16_t rx_xfer_len = CFG_TUD_VENDOR_RX_NEED_ZLP ? CFG_TUD_VENDOR_RX_EPSIZE : tu_edpt_packet_size(desc_ep);\n\n  #if CFG_TUD_VENDOR_TXRX_BUFFERED\n      // open endpoint stream\n      if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN) {\n        tu_edpt_stream_t *tx_stream = &p_vendor->tx_stream;\n        tu_edpt_stream_open(tx_stream, rhport, desc_ep, CFG_TUD_VENDOR_TX_EPSIZE);\n        tu_edpt_stream_write_xfer(tx_stream); // flush pending data\n      } else {\n        tu_edpt_stream_t *rx_stream = &p_vendor->rx_stream;\n        tu_edpt_stream_open(rx_stream, rhport, desc_ep, rx_xfer_len);\n    #if CFG_TUD_VENDOR_RX_MANUAL_XFER == 0\n        TU_ASSERT(tu_edpt_stream_read_xfer(rx_stream) > 0, 0); // prepare for incoming data\n    #endif\n      }\n  #else\n      p_vendor->rx_xfer_len = rx_xfer_len;\n      // Non-FIFO mode: store endpoint info\n      if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN) {\n        p_vendor->ep_in     = desc_ep->bEndpointAddress;\n      } else {\n        p_vendor->ep_out     = desc_ep->bEndpointAddress;\n    #if CFG_TUD_VENDOR_RX_MANUAL_XFER == 0\n        // Prepare for incoming data\n        TU_ASSERT(usbd_edpt_xfer(rhport, p_vendor->ep_out, _vendord_epbuf[idx].epout, rx_xfer_len, false), 0);\n    #endif\n      }\n  #endif\n    }\n\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  return (uint16_t)((uintptr_t)p_desc - (uintptr_t)desc_itf);\n}\n\nbool vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void)rhport;\n  (void)result;\n  const uint8_t idx = find_vendor_itf(ep_addr);\n  TU_VERIFY(idx < CFG_TUD_VENDOR);\n  vendord_interface_t *p_vendor = &_vendord_itf[idx];\n\n#if CFG_TUD_VENDOR_TXRX_BUFFERED\n  if (ep_addr == p_vendor->rx_stream.ep_addr) {\n    // Put received data to FIFO\n    tu_edpt_stream_read_xfer_complete(&p_vendor->rx_stream, xferred_bytes);\n    tud_vendor_rx_cb(idx, NULL, 0);\n    #if CFG_TUD_VENDOR_RX_MANUAL_XFER == 0\n    tu_edpt_stream_read_xfer(&p_vendor->rx_stream); // prepare next data\n    #endif\n  } else if (ep_addr == p_vendor->tx_stream.ep_addr) {\n    // Send complete\n    tud_vendor_tx_cb(idx, (uint16_t)xferred_bytes);\n\n    // try to send more if possible\n    if (0 == tu_edpt_stream_write_xfer(&p_vendor->tx_stream)) {\n      // If there is no data left, a ZLP should be sent if xferred_bytes is multiple of EP Packet size and not zero\n      tu_edpt_stream_write_zlp_if_needed(&p_vendor->tx_stream, xferred_bytes);\n    }\n  }\n  #else\n  if (ep_addr == p_vendor->ep_out) {\n    // Non-FIFO mode: invoke callback with buffer\n    tud_vendor_rx_cb(idx, _vendord_epbuf[idx].epout, xferred_bytes);\n    #if CFG_TUD_VENDOR_RX_MANUAL_XFER == 0\n    usbd_edpt_xfer(rhport, p_vendor->ep_out, _vendord_epbuf[idx].epout, p_vendor->rx_xfer_len, false);\n    #endif\n  } else if (ep_addr == p_vendor->ep_in) {\n    // Send complete\n    tud_vendor_tx_cb(idx, (uint16_t)xferred_bytes);\n  }\n  #endif\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/vendor/vendor_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_VENDOR_DEVICE_H_\n#define TUSB_VENDOR_DEVICE_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"common/tusb_common.h\"\n\n//--------------------------------------------------------------------+\n// Configuration\n//--------------------------------------------------------------------+\n#ifndef CFG_TUD_VENDOR_RX_EPSIZE\n  #ifdef CFG_TUD_VENDOR_EPSIZE\n    #define CFG_TUD_VENDOR_RX_EPSIZE CFG_TUD_VENDOR_EPSIZE\n  #else\n    #define CFG_TUD_VENDOR_RX_EPSIZE TUD_EPSIZE_BULK_MAX\n  #endif\n#endif\n\n#ifndef CFG_TUD_VENDOR_TX_EPSIZE\n  #ifdef CFG_TUD_VENDOR_EPSIZE\n    #define CFG_TUD_VENDOR_TX_EPSIZE CFG_TUD_VENDOR_EPSIZE\n  #else\n    #define CFG_TUD_VENDOR_TX_EPSIZE TUD_EPSIZE_BULK_MAX\n  #endif\n#endif\n\n// RX FIFO can be disabled by setting this value to 0\n#ifndef CFG_TUD_VENDOR_RX_BUFSIZE\n  #define CFG_TUD_VENDOR_RX_BUFSIZE TUD_EPSIZE_BULK_MAX\n#endif\n\n// TX FIFO can be disabled by setting this value to 0\n#ifndef CFG_TUD_VENDOR_TX_BUFSIZE\n  #define CFG_TUD_VENDOR_TX_BUFSIZE TUD_EPSIZE_BULK_MAX\n#endif\n\n// Vendor is buffered (FIFO mode) if both TX and RX buffers are configured\n// If either is 0, vendor operates in non-buffered (direct transfer) mode\n#ifndef CFG_TUD_VENDOR_TXRX_BUFFERED\n  #define CFG_TUD_VENDOR_TXRX_BUFFERED ((CFG_TUD_VENDOR_RX_BUFSIZE > 0) && (CFG_TUD_VENDOR_TX_BUFSIZE > 0))\n#endif\n\n// Application will manually schedule RX transfer. This can be useful when using with non-fifo (buffered) mode\n// i.e. CFG_TUD_VENDOR_TXRX_BUFFERED = 0\n#ifndef CFG_TUD_VENDOR_RX_MANUAL_XFER\n  #define CFG_TUD_VENDOR_RX_MANUAL_XFER 0\n#endif\n\n// Enable multi-packet RX transfer with ZLP termination for better throughput. Requires host support for ZLP.\n#ifndef CFG_TUD_VENDOR_RX_NEED_ZLP\n  #define CFG_TUD_VENDOR_RX_NEED_ZLP 0\n#endif\n\n//--------------------------------------------------------------------+\n// Application API (Multiple Interfaces) i.e CFG_TUD_VENDOR > 1\n//--------------------------------------------------------------------+\n\n// Return whether the vendor interface is mounted\nbool tud_vendor_n_mounted(uint8_t idx);\n\n//------------- RX -------------//\n#if CFG_TUD_VENDOR_TXRX_BUFFERED\n// Return number of available bytes for reading\nuint32_t tud_vendor_n_available(uint8_t idx);\n\n// Peek a byte from RX buffer\nbool tud_vendor_n_peek(uint8_t idx, uint8_t *ui8);\n\n// Read from RX FIFO\nuint32_t tud_vendor_n_read(uint8_t idx, void *buffer, uint32_t bufsize);\n\n// Flush (clear) RX FIFO\nvoid tud_vendor_n_read_flush(uint8_t idx);\n#endif\n\n#if CFG_TUD_VENDOR_RX_MANUAL_XFER\n// Start a new RX transfer to fill the RX FIFO, return false if previous transfer is still ongoing\nbool tud_vendor_n_read_xfer(uint8_t idx);\n#endif\n\n//------------- TX -------------//\n// Write to TX FIFO. This can be buffered and not sent immediately unless buffered bytes >= USB endpoint size\nuint32_t tud_vendor_n_write(uint8_t idx, const void *buffer, uint32_t bufsize);\n\n// Return number of bytes available for writing in TX FIFO (or endpoint if non-buffered)\nuint32_t tud_vendor_n_write_available(uint8_t idx);\n\n#if CFG_TUD_VENDOR_TXRX_BUFFERED\n// Force sending buffered data, return number of bytes sent\nuint32_t tud_vendor_n_write_flush(uint8_t idx);\n\n// Clear the transmit FIFO\nbool tud_vendor_n_write_clear(uint8_t idx);\n#endif\n\n// Write a null-terminated string to TX FIFO\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_n_write_str(uint8_t idx, const char *str) {\n  return tud_vendor_n_write(idx, str, strlen(str));\n}\n\n// backward compatible\n#define tud_vendor_n_flush(idx) tud_vendor_n_write_flush(idx)\n\n//--------------------------------------------------------------------+\n// Application API (Single Port) i.e CFG_TUD_VENDOR = 1\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline bool tud_vendor_mounted(void) {\n  return tud_vendor_n_mounted(0);\n}\n\n#if CFG_TUD_VENDOR_TXRX_BUFFERED\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_available(void) {\n  return tud_vendor_n_available(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_vendor_peek(uint8_t *ui8) {\n  return tud_vendor_n_peek(0, ui8);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_read(void *buffer, uint32_t bufsize) {\n  return tud_vendor_n_read(0, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tud_vendor_read_flush(void) {\n  tud_vendor_n_read_flush(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_write_flush(void) {\n  return tud_vendor_n_write_flush(0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tud_vendor_write_clear(void) {\n  return tud_vendor_n_write_clear(0);\n}\n#endif\n\n#if CFG_TUD_VENDOR_RX_MANUAL_XFER\nTU_ATTR_ALWAYS_INLINE static inline bool tud_vendor_read_xfer(void) {\n  return tud_vendor_n_read_xfer(0);\n}\n#endif\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_write(const void *buffer, uint32_t bufsize) {\n  return tud_vendor_n_write(0, buffer, bufsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_write_str(const char *str) {\n  return tud_vendor_n_write_str(0, str);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tud_vendor_write_available(void) {\n  return tud_vendor_n_write_available(0);\n}\n\n// backward compatible\n#define tud_vendor_flush() tud_vendor_write_flush()\n\n//--------------------------------------------------------------------+\n// Application Callback API (weak is optional)\n//--------------------------------------------------------------------+\n\n// Invoked when received new data.\n// - CFG_TUD_VENDOR_TXRX_BUFFERED = 1: buffer and bufsize must not be used (both NULL,0) since data is in RX FIFO\n// - CFG_TUD_VENDOR_TXRX_BUFFERED = 0: Buffer and bufsize are valid\nvoid tud_vendor_rx_cb(uint8_t idx, const uint8_t *buffer, uint32_t bufsize);\n\n// Invoked when tx transfer is finished\nvoid tud_vendor_tx_cb(uint8_t idx, uint32_t sent_bytes);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid     vendord_init(void);\nbool     vendord_deinit(void);\nvoid     vendord_reset(uint8_t rhport);\nuint16_t vendord_open(uint8_t rhport, const tusb_desc_interface_t *idx_desc, uint16_t max_len);\nbool     vendord_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_VENDOR_DEVICE_H_ */\n"
  },
  {
    "path": "src/class/vendor/vendor_host.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUH_ENABLED && CFG_TUH_VENDOR)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"host/usbh.h\"\n#include \"vendor_host.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\ncustom_interface_info_t custom_interface[CFG_TUH_DEVICE_MAX];\n\nstatic tusb_error_t cush_validate_paras(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void * p_buffer, uint16_t length)\n{\n  if ( !tusbh_custom_is_mounted(dev_addr, vendor_id, product_id) )\n  {\n    return TUSB_ERROR_DEVICE_NOT_READY;\n  }\n\n  TU_ASSERT( p_buffer != NULL && length != 0, TUSB_ERROR_INVALID_PARA);\n\n  return TUSB_ERROR_NONE;\n}\n//--------------------------------------------------------------------+\n// APPLICATION API (need to check parameters)\n//--------------------------------------------------------------------+\ntusb_error_t tusbh_custom_read(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void * p_buffer, uint16_t length)\n{\n  TU_ASSERT_ERR( cush_validate_paras(dev_addr, vendor_id, product_id, p_buffer, length) );\n\n  if ( !hcd_pipe_is_idle(custom_interface[dev_addr-1].pipe_in) )\n  {\n    return TUSB_ERROR_INTERFACE_IS_BUSY;\n  }\n\n  (void) usbh_edpt_xfer( custom_interface[dev_addr-1].pipe_in, p_buffer, length);\n\n  return TUSB_ERROR_NONE;\n}\n\ntusb_error_t tusbh_custom_write(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void const * p_data, uint16_t length)\n{\n  TU_ASSERT_ERR( cush_validate_paras(dev_addr, vendor_id, product_id, p_data, length) );\n\n  if ( !hcd_pipe_is_idle(custom_interface[dev_addr-1].pipe_out) )\n  {\n    return TUSB_ERROR_INTERFACE_IS_BUSY;\n  }\n\n  (void) usbh_edpt_xfer( custom_interface[dev_addr-1].pipe_out, p_data, length);\n\n  return TUSB_ERROR_NONE;\n}\n\n//--------------------------------------------------------------------+\n// USBH-CLASS API\n//--------------------------------------------------------------------+\nvoid cush_init(void)\n{\n  tu_memclr(&custom_interface, sizeof(custom_interface_info_t) * CFG_TUH_DEVICE_MAX);\n}\n\ntusb_error_t cush_open_subtask(uint8_t dev_addr, tusb_desc_interface_t const *p_interface_desc, uint16_t *p_length)\n{\n  // FIXME quick hack to test lpc1k custom class with 2 bulk endpoints\n  uint8_t const *p_desc = (uint8_t const *) p_interface_desc;\n  p_desc = tu_desc_next(p_desc);\n\n  //------------- Bulk Endpoints Descriptor -------------//\n  for(uint32_t i=0; i<2; i++)\n  {\n    tusb_desc_endpoint_t const *p_endpoint = (tusb_desc_endpoint_t const *) p_desc;\n    TU_ASSERT(TUSB_DESC_ENDPOINT == p_endpoint->bDescriptorType, TUSB_ERROR_INVALID_PARA);\n\n    pipe_handle_t * p_pipe_hdl =  ( p_endpoint->bEndpointAddress &  TUSB_DIR_IN_MASK ) ?\n                         &custom_interface[dev_addr-1].pipe_in : &custom_interface[dev_addr-1].pipe_out;\n    *p_pipe_hdl = usbh_edpt_open(dev_addr, p_endpoint, TUSB_CLASS_VENDOR_SPECIFIC);\n    TU_ASSERT ( pipehandle_is_valid(*p_pipe_hdl), TUSB_ERROR_HCD_OPEN_PIPE_FAILED );\n\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  (*p_length) = sizeof(tusb_desc_interface_t) + 2*sizeof(tusb_desc_endpoint_t);\n  return TUSB_ERROR_NONE;\n}\n\nvoid cush_isr(pipe_handle_t pipe_hdl, xfer_result_t event)\n{\n\n}\n\nvoid cush_close(uint8_t dev_addr)\n{\n  tusb_error_t err1, err2;\n  custom_interface_info_t * p_interface = &custom_interface[dev_addr-1];\n\n  // TODO re-consider to check pipe valid before calling pipe_close\n  if( pipehandle_is_valid( p_interface->pipe_in ) )\n  {\n    err1 = hcd_pipe_close( p_interface->pipe_in );\n  }\n\n  if ( pipehandle_is_valid( p_interface->pipe_out ) )\n  {\n    err2 = hcd_pipe_close( p_interface->pipe_out );\n  }\n\n  tu_memclr(p_interface, sizeof(custom_interface_info_t));\n\n  TU_ASSERT(err1 == TUSB_ERROR_NONE && err2 == TUSB_ERROR_NONE, (void) 0 );\n}\n\n#endif\n"
  },
  {
    "path": "src/class/vendor/vendor_host.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_VENDOR_HOST_H_\n#define TUSB_VENDOR_HOST_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\ntypedef struct {\n  pipe_handle_t pipe_in;\n  pipe_handle_t pipe_out;\n}custom_interface_info_t;\n\n//--------------------------------------------------------------------+\n// USBH-CLASS DRIVER API\n//--------------------------------------------------------------------+\nstatic inline bool tusbh_custom_is_mounted(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id)\n{\n  (void) vendor_id; // TODO check this later\n  (void) product_id;\n//  return (tusbh_device_get_mounted_class_flag(dev_addr) & TU_BIT(TUSB_CLASS_MAPPED_INDEX_END-1) ) != 0;\n  return false;\n}\n\nbool tusbh_custom_read(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void * p_buffer, uint16_t length);\nbool tusbh_custom_write(uint8_t dev_addr, uint16_t vendor_id, uint16_t product_id, void const * p_data, uint16_t length);\n\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nvoid cush_init(void);\nbool cush_open_subtask(uint8_t dev_addr, tusb_desc_interface_t const *p_interface_desc, uint16_t *p_length);\nvoid cush_isr(pipe_handle_t pipe_hdl, xfer_result_t event);\nvoid cush_close(uint8_t dev_addr);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_VENDOR_HOST_H_ */\n"
  },
  {
    "path": "src/class/video/video.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Koji KITAYAMA\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_VIDEO_H_\n#define TUSB_VIDEO_H_\n\n#include \"common/tusb_common.h\"\n\nenum {\n  VIDEO_BCD_1_50 = 0x0150,\n};\n\n// Table 3-19 Color Matching Descriptor\ntypedef enum {\n  VIDEO_COLOR_PRIMARIES_UNDEFINED = 0x00,\n  VIDEO_COLOR_PRIMARIES_BT709, // sRGB (default)\n  VIDEO_COLOR_PRIMARIES_BT470_2M,\n  VIDEO_COLOR_PRIMARIES_BT470_2BG,\n  VIDEO_COLOR_PRIMARIES_SMPTE170M,\n  VIDEO_COLOR_PRIMARIES_SMPTE240M,\n} video_color_primaries_t;\n\n// Table 3-19 Color Matching Descriptor\ntypedef enum {\n  VIDEO_COLOR_XFER_CH_UNDEFINED = 0x00,\n  VIDEO_COLOR_XFER_CH_BT709, // default\n  VIDEO_COLOR_XFER_CH_BT470_2M,\n  VIDEO_COLOR_XFER_CH_BT470_2BG,\n  VIDEO_COLOR_XFER_CH_SMPTE170M,\n  VIDEO_COLOR_XFER_CH_SMPTE240M,\n  VIDEO_COLOR_XFER_CH_LINEAR,\n  VIDEO_COLOR_XFER_CH_SRGB,\n} video_color_transfer_characteristics_t;\n\n// Table 3-19 Color Matching Descriptor\ntypedef enum {\n  VIDEO_COLOR_COEF_UNDEFINED = 0x00,\n  VIDEO_COLOR_COEF_BT709,\n  VIDEO_COLOR_COEF_FCC,\n  VIDEO_COLOR_COEF_BT470_2BG,\n  VIDEO_COLOR_COEF_SMPTE170M, // BT.601 default\n  VIDEO_COLOR_COEF_SMPTE240M,\n} video_color_matrix_coefficients_t;\n\n/* 4.2.1.2 Request Error Code Control */\ntypedef enum {\n  VIDEO_ERROR_NONE = 0, /* The request succeeded. */\n  VIDEO_ERROR_NOT_READY,\n  VIDEO_ERROR_WRONG_STATE,\n  VIDEO_ERROR_POWER,\n  VIDEO_ERROR_OUT_OF_RANGE,\n  VIDEO_ERROR_INVALID_UNIT,\n  VIDEO_ERROR_INVALID_CONTROL,\n  VIDEO_ERROR_INVALID_REQUEST,\n  VIDEO_ERROR_INVALID_VALUE_WITHIN_RANGE,\n  VIDEO_ERROR_UNKNOWN = 0xFF,\n} video_error_code_t;\n\n/* A.2 Interface Subclass */\ntypedef enum {\n  VIDEO_SUBCLASS_UNDEFINED = 0x00,\n  VIDEO_SUBCLASS_CONTROL,\n  VIDEO_SUBCLASS_STREAMING,\n  VIDEO_SUBCLASS_INTERFACE_COLLECTION,\n} video_subclass_type_t;\n\n/* A.3 Interface Protocol */\ntypedef enum {\n  VIDEO_ITF_PROTOCOL_UNDEFINED = 0x00,\n  VIDEO_ITF_PROTOCOL_15,\n} video_interface_protocol_code_t;\n\n/* A.5 Class-Specific VideoControl Interface Descriptor Subtypes */\ntypedef enum {\n  VIDEO_CS_ITF_VC_UNDEFINED = 0x00,\n  VIDEO_CS_ITF_VC_HEADER,\n  VIDEO_CS_ITF_VC_INPUT_TERMINAL,\n  VIDEO_CS_ITF_VC_OUTPUT_TERMINAL,\n  VIDEO_CS_ITF_VC_SELECTOR_UNIT,\n  VIDEO_CS_ITF_VC_PROCESSING_UNIT,\n  VIDEO_CS_ITF_VC_EXTENSION_UNIT,\n  VIDEO_CS_ITF_VC_ENCODING_UNIT,\n  VIDEO_CS_ITF_VC_MAX,\n} video_cs_vc_interface_subtype_t;\n\n/* A.6 Class-Specific VideoStreaming Interface Descriptor Subtypes */\ntypedef enum {\n  VIDEO_CS_ITF_VS_UNDEFINED             = 0x00,\n  VIDEO_CS_ITF_VS_INPUT_HEADER          = 0x01,\n  VIDEO_CS_ITF_VS_OUTPUT_HEADER         = 0x02,\n  VIDEO_CS_ITF_VS_STILL_IMAGE_FRAME     = 0x03,\n  VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED   = 0x04,\n  VIDEO_CS_ITF_VS_FRAME_UNCOMPRESSED    = 0x05,\n  VIDEO_CS_ITF_VS_FORMAT_MJPEG          = 0x06,\n  VIDEO_CS_ITF_VS_FRAME_MJPEG           = 0x07,\n  VIDEO_CS_ITF_VS_FORMAT_MPEG2TS        = 0x0A,\n  VIDEO_CS_ITF_VS_FORMAT_DV             = 0x0C,\n  VIDEO_CS_ITF_VS_COLORFORMAT           = 0x0D,\n  VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED    = 0x10,\n  VIDEO_CS_ITF_VS_FRAME_FRAME_BASED     = 0x11,\n  VIDEO_CS_ITF_VS_FORMAT_STREAM_BASED   = 0x12,\n  VIDEO_CS_ITF_VS_FORMAT_H264           = 0x13,\n  VIDEO_CS_ITF_VS_FRAME_H264            = 0x14,\n  VIDEO_CS_ITF_VS_FORMAT_H264_SIMULCAST = 0x15,\n  VIDEO_CS_ITF_VS_FORMAT_VP8            = 0x16,\n  VIDEO_CS_ITF_VS_FRAME_VP8             = 0x17,\n  VIDEO_CS_ITF_VS_FORMAT_VP8_SIMULCAST  = 0x18,\n} video_cs_vs_interface_subtype_t;\n\n/* A.7. Class-Specific Endpoint Descriptor Subtypes */\ntypedef enum {\n  VIDEO_CS_EP_UNDEFINED = 0x00,\n  VIDEO_CS_EP_GENERAL,\n  VIDEO_CS_EP_ENDPOINT,\n  VIDEO_CS_EP_INTERRUPT\n} video_cs_ep_subtype_t;\n\n/* A.8 Class-Specific Request Codes */\ntypedef enum {\n  VIDEO_REQUEST_UNDEFINED   = 0x00,\n  VIDEO_REQUEST_SET_CUR     = 0x01,\n  VIDEO_REQUEST_SET_CUR_ALL = 0x11,\n  VIDEO_REQUEST_GET_CUR     = 0x81,\n  VIDEO_REQUEST_GET_MIN     = 0x82,\n  VIDEO_REQUEST_GET_MAX     = 0x83,\n  VIDEO_REQUEST_GET_RES     = 0x84,\n  VIDEO_REQUEST_GET_LEN     = 0x85,\n  VIDEO_REQUEST_GET_INFO    = 0x86,\n  VIDEO_REQUEST_GET_DEF     = 0x87,\n  VIDEO_REQUEST_GET_CUR_ALL = 0x91,\n  VIDEO_REQUEST_GET_MIN_ALL = 0x92,\n  VIDEO_REQUEST_GET_MAX_ALL = 0x93,\n  VIDEO_REQUEST_GET_RES_ALL = 0x94,\n  VIDEO_REQUEST_GET_DEF_ALL = 0x97\n} video_control_request_t;\n\n/* A.9.1 VideoControl Interface Control Selectors */\ntypedef enum {\n  VIDEO_VC_CTL_UNDEFINED = 0x00,\n  VIDEO_VC_CTL_VIDEO_POWER_MODE,   // 0x01\n  VIDEO_VC_CTL_REQUEST_ERROR_CODE, // 0x02\n} video_interface_control_selector_t;\n\n/* A.9.8 VideoStreaming Interface Control Selectors */\ntypedef enum {\n  VIDEO_VS_CTL_UNDEFINED = 0x00,\n  VIDEO_VS_CTL_PROBE,                // 0x01\n  VIDEO_VS_CTL_COMMIT,               // 0x02\n  VIDEO_VS_CTL_STILL_PROBE,          // 0x03\n  VIDEO_VS_CTL_STILL_COMMIT,         // 0x04\n  VIDEO_VS_CTL_STILL_IMAGE_TRIGGER,  // 0x05\n  VIDEO_VS_CTL_STREAM_ERROR_CODE,    // 0x06\n  VIDEO_VS_CTL_GENERATE_KEY_FRAME,   // 0x07\n  VIDEO_VS_CTL_UPDATE_FRAME_SEGMENT, // 0x08\n  VIDEO_VS_CTL_SYNCH_DELAY_CONTROL,  // 0x09\n\n} video_interface_streaming_selector_t;\n\n/* B. Terminal Types */\ntypedef enum {\n  // Terminal\n  VIDEO_TT_VENDOR_SPECIFIC         = 0x0100,\n  VIDEO_TT_STREAMING               = 0x0101,\n\n  // Input\n  VIDEO_ITT_VENDOR_SPECIFIC        = 0x0200,\n  VIDEO_ITT_CAMERA                 = 0x0201,\n  VIDEO_ITT_MEDIA_TRANSPORT_INPUT  = 0x0202,\n\n  // Output\n  VIDEO_OTT_VENDOR_SPECIFIC        = 0x0300,\n  VIDEO_OTT_DISPLAY                = 0x0301,\n  VIDEO_OTT_MEDIA_TRANSPORT_OUTPUT = 0x0302,\n\n  // External\n  VIDEO_ETT_VENDOR_SPEIFIC         = 0x0400,\n  VIDEO_ETT_COMPOSITE_CONNECTOR    = 0x0401,\n  VIDEO_ETT_SVIDEO_CONNECTOR       = 0x0402,\n  VIDEO_ETT_COMPONENT_CONNECTOR    = 0x0403,\n} video_terminal_type_t;\n\n//--------------------------------------------------------------------+\n// Video Control (VC) Descriptors\n//--------------------------------------------------------------------+\n\n/* 2.3.4.2 */\n#define tusb_desc_video_control_header_nitf_t(_nitf) \\\n  struct TU_ATTR_PACKED { \\\n    uint8_t  bLength; \\\n    uint8_t  bDescriptorType; \\\n    uint8_t  bDescriptorSubType; \\\n    uint16_t bcdUVC; \\\n    uint16_t wTotalLength; \\\n    uint32_t dwClockFrequency; /* deprecated */ \\\n    uint8_t  bInCollection; \\\n    uint8_t  baInterfaceNr[_nitf]; \\\n  }\n\ntypedef tusb_desc_video_control_header_nitf_t()  tusb_desc_video_control_header_t; //-V2586 incorrectly detected as flexible array\ntypedef tusb_desc_video_control_header_nitf_t(1) tusb_desc_video_control_header_1itf_t; //-V2586 incorrectly detected as flexible array\ntypedef tusb_desc_video_control_header_nitf_t(2) tusb_desc_video_control_header_2itf_t; //-V2586 incorrectly detected as flexible array\ntypedef tusb_desc_video_control_header_nitf_t(3) tusb_desc_video_control_header_3itf_t; //-V2586 incorrectly detected as flexible array\ntypedef tusb_desc_video_control_header_nitf_t(4) tusb_desc_video_control_header_4itf_t; //-V2586 incorrectly detected as flexible array\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubType;\n  uint8_t  bTerminalID;\n  uint16_t wTerminalType;\n  uint8_t  bAssocTerminal;\n  uint8_t  iTerminal;\n} tusb_desc_video_control_input_terminal_t;\n\nTU_VERIFY_STATIC(sizeof(tusb_desc_video_control_input_terminal_t) == 8, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubType;\n  uint8_t  bTerminalID;\n  uint16_t wTerminalType;\n  uint8_t  bAssocTerminal;\n  uint8_t  bSourceID;\n  uint8_t  iTerminal;\n} tusb_desc_video_control_output_terminal_t;\n\nTU_VERIFY_STATIC(sizeof(tusb_desc_video_control_output_terminal_t) == 9, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubType;\n  uint8_t  bTerminalID;\n  uint16_t wTerminalType;\n  uint8_t  bAssocTerminal;\n  uint8_t  iTerminal;\n\n  uint16_t wObjectiveFocalLengthMin;\n  uint16_t wObjectiveFocalLengthMax;\n  uint16_t wOcularFocalLength;\n  uint8_t  bControlSize;\n  uint8_t  bmControls[3];\n} tusb_desc_video_control_camera_terminal_t;\n\nTU_VERIFY_STATIC(sizeof(tusb_desc_video_control_camera_terminal_t) == 18, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// Video Streaming (VS) Descriptors\n//--------------------------------------------------------------------+\n\n/* 3.9.2.1 */\n#define tusb_desc_video_streaming_input_header_nbyte_t(_nb) \\\n  struct TU_ATTR_PACKED { \\\n    uint8_t  bLength; \\\n    uint8_t  bDescriptorType; \\\n    uint8_t  bDescriptorSubType; \\\n    uint8_t  bNumFormats; /* Number of video payload Format descriptors for this interface */ \\\n    uint16_t wTotalLength; \\\n    uint8_t  bEndpointAddress; \\\n    uint8_t  bmInfo; /* Bit 0: dynamic format change supported */ \\\n    uint8_t  bTerminalLink; \\\n    uint8_t  bStillCaptureMethod; \\\n    uint8_t  bTriggerSupport; /* Hardware trigger supported */ \\\n    uint8_t  bTriggerUsage; \\\n    uint8_t  bControlSize; /* sizeof of each control item */ \\\n    uint8_t  bmaControls[_nb]; \\\n  }\n\ntypedef tusb_desc_video_streaming_input_header_nbyte_t() tusb_desc_video_streaming_input_header_t;\ntypedef tusb_desc_video_streaming_input_header_nbyte_t(1) tusb_desc_video_streaming_input_header_1byte_t;\ntypedef tusb_desc_video_streaming_input_header_nbyte_t(2) tusb_desc_video_streaming_input_header_2byte_t;\ntypedef tusb_desc_video_streaming_input_header_nbyte_t(3) tusb_desc_video_streaming_input_header_3byte_t;\ntypedef tusb_desc_video_streaming_input_header_nbyte_t(4) tusb_desc_video_streaming_input_header_4byte_t;\n\n/* 3.9.2.2 */\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubType;\n  uint8_t  bNumFormats;\n  uint16_t wTotalLength;\n  uint8_t  bEndpointAddress;\n  uint8_t  bTerminalLink;\n  uint8_t  bControlSize;\n  uint8_t  bmaControls[];\n} tusb_desc_video_streaming_output_header_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubType;\n  uint8_t  bNumFormats;\n  uint16_t wTotalLength;\n  uint8_t  bEndpointAddress;\n  union {\n    struct {\n      uint8_t  bmInfo;\n      uint8_t  bTerminalLink;\n      uint8_t  bStillCaptureMethod;\n      uint8_t  bTriggerSupport;\n      uint8_t  bTriggerUsage;\n      uint8_t  bControlSize;\n      uint8_t  bmaControls[];\n    } input;\n    struct {\n      uint8_t  bEndpointAddress;\n      uint8_t  bTerminalLink;\n      uint8_t  bControlSize;\n      uint8_t  bmaControls[];\n    } output;\n  };\n} tusb_desc_video_streaming_inout_header_t;\n\n// 3.9.2.6 Color Matching Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubType;\n  uint8_t  bColorPrimaries;\n  uint8_t  bTransferCharacteristics;\n  uint8_t  bMatrixCoefficients;\n} tusb_desc_video_streaming_color_matching_t;\n\nTU_VERIFY_STATIC(sizeof(tusb_desc_video_streaming_color_matching_t) == 6, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// Format and Frame Descriptor\n// Note: bFormatIndex & bFrameIndex are 1-based index\n//--------------------------------------------------------------------+\n\n//------------- Uncompressed -------------//\n// Uncompressed payload specs: 3.1.1 format descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;\n  uint8_t bDescriptorType;\n  uint8_t bDescriptorSubType;\n  uint8_t bFormatIndex;\n  uint8_t bNumFrameDescriptors; // Number of frame descriptors for this format\n  uint8_t guidFormat[16];\n  uint8_t bBitsPerPixel;\n  uint8_t bDefaultFrameIndex;\n  uint8_t bAspectRatioX;\n  uint8_t bAspectRatioY;\n  uint8_t bmInterlaceFlags;\n  uint8_t bCopyProtect;\n} tusb_desc_video_format_uncompressed_t;\n\nTU_VERIFY_STATIC(sizeof(tusb_desc_video_format_uncompressed_t) == 27, \"size is not correct\");\n\n// Uncompressed payload specs: 3.1.2 frame descriptor\n#define tusb_desc_video_frame_uncompressed_nint_t(_nint) \\\n  struct TU_ATTR_PACKED { \\\n    uint8_t  bLength; \\\n    uint8_t  bDescriptorType; \\\n    uint8_t  bDescriptorSubType; \\\n    uint8_t  bFrameIndex; \\\n    uint8_t  bmCapabilities; \\\n    uint16_t wWidth; \\\n    uint16_t wHeight; \\\n    uint32_t dwMinBitRate; \\\n    uint32_t dwMaxBitRate; \\\n    uint32_t dwMaxVideoFrameBufferSize; /* deprecated in 1.5 */ \\\n    uint32_t dwDefaultFrameInterval; /* 100ns unit */\\\n    uint8_t  bFrameIntervalType; \\\n    uint32_t dwFrameInterval[_nint]; \\\n  }\n\ntypedef tusb_desc_video_frame_uncompressed_nint_t() tusb_desc_video_frame_uncompressed_t;\ntypedef tusb_desc_video_frame_uncompressed_nint_t(1) tusb_desc_video_frame_uncompressed_1int_t;\ntypedef tusb_desc_video_frame_uncompressed_nint_t(2) tusb_desc_video_frame_uncompressed_2int_t;\ntypedef tusb_desc_video_frame_uncompressed_nint_t(3) tusb_desc_video_frame_uncompressed_3int_t;\ntypedef tusb_desc_video_frame_uncompressed_nint_t(4) tusb_desc_video_frame_uncompressed_4int_t;\n\n// continuous = 3 intervals: min, max, step\ntypedef tusb_desc_video_frame_uncompressed_3int_t tusb_desc_video_frame_uncompressed_continuous_t;\n\nTU_VERIFY_STATIC(sizeof(tusb_desc_video_frame_uncompressed_continuous_t) == 38, \"size is not correct\");\n\n//------------- MJPEG -------------//\n// MJPEG payload specs: 3.1.1 format descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;\n  uint8_t bDescriptorType;\n  uint8_t bDescriptorSubType;\n  uint8_t bFormatIndex;\n  uint8_t bNumFrameDescriptors;\n  uint8_t bmFlags; // Bit 0: fixed size samples (1 = yes)\n  uint8_t bDefaultFrameIndex;\n  uint8_t bAspectRatioX;\n  uint8_t bAspectRatioY;\n  uint8_t bmInterlaceFlags;\n  uint8_t bCopyProtect;\n} tusb_desc_video_format_mjpeg_t;\n\nTU_VERIFY_STATIC(sizeof(tusb_desc_video_format_mjpeg_t) == 11, \"size is not correct\");\n\n// MJPEG payload specs: 3.1.2 frame descriptor (same as uncompressed)\ntypedef tusb_desc_video_frame_uncompressed_t tusb_desc_video_frame_mjpeg_t;\ntypedef tusb_desc_video_frame_uncompressed_1int_t tusb_desc_video_frame_mjpeg_1int_t;\ntypedef tusb_desc_video_frame_uncompressed_2int_t tusb_desc_video_frame_mjpeg_2int_t;\ntypedef tusb_desc_video_frame_uncompressed_3int_t tusb_desc_video_frame_mjpeg_3int_t;\ntypedef tusb_desc_video_frame_uncompressed_4int_t tusb_desc_video_frame_mjpeg_4int_t;\n\n// continuous = 3 intervals: min, max, step\ntypedef tusb_desc_video_frame_mjpeg_3int_t tusb_desc_video_frame_mjpeg_continuous_t;\n\n//------------- DV -------------//\n// DV payload specs: 3.1.1\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubType;\n  uint8_t  bFormatIndex;\n  uint32_t dwMaxVideoFrameBufferSize; /* deprecated */\n  uint8_t  bFormatType;\n} tusb_desc_video_format_dv_t;\n\n// Frame Based payload specs: 3.1.1\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;\n  uint8_t bDescriptorType;\n  uint8_t bDescriptorSubType;\n  uint8_t bFormatIndex;\n  uint8_t bNumFrameDescriptors;\n  uint8_t guidFormat[16];\n  uint8_t bBitsPerPixel;\n  uint8_t bDefaultFrameIndex;\n  uint8_t bAspectRatioX;\n  uint8_t bAspectRatioY;\n  uint8_t bmInterlaceFlags;\n  uint8_t bCopyProtect;\n  uint8_t bVaribaleSize;\n} tusb_desc_video_format_framebased_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubType;\n  uint8_t  bFrameIndex;\n  uint8_t  bmCapabilities;\n  uint16_t wWidth;\n  uint16_t wHeight;\n  uint32_t dwMinBitRate;\n  uint32_t dwMaxBitRate;\n  uint32_t dwDefaultFrameInterval;\n  uint8_t  bFrameIntervalType;\n  uint32_t dwBytesPerLine;\n  uint32_t dwFrameInterval[];\n} tusb_desc_video_frame_framebased_t;\n\n//--------------------------------------------------------------------+\n// Requests\n//--------------------------------------------------------------------+\n\n/* 2.4.3.3 */\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bHeaderLength;\n  union {\n    uint8_t bmHeaderInfo;\n    struct {\n      uint8_t FrameID:              1;\n      uint8_t EndOfFrame:           1;\n      uint8_t PresentationTime:     1;\n      uint8_t SourceClockReference: 1;\n      uint8_t PayloadSpecific:      1;\n      uint8_t StillImage:           1;\n      uint8_t Error:                1;\n      uint8_t EndOfHeader:          1;\n    };\n  };\n} tusb_video_payload_header_t;\n\n/* 4.3.1.1 */\ntypedef struct TU_ATTR_PACKED {\n  union {\n    uint8_t bmHint;\n    struct TU_ATTR_PACKED {\n      uint16_t dwFrameInterval: 1;\n      uint16_t wKeyFrameRatel : 1;\n      uint16_t wPFrameRate    : 1;\n      uint16_t wCompQuality   : 1;\n      uint16_t wCompWindowSize: 1;\n      uint16_t                : 0;\n    } Hint;\n  };\n  uint8_t  bFormatIndex;\n  uint8_t  bFrameIndex;\n  uint32_t dwFrameInterval;\n  uint16_t wKeyFrameRate;\n  uint16_t wPFrameRate;\n  uint16_t wCompQuality;\n  uint16_t wCompWindowSize;\n  uint16_t wDelay;\n  uint32_t dwMaxVideoFrameSize;\n  uint32_t dwMaxPayloadTransferSize;\n  uint32_t dwClockFrequency;\n  union {\n    uint8_t bmFramingInfo;\n    struct TU_ATTR_PACKED {\n      uint8_t FrameID   : 1;\n      uint8_t EndOfFrame: 1;\n      uint8_t EndOfSlice: 1;\n      uint8_t           : 0;\n    } FramingInfo;\n  };\n  uint8_t  bPreferedVersion;\n  uint8_t  bMinVersion;\n  uint8_t  bMaxVersion;\n  uint8_t  bUsage;\n  uint8_t  bBitDepthLuma;\n  uint8_t  bmSettings;\n  uint8_t  bMaxNumberOfRefFramesPlus1;\n  uint16_t bmRateControlModes;\n  uint64_t bmLayoutPerStream;\n} video_probe_and_commit_control_t;\n\nTU_VERIFY_STATIC( sizeof(video_probe_and_commit_control_t) == 48, \"size is not correct\");\n\n#define TUD_VIDEO_DESC_IAD_LEN                          8\n#define TUD_VIDEO_DESC_STD_VC_LEN                       9\n#define TUD_VIDEO_DESC_CS_VC_LEN                        12\n#define TUD_VIDEO_DESC_INPUT_TERM_LEN                   8\n#define TUD_VIDEO_DESC_OUTPUT_TERM_LEN                  9\n#define TUD_VIDEO_DESC_CAMERA_TERM_LEN                  18\n#define TUD_VIDEO_DESC_STD_VS_LEN                       9\n#define TUD_VIDEO_DESC_CS_VS_IN_LEN                     13\n#define TUD_VIDEO_DESC_CS_VS_OUT_LEN                    9\n#define TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN            27\n#define TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN              11\n#define TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED_LEN        28\n#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN       38\n#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_DISC_LEN       26\n#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN         38\n#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_DISC_LEN         26\n#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT_LEN   38\n#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC_LEN   26\n#define TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN         6\n\n/* 2.2 compression formats */\n#define TUD_VIDEO_GUID_YUY2   0x59,0x55,0x59,0x32,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71\n#define TUD_VIDEO_GUID_NV12   0x4E,0x56,0x31,0x32,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71\n#define TUD_VIDEO_GUID_M420   0x4D,0x34,0x32,0x30,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71\n#define TUD_VIDEO_GUID_I420   0x49,0x34,0x32,0x30,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71\n#define TUD_VIDEO_GUID_H264   0x48,0x32,0x36,0x34,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71\n\n#define TUD_VIDEO_DESC_IAD(_firstitf, _nitfs, _stridx) \\\n  TUD_VIDEO_DESC_IAD_LEN, TUSB_DESC_INTERFACE_ASSOCIATION, \\\n  _firstitf, _nitfs, TUSB_CLASS_VIDEO, VIDEO_SUBCLASS_INTERFACE_COLLECTION, \\\n  VIDEO_ITF_PROTOCOL_UNDEFINED, _stridx\n\n#define TUD_VIDEO_DESC_STD_VC(_itfnum, _nEPs, _stridx) \\\n  TUD_VIDEO_DESC_STD_VC_LEN, TUSB_DESC_INTERFACE, _itfnum, /* fixed to zero */ 0x00, \\\n  _nEPs, TUSB_CLASS_VIDEO, VIDEO_SUBCLASS_CONTROL, VIDEO_ITF_PROTOCOL_15, _stridx\n\n/* 3.7.2 */\n#define TUD_VIDEO_DESC_CS_VC(_bcdUVC, _totallen, _clkfreq, ...)\t\\\n  TUD_VIDEO_DESC_CS_VC_LEN + (TU_ARGS_NUM(__VA_ARGS__)), TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VC_HEADER, \\\n  U16_TO_U8S_LE(_bcdUVC), U16_TO_U8S_LE((_totallen) + TUD_VIDEO_DESC_CS_VC_LEN + (TU_ARGS_NUM(__VA_ARGS__))), \\\n  U32_TO_U8S_LE(_clkfreq), TU_ARGS_NUM(__VA_ARGS__), __VA_ARGS__\n\n/* 3.7.2.1 */\n#define TUD_VIDEO_DESC_INPUT_TERM(_tid, _tt, _at, _stridx) \\\n  TUD_VIDEO_DESC_INPUT_TERM_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VC_INPUT_TERMINAL, \\\n    _tid, U16_TO_U8S_LE(_tt), _at, _stridx\n\n/* 3.7.2.2 */\n#define TUD_VIDEO_DESC_OUTPUT_TERM(_tid, _tt, _at, _srcid, _stridx) \\\n  TUD_VIDEO_DESC_OUTPUT_TERM_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VC_OUTPUT_TERMINAL, \\\n    _tid, U16_TO_U8S_LE(_tt), _at, _srcid, _stridx\n\n/* 3.7.2.3 */\n#define TUD_VIDEO_DESC_CAMERA_TERM(_tid, _at, _stridx, _focal_min, _focal_max, _focal, _ctls) \\\n  TUD_VIDEO_DESC_CAMERA_TERM_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VC_INPUT_TERMINAL, \\\n    _tid, U16_TO_U8S_LE(VIDEO_ITT_CAMERA), _at, _stridx, \\\n    U16_TO_U8S_LE(_focal_min), U16_TO_U8S_LE(_focal_max), U16_TO_U8S_LE(_focal), 3, \\\n    TU_U32_BYTE0(_ctls), TU_U32_BYTE1(_ctls), TU_U32_BYTE2(_ctls)\n\n/* 3.9.1 */\n#define TUD_VIDEO_DESC_STD_VS(_itfnum, _alt, _epn, _stridx) \\\n  TUD_VIDEO_DESC_STD_VS_LEN, TUSB_DESC_INTERFACE, _itfnum, _alt, \\\n  _epn, TUSB_CLASS_VIDEO, VIDEO_SUBCLASS_STREAMING, VIDEO_ITF_PROTOCOL_15, _stridx\n\n/* 3.9.2.1 */\n#define TUD_VIDEO_DESC_CS_VS_INPUT(_numfmt, _totallen, _ep, _inf, _termlnk, _sticaptmeth, _trgspt, _trgusg, ...) \\\n  TUD_VIDEO_DESC_CS_VS_IN_LEN + (_numfmt) * (TU_ARGS_NUM(__VA_ARGS__)), TUSB_DESC_CS_INTERFACE, \\\n  VIDEO_CS_ITF_VS_INPUT_HEADER, _numfmt, \\\n  U16_TO_U8S_LE((_totallen) + TUD_VIDEO_DESC_CS_VS_IN_LEN + (_numfmt) * (TU_ARGS_NUM(__VA_ARGS__))), \\\n  _ep, _inf, _termlnk, _sticaptmeth, _trgspt, _trgusg, (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__\n\n/* 3.9.2.2 */\n#define TUD_VIDEO_DESC_CS_VS_OUTPUT(_numfmt, _totallen, _ep, _inf, _termlnk, ...) \\\n  TUD_VIDEO_DESC_CS_VS_OUT_LEN + (_numfmt) * (TU_ARGS_NUM(__VA_ARGS__)), TUSB_DESC_CS_INTERFACE, \\\n  VIDEO_CS_ITF_VS_OUTPUT_HEADER, _numfmt, \\\n  U16_TO_U8S_LE((_totallen) + TUD_VIDEO_DESC_CS_VS_OUT_LEN + (_numfmt) * (TU_ARGS_NUM(__VA_ARGS__))), \\\n  _ep, _inf, _termlnk, (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__\n\n/* Uncompressed 3.1.1 */\n#define TUD_VIDEO_GUID(_g0,_g1,_g2,_g3,_g4,_g5,_g6,_g7,_g8,_g9,_g10,_g11,_g12,_g13,_g14,_g15) _g0,_g1,_g2,_g3,_g4,_g5,_g6,_g7,_g8,_g9,_g10,_g11,_g12,_g13,_g14,_g15\n\n#define TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfrmdesc, \\\n  _guid, _bitsperpix, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED, \\\n  _fmtidx, _numfrmdesc, TUD_VIDEO_GUID(_guid), \\\n  _bitsperpix, _frmidx, _asrx,  _asry, _interlace, _cp\n\n/* Uncompressed 3.1.2 Table 3-3 */\n#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT(_frmidx, _cap, _width, _height, _minbr, _maxbr, _maxfrmbufsz, _frminterval, _minfrminterval, _maxfrminterval, _frmintervalstep) \\\n  TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_UNCOMPRESSED, \\\n  _frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \\\n  U32_TO_U8S_LE(_maxfrmbufsz), U32_TO_U8S_LE(_frminterval), 0, \\\n  U32_TO_U8S_LE(_minfrminterval), U32_TO_U8S_LE(_maxfrminterval), U32_TO_U8S_LE(_frmintervalstep)\n\n/* Uncompressed 3.1.2 Table 3-4 */\n#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_DISC(_frmidx, _cap, _width, _height, _minbr, _maxbr, _maxfrmbufsz, _frminterval, ...) \\\n  TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_DISC_LEN + (TU_ARGS_NUM(__VA_ARGS__)) * 4, \\\n  TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_UNCOMPRESSED, \\\n  _frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \\\n  U32_TO_U8S_LE(_maxfrmbufsz), U32_TO_U8S_LE(_frminterval), (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__\n\n/* Motion-JPEG 3.1.1 Table 3-1 */\n#define TUD_VIDEO_DESC_CS_VS_FMT_MJPEG(_fmtidx, _numfrmdesc, _fixed_sz, _frmidx, _asrx, _asry, _interlace, _cp) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FORMAT_MJPEG, \\\n  _fmtidx, _numfrmdesc, _fixed_sz, _frmidx, _asrx,  _asry, _interlace, _cp\n\n/* Motion-JPEG 3.1.1 Table 3-2 and 3-3 */\n#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT(_frmidx, _cap, _width, _height, _minbr, _maxbr, _maxfrmbufsz, _frminterval, _minfrminterval, _maxfrminterval, _frmintervalstep) \\\n  TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_MJPEG, \\\n  _frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \\\n  U32_TO_U8S_LE(_maxfrmbufsz), U32_TO_U8S_LE(_frminterval), 0, \\\n  U32_TO_U8S_LE(_minfrminterval), U32_TO_U8S_LE(_maxfrminterval), U32_TO_U8S_LE(_frmintervalstep)\n\n/* Motion-JPEG 3.1.1 Table 3-2 and 3-4 */\n#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_DISC(_frmidx, _cap, _width, _height, _minbr, _maxbr, _maxfrmbufsz, _frminterval, ...) \\\n  TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_DISC_LEN + (TU_ARGS_NUM(__VA_ARGS__)) * 4, \\\n  TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_MJPEG, \\\n  _frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \\\n  U32_TO_U8S_LE(_maxfrmbufsz), U32_TO_U8S_LE(_frminterval), (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__\n\n/* Motion-Frame-Based 3.1.1 Table 3-1 */\n#define TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED(_fmtidx, _numfrmdesc, _guid, _bitsperpix, _frmidx, _asrx, _asry, _interlace, _cp, _variablesize) \\\n  TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED, \\\n  _fmtidx, _numfrmdesc, TUD_VIDEO_GUID(_guid), _bitsperpix, _frmidx, _asrx,  _asry, _interlace, _cp, _variablesize\n\n/* Motion-Frame-Based 3.1.1 Table 3-2 and 3-3 */\n#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT(_frmidx, _cap, _width, _height, _minbr, _maxbr, _frminterval, _bytesperline, _minfrminterval, _maxfrminterval, _frmintervalstep) \\\n  TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_FRAME_BASED, \\\n  _frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \\\n  U32_TO_U8S_LE(_frminterval), 0, U32_TO_U8S_LE(_bytesperline), \\\n  U32_TO_U8S_LE(_minfrminterval), U32_TO_U8S_LE(_maxfrminterval), U32_TO_U8S_LE(_frmintervalstep)\n\n/* Motion-Frame-Based 3.1.1 Table 3-2 and 3-4 */\n#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC(_frmidx, _cap, _width, _height, _minbr, _maxbr, _frminterval, _bytesperline, ...) \\\n  TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC_LEN + (TU_ARGS_NUM(__VA_ARGS__)) * 4, \\\n  TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_FRAME_BASED, \\\n  _frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \\\nU32_TO_U8S_LE(_frminterval), U32_TO_U8S_LE(_bytesperline), (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__\n\n/* 3.9.2.6 */\n#define TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(_color, _trns, _mat) \\\n  TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN, \\\n  TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_COLORFORMAT, \\\n  _color, _trns, _mat\n\n/* 3.10.1.1 */\n#define TUD_VIDEO_DESC_EP_ISO(_ep, _epsize, _ep_interval) \\\n  7, TUSB_DESC_ENDPOINT, _ep, (uint8_t) (TUSB_XFER_ISOCHRONOUS | TUSB_ISO_EP_ATT_ASYNCHRONOUS),\\\n  U16_TO_U8S_LE(_epsize), _ep_interval\n\n/* 3.10.1.2 */\n#define TUD_VIDEO_DESC_EP_BULK(_ep, _epsize, _ep_interval) \\\n  7, TUSB_DESC_ENDPOINT, _ep, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), _ep_interval\n\n#endif\n"
  },
  {
    "path": "src/class/video/video_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Koji KITAYAMA\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUD_ENABLED && CFG_TUD_VIDEO && CFG_TUD_VIDEO_STREAMING)\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n#include \"video_device.h\"\n\n// Level where CFG_TUSB_DEBUG must be at least for this driver is logged\n#ifndef CFG_TUD_VIDEO_LOG_LEVEL\n  #define CFG_TUD_VIDEO_LOG_LEVEL   CFG_TUD_LOG_LEVEL\n#endif\n\n#define TU_LOG_DRV(...)   TU_LOG(CFG_TUD_VIDEO_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n#define VS_STATE_PROBING      0     /* Configuration in progress */\n#define VS_STATE_COMMITTED    1     /* Ready for streaming or Streaming via bulk endpoint */\n#define VS_STATE_STREAMING    2     /* Streaming via isochronous endpoint */\n\ntypedef struct {\n  tusb_desc_interface_t            std;\n  tusb_desc_video_control_header_t ctl;\n} tusb_desc_vc_itf_t;\n\ntypedef struct {\n  tusb_desc_interface_t            std;\n  tusb_desc_video_streaming_inout_header_t stm;\n} tusb_desc_vs_itf_t;\n\ntypedef union {\n  tusb_desc_video_control_header_t ctl;\n  tusb_desc_video_streaming_inout_header_t stm;\n} tusb_desc_video_itf_hdr_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;\n  uint8_t bDescriptorType;\n  uint8_t bDescriptorSubtype;\n  uint8_t bEntityId;\n} tusb_desc_cs_video_entity_itf_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n  uint8_t  bDescriptorSubtype;\n  uint16_t wMaxTransferSize;\n} tusb_desc_cs_video_vc_ep_t;\n\ntypedef union {\n  struct TU_ATTR_PACKED {\n    uint8_t bLength;\n    uint8_t bDescriptorType;\n    uint8_t bDescriptorSubType;\n    uint8_t bFormatIndex;\n    uint8_t bNumFrameDescriptors;\n  };\n  tusb_desc_video_format_uncompressed_t uncompressed;\n  tusb_desc_video_format_mjpeg_t        mjpeg;\n  tusb_desc_video_format_framebased_t  frame_based;\n} tusb_desc_cs_video_fmt_t;\n\ntypedef union {\n  struct TU_ATTR_PACKED {\n    uint8_t  bLength;\n    uint8_t  bDescriptorType;\n    uint8_t  bDescriptorSubType;\n    uint8_t  bFrameIndex;\n    uint8_t  bmCapabilities;\n    uint16_t wWidth;\n    uint16_t wHeight;\n  };\n  tusb_desc_video_frame_uncompressed_t uncompressed;\n  tusb_desc_video_frame_mjpeg_t        mjpeg;\n  tusb_desc_video_frame_framebased_t  frame_based;\n} tusb_desc_cs_video_frm_t;\n\n/* video streaming interface */\ntypedef struct TU_ATTR_PACKED {\n  uint8_t index_vc;  /* index of bound video control interface */\n  uint8_t index_vs;  /* index from the video control interface */\n  struct {\n    uint16_t beg;    /* Offset of the beginning of video streaming interface descriptor */\n    uint16_t end;    /* Offset of the end of video streaming interface descriptor */\n    uint16_t cur;    /* Offset of the current settings */\n    uint16_t ep[2];  /* Offset of endpoint descriptors. 0: streaming, 1: still capture */\n  } desc;\n  uint8_t *buffer;   /* frame buffer. assume linear buffer. no support for stride access */\n  uint32_t bufsize;  /* frame buffer size */\n  uint32_t offset;   /* offset for the next payload transfer */\n  uint32_t max_payload_transfer_size;\n  uint8_t  error_code;/* error code */\n  uint8_t  state;    /* 0:probing 1:committed 2:streaming */\n\n  video_probe_and_commit_control_t probe_commit_payload; /* Probe and Commit control */\n} videod_streaming_interface_t;\n\ntypedef struct {\n  TUD_EPBUF_DEF(buf, CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE);\n} videod_streaming_epbuf_t;\n\n/* video control interface */\ntypedef struct TU_ATTR_PACKED {\n  const uint8_t*beg;                     /* The head of the first video control interface descriptor */\n  uint16_t len;                          /* Byte length of the descriptors */\n  uint16_t cur;                          /* offset for current video control interface */\n  uint8_t  stm[CFG_TUD_VIDEO_STREAMING]; /* Indices of streaming interface */\n  uint8_t  error_code;                   /* error code */\n  uint8_t  power_mode;\n} videod_interface_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nstatic videod_interface_t _videod_itf[CFG_TUD_VIDEO];\n\nstatic videod_streaming_interface_t _videod_streaming_itf[CFG_TUD_VIDEO_STREAMING];\nCFG_TUD_MEM_SECTION static videod_streaming_epbuf_t _videod_streaming_epbuf[CFG_TUD_VIDEO_STREAMING];\n\nstatic uint8_t const _cap_get     = 0x1u; /* support for GET */\nstatic uint8_t const _cap_get_set = 0x3u; /* support for GET and SET */\n\n//--------------------------------------------------------------------+\n// Debug\n//--------------------------------------------------------------------+\n#if CFG_TUSB_DEBUG >= CFG_TUD_VIDEO_LOG_LEVEL\n\nstatic tu_lookup_entry_t const tu_lookup_video_request[] = {\n    {.key = VIDEO_REQUEST_UNDEFINED, .data = \"Undefined\"},\n    {.key = VIDEO_REQUEST_SET_CUR, .data = \"SetCur\"},\n    {.key = VIDEO_REQUEST_SET_CUR_ALL, .data = \"SetCurAll\"},\n    {.key = VIDEO_REQUEST_GET_CUR, .data = \"GetCur\"},\n    {.key = VIDEO_REQUEST_GET_MIN, .data = \"GetMin\"},\n    {.key = VIDEO_REQUEST_GET_MAX, .data = \"GetMax\"},\n    {.key = VIDEO_REQUEST_GET_RES, .data = \"GetRes\"},\n    {.key = VIDEO_REQUEST_GET_LEN, .data = \"GetLen\"},\n    {.key = VIDEO_REQUEST_GET_INFO, .data = \"GetInfo\"},\n    {.key = VIDEO_REQUEST_GET_DEF, .data = \"GetDef\"},\n    {.key = VIDEO_REQUEST_GET_CUR_ALL, .data = \"GetCurAll\"},\n    {.key = VIDEO_REQUEST_GET_MIN_ALL, .data = \"GetMinAll\"},\n    {.key = VIDEO_REQUEST_GET_MAX_ALL, .data = \"GetMaxAll\"},\n    {.key = VIDEO_REQUEST_GET_RES_ALL, .data = \"GetResAll\"},\n    {.key = VIDEO_REQUEST_GET_DEF_ALL, .data = \"GetDefAll\"},\n};\n\nstatic tu_lookup_table_t const tu_table_video_request = {\n    .count = TU_ARRAY_SIZE(tu_lookup_video_request),\n    .items = tu_lookup_video_request\n};\n\nstatic char const* const tu_str_video_vc_control_selector[] = {\n    \"Undefined\",\n    \"Video Power Mode\",\n    \"Request Error Code\",\n};\n\nstatic char const* const tu_str_video_vs_control_selector[] = {\n    \"Undefined\",\n    \"Probe\",\n    \"Commit\",\n    \"Still Probe\",\n    \"Still Commit\",\n    \"Still Image Trigger\",\n    \"Stream Error Code\",\n    \"Generate Key Frame\",\n    \"Update Frame Segment\",\n    \"Sync Delay\",\n};\n\n#endif\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_video_frame_xfer_complete_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx) {\n  (void) ctl_idx;\n  (void) stm_idx;\n}\n\nTU_ATTR_WEAK int tud_video_power_mode_cb(uint_fast8_t ctl_idx, uint8_t power_mod) {\n  (void) ctl_idx;\n  (void) power_mod;\n  return VIDEO_ERROR_NONE;\n}\n\nTU_ATTR_WEAK int tud_video_commit_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx,\n                                    video_probe_and_commit_control_t const *parameters) {\n  (void) ctl_idx;\n  (void) stm_idx;\n  (void) parameters;\n  return VIDEO_ERROR_NONE;\n}\n\nTU_ATTR_WEAK void tud_video_prepare_payload_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx, tud_video_payload_request_t* request) {\n  (void) ctl_idx;\n  (void) stm_idx;\n  (void) request;\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n/** Get interface number from the interface descriptor\n *\n * @param[in] desc    interface descriptor\n *\n * @return bInterfaceNumber */\nstatic inline uint8_t _desc_itfnum(void const *desc) {\n  return ((uint8_t const*)desc)[2];\n}\n\n/** Get endpoint address from the endpoint descriptor\n *\n * @param[in] desc    endpoint descriptor\n *\n * @return bEndpointAddress */\nstatic inline uint8_t _desc_ep_addr(void const *desc) {\n  return ((uint8_t const*)desc)[2];\n}\n\n/** Get instance of streaming interface\n *\n * @param[in] ctl_idx    instance number of video control\n * @param[in] stm_idx    index number of streaming interface\n *\n * @return instance */\nstatic videod_streaming_interface_t* _get_instance_streaming(uint_fast8_t ctl_idx, uint_fast8_t stm_idx) {\n  videod_interface_t *ctl = &_videod_itf[ctl_idx];\n  if (!ctl->beg) {\n    return NULL;\n  }\n  videod_streaming_interface_t *stm = &_videod_streaming_itf[ctl->stm[stm_idx]];\n  if (!stm->desc.beg) {\n    return NULL;\n  }\n  return stm;\n}\n\nstatic tusb_desc_vc_itf_t const* _get_desc_vc(videod_interface_t const *self) {\n  return (tusb_desc_vc_itf_t const *)(self->beg + self->cur);\n}\n\nstatic tusb_desc_vs_itf_t const* _get_desc_vs(videod_streaming_interface_t const *self) {\n  if (!self->desc.cur) {\n    return NULL;\n  }\n  uint8_t const *desc = _videod_itf[self->index_vc].beg;\n  return (tusb_desc_vs_itf_t const*)(desc + self->desc.cur);\n}\n\n/** Find the first descriptor of a given type\n *\n * @param[in] beg        The head of descriptor byte array.\n * @param[in] end        The tail of descriptor byte array.\n * @param[in] desc_type  The target descriptor type.\n *\n * @return The pointer for interface descriptor.\n * @retval end   did not found interface descriptor */\nstatic void const* _find_desc(void const *beg, void const *end, uint_fast8_t desc_type) {\n  void const *cur = beg;\n  while ((cur < end) && (desc_type != tu_desc_type(cur))) {\n    cur = tu_desc_next(cur);\n  }\n  return cur;\n}\n\n/** Find the first descriptor of two given types\n *\n * @param[in] beg        The head of descriptor byte array.\n * @param[in] end        The tail of descriptor byte array.\n * @param[in] desc_type_0 The first target descriptor type.\n * @param[in] desc_type_1 The second target descriptor type.\n *\n * @return The pointer for interface descriptor.\n * @retval end   did not found interface descriptor */\nstatic void const* _find_desc_2_type(void const *beg, void const *end, uint_fast8_t desc_type_0, uint_fast8_t desc_type_1)\n{\n  void const *cur = beg;\n  while ((cur < end) && (desc_type_0 != tu_desc_type(cur)) && (desc_type_1 != tu_desc_type(cur))) {\n    cur = tu_desc_next(cur);\n  }\n  return cur;\n}\n\n/** Find the first descriptor specified by the arguments\n *\n * @param[in] beg        The head of descriptor byte array.\n * @param[in] end        The tail of descriptor byte array.\n * @param[in] desc_type  The target descriptor type\n * @param[in] element_0  The target element following the desc_type\n * @param[in] element_1  The target element following the element_0\n *\n * @return The pointer for interface descriptor.\n * @retval end   did not found interface descriptor */\nstatic void const* _find_desc_3(void const *beg, void const *end,\n                                uint_fast8_t desc_type,\n                                uint_fast8_t element_0,\n                                uint_fast8_t element_1) {\n  for (void const *cur = beg; cur < end; cur = _find_desc(cur, end, desc_type)) {\n    uint8_t const *p = (uint8_t const *)cur;\n    if ((p[2] == element_0) && (p[3] == element_1)) {\n      return cur;\n    }\n    cur = tu_desc_next(cur);\n  }\n  return end;\n}\n\n/** Return the next interface descriptor which has another interface number.\n *  If there are multiple VC interfaces, there will be an IAD descriptor before\n *  the next interface descriptor. Check both the IAD descriptor and the interface\n *  descriptor.\n *  3.1 Descriptor Layout Overview\n *\n * @param[in] beg     The head of descriptor byte array.\n * @param[in] end     The tail of descriptor byte array.\n *\n * @return The pointer for interface descriptor.\n * @retval end   did not found interface descriptor */\nstatic void const* _next_desc_itf(void const *beg, void const *end) {\n  void const *cur = beg;\n  uint_fast8_t itfnum = ((tusb_desc_interface_t const*)cur)->bInterfaceNumber;\n  while ((cur < end) &&\n         (itfnum == ((tusb_desc_interface_t const*)cur)->bInterfaceNumber)) {\n    cur = _find_desc_2_type(tu_desc_next(cur), end, TUSB_DESC_INTERFACE, TUSB_DESC_INTERFACE_ASSOCIATION);\n  }\n  return cur;\n}\n\n/** Find the first interface descriptor with the specified interface number and alternate setting number.\n *\n * @param[in] beg     The head of descriptor byte array.\n * @param[in] end     The tail of descriptor byte array.\n * @param[in] itfnum  The target interface number.\n * @param[in] altnum  The target alternate setting number.\n *\n * @return The pointer for interface descriptor.\n * @retval end   did not found interface descriptor */\nstatic inline uint8_t const* _find_desc_itf(void const *beg, void const *end, uint_fast8_t itfnum, uint_fast8_t altnum)\n{\n  return (uint8_t const*) _find_desc_3(beg, end, TUSB_DESC_INTERFACE, itfnum, altnum);\n}\n\n/** Find the first endpoint descriptor belonging to the current interface descriptor.\n *\n * The search range is from `beg` to `end` or the next interface descriptor.\n *\n * @param[in] beg     The head of descriptor byte array.\n * @param[in] end     The tail of descriptor byte array.\n *\n * @return The pointer for endpoint descriptor.\n * @retval end   did not found endpoint descriptor */\nstatic void const* _find_desc_ep(void const *beg, void const *end)\n{\n  for (void const *cur = beg; cur < end; cur = tu_desc_next(cur)) {\n    uint_fast8_t desc_type = tu_desc_type(cur);\n    if (TUSB_DESC_ENDPOINT == desc_type) {\n      return cur;\n    }\n    if (TUSB_DESC_INTERFACE == desc_type) {\n      break;\n    }\n  }\n  return end;\n}\n\n/** Return the end of the video control descriptor. */\nstatic inline void const* _end_of_control_descriptor(void const *desc)\n{\n  tusb_desc_vc_itf_t const *vc = (tusb_desc_vc_itf_t const *)desc;\n  return ((uint8_t const*) desc) + vc->std.bLength + tu_le16toh(vc->ctl.wTotalLength);\n}\n\n/** Find the first entity descriptor with the entity ID\n *  specified by the argument belonging to the current video control descriptor.\n *\n * @param[in] desc      The video control interface descriptor.\n * @param[in] entityid  The target entity id.\n *\n * @return The pointer for interface descriptor.\n * @retval end   did not found interface descriptor */\nstatic void const* _find_desc_entity(void const *desc, uint_fast8_t entityid)\n{\n  void const *end = _end_of_control_descriptor(desc);\n  for (void const *cur = desc; cur < end; cur = _find_desc(cur, end, TUSB_DESC_CS_INTERFACE)) {\n    tusb_desc_cs_video_entity_itf_t const *itf = (tusb_desc_cs_video_entity_itf_t const *)cur;\n    if ((VIDEO_CS_ITF_VC_INPUT_TERMINAL  <= itf->bDescriptorSubtype\n         && itf->bDescriptorSubtype < VIDEO_CS_ITF_VC_MAX)\n        && itf->bEntityId == entityid) {\n      return itf;\n    }\n    cur = tu_desc_next(cur);\n  }\n  return end;\n}\n\n/** Return the end of the video streaming descriptor. */\nstatic inline void const* _end_of_streaming_descriptor(void const *desc)\n{\n  tusb_desc_vs_itf_t const *vs = (tusb_desc_vs_itf_t const *)desc;\n  return ((uint8_t const*) desc) + vs->std.bLength + tu_le16toh(vs->stm.wTotalLength);\n}\n\n/** Find the first format descriptor with the specified format number. */\nstatic inline void const *_find_desc_format(void const *beg, void const *end, uint_fast8_t fmtnum)\n{\n  for (void const *cur = beg; cur < end; cur = _find_desc(cur, end, TUSB_DESC_CS_INTERFACE)) {\n    uint8_t const *p = (uint8_t const *)cur;\n    uint_fast8_t fmt = p[2];\n    if ((fmt == VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED ||\n         fmt == VIDEO_CS_ITF_VS_FORMAT_MJPEG ||\n         fmt == VIDEO_CS_ITF_VS_FORMAT_DV ||\n         fmt == VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED) &&\n        fmtnum == p[3]) {\n      return cur;\n    }\n    cur = tu_desc_next(cur);\n  }\n  return end;\n}\n\n/** Find the first frame descriptor with the specified format number. */\nstatic inline void const *_find_desc_frame(void const *beg, void const *end, uint_fast8_t frmnum)\n{\n  for (void const *cur = beg; cur < end; cur = _find_desc(cur, end, TUSB_DESC_CS_INTERFACE)) {\n    uint8_t const *p = (uint8_t const *)cur;\n    uint_fast8_t frm = p[2];\n    if ((frm == VIDEO_CS_ITF_VS_FRAME_UNCOMPRESSED ||\n         frm == VIDEO_CS_ITF_VS_FRAME_MJPEG ||\n         frm == VIDEO_CS_ITF_VS_FRAME_FRAME_BASED) &&\n        frmnum == p[3]) {\n      return cur;\n    }\n    cur = tu_desc_next(cur);\n  }\n  return end;\n}\n\n/** Set uniquely determined values to variables that have not been set\n *\n * @param[in,out] param       Target */\nstatic bool _update_streaming_parameters(videod_streaming_interface_t const *stm,\n                                         video_probe_and_commit_control_t *param)\n{\n  tusb_desc_vs_itf_t const *vs = _get_desc_vs(stm);\n  uint_fast8_t fmtnum = param->bFormatIndex;\n  TU_ASSERT(vs && fmtnum <= vs->stm.bNumFormats);\n  if (0 == fmtnum) {\n    if (1 < vs->stm.bNumFormats) {\n      return true; /* Need to negotiate all variables. */\n    }\n    fmtnum = 1;\n    param->bFormatIndex = 1;\n  }\n\n  /* Set the parameters determined by the format  */\n  param->wKeyFrameRate    = 1;\n  param->wPFrameRate      = 0;\n  param->wCompWindowSize  = 1; /* GOP size? */\n  param->wDelay           = 0; /* milliseconds */\n  param->dwClockFrequency = 27000000; /* same as MPEG-2 system time clock  */\n  param->bmFramingInfo    = 0x3; /* enables FrameID and EndOfFrame */\n  param->bPreferedVersion = 1;\n  param->bMinVersion      = 1;\n  param->bMaxVersion      = 1;\n  param->bUsage           = 0;\n  param->bBitDepthLuma    = 8;\n\n  void const *end = _end_of_streaming_descriptor(vs);\n  tusb_desc_cs_video_fmt_t const *fmt = _find_desc_format(tu_desc_next(vs), end, fmtnum);\n  TU_ASSERT(fmt != end);\n\n  switch (fmt->bDescriptorSubType) {\n    case VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED:\n      param->wCompQuality = 1; /* 1 to 10000 */\n      break;\n\n    case VIDEO_CS_ITF_VS_FORMAT_MJPEG:\n      break;\n\n    case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:\n      break;\n\n    default: return false;\n  }\n\n  uint_fast8_t frmnum = param->bFrameIndex;\n  TU_ASSERT(frmnum <= fmt->bNumFrameDescriptors);\n  if (0 == frmnum) {\n    if (1 < fmt->bNumFrameDescriptors) {\n      return true;\n    }\n    frmnum = 1;\n    param->bFrameIndex = 1;\n  }\n  tusb_desc_cs_video_frm_t const *frm = _find_desc_frame(tu_desc_next(fmt), end, frmnum);\n  TU_ASSERT(frm != end);\n\n  /* Set the parameters determined by the frame  */\n  uint_fast32_t frame_size = param->dwMaxVideoFrameSize;\n  if (0 == frame_size) {\n    switch (fmt->bDescriptorSubType) {\n      case VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED:\n        frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * fmt->uncompressed.bBitsPerPixel / 8;\n        break;\n\n      case VIDEO_CS_ITF_VS_FORMAT_MJPEG:\n        frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */\n        break;\n\n      case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:\n        frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */\n        break;\n\n      default: break;\n    }\n    param->dwMaxVideoFrameSize = frame_size;\n  }\n\n  uint_fast32_t interval = param->dwFrameInterval;\n  if (0 == interval) {\n    if ((1 < frm->uncompressed.bFrameIntervalType) ||\n        ((0 == frm->uncompressed.bFrameIntervalType) &&\n         (frm->uncompressed.dwFrameInterval[1] != frm->uncompressed.dwFrameInterval[0]))) {\n      return true;\n    }\n    interval = frm->uncompressed.dwFrameInterval[0];\n    param->dwFrameInterval = interval;\n  }\n  uint_fast32_t interval_ms = interval / 10000;\n  TU_ASSERT(interval_ms != 0);\n  uint_fast32_t payload_size = (frame_size + interval_ms - 1) / interval_ms + 2;\n  if (CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE < payload_size) {\n    payload_size = CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE;\n  }\n  param->dwMaxPayloadTransferSize = payload_size;\n  return true;\n}\n\n/** Set the minimum, maximum, default values or resolutions to variables which need to negotiate with the host\n *\n * @param[in]     request     GET_MAX, GET_MIN, GET_RES or GET_DEF\n * @param[in,out] param       Target\n */\nstatic bool _negotiate_streaming_parameters(videod_streaming_interface_t const *stm, uint_fast8_t request,\n                                            video_probe_and_commit_control_t *param)\n{\n  uint_fast8_t const fmtnum = param->bFormatIndex;\n  if (0 == fmtnum) {\n    switch (request) {\n      case VIDEO_REQUEST_GET_MAX:\n        if (_get_desc_vs(stm))\n          param->bFormatIndex = _get_desc_vs(stm)->stm.bNumFormats;\n        break;\n\n      case VIDEO_REQUEST_GET_MIN:\n      case VIDEO_REQUEST_GET_DEF:\n        param->bFormatIndex = 1;\n        break;\n\n      default: return false;\n    }\n    /* Set the parameters determined by the format  */\n    param->wKeyFrameRate    = 1;\n    param->wPFrameRate      = 0;\n    param->wCompQuality     = 1; /* 1 to 10000 */\n    param->wCompWindowSize  = 1; /* GOP size? */\n    param->wDelay           = 0; /* milliseconds */\n    param->dwClockFrequency = 27000000; /* same as MPEG-2 system time clock  */\n    param->bmFramingInfo    = 0x3; /* enables FrameID and EndOfFrame */\n    param->bPreferedVersion = 1;\n    param->bMinVersion      = 1;\n    param->bMaxVersion      = 1;\n    param->bUsage           = 0;\n    param->bBitDepthLuma    = 8;\n    return true;\n  }\n\n  uint_fast8_t frmnum = param->bFrameIndex;\n  if (0 == frmnum) {\n    tusb_desc_vs_itf_t const *vs = _get_desc_vs(stm);\n    TU_ASSERT(vs);\n    void const *end = _end_of_streaming_descriptor(vs);\n    tusb_desc_cs_video_fmt_t const *fmt = _find_desc_format(tu_desc_next(vs), end, fmtnum);\n    switch (request) {\n      case VIDEO_REQUEST_GET_MAX:\n        frmnum = fmt->bNumFrameDescriptors;\n        break;\n\n      case VIDEO_REQUEST_GET_MIN:\n        frmnum = 1;\n        break;\n\n      case VIDEO_REQUEST_GET_DEF:\n        switch (fmt->bDescriptorSubType) {\n          case VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED:\n            frmnum = fmt->uncompressed.bDefaultFrameIndex;\n            break;\n\n          case VIDEO_CS_ITF_VS_FORMAT_MJPEG:\n            frmnum = fmt->mjpeg.bDefaultFrameIndex;\n            break;\n\n          case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:\n            frmnum = fmt->frame_based.bDefaultFrameIndex;\n            break;\n\n          default: return false;\n        }\n        break;\n      default: return false;\n    }\n    param->bFrameIndex = (uint8_t)frmnum;\n    /* Set the parameters determined by the frame */\n    tusb_desc_cs_video_frm_t const *frm = _find_desc_frame(tu_desc_next(fmt), end, frmnum);\n    uint_fast32_t frame_size;\n    switch (fmt->bDescriptorSubType) {\n      case VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED:\n        frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * fmt->uncompressed.bBitsPerPixel / 8;\n        break;\n\n      case VIDEO_CS_ITF_VS_FORMAT_MJPEG:\n        frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */\n        break;\n\n      case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:\n        frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */\n        break;\n\n      default: return false;\n    }\n    param->dwMaxVideoFrameSize = frame_size;\n    return true;\n  }\n\n  if (0 == param->dwFrameInterval) {\n    tusb_desc_vs_itf_t const *vs = _get_desc_vs(stm);\n    TU_ASSERT(vs);\n    void const *end = _end_of_streaming_descriptor(vs);\n    tusb_desc_cs_video_fmt_t const *fmt = _find_desc_format(tu_desc_next(vs), end, fmtnum);\n    tusb_desc_cs_video_frm_t const *frm = _find_desc_frame(tu_desc_next(fmt), end, frmnum);\n\n    uint_fast32_t interval, interval_ms;\n    switch (request) {\n      case VIDEO_REQUEST_GET_MAX: {\n        uint_fast32_t min_interval, max_interval;\n        uint_fast8_t num_intervals = frm->uncompressed.bFrameIntervalType;\n        max_interval = num_intervals ? frm->uncompressed.dwFrameInterval[num_intervals - 1]: frm->uncompressed.dwFrameInterval[1];\n        min_interval = frm->uncompressed.dwFrameInterval[0];\n        interval = max_interval;\n        interval_ms = min_interval / 10000;\n        break;\n      }\n\n      case VIDEO_REQUEST_GET_MIN: {\n        uint_fast32_t min_interval, max_interval;\n        uint_fast8_t num_intervals = frm->uncompressed.bFrameIntervalType;\n        max_interval = num_intervals ? frm->uncompressed.dwFrameInterval[num_intervals - 1]: frm->uncompressed.dwFrameInterval[1];\n        min_interval = frm->uncompressed.dwFrameInterval[0];\n        interval = min_interval;\n        interval_ms = max_interval / 10000;\n        break;\n      }\n\n      case VIDEO_REQUEST_GET_DEF:\n        interval = frm->uncompressed.dwDefaultFrameInterval;\n        interval_ms = interval / 10000;\n        break;\n\n      case VIDEO_REQUEST_GET_RES: {\n        uint_fast8_t num_intervals = frm->uncompressed.bFrameIntervalType;\n        if (num_intervals) {\n          interval = 0;\n          interval_ms = 0;\n        } else {\n          interval = frm->uncompressed.dwFrameInterval[2];\n          interval_ms = interval / 10000;\n        }\n        break;\n      }\n\n      default: return false;\n    }\n    param->dwFrameInterval = interval;\n    if (0 == interval) {\n      param->dwMaxPayloadTransferSize = 0;\n    } else {\n      uint_fast32_t frame_size = param->dwMaxVideoFrameSize;\n      uint_fast32_t payload_size;\n      if (0 == interval_ms) {\n        payload_size = frame_size + 2;\n      } else {\n        payload_size = (frame_size + interval_ms - 1) / interval_ms + 2;\n      }\n      if (CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE < payload_size) {\n        payload_size = CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE;\n      }\n      param->dwMaxPayloadTransferSize = payload_size;\n    }\n    return true;\n  }\n  return true;\n}\n\n/** Close current video control interface.\n *\n * @param[in,out] self     Video control interface context.\n * @param[in]     altnum   The target alternate setting number. */\nstatic bool _close_vc_itf(uint8_t rhport, videod_interface_t *self)\n{\n  tusb_desc_vc_itf_t const *vc = _get_desc_vc(self);\n\n  /* The next descriptor after the class-specific VC interface header descriptor. */\n  void const *cur = (uint8_t const*)vc + vc->std.bLength + vc->ctl.bLength;\n\n  /* The end of the video control interface descriptor. */\n  void const *end = _end_of_control_descriptor(vc);\n  if (vc->std.bNumEndpoints != 0) {\n    /* Extend end to cover the standard endpoint and class-specific endpoint descriptors\n     * that follow wTotalLength */\n    end = (uint8_t const*)end + sizeof(tusb_desc_endpoint_t) + sizeof(tusb_desc_cs_video_vc_ep_t);\n    /* Find the notification endpoint descriptor. */\n    cur = _find_desc(cur, end, TUSB_DESC_ENDPOINT);\n    TU_ASSERT(cur < end);\n    tusb_desc_endpoint_t const *notif = (tusb_desc_endpoint_t const *)cur;\n    usbd_edpt_close(rhport, notif->bEndpointAddress);\n  }\n  self->cur = 0;\n  return true;\n}\n\n/** Set the alternate setting to own video control interface.\n *\n * @param[in,out] self     Video control interface context.\n * @param[in]     altnum   The target alternate setting number. */\nstatic bool _open_vc_itf(uint8_t rhport, videod_interface_t *self, uint_fast8_t altnum)\n{\n  TU_LOG_DRV(\"    open VC %d\\r\\n\", altnum);\n  uint8_t const *beg = self->beg;\n  uint8_t const *end = beg + self->len;\n\n  /* The first descriptor is a video control interface descriptor. */\n  uint8_t const *cur = _find_desc_itf(beg, end, _desc_itfnum(beg), altnum);\n  TU_LOG_DRV(\"    cur %\" PRId32 \"\\r\\n\", (int32_t) (cur - beg));\n  TU_VERIFY(cur < end);\n\n  tusb_desc_vc_itf_t const *vc = (tusb_desc_vc_itf_t const *)cur;\n  TU_LOG_DRV(\"    bInCollection %d\\r\\n\", vc->ctl.bInCollection);\n  /* Support for up to 2 streaming interfaces only. */\n  TU_ASSERT(vc->ctl.bInCollection <= CFG_TUD_VIDEO_STREAMING);\n\n  /* Update to point the end of the video control interface descriptor. */\n  end = _end_of_control_descriptor(cur);\n\n  /* Advance to the next descriptor after the class-specific VC interface header descriptor. */\n  cur += vc->std.bLength + vc->ctl.bLength;\n  TU_LOG_DRV(\"    bNumEndpoints %d\\r\\n\", vc->std.bNumEndpoints);\n  /* Open the notification endpoint if it exist. */\n  if (vc->std.bNumEndpoints != 0) {\n    /* Support for 1 endpoint only. */\n    TU_VERIFY(1 == vc->std.bNumEndpoints);\n    /* Extend end to cover the standard endpoint and class-specific endpoint descriptors\n     * that follow wTotalLength */\n    end = (uint8_t const*)end + sizeof(tusb_desc_endpoint_t) + sizeof(tusb_desc_cs_video_vc_ep_t);\n    /* Find the notification endpoint descriptor. */\n    cur = _find_desc(cur, end, TUSB_DESC_ENDPOINT);\n    TU_VERIFY(cur < end);\n    tusb_desc_endpoint_t const *notif = (tusb_desc_endpoint_t const *)cur;\n    /* Open the notification endpoint */\n    TU_ASSERT(usbd_edpt_open(rhport, notif));\n  }\n  self->cur = (uint16_t) ((uint8_t const*)vc - beg);\n  return true;\n}\n\nstatic bool _init_vs_configuration(videod_streaming_interface_t *stm) {\n  /* initialize streaming settings */\n  stm->state = VS_STATE_PROBING;\n  stm->max_payload_transfer_size = 0;\n  video_probe_and_commit_control_t *param = &stm->probe_commit_payload;\n  tu_memclr(param, sizeof(*param));\n  return _update_streaming_parameters(stm, param);\n}\n\n/** Set the alternate setting to own video streaming interface.\n *\n * @param[in,out] stm      Streaming interface context.\n * @param[in]     altnum   The target alternate setting number. */\nstatic bool _open_vs_itf(uint8_t rhport, videod_streaming_interface_t *stm, uint_fast8_t altnum)\n{\n  uint_fast8_t i;\n  TU_LOG_DRV(\"    reopen VS %d\\r\\n\", altnum);\n  uint8_t const *desc = _videod_itf[stm->index_vc].beg;\n\n#ifndef TUP_DCD_EDPT_ISO_ALLOC\n  /* Close endpoints of previous settings. */\n  for (i = 0; i < TU_ARRAY_SIZE(stm->desc.ep); ++i) {\n    uint_fast16_t ofs_ep = stm->desc.ep[i];\n    if (!ofs_ep) break;\n    tusb_desc_endpoint_t const *ep = (tusb_desc_endpoint_t const*)(desc + ofs_ep);\n    /* Only ISO endpoints needs to be closed */\n    if(ep->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS) {\n      stm->desc.ep[i] = 0;\n      usbd_edpt_close(rhport, ep->bEndpointAddress);\n      TU_LOG_DRV(\"    close EP%02x\\r\\n\", ep->bEndpointAddress);\n    }\n  }\n#endif\n\n  /* clear transfer management information */\n  stm->buffer  = NULL;\n  stm->bufsize = 0;\n  stm->offset  = 0;\n\n  /* Find a alternate interface */\n  uint8_t const *beg = desc + stm->desc.beg;\n  uint8_t const *end = desc + stm->desc.end;\n  uint8_t const *cur = _find_desc_itf(beg, end, _desc_itfnum(beg), altnum);\n  TU_VERIFY(cur < end);\n\n  uint_fast8_t numeps = ((tusb_desc_interface_t const *)cur)->bNumEndpoints;\n  TU_ASSERT(numeps <= TU_ARRAY_SIZE(stm->desc.ep));\n  stm->desc.cur = (uint16_t)(cur - desc); /* Save the offset of the new settings */\n  if (!altnum && (VS_STATE_COMMITTED != stm->state)) {\n    TU_VERIFY(_init_vs_configuration(stm));\n  }\n  /* Open bulk or isochronous endpoints of the new settings. */\n  for (i = 0, cur = tu_desc_next(cur); i < numeps; ++i, cur = tu_desc_next(cur)) {\n    cur = _find_desc_ep(cur, end);\n    TU_ASSERT(cur < end);\n    tusb_desc_endpoint_t const *ep = (tusb_desc_endpoint_t const*)cur;\n    uint_fast32_t max_size = stm->max_payload_transfer_size;\n    if (altnum && (TUSB_XFER_ISOCHRONOUS == ep->bmAttributes.xfer)) {\n      /* FS must be less than or equal to max packet size */\n      TU_VERIFY (tu_edpt_packet_size(ep) >= max_size);\n#ifdef TUP_DCD_EDPT_ISO_ALLOC\n      usbd_edpt_iso_activate(rhport, ep);\n#else\n      TU_ASSERT(usbd_edpt_open(rhport, ep));\n#endif\n    } else {\n      TU_VERIFY(TUSB_XFER_BULK == ep->bmAttributes.xfer);\n      TU_ASSERT(usbd_edpt_open(rhport, ep));\n    }\n    stm->desc.ep[i] = (uint16_t) (cur - desc);\n    TU_LOG_DRV(\"    open EP%02x\\r\\n\", _desc_ep_addr(cur));\n  }\n  if (altnum != 0) {\n    stm->state = VS_STATE_STREAMING;\n  }\n  TU_LOG_DRV(\"    done\\r\\n\");\n  return true;\n}\n\n/** Prepare the next packet payload. */\nstatic uint_fast16_t _prepare_in_payload(videod_streaming_interface_t *stm, uint8_t* ep_buf) {\n  uint_fast16_t remaining = stm->bufsize - stm->offset;\n  uint_fast16_t hdr_len   = ep_buf[0];\n  uint_fast16_t pkt_len   = stm->max_payload_transfer_size;\n  if (hdr_len + remaining < pkt_len) {\n    pkt_len = hdr_len + remaining;\n  }\n  TU_ASSERT(pkt_len >= hdr_len);\n  uint_fast16_t data_len = pkt_len - hdr_len;\n  if (stm->buffer) {\n    memcpy(&ep_buf[hdr_len], stm->buffer + stm->offset, data_len);\n  } else {\n    tud_video_payload_request_t rqst = {\n      .buf = &ep_buf[hdr_len],\n      .length = data_len,\n      .offset = stm->offset\n    };\n    tud_video_prepare_payload_cb(stm->index_vc, stm->index_vs, &rqst);\n  }\n  stm->offset += data_len;\n  remaining -= data_len;\n  if (!remaining) {\n    tusb_video_payload_header_t *hdr = (tusb_video_payload_header_t*) ep_buf;\n    hdr->EndOfFrame = 1;\n  }\n  return hdr_len + data_len;\n}\n\n/** Handle a standard request to the video control interface. */\nstatic int handle_video_ctl_std_req(uint8_t rhport, uint8_t stage,\n                                    tusb_control_request_t const *request,\n                                    uint_fast8_t ctl_idx)\n{\n  TU_LOG_DRV(\"\\r\\n\");\n  switch (request->bRequest) {\n    case TUSB_REQ_GET_INTERFACE:\n      if (stage == CONTROL_STAGE_SETUP)\n      {\n        TU_VERIFY(1 == request->wLength, VIDEO_ERROR_UNKNOWN);\n        tusb_desc_vc_itf_t const *vc = _get_desc_vc(&_videod_itf[ctl_idx]);\n        TU_VERIFY(vc, VIDEO_ERROR_UNKNOWN);\n\n        uint8_t alt_num = vc->std.bAlternateSetting;\n\n        TU_VERIFY(tud_control_xfer(rhport, request, &alt_num, sizeof(alt_num)), VIDEO_ERROR_UNKNOWN);\n      }\n      return VIDEO_ERROR_NONE;\n\n    case TUSB_REQ_SET_INTERFACE:\n      if (stage == CONTROL_STAGE_SETUP)\n      {\n        TU_VERIFY(0 == request->wLength, VIDEO_ERROR_UNKNOWN);\n        TU_VERIFY(_close_vc_itf(rhport, &_videod_itf[ctl_idx]), VIDEO_ERROR_UNKNOWN);\n        TU_VERIFY(_open_vc_itf(rhport, &_videod_itf[ctl_idx], request->wValue), VIDEO_ERROR_UNKNOWN);\n        tud_control_status(rhport, request);\n      }\n      return VIDEO_ERROR_NONE;\n\n    default: /* Unknown/Unsupported request */\n      TU_BREAKPOINT();\n      return VIDEO_ERROR_INVALID_REQUEST;\n  }\n}\n\nstatic int handle_video_ctl_cs_req(uint8_t rhport, uint8_t stage,\n                                   tusb_control_request_t const *request,\n                                   uint_fast8_t ctl_idx)\n{\n  videod_interface_t *self = &_videod_itf[ctl_idx];\n\n  /* 4.2.1 Interface Control Request */\n  uint8_t const ctrl_sel = TU_U16_HIGH(request->wValue);\n  TU_LOG_DRV(\"%s_Control(%s)\\r\\n\",  tu_str_video_vc_control_selector[ctrl_sel], tu_lookup_find(&tu_table_video_request, request->bRequest));\n\n  switch (ctrl_sel) {\n    case VIDEO_VC_CTL_VIDEO_POWER_MODE:\n      switch (request->bRequest) {\n        case VIDEO_REQUEST_SET_CUR:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(1 == request->wLength, VIDEO_ERROR_UNKNOWN);\n            TU_VERIFY(tud_control_xfer(rhport, request, &self->power_mode, sizeof(self->power_mode)), VIDEO_ERROR_UNKNOWN);\n          } else if (stage == CONTROL_STAGE_DATA) {\n            return tud_video_power_mode_cb(ctl_idx, self->power_mode);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_CUR:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(1 == request->wLength, VIDEO_ERROR_UNKNOWN);\n            TU_VERIFY(tud_control_xfer(rhport, request, &self->power_mode, sizeof(self->power_mode)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_INFO:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(1 == request->wLength, VIDEO_ERROR_UNKNOWN);\n            TU_VERIFY(tud_control_xfer(rhport, request, (uint8_t*)(uintptr_t) &_cap_get_set, sizeof(_cap_get_set)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        default: break;\n      }\n      break;\n\n    case VIDEO_VC_CTL_REQUEST_ERROR_CODE:\n      switch (request->bRequest) {\n        case VIDEO_REQUEST_GET_CUR:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(tud_control_xfer(rhport, request, &self->error_code, sizeof(uint8_t)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_INFO:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(tud_control_xfer(rhport, request, (uint8_t*)(uintptr_t) &_cap_get, sizeof(_cap_get)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        default: break;\n      }\n      break;\n\n    default: break;\n  }\n\n  /* Unknown/Unsupported request */\n  TU_BREAKPOINT();\n  return VIDEO_ERROR_INVALID_REQUEST;\n}\n\nstatic int handle_video_ctl_req(uint8_t rhport, uint8_t stage,\n                                tusb_control_request_t const *request,\n                                uint_fast8_t ctl_idx)\n{\n  switch (request->bmRequestType_bit.type) {\n    case TUSB_REQ_TYPE_STANDARD:\n      return handle_video_ctl_std_req(rhport, stage, request, ctl_idx);\n\n    case TUSB_REQ_TYPE_CLASS: {\n      uint_fast8_t entity_id = TU_U16_HIGH(request->wIndex);\n      if (0 == entity_id) {\n        return handle_video_ctl_cs_req(rhport, stage, request, ctl_idx);\n      } else {\n        TU_VERIFY(_find_desc_entity(_get_desc_vc(&_videod_itf[ctl_idx]), entity_id), VIDEO_ERROR_INVALID_REQUEST);\n        return VIDEO_ERROR_NONE;\n      }\n    }\n\n    default:\n      return VIDEO_ERROR_INVALID_REQUEST;\n  }\n}\n\nstatic int handle_video_stm_std_req(uint8_t rhport, uint8_t stage,\n                                    tusb_control_request_t const *request,\n                                    uint_fast8_t stm_idx) {\n  TU_LOG_DRV(\"\\r\\n\");\n  videod_streaming_interface_t *self = &_videod_streaming_itf[stm_idx];\n  switch (request->bRequest) {\n    case TUSB_REQ_GET_INTERFACE:\n      if (stage == CONTROL_STAGE_SETUP) {\n        TU_VERIFY(1 == request->wLength, VIDEO_ERROR_UNKNOWN);\n        tusb_desc_vs_itf_t const *vs = _get_desc_vs(self);\n        TU_VERIFY(vs, VIDEO_ERROR_UNKNOWN);\n        uint8_t alt_num = vs->std.bAlternateSetting;\n\n        TU_VERIFY(tud_control_xfer(rhport, request, &alt_num, sizeof(alt_num)), VIDEO_ERROR_UNKNOWN);\n      }\n      return VIDEO_ERROR_NONE;\n\n    case TUSB_REQ_SET_INTERFACE:\n      if (stage == CONTROL_STAGE_SETUP) {\n        TU_VERIFY(_open_vs_itf(rhport, self, request->wValue), VIDEO_ERROR_UNKNOWN);\n        tud_control_status(rhport, request);\n      }\n      return VIDEO_ERROR_NONE;\n\n    default: /* Unknown/Unsupported request */\n      TU_BREAKPOINT();\n      return VIDEO_ERROR_INVALID_REQUEST;\n  }\n}\n\nstatic int handle_video_stm_cs_req(uint8_t rhport, uint8_t stage,\n                                   tusb_control_request_t const *request,\n                                   uint_fast8_t stm_idx) {\n  (void)rhport;\n  videod_streaming_interface_t *stm = &_videod_streaming_itf[stm_idx];\n  videod_streaming_epbuf_t *stm_epbuf = &_videod_streaming_epbuf[stm_idx];\n\n  uint8_t const ctrl_sel = TU_U16_HIGH(request->wValue);\n  TU_LOG_DRV(\"%s_Control(%s)\\r\\n\", tu_str_video_vs_control_selector[ctrl_sel], tu_lookup_find(&tu_table_video_request, request->bRequest));\n\n  /* 4.2.1 Interface Control Request */\n  switch (ctrl_sel) {\n    case VIDEO_VS_CTL_STREAM_ERROR_CODE:\n      switch (request->bRequest) {\n        case VIDEO_REQUEST_GET_CUR:\n          if (stage == CONTROL_STAGE_SETUP) {\n            /* TODO */\n            TU_VERIFY(tud_control_xfer(rhport, request, &stm->error_code, sizeof(uint8_t)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_INFO:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(tud_control_xfer(rhport, request, (uint8_t*)(uintptr_t) &_cap_get, sizeof(_cap_get)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        default: break;\n      }\n      break;\n\n    case VIDEO_VS_CTL_PROBE:\n      if (stm->state != VS_STATE_PROBING) {\n        stm->state = VS_STATE_PROBING;\n      }\n\n      switch (request->bRequest) {\n        case VIDEO_REQUEST_SET_CUR:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(tud_control_xfer(rhport, request, &stm->probe_commit_payload, sizeof(video_probe_and_commit_control_t)),\n                      VIDEO_ERROR_UNKNOWN);\n          } else if (stage == CONTROL_STAGE_DATA) {\n            TU_VERIFY(_update_streaming_parameters(stm, &stm->probe_commit_payload),\n                      VIDEO_ERROR_INVALID_VALUE_WITHIN_RANGE);\n          } else {\n            // nothing to do\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_CUR:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(request->wLength != 0, VIDEO_ERROR_UNKNOWN);\n            TU_VERIFY(tud_control_xfer(rhport, request, &stm->probe_commit_payload, sizeof(video_probe_and_commit_control_t)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_MIN:\n        case VIDEO_REQUEST_GET_MAX:\n        case VIDEO_REQUEST_GET_RES:\n        case VIDEO_REQUEST_GET_DEF:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(request->wLength != 0, VIDEO_ERROR_UNKNOWN);\n            video_probe_and_commit_control_t tmp = stm->probe_commit_payload;\n            TU_VERIFY(_negotiate_streaming_parameters(stm, request->bRequest, &tmp), VIDEO_ERROR_INVALID_VALUE_WITHIN_RANGE);\n            TU_VERIFY(tud_control_xfer(rhport, request, &tmp, sizeof(tmp)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_LEN:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(2 == request->wLength, VIDEO_ERROR_UNKNOWN);\n            uint16_t len = sizeof(video_probe_and_commit_control_t);\n            TU_VERIFY(tud_control_xfer(rhport, request, (uint8_t*)&len, sizeof(len)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_INFO:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(1 == request->wLength, VIDEO_ERROR_UNKNOWN);\n            TU_VERIFY(tud_control_xfer(rhport, request, (uint8_t*)(uintptr_t)&_cap_get_set, sizeof(_cap_get_set)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        default: break;\n      }\n      break;\n\n    case VIDEO_VS_CTL_COMMIT:\n      switch (request->bRequest) {\n        case VIDEO_REQUEST_SET_CUR:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(tud_control_xfer(rhport, request, &stm->probe_commit_payload, sizeof(video_probe_and_commit_control_t)), VIDEO_ERROR_UNKNOWN);\n          } else if (stage == CONTROL_STAGE_DATA) {\n            video_probe_and_commit_control_t *param = &stm->probe_commit_payload;\n            TU_VERIFY(_update_streaming_parameters(stm, param), VIDEO_ERROR_INVALID_VALUE_WITHIN_RANGE);\n            /* Set the negotiated value */\n            stm->max_payload_transfer_size = param->dwMaxPayloadTransferSize;\n            int ret = tud_video_commit_cb(stm->index_vc, stm->index_vs, param);\n            if (VIDEO_ERROR_NONE == ret) {\n              stm->state   = VS_STATE_COMMITTED;\n              stm->buffer  = NULL;\n              stm->bufsize = 0;\n              stm->offset  = 0;\n              /* initialize payload header */\n              tusb_video_payload_header_t *hdr = (tusb_video_payload_header_t*)stm_epbuf->buf;\n              hdr->bHeaderLength = sizeof(*hdr);\n              hdr->bmHeaderInfo  = 0;\n            }\n          } else {\n            // nothing to do\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_CUR:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(request->wLength != 0, VIDEO_ERROR_UNKNOWN);\n            TU_VERIFY(tud_control_xfer(rhport, request, &stm->probe_commit_payload, sizeof(video_probe_and_commit_control_t)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_LEN:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(2 == request->wLength, VIDEO_ERROR_UNKNOWN);\n            uint16_t len = sizeof(video_probe_and_commit_control_t);\n            TU_VERIFY(tud_control_xfer(rhport, request, (uint8_t*)&len, sizeof(len)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        case VIDEO_REQUEST_GET_INFO:\n          if (stage == CONTROL_STAGE_SETUP) {\n            TU_VERIFY(1 == request->wLength, VIDEO_ERROR_UNKNOWN);\n            TU_VERIFY(tud_control_xfer(rhport, request, (uint8_t*)(uintptr_t) &_cap_get_set, sizeof(_cap_get_set)), VIDEO_ERROR_UNKNOWN);\n          }\n          return VIDEO_ERROR_NONE;\n\n        default: break;\n      }\n      break;\n\n    case VIDEO_VS_CTL_STILL_PROBE:\n    case VIDEO_VS_CTL_STILL_COMMIT:\n    case VIDEO_VS_CTL_STILL_IMAGE_TRIGGER:\n    case VIDEO_VS_CTL_GENERATE_KEY_FRAME:\n    case VIDEO_VS_CTL_UPDATE_FRAME_SEGMENT:\n    case VIDEO_VS_CTL_SYNCH_DELAY_CONTROL:\n      /* TODO */\n      break;\n\n    default: break;\n  }\n\n  /* Unknown/Unsupported request */\n  TU_BREAKPOINT();\n  return VIDEO_ERROR_INVALID_REQUEST;\n}\n\nstatic int handle_video_stm_req(uint8_t rhport, uint8_t stage,\n                                tusb_control_request_t const *request,\n                                uint_fast8_t stm_idx) {\n  switch (request->bmRequestType_bit.type) {\n    case TUSB_REQ_TYPE_STANDARD:\n      return handle_video_stm_std_req(rhport, stage, request, stm_idx);\n\n    case TUSB_REQ_TYPE_CLASS:\n      if (0 != TU_U16_HIGH(request->wIndex)) {\n        return VIDEO_ERROR_INVALID_REQUEST;\n      }\n      return handle_video_stm_cs_req(rhport, stage, request, stm_idx);\n\n    default: return VIDEO_ERROR_INVALID_REQUEST;\n  }\n}\n\n//--------------------------------------------------------------------+\n// APPLICATION API\n//--------------------------------------------------------------------+\n\nbool tud_video_n_connected(uint_fast8_t ctl_idx) {\n  TU_ASSERT(ctl_idx < CFG_TUD_VIDEO);\n  videod_streaming_interface_t *stm = _get_instance_streaming(ctl_idx, 0);\n  if (stm != NULL) {\n    return true;\n  }\n  return false;\n}\n\nbool tud_video_n_streaming(uint_fast8_t ctl_idx, uint_fast8_t stm_idx)\n{\n  TU_ASSERT(ctl_idx < CFG_TUD_VIDEO);\n  TU_ASSERT(stm_idx < CFG_TUD_VIDEO_STREAMING);\n  videod_streaming_interface_t *stm = _get_instance_streaming(ctl_idx, stm_idx);\n  if (NULL == stm || 0 == stm->desc.ep[0]) {\n    return false;\n  }\n  if (stm->state == VS_STATE_PROBING) {\n    return false;\n  }\n\n  #ifdef TUP_DCD_EDPT_ISO_ALLOC\n  uint8_t const *desc = _videod_itf[stm->index_vc].beg;\n  uint_fast16_t ofs_ep = stm->desc.ep[0];\n  tusb_desc_endpoint_t const *ep = (tusb_desc_endpoint_t const*)(desc + ofs_ep);\n  if (ep->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS) {\n    if (stm->state == VS_STATE_COMMITTED) {\n      return false;\n    }\n  }\n#endif\n\n  return true;\n}\n\nbool tud_video_n_frame_xfer(uint_fast8_t ctl_idx, uint_fast8_t stm_idx, void *buffer, size_t bufsize) {\n  TU_ASSERT(ctl_idx < CFG_TUD_VIDEO);\n  TU_ASSERT(stm_idx < CFG_TUD_VIDEO_STREAMING);\n\n  if (0 == bufsize) {\n    return false;\n  }\n\n  videod_streaming_interface_t *stm = _get_instance_streaming(ctl_idx, stm_idx);\n  videod_streaming_epbuf_t *stm_epbuf = &_videod_streaming_epbuf[ctl_idx];\n\n  if (NULL == stm || 0 == stm->desc.ep[0] || stm->bufsize) {\n    return false;\n  }\n  if (stm->state == VS_STATE_PROBING) {\n    return false;\n  }\n\n  /* Find EP address */\n  uint8_t const *desc = _videod_itf[stm->index_vc].beg;\n  uint8_t ep_addr = 0;\n  for (uint_fast8_t i = 0; i < CFG_TUD_VIDEO_STREAMING; ++i) {\n    uint_fast16_t ofs_ep = stm->desc.ep[i];\n    if (0 == ofs_ep) {\n      continue;\n    }\n    ep_addr = _desc_ep_addr(desc + ofs_ep);\n    break;\n  }\n  if (0 == ep_addr) {\n    return false;\n  }\n\n  TU_VERIFY(usbd_edpt_claim(0, ep_addr));\n  /* update the packet header */\n  tusb_video_payload_header_t *hdr = (tusb_video_payload_header_t*)stm_epbuf->buf;\n  hdr->FrameID   ^= 1;\n  hdr->EndOfFrame = 0;\n  /* update the packet data */\n  stm->buffer     = (uint8_t*)buffer;\n  stm->bufsize    = bufsize;\n  uint_fast16_t pkt_len = _prepare_in_payload(stm, stm_epbuf->buf);\n  TU_ASSERT( usbd_edpt_xfer(0, ep_addr, stm_epbuf->buf, (uint16_t) pkt_len, false), 0);\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// USBD Driver API\n//--------------------------------------------------------------------+\nvoid videod_init(void) {\n  for (uint_fast8_t i = 0; i < CFG_TUD_VIDEO; ++i) {\n    videod_interface_t* ctl = &_videod_itf[i];\n    tu_memclr(ctl, sizeof(*ctl));\n  }\n  for (uint_fast8_t i = 0; i < CFG_TUD_VIDEO_STREAMING; ++i) {\n    videod_streaming_interface_t *stm = &_videod_streaming_itf[i];\n    tu_memclr(stm, sizeof(videod_streaming_interface_t));\n  }\n}\n\nbool videod_deinit(void) {\n  return true;\n}\n\nvoid videod_reset(uint8_t rhport) {\n  (void) rhport;\n  for (uint_fast8_t i = 0; i < CFG_TUD_VIDEO; ++i) {\n    videod_interface_t* ctl = &_videod_itf[i];\n    tu_memclr(ctl, sizeof(*ctl));\n  }\n  for (uint_fast8_t i = 0; i < CFG_TUD_VIDEO_STREAMING; ++i) {\n    videod_streaming_interface_t *stm = &_videod_streaming_itf[i];\n    tu_memclr(stm, sizeof(videod_streaming_interface_t));\n  }\n}\n\nuint16_t videod_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len) {\n  TU_VERIFY((TUSB_CLASS_VIDEO       == itf_desc->bInterfaceClass) &&\n            (VIDEO_SUBCLASS_CONTROL == itf_desc->bInterfaceSubClass) &&\n            (VIDEO_ITF_PROTOCOL_15  == itf_desc->bInterfaceProtocol), 0);\n\n  /* Find available interface */\n  videod_interface_t *self = NULL;\n  uint8_t ctl_idx;\n  for (ctl_idx = 0; ctl_idx < CFG_TUD_VIDEO; ++ctl_idx) {\n    if (NULL != _videod_itf[ctl_idx].beg) {\n      continue;\n    }\n    self = &_videod_itf[ctl_idx];\n    break;\n  }\n  TU_ASSERT(ctl_idx < CFG_TUD_VIDEO, 0);\n\n  uint8_t const *end = (uint8_t const*)itf_desc + max_len;\n  self->beg = (uint8_t const*) itf_desc;\n  self->len = max_len;\n\n  /*------------- Video Control Interface -------------*/\n  TU_VERIFY(_open_vc_itf(rhport, self, 0), 0);\n  tusb_desc_vc_itf_t const *vc = _get_desc_vc(self);\n  uint_fast8_t bInCollection   = vc->ctl.bInCollection;\n\n  /* Find the end of the video interface descriptor */\n  void const *cur = _next_desc_itf(itf_desc, end);\n  for (uint8_t stm_idx = 0; stm_idx < bInCollection; ++stm_idx) {\n    videod_streaming_interface_t *stm = NULL;\n    /* find free streaming interface handle */\n    for (uint8_t i = 0; i < CFG_TUD_VIDEO_STREAMING; ++i) {\n      if (0 != _videod_streaming_itf[i].desc.beg) {\n        continue;\n      }\n      stm = &_videod_streaming_itf[i];\n      self->stm[stm_idx] = i;\n      break;\n    }\n    TU_ASSERT(stm, 0);\n    stm->index_vc = ctl_idx;\n    stm->index_vs = stm_idx;\n    stm->desc.beg = (uint16_t) ((uintptr_t)cur - (uintptr_t)itf_desc);\n    cur = _next_desc_itf(cur, end);\n    stm->desc.end = (uint16_t) ((uintptr_t)cur - (uintptr_t)itf_desc);\n    stm->state = VS_STATE_PROBING;\n#ifdef TUP_DCD_EDPT_ISO_ALLOC\n    /* Allocate ISO endpoints */\n    uint16_t ep_size = 0;\n    uint8_t ep_addr = 0;\n    uint8_t const *p_desc = (uint8_t const*)itf_desc + stm->desc.beg;\n    uint8_t const *p_desc_end = (uint8_t const*)itf_desc + stm->desc.end;\n    while (p_desc < p_desc_end) {\n      if (tu_desc_type(p_desc) == TUSB_DESC_ENDPOINT) {\n        tusb_desc_endpoint_t const *desc_ep = (tusb_desc_endpoint_t const *) p_desc;\n        if (desc_ep->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS) {\n              ep_addr = desc_ep->bEndpointAddress;\n              ep_size = TU_MAX(tu_edpt_packet_size(desc_ep), ep_size);\n        }\n      }\n      p_desc = tu_desc_next(p_desc);\n    }\n    if(ep_addr > 0 && ep_size > 0) {\n      usbd_edpt_iso_alloc(rhport, ep_addr, ep_size);\n    }\n#endif\n    if (0 == stm_idx && 1 == bInCollection) {\n      /* If there is only one streaming interface and no alternate settings,\n       * host may not issue set_interface so open the streaming interface here. */\n      uint8_t const *sbeg = (uint8_t const*)itf_desc + stm->desc.beg;\n      uint8_t const *send = (uint8_t const*)itf_desc + stm->desc.end;\n      if (send == _find_desc_itf(sbeg, send, _desc_itfnum(sbeg), 1)) {\n        TU_VERIFY(_open_vs_itf(rhport, stm, 0), 0);\n      }\n    }\n  }\n  self->len = (uint16_t) ((uintptr_t)cur - (uintptr_t)itf_desc);\n  return (uint16_t) ((uintptr_t)cur - (uintptr_t)itf_desc);\n}\n\n// Invoked when a control transfer occurred on an interface of this class\n// Driver response accordingly to the request and the transfer stage (setup/data/ack)\n// return false to stall control endpoint (e.g unsupported request)\nbool videod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request) {\n  int err;\n  TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);\n  uint_fast8_t itfnum = tu_u16_low(request->wIndex);\n  /* Identify which control interface to use */\n  uint_fast8_t itf;\n  for (itf = 0; itf < CFG_TUD_VIDEO; ++itf) {\n    void const *desc = _videod_itf[itf].beg;\n    if (!desc) {\n      continue;\n    }\n    if (itfnum == _desc_itfnum(desc)) {\n      break;\n    }\n  }\n\n  if (itf < CFG_TUD_VIDEO) {\n    TU_LOG_DRV(\"  VC[%d]: \", itf);\n    err = handle_video_ctl_req(rhport, stage, request, itf);\n    _videod_itf[itf].error_code = (uint8_t)err;\n    if (0 != err) {\n      return false;\n    }\n    return true;\n  }\n\n  /* Identify which streaming interface to use */\n  for (itf = 0; itf < CFG_TUD_VIDEO_STREAMING; ++itf) {\n    videod_streaming_interface_t *stm = &_videod_streaming_itf[itf];\n    if (0 == stm->desc.beg) {\n      continue;\n    }\n    uint8_t const *desc = _videod_itf[stm->index_vc].beg;\n    if (itfnum == _desc_itfnum(desc + stm->desc.beg)) {\n      break;\n    }\n  }\n\n  if (itf < CFG_TUD_VIDEO_STREAMING) {\n    TU_LOG_DRV(\"  VS[%d]: \", itf);\n    err = handle_video_stm_req(rhport, stage, request, itf);\n    _videod_streaming_itf[itf].error_code = (uint8_t)err;\n    if (err != 0) {\n      return false;\n    }\n    return true;\n  }\n  return false;\n}\n\nbool videod_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void)result; (void)xferred_bytes;\n\n  /* find streaming handle */\n  uint_fast8_t itf;\n  videod_interface_t *ctl;\n  videod_streaming_interface_t *stm;\n  for (itf = 0; itf < CFG_TUD_VIDEO_STREAMING; ++itf) {\n    stm = &_videod_streaming_itf[itf];\n    uint_fast16_t const ep_ofs = stm->desc.ep[0];\n    if (0 == ep_ofs) {\n      continue;\n    }\n    ctl = &_videod_itf[stm->index_vc];\n    uint8_t const *desc = ctl->beg;\n    if (ep_addr == _desc_ep_addr(desc + ep_ofs)) {\n      break;\n    }\n  }\n  TU_ASSERT(itf < CFG_TUD_VIDEO_STREAMING);\n  videod_streaming_epbuf_t *stm_epbuf = &_videod_streaming_epbuf[itf];\n\n  if (stm->offset < stm->bufsize) {\n    /* Claim the endpoint */\n    TU_VERIFY(usbd_edpt_claim(rhport, ep_addr), 0);\n    uint_fast16_t pkt_len = _prepare_in_payload(stm, stm_epbuf->buf);\n    TU_ASSERT(usbd_edpt_xfer(rhport, ep_addr, stm_epbuf->buf, (uint16_t) pkt_len, false), 0);\n  } else {\n    stm->buffer  = NULL;\n    stm->bufsize = 0;\n    stm->offset  = 0;\n    tud_video_frame_xfer_complete_cb(stm->index_vc, stm->index_vs);\n  }\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/class/video/video_device.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2021 Koji KITAYAMA\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_VIDEO_DEVICE_H_\n#define TUSB_VIDEO_DEVICE_H_\n\n#include \"common/tusb_common.h\"\n#include \"video.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n//--------------------------------------------------------------------+\n// Payload request\n//--------------------------------------------------------------------+\ntypedef struct TU_ATTR_PACKED {\n    void* buf;      /* Payload buffer to be filled */\n    size_t length;  /* Length of the requested data in bytes */\n    size_t offset;  /* Offset within the frame (in bytes) */\n} tud_video_payload_request_t;\n\n//--------------------------------------------------------------------+\n// Application API (Multiple Ports)\n// CFG_TUD_VIDEO > 1\n//--------------------------------------------------------------------+\n\nbool tud_video_n_connected(uint_fast8_t ctl_idx);\n\n/** Return true if streaming\n *\n * @param[in] ctl_idx    Destination control interface index\n * @param[in] stm_idx    Destination streaming interface index */\nbool tud_video_n_streaming(uint_fast8_t ctl_idx, uint_fast8_t stm_idx);\n\n/** Transfer a frame\n *\n * @param[in] ctl_idx    Destination control interface index\n * @param[in] stm_idx    Destination streaming interface index\n * @param[in] buffer     Frame buffer. The caller must not use this buffer until the operation is completed.\n * @param[in] bufsize    Byte size of the frame buffer */\nbool tud_video_n_frame_xfer(uint_fast8_t ctl_idx, uint_fast8_t stm_idx, void *buffer, size_t bufsize);\n\n/*------------- Optional callbacks -------------*/\n/** Invoked when compeletion of a frame transfer\n *\n * @param[in] ctl_idx    Destination control interface index\n * @param[in] stm_idx    Destination streaming interface index */\nvoid tud_video_frame_xfer_complete_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx);\n\n//--------------------------------------------------------------------+\n// Application Callback API (weak is optional)\n//--------------------------------------------------------------------+\n\n/** Invoked when SET_POWER_MODE request received\n *\n * @param[in] ctl_idx    Destination control interface index\n * @param[in] stm_idx    Destination streaming interface index\n * @return video_error_code_t */\nint tud_video_power_mode_cb(uint_fast8_t ctl_idx, uint8_t power_mod);\n\n/** Invoked when VS_COMMIT_CONTROL(SET_CUR) request received\n *\n * @param[in] ctl_idx     Destination control interface index\n * @param[in] stm_idx     Destination streaming interface index\n * @param[in] parameters  Video streaming parameters\n * @return video_error_code_t */\nint tud_video_commit_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx,\n                                     video_probe_and_commit_control_t const *parameters);\n\n/** Invoked if buffer is set to NULL (allows bufferless on the fly data generation)\n *\n * @param[in]   ctl_idx       Destination control interface index\n * @param[in]   stm_idx       Destination streaming interface index\n * @param[out]  payload_buf   Payload storage buffer (target buffer for requested data)\n * @param[in]   payload_size  Size of payload_buf (requested data size)\n * @param[in]   offset        Current byte offset relative to given bufsize from tud_video_n_frame_xfer (framesize)  */\nvoid tud_video_prepare_payload_cb(uint_fast8_t ctl_idx, uint_fast8_t stm_idx, tud_video_payload_request_t* request);\n\n//--------------------------------------------------------------------+\n// INTERNAL USBD-CLASS DRIVER API\n//--------------------------------------------------------------------+\nvoid     videod_init           (void);\nbool     videod_deinit         (void);\nvoid     videod_reset          (uint8_t rhport);\nuint16_t videod_open           (uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t max_len);\nbool     videod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\nbool     videod_xfer_cb        (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/common/tusb_common.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_COMMON_H_\n#define TUSB_COMMON_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Macros Helper\n//--------------------------------------------------------------------+\n#define TU_ARRAY_SIZE(_arr)           ( sizeof(_arr) / sizeof(_arr[0]) )\n#define TU_FIELD_SIZE(_type, _field)  (sizeof(((_type *)0)->_field))\n#define TU_MIN(_x, _y)                ( ( (_x) < (_y) ) ? (_x) : (_y) )\n#define TU_MAX(_x, _y)                ( ( (_x) > (_y) ) ? (_x) : (_y) )\n#define TU_DIV_CEIL(n, d)             (((n) + (d) - 1) / (d))\n#define TU_DIV_ROUND_NEAREST(v, d)    (((v) + (d)/2) / (d) ) // round to nearest integer\n\n#define TU_U16(_high, _low)           ((uint16_t) ((((uint16_t) (_high)) << 8) | ((uint16_t) (_low))))\n#define TU_U16_HIGH(_u16)             ((uint8_t) (((uint16_t) (_u16) >> 8) & 0x00ffu))\n#define TU_U16_LOW(_u16)              ((uint8_t) ((uint16_t) (_u16) & 0x00ffu))\n#define U16_TO_U8S_BE(_u16)           TU_U16_HIGH(_u16), TU_U16_LOW(_u16)\n#define U16_TO_U8S_LE(_u16)           TU_U16_LOW(_u16), TU_U16_HIGH(_u16)\n\n#define TU_U24(_high, _mid, _low)     ((uint32_t) ((((uint32_t) (_high)) << 16) | (((uint32_t) (_mid)) << 8) | ((uint32_t) (_low))))\n#define TU_U24_HIGH(_u24)             ((uint8_t) (((uint32_t) (_u24) >> 16) & 0x0000ffu))\n#define TU_U24_MID(_u24)              ((uint8_t) (((uint32_t) (_u24) >>  8) & 0x0000ffu))\n#define TU_U24_LOW(_u24)              ((uint8_t) ((uint32_t) (_u24) & 0x0000ffu))\n#define U24_TO_U8S_BE(_u24)           TU_U24_HIGH(_u24), TU_U24_MID(_u24), TU_U24_LOW(_u24)\n#define U24_TO_U8S_LE(_u24)           TU_U24_LOW(_u24), TU_U24_MID(_u24), TU_U24_HIGH(_u24)\n\n#define TU_U32_BYTE3(_u32)            ((uint8_t) ((((uint32_t) _u32) >> 24) & 0x000000ff)) // MSB\n#define TU_U32_BYTE2(_u32)            ((uint8_t) ((((uint32_t) _u32) >> 16) & 0x000000ff))\n#define TU_U32_BYTE1(_u32)            ((uint8_t) ((((uint32_t) _u32) >>  8) & 0x000000ff))\n#define TU_U32_BYTE0(_u32)            ((uint8_t) (((uint32_t)  _u32)        & 0x000000ff)) // LSB\n\n#define U32_TO_U8S_BE(_u32)           TU_U32_BYTE3(_u32), TU_U32_BYTE2(_u32), TU_U32_BYTE1(_u32), TU_U32_BYTE0(_u32)\n#define U32_TO_U8S_LE(_u32)           TU_U32_BYTE0(_u32), TU_U32_BYTE1(_u32), TU_U32_BYTE2(_u32), TU_U32_BYTE3(_u32)\n\n#define TU_BIT(n)                     (1UL << (n))\n\n// Generate a mask with bit from high (31) to low (0) set, e.g TU_GENMASK(3, 0) = 0b1111\n#define TU_GENMASK(h, l)              ( (UINT32_MAX << (l)) & (UINT32_MAX >> (31 - (h))) )\n\n//--------------------------------------------------------------------+\n// Includes\n//--------------------------------------------------------------------+\n\n// Standard Headers\n#include <stdbool.h>\n#include <stdint.h>\n#include <inttypes.h>\n#include <stddef.h>\n#include <string.h>\n\n// Tinyusb Common Headers\n#include \"tusb_option.h\"\n#include \"tusb_compiler.h\"\n#include \"tusb_verify.h\"\n#include \"tusb_types.h\"\n#include \"tusb_debug.h\"\n\n//--------------------------------------------------------------------+\n// API implemented by application if needed\n// TODO move to a more obvious place/file\n//--------------------------------------------------------------------+\n\n// Get current milliseconds, required by some port/configuration without RTOS\nextern uint32_t tusb_time_millis_api(void);\n\n// Delay in milliseconds, use tusb_time_millis_api() by default. required by some port/configuration with no RTOS\nextern void tusb_time_delay_ms_api(uint32_t ms);\n\n// flush data cache\nextern void tusb_app_dcache_flush(uintptr_t addr, uint32_t data_size);\n\n// invalidate data cache\nextern void tusb_app_dcache_invalidate(uintptr_t addr, uint32_t data_size);\n\n// Optional physical <-> virtual address translation\nextern void* tusb_app_virt_to_phys(void *virt_addr);\nextern void* tusb_app_phys_to_virt(void *phys_addr);\n\n//--------------------------------------------------------------------+\n// Internal Inline Functions\n//--------------------------------------------------------------------+\n\n//------------- Mem -------------//\n#define tu_memclr(buffer, size)  (void) memset((buffer), 0, (size))\n#define tu_varclr(_var)          tu_memclr(_var, sizeof(*(_var)))\n\n// This is a backport of memset_s from c11\nTU_ATTR_ALWAYS_INLINE static inline int tu_memset_s(void *dest, size_t destsz, int ch, size_t count) {\n  // Validate parameters\n  if (dest == NULL) {\n    return -1;\n  }\n\n  if (count == 0u) {\n    return 0;\n  }\n\n  if (count > destsz) {\n    return -1;\n  }\n\n  (void) memset(dest, ch, count);\n  return 0;\n}\n\n// This is a backport of memcpy_s from c11\nTU_ATTR_ALWAYS_INLINE static inline int tu_memcpy_s(void *dest, size_t destsz, const void *src, size_t count) {\n  if (dest == NULL) {\n    return -1;\n  }\n\n  if (count == 0u) {\n    return 0;\n  }\n\n  if (src == NULL) {\n    return -1;\n  }\n\n  if (count > destsz) {\n    return -1;\n  }\n\n  (void) memcpy(dest, src, count);\n  return 0;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_mem_is_zero(const void *buffer, size_t size) {\n  const uint8_t* buf8 = (const uint8_t*) buffer;\n  for (size_t i = 0; i < size; i++) {\n    if (buf8[i] != 0) { return false; }\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_mem_is_ff(const void *buffer, size_t size) {\n  const uint8_t* buf8 = (const uint8_t*) buffer;\n  for (size_t i = 0; i < size; i++) {\n    if (buf8[i] != 0xff) { return false; }\n  }\n  return true;\n}\n\n\n//------------- Bytes -------------//\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_u32(uint8_t b3, uint8_t b2, uint8_t b1, uint8_t b0) {\n  return (((uint32_t)b3) << 24) | (((uint32_t)b2) << 16) | (((uint32_t)b1) << 8) | b0;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_u32_from_u16(uint16_t high, uint16_t low) {\n  return (((uint32_t)high) << 16) | low;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_u16(uint8_t high, uint8_t low) {\n  return (uint16_t)((((uint16_t)high) << 8) | low);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u32_byte3(uint32_t ui32) { return TU_U32_BYTE3(ui32); }\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u32_byte2(uint32_t ui32) { return TU_U32_BYTE2(ui32); }\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u32_byte1(uint32_t ui32) { return TU_U32_BYTE1(ui32); }\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u32_byte0(uint32_t ui32) { return TU_U32_BYTE0(ui32); }\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_u32_high16(uint32_t ui32) { return (uint16_t) (ui32 >> 16); }\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_u32_low16 (uint32_t ui32) { return (uint16_t) (ui32 & 0x0000ffffu); }\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u16_high(uint16_t ui16) { return TU_U16_HIGH(ui16); }\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_u16_low (uint16_t ui16) { return TU_U16_LOW(ui16); }\n\n//------------- Bits -------------//\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_bit_set  (uint32_t value, uint8_t pos) { return value | TU_BIT(pos); }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_bit_clear(uint32_t value, uint8_t pos) { return value & (~TU_BIT(pos)); }\nTU_ATTR_ALWAYS_INLINE static inline bool     tu_bit_test (uint32_t value, uint8_t pos) { return (value & TU_BIT(pos)) ? true : false; }\n\n//------------- Min -------------//\nTU_ATTR_ALWAYS_INLINE static inline uint8_t  tu_min8  (uint8_t  x, uint8_t y ) { return (x < y) ? x : y; }\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_min16 (uint16_t x, uint16_t y) { return (x < y) ? x : y; }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_min32 (uint32_t x, uint32_t y) { return (x < y) ? x : y; }\n\n//------------- Max -------------//\nTU_ATTR_ALWAYS_INLINE static inline uint8_t  tu_max8  (uint8_t  x, uint8_t y ) { return (x > y) ? x : y; }\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_max16 (uint16_t x, uint16_t y) { return (x > y) ? x : y; }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_max32 (uint32_t x, uint32_t y) { return (x > y) ? x : y; }\n\n//------------- Align -------------//\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align(uint32_t value, uint32_t alignment) {\n  return value & ((uint32_t) ~(alignment-1));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align4  (uint32_t value) { return (value & 0xFFFFFFFCUL); }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align8  (uint32_t value) { return (value & 0xFFFFFFF8UL); }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align16 (uint32_t value) { return (value & 0xFFFFFFF0UL); }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align32 (uint32_t value) { return (value & 0xFFFFFFE0UL); }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_align4k (uint32_t value) { return (value & 0xFFFFF000UL); }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_offset4k(uint32_t value) { return (value & 0xFFFUL); }\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_is_aligned32(uint32_t value) { return (value & 0x1FUL) == 0; }\nTU_ATTR_ALWAYS_INLINE static inline bool tu_is_aligned64(uint64_t value) { return (value & 0x3FUL) == 0; }\n\n//------------- Mathematics -------------//\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_div_ceil(uint32_t v, uint32_t d) { return TU_DIV_CEIL(v, d); }\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_div_round_nearest(uint32_t v, uint32_t d) { return TU_DIV_ROUND_NEAREST(v, d); }\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_round_up(uint32_t v, uint32_t f) { return tu_div_ceil(v, f) * f; }\n\n// log2 of a value is its MSB's position\n// TODO use clz TODO remove\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_log2(uint32_t value) {\n  uint8_t result = 0;\n  while ((value >>= 1u) != 0u) {\n    result++;\n  }\n  return result;\n}\n\n//static inline uint8_t tu_log2(uint32_t value)\n//{\n//   return sizeof(uint32_t) * CHAR_BIT - __builtin_clz(x) - 1;\n//}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_is_power_of_two(uint32_t value) {\n   return (value != 0) && ((value & (value - 1)) == 0);\n}\n\n//------------- Unaligned Access -------------//\n#if TUP_ARCH_STRICT_ALIGN\n\n// Rely on compiler to generate correct code for unaligned access\ntypedef struct { uint16_t val; } TU_ATTR_PACKED tu_unaligned_uint16_t;\ntypedef struct { uint32_t val; } TU_ATTR_PACKED tu_unaligned_uint32_t;\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_unaligned_read32(const void *mem) {\n  tu_unaligned_uint32_t const *ua32 = (tu_unaligned_uint32_t const *) mem;\n  return ua32->val;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write32(void *mem, uint32_t value) {\n  tu_unaligned_uint32_t *ua32 = (tu_unaligned_uint32_t *) mem;\n  ua32->val = value;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_unaligned_read16(const void *mem) {\n  tu_unaligned_uint16_t const *ua16 = (tu_unaligned_uint16_t const *) mem;\n  return ua16->val;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write16(void *mem, uint16_t value) {\n  tu_unaligned_uint16_t *ua16 = (tu_unaligned_uint16_t *) mem;\n  ua16->val = value;\n}\n\n#elif TUP_MCU_STRICT_ALIGN\n\n// MCU such as LPC_IP3511 Highspeed cannot access unaligned memory on USB_RAM although it is ARM M4.\n// We have to manually pick up bytes since tu_unaligned_uint32_t will still generate unaligned code\n// NOTE: volatile cast to memory to prevent compiler to optimize and generate unaligned code\n// TODO Big Endian may need minor changes\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_unaligned_read32(const void* mem) {\n  volatile uint8_t const* buf8 = (uint8_t const*) mem;\n  return tu_u32(buf8[3], buf8[2], buf8[1], buf8[0]);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write32(void* mem, uint32_t value) {\n  volatile uint8_t* buf8 = (uint8_t*) mem;\n  buf8[0] = tu_u32_byte0(value);\n  buf8[1] = tu_u32_byte1(value);\n  buf8[2] = tu_u32_byte2(value);\n  buf8[3] = tu_u32_byte3(value);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_unaligned_read16(const void* mem) {\n  volatile uint8_t const* buf8 = (uint8_t const*) mem;\n  return tu_u16(buf8[1], buf8[0]);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write16(void* mem, uint16_t value) {\n  volatile uint8_t* buf8 = (uint8_t*) mem;\n  buf8[0] = tu_u16_low(value);\n  buf8[1] = tu_u16_high(value);\n}\n\n#else\n\n// MCU that could access unaligned memory natively\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_unaligned_read32(const void *mem) {\n  return *((uint32_t const *) mem);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_unaligned_read16(const void *mem) {\n  return *((uint16_t const *) mem);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write32(void *mem, uint32_t value) {\n  *((uint32_t *) mem) = value;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_unaligned_write16(void *mem, uint16_t value) {\n  *((uint16_t *) mem) = value;\n}\n\n#endif\n\n// scatter read 4 bytes from two buffers (LE). Parameter are not checked\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_scatter_read32(const uint8_t *buf1, uint8_t len1, const uint8_t *buf2,\n                                                               uint8_t len2) {\n  uint32_t result = 0;\n  uint8_t  shift  = 0;\n\n  for (uint8_t i = 0; i < len1; ++i) {\n    result |= ((uint32_t)buf1[i]) << shift;\n    shift += 8;\n  }\n\n  for (uint8_t i = 0; i < len2; ++i) {\n    result |= ((uint32_t)buf2[i]) << shift;\n    shift += 8;\n  }\n\n  return result;\n}\n\n// scatter write 4 bytes (LE) to two buffers. Parameter are not checked\nTU_ATTR_ALWAYS_INLINE static inline void tu_scatter_write32(uint32_t value, uint8_t *buf1, uint8_t len1,\n                                                            uint8_t *buf2, uint8_t len2) {\n  for (uint8_t i = 0; i < len1; ++i) {\n    buf1[i] = (uint8_t)(value & 0xFF);\n    value >>= 8;\n  }\n\n  for (uint8_t i = 0; i < len2; ++i) {\n    buf2[i] = (uint8_t)(value & 0xFF);\n    value >>= 8;\n  }\n}\n\n//--------------------------------------------------------------------+\n// Descriptor helper\n//--------------------------------------------------------------------+\n\n// return next descriptor\nTU_ATTR_ALWAYS_INLINE static inline uint8_t const * tu_desc_next(void const* desc) {\n  uint8_t const* desc8 = (uint8_t const*) desc;\n  return desc8 + desc8[DESC_OFFSET_LEN];\n}\n\n// get descriptor length\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_desc_len(void const* desc) {\n  return ((uint8_t const*) desc)[DESC_OFFSET_LEN];\n}\n\n// get descriptor type\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_desc_type(void const* desc) {\n  return ((uint8_t const*) desc)[DESC_OFFSET_TYPE];\n}\n\n// get descriptor subtype\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_desc_subtype(void const* desc) {\n  return ((uint8_t const*) desc)[DESC_OFFSET_SUBTYPE];\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_desc_in_bounds(const uint8_t *p_desc, const uint8_t *desc_end) {\n  return p_desc < desc_end && tu_desc_next(p_desc) <= desc_end;\n}\n\n// find descriptor that match byte1 (type)\nuint8_t const * tu_desc_find(uint8_t const* desc, uint8_t const* end, uint8_t byte1);\n\n// find descriptor that match byte1 (type) and byte2\nuint8_t const * tu_desc_find2(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2);\n\n// find descriptor that match byte1 (type) and byte2\nuint8_t const * tu_desc_find3(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2, uint8_t byte3);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_COMMON_H_ */\n"
  },
  {
    "path": "src/common/tusb_compiler.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#pragma once\n\n#define TU_TOKEN(x)           x\n#define TU_STRING(x)          #x                  ///< stringify without expand\n#define TU_XSTRING(x)         TU_STRING(x)        ///< expand then stringify\n#define TU_STRCAT(a, b)       a##b                ///< concat without expand\n#define TU_STRCAT3(a, b, c)   a##b##c             ///< concat without expand\n#define TU_XSTRCAT(a, b)      TU_STRCAT(a, b)     ///< expand then concat\n#define TU_XSTRCAT3(a, b, c)  TU_STRCAT3(a, b, c) ///< expand then concat 3 tokens\n\n#define TU_INCLUDE_PATH(_dir,_file) TU_XSTRING( TU_TOKEN(_dir)TU_TOKEN(_file) )\n\n#if defined __COUNTER__ && __COUNTER__ != __COUNTER__\n  #define TU_COUNTER __COUNTER__\n#else\n  #define TU_COUNTER __LINE__\n#endif\n\n// Compile-time Assert\n#if defined (__cplusplus) && __cplusplus >= 201103L\n  #define TU_VERIFY_STATIC   static_assert\n#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L\n  #define TU_VERIFY_STATIC   _Static_assert\n#elif defined(__CCRX__)\n  #define TU_VERIFY_STATIC(const_expr, _mess) typedef char TU_XSTRCAT(_verify_static_, TU_COUNTER)[(const_expr) ? 1 : 0];\n#else\n  #define TU_VERIFY_STATIC(const_expr, _mess) enum { TU_XSTRCAT(_verify_static_, TU_COUNTER) = 1/(!!(const_expr)) }\n#endif\n\n/* --------------------- Fuzzing types -------------------------------------- */\n#ifdef _FUZZ\n  #define tu_static static __thread\n#else\n  #define tu_static static\n#endif\n\n// for declaration of reserved field, make use of TU_COUNTER\n#define TU_RESERVED           TU_XSTRCAT(reserved, TU_COUNTER)\n\n#define TU_LITTLE_ENDIAN (0x12u)\n#define TU_BIG_ENDIAN (0x21u)\n\n/*------------------------------------------------------------------*/\n/* Count number of arguments of __VA_ARGS__\n * - reference www.stackoverflow.com/questions/2124339/c-preprocessor-va-args-number-of-arguments\n * - TU_GET_NTH_ARG() takes args >= N (64) but only expand to Nth one (64th)\n * - TU_NARG_RSEQ_N() is reverse sequential to N to add padding to have\n * Nth position is the same as the number of arguments\n * - ##__VA_ARGS__ is used to deal with 0 paramerter (swallows comma)\n *------------------------------------------------------------------*/\n#if defined(__CCRX__)\n#define TU_ARGS_NUM(...)   TU_NARG_IMPL(_0, __VA_ARGS__, TU_NARG_RSEQ_N())\n#else\n#define TU_ARGS_NUM(...)   TU_NARG_IMPL(_0, ##__VA_ARGS__, TU_NARG_RSEQ_N())\n#endif\n\n#define TU_NARG_IMPL(...)      TU_GET_NTH_ARG(__VA_ARGS__)\n#define TU_GET_NTH_ARG( \\\n          _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \\\n         _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \\\n         _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \\\n         _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \\\n         _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \\\n         _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \\\n         _61,_62,_63,N,...) N\n#define TU_NARG_RSEQ_N() \\\n         62,61,60,                      \\\n         59,58,57,56,55,54,53,52,51,50, \\\n         49,48,47,46,45,44,43,42,41,40, \\\n         39,38,37,36,35,34,33,32,31,30, \\\n         29,28,27,26,25,24,23,22,21,20, \\\n         19,18,17,16,15,14,13,12,11,10, \\\n         9,8,7,6,5,4,3,2,1,0\n\n// Apply a macro X to each of the arguments with a separation/delimiter\n#define TU_ARGS_APPLY(_X, _s, ...)   TU_XSTRCAT(TU_ARGS_APPLY_, TU_ARGS_NUM(__VA_ARGS__))(_X, _s, __VA_ARGS__)\n\n#define TU_ARGS_APPLY_1(_X, _s, _a1)                                    _X(_a1)\n#define TU_ARGS_APPLY_2(_X, _s, _a1, _a2)                               _X(_a1) _s _X(_a2)\n#define TU_ARGS_APPLY_3(_X, _s, _a1, _a2, _a3)                          _X(_a1) _s TU_ARGS_APPLY_2(_X, _s, _a2, _a3)\n#define TU_ARGS_APPLY_4(_X, _s, _a1, _a2, _a3, _a4)                     _X(_a1) _s TU_ARGS_APPLY_3(_X, _s, _a2, _a3, _a4)\n#define TU_ARGS_APPLY_5(_X, _s, _a1, _a2, _a3, _a4, _a5)                _X(_a1) _s TU_ARGS_APPLY_4(_X, _s, _a2, _a3, _a4, _a5)\n#define TU_ARGS_APPLY_6(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6)           _X(_a1) _s TU_ARGS_APPLY_5(_X, _s, _a2, _a3, _a4, _a5, _a6)\n#define TU_ARGS_APPLY_7(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6, _a7)      _X(_a1) _s TU_ARGS_APPLY_6(_X, _s, _a2, _a3, _a4, _a5, _a6, _a7)\n#define TU_ARGS_APPLY_8(_X, _s, _a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) _X(_a1) _s TU_ARGS_APPLY_7(_X, _s, _a2, _a3, _a4, _a5, _a6, _a7, _a8)\n\n// Apply a macro X to each of the arguments and expand the result with comma\n#define TU_ARGS_APPLY_EXPAND(_X, ...)   TU_XSTRCAT(TU_ARGS_APPLY_EXPAND_, TU_ARGS_NUM(__VA_ARGS__))(_X, __VA_ARGS__)\n\n#define TU_ARGS_APPLY_EXPAND_1(_X, _a1)                                    _X(_a1)\n#define TU_ARGS_APPLY_EXPAND_2(_X, _a1, _a2)                               _X(_a1), _X(_a2)\n#define TU_ARGS_APPLY_EXPAND_3(_X, _a1, _a2, _a3)                          _X(_a1), TU_ARGS_APPLY_EXPAND_2(_X, _a2, _a3)\n#define TU_ARGS_APPLY_EXPAND_4(_X, _a1, _a2, _a3, _a4)                     _X(_a1), TU_ARGS_APPLY_EXPAND_3(_X, _a2, _a3, _a4)\n#define TU_ARGS_APPLY_EXPAND_5(_X, _a1, _a2, _a3, _a4, _a5)                _X(_a1), TU_ARGS_APPLY_EXPAND_4(_X, _a2, _a3, _a4, _a5)\n#define TU_ARGS_APPLY_EXPAND_6(_X, _a1, _a2, _a3, _a4, _a5, _a6)           _X(_a1), TU_ARGS_APPLY_EXPAND_5(_X, _a2, _a3, _a4, _a5, _a6)\n#define TU_ARGS_APPLY_EXPAND_7(_X, _a1, _a2, _a3, _a4, _a5, _a6, _a7)      _X(_a1), TU_ARGS_APPLY_EXPAND_6(_X, _a2, _a3, _a4, _a5, _a6, _a7)\n#define TU_ARGS_APPLY_EXPAND_8(_X, _a1, _a2, _a3, _a4, _a5, _a6, _a7, _a8) _X(_a1), TU_ARGS_APPLY_EXPAND_7(_X, _a2, _a3, _a4, _a5, _a6, _a7, _a8)\n\n//--------------------------------------------------------------------+\n// Macro for function default arguments\n//--------------------------------------------------------------------+\n#define TU_GET_3RD_ARG(arg1, arg2, arg3, ...)        arg3\n\n// function expand with number of arguments\n#define TU_FUNC_OPTIONAL_ARG(func, ...)   TU_XSTRCAT(func##_arg, TU_ARGS_NUM(__VA_ARGS__))(__VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// Compiler Attribute Abstraction\n//--------------------------------------------------------------------+\n#if defined(__GNUC__) || defined(__ICCARM__) || defined(__TI_COMPILER_VERSION__)\n  #if defined(__ICCARM__)\n    #include <intrinsics.h> // for builtin functions\n  #endif\n\n  #define TU_ATTR_ALIGNED(Bytes)    __attribute__((aligned(Bytes)))\n  #define TU_ATTR_SECTION(sec_name) __attribute__((section(#sec_name)))\n  #define TU_ATTR_PACKED            __attribute__((packed))\n  #define TU_ATTR_WEAK              __attribute__((weak))\n// #define TU_ATTR_WEAK_ALIAS(f)         __attribute__ ((weak, alias(#f)))\n  #ifndef TU_ATTR_ALWAYS_INLINE                                            // allow to override for debug\n    #define TU_ATTR_ALWAYS_INLINE __attribute__((always_inline))\n  #endif\n  #define TU_ATTR_DEPRECATED(mess)      __attribute__ ((deprecated(mess))) // warn if function with this attribute is used\n  #define TU_ATTR_UNUSED                __attribute__ ((unused))           // Function/Variable is meant to be possibly unused\n  #define TU_ATTR_USED                  __attribute__ ((used))             // Function/Variable is meant to be used\n\n  #define TU_ATTR_PACKED_BEGIN\n  #define TU_ATTR_PACKED_END\n  #define TU_ATTR_BIT_FIELD_ORDER_BEGIN\n  #define TU_ATTR_BIT_FIELD_ORDER_END\n\n  #if (defined(__has_attribute) && __has_attribute(__fallthrough__)) || defined(__TI_COMPILER_VERSION__)\n    #define TU_ATTR_FALLTHROUGH __attribute__((fallthrough))\n  #else\n    #define TU_ATTR_FALLTHROUGH     \\\n      do {                          \\\n      } while (0) /* fallthrough */\n  #endif\n\n// Endian conversion use well-known host to network (big endian) naming\n// For TI ARM compiler, __BYTE_ORDER__ is not defined for MSP430 but still LE\n  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ || defined(__MSP430__)\n    #define TU_BYTE_ORDER TU_LITTLE_ENDIAN\n  #else\n    #define TU_BYTE_ORDER TU_BIG_ENDIAN\n  #endif\n\n  // Unfortunately XC16 doesn't provide builtins for 32bit endian conversion\n  #if defined(__XC16)\n    #define TU_BSWAP16(u16) (__builtin_swap(u16))\n    #define TU_BSWAP32(u32) ((((u32) & 0xff000000) >> 24) |  \\\n                            (((u32) & 0x00ff0000) >> 8)  |  \\\n                            (((u32) & 0x0000ff00) << 8)  |  \\\n                            (((u32) & 0x000000ff) << 24))\n  #else\n    #define TU_BSWAP16(u16) (__builtin_bswap16(u16))\n    #define TU_BSWAP32(u32) (__builtin_bswap32(u32))\n  #endif\n\n  // List of obsolete callback function that is renamed and should not be defined.\n  // Put it here since only gcc support this pragma\n  #if !defined(__ARMCC_VERSION) && !defined(__ICCARM__)\n    #pragma GCC poison tud_vendor_control_request_cb\n  #endif\n\n#elif defined(__ICCARM__)\n  #include <intrinsics.h>\n  #define TU_ATTR_ALIGNED(Bytes)        __attribute__ ((aligned(Bytes)))\n  #define TU_ATTR_SECTION(sec_name)     __attribute__ ((section(#sec_name)))\n  #define TU_ATTR_PACKED                __attribute__ ((packed))\n  #define TU_ATTR_WEAK                  __attribute__ ((weak))\n  // #define TU_ATTR_WEAK_ALIAS(f)         __attribute__ ((weak, alias(#f)))\n  #ifndef TU_ATTR_ALWAYS_INLINE // allow to override for debug\n    #define TU_ATTR_ALWAYS_INLINE         __attribute__ ((always_inline))\n  #endif\n  #define TU_ATTR_DEPRECATED(mess)      __attribute__ ((deprecated(mess))) // warn if function with this attribute is used\n  #define TU_ATTR_UNUSED                __attribute__ ((unused))           // Function/Variable is meant to be possibly unused\n  #define TU_ATTR_USED                  __attribute__ ((used))             // Function/Variable is meant to be used\n  #define TU_ATTR_FALLTHROUGH           do {} while (0)  /* fallthrough */\n\n  #define TU_ATTR_PACKED_BEGIN\n  #define TU_ATTR_PACKED_END\n  #define TU_ATTR_BIT_FIELD_ORDER_BEGIN\n  #define TU_ATTR_BIT_FIELD_ORDER_END\n\n  // Endian conversion use well-known host to network (big endian) naming\n  #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n    #define TU_BYTE_ORDER TU_LITTLE_ENDIAN\n  #else\n    #define TU_BYTE_ORDER TU_BIG_ENDIAN\n  #endif\n\n  #define TU_BSWAP16(u16) (__iar_builtin_REV16(u16))\n  #define TU_BSWAP32(u32) (__iar_builtin_REV(u32))\n\n#elif defined(__CCRX__)\n  #define TU_ATTR_ALIGNED(Bytes)\n  #define TU_ATTR_SECTION(sec_name)\n  #define TU_ATTR_PACKED\n  #define TU_ATTR_WEAK\n  // #define TU_ATTR_WEAK_ALIAS(f)\n  #define TU_ATTR_ALWAYS_INLINE\n  #define TU_ATTR_DEPRECATED(mess)\n  #define TU_ATTR_UNUSED\n  #define TU_ATTR_USED\n  #define TU_ATTR_FALLTHROUGH           do {} while (0)  /* fallthrough */\n\n  #define TU_ATTR_PACKED_BEGIN          _Pragma(\"pack\")\n  #define TU_ATTR_PACKED_END            _Pragma(\"packoption\")\n  #define TU_ATTR_BIT_FIELD_ORDER_BEGIN _Pragma(\"bit_order right\")\n  #define TU_ATTR_BIT_FIELD_ORDER_END   _Pragma(\"bit_order\")\n\n  // Endian conversion use well-known host to network (big endian) naming\n  #if defined(__LIT)\n    #define TU_BYTE_ORDER TU_LITTLE_ENDIAN\n  #else\n    #define TU_BYTE_ORDER TU_BIG_ENDIAN\n  #endif\n\n  #define TU_BSWAP16(u16) ((unsigned short)_builtin_revw((unsigned long)u16))\n  #define TU_BSWAP32(u32) (_builtin_revl(u32))\n\n#else\n  #error \"Compiler attribute porting is required\"\n#endif\n\n\n#if (TU_BYTE_ORDER == TU_LITTLE_ENDIAN)\n\n  #define tu_htons(u16)  (TU_BSWAP16(u16))\n  #define tu_ntohs(u16)  (TU_BSWAP16(u16))\n\n  #define tu_htonl(u32)  (TU_BSWAP32(u32))\n  #define tu_ntohl(u32)  (TU_BSWAP32(u32))\n\n  #define tu_htole16(u16) (u16)\n  #define tu_le16toh(u16) (u16)\n\n  #define tu_htole32(u32) (u32)\n  #define tu_le32toh(u32) (u32)\n\n#elif (TU_BYTE_ORDER == TU_BIG_ENDIAN)\n\n  #define tu_htons(u16)  (u16)\n  #define tu_ntohs(u16)  (u16)\n\n  #define tu_htonl(u32)  (u32)\n  #define tu_ntohl(u32)  (u32)\n\n  #define tu_htole16(u16) (TU_BSWAP16(u16))\n  #define tu_le16toh(u16) (TU_BSWAP16(u16))\n\n  #define tu_htole32(u32) (TU_BSWAP32(u32))\n  #define tu_le32toh(u32) (TU_BSWAP32(u32))\n\n#else\n  #error Byte order is undefined\n#endif\n"
  },
  {
    "path": "src/common/tusb_debug.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DEBUG_H_\n#define TUSB_DEBUG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Debug\n//--------------------------------------------------------------------+\n\n// CFG_TUSB_DEBUG for debugging\n// 0 : no debug\n// 1 : print error\n// 2 : print warning\n// 3 : print info\n#if CFG_TUSB_DEBUG\n\n// Enum to String for debugging purposes\n#if CFG_TUSB_DEBUG >= CFG_TUH_LOG_LEVEL || CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\nextern char const* const tu_str_speed[];\nextern char const* const tu_str_std_request[];\nextern char const* const tu_str_xfer_result[];\n#endif\n\nvoid tu_print_mem(void const *buf, uint32_t count, uint8_t indent);\n\n#ifdef CFG_TUSB_DEBUG_PRINTF\n  extern int CFG_TUSB_DEBUG_PRINTF(const char *format, ...);\n  #define tu_printf    CFG_TUSB_DEBUG_PRINTF\n#else\n  #include <stdio.h>\n  #define tu_printf(...)    (void) printf(__VA_ARGS__)\n#endif\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_print_buf(uint8_t const* buf, uint32_t bufsize) {\n  for(uint32_t i=0; i<bufsize; i++) {\n    tu_printf(\"%02X \", buf[i]);\n  }\n  tu_printf(\"\\r\\n\");\n}\n\n// Log with Level\n#define TU_LOG(n, ...)        TU_XSTRCAT(TU_LOG, n)(__VA_ARGS__)\n#define TU_LOG_MEM(n, ...)    TU_XSTRCAT3(TU_LOG, n, _MEM)(__VA_ARGS__)\n#define TU_LOG_BUF(n, ...)    TU_XSTRCAT3(TU_LOG, n, _BUF)(__VA_ARGS__)\n#define TU_LOG_INT(n, ...)    TU_XSTRCAT3(TU_LOG, n, _INT)(__VA_ARGS__)\n#define TU_LOG_HEX(n, ...)    TU_XSTRCAT3(TU_LOG, n, _HEX)(__VA_ARGS__)\n#define TU_LOG_LOCATION()     tu_printf(\"%s: %d:\\r\\n\", __PRETTY_FUNCTION__, __LINE__)\n#define TU_LOG_FAILED()       tu_printf(\"%s: %d: Failed\\r\\n\", __PRETTY_FUNCTION__, __LINE__)\n\n// Log Level 1: Error\n#define TU_LOG1               tu_printf\n#define TU_LOG1_MEM           tu_print_mem\n#define TU_LOG1_BUF(_x, _n)   tu_print_buf((uint8_t const*)(_x), _n)\n#define TU_LOG1_INT(_x)       tu_printf(#_x \" = %ld\\r\\n\", (unsigned long) (_x) )\n#define TU_LOG1_HEX(_x)       tu_printf(#_x \" = 0x%lX\\r\\n\", (unsigned long) (_x) )\n\n// Log Level 2: Warn\n#if CFG_TUSB_DEBUG >= 2\n  #define TU_LOG2             TU_LOG1\n  #define TU_LOG2_MEM         TU_LOG1_MEM\n  #define TU_LOG2_BUF         TU_LOG1_BUF\n  #define TU_LOG2_INT         TU_LOG1_INT\n  #define TU_LOG2_HEX         TU_LOG1_HEX\n#endif\n\n// Log Level 3: Info\n#if CFG_TUSB_DEBUG >= 3\n  #define TU_LOG3             TU_LOG1\n  #define TU_LOG3_MEM         TU_LOG1_MEM\n  #define TU_LOG3_BUF         TU_LOG1_BUF\n  #define TU_LOG3_INT         TU_LOG1_INT\n  #define TU_LOG3_HEX         TU_LOG1_HEX\n#endif\n\ntypedef struct {\n  uint32_t key;\n  const char* data;\n} tu_lookup_entry_t;\n\ntypedef struct {\n  uint16_t count;\n  tu_lookup_entry_t const* items;\n} tu_lookup_table_t;\n\nstatic inline const char* tu_lookup_find(tu_lookup_table_t const* p_table, uint32_t key) {\n  for(uint16_t i=0; i<p_table->count; i++) {\n    if (p_table->items[i].key == key) {\n      return p_table->items[i].data;\n    }\n  }\n\n  #ifndef CFG_TUSB_DEBUG_PRINTF\n  // not found return the key value in hex if no custom printf is defined\n  static char not_found[11];\n  if (snprintf(not_found, sizeof(not_found), \"0x%08lX\", (unsigned long)key) <= 0) {\n    not_found[0] = 0;\n  }\n  return not_found;\n  #else\n  return \"NotFound\";\n  #endif\n}\n\n#endif // CFG_TUSB_DEBUG\n\n#ifndef TU_LOG\n  #define TU_LOG(n, ...)\n  #define TU_LOG_MEM(n, ...)\n  #define TU_LOG_BUF(n, ...)\n  #define TU_LOG_INT(n, ...)\n  #define TU_LOG_HEX(n, ...)\n  #define TU_LOG_LOCATION()\n  #define TU_LOG_FAILED()\n#endif\n\n#define TU_LOG0(...)\n#define TU_LOG0_MEM(...)\n#define TU_LOG0_BUF(...)\n#define TU_LOG0_INT(...)\n#define TU_LOG0_HEX(...)\n\n#ifndef TU_LOG1\n  #define TU_LOG1(...)\n  #define TU_LOG1_MEM(...)\n  #define TU_LOG1_BUF(...)\n  #define TU_LOG1_INT(...)\n  #define TU_LOG1_HEX(...)\n#endif\n\n#ifndef TU_LOG2\n  #define TU_LOG2(...)\n  #define TU_LOG2_MEM(...)\n  #define TU_LOG2_BUF(...)\n  #define TU_LOG2_INT(...)\n  #define TU_LOG2_HEX(...)\n#endif\n\n#ifndef TU_LOG3\n  #define TU_LOG3(...)\n  #define TU_LOG3_MEM(...)\n  #define TU_LOG3_BUF(...)\n  #define TU_LOG3_INT(...)\n  #define TU_LOG3_HEX(...)\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/common/tusb_fifo.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Reinhard Panhuber - rework to unmasked pointers\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"osal/osal.h\"\n#include \"tusb_fifo.h\"\n\n#define TU_FIFO_DBG 0\n\n\n#if OSAL_MUTEX_REQUIRED\n\nTU_ATTR_ALWAYS_INLINE static inline void ff_lock(osal_mutex_t mutex) {\n  if (mutex != NULL) {\n    osal_mutex_lock(mutex, OSAL_TIMEOUT_WAIT_FOREVER);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ff_unlock(osal_mutex_t mutex) {\n  if (mutex != NULL) {\n    osal_mutex_unlock(mutex);\n  }\n}\n\n#else\n  #define ff_lock(_mutex)\n  #define ff_unlock(_mutex)\n\n#endif\n\n//--------------------------------------------------------------------+\n// Setup API\n//--------------------------------------------------------------------+\nbool tu_fifo_config(tu_fifo_t *f, void *buffer, uint16_t depth, bool overwritable) {\n  // Limit index space to 2*depth - this allows for a fast \"modulo\" calculation\n  // but limits the maximum depth to 2^16/2 = 2^15 and buffer overflows are detectable\n  // only if overflow happens once (important for unsupervised DMA applications)\n  if (depth > 0x8000) {\n    return false;\n  }\n\n  ff_lock(f->mutex_wr);\n  ff_lock(f->mutex_rd);\n\n  f->buffer       = (uint8_t *)buffer;\n  f->depth        = depth;\n  f->overwritable = overwritable;\n  f->rd_idx       = 0u;\n  f->wr_idx       = 0u;\n\n  ff_unlock(f->mutex_wr);\n  ff_unlock(f->mutex_rd);\n\n  return true;\n}\n\n// clear fifo by resetting read and write indices\nvoid tu_fifo_clear(tu_fifo_t *f) {\n  ff_lock(f->mutex_wr);\n  ff_lock(f->mutex_rd);\n\n  f->rd_idx = 0;\n  f->wr_idx = 0;\n\n  ff_unlock(f->mutex_wr);\n  ff_unlock(f->mutex_rd);\n}\n\n// Change the fifo overwritable mode\nvoid tu_fifo_set_overwritable(tu_fifo_t *f, bool overwritable) {\n  if (f->overwritable == overwritable) {\n    return;\n  }\n\n  ff_lock(f->mutex_wr);\n  ff_lock(f->mutex_rd);\n\n  f->overwritable = overwritable;\n\n  ff_unlock(f->mutex_wr);\n  ff_unlock(f->mutex_rd);\n}\n\n//--------------------------------------------------------------------+\n// Hardware FIFO API\n// Support different data access width and address increment scheme\n// Can support multiple i.e both 16 and 32-bit data access if needed\n//--------------------------------------------------------------------+\n#if CFG_TUSB_FIFO_HWFIFO_API\n  #if CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE > 0\n    #define HWFIFO_ADDR_NEXT_N(_hwfifo, _const, _n) _hwfifo = (_const volatile void *)((uintptr_t)(_hwfifo) + _n)\n  #else\n    #define HWFIFO_ADDR_NEXT_N(_hwfifo, _const, _n)\n  #endif\n\n  #define HWFIFO_ADDR_NEXT(_hwfifo, _const) HWFIFO_ADDR_NEXT_N(_hwfifo, _const, CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE)\n\n  // the fixed ratio works since in the only case of dynamic/multiple data_stride (rusb2): addr_stride is 0\n  #define HWFIFO_ADDR_DATA_RATIO (CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE / CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE)\n\n//------------- Write -------------//\n  #ifndef CFG_TUSB_FIFO_HWFIFO_CUSTOM_WRITE\nTU_ATTR_ALWAYS_INLINE static inline void stride_write(volatile void *hwfifo, const void *src, uint8_t data_stride) {\n  (void)data_stride; // possible unused\n    #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE & 4\n      #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE != 4\n  if (data_stride == 4)\n      #endif\n  {\n    *((volatile uint32_t *)hwfifo) = tu_unaligned_read32(src);\n  }\n    #endif\n\n    #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE & 2\n      #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE != 2\n  if (data_stride == 2)\n      #endif\n  {\n    *((volatile uint16_t *)hwfifo) = tu_unaligned_read16(src);\n  }\n    #endif\n\n    #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE == 1\n  *((volatile uint8_t *)hwfifo) = *(const uint8_t *)src;\n    #endif\n}\n\n// Copy from fifo to fixed address buffer (usually a tx register) with TU_FIFO_FIXED_ADDR_RW32 mode\nvoid tu_hwfifo_write(volatile void *hwfifo, const uint8_t *src, uint16_t len, const tu_hwfifo_access_t *access_mode) {\n  // Write full available 16/32 bit words to dest\n  const uint8_t data_stride = (access_mode != NULL) ? access_mode->data_stride : CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE;\n  while (len >= data_stride) {\n    stride_write(hwfifo, src, data_stride);\n    src += data_stride;\n    len -= data_stride;\n    HWFIFO_ADDR_NEXT(hwfifo, );\n  }\n\n    #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE > 1\n      #ifdef CFG_TUSB_FIFO_HWFIFO_DATA_ODD_16BIT_ACCESS\n  // 16-bit access is allowed for odd bytes\n  if (len >= 2) {\n    *((volatile uint16_t *)hwfifo) = tu_unaligned_read16(src);\n    src += 2;\n    len -= 2;\n    HWFIFO_ADDR_NEXT_N(hwfifo, , 2);\n  }\n      #endif\n\n      #ifdef CFG_TUSB_FIFO_HWFIFO_DATA_ODD_8BIT_ACCESS\n  // 8-bit access is allowed for odd bytes\n  while (len > 0) {\n    *((volatile uint8_t *)hwfifo) = *src++;\n    len--;\n    HWFIFO_ADDR_NEXT_N(hwfifo, , 1);\n  }\n      #else\n\n  // Write odd bytes i.e 1 byte for 16 bit or 1-3 bytes for 32 bit\n  if (len > 0) {\n    uint32_t tmp = 0u;\n    memcpy(&tmp, src, len);\n    stride_write(hwfifo, &tmp, data_stride);\n    HWFIFO_ADDR_NEXT(hwfifo, );\n  }\n      #endif\n    #endif\n}\n  #endif\n\n//------------- Read -------------//\n  #ifndef CFG_TUSB_FIFO_HWFIFO_CUSTOM_READ\nTU_ATTR_ALWAYS_INLINE static inline void stride_read(const volatile void *hwfifo, void *dest, uint8_t data_stride) {\n  (void)data_stride; // possible unused\n\n    #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE & 4\n      #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE != 4\n  if (data_stride == 4)\n      #endif\n  {\n    tu_unaligned_write32(dest, *((const volatile uint32_t *)hwfifo));\n  }\n    #endif\n\n    #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE & 2\n      #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE != 2\n  if (data_stride == 2)\n      #endif\n  {\n    tu_unaligned_write16(dest, *((const volatile uint16_t *)hwfifo));\n  }\n    #endif\n\n    #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE == 1\n  *(uint8_t *)dest = *((const volatile uint8_t *)hwfifo);\n    #endif\n}\n\nvoid tu_hwfifo_read(const volatile void *hwfifo, uint8_t *dest, uint16_t len, const tu_hwfifo_access_t *access_mode) {\n  // Reading full available 16/32-bit hwfifo and write to fifo\n  const uint8_t data_stride = (access_mode != NULL) ? access_mode->data_stride : CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE;\n  while (len >= data_stride) {\n    stride_read(hwfifo, dest, data_stride);\n    dest += data_stride;\n    len -= data_stride;\n    HWFIFO_ADDR_NEXT(hwfifo, const);\n  }\n\n    #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE > 1\n      #ifdef CFG_TUSB_FIFO_HWFIFO_DATA_ODD_16BIT_ACCESS\n  // 16-bit access is allowed for odd bytes\n  if (len >= 2) {\n    tu_unaligned_write16(dest, *((const volatile uint16_t *)hwfifo));\n    dest += 2;\n    len -= 2;\n    HWFIFO_ADDR_NEXT_N(hwfifo, const, 2);\n  }\n      #endif\n\n      #ifdef CFG_TUSB_FIFO_HWFIFO_DATA_ODD_8BIT_ACCESS\n  // 8-bit access is allowed for odd bytes\n  while (len > 0) {\n    *dest++ = *((const volatile uint8_t *)hwfifo);\n    len--;\n    HWFIFO_ADDR_NEXT_N(hwfifo, const, 1);\n  }\n      #else\n  // Read odd bytes i.e 1 byte for 16 bit or 1-3 bytes for 32 bit\n  if (len > 0) {\n    uint32_t tmp;\n    stride_read(hwfifo, &tmp, data_stride);\n    memcpy(dest, &tmp, len);\n    HWFIFO_ADDR_NEXT(hwfifo, const);\n  }\n      #endif\n    #endif\n}\n  #endif\n\n// push to sw fifo from hwfifo\nstatic void hwff_push_n(const tu_fifo_t *f, const void *app_buf, uint16_t n, uint16_t wr_ptr,\n                        const tu_hwfifo_access_t *access_mode) {\n  uint16_t lin_bytes  = f->depth - wr_ptr;\n  uint16_t wrap_bytes = n - lin_bytes;\n  uint8_t *ff_buf     = f->buffer + wr_ptr;\n\n  const volatile void *hwfifo = (const volatile void *)app_buf;\n  if (n <= lin_bytes) {\n    // Linear only case\n    tu_hwfifo_read(hwfifo, ff_buf, n, access_mode);\n  } else {\n    // Wrap around case\n  #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE == 1\n    tu_hwfifo_read(hwfifo, ff_buf, lin_bytes, access_mode);     // linear part\n    HWFIFO_ADDR_NEXT_N(hwfifo, const, lin_bytes);\n    tu_hwfifo_read(hwfifo, f->buffer, wrap_bytes, access_mode); // wrapped part\n  #else\n    // Write full words to the linear part of the buffer\n    const uint8_t  data_stride = access_mode->data_stride;\n    const uint32_t odd_mask    = data_stride - 1;\n    uint16_t       lin_even    = lin_bytes & ~odd_mask;\n    tu_hwfifo_read(hwfifo, ff_buf, lin_even, access_mode);\n    HWFIFO_ADDR_NEXT_N(hwfifo, const, lin_even * HWFIFO_ADDR_DATA_RATIO);\n    ff_buf += lin_even;\n\n    // There could be an odd 1 byte (16bit) or 1-3 bytes (32bit) before the wrap-around boundary\n    // combine it with the wrapped part to form a full word for data stride\n    const uint8_t lin_odd = lin_bytes & odd_mask;\n    if (lin_odd > 0) {\n      const uint8_t wrap_odd = (uint8_t)tu_min16(wrap_bytes, data_stride - lin_odd);\n      uint8_t       buf_temp[4];\n      tu_hwfifo_read(hwfifo, buf_temp, lin_odd + wrap_odd, access_mode);\n      HWFIFO_ADDR_NEXT(hwfifo, const);\n\n      for (uint8_t i = 0; i < lin_odd; ++i) {\n        ff_buf[i] = buf_temp[i];\n      }\n      for (uint8_t i = 0; i < wrap_odd; ++i) {\n        f->buffer[i] = buf_temp[lin_odd + i];\n      }\n\n      wrap_bytes -= wrap_odd;\n      ff_buf = f->buffer + wrap_odd; // wrap around\n    } else {\n      ff_buf = f->buffer;            // wrap around to beginning\n    }\n\n    // Write data wrapped part\n    if (wrap_bytes > 0) {\n      tu_hwfifo_read(hwfifo, ff_buf, wrap_bytes, access_mode);\n    }\n  #endif\n  }\n}\n\n// pull from sw fifo to hwfifo\nstatic void hwff_pull_n(const tu_fifo_t *f, void *app_buf, uint16_t n, uint16_t rd_ptr,\n                        const tu_hwfifo_access_t *access_mode) {\n  uint16_t       lin_bytes  = f->depth - rd_ptr;\n  uint16_t       wrap_bytes = n - lin_bytes; // only used if wrapped\n  const uint8_t *ff_buf     = f->buffer + rd_ptr;\n\n  volatile void *hwfifo = (volatile void *)app_buf;\n\n  if (n <= lin_bytes) {\n    // Linear only case\n    tu_hwfifo_write(hwfifo, ff_buf, n, access_mode);\n  } else {\n    // Wrap around case\n  #if CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE == 1\n    tu_hwfifo_write(hwfifo, ff_buf, lin_bytes, access_mode);     // linear part\n    HWFIFO_ADDR_NEXT_N(hwfifo, , lin_bytes);\n    tu_hwfifo_write(hwfifo, f->buffer, wrap_bytes, access_mode); // wrapped part\n  #else\n    // Read full words from linear part\n    const uint8_t  data_stride = access_mode->data_stride;\n    const uint32_t odd_mask    = data_stride - 1;\n    uint16_t       lin_even    = lin_bytes & ~odd_mask;\n    tu_hwfifo_write(hwfifo, ff_buf, lin_even, access_mode);\n    HWFIFO_ADDR_NEXT_N(hwfifo, , lin_even * HWFIFO_ADDR_DATA_RATIO);\n    ff_buf += lin_even;\n\n    // There could be odd 1 byte (16bit) or 1-3 bytes (32bit) before the wrap-around boundary\n    const uint8_t lin_odd = lin_bytes & odd_mask;\n    if (lin_odd > 0) {\n      const uint8_t wrap_odd = (uint8_t)tu_min16(wrap_bytes, data_stride - lin_odd);\n\n      uint8_t buf_temp[4];\n      for (uint8_t i = 0; i < lin_odd; ++i) {\n        buf_temp[i] = ff_buf[i];\n      }\n      for (uint8_t i = 0; i < wrap_odd; ++i) {\n        buf_temp[lin_odd + i] = f->buffer[i];\n      }\n\n      tu_hwfifo_write(hwfifo, buf_temp, lin_odd + wrap_odd, access_mode);\n      HWFIFO_ADDR_NEXT(hwfifo, );\n\n      wrap_bytes -= wrap_odd;\n      ff_buf = f->buffer + wrap_odd; // wrap around\n    } else {\n      ff_buf = f->buffer;            // wrap around to beginning\n    }\n\n    // Read data wrapped part\n    if (wrap_bytes > 0) {\n      tu_hwfifo_write(hwfifo, ff_buf, wrap_bytes, access_mode);\n    }\n  #endif\n  }\n}\n#endif\n\n//--------------------------------------------------------------------+\n// Pull & Push\n// copy data to/from fifo without updating read/write pointers\n//--------------------------------------------------------------------+\n// send n items to fifo WITHOUT updating write pointer\nstatic void ff_push_n(const tu_fifo_t *f, const void *app_buf, uint16_t n, uint16_t wr_ptr) {\n  uint16_t lin_bytes  = f->depth - wr_ptr;\n  uint16_t wrap_bytes = n - lin_bytes;\n  uint8_t *ff_buf     = f->buffer + wr_ptr;\n\n  if (n <= lin_bytes) {\n    // Linear only case\n    memcpy(ff_buf, app_buf, n);\n  } else {\n    // Wrap around case\n    memcpy(ff_buf, app_buf, lin_bytes);                                    // linear part\n    memcpy(f->buffer, ((const uint8_t *)app_buf) + lin_bytes, wrap_bytes); // wrapped part\n  }\n}\n\n// get n items from fifo WITHOUT updating read pointer\nstatic void ff_pull_n(const tu_fifo_t *f, void *app_buf, uint16_t n, uint16_t rd_ptr) {\n  uint16_t       lin_bytes  = f->depth - rd_ptr;\n  uint16_t       wrap_bytes = n - lin_bytes; // only used if wrapped\n  const uint8_t *ff_buf     = f->buffer + rd_ptr;\n\n  // single byte access\n  if (n <= lin_bytes) {\n    // Linear only\n    memcpy(app_buf, ff_buf, n);\n  } else {\n    // Wrap around\n    memcpy(app_buf, ff_buf, lin_bytes);                            // linear part\n    memcpy((uint8_t *)app_buf + lin_bytes, f->buffer, wrap_bytes); // wrapped part\n  }\n}\n\n//--------------------------------------------------------------------+\n// Index Helper\n//--------------------------------------------------------------------+\n\n// Advance an absolute index\n// \"absolute\" index is only in the range of [0..2*depth)\nstatic uint16_t advance_index(uint16_t depth, uint16_t idx, uint16_t offset) {\n  // We limit the index space of p such that a correct wrap around happens\n  // Check for a wrap around or if we are in unused index space - This has to be checked first!!\n  // We are exploiting the wrap around to the correct index\n  uint16_t new_idx = (uint16_t)(idx + offset);\n  if ((idx > new_idx) || (new_idx >= 2 * depth)) {\n    const uint16_t non_used_index_space = (uint16_t)(UINT16_MAX - (2 * depth - 1));\n    new_idx                             = (uint16_t)(new_idx + non_used_index_space);\n  }\n\n  return new_idx;\n}\n\n// index to pointer (0..depth-1), simply a modulo with minus.\nTU_ATTR_ALWAYS_INLINE static inline uint16_t idx2ptr(uint16_t depth, uint16_t idx) {\n  // Only run at most 3 times since index is limit in the range of [0..2*depth)\n  while (idx >= depth) {\n    idx -= depth;\n  }\n  return idx;\n}\n\n// Works on local copies of w\n// When an overwritable fifo is overflowed, rd_idx will be re-index so that it forms a full fifo\nstatic uint16_t correct_read_index(tu_fifo_t *f, uint16_t wr_idx) {\n  uint16_t rd_idx;\n  if (wr_idx >= f->depth) {\n    rd_idx = wr_idx - f->depth;\n  } else {\n    rd_idx = wr_idx + f->depth;\n  }\n\n  f->rd_idx = rd_idx;\n  return rd_idx;\n}\n\n//--------------------------------------------------------------------+\n// n-API\n//--------------------------------------------------------------------+\n\n// Works on local copies of w and r\n// Must be protected by read mutex since in case of an overflow read pointer gets modified\nuint16_t tu_fifo_peek_n_access_mode(tu_fifo_t *f, void *p_buffer, uint16_t n, uint16_t wr_idx, uint16_t rd_idx,\n                                    const tu_hwfifo_access_t *access_mode) {\n  uint16_t count = tu_ff_overflow_count(f->depth, wr_idx, rd_idx);\n  if (count == 0) {\n    return 0; // nothing to peek\n  }\n\n  // Check overflow and correct if required\n  if (count > f->depth) {\n    rd_idx = correct_read_index(f, wr_idx);\n    count  = f->depth;\n  }\n\n  if (count < n) {\n    n = count; // limit to available count\n  }\n\n  const uint16_t rd_ptr = idx2ptr(f->depth, rd_idx);\n\n#if CFG_TUSB_FIFO_HWFIFO_API\n  if (access_mode != NULL) {\n    hwff_pull_n(f, p_buffer, n, rd_ptr, access_mode);\n  } else\n#endif\n  {\n    (void)access_mode;\n    ff_pull_n(f, p_buffer, n, rd_ptr);\n  }\n\n  return n;\n}\n\n// Read n items without removing it from the FIFO, correct read pointer if overflowed\nuint16_t tu_fifo_peek_n(tu_fifo_t *f, void *p_buffer, uint16_t n) {\n  ff_lock(f->mutex_rd);\n  const uint16_t wr_idx = f->wr_idx;\n  const uint16_t rd_idx = f->rd_idx;\n  const uint16_t ret = tu_fifo_peek_n_access_mode(f, p_buffer, n, wr_idx, rd_idx, NULL);\n  ff_unlock(f->mutex_rd);\n  return ret;\n}\n\n// Read n items from fifo with access mode\nuint16_t tu_fifo_read_n_access_mode(tu_fifo_t *f, void *buffer, uint16_t n, const tu_hwfifo_access_t *access_mode) {\n  ff_lock(f->mutex_rd);\n\n  // Peek the data: f->rd_idx might get modified in case of an overflow so we can not use a local variable\n  const uint16_t wr_idx = f->wr_idx;\n  n         = tu_fifo_peek_n_access_mode(f, buffer, n, wr_idx, f->rd_idx, access_mode);\n  f->rd_idx = advance_index(f->depth, f->rd_idx, n);\n\n  ff_unlock(f->mutex_rd);\n  return n;\n}\n\n// Write n items to fifo with access mode\nuint16_t tu_fifo_write_n_access_mode(tu_fifo_t *f, const void *data, uint16_t n,\n                                     const tu_hwfifo_access_t *access_mode) {\n  if (n == 0) {\n    return 0;\n  }\n\n  ff_lock(f->mutex_wr);\n\n  uint16_t wr_idx = f->wr_idx;\n  uint16_t rd_idx = f->rd_idx;\n\n  const uint8_t *buf8 = (const uint8_t *)data;\n\n  TU_LOG(TU_FIFO_DBG, \"rd = %3u, wr = %3u, count = %3u, remain = %3u, n = %3u:  \", rd_idx, wr_idx,\n         tu_ff_overflow_count(f->depth, wr_idx, rd_idx), tu_ff_remaining_local(f->depth, wr_idx, rd_idx), n);\n\n  if (!f->overwritable) {\n    // limit up to full\n    const uint16_t remain = tu_ff_remaining_local(f->depth, wr_idx, rd_idx);\n    n                     = tu_min16(n, remain);\n  } else {\n    // In over-writable mode, fifo_write() is allowed even when fifo is full. In such case,\n    // oldest data in fifo i.e. at read pointer data will be overwritten\n    // Note: we can modify read buffer contents however we must not modify the read index itself within a write\n    // function! Since it would end up in a race condition with read functions!\n    if (n >= f->depth) {\n      // Only copy last part\n      if (access_mode == NULL) {\n        buf8 += (n - f->depth);\n      } else {\n        // TODO should read from hw fifo to discard data, however reading an odd number could\n        // accidentally discard data.\n      }\n\n      n = f->depth;\n\n      // We start writing at the read pointer's position since we fill the whole buffer\n      wr_idx = rd_idx;\n    } else {\n      const uint16_t overflowable_count = tu_ff_overflow_count(f->depth, wr_idx, rd_idx);\n      if (overflowable_count + n >= 2 * f->depth) {\n        // Double overflowed\n        // Index is bigger than the allowed range [0,2*depth)\n        // re-position write index to have a full fifo after pushed\n        wr_idx = advance_index(f->depth, rd_idx, f->depth - n);\n\n        // TODO we should also shift out n bytes from read index since we avoid changing rd index !!\n        // However memmove() is expensive due to actual copying + wrapping consideration.\n        // Also race condition could happen anyway if read() is invoke while moving result in corrupted memory\n        // currently deliberately not implemented --> result in incorrect data read back\n      } else {\n        // normal + single overflowed:\n        // Index is in the range of [0,2*depth) and thus detect and recoverable. Recovering is handled in read()\n        // Therefore we just increase write index\n        // we will correct (re-position) read index later on in fifo_read() function\n      }\n    }\n  }\n\n  if (n) {\n    const uint16_t wr_ptr = idx2ptr(f->depth, wr_idx);\n    TU_LOG(TU_FIFO_DBG, \"actual_n = %u, wr_ptr = %u\", n, wr_ptr);\n\n#if CFG_TUSB_FIFO_HWFIFO_API\n    if (access_mode != NULL) {\n      hwff_push_n(f, buf8, n, wr_ptr, access_mode);\n    } else\n#endif\n    {\n      ff_push_n(f, buf8, n, wr_ptr);\n    }\n    f->wr_idx = advance_index(f->depth, wr_idx, n);\n\n    TU_LOG(TU_FIFO_DBG, \"\\tnew_wr = %u\\r\\n\", f->wr_idx);\n  }\n\n  ff_unlock(f->mutex_wr);\n\n  return n;\n}\n\nuint16_t tu_fifo_discard_n(tu_fifo_t *f, uint16_t n) {\n  const uint16_t count = tu_min16(n, tu_fifo_count(f)); // limit to available count\n  ff_lock(f->mutex_rd);\n  f->rd_idx = advance_index(f->depth, f->rd_idx, count);\n  ff_unlock(f->mutex_rd);\n\n  return count;\n}\n\n//--------------------------------------------------------------------+\n// One API\n//--------------------------------------------------------------------+\n\n// peek() using local write/read index, correct read index if overflowed\n// Be careful, caller must not lock mutex, since this Will also try to lock mutex\nstatic bool ff_peek_local(tu_fifo_t *f, void *buf, uint16_t wr_idx, uint16_t rd_idx) {\n  const uint16_t ovf_count = tu_ff_overflow_count(f->depth, wr_idx, rd_idx);\n  if (ovf_count == 0) {\n    return false; // nothing to peek\n  }\n\n  // Correct read index if overflow\n  if (ovf_count > f->depth) {\n    ff_lock(f->mutex_rd);\n    rd_idx = correct_read_index(f, wr_idx);\n    ff_unlock(f->mutex_rd);\n  }\n\n  const uint16_t rd_ptr = idx2ptr(f->depth, rd_idx);\n  memcpy(buf, f->buffer + rd_ptr, 1);\n\n  return true;\n}\n\n// Read one element out of the buffer, correct read index if overflowed\nbool tu_fifo_read(tu_fifo_t *f, void *buffer) {\n  // Peek the data\n  // f->rd_idx might get modified in case of an overflow so we can not use a local variable\n  const uint16_t wr_idx = f->wr_idx;\n  const bool ret = ff_peek_local(f, buffer, wr_idx, f->rd_idx);\n  if (ret) {\n    ff_lock(f->mutex_rd);\n    f->rd_idx = advance_index(f->depth, f->rd_idx, 1);\n    ff_unlock(f->mutex_rd);\n  }\n\n  return ret;\n}\n\n// Read one item without removing it from the FIFO, correct read index if overflowed\nbool tu_fifo_peek(tu_fifo_t *f, void *p_buffer) {\n  const uint16_t wr_idx = f->wr_idx;\n  const uint16_t rd_idx = f->rd_idx;\n  return ff_peek_local(f, p_buffer, wr_idx, rd_idx);\n}\n\n// Write one element into the buffer\nbool tu_fifo_write(tu_fifo_t *f, const void *data) {\n  bool ret;\n  ff_lock(f->mutex_wr);\n\n  const uint16_t wr_idx = f->wr_idx;\n\n  if (tu_fifo_full(f) && !f->overwritable) {\n    ret = false;\n  } else {\n    const uint16_t wr_ptr = idx2ptr(f->depth, wr_idx);\n    memcpy(f->buffer + wr_ptr, data, 1);\n    f->wr_idx = advance_index(f->depth, wr_idx, 1);\n    ret       = true;\n  }\n\n  ff_unlock(f->mutex_wr);\n\n  return ret;\n}\n\n//--------------------------------------------------------------------+\n// Index API\n//--------------------------------------------------------------------+\n\n/******************************************************************************/\n/*!\n    @brief Advance write pointer - intended to be used in combination with DMA.\n    It is possible to fill the FIFO by use of a DMA in circular mode. Within\n    DMA ISRs you may update the write pointer to be able to read from the FIFO.\n    As long as the DMA is the only process writing into the FIFO this is safe\n    to use.\n\n    USE WITH CARE - WE DO NOT CONDUCT SAFETY CHECKS HERE!\n\n    @param[in]  f\n                Pointer to the FIFO buffer to manipulate\n    @param[in]  n\n                Number of items the write pointer moves forward\n */\n/******************************************************************************/\nvoid tu_fifo_advance_write_pointer(tu_fifo_t *f, uint16_t n) {\n  f->wr_idx = advance_index(f->depth, f->wr_idx, n);\n}\n\n// Correct the read index in case tu_fifo_overflow() returned true!\nvoid tu_fifo_correct_read_pointer(tu_fifo_t *f) {\n  ff_lock(f->mutex_rd);\n  correct_read_index(f, f->wr_idx);\n  ff_unlock(f->mutex_rd);\n}\n\n/******************************************************************************/\n/*!\n    @brief Advance read pointer - intended to be used in combination with DMA.\n    It is possible to read from the FIFO by use of a DMA in linear mode. Within\n    DMA ISRs you may update the read pointer to be able to again write into the\n    FIFO. As long as the DMA is the only process reading from the FIFO this is\n    safe to use.\n\n    USE WITH CARE - WE DO NOT CONDUCT SAFETY CHECKS HERE!\n\n    @param[in]  f\n                Pointer to the FIFO buffer to manipulate\n    @param[in]  n\n                Number of items the read pointer moves forward\n */\n/******************************************************************************/\nvoid tu_fifo_advance_read_pointer(tu_fifo_t *f, uint16_t n) {\n  f->rd_idx = advance_index(f->depth, f->rd_idx, n);\n}\n\n/******************************************************************************/\n/*!\n   @brief Get read info\n\n   Returns the length and pointer from which bytes can be read in a linear manner.\n   This is of major interest for DMA transmissions. If returned length is zero the\n   corresponding pointer is invalid.\n   The read pointer does NOT get advanced, use tu_fifo_advance_read_pointer() to\n   do so!\n   @param[in]       f\n                    Pointer to FIFO\n   @param[out]      *info\n                    Pointer to struct which holds the desired infos\n */\n/******************************************************************************/\nvoid tu_fifo_get_read_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info) {\n  // Operate on temporary values in case they change in between\n  uint16_t wr_idx = f->wr_idx;\n  uint16_t rd_idx = f->rd_idx;\n\n  uint16_t cnt = tu_ff_overflow_count(f->depth, wr_idx, rd_idx);\n\n  // Check overflow and correct if required - may happen in case a DMA wrote too fast\n  if (cnt > f->depth) {\n    ff_lock(f->mutex_rd);\n    rd_idx = correct_read_index(f, wr_idx);\n    ff_unlock(f->mutex_rd);\n\n    cnt = f->depth;\n  }\n\n  // Check if fifo is empty\n  if (cnt == 0) {\n    info->linear.len  = 0;\n    info->wrapped.len = 0;\n    info->linear.ptr  = NULL;\n    info->wrapped.ptr = NULL;\n    return;\n  }\n\n  // Get relative pointers\n  uint16_t wr_ptr = idx2ptr(f->depth, wr_idx);\n  uint16_t rd_ptr = idx2ptr(f->depth, rd_idx);\n\n  // Copy pointer to buffer to start reading from\n  info->linear.ptr = &f->buffer[rd_ptr];\n\n  // Check if there is a wrap around necessary\n  if (wr_ptr > rd_ptr) {\n    // Non wrapping case\n    info->linear.len = cnt;\n\n    info->wrapped.len = 0;\n    info->wrapped.ptr = NULL;\n  } else {\n    info->linear.len = f->depth - rd_ptr; // Also the case if FIFO was full\n\n    info->wrapped.len = cnt - info->linear.len;\n    info->wrapped.ptr = f->buffer;\n  }\n}\n\n/******************************************************************************/\n/*!\n   @brief Get linear write info\n\n   Returns the length and pointer to which bytes can be written into FIFO in a linear manner.\n   This is of major interest for DMA transmissions not using circular mode. If a returned length is zero the\n   corresponding pointer is invalid. The returned lengths summed up are the currently free space in the FIFO.\n   The write pointer does NOT get advanced, use tu_fifo_advance_write_pointer() to do so!\n   TAKE CARE TO NOT OVERFLOW THE BUFFER MORE THAN TWO TIMES THE FIFO DEPTH - IT CAN NOT RECOVERE OTHERWISE!\n   @param[in]       f\n                    Pointer to FIFO\n   @param[out]      *info\n                    Pointer to struct which holds the desired infos\n */\n/******************************************************************************/\nvoid tu_fifo_get_write_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info) {\n  uint16_t wr_idx = f->wr_idx;\n  uint16_t rd_idx = f->rd_idx;\n  uint16_t remain = tu_ff_remaining_local(f->depth, wr_idx, rd_idx);\n\n  if (remain == 0) {\n    info->linear.len  = 0;\n    info->wrapped.len = 0;\n    info->linear.ptr  = NULL;\n    info->wrapped.ptr = NULL;\n    return;\n  }\n\n  // Get relative pointers\n  uint16_t wr_ptr = idx2ptr(f->depth, wr_idx);\n  uint16_t rd_ptr = idx2ptr(f->depth, rd_idx);\n\n  // Copy pointer to buffer to start writing to\n  info->linear.ptr = &f->buffer[wr_ptr];\n\n  if (wr_ptr < rd_ptr) {\n    // Non wrapping case\n    info->linear.len  = rd_ptr - wr_ptr;\n    info->wrapped.len = 0;\n    info->wrapped.ptr = NULL;\n  } else {\n    info->linear.len  = f->depth - wr_ptr;\n    info->wrapped.len = remain - info->linear.len; // Remaining length - n already was limited to remain or FIFO depth\n    info->wrapped.ptr = f->buffer;                 // Always start of buffer\n  }\n}\n"
  },
  {
    "path": "src/common/tusb_fifo.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Reinhard Panhuber - rework to unmasked pointers\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_FIFO_H_\n#define TUSB_FIFO_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"common/tusb_common.h\"\n#include \"osal/osal.h\"\n\n//--------------------------------------------------------------------+\n// Configuration\n//--------------------------------------------------------------------+\n// mutex is only needed for RTOS. For OS None, we don't get preempted\n#define CFG_FIFO_MUTEX      OSAL_MUTEX_REQUIRED\n\n#define CFG_TUSB_FIFO_HWFIFO_API (CFG_TUD_EDPT_DEDICATED_HWFIFO || CFG_TUH_EDPT_DEDICATED_HWFIFO)\n\n#ifndef CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE 0\n#endif\n\n#ifndef CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE\n  #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE 0\n#endif\n\n// Due to the use of unmasked pointers, this FIFO does not suffer from losing\n// one item slice. Furthermore, write and read operations are completely\n// decoupled as write and read functions do not modify a common state. Henceforth,\n// writing or reading from the FIFO within an ISR is safe as long as no other\n// process (thread or ISR) interferes.\n// Also, this FIFO is ready to be used in combination with a DMA as the write and\n// read pointers can be updated from within a DMA ISR. Overflows are detectable\n// within a certain number (see tu_fifo_overflow()).\n\n/* Write/Read \"pointer\" is in the range of: 0 .. depth - 1, and is used to get the fifo data.\n * Write/Read \"index\" is always in the range of: 0 .. 2*depth-1\n *\n * The extra window allow us to determine the fifo state of empty or full with only 2 indices\n * Following are examples with depth = 3\n *\n * - empty: W = R\n *                |\n *    -------------------------\n *    | 0 | RW| 2 | 3 | 4 | 5 |\n *\n * - full 1: W > R\n *                |\n *    -------------------------\n *    | 0 | R | 2 | 3 | W | 5 |\n *\n * - full 2: W < R\n *                |\n *    -------------------------\n *    | 0 | 1 | W | 3 | 4 | R |\n *\n * - Number of items in the fifo can be determined in either cases:\n *    - case W >= R: Count = W - R\n *    - case W <  R: Count = 2*depth - (R - W)\n *\n * In non-overwritable mode, computed Count (in above 2 cases) is at most equal to depth.\n * However, in over-writable mode, write index can be repeatedly increased and count can be\n * temporarily larger than depth (overflowed condition) e.g\n *\n *  - Overflowed 1: write(3), write(1)\n *    In this case we will adjust Read index when read()/peek() is called so that count = depth.\n *                  |\n *      -------------------------\n *      | R | 1 | 2 | 3 | W | 5 |\n *\n *  - Double Overflowed i.e index is out of allowed range [0,2*depth)\n *    This occurs when we continue to write after 1st overflowed to 2nd overflowed. e.g:\n *      write(3), write(1), write(2)\n *    This must be prevented since it will cause unrecoverable state, in above example\n *    if not handled the fifo will be empty instead of continue-to-be full. Since we must not modify\n *    read index in write() function, which cause race condition. We will re-position write index so that\n *    after data is written it is a full fifo i.e W = depth - R\n *\n *      re-position W = 1 before write(2)\n *      Note: we should also move data from mem[3] to read index as well, but deliberately skipped here\n *      since it is an expensive operation !!!\n *                  |\n *      -------------------------\n *      | R | W | 2 | 3 | 4 | 5 |\n *\n *      perform write(2), result is still a full fifo.\n *\n *                  |\n *      -------------------------\n *      | R | 1 | 2 | W | 4 | 5 |\n */\ntypedef struct {\n  uint8_t *buffer;              // buffer pointer\n  uint16_t depth;               // max items\n  bool     overwritable;        // overwritable when full\n  // 1 byte padding here\n\n  volatile uint16_t wr_idx;     // write index\n  volatile uint16_t rd_idx;     // read index\n\n#if OSAL_MUTEX_REQUIRED\n  osal_mutex_t mutex_wr;\n  osal_mutex_t mutex_rd;\n#endif\n} tu_fifo_t;\n\ntypedef struct {\n  struct {\n    uint16_t len; // length\n    uint8_t *ptr; // buffer pointer\n  } linear, wrapped;\n} tu_fifo_buffer_info_t;\n\n// Access mode for hardware fifo read/write\ntypedef struct {\n  uint8_t   data_stride;\n  uintptr_t param;\n} tu_hwfifo_access_t;\n\n#define TU_FIFO_INIT(_buffer, _depth, _overwritable) \\\n  {                                                  \\\n    .buffer       = _buffer,                         \\\n    .depth        = _depth,                          \\\n    .overwritable = _overwritable,                   \\\n  }\n\n#define TU_FIFO_DEF(_name, _depth, _overwritable)                    \\\n  uint8_t   _name##_buf[_depth];                                     \\\n  tu_fifo_t _name = TU_FIFO_INIT(_name##_buf, _depth, _overwritable)\n\n// Moving data from tusb_fifo <-> USB hardware FIFOs e.g. STM32s need to use a special stride mode which reads/writes\n// data in 2/4 byte chunks from/to a fixed address (USB FIFO register) instead of incrementing the address. For this use\n// read/write access_mode with stride_mode = true. The STRIDE DATA and ADDR stride must be configured with\n// CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE and CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE\n\n//--------------------------------------------------------------------+\n// Setup API\n//--------------------------------------------------------------------+\nbool tu_fifo_config(tu_fifo_t *f, void *buffer, uint16_t depth, bool overwritable);\nvoid tu_fifo_set_overwritable(tu_fifo_t *f, bool overwritable);\nvoid tu_fifo_clear(tu_fifo_t *f);\n\n#if OSAL_MUTEX_REQUIRED\nTU_ATTR_ALWAYS_INLINE static inline\nvoid tu_fifo_config_mutex(tu_fifo_t *f, osal_mutex_t wr_mutex, osal_mutex_t rd_mutex) {\n  f->mutex_wr = wr_mutex;\n  f->mutex_rd = rd_mutex;\n}\n#else\n#define tu_fifo_config_mutex(_f, _wr_mutex, _rd_mutex)\n#endif\n\n//--------------------------------------------------------------------+\n// Index API\n//--------------------------------------------------------------------+\nvoid tu_fifo_correct_read_pointer(tu_fifo_t *f);\n\n// Pointer modifications intended to be used in combinations with DMAs.\n// USE WITH CARE - NO SAFETY CHECKS CONDUCTED HERE! NOT MUTEX PROTECTED!\nvoid tu_fifo_advance_write_pointer(tu_fifo_t *f, uint16_t n);\nvoid tu_fifo_advance_read_pointer(tu_fifo_t *f, uint16_t n);\n\n// If you want to read/write from/to the FIFO by use of a DMA, you may need to conduct two copies\n// to handle a possible wrapping part. These functions deliver a pointer to start\n// reading/writing from/to and a valid linear length along which no wrap occurs.\nvoid tu_fifo_get_read_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info);\nvoid tu_fifo_get_write_info(tu_fifo_t *f, tu_fifo_buffer_info_t *info);\n\n//--------------------------------------------------------------------+\n// Peek API\n// peek() will correct/re-index read pointer in case of an overflowed fifo to form a full fifo\n//--------------------------------------------------------------------+\nuint16_t tu_fifo_peek_n_access_mode(tu_fifo_t *f, void *p_buffer, uint16_t n, uint16_t wr_idx, uint16_t rd_idx,\n                                    const tu_hwfifo_access_t *access_mode);\nbool     tu_fifo_peek(tu_fifo_t *f, void *p_buffer);\nuint16_t tu_fifo_peek_n(tu_fifo_t *f, void *p_buffer, uint16_t n);\n\n//--------------------------------------------------------------------+\n// Read API\n// peek() + advance read index\n//--------------------------------------------------------------------+\nuint16_t tu_fifo_read_n_access_mode(tu_fifo_t *f, void *buffer, uint16_t n, const tu_hwfifo_access_t *access_mode);\nbool     tu_fifo_read(tu_fifo_t *f, void *buffer);\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_fifo_read_n(tu_fifo_t *f, void *buffer, uint16_t n) {\n  return tu_fifo_read_n_access_mode(f, buffer, n, NULL);\n}\n\n// discard first n items from fifo i.e advance read pointer by n with mutex\n// return number of discarded items\nuint16_t tu_fifo_discard_n(tu_fifo_t *f, uint16_t n);\n\n//--------------------------------------------------------------------+\n// Write API\n//--------------------------------------------------------------------+\nuint16_t tu_fifo_write_n_access_mode(tu_fifo_t *f, const void *data, uint16_t n, const tu_hwfifo_access_t *access_mode);\nbool     tu_fifo_write(tu_fifo_t *f, const void *data);\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_fifo_write_n(tu_fifo_t *f, const void *data, uint16_t n) {\n  return tu_fifo_write_n_access_mode(f, data, n, NULL);\n}\n\n//--------------------------------------------------------------------+\n// Hardware FIFO API\n// Special hardware FIFO/Buffer to hold USB data, usually requires certain access method these can be configured with\n// CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE (data width) and CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE (address increment)\n// Note: these usually has opposite direction (read/write) to/from our software FIFO  (tu_fifo_t)\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_hwfifo_write_from_fifo(volatile void *hwfifo, tu_fifo_t *f, uint16_t n,\n                                                                       const tu_hwfifo_access_t *access_mode) {\n  const tu_hwfifo_access_t default_access = {.data_stride = CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE, .param = 0};\n  return tu_fifo_read_n_access_mode(f, (void *)(uintptr_t)hwfifo, n,\n                                    (access_mode != NULL) ? access_mode : &default_access);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_hwfifo_read_to_fifo(const volatile void *hwfifo, tu_fifo_t *f,\n                                                                    uint16_t n, const tu_hwfifo_access_t *access_mode) {\n  const tu_hwfifo_access_t default_access = {.data_stride = CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE, .param = 0};\n  return tu_fifo_write_n_access_mode(f, (const void *)(uintptr_t)hwfifo, n,\n                                     (access_mode != NULL) ? access_mode : &default_access);\n}\n\n#if CFG_TUSB_FIFO_HWFIFO_API\n// read from hwfifo to buffer\nvoid tu_hwfifo_read(const volatile void *hwfifo, uint8_t *dest, uint16_t len, const tu_hwfifo_access_t *access_mode);\n\n// write to hwfifo from buffer with access mode\nvoid tu_hwfifo_write(volatile void *hwfifo, const uint8_t *src, uint16_t len, const tu_hwfifo_access_t *access_mode);\n\n#endif\n\n//--------------------------------------------------------------------+\n// Internal Helper Local\n// work on local copies of read/write indices in order to only access them once for re-entrancy\n//--------------------------------------------------------------------+\n// return overflowable count (index difference), which can be used to determine both fifo count and an overflow state\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_ff_overflow_count(uint16_t depth, uint16_t wr_idx, uint16_t rd_idx) {\n  const int32_t diff = (int32_t)wr_idx - (int32_t)rd_idx;\n  if (diff >= 0) {\n    return (uint16_t)diff;\n  } else {\n    return (uint16_t)(2 * depth + diff);\n  }\n}\n\n// return remaining slot in fifo\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_ff_remaining_local(uint16_t depth, uint16_t wr_idx, uint16_t rd_idx) {\n  const uint16_t ovf_count = tu_ff_overflow_count(depth, wr_idx, rd_idx);\n  return (depth > ovf_count) ? (depth - ovf_count) : 0;\n}\n\n//--------------------------------------------------------------------+\n// State API\n// Following functions are reentrant since they only access read/write indices once, therefore can be used in thread and\n// ISRs context without the need of mutexes\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_fifo_depth(const tu_fifo_t *f) {\n  return f->depth;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_fifo_empty(const tu_fifo_t *f) {\n  const uint16_t wr_idx = f->wr_idx;\n  const uint16_t rd_idx = f->rd_idx;\n  return wr_idx == rd_idx;\n}\n\n// return number of items in fifo, capped to fifo's depth\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_fifo_count(const tu_fifo_t *f) {\n  const uint16_t wr_idx = f->wr_idx;\n  const uint16_t rd_idx = f->rd_idx;\n  return tu_min16(tu_ff_overflow_count(f->depth, wr_idx, rd_idx), f->depth);\n}\n\n// check if fifo is full\nTU_ATTR_ALWAYS_INLINE static inline bool tu_fifo_full(const tu_fifo_t *f) {\n  const uint16_t wr_idx = f->wr_idx;\n  const uint16_t rd_idx = f->rd_idx;\n  return tu_ff_overflow_count(f->depth, wr_idx, rd_idx) >= f->depth;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_fifo_remaining(const tu_fifo_t *f) {\n  const uint16_t wr_idx = f->wr_idx;\n  const uint16_t rd_idx = f->rd_idx;\n  return tu_ff_remaining_local(f->depth, wr_idx, rd_idx);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/common/tusb_mcu.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#pragma once\n\n//--------------------------------------------------------------------+\n// Port/Platform Specific\n// TUP stand for TinyUSB Port/Platform (can be renamed)\n//--------------------------------------------------------------------+\n\n//------------- Unaligned Memory Access -------------//\n\n#ifdef __ARM_ARCH\n  // ARM Architecture set __ARM_FEATURE_UNALIGNED to 1 for mcu supports unaligned access\n  #if defined(__ARM_FEATURE_UNALIGNED) && __ARM_FEATURE_UNALIGNED == 1\n    #define TUP_ARCH_STRICT_ALIGN 0\n  #else\n    #define TUP_ARCH_STRICT_ALIGN 1\n  #endif\n#else\n  // TODO default to strict align for others\n  // Should investigate other architecture such as risv, xtensa, mips for optimal setting\n  #define TUP_ARCH_STRICT_ALIGN 1\n#endif\n\n/* USB Controller Attributes for Device, Host or MCU (both)\n * - ENDPOINT_MAX: max (logical) number of endpoint\n * - ENDPOINT_EXCLUSIVE_NUMBER: endpoint number with different direction IN and OUT aren't allowed,\n *                              e.g EP1 OUT & EP1 IN cannot exist together\n * - RHPORT_HIGHSPEED: support highspeed with on-chip PHY\n */\n\n//--------------------------------------------------------------------+\n// NXP\n//--------------------------------------------------------------------+\n#if TU_CHECK_MCU(OPT_MCU_LPC11UXX, OPT_MCU_LPC13XX, OPT_MCU_LPC15XX)\n  #define TUP_USBIP_IP3511\n  #define TUP_DCD_ENDPOINT_MAX 5\n\n#elif TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)\n  #define TUP_DCD_ENDPOINT_MAX 16\n  #define TUP_USBIP_OHCI\n  #define TUP_USBIP_OHCI_NXP\n  #define TUP_OHCI_RHPORTS 2\n\n#elif TU_CHECK_MCU(OPT_MCU_LPC51UXX)\n  #define TUP_USBIP_IP3511\n  #define TUP_DCD_ENDPOINT_MAX 5\n\n#elif TU_CHECK_MCU(OPT_MCU_LPC54)\n  #include \"fsl_device_registers.h\"\n\n  // TODO USB0 has 5, USB1 has 6\n  #define TUP_USBIP_IP3511\n\n  #if !defined(LPC54114_cm4_SERIES) && !defined(LPC54114_cm0plus_SERIES)\n    #define TUP_USBIP_IP3516\n    #define TUP_USBIP_OHCI\n    #define TUP_USBIP_OHCI_NXP\n    #define TUP_OHCI_RHPORTS     1 // 1 downstream port\n  #endif\n\n  #define TUP_DCD_ENDPOINT_MAX 6\n\n#elif TU_CHECK_MCU(OPT_MCU_LPC55)\n  // TODO USB0 has 5, USB1 has 6\n  #define TUP_USBIP_IP3511\n  #define TUP_USBIP_IP3516\n  #define TUP_USBIP_OHCI\n  #define TUP_USBIP_OHCI_NXP\n  #define TUP_OHCI_RHPORTS     1 // 1 downstream port\n\n  #define TUP_DCD_ENDPOINT_MAX 6\n\n#elif TU_CHECK_MCU(OPT_MCU_LPC18XX, OPT_MCU_LPC43XX)\n  // USB0 has 6 with HS PHY, USB1 has 4 only FS\n  #define TUP_USBIP_CHIPIDEA_HS\n  #define TUP_USBIP_EHCI\n\n  #define TUP_DCD_ENDPOINT_MAX 6\n  #define TUP_RHPORT_HIGHSPEED 1\n\n#elif TU_CHECK_MCU(OPT_MCU_MCXN9)\n  // USB0 is chipidea FS\n  #define TUP_USBIP_CHIPIDEA_FS\n  #define TUP_USBIP_CHIPIDEA_FS_MCX\n\n  // USB1 is chipidea HS\n  #define TUP_USBIP_CHIPIDEA_HS\n  #define TUP_USBIP_EHCI\n\n  #define TUP_DCD_ENDPOINT_MAX 8\n  #define TUP_RHPORT_HIGHSPEED 1\n\n#elif TU_CHECK_MCU(OPT_MCU_MCXA15)\n  // USB0 is chipidea FS\n  #define TUP_USBIP_CHIPIDEA_FS\n  #define TUP_USBIP_CHIPIDEA_FS_MCX\n\n  #define TUP_DCD_ENDPOINT_MAX 16\n\n#elif TU_CHECK_MCU(OPT_MCU_RW61X)\n  // USB0 is chipidea HS\n  #define TUP_USBIP_CHIPIDEA_HS\n  #define TUP_USBIP_EHCI\n\n  #define TUP_DCD_ENDPOINT_MAX 8\n  #define TUP_RHPORT_HIGHSPEED 1\n\n#elif TU_CHECK_MCU(OPT_MCU_MIMXRT1XXX)\n  #include \"fsl_device_registers.h\"\n\n  #define TUP_USBIP_CHIPIDEA_HS\n  #define TUP_USBIP_EHCI\n\n  #define TUP_DCD_ENDPOINT_MAX 8\n  #define TUP_RHPORT_HIGHSPEED 1\n\n  #if __CORTEX_M == 7\n    #define CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT     1\n    #define CFG_TUH_MEM_DCACHE_ENABLE_DEFAULT     1\n    #define CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT 32\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_KINETIS_KL, OPT_MCU_KINETIS_K32L, OPT_MCU_KINETIS_K)\n  #define TUP_USBIP_CHIPIDEA_FS\n  #define TUP_USBIP_CHIPIDEA_FS_KINETIS\n  #define TUP_DCD_ENDPOINT_MAX 16\n\n#elif TU_CHECK_MCU(OPT_MCU_MM32F327X)\n  #define TUP_DCD_ENDPOINT_MAX 16\n  #define TUP_DCD_EDPT_CLOSE_API\n\n//--------------------------------------------------------------------+\n// Nordic\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_NRF5X)\n  // 8 CBI + 1 ISO\n  #define TUP_DCD_ENDPOINT_MAX 9\n  #define TUP_DCD_EDPT_CLOSE_API\n\n#elif TU_CHECK_MCU(OPT_MCU_NRF54)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_NRF\n  #define TUP_DCD_ENDPOINT_MAX            16\n  #define CFG_TUH_DWC2_DMA_ENABLE_DEFAULT 0\n\n//--------------------------------------------------------------------+\n// Microchip\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_SAMD11, OPT_MCU_SAML2X, OPT_MCU_SAMD21) || TU_CHECK_MCU(OPT_MCU_SAMD51, OPT_MCU_SAME5X)\n  #define TUP_DCD_ENDPOINT_MAX 8\n\n#elif TU_CHECK_MCU(OPT_MCU_SAMG)\n  #define TUP_DCD_ENDPOINT_MAX 6\n  #define TUD_ENDPOINT_ONE_DIRECTION_ONLY\n\n#elif TU_CHECK_MCU(OPT_MCU_SAMX7X)\n  #define TUP_DCD_ENDPOINT_MAX 10\n  #define TUP_RHPORT_HIGHSPEED 1\n  #define TUD_ENDPOINT_ONE_DIRECTION_ONLY\n\n  // Enable dcache if DMA is enabled\n  #define CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUD_SAMX7X_DMA_ENABLE\n  #define CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT 32\n\n#elif TU_CHECK_MCU(OPT_MCU_PIC32MZ)\n  #define TUP_DCD_ENDPOINT_MAX 8\n  #define TUD_ENDPOINT_ONE_DIRECTION_ONLY\n\n#elif TU_CHECK_MCU(OPT_MCU_PIC32MX, OPT_MCU_PIC32MM, OPT_MCU_PIC32MK) || TU_CHECK_MCU(OPT_MCU_PIC24, OPT_MCU_DSPIC33)\n  #define TUP_DCD_ENDPOINT_MAX 16\n  #define TUD_ENDPOINT_ONE_DIRECTION_ONLY\n  #define TUP_DCD_EDPT_CLOSE_API\n\n//--------------------------------------------------------------------+\n// ST\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_STM32C0)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define TUP_USBIP_FSDEV_DRD\n  #define CFG_TUSB_FSDEV_PMA_SIZE 2048u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32F0)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define CFG_TUSB_FSDEV_PMA_SIZE 1024u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32F1)\n  // - F102, F103 use fsdev\n  // - F105, F107 use dwc2\n  #if defined(STM32F105x8) || defined(STM32F105xB) || defined(STM32F105xC) || defined(STM32F107xB) || \\\n    defined(STM32F107xC)\n    #define TUP_USBIP_DWC2\n    #define TUP_USBIP_DWC2_STM32\n    #define CFG_TUH_DWC2_DMA_ENABLE_DEFAULT 0\n\n    #define TUP_DCD_ENDPOINT_MAX            4\n  #elif defined(STM32F102x6) || defined(STM32F102xB) || defined(STM32F103x6) || defined(STM32F103xB) || \\\n    defined(STM32F103xE) || defined(STM32F103xG)\n    #define TUP_USBIP_FSDEV\n    #define TUP_USBIP_FSDEV_STM32\n    #define CFG_TUSB_FSDEV_PMA_SIZE 512u\n  #else\n    #error \"Unsupported STM32F1 mcu\"\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32F2)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_STM32\n\n  // FS has 4 ep, HS has 5 ep\n  #define TUP_DCD_ENDPOINT_MAX 6\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32F3)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n\n  #if defined(STM32F302xB) || defined(STM32F302xC) || defined(STM32F303xB) || defined(STM32F303xC) || \\\n    defined(STM32F373xC)\n    // xB, and xC: 512\n    #define CFG_TUSB_FSDEV_PMA_SIZE 512u\n  #elif defined(STM32F302x6) || defined(STM32F302x8) || defined(STM32F302xD) || defined(STM32F302xE) || \\\n    defined(STM32F303xD) || defined(STM32F303xE)\n    // x6, x8, xD, and xE: 1024 + LPM Support\n    #define CFG_TUSB_FSDEV_PMA_SIZE 1024u\n  #else\n    #error \"Unsupported STM32F3 mcu\"\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32F4)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_STM32\n\n  // For most mcu, FS has 4, HS has 6. TODO 446/469/479 HS has 9\n  #define TUP_DCD_ENDPOINT_MAX 6\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32F7)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_STM32\n\n  // FS has 6, HS has 9\n  #define TUP_DCD_ENDPOINT_MAX 9\n\n  // MCU with on-chip HS Phy\n  #if defined(STM32F723xx) || defined(STM32F730xx) || defined(STM32F733xx)\n    #define TUP_RHPORT_HIGHSPEED 1 // Port0: FS, Port1: HS\n  #endif\n\n  // Enable dcache if DMA is enabled\n  #define CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUD_DWC2_DMA_ENABLE\n  #define CFG_TUH_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUH_DWC2_DMA_ENABLE\n  #define CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT 32\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32G0)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define TUP_USBIP_FSDEV_DRD\n  #define CFG_TUSB_FSDEV_PMA_SIZE 2048u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32G4)\n  // Device controller\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define CFG_TUSB_FSDEV_PMA_SIZE 1024u\n\n  // TypeC controller\n  #define TUP_USBIP_TYPEC_STM32\n  #define TUP_TYPEC_RHPORTS_NUM 1\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32H5)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define TUP_USBIP_FSDEV_DRD\n  #define CFG_TUSB_FSDEV_PMA_SIZE 2048u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32H7)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_STM32\n\n  #define TUP_DCD_ENDPOINT_MAX 9\n\n  #ifndef CORE_CM4\n    // Enable dcache if DMA is enabled\n    #define CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUD_DWC2_DMA_ENABLE\n    #define CFG_TUH_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUH_DWC2_DMA_ENABLE\n    #define CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT 32\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32H7RS, OPT_MCU_STM32N6)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_STM32\n\n  // FS has 6, HS has 9\n  #define TUP_DCD_ENDPOINT_MAX                  9\n\n  // MCU with on-chip HS Phy\n  #define TUP_RHPORT_HIGHSPEED                  1\n\n  // Enable dcache if DMA is enabled\n  #define CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUD_DWC2_DMA_ENABLE\n  #define CFG_TUH_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUH_DWC2_DMA_ENABLE\n  #define CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT 32\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32L0)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define CFG_TUSB_FSDEV_PMA_SIZE 1024u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32L1)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define CFG_TUSB_FSDEV_PMA_SIZE 512u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32L4)\n  // - L4x2, L4x3 use fsdev\n  // - L4x4, L4x6, L4x7, L4x9 use dwc2\n  #if defined(STM32L475xx) || defined(STM32L476xx) || defined(STM32L485xx) || defined(STM32L486xx) || \\\n    defined(STM32L496xx) || defined(STM32L4A6xx) || defined(STM32L4P5xx) || defined(STM32L4Q5xx) ||   \\\n    defined(STM32L4R5xx) || defined(STM32L4R7xx) || defined(STM32L4R9xx) || defined(STM32L4S5xx) ||   \\\n    defined(STM32L4S7xx) || defined(STM32L4S9xx)\n    #define TUP_USBIP_DWC2\n    #define TUP_USBIP_DWC2_STM32\n\n    #define TUP_DCD_ENDPOINT_MAX 6\n  #elif defined(STM32L412xx) || defined(STM32L422xx) || defined(STM32L432xx) || defined(STM32L433xx) || \\\n    defined(STM32L442xx) || defined(STM32L443xx) || defined(STM32L452xx) || defined(STM32L462xx)\n    #define TUP_USBIP_FSDEV\n    #define TUP_USBIP_FSDEV_STM32\n    #define CFG_TUSB_FSDEV_PMA_SIZE 1024u\n  #else\n    #error \"Unsupported STM32L4 mcu\"\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32L5)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define CFG_TUSB_FSDEV_PMA_SIZE (1024u)\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32U0)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define CFG_TUSB_FSDEV_PMA_SIZE 1024u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32U3)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define TUP_USBIP_FSDEV_DRD\n  #define CFG_TUSB_FSDEV_PMA_SIZE 2048u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32U5)\n  // U535/545 use fsdev\n  #if defined(STM32U535xx) || defined(STM32U545xx)\n    #define TUP_USBIP_FSDEV\n    #define TUP_USBIP_FSDEV_STM32\n    #define TUP_USBIP_FSDEV_DRD\n    #define CFG_TUSB_FSDEV_PMA_SIZE 2048u\n  #else\n    #define TUP_USBIP_DWC2\n    #define TUP_USBIP_DWC2_STM32\n\n    // U59x/5Ax/5Fx/5Gx are highspeed with built-in HS PHY\n    #if defined(STM32U595xx) || defined(STM32U599xx) || defined(STM32U5A5xx) || defined(STM32U5A9xx) || \\\n      defined(STM32U5F7xx) || defined(STM32U5F9xx) || defined(STM32U5G7xx) || defined(STM32U5G9xx)\n      #define TUP_DCD_ENDPOINT_MAX 9\n      #define TUP_RHPORT_HIGHSPEED 1\n    #else\n      #define TUP_DCD_ENDPOINT_MAX 6\n    #endif\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32WB)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_STM32\n  #define CFG_TUSB_FSDEV_PMA_SIZE 1024u\n\n#elif TU_CHECK_MCU(OPT_MCU_STM32WBA)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_STM32\n  #define TUP_DCD_ENDPOINT_MAX 9\n  #define TUP_RHPORT_HIGHSPEED 1\n\n//--------------------------------------------------------------------+\n// Sony\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_CXD56)\n  #define TUP_DCD_ENDPOINT_MAX 7\n  #define TUP_RHPORT_HIGHSPEED 1\n  #define TUD_ENDPOINT_ONE_DIRECTION_ONLY\n\n//--------------------------------------------------------------------+\n// TI\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_MSP430x5xx)\n  #define TUP_DCD_ENDPOINT_MAX 8\n\n#elif TU_CHECK_MCU(OPT_MCU_MSP432E4, OPT_MCU_TM4C123, OPT_MCU_TM4C129)\n  #define TUP_USBIP_MUSB\n  #define TUP_USBIP_MUSB_TI\n  #define TUP_DCD_ENDPOINT_MAX 8\n\n//--------------------------------------------------------------------+\n// ValentyUSB (Litex)\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_VALENTYUSB_EPTRI)\n  #define TUP_DCD_ENDPOINT_MAX 16\n\n//--------------------------------------------------------------------+\n// Nuvoton\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_NUC121, OPT_MCU_NUC126)\n  #define TUP_DCD_ENDPOINT_MAX 8\n\n#elif TU_CHECK_MCU(OPT_MCU_NUC120)\n  #define TUP_DCD_ENDPOINT_MAX 6\n\n#elif TU_CHECK_MCU(OPT_MCU_NUC505)\n  #define TUP_DCD_ENDPOINT_MAX 12\n  #define TUP_RHPORT_HIGHSPEED 1\n\n//--------------------------------------------------------------------+\n// Espressif\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_ESP32\n  #define TUP_DCD_ENDPOINT_MAX         7 // only 5 TX FIFO for endpoint IN\n\n  // clang-format off\n  #define CFG_TUSB_OS_INC_PATH_DEFAULT freertos/\n  // clang-format on\n\n  #if CFG_TUSB_MCU == OPT_MCU_ESP32S3\n    #define TUP_MCU_MULTIPLE_CORE 1\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_ESP32P4)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_ESP32\n  #define TUP_RHPORT_HIGHSPEED                  1  // port0 FS, port1 HS\n  #define TUP_DCD_ENDPOINT_MAX                  16 // FS 7 ep, HS 16 ep\n\n  // clang-format off\n  #define CFG_TUSB_OS_INC_PATH_DEFAULT          freertos/\n  // clang-format on\n\n  #define TUP_MCU_MULTIPLE_CORE                 1\n\n  // Enable dcache if DMA is enabled\n  #define CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUD_DWC2_DMA_ENABLE\n  #define CFG_TUH_MEM_DCACHE_ENABLE_DEFAULT     CFG_TUH_DWC2_DMA_ENABLE\n  #define CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT 64\n\n#elif TU_CHECK_MCU(OPT_MCU_ESP32, OPT_MCU_ESP32C2, OPT_MCU_ESP32C3, OPT_MCU_ESP32C5, OPT_MCU_ESP32C6, \\\n                   OPT_MCU_ESP32C61, OPT_MCU_ESP32H2)\n  #if (CFG_TUD_ENABLED || !(defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421))\n    #error \"MCUs are only supported with CFG_TUH_MAX3421 enabled\"\n  #endif\n\n  #define TUP_DCD_ENDPOINT_MAX         0\n\n  // clang-format off\n  #define CFG_TUSB_OS_INC_PATH_DEFAULT freertos/\n  // clang-format on\n\n\n//--------------------------------------------------------------------+\n// Dialog\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_DA1469X)\n  #define TUP_DCD_ENDPOINT_MAX 4\n  #define TUP_DCD_EDPT_CLOSE_API\n\n//--------------------------------------------------------------------+\n// Raspberry Pi\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_RP2040)\n  #define TUP_DCD_ENDPOINT_MAX  16\n  #define TUP_MCU_MULTIPLE_CORE 1\n\n  #define TU_ATTR_FAST_FUNC     __not_in_flash(\"tinyusb\")\n\n//--------------------------------------------------------------------+\n// Silabs\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_EFM32GG)\n  #define TUP_USBIP_DWC2\n  #define TUP_DCD_ENDPOINT_MAX 7\n\n//--------------------------------------------------------------------+\n// Renesas\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_RX63X, OPT_MCU_RX65X, OPT_MCU_RX72N, OPT_MCU_RAXXX)\n  #define TUP_USBIP_RUSB2\n  #define TUP_DCD_ENDPOINT_MAX 10\n\n//--------------------------------------------------------------------+\n// GigaDevice\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_GD32VF103)\n  #define TUP_USBIP_DWC2\n  #define TUP_DCD_ENDPOINT_MAX 4\n\n//--------------------------------------------------------------------+\n// Broadcom\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_BCM2711, OPT_MCU_BCM2835, OPT_MCU_BCM2837)\n  #define TUP_USBIP_DWC2\n  #define TUP_DCD_ENDPOINT_MAX 8\n  #define TUP_RHPORT_HIGHSPEED 1\n\n//--------------------------------------------------------------------+\n// Infineon\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_XMC4000)\n  #define TUP_USBIP_DWC2\n  #define TUP_DCD_ENDPOINT_MAX 8\n\n//--------------------------------------------------------------------+\n// BridgeTek\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_FT90X)\n  #define TUP_DCD_ENDPOINT_MAX 8\n  #define TUP_RHPORT_HIGHSPEED 1\n  #define TUD_ENDPOINT_ONE_DIRECTION_ONLY\n\n#elif TU_CHECK_MCU(OPT_MCU_FT93X)\n  #define TUP_DCD_ENDPOINT_MAX 16\n  #define TUP_RHPORT_HIGHSPEED 1\n  #define TUD_ENDPOINT_ONE_DIRECTION_ONLY\n\n//--------------------------------------------------------------------+\n// Allwinner\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_F1C100S)\n  #define TUP_DCD_ENDPOINT_MAX 4\n  #define TUP_DCD_EDPT_CLOSE_API\n\n//--------------------------------------------------------------------+\n// WCH\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_CH32F20X)\n  #define TUP_USBIP_WCH_USBHS\n  #define TUP_USBIP_WCH_USBFS\n\n  #if !defined(CFG_TUD_WCH_USBIP_USBFS)\n    #define CFG_TUD_WCH_USBIP_USBFS 0\n  #endif\n\n  #if !defined(CFG_TUD_WCH_USBIP_USBHS)\n    #define CFG_TUD_WCH_USBIP_USBHS (CFG_TUD_WCH_USBIP_USBFS ? 0 : 1)\n  #endif\n\n  #define TUP_RHPORT_HIGHSPEED CFG_TUD_WCH_USBIP_USBHS\n  #define TUP_DCD_ENDPOINT_MAX (CFG_TUD_WCH_USBIP_USBHS ? 16 : 8)\n\n  #if CFG_TUD_WCH_USBIP_USBHS\n    #define TUP_DCD_EDPT_CLOSE_API\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_CH32V103)\n  #define TUP_USBIP_WCH_USBFS\n\n  #if !defined(CFG_TUD_WCH_USBIP_USBFS)\n    #define CFG_TUD_WCH_USBIP_USBFS 1\n  #endif\n\n  #define TUP_DCD_ENDPOINT_MAX 8\n\n#elif TU_CHECK_MCU(OPT_MCU_CH32V20X)\n  // v20x support both port0 FSDEV (USBD) and port1 USBFS\n  #define TUP_USBIP_WCH_USBFS\n\n  #ifndef CFG_TUH_WCH_USBIP_USBFS\n    #define CFG_TUH_WCH_USBIP_USBFS 1\n  #endif\n\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_CH32\n  #define CFG_TUSB_FSDEV_PMA_SIZE 512u\n\n  // default to FSDEV for device\n  #if !defined(CFG_TUD_WCH_USBIP_USBFS)\n    #define CFG_TUD_WCH_USBIP_USBFS 0\n  #endif\n\n  #if !defined(CFG_TUD_WCH_USBIP_FSDEV)\n    #define CFG_TUD_WCH_USBIP_FSDEV (CFG_TUD_WCH_USBIP_USBFS ? 0 : 1)\n  #endif\n\n  #define TUP_DCD_ENDPOINT_MAX 8\n\n#elif TU_CHECK_MCU(OPT_MCU_CH32V307)\n  // v307 support both FS and HS, default to HS\n  #define TUP_USBIP_WCH_USBHS\n  #define TUP_USBIP_WCH_USBFS\n\n  #if !defined(CFG_TUD_WCH_USBIP_USBFS)\n    #define CFG_TUD_WCH_USBIP_USBFS 0\n  #endif\n\n  #if !defined(CFG_TUD_WCH_USBIP_USBHS)\n    #define CFG_TUD_WCH_USBIP_USBHS (CFG_TUD_WCH_USBIP_USBFS ? 0 : 1)\n  #endif\n\n  #define TUP_RHPORT_HIGHSPEED CFG_TUD_WCH_USBIP_USBHS\n  #define TUP_DCD_ENDPOINT_MAX (CFG_TUD_WCH_USBIP_USBHS ? 16 : 8)\n\n  #if CFG_TUD_WCH_USBIP_USBHS\n    #define TUP_DCD_EDPT_CLOSE_API\n  #endif\n\n//--------------------------------------------------------------------+\n// Analog Devices\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_MAX32650, OPT_MCU_MAX32666, OPT_MCU_MAX32690, OPT_MCU_MAX78002)\n  #define TUP_USBIP_MUSB\n  #define TUP_USBIP_MUSB_ADI\n  #define TUP_DCD_ENDPOINT_MAX 12\n  #define TUP_RHPORT_HIGHSPEED 1\n  #define TUD_ENDPOINT_ONE_DIRECTION_ONLY\n\n//--------------------------------------------------------------------+\n// ArteryTek\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_AT32F403A_407, OPT_MCU_AT32F413)\n  #define TUP_USBIP_FSDEV\n  #define TUP_USBIP_FSDEV_AT32\n  #define CFG_TUSB_FSDEV_PMA_SIZE 512u\n\n#elif TU_CHECK_MCU(OPT_MCU_AT32F415)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_AT32\n  #define TUP_DCD_ENDPOINT_MAX 4\n\n#elif TU_CHECK_MCU(OPT_MCU_AT32F402_405, OPT_MCU_AT32F423, OPT_MCU_AT32F425, OPT_MCU_AT32F435_437, OPT_MCU_AT32F45X)\n  #define TUP_USBIP_DWC2\n  #define TUP_USBIP_DWC2_AT32\n  #define TUP_DCD_ENDPOINT_MAX 8\n\n  // AT32F405xx has on-chip HS PHY\n  #if defined(AT32F405CBT7) || defined(AT32F405CBU7) || defined(AT32F405CCT7) || defined(AT32F405CCU7) ||     \\\n    defined(AT32F405KBU7_4) || defined(AT32F405KCU7_4) || defined(AT32F405RBT7_7) || defined(AT32F405RBT7) || \\\n    defined(AT32F405RCT7_7) || defined(AT32F405RCT7)\n    #define TUP_RHPORT_HIGHSPEED 1 // Port0: FS, Port1: HS\n  #endif\n\n//--------------------------------------------------------------------+\n// HPMicro\n//--------------------------------------------------------------------+\n#elif TU_CHECK_MCU(OPT_MCU_HPM)\n  #define TUP_USBIP_CHIPIDEA_HS\n  #define TUP_USBIP_EHCI\n\n  #define TUP_DCD_ENDPOINT_MAX    16\n  #define TUP_RHPORT_HIGHSPEED    1\n\n  #define TU_ATTR_FAST_FUNC __attribute__((section(\".fast\")))\n\n#endif\n\n// External USB controller\n#if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\n  #ifndef CFG_TUH_MAX3421_ENDPOINT_TOTAL\n    #define CFG_TUH_MAX3421_ENDPOINT_TOTAL (8 + 4 * (CFG_TUH_DEVICE_MAX - 1))\n  #endif\n#endif\n\n\n//--------------------------------------------------------------------+\n// Default Values\n//--------------------------------------------------------------------+\n\n#if defined(TUP_USBIP_FSDEV)\n  #define TUP_DCD_ENDPOINT_MAX 8\n#endif\n\n#ifndef TUP_MCU_MULTIPLE_CORE\n  #define TUP_MCU_MULTIPLE_CORE 0\n#endif\n\n#if !defined(TUP_DCD_ENDPOINT_MAX) && defined(CFG_TUD_ENABLED) && CFG_TUD_ENABLED\n  #warning \"TUP_DCD_ENDPOINT_MAX is not defined for this MCU, default to 8\"\n  #define TUP_DCD_ENDPOINT_MAX 8\n#endif\n\n// Default to fullspeed if not defined\n#ifndef TUP_RHPORT_HIGHSPEED\n  #define TUP_RHPORT_HIGHSPEED 0\n#endif\n\n// fast function, normally mean placing function in SRAM\n#ifndef TU_ATTR_FAST_FUNC\n  #define TU_ATTR_FAST_FUNC\n#endif\n\n#if defined(TUP_USBIP_IP3511) || defined(TUP_USBIP_RUSB2)\n  #define TUP_DCD_EDPT_CLOSE_API\n#endif\n\n// USBIP implement dcd_edpt_close() and does not support ISO alloc & activate API\n#ifndef TUP_DCD_EDPT_CLOSE_API\n  #define TUP_DCD_EDPT_ISO_ALLOC\n#endif\n"
  },
  {
    "path": "src/common/tusb_private.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_PRIVATE_H\n#define TUSB_PRIVATE_H\n\n// Internal Helper used by Host and Device Stack\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\ntypedef void (*tusb_defer_func_t)(uintptr_t param);\n\n //--------------------------------------------------------------------+\n // Configuration\n //--------------------------------------------------------------------+\n\n#define TUP_USBIP_CONTROLLER_NUM 2\nextern tusb_role_t _tusb_rhport_role[TUP_USBIP_CONTROLLER_NUM];\n\n//--------------------------------------------------------------------+\n// Endpoint\n//--------------------------------------------------------------------+\n\nenum {\n TU_EDPT_STATE_BUSY    = 0x01,\n TU_EDPT_STATE_STALLED = 0x02,\n TU_EDPT_STATE_CLAIMED = 0x04,\n};\n\ntypedef struct TU_ATTR_PACKED {\n  volatile uint8_t busy    : 1;\n  volatile uint8_t stalled : 1;\n  volatile uint8_t claimed : 1;\n} tu_edpt_state_t;\n\ntypedef struct {\n  uint8_t  hwid;    // device: rhport, host: daddr\n  bool     is_host; // 1: host, 0: device\n  uint8_t ep_addr;\n  // 1 byte padding\n\n  uint16_t mps;\n  uint16_t xfer_len;\n  uint8_t  *ep_buf; // set to NULL to use xfer_fifo when CFG_TUD_EDPT_DEDICATED_HWFIFO = 1\n  tu_fifo_t ff;\n\n  // mutex: read if rx, otherwise write\n  OSAL_MUTEX_DEF(ff_mutexdef);\n}tu_edpt_stream_t;\n\n//--------------------------------------------------------------------+\n// Endpoint\n//--------------------------------------------------------------------+\n\n// Check if endpoint descriptor is valid per USB specs if debug is enabled\n#if CFG_TUSB_DEBUG\nbool tu_edpt_validate(const tusb_desc_endpoint_t *desc_ep, tusb_speed_t speed);\n#else\nTU_ATTR_ALWAYS_INLINE static inline bool tu_edpt_validate(const tusb_desc_endpoint_t *desc_ep, tusb_speed_t speed) {\n  (void)speed;\n  return tu_edpt_packet_size(desc_ep) > 0;\n}\n#endif\n\n// Bind drivers to all interfaces and endpoints in the provided configuration descriptor\nbool tu_bind_driver_to_ep_itf(uint8_t driver_id, uint8_t ep2drv[][2], uint8_t itf2drv[], uint8_t itf_max,\n                              const uint8_t *p_desc, uint16_t desc_len);\n\n// Claim an endpoint with provided mutex\nbool tu_edpt_claim(tu_edpt_state_t* ep_state, osal_mutex_t mutex);\n\n// Release an endpoint with provided mutex\nbool tu_edpt_release(tu_edpt_state_t* ep_state, osal_mutex_t mutex);\n\n//--------------------------------------------------------------------+\n// Endpoint Stream\n//--------------------------------------------------------------------+\n\n// Init an endpoint stream\nbool tu_edpt_stream_init(tu_edpt_stream_t *s, bool is_host, bool is_tx, bool overwritable, void *ff_buf,\n                         uint16_t ff_bufsize, uint8_t *ep_buf);\n\n// Deinit an endpoint stream\nTU_ATTR_ALWAYS_INLINE static inline void tu_edpt_stream_deinit(tu_edpt_stream_t *s) {\n  (void)s;\n#if OSAL_MUTEX_REQUIRED\n  if (s->ff.mutex_wr) {\n    osal_mutex_delete(s->ff.mutex_wr);\n  }\n  if (s->ff.mutex_rd) {\n    osal_mutex_delete(s->ff.mutex_rd);\n  }\n#endif\n}\n\n// Open an endpoint stream\nTU_ATTR_ALWAYS_INLINE static inline void tu_edpt_stream_open(tu_edpt_stream_t *s, uint8_t hwid,\n                                                             const tusb_desc_endpoint_t *desc_ep, uint16_t xfer_len) {\n  s->hwid    = hwid;\n  s->ep_addr = desc_ep->bEndpointAddress;\n  s->mps = tu_edpt_packet_size(desc_ep);\n  s->xfer_len = xfer_len;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_edpt_stream_is_opened(const tu_edpt_stream_t *s) {\n  return s->ep_addr != 0;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_edpt_stream_close(tu_edpt_stream_t* s) {\n  s->ep_addr = 0;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void tu_edpt_stream_clear(tu_edpt_stream_t *s) {\n  tu_fifo_clear(&s->ff);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_edpt_stream_empty(tu_edpt_stream_t *s) {\n  return tu_fifo_empty(&s->ff);\n}\n\n//--------------------------------------------------------------------+\n// Stream Write\n//--------------------------------------------------------------------+\n\n// Write to stream\nuint32_t tu_edpt_stream_write(tu_edpt_stream_t *s, const void *buffer, uint32_t bufsize);\n\n// Start an usb transfer if endpoint is not busy. Return number of queued bytes\nuint32_t tu_edpt_stream_write_xfer(tu_edpt_stream_t *s);\n\n// Start an zero-length packet if needed\nbool tu_edpt_stream_write_zlp_if_needed(tu_edpt_stream_t *s, uint32_t last_xferred_bytes);\n\n// Get the number of bytes available for writing to FIFO\n// Note: if no fifo, return endpoint size if not busy, 0 otherwise\nuint32_t tu_edpt_stream_write_available(tu_edpt_stream_t *s);\n\n//--------------------------------------------------------------------+\n// Stream Read\n//--------------------------------------------------------------------+\n\n// Read from stream\nuint32_t tu_edpt_stream_read(tu_edpt_stream_t *s, void *buffer, uint32_t bufsize);\n\n// Start an usb transfer if endpoint is not busy\nuint32_t tu_edpt_stream_read_xfer(tu_edpt_stream_t *s);\n\n// Complete read transfer by writing EP -> FIFO. Must be called in the transfer complete callback\nTU_ATTR_ALWAYS_INLINE static inline\nvoid tu_edpt_stream_read_xfer_complete(tu_edpt_stream_t* s, uint32_t xferred_bytes) {\n  if (s->ep_buf != NULL) {\n    tu_fifo_write_n(&s->ff, s->ep_buf, (uint16_t)xferred_bytes);\n  }\n}\n\n// Complete read transfer with provided buffer\nTU_ATTR_ALWAYS_INLINE static inline\nvoid tu_edpt_stream_read_xfer_complete_with_buf(tu_edpt_stream_t *s, const void *buf, uint32_t xferred_bytes) {\n  tu_fifo_write_n(&s->ff, buf, (uint16_t)xferred_bytes);\n}\n\n// Get the number of bytes available for reading\nTU_ATTR_ALWAYS_INLINE static inline uint32_t tu_edpt_stream_read_available(const tu_edpt_stream_t *s) {\n  return (uint32_t) tu_fifo_count(&s->ff);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool tu_edpt_stream_peek(tu_edpt_stream_t *s, uint8_t *ch) {\n  return tu_fifo_peek(&s->ff, ch);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/common/tusb_types.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_TYPES_H_\n#define TUSB_TYPES_H_\n\n#include <stdbool.h>\n#include <stdint.h>\n#include \"tusb_compiler.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//------------- Device DCache declaration -------------//\n#define TUD_EPBUF_DCACHE_SIZE(_size) (CFG_TUD_MEM_DCACHE_ENABLE ? \\\n  (TU_DIV_CEIL(_size, CFG_TUD_MEM_DCACHE_LINE_SIZE) * CFG_TUD_MEM_DCACHE_LINE_SIZE) : (_size))\n\n// Declare an endpoint buffer with uint8_t[size]\n#define TUD_EPBUF_DEF(_name, _size) \\\n  union { \\\n    CFG_TUD_MEM_ALIGN uint8_t _name[_size]; \\\n    TU_ATTR_ALIGNED(CFG_TUD_MEM_DCACHE_ENABLE ? CFG_TUD_MEM_DCACHE_LINE_SIZE : 1) uint8_t _name##_dcache_padding[TUD_EPBUF_DCACHE_SIZE(_size)]; \\\n  }\n\n// Declare an endpoint buffer with a type\n#define TUD_EPBUF_TYPE_DEF(_type, _name) \\\n  union { \\\n    CFG_TUD_MEM_ALIGN _type _name; \\\n    TU_ATTR_ALIGNED(CFG_TUD_MEM_DCACHE_ENABLE ? CFG_TUD_MEM_DCACHE_LINE_SIZE : 1) uint8_t _name##_dcache_padding[TUD_EPBUF_DCACHE_SIZE(sizeof(_type))]; \\\n  }\n\n//------------- Host DCache declaration -------------//\n#define TUH_EPBUF_DCACHE_SIZE(_size) (CFG_TUH_MEM_DCACHE_ENABLE ? \\\n  (TU_DIV_CEIL(_size, CFG_TUH_MEM_DCACHE_LINE_SIZE) * CFG_TUH_MEM_DCACHE_LINE_SIZE) : (_size))\n\n// Declare an endpoint buffer with uint8_t[size]\n#define TUH_EPBUF_DEF(_name, _size) \\\n  union { \\\n    CFG_TUH_MEM_ALIGN uint8_t _name[_size]; \\\n    TU_ATTR_ALIGNED(CFG_TUH_MEM_DCACHE_ENABLE ? CFG_TUH_MEM_DCACHE_LINE_SIZE : 1) uint8_t _name##_dcache_padding[TUH_EPBUF_DCACHE_SIZE(_size)]; \\\n  }\n\n// Declare an endpoint buffer with a type\n#define TUH_EPBUF_TYPE_DEF(_type, _name) \\\n  union { \\\n    CFG_TUH_MEM_ALIGN _type _name; \\\n    TU_ATTR_ALIGNED(CFG_TUH_MEM_DCACHE_ENABLE ? CFG_TUH_MEM_DCACHE_LINE_SIZE : 1) uint8_t _name##_dcache_padding[TUH_EPBUF_DCACHE_SIZE(sizeof(_type))]; \\\n  }\n\n\n/*------------------------------------------------------------------*/\n/* CONSTANTS\n *------------------------------------------------------------------*/\n\ntypedef enum {\n  TUSB_ROLE_INVALID = 0u,\n  TUSB_ROLE_DEVICE  = 0x1,\n  TUSB_ROLE_HOST    = 0x2,\n} tusb_role_t;\n\n/// defined base on EHCI specs value for Endpoint Speed\ntypedef enum {\n  TUSB_SPEED_FULL = 0,\n  TUSB_SPEED_LOW  = 1,\n  TUSB_SPEED_HIGH = 2,\n  TUSB_SPEED_AUTO = 0xaa,\n  TUSB_SPEED_INVALID = 0xff,\n} tusb_speed_t;\n\n/// defined base on USB Specs Endpoint's bmAttributes\ntypedef enum {\n  TUSB_XFER_CONTROL     = 0,\n  TUSB_XFER_ISOCHRONOUS = 1,\n  TUSB_XFER_BULK        = 2,\n  TUSB_XFER_INTERRUPT   = 3\n} tusb_xfer_type_t;\n\ntypedef enum {\n  TUSB_DIR_OUT = 0,\n  TUSB_DIR_IN  = 1,\n\n  TUSB_EPNUM_MASK = 0x0F,\n  TUSB_DIR_IN_MASK = 0x80\n} tusb_dir_t;\n\nenum {\n  TUSB_EPSIZE_BULK_FS = 64,\n  TUSB_EPSIZE_BULK_HS = 512,\n\n  TUSB_EPSIZE_ISO_FS_MAX = 1023,\n  TUSB_EPSIZE_ISO_HS_MAX = 1024,\n};\n\n// Endpoint Bulk size depending on host/device max speed\n#define TUD_EPSIZE_BULK_MAX   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define TUH_EPSIZE_BULK_MAX   (TUH_OPT_HIGH_SPEED ? 512 : 64)\n\n/// Isochronous Endpoint Attributes\ntypedef enum {\n  TUSB_ISO_EP_ATT_NO_SYNC         = 0x00,\n  TUSB_ISO_EP_ATT_ASYNCHRONOUS    = 0x04,\n  TUSB_ISO_EP_ATT_ADAPTIVE        = 0x08,\n  TUSB_ISO_EP_ATT_SYNCHRONOUS     = 0x0C,\n  TUSB_ISO_EP_ATT_DATA            = 0x00, ///< Data End Point\n  TUSB_ISO_EP_ATT_EXPLICIT_FB     = 0x10, ///< Feedback End Point\n  TUSB_ISO_EP_ATT_IMPLICIT_FB     = 0x20, ///< Data endpoint that also serves as an implicit feedback\n} tusb_iso_ep_attribute_t;\n\n/// USB Descriptor Types\ntypedef enum {\n  TUSB_DESC_DEVICE                = 0x01,\n  TUSB_DESC_CONFIGURATION         = 0x02,\n  TUSB_DESC_STRING                = 0x03,\n  TUSB_DESC_INTERFACE             = 0x04,\n  TUSB_DESC_ENDPOINT              = 0x05,\n  TUSB_DESC_DEVICE_QUALIFIER      = 0x06,\n  TUSB_DESC_OTHER_SPEED_CONFIG    = 0x07,\n  TUSB_DESC_INTERFACE_POWER       = 0x08,\n  TUSB_DESC_OTG                   = 0x09,\n  TUSB_DESC_DEBUG                 = 0x0A,\n  TUSB_DESC_INTERFACE_ASSOCIATION = 0x0B,\n\n  TUSB_DESC_BOS                   = 0x0F,\n  TUSB_DESC_DEVICE_CAPABILITY     = 0x10,\n\n  TUSB_DESC_FUNCTIONAL            = 0x21,\n\n  // Class Specific Descriptor\n  TUSB_DESC_CS_DEVICE             = 0x21,\n  TUSB_DESC_CS_CONFIGURATION      = 0x22,\n  TUSB_DESC_CS_STRING             = 0x23,\n  TUSB_DESC_CS_INTERFACE          = 0x24,\n  TUSB_DESC_CS_ENDPOINT           = 0x25,\n\n  TUSB_DESC_SUPERSPEED_ENDPOINT_COMPANION     = 0x30,\n  TUSB_DESC_SUPERSPEED_ISO_ENDPOINT_COMPANION = 0x31\n} tusb_desc_type_t;\n\ntypedef enum {\n  TUSB_REQ_GET_STATUS        = 0  ,\n  TUSB_REQ_CLEAR_FEATURE     = 1  ,\n  TUSB_REQ_RESERVED          = 2  ,\n  TUSB_REQ_SET_FEATURE       = 3  ,\n  TUSB_REQ_RESERVED2         = 4  ,\n  TUSB_REQ_SET_ADDRESS       = 5  ,\n  TUSB_REQ_GET_DESCRIPTOR    = 6  ,\n  TUSB_REQ_SET_DESCRIPTOR    = 7  ,\n  TUSB_REQ_GET_CONFIGURATION = 8  ,\n  TUSB_REQ_SET_CONFIGURATION = 9  ,\n  TUSB_REQ_GET_INTERFACE     = 10 ,\n  TUSB_REQ_SET_INTERFACE     = 11 ,\n  TUSB_REQ_SYNCH_FRAME       = 12\n} tusb_request_code_t;\n\ntypedef enum {\n  TUSB_REQ_FEATURE_EDPT_HALT     = 0,\n  TUSB_REQ_FEATURE_REMOTE_WAKEUP = 1,\n  TUSB_REQ_FEATURE_TEST_MODE     = 2\n} tusb_request_feature_selector_t;\n\ntypedef enum {\n  TUSB_REQ_TYPE_STANDARD = 0u,\n  TUSB_REQ_TYPE_CLASS,\n  TUSB_REQ_TYPE_VENDOR,\n  TUSB_REQ_TYPE_INVALID\n} tusb_request_type_t;\n\ntypedef enum {\n  TUSB_REQ_RCPT_DEVICE =0,\n  TUSB_REQ_RCPT_INTERFACE,\n  TUSB_REQ_RCPT_ENDPOINT,\n  TUSB_REQ_RCPT_OTHER\n} tusb_request_recipient_t;\n\n// https://www.usb.org/defined-class-codes\ntypedef enum {\n  TUSB_CLASS_UNSPECIFIED          = 0    ,\n  TUSB_CLASS_AUDIO                = 1    ,\n  TUSB_CLASS_CDC                  = 2    ,\n  TUSB_CLASS_HID                  = 3    ,\n  TUSB_CLASS_RESERVED_4           = 4    ,\n  TUSB_CLASS_PHYSICAL             = 5    ,\n  TUSB_CLASS_IMAGE                = 6    ,\n  TUSB_CLASS_PRINTER              = 7    ,\n  TUSB_CLASS_MSC                  = 8    ,\n  TUSB_CLASS_HUB                  = 9    ,\n  TUSB_CLASS_CDC_DATA             = 10   ,\n  TUSB_CLASS_SMART_CARD           = 11   ,\n  TUSB_CLASS_RESERVED_12          = 12   ,\n  TUSB_CLASS_CONTENT_SECURITY     = 13   ,\n  TUSB_CLASS_VIDEO                = 14   ,\n  TUSB_CLASS_PERSONAL_HEALTHCARE  = 15   ,\n  TUSB_CLASS_AUDIO_VIDEO          = 16   ,\n\n  TUSB_CLASS_DIAGNOSTIC           = 0xDC ,\n  TUSB_CLASS_WIRELESS_CONTROLLER  = 0xE0 ,\n  TUSB_CLASS_MISC                 = 0xEF ,\n  TUSB_CLASS_APPLICATION_SPECIFIC = 0xFE ,\n  TUSB_CLASS_VENDOR_SPECIFIC      = 0xFF\n} tusb_class_code_t;\n\ntypedef enum\n{\n  MISC_SUBCLASS_COMMON = 2\n}misc_subclass_type_t;\n\ntypedef enum {\n  MISC_PROTOCOL_IAD = 1\n} misc_protocol_type_t;\n\ntypedef enum {\n  APP_SUBCLASS_USBTMC = 0x03,\n  APP_SUBCLASS_DFU_RUNTIME = 0x01\n} app_subclass_type_t;\n\ntypedef enum {\n  DEVICE_CAPABILITY_WIRELESS_USB               = 0x01,\n  DEVICE_CAPABILITY_USB20_EXTENSION            = 0x02,\n  DEVICE_CAPABILITY_SUPERSPEED_USB             = 0x03,\n  DEVICE_CAPABILITY_CONTAINER_id               = 0x04,\n  DEVICE_CAPABILITY_PLATFORM                   = 0x05,\n  DEVICE_CAPABILITY_POWER_DELIVERY             = 0x06,\n  DEVICE_CAPABILITY_BATTERY_INFO               = 0x07,\n  DEVICE_CAPABILITY_PD_CONSUMER_PORT           = 0x08,\n  DEVICE_CAPABILITY_PD_PROVIDER_PORT           = 0x09,\n  DEVICE_CAPABILITY_SUPERSPEED_PLUS            = 0x0A,\n  DEVICE_CAPABILITY_PRECESION_TIME_MEASUREMENT = 0x0B,\n  DEVICE_CAPABILITY_WIRELESS_USB_EXT           = 0x0C,\n  DEVICE_CAPABILITY_BILLBOARD                  = 0x0D,\n  DEVICE_CAPABILITY_AUTHENTICATION             = 0x0E,\n  DEVICE_CAPABILITY_BILLBOARD_EX               = 0x0F,\n  DEVICE_CAPABILITY_CONFIGURATION_SUMMARY      = 0x10\n} device_capability_type_t;\n\nenum {\n  TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP = 1 << 5,\n  TUSB_DESC_CONFIG_ATT_SELF_POWERED  = 1 << 6,\n};\n\n#define TUSB_DESC_CONFIG_POWER_MA(x)  ((x)/2)\n\n// USB 2.0 Spec Table 9-7: Test Mode Selectors\ntypedef enum {\n  TUSB_FEATURE_TEST_J = 1,\n  TUSB_FEATURE_TEST_K = 2,\n  TUSB_FEATURE_TEST_SE0_NAK = 3,\n  TUSB_FEATURE_TEST_PACKET = 4,\n  TUSB_FEATURE_TEST_FORCE_ENABLE = 5,\n} tusb_feature_test_mode_t;\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\ntypedef enum {\n  XFER_RESULT_SUCCESS = 0,\n  XFER_RESULT_FAILED,\n  XFER_RESULT_STALLED,\n  XFER_RESULT_TIMEOUT,\n  XFER_RESULT_INVALID\n} xfer_result_t;\n\n#define tusb_xfer_result_t xfer_result_t\n\n// TODO remove\nenum {\n  DESC_OFFSET_LEN  = 0,\n  DESC_OFFSET_TYPE = 1,\n  DESC_OFFSET_SUBTYPE = 2\n};\n\nenum {\n  INTERFACE_INVALID_NUMBER = 0xff\n};\n\ntypedef enum {\n  MS_OS_20_SET_HEADER_DESCRIPTOR       = 0x00,\n  MS_OS_20_SUBSET_HEADER_CONFIGURATION = 0x01,\n  MS_OS_20_SUBSET_HEADER_FUNCTION      = 0x02,\n  MS_OS_20_FEATURE_COMPATBLE_ID        = 0x03,\n  MS_OS_20_FEATURE_REG_PROPERTY        = 0x04,\n  MS_OS_20_FEATURE_MIN_RESUME_TIME     = 0x05,\n  MS_OS_20_FEATURE_MODEL_ID            = 0x06,\n  MS_OS_20_FEATURE_CCGP_DEVICE         = 0x07,\n  MS_OS_20_FEATURE_VENDOR_REVISION     = 0x08\n} microsoft_os_20_type_t;\n\nenum {\n  CONTROL_STAGE_IDLE = 0,\n  CONTROL_STAGE_SETUP, // 1\n  CONTROL_STAGE_DATA,  // 2\n  CONTROL_STAGE_ACK    // 3\n};\n\nenum {\n  TUSB_INDEX_INVALID_8 = 0xFF\n};\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\ntypedef struct {\n  tusb_role_t role;\n  tusb_speed_t speed;\n} tusb_rhport_init_t;\n\ntypedef struct {\n  uint16_t len;\n  uint8_t *buffer;\n} tusb_buffer_t;\n\n//--------------------------------------------------------------------+\n// USB Descriptors\n//--------------------------------------------------------------------+\n\n// Start of all packed definitions for compiler without per-type packed\nTU_ATTR_PACKED_BEGIN\nTU_ATTR_BIT_FIELD_ORDER_BEGIN\n\n/// USB Device Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength            ; ///< Size of this descriptor in bytes.\n  uint8_t  bDescriptorType    ; ///< DEVICE Descriptor Type.\n  uint16_t bcdUSB             ; ///< BUSB Specification Release Number in Binary-Coded Decimal (i.e., 2.10 is 210H).\n  uint8_t  bDeviceClass       ; ///< Class code (assigned by the USB-IF).\n  uint8_t  bDeviceSubClass    ; ///< Subclass code (assigned by the USB-IF).\n  uint8_t  bDeviceProtocol    ; ///< Protocol code (assigned by the USB-IF).\n  uint8_t  bMaxPacketSize0    ; ///< Maximum packet size for endpoint zero (only 8, 16, 32, or 64 are valid). For HS devices is fixed to 64.\n  uint16_t idVendor           ; ///< Vendor ID (assigned by the USB-IF).\n  uint16_t idProduct          ; ///< Product ID (assigned by the manufacturer).\n  uint16_t bcdDevice          ; ///< Device release number in binary-coded decimal.\n  uint8_t  iManufacturer      ; ///< Index of string descriptor describing manufacturer.\n  uint8_t  iProduct           ; ///< Index of string descriptor describing product.\n  uint8_t  iSerialNumber      ; ///< Index of string descriptor describing the device's serial number.\n  uint8_t  bNumConfigurations ; ///< Number of possible configurations.\n} tusb_desc_device_t;\n\nTU_VERIFY_STATIC( sizeof(tusb_desc_device_t) == 18u, \"size is not correct\");\n\n// USB Binary Device Object Store (BOS) Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength         ; ///< Size of this descriptor in bytes\n  uint8_t  bDescriptorType ; ///< CONFIGURATION Descriptor Type\n  uint16_t wTotalLength    ; ///< Total length of data returned for this descriptor\n  uint8_t  bNumDeviceCaps  ; ///< Number of device capability descriptors in the BOS\n} tusb_desc_bos_t;\n\nTU_VERIFY_STATIC( sizeof(tusb_desc_bos_t) == 5u, \"size is not correct\");\n\n/// USB Configuration Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength             ; ///< Size of this descriptor in bytes\n  uint8_t  bDescriptorType     ; ///< CONFIGURATION Descriptor Type\n  uint16_t wTotalLength        ; ///< Total length of data returned for this configuration. Includes the combined length of all descriptors (configuration, interface, endpoint, and class- or vendor-specific) returned for this configuration.\n\n  uint8_t  bNumInterfaces      ; ///< Number of interfaces supported by this configuration\n  uint8_t  bConfigurationValue ; ///< Value to use as an argument to the SetConfiguration() request to select this configuration.\n  uint8_t  iConfiguration      ; ///< Index of string descriptor describing this configuration\n  uint8_t  bmAttributes        ; ///< Configuration characteristics \\n D7: Reserved (set to one)\\n D6: Self-powered \\n D5: Remote Wakeup \\n D4...0: Reserved (reset to zero) \\n D7 is reserved and must be set to one for historical reasons. \\n A device configuration that uses power from the bus and a local source reports a non-zero value in bMaxPower to indicate the amount of bus power required and sets D6. The actual power source at runtime may be determined using the GetStatus(DEVICE) request (see USB 2.0 spec Section 9.4.5). \\n If a device configuration supports remote wakeup, D5 is set to one.\n  uint8_t  bMaxPower           ; ///< Maximum power consumption of the USB device from the bus in this specific configuration when the device is fully operational. Expressed in 2 mA units (i.e., 50 = 100 mA).\n} tusb_desc_configuration_t;\n\nTU_VERIFY_STATIC( sizeof(tusb_desc_configuration_t) == 9u, \"size is not correct\");\n\n/// USB Interface Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength            ; ///< Size of this descriptor in bytes\n  uint8_t  bDescriptorType    ; ///< INTERFACE Descriptor Type\n\n  uint8_t  bInterfaceNumber   ; ///< Number of this interface. Zero-based value identifying the index in the array of concurrent interfaces supported by this configuration.\n  uint8_t  bAlternateSetting  ; ///< Value used to select this alternate setting for the interface identified in the prior field\n  uint8_t  bNumEndpoints      ; ///< Number of endpoints used by this interface (excluding endpoint zero). If this value is zero, this interface only uses the Default Control Pipe.\n  uint8_t  bInterfaceClass    ; ///< Class code (assigned by the USB-IF). \\li A value of zero is reserved for future standardization. \\li If this field is set to FFH, the interface class is vendor-specific. \\li All other values are reserved for assignment by the USB-IF.\n  uint8_t  bInterfaceSubClass ; ///< Subclass code (assigned by the USB-IF). \\n These codes are qualified by the value of the bInterfaceClass field. \\li If the bInterfaceClass field is reset to zero, this field must also be reset to zero. \\li If the bInterfaceClass field is not set to FFH, all values are reserved for assignment by the USB-IF.\n  uint8_t  bInterfaceProtocol ; ///< Protocol code (assigned by the USB). \\n These codes are qualified by the value of the bInterfaceClass and the bInterfaceSubClass fields. If an interface supports class-specific requests, this code identifies the protocols that the device uses as defined by the specification of the device class. \\li If this field is reset to zero, the device does not use a class-specific protocol on this interface. \\li If this field is set to FFH, the device uses a vendor-specific protocol for this interface.\n  uint8_t  iInterface         ; ///< Index of string descriptor describing this interface\n} tusb_desc_interface_t;\n\nTU_VERIFY_STATIC( sizeof(tusb_desc_interface_t) == 9u, \"size is not correct\");\n\n/// USB Endpoint Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength          ; // Size of this descriptor in bytes\n  uint8_t  bDescriptorType  ; // ENDPOINT Descriptor Type\n\n  uint8_t  bEndpointAddress ; // The address of the endpoint\n\n  struct TU_ATTR_PACKED {\n    uint8_t xfer  : 2;        // Control, ISO, Bulk, Interrupt\n    uint8_t sync  : 2;        // None, Asynchronous, Adaptive, Synchronous\n    uint8_t usage : 2;        // Data, Feedback, Implicit feedback\n    uint8_t       : 2;\n  } bmAttributes;\n\n  uint16_t wMaxPacketSize   ; // Bit 10..0 : max packet size, bit 12..11 additional transaction per highspeed micro-frame\n  uint8_t  bInterval        ; // Polling interval, in frames or microframes depending on the operating speed\n} tusb_desc_endpoint_t;\n\nTU_VERIFY_STATIC( sizeof(tusb_desc_endpoint_t) == 7u, \"size is not correct\");\n\n/// USB Other Speed Configuration Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength             ; ///< Size of descriptor\n  uint8_t  bDescriptorType     ; ///< Other_speed_Configuration Type\n  uint16_t wTotalLength        ; ///< Total length of data returned\n\n  uint8_t  bNumInterfaces      ; ///< Number of interfaces supported by this speed configuration\n  uint8_t  bConfigurationValue ; ///< Value to use to select configuration\n  uint8_t  iConfiguration      ; ///< Index of string descriptor\n  uint8_t  bmAttributes        ; ///< Same as Configuration descriptor\n  uint8_t  bMaxPower           ; ///< Same as Configuration descriptor\n} tusb_desc_other_speed_t;\n\n/// USB Device Qualifier Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength            ; ///< Size of descriptor\n  uint8_t  bDescriptorType    ; ///< Device Qualifier Type\n  uint16_t bcdUSB             ; ///< USB specification version number (e.g., 0200H for V2.00)\n\n  uint8_t  bDeviceClass       ; ///< Class Code\n  uint8_t  bDeviceSubClass    ; ///< SubClass Code\n  uint8_t  bDeviceProtocol    ; ///< Protocol Code\n\n  uint8_t  bMaxPacketSize0    ; ///< Maximum packet size for other speed\n  uint8_t  bNumConfigurations ; ///< Number of Other-speed Configurations\n  uint8_t  bReserved          ; ///< Reserved for future use, must be zero\n} tusb_desc_device_qualifier_t;\n\nTU_VERIFY_STATIC( sizeof(tusb_desc_device_qualifier_t) == 10u, \"size is not correct\");\n\n/// USB Interface Association Descriptor (IAD ECN)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength           ; ///< Size of descriptor\n  uint8_t bDescriptorType   ; ///< Other_speed_Configuration Type\n\n  uint8_t bFirstInterface   ; ///< Index of the first associated interface.\n  uint8_t bInterfaceCount   ; ///< Total number of associated interfaces.\n\n  uint8_t bFunctionClass    ; ///< Interface class ID.\n  uint8_t bFunctionSubClass ; ///< Interface subclass ID.\n  uint8_t bFunctionProtocol ; ///< Interface protocol ID.\n\n  uint8_t iFunction         ; ///< Index of the string descriptor describing the interface association.\n} tusb_desc_interface_assoc_t;\n\nTU_VERIFY_STATIC( sizeof(tusb_desc_interface_assoc_t) == 8u, \"size is not correct\");\n\n// USB String Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength         ; ///< Size of this descriptor in bytes\n  uint8_t  bDescriptorType ; ///< Descriptor Type\n  uint16_t utf16le[];\n} tusb_desc_string_t;\n\n// USB Binary Device Object Store (BOS)\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;\n  uint8_t bDescriptorType ;\n  uint8_t bDevCapabilityType;\n  uint8_t bReserved;\n  uint8_t PlatformCapabilityUUID[16];\n  uint8_t CapabilityData[];\n} tusb_desc_bos_platform_t;\n\n// USB WebUSB URL Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t bLength;\n  uint8_t bDescriptorType;\n  uint8_t bScheme;\n  char    url[];\n} tusb_desc_webusb_url_t;\n\n// DFU Functional Descriptor\ntypedef struct TU_ATTR_PACKED {\n  uint8_t  bLength;\n  uint8_t  bDescriptorType;\n\n  union {\n    struct TU_ATTR_PACKED {\n      uint8_t bitCanDnload             : 1;\n      uint8_t bitCanUpload             : 1;\n      uint8_t bitManifestationTolerant : 1;\n      uint8_t bitWillDetach            : 1;\n      uint8_t reserved                 : 4;\n    } bmAttributes;\n\n    uint8_t bAttributes;\n  };\n\n  uint16_t wDetachTimeOut;\n  uint16_t wTransferSize;\n  uint16_t bcdDFUVersion;\n} tusb_desc_dfu_functional_t;\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\ntypedef struct TU_ATTR_PACKED {\n  union {\n    struct TU_ATTR_PACKED {\n      uint8_t recipient :  5; ///< Recipient type tusb_request_recipient_t.\n      uint8_t type      :  2; ///< Request type tusb_request_type_t.\n      uint8_t direction :  1; ///< Direction type. tusb_dir_t\n    } bmRequestType_bit;\n\n    uint8_t bmRequestType;\n  };\n\n  uint8_t  bRequest;\n  uint16_t wValue;\n  uint16_t wIndex;\n  uint16_t wLength;\n} tusb_control_request_t;\n\nTU_VERIFY_STATIC( sizeof(tusb_control_request_t) == 8u, \"size is not correct\");\n\nTU_ATTR_PACKED_END  // End of all packed definitions\nTU_ATTR_BIT_FIELD_ORDER_END\n\n//--------------------------------------------------------------------+\n// Endpoint helper\n//--------------------------------------------------------------------+\n\n// Get direction from Endpoint address\nTU_ATTR_ALWAYS_INLINE static inline tusb_dir_t tu_edpt_dir(uint8_t addr) {\n  return (addr & TUSB_DIR_IN_MASK) ? TUSB_DIR_IN : TUSB_DIR_OUT;\n}\n\n// Get Endpoint number from address\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_edpt_number(uint8_t addr) {\n  return (uint8_t) (addr & TUSB_EPNUM_MASK);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t tu_edpt_addr(uint8_t num, uint8_t dir) {\n  return (uint8_t) (num | (dir == (uint8_t)TUSB_DIR_IN ? (uint8_t)TUSB_DIR_IN_MASK : 0u));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t tu_edpt_packet_size(tusb_desc_endpoint_t const* desc_ep) {\n  return tu_le16toh(desc_ep->wMaxPacketSize) & 0x7FF;\n}\n\n#if CFG_TUSB_DEBUG\nTU_ATTR_ALWAYS_INLINE static inline const char *tu_edpt_type_str(tusb_xfer_type_t t) {\n  tu_static const char *str[] = {\"control\", \"isochronous\", \"bulk\", \"interrupt\"};\n  return str[t];\n}\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif // TUSB_TYPES_H_\n"
  },
  {
    "path": "src/common/tusb_verify.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_VERIFY_H_\n#define TUSB_VERIFY_H_\n\n#include <stdbool.h>\n#include <stdint.h>\n#include \"tusb_option.h\"\n#include \"tusb_compiler.h\"\n\n/*------------------------------------------------------------------*/\n/* This file use an advanced macro technique to mimic the default parameter\n * as C++ for the sake of code simplicity. Beware of a headache macro\n * manipulation that you are told to stay away.\n *\n * This contains macros for both VERIFY and ASSERT:\n *\n *   VERIFY: Used when there is an error condition which is not the\n *           fault of the MCU. For example, bounds checking on data\n *           sent to the micro over USB should use this function.\n *           Another example is checking for buffer overflows, where\n *           returning from the active function causes a NAK.\n *\n *   ASSERT: Used for error conditions that are caused by MCU firmware\n *           bugs. This is used to discover bugs in the code more\n *           quickly. One example would be adding assertions in library\n *           function calls to confirm a function's (untainted)\n *           parameters are valid.\n *\n * The difference in behavior is that ASSERT triggers a breakpoint while\n * verify does not.\n *\n *   #define TU_VERIFY(cond)                  if (!cond) return false;\n *   #define TU_VERIFY(cond,ret)              if (!cond) return ret;\n *\n *   #define TU_ASSERT(cond)                  if (!cond) {TU_MESS_FAILED(); TU_BREAKPOINT(), return false;}\n *   #define TU_ASSERT(cond,ret)              if (!cond) {TU_MESS_FAILED(); TU_BREAKPOINT(), return ret;}\n *------------------------------------------------------------------*/\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// TU_VERIFY Helper\n//--------------------------------------------------------------------+\n#if CFG_TUSB_DEBUG\n  #define TU_MESS_FAILED()    TU_LOG1(\"%s %d: ASSERT FAILED\\r\\n\", __func__, __LINE__)\n#else\n  #define TU_MESS_FAILED() do {} while (0)\n#endif\n\n// Custom defined application function\n#ifdef CFG_TUSB_DEBUG_BREAKPOINT\n  extern void CFG_TUSB_DEBUG_BREAKPOINT(void);\n  #define TU_BREAKPOINT() CFG_TUSB_DEBUG_BREAKPOINT()\n\n// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7, M33. M55\n#elif defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8_1M_MAIN__) || \\\n    defined(__ARM7M__) || defined (__ARM7EM__) || defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)\n  #define TU_BREAKPOINT() do {                                                                              \\\n    volatile uint32_t* ARM_CM_DHCSR =  ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \\\n    if (0u != ((*ARM_CM_DHCSR) & 1UL)) { __asm(\"BKPT #0\\n\"); } /* Only halt mcu if debugger is attached */   \\\n  } while(0)\n\n#elif defined(__riscv) && !defined(ESP_PLATFORM)\n  #define TU_BREAKPOINT() do { __asm(\"ebreak\\n\"); } while(0)\n\n#elif defined(_mips)\n  #define TU_BREAKPOINT() do { __asm(\"sdbbp 0\"); } while (0)\n\n#else\n  #define TU_BREAKPOINT() do {} while (0)\n#endif\n\n/*------------------------------------------------------------------*/\n/* TU_VERIFY\n * - TU_VERIFY_1ARGS : return false if failed\n * - TU_VERIFY_2ARGS : return provided value if failed\n *------------------------------------------------------------------*/\n#define TU_VERIFY_DEFINE(_cond, _ret) \\\n  do {                                \\\n    if (!(_cond)) {                   \\\n      return _ret;                    \\\n    }                                 \\\n  } while (0)\n\n#define TU_VERIFY_1ARGS(_cond)         TU_VERIFY_DEFINE(_cond, false)\n#define TU_VERIFY_2ARGS(_cond, _ret)   TU_VERIFY_DEFINE(_cond, _ret)\n\n#define TU_VERIFY(...)                 TU_GET_3RD_ARG(__VA_ARGS__, TU_VERIFY_2ARGS, TU_VERIFY_1ARGS, _dummy)(__VA_ARGS__)\n\n/*------------------------------------------------------------------*/\n/* ASSERT\n * basically TU_VERIFY with TU_BREAKPOINT() as handler\n * - 1 arg : return false if failed\n * - 2 arg : return error if failed\n *------------------------------------------------------------------*/\n#define TU_ASSERT_DEFINE(_cond, _ret)                                 \\\n  do {                                                                \\\n    if ( !(_cond) ) { TU_MESS_FAILED(); TU_BREAKPOINT(); return _ret; } \\\n  } while(0)\n\n#define TU_ASSERT_1ARGS(_cond)         TU_ASSERT_DEFINE(_cond, false)\n#define TU_ASSERT_2ARGS(_cond, _ret)   TU_ASSERT_DEFINE(_cond, _ret)\n\n#ifndef TU_ASSERT\n#define TU_ASSERT(...)                 TU_GET_3RD_ARG(__VA_ARGS__, TU_ASSERT_2ARGS, TU_ASSERT_1ARGS, _dummy)(__VA_ARGS__)\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/device/dcd.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DCD_H_\n#define TUSB_DCD_H_\n\n#include \"common/tusb_common.h\"\n#include \"osal/osal.h\"\n#include \"common/tusb_fifo.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\ntypedef enum {\n  DCD_EVENT_INVALID = 0,    // 0\n  DCD_EVENT_BUS_RESET,      // 1\n  DCD_EVENT_UNPLUGGED,      // 2\n  DCD_EVENT_SOF,            // 3\n  DCD_EVENT_SUSPEND,        // 4 TODO LPM Sleep L1 support\n  DCD_EVENT_RESUME,         // 5\n  DCD_EVENT_SETUP_RECEIVED, // 6\n  DCD_EVENT_XFER_COMPLETE,  // 7\n  USBD_EVENT_FUNC_CALL,     // 8 Not an DCD event, just a convenient way to defer ISR function\n  DCD_EVENT_COUNT\n} dcd_eventid_t;\n\ntypedef struct TU_ATTR_ALIGNED(4) {\n  uint8_t rhport;\n  uint8_t event_id;\n\n  union {\n    // BUS RESET\n    struct {\n      tusb_speed_t speed;\n    } bus_reset;\n\n    // SOF\n    struct {\n      uint32_t frame_count;\n    }sof;\n\n    // SETUP_RECEIVED\n    tusb_control_request_t setup_received;\n\n    // XFER_COMPLETE\n    struct {\n      uint8_t  ep_addr;\n      uint8_t  result;\n      uint32_t len;\n    }xfer_complete;\n\n    // FUNC_CALL\n    struct {\n      void (*func) (void* param);\n      void* param;\n    }func_call;\n  };\n} dcd_event_t;\n\n//TU_VERIFY_STATIC(sizeof(dcd_event_t) <= 12, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// Memory API\n//--------------------------------------------------------------------+\n\n// clean/flush data cache: write cache -> memory.\n// Required before an DMA TX transfer to make sure data is in memory\nbool dcd_dcache_clean(const void* addr, uint32_t data_size);\n\n// invalidate data cache: mark cache as invalid, next read will read from memory\n// Required BOTH before and after an DMA RX transfer\nbool dcd_dcache_invalidate(const void* addr, uint32_t data_size);\n\n// clean and invalidate data cache\n// Required before an DMA transfer where memory is both read/write by DMA\nbool dcd_dcache_clean_invalidate(const void* addr, uint32_t data_size);\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n// optional dcd configuration, called by tud_configure()\nbool dcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param);\n\n// Initialize controller to device mode\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init);\n\n// Deinitialize controller, unset device mode.\nbool dcd_deinit(uint8_t rhport);\n\n// Interrupt Handler\nvoid dcd_int_handler(uint8_t rhport);\n\n// Enable device interrupt\nvoid dcd_int_enable (uint8_t rhport);\n\n// Disable device interrupt\nvoid dcd_int_disable(uint8_t rhport);\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr);\n\n// Wake up host\nvoid dcd_remote_wakeup(uint8_t rhport);\n\n// Connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport);\n\n// Disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport);\n\n// Enable/Disable Start-of-frame interrupt. Default is disabled\nvoid dcd_sof_enable(uint8_t rhport, bool en);\n\n#if CFG_TUD_TEST_MODE\n// Put device into a test mode (needs power cycle to quit)\nvoid dcd_enter_test_mode(uint8_t rhport, tusb_feature_test_mode_t test_selector);\n#endif\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n// Invoked when a control transfer's status stage is complete.\n// May help DCD to prepare for next control transfer, this API is optional.\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request);\n\n// Configure endpoint's registers according to descriptor\nbool dcd_edpt_open            (uint8_t rhport, tusb_desc_endpoint_t const * desc_ep);\n\n// Close all non-control endpoints, cancel all pending transfers if any.\n// Invoked when switching from a non-zero Configuration by SET_CONFIGURE therefore\n// required for multiple configuration support.\nvoid dcd_edpt_close_all       (uint8_t rhport);\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack\nbool dcd_edpt_xfer            (uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr);\n\n// Submit an transfer using fifo, When complete dcd_event_xfer_complete() is invoked to notify the stack\n// This API is optional, may be useful for register-based for transferring data.\nbool dcd_edpt_xfer_fifo       (uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr);\n\n// Stall endpoint, any queuing transfer should be removed from endpoint\nvoid dcd_edpt_stall           (uint8_t rhport, uint8_t ep_addr);\n\n// clear stall, data toggle is also reset to DATA0\n// This API never calls with control endpoints, since it is auto cleared when receiving setup packet\nvoid dcd_edpt_clear_stall     (uint8_t rhport, uint8_t ep_addr);\n\n#ifdef TUP_DCD_EDPT_CLOSE_API\n// Close an endpoint.\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr);\n\n#else\n\n// Allocate packet buffer used by ISO endpoints\n// Some MCU need manual packet buffer allocation, we allocate the largest size to avoid clustering\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size);\n\n// Configure and enable an ISO endpoint according to descriptor\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep);\n\n#endif\n\n//--------------------------------------------------------------------+\n// Event API (implemented by stack)\n//--------------------------------------------------------------------+\n\n// Called by DCD to notify device stack\nextern void dcd_event_handler(dcd_event_t const * event, bool in_isr);\n\n// helper to send bus signal event\nTU_ATTR_ALWAYS_INLINE static inline void dcd_event_bus_signal (uint8_t rhport, dcd_eventid_t eid, bool in_isr) {\n  dcd_event_t event;\n  event.rhport = rhport;\n  event.event_id = eid;\n  dcd_event_handler(&event, in_isr);\n}\n\n// helper to send bus reset event\nTU_ATTR_ALWAYS_INLINE static inline  void dcd_event_bus_reset (uint8_t rhport, tusb_speed_t speed, bool in_isr) {\n  dcd_event_t event;\n  event.rhport = rhport;\n  event.event_id = DCD_EVENT_BUS_RESET;\n  event.bus_reset.speed = speed;\n  dcd_event_handler(&event, in_isr);\n}\n\n// helper to send setup received\nTU_ATTR_ALWAYS_INLINE static inline void dcd_event_setup_received(uint8_t rhport, uint8_t const * setup, bool in_isr) {\n  dcd_event_t event;\n  event.rhport = rhport;\n  event.event_id = DCD_EVENT_SETUP_RECEIVED;\n  (void) memcpy(&event.setup_received, setup, sizeof(tusb_control_request_t));\n  dcd_event_handler(&event, in_isr);\n}\n\n// helper to send transfer complete event\nTU_ATTR_ALWAYS_INLINE static inline void dcd_event_xfer_complete (uint8_t rhport, uint8_t ep_addr, uint32_t xferred_bytes, uint8_t result, bool in_isr) {\n  dcd_event_t event;\n  event.rhport = rhport;\n  event.event_id = DCD_EVENT_XFER_COMPLETE;\n  event.xfer_complete.ep_addr = ep_addr;\n  event.xfer_complete.len     = xferred_bytes;\n  event.xfer_complete.result  = result;\n  dcd_event_handler(&event, in_isr);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dcd_event_sof(uint8_t rhport, uint32_t frame_count, bool in_isr) {\n  dcd_event_t event;\n  event.rhport = rhport;\n  event.event_id = DCD_EVENT_SOF;\n  event.sof.frame_count = frame_count;\n  dcd_event_handler(&event, in_isr);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/device/usbd.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED\n\n#include \"device/dcd.h\"\n#include \"tusb.h\"\n#include \"common/tusb_private.h\"\n\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n\n//--------------------------------------------------------------------+\n// USBD Configuration\n//--------------------------------------------------------------------+\n#ifndef CFG_TUD_TASK_QUEUE_SZ\n  #define CFG_TUD_TASK_QUEUE_SZ   16\n#endif\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void tud_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr) {\n  (void) rhport; (void) eventid; (void) in_isr;\n}\n\nTU_ATTR_WEAK void tud_sof_cb(uint32_t frame_count) {\n  (void) frame_count;\n}\n\nTU_ATTR_WEAK uint8_t const* tud_descriptor_bos_cb(void) {\n  return NULL;\n}\n\nTU_ATTR_WEAK uint8_t const* tud_descriptor_device_qualifier_cb(void) {\n  return NULL;\n}\n\nTU_ATTR_WEAK uint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void) index;\n  return NULL;\n}\n\nTU_ATTR_WEAK void tud_mount_cb(void) {\n}\n\nTU_ATTR_WEAK void tud_umount_cb(void) {\n}\n\nTU_ATTR_WEAK void tud_suspend_cb(bool remote_wakeup_en) {\n  (void) remote_wakeup_en;\n}\n\nTU_ATTR_WEAK void tud_resume_cb(void) {\n}\n\nTU_ATTR_WEAK bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const* request) {\n  (void) rhport; (void) stage; (void) request;\n  return false;\n}\n\nTU_ATTR_WEAK bool dcd_deinit(uint8_t rhport) {\n  (void) rhport;\n  return false;\n}\n\nTU_ATTR_WEAK void dcd_connect(uint8_t rhport) {\n  (void) rhport;\n}\n\nTU_ATTR_WEAK void dcd_disconnect(uint8_t rhport) {\n  (void) rhport;\n}\n\nTU_ATTR_WEAK bool dcd_dcache_clean(const void* addr, uint32_t data_size) {\n  (void) addr; (void) data_size;\n  return true;\n}\n\nTU_ATTR_WEAK bool dcd_dcache_invalidate(const void* addr, uint32_t data_size) {\n  (void) addr; (void) data_size;\n  return true;\n}\n\nTU_ATTR_WEAK bool dcd_dcache_clean_invalidate(const void* addr, uint32_t data_size) {\n  (void) addr; (void) data_size;\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Device Data\n//--------------------------------------------------------------------+\ntypedef struct {\n  // Note: these may share an enum state\n  volatile uint8_t connected;\n  volatile uint8_t addressed;\n  volatile uint8_t suspended;\n\n  union {\n    struct TU_ATTR_PACKED {\n      uint8_t self_powered     : 1; // configuration descriptor's attribute;\n      uint8_t remote_wakeup_en : 1; // enable/disable by host\n    };\n    uint8_t dev_state_bm;\n  };\n\n  uint8_t          cfg_num; // current active configuration (0x00 is not configured)\n  uint8_t          speed;\n  volatile uint8_t sof_consumer;\n\n  uint8_t itf2drv[CFG_TUD_INTERFACE_MAX];   // map interface number to driver (0xff is invalid)\n  uint8_t ep2drv[CFG_TUD_ENDPPOINT_MAX][2]; // map endpoint to driver ( 0xff is invalid ), can use only 4-bit each\n\n  tu_edpt_state_t ep_status[CFG_TUD_ENDPPOINT_MAX][2];\n} usbd_device_t;\n\nstatic usbd_device_t    _usbd_dev;\nstatic volatile uint8_t _usbd_queued_setup;\n\n//--------------------------------------------------------------------+\n// Class Driver\n//--------------------------------------------------------------------+\n  #if CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\n    #define DRIVER_NAME(_name) _name\n  #else\n    #define DRIVER_NAME(_name) NULL\n  #endif\n\n// Built-in class drivers\nstatic const usbd_class_driver_t _usbd_driver[] = {\n  #if CFG_TUD_CDC\n    {\n        .name             = DRIVER_NAME(\"CDC\"),\n        .init             = cdcd_init,\n        .deinit           = cdcd_deinit,\n        .reset            = cdcd_reset,\n        .open             = cdcd_open,\n        .control_xfer_cb  = cdcd_control_xfer_cb,\n        .xfer_cb          = cdcd_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_MSC\n    {\n        .name             = DRIVER_NAME(\"MSC\"),\n        .init             = mscd_init,\n        .deinit           = NULL,\n        .reset            = mscd_reset,\n        .open             = mscd_open,\n        .control_xfer_cb  = mscd_control_xfer_cb,\n        .xfer_cb          = mscd_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_HID\n    {\n        .name             = DRIVER_NAME(\"HID\"),\n        .init             = hidd_init,\n        .deinit           = hidd_deinit,\n        .reset            = hidd_reset,\n        .open             = hidd_open,\n        .control_xfer_cb  = hidd_control_xfer_cb,\n        .xfer_cb          = hidd_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_AUDIO\n    {\n        .name             = DRIVER_NAME(\"AUDIO\"),\n        .init             = audiod_init,\n        .deinit           = audiod_deinit,\n        .reset            = audiod_reset,\n        .open             = audiod_open,\n        .control_xfer_cb  = audiod_control_xfer_cb,\n        .xfer_cb          = audiod_xfer_cb,\n        .xfer_isr         = audiod_xfer_isr,\n        .sof              = audiod_sof_isr\n    },\n    #endif\n\n    #if CFG_TUD_VIDEO\n    {\n        .name             = DRIVER_NAME(\"VIDEO\"),\n        .init             = videod_init,\n        .deinit           = videod_deinit,\n        .reset            = videod_reset,\n        .open             = videod_open,\n        .control_xfer_cb  = videod_control_xfer_cb,\n        .xfer_cb          = videod_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_MIDI\n    {\n        .name             = DRIVER_NAME(\"MIDI\"),\n        .init             = midid_init,\n        .deinit           = midid_deinit,\n        .open             = midid_open,\n        .reset            = midid_reset,\n        .control_xfer_cb  = midid_control_xfer_cb,\n        .xfer_cb          = midid_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_VENDOR\n    {\n        .name             = DRIVER_NAME(\"VENDOR\"),\n        .init             = vendord_init,\n        .deinit           = vendord_deinit,\n        .reset            = vendord_reset,\n        .open             = vendord_open,\n        .control_xfer_cb  = tud_vendor_control_xfer_cb,\n        .xfer_cb          = vendord_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_USBTMC\n    {\n        .name             = DRIVER_NAME(\"TMC\"),\n        .init             = usbtmcd_init_cb,\n        .deinit           = usbtmcd_deinit,\n        .reset            = usbtmcd_reset_cb,\n        .open             = usbtmcd_open_cb,\n        .control_xfer_cb  = usbtmcd_control_xfer_cb,\n        .xfer_cb          = usbtmcd_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_DFU_RUNTIME\n    {\n        .name             = DRIVER_NAME(\"DFU-RUNTIME\"),\n        .init             = dfu_rtd_init,\n        .deinit           = dfu_rtd_deinit,\n        .reset            = dfu_rtd_reset,\n        .open             = dfu_rtd_open,\n        .control_xfer_cb  = dfu_rtd_control_xfer_cb,\n        .xfer_cb          = NULL,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_DFU\n    {\n        .name             = DRIVER_NAME(\"DFU\"),\n        .init             = dfu_moded_init,\n        .deinit           = dfu_moded_deinit,\n        .reset            = dfu_moded_reset,\n        .open             = dfu_moded_open,\n        .control_xfer_cb  = dfu_moded_control_xfer_cb,\n        .xfer_cb          = NULL,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_ECM_RNDIS || CFG_TUD_NCM\n    {\n        .name             = DRIVER_NAME(\"NET\"),\n        .init             = netd_init,\n        .deinit           = netd_deinit,\n        .reset            = netd_reset,\n        .open             = netd_open,\n        .control_xfer_cb  = netd_control_xfer_cb,\n        .xfer_cb          = netd_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL,\n    },\n    #endif\n\n    #if CFG_TUD_BTH\n    {\n        .name             = DRIVER_NAME(\"BTH\"),\n        .init             = btd_init,\n        .deinit           = btd_deinit,\n        .reset            = btd_reset,\n        .open             = btd_open,\n        .control_xfer_cb  = btd_control_xfer_cb,\n        .xfer_cb          = btd_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_MTP\n    {\n        .name             = DRIVER_NAME(\"MTP\"),\n        .init             = mtpd_init,\n        .deinit           = mtpd_deinit,\n        .reset            = mtpd_reset,\n        .open             = mtpd_open,\n        .control_xfer_cb  = mtpd_control_xfer_cb,\n        .xfer_cb          = mtpd_xfer_cb,\n        .xfer_isr         = NULL,\n        .sof              = NULL\n    },\n    #endif\n\n    #if CFG_TUD_PRINTER\n    {\n        .name             = DRIVER_NAME(\"PRINTER\"),\n        .init             = printerd_init,\n        .deinit           = printerd_deinit,\n        .reset            = printerd_reset,\n        .open             = printerd_open,\n        .control_xfer_cb  = printerd_control_xfer_cb,\n        .xfer_cb          = printerd_xfer_cb,\n        .sof              = NULL\n    },\n    #endif\n};\n\nenum { BUILTIN_DRIVER_COUNT = TU_ARRAY_SIZE(_usbd_driver) };\n\n// Additional class drivers implemented by application\nstatic const usbd_class_driver_t *_app_driver       = NULL;\nstatic uint8_t                    _app_driver_count = 0;\n\n#define TOTAL_DRIVER_COUNT    ((uint8_t) (_app_driver_count + BUILTIN_DRIVER_COUNT))\n\n// virtually joins built-in and application drivers together.\n// Application is positioned first to allow overwriting built-in ones.\nTU_ATTR_ALWAYS_INLINE static inline usbd_class_driver_t const * get_driver(uint8_t drvid) {\n  usbd_class_driver_t const *driver = NULL;\n  if (drvid < _app_driver_count) {\n    // Application drivers\n    driver = &_app_driver[drvid];\n  } else{\n    drvid -= _app_driver_count;\n    if (drvid < BUILTIN_DRIVER_COUNT) {\n      driver = &_usbd_driver[drvid];\n    }\n  }\n\n  return driver;\n}\n\n//--------------------------------------------------------------------+\n// DCD Event\n//--------------------------------------------------------------------+\nenum {\n  RHPORT_INVALID = 0xFFu\n};\nstatic uint8_t _usbd_rhport = RHPORT_INVALID;\n\nstatic OSAL_SPINLOCK_DEF(_usbd_spin, usbd_int_set);\n\n// Event queue: usbd_int_set() is used as mutex in OS NONE config\nOSAL_QUEUE_DEF(usbd_int_set, _usbd_qdef, CFG_TUD_TASK_QUEUE_SZ, dcd_event_t);\nstatic osal_queue_t _usbd_q;\n\n// Mutex for claiming endpoint\n#if OSAL_MUTEX_REQUIRED\n  static osal_mutex_def_t _ubsd_mutexdef;\n  static osal_mutex_t _usbd_mutex;\n#else\n  #define _usbd_mutex   NULL\n#endif\n\nTU_ATTR_ALWAYS_INLINE static inline bool queue_event(dcd_event_t const * event, bool in_isr) {\n  TU_ASSERT(osal_queue_send(_usbd_q, event, in_isr));\n  tud_event_hook_cb(event->rhport, event->event_id, in_isr);\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Prototypes\n//--------------------------------------------------------------------+\nstatic bool process_control_request(uint8_t rhport, tusb_control_request_t const * p_request);\nstatic bool process_set_config(uint8_t rhport, uint8_t cfg_num);\nstatic bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const * p_request);\n\n#if CFG_TUD_TEST_MODE\nstatic bool process_test_mode_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request) {\n  TU_VERIFY(CONTROL_STAGE_ACK == stage);\n  uint8_t const selector = tu_u16_high(request->wIndex);\n  TU_LOG_USBD(\"    Enter Test Mode (test selector index: %d)\\r\\n\", selector);\n  dcd_enter_test_mode(rhport, (tusb_feature_test_mode_t) selector);\n  return true;\n}\n#endif\n\n// from usbd_control.c\nvoid usbd_control_reset(void);\nvoid usbd_control_set_request(tusb_control_request_t const *request);\nvoid usbd_control_set_complete_callback( usbd_control_xfer_cb_t fp );\nbool usbd_control_xfer_cb (uint8_t rhport, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK usbd_class_driver_t const* usbd_app_driver_get_cb(uint8_t* driver_count) {\n  *driver_count = 0;\n  return NULL;\n}\n\nTU_ATTR_WEAK bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr) {\n  (void) rhport; (void) ep_addr; (void) ff; (void) total_bytes; (void) is_isr;\n  return false;\n}\n\nTU_ATTR_WEAK bool dcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {\n  (void) rhport; (void) cfg_id; (void) cfg_param;\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// Debug\n//--------------------------------------------------------------------+\n#if CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\nstatic char const *const _usbd_event_str[DCD_EVENT_COUNT] = {\n    \"Invalid\",\n    \"Bus Reset\",\n    \"Unplugged\",\n    \"SOF\",\n    \"Suspend\",\n    \"Resume\",\n    \"Setup Received\",\n    \"Xfer Complete\",\n    \"Func Call\"\n};\n\n// for usbd_control to print the name of control complete driver\nvoid usbd_driver_print_control_complete_name(usbd_control_xfer_cb_t callback) {\n  for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++) {\n    usbd_class_driver_t const* driver = get_driver(i);\n    if (driver && driver->control_xfer_cb == callback) {\n      TU_LOG_USBD(\"%s control complete\\r\\n\", driver->name);\n      return;\n    }\n  }\n}\n\n#endif\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\ntusb_speed_t tud_speed_get(void) {\n  return (tusb_speed_t) _usbd_dev.speed;\n}\n\nbool tud_connected(void) {\n  return _usbd_dev.connected;\n}\n\nbool tud_mounted(void) {\n  return _usbd_dev.cfg_num ? true : false;\n}\n\nbool tud_suspended(void) {\n  return _usbd_dev.suspended;\n}\n\nbool tud_remote_wakeup(void) {\n  // only wake up host if this feature is enabled and we are suspended\n  TU_VERIFY(_usbd_dev.suspended && _usbd_dev.remote_wakeup_en);\n  dcd_remote_wakeup(_usbd_rhport);\n  return true;\n}\n\nbool tud_disconnect(void) {\n  dcd_disconnect(_usbd_rhport);\n  return true;\n}\n\nbool tud_connect(void) {\n  dcd_connect(_usbd_rhport);\n  return true;\n}\n\nvoid tud_sof_cb_enable(bool en) {\n  usbd_sof_enable(_usbd_rhport, SOF_CONSUMER_USER, en);\n}\n\nbool tud_inited(void) {\n  return _usbd_rhport != RHPORT_INVALID;\n}\n\nbool tud_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {\n  return dcd_configure(rhport, cfg_id, cfg_param);\n}\n\nbool tud_rhport_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  if (tud_inited()) {\n    return true; // skip if already initialized\n  }\n  TU_ASSERT(rh_init);\n #if CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\n  char const* speed_str = 0;\n  switch (rh_init->speed) {\n    case TUSB_SPEED_HIGH:\n      speed_str = \"High\";\n    break;\n    case TUSB_SPEED_FULL:\n      speed_str = \"Full\";\n    break;\n    case TUSB_SPEED_LOW:\n      speed_str = \"Low\";\n    break;\n    case TUSB_SPEED_AUTO:\n      speed_str = \"Auto\";\n    break;\n  default:\n    break;\n  }\n  TU_LOG_USBD(\"USBD init on controller %u, speed = %s\\r\\n\", rhport, speed_str);\n  TU_LOG_INT(CFG_TUD_LOG_LEVEL, sizeof(usbd_device_t));\n  TU_LOG_INT(CFG_TUD_LOG_LEVEL, sizeof(dcd_event_t));\n  TU_LOG_INT(CFG_TUD_LOG_LEVEL, sizeof(tu_fifo_t));\n  TU_LOG_INT(CFG_TUD_LOG_LEVEL, sizeof(tu_edpt_stream_t));\n#endif\n\n  tu_varclr(&_usbd_dev);\n  _usbd_queued_setup = 0;\n\n  osal_spin_init(&_usbd_spin);\n\n#if OSAL_MUTEX_REQUIRED\n  // Init device mutex\n  _usbd_mutex = osal_mutex_create(&_ubsd_mutexdef);\n  TU_ASSERT(_usbd_mutex);\n#endif\n\n  // Init device queue & task\n  _usbd_q = osal_queue_create(&_usbd_qdef);\n  TU_ASSERT(_usbd_q);\n\n  // Get application driver if available\n  _app_driver = usbd_app_driver_get_cb(&_app_driver_count);\n  TU_ASSERT(_app_driver_count + BUILTIN_DRIVER_COUNT <= UINT8_MAX);\n\n  // Init class drivers\n  for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++) {\n    usbd_class_driver_t const* driver = get_driver(i);\n    TU_ASSERT(driver && driver->init);\n    TU_LOG_USBD(\"%s init\\r\\n\", driver->name);\n    driver->init();\n  }\n\n  _usbd_rhport = rhport;\n\n  // Init device controller driver\n  TU_ASSERT(dcd_init(rhport, rh_init));\n  dcd_int_enable(rhport);\n\n  return true;\n}\n\nbool tud_deinit(uint8_t rhport) {\n  if (!tud_inited()) {\n    return true; // skip if not initialized\n  }\n\n  TU_LOG_USBD(\"USBD deinit on controller %u\\r\\n\", rhport);\n\n  const uint8_t cfg_num = _usbd_dev.cfg_num;\n\n  // Deinit device controller driver\n  dcd_int_disable(rhport);\n  dcd_disconnect(rhport);\n  TU_ASSERT(dcd_deinit(rhport));\n\n  // Deinit class drivers\n  for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++) {\n    usbd_class_driver_t const* driver = get_driver(i);\n    if(driver && driver->deinit) {\n      TU_LOG_USBD(\"%s deinit\\r\\n\", driver->name);\n      driver->deinit();\n    }\n  }\n\n  // Clear device data\n  tu_varclr(&_usbd_dev);\n  usbd_control_reset();\n\n  // Deinit device queue & task\n  osal_queue_delete(_usbd_q);\n  _usbd_q = NULL;\n\n#if OSAL_MUTEX_REQUIRED\n  // TODO make sure there is no task waiting on this mutex\n  osal_mutex_delete(_usbd_mutex);\n  _usbd_mutex = NULL;\n#endif\n\n  _usbd_rhport = RHPORT_INVALID;\n\n  if (cfg_num > 0) {\n    tud_umount_cb();\n  }\n\n  return true;\n}\n\nstatic void configuration_reset(uint8_t rhport) {\n  for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++) {\n    usbd_class_driver_t const* driver = get_driver(i);\n    TU_ASSERT(driver,);\n    driver->reset(rhport);\n  }\n\n  tu_varclr(&_usbd_dev);\n  (void)memset(_usbd_dev.itf2drv, TUSB_INDEX_INVALID_8, sizeof(_usbd_dev.itf2drv)); // invalid mapping\n  (void)memset(_usbd_dev.ep2drv, TUSB_INDEX_INVALID_8, sizeof(_usbd_dev.ep2drv));   // invalid mapping\n}\n\nstatic void usbd_reset(uint8_t rhport) {\n  configuration_reset(rhport);\n  usbd_control_reset();\n}\n\nbool tud_task_event_ready(void) {\n  TU_VERIFY(tud_inited()); // Skip if stack is not initialized\n  return !osal_queue_empty(_usbd_q);\n}\n\n//--------------------------------------------------------------------+\n// USBD Task\n//--------------------------------------------------------------------+\n/* USB Device Driver task\n * This top level thread manages all device controller event and delegates events to class-specific drivers.\n * This should be called periodically within the mainloop or rtos thread.\n *\n    int main(void) {\n      application_init();\n      tusb_init(0, TUSB_ROLE_DEVICE);\n\n      while(1) { // the mainloop\n        application_code();\n        tud_task(); // tinyusb device task\n      }\n    }\n */\nvoid tud_task_ext(uint32_t timeout_ms, bool in_isr) {\n  (void) in_isr; // not implemented yet\n\n  // Skip if stack is not initialized\n  if (!tud_inited()) {\n    return;\n  }\n\n  // Loop until there are no more events in the queue or CFG_TUD_TASK_EVENTS_PER_RUN is reached\n  for (unsigned epr = 0;; epr++) {\n#if CFG_TUD_TASK_EVENTS_PER_RUN > 0\n    if (epr >= CFG_TUD_TASK_EVENTS_PER_RUN) {\n      TU_LOG_USBD(\"USBD event limit (\" TU_XSTRING(CFG_TUD_TASK_EVENTS_PER_RUN) \") reached\\r\\n\");\n      break;\n    }\n#endif\n    dcd_event_t event;\n    if (!osal_queue_receive(_usbd_q, &event, timeout_ms)) {\n      return;\n    }\n\n#if CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\n    if (event.event_id == DCD_EVENT_SETUP_RECEIVED) {\n      TU_LOG_USBD(\"\\r\\n\"); // extra line for setup\n    }\n    TU_LOG_USBD(\"USBD %s \", event.event_id < DCD_EVENT_COUNT ? _usbd_event_str[event.event_id] : \"CORRUPTED\");\n#endif\n\n    switch (event.event_id) {\n      case DCD_EVENT_BUS_RESET:\n        TU_LOG_USBD(\": %s Speed\\r\\n\", tu_str_speed[event.bus_reset.speed]);\n        usbd_reset(event.rhport);\n        _usbd_dev.speed = event.bus_reset.speed;\n        break;\n\n      case DCD_EVENT_UNPLUGGED:\n        TU_LOG_USBD(\"\\r\\n\");\n        usbd_reset(event.rhport);\n        tud_umount_cb();\n        break;\n\n      case DCD_EVENT_SETUP_RECEIVED:\n        TU_ASSERT(_usbd_queued_setup > 0,);\n        _usbd_queued_setup--;\n        TU_LOG_BUF(CFG_TUD_LOG_LEVEL, &event.setup_received, 8);\n        if (_usbd_queued_setup != 0) {\n          TU_LOG_USBD(\"  Skipped since there is other SETUP in queue\\r\\n\");\n          break;\n        }\n\n        // Mark as connected after receiving 1st setup packet.\n        // But it is easier to set it every time instead of wasting time to check then set\n        _usbd_dev.connected = 1;\n\n        // mark both in & out control as free\n        _usbd_dev.ep_status[0][TUSB_DIR_OUT].busy = 0;\n        _usbd_dev.ep_status[0][TUSB_DIR_OUT].claimed = 0;\n        _usbd_dev.ep_status[0][TUSB_DIR_IN].busy = 0;\n        _usbd_dev.ep_status[0][TUSB_DIR_IN].claimed = 0;\n\n        // Process control request\n        if (!process_control_request(event.rhport, &event.setup_received)) {\n          TU_LOG_USBD(\"  Stall EP0\\r\\n\");\n          // Failed -> stall both control endpoint IN and OUT\n          dcd_edpt_stall(event.rhport, 0);\n          dcd_edpt_stall(event.rhport, 0 | TUSB_DIR_IN_MASK);\n        }\n        break;\n\n      case DCD_EVENT_XFER_COMPLETE: {\n        // Invoke the class callback associated with the endpoint address\n        uint8_t const ep_addr = event.xfer_complete.ep_addr;\n        uint8_t const epnum = tu_edpt_number(ep_addr);\n        uint8_t const ep_dir = tu_edpt_dir(ep_addr);\n\n        TU_LOG_USBD(\"on EP %02X with %u bytes\\r\\n\", ep_addr, (unsigned int) event.xfer_complete.len);\n\n        _usbd_dev.ep_status[epnum][ep_dir].busy = 0;\n        _usbd_dev.ep_status[epnum][ep_dir].claimed = 0;\n\n        if (0 == epnum) {\n          usbd_control_xfer_cb(event.rhport, ep_addr, (xfer_result_t) event.xfer_complete.result, event.xfer_complete.len);\n        } else {\n          usbd_class_driver_t const* driver = get_driver(_usbd_dev.ep2drv[epnum][ep_dir]);\n          TU_ASSERT(driver,);\n\n          TU_LOG_USBD(\"  %s xfer callback\\r\\n\", driver->name);\n          driver->xfer_cb(event.rhport, ep_addr, (xfer_result_t) event.xfer_complete.result, event.xfer_complete.len);\n        }\n        break;\n      }\n\n      case DCD_EVENT_SUSPEND:\n        // NOTE: When plugging/unplugging device, the D+/D- state are unstable and\n        // can accidentally meet the SUSPEND condition ( Bus Idle for 3ms ), which result in a series of event\n        // e.g suspend -> resume -> unplug/plug. Skip suspend/resume if not connected\n        if (_usbd_dev.connected) {\n          TU_LOG_USBD(\": Remote Wakeup = %u\\r\\n\", _usbd_dev.remote_wakeup_en);\n          tud_suspend_cb(_usbd_dev.remote_wakeup_en);\n        } else {\n          TU_LOG_USBD(\" Skipped\\r\\n\");\n        }\n        break;\n\n      case DCD_EVENT_RESUME:\n        if (_usbd_dev.connected) {\n          TU_LOG_USBD(\"\\r\\n\");\n          tud_resume_cb();\n        } else {\n          TU_LOG_USBD(\" Skipped\\r\\n\");\n        }\n        break;\n\n      case USBD_EVENT_FUNC_CALL:\n        TU_LOG_USBD(\"\\r\\n\");\n        if (event.func_call.func != NULL) {\n          event.func_call.func(event.func_call.param);\n        }\n        break;\n\n      case DCD_EVENT_SOF:\n        if (tu_bit_test(_usbd_dev.sof_consumer, SOF_CONSUMER_USER)) {\n          TU_LOG_USBD(\"\\r\\n\");\n          tud_sof_cb(event.sof.frame_count);\n        }\n      break;\n\n      default:\n        TU_BREAKPOINT();\n        break;\n    }\n\n#if CFG_TUSB_OS != OPT_OS_NONE && CFG_TUSB_OS != OPT_OS_PICO\n    // return if there is no more events, for application to run other background\n    if (osal_queue_empty(_usbd_q)) { return; }\n#endif\n  }\n}\n\n//--------------------------------------------------------------------+\n// Control Request Parser & Handling\n//--------------------------------------------------------------------+\n\n// Helper to invoke class driver control request handler\nstatic bool invoke_class_control(uint8_t rhport, usbd_class_driver_t const * driver, tusb_control_request_t const * request) {\n  usbd_control_set_complete_callback(driver->control_xfer_cb);\n  TU_LOG_USBD(\"  %s control request\\r\\n\", driver->name);\n  return driver->control_xfer_cb(rhport, CONTROL_STAGE_SETUP, request);\n}\n\n// This handles the actual request and its response.\n// Returns false if unable to complete the request, causing caller to stall control endpoints.\nstatic bool process_control_request(uint8_t rhport, tusb_control_request_t const * p_request) {\n  usbd_control_set_complete_callback(NULL);\n  TU_ASSERT(p_request->bmRequestType_bit.type < TUSB_REQ_TYPE_INVALID);\n\n  // Vendor request\n  if ( p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_VENDOR ) {\n    usbd_control_set_complete_callback(tud_vendor_control_xfer_cb);\n    return tud_vendor_control_xfer_cb(rhport, CONTROL_STAGE_SETUP, p_request);\n  }\n\n#if CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\n  if (TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type && p_request->bRequest <= TUSB_REQ_SYNCH_FRAME) {\n    TU_LOG_USBD(\"  %s\", tu_str_std_request[p_request->bRequest]);\n    if (TUSB_REQ_GET_DESCRIPTOR != p_request->bRequest) {\n      TU_LOG_USBD(\"\\r\\n\");\n    }\n  }\n#endif\n\n  switch (p_request->bmRequestType_bit.recipient) { //-V2520\n    //------------- Device Requests e.g in enumeration -------------//\n    case TUSB_REQ_RCPT_DEVICE:\n      if ( TUSB_REQ_TYPE_CLASS == p_request->bmRequestType_bit.type ) {\n        uint8_t const itf = tu_u16_low(p_request->wIndex);\n        TU_VERIFY(itf < TU_ARRAY_SIZE(_usbd_dev.itf2drv));\n\n        usbd_class_driver_t const * driver = get_driver(_usbd_dev.itf2drv[itf]);\n        TU_VERIFY(driver);\n\n        // forward to class driver: \"non-STD request to Interface\"\n        return invoke_class_control(rhport, driver, p_request);\n      }\n\n      if (TUSB_REQ_TYPE_STANDARD != p_request->bmRequestType_bit.type) {\n        // Non-standard request is not supported\n        TU_BREAKPOINT();\n        return false;\n      }\n\n      switch (p_request->bRequest) { //-V2520\n        case TUSB_REQ_SET_ADDRESS:\n          // Depending on mcu, status phase could be sent either before or after changing device address,\n          // or even require stack to not response with status at all\n          // Therefore DCD must take full responsibility to response and include zlp status packet if needed.\n          usbd_control_set_request(p_request); // set request since DCD has no access to tud_control_status() API\n          dcd_set_address(rhport, (uint8_t) p_request->wValue);\n          // skip tud_control_status()\n          _usbd_dev.addressed = 1;\n        break;\n\n        case TUSB_REQ_GET_CONFIGURATION: {\n          uint8_t cfg_num = _usbd_dev.cfg_num;\n          tud_control_xfer(rhport, p_request, &cfg_num, 1);\n        }\n        break;\n\n        case TUSB_REQ_SET_CONFIGURATION: {\n          uint8_t const cfg_num = (uint8_t) p_request->wValue;\n\n          // Only process if new configure is different\n          if (_usbd_dev.cfg_num != cfg_num) {\n            if (_usbd_dev.cfg_num != 0) {\n              // already configured: need to clear all endpoints and driver first\n              TU_LOG_USBD(\"  Clear current Configuration (%u) before switching\\r\\n\", _usbd_dev.cfg_num);\n\n              dcd_sof_enable(rhport, false);\n              dcd_edpt_close_all(rhport);\n\n              // close all drivers and current configured state except bus speed\n              const uint8_t speed = _usbd_dev.speed;\n              configuration_reset(rhport);\n\n              _usbd_dev.speed = speed; // restore speed\n            }\n\n            _usbd_dev.cfg_num = cfg_num;\n\n            // Handle the new configuration\n            if (cfg_num == 0) {\n              tud_umount_cb();\n            } else {\n              if (!process_set_config(rhport, cfg_num)) {\n                _usbd_dev.cfg_num = 0;\n                TU_ASSERT(false);\n              }\n              tud_mount_cb();\n            }\n          }\n\n          tud_control_status(rhport, p_request);\n        }\n        break;\n\n        case TUSB_REQ_GET_DESCRIPTOR:\n          TU_VERIFY(process_get_descriptor(rhport, p_request));\n        break;\n\n        case TUSB_REQ_SET_FEATURE:\n          switch(p_request->wValue) { //-V2520\n            case TUSB_REQ_FEATURE_REMOTE_WAKEUP:\n              TU_LOG_USBD(\"    Enable Remote Wakeup\\r\\n\");\n              // Host may enable remote wake up before suspending especially HID device\n              _usbd_dev.remote_wakeup_en = 1;\n              tud_control_status(rhport, p_request);\n              break;\n\n            #if CFG_TUD_TEST_MODE\n            case TUSB_REQ_FEATURE_TEST_MODE: {\n              // Only handle the test mode if supported and valid\n              TU_VERIFY(0 == tu_u16_low(p_request->wIndex));\n\n              uint8_t const selector = tu_u16_high(p_request->wIndex);\n              TU_VERIFY(TUSB_FEATURE_TEST_J <= selector && selector <= TUSB_FEATURE_TEST_FORCE_ENABLE);\n\n              usbd_control_set_complete_callback(process_test_mode_cb);\n              tud_control_status(rhport, p_request);\n              break;\n            }\n            #endif\n\n            // Stall unsupported feature selector\n            default: return false;\n          }\n        break;\n\n        case TUSB_REQ_CLEAR_FEATURE:\n          // Only support remote wakeup for device feature\n          TU_VERIFY(TUSB_REQ_FEATURE_REMOTE_WAKEUP == p_request->wValue);\n          TU_LOG_USBD(\"    Disable Remote Wakeup\\r\\n\");\n\n          // Host may disable remote wake up after resuming\n          _usbd_dev.remote_wakeup_en = 0;\n          tud_control_status(rhport, p_request);\n          break;\n\n        case TUSB_REQ_GET_STATUS: {\n          // Device status bit mask\n          // - Bit 0: Self Powered TODO must invoke callback to get actual status\n          // - Bit 1: Remote Wakeup enabled\n          uint16_t status = (uint16_t)_usbd_dev.dev_state_bm;\n          tud_control_xfer(rhport, p_request, &status, 2);\n          break;\n        }\n\n        // Unknown/Unsupported request\n        default: TU_BREAKPOINT(); return false;\n      }\n    break;\n\n    //------------- Class/Interface Specific Request -------------//\n    case TUSB_REQ_RCPT_INTERFACE: {\n      uint8_t itf;\n      #if CFG_TUD_PRINTER\n      // Printer GET_DEVICE_ID has a weird wIndex = interface (high) | alt (low)\n      // attempt to interpret this as a printer request if matched\n      if (TUSB_REQ_TYPE_CLASS == p_request->bmRequestType_bit.type &&\n          TUSB_DIR_IN == p_request->bmRequestType_bit.direction &&\n          TUSB_PRINTER_REQUEST_GET_DEVICE_ID == p_request->bRequest) {\n        itf = tu_u16_high(p_request->wIndex);\n        if (itf < TU_ARRAY_SIZE(_usbd_dev.itf2drv)) {\n          const usbd_class_driver_t * driver = get_driver(_usbd_dev.itf2drv[itf]);\n          if (driver != NULL && driver->control_xfer_cb == printerd_control_xfer_cb) {\n            if (invoke_class_control(rhport, driver, p_request)) {\n              return true;\n            }\n          }\n        }\n      }\n      #endif\n      itf = tu_u16_low(p_request->wIndex);\n      TU_VERIFY(itf < TU_ARRAY_SIZE(_usbd_dev.itf2drv));\n\n      usbd_class_driver_t const * driver = get_driver(_usbd_dev.itf2drv[itf]);\n      TU_VERIFY(driver);\n\n      // all requests to Interface (STD or Class) is forwarded to class driver.\n      // notable requests are: GET HID REPORT DESCRIPTOR, SET_INTERFACE, GET_INTERFACE\n      if (!invoke_class_control(rhport, driver, p_request)) {\n        // For GET_INTERFACE and SET_INTERFACE, it is mandatory to respond even if the class\n        // driver doesn't use alternate settings or implement this\n        TU_VERIFY(TUSB_REQ_TYPE_STANDARD == p_request->bmRequestType_bit.type);\n\n        // Clear complete callback if driver set since it can also stall the request.\n        usbd_control_set_complete_callback(NULL);\n\n        switch (p_request->bRequest) { //-V2520\n          case TUSB_REQ_GET_INTERFACE: {\n            uint8_t alternate = 0;\n            tud_control_xfer(rhport, p_request, &alternate, 1);\n            break;\n          }\n\n          case TUSB_REQ_SET_INTERFACE:\n            tud_control_status(rhport, p_request);\n            break;\n\n          default: return false;\n        }\n      }\n      break;\n    }\n\n    //------------- Endpoint Request -------------//\n    case TUSB_REQ_RCPT_ENDPOINT: {\n      uint8_t const ep_addr = tu_u16_low(p_request->wIndex);\n      uint8_t const ep_num  = tu_edpt_number(ep_addr);\n      uint8_t const ep_dir  = tu_edpt_dir(ep_addr);\n\n      TU_ASSERT(ep_num < TU_ARRAY_SIZE(_usbd_dev.ep2drv) );\n      usbd_class_driver_t const * driver = get_driver(_usbd_dev.ep2drv[ep_num][ep_dir]);\n\n      if (TUSB_REQ_TYPE_STANDARD != p_request->bmRequestType_bit.type) {\n        // Forward class request to its driver\n        TU_VERIFY(driver);\n        return invoke_class_control(rhport, driver, p_request);\n      } else {\n        // Handle STD request to endpoint\n        switch (p_request->bRequest) { //-V2520\n          case TUSB_REQ_GET_STATUS: {\n            uint16_t status = usbd_edpt_stalled(rhport, ep_addr) ? 0x0001u : 0x0000u;\n            tud_control_xfer(rhport, p_request, &status, 2);\n          }\n          break;\n\n          case TUSB_REQ_CLEAR_FEATURE:\n          case TUSB_REQ_SET_FEATURE: {\n            if ( TUSB_REQ_FEATURE_EDPT_HALT == p_request->wValue ) {\n              if ( TUSB_REQ_CLEAR_FEATURE ==  p_request->bRequest ) {\n                usbd_edpt_clear_stall(rhport, ep_addr);\n              }else {\n                usbd_edpt_stall(rhport, ep_addr);\n              }\n            }\n\n            if (driver != NULL) {\n              // Some classes such as USBTMC needs to clear/re-init its buffer when receiving CLEAR_FEATURE request\n              // We will also forward std request targeted endpoint to class drivers as well\n\n              // STD request must always be ACKed regardless of driver returned value\n              // Also clear complete callback if driver set since it can also stall the request.\n              (void) invoke_class_control(rhport, driver, p_request);\n              usbd_control_set_complete_callback(NULL);\n\n              // skip ZLP status if driver already did that\n              if (!_usbd_dev.ep_status[0][TUSB_DIR_IN].busy) {\n                tud_control_status(rhport, p_request);\n              }\n            }\n          }\n          break;\n\n          // Unknown/Unsupported request\n          default:\n            TU_BREAKPOINT();\n            return false;\n        }\n      }\n      break;\n    }\n\n    // Unknown recipient\n    default:\n      TU_BREAKPOINT();\n      return false;\n  }\n\n  return true;\n}\n\n// Process Set Configure Request\n// This function parse configuration descriptor & open drivers accordingly\nstatic bool process_set_config(uint8_t rhport, uint8_t cfg_num) {\n  // index is cfg_num-1\n  const tusb_desc_configuration_t *desc_cfg =\n    (const tusb_desc_configuration_t *)tud_descriptor_configuration_cb(cfg_num - 1);\n  TU_ASSERT(desc_cfg != NULL && desc_cfg->bDescriptorType == TUSB_DESC_CONFIGURATION);\n\n  // Parse configuration descriptor\n  _usbd_dev.self_powered = (desc_cfg->bmAttributes & TUSB_DESC_CONFIG_ATT_SELF_POWERED) ? 1u : 0u;\n\n  // Parse interface descriptor\n  const uint8_t *p_desc   = ((const uint8_t *)desc_cfg) + sizeof(tusb_desc_configuration_t);\n  const uint8_t *desc_end = ((const uint8_t *)desc_cfg) + tu_le16toh(desc_cfg->wTotalLength);\n\n  while (tu_desc_in_bounds(p_desc, desc_end)) {\n    // Class will always start with Interface Association (if any) and then Interface descriptor\n    if (TUSB_DESC_INTERFACE_ASSOCIATION == tu_desc_type(p_desc)) {\n      p_desc = tu_desc_next(p_desc); // next to Interface\n      continue;\n    }\n\n    TU_ASSERT(TUSB_DESC_INTERFACE == tu_desc_type(p_desc));\n    const tusb_desc_interface_t *desc_itf = (const tusb_desc_interface_t *)p_desc;\n\n    // Find driver for this interface\n    const uint16_t remaining_len = (uint16_t)(desc_end - p_desc);\n    uint8_t        drv_id;\n    for (drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {\n      const usbd_class_driver_t *driver = get_driver(drv_id);\n      TU_ASSERT(driver);\n      const uint16_t drv_len = driver->open(rhport, desc_itf, remaining_len);\n\n      if ((sizeof(tusb_desc_interface_t) <= drv_len) && (drv_len <= remaining_len)) {\n        // Open successfully\n        TU_LOG_USBD(\"  %s opened\\r\\n\", driver->name);\n\n        // bind found driver to all interfaces and endpoint within drv_len\n        TU_ASSERT(tu_bind_driver_to_ep_itf(drv_id, _usbd_dev.ep2drv, _usbd_dev.itf2drv, CFG_TUD_INTERFACE_MAX, p_desc,\n                                           drv_len));\n\n        p_desc += drv_len; // next Interface\n        break; // exit driver find loop\n      }\n    }\n\n    // Failed if there is no supported drivers\n    TU_ASSERT(drv_id < TOTAL_DRIVER_COUNT);\n  }\n\n  return true;\n}\n\n// return descriptor's buffer and update desc_len\nstatic bool process_get_descriptor(uint8_t rhport, tusb_control_request_t const * p_request)\n{\n  tusb_desc_type_t const desc_type = (tusb_desc_type_t) tu_u16_high(p_request->wValue);\n  uint8_t const desc_index = tu_u16_low( p_request->wValue );\n\n  switch(desc_type) { //-V2520\n    case TUSB_DESC_DEVICE: {\n      TU_LOG_USBD(\" Device\\r\\n\");\n\n      void* desc_device = (void*) (uintptr_t) tud_descriptor_device_cb();\n      TU_ASSERT(desc_device);\n\n      // Only response with exactly 1 Packet if: not addressed and host requested more data than device descriptor has.\n      // This only happens with the very first get device descriptor and EP0 size = 8 or 16.\n      if ((CFG_TUD_ENDPOINT0_SIZE < sizeof(tusb_desc_device_t)) && !_usbd_dev.addressed &&\n          ((tusb_control_request_t const*) p_request)->wLength > sizeof(tusb_desc_device_t)) {\n        // Hack here: we modify the request length to prevent usbd_control response with zlp\n        // since we are responding with 1 packet & less data than wLength.\n        tusb_control_request_t mod_request = *p_request;\n        mod_request.wLength = CFG_TUD_ENDPOINT0_SIZE;\n\n        return tud_control_xfer(rhport, &mod_request, desc_device, CFG_TUD_ENDPOINT0_SIZE);\n      }else {\n        return tud_control_xfer(rhport, p_request, desc_device, sizeof(tusb_desc_device_t));\n      }\n    }\n    // break; // unreachable\n\n    case TUSB_DESC_BOS: {\n      TU_LOG_USBD(\" BOS\\r\\n\");\n\n      // requested by host if USB > 2.0 ( i.e 2.1 or 3.x )\n      uintptr_t desc_bos = (uintptr_t) tud_descriptor_bos_cb();\n      TU_VERIFY(desc_bos != 0);\n\n      // Use offsetof to avoid pointer to the odd/misaligned address\n      uint16_t const total_len = tu_le16toh( tu_unaligned_read16((const void*) (desc_bos + offsetof(tusb_desc_bos_t, wTotalLength))) );\n\n      return tud_control_xfer(rhport, p_request, (void*) desc_bos, total_len);\n    }\n    // break; // unreachable\n\n    case TUSB_DESC_CONFIGURATION:\n    case TUSB_DESC_OTHER_SPEED_CONFIG: {\n      uintptr_t desc_config;\n\n      if ( desc_type == TUSB_DESC_CONFIGURATION ) {\n        TU_LOG_USBD(\" Configuration[%u]\\r\\n\", desc_index);\n        desc_config = (uintptr_t) tud_descriptor_configuration_cb(desc_index);\n        TU_ASSERT(desc_config != 0);\n      }else {\n        // Host only request this after getting Device Qualifier descriptor\n        TU_LOG_USBD(\" Other Speed Configuration\\r\\n\");\n        desc_config = (uintptr_t) tud_descriptor_other_speed_configuration_cb(desc_index);\n        TU_VERIFY(desc_config != 0);\n      }\n\n      // Use offsetof to avoid pointer to the odd/misaligned address\n      uint16_t const total_len = tu_le16toh( tu_unaligned_read16((const void*) (desc_config + offsetof(tusb_desc_configuration_t, wTotalLength))) );\n\n      return tud_control_xfer(rhport, p_request, (void*) desc_config, total_len);\n    }\n    // break; // unreachable\n\n    case TUSB_DESC_STRING: {\n      TU_LOG_USBD(\" String[%u]\\r\\n\", desc_index);\n\n      // String Descriptor always uses the desc set from user\n      uint8_t const* desc_str = (uint8_t const*) tud_descriptor_string_cb(desc_index, tu_le16toh(p_request->wIndex));\n      TU_VERIFY(desc_str);\n\n      // first byte of descriptor is its size\n      return tud_control_xfer(rhport, p_request, (void*) (uintptr_t) desc_str, tu_desc_len(desc_str));\n    }\n    // break; // unreachable\n\n    case TUSB_DESC_DEVICE_QUALIFIER: {\n      TU_LOG_USBD(\" Device Qualifier\\r\\n\");\n      uint8_t const* desc_qualifier = tud_descriptor_device_qualifier_cb();\n      TU_VERIFY(desc_qualifier);\n      return tud_control_xfer(rhport, p_request, (void*) (uintptr_t) desc_qualifier, tu_desc_len(desc_qualifier));\n    }\n    // break; // unreachable\n\n    default: return false;\n  }\n}\n\n//--------------------------------------------------------------------+\n// DCD Event Handler\n//--------------------------------------------------------------------+\nTU_ATTR_FAST_FUNC void dcd_event_handler(dcd_event_t const* event, bool in_isr) {\n  bool send = false;\n  switch (event->event_id) {\n    case DCD_EVENT_UNPLUGGED:\n      _usbd_dev.connected = 0;\n      _usbd_dev.addressed = 0;\n      _usbd_dev.cfg_num = 0;\n      _usbd_dev.suspended = 0;\n      send = true;\n      break;\n\n    case DCD_EVENT_SUSPEND:\n      // NOTE: When plugging/unplugging device, the D+/D- state are unstable and\n      // can accidentally meet the SUSPEND condition ( Bus Idle for 3ms ).\n      // In addition, some MCUs such as SAMD or boards that haven no VBUS detection cannot distinguish\n      // suspended vs disconnected. We will skip handling SUSPEND/RESUME event if not currently connected\n      if (_usbd_dev.connected) {\n        _usbd_dev.suspended = 1;\n        send = true;\n      }\n      break;\n\n    case DCD_EVENT_RESUME:\n      // skip event if not connected (especially required for SAMD)\n      if (_usbd_dev.connected) {\n        _usbd_dev.suspended = 0;\n        send = true;\n      }\n      break;\n\n    case DCD_EVENT_SOF:\n      // SOF driver handler in ISR context\n      for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++) {\n        usbd_class_driver_t const* driver = get_driver(i);\n        if (driver && driver->sof) {\n          driver->sof(event->rhport, event->sof.frame_count);\n        }\n      }\n\n      // Some MCUs after running dcd_remote_wakeup() does not have way to detect the end of remote wakeup\n      // which last 1-15 ms. DCD can use SOF as a clear indicator that bus is back to operational\n      if (_usbd_dev.suspended) {\n        _usbd_dev.suspended = 0;\n\n        dcd_event_t const event_resume = {.rhport = event->rhport, .event_id = DCD_EVENT_RESUME};\n        queue_event(&event_resume, in_isr);\n      }\n\n      if (tu_bit_test(_usbd_dev.sof_consumer, SOF_CONSUMER_USER)) {\n        dcd_event_t const event_sof = {.rhport = event->rhport, .event_id = DCD_EVENT_SOF, .sof.frame_count = event->sof.frame_count};\n        queue_event(&event_sof, in_isr);\n      }\n      break;\n\n    case DCD_EVENT_SETUP_RECEIVED:\n      _usbd_queued_setup++;\n      send = true;\n      break;\n\n    case DCD_EVENT_XFER_COMPLETE: {\n      // Invoke the class callback associated with the endpoint address\n      uint8_t const ep_addr = event->xfer_complete.ep_addr;\n      uint8_t const epnum = tu_edpt_number(ep_addr);\n      uint8_t const ep_dir = tu_edpt_dir(ep_addr);\n\n      send = true;\n      if(epnum > 0) {\n        usbd_class_driver_t const* driver = get_driver(_usbd_dev.ep2drv[epnum][ep_dir]);\n\n        if (driver && driver->xfer_isr) {\n          _usbd_dev.ep_status[epnum][ep_dir].busy = 0;\n          _usbd_dev.ep_status[epnum][ep_dir].claimed = 0;\n\n          send = !driver->xfer_isr(event->rhport, ep_addr, (xfer_result_t) event->xfer_complete.result, event->xfer_complete.len);\n\n          // xfer_isr() is deferred to xfer_cb(), revert busy/claimed status\n          if (send) {\n            _usbd_dev.ep_status[epnum][ep_dir].busy = 1;\n            _usbd_dev.ep_status[epnum][ep_dir].claimed = 1;\n          }\n        }\n      }\n      break;\n    }\n\n    default:\n      send = true;\n      break;\n  }\n\n  if (send) {\n    queue_event(event, in_isr);\n  }\n}\n\n//--------------------------------------------------------------------+\n// USBD API For Class Driver\n//--------------------------------------------------------------------+\n\nvoid usbd_int_set(bool enabled) {\n  if (enabled) {\n    dcd_int_enable(_usbd_rhport);\n  } else {\n    dcd_int_disable(_usbd_rhport);\n  }\n}\n\nvoid usbd_spin_lock(bool in_isr) {\n  osal_spin_lock(&_usbd_spin, in_isr);\n}\nvoid usbd_spin_unlock(bool in_isr) {\n  osal_spin_unlock(&_usbd_spin, in_isr);\n}\n\n// Parse consecutive endpoint descriptors (IN & OUT)\nbool usbd_open_edpt_pair(uint8_t rhport, const uint8_t *p_desc, uint8_t ep_count, uint8_t xfer_type, uint8_t *ep_out,\n                         uint8_t *ep_in) {\n  for (int i = 0; i < ep_count; i++) {\n    const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)p_desc;\n\n    TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && xfer_type == desc_ep->bmAttributes.xfer);\n    TU_ASSERT(usbd_edpt_open(rhport, desc_ep));\n\n    if (tu_edpt_dir(desc_ep->bEndpointAddress) == TUSB_DIR_IN) {\n      (*ep_in) = desc_ep->bEndpointAddress;\n    } else {\n      (*ep_out) = desc_ep->bEndpointAddress;\n    }\n\n    p_desc = tu_desc_next(p_desc);\n  }\n\n  return true;\n}\n\n// Helper to defer an isr function\nvoid usbd_defer_func(osal_task_func_t func, void* param, bool in_isr) {\n  dcd_event_t event = {\n      .rhport   = 0,\n      .event_id = USBD_EVENT_FUNC_CALL,\n  };\n  event.func_call.func  = func;\n  event.func_call.param = param;\n\n  queue_event(&event, in_isr);\n}\n\n//--------------------------------------------------------------------+\n// USBD Endpoint API\n//--------------------------------------------------------------------+\n\nbool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const* desc_ep) {\n  rhport = _usbd_rhport;\n\n  TU_ASSERT(tu_edpt_number(desc_ep->bEndpointAddress) < CFG_TUD_ENDPPOINT_MAX);\n  TU_ASSERT(tu_edpt_validate(desc_ep, (tusb_speed_t)_usbd_dev.speed));\n\n  return dcd_edpt_open(rhport, desc_ep);\n}\n\nbool usbd_edpt_claim(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  // TODO add this check later, also make sure we don't starve an out endpoint while suspending\n  // TU_VERIFY(tud_ready());\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n  tu_edpt_state_t* ep_state = &_usbd_dev.ep_status[epnum][dir];\n\n  return tu_edpt_claim(ep_state, _usbd_mutex);\n}\n\nbool usbd_edpt_release(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n  tu_edpt_state_t* ep_state = &_usbd_dev.ep_status[epnum][dir];\n\n  return tu_edpt_release(ep_state, _usbd_mutex);\n}\n\nbool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t* buffer, uint16_t total_bytes, bool is_isr) {\n  rhport = _usbd_rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  // TODO skip ready() check for now since enumeration also use this API\n  // TU_VERIFY(tud_ready());\n\n  TU_LOG_USBD(\"  Queue EP %02X with %u bytes ...\\r\\n\", ep_addr, total_bytes);\n#if CFG_TUD_LOG_LEVEL >= 3\n  if(dir == TUSB_DIR_IN) {\n    TU_LOG_MEM(CFG_TUD_LOG_LEVEL, buffer, total_bytes, 2);\n  }\n#endif\n\n  // Attempt to transfer on a busy endpoint, sound like an race condition !\n  TU_ASSERT(_usbd_dev.ep_status[epnum][dir].busy == 0);\n\n  // Set busy first since the actual transfer can be complete before dcd_edpt_xfer()\n  // could return and USBD task can preempt and clear the busy\n  _usbd_dev.ep_status[epnum][dir].busy = 1;\n\n  if (dcd_edpt_xfer(rhport, ep_addr, buffer, total_bytes, is_isr)) {\n    return true;\n  } else {\n    // DCD error, mark endpoint as ready to allow next transfer\n    _usbd_dev.ep_status[epnum][dir].busy = 0;\n    _usbd_dev.ep_status[epnum][dir].claimed = 0;\n    TU_LOG_USBD(\"FAILED\\r\\n\");\n    TU_BREAKPOINT();\n    return false;\n  }\n}\n\n// The number of bytes has to be given explicitly to allow more flexible control of how many\n// bytes should be written and second to keep the return value free to give back a boolean\n// success message. If total_bytes is too big, the FIFO will copy only what is available\n// into the USB buffer!\nbool usbd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t* ff, uint16_t total_bytes, bool is_isr) {\n  #if CFG_TUD_EDPT_DEDICATED_HWFIFO\n  rhport = _usbd_rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  TU_LOG_USBD(\"  Queue FIFO EP %02X with %u bytes ... \", ep_addr, total_bytes);\n\n  // Attempt to transfer on a busy endpoint, sound like a race condition !\n  TU_ASSERT(_usbd_dev.ep_status[epnum][dir].busy == 0);\n\n  // Set busy first since the actual transfer can be complete before dcd_edpt_xfer() could return\n  // and usbd task can preempt and clear the busy\n  _usbd_dev.ep_status[epnum][dir].busy = 1;\n\n  if (dcd_edpt_xfer_fifo(rhport, ep_addr, ff, total_bytes, is_isr)) {\n    TU_LOG_USBD(\"OK\\r\\n\");\n    return true;\n  } else {\n    // DCD error, mark endpoint as ready to allow next transfer\n    _usbd_dev.ep_status[epnum][dir].busy = 0;\n    _usbd_dev.ep_status[epnum][dir].claimed = 0;\n    TU_LOG_USBD(\"failed\\r\\n\");\n    TU_BREAKPOINT();\n    return false;\n  }\n  #else\n  (void)rhport;\n  (void)ep_addr;\n  (void)ff;\n  (void)total_bytes;\n  (void)is_isr;\n  return false;\n  #endif\n}\n\nbool usbd_edpt_busy(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  return _usbd_dev.ep_status[epnum][dir].busy;\n}\n\nvoid usbd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  rhport = _usbd_rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  // only stalled if currently cleared\n  TU_LOG_USBD(\"    Stall EP %02X\\r\\n\", ep_addr);\n  dcd_edpt_stall(rhport, ep_addr);\n  _usbd_dev.ep_status[epnum][dir].stalled = 1;\n  _usbd_dev.ep_status[epnum][dir].busy = 1;\n}\n\nvoid usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  rhport = _usbd_rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  // only clear if currently stalled\n  TU_LOG_USBD(\"    Clear Stall EP %02X\\r\\n\", ep_addr);\n  dcd_edpt_clear_stall(rhport, ep_addr);\n  _usbd_dev.ep_status[epnum][dir].stalled = 0;\n  _usbd_dev.ep_status[epnum][dir].busy = 0;\n}\n\nbool usbd_edpt_stalled(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  return _usbd_dev.ep_status[epnum][dir].stalled;\n}\n\n/**\n * usbd_edpt_close will disable an endpoint.\n * In progress transfers on this EP may be delivered after this call.\n */\nvoid usbd_edpt_close(uint8_t rhport, uint8_t ep_addr) {\n#ifdef TUP_DCD_EDPT_ISO_ALLOC\n  (void) rhport; (void) ep_addr;\n  // ISO alloc/activate Should be used instead\n#else\n  rhport = _usbd_rhport;\n\n  TU_LOG_USBD(\"  CLOSING Endpoint: 0x%02X\\r\\n\", ep_addr);\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  dcd_edpt_close(rhport, ep_addr);\n  _usbd_dev.ep_status[epnum][dir].stalled = 0;\n  _usbd_dev.ep_status[epnum][dir].busy = 0;\n  _usbd_dev.ep_status[epnum][dir].claimed = 0;\n#endif\n\n  return;\n}\n\nvoid usbd_sof_enable(uint8_t rhport, sof_consumer_t consumer, bool en) {\n  rhport = _usbd_rhport;\n\n  uint8_t consumer_old = _usbd_dev.sof_consumer;\n  // Keep track how many class instances need the SOF interrupt\n  if (en) {\n    _usbd_dev.sof_consumer |= (uint8_t)(1 << consumer);\n  } else {\n    _usbd_dev.sof_consumer &= (uint8_t)(~(1 << consumer));\n  }\n\n  // Test logically unequal\n  if(!_usbd_dev.sof_consumer != !consumer_old) {\n    dcd_sof_enable(rhport, _usbd_dev.sof_consumer);\n  }\n}\n\nbool usbd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n#ifdef TUP_DCD_EDPT_ISO_ALLOC\n  rhport = _usbd_rhport;\n\n  TU_ASSERT(tu_edpt_number(ep_addr) < CFG_TUD_ENDPPOINT_MAX);\n  return dcd_edpt_iso_alloc(rhport, ep_addr, largest_packet_size);\n#else\n  (void) rhport; (void) ep_addr; (void) largest_packet_size;\n  return false;\n#endif\n}\n\nbool usbd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const* desc_ep) {\n#ifdef TUP_DCD_EDPT_ISO_ALLOC\n  rhport = _usbd_rhport;\n\n  uint8_t const epnum = tu_edpt_number(desc_ep->bEndpointAddress);\n  uint8_t const dir = tu_edpt_dir(desc_ep->bEndpointAddress);\n\n  TU_ASSERT(epnum < CFG_TUD_ENDPPOINT_MAX);\n  TU_ASSERT(tu_edpt_validate(desc_ep, (tusb_speed_t)_usbd_dev.speed));\n\n  _usbd_dev.ep_status[epnum][dir].stalled = 0;\n  _usbd_dev.ep_status[epnum][dir].busy = 0;\n  _usbd_dev.ep_status[epnum][dir].claimed = 0;\n  return dcd_edpt_iso_activate(rhport, desc_ep);\n#else\n  (void) rhport; (void) desc_ep;\n  return false;\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "src/device/usbd.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_USBD_H_\n#define TUSB_USBD_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// ConfigID for tud_configure()\nenum {\n  TUD_CFGID_INVALID = 0,\n  TUD_CFGID_DWC2 = 100,\n};\n\ntypedef struct {\n  uint16_t bm_double_buffered; // bitmap of IN endpoints to be double buffered, only effective for bulk endpoints\n  bool vbus_sensing; // Vbus pin is used for device connection detection, mandatory for tud_umount_cb()\n} tud_configure_dwc2_t;\n\n  #ifndef CFG_TUD_CONFIGURE_DWC2_DEFAULT\n    #define CFG_TUD_CONFIGURE_DWC2_DEFAULT {.bm_double_buffered = 0, .vbus_sensing = CFG_TUD_VBUS_DETECT_HW}\n  #endif\n\ntypedef union {\n  tud_configure_dwc2_t dwc2;\n} tud_configure_param_t;\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// Configure device stack behavior with dynamic or port-specific parameters.\n// Should be called before initialization of the device stack\n// - cfg_id   : configure ID from TUD_CFGID_* enum values\n// - cfg_param: configure data, structure depends on the ID\nbool tud_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param);\n\n// New API to replace tud_init() to init device stack on specific roothub port\n// Must be called in the same task/context as tud_task() if RTOS is used\nbool tud_rhport_init(uint8_t rhport, const tusb_rhport_init_t* rh_init);\n\n// Init device stack on roothub port\n#if TUSB_VERSION_NUMBER > 2000  // 0.20.0\nTU_ATTR_DEPRECATED(\"Please use tusb_init(rhport, rh_init) instead\")\n#endif\nTU_ATTR_ALWAYS_INLINE static inline bool tud_init (uint8_t rhport) {\n  const tusb_rhport_init_t rh_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUD_OPT_HIGH_SPEED ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL\n  };\n  return tud_rhport_init(rhport, &rh_init);\n}\n\n// Deinit device stack on roothub port\n// Must be called in the same task/context as tud_task() if RTOS is used\nbool tud_deinit(uint8_t rhport);\n\n// Check if device stack is already initialized\nbool tud_inited(void);\n\n// Task function should be called in main/rtos loop, extended version of tud_task()\n// - timeout_ms: millisecond to wait, zero = no wait, 0xFFFFFFFF = wait forever\n// - in_isr: if function is called in ISR\nvoid tud_task_ext(uint32_t timeout_ms, bool in_isr);\n\n// Task function should be called in main/rtos loop\nTU_ATTR_ALWAYS_INLINE static inline\nvoid tud_task (void) {\n  tud_task_ext(UINT32_MAX, false);\n}\n\n// Check if there is pending events need processing by tud_task()\nbool tud_task_event_ready(void);\n\n#ifndef TUSB_DCD_H_\nextern void dcd_int_handler(uint8_t rhport);\n#endif\n\n// Interrupt handler, name alias to DCD\n#define tud_int_handler   dcd_int_handler\n\n// Get current bus speed\ntusb_speed_t tud_speed_get(void);\n\n// Check if device is connected (may not mounted/configured yet)\n// True if just got out of Bus Reset and received the very first data from host\nbool tud_connected(void);\n\n// Check if device is connected and configured\nbool tud_mounted(void);\n\n// Check if device is suspended\nbool tud_suspended(void);\n\n// Check if device is ready to transfer\nTU_ATTR_ALWAYS_INLINE static inline\nbool tud_ready(void) {\n  const bool is_mounted = tud_mounted();\n  const bool is_suspended = tud_suspended();\n  return is_mounted && !is_suspended;\n}\n\n// Remote wake up host, only if suspended and enabled by host\nbool tud_remote_wakeup(void);\n\n// Enable pull-up resistor on D+ D-\n// Return false on unsupported MCUs\nbool tud_disconnect(void);\n\n// Disable pull-up resistor on D+ D-\n// Return false on unsupported MCUs\nbool tud_connect(void);\n\n// Enable or disable the Start Of Frame callback support\nvoid tud_sof_cb_enable(bool en);\n\n// Carry out Data and Status stage of control transfer\n// - If len = 0, it is equivalent to sending status only\n// - If len > wLength : it will be truncated\nbool tud_control_xfer(uint8_t rhport, tusb_control_request_t const * request, void* buffer, uint16_t len);\n\n// Send STATUS (zero length) packet\nbool tud_control_status(uint8_t rhport, tusb_control_request_t const * request);\n\n//--------------------------------------------------------------------+\n// Application Callbacks\n//--------------------------------------------------------------------+\n\n// Invoked when received GET DEVICE DESCRIPTOR request\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_device_cb(void);\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index);\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\nuint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid);\n\n// Invoked when received GET BOS DESCRIPTOR request\n// Application return pointer to descriptor\nuint8_t const * tud_descriptor_bos_cb(void);\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete.\n// device_qualifier descriptor describes information about a high-speed capable device that would\n// change if the device were operating at the other speed. If not highspeed capable stall this request.\nuint8_t const* tud_descriptor_device_qualifier_cb(void);\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long enough for transfer to complete\n// Configuration descriptor in the other speed e.g if high speed then this is for full speed and vice versa\nuint8_t const* tud_descriptor_other_speed_configuration_cb(uint8_t index);\n\n// Invoked when device is mounted (configured)\nvoid tud_mount_cb(void);\n\n// Invoked when device is unmounted\nvoid tud_umount_cb(void);\n\n// Invoked when usb bus is suspended\n// Within 7ms, device must draw an average of current less than 2.5 mA from bus\nvoid tud_suspend_cb(bool remote_wakeup_en);\n\n// Invoked when usb bus is resumed\nvoid tud_resume_cb(void);\n\n// Invoked when there is a new usb event, which need to be processed by tud_task()/tud_task_ext()\nvoid tud_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr);\n\n// Invoked when a new (micro) frame started\nvoid tud_sof_cb(uint32_t frame_count);\n\n// Invoked when received control request with VENDOR TYPE\nbool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\n\n//--------------------------------------------------------------------+\n// Binary Device Object Store (BOS) Descriptor Templates\n//--------------------------------------------------------------------+\n\n#define TUD_BOS_DESC_LEN      5\n\n// total length, number of device caps\n#define TUD_BOS_DESCRIPTOR(_total_len, _caps_num) \\\n  5, TUSB_DESC_BOS, U16_TO_U8S_LE(_total_len), _caps_num\n\n// Device Capability Platform 128-bit UUID + Data\n#define TUD_BOS_PLATFORM_DESCRIPTOR(...) \\\n  4+TU_ARGS_NUM(__VA_ARGS__), TUSB_DESC_DEVICE_CAPABILITY, DEVICE_CAPABILITY_PLATFORM, 0x00, __VA_ARGS__\n\n//------------- WebUSB BOS Platform -------------//\n\n// Descriptor Length\n#define TUD_BOS_WEBUSB_DESC_LEN         24\n\n// Vendor Code, iLandingPage\n#define TUD_BOS_WEBUSB_DESCRIPTOR(_vendor_code, _ipage) \\\n  TUD_BOS_PLATFORM_DESCRIPTOR(TUD_BOS_WEBUSB_UUID, U16_TO_U8S_LE(0x0100), _vendor_code, _ipage)\n\n#define TUD_BOS_WEBUSB_UUID   \\\n  0x38, 0xB6, 0x08, 0x34, 0xA9, 0x09, 0xA0, 0x47, \\\n  0x8B, 0xFD, 0xA0, 0x76, 0x88, 0x15, 0xB6, 0x65\n\n//------------- Microsoft OS 2.0 Platform -------------//\n#define TUD_BOS_MICROSOFT_OS_DESC_LEN   28\n\n// Total Length of descriptor set, vendor code\n#define TUD_BOS_MS_OS_20_DESCRIPTOR(_desc_set_len, _vendor_code) \\\n  TUD_BOS_PLATFORM_DESCRIPTOR(TUD_BOS_MS_OS_20_UUID, U32_TO_U8S_LE(0x06030000), U16_TO_U8S_LE(_desc_set_len), _vendor_code, 0)\n\n#define TUD_BOS_MS_OS_20_UUID \\\n    0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, \\\n  0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor Templates\n//--------------------------------------------------------------------+\n\n#define TUD_CONFIG_DESC_LEN   (9)\n\n// Config number, interface count, string index, total length, attribute, power in mA\n#define TUD_CONFIG_DESCRIPTOR(config_num, _itfcount, _stridx, _total_len, _attribute, _power_ma) \\\n  9, TUSB_DESC_CONFIGURATION, U16_TO_U8S_LE(_total_len), _itfcount, config_num, _stridx, TU_BIT(7) | _attribute, (_power_ma)/2\n\n//--------------------------------------------------------------------+\n// CDC Descriptor Templates\n//--------------------------------------------------------------------+\n\n// Length of template descriptor: 66 bytes\n#define TUD_CDC_DESC_LEN  (8+9+5+5+4+5+7+9+7+7)\n\n// CDC Descriptor Template\n// Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n#define TUD_CDC_DESCRIPTOR(_itfnum, _stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize) \\\n  /* Interface Associate */\\\n  8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, CDC_COMM_PROTOCOL_NONE, 0,\\\n  /* CDC Control Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL, CDC_COMM_PROTOCOL_NONE, _stridx,\\\n  /* CDC Header */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0120),\\\n  /* CDC Call */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_CALL_MANAGEMENT, 0, (uint8_t)((_itfnum) + 1),\\\n  /* CDC ACM: support line request + send break */\\\n  4, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, 6,\\\n  /* CDC Union */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\\\n  /* Endpoint Notification */\\\n  7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 1,\\\n  /* CDC Data Interface */\\\n  9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 2, TUSB_CLASS_CDC_DATA, 0, 0, 0,\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0\n\n//--------------------------------------------------------------------+\n// MSC Descriptor Templates\n//--------------------------------------------------------------------+\n\n// Length of template descriptor: 23 bytes\n#define TUD_MSC_DESC_LEN    (9 + 7 + 7)\n\n// Interface number, string index, EP Out & EP In address, EP size\n#define TUD_MSC_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \\\n  /* Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_MSC, MSC_SUBCLASS_SCSI, MSC_PROTOCOL_BOT, _stridx,\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0\n\n//--------------------------------------------------------------------+\n// Printer Descriptor Templates\n//--------------------------------------------------------------------+\n\n#define TUD_PRINTER_DESC_LEN (9 + 7 + 7)  // one interface, two endpoints\n\n#define TUD_PRINTER_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \\\n  /* Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_PRINTER, 1, 2, _stridx,\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0\n\n//--------------------------------------------------------------------+\n// MTP Descriptor Templates\n//--------------------------------------------------------------------+\n\n// Length of template descriptor: 30 bytes\n#define TUD_MTP_DESC_LEN    (9 + 7 + 7 + 7)\n\n// Interface number, string index, EP event, EP event size, EP event polling, EP Out & EP In address, EP size\n#define TUD_MTP_DESCRIPTOR(_itfnum, _stridx, _ep_evt, _ep_evt_size, _ep_evt_polling_interval, _epout, _epin, _epsize) \\\n  /* Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 3, TUSB_CLASS_IMAGE, MTP_SUBCLASS_STILL_IMAGE, MTP_PROTOCOL_PIMA_15470, _stridx,\\\n  /* Endpoint Interrupt */\\\n  7, TUSB_DESC_ENDPOINT, _ep_evt, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_evt_size), _ep_evt_polling_interval,\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0\n\n\n//--------------------------------------------------------------------+\n// HID Descriptor Templates\n//--------------------------------------------------------------------+\n\n// Length of template descriptor: 25 bytes\n#define TUD_HID_DESC_LEN    (9 + 9 + 7)\n\n// HID Input only descriptor\n// Interface number, string index, protocol, report descriptor len, EP In address, size & polling interval\n#define TUD_HID_DESCRIPTOR(_itfnum, _stridx, _boot_protocol, _report_desc_len, _epin, _epsize, _ep_interval) \\\n  /* Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_HID, (uint8_t)((_boot_protocol != HID_ITF_PROTOCOL_NONE) ? (uint8_t)HID_SUBCLASS_BOOT : 0u), _boot_protocol, _stridx,\\\n  /* HID descriptor */\\\n  9, HID_DESC_TYPE_HID, U16_TO_U8S_LE(0x0111), 0, 1, HID_DESC_TYPE_REPORT, U16_TO_U8S_LE(_report_desc_len),\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval\n\n// Length of template descriptor: 32 bytes\n#define TUD_HID_INOUT_DESC_LEN    (9 + 9 + 7 + 7)\n\n// HID Input & Output descriptor\n// Interface number, string index, protocol, report descriptor len, EP OUT & IN address, size & polling interval\n#define TUD_HID_INOUT_DESCRIPTOR(_itfnum, _stridx, _boot_protocol, _report_desc_len, _epout, _epin, _epsize, _ep_interval) \\\n  /* Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_HID, (uint8_t)((_boot_protocol != HID_ITF_PROTOCOL_NONE) ? (uint8_t)HID_SUBCLASS_BOOT : 0u), _boot_protocol, _stridx,\\\n  /* HID descriptor */\\\n  9, HID_DESC_TYPE_HID, U16_TO_U8S_LE(0x0111), 0, 1, HID_DESC_TYPE_REPORT, U16_TO_U8S_LE(_report_desc_len),\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval, \\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_epsize), _ep_interval\n\n//--------------------------------------------------------------------+\n// MIDI Descriptor Templates\n// Note: MIDI v1.0 is based on Audio v1.0\n//--------------------------------------------------------------------+\n\n#define TUD_MIDI_DESC_HEAD_LEN (9 + 9 + 9 + 7)\n#define TUD_MIDI_DESC_HEAD(_itfnum,  _stridx, _numcables) \\\n  /* Audio Control (AC) Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 0, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_CONTROL, AUDIO_FUNC_PROTOCOL_CODE_UNDEF, _stridx,\\\n  /* AC Header */\\\n  9, TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AC_INTERFACE_HEADER, U16_TO_U8S_LE(0x0100), U16_TO_U8S_LE(0x0009), 1, (uint8_t)((_itfnum) + 1),\\\n  /* MIDI Streaming (MS) Interface */\\\n  9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum) + 1), 0, 2, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_MIDI_STREAMING, AUDIO_FUNC_PROTOCOL_CODE_UNDEF, 0,\\\n  /* MS Header */\\\n  7, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_HEADER, U16_TO_U8S_LE(0x0100), U16_TO_U8S_LE(7 + (_numcables) * TUD_MIDI_DESC_JACK_LEN + 2 * TUD_MIDI_DESC_EP_LEN(_numcables))\n\n#define TUD_MIDI_JACKID_IN_EMB(_cablenum) \\\n  (uint8_t)(((_cablenum) - 1) * 4 + 1)\n\n#define TUD_MIDI_JACKID_IN_EXT(_cablenum) \\\n  (uint8_t)(((_cablenum) - 1) * 4 + 2)\n\n#define TUD_MIDI_JACKID_OUT_EMB(_cablenum) \\\n  (uint8_t)(((_cablenum) - 1) * 4 + 3)\n\n#define TUD_MIDI_JACKID_OUT_EXT(_cablenum) \\\n  (uint8_t)(((_cablenum) - 1) * 4 + 4)\n\n#define TUD_MIDI_DESC_JACK_LEN (6 + 6 + 9 + 9)\n#define TUD_MIDI_DESC_JACK_DESC(_cablenum, _stridx) \\\n  /* MS In Jack (Embedded) */\\\n  6, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_IN_JACK, MIDI_JACK_EMBEDDED, TUD_MIDI_JACKID_IN_EMB(_cablenum), _stridx,\\\n  /* MS In Jack (External) */\\\n  6, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_IN_JACK, MIDI_JACK_EXTERNAL, TUD_MIDI_JACKID_IN_EXT(_cablenum), _stridx,\\\n  /* MS Out Jack (Embedded), connected to In Jack External */\\\n  9, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_OUT_JACK, MIDI_JACK_EMBEDDED, TUD_MIDI_JACKID_OUT_EMB(_cablenum), 1, TUD_MIDI_JACKID_IN_EXT(_cablenum), 1, _stridx,\\\n  /* MS Out Jack (External), connected to In Jack Embedded */\\\n  9, TUSB_DESC_CS_INTERFACE, MIDI_CS_INTERFACE_OUT_JACK, MIDI_JACK_EXTERNAL, TUD_MIDI_JACKID_OUT_EXT(_cablenum), 1, TUD_MIDI_JACKID_IN_EMB(_cablenum), 1, _stridx\n\n#define TUD_MIDI_DESC_JACK(_cablenum) TUD_MIDI_DESC_JACK_DESC(_cablenum, 0)\n\n#define TUD_MIDI_DESC_EP_LEN(_numcables) (9 + 4 + (_numcables))\n#define TUD_MIDI_DESC_EP(_epout, _epsize, _numcables) \\\n  /* Endpoint: Note Audio v1.0's endpoint has 9 bytes instead of 7 */\\\n  9, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0, 0, 0, \\\n  /* MS Endpoint (connected to embedded jack) */\\\n  (uint8_t)(4 + (_numcables)), TUSB_DESC_CS_ENDPOINT, MIDI_CS_ENDPOINT_GENERAL, _numcables\n\n// Length of template descriptor (88 bytes)\n#define TUD_MIDI_DESC_LEN (TUD_MIDI_DESC_HEAD_LEN + TUD_MIDI_DESC_JACK_LEN + TUD_MIDI_DESC_EP_LEN(1) * 2)\n\n// MIDI simple descriptor\n// - 1 Embedded Jack In connected to 1 External Jack Out\n// - 1 Embedded Jack out connected to 1 External Jack In\n#define TUD_MIDI_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \\\n  TUD_MIDI_DESC_HEAD(_itfnum, _stridx, 1),\\\n  TUD_MIDI_DESC_JACK_DESC(1, 0),\\\n  TUD_MIDI_DESC_EP(_epout, _epsize, 1),\\\n  TUD_MIDI_JACKID_IN_EMB(1),\\\n  TUD_MIDI_DESC_EP(_epin, _epsize, 1),\\\n  TUD_MIDI_JACKID_OUT_EMB(1)\n\n//--------------------------------------------------------------------+\n// Audio Descriptor Templates\n//--------------------------------------------------------------------+\n\n\n/* Audio v1.0 Descriptor Templates */\n\n/* Standard AC Interface Descriptor UAC1 (4.3.1) */\n#define TUD_AUDIO10_DESC_STD_AC_LEN 9\n#define TUD_AUDIO10_DESC_STD_AC(_itfnum, _nEPs, _stridx) \\\n  TUD_AUDIO10_DESC_STD_AC_LEN, TUSB_DESC_INTERFACE, _itfnum, 0x00, _nEPs, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_CONTROL, AUDIO_INT_PROTOCOL_CODE_V1, _stridx\n\n/* Class-Specific AC Interface Header Descriptor UAC1 (4.3.2) */\n#define TUD_AUDIO10_DESC_CS_AC_LEN(_nintfs) (8 + (_nintfs))\n// Class-Specific AC Interface Header descriptor, take list of streaming interface numbers as variable arguments\n#define TUD_AUDIO10_DESC_CS_AC(_bcdADC, _totallen, ...) \\\n  TUD_AUDIO10_DESC_CS_AC_LEN(TU_ARGS_NUM(__VA_ARGS__)), TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AC_INTERFACE_HEADER, U16_TO_U8S_LE(_bcdADC), U16_TO_U8S_LE(_totallen + TUD_AUDIO10_DESC_CS_AC_LEN(TU_ARGS_NUM(__VA_ARGS__))), TU_ARGS_NUM(__VA_ARGS__), __VA_ARGS__\n\n/* Input Terminal Descriptor UAC1 (4.3.2.1) */\n#define TUD_AUDIO10_DESC_INPUT_TERM_LEN 12\n#define TUD_AUDIO10_DESC_INPUT_TERM(_termid, _termtype, _assocTerm, _nchannels, _channelcfg, _idxchannelnames, _stridx) \\\n  TUD_AUDIO10_DESC_INPUT_TERM_LEN, TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AC_INTERFACE_INPUT_TERMINAL, _termid, U16_TO_U8S_LE(_termtype), _assocTerm, _nchannels, U16_TO_U8S_LE(_channelcfg), _idxchannelnames, _stridx\n\n/* Output Terminal Descriptor UAC1 (4.3.2.2) */\n#define TUD_AUDIO10_DESC_OUTPUT_TERM_LEN 9\n#define TUD_AUDIO10_DESC_OUTPUT_TERM(_termid, _termtype, _assocTerm, _srcid, _stridx) \\\n  TUD_AUDIO10_DESC_OUTPUT_TERM_LEN, TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AC_INTERFACE_OUTPUT_TERMINAL, _termid, U16_TO_U8S_LE(_termtype), _assocTerm, _srcid, _stridx\n\n/* Mixer Unit Descriptor UAC1 (4.3.2.3) - One Input Pin */\n#define TUD_AUDIO10_DESC_MIXER_UNIT_ONE_PIN_LEN(_ctrlsize) (11 + (_ctrlsize))\n#define TUD_AUDIO10_DESC_MIXER_UNIT_ONE_PIN(_unitid, _srcid, _nrchannels, _channelcfg, _idxchannelnames, _ctrlsize, _stridx, ...) \\\n  TUD_AUDIO10_DESC_MIXER_UNIT_ONE_PIN_LEN(_ctrlsize), TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AC_INTERFACE_MIXER_UNIT, _unitid, 1, _srcid, _nrchannels, U16_TO_U8S_LE(_channelcfg), _idxchannelnames, __VA_ARGS__, _stridx\n\n/* Selector Unit Descriptor UAC1 (4.3.2.4) - One Input Pin */\n#define TUD_AUDIO10_DESC_SELECTOR_UNIT_ONE_PIN_LEN 7\n#define TUD_AUDIO10_DESC_SELECTOR_UNIT_ONE_PIN(_unitid, _srcid, _stridx) \\\n  TUD_AUDIO10_DESC_SELECTOR_UNIT_ONE_PIN_LEN, TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AC_INTERFACE_SELECTOR_UNIT, _unitid, 1, _srcid, _stridx\n\n/* Feature Unit Descriptor UAC1 (4.3.2.5) - Variable Channels */\n#define TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(_nchannels) (7 + ((_nchannels) + 1) * 2)\n// Feature Unit descriptor, take list of control bitmaps for master channel + each channel as variable arguments\n#define TUD_AUDIO10_DESC_FEATURE_UNIT(_unitid, _srcid, _stridx, ...) \\\n  TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(TU_ARGS_NUM(__VA_ARGS__) - 1), TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AC_INTERFACE_FEATURE_UNIT, _unitid, _srcid, 2, TU_ARGS_APPLY_EXPAND(U16_TO_U8S_LE, __VA_ARGS__), _stridx\n\n/* Standard AS Interface Descriptor UAC1 (4.5.1) */\n#define TUD_AUDIO10_DESC_STD_AS_LEN 9\n#define TUD_AUDIO10_DESC_STD_AS_INT(_itfnum, _altset, _nEPs, _stridx) \\\n  TUD_AUDIO10_DESC_STD_AS_LEN, TUSB_DESC_INTERFACE, _itfnum, _altset, _nEPs, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_STREAMING, AUDIO_INT_PROTOCOL_CODE_V1, _stridx\n\n/* Class-Specific AS Interface Descriptor UAC1 (4.5.2) */\n#define TUD_AUDIO10_DESC_CS_AS_INT_LEN 7\n#define TUD_AUDIO10_DESC_CS_AS_INT(_termid, _delay, _formattype) \\\n  TUD_AUDIO10_DESC_CS_AS_INT_LEN, TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AS_INTERFACE_AS_GENERAL, _termid, _delay, U16_TO_U8S_LE(_formattype)\n\n/* Type I Format Type Descriptor UAC1 (2.2.5) */\n#define TUD_AUDIO10_DESC_TYPE_I_FORMAT_LEN(_nfreqs) (8 + (_nfreqs)*3)\n// Type I Format descriptor, take list of sample rates in Hz as variable arguments\n#define TUD_AUDIO10_DESC_TYPE_I_FORMAT(_nrchannels, _subframesize, _bitresolution, ...) \\\n  TUD_AUDIO10_DESC_TYPE_I_FORMAT_LEN(TU_ARGS_NUM(__VA_ARGS__)), TUSB_DESC_CS_INTERFACE, AUDIO10_CS_AS_INTERFACE_FORMAT_TYPE, AUDIO10_FORMAT_TYPE_I, _nrchannels, _subframesize, _bitresolution, TU_ARGS_NUM(__VA_ARGS__), TU_ARGS_APPLY_EXPAND(U24_TO_U8S_LE, __VA_ARGS__)\n\n/* Standard AS Isochronous Audio Data Endpoint Descriptor UAC1 (4.6.1.1) */\n#define TUD_AUDIO10_DESC_STD_AS_ISO_EP_LEN 9\n#define TUD_AUDIO10_DESC_STD_AS_ISO_EP(_ep, _attr, _maxEPsize, _interval, _sync_ep) \\\n  TUD_AUDIO10_DESC_STD_AS_ISO_EP_LEN, TUSB_DESC_ENDPOINT, _ep, _attr, U16_TO_U8S_LE(_maxEPsize), _interval, 0x00, _sync_ep\n\n/* Class-Specific AS Isochronous Audio Data Endpoint Descriptor UAC1 (4.6.1.2) */\n#define TUD_AUDIO10_DESC_CS_AS_ISO_EP_LEN 7\n#define TUD_AUDIO10_DESC_CS_AS_ISO_EP(_attr, _lockdelayunits, _lockdelay) \\\n  TUD_AUDIO10_DESC_CS_AS_ISO_EP_LEN, TUSB_DESC_CS_ENDPOINT, AUDIO10_CS_EP_SUBTYPE_GENERAL, _attr, _lockdelayunits, U16_TO_U8S_LE(_lockdelay)\n\n/* Standard AS Isochronous Synch Endpoint Descriptor UAC1 (4.6.2.1) */\n#define TUD_AUDIO10_DESC_STD_AS_ISO_SYNC_EP_LEN 9\n#define TUD_AUDIO10_DESC_STD_AS_ISO_SYNC_EP(_ep, _bRefresh) \\\n  TUD_AUDIO10_DESC_STD_AS_ISO_SYNC_EP_LEN, TUSB_DESC_ENDPOINT, _ep, TUSB_XFER_ISOCHRONOUS, U16_TO_U8S_LE(3), 1, _bRefresh, 0x00\n\n/* Standard AC Interrupt Endpoint Descriptor UAC1 (4.4.2) */\n#define TUD_AUDIO10_DESC_STD_AC_INT_EP_LEN 9\n#define TUD_AUDIO10_DESC_STD_AC_INT_EP(_ep, _interval) \\\n  TUD_AUDIO10_DESC_STD_AC_INT_EP_LEN, TUSB_DESC_ENDPOINT, _ep, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(2), _interval, 0x00, 0x00\n\n// AUDIO simple descriptor templates for UAC1\n\n// AUDIO simple descriptor (UAC1) for 1 microphone input\n// - 1 Input Terminal, 1 Feature Unit (Mute and Volume Control), 1 Output Terminal\n\n#define TUD_AUDIO10_MIC_ONE_CH_DESC_LEN(_nfreqs) (\\\n  + TUD_AUDIO10_DESC_STD_AC_LEN\\\n  + TUD_AUDIO10_DESC_CS_AC_LEN(1)\\\n  + TUD_AUDIO10_DESC_INPUT_TERM_LEN\\\n  + TUD_AUDIO10_DESC_OUTPUT_TERM_LEN\\\n  + TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(1)\\\n  + TUD_AUDIO10_DESC_STD_AS_LEN\\\n  + TUD_AUDIO10_DESC_STD_AS_LEN\\\n  + TUD_AUDIO10_DESC_CS_AS_INT_LEN\\\n  + TUD_AUDIO10_DESC_TYPE_I_FORMAT_LEN(_nfreqs)\\\n  + TUD_AUDIO10_DESC_STD_AS_ISO_EP_LEN\\\n  + TUD_AUDIO10_DESC_CS_AS_ISO_EP_LEN)\n\n#define TUD_AUDIO10_MIC_ONE_CH_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epin, _epsize, ...) \\\n  /* Standard AC Interface Descriptor(4.3.1) */\\\n  TUD_AUDIO10_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n  /* Class-Specific AC Interface Header Descriptor(4.3.2) */\\\n  TUD_AUDIO10_DESC_CS_AC(/*_bcdADC*/ 0x0100, /*_totallen*/ (TUD_AUDIO10_DESC_INPUT_TERM_LEN+TUD_AUDIO10_DESC_OUTPUT_TERM_LEN+TUD_AUDIO10_DESC_FEATURE_UNIT_LEN(1)), /*_itf*/ ((_itfnum)+1)),\\\n  /* Input Terminal Descriptor(4.3.2.1) */\\\n  TUD_AUDIO10_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ 0x03, /*_nchannels*/ 0x01, /*_channelcfg*/ AUDIO10_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Output Terminal Descriptor(4.3.2.2) */\\\n  TUD_AUDIO10_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x01, /*_srcid*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Feature Unit Descriptor(4.3.2.5) */\\\n  TUD_AUDIO10_DESC_FEATURE_UNIT(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_stridx*/ 0x00, /*_ctrlmaster*/ (AUDIO10_FU_CONTROL_BM_MUTE | AUDIO10_FU_CONTROL_BM_VOLUME), /*_ctrlch1*/ (AUDIO10_FU_CONTROL_BM_MUTE | AUDIO10_FU_CONTROL_BM_VOLUME)),\\\n  /* Standard AS Interface Descriptor(4.5.1) */\\\n  /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n  TUD_AUDIO10_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Standard AS Interface Descriptor(4.5.1) */\\\n  /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n  TUD_AUDIO10_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ 0x00),\\\n  /* Class-Specific AS Interface Descriptor(4.5.2) */\\\n  TUD_AUDIO10_DESC_CS_AS_INT(/*_termid*/ 0x03, /*_delay*/ 0x01, /*_formattype*/ AUDIO10_DATA_FORMAT_TYPE_I_PCM),\\\n  /* Type I Format Type Descriptor(2.2.5) */\\\n  TUD_AUDIO10_DESC_TYPE_I_FORMAT(/*_nrchannels*/ 0x01, /*_subframesize*/ _nBytesPerSample, /*_bitresolution*/ _nBitsUsedPerSample, /*_freq*/ __VA_ARGS__),\\\n  /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.6.1.1) */\\\n  TUD_AUDIO10_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS), /*_maxEPsize*/ _epsize, /*_interval*/ 0x01, /* _sync_ep */ 0x00),\\\n  /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.6.1.2) */\\\n  TUD_AUDIO10_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO10_CS_AS_ISO_DATA_EP_ATT_SAMPLING_FRQ, /*_lockdelayunits*/ AUDIO10_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_MILLISEC, /*_lockdelay*/ 0x0001)\n\n/* Audio v2.0 Descriptor Templates */\n\n/* Standard Interface Association Descriptor (IAD) */\n#define TUD_AUDIO20_DESC_IAD_LEN 8\n#define TUD_AUDIO20_DESC_IAD(_firstitf, _nitfs, _stridx) \\\n  TUD_AUDIO20_DESC_IAD_LEN, TUSB_DESC_INTERFACE_ASSOCIATION, _firstitf, _nitfs, TUSB_CLASS_AUDIO, AUDIO_FUNCTION_SUBCLASS_UNDEFINED, AUDIO_FUNC_PROTOCOL_CODE_V2, _stridx\n\n/* Standard AC Interface Descriptor(4.7.1) */\n#define TUD_AUDIO20_DESC_STD_AC_LEN 9\n#define TUD_AUDIO20_DESC_STD_AC(_itfnum, _nEPs, _stridx) /* _nEPs is 0 or 1 */\\\n  TUD_AUDIO20_DESC_STD_AC_LEN, TUSB_DESC_INTERFACE, _itfnum, /* fixed to zero */ 0x00, _nEPs, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_CONTROL, AUDIO_INT_PROTOCOL_CODE_V2, _stridx\n\n/* Class-Specific AC Interface Header Descriptor(4.7.2) */\n#define TUD_AUDIO20_DESC_CS_AC_LEN 9\n#define TUD_AUDIO20_DESC_CS_AC(_bcdADC, _category, _totallen, _ctrl) /* _bcdADC : Audio Device Class Specification Release Number in Binary-Coded Decimal, _category : see audio20_function_t, _totallen : Total number of bytes returned for the class-specific AudioControl interface i.e. Clock Source, Unit and Terminal descriptors - Do not include TUD_AUDIO20_DESC_CS_AC_LEN, we already do this here*/ \\\n  TUD_AUDIO20_DESC_CS_AC_LEN, TUSB_DESC_CS_INTERFACE, AUDIO20_CS_AC_INTERFACE_HEADER, U16_TO_U8S_LE(_bcdADC), _category, U16_TO_U8S_LE(_totallen + TUD_AUDIO20_DESC_CS_AC_LEN), _ctrl\n\n/* Clock Source Descriptor(4.7.2.1) */\n#define TUD_AUDIO20_DESC_CLK_SRC_LEN 8\n#define TUD_AUDIO20_DESC_CLK_SRC(_clkid, _attr, _ctrl, _assocTerm, _stridx) \\\n  TUD_AUDIO20_DESC_CLK_SRC_LEN, TUSB_DESC_CS_INTERFACE, AUDIO20_CS_AC_INTERFACE_CLOCK_SOURCE, _clkid, _attr, _ctrl, _assocTerm, _stridx\n\n/* Input Terminal Descriptor(4.7.2.4) */\n#define TUD_AUDIO20_DESC_INPUT_TERM_LEN 17\n#define TUD_AUDIO20_DESC_INPUT_TERM(_termid, _termtype, _assocTerm, _clkid, _nchannelslogical, _channelcfg, _idxchannelnames, _ctrl, _stridx) \\\n  TUD_AUDIO20_DESC_INPUT_TERM_LEN, TUSB_DESC_CS_INTERFACE, AUDIO20_CS_AC_INTERFACE_INPUT_TERMINAL, _termid, U16_TO_U8S_LE(_termtype), _assocTerm, _clkid, _nchannelslogical, U32_TO_U8S_LE(_channelcfg), _idxchannelnames, U16_TO_U8S_LE(_ctrl), _stridx\n\n/* Output Terminal Descriptor(4.7.2.5) */\n#define TUD_AUDIO20_DESC_OUTPUT_TERM_LEN 12\n#define TUD_AUDIO20_DESC_OUTPUT_TERM(_termid, _termtype, _assocTerm, _srcid, _clkid, _ctrl, _stridx) \\\n  TUD_AUDIO20_DESC_OUTPUT_TERM_LEN, TUSB_DESC_CS_INTERFACE, AUDIO20_CS_AC_INTERFACE_OUTPUT_TERMINAL, _termid, U16_TO_U8S_LE(_termtype), _assocTerm, _srcid, _clkid, U16_TO_U8S_LE(_ctrl), _stridx\n\n/* Feature Unit Descriptor(4.7.2.8) */\n#define TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(_nchannels) (6 + ((_nchannels) + 1) * 4)\n#define TUD_AUDIO20_DESC_FEATURE_UNIT(_unitid, _srcid, _stridx, ...) \\\n  TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(TU_ARGS_NUM(__VA_ARGS__) - 1), TUSB_DESC_CS_INTERFACE, AUDIO20_CS_AC_INTERFACE_FEATURE_UNIT, _unitid, _srcid, TU_ARGS_APPLY_EXPAND(U32_TO_U8S_LE, __VA_ARGS__), _stridx\n\n/* Standard AC Interrupt Endpoint Descriptor(4.8.2.1) */\n#define TUD_AUDIO20_DESC_STD_AC_INT_EP_LEN 7\n#define TUD_AUDIO20_DESC_STD_AC_INT_EP(_ep, _interval) \\\n  TUD_AUDIO20_DESC_STD_AC_INT_EP_LEN, TUSB_DESC_ENDPOINT, _ep, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(6), _interval\n\n/* Standard AS Interface Descriptor(4.9.1) */\n#define TUD_AUDIO20_DESC_STD_AS_LEN 9\n#define TUD_AUDIO20_DESC_STD_AS_INT(_itfnum, _altset, _nEPs, _stridx) \\\n  TUD_AUDIO20_DESC_STD_AS_LEN, TUSB_DESC_INTERFACE, _itfnum, _altset, _nEPs, TUSB_CLASS_AUDIO, AUDIO_SUBCLASS_STREAMING, AUDIO_INT_PROTOCOL_CODE_V2, _stridx\n\n/* Class-Specific AS Interface Descriptor(4.9.2) */\n#define TUD_AUDIO20_DESC_CS_AS_INT_LEN 16\n#define TUD_AUDIO20_DESC_CS_AS_INT(_termid, _ctrl, _formattype, _formats, _nchannelsphysical, _channelcfg, _stridx) \\\n  TUD_AUDIO20_DESC_CS_AS_INT_LEN, TUSB_DESC_CS_INTERFACE, AUDIO20_CS_AS_INTERFACE_AS_GENERAL, _termid, _ctrl, _formattype, U32_TO_U8S_LE(_formats), _nchannelsphysical, U32_TO_U8S_LE(_channelcfg), _stridx\n\n/* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\n#define TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN 6\n#define TUD_AUDIO20_DESC_TYPE_I_FORMAT(_subslotsize, _bitresolution) /* _subslotsize is number of bytes per sample (i.e. subslot) and can be 1,2,3, or 4 */\\\n  TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN, TUSB_DESC_CS_INTERFACE, AUDIO20_CS_AS_INTERFACE_FORMAT_TYPE, AUDIO20_FORMAT_TYPE_I, _subslotsize, _bitresolution\n\n/* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\n#define TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN 7\n#define TUD_AUDIO20_DESC_STD_AS_ISO_EP(_ep, _attr, _maxEPsize, _interval) \\\n  TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN, TUSB_DESC_ENDPOINT, _ep, _attr, U16_TO_U8S_LE(_maxEPsize), _interval\n\n/* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\n#define TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN 8\n#define TUD_AUDIO20_DESC_CS_AS_ISO_EP(_attr, _ctrl, _lockdelayunit, _lockdelay) \\\n  TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN, TUSB_DESC_CS_ENDPOINT, AUDIO20_CS_EP_SUBTYPE_GENERAL, _attr, _ctrl, _lockdelayunit, U16_TO_U8S_LE(_lockdelay)\n\n/* Standard AS Isochronous Feedback Endpoint Descriptor(4.10.2.1) */\n#define TUD_AUDIO20_DESC_STD_AS_ISO_FB_EP_LEN 7\n#define TUD_AUDIO20_DESC_STD_AS_ISO_FB_EP(_ep, _epsize, _interval) \\\n  TUD_AUDIO20_DESC_STD_AS_ISO_FB_EP_LEN, TUSB_DESC_ENDPOINT, _ep, (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_NO_SYNC | (uint8_t)TUSB_ISO_EP_ATT_EXPLICIT_FB), U16_TO_U8S_LE(_epsize), _interval\n\n// AUDIO simple descriptor (UAC2) for 1 microphone input\n// - 1 Input Terminal, 1 Feature Unit (Mute and Volume Control), 1 Output Terminal, 1 Clock Source\n\n#define TUD_AUDIO20_MIC_ONE_CH_DESC_LEN (TUD_AUDIO20_DESC_IAD_LEN\\\n  + TUD_AUDIO20_DESC_STD_AC_LEN\\\n  + TUD_AUDIO20_DESC_CS_AC_LEN\\\n  + TUD_AUDIO20_DESC_CLK_SRC_LEN\\\n  + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n  + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n  + TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(1)\\\n  + TUD_AUDIO20_DESC_STD_AS_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_LEN\\\n  + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n  + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n  + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN)\n\n#define TUD_AUDIO20_MIC_ONE_CH_DESC_N_AS_INT 1 \t// Number of AS interfaces\n\n#define TUD_AUDIO20_MIC_ONE_CH_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epin, _epsize) \\\n  /* Standard Interface Association Descriptor (IAD) */\\\n  TUD_AUDIO20_DESC_IAD(/*_firstitf*/ _itfnum, /*_nitfs*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Standard AC Interface Descriptor(4.7.1) */\\\n  TUD_AUDIO20_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n  /* Class-Specific AC Interface Header Descriptor(4.7.2) */\\\n  TUD_AUDIO20_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO20_FUNC_MICROPHONE, /*_totallen*/ TUD_AUDIO20_DESC_CLK_SRC_LEN+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN+TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(1), /*_ctrl*/ AUDIO20_CS_AS_INTERFACE_CTRL_LATENCY_POS),\\\n  /* Clock Source Descriptor(4.7.2.1) */\\\n  TUD_AUDIO20_DESC_CLK_SRC(/*_clkid*/ 0x04, /*_attr*/ AUDIO20_CLOCK_SOURCE_ATT_INT_FIX_CLK, /*_ctrl*/ (AUDIO20_CTRL_R << AUDIO20_CLOCK_SOURCE_CTRL_CLK_FRQ_POS), /*_assocTerm*/ 0x01,  /*_stridx*/ 0x00),\\\n  /* Input Terminal Descriptor(4.7.2.4) */\\\n  TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ 0x03, /*_clkid*/ 0x04, /*_nchannelslogical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS, /*_stridx*/ 0x00),\\\n  /* Output Terminal Descriptor(4.7.2.5) */\\\n  TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x01, /*_srcid*/ 0x02, /*_clkid*/ 0x04, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n  /* Feature Unit Descriptor(4.7.2.8) */\\\n  TUD_AUDIO20_DESC_FEATURE_UNIT(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_stridx*/ 0x00, /*_ctrlch0master*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch1*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ 0x00),\\\n  /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ 0x03, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n  /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n  TUD_AUDIO20_DESC_TYPE_I_FORMAT(_nBytesPerSample, _nBitsUsedPerSample),\\\n  /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n  TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ _epsize, /*_interval*/ 0x01),\\\n  /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000)\n\n// AUDIO simple descriptor (UAC2) for 4 microphone input\n// - 1 Input Terminal, 1 Feature Unit (Mute and Volume Control), 1 Output Terminal, 1 Clock Source\n\n#define TUD_AUDIO20_MIC_FOUR_CH_DESC_LEN (TUD_AUDIO20_DESC_IAD_LEN\\\n  + TUD_AUDIO20_DESC_STD_AC_LEN\\\n  + TUD_AUDIO20_DESC_CS_AC_LEN\\\n  + TUD_AUDIO20_DESC_CLK_SRC_LEN\\\n  + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n  + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n  + TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(4)\\\n  + TUD_AUDIO20_DESC_STD_AS_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_LEN\\\n  + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n  + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n  + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN)\n\n#define TUD_AUDIO20_MIC_FOUR_CH_DESC_N_AS_INT 1   // Number of AS interfaces\n\n#define TUD_AUDIO20_MIC_FOUR_CH_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epin, _epsize) \\\n  /* Standard Interface Association Descriptor (IAD) */\\\n  TUD_AUDIO20_DESC_IAD(/*_firstitf*/ _itfnum, /*_nitfs*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Standard AC Interface Descriptor(4.7.1) */\\\n  TUD_AUDIO20_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n  /* Class-Specific AC Interface Header Descriptor(4.7.2) */\\\n  TUD_AUDIO20_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO20_FUNC_MICROPHONE, /*_totallen*/ TUD_AUDIO20_DESC_CLK_SRC_LEN+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN+TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(4), /*_ctrl*/ AUDIO20_CS_AS_INTERFACE_CTRL_LATENCY_POS),\\\n  /* Clock Source Descriptor(4.7.2.1) */\\\n  TUD_AUDIO20_DESC_CLK_SRC(/*_clkid*/ 0x04, /*_attr*/ AUDIO20_CLOCK_SOURCE_ATT_INT_FIX_CLK, /*_ctrl*/ (AUDIO20_CTRL_R << AUDIO20_CLOCK_SOURCE_CTRL_CLK_FRQ_POS), /*_assocTerm*/ 0x01,  /*_stridx*/ 0x00),\\\n  /* Input Terminal Descriptor(4.7.2.4) */\\\n  TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_IN_GENERIC_MIC, /*_assocTerm*/ 0x03, /*_clkid*/ 0x04, /*_nchannelslogical*/ 0x04, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS, /*_stridx*/ 0x00),\\\n  /* Output Terminal Descriptor(4.7.2.5) */\\\n  TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x01, /*_srcid*/ 0x02, /*_clkid*/ 0x04, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n  /* Feature Unit Descriptor(4.7.2.8) */\\\n  TUD_AUDIO20_DESC_FEATURE_UNIT(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_stridx*/ 0x00, /*_ctrlch0master*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch1*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch2*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch3*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch4*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum)+1), /*_altset*/ 0x01, /*_nEPs*/ 0x01, /*_stridx*/ 0x00),\\\n  /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ 0x03, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x04, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n  /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n  TUD_AUDIO20_DESC_TYPE_I_FORMAT(_nBytesPerSample, _nBitsUsedPerSample),\\\n  /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n  TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epin, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ _epsize, /*_interval*/ 0x01),\\\n  /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000)\n\n// AUDIO simple descriptor (UAC2) for mono speaker\n// - 1 Input Terminal, 2 Feature Unit (Mute and Volume Control), 3 Output Terminal, 4 Clock Source\n\n#define TUD_AUDIO20_SPEAKER_MONO_FB_DESC_LEN (TUD_AUDIO20_DESC_IAD_LEN\\\n  + TUD_AUDIO20_DESC_STD_AC_LEN\\\n  + TUD_AUDIO20_DESC_CS_AC_LEN\\\n  + TUD_AUDIO20_DESC_CLK_SRC_LEN\\\n  + TUD_AUDIO20_DESC_INPUT_TERM_LEN\\\n  + TUD_AUDIO20_DESC_OUTPUT_TERM_LEN\\\n  + TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(1)\\\n  + TUD_AUDIO20_DESC_STD_AS_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_LEN\\\n  + TUD_AUDIO20_DESC_CS_AS_INT_LEN\\\n  + TUD_AUDIO20_DESC_TYPE_I_FORMAT_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_ISO_EP_LEN\\\n  + TUD_AUDIO20_DESC_CS_AS_ISO_EP_LEN\\\n  + TUD_AUDIO20_DESC_STD_AS_ISO_FB_EP_LEN)\n\n#define TUD_AUDIO20_SPEAKER_MONO_FB_DESCRIPTOR(_itfnum, _stridx, _nBytesPerSample, _nBitsUsedPerSample, _epout, _epoutsize, _epfb, _epfbsize) \\\n  /* Standard Interface Association Descriptor (IAD) */\\\n  TUD_AUDIO20_DESC_IAD(/*_firstitf*/ _itfnum, /*_nitfs*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Standard AC Interface Descriptor(4.7.1) */\\\n  TUD_AUDIO20_DESC_STD_AC(/*_itfnum*/ _itfnum, /*_nEPs*/ 0x00, /*_stridx*/ _stridx),\\\n  /* Class-Specific AC Interface Header Descriptor(4.7.2) */\\\n  TUD_AUDIO20_DESC_CS_AC(/*_bcdADC*/ 0x0200, /*_category*/ AUDIO20_FUNC_DESKTOP_SPEAKER, /*_totallen*/ TUD_AUDIO20_DESC_CLK_SRC_LEN+TUD_AUDIO20_DESC_INPUT_TERM_LEN+TUD_AUDIO20_DESC_OUTPUT_TERM_LEN+TUD_AUDIO20_DESC_FEATURE_UNIT_LEN(1), /*_ctrl*/ AUDIO20_CS_AS_INTERFACE_CTRL_LATENCY_POS),\\\n  /* Clock Source Descriptor(4.7.2.1) */\\\n  TUD_AUDIO20_DESC_CLK_SRC(/*_clkid*/ 0x04, /*_attr*/ AUDIO20_CLOCK_SOURCE_ATT_INT_FIX_CLK, /*_ctrl*/ (AUDIO20_CTRL_R << AUDIO20_CLOCK_SOURCE_CTRL_CLK_FRQ_POS), /*_assocTerm*/ 0x01,  /*_stridx*/ 0x00),\\\n  /* Input Terminal Descriptor(4.7.2.4) */\\\n  TUD_AUDIO20_DESC_INPUT_TERM(/*_termid*/ 0x01, /*_termtype*/ AUDIO_TERM_TYPE_USB_STREAMING, /*_assocTerm*/ 0x00, /*_clkid*/ 0x04, /*_nchannelslogical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_idxchannelnames*/ 0x00, /*_ctrl*/ 0 * (AUDIO20_CTRL_R << AUDIO20_IN_TERM_CTRL_CONNECTOR_POS), /*_stridx*/ 0x00),\\\n  /* Output Terminal Descriptor(4.7.2.5) */\\\n  TUD_AUDIO20_DESC_OUTPUT_TERM(/*_termid*/ 0x03, /*_termtype*/ AUDIO_TERM_TYPE_OUT_DESKTOP_SPEAKER, /*_assocTerm*/ 0x01, /*_srcid*/ 0x02, /*_clkid*/ 0x04, /*_ctrl*/ 0x0000, /*_stridx*/ 0x00),\\\n  /* Feature Unit Descriptor(4.7.2.8) */\\\n  TUD_AUDIO20_DESC_FEATURE_UNIT(/*_unitid*/ 0x02, /*_srcid*/ 0x01, /*_stridx*/ 0x00, /*_ctrlch0master*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS, /*_ctrlch1*/ AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_MUTE_POS | AUDIO20_CTRL_RW << AUDIO20_FEATURE_UNIT_CTRL_VOLUME_POS),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 0 - default alternate setting with 0 bandwidth */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum) + 1), /*_altset*/ 0x00, /*_nEPs*/ 0x00, /*_stridx*/ 0x00),\\\n  /* Standard AS Interface Descriptor(4.9.1) */\\\n  /* Interface 1, Alternate 1 - alternate interface for data streaming */\\\n  TUD_AUDIO20_DESC_STD_AS_INT(/*_itfnum*/ (uint8_t)((_itfnum) + 1), /*_altset*/ 0x01, /*_nEPs*/ 0x02, /*_stridx*/ 0x00),\\\n  /* Class-Specific AS Interface Descriptor(4.9.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_INT(/*_termid*/ 0x01, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_formattype*/ AUDIO20_FORMAT_TYPE_I, /*_formats*/ AUDIO20_DATA_FORMAT_TYPE_I_PCM, /*_nchannelsphysical*/ 0x01, /*_channelcfg*/ AUDIO20_CHANNEL_CONFIG_NON_PREDEFINED, /*_stridx*/ 0x00),\\\n  /* Type I Format Type Descriptor(2.3.1.6 - Audio Formats) */\\\n  TUD_AUDIO20_DESC_TYPE_I_FORMAT(_nBytesPerSample, _nBitsUsedPerSample),\\\n  /* Standard AS Isochronous Audio Data Endpoint Descriptor(4.10.1.1) */\\\n  TUD_AUDIO20_DESC_STD_AS_ISO_EP(/*_ep*/ _epout, /*_attr*/ (uint8_t) ((uint8_t)TUSB_XFER_ISOCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_ASYNCHRONOUS | (uint8_t)TUSB_ISO_EP_ATT_DATA), /*_maxEPsize*/ _epoutsize, /*_interval*/ 0x01),\\\n  /* Class-Specific AS Isochronous Audio Data Endpoint Descriptor(4.10.1.2) */\\\n  TUD_AUDIO20_DESC_CS_AS_ISO_EP(/*_attr*/ AUDIO20_CS_AS_ISO_DATA_EP_ATT_NON_MAX_PACKETS_OK, /*_ctrl*/ AUDIO20_CTRL_NONE, /*_lockdelayunit*/ AUDIO20_CS_AS_ISO_DATA_EP_LOCK_DELAY_UNIT_UNDEFINED, /*_lockdelay*/ 0x0000),\\\n  /* Standard AS Isochronous Feedback Endpoint Descriptor(4.10.2.1) */\\\n  TUD_AUDIO20_DESC_STD_AS_ISO_FB_EP(/*_ep*/ _epfb, /*_epsize*/ _epfbsize, /*_interval*/ 1)\n\n//   Calculate wMaxPacketSize of Endpoints\n#define TUD_AUDIO_EP_SIZE(_is_highspeed, _maxFrequency, _nBytesPerSample, _nChannels) \\\n    (((((_maxFrequency) + ((_is_highspeed) ? 7999 : 999)) / ((_is_highspeed) ? 8000 : 1000)) + 1) * (_nBytesPerSample) * (_nChannels))\n\n\n//--------------------------------------------------------------------+\n// USBTMC/USB488 Descriptor Templates\n//--------------------------------------------------------------------+\n\n#define TUD_USBTMC_APP_CLASS    (TUSB_CLASS_APPLICATION_SPECIFIC)\n#define TUD_USBTMC_APP_SUBCLASS 0x03u\n\n#define TUD_USBTMC_PROTOCOL_STD    0x00u\n#define TUD_USBTMC_PROTOCOL_USB488 0x01u\n\n//   Interface number, number of endpoints, EP string index, USB_TMC_PROTOCOL*, bulk-out endpoint ID,\n//   bulk-in endpoint ID\n#define TUD_USBTMC_IF_DESCRIPTOR(_itfnum, _bNumEndpoints, _stridx, _itfProtocol) \\\n  /* Interface */ \\\n  0x09, TUSB_DESC_INTERFACE, _itfnum, 0x00, _bNumEndpoints, TUD_USBTMC_APP_CLASS, TUD_USBTMC_APP_SUBCLASS, _itfProtocol, _stridx\n\n#define TUD_USBTMC_IF_DESCRIPTOR_LEN 9u\n\n#define TUD_USBTMC_BULK_DESCRIPTORS(_epout, _epin, _bulk_epsize) \\\n  /* Endpoint Out */ \\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u, \\\n  /* Endpoint In */ \\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_bulk_epsize), 0u\n\n#define TUD_USBTMC_BULK_DESCRIPTORS_LEN (7u+7u)\n\n/* optional interrupt endpoint */ \\\n// _int_pollingInterval : for LS/FS, expressed in frames (1ms each). 16 may be a good number?\n#define TUD_USBTMC_INT_DESCRIPTOR(_ep_interrupt, _ep_interrupt_size, _int_pollingInterval ) \\\n  7, TUSB_DESC_ENDPOINT, _ep_interrupt, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_interrupt_size), _int_pollingInterval\n\n#define TUD_USBTMC_INT_DESCRIPTOR_LEN (7u)\n\n//--------------------------------------------------------------------+\n// Vendor Descriptor Templates\n//--------------------------------------------------------------------+\n\n#define TUD_VENDOR_DESC_LEN  (9+7+7)\n\n// Interface number, string index, EP Out & IN address, EP size\n#define TUD_VENDOR_DESCRIPTOR(_itfnum, _stridx, _epout, _epin, _epsize) \\\n  /* Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 2, TUSB_CLASS_VENDOR_SPECIFIC, 0x00, 0x00, _stridx,\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0\n\n//--------------------------------------------------------------------+\n// DFU Runtime Descriptor Templates\n//--------------------------------------------------------------------+\n\n#define TUD_DFU_APP_CLASS    (TUSB_CLASS_APPLICATION_SPECIFIC)\n#define TUD_DFU_APP_SUBCLASS (APP_SUBCLASS_DFU_RUNTIME)\n\n// Length of template descriptr: 18 bytes\n#define TUD_DFU_RT_DESC_LEN (9 + 9)\n\n// DFU runtime descriptor\n// Interface number, string index, attributes, detach timeout, transfer size\n#define TUD_DFU_RT_DESCRIPTOR(_itfnum, _stridx, _attr, _timeout, _xfer_size) \\\n  /* Interface */ \\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 0, TUD_DFU_APP_CLASS, TUD_DFU_APP_SUBCLASS, DFU_PROTOCOL_RT, _stridx, \\\n  /* Function */ \\\n  9, DFU_DESC_FUNCTIONAL, _attr, U16_TO_U8S_LE(_timeout), U16_TO_U8S_LE(_xfer_size), U16_TO_U8S_LE(0x0110)\n\n//--------------------------------------------------------------------+\n// DFU Descriptor Templates\n//--------------------------------------------------------------------+\n\n// Length of template descriptor: 9 bytes + number of alternatives * 9\n#define TUD_DFU_DESC_LEN(_alt_count)    (9 + (_alt_count) * 9)\n\n// Interface number, Alternate count, starting string index, attributes, detach timeout, transfer size\n// Note: Alternate count must be numeric or macro, string index is increased by one for each Alt interface\n#define TUD_DFU_DESCRIPTOR(_itfnum, _alt_count, _stridx, _attr, _timeout, _xfer_size) \\\n  TU_XSTRCAT(TUD_DFU_ALT_,_alt_count)(_itfnum, 0, _stridx), \\\n  /* Function */ \\\n  9, DFU_DESC_FUNCTIONAL, _attr, U16_TO_U8S_LE(_timeout), U16_TO_U8S_LE(_xfer_size), U16_TO_U8S_LE(0x0110)\n\n#define TUD_DFU_ALT(_itfnum, _alt, _stridx) \\\n  /* Interface */ \\\n  9, TUSB_DESC_INTERFACE, _itfnum, _alt, 0, TUD_DFU_APP_CLASS, TUD_DFU_APP_SUBCLASS, DFU_PROTOCOL_DFU, _stridx\n\n#define TUD_DFU_ALT_1(_itfnum, _alt_count, _stridx) \\\n  TUD_DFU_ALT(_itfnum, _alt_count, _stridx)\n\n#define TUD_DFU_ALT_2(_itfnum, _alt_count, _stridx) \\\n  TUD_DFU_ALT(_itfnum, _alt_count, _stridx),      \\\n  TUD_DFU_ALT_1(_itfnum, _alt_count+1, _stridx+1)\n\n#define TUD_DFU_ALT_3(_itfnum, _alt_count, _stridx) \\\n  TUD_DFU_ALT(_itfnum, _alt_count, _stridx),      \\\n  TUD_DFU_ALT_2(_itfnum, _alt_count+1, _stridx+1)\n\n#define TUD_DFU_ALT_4(_itfnum, _alt_count, _stridx) \\\n  TUD_DFU_ALT(_itfnum, _alt_count, _stridx),      \\\n  TUD_DFU_ALT_3(_itfnum, _alt_count+1, _stridx+1)\n\n#define TUD_DFU_ALT_5(_itfnum, _alt_count, _stridx) \\\n  TUD_DFU_ALT(_itfnum, _alt_count, _stridx),      \\\n  TUD_DFU_ALT_4(_itfnum, _alt_count+1, _stridx+1)\n\n#define TUD_DFU_ALT_6(_itfnum, _alt_count, _stridx) \\\n  TUD_DFU_ALT(_itfnum, _alt_count, _stridx),      \\\n  TUD_DFU_ALT_5(_itfnum, _alt_count+1, _stridx+1)\n\n#define TUD_DFU_ALT_7(_itfnum, _alt_count, _stridx) \\\n  TUD_DFU_ALT(_itfnum, _alt_count, _stridx),      \\\n  TUD_DFU_ALT_6(_itfnum, _alt_count+1, _stridx+1)\n\n#define TUD_DFU_ALT_8(_itfnum, _alt_count, _stridx) \\\n  TUD_DFU_ALT(_itfnum, _alt_count, _stridx),      \\\n  TUD_DFU_ALT_7(_itfnum, _alt_count+1, _stridx+1)\n\n//--------------------------------------------------------------------+\n// CDC-ECM Descriptor Templates\n//--------------------------------------------------------------------+\n\n// Length of template descriptor: 71 bytes\n#define TUD_CDC_ECM_DESC_LEN  (8+9+5+5+13+7+9+9+7+7)\n\n// CDC-ECM Descriptor Template\n// Interface number, description string index, MAC address string index, EP notification address and size, EP data address (out, in), and size, max segment size.\n#define TUD_CDC_ECM_DESCRIPTOR(_itfnum, _desc_stridx, _mac_stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize, _maxsegmentsize) \\\n  /* Interface Association */\\\n  8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ETHERNET_CONTROL_MODEL, 0, 0,\\\n  /* CDC Control Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_ETHERNET_CONTROL_MODEL, 0, _desc_stridx,\\\n  /* CDC-ECM Header */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0120),\\\n  /* CDC-ECM Union */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\\\n  /* CDC-ECM Functional Descriptor */\\\n  13, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ETHERNET_NETWORKING, _mac_stridx, 0, 0, 0, 0, U16_TO_U8S_LE(_maxsegmentsize), U16_TO_U8S_LE(0), 0,\\\n  /* Endpoint Notification */\\\n  7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 1,\\\n  /* CDC Data Interface (default inactive) */\\\n  9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 0, TUSB_CLASS_CDC_DATA, 0, 0, 0,\\\n  /* CDC Data Interface (alternative active) */\\\n  9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 1, 2, TUSB_CLASS_CDC_DATA, 0, 0, 0,\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0\n\n//--------------------------------------------------------------------+\n// RNDIS Descriptor Templates\n//--------------------------------------------------------------------+\n\n#if 0\n/* Windows XP */\n#define TUD_RNDIS_ITF_CLASS    TUSB_CLASS_CDC\n#define TUD_RNDIS_ITF_SUBCLASS CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL\n#define TUD_RNDIS_ITF_PROTOCOL 0xFF /* CDC_COMM_PROTOCOL_MICROSOFT_RNDIS */\n#else\n/* Windows 7+ */\n#define TUD_RNDIS_ITF_CLASS    TUSB_CLASS_WIRELESS_CONTROLLER\n#define TUD_RNDIS_ITF_SUBCLASS 0x01\n#define TUD_RNDIS_ITF_PROTOCOL 0x03\n#endif\n\n// Length of template descriptor: 66 bytes\n#define TUD_RNDIS_DESC_LEN  (8+9+5+5+4+5+7+9+7+7)\n\n// RNDIS Descriptor Template\n// Interface number, string index, EP notification address and size, EP data address (out, in) and size.\n#define TUD_RNDIS_DESCRIPTOR(_itfnum, _stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize) \\\n  /* Interface Association */\\\n  8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUD_RNDIS_ITF_CLASS, TUD_RNDIS_ITF_SUBCLASS, TUD_RNDIS_ITF_PROTOCOL, 0,\\\n  /* CDC Control Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUD_RNDIS_ITF_CLASS, TUD_RNDIS_ITF_SUBCLASS, TUD_RNDIS_ITF_PROTOCOL, _stridx,\\\n  /* CDC-ACM Header */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0110),\\\n  /* CDC Call Management */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_CALL_MANAGEMENT, 0, (uint8_t)((_itfnum) + 1),\\\n  /* ACM */\\\n  4, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT, 0,\\\n  /* CDC Union */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\\\n  /* Endpoint Notification */\\\n  7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 1,\\\n  /* CDC Data Interface */\\\n  9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 2, TUSB_CLASS_CDC_DATA, 0, 0, 0,\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0\n\n//--------------------------------------------------------------------+\n// Bluetooth Radio Descriptor Templates\n//--------------------------------------------------------------------+\n\n#define TUD_BT_APP_CLASS                    (TUSB_CLASS_WIRELESS_CONTROLLER)\n#define TUD_BT_APP_SUBCLASS                 0x01\n#define TUD_BT_PROTOCOL_PRIMARY_CONTROLLER  0x01\n#define TUD_BT_PROTOCOL_AMP_CONTROLLER      0x02\n\n// Length of template descriptor: 38 bytes + number of ISO alternatives * 23\n#define TUD_BTH_DESC_LEN (8 + 9 + 7 + 7 + 7 + (CFG_TUD_BTH_ISO_ALT_COUNT) * (9 + 7 + 7))\n\n/* Primary Interface */\n#define TUD_BTH_PRI_ITF(_itfnum, _stridx, _ep_evt, _ep_evt_size, _ep_evt_interval, _ep_in, _ep_out, _ep_size) \\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 3, TUD_BT_APP_CLASS, TUD_BT_APP_SUBCLASS, TUD_BT_PROTOCOL_PRIMARY_CONTROLLER, _stridx, \\\n  /* Endpoint In for events */ \\\n  7, TUSB_DESC_ENDPOINT, _ep_evt, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_evt_size), _ep_evt_interval, \\\n  /* Endpoint In for ACL data */ \\\n  7, TUSB_DESC_ENDPOINT, _ep_in, TUSB_XFER_BULK, U16_TO_U8S_LE(_ep_size), 1, \\\n  /* Endpoint Out for ACL data */ \\\n  7, TUSB_DESC_ENDPOINT, _ep_out, TUSB_XFER_BULK, U16_TO_U8S_LE(_ep_size), 1\n\n#define TUD_BTH_ISO_ITF(_itfnum, _alt, _ep_in, _ep_out, _n) ,\\\n  /* Interface with 2 endpoints */ \\\n  9, TUSB_DESC_INTERFACE, _itfnum, _alt, 2, TUD_BT_APP_CLASS, TUD_BT_APP_SUBCLASS, TUD_BT_PROTOCOL_PRIMARY_CONTROLLER, 0, \\\n  /* Isochronous endpoints */ \\\n  7, TUSB_DESC_ENDPOINT, _ep_in, TUSB_XFER_ISOCHRONOUS, U16_TO_U8S_LE(_n), 1, \\\n  7, TUSB_DESC_ENDPOINT, _ep_out, TUSB_XFER_ISOCHRONOUS, U16_TO_U8S_LE(_n), 1\n\n#define _FIRST(a, ...) a\n#define _REST(a, ...) __VA_ARGS__\n\n#define TUD_BTH_ISO_ITF_0(_itfnum, ...)\n#define TUD_BTH_ISO_ITF_1(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 1, _ep_in, _ep_out, _FIRST(__VA_ARGS__))\n#define TUD_BTH_ISO_ITF_2(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 2, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \\\n  TUD_BTH_ISO_ITF_1(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))\n#define TUD_BTH_ISO_ITF_3(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 3, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \\\n  TUD_BTH_ISO_ITF_2(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))\n#define TUD_BTH_ISO_ITF_4(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 4, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \\\n  TUD_BTH_ISO_ITF_3(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))\n#define TUD_BTH_ISO_ITF_5(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 5, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \\\n  TUD_BTH_ISO_ITF_4(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))\n#define TUD_BTH_ISO_ITF_6(_itfnum, _ep_in, _ep_out, ...) TUD_BTH_ISO_ITF(_itfnum, (CFG_TUD_BTH_ISO_ALT_COUNT) - 6, _ep_in, _ep_out, _FIRST(__VA_ARGS__)) \\\n  TUD_BTH_ISO_ITF_5(_itfnum, _ep_in, _ep_out, _REST(__VA_ARGS__))\n\n#define TUD_BTH_ISO_ITFS(_itfnum, _ep_in, _ep_out, ...) \\\n  TU_XSTRCAT(TUD_BTH_ISO_ITF_, CFG_TUD_BTH_ISO_ALT_COUNT)(_itfnum, _ep_in, _ep_out, __VA_ARGS__)\n\n// BT Primary controller descriptor\n// Interface number, string index, attributes, event endpoint, event endpoint size, interval, data in, data out, data endpoint size, iso endpoint sizes\n// TODO BTH should also use IAD like CDC for composite device\n#define TUD_BTH_DESCRIPTOR(_itfnum, _stridx, _ep_evt, _ep_evt_size, _ep_evt_interval, _ep_in, _ep_out, _ep_size,...) \\\n  /* Interface Associate */\\\n  8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUD_BT_APP_CLASS, TUD_BT_APP_SUBCLASS, TUD_BT_PROTOCOL_PRIMARY_CONTROLLER, 0,\\\n  TUD_BTH_PRI_ITF(_itfnum, _stridx, _ep_evt, _ep_evt_size, _ep_evt_interval, _ep_in, _ep_out, _ep_size) \\\n  TUD_BTH_ISO_ITFS(_itfnum + 1, _ep_in + 1, _ep_out + 1, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// CDC-NCM Descriptor Templates\n//--------------------------------------------------------------------+\n\n// Length of template descriptor\n#define TUD_CDC_NCM_DESC_LEN  (8+9+5+5+13+6+7+9+9+7+7)\n\n// CDC-ECM Descriptor Template\n// Interface number, description string index, MAC address string index, EP notification address and size, EP data address (out, in), and size, max segment size.\n#define TUD_CDC_NCM_DESCRIPTOR(_itfnum, _desc_stridx, _mac_stridx, _ep_notif, _ep_notif_size, _epout, _epin, _epsize, _maxsegmentsize) \\\n  /* Interface Association */\\\n  8, TUSB_DESC_INTERFACE_ASSOCIATION, _itfnum, 2, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_NETWORK_CONTROL_MODEL, 0, 0,\\\n  /* CDC Control Interface */\\\n  9, TUSB_DESC_INTERFACE, _itfnum, 0, 1, TUSB_CLASS_CDC, CDC_COMM_SUBCLASS_NETWORK_CONTROL_MODEL, 0, _desc_stridx,\\\n  /* CDC-NCM Header */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_HEADER, U16_TO_U8S_LE(0x0110),\\\n  /* CDC-NCM Union */\\\n  5, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_UNION, _itfnum, (uint8_t)((_itfnum) + 1),\\\n  /* CDC-NCM Functional Descriptor */\\\n  13, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_ETHERNET_NETWORKING, _mac_stridx, 0, 0, 0, 0, U16_TO_U8S_LE(_maxsegmentsize), U16_TO_U8S_LE(0), 0, \\\n  /* CDC-NCM Functional Descriptor */\\\n  6, TUSB_DESC_CS_INTERFACE, CDC_FUNC_DESC_NCM, U16_TO_U8S_LE(0x0100), 0, \\\n  /* Endpoint Notification */\\\n  7, TUSB_DESC_ENDPOINT, _ep_notif, TUSB_XFER_INTERRUPT, U16_TO_U8S_LE(_ep_notif_size), 50,\\\n  /* CDC Data Interface (default inactive) */\\\n  9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 0, 0, TUSB_CLASS_CDC_DATA, 0, NCM_DATA_PROTOCOL_NETWORK_TRANSFER_BLOCK, 0,\\\n  /* CDC Data Interface (alternative active) */\\\n  9, TUSB_DESC_INTERFACE, (uint8_t)((_itfnum)+1), 1, 2, TUSB_CLASS_CDC_DATA, 0, NCM_DATA_PROTOCOL_NETWORK_TRANSFER_BLOCK, 0,\\\n  /* Endpoint In */\\\n  7, TUSB_DESC_ENDPOINT, _epin, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0,\\\n  /* Endpoint Out */\\\n  7, TUSB_DESC_ENDPOINT, _epout, TUSB_XFER_BULK, U16_TO_U8S_LE(_epsize), 0\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_USBD_H_ */\n\n/** @} */\n"
  },
  {
    "path": "src/device/usbd_control.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED\n\n#include \"dcd.h\"\n#include \"tusb.h\"\n#include \"device/usbd_pvt.h\"\n\n//--------------------------------------------------------------------+\n// Callback weak stubs (called if application does not provide)\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK void dcd_edpt0_status_complete(uint8_t rhport, const tusb_control_request_t* request) {\n  (void) rhport;\n  (void) request;\n}\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\nenum {\n  EDPT_CTRL_OUT = 0x00,\n  EDPT_CTRL_IN = 0x80\n};\n\ntypedef struct {\n  tusb_control_request_t request;\n  uint8_t* buffer;\n  uint16_t data_len;\n  uint16_t total_xferred;\n  usbd_control_xfer_cb_t complete_cb;\n} usbd_control_xfer_t;\n\nstatic usbd_control_xfer_t _ctrl_xfer;\n\nCFG_TUD_MEM_SECTION static struct {\n  TUD_EPBUF_DEF(buf, CFG_TUD_ENDPOINT0_BUFSIZE);\n} _ctrl_epbuf;\n\nuint8_t* usbd_get_ctrl_buf(void) {\n  return _ctrl_epbuf.buf;\n}\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// Queue ZLP status transaction\nstatic inline bool status_stage_xact(uint8_t rhport, const tusb_control_request_t* request) {\n  // Opposite to endpoint in Data Phase\n  const uint8_t ep_addr = request->bmRequestType_bit.direction ? EDPT_CTRL_OUT : EDPT_CTRL_IN;\n  return usbd_edpt_xfer(rhport, ep_addr, NULL, 0, false);\n}\n\n// Status phase\nbool tud_control_status(uint8_t rhport, const tusb_control_request_t* request) {\n  _ctrl_xfer.request = (*request);\n  _ctrl_xfer.buffer = NULL;\n  _ctrl_xfer.total_xferred = 0;\n  _ctrl_xfer.data_len = 0;\n\n  return status_stage_xact(rhport, request);\n}\n\n// Queue a transaction in Data Stage\n// Each transaction has up to Endpoint0's max packet size.\n// This function can also transfer an zero-length packet\nstatic bool data_stage_xact(uint8_t rhport) {\n  const uint16_t xact_len = tu_min16(_ctrl_xfer.data_len - _ctrl_xfer.total_xferred, CFG_TUD_ENDPOINT0_BUFSIZE);\n  uint8_t ep_addr = EDPT_CTRL_OUT;\n\n  if (_ctrl_xfer.request.bmRequestType_bit.direction == TUSB_DIR_IN) {\n    ep_addr = EDPT_CTRL_IN;\n    if (0u != xact_len && _ctrl_xfer.buffer != _ctrl_epbuf.buf) {\n      TU_VERIFY(0 == tu_memcpy_s(_ctrl_epbuf.buf, CFG_TUD_ENDPOINT0_BUFSIZE, _ctrl_xfer.buffer, xact_len));\n    }\n  }\n\n  return usbd_edpt_xfer(rhport, ep_addr, xact_len ? _ctrl_epbuf.buf : NULL, xact_len, false);\n}\n\n// Transmit data to/from the control endpoint.\n// If the request's wLength is zero, a status packet is sent instead.\nbool tud_control_xfer(uint8_t rhport, const tusb_control_request_t* request, void* buffer, uint16_t len) {\n  _ctrl_xfer.request = (*request);\n  _ctrl_xfer.buffer = (uint8_t*) buffer;\n  _ctrl_xfer.total_xferred = 0U;\n  _ctrl_xfer.data_len = tu_min16(len, request->wLength);\n\n  if (request->wLength > 0U) {\n    if (_ctrl_xfer.data_len > 0U) {\n      TU_ASSERT(buffer);\n    }\n    TU_ASSERT(data_stage_xact(rhport));\n  } else {\n    TU_ASSERT(status_stage_xact(rhport, request));\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// USBD API\n//--------------------------------------------------------------------+\nvoid usbd_control_reset(void);\nvoid usbd_control_set_request(const tusb_control_request_t* request);\nvoid usbd_control_set_complete_callback(usbd_control_xfer_cb_t fp);\nbool usbd_control_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\n\nvoid usbd_control_reset(void) {\n  tu_varclr(&_ctrl_xfer);\n}\n\n// Set complete callback\nvoid usbd_control_set_complete_callback(usbd_control_xfer_cb_t fp) {\n  _ctrl_xfer.complete_cb = fp;\n}\n\n// for dcd_set_address where DCD is responsible for status response\nvoid usbd_control_set_request(const tusb_control_request_t* request) {\n  _ctrl_xfer.request = (*request);\n  _ctrl_xfer.buffer = NULL;\n  _ctrl_xfer.total_xferred = 0;\n  _ctrl_xfer.data_len = 0;\n}\n\n// callback when a transaction complete on\n// - DATA stage of control endpoint or\n// - Status stage\nbool usbd_control_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void) result;\n\n  // Endpoint Address is opposite to direction bit, this is Status Stage complete event\n  if (tu_edpt_dir(ep_addr) != _ctrl_xfer.request.bmRequestType_bit.direction) {\n    TU_ASSERT(0 == xferred_bytes);\n\n    // invoke optional dcd hook if available\n    dcd_edpt0_status_complete(rhport, &_ctrl_xfer.request);\n\n    if (NULL != _ctrl_xfer.complete_cb) {\n      // TODO refactor with usbd_driver_print_control_complete_name\n      _ctrl_xfer.complete_cb(rhport, CONTROL_STAGE_ACK, &_ctrl_xfer.request);\n    }\n\n    return true;\n  }\n\n  if (_ctrl_xfer.request.bmRequestType_bit.direction == TUSB_DIR_OUT) {\n    TU_VERIFY(_ctrl_xfer.buffer);\n    if (_ctrl_xfer.buffer != _ctrl_epbuf.buf) {\n      memcpy(_ctrl_xfer.buffer, _ctrl_epbuf.buf, xferred_bytes);\n    }\n    TU_LOG_MEM(CFG_TUD_LOG_LEVEL, _ctrl_xfer.buffer, xferred_bytes, 2);\n  }\n\n  _ctrl_xfer.total_xferred += (uint16_t) xferred_bytes;\n  _ctrl_xfer.buffer += xferred_bytes;\n\n  // Data Stage is complete when all request's length are transferred or\n  // a short packet is sent including zero-length packet.\n  if ((_ctrl_xfer.request.wLength == _ctrl_xfer.total_xferred) ||\n      (xferred_bytes < CFG_TUD_ENDPOINT0_BUFSIZE)) {\n    // DATA stage is complete\n    bool is_ok = true;\n\n    // invoke complete callback if set\n    // callback can still stall control in status phase e.g out data does not make sense\n    if (NULL != _ctrl_xfer.complete_cb) {\n      #if CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\n      usbd_driver_print_control_complete_name(_ctrl_xfer.complete_cb);\n      #endif\n\n      is_ok = _ctrl_xfer.complete_cb(rhport, CONTROL_STAGE_DATA, &_ctrl_xfer.request);\n    }\n\n    if (is_ok) {\n      TU_ASSERT(status_stage_xact(rhport, &_ctrl_xfer.request));\n    } else {\n      // Stall both IN and OUT control endpoint\n      dcd_edpt_stall(rhport, EDPT_CTRL_OUT);\n      dcd_edpt_stall(rhport, EDPT_CTRL_IN);\n    }\n  } else {\n    // More data to transfer\n    TU_ASSERT(data_stage_xact(rhport));\n  }\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/device/usbd_pvt.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_USBD_PVT_H_\n#define TUSB_USBD_PVT_H_\n\n#include \"osal/osal.h\"\n#include \"common/tusb_fifo.h\"\n#include \"common/tusb_private.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define TU_LOG_USBD(...)   TU_LOG(CFG_TUD_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\ntypedef enum {\n  SOF_CONSUMER_USER = 0,\n  SOF_CONSUMER_AUDIO,\n} sof_consumer_t;\n\n//--------------------------------------------------------------------+\n// Class Driver API\n//--------------------------------------------------------------------+\n\ntypedef struct {\n  char const* name;\n  void     (* init             ) (void);\n  bool     (* deinit           ) (void);\n  void     (* reset            ) (uint8_t rhport);\n  uint16_t (* open             ) (uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t max_len);\n  bool     (* control_xfer_cb  ) (uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\n  bool     (* xfer_cb          ) (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\n  bool     (* xfer_isr         ) (uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes); // optional, return false to defer to xfer_cb()\n  void     (* sof              ) (uint8_t rhport, uint32_t frame_count); // optional\n} usbd_class_driver_t;\n\n// Invoked when initializing device stack to get additional class drivers.\n// Can be implemented by application to extend/overwrite class driver support.\n// Note: The drivers array must be accessible at all time when stack is active\nusbd_class_driver_t const* usbd_app_driver_get_cb(uint8_t* driver_count);\n\ntypedef bool (*usbd_control_xfer_cb_t)(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);\n\nvoid usbd_int_set(bool enabled);\nvoid usbd_spin_lock(bool in_isr);\nvoid usbd_spin_unlock(bool in_isr);\n\nuint8_t* usbd_get_ctrl_buf(void);\n\n//--------------------------------------------------------------------+\n// USBD Endpoint API\n// Note: rhport should be 0 since device stack only support 1 rhport for now\n//--------------------------------------------------------------------+\n\n// Open an endpoint\nbool usbd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep);\n\n// Close an endpoint\nvoid usbd_edpt_close(uint8_t rhport, uint8_t ep_addr);\n\n// Submit a usb transfer\nbool usbd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr);\n\n// Submit a usb ISO transfer by use of a FIFO (ring buffer) - all bytes in FIFO get transmitted\nbool usbd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr);\n\n// Claim an endpoint before submitting a transfer.\n// If caller does not make any transfer, it must release endpoint for others.\nbool usbd_edpt_claim(uint8_t rhport, uint8_t ep_addr);\n\n// Release claimed endpoint without submitting a transfer\nbool usbd_edpt_release(uint8_t rhport, uint8_t ep_addr);\n\n// Check if endpoint is busy transferring\nbool usbd_edpt_busy(uint8_t rhport, uint8_t ep_addr);\n\n// Stall endpoint\nvoid usbd_edpt_stall(uint8_t rhport, uint8_t ep_addr);\n\n// Clear stalled endpoint\nvoid usbd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr);\n\n// Check if endpoint is stalled\nbool usbd_edpt_stalled(uint8_t rhport, uint8_t ep_addr);\n\n// Allocate packet buffer used by ISO endpoints\nbool usbd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size);\n\n// Configure and enable an ISO endpoint according to descriptor\nbool usbd_edpt_iso_activate(uint8_t rhport,  tusb_desc_endpoint_t const * p_endpoint_desc);\n\n// Check if endpoint is ready (not busy and not stalled)\nTU_ATTR_ALWAYS_INLINE static inline\nbool usbd_edpt_ready(uint8_t rhport, uint8_t ep_addr) {\n  const bool is_busy = usbd_edpt_busy(rhport, ep_addr);\n  const bool is_stalled = usbd_edpt_stalled(rhport, ep_addr);\n  return !is_busy && !is_stalled;\n}\n\n// Enable SOF interrupt\nvoid usbd_sof_enable(uint8_t rhport, sof_consumer_t consumer, bool en);\n\nbool usbd_open_edpt_pair(uint8_t rhport, uint8_t const* p_desc, uint8_t ep_count, uint8_t xfer_type, uint8_t* ep_out, uint8_t* ep_in);\nvoid usbd_defer_func(osal_task_func_t func, void *param, bool in_isr);\n\n#if CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\nvoid usbd_driver_print_control_complete_name(usbd_control_xfer_cb_t callback);\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/host/hcd.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_HCD_H_\n#define TUSB_HCD_H_\n\n#include \"common/tusb_common.h\"\n#include \"osal/osal.h\"\n#include \"common/tusb_fifo.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Configuration\n//--------------------------------------------------------------------+\n\n// Max number of endpoints pair per device\n// TODO optimize memory usage\n#ifndef CFG_TUH_ENDPOINT_MAX\n  #define CFG_TUH_ENDPOINT_MAX   16\n//  #ifdef TUP_HCD_ENDPOINT_MAX\n//    #define CFG_TUH_ENDPPOINT_MAX   TUP_HCD_ENDPOINT_MAX\n//  #else\n//    #define\n//  #endif\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef enum {\n  HCD_EVENT_DEVICE_ATTACH,\n  HCD_EVENT_DEVICE_REMOVE,\n  HCD_EVENT_XFER_COMPLETE,\n\n  USBH_EVENT_FUNC_CALL, // Not an HCD event\n  HCD_EVENT_INVALID\n} hcd_eventid_t;\n\ntypedef struct {\n  uint8_t rhport;\n  uint8_t event_id;\n  uint8_t dev_addr;\n\n  union {\n    // Attach, Remove\n    struct {\n      uint8_t hub_addr;\n      uint8_t hub_port;\n    } connection;\n\n    // XFER_COMPLETE\n    struct {\n      uint8_t ep_addr;\n      uint8_t result;\n      uint32_t len;\n    } xfer_complete;\n\n    // FUNC_CALL\n    struct {\n      void (*func) (void* param);\n      void* param;\n    }func_call;\n  };\n} hcd_event_t;\n\n//--------------------------------------------------------------------+\n// Memory API\n//--------------------------------------------------------------------+\n\n// clean/flush data cache: write cache -> memory.\n// Required before an DMA TX transfer to make sure data is in memory\nbool hcd_dcache_clean(void const* addr, uint32_t data_size);\n\n// invalidate data cache: mark cache as invalid, next read will read from memory\n// Required BOTH before and after an DMA RX transfer\nbool hcd_dcache_invalidate(void const* addr, uint32_t data_size);\n\n// clean and invalidate data cache\n// Required before an DMA transfer where memory is both read/write by DMA\nbool hcd_dcache_clean_invalidate(void const* addr, uint32_t data_size);\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n// optional hcd configuration, called by tuh_configure()\nbool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param);\n\n// Initialize controller to host mode\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init);\n\n// De-initialize controller\nbool hcd_deinit(uint8_t rhport);\n\n// Interrupt Handler\nvoid hcd_int_handler(uint8_t rhport, bool in_isr);\n\n// Enable USB interrupt\nvoid hcd_int_enable (uint8_t rhport);\n\n// Disable USB interrupt\nvoid hcd_int_disable(uint8_t rhport);\n\n// Get frame number (1ms)\nuint32_t hcd_frame_number(uint8_t rhport);\n\n//--------------------------------------------------------------------+\n// Port API\n//--------------------------------------------------------------------+\n\n// Get the current connect status of roothub port\nbool hcd_port_connect_status(uint8_t rhport);\n\n// Reset USB bus on the port. Return immediately, bus reset sequence may not be complete.\n// Some port would require hcd_port_reset_end() to be invoked after 10ms to complete the reset sequence.\nvoid hcd_port_reset(uint8_t rhport);\n\n// Complete bus reset sequence, may be required by some controllers\nvoid hcd_port_reset_end(uint8_t rhport);\n\n// Get port link speed\ntusb_speed_t hcd_port_speed_get(uint8_t rhport);\n\n// HCD closes all opened endpoints belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr);\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\n\n// Open an endpoint\n// return true if successfully opened or endpoint is currently opened\nbool hcd_edpt_open(uint8_t rhport, uint8_t daddr, tusb_desc_endpoint_t const * ep_desc);\n\n// Close an endpoint\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr);\n\n// Submit a transfer, when complete hcd_event_xfer_complete() must be invoked\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t daddr, uint8_t ep_addr, uint8_t * buffer, uint16_t buflen);\n\n// Abort a queued transfer. Note: it can only abort transfer that has not been started\n// Return true if a queued transfer is aborted, false if there is no transfer to abort\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr);\n\n// Submit a special transfer to send 8-byte Setup Packet, when complete hcd_event_xfer_complete() must be invoked\nbool hcd_setup_send(uint8_t rhport, uint8_t daddr, uint8_t const setup_packet[8]);\n\n// clear stall, data toggle is also reset to DATA0\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr);\n\n//--------------------------------------------------------------------+\n// USBH implemented API\n//--------------------------------------------------------------------+\n\n// Called by HCD to notify stack\nextern void hcd_event_handler(hcd_event_t const* event, bool in_isr);\n\n// Helper to send device attach event\nTU_ATTR_ALWAYS_INLINE static inline\nvoid hcd_event_device_attach(uint8_t rhport, bool in_isr) {\n  hcd_event_t event;\n  event.rhport              = rhport;\n  event.event_id            = HCD_EVENT_DEVICE_ATTACH;\n  event.connection.hub_addr = 0;\n  event.connection.hub_port = 0;\n\n  hcd_event_handler(&event, in_isr);\n}\n\n// Helper to send device removal event\nTU_ATTR_ALWAYS_INLINE static inline\nvoid hcd_event_device_remove(uint8_t rhport, bool in_isr) {\n  hcd_event_t event;\n  event.rhport              = rhport;\n  event.event_id            = HCD_EVENT_DEVICE_REMOVE;\n  event.connection.hub_addr = 0;\n  event.connection.hub_port = 0;\n\n  hcd_event_handler(&event, in_isr);\n}\n\n// Helper to send USB transfer event\nTU_ATTR_ALWAYS_INLINE static inline\nvoid hcd_event_xfer_complete(uint8_t dev_addr, uint8_t ep_addr, uint32_t xferred_bytes, xfer_result_t result, bool in_isr) {\n  hcd_event_t event = {\n    .rhport   = 0, // TODO correct rhport\n    .event_id = HCD_EVENT_XFER_COMPLETE,\n    .dev_addr = dev_addr,\n  };\n  event.xfer_complete.ep_addr = ep_addr;\n  event.xfer_complete.result = result;\n  event.xfer_complete.len = xferred_bytes;\n\n  hcd_event_handler(&event, in_isr);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/host/hub.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if (CFG_TUH_ENABLED && CFG_TUH_HUB)\n\n#include \"hcd.h\"\n#include \"usbh.h\"\n#include \"usbh_pvt.h\"\n#include \"hub.h\"\n\n// Debug level, TUSB_CFG_DEBUG must be at least this level for debug message\n#define HUB_DEBUG   2\n#define TU_LOG_DRV(...)   TU_LOG(HUB_DEBUG, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t itf_num;\n  uint8_t ep_in;\n\n  // from hub descriptor\n  uint8_t bNbrPorts;\n  uint8_t bPwrOn2PwrGood_2ms; // port power on to good, in 2ms unit\n  // uint16_t wHubCharacteristics;\n  bool mtt;\n  hub_port_status_response_t port_status;\n} hub_interface_t;\n\ntypedef struct {\n  TUH_EPBUF_DEF(status_change, 4); // interrupt endpoint\n  TUH_EPBUF_DEF(ctrl_buf, CFG_TUH_HUB_BUFSIZE);\n} hub_epbuf_t;\n\nstatic tuh_xfer_cb_t user_complete_cb = NULL;\nstatic hub_interface_t hub_itfs[CFG_TUH_HUB];\nCFG_TUH_MEM_SECTION static hub_epbuf_t hub_epbufs[CFG_TUH_HUB];\n\n\nTU_ATTR_ALWAYS_INLINE static inline hub_interface_t* get_hub_itf(uint8_t daddr) {\n  return &hub_itfs[daddr-1-CFG_TUH_DEVICE_MAX];\n}\n\nTU_ATTR_ALWAYS_INLINE static inline hub_epbuf_t* get_hub_epbuf(uint8_t daddr) {\n  return &hub_epbufs[daddr-1-CFG_TUH_DEVICE_MAX];\n}\n\n#if CFG_TUSB_DEBUG >= HUB_DEBUG\nstatic char const* const _hub_feature_str[] = {\n  [HUB_FEATURE_PORT_CONNECTION          ] = \"PORT_CONNECTION\",\n  [HUB_FEATURE_PORT_ENABLE              ] = \"PORT_ENABLE\",\n  [HUB_FEATURE_PORT_SUSPEND             ] = \"PORT_SUSPEND\",\n  [HUB_FEATURE_PORT_OVER_CURRENT        ] = \"PORT_OVER_CURRENT\",\n  [HUB_FEATURE_PORT_RESET               ] = \"PORT_RESET\",\n  [HUB_FEATURE_PORT_POWER               ] = \"PORT_POWER\",\n  [HUB_FEATURE_PORT_LOW_SPEED           ] = \"PORT_LOW_SPEED\",\n  [HUB_FEATURE_PORT_CONNECTION_CHANGE   ] = \"PORT_CONNECTION_CHANGE\",\n  [HUB_FEATURE_PORT_ENABLE_CHANGE       ] = \"PORT_ENABLE_CHANGE\",\n  [HUB_FEATURE_PORT_SUSPEND_CHANGE      ] = \"PORT_SUSPEND_CHANGE\",\n  [HUB_FEATURE_PORT_OVER_CURRENT_CHANGE ] = \"PORT_OVER_CURRENT_CHANGE\",\n  [HUB_FEATURE_PORT_RESET_CHANGE        ] = \"PORT_RESET_CHANGE\",\n  [HUB_FEATURE_PORT_TEST                ] = \"PORT_TEST\",\n  [HUB_FEATURE_PORT_INDICATOR           ] = \"PORT_INDICATOR\",\n};\n#endif\n\n//--------------------------------------------------------------------+\n// HUB\n//--------------------------------------------------------------------+\nbool hub_port_clear_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,\n                            tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  tusb_control_request_t const request = {\n    .bmRequestType_bit = {\n      .recipient = (hub_port == 0) ? TUSB_REQ_RCPT_DEVICE : TUSB_REQ_RCPT_OTHER,\n      .type      = TUSB_REQ_TYPE_CLASS,\n      .direction = TUSB_DIR_OUT\n    },\n    .bRequest = HUB_REQUEST_CLEAR_FEATURE,\n    .wValue   = feature,\n    .wIndex   = hub_port,\n    .wLength  = 0\n  };\n\n  tuh_xfer_t xfer = {\n    .daddr       = hub_addr,\n    .ep_addr     = 0,\n    .setup       = &request,\n    .buffer      = NULL,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  TU_LOG_DRV(\"HUB Clear Feature: %s, addr = %u port = %u\\r\\n\", _hub_feature_str[feature], hub_addr, hub_port);\n  TU_ASSERT(tuh_control_xfer(&xfer));\n  return true;\n}\n\nbool hub_port_set_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,\n                          tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  tusb_control_request_t const request = {\n    .bmRequestType_bit = {\n      .recipient = (hub_port == 0) ? TUSB_REQ_RCPT_DEVICE : TUSB_REQ_RCPT_OTHER,\n      .type      = TUSB_REQ_TYPE_CLASS,\n      .direction = TUSB_DIR_OUT\n    },\n    .bRequest = HUB_REQUEST_SET_FEATURE,\n    .wValue   = feature,\n    .wIndex   = hub_port,\n    .wLength  = 0\n  };\n\n  tuh_xfer_t xfer = {\n    .daddr       = hub_addr,\n    .ep_addr     = 0,\n    .setup       = &request,\n    .buffer      = NULL,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  TU_LOG_DRV(\"HUB Set Feature: %s, addr = %u port = %u\\r\\n\", _hub_feature_str[feature], hub_addr, hub_port);\n  TU_ASSERT(tuh_control_xfer(&xfer));\n  return true;\n}\n\nstatic void port_get_status_complete (tuh_xfer_t* xfer) {\n  if (xfer->result == XFER_RESULT_SUCCESS) {\n    hub_interface_t* p_hub = get_hub_itf(xfer->daddr);\n    p_hub->port_status = *((const hub_port_status_response_t *) (uintptr_t) xfer->buffer);\n  }\n\n  xfer->complete_cb = user_complete_cb;\n  user_complete_cb = NULL;\n  if (xfer->complete_cb) {\n    xfer->complete_cb(xfer);\n  }\n}\n\nbool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void* resp,\n                         tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  tusb_control_request_t const request = {\n    .bmRequestType_bit = {\n      .recipient = (hub_port == 0) ? TUSB_REQ_RCPT_DEVICE : TUSB_REQ_RCPT_OTHER,\n      .type      = TUSB_REQ_TYPE_CLASS,\n      .direction = TUSB_DIR_IN\n    },\n    .bRequest = HUB_REQUEST_GET_STATUS,\n    .wValue   = 0,\n    .wIndex   = hub_port,\n    .wLength  = tu_htole16(4)\n  };\n\n  tuh_xfer_t xfer = {\n    .daddr       = hub_addr,\n    .ep_addr     = 0,\n    .setup       = &request,\n    .buffer      = resp,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  if (hub_port != 0) {\n    // intercept complete callback to save port status, ignore resp\n    hub_epbuf_t* p_epbuf = get_hub_epbuf(hub_addr);\n    xfer.complete_cb = port_get_status_complete;\n    xfer.buffer = p_epbuf->ctrl_buf;\n    user_complete_cb = complete_cb;\n  } else {\n    user_complete_cb = NULL;\n  }\n\n  TU_LOG_DRV(\"HUB Get Port Status: addr = %u port = %u\\r\\n\", hub_addr, hub_port);\n  TU_VERIFY(tuh_control_xfer(&xfer));\n  return true;\n}\n\nbool hub_port_get_status_local(uint8_t hub_addr, uint8_t hub_port, hub_port_status_response_t* resp) {\n  (void) hub_port;\n  hub_interface_t* p_hub = get_hub_itf(hub_addr);\n  *resp = p_hub->port_status;\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// CLASS-USBH API (don't require to verify parameters)\n//--------------------------------------------------------------------+\nbool hub_init(void) {\n  tu_memclr(hub_itfs, sizeof(hub_itfs));\n  return true;\n}\n\nbool hub_deinit(void) {\n  return true;\n}\n\nuint16_t hub_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *itf_desc, uint16_t max_len) {\n  (void)rhport;\n  TU_VERIFY(TUSB_CLASS_HUB == itf_desc->bInterfaceClass && 0 == itf_desc->bInterfaceSubClass, 0);\n\n  const uint16_t itf_ep_len = sizeof(tusb_desc_interface_t) + sizeof(tusb_desc_endpoint_t);\n  uint16_t       drv_len    = itf_ep_len;\n  TU_ASSERT(drv_len <= max_len, 0);\n\n  hub_interface_t             *p_hub        = get_hub_itf(dev_addr);\n  const tusb_desc_interface_t *desc_itf_use = itf_desc; // interface to use for endpoint open\n\n  // Check device descriptor for MTT hub (bDeviceProtocol == 2)\n  // MTT hub has 2 alt settings: alt 0 is STT (protocol 1), alt 1 is MTT (protocol 2)\n  // Consume both alt settings and use alt setting 1 for endpoint\n  tusb_desc_device_t desc_dev;\n  if (tuh_descriptor_get_device_local(dev_addr, &desc_dev) && desc_dev.bDeviceProtocol == HUB_PROTOCOL_HIGH_SPEED_MTT) {\n    drv_len += itf_ep_len;\n    TU_ASSERT(drv_len <= max_len, 0);\n    const tusb_desc_interface_t *desc_alt1 = (const tusb_desc_interface_t *)((const uint8_t *)itf_desc + itf_ep_len);\n    TU_ASSERT(desc_alt1->bDescriptorType == TUSB_DESC_INTERFACE && desc_alt1->bInterfaceClass == TUSB_CLASS_HUB &&\n                desc_alt1->bInterfaceProtocol == HUB_PROTOCOL_HIGH_SPEED_MTT,\n              0);\n    p_hub->mtt   = true;\n    desc_itf_use = desc_alt1;\n  }\n\n  // Interrupt Status endpoint\n  const tusb_desc_endpoint_t *desc_ep = (const tusb_desc_endpoint_t *)tu_desc_next(desc_itf_use);\n  TU_ASSERT(TUSB_DESC_ENDPOINT == desc_ep->bDescriptorType && TUSB_XFER_INTERRUPT == desc_ep->bmAttributes.xfer, 0);\n  TU_ASSERT(tuh_edpt_open(dev_addr, desc_ep), 0);\n\n  p_hub->itf_num = itf_desc->bInterfaceNumber;\n  p_hub->ep_in   = desc_ep->bEndpointAddress;\n\n  return drv_len;\n}\n\nvoid hub_close(uint8_t dev_addr) {\n  TU_VERIFY(dev_addr > CFG_TUH_DEVICE_MAX, );\n  hub_interface_t* p_hub = get_hub_itf(dev_addr);\n\n  if (p_hub->ep_in) {\n    TU_LOG_DRV(\"  HUB close addr = %d\\r\\n\", dev_addr);\n    tu_memclr(p_hub, sizeof( hub_interface_t));\n  }\n}\n\nbool hub_edpt_status_xfer(uint8_t daddr) {\n  hub_interface_t* p_hub = get_hub_itf(daddr);\n  hub_epbuf_t* p_epbuf = get_hub_epbuf(daddr);\n\n  TU_VERIFY(usbh_edpt_claim(daddr, p_hub->ep_in));\n  if (!usbh_edpt_xfer(daddr, p_hub->ep_in, p_epbuf->status_change, 1)) {\n    usbh_edpt_release(daddr, p_hub->ep_in);\n    return false;\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Set Configure\n//--------------------------------------------------------------------+\nstatic void config_set_port_power (tuh_xfer_t* xfer);\nstatic void config_port_power_complete (tuh_xfer_t* xfer);\nstatic void config_get_hub_descriptor(tuh_xfer_t* xfer);\n\nbool hub_set_config(uint8_t daddr, uint8_t itf_num) {\n  hub_interface_t* p_hub = get_hub_itf(daddr);\n  TU_ASSERT(itf_num == p_hub->itf_num);\n\n  if (p_hub->mtt) {\n    // Set Alternate Setting 1 for MTT hub\n    TU_ASSERT(tuh_interface_set(daddr, itf_num, 1, config_get_hub_descriptor, 0));\n  } else {\n    tuh_xfer_t xfer;\n    xfer.daddr     = daddr;\n    xfer.ep_addr   = 0;\n    xfer.user_data = 0;\n    config_get_hub_descriptor(&xfer);\n  }\n\n  return true;\n}\n\nstatic void config_get_hub_descriptor(tuh_xfer_t* xfer) {\n  // Get Hub Descriptor\n  tusb_control_request_t const request = {\n    .bmRequestType_bit = {\n      .recipient = TUSB_REQ_RCPT_DEVICE,\n      .type      = TUSB_REQ_TYPE_CLASS,\n      .direction = TUSB_DIR_IN\n    },\n    .bRequest = HUB_REQUEST_GET_DESCRIPTOR,\n    .wValue   = 0,\n    .wIndex   = 0,\n    .wLength  = sizeof(hub_desc_cs_t)\n  };\n\n  xfer->setup       = &request;\n  xfer->buffer      = get_hub_epbuf(xfer->daddr)->ctrl_buf;\n  xfer->complete_cb = config_set_port_power;\n\n  TU_ASSERT(tuh_control_xfer(xfer), );\n}\n\nstatic void config_set_port_power (tuh_xfer_t* xfer) {\n  TU_ASSERT(XFER_RESULT_SUCCESS == xfer->result, );\n\n  uint8_t const daddr = xfer->daddr;\n  hub_interface_t* p_hub = get_hub_itf(daddr);\n  hub_epbuf_t* p_epbuf = get_hub_epbuf(daddr);\n\n  // only use the number of ports in the hub descriptor\n  hub_desc_cs_t const* desc_hub = (hub_desc_cs_t const*) p_epbuf->ctrl_buf;\n  p_hub->bNbrPorts = desc_hub->bNbrPorts;\n  p_hub->bPwrOn2PwrGood_2ms = desc_hub->bPwrOn2PwrGood;\n\n  // May need to GET_STATUS\n\n  // Set Port Power to be able to detect connection, starting with port 1\n  uint8_t const hub_port = 1;\n  hub_port_set_feature(daddr, hub_port, HUB_FEATURE_PORT_POWER, config_port_power_complete, 0);\n}\n\nstatic void config_port_power_complete (tuh_xfer_t* xfer) {\n  TU_ASSERT(XFER_RESULT_SUCCESS == xfer->result, );\n\n  uint8_t const daddr = xfer->daddr;\n  hub_interface_t* p_hub = get_hub_itf(daddr);\n\n  if (xfer->setup->wIndex == p_hub->bNbrPorts) {\n    // All ports are power -> queue notification status endpoint and\n    // complete the SET CONFIGURATION\n    if (!hub_edpt_status_xfer(daddr)) {\n      TU_MESS_FAILED();\n      TU_BREAKPOINT();\n    }\n    usbh_driver_set_config_complete(daddr, p_hub->itf_num);\n  } else {\n    // power next port\n    uint8_t const hub_port = (uint8_t) (xfer->setup->wIndex + 1);\n    hub_port_set_feature(daddr, hub_port, HUB_FEATURE_PORT_POWER, config_port_power_complete, 0);\n  }\n}\n\n//--------------------------------------------------------------------+\n// Connection Changes\n//--------------------------------------------------------------------+\nenum {\n  STATE_IDLE = 0,\n  STATE_HUB_STATUS,\n  STATE_CLEAR_CHANGE,\n  STATE_CHECK_CONN,\n  STATE_COMPLETE\n};\n\nstatic void process_new_status(tuh_xfer_t* xfer);\n\n// callback as response of interrupt endpoint polling\nbool hub_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void) xferred_bytes;\n  (void) ep_addr;\n\n  bool processed = false; // true if new status is processed\n\n  if (result == XFER_RESULT_SUCCESS) {\n    hub_interface_t* p_hub = get_hub_itf(daddr);\n    hub_epbuf_t *p_epbuf = get_hub_epbuf(daddr);\n    const uint8_t status_change = p_epbuf->status_change[0];\n    TU_LOG_DRV(\"  Hub Status Change = 0x%02X\\r\\n\", status_change);\n\n    if (status_change == 0) {\n      // The status change event was neither for the hub, nor for any of its ports.\n      // This shouldn't happen, but it does with some devices. Re-Initiate the interrupt poll.\n      processed = false;\n    } else if (tu_bit_test(status_change, 0)) {\n      // Hub bit 0 is for the hub device events\n      processed = hub_get_status(daddr, p_epbuf->ctrl_buf, process_new_status, STATE_HUB_STATUS);\n    } else {\n      // Hub bits 1 to n are hub port events\n      for (uint8_t port=1; port <= p_hub->bNbrPorts; port++) {\n        if (tu_bit_test(status_change, port)) {\n          processed = hub_port_get_status(daddr, port, NULL, process_new_status, STATE_CLEAR_CHANGE);\n          break; // after completely processed one port, we will re-queue the status poll and handle next one\n        }\n      }\n    }\n  }\n\n  // If new status event is processed: next status pool is queued by usbh.c after handled this request\n  // Otherwise re-queue the status poll here\n  if (!processed) {\n    TU_ASSERT(hub_edpt_status_xfer(daddr));\n  }\n\n  return true;\n}\n\nstatic void process_new_status(tuh_xfer_t* xfer) {\n  const uint8_t daddr = xfer->daddr;\n\n  if (xfer->result != XFER_RESULT_SUCCESS) {\n    TU_ASSERT(hub_edpt_status_xfer(daddr),);\n    return;\n  }\n\n  const uint8_t port_num = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n  hub_interface_t *p_hub = get_hub_itf(daddr);\n  const uintptr_t state = xfer->user_data;\n  bool processed = false; // true if new status is processed\n\n  switch (state) {\n    case STATE_HUB_STATUS: {\n      hub_status_response_t hub_status = *((const hub_status_response_t *) (uintptr_t) xfer->buffer);\n      TU_LOG_DRV(\"HUB Got hub status, addr = %u, status = %04x\\r\\n\", daddr, hub_status.change.value);\n      if (hub_status.change.local_power_source) {\n        TU_LOG_DRV(\"  Local Power Change\\r\\n\");\n        processed = hub_clear_feature(daddr, HUB_FEATURE_HUB_LOCAL_POWER_CHANGE,\n                                      process_new_status, STATE_COMPLETE);\n      } else if (hub_status.change.over_current) {\n        TU_LOG_DRV(\"  Over Current\\r\\n\");\n        processed = hub_clear_feature(daddr, HUB_FEATURE_HUB_OVER_CURRENT_CHANGE,\n                                      process_new_status, STATE_COMPLETE);\n      }\n      break;\n    }\n\n    case STATE_CLEAR_CHANGE:\n      // Get port status complete --> clear change\n      if (p_hub->port_status.change.connection) {\n        // Connection change\n        // Port is powered and enabled\n        //TU_VERIFY(port_status.status_current.port_power && port_status.status_current.port_enable, );\n\n        // Acknowledge Port Connection Change\n        processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_CONNECTION_CHANGE,\n                                           process_new_status, STATE_CHECK_CONN);\n      } else if (p_hub->port_status.change.port_enable) {\n        processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_ENABLE_CHANGE,\n                                           process_new_status, STATE_COMPLETE);\n      } else if (p_hub->port_status.change.suspend) {\n        processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_SUSPEND_CHANGE,\n                                           process_new_status, STATE_COMPLETE);\n      } else if (p_hub->port_status.change.over_current) {\n        processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_OVER_CURRENT_CHANGE,\n                                           process_new_status, STATE_COMPLETE);\n      } else if (p_hub->port_status.change.reset) {\n        processed = hub_port_clear_feature(daddr, port_num, HUB_FEATURE_PORT_RESET_CHANGE,\n                                           process_new_status, STATE_COMPLETE);\n      }\n      break;\n\n    case STATE_CHECK_CONN: {\n      const hcd_event_t event = {\n        .rhport     = usbh_get_rhport(daddr),\n        .event_id   = p_hub->port_status.status.connection ? HCD_EVENT_DEVICE_ATTACH : HCD_EVENT_DEVICE_REMOVE,\n        .connection = {\n          .hub_addr = daddr,\n          .hub_port = port_num\n        }\n      };\n      hcd_event_handler(&event, false);\n      // skip status for attach event, usbh will do it after handled this enumeration\n      processed = (event.event_id == HCD_EVENT_DEVICE_ATTACH);\n      break;\n    }\n\n    case STATE_COMPLETE:\n    default:\n      processed = false; // complete this status, queue next status\n      break;\n\n  }\n\n  if (!processed) {\n    TU_ASSERT(hub_edpt_status_xfer(daddr),);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/host/hub.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_HUB_H_\n#define TUSB_HUB_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Configuration\n//--------------------------------------------------------------------+\n\n#ifndef CFG_TUH_HUB_BUFSIZE\n  #define CFG_TUH_HUB_BUFSIZE 12\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nenum {\n  HUB_REQUEST_GET_STATUS      = 0  ,\n  HUB_REQUEST_CLEAR_FEATURE   = 1  ,\n  // 2 is reserved\n  HUB_REQUEST_SET_FEATURE     = 3  ,\n  // 4-5 are reserved\n  HUB_REQUEST_GET_DESCRIPTOR  = 6  ,\n  HUB_REQUEST_SET_DESCRIPTOR  = 7  ,\n  HUB_REQUEST_CLEAR_TT_BUFFER = 8  ,\n  HUB_REQUEST_RESET_TT        = 9  ,\n  HUB_REQUEST_GET_TT_STATE    = 10 ,\n  HUB_REQUEST_STOP_TT         = 11\n};\n\nenum {\n  HUB_FEATURE_HUB_LOCAL_POWER_CHANGE = 0,\n  HUB_FEATURE_HUB_OVER_CURRENT_CHANGE\n};\n\nenum{\n  HUB_FEATURE_PORT_CONNECTION          = 0,\n  HUB_FEATURE_PORT_ENABLE              = 1,\n  HUB_FEATURE_PORT_SUSPEND             = 2,\n  HUB_FEATURE_PORT_OVER_CURRENT        = 3,\n  HUB_FEATURE_PORT_RESET               = 4,\n  // 5-7 are reserved\n  HUB_FEATURE_PORT_POWER               = 8,\n  HUB_FEATURE_PORT_LOW_SPEED           = 9,\n  // 10-15 are reserved\n  HUB_FEATURE_PORT_CONNECTION_CHANGE   = 16,\n  HUB_FEATURE_PORT_ENABLE_CHANGE       = 17,\n  HUB_FEATURE_PORT_SUSPEND_CHANGE      = 18,\n  HUB_FEATURE_PORT_OVER_CURRENT_CHANGE = 19,\n  HUB_FEATURE_PORT_RESET_CHANGE        = 20,\n  HUB_FEATURE_PORT_TEST                = 21,\n  HUB_FEATURE_PORT_INDICATOR           = 22\n};\n\nenum {\n  HUB_CHARS_POWER_GANGED_SWITCHING = 0,\n  HUB_CHARS_POWER_INDIVIDUAL_SWITCHING = 1,\n};\n\nenum {\n  HUB_CHARS_OVER_CURRENT_GLOBAL = 0,\n  HUB_CHARS_OVER_CURRENT_INDIVIDUAL = 1,\n};\n\n// Hub Interface Protocol (USB 2.0 spec Table 11-16)\ntypedef enum {\n  HUB_PROTOCOL_FULL_SPEED     = 0, // Full speed hub\n  HUB_PROTOCOL_HIGH_SPEED_STT = 1, // Hi-speed hub with single TT\n  HUB_PROTOCOL_HIGH_SPEED_MTT = 2, // Hi-speed hub with multiple TTs\n} hub_protocol_t;\n\ntypedef struct TU_ATTR_PACKED{\n  uint8_t  bLength           ; ///< Size of descriptor\n  uint8_t  bDescriptorType   ; ///< Other_speed_Configuration Type\n  uint8_t  bNbrPorts;\n  uint16_t wHubCharacteristics;\n  uint8_t  bPwrOn2PwrGood;\n  uint8_t  bHubContrCurrent;\n  uint8_t  DeviceRemovable; // bitmap each bit for a port (from bit1)\n  uint8_t  PortPwrCtrlMask; // just for compatibility, should be 0xff\n} hub_desc_cs_t;\nTU_VERIFY_STATIC(sizeof(hub_desc_cs_t) == 9, \"size is not correct\");\nTU_VERIFY_STATIC(CFG_TUH_HUB_BUFSIZE >= sizeof(hub_desc_cs_t), \"buffer is not big enough\");\n\ntypedef struct TU_ATTR_PACKED {\n  struct TU_ATTR_PACKED {\n    uint8_t logical_power_switching_mode : 2; // [0..1] gannged or individual power switching\n    uint8_t compound_device              : 1; // [2] hub is part of compound device\n    uint8_t over_current_protect_mode    : 2; // [3..4] global or individual port over-current protection\n    uint8_t tt_think_time                : 2; // [5..6] TT think time\n    uint8_t port_indicator_supported     : 1; // [7] port indicator supported\n  };\n  uint8_t rsv1;\n} hub_characteristics_t;\nTU_VERIFY_STATIC(sizeof(hub_characteristics_t) == 2, \"size is not correct\");\n\n// data in response of HUB_REQUEST_GET_STATUS, wIndex = 0 (hub)\ntypedef struct {\n  union{\n    struct TU_ATTR_PACKED {\n      uint16_t local_power_source : 1;\n      uint16_t over_current       : 1;\n      uint16_t : 14;\n    };\n\n    uint16_t value;\n  } status, change;\n} hub_status_response_t;\nTU_VERIFY_STATIC( sizeof(hub_status_response_t) == 4, \"size is not correct\");\n\n// data in response of HUB_REQUEST_GET_STATUS, wIndex = Port num\ntypedef struct {\n  union TU_ATTR_PACKED {\n    struct TU_ATTR_PACKED {\n      // Bit 0-4 are for change & status\n      uint16_t connection             : 1; // [0] 0 = no device, 1 = device connected\n      uint16_t port_enable            : 1; // [1] port is enabled\n      uint16_t suspend                : 1; // [2]\n      uint16_t over_current           : 1; // [3] over-current exists\n      uint16_t reset                  : 1; // [4] 0 = no reset, 1 = resetting\n\n      // From Bit 5 are for status only\n      uint16_t rsv5_7                 : 3; // [5..7] reserved\n      uint16_t port_power             : 1; // [8] 0 = port is off, 1 = port is on\n      uint16_t low_speed              : 1; // [9] low speed device attached\n      uint16_t high_speed             : 1; // [10] high speed device attached\n      uint16_t port_test_mode         : 1; // [11] port in test mode\n      uint16_t port_indicator_control : 1; // [12] 0: default color, 1: indicator is software controlled\n      uint16_t TU_RESERVED            : 3; // [13..15] reserved\n    };\n\n    uint16_t value;\n  } status, change;\n} hub_port_status_response_t;\nTU_VERIFY_STATIC( sizeof(hub_port_status_response_t) == 4, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// HUB API\n//--------------------------------------------------------------------+\n\n// Clear port feature\nbool hub_port_clear_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,\n                            tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Set port feature\nbool hub_port_set_feature(uint8_t hub_addr, uint8_t hub_port, uint8_t feature,\n                          tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get port status\n// If hub_port != 0, resp is ignored. hub_port_get_status_local() can be used to retrieve the status\nbool hub_port_get_status(uint8_t hub_addr, uint8_t hub_port, void *resp,\n                         tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get port status from local cache. This does not send a request to the device\nbool hub_port_get_status_local(uint8_t hub_addr, uint8_t hub_port, hub_port_status_response_t* resp);\n\n// Get status from Interrupt endpoint\nbool hub_edpt_status_xfer(uint8_t daddr);\n\n// Reset a port\nTU_ATTR_ALWAYS_INLINE static inline\nbool hub_port_reset(uint8_t hub_addr, uint8_t hub_port, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return hub_port_set_feature(hub_addr, hub_port, HUB_FEATURE_PORT_RESET, complete_cb, user_data);\n}\n\n// Clear Port Reset Change\nTU_ATTR_ALWAYS_INLINE static inline\nbool hub_port_clear_reset_change(uint8_t hub_addr, uint8_t hub_port, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return hub_port_clear_feature(hub_addr, hub_port, HUB_FEATURE_PORT_RESET_CHANGE, complete_cb, user_data);\n}\n\n// Get Hub status (port = 0)\nTU_ATTR_ALWAYS_INLINE static inline\nbool hub_get_status(uint8_t hub_addr, void* resp, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return hub_port_get_status(hub_addr, 0, resp, complete_cb, user_data);\n}\n\n// Clear Hub feature\nTU_ATTR_ALWAYS_INLINE static inline\nbool hub_clear_feature(uint8_t hub_addr, uint8_t feature, tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return hub_port_clear_feature(hub_addr, 0, feature, complete_cb, user_data);\n}\n//--------------------------------------------------------------------+\n// Internal Class Driver API\n//--------------------------------------------------------------------+\nbool     hub_init(void);\nbool     hub_deinit(void);\nuint16_t hub_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\nbool     hub_set_config(uint8_t daddr, uint8_t itf_num);\nbool     hub_xfer_cb(uint8_t daddr, uint8_t ep_addr, xfer_result_t event, uint32_t xferred_bytes);\nvoid     hub_close(uint8_t dev_addr);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/host/usbh.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED\n\n#include \"hcd.h\"\n#include \"tusb.h\"\n#include \"usbh_pvt.h\"\n#include \"hub.h\"\n\n//--------------------------------------------------------------------+\n// Configuration\n//--------------------------------------------------------------------+\n#ifndef CFG_TUH_TASK_QUEUE_SZ\n  #define CFG_TUH_TASK_QUEUE_SZ   16\n#endif\n\n#ifndef CFG_TUH_INTERFACE_MAX\n  #define CFG_TUH_INTERFACE_MAX   8\n#endif\n\nenum {\n  USBH_CONTROL_RETRY_MAX = 3,\n};\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK bool hcd_deinit(uint8_t rhport) {\n  (void) rhport; return false;\n}\n\nTU_ATTR_WEAK bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {\n  (void) rhport; (void) cfg_id; (void) cfg_param;\n  return false;\n}\n\nTU_ATTR_WEAK void tuh_enum_descriptor_device_cb(uint8_t daddr, const tusb_desc_device_t *desc_device) {\n  (void) daddr; (void) desc_device;\n}\n\nTU_ATTR_WEAK bool tuh_enum_descriptor_configuration_cb(uint8_t daddr, uint8_t cfg_index, const tusb_desc_configuration_t *desc_config) {\n  (void) daddr; (void) cfg_index; (void) desc_config;\n  return true;\n}\n\nTU_ATTR_WEAK void tuh_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr) {\n  (void) rhport; (void) eventid; (void) in_isr;\n}\n\nTU_ATTR_WEAK bool hcd_dcache_clean(const void* addr, uint32_t data_size) {\n  (void) addr; (void) data_size;\n  return false;\n}\n\nTU_ATTR_WEAK bool hcd_dcache_invalidate(const void* addr, uint32_t data_size) {\n  (void) addr; (void) data_size;\n  return false;\n}\n\nTU_ATTR_WEAK bool hcd_dcache_clean_invalidate(const void* addr, uint32_t data_size) {\n  (void) addr; (void) data_size;\n  return false;\n}\n\nTU_ATTR_WEAK usbh_class_driver_t const* usbh_app_driver_get_cb(uint8_t* driver_count) {\n  *driver_count = 0;\n  return NULL;\n}\n\nTU_ATTR_WEAK void tuh_mount_cb(uint8_t daddr) {\n  (void) daddr;\n}\n\nTU_ATTR_WEAK void tuh_umount_cb(uint8_t daddr) {\n  (void) daddr;\n}\n\n//--------------------------------------------------------------------+\n// Data Structure\n//--------------------------------------------------------------------+\n\n// Device Descriptor (without bLength and bDescriptorType header)\ntypedef struct TU_ATTR_PACKED {\n  uint16_t bcdUSB;\n  uint8_t  bDeviceClass;\n  uint8_t  bDeviceSubClass;\n  uint8_t  bDeviceProtocol;\n  uint8_t  bMaxPacketSize0;\n  uint16_t idVendor;\n  uint16_t idProduct;\n  uint16_t bcdDevice;\n  uint8_t  iManufacturer;\n  uint8_t  iProduct;\n  uint8_t  iSerialNumber;\n  uint8_t  bNumConfigurations;\n} desc_device_noheader_t;\n\nTU_VERIFY_STATIC( sizeof(desc_device_noheader_t) == 16u, \"size is not correct\");\n\ntypedef struct {\n  tuh_bus_info_t bus_info;\n  desc_device_noheader_t desc_device;\n\n  // Device State\n  struct TU_ATTR_PACKED {\n    volatile uint8_t connected  : 1; // After 1st transfer\n    volatile uint8_t addressed  : 1; // After SET_ADDR\n    volatile uint8_t configured : 1; // After SET_CONFIG and all drivers are configured\n    volatile uint8_t suspended  : 1; // Bus suspended\n    // volatile uint8_t removing : 1; // Physically disconnected, waiting to be processed by usbh\n  };\n\n  // Endpoint & Interface\n  uint8_t itf2drv[CFG_TUH_INTERFACE_MAX];  // map interface number to driver (0xff is invalid)\n  uint8_t ep2drv[CFG_TUH_ENDPOINT_MAX][2]; // map endpoint to driver ( 0xff is invalid ), can use only 4-bit each\n\n  tu_edpt_state_t ep_status[CFG_TUH_ENDPOINT_MAX][2];\n\n#if CFG_TUH_API_EDPT_XFER\n  // TODO array can be CFG_TUH_ENDPOINT_MAX-1\n  struct {\n    tuh_xfer_cb_t complete_cb;\n    uintptr_t user_data;\n  }ep_callback[CFG_TUH_ENDPOINT_MAX][2];\n#endif\n\n} usbh_device_t;\n\n// sum of end device + hub\n#define TOTAL_DEVICES   (CFG_TUH_DEVICE_MAX + CFG_TUH_HUB)\n\n// all devices excluding zero-address\n// hub address start from CFG_TUH_DEVICE_MAX+1\n// TODO: hub can has its own simpler struct to save memory\nstatic usbh_device_t _usbh_devices[TOTAL_DEVICES];\n\n// Mutex for claiming endpoint\n#if OSAL_MUTEX_REQUIRED\nstatic osal_mutex_def_t _usbh_mutexdef;\nstatic osal_mutex_t _usbh_mutex;\n#else\n#define _usbh_mutex   NULL\n#endif\n\n// Spinlock for interrupt handler\nstatic OSAL_SPINLOCK_DEF(_usbh_spin, usbh_int_set);\n\n// Event queue: usbh_int_set() is used as mutex in OS NONE config\nOSAL_QUEUE_DEF(usbh_int_set, _usbh_qdef, CFG_TUH_TASK_QUEUE_SZ, hcd_event_t);\nstatic osal_queue_t _usbh_q;\n\n  #if CFG_TUH_HUB\n// Deferred attachment queue, only needed when using hub\nOSAL_QUEUE_DEF(usbh_int_set, _usbh_daqdef, CFG_TUH_HUB, hcd_event_t);\nstatic osal_queue_t _usbh_daq;\n  #endif\n\n// Control transfers: since most controllers do not support multiple control transfers\n// on multiple devices concurrently and control transfers are not used much except for\n// enumeration, we will only execute control transfers one at a time.\ntypedef struct {\n  uint8_t* buffer;\n  tuh_xfer_cb_t complete_cb;\n  uintptr_t user_data;\n\n  volatile uint8_t stage;\n  uint8_t daddr;\n  volatile uint16_t actual_len;\n  uint8_t failed_count;\n} usbh_ctrl_xfer_info_t;\n\ntypedef struct {\n  tusb_defer_func_t func;\n  uintptr_t         arg;\n  uint32_t          at_ms;\n} usbh_call_after_t;\n\ntypedef struct {\n  uint8_t controller_id;      // controller ID\n  uint8_t enumerating_daddr;  // device address of the device being enumerated\n  uint8_t attach_debouncing_bm;  // bitmask for roothub port attach debouncing\n  tuh_bus_info_t dev0_bus;    // bus info for dev0 in enumeration\n  usbh_ctrl_xfer_info_t ctrl_xfer_info; // control transfer\n  usbh_call_after_t call_after;\n} usbh_data_t;\n\nstatic usbh_data_t _usbh_data = {\n  .controller_id = TUSB_INDEX_INVALID_8,\n};\n\ntypedef struct {\n  TUH_EPBUF_TYPE_DEF(tusb_control_request_t, request);\n  TUH_EPBUF_DEF(ctrl, CFG_TUH_ENUMERATION_BUFSIZE);\n} usbh_epbuf_t;\nCFG_TUH_MEM_SECTION static usbh_epbuf_t _usbh_epbuf;\n\n//--------------------------------------------------------------------+\n// Class Driver\n//--------------------------------------------------------------------+\n#if CFG_TUSB_DEBUG >= CFG_TUH_LOG_LEVEL\n  #define DRIVER_NAME(_name)  _name\n#else\n  #define DRIVER_NAME(_name)  NULL\n#endif\n\nstatic usbh_class_driver_t const usbh_class_drivers[] = {\n  #if CFG_TUH_CDC\n  {\n      .name       = DRIVER_NAME(\"CDC\"),\n      .init       = cdch_init,\n      .deinit     = cdch_deinit,\n      .open       = cdch_open,\n      .set_config = cdch_set_config,\n      .xfer_cb    = cdch_xfer_cb,\n      .close      = cdch_close\n  },\n  #endif\n\n  #if CFG_TUH_MSC\n  {\n      .name       = DRIVER_NAME(\"MSC\"),\n      .init       = msch_init,\n      .deinit     = msch_deinit,\n      .open       = msch_open,\n      .set_config = msch_set_config,\n      .xfer_cb    = msch_xfer_cb,\n      .close      = msch_close\n  },\n  #endif\n\n  #if CFG_TUH_HID\n  {\n      .name       = DRIVER_NAME(\"HID\"),\n      .init       = hidh_init,\n      .deinit     = hidh_deinit,\n      .open       = hidh_open,\n      .set_config = hidh_set_config,\n      .xfer_cb    = hidh_xfer_cb,\n      .close      = hidh_close\n  },\n  #endif\n\n  #if CFG_TUH_MIDI\n  {\n      .name       = DRIVER_NAME(\"MIDI\"),\n      .init       = midih_init,\n      .deinit     = midih_deinit,\n      .open       = midih_open,\n      .set_config = midih_set_config,\n      .xfer_cb    = midih_xfer_cb,\n      .close      = midih_close\n  },\n  #endif\n\n  #if CFG_TUH_HUB\n  {\n      .name       = DRIVER_NAME(\"HUB\"),\n      .init       = hub_init,\n      .deinit     = hub_deinit,\n      .open       = hub_open,\n      .set_config = hub_set_config,\n      .xfer_cb    = hub_xfer_cb,\n      .close      = hub_close\n  },\n  #endif\n\n  #if CFG_TUH_VENDOR\n  {\n    .name       = DRIVER_NAME(\"VENDOR\"),\n    .init       = cush_init,\n    .deinit     = cush_deinit,\n    .open       = cush_open,\n    .set_config = cush_set_config,\n    .xfer_cb    = cush_isr,\n    .close      = cush_close\n  }\n  #endif\n};\n\nenum { BUILTIN_DRIVER_COUNT = TU_ARRAY_SIZE(usbh_class_drivers) };\n\n// Additional class drivers implemented by application\nstatic usbh_class_driver_t const * _app_driver = NULL;\nstatic uint8_t _app_driver_count = 0;\n\n#define TOTAL_DRIVER_COUNT    (_app_driver_count + BUILTIN_DRIVER_COUNT)\n\n// virtually joins built-in and application drivers together.\n// Application is positioned first to allow overwriting built-in ones.\nTU_ATTR_ALWAYS_INLINE static inline usbh_class_driver_t const *get_driver(uint8_t drv_id) {\n  usbh_class_driver_t const *driver = NULL;\n  if (drv_id < _app_driver_count) {\n    driver = &_app_driver[drv_id];\n  } else {\n    drv_id -= _app_driver_count;\n    if (drv_id < BUILTIN_DRIVER_COUNT) {\n      driver = &usbh_class_drivers[drv_id];\n    }\n  }\n\n  return driver;\n}\n\n//--------------------------------------------------------------------+\n// Function Inline and Prototypes\n//--------------------------------------------------------------------+\nstatic void enum_new_device(hcd_event_t* event);\nstatic void enum_delay_async(uintptr_t state);\nstatic void process_remove_event(hcd_event_t *event);\nstatic void remove_device_tree(uint8_t rhport, uint8_t hub_addr, uint8_t hub_port);\nstatic bool usbh_edpt_control_open(uint8_t dev_addr, uint8_t max_packet_size);\nstatic bool usbh_control_xfer_cb (uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\n\nTU_ATTR_ALWAYS_INLINE static inline usbh_device_t* get_device(uint8_t dev_addr) {\n  TU_VERIFY(dev_addr > 0 && dev_addr <= TOTAL_DEVICES, NULL);\n  return &_usbh_devices[dev_addr-1];\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool is_hub_addr(uint8_t daddr) {\n  return (CFG_TUH_HUB > 0) && (daddr > CFG_TUH_DEVICE_MAX); //-V560\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool queue_event(hcd_event_t const * event, bool in_isr) {\n  TU_ASSERT(osal_queue_send(_usbh_q, event, in_isr));\n  tuh_event_hook_cb(event->rhport, event->event_id, in_isr);\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void _control_set_xfer_stage(uint8_t stage) {\n  if (_usbh_data.ctrl_xfer_info.stage != stage) {\n    (void) osal_mutex_lock(_usbh_mutex, OSAL_TIMEOUT_WAIT_FOREVER);\n    _usbh_data.ctrl_xfer_info.stage = stage;\n    (void) osal_mutex_unlock(_usbh_mutex);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool usbh_setup_send(uint8_t daddr, const uint8_t setup_packet[8]) {\n  const uint8_t rhport = usbh_get_rhport(daddr);\n  const bool ret = hcd_setup_send(rhport, daddr, setup_packet);\n  if (!ret) {\n    _control_set_xfer_stage(CONTROL_STAGE_IDLE);\n  }\n  return ret;\n}\n\nbool usbh_defer_func_ms_async(uint32_t ms, tusb_defer_func_t func, uintptr_t param) {\n  TU_ASSERT(_usbh_data.call_after.func == NULL);\n  TU_LOG_USBH(\"USBH schedule function after %u ms\\r\\n\", (unsigned int)ms);\n  _usbh_data.call_after.func  = func;\n  _usbh_data.call_after.arg   = param;\n  _usbh_data.call_after.at_ms = tusb_time_millis_api() + ms;\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void usbh_device_close(uint8_t rhport, uint8_t daddr) {\n  hcd_device_close(rhport, daddr);\n\n  // abort any ongoing control transfer\n  if (daddr == _usbh_data.ctrl_xfer_info.daddr) {\n    _control_set_xfer_stage(CONTROL_STAGE_IDLE);\n  }\n\n  // invalidate if enumerating\n  if (daddr == _usbh_data.enumerating_daddr) {\n    _usbh_data.enumerating_daddr = TUSB_INDEX_INVALID_8;\n    // clear enum delay function of the device being removed\n    if (_usbh_data.call_after.func == enum_delay_async) {\n      _usbh_data.call_after.func = NULL;\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Device API\n//--------------------------------------------------------------------+\nbool tuh_mounted(uint8_t dev_addr) {\n  usbh_device_t *dev = get_device(dev_addr);\n  TU_VERIFY(dev);\n  return dev->configured;\n}\n\nbool tuh_connected(uint8_t daddr) {\n  if (daddr == 0) {\n    return _usbh_data.enumerating_daddr == 0;\n  } else {\n    const usbh_device_t* dev = get_device(daddr);\n    TU_VERIFY(dev != NULL);\n    return dev->connected;\n  }\n}\n\nbool tuh_vid_pid_get(uint8_t dev_addr, uint16_t *vid, uint16_t *pid) {\n  *vid = *pid = 0;\n\n  usbh_device_t const *dev = get_device(dev_addr);\n  TU_VERIFY(dev && dev->addressed && dev->desc_device.idVendor != 0);\n\n  *vid = dev->desc_device.idVendor;\n  *pid = dev->desc_device.idProduct;\n\n  return true;\n}\n\nbool tuh_descriptor_get_device_local(uint8_t daddr, tusb_desc_device_t* desc_device) {\n  usbh_device_t *dev = get_device(daddr);\n  TU_VERIFY(dev && desc_device);\n\n  desc_device->bLength = sizeof(tusb_desc_device_t);\n  desc_device->bDescriptorType = TUSB_DESC_DEVICE;\n  memcpy((uint8_t*) desc_device + offsetof(tusb_desc_device_t, bcdUSB), &dev->desc_device, sizeof(desc_device_noheader_t));\n\n  return true;\n}\n\ntusb_speed_t tuh_speed_get(uint8_t daddr) {\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(daddr, &bus_info);\n  return (tusb_speed_t)bus_info.speed;\n}\n\nbool tuh_rhport_is_active(uint8_t rhport) {\n  return _usbh_data.controller_id == rhport;\n}\n\nbool tuh_rhport_reset_bus(uint8_t rhport, bool active) {\n  TU_VERIFY(tuh_rhport_is_active(rhport));\n  if (active) {\n    hcd_port_reset(rhport);\n  } else {\n    hcd_port_reset_end(rhport);\n  }\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// PUBLIC API (Parameter Verification is required)\n//--------------------------------------------------------------------+\nbool tuh_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param) {\n  return hcd_configure(rhport, cfg_id, cfg_param);\n}\n\nstatic void clear_device(usbh_device_t* dev) {\n  tu_memclr(dev, sizeof(usbh_device_t));\n  (void) memset(dev->itf2drv, TUSB_INDEX_INVALID_8, sizeof(dev->itf2drv)); // invalid mapping\n  (void) memset(dev->ep2drv , TUSB_INDEX_INVALID_8, sizeof(dev->ep2drv )); // invalid mapping\n}\n\nbool tuh_inited(void) {\n  return _usbh_data.controller_id != TUSB_INDEX_INVALID_8;\n}\n\nbool tuh_rhport_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  if (tuh_rhport_is_active(rhport)) {\n    return true; // skip if already initialized\n  }\n#if CFG_TUSB_DEBUG >= CFG_TUH_LOG_LEVEL\n  char const* speed_str = 0;\n  switch (rh_init->speed) {\n    case TUSB_SPEED_HIGH:\n      speed_str = \"High\";\n    break;\n    case TUSB_SPEED_FULL:\n      speed_str = \"Full\";\n    break;\n    case TUSB_SPEED_LOW:\n      speed_str = \"Low\";\n    break;\n    case TUSB_SPEED_AUTO:\n      speed_str = \"Auto\";\n    break;\n  default:\n    break;\n  }\n  TU_LOG_USBH(\"USBH init on controller %u, speed = %s\\r\\n\", rhport, speed_str);\n#endif\n\n  // Init host stack if not already\n  if (!tuh_inited()) {\n    TU_LOG_INT_USBH(sizeof(usbh_data_t));\n    TU_LOG_INT_USBH(sizeof(usbh_device_t));\n    TU_LOG_INT_USBH(sizeof(hcd_event_t));\n    TU_LOG_INT_USBH(sizeof(tuh_xfer_t));\n    TU_LOG_INT_USBH(sizeof(tu_fifo_t));\n    TU_LOG_INT_USBH(sizeof(tu_edpt_stream_t));\n\n    osal_spin_init(&_usbh_spin);\n\n    // Event queue\n    _usbh_q = osal_queue_create(&_usbh_qdef);\n    TU_ASSERT(_usbh_q != NULL);\n\n  #if CFG_TUH_HUB\n    // Deferred attachment queue\n    _usbh_daq = osal_queue_create(&_usbh_daqdef);\n    TU_ASSERT(_usbh_daq != NULL);\n  #endif\n\n  #if OSAL_MUTEX_REQUIRED\n    // Init mutex\n    _usbh_mutex = osal_mutex_create(&_usbh_mutexdef);\n    TU_ASSERT(_usbh_mutex);\n  #endif\n\n    // Get application driver if available\n    _app_driver = usbh_app_driver_get_cb(&_app_driver_count);\n\n    // Device\n    tu_memclr(_usbh_devices, sizeof(_usbh_devices));\n    tu_memclr(&_usbh_data, sizeof(_usbh_data));\n\n    _usbh_data.controller_id = TUSB_INDEX_INVALID_8;\n    _usbh_data.enumerating_daddr = TUSB_INDEX_INVALID_8;\n\n    for (uint8_t i = 0; i < TOTAL_DEVICES; i++) {\n      clear_device(&_usbh_devices[i]);\n    }\n\n    // Class drivers\n    for (uint8_t drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {\n      usbh_class_driver_t const* driver = get_driver(drv_id);\n      if (driver != NULL) {\n        TU_LOG_USBH(\"%s init\\r\\n\", driver->name);\n        driver->init();\n      }\n    }\n  }\n\n  // Init host controller\n  _usbh_data.controller_id = rhport;\n  TU_ASSERT(hcd_init(rhport, rh_init));\n  hcd_int_enable(rhport);\n\n  return true;\n}\n\nbool tuh_deinit(uint8_t rhport) {\n  if (!tuh_rhport_is_active(rhport)) {\n    return true;\n  }\n\n  // deinit host controller\n  hcd_int_disable(rhport);\n  TU_ASSERT(hcd_deinit(rhport));\n  _usbh_data.controller_id = TUSB_INDEX_INVALID_8;\n\n  // remove all devices on this rhport (hub_addr = 0, hub_port = 0)\n  remove_device_tree(rhport, 0, 0);\n\n  // deinit host stack if no controller is active\n  if (!tuh_inited()) {\n    // Class drivers\n    for (uint8_t drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {\n      usbh_class_driver_t const* driver = get_driver(drv_id);\n      if (driver && driver->deinit) {\n        TU_LOG_USBH(\"%s deinit\\r\\n\", driver->name);\n        driver->deinit();\n      }\n    }\n\n    osal_queue_delete(_usbh_q);\n    _usbh_q = NULL;\n\n  #if CFG_TUH_HUB\n    osal_queue_delete(_usbh_daq);\n    _usbh_daq = NULL;\n  #endif\n\n  #if OSAL_MUTEX_REQUIRED\n    // TODO make sure there is no task waiting on this mutex\n    osal_mutex_delete(_usbh_mutex);\n    _usbh_mutex = NULL;\n  #endif\n  }\n\n  return true;\n}\n\nbool tuh_task_event_ready(void) {\n  if (!tuh_inited()) {\n    return false; // Skip if tusb stack is not initialized\n  }\n  if (!osal_queue_empty(_usbh_q)) {\n    return true;\n  }\n\n  #if CFG_TUH_HUB\n  if (!osal_queue_empty(_usbh_daq)) {\n    return true;\n  }\n  #endif\n\n  return false;\n}\n\n/* USB Host Driver task\n * This top level thread manages all host controller event and delegates events to class-specific drivers.\n * This should be called periodically within the mainloop or rtos thread.\n *\n   @code\n    int main(void) {\n      application_init();\n      tusb_init(0, TUSB_ROLE_HOST);\n\n      while(1) { // the mainloop\n        application_code();\n        tuh_task(); // tinyusb host task\n      }\n    }\n    @endcode\n */\nvoid tuh_task_ext(uint32_t timeout_ms, bool in_isr) {\n  // Skip if stack is not initialized\n  if (!tuh_inited()) {\n    return;\n  }\n\n  (void) in_isr; // not implemented yet\n\n  // Loop until there are no more events in the queue or CFG_TUH_TASK_EVENTS_PER_RUN is reached\n  for (unsigned epr = 0;; epr++) {\n  #if CFG_TUH_TASK_EVENTS_PER_RUN > 0\n    if (epr >= CFG_TUH_TASK_EVENTS_PER_RUN) {\n      TU_LOG_USBH(\"USBH event limit (\" TU_XSTRING(CFG_TUH_TASK_EVENTS_PER_RUN) \") reached\\r\\n\");\n      break;\n    }\n  #endif\n\n    // Process call_after_ms function if ms is reached\n    tusb_defer_func_t after_cb = _usbh_data.call_after.func;\n    if (after_cb) {\n      int32_t remain_ms = (int32_t)(_usbh_data.call_after.at_ms - tusb_time_millis_api());\n      if (remain_ms <= 0) {\n        // delay expired, run callback now\n        TU_LOG_USBH(\"USBH invoke scheduled function\\r\\n\");\n        _usbh_data.call_after.func = NULL;\n        after_cb(_usbh_data.call_after.arg);\n      }\n\n      // above after_cb() can re-schedule another function, we need to re-check and reduce timeout of\n      // the main event timeout to make sure we aren't blocking more than call_after remaining ms.\n      if (_usbh_data.call_after.func != NULL) {\n        remain_ms = (int32_t) (_usbh_data.call_after.at_ms - tusb_time_millis_api());\n        if (remain_ms <= 0) {\n          timeout_ms = 0; // expired already\n        } else if (timeout_ms > (uint32_t)remain_ms) {\n          timeout_ms = (uint32_t)remain_ms;\n        }\n      }\n    }\n\n    hcd_event_t event;\n\n  #if CFG_TUH_HUB\n    // Get deferred device attachments if none is enumerating\n    bool has_deferred_attach = false;\n    if (_usbh_data.enumerating_daddr == TUSB_INDEX_INVALID_8) {\n      // zero wait to avoid blocking the main event queue\n      has_deferred_attach = osal_queue_receive(_usbh_daq, &event, 0);\n    }\n\n    if (!has_deferred_attach) // skip event queue to process deferred attach\n  #endif\n    {\n      if (!osal_queue_receive(_usbh_q, &event, timeout_ms)) {\n        return;\n      }\n    }\n\n    switch (event.event_id) {\n      case HCD_EVENT_DEVICE_ATTACH:\n        // Should we miss the hub detach event due to high traffic, Or due to physical debouncing, some devices can\n        // cause multiple attaches (actually reset) without a detached event.\n        // Force remove currently mounted with the same bus info (rhport, hub addr, hub port) if exists\n        process_remove_event(&event);\n\n        // due to the shared control buffer, we must fully complete enumerating one device first.\n        if (_usbh_data.enumerating_daddr == TUSB_INDEX_INVALID_8) {\n          // New device attached and we are ready\n          TU_LOG_USBH(\"[%u:] USBH Device Attach\\r\\n\", event.rhport);\n          _usbh_data.enumerating_daddr = 0; // enumerate new device with address 0\n          enum_new_device(&event);\n        }\n  #if CFG_TUH_HUB\n        else {\n          TU_LOG_USBH(\"[%u:] USBH Defer Attach until current enumeration complete\\r\\n\", event.rhport);\n          TU_ASSERT(osal_queue_send(_usbh_daq, &event, in_isr), );\n        }\n  #endif\n        break;\n\n      case HCD_EVENT_DEVICE_REMOVE:\n        TU_LOG_USBH(\"[%u:%u:%u] USBH Device Removed\\r\\n\", event.rhport, event.connection.hub_addr, event.connection.hub_port);\n        process_remove_event(&event);\n        break;\n\n      case HCD_EVENT_XFER_COMPLETE: {\n        uint8_t const ep_addr = event.xfer_complete.ep_addr;\n        uint8_t const epnum = tu_edpt_number(ep_addr);\n        uint8_t const ep_dir = (uint8_t) tu_edpt_dir(ep_addr);\n\n        TU_LOG_USBH(\"[:%u] on EP %02X with %u bytes: %s\\r\\n\",\n                    event.dev_addr, ep_addr, (unsigned int) event.xfer_complete.len, tu_str_xfer_result[event.xfer_complete.result]);\n\n        if (event.dev_addr == 0) {\n          // device 0 only has control endpoint\n          TU_ASSERT(epnum == 0,);\n          usbh_control_xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result, event.xfer_complete.len);\n        } else {\n          usbh_device_t* dev = get_device(event.dev_addr);\n          TU_VERIFY(dev && dev->connected,);\n\n          dev->ep_status[epnum][ep_dir].busy = 0;\n          dev->ep_status[epnum][ep_dir].claimed = 0;\n\n          if (0 == epnum) {\n            usbh_control_xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result, event.xfer_complete.len);\n          } else {\n            // Prefer application callback over built-in one if available. This occurs when tuh_edpt_xfer() is used\n            // with enabled driver e.g HID endpoint\n            #if CFG_TUH_API_EDPT_XFER\n            tuh_xfer_cb_t const complete_cb = dev->ep_callback[epnum][ep_dir].complete_cb;\n            if (complete_cb != NULL) {\n              // re-construct xfer info\n              tuh_xfer_t xfer = {\n                  .daddr       = event.dev_addr,\n                  .ep_addr     = ep_addr,\n                  .result      = (xfer_result_t)event.xfer_complete.result,\n                  .actual_len  = event.xfer_complete.len,\n                  .buflen      = 0,    // not available\n                  .buffer      = NULL, // not available\n                  .complete_cb = complete_cb,\n                  .user_data   = dev->ep_callback[epnum][ep_dir].user_data\n              };\n              complete_cb(&xfer);\n            }else\n            #endif\n            {\n              uint8_t drv_id = dev->ep2drv[epnum][ep_dir];\n              usbh_class_driver_t const* driver = get_driver(drv_id);\n              if (driver != NULL) {\n                TU_LOG_USBH(\"  %s xfer callback\\r\\n\", driver->name);\n                driver->xfer_cb(event.dev_addr, ep_addr, (xfer_result_t) event.xfer_complete.result,\n                                event.xfer_complete.len);\n              } else {\n                // no driver/callback responsible for this transfer\n                TU_ASSERT(false,);\n              }\n            }\n          }\n        }\n        break;\n      }\n\n      case USBH_EVENT_FUNC_CALL:\n        if (event.func_call.func != NULL) {\n          event.func_call.func(event.func_call.param);\n        }\n        break;\n\n      default:\n        // unknown event\n        break;\n    }\n\n    // allow to exit tuh_task() if there is no event in the next run\n    timeout_ms = 0;\n  }\n}\n\n//--------------------------------------------------------------------+\n// Control transfer\n//--------------------------------------------------------------------+\n\nstatic void _control_blocking_complete_cb(tuh_xfer_t* xfer) {\n  // update result\n  *((xfer_result_t*) xfer->user_data) = xfer->result;\n}\n\n// TODO timeout_ms is not supported yet\nbool tuh_control_xfer (tuh_xfer_t* xfer) {\n  TU_VERIFY(xfer->ep_addr == 0 && xfer->setup); // EP0 with setup packet\n  const uint8_t daddr = xfer->daddr;\n  TU_VERIFY(tuh_connected(daddr));\n\n  usbh_ctrl_xfer_info_t* ctrl_info = &_usbh_data.ctrl_xfer_info;\n\n  TU_VERIFY(ctrl_info->stage == CONTROL_STAGE_IDLE); // pre-check to help reducing mutex lock\n  (void) osal_mutex_lock(_usbh_mutex, OSAL_TIMEOUT_WAIT_FOREVER);\n  bool const is_idle = (ctrl_info->stage == CONTROL_STAGE_IDLE);\n  if (is_idle) {\n    ctrl_info->stage        = CONTROL_STAGE_SETUP;\n    ctrl_info->daddr        = daddr;\n    ctrl_info->actual_len   = 0;\n    ctrl_info->failed_count = 0;\n\n    ctrl_info->buffer       = xfer->buffer;\n    ctrl_info->complete_cb  = xfer->complete_cb;\n    ctrl_info->user_data    = xfer->user_data;\n    _usbh_epbuf.request     = (*xfer->setup);\n  }\n  (void) osal_mutex_unlock(_usbh_mutex);\n\n  TU_VERIFY(is_idle);\n  TU_LOG_USBH(\"[%u:%u] %s: \", usbh_get_rhport(daddr), daddr,\n              (xfer->setup->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD && xfer->setup->bRequest <= TUSB_REQ_SYNCH_FRAME) ?\n                  tu_str_std_request[xfer->setup->bRequest] : \"Class Request\");\n  TU_LOG_BUF_USBH(xfer->setup, 8);\n\n  if (xfer->complete_cb != NULL) {\n    TU_ASSERT(usbh_setup_send(daddr, (uint8_t const *) &_usbh_epbuf.request));\n  }else {\n    // blocking if complete callback is not provided\n    // change callback to internal blocking, and result as user argument\n    volatile xfer_result_t result = XFER_RESULT_INVALID;\n\n    // use user_data to point to xfer_result_t\n    ctrl_info->user_data   = (uintptr_t) &result;\n    ctrl_info->complete_cb = _control_blocking_complete_cb;\n\n    TU_ASSERT(usbh_setup_send(daddr, (uint8_t const *) &_usbh_epbuf.request));\n\n    while (result == XFER_RESULT_INVALID) {\n      // Note: this can be called within an callback ie. part of tuh_task()\n      // therefore even with RTOS tuh_task_ext() still need to be invoked\n      tuh_task_ext(0, false);\n      // TODO probably some timeout to prevent hanged\n    }\n\n    // update transfer result, user_data is expected to point to xfer_result_t\n    if (xfer->user_data != 0) {\n      *((xfer_result_t*) xfer->user_data) = result;\n    }\n    xfer->result     = result;\n    xfer->actual_len = ctrl_info->actual_len;\n  }\n\n  return true;\n}\n\nstatic void _control_xfer_complete(uint8_t daddr, xfer_result_t result) {\n  TU_LOG_USBH(\"\\r\\n\");\n  usbh_ctrl_xfer_info_t* ctrl_info = &_usbh_data.ctrl_xfer_info;\n\n  // duplicate xfer since user can execute control transfer within callback\n  tusb_control_request_t const request = _usbh_epbuf.request;\n  tuh_xfer_t xfer_temp = {\n    .daddr       = daddr,\n    .ep_addr     = 0,\n    .result      = result,\n    .setup       = &request,\n    .actual_len  = (uint32_t) ctrl_info->actual_len,\n    .buffer      = ctrl_info->buffer,\n    .complete_cb = ctrl_info->complete_cb,\n    .user_data   = ctrl_info->user_data\n  };\n\n  _control_set_xfer_stage(CONTROL_STAGE_IDLE);\n\n  if (xfer_temp.complete_cb != NULL) {\n    xfer_temp.complete_cb(&xfer_temp);\n  }\n}\n\nstatic bool usbh_control_xfer_cb (uint8_t daddr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes) {\n  (void) ep_addr;\n\n  const uint8_t rhport = usbh_get_rhport(daddr);\n  tusb_control_request_t const * request = &_usbh_epbuf.request;\n  usbh_ctrl_xfer_info_t* ctrl_info = &_usbh_data.ctrl_xfer_info;\n\n  switch (result) {\n    case XFER_RESULT_STALLED:\n      TU_LOG_USBH(\"[%u:%u] Control STALLED, xferred_bytes = %\" PRIu32 \"\\r\\n\", rhport, daddr, xferred_bytes);\n      TU_LOG_BUF_USBH(request, 8);\n      _control_xfer_complete(daddr, result);\n    break;\n\n    case XFER_RESULT_FAILED:\n      if (tuh_connected(daddr) && ctrl_info->failed_count < USBH_CONTROL_RETRY_MAX) {\n        TU_LOG_USBH(\"[%u:%u] Control FAILED %u/%u, retrying\\r\\n\", rhport, daddr, ctrl_info->failed_count+1, USBH_CONTROL_RETRY_MAX);\n        (void) osal_mutex_lock(_usbh_mutex, OSAL_TIMEOUT_WAIT_FOREVER);\n        ctrl_info->stage = CONTROL_STAGE_SETUP;\n        ctrl_info->failed_count++;\n        ctrl_info->actual_len = 0; // reset actual_len\n        (void) osal_mutex_unlock(_usbh_mutex);\n\n        TU_ASSERT(usbh_setup_send(daddr, (uint8_t const *) request));\n      } else {\n        TU_LOG_USBH(\"[%u:%u] Control FAILED, xferred_bytes = %\" PRIu32 \"\\r\\n\", rhport, daddr, xferred_bytes);\n        TU_LOG_BUF_USBH(request, 8);\n        _control_xfer_complete(daddr, result);\n      }\n    break;\n\n    case XFER_RESULT_SUCCESS:\n      switch(ctrl_info->stage) {\n        case CONTROL_STAGE_SETUP:\n          if (request->wLength > 0) {\n            // DATA stage: initial data toggle is always 1\n            _control_set_xfer_stage(CONTROL_STAGE_DATA);\n            const uint8_t ep_data = tu_edpt_addr(0, request->bmRequestType_bit.direction);\n            TU_ASSERT(hcd_edpt_xfer(rhport, daddr, ep_data, ctrl_info->buffer, request->wLength));\n            return true;\n          }\n          TU_ATTR_FALLTHROUGH;\n\n        case CONTROL_STAGE_DATA: {\n            if (request->wLength > 0) {\n              TU_LOG_USBH(\"[%u:%u] Control data:\\r\\n\", rhport, daddr);\n              TU_LOG_MEM_USBH(ctrl_info->buffer, xferred_bytes, 2);\n            }\n            ctrl_info->actual_len = (uint16_t) xferred_bytes;\n\n            // ACK stage: toggle is always 1\n            _control_set_xfer_stage(CONTROL_STAGE_ACK);\n            const uint8_t ep_status = tu_edpt_addr(0, 1 - request->bmRequestType_bit.direction);\n            TU_ASSERT(hcd_edpt_xfer(rhport, daddr, ep_status, NULL, 0));\n            break;\n          }\n\n        case CONTROL_STAGE_ACK: {\n          // Abort all pending transfers if SET_CONFIGURATION request\n          // NOTE: should we force closing all non-control endpoints in the future?\n          if (request->bRequest == TUSB_REQ_SET_CONFIGURATION && request->bmRequestType == 0x00) {\n            for(uint8_t epnum=1; epnum<CFG_TUH_ENDPOINT_MAX; epnum++) {\n              for(uint8_t dir=0; dir<2; dir++) {\n                tuh_edpt_abort_xfer(daddr, tu_edpt_addr(epnum, dir));\n              }\n            }\n          }\n\n          _control_xfer_complete(daddr, result);\n          break;\n        }\n\n        default: return false; // unsupported stage\n      }\n      break;\n\n    default: return false; // unsupported result\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nbool tuh_edpt_xfer(tuh_xfer_t* xfer) {\n  uint8_t const daddr = xfer->daddr;\n  uint8_t const ep_addr = xfer->ep_addr;\n\n  TU_VERIFY(daddr && ep_addr);\n  TU_VERIFY(usbh_edpt_claim(daddr, ep_addr));\n\n  if (!usbh_edpt_xfer_with_callback(daddr, ep_addr, xfer->buffer, (uint16_t) xfer->buflen,\n                                    xfer->complete_cb, xfer->user_data)) {\n    usbh_edpt_release(daddr, ep_addr);\n    return false;\n  }\n\n  return true;\n}\n\nbool tuh_edpt_abort_xfer(uint8_t daddr, uint8_t ep_addr) {\n  TU_LOG_USBH(\"[%u] Aborted transfer on EP %02X\\r\\n\", daddr, ep_addr);\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir   = tu_edpt_dir(ep_addr);\n\n  if (epnum == 0) {\n    // Also include dev0 for aborting enumerating\n    const uint8_t rhport = usbh_get_rhport(daddr);\n\n    // control transfer: only 1 control at a time, check if we are aborting the current one\n    const usbh_ctrl_xfer_info_t* ctrl_info = &_usbh_data.ctrl_xfer_info;\n    TU_VERIFY(daddr == ctrl_info->daddr && ctrl_info->stage != CONTROL_STAGE_IDLE);\n    hcd_edpt_abort_xfer(rhport, daddr, ep_addr);\n    _control_set_xfer_stage(CONTROL_STAGE_IDLE); // reset control transfer state to idle\n  } else {\n    usbh_device_t* dev = get_device(daddr);\n    TU_VERIFY(dev);\n\n    TU_VERIFY(dev->ep_status[epnum][dir].busy); // non-control skip if not busy\n    // abort then mark as ready and release endpoint\n    hcd_edpt_abort_xfer(dev->bus_info.rhport, daddr, ep_addr);\n    dev->ep_status[epnum][dir].busy = false;\n    tu_edpt_release(&dev->ep_status[epnum][dir], _usbh_mutex);\n  }\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// USBH API For Class Driver\n//--------------------------------------------------------------------+\n\nuint8_t usbh_get_rhport(uint8_t daddr) {\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(daddr, &bus_info);\n  return bus_info.rhport;\n}\n\nuint8_t *usbh_get_enum_buf(void) {\n  return _usbh_epbuf.ctrl;\n}\n\nvoid usbh_int_set(bool enabled) {\n  // TODO all host controller if multiple are used since they shared the same event queue\n  if (enabled) {\n    hcd_int_enable(_usbh_data.controller_id);\n  } else {\n    hcd_int_disable(_usbh_data.controller_id);\n  }\n}\n\nvoid usbh_spin_lock(bool in_isr) {\n  osal_spin_lock(&_usbh_spin, in_isr);\n}\n\nvoid usbh_spin_unlock(bool in_isr) {\n  osal_spin_unlock(&_usbh_spin, in_isr);\n}\n\nvoid usbh_defer_func(osal_task_func_t func, void *param, bool in_isr) {\n  hcd_event_t event = { 0 };\n  event.event_id = USBH_EVENT_FUNC_CALL;\n  event.func_call.func = func;\n  event.func_call.param = param;\n  queue_event(&event, in_isr);\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n// Claim an endpoint for transfer\nbool usbh_edpt_claim(uint8_t dev_addr, uint8_t ep_addr) {\n  // Note: addr0 only use tuh_control_xfer\n  usbh_device_t* dev = get_device(dev_addr);\n  TU_ASSERT(dev && dev->connected);\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  TU_VERIFY(tu_edpt_claim(&dev->ep_status[epnum][dir], _usbh_mutex));\n  TU_LOG_USBH(\"[%u] Claimed EP 0x%02x\\r\\n\", dev_addr, ep_addr);\n\n  return true;\n}\n\n// Release an claimed endpoint due to failed transfer attempt\nbool usbh_edpt_release(uint8_t dev_addr, uint8_t ep_addr) {\n  // Note: addr0 only use tuh_control_xfer\n  usbh_device_t* dev = get_device(dev_addr);\n  TU_VERIFY(dev && dev->connected);\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  TU_VERIFY(tu_edpt_release(&dev->ep_status[epnum][dir], _usbh_mutex));\n  TU_LOG_USBH(\"[%u] Released EP 0x%02x\\r\\n\", dev_addr, ep_addr);\n\n  return true;\n}\n\n// Submit an transfer\nbool usbh_edpt_xfer_with_callback(uint8_t dev_addr, uint8_t ep_addr, uint8_t* buffer, uint16_t total_bytes,\n                                  tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  (void) complete_cb;\n  (void) user_data;\n\n  usbh_device_t* dev = get_device(dev_addr);\n  TU_VERIFY(dev);\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n  tu_edpt_state_t* ep_state = &dev->ep_status[epnum][dir];\n\n  TU_LOG_USBH(\"  Queue EP %02X with %u bytes ... \\r\\n\", ep_addr, total_bytes);\n\n  // Attempt to transfer on a busy endpoint, sound like an race condition !\n  TU_ASSERT(ep_state->busy == 0);\n\n  // Set busy first since the actual transfer can be complete before hcd_edpt_xfer()\n  // could return and USBH task can preempt and clear the busy\n  ep_state->busy = 1;\n\n#if CFG_TUH_API_EDPT_XFER\n  dev->ep_callback[epnum][dir].complete_cb = complete_cb;\n  dev->ep_callback[epnum][dir].user_data   = user_data;\n#endif\n\n  if (hcd_edpt_xfer(dev->bus_info.rhport, dev_addr, ep_addr, buffer, total_bytes)) {\n    TU_LOG_USBH(\"OK\\r\\n\");\n    return true;\n  } else {\n    // HCD error, mark endpoint as ready to allow next transfer\n    ep_state->busy = 0;\n    ep_state->claimed = 0;\n    TU_LOG1(\"Failed\\r\\n\");\n//    TU_BREAKPOINT();\n    return false;\n  }\n}\n\nstatic bool usbh_edpt_control_open(uint8_t dev_addr, uint8_t max_packet_size) {\n  TU_LOG_USBH(\"[%u:%u] Open EP0 with Size = %u\\r\\n\", usbh_get_rhport(dev_addr), dev_addr, max_packet_size);\n  tusb_desc_endpoint_t ep0_desc = {\n    .bLength          = sizeof(tusb_desc_endpoint_t),\n    .bDescriptorType  = TUSB_DESC_ENDPOINT,\n    .bEndpointAddress = 0,\n    .bmAttributes     = { .xfer = TUSB_XFER_CONTROL },\n    .wMaxPacketSize   = max_packet_size,\n    .bInterval        = 0\n  };\n\n  return hcd_edpt_open(usbh_get_rhport(dev_addr), dev_addr, &ep0_desc);\n}\n\nbool tuh_edpt_open(uint8_t dev_addr, tusb_desc_endpoint_t const* desc_ep) {\n  // HACK: some device incorrectly always reports 512 bulk regardless of link speed, overwrite descriptor to force 64\n  if (desc_ep->bmAttributes.xfer == TUSB_XFER_BULK && tu_edpt_packet_size(desc_ep) > 64 &&\n      tuh_speed_get(dev_addr) == TUSB_SPEED_FULL) {\n    TU_LOG1(\"  WARN: EP max packet size is 512 in fullspeed, force to 64\\r\\n\");\n    tusb_desc_endpoint_t *hacked_ep = (tusb_desc_endpoint_t *)(uintptr_t)desc_ep;\n    hacked_ep->wMaxPacketSize       = tu_htole16(64);\n  }\n  TU_ASSERT(tu_edpt_validate(desc_ep, tuh_speed_get(dev_addr)));\n  return hcd_edpt_open(usbh_get_rhport(dev_addr), dev_addr, desc_ep);\n}\n\nbool tuh_edpt_close(uint8_t daddr, uint8_t ep_addr) {\n  TU_VERIFY(0 != tu_edpt_number(ep_addr)); // cannot close EP0\n  tuh_edpt_abort_xfer(daddr, ep_addr); // abort any pending transfer\n  return hcd_edpt_close(usbh_get_rhport(daddr), daddr, ep_addr);\n}\n\nbool usbh_edpt_busy(uint8_t dev_addr, uint8_t ep_addr) {\n  usbh_device_t* dev = get_device(dev_addr);\n  TU_VERIFY(dev);\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  return dev->ep_status[epnum][dir].busy;\n}\n\n//--------------------------------------------------------------------+\n// HCD Event Handler\n//--------------------------------------------------------------------+\n\nbool tuh_bus_info_get(uint8_t daddr, tuh_bus_info_t* bus_info) {\n  usbh_device_t const* dev = get_device(daddr);\n  if (dev != NULL) {\n    *bus_info = dev->bus_info;\n  } else {\n    *bus_info = _usbh_data.dev0_bus;\n  }\n  return true;\n}\n\nTU_ATTR_FAST_FUNC void hcd_event_handler(hcd_event_t const* event, bool in_isr) {\n  switch (event->event_id) {\n    case HCD_EVENT_DEVICE_ATTACH:\n    case HCD_EVENT_DEVICE_REMOVE:\n      // Attach debouncing on roothub: skip attach/remove while debouncing delay\n      if (event->connection.hub_addr == 0) {\n        if (tu_bit_test(_usbh_data.attach_debouncing_bm, event->rhport)) {\n          return;\n        }\n\n        if (event->event_id == HCD_EVENT_DEVICE_ATTACH) {\n          // No debouncing, set flag if attach event\n          _usbh_data.attach_debouncing_bm |= TU_BIT(event->rhport);\n        }\n      }\n      break;\n\n    default:\n      // nothing to do\n      break;\n  }\n\n  queue_event(event, in_isr);\n}\n\n//--------------------------------------------------------------------+\n// Descriptors Async\n//--------------------------------------------------------------------+\n\n// generic helper to get a descriptor\n// if blocking, user_data is pointed to xfer_result\nTU_ATTR_ALWAYS_INLINE static inline\nbool _get_descriptor(uint8_t daddr, uint8_t type, uint8_t index, uint16_t language_id, void* buffer, uint16_t len,\n                    tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  tusb_control_request_t const request = {\n    .bmRequestType_bit = {\n      .recipient = TUSB_REQ_RCPT_DEVICE,\n      .type      = TUSB_REQ_TYPE_STANDARD,\n      .direction = TUSB_DIR_IN\n    },\n    .bRequest = TUSB_REQ_GET_DESCRIPTOR,\n    .wValue   = tu_htole16( TU_U16(type, index) ),\n    .wIndex   = tu_htole16(language_id),\n    .wLength  = tu_htole16(len)\n  };\n  tuh_xfer_t xfer = {\n    .daddr       = daddr,\n    .ep_addr     = 0,\n    .setup       = &request,\n    .buffer      = buffer,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nbool tuh_descriptor_get(uint8_t daddr, uint8_t type, uint8_t index, void* buffer, uint16_t len,\n                        tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return _get_descriptor(daddr, type, index, 0x0000, buffer, len, complete_cb, user_data);\n}\n\nbool tuh_descriptor_get_device(uint8_t daddr, void* buffer, uint16_t len,\n                               tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  len = tu_min16(len, sizeof(tusb_desc_device_t));\n  return tuh_descriptor_get(daddr, TUSB_DESC_DEVICE, 0, buffer, len, complete_cb, user_data);\n}\n\nbool tuh_descriptor_get_configuration(uint8_t daddr, uint8_t index, void* buffer, uint16_t len,\n                                      tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return tuh_descriptor_get(daddr, TUSB_DESC_CONFIGURATION, index, buffer, len, complete_cb, user_data);\n}\n\n//------------- String Descriptor -------------//\nbool tuh_descriptor_get_string(uint8_t daddr, uint8_t index, uint16_t language_id, void* buffer, uint16_t len,\n                               tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return _get_descriptor(daddr, TUSB_DESC_STRING, index, language_id, buffer, len, complete_cb, user_data);\n}\n\n// Get manufacturer string descriptor\nbool tuh_descriptor_get_manufacturer_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,\n                                            tuh_xfer_cb_t complete_cb, uintptr_t user_data)\n{\n  usbh_device_t const* dev = get_device(daddr);\n  TU_VERIFY(dev && dev->desc_device.iManufacturer);\n  return tuh_descriptor_get_string(daddr, dev->desc_device.iManufacturer, language_id, buffer, len, complete_cb, user_data);\n}\n\n// Get product string descriptor\nbool tuh_descriptor_get_product_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,\n                                       tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  usbh_device_t const* dev = get_device(daddr);\n  TU_VERIFY(dev && dev->desc_device.iProduct);\n  return tuh_descriptor_get_string(daddr, dev->desc_device.iProduct, language_id, buffer, len, complete_cb, user_data);\n}\n\n// Get serial string descriptor\nbool tuh_descriptor_get_serial_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,\n                                      tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  usbh_device_t const* dev = get_device(daddr);\n  TU_VERIFY(dev && dev->desc_device.iSerialNumber);\n  return tuh_descriptor_get_string(daddr, dev->desc_device.iSerialNumber, language_id, buffer, len, complete_cb, user_data);\n}\n\n// Get HID report descriptor\n// if blocking, user_data is pointed to xfer_result\nbool tuh_descriptor_get_hid_report(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void* buffer, uint16_t len,\n                                   tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_LOG_USBH(\"HID Get Report Descriptor\\r\\n\");\n  tusb_control_request_t const request = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type      = TUSB_REQ_TYPE_STANDARD,\n          .direction = TUSB_DIR_IN\n      },\n      .bRequest = TUSB_REQ_GET_DESCRIPTOR,\n      .wValue   = tu_htole16(TU_U16(desc_type, index)),\n      .wIndex   = tu_htole16((uint16_t) itf_num),\n      .wLength  = len\n  };\n  tuh_xfer_t xfer = {\n      .daddr       = daddr,\n      .ep_addr     = 0,\n      .setup       = &request,\n      .buffer      = buffer,\n      .complete_cb = complete_cb,\n      .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nbool tuh_address_set(uint8_t daddr, uint8_t new_addr,\n                     tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_LOG_USBH(\"Set Address = %d\\r\\n\", new_addr);\n  const tusb_control_request_t request = {\n    .bmRequestType_bit = {\n      .recipient = TUSB_REQ_RCPT_DEVICE,\n      .type      = TUSB_REQ_TYPE_STANDARD,\n      .direction = TUSB_DIR_OUT\n    },\n    .bRequest = TUSB_REQ_SET_ADDRESS,\n    .wValue   = tu_htole16(new_addr),\n    .wIndex   = 0,\n    .wLength  = 0\n  };\n  tuh_xfer_t xfer = {\n    .daddr       = daddr,\n    .ep_addr     = 0,\n    .setup       = &request,\n    .buffer      = NULL,\n    .complete_cb = complete_cb,\n    .user_data   = user_data\n  };\n\n  TU_ASSERT(tuh_control_xfer(&xfer));\n  return true;\n}\n\nbool tuh_configuration_set(uint8_t daddr, uint8_t config_num,\n                           tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_LOG_USBH(\"Set Configuration = %d\\r\\n\", config_num);\n  tusb_control_request_t const request = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_DEVICE,\n          .type      = TUSB_REQ_TYPE_STANDARD,\n          .direction = TUSB_DIR_OUT\n      },\n      .bRequest = TUSB_REQ_SET_CONFIGURATION,\n      .wValue   = tu_htole16(config_num),\n      .wIndex   = 0,\n      .wLength  = 0\n  };\n  tuh_xfer_t xfer = {\n      .daddr       = daddr,\n      .ep_addr     = 0,\n      .setup       = &request,\n      .buffer      = NULL,\n      .complete_cb = complete_cb,\n      .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\nbool tuh_interface_set(uint8_t daddr, uint8_t itf_num, uint8_t itf_alt,\n                       tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  TU_LOG_USBH(\"Set Interface %u Alternate %u\\r\\n\", itf_num, itf_alt);\n  tusb_control_request_t const request = {\n      .bmRequestType_bit = {\n          .recipient = TUSB_REQ_RCPT_INTERFACE,\n          .type      = TUSB_REQ_TYPE_STANDARD,\n          .direction = TUSB_DIR_OUT\n      },\n      .bRequest = TUSB_REQ_SET_INTERFACE,\n      .wValue   = tu_htole16(itf_alt),\n      .wIndex   = tu_htole16(itf_num),\n      .wLength  = 0\n  };\n  tuh_xfer_t xfer = {\n      .daddr       = daddr,\n      .ep_addr     = 0,\n      .setup       = &request,\n      .buffer      = NULL,\n      .complete_cb = complete_cb,\n      .user_data   = user_data\n  };\n\n  return tuh_control_xfer(&xfer);\n}\n\n//--------------------------------------------------------------------+\n// Detaching\n//--------------------------------------------------------------------+\n\n// process detach event from rhport:hub_addr:hub_port\nstatic void process_remove_event(hcd_event_t *event) {\n  if (_usbh_data.enumerating_daddr == 0 &&\n      event->rhport == _usbh_data.dev0_bus.rhport &&\n      event->connection.hub_addr == _usbh_data.dev0_bus.hub_addr &&\n      event->connection.hub_port == _usbh_data.dev0_bus.hub_port) {\n    // dev0 is unplugged while enumerating (not yet assigned an address)\n    usbh_device_close(_usbh_data.dev0_bus.rhport, 0);\n  } else {\n    remove_device_tree(event->rhport, event->connection.hub_addr, event->connection.hub_port);\n  }\n}\n\n// remove a device at rhport:hub_addr:hub_port and all of its downstream\nstatic void remove_device_tree(uint8_t rhport, uint8_t hub_addr, uint8_t hub_port) {\n  // Find the all devices (star-network) under port that is unplugged\n  #if CFG_TUH_HUB\n  uint8_t removing_hubs[CFG_TUH_HUB] = { 0 };\n  #endif\n\n  do {\n    for (uint8_t dev_id = 0; dev_id < TOTAL_DEVICES; dev_id++) {\n      usbh_device_t* dev = &_usbh_devices[dev_id];\n      uint8_t const daddr = dev_id + 1u;\n\n      // hub_addr = 0 means roothub, hub_port = 0 means all devices of downstream hub\n      if (dev->bus_info.rhport == rhport && dev->connected &&\n          (hub_addr == 0 || dev->bus_info.hub_addr == hub_addr) &&\n          (hub_port == 0 || dev->bus_info.hub_port == hub_port)) {\n        TU_LOG_USBH(\"[%u:%u:%u] unplugged address = %u\\r\\n\", rhport, hub_addr, hub_port, daddr);\n\n        #if CFG_TUH_HUB\n        if (is_hub_addr(daddr)) {\n          TU_LOG_USBH(\"  is a HUB device %u\\r\\n\", daddr);\n          removing_hubs[dev_id - CFG_TUH_DEVICE_MAX] = 1;\n        } else\n        #endif\n        {\n          // Invoke callback before closing driver (maybe call it later ?)\n          tuh_umount_cb(daddr);\n        }\n\n        // Close class driver\n        for (uint8_t drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {\n          usbh_class_driver_t const* driver = get_driver(drv_id);\n          if (driver != NULL) {\n            driver->close(daddr);\n          }\n        }\n\n        usbh_device_close(rhport, daddr);\n        clear_device(dev);\n      }\n    }\n\n#if CFG_TUH_HUB\n    // if a hub is removed, we need to remove all of its downstream devices\n    if (tu_mem_is_zero(removing_hubs, CFG_TUH_HUB)) {\n      break;\n    }\n\n    // find a marked hub to process\n    for (uint8_t h_id = 0; h_id < CFG_TUH_HUB; h_id++) {\n      if (0 != removing_hubs[h_id]) {\n        removing_hubs[h_id] = 0;\n\n        // update hub_addr and hub_port for next loop\n        hub_addr = h_id + 1 + CFG_TUH_DEVICE_MAX;\n        hub_port = 0;\n        break;\n      }\n    }\n#else\n    break;\n#endif\n\n  } while(1);\n}\n\n//--------------------------------------------------------------------+\n// Enumeration Process\n// is a lengthy process with a series of control transfer to configure newly attached device.\n// NOTE: due to the shared control buffer, we must complete enumerating\n// one device before enumerating another one.\n//--------------------------------------------------------------------+\nenum {                                      // USB 2.0 specs 7.1.7 for timing\n  ENUM_DEBOUNCING_DELAY_MS           = 150, // T(ATTDB)  minimum 100 ms for stable connection\n  ENUM_RESET_ROOT_DELAY_MS           = 50,  // T(DRSTr)  minimum 50 ms for reset from root port\n  ENUM_RESET_ROOT_POST_DELAY_MS      = 2,   // 2 ms delay after root port reset before getting speed/status\n  ENUM_RESET_HUB_DELAY_MS            = 20,  // T(DRST)   10-20 ms for hub reset\n  ENUM_RESET_RECOVERY_DELAY_MS       = 10,  // T(RSTRCY) minimum 10 ms for reset recovery\n  ENUM_SET_ADDRESS_RECOVERY_DELAY_MS = 2,   // USB 2.0 Spec 9.2.6.3 min is 2 ms\n};\n\nenum {\n  ENUM_IDLE,\n  ENUM_HUB_RERSET,\n  ENUM_HUB_RESET_COMPLETE,\n  ENUM_HUB_CLEAR_RESET,\n  ENUM_HUB_CLEAR_RESET_RETRY, // 2nd attempt waiting for hub reset\n  ENUM_HUB_CLEAR_RESET_COMPLETE,\n  ENUM_ADDR0_DEVICE_DESC,\n  ENUM_SET_ADDR,\n  ENUM_GET_DEVICE_DESC,\n  ENUM_GET_STRING_LANGUAGE_ID_LEN,\n  ENUM_GET_STRING_LANGUAGE_ID,\n  ENUM_GET_STRING_MANUFACTURER_LEN,\n  ENUM_GET_STRING_MANUFACTURER,\n  ENUM_GET_STRING_PRODUCT_LEN,\n  ENUM_GET_STRING_PRODUCT,\n  ENUM_GET_STRING_SERIAL_LEN,\n  ENUM_GET_STRING_SERIAL,\n  ENUM_GET_9BYTE_CONFIG_DESC,\n  ENUM_GET_FULL_CONFIG_DESC,\n  ENUM_SET_CONFIG,\n  ENUM_CONFIG_DRIVER\n};\n\nstatic uint8_t enum_get_new_address(bool is_hub);\nstatic bool    enum_parse_configuration_desc(uint8_t dev_addr, const tusb_desc_configuration_t *desc_cfg);\nstatic void    enum_full_complete(bool success);\nstatic void    process_enumeration(tuh_xfer_t *xfer);\n\nenum {\n  ENUM_AFTER_DEBOUNCING_DELAY,\n  ENUM_AFTER_RESET_ROOT_DELAY,\n  ENUM_AFTER_RESET_ROOT_POST_DELAY,\n  ENUM_AFTER_RESET_HUB_DELAY,\n  ENUM_AFTER_RESET_HUB_DELAY_RETRY,\n  ENUM_AFTER_RESET_RECOVERY_DELAY,\n  ENUM_AFTER_SET_ADDRESS_RECOVERY_DELAY,\n};\n\n// process async delay in enumeration\nstatic void enum_delay_async(uintptr_t state) {\n  tuh_bus_info_t *dev0_bus = &_usbh_data.dev0_bus;\n  switch (state) {\n    case ENUM_AFTER_DEBOUNCING_DELAY:\n  #if CFG_TUH_HUB\n      if (dev0_bus->hub_addr != 0) {\n        // connected via hub\n        TU_VERIFY(dev0_bus->hub_port != 0, );\n        TU_ASSERT(hub_port_get_status(dev0_bus->hub_addr, dev0_bus->hub_port, NULL, process_enumeration,\n                                      ENUM_HUB_RERSET), );\n      } else\n  #endif\n      {\n        // connected directly to roothub\n        _usbh_data.attach_debouncing_bm &= (uint8_t)~TU_BIT(dev0_bus->rhport); // clear roothub debouncing delay\n        if (!hcd_port_connect_status(dev0_bus->rhport)) {\n          TU_LOG_USBH(\"Device unplugged while debouncing\\r\\n\");\n          enum_full_complete(false);\n          return;\n        }\n        hcd_port_reset(dev0_bus->rhport); // reset port\n        usbh_defer_func_ms_async(ENUM_RESET_ROOT_DELAY_MS, enum_delay_async, ENUM_AFTER_RESET_ROOT_DELAY);\n      }\n      break;\n\n    case ENUM_AFTER_RESET_ROOT_DELAY:\n      hcd_port_reset_end(dev0_bus->rhport);\n      usbh_defer_func_ms_async(ENUM_RESET_ROOT_POST_DELAY_MS, enum_delay_async, ENUM_AFTER_RESET_ROOT_POST_DELAY);\n      break;\n\n    case ENUM_AFTER_RESET_ROOT_POST_DELAY:\n      if (!hcd_port_connect_status(dev0_bus->rhport)) {\n        // device unplugged while delaying\n        enum_full_complete(false);\n        return;\n      }\n\n      dev0_bus->speed = hcd_port_speed_get(dev0_bus->rhport);\n      TU_LOG_USBH(\"%s Speed\\r\\n\", tu_str_speed[dev0_bus->speed]);\n\n      // fake transfer to kick-off the enumeration process\n      tuh_xfer_t xfer;\n      xfer.daddr     = 0;\n      xfer.result    = XFER_RESULT_SUCCESS;\n      xfer.user_data = ENUM_ADDR0_DEVICE_DESC;\n      process_enumeration(&xfer);\n      break;\n\n  #if CFG_TUH_HUB\n    case ENUM_AFTER_RESET_HUB_DELAY:\n    case ENUM_AFTER_RESET_HUB_DELAY_RETRY:\n      // get status after reset complete to check for reset change\n      TU_ASSERT(hub_port_get_status(dev0_bus->hub_addr, dev0_bus->hub_port, NULL, process_enumeration,\n                                    state == ENUM_AFTER_RESET_HUB_DELAY ? ENUM_HUB_CLEAR_RESET\n                                                                        : ENUM_HUB_CLEAR_RESET_RETRY), );\n      break;\n  #endif\n\n    case ENUM_AFTER_RESET_RECOVERY_DELAY:\n      // TODO probably doesn't need to open/close each enumeration\n      if (!usbh_edpt_control_open(0, 8)) {\n        TU_LOG_USBH(\"Failed to open dev0's control endpoint\\r\\n\");\n        enum_full_complete(false); // Stop enumeration gracefully\n        return;\n      }\n      // Get first 8 bytes of device descriptor for control endpoint size\n      TU_LOG_USBH(\"Get 8 byte of Device Descriptor\\r\\n\");\n      TU_ASSERT(tuh_descriptor_get_device(0, _usbh_epbuf.ctrl, 8, process_enumeration, ENUM_SET_ADDR), );\n      break;\n\n    case ENUM_AFTER_SET_ADDRESS_RECOVERY_DELAY: {\n      const uint8_t  new_addr = _usbh_data.enumerating_daddr;\n      usbh_device_t *new_dev  = get_device(new_addr);\n      TU_ASSERT(new_dev, );\n      if (!usbh_edpt_control_open(new_addr, new_dev->desc_device.bMaxPacketSize0)) {\n        TU_LOG_USBH(\"Failed to open new device's control endpoint\\r\\n\");\n        clear_device(new_dev);\n        enum_full_complete(false);\n        return;\n      }\n      TU_LOG_USBH(\"Get Device Descriptor\\r\\n\");\n      TU_ASSERT(tuh_descriptor_get_device(new_addr, _usbh_epbuf.ctrl, sizeof(tusb_desc_device_t), process_enumeration,\n                                          ENUM_GET_STRING_LANGUAGE_ID_LEN), );\n      break;\n    }\n\n    default:\n      break;\n  }\n}\n\n// start a new enumeration process\nstatic void enum_new_device(hcd_event_t *event) {\n  tuh_bus_info_t *dev0_bus = &_usbh_data.dev0_bus;\n  dev0_bus->rhport         = event->rhport;\n  dev0_bus->hub_addr       = event->connection.hub_addr;\n  dev0_bus->hub_port       = event->connection.hub_port;\n  usbh_defer_func_ms_async(ENUM_DEBOUNCING_DELAY_MS, enum_delay_async, ENUM_AFTER_DEBOUNCING_DELAY);\n}\n\n// process device enumeration\nstatic void process_enumeration(tuh_xfer_t *xfer) {\n  if (XFER_RESULT_FAILED == xfer->result) {\n    enum_full_complete(false); // failed to enum\n    return;\n  }\n\n  const uint8_t   daddr    = xfer->daddr;\n  const uintptr_t state    = xfer->user_data;\n  usbh_device_t  *dev      = get_device(daddr);\n  tuh_bus_info_t *dev0_bus = &_usbh_data.dev0_bus;\n  if (daddr > 0) {\n    TU_ASSERT(dev != NULL,);\n  }\n  uint16_t langid = 0x0409; // default is English\n  bool is_enum_failed = false;\n\n  switch (state) {\n  #if CFG_TUH_HUB\n    case ENUM_HUB_RERSET: {\n      hub_port_status_response_t port_status;\n      hub_port_get_status_local(dev0_bus->hub_addr, dev0_bus->hub_port, &port_status);\n\n      if (0 == port_status.status.connection) {\n        TU_LOG_USBH(\"Device unplugged from hub while debouncing\\r\\n\");\n        is_enum_failed = true;\n      } else {\n        TU_ASSERT(hub_port_reset(dev0_bus->hub_addr, dev0_bus->hub_port, process_enumeration,\n                                 ENUM_HUB_RESET_COMPLETE), );\n      }\n      break;\n    }\n\n    case ENUM_HUB_RESET_COMPLETE:\n      // wait for reset to take effect\n      usbh_defer_func_ms_async(ENUM_RESET_HUB_DELAY_MS, enum_delay_async, ENUM_AFTER_RESET_HUB_DELAY);\n      break;\n\n    case ENUM_HUB_CLEAR_RESET:\n    case ENUM_HUB_CLEAR_RESET_RETRY: {\n      hub_port_status_response_t port_status;\n      hub_port_get_status_local(dev0_bus->hub_addr, dev0_bus->hub_port, &port_status);\n\n      if (1 == port_status.change.reset) {\n        // Acknowledge Port Reset Change\n        TU_ASSERT(hub_port_clear_reset_change(dev0_bus->hub_addr, dev0_bus->hub_port, process_enumeration,\n                                              ENUM_HUB_CLEAR_RESET_COMPLETE), );\n      } else if (state == ENUM_HUB_CLEAR_RESET) {\n        // retry one more time if reset change not set yet\n        usbh_defer_func_ms_async(ENUM_RESET_HUB_DELAY_MS, enum_delay_async, ENUM_AFTER_RESET_HUB_DELAY_RETRY);\n      } else {\n        // retry but still not set --> failed\n        is_enum_failed = true;\n      }\n      break;\n    }\n\n    case ENUM_HUB_CLEAR_RESET_COMPLETE: {\n      hub_port_status_response_t port_status;\n      hub_port_get_status_local(dev0_bus->hub_addr, dev0_bus->hub_port, &port_status);\n\n      if (0 == port_status.status.connection) {\n        TU_LOG_USBH(\"Device unplugged from hub (not addressed yet)\\r\\n\");\n        is_enum_failed = true;\n        break;\n      }\n\n      dev0_bus->speed = (port_status.status.high_speed)  ? TUSB_SPEED_HIGH\n                        : (port_status.status.low_speed) ? TUSB_SPEED_LOW\n                                                         : TUSB_SPEED_FULL;\n      TU_ATTR_FALLTHROUGH;\n    }\n  #endif\n\n    case ENUM_ADDR0_DEVICE_DESC:\n      usbh_defer_func_ms_async(ENUM_RESET_RECOVERY_DELAY_MS, enum_delay_async, ENUM_AFTER_RESET_RECOVERY_DELAY);\n      break;\n\n    case ENUM_SET_ADDR: {\n      const tusb_desc_device_t *desc_device = (const tusb_desc_device_t *) _usbh_epbuf.ctrl;\n      if (!(desc_device->bDescriptorType == TUSB_DESC_DEVICE && desc_device->bMaxPacketSize0 >= 8)) {\n        TU_LOG_USBH(\"Invalid Device descriptor\\r\\n\");\n        is_enum_failed = true;\n        break;\n      }\n\n      const uint8_t new_addr = enum_get_new_address(desc_device->bDeviceClass == TUSB_CLASS_HUB);\n      TU_ASSERT(new_addr != 0,);\n\n      usbh_device_t* new_dev = get_device(new_addr);\n      new_dev->bus_info = *dev0_bus;\n      new_dev->connected = 1;\n      new_dev->desc_device.bMaxPacketSize0 = desc_device->bMaxPacketSize0;\n\n      TU_ASSERT(tuh_address_set(0, new_addr, process_enumeration, ENUM_GET_DEVICE_DESC), );\n      break;\n    }\n\n    case ENUM_GET_DEVICE_DESC: {\n      const uint8_t  new_addr = (uint8_t)tu_le16toh(xfer->setup->wValue);\n      usbh_device_t *new_dev  = get_device(new_addr);\n      TU_ASSERT(new_dev, );\n      new_dev->addressed           = 1;\n      _usbh_data.enumerating_daddr = new_addr;\n\n      usbh_device_close(dev0_bus->rhport, 0); // close dev0\n      usbh_defer_func_ms_async(ENUM_SET_ADDRESS_RECOVERY_DELAY_MS, enum_delay_async, ENUM_AFTER_SET_ADDRESS_RECOVERY_DELAY);\n      break;\n    }\n\n    // For string descriptor (langid, manufacturer, product, serila): always get the first 2 bytes\n    // to determine the length first. otherwise, some device may have buffer overflow.\n    case ENUM_GET_STRING_LANGUAGE_ID_LEN: {\n      // save the received device descriptor\n      tusb_desc_device_t const *desc_device = (tusb_desc_device_t const *) _usbh_epbuf.ctrl;\n\n      memcpy(&dev->desc_device, (const uint8_t*) desc_device + offsetof(tusb_desc_device_t, bcdUSB), sizeof(desc_device_noheader_t));\n\n      tuh_enum_descriptor_device_cb(daddr, desc_device); // callback\n      tuh_descriptor_get_string_langid(daddr, _usbh_epbuf.ctrl, 2,\n                                       process_enumeration, ENUM_GET_STRING_LANGUAGE_ID);\n      break;\n    }\n\n    case ENUM_GET_STRING_LANGUAGE_ID: {\n      const uint8_t str_len = xfer->buffer[0];\n      tuh_descriptor_get_string_langid(daddr, _usbh_epbuf.ctrl, str_len,\n                                       process_enumeration, ENUM_GET_STRING_MANUFACTURER_LEN);\n      break;\n    }\n\n    case ENUM_GET_STRING_MANUFACTURER_LEN: {\n      const tusb_desc_string_t* desc_langid = (const tusb_desc_string_t *) _usbh_epbuf.ctrl;\n      if (desc_langid->bLength >= 4) {\n        langid = tu_le16toh(desc_langid->utf16le[0]); // previous request is langid\n      }\n      if (dev->desc_device.iManufacturer != 0) {\n        tuh_descriptor_get_string(daddr, dev->desc_device.iManufacturer, langid, _usbh_epbuf.ctrl, 2,\n                                  process_enumeration, ENUM_GET_STRING_MANUFACTURER);\n        break;\n      }\n      TU_ATTR_FALLTHROUGH;\n    }\n\n    case ENUM_GET_STRING_MANUFACTURER: {\n      if (dev->desc_device.iManufacturer != 0)  {\n        langid = tu_le16toh(xfer->setup->wIndex); // langid from length's request\n        const uint8_t str_len = xfer->buffer[0];\n        tuh_descriptor_get_string(daddr, dev->desc_device.iManufacturer, langid, _usbh_epbuf.ctrl, str_len,\n                                  process_enumeration, ENUM_GET_STRING_PRODUCT_LEN);\n        break;\n      }\n      TU_ATTR_FALLTHROUGH;\n    }\n\n    case ENUM_GET_STRING_PRODUCT_LEN: {\n      if (dev->desc_device.iProduct != 0) {\n        if (state == ENUM_GET_STRING_PRODUCT_LEN) {\n          langid = tu_le16toh(xfer->setup->wIndex); // get langid from previous setup packet if not fall through\n        }\n        tuh_descriptor_get_string(\n            daddr, dev->desc_device.iProduct, langid, _usbh_epbuf.ctrl, 2, process_enumeration, ENUM_GET_STRING_PRODUCT);\n        break;\n      }\n      TU_ATTR_FALLTHROUGH;\n    }\n\n    case ENUM_GET_STRING_PRODUCT: {\n      if (dev->desc_device.iProduct != 0) {\n        langid = tu_le16toh(xfer->setup->wIndex); // langid from length's request\n        const uint8_t str_len = xfer->buffer[0];\n        tuh_descriptor_get_string(daddr, dev->desc_device.iProduct, langid, _usbh_epbuf.ctrl, str_len,\n                            process_enumeration, ENUM_GET_STRING_SERIAL_LEN);\n        break;\n      }\n      TU_ATTR_FALLTHROUGH;\n    }\n\n    case ENUM_GET_STRING_SERIAL_LEN: {\n      if (dev->desc_device.iSerialNumber != 0) {\n        if (state == ENUM_GET_STRING_SERIAL_LEN) {\n          langid = tu_le16toh(xfer->setup->wIndex); // get langid from previous setup packet if not fall through\n        }\n        tuh_descriptor_get_string(\n            daddr, dev->desc_device.iSerialNumber, langid, _usbh_epbuf.ctrl, 2, process_enumeration, ENUM_GET_STRING_SERIAL);\n        break;\n      }\n      TU_ATTR_FALLTHROUGH;\n    }\n\n    case ENUM_GET_STRING_SERIAL: {\n      if (dev->desc_device.iSerialNumber != 0) {\n        langid = tu_le16toh(xfer->setup->wIndex); // langid from length's request\n        const uint8_t str_len = xfer->buffer[0];\n        tuh_descriptor_get_string(daddr, dev->desc_device.iSerialNumber, langid, _usbh_epbuf.ctrl, str_len,\n                                  process_enumeration, ENUM_GET_9BYTE_CONFIG_DESC);\n        break;\n      }\n      TU_ATTR_FALLTHROUGH;\n    }\n\n    case ENUM_GET_9BYTE_CONFIG_DESC: {\n      // Get 9-byte for total length\n      uint8_t const config_idx = 0;\n      TU_LOG_USBH(\"Get Configuration[%u] Descriptor (9 bytes)\\r\\n\", config_idx);\n      TU_ASSERT(tuh_descriptor_get_configuration(daddr, config_idx, _usbh_epbuf.ctrl, 9,\n                                                 process_enumeration, ENUM_GET_FULL_CONFIG_DESC),);\n      break;\n    }\n\n    case ENUM_GET_FULL_CONFIG_DESC: {\n      uint8_t const* desc_config = _usbh_epbuf.ctrl;\n\n      // Use offsetof to avoid pointer to the odd/misaligned address\n      uint16_t const total_len = tu_le16toh(tu_unaligned_read16(desc_config + offsetof(tusb_desc_configuration_t, wTotalLength)));\n\n      // TODO not enough buffer to hold configuration descriptor\n      TU_ASSERT(total_len <= CFG_TUH_ENUMERATION_BUFSIZE,);\n\n      // Get full configuration descriptor\n      uint8_t const config_idx = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n      TU_LOG_USBH(\"Get Configuration[%u] Descriptor\\r\\n\", config_idx);\n      TU_ASSERT(tuh_descriptor_get_configuration(daddr, config_idx, _usbh_epbuf.ctrl, total_len,\n                                                 process_enumeration, ENUM_SET_CONFIG),);\n      break;\n    }\n\n    case ENUM_SET_CONFIG: {\n      uint8_t config_idx = (uint8_t) tu_le16toh(xfer->setup->wIndex);\n      if (tuh_enum_descriptor_configuration_cb(daddr, config_idx, (const tusb_desc_configuration_t*) _usbh_epbuf.ctrl)) {\n        TU_ASSERT(tuh_configuration_set(daddr, config_idx+1u, process_enumeration, ENUM_CONFIG_DRIVER),);\n      } else {\n        config_idx++;\n        TU_ASSERT(config_idx < dev->desc_device.bNumConfigurations,);\n        TU_LOG_USBH(\"Get Configuration[%u] Descriptor (9 bytes)\\r\\n\", config_idx);\n        TU_ASSERT(tuh_descriptor_get_configuration(daddr, config_idx, _usbh_epbuf.ctrl, 9,\n                                                   process_enumeration, ENUM_GET_FULL_CONFIG_DESC),);\n      }\n      break;\n    }\n\n    case ENUM_CONFIG_DRIVER: {\n      TU_LOG_USBH(\"Device configured\\r\\n\");\n      dev->configured = 1;\n\n  #if CFG_TUH_HUB\n      // get next hub status now since device can be unplugged before set_configure() is complete\n      if (_usbh_data.dev0_bus.hub_addr != 0) {\n        hub_edpt_status_xfer(_usbh_data.dev0_bus.hub_addr);\n      }\n  #endif\n\n      // Parse configuration & set up drivers\n      // driver_open() must not make any usb transfer\n      TU_ASSERT(enum_parse_configuration_desc(daddr, (tusb_desc_configuration_t*) _usbh_epbuf.ctrl),);\n\n      // Start the Set Configuration process for interfaces (itf = TUSB_INDEX_INVALID_8)\n      // Since driver can perform control transfer within its set_config, this is done asynchronously.\n      // The process continue with next interface when class driver complete its sequence with usbh_driver_set_config_complete()\n      // TODO use separated API instead of using TUSB_INDEX_INVALID_8\n      usbh_driver_set_config_complete(daddr, TUSB_INDEX_INVALID_8);\n      break;\n    }\n\n    default:\n      is_enum_failed = true;\n      break;\n  }\n\n  if (is_enum_failed) {\n    enum_full_complete(false);\n  }\n}\n\nstatic uint8_t enum_get_new_address(bool is_hub) {\n  uint8_t start;\n  uint8_t end;\n\n  if ( is_hub ) {\n    start = CFG_TUH_DEVICE_MAX;\n    end   = start + CFG_TUH_HUB;\n  }else {\n    start = 0;\n    end   = start + CFG_TUH_DEVICE_MAX;\n  }\n\n  for (uint8_t idx = start; idx < end; idx++) {\n    if (0 == _usbh_devices[idx].connected) {\n      return (idx + 1);\n    }\n  }\n\n#if CFG_TUH_HUB\n  if ( is_hub ) {\n    TU_LOG1(\"All addresses are occupied, try to increase CFG_TUH_HUB value.\\r\\n\");\n  }\n#endif // CFG_TUH_HUB\n\n  return 0; // invalid address\n}\n\nstatic bool enum_parse_configuration_desc(uint8_t dev_addr, tusb_desc_configuration_t const* desc_cfg) {\n  usbh_device_t* dev = get_device(dev_addr);\n  uint16_t const total_len = tu_le16toh(desc_cfg->wTotalLength);\n  uint8_t const* desc_end = ((uint8_t const*) desc_cfg) + total_len;\n  uint8_t const* p_desc   = tu_desc_next(desc_cfg);\n\n  TU_LOG_USBH(\"Parsing Configuration descriptor (wTotalLength = %u)\\r\\n\", total_len);\n\n  // parse all interfaces\n  while (tu_desc_in_bounds(p_desc, desc_end)) {\n    if (0 == tu_desc_len(p_desc)) {\n      // A zero-length descriptor indicates that the device is off spec (e.g. wrong wTotalLength).\n      // Parsed interfaces should still be usable\n      TU_LOG_USBH(\"Encountered a zero-length descriptor after %\" PRIu32 \" bytes\\r\\n\", (uint32_t)p_desc - (uint32_t)desc_cfg);\n      break;\n    }\n\n    // skip if not interface\n    if (TUSB_DESC_INTERFACE != tu_desc_type(p_desc)) {\n      p_desc = tu_desc_next(p_desc);\n      continue;\n    }\n    const tusb_desc_interface_t *desc_itf = (const tusb_desc_interface_t *)p_desc;\n\n    // uint16_t const drv_len = tu_desc_get_interface_total_len(desc_itf, assoc_itf_count, (uint16_t)\n    // (desc_end-p_desc)); TU_ASSERT(drv_len >= sizeof(tusb_desc_interface_t));\n\n    // Find a driver for this interface\n    const uint16_t remaining_len = (uint16_t)(desc_end - p_desc);\n    uint8_t        drv_id;\n    for (drv_id = 0; drv_id < TOTAL_DRIVER_COUNT; drv_id++) {\n      const usbh_class_driver_t *driver = get_driver(drv_id);\n      if (driver) {\n        const uint16_t drv_len = driver->open(dev->bus_info.rhport, dev_addr, desc_itf, remaining_len);\n        if ((sizeof(tusb_desc_interface_t) <= drv_len) && (drv_len <= remaining_len)) {\n          // open successfully\n          TU_LOG_USBH(\"  %s opened\\r\\n\", driver->name);\n\n          // bind found driver to all interfaces and endpoint within drv_len\n          tu_bind_driver_to_ep_itf(drv_id, dev->ep2drv, dev->itf2drv, CFG_TUH_INTERFACE_MAX, p_desc, drv_len);\n\n          p_desc += drv_len; // next Interface\n          break;             // exit driver find loop\n        }\n      }\n    }\n\n    // no driver found\n    if (drv_id == TOTAL_DRIVER_COUNT) {\n      p_desc = tu_desc_next(p_desc); // skip this interface\n      TU_LOG_USBH(\"[%u:%u] Interface %u: class = %u subclass = %u protocol = %u is not supported\\r\\n\",\n                  dev->bus_info.rhport, dev_addr, desc_itf->bInterfaceNumber, desc_itf->bInterfaceClass,\n                  desc_itf->bInterfaceSubClass, desc_itf->bInterfaceProtocol);\n    }\n  }\n\n  return true;\n}\n\nvoid usbh_driver_set_config_complete(uint8_t dev_addr, uint8_t itf_num) {\n  usbh_device_t* dev = get_device(dev_addr);\n\n  for(itf_num++; itf_num < CFG_TUH_INTERFACE_MAX; itf_num++) {\n    // continue with next valid interface\n    // IAD binding interface such as CDCs should return itf_num + 1 when complete\n    // with usbh_driver_set_config_complete()\n    uint8_t const drv_id = dev->itf2drv[itf_num];\n    usbh_class_driver_t const * driver = get_driver(drv_id);\n    if (driver != NULL) {\n      TU_LOG_USBH(\"%s set config: itf = %u\\r\\n\", driver->name, itf_num);\n      driver->set_config(dev_addr, itf_num);\n      break;\n    }\n  }\n\n  // all interfaces are configured\n  if (itf_num == CFG_TUH_INTERFACE_MAX) {\n    enum_full_complete(true);\n\n    if (is_hub_addr(dev_addr)) {\n      TU_LOG_USBH(\"HUB address = %u is mounted\\r\\n\", dev_addr);\n    }else {\n      // Invoke callback if available\n      tuh_mount_cb(dev_addr);\n    }\n  }\n}\n\nstatic void enum_full_complete(bool success) {\n  (void)success;\n  TU_LOG_USBH(\"Enumeration complete: success = %u\\r\\n\", success);\n\n  _usbh_data.enumerating_daddr = TUSB_INDEX_INVALID_8; // mark enumeration as complete\n  _usbh_data.call_after.func = NULL;\n\n  #if CFG_TUH_HUB\n  // Hub status is already requested in case of successful enumeration\n  if (!success && _usbh_data.dev0_bus.hub_addr != 0) {\n    hub_edpt_status_xfer(_usbh_data.dev0_bus.hub_addr);\n  }\n  #endif\n}\n\n#endif\n"
  },
  {
    "path": "src/host/usbh.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_USBH_H_\n#define TUSB_USBH_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"common/tusb_common.h\"\n\n#if CFG_TUH_MAX3421\n#include \"portable/analog/max3421/hcd_max3421.h\"\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n\n\n// forward declaration\nstruct tuh_xfer_s;\ntypedef struct tuh_xfer_s tuh_xfer_t;\ntypedef void (*tuh_xfer_cb_t)(tuh_xfer_t* xfer);\n\n// Note1: layout and order of this will be changed in near future\n// it is advised to initialize it using member name\n// Note2: not all field is available/meaningful in callback,\n// some info is not saved by usbh to save SRAM\nstruct tuh_xfer_s {\n  uint8_t daddr;\n  uint8_t ep_addr;\n  uint8_t TU_RESERVED;      // reserved\n  xfer_result_t result;\n\n  uint32_t actual_len;      // excluding setup packet\n\n  union {\n    tusb_control_request_t const* setup; // setup packet pointer if control transfer\n    uint32_t buflen;                     // expected length if not control transfer (not available in callback)\n  };\n\n  uint8_t* buffer;           // not available in callback if not control transfer\n  tuh_xfer_cb_t complete_cb;\n  uintptr_t user_data;\n\n  // uint32_t timeout_ms;    // place holder, not supported yet\n};\n\n// Subject to change\ntypedef struct {\n  uint8_t daddr;\n  tusb_desc_interface_t desc;\n} tuh_itf_info_t;\n\ntypedef struct {\n  uint8_t rhport;\n  uint8_t hub_addr;\n  uint8_t hub_port;\n  uint8_t speed;\n} tuh_bus_info_t;\n\n// backward compatibility for hcd_devtree_info_t, maybe removed in the future\n#define hcd_devtree_info_t tuh_bus_info_t\n#define hcd_devtree_get_info(_daddr, _bus_info) tuh_bus_info_get(_daddr, _bus_info)\n\n// ConfigID for tuh_configure()\nenum {\n  TUH_CFGID_INVALID = 0,\n  TUH_CFGID_RPI_PIO_USB_CONFIGURATION = 100, // cfg_param: pio_usb_configuration_t\n  TUH_CFGID_MAX3421 = 200,\n  TUH_CFGID_FSDEV = 300,\n  TUH_CFGID_DWC2 = 400\n};\n\ntypedef struct {\n  uint8_t max_nak; // max NAK per endpoint per frame to save CPU/SPI bus usage (0=unlimited)\n  uint8_t cpuctl; // R16: CPU Control Register\n  uint8_t pinctl; // R17: Pin Control Register. FDUPSPI bit is ignored\n} tuh_configure_max3421_t;\n\ntypedef struct {\n  uint8_t max_nak; // max NAK per endpoint per frame to save CPU usage (0=unlimited)\n} tuh_configure_fsdev_t;\n\ntypedef struct {\n  bool use_hs_phy; // Always use high-speed ULPI/UTMI phy even when working at full-speed\n} tuh_configure_dwc2_t;\n\ntypedef union {\n  // For TUH_CFGID_RPI_PIO_USB_CONFIGURATION use pio_usb_configuration_t\n  tuh_configure_max3421_t max3421;\n  tuh_configure_fsdev_t fsdev;\n  tuh_configure_dwc2_t dwc2;\n} tuh_configure_param_t;\n\n//--------------------------------------------------------------------+\n// APPLICATION CALLBACK\n//--------------------------------------------------------------------+\n\n// Invoked when enumeration get device descriptor\n// Device is not ready to communicate yet, application can copy the descriptor if needed\nvoid tuh_enum_descriptor_device_cb(uint8_t daddr, const tusb_desc_device_t *desc_device);\n\n// Invoked when enumeration get configuration descriptor\n// For multi-configuration device return false to skip, true to proceed with this configuration (may not be implemented yet)\n// Device is not ready to communicate yet, application can copy the descriptor if needed\nbool tuh_enum_descriptor_configuration_cb(uint8_t daddr, uint8_t cfg_index, const tusb_desc_configuration_t *desc_config);\n\n// Invoked when a device is mounted (configured)\nvoid tuh_mount_cb (uint8_t daddr);\n\n// Invoked when a device failed to mount during enumeration process\n// void tuh_mount_failed_cb (uint8_t daddr);\n\n// Invoked when a device is unmounted (detached)\nvoid tuh_umount_cb(uint8_t daddr);\n\n// Invoked when there is a new usb event, which need to be processed by tuh_task()/tuh_task_ext()\nvoid tuh_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr);\n\n//--------------------------------------------------------------------+\n// APPLICATION API\n//--------------------------------------------------------------------+\n\n// Configure host stack behavior with dynamic or port-specific parameters.\n// Should be called before tuh_init()\n// - cfg_id   : configure ID (TBD)\n// - cfg_param: configure data, structure depends on the ID\nbool tuh_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param);\n\n// New API to replace tuh_init() to init host stack on specific roothub port\n// Must be called in the same task/context as tuh_task() if RTOS is used\nbool tuh_rhport_init(uint8_t rhport, const tusb_rhport_init_t* rh_init);\n\n// Init host stack\n#if TUSB_VERSION_NUMBER > 2000  // 0.20.0\nTU_ATTR_DEPRECATED(\"Please use tusb_init(rhport, rh_init) instead\")\n#endif\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_init(uint8_t rhport) {\n  const tusb_rhport_init_t rh_init = {\n    .role = TUSB_ROLE_HOST,\n    .speed = TUH_OPT_HIGH_SPEED ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL,\n  };\n  return tuh_rhport_init(rhport, &rh_init);\n}\n\n// Deinit host stack on rhport\n// Must be called in the same task/context as tuh_task() if RTOS is used\nbool tuh_deinit(uint8_t rhport);\n\n// Check if host stack is already initialized with any roothub ports\n// To check if an rhport is initialized, use tuh_rhport_is_active()\nbool tuh_inited(void);\n\n// Task function should be called in main/rtos loop, extended version of tuh_task()\n// - timeout_ms: millisecond to wait, zero = no wait, 0xFFFFFFFF = wait forever\n// - in_isr: if function is called in ISR\nvoid tuh_task_ext(uint32_t timeout_ms, bool in_isr);\n\n// Task function should be called in main/rtos loop\nTU_ATTR_ALWAYS_INLINE static inline void tuh_task(void) {\n  tuh_task_ext(UINT32_MAX, false);\n}\n\n// Check if there is pending events need processing by tuh_task()\nbool tuh_task_event_ready(void);\n\n#ifndef TUSB_HCD_H_\nextern void hcd_int_handler(uint8_t rhport, bool in_isr);\n#endif\n\n// Interrupt handler alias to HCD with in_isr as optional parameter\n#define _tuh_int_handler_arg0()                   TU_VERIFY_STATIC(false, \"tuh_int_handler() must have 1 or 2 arguments\")\n#define _tuh_int_handler_arg1(_rhport)            hcd_int_handler(_rhport, true)\n#define _tuh_int_handler_arg2(_rhport, _in_isr)   hcd_int_handler(_rhport, _in_isr)\n\n// 1st argument is rhport (mandatory), 2nd argument in_isr (optional)\n#define tuh_int_handler(...)   TU_FUNC_OPTIONAL_ARG(_tuh_int_handler, __VA_ARGS__)\n\n// Check if roothub port is initialized and active as a host\nbool tuh_rhport_is_active(uint8_t rhport);\n\n// Assert/de-assert Bus Reset signal to roothub port. USB specs: it should last 10-50ms\nbool tuh_rhport_reset_bus(uint8_t rhport, bool active);\n\n//--------------------------------------------------------------------+\n// Device API\n//--------------------------------------------------------------------+\n\n// Get VID/PID of device\nbool tuh_vid_pid_get(uint8_t daddr, uint16_t* vid, uint16_t* pid);\n\n// Get local (cached) device descriptor once device is enumerated\nbool tuh_descriptor_get_device_local(uint8_t daddr, tusb_desc_device_t* desc_device);\n\n// Get speed of device\ntusb_speed_t tuh_speed_get(uint8_t daddr);\n\n// Check if device is connected and configured\nbool tuh_mounted(uint8_t daddr);\n\n// Check if device is connected which mean device has at least 1 successful transfer\n// Note: It may not be addressed/configured/mounted yet\nbool tuh_connected(uint8_t daddr);\n\n// Check if device is suspended\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_suspended(uint8_t daddr) {\n  // TODO implement suspend & resume on host\n  (void) daddr;\n  return false;\n}\n\n// Check if device is ready to communicate with\nTU_ATTR_ALWAYS_INLINE static inline bool tuh_ready(uint8_t daddr) {\n  return tuh_mounted(daddr) && !tuh_suspended(daddr);\n}\n\n// Get bus information of device\nbool tuh_bus_info_get(uint8_t daddr, tuh_bus_info_t* bus_info);\n\n//--------------------------------------------------------------------+\n// Transfer API\n// Each Function will make a USB transfer request to device. If\n// - complete_cb != NULL, the function will return immediately and invoke the callback when request is complete.\n// - complete_cb == NULL, the function will block until request is complete.\n// In this case, user_data should be tusb_xfer_result_t* to hold the transfer result.\n//--------------------------------------------------------------------+\n\n// Helper to make Sync API from async one\n#define TU_API_SYNC(_async_api, ...) \\\n   xfer_result_t result = XFER_RESULT_INVALID;\\\n   TU_VERIFY(_async_api(__VA_ARGS__, NULL, (uintptr_t) &result), XFER_RESULT_TIMEOUT); \\\n   return result\n\n// Submit a control transfer\n//  - async: complete callback invoked when finished.\n//  - sync : blocking if complete callback is NULL.\nbool tuh_control_xfer(tuh_xfer_t* xfer);\n\n// Submit a bulk/interrupt transfer\n//  - async: complete callback invoked when finished.\n//  - sync : blocking if complete callback is NULL.\nbool tuh_edpt_xfer(tuh_xfer_t* xfer);\n\n// Open a non-control endpoint\nbool tuh_edpt_open(uint8_t daddr, tusb_desc_endpoint_t const * desc_ep);\n\n// Close a non-control endpoint, it will abort any pending transfer\nbool tuh_edpt_close(uint8_t daddr, uint8_t ep_addr);\n\n// Abort a queued transfer. Note: it can only abort transfer that has not been started\n// Return true if a queued transfer is aborted, false if there is no transfer to abort\nbool tuh_edpt_abort_xfer(uint8_t daddr, uint8_t ep_addr);\n\n// Set Address (control transfer)\nbool tuh_address_set(uint8_t daddr, uint8_t new_addr,\n                     tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Set Configuration (control transfer)\n// config_num = 0 will un-configure device. Note: config_num = config_descriptor_index + 1\n// true on success, false if there is on-going control transfer or incorrect parameters\n// if complete_cb == NULL i.e blocking, user_data should be pointed to xfer_reuslt_t*\nbool tuh_configuration_set(uint8_t daddr, uint8_t config_num,\n                           tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Set Interface (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\n// if complete_cb == NULL i.e blocking, user_data should be pointed to xfer_reuslt_t*\nbool tuh_interface_set(uint8_t daddr, uint8_t itf_num, uint8_t itf_alt,\n                       tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n//--------------------------------------------------------------------+\n// Descriptors Asynchronous (non-blocking)\n//--------------------------------------------------------------------+\n\n// Get an descriptor (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\nbool tuh_descriptor_get(uint8_t daddr, uint8_t type, uint8_t index, void* buffer, uint16_t len,\n                        tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get device descriptor (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\nbool tuh_descriptor_get_device(uint8_t daddr, void* buffer, uint16_t len,\n                               tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get configuration descriptor (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\nbool tuh_descriptor_get_configuration(uint8_t daddr, uint8_t index, void* buffer, uint16_t len,\n                                      tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get HID report descriptor (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\nbool tuh_descriptor_get_hid_report(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void* buffer, uint16_t len,\n                                   tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get string descriptor (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\n// Blocking if complete callback is NULL, in this case 'user_data' must contain xfer_result_t variable\nbool tuh_descriptor_get_string(uint8_t daddr, uint8_t index, uint16_t language_id, void* buffer, uint16_t len,\n                               tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get language id string descriptor (control transfer)\nTU_ATTR_ALWAYS_INLINE static inline\nbool tuh_descriptor_get_string_langid(uint8_t daddr, void* buffer, uint16_t len,\n                               tuh_xfer_cb_t complete_cb, uintptr_t user_data) {\n  return tuh_descriptor_get_string(daddr, 0, 0, buffer, len, complete_cb, user_data);\n}\n\n// Get manufacturer string descriptor (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\nbool tuh_descriptor_get_manufacturer_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,\n                                            tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get product string descriptor (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\nbool tuh_descriptor_get_product_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,\n                                       tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n// Get serial string descriptor (control transfer)\n// true on success, false if there is on-going control transfer or incorrect parameters\nbool tuh_descriptor_get_serial_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,\n                                      tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\n//--------------------------------------------------------------------+\n// Descriptors Synchronous (blocking)\n// Sync API which is blocking until transfer is complete.\n// return transfer result\n//--------------------------------------------------------------------+\n\n// Sync version of tuh_descriptor_get()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_sync(uint8_t daddr, uint8_t type, uint8_t index, void* buffer, uint16_t len) {\n  TU_API_SYNC(tuh_descriptor_get, daddr, type, index, buffer, len);\n}\n\n// Sync version of tuh_descriptor_get_device()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_device_sync(uint8_t daddr, void* buffer, uint16_t len) {\n  TU_API_SYNC(tuh_descriptor_get_device, daddr, buffer, len);\n}\n\n// Sync version of tuh_descriptor_get_configuration()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_configuration_sync(uint8_t daddr, uint8_t index, void* buffer, uint16_t len) {\n  TU_API_SYNC(tuh_descriptor_get_configuration, daddr, index, buffer, len);\n}\n\n// Sync version of tuh_descriptor_get_hid_report()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_hid_report_sync(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void* buffer, uint16_t len) {\n  TU_API_SYNC(tuh_descriptor_get_hid_report, daddr, itf_num, desc_type, index, buffer, len);\n}\n\n// Sync version of tuh_descriptor_get_string()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_string_sync(uint8_t daddr, uint8_t index, uint16_t language_id, void* buffer, uint16_t len) {\n  TU_API_SYNC(tuh_descriptor_get_string, daddr, index, language_id, buffer, len);\n}\n\n// Sync version of tuh_descriptor_get_string_langid()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_string_langid_sync(uint8_t daddr, void* buffer, uint16_t len) {\n  return tuh_descriptor_get_string_sync(daddr, 0, 0, buffer, len);\n}\n\n// Sync version of tuh_descriptor_get_manufacturer_string()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_manufacturer_string_sync(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len) {\n  TU_API_SYNC(tuh_descriptor_get_manufacturer_string, daddr, language_id, buffer, len);\n}\n\n// Sync version of tuh_descriptor_get_product_string()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_product_string_sync(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len) {\n  TU_API_SYNC(tuh_descriptor_get_product_string, daddr, language_id, buffer, len);\n}\n\n// Sync version of tuh_descriptor_get_serial_string()\nTU_ATTR_ALWAYS_INLINE static inline tusb_xfer_result_t tuh_descriptor_get_serial_string_sync(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len) {\n  TU_API_SYNC(tuh_descriptor_get_serial_string, daddr, language_id, buffer, len);\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/host/usbh_pvt.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_USBH_PVT_H_\n#define TUSB_USBH_PVT_H_\n\n#include \"osal/osal.h\"\n#include \"common/tusb_fifo.h\"\n#include \"common/tusb_private.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define TU_LOG_USBH(...)      TU_LOG(CFG_TUH_LOG_LEVEL, __VA_ARGS__)\n#define TU_LOG_MEM_USBH(...)  TU_LOG_MEM(CFG_TUH_LOG_LEVEL, __VA_ARGS__)\n#define TU_LOG_BUF_USBH(...)  TU_LOG_BUF(CFG_TUH_LOG_LEVEL, __VA_ARGS__)\n#define TU_LOG_INT_USBH(...)  TU_LOG_INT(CFG_TUH_LOG_LEVEL, __VA_ARGS__)\n#define TU_LOG_HEX_USBH(...)  TU_LOG_HEX(CFG_TUH_LOG_LEVEL, __VA_ARGS__)\n\n//--------------------------------------------------------------------+\n// Class Driver API\n//--------------------------------------------------------------------+\ntypedef struct {\n   const char *name;\n   bool (*const init)(void);\n   bool (*const deinit)(void);\n   uint16_t (*const open)(uint8_t rhport, uint8_t dev_addr, const tusb_desc_interface_t *itf_desc, uint16_t max_len);\n   bool (*const set_config)(uint8_t dev_addr, uint8_t itf_num);\n   bool (*const xfer_cb)(uint8_t dev_addr, uint8_t ep_addr, xfer_result_t result, uint32_t xferred_bytes);\n   void (*const close)(uint8_t dev_addr);\n } usbh_class_driver_t;\n\n// Invoked when initializing host stack to get additional class drivers.\n// Can be implemented by application to extend/overwrite class driver support.\n// Note: The drivers array must be accessible at all time when stack is active\nusbh_class_driver_t const* usbh_app_driver_get_cb(uint8_t* driver_count);\n\n// Call by class driver to tell USBH that it has complete the enumeration\nvoid usbh_driver_set_config_complete(uint8_t dev_addr, uint8_t itf_num);\n\nuint8_t usbh_get_rhport(uint8_t daddr);\n\nuint8_t* usbh_get_enum_buf(void);\n\nvoid usbh_int_set(bool enabled);\n\n// Invoke this function later in tuh_task() by putting it into task queue\nvoid usbh_defer_func(osal_task_func_t func, void *param, bool in_isr);\n\n// Schedules a function to be called after certain time asynchronously\nbool usbh_defer_func_ms_async(uint32_t ms, tusb_defer_func_t func, uintptr_t param);\n\nvoid usbh_spin_lock(bool in_isr);\nvoid usbh_spin_unlock(bool in_isr);\n\n//--------------------------------------------------------------------+\n// USBH Endpoint API\n//--------------------------------------------------------------------+\n\n// Submit a usb transfer with callback support, require CFG_TUH_API_EDPT_XFER\nbool usbh_edpt_xfer_with_callback(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes,\n                                  tuh_xfer_cb_t complete_cb, uintptr_t user_data);\n\nTU_ATTR_ALWAYS_INLINE static inline\nbool usbh_edpt_xfer(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes) {\n  return usbh_edpt_xfer_with_callback(dev_addr, ep_addr, buffer, total_bytes, NULL, 0);\n}\n\n// Claim an endpoint before submitting a transfer.\n// If caller does not make any transfer, it must release endpoint for others.\nbool usbh_edpt_claim(uint8_t dev_addr, uint8_t ep_addr);\n\n// Release claimed endpoint without submitting a transfer\nbool usbh_edpt_release(uint8_t dev_addr, uint8_t ep_addr);\n\n// Check if endpoint transferring is complete\nbool usbh_edpt_busy(uint8_t dev_addr, uint8_t ep_addr);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/osal/osal.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_OSAL_H_\n#define TUSB_OSAL_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"common/tusb_common.h\"\n\ntypedef void (*osal_task_func_t)(void* param);\n\n// Timeout\n#define OSAL_TIMEOUT_NOTIMEOUT     (0)          // Return immediately\n#define OSAL_TIMEOUT_NORMAL        (10)         // Default timeout\n#define OSAL_TIMEOUT_WAIT_FOREVER  (UINT32_MAX) // Wait forever\n#define OSAL_TIMEOUT_CONTROL_XFER  OSAL_TIMEOUT_WAIT_FOREVER\n\n// Mutex is required when using a preempted RTOS or MCU has multiple cores\n#if (CFG_TUSB_OS == OPT_OS_NONE) && !TUP_MCU_MULTIPLE_CORE\n  #define OSAL_MUTEX_REQUIRED   0\n  #define OSAL_MUTEX_DEF(_name) uint8_t :0\n#else\n  #define OSAL_MUTEX_REQUIRED   1\n  #define OSAL_MUTEX_DEF(_name) osal_mutex_def_t _name\n#endif\n\n// OS thin implementation\n#if CFG_TUSB_OS == OPT_OS_NONE\n  #include \"osal_none.h\"\n#elif CFG_TUSB_OS == OPT_OS_FREERTOS\n  #include \"osal_freertos.h\"\n#elif CFG_TUSB_OS == OPT_OS_MYNEWT\n  #include \"osal_mynewt.h\"\n#elif CFG_TUSB_OS == OPT_OS_PICO\n  #include \"osal_pico.h\"\n#elif CFG_TUSB_OS == OPT_OS_RTTHREAD\n  #include \"osal_rtthread.h\"\n#elif CFG_TUSB_OS == OPT_OS_RTX4\n  #include \"osal_rtx4.h\"\n#elif CFG_TUSB_OS == OPT_OS_ZEPHYR\n  #include \"osal_zephyr.h\"\n#elif CFG_TUSB_OS == OPT_OS_THREADX\n  #include \"osal_threadx.h\"\n#elif CFG_TUSB_OS == OPT_OS_CUSTOM\n  #include \"tusb_os_custom.h\" // implemented by application\n#else\n  #error OS is not supported yet\n#endif\n\n/*--------------------------------------------------------------------\n  OSAL Porting API\n  Should be implemented as static inline function in osal_port.h header\n   uint32_t osal_time_millis(void);\n\n   void osal_spin_init(osal_spinlock_t *ctx);\n   void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr)\n   void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr);\n\n   osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef);\n   bool osal_semaphore_delete(osal_semaphore_t semd_hdl);\n   bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr);\n   bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec);\n   void osal_semaphore_reset(osal_semaphore_t sem_hdl);\n\n   osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef);\n   bool osal_mutex_delete(osal_mutex_t mutex_hdl)\n   bool osal_mutex_lock (osal_mutex_t sem_hdl, uint32_t msec);\n   bool osal_mutex_unlock(osal_mutex_t mutex_hdl);\n\n   osal_queue_t osal_queue_create(osal_queue_def_t* qdef);\n   bool osal_queue_delete(osal_queue_t qhdl);\n   bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec);\n   bool osal_queue_send(osal_queue_t qhdl, void const * data, bool in_isr);\n   bool osal_queue_empty(osal_queue_t qhdl);\n--------------------------------------------------------------------------*/\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/osal/osal_freertos.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_OSAL_FREERTOS_H_\n#define TUSB_OSAL_FREERTOS_H_\n\n// FreeRTOS Headers\n#include TU_INCLUDE_PATH(CFG_TUSB_OS_INC_PATH,FreeRTOS.h)\n#include TU_INCLUDE_PATH(CFG_TUSB_OS_INC_PATH,semphr.h)\n#include TU_INCLUDE_PATH(CFG_TUSB_OS_INC_PATH,queue.h)\n#include TU_INCLUDE_PATH(CFG_TUSB_OS_INC_PATH,task.h)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\n#if configSUPPORT_STATIC_ALLOCATION\ntypedef StaticSemaphore_t osal_semaphore_def_t;\ntypedef StaticSemaphore_t osal_mutex_def_t;\n#else\n\n// not used therefore defined to the smallest possible type to save space\ntypedef uint8_t osal_semaphore_def_t;\ntypedef uint8_t osal_mutex_def_t;\n#endif\n\ntypedef SemaphoreHandle_t osal_semaphore_t;\ntypedef SemaphoreHandle_t osal_mutex_t;\ntypedef QueueHandle_t osal_queue_t;\n\ntypedef struct {\n  uint16_t depth;\n  uint16_t item_sz;\n  void*    buf;\n\n#if defined(configQUEUE_REGISTRY_SIZE) && (configQUEUE_REGISTRY_SIZE>0)\n  char const* name;\n#endif\n\n#if configSUPPORT_STATIC_ALLOCATION\n  StaticQueue_t sq;\n#endif\n} osal_queue_def_t;\n\n#if defined(configQUEUE_REGISTRY_SIZE) && (configQUEUE_REGISTRY_SIZE>0)\n  #define OSAL_Q_NAME(_name) .name = #_name\n#else\n  #define OSAL_Q_NAME(_name)\n#endif\n\n// _int_set is not used with an RTOS\n#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type) \\\n  static _type _name##_##buf[_depth];\\\n  osal_queue_def_t _name = { .depth = _depth, .item_sz = sizeof(_type), .buf = _name##_##buf, OSAL_Q_NAME(_name) }\n\n//--------------------------------------------------------------------+\n// TASK API\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline uint32_t _osal_ms2tick(uint32_t msec) {\n  if (msec == OSAL_TIMEOUT_WAIT_FOREVER) { return portMAX_DELAY; }\n  if (msec == 0) { return 0; }\n\n  uint32_t ticks = pdMS_TO_TICKS(msec);\n\n  // If configTICK_RATE_HZ is less than 1000 and 1 tick > 1 ms, we still need to delay at least 1 tick\n  if (ticks == 0) { ticks = 1; }\n\n  return ticks;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {\n  vTaskDelay(pdMS_TO_TICKS(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t osal_time_millis(void) {\n  return pdTICKS_TO_MS(xTaskGetTickCount());\n}\n\n//--------------------------------------------------------------------+\n// Spinlock API\n//--------------------------------------------------------------------+\n#define OSAL_SPINLOCK_DEF(_name, _int_set) \\\n  osal_spinlock_t _name\n\n#ifdef ESP_PLATFORM\n// Espressif critical take spinlock as argument and does not use in_isr\ntypedef portMUX_TYPE osal_spinlock_t;\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n  spinlock_initialize(ctx);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n  if (!TUP_MCU_MULTIPLE_CORE && in_isr) {\n    return; // single core MCU does not need to lock in ISR\n  }\n  portENTER_CRITICAL(ctx);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n  if (!TUP_MCU_MULTIPLE_CORE && in_isr) {\n    return; // single core MCU does not need to lock in ISR\n  }\n  portEXIT_CRITICAL(ctx);\n}\n\n#else\n\ntypedef UBaseType_t osal_spinlock_t;\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n  (void) ctx;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n  if (in_isr) {\n  #if TUP_MCU_MULTIPLE_CORE\n    *ctx = taskENTER_CRITICAL_FROM_ISR();\n  #else\n    (void) ctx;\n    return; // single core MCU does not need to lock in ISR\n  #endif\n  } else {\n    taskENTER_CRITICAL();\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n  if (in_isr) {\n  #if TUP_MCU_MULTIPLE_CORE\n    taskEXIT_CRITICAL_FROM_ISR(*ctx);\n  #else\n    (void) ctx;\n    return; // single core MCU does not need to lock in ISR\n  #endif\n  } else {\n    taskEXIT_CRITICAL();\n  }\n}\n\n#endif\n\n//--------------------------------------------------------------------+\n// Semaphore API\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t *semdef) {\n#if configSUPPORT_STATIC_ALLOCATION\n  return xSemaphoreCreateBinaryStatic((StaticSemaphore_t*) semdef);\n#else\n  (void) semdef;\n  return xSemaphoreCreateBinary();\n#endif\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {\n  vSemaphoreDelete((SemaphoreHandle_t) semd_hdl);\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {\n  if (!in_isr) {\n    return xSemaphoreGive(sem_hdl) != 0;\n  } else {\n    BaseType_t xHigherPriorityTaskWoken = pdFALSE;\n    BaseType_t res = xSemaphoreGiveFromISR(sem_hdl, &xHigherPriorityTaskWoken);\n    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);\n    return res != 0;\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {\n  return xSemaphoreTake(sem_hdl, _osal_ms2tick(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t const sem_hdl) {\n  xQueueReset(sem_hdl);\n}\n\n//--------------------------------------------------------------------+\n// MUTEX API (priority inheritance)\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t *mdef) {\n#if configSUPPORT_STATIC_ALLOCATION\n  return xSemaphoreCreateMutexStatic(mdef);\n#else\n  (void) mdef;\n  return xSemaphoreCreateMutex();\n#endif\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {\n  vSemaphoreDelete(mutex_hdl);\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec) {\n  return osal_semaphore_wait(mutex_hdl, msec);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {\n  return xSemaphoreGive(mutex_hdl);\n}\n\n//--------------------------------------------------------------------+\n// QUEUE API\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {\n  osal_queue_t q;\n\n#if configSUPPORT_STATIC_ALLOCATION\n  q = xQueueCreateStatic(qdef->depth, qdef->item_sz, (uint8_t*) qdef->buf, &qdef->sq);\n#else\n  q = xQueueCreate(qdef->depth, qdef->item_sz);\n#endif\n\n#if defined(configQUEUE_REGISTRY_SIZE) && (configQUEUE_REGISTRY_SIZE>0)\n  vQueueAddToRegistry(q, qdef->name);\n#endif\n\n  return q;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {\n  vQueueDelete(qhdl);\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {\n  return xQueueReceive(qhdl, data, _osal_ms2tick(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const *data, bool in_isr) {\n  if (!in_isr) {\n    return xQueueSendToBack(qhdl, data, OSAL_TIMEOUT_WAIT_FOREVER) != 0;\n  } else {\n    BaseType_t xHigherPriorityTaskWoken = pdFALSE;\n    BaseType_t res = xQueueSendToBackFromISR(qhdl, data, &xHigherPriorityTaskWoken);\n    portYIELD_FROM_ISR(xHigherPriorityTaskWoken);\n    return res != 0;\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {\n  return uxQueueMessagesWaiting(qhdl) == 0;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/osal/osal_mynewt.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef OSAL_MYNEWT_H_\n#define OSAL_MYNEWT_H_\n\n#include \"os/os.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// TASK API\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {\n  os_time_delay( os_time_ms_to_ticks32(msec) );\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t osal_time_millis(void) {\n  return os_time_ticks_to_ms32(os_time_get());\n}\n\n//--------------------------------------------------------------------+\n// Spinlock API\n//--------------------------------------------------------------------+\ntypedef os_sr_t osal_spinlock_t;\n\n#define OSAL_SPINLOCK_DEF(_name, _int_set) \\\n  osal_spinlock_t _name\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n (void) ctx;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n  if (!TUP_MCU_MULTIPLE_CORE && in_isr) {\n    return; // single core MCU does not need to lock in ISR\n  }\n  OS_ENTER_CRITICAL(*ctx);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n  if (!TUP_MCU_MULTIPLE_CORE && in_isr) {\n    return; // single core MCU does not need to lock in ISR\n  }\n  OS_EXIT_CRITICAL(*ctx);\n}\n\n//--------------------------------------------------------------------+\n// Semaphore API\n//--------------------------------------------------------------------+\ntypedef struct os_sem  osal_semaphore_def_t;\ntypedef struct os_sem* osal_semaphore_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef) {\n  return (os_sem_init(semdef, 0) == OS_OK) ? (osal_semaphore_t) semdef : NULL;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {\n  (void) semd_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {\n  (void) in_isr;\n  return os_sem_release(sem_hdl) == OS_OK;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {\n  uint32_t const ticks = (msec == OSAL_TIMEOUT_WAIT_FOREVER) ? OS_TIMEOUT_NEVER : os_time_ms_to_ticks32(msec);\n  return os_sem_pend(sem_hdl, ticks) == OS_OK;\n}\n\nstatic inline void osal_semaphore_reset(osal_semaphore_t sem_hdl) {\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// MUTEX API (priority inheritance)\n//--------------------------------------------------------------------+\ntypedef struct os_mutex osal_mutex_def_t;\ntypedef struct os_mutex* osal_mutex_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef) {\n  return (os_mutex_init(mdef) == OS_OK) ? (osal_mutex_t) mdef : NULL;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {\n  (void) mutex_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec) {\n  uint32_t const ticks = (msec == OSAL_TIMEOUT_WAIT_FOREVER) ? OS_TIMEOUT_NEVER : os_time_ms_to_ticks32(msec);\n  return os_mutex_pend(mutex_hdl, ticks) == OS_OK;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {\n  return os_mutex_release(mutex_hdl) == OS_OK;\n}\n\n//--------------------------------------------------------------------+\n// QUEUE API\n//--------------------------------------------------------------------+\n\n// role device/host is used by OS NONE for mutex (disable usb isr) only\n#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type) \\\n  static _type _name##_##buf[_depth];\\\n  static struct os_event _name##_##evbuf[_depth];\\\n  osal_queue_def_t _name = { .depth = _depth, .item_sz = sizeof(_type), .buf = _name##_##buf, .evbuf =  _name##_##evbuf};\\\n\ntypedef struct {\n  uint16_t depth;\n  uint16_t item_sz;\n  void*    buf;\n  void*    evbuf;\n\n  struct os_mempool mpool;\n  struct os_mempool epool;\n\n  struct os_eventq  evq;\n}osal_queue_def_t;\n\ntypedef osal_queue_def_t* osal_queue_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {\n  if ( OS_OK != os_mempool_init(&qdef->mpool, qdef->depth, qdef->item_sz, qdef->buf, \"usb queue\") ) return NULL;\n  if ( OS_OK != os_mempool_init(&qdef->epool, qdef->depth, sizeof(struct os_event), qdef->evbuf, \"usb evqueue\") ) return NULL;\n\n  os_eventq_init(&qdef->evq);\n  return (osal_queue_t) qdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {\n  (void) qhdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {\n  (void) msec; // os_eventq_get() does not take timeout, always behave as msec = WAIT_FOREVER\n\n  struct os_event* ev;\n  ev = os_eventq_get(&qhdl->evq);\n\n  memcpy(data, ev->ev_arg, qhdl->item_sz); // copy message\n  os_memblock_put(&qhdl->mpool, ev->ev_arg); // put back mem block\n  os_memblock_put(&qhdl->epool, ev);         // put back ev block\n\n  return true;\n}\n\nstatic inline bool osal_queue_send(osal_queue_t qhdl, void const * data, bool in_isr) {\n  (void) in_isr;\n\n  // get a block from mem pool for data\n  void* ptr = os_memblock_get(&qhdl->mpool);\n  if (!ptr) return false;\n  memcpy(ptr, data, qhdl->item_sz);\n\n  // get a block from event pool to put into queue\n  struct os_event* ev = (struct os_event*) os_memblock_get(&qhdl->epool);\n  if (!ev) {\n    os_memblock_put(&qhdl->mpool, ptr);\n    return false;\n  }\n  tu_memclr(ev, sizeof(struct os_event));\n  ev->ev_arg = ptr;\n\n  os_eventq_put(&qhdl->evq, ev);\n\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {\n  return STAILQ_EMPTY(&qhdl->evq.evq_list);\n}\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* OSAL_MYNEWT_H_ */\n"
  },
  {
    "path": "src/osal/osal_none.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_OSAL_NONE_H_\n#define TUSB_OSAL_NONE_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// osal_time_millis() is not provided, tusb_time_millis_api() must be implemented by user application\n\n//--------------------------------------------------------------------+\n// Spinlock API\n//--------------------------------------------------------------------+\n// Note: This implementation is designed for bare-metal single-core systems without RTOS.\n// - Supports nested locking within the same execution context\n// - NOT suitable for true SMP (Symmetric Multi-Processing) systems\n// - NOT thread-safe for multi-threaded environments\n// - Primarily manages interrupt enable/disable state for critical sections\ntypedef struct {\n  void (* interrupt_set)(bool enabled);\n  uint32_t nested_count;\n} osal_spinlock_t;\n\n// For SMP, spinlock must be locked by hardware, cannot just use interrupt\n#define OSAL_SPINLOCK_DEF(_name, _int_set) \\\n  osal_spinlock_t _name = { .interrupt_set = _int_set, .nested_count = 0 }\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n  (void) ctx;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n  // Disable interrupts first to make nested_count increment atomic\n  if (!in_isr && ctx->nested_count == 0) {\n    ctx->interrupt_set(false);\n  }\n  ctx->nested_count++;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n  if (ctx->nested_count == 0) {\n    return; // spin is not locked to begin with\n  }\n\n  ctx->nested_count--;\n\n  // Only re-enable interrupts when fully unlocked\n  if (!in_isr && ctx->nested_count == 0) {\n    ctx->interrupt_set(true);\n  }\n}\n\n//--------------------------------------------------------------------+\n// Binary Semaphore API\n//--------------------------------------------------------------------+\ntypedef struct {\n  volatile uint16_t count;\n} osal_semaphore_def_t;\n\ntypedef osal_semaphore_def_t* osal_semaphore_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef) {\n  semdef->count = 0;\n  return semdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {\n  (void) semd_hdl;\n  return true; // nothing to do\n}\n\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {\n  (void) in_isr;\n  sem_hdl->count++;\n  return true;\n}\n\n// TODO blocking for now\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {\n  (void) msec;\n\n  while (sem_hdl->count == 0) {}\n  sem_hdl->count--;\n\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl) {\n  sem_hdl->count = 0;\n}\n\n//--------------------------------------------------------------------+\n// MUTEX API\n// Within tinyusb, mutex is never used in ISR context\n//--------------------------------------------------------------------+\ntypedef osal_semaphore_def_t osal_mutex_def_t;\ntypedef osal_semaphore_t osal_mutex_t;\n\n#if OSAL_MUTEX_REQUIRED\n// Note: multiple cores MCUs usually do provide IPC API for mutex\n// or we can use std atomic function\n\nTU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef) {\n  mdef->count = 1;\n  return mdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {\n  (void) mutex_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock (osal_mutex_t mutex_hdl, uint32_t msec) {\n  return osal_semaphore_wait(mutex_hdl, msec);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {\n  return osal_semaphore_post(mutex_hdl, false);\n}\n\n#else\n\n#define osal_mutex_create(_mdef)          (NULL)\n#define osal_mutex_lock(_mutex_hdl, _ms)  (true)\n#define osal_mutex_unlock(_mutex_hdl)     (true)\n\n#endif\n\n//--------------------------------------------------------------------+\n// QUEUE API\n//--------------------------------------------------------------------+\n#include \"common/tusb_fifo.h\"\n\ntypedef struct {\n  void (* interrupt_set)(bool enabled);\n  uint16_t  item_size;\n  tu_fifo_t ff;\n} osal_queue_def_t;\n\ntypedef osal_queue_def_t* osal_queue_t;\n\n// _int_set is used as mutex in OS NONE (disable/enable USB ISR)\n#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type)                                                 \\\n  uint8_t          _name##_buf[_depth * sizeof(_type)];                                                \\\n  osal_queue_def_t _name = {.interrupt_set = _int_set,                                                 \\\n                            .item_size     = sizeof(_type),                                            \\\n                            .ff            = TU_FIFO_INIT(_name##_buf, _depth * sizeof(_type), false)}\n\nTU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {\n  tu_fifo_clear(&qdef->ff);\n  return (osal_queue_t) qdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {\n  (void) qhdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {\n  (void) msec; // not used, always behave as msec = 0\n\n  qhdl->interrupt_set(false);\n  const bool success = (tu_fifo_read_n(&qhdl->ff, data, qhdl->item_size) > 0);\n  qhdl->interrupt_set(true);\n\n  return success;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const* data, bool in_isr) {\n  if (!in_isr) {\n    qhdl->interrupt_set(false);\n  }\n\n  const bool success = (tu_fifo_write_n(&qhdl->ff, data, qhdl->item_size) > 0);\n\n  if (!in_isr) {\n    qhdl->interrupt_set(true);\n  }\n\n  return success;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {\n  // Skip queue lock/unlock since this function is primarily called\n  // with interrupt disabled before going into low power mode\n  return tu_fifo_empty(&qhdl->ff);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/osal/osal_pico.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_OSAL_PICO_H_\n#define TUSB_OSAL_PICO_H_\n\n#include \"pico/time.h\"\n#include \"pico/sem.h\"\n#include \"pico/mutex.h\"\n#include \"pico/critical_section.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// TASK API\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {\n  sleep_ms(msec);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t osal_time_millis(void) {\n  return to_ms_since_boot(get_absolute_time());\n}\n\n//--------------------------------------------------------------------+\n// Spinlock API\n//--------------------------------------------------------------------+\ntypedef critical_section_t osal_spinlock_t; // pico implement critical section with spinlock\n#define OSAL_SPINLOCK_DEF(_name, _int_set) osal_spinlock_t _name\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n  critical_section_init(ctx);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n  (void)in_isr;\n  critical_section_enter_blocking(ctx);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n  (void)in_isr;\n  critical_section_exit(ctx);\n}\n\n//--------------------------------------------------------------------+\n// Binary Semaphore API\n//--------------------------------------------------------------------+\ntypedef struct semaphore osal_semaphore_def_t, *osal_semaphore_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t *semdef) {\n  sem_init(semdef, 0, 255);\n  return semdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {\n  (void)semd_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {\n  (void)in_isr;\n  return sem_release(sem_hdl);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {\n  return sem_acquire_timeout_ms(sem_hdl, msec);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl) {\n  sem_reset(sem_hdl, 0);\n}\n\n//--------------------------------------------------------------------+\n// MUTEX API\n// Within tinyusb, mutex is never used in ISR context\n//--------------------------------------------------------------------+\ntypedef struct mutex osal_mutex_def_t, *osal_mutex_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t *mdef) {\n  mutex_init(mdef);\n  return mdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {\n  (void)mutex_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec) {\n  return mutex_enter_timeout_ms(mutex_hdl, msec);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {\n  mutex_exit(mutex_hdl);\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// QUEUE API\n//--------------------------------------------------------------------+\n#include \"common/tusb_fifo.h\"\n\ntypedef struct {\n  uint16_t                item_size;\n  tu_fifo_t               ff;\n  struct critical_section critsec; // osal_queue may be used in IRQs, so need critical section\n} osal_queue_def_t;\n\ntypedef osal_queue_def_t *osal_queue_t;\n\n// role device/host is used by OS NONE for mutex (disable usb isr) only\n#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type)  \\\n  uint8_t          _name##_buf[_depth * sizeof(_type)]; \\\n  osal_queue_def_t _name = {.item_size = sizeof(_type), .ff = TU_FIFO_INIT(_name##_buf, _depth * sizeof(_type), false)}\n\nTU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t *qdef) {\n  critical_section_init(&qdef->critsec);\n  tu_fifo_clear(&qdef->ff);\n  return (osal_queue_t)qdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {\n  osal_queue_def_t *qdef = (osal_queue_def_t *)qhdl;\n  critical_section_deinit(&qdef->critsec);\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void *data, uint32_t msec) {\n  (void)msec; // not used, always behave as msec = 0\n\n  critical_section_enter_blocking(&qhdl->critsec);\n  bool success = tu_fifo_read_n(&qhdl->ff, data, qhdl->item_size);\n  critical_section_exit(&qhdl->critsec);\n\n  return success;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, const void *data, bool in_isr) {\n  (void)in_isr;\n\n  critical_section_enter_blocking(&qhdl->critsec);\n  bool success = tu_fifo_write_n(&qhdl->ff, data, qhdl->item_size);\n  critical_section_exit(&qhdl->critsec);\n\n  return success;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {\n  // TODO: revisit; whether this is true or not currently, tu_fifo_empty is a single\n  //  volatile read.\n\n  // Skip queue lock/unlock since this function is primarily called\n  // with interrupt disabled before going into low power mode\n  return tu_fifo_empty(&qhdl->ff);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/osal/osal_rtthread.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 tfx2001 (2479727366@qq.com)\n * Copyright (c) 2020 yekai (2857693944@qq.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_OSAL_RTTHREAD_H_\n#define TUSB_OSAL_RTTHREAD_H_\n\n// RT-Thread Headers\n#include \"rtthread.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// TASK API\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {\n  rt_thread_mdelay(msec);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t osal_time_millis(void) {\n  return (uint32_t)((((uint64_t)rt_tick_get()) * 1000) / RT_TICK_PER_SECOND);\n}\n\n//--------------------------------------------------------------------+\n// Spinlock API\n//--------------------------------------------------------------------+\ntypedef struct rt_spinlock osal_spinlock_t;\n\n#define OSAL_SPINLOCK_DEF(_name, _int_set) \\\n  osal_spinlock_t _name\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n  rt_spin_lock_init(ctx);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n  if (!TUP_MCU_MULTIPLE_CORE && in_isr) {\n    return; // single core MCU does not need to lock in ISR\n  }\n  rt_spin_lock(ctx);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n  if (!TUP_MCU_MULTIPLE_CORE && in_isr) {\n    return; // single core MCU does not need to lock in ISR\n  }\n  rt_spin_unlock(ctx);\n}\n\n//--------------------------------------------------------------------+\n// Semaphore API\n//--------------------------------------------------------------------+\ntypedef struct rt_semaphore osal_semaphore_def_t;\ntypedef rt_sem_t osal_semaphore_t;\n\nTU_ATTR_ALWAYS_INLINE static inline\nosal_semaphore_t osal_semaphore_create(osal_semaphore_def_t *semdef) {\n  rt_sem_init(semdef, \"tusb\", 0, RT_IPC_FLAG_PRIO);\n  return semdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {\n  return RT_EOK == rt_sem_detach(semd_hdl);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {\n  (void) in_isr;\n  return rt_sem_release(sem_hdl) == RT_EOK;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {\n  return rt_sem_take(sem_hdl, rt_tick_from_millisecond((rt_int32_t) msec)) == RT_EOK;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t const sem_hdl) {\n  rt_sem_control(sem_hdl, RT_IPC_CMD_RESET, 0);\n}\n\n//--------------------------------------------------------------------+\n// MUTEX API (priority inheritance)\n//--------------------------------------------------------------------+\ntypedef struct rt_mutex osal_mutex_def_t;\ntypedef rt_mutex_t osal_mutex_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t *mdef) {\n  rt_mutex_init(mdef, \"tusb\", RT_IPC_FLAG_PRIO);\n  return mdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {\n  return RT_EOK == rt_mutex_detach(mutex_hdl);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec) {\n  return rt_mutex_take(mutex_hdl, rt_tick_from_millisecond((rt_int32_t) msec)) == RT_EOK;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {\n  return rt_mutex_release(mutex_hdl) == RT_EOK;\n}\n\n//--------------------------------------------------------------------+\n// QUEUE API\n//--------------------------------------------------------------------+\n\n// role device/host is used by OS NONE for mutex (disable usb isr) only\n#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type) \\\n    static _type _name##_##buf[_depth]; \\\n    osal_queue_def_t _name = { .depth = _depth, .item_sz = sizeof(_type), .buf = _name##_##buf };\n\ntypedef struct {\n    uint16_t depth;\n    uint16_t item_sz;\n    void *buf;\n\n    struct rt_messagequeue sq;\n} osal_queue_def_t;\n\ntypedef rt_mq_t osal_queue_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t *qdef) {\n  rt_mq_init(&(qdef->sq), \"tusb\", qdef->buf, qdef->item_sz,\n             qdef->item_sz * qdef->depth, RT_IPC_FLAG_PRIO);\n  return &(qdef->sq);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {\n  return RT_EOK == rt_mq_detach(qhdl);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void *data, uint32_t msec) {\n  rt_tick_t tick = rt_tick_from_millisecond((rt_int32_t) msec);\n#if RT_VERSION_MAJOR >= 5\n  return rt_mq_recv(qhdl, data, qhdl->msg_size, tick) > 0;\n#else\n  return rt_mq_recv(qhdl, data, qhdl->msg_size, tick) == RT_EOK;\n#endif  /* RT_VERSION_MAJOR >= 5 */\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const *data, bool in_isr) {\n  (void) in_isr;\n  return rt_mq_send(qhdl, (void *)data, qhdl->msg_size) == RT_EOK;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {\n  return (qhdl->entry) == 0;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/osal/osal_rtx4.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Tian Yunhao (t123yh)\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_OSAL_RTX4_H_\n#define TUSB_OSAL_RTX4_H_\n\n#include <rtl.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// TASK API\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {\n  uint16_t hi = msec >> 16;\n  uint16_t lo = msec;\n  while (hi--) {\n    os_dly_wait(0xFFFE);\n  }\n  os_dly_wait(lo);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t osal_time_millis(void) {\n  return os_time_get();\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t msec2wait(uint32_t msec) {\n  if (msec == OSAL_TIMEOUT_WAIT_FOREVER) {\n    return 0xFFFF;\n  } else if (msec >= 0xFFFE) {\n    return 0xFFFE;\n  } else {\n    return msec;\n  }\n}\n\n//--------------------------------------------------------------------+\n// Spinlock API, stub not implemented\n//--------------------------------------------------------------------+\ntypedef uint8_t osal_spinlock_t;\n#define OSAL_SPINLOCK_DEF(_name, _int_set) \\\n  osal_spinlock_t _name\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n  (void) ctx;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n  (void) ctx; (void) in_isr;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n  (void) ctx; (void) in_isr;\n}\n\n//--------------------------------------------------------------------+\n// Semaphore API\n//--------------------------------------------------------------------+\ntypedef OS_SEM osal_semaphore_def_t;\ntypedef OS_ID osal_semaphore_t;\n\nTU_ATTR_ALWAYS_INLINE static inline OS_ID osal_semaphore_create(osal_semaphore_def_t* semdef) {\n  os_sem_init(semdef, 0);\n  return semdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {\n  (void) semd_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {\n  if ( !in_isr ) {\n    os_sem_send(sem_hdl);\n  } else {\n    isr_sem_send(sem_hdl);\n  }\n\treturn true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait (osal_semaphore_t sem_hdl, uint32_t msec) {\n  return os_sem_wait(sem_hdl, msec2wait(msec)) != OS_R_TMO;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t const sem_hdl) {\n  // TODO: implement\n}\n\n//--------------------------------------------------------------------+\n// MUTEX API (priority inheritance)\n//--------------------------------------------------------------------+\ntypedef OS_MUT osal_mutex_def_t;\ntypedef OS_ID osal_mutex_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef) {\n  os_mut_init(mdef);\n  return mdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {\n  (void) mutex_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock (osal_mutex_t mutex_hdl, uint32_t msec) {\n  return os_mut_wait(mutex_hdl, msec2wait(msec)) != OS_R_TMO;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {\n  return os_mut_release(mutex_hdl) == OS_R_OK;\n}\n\n//--------------------------------------------------------------------+\n// QUEUE API\n//--------------------------------------------------------------------+\n\n// role device/host is used by OS NONE for mutex (disable usb isr) only\n#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type)   \\\n  os_mbx_declare(_name##__mbox, _depth);              \\\n  _declare_box(_name##__pool, sizeof(_type), _depth); \\\n  osal_queue_def_t _name = { .depth = _depth, .item_sz = sizeof(_type), .pool = _name##__pool, .mbox = _name##__mbox };\n\ntypedef struct {\n  uint16_t depth;\n  uint16_t item_sz;\n  U32* pool;\n  U32* mbox;\n}osal_queue_def_t;\n\ntypedef osal_queue_def_t* osal_queue_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {\n  os_mbx_init(qdef->mbox, (qdef->depth + 4) * 4);\n  _init_box(qdef->pool, ((qdef->item_sz+3)/4)*(qdef->depth) + 3, qdef->item_sz);\n  return qdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {\n  void* buf;\n  os_mbx_wait(qhdl->mbox, &buf, msec2wait(msec));\n  memcpy(data, buf, qhdl->item_sz);\n  _free_box(qhdl->pool, buf);\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {\n  (void) qhdl;\n  return true; // nothing to do ?\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const * data, bool in_isr) {\n  void* buf = _alloc_box(qhdl->pool);\n  memcpy(buf, data, qhdl->item_sz);\n  if ( !in_isr ) {\n    os_mbx_send(qhdl->mbox, buf, 0xFFFF);\n  } else {\n    isr_mbx_send(qhdl->mbox, buf);\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {\n  return os_mbx_check(qhdl->mbox) == qhdl->depth;\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/osal/osal_threadx.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_OSAL_THREADX_H_\n#define TUSB_OSAL_THREADX_H_\n\n// ThreadX Headers\n#include \"tx_api.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// TASK API\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t _osal_ms2tick(uint32_t msec) {\n  if ( msec == TX_WAIT_FOREVER ) {\n    return TX_WAIT_FOREVER;\n  }\n  if ( msec == 0 ) {\n    return 0;\n  }\n\n  uint32_t ticks = msec * TX_TIMER_TICKS_PER_SECOND  / 1000;\n\n  // TX_TIMER_TICKS_PER_SECOND is less than 1000 and 1 tick > 1 ms\n  // we still need to delay at least 1 tick\n  if ( ticks == 0 ) {\n    ticks = 1;\n  }\n\n  return ticks;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t osal_time_millis(void) {\n  return (uint32_t)((uint64_t) tx_time_get() * 1000u / TX_TIMER_TICKS_PER_SECOND);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {\n  tx_thread_sleep(_osal_ms2tick(msec));\n}\n\n//--------------------------------------------------------------------+\n// Spinlock API\n//--------------------------------------------------------------------+\n//--------------------------------------------------------------------+\n// Spinlock API\n//--------------------------------------------------------------------+\ntypedef struct {\n  void (* interrupt_set)(bool);\n} osal_spinlock_t;\n\n// For SMP, spinlock must be locked by hardware, cannot just use interrupt\n#define OSAL_SPINLOCK_DEF(_name, _int_set) \\\n  osal_spinlock_t _name = { .interrupt_set = _int_set }\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n  (void) ctx;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n if (!in_isr) {\n   ctx->interrupt_set(false);\n }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n if (!in_isr) {\n   ctx->interrupt_set(true);\n }\n}\n\n\n//--------------------------------------------------------------------+\n// Binary Semaphore API (act)\n//--------------------------------------------------------------------+\n// Note: semaphores are not used in tinyusb for now, and their API has not been tested\n\ntypedef TX_SEMAPHORE osal_semaphore_def_t, * osal_semaphore_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t *semdef) {\n  tx_semaphore_create(semdef, TX_NULL, 0);\n  return semdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t sem_hdl) {\n  (void) sem_hdl;\n  return TX_SUCCESS == tx_semaphore_delete(sem_hdl);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {\n  (void) in_isr;\n  return TX_SUCCESS == tx_semaphore_put(sem_hdl);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {\n  return TX_SUCCESS == tx_semaphore_get(sem_hdl, _osal_ms2tick(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl) {\n  (void) sem_hdl;\n}\n\n//--------------------------------------------------------------------+\n// MUTEX API\n//--------------------------------------------------------------------+\ntypedef TX_MUTEX osal_mutex_def_t, *osal_mutex_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t *mdef) {\n  if (TX_SUCCESS == tx_mutex_create(mdef, mdef->tx_mutex_name, TX_NO_INHERIT)) {\n  \treturn mdef;\n  } else {\n    return NULL;\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {\n  (void) mutex_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec) {\n  return TX_SUCCESS == tx_mutex_get(mutex_hdl, _osal_ms2tick(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {\n  return TX_SUCCESS == tx_mutex_put(mutex_hdl);\n}\n\n//--------------------------------------------------------------------+\n// QUEUE API\n//--------------------------------------------------------------------+\n\ntypedef TX_QUEUE osal_queue_def_t, * osal_queue_t;\n\n// _int_set is not used with an RTOS _usbd_qdef\n\n#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type)    \\\nstatic _type _name##_buf[_depth];                         \\\nosal_queue_def_t _name = {                                \\\n\t\t.tx_queue_name         = (CHAR*)(uintptr_t)#_name,                  \\\n\t\t.tx_queue_message_size = (sizeof(_type) + 3) / 4, \\\n\t\t.tx_queue_capacity     = _depth,                  \\\n\t\t.tx_queue_start        = (ULONG *) _name##_buf }\n\n\nTU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {\n  return TX_SUCCESS ==\n           tx_queue_create(qdef, qdef->tx_queue_name, qdef->tx_queue_message_size, qdef->tx_queue_start, qdef->tx_queue_capacity * qdef->tx_queue_message_size * 4)\n\t\t   ? qdef : 0;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {\n  (void) qhdl;\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {\n  return 0 == tx_queue_receive(qhdl, data, _osal_ms2tick(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const *data, bool in_isr) {\n  return 0 == tx_queue_send(qhdl, (VOID *)(uintptr_t) data, in_isr ? TX_NO_WAIT : TX_WAIT_FOREVER);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {\n  ULONG enqueued;\n  tx_queue_info_get(qhdl, 0, &enqueued, 0, 0, 0, 0);\n  return enqueued == 0;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/osal/osal_zephyr.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_OSAL_ZEPHYR_H\n#define TUSB_OSAL_ZEPHYR_H\n\n#include <zephyr/kernel.h>\n\n//--------------------------------------------------------------------+\n// TASK API\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline void osal_task_delay(uint32_t msec) {\n  k_msleep(msec);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t osal_time_millis(void) {\n  return k_uptime_get_32();\n}\n\n//--------------------------------------------------------------------+\n// Spinlock API\n//--------------------------------------------------------------------+\ntypedef struct {\n  struct k_spinlock lock;\n  k_spinlock_key_t key;\n} osal_spinlock_t;\n\n#define OSAL_SPINLOCK_DEF(_name, _int_set) \\\n  osal_spinlock_t _name\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_init(osal_spinlock_t *ctx) {\n  (void) ctx;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_lock(osal_spinlock_t *ctx, bool in_isr) {\n  if (!TUP_MCU_MULTIPLE_CORE && in_isr) {\n    return; // single core MCU does not need to lock in ISR\n  }\n  ctx->key = k_spin_lock(&ctx->lock);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_spin_unlock(osal_spinlock_t *ctx, bool in_isr) {\n  if (!TUP_MCU_MULTIPLE_CORE && in_isr) {\n    return; // single core MCU does not need to lock in ISR\n  }\n  k_spin_unlock(&ctx->lock, ctx->key);\n}\n\n//--------------------------------------------------------------------+\n// Binary Semaphore API\n//--------------------------------------------------------------------+\ntypedef struct k_sem osal_semaphore_def_t, * osal_semaphore_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_semaphore_t osal_semaphore_create(osal_semaphore_def_t* semdef) {\n  k_sem_init(semdef, 0, 255);\n  return semdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_delete(osal_semaphore_t semd_hdl) {\n  (void) semd_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_post(osal_semaphore_t sem_hdl, bool in_isr) {\n  (void) in_isr;\n  k_sem_give(sem_hdl);\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_semaphore_wait(osal_semaphore_t sem_hdl, uint32_t msec) {\n  return 0 == k_sem_take(sem_hdl, K_MSEC(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void osal_semaphore_reset(osal_semaphore_t sem_hdl) {\n  k_sem_reset(sem_hdl);\n}\n\n//--------------------------------------------------------------------+\n// MUTEX API\n//--------------------------------------------------------------------+\ntypedef struct k_mutex osal_mutex_def_t, *osal_mutex_t;\n\nTU_ATTR_ALWAYS_INLINE static inline osal_mutex_t osal_mutex_create(osal_mutex_def_t* mdef) {\n  if ( 0 == k_mutex_init(mdef) ) {\n    return mdef;\n  } else {\n    return NULL;\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_delete(osal_mutex_t mutex_hdl) {\n  (void) mutex_hdl;\n  return true; // nothing to do\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec) {\n  return 0 == k_mutex_lock(mutex_hdl, K_MSEC(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_mutex_unlock(osal_mutex_t mutex_hdl) {\n  return 0 == k_mutex_unlock(mutex_hdl);\n}\n\n//--------------------------------------------------------------------+\n// QUEUE API\n//--------------------------------------------------------------------+\ntypedef struct k_msgq osal_queue_def_t, * osal_queue_t;\n\n// role device/host is used by OS NONE for mutex (disable usb isr) only\n#define OSAL_QUEUE_DEF(_int_set, _name, _depth, _type)  K_MSGQ_DEFINE(_name, sizeof(_type), _depth, 4)\n\nTU_ATTR_ALWAYS_INLINE static inline osal_queue_t osal_queue_create(osal_queue_def_t* qdef) {\n  // K_MSGQ_DEFINE already initializes the queue\n  return (osal_queue_t) qdef;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_delete(osal_queue_t qhdl) {\n  (void) qhdl;\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_receive(osal_queue_t qhdl, void* data, uint32_t msec) {\n  return 0 == k_msgq_get(qhdl, data, K_MSEC(msec));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_send(osal_queue_t qhdl, void const* data, bool in_isr) {\n  return 0 == k_msgq_put(qhdl, data,  in_isr ? K_NO_WAIT : K_FOREVER);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool osal_queue_empty(osal_queue_t qhdl) {\n  return 0 == k_msgq_num_used_get(qhdl);\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/analog/max3421/hcd_max3421.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"host/usbh_pvt.h\"\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n// Command format is\n// Reg [7:3] | 0 [2] | Dir [1] | Ack [0]\n\nenum {\n  CMDBYTE_WRITE = 0x02,\n};\n\nenum {\n  RCVVFIFO_ADDR = 1u  << 3, // 0x08\n  SNDFIFO_ADDR  = 2u  << 3, // 0x10\n  SUDFIFO_ADDR  = 4u  << 3, // 0x20\n  RCVBC_ADDR    = 6u  << 3, // 0x30\n  SNDBC_ADDR    = 7u  << 3, // 0x38\n  USBIRQ_ADDR   = 13u << 3, // 0x68\n  USBIEN_ADDR   = 14u << 3, // 0x70\n  USBCTL_ADDR   = 15u << 3, // 0x78\n  CPUCTL_ADDR   = 16u << 3, // 0x80\n  PINCTL_ADDR   = 17u << 3, // 0x88\n  REVISION_ADDR = 18u << 3, // 0x90\n  // 19 is not used\n  IOPINS1_ADDR  = 20u << 3, // 0xA0\n  IOPINS2_ADDR  = 21u << 3, // 0xA8\n  GPINIRQ_ADDR  = 22u << 3, // 0xB0\n  GPINIEN_ADDR  = 23u << 3, // 0xB8\n  GPINPOL_ADDR  = 24u << 3, // 0xC0\n  HIRQ_ADDR     = 25u << 3, // 0xC8\n  HIEN_ADDR     = 26u << 3, // 0xD0\n  MODE_ADDR     = 27u << 3, // 0xD8\n  PERADDR_ADDR  = 28u << 3, // 0xE0\n  HCTL_ADDR     = 29u << 3, // 0xE8\n  HXFR_ADDR     = 30u << 3, // 0xF0\n  HRSL_ADDR     = 31u << 3, // 0xF8\n};\n\nenum {\n  USBIRQ_OSCOK_IRQ  = 1u << 0,\n  USBIRQ_NOVBUS_IRQ = 1u << 5,\n  USBIRQ_VBUS_IRQ   = 1u << 6,\n};\n\nenum {\n  USBCTL_PWRDOWN = 1u << 4,\n  USBCTL_CHIPRES = 1u << 5,\n};\n\nenum {\n  CPUCTL_IE        = 1u << 0,\n  CPUCTL_PULSEWID0 = 1u << 6,\n  CPUCTL_PULSEWID1 = 1u << 7,\n};\n\nenum {\n  PINCTL_GPXA     = 1u << 0,\n  PINCTL_GPXB     = 1u << 1,\n  PINCTL_POSINT   = 1u << 2,\n  PINCTL_INTLEVEL = 1u << 3,\n  PINCTL_FDUPSPI  = 1u << 4,\n};\n\nenum {\n  HIRQ_BUSEVENT_IRQ = 1u << 0,\n  HIRQ_RWU_IRQ      = 1u << 1,\n  HIRQ_RCVDAV_IRQ   = 1u << 2,\n  HIRQ_SNDBAV_IRQ   = 1u << 3,\n  HIRQ_SUSDN_IRQ    = 1u << 4,\n  HIRQ_CONDET_IRQ   = 1u << 5,\n  HIRQ_FRAME_IRQ    = 1u << 6,\n  HIRQ_HXFRDN_IRQ   = 1u << 7,\n};\n\nenum {\n  MODE_HOST      = 1u << 0,\n  MODE_LOWSPEED  = 1u << 1,\n  MODE_HUBPRE    = 1u << 2,\n  MODE_SOFKAENAB = 1u << 3,\n  MODE_SEPIRQ    = 1u << 4,\n  MODE_DELAYISO  = 1u << 5,\n  MODE_DMPULLDN  = 1u << 6,\n  MODE_DPPULLDN  = 1u << 7,\n};\n\nenum {\n  HCTL_BUSRST    = 1u << 0,\n  HCTL_FRMRST    = 1u << 1,\n  HCTL_SAMPLEBUS = 1u << 2,\n  HCTL_SIGRSM    = 1u << 3,\n  HCTL_RCVTOG0   = 1u << 4,\n  HCTL_RCVTOG1   = 1u << 5,\n  HCTL_SNDTOG0   = 1u << 6,\n  HCTL_SNDTOG1   = 1u << 7,\n};\n\nenum {\n  HXFR_EPNUM_MASK = 0x0f,\n  HXFR_SETUP      = 1u << 4,\n  HXFR_OUT_NIN    = 1u << 5,\n  HXFR_ISO        = 1u << 6,\n  HXFR_HS         = 1u << 7,\n};\n\nenum {\n  HRSL_RESULT_MASK = 0x0f,\n  HRSL_RCVTOGRD    = 1u << 4,\n  HRSL_SNDTOGRD    = 1u << 5,\n  HRSL_KSTATUS     = 1u << 6,\n  HRSL_JSTATUS     = 1u << 7,\n};\n\nenum {\n  HRSL_SUCCESS = 0,\n  HRSL_BUSY,\n  HRSL_BAD_REQ,\n  HRSL_UNDEF,\n  HRSL_NAK,\n  HRSL_STALL,\n  HRSL_TOG_ERR,\n  HRSL_WRONG_PID,\n  HRSL_BAD_BYTECOUNT,\n  HRSL_PID_ERR,\n  HRSL_PKT_ERR,\n  HRSL_CRC_ERR,\n  HRSL_K_ERR,\n  HRSL_J_ERR,\n  HRSL_TIMEOUT,\n  HRSL_BABBLE,\n};\n\nenum {\n  DEFAULT_HIEN = HIRQ_CONDET_IRQ | HIRQ_FRAME_IRQ | HIRQ_HXFRDN_IRQ | HIRQ_RCVDAV_IRQ\n};\n\nenum {\n  MAX_NAK_DEFAULT = 1 // Number of NAK per endpoint per usb frame to save CPU/SPI bus usage\n};\n\nenum {\n  EP_STATE_IDLE        = 0,\n  EP_STATE_COMPLETE    = 1,\n  EP_STATE_ABORTING    = 2,\n  EP_STATE_ATTEMPT_1   = 3, // Number of attempts to transfer in a frame. Incremented after each NAK\n  EP_STATE_ATTEMPT_MAX = 15\n};\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t ep_num   : 4;\n  uint8_t is_setup : 1;\n  uint8_t is_out   : 1;\n  uint8_t is_iso   : 1;\n} hxfr_bm_t;\n\nTU_VERIFY_STATIC(sizeof(hxfr_bm_t) == 1, \"size is not correct\");\n\ntypedef struct {\n  uint8_t daddr;\n\n  union {\n    hxfr_bm_t hxfr_bm;\n    uint8_t hxfr;\n  };\n\n  struct TU_ATTR_PACKED {\n    uint8_t state        : 4;\n    uint8_t data_toggle  : 1;\n    uint16_t packet_size : 11;\n  };\n\n  uint16_t total_len;\n  uint16_t xferred_len;\n  uint8_t* buf;\n} max3421_ep_t;\n\nTU_VERIFY_STATIC(sizeof(max3421_ep_t) == 12, \"size is not correct\");\n\ntypedef struct {\n  volatile uint16_t frame_count;\n\n  // cached register\n  uint8_t sndbc;\n  uint8_t hirq;\n  uint8_t hien;\n  uint8_t mode;\n  uint8_t peraddr;\n  union {\n    hxfr_bm_t hxfr_bm;\n    uint8_t hxfr;\n  };\n\n  // owner of data in SNDFIFO, for retrying NAKed without re-writing to FIFO\n  struct {\n    uint8_t daddr;\n    uint8_t hxfr;\n  }sndfifo_owner;\n\n  bool busy_lock; // busy transferring\n\n#if OSAL_MUTEX_REQUIRED\n  OSAL_MUTEX_DEF(spi_mutexdef);\n  osal_mutex_t spi_mutex;\n#endif\n\n  max3421_ep_t ep[CFG_TUH_MAX3421_ENDPOINT_TOTAL]; // [0] is reserved for addr0\n} max3421_data_t;\n\nstatic max3421_data_t _hcd_data;\n\n// max NAK before giving up in a frame. 0 means infinite NAKs\nstatic tuh_configure_max3421_t _tuh_cfg = {\n    .max_nak = MAX_NAK_DEFAULT,\n    .cpuctl = 0, // default: INT pulse width = 10.6 us\n    .pinctl = 0, // default: negative edge interrupt\n};\n\n//--------------------------------------------------------------------+\n// SPI Commands and Helper\n//--------------------------------------------------------------------+\n\n#define reg_read  tuh_max3421_reg_read\n#define reg_write tuh_max3421_reg_write\n\nstatic void max3421_spi_lock(uint8_t rhport, bool in_isr) {\n  // disable interrupt and mutex lock (for pre-emptive RTOS) if not in_isr\n  if (!in_isr) {\n    (void) osal_mutex_lock(_hcd_data.spi_mutex, OSAL_TIMEOUT_WAIT_FOREVER);\n    tuh_max3421_int_api(rhport, false);\n  }\n\n  // assert CS\n  tuh_max3421_spi_cs_api(rhport, true);\n}\n\nstatic void max3421_spi_unlock(uint8_t rhport, bool in_isr) {\n  // de-assert CS\n  tuh_max3421_spi_cs_api(rhport, false);\n\n  // mutex unlock and re-enable interrupt\n  if (!in_isr) {\n    tuh_max3421_int_api(rhport, true);\n    (void) osal_mutex_unlock(_hcd_data.spi_mutex);\n  }\n}\n\nuint8_t tuh_max3421_reg_read(uint8_t rhport, uint8_t reg, bool in_isr) {\n  uint8_t tx_buf[2] = {reg, 0};\n  uint8_t rx_buf[2] = {0, 0};\n\n  max3421_spi_lock(rhport, in_isr);\n  bool ret = tuh_max3421_spi_xfer_api(rhport, tx_buf, rx_buf, 2);\n  max3421_spi_unlock(rhport, in_isr);\n\n  _hcd_data.hirq = rx_buf[0];\n  return ret ? rx_buf[1] : 0;\n}\n\nbool tuh_max3421_reg_write(uint8_t rhport, uint8_t reg, uint8_t data, bool in_isr) {\n  uint8_t tx_buf[2] = {reg | CMDBYTE_WRITE, data};\n  uint8_t rx_buf[2] = {0, 0};\n\n  max3421_spi_lock(rhport, in_isr);\n  bool ret = tuh_max3421_spi_xfer_api(rhport, tx_buf, rx_buf, 2);\n  max3421_spi_unlock(rhport, in_isr);\n\n  // HIRQ register since we are in full-duplex mode\n  _hcd_data.hirq = rx_buf[0];\n\n  return ret;\n}\n\n//--------------------------------------------------------------------\n// Register helper\n//--------------------------------------------------------------------\nTU_ATTR_ALWAYS_INLINE static inline void hirq_write(uint8_t rhport, uint8_t data, bool in_isr) {\n  reg_write(rhport, HIRQ_ADDR, data, in_isr);\n  // HIRQ write 1 is clear\n  _hcd_data.hirq &= (uint8_t) ~data;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void hien_write(uint8_t rhport, uint8_t data, bool in_isr) {\n  _hcd_data.hien = data;\n  reg_write(rhport, HIEN_ADDR, data, in_isr);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void mode_write(uint8_t rhport, uint8_t data, bool in_isr) {\n  _hcd_data.mode = data;\n  reg_write(rhport, MODE_ADDR, data, in_isr);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void peraddr_write(uint8_t rhport, uint8_t data, bool in_isr) {\n  if (_hcd_data.peraddr == data) {\n    return; // no need to change address\n  }\n\n  _hcd_data.peraddr = data;\n  reg_write(rhport, PERADDR_ADDR, data, in_isr);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void hxfr_write(uint8_t rhport, uint8_t data, bool in_isr) {\n  _hcd_data.hxfr = data;\n  reg_write(rhport, HXFR_ADDR, data, in_isr);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void sndbc_write(uint8_t rhport, uint8_t data, bool in_isr) {\n  _hcd_data.sndbc = data;\n  reg_write(rhport, SNDBC_ADDR, data, in_isr);\n}\n\n//--------------------------------------------------------------------\n// FIFO access (receive, send, setup)\n//--------------------------------------------------------------------\nstatic void hwfifo_write(uint8_t rhport, uint8_t reg, const uint8_t* buffer, uint8_t len, bool in_isr) {\n  uint8_t hirq;\n  reg |= CMDBYTE_WRITE;\n\n  max3421_spi_lock(rhport, in_isr);\n\n  tuh_max3421_spi_xfer_api(rhport, &reg, &hirq, 1);\n  _hcd_data.hirq = hirq;\n  tuh_max3421_spi_xfer_api(rhport, buffer, NULL, len);\n\n  max3421_spi_unlock(rhport, in_isr);\n}\n\n// Write to SNDFIFO if len > 0 and update SNDBC\nTU_ATTR_ALWAYS_INLINE static inline void hwfifo_send(uint8_t rhport, const uint8_t* buffer, uint8_t len, bool in_isr) {\n  if (len) {\n    hwfifo_write(rhport, SNDFIFO_ADDR, buffer, len, in_isr);\n  }\n  sndbc_write(rhport, len, in_isr);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void hwfifo_setup(uint8_t rhport, const uint8_t* buffer, bool in_isr) {\n  hwfifo_write(rhport, SUDFIFO_ADDR, buffer, 8, in_isr);\n}\n\nstatic void hwfifo_receive(uint8_t rhport, uint8_t * buffer, uint16_t len, bool in_isr) {\n  uint8_t hirq;\n  const uint8_t reg = RCVVFIFO_ADDR;\n\n  max3421_spi_lock(rhport, in_isr);\n\n  tuh_max3421_spi_xfer_api(rhport, &reg, &hirq, 1);\n  _hcd_data.hirq = hirq;\n  tuh_max3421_spi_xfer_api(rhport, NULL, buffer, len);\n\n  max3421_spi_unlock(rhport, in_isr);\n}\n\n//--------------------------------------------------------------------+\n// Endpoint helper\n//--------------------------------------------------------------------+\n\nstatic max3421_ep_t* find_ep_not_addr0(uint8_t daddr, uint8_t ep_num, uint8_t ep_dir) {\n  const uint8_t is_out = 1-ep_dir;\n  for(size_t i=1; i<CFG_TUH_MAX3421_ENDPOINT_TOTAL; i++) {\n    max3421_ep_t* ep = &_hcd_data.ep[i];\n    // control endpoint is bi-direction (skip check)\n    if (daddr == ep->daddr && ep_num == ep->hxfr_bm.ep_num && (ep_num == 0 || is_out == ep->hxfr_bm.is_out)) {\n      return ep;\n    }\n  }\n\n  return NULL;\n}\n\n// daddr = 0 and ep_num = 0 means find a free (allocate) endpoint\nTU_ATTR_ALWAYS_INLINE static inline max3421_ep_t * allocate_ep(void) {\n  return find_ep_not_addr0(0, 0, 0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline max3421_ep_t * find_opened_ep(uint8_t daddr, uint8_t ep_num, uint8_t ep_dir) {\n  if (daddr == 0 && ep_num == 0) {\n    return &_hcd_data.ep[0];\n  }else{\n    return find_ep_not_addr0(daddr, ep_num, ep_dir);\n  }\n}\n\n// free all endpoints belong to device address\nstatic void free_ep(uint8_t daddr) {\n  for (size_t i=1; i<CFG_TUH_MAX3421_ENDPOINT_TOTAL; i++) {\n    max3421_ep_t* ep = &_hcd_data.ep[i];\n    if (ep->daddr == daddr) {\n      tu_memclr(ep, sizeof(max3421_ep_t));\n    }\n  }\n}\n\n// Check if endpoint has a queued transfer and not reach max NAK in this frame\nTU_ATTR_ALWAYS_INLINE static inline bool is_ep_pending(max3421_ep_t const * ep) {\n  uint8_t const state = ep->state;\n  return ep->packet_size && (state >= EP_STATE_ATTEMPT_1) &&\n         (_tuh_cfg.max_nak == 0 || state < EP_STATE_ATTEMPT_1 + _tuh_cfg.max_nak);\n}\n\n// Find the next pending endpoint using round-robin scheduling, starting from next endpoint.\n// return NULL if not found\n// TODO respect interrupt endpoint's interval\nstatic max3421_ep_t * find_next_pending_ep(max3421_ep_t * cur_ep) {\n  size_t const idx = (size_t) (cur_ep - _hcd_data.ep);\n\n  // starting from next endpoint\n  for (size_t i = idx + 1; i < CFG_TUH_MAX3421_ENDPOINT_TOTAL; i++) {\n    max3421_ep_t* ep = &_hcd_data.ep[i];\n    if (is_ep_pending(ep)) {\n      return ep;\n    }\n  }\n\n  // wrap around including current endpoint\n  for (size_t i = 0; i <= idx; i++) {\n    max3421_ep_t* ep = &_hcd_data.ep[i];\n    if (is_ep_pending(ep)) {\n      return ep;\n    }\n  }\n\n  return NULL;\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n// optional hcd configuration, called by tuh_configure()\nbool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {\n  (void) rhport;\n  TU_VERIFY(cfg_id == TUH_CFGID_MAX3421 && cfg_param != NULL);\n\n  tuh_configure_param_t const* cfg = (tuh_configure_param_t const*) cfg_param;\n  _tuh_cfg = cfg->max3421;\n  _tuh_cfg.max_nak = tu_min8(_tuh_cfg.max_nak, EP_STATE_ATTEMPT_MAX-EP_STATE_ATTEMPT_1);\n  return true;\n}\n\n// Initialize controller to host mode\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n\n  tuh_max3421_int_api(rhport, false);\n\n  TU_LOG2_INT(sizeof(max3421_ep_t));\n  TU_LOG2_INT(sizeof(max3421_data_t));\n  TU_LOG2_INT(offsetof(max3421_data_t, ep));\n\n  tu_memclr(&_hcd_data, sizeof(_hcd_data));\n  _hcd_data.peraddr = 0xff; // invalid\n\n#if OSAL_MUTEX_REQUIRED\n  _hcd_data.spi_mutex = osal_mutex_create(&_hcd_data.spi_mutexdef);\n#endif\n\n  // NOTE: driver does not seem to work without nRST pin signal\n\n  // full duplex, interrupt negative edge\n  reg_write(rhport, PINCTL_ADDR, _tuh_cfg.pinctl | PINCTL_FDUPSPI, false);\n\n  // v1 is 0x01, v2 is 0x12, v3 is 0x13\n  // Note: v1 and v2 has host OUT errata whose workaround is not implemented in this driver\n  uint8_t const revision = reg_read(rhport, REVISION_ADDR, false);\n  TU_LOG2_HEX(revision);\n  TU_ASSERT(revision == 0x01 || revision == 0x12 || revision == 0x13, false);\n\n  // reset\n  reg_write(rhport, USBCTL_ADDR, USBCTL_CHIPRES, false);\n  reg_write(rhport, USBCTL_ADDR, 0, false);\n  while( !(reg_read(rhport, USBIRQ_ADDR, false) & USBIRQ_OSCOK_IRQ) ) {\n    // wait for oscillator to stabilize\n  }\n\n  // Mode: Host and DP/DM pull down\n  mode_write(rhport, MODE_DPPULLDN | MODE_DMPULLDN | MODE_HOST, false);\n\n  // frame reset & bus reset, this will trigger CONDET IRQ if device is already connected\n  reg_write(rhport, HCTL_ADDR, HCTL_BUSRST | HCTL_FRMRST, false);\n\n  // clear all previously pending IRQ\n  hirq_write(rhport, 0xff, false);\n\n  // Enable IRQ\n  hien_write(rhport, DEFAULT_HIEN, false);\n\n  tuh_max3421_int_api(rhport, true);\n\n  // Enable Interrupt pin\n  reg_write(rhport, CPUCTL_ADDR, _tuh_cfg.cpuctl | CPUCTL_IE, false);\n\n  return true;\n}\n\nbool hcd_deinit(uint8_t rhport) {\n  (void) rhport;\n\n  // disable interrupt\n  tuh_max3421_int_api(rhport, false);\n\n  // reset max3421 and power down\n  reg_write(rhport, USBCTL_ADDR, USBCTL_CHIPRES, false);\n  reg_write(rhport, USBCTL_ADDR, USBCTL_PWRDOWN, false);\n\n  #if OSAL_MUTEX_REQUIRED\n  osal_mutex_delete(_hcd_data.spi_mutex);\n  _hcd_data.spi_mutex = NULL;\n  #endif\n\n  return true;\n}\n\n// Enable USB interrupt\n// Not actually enable GPIO interrupt, just set variable to prevent handler to process\nvoid hcd_int_enable (uint8_t rhport) {\n  tuh_max3421_int_api(rhport, true);\n}\n\n// Disable USB interrupt\n// Not actually disable GPIO interrupt, just set variable to prevent handler to process\nvoid hcd_int_disable(uint8_t rhport) {\n  tuh_max3421_int_api(rhport, false);\n}\n\n// Get frame number (1ms)\nuint32_t hcd_frame_number(uint8_t rhport) {\n  (void) rhport;\n  return (uint32_t ) _hcd_data.frame_count;\n}\n\n//--------------------------------------------------------------------+\n// Port API\n//--------------------------------------------------------------------+\n\n// Get the current connect status of roothub port\nbool hcd_port_connect_status(uint8_t rhport) {\n  (void) rhport;\n  return (_hcd_data.mode & MODE_SOFKAENAB) ? true : false;\n}\n\n// Reset USB bus on the port. Return immediately, bus reset sequence may not be complete.\n// Some port would require hcd_port_reset_end() to be invoked after 10ms to complete the reset sequence.\nvoid hcd_port_reset(uint8_t rhport) {\n  reg_write(rhport, HCTL_ADDR, HCTL_BUSRST, false);\n}\n\n// Complete bus reset sequence, may be required by some controllers\nvoid hcd_port_reset_end(uint8_t rhport) {\n  reg_write(rhport, HCTL_ADDR, 0, false);\n}\n\n// Get port link speed\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  (void) rhport;\n  return (_hcd_data.mode & MODE_LOWSPEED) ? TUSB_SPEED_LOW : TUSB_SPEED_FULL;\n}\n\n// HCD closes all opened endpoints belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  (void) rhport;\n  (void) dev_addr;\n}\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\n\n// Open an endpoint\nbool hcd_edpt_open(uint8_t rhport, uint8_t daddr, tusb_desc_endpoint_t const * ep_desc) {\n  (void) rhport;\n\n  uint8_t const ep_num = tu_edpt_number(ep_desc->bEndpointAddress);\n  tusb_dir_t const ep_dir = tu_edpt_dir(ep_desc->bEndpointAddress);\n\n  max3421_ep_t * ep;\n  if (daddr == 0 && ep_num == 0) {\n    ep = &_hcd_data.ep[0];\n  }else {\n    if (NULL != find_ep_not_addr0(daddr, ep_num, ep_dir)) {\n      return true; // already opened\n    }\n    ep = allocate_ep();\n    TU_ASSERT(ep);\n    ep->daddr = daddr;\n    ep->hxfr_bm.ep_num = (uint8_t) (ep_num & 0x0f);\n    ep->hxfr_bm.is_out = (ep_dir == TUSB_DIR_OUT) ? 1 : 0;\n    ep->hxfr_bm.is_iso = (TUSB_XFER_ISOCHRONOUS == ep_desc->bmAttributes.xfer) ? 1 : 0;\n  }\n\n  ep->packet_size = (uint16_t) (tu_edpt_packet_size(ep_desc) & 0x7ff);\n\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  (void) rhport;\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  tusb_dir_t const ep_dir = tu_edpt_dir(ep_addr);\n  max3421_ep_t * ep = find_ep_not_addr0(daddr, ep_num, ep_dir);\n\n  if (!ep) {\n    return false; // not opened\n  }\n\n  tu_memclr(ep, sizeof(max3421_ep_t));\n\n  return true;\n}\n\n/* The microcontroller repeatedly writes the SNDFIFO register R2 to load the FIFO with up to 64 data bytes.\n * Then the microcontroller writes the SNDBC register, which this does three things:\n * 1. Tells the MAX3421E SIE (Serial Interface Engine) how many bytes in the FIFO to send.\n * 2. Connects the SNDFIFO and SNDBC register to the USB logic for USB transmission.\n * 3. Clears the SNDBAVIRQ interrupt flag. If the second FIFO is available for µC loading, the SNDBAVIRQ immediately re-asserts.\n\n                                               +-----------+\n                                           --->| SNDBC-A   |\n                                          /    | SNDFIFO-A |\n                                         /     +-----------+\n      +------+       +-------------+    /                              +----------+\n      | MCU  |------>| R2: SNDFIFO |----     << Write R7 Flip >>    ---| MAX3241E |\n      |(hcd) |       | R7: SNDBC   |                               /   |   SIE    |\n      +------+       +-------------+                              /    +----------+\n                                              +-----------+      /\n                                               | SNDBC-B   |    /\n                                               | SNDFIFO-B |<---\n                                               +-----------+\n  Note: xact_out() is called when starting a new transfer, continue a transfer (isr) or retry a transfer (NAK)\n        For NAK retry, we do not need to write to FIFO or SNDBC register again.\n*/\nstatic void xact_out(uint8_t rhport, max3421_ep_t *ep, bool switch_ep, bool in_isr) {\n  // Page 12: Programming BULK-OUT Transfers\n  // TODO: double buffering for ISO transfer\n  if (switch_ep) {\n    peraddr_write(rhport, ep->daddr, in_isr);\n    const uint8_t hctl = (ep->data_toggle ? HCTL_SNDTOG1 : HCTL_SNDTOG0);\n    reg_write(rhport, HCTL_ADDR, hctl, in_isr);\n  }\n\n  // Only write to sndfifo and sdnbc register if it is not a NAKed retry\n  if (!(ep->daddr == _hcd_data.sndfifo_owner.daddr && ep->hxfr == _hcd_data.sndfifo_owner.hxfr)) {\n    // skip SNDBAV IRQ check, overwrite sndfifo if needed\n    const uint8_t xact_len = (uint8_t) tu_min16(ep->total_len - ep->xferred_len, ep->packet_size);\n    hwfifo_send(rhport, ep->buf, xact_len, in_isr);\n  }\n  _hcd_data.sndfifo_owner.daddr = ep->daddr;\n  _hcd_data.sndfifo_owner.hxfr = ep->hxfr;\n\n  hxfr_write(rhport, ep->hxfr, in_isr);\n}\n\nstatic void xact_in(uint8_t rhport, max3421_ep_t *ep, bool switch_ep, bool in_isr) {\n  // Page 13: Programming BULK-IN Transfers\n  if (switch_ep) {\n    peraddr_write(rhport, ep->daddr, in_isr);\n\n    uint8_t const hctl = (ep->data_toggle ? HCTL_RCVTOG1 : HCTL_RCVTOG0);\n    reg_write(rhport, HCTL_ADDR, hctl, in_isr);\n  }\n\n  hxfr_write(rhport, ep->hxfr, in_isr);\n}\n\nstatic void xact_setup(uint8_t rhport, max3421_ep_t *ep, bool in_isr) {\n  peraddr_write(rhport, ep->daddr, in_isr);\n  hwfifo_setup(rhport, ep->buf, in_isr);\n  hxfr_write(rhport, HXFR_SETUP, in_isr);\n}\n\nstatic void xact_generic(uint8_t rhport, max3421_ep_t *ep, bool switch_ep, bool in_isr) {\n  if (ep->hxfr_bm.ep_num == 0 ) {\n    // setup\n    if (ep->hxfr_bm.is_setup) {\n      xact_setup(rhport, ep, in_isr);\n      return;\n    }\n\n    // status\n    if (ep->buf == NULL || ep->total_len == 0) {\n      const uint8_t hxfr = (uint8_t) (HXFR_HS | (ep->hxfr & HXFR_OUT_NIN));\n      peraddr_write(rhport, ep->daddr, in_isr);\n      hxfr_write(rhport, hxfr, in_isr);\n      return;\n    }\n  }\n\n  if (ep->hxfr_bm.is_out) {\n    xact_out(rhport, ep, switch_ep, in_isr);\n  }else {\n    xact_in(rhport, ep, switch_ep, in_isr);\n  }\n}\n\n// Submit a transfer, when complete hcd_event_xfer_complete() must be invoked\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t daddr, uint8_t ep_addr, uint8_t * buffer, uint16_t buflen) {\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = (uint8_t) tu_edpt_dir(ep_addr);\n  max3421_ep_t* ep = find_opened_ep(daddr, ep_num, ep_dir);\n  TU_VERIFY(ep);\n\n  if (ep_num == 0) {\n    // control transfer can switch direction\n    ep->hxfr_bm.is_out = ep_dir ? 0 : 1;\n    ep->hxfr_bm.is_setup = 0;\n    ep->data_toggle = 1;\n  }\n\n  ep->buf = buffer;\n  ep->total_len = buflen;\n  ep->xferred_len = 0;\n  ep->state = EP_STATE_ATTEMPT_1;\n\n  bool has_xfer = false;\n\n  usbh_spin_lock(false);\n  if (!_hcd_data.busy_lock) {\n    _hcd_data.busy_lock = true;\n    has_xfer = true;\n  }\n  usbh_spin_unlock(false);\n\n  // carry out transfer if not busy\n  if (has_xfer) {\n    xact_generic(rhport, ep, true, false);\n  }\n\n  return true;\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  uint8_t const ep_dir = (uint8_t) tu_edpt_dir(ep_addr);\n  max3421_ep_t* ep = find_opened_ep(daddr, ep_num, ep_dir);\n  TU_VERIFY(ep);\n\n  if (EP_STATE_ATTEMPT_1 <= ep->state && ep->state < EP_STATE_ATTEMPT_MAX) {\n    hcd_int_disable(rhport);\n    ep->state = EP_STATE_ABORTING;\n    hcd_int_enable(rhport);\n  }\n\n  return true;\n}\n\n// Submit a special transfer to send 8-byte Setup Packet, when complete hcd_event_xfer_complete() must be invoked\nbool hcd_setup_send(uint8_t rhport, uint8_t daddr, uint8_t const setup_packet[8]) {\n  (void) rhport;\n\n  max3421_ep_t* ep = find_opened_ep(daddr, 0, 0);\n  TU_ASSERT(ep);\n\n  ep->hxfr_bm.is_out = 1;\n  ep->hxfr_bm.is_setup = 1;\n  ep->buf = (uint8_t*)(uintptr_t) setup_packet;\n  ep->total_len = 8;\n  ep->xferred_len = 0;\n  ep->state = EP_STATE_ATTEMPT_1;\n\n  bool has_xfer = false;\n\n  usbh_spin_lock(false);\n  if (!_hcd_data.busy_lock) {\n    _hcd_data.busy_lock = true;\n    has_xfer = true;\n  }\n  usbh_spin_unlock(false);\n\n  // carry out transfer if not busy\n  if (has_xfer) {\n    xact_setup(rhport, ep, false);\n  }\n\n  return true;\n}\n\n// clear stall, data toggle is also reset to DATA0\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// Interrupt Handler\n//--------------------------------------------------------------------+\n\nstatic void handle_connect_irq(uint8_t rhport, bool in_isr) {\n  uint8_t const hrsl = reg_read(rhport, HRSL_ADDR, in_isr);\n  uint8_t const jk = hrsl & (HRSL_JSTATUS | HRSL_KSTATUS);\n\n  uint8_t new_mode = MODE_DPPULLDN | MODE_DMPULLDN | MODE_HOST;\n  TU_LOG2_HEX(jk);\n\n  switch(jk) {\n    case 0x00:                          // SEO is disconnected\n    case (HRSL_JSTATUS | HRSL_KSTATUS): // SE1 is illegal\n      mode_write(rhport, new_mode, in_isr);\n\n      // port reset anyway, this will help to stable bus signal for next connection\n      reg_write(rhport, HCTL_ADDR, HCTL_BUSRST, in_isr);\n      hcd_event_device_remove(rhport, in_isr);\n      reg_write(rhport, HCTL_ADDR, 0, in_isr);\n      break;\n\n    default: {\n      // Bus Reset also cause CONDET IRQ, skip if we are already connected and doing bus reset\n      if ((_hcd_data.hirq & HIRQ_BUSEVENT_IRQ) && (_hcd_data.mode & MODE_SOFKAENAB)) {\n        break;\n      }\n\n      // Low speed if (LS = 1 and J-state) or (LS = 0 and K-State)\n      // However, since we are always in full speed mode, we can just check J-state\n      if (jk == HRSL_KSTATUS) {\n        new_mode |= MODE_LOWSPEED;\n        TU_LOG3(\"Low speed\\r\\n\");\n      }else {\n        TU_LOG3(\"Full speed\\r\\n\");\n      }\n      new_mode |= MODE_SOFKAENAB;\n      mode_write(rhport, new_mode, in_isr);\n\n      // FIXME multiple MAX3421 rootdevice address is not 1\n      uint8_t const daddr = 1;\n      free_ep(daddr);\n\n      hcd_event_device_attach(rhport, in_isr);\n      break;\n    }\n  }\n}\n\nstatic void xfer_complete_isr(uint8_t rhport, max3421_ep_t *ep, xfer_result_t result, uint8_t hrsl, bool in_isr) {\n  const uint8_t ep_dir = 1 - ep->hxfr_bm.is_out;\n  const uint8_t ep_addr = tu_edpt_addr(ep->hxfr_bm.ep_num, ep_dir);\n\n  // save data toggle\n  if (ep_dir) {\n    ep->data_toggle = (hrsl & HRSL_RCVTOGRD) ? 1u : 0u;\n  }else {\n    ep->data_toggle = (hrsl & HRSL_SNDTOGRD) ? 1u : 0u;\n  }\n\n  ep->state = EP_STATE_IDLE;\n  hcd_event_xfer_complete(ep->daddr, ep_addr, ep->xferred_len, result, in_isr);\n\n  // Find next pending endpoint\n  max3421_ep_t * next_ep = find_next_pending_ep(ep);\n  if (next_ep) {\n    xact_generic(rhport, next_ep, true, in_isr);\n  }else {\n    // no more pending\n    usbh_spin_lock(in_isr);\n    _hcd_data.busy_lock = false;\n    usbh_spin_unlock(in_isr);\n  }\n}\n\nstatic void handle_xfer_done(uint8_t rhport, bool in_isr) {\n  const uint8_t hrsl = reg_read(rhport, HRSL_ADDR, in_isr);\n  const uint8_t hresult = hrsl & HRSL_RESULT_MASK;\n  const uint8_t ep_num = _hcd_data.hxfr_bm.ep_num;\n  const uint8_t hxfr_type = _hcd_data.hxfr & 0xf0;\n  const uint8_t ep_dir = ((hxfr_type & HXFR_SETUP) || (hxfr_type & HXFR_OUT_NIN)) ? 0 : 1;\n\n  max3421_ep_t *ep = find_opened_ep(_hcd_data.peraddr, ep_num, ep_dir);\n  TU_VERIFY(ep, );\n\n  xfer_result_t xfer_result;\n  switch(hresult) {\n    case HRSL_NAK:\n      if (ep->state == EP_STATE_ABORTING) {\n        ep->state = EP_STATE_IDLE;\n      } else {\n        if (ep_num == 0) {\n          // control endpoint -> retry immediately and return\n          hxfr_write(rhport, _hcd_data.hxfr, in_isr);\n          return;\n        }\n        if (EP_STATE_ATTEMPT_1 <= ep->state && ep->state < EP_STATE_ATTEMPT_MAX) {\n          ep->state++;\n        }\n      }\n\n      max3421_ep_t * next_ep = find_next_pending_ep(ep);\n      if (ep == next_ep) {\n        // this endpoint is only one pending -> retry immediately\n        hxfr_write(rhport, _hcd_data.hxfr, in_isr);\n      } else if (next_ep) {\n        // switch to next pending endpoint\n        xact_generic(rhport, next_ep, true, in_isr);\n      } else {\n        // no more pending in this frame -> clear busy\n        usbh_spin_lock(in_isr);\n        _hcd_data.busy_lock = false;\n        usbh_spin_unlock(in_isr);\n      }\n      return;\n\n    case HRSL_BAD_REQ:\n      // occurred when initialized without any pending transfer. Skip for now\n      return;\n\n    case HRSL_SUCCESS:\n      xfer_result = XFER_RESULT_SUCCESS;\n      break;\n\n    case HRSL_STALL:\n      xfer_result = XFER_RESULT_STALLED;\n      break;\n\n    default:\n      TU_LOG3(\"HRSL: %02X\\r\\n\", hrsl);\n      xfer_result = XFER_RESULT_FAILED;\n      break;\n  }\n\n  if (xfer_result != XFER_RESULT_SUCCESS) {\n    xfer_complete_isr(rhport, ep, xfer_result, hrsl, in_isr);\n    return;\n  }\n\n  if (ep_dir) {\n    // IN transfer: fifo data is already received in RCVDAV IRQ\n\n    // mark control handshake as complete\n    if (hxfr_type & HXFR_HS) {\n      ep->state = EP_STATE_COMPLETE;\n    }\n\n    // short packet or all bytes transferred\n    if (ep->state == EP_STATE_COMPLETE) {\n      xfer_complete_isr(rhport, ep, xfer_result, hrsl, in_isr);\n    }else {\n      hxfr_write(rhport, _hcd_data.hxfr, in_isr); // more to transfer\n    }\n  } else {\n    // SETUP or OUT transfer\n\n    // clear sndfifo owner since data is sent\n    _hcd_data.sndfifo_owner.daddr = 0xff;\n    _hcd_data.sndfifo_owner.hxfr = 0xff;\n\n    uint8_t xact_len;\n\n    if (hxfr_type & HXFR_SETUP) {\n      xact_len = 8;\n    } else if (hxfr_type & HXFR_HS) {\n      xact_len = 0;\n    } else {\n      xact_len = _hcd_data.sndbc;\n    }\n\n    ep->xferred_len += xact_len;\n    ep->buf += xact_len;\n\n    if (xact_len < ep->packet_size || ep->xferred_len >= ep->total_len) {\n      xfer_complete_isr(rhport, ep, xfer_result, hrsl, in_isr);\n    } else {\n      xact_out(rhport, ep, false, in_isr); // more to transfer\n    }\n  }\n}\n\n#if CFG_TUSB_DEBUG >= 3\nvoid print_hirq(uint8_t hirq) {\n  TU_LOG3_HEX(hirq);\n\n  if (hirq & HIRQ_HXFRDN_IRQ)   TU_LOG3(\" HXFRDN\");\n  if (hirq & HIRQ_FRAME_IRQ)    TU_LOG3(\" FRAME\");\n  if (hirq & HIRQ_CONDET_IRQ)   TU_LOG3(\" CONDET\");\n  if (hirq & HIRQ_SUSDN_IRQ)    TU_LOG3(\" SUSDN\");\n  if (hirq & HIRQ_SNDBAV_IRQ)   TU_LOG3(\" SNDBAV\");\n  if (hirq & HIRQ_RCVDAV_IRQ)   TU_LOG3(\" RCVDAV\");\n  if (hirq & HIRQ_RWU_IRQ)      TU_LOG3(\" RWU\");\n  if (hirq & HIRQ_BUSEVENT_IRQ) TU_LOG3(\" BUSEVENT\");\n\n  TU_LOG3(\"\\r\\n\");\n}\n#else\n  #define print_hirq(hirq)\n#endif\n\n// Interrupt handler\nvoid hcd_int_handler(uint8_t rhport, bool in_isr) {\n  uint8_t hirq = reg_read(rhport, HIRQ_ADDR, in_isr) & _hcd_data.hien;\n  if (!hirq) { return; }\n  //  print_hirq(hirq);\n\n  if (hirq & HIRQ_FRAME_IRQ) {\n    _hcd_data.frame_count++;\n\n    // reset all endpoints nak counter, retry with 1st pending ep.\n    max3421_ep_t* ep_retry = NULL;\n    for (size_t i = 0; i < CFG_TUH_MAX3421_ENDPOINT_TOTAL; i++) {\n      max3421_ep_t* ep = &_hcd_data.ep[i];\n      if (ep->packet_size && ep->state > EP_STATE_ATTEMPT_1) {\n        ep->state = EP_STATE_ATTEMPT_1;\n\n        if (ep_retry == NULL) {\n          ep_retry = ep;\n        }\n      }\n    }\n\n    // start usb transfer if not busy\n    if (ep_retry != NULL) {\n      bool has_xfer = false;\n\n      usbh_spin_lock(in_isr);\n      if (!_hcd_data.busy_lock) {\n        _hcd_data.busy_lock = true;\n        has_xfer = true;\n      }\n      usbh_spin_unlock(in_isr);\n\n      if (has_xfer) {\n        xact_generic(rhport, ep_retry, true, in_isr);\n      }\n    }\n  }\n\n  if (hirq & HIRQ_CONDET_IRQ) {\n    handle_connect_irq(rhport, in_isr);\n  }\n\n  // queue more transfer in handle_xfer_done() can cause hirq to be set again while external IRQ may not catch and/or\n  // not call this handler again. So we need to loop until all IRQ are cleared\n  while (hirq & (HIRQ_RCVDAV_IRQ | HIRQ_HXFRDN_IRQ)) {\n    if (hirq & HIRQ_RCVDAV_IRQ) {\n      const uint8_t ep_num = _hcd_data.hxfr_bm.ep_num;\n      max3421_ep_t* ep = find_opened_ep(_hcd_data.peraddr, ep_num, 1);\n      uint8_t xact_len = 0;\n\n      // RCVDAV_IRQ can trigger 2 times (dual buffered)\n      while (hirq & HIRQ_RCVDAV_IRQ) {\n        const uint8_t rcvbc = reg_read(rhport, RCVBC_ADDR, in_isr);\n        xact_len = (uint8_t) tu_min16(rcvbc, ep->total_len - ep->xferred_len);\n        if (xact_len) {\n          hwfifo_receive(rhport, ep->buf, xact_len, in_isr);\n          ep->buf += xact_len;\n          ep->xferred_len += xact_len;\n        }\n\n        // ack RCVDVAV IRQ\n        hirq_write(rhport, HIRQ_RCVDAV_IRQ, in_isr);\n        hirq = reg_read(rhport, HIRQ_ADDR, in_isr);\n      }\n\n      if (xact_len < ep->packet_size || ep->xferred_len >= ep->total_len) {\n        ep->state = EP_STATE_COMPLETE;\n      }\n    }\n\n    if (hirq & HIRQ_HXFRDN_IRQ) {\n      hirq_write(rhport, HIRQ_HXFRDN_IRQ, in_isr);\n      handle_xfer_done(rhport, in_isr);\n    }\n\n    hirq = reg_read(rhport, HIRQ_ADDR, in_isr);\n  }\n\n  // clear all interrupt except SNDBAV_IRQ (never clear by us). Note RCVDAV_IRQ, HXFRDN_IRQ already clear while processing\n  hirq &= (uint8_t) ~HIRQ_SNDBAV_IRQ;\n  if (hirq) {\n    hirq_write(rhport, hirq, in_isr);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/analog/max3421/hcd_max3421.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_HCD_MAX3421_H\n#define TUSB_HCD_MAX3421_H\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// SPI transfer API with MAX3421E are implemented by application\n// - spi_cs_api(), spi_xfer_api(), int_api()\n//--------------------------------------------------------------------+\n\n// API to control MAX3421 SPI CS\nextern void tuh_max3421_spi_cs_api(uint8_t rhport, bool active);\n\n// API to transfer data with MAX3421 SPI\n// Either tx_buf or rx_buf can be NULL, which means transfer is write or read only\nextern bool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const* tx_buf, uint8_t* rx_buf, size_t xfer_bytes);\n\n// API to enable/disable MAX3421 INTR pin interrupt\nextern void tuh_max3421_int_api(uint8_t rhport, bool enabled);\n\n//--------------------------------------------------------------------+\n// API for read/write MAX3421 registers\n// are implemented by this driver, can be used by application\n//--------------------------------------------------------------------+\n\n// API to read MAX3421's register. Implemented by TinyUSB\nuint8_t tuh_max3421_reg_read(uint8_t rhport, uint8_t reg, bool in_isr);\n\n// API to write MAX3421's register. Implemented by TinyUSB\nbool tuh_max3421_reg_write(uint8_t rhport, uint8_t reg, uint8_t data, bool in_isr);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/bridgetek/ft9xx/dcd_ft9xx.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright 2021 Bridgetek Pte Ltd\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/*\n * Contains code adapted from Bridgetek Pte Ltd via license terms stated\n * in https://brtchip.com/BRTSourceCodeLicenseAgreement\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && \\\n  (CFG_TUSB_MCU == OPT_MCU_FT90X || CFG_TUSB_MCU == OPT_MCU_FT93X)\n\n#include <stdint.h>\n#include <ft900.h>\n#include <registers/ft900_registers.h>\n\n#define USBD_USE_STREAMS\n\n#include \"device/dcd.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n// Board code will determine the state of VBUS from USB host.\nextern int8_t board_ft9xx_vbus(void);\nextern int board_uart_write(void const *buf, int len);\n\n// Static array to store an incoming SETUP request for processing by tinyusb.\nCFG_TUD_MEM_SECTION CFG_TUSB_MEM_ALIGN\nstatic uint8_t _ft9xx_setup_packet[8];\n\nstruct ft9xx_xfer_state\n{\n  volatile uint8_t ready; // OUT Transfer has been received and waiting for transfer.\n  volatile uint8_t valid; // Transfer is pending and total_size, remain_size, and buff_ptr are valid.\n\n  int16_t total_size; // Total transfer size in bytes for this transfer.\n  int16_t remain_size; // Total remaining in transfer.\n  uint8_t *buff_ptr; // Pointer to buffer to transmit from or receive to.\n\n  uint8_t type; // Endpoint type. Of type USBD_ENDPOINT_TYPE from endpoint descriptor.\n  uint8_t dir; // Endpoint direction. TUSB_DIR_OUT or TUSB_DIR_IN. For control endpoint this is the current direction.\n  uint16_t buff_size; // Actual size of buffer RAM used by endpoint.\n  uint16_t size; // Max packet size for endpoint from endpoint descriptor.\n};\n// Endpoint description array for each endpoint.\nstatic struct ft9xx_xfer_state ep_xfer[USBD_MAX_ENDPOINT_COUNT];\n// USB speed.\nstatic tusb_speed_t _speed;\n\n// Interrupt handlers.\nvoid _ft9xx_usbd_ISR(void); // Interrupt handler for USB device.\nvoid ft9xx_usbd_pm_ISR(void); // Interrupt handler for USB device for power management (called by board).\n\n// Internal functions forward declarations.\nstatic uint16_t _ft9xx_edpt_xfer_out(uint8_t ep_number, uint8_t *buffer, uint16_t xfer_bytes);\nstatic uint16_t _ft9xx_edpt_xfer_in(uint8_t ep_number, uint8_t *buffer, uint16_t xfer_bytes);\nstatic void _ft9xx_reset_edpts(void);\nstatic inline void _ft9xx_phy_enable(bool en);\nstatic void _ft9xx_usb_speed(void);\nstatic void _dcd_ft9xx_attach(void);\nstatic void _dcd_ft9xx_detach(void) __attribute__((unused));\nstatic uint16_t _ft9xx_dusb_in(uint8_t ep_number, const uint8_t *buffer, uint16_t length);\nstatic uint16_t _ft9xx_dusb_out(uint8_t ep_number, uint8_t *buffer, uint16_t length);\n\n// Internal functions.\n\n// Manage an OUT transfer from the host.\n// This can be up-to the maximum packet size of the endpoint.\n// Continuation of a transfer beyond the maximum packet size is performed\n// by the interrupt handler.\nstatic uint16_t _ft9xx_edpt_xfer_out(uint8_t ep_number, uint8_t *buffer, uint16_t xfer_bytes)\n{\n  //Note: this is called from only the interrupt handler when an OUT transfer is called.\n  uint16_t ep_size = ep_xfer[ep_number].size;\n  (void)ep_size;\n  if (xfer_bytes > ep_size)\n  {\n    xfer_bytes = ep_size;\n  }\n\n  // Wait until the endpoint has finished - it should be complete!\n  //while (!(USBD_EP_SR_REG(ep_number) & MASK_USBD_EPxSR_OPRDY))\n    //;\n\n  // Send the first packet of max packet size\n  xfer_bytes = _ft9xx_dusb_out(ep_number, (uint8_t *)buffer, xfer_bytes);\n  if (ep_number == USBD_EP_0)\n  {\n    // Set flags to indicate data ready.\n    USBD_EP_SR_REG(USBD_EP_0) = (MASK_USBD_EP0SR_OPRDY);\n  }\n  else\n  {\n    USBD_EP_SR_REG(ep_number) = (MASK_USBD_EPxSR_OPRDY);\n  }\n\n  return xfer_bytes;\n}\n\n// Manage an IN transfer to the host.\n// This can be up-to the maximum packet size of the endpoint.\n// Continuation of a transfer beyond the maximum packet size is performed\n// by the interrupt handler.\nstatic uint16_t _ft9xx_edpt_xfer_in(uint8_t ep_number, uint8_t *buffer, uint16_t xfer_bytes)\n{\n  //Note: this may be called from the interrupt handler or from normal code.\n  uint8_t end = 0;\n  uint16_t ep_size = ep_xfer[ep_number].size;\n  (void)ep_size;\n\n  if ((xfer_bytes == 0) || (xfer_bytes < ep_size))\n  {\n    end = 1;\n  }\n  else\n  {\n    xfer_bytes = ep_size;\n  }\n\n  if (ep_number == USBD_EP_0)\n  {\n    // An IN direction SETUP can be interrupted by an OUT packet.\n    // This will result in a STALL generated by the silicon.\n    while (USBD_EP_SR_REG(USBD_EP_0) & MASK_USBD_EP0SR_STALL)\n    {\n      // Clear the STALL and finish the transaction.\n      USBD_EP_SR_REG(USBD_EP_0) = (MASK_USBD_EP0SR_STALL);\n    }\n  }\n  else\n  {\n    // If there is data to transmit then wait until the IN buffer\n    // for the endpoint is empty.\n    // This does not apply to interrupt endpoints.\n    if (ep_xfer[ep_number].type != TUSB_XFER_INTERRUPT)\n    {\n      uint8_t sr_reg;\n      do\n      {\n        sr_reg = USBD_EP_SR_REG(ep_number);\n      } while (sr_reg & MASK_USBD_EPxSR_INPRDY);\n    }\n  }\n\n  // Do not send a ZLP for interrupt endpoints.\n  if ((ep_xfer[ep_number].type != TUSB_XFER_INTERRUPT) || (xfer_bytes > 0))\n  {\n    xfer_bytes = _ft9xx_dusb_in(ep_number, (uint8_t *)buffer, xfer_bytes);\n  }\n\n  if (ep_number == USBD_EP_0)\n  {\n    if (end)\n    {\n      // Set flags to indicate data ready and transfer complete.\n      USBD_EP_SR_REG(USBD_EP_0) = MASK_USBD_EP0SR_INPRDY | MASK_USBD_EP0SR_DATAEND;\n    }\n    else\n    {\n      // Set flags to indicate data ready.\n      USBD_EP_SR_REG(USBD_EP_0) = (MASK_USBD_EP0SR_INPRDY);\n    }\n  }\n  else\n  {\n    // Set flags to indicate data ready.\n    USBD_EP_SR_REG(ep_number) = (MASK_USBD_EPxSR_INPRDY);\n  }\n\n  return xfer_bytes;\n}\n\n// Reset all non-control endpoints to a default state.\n// Control endpoint is always enabled and ready. All others disabled.\nstatic void _ft9xx_reset_edpts(void)\n{\n  // Disable all endpoints and remove configuration values.\n  for (int i = 1; i < USBD_MAX_ENDPOINT_COUNT; i++)\n  {\n    // Clear settings.\n    tu_memclr(&ep_xfer[i], sizeof(struct ft9xx_xfer_state));\n    // Disable hardware.\n    USBD_EP_CR_REG(i) = 0;\n  }\n\n  // Enable interrupts from USB device control.\n  USBD_REG(cmie) = MASK_USBD_CMIE_ALL;\n}\n\n// Enable or disable the USB PHY.\nstatic inline void _ft9xx_phy_enable(bool en)\n{\n  if (en)\n    SYS->PMCFG_L |= MASK_SYS_PMCFG_DEV_PHY_EN;\n  else\n    SYS->PMCFG_L &= ~MASK_SYS_PMCFG_DEV_PHY_EN;\n}\n\n// Safely connect to the USB.\nstatic void _dcd_ft9xx_attach(void)\n{\n  uint8_t reg;\n\n  CRITICAL_SECTION_BEGIN\n  // Disable device responses.\n  USBD_REG(faddr) = 0;\n\n  // Reset USB Device.\n  SYS->MSC0CFG = SYS->MSC0CFG | MASK_SYS_MSC0CFG_DEV_RESET_ALL;\n  // Disable device connect/disconnect/host reset detection.\n  SYS->PMCFG_H = MASK_SYS_PMCFG_DEV_DIS_DEV;\n  SYS->PMCFG_H = MASK_SYS_PMCFG_DEV_CONN_DEV;\n  SYS->PMCFG_L = SYS->PMCFG_L & (~MASK_SYS_PMCFG_DEV_DETECT_EN);\n\n  // Enable Chip USB device clock/PM configuration.\n  sys_enable(sys_device_usb_device);\n  CRITICAL_SECTION_END;\n\n  // Wait a short time to get started.\n  delayms(1);\n\n  CRITICAL_SECTION_BEGIN\n  // Turn off the device enable bit.\n#if BOARD_TUD_MAX_SPEED == OPT_MODE_HIGH_SPEED\n  USBD_REG(fctrl) = 0;\n#else // BOARD_TUD_MAX_SPEED == OPT_MODE_FULL_SPEED\n  //Set the full speed only bit if required.\n  USBD_REG(fctrl) = MASK_USBD_FCTRL_MODE_FS_ONLY;\n#endif // BOARD_TUD_MAX_SPEED\n\n  // Clear first reset and suspend interrupts.\n  do\n  {\n    reg = USBD_REG(cmif);\n    USBD_REG(cmif) = reg;\n  } while (reg);\n  // Clear any endpoint interrupts.\n  reg = USBD_REG(epif);\n  USBD_REG(epif) = reg;\n\n  // Disable all interrupts from USB device control before attaching interrupt.\n  USBD_REG(cmie) = 0;\n  CRITICAL_SECTION_END;\n\n  // Enable device connect/disconnect/host reset detection.\n  // Set device detect and remote wakeup enable interrupt enables.\n  SYS->PMCFG_L = SYS->PMCFG_L | MASK_SYS_PMCFG_DEV_DETECT_EN;\n\n#if defined(__FT930__)\n  // Setup VBUS detect\n  SYS->MSC0CFG = SYS->MSC0CFG | MASK_SYS_MSC0CFG_USB_VBUS_EN;\n#endif\n}\n\n// Gracefully disconnect from the USB.\nstatic void _dcd_ft9xx_detach(void)\n{\n  // Disable device connect/disconnect/host reset detection.\n  SYS->PMCFG_L = SYS->PMCFG_L & (~MASK_SYS_PMCFG_DEV_DETECT_EN);\n\n#if defined(__FT930__)\n  // Disable VBUS detection.\n  SYS->MSC0CFG = SYS->MSC0CFG & (~MASK_SYS_MSC0CFG_USB_VBUS_EN);\n#endif\n  CRITICAL_SECTION_BEGIN\n  // Disable interrupts from USB.\n  USBD_REG(epie) = 0;\n  USBD_REG(cmie) = 0;\n  // Turn off the device enable bit.\n  USBD_REG(fctrl) = 0;\n  CRITICAL_SECTION_END;\n\n  delayms(1);\n\n  // Disable USB PHY\n  dcd_disconnect(BOARD_TUD_RHPORT);\n  delayms(1);\n\n  // Disable Chip USB device clock/PM configuration.\n  sys_disable(sys_device_usb_device);\n\n  // Reset USB Device... Needed for Back voltage D+ to be <400mV\n  SYS->MSC0CFG = SYS->MSC0CFG | MASK_SYS_MSC0CFG_DEV_RESET_ALL;\n\n  delayms(1);\n  // Set device detect and remote wakeup enable interrupt enables.\n  SYS->PMCFG_L = SYS->PMCFG_L | MASK_SYS_PMCFG_DEV_DETECT_EN;\n\n#if defined(__FT930__)\n  // Setup VBUS detect\n  SYS->MSC0CFG = SYS->MSC0CFG | MASK_SYS_MSC0CFG_USB_VBUS_EN;\n#endif\n}\n\n// Determine the speed of the USB to which we are connected.\n// Set the speed of the PHY accordingly.\n// High speed can be disabled through CFG_TUSB_RHPORT0_MODE or CFG_TUD_MAX_SPEED settings.\nstatic void _ft9xx_usb_speed(void)\n{\n\tuint8_t  fctrl_val;\n\n\t// If USB device function is already enabled then disable it.\n\tif (USBD_REG(fctrl) & MASK_USBD_FCTRL_USB_DEV_EN) {\n\t\tUSBD_REG(fctrl) = (USBD_REG(fctrl) & (~MASK_USBD_FCTRL_USB_DEV_EN));\n\t\tdelayus(200);\n\t}\n\n#if BOARD_TUD_MAX_SPEED == OPT_MODE_HIGH_SPEED\n\n\t/* Detect high or full speed */\n\tfctrl_val = MASK_USBD_FCTRL_USB_DEV_EN;\n#if defined(__FT900__)\n\tif (!sys_check_ft900_revB())//if 90x series is rev C\n\t{\n\t\tfctrl_val |= MASK_USBD_FCTRL_IMP_PERF;\n\t}\n#endif\n\tUSBD_REG(fctrl) = fctrl_val;\n\n#if defined(__FT930__)\n\tdelayus(200);\n\n\t_speed = (SYS->MSC0CFG & MASK_SYS_MSC0CFG_HIGH_SPED_MODE) ?\n\t\tTUSB_SPEED_HIGH : TUSB_SPEED_FULL;\n#else /* __FT930__ */\n\t/* Detection by SOF */\n\twhile (!(USBD_REG(cmif) & MASK_USBD_CMIF_SOFIRQ));\n\tUSBD_REG(cmif) = MASK_USBD_CMIF_SOFIRQ;\n\tdelayus(125 + 5);\n\t_speed = (USBD_REG(cmif) & MASK_USBD_CMIF_SOFIRQ) ?\n\t\tTUSB_SPEED_HIGH : TUSB_SPEED_FULL;\n  dcd_event_bus_reset(BOARD_TUD_RHPORT, _speed, true);\n\n#endif /* !__FT930__ */\n\n#else // BOARD_TUD_MAX_SPEED == OPT_MODE_FULL_SPEED\n\n\t/* User force set to full speed */\n  _speed = TUSB_SPEED_FULL;\n  fctrl_val =\n\t\t\tMASK_USBD_FCTRL_USB_DEV_EN | MASK_USBD_FCTRL_MODE_FS_ONLY;\n#if defined(__FT900__)\n\tif (!sys_check_ft900_revB())//if 90x series is rev C\n\t{\n\t\t\tfctrl_val |= MASK_USBD_FCTRL_IMP_PERF;\n\t}\n#endif\n\tUSBD_REG(fctrl) = fctrl_val;\n  dcd_event_bus_reset(BOARD_TUD_RHPORT, _speed, true);\n\treturn;\n\n#endif // BOARD_TUD_MAX_SPEED\n}\n\n// Send a buffer to the USB IN FIFO.\n// When the macro USBD_USE_STREAMS is defined this will stream a buffer of data\n// to the FIFO using the most efficient MCU streamout combination.\n// If streaming is disabled then it will send each byte of the buffer in turn\n// to the FIFO. The is no reason to not stream.\n// The total number of bytes sent to the FIFO is returned.\nstatic uint16_t _ft9xx_dusb_in(uint8_t ep_number, const uint8_t *buffer, uint16_t length)\n{\n  uint16_t bytes_read = 0;\n  uint16_t buff_size = length;\n\n#ifdef USBD_USE_STREAMS\n  volatile uint8_t *data_reg;\n\n  data_reg = (volatile uint8_t *)&(USBD->ep[ep_number].epxfifo);\n  if (buff_size)\n  {\n    if (((uint32_t)buffer) % 4 == 0)\n    {\n      uint16_t aligned = buff_size & (~3);\n      uint16_t left = buff_size & 3;\n\n      if (aligned)\n      {\n        __asm__ volatile(\"streamout.l %0,%1,%2\"\n                         :\n                         : \"r\"(data_reg), \"r\"(buffer), \"r\"(aligned));\n        buffer += aligned;\n      }\n      if (left)\n      {\n        __asm__ volatile(\"streamout.b %0,%1,%2\"\n                         :\n                         : \"r\"(data_reg), \"r\"(buffer), \"r\"(left));\n      }\n    }\n    else\n    {\n      __asm__ volatile(\"streamout.b %0,%1,%2\"\n                       :\n                       : \"r\"(data_reg), \"r\"(buffer), \"r\"(buff_size));\n    }\n    bytes_read = buff_size;\n  }\n#else // USBD_USE_STREAMS\n\n  bytes_read = buff_size;\n  while (buff_size--)\n  {\n    USBD_EP_FIFO_REG(ep_number) = *buffer++;\n  };\n\n#endif // USBD_USE_STREAMS\n\n  return bytes_read;\n}\n\n// Receive a buffer from the USB OUT FIFO.\n// When the macro USBD_USE_STREAMS is defined this will stream from the FIFO\n// to a buffer of data using the most efficient MCU streamin combination.\n// If streaming is disabled then it will receive each byte from the FIFO in turn\n// to the buffer. The is no reason to not stream.\n// The total number of bytes received from the FIFO is returned.\nstatic uint16_t _ft9xx_dusb_out(uint8_t ep_number, uint8_t *buffer, uint16_t length)\n{\n#ifdef USBD_USE_STREAMS\n  volatile uint8_t *data_reg;\n#endif // USBD_USE_STREAMS\n  uint16_t bytes_read = 0;\n  uint16_t buff_size = length;\n\n  if (length > 0)\n  {\n    if (ep_number == USBD_EP_0)\n    {\n      buff_size = USBD_EP_CNT_REG(USBD_EP_0);\n    }\n    else\n    {\n      if (USBD_EP_SR_REG(ep_number) & (MASK_USBD_EPxSR_OPRDY))\n      {\n        buff_size = USBD_EP_CNT_REG(ep_number);\n      }\n    }\n  }\n\n  // Only read as many bytes as we have space for.\n  if (buff_size > length)\n    buff_size = length;\n\n#ifdef USBD_USE_STREAMS\n  data_reg = (volatile uint8_t *)&(USBD->ep[ep_number].epxfifo);\n  if (buff_size)\n  {\n    if ((uint32_t)buffer % 4 == 0)\n    {\n      uint16_t aligned = buff_size & (~3);\n      uint16_t left = buff_size & 3;\n\n      if (aligned)\n      {\n        __asm__ volatile(\"streamin.l %0,%1,%2\"\n                         :\n                         : \"r\"(buffer), \"r\"(data_reg), \"r\"(aligned));\n        buffer += aligned;\n      }\n      if (left)\n      {\n        __asm__ volatile(\"streamin.b %0,%1,%2\"\n                         :\n                         : \"r\"(buffer), \"r\"(data_reg), \"r\"(left));\n      }\n    }\n    else\n    {\n      __asm__ volatile(\"streamin.b %0,%1,%2\"\n                       :\n                       : \"r\"(buffer), \"r\"(data_reg), \"r\"(buff_size));\n    }\n    bytes_read = buff_size;\n  }\n#else // USBD_USE_STREAMS\n\n  bytes_read = buff_size;\n  while (buff_size--)\n  {\n    *buffer++ = USBD_EP_FIFO_REG(ep_number);\n  }\n\n#endif // USBD_USE_STREAMS\n\n  return bytes_read;\n}\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\n\n// Initialize controller to device mode\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  TU_LOG2(\"FT9xx initialisation\\r\\n\");\n\n  _dcd_ft9xx_attach();\n\n  interrupt_attach(interrupt_usb_device, (int8_t)interrupt_usb_device, _ft9xx_usbd_ISR);\n\n  dcd_connect(rhport);\n  return true;\n}\n\n// Enable device interrupt\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void)rhport;\n  TU_LOG3(\"FT9xx int enable\\r\\n\");\n\n  // Peripheral devices interrupt enable.\n  interrupt_enable_globally();\n}\n\n// Disable device interrupt\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void)rhport;\n  TU_LOG3(\"FT9xx int disable\\r\\n\");\n\n  // Peripheral devices interrupt disable.\n  interrupt_disable_globally();\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void)rhport;\n  (void)dev_addr;\n\n  // Respond with status. There is no checking that the address is in range.\n  dcd_edpt_xfer(rhport, tu_edpt_addr(USBD_EP_0, TUSB_DIR_IN), NULL, 0, false);\n\n  // Set the update bit for the address register.\n  dev_addr |= 0x80;\n\n  // Modify the address register within a critical section.\n  CRITICAL_SECTION_BEGIN\n  {\n    USBD_REG(faddr) = dev_addr;\n  }\n  CRITICAL_SECTION_END;\n}\n\n// Invoked when a control transfer's status stage is complete.\n// May help DCD to prepare for next control transfer, this API is optional.\n#if 0 // never called\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request)\n{\n  (void) rhport;\n\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD )\n  {\n    if (request->bRequest == TUSB_REQ_SET_ADDRESS)\n    {\n    }\n    else if (request->bRequest == TUSB_REQ_SET_CONFIGURATION)\n    {\n    }\n  }\n}\n#endif // 0\n\n// Wake up host\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void)rhport;\n\n  SYS->MSC0CFG = SYS->MSC0CFG | MASK_SYS_MSC0CFG_DEV_RMWAKEUP;\n\n  // At least 2 ms of delay needed for RESUME Data K state.\n  delayms(2);\n\n  SYS->MSC0CFG &= ~MASK_SYS_MSC0CFG_DEV_RMWAKEUP;\n\n  // Enable USB PHY and determine current bus speed.\n  dcd_connect(rhport);\n}\n\n// Connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport)\n{\n  (void)rhport;\n  TU_LOG2(\"FT9xx connect\\r\\n\");\n\n  CRITICAL_SECTION_BEGIN\n  // Is device connected?\n  if (board_ft9xx_vbus())\n  {\n    // Clear/disable address register.\n    USBD_REG(faddr) = 0;\n    _ft9xx_phy_enable(true);\n\n    // Determine bus speed and signal speed to tusb.\n    _ft9xx_usb_speed();\n  }\n\n  // Setup the control endpoint only.\n#if CFG_TUD_ENDPOINT0_SIZE == 64\n  USBD_EP_CR_REG(USBD_EP_0) = (USBD_EP0_MAX_SIZE_64 << BIT_USBD_EP0_MAX_SIZE);\n#elif CFG_TUD_ENDPOINT0_SIZE == 32\n  USBD_EP_CR_REG(USBD_EP_0) = (USBD_EP0_MAX_SIZE_32 << BIT_USBD_EP0_MAX_SIZE);\n#elif CFG_TUD_ENDPOINT0_SIZE == 16\n  USBD_EP_CR_REG(USBD_EP_0) = (USBD_EP0_MAX_SIZE_16 << BIT_USBD_EP0_MAX_SIZE);\n#elif CFG_TUD_ENDPOINT0_SIZE == 8\n  USBD_EP_CR_REG(USBD_EP_0) = (USBD_EP0_MAX_SIZE_8 << BIT_USBD_EP0_MAX_SIZE);\n#else\n#error \"CFG_TUD_ENDPOINT0_SIZE must be defined with a value of 8, 16, 32 or 64.\"\n#endif\n  CRITICAL_SECTION_END;\n\n  // Configure the control endpoint.\n  ep_xfer[USBD_EP_0].size = CFG_TUD_ENDPOINT0_SIZE;\n  ep_xfer[USBD_EP_0].type = TUSB_XFER_CONTROL;\n\n  // Enable interrupts on EP0.\n  USBD_REG(epie) = (MASK_USBD_EPIE_EP0IE);\n\n  // Restore default endpoint state.\n  _ft9xx_reset_edpts();\n}\n\n// Disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void)rhport;\n  TU_LOG2(\"FT9xx disconnect\\r\\n\");\n\n  // Disable the USB PHY.\n  _ft9xx_phy_enable(false);\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n// Configure endpoint's registers according to descriptor\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *ep_desc)\n{\n  (void)rhport;\n  uint8_t const ep_number = tu_edpt_number(ep_desc->bEndpointAddress);\n  uint8_t const ep_dir = tu_edpt_dir(ep_desc->bEndpointAddress);\n  uint8_t const ep_type = ep_desc->bmAttributes.xfer;\n  uint16_t const ep_size = tu_edpt_packet_size(ep_desc); // Mask size per packet, bits 10..0.\n  uint16_t ep_buff_size;\n  uint8_t ep_reg_size = USBD_EP_MAX_SIZE_8;\n  uint8_t ep_reg_data = 0;\n  int16_t total_ram;\n\n  TU_LOG2(\"FT9xx endpoint open %d %c\\r\\n\", ep_number, ep_dir?'I':'O');\n\n  // Check that the requested endpoint number is allowable.\n  if (ep_number >= USBD_MAX_ENDPOINT_COUNT)\n  {\n    TU_LOG1(\"FT9xx endpoint not valid: requested %d max %d\\r\\n\", ep_number, USBD_MAX_ENDPOINT_COUNT);\n    return false;\n  }\n\n  // Calculate the physical size of the endpoint as a power of 2. This may be more than\n  // the requested size.\n  while (ep_size > (8 * (1 << ep_reg_size)))\n  {\n    ep_reg_size++;\n  }\n  if (ep_reg_size > USBD_EP_MAX_SIZE_1024)\n  {\n    TU_LOG1(\"FT9xx endpoint size not valid: requested %d max 1024\\r\\n\", ep_size);\n    return false;\n  }\n  // Calculate actual amount of buffer RAM used by this endpoint. This may be more than the\n  // requested size.\n  ep_buff_size = 8 << ep_reg_size;\n\n  if (ep_number > 0)\n  {\n    // Set EP cmd parameters...\n    ep_reg_data |= (ep_reg_size << BIT_USBD_EP_MAX_SIZE);\n\n    if (ep_xfer[ep_number].type != USBD_EP_TYPE_DISABLED)\n    {\n      // This could be because an endpoint has been assigned with the same number.\n      // On FT9xx, IN and OUT endpoints may not have the same number. e.g. There\n      // cannot been an 0x81 and 0x01 endpoint.\n      TU_LOG1(\"FT9xx endpoint %d already assigned\\r\\n\", ep_number);\n      return false;\n    }\n\n    // Check that there is enough buffer RAM to allocate to this new endpoint.\n    // Available buffer RAM depends on the device revision.\n    // The IN and OUT buffer RAM should be the same size.\n    if (ep_dir == USBD_DIR_IN)\n      total_ram = USBD_RAMTOTAL_IN;\n    else\n      total_ram = USBD_RAMTOTAL_OUT;\n    // Work out how much has been allocated to existing endpoints.\n    // The total RAM allocated should always be a positive number as this\n    // algorithm should not let it go below zero.\n    for (int i = 1; i < USBD_MAX_ENDPOINT_COUNT; i++)\n    {\n      if (ep_xfer[i].type != USBD_EP_TYPE_DISABLED)\n      {\n        if (ep_xfer[i].dir == ep_dir)\n        {\n          total_ram -= ep_xfer[i].buff_size;\n        }\n      }\n    }\n\n    if (sys_check_ft900_revB())\n    {\n      // The control endpoint is taken into account as well on RevB silicon.\n      total_ram -= ep_xfer[0].buff_size;\n    }\n\n    // Make sure we have enough space. The corner case is having zero bytes\n    // free which means that total_ram must be signed as zero bytes free is\n    // allowable.\n    if (total_ram < ep_buff_size)\n    {\n      TU_LOG1(\"FT9xx insufficient buffer RAM for endpoint %d\\r\\n\", ep_number);\n      return false;\n    }\n\n    // Set the type of this endpoint in the control register.\n    if (ep_type == TUSB_XFER_BULK)\n      ep_reg_data |= (USBD_EP_DIS_BULK << BIT_USBD_EP_CONTROL_DIS);\n    else if (ep_type == TUSB_XFER_INTERRUPT)\n      ep_reg_data |= (USBD_EP_DIS_INT << BIT_USBD_EP_CONTROL_DIS);\n    else if (ep_type == TUSB_XFER_ISOCHRONOUS)\n      ep_reg_data |= (USBD_EP_DIS_ISO << BIT_USBD_EP_CONTROL_DIS);\n    // Set the direction of this endpoint in the control register.\n    if (ep_dir == USBD_DIR_IN)\n      ep_reg_data |= MASK_USBD_EPxCR_DIR;\n    // Do not perform double buffering.\n    //if (<double buffering flag> != USBD_DB_OFF)\n    //ep_reg_data |= MASK_USBD_EPxCR_DB;\n    // Set the control register for this endpoint.\n    USBD_EP_CR_REG(ep_number) = ep_reg_data;\n    TU_LOG2(\"FT9xx endpoint setting %x\\r\\n\", ep_reg_data);\n  }\n  else\n  {\n    // Set the control register for endpoint zero.\n    USBD_EP_CR_REG(USBD_EP_0) = (ep_reg_size << BIT_USBD_EP0_MAX_SIZE);\n  }\n\n  CRITICAL_SECTION_BEGIN\n  // Store the endpoint characteristics for later reference.\n  ep_xfer[ep_number].dir = ep_dir;\n  ep_xfer[ep_number].type = ep_type;\n  ep_xfer[ep_number].size = ep_size;\n  ep_xfer[ep_number].buff_size = ep_buff_size;\n\n  // Clear register transaction continuation and signalling state.\n  ep_xfer[ep_number].ready = 0;\n  ep_xfer[ep_number].valid = 0;\n  ep_xfer[ep_number].buff_ptr = NULL;\n  ep_xfer[ep_number].total_size = 0;\n  ep_xfer[ep_number].remain_size = 0;\n  CRITICAL_SECTION_END\n\n  return true;\n}\n\n// Close all endpoints.\nvoid dcd_edpt_close_all(uint8_t rhport)\n{\n  (void)rhport;\n  // Reset the endpoint configurations.\n  _ft9xx_reset_edpts();\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void)rhport;\n  uint8_t ep_number = tu_edpt_number(ep_addr);\n  uint8_t ep_dir = tu_edpt_dir(ep_addr);\n  uint16_t xfer_bytes;\n  bool status = false;\n\n  // We will attempt to transfer the buffer. If it is less than or equal to the  endpoint\n  // maximum packet size then the whole buffer will be transferred. If it is larger then\n  // the interrupt handler will transfer the remainder.\n  // ep_xfer is used to tell the interrupt handler what to do.\n  // ep_xfer can be used at interrupt level to continue transfers.\n  CRITICAL_SECTION_BEGIN\n\n  // Transfer currently in progress.\n  if (ep_xfer[ep_number].valid == 0)\n  {\n    ep_xfer[ep_number].total_size = total_bytes;\n    ep_xfer[ep_number].remain_size = total_bytes;\n    ep_xfer[ep_number].buff_ptr = buffer;\n\n    if (ep_number == USBD_EP_0)\n    {\n      ep_xfer[USBD_EP_0].dir = ep_dir;\n    }\n    else\n    {\n      // Enable the interrupt for this endpoint allowing the interrupt handler to report\n      // continue the transfer and signal completion.\n      USBD_REG(epie) = USBD_REG(epie) | (1 << ep_number);\n    }\n\n    if (ep_dir == TUSB_DIR_IN)\n    {\n      // For IN transfers send the first packet as a starter. Interrupt handler to complete\n      // this if it is larger than one packet.\n      xfer_bytes = _ft9xx_edpt_xfer_in(ep_number, buffer, total_bytes);\n\n      ep_xfer[ep_number].buff_ptr += xfer_bytes;\n      ep_xfer[ep_number].remain_size -= xfer_bytes;\n\n      // Tell the interrupt handler to signal dcd_event_xfer_complete on completion.\n      ep_xfer[ep_number].valid = 1;\n    }\n    else // (dir == TUSB_DIR_OUT)\n    {\n      // For OUT transfers on the control endpoint.\n      // The host may already have performed the first data transfer after the SETUP packet\n      // before the transfer is setup for it.\n      if (ep_xfer[ep_number].ready)\n      {\n        // We have received a data packet on the endpoint without a transfer\n        // being initialised. This can be because the host has sent this packet before\n        // a new transfer has been initiated on the endpoint.\n        // We will now stream the data from the FIFO.\n        ep_xfer[ep_number].ready = 0;\n\n        // Transfer incoming data from an OUT packet to the buffer.\n        xfer_bytes = _ft9xx_edpt_xfer_out(ep_number, buffer, total_bytes);\n\n        // Report completion of the transfer.\n        dcd_event_xfer_complete(BOARD_TUD_RHPORT, ep_number /*| TUSB_DIR_OUT_MASK */, xfer_bytes, XFER_RESULT_SUCCESS, false);\n      }\n      else\n      {\n        // Tell the interrupt handler to wait for the packet to be received and\n        // then report the transfer complete with dcd_event_xfer_complete.\n        ep_xfer[ep_number].valid = 1;\n      }\n    }\n    status = true;\n  }\n  else\n  {\n    // Note: should not arrive here.\n  }\n\n  CRITICAL_SECTION_END\n\n  return status;\n}\n\n// Submit a transfer where is managed by FIFO, When complete dcd_event_xfer_complete() is invoked to notify the stack - optional, however, must be listed in usbd.c\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void)rhport;\n  (void)ep_addr;\n  (void)ff;\n  (void)total_bytes;\n  bool status = false;\n  return status;\n}\n\n// Stall endpoint (non-control endpoint)\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  uint8_t ep_number = tu_edpt_number(ep_addr);\n  (void)rhport;\n\n  CRITICAL_SECTION_BEGIN\n  if (ep_number == USBD_EP_0)\n  {\n    USBD_EP_CR_REG(USBD_EP_0) = USBD_EP_CR_REG(USBD_EP_0) |\n                              MASK_USBD_EP0CR_SDSTL;\n  }\n  else\n  {\n    USBD_EP_CR_REG(ep_number) = USBD_EP_CR_REG(ep_number) |\n                              MASK_USBD_EPxCR_SDSTL;\n    USBD_EP_SR_REG(ep_number) = MASK_USBD_EPxSR_CLR_TOGGLE |\n                              MASK_USBD_EPxSR_FIFO_FLUSH;\n  }\n  CRITICAL_SECTION_END\n}\n\n// Clear stall (non-control endpoint), data toggle is also reset to DATA0\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  uint8_t ep_number = tu_edpt_number(ep_addr);\n  (void)rhport;\n\n  if (ep_number > USBD_EP_0)\n  {\n    CRITICAL_SECTION_BEGIN\n    USBD_EP_CR_REG(ep_number) = USBD_EP_CR_REG(ep_number) &\n                              (~MASK_USBD_EPxCR_SDSTL);\n    USBD_EP_SR_REG(ep_number) = MASK_USBD_EPxSR_CLR_TOGGLE;\n\n    // Allow transfers to restart.\n    ep_xfer[ep_number].ready = 0;\n    ep_xfer[ep_number].valid = 0;\n    ep_xfer[ep_number].remain_size = 0;\n    CRITICAL_SECTION_END\n  }\n}\n\n// Interrupt handling.\n\nvoid _ft9xx_usbd_ISR(void)\n{\n  dcd_int_handler(BOARD_TUD_RHPORT);\n}\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  (void)rhport;\n\n  // Read the Common Interrupt Flag Register.\n  uint8_t cmif = USBD_REG(cmif);\n  // Read the Endpoint Interrupt Flag Register.\n#if defined(__FT930__)\n  // This is 16 bits on FT93x.\n  uint16_t epif = USBD_REG(epif);\n#else\n  // This is 8 bits on FT90x.\n  uint8_t epif = USBD_REG(epif);\n#endif\n\n  if (cmif & MASK_USBD_CMIF_ALL)\n  {\n    // Clear all CMIF bits.\n    USBD_REG(cmif) = MASK_USBD_CMIF_ALL;\n    if (cmif & MASK_USBD_CMIF_PHYIRQ) //Handle PHY interrupt\n    {\n    }\n    if (cmif & MASK_USBD_CMIF_PIDIRQ) //Handle PIDIRQ interrupt\n    {\n    }\n    if (cmif & MASK_USBD_CMIF_CRC16IRQ) //Handle CRC16IRQ interrupt\n    {\n    }\n    if (cmif & MASK_USBD_CMIF_CRC5IRQ) //Handle CRC5 interrupt\n    {\n    }\n    if (cmif & MASK_USBD_CMIF_RSTIRQ) //Handle Reset interrupt\n    {\n      // Reset endpoints to default state.\n      _ft9xx_reset_edpts();\n      dcd_event_bus_reset(BOARD_TUD_RHPORT, _speed, true);\n    }\n    if (cmif & MASK_USBD_CMIF_SUSIRQ) //Handle Suspend interrupt\n    {\n      dcd_event_bus_signal(BOARD_TUD_RHPORT, DCD_EVENT_SUSPEND, true);\n    }\n    if (cmif & MASK_USBD_CMIF_RESIRQ) //Handle Resume interrupt\n    {\n      dcd_event_bus_signal(BOARD_TUD_RHPORT, DCD_EVENT_RESUME, true);\n    }\n    if (cmif & MASK_USBD_CMIF_SOFIRQ) //Handle SOF interrupt\n    {\n      dcd_event_bus_signal(BOARD_TUD_RHPORT, DCD_EVENT_SOF, true);\n    }\n  }\n  // Handle endpoint interrupts.\n  if (epif)\n  {\n    uint16_t xfer_bytes;\n\n    // Check for EP0 interrupts pending.\n    if (epif & MASK_USBD_EPIF_EP0IRQ)\n    {\n      // Clear interrupt register.\n      USBD_REG(epif) = MASK_USBD_EPIF_EP0IRQ;\n      // Test for an incoming SETUP request on the control endpoint.\n      if (USBD_EP_SR_REG(USBD_EP_0) & MASK_USBD_EP0SR_SETUP)\n      {\n        // If protocol STALL, End the STALL signalling.\n        if (USBD_EP_CR_REG(USBD_EP_0) & MASK_USBD_EP0CR_SDSTL)\n        {\n          // STALL end.\n          USBD_EP_CR_REG(USBD_EP_0) = USBD_EP_CR_REG(USBD_EP_0) &\n                                      (~MASK_USBD_EP0CR_SDSTL);\n          // Clear STALL send.\n          USBD_EP_SR_REG(USBD_EP_0) = MASK_USBD_EP0SR_STALL;\n        }\n\n        // Host has sent a SETUP packet. Receive this into the SETUP packet store.\n        _ft9xx_dusb_out(USBD_EP_0, (uint8_t *)_ft9xx_setup_packet, sizeof(USB_device_request));\n\n        // Send the packet to tinyusb.\n        dcd_event_setup_received(BOARD_TUD_RHPORT, _ft9xx_setup_packet, true);\n\n        // Clear the interrupt that signals a SETUP packet is received.\n        USBD_EP_SR_REG(USBD_EP_0) = (MASK_USBD_EP0SR_SETUP);\n\n        // Any SETUP packet will clear the incoming FIFO.\n        ep_xfer[USBD_EP_0].ready = 0;\n\n        // Allow new DATA and ACK transfers on the control endpoint.\n        ep_xfer[USBD_EP_0].valid = 0;\n        return;\n      }\n      else\n      {\n        // Check for a complete or partially complete transfers on EP0.\n        if (ep_xfer[USBD_EP_0].valid)\n        {\n          xfer_bytes = (uint16_t)ep_xfer[USBD_EP_0].total_size;\n\n          // Transfer incoming data from an OUT packet to the buffer supplied.\n          if (ep_xfer[USBD_EP_0].dir == TUSB_DIR_OUT)\n          {\n            xfer_bytes = _ft9xx_edpt_xfer_out(USBD_EP_0, ep_xfer[USBD_EP_0].buff_ptr, xfer_bytes);\n          }\n          // Now signal completion of data packet.\n          dcd_event_xfer_complete(BOARD_TUD_RHPORT, USBD_EP_0 | (ep_xfer[USBD_EP_0].dir ? TUSB_DIR_IN_MASK : 0),\n            xfer_bytes, XFER_RESULT_SUCCESS, true);\n\n          // Incoming FIFO has been cleared.\n          ep_xfer[USBD_EP_0].ready = 0;\n\n          // Allow new transfers on the control endpoint.\n          ep_xfer[USBD_EP_0].valid = 0;\n        }\n        // No transfer is in flight for EP0.\n        else\n        {\n          // We have received a data packet on the control endpoint without a transfer\n          // being initialised. This can be because the host has sent this packet before\n          // a new transfer has been initiated on the control endpoint.\n          // We will record that there is data in the FIFO for dcd_edpt_xfer to obtain\n          // once the transfer is initiated.\n          ep_xfer[USBD_EP_0].ready = 1;\n        }\n      }\n    }\n    else // !(epif & MASK_USBD_EPIF_EP0IRQ)\n    {\n      // Mask out currently disabled endpoints.\n      epif &= USBD_REG(epie);\n\n      // Handle complete and partially complete transfers for each endpoint.\n      for (uint8_t ep_number = 1; ep_number < USBD_MAX_ENDPOINT_COUNT; ep_number++)\n      {\n        if ((epif & MASK_USBD_EPIF_IRQ(ep_number)) == 0)\n        {\n          // No pending interrupt for this endpoint.\n          continue;\n        }\n\n        if (ep_xfer[ep_number].valid)\n        {\n          xfer_bytes = 0;\n\n          // Clear interrupt register for this endpoint.\n          USBD_REG(epif) = MASK_USBD_EPIF_IRQ(ep_number);\n\n          // Start or continue an OUT transfer.\n          if (ep_xfer[ep_number].dir == TUSB_DIR_OUT)\n          {\n            xfer_bytes = _ft9xx_edpt_xfer_out(ep_number,\n                            ep_xfer[ep_number].buff_ptr,\n                            (uint16_t)ep_xfer[ep_number].remain_size);\n\n            // Report each OUT packet received to the stack.\n            dcd_event_xfer_complete(BOARD_TUD_RHPORT,\n                                      ep_number /* | TUSB_DIR_OUT_MASK */,\n                                      xfer_bytes, XFER_RESULT_SUCCESS, true);\n\n            ep_xfer[ep_number].buff_ptr += xfer_bytes;\n            ep_xfer[ep_number].remain_size -= xfer_bytes;\n          }\n          // continue an IN transfer\n          else // if (ep_xfer[ep_number].dir == TUSB_DIR_IN)\n          {\n            if (ep_xfer[ep_number].remain_size > 0)\n            {\n              xfer_bytes = _ft9xx_edpt_xfer_in(ep_number,\n                            ep_xfer[ep_number].buff_ptr,\n                            (uint16_t)ep_xfer[ep_number].remain_size);\n\n              ep_xfer[ep_number].buff_ptr += xfer_bytes;\n              ep_xfer[ep_number].remain_size -= xfer_bytes;\n            }\n\n            if (ep_xfer[ep_number].remain_size == 0)\n            {\n              dcd_event_xfer_complete(BOARD_TUD_RHPORT,\n                                      ep_number | TUSB_DIR_IN_MASK,\n                                      ep_xfer[ep_number].total_size, XFER_RESULT_SUCCESS, true);\n            }\n          }\n\n          // When the transfer is complete...\n          if (ep_xfer[ep_number].remain_size == 0)\n          {\n            // Finish this transfer and allow new transfers on this endpoint.\n            ep_xfer[ep_number].valid = 0;\n\n            // Disable the interrupt for this endpoint now it is complete.\n            USBD_REG(epie) = USBD_REG(epie) & (~(1 << ep_number));\n          }\n\n          ep_xfer[ep_number].ready = 0;\n        }\n        // No OUT transfer is in flight for this endpoint.\n        else\n        {\n          if (ep_xfer[ep_number].dir == TUSB_DIR_OUT)\n          {\n            // We will record that there is data in the FIFO for dcd_edpt_xfer to obtain\n            // once the transfer is initiated.\n            // Strictly this should not happen for a non-control endpoint. Interrupts\n            // are disabled when there are no transfers setup for an endpoint.\n            ep_xfer[ep_number].ready = 1;\n          }\n        }\n      }\n    }\n  }\n}\n\n// Power management interrupt handler.\n// This handles USB device related power management interrupts only.\nvoid ft9xx_usbd_pm_ISR(void)\n{\n    uint16_t pmcfg = SYS->PMCFG_H;\n\n  // Main interrupt handler is responible for\n  if (pmcfg & MASK_SYS_PMCFG_DEV_CONN_DEV)\n  {\n      // Signal connection interrupt\n      SYS->PMCFG_H = MASK_SYS_PMCFG_PM_GPIO_IRQ_PEND;\n      dcd_event_bus_signal(BOARD_TUD_RHPORT, DCD_EVENT_RESUME, true);\n  }\n\n  if (pmcfg & MASK_SYS_PMCFG_DEV_DIS_DEV)\n  {\n      // Signal disconnection interrupt\n      SYS->PMCFG_H = MASK_SYS_PMCFG_PM_GPIO_IRQ_PEND;\n      dcd_event_bus_signal(BOARD_TUD_RHPORT, DCD_EVENT_UNPLUGGED, true);\n  }\n\n  if (pmcfg & MASK_SYS_PMCFG_HOST_RST_DEV)\n  {\n      // Signal Host Reset interrupt\n      SYS->PMCFG_H = MASK_SYS_PMCFG_PM_GPIO_IRQ_PEND;\n      dcd_event_bus_signal(BOARD_TUD_RHPORT, DCD_EVENT_BUS_RESET, true);\n  }\n\n  if (pmcfg & MASK_SYS_PMCFG_HOST_RESUME_DEV)\n  {\n      // Signal Host Resume interrupt\n      SYS->PMCFG_H = MASK_SYS_PMCFG_PM_GPIO_IRQ_PEND;\n      if (!(SYS->MSC0CFG & MASK_SYS_MSC0CFG_DEV_RMWAKEUP))\n      {\n          // If we are driving K-state on Device USB port;\n          // We must maintain the 1ms requirement before resuming the phy\n          dcd_event_bus_signal(BOARD_TUD_RHPORT, DCD_EVENT_RESUME, true);\n      }\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_fs/ci_fs_kinetis.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _CI_FS_KINETIS_H\n#define _CI_FS_KINETIS_H\n\n#include \"fsl_device_registers.h\"\n\n//static const ci_fs_controller_t _ci_controller[] = {\n//    {.reg_base = USB0_BASE, .irqnum = USB0_IRQn}\n//};\n\n#define CI_FS_REG(_port)        ((ci_fs_regs_t*) USB0_BASE)\n#define CI_REG                  CI_FS_REG(0)\n\nvoid dcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(USB0_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(USB0_IRQn);\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_fs/ci_fs_mcx.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _CI_FS_MCX_H\n#define _CI_FS_MCX_H\n\n#include \"fsl_device_registers.h\"\n\n#if CFG_TUSB_MCU == OPT_MCU_MCXN9\n  #define CI_FS_REG(_port)  ((ci_fs_regs_t*) USBFS0_BASE)\n  #define CIFS_IRQN \t\t\t\tUSB0_FS_IRQn\n\n#elif CFG_TUSB_MCU == OPT_MCU_MCXA15\n  #define CI_FS_REG(_port)  ((ci_fs_regs_t*) USB0_BASE)\n  #define CIFS_IRQN         USB0_IRQn\n\n#else\n  #error \"MCU is not supported\"\n#endif\n\n#define CI_REG              CI_FS_REG(0)\n\nvoid dcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(CIFS_IRQN);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(CIFS_IRQN);\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_fs/ci_fs_type.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _CI_FS_TYPE_H\n#define _CI_FS_TYPE_H\n\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n// Note: some MCUs can only access these registers in 8-bit mode\n// align 4 is used to get rid of reserved fields\n#define _va32     volatile TU_ATTR_ALIGNED(4)\n\ntypedef struct {\n  _va32 uint8_t PER_ID;                 // [00] Peripheral ID register\n  _va32 uint8_t ID_COMP;                // [04] Peripheral ID complement register\n  _va32 uint8_t REV;                    // [08] Peripheral revision register\n  _va32 uint8_t ADD_INFO;               // [0C] Peripheral additional info register\n  _va32 uint8_t OTG_ISTAT;              // [10] OTG Interrupt Status Register\n  _va32 uint8_t OTG_ICTRL;              // [14] OTG Interrupt Control Register\n  _va32 uint8_t OTG_STAT;               // [18] OTG Status Register\n  _va32 uint8_t OTG_CTRL;               // [1C] OTG Control register\n  uint32_t reserved_20[24];             // [20]\n  _va32 uint8_t INT_STAT;               // [80] Interrupt status register\n  _va32 uint8_t INT_EN;                 // [84] Interrupt enable register\n  _va32 uint8_t ERR_STAT;               // [88] Error interrupt status register\n  _va32 uint8_t ERR_ENB;                // [8C] Error interrupt enable register\n  _va32 uint8_t STAT;                   // [90] Status register\n  _va32 uint8_t CTL;                    // [94] Control register\n  _va32 uint8_t ADDR;                   // [98] Address register\n  _va32 uint8_t BDT_PAGE1;              // [9C] BDT page register 1\n  _va32 uint8_t FRM_NUML;               // [A0] Frame number register\n  _va32 uint8_t FRM_NUMH;               // [A4] Frame number register\n  _va32 uint8_t TOKEN;                  // [A8] Token register\n  _va32 uint8_t SOF_THLD;               // [AC] SOF threshold register\n  _va32 uint8_t BDT_PAGE2;              // [B0] BDT page register 2\n  _va32 uint8_t BDT_PAGE3;              // [B4] BDT page register 3\n\n  uint32_t reserved_b8;                 // [B8]\n  uint32_t reserved_bc;                 // [BC]\n\n  struct {\n    _va32 uint8_t CTL;\n  }EP[16];                              // [C0] Endpoint control register\n\n  //----- Following is only found available in NXP Kinetis\n  _va32 uint8_t USBCTRL;                // [100] USB Control register,\n  _va32 uint8_t OBSERVE;                // [104] USB OTG Observe register,\n  _va32 uint8_t CONTROL;                // [108] USB OTG Control register,\n  _va32 uint8_t USBTRC0;                // [10C] USB Transceiver Control Register 0,\n  uint32_t reserved_110;                // [110]\n  _va32 uint8_t USBFRMADJUST;           // [114] Frame Adjust Register,\n\n  //----- Following is only found available in NXP MCX\n  uint32_t reserved_118[3];             // [118]\n  _va32 uint8_t KEEP_ALIVE_CTRL;        // [124] Keep Alive Mode Control,\n  _va32 uint8_t KEEP_ALIVE_WKCTRL;      // [128] Keep Alive Mode Wakeup Control,\n  _va32 uint8_t MISCCTRL;               // [12C] Miscellaneous Control,\n  _va32 uint8_t STALL_IL_DIS;           // [130] Peripheral Mode Stall Disable for Endpoints[ 7..0] IN\n  _va32 uint8_t STALL_IH_DIS;           // [134] Peripheral Mode Stall Disable for Endpoints[15..8] IN\n  _va32 uint8_t STALL_OL_DIS;           // [138] Peripheral Mode Stall Disable for Endpoints[ 7..0] OUT\n  _va32 uint8_t STALL_OH_DIS;           // [13C] Peripheral Mode Stall Disable for Endpoints[15..8] OUT\n  _va32 uint8_t CLK_RECOVER_CTRL;       // [140] USB Clock Recovery Control,\n  _va32 uint8_t CLK_RECOVER_IRC_EN;     // [144] FIRC Oscillator Enable,\n  uint32_t reserved_148[3];             // [148]\n  _va32 uint8_t CLK_RECOVER_INT_EN;     // [154] Clock Recovery Combined Interrupt Enable,\n  uint32_t reserved_158;                // [158]\n  _va32 uint8_t CLK_RECOVER_INT_STATUS; // [15C] Clock Recovery Separated Interrupt Status,\n} ci_fs_regs_t;\n\nTU_VERIFY_STATIC(sizeof(ci_fs_regs_t) == 0x160, \"Size is not correct\");\n\ntypedef struct\n{\n  uint32_t reg_base;\n  uint32_t irqnum;\n} ci_fs_controller_t;\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_fs/dcd_ci_fs.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_CHIPIDEA_FS)\n\n#include \"device/dcd.h\"\n#include \"ci_fs_type.h\"\n\n#if defined(TUP_USBIP_CHIPIDEA_FS_KINETIS)\n  #include \"ci_fs_kinetis.h\"\n#elif defined(TUP_USBIP_CHIPIDEA_FS_MCX)\n  #include \"ci_fs_mcx.h\"\n#else\n  #error \"MCU is not supported\"\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\nenum {\n  TOK_PID_OUT   = 0x1u,\n  TOK_PID_IN    = 0x9u,\n  TOK_PID_SETUP = 0xDu,\n};\n\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint32_t head;\n    struct {\n      union {\n        struct {\n               uint16_t           :  2;\n          __IO uint16_t tok_pid   :  4;\n               uint16_t data      :  1;\n          __IO uint16_t own       :  1;\n               uint16_t           :  8;\n        };\n        struct {\n               uint16_t           :  2;\n               uint16_t bdt_stall :  1;\n               uint16_t dts       :  1;\n               uint16_t ninc      :  1;\n               uint16_t keep      :  1;\n               uint16_t           : 10;\n        };\n      };\n      __IO uint16_t bc : 10;\n           uint16_t    :  6;\n    };\n  };\n  uint8_t *addr;\n}buffer_descriptor_t;\n\nTU_VERIFY_STATIC( sizeof(buffer_descriptor_t) == 8, \"size is not correct\" );\n\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint32_t state;\n    struct {\n      uint32_t max_packet_size :11;\n      uint32_t                 : 5;\n      uint32_t odd             : 1;\n      uint32_t                 :15;\n    };\n  };\n  uint16_t length;\n  uint16_t remaining;\n}endpoint_state_t;\n\nTU_VERIFY_STATIC( sizeof(endpoint_state_t) == 8, \"size is not correct\" );\n\ntypedef struct\n{\n  union {\n    /* [#EP][OUT,IN][EVEN,ODD] */\n    buffer_descriptor_t bdt[16][2][2];\n    uint16_t            bda[512];\n  };\n  TU_ATTR_ALIGNED(4) union {\n    endpoint_state_t endpoint[16][2];\n    endpoint_state_t endpoint_unified[16 * 2];\n  };\n  uint8_t setup_packet[8];\n  uint8_t addr;\n}dcd_data_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\n// BDT(Buffer Descriptor Table) must be 256-byte aligned\nCFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(512) static dcd_data_t _dcd;\n\nTU_VERIFY_STATIC( sizeof(_dcd.bdt) == 512, \"size is not correct\" );\n\nstatic void prepare_next_setup_packet(uint8_t rhport)\n{\n  const unsigned out_odd = _dcd.endpoint[0][0].odd;\n  const unsigned in_odd  = _dcd.endpoint[0][1].odd;\n  TU_ASSERT(0 == _dcd.bdt[0][0][out_odd].own, );\n\n  _dcd.bdt[0][0][out_odd].data     = 0;\n  _dcd.bdt[0][0][out_odd ^ 1].data = 1;\n  _dcd.bdt[0][1][in_odd].data      = 1;\n  _dcd.bdt[0][1][in_odd ^ 1].data  = 0;\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_OUT),\n                _dcd.setup_packet, sizeof(_dcd.setup_packet), false);\n}\n\nstatic void process_stall(uint8_t rhport)\n{\n  for (int i = 0; i < 16; ++i) {\n    uint32_t const ep_ctl = CI_REG->EP[i].CTL;\n\n    if (ep_ctl & USB_ENDPT_EPSTALL_MASK) {\n      // prepare next setup if endpoint0\n      if ( i == 0 ) prepare_next_setup_packet(rhport);\n\n      // clear stall bit\n      CI_REG->EP[i].CTL = ep_ctl & ~USB_ENDPT_EPSTALL_MASK;\n    }\n  }\n}\n\nstatic void process_tokdne(uint8_t rhport)\n{\n  const unsigned s = CI_REG->STAT;\n  CI_REG->INT_STAT = USB_ISTAT_TOKDNE_MASK; /* fetch the next token if received */\n\n  uint8_t const epnum = (s >> USB_STAT_ENDP_SHIFT);\n  uint8_t const dir   = (s & USB_STAT_TX_MASK) >> USB_STAT_TX_SHIFT;\n  unsigned const odd  = (s & USB_STAT_ODD_MASK) ? 1 : 0;\n\n  buffer_descriptor_t *bd = (buffer_descriptor_t *)&_dcd.bda[s];\n  endpoint_state_t    *ep = &_dcd.endpoint_unified[s >> 3];\n\n  /* fetch pid before discarded by the next steps */\n  const unsigned pid = bd->tok_pid;\n\n  /* reset values for a next transfer */\n  bd->bdt_stall = 0;\n  bd->dts       = 1;\n  bd->ninc      = 0;\n  bd->keep      = 0;\n  /* update the odd variable to prepare for the next transfer */\n  ep->odd       = odd ^ 1;\n  if (pid == TOK_PID_SETUP) {\n    dcd_event_setup_received(rhport, bd->addr, true);\n    CI_REG->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK;\n    return;\n  }\n\n  const unsigned bc = bd->bc;\n  const unsigned remaining = ep->remaining - bc;\n  if (remaining && bc == ep->max_packet_size) {\n    /* continue the transferring consecutive data */\n    ep->remaining = remaining;\n    const int next_remaining = remaining - ep->max_packet_size;\n    if (next_remaining > 0) {\n      /* prepare to the after next transfer */\n      bd->addr += ep->max_packet_size * 2;\n      bd->bc    = next_remaining > ep->max_packet_size ? ep->max_packet_size: next_remaining;\n      __DSB();\n      bd->own   = 1; /* the own bit must set after addr */\n    }\n    return;\n  }\n  const unsigned length = ep->length;\n  dcd_event_xfer_complete(rhport,\n                          tu_edpt_addr(epnum, dir),\n                          length - remaining, XFER_RESULT_SUCCESS, true);\n  if (0 == epnum && 0 == length) {\n    /* After completion a ZLP of control transfer,\n     * it prepares for the next steup transfer. */\n    if (_dcd.addr) {\n      /* When the transfer was the SetAddress,\n       * the device address should be updated here. */\n      CI_REG->ADDR = _dcd.addr;\n      _dcd.addr  = 0;\n    }\n    prepare_next_setup_packet(rhport);\n  }\n}\n\nstatic void process_bus_reset(uint8_t rhport)\n{\n  CI_REG->USBCTRL &= ~USB_USBCTRL_SUSP_MASK;\n  CI_REG->CTL     |= USB_CTL_ODDRST_MASK;\n  CI_REG->ADDR     = 0;\n  CI_REG->INT_EN   = USB_INTEN_USBRSTEN_MASK | USB_INTEN_TOKDNEEN_MASK | USB_INTEN_SLEEPEN_MASK |\n                     USB_INTEN_ERROREN_MASK | USB_INTEN_STALLEN_MASK;\n\n  CI_REG->EP[0].CTL = USB_ENDPT_EPHSHK_MASK | USB_ENDPT_EPRXEN_MASK | USB_ENDPT_EPTXEN_MASK;\n  for (unsigned i = 1; i < 16; ++i) {\n    CI_REG->EP[i].CTL = 0;\n  }\n  buffer_descriptor_t *bd = _dcd.bdt[0][0];\n  for (unsigned i = 0; i < sizeof(_dcd.bdt)/sizeof(*bd); ++i, ++bd) {\n    bd->head = 0;\n  }\n  const endpoint_state_t ep0 = {\n    .max_packet_size = CFG_TUD_ENDPOINT0_SIZE,\n    .odd             = 0,\n    .length          = 0,\n    .remaining       = 0,\n  };\n  _dcd.endpoint[0][0] = ep0;\n  _dcd.endpoint[0][1] = ep0;\n  tu_memclr(_dcd.endpoint[1], sizeof(_dcd.endpoint) - sizeof(_dcd.endpoint[0]));\n  _dcd.addr = 0;\n  prepare_next_setup_packet(rhport);\n  CI_REG->CTL &= ~USB_CTL_ODDRST_MASK;\n  dcd_event_bus_reset(rhport, TUSB_SPEED_FULL, true);\n}\n\nstatic void process_bus_sleep(uint8_t rhport)\n{\n  // Enable resume & disable suspend interrupt\n  const unsigned inten = CI_REG->INT_EN;\n\n  CI_REG->INT_EN   = (inten & ~USB_INTEN_SLEEPEN_MASK) | USB_INTEN_RESUMEEN_MASK;\n  CI_REG->USBTRC0 |= USB_USBTRC0_USBRESMEN_MASK;\n  CI_REG->USBCTRL |= USB_USBCTRL_SUSP_MASK;\n\n  dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n}\n\nstatic void process_bus_resume(uint8_t rhport)\n{\n  // Enable suspend & disable resume interrupt\n  const unsigned inten = CI_REG->INT_EN;\n\n  CI_REG->USBCTRL &= ~USB_USBCTRL_SUSP_MASK; // will also clear USB_USBTRC0_USB_RESUME_INT_MASK\n  CI_REG->USBTRC0 &= ~USB_USBTRC0_USBRESMEN_MASK;\n  CI_REG->INT_EN   = (inten & ~USB_INTEN_RESUMEEN_MASK) | USB_INTEN_SLEEPEN_MASK;\n\n  dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n}\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  // save crystal-less setting (if available)\n  #if defined(FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED) && FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED == 1\n  uint32_t clk_recover_irc_en = CI_REG->CLK_RECOVER_IRC_EN;\n  uint32_t clk_recover_ctrl = CI_REG->CLK_RECOVER_CTRL;\n  #endif\n\n  CI_REG->USBTRC0 |= USB_USBTRC0_USBRESET_MASK;\n  while (CI_REG->USBTRC0 & USB_USBTRC0_USBRESET_MASK);\n\n  // restore crystal-less setting (if available)\n  #if defined(FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED) && FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED == 1\n  CI_REG->CLK_RECOVER_IRC_EN = clk_recover_irc_en;\n  CI_REG->CLK_RECOVER_CTRL  |= clk_recover_ctrl;\n  #endif\n\n  tu_memclr(&_dcd, sizeof(_dcd));\n  CI_REG->USBTRC0 |= TU_BIT(6); /* software must set this bit to 1 */\n  CI_REG->BDT_PAGE1 = (uint8_t)((uintptr_t)_dcd.bdt >> 8);\n  CI_REG->BDT_PAGE2 = (uint8_t)((uintptr_t)_dcd.bdt >> 16);\n  CI_REG->BDT_PAGE3 = (uint8_t)((uintptr_t)_dcd.bdt >> 24);\n\n  CI_REG->INT_EN = USB_INTEN_USBRSTEN_MASK;\n\n  dcd_connect(rhport);\n  // NVIC_ClearPendingIRQ(CIFS_IRQN);\n  return true;\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  _dcd.addr = dev_addr & 0x7F;\n  /* Response with status first before changing device address */\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n\n  CI_REG->CTL |= USB_CTL_RESUME_MASK;\n\n  unsigned cnt = SystemCoreClock / 1000;\n  while (cnt--) __NOP();\n\n  CI_REG->CTL &= ~USB_CTL_RESUME_MASK;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n  CI_REG->USBCTRL  = 0;\n  CI_REG->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;\n  CI_REG->CTL     |= USB_CTL_USBENSOFEN_MASK;\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  CI_REG->CTL      = 0;\n  CI_REG->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\nstatic bool edpt_open(uint8_t rhport, uint8_t ep_addr, uint16_t max_packet_size, tusb_xfer_type_t xfer) {\n  (void)rhport;\n  const unsigned       epn = tu_edpt_number(ep_addr);\n  const unsigned       dir = tu_edpt_dir(ep_addr);\n  endpoint_state_t    *ep  = &_dcd.endpoint[epn][dir];\n  const unsigned       odd = ep->odd;\n  buffer_descriptor_t *bd  = _dcd.bdt[epn][dir];\n\n  /* No support for control transfer */\n  TU_ASSERT(epn && (xfer != TUSB_XFER_CONTROL));\n\n  ep->max_packet_size = max_packet_size;\n\n  unsigned val = USB_ENDPT_EPCTLDIS_MASK;\n  val |= (xfer != TUSB_XFER_ISOCHRONOUS) ? USB_ENDPT_EPHSHK_MASK : 0;\n  val |= dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK;\n  CI_REG->EP[epn].CTL |= val;\n\n  if (xfer != TUSB_XFER_ISOCHRONOUS) {\n    bd[odd].dts      = 1;\n    bd[odd].data     = 0;\n    bd[odd ^ 1].dts  = 1;\n    bd[odd ^ 1].data = 1;\n  }\n\n  return true;\n}\n\nbool dcd_edpt_open(uint8_t rhport, const tusb_desc_endpoint_t *ep_desc) {\n  return edpt_open(rhport, ep_desc->bEndpointAddress, tu_edpt_packet_size(ep_desc), ep_desc->bmAttributes.xfer);\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  return edpt_open(rhport, ep_addr, largest_packet_size, TUSB_XFER_ISOCHRONOUS);\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *ep_desc) {\n  const unsigned    epn = tu_edpt_number(ep_desc->bEndpointAddress);\n  const unsigned    dir = tu_edpt_dir(ep_desc->bEndpointAddress);\n  endpoint_state_t *ep  = &_dcd.endpoint[epn][dir];\n\n  dcd_int_disable(rhport);\n  ep->max_packet_size = tu_edpt_packet_size(ep_desc);\n  dcd_int_enable(rhport);\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  dcd_int_disable(rhport);\n\n  for (unsigned i = 1; i < 16; ++i) {\n    CI_REG->EP[i].CTL = 0;\n  }\n\n  dcd_int_enable(rhport);\n\n  buffer_descriptor_t *bd = _dcd.bdt[1][0];\n  for (unsigned i = 2; i < sizeof(_dcd.bdt)/sizeof(*bd); ++i, ++bd) {\n    bd->head = 0;\n  }\n\n  endpoint_state_t *ep = &_dcd.endpoint[1][0];\n  for (unsigned i = 2; i < sizeof(_dcd.endpoint)/sizeof(*ep); ++i, ++ep) {\n    /* Clear except the odd */\n    ep->max_packet_size = 0;\n    ep->length          = 0;\n    ep->remaining       = 0;\n  }\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  const unsigned epn      = tu_edpt_number(ep_addr);\n  const unsigned dir      = tu_edpt_dir(ep_addr);\n  endpoint_state_t    *ep = &_dcd.endpoint[epn][dir];\n  buffer_descriptor_t *bd = &_dcd.bdt[epn][dir][ep->odd];\n  TU_ASSERT(0 == bd->own);\n\n  dcd_int_disable(rhport);\n\n  ep->length    = total_bytes;\n  ep->remaining = total_bytes;\n\n  const unsigned mps = ep->max_packet_size;\n  if (total_bytes > mps) {\n    buffer_descriptor_t *next = ep->odd ? bd - 1: bd + 1;\n    /* When total_bytes is greater than the max packet size,\n     * it prepares to the next transfer to avoid NAK in advance. */\n    next->bc   = total_bytes >= 2 * mps ? mps: total_bytes - mps;\n    next->addr = buffer + mps;\n    next->own  = 1;\n  }\n  bd->bc   = total_bytes >= mps ? mps: total_bytes;\n  bd->addr = buffer;\n  __DSB();\n  bd->own  = 1; /* This bit must be set last */\n\n  dcd_int_enable(rhport);\n\n  return true;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  const unsigned epn = tu_edpt_number(ep_addr);\n\n  if (0 == epn) {\n    CI_REG->EP[epn].CTL |=  USB_ENDPT_EPSTALL_MASK;\n  } else {\n    const unsigned dir      = tu_edpt_dir(ep_addr);\n    const unsigned odd      = _dcd.endpoint[epn][dir].odd;\n    buffer_descriptor_t *bd = &_dcd.bdt[epn][dir][odd];\n    TU_ASSERT(0 == bd->own,);\n\n    dcd_int_disable(rhport);\n\n    bd->bdt_stall = 1;\n    __DSB();\n    bd->own       = 1; /* This bit must be set last */\n\n    dcd_int_enable(rhport);\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  const unsigned epn      = tu_edpt_number(ep_addr);\n  TU_VERIFY(epn,);\n  const unsigned dir      = tu_edpt_dir(ep_addr);\n  const unsigned odd      = _dcd.endpoint[epn][dir].odd;\n  buffer_descriptor_t *bd = _dcd.bdt[epn][dir];\n  TU_VERIFY(bd[odd].own,);\n\n  dcd_int_disable(rhport);\n\n  bd[odd].own = 0;\n  __DSB();\n\n  // clear stall\n  bd[odd].bdt_stall  = 0;\n\n  // Reset data toggle\n  bd[odd    ].data = 0;\n  bd[odd ^ 1].data = 1;\n\n  // We already cleared this in ISR, but just clear it here to be safe\n  const uint32_t ep_ctl = CI_REG->EP[epn].CTL;\n  if (ep_ctl & USB_ENDPT_EPSTALL_MASK) {\n    CI_REG->EP[epn].CTL = ep_ctl & ~USB_ENDPT_EPSTALL_MASK;\n  }\n\n  dcd_int_enable(rhport);\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\nvoid dcd_int_handler(uint8_t rhport)\n{\n  uint32_t is  = CI_REG->INT_STAT;\n  uint32_t msk = CI_REG->INT_EN;\n\n  // clear non-enabled interrupts\n  CI_REG->INT_STAT = is & ~msk;\n  is &= msk;\n\n  if (is & USB_ISTAT_ERROR_MASK) {\n    /* TODO: */\n    uint32_t es = CI_REG->ERR_STAT;\n    CI_REG->ERR_STAT = es;\n    CI_REG->INT_STAT = is; /* discard any pending events */\n  }\n\n  if (is & USB_ISTAT_USBRST_MASK) {\n    CI_REG->INT_STAT = is; /* discard any pending events */\n    process_bus_reset(rhport);\n  }\n\n  if (is & USB_ISTAT_SLEEP_MASK) {\n    // TU_LOG2(\"Suspend: \"); TU_LOG2_HEX(is);\n\n    // Note Host usually has extra delay after bus reset (without SOF), which could falsely\n    // detected as Sleep event. Though usbd has debouncing logic so we are good\n    CI_REG->INT_STAT = USB_ISTAT_SLEEP_MASK;\n    process_bus_sleep(rhport);\n  }\n\n#if 0 // ISTAT_RESUME never trigger, probably for host mode ?\n  if (is & USB_ISTAT_RESUME_MASK) {\n    // TU_LOG2(\"ISTAT Resume: \"); TU_LOG2_HEX(is);\n    KHCI->ISTAT = USB_ISTAT_RESUME_MASK;\n    process_bus_resume(rhport);\n  }\n#endif\n\n  if (CI_REG->USBTRC0 & USB_USBTRC0_USB_RESUME_INT_MASK) {\n     // TU_LOG2(\"USBTRC0 Resume: \"); TU_LOG2_HEX(is); TU_LOG2_HEX(KHCI->USBTRC0);\n    process_bus_resume(rhport);\n  }\n\n  if (is & USB_ISTAT_SOFTOK_MASK) {\n    CI_REG->INT_STAT = USB_ISTAT_SOFTOK_MASK;\n    dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);\n  }\n\n  if (is & USB_ISTAT_STALL_MASK) {\n    CI_REG->INT_STAT = USB_ISTAT_STALL_MASK;\n    process_stall(rhport);\n  }\n\n  if (is & USB_ISTAT_TOKDNE_MASK) {\n    process_tokdne(rhport);\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_hs/ci_hs_hpm.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _CI_HS_HPM_H_\n#define _CI_HS_HPM_H_\n\n#include \"ci_hs_type.h\"\n#include \"hpm_soc.h\"\n#include \"hpm_interrupt.h\"\n#include \"hpm_usb_drv.h\"\n\nstatic const ci_hs_controller_t _ci_controller[] =\n{\n    { .reg_base = HPM_USB0_BASE, .irqnum = IRQn_USB0},\n    #ifdef HPM_USB1_BASE\n    { .reg_base = HPM_USB1_BASE, .irqnum = IRQn_USB1},\n    #endif\n};\n\n#define CI_HS_REG(_port)        ((ci_hs_regs_t*) _ci_controller[_port].reg_base)\n\n//------------- DCD -------------//\n#define CI_DCD_INT_ENABLE(_p)   intc_m_enable_irq (_ci_controller[_p].irqnum)\n#define CI_DCD_INT_DISABLE(_p)  intc_m_disable_irq(_ci_controller[_p].irqnum)\n\n//------------- HCD -------------//\n#define CI_HCD_INT_ENABLE(_p)   intc_m_enable_irq (_ci_controller[_p].irqnum)\n#define CI_HCD_INT_DISABLE(_p)  intc_m_disable_irq(_ci_controller[_p].irqnum)\n\n\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_hs/ci_hs_imxrt.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _CI_HS_IMXRT_H_\n#define _CI_HS_IMXRT_H_\n\n#include \"fsl_device_registers.h\"\n\n#if !defined(USB1_BASE) && defined(USB_OTG1_BASE)\n#define USB1_BASE USB_OTG1_BASE\n#endif\n\n#if !defined(USB2_BASE) && defined(USB_OTG2_BASE)\n#define USB2_BASE USB_OTG2_BASE\n#endif\n\n// RT1040 calls its only USB USB_OTG (no 1)\n#if defined(MIMXRT1042_SERIES)\n#define USB_OTG1_IRQn USB_OTG_IRQn\n#endif\n\nstatic const ci_hs_controller_t _ci_controller[] =\n{\n  // RT1010 and RT1020 only has 1 USB controller\n  #if FSL_FEATURE_SOC_USBHS_COUNT == 1\n    { .reg_base = USB_BASE , .irqnum = USB_OTG1_IRQn }\n  #else\n    { .reg_base = USB1_BASE, .irqnum = USB_OTG1_IRQn},\n    { .reg_base = USB2_BASE, .irqnum = USB_OTG2_IRQn}\n  #endif\n};\n\n#define CI_HS_REG(_port)        ((ci_hs_regs_t*) _ci_controller[_port].reg_base)\n\n//------------- DCD -------------//\n#define CI_DCD_INT_ENABLE(_p)   NVIC_EnableIRQ ((IRQn_Type)_ci_controller[_p].irqnum)\n#define CI_DCD_INT_DISABLE(_p)  NVIC_DisableIRQ((IRQn_Type)_ci_controller[_p].irqnum)\n\n//------------- HCD -------------//\n#define CI_HCD_INT_ENABLE(_p)   NVIC_EnableIRQ ((IRQn_Type)_ci_controller[_p].irqnum)\n#define CI_HCD_INT_DISABLE(_p)  NVIC_DisableIRQ((IRQn_Type)_ci_controller[_p].irqnum)\n\n//------------- DCache -------------//\n#if CFG_TUD_MEM_DCACHE_ENABLE || CFG_TUH_MEM_DCACHE_ENABLE\n#if __CORTEX_M == 7\nTU_ATTR_ALWAYS_INLINE static inline uint32_t round_up_to_cache_line_size(uint32_t size) {\n  if (size & (CFG_TUD_MEM_DCACHE_LINE_SIZE-1)) {\n    size = (size & ~(CFG_TUD_MEM_DCACHE_LINE_SIZE-1)) + CFG_TUD_MEM_DCACHE_LINE_SIZE;\n  }\n  return size;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool imxrt_is_cache_mem(uintptr_t addr) {\n  return !(0x20000000 <= addr && addr < 0x20100000);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool imxrt_dcache_clean(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (imxrt_is_cache_mem(addr32)) {\n    TU_ASSERT(tu_is_aligned32(addr32));\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_CleanDCache_by_Addr((uint32_t *) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool imxrt_dcache_invalidate(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (imxrt_is_cache_mem(addr32)) {\n    // Invalidating does not push cached changes back to RAM so we need to be\n    // *very* careful when we do it. If we're not aligned, then we risk resetting\n    // values back to their RAM state.\n    TU_ASSERT(tu_is_aligned32(addr32));\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_InvalidateDCache_by_Addr((void*) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool imxrt_dcache_clean_invalidate(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (imxrt_is_cache_mem(addr32)) {\n    TU_ASSERT(tu_is_aligned32(addr32));\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_CleanInvalidateDCache_by_Addr((uint32_t *) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n\n#elif __CORTEX_M == 4\n#error \"Secondary M4 core's cache controller is not supported yet.\"\n#endif\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_hs/ci_hs_lpc18_43.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _CI_HS_LPC18_43_H_\n#define _CI_HS_LPC18_43_H_\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n\n// LPCOpen for 18xx & 43xx\n#include \"chip.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\nstatic const ci_hs_controller_t _ci_controller[] =\n{\n  { .reg_base = LPC_USB0_BASE, .irqnum = USB0_IRQn },\n  { .reg_base = LPC_USB1_BASE, .irqnum = USB1_IRQn }\n};\n\n#define CI_HS_REG(_port)        ((ci_hs_regs_t*) _ci_controller[_port].reg_base)\n\n#define CI_DCD_INT_ENABLE(_p)   NVIC_EnableIRQ ((IRQn_Type)_ci_controller[_p].irqnum)\n#define CI_DCD_INT_DISABLE(_p)  NVIC_DisableIRQ((IRQn_Type)_ci_controller[_p].irqnum)\n\n#define CI_HCD_INT_ENABLE(_p)   NVIC_EnableIRQ ((IRQn_Type)_ci_controller[_p].irqnum)\n#define CI_HCD_INT_DISABLE(_p)  NVIC_DisableIRQ((IRQn_Type)_ci_controller[_p].irqnum)\n\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_hs/ci_hs_mcx.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _CI_HS_MCX_H_\n#define _CI_HS_MCX_H_\n\n#include \"fsl_device_registers.h\"\n\n// NOTE: MCX N9 has 2 different USB Controller\n// - USB0 is KHCI FullSpeed\n// - USB1 is ChipIdea HighSpeed, therefore rhport = 1 is actually index 0\n\nstatic const ci_hs_controller_t _ci_controller[] = {\n    {.reg_base = USBHS1__USBC_BASE, .irqnum = USB1_HS_IRQn}\n};\n\nTU_ATTR_ALWAYS_INLINE static inline ci_hs_regs_t* CI_HS_REG(uint8_t port) {\n  (void) port;\n  return ((ci_hs_regs_t*) _ci_controller[0].reg_base);\n}\n\n#define CI_DCD_INT_ENABLE(_p)   do { (void) _p; NVIC_EnableIRQ (_ci_controller[0].irqnum); } while (0)\n#define CI_DCD_INT_DISABLE(_p)  do { (void) _p; NVIC_DisableIRQ(_ci_controller[0].irqnum); } while (0)\n\n#define CI_HCD_INT_ENABLE(_p)   NVIC_EnableIRQ (_ci_controller[_p].irqnum)\n#define CI_HCD_INT_DISABLE(_p)  NVIC_DisableIRQ(_ci_controller[_p].irqnum)\n\n\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_hs/ci_hs_rw61x.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _CI_HS_RW61X_H_\n#define _CI_HS_RW61X_H_\n\n#include \"fsl_device_registers.h\"\n\nstatic const ci_hs_controller_t _ci_controller[] = {\n    {.reg_base = USBOTG_BASE, .irqnum = USB_IRQn}\n};\n\nTU_ATTR_ALWAYS_INLINE static inline ci_hs_regs_t* CI_HS_REG(uint8_t port) {\n  (void) port;\n  return ((ci_hs_regs_t*) _ci_controller[0].reg_base);\n}\n\n#define CI_DCD_INT_ENABLE(_p)   do { (void) _p; NVIC_EnableIRQ (_ci_controller[0].irqnum); } while (0)\n#define CI_DCD_INT_DISABLE(_p)  do { (void) _p; NVIC_DisableIRQ(_ci_controller[0].irqnum); } while (0)\n\n#define CI_HCD_INT_ENABLE(_p)   NVIC_EnableIRQ (_ci_controller[_p].irqnum)\n#define CI_HCD_INT_DISABLE(_p)  NVIC_DisableIRQ(_ci_controller[_p].irqnum)\n\n\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_hs/ci_hs_type.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef CI_HS_TYPE_H_\n#define CI_HS_TYPE_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// DCCPARAMS\nenum {\n  DCCPARAMS_DEN_MASK = 0x1Fu, ///< DEN bit 4:0\n};\n\n// USBCMD\nenum {\n  USBCMD_RUN_STOP         = TU_BIT(0),\n  USBCMD_RESET            = TU_BIT(1),\n  USBCMD_SETUP_TRIPWIRE   = TU_BIT(13),\n  USBCMD_ADD_QTD_TRIPWIRE = TU_BIT(14), // This bit is used as a semaphore to ensure the to proper addition of a\n                                        // new dTD to an active (primed) endpoint’s linked list. This bit is set and\n                                        // cleared by software during the process of adding a new dTD\n\n  USBCMD_INTR_THRESHOLD_MASK = 0x00FF0000u, // Interrupt Threshold bit 23:16\n};\n\n// PORTSC1\n#define PORTSC1_PORT_SPEED_POS    26\n\nenum {\n  PORTSC1_CURRENT_CONNECT_STATUS = TU_BIT(0),\n  PORTSC1_FORCE_PORT_RESUME      = TU_BIT(6),\n  PORTSC1_SUSPEND                = TU_BIT(7),\n  PORTSC1_FORCE_FULL_SPEED       = TU_BIT(24),\n  PORTSC1_PORT_SPEED             = TU_BIT(26) | TU_BIT(27)\n};\n\n// OTGSC\nenum {\n  OTGSC_VBUS_DISCHARGE          = TU_BIT(0),\n  OTGSC_VBUS_CHARGE             = TU_BIT(1),\n//  OTGSC_HWASSIST_AUTORESET    = TU_BIT(2),\n  OTGSC_OTG_TERMINATION         = TU_BIT(3), ///< Must set to 1 when OTG go to device mode\n  OTGSC_DATA_PULSING            = TU_BIT(4),\n  OTGSC_ID_PULLUP               = TU_BIT(5),\n//  OTGSC_HWASSIT_DATA_PULSE    = TU_BIT(6),\n//  OTGSC_HWASSIT_BDIS_ACONN    = TU_BIT(7),\n  OTGSC_ID                      = TU_BIT(8), ///< 0 = A device, 1 = B Device\n  OTGSC_A_VBUS_VALID            = TU_BIT(9),\n  OTGSC_A_SESSION_VALID         = TU_BIT(10),\n  OTGSC_B_SESSION_VALID         = TU_BIT(11),\n  OTGSC_B_SESSION_END           = TU_BIT(12),\n  OTGSC_1MS_TOGGLE              = TU_BIT(13),\n  OTGSC_DATA_BUS_PULSING_STATUS = TU_BIT(14),\n};\n\n// USBMode\nenum {\n  USBMOD_CM_MASK    = TU_BIT(0) | TU_BIT(1),\n  USBMODE_CM_DEVICE = 2,\n  USBMODE_CM_HOST   = 3,\n\n  USBMODE_SLOM = TU_BIT(3),\n  USBMODE_SDIS = TU_BIT(4),\n\n  USBMODE_VBUS_POWER_SELECT = TU_BIT(5), // Need to be enabled for LPC18XX/43XX in host mode\n};\n\n// Device Registers\ntypedef struct\n{\n  //------------- ID + HW Parameter Registers-------------//\n  volatile uint32_t TU_RESERVED[64]; ///< For iMX RT10xx, but not used by LPC18XX/LPC43XX\n\n  //------------- Capability Registers-------------//\n  volatile uint8_t  CAPLENGTH;       ///< Capability Registers Length\n  volatile uint8_t  TU_RESERVED[1];\n  volatile uint16_t HCIVERSION;      ///< Host Controller Interface Version\n\n  volatile uint32_t HCSPARAMS;       ///< Host Controller Structural Parameters\n  volatile uint32_t HCCPARAMS;       ///< Host Controller Capability Parameters\n  volatile uint32_t TU_RESERVED[5];\n\n  volatile uint16_t DCIVERSION;      ///< Device Controller Interface Version\n  volatile uint8_t  TU_RESERVED[2];\n\n  volatile uint32_t DCCPARAMS;       ///< Device Controller Capability Parameters\n  volatile uint32_t TU_RESERVED[6];\n\n  //------------- Operational Registers -------------//\n  volatile uint32_t USBCMD;          ///< USB Command Register\n  volatile uint32_t USBSTS;          ///< USB Status Register\n  volatile uint32_t USBINTR;         ///< Interrupt Enable Register\n  volatile uint32_t FRINDEX;         ///< USB Frame Index\n  volatile uint32_t TU_RESERVED;\n  volatile uint32_t DEVICEADDR;      ///< Device Address\n  volatile uint32_t ENDPTLISTADDR;   ///< Endpoint List Address\n  volatile uint32_t TU_RESERVED;\n  volatile uint32_t BURSTSIZE;       ///< Programmable Burst Size\n  volatile uint32_t TXFILLTUNING;    ///< TX FIFO Fill Tuning\n           uint32_t TU_RESERVED[4];\n  volatile uint32_t ENDPTNAK;        ///< Endpoint NAK\n  volatile uint32_t ENDPTNAKEN;      ///< Endpoint NAK Enable\n  volatile uint32_t TU_RESERVED;\n  volatile uint32_t PORTSC1;         ///< Port Status & Control\n  volatile uint32_t TU_RESERVED[7];\n  volatile uint32_t OTGSC;           ///< On-The-Go Status & control\n  volatile uint32_t USBMODE;         ///< USB Device Mode\n  volatile uint32_t ENDPTSETUPSTAT;  ///< Endpoint Setup Status\n  volatile uint32_t ENDPTPRIME;      ///< Endpoint Prime\n  volatile uint32_t ENDPTFLUSH;      ///< Endpoint Flush\n  volatile uint32_t ENDPTSTAT;       ///< Endpoint Status\n  volatile uint32_t ENDPTCOMPLETE;   ///< Endpoint Complete\n  volatile uint32_t ENDPTCTRL[8];    ///< Endpoint Control 0 - 7\n} ci_hs_regs_t;\n\n\ntypedef struct\n{\n  uint32_t reg_base;\n  uint32_t irqnum;\n}ci_hs_controller_t;\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* CI_HS_TYPE_H_ */\n"
  },
  {
    "path": "src/portable/chipidea/ci_hs/dcd_ci_hs.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_CHIPIDEA_HS)\n\n#include \"device/dcd.h\"\n#include \"ci_hs_type.h\"\n\n#if CFG_TUSB_MCU == OPT_MCU_MIMXRT1XXX\n  #include \"ci_hs_imxrt.h\"\n\n  #if CFG_TUD_MEM_DCACHE_ENABLE\n  bool dcd_dcache_clean(const void *addr, uint32_t data_size) {\n    return imxrt_dcache_clean(addr, data_size);\n  }\n\n  bool dcd_dcache_invalidate(const void *addr, uint32_t data_size) {\n    return imxrt_dcache_invalidate(addr, data_size);\n  }\n\n  bool dcd_dcache_clean_invalidate(const void *addr, uint32_t data_size) {\n    return imxrt_dcache_clean_invalidate(addr, data_size);\n  }\n  #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_LPC18XX, OPT_MCU_LPC43XX)\n  #include \"ci_hs_lpc18_43.h\"\n\n#elif TU_CHECK_MCU(OPT_MCU_MCXN9)\n  // MCX N9 only port 1 use this controller\n  #include \"ci_hs_mcx.h\"\n\n#elif TU_CHECK_MCU(OPT_MCU_HPM)\n  #include \"ci_hs_hpm.h\"\n\n#elif TU_CHECK_MCU(OPT_MCU_RW61X)\n  #include \"ci_hs_rw61x.h\"\n\n#else\n  #error \"Unsupported MCUs\"\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n// ENDPTCTRL\nenum {\n  ENDPTCTRL_TYPE_POS = 2, // Endpoint type is 2-bit field\n};\n\nenum {\n  ENDPTCTRL_STALL          = TU_BIT(0),\n  ENDPTCTRL_TOGGLE_INHIBIT = TU_BIT(5), // used for test only\n  ENDPTCTRL_TOGGLE_RESET   = TU_BIT(6),\n  ENDPTCTRL_ENABLE         = TU_BIT(7),\n};\n\n#define ENDPTCTRL_TYPE(_type) ((_type) << ENDPTCTRL_TYPE_POS)\n#define ENDPTCTRL_RESET_MASK  (ENDPTCTRL_TYPE(TUSB_XFER_BULK) | (ENDPTCTRL_TYPE(TUSB_XFER_BULK) << 16u))\n\n// USBSTS, USBINTR\nenum {\n  INTR_USB         = TU_BIT(0),\n  INTR_ERROR       = TU_BIT(1),\n  INTR_PORT_CHANGE = TU_BIT(2),\n  INTR_RESET       = TU_BIT(6),\n  INTR_SOF         = TU_BIT(7),\n  INTR_SUSPEND     = TU_BIT(8),\n  INTR_NAK         = TU_BIT(16)\n};\n\n// Queue Transfer Descriptor\ntypedef struct {\n  // Word 0: Next QTD Pointer\n  uint32_t next; ///< Next link pointer This field contains the physical memory address of the next dTD to be processed\n\n  // Word 1: qTQ Token\n  uint32_t                     : 3;\n  volatile uint32_t xact_err   : 1;\n  uint32_t                     : 1;\n  volatile uint32_t buffer_err : 1;\n  volatile uint32_t halted     : 1;\n  volatile uint32_t active     : 1;\n  uint32_t                     : 2;\n  uint32_t iso_mult_override   : 2; ///< This field can be used for transmit ISOs to override the MULT field in the dQH.\n                                    ///< This field must be zero for all packet types that are not transmit-ISO.\n  uint32_t                          : 3;\n  uint32_t          int_on_complete : 1;\n  volatile uint32_t total_bytes     : 15;\n  uint32_t                          : 1;\n\n  // Word 2-6: Buffer Page Pointer List, Each element in the list is a 4K page aligned, physical memory address. The\n  // lower 12 bits in each pointer are reserved (except for the first one) as each memory pointer must reference the\n  // start of a 4K page\n  uint32_t buffer[5]; ///< buffer1 has frame_n for TODO Isochronous\n\n  //--------------------------------------------------------------------+\n  // TD is 32 bytes aligned but occupies only 28 bytes\n  // Therefore there are 4 bytes padding that we can use.\n  //--------------------------------------------------------------------+\n  uint16_t expected_bytes;\n  uint8_t  reserved[2];\n} dcd_qtd_t;\n\nTU_VERIFY_STATIC(sizeof(dcd_qtd_t) == 32, \"size is not correct\");\n\n// Queue Head\ntypedef struct {\n  // Word 0: Capabilities and Characteristics\n  uint32_t : 15; ///< Number of packets executed per transaction descriptor 00 - Execute N transactions as demonstrated\n                 ///< by the USB variable length protocol where N is computed using Max_packet_length and the\n                 ///< Total_bytes field in the dTD. 01 - Execute one transaction 10 - Execute two transactions 11 -\n                 ///< Execute three transactions Remark: Non-isochronous endpoints must set MULT = 00. Remark:\n                 ///< Isochronous endpoints must set MULT = 01, 10, or 11 as needed.\n  uint32_t int_on_setup            : 1;  ///< Interrupt on setup This bit is used on control type endpoints to indicate if USBINT is\n                                         ///< set in response to a setup being received.\n  uint32_t max_packet_size         : 11; ///< Endpoint's wMaxPacketSize\n  uint32_t                         : 2;\n  uint32_t zero_length_termination : 1;  ///< This bit is used for non-isochronous endpoints to indicate when a zero-length packet is received to\n                                         ///< terminate transfers in case the total transfer length is “multiple”. 0 - Enable zero-length packet to\n                                         ///< terminate transfers equal to a multiple of Max_packet_length (default). 1 - Disable zero-length packet on\n                                         ///< transfers that are equal in length to a multiple Max_packet_length.\n  uint32_t iso_mult                : 2;  ///<\n\n  // Word 1: Current qTD Pointer\n  volatile uint32_t qtd_addr;\n\n  // Word 2-9: Transfer Overlay\n  volatile dcd_qtd_t qtd_overlay;\n\n  // Word 10-11: Setup request (control OUT only)\n  volatile tusb_control_request_t setup_request;\n\n  //--------------------------------------------------------------------+\n  // QHD is 64 bytes aligned but occupies only 48 bytes\n  // Therefore there are 16 bytes padding that we can use.\n  //--------------------------------------------------------------------+\n  tu_fifo_t *ff;\n  uint8_t    reserved[12];\n} dcd_qhd_t;\n\nTU_VERIFY_STATIC(sizeof(dcd_qhd_t) == 64, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// Variables\n//--------------------------------------------------------------------+\n\n#define QTD_NEXT_INVALID 0x01\n\ntypedef struct {\n  // Must be at 2K alignment\n  // Each endpoint with direction (IN/OUT) occupies a queue head\n  // for portability, TinyUSB only queue 1 TD for each Qhd\n  dcd_qhd_t qhd[TUP_DCD_ENDPOINT_MAX][2] TU_ATTR_ALIGNED(64);\n  dcd_qtd_t qtd[TUP_DCD_ENDPOINT_MAX][2] TU_ATTR_ALIGNED(32);\n} dcd_data_t;\n\nCFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(2048) static dcd_data_t _dcd_data;\n\n//--------------------------------------------------------------------+\n// Prototypes and Helper Functions\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t ci_ep_count(const ci_hs_regs_t *dcd_reg) {\n  return dcd_reg->DCCPARAMS & DCCPARAMS_DEN_MASK;\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n/// follows LPC43xx User Manual 23.10.3\nstatic void bus_reset(uint8_t rhport) {\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n\n  // The reset value for all endpoint types is the control endpoint. If one endpoint\n  // direction is enabled and the paired endpoint of opposite direction is disabled, then the\n  // endpoint type of the unused direction must be changed from the control type to any other\n  // type (e.g. bulk). Leaving an un-configured endpoint control will cause undefined behavior\n  // for the data PID tracking on the active endpoint.\n  const uint8_t ep_count = ci_ep_count(dcd_reg);\n  for (uint8_t i = 1; i < ep_count; i++) {\n    dcd_reg->ENDPTCTRL[i] = ENDPTCTRL_RESET_MASK;\n  }\n\n  //------------- Clear All Registers -------------//\n  dcd_reg->ENDPTNAK       = dcd_reg->ENDPTNAK;\n  dcd_reg->ENDPTNAKEN     = 0;\n  dcd_reg->USBSTS         = dcd_reg->USBSTS;\n  dcd_reg->ENDPTSETUPSTAT = dcd_reg->ENDPTSETUPSTAT;\n  dcd_reg->ENDPTCOMPLETE  = dcd_reg->ENDPTCOMPLETE;\n\n  while (dcd_reg->ENDPTPRIME) {}\n  dcd_reg->ENDPTFLUSH = 0xFFFFFFFF;\n  while (dcd_reg->ENDPTFLUSH) {}\n\n  // read reset bit in portsc\n\n  //------------- Queue Head & Queue TD -------------//\n  tu_memclr(&_dcd_data, sizeof(dcd_data_t));\n\n  //------------- Set up Control Endpoints (0 OUT, 1 IN) -------------//\n  _dcd_data.qhd[0][0].zero_length_termination = _dcd_data.qhd[0][1].zero_length_termination = 1;\n  _dcd_data.qhd[0][0].max_packet_size = _dcd_data.qhd[0][1].max_packet_size = CFG_TUD_ENDPOINT0_SIZE;\n  _dcd_data.qhd[0][0].qtd_overlay.next = _dcd_data.qhd[0][1].qtd_overlay.next = QTD_NEXT_INVALID;\n\n  _dcd_data.qhd[0][0].int_on_setup = 1; // OUT only\n\n  dcd_dcache_clean_invalidate(&_dcd_data, sizeof(dcd_data_t));\n}\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init) {\n  (void)rh_init;\n  tu_memclr(&_dcd_data, sizeof(dcd_data_t));\n\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n\n  TU_ASSERT(ci_ep_count(dcd_reg) <= TUP_DCD_ENDPOINT_MAX);\n\n  #if TU_CHECK_MCU(OPT_MCU_HPM)\n  usb_phy_init((USB_Type *)dcd_reg, false);\n  #endif\n\n  // Reset controller\n  dcd_reg->USBCMD |= USBCMD_RESET;\n  while (dcd_reg->USBCMD & USBCMD_RESET) {}\n\n  // Set mode to device, must be set immediately after reset\n  uint32_t usbmode = dcd_reg->USBMODE & ~USBMOD_CM_MASK;\n  usbmode |= USBMODE_CM_DEVICE;\n  dcd_reg->USBMODE = usbmode;\n\n  #ifdef CFG_TUD_CI_HS_VBUS_CHARGE\n  dcd_reg->OTGSC = OTGSC_VBUS_CHARGE | OTGSC_OTG_TERMINATION;\n  #else\n  dcd_reg->OTGSC = OTGSC_VBUS_DISCHARGE | OTGSC_OTG_TERMINATION;\n  #endif\n\n  #if !TUD_OPT_HIGH_SPEED\n  dcd_reg->PORTSC1 |= PORTSC1_FORCE_FULL_SPEED;\n  #endif\n\n  #if TU_CHECK_MCU(OPT_MCU_HPM)\n  dcd_reg->PORTSC1 &= ~USB_PORTSC1_STS_MASK;\n  #endif\n\n  dcd_dcache_clean_invalidate(&_dcd_data, sizeof(dcd_data_t));\n\n  dcd_reg->ENDPTLISTADDR = (uint32_t)_dcd_data.qhd; // Endpoint List Address has to be 2K alignment\n  dcd_reg->USBSTS        = dcd_reg->USBSTS;\n  dcd_reg->USBINTR       = INTR_USB | INTR_ERROR | INTR_PORT_CHANGE | INTR_SUSPEND;\n\n  uint32_t usbcmd = dcd_reg->USBCMD;\n  usbcmd &= ~USBCMD_INTR_THRESHOLD_MASK; // Interrupt Threshold Interval = 0\n  usbcmd |= USBCMD_RUN_STOP;             // run\n\n  dcd_reg->USBCMD = usbcmd;\n\n  return true;\n}\n\nbool dcd_deinit(uint8_t rhport) {\n  ci_hs_regs_t* dcd_reg = CI_HS_REG(rhport);\n\n  // disable all interrupt\n  dcd_reg->USBINTR = 0;\n\n  // unattach from bus\n  dcd_reg->USBCMD &= ~USBCMD_RUN_STOP;\n\n  // flush all endpoints\n  while (dcd_reg->ENDPTPRIME) {}\n  dcd_reg->ENDPTFLUSH = 0xFFFFFFFF;\n  while (dcd_reg->ENDPTFLUSH) {}\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  CI_DCD_INT_ENABLE(rhport);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  CI_DCD_INT_DISABLE(rhport);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  // Response with status first before changing device address\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  dcd_reg->DEVICEADDR   = (dev_addr << 25) | TU_BIT(24);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  dcd_reg->PORTSC1 |= PORTSC1_FORCE_PORT_RESUME;\n}\n\nvoid dcd_connect(uint8_t rhport) {\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  dcd_reg->USBCMD |= USBCMD_RUN_STOP;\n}\n\nvoid dcd_disconnect(uint8_t rhport) {\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  dcd_reg->USBCMD &= ~USBCMD_RUN_STOP;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  if (en) {\n    dcd_reg->USBINTR |= INTR_SOF;\n  } else {\n    dcd_reg->USBINTR &= ~INTR_SOF;\n  }\n}\n\n//--------------------------------------------------------------------+\n// HELPER\n//--------------------------------------------------------------------+\n\nstatic void qtd_init(dcd_qtd_t *p_qtd, void *data_ptr, uint16_t total_bytes) {\n  dcd_dcache_clean_invalidate((uint32_t *)tu_align((uint32_t)data_ptr, 4), total_bytes);\n\n  tu_memclr(p_qtd, sizeof(dcd_qtd_t));\n\n  p_qtd->next        = QTD_NEXT_INVALID;\n  p_qtd->active      = 1;\n  p_qtd->total_bytes = p_qtd->expected_bytes = total_bytes;\n  p_qtd->int_on_complete                     = true;\n\n  if (data_ptr != NULL) {\n    p_qtd->buffer[0] = (uint32_t)data_ptr;\n\n    const uint32_t bufend = p_qtd->buffer[0] + total_bytes;\n    for (uint8_t i = 1; i < 5; i++) {\n      const uint32_t next_page = tu_align4k(p_qtd->buffer[i - 1]) + 4096;\n      if (bufend <= next_page) {\n        break;\n      }\n\n      p_qtd->buffer[i] = next_page;\n\n      // TODO page[1] FRAME_N for ISO transfer\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// DCD Endpoint Port\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline void ep_ctrl_write(volatile uint32_t *epctrl, uint8_t dir, uint32_t value) {\n  if (dir == TUSB_DIR_OUT) {\n    *epctrl = (*epctrl & 0xFFFF0000u) | value;\n  } else {\n    *epctrl = (*epctrl & 0x0000FFFFu) | (value << 16);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ep_ctrl_mask(volatile uint32_t *epctrl, uint8_t dir, uint32_t and_mask,\n                                                      uint32_t or_mask) {\n  uint32_t value = *epctrl;\n  if (and_mask != 0) {\n    value &= (dir == TUSB_DIR_OUT) ? (and_mask | 0xFFFF0000u) : ((and_mask << 16u) | 0x0000FFFFu);\n  }\n  if (or_mask != 0) {\n    value |= (dir == TUSB_DIR_OUT) ? or_mask : (or_mask << 16u);\n  }\n\n  *epctrl = value;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ep_ctrl_set(volatile uint32_t *epctrl, uint8_t dir, uint32_t mask) {\n  ep_ctrl_mask(epctrl, dir, 0, mask);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ep_ctrl_clear(volatile uint32_t *epctrl, uint8_t dir, uint32_t mask) {\n  ep_ctrl_mask(epctrl, dir, ~mask, 0);\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir   = tu_edpt_dir(ep_addr);\n\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  dcd_reg->ENDPTCTRL[epnum] |= ENDPTCTRL_STALL << (dir ? 16 : 0);\n\n  // flush to abort any primed buffer\n  dcd_reg->ENDPTFLUSH = TU_BIT(epnum + (dir ? 16 : 0));\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir   = tu_edpt_dir(ep_addr);\n\n  // data toggle also need to be reset\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  dcd_reg->ENDPTCTRL[epnum] |= ENDPTCTRL_TOGGLE_RESET << (dir ? 16 : 0);\n  dcd_reg->ENDPTCTRL[epnum] &= ~(ENDPTCTRL_STALL << (dir ? 16 : 0));\n}\n\nstatic void qhd_init(dcd_qhd_t *p_qhd, uint16_t max_packet_size, uint8_t iso_mult) {\n  tu_memclr(p_qhd, sizeof(dcd_qhd_t));\n  p_qhd->zero_length_termination = 1;\n  p_qhd->max_packet_size         = max_packet_size;\n  p_qhd->iso_mult                = iso_mult;\n  p_qhd->qtd_overlay.next        = QTD_NEXT_INVALID;\n  dcd_dcache_clean_invalidate(&_dcd_data, sizeof(dcd_data_t));\n}\n\nbool dcd_edpt_open(uint8_t rhport, const tusb_desc_endpoint_t *endpoint_desc) {\n  ci_hs_regs_t *dcd_reg   = CI_HS_REG(rhport);\n  const uint8_t epnum     = tu_edpt_number(endpoint_desc->bEndpointAddress);\n  const uint8_t dir       = tu_edpt_dir(endpoint_desc->bEndpointAddress);\n  const uint8_t xfer_type = endpoint_desc->bmAttributes.xfer;\n  TU_ASSERT(epnum < ci_ep_count(dcd_reg));\n\n  dcd_qhd_t *p_qhd = &_dcd_data.qhd[epnum][dir];\n  qhd_init(p_qhd, tu_edpt_packet_size(endpoint_desc), 0u);\n\n  // EP Control\n  const uint32_t epctrl = ENDPTCTRL_TYPE(xfer_type) | ENDPTCTRL_ENABLE | ENDPTCTRL_TOGGLE_RESET;\n  ep_ctrl_write(&dcd_reg->ENDPTCTRL[epnum], dir, epctrl);\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  const uint8_t epnum   = tu_edpt_number(ep_addr);\n  const uint8_t dir     = tu_edpt_dir(ep_addr);\n  TU_ASSERT(epnum < ci_ep_count(dcd_reg));\n\n  // EP Control: set type but not enabled yet\n  const uint32_t epctrl = ENDPTCTRL_TYPE(TUSB_XFER_ISOCHRONOUS) | ENDPTCTRL_TOGGLE_RESET;\n  ep_ctrl_write(&dcd_reg->ENDPTCTRL[epnum], dir, epctrl);\n\n  return true;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  const uint8_t epnum   = tu_edpt_number(desc_ep->bEndpointAddress);\n  const uint8_t dir     = tu_edpt_dir(desc_ep->bEndpointAddress);\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  TU_ASSERT(epnum < ci_ep_count(dcd_reg));\n\n  dcd_qhd_t         *p_qhd     = &_dcd_data.qhd[epnum][dir];\n  volatile uint32_t *endptctrl = &dcd_reg->ENDPTCTRL[epnum];\n\n  // _dcd_data.qhd[epnum][dir].qtd_overlay.halted = 1;\n  // dcd_dcache_clean_invalidate(&_dcd_data, sizeof(dcd_data_t));\n\n  // Flush EP\n  const uint32_t flush_mask = TU_BIT(epnum + (dir ? 16 : 0));\n  dcd_reg->ENDPTFLUSH       = flush_mask;\n  while (dcd_reg->ENDPTFLUSH & flush_mask) {}\n\n  // disable to change max packet size\n  ep_ctrl_clear(endptctrl, dir, ENDPTCTRL_ENABLE);\n\n  qhd_init(p_qhd, tu_edpt_packet_size(desc_ep), 1u);\n\n  ep_ctrl_set(endptctrl, dir, ENDPTCTRL_ENABLE);\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n\n  // Disable all non-control endpoints\n  const uint8_t ep_count = ci_ep_count(dcd_reg);\n  for (uint8_t epnum = 1; epnum < ep_count; epnum++) {\n    _dcd_data.qhd[epnum][TUSB_DIR_OUT].qtd_overlay.halted = 1;\n    _dcd_data.qhd[epnum][TUSB_DIR_IN].qtd_overlay.halted  = 1;\n\n    dcd_reg->ENDPTFLUSH       = TU_BIT(epnum) | TU_BIT(epnum + 16);\n    dcd_reg->ENDPTCTRL[epnum] = ENDPTCTRL_RESET_MASK;\n  }\n}\n\nstatic void qhd_start_xfer(uint8_t rhport, uint8_t epnum, uint8_t dir) {\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n  dcd_qhd_t    *p_qhd   = &_dcd_data.qhd[epnum][dir];\n  dcd_qtd_t    *p_qtd   = &_dcd_data.qtd[epnum][dir];\n\n  p_qhd->qtd_overlay.halted = false;           // clear any previous error\n  p_qhd->qtd_overlay.next   = (uint32_t)p_qtd; // link qtd to qhd\n\n  // flush cache\n  dcd_dcache_clean_invalidate(&_dcd_data, sizeof(dcd_data_t));\n\n  if (epnum == 0) {\n    // follows UM 24.10.8.1.1 Setup packet handling using setup lockout mechanism\n    // wait until ENDPTSETUPSTAT before priming data/status in response TODO add time out\n    while (dcd_reg->ENDPTSETUPSTAT & TU_BIT(0)) {}\n  }\n\n  // start transfer\n  dcd_reg->ENDPTPRIME = TU_BIT(epnum + (dir ? 16 : 0));\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes, bool is_isr) {\n  (void)is_isr;\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir   = tu_edpt_dir(ep_addr);\n\n  dcd_qhd_t *p_qhd = &_dcd_data.qhd[epnum][dir];\n  dcd_qtd_t *p_qtd = &_dcd_data.qtd[epnum][dir];\n\n  // Prepare qtd\n  qtd_init(p_qtd, buffer, total_bytes);\n\n  // Start qhd transfer\n  p_qhd->ff = NULL;\n  qhd_start_xfer(rhport, epnum, dir);\n\n  return true;\n}\n\n  #if !CFG_TUD_MEM_DCACHE_ENABLE\n// fifo has to be aligned to 4k boundary\n// It's incompatible with dcache enabled transfer, since neither address nor size is aligned to cache line\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes, bool is_isr) {\n  (void)is_isr;\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir   = tu_edpt_dir(ep_addr);\n\n  dcd_qhd_t *p_qhd = &_dcd_data.qhd[epnum][dir];\n  dcd_qtd_t *p_qtd = &_dcd_data.qtd[epnum][dir];\n\n  tu_fifo_buffer_info_t fifo_info;\n\n  if (dir) {\n    tu_fifo_get_read_info(ff, &fifo_info);\n  } else {\n    tu_fifo_get_write_info(ff, &fifo_info);\n  }\n\n  if (fifo_info.linear.len >= total_bytes) {\n    // Linear length is enough for this transfer\n    qtd_init(p_qtd, fifo_info.linear.ptr, total_bytes);\n  } else {\n    // linear part is not enough\n\n    // prepare TD up to linear length\n    qtd_init(p_qtd, fifo_info.linear.ptr, fifo_info.linear.len);\n\n    if (!tu_offset4k((uint32_t)fifo_info.wrapped.ptr) && !tu_offset4k(tu_fifo_depth(ff))) {\n      // If buffer is aligned to 4K & buffer size is multiple of 4K\n      // We can make use of buffer page array to also combine the linear + wrapped length\n      p_qtd->total_bytes = p_qtd->expected_bytes = total_bytes;\n\n      for (uint8_t i = 1, page = 0; i < 5; i++) {\n        // pick up buffer array where linear ends\n        if (p_qtd->buffer[i] == 0) {\n          p_qtd->buffer[i] = (uint32_t)fifo_info.wrapped.ptr + 4096 * page;\n          page++;\n        }\n      }\n    } else {\n      // TODO we may need to carry the wrapped length after the linear part complete\n      // for now only transfer up to linear part\n    }\n  }\n\n  // Start qhd transfer\n  p_qhd->ff = ff;\n  qhd_start_xfer(rhport, epnum, dir);\n\n  return true;\n}\n  #endif\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\n\nstatic void process_edpt_complete_isr(uint8_t rhport, uint8_t epnum, uint8_t dir) {\n  dcd_qhd_t *p_qhd = &_dcd_data.qhd[epnum][dir];\n  dcd_qtd_t *p_qtd = &_dcd_data.qtd[epnum][dir];\n\n  uint8_t result = p_qtd->halted                            ? XFER_RESULT_STALLED\n                   : (p_qtd->xact_err || p_qtd->buffer_err) ? XFER_RESULT_FAILED\n                                                            : XFER_RESULT_SUCCESS;\n\n  if (result != XFER_RESULT_SUCCESS) {\n    ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n    // flush to abort error buffer\n    dcd_reg->ENDPTFLUSH = TU_BIT(epnum + (dir ? 16 : 0));\n  }\n\n  const uint16_t xferred_bytes = p_qtd->expected_bytes - p_qtd->total_bytes;\n\n  if (p_qhd->ff) {\n    if (dir == TUSB_DIR_IN) {\n      tu_fifo_advance_read_pointer(p_qhd->ff, xferred_bytes);\n    } else {\n      tu_fifo_advance_write_pointer(p_qhd->ff, xferred_bytes);\n    }\n  }\n\n  // only number of bytes in the IOC qtd\n  dcd_event_xfer_complete(rhport, tu_edpt_addr(epnum, dir), xferred_bytes, result, true);\n}\n\nvoid dcd_int_handler(uint8_t rhport) {\n  ci_hs_regs_t *dcd_reg = CI_HS_REG(rhport);\n\n  const uint32_t int_enable = dcd_reg->USBINTR;\n  const uint32_t int_status = dcd_reg->USBSTS & int_enable;\n  dcd_reg->USBSTS           = int_status; // Acknowledge handled interrupt\n\n  // disabled interrupt sources\n  if (int_status == 0) {\n    return;\n  }\n\n  // Set if the port controller enters the full or high-speed operational state.\n  // either from Bus Reset or Suspended state\n  if (int_status & INTR_PORT_CHANGE) {\n    // TU_LOG2(\"PortChange %08lx\\r\\n\", dcd_reg->PORTSC1);\n\n    // Reset interrupt is not enabled, we manually check if Port Change is due\n    // to connection / disconnection\n    if (dcd_reg->USBSTS & INTR_RESET) {\n      dcd_reg->USBSTS = INTR_RESET;\n\n      if (dcd_reg->PORTSC1 & PORTSC1_CURRENT_CONNECT_STATUS) {\n        const uint32_t speed = (dcd_reg->PORTSC1 & PORTSC1_PORT_SPEED) >> PORTSC1_PORT_SPEED_POS;\n        bus_reset(rhport);\n        dcd_event_bus_reset(rhport, (tusb_speed_t)speed, true);\n      } else {\n        dcd_event_bus_signal(rhport, DCD_EVENT_UNPLUGGED, true);\n      }\n    } else {\n      // Triggered by resuming from suspended state\n      if (!(dcd_reg->PORTSC1 & PORTSC1_SUSPEND)) {\n        dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n      }\n    }\n  }\n\n  if (int_status & INTR_SUSPEND) {\n    // TU_LOG2(\"Suspend %08lx\\r\\n\", dcd_reg->PORTSC1);\n\n    if (dcd_reg->PORTSC1 & PORTSC1_SUSPEND) {\n      // Note: Host may delay more than 3 ms before and/or after bus reset before doing enumeration.\n      // Skip suspend event if we are not addressed\n      if ((dcd_reg->DEVICEADDR >> 25) & 0x0f) {\n        dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n      }\n    }\n  }\n\n  if (int_status & INTR_USB) {\n    // Make sure we read the latest version of _dcd_data.\n    dcd_dcache_clean_invalidate(&_dcd_data, sizeof(dcd_data_t));\n\n    const uint32_t edpt_complete = dcd_reg->ENDPTCOMPLETE;\n    dcd_reg->ENDPTCOMPLETE       = edpt_complete; // acknowledge\n\n    // 23.10.12.3 Failed QTD also get ENDPTCOMPLETE set\n    // nothing to do, we will submit xfer as error to usbd\n    // if (int_status & INTR_ERROR) { }\n\n    if (edpt_complete) {\n      for (uint8_t epnum = 0; epnum < TUP_DCD_ENDPOINT_MAX; epnum++) {\n        if (tu_bit_test(edpt_complete, epnum)) {\n          process_edpt_complete_isr(rhport, epnum, TUSB_DIR_OUT);\n        }\n        if (tu_bit_test(edpt_complete, epnum + 16)) {\n          process_edpt_complete_isr(rhport, epnum, TUSB_DIR_IN);\n        }\n      }\n    }\n\n    // Set up Received\n    // 23.10.10.2 Operational model for setup transfers\n    // Must be after normal transfer complete since it is possible to have both previous control status + new setup\n    // in the same frame and we should handle previous status first.\n    if (dcd_reg->ENDPTSETUPSTAT) {\n      dcd_reg->ENDPTSETUPSTAT = dcd_reg->ENDPTSETUPSTAT;\n      dcd_event_setup_received(rhport, (uint8_t *)(uintptr_t)&_dcd_data.qhd[0][0].setup_request, true);\n    }\n  }\n\n  if (int_status & INTR_SOF) {\n    const uint32_t frame = dcd_reg->FRINDEX;\n    dcd_event_sof(rhport, frame, true);\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/chipidea/ci_hs/hcd_ci_hs.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n// Chipidea Highspeed USB IP implement EHCI for host functionality\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_EHCI)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"common/tusb_common.h\"\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"portable/ehci/ehci_api.h\"\n#include \"ci_hs_type.h\"\n\n#if CFG_TUSB_MCU == OPT_MCU_MIMXRT1XXX\n\n  #include \"ci_hs_imxrt.h\"\n\n  #if CFG_TUH_MEM_DCACHE_ENABLE\nbool hcd_dcache_clean(const void *addr, uint32_t data_size) {\n  return imxrt_dcache_clean(addr, data_size);\n}\n\nbool hcd_dcache_invalidate(const void *addr, uint32_t data_size) {\n  return imxrt_dcache_invalidate(addr, data_size);\n}\n\nbool hcd_dcache_clean_invalidate(const void *addr, uint32_t data_size) {\n  return imxrt_dcache_clean_invalidate(addr, data_size);\n}\n    #endif\n\n#elif TU_CHECK_MCU(OPT_MCU_LPC18XX, OPT_MCU_LPC43XX)\n\n  #include \"ci_hs_lpc18_43.h\"\n\n#elif TU_CHECK_MCU(OPT_MCU_HPM)\n\n  #include \"ci_hs_hpm.h\"\n\n#elif TU_CHECK_MCU(OPT_MCU_RW61X)\n\n  #include \"ci_hs_rw61x.h\"\n\n#else\n  #error \"Unsupported MCUs\"\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init) {\n  (void)rh_init;\n  ci_hs_regs_t *hcd_reg = CI_HS_REG(rhport);\n\n  #if CFG_TUSB_MCU == OPT_MCU_HPM\n  usb_phy_init((USB_Type *)hcd_reg, true);\n  #endif\n\n  // Reset controller\n  hcd_reg->USBCMD |= USBCMD_RESET;\n  while (hcd_reg->USBCMD & USBCMD_RESET) {}\n\n  // Set mode to host, must be set immediately after reset\n  #if CFG_TUSB_MCU == OPT_MCU_LPC18XX || CFG_TUSB_MCU == OPT_MCU_LPC43XX\n  // LPC18XX/43XX need to set VBUS Power Select to HIGH\n  hcd_reg->USBMODE = USBMODE_CM_HOST | USBMODE_VBUS_POWER_SELECT;\n  #else\n  hcd_reg->USBMODE = USBMODE_CM_HOST;\n  #endif\n\n  #if !TUH_OPT_HIGH_SPEED\n  hcd_reg->PORTSC1 |= PORTSC1_FORCE_FULL_SPEED;\n  #endif\n\n  return ehci_init(rhport, (uint32_t)&hcd_reg->CAPLENGTH, (uint32_t)&hcd_reg->USBCMD);\n}\n\nbool hcd_deinit(uint8_t rhport) {\n  return ehci_deinit(rhport);\n}\n\nvoid hcd_int_enable(uint8_t rhport) {\n  CI_HCD_INT_ENABLE(rhport);\n}\n\nvoid hcd_int_disable(uint8_t rhport) {\n  CI_HCD_INT_DISABLE(rhport);\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/dialog/da146xx/dcd_da146xx.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_DA1469X\n\n#include \"mcu/mcu.h\"\n\n#include \"device/dcd.h\"\n\n/*------------------------------------------------------------------*/\n/* MACRO TYPEDEF CONSTANT ENUM\n *------------------------------------------------------------------*/\n\n// Since TinyUSB doesn't use SOF for now, and this interrupt too often (1ms interval)\n// We disable SOF for now until needed later on\n#define USE_SOF           0\n\n// Size of RX or TX FIFO.\n#define FIFO_SIZE         64\n\n#ifndef TU_DA1469X_FIFO_READ_THRESHOLD\n// RX FIFO is 64 bytes. When endpoint size is greater then 64, FIFO warning interrupt\n// is enabled to allow read incoming data during frame reception.\n// It is possible to stay in interrupt reading whole packet at once, but it may be\n// more efficient for MCU to read as much data as possible and when FIFO is hardly\n// filled exit interrupt handler waiting for next FIFO warning level interrupt\n// or packet end.\n// When running at 96MHz code that reads FIFO based on number of bytes stored in\n// USB_RXSx_REG.USB_RXCOUNT takes enough time to fill FIFO with two additional bytes.\n// Settings this threshold above this allows to leave interrupt handler and wait\n// for more bytes to before next ISR. This allows reduce overall ISR time to 1/3\n// of time that would be needed if ISR read as fast as possible.\n#define TU_DA1469X_FIFO_READ_THRESHOLD  4\n#endif\n\n#define EP_MAX            4\n\n// Node functional states\n#define NFSR_NODE_RESET         0\n#define NFSR_NODE_RESUME        1\n#define NFSR_NODE_OPERATIONAL   2\n#define NFSR_NODE_SUSPEND       3\n// Those two following states are added to allow going out of sleep mode\n// using frame interrupt.  On remove wakeup RESUME state must be kept for\n// at least 1ms. It is accomplished by using FRAME interrupt that goes\n// through those two fake states before entering OPERATIONAL state.\n#define NFSR_NODE_WAKING        (0x10 | (NFSR_NODE_RESUME))\n#define NFSR_NODE_WAKING2       (0x20 | (NFSR_NODE_RESUME))\n\nstatic TU_ATTR_ALIGNED(4) uint8_t _setup_packet[8];\n\ntypedef struct\n{\n  union\n  {\n    __IOM uint32_t epc_in;\n    __IOM uint32_t USB_EPC0_REG;                 /*!< (@ 0x00000080) Endpoint Control 0 Register  */\n    __IOM uint32_t USB_EPC1_REG;                 /*!< (@ 0x000000A0) Endpoint Control Register 1  */\n    __IOM uint32_t USB_EPC3_REG;                 /*!< (@ 0x000000C0) Endpoint Control Register 3  */\n    __IOM uint32_t USB_EPC5_REG;                 /*!< (@ 0x000000E0) Endpoint Control Register 5  */\n  };\n  union\n  {\n    __IOM uint32_t txd;\n    __IOM uint32_t USB_TXD0_REG;                 /*!< (@ 0x00000084) Transmit Data 0 Register     */\n    __IOM uint32_t USB_TXD1_REG;                 /*!< (@ 0x000000A4) Transmit Data Register 1     */\n    __IOM uint32_t USB_TXD2_REG;                 /*!< (@ 0x000000C4) Transmit Data Register 2     */\n    __IOM uint32_t USB_TXD3_REG;                 /*!< (@ 0x000000E4) Transmit Data Register 3     */\n  };\n  union\n  {\n    __IOM uint32_t txs;\n    __IOM uint32_t USB_TXS0_REG;                 /*!< (@ 0x00000088) Transmit Status 0 Register   */\n    __IOM uint32_t USB_TXS1_REG;                 /*!< (@ 0x000000A8) Transmit Status Register 1   */\n    __IOM uint32_t USB_TXS2_REG;                 /*!< (@ 0x000000C8) Transmit Status Register 2   */\n    __IOM uint32_t USB_TXS3_REG;                 /*!< (@ 0x000000E8) Transmit Status Register 3   */\n  };\n  union\n  {\n    __IOM uint32_t txc;\n    __IOM uint32_t USB_TXC0_REG;                 /*!< (@ 0x0000008C) Transmit command 0 Register  */\n    __IOM uint32_t USB_TXC1_REG;                 /*!< (@ 0x000000AC) Transmit Command Register 1  */\n    __IOM uint32_t USB_TXC2_REG;                 /*!< (@ 0x000000CC) Transmit Command Register 2  */\n    __IOM uint32_t USB_TXC3_REG;                 /*!< (@ 0x000000EC) Transmit Command Register 3  */\n  };\n  union\n  {\n    __IOM uint32_t epc_out;\n    __IOM uint32_t USB_EP0_NAK_REG;              /*!< (@ 0x00000090) EP0 INNAK and OUTNAK Register */\n    __IOM uint32_t USB_EPC2_REG;                 /*!< (@ 0x000000B0) Endpoint Control Register 2   */\n    __IOM uint32_t USB_EPC4_REG;                 /*!< (@ 0x000000D0) Endpoint Control Register 4   */\n    __IOM uint32_t USB_EPC6_REG;                 /*!< (@ 0x000000F0) Endpoint Control Register 6   */\n  };\n  union\n  {\n    __IOM uint32_t rxd;\n    __IOM uint32_t USB_RXD0_REG;                 /*!< (@ 0x00000094) Receive Data 0 Register       */\n    __IOM uint32_t USB_RXD1_REG;                 /*!< (@ 0x000000B4) Receive Data Register,1       */\n    __IOM uint32_t USB_RXD2_REG;                 /*!< (@ 0x000000D4) Receive Data Register 2       */\n    __IOM uint32_t USB_RXD3_REG;                 /*!< (@ 0x000000F4) Receive Data Register 3       */\n  };\n  union\n  {\n    __IOM uint32_t rxs;\n    __IOM uint32_t USB_RXS0_REG;                 /*!< (@ 0x00000098) Receive Status 0 Register     */\n    __IOM uint32_t USB_RXS1_REG;                 /*!< (@ 0x000000B8) Receive Status Register 1     */\n    __IOM uint32_t USB_RXS2_REG;                 /*!< (@ 0x000000D8) Receive Status Register 2     */\n    __IOM uint32_t USB_RXS3_REG;                 /*!< (@ 0x000000F8) Receive Status Register 3     */\n  };\n  union\n  {\n    __IOM uint32_t rxc;\n    __IOM uint32_t USB_RXC0_REG;                 /*!< (@ 0x0000009C) Receive Command 0 Register    */\n    __IOM uint32_t USB_RXC1_REG;                 /*!< (@ 0x000000BC) Receive Command Register 1    */\n    __IOM uint32_t USB_RXC2_REG;                 /*!< (@ 0x000000DC) Receive Command Register 2    */\n    __IOM uint32_t USB_RXC3_REG;                 /*!< (@ 0x000000FC) Receive Command Register 3    */\n  };\n} volatile EPx_REGS;\n\n#define EP_REGS(first_ep_reg) (EPx_REGS*)(&USB->first_ep_reg)\n\n// DMA channel pair to use, channel 6 will be used for RX channel 7 for TX direction.\n#ifndef TU_DA146XX_DMA_RX_CHANNEL\n#define TU_DA146XX_DMA_RX_CHANNEL 6\n#endif\n#define DA146XX_DMA_USB_MUX       (0x6 << (TU_DA146XX_DMA_RX_CHANNEL * 2))\n#define DA146XX_DMA_USB_MUX_MASK  (0xF << (TU_DA146XX_DMA_RX_CHANNEL * 2))\n\ntypedef struct\n{\n  __IOM uint32_t DMAx_A_START_REG;\n  __IOM uint32_t DMAx_B_START_REG;\n  __IOM uint32_t DMAx_INT_REG;\n  __IOM uint32_t DMAx_LEN_REG;\n  __IOM uint32_t DMAx_CTRL_REG;\n  __IOM uint32_t DMAx_IDX_REG;\n  __IM uint32_t RESERVED[2]; // Extend structure size for array like usage, registers for each channel are 0x20 bytes apart.\n} da146xx_dma_channel_t;\n\n#define DMA_CHANNEL_REGS(n) ((da146xx_dma_channel_t *)(DMA) + n)\n#define RX_DMA_REGS  DMA_CHANNEL_REGS(TU_DA146XX_DMA_RX_CHANNEL)\n#define TX_DMA_REGS  DMA_CHANNEL_REGS((TU_DA146XX_DMA_RX_CHANNEL) + 1)\n\n#define RX_DMA_START ((1 << DMA_DMA0_CTRL_REG_DMA_ON_Pos) |\\\n                      (0 << DMA_DMA0_CTRL_REG_BW_Pos) | \\\n                      (1 << DMA_DMA0_CTRL_REG_DREQ_MODE_Pos) | \\\n                      (1 << DMA_DMA0_CTRL_REG_BINC_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_AINC_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_CIRCULAR_Pos) | \\\n                      (2 << DMA_DMA0_CTRL_REG_DMA_PRIO_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_DMA_IDLE_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_DMA_INIT_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_REQ_SENSE_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_BURST_MODE_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_BUS_ERROR_DETECT_Pos))\n\n#define TX_DMA_START ((1 << DMA_DMA0_CTRL_REG_DMA_ON_Pos) |\\\n                      (0 << DMA_DMA0_CTRL_REG_BW_Pos) | \\\n                      (1 << DMA_DMA0_CTRL_REG_DREQ_MODE_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_BINC_Pos) | \\\n                      (1 << DMA_DMA0_CTRL_REG_AINC_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_CIRCULAR_Pos) | \\\n                      (2 << DMA_DMA0_CTRL_REG_DMA_PRIO_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_DMA_IDLE_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_DMA_INIT_Pos) | \\\n                      (1 << DMA_DMA0_CTRL_REG_REQ_SENSE_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_BURST_MODE_Pos) | \\\n                      (0 << DMA_DMA0_CTRL_REG_BUS_ERROR_DETECT_Pos))\n\n// Dialog register fields and bit mask are very long. Filed masks repeat register names.\n// Those convenience macros are a way to reduce complexity of register modification lines.\n#define GET_BIT(val, field) (val & field ## _Msk) >> field ## _Pos\n#define REG_GET_BIT(reg, field) (USB->reg & USB_ ## reg ## _ ## field ## _Msk)\n#define REG_SET_BIT(reg, field) USB->reg |= USB_ ## reg ## _ ## field ## _Msk\n#define REG_CLR_BIT(reg, field) USB->reg &= ~USB_ ## reg ## _ ## field ## _Msk\n#define REG_SET_VAL(reg, field, val) USB->reg = (USB->reg & ~USB_ ## reg ## _ ## field ## _Msk) | (val << USB_ ## reg ## _ ## field ## _Pos)\n\nstatic EPx_REGS * const ep_regs[EP_MAX] = {\n  EP_REGS(USB_EPC0_REG),\n  EP_REGS(USB_EPC1_REG),\n  EP_REGS(USB_EPC3_REG),\n  EP_REGS(USB_EPC5_REG),\n};\n\ntypedef struct {\n  uint8_t * buffer;\n  // Total length of current transfer\n  uint16_t total_len;\n  // Bytes transferred so far\n  uint16_t transferred;\n  uint16_t max_packet_size;\n  // Packet size sent or received so far. It is used to modify transferred field\n  // after ACK is received or when filling ISO endpoint with size larger then\n  // FIFO size.\n  uint16_t last_packet_size;\n  uint8_t ep_addr;\n  // DATA0/1 toggle bit 1 DATA1 is expected or transmitted\n  uint8_t data1 : 1;\n  // Endpoint is stalled\n  uint8_t stall : 1;\n  // ISO endpoint\n  uint8_t iso : 1;\n} xfer_ctl_t;\n\nstatic struct\n{\n  bool vbus_present;\n  bool init_called;\n  uint8_t nfsr;\n  xfer_ctl_t xfer_status[EP_MAX][2];\n  // Endpoints that use DMA, one for each direction\n  uint8_t dma_ep[2];\n} _dcd =\n{\n  .vbus_present = false,\n  .init_called = false,\n};\n\n// Converts xfer pointer to epnum (0,1,2,3) regardless of xfer direction\n#define XFER_EPNUM(xfer)      ((xfer - &_dcd.xfer_status[0][0]) >> 1)\n// Converts xfer pointer to EPx_REGS pointer (returns same pointer for IN and OUT with same endpoint number)\n#define XFER_REGS(xfer)       ep_regs[XFER_EPNUM(xfer)]\n// Converts epnum (0,1,2,3) to EPx_REGS pointer\n#define EPNUM_REGS(epnum)     ep_regs[epnum]\n\n// Two endpoint 0 descriptor definition for unified dcd_edpt_open()\nstatic const tusb_desc_endpoint_t ep0OUT_desc =\n{\n  .bLength          = sizeof(tusb_desc_endpoint_t),\n  .bDescriptorType  = TUSB_DESC_ENDPOINT,\n\n  .bEndpointAddress = 0x00,\n  .bmAttributes     = { .xfer = TUSB_XFER_CONTROL },\n  .wMaxPacketSize   = CFG_TUD_ENDPOINT0_SIZE,\n  .bInterval        = 0\n};\n\nstatic const tusb_desc_endpoint_t ep0IN_desc =\n{\n  .bLength          = sizeof(tusb_desc_endpoint_t),\n  .bDescriptorType  = TUSB_DESC_ENDPOINT,\n\n  .bEndpointAddress = 0x80,\n  .bmAttributes     = { .xfer = TUSB_XFER_CONTROL },\n  .wMaxPacketSize   = CFG_TUD_ENDPOINT0_SIZE,\n  .bInterval        = 0\n};\n\n#define XFER_CTL_BASE(_ep, _dir) &_dcd.xfer_status[_ep][_dir]\n\nstatic void set_nfsr(uint8_t val)\n{\n  _dcd.nfsr = val;\n  // Write only lower 2 bits to register, higher bits are used\n  // to count down till OPERATIONAL state can be entered when\n  // remote wakeup activated.\n  USB->USB_NFSR_REG = val & 3;\n}\n\nstatic void fill_tx_fifo(xfer_ctl_t * xfer)\n{\n  int left_to_send;\n  uint8_t const *src;\n  uint8_t const epnum = tu_edpt_number(xfer->ep_addr);\n  EPx_REGS *regs = EPNUM_REGS(epnum);\n\n  src = &xfer->buffer[xfer->transferred];\n  left_to_send = xfer->total_len - xfer->transferred;\n  if (left_to_send > xfer->max_packet_size - xfer->last_packet_size)\n  {\n    left_to_send = xfer->max_packet_size - xfer->last_packet_size;\n  }\n\n  // Loop checks TCOUNT all the time since this value is saturated to 31\n  // and can't be read just once before.\n  while ((regs->txs & USB_USB_TXS1_REG_USB_TCOUNT_Msk) > 0 && left_to_send > 0)\n  {\n    regs->txd = *src++;\n    xfer->last_packet_size++;\n    left_to_send--;\n  }\n  if (epnum != 0)\n  {\n    if (left_to_send > 0)\n    {\n      // Max packet size is set to value greater then FIFO. Enable fifo level warning\n      // to handle larger packets.\n      regs->txc |= (3 << USB_USB_TXC1_REG_USB_TFWL_Pos);\n      USB->USB_FWMSK_REG |= 1 << (epnum - 1 + USB_USB_FWMSK_REG_USB_M_TXWARN31_Pos);\n    }\n    else\n    {\n      regs->txc &= ~USB_USB_TXC1_REG_USB_TFWL_Msk;\n      USB->USB_FWMSK_REG &= ~(1 << (epnum - 1 + USB_USB_FWMSK_REG_USB_M_TXWARN31_Pos));\n      // Whole packet already in fifo, no need to refill it later.  Mark last.\n      regs->txc |= USB_USB_TXC1_REG_USB_LAST_Msk;\n    }\n  }\n}\n\nstatic bool try_allocate_dma(uint8_t epnum, uint8_t dir)\n{\n  // TODO: Disable interrupts while checking\n  if (_dcd.dma_ep[dir] == 0)\n  {\n    _dcd.dma_ep[dir] = epnum;\n    if (dir == TUSB_DIR_OUT)\n      USB->USB_DMA_CTRL_REG = (USB->USB_DMA_CTRL_REG & ~USB_USB_DMA_CTRL_REG_USB_DMA_RX_Msk) |\n        ((epnum - 1) << USB_USB_DMA_CTRL_REG_USB_DMA_RX_Pos);\n    else\n      USB->USB_DMA_CTRL_REG = (USB->USB_DMA_CTRL_REG & ~USB_USB_DMA_CTRL_REG_USB_DMA_TX_Msk) |\n        ((epnum - 1) << USB_USB_DMA_CTRL_REG_USB_DMA_TX_Pos);\n    USB->USB_DMA_CTRL_REG |= USB_USB_DMA_CTRL_REG_USB_DMA_EN_Msk;\n  }\n  return _dcd.dma_ep[dir] == epnum;\n}\n\nstatic void start_rx_dma(volatile void *src, void *dst, uint16_t size)\n{\n  // Setup SRC and DST registers\n  RX_DMA_REGS->DMAx_A_START_REG = (uint32_t)src;\n  RX_DMA_REGS->DMAx_B_START_REG = (uint32_t)dst;\n  // Don't need DMA interrupt, read end is determined by RX_LAST or RX_ERR events.\n  RX_DMA_REGS->DMAx_INT_REG = size - 1;\n  RX_DMA_REGS->DMAx_LEN_REG = size - 1;\n  RX_DMA_REGS->DMAx_CTRL_REG = RX_DMA_START;\n}\n\nstatic void start_rx_packet(xfer_ctl_t *xfer)\n{\n  uint8_t const epnum = tu_edpt_number(xfer->ep_addr);\n  uint16_t remaining = xfer->total_len - xfer->transferred;\n  uint16_t size = tu_min16(remaining, xfer->max_packet_size);\n  EPx_REGS *regs = XFER_REGS(xfer);\n\n  xfer->last_packet_size = 0;\n  if (xfer->max_packet_size > FIFO_SIZE && remaining > FIFO_SIZE)\n  {\n    if (try_allocate_dma(epnum, TUSB_DIR_OUT))\n    {\n      start_rx_dma(&regs->rxd, xfer->buffer + xfer->transferred, size);\n    }\n    else\n    {\n      // Other endpoint is using DMA in that direction, fall back to interrupts.\n      // For endpoint size greater than FIFO size enable FIFO level warning interrupt\n      // when FIFO has less than 17 bytes free.\n      regs->rxc |= USB_USB_RXC1_REG_USB_RFWL_Msk;\n      USB->USB_FWMSK_REG |= 1 << (epnum - 1 + USB_USB_FWMSK_REG_USB_M_RXWARN31_Pos);\n    }\n  }\n  else if (epnum != 0)\n  {\n    // If max_packet_size would fit in FIFO no need for FIFO level warning interrupt.\n    regs->rxc &= ~USB_USB_RXC1_REG_USB_RFWL_Msk;\n    USB->USB_FWMSK_REG &= ~(1 << (epnum - 1 + USB_USB_FWMSK_REG_USB_M_RXWARN31_Pos));\n  }\n  regs->rxc |= USB_USB_RXC1_REG_USB_RX_EN_Msk;\n}\n\nstatic void start_tx_dma(void *src, volatile void *dst, uint16_t size)\n{\n  // Setup SRC and DST registers\n  TX_DMA_REGS->DMAx_A_START_REG = (uint32_t)src;\n  TX_DMA_REGS->DMAx_B_START_REG = (uint32_t)dst;\n  // Interrupt not needed\n  TX_DMA_REGS->DMAx_INT_REG = size;\n  TX_DMA_REGS->DMAx_LEN_REG = size - 1;\n  TX_DMA_REGS->DMAx_CTRL_REG = TX_DMA_START;\n}\n\nstatic void start_tx_packet(xfer_ctl_t *xfer)\n{\n  uint8_t const epnum = tu_edpt_number(xfer->ep_addr);\n  uint16_t remaining = xfer->total_len - xfer->transferred;\n  uint16_t size = tu_min16(remaining, xfer->max_packet_size);\n  EPx_REGS *regs = EPNUM_REGS(epnum);\n\n  xfer->last_packet_size = 0;\n\n  regs->txc = USB_USB_TXC1_REG_USB_FLUSH_Msk;\n  regs->txc = USB_USB_TXC1_REG_USB_IGN_ISOMSK_Msk;\n  if (xfer->data1) regs->txc |= USB_USB_TXC1_REG_USB_TOGGLE_TX_Msk;\n\n  if (xfer->max_packet_size > FIFO_SIZE && remaining > FIFO_SIZE && try_allocate_dma(epnum, TUSB_DIR_IN))\n  {\n    // Whole packet will be put in FIFO by DMA. Set LAST bit before start.\n    start_tx_dma(xfer->buffer + xfer->transferred, &regs->txd, size);\n    regs->txc |= USB_USB_TXC1_REG_USB_LAST_Msk;\n  }\n  else\n  {\n    fill_tx_fifo(xfer);\n  }\n  regs->txc |= USB_USB_TXC1_REG_USB_TX_EN_Msk;\n}\n\nstatic uint16_t read_rx_fifo(xfer_ctl_t *xfer, uint16_t bytes_in_fifo)\n{\n  EPx_REGS *regs = XFER_REGS(xfer);\n  uint16_t remaining = xfer->total_len - xfer->transferred - xfer->last_packet_size;\n  uint16_t receive_this_time = bytes_in_fifo;\n\n  if (remaining < bytes_in_fifo) receive_this_time = remaining;\n\n  uint8_t *buf = xfer->buffer + xfer->transferred + xfer->last_packet_size;\n\n  for (int i = 0; i < receive_this_time; ++i) buf[i] = regs->rxd;\n\n  xfer->last_packet_size += receive_this_time;\n\n  return bytes_in_fifo - receive_this_time;\n}\n\nstatic void handle_ep0_rx(void)\n{\n  int fifo_bytes;\n  uint32_t rxs0 = USB->USB_RXS0_REG;\n\n  xfer_ctl_t *xfer = XFER_CTL_BASE(0, TUSB_DIR_OUT);\n\n  fifo_bytes = GET_BIT(rxs0, USB_USB_RXS0_REG_USB_RCOUNT);\n  if (rxs0 & USB_USB_RXS0_REG_USB_SETUP_Msk)\n  {\n    xfer_ctl_t *xfer_in = XFER_CTL_BASE(0, TUSB_DIR_IN);\n    // Setup packet is in\n    for (int i = 0; i < fifo_bytes; ++i) _setup_packet[i] = USB->USB_RXD0_REG;\n\n    xfer->stall = 0;\n    xfer->data1 = 1;\n    xfer_in->stall = 0;\n    xfer_in->data1 = 1;\n    REG_SET_BIT(USB_TXC0_REG, USB_TOGGLE_TX0);\n    REG_CLR_BIT(USB_EPC0_REG, USB_STALL);\n    dcd_event_setup_received(0, _setup_packet,true);\n  }\n  else\n  {\n    if (GET_BIT(rxs0, USB_USB_RXS0_REG_USB_TOGGLE_RX0) != xfer->data1)\n    {\n      // Toggle bit does not match discard packet\n      REG_SET_BIT(USB_RXC0_REG, USB_FLUSH);\n      xfer->last_packet_size = 0;\n    }\n    else\n    {\n      read_rx_fifo(xfer, fifo_bytes);\n      if (rxs0 & USB_USB_RXS0_REG_USB_RX_LAST_Msk)\n      {\n        xfer->transferred += xfer->last_packet_size;\n        xfer->data1 ^= 1;\n\n        if (xfer->total_len == xfer->transferred || xfer->last_packet_size < xfer->max_packet_size)\n        {\n          dcd_event_xfer_complete(0, 0, xfer->transferred, XFER_RESULT_SUCCESS, true);\n        }\n        else\n        {\n          // Re-enable reception\n          REG_SET_BIT(USB_RXC0_REG, USB_RX_EN);\n        }\n        xfer->last_packet_size = 0;\n      }\n    }\n  }\n}\n\nstatic void handle_ep0_tx(void)\n{\n  uint32_t txs0;\n  xfer_ctl_t *xfer = XFER_CTL_BASE(0, TUSB_DIR_IN);\n  EPx_REGS *regs = XFER_REGS(xfer);\n\n  txs0 = regs->USB_TXS0_REG;\n\n  if (GET_BIT(txs0, USB_USB_TXS0_REG_USB_TX_DONE))\n  {\n    // ACK received\n    if (GET_BIT(txs0, USB_USB_TXS0_REG_USB_ACK_STAT))\n    {\n      xfer->transferred += xfer->last_packet_size;\n      xfer->last_packet_size = 0;\n      xfer->data1 ^= 1;\n      REG_SET_VAL(USB_TXC0_REG, USB_TOGGLE_TX0, xfer->data1);\n      if (xfer->transferred == xfer->total_len)\n      {\n        dcd_event_xfer_complete(0, 0 | TUSB_DIR_IN_MASK, xfer->total_len, XFER_RESULT_SUCCESS, true);\n        return;\n      }\n    }\n    else\n    {\n      // Start from the beginning\n      xfer->last_packet_size = 0;\n    }\n    fill_tx_fifo(xfer);\n  }\n}\n\nstatic void handle_epx_rx_ev(uint8_t ep)\n{\n  uint32_t rxs;\n  int fifo_bytes;\n  xfer_ctl_t *xfer = XFER_CTL_BASE(ep, TUSB_DIR_OUT);\n\n  EPx_REGS *regs = EPNUM_REGS(ep);\n\n  do\n  {\n    rxs = regs->rxs;\n\n    if (GET_BIT(rxs, USB_USB_RXS1_REG_USB_RX_ERR))\n    {\n      regs->rxc |= USB_USB_RXC1_REG_USB_FLUSH_Msk;\n      xfer->last_packet_size = 0;\n      if (_dcd.dma_ep[TUSB_DIR_OUT] == ep)\n      {\n        // Stop DMA\n        RX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA0_CTRL_REG_DMA_ON_Msk;\n        // Restart DMA since packet was dropped, all parameters should still work.\n        RX_DMA_REGS->DMAx_CTRL_REG |= DMA_DMA0_CTRL_REG_DMA_ON_Msk;\n      }\n      break;\n    }\n    else\n    {\n      if (_dcd.dma_ep[TUSB_DIR_OUT] == ep)\n      {\n        // Disable DMA and update last_packet_size with what DMA reported.\n        RX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA0_CTRL_REG_DMA_ON_Msk;\n        xfer->last_packet_size = RX_DMA_REGS->DMAx_IDX_REG;\n        // When DMA did not finished (packet was smaller then MPS), DMAx_IDX_REG holds exact number of bytes transmitted.\n        // When DMA finished value in DMAx_IDX_REG is one less then actual number of transmitted bytes.\n        if (xfer->last_packet_size == RX_DMA_REGS->DMAx_LEN_REG) xfer->last_packet_size++;\n        // Release DMA to use by other endpoints.\n        _dcd.dma_ep[TUSB_DIR_OUT] = 0;\n      }\n      fifo_bytes = GET_BIT(rxs, USB_USB_RXS1_REG_USB_RXCOUNT);\n      // FIFO maybe empty if DMA read it before or it's final iteration and function already read all that was to read.\n      if (fifo_bytes > 0)\n      {\n        fifo_bytes = read_rx_fifo(xfer, fifo_bytes);\n      }\n      if (GET_BIT(rxs, USB_USB_RXS1_REG_USB_RX_LAST))\n      {\n        if (!xfer->iso && GET_BIT(rxs, USB_USB_RXS1_REG_USB_TOGGLE_RX) != xfer->data1)\n        {\n          // Toggle bit does not match discard packet\n          regs->rxc |= USB_USB_RXC1_REG_USB_FLUSH_Msk;\n        }\n        else\n        {\n          xfer->data1 ^= 1;\n          xfer->transferred += xfer->last_packet_size;\n          if (xfer->total_len == xfer->transferred || xfer->last_packet_size < xfer->max_packet_size || xfer->iso)\n          {\n            if (fifo_bytes)\n            {\n              // There are extra bytes in the FIFO just flush them\n              regs->rxc |= USB_USB_RXC1_REG_USB_FLUSH_Msk;\n              fifo_bytes = 0;\n            }\n\n            dcd_event_xfer_complete(0, xfer->ep_addr, xfer->transferred, XFER_RESULT_SUCCESS, true);\n          }\n          else\n          {\n            // Re-enable reception\n            start_rx_packet(xfer);\n          }\n        }\n        xfer->last_packet_size = 0;\n      }\n    }\n  } while (fifo_bytes > TU_DA1469X_FIFO_READ_THRESHOLD);\n}\n\nstatic void handle_rx_ev(void)\n{\n  if (USB->USB_RXEV_REG & 1)\n    handle_epx_rx_ev(1);\n  if (USB->USB_RXEV_REG & 2)\n    handle_epx_rx_ev(2);\n  if (USB->USB_RXEV_REG & 4)\n    handle_epx_rx_ev(3);\n}\n\nstatic void handle_epx_tx_ev(xfer_ctl_t *xfer)\n{\n  uint8_t const epnum = tu_edpt_number(xfer->ep_addr);\n  uint32_t txs;\n  EPx_REGS *regs = EPNUM_REGS(epnum);\n\n  txs = regs->txs;\n\n  if (GET_BIT(txs, USB_USB_TXS1_REG_USB_TX_DONE))\n  {\n    if (_dcd.dma_ep[TUSB_DIR_IN] == epnum)\n    {\n      // Disable DMA and update last_packet_size with what DMA reported.\n      TX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA1_CTRL_REG_DMA_ON_Msk;\n      xfer->last_packet_size = TX_DMA_REGS->DMAx_IDX_REG + 1;\n      // Release DMA to used by other endpoints.\n      _dcd.dma_ep[TUSB_DIR_IN] = 0;\n    }\n    if (GET_BIT(txs, USB_USB_TXS1_REG_USB_ACK_STAT))\n    {\n      // ACK received, update transfer state and DATA0/1 bit\n      xfer->transferred += xfer->last_packet_size;\n      xfer->last_packet_size = 0;\n      xfer->data1 ^= 1;\n\n      if (xfer->transferred == xfer->total_len)\n      {\n        dcd_event_xfer_complete(0, xfer->ep_addr, xfer->total_len, XFER_RESULT_SUCCESS, true);\n        return;\n      }\n    }\n    else if (regs->epc_in & USB_USB_EPC1_REG_USB_STALL_Msk)\n    {\n      // TX_DONE also indicates that STALL packet was just sent, there is\n      // no point to put anything into transmit FIFO. It could result in\n      // empty packet being scheduled.\n      return;\n    }\n  }\n  if (txs & USB_USB_TXS1_REG_USB_TX_URUN_Msk)\n  {\n    TU_LOG1(\"EP %d FIFO underrun\\r\\n\", epnum);\n  }\n  // Start next or repeated packet.\n  start_tx_packet(xfer);\n}\n\nstatic void handle_tx_ev(void)\n{\n  if (USB->USB_TXEV_REG & 1)\n    handle_epx_tx_ev(XFER_CTL_BASE(1, TUSB_DIR_IN));\n  if (USB->USB_TXEV_REG & 2)\n    handle_epx_tx_ev(XFER_CTL_BASE(2, TUSB_DIR_IN));\n  if (USB->USB_TXEV_REG & 4)\n    handle_epx_tx_ev(XFER_CTL_BASE(3, TUSB_DIR_IN));\n}\n\nstatic uint32_t check_reset_end(uint32_t alt_ev)\n{\n  if (_dcd.nfsr == NFSR_NODE_RESET)\n  {\n    if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_RESET))\n    {\n      // Could be still in reset, but since USB_M_RESET is disabled it can\n      // be also old reset state that was not cleared yet.\n      // If (after reading USB_ALTEV_REG register again) bit is cleared\n      // reset state just ended.\n      // Keep non-reset bits combined from two previous ALTEV read and\n      // one from the next line.\n      alt_ev = (alt_ev & ~USB_USB_ALTEV_REG_USB_RESET_Msk) | USB->USB_ALTEV_REG;\n    }\n    if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_RESET) == 0)\n    {\n      USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESET_Msk |\n                            USB_USB_ALTEV_REG_USB_SD3_Msk;\n      set_nfsr(NFSR_NODE_OPERATIONAL);\n      dcd_edpt_open(0, &ep0OUT_desc);\n      dcd_edpt_open(0, &ep0IN_desc);\n    }\n  }\n  return alt_ev;\n}\n\nstatic void handle_bus_reset(void)\n{\n  uint32_t alt_ev;\n\n  USB->USB_NFSR_REG = 0;\n  USB->USB_FAR_REG = 0x80;\n  USB->USB_ALTMSK_REG = 0;\n  USB->USB_NFSR_REG = NFSR_NODE_RESET;\n  USB->USB_TXMSK_REG = 0;\n  USB->USB_RXMSK_REG = 0;\n  set_nfsr(NFSR_NODE_RESET);\n\n  dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n  USB->USB_DMA_CTRL_REG = 0;\n\n  USB->USB_MAMSK_REG = USB_USB_MAMSK_REG_USB_M_INTR_Msk |\n                       USB_USB_MAMSK_REG_USB_M_FRAME_Msk |\n                       USB_USB_MAMSK_REG_USB_M_WARN_Msk |\n                       USB_USB_MAMSK_REG_USB_M_ALT_Msk;\n  USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESUME_Msk;\n  alt_ev = USB->USB_ALTEV_REG;\n  check_reset_end(alt_ev);\n}\n\nstatic void handle_alt_ev(void)\n{\n  uint32_t alt_ev = USB->USB_ALTEV_REG;\n\n  alt_ev = check_reset_end(alt_ev);\n  if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_RESET) && _dcd.nfsr != NFSR_NODE_RESET)\n  {\n    handle_bus_reset();\n  }\n  else if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_RESUME))\n  {\n    if (USB->USB_NFSR_REG == NFSR_NODE_SUSPEND)\n    {\n      set_nfsr(NFSR_NODE_OPERATIONAL);\n      USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESET_Msk |\n                            USB_USB_ALTMSK_REG_USB_M_SD3_Msk;\n      // Re-enable reception of endpoint with pending transfer\n      for (int epnum = 1; epnum <= 3; ++epnum)\n      {\n        xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT);\n        if (xfer->total_len > xfer->transferred)\n        {\n          start_rx_packet(xfer);\n        }\n      }\n      dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n    }\n  }\n  else if (GET_BIT(alt_ev, USB_USB_ALTEV_REG_USB_SD3))\n  {\n    set_nfsr(NFSR_NODE_SUSPEND);\n    USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESET_Msk |\n                          USB_USB_ALTMSK_REG_USB_M_RESUME_Msk;\n    dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n  }\n}\n\nstatic void handle_epx_tx_warn_ev(uint8_t ep)\n{\n  fill_tx_fifo(XFER_CTL_BASE(ep, TUSB_DIR_IN));\n}\n\nstatic void handle_fifo_warning(void)\n{\n  uint32_t fifo_warning = USB->USB_FWEV_REG;\n\n  if (fifo_warning & 0x01)\n    handle_epx_tx_warn_ev(1);\n  if (fifo_warning & 0x02)\n    handle_epx_tx_warn_ev(2);\n  if (fifo_warning & 0x04)\n    handle_epx_tx_warn_ev(3);\n  if (fifo_warning & 0x10)\n    handle_epx_rx_ev(1);\n  if (fifo_warning & 0x20)\n    handle_epx_rx_ev(2);\n  if (fifo_warning & 0x40)\n    handle_epx_rx_ev(3);\n}\n\nstatic void handle_ep0_nak(void)\n{\n  uint32_t ep0_nak = USB->USB_EP0_NAK_REG;\n\n  if (REG_GET_BIT(USB_EPC0_REG, USB_STALL))\n  {\n    if (GET_BIT(ep0_nak, USB_USB_EP0_NAK_REG_USB_EP0_INNAK))\n    {\n      // EP0 is stalled and NAK was sent, it means that RX is enabled\n      // Disable RX for now.\n      REG_CLR_BIT(USB_RXC0_REG, USB_RX_EN);\n      REG_SET_BIT(USB_TXC0_REG, USB_TX_EN);\n    }\n    if (GET_BIT(ep0_nak, USB_USB_EP0_NAK_REG_USB_EP0_OUTNAK))\n    {\n      REG_SET_BIT(USB_RXC0_REG, USB_RX_EN);\n    }\n  }\n  else\n  {\n    REG_CLR_BIT(USB_MAMSK_REG, USB_M_EP0_NAK);\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* Controller API\n *------------------------------------------------------------------*/\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  _dcd.init_called = true;\n  if (_dcd.vbus_present) {\n    dcd_connect(rhport);\n  }\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void)rhport;\n\n  NVIC_EnableIRQ(USB_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void)rhport;\n\n  NVIC_DisableIRQ(USB_IRQn);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void)rhport;\n\n  // Set default address for one ZLP\n  USB->USB_EPC0_REG = USB_USB_EPC0_REG_USB_DEF_Msk;\n  USB->USB_FAR_REG = (dev_addr & USB_USB_FAR_REG_USB_AD_Msk) | USB_USB_FAR_REG_USB_AD_EN_Msk;\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void)rhport;\n  if (_dcd.nfsr == NFSR_NODE_SUSPEND)\n  {\n    // Enter fake state that will use FRAME interrupt to wait before going operational.\n    set_nfsr(NFSR_NODE_WAKING);\n    USB->USB_MAMSK_REG |= USB_USB_MAMSK_REG_USB_M_FRAME_Msk;\n  }\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void)rhport;\n\n  if (GET_BIT(USB->USB_MCTRL_REG, USB_USB_MCTRL_REG_USB_NAT) == 0)\n  {\n    USB->USB_MCTRL_REG = USB_USB_MCTRL_REG_USBEN_Msk;\n    USB->USB_NFSR_REG = 0;\n    USB->USB_FAR_REG = 0x80;\n    USB->USB_TXMSK_REG = 0;\n    USB->USB_RXMSK_REG = 0;\n\n    USB->USB_MAMSK_REG = USB_USB_MAMSK_REG_USB_M_INTR_Msk |\n                         USB_USB_MAMSK_REG_USB_M_ALT_Msk |\n                         USB_USB_MAMSK_REG_USB_M_WARN_Msk;\n    USB->USB_ALTMSK_REG = USB_USB_ALTMSK_REG_USB_M_RESET_Msk |\n                          USB_USB_ALTEV_REG_USB_SD3_Msk;\n\n    USB->USB_MCTRL_REG = USB_USB_MCTRL_REG_USBEN_Msk | USB_USB_MCTRL_REG_USB_NAT_Msk;\n\n    // Select chosen DMA to be triggered by USB.\n    DMA->DMA_REQ_MUX_REG = (DMA->DMA_REQ_MUX_REG & ~DA146XX_DMA_USB_MUX_MASK) | DA146XX_DMA_USB_MUX;\n  }\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void)rhport;\n\n  REG_CLR_BIT(USB_MCTRL_REG, USB_NAT);\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool is_in_isr(void)\n{\n  return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;\n}\n\nvoid tusb_vbus_changed(bool present);\nvoid tusb_vbus_changed(bool present)\n{\n  if (present && !_dcd.vbus_present)\n  {\n    _dcd.vbus_present = true;\n    // If power event happened before USB started, delay dcd_connect\n    // until dcd_init is called.\n    if (_dcd.init_called)\n    {\n      dcd_connect(0);\n    }\n  }\n  else if (!present && _dcd.vbus_present)\n  {\n    _dcd.vbus_present = false;\n    USB->USB_MCTRL_REG = 0;\n    dcd_event_bus_signal(0, DCD_EVENT_UNPLUGGED, is_in_isr());\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* DCD Endpoint port\n *------------------------------------------------------------------*/\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)\n{\n  (void)rhport;\n\n  uint8_t const epnum = tu_edpt_number(desc_edpt->bEndpointAddress);\n  uint8_t const dir   = tu_edpt_dir(desc_edpt->bEndpointAddress);\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n  EPx_REGS *regs = EPNUM_REGS(epnum);\n  uint8_t iso_mask = 0;\n\n  TU_ASSERT(epnum < EP_MAX);\n\n  xfer->max_packet_size = tu_edpt_packet_size(desc_edpt);\n  xfer->ep_addr = desc_edpt->bEndpointAddress;\n  xfer->data1 = 0;\n  xfer->iso = 0;\n\n  if (epnum != 0 && desc_edpt->bmAttributes.xfer == 1)\n  {\n    iso_mask = USB_USB_EPC1_REG_USB_ISO_Msk;\n    xfer->iso = 1;\n  }\n\n  if (epnum == 0)\n  {\n    USB->USB_MAMSK_REG |= USB_USB_MAMSK_REG_USB_M_EP0_RX_Msk |\n                          USB_USB_MAMSK_REG_USB_M_EP0_TX_Msk;\n  }\n  else\n  {\n    if (dir == TUSB_DIR_OUT)\n    {\n      regs->epc_out = epnum | USB_USB_EPC1_REG_USB_EP_EN_Msk | iso_mask;\n      USB->USB_RXMSK_REG |= 0x11 << (epnum - 1);\n      REG_SET_BIT(USB_MAMSK_REG, USB_M_RX_EV);\n    }\n    else\n    {\n      regs->epc_in = epnum | USB_USB_EPC1_REG_USB_EP_EN_Msk | iso_mask;\n      USB->USB_TXMSK_REG |= 0x11 << (epnum - 1);\n      REG_SET_BIT(USB_MAMSK_REG, USB_M_TX_EV);\n    }\n  }\n\n  return true;\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n\n  for (int epnum = 1; epnum < EP_MAX; ++epnum)\n  {\n    dcd_edpt_close(0, epnum | TUSB_DIR_OUT);\n    dcd_edpt_close(0, epnum | TUSB_DIR_IN);\n  }\n}\n\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)\n{\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n  EPx_REGS *regs = EPNUM_REGS(epnum);\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n\n  (void)rhport;\n\n  TU_ASSERT(epnum < EP_MAX,);\n\n  if (epnum == 0)\n  {\n    USB->USB_MAMSK_REG &= ~(USB_USB_MAMSK_REG_USB_M_EP0_RX_Msk |\n                            USB_USB_MAMSK_REG_USB_M_EP0_TX_Msk);\n  }\n  else\n  {\n    if (dir == TUSB_DIR_OUT)\n    {\n      regs->rxc = USB_USB_RXC1_REG_USB_FLUSH_Msk;\n      regs->epc_out = 0;\n      USB->USB_RXMSK_REG &= ~(0x11 << (epnum - 1));\n      // Release DMA if needed\n      if (_dcd.dma_ep[TUSB_DIR_OUT] == epnum)\n      {\n        RX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA0_CTRL_REG_DMA_ON_Msk;\n        _dcd.dma_ep[TUSB_DIR_OUT] = 0;\n      }\n    }\n    else\n    {\n      regs->txc = USB_USB_TXC1_REG_USB_FLUSH_Msk;\n      regs->epc_in = 0;\n      USB->USB_TXMSK_REG &= ~(0x11 << (epnum - 1));\n      // Release DMA if needed\n      if (_dcd.dma_ep[TUSB_DIR_IN] == epnum)\n      {\n        TX_DMA_REGS->DMAx_CTRL_REG &= ~DMA_DMA1_CTRL_REG_DMA_ON_Msk;\n        _dcd.dma_ep[TUSB_DIR_IN] = 0;\n      }\n    }\n  }\n  tu_memclr(xfer, sizeof(*xfer));\n}\n\n#if 0\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void) largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep) {\n  (void) rhport;\n  (void) desc_ep;\n  return false;\n}\n#endif\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n\n  (void)rhport;\n\n  xfer->buffer = buffer;\n  xfer->total_len = total_bytes;\n  xfer->last_packet_size = 0;\n  xfer->transferred = 0;\n\n  if (dir == TUSB_DIR_OUT)\n  {\n    start_rx_packet(xfer);\n  }\n  else // IN\n  {\n    start_tx_packet(xfer);\n  }\n\n  return true;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  (void)rhport;\n\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n  EPx_REGS *regs = EPNUM_REGS(epnum);\n  xfer->stall = 1;\n\n  if (epnum == 0)\n  {\n    // EP0 has just one registers to control stall for IN and OUT\n    REG_SET_BIT(USB_EPC0_REG, USB_STALL);\n    if (dir == TUSB_DIR_OUT)\n    {\n      regs->USB_RXC0_REG = USB_USB_RXC0_REG_USB_RX_EN_Msk;\n    }\n    else\n    {\n      if (regs->USB_RXC0_REG & USB_USB_RXC0_REG_USB_RX_EN_Msk)\n      {\n        // If RX is also enabled TX will not be stalled since RX has\n        // higher priority. Enable NAK interrupt to handle stall.\n        REG_SET_BIT(USB_MAMSK_REG, USB_M_EP0_NAK);\n      }\n      else\n      {\n        regs->USB_TXC0_REG |= USB_USB_TXC0_REG_USB_TX_EN_Msk;\n      }\n    }\n  }\n  else\n  {\n    if (dir == TUSB_DIR_OUT)\n    {\n      regs->epc_out |= USB_USB_EPC1_REG_USB_STALL_Msk;\n      regs->rxc |= USB_USB_RXC1_REG_USB_RX_EN_Msk;\n    }\n    else\n    {\n      regs->epc_in |= USB_USB_EPC1_REG_USB_STALL_Msk;\n      regs->txc |= USB_USB_TXC1_REG_USB_TX_EN_Msk | USB_USB_TXC1_REG_USB_LAST_Msk;\n    }\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  (void)rhport;\n\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n  EPx_REGS *regs = EPNUM_REGS(epnum);\n\n  // Clear stall is called in response to Clear Feature ENDPOINT_HALT, reset toggle\n  xfer->data1 = 0;\n  xfer->stall = 0;\n\n  if (dir == TUSB_DIR_OUT)\n  {\n    regs->epc_out &= ~USB_USB_EPC1_REG_USB_STALL_Msk;\n  }\n  else\n  {\n    regs->epc_in &= ~USB_USB_EPC1_REG_USB_STALL_Msk;\n  }\n  if (epnum == 0)\n  {\n    REG_CLR_BIT(USB_MAMSK_REG, USB_M_EP0_NAK);\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* Interrupt Handler\n *------------------------------------------------------------------*/\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  uint32_t int_status = USB->USB_MAEV_REG & USB->USB_MAMSK_REG;\n\n  (void)rhport;\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_WARN))\n  {\n    handle_fifo_warning();\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_CH_EV))\n  {\n    // TODO: for now just clear interrupt\n    (void)USB->USB_CHARGER_STAT_REG;\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_EP0_NAK))\n  {\n    handle_ep0_nak();\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_EP0_RX))\n  {\n    handle_ep0_rx();\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_EP0_TX))\n  {\n    handle_ep0_tx();\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_RX_EV))\n  {\n    handle_rx_ev();\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_NAK))\n  {\n    (void)USB->USB_NAKEV_REG;\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_FRAME))\n  {\n    if (_dcd.nfsr == NFSR_NODE_RESET)\n    {\n      // During reset FRAME interrupt is enabled to periodically\n      // check when reset state ends.\n      // FRAME interrupt is generated every 1ms without host sending\n      // actual SOF.\n      check_reset_end(USB_USB_ALTEV_REG_USB_RESET_Msk);\n    }\n    else if (_dcd.nfsr == NFSR_NODE_WAKING)\n    {\n      // No need to call set_nfsr, just set state\n      _dcd.nfsr = NFSR_NODE_WAKING2;\n    }\n    else if (_dcd.nfsr == NFSR_NODE_WAKING2)\n    {\n      // No need to call set_nfsr, just set state\n      _dcd.nfsr = NFSR_NODE_RESUME;\n    }\n    else if (_dcd.nfsr == NFSR_NODE_RESUME)\n    {\n      set_nfsr(NFSR_NODE_OPERATIONAL);\n    }\n    else\n    {\n#if USE_SOF\n      dcd_event_bus_signal(0, DCD_EVENT_SOF, true);\n#else\n      // FRAME interrupt was used to re-enable reset detection or remote\n      // wakeup no need to keep it enabled when USE_SOF is off.\n      USB->USB_MAMSK_REG &= ~USB_USB_MAMSK_REG_USB_M_FRAME_Msk;\n#endif\n    }\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_TX_EV))\n  {\n    handle_tx_ev();\n  }\n\n  if (GET_BIT(int_status, USB_USB_MAEV_REG_USB_ALT))\n  {\n    handle_alt_ev();\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/ehci/ehci.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_EHCI)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"osal/osal.h\"\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"host/usbh_pvt.h\"\n#include \"ehci_api.h\"\n#include \"ehci.h\"\n\n// NXP specific fixes\n#if TU_CHECK_MCU(OPT_MCU_MIMXRT1XXX, OPT_MCU_LPC55, OPT_MCU_MCXN9, OPT_MCU_RW61X)\n#include \"fsl_device_registers.h\"\n#endif\n\n#if TU_CHECK_MCU(OPT_MCU_HPM)\n#include \"ci_hs_hpm.h\"\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n// Debug level of EHCI\n#define EHCI_DBG     2\n\n// Framelist size as small as possible to save SRAM\n#ifdef TUP_USBIP_CHIPIDEA_HS\n  // NXP Transdimension: 8 elements\n  #define FRAMELIST_SIZE_BIT_VALUE      7u\n  #define FRAMELIST_SIZE_USBCMD_VALUE   (((FRAMELIST_SIZE_BIT_VALUE &  3) << EHCI_USBCMD_FRAMELIST_SIZE_SHIFT) | \\\n                                         ((FRAMELIST_SIZE_BIT_VALUE >> 2) << EHCI_USBCMD_CHIPIDEA_FRAMELIST_SIZE_MSB_SHIFT))\n#else\n  // STD EHCI: 256 elements\n  #define FRAMELIST_SIZE_BIT_VALUE      2u\n  #define FRAMELIST_SIZE_USBCMD_VALUE   ((FRAMELIST_SIZE_BIT_VALUE &  3) << EHCI_USBCMD_POS_FRAMELIST_SIZE)\n#endif\n\n#define FRAMELIST_SIZE                  (1024 >> FRAMELIST_SIZE_BIT_VALUE)\n\n// Total queue head pool. TODO should be user configurable and more optimize memory usage in the future\n#define QHD_MAX      (CFG_TUH_DEVICE_MAX*CFG_TUH_ENDPOINT_MAX + CFG_TUH_HUB)\n#define QTD_MAX      QHD_MAX\n\ntypedef struct {\n  ehci_link_t period_framelist[FRAMELIST_SIZE];\n\n  // TODO only implement 1 ms & 2 ms & 4 ms, 8 ms (framelist)\n  // [0] : 1ms, [1] : 2ms, [2] : 4ms, [3] : 8 ms\n  // TODO better implementation without dummy head to save SRAM\n  ehci_qhd_t period_head_arr[4];\n\n  // Note control qhd of dev0 is used as head of async list\n  struct {\n    ehci_qhd_t qhd;\n    ehci_qtd_t qtd;\n  }control[CFG_TUH_DEVICE_MAX+CFG_TUH_HUB+1];\n\n  ehci_qhd_t qhd_pool[QHD_MAX];\n  ehci_qtd_t qtd_pool[QTD_MAX] TU_ATTR_ALIGNED(32);\n\n  ehci_registers_t* regs;         // operational register\n  ehci_cap_registers_t* cap_regs; // capability register\n\n  volatile uint32_t uframe_number;\n}ehci_data_t;\n\n// Periodic frame list must be 4K alignment\nCFG_TUH_MEM_SECTION TU_ATTR_ALIGNED(4096) static ehci_data_t ehci_data;\n\n//--------------------------------------------------------------------+\n// Debug\n//--------------------------------------------------------------------+\n#if 0 && CFG_TUSB_DEBUG >= (EHCI_DBG + 1)\nstatic inline void print_portsc(ehci_registers_t* regs) {\n  TU_LOG_HEX(EHCI_DBG, regs->portsc);\n  TU_LOG(EHCI_DBG, \"  Connect Status : %u\\r\\n\", regs->portsc_bm.current_connect_status);\n  TU_LOG(EHCI_DBG, \"  Connect Change : %u\\r\\n\", regs->portsc_bm.connect_status_change);\n  TU_LOG(EHCI_DBG, \"  Enabled        : %u\\r\\n\", regs->portsc_bm.port_enabled);\n  TU_LOG(EHCI_DBG, \"  Enabled Change : %u\\r\\n\", regs->portsc_bm.port_enable_change);\n\n  TU_LOG(EHCI_DBG, \"  OverCurr Change: %u\\r\\n\", regs->portsc_bm.over_current_change);\n  TU_LOG(EHCI_DBG, \"  Force Resume   : %u\\r\\n\", regs->portsc_bm.force_port_resume);\n  TU_LOG(EHCI_DBG, \"  Suspend        : %u\\r\\n\", regs->portsc_bm.suspend);\n  TU_LOG(EHCI_DBG, \"  Reset          : %u\\r\\n\", regs->portsc_bm.port_reset);\n  TU_LOG(EHCI_DBG, \"  Power          : %u\\r\\n\", regs->portsc_bm.port_power);\n}\n\nstatic inline void print_intr(uint32_t intr) {\n  TU_LOG_HEX(EHCI_DBG, intr);\n  TU_LOG(EHCI_DBG, \"  USB Interrupt      : %u\\r\\n\", (intr & EHCI_INT_MASK_USB) ? 1 : 0);\n  TU_LOG(EHCI_DBG, \"  USB Error          : %u\\r\\n\", (intr & EHCI_INT_MASK_ERROR) ? 1 : 0);\n  TU_LOG(EHCI_DBG, \"  Port Change Detect : %u\\r\\n\", (intr & EHCI_INT_MASK_PORT_CHANGE) ? 1 : 0);\n  TU_LOG(EHCI_DBG, \"  Frame List Rollover: %u\\r\\n\", (intr & EHCI_INT_MASK_FRAMELIST_ROLLOVER) ? 1 : 0);\n  TU_LOG(EHCI_DBG, \"  Host System Error  : %u\\r\\n\", (intr & EHCI_INT_MASK_PCI_HOST_SYSTEM_ERROR) ? 1 : 0);\n  TU_LOG(EHCI_DBG, \"  Async Advance      : %u\\r\\n\", (intr & EHCI_INT_MASK_ASYNC_ADVANCE) ? 1 : 0);\n//  TU_LOG(EHCI_DBG, \"  Interrupt on Async: %u\\r\\n\", (intr & EHCI_INT_MASK_NXP_ASYNC));\n//  TU_LOG(EHCI_DBG, \"  Periodic Schedule : %u\\r\\n\", (intr & EHCI_INT_MASK_NXP_PERIODIC));\n}\n\n#else\n#define print_portsc(_reg)\n#endif\n\n//--------------------------------------------------------------------+\n// PROTOTYPE\n//--------------------------------------------------------------------+\n\n// weak dcache for non-cacheable MCU\nTU_ATTR_WEAK bool hcd_dcache_clean(void const* addr, uint32_t data_size) { (void) addr; (void) data_size; return true; }\nTU_ATTR_WEAK bool hcd_dcache_invalidate(void const* addr, uint32_t data_size) { (void) addr; (void) data_size; return true; }\nTU_ATTR_WEAK bool hcd_dcache_clean_invalidate(void const* addr, uint32_t data_size) { (void) addr; (void) data_size; return true; }\n\nTU_ATTR_ALWAYS_INLINE static inline ehci_qhd_t* qhd_control(uint8_t dev_addr);\nTU_ATTR_ALWAYS_INLINE static inline ehci_qhd_t* qhd_next (ehci_qhd_t const * p_qhd);\nTU_ATTR_ALWAYS_INLINE static inline ehci_qhd_t* qhd_find_free (void);\nstatic ehci_qhd_t* qhd_get_from_addr (uint8_t dev_addr, uint8_t ep_addr);\nstatic void qhd_init(ehci_qhd_t *p_qhd, uint8_t dev_addr, tusb_desc_endpoint_t const * ep_desc);\nstatic void qhd_attach_qtd(ehci_qhd_t *qhd, ehci_qtd_t *qtd);\nstatic void qhd_remove_qtd(ehci_qhd_t *qhd);\nTU_ATTR_ALWAYS_INLINE static inline bool qhd_is_periodic(ehci_qhd_t const *qhd) {\n  return qhd->int_smask != 0;\n}\nTU_ATTR_ALWAYS_INLINE static inline uint8_t qhd_ep_addr(ehci_qhd_t const *qhd) {\n  return tu_edpt_addr(qhd->ep_number, qhd->pid);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline ehci_qtd_t* qtd_control(uint8_t dev_addr);\nTU_ATTR_ALWAYS_INLINE static inline ehci_qtd_t* qtd_find_free (void);\nstatic void qtd_init (ehci_qtd_t* qtd, void const* buffer, uint16_t total_bytes);\n\nTU_ATTR_ALWAYS_INLINE static inline ehci_link_t* list_get_period_head(uint8_t rhport, uint32_t interval_ms);\nTU_ATTR_ALWAYS_INLINE static inline ehci_qhd_t* list_get_async_head(uint8_t rhport);\nTU_ATTR_ALWAYS_INLINE static inline ehci_link_t* list_next (ehci_link_t const *p_link);\nTU_ATTR_ALWAYS_INLINE static inline void list_insert (ehci_link_t *current, ehci_link_t *entry, uint8_t type);\nTU_ATTR_ALWAYS_INLINE static inline void list_remove(ehci_link_t* head, ehci_link_t* prev, ehci_qhd_t* qhd);\nstatic void list_remove_qhd_by_addr(ehci_link_t *list_head, uint8_t dev_addr, uint8_t ep_addr);\n\nstatic void ehci_disable_schedule(ehci_registers_t* regs, bool is_period) {\n  // maybe have a timeout for status\n  if (is_period) {\n    regs->command_bm.periodic_enable = 0;\n    while(regs->status_bm.periodic_status) {}\n  } else {\n    regs->command_bm.async_enable = 0;\n    while(regs->status_bm.async_status) {} // should have a timeout\n  }\n}\n\nstatic void ehci_enable_schedule(ehci_registers_t* regs, bool is_period) {\n  // maybe have a timeout for status\n  if (is_period) {\n    regs->command_bm.periodic_enable = 1;\n    while ( 0 == regs->status_bm.periodic_status ) {}\n  } else {\n    regs->command_bm.async_enable = 1;\n    while( 0 == regs->status_bm.async_status ) {}\n  }\n}\n\n#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U))\nstatic void nxp_usbphy_disconn_detector_set(uint8_t port, bool enable) {\n  // unify naming convention\n#if !defined(USBPHY1) && defined(USBPHY)\n  #define USBPHY1 USBPHY\n#endif\n\n  if (port == 0) {\n    if (enable) {\n      USBPHY1->CTRL_SET = USBPHY_CTRL_ENHOSTDISCONDETECT_MASK;\n    } else {\n      USBPHY1->CTRL_CLR = USBPHY_CTRL_ENHOSTDISCONDETECT_MASK;\n    }\n  }\n#if FSL_FEATURE_SOC_USBPHY_COUNT > 1U\n  else if (port == 1) {\n    if (enable) {\n      USBPHY2->CTRL_SET = USBPHY_CTRL_ENHOSTDISCONDETECT_MASK;\n    } else {\n      USBPHY2->CTRL_CLR = USBPHY_CTRL_ENHOSTDISCONDETECT_MASK;\n    }\n  }\n#endif\n\n#if !defined(USBPHY1) && defined(USBPHY)\n  #undef USBPHY1\n#endif\n}\n#endif\n\n//--------------------------------------------------------------------+\n// HCD API\n//--------------------------------------------------------------------+\nuint32_t hcd_frame_number(uint8_t rhport) {\n  (void) rhport;\n  uint32_t uframe = ehci_data.regs->frame_index;\n  return (ehci_data.uframe_number + uframe) >> 3;\n}\n\nvoid hcd_port_reset(uint8_t rhport) {\n  (void) rhport;\n\n  ehci_registers_t* regs = ehci_data.regs;\n\n  // skip if already in reset\n  if (regs->portsc_bm.port_reset) {\n    return;\n  }\n\n  // mask out Write-1-to-Clear bits\n  uint32_t portsc = regs->portsc & ~EHCI_PORTSC_MASK_W1C;\n\n#if TU_CHECK_MCU(OPT_MCU_HPM)\n  if (usb_phy_get_line_state((USB_Type *)CI_HS_REG(rhport)) == usb_line_state2) {\n      portsc |= USB_PORTSC1_STS_MASK;\n  } else {\n      portsc &= ~USB_PORTSC1_STS_MASK;\n  }\n#endif\n\n  // EHCI Table 2-16 PortSC\n  // when software writes Port Reset bit to a one, it must also write a zero to the Port Enable bit.\n  portsc &= ~(EHCI_PORTSC_MASK_PORT_EANBLED);\n  portsc |= EHCI_PORTSC_MASK_PORT_RESET;\n\n  regs->portsc = portsc;\n}\n\nvoid hcd_port_reset_end(uint8_t rhport) {\n  (void) rhport;\n  ehci_registers_t* regs = ehci_data.regs;\n\n  // stop reset only if is not complete yet\n  if (regs->portsc_bm.port_reset) {\n    // mask out all change bits since they are Write 1 to clear\n    uint32_t portsc = regs->portsc & ~EHCI_PORTSC_MASK_W1C;\n    portsc &= ~EHCI_PORTSC_MASK_PORT_RESET;\n\n    regs->portsc = portsc;\n  }\n\n#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U))\n    // Enable disconnect detector for highspeed device only\n    if (hcd_port_speed_get(rhport) == TUSB_SPEED_HIGH) {\n      nxp_usbphy_disconn_detector_set(rhport, true);\n    }\n#endif\n}\n\nbool hcd_port_connect_status(uint8_t rhport) {\n  (void) rhport;\n  return ehci_data.regs->portsc_bm.current_connect_status;\n}\n\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  (void) rhport;\n  return (tusb_speed_t) ehci_data.regs->portsc_bm.nxp_port_speed; // NXP specific port speed\n}\n\n// Close all opened endpoint belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t daddr) {\n  // skip dev0\n  if (daddr == 0) {\n    return;\n  }\n\n  // Remove from async list all endpoints of this device\n  list_remove_qhd_by_addr((ehci_link_t *) list_get_async_head(rhport), daddr, TUSB_INDEX_INVALID_8);\n\n  // Remove from all interval period list of this device\n  for (uint8_t i = 0; i < TU_ARRAY_SIZE(ehci_data.period_head_arr); i++) {\n    list_remove_qhd_by_addr((ehci_link_t *) &ehci_data.period_head_arr[i], daddr, TUSB_INDEX_INVALID_8);\n  }\n\n  // Async doorbell (EHCI 4.8.2 for operational details)\n  ehci_data.regs->command_bm.async_adv_doorbell = 1;\n}\n\nstatic void init_periodic_list(uint8_t rhport) {\n  (void) rhport;\n\n  // Build the polling interval tree with 1 ms, 2 ms, 4 ms and 8 ms (framesize) only\n  for ( uint32_t i = 0; i < TU_ARRAY_SIZE(ehci_data.period_head_arr); i++ ) {\n    ehci_data.period_head_arr[i].int_smask          = 1; // queue head in period list must have smask non-zero\n    ehci_data.period_head_arr[i].qtd_overlay.halted = 1; // dummy node, always inactive\n  }\n\n  // TODO EHCI_FRAMELIST_SIZE with other size than 8\n  // all links --> period_head_arr[0] (1ms)\n  // 0, 2, 4, 6 etc --> period_head_arr[1] (2ms)\n  // 1, 5 --> period_head_arr[2] (4ms)\n  // 3 --> period_head_arr[3] (8ms)\n\n  ehci_link_t * const framelist  = ehci_data.period_framelist;\n  ehci_link_t * const head_1ms = (ehci_link_t *) &ehci_data.period_head_arr[0];\n  ehci_link_t * const head_2ms = (ehci_link_t *) &ehci_data.period_head_arr[1];\n  ehci_link_t * const head_4ms = (ehci_link_t *) &ehci_data.period_head_arr[2];\n  ehci_link_t * const head_8ms = (ehci_link_t *) &ehci_data.period_head_arr[3];\n\n  for (uint32_t i = 0; i < FRAMELIST_SIZE; i++) {\n    framelist[i].address = (uint32_t) head_1ms;\n    framelist[i].type = EHCI_QTYPE_QHD;\n  }\n\n  for (uint32_t i = 0; i < FRAMELIST_SIZE; i += 2) {\n    list_insert(framelist + i, head_2ms, EHCI_QTYPE_QHD);\n  }\n\n  for (uint32_t i = 1; i < FRAMELIST_SIZE; i += 4) {\n    list_insert(framelist + i, head_4ms, EHCI_QTYPE_QHD);\n  }\n\n  list_insert(framelist + 3, head_8ms, EHCI_QTYPE_QHD);\n\n  head_1ms->terminate = 1;\n}\n\nbool ehci_init(uint8_t rhport, uint32_t capability_reg, uint32_t operatial_reg)\n{\n  tu_memclr(&ehci_data, sizeof(ehci_data_t));\n\n  ehci_data.regs = (ehci_registers_t*) operatial_reg;\n  ehci_data.cap_regs = (ehci_cap_registers_t*) capability_reg;\n\n  ehci_registers_t* regs = ehci_data.regs;\n\n  // EHCI 4.1 Host Controller Initialization\n\n  //------------- CTRLDSSEGMENT Register (skip) -------------//\n\n  //------------- USB INT Register -------------//\n\n  // disable all the interrupt\n  regs->inten  = 0;\n\n  // clear all status except port change since device maybe connected before this driver is initialized\n  regs->status = (EHCI_INT_MASK_ALL & ~EHCI_INT_MASK_PORT_CHANGE);\n\n  // Enable interrupts\n  regs->inten  = EHCI_INT_MASK_USB | EHCI_INT_MASK_ERROR | EHCI_INT_MASK_PORT_CHANGE |\n                 EHCI_INT_MASK_ASYNC_ADVANCE | EHCI_INT_MASK_FRAMELIST_ROLLOVER;\n\n  //------------- Asynchronous List -------------//\n  ehci_qhd_t * const async_head = list_get_async_head(rhport);\n  tu_memclr(async_head, sizeof(ehci_qhd_t));\n\n  async_head->next.address               = (uint32_t) async_head; // circular list, next is itself\n  async_head->next.type                  = EHCI_QTYPE_QHD;\n  async_head->head_list_flag             = 1;\n  async_head->qtd_overlay.halted         = 1; // inactive most of time\n  async_head->qtd_overlay.next.terminate = 1; // TODO removed if verified\n\n  regs->async_list_addr = (uint32_t) async_head;\n\n  //------------- Periodic List -------------//\n  init_periodic_list(rhport);\n  regs->periodic_list_base = (uint32_t) ehci_data.period_framelist;\n\n  hcd_dcache_clean(&ehci_data, sizeof(ehci_data_t));\n\n  //------------- TT Control (NXP only) -------------//\n  regs->nxp_tt_control = 0;\n\n  //------------- USB CMD Register -------------//\n  regs->command |= EHCI_USBCMD_RUN_STOP | EHCI_USBCMD_PERIOD_SCHEDULE_ENABLE | EHCI_USBCMD_ASYNC_SCHEDULE_ENABLE |\n                   FRAMELIST_SIZE_USBCMD_VALUE;\n\n  //------------- ConfigFlag Register (skip) -------------//\n\n  // enable port power bit in portsc. The function of this bit depends on the value of the Port\n  // Power Control (PPC) field in the HCSPARAMS register.\n  if (ehci_data.cap_regs->hcsparams_bm.port_power_control) {\n    // mask out all change bits since they are Write 1 to clear\n    uint32_t portsc = (regs->portsc & ~EHCI_PORTSC_MASK_W1C);\n    portsc |= EHCI_PORTSC_MASK_PORT_POWER;\n\n    regs->portsc = portsc;\n  }\n\n  return true;\n}\n\nbool ehci_deinit(uint8_t rhport) {\n  (void) rhport;\n\n  ehci_registers_t* regs = ehci_data.regs;\n\n  // Disable all the interrupt\n  regs->inten  = 0;\n\n  // Disable schedules\n  regs->command_bm.run_stop = 0;\n\n  // USB Spec: controller has to stop within 16 uframe = 2 frames\n  while( regs->status_bm.hc_halted == 0 ) {}\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const * ep_desc) {\n  // TODO not support ISO yet\n  TU_ASSERT (ep_desc->bmAttributes.xfer != TUSB_XFER_ISOCHRONOUS);\n\n  //------------- Prepare Queue Head -------------//\n  ehci_qhd_t *p_qhd;\n  if (ep_desc->bEndpointAddress == 0) {\n    p_qhd = qhd_control(dev_addr);\n  } else {\n    if (NULL != qhd_get_from_addr(dev_addr, ep_desc->bEndpointAddress)) {\n      return true; // already opened\n    }\n    p_qhd = qhd_find_free();\n  }\n  TU_ASSERT(p_qhd);\n  qhd_init(p_qhd, dev_addr, ep_desc);\n\n  // control of dev0 always exists as async head\n  if (dev_addr == 0) {\n    return true;\n  }\n\n  // Insert to list\n  ehci_link_t * list_head = NULL;\n  switch (ep_desc->bmAttributes.xfer) {\n    case TUSB_XFER_CONTROL:\n    case TUSB_XFER_BULK:\n      list_head = (ehci_link_t *) list_get_async_head(rhport);\n      break;\n\n    case TUSB_XFER_INTERRUPT:\n      list_head = list_get_period_head(rhport, p_qhd->interval_ms);\n      break;\n\n    case TUSB_XFER_ISOCHRONOUS:\n      // TODO iso is not supported\n      break;\n\n    default:\n      break;\n  }\n  TU_ASSERT(list_head);\n\n  list_insert(list_head, (ehci_link_t*) p_qhd, EHCI_QTYPE_QHD);\n\n  hcd_dcache_clean(p_qhd, sizeof(ehci_qhd_t));\n  hcd_dcache_clean(list_head, sizeof(ehci_qhd_t));\n\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  ehci_qhd_t* qhd = qhd_get_from_addr(daddr, ep_addr);\n  TU_VERIFY(qhd != NULL);\n\n  ehci_link_t * list_head;\n  if (qhd_is_periodic(qhd)) {\n    // interrupt endpoint\n    list_head = list_get_period_head(rhport, qhd->interval_ms);;\n  } else {\n    list_head = (ehci_link_t *) list_get_async_head(rhport);\n  }\n\n  list_remove_qhd_by_addr(list_head, daddr, ep_addr);\n  return true;\n}\n\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8]) {\n  (void) rhport;\n\n  ehci_qhd_t* qhd = &ehci_data.control[dev_addr].qhd;\n  ehci_qtd_t* td  = &ehci_data.control[dev_addr].qtd;\n\n  qtd_init(td, setup_packet, 8);\n  td->pid = EHCI_PID_SETUP;\n\n  hcd_dcache_clean(setup_packet, 8);\n\n  // Control endpoint never be stalled. Skip reset Data Toggle since it is fixed per stage\n  if (qhd->qtd_overlay.halted) {\n    qhd->qtd_overlay.halted = false;\n  }\n\n  // attach TD to QHD -> start transferring\n  qhd_attach_qtd(qhd, td);\n\n  return true;\n}\n\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t buflen) {\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  ehci_qhd_t* qhd = qhd_get_from_addr(dev_addr, ep_addr);\n  TU_VERIFY(qhd != NULL);\n  ehci_qtd_t* qtd;\n\n  if (epnum == 0) {\n    // Control endpoint never be stalled. Skip reset Data Toggle since it is fixed per stage\n    if (qhd->qtd_overlay.halted) {\n      qhd->qtd_overlay.halted = false;\n    }\n\n    qtd = qtd_control(dev_addr);\n    qtd_init(qtd, buffer, buflen);\n\n    // first data toggle is always 1 (data & setup stage)\n    qtd->data_toggle = 1;\n    qtd->pid = dir ? EHCI_PID_IN : EHCI_PID_OUT;\n  } else {\n    // skip if endpoint is halted\n    TU_VERIFY(!qhd->qtd_overlay.halted);\n\n    qtd = qtd_find_free();\n    TU_ASSERT(qtd);\n\n    qtd_init(qtd, buffer, buflen);\n    qtd->pid = qhd->pid;\n  }\n\n  // IN transfer: invalidate buffer, OUT transfer: clean buffer\n  if (dir) {\n    hcd_dcache_invalidate(buffer, buflen);\n  }else {\n    hcd_dcache_clean(buffer, buflen);\n  }\n\n  // attach TD to QHD -> start transferring\n  qhd_attach_qtd(qhd, qtd);\n\n  return true;\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n\n  // TODO ISO not supported yet\n  ehci_qhd_t* qhd = qhd_get_from_addr(dev_addr, ep_addr);\n  ehci_qtd_t * volatile qtd = qhd->attached_qtd;\n  TU_VERIFY(qtd != NULL); // no queued transfer\n\n  hcd_dcache_invalidate(qtd, sizeof(ehci_qtd_t));\n  TU_VERIFY(qtd->active); // transfer is already complete\n\n  // HC is still processing, disable HC list schedule before making changes\n  bool const is_period = (qhd->interval_ms > 0);\n\n  ehci_disable_schedule(ehci_data.regs, is_period);\n\n  // check active bit again just in case HC has just processed the TD\n  bool const still_active = qtd->active;\n  if (still_active) {\n    // remove TD from QH overlay\n    qhd->qtd_overlay.next.terminate = 1;\n    hcd_dcache_clean(qhd, sizeof(ehci_qhd_t));\n\n    // remove TD from QH software list\n    qhd_remove_qtd(qhd);\n  }\n\n  ehci_enable_schedule(ehci_data.regs, is_period);\n\n  return still_active; // true if removed an active transfer\n}\n\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  (void) rhport;\n  ehci_qhd_t *qhd = qhd_get_from_addr(daddr, ep_addr);\n  qhd->qtd_overlay.halted = 0;\n  qhd->qtd_overlay.data_toggle = 0;\n  hcd_dcache_clean_invalidate(qhd, sizeof(ehci_qhd_t));\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// EHCI Interrupt Handler\n//--------------------------------------------------------------------+\n\n// async_advance is handshake between usb stack & ehci controller.\n// This isr mean it is safe to modify previously removed queue head from async list.\n// In tinyusb, queue head is only removed when device is unplugged.\nTU_ATTR_ALWAYS_INLINE static inline\nvoid async_advance_isr(uint8_t rhport) {\n  (void) rhport;\n\n  ehci_qhd_t *qhd_pool = ehci_data.qhd_pool;\n  for (uint32_t i = 0; i < QHD_MAX; i++) {\n    if (qhd_pool[i].removing) {\n      qhd_pool[i].removing = 0;\n      qhd_pool[i].used = 0;\n    }\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline\nvoid port_connect_status_change_isr(uint8_t rhport) {\n  // NOTE There is an sequence plug->unplug->…..-> plug if device is powering with pre-plugged device\n  if ( ehci_data.regs->portsc_bm.current_connect_status ) {\n    hcd_port_reset(rhport);\n    hcd_event_device_attach(rhport, true);\n  } else // device unplugged\n  {\n#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U))\n    // Disable disconnect detector\n    nxp_usbphy_disconn_detector_set(rhport, false);\n#endif\n    hcd_event_device_remove(rhport, true);\n  }\n}\n\n// Check queue head for potential transfer complete (successful or error)\nTU_ATTR_ALWAYS_INLINE static inline\nvoid qhd_xfer_complete_isr(ehci_qhd_t * qhd) {\n  hcd_dcache_invalidate(qhd, sizeof(ehci_qhd_t)); // HC may have updated the overlay\n  volatile ehci_qtd_t *qtd_overlay = &qhd->qtd_overlay;\n\n  // process non-active (completed) QHD with attached (scheduled) TD\n  if ( !qtd_overlay->active && qhd->attached_qtd != NULL ) {\n    xfer_result_t xfer_result;\n\n    if ( qtd_overlay->halted ) {\n      if (qtd_overlay->xact_err || qtd_overlay->err_count == 0 || qtd_overlay->buffer_err || qtd_overlay->babble_err) {\n        // Error count = 0 often occurs when device disconnected, or other bus-related error\n        // clear halted bit if not caused by STALL to allow more transfer\n        xfer_result = XFER_RESULT_FAILED;\n        qtd_overlay->halted = false;\n        TU_LOG3(\"  QHD xfer err count: %d\\r\\n\", qtd_overlay->err_count);\n        // TU_BREAKPOINT(); // TODO skip unplugged device\n      }else {\n        // no error bits are set, endpoint is halted due to STALL\n        xfer_result = XFER_RESULT_STALLED;\n      }\n    } else {\n      xfer_result = XFER_RESULT_SUCCESS;\n    }\n\n    ehci_qtd_t * volatile qtd = qhd->attached_qtd;\n    hcd_dcache_invalidate(qtd, sizeof(ehci_qtd_t)); // HC may have written back TD\n\n    uint8_t const dir = (qtd->pid == EHCI_PID_IN) ? 1 : 0;\n    uint32_t const xferred_bytes = qtd->expected_bytes - qtd->total_bytes;\n\n    // invalidate dcache if IN transfer with data\n    if (dir == 1 && qhd->attached_buffer != 0 && xferred_bytes > 0) {\n      hcd_dcache_invalidate((void*) qhd->attached_buffer, xferred_bytes);\n    }\n\n    // remove and free TD before invoking callback\n    qhd_remove_qtd(qhd);\n\n    // notify usbh\n    uint8_t const ep_addr = tu_edpt_addr(qhd->ep_number, dir);\n    hcd_event_xfer_complete(qhd->dev_addr, ep_addr, xferred_bytes, xfer_result, true);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline\nvoid proccess_async_xfer_isr(ehci_qhd_t * const list_head) {\n  ehci_qhd_t *qhd = list_head;\n\n  do {\n    qhd_xfer_complete_isr(qhd);\n    qhd = qhd_next(qhd);\n  } while ( qhd != list_head ); // async list traversal, stop if loop around\n}\n\nTU_ATTR_ALWAYS_INLINE static inline\nvoid process_period_xfer_isr(uint8_t rhport, uint32_t interval_ms) {\n  uint32_t const period_1ms_addr = (uint32_t) list_get_period_head(rhport, 1u);\n  ehci_link_t next_link = *list_get_period_head(rhport, interval_ms);\n\n  while (!next_link.terminate) {\n    if (interval_ms > 1 && period_1ms_addr == tu_align32(next_link.address)) {\n      // 1ms period list is end of list for all larger interval\n      break;\n    }\n\n    uintptr_t const entry_addr = tu_align32(next_link.address);\n\n    switch (next_link.type) {\n      case EHCI_QTYPE_QHD: {\n        ehci_qhd_t *qhd = (ehci_qhd_t *) entry_addr;\n        qhd_xfer_complete_isr(qhd);\n      }\n        break;\n\n      // TODO support hs/fs ISO\n      case EHCI_QTYPE_ITD:\n      case EHCI_QTYPE_SITD:\n      case EHCI_QTYPE_FSTN:\n      default:\n        break;\n    }\n\n    next_link = *list_next(&next_link);\n  }\n}\n\n//------------- Host Controller Driver's Interrupt Handler -------------//\nvoid hcd_int_handler(uint8_t rhport, bool in_isr) {\n  (void) in_isr;\n  ehci_registers_t* regs = ehci_data.regs;\n  uint32_t const int_status = regs->status;\n\n  if (int_status & EHCI_INT_MASK_HC_HALTED) {\n    // something seriously wrong, maybe forget to flush/invalidate cache\n    TU_BREAKPOINT();\n    TU_LOG1(\"  HC halted\\r\\n\");\n    return;\n  }\n\n  if (int_status & EHCI_INT_MASK_FRAMELIST_ROLLOVER) {\n    ehci_data.uframe_number += (FRAMELIST_SIZE << 3);\n    regs->status = EHCI_INT_MASK_FRAMELIST_ROLLOVER; // Acknowledge\n  }\n\n  if (int_status & EHCI_INT_MASK_PORT_CHANGE) {\n    // Including: Force port resume, over-current change, enable/disable change and connect status change.\n    uint32_t const port_status = regs->portsc & EHCI_PORTSC_MASK_W1C;\n    // print_portsc(regs);\n\n    if (regs->portsc_bm.connect_status_change) {\n      port_connect_status_change_isr(rhport);\n    }\n\n    regs->portsc |= port_status; // Acknowledge change bits in portsc\n    regs->status = EHCI_INT_MASK_PORT_CHANGE; // Acknowledge\n  }\n\n  // A USB transfer is completed (OK or error)\n  uint32_t const usb_int = int_status & (EHCI_INT_MASK_USB | EHCI_INT_MASK_ERROR);\n  if (usb_int) {\n    proccess_async_xfer_isr(list_get_async_head(rhport));\n\n    for ( uint32_t i = 1; i <= FRAMELIST_SIZE; i *= 2 ) {\n      process_period_xfer_isr(rhport, i);\n    }\n\n    regs->status = usb_int; // Acknowledge\n  }\n\n  //------------- There is some removed async previously -------------//\n  // need to place after EHCI_INT_MASK_NXP_ASYNC\n  if (int_status & EHCI_INT_MASK_ASYNC_ADVANCE) {\n    async_advance_isr(rhport);\n    regs->status = EHCI_INT_MASK_ASYNC_ADVANCE; // Acknowledge\n  }\n}\n\n//--------------------------------------------------------------------+\n// List Managing Helper\n//--------------------------------------------------------------------+\n\n// Get head of periodic list\nTU_ATTR_ALWAYS_INLINE static inline ehci_link_t* list_get_period_head(uint8_t rhport, uint32_t interval_ms) {\n  (void) rhport;\n  return (ehci_link_t*) &ehci_data.period_head_arr[ tu_log2( tu_min32(FRAMELIST_SIZE, interval_ms) ) ];\n}\n\n// Get head of async list\nTU_ATTR_ALWAYS_INLINE static inline ehci_qhd_t* list_get_async_head(uint8_t rhport) {\n  (void) rhport;\n  return qhd_control(0); // control qhd of dev0 is used as async head\n}\n\nTU_ATTR_ALWAYS_INLINE static inline ehci_link_t* list_next(ehci_link_t const *p_link) {\n  return (ehci_link_t*) tu_align32(p_link->address);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void list_insert(ehci_link_t *current, ehci_link_t *entry, uint8_t type) {\n  entry->address = current->address;\n  current->address = ((uint32_t) entry) | (type << 1);\n}\n\n// Remove a queue head from the list.\n// Per EHCI 4.8.2 the removed qhd's next is linked to list head (which always reachable by Host Controller)\n// TODO support iTD/siTD\nTU_ATTR_ALWAYS_INLINE static inline void list_remove(ehci_link_t* head, ehci_link_t* prev, ehci_qhd_t* qhd) {\n  // TODO deactivate all TD, wait for QHD to inactive before removal\n  prev->address = qhd->next.address;\n\n  // link the removed qhd's next to list head\n  qhd->next.address = ((uint32_t) head) | (EHCI_QTYPE_QHD << 1);\n\n  if (qhd_is_periodic(qhd)) {\n    // period list queue element is guarantee to be free in the next frame (1 ms)\n    qhd->used = 0;\n  } else {\n    // async list use async advance handshake. Mark as removing, will completely re-usable when async advance isr occurs\n    qhd->removing = 1;\n  }\n\n  hcd_dcache_clean(qhd, sizeof(ehci_qhd_t));\n  hcd_dcache_clean(prev, sizeof(ehci_qhd_t));\n}\n\n// Remove queue head belong to this device address\nstatic void list_remove_qhd_by_addr(ehci_link_t *list_head, uint8_t dev_addr, uint8_t ep_addr) {\n  ehci_link_t *prev = list_head;\n\n  while (prev && !prev->terminate) {\n    ehci_qhd_t *qhd = (ehci_qhd_t *) (uintptr_t) list_next(prev);\n\n    // done if loop back to head\n    if ((uintptr_t) qhd == (uintptr_t) list_head) {\n      break;\n    }\n\n    // ep_addr is 0xff means all endpoints of this device address\n    if (qhd->dev_addr == dev_addr &&\n        (ep_addr == TUSB_INDEX_INVALID_8 || qhd_ep_addr(qhd) == ep_addr)) {\n      list_remove(list_head, prev, qhd);\n    } else {\n      prev = list_next(prev);\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Queue Header helper\n//--------------------------------------------------------------------+\n\n// Get queue head for control transfer (always available)\nTU_ATTR_ALWAYS_INLINE static inline ehci_qhd_t* qhd_control(uint8_t dev_addr) {\n  return &ehci_data.control[dev_addr].qhd;\n}\n\n// Find a free queue head\nTU_ATTR_ALWAYS_INLINE static inline ehci_qhd_t *qhd_find_free(void) {\n  for (uint32_t i = 0; i < QHD_MAX; i++) {\n    if (!ehci_data.qhd_pool[i].used) {\n      return &ehci_data.qhd_pool[i];\n    }\n  }\n  return NULL;\n}\n\n// Next queue head link\nTU_ATTR_ALWAYS_INLINE static inline ehci_qhd_t *qhd_next(ehci_qhd_t const *p_qhd) {\n  return (ehci_qhd_t *) tu_align32(p_qhd->next.address);\n}\n\n// Get queue head from device + endpoint address\nstatic ehci_qhd_t *qhd_get_from_addr(uint8_t dev_addr, uint8_t ep_addr) {\n  if ( 0 == tu_edpt_number(ep_addr) ) {\n    return qhd_control(dev_addr);\n  }\n\n  ehci_qhd_t *qhd_pool = ehci_data.qhd_pool;\n\n  // protect qhd_pool since 'used' and 'removing' can be changed in isr\n  ehci_qhd_t *result = NULL;\n  usbh_spin_lock(false);\n  for (uint32_t i = 0; i < QHD_MAX; i++) {\n    if ((qhd_pool[i].dev_addr == dev_addr) &&\n        ep_addr == qhd_ep_addr(&qhd_pool[i]) &&\n        qhd_pool[i].used && !qhd_pool[i].removing) {\n      result = &qhd_pool[i];\n      break;\n    }\n  }\n  usbh_spin_unlock(false);\n\n  return result;\n}\n\n// Init queue head with endpoint descriptor\nstatic void qhd_init(ehci_qhd_t *p_qhd, uint8_t dev_addr, tusb_desc_endpoint_t const * ep_desc) {\n  // address 0 is used as async head, which always on the list --> cannot be cleared (ehci halted otherwise)\n  if (dev_addr != 0) {\n    tu_memclr(p_qhd, sizeof(ehci_qhd_t));\n  }\n\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(dev_addr, &bus_info);\n\n  uint8_t const xfer_type = ep_desc->bmAttributes.xfer;\n  uint8_t const interval = ep_desc->bInterval;\n\n  p_qhd->dev_addr           = dev_addr;\n  p_qhd->fl_inactive_next_xact = 0;\n  p_qhd->ep_number          = tu_edpt_number(ep_desc->bEndpointAddress);\n  p_qhd->ep_speed           = bus_info.speed;\n  p_qhd->data_toggle_control= (xfer_type == TUSB_XFER_CONTROL) ? 1 : 0;\n  p_qhd->head_list_flag     = (dev_addr == 0) ? 1 : 0; // addr0's endpoint is the static async list head\n  p_qhd->max_packet_size    = tu_edpt_packet_size(ep_desc);\n  p_qhd->fl_ctrl_ep_flag    = ((xfer_type == TUSB_XFER_CONTROL) && (p_qhd->ep_speed != TUSB_SPEED_HIGH))  ? 1 : 0;\n  p_qhd->nak_reload         = 0;\n\n  switch (xfer_type) {\n    case TUSB_XFER_CONTROL:\n    case TUSB_XFER_BULK:\n      p_qhd->int_smask = p_qhd->fl_int_cmask = 0;\n      break;\n\n    case TUSB_XFER_INTERRUPT:\n      if (TUSB_SPEED_HIGH == p_qhd->ep_speed) {\n        TU_ASSERT(interval <= 16, );\n        if (interval < 4) {\n          // sub millisecond interval\n          p_qhd->interval_ms = 0;\n          p_qhd->int_smask = (interval == 1) ? 0xff : // 0b11111111\n                             (interval == 2) ? 0xaa /* 0b10101010 */ : 0x44 /* 0b01000100 */;\n        } else {\n          p_qhd->interval_ms = (uint8_t) tu_min16(1 << (interval - 4), 255);\n          p_qhd->int_smask = TU_BIT(interval % 8);\n        }\n      } else {\n        TU_ASSERT(0 != interval, );\n        // Full/Low: 4.12.2.1 (EHCI) case 1 schedule start split at 1 us & complete split at 2,3,4 uframes\n        p_qhd->int_smask = 0x01;\n        p_qhd->fl_int_cmask = 0x1c; // 0b11100\n        p_qhd->interval_ms = interval;\n      }\n      break;\n\n    case TUSB_XFER_ISOCHRONOUS:\n      // TODO not support ISO yet\n      break;\n\n    default: break;\n  }\n\n  p_qhd->fl_hub_addr  = bus_info.hub_addr;\n  p_qhd->fl_hub_port  = bus_info.hub_port;\n  p_qhd->mult         = 1; // TODO not use high bandwidth/park mode yet\n\n  //------------- HCD Management Data -------------//\n  p_qhd->used         = 1;\n  p_qhd->removing     = 0;\n  p_qhd->attached_qtd = NULL;\n  p_qhd->pid = tu_edpt_dir(ep_desc->bEndpointAddress) == TUSB_DIR_IN ? EHCI_PID_IN : EHCI_PID_OUT; // PID for TD under this endpoint\n\n  //------------- active, but no TD list -------------//\n  p_qhd->qtd_overlay.halted              = 0;\n  p_qhd->qtd_overlay.next.terminate      = 1;\n  p_qhd->qtd_overlay.alternate.terminate = 1;\n\n  if (TUSB_XFER_BULK == xfer_type && p_qhd->ep_speed == TUSB_SPEED_HIGH && p_qhd->pid == EHCI_PID_OUT) {\n    p_qhd->qtd_overlay.ping_err = 1; // do PING for Highspeed Bulk OUT, EHCI section 4.11\n  }\n}\n\n// Attach a TD to queue head\nstatic void qhd_attach_qtd(ehci_qhd_t *qhd, ehci_qtd_t *qtd) {\n  qhd->attached_qtd = qtd;\n  qhd->attached_buffer = qtd->buffer[0];\n\n  // clean and invalidate cache before physically write\n  hcd_dcache_clean_invalidate(qtd, sizeof(ehci_qtd_t));\n\n  qhd->qtd_overlay.next.address = (uint32_t) qtd;\n  hcd_dcache_clean_invalidate(qhd, sizeof(ehci_qhd_t));\n}\n\n// Remove an attached TD from queue head\nstatic void qhd_remove_qtd(ehci_qhd_t *qhd) {\n  ehci_qtd_t * volatile qtd = qhd->attached_qtd;\n\n  qhd->attached_qtd = NULL;\n  qhd->attached_buffer = 0;\n  hcd_dcache_clean(qhd, sizeof(ehci_qhd_t));\n\n  qtd->used = 0; // free QTD\n  hcd_dcache_clean(qtd, sizeof(ehci_qtd_t));\n}\n\n//--------------------------------------------------------------------+\n// Queue TD helper\n//--------------------------------------------------------------------+\n\n// Get TD for control transfer (always available)\nTU_ATTR_ALWAYS_INLINE static inline ehci_qtd_t* qtd_control(uint8_t dev_addr) {\n  return &ehci_data.control[dev_addr].qtd;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline ehci_qtd_t *qtd_find_free(void) {\n  for (uint32_t i = 0; i < QTD_MAX; i++) {\n    if (!ehci_data.qtd_pool[i].used) return &ehci_data.qtd_pool[i];\n  }\n  return NULL;\n}\n\nstatic void qtd_init(ehci_qtd_t* qtd, void const* buffer, uint16_t total_bytes) {\n  tu_memclr(qtd, sizeof(ehci_qtd_t));\n  qtd->used                = 1;\n\n  qtd->next.terminate      = 1; // init to null\n  qtd->alternate.terminate = 1; // not used, always set to terminated\n  qtd->active              = 1;\n  qtd->err_count           = 3; // TODO 3 consecutive errors tolerance\n  qtd->data_toggle         = 0;\n  qtd->int_on_complete     = 1;\n  qtd->total_bytes         = total_bytes;\n  qtd->expected_bytes      = total_bytes;\n\n  qtd->buffer[0] = (uint32_t) buffer;\n  for(uint8_t i=1; i<5; i++) {\n    qtd->buffer[i] |= tu_align4k(qtd->buffer[i - 1] ) + 4096;\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/ehci/ehci.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_EHCI_H_\n#define TUSB_EHCI_H_\n\n\n/* Abbreviation\n * HC: Host Controller\n * HCD: Host Controller Driver\n * QHD: Queue Head for non-ISO transfer\n * QTD: Queue Transfer Descriptor for non-ISO transfer\n * ITD: Iso Transfer Descriptor for highspeed\n * SITD: Split ISO Transfer Descriptor for full-speed\n * SMASK: Start Split mask for Slipt Transaction\n * CMASK: Complete Split mask for Slipt Transaction\n*/\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// EHCI CONFIGURATION & CONSTANTS\n//--------------------------------------------------------------------+\n\n// TODO merge OHCI with EHCI\nenum {\n\tEHCI_MAX_ITD  = 4,\n  EHCI_MAX_SITD = 16\n};\n\n//--------------------------------------------------------------------+\n// EHCI Data Structure\n//--------------------------------------------------------------------+\nenum {\n  EHCI_QTYPE_ITD = 0 ,\n  EHCI_QTYPE_QHD     ,\n  EHCI_QTYPE_SITD    ,\n  EHCI_QTYPE_FSTN\n};\n\n/// EHCI PID\nenum {\n  EHCI_PID_OUT = 0 ,\n  EHCI_PID_IN      ,\n  EHCI_PID_SETUP\n};\n\n/// Link pointer\ntypedef union {\n  uint32_t address;\n  struct {\n    uint32_t terminate : 1;\n    uint32_t type      : 2;\n  };\n} ehci_link_t;\n\nTU_VERIFY_STATIC( sizeof(ehci_link_t) == 4, \"size is not correct\" );\n\n/// Queue Element Transfer Descriptor\n/// Qtd is used to declare overlay in ehci_qhd_t -> cannot be declared with TU_ATTR_ALIGNED(32)\ntypedef struct {\n  // Word 0 Next QTD Pointer\n  ehci_link_t next;\n\n  // Word 1 Alternate Next QTD Pointer (not used)\n  union {\n    ehci_link_t alternate;\n    struct {\n      uint32_t                : 5;\n      uint32_t used           : 1;\n      uint32_t                : 10;\n      uint32_t expected_bytes : 16;\n    };\n  };\n\n  // Word 2 qTQ Token\n  volatile uint32_t ping_err             : 1;  // For Highspeed: 0 Out, 1 Ping. Full/Slow used as error indicator\n  volatile uint32_t non_hs_split_state   : 1;  // Used by HC to track the state of split transaction\n  volatile uint32_t non_hs_missed_uframe : 1;  // HC misses a complete split transaction\n  volatile uint32_t xact_err             : 1;  // Error (Timeout, CRC, Bad PID ... )\n  volatile uint32_t babble_err           : 1;  // Babble detected, also set Halted bit to 1\n  volatile uint32_t buffer_err           : 1;  // Data overrun/underrun error\n  volatile uint32_t halted               : 1;  // Serious error or STALL received\n  volatile uint32_t active               : 1;  // Start transfer, clear by HC when complete\n\n  uint32_t pid                           : 2;  // 0: OUT, 1: IN, 2 Setup\n  volatile uint32_t err_count            : 2;  // Error Counter of consecutive errors\n  volatile uint32_t current_page         : 3;  // Index into the qTD buffer pointer list\n  uint32_t int_on_complete               : 1;  // Interrupt on complete\n  volatile uint32_t total_bytes          : 15; // Transfer bytes, decreased during transaction\n  volatile uint32_t data_toggle          : 1;  // Data Toggle bit\n\n  // Buffer Page Pointer List, Each element in the list is a 4K page aligned, physical memory address.\n  // The lower 12 bits in each pointer are reserved (except for the first one) as each memory pointer must reference the start of a 4K page\n  uint32_t buffer[5];\n} ehci_qtd_t;\n\nTU_VERIFY_STATIC( sizeof(ehci_qtd_t) == 32, \"size is not correct\" );\n\n/// Queue Head\ntypedef struct TU_ATTR_ALIGNED(32) {\n  // Word 0 Next QHD\n  ehci_link_t next;\n\n  // Word 1 Endpoint Characteristics\n  uint32_t dev_addr              : 7;  // device address\n  uint32_t fl_inactive_next_xact : 1;  // Only valid for Periodic with Full/Slow speed\n  uint32_t ep_number             : 4;  // EP number\n  uint32_t ep_speed              : 2;  // Full (0), Low (1), High (2)\n  uint32_t data_toggle_control   : 1;  // 0 use DT in qHD, 1 use DT in qTD\n  uint32_t head_list_flag        : 1;  // Head of the queue\n  uint32_t max_packet_size       : 11; // Max packet size\n  uint32_t fl_ctrl_ep_flag       : 1;  // 1 if is Full/Low speed control endpoint\n  uint32_t nak_reload            : 4;  // Used by HC\n\n  // Word 2 Endpoint Capabilities\n  uint32_t int_smask             : 8;  // Interrupt Schedule Mask\n  uint32_t fl_int_cmask          : 8;  // Split Completion Mask for Full/Slow speed\n  uint32_t fl_hub_addr           : 7;  // Hub Address for Full/Slow speed\n  uint32_t fl_hub_port           : 7;  // Hub Port for Full/Slow speed\n  uint32_t mult                  : 2;  // Transaction per micro frame\n\n  // Word 3 Current qTD Pointer\n  volatile uint32_t qtd_addr;\n\n  // Word 4-11 Transfer Overlay\n  volatile ehci_qtd_t qtd_overlay;\n\n  //--------------------------------------------------------------------+\n  /// Due to the fact QHD is 32 bytes aligned but occupies only 48 bytes\n  /// thus there are 16 bytes padding free that we can make use of.\n  //--------------------------------------------------------------------+\n  uint8_t used;\n  uint8_t removing;// removed from asyn list, waiting for async advance\n  uint8_t pid;\n  uint8_t interval_ms;// polling interval in frames (or millisecond)\n\n  uint8_t TU_RESERVED[4];\n\n  // Attached TD management, note usbh will only queue 1 TD per QHD.\n  // buffer for dcache invalidate since td's buffer is modified by HC and finding initial buffer address is not trivial\n  uint32_t attached_buffer;\n  ehci_qtd_t *volatile attached_qtd;\n} ehci_qhd_t;\nTU_VERIFY_STATIC( sizeof(ehci_qhd_t) == 64, \"size is not correct\" );\n\n/// Highspeed Isochronous Transfer Descriptor (section 3.3)\ntypedef struct TU_ATTR_ALIGNED(32) {\n  // Word 0: Next Link Pointer\n  ehci_link_t next;\n\n  // Word 1-8: iTD Transaction Status and Control List\n  struct {\n    // iTD Control\n    volatile uint32_t offset      : 12; // offset in bytes, from the beginning of a buffer.\n    volatile uint32_t page_select : 3;  // buffer page pointers the offset field in this slot should be concatenated to produce the starting memory address for this transaction. The valid range of values for this field is 0 to 6\n    uint32_t int_on_complete      : 1;  // If this bit is set to a one, it specifies that when this transaction completes, the Host Controller should issue an interrupt at the next interrupt threshold\n    volatile uint32_t length      : 12; // For an OUT, this field is the number of data bytes the host controller will send during the transaction. The host controller is not required to update this field to reflect the actual number of bytes transferred during the transfer\n                                        // For an IN, the initial value of the field is the number of bytes the host expects the endpoint to deliver. During the status update, the host controller writes back the number of bytes successfully received. The value in this register is the actual byte count\n    // iTD Status\n    volatile uint32_t error       : 1;  // Set to a one by the Host Controller during status update in the case where the host did not receive a valid response from the device (Timeout, CRC, Bad PID, etc.). This bit may only be set for isochronous IN transactions.\n    volatile uint32_t babble_err  : 1;  // Set to a 1 by the Host Controller during status update when a babble is detected during the transaction\n    volatile uint32_t buffer_err  : 1;  // Set to a 1 by the Host Controller during status update to indicate that the Host Controller is unable to keep up with the reception of incoming data (overrun) or is unable to supply data fast enough during transmission (underrun).\n    volatile uint32_t active      : 1;  // Set to 1 by software to enable the execution of an isochronous transaction by the Host Controller\n  } xact[8];\n\n  // Word 9-15  Buffer Page Pointer List (Plus)\n  uint32_t BufferPointer[7];\n\n  // FIXME: Store meta data into buffer pointer reserved for saving memory\n  //---------- HCD Area ----------\n  // uint32_t used;\n  // uint32_t IhdIdx;\n  // uint32_t reserved[6];\n} ehci_itd_t;\nTU_VERIFY_STATIC( sizeof(ehci_itd_t) == 64, \"size is not correct\" );\n\n/// Split (Full-Speed) Isochronous Transfer Descriptor\ntypedef struct TU_ATTR_ALIGNED(32) {\n  // Word 0: Next Link Pointer\n  ehci_link_t next;\n\n  // Word 1: siTD Endpoint Characteristics\n  uint32_t dev_addr    : 7; ///< This field selects the specific device serving as the data source or sink.\n  uint32_t             : 1; ///< reserved\n  uint32_t ep_number   : 4; ///< This 4-bit field selects the particular endpoint number on the device serving as the data source or sink.\n  uint32_t             : 4; ///< This field is reserved and should be set to zero.\n  uint32_t hub_addr    : 7; ///< This field holds the device address of the transaction translators’ hub.\n  uint32_t             : 1; ///< reserved\n  uint32_t port_number : 7; ///< This field is the port number of the recipient transaction translator.\n  uint32_t direction   : 1; ///<  0 = OUT; 1 = IN. This field encodes whether the full-speed transaction should be an IN or OUT.\n\n  // Word 2: Micro-frame Schedule Control\n  uint8_t int_smask   ; ///< This field (along with the Activeand SplitX-statefields in the Statusbyte) are used to determine during which micro-frames the host controller should execute complete-split transactions\n  uint8_t fl_int_cmask; ///< This field (along with the Activeand SplitX-statefields in the Statusbyte) are used to determine during which micro-frames the host controller should execute start-split transactions.\n  uint16_t reserved ; ///< reserved\n\n  // Word 3: siTD Transfer Status and Control\n  // Status [7:0] TODO identical to qTD Token'status --> refactor later\n  volatile uint32_t                 : 1  ; // reserved\n  volatile uint32_t split_state     : 1  ;\n  volatile uint32_t missed_uframe   : 1  ;\n  volatile uint32_t xact_err        : 1  ;\n  volatile uint32_t babble_err      : 1  ;\n  volatile uint32_t buffer_err      : 1  ;\n  volatile uint32_t error           : 1  ;\n  volatile uint32_t active          : 1  ;\n  // Micro-frame Schedule Control\n  volatile uint32_t cmask_progress  : 8  ; ///< This field is used by the host controller to record which split-completes have been executed. See Section 4.12.3.3.2 for behavioral requirements.\n  volatile uint32_t total_bytes     : 10 ; ///< This field is initialized by software to the total number of bytes expected in this transfer. Maximum value is 1023\n  volatile uint32_t                 : 4  ; ///< reserved\n  volatile uint32_t page_select     : 1  ; ///< Used to indicate which data page pointer should be concatenated with the CurrentOffsetfield to construct a data buffer pointer\n           uint32_t int_on_complete : 1  ; ///< Do not interrupt when transaction is complete. 1 = Do interrupt when transaction is complete\n           uint32_t                 : 0  ; // padding to the end of current storage unit\n\n  /// Word 4-5: Buffer Pointer List\n  uint32_t buffer[2];    // buffer[1] TP: Transaction Position - T-Count: Transaction Count\n\n  /*---------- Word 6 ----------*/\n  ehci_link_t back;\n\n  /// SITD is 32-byte aligned but occupies only 28 --> 4 bytes for storing extra data\n  uint8_t used;\n  uint8_t ihd_idx;\n  uint8_t reserved2[2];\n} ehci_sitd_t;\n\nTU_VERIFY_STATIC( sizeof(ehci_sitd_t) == 32, \"size is not correct\" );\n\n//--------------------------------------------------------------------+\n// EHCI Operational Register\n//--------------------------------------------------------------------+\nenum {\n  // Bit 0-5 has maskable in interrupt enabled register\n  EHCI_INT_MASK_USB                   = TU_BIT(0),\n  EHCI_INT_MASK_ERROR                 = TU_BIT(1),\n  EHCI_INT_MASK_PORT_CHANGE           = TU_BIT(2),\n  EHCI_INT_MASK_FRAMELIST_ROLLOVER    = TU_BIT(3),\n  EHCI_INT_MASK_PCI_HOST_SYSTEM_ERROR = TU_BIT(4),\n  EHCI_INT_MASK_ASYNC_ADVANCE         = TU_BIT(5),\n\n  EHCI_INT_MASK_NXP_SOF               = TU_BIT(7),\n\n  EHCI_INT_MASK_HC_HALTED             = TU_BIT(12),\n  EHCI_INT_MASK_RECLAIMATION          = TU_BIT(13),\n  EHCI_INT_MASK_PERIODIC_SCHED_STATUS = TU_BIT(14),\n  EHCI_INT_MASK_ASYNC_SCHED_STATUS    = TU_BIT(15),\n\n  EHCI_INT_MASK_ALL                   =\n      EHCI_INT_MASK_USB | EHCI_INT_MASK_ERROR | EHCI_INT_MASK_PORT_CHANGE |\n      EHCI_INT_MASK_FRAMELIST_ROLLOVER | EHCI_INT_MASK_PCI_HOST_SYSTEM_ERROR |\n      EHCI_INT_MASK_ASYNC_ADVANCE | EHCI_INT_MASK_NXP_SOF\n};\n\nenum {\n  EHCI_USBCMD_FRAMELIST_SIZE_SHIFT              = 2, // [2..3]\n  EHCI_USBCMD_CHIPIDEA_FRAMELIST_SIZE_MSB_SHIFT = 15,\n  EHCI_USBCMD_INTERRUPT_THRESHOLD_SHIFT         = 16\n};\n\nenum {\n  EHCI_USBCMD_RUN_STOP                       = TU_BIT(0), // [0..0] 1 = Run, 0 = Stop\n  EHCI_USBCMD_HCRESET                        = TU_BIT(1), // [1..1] SW write 1 to reset HC, clear by HC when complete\n  EHCI_USBCMD_PERIOD_SCHEDULE_ENABLE         = TU_BIT(4), // [4..4] Enable periodic schedule\n  EHCI_USBCMD_ASYNC_SCHEDULE_ENABLE          = TU_BIT(5), // [5..5] Enable async schedule\n  EHCI_USBCMD_INTR_ON_ASYNC_ADVANCE_DOORBELL = TU_BIT(6), // [6..6] Tell HC to interrupt next time it advances async list. Clear by HC\n};\n\nenum {\n  EHCI_PORTSC_MASK_CURRENT_CONNECT_STATUS = TU_BIT(0),\n  EHCI_PORTSC_MASK_CONNECT_STATUS_CHANGE  = TU_BIT(1),\n  EHCI_PORTSC_MASK_PORT_EANBLED           = TU_BIT(2),\n  EHCI_PORTSC_MASK_PORT_ENABLE_CHANGE     = TU_BIT(3),\n  EHCI_PORTSC_MASK_OVER_CURRENT_CHANGE    = TU_BIT(5),\n  EHCI_PORTSC_MASK_FORCE_RESUME           = TU_BIT(6),\n  EHCI_PORTSC_MASK_PORT_SUSPEND           = TU_BIT(7),\n  EHCI_PORTSC_MASK_PORT_RESET             = TU_BIT(8),\n  EHCI_PORTSC_MASK_PORT_POWER             = TU_BIT(12),\n\n  EHCI_PORTSC_MASK_W1C =\n    EHCI_PORTSC_MASK_CONNECT_STATUS_CHANGE |\n    EHCI_PORTSC_MASK_PORT_ENABLE_CHANGE |\n    EHCI_PORTSC_MASK_OVER_CURRENT_CHANGE\n};\n\ntypedef volatile struct {\n  union {\n    uint32_t command; // 0x00\n\n    struct {\n      uint32_t run_stop               : 1 ; ///< 1=Run. 0=Stop\n      uint32_t reset                  : 1 ; ///< SW write 1 to reset HC, clear by HC when complete\n      uint32_t framelist_size         : 2 ; ///< Frame List size 0: 1024, 1: 512, 2: 256\n      uint32_t periodic_enable        : 1 ; ///< This bit controls whether the host controller skips processing the Periodic Schedule. Values mean: 0b Do not process the Periodic Schedule 1b Use the PERIODICLISTBASE register to access the Periodic Schedule.\n      uint32_t async_enable           : 1 ; ///< This bit controls whether the host controller skips processing the Asynchronous Schedule. Values mean: 0b Do not process the Asynchronous Schedule 1b Use the ASYNCLISTADDR register to access the Asynchronous Schedule.\n      uint32_t async_adv_doorbell     : 1 ; ///< Tell HC to interrupt next time it advances async list. Clear by HC\n      uint32_t light_reset            : 1 ; ///< Reset HC without affecting ports state\n      uint32_t async_park_count       : 2 ; ///< not used by tinyusb\n      uint32_t                        : 1 ;\n      uint32_t async_park_enable      : 1 ; ///< Enable park mode, not used by tinyusb\n      uint32_t                        : 3 ;\n      uint32_t nxp_framelist_size_msb : 1 ; ///< NXP customized : Bit 2 of the Frame List Size bits \\n 011b: 128 elements \\n 100b: 64 elements \\n 101b: 32 elements \\n 110b: 16 elements \\n 111b: 8 elements\n      uint32_t int_threshold          : 8 ; ///< Default 08h. Interrupt rate in unit of micro frame\n    }command_bm;\n  };\n\n  union {\n    uint32_t status; // 0x04\n\n    struct {\n      uint32_t usb                   : 1  ; ///< qTD with IOC is retired\n      uint32_t usb_error             : 1  ; ///< qTD retired due to error\n      uint32_t port_change_detect    : 1  ; ///< Set when PortOwner or ForcePortResume change from 0 -> 1\n      uint32_t framelist_rollover    : 1  ; ///< R/WC The Host Controller sets this bit to a one when the Frame List Index(see Section 2.3.4) rolls over from its maximum value to zero. The exact value at which the rollover occurs depends on the frame list size. For example, if the frame list size (as programmed in the Frame List Sizefield of the USBCMD register) is 1024, the Frame Index Registerrolls over every time FRINDEX[13] toggles. Similarly, if the size is 512, the Host Controller sets this bit to a one every time FRINDEX[12] toggles.\n      uint32_t pci_host_system_error : 1  ; ///< R/WC (not used by NXP) The Host Controller sets this bit to 1 when a serious error occurs during a host system access involving the Host Controller module. In a PCI system, conditions that set this bit to 1 include PCI Parity error, PCI Master Abort, and PCI Target Abort. When this error occurs, the Host Controller clears the Run/Stop bit in the Command register to prevent further execution of the scheduled TDs.\n      uint32_t async_adv             : 1  ; ///< Async Advance interrupt\n      uint32_t                       : 1  ;\n      uint32_t nxp_int_sof           : 1  ; ///< NXP customized:  this bit will be set every 125us and can be used by host controller driver as a time base.\n      uint32_t                       : 4  ;\n      uint32_t hc_halted             : 1  ; ///< Opposite value to run_stop bit.\n      uint32_t reclamation           : 1  ; ///< Used to detect empty async shecudle\n      uint32_t periodic_status       : 1  ; ///< Periodic schedule status\n      uint32_t async_status          : 1  ; ///< Async schedule status\n      uint32_t                       : 2  ;\n      uint32_t nxp_int_async         : 1  ; ///< NXP customized: This bit is set by the Host Controller when the cause of an interrupt is a completion of a USB transaction where the Transfer Descriptor (TD) has an interrupt on complete (IOC) bit set and the TD was from the asynchronous schedule. This bit is also set by the Host when a short packet is detected and the packet is on the asynchronous schedule.\n      uint32_t nxp_int_period        : 1  ; ///< NXP customized: This bit is set by the Host Controller when the cause of an interrupt is a completion of a USB transaction where the Transfer Descriptor (TD) has an interrupt on complete (IOC) bit set and the TD was from the periodic schedule.\n      uint32_t                       : 12 ;\n    }status_bm;\n  };\n\n  union{\n    uint32_t inten; // 0x08\n\n    struct {\n      uint32_t usb                   : 1  ;\n      uint32_t usb_error             : 1  ;\n      uint32_t port_change_detect    : 1  ;\n      uint32_t framelist_rollover    : 1  ;\n      uint32_t pci_host_system_error : 1  ;\n      uint32_t async_adv             : 1  ;\n      uint32_t                       : 1  ;\n      uint32_t nxp_int_sof           : 1  ;\n      uint32_t                       : 10 ;\n      uint32_t nxp_int_async         : 1  ;\n      uint32_t nxp_int_period        : 1  ;\n      uint32_t                       : 12 ;\n    }inten_bm;\n  };\n\n  uint32_t frame_index        ; ///< 0x0C Micro frame counter\n  uint32_t ctrl_ds_seg        ; ///< 0x10 Control Data Structure Segment\n  uint32_t periodic_list_base ; ///< 0x14 Beginning address of perodic frame list\n  uint32_t async_list_addr    ; ///< 0x18 Address of next async QHD to be executed\n  uint32_t nxp_tt_control     ; ///< nxp embedded transaction translator (reserved by EHCI specs)\n  uint32_t reserved[8]        ;\n  uint32_t config_flag        ; ///< 0x40 not used by NXP\n\n  union {\n    // mixed with RW and R/WC bits, care should be taken when writing to this register\n    uint32_t portsc           ; ///< 0x44 port status and control\n    const struct {\n      uint32_t current_connect_status      : 1; ///< 00: 0: No device, 1: Device is present on port\n      uint32_t connect_status_change       : 1; ///< 01: [R/WC] Change in Current Connect Status\n      uint32_t port_enabled                : 1; ///< 02: Ports can only be enabled by HC as a part of the reset and enable. SW can write 0 to disable\n      uint32_t port_enable_change          : 1; ///< 03: [R/WC] Port Enabled has changed\n      uint32_t over_current_active         : 1; ///< 04: Port has an over-current condition\n      uint32_t over_current_change         : 1; ///< 05: [R/WC] Change to Over-current Active\n      uint32_t force_port_resume           : 1; ///< 06: Resume detected/driven on port. This functionality defined for manipulating this bit depends on the value of the Suspend bit.\n      uint32_t suspend                     : 1; ///< 07: Port in suspend state\n      uint32_t port_reset                  : 1; ///< 08: 1=Port is in Reset. 0=Port is not in Reset\n      uint32_t nxp_highspeed_status        : 1; ///< 09: NXP customized: 0=connected to the port is not in High-speed mode, 1=connected to the port is in High-speed mode\n      uint32_t line_status                 : 2; ///< 10-11: D+/D- state: 00: SE0, 10: J-state, 01: K-state\n      uint32_t port_power                  : 1; ///< 12: 0= power off, 1= power on\n      uint32_t port_owner                  : 1; ///< 13: not used by NXP\n      uint32_t port_indicator_control      : 2; ///< 14-15: 00b: off, 01b: Amber, 10b: green, 11b: undefined\n      uint32_t port_test_control           : 4; ///< 16-19: Port test mode, not used by tinyusb\n      uint32_t wake_on_connect_enable      : 1; ///< 20: Enables device connects as wake-up events\n      uint32_t wake_on_disconnect_enable   : 1; ///< 21: Enables device disconnects as wake-up events\n      uint32_t wake_on_over_current_enable : 1; ///< 22: Enables over-current conditions as wake-up events\n      uint32_t nxp_phy_clock_disable       : 1; ///< 23: NXP customized: the PHY can be put into Low Power Suspend – Clock Disable when the downstream device has been put into suspend mode or when no downstream device is connected. Low power suspend is completely under the control of software. 0: enable PHY clock, 1: disable PHY clock\n      uint32_t nxp_port_force_fullspeed    : 1; ///< 24: NXP customized: Writing this bit to a 1 will force the port to only connect at Full Speed. It disables the chirp sequence that allowsthe port to identify itself as High Speed. This is useful for testing FS configurations with a HS host, hub or device.\n      uint32_t TU_RESERVED                 : 1; ///< 25\n      uint32_t nxp_port_speed              : 2; ///< 26-27: NXP customized: This register field indicates the speed atwhich the port is operating. For HS mode operation in the host controllerand HS/FS operation in the device controller the port routing steers data to the Protocol engine. For FS and LS mode operation in the host controller, the port routing steers data to the Protocol Engine w/ Embedded Transaction Translator. 0x0: Fullspeed, 0x1: Lowspeed, 0x2: Highspeed\n      uint32_t TU_RESERVED                 : 4;\n    }portsc_bm;\n  };\n} ehci_registers_t;\n\n//--------------------------------------------------------------------+\n// Capability Registers\n//--------------------------------------------------------------------+\ntypedef volatile struct {\n  uint8_t caplength;   // 0x00\n  uint8_t TU_RESERVED; // 0x01\n  uint16_t hciversion; // 0x02\n\n  union {\n    uint32_t hcsparams; // 0x04\n    struct {\n      uint32_t num_ports          : 4; // [00:03]\n      uint32_t port_power_control : 1; // [04]\n      uint32_t TU_RESERVED        : 2; // [05:06]\n      uint32_t port_route_rule    : 1; // [07]\n      uint32_t n_pcc              : 4; // [08:11] Number of Ports per Companion Controller\n      uint32_t n_cc               : 4; // [12:15] Number of Companion Controllers\n      uint32_t port_ind           : 1; // [16] Port Indicators\n      uint32_t TU_RESERVED        : 3; // [17:19]\n      uint32_t n_ptt              : 4; // [20:23] ChipIdea: Number of Ports per Transaction Translator\n      uint32_t n_tt               : 4; // [24:27] ChipIdea: Number of Transaction Translators\n      uint32_t TU_RESERVED        : 4; // [28:31]\n    } hcsparams_bm;\n  };\n\n  union {\n    uint32_t hccparams; // 0x08\n    struct {\n      uint32_t addr_64bit                   : 1; // [00] 64-bit Addressing Capability\n      uint32_t programmable_frame_list_flag : 1; // [01] Programmable Frame List Flag\n      uint32_t async_park_cap               : 1; // [02] Asynchronous Schedule Park Capability\n      uint32_t TU_RESERVED                  : 1; // [03]\n      uint32_t iso_schedule_threshold       : 4; // [4:7] Isochronous Scheduling Threshold\n      uint32_t eecp                         : 8; // [8:15] EHCI Extended Capabilities Pointer\n      uint32_t TU_RESERVED                  : 16;// [16:31]\n    } hccparams_bm;\n  };\n\n  uint32_t hcsp_portroute; // 0x0C HCSP Port Route Register\n} ehci_cap_registers_t;\n\nTU_VERIFY_STATIC(sizeof(ehci_cap_registers_t) == 16, \"size is not correct\");\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_EHCI_H_ */\n"
  },
  {
    "path": "src/portable/ehci/ehci_api.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_EHCI_API_H_\n#define TUSB_EHCI_API_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// API Implemented by EHCI\n//--------------------------------------------------------------------+\n\n// Initialize EHCI driver\nbool ehci_init(uint8_t rhport, uint32_t capability_reg, uint32_t operatial_reg);\n\n// De-initialize EHCI driver\nbool ehci_deinit(uint8_t rhport);\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/mentor/musb/dcd_musb.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Koji KITAYAMA\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_MUSB)\n\n#define MUSB_DEBUG 2\n#define MUSB_REGS(rhport)   ((musb_regs_t*) MUSB_BASES[rhport])\n\n#include \"musb_type.h\"\n#include \"device/dcd.h\"\n\n// Following symbols must be defined by port header\n// - musb_dcd_int_enable/disable/clear/get_enable\n// - musb_dcd_int_handler_enter/exit\n#if defined(TUP_USBIP_MUSB_TI)\n  #include \"musb_ti.h\"\n#elif defined(TUP_USBIP_MUSB_ADI)\n  #include \"musb_max32.h\"\n#else\n  #error \"Unsupported MCU\"\n#endif\n\n/*------------------------------------------------------------------\n * MACRO TYPEDEF CONSTANT ENUM DECLARATION\n *------------------------------------------------------------------*/\n\n#define REQUEST_TYPE_INVALID  (0xFFu)\n\ntypedef union {\n  volatile uint8_t   u8;\n  volatile uint16_t  u16;\n  volatile uint32_t  u32;\n} hw_fifo_t;\n\ntypedef struct TU_ATTR_PACKED\n{\n  void      *buf;      /* the start address of a transfer data buffer */\n  uint16_t  length;    /* the number of bytes in the buffer */\n  uint16_t  remaining; /* the number of bytes remaining in the buffer */\n} pipe_state_t;\n\ntypedef struct\n{\n  union {\n    tusb_control_request_t setup_packet;\n    uint32_t setup_buffer[2];\n  };\n  uint16_t     remaining_ctrl; /* The number of bytes remaining in data stage of control transfer. */\n  int8_t       status_out;\n  pipe_state_t pipe0;\n  pipe_state_t pipe[2][TUP_DCD_ENDPOINT_MAX-1];   /* pipe[direction][endpoint number - 1] */\n  uint16_t     pipe_buf_is_fifo[2]; /* Bitmap. Each bit means whether 1:TU_FIFO or 0:POD. */\n} dcd_data_t;\n\nstatic dcd_data_t _dcd;\n\n//--------------------------------------------------------------------\n// HW FIFO Helper\n// Note: Index register is already set by caller\n//--------------------------------------------------------------------\n\n#if MUSB_CFG_DYNAMIC_FIFO\n\n// musb is configured to use dynamic FIFO sizing.\n// FF Size is encodded: 1 << (fifo_size[3:0] + 3) = 8 << fifo_size[3:0]\n// FF Address is 8*ff_addr[12:0]\n// First 64 bytes are reserved for EP0\nstatic uint32_t alloced_fifo_bytes;\n\n// ffsize is log2(mps) - 3 (round up)\nTU_ATTR_ALWAYS_INLINE static inline uint8_t hwfifo_byte2size(uint16_t nbytes) {\n  uint8_t ffsize = 28 - tu_min8(28, __builtin_clz(nbytes));\n  if ((8u << ffsize) < nbytes) {\n    ++ffsize;\n  }\n  return ffsize;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void hwfifo_reset(musb_regs_t* musb, unsigned epnum, unsigned is_rx) {\n  (void) epnum;\n  musb->fifo_size[is_rx] = 0;\n  musb->fifo_addr[is_rx] = 0;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool hwfifo_config(musb_regs_t* musb, unsigned epnum, unsigned is_rx, unsigned mps,\n                                                       bool double_packet) {\n  (void) epnum;\n  uint8_t ffsize = hwfifo_byte2size(mps);\n  mps = 8 << ffsize; // round up to the next power of 2\n\n  if (double_packet) {\n    ffsize |= MUSB_FIFOSZ_DOUBLE_PACKET;\n    mps <<= 1;\n  }\n\n  TU_ASSERT(alloced_fifo_bytes + mps <= MUSB_CFG_DYNAMIC_FIFO_SIZE);\n  musb->fifo_addr[is_rx] = alloced_fifo_bytes / 8;\n  musb->fifo_size[is_rx] = ffsize;\n\n  alloced_fifo_bytes += mps;\n  return true;\n}\n\n#else\n\nTU_ATTR_ALWAYS_INLINE static inline void hwfifo_reset(musb_regs_t* musb, unsigned epnum, unsigned is_rx) {\n  (void) musb; (void) epnum; (void) is_rx;\n  // nothing to do for static FIFO\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool hwfifo_config(musb_regs_t* musb, unsigned epnum, unsigned is_rx, unsigned mps,\n                                                       bool double_packet) {\n  (void) epnum; (void) mps;\n  if (!double_packet) {\n    #if defined(TUP_USBIP_MUSB_ADI)\n    musb->indexed_csr.maxp_csr[is_rx].csrh |= MUSB_CSRH_DISABLE_DOUBLE_PACKET(is_rx);\n    #else\n    if (is_rx) {\n      musb->rx_doulbe_packet_disable |= 1u << epnum;\n    } else {\n      musb->tx_double_packet_disable |= 1u << epnum;\n    }\n    #endif\n  }\n\n  return true;\n}\n\n#endif\n\n// Flush FIFO and clear data toggle\nTU_ATTR_ALWAYS_INLINE static inline void hwfifo_flush(musb_regs_t* musb, unsigned epnum, unsigned is_rx, bool clear_dtog) {\n  (void) epnum;\n  const uint8_t csrl_dtog = clear_dtog ? MUSB_CSRL_CLEAR_DATA_TOGGLE(is_rx) : 0;\n  musb_ep_maxp_csr_t* maxp_csr = &musb->indexed_csr.maxp_csr[is_rx];\n  // may need to flush twice for double packet\n  for (unsigned i=0; i<2; i++) {\n    if (maxp_csr->csrl & MUSB_CSRL_PACKET_READY(is_rx)) {\n      maxp_csr->csrl = MUSB_CSRL_FLUSH_FIFO(is_rx) | csrl_dtog;\n    }\n  }\n}\n\nstatic void process_setup_packet(uint8_t rhport) {\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n\n  // Read setup packet\n  _dcd.setup_buffer[0] = musb_regs->fifo[0];\n  _dcd.setup_buffer[1] = musb_regs->fifo[0];\n\n  _dcd.pipe0.buf       = NULL;\n  _dcd.pipe0.length    = 0;\n  _dcd.pipe0.remaining = 0;\n  dcd_event_setup_received(rhport, (const uint8_t*)(uintptr_t)&_dcd.setup_packet, true);\n\n  const unsigned len    = _dcd.setup_packet.wLength;\n  _dcd.remaining_ctrl   = len;\n  const unsigned dir_in = tu_edpt_dir(_dcd.setup_packet.bmRequestType);\n  /* Clear RX FIFO and reverse the transaction direction */\n  if (len && dir_in) {\n    musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, 0);\n    ep_csr->csr0l = MUSB_CSRL0_RXRDYC;\n  }\n}\n\nstatic bool handle_xfer_in(uint8_t rhport, uint_fast8_t ep_addr) {\n  unsigned epnum = tu_edpt_number(ep_addr);\n  unsigned epnum_minus1 = epnum - 1;\n  pipe_state_t  *pipe = &_dcd.pipe[tu_edpt_dir(ep_addr)][epnum_minus1];\n  const unsigned rem  = pipe->remaining;\n\n  if (rem == 0 && pipe->length > 0) {\n    pipe->buf = NULL;\n    return true;\n  }\n\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, epnum);\n  const unsigned mps = ep_csr->tx_maxp;\n  const unsigned len = TU_MIN(mps, rem);\n  void          *buf = pipe->buf;\n  volatile void *fifo_ptr = &musb_regs->fifo[epnum];\n  // TU_LOG1(\"   %p mps %d len %d rem %d\\r\\n\", buf, mps, len, rem);\n  if (len) {\n    if (_dcd.pipe_buf_is_fifo[TUSB_DIR_IN] & TU_BIT(epnum_minus1)) {\n      tu_hwfifo_write_from_fifo(fifo_ptr, (tu_fifo_t *)buf, len, NULL);\n    } else {\n      tu_hwfifo_write(fifo_ptr, buf, len, NULL);\n      pipe->buf       = (uint8_t*)buf + len;\n    }\n    pipe->remaining = rem - len;\n  }\n  ep_csr->tx_csrl = MUSB_TXCSRL1_TXRDY;\n  // TU_LOG1(\" TXCSRL%d = %x %d\\r\\n\", epnum, ep_csr->tx_csrl, rem - len);\n  return false;\n}\n\nstatic bool handle_xfer_out(uint8_t rhport, uint_fast8_t ep_addr)\n{\n  unsigned epnum = tu_edpt_number(ep_addr);\n  unsigned epnum_minus1 = epnum - 1;\n  pipe_state_t  *pipe = &_dcd.pipe[tu_edpt_dir(ep_addr)][epnum_minus1];\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, epnum);\n  // TU_LOG1(\" RXCSRL%d = %x\\r\\n\", epnum_minus1 + 1, ep_csr->rx_csrl);\n\n  TU_ASSERT(ep_csr->rx_csrl & MUSB_RXCSRL1_RXRDY);\n\n  const unsigned mps = ep_csr->rx_maxp;\n  const unsigned rem = pipe->remaining;\n  const unsigned vld = ep_csr->rx_count;\n  const unsigned len = TU_MIN(TU_MIN(rem, mps), vld);\n  void          *buf = pipe->buf;\n  volatile void *fifo_ptr = &musb_regs->fifo[epnum];\n  if (len) {\n    if (_dcd.pipe_buf_is_fifo[TUSB_DIR_OUT] & TU_BIT(epnum_minus1)) {\n      tu_hwfifo_read_to_fifo(fifo_ptr, (tu_fifo_t *)buf, len, NULL);\n    } else {\n      tu_hwfifo_read(fifo_ptr, buf, len, NULL);\n      pipe->buf       = (uint8_t*)buf + len;\n    }\n    pipe->remaining = rem - len;\n  }\n  if ((len < mps) || (rem == len)) {\n    pipe->buf = NULL;\n    return NULL != buf;\n  }\n  ep_csr->rx_csrl = 0; /* Clear RXRDY bit */\n  return false;\n}\n\nstatic bool edpt_n_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)\n{\n  unsigned epnum = tu_edpt_number(ep_addr);\n  unsigned epnum_minus1 = epnum - 1;\n  unsigned dir_in       = tu_edpt_dir(ep_addr);\n\n  pipe_state_t *pipe = &_dcd.pipe[dir_in][epnum_minus1];\n  pipe->buf          = buffer;\n  pipe->length       = total_bytes;\n  pipe->remaining    = total_bytes;\n\n  if (dir_in) {\n    handle_xfer_in(rhport, ep_addr);\n  } else {\n    musb_regs_t* musb_regs = MUSB_REGS(rhport);\n    musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, epnum);\n    if (ep_csr->rx_csrl & MUSB_RXCSRL1_RXRDY) ep_csr->rx_csrl = 0;\n  }\n  return true;\n}\n\nstatic bool edpt0_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)\n{\n  (void)rhport;\n  TU_ASSERT(total_bytes <= 64); /* Current implementation supports for only up to 64 bytes. */\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, 0);\n  const unsigned req = _dcd.setup_packet.bmRequestType;\n  TU_ASSERT(req != REQUEST_TYPE_INVALID || total_bytes == 0);\n\n  if (req == REQUEST_TYPE_INVALID || _dcd.status_out) {\n    /* STATUS OUT stage.\n     * MUSB controller automatically handles STATUS OUT packets without\n     * software helps. We do not have to do anything. And STATUS stage\n     * may have already finished and received the next setup packet\n     * without calling this function, so we have no choice but to\n     * invoke the callback function of status packet here. */\n    // TU_LOG1(\" STATUS OUT ep_csr->csr0l = %x\\r\\n\", ep_csr->csr0l);\n    _dcd.status_out = 0;\n    if (req == REQUEST_TYPE_INVALID) {\n      dcd_event_xfer_complete(rhport, ep_addr, total_bytes, XFER_RESULT_SUCCESS, false);\n    } else {\n      /* The next setup packet has already been received, it aborts\n       * invoking callback function to avoid confusing TUSB stack. */\n      TU_LOG1(\"Drop CONTROL_STAGE_ACK\\r\\n\");\n    }\n    return true;\n  }\n  const unsigned dir_in = tu_edpt_dir(ep_addr);\n  if (tu_edpt_dir(req) == dir_in) { /* DATA stage */\n    TU_ASSERT(total_bytes <= _dcd.remaining_ctrl);\n    const unsigned rem = _dcd.remaining_ctrl;\n    const unsigned len = TU_MIN(TU_MIN(rem, 64), total_bytes);\n    volatile void *fifo_ptr = &musb_regs->fifo[0];\n    if (dir_in) {\n      tu_hwfifo_write(fifo_ptr, buffer, len, NULL);\n\n      _dcd.pipe0.buf       = buffer + len;\n      _dcd.pipe0.length    = len;\n      _dcd.pipe0.remaining = 0;\n\n      _dcd.remaining_ctrl  = rem - len;\n      if ((len < 64) || (rem == len)) {\n        _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID; /* Change to STATUS/SETUP stage */\n        _dcd.status_out = 1;\n        /* Flush TX FIFO and reverse the transaction direction. */\n        ep_csr->csr0l = MUSB_CSRL0_TXRDY | MUSB_CSRL0_DATAEND;\n      } else {\n        ep_csr->csr0l = MUSB_CSRL0_TXRDY; /* Flush TX FIFO to return ACK. */\n      }\n      // TU_LOG1(\" IN ep_csr->csr0l = %x\\r\\n\", ep_csr->csr0l);\n    } else {\n      // TU_LOG1(\" OUT ep_csr->csr0l = %x\\r\\n\", ep_csr->csr0l);\n      _dcd.pipe0.buf       = buffer;\n      _dcd.pipe0.length    = len;\n      _dcd.pipe0.remaining = len;\n      ep_csr->csr0l = MUSB_CSRL0_RXRDYC; /* Clear RX FIFO to return ACK. */\n    }\n  } else if (dir_in) {\n    // TU_LOG1(\" STATUS IN ep_csr->csr0l  = %x\\r\\n\", ep_csr->csr0l);\n    _dcd.pipe0.buf = NULL;\n    _dcd.pipe0.length    = 0;\n    _dcd.pipe0.remaining = 0;\n    /* Clear RX FIFO and reverse the transaction direction */\n    ep_csr->csr0l = MUSB_CSRL0_RXRDYC | MUSB_CSRL0_DATAEND;\n  }\n  return true;\n}\n\nstatic void process_ep0(uint8_t rhport)\n{\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, 0);\n  uint_fast8_t csrl = ep_csr->csr0l;\n\n  // TU_LOG1(\" EP0 ep_csr->csr0l = %x\\r\\n\", csrl);\n  // 21.1.5: endpoint 0 service routine as peripheral\n\n  if (csrl & MUSB_CSRL0_STALLED) {\n    /* Returned STALL packet to HOST. */\n    ep_csr->csr0l = 0; /* Clear STALL */\n    return;\n  }\n\n  unsigned req = _dcd.setup_packet.bmRequestType;\n  if (csrl & MUSB_CSRL0_SETEND) {\n    TU_LOG1(\"   ABORT by the next packets\\r\\n\");\n    ep_csr->csr0l = MUSB_CSRL0_SETENDC;\n    if (req != REQUEST_TYPE_INVALID && _dcd.pipe0.buf) {\n      /* DATA stage was aborted by receiving STATUS or SETUP packet. */\n      _dcd.pipe0.buf = NULL;\n      _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;\n      dcd_event_xfer_complete(rhport,\n                              req & TUSB_DIR_IN_MASK,\n                              _dcd.pipe0.length - _dcd.pipe0.remaining,\n                              XFER_RESULT_SUCCESS, true);\n    }\n    req = REQUEST_TYPE_INVALID;\n    if (!(csrl & MUSB_CSRL0_RXRDY)) return; /* Received SETUP packet */\n  }\n\n  if (csrl & MUSB_CSRL0_RXRDY) {\n    /* Received SETUP or DATA OUT packet */\n    if (req == REQUEST_TYPE_INVALID) {\n      /* SETUP */\n      TU_ASSERT(sizeof(tusb_control_request_t) == ep_csr->count0,);\n      process_setup_packet(rhport);\n      return;\n    }\n    if (_dcd.pipe0.buf) {\n      /* DATA OUT */\n      const unsigned vld = ep_csr->count0;\n      const unsigned rem = _dcd.pipe0.remaining;\n      const unsigned len = TU_MIN(TU_MIN(rem, 64), vld);\n      volatile void *fifo_ptr = &musb_regs->fifo[0];\n      tu_hwfifo_read(fifo_ptr, _dcd.pipe0.buf, len, NULL);\n\n      _dcd.pipe0.remaining = rem - len;\n      _dcd.remaining_ctrl -= len;\n\n      _dcd.pipe0.buf = NULL;\n      dcd_event_xfer_complete(rhport,\n                              tu_edpt_addr(0, TUSB_DIR_OUT),\n                              _dcd.pipe0.length - _dcd.pipe0.remaining,\n                              XFER_RESULT_SUCCESS, true);\n    }\n    return;\n  }\n\n  /* When CSRL0 is zero, it means that completion of sending a any length packet\n   * or receiving a zero length packet. */\n  if (req != REQUEST_TYPE_INVALID && !tu_edpt_dir(req)) {\n    /* STATUS IN */\n    if (*(const uint16_t*)(uintptr_t)&_dcd.setup_packet == 0x0500) {\n      /* The address must be changed on completion of the control transfer. */\n      musb_regs->faddr = (uint8_t)_dcd.setup_packet.wValue;\n    }\n    _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;\n    dcd_event_xfer_complete(rhport,\n                            tu_edpt_addr(0, TUSB_DIR_IN),\n                            _dcd.pipe0.length - _dcd.pipe0.remaining,\n                            XFER_RESULT_SUCCESS, true);\n    return;\n  }\n  if (_dcd.pipe0.buf) {\n    /* DATA IN */\n    _dcd.pipe0.buf = NULL;\n    dcd_event_xfer_complete(rhport,\n                            tu_edpt_addr(0, TUSB_DIR_IN),\n                            _dcd.pipe0.length - _dcd.pipe0.remaining,\n                            XFER_RESULT_SUCCESS, true);\n  }\n}\n\nstatic void process_edpt_n(uint8_t rhport, uint_fast8_t ep_addr)\n{\n  bool completed;\n  const unsigned dir_in = tu_edpt_dir(ep_addr);\n  const unsigned epn = tu_edpt_number(ep_addr);\n  const unsigned epn_minus1 = epn - 1;\n\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, epn);\n  if (dir_in) {\n    // TU_LOG1(\" TX CSRL%d = %x\\r\\n\", epn, ep_csr->tx_csrl);\n    if (ep_csr->tx_csrl & MUSB_TXCSRL1_STALLED) {\n      ep_csr->tx_csrl &= ~(MUSB_TXCSRL1_STALLED | MUSB_TXCSRL1_UNDRN);\n      return;\n    }\n    completed = handle_xfer_in(rhport, ep_addr);\n  } else {\n    // TU_LOG1(\" RX CSRL%d = %x\\r\\n\", epn, ep_csr->rx_csrl);\n    if (ep_csr->rx_csrl & MUSB_RXCSRL1_STALLED) {\n      ep_csr->rx_csrl &= ~(MUSB_RXCSRL1_STALLED | MUSB_RXCSRL1_OVER);\n      return;\n    }\n    completed = handle_xfer_out(rhport, ep_addr);\n  }\n\n  if (completed) {\n    pipe_state_t *pipe = &_dcd.pipe[dir_in][epn_minus1];\n    dcd_event_xfer_complete(rhport, ep_addr,\n                            pipe->length - pipe->remaining,\n                            XFER_RESULT_SUCCESS, true);\n  }\n}\n\n// Upon BUS RESET is detected, hardware havs already done:\n// faddr = 0, index = 0, flushes all ep fifos, clears all ep csr, enabled all ep interrupts\nstatic void process_bus_reset(uint8_t rhport) {\n  musb_regs_t* musb = MUSB_REGS(rhport);\n\n#if MUSB_CFG_DYNAMIC_FIFO\n  alloced_fifo_bytes = CFG_TUD_ENDPOINT0_SIZE;\n#endif\n\n  /* When bmRequestType is REQUEST_TYPE_INVALID(0xFF), a control transfer state is SETUP or STATUS stage. */\n  _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;\n  _dcd.status_out = 0;\n  /* When pipe0.buf has not NULL, DATA stage works in progress. */\n  _dcd.pipe0.buf = NULL;\n\n  musb->intr_txen = 1; /* Enable only EP0 */\n  musb->intr_rxen = 0;\n\n  /* Clear FIFO settings */\n  for (unsigned i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {\n    musb->index = i;\n    hwfifo_reset(musb, i, 0);\n    hwfifo_reset(musb, i, 1);\n  }\n  dcd_event_bus_reset(rhport, (musb->power & MUSB_POWER_HSMODE) ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL, true);\n}\n\n/*------------------------------------------------------------------\n * Device API\n *------------------------------------------------------------------*/\n\n#if CFG_TUSB_DEBUG >= MUSB_DEBUG\nstatic void print_musb_info(musb_regs_t* musb_regs) {\n  // print version, epinfo, raminfo, config_data0, fifo_size\n  TU_LOG1(\"musb version = %u.%u\\r\\n\", musb_regs->hwvers_bit.major, musb_regs->hwvers_bit.minor);\n  TU_LOG1(\"Number of endpoints: %u TX, %u RX\\r\\n\", musb_regs->epinfo_bit.tx_ep_num, musb_regs->epinfo_bit.rx_ep_num);\n  TU_LOG1(\"RAM Info: %u DMA Channel, %u RAM address width\\r\\n\", musb_regs->raminfo_bit.dma_channel, musb_regs->raminfo_bit.ram_bits);\n\n  musb_regs->index = 0;\n  TU_LOG1(\"config_data0 = 0x%x\\r\\n\", musb_regs->indexed_csr.config_data0);\n\n#if MUSB_CFG_DYNAMIC_FIFO\n  TU_LOG1(\"Dynamic FIFO configuration\\r\\n\");\n#else\n  for (uint8_t i=1; i <= musb_regs->epinfo_bit.tx_ep_num; i++) {\n    musb_regs->index = i;\n    TU_LOG1(\"FIFO %u Size: TX %u RX %u\\r\\n\", i, musb_regs->indexed_csr.fifo_size_bit.tx, musb_regs->indexed_csr.fifo_size_bit.rx);\n  }\n#endif\n}\n#endif\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n\n#if CFG_TUSB_DEBUG >= MUSB_DEBUG\n  print_musb_info(musb_regs);\n#endif\n\n  musb_regs->intr_usben |= MUSB_IE_SUSPND;\n  musb_dcd_int_clear(rhport);\n  musb_dcd_phy_init(rhport);\n  dcd_connect(rhport);\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  musb_dcd_int_enable(rhport);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  musb_dcd_int_disable(rhport);\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void)dev_addr;\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, 0);\n\n  _dcd.pipe0.buf       = NULL;\n  _dcd.pipe0.length    = 0;\n  _dcd.pipe0.remaining = 0;\n  /* Clear RX FIFO to return ACK. */\n  ep_csr->csr0l = MUSB_CSRL0_RXRDYC | MUSB_CSRL0_DATAEND;\n}\n\n// Wake up host\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_regs->power |= MUSB_POWER_RESUME;\n\n  unsigned cnt = SystemCoreClock / 1000;\n  while (cnt--) __NOP();\n\n  musb_regs->power &= ~MUSB_POWER_RESUME;\n}\n\n// Connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport)\n{\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_regs->power |= TUD_OPT_HIGH_SPEED ? MUSB_POWER_HSENAB : 0;\n  musb_regs->power |= MUSB_POWER_SOFTCONN;\n}\n\n// Disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport)\n{\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_regs->power &= ~MUSB_POWER_SOFTCONN;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n// static void edpt_setup(musb_regs_t* musb, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_size){\n//   const unsigned epn     = tu_edpt_number(ep_addr);\n//   const unsigned dir_in  = tu_edpt_dir(ep_addr);\n// }\n\n// Configure endpoint's registers according to descriptor\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * ep_desc) {\n  const unsigned ep_addr = ep_desc->bEndpointAddress;\n  const unsigned epn     = tu_edpt_number(ep_addr);\n  const unsigned dir_in  = tu_edpt_dir(ep_addr);\n  const unsigned mps     = tu_edpt_packet_size(ep_desc);\n\n  pipe_state_t *pipe = &_dcd.pipe[dir_in][epn - 1];\n  pipe->buf       = NULL;\n  pipe->length    = 0;\n  pipe->remaining = 0;\n\n  musb_regs_t* musb = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb, epn);\n  const uint8_t is_rx = 1 - dir_in;\n  musb_ep_maxp_csr_t* maxp_csr = &ep_csr->maxp_csr[is_rx];\n\n  maxp_csr->maxp = mps;\n  maxp_csr->csrh = 0;\n#if MUSB_CFG_SHARED_FIFO\n  if (dir_in) {\n    maxp_csr->csrh |= MUSB_CSRH_TX_MODE;\n  }\n#endif\n\n  hwfifo_flush(musb, epn, is_rx, true);\n\n  TU_ASSERT(hwfifo_config(musb, epn, is_rx, mps, false));\n  musb->intren_ep[is_rx] |= TU_BIT(epn);\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  const unsigned epn    = tu_edpt_number(ep_addr);\n  const unsigned dir_in = tu_edpt_dir(ep_addr);\n  musb_regs_t* musb = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb, epn);\n  const uint8_t is_rx = 1 - dir_in;\n  ep_csr->maxp_csr[is_rx].csrh = 0;\n  return hwfifo_config(musb, epn, is_rx, largest_packet_size, true);\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const *ep_desc ) {\n  const unsigned ep_addr = ep_desc->bEndpointAddress;\n  const unsigned epn     = tu_edpt_number(ep_addr);\n  const unsigned dir_in  = tu_edpt_dir(ep_addr);\n  const unsigned mps     = tu_edpt_packet_size(ep_desc);\n\n  unsigned const ie = musb_dcd_get_int_enable(rhport);\n  musb_dcd_int_disable(rhport);\n\n  pipe_state_t *pipe = &_dcd.pipe[dir_in][epn - 1];\n  pipe->buf       = NULL;\n  pipe->length    = 0;\n  pipe->remaining = 0;\n\n  musb_regs_t* musb = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb, epn);\n  const uint8_t is_rx = 1 - dir_in;\n  musb_ep_maxp_csr_t* maxp_csr = &ep_csr->maxp_csr[is_rx];\n\n  maxp_csr->maxp = mps;\n  maxp_csr->csrh |= MUSB_CSRH_ISO;\n#if MUSB_CFG_SHARED_FIFO\n  if (dir_in) {\n    maxp_csr->csrh |= MUSB_CSRH_TX_MODE;\n  }\n#endif\n\n  hwfifo_flush(musb, epn, is_rx, true);\n\n#if MUSB_CFG_DYNAMIC_FIFO\n  // fifo space is already allocated, keep the address and just change packet size\n  musb->fifo_size[is_rx] = hwfifo_byte2size(mps) | MUSB_FIFOSZ_DOUBLE_PACKET;\n#endif\n\n  musb->intren_ep[is_rx] |= TU_BIT(epn);\n\n  if (ie) musb_dcd_int_enable(rhport);\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport)\n{\n  musb_regs_t* musb = MUSB_REGS(rhport);\n  unsigned const ie = musb_dcd_get_int_enable(rhport);\n  musb_dcd_int_disable(rhport);\n\n  musb->intr_txen = 1; /* Enable only EP0 */\n  musb->intr_rxen = 0;\n  for (unsigned i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {\n    musb_ep_csr_t* ep_csr = get_ep_csr(musb, i);\n    for (unsigned d = 0; d < 2; d++) {\n      musb_ep_maxp_csr_t* maxp_csr = &ep_csr->maxp_csr[d];\n      hwfifo_flush(musb, i, d, true);\n      hwfifo_reset(musb, i, d);\n      maxp_csr->maxp = 0;\n      maxp_csr->csrh = 0;\n    }\n  }\n\n#if MUSB_CFG_DYNAMIC_FIFO\n  alloced_fifo_bytes = CFG_TUD_ENDPOINT0_SIZE;\n#endif\n\n  if (ie) musb_dcd_int_enable(rhport);\n}\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void)rhport;\n  bool ret;\n  // TU_LOG1(\"X %x %d\\r\\n\", ep_addr, total_bytes);\n  unsigned const epnum = tu_edpt_number(ep_addr);\n  unsigned const ie = musb_dcd_get_int_enable(rhport);\n  musb_dcd_int_disable(rhport);\n\n  if (epnum) {\n    _dcd.pipe_buf_is_fifo[tu_edpt_dir(ep_addr)] &= ~TU_BIT(epnum - 1);\n    ret = edpt_n_xfer(rhport, ep_addr, buffer, total_bytes);\n  } else {\n    ret = edpt0_xfer(rhport, ep_addr, buffer, total_bytes);\n  }\n\n  if (ie) musb_dcd_int_enable(rhport);\n  return ret;\n}\n\n// Submit a transfer where is managed by FIFO, When complete dcd_event_xfer_complete() is invoked to notify the stack\n// - optional, however, must be listed in usbd.c\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void)rhport;\n  bool ret;\n  // TU_LOG1(\"X %x %d\\r\\n\", ep_addr, total_bytes);\n  unsigned const epnum = tu_edpt_number(ep_addr);\n  TU_ASSERT(epnum);\n  unsigned const ie = musb_dcd_get_int_enable(rhport);\n  musb_dcd_int_disable(rhport);\n  _dcd.pipe_buf_is_fifo[tu_edpt_dir(ep_addr)] |= TU_BIT(epnum - 1);\n  ret = edpt_n_xfer(rhport, ep_addr, (uint8_t*)ff, total_bytes);\n  if (ie) musb_dcd_int_enable(rhport);\n  return ret;\n}\n\n// Stall endpoint\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  unsigned const ie = musb_dcd_get_int_enable(rhport);\n  musb_dcd_int_disable(rhport);\n\n  unsigned const epn = tu_edpt_number(ep_addr);\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, epn);\n\n  if (0 == epn) {\n    if (!ep_addr) { /* Ignore EP80 */\n      _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;\n      _dcd.pipe0.buf = NULL;\n      ep_csr->csr0l = MUSB_CSRL0_STALL;\n    }\n  } else {\n    const uint8_t is_rx = 1 - tu_edpt_dir(ep_addr);\n    ep_csr->maxp_csr[is_rx].csrl = MUSB_CSRL_SEND_STALL(is_rx);\n  }\n\n  if (ie) musb_dcd_int_enable(rhport);\n}\n\n// clear stall, data toggle is also reset to DATA0\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void)rhport;\n  unsigned const ie = musb_dcd_get_int_enable(rhport);\n  musb_dcd_int_disable(rhport);\n\n  unsigned const epn = tu_edpt_number(ep_addr);\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  musb_ep_csr_t* ep_csr = get_ep_csr(musb_regs, epn);\n  const uint8_t is_rx = 1 - tu_edpt_dir(ep_addr);\n\n  ep_csr->maxp_csr[is_rx].csrl = MUSB_CSRL_CLEAR_DATA_TOGGLE(is_rx);\n\n  if (ie) musb_dcd_int_enable(rhport);\n}\n\n/*-------------------------------------------------------------------\n * ISR\n *-------------------------------------------------------------------*/\nvoid dcd_int_handler(uint8_t rhport) {\n  musb_regs_t* musb_regs = MUSB_REGS(rhport);\n  const uint8_t saved_index = musb_regs->index; // save endpoint index\n\n  //Part specific ISR setup/entry\n  musb_dcd_int_handler_enter(rhport);\n\n  uint_fast8_t intr_usb = musb_regs->intr_usb; // a read will clear this interrupt status\n  uint_fast8_t intr_tx = musb_regs->intr_tx; // a read will clear this interrupt status\n  uint_fast8_t intr_rx = musb_regs->intr_rx; // a read will clear this interrupt status\n  // TU_LOG1(\"D%2x T%2x R%2x\\r\\n\", is, txis, rxis);\n\n  intr_usb &= musb_regs->intr_usben; /* Clear disabled interrupts */\n  if (intr_usb & MUSB_IS_DISCON) {\n  }\n  if (intr_usb & MUSB_IS_SOF) {\n    dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);\n  }\n  if (intr_usb & MUSB_IS_RESET) {\n    process_bus_reset(rhport);\n  }\n  if (intr_usb & MUSB_IS_RESUME) {\n    dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n  }\n  if (intr_usb & MUSB_IS_SUSPEND) {\n    dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n  }\n\n  intr_tx &= musb_regs->intr_txen; /* Clear disabled interrupts */\n  if (intr_tx & TU_BIT(0)) {\n    process_ep0(rhport);\n    intr_tx &= ~TU_BIT(0);\n  }\n  while (intr_tx) {\n    unsigned const num = __builtin_ctz(intr_tx);\n    process_edpt_n(rhport, tu_edpt_addr(num, TUSB_DIR_IN));\n    intr_tx &= ~TU_BIT(num);\n  }\n\n  intr_rx &= musb_regs->intr_rxen; /* Clear disabled interrupts */\n  while (intr_rx) {\n    unsigned const num = __builtin_ctz(intr_rx);\n    process_edpt_n(rhport, tu_edpt_addr(num, TUSB_DIR_OUT));\n    intr_rx &= ~TU_BIT(num);\n  }\n\n  musb_regs->index = saved_index; // restore endpoint index\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/mentor/musb/hcd_musb.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Koji KITAYAMA\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && \\\n  TU_CHECK_MCU(OPT_MCU_MSP432E4, OPT_MCU_TM4C123, OPT_MCU_TM4C129)\n\n#if __GNUC__ > 8 && defined(__ARM_FEATURE_UNALIGNED)\n/* GCC warns that an address may be unaligned, even though\n * the target CPU has the capability for unaligned memory access. */\n_Pragma(\"GCC diagnostic ignored \\\"-Waddress-of-packed-member\\\"\");\n#endif\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n\n#include \"musb_type.h\"\n\n#if TU_CHECK_MCU(OPT_MCU_MSP432E4, OPT_MCU_TM4C123, OPT_MCU_TM4C129)\n  #include \"musb_ti.h\"\n#else\n  #error \"Unsupported MCUs\"\n#endif\n\n#ifndef HCD_ATTR_ENDPOINT_MAX\n# define HCD_ATTR_ENDPOINT_MAX 8\n#endif\n\n/*------------------------------------------------------------------\n * MACRO TYPEDEF CONSTANT ENUM DECLARATION\n *------------------------------------------------------------------*/\n#define REQUEST_TYPE_INVALID  (0xFFu)\n\ntypedef struct {\n  uint_fast16_t beg; /* offset of including first element */\n  uint_fast16_t end; /* offset of excluding the last element */\n} free_block_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t TXFUNCADDR;\n  uint8_t RESERVED0;\n  uint8_t TXHUBADDR;\n  uint8_t TXHUBPORT;\n  uint8_t RXFUNCADDR;\n  uint8_t RESERVED1;\n  uint8_t RXHUBADDR;\n  uint8_t RXHUBPORT;\n} hw_addr_t;\n\ntypedef struct TU_ATTR_PACKED {\n  uint16_t TXMAXP;\n  uint8_t  TXCSRL;\n  uint8_t  TXCSRH;\n  uint16_t RXMAXP;\n  uint8_t  RXCSRL;\n  uint8_t  RXCSRH;\n  uint16_t RXCOUNT;\n  uint8_t  TXTYPE;\n  uint8_t  TXINTERVAL;\n  uint8_t  RXTYPE;\n  uint8_t  RXINTERVAL;\n  uint16_t RESERVED;\n} hw_endpoint_t;\n\ntypedef union {\n  uint8_t   u8;\n  uint16_t  u16;\n  uint32_t  u32;\n} hw_fifo_t;\n\ntypedef struct TU_ATTR_PACKED\n{\n  void      *buf;      /* the start address of a transfer data buffer */\n  uint16_t  length;    /* the number of bytes in the buffer */\n  uint16_t  remaining; /* the number of bytes remaining in the buffer */\n} pipe_state_t;\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t dev;\n  uint8_t ep;\n} pipe_addr_t;\n\ntypedef struct\n{\n  bool         need_reset;     /* The device has not been reset after connection. */\n  uint8_t      bmRequestType;\n  uint8_t      ctl_mps[7]; /* EP0 max packet size for each device */\n  pipe_state_t pipe0;\n  pipe_state_t pipe[7][2];   /* pipe[pipe number - 1][direction 0:RX 1:TX] */\n  pipe_addr_t  addr[7][2];   /* addr[pipe number - 1][direction 0:RX 1:TX] */\n} hcd_data_t;\n\n/*------------------------------------------------------------------\n * INTERNAL OBJECT & FUNCTION DECLARATION\n *------------------------------------------------------------------*/\nstatic hcd_data_t _hcd;\n\nstatic inline free_block_t *find_containing_block(free_block_t *beg, free_block_t *end, uint_fast16_t addr)\n{\n  free_block_t *cur = beg;\n  for (; cur < end && ((addr < cur->beg) || (cur->end <= addr)); ++cur) ;\n  return cur;\n}\n\nstatic inline int update_free_block_list(free_block_t *blks, unsigned num, uint_fast16_t addr, uint_fast16_t size)\n{\n  free_block_t *p = find_containing_block(blks, blks + num, addr);\n  TU_ASSERT(p != blks + num, -2);\n  if (p->beg == addr) {\n    /* Shrink block */\n    p->beg = addr + size;\n    if (p->beg != p->end) return 0;\n    /* remove block */\n    free_block_t *end = blks + num;\n    while (p + 1 < end) {\n      *p = *(p + 1);\n      ++p;\n    }\n    return -1;\n  } else {\n    /* Split into 2 blocks */\n    free_block_t tmp = {\n      .beg = addr + size,\n      .end = p->end\n    };\n    p->end = addr;\n    if (p->beg == p->end) {\n      if (tmp.beg != tmp.end) {\n        *p = tmp;\n        return 0;\n      }\n      /* remove block */\n      free_block_t *end = blks + num;\n      while (p + 1 < end) {\n        *p = *(p + 1);\n        ++p;\n      }\n      return -1;\n    }\n    if (tmp.beg == tmp.end) return 0;\n    blks[num] = tmp;\n    return 1;\n  }\n}\n\nstatic inline unsigned free_block_size(free_block_t const *blk)\n{\n  return blk->end - blk->beg;\n}\n\nstatic unsigned find_free_memory(uint_fast16_t size_in_log2_minus3)\n{\n  free_block_t free_blocks[2 * (HCD_ATTR_ENDPOINT_MAX - 1)];\n  unsigned num_blocks = 1;\n\n  /* Initialize free memory block list */\n  free_blocks[0].beg = 64 / 8;\n  free_blocks[0].end = (4 << 10) / 8; /* 4KiB / 8 bytes */\n  for (int i = 1; i < HCD_ATTR_ENDPOINT_MAX; ++i) {\n    uint_fast16_t addr;\n    int num;\n    USB0->EPIDX = i;\n    addr = USB0->TXFIFOADD;\n    if (addr) {\n      unsigned sz  = USB0->TXFIFOSZ;\n      unsigned sft = (sz & USB_TXFIFOSZ_SIZE_M) + ((sz & USB_TXFIFOSZ_DPB) ? 1: 0);\n      num = update_free_block_list(free_blocks, num_blocks, addr, 1 << sft);\n      TU_ASSERT(-2 < num, 0);\n      num_blocks += num;\n    }\n    addr = USB0->RXFIFOADD;\n    if (addr) {\n      unsigned sz  = USB0->RXFIFOSZ;\n      unsigned sft = (sz & USB_RXFIFOSZ_SIZE_M) + ((sz & USB_RXFIFOSZ_DPB) ? 1: 0);\n      num = update_free_block_list(free_blocks, num_blocks, addr, 1 << sft);\n      TU_ASSERT(-2 < num, 0);\n      num_blocks += num;\n    }\n  }\n\n  /* Find the best fit memory block */\n  uint_fast16_t size_in_8byte_unit = 1 << size_in_log2_minus3;\n  free_block_t const *min = NULL;\n  uint_fast16_t    min_sz = 0xFFFFu;\n  free_block_t const *end = &free_blocks[num_blocks];\n  for (free_block_t const *cur = &free_blocks[0]; cur < end; ++cur) {\n    uint_fast16_t sz = free_block_size(cur);\n    if (sz < size_in_8byte_unit) continue;\n    if (size_in_8byte_unit == sz) return cur->beg;\n    if (sz < min_sz) min = cur;\n  }\n  TU_ASSERT(min, 0);\n  return min->beg;\n}\n\nstatic inline volatile hw_endpoint_t* edpt_regs(unsigned epnum_minus1)\n{\n  volatile hw_endpoint_t *regs = (volatile hw_endpoint_t*)((uintptr_t)&USB0->TXMAXP1);\n  return regs + epnum_minus1;\n}\n\nstatic unsigned find_pipe(uint_fast8_t dev_addr, uint_fast8_t ep_addr)\n{\n  unsigned const dir_tx = tu_edpt_dir(ep_addr) ? 0: 1;\n  pipe_addr_t const *p = &_hcd.addr[0][dir_tx];\n  for (unsigned i = 0; i < sizeof(_hcd.addr)/sizeof(_hcd.addr[0]); ++i, p += 2) {\n    if ((dev_addr == p->dev) && (ep_addr == p->ep))\n      return i + 1;\n  }\n  return 0;\n}\n\nstatic void pipe_write_packet(void *buf, volatile void *fifo, unsigned len)\n{\n  volatile hw_fifo_t *reg = (volatile hw_fifo_t*)fifo;\n  uintptr_t addr = (uintptr_t)buf;\n  while (len >= 4) {\n    reg->u32 = *(uint32_t const *)addr;\n    addr += 4;\n    len  -= 4;\n  }\n  if (len >= 2) {\n    reg->u16 = *(uint16_t const *)addr;\n    addr += 2;\n    len  -= 2;\n  }\n  if (len) {\n    reg->u8 = *(uint8_t const *)addr;\n  }\n}\n\nstatic void pipe_read_packet(void *buf, volatile void *fifo, unsigned len)\n{\n  volatile hw_fifo_t *reg = (volatile hw_fifo_t*)fifo;\n  uintptr_t addr = (uintptr_t)buf;\n  while (len >= 4) {\n    *(uint32_t *)addr = reg->u32;\n    addr += 4;\n    len  -= 4;\n  }\n  if (len >= 2) {\n    *(uint16_t *)addr = reg->u16;\n    addr += 2;\n    len  -= 2;\n  }\n  if (len) {\n    *(uint8_t *)addr = reg->u8;\n  }\n}\n\nstatic bool edpt0_xfer_out(void)\n{\n  pipe_state_t *pipe = &_hcd.pipe0;\n  unsigned const rem = pipe->remaining;\n  if (!rem) {\n    pipe->buf = NULL;\n    return true;\n  }\n  unsigned const dev_addr = USB0->TXFUNCADDR0;\n  unsigned const mps = _hcd.ctl_mps[dev_addr];\n  unsigned const len = TU_MIN(rem, mps);\n  void          *buf = pipe->buf;\n  if (len) {\n    pipe_write_packet(buf, &USB0->FIFO0_WORD, len);\n    pipe->buf = (uint8_t*)buf + len;\n  }\n  pipe->remaining = rem - len;\n  USB0->CSRL0 = USB_CSRL0_TXRDY;\n  return false;\n}\n\nstatic bool edpt0_xfer_in(void)\n{\n  pipe_state_t *pipe = &_hcd.pipe0;\n  unsigned const rem = pipe->remaining;\n  unsigned const dev_addr = USB0->TXFUNCADDR0;\n  unsigned const mps = _hcd.ctl_mps[dev_addr];\n  unsigned const vld = USB0->COUNT0;\n  unsigned const len = TU_MIN(TU_MIN(rem, mps), vld);\n  void          *buf = pipe->buf;\n  if (len) {\n    pipe_read_packet(buf, &USB0->FIFO0_WORD, len);\n    pipe->buf = (uint8_t*)buf + len;\n  }\n  pipe->remaining = rem - len;\n  if ((len < mps) || (rem == len)) {\n    pipe->buf = NULL;\n    return true;\n  }\n  USB0->CSRL0 = USB_CSRL0_REQPKT;\n  return false;\n}\n\nstatic bool edpt0_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen)\n{\n  (void)rhport;\n\n  unsigned const req = _hcd.bmRequestType;\n  TU_ASSERT(req != REQUEST_TYPE_INVALID);\n  TU_ASSERT(dev_addr < sizeof(_hcd.ctl_mps));\n\n  USB0->TXFUNCADDR0 = dev_addr;\n  const unsigned dir_in = tu_edpt_dir(ep_addr);\n  if (tu_edpt_dir(req) == dir_in) { /* DATA stage */\n    TU_ASSERT(buffer);\n    _hcd.pipe0.buf       = buffer;\n    _hcd.pipe0.length    = buflen;\n    _hcd.pipe0.remaining = buflen;\n    if (dir_in)\n      USB0->CSRL0 = USB_CSRL0_REQPKT;\n    else\n      edpt0_xfer_out();\n  } else { /* STATUS stage */\n    _hcd.pipe0.buf       = NULL;\n    _hcd.pipe0.length    = 0;\n    _hcd.pipe0.remaining = 0;\n    USB0->CSRL0 = USB_CSRL0_STATUS | (dir_in ? USB_CSRL0_REQPKT: USB_CSRL0_TXRDY);\n  }\n  return true;\n}\n\nstatic bool pipe_xfer_out(uint_fast8_t pipenum)\n{\n  pipe_state_t *pipe = &_hcd.pipe[pipenum - 1][1];\n  unsigned const rem = pipe->remaining;\n  if (!rem) {\n    pipe->buf = NULL;\n    return true;\n  }\n  hw_endpoint_t volatile *regs = edpt_regs(pipenum - 1);\n  unsigned const mps = regs->TXMAXP;\n  unsigned const len = TU_MIN(rem, mps);\n  void          *buf = pipe->buf;\n  if (len) {\n    pipe_write_packet(buf, &USB0->FIFO0_WORD + pipenum, len);\n    pipe->buf = (uint8_t*)buf + len;\n  }\n  pipe->remaining = rem - len;\n  regs->TXCSRL = USB_TXCSRL1_TXRDY;\n  return false;\n}\n\nstatic bool pipe_xfer_in(uint_fast8_t pipenum)\n{\n  pipe_state_t *pipe = &_hcd.pipe[pipenum - 1][0];\n  volatile hw_endpoint_t *regs = edpt_regs(pipenum - 1);\n\n  TU_ASSERT(regs->RXCSRL & USB_RXCSRL1_RXRDY);\n\n  const unsigned mps = regs->RXMAXP;\n  const unsigned rem = pipe->remaining;\n  const unsigned vld = regs->RXCOUNT;\n  const unsigned len = TU_MIN(TU_MIN(rem, mps), vld);\n  void          *buf = pipe->buf;\n  if (len) {\n    pipe_read_packet(buf, &USB0->FIFO0_WORD + pipenum, len);\n    pipe->buf       = buf + len;\n    pipe->remaining = rem - len;\n  }\n  if ((len < mps) || (rem == len)) {\n    pipe->buf = NULL;\n    return NULL != buf;\n  }\n  regs->RXCSRL = USB_RXCSRL1_REQPKT;\n  return false;\n}\n\nstatic bool edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen)\n{\n  (void)rhport;\n  unsigned const pipenum = find_pipe(dev_addr, ep_addr);\n  unsigned const dir_tx  = tu_edpt_dir(ep_addr) ? 0: 1;\n  pipe_state_t *pipe = &_hcd.pipe[pipenum - 1][dir_tx];\n  pipe->buf          = buffer;\n  pipe->length       = buflen;\n  pipe->remaining    = buflen;\n  if (dir_tx) {\n    pipe_xfer_out(pipenum);\n  } else {\n    volatile hw_endpoint_t *regs = edpt_regs(pipenum - 1);\n    regs->RXCSRL = USB_RXCSRL1_REQPKT;\n  }\n  return true;\n}\n\nstatic void process_ep0(uint8_t rhport)\n{\n  (void)rhport;\n\n  uint_fast8_t csrl = USB0->CSRL0;\n  // TU_LOG1(\" EP0 CSRL = %x\\r\\n\", csrl);\n\n  unsigned const dev_addr = USB0->TXFUNCADDR0;\n  unsigned const req = _hcd.bmRequestType;\n  if (csrl & (USB_CSRL0_ERROR | USB_CSRL0_NAKTO | USB_CSRL0_STALLED)) {\n    /* No response / NAK timed out / Stall received */\n    if (csrl & (USB_CSRL0_RXRDY | USB_CSRL0_TXRDY))\n      USB0->CSRH0 = USB_CSRH0_FLUSH;\n    USB0->CSRL0 = 0;\n    _hcd.bmRequestType = REQUEST_TYPE_INVALID;\n    uint8_t result = (csrl & USB_CSRL0_STALLED) ? XFER_RESULT_STALLED: XFER_RESULT_FAILED;\n    if (REQUEST_TYPE_INVALID == req) { /* SETUP */\n      uint8_t const ep_addr = tu_edpt_addr(0, TUSB_DIR_OUT);\n      hcd_event_xfer_complete(dev_addr, ep_addr,\n                              _hcd.pipe0.length - _hcd.pipe0.remaining,\n                              result, true);\n    } else if (csrl & USB_CSRL0_STATUS) { /* STATUS */\n      uint8_t const ep_addr = tu_edpt_dir(req) ?\n        tu_edpt_addr(0, TUSB_DIR_OUT): tu_edpt_addr(0, TUSB_DIR_IN);\n      hcd_event_xfer_complete(dev_addr, ep_addr,\n                              _hcd.pipe0.length - _hcd.pipe0.remaining,\n                              result, true);\n    } else { /* DATA */\n      uint8_t const ep_addr = tu_edpt_dir(req) ?\n        tu_edpt_addr(0, TUSB_DIR_IN): tu_edpt_addr(0, TUSB_DIR_OUT);\n      hcd_event_xfer_complete(dev_addr, ep_addr,\n                              _hcd.pipe0.length - _hcd.pipe0.remaining,\n                              result, true);\n    }\n    return;\n  }\n  if (csrl & USB_CSRL0_STATUS) {\n    /* STATUS IN */\n    TU_ASSERT(USB_CSRL0_RXRDY == (csrl & USB_CSRL0_RXRDY),);\n    TU_ASSERT(0 == USB0->COUNT0,);\n    USB0->CSRH0 = USB_CSRH0_FLUSH;\n    USB0->CSRL0 = 0;\n    _hcd.bmRequestType = REQUEST_TYPE_INVALID;\n    hcd_event_xfer_complete(dev_addr, tu_edpt_addr(0, TUSB_DIR_IN),\n                            0, XFER_RESULT_SUCCESS, true);\n    return;\n  }\n  if (csrl & USB_CSRL0_RXRDY) {\n    /* DATA IN */\n    TU_ASSERT(REQUEST_TYPE_INVALID != req,);\n    TU_ASSERT(_hcd.pipe0.buf,);\n    if (edpt0_xfer_in()) {\n      hcd_event_xfer_complete(dev_addr, tu_edpt_addr(0, TUSB_DIR_IN),\n                              _hcd.pipe0.length - _hcd.pipe0.remaining,\n                              XFER_RESULT_SUCCESS, true);\n    }\n    return;\n  }\n\n  /* When CSRL0 is zero, it means that completion of sending a any length packet. */\n  if (!_hcd.pipe0.buf) {\n    /* STATUS OUT */\n    TU_ASSERT(REQUEST_TYPE_INVALID != req,);\n    _hcd.bmRequestType = REQUEST_TYPE_INVALID;\n    /* EP address is the reverse direction of DATA stage */\n    uint8_t const ep_addr = tu_edpt_dir(req) ?\n      tu_edpt_addr(0, TUSB_DIR_OUT): tu_edpt_addr(0, TUSB_DIR_IN);\n    hcd_event_xfer_complete(dev_addr, ep_addr, 0, XFER_RESULT_SUCCESS, true);\n    return;\n  }\n  if (REQUEST_TYPE_INVALID == req) {\n    /* SETUP */\n    _hcd.bmRequestType = *(uint8_t*)_hcd.pipe0.buf;\n    _hcd.pipe0.buf = NULL;\n    hcd_event_xfer_complete(dev_addr, tu_edpt_addr(0, TUSB_DIR_OUT),\n                            8, XFER_RESULT_SUCCESS, true);\n    return;\n  }\n\n  /* DATA OUT */\n  if (edpt0_xfer_out()) {\n    hcd_event_xfer_complete(dev_addr, tu_edpt_addr(0, TUSB_DIR_OUT),\n                            _hcd.pipe0.length - _hcd.pipe0.remaining,\n                            XFER_RESULT_SUCCESS, true);\n  }\n}\n\nstatic void process_pipe_tx(uint8_t rhport, uint_fast8_t pipenum)\n{\n  (void)rhport;\n  bool completed;\n  uint8_t result;\n\n  volatile hw_endpoint_t *regs = edpt_regs(pipenum - 1);\n  unsigned const csrl = regs->TXCSRL;\n  // TU_LOG1(\" TXCSRL%d = %x\\r\\n\", pipenum, csrl);\n  if (csrl & (USB_TXCSRL1_STALLED | USB_TXCSRL1_ERROR)) {\n    if (csrl & USB_TXCSRL1_TXRDY)\n      regs->TXCSRL = (csrl & ~(USB_TXCSRL1_STALLED | USB_TXCSRL1_ERROR)) | USB_TXCSRL1_FLUSH;\n    else\n      regs->TXCSRL = csrl & ~(USB_TXCSRL1_STALLED | USB_TXCSRL1_ERROR);\n    completed = true;\n    result    = (csrl & USB_TXCSRL1_STALLED) ? XFER_RESULT_STALLED: XFER_RESULT_FAILED;\n  } else {\n    completed = pipe_xfer_out(pipenum);\n    result    = XFER_RESULT_SUCCESS;\n  }\n  if (completed) {\n    pipe_addr_t  *addr = &_hcd.addr[pipenum - 1][1];\n    pipe_state_t *pipe = &_hcd.pipe[pipenum - 1][1];\n    hcd_event_xfer_complete(addr->dev, addr->ep,\n                            pipe->length - pipe->remaining,\n                            result, true);\n  }\n}\n\nstatic void process_pipe_rx(uint8_t rhport, uint_fast8_t pipenum)\n{\n  (void)rhport;\n  bool completed;\n  uint8_t result;\n\n  volatile hw_endpoint_t *regs = edpt_regs(pipenum - 1);\n  unsigned const csrl = regs->RXCSRL;\n  // TU_LOG1(\" RXCSRL%d = %x\\r\\n\", pipenum, csrl);\n  if (csrl & (USB_RXCSRL1_STALLED | USB_RXCSRL1_ERROR)) {\n    if (csrl & USB_RXCSRL1_RXRDY)\n      regs->RXCSRL = (csrl & ~(USB_RXCSRL1_STALLED | USB_RXCSRL1_ERROR)) | USB_RXCSRL1_FLUSH;\n    else\n      regs->RXCSRL = csrl & ~(USB_RXCSRL1_STALLED | USB_RXCSRL1_ERROR);\n    completed = true;\n    result    = (csrl & USB_RXCSRL1_STALLED) ? XFER_RESULT_STALLED: XFER_RESULT_FAILED;\n  } else {\n    completed = pipe_xfer_in(pipenum);\n    result    = XFER_RESULT_SUCCESS;\n  }\n  if (completed) {\n    pipe_addr_t  *addr = &_hcd.addr[pipenum - 1][0];\n    pipe_state_t *pipe = &_hcd.pipe[pipenum - 1][0];\n    hcd_event_xfer_complete(addr->dev, addr->ep,\n                            pipe->length - pipe->remaining,\n                            result, true);\n  }\n}\n\n/*------------------------------------------------------------------\n * Host API\n *------------------------------------------------------------------*/\n\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  NVIC_ClearPendingIRQ(USB0_IRQn);\n  _hcd.bmRequestType = REQUEST_TYPE_INVALID;\n  USB0->DEVCTL |= USB_DEVCTL_SESSION;\n  USB0->IE = USB_IE_DISCON | USB_IE_CONN | USB_IE_BABBLE | USB_IE_RESUME;\n  return true;\n}\n\nvoid hcd_int_enable(uint8_t rhport)\n{\n  (void)rhport;\n  NVIC_EnableIRQ(USB0_IRQn);\n}\n\nvoid hcd_int_disable(uint8_t rhport)\n{\n  (void)rhport;\n  NVIC_DisableIRQ(USB0_IRQn);\n}\n\nuint32_t hcd_frame_number(uint8_t rhport)\n{\n  (void)rhport;\n  /* The device must be reset at least once after connection\n   * in order to start the frame counter. */\n  if (_hcd.need_reset) hcd_port_reset(rhport);\n  return USB0->FRAME;\n}\n\n//--------------------------------------------------------------------+\n// Port API\n//--------------------------------------------------------------------+\n\nbool hcd_port_connect_status(uint8_t rhport)\n{\n  (void)rhport;\n  unsigned devctl = USB0->DEVCTL;\n  if (!(devctl & USB_DEVCTL_HOST)) return false;\n  if (devctl & (USB_DEVCTL_LSDEV | USB_DEVCTL_FSDEV)) return true;\n  return false;\n}\n\nvoid hcd_port_reset(uint8_t rhport)\n{\n  (void)rhport;\n  USB0->POWER |= USB_POWER_HSENAB | USB_POWER_RESET;\n  unsigned cnt = SystemCoreClock / 1000 * 20;\n  while (cnt--) __NOP();\n  USB0->POWER &= ~USB_POWER_RESET;\n  _hcd.need_reset = false;\n}\n\nvoid hcd_port_reset_end(uint8_t rhport)\n{\n  (void) rhport;\n}\n\ntusb_speed_t hcd_port_speed_get(uint8_t rhport)\n{\n  (void)rhport;\n  unsigned devctl = USB0->DEVCTL;\n  if (devctl & USB_DEVCTL_LSDEV)      return TUSB_SPEED_LOW;\n  if (!(devctl & USB_DEVCTL_FSDEV))   return TUSB_SPEED_INVALID;\n  if (USB0->POWER & USB_POWER_HSMODE) return TUSB_SPEED_HIGH;\n  return TUSB_SPEED_FULL;\n}\n\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr)\n{\n  (void)rhport;\n  if (sizeof(_hcd.ctl_mps) <= dev_addr) return;\n\n  unsigned const ie = NVIC_GetEnableIRQ(USB0_IRQn);\n  NVIC_DisableIRQ(USB0_IRQn);\n  _hcd.ctl_mps[dev_addr] = 0;\n  if (!dev_addr) return;\n\n  pipe_addr_t *p = &_hcd.addr[0][0];\n  for (unsigned i = 0; i < sizeof(_hcd.addr)/sizeof(_hcd.addr[0]); ++i) {\n    for (unsigned j = 0; j < 2; ++j, ++p) {\n      if (dev_addr != p->dev) continue;\n      hw_addr_t volatile     *fadr = (hw_addr_t volatile*)&USB0->TXFUNCADDR0 + i + 1;\n      hw_endpoint_t volatile *regs = edpt_regs(i);\n      USB0->EPIDX = i + 1;\n      if (j) {\n        USB0->TXIE      &= ~TU_BIT(i + 1);\n        if (regs->TXCSRL & USB_TXCSRL1_TXRDY)\n          regs->TXCSRL   = USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH;\n        else\n          regs->TXCSRL   = USB_TXCSRL1_CLRDT;\n        regs->TXMAXP     = 0;\n        regs->TXTYPE     = 0;\n        regs->TXINTERVAL = 0;\n        fadr->TXFUNCADDR = 0;\n        fadr->TXHUBADDR  = 0;\n        fadr->TXHUBPORT  = 0;\n        USB0->TXFIFOADD  = 0;\n        USB0->TXFIFOSZ   = 0;\n      } else {\n        USB0->RXIE      &= ~TU_BIT(i + 1);\n        if (regs->RXCSRL & USB_RXCSRL1_RXRDY)\n          regs->RXCSRL   = USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH;\n        else\n          regs->RXCSRL   = USB_RXCSRL1_CLRDT;\n        regs->RXMAXP     = 0;\n        regs->RXTYPE     = 0;\n        regs->RXINTERVAL = 0;\n        fadr->RXFUNCADDR = 0;\n        fadr->RXHUBADDR  = 0;\n        fadr->RXHUBPORT  = 0;\n        USB0->RXFIFOADD  = 0;\n        USB0->RXFIFOSZ   = 0;\n      }\n      p->dev = 0;\n      p->ep  = 0;\n      pipe_state_t *pipe = &_hcd.pipe[i][j];\n      pipe->buf       = NULL;\n      pipe->length    = 0;\n      pipe->remaining = 0;\n    }\n  }\n  if (ie) NVIC_EnableIRQ(USB0_IRQn);\n}\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\n\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8])\n{\n  (void)rhport;\n  pipe_write_packet((void*)(uintptr_t)setup_packet, &USB0->FIFO0_WORD, 8);\n  _hcd.pipe0.buf       = (void*)(uintptr_t)setup_packet;\n  _hcd.pipe0.length    = 8;\n  _hcd.pipe0.remaining = 0;\n\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(dev_addr, &bus_info);\n  switch (bus_info.speed) {\n    default: return false;\n    case TUSB_SPEED_LOW:  USB0->TYPE0 = USB_TYPE0_SPEED_LOW;  break;\n    case TUSB_SPEED_FULL: USB0->TYPE0 = USB_TYPE0_SPEED_FULL; break;\n    case TUSB_SPEED_HIGH: USB0->TYPE0 = USB_TYPE0_SPEED_HIGH; break;\n  }\n  USB0->TXHUBADDR0     = bus_info.hub_addr;\n  USB0->TXHUBPORT0     = bus_info.hub_port;\n  USB0->TXFUNCADDR0    = dev_addr;\n  USB0->CSRL0 = USB_CSRL0_TXRDY | USB_CSRL0_SETUP;\n  return true;\n}\n\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const * ep_desc)\n{\n  (void)rhport;\n  if (sizeof(_hcd.ctl_mps) <= dev_addr) return false;\n  unsigned const ep_addr = ep_desc->bEndpointAddress;\n  unsigned const epn     = tu_edpt_number(ep_addr);\n  if (0 == epn) {\n    _hcd.ctl_mps[dev_addr] = ep_desc->wMaxPacketSize;\n    return true;\n  }\n\n  unsigned const dir_tx = tu_edpt_dir(ep_addr) ? 0: 1;\n  /* Find a free pipe */\n  unsigned pipenum = 0;\n  pipe_addr_t *p = &_hcd.addr[0][dir_tx];\n  for (unsigned i = 0; i < sizeof(_hcd.addr)/sizeof(_hcd.addr[0]); ++i, p += 2) {\n    if (0 == p->ep) {\n      p->dev  = dev_addr;\n      p->ep   = ep_addr;\n      pipenum = i + 1;\n      break;\n    }\n  }\n  if (!pipenum) return false;\n\n  unsigned const xfer = ep_desc->bmAttributes.xfer;\n  unsigned const mps  = tu_edpt_packet_size(ep_desc);\n\n  pipe_state_t *pipe = &_hcd.pipe[pipenum - 1][dir_tx];\n  pipe->buf       = NULL;\n  pipe->length    = 0;\n  pipe->remaining = 0;\n\n  uint8_t pipe_type = 0;\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(dev_addr, &bus_info);\n  switch (bus_info.speed) {\n    default: return false;\n    case TUSB_SPEED_LOW:  pipe_type |= USB_TXTYPE1_SPEED_LOW;  break;\n    case TUSB_SPEED_FULL: pipe_type |= USB_TXTYPE1_SPEED_FULL; break;\n    case TUSB_SPEED_HIGH: pipe_type |= USB_TXTYPE1_SPEED_HIGH; break;\n  }\n  switch (xfer) {\n    default: return false;\n    case TUSB_XFER_BULK:        pipe_type |= USB_TXTYPE1_PROTO_BULK; break;\n    case TUSB_XFER_INTERRUPT:   pipe_type |= USB_TXTYPE1_PROTO_INT;  break;\n    case TUSB_XFER_ISOCHRONOUS: pipe_type |= USB_TXTYPE1_PROTO_ISOC; break;\n  }\n\n  hw_addr_t volatile     *fadr = (hw_addr_t volatile*)&USB0->TXFUNCADDR0 + pipenum;\n  hw_endpoint_t volatile *regs = edpt_regs(pipenum - 1);\n  if (dir_tx) {\n    fadr->TXFUNCADDR = dev_addr;\n    fadr->TXHUBADDR  = bus_info.hub_addr;\n    fadr->TXHUBPORT  = bus_info.hub_port;\n    regs->TXMAXP     = mps;\n    regs->TXTYPE     = pipe_type | epn;\n    regs->TXINTERVAL = ep_desc->bInterval;\n    if (regs->TXCSRL & USB_TXCSRL1_TXRDY)\n      regs->TXCSRL = USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH;\n    else\n      regs->TXCSRL = USB_TXCSRL1_CLRDT;\n    USB0->TXIE |= TU_BIT(pipenum);\n  } else {\n    fadr->RXFUNCADDR = dev_addr;\n    fadr->RXHUBADDR  = bus_info.hub_addr;\n    fadr->RXHUBPORT  = bus_info.hub_port;\n    regs->RXMAXP     = mps;\n    regs->RXTYPE     = pipe_type | epn;\n    regs->RXINTERVAL = ep_desc->bInterval;\n    if (regs->RXCSRL & USB_RXCSRL1_RXRDY)\n      regs->RXCSRL = USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH;\n    else\n      regs->RXCSRL = USB_RXCSRL1_CLRDT;\n    USB0->RXIE |= TU_BIT(pipenum);\n  }\n\n  /* Setup FIFO */\n  int size_in_log2_minus3 = 28 - TU_MIN(28, __CLZ((uint32_t)mps));\n  if ((8u << size_in_log2_minus3) < mps) ++size_in_log2_minus3;\n  unsigned addr = find_free_memory(size_in_log2_minus3);\n  TU_ASSERT(addr);\n\n  USB0->EPIDX = pipenum;\n  if (dir_tx) {\n    USB0->TXFIFOADD = addr;\n    USB0->TXFIFOSZ  = size_in_log2_minus3;\n  } else {\n    USB0->RXFIFOADD = addr;\n    USB0->RXFIFOSZ  = size_in_log2_minus3;\n  }\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  (void) rhport; (void) daddr; (void) ep_addr;\n  return false; // TODO not implemented yet\n}\n\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen)\n{\n  (void)rhport;\n  bool ret = false;\n  if (0 == tu_edpt_number(ep_addr)) {\n    ret = edpt0_xfer(rhport, dev_addr, ep_addr, buffer, buflen);\n  } else {\n    ret = edpt_xfer(rhport, dev_addr, ep_addr, buffer, buflen);\n  }\n  return ret;\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n  // TODO not implemented yet\n  return false;\n}\n\n// clear stall, data toggle is also reset to DATA0\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  unsigned const pipenum = find_pipe(dev_addr, ep_addr);\n  if (!pipenum) return false;\n  hw_endpoint_t volatile *regs = edpt_regs(pipenum - 1);\n  unsigned const dir_tx = tu_edpt_dir(ep_addr) ? 0: 1;\n  if (dir_tx)\n    regs->TXCSRL = USB_TXCSRL1_CLRDT;\n  else\n    regs->RXCSRL = USB_RXCSRL1_CLRDT;\n  return true;\n}\n\n/*-------------------------------------------------------------------\n * ISR\n *-------------------------------------------------------------------*/\nvoid hcd_int_handler(uint8_t rhport, bool in_isr)\n{\n  (void) in_isr;\n\n  uint_fast8_t is, txis, rxis;\n\n  is   = USB0->IS;   /* read and clear interrupt status */\n  txis = USB0->TXIS; /* read and clear interrupt status */\n  rxis = USB0->RXIS; /* read and clear interrupt status */\n  // TU_LOG1(\"D%2x T%2x R%2x\\r\\n\", is, txis, rxis);\n\n  is &= USB0->IE; /* Clear disabled interrupts */\n  if (is & USB_IS_RESUME) {\n  }\n  if (is & USB_IS_CONN) {\n    _hcd.need_reset = true;\n    hcd_event_device_attach(rhport, true);\n  }\n  if (is & USB_IS_DISCON) {\n    hcd_event_device_remove(rhport, true);\n  }\n  if (is & USB_IS_BABBLE) {\n  }\n  txis &= USB0->TXIE; /* Clear disabled interrupts */\n  if (txis & USB_TXIE_EP0) {\n    process_ep0(rhport);\n    txis &= ~TU_BIT(0);\n  }\n  while (txis) {\n    unsigned const num = __builtin_ctz(txis);\n    process_pipe_tx(rhport, num);\n    txis &= ~TU_BIT(num);\n  }\n  rxis &= USB0->RXIE; /* Clear disabled interrupts */\n  while (rxis) {\n    unsigned const num = __builtin_ctz(rxis);\n    process_pipe_rx(rhport, num);\n    rxis &= ~TU_BIT(num);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/mentor/musb/musb_max32.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MUSB_MAX32_H_\n#define TUSB_MUSB_MAX32_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\n#include \"mxc_device.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"usbhs_regs.h\"\n\n#define MUSB_CFG_SHARED_FIFO   1 // shared FIFO for TX and RX endpoints\n#define MUSB_CFG_DYNAMIC_FIFO  0 // dynamic EP FIFO sizing\n\nconst uintptr_t MUSB_BASES[] = { MXC_BASE_USBHS };\n\n#if CFG_TUD_ENABLED\n#define USBHS_M31_CLOCK_RECOVERY\n\n// Mapping of IRQ numbers to port. Currently just 1.\nstatic const IRQn_Type musb_irqs[] = {\n    USB_IRQn\n};\n\nTU_ATTR_ALWAYS_INLINE static inline void musb_dcd_int_enable(uint8_t rhport) {\n  NVIC_EnableIRQ(musb_irqs[rhport]);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void musb_dcd_int_disable(uint8_t rhport) {\n  NVIC_DisableIRQ(musb_irqs[rhport]);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline unsigned musb_dcd_get_int_enable(uint8_t rhport) {\n  #ifdef NVIC_GetEnableIRQ // only defined in CMSIS 5\n  return NVIC_GetEnableIRQ(musb_irqs[rhport]);\n  #else\n  uint32_t IRQn = (uint32_t) musb_irqs[rhport];\n  return ((NVIC->ISER[IRQn >> 5UL] & (1UL << (IRQn & 0x1FUL))) != 0UL) ? 1UL : 0UL;\n  #endif\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void musb_dcd_int_clear(uint8_t rhport) {\n  NVIC_ClearPendingIRQ(musb_irqs[rhport]);\n}\n\nstatic inline void musb_dcd_int_handler_enter(uint8_t rhport) {\n  mxc_usbhs_regs_t* hs_phy = MXC_USBHS;\n  uint32_t mxm_int, mxm_int_en, mxm_is;\n\n  //Handle PHY specific events\n  mxm_int = hs_phy->mxm_int;\n  mxm_int_en = hs_phy->mxm_int_en;\n  mxm_is = mxm_int & mxm_int_en;\n  hs_phy->mxm_int = mxm_is;\n\n  if (mxm_is & MXC_F_USBHS_MXM_INT_NOVBUS) {\n    dcd_event_bus_signal(rhport, DCD_EVENT_UNPLUGGED, true);\n  }\n}\n\nstatic inline void musb_dcd_phy_init(uint8_t rhport) {\n  (void) rhport;\n  mxc_usbhs_regs_t* hs_phy = MXC_USBHS;\n\n  // Interrupt for VBUS disconnect\n  hs_phy->mxm_int_en |= MXC_F_USBHS_MXM_INT_EN_NOVBUS;\n\n  musb_dcd_int_clear(rhport);\n\n  // Unsuspend the MAC\n  hs_phy->mxm_suspend = 0;\n\n  // Configure PHY\n  hs_phy->m31_phy_xcfgi_31_0 = (0x1 << 3) | (0x1 << 11);\n  hs_phy->m31_phy_xcfgi_63_32 = 0;\n  hs_phy->m31_phy_xcfgi_95_64 = 0x1 << (72 - 64);\n  hs_phy->m31_phy_xcfgi_127_96 = 0;\n\n  #ifdef USBHS_M31_CLOCK_RECOVERY\n  hs_phy->m31_phy_noncry_rstb = 1;\n  hs_phy->m31_phy_noncry_en = 1;\n  hs_phy->m31_phy_outclksel = 0;\n  hs_phy->m31_phy_coreclkin = 0;\n  hs_phy->m31_phy_xtlsel = 2; /* Select 25 MHz clock */\n  #else\n  hs_phy->m31_phy_noncry_rstb = 0;\n  hs_phy->m31_phy_noncry_en = 0;\n  hs_phy->m31_phy_outclksel = 1;\n  hs_phy->m31_phy_coreclkin = 1;\n  hs_phy->m31_phy_xtlsel = 3; /* Select 30 MHz clock */\n  #endif\n  hs_phy->m31_phy_pll_en = 1;\n  hs_phy->m31_phy_oscouten = 1;\n\n  /* Reset PHY */\n  hs_phy->m31_phy_ponrst = 0;\n  hs_phy->m31_phy_ponrst = 1;\n}\n\n// static inline void musb_dcd_setup_fifo(uint8_t rhport, unsigned epnum, unsigned dir_in, unsigned mps) {\n//   (void) mps;\n//\n//   //Most likely the caller has already grabbed the right register block. But\n//   //as a precaution save and restore the register bank anyways\n//   unsigned saved_index = musb_periph_inst[rhport]->index;\n//\n//   musb_periph_inst[rhport]->index = epnum;\n//\n//   //Disable double buffering\n//   if (dir_in) {\n//     musb_periph_inst[rhport]->incsru |= (MXC_F_USBHS_INCSRU_DPKTBUFDIS | MXC_F_USBHS_INCSRU_MODE);\n//   } else {\n//     musb_periph_inst[rhport]->outcsru |= (MXC_F_USBHS_OUTCSRU_DPKTBUFDIS);\n//   }\n//\n//   musb_periph_inst[rhport]->index = saved_index;\n// }\n\n#endif // CFG_TUD_ENABLED\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // TUSB_MUSB_MAX32_H_\n"
  },
  {
    "path": "src/portable/mentor/musb/musb_ti.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, Brent Kowal (Analog Devices, Inc)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MUSB_TI_H_\n#define TUSB_MUSB_TI_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#if CFG_TUSB_MCU == OPT_MCU_TM4C123\n  #include \"TM4C123.h\"\n  #define FIFO0_WORD FIFO0\n  #define FIFO1_WORD FIFO1\n#elif CFG_TUSB_MCU == OPT_MCU_TM4C129\n  #include \"TM4C129.h\"\n  #define FIFO0_WORD FIFOA\n  #define FIFO1_WORD FIFOB\n#elif CFG_TUSB_MCU == OPT_MCU_MSP432E4\n  #include \"msp.h\"\n#else\n  #error \"Unsupported MCUs\"\n#endif\n\n#define MUSB_CFG_SHARED_FIFO       0\n#define MUSB_CFG_DYNAMIC_FIFO      1\n#define MUSB_CFG_DYNAMIC_FIFO_SIZE 4096\n\nconst uintptr_t MUSB_BASES[] = { USB0_BASE };\n\n// Header supports both device and host modes. Only include what's necessary\n#if CFG_TUD_ENABLED\n\n// Mapping of IRQ numbers to port. Currently just 1.\nstatic const IRQn_Type  musb_irqs[] = {\n    USB0_IRQn\n};\n\nstatic inline void musb_dcd_phy_init(uint8_t rhport){\n  (void)rhport;\n  //Nothing to do for this part\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void musb_dcd_int_enable(uint8_t rhport) {\n  NVIC_EnableIRQ(musb_irqs[rhport]);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void musb_dcd_int_disable(uint8_t rhport) {\n  NVIC_DisableIRQ(musb_irqs[rhport]);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline unsigned musb_dcd_get_int_enable(uint8_t rhport) {\n  return NVIC_GetEnableIRQ(musb_irqs[rhport]);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void musb_dcd_int_clear(uint8_t rhport) {\n  NVIC_ClearPendingIRQ(musb_irqs[rhport]);\n}\n\nstatic inline void musb_dcd_int_handler_enter(uint8_t rhport) {\n  (void)rhport;\n  //Nothing to do for this part\n}\n\n#endif // CFG_TUD_ENABLED\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif // TUSB_MUSB_TI_H_\n"
  },
  {
    "path": "src/portable/mentor/musb/musb_type.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/******************************************************************************\n*\n* Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/\n*\n* Redistribution and use in source and binary forms, with or without\n* modification, are permitted provided that the following conditions\n* are met:\n*\n*  Redistributions of source code must retain the above copyright\n*  notice, this list of conditions and the following disclaimer.\n*\n*  Redistributions in binary form must reproduce the above copyright\n*  notice, this list of conditions and the following disclaimer in the\n*  documentation and/or other materials provided with the\n*  distribution.\n*\n*  Neither the name of Texas Instruments Incorporated nor the names of\n*  its contributors may be used to endorse or promote products derived\n*  from this software 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\n* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*\n*******************************************************************************/\n\n#ifndef TUSB_MUSB_TYPE_H_\n#define TUSB_MUSB_TYPE_H_\n\n#include \"stdint.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifndef __IO\n  #define __IO volatile\n#endif\n\n#ifndef __I\n  #define __I  volatile const\n#endif\n\n#ifndef __O\n  #define __O  volatile\n#endif\n\n#ifndef __R\n  #define __R  volatile const\n#endif\n\ntypedef struct TU_ATTR_PACKED {\n  __IO uint16_t maxp;          // 0x00, 0x04: MAXP\n  __IO uint8_t  csrl;          // 0x02, 0x06: CSRL\n  __IO uint8_t  csrh;          // 0x03, 0x07: CSRH\n}musb_ep_maxp_csr_t;\n\n// 0: TX (device IN, host OUT)\n// 1: RX (device OUT, host IN)\ntypedef struct TU_ATTR_PACKED {\n  union {\n    struct {\n      __IO uint16_t tx_maxp;       // 0x00: TXMAXP\n      union {\n        __IO uint8_t csr0l;        // 0x02: CSR0\n        __IO uint8_t tx_csrl;      // 0x02: TX CSRL\n      };\n      union {\n        __IO uint8_t csr0h;        // 0x03: CSR0H\n        __IO uint8_t tx_csrh;      // 0x03: TX CSRH\n      };\n\n      __IO uint16_t rx_maxp;       // 0x04: RX MAXP\n      __IO uint8_t  rx_csrl;       // 0x06: RX CSRL\n      __IO uint8_t  rx_csrh;       // 0x07: RX CSRH\n    };\n\n    musb_ep_maxp_csr_t maxp_csr[2];\n  };\n\n  union {\n    __IO uint16_t count0;      // 0x08: COUNT0\n    __IO uint16_t rx_count;    // 0x08: RX COUNT\n  };\n  union {\n    __IO uint8_t type0;        // 0x0A: TYPE0 (host only)\n    __IO uint8_t tx_type;      // 0x0A: TX TYPE\n  };\n  __IO uint8_t tx_interval;    // 0x0B: TX INTERVAL\n  __IO uint8_t rx_type;        // 0x0C: RX TYPE\n  __IO uint8_t rx_interval;    // 0x0D: RX INTERVAL\n  __IO uint8_t reserved_0x0e;  // 0x0E: Reserved\n  union {\n    __IO uint8_t config_data0; // 0x0F: CONFIG DATA\n    struct {\n      __IO uint8_t utmi_data_width : 1; // [0] UTMI Data Width\n      __IO uint8_t softconn_en     : 1; // [1] Soft Connect Enable\n      __IO uint8_t dynamic_fifo    : 1; // [2] Dynamic FIFO Sizing\n      __IO uint8_t hb_tx_en        : 1; // [3] High Bandwidth TX ISO Enable\n      __IO uint8_t hb_rx_en        : 1; // [4] High Bandwidth RX ISO Enable\n      __IO uint8_t big_endian      : 1; // [5] Big Endian\n      __IO uint8_t mp_tx_en        : 1; // [6] Auto splitting BULK TX Enable\n      __IO uint8_t mp_rx_en        : 1; // [7] Auto amalgamation BULK RX Enable\n    } config_data0_bit;\n\n    __IO uint8_t fifo_size;    // 0x0F: FIFO_SIZE\n    struct {\n      __IO uint8_t tx : 4;  // [3:0] TX FIFO Size\n      __IO uint8_t rx : 4;  // [7:4] RX FIFO Size\n    }fifo_size_bit;\n  };\n} musb_ep_csr_t;\n\nTU_VERIFY_STATIC(sizeof(musb_ep_csr_t) == 16, \"size is not correct\");\n\ntypedef struct {\n  //------------- Common -------------//\n  __IO uint8_t  faddr;             // 0x00: FADDR\n  union {\n    __IO uint8_t  power;             // 0x01: POWER\n    struct {\n      __IO uint8_t suspend_mode_en : 1; // [0] SUSPEND Mode Enable\n      __IO uint8_t suspend_mode    : 1; // [1] SUSPEND Mode\n      __IO uint8_t resume_mode     : 1; // [2] RESUME\n      __IO uint8_t reset           : 1; // [3] RESET\n      __IO uint8_t highspeed_mode  : 1; // [4] High Speed Mode\n      __IO uint8_t highspeed_en    : 1; // [5] High Speed Enable\n      __IO uint8_t soft_conn       : 1; // [6] Soft Connect/Disconnect\n      __IO uint8_t iso_update      : 1; // [7] Isochronous Update\n    } power_bit;\n  };\n\n  union {\n    struct {\n      __IO uint16_t intr_tx;           // 0x02: INTR_TX\n      __IO uint16_t intr_rx;           // 0x04: INTR_RX\n    };\n\n    __IO uint16_t intr_ep[2];         // 0x02-0x05: INTR_EP0-1\n  };\n\n  union {\n    struct {\n      __IO uint16_t intr_txen;         // 0x06: INTR_TXEN\n      __IO uint16_t intr_rxen;         // 0x08: INTR_RXEN\n    };\n\n    __IO uint16_t intren_ep[2];       // 0x06-0x09: INTREN_EP0-1\n  };\n\n  __IO uint8_t  intr_usb;          // 0x0A: INTRUSB\n  __IO uint8_t  intr_usben;        // 0x0B: INTRUSBEN\n\n  __IO uint16_t frame;             // 0x0C: FRAME\n  __IO uint8_t  index;             // 0x0E: INDEX\n  __IO uint8_t  testmode;          // 0x0F: TESTMODE\n\n  //------------- Endpoint CSR (indexed) -------------//\n  musb_ep_csr_t indexed_csr;       // 0x10-0x1F: Indexed CSR 0-15\n\n  //------------- FIFOs -------------//\n  __IO uint32_t fifo[16];          // 0x20-0x5C: FIFO 0-15\n\n  // Common (2)\n  __IO uint8_t  devctl;            // 0x60: DEVCTL\n  __IO uint8_t  misc;              // 0x61: MISC\n\n  //------------- Dynammic FIFO (indexed) -------------//\n  union {\n    struct {\n      __IO uint8_t  txfifo_sz;         // 0x62: TXFIFO_SZ\n      __IO uint8_t  rxfifo_sz;         // 0x63: RXFIFO_SZ\n    };\n    __IO uint8_t fifo_size[2];\n  };\n\n  union {\n    struct {\n      __IO uint16_t txfifo_addr;       // 0x64: TXFIFO_ADDR\n      __IO uint16_t rxfifo_addr;       // 0x66: RXFIFO_ADDR\n    };\n    __IO uint16_t fifo_addr[2];\n  };\n\n  //------------- Additional Control and Configuration -------------//\n  union {\n    __O  uint32_t vcontrol;        // 0x68: PHY VCONTROL\n    __IO uint32_t vstatus;         // 0x68: PHY VSTATUS\n  };\n  union {\n    __IO uint16_t hwvers;            // 0x6C: HWVERS\n    struct {\n      __IO uint16_t minor : 10;     // [9:0] Minor\n      __IO uint16_t major : 5;      // [14:10] Major\n      __IO uint16_t rc    : 1;      // [15] Release Candidate\n    } hwvers_bit;\n  };\n  __R  uint16_t rsv_0x6e_0x77[5];  // 0x6E-0x77: Reserved\n\n   //------------- Additional Configuration -------------//\n  union {\n    __IO uint8_t  epinfo;            // 0x78: EPINFO\n    struct {\n      __IO uint8_t tx_ep_num : 4;    // [3:0] TX Endpoints\n      __IO uint8_t rx_ep_num : 4;    // [7:4] RX Endpoints\n    } epinfo_bit;\n  };\n  union {\n    __IO uint8_t  raminfo;           // 0x79: RAMINFO\n    struct {\n      __IO uint8_t ram_bits    : 4;  // [3:0] RAM Address Bus Width\n      __IO uint8_t dma_channel : 4;  // [7:4] DMA Channels\n    }raminfo_bit;\n  };\n  union {\n    __IO uint8_t  link_info;       // 0x7A: LINK_INFO\n    __IO uint8_t  adi_softreset;   // 0x7A: AnalogDevice SOFTRESET\n  };\n  __IO uint8_t  vplen;             // 0x7B: VPLEN\n  __IO uint8_t  hs_eof1;           // 0x7C: HS_EOF1\n  __IO uint8_t  fs_eof1;           // 0x7D: FS_EOF1\n  __IO uint8_t  ls_eof1;           // 0x7E: LS_EOF1\n  __IO uint8_t  soft_rst;          // 0x7F: SOFT_RST\n\n  //------------- Target Endpoints (multipoint option) -------------//\n  __IO uint16_t ctuch;             // 0x80: CTUCH\n  __IO uint16_t cthsrtn;           // 0x82: CTHSRTN\n  __R  uint32_t rsv_0x84_0xff[31]; // 0x84-0xFF: Reserved\n\n  //------------- Non-Indexed Endpoint CSRs -------------//\n  // TI tm4c can access this directly, but should use indexed_csr for portability\n  musb_ep_csr_t abs_csr[16];        // 0x100-0x1FF: EP0-15 CSR\n\n  //------------- DMA -------------//\n  __IO uint8_t dma_intr;             // 0x200: DMA_INTR\n  __R  uint8_t rsv_0x201_0x203[3];   // 0x201-0x203: Reserved\n  struct {\n    __IO uint16_t cntl;             // 0x204: DMA_CNTL\n    __IO uint16_t rsv_0x206;        // 0x206: Reserved\n    __IO uint32_t addr;             // 0x208: DMA_ADDR\n    __IO uint32_t count;            // 0x20C: DMA_COUNT\n    __IO uint32_t rsv_0x210;        // 0x210: Reserved\n  }dma[8];\n  __R  uint32_t rsv_0x284_0x2FF[31]; // 0x284-0x2FF: Reserved\n\n  //------------- Extended -------------//\n  __R uint32_t rsv_0x300;           // 0x300: Reserved\n  struct {\n    __IO uint16_t count;            // 0x304: REQ_PACKET_COUNT\n    __R  uint16_t rsv_0x306;        // 0x306: Reserved\n  }req_packet[15];\n\n  __IO uint16_t rx_doulbe_packet_disable; // 0x340: RX_DOUBLE_PACKET_DISABLE\n  __IO uint16_t tx_double_packet_disable; // 0x342: TX_DOUBLE_PACKET_DISABLE\n\n  __IO uint16_t chirp_timeout;            // 0x344: CHIRP_TIMEOUT\n  __IO uint16_t hs_to_utm;                // 0x346: HS_TO_UTM delay\n  __IO uint16_t hs_timeout_adder;         // 0x348: HS_TIMEOUT_ADDER\n\n  __R uint8_t rsv_34A_34f[6];             // 0x34A-0x34F: Reserved\n} musb_regs_t;\n\nTU_VERIFY_STATIC(sizeof(musb_regs_t) == 0x350, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// Helper\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline musb_ep_csr_t* get_ep_csr(musb_regs_t* musb_regs, unsigned epnum) {\n  musb_regs->index = epnum;\n  return &musb_regs->indexed_csr;\n}\n\n//--------------------------------------------------------------------+\n// Register Bit Field\n//--------------------------------------------------------------------+\n\n// 0x01: Power\n#define MUSB_POWER_ISOUP         0x0080  // Isochronous Update\n#define MUSB_POWER_SOFTCONN      0x0040  // Soft Connect/Disconnect\n#define MUSB_POWER_HSENAB        0x0020  // High Speed Enable\n#define MUSB_POWER_HSMODE        0x0010  // High Speed Enable\n#define MUSB_POWER_RESET         0x0008  // RESET Signaling\n#define MUSB_POWER_RESUME        0x0004  // RESUME Signaling\n#define MUSB_POWER_SUSPEND       0x0002  // SUSPEND Mode\n#define MUSB_POWER_PWRDNPHY      0x0001  // Power Down PHY\n\n// Interrupt TX/RX Status and Enable: each bit is for an endpoint\n\n// 0x6c: HWVERS\n#define MUSB_HWVERS_RC_SHIFT    15\n#define MUSB_HWVERS_RC_MASK     0x8000\n#define MUSB_HWVERS_MAJOR_SHIFT 10\n#define MUSB_HWVERS_MAJOR_MASK  0x7C00\n#define MUSB_HWVERS_MINOR_SHIFT 0\n#define MUSB_HWVERS_MINOR_MASK  0x03FF\n\n// 0x12, 0x16: TX/RX CSRL\n#define MUSB_CSRL_PACKET_READY(_rx)      (1u << 0)\n#define MUSB_CSRL_FLUSH_FIFO(_rx)        (1u << ((_rx) ? 4 : 3))\n#define MUSB_CSRL_SEND_STALL(_rx)        (1u << ((_rx) ? 5 : 4))\n#define MUSB_CSRL_STALLED(_rx)           (1u << ((_rx) ? 6 : 5))\n#define MUSB_CSRL_CLEAR_DATA_TOGGLE(_rx) (1u << ((_rx) ? 7 : 6))\n\n// 0x13, 0x17: TX/RX CSRH\n#define MUSB_CSRH_DISABLE_DOUBLE_PACKET(_rx) (1u << 1)\n#define MUSB_CSRH_TX_MODE                    (1u << 5) // 1 = TX, 0 = RX. only relevant for SHARED FIFO\n#define MUSB_CSRH_ISO                        (1u << 6)\n\n// 0x62, 0x63: TXFIFO_SZ, RXFIFO_SZ\n#define MUSB_FIFOSZ_DOUBLE_PACKET            (1u << 4)\n\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_IS register.\n//\n//*****************************************************************************\n#define MUSB_IS_VBUSERR          0x0080  // VBUS Error (OTG only)\n#define MUSB_IS_SESREQ           0x0040  // SESSION REQUEST (OTG only)\n#define MUSB_IS_DISCON           0x0020  // Session Disconnect (OTG only)\n#define MUSB_IS_CONN             0x0010  // Session Connect\n#define MUSB_IS_SOF              0x0008  // Start of Frame\n#define MUSB_IS_BABBLE           0x0004  // Babble Detected\n#define MUSB_IS_RESET            0x0004  // RESET Signaling Detected\n#define MUSB_IS_RESUME           0x0002  // RESUME Signaling Detected\n#define MUSB_IS_SUSPEND          0x0001  // SUSPEND Signaling Detected\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_IE register.\n//\n//*****************************************************************************\n#define MUSB_IE_VBUSERR          0x0080  // Enable VBUS Error Interrupt (OTG only)\n#define MUSB_IE_SESREQ           0x0040  // Enable Session Request (OTG only)\n#define MUSB_IE_DISCON           0x0020  // Enable Disconnect Interrupt\n#define MUSB_IE_CONN             0x0010  // Enable Connect Interrupt\n#define MUSB_IE_SOF              0x0008  // Enable Start-of-Frame Interrupt\n#define MUSB_IE_BABBLE           0x0004  // Enable Babble Interrupt\n#define MUSB_IE_RESET            0x0004  // Enable RESET Interrupt\n#define MUSB_IE_RESUME           0x0002  // Enable RESUME Interrupt\n#define MUSB_IE_SUSPND           0x0001  // Enable SUSPEND Interrupt\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_FRAME register.\n//\n//*****************************************************************************\n#define MUSB_FRAME_M             0x07FF  // Frame Number\n#define MUSB_FRAME_S             0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_TEST register.\n//\n//*****************************************************************************\n#define MUSB_TEST_FORCEH         0x0080  // Force Host Mode\n#define MUSB_TEST_FIFOACC        0x0040  // FIFO Access\n#define MUSB_TEST_FORCEFS        0x0020  // Force Full-Speed Mode\n#define MUSB_TEST_FORCEHS        0x0010  // Force High-Speed Mode\n#define MUSB_TEST_TESTPKT        0x0008  // Test Packet Mode Enable\n#define MUSB_TEST_TESTK          0x0004  // Test_K Mode Enable\n#define MUSB_TEST_TESTJ          0x0002  // Test_J Mode Enable\n#define MUSB_TEST_TESTSE0NAK     0x0001  // Test_SE0_NAK Test Mode Enable\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_DEVCTL register.\n//\n//*****************************************************************************\n#define MUSB_DEVCTL_DEV          0x0080  // Device Mode (OTG only)\n#define MUSB_DEVCTL_FSDEV        0x0040  // Full-Speed Device Detected\n#define MUSB_DEVCTL_LSDEV        0x0020  // Low-Speed Device Detected\n#define MUSB_DEVCTL_VBUS_M       0x0018  // VBUS Level (OTG only)\n#define MUSB_DEVCTL_VBUS_NONE    0x0000  // Below SessionEnd\n#define MUSB_DEVCTL_VBUS_SEND    0x0008  // Above SessionEnd, below AValid\n#define MUSB_DEVCTL_VBUS_AVALID  0x0010  // Above AValid, below VBUSValid\n#define MUSB_DEVCTL_VBUS_VALID   0x0018  // Above VBUSValid\n#define MUSB_DEVCTL_HOST         0x0004  // Host Mode\n#define MUSB_DEVCTL_HOSTREQ      0x0002  // Host Request (OTG only)\n#define MUSB_DEVCTL_SESSION      0x0001  // Session Start/End (OTG only)\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_CCONF register.\n//\n//*****************************************************************************\n#define MUSB_CCONF_TXEDMA        0x0002  // TX Early DMA Enable\n#define MUSB_CCONF_RXEDMA        0x0001  // TX Early DMA Enable\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_ULPIVBUSCTL\n// register.\n//\n//*****************************************************************************\n#define MUSB_ULPIVBUSCTL_USEEXTVBUSIND  0x0002  // Use External VBUS Indicator\n#define MUSB_ULPIVBUSCTL_USEEXTVBUS     0x0001  // Use External VBUS\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_ULPIREGDATA\n// register.\n//\n//*****************************************************************************\n#define MUSB_ULPIREGDATA_REGDATA_M      0x00FF  // Register Data\n#define MUSB_ULPIREGDATA_REGDATA_S      0\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_ULPIREGADDR\n// register.\n//\n//*****************************************************************************\n#define MUSB_ULPIREGADDR_ADDR_M  0x00FF  // Register Address\n#define MUSB_ULPIREGADDR_ADDR_S  0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_ULPIREGCTL\n// register.\n//\n//*****************************************************************************\n#define MUSB_ULPIREGCTL_RDWR     0x0004  // Read/Write Control\n#define MUSB_ULPIREGCTL_REGCMPLT 0x0002  // Register Access Complete\n#define MUSB_ULPIREGCTL_REGACC   0x0001  // Initiate Register Access\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_EPINFO register.\n//\n//*****************************************************************************\n#define MUSB_EPINFO_RXEP_M       0x00F0  // RX Endpoints\n#define MUSB_EPINFO_TXEP_M       0x000F  // TX Endpoints\n#define MUSB_EPINFO_RXEP_S       4\n#define MUSB_EPINFO_TXEP_S       0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_RAMINFO register.\n//\n//*****************************************************************************\n#define MUSB_RAMINFO_DMACHAN_M   0x00F0  // DMA Channels\n#define MUSB_RAMINFO_RAMBITS_M   0x000F  // RAM Address Bus Width\n#define MUSB_RAMINFO_DMACHAN_S   4\n#define MUSB_RAMINFO_RAMBITS_S   0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_CONTIM register.\n//\n//*****************************************************************************\n#define MUSB_CONTIM_WTCON_M      0x00F0  // Connect Wait\n#define MUSB_CONTIM_WTID_M       0x000F  // Wait ID\n#define MUSB_CONTIM_WTCON_S      4\n#define MUSB_CONTIM_WTID_S       0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_VPLEN register.\n//\n//*****************************************************************************\n#define MUSB_VPLEN_VPLEN_M       0x00FF  // VBUS Pulse Length\n#define MUSB_VPLEN_VPLEN_S       0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_HSEOF register.\n//\n//*****************************************************************************\n#define MUSB_HSEOF_HSEOFG_M      0x00FF  // HIgh-Speed End-of-Frame Gap\n#define MUSB_HSEOF_HSEOFG_S      0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_FSEOF register.\n//\n//*****************************************************************************\n#define MUSB_FSEOF_FSEOFG_M      0x00FF  // Full-Speed End-of-Frame Gap\n#define MUSB_FSEOF_FSEOFG_S      0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_LSEOF register.\n//\n//*****************************************************************************\n#define MUSB_LSEOF_LSEOFG_M      0x00FF  // Low-Speed End-of-Frame Gap\n#define MUSB_LSEOF_LSEOFG_S      0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_CSRL0 register.\n//\n//*****************************************************************************\n#define MUSB_CSRL0_NAKTO         0x0080  // NAK Timeout\n#define MUSB_CSRL0_SETENDC       0x0080  // Setup End Clear\n#define MUSB_CSRL0_STATUS        0x0040  // STATUS Packet\n#define MUSB_CSRL0_RXRDYC        0x0040  // RXRDY Clear\n#define MUSB_CSRL0_REQPKT        0x0020  // Request Packet\n#define MUSB_CSRL0_STALL         0x0020  // Send Stall\n#define MUSB_CSRL0_SETEND        0x0010  // Setup End\n#define MUSB_CSRL0_ERROR         0x0010  // Error\n#define MUSB_CSRL0_DATAEND       0x0008  // Data End\n#define MUSB_CSRL0_SETUP         0x0008  // Setup Packet\n#define MUSB_CSRL0_STALLED       0x0004  // Endpoint Stalled\n#define MUSB_CSRL0_TXRDY         0x0002  // Transmit Packet Ready\n#define MUSB_CSRL0_RXRDY         0x0001  // Receive Packet Ready\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_CSRH0 register.\n//\n//*****************************************************************************\n#define MUSB_CSRH0_DISPING       0x0008  // PING Disable\n#define MUSB_CSRH0_DTWE          0x0004  // Data Toggle Write Enable\n#define MUSB_CSRH0_DT            0x0002  // Data Toggle\n#define MUSB_CSRH0_FLUSH         0x0001  // Flush FIFO\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_TYPE0 register.\n//\n//*****************************************************************************\n#define MUSB_TYPE0_SPEED_M       0x00C0  // Operating Speed\n#define MUSB_TYPE0_SPEED_HIGH    0x0040  // High\n#define MUSB_TYPE0_SPEED_FULL    0x0080  // Full\n#define MUSB_TYPE0_SPEED_LOW     0x00C0  // Low\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_NAKLMT register.\n//\n//*****************************************************************************\n#define MUSB_NAKLMT_NAKLMT_M     0x001F  // EP0 NAK Limit\n#define MUSB_NAKLMT_NAKLMT_S     0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_TXCSRL1 register.\n//\n//*****************************************************************************\n#define MUSB_TXCSRL1_NAKTO       0x0080  // NAK Timeout\n#define MUSB_TXCSRL1_CLRDT       0x0040  // Clear Data Toggle\n#define MUSB_TXCSRL1_STALLED     0x0020  // Endpoint Stalled\n#define MUSB_TXCSRL1_STALL       0x0010  // Send STALL\n#define MUSB_TXCSRL1_SETUP       0x0010  // Setup Packet\n#define MUSB_TXCSRL1_FLUSH       0x0008  // Flush FIFO\n#define MUSB_TXCSRL1_ERROR       0x0004  // Error\n#define MUSB_TXCSRL1_UNDRN       0x0004  // Underrun\n#define MUSB_TXCSRL1_FIFONE      0x0002  // FIFO Not Empty\n#define MUSB_TXCSRL1_TXRDY       0x0001  // Transmit Packet Ready\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_TXCSRH1 register.\n//\n//*****************************************************************************\n#define MUSB_TXCSRH1_AUTOSET     0x0080  // Auto Set\n#define MUSB_TXCSRH1_ISO         0x0040  // Isochronous Transfers\n#define MUSB_TXCSRH1_MODE        0x0020  // Mode\n#define MUSB_TXCSRH1_DMAEN       0x0010  // DMA Request Enable\n#define MUSB_TXCSRH1_FDT         0x0008  // Force Data Toggle\n#define MUSB_TXCSRH1_DMAMOD      0x0004  // DMA Request Mode\n#define MUSB_TXCSRH1_DTWE        0x0002  // Data Toggle Write Enable\n#define MUSB_TXCSRH1_DT          0x0001  // Data Toggle\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_RXCSRL1 register.\n//\n//*****************************************************************************\n#define MUSB_RXCSRL1_CLRDT       0x0080  // Clear Data Toggle\n#define MUSB_RXCSRL1_STALLED     0x0040  // Endpoint Stalled\n#define MUSB_RXCSRL1_STALL       0x0020  // Send STALL\n#define MUSB_RXCSRL1_REQPKT      0x0020  // Request Packet\n#define MUSB_RXCSRL1_FLUSH       0x0010  // Flush FIFO\n#define MUSB_RXCSRL1_DATAERR     0x0008  // Data Error\n#define MUSB_RXCSRL1_NAKTO       0x0008  // NAK Timeout\n#define MUSB_RXCSRL1_OVER        0x0004  // Overrun\n#define MUSB_RXCSRL1_ERROR       0x0004  // Error\n#define MUSB_RXCSRL1_FULL        0x0002  // FIFO Full\n#define MUSB_RXCSRL1_RXRDY       0x0001  // Receive Packet Ready\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_RXCSRH1 register.\n//\n//*****************************************************************************\n#define MUSB_RXCSRH1_AUTOCL      0x0080  // Auto Clear\n#define MUSB_RXCSRH1_AUTORQ      0x0040  // Auto Request\n#define MUSB_RXCSRH1_ISO         0x0040  // Isochronous Transfers\n#define MUSB_RXCSRH1_DMAEN       0x0020  // DMA Request Enable\n#define MUSB_RXCSRH1_DISNYET     0x0010  // Disable NYET\n#define MUSB_RXCSRH1_PIDERR      0x0010  // PID Error\n#define MUSB_RXCSRH1_DMAMOD      0x0008  // DMA Request Mode\n#define MUSB_RXCSRH1_DTWE        0x0004  // Data Toggle Write Enable\n#define MUSB_RXCSRH1_DT          0x0002  // Data Toggle\n#define MUSB_RXCSRH1_INCOMPRX    0x0001  // Incomplete RX Transmission Status\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_TXTYPE1 register.\n//\n//*****************************************************************************\n#define MUSB_TXTYPE1_SPEED_M     0x00C0  // Operating Speed\n#define MUSB_TXTYPE1_SPEED_DFLT  0x0000  // Default\n#define MUSB_TXTYPE1_SPEED_HIGH  0x0040  // High\n#define MUSB_TXTYPE1_SPEED_FULL  0x0080  // Full\n#define MUSB_TXTYPE1_SPEED_LOW   0x00C0  // Low\n#define MUSB_TXTYPE1_PROTO_M     0x0030  // Protocol\n#define MUSB_TXTYPE1_PROTO_CTRL  0x0000  // Control\n#define MUSB_TXTYPE1_PROTO_ISOC  0x0010  // Isochronous\n#define MUSB_TXTYPE1_PROTO_BULK  0x0020  // Bulk\n#define MUSB_TXTYPE1_PROTO_INT   0x0030  // Interrupt\n#define MUSB_TXTYPE1_TEP_M       0x000F  // Target Endpoint Number\n#define MUSB_TXTYPE1_TEP_S       0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_TXINTERVAL1\n// register.\n//\n//*****************************************************************************\n#define MUSB_TXINTERVAL1_NAKLMT_M 0x00FF  // NAK Limit\n#define MUSB_TXINTERVAL1_TXPOLL_M 0x00FF  // TX Polling\n#define MUSB_TXINTERVAL1_TXPOLL_S 0\n#define MUSB_TXINTERVAL1_NAKLMT_S 0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_RXTYPE1 register.\n//\n//*****************************************************************************\n#define MUSB_RXTYPE1_SPEED_M     0x00C0  // Operating Speed\n#define MUSB_RXTYPE1_SPEED_DFLT  0x0000  // Default\n#define MUSB_RXTYPE1_SPEED_HIGH  0x0040  // High\n#define MUSB_RXTYPE1_SPEED_FULL  0x0080  // Full\n#define MUSB_RXTYPE1_SPEED_LOW   0x00C0  // Low\n#define MUSB_RXTYPE1_PROTO_M     0x0030  // Protocol\n#define MUSB_RXTYPE1_PROTO_CTRL  0x0000  // Control\n#define MUSB_RXTYPE1_PROTO_ISOC  0x0010  // Isochronous\n#define MUSB_RXTYPE1_PROTO_BULK  0x0020  // Bulk\n#define MUSB_RXTYPE1_PROTO_INT   0x0030  // Interrupt\n#define MUSB_RXTYPE1_TEP_M       0x000F  // Target Endpoint Number\n#define MUSB_RXTYPE1_TEP_S       0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_RXINTERVAL1\n// register.\n//\n//*****************************************************************************\n#define MUSB_RXINTERVAL1_TXPOLL_M 0x00FF  // RX Polling\n#define MUSB_RXINTERVAL1_NAKLMT_M 0x00FF  // NAK Limit\n#define MUSB_RXINTERVAL1_TXPOLL_S 0\n#define MUSB_RXINTERVAL1_NAKLMT_S 0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_DMACTL0 register.\n//\n//*****************************************************************************\n#define MUSB_DMACTL0_BRSTM_M     0x0600  // Burst Mode\n#define MUSB_DMACTL0_BRSTM_ANY   0x0000  // Bursts of unspecified length\n#define MUSB_DMACTL0_BRSTM_INC4  0x0200  // INCR4 or unspecified length\n#define MUSB_DMACTL0_BRSTM_INC8  0x0400  // INCR8, INCR4 or unspecified\n                                            // length\n#define MUSB_DMACTL0_BRSTM_INC16 0x0600  // INCR16, INCR8, INCR4 or\n                                            // unspecified length\n#define MUSB_DMACTL0_ERR         0x0100  // Bus Error Bit\n#define MUSB_DMACTL0_EP_M        0x00F0  // Endpoint number\n#define MUSB_DMACTL0_IE          0x0008  // DMA Interrupt Enable\n#define MUSB_DMACTL0_MODE        0x0004  // DMA Transfer Mode\n#define MUSB_DMACTL0_DIR         0x0002  // DMA Direction\n#define MUSB_DMACTL0_ENABLE      0x0001  // DMA Transfer Enable\n#define MUSB_DMACTL0_EP_S        4\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_DMAADDR0 register.\n//\n//*****************************************************************************\n#define MUSB_DMAADDR0_ADDR_M     0xFFFFFFFC  // DMA Address\n#define MUSB_DMAADDR0_ADDR_S     2\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_DMACOUNT0\n// register.\n//\n//*****************************************************************************\n#define MUSB_DMACOUNT0_COUNT_M   0xFFFFFFFC  // DMA Count\n#define MUSB_DMACOUNT0_COUNT_S   2\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_CTO register.\n//\n//*****************************************************************************\n#define MUSB_CTO_CCTV_M          0xFFFF  // Configurable Chirp Timeout Value\n#define MUSB_CTO_CCTV_S          0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_HHSRTN register.\n//\n//*****************************************************************************\n#define MUSB_HHSRTN_HHSRTN_M     0xFFFF  // HIgh Speed to UTM Operating\n                                            // Delay\n#define MUSB_HHSRTN_HHSRTN_S     0\n\n//*****************************************************************************\n//\n// The following are defines for the bit fields in the MUSB_O_HSBT register.\n//\n//*****************************************************************************\n#define MUSB_HSBT_HSBT_M         0x000F  // High Speed Timeout Adder\n#define MUSB_HSBT_HSBT_S         0\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/microchip/pic/README.md",
    "content": "# Microchip PIC Chipidea FS Driver\n\nThis driver adds support for Microchip PIC microcontrollers with full-speed Chipidea USB peripheral to the TinyUSB stack. It supports the following families:\n\n- PIC32MX (untested)\n- PIC32MM\n- PIC32MK (untested)\n- PIC24FJ\n- PIC24EP (untested)\n- dsPIC33EP (untested)\n\nCurrently only the device mode is supported.\n\n\n## Important Notes\n\n### Handling of shared VBUS & GPIO pin\n\nSome PICs have the USB VBUS pin bonded with a GPIO pin in the chip package. This driver does **NOT** handle the potential conflict between the VBUS and GPIO functionalities.\n\nDevelopers must ensure that the GPIO pin is tristated when the VBUS pin is managed by the USB peripheral in order to prevent damaging the chip.\n\nThis design choice allows developers the flexibility to use the GPIO functionality for controlling VBUS in device mode if desired.\n\n\n## TODO\n\n### Handle USB remote wakeup timing correctly\n\nThe Chipidea FS IP doesn't handle the RESUME signal automatically and it must be managed in software. It needs to be asserted for exactly 10ms, and this is impossible to do without per-device support due to BSP differences. For now, a simple for-based loop is used.\n\n### 8-bit PIC support\n\nThe 8-bit PICs also uses the Chipidea FS IP. Technically it's possible to support them as well.\n\nPossible difficulties:\n- Memory size constraints (1KB/8KB ballpark)\n- A third BDT layout (now we have two)\n- Different compiler-specific directives\n- Compiler bugs if you use SDCC\n\n\n## Author\n[ReimuNotMoe](https://github.com/ReimuNotMoe) at SudoMaker, Ltd.\n\n\n## Credits\n\nThis driver is based on:\n- Microchip's USB driver (usb_device.c)\n- TinyUSB's NXP KHCI driver (dcd_khci.c)\n"
  },
  {
    "path": "src/portable/microchip/pic/dcd_pic.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022-2024 SudoMaker, Ltd.\n * Author: Mike Yang (Reimu NotMoe) <reimu@sudomaker.com>\n *\n * Based on usb_device.c - Copyright (c) 2015 Microchip Technology Inc.\n * Based on dcd_khci.c   - Copyright (c) 2020 Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && \\\n    (CFG_TUSB_MCU == OPT_MCU_PIC32MX || CFG_TUSB_MCU == OPT_MCU_PIC32MM || \\\n     CFG_TUSB_MCU == OPT_MCU_PIC32MK || CFG_TUSB_MCU == OPT_MCU_PIC24 || \\\n     CFG_TUSB_MCU == OPT_MCU_DSPIC33)\n\n#include <xc.h>\n\n#include \"device/dcd.h\"\n\n\n#if (CFG_TUSB_MCU == OPT_MCU_PIC32MX || CFG_TUSB_MCU == OPT_MCU_PIC32MM || CFG_TUSB_MCU == OPT_MCU_PIC32MK)\n\n#define TU_PIC_INT_SIZE         4\n\n#elif (CFG_TUSB_MCU == OPT_MCU_PIC24 || CFG_TUSB_MCU == OPT_MCU_DSPIC33)\n\n#define TU_PIC_INT_SIZE         2\n\n#else\n\n#error Unsupportd PIC MCU\n\n#endif\n\n\n#if TU_PIC_INT_SIZE == 4\n\n#ifndef KVA_TO_PA\n#define KVA_TO_PA(kva)    ((uint32_t)(kva) & 0x1fffffff)\n#endif\n\n#ifndef PA_TO_KVA1\n#define PA_TO_KVA1(pa)    ((uint32_t)(pa) | 0xA0000000)\n#endif\n\n#else\n\n#ifndef KVA_TO_PA\n#define KVA_TO_PA(kva)    (kva)\n#endif\n\n#ifndef PA_TO_KVA1\n#define PA_TO_KVA1(pa)    (pa)\n#endif\n\n#endif\n\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\nenum {\n  TOK_PID_OUT   = 0x1u,\n  TOK_PID_IN    = 0x9u,\n  TOK_PID_SETUP = 0xDu,\n};\n\n// The BDT is 8 bytes on 32bit PICs and 4 bytes on 8/16bit PICs\n#if TU_PIC_INT_SIZE == 4\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint32_t head;\n    struct {\n      union {\n        struct {\n          uint16_t           :  2;\n          uint16_t tok_pid   :  4;\n          uint16_t data      :  1;\n          uint16_t own       :  1;\n          uint16_t           :  8;\n        };\n        struct {\n          uint16_t           :  2;\n          uint16_t bdt_stall :  1;\n          uint16_t dts       :  1;\n          uint16_t ninc      :  1;\n          uint16_t keep      :  1;\n          uint16_t           : 10;\n        };\n      };\n      uint16_t bc : 10;\n      uint16_t    :  6;\n    };\n  };\n  uint8_t *addr;\n} buffer_descriptor_t;\n\nTU_VERIFY_STATIC( sizeof(buffer_descriptor_t) == 8, \"size is not correct\" );\n#else\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint16_t head;\n\n    struct {\n      uint16_t           :  10;\n      uint16_t tok_pid   :  4;\n      uint16_t data      :  1;\n      uint16_t own       :  1;\n    };\n    struct {\n      uint16_t           :  10;\n      uint16_t bdt_stall :  1;\n      uint16_t dts       :  1;\n      uint16_t ninc      :  1;\n      uint16_t keep      :  1;\n    };\n\n    struct {\n      uint16_t bc : 10;\n      uint16_t    :  6;\n    };\n  };\n  uint8_t *addr;\n} buffer_descriptor_t;\n\nTU_VERIFY_STATIC( sizeof(buffer_descriptor_t) == 4, \"size is not correct\" );\n#endif\n\n\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint32_t state;\n    struct {\n      uint32_t max_packet_size :11;\n      uint32_t                 : 5;\n      uint32_t odd             : 1;\n      uint32_t                 :15;\n    };\n  };\n  uint16_t length;\n  uint16_t remaining;\n} endpoint_state_t;\n\nTU_VERIFY_STATIC( sizeof(endpoint_state_t) == 8, \"size is not correct\" );\n\ntypedef struct\n{\n  union {\n    /* [#EP][OUT,IN][EVEN,ODD] */\n    buffer_descriptor_t bdt[16][2][2];\n#if TU_PIC_INT_SIZE == 4\n    uint16_t            bda[256];\n#else\n    uint8_t            bda[256];\n#endif\n  };\n  TU_ATTR_ALIGNED(4) union {\n    endpoint_state_t endpoint[16][2];\n    endpoint_state_t endpoint_unified[16 * 2];\n  };\n  uint8_t setup_packet[8];\n  uint8_t addr;\n} dcd_data_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\n// BDT(Buffer Descriptor Table) must be 256-byte aligned\nCFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(512) volatile static dcd_data_t _dcd;\n\n#if TU_PIC_INT_SIZE == 4\nTU_VERIFY_STATIC( sizeof(_dcd.bdt) == 512, \"size is not correct\" );\n#else\nTU_VERIFY_STATIC( sizeof(_dcd.bdt) == 256, \"size is not correct\" );\n#endif\n\n#if TU_PIC_INT_SIZE == 4\ntypedef uint32_t ep_reg_t;\n#elif TU_PIC_INT_SIZE == 2\ntypedef uint16_t ep_reg_t;\n#endif\n\nstatic inline volatile void *ep_addr(uint8_t rhport, uint8_t ep_num) {\n#if CFG_TUSB_MCU == OPT_MCU_PIC32MK\n  volatile void *ep_reg_base = rhport ? (&U2EP0) : (&U1EP0);\n#else\n  volatile void *ep_reg_base = &U1EP0;\n#endif\n#if TU_PIC_INT_SIZE == 4\n  const size_t offset = 0x10;\n#else\n  const size_t offset = 0x2;\n#endif\n  return ep_reg_base + offset * ep_num;\n}\n\nstatic inline ep_reg_t ep_read(uint8_t rhport, uint8_t ep_num) {\n  volatile ep_reg_t *ep = ep_addr(rhport, ep_num);\n  return *ep;\n}\n\nstatic inline void ep_write(uint8_t rhport, uint8_t ep_num, ep_reg_t val) {\n  volatile ep_reg_t *ep = ep_addr(rhport, ep_num);\n  *ep = val;\n}\n\nstatic inline void ep_clear(uint8_t rhport, uint8_t ep_num, ep_reg_t val) {\n#if TU_PIC_INT_SIZE == 4\n  volatile ep_reg_t *ep_clr = (ep_addr(rhport, ep_num) + 0x4);\n  *ep_clr = val;\n#else\n  ep_reg_t v = ep_read(rhport, ep_num);\n  v &= ~val;\n  ep_write(rhport, ep_num, v);\n#endif\n}\n\nstatic inline void ep_set(uint8_t rhport, uint8_t ep_num, ep_reg_t val) {\n#if TU_PIC_INT_SIZE == 4\n  volatile ep_reg_t *ep_s = (ep_addr(rhport, ep_num) + 0x8);\n  *ep_s = val;\n#else\n  ep_reg_t v = ep_read(rhport, ep_num);\n  v |= val;\n  ep_write(rhport, ep_num, v);\n#endif\n}\n\nstatic inline void intr_enable(uint8_t rhport) {\n#if CFG_TUSB_MCU == OPT_MCU_PIC32MM\n  IEC0SET = _IEC0_USBIE_MASK;\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MX\n  IEC1SET = _IEC1_USBIE_MASK;\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MK\n  if (rhport == 0)\n    IEC1SET = _IEC1_USB1IE_MASK;\n  else\n    IEC7SET = _IEC7_USB2IE_MASK;\n#elif (CFG_TUSB_MCU == OPT_MCU_PIC24) || (CFG_TUSB_MCU == OPT_MCU_DSPIC33)\n  IEC5bits.USB1IE = 1;\n#endif\n}\n\nstatic inline void intr_disable(uint8_t rhport) {\n#if CFG_TUSB_MCU == OPT_MCU_PIC32MM\n  IEC0CLR = _IEC0_USBIE_MASK;\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MX\n  IEC1CLR = _IEC1_USBIE_MASK;\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MK\n  if (rhport == 0)\n    IEC1CLR = _IEC1_USB1IE_MASK;\n  else\n    IEC7CLR = _IEC7_USB2IE_MASK;\n#elif (CFG_TUSB_MCU == OPT_MCU_PIC24) || (CFG_TUSB_MCU == OPT_MCU_DSPIC33)\n  IEC5bits.USB1IE = 0;\n#endif\n}\n\nstatic inline int intr_is_enabled(uint8_t rhport) {\n#if CFG_TUSB_MCU == OPT_MCU_PIC32MM\n  return IEC0bits.USBIE;\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MX\n  return IEC1bits.USBIE;\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MK\n  if (rhport == 0)\n    return IEC1bits.USB1IE;\n  else\n    return IEC7bits.USB2IE;\n#elif (CFG_TUSB_MCU == OPT_MCU_PIC24) || (CFG_TUSB_MCU == OPT_MCU_DSPIC33)\n  return IEC5bits.USB1IE;\n#endif\n}\n\nstatic inline void intr_clear(uint8_t rhport) {\n#if CFG_TUSB_MCU == OPT_MCU_PIC32MM\n  IFS0CLR = _IFS0_USBIF_MASK;\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MX\n  IFS1CLR = _IFS1_USBIF_MASK;\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MK\n  if (rhport == 0)\n    IFS1CLR = _IFS1_USB1IF_MASK;\n  else\n    IFS7CLR = _IFS7_USB2IF_MASK;\n#elif (CFG_TUSB_MCU == OPT_MCU_PIC24) || (CFG_TUSB_MCU == OPT_MCU_DSPIC33)\n  IFS5bits.USB1IF = 0;\n#endif\n}\n\nstatic void prepare_next_setup_packet(uint8_t rhport)\n{\n  const unsigned out_odd = _dcd.endpoint[0][0].odd;\n  const unsigned in_odd  = _dcd.endpoint[0][1].odd;\n\n  // Abandon any previous control transfers that might have been using EP0.\n  // Ordinarily, nothing actually needs abandoning, since the previous control\n  // transfer would have completed successfully prior to the host sending the\n  // next SETUP packet. However, in a timeout error case, or after an EP0\n  // STALL event, one or more UOWN bits might still be set. If so, we should\n  // clear the UOWN bits, so the EP0 IN/OUT endpoints are in a known inactive\n  // state, ready for re-arming by the `dcd_edpt_xfer' function that will be\n  // called next.\n\n  _dcd.bdt[0][0][out_odd].data     = 0;\n  _dcd.bdt[0][0][out_odd].own      = 0;\n  _dcd.bdt[0][0][out_odd ^ 1].data = 1;\n  _dcd.bdt[0][1][in_odd].data      = 1;\n  _dcd.bdt[0][1][in_odd].own       = 0;\n  _dcd.bdt[0][1][in_odd ^ 1].data  = 0;\n  _dcd.bdt[0][1][in_odd ^ 1].own   = 0;\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_OUT),\n          _dcd.setup_packet, sizeof(_dcd.setup_packet));\n}\n\nstatic void process_stall(uint8_t rhport)\n{\n  for (int i = 0; i < 16; ++i) {\n    unsigned const endpt = ep_read(rhport, i);\n\n    if (endpt & _U1EP0_EPSTALL_MASK) {\n      // prepare next setup if endpoint0\n      if ( i == 0 ) prepare_next_setup_packet(rhport);\n\n      // clear stall bit\n      ep_clear(rhport, i, _U1EP0_EPSTALL_MASK);\n    }\n  }\n}\n\nstatic void process_tokdne(uint8_t rhport)\n{\n  ep_reg_t s = U1STAT;\n\n  U1IR = _U1IR_TRNIF_MASK;\n\n  uint8_t epnum = (s >> _U1STAT_ENDPT0_POSITION);\n  uint8_t dir   = (s & _U1STAT_DIR_MASK) >> _U1STAT_DIR_POSITION;\n  unsigned odd  = (s & _U1STAT_PPBI_MASK) ? 1 : 0;\n\n  buffer_descriptor_t *bd = (buffer_descriptor_t *)&_dcd.bda[s];\n  endpoint_state_t    *ep = &_dcd.endpoint_unified[s >> 3];\n\n  /* fetch pid before discarded by the next steps */\n  const unsigned pid = bd->tok_pid;\n\n  /* reset values for a next transfer */\n  bd->bdt_stall = 0;\n  bd->dts       = 1;\n  bd->ninc      = 0;\n  bd->keep      = 0;\n  /* update the odd variable to prepare for the next transfer */\n  ep->odd       = odd ^ 1;\n  if (pid == TOK_PID_SETUP) {\n    dcd_event_setup_received(rhport, (uint8_t *)PA_TO_KVA1(bd->addr), true);\n#if TU_PIC_INT_SIZE == 4\n    U1CONCLR = _U1CON_PKTDIS_TOKBUSY_MASK;\n#else\n    U1CONbits.PKTDIS = 0;\n#endif\n    return;\n  }\n\n  const unsigned bc = bd->bc;\n  const unsigned remaining = ep->remaining - bc;\n  if (remaining && bc == ep->max_packet_size) {\n    /* continue the transferring consecutive data */\n    ep->remaining = remaining;\n    const int next_remaining = remaining - ep->max_packet_size;\n    if (next_remaining > 0) {\n      /* prepare to the after next transfer */\n      bd->addr += ep->max_packet_size * 2;\n      bd->bc    = next_remaining > ep->max_packet_size ? ep->max_packet_size: next_remaining;\n      bd->own   = 1; /* the own bit must set after addr */\n    }\n    return;\n  }\n  const unsigned length = ep->length;\n  dcd_event_xfer_complete(rhport,\n        tu_edpt_addr(epnum, dir),\n        length - remaining, XFER_RESULT_SUCCESS, true);\n  if (0 == epnum && 0 == length) {\n    /* After completion a ZLP of control transfer,\n     * it prepares for the next steup transfer. */\n    if (_dcd.addr) {\n      /* When the transfer was the SetAddress,\n       * the device address should be updated here. */\n      U1ADDR = _dcd.addr;\n      _dcd.addr  = 0;\n    }\n    prepare_next_setup_packet(rhport);\n  }\n}\n\nstatic void process_bus_reset(uint8_t rhport)\n{\n#if TU_PIC_INT_SIZE == 4\n  U1PWRCCLR = _U1PWRC_USUSPEND_MASK;\n  U1CONSET = _U1CON_PPBRST_MASK;\n#else\n  U1PWRCbits.USUSPND = 0;\n  U1CONbits.PPBRST = 1;\n#endif\n  U1ADDR = 0;\n\n  U1IE = _U1IE_URSTIE_MASK | _U1IE_TRNIE_MASK | _U1IE_IDLEIE_MASK |\n         _U1IE_UERRIE_MASK | _U1IE_STALLIE_MASK;\n\n  U1EP0 = _U1EP0_EPHSHK_MASK | _U1EP0_EPRXEN_MASK | _U1EP0_EPTXEN_MASK;\n\n  for (unsigned i = 1; i < 16; ++i) {\n    ep_write(rhport, i, 0);\n  }\n\n  buffer_descriptor_t *bd = _dcd.bdt[0][0];\n  for (unsigned i = 0; i < sizeof(_dcd.bdt)/sizeof(*bd); ++i, ++bd) {\n    bd->head = 0;\n  }\n  const endpoint_state_t ep0 = {\n    .max_packet_size = CFG_TUD_ENDPOINT0_SIZE,\n    .odd             = 0,\n    .length          = 0,\n    .remaining       = 0,\n  };\n  _dcd.endpoint[0][0] = ep0;\n  _dcd.endpoint[0][1] = ep0;\n  tu_memclr(_dcd.endpoint[1], sizeof(_dcd.endpoint) - sizeof(_dcd.endpoint[0]));\n  _dcd.addr = 0;\n  prepare_next_setup_packet(rhport);\n#if TU_PIC_INT_SIZE == 4\n  U1CONCLR = _U1CON_PPBRST_MASK;\n#else\n  U1CONbits.PPBRST = 0;\n#endif\n  dcd_event_bus_reset(rhport, TUSB_SPEED_FULL, true);\n}\n\nstatic void process_bus_sleep(uint8_t rhport)\n{\n  // Enable resume & disable suspend interrupt\n  dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n}\n\nstatic void process_bus_resume(uint8_t rhport)\n{\n  // Enable suspend & disable resume interrupt\n#if TU_PIC_INT_SIZE == 4\n  U1PWRCCLR = _U1PWRC_USUSPEND_MASK;\n  U1IECLR = _U1IE_RESUMEIE_MASK;\n  U1IESET = _U1IE_IDLEIE_MASK;\n#else\n  U1PWRCbits.USUSPND = 0;\n  U1IEbits.RESUMEIE = 0;\n  U1IEbits.IDLEIE = 1;\n#endif\n\n  dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n}\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  intr_disable(rhport);\n  intr_clear(rhport);\n\n  tu_memclr(&_dcd, sizeof(_dcd));\n\n#if TU_PIC_INT_SIZE == 4\n  // The USBBUSY bit is present on PIC32s and we're required to check it\n  // prior to powering on the USB peripheral (see DS61126F page 27)\n  while (U1PWRCbits.USBBUSY);\n  U1PWRCSET = _U1PWRC_USBPWR_MASK;\n#else\n  U1PWRCbits.USBPWR = 1;\n#endif\n\n#if TU_PIC_INT_SIZE == 4\n  uint32_t bdt_phys = KVA_TO_PA((uintptr_t)_dcd.bdt);\n\n  U1BDTP1 = (uint8_t)(bdt_phys >>  8);\n  U1BDTP2 = (uint8_t)(bdt_phys >> 16);\n  U1BDTP3 = (uint8_t)(bdt_phys >> 24);\n#else\n  U1BDTP1 = (uint8_t)((uint16_t)(void *)_dcd.bdt >> 8);\n\n  U1CNFG1bits.PPB = 2;\n#endif\n\n  U1IE = _U1IE_URSTIE_MASK;\n\n  dcd_connect(rhport);\n  return true;\n}\n\nbool dcd_deinit(uint8_t rhport)\n{\n  U1CON = 0;\n  U1IE = 0;\n  U1OTGIE = 0;\n#if TU_PIC_INT_SIZE == 4\n  U1PWRCCLR = _U1PWRC_USUSPEND_MASK | _U1PWRC_USBPWR_MASK;\n#else\n  U1PWRC &= ~(_U1PWRC_USUSPEND_MASK | _U1PWRC_USBPWR_MASK);\n#endif\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  intr_enable(rhport);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  intr_disable(rhport);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  _dcd.addr = dev_addr & 0x7F;\n  /* Response with status first before changing device address */\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n#if TU_PIC_INT_SIZE == 4\n  U1CONSET = _U1CON_RESUME_MASK;\n#else\n  U1CONbits.RESUME = 1;\n#endif\n\n  // FIXME: Assert RESUME signal correctly, requires device-specific handling\n  // For now we use a hardcoded cycle-based delay which attempts to delay 10ms\n  // at the most common CPU frequencies. On PIC32s we assume the loop body\n  // takes 3 cycles. On 16-bit PICs we assume the XC16 compiler is in use and\n  // use its `__delay_ms' function.\n\n#if CFG_TUSB_MCU == OPT_MCU_PIC32MM\n  uint32_t cnt = 24000000 / 1000 / 3;\n  while (cnt--) asm volatile(\"nop\");\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MX\n  uint32_t cnt = 40000000 / 1000 / 3;\n  while (cnt--) asm volatile(\"nop\");\n#elif CFG_TUSB_MCU == OPT_MCU_PIC32MK\n  uint32_t cnt = 120000000 / 1000 / 3;\n  while (cnt--) asm volatile(\"nop\");\n#else\n  __delay_ms(10);\n#endif\n\n#if TU_PIC_INT_SIZE == 4\n  U1CONCLR = _U1CON_RESUME_MASK;\n#else\n  U1CONbits.RESUME = 0;\n#endif\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  while (!U1CONbits.USBEN) {\n#if TU_PIC_INT_SIZE == 4\n    U1CONSET = _U1CON_USBEN_SOFEN_MASK;\n#else\n    U1CONbits.USBEN = 1;\n#endif\n  }\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  U1CON = 0;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * ep_desc)\n{\n  const unsigned ep_addr  = ep_desc->bEndpointAddress;\n  const unsigned epn      = tu_edpt_number(ep_addr);\n  const unsigned dir      = tu_edpt_dir(ep_addr);\n  const unsigned xfer     = ep_desc->bmAttributes.xfer;\n  endpoint_state_t *ep    = &_dcd.endpoint[epn][dir];\n  const unsigned odd      = ep->odd;\n  buffer_descriptor_t *bd = _dcd.bdt[epn][dir];\n\n  /* No support for control transfer */\n  TU_ASSERT(epn && (xfer != TUSB_XFER_CONTROL));\n\n  ep->max_packet_size = tu_edpt_packet_size(ep_desc);\n\n\n  unsigned val = _U1EP0_EPCONDIS_MASK;\n  val |= (xfer != TUSB_XFER_ISOCHRONOUS) ? _U1EP0_EPHSHK_MASK : 0;\n  val |= dir ? _U1EP0_EPTXEN_MASK : _U1EP0_EPRXEN_MASK;\n\n  ep_reg_t tmp = ep_read(rhport, epn);\n  tmp |= val;\n  ep_write(rhport, epn, tmp);\n\n  if (xfer != TUSB_XFER_ISOCHRONOUS) {\n    bd[odd].dts      = 1;\n    bd[odd].data     = 0;\n    bd[odd ^ 1].dts  = 1;\n    bd[odd ^ 1].data = 1;\n  }\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport)\n{\n  const unsigned ie = intr_is_enabled(rhport);\n  intr_disable(rhport);\n\n  for (unsigned i = 1; i < 16; ++i) {\n    ep_write(rhport, i, 0);\n  }\n\n  if (ie) intr_enable(rhport);\n\n  buffer_descriptor_t *bd = _dcd.bdt[1][0];\n  for (unsigned i = 2; i < sizeof(_dcd.bdt)/sizeof(*bd); ++i, ++bd) {\n    bd->head = 0;\n  }\n  endpoint_state_t *ep = &_dcd.endpoint[1][0];\n  for (unsigned i = 2; i < sizeof(_dcd.endpoint)/sizeof(*ep); ++i, ++ep) {\n    /* Clear except the odd */\n    ep->max_packet_size = 0;\n    ep->length          = 0;\n    ep->remaining       = 0;\n  }\n}\n\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)\n{\n  const unsigned epn      = tu_edpt_number(ep_addr);\n  const unsigned dir      = tu_edpt_dir(ep_addr);\n  endpoint_state_t *ep    = &_dcd.endpoint[epn][dir];\n  buffer_descriptor_t *bd = _dcd.bdt[epn][dir];\n  const unsigned msk      = dir ? _U1EP0_EPTXEN_MASK : _U1EP0_EPRXEN_MASK;\n  const unsigned ie       = intr_is_enabled(rhport);\n\n  intr_disable(rhport);\n\n  ep_clear(rhport, epn, msk);\n\n  ep->max_packet_size = 0;\n  ep->length          = 0;\n  ep->remaining       = 0;\n  bd[0].head          = 0;\n  bd[1].head          = 0;\n\n  if (ie) intr_enable(rhport);\n}\n\n#if 0\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void) largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep) {\n  (void) rhport;\n  (void) desc_ep;\n  return false;\n}\n#endif\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n\n  const unsigned epn      = tu_edpt_number(ep_addr);\n  const unsigned dir      = tu_edpt_dir(ep_addr);\n  endpoint_state_t    *ep = &_dcd.endpoint[epn][dir];\n  buffer_descriptor_t *bd = &_dcd.bdt[epn][dir][ep->odd];\n  TU_ASSERT(0 == bd->own);\n\n  const unsigned ie       = intr_is_enabled(rhport);\n\n  intr_disable(rhport);\n\n  ep->length    = total_bytes;\n  ep->remaining = total_bytes;\n\n  const unsigned mps = ep->max_packet_size;\n  if (total_bytes > mps) {\n    buffer_descriptor_t *next = ep->odd ? bd - 1: bd + 1;\n    /* When total_bytes is greater than the max packet size,\n     * it prepares to the next transfer to avoid NAK in advance. */\n    next->bc   = total_bytes >= 2 * mps ? mps: total_bytes - mps;\n    next->addr = (uint8_t *)KVA_TO_PA(buffer + mps);\n    next->own  = 1;\n  }\n  bd->bc   = total_bytes >= mps ? mps: total_bytes;\n  bd->addr = (uint8_t *)KVA_TO_PA(buffer);\n  bd->own  = 1; /* This bit must be set last */\n\n  if (ie) intr_enable(rhport);\n\n  return true;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  const unsigned epn = tu_edpt_number(ep_addr);\n\n  if (0 == epn) {\n    ep_set(rhport, epn, _U1EP0_EPSTALL_MASK);\n  } else {\n    const unsigned dir      = tu_edpt_dir(ep_addr);\n    const unsigned odd      = _dcd.endpoint[epn][dir].odd;\n    buffer_descriptor_t *bd = &_dcd.bdt[epn][dir][odd];\n    TU_ASSERT(0 == bd->own,);\n\n    const unsigned ie       = intr_is_enabled(rhport);\n\n    intr_disable(rhport);\n\n    bd->bdt_stall = 1;\n    bd->own       = 1; /* This bit must be set last */\n\n    if (ie) intr_enable(rhport);\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  const unsigned epn      = tu_edpt_number(ep_addr);\n  TU_VERIFY(epn,);\n  const unsigned dir      = tu_edpt_dir(ep_addr);\n  const unsigned odd      = _dcd.endpoint[epn][dir].odd;\n  buffer_descriptor_t *bd = _dcd.bdt[epn][dir];\n  TU_VERIFY(bd[odd].own,);\n\n  const unsigned ie       = intr_is_enabled(rhport);\n\n  intr_disable(rhport);\n\n  bd[odd].own = 0;\n\n  // clear stall\n  bd[odd].bdt_stall  = 0;\n\n  // Reset data toggle\n  bd[odd    ].data = 0;\n  bd[odd ^ 1].data = 1;\n\n  // We already cleared this in ISR, but just clear it here to be safe\n  const unsigned endpt = ep_read(rhport, epn);\n  if (endpt & _U1EP0_EPSTALL_MASK) {\n    ep_clear(rhport, endpt, _U1EP0_EPSTALL_MASK);\n  }\n\n  if (ie) intr_enable(rhport);\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\nvoid dcd_int_handler(uint8_t rhport)\n{\n  uint32_t is, msk;\n\n  // Part 1 - \"USB interrupts\"\n  is = U1IR;\n  msk = U1IE;\n\n  U1IR = is & ~msk;\n  is &= msk;\n\n  if (is & _U1IR_UERRIF_MASK) {\n    uint32_t es = U1EIR;\n    U1EIR = es;\n    U1IR = is; /* discard any pending events */\n  }\n\n  if (is & _U1IR_URSTIF_MASK) {\n    U1IR = is; /* discard any pending events */\n    process_bus_reset(rhport);\n  }\n\n  if (is & _U1IR_IDLEIF_MASK) {\n    // Note Host usually has extra delay after bus reset (without SOF), which could falsely\n    // detected as Sleep event. Though usbd has debouncing logic so we are good\n\n    /*\n     * NOTE: Do not clear U1OTGIRbits.ACTVIF here!\n     * Reason:\n     * ACTVIF is only generated once an IDLEIF has been generated.\n     * This is a 1:1 ratio interrupt generation.\n     * For every IDLEIF, there will be only one ACTVIF regardless of\n     * the number of subsequent bus transitions.\n     *\n     * If the ACTIF is cleared here, a problem could occur when:\n     * [       IDLE       ][bus activity ->\n     * <--- 3 ms ----->     ^\n     *                ^     ACTVIF=1\n     *                IDLEIF=1\n     *  #           #           #           #   (#=Program polling flags)\n     *                          ^\n     *                          This polling loop will see both\n     *                          IDLEIF=1 and ACTVIF=1.\n     *                          However, the program services IDLEIF first\n     *                          because ACTIVIE=0.\n     *                          If this routine clears the only ACTIVIF,\n     *                          then it can never get out of the suspend\n     *                          mode.\n     */\n    U1OTGIESET = _U1OTGIE_ACTVIE_MASK;\n    U1IR = _U1IR_IDLEIF_MASK;\n    process_bus_sleep(rhport);\n  }\n\n  if (is & _U1IR_SOFIF_MASK) {\n    U1IR = _U1IR_SOFIF_MASK;\n    dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);\n  }\n\n  if (is & _U1IR_STALLIF_MASK) {\n    process_stall(rhport);\n    U1IR = _U1IR_STALLIF_MASK;\n  }\n\n  if (is & _U1IR_TRNIF_MASK) {\n    process_tokdne(rhport);\n  }\n\n  // Part 2 - \"USB OTG interrupts\"\n  is = U1OTGIR;\n  msk = U1OTGIE;\n\n  U1OTGIR = is & ~msk;\n  is &= msk;\n\n  if (is & _U1OTGIR_ACTVIF_MASK) {\n#if TU_PIC_INT_SIZE == 4\n    U1OTGIECLR = _U1OTGIE_ACTVIE_MASK;\n#else\n    U1OTGIE &= ~_U1OTGIE_ACTVIE_MASK;\n#endif\n    U1OTGIR = _U1OTGIR_ACTVIF_MASK;\n    process_bus_resume(rhport);\n  }\n\n  intr_clear(rhport);\n}\n#endif\n"
  },
  {
    "path": "src/portable/microchip/pic32mz/dcd_pic32mz.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Jerzy Kasenberg\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_PIC32MZ\n\n#include <common/tusb_common.h>\n#include <device/dcd.h>\n\n#include <xc.h>\n#include \"usbhs_registers.h\"\n\n#define USB_REGS  ((usbhs_registers_t *) (_USB_BASE_ADDRESS))\n\n// Maximum number of endpoints, could be trimmed down in tusb_config to reduce RAM usage.\n#ifndef EP_MAX\n#define EP_MAX            8\n#endif\n\n\ntypedef enum {\n  EP0_STAGE_NONE,\n  EP0_STAGE_SETUP_IN_DATA,\n  EP0_STAGE_SETUP_OUT_NO_DATA,\n  EP0_STAGE_SETUP_OUT_DATA,\n  EP0_STAGE_DATA_IN,\n  EP0_STAGE_DATA_IN_LAST_PACKET_FILLED,\n  EP0_STAGE_DATA_IN_SENT,\n  EP0_STAGE_DATA_OUT,\n  EP0_STAGE_DATA_OUT_COMPLETE,\n  EP0_STAGE_STATUS_IN,\n  EP0_STAGE_ADDRESS_CHANGE,\n} ep0_stage_t;\n\ntypedef struct {\n  uint8_t * buffer;\n  // Total length of current transfer\n  uint16_t total_len;\n  // Bytes transferred so far\n  uint16_t transferred;\n  uint16_t max_packet_size;\n  uint16_t fifo_size;\n  // Packet size sent or received so far. It is used to modify transferred field\n  // after ACK is received or when filling ISO endpoint with size larger then\n  // FIFO size.\n  uint16_t last_packet_size;\n  uint8_t ep_addr;\n} xfer_ctl_t;\n\nstatic struct\n{\n  // Current FIFO RAM address used for FIFO allocation\n  uint16_t fifo_addr_top;\n  // EP0 transfer stage\n  ep0_stage_t ep0_stage;\n  // Device address\n  uint8_t dev_addr;\n  xfer_ctl_t xfer_status[EP_MAX][2];\n} _dcd;\n\n// Two endpoint 0 descriptor definition for unified dcd_edpt_open()\nstatic tusb_desc_endpoint_t const ep0OUT_desc =\n{\n  .bLength          = sizeof(tusb_desc_endpoint_t),\n  .bDescriptorType  = TUSB_DESC_ENDPOINT,\n\n  .bEndpointAddress = 0x00,\n  .bmAttributes     = { .xfer = TUSB_XFER_CONTROL },\n  .wMaxPacketSize   = CFG_TUD_ENDPOINT0_SIZE,\n  .bInterval        = 0\n};\n\nstatic tusb_desc_endpoint_t const ep0IN_desc =\n{\n  .bLength          = sizeof(tusb_desc_endpoint_t),\n  .bDescriptorType  = TUSB_DESC_ENDPOINT,\n\n  .bEndpointAddress = 0x80,\n  .bmAttributes     = { .xfer = TUSB_XFER_CONTROL },\n  .wMaxPacketSize   = CFG_TUD_ENDPOINT0_SIZE,\n  .bInterval        = 0\n};\n\n#define XFER_CTL_BASE(_ep, _dir) &_dcd.xfer_status[_ep][_dir]\n\nstatic void ep0_set_stage(ep0_stage_t stage)\n{\n  _dcd.ep0_stage = stage;\n}\n\nstatic ep0_stage_t ep0_get_stage(void)\n{\n  return _dcd.ep0_stage;\n}\n\n/*------------------------------------------------------------------*/\n/* Controller API\n *------------------------------------------------------------------*/\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  // Disable endpoint interrupts for now\n  USB_REGS->INTRRXEbits.w = 0;\n  USB_REGS->INTRTXEbits.w = 0;\n  // Enable Reset/Suspend/Resume interrupts only\n  USB_REGS->INTRUSBEbits.w = 7;\n\n  dcd_connect(rhport);\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n\n  USBCRCONbits.USBIE = 1;\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n\n  USBCRCONbits.USBIE = 0;\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void) rhport;\n\n  ep0_set_stage(EP0_STAGE_ADDRESS_CHANGE);\n  // Store address it will be used later after status stage is done\n  _dcd.dev_addr = dev_addr;\n  // Confirm packet now, address will be set when status stage is detected\n  USB_REGS->EPCSR[0].CSR0L_DEVICEbits.w = (USBHS_EP0_DEVICE_SERVICED_RXPKTRDY | USBHS_EP0_DEVICE_DATAEND);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n\n  USB_REGS->POWERbits.RESUME = 1;\n  tusb_time_delay_ms_api(10);\n  USB_REGS->POWERbits.RESUME = 0;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n\n  USB_REGS->POWERbits.HSEN = TUD_OPT_HIGH_SPEED ? 1 : 0;\n  USB_REGS->POWERbits.SOFTCONN = 1;\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n\n  USB_REGS->POWERbits.SOFTCONN = 1;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool is_in_isr(void)\n{\n  return (_CP0_GET_STATUS() & (_CP0_STATUS_EXL_MASK | _CP0_STATUS_IPL_MASK)) != 0;\n}\n\nstatic void epn_rx_configure(uint8_t endpoint, uint16_t endpointSize,\n                             uint16_t fifoAddress, uint8_t fifoSize,\n                             uint32_t transferType)\n{\n  uint8_t old_index = USB_REGS->INDEXbits.ENDPOINT;\n\n  // Select endpoint register set (same register address is used for all endpoints.\n  USB_REGS->INDEXbits.ENDPOINT = endpoint;\n\n  // Configure the Endpoint size\n  USB_REGS->INDEXED_EPCSR.RXMAXPbits.RXMAXP = endpointSize;\n\n  // Set up the fifo address.\n  USB_REGS->RXFIFOADDbits.RXFIFOAD = fifoAddress;\n\n  // Resets the endpoint data toggle to 0\n  USB_REGS->INDEXED_EPCSR.RXCSRL_DEVICEbits.CLRDT = 1;\n\n  // Set up the FIFO size\n  USB_REGS->RXFIFOSZbits.RXFIFOSZ = fifoSize;\n\n  USB_REGS->INDEXED_EPCSR.RXCSRH_DEVICEbits.ISO = transferType == 1 ? 1 : 0;\n  // Disable NYET Handshakes for interrupt endpoints\n  USB_REGS->INDEXED_EPCSR.RXCSRH_DEVICEbits.DISNYET = transferType == 3 ? 1 : 0;\n\n  // Restore the index register.\n  USB_REGS->INDEXbits.ENDPOINT = old_index;\n\n  // Enable the endpoint interrupt.\n  USB_REGS->INTRRXEbits.w |= (1 << endpoint);\n}\n\nstatic void epn_tx_configure(uint8_t endpoint, uint16_t endpointSize,\n                             uint16_t fifoAddress, uint8_t fifoSize,\n                             uint32_t transferType)\n{\n  uint8_t old_index = USB_REGS->INDEXbits.ENDPOINT;\n\n  // Select endpoint register set (same register address is used for all endpoints.\n  USB_REGS->INDEXbits.ENDPOINT = endpoint;\n\n  // Configure the Endpoint size\n  USB_REGS->INDEXED_EPCSR.TXMAXPbits.TXMAXP = endpointSize;\n\n  // Set up the fifo address\n  USB_REGS->TXFIFOADDbits.TXFIFOAD = fifoAddress;\n\n  // Resets the endpoint data toggle to 0\n  USB_REGS->INDEXED_EPCSR.TXCSRL_DEVICEbits.CLRDT = 1;\n\n  // Set up the FIFO size\n  USB_REGS->TXFIFOSZbits.TXFIFOSZ = fifoSize;\n\n  USB_REGS->INDEXED_EPCSR.TXCSRH_DEVICEbits.ISO = 1 == transferType ? 1 : 0;\n\n  // Restore the index register\n  USB_REGS->INDEXbits.ENDPOINT = old_index;\n\n  // Enable the interrupt\n  USB_REGS->INTRTXEbits.w |=  (1 << endpoint);\n}\n\nstatic void tx_fifo_write(uint8_t endpoint, uint8_t const * buffer, size_t count)\n{\n  size_t i;\n  volatile uint8_t * fifo_reg;\n\n  fifo_reg = (volatile uint8_t *) (&USB_REGS->FIFO[endpoint]);\n\n  for (i = 0; i < count; i++)\n  {\n    *fifo_reg = buffer[i];\n  }\n}\n\nstatic int rx_fifo_read(uint8_t epnum, uint8_t * buffer)\n{\n  uint32_t i;\n  uint32_t count;\n  volatile uint8_t * fifo_reg;\n\n  fifo_reg = (volatile uint8_t *) (&USB_REGS->FIFO[epnum]);\n\n  count = USB_REGS->EPCSR[epnum].RXCOUNTbits.RXCNT;\n\n  for (i = 0; i < count; i++)\n  {\n    buffer[i] = fifo_reg[i & 3];\n  }\n\n  return count;\n}\n\nstatic void xfer_complete(xfer_ctl_t * xfer, uint8_t result, bool in_isr)\n{\n  dcd_event_xfer_complete(0, xfer->ep_addr, xfer->transferred, result, in_isr);\n}\n\nstatic void ep0_fill_tx(xfer_ctl_t * xfer_in)\n{\n  uint16_t left = xfer_in->total_len - xfer_in->transferred;\n\n  if (left)\n  {\n    xfer_in->last_packet_size = tu_min16(xfer_in->max_packet_size, left);\n    tx_fifo_write(0, xfer_in->buffer + xfer_in->transferred, xfer_in->last_packet_size);\n    xfer_in->transferred += xfer_in->last_packet_size;\n    left = xfer_in->total_len - xfer_in->transferred;\n  }\n\n  if (xfer_in->last_packet_size < xfer_in->max_packet_size || left == 0)\n  {\n    switch (ep0_get_stage())\n    {\n      case EP0_STAGE_SETUP_IN_DATA:\n      case EP0_STAGE_DATA_IN:\n      case EP0_STAGE_DATA_IN_SENT:\n        ep0_set_stage(EP0_STAGE_DATA_IN_LAST_PACKET_FILLED);\n        USB_REGS->EPCSR[0].CSR0L_DEVICEbits.TXPKTRDY = 1;\n        break;\n      case EP0_STAGE_SETUP_OUT_NO_DATA:\n        ep0_set_stage(EP0_STAGE_STATUS_IN);\n        USB_REGS->EPCSR[0].CSR0L_DEVICEbits.w = (USBHS_EP0_DEVICE_SERVICED_RXPKTRDY | USBHS_EP0_DEVICE_DATAEND);\n        break;\n      case EP0_STAGE_DATA_OUT_COMPLETE:\n        ep0_set_stage(EP0_STAGE_STATUS_IN);\n        USB_REGS->EPCSR[0].CSR0L_DEVICEbits.w = (USBHS_EP0_DEVICE_SERVICED_RXPKTRDY | USBHS_EP0_DEVICE_DATAEND);\n        break;\n      default:\n        break;\n    }\n  }\n  else\n  {\n    switch (ep0_get_stage())\n    {\n      case EP0_STAGE_SETUP_IN_DATA:\n        ep0_set_stage(EP0_STAGE_DATA_IN);\n        // fall through\n      case EP0_STAGE_DATA_IN:\n        USB_REGS->EPCSR[0].CSR0L_DEVICEbits.TXPKTRDY = 1;\n        break;\n      default:\n        break;\n    }\n  }\n}\n\nstatic void epn_fill_tx(xfer_ctl_t * xfer_in, uint8_t epnum)\n{\n  uint16_t left = xfer_in->total_len - xfer_in->transferred;\n  if (left)\n  {\n    xfer_in->last_packet_size = tu_min16(xfer_in->max_packet_size, left);\n    tx_fifo_write(epnum, xfer_in->buffer + xfer_in->transferred, xfer_in->last_packet_size);\n  }\n  USB_REGS->EPCSR[epnum].TXCSRL_DEVICEbits.TXPKTRDY = 1;\n}\n\nstatic bool ep0_xfer(xfer_ctl_t * xfer, int dir)\n{\n  if (dir == TUSB_DIR_OUT)\n  {\n    if (xfer->total_len)\n    {\n      switch (_dcd.ep0_stage)\n      {\n        case EP0_STAGE_DATA_OUT_COMPLETE:\n        case EP0_STAGE_SETUP_OUT_DATA:\n          ep0_set_stage(EP0_STAGE_DATA_OUT);\n          USB_REGS->EPCSR[0].CSR0L_DEVICEbits.SVCRPR = 1;\n          break;\n        default:\n          TU_ASSERT(0);\n      }\n    }\n    else\n    {\n      switch (_dcd.ep0_stage)\n      {\n        case EP0_STAGE_DATA_IN_SENT:\n          ep0_set_stage(EP0_STAGE_NONE);\n          // fall through\n        case EP0_STAGE_NONE:\n          xfer_complete(xfer, XFER_RESULT_SUCCESS, true);\n          break;\n        default:\n          break;\n      }\n    }\n  }\n  else // IN\n  {\n    ep0_fill_tx(xfer);\n  }\n\n  return true;\n}\n\n/*------------------------------------------------------------------*/\n/* DCD Endpoint port\n *------------------------------------------------------------------*/\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)\n{\n  (void) rhport;\n  uint8_t const epnum = tu_edpt_number(desc_edpt->bEndpointAddress);\n  uint8_t const dir   = tu_edpt_dir(desc_edpt->bEndpointAddress);\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n\n  TU_ASSERT(epnum < EP_MAX);\n\n  xfer->max_packet_size = tu_edpt_packet_size(desc_edpt);\n  xfer->fifo_size = xfer->max_packet_size;\n  xfer->ep_addr = desc_edpt->bEndpointAddress;\n\n  if (epnum != 0)\n  {\n    if (dir == TUSB_DIR_OUT)\n    {\n      epn_rx_configure(epnum, xfer->max_packet_size, _dcd.fifo_addr_top, __builtin_ctz(xfer->fifo_size) - 3, desc_edpt->bmAttributes.xfer);\n      _dcd.fifo_addr_top += (xfer->fifo_size + 7) >> 3;\n    }\n    else\n    {\n      epn_tx_configure(epnum, xfer->max_packet_size, _dcd.fifo_addr_top, __builtin_ctz(xfer->fifo_size) - 3, desc_edpt->bmAttributes.xfer);\n      _dcd.fifo_addr_top += (xfer->fifo_size + 7) >> 3;\n    }\n  }\n  return true;\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n\n  // Reserve EP0 FIFO address\n  _dcd.fifo_addr_top = 64 >> 3;\n  for (int i = 1; i < EP_MAX; ++i)\n  {\n    tu_memclr(&_dcd.xfer_status[i], sizeof(_dcd.xfer_status[i]));\n  }\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n  (void) rhport;\n\n  xfer->buffer = buffer;\n  xfer->total_len = total_bytes;\n  xfer->last_packet_size = 0;\n  xfer->transferred = 0;\n\n  if (epnum == 0)\n  {\n    return ep0_xfer(xfer, dir);\n  }\n  if (dir == TUSB_DIR_OUT)\n  {\n    USB_REGS->INTRRXEbits.w |= (1u << epnum);\n  }\n  else // IN\n  {\n    epn_fill_tx(xfer, epnum);\n  }\n\n  return true;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n  (void) rhport;\n\n  if (epnum == 0)\n  {\n    USB_REGS->EPCSR[0].CSR0L_DEVICEbits.SENDSTALL = 1;\n  }\n  else\n  {\n    if (dir == TUSB_DIR_OUT)\n    {\n      USB_REGS->EPCSR[epnum].RXCSRL_DEVICEbits.SENDSTALL = 1;\n    }\n    else\n    {\n      USB_REGS->EPCSR[epnum].TXCSRL_DEVICEbits.SENDSTALL = 1;\n    }\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n  (void) rhport;\n\n  if (epnum == 0)\n  {\n    USB_REGS->EPCSR[0].CSR0L_DEVICEbits.SENDSTALL = 0;\n  }\n  else\n  {\n    if (dir == TUSB_DIR_OUT)\n    {\n      USB_REGS->EPCSR[epnum].RXCSRL_DEVICEbits.w &= ~(USBHS_EP_DEVICE_RX_SENT_STALL | USBHS_EP_DEVICE_RX_SEND_STALL);\n      USB_REGS->EPCSR[epnum].RXCSRL_DEVICEbits.CLRDT = 1;\n    }\n    else\n    {\n      USB_REGS->EPCSR[epnum].TXCSRL_DEVICEbits.w &= ~(USBHS_EP_DEVICE_TX_SENT_STALL | USBHS_EP_DEVICE_TX_SEND_STALL);\n      USB_REGS->EPCSR[epnum].TXCSRL_DEVICEbits.CLRDT = 1;\n    }\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* Interrupt Handler\n *------------------------------------------------------------------*/\n\nstatic void ep0_handle_rx(void)\n{\n  int transferred;\n  xfer_ctl_t * xfer = XFER_CTL_BASE(0, TUSB_DIR_OUT);\n\n  TU_ASSERT(xfer->buffer,);\n\n  transferred = rx_fifo_read(0, xfer->buffer + xfer->transferred);\n  xfer->transferred += transferred;\n  TU_ASSERT(xfer->transferred <= xfer->total_len,);\n  if (transferred < xfer->max_packet_size || xfer->transferred == xfer->total_len)\n  {\n    ep0_set_stage(EP0_STAGE_DATA_OUT_COMPLETE);\n    xfer_complete(xfer, XFER_RESULT_SUCCESS, true);\n  }\n  else\n  {\n    USB_REGS->EPCSR[0].CSR0L_DEVICEbits.SVCRPR = 1;\n  }\n}\n\nstatic void epn_handle_rx_int(uint8_t epnum)\n{\n  uint8_t ep_status;\n  int transferred;\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT);\n\n  ep_status = USB_REGS->EPCSR[epnum].RXCSRL_DEVICEbits.w;\n  if (ep_status & USBHS_EP_DEVICE_RX_SENT_STALL)\n  {\n    USB_REGS->EPCSR[epnum].RXCSRL_DEVICEbits.w &= ~USBHS_EP_DEVICE_RX_SENT_STALL;\n  }\n\n  if (ep_status & USBHS_EP0_HOST_RXPKTRDY)\n  {\n    TU_ASSERT(xfer->buffer != NULL,);\n\n    transferred = rx_fifo_read(epnum, xfer->buffer + xfer->transferred);\n    USB_REGS->EPCSR[epnum].RXCSRL_HOSTbits.RXPKTRDY = 0;\n    xfer->transferred += transferred;\n    TU_ASSERT(xfer->transferred <= xfer->total_len,);\n    if (transferred < xfer->max_packet_size || xfer->transferred == xfer->total_len)\n    {\n      USB_REGS->INTRRXEbits.w &= ~(1u << epnum);\n      xfer_complete(xfer, XFER_RESULT_SUCCESS, true);\n    }\n  }\n}\n\nstatic void epn_handle_tx_int(uint8_t epnum)\n{\n  uint8_t ep_status = USB_REGS->EPCSR[epnum].TXCSRL_DEVICEbits.w;\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, TUSB_DIR_IN);\n\n  if (ep_status & USBHS_EP_DEVICE_TX_SENT_STALL)\n  {\n    USB_REGS->EPCSR[epnum].TXCSRL_DEVICEbits.w &= ~USBHS_EP_DEVICE_TX_SENT_STALL;\n  }\n  else\n  {\n    xfer->transferred += xfer->last_packet_size;\n    TU_ASSERT(xfer->transferred <= xfer->total_len,);\n    if (xfer->last_packet_size < xfer->max_packet_size || xfer->transferred == xfer->total_len)\n    {\n      xfer->last_packet_size = 0;\n      xfer_complete(xfer, XFER_RESULT_SUCCESS, true);\n    }\n    else\n    {\n      epn_fill_tx(xfer, epnum);\n    }\n  }\n}\n\nstatic void ep0_handle_int(void)\n{\n  __USBHS_CSR0L_DEVICE_t  ep0_status;\n  union {\n    tusb_control_request_t request;\n    uint32_t setup_buffer[2];\n  } setup_packet;\n  xfer_ctl_t * xfer_in = XFER_CTL_BASE(0, TUSB_DIR_IN);\n  uint8_t old_index = USB_REGS->INDEXbits.ENDPOINT;\n\n  // Select EP0 registers\n  USB_REGS->INDEXbits.ENDPOINT = 0;\n\n  ep0_status = USB_REGS->EPCSR[0].CSR0L_DEVICEbits;\n\n  if (ep0_status.SENTSTALL)\n  {\n    // Stall was sent. Reset the endpoint 0 state.\n    // Clear the sent stall bit.\n    ep0_set_stage(EP0_STAGE_NONE);\n    USB_REGS->EPCSR[0].CSR0L_DEVICEbits.SENTSTALL = 0;\n  }\n\n  if (ep0_status.SETUPEND)\n  {\n    // This means the current control transfer end prematurely. We don't\n    // need to end any transfers. The device layer will manage the\n    // premature transfer end. We clear the SetupEnd bit and reset the\n    // driver control transfer state machine to waiting for next setup\n    // packet from host.\n    USB_REGS->EPCSR[0].CSR0L_DEVICEbits.SVSSETEND = 1;\n    ep0_set_stage(EP0_STAGE_NONE);\n  }\n\n  if (ep0_status.RXPKTRDY)\n  {\n    switch (ep0_get_stage())\n    {\n      default:\n        // Data arrived at unexpected state, this must be setup stage packet after all.\n        // Fall through\n      case EP0_STAGE_NONE:\n        // This means we were expecting a SETUP packet and we got one.\n        setup_packet.setup_buffer[0] = USB_REGS->FIFO[0];\n        setup_packet.setup_buffer[1] = USB_REGS->FIFO[0];\n        if (setup_packet.request.bmRequestType_bit.direction == TUSB_DIR_OUT)\n        {\n          // SVCRPR is not set yet, it will be set later when out xfer is started\n          // Till then NAKs will hold incommint data\n          ep0_set_stage(setup_packet.request.wLength == 0 ? EP0_STAGE_SETUP_OUT_NO_DATA : EP0_STAGE_SETUP_OUT_DATA);\n        }\n        else\n        {\n          USB_REGS->EPCSR[0].CSR0L_DEVICEbits.SVCRPR = 1;\n          ep0_set_stage(EP0_STAGE_SETUP_IN_DATA);\n        }\n        dcd_event_setup_received(0, &setup_packet.request.bmRequestType, true);\n        break;\n      case EP0_STAGE_DATA_OUT:\n        ep0_handle_rx();\n        break;\n    }\n  }\n  else\n  {\n    switch (ep0_get_stage())\n    {\n      case EP0_STAGE_STATUS_IN:\n        // Status was just sent, this concludes request, notify client\n        ep0_set_stage(EP0_STAGE_NONE);\n        xfer_complete(xfer_in, XFER_RESULT_SUCCESS, true);\n        break;\n      case EP0_STAGE_DATA_IN:\n        // Packet sent, fill more data\n        ep0_fill_tx(xfer_in);\n        break;\n      case EP0_STAGE_DATA_IN_LAST_PACKET_FILLED:\n        ep0_set_stage(EP0_STAGE_DATA_IN_SENT);\n        xfer_complete(xfer_in, XFER_RESULT_SUCCESS, true);\n        break;\n      case EP0_STAGE_ADDRESS_CHANGE:\n        // Status stage after set address request finished, address can be changed\n        USB_REGS->FADDRbits.FUNC = _dcd.dev_addr;\n        ep0_set_stage(EP0_STAGE_NONE);\n        break;\n      default:\n        break;\n    }\n  }\n  // Restore register index\n  USB_REGS->INDEXbits.ENDPOINT = old_index;\n}\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  int i;\n  uint8_t mask;\n  __USBCSR2bits_t csr2_bits;\n  uint16_t rxints = USB_REGS->INTRRX & USB_REGS->INTRRXEbits.w;\n  uint16_t txints = USB_REGS->INTRTX;\n  csr2_bits = USBCSR2bits;\n  (void) rhport;\n\n  IFS4CLR = _IFS4_USBIF_MASK;\n\n  if (csr2_bits.SOFIF && csr2_bits.SOFIE)\n  {\n    dcd_event_bus_signal(0, DCD_EVENT_SOF, true);\n  }\n  if (csr2_bits.RESETIF)\n  {\n    dcd_edpt_open(0, &ep0OUT_desc);\n    dcd_edpt_open(0, &ep0IN_desc);\n    dcd_event_bus_reset(0, USB_REGS->POWERbits.HSMODE ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL, true);\n  }\n  if (csr2_bits.SUSPIF)\n  {\n    dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n  }\n  if (csr2_bits.RESUMEIF)\n  {\n    dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n  }\n  // INTRTX has bit for EP0\n  if (txints & 1)\n  {\n    txints ^= 1;\n    ep0_handle_int();\n  }\n  for (mask = 0x02, i = 1; rxints != 0 && mask != 0; mask <<= 1, ++i)\n  {\n    if (rxints & mask)\n    {\n      rxints ^= mask;\n      epn_handle_rx_int(i);\n    }\n  }\n  for (mask = 0x02, i = 1; txints != 0 && mask != 0; mask <<= 1, ++i)\n  {\n    if (txints & mask)\n    {\n      txints ^= mask;\n      epn_handle_tx_int(i);\n    }\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/microchip/pic32mz/usbhs_registers.h",
    "content": "/*******************************************************************************\n* Copyright (C) 2019 Microchip Technology Inc. and its subsidiaries.\n*\n* Subject to your compliance with these terms, you may use Microchip software\n* and any derivatives exclusively with Microchip products. It is your\n* responsibility to comply with third party license terms applicable to your\n* use of third party software (including open source software) that may\n* accompany Microchip software.\n*\n* THIS SOFTWARE IS SUPPLIED BY MICROCHIP \"AS IS\". NO WARRANTIES, WHETHER\n* EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE, INCLUDING ANY IMPLIED\n* WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY, AND FITNESS FOR A\n* PARTICULAR PURPOSE.\n*\n* IN NO EVENT WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,\n* INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND\n* WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS\n* BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE\n* FULLEST EXTENT ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN\n* ANY WAY RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,\n* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.\n*******************************************************************************/\n/*******************************************************************************\n  USBHS Peripheral Library Register Definitions\n\n  File Name:\n    usbhs_registers.h\n\n  Summary:\n    USBHS PLIB Register Definitions\n\n  Description:\n    This file contains the constants and definitions which are required by the\n    the USBHS library.\n*******************************************************************************/\n\n#ifndef __USBHS_REGISTERS_H__\n#define __USBHS_REGISTERS_H__\n\n#include <p32xxxx.h>\n#include <stdint.h>\n\n/*****************************************\n * Module Register Offsets.\n *****************************************/\n\n#define USBHS_REG_FADDR         0x000\n#define USBHS_REG_POWER         0x001\n#define USBHS_REG_INTRTX        0x002\n#define USBHS_REG_INTRRX        0x004\n#define USBHS_REG_INTRTXE       0x006\n#define USBHS_REG_INTRRXE       0x008\n#define USBHS_REG_INTRUSB       0x00A\n#define USBHS_REG_INTRUSBE      0x00B\n#define USBHS_REG_FRAME         0x00C\n#define USBHS_REG_INDEX         0x00E\n#define USBHS_REG_TESTMODE      0x00F\n\n/*******************************************************\n * Endpoint Control Status Registers (CSR). These values\n * should be added to either the 0x10 to access the\n * register through Indexed CSR. To access the actual\n * CSR, see ahead in this header file.\n ******************************************************/\n\n#define USBHS_REG_EP_TXMAXP     0x000\n#define USBHS_REG_EP_CSR0L      0x002\n#define USBHS_REG_EP_CSR0H      0x003\n#define USBHS_REG_EP_TXCSRL     0x002\n#define USBHS_REG_EP_TXCSRH     0x003\n#define USBHS_REG_EP_RXMAXP     0x004\n#define USBHS_REG_EP_RXCSRL     0x006\n#define USBHS_REG_EP_RXCSRH     0x007\n#define USBHS_REG_EP_COUNT0     0x008\n#define USBHS_REG_EP_RXCOUNT    0x008\n#define USBHS_REG_EP_TYPE0      0x01A\n#define USBHS_REG_EP_TXTYPE     0x01A\n#define USBHS_REG_EP_NAKLIMIT0  0x01B\n#define USBHS_REG_EP_TXINTERVAL 0x01B\n#define USBHS_REG_EP_RXTYPE     0x01C\n#define USBHS_REG_EP_RXINTERVAL 0x01D\n#define USBHS_REG_EP_CONFIGDATA 0x01F\n#define USBHS_REG_EP_FIFOSIZE   0x01F\n\n#define USBHS_HOST_EP0_SETUPKT_SET 0x8\n#define USBHS_HOST_EP0_TXPKTRDY_SET 0x2\n#define USBHS_SOFT_RST_NRST_SET 0x1\n#define USBHS_SOFT_RST_NRSTX_SET 0x2\n#define USBHS_EP0_DEVICE_SERVICED_RXPKTRDY 0x40\n#define USBHS_EP0_DEVICE_DATAEND 0x08\n#define USBHS_EP0_DEVICE_TXPKTRDY 0x02\n#define USBHS_EP0_HOST_STATUS_STAGE_START 0x40\n#define USBHS_EP0_HOST_REQPKT 0x20\n#define USBHS_EP0_HOST_TXPKTRDY 0x02\n#define USBHS_EP0_HOST_RXPKTRDY 0x01\n#define USBHS_EP_DEVICE_TX_SENT_STALL 0x20\n#define USBHS_EP_DEVICE_TX_SEND_STALL 0x10\n#define USBHS_EP_DEVICE_RX_SENT_STALL 0x40\n#define USBHS_EP_DEVICE_RX_SEND_STALL 0x20\n\n/* FADDR - Device Function Address */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned FUNC:7;\n        unsigned :1;\n    };\n\n    uint8_t w;\n\n} __USBHS_FADDR_t;\n\n/* POWER - Control Resume and Suspend signalling */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned SUSPEN:1;\n        unsigned SUSPMODE:1;\n        unsigned RESUME:1;\n        unsigned RESET:1;\n        unsigned HSMODE:1;\n        unsigned HSEN:1;\n        unsigned SOFTCONN:1;\n        unsigned ISOUPD:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_POWER_t;\n\n/* INTRTXE - Transmit endpoint interrupt enable */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned EP0IE:1;\n        unsigned EP1TXIE:1;\n        unsigned EP2TXIE:1;\n        unsigned EP3TXIE:1;\n        unsigned EP4TXIE:1;\n        unsigned EP5TXIE:1;\n        unsigned EP6TXIE:1;\n        unsigned EP7TXIE:1;\n        unsigned :8;\n    };\n    struct\n    {\n        uint16_t    w;\n    };\n\n} __USBHS_INTRTXE_t;\n\n/* INTRRXE - Receive endpoint interrupt enable */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned :1;\n        unsigned EP1RXIE:1;\n        unsigned EP2RXIE:1;\n        unsigned EP3RXIE:1;\n        unsigned EP4RXIE:1;\n        unsigned EP5RXIE:1;\n        unsigned EP6RXIE:1;\n        unsigned EP7RXIE:1;\n        unsigned :8;\n    };\n    struct\n    {\n        uint16_t    w;\n    };\n\n} __USBHS_INTRRXE_t;\n\n/* INTRUSBE - General USB Interrupt enable */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned SUSPIE:1;\n        unsigned RESUMEIE:1;\n        unsigned RESETIE:1;\n        unsigned SOFIE:1;\n        unsigned CONNIE:1;\n        unsigned DISCONIE:1;\n        unsigned SESSRQIE:1;\n        unsigned VBUSERRIE:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_INTRUSBE_t;\n\n/* FRAME - Frame number */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RFRMNUM:11;\n        unsigned :5;\n    };\n    struct\n    {\n        uint16_t w;\n    };\n\n} __USBHS_FRAME_t;\n\n/* INDEX - Endpoint index */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned ENDPOINT:4;\n        unsigned :4;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_INDEX_t;\n\n/* TESTMODE - Test mode register */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned NAK:1;\n        unsigned TESTJ:1;\n        unsigned TESTK:1;\n        unsigned PACKET:1;\n        unsigned FORCEHS:1;\n        unsigned FORCEFS:1;\n        unsigned FIFOACC:1;\n        unsigned FORCEHST:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_TESTMODE_t;\n\n/* COUNT0 - Indicates the amount of data received in endpoint 0 */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXCNT:7;\n        unsigned :1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_COUNT0_t;\n\n/* TYPE0 - Operating speed of target device */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned :6;\n        unsigned SPEED:2;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_TYPE0_t;\n\n/* DEVCTL - Module control register */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned SESSION:1;\n        unsigned HOSTREQ:1;\n        unsigned HOSTMODE:1;\n        unsigned VBUS:2;\n        unsigned LSDEV:1;\n        unsigned FSDEV:1;\n        unsigned BDEV:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_DEVCTL_t;\n\n/* CSR0L Device - Endpoint Device Mode Control Status Register */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXPKTRDY:1;\n        unsigned TXPKTRDY:1;\n        unsigned SENTSTALL:1;\n        unsigned DATAEND:1;\n        unsigned SETUPEND:1;\n        unsigned SENDSTALL:1;\n        unsigned SVCRPR:1;\n        unsigned SVSSETEND:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_CSR0L_DEVICE_t;\n\n/* CSR0L Host - Endpoint Host Mode Control Status Register */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXPKTRDY:1;\n        unsigned TXPKTRDY:1;\n        unsigned RXSTALL:1;\n        unsigned SETUPPKT:1;\n        unsigned ERROR:1;\n        unsigned REQPKT:1;\n        unsigned STATPKT:1;\n        unsigned NAKTMOUT:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_CSR0L_HOST_t;\n\n/* TXCSRL Device - Endpoint Transmit Control Status Register Low */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TXPKTRDY:1;\n        unsigned FIFOONE:1;\n        unsigned UNDERRUN:1;\n        unsigned FLUSH:1;\n        unsigned SENDSTALL:1;\n        unsigned SENTSTALL:1;\n        unsigned CLRDT:1;\n        unsigned INCOMPTX:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_TXCSRL_DEVICE_t;\n\n/* TXCSRL Host - Endpoint Transmit Control Status Register Low */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TXPKTRDY:1;\n        unsigned FIFONE:1;\n        unsigned ERROR:1;\n        unsigned FLUSH:1;\n        unsigned SETUPPKT:1;\n        unsigned RXSTALL:1;\n        unsigned CLRDT:1;\n        unsigned INCOMPTX:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_TXCSRL_HOST_t;\n\n/* TXCSRH Device - Endpoint Transmit Control Status Register High */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned :2;\n        unsigned DMAREQMD:1;\n        unsigned FRCDATTG:1;\n        unsigned DMAREQENL:1;\n        unsigned MODE:1;\n        unsigned ISO:1;\n        unsigned AUTOSET:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_TXCSRH_DEVICE_t;\n\n/* TXCSRH Host - Endpoint Transmit Control Status Register High */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned DATATGGL:1;\n        unsigned DTWREN:1;\n        unsigned DMAREQMD:1;\n        unsigned FRCDATTG:1;\n        unsigned DMAREQEN:1;\n        unsigned MODE:1;\n        unsigned :1;\n        unsigned AUOTSET:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_TXCSRH_HOST_t;\n\n/* CSR0H Device - Endpoint 0 Control Status Register High */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned FLSHFIFO:1;\n        unsigned :7;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_CSR0H_DEVICE_t;\n\n/* CSR0H Host - Endpoint 0 Control Status Register High */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned FLSHFIFO:1;\n        unsigned DATATGGL:1;\n        unsigned DTWREN:1;\n        unsigned DISPING:1;\n        unsigned :4;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_CSR0H_HOST_t;\n\n/* RXMAXP - Receive Endpoint Max packet size. */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXMAXP:11;\n        unsigned MULT:5;\n    };\n    struct\n    {\n        uint16_t w;\n    };\n\n} __USBHS_RXMAXP_t;\n\n/* RXCSRL Device - Receive endpoint Control Status Register */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXPKTRDY:1;\n        unsigned FIFOFULL:1;\n        unsigned OVERRUN:1;\n        unsigned DATAERR:1;\n        unsigned FLUSH:1;\n        unsigned SENDSTALL:1;\n        unsigned SENTSTALL:1;\n        unsigned CLRDT:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_RXCSRL_DEVICE_t;\n\n/* RXCSRL Host - Receive endpoint Control Status Register */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXPKTRDY:1;\n        unsigned FIFOFULL:1;\n        unsigned ERROR:1;\n        unsigned DERRNAKT:1;\n        unsigned FLUSH:1;\n        unsigned REQPKT:1;\n        unsigned RXSTALL:1;\n        unsigned CLRDT:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_RXCSRL_HOST_t;\n\n/* RXCSRH Device - Receive endpoint Control Status Register */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned INCOMPRX:1;\n        unsigned :2;\n        unsigned DMAREQMODE:1;\n        unsigned DISNYET:1;\n        unsigned DMAREQEN:1;\n        unsigned ISO:1;\n        unsigned AUTOCLR:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_RXCSRH_DEVICE_t;\n\n/* RXCSRH Host - Receive endpoint Control Status Register */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned INCOMPRX:1;\n        unsigned DATATGGL:1;\n        unsigned DATATWEN:1;\n        unsigned DMAREQMD:1;\n        unsigned PIDERR:1;\n        unsigned DMAREQEN:1;\n        unsigned AUTORQ:1;\n        unsigned AUOTCLR:1;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_RXCSRH_HOST_t;\n\n/* RXCOUNT - Amount of data pending in RX FIFO */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXCNT:14;\n        unsigned :2;\n    };\n    struct\n    {\n        uint16_t w;\n    };\n\n} __USBHS_RXCOUNT_t;\n\n/* TXTYPE - Specifies the target transmit endpoint */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TEP:4;\n        unsigned PROTOCOL:2;\n        unsigned SPEED:2;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_TXTYPE_t;\n\n/* RXTYPE - Specifies the target receive endpoint */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TEP:4;\n        unsigned PROTOCOL:2;\n        unsigned SPEED:2;\n    };\n    struct\n    {\n        uint8_t w;\n    };\n\n} __USBHS_RXTYPE_t;\n\n/* TXINTERVAL - Defines the polling interval */\ntypedef struct\n{\n    uint8_t TXINTERV;\n\n} __USBHS_TXINTERVAL_t;\n\n/* RXINTERVAL - Defines the polling interval */\ntypedef struct\n{\n    uint8_t RXINTERV;\n\n} __USBHS_RXINTERVAL_t;\n\n/* TXMAXP - Maximum amount of data that can be transferred through a TX endpoint\n * */\n\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TXMAXP:11;\n        unsigned MULT:5;\n    };\n    uint16_t w;\n\n} __USBHS_TXMAXP_t;\n\n/* TXFIFOSZ - Size of the transmit endpoint FIFO */\ntypedef struct __attribute__((packed))\n{\n    unsigned TXFIFOSZ:4;\n    unsigned TXDPB:1;\n    unsigned :3;\n\n} __USBHS_TXFIFOSZ_t;\n\n/* RXFIFOSZ - Size of the receive endpoint FIFO */\ntypedef struct __attribute__((packed))\n{\n    unsigned RXFIFOSZ:4;\n    unsigned RXDPB:1;\n    unsigned :3;\n\n} __USBHS_RXFIFOSZ_t;\n\n/* TXFIFOADD - Start address of the transmit endpoint FIFO */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TXFIFOAD:13;\n        unsigned :3;\n    };\n    uint16_t w;\n\n} __USBHS_TXFIFOADD_t;\n\n/* RXFIFOADD - Start address of the receive endpoint FIFO */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXFIFOAD:13;\n        unsigned :3;\n    };\n    uint16_t w;\n\n} __USBHS_RXFIFOADD_t;\n\n/* SOFTRST - Asserts NRSTO and NRSTOX */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned NRST:1;\n        unsigned NRSTX:1;\n        unsigned :6;\n    };\n    uint8_t w;\n\n} __USBHS_SOFTRST_t;\n\n/* TXFUNCADDR - Target address of transmit endpoint */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TXFADDR:7;\n        unsigned :1;\n    };\n    uint8_t w;\n\n} __USBHS_TXFUNCADDR_t;\n\n/* RXFUNCADDR - Target address of receive endpoint */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXFADDR:7;\n        unsigned :1;\n    };\n    uint8_t w;\n\n} __USBHS_RXFUNCADDR_t;\n\n/* TXHUBADDR - Address of the hub to which the target transmit device endpoint\n * is connected */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TXHUBADDR:7;\n        unsigned MULTTRAN:1;\n    };\n    uint8_t w;\n\n} __USBHS_TXHUBADDR_t;\n\n/* RXHUBADDR - Address of the hub to which the target receive device endpoint is\n * connected */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXHUBADDR:7;\n        unsigned MULTTRAN:1;\n    };\n    uint8_t w;\n\n} __USBHS_RXHUBADDR_t;\n\n/* TXHUBPORT - Address of the hub to which the target transmit device endpoint\n * is connected. */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned TXHUBPRT:7;\n        unsigned :1;\n    };\n\n    uint8_t w;\n\n} __USBHS_TXHUBPORT_t;\n\n/* RXHUBPORT - Address of the hub to which the target receive device endpoint\n * is connected. */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned RXHUBPRT:7;\n        unsigned :1;\n    };\n\n    uint8_t w;\n\n} __USBHS_RXHUBPORT_t;\n\n/* DMACONTROL - Configures a DMA channel */\ntypedef union\n{\n    struct __attribute__((packed))\n    {\n        unsigned DMAEN:1;\n        unsigned DMADIR:1;\n        unsigned DMAMODE:1;\n        unsigned DMAIE:1;\n        unsigned DMAEP:4;\n        unsigned DMAERR:1;\n        unsigned DMABRSTM:2;\n        unsigned:21;\n    };\n\n    uint32_t w;\n\n} __USBHS_DMACNTL_t;\n\n/* Endpoint Control and Status Register Set */\ntypedef struct __attribute__((packed))\n{\n    volatile __USBHS_TXMAXP_t TXMAXPbits;\n    union\n    {\n        struct\n        {\n            union\n            {\n                volatile __USBHS_CSR0L_DEVICE_t CSR0L_DEVICEbits;\n                volatile __USBHS_CSR0L_HOST_t CSR0L_HOSTbits;\n            };\n            union\n            {\n                volatile __USBHS_CSR0H_DEVICE_t CSR0H_DEVICEbits;\n                volatile __USBHS_CSR0H_HOST_t CSR0H_HOSTbits;\n            };\n        };\n\n        struct\n        {\n            union\n            {\n                volatile __USBHS_TXCSRL_DEVICE_t TXCSRL_DEVICEbits;\n                volatile __USBHS_TXCSRL_HOST_t TXCSRL_HOSTbits;\n            };\n\n            union\n            {\n                volatile __USBHS_TXCSRH_DEVICE_t TXCSRH_DEVICEbits;\n                volatile __USBHS_TXCSRH_HOST_t TXCSRH_HOSTbits;\n            };\n        };\n    };\n\n    volatile __USBHS_RXMAXP_t RXMAXPbits;\n\n    union\n    {\n        volatile __USBHS_RXCSRL_DEVICE_t RXCSRL_DEVICEbits;\n        volatile __USBHS_RXCSRL_HOST_t RXCSRL_HOSTbits;\n    };\n\n    union\n    {\n        volatile __USBHS_RXCSRH_DEVICE_t RXCSRH_DEVICEbits;\n        volatile __USBHS_RXCSRH_HOST_t RXCSRH_HOSTbits;\n    };\n\n    union\n    {\n        volatile __USBHS_COUNT0_t COUNT0bits;\n        volatile __USBHS_RXCOUNT_t RXCOUNTbits;\n    };\n\n    union\n    {\n        volatile __USBHS_TYPE0_t TYPE0bits;\n        volatile __USBHS_TXTYPE_t TXTYPEbits;\n    };\n\n    union\n    {\n        volatile uint8_t NAKLIMIT0;\n        volatile __USBHS_TXINTERVAL_t TXINTERVALbits;\n    };\n\n    volatile __USBHS_RXTYPE_t RXTYPEbits;\n    volatile __USBHS_RXINTERVAL_t RXINTERVALbits;\n    unsigned :8;\n    union\n    {\n        volatile uint8_t CONFIGDATA;\n        volatile uint8_t FIFOSIZE;\n    };\n\n} __USBHS_EPCSR_t;\n\n/* Set of registers that configure the multi-point option */\ntypedef struct __attribute__((packed))\n{\n    volatile __USBHS_TXFUNCADDR_t TXFUNCADDRbits;\n    unsigned :8;\n    volatile __USBHS_TXHUBADDR_t TXHUBADDRbits;\n    volatile __USBHS_TXHUBPORT_t TXHUBPORTbits;\n    volatile __USBHS_RXFUNCADDR_t RXFUNCADDRbits;\n    unsigned :8;\n    volatile __USBHS_RXHUBADDR_t RXHUBADDRbits;\n    volatile __USBHS_RXHUBPORT_t RXHUBPORTbits;\n\n} __USBHS_TARGET_ADDR_t;\n\n/* Set of registers that configure the DMA channel */\ntypedef struct __attribute__((packed))\n{\n    volatile __USBHS_DMACNTL_t DMACNTLbits;\n    volatile uint32_t DMAADDR;\n    volatile uint32_t DMACOUNT;\n    volatile uint32_t pad;\n} __USBHS_DMA_CHANNEL_t;\n\n/* USBHS module register set */\ntypedef struct __attribute__((aligned(4),packed))\n{\n    volatile __USBHS_FADDR_t    FADDRbits;\n    volatile __USBHS_POWER_t    POWERbits;\n    volatile uint16_t           INTRTX;\n    volatile uint16_t           INTRRX;\n    volatile __USBHS_INTRTXE_t  INTRTXEbits;\n    volatile __USBHS_INTRRXE_t  INTRRXEbits;\n    volatile uint8_t            INTRUSB;\n    volatile __USBHS_INTRUSBE_t INTRUSBEbits;\n    volatile __USBHS_FRAME_t    FRAMEbits;\n    volatile __USBHS_INDEX_t    INDEXbits;\n    volatile __USBHS_TESTMODE_t TESTMODEbits;\n    volatile __USBHS_EPCSR_t    INDEXED_EPCSR;\n    volatile uint32_t           FIFO[16];\n    volatile __USBHS_DEVCTL_t   DEVCTLbits;\n    volatile uint8_t            MISC;\n    volatile __USBHS_TXFIFOSZ_t TXFIFOSZbits;\n    volatile __USBHS_RXFIFOSZ_t RXFIFOSZbits;\n\n    volatile __USBHS_TXFIFOADD_t   TXFIFOADDbits;\n    volatile __USBHS_RXFIFOADD_t   RXFIFOADDbits;\n\n    volatile uint32_t   VCONTROL;\n    volatile uint16_t   HWVERS;\n    volatile uint8_t    padding1[10];\n    volatile uint8_t    EPINFO;\n    volatile uint8_t    RAMINFO;\n    volatile uint8_t    LINKINFO;\n    volatile uint8_t    VPLEN;\n    volatile uint8_t    HS_EOF1;\n    volatile uint8_t    FS_EOF1;\n    volatile uint8_t    LS_EOF1;\n\n    volatile __USBHS_SOFTRST_t    SOFTRSTbits;\n\n    volatile __USBHS_TARGET_ADDR_t  TADDR[16];\n    volatile __USBHS_EPCSR_t        EPCSR[16];\n    volatile uint32_t               DMA_INTR;\n    volatile __USBHS_DMA_CHANNEL_t  DMA_CHANNEL[8];\n    volatile uint32_t               RQPKTXOUNT[16];\n\n} usbhs_registers_t;\n\n#endif\n"
  },
  {
    "path": "src/portable/microchip/samd/dcd_samd.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 Scott Shawcroft for Adafruit Industries\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && TU_CHECK_MCU(OPT_MCU_SAMD11, OPT_MCU_SAMD21, OPT_MCU_SAML2X, OPT_MCU_SAMD51, OPT_MCU_SAME5X)\n\n#include \"sam.h\"\n#include \"device/dcd.h\"\n\n/*------------------------------------------------------------------*/\n/* MACRO TYPEDEF CONSTANT ENUM\n *------------------------------------------------------------------*/\nstatic TU_ATTR_ALIGNED(4) UsbDeviceDescBank sram_registers[8][2];\n\n// Setup packet is only 8 bytes in length. However under certain scenario,\n// USB DMA controller may decide to overwrite/overflow the buffer  with\n// 2 extra bytes of CRC. From datasheet's \"Management of SETUP Transactions\" section\n//    If the number of received data bytes is the maximum data payload specified by\n//    PCKSIZE.SIZE minus one, only the first CRC data is written to the data buffer.\n//    If the number of received data is equal or less than the data payload specified\n//    by PCKSIZE.SIZE minus two, both CRC data bytes are written to the data buffer.\n// Therefore we will need to increase it to 10 bytes here.\nstatic TU_ATTR_ALIGNED(4) uint8_t _setup_packet[8+2];\n\n// ready for receiving SETUP packet\nstatic inline void prepare_setup(void)\n{\n  // Only make sure the EP0 OUT buffer is ready\n  sram_registers[0][0].ADDR.reg = (uint32_t) _setup_packet;\n  sram_registers[0][0].PCKSIZE.bit.MULTI_PACKET_SIZE = sizeof(tusb_control_request_t);\n  sram_registers[0][0].PCKSIZE.bit.BYTE_COUNT = 0;\n}\n\n// Setup the control endpoint 0.\nstatic void bus_reset(void)\n{\n  // Max size of packets is 64 bytes.\n  UsbDeviceDescBank* bank_out = &sram_registers[0][TUSB_DIR_OUT];\n  bank_out->PCKSIZE.bit.SIZE = 0x3;\n  UsbDeviceDescBank* bank_in = &sram_registers[0][TUSB_DIR_IN];\n  bank_in->PCKSIZE.bit.SIZE = 0x3;\n\n  UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[0];\n  ep->EPCFG.reg = USB_DEVICE_EPCFG_EPTYPE0(0x1) | USB_DEVICE_EPCFG_EPTYPE1(0x1);\n  ep->EPINTENSET.reg = USB_DEVICE_EPINTENSET_TRCPT0 | USB_DEVICE_EPINTENSET_TRCPT1 | USB_DEVICE_EPINTENSET_RXSTP;\n\n  // Prepare for setup packet\n  prepare_setup();\n}\n\n/*------------------------------------------------------------------*/\n/* Controller API\n *------------------------------------------------------------------*/\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  // Reset to get in a clean state.\n  USB->DEVICE.CTRLA.bit.SWRST = true;\n  while (USB->DEVICE.SYNCBUSY.bit.SWRST == 0) {}\n  while (USB->DEVICE.SYNCBUSY.bit.SWRST == 1) {}\n\n  USB->DEVICE.PADCAL.bit.TRANSP = (*((uint32_t*) USB_FUSES_TRANSP_ADDR) & USB_FUSES_TRANSP_Msk) >> USB_FUSES_TRANSP_Pos;\n  USB->DEVICE.PADCAL.bit.TRANSN = (*((uint32_t*) USB_FUSES_TRANSN_ADDR) & USB_FUSES_TRANSN_Msk) >> USB_FUSES_TRANSN_Pos;\n  USB->DEVICE.PADCAL.bit.TRIM   = (*((uint32_t*) USB_FUSES_TRIM_ADDR) & USB_FUSES_TRIM_Msk) >> USB_FUSES_TRIM_Pos;\n\n  USB->DEVICE.QOSCTRL.bit.CQOS = 3; // High Quality\n  USB->DEVICE.QOSCTRL.bit.DQOS = 3; // High Quality\n\n  // Configure registers\n  USB->DEVICE.DESCADD.reg = (uint32_t) &sram_registers;\n  USB->DEVICE.CTRLB.reg = USB_DEVICE_CTRLB_SPDCONF_FS;\n  USB->DEVICE.CTRLA.reg = USB_CTRLA_MODE_DEVICE | USB_CTRLA_ENABLE | USB_CTRLA_RUNSTDBY;\n  while (USB->DEVICE.SYNCBUSY.bit.ENABLE == 1) {}\n\n  USB->DEVICE.INTFLAG.reg |= USB->DEVICE.INTFLAG.reg; // clear pending\n  USB->DEVICE.INTENSET.reg = /* USB_DEVICE_INTENSET_SOF | */ USB_DEVICE_INTENSET_EORST;\n\n  return true;\n}\n\n#if TU_CHECK_MCU(OPT_MCU_SAMD51, OPT_MCU_SAME5X)\nvoid dcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(USB_0_IRQn);\n  NVIC_EnableIRQ(USB_1_IRQn);\n  NVIC_EnableIRQ(USB_2_IRQn);\n  NVIC_EnableIRQ(USB_3_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(USB_3_IRQn);\n  NVIC_DisableIRQ(USB_2_IRQn);\n  NVIC_DisableIRQ(USB_1_IRQn);\n  NVIC_DisableIRQ(USB_0_IRQn);\n}\n\n#elif TU_CHECK_MCU(OPT_MCU_SAMD11, OPT_MCU_SAMD21, OPT_MCU_SAML2X)\nvoid dcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(USB_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(USB_IRQn);\n}\n\n#else\n\n#error \"No implementation available for dcd_int_enable / dcd_int_disable\"\n\n#endif\n\nvoid dcd_set_address (uint8_t rhport, uint8_t dev_addr)\n{\n  (void) dev_addr;\n\n  // Response with zlp status\n  dcd_edpt_xfer(rhport, 0x80, NULL, 0, false);\n\n  // DCD can only set address after status for this request is complete\n  // do it at dcd_edpt0_status_complete()\n\n  // Enable SUSPEND interrupt since the bus signal D+/D- are stable now.\n  USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTENCLR_SUSPEND; // clear pending\n  USB->DEVICE.INTENSET.reg = USB_DEVICE_INTENSET_SUSPEND;\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n  USB->DEVICE.CTRLB.bit.UPRSM = 1;\n}\n\n// disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  USB->DEVICE.CTRLB.reg |= USB_DEVICE_CTRLB_DETACH;\n}\n\n// connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n   USB->DEVICE.CTRLB.reg &= ~USB_DEVICE_CTRLB_DETACH;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n\n  if (en) {\n    USB->DEVICE.INTENSET.bit.SOF = 1;\n  } else {\n    USB->DEVICE.INTENCLR.bit.SOF = 1;\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* DCD Endpoint port\n *------------------------------------------------------------------*/\n\n// Invoked when a control transfer's status stage is complete.\n// May help DCD to prepare for next control transfer, this API is optional.\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request)\n{\n  (void) rhport;\n\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD &&\n      request->bRequest == TUSB_REQ_SET_ADDRESS )\n  {\n    uint8_t const dev_addr = (uint8_t) request->wValue;\n    USB->DEVICE.DADD.reg = USB_DEVICE_DADD_DADD(dev_addr) | USB_DEVICE_DADD_ADDEN;\n  }\n\n  // Just finished status stage, prepare for next setup packet\n  // Note: we may already prepare setup when queueing the control status.\n  // but it has no harm to do it again here\n  prepare_setup();\n}\n\nbool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(desc_edpt->bEndpointAddress);\n  uint8_t const dir   = tu_edpt_dir(desc_edpt->bEndpointAddress);\n\n  UsbDeviceDescBank* bank = &sram_registers[epnum][dir];\n  uint32_t size_value = 0;\n  while (size_value < 7) {\n    if (1 << (size_value + 3) >= tu_edpt_packet_size(desc_edpt)) {\n      break;\n    }\n    size_value++;\n  }\n\n  // unsupported endpoint size\n  if ( size_value == 7 && tu_edpt_packet_size(desc_edpt) > 1023 ) return false;\n\n  bank->PCKSIZE.bit.SIZE = size_value;\n\n  UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];\n\n  if ( dir == TUSB_DIR_OUT )\n  {\n    ep->EPCFG.bit.EPTYPE0 = desc_edpt->bmAttributes.xfer + 1;\n    ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ0 | USB_DEVICE_EPSTATUSCLR_DTGLOUT; // clear stall & dtoggle\n    ep->EPINTENSET.bit.TRCPT0 = true;\n  }else\n  {\n    ep->EPCFG.bit.EPTYPE1 = desc_edpt->bmAttributes.xfer + 1;\n    ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ1 | USB_DEVICE_EPSTATUSCLR_DTGLIN; // clear stall & dtoggle\n    ep->EPINTENSET.bit.TRCPT1 = true;\n  }\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  UsbDeviceDescBank* bank = &sram_registers[epnum][dir];\n  UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];\n\n  bank->ADDR.reg = (uint32_t) buffer;\n\n  // A SETUP token can occur immediately after an ZLP Status.\n  // So make sure we have a valid buffer for setup packet.\n  //   Status = ZLP EP0 with direction opposite to one in the dir bit of current setup\n  if ( (epnum == 0) && (buffer == NULL) && (total_bytes == 0) && (dir != tu_edpt_dir(_setup_packet[0])) ) {\n    prepare_setup();\n  }\n\n  if ( dir == TUSB_DIR_OUT )\n  {\n    bank->PCKSIZE.bit.MULTI_PACKET_SIZE = total_bytes;\n    bank->PCKSIZE.bit.BYTE_COUNT = 0;\n    ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_BK0RDY;\n    ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRFAIL0;\n  } else\n  {\n    bank->PCKSIZE.bit.MULTI_PACKET_SIZE = 0;\n    bank->PCKSIZE.bit.BYTE_COUNT = total_bytes;\n    ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_BK1RDY;\n    ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRFAIL1;\n  }\n\n  return true;\n}\n\nvoid dcd_edpt_stall (uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];\n\n  if (tu_edpt_dir(ep_addr) == TUSB_DIR_IN) {\n    ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ1;\n  } else {\n    ep->EPSTATUSSET.reg = USB_DEVICE_EPSTATUSSET_STALLRQ0;\n  }\n}\n\nvoid dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];\n\n  if (tu_edpt_dir(ep_addr) == TUSB_DIR_IN) {\n    ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ1 | USB_DEVICE_EPSTATUSCLR_DTGLIN;\n  } else {\n    ep->EPSTATUSCLR.reg = USB_DEVICE_EPSTATUSCLR_STALLRQ0 | USB_DEVICE_EPSTATUSCLR_DTGLOUT;\n  }\n}\n\n//--------------------------------------------------------------------+\n// Interrupt Handler\n//--------------------------------------------------------------------+\nstatic void maybe_transfer_complete(void) {\n  uint32_t epints = USB->DEVICE.EPINTSMRY.reg;\n\n  for (uint8_t epnum = 0; epnum < USB_EPT_NUM; epnum++) {\n    if ((epints & (1 << epnum)) == 0) {\n      continue;\n    }\n\n    UsbDeviceEndpoint* ep = &USB->DEVICE.DeviceEndpoint[epnum];\n    uint32_t epintflag = ep->EPINTFLAG.reg;\n\n    // Handle IN completions\n    if ((epintflag & USB_DEVICE_EPINTFLAG_TRCPT1) != 0) {\n      UsbDeviceDescBank* bank = &sram_registers[epnum][TUSB_DIR_IN];\n      uint16_t const total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;\n\n      dcd_event_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, total_transfer_size, XFER_RESULT_SUCCESS, true);\n\n      ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT1;\n    }\n\n    // Handle OUT completions\n    if ((epintflag & USB_DEVICE_EPINTFLAG_TRCPT0) != 0) {\n      UsbDeviceDescBank* bank = &sram_registers[epnum][TUSB_DIR_OUT];\n      uint16_t const total_transfer_size = bank->PCKSIZE.bit.BYTE_COUNT;\n\n      dcd_event_xfer_complete(0, epnum, total_transfer_size, XFER_RESULT_SUCCESS, true);\n\n      ep->EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_TRCPT0;\n    }\n  }\n}\n\n\nvoid dcd_int_handler (uint8_t rhport)\n{\n  (void) rhport;\n\n  uint32_t int_status = USB->DEVICE.INTFLAG.reg & USB->DEVICE.INTENSET.reg;\n\n  // Start of Frame\n  if ( int_status & USB_DEVICE_INTFLAG_SOF )\n  {\n    USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_SOF;\n    const uint32_t frame = USB->DEVICE.FNUM.bit.FNUM;\n    dcd_event_sof(0, frame, true);\n    //dcd_event_bus_signal(0, DCD_EVENT_SOF, true);\n  }\n\n  // SAMD doesn't distinguish between Suspend and Disconnect state.\n  // Both condition will cause SUSPEND interrupt triggered.\n  // To prevent being triggered when D+/D- are not stable, SUSPEND interrupt is only\n  // enabled when we received SET_ADDRESS request and cleared on Bus Reset\n  if ( int_status & USB_DEVICE_INTFLAG_SUSPEND )\n  {\n    USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_SUSPEND;\n\n    // Enable wakeup interrupt\n    USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_WAKEUP; // clear pending\n    USB->DEVICE.INTENSET.reg = USB_DEVICE_INTFLAG_WAKEUP;\n\n    dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n  }\n\n  // Wakeup interrupt is only enabled when we got suspended.\n  // Wakeup interrupt will disable itself\n  if ( int_status & USB_DEVICE_INTFLAG_WAKEUP )\n  {\n    USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_WAKEUP;\n\n    // disable wakeup interrupt itself\n    USB->DEVICE.INTENCLR.reg = USB_DEVICE_INTFLAG_WAKEUP;\n    dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n  }\n\n  // Enable of Reset\n  if ( int_status & USB_DEVICE_INTFLAG_EORST )\n  {\n    USB->DEVICE.INTFLAG.reg = USB_DEVICE_INTFLAG_EORST;\n\n    // Disable both suspend and wakeup interrupt\n    USB->DEVICE.INTENCLR.reg = USB_DEVICE_INTFLAG_WAKEUP | USB_DEVICE_INTFLAG_SUSPEND;\n\n    bus_reset();\n    dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n  }\n\n  // Handle SETUP packet\n  if (USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.bit.RXSTP)\n  {\n    // This copies the data elsewhere so we can reuse the buffer.\n    dcd_event_setup_received(0, _setup_packet, true);\n\n    // Although Setup packet only set RXSTP bit,\n    // TRCPT0 bit could already be set by previous ZLP OUT Status (not handled until now).\n    // Since control status complete event is optional, we can just clear TRCPT0 and skip the status event\n    USB->DEVICE.DeviceEndpoint[0].EPINTFLAG.reg = USB_DEVICE_EPINTFLAG_RXSTP | USB_DEVICE_EPINTFLAG_TRCPT0;\n  }\n\n  // Handle complete transfer\n  maybe_transfer_complete();\n}\n#endif\n"
  },
  {
    "path": "src/portable/microchip/samd/hcd_samd.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 ChrisDeadman\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && !(defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421) && \\\n    TU_CHECK_MCU(OPT_MCU_SAMD11, OPT_MCU_SAMD21, OPT_MCU_SAML2X, OPT_MCU_SAMD51, OPT_MCU_SAME5X)\n\n#include \"host/hcd.h\"\n#include \"sam.h\"\n\n/*------------------------------------------------------------------*/\n/* MACRO TYPEDEF CONSTANT ENUM\n *------------------------------------------------------------------*/\n#define USB_HOST_PTYPE_DIS         0x0\n#define USB_HOST_PTYPE_CTRL        0x1\n#define USB_HOST_PTYPE_ISO         0x2\n#define USB_HOST_PTYPE_BULK        0x3\n#define USB_HOST_PTYPE_INT         0x4\n#define USB_HOST_PTYPE_EXT         0x5\n\n#define USB_HOST_PCFG_PTOKEN_SETUP 0x0\n#define USB_HOST_PCFG_PTOKEN_IN    0x1\n#define USB_HOST_PCFG_PTOKEN_OUT   0x2\n\n#define USB_PCKSIZE_ENUM(size) \\\n  ((size) >= 1024      ? 7     \\\n      : (size) >= 1023 ? 7     \\\n      : (size) > 256   ? 6     \\\n      : (size) > 128   ? 5     \\\n      : (size) > 64    ? 4     \\\n      : (size) > 32    ? 3     \\\n      : (size) > 16    ? 2     \\\n      : (size) > 8     ? 1     \\\n                       : 0)\n\n// Uncomment to use fake frame number.\n// Low-Speed devices stall FNUM during enumeration :/\n// #define HCD_SAMD_FAKE_FNUM\n\ntypedef struct {\n  uint8_t dev_addr;\n  uint8_t ep_addr;\n  uint16_t max_packet_size;\n  uint16_t xfer_length;\n  uint16_t xfer_remaining;\n} usb_pipe_status_t;\n\nCFG_TUH_MEM_SECTION CFG_TUH_MEM_ALIGN static volatile UsbHostDescriptor usb_pipe_table[USB_PIPE_NUM];\n\nCFG_TUH_MEM_SECTION CFG_TUH_MEM_ALIGN static volatile usb_pipe_status_t usb_pipe_status_table[USB_PIPE_NUM];\n\nCFG_TUH_MEM_SECTION CFG_TUH_MEM_ALIGN static volatile uint32_t fake_fnum;\n\nstatic uint8_t samd_configure_pipe(uint8_t dev_addr, uint8_t ep_addr)\n{\n  uint8_t pipe;\n  uint8_t token;\n  volatile usb_pipe_status_t* pipe_status;\n  bool same_addr = false;\n  bool same_ep_addr = false;\n\n  // evaluate pipe token\n  token = (tu_edpt_dir(ep_addr) == TUSB_DIR_IN) ? USB_HOST_PCFG_PTOKEN_IN\n        : tu_edpt_number(ep_addr) == 0          ? USB_HOST_PCFG_PTOKEN_SETUP\n                                                : USB_HOST_PCFG_PTOKEN_OUT;\n\n  TU_LOG3(\"samd_configure_pipe(token=%02X, dev_addr=%02X, ep_addr=%02X)=\", token, dev_addr, ep_addr);\n\n  // find already allocated pipe\n  for (pipe = 0; pipe < USB_PIPE_NUM; pipe++) {\n    pipe_status = &usb_pipe_status_table[pipe];\n    same_addr = (pipe_status->dev_addr == dev_addr);\n    same_ep_addr = (tu_edpt_number(pipe_status->ep_addr) == tu_edpt_number(ep_addr));\n    if (same_ep_addr && (same_addr || (tu_edpt_number(ep_addr) == 0))) {\n      break;\n    }\n  }\n\n  // allocate from pool of free pipes\n  if (pipe >= USB_PIPE_NUM) {\n    for (pipe = 0; pipe < USB_PIPE_NUM; pipe++) {\n      pipe_status = &usb_pipe_status_table[pipe];\n      // found a free pipe\n      if (pipe_status->dev_addr >= UINT8_MAX) {\n        break;\n      }\n    }\n  }\n\n  // no pipe available :(\n  if (pipe >= USB_PIPE_NUM) {\n    TU_LOG3(\"ERR_NO_PIPE\\r\\n\");\n    return pipe;\n  }\n  TU_LOG3(\"%d\\r\\n\", pipe);\n\n  // no transfer should be in progress\n  TU_ASSERT(((USB->HOST.HostPipe[pipe].PCFG.bit.PTYPE == USB_HOST_PTYPE_DIS) ||\n                USB->HOST.HostPipe[pipe].PSTATUS.bit.PFREEZE == 1),\n      USB_PIPE_NUM);\n\n  // update addr and ep_addr\n  pipe_status->dev_addr = dev_addr;\n  pipe_status->ep_addr = ep_addr;\n  usb_pipe_table[pipe].HostDescBank[0].CTRL_PIPE.bit.PDADDR = dev_addr;\n  usb_pipe_table[pipe].HostDescBank[0].CTRL_PIPE.bit.PEPNUM = tu_edpt_number(ep_addr);\n\n  // token specific configuration\n  USB->HOST.HostPipe[pipe].PCFG.bit.PTOKEN = token;\n  USB->HOST.HostPipe[pipe].PINTENCLR.reg = USB_HOST_PINTENCLR_MASK;\n  if (token == USB_HOST_PCFG_PTOKEN_SETUP) {\n    USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_DTGL;\n    USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_BK0RDY;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_TXSTP;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_STALL;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_TRFAIL;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_PERR;\n  } else if (token == USB_HOST_PCFG_PTOKEN_IN) {\n    USB->HOST.HostPipe[pipe].PSTATUSSET.reg = USB_HOST_PSTATUSSET_BK0RDY;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_TRCPT_Msk;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_STALL;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_TRFAIL;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_PERR;\n  } else {\n    USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_BK0RDY;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_TRCPT_Msk;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_STALL;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_TRFAIL;\n    USB->HOST.HostPipe[pipe].PINTENSET.reg = USB_HOST_PINTENSET_PERR;\n  }\n\n  return pipe;\n}\n\nstatic void samd_free_pipe(uint8_t pipe)\n{\n  volatile usb_pipe_status_t* pipe_status = &usb_pipe_status_table[pipe];\n  pipe_status->dev_addr = UINT8_MAX;\n  pipe_status->ep_addr = UINT8_MAX;\n  pipe_status->max_packet_size = 0;\n  pipe_status->xfer_length = 0;\n  pipe_status->xfer_remaining = 0;\n\n  USB->HOST.HostPipe[pipe].PSTATUSSET.reg = USB_HOST_PSTATUSSET_PFREEZE;\n  USB->HOST.HostPipe[pipe].PCFG.reg &= ~USB_HOST_PCFG_PTYPE_Msk;\n  USB->HOST.HostPipe[pipe].PINTENCLR.reg = USB_HOST_PINTENCLR_MASK;\n  memset((uint8_t*)(uintptr_t) &usb_pipe_table[pipe], 0, sizeof(usb_pipe_table[pipe]));\n}\n\nstatic void samd_free_all_pipes(void)\n{\n  for (uint8_t pipe = 0; pipe < USB_PIPE_NUM; pipe++) {\n    samd_free_pipe(pipe);\n  }\n}\n\nstatic bool samd_on_xfer(uint8_t pipe, xfer_result_t xfer_result)\n{\n  uint16_t xfer_delta;\n  bool xfer_complete;\n  volatile usb_pipe_status_t* pipe_status = &usb_pipe_status_table[pipe];\n\n  // freeze the pipe\n  USB->HOST.HostPipe[pipe].PSTATUSSET.reg = USB_HOST_PSTATUSSET_PFREEZE;\n\n  // get number of transferred bytes\n  if (xfer_result == XFER_RESULT_SUCCESS) {\n    xfer_delta = usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.BYTE_COUNT;\n  } else {\n    xfer_delta = 0;\n  }\n\n  TU_LOG3(\"samd_on_xfer(%d, result=%d, xdelta=%d, rem=%d)\\r\\n\", xfer_result, pipe, xfer_delta, pipe_status->xfer_remaining);\n\n  // update pipe status\n  if (xfer_delta > pipe_status->xfer_remaining) {\n    xfer_delta = pipe_status->xfer_remaining;\n  }\n  pipe_status->xfer_remaining -= xfer_delta;\n  pipe_status->xfer_length += xfer_delta;\n\n  // last packet handling\n  if (xfer_delta < pipe_status->max_packet_size) {\n    pipe_status->xfer_remaining = 0;\n  }\n\n  // transfer complete\n  xfer_complete = (xfer_result != XFER_RESULT_SUCCESS) || (pipe_status->xfer_remaining == 0);\n  if (xfer_complete) {\n    return true;\n  }\n\n  // continue receiving\n  if (tu_edpt_dir(pipe_status->ep_addr) == TUSB_DIR_IN) {\n    usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.BYTE_COUNT = 0;\n    USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_BK0RDY;\n  }\n  // continue sending\n  else {\n    usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.BYTE_COUNT =\n        (pipe_status->xfer_remaining < pipe_status->max_packet_size) ? pipe_status->xfer_remaining\n                                                                     : pipe_status->max_packet_size;\n    USB->HOST.HostPipe[pipe].PSTATUSSET.reg = USB_HOST_PSTATUSSET_BK0RDY;\n  }\n\n  // advance packet buffer\n  usb_pipe_table[pipe].HostDescBank[0].ADDR.reg += xfer_delta;\n\n  // start next transfer\n  USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_PFREEZE;\n\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n// Interrupt Handler\nvoid hcd_int_handler(uint8_t rhport, bool in_isr)\n{\n  (void) rhport;\n\n  uint16_t int_flags;\n  uint8_t pint_flags;\n  xfer_result_t xfer_result;\n  volatile usb_pipe_status_t* pipe_status;\n\n  //\n  // Check INTFLAG\n  //\n  int_flags = USB->HOST.INTFLAG.reg;\n  if (int_flags & USB_HOST_INTFLAG_HSOF) {\n    USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_HSOF;\n  }\n  if (int_flags & USB_HOST_INTFLAG_RST) {\n    TU_LOG2(\"USB_HOST_INTFLAG_RST\\r\\n\");\n    USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_RST;\n  }\n  if (int_flags & USB_HOST_INTFLAG_WAKEUP) {\n    TU_LOG3(\"USB_HOST_INTFLAG_WAKEUP\\r\\n\");\n    USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_WAKEUP;\n  }\n  if (int_flags & USB_HOST_INTFLAG_DNRSM) {\n    TU_LOG3(\"USB_HOST_INTFLAG_DNRSM\\r\\n\");\n    USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_DNRSM;\n  }\n  if (int_flags & USB_HOST_INTFLAG_UPRSM) {\n    TU_LOG3(\"USB_HOST_INTFLAG_UPRSM\\r\\n\");\n    USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_UPRSM;\n  }\n  if (int_flags & USB_HOST_INTFLAG_RAMACER) {\n    TU_LOG1(\"USB_HOST_INTFLAG_RAMACER\\r\\n\");\n    USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_RAMACER;\n  }\n  if (int_flags & USB_HOST_INTFLAG_DCONN) {\n    USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_DCONN;\n    hcd_event_device_attach(rhport, in_isr);\n  }\n  if (int_flags & USB_HOST_INTFLAG_DDISC) {\n    USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_DDISC;\n    hcd_event_device_remove(rhport, in_isr);\n  }\n\n  // handle pipe interrupts\n  for (uint8_t pipe = 0; pipe < USB_PIPE_NUM; pipe++) {\n    // get pipe handle\n    pipe_status = &usb_pipe_status_table[pipe];\n    if (pipe_status->dev_addr >= UINT8_MAX) {\n      continue;\n    }\n\n    //\n    // Check PINTFLAG\n    //\n    pint_flags = USB->HOST.HostPipe[pipe].PINTFLAG.reg;\n    xfer_result = XFER_RESULT_INVALID;\n    if (pint_flags & USB_HOST_PINTFLAG_TRCPT0) {\n      USB->HOST.HostPipe[pipe].PINTFLAG.reg = USB_HOST_PINTFLAG_TRCPT0;\n      xfer_result = XFER_RESULT_SUCCESS;\n    }\n    if (pint_flags & USB_HOST_PINTFLAG_TRCPT1) {\n      USB->HOST.HostPipe[pipe].PINTFLAG.reg = USB_HOST_PINTFLAG_TRCPT1;\n      xfer_result = XFER_RESULT_SUCCESS;\n    }\n    if (pint_flags & USB_HOST_PINTFLAG_TXSTP) {\n      USB->HOST.HostPipe[pipe].PINTFLAG.reg = USB_HOST_PINTFLAG_TXSTP;\n      xfer_result = XFER_RESULT_SUCCESS;\n    }\n    if (pint_flags & USB_HOST_PINTFLAG_STALL) {\n      TU_LOG2(\"USB_HOST_PINTFLAG_STALL\\r\\n\");\n      USB->HOST.HostPipe[pipe].PINTFLAG.reg = USB_HOST_PINTFLAG_STALL;\n      xfer_result = XFER_RESULT_STALLED;\n    }\n    if (pint_flags & USB_HOST_PINTFLAG_TRFAIL) {\n      USB->HOST.HostPipe[pipe].PINTFLAG.reg = USB_HOST_PINTFLAG_TRFAIL;\n      if (usb_pipe_table[pipe].HostDescBank[0].STATUS_BK.reg & USB_HOST_STATUS_BK_ERRORFLOW) {\n        TU_LOG1(\"USB_HOST_STATUS_BK_ERRORFLOW\\r\\n\");\n        xfer_result = XFER_RESULT_FAILED;\n      } else if (usb_pipe_table[pipe].HostDescBank[0].STATUS_BK.reg & USB_HOST_STATUS_BK_CRCERR) {\n        TU_LOG1(\"USB_HOST_STATUS_BK_CRCERR\\r\\n\");\n        xfer_result = XFER_RESULT_FAILED;\n      } else {\n        // SAMD Quirk #1:\n        // Likes to report TRFAIL for no apparent reason -> ignore\n      }\n    }\n    if (pint_flags & USB_HOST_PINTFLAG_PERR) {\n      USB->HOST.HostPipe[pipe].PINTFLAG.reg = USB_HOST_PINTFLAG_PERR;\n      // Handled by STATUS_PIPE checks below\n    }\n\n    //\n    // Check STATUS_PIPE\n    //\n    if (usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg & USB_HOST_STATUS_PIPE_DTGLER) {\n      TU_LOG1(\"USB_HOST_STATUS_PIPE_DTGLER\\r\\n\");\n      usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg &= ~USB_HOST_STATUS_PIPE_DTGLER;\n      xfer_result = XFER_RESULT_FAILED;\n    }\n    if (usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg & USB_HOST_STATUS_PIPE_DAPIDER) {\n      TU_LOG1(\"USB_HOST_STATUS_PIPE_DAPIDER\\r\\n\");\n      usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg &= ~USB_HOST_STATUS_PIPE_DAPIDER;\n      xfer_result = XFER_RESULT_FAILED;\n    }\n    if (usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg & USB_HOST_STATUS_PIPE_PIDER) {\n      TU_LOG1(\"USB_HOST_STATUS_PIPE_PIDER\\r\\n\");\n      usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg &= ~USB_HOST_STATUS_PIPE_PIDER;\n      xfer_result = XFER_RESULT_FAILED;\n    }\n    if (usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg & USB_HOST_STATUS_PIPE_CRC16ER) {\n      TU_LOG1(\"USB_HOST_STATUS_PIPE_CRC16ER\\r\\n\");\n      usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg &= ~USB_HOST_STATUS_PIPE_CRC16ER;\n      xfer_result = XFER_RESULT_FAILED;\n    }\n    if (usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg & USB_HOST_STATUS_PIPE_TOUTER) {\n      usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.reg &= ~USB_HOST_STATUS_PIPE_TOUTER;\n\n      if ((USB->HOST.HostPipe[pipe].PCFG.bit.PTYPE == USB_HOST_PTYPE_INT) &&\n          (tu_edpt_dir(pipe_status->ep_addr) == TUSB_DIR_IN)) {\n        // ignore timeouts from INT pipes\n      } else {\n        if (xfer_result == XFER_RESULT_INVALID) {\n          xfer_result = XFER_RESULT_TIMEOUT;\n        }\n      }\n    }\n\n    // prevent PERR from too high error counts, that is handled by TinyUSB anyways\n    usb_pipe_table[pipe].HostDescBank[0].STATUS_PIPE.bit.ERCNT = 0;\n\n    // no updates\n    if (xfer_result == XFER_RESULT_INVALID) {\n      continue;\n    }\n\n    // continue / complete transfer\n    if (samd_on_xfer(pipe, xfer_result)) {\n      hcd_event_xfer_complete(pipe_status->dev_addr, pipe_status->ep_addr, pipe_status->xfer_length, xfer_result, true);\n    }\n  }\n}\n\n// Initialize controller to host mode\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  TU_ASSERT(rhport == 0);\n  (void) rh_init;\n  fake_fnum = 0;\n\n  // reset to get in a clean state.\n  USB->HOST.CTRLA.bit.SWRST = 1;\n  while (USB->HOST.SYNCBUSY.bit.SWRST == 0)\n    ;\n  while (USB->HOST.SYNCBUSY.bit.SWRST == 1)\n    ;\n\n  // load pad calibration\n  USB->HOST.PADCAL.bit.TRANSP = (*((uint32_t*) USB_FUSES_TRANSP_ADDR) & USB_FUSES_TRANSP_Msk) >> USB_FUSES_TRANSP_Pos;\n  USB->HOST.PADCAL.bit.TRANSN = (*((uint32_t*) USB_FUSES_TRANSN_ADDR) & USB_FUSES_TRANSN_Msk) >> USB_FUSES_TRANSN_Pos;\n  USB->HOST.PADCAL.bit.TRIM = (*((uint32_t*) USB_FUSES_TRIM_ADDR) & USB_FUSES_TRIM_Msk) >> USB_FUSES_TRIM_Pos;\n\n  USB->HOST.QOSCTRL.bit.CQOS = 3; // High Quality\n  USB->HOST.QOSCTRL.bit.DQOS = 3; // High Quality\n\n  // configure host-mode\n  samd_free_all_pipes(); // initializes pipe handles and usb_pipe_table\n  USB->HOST.DESCADD.reg = (uint32_t) (&usb_pipe_table[0]);\n  USB->HOST.CTRLB.reg = USB_HOST_CTRLB_SPDCONF_NORMAL | USB_HOST_CTRLB_VBUSOK;\n  USB->HOST.CTRLA.reg = USB_CTRLA_MODE_HOST | USB_CTRLA_ENABLE | USB_CTRLA_RUNSTDBY;\n  while (USB->HOST.SYNCBUSY.bit.ENABLE == 1)\n    ;\n\n  // enable basic USB interrupts\n  USB->HOST.INTFLAG.reg |= USB->HOST.INTFLAG.reg; // clear pending\n  USB->HOST.INTENCLR.reg = USB_HOST_INTENCLR_MASK;\n  USB->HOST.INTENSET.reg = USB_HOST_INTENSET_DCONN;\n  USB->HOST.INTENSET.reg = USB_HOST_INTENSET_DDISC;\n  USB->HOST.INTENSET.reg = USB_HOST_INTENSET_WAKEUP;\n  USB->HOST.INTENSET.reg = USB_HOST_INTENSET_RST;\n\n  return true;\n}\n\n#if TU_CHECK_MCU(OPT_MCU_SAMD51, OPT_MCU_SAME5X)\n\n// Enable USB interrupt\nvoid hcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_EnableIRQ(USB_0_IRQn);\n  NVIC_EnableIRQ(USB_1_IRQn);\n  NVIC_EnableIRQ(USB_2_IRQn);\n  NVIC_EnableIRQ(USB_3_IRQn);\n}\n\n// Disable USB interrupt\nvoid hcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_DisableIRQ(USB_3_IRQn);\n  NVIC_DisableIRQ(USB_2_IRQn);\n  NVIC_DisableIRQ(USB_1_IRQn);\n  NVIC_DisableIRQ(USB_0_IRQn);\n}\n\n#elif TU_CHECK_MCU(OPT_MCU_SAMD11, OPT_MCU_SAMD21, OPT_MCU_SAML2X)\n\n// Enable USB interrupt\nvoid hcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_EnableIRQ(USB_IRQn);\n}\n\n// Disable USB interrupt\nvoid hcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_DisableIRQ(USB_IRQn);\n}\n\n#else\n\n#error \"No implementation available for hcd_int_enable / hcd_int_disable\"\n\n#endif\n\n// Get frame number (1ms)\nuint32_t hcd_frame_number(uint8_t rhport)\n{\n  (void) rhport;\n\n// SAMD Quirk #2:\n// FNUM is stalled before enumeration of Low-Speed devices.\n// internal frame counter can be used as workaround (not very accurate)\n#ifdef HCD_SAMD_FAKE_FNUM\n  uint8_t start, current, prev;\n  uint8_t loop_count = (USB->HOST.STATUS.bit.SPEED == TUSB_SPEED_HIGH) ? 8 : 1;\n  for (uint8_t i = 0; i < loop_count; i++) {\n    start = USB->HOST.FLENHIGH.reg;\n    current = start;\n    // wait until wrap-around\n    prev = current;\n    while (current <= start) {\n      current = USB->HOST.FLENHIGH.reg;\n      if (current > prev)\n        break;\n      prev = current;\n    }\n    // wait until start is reached again\n    prev = current;\n    while (current > start) {\n      current = USB->HOST.FLENHIGH.reg;\n      if (current > prev)\n        break;\n      prev = current;\n    }\n  }\n  fake_fnum += 1;\n  return fake_fnum;\n#else\n  return USB->HOST.FNUM.bit.FNUM;\n#endif // HCD_SAMD_FAKE_FNUM\n}\n\n//--------------------------------------------------------------------+\n// Port API\n//--------------------------------------------------------------------+\n\n// Get the current connect status of roothub port\nbool hcd_port_connect_status(uint8_t rhport)\n{\n  TU_ASSERT(rhport == 0);\n  return USB->HOST.STATUS.bit.LINESTATE != 0;\n}\n\n// Reset USB bus on the port. Return immediately, bus reset sequence may not be\n// complete. Some port would require hcd_port_reset_end() to be invoked after 10ms to\n// complete the reset sequence.\nvoid hcd_port_reset(uint8_t rhport)\n{\n  hcd_int_disable(rhport);\n  samd_free_all_pipes();\n  USB->HOST.INTFLAG.reg |= USB->HOST.INTFLAG.reg; // clear pending\n  USB->HOST.CTRLB.bit.BUSRESET = 1;\n  fake_fnum = 0;\n}\n\n// Complete bus reset sequence, may be required by some controllers\nvoid hcd_port_reset_end(uint8_t rhport)\n{\n  while (USB->HOST.INTFLAG.bit.RST == 0)\n    ;\n  USB->HOST.INTFLAG.reg = USB_HOST_INTFLAG_RST;\n  USB->HOST.CTRLB.bit.SOFE = 1;\n  hcd_int_enable(rhport);\n}\n\n// Get port link speed\ntusb_speed_t hcd_port_speed_get(uint8_t rhport)\n{\n  (void) rhport;\n\n  switch (USB->HOST.STATUS.bit.SPEED) {\n  case 0:\n    return TUSB_SPEED_FULL;\n  case 1:\n    return TUSB_SPEED_LOW;\n  case 2:\n    return TUSB_SPEED_HIGH;\n  default:\n    return TUSB_SPEED_INVALID;\n  }\n}\n\n// HCD closes all opened endpoints belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr)\n{\n  (void) rhport;\n\n  for (uint8_t pipe = 0; pipe < USB_PIPE_NUM; pipe++) {\n    volatile usb_pipe_status_t* pipe_status = &usb_pipe_status_table[pipe];\n    if (pipe_status->dev_addr == dev_addr) {\n      samd_free_pipe(pipe);\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\n\n// Open an endpoint\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const* ep_desc)\n{\n  TU_ASSERT(rhport == 0);\n\n  uint8_t pipe;\n  volatile usb_pipe_status_t* pipe_status;\n  const uint8_t ep_addr = ep_desc->bEndpointAddress;\n  const uint8_t bmAttributes = (ep_desc->bmAttributes.xfer)       |\n                              ((ep_desc->bmAttributes.sync) << 2) |\n                              ((ep_desc->bmAttributes.usage) << 4);\n\n  // configure the pipe\n  pipe = samd_configure_pipe(dev_addr, ep_addr);\n  if (pipe >= USB_PIPE_NUM) {\n    return false;\n  }\n\n  // initial configuration\n  pipe_status = &usb_pipe_status_table[pipe];\n  USB->HOST.HostPipe[pipe].PCFG.reg &= ~USB_HOST_PCFG_PTYPE_Msk;\n  USB->HOST.HostPipe[pipe].PCFG.bit.PTYPE = bmAttributes + 1;\n  USB->HOST.HostPipe[pipe].BINTERVAL.reg = ep_desc->bInterval;\n  USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_DTGL;\n  USB->HOST.HostPipe[pipe].PINTENCLR.reg = USB_HOST_PINTENCLR_MASK;\n  pipe_status->max_packet_size = ep_desc->wMaxPacketSize;\n  usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.SIZE = USB_PCKSIZE_ENUM(pipe_status->max_packet_size);\n  usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.AUTO_ZLP = 0;\n\n  return true;\n}\n\n// Submit a special transfer to send 8-byte Setup Packet, when complete\n// hcd_event_xfer_complete() must be invoked\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8])\n{\n  TU_ASSERT(rhport == 0);\n\n  uint8_t pipe;\n  volatile usb_pipe_status_t* pipe_status;\n\n  // configure the pipe\n  pipe = samd_configure_pipe(dev_addr, 0);\n  if (pipe >= USB_PIPE_NUM) {\n    return false;\n  }\n\n  // prepare transfer\n  pipe_status = &usb_pipe_status_table[pipe];\n  usb_pipe_table[pipe].HostDescBank[0].ADDR.reg = (uint32_t) setup_packet;\n  pipe_status->xfer_remaining = 8;\n  pipe_status->xfer_length = 0;\n  usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.BYTE_COUNT = 8;\n  usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.MULTI_PACKET_SIZE = 0;\n  USB->HOST.HostPipe[pipe].PSTATUSSET.reg = USB_HOST_PSTATUSSET_BK0RDY;\n\n  // clear pending interrupts\n  USB->HOST.HostPipe[pipe].PINTFLAG.reg |= USB->HOST.HostPipe[pipe].PINTFLAG.reg;\n\n  // begin transfer\n  USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_PFREEZE;\n\n  return true;\n}\n\n// Submit a transfer, when complete hcd_event_xfer_complete() must be invoked\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t* buffer, uint16_t buflen)\n{\n  TU_ASSERT(rhport == 0);\n\n  uint8_t pipe;\n  volatile usb_pipe_status_t* pipe_status;\n\n  // configure the pipe\n  pipe = samd_configure_pipe(dev_addr, ep_addr);\n  if (pipe >= USB_PIPE_NUM) {\n    return false;\n  }\n\n  // prepare transfer\n  pipe_status = &usb_pipe_status_table[pipe];\n  usb_pipe_table[pipe].HostDescBank[0].ADDR.reg = (uint32_t) buffer;\n  pipe_status->xfer_remaining = buflen;\n  pipe_status->xfer_length = 0;\n  // receive data\n  if (tu_edpt_dir(pipe_status->ep_addr) == TUSB_DIR_IN) {\n    usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.BYTE_COUNT = 0;\n    usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.MULTI_PACKET_SIZE = pipe_status->max_packet_size;\n    USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_BK0RDY;\n  }\n  // send data\n  else {\n    usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.BYTE_COUNT =\n        (pipe_status->xfer_remaining < pipe_status->max_packet_size) ? pipe_status->xfer_remaining\n                                                                     : pipe_status->max_packet_size;\n    usb_pipe_table[pipe].HostDescBank[0].PCKSIZE.bit.MULTI_PACKET_SIZE = 0;\n    USB->HOST.HostPipe[pipe].PSTATUSSET.reg = USB_HOST_PSTATUSSET_BK0RDY;\n  }\n\n  // clear pending interrupts\n  USB->HOST.HostPipe[pipe].PINTFLAG.reg |= USB->HOST.HostPipe[pipe].PINTFLAG.reg;\n\n  // begin transfer\n  USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_PFREEZE;\n\n  return true;\n}\n\n// Abort a queued transfer. Note: it can only abort transfer that has not been\n// started Return true if a queued transfer is aborted, false if there is no transfer\n// to abort\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr)\n{\n  TU_ASSERT(rhport == 0);\n\n  uint8_t pipe;\n  volatile usb_pipe_status_t* pipe_status;\n\n  TU_LOG3(\"hcd_edpt_abort_xfer(dev_addr=%02X, ep_addr=%02X)=\", dev_addr, ep_addr);\n\n  // find the pipe\n  for (pipe = 0; pipe < USB_PIPE_NUM; pipe++) {\n    pipe_status = &usb_pipe_status_table[pipe];\n    if ((pipe_status->dev_addr == dev_addr) && (pipe_status->ep_addr == ep_addr)) {\n      break;\n    }\n  }\n\n  // pipe not found\n  if (pipe >= USB_PIPE_NUM) {\n    TU_LOG3(\"ERR_NO_PIPE\\r\\n\");\n    return false;\n  }\n  TU_LOG3(\"%d\\r\\n\", pipe);\n\n  // no transfer in progress\n  if (USB->HOST.HostPipe[pipe].PSTATUS.bit.PFREEZE == 1) {\n    return false;\n  }\n\n  // abort the transfer\n  USB->HOST.HostPipe[pipe].PSTATUSSET.reg = USB_HOST_PSTATUSSET_PFREEZE;\n  pipe_status = &usb_pipe_status_table[pipe];\n  pipe_status->xfer_length = 0;\n  pipe_status->xfer_remaining = 0;\n\n  return true;\n}\n\n// clear stall, data toggle is also reset to DATA0\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr)\n{\n  TU_ASSERT(rhport == 0);\n\n  uint8_t pipe;\n  volatile usb_pipe_status_t* pipe_status;\n\n  TU_LOG3(\"hcd_edpt_clear_stall(dev_addr=%02X, ep_addr=%02X)=\", dev_addr, ep_addr);\n\n  // find the pipe\n  for (pipe = 0; pipe < USB_PIPE_NUM; pipe++) {\n    pipe_status = &usb_pipe_status_table[pipe];\n    if ((pipe_status->dev_addr == dev_addr) && (pipe_status->ep_addr == ep_addr)) {\n      break;\n    }\n  }\n\n  // pipe not found\n  if (pipe >= USB_PIPE_NUM) {\n    TU_LOG3(\"ERR_NO_PIPE\\r\\n\");\n    return false;\n  }\n  TU_LOG3(\"%d\\r\\n\", pipe);\n\n  // clear pending interrupts\n  USB->HOST.HostPipe[pipe].PINTFLAG.reg |= USB->HOST.HostPipe[pipe].PINTFLAG.reg;\n\n  // clear stalled state\n  USB->HOST.HostPipe[pipe].PSTATUSSET.reg = USB_HOST_PSTATUSSET_PFREEZE;\n  USB->HOST.HostPipe[pipe].PSTATUSCLR.reg = USB_HOST_PSTATUSCLR_DTGL;\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/microchip/samg/dcd_samg.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUSB_MCU == OPT_MCU_SAMG\n\n#include \"sam.h\"\n#include \"device/dcd.h\"\n\n// TODO should support (SAM3S || SAM4S || SAM4E || SAMG55)\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n#define EP_COUNT    6\n\n// Transfer descriptor\ntypedef struct\n{\n  uint8_t* buffer;\n  // tu_fifo_t* ff; // TODO support dcd_edpt_xfer_fifo API\n  uint16_t total_len;\n  volatile uint16_t actual_len;\n  uint16_t  epsize;\n} xfer_desc_t;\n\n// Endpoint 0-5, each can only be either OUT or In\nxfer_desc_t _dcd_xfer[EP_COUNT];\n\nTU_ATTR_ALWAYS_INLINE static inline void xfer_epsize_set(xfer_desc_t* xfer, uint16_t epsize) {\n  xfer->epsize = epsize;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void xfer_begin(xfer_desc_t* xfer, uint8_t * buffer, uint16_t total_bytes) {\n  xfer->buffer     = buffer;\n  // xfer->ff         = NULL; // TODO support dcd_edpt_xfer_fifo API\n  xfer->total_len  = total_bytes;\n  xfer->actual_len = 0;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void xfer_end(xfer_desc_t* xfer) {\n  xfer->buffer     = NULL;\n  // xfer->ff         = NULL; // TODO support dcd_edpt_xfer_fifo API\n  xfer->total_len  = 0;\n  xfer->actual_len = 0;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t xfer_packet_len(xfer_desc_t* xfer) {\n  // also cover zero-length packet\n  return tu_min16(xfer->total_len - xfer->actual_len, xfer->epsize);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void xfer_packet_done(xfer_desc_t* xfer) {\n  uint16_t const xact_len = xfer_packet_len(xfer);\n  xfer->buffer += xact_len;\n  xfer->actual_len += xact_len;\n}\n\n//------------- Transaction helpers -------------//\n\n// Write data to EP FIFO, return number of written bytes\nstatic void xact_ep_write(uint8_t epnum, uint8_t* buffer, uint16_t xact_len) {\n  for(uint16_t i=0; i<xact_len; i++) {\n    UDP->UDP_FDR[epnum] = (uint32_t) buffer[i];\n  }\n}\n\n// Read data from EP FIFO\nstatic void xact_ep_read(uint8_t epnum, uint8_t* buffer, uint16_t xact_len) {\n  for(uint16_t i=0; i<xact_len; i++) {\n    buffer[i] = (uint8_t) UDP->UDP_FDR[epnum];\n  }\n}\n\n\n//! Bitmap for all status bits in CSR that are not affected by a value 1.\n#define CSR_NO_EFFECT_1_ALL (UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1 | UDP_CSR_STALLSENT | UDP_CSR_RXSETUP | UDP_CSR_TXCOMP)\n\n// Per Specs: CSR need synchronization each write\nTU_ATTR_ALWAYS_INLINE static inline void csr_write(uint8_t epnum, uint32_t value) {\n  uint32_t const csr = value;\n  UDP->UDP_CSR[epnum] = csr;\n\n  volatile uint32_t nop_count;\n  for (nop_count = 0; nop_count < 20; nop_count ++) {\n    __NOP();\n  }\n}\n\n// Per Specs: CSR need synchronization each write\nTU_ATTR_ALWAYS_INLINE static inline void csr_set(uint8_t epnum, uint32_t mask)\n{\n  csr_write(epnum, UDP->UDP_CSR[epnum] | CSR_NO_EFFECT_1_ALL | mask);\n}\n\n// Per Specs: CSR need synchronization each write\nTU_ATTR_ALWAYS_INLINE static inline void csr_clear(uint8_t epnum, uint32_t mask) {\n  csr_write(epnum, (UDP->UDP_CSR[epnum] | CSR_NO_EFFECT_1_ALL) & ~mask);\n}\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\n\n// Set up endpoint 0, clear all other endpoints\nstatic void bus_reset(void)\n{\n  tu_memclr(_dcd_xfer, sizeof(_dcd_xfer));\n\n  xfer_epsize_set(&_dcd_xfer[0], CFG_TUD_ENDPOINT0_SIZE);\n\n  // Enable EP0 control\n  csr_write(0, UDP_CSR_EPEDS_Msk);\n\n  // Enable interrupt : EP0, Suspend, Resume, Wakeup\n  UDP->UDP_IER = UDP_IER_EP0INT_Msk | UDP_IER_RXSUSP_Msk | UDP_IER_RXRSM_Msk | UDP_IER_WAKEUP_Msk;\n\n  // Enable transceiver\n  UDP->UDP_TXVC &= ~UDP_TXVC_TXVDIS_Msk;\n}\n\n// Initialize controller to device mode\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  tu_memclr(_dcd_xfer, sizeof(_dcd_xfer));\n  dcd_connect(rhport);\n  return true;\n}\n\n// Enable device interrupt\nvoid dcd_int_enable (uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_EnableIRQ(UDP_IRQn);\n}\n\n// Disable device interrupt\nvoid dcd_int_disable (uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_DisableIRQ(UDP_IRQn);\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address (uint8_t rhport, uint8_t dev_addr)\n{\n  (void) rhport;\n  (void) dev_addr;\n\n  // Response with zlp status\n  dcd_edpt_xfer(rhport, 0x80, NULL, 0, false);\n\n  // DCD can only set address after status for this request is complete.\n  // do it at dcd_edpt0_status_complete()\n}\n\n// Wake up host\nvoid dcd_remote_wakeup (uint8_t rhport)\n{\n  (void) rhport;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n\n  // Enable pull-up, disable transceiver\n  UDP->UDP_TXVC = UDP_TXVC_PUON | UDP_TXVC_TXVDIS_Msk;\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n\n  // disable both pullup and transceiver\n  UDP->UDP_TXVC = UDP_TXVC_TXVDIS_Msk;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n// Invoked when a control transfer's status stage is complete.\n// May help DCD to prepare for next control transfer, this API is optional.\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request)\n{\n  (void) rhport;\n\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD )\n  {\n    if (request->bRequest == TUSB_REQ_SET_ADDRESS)\n    {\n      uint8_t const dev_addr = (uint8_t) request->wValue;\n\n      // Enable addressed state\n      UDP->UDP_GLB_STAT |= UDP_GLB_STAT_FADDEN_Msk;\n\n      // Set new address & Function enable bit\n      UDP->UDP_FADDR = UDP_FADDR_FEN_Msk | UDP_FADDR_FADD(dev_addr);\n    }\n    else if (request->bRequest == TUSB_REQ_SET_CONFIGURATION)\n    {\n      // Configured State\n      UDP->UDP_GLB_STAT |= UDP_GLB_STAT_CONFG_Msk;\n    }\n  }\n}\n\n// Configure endpoint's registers according to descriptor\n// SAMG doesn't support a same endpoint number with IN and OUT\n//    e.g EP1 OUT & EP1 IN cannot exist together\nbool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * ep_desc)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_desc->bEndpointAddress);\n  uint8_t const dir   = tu_edpt_dir(ep_desc->bEndpointAddress);\n\n  // TODO Isochronous is not supported yet\n  TU_VERIFY(ep_desc->bmAttributes.xfer != TUSB_XFER_ISOCHRONOUS);\n  TU_VERIFY(epnum < EP_COUNT);\n\n  // Must not already enabled\n  TU_ASSERT((UDP->UDP_CSR[epnum] & UDP_CSR_EPEDS_Msk) == 0);\n\n  xfer_epsize_set(&_dcd_xfer[epnum], tu_edpt_packet_size(ep_desc));\n\n  // Configure type and enable EP\n  csr_write(epnum, UDP_CSR_EPEDS_Msk | UDP_CSR_EPTYPE(ep_desc->bmAttributes.xfer + 4*dir));\n\n  // Enable EP Interrupt for IN\n  if (dir == TUSB_DIR_IN) UDP->UDP_IER |= (1 << epnum);\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  xfer_desc_t* xfer = &_dcd_xfer[epnum];\n  xfer_begin(xfer, buffer, total_bytes);\n\n  if (dir == TUSB_DIR_OUT)\n  {\n    // Enable interrupt when starting OUT transfer\n    if (epnum != 0) UDP->UDP_IER |= (1 << epnum);\n  }\n  else\n  {\n    xact_ep_write(epnum, xfer->buffer, xfer_packet_len(xfer));\n\n    // TX ready for transfer\n    csr_set(epnum, UDP_CSR_TXPKTRDY_Msk);\n  }\n\n  return true;\n}\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n  return true;\n}\n#endif\n\n// Stall endpoint\nvoid dcd_edpt_stall (uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  // For EP0 USBD will stall both EP0 Out and In with 0x00 and 0x80\n  // only handle one by skipping 0x80\n  if ( ep_addr == tu_edpt_addr(0, TUSB_DIR_IN_MASK) ) return;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n\n  // Set force stall bit\n  csr_set(epnum, UDP_CSR_FORCESTALL_Msk);\n}\n\n// clear stall, data toggle is also reset to DATA0\nvoid dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n\n  // clear stall\n  csr_clear(epnum, UDP_CSR_FORCESTALL_Msk);\n\n  // must also reset EP to clear data toggle\n  UDP->UDP_RST_EP |= (1 << epnum);\n  UDP->UDP_RST_EP &= ~(1 << epnum);\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\nvoid dcd_int_handler(uint8_t rhport)\n{\n  uint32_t const intr_mask   = UDP->UDP_IMR;\n  uint32_t const intr_status = UDP->UDP_ISR & intr_mask;\n\n  // clear interrupt\n  UDP->UDP_ICR = intr_status;\n\n  // Bus reset\n  if (intr_status & UDP_ISR_ENDBUSRES_Msk)\n  {\n    bus_reset();\n    dcd_event_bus_reset(rhport, TUSB_SPEED_FULL, true);\n  }\n\n  // SOF\n//  if (intr_status & UDP_ISR_SOFINT_Msk) dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);\n\n  // Suspend\n  if (intr_status & UDP_ISR_RXSUSP_Msk) dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n\n  // Resume\n  if (intr_status & UDP_ISR_RXRSM_Msk)  dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n\n  // Wakeup\n  if (intr_status & UDP_ISR_WAKEUP_Msk)  dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n\n  //------------- Endpoints -------------//\n\n  if ( intr_status & TU_BIT(0) )\n  {\n    // setup packet\n    if ( UDP->UDP_CSR[0] & UDP_CSR_RXSETUP )\n    {\n      // get setup from FIFO\n      uint8_t setup[8];\n      for(uint8_t i=0; i<sizeof(setup); i++)\n      {\n        setup[i] = (uint8_t) UDP->UDP_FDR[0];\n      }\n\n      // notify usbd\n      dcd_event_setup_received(rhport, setup, true);\n\n      // Set EP direction bit according to DATA stage\n      // MUST only be set before RXSETUP is clear per specs\n      if ( tu_edpt_dir(setup[0]) )\n      {\n        csr_set(0, UDP_CSR_DIR_Msk);\n      }\n      else\n      {\n        csr_clear(0, UDP_CSR_DIR_Msk);\n      }\n\n      // Clear Setup, stall and other on-going transfer bits\n      csr_clear(0, UDP_CSR_RXSETUP_Msk | UDP_CSR_TXPKTRDY_Msk | UDP_CSR_TXCOMP_Msk | UDP_CSR_RX_DATA_BK0 | UDP_CSR_RX_DATA_BK1 | UDP_CSR_STALLSENT_Msk | UDP_CSR_FORCESTALL_Msk);\n    }\n  }\n\n  for(uint8_t epnum = 0; epnum < EP_COUNT; epnum++)\n  {\n    if ( intr_status & TU_BIT(epnum) )\n    {\n      xfer_desc_t* xfer = &_dcd_xfer[epnum];\n\n      //------------- Endpoint IN -------------//\n      if (UDP->UDP_CSR[epnum] & UDP_CSR_TXCOMP_Msk)\n      {\n        xfer_packet_done(xfer);\n\n        uint16_t const xact_len = xfer_packet_len(xfer);\n\n        if (xact_len)\n        {\n          // write to EP fifo\n#if 0 // TODO support dcd_edpt_xfer_fifo\n          if (xfer->ff) {\n            tu_fifo_read_n_access_mode(xfer->ff, (void *) &UDP->UDP_FDR[epnum], xact_len, true);\n          }\n          else\n#endif\n          {\n            xact_ep_write(epnum, xfer->buffer, xact_len);\n          }\n\n          // TX ready for transfer\n          csr_set(epnum, UDP_CSR_TXPKTRDY_Msk);\n        }else\n        {\n          // xfer is complete\n          dcd_event_xfer_complete(rhport, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, XFER_RESULT_SUCCESS, true);\n\n          // Required since control OUT can happen right after before stack handle this event\n          xfer_end(xfer);\n        }\n\n        // Clear TX Complete bit\n        csr_clear(epnum, UDP_CSR_TXCOMP_Msk);\n      }\n\n      //------------- Endpoint OUT -------------//\n      // Ping-Pong is a MUST for Bulk/Iso\n      // NOTE: When both Bank0 and Bank1 are both set, there is no way to know which one comes first\n      uint32_t const banks_complete = UDP->UDP_CSR[epnum] & (UDP_CSR_RX_DATA_BK0_Msk | UDP_CSR_RX_DATA_BK1_Msk);\n      if (banks_complete)\n      {\n        uint16_t const xact_len = (uint16_t) ((UDP->UDP_CSR[epnum] & UDP_CSR_RXBYTECNT_Msk) >> UDP_CSR_RXBYTECNT_Pos);\n\n        // Read from EP fifo\n#if 0 // TODO support dcd_edpt_xfer_fifo API\n        if (xfer->ff) {\n          tu_fifo_write_n_access_mode(xfer->ff, (const void *) &UDP->UDP_FDR[epnum], xact_len, true);\n        }\n        else\n#endif\n        {\n          xact_ep_read(epnum, xfer->buffer, xact_len);\n        }\n\n        xfer_packet_done(xfer);\n\n        if ( 0 == xfer_packet_len(xfer) )\n        {\n          // Disable OUT EP interrupt when transfer is complete\n          if (epnum != 0) UDP->UDP_IDR |= (1 << epnum);\n\n          dcd_event_xfer_complete(rhport, epnum, xfer->actual_len, XFER_RESULT_SUCCESS, true);\n          xfer_end(xfer);\n        }\n\n        // Clear DATA Bank0/1 bit\n        csr_clear(epnum, banks_complete);\n      }\n\n      // Stall sent to host\n      if (UDP->UDP_CSR[epnum] & UDP_CSR_STALLSENT_Msk)\n      {\n        csr_clear(epnum, UDP_CSR_STALLSENT_Msk);\n      }\n    }\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/microchip/samx7x/dcd_samx7x.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n * Copyright (c) 2021, HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_SAMX7X\n\n  #include \"device/dcd.h\"\n  #include \"sam.h\"\n  #include \"samx7x_common.h\"\n  //--------------------------------------------------------------------+\n  // MACRO TYPEDEF CONSTANT ENUM DECLARATION\n  //--------------------------------------------------------------------+\n\n  // Dual bank can improve performance, but need 2 times bigger packet buffer\n  // As SAM7x has only 4KB packet buffer, use with caution !\n  // Enable in FS mode as packets are smaller\n  #ifndef USE_DUAL_BANK\n    #if TUD_OPT_HIGH_SPEED\n      #define USE_DUAL_BANK 0\n    #else\n      #define USE_DUAL_BANK 1\n    #endif\n  #endif\n\n  #define EP_GET_FIFO_PTR(ep, scale)                                                            \\\n    (((TU_XSTRCAT(TU_STRCAT(uint, scale), _t)(*)[0x8000 / ((scale) / 8)]) FIFO_RAM_ADDR)[(ep)])\n\n// Transfer control context\ntypedef struct {\n  uint8_t   *buffer;\n  uint16_t   total_len;\n  uint16_t   queued_len;\n  uint16_t   max_packet_size;\n  uint8_t    interval;\n  tu_fifo_t *fifo;\n} xfer_ctl_t;\n\nstatic tusb_speed_t get_speed(void);\nstatic void         dcd_transmit_packet(xfer_ctl_t *xfer, uint8_t ep_ix);\n\nstatic xfer_ctl_t xfer_status[EP_MAX];\n\nstatic const tusb_desc_endpoint_t ep0_desc = {\n  .bEndpointAddress = 0x00,\n  .wMaxPacketSize   = CFG_TUD_ENDPOINT0_SIZE,\n};\n\n  #if CFG_TUD_MEM_DCACHE_ENABLE\nbool dcd_dcache_clean(const void *addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return samx7x_dcache_clean(addr, data_size);\n}\n\nbool dcd_dcache_invalidate(const void *addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return samx7x_dcache_invalidate(addr, data_size);\n}\n\nbool dcd_dcache_clean_invalidate(const void *addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return samx7x_dcache_clean_invalidate(addr, data_size);\n}\n  #endif\n//------------------------------------------------------------------\n// Device API\n//------------------------------------------------------------------\n\n// Initialize controller to device mode\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init) {\n  (void)rh_init;\n  dcd_connect(rhport);\n  return true;\n}\n\n// Enable device interrupt\nvoid dcd_int_enable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_EnableIRQ((IRQn_Type)ID_USBHS);\n}\n\n// Disable device interrupt\nvoid dcd_int_disable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_DisableIRQ((IRQn_Type)ID_USBHS);\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  (void)dev_addr;\n  // DCD can only set address after status for this request is complete\n  // do it at dcd_edpt0_status_complete()\n\n  // Response with zlp status\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n}\n\n// Wake up host\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  (void)rhport;\n  USB_REG->DEVCTRL |= DEVCTRL_RMWKUP;\n}\n\n// Connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport) {\n  (void)rhport;\n  dcd_int_disable(rhport);\n  // Enable the USB controller in device mode\n  USB_REG->CTRL = CTRL_UIMOD | CTRL_USBE;\n  while (!(USB_REG->SR & SR_CLKUSABLE))\n    ;\n  #if TUD_OPT_HIGH_SPEED\n  USB_REG->DEVCTRL &= ~DEVCTRL_SPDCONF;\n  #else\n  USB_REG->DEVCTRL |= DEVCTRL_SPDCONF_LOW_POWER;\n  #endif\n  // Enable the End Of Reset, Suspend & Wakeup interrupts\n  USB_REG->DEVIER = (DEVIER_EORSTES | DEVIER_SUSPES | DEVIER_WAKEUPES);\n  // Clear the End Of Reset, SOF & Wakeup interrupts\n  USB_REG->DEVICR = (DEVICR_EORSTC | DEVICR_SOFC | DEVICR_WAKEUPC);\n  // Manually set the Suspend Interrupt\n  USB_REG->DEVIFR |= DEVIFR_SUSPS;\n  // Ack the Wakeup Interrupt\n  USB_REG->DEVICR = DEVICR_WAKEUPC;\n  // Attach the device\n  USB_REG->DEVCTRL &= ~DEVCTRL_DETACH;\n  // Freeze USB clock\n  USB_REG->CTRL |= CTRL_FRZCLK;\n}\n\n// Disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport) {\n  (void)rhport;\n  dcd_int_disable(rhport);\n  // Disable all endpoints\n  USB_REG->DEVEPT &= ~(0x3FF << DEVEPT_EPEN0_Pos);\n  // Unfreeze USB clock\n  USB_REG->CTRL &= ~CTRL_FRZCLK;\n  while (!(USB_REG->SR & SR_CLKUSABLE))\n    ;\n  // Clear all the pending interrupts\n  USB_REG->DEVICR = DEVICR_Msk;\n  // Disable all interrupts\n  USB_REG->DEVIDR = DEVIDR_Msk;\n  // Detach the device\n  USB_REG->DEVCTRL |= DEVCTRL_DETACH;\n  // Disable the device address\n  USB_REG->DEVCTRL &= ~(DEVCTRL_ADDEN | DEVCTRL_UADD);\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void)rhport;\n  if (en) {\n    USB_REG->DEVIER = DEVIER_SOFES;\n  } else {\n    USB_REG->DEVIDR = DEVIDR_SOFEC;\n  }\n}\n\nstatic tusb_speed_t get_speed(void) {\n  switch (USB_REG->SR & SR_SPEED) {\n    case SR_SPEED_FULL_SPEED:\n    default:\n      return TUSB_SPEED_FULL;\n    case SR_SPEED_HIGH_SPEED:\n      return TUSB_SPEED_HIGH;\n    case SR_SPEED_LOW_SPEED:\n      return TUSB_SPEED_LOW;\n  }\n}\n\nstatic void dcd_ep_handler(uint8_t ep_ix) {\n  uint32_t int_status = USB_REG->DEVEPTISR[ep_ix];\n  int_status &= USB_REG->DEVEPTIMR[ep_ix];\n\n  uint16_t    count = (USB_REG->DEVEPTISR[ep_ix] & DEVEPTISR_BYCT) >> DEVEPTISR_BYCT_Pos;\n  xfer_ctl_t *xfer  = &xfer_status[ep_ix];\n\n  if (ep_ix == 0U) {\n    static uint8_t ctrl_dir;\n\n    if (int_status & DEVEPTISR_CTRL_RXSTPI) {\n      ctrl_dir = (USB_REG->DEVEPTISR[0] & DEVEPTISR_CTRL_CTRLDIR) >> DEVEPTISR_CTRL_CTRLDIR_Pos;\n      // Setup packet should always be 8 bytes. If not, ignore it, and try again.\n      if (count == 8) {\n        uint8_t *ptr = EP_GET_FIFO_PTR(0, 8);\n        dcd_event_setup_received(0, ptr, true);\n      }\n      // Ack and disable SETUP interrupt\n      USB_REG->DEVEPTICR[0] = DEVEPTICR_CTRL_RXSTPIC;\n      USB_REG->DEVEPTIDR[0] = DEVEPTIDR_CTRL_RXSTPEC;\n    }\n    if (int_status & DEVEPTISR_RXOUTI) {\n      uint8_t *ptr = EP_GET_FIFO_PTR(0, 8);\n\n      if (count && xfer->total_len) {\n        uint16_t remain = xfer->total_len - xfer->queued_len;\n        if (count > remain) {\n          count = remain;\n        }\n        if (xfer->buffer) {\n          memcpy(xfer->buffer + xfer->queued_len, ptr, count);\n        } else {\n          tu_hwfifo_read_to_fifo(ptr, xfer->fifo, count, NULL);\n        }\n        xfer->queued_len = (uint16_t)(xfer->queued_len + count);\n      }\n      // Acknowledge the interrupt\n      USB_REG->DEVEPTICR[0] = DEVEPTICR_RXOUTIC;\n      if ((count < xfer->max_packet_size) || (xfer->queued_len == xfer->total_len)) {\n        // RX COMPLETE\n        dcd_event_xfer_complete(0, 0, xfer->queued_len, XFER_RESULT_SUCCESS, true);\n        // Disable the interrupt\n        USB_REG->DEVEPTIDR[0] = DEVEPTIDR_RXOUTEC;\n        // Re-enable SETUP interrupt\n        if (ctrl_dir == 1) {\n          USB_REG->DEVEPTIER[0] = DEVEPTIER_CTRL_RXSTPES;\n        }\n      }\n    }\n    if (int_status & DEVEPTISR_TXINI) {\n      // Disable the interrupt\n      USB_REG->DEVEPTIDR[0] = DEVEPTIDR_TXINEC;\n      if ((xfer->total_len != xfer->queued_len)) {\n        // TX not complete\n        dcd_transmit_packet(xfer, 0);\n      } else {\n        // TX complete\n        dcd_event_xfer_complete(0, 0x80 + 0, xfer->total_len, XFER_RESULT_SUCCESS, true);\n        // Re-enable SETUP interrupt\n        if (ctrl_dir == 0) {\n          USB_REG->DEVEPTIER[0] = DEVEPTIER_CTRL_RXSTPES;\n        }\n      }\n    }\n  } else {\n    if (int_status & DEVEPTISR_RXOUTI) {\n      if (count && xfer->total_len) {\n        uint16_t remain = xfer->total_len - xfer->queued_len;\n        if (count > remain) {\n          count = remain;\n        }\n        uint8_t *ptr = EP_GET_FIFO_PTR(ep_ix, 8);\n        if (xfer->buffer) {\n          memcpy(xfer->buffer + xfer->queued_len, ptr, count);\n        } else {\n          tu_hwfifo_read_to_fifo(ptr, xfer->fifo, count, NULL);\n        }\n        xfer->queued_len = (uint16_t)(xfer->queued_len + count);\n      }\n      // Clear the FIFO control flag to receive more data.\n      USB_REG->DEVEPTIDR[ep_ix] = DEVEPTIDR_FIFOCONC;\n      // Acknowledge the interrupt\n      USB_REG->DEVEPTICR[ep_ix] = DEVEPTICR_RXOUTIC;\n      if ((count < xfer->max_packet_size) || (xfer->queued_len == xfer->total_len)) {\n        // RX COMPLETE\n        dcd_event_xfer_complete(0, ep_ix, xfer->queued_len, XFER_RESULT_SUCCESS, true);\n        // Disable the interrupt\n        USB_REG->DEVEPTIDR[ep_ix] = DEVEPTIDR_RXOUTEC;\n        // Though the host could still send, we don't know.\n      }\n    }\n    if (int_status & DEVEPTISR_TXINI) {\n      // Acknowledge the interrupt\n      USB_REG->DEVEPTICR[ep_ix] = DEVEPTICR_TXINIC;\n      if ((xfer->total_len != xfer->queued_len)) {\n        // TX not complete\n        dcd_transmit_packet(xfer, ep_ix);\n      } else {\n        // TX complete\n        dcd_event_xfer_complete(0, 0x80 + ep_ix, xfer->total_len, XFER_RESULT_SUCCESS, true);\n        // Disable the interrupt\n        USB_REG->DEVEPTIDR[ep_ix] = DEVEPTIDR_TXINEC;\n      }\n    }\n  }\n}\n\nstatic void dcd_dma_handler(uint8_t ep_ix) {\n  uint32_t status = USB_REG->DEVDMA[ep_ix - 1].DEVDMASTATUS;\n  if (status & DEVDMASTATUS_CHANN_ENB) {\n    return; // Ignore EOT_STA interrupt\n  }\n  // Disable DMA interrupt\n  USB_REG->DEVIDR = DEVIDR_DMA_1 << (ep_ix - 1);\n\n  xfer_ctl_t *xfer  = &xfer_status[ep_ix];\n  uint16_t    count = xfer->total_len - ((status & DEVDMASTATUS_BUFF_COUNT) >> DEVDMASTATUS_BUFF_COUNT_Pos);\n  if (USB_REG->DEVEPTCFG[ep_ix] & DEVEPTCFG_EPDIR) {\n    dcd_event_xfer_complete(0, 0x80 + ep_ix, count, XFER_RESULT_SUCCESS, true);\n  } else {\n    dcd_dcache_invalidate(xfer->buffer, count);\n    dcd_event_xfer_complete(0, ep_ix, count, XFER_RESULT_SUCCESS, true);\n  }\n}\n\nvoid dcd_int_handler(uint8_t rhport) {\n  (void)rhport;\n  uint32_t int_status = USB_REG->DEVISR;\n  int_status &= USB_REG->DEVIMR;\n  // End of reset interrupt\n  if (int_status & DEVISR_EORST) {\n    // Unfreeze USB clock\n    USB_REG->CTRL &= ~CTRL_FRZCLK;\n    while (!(USB_REG->SR & SR_CLKUSABLE))\n      ;\n    // Reset all endpoints\n    for (int ep_ix = 1; ep_ix < EP_MAX; ep_ix++) {\n      USB_REG->DEVEPT |= 1 << (DEVEPT_EPRST0_Pos + ep_ix);\n      USB_REG->DEVEPT &= ~(1 << (DEVEPT_EPRST0_Pos + ep_ix));\n    }\n    dcd_edpt_open(0, &ep0_desc);\n    USB_REG->DEVICR = DEVICR_EORSTC;\n    USB_REG->DEVICR = DEVICR_WAKEUPC;\n    USB_REG->DEVICR = DEVICR_SUSPC;\n    USB_REG->DEVIER = DEVIER_SUSPES;\n\n    dcd_event_bus_reset(rhport, get_speed(), true);\n  }\n  // End of Wakeup interrupt\n  if (int_status & DEVISR_WAKEUP) {\n    USB_REG->CTRL &= ~CTRL_FRZCLK;\n    while (!(USB_REG->SR & SR_CLKUSABLE))\n      ;\n    USB_REG->DEVICR = DEVICR_WAKEUPC;\n    USB_REG->DEVIDR = DEVIDR_WAKEUPEC;\n    USB_REG->DEVIER = DEVIER_SUSPES;\n\n    dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n  }\n  // Suspend interrupt\n  if (int_status & DEVISR_SUSP) {\n    // Unfreeze USB clock\n    USB_REG->CTRL &= ~CTRL_FRZCLK;\n    while (!(USB_REG->SR & SR_CLKUSABLE))\n      ;\n    USB_REG->DEVICR = DEVICR_SUSPC;\n    USB_REG->DEVIDR = DEVIDR_SUSPEC;\n    USB_REG->DEVIER = DEVIER_WAKEUPES;\n    USB_REG->CTRL |= CTRL_FRZCLK;\n\n    dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n  }\n  if (int_status & DEVISR_SOF) {\n    USB_REG->DEVICR = DEVICR_SOFC;\n\n    dcd_event_bus_signal(0, DCD_EVENT_SOF, true);\n  }\n  // Endpoints interrupt\n  for (int ep_ix = 0; ep_ix < EP_MAX; ep_ix++) {\n    if (int_status & (DEVISR_PEP_0 << ep_ix)) {\n      dcd_ep_handler(ep_ix);\n    }\n  }\n  // Endpoints DMA interrupt\n  for (int ep_ix = 0; ep_ix < EP_MAX; ep_ix++) {\n    if (EP_DMA_SUPPORT(ep_ix)) {\n      if (int_status & (DEVISR_DMA_1 << (ep_ix - 1))) {\n        dcd_dma_handler(ep_ix);\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n// Invoked when a control transfer's status stage is complete.\n// May help DCD to prepare for next control transfer, this API is optional.\nvoid dcd_edpt0_status_complete(uint8_t rhport, const tusb_control_request_t *request) {\n  (void)rhport;\n\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD && request->bRequest == TUSB_REQ_SET_ADDRESS) {\n    const uint8_t dev_addr = (uint8_t)request->wValue;\n\n    USB_REG->DEVCTRL |= dev_addr | DEVCTRL_ADDEN;\n  }\n}\n\n// Configure endpoint's registers according to descriptor\nbool dcd_edpt_open(uint8_t rhport, const tusb_desc_endpoint_t *ep_desc) {\n  (void)rhport;\n  const uint8_t          epnum               = tu_edpt_number(ep_desc->bEndpointAddress);\n  const uint8_t          dir                 = tu_edpt_dir(ep_desc->bEndpointAddress);\n  const uint16_t         epMaxPktSize        = tu_edpt_packet_size(ep_desc);\n  const tusb_xfer_type_t eptype              = (tusb_xfer_type_t)ep_desc->bmAttributes.xfer;\n  uint8_t                fifoSize            = 0; // FIFO size\n  uint16_t               defaultEndpointSize = 8; // Default size of Endpoint\n  // Find upper 2 power number of epMaxPktSize\n  if (epMaxPktSize) {\n    while (defaultEndpointSize < epMaxPktSize) {\n      fifoSize++;\n      defaultEndpointSize <<= 1;\n    }\n  }\n  xfer_status[epnum].max_packet_size = epMaxPktSize;\n\n  USB_REG->DEVEPT |= 1 << (DEVEPT_EPRST0_Pos + epnum);\n  USB_REG->DEVEPT &= ~(1 << (DEVEPT_EPRST0_Pos + epnum));\n\n  if (epnum == 0) {\n    // Enable the control endpoint - Endpoint 0\n    USB_REG->DEVEPT |= DEVEPT_EPEN0;\n    // Configure the Endpoint 0 configuration register\n    USB_REG->DEVEPTCFG[0] = ((fifoSize << DEVEPTCFG_EPSIZE_Pos) | (TUSB_XFER_CONTROL << DEVEPTCFG_EPTYPE_Pos) |\n                             (DEVEPTCFG_EPBK_1_BANK << DEVEPTCFG_EPBK_Pos) | DEVEPTCFG_ALLOC);\n    USB_REG->DEVEPTIER[0] = DEVEPTIER_RSTDTS;\n    USB_REG->DEVEPTIDR[0] = DEVEPTIDR_CTRL_STALLRQC;\n    if (DEVEPTISR_CFGOK == (USB_REG->DEVEPTISR[0] & DEVEPTISR_CFGOK)) {\n      // Endpoint configuration is successful\n      USB_REG->DEVEPTIER[0] = DEVEPTIER_CTRL_RXSTPES;\n      // Enable Endpoint 0 Interrupts\n      USB_REG->DEVIER = DEVIER_PEP_0;\n      return true;\n    } else {\n      // Endpoint configuration is not successful\n      return false;\n    }\n  } else {\n    // Enable the endpoint\n    USB_REG->DEVEPT |= ((0x01 << epnum) << DEVEPT_EPEN0_Pos);\n    // Set up the maxpacket size, fifo start address fifosize\n    // and enable the interrupt. CLear the data toggle.\n    // AUTOSW is needed for DMA ack !\n    USB_REG->DEVEPTCFG[epnum] =\n      ((fifoSize << DEVEPTCFG_EPSIZE_Pos) | (eptype << DEVEPTCFG_EPTYPE_Pos) |\n       (DEVEPTCFG_EPBK_1_BANK << DEVEPTCFG_EPBK_Pos) | DEVEPTCFG_AUTOSW | ((dir & 0x01) << DEVEPTCFG_EPDIR_Pos));\n    if (eptype == TUSB_XFER_ISOCHRONOUS) {\n      USB_REG->DEVEPTCFG[epnum] |= DEVEPTCFG_NBTRANS_1_TRANS;\n    }\n  #if USE_DUAL_BANK\n    if (eptype == TUSB_XFER_ISOCHRONOUS || eptype == TUSB_XFER_BULK) {\n      USB_REG->DEVEPTCFG[epnum] |= DEVEPTCFG_EPBK_2_BANK;\n    }\n  #endif\n    USB_REG->DEVEPTCFG[epnum] |= DEVEPTCFG_ALLOC;\n    USB_REG->DEVEPTIER[epnum] = DEVEPTIER_RSTDTS;\n    USB_REG->DEVEPTIDR[epnum] = DEVEPTIDR_CTRL_STALLRQC;\n    if (DEVEPTISR_CFGOK == (USB_REG->DEVEPTISR[epnum] & DEVEPTISR_CFGOK)) {\n      USB_REG->DEVIER = ((0x01 << epnum) << DEVIER_PEP_0_Pos);\n      return true;\n    } else {\n      // Endpoint configuration is not successful\n      return false;\n    }\n  }\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  (void)rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\nstatic void dcd_transmit_packet(xfer_ctl_t *xfer, uint8_t ep_ix) {\n  uint16_t len = (uint16_t)(xfer->total_len - xfer->queued_len);\n  if (len) {\n    if (len > xfer->max_packet_size) {\n      len = xfer->max_packet_size;\n    }\n    uint8_t *ptr = EP_GET_FIFO_PTR(ep_ix, 8);\n    if (xfer->buffer) {\n      memcpy(ptr, xfer->buffer + xfer->queued_len, len);\n    } else {\n      tu_hwfifo_write_from_fifo(ptr, xfer->fifo, len, NULL);\n    }\n    __DSB();\n    __ISB();\n    xfer->queued_len = (uint16_t)(xfer->queued_len + len);\n  }\n  if (ep_ix == 0U) {\n    // Control endpoint: clear the interrupt flag to send the data\n    USB_REG->DEVEPTICR[0] = DEVEPTICR_TXINIC;\n  } else {\n    // Other endpoint types: clear the FIFO control flag to send the data\n    USB_REG->DEVEPTIDR[ep_ix] = DEVEPTIDR_FIFOCONC;\n  }\n  USB_REG->DEVEPTIER[ep_ix] = DEVEPTIER_TXINES;\n}\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes, bool is_isr) {\n  (void)is_isr;\n  (void)rhport;\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir   = tu_edpt_dir(ep_addr);\n\n  xfer_ctl_t *xfer = &xfer_status[epnum];\n\n  xfer->buffer     = buffer;\n  xfer->total_len  = total_bytes;\n  xfer->queued_len = 0;\n  xfer->fifo       = NULL;\n\n  if (EP_DMA_SUPPORT(epnum) && total_bytes != 0) {\n    uint32_t udd_dma_ctrl = total_bytes << DEVDMACONTROL_BUFF_LENGTH_Pos;\n    if (dir == TUSB_DIR_OUT) {\n      udd_dma_ctrl |= DEVDMACONTROL_END_TR_IT | DEVDMACONTROL_END_TR_EN;\n    } else {\n      udd_dma_ctrl |= DEVDMACONTROL_END_B_EN;\n      dcd_dcache_clean(xfer->buffer, total_bytes);\n    }\n    USB_REG->DEVDMA[epnum - 1].DEVDMAADDRESS = (uint32_t)buffer;\n    udd_dma_ctrl |= DEVDMACONTROL_END_BUFFIT | DEVDMACONTROL_CHANN_ENB;\n    USB_REG->DEVDMA[epnum - 1].DEVDMACONTROL = udd_dma_ctrl;\n    USB_REG->DEVIER                          = DEVIER_DMA_1 << (epnum - 1);\n  } else {\n    if (dir == TUSB_DIR_OUT) {\n      USB_REG->DEVEPTIER[epnum] = DEVEPTIER_RXOUTES;\n    } else {\n      dcd_transmit_packet(xfer, epnum);\n    }\n  }\n  return true;\n}\n\n// The number of bytes has to be given explicitly to allow more flexible control of how many\n// bytes should be written and second to keep the return value free to give back a boolean\n// success message. If total_bytes is too big, the FIFO will copy only what is available\n// into the USB buffer!\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes, bool is_isr) {\n  (void)is_isr;\n  (void)rhport;\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir   = tu_edpt_dir(ep_addr);\n\n  xfer_ctl_t *xfer = &xfer_status[epnum];\n\n  xfer->buffer     = NULL;\n  xfer->total_len  = total_bytes;\n  xfer->queued_len = 0;\n  xfer->fifo       = ff;\n\n  if (dir == TUSB_DIR_OUT) {\n    USB_REG->DEVEPTIER[epnum] = DEVEPTIER_RXOUTES;\n  } else {\n    dcd_transmit_packet(xfer, epnum);\n  }\n  return true;\n}\n\n// Stall endpoint\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void)rhport;\n  const uint8_t epnum       = tu_edpt_number(ep_addr);\n  USB_REG->DEVEPTIER[epnum] = DEVEPTIER_CTRL_STALLRQS;\n  // Re-enable SETUP interrupt\n  if (epnum == 0) {\n    USB_REG->DEVEPTIER[0] = DEVEPTIER_CTRL_RXSTPES;\n  }\n}\n\n// clear stall, data toggle is also reset to DATA0\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void)rhport;\n  const uint8_t epnum       = tu_edpt_number(ep_addr);\n  USB_REG->DEVEPTIDR[epnum] = DEVEPTIDR_CTRL_STALLRQC;\n  USB_REG->DEVEPTIER[epnum] = DEVEPTIER_RSTDTS;\n}\n#endif\n"
  },
  {
    "path": "src/portable/microchip/samx7x/samx7x_common.h",
    "content": "/*\n* The MIT License (MIT)\n*\n* Copyright (c) 2019 Microchip Technology Inc.\n* Copyright (c) 2018, hathach (tinyusb.org)\n* Copyright (c) 2021, HiFiPhile\n*\n* Permission is hereby granted, free of charge, to any person obtaining a copy\n* of this software and associated documentation files (the \"Software\"), to deal\n* in the Software without restriction, including without limitation the rights\n* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n* copies of the Software, and to permit persons to whom the Software is\n* furnished to do so, subject to the following conditions:\n*\n* The above copyright notice and this permission notice shall be included in\n* all copies or substantial portions of the Software.\n*\n* THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n* THE SOFTWARE.\n*\n* This file is part of the TinyUSB stack.\n*/\n\n#ifndef _COMMON_USB_REGS_H_\n#define _COMMON_USB_REGS_H_\n\n#if CFG_TUSB_MCU == OPT_MCU_SAMX7X\n\n/* -------- DEVDMANXTDSC : (USBHS Offset: 0x00) (R/W 32) Device DMA Channel Next Descriptor Address Register -------- */\n\n#define DEVDMANXTDSC_OFFSET           (0x00)                                        /**<  (DEVDMANXTDSC) Device DMA Channel Next Descriptor Address Register  Offset */\n\n#define DEVDMANXTDSC_NXT_DSC_ADD_Pos  0                                              /**< (DEVDMANXTDSC) Next Descriptor Address Position */\n#define DEVDMANXTDSC_NXT_DSC_ADD      (_U_(0xFFFFFFFF) << DEVDMANXTDSC_NXT_DSC_ADD_Pos)  /**< (DEVDMANXTDSC) Next Descriptor Address Mask */\n#define DEVDMANXTDSC_Msk              _U_(0xFFFFFFFF)                                /**< (DEVDMANXTDSC) Register Mask  */\n\n\n/* -------- DEVDMAADDRESS : (USBHS Offset: 0x04) (R/W 32) Device DMA Channel Address Register -------- */\n\n#define DEVDMAADDRESS_OFFSET          (0x04)                                        /**<  (DEVDMAADDRESS) Device DMA Channel Address Register  Offset */\n\n#define DEVDMAADDRESS_BUFF_ADD_Pos    0                                              /**< (DEVDMAADDRESS) Buffer Address Position */\n#define DEVDMAADDRESS_BUFF_ADD        (_U_(0xFFFFFFFF) << DEVDMAADDRESS_BUFF_ADD_Pos)  /**< (DEVDMAADDRESS) Buffer Address Mask */\n#define DEVDMAADDRESS_Msk             _U_(0xFFFFFFFF)                                /**< (DEVDMAADDRESS) Register Mask  */\n\n\n/* -------- DEVDMACONTROL : (USBHS Offset: 0x08) (R/W 32) Device DMA Channel Control Register -------- */\n\n#define DEVDMACONTROL_OFFSET          (0x08)                                        /**<  (DEVDMACONTROL) Device DMA Channel Control Register  Offset */\n\n#define DEVDMACONTROL_CHANN_ENB_Pos   0                                              /**< (DEVDMACONTROL) Channel Enable Command Position */\n#define DEVDMACONTROL_CHANN_ENB       (_U_(0x1) << DEVDMACONTROL_CHANN_ENB_Pos)  /**< (DEVDMACONTROL) Channel Enable Command Mask */\n#define DEVDMACONTROL_LDNXT_DSC_Pos   1                                              /**< (DEVDMACONTROL) Load Next Channel Transfer Descriptor Enable Command Position */\n#define DEVDMACONTROL_LDNXT_DSC       (_U_(0x1) << DEVDMACONTROL_LDNXT_DSC_Pos)  /**< (DEVDMACONTROL) Load Next Channel Transfer Descriptor Enable Command Mask */\n#define DEVDMACONTROL_END_TR_EN_Pos   2                                              /**< (DEVDMACONTROL) End of Transfer Enable Control (OUT transfers only) Position */\n#define DEVDMACONTROL_END_TR_EN       (_U_(0x1) << DEVDMACONTROL_END_TR_EN_Pos)  /**< (DEVDMACONTROL) End of Transfer Enable Control (OUT transfers only) Mask */\n#define DEVDMACONTROL_END_B_EN_Pos    3                                              /**< (DEVDMACONTROL) End of Buffer Enable Control Position */\n#define DEVDMACONTROL_END_B_EN        (_U_(0x1) << DEVDMACONTROL_END_B_EN_Pos)  /**< (DEVDMACONTROL) End of Buffer Enable Control Mask */\n#define DEVDMACONTROL_END_TR_IT_Pos   4                                              /**< (DEVDMACONTROL) End of Transfer Interrupt Enable Position */\n#define DEVDMACONTROL_END_TR_IT       (_U_(0x1) << DEVDMACONTROL_END_TR_IT_Pos)  /**< (DEVDMACONTROL) End of Transfer Interrupt Enable Mask */\n#define DEVDMACONTROL_END_BUFFIT_Pos  5                                              /**< (DEVDMACONTROL) End of Buffer Interrupt Enable Position */\n#define DEVDMACONTROL_END_BUFFIT      (_U_(0x1) << DEVDMACONTROL_END_BUFFIT_Pos)  /**< (DEVDMACONTROL) End of Buffer Interrupt Enable Mask */\n#define DEVDMACONTROL_DESC_LD_IT_Pos  6                                              /**< (DEVDMACONTROL) Descriptor Loaded Interrupt Enable Position */\n#define DEVDMACONTROL_DESC_LD_IT      (_U_(0x1) << DEVDMACONTROL_DESC_LD_IT_Pos)  /**< (DEVDMACONTROL) Descriptor Loaded Interrupt Enable Mask */\n#define DEVDMACONTROL_BURST_LCK_Pos   7                                              /**< (DEVDMACONTROL) Burst Lock Enable Position */\n#define DEVDMACONTROL_BURST_LCK       (_U_(0x1) << DEVDMACONTROL_BURST_LCK_Pos)  /**< (DEVDMACONTROL) Burst Lock Enable Mask */\n#define DEVDMACONTROL_BUFF_LENGTH_Pos 16                                             /**< (DEVDMACONTROL) Buffer Byte Length (Write-only) Position */\n#define DEVDMACONTROL_BUFF_LENGTH     (_U_(0xFFFF) << DEVDMACONTROL_BUFF_LENGTH_Pos)  /**< (DEVDMACONTROL) Buffer Byte Length (Write-only) Mask */\n#define DEVDMACONTROL_Msk             _U_(0xFFFF00FF)                                /**< (DEVDMACONTROL) Register Mask  */\n\n\n/* -------- DEVDMASTATUS : (USBHS Offset: 0x0c) (R/W 32) Device DMA Channel Status Register -------- */\n\n#define DEVDMASTATUS_OFFSET           (0x0C)                                        /**<  (DEVDMASTATUS) Device DMA Channel Status Register  Offset */\n\n#define DEVDMASTATUS_CHANN_ENB_Pos    0                                              /**< (DEVDMASTATUS) Channel Enable Status Position */\n#define DEVDMASTATUS_CHANN_ENB        (_U_(0x1) << DEVDMASTATUS_CHANN_ENB_Pos)  /**< (DEVDMASTATUS) Channel Enable Status Mask */\n#define DEVDMASTATUS_CHANN_ACT_Pos    1                                              /**< (DEVDMASTATUS) Channel Active Status Position */\n#define DEVDMASTATUS_CHANN_ACT        (_U_(0x1) << DEVDMASTATUS_CHANN_ACT_Pos)  /**< (DEVDMASTATUS) Channel Active Status Mask */\n#define DEVDMASTATUS_END_TR_ST_Pos    4                                              /**< (DEVDMASTATUS) End of Channel Transfer Status Position */\n#define DEVDMASTATUS_END_TR_ST        (_U_(0x1) << DEVDMASTATUS_END_TR_ST_Pos)  /**< (DEVDMASTATUS) End of Channel Transfer Status Mask */\n#define DEVDMASTATUS_END_BF_ST_Pos    5                                              /**< (DEVDMASTATUS) End of Channel Buffer Status Position */\n#define DEVDMASTATUS_END_BF_ST        (_U_(0x1) << DEVDMASTATUS_END_BF_ST_Pos)  /**< (DEVDMASTATUS) End of Channel Buffer Status Mask */\n#define DEVDMASTATUS_DESC_LDST_Pos    6                                              /**< (DEVDMASTATUS) Descriptor Loaded Status Position */\n#define DEVDMASTATUS_DESC_LDST        (_U_(0x1) << DEVDMASTATUS_DESC_LDST_Pos)  /**< (DEVDMASTATUS) Descriptor Loaded Status Mask */\n#define DEVDMASTATUS_BUFF_COUNT_Pos   16                                             /**< (DEVDMASTATUS) Buffer Byte Count Position */\n#define DEVDMASTATUS_BUFF_COUNT       (_U_(0xFFFF) << DEVDMASTATUS_BUFF_COUNT_Pos)  /**< (DEVDMASTATUS) Buffer Byte Count Mask */\n#define DEVDMASTATUS_Msk              _U_(0xFFFF0073)                                /**< (DEVDMASTATUS) Register Mask  */\n\n\n/* -------- HSTDMANXTDSC : (USBHS Offset: 0x00) (R/W 32) Host DMA Channel Next Descriptor Address Register -------- */\n\n#define HSTDMANXTDSC_OFFSET           (0x00)                                        /**<  (HSTDMANXTDSC) Host DMA Channel Next Descriptor Address Register  Offset */\n\n#define HSTDMANXTDSC_NXT_DSC_ADD_Pos  0                                              /**< (HSTDMANXTDSC) Next Descriptor Address Position */\n#define HSTDMANXTDSC_NXT_DSC_ADD      (_U_(0xFFFFFFFF) << HSTDMANXTDSC_NXT_DSC_ADD_Pos)  /**< (HSTDMANXTDSC) Next Descriptor Address Mask */\n#define HSTDMANXTDSC_Msk              _U_(0xFFFFFFFF)                                /**< (HSTDMANXTDSC) Register Mask  */\n\n\n/* -------- HSTDMAADDRESS : (USBHS Offset: 0x04) (R/W 32) Host DMA Channel Address Register -------- */\n\n#define HSTDMAADDRESS_OFFSET          (0x04)                                        /**<  (HSTDMAADDRESS) Host DMA Channel Address Register  Offset */\n\n#define HSTDMAADDRESS_BUFF_ADD_Pos    0                                              /**< (HSTDMAADDRESS) Buffer Address Position */\n#define HSTDMAADDRESS_BUFF_ADD        (_U_(0xFFFFFFFF) << HSTDMAADDRESS_BUFF_ADD_Pos)  /**< (HSTDMAADDRESS) Buffer Address Mask */\n#define HSTDMAADDRESS_Msk             _U_(0xFFFFFFFF)                                /**< (HSTDMAADDRESS) Register Mask  */\n\n\n/* -------- HSTDMACONTROL : (USBHS Offset: 0x08) (R/W 32) Host DMA Channel Control Register -------- */\n\n#define HSTDMACONTROL_OFFSET          (0x08)                                        /**<  (HSTDMACONTROL) Host DMA Channel Control Register  Offset */\n\n#define HSTDMACONTROL_CHANN_ENB_Pos   0                                              /**< (HSTDMACONTROL) Channel Enable Command Position */\n#define HSTDMACONTROL_CHANN_ENB       (_U_(0x1) << HSTDMACONTROL_CHANN_ENB_Pos)  /**< (HSTDMACONTROL) Channel Enable Command Mask */\n#define HSTDMACONTROL_LDNXT_DSC_Pos   1                                              /**< (HSTDMACONTROL) Load Next Channel Transfer Descriptor Enable Command Position */\n#define HSTDMACONTROL_LDNXT_DSC       (_U_(0x1) << HSTDMACONTROL_LDNXT_DSC_Pos)  /**< (HSTDMACONTROL) Load Next Channel Transfer Descriptor Enable Command Mask */\n#define HSTDMACONTROL_END_TR_EN_Pos   2                                              /**< (HSTDMACONTROL) End of Transfer Enable Control (OUT transfers only) Position */\n#define HSTDMACONTROL_END_TR_EN       (_U_(0x1) << HSTDMACONTROL_END_TR_EN_Pos)  /**< (HSTDMACONTROL) End of Transfer Enable Control (OUT transfers only) Mask */\n#define HSTDMACONTROL_END_B_EN_Pos    3                                              /**< (HSTDMACONTROL) End of Buffer Enable Control Position */\n#define HSTDMACONTROL_END_B_EN        (_U_(0x1) << HSTDMACONTROL_END_B_EN_Pos)  /**< (HSTDMACONTROL) End of Buffer Enable Control Mask */\n#define HSTDMACONTROL_END_TR_IT_Pos   4                                              /**< (HSTDMACONTROL) End of Transfer Interrupt Enable Position */\n#define HSTDMACONTROL_END_TR_IT       (_U_(0x1) << HSTDMACONTROL_END_TR_IT_Pos)  /**< (HSTDMACONTROL) End of Transfer Interrupt Enable Mask */\n#define HSTDMACONTROL_END_BUFFIT_Pos  5                                              /**< (HSTDMACONTROL) End of Buffer Interrupt Enable Position */\n#define HSTDMACONTROL_END_BUFFIT      (_U_(0x1) << HSTDMACONTROL_END_BUFFIT_Pos)  /**< (HSTDMACONTROL) End of Buffer Interrupt Enable Mask */\n#define HSTDMACONTROL_DESC_LD_IT_Pos  6                                              /**< (HSTDMACONTROL) Descriptor Loaded Interrupt Enable Position */\n#define HSTDMACONTROL_DESC_LD_IT      (_U_(0x1) << HSTDMACONTROL_DESC_LD_IT_Pos)  /**< (HSTDMACONTROL) Descriptor Loaded Interrupt Enable Mask */\n#define HSTDMACONTROL_BURST_LCK_Pos   7                                              /**< (HSTDMACONTROL) Burst Lock Enable Position */\n#define HSTDMACONTROL_BURST_LCK       (_U_(0x1) << HSTDMACONTROL_BURST_LCK_Pos)  /**< (HSTDMACONTROL) Burst Lock Enable Mask */\n#define HSTDMACONTROL_BUFF_LENGTH_Pos 16                                             /**< (HSTDMACONTROL) Buffer Byte Length (Write-only) Position */\n#define HSTDMACONTROL_BUFF_LENGTH     (_U_(0xFFFF) << HSTDMACONTROL_BUFF_LENGTH_Pos)  /**< (HSTDMACONTROL) Buffer Byte Length (Write-only) Mask */\n#define HSTDMACONTROL_Msk             _U_(0xFFFF00FF)                                /**< (HSTDMACONTROL) Register Mask  */\n\n\n/* -------- HSTDMASTATUS : (USBHS Offset: 0x0c) (R/W 32) Host DMA Channel Status Register -------- */\n\n#define HSTDMASTATUS_OFFSET           (0x0C)                                        /**<  (HSTDMASTATUS) Host DMA Channel Status Register  Offset */\n\n#define HSTDMASTATUS_CHANN_ENB_Pos    0                                              /**< (HSTDMASTATUS) Channel Enable Status Position */\n#define HSTDMASTATUS_CHANN_ENB        (_U_(0x1) << HSTDMASTATUS_CHANN_ENB_Pos)  /**< (HSTDMASTATUS) Channel Enable Status Mask */\n#define HSTDMASTATUS_CHANN_ACT_Pos    1                                              /**< (HSTDMASTATUS) Channel Active Status Position */\n#define HSTDMASTATUS_CHANN_ACT        (_U_(0x1) << HSTDMASTATUS_CHANN_ACT_Pos)  /**< (HSTDMASTATUS) Channel Active Status Mask */\n#define HSTDMASTATUS_END_TR_ST_Pos    4                                              /**< (HSTDMASTATUS) End of Channel Transfer Status Position */\n#define HSTDMASTATUS_END_TR_ST        (_U_(0x1) << HSTDMASTATUS_END_TR_ST_Pos)  /**< (HSTDMASTATUS) End of Channel Transfer Status Mask */\n#define HSTDMASTATUS_END_BF_ST_Pos    5                                              /**< (HSTDMASTATUS) End of Channel Buffer Status Position */\n#define HSTDMASTATUS_END_BF_ST        (_U_(0x1) << HSTDMASTATUS_END_BF_ST_Pos)  /**< (HSTDMASTATUS) End of Channel Buffer Status Mask */\n#define HSTDMASTATUS_DESC_LDST_Pos    6                                              /**< (HSTDMASTATUS) Descriptor Loaded Status Position */\n#define HSTDMASTATUS_DESC_LDST        (_U_(0x1) << HSTDMASTATUS_DESC_LDST_Pos)  /**< (HSTDMASTATUS) Descriptor Loaded Status Mask */\n#define HSTDMASTATUS_BUFF_COUNT_Pos   16                                             /**< (HSTDMASTATUS) Buffer Byte Count Position */\n#define HSTDMASTATUS_BUFF_COUNT       (_U_(0xFFFF) << HSTDMASTATUS_BUFF_COUNT_Pos)  /**< (HSTDMASTATUS) Buffer Byte Count Mask */\n#define HSTDMASTATUS_Msk              _U_(0xFFFF0073)                                /**< (HSTDMASTATUS) Register Mask  */\n\n\n/* -------- DEVCTRL : (USBHS Offset: 0x00) (R/W 32) Device General Control Register -------- */\n\n#define DEVCTRL_OFFSET                (0x00)                                        /**<  (DEVCTRL) Device General Control Register  Offset */\n\n#define DEVCTRL_UADD_Pos              0                                              /**< (DEVCTRL) USB Address Position */\n#define DEVCTRL_UADD                  (_U_(0x7F) << DEVCTRL_UADD_Pos)          /**< (DEVCTRL) USB Address Mask */\n#define DEVCTRL_ADDEN_Pos             7                                              /**< (DEVCTRL) Address Enable Position */\n#define DEVCTRL_ADDEN                 (_U_(0x1) << DEVCTRL_ADDEN_Pos)          /**< (DEVCTRL) Address Enable Mask */\n#define DEVCTRL_DETACH_Pos            8                                              /**< (DEVCTRL) Detach Position */\n#define DEVCTRL_DETACH                (_U_(0x1) << DEVCTRL_DETACH_Pos)         /**< (DEVCTRL) Detach Mask */\n#define DEVCTRL_RMWKUP_Pos            9                                              /**< (DEVCTRL) Remote Wake-Up Position */\n#define DEVCTRL_RMWKUP                (_U_(0x1) << DEVCTRL_RMWKUP_Pos)         /**< (DEVCTRL) Remote Wake-Up Mask */\n#define DEVCTRL_SPDCONF_Pos           10                                             /**< (DEVCTRL) Mode Configuration Position */\n#define DEVCTRL_SPDCONF               (_U_(0x3) << DEVCTRL_SPDCONF_Pos)        /**< (DEVCTRL) Mode Configuration Mask */\n#define   DEVCTRL_SPDCONF_NORMAL_Val  _U_(0x0)                                       /**< (DEVCTRL) The peripheral starts in Full-speed mode and performs a high-speed reset to switch to High-speed mode if the host is high-speed-capable.  */\n#define   DEVCTRL_SPDCONF_LOW_POWER_Val _U_(0x1)                                       /**< (DEVCTRL) For a better consumption, if high speed is not needed.  */\n#define   DEVCTRL_SPDCONF_HIGH_SPEED_Val _U_(0x2)                                       /**< (DEVCTRL) Forced high speed.  */\n#define   DEVCTRL_SPDCONF_FORCED_FS_Val _U_(0x3)                                       /**< (DEVCTRL) The peripheral remains in Full-speed mode whatever the host speed capability.  */\n#define DEVCTRL_SPDCONF_NORMAL        (DEVCTRL_SPDCONF_NORMAL_Val << DEVCTRL_SPDCONF_Pos)  /**< (DEVCTRL) The peripheral starts in Full-speed mode and performs a high-speed reset to switch to High-speed mode if the host is high-speed-capable. Position  */\n#define DEVCTRL_SPDCONF_LOW_POWER     (DEVCTRL_SPDCONF_LOW_POWER_Val << DEVCTRL_SPDCONF_Pos)  /**< (DEVCTRL) For a better consumption, if high speed is not needed. Position  */\n#define DEVCTRL_SPDCONF_HIGH_SPEED    (DEVCTRL_SPDCONF_HIGH_SPEED_Val << DEVCTRL_SPDCONF_Pos)  /**< (DEVCTRL) Forced high speed. Position  */\n#define DEVCTRL_SPDCONF_FORCED_FS     (DEVCTRL_SPDCONF_FORCED_FS_Val << DEVCTRL_SPDCONF_Pos)  /**< (DEVCTRL) The peripheral remains in Full-speed mode whatever the host speed capability. Position  */\n#define DEVCTRL_LS_Pos                12                                             /**< (DEVCTRL) Low-Speed Mode Force Position */\n#define DEVCTRL_LS                    (_U_(0x1) << DEVCTRL_LS_Pos)             /**< (DEVCTRL) Low-Speed Mode Force Mask */\n#define DEVCTRL_TSTJ_Pos              13                                             /**< (DEVCTRL) Test mode J Position */\n#define DEVCTRL_TSTJ                  (_U_(0x1) << DEVCTRL_TSTJ_Pos)           /**< (DEVCTRL) Test mode J Mask */\n#define DEVCTRL_TSTK_Pos              14                                             /**< (DEVCTRL) Test mode K Position */\n#define DEVCTRL_TSTK                  (_U_(0x1) << DEVCTRL_TSTK_Pos)           /**< (DEVCTRL) Test mode K Mask */\n#define DEVCTRL_TSTPCKT_Pos           15                                             /**< (DEVCTRL) Test packet mode Position */\n#define DEVCTRL_TSTPCKT               (_U_(0x1) << DEVCTRL_TSTPCKT_Pos)        /**< (DEVCTRL) Test packet mode Mask */\n#define DEVCTRL_OPMODE2_Pos           16                                             /**< (DEVCTRL) Specific Operational mode Position */\n#define DEVCTRL_OPMODE2               (_U_(0x1) << DEVCTRL_OPMODE2_Pos)        /**< (DEVCTRL) Specific Operational mode Mask */\n#define DEVCTRL_Msk                   _U_(0x1FFFF)                                   /**< (DEVCTRL) Register Mask  */\n\n#define DEVCTRL_OPMODE_Pos            16                                             /**< (DEVCTRL Position) Specific Operational mode */\n#define DEVCTRL_OPMODE                (_U_(0x1) << DEVCTRL_OPMODE_Pos)         /**< (DEVCTRL Mask) OPMODE */\n\n/* -------- DEVISR : (USBHS Offset: 0x04) (R/ 32) Device Global Interrupt Status Register -------- */\n\n#define DEVISR_OFFSET                 (0x04)                                        /**<  (DEVISR) Device Global Interrupt Status Register  Offset */\n\n#define DEVISR_SUSP_Pos               0                                              /**< (DEVISR) Suspend Interrupt Position */\n#define DEVISR_SUSP                   (_U_(0x1) << DEVISR_SUSP_Pos)            /**< (DEVISR) Suspend Interrupt Mask */\n#define DEVISR_MSOF_Pos               1                                              /**< (DEVISR) Micro Start of Frame Interrupt Position */\n#define DEVISR_MSOF                   (_U_(0x1) << DEVISR_MSOF_Pos)            /**< (DEVISR) Micro Start of Frame Interrupt Mask */\n#define DEVISR_SOF_Pos                2                                              /**< (DEVISR) Start of Frame Interrupt Position */\n#define DEVISR_SOF                    (_U_(0x1) << DEVISR_SOF_Pos)             /**< (DEVISR) Start of Frame Interrupt Mask */\n#define DEVISR_EORST_Pos              3                                              /**< (DEVISR) End of Reset Interrupt Position */\n#define DEVISR_EORST                  (_U_(0x1) << DEVISR_EORST_Pos)           /**< (DEVISR) End of Reset Interrupt Mask */\n#define DEVISR_WAKEUP_Pos             4                                              /**< (DEVISR) Wake-Up Interrupt Position */\n#define DEVISR_WAKEUP                 (_U_(0x1) << DEVISR_WAKEUP_Pos)          /**< (DEVISR) Wake-Up Interrupt Mask */\n#define DEVISR_EORSM_Pos              5                                              /**< (DEVISR) End of Resume Interrupt Position */\n#define DEVISR_EORSM                  (_U_(0x1) << DEVISR_EORSM_Pos)           /**< (DEVISR) End of Resume Interrupt Mask */\n#define DEVISR_UPRSM_Pos              6                                              /**< (DEVISR) Upstream Resume Interrupt Position */\n#define DEVISR_UPRSM                  (_U_(0x1) << DEVISR_UPRSM_Pos)           /**< (DEVISR) Upstream Resume Interrupt Mask */\n#define DEVISR_PEP_0_Pos              12                                             /**< (DEVISR) Endpoint 0 Interrupt Position */\n#define DEVISR_PEP_0                  (_U_(0x1) << DEVISR_PEP_0_Pos)           /**< (DEVISR) Endpoint 0 Interrupt Mask */\n#define DEVISR_PEP_1_Pos              13                                             /**< (DEVISR) Endpoint 1 Interrupt Position */\n#define DEVISR_PEP_1                  (_U_(0x1) << DEVISR_PEP_1_Pos)           /**< (DEVISR) Endpoint 1 Interrupt Mask */\n#define DEVISR_PEP_2_Pos              14                                             /**< (DEVISR) Endpoint 2 Interrupt Position */\n#define DEVISR_PEP_2                  (_U_(0x1) << DEVISR_PEP_2_Pos)           /**< (DEVISR) Endpoint 2 Interrupt Mask */\n#define DEVISR_PEP_3_Pos              15                                             /**< (DEVISR) Endpoint 3 Interrupt Position */\n#define DEVISR_PEP_3                  (_U_(0x1) << DEVISR_PEP_3_Pos)           /**< (DEVISR) Endpoint 3 Interrupt Mask */\n#define DEVISR_PEP_4_Pos              16                                             /**< (DEVISR) Endpoint 4 Interrupt Position */\n#define DEVISR_PEP_4                  (_U_(0x1) << DEVISR_PEP_4_Pos)           /**< (DEVISR) Endpoint 4 Interrupt Mask */\n#define DEVISR_PEP_5_Pos              17                                             /**< (DEVISR) Endpoint 5 Interrupt Position */\n#define DEVISR_PEP_5                  (_U_(0x1) << DEVISR_PEP_5_Pos)           /**< (DEVISR) Endpoint 5 Interrupt Mask */\n#define DEVISR_PEP_6_Pos              18                                             /**< (DEVISR) Endpoint 6 Interrupt Position */\n#define DEVISR_PEP_6                  (_U_(0x1) << DEVISR_PEP_6_Pos)           /**< (DEVISR) Endpoint 6 Interrupt Mask */\n#define DEVISR_PEP_7_Pos              19                                             /**< (DEVISR) Endpoint 7 Interrupt Position */\n#define DEVISR_PEP_7                  (_U_(0x1) << DEVISR_PEP_7_Pos)           /**< (DEVISR) Endpoint 7 Interrupt Mask */\n#define DEVISR_PEP_8_Pos              20                                             /**< (DEVISR) Endpoint 8 Interrupt Position */\n#define DEVISR_PEP_8                  (_U_(0x1) << DEVISR_PEP_8_Pos)           /**< (DEVISR) Endpoint 8 Interrupt Mask */\n#define DEVISR_PEP_9_Pos              21                                             /**< (DEVISR) Endpoint 9 Interrupt Position */\n#define DEVISR_PEP_9                  (_U_(0x1) << DEVISR_PEP_9_Pos)           /**< (DEVISR) Endpoint 9 Interrupt Mask */\n#define DEVISR_DMA_1_Pos              25                                             /**< (DEVISR) DMA Channel 1 Interrupt Position */\n#define DEVISR_DMA_1                  (_U_(0x1) << DEVISR_DMA_1_Pos)           /**< (DEVISR) DMA Channel 1 Interrupt Mask */\n#define DEVISR_DMA_2_Pos              26                                             /**< (DEVISR) DMA Channel 2 Interrupt Position */\n#define DEVISR_DMA_2                  (_U_(0x1) << DEVISR_DMA_2_Pos)           /**< (DEVISR) DMA Channel 2 Interrupt Mask */\n#define DEVISR_DMA_3_Pos              27                                             /**< (DEVISR) DMA Channel 3 Interrupt Position */\n#define DEVISR_DMA_3                  (_U_(0x1) << DEVISR_DMA_3_Pos)           /**< (DEVISR) DMA Channel 3 Interrupt Mask */\n#define DEVISR_DMA_4_Pos              28                                             /**< (DEVISR) DMA Channel 4 Interrupt Position */\n#define DEVISR_DMA_4                  (_U_(0x1) << DEVISR_DMA_4_Pos)           /**< (DEVISR) DMA Channel 4 Interrupt Mask */\n#define DEVISR_DMA_5_Pos              29                                             /**< (DEVISR) DMA Channel 5 Interrupt Position */\n#define DEVISR_DMA_5                  (_U_(0x1) << DEVISR_DMA_5_Pos)           /**< (DEVISR) DMA Channel 5 Interrupt Mask */\n#define DEVISR_DMA_6_Pos              30                                             /**< (DEVISR) DMA Channel 6 Interrupt Position */\n#define DEVISR_DMA_6                  (_U_(0x1) << DEVISR_DMA_6_Pos)           /**< (DEVISR) DMA Channel 6 Interrupt Mask */\n#define DEVISR_DMA_7_Pos              31                                             /**< (DEVISR) DMA Channel 7 Interrupt Position */\n#define DEVISR_DMA_7                  (_U_(0x1) << DEVISR_DMA_7_Pos)           /**< (DEVISR) DMA Channel 7 Interrupt Mask */\n#define DEVISR_Msk                    _U_(0xFE3FF07F)                                /**< (DEVISR) Register Mask  */\n\n#define DEVISR_PEP__Pos               12                                             /**< (DEVISR Position) Endpoint x Interrupt */\n#define DEVISR_PEP_                   (_U_(0x3FF) << DEVISR_PEP__Pos)          /**< (DEVISR Mask) PEP_ */\n#define DEVISR_DMA__Pos               25                                             /**< (DEVISR Position) DMA Channel 7 Interrupt */\n#define DEVISR_DMA_                   (_U_(0x7F) << DEVISR_DMA__Pos)           /**< (DEVISR Mask) DMA_ */\n\n/* -------- DEVICR : (USBHS Offset: 0x08) (/W 32) Device Global Interrupt Clear Register -------- */\n\n#define DEVICR_OFFSET                 (0x08)                                        /**<  (DEVICR) Device Global Interrupt Clear Register  Offset */\n\n#define DEVICR_SUSPC_Pos              0                                              /**< (DEVICR) Suspend Interrupt Clear Position */\n#define DEVICR_SUSPC                  (_U_(0x1) << DEVICR_SUSPC_Pos)           /**< (DEVICR) Suspend Interrupt Clear Mask */\n#define DEVICR_MSOFC_Pos              1                                              /**< (DEVICR) Micro Start of Frame Interrupt Clear Position */\n#define DEVICR_MSOFC                  (_U_(0x1) << DEVICR_MSOFC_Pos)           /**< (DEVICR) Micro Start of Frame Interrupt Clear Mask */\n#define DEVICR_SOFC_Pos               2                                              /**< (DEVICR) Start of Frame Interrupt Clear Position */\n#define DEVICR_SOFC                   (_U_(0x1) << DEVICR_SOFC_Pos)            /**< (DEVICR) Start of Frame Interrupt Clear Mask */\n#define DEVICR_EORSTC_Pos             3                                              /**< (DEVICR) End of Reset Interrupt Clear Position */\n#define DEVICR_EORSTC                 (_U_(0x1) << DEVICR_EORSTC_Pos)          /**< (DEVICR) End of Reset Interrupt Clear Mask */\n#define DEVICR_WAKEUPC_Pos            4                                              /**< (DEVICR) Wake-Up Interrupt Clear Position */\n#define DEVICR_WAKEUPC                (_U_(0x1) << DEVICR_WAKEUPC_Pos)         /**< (DEVICR) Wake-Up Interrupt Clear Mask */\n#define DEVICR_EORSMC_Pos             5                                              /**< (DEVICR) End of Resume Interrupt Clear Position */\n#define DEVICR_EORSMC                 (_U_(0x1) << DEVICR_EORSMC_Pos)          /**< (DEVICR) End of Resume Interrupt Clear Mask */\n#define DEVICR_UPRSMC_Pos             6                                              /**< (DEVICR) Upstream Resume Interrupt Clear Position */\n#define DEVICR_UPRSMC                 (_U_(0x1) << DEVICR_UPRSMC_Pos)          /**< (DEVICR) Upstream Resume Interrupt Clear Mask */\n#define DEVICR_Msk                    _U_(0x7F)                                      /**< (DEVICR) Register Mask  */\n\n\n/* -------- DEVIFR : (USBHS Offset: 0x0c) (/W 32) Device Global Interrupt Set Register -------- */\n\n#define DEVIFR_OFFSET                 (0x0C)                                        /**<  (DEVIFR) Device Global Interrupt Set Register  Offset */\n\n#define DEVIFR_SUSPS_Pos              0                                              /**< (DEVIFR) Suspend Interrupt Set Position */\n#define DEVIFR_SUSPS                  (_U_(0x1) << DEVIFR_SUSPS_Pos)           /**< (DEVIFR) Suspend Interrupt Set Mask */\n#define DEVIFR_MSOFS_Pos              1                                              /**< (DEVIFR) Micro Start of Frame Interrupt Set Position */\n#define DEVIFR_MSOFS                  (_U_(0x1) << DEVIFR_MSOFS_Pos)           /**< (DEVIFR) Micro Start of Frame Interrupt Set Mask */\n#define DEVIFR_SOFS_Pos               2                                              /**< (DEVIFR) Start of Frame Interrupt Set Position */\n#define DEVIFR_SOFS                   (_U_(0x1) << DEVIFR_SOFS_Pos)            /**< (DEVIFR) Start of Frame Interrupt Set Mask */\n#define DEVIFR_EORSTS_Pos             3                                              /**< (DEVIFR) End of Reset Interrupt Set Position */\n#define DEVIFR_EORSTS                 (_U_(0x1) << DEVIFR_EORSTS_Pos)          /**< (DEVIFR) End of Reset Interrupt Set Mask */\n#define DEVIFR_WAKEUPS_Pos            4                                              /**< (DEVIFR) Wake-Up Interrupt Set Position */\n#define DEVIFR_WAKEUPS                (_U_(0x1) << DEVIFR_WAKEUPS_Pos)         /**< (DEVIFR) Wake-Up Interrupt Set Mask */\n#define DEVIFR_EORSMS_Pos             5                                              /**< (DEVIFR) End of Resume Interrupt Set Position */\n#define DEVIFR_EORSMS                 (_U_(0x1) << DEVIFR_EORSMS_Pos)          /**< (DEVIFR) End of Resume Interrupt Set Mask */\n#define DEVIFR_UPRSMS_Pos             6                                              /**< (DEVIFR) Upstream Resume Interrupt Set Position */\n#define DEVIFR_UPRSMS                 (_U_(0x1) << DEVIFR_UPRSMS_Pos)          /**< (DEVIFR) Upstream Resume Interrupt Set Mask */\n#define DEVIFR_DMA_1_Pos              25                                             /**< (DEVIFR) DMA Channel 1 Interrupt Set Position */\n#define DEVIFR_DMA_1                  (_U_(0x1) << DEVIFR_DMA_1_Pos)           /**< (DEVIFR) DMA Channel 1 Interrupt Set Mask */\n#define DEVIFR_DMA_2_Pos              26                                             /**< (DEVIFR) DMA Channel 2 Interrupt Set Position */\n#define DEVIFR_DMA_2                  (_U_(0x1) << DEVIFR_DMA_2_Pos)           /**< (DEVIFR) DMA Channel 2 Interrupt Set Mask */\n#define DEVIFR_DMA_3_Pos              27                                             /**< (DEVIFR) DMA Channel 3 Interrupt Set Position */\n#define DEVIFR_DMA_3                  (_U_(0x1) << DEVIFR_DMA_3_Pos)           /**< (DEVIFR) DMA Channel 3 Interrupt Set Mask */\n#define DEVIFR_DMA_4_Pos              28                                             /**< (DEVIFR) DMA Channel 4 Interrupt Set Position */\n#define DEVIFR_DMA_4                  (_U_(0x1) << DEVIFR_DMA_4_Pos)           /**< (DEVIFR) DMA Channel 4 Interrupt Set Mask */\n#define DEVIFR_DMA_5_Pos              29                                             /**< (DEVIFR) DMA Channel 5 Interrupt Set Position */\n#define DEVIFR_DMA_5                  (_U_(0x1) << DEVIFR_DMA_5_Pos)           /**< (DEVIFR) DMA Channel 5 Interrupt Set Mask */\n#define DEVIFR_DMA_6_Pos              30                                             /**< (DEVIFR) DMA Channel 6 Interrupt Set Position */\n#define DEVIFR_DMA_6                  (_U_(0x1) << DEVIFR_DMA_6_Pos)           /**< (DEVIFR) DMA Channel 6 Interrupt Set Mask */\n#define DEVIFR_DMA_7_Pos              31                                             /**< (DEVIFR) DMA Channel 7 Interrupt Set Position */\n#define DEVIFR_DMA_7                  (_U_(0x1) << DEVIFR_DMA_7_Pos)           /**< (DEVIFR) DMA Channel 7 Interrupt Set Mask */\n#define DEVIFR_Msk                    _U_(0xFE00007F)                                /**< (DEVIFR) Register Mask  */\n\n#define DEVIFR_DMA__Pos               25                                             /**< (DEVIFR Position) DMA Channel 7 Interrupt Set */\n#define DEVIFR_DMA_                   (_U_(0x7F) << DEVIFR_DMA__Pos)           /**< (DEVIFR Mask) DMA_ */\n\n/* -------- DEVIMR : (USBHS Offset: 0x10) (R/ 32) Device Global Interrupt Mask Register -------- */\n\n#define DEVIMR_OFFSET                 (0x10)                                        /**<  (DEVIMR) Device Global Interrupt Mask Register  Offset */\n\n#define DEVIMR_SUSPE_Pos              0                                              /**< (DEVIMR) Suspend Interrupt Mask Position */\n#define DEVIMR_SUSPE                  (_U_(0x1) << DEVIMR_SUSPE_Pos)           /**< (DEVIMR) Suspend Interrupt Mask Mask */\n#define DEVIMR_MSOFE_Pos              1                                              /**< (DEVIMR) Micro Start of Frame Interrupt Mask Position */\n#define DEVIMR_MSOFE                  (_U_(0x1) << DEVIMR_MSOFE_Pos)           /**< (DEVIMR) Micro Start of Frame Interrupt Mask Mask */\n#define DEVIMR_SOFE_Pos               2                                              /**< (DEVIMR) Start of Frame Interrupt Mask Position */\n#define DEVIMR_SOFE                   (_U_(0x1) << DEVIMR_SOFE_Pos)            /**< (DEVIMR) Start of Frame Interrupt Mask Mask */\n#define DEVIMR_EORSTE_Pos             3                                              /**< (DEVIMR) End of Reset Interrupt Mask Position */\n#define DEVIMR_EORSTE                 (_U_(0x1) << DEVIMR_EORSTE_Pos)          /**< (DEVIMR) End of Reset Interrupt Mask Mask */\n#define DEVIMR_WAKEUPE_Pos            4                                              /**< (DEVIMR) Wake-Up Interrupt Mask Position */\n#define DEVIMR_WAKEUPE                (_U_(0x1) << DEVIMR_WAKEUPE_Pos)         /**< (DEVIMR) Wake-Up Interrupt Mask Mask */\n#define DEVIMR_EORSME_Pos             5                                              /**< (DEVIMR) End of Resume Interrupt Mask Position */\n#define DEVIMR_EORSME                 (_U_(0x1) << DEVIMR_EORSME_Pos)          /**< (DEVIMR) End of Resume Interrupt Mask Mask */\n#define DEVIMR_UPRSME_Pos             6                                              /**< (DEVIMR) Upstream Resume Interrupt Mask Position */\n#define DEVIMR_UPRSME                 (_U_(0x1) << DEVIMR_UPRSME_Pos)          /**< (DEVIMR) Upstream Resume Interrupt Mask Mask */\n#define DEVIMR_PEP_0_Pos              12                                             /**< (DEVIMR) Endpoint 0 Interrupt Mask Position */\n#define DEVIMR_PEP_0                  (_U_(0x1) << DEVIMR_PEP_0_Pos)           /**< (DEVIMR) Endpoint 0 Interrupt Mask Mask */\n#define DEVIMR_PEP_1_Pos              13                                             /**< (DEVIMR) Endpoint 1 Interrupt Mask Position */\n#define DEVIMR_PEP_1                  (_U_(0x1) << DEVIMR_PEP_1_Pos)           /**< (DEVIMR) Endpoint 1 Interrupt Mask Mask */\n#define DEVIMR_PEP_2_Pos              14                                             /**< (DEVIMR) Endpoint 2 Interrupt Mask Position */\n#define DEVIMR_PEP_2                  (_U_(0x1) << DEVIMR_PEP_2_Pos)           /**< (DEVIMR) Endpoint 2 Interrupt Mask Mask */\n#define DEVIMR_PEP_3_Pos              15                                             /**< (DEVIMR) Endpoint 3 Interrupt Mask Position */\n#define DEVIMR_PEP_3                  (_U_(0x1) << DEVIMR_PEP_3_Pos)           /**< (DEVIMR) Endpoint 3 Interrupt Mask Mask */\n#define DEVIMR_PEP_4_Pos              16                                             /**< (DEVIMR) Endpoint 4 Interrupt Mask Position */\n#define DEVIMR_PEP_4                  (_U_(0x1) << DEVIMR_PEP_4_Pos)           /**< (DEVIMR) Endpoint 4 Interrupt Mask Mask */\n#define DEVIMR_PEP_5_Pos              17                                             /**< (DEVIMR) Endpoint 5 Interrupt Mask Position */\n#define DEVIMR_PEP_5                  (_U_(0x1) << DEVIMR_PEP_5_Pos)           /**< (DEVIMR) Endpoint 5 Interrupt Mask Mask */\n#define DEVIMR_PEP_6_Pos              18                                             /**< (DEVIMR) Endpoint 6 Interrupt Mask Position */\n#define DEVIMR_PEP_6                  (_U_(0x1) << DEVIMR_PEP_6_Pos)           /**< (DEVIMR) Endpoint 6 Interrupt Mask Mask */\n#define DEVIMR_PEP_7_Pos              19                                             /**< (DEVIMR) Endpoint 7 Interrupt Mask Position */\n#define DEVIMR_PEP_7                  (_U_(0x1) << DEVIMR_PEP_7_Pos)           /**< (DEVIMR) Endpoint 7 Interrupt Mask Mask */\n#define DEVIMR_PEP_8_Pos              20                                             /**< (DEVIMR) Endpoint 8 Interrupt Mask Position */\n#define DEVIMR_PEP_8                  (_U_(0x1) << DEVIMR_PEP_8_Pos)           /**< (DEVIMR) Endpoint 8 Interrupt Mask Mask */\n#define DEVIMR_PEP_9_Pos              21                                             /**< (DEVIMR) Endpoint 9 Interrupt Mask Position */\n#define DEVIMR_PEP_9                  (_U_(0x1) << DEVIMR_PEP_9_Pos)           /**< (DEVIMR) Endpoint 9 Interrupt Mask Mask */\n#define DEVIMR_DMA_1_Pos              25                                             /**< (DEVIMR) DMA Channel 1 Interrupt Mask Position */\n#define DEVIMR_DMA_1                  (_U_(0x1) << DEVIMR_DMA_1_Pos)           /**< (DEVIMR) DMA Channel 1 Interrupt Mask Mask */\n#define DEVIMR_DMA_2_Pos              26                                             /**< (DEVIMR) DMA Channel 2 Interrupt Mask Position */\n#define DEVIMR_DMA_2                  (_U_(0x1) << DEVIMR_DMA_2_Pos)           /**< (DEVIMR) DMA Channel 2 Interrupt Mask Mask */\n#define DEVIMR_DMA_3_Pos              27                                             /**< (DEVIMR) DMA Channel 3 Interrupt Mask Position */\n#define DEVIMR_DMA_3                  (_U_(0x1) << DEVIMR_DMA_3_Pos)           /**< (DEVIMR) DMA Channel 3 Interrupt Mask Mask */\n#define DEVIMR_DMA_4_Pos              28                                             /**< (DEVIMR) DMA Channel 4 Interrupt Mask Position */\n#define DEVIMR_DMA_4                  (_U_(0x1) << DEVIMR_DMA_4_Pos)           /**< (DEVIMR) DMA Channel 4 Interrupt Mask Mask */\n#define DEVIMR_DMA_5_Pos              29                                             /**< (DEVIMR) DMA Channel 5 Interrupt Mask Position */\n#define DEVIMR_DMA_5                  (_U_(0x1) << DEVIMR_DMA_5_Pos)           /**< (DEVIMR) DMA Channel 5 Interrupt Mask Mask */\n#define DEVIMR_DMA_6_Pos              30                                             /**< (DEVIMR) DMA Channel 6 Interrupt Mask Position */\n#define DEVIMR_DMA_6                  (_U_(0x1) << DEVIMR_DMA_6_Pos)           /**< (DEVIMR) DMA Channel 6 Interrupt Mask Mask */\n#define DEVIMR_DMA_7_Pos              31                                             /**< (DEVIMR) DMA Channel 7 Interrupt Mask Position */\n#define DEVIMR_DMA_7                  (_U_(0x1) << DEVIMR_DMA_7_Pos)           /**< (DEVIMR) DMA Channel 7 Interrupt Mask Mask */\n#define DEVIMR_Msk                    _U_(0xFE3FF07F)                                /**< (DEVIMR) Register Mask  */\n\n#define DEVIMR_PEP__Pos               12                                             /**< (DEVIMR Position) Endpoint x Interrupt Mask */\n#define DEVIMR_PEP_                   (_U_(0x3FF) << DEVIMR_PEP__Pos)          /**< (DEVIMR Mask) PEP_ */\n#define DEVIMR_DMA__Pos               25                                             /**< (DEVIMR Position) DMA Channel 7 Interrupt Mask */\n#define DEVIMR_DMA_                   (_U_(0x7F) << DEVIMR_DMA__Pos)           /**< (DEVIMR Mask) DMA_ */\n\n/* -------- DEVIDR : (USBHS Offset: 0x14) (/W 32) Device Global Interrupt Disable Register -------- */\n\n#define DEVIDR_OFFSET                 (0x14)                                        /**<  (DEVIDR) Device Global Interrupt Disable Register  Offset */\n\n#define DEVIDR_SUSPEC_Pos             0                                              /**< (DEVIDR) Suspend Interrupt Disable Position */\n#define DEVIDR_SUSPEC                 (_U_(0x1) << DEVIDR_SUSPEC_Pos)          /**< (DEVIDR) Suspend Interrupt Disable Mask */\n#define DEVIDR_MSOFEC_Pos             1                                              /**< (DEVIDR) Micro Start of Frame Interrupt Disable Position */\n#define DEVIDR_MSOFEC                 (_U_(0x1) << DEVIDR_MSOFEC_Pos)          /**< (DEVIDR) Micro Start of Frame Interrupt Disable Mask */\n#define DEVIDR_SOFEC_Pos              2                                              /**< (DEVIDR) Start of Frame Interrupt Disable Position */\n#define DEVIDR_SOFEC                  (_U_(0x1) << DEVIDR_SOFEC_Pos)           /**< (DEVIDR) Start of Frame Interrupt Disable Mask */\n#define DEVIDR_EORSTEC_Pos            3                                              /**< (DEVIDR) End of Reset Interrupt Disable Position */\n#define DEVIDR_EORSTEC                (_U_(0x1) << DEVIDR_EORSTEC_Pos)         /**< (DEVIDR) End of Reset Interrupt Disable Mask */\n#define DEVIDR_WAKEUPEC_Pos           4                                              /**< (DEVIDR) Wake-Up Interrupt Disable Position */\n#define DEVIDR_WAKEUPEC               (_U_(0x1) << DEVIDR_WAKEUPEC_Pos)        /**< (DEVIDR) Wake-Up Interrupt Disable Mask */\n#define DEVIDR_EORSMEC_Pos            5                                              /**< (DEVIDR) End of Resume Interrupt Disable Position */\n#define DEVIDR_EORSMEC                (_U_(0x1) << DEVIDR_EORSMEC_Pos)         /**< (DEVIDR) End of Resume Interrupt Disable Mask */\n#define DEVIDR_UPRSMEC_Pos            6                                              /**< (DEVIDR) Upstream Resume Interrupt Disable Position */\n#define DEVIDR_UPRSMEC                (_U_(0x1) << DEVIDR_UPRSMEC_Pos)         /**< (DEVIDR) Upstream Resume Interrupt Disable Mask */\n#define DEVIDR_PEP_0_Pos              12                                             /**< (DEVIDR) Endpoint 0 Interrupt Disable Position */\n#define DEVIDR_PEP_0                  (_U_(0x1) << DEVIDR_PEP_0_Pos)           /**< (DEVIDR) Endpoint 0 Interrupt Disable Mask */\n#define DEVIDR_PEP_1_Pos              13                                             /**< (DEVIDR) Endpoint 1 Interrupt Disable Position */\n#define DEVIDR_PEP_1                  (_U_(0x1) << DEVIDR_PEP_1_Pos)           /**< (DEVIDR) Endpoint 1 Interrupt Disable Mask */\n#define DEVIDR_PEP_2_Pos              14                                             /**< (DEVIDR) Endpoint 2 Interrupt Disable Position */\n#define DEVIDR_PEP_2                  (_U_(0x1) << DEVIDR_PEP_2_Pos)           /**< (DEVIDR) Endpoint 2 Interrupt Disable Mask */\n#define DEVIDR_PEP_3_Pos              15                                             /**< (DEVIDR) Endpoint 3 Interrupt Disable Position */\n#define DEVIDR_PEP_3                  (_U_(0x1) << DEVIDR_PEP_3_Pos)           /**< (DEVIDR) Endpoint 3 Interrupt Disable Mask */\n#define DEVIDR_PEP_4_Pos              16                                             /**< (DEVIDR) Endpoint 4 Interrupt Disable Position */\n#define DEVIDR_PEP_4                  (_U_(0x1) << DEVIDR_PEP_4_Pos)           /**< (DEVIDR) Endpoint 4 Interrupt Disable Mask */\n#define DEVIDR_PEP_5_Pos              17                                             /**< (DEVIDR) Endpoint 5 Interrupt Disable Position */\n#define DEVIDR_PEP_5                  (_U_(0x1) << DEVIDR_PEP_5_Pos)           /**< (DEVIDR) Endpoint 5 Interrupt Disable Mask */\n#define DEVIDR_PEP_6_Pos              18                                             /**< (DEVIDR) Endpoint 6 Interrupt Disable Position */\n#define DEVIDR_PEP_6                  (_U_(0x1) << DEVIDR_PEP_6_Pos)           /**< (DEVIDR) Endpoint 6 Interrupt Disable Mask */\n#define DEVIDR_PEP_7_Pos              19                                             /**< (DEVIDR) Endpoint 7 Interrupt Disable Position */\n#define DEVIDR_PEP_7                  (_U_(0x1) << DEVIDR_PEP_7_Pos)           /**< (DEVIDR) Endpoint 7 Interrupt Disable Mask */\n#define DEVIDR_PEP_8_Pos              20                                             /**< (DEVIDR) Endpoint 8 Interrupt Disable Position */\n#define DEVIDR_PEP_8                  (_U_(0x1) << DEVIDR_PEP_8_Pos)           /**< (DEVIDR) Endpoint 8 Interrupt Disable Mask */\n#define DEVIDR_PEP_9_Pos              21                                             /**< (DEVIDR) Endpoint 9 Interrupt Disable Position */\n#define DEVIDR_PEP_9                  (_U_(0x1) << DEVIDR_PEP_9_Pos)           /**< (DEVIDR) Endpoint 9 Interrupt Disable Mask */\n#define DEVIDR_DMA_1_Pos              25                                             /**< (DEVIDR) DMA Channel 1 Interrupt Disable Position */\n#define DEVIDR_DMA_1                  (_U_(0x1) << DEVIDR_DMA_1_Pos)           /**< (DEVIDR) DMA Channel 1 Interrupt Disable Mask */\n#define DEVIDR_DMA_2_Pos              26                                             /**< (DEVIDR) DMA Channel 2 Interrupt Disable Position */\n#define DEVIDR_DMA_2                  (_U_(0x1) << DEVIDR_DMA_2_Pos)           /**< (DEVIDR) DMA Channel 2 Interrupt Disable Mask */\n#define DEVIDR_DMA_3_Pos              27                                             /**< (DEVIDR) DMA Channel 3 Interrupt Disable Position */\n#define DEVIDR_DMA_3                  (_U_(0x1) << DEVIDR_DMA_3_Pos)           /**< (DEVIDR) DMA Channel 3 Interrupt Disable Mask */\n#define DEVIDR_DMA_4_Pos              28                                             /**< (DEVIDR) DMA Channel 4 Interrupt Disable Position */\n#define DEVIDR_DMA_4                  (_U_(0x1) << DEVIDR_DMA_4_Pos)           /**< (DEVIDR) DMA Channel 4 Interrupt Disable Mask */\n#define DEVIDR_DMA_5_Pos              29                                             /**< (DEVIDR) DMA Channel 5 Interrupt Disable Position */\n#define DEVIDR_DMA_5                  (_U_(0x1) << DEVIDR_DMA_5_Pos)           /**< (DEVIDR) DMA Channel 5 Interrupt Disable Mask */\n#define DEVIDR_DMA_6_Pos              30                                             /**< (DEVIDR) DMA Channel 6 Interrupt Disable Position */\n#define DEVIDR_DMA_6                  (_U_(0x1) << DEVIDR_DMA_6_Pos)           /**< (DEVIDR) DMA Channel 6 Interrupt Disable Mask */\n#define DEVIDR_DMA_7_Pos              31                                             /**< (DEVIDR) DMA Channel 7 Interrupt Disable Position */\n#define DEVIDR_DMA_7                  (_U_(0x1) << DEVIDR_DMA_7_Pos)           /**< (DEVIDR) DMA Channel 7 Interrupt Disable Mask */\n#define DEVIDR_Msk                    _U_(0xFE3FF07F)                                /**< (DEVIDR) Register Mask  */\n\n#define DEVIDR_PEP__Pos               12                                             /**< (DEVIDR Position) Endpoint x Interrupt Disable */\n#define DEVIDR_PEP_                   (_U_(0x3FF) << DEVIDR_PEP__Pos)          /**< (DEVIDR Mask) PEP_ */\n#define DEVIDR_DMA__Pos               25                                             /**< (DEVIDR Position) DMA Channel 7 Interrupt Disable */\n#define DEVIDR_DMA_                   (_U_(0x7F) << DEVIDR_DMA__Pos)           /**< (DEVIDR Mask) DMA_ */\n\n/* -------- DEVIER : (USBHS Offset: 0x18) (/W 32) Device Global Interrupt Enable Register -------- */\n\n#define DEVIER_OFFSET                 (0x18)                                        /**<  (DEVIER) Device Global Interrupt Enable Register  Offset */\n\n#define DEVIER_SUSPES_Pos             0                                              /**< (DEVIER) Suspend Interrupt Enable Position */\n#define DEVIER_SUSPES                 (_U_(0x1) << DEVIER_SUSPES_Pos)          /**< (DEVIER) Suspend Interrupt Enable Mask */\n#define DEVIER_MSOFES_Pos             1                                              /**< (DEVIER) Micro Start of Frame Interrupt Enable Position */\n#define DEVIER_MSOFES                 (_U_(0x1) << DEVIER_MSOFES_Pos)          /**< (DEVIER) Micro Start of Frame Interrupt Enable Mask */\n#define DEVIER_SOFES_Pos              2                                              /**< (DEVIER) Start of Frame Interrupt Enable Position */\n#define DEVIER_SOFES                  (_U_(0x1) << DEVIER_SOFES_Pos)           /**< (DEVIER) Start of Frame Interrupt Enable Mask */\n#define DEVIER_EORSTES_Pos            3                                              /**< (DEVIER) End of Reset Interrupt Enable Position */\n#define DEVIER_EORSTES                (_U_(0x1) << DEVIER_EORSTES_Pos)         /**< (DEVIER) End of Reset Interrupt Enable Mask */\n#define DEVIER_WAKEUPES_Pos           4                                              /**< (DEVIER) Wake-Up Interrupt Enable Position */\n#define DEVIER_WAKEUPES               (_U_(0x1) << DEVIER_WAKEUPES_Pos)        /**< (DEVIER) Wake-Up Interrupt Enable Mask */\n#define DEVIER_EORSMES_Pos            5                                              /**< (DEVIER) End of Resume Interrupt Enable Position */\n#define DEVIER_EORSMES                (_U_(0x1) << DEVIER_EORSMES_Pos)         /**< (DEVIER) End of Resume Interrupt Enable Mask */\n#define DEVIER_UPRSMES_Pos            6                                              /**< (DEVIER) Upstream Resume Interrupt Enable Position */\n#define DEVIER_UPRSMES                (_U_(0x1) << DEVIER_UPRSMES_Pos)         /**< (DEVIER) Upstream Resume Interrupt Enable Mask */\n#define DEVIER_PEP_0_Pos              12                                             /**< (DEVIER) Endpoint 0 Interrupt Enable Position */\n#define DEVIER_PEP_0                  (_U_(0x1) << DEVIER_PEP_0_Pos)           /**< (DEVIER) Endpoint 0 Interrupt Enable Mask */\n#define DEVIER_PEP_1_Pos              13                                             /**< (DEVIER) Endpoint 1 Interrupt Enable Position */\n#define DEVIER_PEP_1                  (_U_(0x1) << DEVIER_PEP_1_Pos)           /**< (DEVIER) Endpoint 1 Interrupt Enable Mask */\n#define DEVIER_PEP_2_Pos              14                                             /**< (DEVIER) Endpoint 2 Interrupt Enable Position */\n#define DEVIER_PEP_2                  (_U_(0x1) << DEVIER_PEP_2_Pos)           /**< (DEVIER) Endpoint 2 Interrupt Enable Mask */\n#define DEVIER_PEP_3_Pos              15                                             /**< (DEVIER) Endpoint 3 Interrupt Enable Position */\n#define DEVIER_PEP_3                  (_U_(0x1) << DEVIER_PEP_3_Pos)           /**< (DEVIER) Endpoint 3 Interrupt Enable Mask */\n#define DEVIER_PEP_4_Pos              16                                             /**< (DEVIER) Endpoint 4 Interrupt Enable Position */\n#define DEVIER_PEP_4                  (_U_(0x1) << DEVIER_PEP_4_Pos)           /**< (DEVIER) Endpoint 4 Interrupt Enable Mask */\n#define DEVIER_PEP_5_Pos              17                                             /**< (DEVIER) Endpoint 5 Interrupt Enable Position */\n#define DEVIER_PEP_5                  (_U_(0x1) << DEVIER_PEP_5_Pos)           /**< (DEVIER) Endpoint 5 Interrupt Enable Mask */\n#define DEVIER_PEP_6_Pos              18                                             /**< (DEVIER) Endpoint 6 Interrupt Enable Position */\n#define DEVIER_PEP_6                  (_U_(0x1) << DEVIER_PEP_6_Pos)           /**< (DEVIER) Endpoint 6 Interrupt Enable Mask */\n#define DEVIER_PEP_7_Pos              19                                             /**< (DEVIER) Endpoint 7 Interrupt Enable Position */\n#define DEVIER_PEP_7                  (_U_(0x1) << DEVIER_PEP_7_Pos)           /**< (DEVIER) Endpoint 7 Interrupt Enable Mask */\n#define DEVIER_PEP_8_Pos              20                                             /**< (DEVIER) Endpoint 8 Interrupt Enable Position */\n#define DEVIER_PEP_8                  (_U_(0x1) << DEVIER_PEP_8_Pos)           /**< (DEVIER) Endpoint 8 Interrupt Enable Mask */\n#define DEVIER_PEP_9_Pos              21                                             /**< (DEVIER) Endpoint 9 Interrupt Enable Position */\n#define DEVIER_PEP_9                  (_U_(0x1) << DEVIER_PEP_9_Pos)           /**< (DEVIER) Endpoint 9 Interrupt Enable Mask */\n#define DEVIER_DMA_1_Pos              25                                             /**< (DEVIER) DMA Channel 1 Interrupt Enable Position */\n#define DEVIER_DMA_1                  (_U_(0x1) << DEVIER_DMA_1_Pos)           /**< (DEVIER) DMA Channel 1 Interrupt Enable Mask */\n#define DEVIER_DMA_2_Pos              26                                             /**< (DEVIER) DMA Channel 2 Interrupt Enable Position */\n#define DEVIER_DMA_2                  (_U_(0x1) << DEVIER_DMA_2_Pos)           /**< (DEVIER) DMA Channel 2 Interrupt Enable Mask */\n#define DEVIER_DMA_3_Pos              27                                             /**< (DEVIER) DMA Channel 3 Interrupt Enable Position */\n#define DEVIER_DMA_3                  (_U_(0x1) << DEVIER_DMA_3_Pos)           /**< (DEVIER) DMA Channel 3 Interrupt Enable Mask */\n#define DEVIER_DMA_4_Pos              28                                             /**< (DEVIER) DMA Channel 4 Interrupt Enable Position */\n#define DEVIER_DMA_4                  (_U_(0x1) << DEVIER_DMA_4_Pos)           /**< (DEVIER) DMA Channel 4 Interrupt Enable Mask */\n#define DEVIER_DMA_5_Pos              29                                             /**< (DEVIER) DMA Channel 5 Interrupt Enable Position */\n#define DEVIER_DMA_5                  (_U_(0x1) << DEVIER_DMA_5_Pos)           /**< (DEVIER) DMA Channel 5 Interrupt Enable Mask */\n#define DEVIER_DMA_6_Pos              30                                             /**< (DEVIER) DMA Channel 6 Interrupt Enable Position */\n#define DEVIER_DMA_6                  (_U_(0x1) << DEVIER_DMA_6_Pos)           /**< (DEVIER) DMA Channel 6 Interrupt Enable Mask */\n#define DEVIER_DMA_7_Pos              31                                             /**< (DEVIER) DMA Channel 7 Interrupt Enable Position */\n#define DEVIER_DMA_7                  (_U_(0x1) << DEVIER_DMA_7_Pos)           /**< (DEVIER) DMA Channel 7 Interrupt Enable Mask */\n#define DEVIER_Msk                    _U_(0xFE3FF07F)                                /**< (DEVIER) Register Mask  */\n\n#define DEVIER_PEP__Pos               12                                             /**< (DEVIER Position) Endpoint x Interrupt Enable */\n#define DEVIER_PEP_                   (_U_(0x3FF) << DEVIER_PEP__Pos)          /**< (DEVIER Mask) PEP_ */\n#define DEVIER_DMA__Pos               25                                             /**< (DEVIER Position) DMA Channel 7 Interrupt Enable */\n#define DEVIER_DMA_                   (_U_(0x7F) << DEVIER_DMA__Pos)           /**< (DEVIER Mask) DMA_ */\n\n/* -------- DEVEPT : (USBHS Offset: 0x1c) (R/W 32) Device Endpoint Register -------- */\n\n#define DEVEPT_OFFSET                 (0x1C)                                        /**<  (DEVEPT) Device Endpoint Register  Offset */\n\n#define DEVEPT_EPEN0_Pos              0                                              /**< (DEVEPT) Endpoint 0 Enable Position */\n#define DEVEPT_EPEN0                  (_U_(0x1) << DEVEPT_EPEN0_Pos)           /**< (DEVEPT) Endpoint 0 Enable Mask */\n#define DEVEPT_EPEN1_Pos              1                                              /**< (DEVEPT) Endpoint 1 Enable Position */\n#define DEVEPT_EPEN1                  (_U_(0x1) << DEVEPT_EPEN1_Pos)           /**< (DEVEPT) Endpoint 1 Enable Mask */\n#define DEVEPT_EPEN2_Pos              2                                              /**< (DEVEPT) Endpoint 2 Enable Position */\n#define DEVEPT_EPEN2                  (_U_(0x1) << DEVEPT_EPEN2_Pos)           /**< (DEVEPT) Endpoint 2 Enable Mask */\n#define DEVEPT_EPEN3_Pos              3                                              /**< (DEVEPT) Endpoint 3 Enable Position */\n#define DEVEPT_EPEN3                  (_U_(0x1) << DEVEPT_EPEN3_Pos)           /**< (DEVEPT) Endpoint 3 Enable Mask */\n#define DEVEPT_EPEN4_Pos              4                                              /**< (DEVEPT) Endpoint 4 Enable Position */\n#define DEVEPT_EPEN4                  (_U_(0x1) << DEVEPT_EPEN4_Pos)           /**< (DEVEPT) Endpoint 4 Enable Mask */\n#define DEVEPT_EPEN5_Pos              5                                              /**< (DEVEPT) Endpoint 5 Enable Position */\n#define DEVEPT_EPEN5                  (_U_(0x1) << DEVEPT_EPEN5_Pos)           /**< (DEVEPT) Endpoint 5 Enable Mask */\n#define DEVEPT_EPEN6_Pos              6                                              /**< (DEVEPT) Endpoint 6 Enable Position */\n#define DEVEPT_EPEN6                  (_U_(0x1) << DEVEPT_EPEN6_Pos)           /**< (DEVEPT) Endpoint 6 Enable Mask */\n#define DEVEPT_EPEN7_Pos              7                                              /**< (DEVEPT) Endpoint 7 Enable Position */\n#define DEVEPT_EPEN7                  (_U_(0x1) << DEVEPT_EPEN7_Pos)           /**< (DEVEPT) Endpoint 7 Enable Mask */\n#define DEVEPT_EPEN8_Pos              8                                              /**< (DEVEPT) Endpoint 8 Enable Position */\n#define DEVEPT_EPEN8                  (_U_(0x1) << DEVEPT_EPEN8_Pos)           /**< (DEVEPT) Endpoint 8 Enable Mask */\n#define DEVEPT_EPEN9_Pos              9                                              /**< (DEVEPT) Endpoint 9 Enable Position */\n#define DEVEPT_EPEN9                  (_U_(0x1) << DEVEPT_EPEN9_Pos)           /**< (DEVEPT) Endpoint 9 Enable Mask */\n#define DEVEPT_EPRST0_Pos             16                                             /**< (DEVEPT) Endpoint 0 Reset Position */\n#define DEVEPT_EPRST0                 (_U_(0x1) << DEVEPT_EPRST0_Pos)          /**< (DEVEPT) Endpoint 0 Reset Mask */\n#define DEVEPT_EPRST1_Pos             17                                             /**< (DEVEPT) Endpoint 1 Reset Position */\n#define DEVEPT_EPRST1                 (_U_(0x1) << DEVEPT_EPRST1_Pos)          /**< (DEVEPT) Endpoint 1 Reset Mask */\n#define DEVEPT_EPRST2_Pos             18                                             /**< (DEVEPT) Endpoint 2 Reset Position */\n#define DEVEPT_EPRST2                 (_U_(0x1) << DEVEPT_EPRST2_Pos)          /**< (DEVEPT) Endpoint 2 Reset Mask */\n#define DEVEPT_EPRST3_Pos             19                                             /**< (DEVEPT) Endpoint 3 Reset Position */\n#define DEVEPT_EPRST3                 (_U_(0x1) << DEVEPT_EPRST3_Pos)          /**< (DEVEPT) Endpoint 3 Reset Mask */\n#define DEVEPT_EPRST4_Pos             20                                             /**< (DEVEPT) Endpoint 4 Reset Position */\n#define DEVEPT_EPRST4                 (_U_(0x1) << DEVEPT_EPRST4_Pos)          /**< (DEVEPT) Endpoint 4 Reset Mask */\n#define DEVEPT_EPRST5_Pos             21                                             /**< (DEVEPT) Endpoint 5 Reset Position */\n#define DEVEPT_EPRST5                 (_U_(0x1) << DEVEPT_EPRST5_Pos)          /**< (DEVEPT) Endpoint 5 Reset Mask */\n#define DEVEPT_EPRST6_Pos             22                                             /**< (DEVEPT) Endpoint 6 Reset Position */\n#define DEVEPT_EPRST6                 (_U_(0x1) << DEVEPT_EPRST6_Pos)          /**< (DEVEPT) Endpoint 6 Reset Mask */\n#define DEVEPT_EPRST7_Pos             23                                             /**< (DEVEPT) Endpoint 7 Reset Position */\n#define DEVEPT_EPRST7                 (_U_(0x1) << DEVEPT_EPRST7_Pos)          /**< (DEVEPT) Endpoint 7 Reset Mask */\n#define DEVEPT_EPRST8_Pos             24                                             /**< (DEVEPT) Endpoint 8 Reset Position */\n#define DEVEPT_EPRST8                 (_U_(0x1) << DEVEPT_EPRST8_Pos)          /**< (DEVEPT) Endpoint 8 Reset Mask */\n#define DEVEPT_EPRST9_Pos             25                                             /**< (DEVEPT) Endpoint 9 Reset Position */\n#define DEVEPT_EPRST9                 (_U_(0x1) << DEVEPT_EPRST9_Pos)          /**< (DEVEPT) Endpoint 9 Reset Mask */\n#define DEVEPT_Msk                    _U_(0x3FF03FF)                                 /**< (DEVEPT) Register Mask  */\n\n#define DEVEPT_EPEN_Pos               0                                              /**< (DEVEPT Position) Endpoint x Enable */\n#define DEVEPT_EPEN                   (_U_(0x3FF) << DEVEPT_EPEN_Pos)          /**< (DEVEPT Mask) EPEN */\n#define DEVEPT_EPRST_Pos              16                                             /**< (DEVEPT Position) Endpoint 9 Reset */\n#define DEVEPT_EPRST                  (_U_(0x3FF) << DEVEPT_EPRST_Pos)         /**< (DEVEPT Mask) EPRST */\n\n/* -------- DEVFNUM : (USBHS Offset: 0x20) (R/ 32) Device Frame Number Register -------- */\n\n#define DEVFNUM_OFFSET                (0x20)                                        /**<  (DEVFNUM) Device Frame Number Register  Offset */\n\n#define DEVFNUM_MFNUM_Pos             0                                              /**< (DEVFNUM) Micro Frame Number Position */\n#define DEVFNUM_MFNUM                 (_U_(0x7) << DEVFNUM_MFNUM_Pos)          /**< (DEVFNUM) Micro Frame Number Mask */\n#define DEVFNUM_FNUM_Pos              3                                              /**< (DEVFNUM) Frame Number Position */\n#define DEVFNUM_FNUM                  (_U_(0x7FF) << DEVFNUM_FNUM_Pos)         /**< (DEVFNUM) Frame Number Mask */\n#define DEVFNUM_FNCERR_Pos            15                                             /**< (DEVFNUM) Frame Number CRC Error Position */\n#define DEVFNUM_FNCERR                (_U_(0x1) << DEVFNUM_FNCERR_Pos)         /**< (DEVFNUM) Frame Number CRC Error Mask */\n#define DEVFNUM_Msk                   _U_(0xBFFF)                                    /**< (DEVFNUM) Register Mask  */\n\n\n/* -------- DEVEPTCFG : (USBHS Offset: 0x100) (R/W 32) Device Endpoint Configuration Register -------- */\n\n#define DEVEPTCFG_OFFSET              (0x100)                                       /**<  (DEVEPTCFG) Device Endpoint Configuration Register  Offset */\n\n#define DEVEPTCFG_ALLOC_Pos           1                                              /**< (DEVEPTCFG) Endpoint Memory Allocate Position */\n#define DEVEPTCFG_ALLOC               (_U_(0x1) << DEVEPTCFG_ALLOC_Pos)        /**< (DEVEPTCFG) Endpoint Memory Allocate Mask */\n#define DEVEPTCFG_EPBK_Pos            2                                              /**< (DEVEPTCFG) Endpoint Banks Position */\n#define DEVEPTCFG_EPBK                (_U_(0x3) << DEVEPTCFG_EPBK_Pos)         /**< (DEVEPTCFG) Endpoint Banks Mask */\n#define   DEVEPTCFG_EPBK_1_BANK_Val   _U_(0x0)                                       /**< (DEVEPTCFG) Single-bank endpoint  */\n#define   DEVEPTCFG_EPBK_2_BANK_Val   _U_(0x1)                                       /**< (DEVEPTCFG) Double-bank endpoint  */\n#define   DEVEPTCFG_EPBK_3_BANK_Val   _U_(0x2)                                       /**< (DEVEPTCFG) Triple-bank endpoint  */\n#define DEVEPTCFG_EPBK_1_BANK         (DEVEPTCFG_EPBK_1_BANK_Val << DEVEPTCFG_EPBK_Pos)  /**< (DEVEPTCFG) Single-bank endpoint Position  */\n#define DEVEPTCFG_EPBK_2_BANK         (DEVEPTCFG_EPBK_2_BANK_Val << DEVEPTCFG_EPBK_Pos)  /**< (DEVEPTCFG) Double-bank endpoint Position  */\n#define DEVEPTCFG_EPBK_3_BANK         (DEVEPTCFG_EPBK_3_BANK_Val << DEVEPTCFG_EPBK_Pos)  /**< (DEVEPTCFG) Triple-bank endpoint Position  */\n#define DEVEPTCFG_EPSIZE_Pos          4                                              /**< (DEVEPTCFG) Endpoint Size Position */\n#define DEVEPTCFG_EPSIZE              (_U_(0x7) << DEVEPTCFG_EPSIZE_Pos)       /**< (DEVEPTCFG) Endpoint Size Mask */\n#define   DEVEPTCFG_EPSIZE_8_BYTE_Val _U_(0x0)                                       /**< (DEVEPTCFG) 8 bytes  */\n#define   DEVEPTCFG_EPSIZE_16_BYTE_Val _U_(0x1)                                       /**< (DEVEPTCFG) 16 bytes  */\n#define   DEVEPTCFG_EPSIZE_32_BYTE_Val _U_(0x2)                                       /**< (DEVEPTCFG) 32 bytes  */\n#define   DEVEPTCFG_EPSIZE_64_BYTE_Val _U_(0x3)                                       /**< (DEVEPTCFG) 64 bytes  */\n#define   DEVEPTCFG_EPSIZE_128_BYTE_Val _U_(0x4)                                       /**< (DEVEPTCFG) 128 bytes  */\n#define   DEVEPTCFG_EPSIZE_256_BYTE_Val _U_(0x5)                                       /**< (DEVEPTCFG) 256 bytes  */\n#define   DEVEPTCFG_EPSIZE_512_BYTE_Val _U_(0x6)                                       /**< (DEVEPTCFG) 512 bytes  */\n#define   DEVEPTCFG_EPSIZE_1024_BYTE_Val _U_(0x7)                                       /**< (DEVEPTCFG) 1024 bytes  */\n#define DEVEPTCFG_EPSIZE_8_BYTE       (DEVEPTCFG_EPSIZE_8_BYTE_Val << DEVEPTCFG_EPSIZE_Pos)  /**< (DEVEPTCFG) 8 bytes Position  */\n#define DEVEPTCFG_EPSIZE_16_BYTE      (DEVEPTCFG_EPSIZE_16_BYTE_Val << DEVEPTCFG_EPSIZE_Pos)  /**< (DEVEPTCFG) 16 bytes Position  */\n#define DEVEPTCFG_EPSIZE_32_BYTE      (DEVEPTCFG_EPSIZE_32_BYTE_Val << DEVEPTCFG_EPSIZE_Pos)  /**< (DEVEPTCFG) 32 bytes Position  */\n#define DEVEPTCFG_EPSIZE_64_BYTE      (DEVEPTCFG_EPSIZE_64_BYTE_Val << DEVEPTCFG_EPSIZE_Pos)  /**< (DEVEPTCFG) 64 bytes Position  */\n#define DEVEPTCFG_EPSIZE_128_BYTE     (DEVEPTCFG_EPSIZE_128_BYTE_Val << DEVEPTCFG_EPSIZE_Pos)  /**< (DEVEPTCFG) 128 bytes Position  */\n#define DEVEPTCFG_EPSIZE_256_BYTE     (DEVEPTCFG_EPSIZE_256_BYTE_Val << DEVEPTCFG_EPSIZE_Pos)  /**< (DEVEPTCFG) 256 bytes Position  */\n#define DEVEPTCFG_EPSIZE_512_BYTE     (DEVEPTCFG_EPSIZE_512_BYTE_Val << DEVEPTCFG_EPSIZE_Pos)  /**< (DEVEPTCFG) 512 bytes Position  */\n#define DEVEPTCFG_EPSIZE_1024_BYTE    (DEVEPTCFG_EPSIZE_1024_BYTE_Val << DEVEPTCFG_EPSIZE_Pos)  /**< (DEVEPTCFG) 1024 bytes Position  */\n#define DEVEPTCFG_EPDIR_Pos           8                                              /**< (DEVEPTCFG) Endpoint Direction Position */\n#define DEVEPTCFG_EPDIR               (_U_(0x1) << DEVEPTCFG_EPDIR_Pos)        /**< (DEVEPTCFG) Endpoint Direction Mask */\n#define   DEVEPTCFG_EPDIR_OUT_Val     _U_(0x0)                                       /**< (DEVEPTCFG) The endpoint direction is OUT.  */\n#define   DEVEPTCFG_EPDIR_IN_Val      _U_(0x1)                                       /**< (DEVEPTCFG) The endpoint direction is IN (nor for control endpoints).  */\n#define DEVEPTCFG_EPDIR_OUT           (DEVEPTCFG_EPDIR_OUT_Val << DEVEPTCFG_EPDIR_Pos)  /**< (DEVEPTCFG) The endpoint direction is OUT. Position  */\n#define DEVEPTCFG_EPDIR_IN            (DEVEPTCFG_EPDIR_IN_Val << DEVEPTCFG_EPDIR_Pos)  /**< (DEVEPTCFG) The endpoint direction is IN (nor for control endpoints). Position  */\n#define DEVEPTCFG_AUTOSW_Pos          9                                              /**< (DEVEPTCFG) Automatic Switch Position */\n#define DEVEPTCFG_AUTOSW              (_U_(0x1) << DEVEPTCFG_AUTOSW_Pos)       /**< (DEVEPTCFG) Automatic Switch Mask */\n#define DEVEPTCFG_EPTYPE_Pos          11                                             /**< (DEVEPTCFG) Endpoint Type Position */\n#define DEVEPTCFG_EPTYPE              (_U_(0x3) << DEVEPTCFG_EPTYPE_Pos)       /**< (DEVEPTCFG) Endpoint Type Mask */\n#define   DEVEPTCFG_EPTYPE_CTRL_Val   _U_(0x0)                                       /**< (DEVEPTCFG) Control  */\n#define   DEVEPTCFG_EPTYPE_ISO_Val    _U_(0x1)                                       /**< (DEVEPTCFG) Isochronous  */\n#define   DEVEPTCFG_EPTYPE_BLK_Val    _U_(0x2)                                       /**< (DEVEPTCFG) Bulk  */\n#define   DEVEPTCFG_EPTYPE_INTRPT_Val _U_(0x3)                                       /**< (DEVEPTCFG) Interrupt  */\n#define DEVEPTCFG_EPTYPE_CTRL         (DEVEPTCFG_EPTYPE_CTRL_Val << DEVEPTCFG_EPTYPE_Pos)  /**< (DEVEPTCFG) Control Position  */\n#define DEVEPTCFG_EPTYPE_ISO          (DEVEPTCFG_EPTYPE_ISO_Val << DEVEPTCFG_EPTYPE_Pos)  /**< (DEVEPTCFG) Isochronous Position  */\n#define DEVEPTCFG_EPTYPE_BLK          (DEVEPTCFG_EPTYPE_BLK_Val << DEVEPTCFG_EPTYPE_Pos)  /**< (DEVEPTCFG) Bulk Position  */\n#define DEVEPTCFG_EPTYPE_INTRPT       (DEVEPTCFG_EPTYPE_INTRPT_Val << DEVEPTCFG_EPTYPE_Pos)  /**< (DEVEPTCFG) Interrupt Position  */\n#define DEVEPTCFG_NBTRANS_Pos         13                                             /**< (DEVEPTCFG) Number of transactions per microframe for isochronous endpoint Position */\n#define DEVEPTCFG_NBTRANS             (_U_(0x3) << DEVEPTCFG_NBTRANS_Pos)      /**< (DEVEPTCFG) Number of transactions per microframe for isochronous endpoint Mask */\n#define   DEVEPTCFG_NBTRANS_0_TRANS_Val _U_(0x0)                                       /**< (DEVEPTCFG) Reserved to endpoint that does not have the high-bandwidth isochronous capability.  */\n#define   DEVEPTCFG_NBTRANS_1_TRANS_Val _U_(0x1)                                       /**< (DEVEPTCFG) Default value: one transaction per microframe.  */\n#define   DEVEPTCFG_NBTRANS_2_TRANS_Val _U_(0x2)                                       /**< (DEVEPTCFG) Two transactions per microframe. This endpoint should be configured as double-bank.  */\n#define   DEVEPTCFG_NBTRANS_3_TRANS_Val _U_(0x3)                                       /**< (DEVEPTCFG) Three transactions per microframe. This endpoint should be configured as triple-bank.  */\n#define DEVEPTCFG_NBTRANS_0_TRANS     (DEVEPTCFG_NBTRANS_0_TRANS_Val << DEVEPTCFG_NBTRANS_Pos)  /**< (DEVEPTCFG) Reserved to endpoint that does not have the high-bandwidth isochronous capability. Position  */\n#define DEVEPTCFG_NBTRANS_1_TRANS     (DEVEPTCFG_NBTRANS_1_TRANS_Val << DEVEPTCFG_NBTRANS_Pos)  /**< (DEVEPTCFG) Default value: one transaction per microframe. Position  */\n#define DEVEPTCFG_NBTRANS_2_TRANS     (DEVEPTCFG_NBTRANS_2_TRANS_Val << DEVEPTCFG_NBTRANS_Pos)  /**< (DEVEPTCFG) Two transactions per microframe. This endpoint should be configured as double-bank. Position  */\n#define DEVEPTCFG_NBTRANS_3_TRANS     (DEVEPTCFG_NBTRANS_3_TRANS_Val << DEVEPTCFG_NBTRANS_Pos)  /**< (DEVEPTCFG) Three transactions per microframe. This endpoint should be configured as triple-bank. Position  */\n#define DEVEPTCFG_Msk                 _U_(0x7B7E)                                    /**< (DEVEPTCFG) Register Mask  */\n\n\n/* -------- DEVEPTISR : (USBHS Offset: 0x130) (R/ 32) Device Endpoint Interrupt Status Register -------- */\n\n#define DEVEPTISR_OFFSET              (0x130)                                       /**<  (DEVEPTISR) Device Endpoint Interrupt Status Register  Offset */\n\n#define DEVEPTISR_TXINI_Pos           0                                              /**< (DEVEPTISR) Transmitted IN Data Interrupt Position */\n#define DEVEPTISR_TXINI               (_U_(0x1) << DEVEPTISR_TXINI_Pos)        /**< (DEVEPTISR) Transmitted IN Data Interrupt Mask */\n#define DEVEPTISR_RXOUTI_Pos          1                                              /**< (DEVEPTISR) Received OUT Data Interrupt Position */\n#define DEVEPTISR_RXOUTI              (_U_(0x1) << DEVEPTISR_RXOUTI_Pos)       /**< (DEVEPTISR) Received OUT Data Interrupt Mask */\n#define DEVEPTISR_OVERFI_Pos          5                                              /**< (DEVEPTISR) Overflow Interrupt Position */\n#define DEVEPTISR_OVERFI              (_U_(0x1) << DEVEPTISR_OVERFI_Pos)       /**< (DEVEPTISR) Overflow Interrupt Mask */\n#define DEVEPTISR_SHORTPACKET_Pos     7                                              /**< (DEVEPTISR) Short Packet Interrupt Position */\n#define DEVEPTISR_SHORTPACKET         (_U_(0x1) << DEVEPTISR_SHORTPACKET_Pos)  /**< (DEVEPTISR) Short Packet Interrupt Mask */\n#define DEVEPTISR_DTSEQ_Pos           8                                              /**< (DEVEPTISR) Data Toggle Sequence Position */\n#define DEVEPTISR_DTSEQ               (_U_(0x3) << DEVEPTISR_DTSEQ_Pos)        /**< (DEVEPTISR) Data Toggle Sequence Mask */\n#define   DEVEPTISR_DTSEQ_DATA0_Val   _U_(0x0)                                       /**< (DEVEPTISR) Data0 toggle sequence  */\n#define   DEVEPTISR_DTSEQ_DATA1_Val   _U_(0x1)                                       /**< (DEVEPTISR) Data1 toggle sequence  */\n#define   DEVEPTISR_DTSEQ_DATA2_Val   _U_(0x2)                                       /**< (DEVEPTISR) Reserved for high-bandwidth isochronous endpoint  */\n#define   DEVEPTISR_DTSEQ_MDATA_Val   _U_(0x3)                                       /**< (DEVEPTISR) Reserved for high-bandwidth isochronous endpoint  */\n#define DEVEPTISR_DTSEQ_DATA0         (DEVEPTISR_DTSEQ_DATA0_Val << DEVEPTISR_DTSEQ_Pos)  /**< (DEVEPTISR) Data0 toggle sequence Position  */\n#define DEVEPTISR_DTSEQ_DATA1         (DEVEPTISR_DTSEQ_DATA1_Val << DEVEPTISR_DTSEQ_Pos)  /**< (DEVEPTISR) Data1 toggle sequence Position  */\n#define DEVEPTISR_DTSEQ_DATA2         (DEVEPTISR_DTSEQ_DATA2_Val << DEVEPTISR_DTSEQ_Pos)  /**< (DEVEPTISR) Reserved for high-bandwidth isochronous endpoint Position  */\n#define DEVEPTISR_DTSEQ_MDATA         (DEVEPTISR_DTSEQ_MDATA_Val << DEVEPTISR_DTSEQ_Pos)  /**< (DEVEPTISR) Reserved for high-bandwidth isochronous endpoint Position  */\n#define DEVEPTISR_NBUSYBK_Pos         12                                             /**< (DEVEPTISR) Number of Busy Banks Position */\n#define DEVEPTISR_NBUSYBK             (_U_(0x3) << DEVEPTISR_NBUSYBK_Pos)      /**< (DEVEPTISR) Number of Busy Banks Mask */\n#define   DEVEPTISR_NBUSYBK_0_BUSY_Val _U_(0x0)                                       /**< (DEVEPTISR) 0 busy bank (all banks free)  */\n#define   DEVEPTISR_NBUSYBK_1_BUSY_Val _U_(0x1)                                       /**< (DEVEPTISR) 1 busy bank  */\n#define   DEVEPTISR_NBUSYBK_2_BUSY_Val _U_(0x2)                                       /**< (DEVEPTISR) 2 busy banks  */\n#define   DEVEPTISR_NBUSYBK_3_BUSY_Val _U_(0x3)                                       /**< (DEVEPTISR) 3 busy banks  */\n#define DEVEPTISR_NBUSYBK_0_BUSY      (DEVEPTISR_NBUSYBK_0_BUSY_Val << DEVEPTISR_NBUSYBK_Pos)  /**< (DEVEPTISR) 0 busy bank (all banks free) Position  */\n#define DEVEPTISR_NBUSYBK_1_BUSY      (DEVEPTISR_NBUSYBK_1_BUSY_Val << DEVEPTISR_NBUSYBK_Pos)  /**< (DEVEPTISR) 1 busy bank Position  */\n#define DEVEPTISR_NBUSYBK_2_BUSY      (DEVEPTISR_NBUSYBK_2_BUSY_Val << DEVEPTISR_NBUSYBK_Pos)  /**< (DEVEPTISR) 2 busy banks Position  */\n#define DEVEPTISR_NBUSYBK_3_BUSY      (DEVEPTISR_NBUSYBK_3_BUSY_Val << DEVEPTISR_NBUSYBK_Pos)  /**< (DEVEPTISR) 3 busy banks Position  */\n#define DEVEPTISR_CURRBK_Pos          14                                             /**< (DEVEPTISR) Current Bank Position */\n#define DEVEPTISR_CURRBK              (_U_(0x3) << DEVEPTISR_CURRBK_Pos)       /**< (DEVEPTISR) Current Bank Mask */\n#define   DEVEPTISR_CURRBK_BANK0_Val  _U_(0x0)                                       /**< (DEVEPTISR) Current bank is bank0  */\n#define   DEVEPTISR_CURRBK_BANK1_Val  _U_(0x1)                                       /**< (DEVEPTISR) Current bank is bank1  */\n#define   DEVEPTISR_CURRBK_BANK2_Val  _U_(0x2)                                       /**< (DEVEPTISR) Current bank is bank2  */\n#define DEVEPTISR_CURRBK_BANK0        (DEVEPTISR_CURRBK_BANK0_Val << DEVEPTISR_CURRBK_Pos)  /**< (DEVEPTISR) Current bank is bank0 Position  */\n#define DEVEPTISR_CURRBK_BANK1        (DEVEPTISR_CURRBK_BANK1_Val << DEVEPTISR_CURRBK_Pos)  /**< (DEVEPTISR) Current bank is bank1 Position  */\n#define DEVEPTISR_CURRBK_BANK2        (DEVEPTISR_CURRBK_BANK2_Val << DEVEPTISR_CURRBK_Pos)  /**< (DEVEPTISR) Current bank is bank2 Position  */\n#define DEVEPTISR_RWALL_Pos           16                                             /**< (DEVEPTISR) Read/Write Allowed Position */\n#define DEVEPTISR_RWALL               (_U_(0x1) << DEVEPTISR_RWALL_Pos)        /**< (DEVEPTISR) Read/Write Allowed Mask */\n#define DEVEPTISR_CFGOK_Pos           18                                             /**< (DEVEPTISR) Configuration OK Status Position */\n#define DEVEPTISR_CFGOK               (_U_(0x1) << DEVEPTISR_CFGOK_Pos)        /**< (DEVEPTISR) Configuration OK Status Mask */\n#define DEVEPTISR_BYCT_Pos            20                                             /**< (DEVEPTISR) Byte Count Position */\n#define DEVEPTISR_BYCT                (_U_(0x7FF) << DEVEPTISR_BYCT_Pos)       /**< (DEVEPTISR) Byte Count Mask */\n#define DEVEPTISR_Msk                 _U_(0x7FF5F3A3)                                /**< (DEVEPTISR) Register Mask  */\n\n/* CTRL mode */\n#define DEVEPTISR_CTRL_RXSTPI_Pos     2                                              /**< (DEVEPTISR) Received SETUP Interrupt Position */\n#define DEVEPTISR_CTRL_RXSTPI         (_U_(0x1) << DEVEPTISR_CTRL_RXSTPI_Pos)  /**< (DEVEPTISR) Received SETUP Interrupt Mask */\n#define DEVEPTISR_CTRL_NAKOUTI_Pos    3                                              /**< (DEVEPTISR) NAKed OUT Interrupt Position */\n#define DEVEPTISR_CTRL_NAKOUTI        (_U_(0x1) << DEVEPTISR_CTRL_NAKOUTI_Pos)  /**< (DEVEPTISR) NAKed OUT Interrupt Mask */\n#define DEVEPTISR_CTRL_NAKINI_Pos     4                                              /**< (DEVEPTISR) NAKed IN Interrupt Position */\n#define DEVEPTISR_CTRL_NAKINI         (_U_(0x1) << DEVEPTISR_CTRL_NAKINI_Pos)  /**< (DEVEPTISR) NAKed IN Interrupt Mask */\n#define DEVEPTISR_CTRL_STALLEDI_Pos   6                                              /**< (DEVEPTISR) STALLed Interrupt Position */\n#define DEVEPTISR_CTRL_STALLEDI       (_U_(0x1) << DEVEPTISR_CTRL_STALLEDI_Pos)  /**< (DEVEPTISR) STALLed Interrupt Mask */\n#define DEVEPTISR_CTRL_CTRLDIR_Pos    17                                             /**< (DEVEPTISR) Control Direction Position */\n#define DEVEPTISR_CTRL_CTRLDIR        (_U_(0x1) << DEVEPTISR_CTRL_CTRLDIR_Pos)  /**< (DEVEPTISR) Control Direction Mask */\n#define DEVEPTISR_CTRL_Msk            _U_(0x2005C)                                   /**< (DEVEPTISR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define DEVEPTISR_ISO_UNDERFI_Pos     2                                              /**< (DEVEPTISR) Underflow Interrupt Position */\n#define DEVEPTISR_ISO_UNDERFI         (_U_(0x1) << DEVEPTISR_ISO_UNDERFI_Pos)  /**< (DEVEPTISR) Underflow Interrupt Mask */\n#define DEVEPTISR_ISO_HBISOINERRI_Pos 3                                              /**< (DEVEPTISR) High Bandwidth Isochronous IN Underflow Error Interrupt Position */\n#define DEVEPTISR_ISO_HBISOINERRI     (_U_(0x1) << DEVEPTISR_ISO_HBISOINERRI_Pos)  /**< (DEVEPTISR) High Bandwidth Isochronous IN Underflow Error Interrupt Mask */\n#define DEVEPTISR_ISO_HBISOFLUSHI_Pos 4                                              /**< (DEVEPTISR) High Bandwidth Isochronous IN Flush Interrupt Position */\n#define DEVEPTISR_ISO_HBISOFLUSHI     (_U_(0x1) << DEVEPTISR_ISO_HBISOFLUSHI_Pos)  /**< (DEVEPTISR) High Bandwidth Isochronous IN Flush Interrupt Mask */\n#define DEVEPTISR_ISO_CRCERRI_Pos     6                                              /**< (DEVEPTISR) CRC Error Interrupt Position */\n#define DEVEPTISR_ISO_CRCERRI         (_U_(0x1) << DEVEPTISR_ISO_CRCERRI_Pos)  /**< (DEVEPTISR) CRC Error Interrupt Mask */\n#define DEVEPTISR_ISO_ERRORTRANS_Pos  10                                             /**< (DEVEPTISR) High-bandwidth Isochronous OUT Endpoint Transaction Error Interrupt Position */\n#define DEVEPTISR_ISO_ERRORTRANS      (_U_(0x1) << DEVEPTISR_ISO_ERRORTRANS_Pos)  /**< (DEVEPTISR) High-bandwidth Isochronous OUT Endpoint Transaction Error Interrupt Mask */\n#define DEVEPTISR_ISO_Msk             _U_(0x45C)                                     /**< (DEVEPTISR_ISO) Register Mask  */\n\n/* BLK mode */\n#define DEVEPTISR_BLK_RXSTPI_Pos      2                                              /**< (DEVEPTISR) Received SETUP Interrupt Position */\n#define DEVEPTISR_BLK_RXSTPI          (_U_(0x1) << DEVEPTISR_BLK_RXSTPI_Pos)   /**< (DEVEPTISR) Received SETUP Interrupt Mask */\n#define DEVEPTISR_BLK_NAKOUTI_Pos     3                                              /**< (DEVEPTISR) NAKed OUT Interrupt Position */\n#define DEVEPTISR_BLK_NAKOUTI         (_U_(0x1) << DEVEPTISR_BLK_NAKOUTI_Pos)  /**< (DEVEPTISR) NAKed OUT Interrupt Mask */\n#define DEVEPTISR_BLK_NAKINI_Pos      4                                              /**< (DEVEPTISR) NAKed IN Interrupt Position */\n#define DEVEPTISR_BLK_NAKINI          (_U_(0x1) << DEVEPTISR_BLK_NAKINI_Pos)   /**< (DEVEPTISR) NAKed IN Interrupt Mask */\n#define DEVEPTISR_BLK_STALLEDI_Pos    6                                              /**< (DEVEPTISR) STALLed Interrupt Position */\n#define DEVEPTISR_BLK_STALLEDI        (_U_(0x1) << DEVEPTISR_BLK_STALLEDI_Pos)  /**< (DEVEPTISR) STALLed Interrupt Mask */\n#define DEVEPTISR_BLK_CTRLDIR_Pos     17                                             /**< (DEVEPTISR) Control Direction Position */\n#define DEVEPTISR_BLK_CTRLDIR         (_U_(0x1) << DEVEPTISR_BLK_CTRLDIR_Pos)  /**< (DEVEPTISR) Control Direction Mask */\n#define DEVEPTISR_BLK_Msk             _U_(0x2005C)                                   /**< (DEVEPTISR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define DEVEPTISR_INTRPT_RXSTPI_Pos   2                                              /**< (DEVEPTISR) Received SETUP Interrupt Position */\n#define DEVEPTISR_INTRPT_RXSTPI       (_U_(0x1) << DEVEPTISR_INTRPT_RXSTPI_Pos)  /**< (DEVEPTISR) Received SETUP Interrupt Mask */\n#define DEVEPTISR_INTRPT_NAKOUTI_Pos  3                                              /**< (DEVEPTISR) NAKed OUT Interrupt Position */\n#define DEVEPTISR_INTRPT_NAKOUTI      (_U_(0x1) << DEVEPTISR_INTRPT_NAKOUTI_Pos)  /**< (DEVEPTISR) NAKed OUT Interrupt Mask */\n#define DEVEPTISR_INTRPT_NAKINI_Pos   4                                              /**< (DEVEPTISR) NAKed IN Interrupt Position */\n#define DEVEPTISR_INTRPT_NAKINI       (_U_(0x1) << DEVEPTISR_INTRPT_NAKINI_Pos)  /**< (DEVEPTISR) NAKed IN Interrupt Mask */\n#define DEVEPTISR_INTRPT_STALLEDI_Pos 6                                              /**< (DEVEPTISR) STALLed Interrupt Position */\n#define DEVEPTISR_INTRPT_STALLEDI     (_U_(0x1) << DEVEPTISR_INTRPT_STALLEDI_Pos)  /**< (DEVEPTISR) STALLed Interrupt Mask */\n#define DEVEPTISR_INTRPT_CTRLDIR_Pos  17                                             /**< (DEVEPTISR) Control Direction Position */\n#define DEVEPTISR_INTRPT_CTRLDIR      (_U_(0x1) << DEVEPTISR_INTRPT_CTRLDIR_Pos)  /**< (DEVEPTISR) Control Direction Mask */\n#define DEVEPTISR_INTRPT_Msk          _U_(0x2005C)                                   /**< (DEVEPTISR_INTRPT) Register Mask  */\n\n\n/* -------- DEVEPTICR : (USBHS Offset: 0x160) (/W 32) Device Endpoint Interrupt Clear Register -------- */\n\n#define DEVEPTICR_OFFSET              (0x160)                                       /**<  (DEVEPTICR) Device Endpoint Interrupt Clear Register  Offset */\n\n#define DEVEPTICR_TXINIC_Pos          0                                              /**< (DEVEPTICR) Transmitted IN Data Interrupt Clear Position */\n#define DEVEPTICR_TXINIC              (_U_(0x1) << DEVEPTICR_TXINIC_Pos)       /**< (DEVEPTICR) Transmitted IN Data Interrupt Clear Mask */\n#define DEVEPTICR_RXOUTIC_Pos         1                                              /**< (DEVEPTICR) Received OUT Data Interrupt Clear Position */\n#define DEVEPTICR_RXOUTIC             (_U_(0x1) << DEVEPTICR_RXOUTIC_Pos)      /**< (DEVEPTICR) Received OUT Data Interrupt Clear Mask */\n#define DEVEPTICR_OVERFIC_Pos         5                                              /**< (DEVEPTICR) Overflow Interrupt Clear Position */\n#define DEVEPTICR_OVERFIC             (_U_(0x1) << DEVEPTICR_OVERFIC_Pos)      /**< (DEVEPTICR) Overflow Interrupt Clear Mask */\n#define DEVEPTICR_SHORTPACKETC_Pos    7                                              /**< (DEVEPTICR) Short Packet Interrupt Clear Position */\n#define DEVEPTICR_SHORTPACKETC        (_U_(0x1) << DEVEPTICR_SHORTPACKETC_Pos)  /**< (DEVEPTICR) Short Packet Interrupt Clear Mask */\n#define DEVEPTICR_Msk                 _U_(0xA3)                                      /**< (DEVEPTICR) Register Mask  */\n\n/* CTRL mode */\n#define DEVEPTICR_CTRL_RXSTPIC_Pos    2                                              /**< (DEVEPTICR) Received SETUP Interrupt Clear Position */\n#define DEVEPTICR_CTRL_RXSTPIC        (_U_(0x1) << DEVEPTICR_CTRL_RXSTPIC_Pos)  /**< (DEVEPTICR) Received SETUP Interrupt Clear Mask */\n#define DEVEPTICR_CTRL_NAKOUTIC_Pos   3                                              /**< (DEVEPTICR) NAKed OUT Interrupt Clear Position */\n#define DEVEPTICR_CTRL_NAKOUTIC       (_U_(0x1) << DEVEPTICR_CTRL_NAKOUTIC_Pos)  /**< (DEVEPTICR) NAKed OUT Interrupt Clear Mask */\n#define DEVEPTICR_CTRL_NAKINIC_Pos    4                                              /**< (DEVEPTICR) NAKed IN Interrupt Clear Position */\n#define DEVEPTICR_CTRL_NAKINIC        (_U_(0x1) << DEVEPTICR_CTRL_NAKINIC_Pos)  /**< (DEVEPTICR) NAKed IN Interrupt Clear Mask */\n#define DEVEPTICR_CTRL_STALLEDIC_Pos  6                                              /**< (DEVEPTICR) STALLed Interrupt Clear Position */\n#define DEVEPTICR_CTRL_STALLEDIC      (_U_(0x1) << DEVEPTICR_CTRL_STALLEDIC_Pos)  /**< (DEVEPTICR) STALLed Interrupt Clear Mask */\n#define DEVEPTICR_CTRL_Msk            _U_(0x5C)                                      /**< (DEVEPTICR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define DEVEPTICR_ISO_UNDERFIC_Pos    2                                              /**< (DEVEPTICR) Underflow Interrupt Clear Position */\n#define DEVEPTICR_ISO_UNDERFIC        (_U_(0x1) << DEVEPTICR_ISO_UNDERFIC_Pos)  /**< (DEVEPTICR) Underflow Interrupt Clear Mask */\n#define DEVEPTICR_ISO_HBISOINERRIC_Pos 3                                              /**< (DEVEPTICR) High Bandwidth Isochronous IN Underflow Error Interrupt Clear Position */\n#define DEVEPTICR_ISO_HBISOINERRIC     (_U_(0x1) << DEVEPTICR_ISO_HBISOINERRIC_Pos)  /**< (DEVEPTICR) High Bandwidth Isochronous IN Underflow Error Interrupt Clear Mask */\n#define DEVEPTICR_ISO_HBISOFLUSHIC_Pos 4                                              /**< (DEVEPTICR) High Bandwidth Isochronous IN Flush Interrupt Clear Position */\n#define DEVEPTICR_ISO_HBISOFLUSHIC     (_U_(0x1) << DEVEPTICR_ISO_HBISOFLUSHIC_Pos)  /**< (DEVEPTICR) High Bandwidth Isochronous IN Flush Interrupt Clear Mask */\n#define DEVEPTICR_ISO_CRCERRIC_Pos    6                                              /**< (DEVEPTICR) CRC Error Interrupt Clear Position */\n#define DEVEPTICR_ISO_CRCERRIC        (_U_(0x1) << DEVEPTICR_ISO_CRCERRIC_Pos)  /**< (DEVEPTICR) CRC Error Interrupt Clear Mask */\n#define DEVEPTICR_ISO_Msk             _U_(0x5C)                                      /**< (DEVEPTICR_ISO) Register Mask  */\n\n/* BLK mode */\n#define DEVEPTICR_BLK_RXSTPIC_Pos     2                                              /**< (DEVEPTICR) Received SETUP Interrupt Clear Position */\n#define DEVEPTICR_BLK_RXSTPIC         (_U_(0x1) << DEVEPTICR_BLK_RXSTPIC_Pos)  /**< (DEVEPTICR) Received SETUP Interrupt Clear Mask */\n#define DEVEPTICR_BLK_NAKOUTIC_Pos    3                                              /**< (DEVEPTICR) NAKed OUT Interrupt Clear Position */\n#define DEVEPTICR_BLK_NAKOUTIC        (_U_(0x1) << DEVEPTICR_BLK_NAKOUTIC_Pos)  /**< (DEVEPTICR) NAKed OUT Interrupt Clear Mask */\n#define DEVEPTICR_BLK_NAKINIC_Pos     4                                              /**< (DEVEPTICR) NAKed IN Interrupt Clear Position */\n#define DEVEPTICR_BLK_NAKINIC         (_U_(0x1) << DEVEPTICR_BLK_NAKINIC_Pos)  /**< (DEVEPTICR) NAKed IN Interrupt Clear Mask */\n#define DEVEPTICR_BLK_STALLEDIC_Pos   6                                              /**< (DEVEPTICR) STALLed Interrupt Clear Position */\n#define DEVEPTICR_BLK_STALLEDIC       (_U_(0x1) << DEVEPTICR_BLK_STALLEDIC_Pos)  /**< (DEVEPTICR) STALLed Interrupt Clear Mask */\n#define DEVEPTICR_BLK_Msk             _U_(0x5C)                                      /**< (DEVEPTICR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define DEVEPTICR_INTRPT_RXSTPIC_Pos  2                                              /**< (DEVEPTICR) Received SETUP Interrupt Clear Position */\n#define DEVEPTICR_INTRPT_RXSTPIC      (_U_(0x1) << DEVEPTICR_INTRPT_RXSTPIC_Pos)  /**< (DEVEPTICR) Received SETUP Interrupt Clear Mask */\n#define DEVEPTICR_INTRPT_NAKOUTIC_Pos 3                                              /**< (DEVEPTICR) NAKed OUT Interrupt Clear Position */\n#define DEVEPTICR_INTRPT_NAKOUTIC     (_U_(0x1) << DEVEPTICR_INTRPT_NAKOUTIC_Pos)  /**< (DEVEPTICR) NAKed OUT Interrupt Clear Mask */\n#define DEVEPTICR_INTRPT_NAKINIC_Pos  4                                              /**< (DEVEPTICR) NAKed IN Interrupt Clear Position */\n#define DEVEPTICR_INTRPT_NAKINIC      (_U_(0x1) << DEVEPTICR_INTRPT_NAKINIC_Pos)  /**< (DEVEPTICR) NAKed IN Interrupt Clear Mask */\n#define DEVEPTICR_INTRPT_STALLEDIC_Pos 6                                              /**< (DEVEPTICR) STALLed Interrupt Clear Position */\n#define DEVEPTICR_INTRPT_STALLEDIC     (_U_(0x1) << DEVEPTICR_INTRPT_STALLEDIC_Pos)  /**< (DEVEPTICR) STALLed Interrupt Clear Mask */\n#define DEVEPTICR_INTRPT_Msk          _U_(0x5C)                                      /**< (DEVEPTICR_INTRPT) Register Mask  */\n\n\n/* -------- DEVEPTIFR : (USBHS Offset: 0x190) (/W 32) Device Endpoint Interrupt Set Register -------- */\n\n#define DEVEPTIFR_OFFSET              (0x190)                                       /**<  (DEVEPTIFR) Device Endpoint Interrupt Set Register  Offset */\n\n#define DEVEPTIFR_TXINIS_Pos          0                                              /**< (DEVEPTIFR) Transmitted IN Data Interrupt Set Position */\n#define DEVEPTIFR_TXINIS              (_U_(0x1) << DEVEPTIFR_TXINIS_Pos)       /**< (DEVEPTIFR) Transmitted IN Data Interrupt Set Mask */\n#define DEVEPTIFR_RXOUTIS_Pos         1                                              /**< (DEVEPTIFR) Received OUT Data Interrupt Set Position */\n#define DEVEPTIFR_RXOUTIS             (_U_(0x1) << DEVEPTIFR_RXOUTIS_Pos)      /**< (DEVEPTIFR) Received OUT Data Interrupt Set Mask */\n#define DEVEPTIFR_OVERFIS_Pos         5                                              /**< (DEVEPTIFR) Overflow Interrupt Set Position */\n#define DEVEPTIFR_OVERFIS             (_U_(0x1) << DEVEPTIFR_OVERFIS_Pos)      /**< (DEVEPTIFR) Overflow Interrupt Set Mask */\n#define DEVEPTIFR_SHORTPACKETS_Pos    7                                              /**< (DEVEPTIFR) Short Packet Interrupt Set Position */\n#define DEVEPTIFR_SHORTPACKETS        (_U_(0x1) << DEVEPTIFR_SHORTPACKETS_Pos)  /**< (DEVEPTIFR) Short Packet Interrupt Set Mask */\n#define DEVEPTIFR_NBUSYBKS_Pos        12                                             /**< (DEVEPTIFR) Number of Busy Banks Interrupt Set Position */\n#define DEVEPTIFR_NBUSYBKS            (_U_(0x1) << DEVEPTIFR_NBUSYBKS_Pos)     /**< (DEVEPTIFR) Number of Busy Banks Interrupt Set Mask */\n#define DEVEPTIFR_Msk                 _U_(0x10A3)                                    /**< (DEVEPTIFR) Register Mask  */\n\n/* CTRL mode */\n#define DEVEPTIFR_CTRL_RXSTPIS_Pos    2                                              /**< (DEVEPTIFR) Received SETUP Interrupt Set Position */\n#define DEVEPTIFR_CTRL_RXSTPIS        (_U_(0x1) << DEVEPTIFR_CTRL_RXSTPIS_Pos)  /**< (DEVEPTIFR) Received SETUP Interrupt Set Mask */\n#define DEVEPTIFR_CTRL_NAKOUTIS_Pos   3                                              /**< (DEVEPTIFR) NAKed OUT Interrupt Set Position */\n#define DEVEPTIFR_CTRL_NAKOUTIS       (_U_(0x1) << DEVEPTIFR_CTRL_NAKOUTIS_Pos)  /**< (DEVEPTIFR) NAKed OUT Interrupt Set Mask */\n#define DEVEPTIFR_CTRL_NAKINIS_Pos    4                                              /**< (DEVEPTIFR) NAKed IN Interrupt Set Position */\n#define DEVEPTIFR_CTRL_NAKINIS        (_U_(0x1) << DEVEPTIFR_CTRL_NAKINIS_Pos)  /**< (DEVEPTIFR) NAKed IN Interrupt Set Mask */\n#define DEVEPTIFR_CTRL_STALLEDIS_Pos  6                                              /**< (DEVEPTIFR) STALLed Interrupt Set Position */\n#define DEVEPTIFR_CTRL_STALLEDIS      (_U_(0x1) << DEVEPTIFR_CTRL_STALLEDIS_Pos)  /**< (DEVEPTIFR) STALLed Interrupt Set Mask */\n#define DEVEPTIFR_CTRL_Msk            _U_(0x5C)                                      /**< (DEVEPTIFR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define DEVEPTIFR_ISO_UNDERFIS_Pos    2                                              /**< (DEVEPTIFR) Underflow Interrupt Set Position */\n#define DEVEPTIFR_ISO_UNDERFIS        (_U_(0x1) << DEVEPTIFR_ISO_UNDERFIS_Pos)  /**< (DEVEPTIFR) Underflow Interrupt Set Mask */\n#define DEVEPTIFR_ISO_HBISOINERRIS_Pos 3                                              /**< (DEVEPTIFR) High Bandwidth Isochronous IN Underflow Error Interrupt Set Position */\n#define DEVEPTIFR_ISO_HBISOINERRIS     (_U_(0x1) << DEVEPTIFR_ISO_HBISOINERRIS_Pos)  /**< (DEVEPTIFR) High Bandwidth Isochronous IN Underflow Error Interrupt Set Mask */\n#define DEVEPTIFR_ISO_HBISOFLUSHIS_Pos 4                                              /**< (DEVEPTIFR) High Bandwidth Isochronous IN Flush Interrupt Set Position */\n#define DEVEPTIFR_ISO_HBISOFLUSHIS     (_U_(0x1) << DEVEPTIFR_ISO_HBISOFLUSHIS_Pos)  /**< (DEVEPTIFR) High Bandwidth Isochronous IN Flush Interrupt Set Mask */\n#define DEVEPTIFR_ISO_CRCERRIS_Pos    6                                              /**< (DEVEPTIFR) CRC Error Interrupt Set Position */\n#define DEVEPTIFR_ISO_CRCERRIS        (_U_(0x1) << DEVEPTIFR_ISO_CRCERRIS_Pos)  /**< (DEVEPTIFR) CRC Error Interrupt Set Mask */\n#define DEVEPTIFR_ISO_Msk             _U_(0x5C)                                      /**< (DEVEPTIFR_ISO) Register Mask  */\n\n/* BLK mode */\n#define DEVEPTIFR_BLK_RXSTPIS_Pos     2                                              /**< (DEVEPTIFR) Received SETUP Interrupt Set Position */\n#define DEVEPTIFR_BLK_RXSTPIS         (_U_(0x1) << DEVEPTIFR_BLK_RXSTPIS_Pos)  /**< (DEVEPTIFR) Received SETUP Interrupt Set Mask */\n#define DEVEPTIFR_BLK_NAKOUTIS_Pos    3                                              /**< (DEVEPTIFR) NAKed OUT Interrupt Set Position */\n#define DEVEPTIFR_BLK_NAKOUTIS        (_U_(0x1) << DEVEPTIFR_BLK_NAKOUTIS_Pos)  /**< (DEVEPTIFR) NAKed OUT Interrupt Set Mask */\n#define DEVEPTIFR_BLK_NAKINIS_Pos     4                                              /**< (DEVEPTIFR) NAKed IN Interrupt Set Position */\n#define DEVEPTIFR_BLK_NAKINIS         (_U_(0x1) << DEVEPTIFR_BLK_NAKINIS_Pos)  /**< (DEVEPTIFR) NAKed IN Interrupt Set Mask */\n#define DEVEPTIFR_BLK_STALLEDIS_Pos   6                                              /**< (DEVEPTIFR) STALLed Interrupt Set Position */\n#define DEVEPTIFR_BLK_STALLEDIS       (_U_(0x1) << DEVEPTIFR_BLK_STALLEDIS_Pos)  /**< (DEVEPTIFR) STALLed Interrupt Set Mask */\n#define DEVEPTIFR_BLK_Msk             _U_(0x5C)                                      /**< (DEVEPTIFR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define DEVEPTIFR_INTRPT_RXSTPIS_Pos  2                                              /**< (DEVEPTIFR) Received SETUP Interrupt Set Position */\n#define DEVEPTIFR_INTRPT_RXSTPIS      (_U_(0x1) << DEVEPTIFR_INTRPT_RXSTPIS_Pos)  /**< (DEVEPTIFR) Received SETUP Interrupt Set Mask */\n#define DEVEPTIFR_INTRPT_NAKOUTIS_Pos 3                                              /**< (DEVEPTIFR) NAKed OUT Interrupt Set Position */\n#define DEVEPTIFR_INTRPT_NAKOUTIS     (_U_(0x1) << DEVEPTIFR_INTRPT_NAKOUTIS_Pos)  /**< (DEVEPTIFR) NAKed OUT Interrupt Set Mask */\n#define DEVEPTIFR_INTRPT_NAKINIS_Pos  4                                              /**< (DEVEPTIFR) NAKed IN Interrupt Set Position */\n#define DEVEPTIFR_INTRPT_NAKINIS      (_U_(0x1) << DEVEPTIFR_INTRPT_NAKINIS_Pos)  /**< (DEVEPTIFR) NAKed IN Interrupt Set Mask */\n#define DEVEPTIFR_INTRPT_STALLEDIS_Pos 6                                              /**< (DEVEPTIFR) STALLed Interrupt Set Position */\n#define DEVEPTIFR_INTRPT_STALLEDIS     (_U_(0x1) << DEVEPTIFR_INTRPT_STALLEDIS_Pos)  /**< (DEVEPTIFR) STALLed Interrupt Set Mask */\n#define DEVEPTIFR_INTRPT_Msk          _U_(0x5C)                                      /**< (DEVEPTIFR_INTRPT) Register Mask  */\n\n\n/* -------- DEVEPTIMR : (USBHS Offset: 0x1c0) (R/ 32) Device Endpoint Interrupt Mask Register -------- */\n\n#define DEVEPTIMR_OFFSET              (0x1C0)                                       /**<  (DEVEPTIMR) Device Endpoint Interrupt Mask Register  Offset */\n\n#define DEVEPTIMR_TXINE_Pos           0                                              /**< (DEVEPTIMR) Transmitted IN Data Interrupt Position */\n#define DEVEPTIMR_TXINE               (_U_(0x1) << DEVEPTIMR_TXINE_Pos)        /**< (DEVEPTIMR) Transmitted IN Data Interrupt Mask */\n#define DEVEPTIMR_RXOUTE_Pos          1                                              /**< (DEVEPTIMR) Received OUT Data Interrupt Position */\n#define DEVEPTIMR_RXOUTE              (_U_(0x1) << DEVEPTIMR_RXOUTE_Pos)       /**< (DEVEPTIMR) Received OUT Data Interrupt Mask */\n#define DEVEPTIMR_OVERFE_Pos          5                                              /**< (DEVEPTIMR) Overflow Interrupt Position */\n#define DEVEPTIMR_OVERFE              (_U_(0x1) << DEVEPTIMR_OVERFE_Pos)       /**< (DEVEPTIMR) Overflow Interrupt Mask */\n#define DEVEPTIMR_SHORTPACKETE_Pos    7                                              /**< (DEVEPTIMR) Short Packet Interrupt Position */\n#define DEVEPTIMR_SHORTPACKETE        (_U_(0x1) << DEVEPTIMR_SHORTPACKETE_Pos)  /**< (DEVEPTIMR) Short Packet Interrupt Mask */\n#define DEVEPTIMR_NBUSYBKE_Pos        12                                             /**< (DEVEPTIMR) Number of Busy Banks Interrupt Position */\n#define DEVEPTIMR_NBUSYBKE            (_U_(0x1) << DEVEPTIMR_NBUSYBKE_Pos)     /**< (DEVEPTIMR) Number of Busy Banks Interrupt Mask */\n#define DEVEPTIMR_KILLBK_Pos          13                                             /**< (DEVEPTIMR) Kill IN Bank Position */\n#define DEVEPTIMR_KILLBK              (_U_(0x1) << DEVEPTIMR_KILLBK_Pos)       /**< (DEVEPTIMR) Kill IN Bank Mask */\n#define DEVEPTIMR_FIFOCON_Pos         14                                             /**< (DEVEPTIMR) FIFO Control Position */\n#define DEVEPTIMR_FIFOCON             (_U_(0x1) << DEVEPTIMR_FIFOCON_Pos)      /**< (DEVEPTIMR) FIFO Control Mask */\n#define DEVEPTIMR_EPDISHDMA_Pos       16                                             /**< (DEVEPTIMR) Endpoint Interrupts Disable HDMA Request Position */\n#define DEVEPTIMR_EPDISHDMA           (_U_(0x1) << DEVEPTIMR_EPDISHDMA_Pos)    /**< (DEVEPTIMR) Endpoint Interrupts Disable HDMA Request Mask */\n#define DEVEPTIMR_RSTDT_Pos           18                                             /**< (DEVEPTIMR) Reset Data Toggle Position */\n#define DEVEPTIMR_RSTDT               (_U_(0x1) << DEVEPTIMR_RSTDT_Pos)        /**< (DEVEPTIMR) Reset Data Toggle Mask */\n#define DEVEPTIMR_Msk                 _U_(0x570A3)                                   /**< (DEVEPTIMR) Register Mask  */\n\n/* CTRL mode */\n#define DEVEPTIMR_CTRL_RXSTPE_Pos     2                                              /**< (DEVEPTIMR) Received SETUP Interrupt Position */\n#define DEVEPTIMR_CTRL_RXSTPE         (_U_(0x1) << DEVEPTIMR_CTRL_RXSTPE_Pos)  /**< (DEVEPTIMR) Received SETUP Interrupt Mask */\n#define DEVEPTIMR_CTRL_NAKOUTE_Pos    3                                              /**< (DEVEPTIMR) NAKed OUT Interrupt Position */\n#define DEVEPTIMR_CTRL_NAKOUTE        (_U_(0x1) << DEVEPTIMR_CTRL_NAKOUTE_Pos)  /**< (DEVEPTIMR) NAKed OUT Interrupt Mask */\n#define DEVEPTIMR_CTRL_NAKINE_Pos     4                                              /**< (DEVEPTIMR) NAKed IN Interrupt Position */\n#define DEVEPTIMR_CTRL_NAKINE         (_U_(0x1) << DEVEPTIMR_CTRL_NAKINE_Pos)  /**< (DEVEPTIMR) NAKed IN Interrupt Mask */\n#define DEVEPTIMR_CTRL_STALLEDE_Pos   6                                              /**< (DEVEPTIMR) STALLed Interrupt Position */\n#define DEVEPTIMR_CTRL_STALLEDE       (_U_(0x1) << DEVEPTIMR_CTRL_STALLEDE_Pos)  /**< (DEVEPTIMR) STALLed Interrupt Mask */\n#define DEVEPTIMR_CTRL_NYETDIS_Pos    17                                             /**< (DEVEPTIMR) NYET Token Disable Position */\n#define DEVEPTIMR_CTRL_NYETDIS        (_U_(0x1) << DEVEPTIMR_CTRL_NYETDIS_Pos)  /**< (DEVEPTIMR) NYET Token Disable Mask */\n#define DEVEPTIMR_CTRL_STALLRQ_Pos    19                                             /**< (DEVEPTIMR) STALL Request Position */\n#define DEVEPTIMR_CTRL_STALLRQ        (_U_(0x1) << DEVEPTIMR_CTRL_STALLRQ_Pos)  /**< (DEVEPTIMR) STALL Request Mask */\n#define DEVEPTIMR_CTRL_Msk            _U_(0xA005C)                                   /**< (DEVEPTIMR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define DEVEPTIMR_ISO_UNDERFE_Pos     2                                              /**< (DEVEPTIMR) Underflow Interrupt Position */\n#define DEVEPTIMR_ISO_UNDERFE         (_U_(0x1) << DEVEPTIMR_ISO_UNDERFE_Pos)  /**< (DEVEPTIMR) Underflow Interrupt Mask */\n#define DEVEPTIMR_ISO_HBISOINERRE_Pos 3                                              /**< (DEVEPTIMR) High Bandwidth Isochronous IN Underflow Error Interrupt Position */\n#define DEVEPTIMR_ISO_HBISOINERRE     (_U_(0x1) << DEVEPTIMR_ISO_HBISOINERRE_Pos)  /**< (DEVEPTIMR) High Bandwidth Isochronous IN Underflow Error Interrupt Mask */\n#define DEVEPTIMR_ISO_HBISOFLUSHE_Pos 4                                              /**< (DEVEPTIMR) High Bandwidth Isochronous IN Flush Interrupt Position */\n#define DEVEPTIMR_ISO_HBISOFLUSHE     (_U_(0x1) << DEVEPTIMR_ISO_HBISOFLUSHE_Pos)  /**< (DEVEPTIMR) High Bandwidth Isochronous IN Flush Interrupt Mask */\n#define DEVEPTIMR_ISO_CRCERRE_Pos     6                                              /**< (DEVEPTIMR) CRC Error Interrupt Position */\n#define DEVEPTIMR_ISO_CRCERRE         (_U_(0x1) << DEVEPTIMR_ISO_CRCERRE_Pos)  /**< (DEVEPTIMR) CRC Error Interrupt Mask */\n#define DEVEPTIMR_ISO_MDATAE_Pos      8                                              /**< (DEVEPTIMR) MData Interrupt Position */\n#define DEVEPTIMR_ISO_MDATAE          (_U_(0x1) << DEVEPTIMR_ISO_MDATAE_Pos)   /**< (DEVEPTIMR) MData Interrupt Mask */\n#define DEVEPTIMR_ISO_DATAXE_Pos      9                                              /**< (DEVEPTIMR) DataX Interrupt Position */\n#define DEVEPTIMR_ISO_DATAXE          (_U_(0x1) << DEVEPTIMR_ISO_DATAXE_Pos)   /**< (DEVEPTIMR) DataX Interrupt Mask */\n#define DEVEPTIMR_ISO_ERRORTRANSE_Pos 10                                             /**< (DEVEPTIMR) Transaction Error Interrupt Position */\n#define DEVEPTIMR_ISO_ERRORTRANSE     (_U_(0x1) << DEVEPTIMR_ISO_ERRORTRANSE_Pos)  /**< (DEVEPTIMR) Transaction Error Interrupt Mask */\n#define DEVEPTIMR_ISO_Msk             _U_(0x75C)                                     /**< (DEVEPTIMR_ISO) Register Mask  */\n\n/* BLK mode */\n#define DEVEPTIMR_BLK_RXSTPE_Pos      2                                              /**< (DEVEPTIMR) Received SETUP Interrupt Position */\n#define DEVEPTIMR_BLK_RXSTPE          (_U_(0x1) << DEVEPTIMR_BLK_RXSTPE_Pos)   /**< (DEVEPTIMR) Received SETUP Interrupt Mask */\n#define DEVEPTIMR_BLK_NAKOUTE_Pos     3                                              /**< (DEVEPTIMR) NAKed OUT Interrupt Position */\n#define DEVEPTIMR_BLK_NAKOUTE         (_U_(0x1) << DEVEPTIMR_BLK_NAKOUTE_Pos)  /**< (DEVEPTIMR) NAKed OUT Interrupt Mask */\n#define DEVEPTIMR_BLK_NAKINE_Pos      4                                              /**< (DEVEPTIMR) NAKed IN Interrupt Position */\n#define DEVEPTIMR_BLK_NAKINE          (_U_(0x1) << DEVEPTIMR_BLK_NAKINE_Pos)   /**< (DEVEPTIMR) NAKed IN Interrupt Mask */\n#define DEVEPTIMR_BLK_STALLEDE_Pos    6                                              /**< (DEVEPTIMR) STALLed Interrupt Position */\n#define DEVEPTIMR_BLK_STALLEDE        (_U_(0x1) << DEVEPTIMR_BLK_STALLEDE_Pos)  /**< (DEVEPTIMR) STALLed Interrupt Mask */\n#define DEVEPTIMR_BLK_NYETDIS_Pos     17                                             /**< (DEVEPTIMR) NYET Token Disable Position */\n#define DEVEPTIMR_BLK_NYETDIS         (_U_(0x1) << DEVEPTIMR_BLK_NYETDIS_Pos)  /**< (DEVEPTIMR) NYET Token Disable Mask */\n#define DEVEPTIMR_BLK_STALLRQ_Pos     19                                             /**< (DEVEPTIMR) STALL Request Position */\n#define DEVEPTIMR_BLK_STALLRQ         (_U_(0x1) << DEVEPTIMR_BLK_STALLRQ_Pos)  /**< (DEVEPTIMR) STALL Request Mask */\n#define DEVEPTIMR_BLK_Msk             _U_(0xA005C)                                   /**< (DEVEPTIMR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define DEVEPTIMR_INTRPT_RXSTPE_Pos   2                                              /**< (DEVEPTIMR) Received SETUP Interrupt Position */\n#define DEVEPTIMR_INTRPT_RXSTPE       (_U_(0x1) << DEVEPTIMR_INTRPT_RXSTPE_Pos)  /**< (DEVEPTIMR) Received SETUP Interrupt Mask */\n#define DEVEPTIMR_INTRPT_NAKOUTE_Pos  3                                              /**< (DEVEPTIMR) NAKed OUT Interrupt Position */\n#define DEVEPTIMR_INTRPT_NAKOUTE      (_U_(0x1) << DEVEPTIMR_INTRPT_NAKOUTE_Pos)  /**< (DEVEPTIMR) NAKed OUT Interrupt Mask */\n#define DEVEPTIMR_INTRPT_NAKINE_Pos   4                                              /**< (DEVEPTIMR) NAKed IN Interrupt Position */\n#define DEVEPTIMR_INTRPT_NAKINE       (_U_(0x1) << DEVEPTIMR_INTRPT_NAKINE_Pos)  /**< (DEVEPTIMR) NAKed IN Interrupt Mask */\n#define DEVEPTIMR_INTRPT_STALLEDE_Pos 6                                              /**< (DEVEPTIMR) STALLed Interrupt Position */\n#define DEVEPTIMR_INTRPT_STALLEDE     (_U_(0x1) << DEVEPTIMR_INTRPT_STALLEDE_Pos)  /**< (DEVEPTIMR) STALLed Interrupt Mask */\n#define DEVEPTIMR_INTRPT_NYETDIS_Pos  17                                             /**< (DEVEPTIMR) NYET Token Disable Position */\n#define DEVEPTIMR_INTRPT_NYETDIS      (_U_(0x1) << DEVEPTIMR_INTRPT_NYETDIS_Pos)  /**< (DEVEPTIMR) NYET Token Disable Mask */\n#define DEVEPTIMR_INTRPT_STALLRQ_Pos  19                                             /**< (DEVEPTIMR) STALL Request Position */\n#define DEVEPTIMR_INTRPT_STALLRQ      (_U_(0x1) << DEVEPTIMR_INTRPT_STALLRQ_Pos)  /**< (DEVEPTIMR) STALL Request Mask */\n#define DEVEPTIMR_INTRPT_Msk          _U_(0xA005C)                                   /**< (DEVEPTIMR_INTRPT) Register Mask  */\n\n\n/* -------- DEVEPTIER : (USBHS Offset: 0x1f0) (/W 32) Device Endpoint Interrupt Enable Register -------- */\n\n#define DEVEPTIER_OFFSET              (0x1F0)                                       /**<  (DEVEPTIER) Device Endpoint Interrupt Enable Register  Offset */\n\n#define DEVEPTIER_TXINES_Pos          0                                              /**< (DEVEPTIER) Transmitted IN Data Interrupt Enable Position */\n#define DEVEPTIER_TXINES              (_U_(0x1) << DEVEPTIER_TXINES_Pos)       /**< (DEVEPTIER) Transmitted IN Data Interrupt Enable Mask */\n#define DEVEPTIER_RXOUTES_Pos         1                                              /**< (DEVEPTIER) Received OUT Data Interrupt Enable Position */\n#define DEVEPTIER_RXOUTES             (_U_(0x1) << DEVEPTIER_RXOUTES_Pos)      /**< (DEVEPTIER) Received OUT Data Interrupt Enable Mask */\n#define DEVEPTIER_OVERFES_Pos         5                                              /**< (DEVEPTIER) Overflow Interrupt Enable Position */\n#define DEVEPTIER_OVERFES             (_U_(0x1) << DEVEPTIER_OVERFES_Pos)      /**< (DEVEPTIER) Overflow Interrupt Enable Mask */\n#define DEVEPTIER_SHORTPACKETES_Pos   7                                              /**< (DEVEPTIER) Short Packet Interrupt Enable Position */\n#define DEVEPTIER_SHORTPACKETES       (_U_(0x1) << DEVEPTIER_SHORTPACKETES_Pos)  /**< (DEVEPTIER) Short Packet Interrupt Enable Mask */\n#define DEVEPTIER_NBUSYBKES_Pos       12                                             /**< (DEVEPTIER) Number of Busy Banks Interrupt Enable Position */\n#define DEVEPTIER_NBUSYBKES           (_U_(0x1) << DEVEPTIER_NBUSYBKES_Pos)    /**< (DEVEPTIER) Number of Busy Banks Interrupt Enable Mask */\n#define DEVEPTIER_KILLBKS_Pos         13                                             /**< (DEVEPTIER) Kill IN Bank Position */\n#define DEVEPTIER_KILLBKS             (_U_(0x1) << DEVEPTIER_KILLBKS_Pos)      /**< (DEVEPTIER) Kill IN Bank Mask */\n#define DEVEPTIER_FIFOCONS_Pos        14                                             /**< (DEVEPTIER) FIFO Control Position */\n#define DEVEPTIER_FIFOCONS            (_U_(0x1) << DEVEPTIER_FIFOCONS_Pos)     /**< (DEVEPTIER) FIFO Control Mask */\n#define DEVEPTIER_EPDISHDMAS_Pos      16                                             /**< (DEVEPTIER) Endpoint Interrupts Disable HDMA Request Enable Position */\n#define DEVEPTIER_EPDISHDMAS          (_U_(0x1) << DEVEPTIER_EPDISHDMAS_Pos)   /**< (DEVEPTIER) Endpoint Interrupts Disable HDMA Request Enable Mask */\n#define DEVEPTIER_RSTDTS_Pos          18                                             /**< (DEVEPTIER) Reset Data Toggle Enable Position */\n#define DEVEPTIER_RSTDTS              (_U_(0x1) << DEVEPTIER_RSTDTS_Pos)       /**< (DEVEPTIER) Reset Data Toggle Enable Mask */\n#define DEVEPTIER_Msk                 _U_(0x570A3)                                   /**< (DEVEPTIER) Register Mask  */\n\n/* CTRL mode */\n#define DEVEPTIER_CTRL_RXSTPES_Pos    2                                              /**< (DEVEPTIER) Received SETUP Interrupt Enable Position */\n#define DEVEPTIER_CTRL_RXSTPES        (_U_(0x1) << DEVEPTIER_CTRL_RXSTPES_Pos)  /**< (DEVEPTIER) Received SETUP Interrupt Enable Mask */\n#define DEVEPTIER_CTRL_NAKOUTES_Pos   3                                              /**< (DEVEPTIER) NAKed OUT Interrupt Enable Position */\n#define DEVEPTIER_CTRL_NAKOUTES       (_U_(0x1) << DEVEPTIER_CTRL_NAKOUTES_Pos)  /**< (DEVEPTIER) NAKed OUT Interrupt Enable Mask */\n#define DEVEPTIER_CTRL_NAKINES_Pos    4                                              /**< (DEVEPTIER) NAKed IN Interrupt Enable Position */\n#define DEVEPTIER_CTRL_NAKINES        (_U_(0x1) << DEVEPTIER_CTRL_NAKINES_Pos)  /**< (DEVEPTIER) NAKed IN Interrupt Enable Mask */\n#define DEVEPTIER_CTRL_STALLEDES_Pos  6                                              /**< (DEVEPTIER) STALLed Interrupt Enable Position */\n#define DEVEPTIER_CTRL_STALLEDES      (_U_(0x1) << DEVEPTIER_CTRL_STALLEDES_Pos)  /**< (DEVEPTIER) STALLed Interrupt Enable Mask */\n#define DEVEPTIER_CTRL_NYETDISS_Pos   17                                             /**< (DEVEPTIER) NYET Token Disable Enable Position */\n#define DEVEPTIER_CTRL_NYETDISS       (_U_(0x1) << DEVEPTIER_CTRL_NYETDISS_Pos)  /**< (DEVEPTIER) NYET Token Disable Enable Mask */\n#define DEVEPTIER_CTRL_STALLRQS_Pos   19                                             /**< (DEVEPTIER) STALL Request Enable Position */\n#define DEVEPTIER_CTRL_STALLRQS       (_U_(0x1) << DEVEPTIER_CTRL_STALLRQS_Pos)  /**< (DEVEPTIER) STALL Request Enable Mask */\n#define DEVEPTIER_CTRL_Msk            _U_(0xA005C)                                   /**< (DEVEPTIER_CTRL) Register Mask  */\n\n/* ISO mode */\n#define DEVEPTIER_ISO_UNDERFES_Pos    2                                              /**< (DEVEPTIER) Underflow Interrupt Enable Position */\n#define DEVEPTIER_ISO_UNDERFES        (_U_(0x1) << DEVEPTIER_ISO_UNDERFES_Pos)  /**< (DEVEPTIER) Underflow Interrupt Enable Mask */\n#define DEVEPTIER_ISO_HBISOINERRES_Pos 3                                              /**< (DEVEPTIER) High Bandwidth Isochronous IN Underflow Error Interrupt Enable Position */\n#define DEVEPTIER_ISO_HBISOINERRES     (_U_(0x1) << DEVEPTIER_ISO_HBISOINERRES_Pos)  /**< (DEVEPTIER) High Bandwidth Isochronous IN Underflow Error Interrupt Enable Mask */\n#define DEVEPTIER_ISO_HBISOFLUSHES_Pos 4                                              /**< (DEVEPTIER) High Bandwidth Isochronous IN Flush Interrupt Enable Position */\n#define DEVEPTIER_ISO_HBISOFLUSHES     (_U_(0x1) << DEVEPTIER_ISO_HBISOFLUSHES_Pos)  /**< (DEVEPTIER) High Bandwidth Isochronous IN Flush Interrupt Enable Mask */\n#define DEVEPTIER_ISO_CRCERRES_Pos    6                                              /**< (DEVEPTIER) CRC Error Interrupt Enable Position */\n#define DEVEPTIER_ISO_CRCERRES        (_U_(0x1) << DEVEPTIER_ISO_CRCERRES_Pos)  /**< (DEVEPTIER) CRC Error Interrupt Enable Mask */\n#define DEVEPTIER_ISO_MDATAES_Pos     8                                              /**< (DEVEPTIER) MData Interrupt Enable Position */\n#define DEVEPTIER_ISO_MDATAES         (_U_(0x1) << DEVEPTIER_ISO_MDATAES_Pos)  /**< (DEVEPTIER) MData Interrupt Enable Mask */\n#define DEVEPTIER_ISO_DATAXES_Pos     9                                              /**< (DEVEPTIER) DataX Interrupt Enable Position */\n#define DEVEPTIER_ISO_DATAXES         (_U_(0x1) << DEVEPTIER_ISO_DATAXES_Pos)  /**< (DEVEPTIER) DataX Interrupt Enable Mask */\n#define DEVEPTIER_ISO_ERRORTRANSES_Pos 10                                             /**< (DEVEPTIER) Transaction Error Interrupt Enable Position */\n#define DEVEPTIER_ISO_ERRORTRANSES     (_U_(0x1) << DEVEPTIER_ISO_ERRORTRANSES_Pos)  /**< (DEVEPTIER) Transaction Error Interrupt Enable Mask */\n#define DEVEPTIER_ISO_Msk             _U_(0x75C)                                     /**< (DEVEPTIER_ISO) Register Mask  */\n\n/* BLK mode */\n#define DEVEPTIER_BLK_RXSTPES_Pos     2                                              /**< (DEVEPTIER) Received SETUP Interrupt Enable Position */\n#define DEVEPTIER_BLK_RXSTPES         (_U_(0x1) << DEVEPTIER_BLK_RXSTPES_Pos)  /**< (DEVEPTIER) Received SETUP Interrupt Enable Mask */\n#define DEVEPTIER_BLK_NAKOUTES_Pos    3                                              /**< (DEVEPTIER) NAKed OUT Interrupt Enable Position */\n#define DEVEPTIER_BLK_NAKOUTES        (_U_(0x1) << DEVEPTIER_BLK_NAKOUTES_Pos)  /**< (DEVEPTIER) NAKed OUT Interrupt Enable Mask */\n#define DEVEPTIER_BLK_NAKINES_Pos     4                                              /**< (DEVEPTIER) NAKed IN Interrupt Enable Position */\n#define DEVEPTIER_BLK_NAKINES         (_U_(0x1) << DEVEPTIER_BLK_NAKINES_Pos)  /**< (DEVEPTIER) NAKed IN Interrupt Enable Mask */\n#define DEVEPTIER_BLK_STALLEDES_Pos   6                                              /**< (DEVEPTIER) STALLed Interrupt Enable Position */\n#define DEVEPTIER_BLK_STALLEDES       (_U_(0x1) << DEVEPTIER_BLK_STALLEDES_Pos)  /**< (DEVEPTIER) STALLed Interrupt Enable Mask */\n#define DEVEPTIER_BLK_NYETDISS_Pos    17                                             /**< (DEVEPTIER) NYET Token Disable Enable Position */\n#define DEVEPTIER_BLK_NYETDISS        (_U_(0x1) << DEVEPTIER_BLK_NYETDISS_Pos)  /**< (DEVEPTIER) NYET Token Disable Enable Mask */\n#define DEVEPTIER_BLK_STALLRQS_Pos    19                                             /**< (DEVEPTIER) STALL Request Enable Position */\n#define DEVEPTIER_BLK_STALLRQS        (_U_(0x1) << DEVEPTIER_BLK_STALLRQS_Pos)  /**< (DEVEPTIER) STALL Request Enable Mask */\n#define DEVEPTIER_BLK_Msk             _U_(0xA005C)                                   /**< (DEVEPTIER_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define DEVEPTIER_INTRPT_RXSTPES_Pos  2                                              /**< (DEVEPTIER) Received SETUP Interrupt Enable Position */\n#define DEVEPTIER_INTRPT_RXSTPES      (_U_(0x1) << DEVEPTIER_INTRPT_RXSTPES_Pos)  /**< (DEVEPTIER) Received SETUP Interrupt Enable Mask */\n#define DEVEPTIER_INTRPT_NAKOUTES_Pos 3                                              /**< (DEVEPTIER) NAKed OUT Interrupt Enable Position */\n#define DEVEPTIER_INTRPT_NAKOUTES     (_U_(0x1) << DEVEPTIER_INTRPT_NAKOUTES_Pos)  /**< (DEVEPTIER) NAKed OUT Interrupt Enable Mask */\n#define DEVEPTIER_INTRPT_NAKINES_Pos  4                                              /**< (DEVEPTIER) NAKed IN Interrupt Enable Position */\n#define DEVEPTIER_INTRPT_NAKINES      (_U_(0x1) << DEVEPTIER_INTRPT_NAKINES_Pos)  /**< (DEVEPTIER) NAKed IN Interrupt Enable Mask */\n#define DEVEPTIER_INTRPT_STALLEDES_Pos 6                                              /**< (DEVEPTIER) STALLed Interrupt Enable Position */\n#define DEVEPTIER_INTRPT_STALLEDES     (_U_(0x1) << DEVEPTIER_INTRPT_STALLEDES_Pos)  /**< (DEVEPTIER) STALLed Interrupt Enable Mask */\n#define DEVEPTIER_INTRPT_NYETDISS_Pos 17                                             /**< (DEVEPTIER) NYET Token Disable Enable Position */\n#define DEVEPTIER_INTRPT_NYETDISS     (_U_(0x1) << DEVEPTIER_INTRPT_NYETDISS_Pos)  /**< (DEVEPTIER) NYET Token Disable Enable Mask */\n#define DEVEPTIER_INTRPT_STALLRQS_Pos 19                                             /**< (DEVEPTIER) STALL Request Enable Position */\n#define DEVEPTIER_INTRPT_STALLRQS     (_U_(0x1) << DEVEPTIER_INTRPT_STALLRQS_Pos)  /**< (DEVEPTIER) STALL Request Enable Mask */\n#define DEVEPTIER_INTRPT_Msk          _U_(0xA005C)                                   /**< (DEVEPTIER_INTRPT) Register Mask  */\n\n\n/* -------- DEVEPTIDR : (USBHS Offset: 0x220) (/W 32) Device Endpoint Interrupt Disable Register -------- */\n\n#define DEVEPTIDR_OFFSET              (0x220)                                       /**<  (DEVEPTIDR) Device Endpoint Interrupt Disable Register  Offset */\n\n#define DEVEPTIDR_TXINEC_Pos          0                                              /**< (DEVEPTIDR) Transmitted IN Interrupt Clear Position */\n#define DEVEPTIDR_TXINEC              (_U_(0x1) << DEVEPTIDR_TXINEC_Pos)       /**< (DEVEPTIDR) Transmitted IN Interrupt Clear Mask */\n#define DEVEPTIDR_RXOUTEC_Pos         1                                              /**< (DEVEPTIDR) Received OUT Data Interrupt Clear Position */\n#define DEVEPTIDR_RXOUTEC             (_U_(0x1) << DEVEPTIDR_RXOUTEC_Pos)      /**< (DEVEPTIDR) Received OUT Data Interrupt Clear Mask */\n#define DEVEPTIDR_OVERFEC_Pos         5                                              /**< (DEVEPTIDR) Overflow Interrupt Clear Position */\n#define DEVEPTIDR_OVERFEC             (_U_(0x1) << DEVEPTIDR_OVERFEC_Pos)      /**< (DEVEPTIDR) Overflow Interrupt Clear Mask */\n#define DEVEPTIDR_SHORTPACKETEC_Pos   7                                              /**< (DEVEPTIDR) Shortpacket Interrupt Clear Position */\n#define DEVEPTIDR_SHORTPACKETEC       (_U_(0x1) << DEVEPTIDR_SHORTPACKETEC_Pos)  /**< (DEVEPTIDR) Shortpacket Interrupt Clear Mask */\n#define DEVEPTIDR_NBUSYBKEC_Pos       12                                             /**< (DEVEPTIDR) Number of Busy Banks Interrupt Clear Position */\n#define DEVEPTIDR_NBUSYBKEC           (_U_(0x1) << DEVEPTIDR_NBUSYBKEC_Pos)    /**< (DEVEPTIDR) Number of Busy Banks Interrupt Clear Mask */\n#define DEVEPTIDR_FIFOCONC_Pos        14                                             /**< (DEVEPTIDR) FIFO Control Clear Position */\n#define DEVEPTIDR_FIFOCONC            (_U_(0x1) << DEVEPTIDR_FIFOCONC_Pos)     /**< (DEVEPTIDR) FIFO Control Clear Mask */\n#define DEVEPTIDR_EPDISHDMAC_Pos      16                                             /**< (DEVEPTIDR) Endpoint Interrupts Disable HDMA Request Clear Position */\n#define DEVEPTIDR_EPDISHDMAC          (_U_(0x1) << DEVEPTIDR_EPDISHDMAC_Pos)   /**< (DEVEPTIDR) Endpoint Interrupts Disable HDMA Request Clear Mask */\n#define DEVEPTIDR_Msk                 _U_(0x150A3)                                   /**< (DEVEPTIDR) Register Mask  */\n\n/* CTRL mode */\n#define DEVEPTIDR_CTRL_RXSTPEC_Pos    2                                              /**< (DEVEPTIDR) Received SETUP Interrupt Clear Position */\n#define DEVEPTIDR_CTRL_RXSTPEC        (_U_(0x1) << DEVEPTIDR_CTRL_RXSTPEC_Pos)  /**< (DEVEPTIDR) Received SETUP Interrupt Clear Mask */\n#define DEVEPTIDR_CTRL_NAKOUTEC_Pos   3                                              /**< (DEVEPTIDR) NAKed OUT Interrupt Clear Position */\n#define DEVEPTIDR_CTRL_NAKOUTEC       (_U_(0x1) << DEVEPTIDR_CTRL_NAKOUTEC_Pos)  /**< (DEVEPTIDR) NAKed OUT Interrupt Clear Mask */\n#define DEVEPTIDR_CTRL_NAKINEC_Pos    4                                              /**< (DEVEPTIDR) NAKed IN Interrupt Clear Position */\n#define DEVEPTIDR_CTRL_NAKINEC        (_U_(0x1) << DEVEPTIDR_CTRL_NAKINEC_Pos)  /**< (DEVEPTIDR) NAKed IN Interrupt Clear Mask */\n#define DEVEPTIDR_CTRL_STALLEDEC_Pos  6                                              /**< (DEVEPTIDR) STALLed Interrupt Clear Position */\n#define DEVEPTIDR_CTRL_STALLEDEC      (_U_(0x1) << DEVEPTIDR_CTRL_STALLEDEC_Pos)  /**< (DEVEPTIDR) STALLed Interrupt Clear Mask */\n#define DEVEPTIDR_CTRL_NYETDISC_Pos   17                                             /**< (DEVEPTIDR) NYET Token Disable Clear Position */\n#define DEVEPTIDR_CTRL_NYETDISC       (_U_(0x1) << DEVEPTIDR_CTRL_NYETDISC_Pos)  /**< (DEVEPTIDR) NYET Token Disable Clear Mask */\n#define DEVEPTIDR_CTRL_STALLRQC_Pos   19                                             /**< (DEVEPTIDR) STALL Request Clear Position */\n#define DEVEPTIDR_CTRL_STALLRQC       (_U_(0x1) << DEVEPTIDR_CTRL_STALLRQC_Pos)  /**< (DEVEPTIDR) STALL Request Clear Mask */\n#define DEVEPTIDR_CTRL_Msk            _U_(0xA005C)                                   /**< (DEVEPTIDR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define DEVEPTIDR_ISO_UNDERFEC_Pos    2                                              /**< (DEVEPTIDR) Underflow Interrupt Clear Position */\n#define DEVEPTIDR_ISO_UNDERFEC        (_U_(0x1) << DEVEPTIDR_ISO_UNDERFEC_Pos)  /**< (DEVEPTIDR) Underflow Interrupt Clear Mask */\n#define DEVEPTIDR_ISO_HBISOINERREC_Pos 3                                              /**< (DEVEPTIDR) High Bandwidth Isochronous IN Underflow Error Interrupt Clear Position */\n#define DEVEPTIDR_ISO_HBISOINERREC     (_U_(0x1) << DEVEPTIDR_ISO_HBISOINERREC_Pos)  /**< (DEVEPTIDR) High Bandwidth Isochronous IN Underflow Error Interrupt Clear Mask */\n#define DEVEPTIDR_ISO_HBISOFLUSHEC_Pos 4                                              /**< (DEVEPTIDR) High Bandwidth Isochronous IN Flush Interrupt Clear Position */\n#define DEVEPTIDR_ISO_HBISOFLUSHEC     (_U_(0x1) << DEVEPTIDR_ISO_HBISOFLUSHEC_Pos)  /**< (DEVEPTIDR) High Bandwidth Isochronous IN Flush Interrupt Clear Mask */\n#define DEVEPTIDR_ISO_MDATAEC_Pos     8                                              /**< (DEVEPTIDR) MData Interrupt Clear Position */\n#define DEVEPTIDR_ISO_MDATAEC         (_U_(0x1) << DEVEPTIDR_ISO_MDATAEC_Pos)  /**< (DEVEPTIDR) MData Interrupt Clear Mask */\n#define DEVEPTIDR_ISO_DATAXEC_Pos     9                                              /**< (DEVEPTIDR) DataX Interrupt Clear Position */\n#define DEVEPTIDR_ISO_DATAXEC         (_U_(0x1) << DEVEPTIDR_ISO_DATAXEC_Pos)  /**< (DEVEPTIDR) DataX Interrupt Clear Mask */\n#define DEVEPTIDR_ISO_ERRORTRANSEC_Pos 10                                             /**< (DEVEPTIDR) Transaction Error Interrupt Clear Position */\n#define DEVEPTIDR_ISO_ERRORTRANSEC     (_U_(0x1) << DEVEPTIDR_ISO_ERRORTRANSEC_Pos)  /**< (DEVEPTIDR) Transaction Error Interrupt Clear Mask */\n#define DEVEPTIDR_ISO_Msk             _U_(0x71C)                                     /**< (DEVEPTIDR_ISO) Register Mask  */\n\n/* BLK mode */\n#define DEVEPTIDR_BLK_RXSTPEC_Pos     2                                              /**< (DEVEPTIDR) Received SETUP Interrupt Clear Position */\n#define DEVEPTIDR_BLK_RXSTPEC         (_U_(0x1) << DEVEPTIDR_BLK_RXSTPEC_Pos)  /**< (DEVEPTIDR) Received SETUP Interrupt Clear Mask */\n#define DEVEPTIDR_BLK_NAKOUTEC_Pos    3                                              /**< (DEVEPTIDR) NAKed OUT Interrupt Clear Position */\n#define DEVEPTIDR_BLK_NAKOUTEC        (_U_(0x1) << DEVEPTIDR_BLK_NAKOUTEC_Pos)  /**< (DEVEPTIDR) NAKed OUT Interrupt Clear Mask */\n#define DEVEPTIDR_BLK_NAKINEC_Pos     4                                              /**< (DEVEPTIDR) NAKed IN Interrupt Clear Position */\n#define DEVEPTIDR_BLK_NAKINEC         (_U_(0x1) << DEVEPTIDR_BLK_NAKINEC_Pos)  /**< (DEVEPTIDR) NAKed IN Interrupt Clear Mask */\n#define DEVEPTIDR_BLK_STALLEDEC_Pos   6                                              /**< (DEVEPTIDR) STALLed Interrupt Clear Position */\n#define DEVEPTIDR_BLK_STALLEDEC       (_U_(0x1) << DEVEPTIDR_BLK_STALLEDEC_Pos)  /**< (DEVEPTIDR) STALLed Interrupt Clear Mask */\n#define DEVEPTIDR_BLK_NYETDISC_Pos    17                                             /**< (DEVEPTIDR) NYET Token Disable Clear Position */\n#define DEVEPTIDR_BLK_NYETDISC        (_U_(0x1) << DEVEPTIDR_BLK_NYETDISC_Pos)  /**< (DEVEPTIDR) NYET Token Disable Clear Mask */\n#define DEVEPTIDR_BLK_STALLRQC_Pos    19                                             /**< (DEVEPTIDR) STALL Request Clear Position */\n#define DEVEPTIDR_BLK_STALLRQC        (_U_(0x1) << DEVEPTIDR_BLK_STALLRQC_Pos)  /**< (DEVEPTIDR) STALL Request Clear Mask */\n#define DEVEPTIDR_BLK_Msk             _U_(0xA005C)                                   /**< (DEVEPTIDR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define DEVEPTIDR_INTRPT_RXSTPEC_Pos  2                                              /**< (DEVEPTIDR) Received SETUP Interrupt Clear Position */\n#define DEVEPTIDR_INTRPT_RXSTPEC      (_U_(0x1) << DEVEPTIDR_INTRPT_RXSTPEC_Pos)  /**< (DEVEPTIDR) Received SETUP Interrupt Clear Mask */\n#define DEVEPTIDR_INTRPT_NAKOUTEC_Pos 3                                              /**< (DEVEPTIDR) NAKed OUT Interrupt Clear Position */\n#define DEVEPTIDR_INTRPT_NAKOUTEC     (_U_(0x1) << DEVEPTIDR_INTRPT_NAKOUTEC_Pos)  /**< (DEVEPTIDR) NAKed OUT Interrupt Clear Mask */\n#define DEVEPTIDR_INTRPT_NAKINEC_Pos  4                                              /**< (DEVEPTIDR) NAKed IN Interrupt Clear Position */\n#define DEVEPTIDR_INTRPT_NAKINEC      (_U_(0x1) << DEVEPTIDR_INTRPT_NAKINEC_Pos)  /**< (DEVEPTIDR) NAKed IN Interrupt Clear Mask */\n#define DEVEPTIDR_INTRPT_STALLEDEC_Pos 6                                              /**< (DEVEPTIDR) STALLed Interrupt Clear Position */\n#define DEVEPTIDR_INTRPT_STALLEDEC     (_U_(0x1) << DEVEPTIDR_INTRPT_STALLEDEC_Pos)  /**< (DEVEPTIDR) STALLed Interrupt Clear Mask */\n#define DEVEPTIDR_INTRPT_NYETDISC_Pos 17                                             /**< (DEVEPTIDR) NYET Token Disable Clear Position */\n#define DEVEPTIDR_INTRPT_NYETDISC     (_U_(0x1) << DEVEPTIDR_INTRPT_NYETDISC_Pos)  /**< (DEVEPTIDR) NYET Token Disable Clear Mask */\n#define DEVEPTIDR_INTRPT_STALLRQC_Pos 19                                             /**< (DEVEPTIDR) STALL Request Clear Position */\n#define DEVEPTIDR_INTRPT_STALLRQC     (_U_(0x1) << DEVEPTIDR_INTRPT_STALLRQC_Pos)  /**< (DEVEPTIDR) STALL Request Clear Mask */\n#define DEVEPTIDR_INTRPT_Msk          _U_(0xA005C)                                   /**< (DEVEPTIDR_INTRPT) Register Mask  */\n\n\n/* -------- HSTCTRL : (USBHS Offset: 0x400) (R/W 32) Host General Control Register -------- */\n\n#define HSTCTRL_OFFSET                (0x400)                                       /**<  (HSTCTRL) Host General Control Register  Offset */\n\n#define HSTCTRL_SOFE_Pos              8                                              /**< (HSTCTRL) Start of Frame Generation Enable Position */\n#define HSTCTRL_SOFE                  (_U_(0x1) << HSTCTRL_SOFE_Pos)           /**< (HSTCTRL) Start of Frame Generation Enable Mask */\n#define HSTCTRL_RESET_Pos             9                                              /**< (HSTCTRL) Send USB Reset Position */\n#define HSTCTRL_RESET                 (_U_(0x1) << HSTCTRL_RESET_Pos)          /**< (HSTCTRL) Send USB Reset Mask */\n#define HSTCTRL_RESUME_Pos            10                                             /**< (HSTCTRL) Send USB Resume Position */\n#define HSTCTRL_RESUME                (_U_(0x1) << HSTCTRL_RESUME_Pos)         /**< (HSTCTRL) Send USB Resume Mask */\n#define HSTCTRL_SPDCONF_Pos           12                                             /**< (HSTCTRL) Mode Configuration Position */\n#define HSTCTRL_SPDCONF               (_U_(0x3) << HSTCTRL_SPDCONF_Pos)        /**< (HSTCTRL) Mode Configuration Mask */\n#define   HSTCTRL_SPDCONF_NORMAL_Val  _U_(0x0)                                       /**< (HSTCTRL) The host starts in Full-speed mode and performs a high-speed reset to switch to High-speed mode if the downstream peripheral is high-speed capable.  */\n#define   HSTCTRL_SPDCONF_LOW_POWER_Val _U_(0x1)                                       /**< (HSTCTRL) For a better consumption, if high speed is not needed.  */\n#define   HSTCTRL_SPDCONF_HIGH_SPEED_Val _U_(0x2)                                       /**< (HSTCTRL) Forced high speed.  */\n#define   HSTCTRL_SPDCONF_FORCED_FS_Val _U_(0x3)                                       /**< (HSTCTRL) The host remains in Full-speed mode whatever the peripheral speed capability.  */\n#define HSTCTRL_SPDCONF_NORMAL        (HSTCTRL_SPDCONF_NORMAL_Val << HSTCTRL_SPDCONF_Pos)  /**< (HSTCTRL) The host starts in Full-speed mode and performs a high-speed reset to switch to High-speed mode if the downstream peripheral is high-speed capable. Position  */\n#define HSTCTRL_SPDCONF_LOW_POWER     (HSTCTRL_SPDCONF_LOW_POWER_Val << HSTCTRL_SPDCONF_Pos)  /**< (HSTCTRL) For a better consumption, if high speed is not needed. Position  */\n#define HSTCTRL_SPDCONF_HIGH_SPEED    (HSTCTRL_SPDCONF_HIGH_SPEED_Val << HSTCTRL_SPDCONF_Pos)  /**< (HSTCTRL) Forced high speed. Position  */\n#define HSTCTRL_SPDCONF_FORCED_FS     (HSTCTRL_SPDCONF_FORCED_FS_Val << HSTCTRL_SPDCONF_Pos)  /**< (HSTCTRL) The host remains in Full-speed mode whatever the peripheral speed capability. Position  */\n#define HSTCTRL_Msk                   _U_(0x3700)                                    /**< (HSTCTRL) Register Mask  */\n\n\n/* -------- HSTISR : (USBHS Offset: 0x404) (R/ 32) Host Global Interrupt Status Register -------- */\n\n#define HSTISR_OFFSET                 (0x404)                                       /**<  (HSTISR) Host Global Interrupt Status Register  Offset */\n\n#define HSTISR_DCONNI_Pos             0                                              /**< (HSTISR) Device Connection Interrupt Position */\n#define HSTISR_DCONNI                 (_U_(0x1) << HSTISR_DCONNI_Pos)          /**< (HSTISR) Device Connection Interrupt Mask */\n#define HSTISR_DDISCI_Pos             1                                              /**< (HSTISR) Device Disconnection Interrupt Position */\n#define HSTISR_DDISCI                 (_U_(0x1) << HSTISR_DDISCI_Pos)          /**< (HSTISR) Device Disconnection Interrupt Mask */\n#define HSTISR_RSTI_Pos               2                                              /**< (HSTISR) USB Reset Sent Interrupt Position */\n#define HSTISR_RSTI                   (_U_(0x1) << HSTISR_RSTI_Pos)            /**< (HSTISR) USB Reset Sent Interrupt Mask */\n#define HSTISR_RSMEDI_Pos             3                                              /**< (HSTISR) Downstream Resume Sent Interrupt Position */\n#define HSTISR_RSMEDI                 (_U_(0x1) << HSTISR_RSMEDI_Pos)          /**< (HSTISR) Downstream Resume Sent Interrupt Mask */\n#define HSTISR_RXRSMI_Pos             4                                              /**< (HSTISR) Upstream Resume Received Interrupt Position */\n#define HSTISR_RXRSMI                 (_U_(0x1) << HSTISR_RXRSMI_Pos)          /**< (HSTISR) Upstream Resume Received Interrupt Mask */\n#define HSTISR_HSOFI_Pos              5                                              /**< (HSTISR) Host Start of Frame Interrupt Position */\n#define HSTISR_HSOFI                  (_U_(0x1) << HSTISR_HSOFI_Pos)           /**< (HSTISR) Host Start of Frame Interrupt Mask */\n#define HSTISR_HWUPI_Pos              6                                              /**< (HSTISR) Host Wake-Up Interrupt Position */\n#define HSTISR_HWUPI                  (_U_(0x1) << HSTISR_HWUPI_Pos)           /**< (HSTISR) Host Wake-Up Interrupt Mask */\n#define HSTISR_PEP_0_Pos              8                                              /**< (HSTISR) Pipe 0 Interrupt Position */\n#define HSTISR_PEP_0                  (_U_(0x1) << HSTISR_PEP_0_Pos)           /**< (HSTISR) Pipe 0 Interrupt Mask */\n#define HSTISR_PEP_1_Pos              9                                              /**< (HSTISR) Pipe 1 Interrupt Position */\n#define HSTISR_PEP_1                  (_U_(0x1) << HSTISR_PEP_1_Pos)           /**< (HSTISR) Pipe 1 Interrupt Mask */\n#define HSTISR_PEP_2_Pos              10                                             /**< (HSTISR) Pipe 2 Interrupt Position */\n#define HSTISR_PEP_2                  (_U_(0x1) << HSTISR_PEP_2_Pos)           /**< (HSTISR) Pipe 2 Interrupt Mask */\n#define HSTISR_PEP_3_Pos              11                                             /**< (HSTISR) Pipe 3 Interrupt Position */\n#define HSTISR_PEP_3                  (_U_(0x1) << HSTISR_PEP_3_Pos)           /**< (HSTISR) Pipe 3 Interrupt Mask */\n#define HSTISR_PEP_4_Pos              12                                             /**< (HSTISR) Pipe 4 Interrupt Position */\n#define HSTISR_PEP_4                  (_U_(0x1) << HSTISR_PEP_4_Pos)           /**< (HSTISR) Pipe 4 Interrupt Mask */\n#define HSTISR_PEP_5_Pos              13                                             /**< (HSTISR) Pipe 5 Interrupt Position */\n#define HSTISR_PEP_5                  (_U_(0x1) << HSTISR_PEP_5_Pos)           /**< (HSTISR) Pipe 5 Interrupt Mask */\n#define HSTISR_PEP_6_Pos              14                                             /**< (HSTISR) Pipe 6 Interrupt Position */\n#define HSTISR_PEP_6                  (_U_(0x1) << HSTISR_PEP_6_Pos)           /**< (HSTISR) Pipe 6 Interrupt Mask */\n#define HSTISR_PEP_7_Pos              15                                             /**< (HSTISR) Pipe 7 Interrupt Position */\n#define HSTISR_PEP_7                  (_U_(0x1) << HSTISR_PEP_7_Pos)           /**< (HSTISR) Pipe 7 Interrupt Mask */\n#define HSTISR_PEP_8_Pos              16                                             /**< (HSTISR) Pipe 8 Interrupt Position */\n#define HSTISR_PEP_8                  (_U_(0x1) << HSTISR_PEP_8_Pos)           /**< (HSTISR) Pipe 8 Interrupt Mask */\n#define HSTISR_PEP_9_Pos              17                                             /**< (HSTISR) Pipe 9 Interrupt Position */\n#define HSTISR_PEP_9                  (_U_(0x1) << HSTISR_PEP_9_Pos)           /**< (HSTISR) Pipe 9 Interrupt Mask */\n#define HSTISR_DMA_0_Pos              25                                             /**< (HSTISR) DMA Channel 0 Interrupt Position */\n#define HSTISR_DMA_0                  (_U_(0x1) << HSTISR_DMA_0_Pos)           /**< (HSTISR) DMA Channel 0 Interrupt Mask */\n#define HSTISR_DMA_1_Pos              26                                             /**< (HSTISR) DMA Channel 1 Interrupt Position */\n#define HSTISR_DMA_1                  (_U_(0x1) << HSTISR_DMA_1_Pos)           /**< (HSTISR) DMA Channel 1 Interrupt Mask */\n#define HSTISR_DMA_2_Pos              27                                             /**< (HSTISR) DMA Channel 2 Interrupt Position */\n#define HSTISR_DMA_2                  (_U_(0x1) << HSTISR_DMA_2_Pos)           /**< (HSTISR) DMA Channel 2 Interrupt Mask */\n#define HSTISR_DMA_3_Pos              28                                             /**< (HSTISR) DMA Channel 3 Interrupt Position */\n#define HSTISR_DMA_3                  (_U_(0x1) << HSTISR_DMA_3_Pos)           /**< (HSTISR) DMA Channel 3 Interrupt Mask */\n#define HSTISR_DMA_4_Pos              29                                             /**< (HSTISR) DMA Channel 4 Interrupt Position */\n#define HSTISR_DMA_4                  (_U_(0x1) << HSTISR_DMA_4_Pos)           /**< (HSTISR) DMA Channel 4 Interrupt Mask */\n#define HSTISR_DMA_5_Pos              30                                             /**< (HSTISR) DMA Channel 5 Interrupt Position */\n#define HSTISR_DMA_5                  (_U_(0x1) << HSTISR_DMA_5_Pos)           /**< (HSTISR) DMA Channel 5 Interrupt Mask */\n#define HSTISR_DMA_6_Pos              31                                             /**< (HSTISR) DMA Channel 6 Interrupt Position */\n#define HSTISR_DMA_6                  (_U_(0x1) << HSTISR_DMA_6_Pos)           /**< (HSTISR) DMA Channel 6 Interrupt Mask */\n#define HSTISR_Msk                    _U_(0xFE03FF7F)                                /**< (HSTISR) Register Mask  */\n\n#define HSTISR_PEP__Pos               8                                              /**< (HSTISR Position) Pipe x Interrupt */\n#define HSTISR_PEP_                   (_U_(0x3FF) << HSTISR_PEP__Pos)          /**< (HSTISR Mask) PEP_ */\n#define HSTISR_DMA__Pos               25                                             /**< (HSTISR Position) DMA Channel 6 Interrupt */\n#define HSTISR_DMA_                   (_U_(0x7F) << HSTISR_DMA__Pos)           /**< (HSTISR Mask) DMA_ */\n\n/* -------- HSTICR : (USBHS Offset: 0x408) (/W 32) Host Global Interrupt Clear Register -------- */\n\n#define HSTICR_OFFSET                 (0x408)                                       /**<  (HSTICR) Host Global Interrupt Clear Register  Offset */\n\n#define HSTICR_DCONNIC_Pos            0                                              /**< (HSTICR) Device Connection Interrupt Clear Position */\n#define HSTICR_DCONNIC                (_U_(0x1) << HSTICR_DCONNIC_Pos)         /**< (HSTICR) Device Connection Interrupt Clear Mask */\n#define HSTICR_DDISCIC_Pos            1                                              /**< (HSTICR) Device Disconnection Interrupt Clear Position */\n#define HSTICR_DDISCIC                (_U_(0x1) << HSTICR_DDISCIC_Pos)         /**< (HSTICR) Device Disconnection Interrupt Clear Mask */\n#define HSTICR_RSTIC_Pos              2                                              /**< (HSTICR) USB Reset Sent Interrupt Clear Position */\n#define HSTICR_RSTIC                  (_U_(0x1) << HSTICR_RSTIC_Pos)           /**< (HSTICR) USB Reset Sent Interrupt Clear Mask */\n#define HSTICR_RSMEDIC_Pos            3                                              /**< (HSTICR) Downstream Resume Sent Interrupt Clear Position */\n#define HSTICR_RSMEDIC                (_U_(0x1) << HSTICR_RSMEDIC_Pos)         /**< (HSTICR) Downstream Resume Sent Interrupt Clear Mask */\n#define HSTICR_RXRSMIC_Pos            4                                              /**< (HSTICR) Upstream Resume Received Interrupt Clear Position */\n#define HSTICR_RXRSMIC                (_U_(0x1) << HSTICR_RXRSMIC_Pos)         /**< (HSTICR) Upstream Resume Received Interrupt Clear Mask */\n#define HSTICR_HSOFIC_Pos             5                                              /**< (HSTICR) Host Start of Frame Interrupt Clear Position */\n#define HSTICR_HSOFIC                 (_U_(0x1) << HSTICR_HSOFIC_Pos)          /**< (HSTICR) Host Start of Frame Interrupt Clear Mask */\n#define HSTICR_HWUPIC_Pos             6                                              /**< (HSTICR) Host Wake-Up Interrupt Clear Position */\n#define HSTICR_HWUPIC                 (_U_(0x1) << HSTICR_HWUPIC_Pos)          /**< (HSTICR) Host Wake-Up Interrupt Clear Mask */\n#define HSTICR_Msk                    _U_(0x7F)                                      /**< (HSTICR) Register Mask  */\n\n\n/* -------- HSTIFR : (USBHS Offset: 0x40c) (/W 32) Host Global Interrupt Set Register -------- */\n\n#define HSTIFR_OFFSET                 (0x40C)                                       /**<  (HSTIFR) Host Global Interrupt Set Register  Offset */\n\n#define HSTIFR_DCONNIS_Pos            0                                              /**< (HSTIFR) Device Connection Interrupt Set Position */\n#define HSTIFR_DCONNIS                (_U_(0x1) << HSTIFR_DCONNIS_Pos)         /**< (HSTIFR) Device Connection Interrupt Set Mask */\n#define HSTIFR_DDISCIS_Pos            1                                              /**< (HSTIFR) Device Disconnection Interrupt Set Position */\n#define HSTIFR_DDISCIS                (_U_(0x1) << HSTIFR_DDISCIS_Pos)         /**< (HSTIFR) Device Disconnection Interrupt Set Mask */\n#define HSTIFR_RSTIS_Pos              2                                              /**< (HSTIFR) USB Reset Sent Interrupt Set Position */\n#define HSTIFR_RSTIS                  (_U_(0x1) << HSTIFR_RSTIS_Pos)           /**< (HSTIFR) USB Reset Sent Interrupt Set Mask */\n#define HSTIFR_RSMEDIS_Pos            3                                              /**< (HSTIFR) Downstream Resume Sent Interrupt Set Position */\n#define HSTIFR_RSMEDIS                (_U_(0x1) << HSTIFR_RSMEDIS_Pos)         /**< (HSTIFR) Downstream Resume Sent Interrupt Set Mask */\n#define HSTIFR_RXRSMIS_Pos            4                                              /**< (HSTIFR) Upstream Resume Received Interrupt Set Position */\n#define HSTIFR_RXRSMIS                (_U_(0x1) << HSTIFR_RXRSMIS_Pos)         /**< (HSTIFR) Upstream Resume Received Interrupt Set Mask */\n#define HSTIFR_HSOFIS_Pos             5                                              /**< (HSTIFR) Host Start of Frame Interrupt Set Position */\n#define HSTIFR_HSOFIS                 (_U_(0x1) << HSTIFR_HSOFIS_Pos)          /**< (HSTIFR) Host Start of Frame Interrupt Set Mask */\n#define HSTIFR_HWUPIS_Pos             6                                              /**< (HSTIFR) Host Wake-Up Interrupt Set Position */\n#define HSTIFR_HWUPIS                 (_U_(0x1) << HSTIFR_HWUPIS_Pos)          /**< (HSTIFR) Host Wake-Up Interrupt Set Mask */\n#define HSTIFR_DMA_0_Pos              25                                             /**< (HSTIFR) DMA Channel 0 Interrupt Set Position */\n#define HSTIFR_DMA_0                  (_U_(0x1) << HSTIFR_DMA_0_Pos)           /**< (HSTIFR) DMA Channel 0 Interrupt Set Mask */\n#define HSTIFR_DMA_1_Pos              26                                             /**< (HSTIFR) DMA Channel 1 Interrupt Set Position */\n#define HSTIFR_DMA_1                  (_U_(0x1) << HSTIFR_DMA_1_Pos)           /**< (HSTIFR) DMA Channel 1 Interrupt Set Mask */\n#define HSTIFR_DMA_2_Pos              27                                             /**< (HSTIFR) DMA Channel 2 Interrupt Set Position */\n#define HSTIFR_DMA_2                  (_U_(0x1) << HSTIFR_DMA_2_Pos)           /**< (HSTIFR) DMA Channel 2 Interrupt Set Mask */\n#define HSTIFR_DMA_3_Pos              28                                             /**< (HSTIFR) DMA Channel 3 Interrupt Set Position */\n#define HSTIFR_DMA_3                  (_U_(0x1) << HSTIFR_DMA_3_Pos)           /**< (HSTIFR) DMA Channel 3 Interrupt Set Mask */\n#define HSTIFR_DMA_4_Pos              29                                             /**< (HSTIFR) DMA Channel 4 Interrupt Set Position */\n#define HSTIFR_DMA_4                  (_U_(0x1) << HSTIFR_DMA_4_Pos)           /**< (HSTIFR) DMA Channel 4 Interrupt Set Mask */\n#define HSTIFR_DMA_5_Pos              30                                             /**< (HSTIFR) DMA Channel 5 Interrupt Set Position */\n#define HSTIFR_DMA_5                  (_U_(0x1) << HSTIFR_DMA_5_Pos)           /**< (HSTIFR) DMA Channel 5 Interrupt Set Mask */\n#define HSTIFR_DMA_6_Pos              31                                             /**< (HSTIFR) DMA Channel 6 Interrupt Set Position */\n#define HSTIFR_DMA_6                  (_U_(0x1) << HSTIFR_DMA_6_Pos)           /**< (HSTIFR) DMA Channel 6 Interrupt Set Mask */\n#define HSTIFR_Msk                    _U_(0xFE00007F)                                /**< (HSTIFR) Register Mask  */\n\n#define HSTIFR_DMA__Pos               25                                             /**< (HSTIFR Position) DMA Channel 6 Interrupt Set */\n#define HSTIFR_DMA_                   (_U_(0x7F) << HSTIFR_DMA__Pos)           /**< (HSTIFR Mask) DMA_ */\n\n/* -------- HSTIMR : (USBHS Offset: 0x410) (R/ 32) Host Global Interrupt Mask Register -------- */\n\n#define HSTIMR_OFFSET                 (0x410)                                       /**<  (HSTIMR) Host Global Interrupt Mask Register  Offset */\n\n#define HSTIMR_DCONNIE_Pos            0                                              /**< (HSTIMR) Device Connection Interrupt Enable Position */\n#define HSTIMR_DCONNIE                (_U_(0x1) << HSTIMR_DCONNIE_Pos)         /**< (HSTIMR) Device Connection Interrupt Enable Mask */\n#define HSTIMR_DDISCIE_Pos            1                                              /**< (HSTIMR) Device Disconnection Interrupt Enable Position */\n#define HSTIMR_DDISCIE                (_U_(0x1) << HSTIMR_DDISCIE_Pos)         /**< (HSTIMR) Device Disconnection Interrupt Enable Mask */\n#define HSTIMR_RSTIE_Pos              2                                              /**< (HSTIMR) USB Reset Sent Interrupt Enable Position */\n#define HSTIMR_RSTIE                  (_U_(0x1) << HSTIMR_RSTIE_Pos)           /**< (HSTIMR) USB Reset Sent Interrupt Enable Mask */\n#define HSTIMR_RSMEDIE_Pos            3                                              /**< (HSTIMR) Downstream Resume Sent Interrupt Enable Position */\n#define HSTIMR_RSMEDIE                (_U_(0x1) << HSTIMR_RSMEDIE_Pos)         /**< (HSTIMR) Downstream Resume Sent Interrupt Enable Mask */\n#define HSTIMR_RXRSMIE_Pos            4                                              /**< (HSTIMR) Upstream Resume Received Interrupt Enable Position */\n#define HSTIMR_RXRSMIE                (_U_(0x1) << HSTIMR_RXRSMIE_Pos)         /**< (HSTIMR) Upstream Resume Received Interrupt Enable Mask */\n#define HSTIMR_HSOFIE_Pos             5                                              /**< (HSTIMR) Host Start of Frame Interrupt Enable Position */\n#define HSTIMR_HSOFIE                 (_U_(0x1) << HSTIMR_HSOFIE_Pos)          /**< (HSTIMR) Host Start of Frame Interrupt Enable Mask */\n#define HSTIMR_HWUPIE_Pos             6                                              /**< (HSTIMR) Host Wake-Up Interrupt Enable Position */\n#define HSTIMR_HWUPIE                 (_U_(0x1) << HSTIMR_HWUPIE_Pos)          /**< (HSTIMR) Host Wake-Up Interrupt Enable Mask */\n#define HSTIMR_PEP_0_Pos              8                                              /**< (HSTIMR) Pipe 0 Interrupt Enable Position */\n#define HSTIMR_PEP_0                  (_U_(0x1) << HSTIMR_PEP_0_Pos)           /**< (HSTIMR) Pipe 0 Interrupt Enable Mask */\n#define HSTIMR_PEP_1_Pos              9                                              /**< (HSTIMR) Pipe 1 Interrupt Enable Position */\n#define HSTIMR_PEP_1                  (_U_(0x1) << HSTIMR_PEP_1_Pos)           /**< (HSTIMR) Pipe 1 Interrupt Enable Mask */\n#define HSTIMR_PEP_2_Pos              10                                             /**< (HSTIMR) Pipe 2 Interrupt Enable Position */\n#define HSTIMR_PEP_2                  (_U_(0x1) << HSTIMR_PEP_2_Pos)           /**< (HSTIMR) Pipe 2 Interrupt Enable Mask */\n#define HSTIMR_PEP_3_Pos              11                                             /**< (HSTIMR) Pipe 3 Interrupt Enable Position */\n#define HSTIMR_PEP_3                  (_U_(0x1) << HSTIMR_PEP_3_Pos)           /**< (HSTIMR) Pipe 3 Interrupt Enable Mask */\n#define HSTIMR_PEP_4_Pos              12                                             /**< (HSTIMR) Pipe 4 Interrupt Enable Position */\n#define HSTIMR_PEP_4                  (_U_(0x1) << HSTIMR_PEP_4_Pos)           /**< (HSTIMR) Pipe 4 Interrupt Enable Mask */\n#define HSTIMR_PEP_5_Pos              13                                             /**< (HSTIMR) Pipe 5 Interrupt Enable Position */\n#define HSTIMR_PEP_5                  (_U_(0x1) << HSTIMR_PEP_5_Pos)           /**< (HSTIMR) Pipe 5 Interrupt Enable Mask */\n#define HSTIMR_PEP_6_Pos              14                                             /**< (HSTIMR) Pipe 6 Interrupt Enable Position */\n#define HSTIMR_PEP_6                  (_U_(0x1) << HSTIMR_PEP_6_Pos)           /**< (HSTIMR) Pipe 6 Interrupt Enable Mask */\n#define HSTIMR_PEP_7_Pos              15                                             /**< (HSTIMR) Pipe 7 Interrupt Enable Position */\n#define HSTIMR_PEP_7                  (_U_(0x1) << HSTIMR_PEP_7_Pos)           /**< (HSTIMR) Pipe 7 Interrupt Enable Mask */\n#define HSTIMR_PEP_8_Pos              16                                             /**< (HSTIMR) Pipe 8 Interrupt Enable Position */\n#define HSTIMR_PEP_8                  (_U_(0x1) << HSTIMR_PEP_8_Pos)           /**< (HSTIMR) Pipe 8 Interrupt Enable Mask */\n#define HSTIMR_PEP_9_Pos              17                                             /**< (HSTIMR) Pipe 9 Interrupt Enable Position */\n#define HSTIMR_PEP_9                  (_U_(0x1) << HSTIMR_PEP_9_Pos)           /**< (HSTIMR) Pipe 9 Interrupt Enable Mask */\n#define HSTIMR_DMA_0_Pos              25                                             /**< (HSTIMR) DMA Channel 0 Interrupt Enable Position */\n#define HSTIMR_DMA_0                  (_U_(0x1) << HSTIMR_DMA_0_Pos)           /**< (HSTIMR) DMA Channel 0 Interrupt Enable Mask */\n#define HSTIMR_DMA_1_Pos              26                                             /**< (HSTIMR) DMA Channel 1 Interrupt Enable Position */\n#define HSTIMR_DMA_1                  (_U_(0x1) << HSTIMR_DMA_1_Pos)           /**< (HSTIMR) DMA Channel 1 Interrupt Enable Mask */\n#define HSTIMR_DMA_2_Pos              27                                             /**< (HSTIMR) DMA Channel 2 Interrupt Enable Position */\n#define HSTIMR_DMA_2                  (_U_(0x1) << HSTIMR_DMA_2_Pos)           /**< (HSTIMR) DMA Channel 2 Interrupt Enable Mask */\n#define HSTIMR_DMA_3_Pos              28                                             /**< (HSTIMR) DMA Channel 3 Interrupt Enable Position */\n#define HSTIMR_DMA_3                  (_U_(0x1) << HSTIMR_DMA_3_Pos)           /**< (HSTIMR) DMA Channel 3 Interrupt Enable Mask */\n#define HSTIMR_DMA_4_Pos              29                                             /**< (HSTIMR) DMA Channel 4 Interrupt Enable Position */\n#define HSTIMR_DMA_4                  (_U_(0x1) << HSTIMR_DMA_4_Pos)           /**< (HSTIMR) DMA Channel 4 Interrupt Enable Mask */\n#define HSTIMR_DMA_5_Pos              30                                             /**< (HSTIMR) DMA Channel 5 Interrupt Enable Position */\n#define HSTIMR_DMA_5                  (_U_(0x1) << HSTIMR_DMA_5_Pos)           /**< (HSTIMR) DMA Channel 5 Interrupt Enable Mask */\n#define HSTIMR_DMA_6_Pos              31                                             /**< (HSTIMR) DMA Channel 6 Interrupt Enable Position */\n#define HSTIMR_DMA_6                  (_U_(0x1) << HSTIMR_DMA_6_Pos)           /**< (HSTIMR) DMA Channel 6 Interrupt Enable Mask */\n#define HSTIMR_Msk                    _U_(0xFE03FF7F)                                /**< (HSTIMR) Register Mask  */\n\n#define HSTIMR_PEP__Pos               8                                              /**< (HSTIMR Position) Pipe x Interrupt Enable */\n#define HSTIMR_PEP_                   (_U_(0x3FF) << HSTIMR_PEP__Pos)          /**< (HSTIMR Mask) PEP_ */\n#define HSTIMR_DMA__Pos               25                                             /**< (HSTIMR Position) DMA Channel 6 Interrupt Enable */\n#define HSTIMR_DMA_                   (_U_(0x7F) << HSTIMR_DMA__Pos)           /**< (HSTIMR Mask) DMA_ */\n\n/* -------- HSTIDR : (USBHS Offset: 0x414) (/W 32) Host Global Interrupt Disable Register -------- */\n\n#define HSTIDR_OFFSET                 (0x414)                                       /**<  (HSTIDR) Host Global Interrupt Disable Register  Offset */\n\n#define HSTIDR_DCONNIEC_Pos           0                                              /**< (HSTIDR) Device Connection Interrupt Disable Position */\n#define HSTIDR_DCONNIEC               (_U_(0x1) << HSTIDR_DCONNIEC_Pos)        /**< (HSTIDR) Device Connection Interrupt Disable Mask */\n#define HSTIDR_DDISCIEC_Pos           1                                              /**< (HSTIDR) Device Disconnection Interrupt Disable Position */\n#define HSTIDR_DDISCIEC               (_U_(0x1) << HSTIDR_DDISCIEC_Pos)        /**< (HSTIDR) Device Disconnection Interrupt Disable Mask */\n#define HSTIDR_RSTIEC_Pos             2                                              /**< (HSTIDR) USB Reset Sent Interrupt Disable Position */\n#define HSTIDR_RSTIEC                 (_U_(0x1) << HSTIDR_RSTIEC_Pos)          /**< (HSTIDR) USB Reset Sent Interrupt Disable Mask */\n#define HSTIDR_RSMEDIEC_Pos           3                                              /**< (HSTIDR) Downstream Resume Sent Interrupt Disable Position */\n#define HSTIDR_RSMEDIEC               (_U_(0x1) << HSTIDR_RSMEDIEC_Pos)        /**< (HSTIDR) Downstream Resume Sent Interrupt Disable Mask */\n#define HSTIDR_RXRSMIEC_Pos           4                                              /**< (HSTIDR) Upstream Resume Received Interrupt Disable Position */\n#define HSTIDR_RXRSMIEC               (_U_(0x1) << HSTIDR_RXRSMIEC_Pos)        /**< (HSTIDR) Upstream Resume Received Interrupt Disable Mask */\n#define HSTIDR_HSOFIEC_Pos            5                                              /**< (HSTIDR) Host Start of Frame Interrupt Disable Position */\n#define HSTIDR_HSOFIEC                (_U_(0x1) << HSTIDR_HSOFIEC_Pos)         /**< (HSTIDR) Host Start of Frame Interrupt Disable Mask */\n#define HSTIDR_HWUPIEC_Pos            6                                              /**< (HSTIDR) Host Wake-Up Interrupt Disable Position */\n#define HSTIDR_HWUPIEC                (_U_(0x1) << HSTIDR_HWUPIEC_Pos)         /**< (HSTIDR) Host Wake-Up Interrupt Disable Mask */\n#define HSTIDR_PEP_0_Pos              8                                              /**< (HSTIDR) Pipe 0 Interrupt Disable Position */\n#define HSTIDR_PEP_0                  (_U_(0x1) << HSTIDR_PEP_0_Pos)           /**< (HSTIDR) Pipe 0 Interrupt Disable Mask */\n#define HSTIDR_PEP_1_Pos              9                                              /**< (HSTIDR) Pipe 1 Interrupt Disable Position */\n#define HSTIDR_PEP_1                  (_U_(0x1) << HSTIDR_PEP_1_Pos)           /**< (HSTIDR) Pipe 1 Interrupt Disable Mask */\n#define HSTIDR_PEP_2_Pos              10                                             /**< (HSTIDR) Pipe 2 Interrupt Disable Position */\n#define HSTIDR_PEP_2                  (_U_(0x1) << HSTIDR_PEP_2_Pos)           /**< (HSTIDR) Pipe 2 Interrupt Disable Mask */\n#define HSTIDR_PEP_3_Pos              11                                             /**< (HSTIDR) Pipe 3 Interrupt Disable Position */\n#define HSTIDR_PEP_3                  (_U_(0x1) << HSTIDR_PEP_3_Pos)           /**< (HSTIDR) Pipe 3 Interrupt Disable Mask */\n#define HSTIDR_PEP_4_Pos              12                                             /**< (HSTIDR) Pipe 4 Interrupt Disable Position */\n#define HSTIDR_PEP_4                  (_U_(0x1) << HSTIDR_PEP_4_Pos)           /**< (HSTIDR) Pipe 4 Interrupt Disable Mask */\n#define HSTIDR_PEP_5_Pos              13                                             /**< (HSTIDR) Pipe 5 Interrupt Disable Position */\n#define HSTIDR_PEP_5                  (_U_(0x1) << HSTIDR_PEP_5_Pos)           /**< (HSTIDR) Pipe 5 Interrupt Disable Mask */\n#define HSTIDR_PEP_6_Pos              14                                             /**< (HSTIDR) Pipe 6 Interrupt Disable Position */\n#define HSTIDR_PEP_6                  (_U_(0x1) << HSTIDR_PEP_6_Pos)           /**< (HSTIDR) Pipe 6 Interrupt Disable Mask */\n#define HSTIDR_PEP_7_Pos              15                                             /**< (HSTIDR) Pipe 7 Interrupt Disable Position */\n#define HSTIDR_PEP_7                  (_U_(0x1) << HSTIDR_PEP_7_Pos)           /**< (HSTIDR) Pipe 7 Interrupt Disable Mask */\n#define HSTIDR_PEP_8_Pos              16                                             /**< (HSTIDR) Pipe 8 Interrupt Disable Position */\n#define HSTIDR_PEP_8                  (_U_(0x1) << HSTIDR_PEP_8_Pos)           /**< (HSTIDR) Pipe 8 Interrupt Disable Mask */\n#define HSTIDR_PEP_9_Pos              17                                             /**< (HSTIDR) Pipe 9 Interrupt Disable Position */\n#define HSTIDR_PEP_9                  (_U_(0x1) << HSTIDR_PEP_9_Pos)           /**< (HSTIDR) Pipe 9 Interrupt Disable Mask */\n#define HSTIDR_DMA_0_Pos              25                                             /**< (HSTIDR) DMA Channel 0 Interrupt Disable Position */\n#define HSTIDR_DMA_0                  (_U_(0x1) << HSTIDR_DMA_0_Pos)           /**< (HSTIDR) DMA Channel 0 Interrupt Disable Mask */\n#define HSTIDR_DMA_1_Pos              26                                             /**< (HSTIDR) DMA Channel 1 Interrupt Disable Position */\n#define HSTIDR_DMA_1                  (_U_(0x1) << HSTIDR_DMA_1_Pos)           /**< (HSTIDR) DMA Channel 1 Interrupt Disable Mask */\n#define HSTIDR_DMA_2_Pos              27                                             /**< (HSTIDR) DMA Channel 2 Interrupt Disable Position */\n#define HSTIDR_DMA_2                  (_U_(0x1) << HSTIDR_DMA_2_Pos)           /**< (HSTIDR) DMA Channel 2 Interrupt Disable Mask */\n#define HSTIDR_DMA_3_Pos              28                                             /**< (HSTIDR) DMA Channel 3 Interrupt Disable Position */\n#define HSTIDR_DMA_3                  (_U_(0x1) << HSTIDR_DMA_3_Pos)           /**< (HSTIDR) DMA Channel 3 Interrupt Disable Mask */\n#define HSTIDR_DMA_4_Pos              29                                             /**< (HSTIDR) DMA Channel 4 Interrupt Disable Position */\n#define HSTIDR_DMA_4                  (_U_(0x1) << HSTIDR_DMA_4_Pos)           /**< (HSTIDR) DMA Channel 4 Interrupt Disable Mask */\n#define HSTIDR_DMA_5_Pos              30                                             /**< (HSTIDR) DMA Channel 5 Interrupt Disable Position */\n#define HSTIDR_DMA_5                  (_U_(0x1) << HSTIDR_DMA_5_Pos)           /**< (HSTIDR) DMA Channel 5 Interrupt Disable Mask */\n#define HSTIDR_DMA_6_Pos              31                                             /**< (HSTIDR) DMA Channel 6 Interrupt Disable Position */\n#define HSTIDR_DMA_6                  (_U_(0x1) << HSTIDR_DMA_6_Pos)           /**< (HSTIDR) DMA Channel 6 Interrupt Disable Mask */\n#define HSTIDR_Msk                    _U_(0xFE03FF7F)                                /**< (HSTIDR) Register Mask  */\n\n#define HSTIDR_PEP__Pos               8                                              /**< (HSTIDR Position) Pipe x Interrupt Disable */\n#define HSTIDR_PEP_                   (_U_(0x3FF) << HSTIDR_PEP__Pos)          /**< (HSTIDR Mask) PEP_ */\n#define HSTIDR_DMA__Pos               25                                             /**< (HSTIDR Position) DMA Channel 6 Interrupt Disable */\n#define HSTIDR_DMA_                   (_U_(0x7F) << HSTIDR_DMA__Pos)           /**< (HSTIDR Mask) DMA_ */\n\n/* -------- HSTIER : (USBHS Offset: 0x418) (/W 32) Host Global Interrupt Enable Register -------- */\n\n#define HSTIER_OFFSET                 (0x418)                                       /**<  (HSTIER) Host Global Interrupt Enable Register  Offset */\n\n#define HSTIER_DCONNIES_Pos           0                                              /**< (HSTIER) Device Connection Interrupt Enable Position */\n#define HSTIER_DCONNIES               (_U_(0x1) << HSTIER_DCONNIES_Pos)        /**< (HSTIER) Device Connection Interrupt Enable Mask */\n#define HSTIER_DDISCIES_Pos           1                                              /**< (HSTIER) Device Disconnection Interrupt Enable Position */\n#define HSTIER_DDISCIES               (_U_(0x1) << HSTIER_DDISCIES_Pos)        /**< (HSTIER) Device Disconnection Interrupt Enable Mask */\n#define HSTIER_RSTIES_Pos             2                                              /**< (HSTIER) USB Reset Sent Interrupt Enable Position */\n#define HSTIER_RSTIES                 (_U_(0x1) << HSTIER_RSTIES_Pos)          /**< (HSTIER) USB Reset Sent Interrupt Enable Mask */\n#define HSTIER_RSMEDIES_Pos           3                                              /**< (HSTIER) Downstream Resume Sent Interrupt Enable Position */\n#define HSTIER_RSMEDIES               (_U_(0x1) << HSTIER_RSMEDIES_Pos)        /**< (HSTIER) Downstream Resume Sent Interrupt Enable Mask */\n#define HSTIER_RXRSMIES_Pos           4                                              /**< (HSTIER) Upstream Resume Received Interrupt Enable Position */\n#define HSTIER_RXRSMIES               (_U_(0x1) << HSTIER_RXRSMIES_Pos)        /**< (HSTIER) Upstream Resume Received Interrupt Enable Mask */\n#define HSTIER_HSOFIES_Pos            5                                              /**< (HSTIER) Host Start of Frame Interrupt Enable Position */\n#define HSTIER_HSOFIES                (_U_(0x1) << HSTIER_HSOFIES_Pos)         /**< (HSTIER) Host Start of Frame Interrupt Enable Mask */\n#define HSTIER_HWUPIES_Pos            6                                              /**< (HSTIER) Host Wake-Up Interrupt Enable Position */\n#define HSTIER_HWUPIES                (_U_(0x1) << HSTIER_HWUPIES_Pos)         /**< (HSTIER) Host Wake-Up Interrupt Enable Mask */\n#define HSTIER_PEP_0_Pos              8                                              /**< (HSTIER) Pipe 0 Interrupt Enable Position */\n#define HSTIER_PEP_0                  (_U_(0x1) << HSTIER_PEP_0_Pos)           /**< (HSTIER) Pipe 0 Interrupt Enable Mask */\n#define HSTIER_PEP_1_Pos              9                                              /**< (HSTIER) Pipe 1 Interrupt Enable Position */\n#define HSTIER_PEP_1                  (_U_(0x1) << HSTIER_PEP_1_Pos)           /**< (HSTIER) Pipe 1 Interrupt Enable Mask */\n#define HSTIER_PEP_2_Pos              10                                             /**< (HSTIER) Pipe 2 Interrupt Enable Position */\n#define HSTIER_PEP_2                  (_U_(0x1) << HSTIER_PEP_2_Pos)           /**< (HSTIER) Pipe 2 Interrupt Enable Mask */\n#define HSTIER_PEP_3_Pos              11                                             /**< (HSTIER) Pipe 3 Interrupt Enable Position */\n#define HSTIER_PEP_3                  (_U_(0x1) << HSTIER_PEP_3_Pos)           /**< (HSTIER) Pipe 3 Interrupt Enable Mask */\n#define HSTIER_PEP_4_Pos              12                                             /**< (HSTIER) Pipe 4 Interrupt Enable Position */\n#define HSTIER_PEP_4                  (_U_(0x1) << HSTIER_PEP_4_Pos)           /**< (HSTIER) Pipe 4 Interrupt Enable Mask */\n#define HSTIER_PEP_5_Pos              13                                             /**< (HSTIER) Pipe 5 Interrupt Enable Position */\n#define HSTIER_PEP_5                  (_U_(0x1) << HSTIER_PEP_5_Pos)           /**< (HSTIER) Pipe 5 Interrupt Enable Mask */\n#define HSTIER_PEP_6_Pos              14                                             /**< (HSTIER) Pipe 6 Interrupt Enable Position */\n#define HSTIER_PEP_6                  (_U_(0x1) << HSTIER_PEP_6_Pos)           /**< (HSTIER) Pipe 6 Interrupt Enable Mask */\n#define HSTIER_PEP_7_Pos              15                                             /**< (HSTIER) Pipe 7 Interrupt Enable Position */\n#define HSTIER_PEP_7                  (_U_(0x1) << HSTIER_PEP_7_Pos)           /**< (HSTIER) Pipe 7 Interrupt Enable Mask */\n#define HSTIER_PEP_8_Pos              16                                             /**< (HSTIER) Pipe 8 Interrupt Enable Position */\n#define HSTIER_PEP_8                  (_U_(0x1) << HSTIER_PEP_8_Pos)           /**< (HSTIER) Pipe 8 Interrupt Enable Mask */\n#define HSTIER_PEP_9_Pos              17                                             /**< (HSTIER) Pipe 9 Interrupt Enable Position */\n#define HSTIER_PEP_9                  (_U_(0x1) << HSTIER_PEP_9_Pos)           /**< (HSTIER) Pipe 9 Interrupt Enable Mask */\n#define HSTIER_DMA_0_Pos              25                                             /**< (HSTIER) DMA Channel 0 Interrupt Enable Position */\n#define HSTIER_DMA_0                  (_U_(0x1) << HSTIER_DMA_0_Pos)           /**< (HSTIER) DMA Channel 0 Interrupt Enable Mask */\n#define HSTIER_DMA_1_Pos              26                                             /**< (HSTIER) DMA Channel 1 Interrupt Enable Position */\n#define HSTIER_DMA_1                  (_U_(0x1) << HSTIER_DMA_1_Pos)           /**< (HSTIER) DMA Channel 1 Interrupt Enable Mask */\n#define HSTIER_DMA_2_Pos              27                                             /**< (HSTIER) DMA Channel 2 Interrupt Enable Position */\n#define HSTIER_DMA_2                  (_U_(0x1) << HSTIER_DMA_2_Pos)           /**< (HSTIER) DMA Channel 2 Interrupt Enable Mask */\n#define HSTIER_DMA_3_Pos              28                                             /**< (HSTIER) DMA Channel 3 Interrupt Enable Position */\n#define HSTIER_DMA_3                  (_U_(0x1) << HSTIER_DMA_3_Pos)           /**< (HSTIER) DMA Channel 3 Interrupt Enable Mask */\n#define HSTIER_DMA_4_Pos              29                                             /**< (HSTIER) DMA Channel 4 Interrupt Enable Position */\n#define HSTIER_DMA_4                  (_U_(0x1) << HSTIER_DMA_4_Pos)           /**< (HSTIER) DMA Channel 4 Interrupt Enable Mask */\n#define HSTIER_DMA_5_Pos              30                                             /**< (HSTIER) DMA Channel 5 Interrupt Enable Position */\n#define HSTIER_DMA_5                  (_U_(0x1) << HSTIER_DMA_5_Pos)           /**< (HSTIER) DMA Channel 5 Interrupt Enable Mask */\n#define HSTIER_DMA_6_Pos              31                                             /**< (HSTIER) DMA Channel 6 Interrupt Enable Position */\n#define HSTIER_DMA_6                  (_U_(0x1) << HSTIER_DMA_6_Pos)           /**< (HSTIER) DMA Channel 6 Interrupt Enable Mask */\n#define HSTIER_Msk                    _U_(0xFE03FF7F)                                /**< (HSTIER) Register Mask  */\n\n#define HSTIER_PEP__Pos               8                                              /**< (HSTIER Position) Pipe x Interrupt Enable */\n#define HSTIER_PEP_                   (_U_(0x3FF) << HSTIER_PEP__Pos)          /**< (HSTIER Mask) PEP_ */\n#define HSTIER_DMA__Pos               25                                             /**< (HSTIER Position) DMA Channel 6 Interrupt Enable */\n#define HSTIER_DMA_                   (_U_(0x7F) << HSTIER_DMA__Pos)           /**< (HSTIER Mask) DMA_ */\n\n/* -------- HSTPIP : (USBHS Offset: 0x41c) (R/W 32) Host Pipe Register -------- */\n\n#define HSTPIP_OFFSET                 (0x41C)                                       /**<  (HSTPIP) Host Pipe Register  Offset */\n\n#define HSTPIP_PEN0_Pos               0                                              /**< (HSTPIP) Pipe 0 Enable Position */\n#define HSTPIP_PEN0                   (_U_(0x1) << HSTPIP_PEN0_Pos)            /**< (HSTPIP) Pipe 0 Enable Mask */\n#define HSTPIP_PEN1_Pos               1                                              /**< (HSTPIP) Pipe 1 Enable Position */\n#define HSTPIP_PEN1                   (_U_(0x1) << HSTPIP_PEN1_Pos)            /**< (HSTPIP) Pipe 1 Enable Mask */\n#define HSTPIP_PEN2_Pos               2                                              /**< (HSTPIP) Pipe 2 Enable Position */\n#define HSTPIP_PEN2                   (_U_(0x1) << HSTPIP_PEN2_Pos)            /**< (HSTPIP) Pipe 2 Enable Mask */\n#define HSTPIP_PEN3_Pos               3                                              /**< (HSTPIP) Pipe 3 Enable Position */\n#define HSTPIP_PEN3                   (_U_(0x1) << HSTPIP_PEN3_Pos)            /**< (HSTPIP) Pipe 3 Enable Mask */\n#define HSTPIP_PEN4_Pos               4                                              /**< (HSTPIP) Pipe 4 Enable Position */\n#define HSTPIP_PEN4                   (_U_(0x1) << HSTPIP_PEN4_Pos)            /**< (HSTPIP) Pipe 4 Enable Mask */\n#define HSTPIP_PEN5_Pos               5                                              /**< (HSTPIP) Pipe 5 Enable Position */\n#define HSTPIP_PEN5                   (_U_(0x1) << HSTPIP_PEN5_Pos)            /**< (HSTPIP) Pipe 5 Enable Mask */\n#define HSTPIP_PEN6_Pos               6                                              /**< (HSTPIP) Pipe 6 Enable Position */\n#define HSTPIP_PEN6                   (_U_(0x1) << HSTPIP_PEN6_Pos)            /**< (HSTPIP) Pipe 6 Enable Mask */\n#define HSTPIP_PEN7_Pos               7                                              /**< (HSTPIP) Pipe 7 Enable Position */\n#define HSTPIP_PEN7                   (_U_(0x1) << HSTPIP_PEN7_Pos)            /**< (HSTPIP) Pipe 7 Enable Mask */\n#define HSTPIP_PEN8_Pos               8                                              /**< (HSTPIP) Pipe 8 Enable Position */\n#define HSTPIP_PEN8                   (_U_(0x1) << HSTPIP_PEN8_Pos)            /**< (HSTPIP) Pipe 8 Enable Mask */\n#define HSTPIP_PRST0_Pos              16                                             /**< (HSTPIP) Pipe 0 Reset Position */\n#define HSTPIP_PRST0                  (_U_(0x1) << HSTPIP_PRST0_Pos)           /**< (HSTPIP) Pipe 0 Reset Mask */\n#define HSTPIP_PRST1_Pos              17                                             /**< (HSTPIP) Pipe 1 Reset Position */\n#define HSTPIP_PRST1                  (_U_(0x1) << HSTPIP_PRST1_Pos)           /**< (HSTPIP) Pipe 1 Reset Mask */\n#define HSTPIP_PRST2_Pos              18                                             /**< (HSTPIP) Pipe 2 Reset Position */\n#define HSTPIP_PRST2                  (_U_(0x1) << HSTPIP_PRST2_Pos)           /**< (HSTPIP) Pipe 2 Reset Mask */\n#define HSTPIP_PRST3_Pos              19                                             /**< (HSTPIP) Pipe 3 Reset Position */\n#define HSTPIP_PRST3                  (_U_(0x1) << HSTPIP_PRST3_Pos)           /**< (HSTPIP) Pipe 3 Reset Mask */\n#define HSTPIP_PRST4_Pos              20                                             /**< (HSTPIP) Pipe 4 Reset Position */\n#define HSTPIP_PRST4                  (_U_(0x1) << HSTPIP_PRST4_Pos)           /**< (HSTPIP) Pipe 4 Reset Mask */\n#define HSTPIP_PRST5_Pos              21                                             /**< (HSTPIP) Pipe 5 Reset Position */\n#define HSTPIP_PRST5                  (_U_(0x1) << HSTPIP_PRST5_Pos)           /**< (HSTPIP) Pipe 5 Reset Mask */\n#define HSTPIP_PRST6_Pos              22                                             /**< (HSTPIP) Pipe 6 Reset Position */\n#define HSTPIP_PRST6                  (_U_(0x1) << HSTPIP_PRST6_Pos)           /**< (HSTPIP) Pipe 6 Reset Mask */\n#define HSTPIP_PRST7_Pos              23                                             /**< (HSTPIP) Pipe 7 Reset Position */\n#define HSTPIP_PRST7                  (_U_(0x1) << HSTPIP_PRST7_Pos)           /**< (HSTPIP) Pipe 7 Reset Mask */\n#define HSTPIP_PRST8_Pos              24                                             /**< (HSTPIP) Pipe 8 Reset Position */\n#define HSTPIP_PRST8                  (_U_(0x1) << HSTPIP_PRST8_Pos)           /**< (HSTPIP) Pipe 8 Reset Mask */\n#define HSTPIP_Msk                    _U_(0x1FF01FF)                                 /**< (HSTPIP) Register Mask  */\n\n#define HSTPIP_PEN_Pos                0                                              /**< (HSTPIP Position) Pipe x Enable */\n#define HSTPIP_PEN                    (_U_(0x1FF) << HSTPIP_PEN_Pos)           /**< (HSTPIP Mask) PEN */\n#define HSTPIP_PRST_Pos               16                                             /**< (HSTPIP Position) Pipe 8 Reset */\n#define HSTPIP_PRST                   (_U_(0x1FF) << HSTPIP_PRST_Pos)          /**< (HSTPIP Mask) PRST */\n\n/* -------- HSTFNUM : (USBHS Offset: 0x420) (R/W 32) Host Frame Number Register -------- */\n\n#define HSTFNUM_OFFSET                (0x420)                                       /**<  (HSTFNUM) Host Frame Number Register  Offset */\n\n#define HSTFNUM_MFNUM_Pos             0                                              /**< (HSTFNUM) Micro Frame Number Position */\n#define HSTFNUM_MFNUM                 (_U_(0x7) << HSTFNUM_MFNUM_Pos)          /**< (HSTFNUM) Micro Frame Number Mask */\n#define HSTFNUM_FNUM_Pos              3                                              /**< (HSTFNUM) Frame Number Position */\n#define HSTFNUM_FNUM                  (_U_(0x7FF) << HSTFNUM_FNUM_Pos)         /**< (HSTFNUM) Frame Number Mask */\n#define HSTFNUM_FLENHIGH_Pos          16                                             /**< (HSTFNUM) Frame Length Position */\n#define HSTFNUM_FLENHIGH              (_U_(0xFF) << HSTFNUM_FLENHIGH_Pos)      /**< (HSTFNUM) Frame Length Mask */\n#define HSTFNUM_Msk                   _U_(0xFF3FFF)                                  /**< (HSTFNUM) Register Mask  */\n\n\n/* -------- HSTADDR1 : (USBHS Offset: 0x424) (R/W 32) Host Address 1 Register -------- */\n\n#define HSTADDR1_OFFSET               (0x424)                                       /**<  (HSTADDR1) Host Address 1 Register  Offset */\n\n#define HSTADDR1_HSTADDRP0_Pos        0                                              /**< (HSTADDR1) USB Host Address Position */\n#define HSTADDR1_HSTADDRP0            (_U_(0x7F) << HSTADDR1_HSTADDRP0_Pos)    /**< (HSTADDR1) USB Host Address Mask */\n#define HSTADDR1_HSTADDRP1_Pos        8                                              /**< (HSTADDR1) USB Host Address Position */\n#define HSTADDR1_HSTADDRP1            (_U_(0x7F) << HSTADDR1_HSTADDRP1_Pos)    /**< (HSTADDR1) USB Host Address Mask */\n#define HSTADDR1_HSTADDRP2_Pos        16                                             /**< (HSTADDR1) USB Host Address Position */\n#define HSTADDR1_HSTADDRP2            (_U_(0x7F) << HSTADDR1_HSTADDRP2_Pos)    /**< (HSTADDR1) USB Host Address Mask */\n#define HSTADDR1_HSTADDRP3_Pos        24                                             /**< (HSTADDR1) USB Host Address Position */\n#define HSTADDR1_HSTADDRP3            (_U_(0x7F) << HSTADDR1_HSTADDRP3_Pos)    /**< (HSTADDR1) USB Host Address Mask */\n#define HSTADDR1_Msk                  _U_(0x7F7F7F7F)                                /**< (HSTADDR1) Register Mask  */\n\n\n/* -------- HSTADDR2 : (USBHS Offset: 0x428) (R/W 32) Host Address 2 Register -------- */\n\n#define HSTADDR2_OFFSET               (0x428)                                       /**<  (HSTADDR2) Host Address 2 Register  Offset */\n\n#define HSTADDR2_HSTADDRP4_Pos        0                                              /**< (HSTADDR2) USB Host Address Position */\n#define HSTADDR2_HSTADDRP4            (_U_(0x7F) << HSTADDR2_HSTADDRP4_Pos)    /**< (HSTADDR2) USB Host Address Mask */\n#define HSTADDR2_HSTADDRP5_Pos        8                                              /**< (HSTADDR2) USB Host Address Position */\n#define HSTADDR2_HSTADDRP5            (_U_(0x7F) << HSTADDR2_HSTADDRP5_Pos)    /**< (HSTADDR2) USB Host Address Mask */\n#define HSTADDR2_HSTADDRP6_Pos        16                                             /**< (HSTADDR2) USB Host Address Position */\n#define HSTADDR2_HSTADDRP6            (_U_(0x7F) << HSTADDR2_HSTADDRP6_Pos)    /**< (HSTADDR2) USB Host Address Mask */\n#define HSTADDR2_HSTADDRP7_Pos        24                                             /**< (HSTADDR2) USB Host Address Position */\n#define HSTADDR2_HSTADDRP7            (_U_(0x7F) << HSTADDR2_HSTADDRP7_Pos)    /**< (HSTADDR2) USB Host Address Mask */\n#define HSTADDR2_Msk                  _U_(0x7F7F7F7F)                                /**< (HSTADDR2) Register Mask  */\n\n\n/* -------- HSTADDR3 : (USBHS Offset: 0x42c) (R/W 32) Host Address 3 Register -------- */\n\n#define HSTADDR3_OFFSET               (0x42C)                                       /**<  (HSTADDR3) Host Address 3 Register  Offset */\n\n#define HSTADDR3_HSTADDRP8_Pos        0                                              /**< (HSTADDR3) USB Host Address Position */\n#define HSTADDR3_HSTADDRP8            (_U_(0x7F) << HSTADDR3_HSTADDRP8_Pos)    /**< (HSTADDR3) USB Host Address Mask */\n#define HSTADDR3_HSTADDRP9_Pos        8                                              /**< (HSTADDR3) USB Host Address Position */\n#define HSTADDR3_HSTADDRP9            (_U_(0x7F) << HSTADDR3_HSTADDRP9_Pos)    /**< (HSTADDR3) USB Host Address Mask */\n#define HSTADDR3_Msk                  _U_(0x7F7F)                                    /**< (HSTADDR3) Register Mask  */\n\n\n/* -------- HSTPIPCFG : (USBHS Offset: 0x500) (R/W 32) Host Pipe Configuration Register -------- */\n\n#define HSTPIPCFG_OFFSET              (0x500)                                       /**<  (HSTPIPCFG) Host Pipe Configuration Register  Offset */\n\n#define HSTPIPCFG_ALLOC_Pos           1                                              /**< (HSTPIPCFG) Pipe Memory Allocate Position */\n#define HSTPIPCFG_ALLOC               (_U_(0x1) << HSTPIPCFG_ALLOC_Pos)        /**< (HSTPIPCFG) Pipe Memory Allocate Mask */\n#define HSTPIPCFG_PBK_Pos             2                                              /**< (HSTPIPCFG) Pipe Banks Position */\n#define HSTPIPCFG_PBK                 (_U_(0x3) << HSTPIPCFG_PBK_Pos)          /**< (HSTPIPCFG) Pipe Banks Mask */\n#define   HSTPIPCFG_PBK_1_BANK_Val    _U_(0x0)                                       /**< (HSTPIPCFG) Single-bank pipe  */\n#define   HSTPIPCFG_PBK_2_BANK_Val    _U_(0x1)                                       /**< (HSTPIPCFG) Double-bank pipe  */\n#define   HSTPIPCFG_PBK_3_BANK_Val    _U_(0x2)                                       /**< (HSTPIPCFG) Triple-bank pipe  */\n#define HSTPIPCFG_PBK_1_BANK          (HSTPIPCFG_PBK_1_BANK_Val << HSTPIPCFG_PBK_Pos)  /**< (HSTPIPCFG) Single-bank pipe Position  */\n#define HSTPIPCFG_PBK_2_BANK          (HSTPIPCFG_PBK_2_BANK_Val << HSTPIPCFG_PBK_Pos)  /**< (HSTPIPCFG) Double-bank pipe Position  */\n#define HSTPIPCFG_PBK_3_BANK          (HSTPIPCFG_PBK_3_BANK_Val << HSTPIPCFG_PBK_Pos)  /**< (HSTPIPCFG) Triple-bank pipe Position  */\n#define HSTPIPCFG_PSIZE_Pos           4                                              /**< (HSTPIPCFG) Pipe Size Position */\n#define HSTPIPCFG_PSIZE               (_U_(0x7) << HSTPIPCFG_PSIZE_Pos)        /**< (HSTPIPCFG) Pipe Size Mask */\n#define   HSTPIPCFG_PSIZE_8_BYTE_Val  _U_(0x0)                                       /**< (HSTPIPCFG) 8 bytes  */\n#define   HSTPIPCFG_PSIZE_16_BYTE_Val _U_(0x1)                                       /**< (HSTPIPCFG) 16 bytes  */\n#define   HSTPIPCFG_PSIZE_32_BYTE_Val _U_(0x2)                                       /**< (HSTPIPCFG) 32 bytes  */\n#define   HSTPIPCFG_PSIZE_64_BYTE_Val _U_(0x3)                                       /**< (HSTPIPCFG) 64 bytes  */\n#define   HSTPIPCFG_PSIZE_128_BYTE_Val _U_(0x4)                                       /**< (HSTPIPCFG) 128 bytes  */\n#define   HSTPIPCFG_PSIZE_256_BYTE_Val _U_(0x5)                                       /**< (HSTPIPCFG) 256 bytes  */\n#define   HSTPIPCFG_PSIZE_512_BYTE_Val _U_(0x6)                                       /**< (HSTPIPCFG) 512 bytes  */\n#define   HSTPIPCFG_PSIZE_1024_BYTE_Val _U_(0x7)                                       /**< (HSTPIPCFG) 1024 bytes  */\n#define HSTPIPCFG_PSIZE_8_BYTE        (HSTPIPCFG_PSIZE_8_BYTE_Val << HSTPIPCFG_PSIZE_Pos)  /**< (HSTPIPCFG) 8 bytes Position  */\n#define HSTPIPCFG_PSIZE_16_BYTE       (HSTPIPCFG_PSIZE_16_BYTE_Val << HSTPIPCFG_PSIZE_Pos)  /**< (HSTPIPCFG) 16 bytes Position  */\n#define HSTPIPCFG_PSIZE_32_BYTE       (HSTPIPCFG_PSIZE_32_BYTE_Val << HSTPIPCFG_PSIZE_Pos)  /**< (HSTPIPCFG) 32 bytes Position  */\n#define HSTPIPCFG_PSIZE_64_BYTE       (HSTPIPCFG_PSIZE_64_BYTE_Val << HSTPIPCFG_PSIZE_Pos)  /**< (HSTPIPCFG) 64 bytes Position  */\n#define HSTPIPCFG_PSIZE_128_BYTE      (HSTPIPCFG_PSIZE_128_BYTE_Val << HSTPIPCFG_PSIZE_Pos)  /**< (HSTPIPCFG) 128 bytes Position  */\n#define HSTPIPCFG_PSIZE_256_BYTE      (HSTPIPCFG_PSIZE_256_BYTE_Val << HSTPIPCFG_PSIZE_Pos)  /**< (HSTPIPCFG) 256 bytes Position  */\n#define HSTPIPCFG_PSIZE_512_BYTE      (HSTPIPCFG_PSIZE_512_BYTE_Val << HSTPIPCFG_PSIZE_Pos)  /**< (HSTPIPCFG) 512 bytes Position  */\n#define HSTPIPCFG_PSIZE_1024_BYTE     (HSTPIPCFG_PSIZE_1024_BYTE_Val << HSTPIPCFG_PSIZE_Pos)  /**< (HSTPIPCFG) 1024 bytes Position  */\n#define HSTPIPCFG_PTOKEN_Pos          8                                              /**< (HSTPIPCFG) Pipe Token Position */\n#define HSTPIPCFG_PTOKEN              (_U_(0x3) << HSTPIPCFG_PTOKEN_Pos)       /**< (HSTPIPCFG) Pipe Token Mask */\n#define   HSTPIPCFG_PTOKEN_SETUP_Val  _U_(0x0)                                       /**< (HSTPIPCFG) SETUP  */\n#define   HSTPIPCFG_PTOKEN_IN_Val     _U_(0x1)                                       /**< (HSTPIPCFG) IN  */\n#define   HSTPIPCFG_PTOKEN_OUT_Val    _U_(0x2)                                       /**< (HSTPIPCFG) OUT  */\n#define HSTPIPCFG_PTOKEN_SETUP        (HSTPIPCFG_PTOKEN_SETUP_Val << HSTPIPCFG_PTOKEN_Pos)  /**< (HSTPIPCFG) SETUP Position  */\n#define HSTPIPCFG_PTOKEN_IN           (HSTPIPCFG_PTOKEN_IN_Val << HSTPIPCFG_PTOKEN_Pos)  /**< (HSTPIPCFG) IN Position  */\n#define HSTPIPCFG_PTOKEN_OUT          (HSTPIPCFG_PTOKEN_OUT_Val << HSTPIPCFG_PTOKEN_Pos)  /**< (HSTPIPCFG) OUT Position  */\n#define HSTPIPCFG_AUTOSW_Pos          10                                             /**< (HSTPIPCFG) Automatic Switch Position */\n#define HSTPIPCFG_AUTOSW              (_U_(0x1) << HSTPIPCFG_AUTOSW_Pos)       /**< (HSTPIPCFG) Automatic Switch Mask */\n#define HSTPIPCFG_PTYPE_Pos           12                                             /**< (HSTPIPCFG) Pipe Type Position */\n#define HSTPIPCFG_PTYPE               (_U_(0x3) << HSTPIPCFG_PTYPE_Pos)        /**< (HSTPIPCFG) Pipe Type Mask */\n#define   HSTPIPCFG_PTYPE_CTRL_Val    _U_(0x0)                                       /**< (HSTPIPCFG) Control  */\n#define   HSTPIPCFG_PTYPE_ISO_Val     _U_(0x1)                                       /**< (HSTPIPCFG) Isochronous  */\n#define   HSTPIPCFG_PTYPE_BLK_Val     _U_(0x2)                                       /**< (HSTPIPCFG) Bulk  */\n#define   HSTPIPCFG_PTYPE_INTRPT_Val  _U_(0x3)                                       /**< (HSTPIPCFG) Interrupt  */\n#define HSTPIPCFG_PTYPE_CTRL          (HSTPIPCFG_PTYPE_CTRL_Val << HSTPIPCFG_PTYPE_Pos)  /**< (HSTPIPCFG) Control Position  */\n#define HSTPIPCFG_PTYPE_ISO           (HSTPIPCFG_PTYPE_ISO_Val << HSTPIPCFG_PTYPE_Pos)  /**< (HSTPIPCFG) Isochronous Position  */\n#define HSTPIPCFG_PTYPE_BLK           (HSTPIPCFG_PTYPE_BLK_Val << HSTPIPCFG_PTYPE_Pos)  /**< (HSTPIPCFG) Bulk Position  */\n#define HSTPIPCFG_PTYPE_INTRPT        (HSTPIPCFG_PTYPE_INTRPT_Val << HSTPIPCFG_PTYPE_Pos)  /**< (HSTPIPCFG) Interrupt Position  */\n#define HSTPIPCFG_PEPNUM_Pos          16                                             /**< (HSTPIPCFG) Pipe Endpoint Number Position */\n#define HSTPIPCFG_PEPNUM              (_U_(0xF) << HSTPIPCFG_PEPNUM_Pos)       /**< (HSTPIPCFG) Pipe Endpoint Number Mask */\n#define HSTPIPCFG_INTFRQ_Pos          24                                             /**< (HSTPIPCFG) Pipe Interrupt Request Frequency Position */\n#define HSTPIPCFG_INTFRQ              (_U_(0xFF) << HSTPIPCFG_INTFRQ_Pos)      /**< (HSTPIPCFG) Pipe Interrupt Request Frequency Mask */\n#define HSTPIPCFG_Msk                 _U_(0xFF0F377E)                                /**< (HSTPIPCFG) Register Mask  */\n\n/* CTRL_BULK mode */\n#define HSTPIPCFG_CTRL_BULK_PINGEN_Pos 20                                             /**< (HSTPIPCFG) Ping Enable Position */\n#define HSTPIPCFG_CTRL_BULK_PINGEN     (_U_(0x1) << HSTPIPCFG_CTRL_BULK_PINGEN_Pos)  /**< (HSTPIPCFG) Ping Enable Mask */\n#define HSTPIPCFG_CTRL_BULK_BINTERVAL_Pos 24                                             /**< (HSTPIPCFG) bInterval Parameter for the Bulk-Out/Ping Transaction Position */\n#define HSTPIPCFG_CTRL_BULK_BINTERVAL     (_U_(0xFF) << HSTPIPCFG_CTRL_BULK_BINTERVAL_Pos)  /**< (HSTPIPCFG) bInterval Parameter for the Bulk-Out/Ping Transaction Mask */\n#define HSTPIPCFG_CTRL_BULK_Msk       _U_(0xFF100000)                                /**< (HSTPIPCFG_CTRL_BULK) Register Mask  */\n\n\n/* -------- HSTPIPISR : (USBHS Offset: 0x530) (R/ 32) Host Pipe Status Register -------- */\n\n#define HSTPIPISR_OFFSET              (0x530)                                       /**<  (HSTPIPISR) Host Pipe Status Register  Offset */\n\n#define HSTPIPISR_RXINI_Pos           0                                              /**< (HSTPIPISR) Received IN Data Interrupt Position */\n#define HSTPIPISR_RXINI               (_U_(0x1) << HSTPIPISR_RXINI_Pos)        /**< (HSTPIPISR) Received IN Data Interrupt Mask */\n#define HSTPIPISR_TXOUTI_Pos          1                                              /**< (HSTPIPISR) Transmitted OUT Data Interrupt Position */\n#define HSTPIPISR_TXOUTI              (_U_(0x1) << HSTPIPISR_TXOUTI_Pos)       /**< (HSTPIPISR) Transmitted OUT Data Interrupt Mask */\n#define HSTPIPISR_PERRI_Pos           3                                              /**< (HSTPIPISR) Pipe Error Interrupt Position */\n#define HSTPIPISR_PERRI               (_U_(0x1) << HSTPIPISR_PERRI_Pos)        /**< (HSTPIPISR) Pipe Error Interrupt Mask */\n#define HSTPIPISR_NAKEDI_Pos          4                                              /**< (HSTPIPISR) NAKed Interrupt Position */\n#define HSTPIPISR_NAKEDI              (_U_(0x1) << HSTPIPISR_NAKEDI_Pos)       /**< (HSTPIPISR) NAKed Interrupt Mask */\n#define HSTPIPISR_OVERFI_Pos          5                                              /**< (HSTPIPISR) Overflow Interrupt Position */\n#define HSTPIPISR_OVERFI              (_U_(0x1) << HSTPIPISR_OVERFI_Pos)       /**< (HSTPIPISR) Overflow Interrupt Mask */\n#define HSTPIPISR_SHORTPACKETI_Pos    7                                              /**< (HSTPIPISR) Short Packet Interrupt Position */\n#define HSTPIPISR_SHORTPACKETI        (_U_(0x1) << HSTPIPISR_SHORTPACKETI_Pos)  /**< (HSTPIPISR) Short Packet Interrupt Mask */\n#define HSTPIPISR_DTSEQ_Pos           8                                              /**< (HSTPIPISR) Data Toggle Sequence Position */\n#define HSTPIPISR_DTSEQ               (_U_(0x3) << HSTPIPISR_DTSEQ_Pos)        /**< (HSTPIPISR) Data Toggle Sequence Mask */\n#define   HSTPIPISR_DTSEQ_DATA0_Val   _U_(0x0)                                       /**< (HSTPIPISR) Data0 toggle sequence  */\n#define   HSTPIPISR_DTSEQ_DATA1_Val   _U_(0x1)                                       /**< (HSTPIPISR) Data1 toggle sequence  */\n#define HSTPIPISR_DTSEQ_DATA0         (HSTPIPISR_DTSEQ_DATA0_Val << HSTPIPISR_DTSEQ_Pos)  /**< (HSTPIPISR) Data0 toggle sequence Position  */\n#define HSTPIPISR_DTSEQ_DATA1         (HSTPIPISR_DTSEQ_DATA1_Val << HSTPIPISR_DTSEQ_Pos)  /**< (HSTPIPISR) Data1 toggle sequence Position  */\n#define HSTPIPISR_NBUSYBK_Pos         12                                             /**< (HSTPIPISR) Number of Busy Banks Position */\n#define HSTPIPISR_NBUSYBK             (_U_(0x3) << HSTPIPISR_NBUSYBK_Pos)      /**< (HSTPIPISR) Number of Busy Banks Mask */\n#define   HSTPIPISR_NBUSYBK_0_BUSY_Val _U_(0x0)                                       /**< (HSTPIPISR) 0 busy bank (all banks free)  */\n#define   HSTPIPISR_NBUSYBK_1_BUSY_Val _U_(0x1)                                       /**< (HSTPIPISR) 1 busy bank  */\n#define   HSTPIPISR_NBUSYBK_2_BUSY_Val _U_(0x2)                                       /**< (HSTPIPISR) 2 busy banks  */\n#define   HSTPIPISR_NBUSYBK_3_BUSY_Val _U_(0x3)                                       /**< (HSTPIPISR) 3 busy banks  */\n#define HSTPIPISR_NBUSYBK_0_BUSY      (HSTPIPISR_NBUSYBK_0_BUSY_Val << HSTPIPISR_NBUSYBK_Pos)  /**< (HSTPIPISR) 0 busy bank (all banks free) Position  */\n#define HSTPIPISR_NBUSYBK_1_BUSY      (HSTPIPISR_NBUSYBK_1_BUSY_Val << HSTPIPISR_NBUSYBK_Pos)  /**< (HSTPIPISR) 1 busy bank Position  */\n#define HSTPIPISR_NBUSYBK_2_BUSY      (HSTPIPISR_NBUSYBK_2_BUSY_Val << HSTPIPISR_NBUSYBK_Pos)  /**< (HSTPIPISR) 2 busy banks Position  */\n#define HSTPIPISR_NBUSYBK_3_BUSY      (HSTPIPISR_NBUSYBK_3_BUSY_Val << HSTPIPISR_NBUSYBK_Pos)  /**< (HSTPIPISR) 3 busy banks Position  */\n#define HSTPIPISR_CURRBK_Pos          14                                             /**< (HSTPIPISR) Current Bank Position */\n#define HSTPIPISR_CURRBK              (_U_(0x3) << HSTPIPISR_CURRBK_Pos)       /**< (HSTPIPISR) Current Bank Mask */\n#define   HSTPIPISR_CURRBK_BANK0_Val  _U_(0x0)                                       /**< (HSTPIPISR) Current bank is bank0  */\n#define   HSTPIPISR_CURRBK_BANK1_Val  _U_(0x1)                                       /**< (HSTPIPISR) Current bank is bank1  */\n#define   HSTPIPISR_CURRBK_BANK2_Val  _U_(0x2)                                       /**< (HSTPIPISR) Current bank is bank2  */\n#define HSTPIPISR_CURRBK_BANK0        (HSTPIPISR_CURRBK_BANK0_Val << HSTPIPISR_CURRBK_Pos)  /**< (HSTPIPISR) Current bank is bank0 Position  */\n#define HSTPIPISR_CURRBK_BANK1        (HSTPIPISR_CURRBK_BANK1_Val << HSTPIPISR_CURRBK_Pos)  /**< (HSTPIPISR) Current bank is bank1 Position  */\n#define HSTPIPISR_CURRBK_BANK2        (HSTPIPISR_CURRBK_BANK2_Val << HSTPIPISR_CURRBK_Pos)  /**< (HSTPIPISR) Current bank is bank2 Position  */\n#define HSTPIPISR_RWALL_Pos           16                                             /**< (HSTPIPISR) Read/Write Allowed Position */\n#define HSTPIPISR_RWALL               (_U_(0x1) << HSTPIPISR_RWALL_Pos)        /**< (HSTPIPISR) Read/Write Allowed Mask */\n#define HSTPIPISR_CFGOK_Pos           18                                             /**< (HSTPIPISR) Configuration OK Status Position */\n#define HSTPIPISR_CFGOK               (_U_(0x1) << HSTPIPISR_CFGOK_Pos)        /**< (HSTPIPISR) Configuration OK Status Mask */\n#define HSTPIPISR_PBYCT_Pos           20                                             /**< (HSTPIPISR) Pipe Byte Count Position */\n#define HSTPIPISR_PBYCT               (_U_(0x7FF) << HSTPIPISR_PBYCT_Pos)      /**< (HSTPIPISR) Pipe Byte Count Mask */\n#define HSTPIPISR_Msk                 _U_(0x7FF5F3BB)                                /**< (HSTPIPISR) Register Mask  */\n\n/* CTRL mode */\n#define HSTPIPISR_CTRL_TXSTPI_Pos     2                                              /**< (HSTPIPISR) Transmitted SETUP Interrupt Position */\n#define HSTPIPISR_CTRL_TXSTPI         (_U_(0x1) << HSTPIPISR_CTRL_TXSTPI_Pos)  /**< (HSTPIPISR) Transmitted SETUP Interrupt Mask */\n#define HSTPIPISR_CTRL_RXSTALLDI_Pos  6                                              /**< (HSTPIPISR) Received STALLed Interrupt Position */\n#define HSTPIPISR_CTRL_RXSTALLDI      (_U_(0x1) << HSTPIPISR_CTRL_RXSTALLDI_Pos)  /**< (HSTPIPISR) Received STALLed Interrupt Mask */\n#define HSTPIPISR_CTRL_Msk            _U_(0x44)                                      /**< (HSTPIPISR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define HSTPIPISR_ISO_UNDERFI_Pos     2                                              /**< (HSTPIPISR) Underflow Interrupt Position */\n#define HSTPIPISR_ISO_UNDERFI         (_U_(0x1) << HSTPIPISR_ISO_UNDERFI_Pos)  /**< (HSTPIPISR) Underflow Interrupt Mask */\n#define HSTPIPISR_ISO_CRCERRI_Pos     6                                              /**< (HSTPIPISR) CRC Error Interrupt Position */\n#define HSTPIPISR_ISO_CRCERRI         (_U_(0x1) << HSTPIPISR_ISO_CRCERRI_Pos)  /**< (HSTPIPISR) CRC Error Interrupt Mask */\n#define HSTPIPISR_ISO_Msk             _U_(0x44)                                      /**< (HSTPIPISR_ISO) Register Mask  */\n\n/* BLK mode */\n#define HSTPIPISR_BLK_TXSTPI_Pos      2                                              /**< (HSTPIPISR) Transmitted SETUP Interrupt Position */\n#define HSTPIPISR_BLK_TXSTPI          (_U_(0x1) << HSTPIPISR_BLK_TXSTPI_Pos)   /**< (HSTPIPISR) Transmitted SETUP Interrupt Mask */\n#define HSTPIPISR_BLK_RXSTALLDI_Pos   6                                              /**< (HSTPIPISR) Received STALLed Interrupt Position */\n#define HSTPIPISR_BLK_RXSTALLDI       (_U_(0x1) << HSTPIPISR_BLK_RXSTALLDI_Pos)  /**< (HSTPIPISR) Received STALLed Interrupt Mask */\n#define HSTPIPISR_BLK_Msk             _U_(0x44)                                      /**< (HSTPIPISR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define HSTPIPISR_INTRPT_UNDERFI_Pos  2                                              /**< (HSTPIPISR) Underflow Interrupt Position */\n#define HSTPIPISR_INTRPT_UNDERFI      (_U_(0x1) << HSTPIPISR_INTRPT_UNDERFI_Pos)  /**< (HSTPIPISR) Underflow Interrupt Mask */\n#define HSTPIPISR_INTRPT_RXSTALLDI_Pos 6                                              /**< (HSTPIPISR) Received STALLed Interrupt Position */\n#define HSTPIPISR_INTRPT_RXSTALLDI     (_U_(0x1) << HSTPIPISR_INTRPT_RXSTALLDI_Pos)  /**< (HSTPIPISR) Received STALLed Interrupt Mask */\n#define HSTPIPISR_INTRPT_Msk          _U_(0x44)                                      /**< (HSTPIPISR_INTRPT) Register Mask  */\n\n\n/* -------- HSTPIPICR : (USBHS Offset: 0x560) (/W 32) Host Pipe Clear Register -------- */\n\n#define HSTPIPICR_OFFSET              (0x560)                                       /**<  (HSTPIPICR) Host Pipe Clear Register  Offset */\n\n#define HSTPIPICR_RXINIC_Pos          0                                              /**< (HSTPIPICR) Received IN Data Interrupt Clear Position */\n#define HSTPIPICR_RXINIC              (_U_(0x1) << HSTPIPICR_RXINIC_Pos)       /**< (HSTPIPICR) Received IN Data Interrupt Clear Mask */\n#define HSTPIPICR_TXOUTIC_Pos         1                                              /**< (HSTPIPICR) Transmitted OUT Data Interrupt Clear Position */\n#define HSTPIPICR_TXOUTIC             (_U_(0x1) << HSTPIPICR_TXOUTIC_Pos)      /**< (HSTPIPICR) Transmitted OUT Data Interrupt Clear Mask */\n#define HSTPIPICR_NAKEDIC_Pos         4                                              /**< (HSTPIPICR) NAKed Interrupt Clear Position */\n#define HSTPIPICR_NAKEDIC             (_U_(0x1) << HSTPIPICR_NAKEDIC_Pos)      /**< (HSTPIPICR) NAKed Interrupt Clear Mask */\n#define HSTPIPICR_OVERFIC_Pos         5                                              /**< (HSTPIPICR) Overflow Interrupt Clear Position */\n#define HSTPIPICR_OVERFIC             (_U_(0x1) << HSTPIPICR_OVERFIC_Pos)      /**< (HSTPIPICR) Overflow Interrupt Clear Mask */\n#define HSTPIPICR_SHORTPACKETIC_Pos   7                                              /**< (HSTPIPICR) Short Packet Interrupt Clear Position */\n#define HSTPIPICR_SHORTPACKETIC       (_U_(0x1) << HSTPIPICR_SHORTPACKETIC_Pos)  /**< (HSTPIPICR) Short Packet Interrupt Clear Mask */\n#define HSTPIPICR_Msk                 _U_(0xB3)                                      /**< (HSTPIPICR) Register Mask  */\n\n/* CTRL mode */\n#define HSTPIPICR_CTRL_TXSTPIC_Pos    2                                              /**< (HSTPIPICR) Transmitted SETUP Interrupt Clear Position */\n#define HSTPIPICR_CTRL_TXSTPIC        (_U_(0x1) << HSTPIPICR_CTRL_TXSTPIC_Pos)  /**< (HSTPIPICR) Transmitted SETUP Interrupt Clear Mask */\n#define HSTPIPICR_CTRL_RXSTALLDIC_Pos 6                                              /**< (HSTPIPICR) Received STALLed Interrupt Clear Position */\n#define HSTPIPICR_CTRL_RXSTALLDIC     (_U_(0x1) << HSTPIPICR_CTRL_RXSTALLDIC_Pos)  /**< (HSTPIPICR) Received STALLed Interrupt Clear Mask */\n#define HSTPIPICR_CTRL_Msk            _U_(0x44)                                      /**< (HSTPIPICR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define HSTPIPICR_ISO_UNDERFIC_Pos    2                                              /**< (HSTPIPICR) Underflow Interrupt Clear Position */\n#define HSTPIPICR_ISO_UNDERFIC        (_U_(0x1) << HSTPIPICR_ISO_UNDERFIC_Pos)  /**< (HSTPIPICR) Underflow Interrupt Clear Mask */\n#define HSTPIPICR_ISO_CRCERRIC_Pos    6                                              /**< (HSTPIPICR) CRC Error Interrupt Clear Position */\n#define HSTPIPICR_ISO_CRCERRIC        (_U_(0x1) << HSTPIPICR_ISO_CRCERRIC_Pos)  /**< (HSTPIPICR) CRC Error Interrupt Clear Mask */\n#define HSTPIPICR_ISO_Msk             _U_(0x44)                                      /**< (HSTPIPICR_ISO) Register Mask  */\n\n/* BLK mode */\n#define HSTPIPICR_BLK_TXSTPIC_Pos     2                                              /**< (HSTPIPICR) Transmitted SETUP Interrupt Clear Position */\n#define HSTPIPICR_BLK_TXSTPIC         (_U_(0x1) << HSTPIPICR_BLK_TXSTPIC_Pos)  /**< (HSTPIPICR) Transmitted SETUP Interrupt Clear Mask */\n#define HSTPIPICR_BLK_RXSTALLDIC_Pos  6                                              /**< (HSTPIPICR) Received STALLed Interrupt Clear Position */\n#define HSTPIPICR_BLK_RXSTALLDIC      (_U_(0x1) << HSTPIPICR_BLK_RXSTALLDIC_Pos)  /**< (HSTPIPICR) Received STALLed Interrupt Clear Mask */\n#define HSTPIPICR_BLK_Msk             _U_(0x44)                                      /**< (HSTPIPICR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define HSTPIPICR_INTRPT_UNDERFIC_Pos 2                                              /**< (HSTPIPICR) Underflow Interrupt Clear Position */\n#define HSTPIPICR_INTRPT_UNDERFIC     (_U_(0x1) << HSTPIPICR_INTRPT_UNDERFIC_Pos)  /**< (HSTPIPICR) Underflow Interrupt Clear Mask */\n#define HSTPIPICR_INTRPT_RXSTALLDIC_Pos 6                                              /**< (HSTPIPICR) Received STALLed Interrupt Clear Position */\n#define HSTPIPICR_INTRPT_RXSTALLDIC     (_U_(0x1) << HSTPIPICR_INTRPT_RXSTALLDIC_Pos)  /**< (HSTPIPICR) Received STALLed Interrupt Clear Mask */\n#define HSTPIPICR_INTRPT_Msk          _U_(0x44)                                      /**< (HSTPIPICR_INTRPT) Register Mask  */\n\n\n/* -------- HSTPIPIFR : (USBHS Offset: 0x590) (/W 32) Host Pipe Set Register -------- */\n\n#define HSTPIPIFR_OFFSET              (0x590)                                       /**<  (HSTPIPIFR) Host Pipe Set Register  Offset */\n\n#define HSTPIPIFR_RXINIS_Pos          0                                              /**< (HSTPIPIFR) Received IN Data Interrupt Set Position */\n#define HSTPIPIFR_RXINIS              (_U_(0x1) << HSTPIPIFR_RXINIS_Pos)       /**< (HSTPIPIFR) Received IN Data Interrupt Set Mask */\n#define HSTPIPIFR_TXOUTIS_Pos         1                                              /**< (HSTPIPIFR) Transmitted OUT Data Interrupt Set Position */\n#define HSTPIPIFR_TXOUTIS             (_U_(0x1) << HSTPIPIFR_TXOUTIS_Pos)      /**< (HSTPIPIFR) Transmitted OUT Data Interrupt Set Mask */\n#define HSTPIPIFR_PERRIS_Pos          3                                              /**< (HSTPIPIFR) Pipe Error Interrupt Set Position */\n#define HSTPIPIFR_PERRIS              (_U_(0x1) << HSTPIPIFR_PERRIS_Pos)       /**< (HSTPIPIFR) Pipe Error Interrupt Set Mask */\n#define HSTPIPIFR_NAKEDIS_Pos         4                                              /**< (HSTPIPIFR) NAKed Interrupt Set Position */\n#define HSTPIPIFR_NAKEDIS             (_U_(0x1) << HSTPIPIFR_NAKEDIS_Pos)      /**< (HSTPIPIFR) NAKed Interrupt Set Mask */\n#define HSTPIPIFR_OVERFIS_Pos         5                                              /**< (HSTPIPIFR) Overflow Interrupt Set Position */\n#define HSTPIPIFR_OVERFIS             (_U_(0x1) << HSTPIPIFR_OVERFIS_Pos)      /**< (HSTPIPIFR) Overflow Interrupt Set Mask */\n#define HSTPIPIFR_SHORTPACKETIS_Pos   7                                              /**< (HSTPIPIFR) Short Packet Interrupt Set Position */\n#define HSTPIPIFR_SHORTPACKETIS       (_U_(0x1) << HSTPIPIFR_SHORTPACKETIS_Pos)  /**< (HSTPIPIFR) Short Packet Interrupt Set Mask */\n#define HSTPIPIFR_NBUSYBKS_Pos        12                                             /**< (HSTPIPIFR) Number of Busy Banks Set Position */\n#define HSTPIPIFR_NBUSYBKS            (_U_(0x1) << HSTPIPIFR_NBUSYBKS_Pos)     /**< (HSTPIPIFR) Number of Busy Banks Set Mask */\n#define HSTPIPIFR_Msk                 _U_(0x10BB)                                    /**< (HSTPIPIFR) Register Mask  */\n\n/* CTRL mode */\n#define HSTPIPIFR_CTRL_TXSTPIS_Pos    2                                              /**< (HSTPIPIFR) Transmitted SETUP Interrupt Set Position */\n#define HSTPIPIFR_CTRL_TXSTPIS        (_U_(0x1) << HSTPIPIFR_CTRL_TXSTPIS_Pos)  /**< (HSTPIPIFR) Transmitted SETUP Interrupt Set Mask */\n#define HSTPIPIFR_CTRL_RXSTALLDIS_Pos 6                                              /**< (HSTPIPIFR) Received STALLed Interrupt Set Position */\n#define HSTPIPIFR_CTRL_RXSTALLDIS     (_U_(0x1) << HSTPIPIFR_CTRL_RXSTALLDIS_Pos)  /**< (HSTPIPIFR) Received STALLed Interrupt Set Mask */\n#define HSTPIPIFR_CTRL_Msk            _U_(0x44)                                      /**< (HSTPIPIFR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define HSTPIPIFR_ISO_UNDERFIS_Pos    2                                              /**< (HSTPIPIFR) Underflow Interrupt Set Position */\n#define HSTPIPIFR_ISO_UNDERFIS        (_U_(0x1) << HSTPIPIFR_ISO_UNDERFIS_Pos)  /**< (HSTPIPIFR) Underflow Interrupt Set Mask */\n#define HSTPIPIFR_ISO_CRCERRIS_Pos    6                                              /**< (HSTPIPIFR) CRC Error Interrupt Set Position */\n#define HSTPIPIFR_ISO_CRCERRIS        (_U_(0x1) << HSTPIPIFR_ISO_CRCERRIS_Pos)  /**< (HSTPIPIFR) CRC Error Interrupt Set Mask */\n#define HSTPIPIFR_ISO_Msk             _U_(0x44)                                      /**< (HSTPIPIFR_ISO) Register Mask  */\n\n/* BLK mode */\n#define HSTPIPIFR_BLK_TXSTPIS_Pos     2                                              /**< (HSTPIPIFR) Transmitted SETUP Interrupt Set Position */\n#define HSTPIPIFR_BLK_TXSTPIS         (_U_(0x1) << HSTPIPIFR_BLK_TXSTPIS_Pos)  /**< (HSTPIPIFR) Transmitted SETUP Interrupt Set Mask */\n#define HSTPIPIFR_BLK_RXSTALLDIS_Pos  6                                              /**< (HSTPIPIFR) Received STALLed Interrupt Set Position */\n#define HSTPIPIFR_BLK_RXSTALLDIS      (_U_(0x1) << HSTPIPIFR_BLK_RXSTALLDIS_Pos)  /**< (HSTPIPIFR) Received STALLed Interrupt Set Mask */\n#define HSTPIPIFR_BLK_Msk             _U_(0x44)                                      /**< (HSTPIPIFR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define HSTPIPIFR_INTRPT_UNDERFIS_Pos 2                                              /**< (HSTPIPIFR) Underflow Interrupt Set Position */\n#define HSTPIPIFR_INTRPT_UNDERFIS     (_U_(0x1) << HSTPIPIFR_INTRPT_UNDERFIS_Pos)  /**< (HSTPIPIFR) Underflow Interrupt Set Mask */\n#define HSTPIPIFR_INTRPT_RXSTALLDIS_Pos 6                                              /**< (HSTPIPIFR) Received STALLed Interrupt Set Position */\n#define HSTPIPIFR_INTRPT_RXSTALLDIS     (_U_(0x1) << HSTPIPIFR_INTRPT_RXSTALLDIS_Pos)  /**< (HSTPIPIFR) Received STALLed Interrupt Set Mask */\n#define HSTPIPIFR_INTRPT_Msk          _U_(0x44)                                      /**< (HSTPIPIFR_INTRPT) Register Mask  */\n\n\n/* -------- HSTPIPIMR : (USBHS Offset: 0x5c0) (R/ 32) Host Pipe Mask Register -------- */\n\n#define HSTPIPIMR_OFFSET              (0x5C0)                                       /**<  (HSTPIPIMR) Host Pipe Mask Register  Offset */\n\n#define HSTPIPIMR_RXINE_Pos           0                                              /**< (HSTPIPIMR) Received IN Data Interrupt Enable Position */\n#define HSTPIPIMR_RXINE               (_U_(0x1) << HSTPIPIMR_RXINE_Pos)        /**< (HSTPIPIMR) Received IN Data Interrupt Enable Mask */\n#define HSTPIPIMR_TXOUTE_Pos          1                                              /**< (HSTPIPIMR) Transmitted OUT Data Interrupt Enable Position */\n#define HSTPIPIMR_TXOUTE              (_U_(0x1) << HSTPIPIMR_TXOUTE_Pos)       /**< (HSTPIPIMR) Transmitted OUT Data Interrupt Enable Mask */\n#define HSTPIPIMR_PERRE_Pos           3                                              /**< (HSTPIPIMR) Pipe Error Interrupt Enable Position */\n#define HSTPIPIMR_PERRE               (_U_(0x1) << HSTPIPIMR_PERRE_Pos)        /**< (HSTPIPIMR) Pipe Error Interrupt Enable Mask */\n#define HSTPIPIMR_NAKEDE_Pos          4                                              /**< (HSTPIPIMR) NAKed Interrupt Enable Position */\n#define HSTPIPIMR_NAKEDE              (_U_(0x1) << HSTPIPIMR_NAKEDE_Pos)       /**< (HSTPIPIMR) NAKed Interrupt Enable Mask */\n#define HSTPIPIMR_OVERFIE_Pos         5                                              /**< (HSTPIPIMR) Overflow Interrupt Enable Position */\n#define HSTPIPIMR_OVERFIE             (_U_(0x1) << HSTPIPIMR_OVERFIE_Pos)      /**< (HSTPIPIMR) Overflow Interrupt Enable Mask */\n#define HSTPIPIMR_SHORTPACKETIE_Pos   7                                              /**< (HSTPIPIMR) Short Packet Interrupt Enable Position */\n#define HSTPIPIMR_SHORTPACKETIE       (_U_(0x1) << HSTPIPIMR_SHORTPACKETIE_Pos)  /**< (HSTPIPIMR) Short Packet Interrupt Enable Mask */\n#define HSTPIPIMR_NBUSYBKE_Pos        12                                             /**< (HSTPIPIMR) Number of Busy Banks Interrupt Enable Position */\n#define HSTPIPIMR_NBUSYBKE            (_U_(0x1) << HSTPIPIMR_NBUSYBKE_Pos)     /**< (HSTPIPIMR) Number of Busy Banks Interrupt Enable Mask */\n#define HSTPIPIMR_FIFOCON_Pos         14                                             /**< (HSTPIPIMR) FIFO Control Position */\n#define HSTPIPIMR_FIFOCON             (_U_(0x1) << HSTPIPIMR_FIFOCON_Pos)      /**< (HSTPIPIMR) FIFO Control Mask */\n#define HSTPIPIMR_PDISHDMA_Pos        16                                             /**< (HSTPIPIMR) Pipe Interrupts Disable HDMA Request Enable Position */\n#define HSTPIPIMR_PDISHDMA            (_U_(0x1) << HSTPIPIMR_PDISHDMA_Pos)     /**< (HSTPIPIMR) Pipe Interrupts Disable HDMA Request Enable Mask */\n#define HSTPIPIMR_PFREEZE_Pos         17                                             /**< (HSTPIPIMR) Pipe Freeze Position */\n#define HSTPIPIMR_PFREEZE             (_U_(0x1) << HSTPIPIMR_PFREEZE_Pos)      /**< (HSTPIPIMR) Pipe Freeze Mask */\n#define HSTPIPIMR_RSTDT_Pos           18                                             /**< (HSTPIPIMR) Reset Data Toggle Position */\n#define HSTPIPIMR_RSTDT               (_U_(0x1) << HSTPIPIMR_RSTDT_Pos)        /**< (HSTPIPIMR) Reset Data Toggle Mask */\n#define HSTPIPIMR_Msk                 _U_(0x750BB)                                   /**< (HSTPIPIMR) Register Mask  */\n\n/* CTRL mode */\n#define HSTPIPIMR_CTRL_TXSTPE_Pos     2                                              /**< (HSTPIPIMR) Transmitted SETUP Interrupt Enable Position */\n#define HSTPIPIMR_CTRL_TXSTPE         (_U_(0x1) << HSTPIPIMR_CTRL_TXSTPE_Pos)  /**< (HSTPIPIMR) Transmitted SETUP Interrupt Enable Mask */\n#define HSTPIPIMR_CTRL_RXSTALLDE_Pos  6                                              /**< (HSTPIPIMR) Received STALLed Interrupt Enable Position */\n#define HSTPIPIMR_CTRL_RXSTALLDE      (_U_(0x1) << HSTPIPIMR_CTRL_RXSTALLDE_Pos)  /**< (HSTPIPIMR) Received STALLed Interrupt Enable Mask */\n#define HSTPIPIMR_CTRL_Msk            _U_(0x44)                                      /**< (HSTPIPIMR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define HSTPIPIMR_ISO_UNDERFIE_Pos    2                                              /**< (HSTPIPIMR) Underflow Interrupt Enable Position */\n#define HSTPIPIMR_ISO_UNDERFIE        (_U_(0x1) << HSTPIPIMR_ISO_UNDERFIE_Pos)  /**< (HSTPIPIMR) Underflow Interrupt Enable Mask */\n#define HSTPIPIMR_ISO_CRCERRE_Pos     6                                              /**< (HSTPIPIMR) CRC Error Interrupt Enable Position */\n#define HSTPIPIMR_ISO_CRCERRE         (_U_(0x1) << HSTPIPIMR_ISO_CRCERRE_Pos)  /**< (HSTPIPIMR) CRC Error Interrupt Enable Mask */\n#define HSTPIPIMR_ISO_Msk             _U_(0x44)                                      /**< (HSTPIPIMR_ISO) Register Mask  */\n\n/* BLK mode */\n#define HSTPIPIMR_BLK_TXSTPE_Pos      2                                              /**< (HSTPIPIMR) Transmitted SETUP Interrupt Enable Position */\n#define HSTPIPIMR_BLK_TXSTPE          (_U_(0x1) << HSTPIPIMR_BLK_TXSTPE_Pos)   /**< (HSTPIPIMR) Transmitted SETUP Interrupt Enable Mask */\n#define HSTPIPIMR_BLK_RXSTALLDE_Pos   6                                              /**< (HSTPIPIMR) Received STALLed Interrupt Enable Position */\n#define HSTPIPIMR_BLK_RXSTALLDE       (_U_(0x1) << HSTPIPIMR_BLK_RXSTALLDE_Pos)  /**< (HSTPIPIMR) Received STALLed Interrupt Enable Mask */\n#define HSTPIPIMR_BLK_Msk             _U_(0x44)                                      /**< (HSTPIPIMR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define HSTPIPIMR_INTRPT_UNDERFIE_Pos 2                                              /**< (HSTPIPIMR) Underflow Interrupt Enable Position */\n#define HSTPIPIMR_INTRPT_UNDERFIE     (_U_(0x1) << HSTPIPIMR_INTRPT_UNDERFIE_Pos)  /**< (HSTPIPIMR) Underflow Interrupt Enable Mask */\n#define HSTPIPIMR_INTRPT_RXSTALLDE_Pos 6                                              /**< (HSTPIPIMR) Received STALLed Interrupt Enable Position */\n#define HSTPIPIMR_INTRPT_RXSTALLDE     (_U_(0x1) << HSTPIPIMR_INTRPT_RXSTALLDE_Pos)  /**< (HSTPIPIMR) Received STALLed Interrupt Enable Mask */\n#define HSTPIPIMR_INTRPT_Msk          _U_(0x44)                                      /**< (HSTPIPIMR_INTRPT) Register Mask  */\n\n\n/* -------- HSTPIPIER : (USBHS Offset: 0x5f0) (/W 32) Host Pipe Enable Register -------- */\n\n#define HSTPIPIER_OFFSET              (0x5F0)                                       /**<  (HSTPIPIER) Host Pipe Enable Register  Offset */\n\n#define HSTPIPIER_RXINES_Pos          0                                              /**< (HSTPIPIER) Received IN Data Interrupt Enable Position */\n#define HSTPIPIER_RXINES              (_U_(0x1) << HSTPIPIER_RXINES_Pos)       /**< (HSTPIPIER) Received IN Data Interrupt Enable Mask */\n#define HSTPIPIER_TXOUTES_Pos         1                                              /**< (HSTPIPIER) Transmitted OUT Data Interrupt Enable Position */\n#define HSTPIPIER_TXOUTES             (_U_(0x1) << HSTPIPIER_TXOUTES_Pos)      /**< (HSTPIPIER) Transmitted OUT Data Interrupt Enable Mask */\n#define HSTPIPIER_PERRES_Pos          3                                              /**< (HSTPIPIER) Pipe Error Interrupt Enable Position */\n#define HSTPIPIER_PERRES              (_U_(0x1) << HSTPIPIER_PERRES_Pos)       /**< (HSTPIPIER) Pipe Error Interrupt Enable Mask */\n#define HSTPIPIER_NAKEDES_Pos         4                                              /**< (HSTPIPIER) NAKed Interrupt Enable Position */\n#define HSTPIPIER_NAKEDES             (_U_(0x1) << HSTPIPIER_NAKEDES_Pos)      /**< (HSTPIPIER) NAKed Interrupt Enable Mask */\n#define HSTPIPIER_OVERFIES_Pos        5                                              /**< (HSTPIPIER) Overflow Interrupt Enable Position */\n#define HSTPIPIER_OVERFIES            (_U_(0x1) << HSTPIPIER_OVERFIES_Pos)     /**< (HSTPIPIER) Overflow Interrupt Enable Mask */\n#define HSTPIPIER_SHORTPACKETIES_Pos  7                                              /**< (HSTPIPIER) Short Packet Interrupt Enable Position */\n#define HSTPIPIER_SHORTPACKETIES      (_U_(0x1) << HSTPIPIER_SHORTPACKETIES_Pos)  /**< (HSTPIPIER) Short Packet Interrupt Enable Mask */\n#define HSTPIPIER_NBUSYBKES_Pos       12                                             /**< (HSTPIPIER) Number of Busy Banks Enable Position */\n#define HSTPIPIER_NBUSYBKES           (_U_(0x1) << HSTPIPIER_NBUSYBKES_Pos)    /**< (HSTPIPIER) Number of Busy Banks Enable Mask */\n#define HSTPIPIER_PDISHDMAS_Pos       16                                             /**< (HSTPIPIER) Pipe Interrupts Disable HDMA Request Enable Position */\n#define HSTPIPIER_PDISHDMAS           (_U_(0x1) << HSTPIPIER_PDISHDMAS_Pos)    /**< (HSTPIPIER) Pipe Interrupts Disable HDMA Request Enable Mask */\n#define HSTPIPIER_PFREEZES_Pos        17                                             /**< (HSTPIPIER) Pipe Freeze Enable Position */\n#define HSTPIPIER_PFREEZES            (_U_(0x1) << HSTPIPIER_PFREEZES_Pos)     /**< (HSTPIPIER) Pipe Freeze Enable Mask */\n#define HSTPIPIER_RSTDTS_Pos          18                                             /**< (HSTPIPIER) Reset Data Toggle Enable Position */\n#define HSTPIPIER_RSTDTS              (_U_(0x1) << HSTPIPIER_RSTDTS_Pos)       /**< (HSTPIPIER) Reset Data Toggle Enable Mask */\n#define HSTPIPIER_Msk                 _U_(0x710BB)                                   /**< (HSTPIPIER) Register Mask  */\n\n/* CTRL mode */\n#define HSTPIPIER_CTRL_TXSTPES_Pos    2                                              /**< (HSTPIPIER) Transmitted SETUP Interrupt Enable Position */\n#define HSTPIPIER_CTRL_TXSTPES        (_U_(0x1) << HSTPIPIER_CTRL_TXSTPES_Pos)  /**< (HSTPIPIER) Transmitted SETUP Interrupt Enable Mask */\n#define HSTPIPIER_CTRL_RXSTALLDES_Pos 6                                              /**< (HSTPIPIER) Received STALLed Interrupt Enable Position */\n#define HSTPIPIER_CTRL_RXSTALLDES     (_U_(0x1) << HSTPIPIER_CTRL_RXSTALLDES_Pos)  /**< (HSTPIPIER) Received STALLed Interrupt Enable Mask */\n#define HSTPIPIER_CTRL_Msk            _U_(0x44)                                      /**< (HSTPIPIER_CTRL) Register Mask  */\n\n/* ISO mode */\n#define HSTPIPIER_ISO_UNDERFIES_Pos   2                                              /**< (HSTPIPIER) Underflow Interrupt Enable Position */\n#define HSTPIPIER_ISO_UNDERFIES       (_U_(0x1) << HSTPIPIER_ISO_UNDERFIES_Pos)  /**< (HSTPIPIER) Underflow Interrupt Enable Mask */\n#define HSTPIPIER_ISO_CRCERRES_Pos    6                                              /**< (HSTPIPIER) CRC Error Interrupt Enable Position */\n#define HSTPIPIER_ISO_CRCERRES        (_U_(0x1) << HSTPIPIER_ISO_CRCERRES_Pos)  /**< (HSTPIPIER) CRC Error Interrupt Enable Mask */\n#define HSTPIPIER_ISO_Msk             _U_(0x44)                                      /**< (HSTPIPIER_ISO) Register Mask  */\n\n/* BLK mode */\n#define HSTPIPIER_BLK_TXSTPES_Pos     2                                              /**< (HSTPIPIER) Transmitted SETUP Interrupt Enable Position */\n#define HSTPIPIER_BLK_TXSTPES         (_U_(0x1) << HSTPIPIER_BLK_TXSTPES_Pos)  /**< (HSTPIPIER) Transmitted SETUP Interrupt Enable Mask */\n#define HSTPIPIER_BLK_RXSTALLDES_Pos  6                                              /**< (HSTPIPIER) Received STALLed Interrupt Enable Position */\n#define HSTPIPIER_BLK_RXSTALLDES      (_U_(0x1) << HSTPIPIER_BLK_RXSTALLDES_Pos)  /**< (HSTPIPIER) Received STALLed Interrupt Enable Mask */\n#define HSTPIPIER_BLK_Msk             _U_(0x44)                                      /**< (HSTPIPIER_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define HSTPIPIER_INTRPT_UNDERFIES_Pos 2                                              /**< (HSTPIPIER) Underflow Interrupt Enable Position */\n#define HSTPIPIER_INTRPT_UNDERFIES     (_U_(0x1) << HSTPIPIER_INTRPT_UNDERFIES_Pos)  /**< (HSTPIPIER) Underflow Interrupt Enable Mask */\n#define HSTPIPIER_INTRPT_RXSTALLDES_Pos 6                                              /**< (HSTPIPIER) Received STALLed Interrupt Enable Position */\n#define HSTPIPIER_INTRPT_RXSTALLDES     (_U_(0x1) << HSTPIPIER_INTRPT_RXSTALLDES_Pos)  /**< (HSTPIPIER) Received STALLed Interrupt Enable Mask */\n#define HSTPIPIER_INTRPT_Msk          _U_(0x44)                                      /**< (HSTPIPIER_INTRPT) Register Mask  */\n\n\n/* -------- HSTPIPIDR : (USBHS Offset: 0x620) (/W 32) Host Pipe Disable Register -------- */\n\n#define HSTPIPIDR_OFFSET              (0x620)                                       /**<  (HSTPIPIDR) Host Pipe Disable Register  Offset */\n\n#define HSTPIPIDR_RXINEC_Pos          0                                              /**< (HSTPIPIDR) Received IN Data Interrupt Disable Position */\n#define HSTPIPIDR_RXINEC              (_U_(0x1) << HSTPIPIDR_RXINEC_Pos)       /**< (HSTPIPIDR) Received IN Data Interrupt Disable Mask */\n#define HSTPIPIDR_TXOUTEC_Pos         1                                              /**< (HSTPIPIDR) Transmitted OUT Data Interrupt Disable Position */\n#define HSTPIPIDR_TXOUTEC             (_U_(0x1) << HSTPIPIDR_TXOUTEC_Pos)      /**< (HSTPIPIDR) Transmitted OUT Data Interrupt Disable Mask */\n#define HSTPIPIDR_PERREC_Pos          3                                              /**< (HSTPIPIDR) Pipe Error Interrupt Disable Position */\n#define HSTPIPIDR_PERREC              (_U_(0x1) << HSTPIPIDR_PERREC_Pos)       /**< (HSTPIPIDR) Pipe Error Interrupt Disable Mask */\n#define HSTPIPIDR_NAKEDEC_Pos         4                                              /**< (HSTPIPIDR) NAKed Interrupt Disable Position */\n#define HSTPIPIDR_NAKEDEC             (_U_(0x1) << HSTPIPIDR_NAKEDEC_Pos)      /**< (HSTPIPIDR) NAKed Interrupt Disable Mask */\n#define HSTPIPIDR_OVERFIEC_Pos        5                                              /**< (HSTPIPIDR) Overflow Interrupt Disable Position */\n#define HSTPIPIDR_OVERFIEC            (_U_(0x1) << HSTPIPIDR_OVERFIEC_Pos)     /**< (HSTPIPIDR) Overflow Interrupt Disable Mask */\n#define HSTPIPIDR_SHORTPACKETIEC_Pos  7                                              /**< (HSTPIPIDR) Short Packet Interrupt Disable Position */\n#define HSTPIPIDR_SHORTPACKETIEC      (_U_(0x1) << HSTPIPIDR_SHORTPACKETIEC_Pos)  /**< (HSTPIPIDR) Short Packet Interrupt Disable Mask */\n#define HSTPIPIDR_NBUSYBKEC_Pos       12                                             /**< (HSTPIPIDR) Number of Busy Banks Disable Position */\n#define HSTPIPIDR_NBUSYBKEC           (_U_(0x1) << HSTPIPIDR_NBUSYBKEC_Pos)    /**< (HSTPIPIDR) Number of Busy Banks Disable Mask */\n#define HSTPIPIDR_FIFOCONC_Pos        14                                             /**< (HSTPIPIDR) FIFO Control Disable Position */\n#define HSTPIPIDR_FIFOCONC            (_U_(0x1) << HSTPIPIDR_FIFOCONC_Pos)     /**< (HSTPIPIDR) FIFO Control Disable Mask */\n#define HSTPIPIDR_PDISHDMAC_Pos       16                                             /**< (HSTPIPIDR) Pipe Interrupts Disable HDMA Request Disable Position */\n#define HSTPIPIDR_PDISHDMAC           (_U_(0x1) << HSTPIPIDR_PDISHDMAC_Pos)    /**< (HSTPIPIDR) Pipe Interrupts Disable HDMA Request Disable Mask */\n#define HSTPIPIDR_PFREEZEC_Pos        17                                             /**< (HSTPIPIDR) Pipe Freeze Disable Position */\n#define HSTPIPIDR_PFREEZEC            (_U_(0x1) << HSTPIPIDR_PFREEZEC_Pos)     /**< (HSTPIPIDR) Pipe Freeze Disable Mask */\n#define HSTPIPIDR_Msk                 _U_(0x350BB)                                   /**< (HSTPIPIDR) Register Mask  */\n\n/* CTRL mode */\n#define HSTPIPIDR_CTRL_TXSTPEC_Pos    2                                              /**< (HSTPIPIDR) Transmitted SETUP Interrupt Disable Position */\n#define HSTPIPIDR_CTRL_TXSTPEC        (_U_(0x1) << HSTPIPIDR_CTRL_TXSTPEC_Pos)  /**< (HSTPIPIDR) Transmitted SETUP Interrupt Disable Mask */\n#define HSTPIPIDR_CTRL_RXSTALLDEC_Pos 6                                              /**< (HSTPIPIDR) Received STALLed Interrupt Disable Position */\n#define HSTPIPIDR_CTRL_RXSTALLDEC     (_U_(0x1) << HSTPIPIDR_CTRL_RXSTALLDEC_Pos)  /**< (HSTPIPIDR) Received STALLed Interrupt Disable Mask */\n#define HSTPIPIDR_CTRL_Msk            _U_(0x44)                                      /**< (HSTPIPIDR_CTRL) Register Mask  */\n\n/* ISO mode */\n#define HSTPIPIDR_ISO_UNDERFIEC_Pos   2                                              /**< (HSTPIPIDR) Underflow Interrupt Disable Position */\n#define HSTPIPIDR_ISO_UNDERFIEC       (_U_(0x1) << HSTPIPIDR_ISO_UNDERFIEC_Pos)  /**< (HSTPIPIDR) Underflow Interrupt Disable Mask */\n#define HSTPIPIDR_ISO_CRCERREC_Pos    6                                              /**< (HSTPIPIDR) CRC Error Interrupt Disable Position */\n#define HSTPIPIDR_ISO_CRCERREC        (_U_(0x1) << HSTPIPIDR_ISO_CRCERREC_Pos)  /**< (HSTPIPIDR) CRC Error Interrupt Disable Mask */\n#define HSTPIPIDR_ISO_Msk             _U_(0x44)                                      /**< (HSTPIPIDR_ISO) Register Mask  */\n\n/* BLK mode */\n#define HSTPIPIDR_BLK_TXSTPEC_Pos     2                                              /**< (HSTPIPIDR) Transmitted SETUP Interrupt Disable Position */\n#define HSTPIPIDR_BLK_TXSTPEC         (_U_(0x1) << HSTPIPIDR_BLK_TXSTPEC_Pos)  /**< (HSTPIPIDR) Transmitted SETUP Interrupt Disable Mask */\n#define HSTPIPIDR_BLK_RXSTALLDEC_Pos  6                                              /**< (HSTPIPIDR) Received STALLed Interrupt Disable Position */\n#define HSTPIPIDR_BLK_RXSTALLDEC      (_U_(0x1) << HSTPIPIDR_BLK_RXSTALLDEC_Pos)  /**< (HSTPIPIDR) Received STALLed Interrupt Disable Mask */\n#define HSTPIPIDR_BLK_Msk             _U_(0x44)                                      /**< (HSTPIPIDR_BLK) Register Mask  */\n\n/* INTRPT mode */\n#define HSTPIPIDR_INTRPT_UNDERFIEC_Pos 2                                              /**< (HSTPIPIDR) Underflow Interrupt Disable Position */\n#define HSTPIPIDR_INTRPT_UNDERFIEC     (_U_(0x1) << HSTPIPIDR_INTRPT_UNDERFIEC_Pos)  /**< (HSTPIPIDR) Underflow Interrupt Disable Mask */\n#define HSTPIPIDR_INTRPT_RXSTALLDEC_Pos 6                                              /**< (HSTPIPIDR) Received STALLed Interrupt Disable Position */\n#define HSTPIPIDR_INTRPT_RXSTALLDEC     (_U_(0x1) << HSTPIPIDR_INTRPT_RXSTALLDEC_Pos)  /**< (HSTPIPIDR) Received STALLed Interrupt Disable Mask */\n#define HSTPIPIDR_INTRPT_Msk          _U_(0x44)                                      /**< (HSTPIPIDR_INTRPT) Register Mask  */\n\n\n/* -------- HSTPIPINRQ : (USBHS Offset: 0x650) (R/W 32) Host Pipe IN Request Register -------- */\n\n#define HSTPIPINRQ_OFFSET             (0x650)                                       /**<  (HSTPIPINRQ) Host Pipe IN Request Register  Offset */\n\n#define HSTPIPINRQ_INRQ_Pos           0                                              /**< (HSTPIPINRQ) IN Request Number before Freeze Position */\n#define HSTPIPINRQ_INRQ               (_U_(0xFF) << HSTPIPINRQ_INRQ_Pos)       /**< (HSTPIPINRQ) IN Request Number before Freeze Mask */\n#define HSTPIPINRQ_INMODE_Pos         8                                              /**< (HSTPIPINRQ) IN Request Mode Position */\n#define HSTPIPINRQ_INMODE             (_U_(0x1) << HSTPIPINRQ_INMODE_Pos)      /**< (HSTPIPINRQ) IN Request Mode Mask */\n#define HSTPIPINRQ_Msk                _U_(0x1FF)                                     /**< (HSTPIPINRQ) Register Mask  */\n\n\n/* -------- HSTPIPERR : (USBHS Offset: 0x680) (R/W 32) Host Pipe Error Register -------- */\n\n#define HSTPIPERR_OFFSET              (0x680)                                       /**<  (HSTPIPERR) Host Pipe Error Register  Offset */\n\n#define HSTPIPERR_DATATGL_Pos         0                                              /**< (HSTPIPERR) Data Toggle Error Position */\n#define HSTPIPERR_DATATGL             (_U_(0x1) << HSTPIPERR_DATATGL_Pos)      /**< (HSTPIPERR) Data Toggle Error Mask */\n#define HSTPIPERR_DATAPID_Pos         1                                              /**< (HSTPIPERR) Data PID Error Position */\n#define HSTPIPERR_DATAPID             (_U_(0x1) << HSTPIPERR_DATAPID_Pos)      /**< (HSTPIPERR) Data PID Error Mask */\n#define HSTPIPERR_PID_Pos             2                                              /**< (HSTPIPERR) Data PID Error Position */\n#define HSTPIPERR_PID                 (_U_(0x1) << HSTPIPERR_PID_Pos)          /**< (HSTPIPERR) Data PID Error Mask */\n#define HSTPIPERR_TIMEOUT_Pos         3                                              /**< (HSTPIPERR) Time-Out Error Position */\n#define HSTPIPERR_TIMEOUT             (_U_(0x1) << HSTPIPERR_TIMEOUT_Pos)      /**< (HSTPIPERR) Time-Out Error Mask */\n#define HSTPIPERR_CRC16_Pos           4                                              /**< (HSTPIPERR) CRC16 Error Position */\n#define HSTPIPERR_CRC16               (_U_(0x1) << HSTPIPERR_CRC16_Pos)        /**< (HSTPIPERR) CRC16 Error Mask */\n#define HSTPIPERR_COUNTER_Pos         5                                              /**< (HSTPIPERR) Error Counter Position */\n#define HSTPIPERR_COUNTER             (_U_(0x3) << HSTPIPERR_COUNTER_Pos)      /**< (HSTPIPERR) Error Counter Mask */\n#define HSTPIPERR_Msk                 _U_(0x7F)                                      /**< (HSTPIPERR) Register Mask  */\n\n#define HSTPIPERR_CRC_Pos             4                                              /**< (HSTPIPERR Position) CRCx6 Error */\n#define HSTPIPERR_CRC                 (_U_(0x1) << HSTPIPERR_CRC_Pos)          /**< (HSTPIPERR Mask) CRC */\n\n/* -------- CTRL : (USBHS Offset: 0x800) (R/W 32) General Control Register -------- */\n\n#define CTRL_OFFSET                   (0x800)                                       /**<  (CTRL) General Control Register  Offset */\n\n#define CTRL_RDERRE_Pos               4                                              /**< (CTRL) Remote Device Connection Error Interrupt Enable Position */\n#define CTRL_RDERRE                   (_U_(0x1) << CTRL_RDERRE_Pos)            /**< (CTRL) Remote Device Connection Error Interrupt Enable Mask */\n#define CTRL_VBUSHWC_Pos              8                                              /**< (CTRL) VBUS Hardware Control Position */\n#define CTRL_VBUSHWC                  (_U_(0x1) << CTRL_VBUSHWC_Pos)           /**< (CTRL) VBUS Hardware Control Mask */\n#define CTRL_FRZCLK_Pos               14                                             /**< (CTRL) Freeze USB Clock Position */\n#define CTRL_FRZCLK                   (_U_(0x1) << CTRL_FRZCLK_Pos)            /**< (CTRL) Freeze USB Clock Mask */\n#define CTRL_USBE_Pos                 15                                             /**< (CTRL) USBHS Enable Position */\n#define CTRL_USBE                     (_U_(0x1) << CTRL_USBE_Pos)              /**< (CTRL) USBHS Enable Mask */\n#define CTRL_UID_Pos                  24                                             /**< (CTRL) UID Pin Enable Position */\n#define CTRL_UID                      (_U_(0x1) << CTRL_UID_Pos)               /**< (CTRL) UID Pin Enable Mask */\n#define CTRL_UIMOD_Pos                25                                             /**< (CTRL) USBHS Mode Position */\n#define CTRL_UIMOD                    (_U_(0x1) << CTRL_UIMOD_Pos)             /**< (CTRL) USBHS Mode Mask */\n#define   CTRL_UIMOD_HOST_Val         _U_(0x0)                                       /**< (CTRL) The module is in USB Host mode.  */\n#define   CTRL_UIMOD_DEVICE_Val       _U_(0x1)                                       /**< (CTRL) The module is in USB Device mode.  */\n#define CTRL_UIMOD_HOST               (CTRL_UIMOD_HOST_Val << CTRL_UIMOD_Pos)  /**< (CTRL) The module is in USB Host mode. Position  */\n#define CTRL_UIMOD_DEVICE             (CTRL_UIMOD_DEVICE_Val << CTRL_UIMOD_Pos)  /**< (CTRL) The module is in USB Device mode. Position  */\n#define CTRL_Msk                      _U_(0x300C110)                                 /**< (CTRL) Register Mask  */\n\n\n/* -------- SR : (USBHS Offset: 0x804) (R/ 32) General Status Register -------- */\n\n#define SR_OFFSET                     (0x804)                                       /**<  (SR) General Status Register  Offset */\n\n#define SR_RDERRI_Pos                 4                                              /**< (SR) Remote Device Connection Error Interrupt (Host mode only) Position */\n#define SR_RDERRI                     (_U_(0x1) << SR_RDERRI_Pos)              /**< (SR) Remote Device Connection Error Interrupt (Host mode only) Mask */\n#define SR_SPEED_Pos                  12                                             /**< (SR) Speed Status (Device mode only) Position */\n#define SR_SPEED                      (_U_(0x3) << SR_SPEED_Pos)               /**< (SR) Speed Status (Device mode only) Mask */\n#define   SR_SPEED_FULL_SPEED_Val     _U_(0x0)                                       /**< (SR) Full-Speed mode  */\n#define   SR_SPEED_HIGH_SPEED_Val     _U_(0x1)                                       /**< (SR) High-Speed mode  */\n#define   SR_SPEED_LOW_SPEED_Val      _U_(0x2)                                       /**< (SR) Low-Speed mode  */\n#define SR_SPEED_FULL_SPEED           (SR_SPEED_FULL_SPEED_Val << SR_SPEED_Pos)  /**< (SR) Full-Speed mode Position  */\n#define SR_SPEED_HIGH_SPEED           (SR_SPEED_HIGH_SPEED_Val << SR_SPEED_Pos)  /**< (SR) High-Speed mode Position  */\n#define SR_SPEED_LOW_SPEED            (SR_SPEED_LOW_SPEED_Val << SR_SPEED_Pos)  /**< (SR) Low-Speed mode Position  */\n#define SR_CLKUSABLE_Pos              14                                             /**< (SR) UTMI Clock Usable Position */\n#define SR_CLKUSABLE                  (_U_(0x1) << SR_CLKUSABLE_Pos)           /**< (SR) UTMI Clock Usable Mask */\n#define SR_Msk                        _U_(0x7010)                                    /**< (SR) Register Mask  */\n\n\n/* -------- SCR : (USBHS Offset: 0x808) (/W 32) General Status Clear Register -------- */\n\n#define SCR_OFFSET                    (0x808)                                       /**<  (SCR) General Status Clear Register  Offset */\n\n#define SCR_RDERRIC_Pos               4                                              /**< (SCR) Remote Device Connection Error Interrupt Clear Position */\n#define SCR_RDERRIC                   (_U_(0x1) << SCR_RDERRIC_Pos)            /**< (SCR) Remote Device Connection Error Interrupt Clear Mask */\n#define SCR_Msk                       _U_(0x10)                                      /**< (SCR) Register Mask  */\n\n\n/* -------- SFR : (USBHS Offset: 0x80c) (/W 32) General Status Set Register -------- */\n\n#define SFR_OFFSET                    (0x80C)                                       /**<  (SFR) General Status Set Register  Offset */\n\n#define SFR_RDERRIS_Pos               4                                              /**< (SFR) Remote Device Connection Error Interrupt Set Position */\n#define SFR_RDERRIS                   (_U_(0x1) << SFR_RDERRIS_Pos)            /**< (SFR) Remote Device Connection Error Interrupt Set Mask */\n#define SFR_VBUSRQS_Pos               9                                              /**< (SFR) VBUS Request Set Position */\n#define SFR_VBUSRQS                   (_U_(0x1) << SFR_VBUSRQS_Pos)            /**< (SFR) VBUS Request Set Mask */\n#define SFR_Msk                       _U_(0x210)                                     /**< (SFR) Register Mask  */\n\n\n/** \\brief DEVDMA hardware registers */\ntypedef struct\n{\n  __IO uint32_t DEVDMANXTDSC; /**< (DEVDMA Offset: 0x00) Device DMA Channel Next Descriptor Address Register */\n  __IO uint32_t DEVDMAADDRESS; /**< (DEVDMA Offset: 0x04) Device DMA Channel Address Register */\n  __IO uint32_t DEVDMACONTROL; /**< (DEVDMA Offset: 0x08) Device DMA Channel Control Register */\n  __IO uint32_t DEVDMASTATUS; /**< (DEVDMA Offset: 0x0C) Device DMA Channel Status Register */\n} devdma_t;\n\n/** \\brief HSTDMA hardware registers */\ntypedef struct\n{\n  __IO uint32_t HSTDMANXTDSC; /**< (HSTDMA Offset: 0x00) Host DMA Channel Next Descriptor Address Register */\n  __IO uint32_t HSTDMAADDRESS; /**< (HSTDMA Offset: 0x04) Host DMA Channel Address Register */\n  __IO uint32_t HSTDMACONTROL; /**< (HSTDMA Offset: 0x08) Host DMA Channel Control Register */\n  __IO uint32_t HSTDMASTATUS; /**< (HSTDMA Offset: 0x0C) Host DMA Channel Status Register */\n} hstdma_t;\n\n/** \\brief USBHS hardware registers */\ntypedef struct\n{\n  __IO uint32_t DEVCTRL;  /**< (USBHS Offset: 0x00) Device General Control Register */\n  __I  uint32_t DEVISR;   /**< (USBHS Offset: 0x04) Device Global Interrupt Status Register */\n  __O  uint32_t DEVICR;   /**< (USBHS Offset: 0x08) Device Global Interrupt Clear Register */\n  __O  uint32_t DEVIFR;   /**< (USBHS Offset: 0x0C) Device Global Interrupt Set Register */\n  __I  uint32_t DEVIMR;   /**< (USBHS Offset: 0x10) Device Global Interrupt Mask Register */\n  __O  uint32_t DEVIDR;   /**< (USBHS Offset: 0x14) Device Global Interrupt Disable Register */\n  __O  uint32_t DEVIER;   /**< (USBHS Offset: 0x18) Device Global Interrupt Enable Register */\n  __IO uint32_t DEVEPT;   /**< (USBHS Offset: 0x1C) Device Endpoint Register */\n  __I  uint32_t DEVFNUM;  /**< (USBHS Offset: 0x20) Device Frame Number Register */\n  __I  uint8_t                        Reserved1[220];\n  __IO uint32_t DEVEPTCFG[10]; /**< (USBHS Offset: 0x100) Device Endpoint Configuration Register */\n  __I  uint8_t                        Reserved2[8];\n  __I  uint32_t DEVEPTISR[10]; /**< (USBHS Offset: 0x130) Device Endpoint Interrupt Status Register */\n  __I  uint8_t                        Reserved3[8];\n  __O  uint32_t DEVEPTICR[10]; /**< (USBHS Offset: 0x160) Device Endpoint Interrupt Clear Register */\n  __I  uint8_t                        Reserved4[8];\n  __O  uint32_t DEVEPTIFR[10]; /**< (USBHS Offset: 0x190) Device Endpoint Interrupt Set Register */\n  __I  uint8_t                        Reserved5[8];\n  __I  uint32_t DEVEPTIMR[10]; /**< (USBHS Offset: 0x1C0) Device Endpoint Interrupt Mask Register */\n  __I  uint8_t                        Reserved6[8];\n  __O  uint32_t DEVEPTIER[10]; /**< (USBHS Offset: 0x1F0) Device Endpoint Interrupt Enable Register */\n  __I  uint8_t                        Reserved7[8];\n  __O  uint32_t DEVEPTIDR[10]; /**< (USBHS Offset: 0x220) Device Endpoint Interrupt Disable Register */\n  __I  uint8_t                        Reserved8[200];\n       devdma_t DEVDMA[7]; /**< Offset: 0x310 Device DMA Channel Next Descriptor Address Register */\n  __I  uint8_t                        Reserved9[128];\n  __IO uint32_t HSTCTRL;  /**< (USBHS Offset: 0x400) Host General Control Register */\n  __I  uint32_t HSTISR;   /**< (USBHS Offset: 0x404) Host Global Interrupt Status Register */\n  __O  uint32_t HSTICR;   /**< (USBHS Offset: 0x408) Host Global Interrupt Clear Register */\n  __O  uint32_t HSTIFR;   /**< (USBHS Offset: 0x40C) Host Global Interrupt Set Register */\n  __I  uint32_t HSTIMR;   /**< (USBHS Offset: 0x410) Host Global Interrupt Mask Register */\n  __O  uint32_t HSTIDR;   /**< (USBHS Offset: 0x414) Host Global Interrupt Disable Register */\n  __O  uint32_t HSTIER;   /**< (USBHS Offset: 0x418) Host Global Interrupt Enable Register */\n  __IO uint32_t HSTPIP;   /**< (USBHS Offset: 0x41C) Host Pipe Register */\n  __IO uint32_t HSTFNUM;  /**< (USBHS Offset: 0x420) Host Frame Number Register */\n  __IO uint32_t HSTADDR1; /**< (USBHS Offset: 0x424) Host Address 1 Register */\n  __IO uint32_t HSTADDR2; /**< (USBHS Offset: 0x428) Host Address 2 Register */\n  __IO uint32_t HSTADDR3; /**< (USBHS Offset: 0x42C) Host Address 3 Register */\n  __I  uint8_t                        Reserved10[208];\n  __IO uint32_t HSTPIPCFG[10]; /**< (USBHS Offset: 0x500) Host Pipe Configuration Register */\n  __I  uint8_t                        Reserved11[8];\n  __I  uint32_t HSTPIPISR[10]; /**< (USBHS Offset: 0x530) Host Pipe Status Register */\n  __I  uint8_t                        Reserved12[8];\n  __O  uint32_t HSTPIPICR[10]; /**< (USBHS Offset: 0x560) Host Pipe Clear Register */\n  __I  uint8_t                        Reserved13[8];\n  __O  uint32_t HSTPIPIFR[10]; /**< (USBHS Offset: 0x590) Host Pipe Set Register */\n  __I  uint8_t                        Reserved14[8];\n  __I  uint32_t HSTPIPIMR[10]; /**< (USBHS Offset: 0x5C0) Host Pipe Mask Register */\n  __I  uint8_t                        Reserved15[8];\n  __O  uint32_t HSTPIPIER[10]; /**< (USBHS Offset: 0x5F0) Host Pipe Enable Register */\n  __I  uint8_t                        Reserved16[8];\n  __O  uint32_t HSTPIPIDR[10]; /**< (USBHS Offset: 0x620) Host Pipe Disable Register */\n  __I  uint8_t                        Reserved17[8];\n  __IO uint32_t HSTPIPINRQ[10]; /**< (USBHS Offset: 0x650) Host Pipe IN Request Register */\n  __I  uint8_t                        Reserved18[8];\n  __IO uint32_t HSTPIPERR[10]; /**< (USBHS Offset: 0x680) Host Pipe Error Register */\n  __I  uint8_t                        Reserved19[104];\n       hstdma_t HSTDMA[7]; /**< Offset: 0x710 Host DMA Channel Next Descriptor Address Register */\n  __I  uint8_t                        Reserved20[128];\n  __IO uint32_t CTRL;     /**< (USBHS Offset: 0x800) General Control Register */\n  __I  uint32_t SR;       /**< (USBHS Offset: 0x804) General Status Register */\n  __O  uint32_t SCR;      /**< (USBHS Offset: 0x808) General Status Clear Register */\n  __O  uint32_t SFR;      /**< (USBHS Offset: 0x80C) General Status Set Register */\n} dcd_registers_t;\n\n#define USB_REG           ((dcd_registers_t *)0x40038000U)         /**< \\brief (USBHS) Base Address */\n\n#define EP_MAX            10\n\n#define FIFO_RAM_ADDR     0xA0100000u\n\n// Errata: The DMA feature is not available for Pipe/Endpoint 7\n#define EP_DMA_SUPPORT(epnum) (epnum >= 1 && epnum <= 6 && CFG_TUD_SAMX7X_DMA_ENABLE)\n\n//------------- DCache -------------//\n#if CFG_TUD_MEM_DCACHE_ENABLE || CFG_TUH_MEM_DCACHE_ENABLE\n\ntypedef struct {\n  uintptr_t start;\n  uintptr_t end;\n} mem_region_t;\n\n// Can be used to define additional uncached regions\n#ifndef CFG_SAMX7X_MEM_UNCACHED_REGIONS\n#define CFG_SAMX7X_MEM_UNCACHED_REGIONS\n#endif\n\nstatic mem_region_t uncached_regions[] = {\n  // DTCM\n  {.start = 0x20000000, .end = 0x203fffff},\n  CFG_SAMX7X_MEM_UNCACHED_REGIONS\n};\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t round_up_to_cache_line_size(uint32_t size) {\n  if (size & (CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT-1)) {\n    size = (size & ~(CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT-1)) + CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT;\n  }\n  return size;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool is_cache_mem(uintptr_t addr) {\n  if (0 == (SCB->CCR & SCB_CCR_DC_Msk)) {\n    return false; // D-Cache is disabled\n  }\n  for (unsigned int i = 0; i < TU_ARRAY_SIZE(uncached_regions); i++) {\n    if (uncached_regions[i].start <= addr && addr <= uncached_regions[i].end) { return false; }\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool samx7x_dcache_clean(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (is_cache_mem(addr32)) {\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_CleanDCache_by_Addr((uint32_t *) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool samx7x_dcache_invalidate(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (is_cache_mem(addr32)) {\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_InvalidateDCache_by_Addr((void*) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool samx7x_dcache_clean_invalidate(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (is_cache_mem(addr32)) {\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_CleanInvalidateDCache_by_Addr((uint32_t *) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n\n#endif\n\n#else // TODO : SAM3U\n\n\n#endif\n\n#endif /* _COMMON_USB_REGS_H_ */\n"
  },
  {
    "path": "src/portable/mindmotion/mm32/dcd_mm32f327x_otg.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 SE TEAM\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && (CFG_TUSB_MCU == OPT_MCU_MM32F327X)\n\n#include \"reg_usb_otg_fs.h\"\n#include \"mm32_device.h\"\n#include \"hal_conf.h\"\n#include \"device/dcd.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\nenum {\n  TOK_PID_OUT   = 0x1u,\n  TOK_PID_IN    = 0x9u,\n  TOK_PID_SETUP = 0xDu,\n};\n\ntypedef struct TU_ATTR_PACKED {\n  union {\n    uint32_t head;\n    struct {\n      union {\n        struct {\n          uint16_t         : 2;\n          uint16_t tok_pid : 4;\n          uint16_t data    : 1;\n          uint16_t own     : 1;\n          uint16_t         : 8;\n        };\n        struct {\n          uint16_t           : 2;\n          uint16_t bdt_stall : 1;\n          uint16_t dts       : 1;\n          uint16_t ninc      : 1;\n          uint16_t keep      : 1;\n          uint16_t           : 10;\n        };\n      };\n      uint16_t bc : 10;\n      uint16_t    : 6;\n    };\n  };\n  uint8_t *addr;\n} buffer_descriptor_t;\n\nTU_VERIFY_STATIC(sizeof(buffer_descriptor_t) == 8, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED {\n  union {\n    uint32_t state;\n    struct {\n      uint32_t max_packet_size : 11;\n      uint32_t                 : 5;\n      uint32_t odd             : 1;\n      uint32_t                 : 15;\n    };\n  };\n  uint16_t length;\n  uint16_t remaining;\n} endpoint_state_t;\n\nTU_VERIFY_STATIC(sizeof(endpoint_state_t) == 8, \"size is not correct\");\n\ntypedef struct {\n  union {\n    /* [#EP][OUT,IN][EVEN,ODD] */\n    buffer_descriptor_t bdt[16][2][2];\n    uint16_t            bda[512];\n  };\n  TU_ATTR_ALIGNED(4) union {\n    endpoint_state_t endpoint[16][2];\n    endpoint_state_t endpoint_unified[16 * 2];\n  };\n  uint8_t setup_packet[8];\n  uint8_t addr;\n} dcd_data_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\n// BDT(Buffer Descriptor Table) must be 256-byte aligned\nCFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(512) static dcd_data_t _dcd;\n\nTU_VERIFY_STATIC(sizeof(_dcd.bdt) == 512, \"size is not correct\");\n\nstatic void prepare_next_setup_packet(uint8_t rhport) {\n  const unsigned out_odd = _dcd.endpoint[0][0].odd;\n  const unsigned in_odd  = _dcd.endpoint[0][1].odd;\n  if (_dcd.bdt[0][0][out_odd].own) {\n    TU_LOG1(\"DCD fail to prepare the next SETUP %d %d\\r\\n\", out_odd, in_odd);\n    return;\n  }\n  _dcd.bdt[0][0][out_odd].data     = 0;\n  _dcd.bdt[0][0][out_odd ^ 1].data = 1;\n  _dcd.bdt[0][1][in_odd].data      = 1;\n  _dcd.bdt[0][1][in_odd ^ 1].data  = 0;\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_OUT), _dcd.setup_packet, sizeof(_dcd.setup_packet), false);\n}\n\nstatic void process_stall(uint8_t rhport) {\n  if (USB_OTG_FS->EP_CTL[0] & USB_ENDPT_EPSTALL_MASK) {\n    /* clear stall condition of the control pipe */\n    prepare_next_setup_packet(rhport);\n    USB_OTG_FS->EP_CTL[0] &= ~USB_ENDPT_EPSTALL_MASK;\n  }\n}\n\nstatic void process_tokdne(uint8_t rhport) {\n  const unsigned s         = USB_OTG_FS->STAT;\n  USB_OTG_FS->INT_STAT     = USB_ISTAT_TOKDNE_MASK; /* fetch the next token if received */\n  buffer_descriptor_t *bd  = (buffer_descriptor_t *)&_dcd.bda[s];\n  endpoint_state_t    *ep  = &_dcd.endpoint_unified[s >> 3];\n  unsigned             odd = (s & USB_STAT_ODD_MASK) ? 1 : 0;\n\n  /* fetch pid before discarded by the next steps */\n  const unsigned pid = bd->tok_pid;\n  /* reset values for a next transfer */\n  bd->bdt_stall = 0;\n  bd->dts       = 1;\n  bd->ninc      = 0;\n  bd->keep      = 0;\n  /* update the odd variable to prepare for the next transfer */\n  ep->odd = odd ^ 1;\n  if (pid == TOK_PID_SETUP) {\n    dcd_event_setup_received(rhport, bd->addr, true);\n    USB_OTG_FS->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK;\n    return;\n  }\n  if (s >> 4) {\n    TU_LOG1(\"TKDNE %x\\r\\n\", s);\n  }\n\n  const unsigned bc        = bd->bc;\n  const unsigned remaining = ep->remaining - bc;\n  if (remaining && bc == ep->max_packet_size) {\n    /* continue the transferring consecutive data */\n    ep->remaining            = remaining;\n    const int next_remaining = remaining - ep->max_packet_size;\n    if (next_remaining > 0) {\n      /* prepare to the after next transfer */\n      bd->addr += ep->max_packet_size * 2;\n      bd->bc = next_remaining > ep->max_packet_size ? ep->max_packet_size : next_remaining;\n      __DSB();\n      bd->own = 1; /* the own bit must set after addr */\n    }\n    return;\n  }\n  const unsigned length = ep->length;\n  dcd_event_xfer_complete(rhport, ((s & USB_STAT_TX_MASK) << 4) | (s >> USB_STAT_ENDP_SHIFT), length - remaining,\n                          XFER_RESULT_SUCCESS, true);\n  if (0 == (s & USB_STAT_ENDP_MASK) && 0 == length) {\n    /* After completion a ZLP of control transfer,\n     * it prepares for the next steup transfer. */\n    if (_dcd.addr) {\n      /* When the transfer was the SetAddress,\n       * the device address should be updated here. */\n      USB_OTG_FS->ADDR = _dcd.addr;\n      _dcd.addr        = 0;\n    }\n    prepare_next_setup_packet(rhport);\n  }\n}\n\nstatic void process_bus_reset(uint8_t rhport) {\n  USB_OTG_FS->CTL |= USB_CTL_ODDRST_MASK;\n  USB_OTG_FS->ADDR    = 0;\n  USB_OTG_FS->INT_ENB = (USB_OTG_FS->INT_ENB & ~USB_INTEN_RESUMEEN_MASK) | USB_INTEN_SLEEPEN_MASK;\n\n  USB_OTG_FS->EP_CTL[0] = USB_ENDPT_EPHSHK_MASK | USB_ENDPT_EPRXEN_MASK | USB_ENDPT_EPTXEN_MASK;\n  for (unsigned i = 1; i < 16; ++i) {\n    USB_OTG_FS->EP_CTL[i] = 0;\n  }\n  buffer_descriptor_t *bd = _dcd.bdt[0][0];\n  for (unsigned i = 0; i < sizeof(_dcd.bdt) / sizeof(*bd); ++i, ++bd) {\n    bd->head = 0;\n  }\n  const endpoint_state_t ep0 = {\n    .max_packet_size = CFG_TUD_ENDPOINT0_SIZE,\n    .odd             = 0,\n    .length          = 0,\n    .remaining       = 0,\n  };\n  _dcd.endpoint[0][0] = ep0;\n  _dcd.endpoint[0][1] = ep0;\n  tu_memclr(_dcd.endpoint[1], sizeof(_dcd.endpoint) - sizeof(_dcd.endpoint[0]));\n  _dcd.addr = 0;\n  prepare_next_setup_packet(rhport);\n  USB_OTG_FS->CTL &= ~USB_CTL_ODDRST_MASK;\n  dcd_event_bus_reset(rhport, TUSB_SPEED_FULL, true);\n}\n\nstatic void process_bus_inactive(uint8_t rhport) {\n  (void)rhport;\n  const unsigned inten = USB_OTG_FS->INT_ENB;\n  USB_OTG_FS->INT_ENB  = (inten & ~USB_INTEN_SLEEPEN_MASK) | USB_INTEN_RESUMEEN_MASK;\n  dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n}\n\nstatic void process_bus_active(uint8_t rhport) {\n  (void)rhport;\n  const unsigned inten = USB_OTG_FS->INT_ENB;\n  USB_OTG_FS->INT_ENB  = (inten & ~USB_INTEN_RESUMEEN_MASK) | USB_INTEN_SLEEPEN_MASK;\n  dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n}\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init) {\n  (void)rhport;\n  (void)rh_init;\n\n  tu_memclr(&_dcd, sizeof(_dcd));\n  USB_OTG_FS->BDT_PAGE_01 = (uint8_t)((uintptr_t)_dcd.bdt >> 8);\n  USB_OTG_FS->BDT_PAGE_02 = (uint8_t)((uintptr_t)_dcd.bdt >> 16);\n  USB_OTG_FS->BDT_PAGE_03 = (uint8_t)((uintptr_t)_dcd.bdt >> 24);\n\n  dcd_connect(rhport);\n  NVIC_ClearPendingIRQ(USB_FS_IRQn);\n  return true;\n}\n#define USB_DEVICE_INTERRUPT_PRIORITY (3U)\nvoid dcd_int_enable(uint8_t rhport) {\n  uint8_t irqNumber;\n  irqNumber = USB_FS_IRQn;\n  (void)rhport;\n  USB_OTG_FS->INT_ENB = USB_INTEN_USBRSTEN_MASK | USB_INTEN_TOKDNEEN_MASK | USB_INTEN_SLEEPEN_MASK |\n                        USB_INTEN_ERROREN_MASK | USB_INTEN_STALLEN_MASK;\n  NVIC_SetPriority((IRQn_Type)irqNumber, USB_DEVICE_INTERRUPT_PRIORITY);\n  NVIC_EnableIRQ(USB_FS_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_DisableIRQ(USB_FS_IRQn);\n  USB_OTG_FS->INT_ENB = 0;\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  (void)rhport;\n  _dcd.addr = dev_addr & 0x7F;\n  /* Response with status first before changing device address */\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n}\n\n#ifdef __GNUC__ // caused by extra declaration of SystemCoreClock in freeRTOSConfig.h\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\nextern u32 SystemCoreClock;\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  (void)rhport;\n  unsigned cnt = SystemCoreClock / 100;\n  USB_OTG_FS->CTL |= USB_CTL_RESUME_MASK;\n  while (cnt--) {\n    __NOP();\n  }\n  USB_OTG_FS->CTL &= ~USB_CTL_RESUME_MASK;\n}\n\nvoid dcd_connect(uint8_t rhport) {\n  (void)rhport;\n  USB_OTG_FS->CTL |= USB_CTL_USBENSOFEN_MASK;\n}\n\nvoid dcd_disconnect(uint8_t rhport) {\n  (void)rhport;\n  USB_OTG_FS->CTL = 0;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void)rhport;\n  (void)en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\nbool dcd_edpt_open(uint8_t rhport, const tusb_desc_endpoint_t *ep_desc) {\n  (void)rhport;\n\n  const unsigned       ep_addr = ep_desc->bEndpointAddress;\n  const unsigned       epn     = ep_addr & 0xFu;\n  const unsigned       dir     = (ep_addr & TUSB_DIR_IN_MASK) ? TUSB_DIR_IN : TUSB_DIR_OUT;\n  const unsigned       xfer    = ep_desc->bmAttributes.xfer;\n  endpoint_state_t    *ep      = &_dcd.endpoint[epn][dir];\n  const unsigned       odd     = ep->odd;\n  buffer_descriptor_t *bd      = &_dcd.bdt[epn][dir][0];\n\n  /* No support for control transfer */\n  TU_ASSERT(epn && (xfer != TUSB_XFER_CONTROL));\n\n  ep->max_packet_size = tu_edpt_packet_size(ep_desc);\n  unsigned val        = USB_ENDPT_EPCTLDIS_MASK;\n  val |= (xfer != TUSB_XFER_ISOCHRONOUS) ? USB_ENDPT_EPHSHK_MASK : 0;\n  val |= dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK;\n  USB_OTG_FS->EP_CTL[epn] |= val;\n\n  if (xfer != TUSB_XFER_ISOCHRONOUS) {\n    bd[odd].dts      = 1;\n    bd[odd].data     = 0;\n    bd[odd ^ 1].dts  = 1;\n    bd[odd ^ 1].data = 1;\n  }\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  (void)rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr) {\n  (void)rhport;\n\n  const unsigned       epn = ep_addr & 0xFu;\n  const unsigned       dir = (ep_addr & TUSB_DIR_IN_MASK) ? TUSB_DIR_IN : TUSB_DIR_OUT;\n  endpoint_state_t    *ep  = &_dcd.endpoint[epn][dir];\n  buffer_descriptor_t *bd  = &_dcd.bdt[epn][dir][0];\n  const unsigned       msk = dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK;\n  USB_OTG_FS->EP_CTL[epn] &= ~msk;\n  ep->max_packet_size = 0;\n  ep->length          = 0;\n  ep->remaining       = 0;\n  bd->head            = 0;\n}\n\n  #if 0\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n  #endif\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t  *buffer, uint16_t total_bytes, bool is_isr) {\n  (void) is_isr;\n  (void)rhport;\n  NVIC_DisableIRQ(USB_FS_IRQn);\n  const unsigned       epn = ep_addr & 0xFu;\n  const unsigned       dir = (ep_addr & TUSB_DIR_IN_MASK) ? TUSB_DIR_IN : TUSB_DIR_OUT;\n  endpoint_state_t    *ep  = &_dcd.endpoint[epn][dir];\n  buffer_descriptor_t *bd  = &_dcd.bdt[epn][dir][ep->odd];\n\n  if (bd->own) {\n    TU_LOG1(\"DCD XFER fail %x %d %lx %lx\\r\\n\", ep_addr, total_bytes, ep->state, bd->head);\n    return false; /* The last transfer has not completed */\n  }\n  ep->length    = total_bytes;\n  ep->remaining = total_bytes;\n\n  const unsigned mps = ep->max_packet_size;\n  if (total_bytes > mps) {\n    buffer_descriptor_t *next = ep->odd ? bd - 1 : bd + 1;\n    /* When total_bytes is greater than the max packet size,\n     * it prepares to the next transfer to avoid NAK in advance. */\n    next->bc   = total_bytes >= 2 * mps ? mps : total_bytes - mps;\n    next->addr = buffer + mps;\n    next->own  = 1;\n  }\n  bd->bc   = total_bytes >= mps ? mps : total_bytes;\n  bd->addr = buffer;\n  __DSB();\n  bd->own = 1; /* the own bit must set after addr */\n  NVIC_EnableIRQ(USB_FS_IRQn);\n  return true;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void)rhport;\n  const unsigned epn = ep_addr & 0xFu;\n  if (0 == epn) {\n    USB_OTG_FS->EP_CTL[epn] |= USB_ENDPT_EPSTALL_MASK;\n  } else {\n    const unsigned       dir = (ep_addr & TUSB_DIR_IN_MASK) ? TUSB_DIR_IN : TUSB_DIR_OUT;\n    buffer_descriptor_t *bd  = _dcd.bdt[epn][dir];\n    bd[0].bdt_stall          = 1;\n    bd[1].bdt_stall          = 1;\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void)rhport;\n  const unsigned       epn = ep_addr & 0xFu;\n  const unsigned       dir = (ep_addr & TUSB_DIR_IN_MASK) ? TUSB_DIR_IN : TUSB_DIR_OUT;\n  const unsigned       odd = _dcd.endpoint[epn][dir].odd;\n  buffer_descriptor_t *bd  = _dcd.bdt[epn][dir];\n\n  bd[odd ^ 1].own       = 0;\n  bd[odd ^ 1].data      = 1;\n  bd[odd ^ 1].bdt_stall = 0;\n  bd[odd].own           = 0;\n  bd[odd].data          = 0;\n  bd[odd].bdt_stall     = 0;\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\nvoid dcd_int_handler(uint8_t rhport) {\n  (void)rhport;\n\n  uint32_t is          = USB_OTG_FS->INT_STAT;\n  uint32_t msk         = USB_OTG_FS->INT_ENB;\n  USB_OTG_FS->INT_STAT = is & ~msk;\n  is &= msk;\n  if (is & USB_ISTAT_ERROR_MASK) {\n    /* TODO: */\n    uint32_t es          = USB_OTG_FS->ERR_STAT;\n    USB_OTG_FS->ERR_STAT = es;\n    USB_OTG_FS->INT_STAT = is; /* discard any pending events */\n    return;\n  }\n\n  if (is & USB_ISTAT_USBRST_MASK) {\n    USB_OTG_FS->INT_STAT = is; /* discard any pending events */\n    process_bus_reset(rhport);\n    return;\n  }\n  if (is & USB_ISTAT_SLEEP_MASK) {\n    USB_OTG_FS->INT_STAT = USB_ISTAT_SLEEP_MASK;\n    process_bus_inactive(rhport);\n    return;\n  }\n  if (is & USB_ISTAT_RESUME_MASK) {\n    USB_OTG_FS->INT_STAT = USB_ISTAT_RESUME_MASK;\n    process_bus_active(rhport);\n    return;\n  }\n  if (is & USB_ISTAT_SOFTOK_MASK) {\n    USB_OTG_FS->INT_STAT = USB_ISTAT_SOFTOK_MASK;\n    dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);\n    return;\n  }\n  if (is & USB_ISTAT_STALL_MASK) {\n    USB_OTG_FS->INT_STAT = USB_ISTAT_STALL_MASK;\n    process_stall(rhport);\n    return;\n  }\n  if (is & USB_ISTAT_TOKDNE_MASK) {\n    process_tokdne(rhport);\n    return;\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/nordic/nrf5x/dcd_nrf5x.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_NRF5X\n\n#include <stdatomic.h>\n\n// Suppress warning caused by nrfx driver\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wcast-qual\"\n#pragma GCC diagnostic ignored \"-Wcast-align\"\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\n#endif\n\n#include \"nrf.h\"\n#include \"nrfx_clock.h\"\n#include \"nrf_erratas.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"device/dcd.h\"\n\n// TODO remove later\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\" // to use defer function helper\n\n#if CFG_TUSB_OS == OPT_OS_MYNEWT\n#include \"mcu/mcu.h\"\n#endif\n\n/* Try to detect nrfx version if not configured with CFG_TUD_NRF_NRFX_VERSION\n * nrfx v1 and v2 are concurrently developed. There is no NRFX_VERSION only MDK VERSION which is as follows:\n * - v3.0.0: 8.53.1 (conflict with v2.11.0), v3.1.0: 8.55.0 ...\n * - v2.11.0: 8.53.1, v2.6.0: 8.44.1, v2.5.0: 8.40.2, v2.4.0: 8.37.0, v2.3.0: 8.35.0, v2.2.0: 8.32.1, v2.1.0: 8.30.2,\n * v2.0.0: 8.29.0\n * - v1.9.0: 8.40.3, v1.8.6: 8.35.0 (conflict with v2.3.0), v1.8.5: 8.32.3, v1.8.4: 8.32.1 (conflict with v2.2.0),\n *   v1.8.2: 8.32.1 (conflict with v2.2.0), v1.8.1: 8.27.1\n * Therefore the check for v1 would be:\n * - MDK < 8.29.0 (v2.0), MDK == 8.32.3, 8.40.3\n * - in case of conflict User of those version must upgrade to other 1.x version or set CFG_TUD_NRF_NRFX_VERSION\n */\n#ifndef CFG_TUD_NRF_NRFX_VERSION\n  #define MDK_VERSION (10000 * MDK_MAJOR_VERSION + 100 * MDK_MINOR_VERSION + MDK_MICRO_VERSION)\n\n  #if MDK_VERSION < 82900 || MDK_VERSION == 83203 || MDK_VERSION == 84003\n    // nrfx <= 1.8.1, or 1.8.5 or 1.9.0\n    #define CFG_TUD_NRF_NRFX_VERSION 1\n  #elif MDK_VERSION < 85301\n    #define CFG_TUD_NRF_NRFX_VERSION 2\n  #elif MDK_VERSION < 87300\n    #define CFG_TUD_NRF_NRFX_VERSION 3\n  #else\n    #define CFG_TUD_NRF_NRFX_VERSION 4\n  #endif\n#endif\n\n/*------------------------------------------------------------------*/\n/* MACRO TYPEDEF CONSTANT ENUM\n *------------------------------------------------------------------*/\nenum {\n  // Max allowed by USB specs\n  MAX_PACKET_SIZE = 64,\n\n  // Mask of all END event (IN & OUT) for all endpoints. ENDEPIN0-7, ENDEPOUT0-7, ENDISOIN, ENDISOOUT\n  EDPT_END_ALL_MASK = (0xff << USBD_INTEN_ENDEPIN0_Pos) | (0xff << USBD_INTEN_ENDEPOUT0_Pos) |\n                      USBD_INTENCLR_ENDISOIN_Msk | USBD_INTEN_ENDISOOUT_Msk\n};\n\nenum {\n  EP_ISO_NUM = 8, // Endpoint number is fixed (8) for ISOOUT and ISOIN\n  EP_CBI_COUNT = 8  // Control Bulk Interrupt endpoints count\n};\n\n// Transfer Descriptor\ntypedef struct {\n  uint8_t* buffer;\n  uint16_t total_len;\n  volatile uint16_t actual_len;\n  uint16_t mps; // max packet size\n\n  // nRF will auto accept OUT packet after DMA is done\n  // indicate packet is already ACK\n  volatile bool data_received;\n  volatile bool started;\n\n  // Set to true when data was transferred from RAM to ISO IN output buffer.\n  // New data can be put in ISO IN output buffer after SOF.\n  bool iso_in_transfer_ready;\n\n} xfer_td_t;\n\n// Data for managing dcd\nstatic struct {\n  // All 8 endpoints including control IN & OUT (offset 1)\n  // +1 for ISO endpoints\n  xfer_td_t xfer[EP_CBI_COUNT + 1][2];\n\n  // nRF can only carry one DMA at a time, this is used to guard the access to EasyDMA\n  atomic_flag dma_running;\n\n  // Track whether sof has been manually enabled\n  bool sof_enabled;\n} _dcd;\n\n/*------------------------------------------------------------------*/\n/* Control / Bulk / Interrupt (CBI) Transfer\n *------------------------------------------------------------------*/\n\n// check if we are in ISR\nTU_ATTR_ALWAYS_INLINE static inline bool is_in_isr(void) {\n  return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) ? true : false;\n}\n\n// helper to start DMA\nstatic void start_dma(volatile uint32_t* reg_startep) {\n  (*reg_startep) = 1;\n  __ISB();\n  __DSB();\n\n  // TASKS_EP0STATUS, TASKS_EP0RCVOUT seem to need EasyDMA to be available\n  // However these don't trigger any DMA transfer and got ENDED event subsequently\n  // Therefore dma_pending is corrected right away\n  if ((reg_startep == &NRF_USBD->TASKS_EP0STATUS) || (reg_startep == &NRF_USBD->TASKS_EP0RCVOUT)) {\n    atomic_flag_clear(&_dcd.dma_running);\n  }\n}\n\nstatic void edpt_dma_start(volatile uint32_t* reg_startep) {\n  if (atomic_flag_test_and_set(&_dcd.dma_running)) {\n    usbd_defer_func((osal_task_func_t)(uintptr_t ) edpt_dma_start, (void*) (uintptr_t) reg_startep, is_in_isr());\n  } else {\n    start_dma(reg_startep);\n  }\n}\n\n// DMA is complete\nstatic void edpt_dma_end(void) {\n  atomic_flag_clear(&_dcd.dma_running);\n}\n\n// helper getting td\nstatic inline xfer_td_t* get_td(uint8_t epnum, uint8_t dir) {\n  return &_dcd.xfer[epnum][dir];\n}\n\nstatic void xact_out_dma(uint8_t epnum);\n\n// Function wraps xact_out_dma which wants uint8_t while usbd_defer_func wants void (*)(void *)\nstatic void xact_out_dma_wrapper(void* epnum) {\n  xact_out_dma((uint8_t) ((uintptr_t) epnum));\n}\n\n// Start DMA to move data from Endpoint -> RAM\nstatic void xact_out_dma(uint8_t epnum) {\n  xfer_td_t* xfer = get_td(epnum, TUSB_DIR_OUT);\n  uint32_t xact_len;\n\n  // DMA can't be active during read of SIZE.EPOUT or SIZE.ISOOUT, so try to lock,\n  // If already running defer call regardless if it was called from ISR or task,\n  if (atomic_flag_test_and_set(&_dcd.dma_running)) {\n    usbd_defer_func((osal_task_func_t) xact_out_dma_wrapper, (void*) (uint32_t) epnum, is_in_isr());\n    return;\n  }\n  if (epnum == EP_ISO_NUM) {\n    xact_len = NRF_USBD->SIZE.ISOOUT;\n    // If ZERO bit is set, ignore ISOOUT length\n    if (xact_len & USBD_SIZE_ISOOUT_ZERO_Msk) {\n      xact_len = 0;\n      atomic_flag_clear(&_dcd.dma_running);\n    } else {\n      if (xfer->started) {\n        // Trigger DMA move data from Endpoint -> SRAM\n        NRF_USBD->ISOOUT.PTR = (uint32_t) xfer->buffer;\n        NRF_USBD->ISOOUT.MAXCNT = xact_len;\n\n        start_dma(&NRF_USBD->TASKS_STARTISOOUT);\n      } else {\n        atomic_flag_clear(&_dcd.dma_running);\n      }\n    }\n  } else {\n    // limit xact len to remaining length\n    xact_len = tu_min16((uint16_t) NRF_USBD->SIZE.EPOUT[epnum], xfer->total_len - xfer->actual_len);\n\n    // Trigger DMA move data from Endpoint -> SRAM\n    NRF_USBD->EPOUT[epnum].PTR = (uint32_t) xfer->buffer;\n    NRF_USBD->EPOUT[epnum].MAXCNT = xact_len;\n\n    start_dma(&NRF_USBD->TASKS_STARTEPOUT[epnum]);\n  }\n}\n\n// Prepare for a CBI transaction IN, call at the start\n// it start DMA to transfer data from RAM -> Endpoint\nstatic void xact_in_dma(uint8_t epnum) {\n  xfer_td_t* xfer = get_td(epnum, TUSB_DIR_IN);\n\n  // Each transaction is up to Max Packet Size\n  uint16_t const xact_len = tu_min16(xfer->total_len - xfer->actual_len, xfer->mps);\n\n  NRF_USBD->EPIN[epnum].PTR = (uint32_t) xfer->buffer;\n  NRF_USBD->EPIN[epnum].MAXCNT = xact_len;\n\n  edpt_dma_start(&NRF_USBD->TASKS_STARTEPIN[epnum]);\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n  TU_LOG2(\"dcd init\\r\\n\");\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(USBD_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(USBD_IRQn);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  // Set Address is automatically update by hw controller, nothing to do\n\n  // Enable usbevent for suspend and resume detection\n  // Since the bus signal D+/D- are stable now.\n\n  // Clear current pending first\n  NRF_USBD->EVENTCAUSE |= NRF_USBD->EVENTCAUSE;\n  NRF_USBD->EVENTS_USBEVENT = 0;\n\n  NRF_USBD->INTENSET = USBD_INTEN_USBEVENT_Msk;\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  (void) rhport;\n\n  // Bring controller out of low power mode\n  // will start wakeup when USBWUALLOWED is set\n  NRF_USBD->LOWPOWER = 0;\n}\n\n// disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport) {\n  (void) rhport;\n  NRF_USBD->USBPULLUP = 0;\n\n  // Disable Pull-up does not trigger Power USB Removed, in fact it have no\n  // impact on the USB Power status at all -> need to submit unplugged event to the stack.\n  dcd_event_bus_signal(0, DCD_EVENT_UNPLUGGED, false);\n}\n\n// connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport) {\n  (void) rhport;\n  NRF_USBD->USBPULLUP = 1;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void) rhport;\n  if (en) {\n    _dcd.sof_enabled = true;\n    NRF_USBD->INTENSET = USBD_INTENSET_SOF_Msk;\n  } else {\n    _dcd.sof_enabled = false;\n    NRF_USBD->INTENCLR = USBD_INTENCLR_SOF_Msk;\n  }\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const* desc_edpt) {\n  (void) rhport;\n\n  uint8_t const ep_addr = desc_edpt->bEndpointAddress;\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  _dcd.xfer[epnum][dir].mps = tu_edpt_packet_size(desc_edpt);\n\n  if (desc_edpt->bmAttributes.xfer != TUSB_XFER_ISOCHRONOUS) {\n    if (dir == TUSB_DIR_OUT) {\n      NRF_USBD->INTENSET = TU_BIT(USBD_INTEN_ENDEPOUT0_Pos + epnum);\n      NRF_USBD->EPOUTEN |= TU_BIT(epnum);\n\n      // Write any value to SIZE register will allow nRF to ACK/accept data\n      NRF_USBD->SIZE.EPOUT[epnum] = 0;\n    } else {\n      NRF_USBD->INTENSET = TU_BIT(USBD_INTEN_ENDEPIN0_Pos + epnum);\n      NRF_USBD->EPINEN |= TU_BIT(epnum);\n    }\n    // clear stall and reset DataToggle\n    NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_UnStall << USBD_EPSTALL_STALL_Pos) | ep_addr;\n    NRF_USBD->DTOGGLE = (USBD_DTOGGLE_VALUE_Data0 << USBD_DTOGGLE_VALUE_Pos) | ep_addr;\n  } else {\n    TU_ASSERT(epnum == EP_ISO_NUM);\n    if (dir == TUSB_DIR_OUT) {\n      // SPLIT ISO buffer when ISO IN endpoint is already opened.\n      if (_dcd.xfer[EP_ISO_NUM][TUSB_DIR_IN].mps) NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_HalfIN;\n\n      // Clear old events\n      NRF_USBD->EVENTS_ENDISOOUT = 0;\n\n      // Clear SOF event in case interrupt was not enabled yet.\n      if ((NRF_USBD->INTEN & USBD_INTEN_SOF_Msk) == 0) NRF_USBD->EVENTS_SOF = 0;\n\n      // Enable SOF and ISOOUT interrupts, and ISOOUT endpoint.\n      NRF_USBD->INTENSET = USBD_INTENSET_ENDISOOUT_Msk | USBD_INTENSET_SOF_Msk;\n      NRF_USBD->EPOUTEN |= USBD_EPOUTEN_ISOOUT_Msk;\n    } else {\n      NRF_USBD->EVENTS_ENDISOIN = 0;\n\n      // SPLIT ISO buffer when ISO OUT endpoint is already opened.\n      if (_dcd.xfer[EP_ISO_NUM][TUSB_DIR_OUT].mps) NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_HalfIN;\n\n      // Clear SOF event in case interrupt was not enabled yet.\n      if ((NRF_USBD->INTEN & USBD_INTEN_SOF_Msk) == 0) NRF_USBD->EVENTS_SOF = 0;\n\n      // Enable SOF and ISOIN interrupts, and ISOIN endpoint.\n      NRF_USBD->INTENSET = USBD_INTENSET_ENDISOIN_Msk | USBD_INTENSET_SOF_Msk;\n      NRF_USBD->EPINEN |= USBD_EPINEN_ISOIN_Msk;\n    }\n  }\n\n  __ISB();\n  __DSB();\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  // disable interrupt to prevent race condition\n  dcd_int_disable(rhport);\n\n  // disable all non-control (bulk + interrupt) endpoints\n  for (uint8_t ep = 1; ep < EP_CBI_COUNT; ep++) {\n    NRF_USBD->INTENCLR = TU_BIT(USBD_INTEN_ENDEPOUT0_Pos + ep) | TU_BIT(USBD_INTEN_ENDEPIN0_Pos + ep);\n\n    NRF_USBD->TASKS_STARTEPIN[ep] = 0;\n    NRF_USBD->TASKS_STARTEPOUT[ep] = 0;\n\n    tu_memclr(_dcd.xfer[ep], 2 * sizeof(xfer_td_t));\n  }\n\n  // disable both ISO\n  NRF_USBD->INTENCLR = USBD_INTENCLR_SOF_Msk | USBD_INTENCLR_ENDISOOUT_Msk | USBD_INTENCLR_ENDISOIN_Msk;\n  NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_OneDir;\n\n  NRF_USBD->TASKS_STARTISOIN = 0;\n  NRF_USBD->TASKS_STARTISOOUT = 0;\n\n  tu_memclr(_dcd.xfer[EP_ISO_NUM], 2 * sizeof(xfer_td_t));\n\n  // de-activate all non-control\n  NRF_USBD->EPOUTEN = 1UL;\n  NRF_USBD->EPINEN = 1UL;\n\n  dcd_int_enable(rhport);\n}\n\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  if (epnum != EP_ISO_NUM) {\n    // CBI\n    if (dir == TUSB_DIR_OUT) {\n      NRF_USBD->INTENCLR = TU_BIT(USBD_INTEN_ENDEPOUT0_Pos + epnum);\n      NRF_USBD->EPOUTEN &= ~TU_BIT(epnum);\n    } else {\n      NRF_USBD->INTENCLR = TU_BIT(USBD_INTEN_ENDEPIN0_Pos + epnum);\n      NRF_USBD->EPINEN &= ~TU_BIT(epnum);\n    }\n  } else {\n    _dcd.xfer[EP_ISO_NUM][dir].mps = 0;\n    // ISO\n    if (dir == TUSB_DIR_OUT) {\n      NRF_USBD->INTENCLR = USBD_INTENCLR_ENDISOOUT_Msk;\n      NRF_USBD->EPOUTEN &= ~USBD_EPOUTEN_ISOOUT_Msk;\n      NRF_USBD->EVENTS_ENDISOOUT = 0;\n    } else {\n      NRF_USBD->INTENCLR = USBD_INTENCLR_ENDISOIN_Msk;\n      NRF_USBD->EPINEN &= ~USBD_EPINEN_ISOIN_Msk;\n    }\n    // One of the ISO endpoints closed, no need to split buffers any more.\n    NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_OneDir;\n    // When both ISO endpoint are close there is no need for SOF any more.\n    if (_dcd.xfer[EP_ISO_NUM][TUSB_DIR_IN].mps + _dcd.xfer[EP_ISO_NUM][TUSB_DIR_OUT].mps == 0)\n      NRF_USBD->INTENCLR = USBD_INTENCLR_SOF_Msk;\n  }\n  _dcd.xfer[epnum][dir].started = false;\n  __ISB();\n  __DSB();\n}\n\n#if 0\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n#endif\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t* buffer, uint16_t total_bytes, bool is_isr) {\n  (void) rhport;\n  (void) is_isr;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  xfer_td_t* xfer = get_td(epnum, dir);\n\n  TU_ASSERT(!xfer->started);\n  xfer->buffer = buffer;\n  xfer->total_len = total_bytes;\n  xfer->actual_len = 0;\n\n  // Control endpoint with zero-length packet and opposite direction to 1st request byte --> status stage\n  bool const control_status = (epnum == 0 && total_bytes == 0 && dir != tu_edpt_dir(NRF_USBD->BMREQUESTTYPE));\n\n  if (control_status) {\n    // The nRF doesn't interrupt on status transmit so we queue up a success response.\n    dcd_event_xfer_complete(0, ep_addr, 0, XFER_RESULT_SUCCESS, is_in_isr());\n\n    // Status Phase also requires EasyDMA has to be available as well !!!!\n    edpt_dma_start(&NRF_USBD->TASKS_EP0STATUS);\n  } else if (dir == TUSB_DIR_OUT) {\n    xfer->started = true;\n    if (epnum == 0) {\n      // Accept next Control Out packet. TASKS_EP0RCVOUT also require EasyDMA\n      edpt_dma_start(&NRF_USBD->TASKS_EP0RCVOUT);\n    } else {\n      // started just set, it could start DMA transfer if interrupt was trigger after this line\n      // code only needs to start transfer (from Endpoint to RAM) when data_received was set\n      // before started was set. If started is NOT set but data_received is, it means that\n      // current transfer was already finished and next data is already present in endpoint and\n      // can be consumed by future transfer\n      __ISB();\n      __DSB();\n      if (xfer->data_received && xfer->started) {\n        // Data is already received previously\n        // start DMA to copy to SRAM\n        xfer->data_received = false;\n        xact_out_dma(epnum);\n      } else {\n        // nRF auto accept next Bulk/Interrupt OUT packet\n        // nothing to do\n      }\n    }\n  } else {\n    // Start DMA to copy data from RAM -> Endpoint\n    xact_in_dma(epnum);\n  }\n\n  return true;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  xfer_td_t* xfer = get_td(epnum, dir);\n\n  if (epnum == 0) {\n    NRF_USBD->TASKS_EP0STALL = 1;\n  } else if (epnum != EP_ISO_NUM) {\n    NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_Stall << USBD_EPSTALL_STALL_Pos) | ep_addr;\n\n    // Note: nRF can auto ACK packet OUT before get stalled.\n    // There maybe data in endpoint fifo already, we need to pull it out\n    if ((dir == TUSB_DIR_OUT) && xfer->data_received) {\n      xfer->data_received = false;\n      xact_out_dma(epnum);\n    }\n  }\n\n  __ISB();\n  __DSB();\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  if (epnum != 0 && epnum != EP_ISO_NUM) {\n    // reset data toggle to DATA0\n    // First write this register with VALUE=Nop to select the endpoint, then either read it to get the status from\n    // VALUE, or write it again with VALUE=Data0 or Data1\n    NRF_USBD->DTOGGLE = ep_addr;\n    NRF_USBD->DTOGGLE = (USBD_DTOGGLE_VALUE_Data0 << USBD_DTOGGLE_VALUE_Pos) | ep_addr;\n\n    // clear stall\n    NRF_USBD->EPSTALL = (USBD_EPSTALL_STALL_UnStall << USBD_EPSTALL_STALL_Pos) | ep_addr;\n\n    // Write any value to SIZE register will allow nRF to ACK/accept data\n    if (dir == TUSB_DIR_OUT) NRF_USBD->SIZE.EPOUT[epnum] = 0;\n\n    __ISB();\n    __DSB();\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* Interrupt Handler\n *------------------------------------------------------------------*/\nstatic void bus_reset(void) {\n  // 6.35.6 USB controller automatically disabled all endpoints (except control)\n  NRF_USBD->EPOUTEN = 1UL;\n  NRF_USBD->EPINEN = 1UL;\n\n  for (int i = 0; i < 8; i++) {\n    NRF_USBD->TASKS_STARTEPIN[i] = 0;\n    NRF_USBD->TASKS_STARTEPOUT[i] = 0;\n  }\n\n  NRF_USBD->TASKS_STARTISOIN = 0;\n  NRF_USBD->TASKS_STARTISOOUT = 0;\n\n  // Clear USB Event Interrupt\n  NRF_USBD->EVENTS_USBEVENT = 0;\n  NRF_USBD->EVENTCAUSE |= NRF_USBD->EVENTCAUSE;\n\n  // Reset interrupt\n  NRF_USBD->INTENCLR = NRF_USBD->INTEN;\n  NRF_USBD->INTENSET = USBD_INTEN_USBRESET_Msk | USBD_INTEN_USBEVENT_Msk | USBD_INTEN_EPDATA_Msk |\n                       USBD_INTEN_EP0SETUP_Msk | USBD_INTEN_EP0DATADONE_Msk | USBD_INTEN_ENDEPIN0_Msk |\n                       USBD_INTEN_ENDEPOUT0_Msk;\n\n  tu_varclr(&_dcd);\n  _dcd.xfer[0][TUSB_DIR_IN].mps = MAX_PACKET_SIZE;\n  _dcd.xfer[0][TUSB_DIR_OUT].mps = MAX_PACKET_SIZE;\n}\n\nvoid dcd_int_handler(uint8_t rhport) {\n  (void) rhport;\n\n  uint32_t const inten = NRF_USBD->INTEN;\n  uint32_t int_status = 0;\n\n  volatile uint32_t* regevt = &NRF_USBD->EVENTS_USBRESET;\n\n  for (uint8_t i = 0; i < USBD_INTEN_EPDATA_Pos + 1; i++) {\n    if (tu_bit_test(inten, i) && regevt[i]) {\n      int_status |= TU_BIT(i);\n\n      // event clear\n      regevt[i] = 0;\n      __ISB();\n      __DSB();\n    }\n  }\n\n  if (int_status & USBD_INTEN_USBRESET_Msk) {\n    bus_reset();\n    dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n  }\n\n  // ISOIN: Data was moved to endpoint buffer, client will be notified in SOF\n  if (int_status & USBD_INTEN_ENDISOIN_Msk) {\n    xfer_td_t* xfer = get_td(EP_ISO_NUM, TUSB_DIR_IN);\n\n    xfer->actual_len = NRF_USBD->ISOIN.AMOUNT;\n    // Data transferred from RAM to endpoint output buffer.\n    // Next transfer can be scheduled after SOF.\n    xfer->iso_in_transfer_ready = true;\n  }\n\n  if (int_status & USBD_INTEN_SOF_Msk) {\n    bool iso_enabled = false;\n\n    // ISOOUT: Transfer data gathered in previous frame from buffer to RAM\n    if (NRF_USBD->EPOUTEN & USBD_EPOUTEN_ISOOUT_Msk) {\n      iso_enabled = true;\n      // Transfer from endpoint to RAM only if data is not corrupted\n      if ((int_status & USBD_INTEN_USBEVENT_Msk) == 0 ||\n          (NRF_USBD->EVENTCAUSE & USBD_EVENTCAUSE_ISOOUTCRC_Msk) == 0) {\n        xact_out_dma(EP_ISO_NUM);\n      }\n    }\n\n    // ISOIN: Notify client that data was transferred\n    if (NRF_USBD->EPINEN & USBD_EPINEN_ISOIN_Msk) {\n      iso_enabled = true;\n\n      xfer_td_t* xfer = get_td(EP_ISO_NUM, TUSB_DIR_IN);\n      if (xfer->iso_in_transfer_ready) {\n        xfer->iso_in_transfer_ready = false;\n        dcd_event_xfer_complete(0, EP_ISO_NUM | TUSB_DIR_IN_MASK, xfer->actual_len, XFER_RESULT_SUCCESS, true);\n      }\n    }\n\n    if (!iso_enabled && !_dcd.sof_enabled) {\n      // SOF interrupt not manually enabled and ISO endpoint is not used,\n      // SOF is only enabled one-time for remote wakeup so we disable it now\n\n      NRF_USBD->INTENCLR = USBD_INTENCLR_SOF_Msk;\n    }\n\n    const uint32_t frame = NRF_USBD->FRAMECNTR;\n    dcd_event_sof(0, frame, true);\n    //dcd_event_bus_signal(0, DCD_EVENT_SOF, true);\n  }\n\n  if (int_status & USBD_INTEN_USBEVENT_Msk) {\n    TU_LOG(3, \"EVENTCAUSE = 0x%04\" PRIX32 \"\\r\\n\", NRF_USBD->EVENTCAUSE);\n\n    enum {\n      EVT_CAUSE_MASK = USBD_EVENTCAUSE_SUSPEND_Msk | USBD_EVENTCAUSE_RESUME_Msk | USBD_EVENTCAUSE_USBWUALLOWED_Msk |\n                       USBD_EVENTCAUSE_ISOOUTCRC_Msk\n    };\n    uint32_t const evt_cause = NRF_USBD->EVENTCAUSE & EVT_CAUSE_MASK;\n    NRF_USBD->EVENTCAUSE = evt_cause; // clear interrupt\n\n    if (evt_cause & USBD_EVENTCAUSE_SUSPEND_Msk) {\n      // Put controller into low power mode\n      // Leave HFXO disable to application, since it may be used by other peripherals\n      NRF_USBD->LOWPOWER = 1;\n\n      dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n    }\n\n    if (evt_cause & USBD_EVENTCAUSE_USBWUALLOWED_Msk) {\n      // USB is out of low power mode, and wakeup is allowed\n      // Initiate RESUME signal\n      NRF_USBD->DPDMVALUE = USBD_DPDMVALUE_STATE_Resume;\n      NRF_USBD->TASKS_DPDMDRIVE = 1;\n\n      // There is no Resume interrupt for remote wakeup, enable SOF for to report bus ready state\n      // Clear SOF event in case interrupt was not enabled yet.\n      if ((NRF_USBD->INTEN & USBD_INTEN_SOF_Msk) == 0) NRF_USBD->EVENTS_SOF = 0;\n      NRF_USBD->INTENSET = USBD_INTENSET_SOF_Msk;\n    }\n\n    if (evt_cause & USBD_EVENTCAUSE_RESUME_Msk) {\n      dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n    }\n  }\n\n  // Setup tokens are specific to the Control endpoint.\n  if (int_status & USBD_INTEN_EP0SETUP_Msk) {\n    uint8_t const setup[8] = {\n        NRF_USBD->BMREQUESTTYPE, NRF_USBD->BREQUEST, NRF_USBD->WVALUEL, NRF_USBD->WVALUEH,\n        NRF_USBD->WINDEXL, NRF_USBD->WINDEXH, NRF_USBD->WLENGTHL, NRF_USBD->WLENGTHH\n    };\n\n    // nrf5x hw auto handle set address, there is no need to inform usb stack\n    tusb_control_request_t const* request = (tusb_control_request_t const*) setup;\n\n    if (!(TUSB_REQ_RCPT_DEVICE == request->bmRequestType_bit.recipient &&\n          TUSB_REQ_TYPE_STANDARD == request->bmRequestType_bit.type &&\n          TUSB_REQ_SET_ADDRESS == request->bRequest)) {\n      dcd_event_setup_received(0, setup, true);\n    }\n  }\n\n  if (int_status & EDPT_END_ALL_MASK) {\n    // DMA complete move data from SRAM <-> Endpoint\n    // Must before endpoint transfer handling\n    edpt_dma_end();\n  }\n\n  //--------------------------------------------------------------------+\n  /* Control/Bulk/Interrupt (CBI) Transfer\n   *\n   * Data flow is:\n   *           (bus)              (dma)\n   *    Host <-------> Endpoint <-------> RAM\n   *\n   * For CBI OUT:\n   *  - Host -> Endpoint\n   *      EPDATA (or EP0DATADONE) interrupted, check EPDATASTATUS.EPOUT[i]\n   *      to start DMA. For Bulk/Interrupt, this step can occur automatically (without sw),\n   *      which means data may or may not be ready (out_received flag).\n   *  - Endpoint -> RAM\n   *      ENDEPOUT[i] interrupted, transaction complete, sw prepare next transaction\n   *\n   * For CBI IN:\n   *  - RAM -> Endpoint\n   *      ENDEPIN[i] interrupted indicate DMA is complete. HW will start\n   *      to move data to host\n   *  - Endpoint -> Host\n   *      EPDATA (or EP0DATADONE) interrupted, check EPDATASTATUS.EPIN[i].\n   *      Transaction is complete, sw prepare next transaction\n   *\n   * Note: in both Control In and Out of Data stage from Host <-> Endpoint\n   * EP0DATADONE will be set as interrupt source\n   */\n  //--------------------------------------------------------------------+\n\n  /* CBI OUT: Endpoint -> SRAM (aka transaction complete)\n   * Note: Since nRF controller auto ACK next packet without SW awareness\n   * We must handle this stage before Host -> Endpoint just in case 2 event happens at once\n   *\n   * ISO OUT: Transaction must fit in single packet, it can be shorter then total\n   * len if Host decides to sent fewer bytes, it this case transaction is also\n   * complete and next transfer is not initiated here like for CBI.\n   */\n  for (uint8_t epnum = 0; epnum < EP_CBI_COUNT + 1; epnum++) {\n    if (tu_bit_test(int_status, USBD_INTEN_ENDEPOUT0_Pos + epnum)) {\n      xfer_td_t* xfer = get_td(epnum, TUSB_DIR_OUT);\n      uint16_t const xact_len = NRF_USBD->EPOUT[epnum].AMOUNT;\n\n      xfer->buffer += xact_len;\n      xfer->actual_len += xact_len;\n\n      // Transfer complete if transaction len < Max Packet Size or total len is transferred\n      if ((epnum != EP_ISO_NUM) && (xact_len == xfer->mps) && (xfer->actual_len < xfer->total_len)) {\n        if (epnum == 0) {\n          // Accept next Control Out packet. TASKS_EP0RCVOUT also require EasyDMA\n          edpt_dma_start(&NRF_USBD->TASKS_EP0RCVOUT);\n        } else {\n          // nRF auto accept next Bulk/Interrupt OUT packet\n          // nothing to do\n        }\n      } else {\n        TU_ASSERT(xfer->started,);\n        xfer->total_len = xfer->actual_len;\n        xfer->started = false;\n\n        // CBI OUT complete\n        dcd_event_xfer_complete(0, epnum, xfer->actual_len, XFER_RESULT_SUCCESS, true);\n      }\n    }\n\n    // Ended event for CBI IN : nothing to do\n  }\n\n  // Endpoint <-> Host ( In & OUT )\n  if (int_status & (USBD_INTEN_EPDATA_Msk | USBD_INTEN_EP0DATADONE_Msk)) {\n    uint32_t data_status = NRF_USBD->EPDATASTATUS;\n    NRF_USBD->EPDATASTATUS = data_status;\n    __ISB();\n    __DSB();\n\n    // EP0DATADONE is set with either Control Out on IN Data\n    // Since EPDATASTATUS cannot be used to determine whether it is control OUT or IN.\n    // We will use BMREQUESTTYPE in setup packet to determine the direction\n    bool const is_control_in = (int_status & USBD_INTEN_EP0DATADONE_Msk) && (NRF_USBD->BMREQUESTTYPE & TUSB_DIR_IN_MASK);\n    bool const is_control_out = (int_status & USBD_INTEN_EP0DATADONE_Msk) && !(NRF_USBD->BMREQUESTTYPE & TUSB_DIR_IN_MASK);\n\n    // CBI In: Endpoint -> Host (transaction complete)\n    for (uint8_t epnum = 0; epnum < EP_CBI_COUNT; epnum++) {\n      if (tu_bit_test(data_status, epnum) || (epnum == 0 && is_control_in)) {\n        xfer_td_t* xfer = get_td(epnum, TUSB_DIR_IN);\n        uint8_t const xact_len = NRF_USBD->EPIN[epnum].AMOUNT;\n\n        xfer->buffer += xact_len;\n        xfer->actual_len += xact_len;\n\n        if (xfer->actual_len < xfer->total_len) {\n          // Start DMA to copy next data packet\n          xact_in_dma(epnum);\n        } else {\n          // CBI IN complete\n          dcd_event_xfer_complete(0, epnum | TUSB_DIR_IN_MASK, xfer->actual_len, XFER_RESULT_SUCCESS, true);\n        }\n      }\n    }\n\n    // CBI OUT: Host -> Endpoint\n    for (uint8_t epnum = 0; epnum < EP_CBI_COUNT; epnum++) {\n      if (tu_bit_test(data_status, 16 + epnum) || (epnum == 0 && is_control_out)) {\n        xfer_td_t* xfer = get_td(epnum, TUSB_DIR_OUT);\n\n        if (xfer->started && xfer->actual_len < xfer->total_len) {\n          xact_out_dma(epnum);\n        } else {\n          // Data overflow !!! Nah, nRF will auto accept next Bulk/Interrupt OUT packet\n          // Mark this endpoint with data received\n          xfer->data_received = true;\n        }\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// HFCLK helper\n//--------------------------------------------------------------------+\n#ifdef SOFTDEVICE_PRESENT\n\n// For enable/disable hfclk with SoftDevice\n#include \"nrf_mbr.h\"\n#include \"nrf_sdm.h\"\n#include \"nrf_soc.h\"\n\n#ifndef SD_MAGIC_NUMBER\n  #define SD_MAGIC_NUMBER   0x51B1E5DB\n#endif\n\nTU_ATTR_ALWAYS_INLINE static inline bool is_sd_existed(void) {\n  return *((uint32_t*)(SOFTDEVICE_INFO_STRUCT_ADDRESS+4)) == SD_MAGIC_NUMBER;\n}\n\n// check if SD is existed and enabled\nTU_ATTR_ALWAYS_INLINE static inline bool is_sd_enabled(void) {\n  if ( !is_sd_existed() ) return false;\n  uint8_t sd_en = false;\n  (void) sd_softdevice_is_enabled(&sd_en);\n  return sd_en;\n}\n#endif\n\nstatic bool hfclk_running(void) {\n  #ifdef SOFTDEVICE_PRESENT\n  if (is_sd_enabled()) {\n    uint32_t is_running = 0;\n    (void)sd_clock_hfclk_is_running(&is_running);\n    return (is_running ? true : false);\n  }\n  #endif\n\n  #if CFG_TUD_NRF_NRFX_VERSION == 1\n  return nrf_clock_hf_is_running(NRF_CLOCK_HFCLK_HIGH_ACCURACY);\n  #else\n  return nrf_clock_is_running(NRF_CLOCK, NRF_CLOCK_DOMAIN_HFCLK, NULL);\n  #endif\n}\n\nstatic void hfclk_enable(void) {\n#if CFG_TUSB_OS == OPT_OS_MYNEWT\n  usb_clock_request();\n  return;\n#else\n\n  // already running, nothing to do\n  if (hfclk_running()) {\n    return;\n  }\n\n  #ifdef SOFTDEVICE_PRESENT\n  if (is_sd_enabled()) {\n    (void)sd_clock_hfclk_request();\n    return;\n  }\n  #endif\n\n  #if CFG_TUD_NRF_NRFX_VERSION == 1\n  nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED);\n  nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTART);\n  #else\n  nrf_clock_event_clear(NRF_CLOCK, NRF_CLOCK_EVENT_HFCLKSTARTED);\n  nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_HFCLKSTART);\n  #endif\n#endif\n}\n\nstatic void hfclk_disable(void) {\n#if CFG_TUSB_OS == OPT_OS_MYNEWT\n  usb_clock_release();\n  return;\n#else\n\n#ifdef SOFTDEVICE_PRESENT\n  if ( is_sd_enabled() ) {\n    (void)sd_clock_hfclk_release();\n    return;\n  }\n#endif\n\n#if CFG_TUD_NRF_NRFX_VERSION == 1\n  nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTOP);\n#else\n  nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_HFCLKSTOP);\n#endif\n#endif\n}\n\n// Power & Clock Peripheral on nRF5x to manage USB\n//\n// USB Bus power is managed by Power module, there are 3 VBUS power events:\n// Detected, Ready, Removed. Upon these power events, This function will\n// enable ( or disable ) usb & hfclk peripheral, set the usb pin pull up\n// accordingly to the controller Startup/Standby Sequence in USBD 51.4 specs.\n//\n// Therefore this function must be called to handle USB power event by\n// - nrfx_power_usbevt_init() : if Softdevice is not used or enabled\n// - SoftDevice SOC event : if SD is used and enabled\nvoid tusb_hal_nrf_power_event(uint32_t event);\nvoid tusb_hal_nrf_power_event(uint32_t event) {\n  // Value is chosen to be as same as NRFX_POWER_USB_EVT_* in nrfx_power.h\n  enum {\n    USB_EVT_DETECTED = 0,\n    USB_EVT_REMOVED = 1,\n    USB_EVT_READY = 2\n  };\n\n#if CFG_TUSB_DEBUG >= 3\n  const char* const power_evt_str[] = {\"Detected\", \"Removed\", \"Ready\"};\n  TU_LOG(3, \"Power USB event: %s\\r\\n\", power_evt_str[event]);\n#endif\n\n  switch (event) {\n    case USB_EVT_DETECTED:\n      if (!NRF_USBD->ENABLE) {\n        // Prepare for receiving READY event: disable interrupt since we will blocking wait\n        NRF_USBD->INTENCLR = USBD_INTEN_USBEVENT_Msk;\n        NRF_USBD->EVENTCAUSE = USBD_EVENTCAUSE_READY_Msk;\n        __ISB();\n        __DSB(); // for sync\n\n#ifdef NRF52_SERIES // NRF53 does not need this errata\n        // ERRATA 171, 187, 166\n        if (nrf52_errata_187()) {\n          // CRITICAL_REGION_ENTER();\n          if (*((volatile uint32_t*) (0x4006EC00)) == 0x00000000) {\n            *((volatile uint32_t*) (0x4006EC00)) = 0x00009375;\n            *((volatile uint32_t*) (0x4006ED14)) = 0x00000003;\n            *((volatile uint32_t*) (0x4006EC00)) = 0x00009375;\n          } else {\n            *((volatile uint32_t*) (0x4006ED14)) = 0x00000003;\n          }\n          // CRITICAL_REGION_EXIT();\n        }\n\n        if (nrf52_errata_171()) {\n          // CRITICAL_REGION_ENTER();\n          if (*((volatile uint32_t*) (0x4006EC00)) == 0x00000000) {\n            *((volatile uint32_t*) (0x4006EC00)) = 0x00009375;\n            *((volatile uint32_t*) (0x4006EC14)) = 0x000000C0;\n            *((volatile uint32_t*) (0x4006EC00)) = 0x00009375;\n          } else {\n            *((volatile uint32_t*) (0x4006EC14)) = 0x000000C0;\n          }\n          // CRITICAL_REGION_EXIT();\n        }\n#endif\n\n        // Enable the peripheral (will cause Ready event)\n        NRF_USBD->ENABLE = 1;\n        __ISB();\n        __DSB(); // for sync\n\n        // Enable HFCLK\n        hfclk_enable();\n      }\n      break;\n\n    case USB_EVT_READY:\n      // Skip if pull-up is enabled and HCLK is already running.\n      // Application probably call this more than necessary.\n      if (NRF_USBD->USBPULLUP && hfclk_running()) break;\n\n      // Waiting for USBD peripheral enabled\n      while (!(USBD_EVENTCAUSE_READY_Msk & NRF_USBD->EVENTCAUSE)) {}\n\n      NRF_USBD->EVENTCAUSE = USBD_EVENTCAUSE_READY_Msk;\n      __ISB();\n      __DSB(); // for sync\n\n#ifdef NRF52_SERIES\n      if (nrf52_errata_171()) {\n        // CRITICAL_REGION_ENTER();\n        if (*((volatile uint32_t*) (0x4006EC00)) == 0x00000000) {\n          *((volatile uint32_t*) (0x4006EC00)) = 0x00009375;\n          *((volatile uint32_t*) (0x4006EC14)) = 0x00000000;\n          *((volatile uint32_t*) (0x4006EC00)) = 0x00009375;\n        } else {\n          *((volatile uint32_t*) (0x4006EC14)) = 0x00000000;\n        }\n\n        // CRITICAL_REGION_EXIT();\n      }\n\n      if (nrf52_errata_187()) {\n        // CRITICAL_REGION_ENTER();\n        if (*((volatile uint32_t*) (0x4006EC00)) == 0x00000000) {\n          *((volatile uint32_t*) (0x4006EC00)) = 0x00009375;\n          *((volatile uint32_t*) (0x4006ED14)) = 0x00000000;\n          *((volatile uint32_t*) (0x4006EC00)) = 0x00009375;\n        } else {\n          *((volatile uint32_t*) (0x4006ED14)) = 0x00000000;\n        }\n        // CRITICAL_REGION_EXIT();\n      }\n\n      if (nrf52_errata_166()) {\n        *((volatile uint32_t*) (NRF_USBD_BASE + 0x800)) = 0x7E3;\n        *((volatile uint32_t*) (NRF_USBD_BASE + 0x804)) = 0x40;\n\n        __ISB();\n        __DSB();\n      }\n#endif\n\n      // ISO buffer Lower half for IN, upper half for OUT\n      NRF_USBD->ISOSPLIT = USBD_ISOSPLIT_SPLIT_HalfIN;\n\n      // Enable bus-reset interrupt\n      NRF_USBD->INTENSET = USBD_INTEN_USBRESET_Msk;\n\n      // Enable interrupt, priorities should be set by application\n      NVIC_ClearPendingIRQ(USBD_IRQn);\n\n      // Don't enable USBD interrupt yet, if dcd_init() did not finish yet\n      // Interrupt will be enabled by tud_init(), when USB stack is ready\n      // to handle interrupts.\n      if (tud_inited()) {\n        NVIC_EnableIRQ(USBD_IRQn);\n      }\n\n      // Wait for HFCLK\n      while (!hfclk_running()) {}\n\n      // Enable pull up\n      NRF_USBD->USBPULLUP = 1;\n      __ISB();\n      __DSB(); // for sync\n      break;\n\n    case USB_EVT_REMOVED:\n      if (NRF_USBD->ENABLE) {\n        // Abort all transfers\n\n        // Disable pull up\n        NRF_USBD->USBPULLUP = 0;\n        __ISB();\n        __DSB(); // for sync\n\n        // Disable Interrupt\n        NVIC_DisableIRQ(USBD_IRQn);\n\n        // disable all interrupt\n        NRF_USBD->INTENCLR = NRF_USBD->INTEN;\n\n        NRF_USBD->ENABLE = 0;\n        __ISB();\n        __DSB(); // for sync\n\n        hfclk_disable();\n\n        dcd_event_bus_signal(0, DCD_EVENT_UNPLUGGED, is_in_isr());\n      }\n      break;\n\n    default:\n      break;\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/nuvoton/nuc120/dcd_nuc120.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019-2020 Peter Lawrence\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/*\n  Theory of operation:\n\n  The NUC100/NUC120 USBD peripheral has six \"EP\"s, but each is simplex,\n  so two collectively (peripheral nomenclature of \"EP0\" and \"EP1\") are needed to\n  implement USB EP0.  PERIPH_EP0 and PERIPH_EP1 are used by this driver for\n  EP0_IN and EP0_OUT respectively.  This leaves up to four for user usage.\n*/\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && (CFG_TUSB_MCU == OPT_MCU_NUC120)\n\n#include \"device/dcd.h\"\n#include \"NUC100Series.h\"\n\n/* allocation of USBD RAM for Setup, EP0_IN, and and EP_OUT */\n#define PERIPH_SETUP_BUF_BASE  0\n#define PERIPH_SETUP_BUF_LEN   8\n#define PERIPH_EP0_BUF_BASE    (PERIPH_SETUP_BUF_BASE + PERIPH_SETUP_BUF_LEN)\n#define PERIPH_EP0_BUF_LEN     CFG_TUD_ENDPOINT0_SIZE\n#define PERIPH_EP1_BUF_BASE    (PERIPH_EP0_BUF_BASE + PERIPH_EP0_BUF_LEN)\n#define PERIPH_EP1_BUF_LEN     CFG_TUD_ENDPOINT0_SIZE\n#define PERIPH_EP2_BUF_BASE    (PERIPH_EP1_BUF_BASE + PERIPH_EP1_BUF_LEN)\n\n/* rather important info unfortunately not provided by device include files: how much there is */\n#define USBD_BUF_SIZE          512\n\nenum ep_enum\n{\n  PERIPH_EP0 = 0,\n  PERIPH_EP1 = 1,\n  PERIPH_EP2 = 2,\n  PERIPH_EP3 = 3,\n  PERIPH_EP4 = 4,\n  PERIPH_EP5 = 5,\n  PERIPH_MAX_EP,\n};\n\n/* set by dcd_set_address() */\nstatic volatile uint8_t assigned_address;\n\n/* reset by dcd_init(), this is used by dcd_edpt_open() to assign USBD peripheral buffer addresses */\nstatic uint32_t bufseg_addr;\n\n/* used by dcd_edpt_xfer() and the ISR to reset the data sync (DATA0/DATA1) in an EP0_IN transfer */\nstatic bool active_ep0_xfer;\n\n/* RAM table needed to track ongoing transfers performed by dcd_edpt_xfer(), dcd_in_xfer(), and the ISR */\nstatic struct xfer_ctl_t\n{\n  uint8_t *data_ptr;         /* data_ptr tracks where to next copy data to (for OUT) or from (for IN) */\n  // tu_fifo_t * ff;         /* pointer to FIFO required for dcd_edpt_xfer_fifo() */ // TODO support dcd_edpt_xfer_fifo API\n  union {\n    uint16_t in_remaining_bytes; /* for IN endpoints, we track how many bytes are left to transfer */\n    uint16_t out_bytes_so_far;   /* but for OUT endpoints, we track how many bytes we've transferred so far */\n  };\n  uint16_t max_packet_size;  /* needed since device driver only finds out this at runtime */\n  uint16_t total_bytes;      /* quantity needed to pass as argument to dcd_event_xfer_complete() (for IN endpoints) */\n} xfer_table[PERIPH_MAX_EP];\n\n/*\n  local helper functions\n*/\n\nstatic void usb_attach(void)\n{\n  USBD->DRVSE0 &= ~USBD_DRVSE0_DRVSE0_Msk;\n}\n\nstatic void usb_detach(void)\n{\n  USBD->DRVSE0 |= USBD_DRVSE0_DRVSE0_Msk;\n}\n\nstatic inline void usb_memcpy(uint8_t *dest, uint8_t *src, uint16_t size)\n{\n  while(size--) *dest++ = *src++;\n}\n\nstatic void usb_control_send_zlp(void)\n{\n  USBD->EP[PERIPH_EP0].CFG |= USBD_CFG_DSQ_SYNC_Msk;\n  USBD->EP[PERIPH_EP0].MXPLD = 0;\n}\n\n/* reconstruct ep_addr from particular USB Configuration Register */\nstatic uint8_t decode_ep_addr(USBD_EP_T *ep)\n{\n  uint8_t ep_addr = ep->CFG & USBD_CFG_EP_NUM_Msk;\n  if ( USBD_CFG_EPMODE_IN == (ep->CFG & USBD_CFG_STATE_Msk) )\n    ep_addr |= TUSB_DIR_IN_MASK;\n  return ep_addr;\n}\n\n/* map 8-bit ep_addr into peripheral endpoint index (PERIPH_EP0...) */\nstatic USBD_EP_T *ep_entry(uint8_t ep_addr, bool add)\n{\n  USBD_EP_T *ep;\n  enum ep_enum ep_index;\n\n  for (ep_index = PERIPH_EP0, ep = USBD->EP; ep_index < PERIPH_MAX_EP; ep_index++, ep++)\n  {\n    if (add)\n    {\n      /* take first peripheral endpoint that is unused */\n      if (0 == (ep->CFG & USBD_CFG_STATE_Msk)) return ep;\n    }\n    else\n    {\n      /* find a peripheral endpoint that matches ep_addr */\n      uint8_t candidate_ep_addr = decode_ep_addr(ep);\n      if (candidate_ep_addr == ep_addr) return ep;\n    }\n  }\n\n  return NULL;\n}\n\n/* perform an IN endpoint transfer; this is called by dcd_edpt_xfer() and the ISR  */\nstatic void dcd_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)\n{\n  uint16_t bytes_now = tu_min16(xfer->in_remaining_bytes, xfer->max_packet_size);\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\n  if (xfer->ff)\n  {\n    tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now);\n  }\n  else\n#endif\n  {\n    // USB SRAM seems to only support byte access and memcpy could possibly do it by words\n    usb_memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now);\n  }\n\n  ep->MXPLD = bytes_now;\n}\n\n/* called by dcd_init() as well as by the ISR during a USB bus reset */\nstatic void bus_reset(void)\n{\n  USBD->STBUFSEG = PERIPH_SETUP_BUF_BASE;\n\n  for (enum ep_enum ep_index = PERIPH_EP0; ep_index < PERIPH_MAX_EP; ep_index++)\n  {\n    USBD->EP[ep_index].CFG = 0;\n    USBD->EP[ep_index].CFGP = 0;\n  }\n\n  /* allocate the default EP0 endpoints */\n\n  USBD->EP[PERIPH_EP0].CFG = USBD_CFG_CSTALL_Msk | USBD_CFG_EPMODE_IN;\n  USBD->EP[PERIPH_EP0].BUFSEG = PERIPH_EP0_BUF_BASE;\n  xfer_table[PERIPH_EP0].max_packet_size = PERIPH_EP0_BUF_LEN;\n\n  USBD->EP[PERIPH_EP1].CFG = USBD_CFG_CSTALL_Msk | USBD_CFG_EPMODE_OUT;\n  USBD->EP[PERIPH_EP1].BUFSEG = PERIPH_EP1_BUF_BASE;\n  xfer_table[PERIPH_EP1].max_packet_size = PERIPH_EP1_BUF_LEN;\n\n  /* USB RAM beyond what we've allocated above is available to the user */\n  bufseg_addr = PERIPH_EP2_BUF_BASE;\n\n  /* Reset USB device address */\n  USBD->FADDR = 0;\n\n  /* reset EP0_IN flag */\n  active_ep0_xfer = false;\n}\n\n/* centralized location for USBD interrupt enable bit mask */\nstatic const uint32_t enabled_irqs = USBD_INTSTS_FLDET_STS_Msk | USBD_INTSTS_BUS_STS_Msk | USBD_INTSTS_SETUP_Msk | USBD_INTSTS_USB_STS_Msk;\n\n/*\n  NUC100/NUC120 TinyUSB API driver implementation\n*/\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  USBD->ATTR = 0x7D0;\n\n  usb_detach();\n\n  bus_reset();\n\n  usb_attach();\n\n  USBD->INTSTS = enabled_irqs;\n  USBD->INTEN  = enabled_irqs;\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_EnableIRQ(USBD_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_DisableIRQ(USBD_IRQn);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void) rhport;\n  usb_control_send_zlp(); /* SET_ADDRESS is the one exception where TinyUSB doesn't use dcd_edpt_xfer() to generate a ZLP */\n  assigned_address = dev_addr;\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n  USBD->ATTR = USBD_ATTR_RWAKEUP_Msk;\n}\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc)\n{\n  (void) rhport;\n\n  USBD_EP_T *ep = ep_entry(p_endpoint_desc->bEndpointAddress, true);\n  TU_ASSERT(ep);\n\n  /* mine the data for the information we need */\n  int const dir = tu_edpt_dir(p_endpoint_desc->bEndpointAddress);\n  int const size = tu_edpt_packet_size(p_endpoint_desc);\n  tusb_xfer_type_t const type = (tusb_xfer_type_t) p_endpoint_desc->bmAttributes.xfer;\n  struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n  /* allocate buffer from USB RAM */\n  ep->BUFSEG = bufseg_addr;\n  bufseg_addr += size;\n  TU_ASSERT(bufseg_addr <= USBD_BUF_SIZE);\n\n  /* construct USB Configuration Register value and then write it */\n  uint32_t cfg = tu_edpt_number(p_endpoint_desc->bEndpointAddress);\n  cfg |= (TUSB_DIR_IN == dir) ? USBD_CFG_EPMODE_IN : USBD_CFG_EPMODE_OUT;\n  if (TUSB_XFER_ISOCHRONOUS == type)\n    cfg |= USBD_CFG_TYPE_ISO;\n  ep->CFG = cfg;\n\n  /* make a note of the endpoint size */\n  xfer->max_packet_size = size;\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void) largest_packet_size;\n  return false; // TODO not implemented yet\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep) {\n  (void) rhport;\n  (void) desc_ep;\n  return false; // TODO not implemented yet\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  /* mine the data for the information we need */\n  tusb_dir_t dir = tu_edpt_dir(ep_addr);\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n  /* store away the information we'll needing now and later */\n  xfer->data_ptr = buffer;\n  // xfer->ff       = NULL; // TODO support dcd_edpt_xfer_fifo API\n  xfer->in_remaining_bytes = total_bytes;\n  xfer->total_bytes = total_bytes;\n\n  /* for the first of one or more EP0_IN packets in a message, the first must be DATA1 */\n  if ( (0x80 == ep_addr) && !active_ep0_xfer ) ep->CFG |= USBD_CFG_DSQ_SYNC_Msk;\n\n  if (TUSB_DIR_IN == dir)\n  {\n    dcd_in_xfer(xfer, ep);\n  }\n  else\n  {\n    xfer->out_bytes_so_far = 0;\n    ep->MXPLD = xfer->max_packet_size;\n  }\n\n  return true;\n}\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  /* mine the data for the information we need */\n  tusb_dir_t dir = tu_edpt_dir(ep_addr);\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n  /* store away the information we'll needing now and later */\n  xfer->data_ptr = NULL;      // Indicates a FIFO shall be used\n  xfer->ff       = ff;\n  xfer->in_remaining_bytes = total_bytes;\n  xfer->total_bytes = total_bytes;\n\n  if (TUSB_DIR_IN == dir)\n  {\n    dcd_in_xfer(xfer, ep);\n  }\n  else\n  {\n    xfer->out_bytes_so_far = 0;\n    ep->MXPLD = xfer->max_packet_size;\n  }\n\n  return true;\n}\n#endif\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  ep->CFGP |= USBD_CFGP_SSTALL_Msk;\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  ep->CFG |= USBD_CFG_CSTALL_Msk;\n}\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  (void) rhport;\n\n  uint32_t status = USBD->INTSTS;\n  uint32_t state = USBD->ATTR & 0xf;\n\n  if(status & USBD_INTSTS_FLDET_STS_Msk)\n  {\n    if(USBD->FLDET & USBD_FLDET_FLDET_Msk)\n    {\n      /* USB connect */\n      USBD->ATTR |= USBD_ATTR_USB_EN_Msk | USBD_ATTR_PHY_EN_Msk;\n    }\n    else\n    {\n      /* USB disconnect */\n      USBD->ATTR &= ~USBD_ATTR_USB_EN_Msk;\n    }\n  }\n\n  if(status & USBD_INTSTS_BUS_STS_Msk)\n  {\n    if(state & USBD_STATE_USBRST)\n    {\n      /* USB bus reset */\n      USBD->ATTR |= USBD_ATTR_USB_EN_Msk | USBD_ATTR_PHY_EN_Msk;\n\n      bus_reset();\n      dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n    }\n\n    if(state & USBD_STATE_SUSPEND)\n    {\n      /* Enable USB but disable PHY */\n      USBD->ATTR &= ~USBD_ATTR_PHY_EN_Msk;\n      dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n    }\n\n    if(state & USBD_STATE_RESUME)\n    {\n      /* Enable USB and enable PHY */\n      USBD->ATTR |= USBD_ATTR_USB_EN_Msk | USBD_ATTR_PHY_EN_Msk;\n      dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n    }\n  }\n\n  if(status & USBD_INTSTS_SETUP_Msk)\n  {\n    /* clear the data ready flag of control endpoints */\n    USBD->EP[PERIPH_EP0].CFGP |= USBD_CFGP_CLRRDY_Msk;\n    USBD->EP[PERIPH_EP1].CFGP |= USBD_CFGP_CLRRDY_Msk;\n\n    /* get SETUP packet from USB buffer */\n    dcd_event_setup_received(0, (uint8_t *)USBD_BUF_BASE, true);\n  }\n\n  if(status & USBD_INTSTS_USB_STS_Msk)\n  {\n    if (status & (1UL << USBD_INTSTS_EPEVT_Pos)) /* PERIPH_EP0 (EP0_IN) event: this is treated separately from the rest */\n    {\n      /* given ACK from host has happened, we can now set the address (if not already done) */\n      if((USBD->FADDR != assigned_address) && (USBD->FADDR == 0)) USBD->FADDR = assigned_address;\n\n      uint16_t const available_bytes = USBD->EP[PERIPH_EP0].MXPLD;\n\n      active_ep0_xfer = (available_bytes == xfer_table[PERIPH_EP0].max_packet_size);\n\n      dcd_event_xfer_complete(0, 0x80, available_bytes, XFER_RESULT_SUCCESS, true);\n    }\n\n    /* service PERIPH_EP1 through PERIPH_EP7 */\n    enum ep_enum ep_index;\n    uint32_t mask;\n    struct xfer_ctl_t *xfer;\n    USBD_EP_T *ep;\n    for (ep_index = PERIPH_EP1, mask = (2UL << USBD_INTSTS_EPEVT_Pos), xfer = &xfer_table[PERIPH_EP1], ep = &USBD->EP[PERIPH_EP1]; ep_index < PERIPH_MAX_EP; ep_index++, mask <<= 1, xfer++, ep++)\n    {\n      if(status & mask)\n      {\n        USBD->INTSTS = mask;\n\n        uint16_t const available_bytes = ep->MXPLD;\n        uint8_t const ep_addr = decode_ep_addr(ep);\n        bool const out_ep = !(ep_addr & TUSB_DIR_IN_MASK);\n\n        if (out_ep)\n        {\n          /* copy the data from the PC to the previously provided buffer */\n#if 0 // // TODO support dcd_edpt_xfer_fifo API\n          if (xfer->ff)\n          {\n            tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes);\n          }\n          else\n#endif\n          {\n            // USB SRAM seems to only support byte access and memcpy could possibly do it by words\n            usb_memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes);\n            xfer->data_ptr += available_bytes;\n          }\n\n          xfer->out_bytes_so_far += available_bytes;\n\n          /* when the transfer is finished, alert TinyUSB; otherwise, accept more data */\n          if ( (xfer->total_bytes == xfer->out_bytes_so_far) || (available_bytes < xfer->max_packet_size) )\n            dcd_event_xfer_complete(0, ep_addr, xfer->out_bytes_so_far, XFER_RESULT_SUCCESS, true);\n          else\n            ep->MXPLD = xfer->max_packet_size;\n        }\n        else\n        {\n          /* update the bookkeeping to reflect the data that has now been sent to the PC */\n          xfer->in_remaining_bytes -= available_bytes;\n\n          xfer->data_ptr += available_bytes;\n\n          /* if more data to send, send it; otherwise, alert TinyUSB that we've finished */\n          if (xfer->in_remaining_bytes)\n            dcd_in_xfer(xfer, ep);\n          else\n            dcd_event_xfer_complete(0, ep_addr, xfer->total_bytes, XFER_RESULT_SUCCESS, true);\n        }\n      }\n    }\n  }\n\n  /* acknowledge all interrupts */\n  USBD->INTSTS = status & enabled_irqs;\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  usb_detach();\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n  usb_attach();\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/nuvoton/nuc121/dcd_nuc121.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Peter Lawrence\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/*\n  Theory of operation:\n\n  The NUC121/NUC125/NUC126 USBD peripheral has eight \"EP\"s, but each is simplex,\n  so two collectively (peripheral nomenclature of \"EP0\" and \"EP1\") are needed to\n  implement USB EP0.  PERIPH_EP0 and PERIPH_EP1 are used by this driver for\n  EP0_IN and EP0_OUT respectively.  This leaves up to six for user usage.\n*/\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && ( (CFG_TUSB_MCU == OPT_MCU_NUC121) || (CFG_TUSB_MCU == OPT_MCU_NUC126) )\n\n#include \"device/dcd.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\n#include \"NuMicro.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n// Since TinyUSB doesn't use SOF for now, and this interrupt too often (1ms interval)\n// We disable SOF for now until needed later on\n#ifndef USE_SOF\n#  define USE_SOF     0\n#endif\n\n/* allocation of USBD RAM for Setup, EP0_IN, and and EP_OUT */\n#define PERIPH_SETUP_BUF_BASE  0\n#define PERIPH_SETUP_BUF_LEN   8\n#define PERIPH_EP0_BUF_BASE    (PERIPH_SETUP_BUF_BASE + PERIPH_SETUP_BUF_LEN)\n#define PERIPH_EP0_BUF_LEN     CFG_TUD_ENDPOINT0_SIZE\n#define PERIPH_EP1_BUF_BASE    (PERIPH_EP0_BUF_BASE + PERIPH_EP0_BUF_LEN)\n#define PERIPH_EP1_BUF_LEN     CFG_TUD_ENDPOINT0_SIZE\n#define PERIPH_EP2_BUF_BASE    (PERIPH_EP1_BUF_BASE + PERIPH_EP1_BUF_LEN)\n\n/* rather important info unfortunately not provided by device include files: how much there is */\n#define USBD_BUF_SIZE          ((CFG_TUSB_MCU == OPT_MCU_NUC121) ? 768 : 512)\n\nenum ep_enum\n{\n  PERIPH_EP0 = 0,\n  PERIPH_EP1 = 1,\n  PERIPH_EP2 = 2,\n  PERIPH_EP3 = 3,\n  PERIPH_EP4 = 4,\n  PERIPH_EP5 = 5,\n  PERIPH_EP6 = 6,\n  PERIPH_EP7 = 7,\n  PERIPH_MAX_EP,\n};\n\n/* reset by dcd_init(), this is used by dcd_edpt_open() to assign USBD peripheral buffer addresses */\nstatic uint32_t bufseg_addr;\n\n/* used by dcd_edpt_xfer() and the ISR to reset the data sync (DATA0/DATA1) in an EP0_IN transfer */\nstatic bool active_ep0_xfer;\n\n/* RAM table needed to track ongoing transfers performed by dcd_edpt_xfer(), dcd_in_xfer(), and the ISR */\nstatic struct xfer_ctl_t\n{\n  uint8_t *data_ptr;         /* data_ptr tracks where to next copy data to (for OUT) or from (for IN) */\n  // tu_fifo_t * ff; // TODO support dcd_edpt_xfer_fifo API\n  union {\n    uint16_t in_remaining_bytes; /* for IN endpoints, we track how many bytes are left to transfer */\n    uint16_t out_bytes_so_far;   /* but for OUT endpoints, we track how many bytes we've transferred so far */\n  };\n  uint16_t max_packet_size;  /* needed since device driver only finds out this at runtime */\n  uint16_t total_bytes;      /* quantity needed to pass as argument to dcd_event_xfer_complete() (for IN endpoints) */\n} xfer_table[PERIPH_MAX_EP];\n\n/*\n  local helper functions\n*/\n\nstatic void usb_attach(void)\n{\n  USBD->SE0 &= ~USBD_SE0_SE0_Msk;\n}\n\nstatic void usb_detach(void)\n{\n  USBD->SE0 |= USBD_SE0_SE0_Msk;\n}\n\nstatic inline void usb_memcpy(uint8_t *dest, uint8_t *src, uint16_t size)\n{\n  while(size--) *dest++ = *src++;\n}\n\nstatic void usb_control_send_zlp(void)\n{\n  USBD->EP[PERIPH_EP0].CFG |= USBD_CFG_DSQSYNC_Msk;\n  USBD->EP[PERIPH_EP0].MXPLD = 0;\n}\n\n/* reconstruct ep_addr from particular USB Configuration Register */\nstatic uint8_t decode_ep_addr(USBD_EP_T *ep)\n{\n  uint8_t ep_addr = ep->CFG & USBD_CFG_EPNUM_Msk;\n  if ( USBD_CFG_EPMODE_IN == (ep->CFG & USBD_CFG_STATE_Msk) )\n    ep_addr |= TUSB_DIR_IN_MASK;\n  return ep_addr;\n}\n\n/* map 8-bit ep_addr into peripheral endpoint index (PERIPH_EP0...) */\nstatic USBD_EP_T *ep_entry(uint8_t ep_addr, bool add)\n{\n  USBD_EP_T *ep;\n  enum ep_enum ep_index;\n\n  for (ep_index = PERIPH_EP0, ep = USBD->EP; ep_index < PERIPH_MAX_EP; ep_index++, ep++)\n  {\n    if (add)\n    {\n      /* take first peripheral endpoint that is unused */\n      if (0 == (ep->CFG & USBD_CFG_STATE_Msk)) return ep;\n    }\n    else\n    {\n      /* find a peripheral endpoint that matches ep_addr */\n      uint8_t candidate_ep_addr = decode_ep_addr(ep);\n      if (candidate_ep_addr == ep_addr) return ep;\n    }\n  }\n\n  return NULL;\n}\n\n/* perform an IN endpoint transfer; this is called by dcd_edpt_xfer() and the ISR  */\nstatic void dcd_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)\n{\n  uint16_t bytes_now = tu_min16(xfer->in_remaining_bytes, xfer->max_packet_size);\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\n  if (xfer->ff)\n  {\n    tu_fifo_read_n(xfer->ff, (void *) (USBD_BUF_BASE + ep->BUFSEG), bytes_now);\n  }\n  else\n#endif\n  {\n    // USB SRAM seems to only support byte access and memcpy could possibly do it by words\n    usb_memcpy((uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), xfer->data_ptr, bytes_now);\n  }\n\n  ep->MXPLD = bytes_now;\n}\n\n/* called by dcd_init() as well as by the ISR during a USB bus reset */\nstatic void bus_reset(void)\n{\n  USBD->STBUFSEG = PERIPH_SETUP_BUF_BASE;\n\n  for (enum ep_enum ep_index = PERIPH_EP0; ep_index < PERIPH_MAX_EP; ep_index++)\n  {\n    USBD->EP[ep_index].CFG = 0;\n    USBD->EP[ep_index].CFGP = 0;\n  }\n\n  /* allocate the default EP0 endpoints */\n\n  USBD->EP[PERIPH_EP0].CFG = USBD_CFG_CSTALL_Msk | USBD_CFG_EPMODE_IN;\n  USBD->EP[PERIPH_EP0].BUFSEG = PERIPH_EP0_BUF_BASE;\n  xfer_table[PERIPH_EP0].max_packet_size = PERIPH_EP0_BUF_LEN;\n\n  USBD->EP[PERIPH_EP1].CFG = USBD_CFG_CSTALL_Msk | USBD_CFG_EPMODE_OUT;\n  USBD->EP[PERIPH_EP1].BUFSEG = PERIPH_EP1_BUF_BASE;\n  xfer_table[PERIPH_EP1].max_packet_size = PERIPH_EP1_BUF_LEN;\n\n  /* USB RAM beyond what we've allocated above is available to the user */\n  bufseg_addr = PERIPH_EP2_BUF_BASE;\n\n  /* Reset USB device address */\n  USBD->FADDR = 0;\n\n  /* reset EP0_IN flag */\n  active_ep0_xfer = false;\n}\n\n/* centralized location for USBD interrupt enable bit mask */\nenum {\n  ENABLED_IRQS = USBD_INTSTS_VBDETIF_Msk | USBD_INTSTS_BUSIF_Msk | USBD_INTSTS_SETUP_Msk |\n                 USBD_INTSTS_USBIF_Msk   | (USE_SOF ? USBD_INTSTS_SOFIF_Msk : 0)\n};\n\n/*\n  NUC121/NUC125/NUC126 TinyUSB API driver implementation\n*/\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n#ifdef SUPPORT_LPM\n  USBD->ATTR = 0x7D0 | USBD_LPMACK;\n#else\n  USBD->ATTR = 0x7D0;\n#endif\n\n  usb_detach();\n\n  bus_reset();\n\n  usb_attach();\n\n  USBD->INTSTS = ENABLED_IRQS;\n  USBD->INTEN  = ENABLED_IRQS;\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_EnableIRQ(USBD_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_DisableIRQ(USBD_IRQn);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void) rhport;\n  (void) dev_addr;\n  usb_control_send_zlp(); /* SET_ADDRESS is the one exception where TinyUSB doesn't use dcd_edpt_xfer() to generate a ZLP */\n\n  // DCD can only set address after status for this request is complete.\n  // do it at dcd_edpt0_status_complete()\n}\n\nstatic void remote_wakeup_delay(void)\n{\n  // try to delay for 1 ms\n  uint32_t count = SystemCoreClock / 1000;\n  while(count--) __NOP();\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n  // Enable PHY before sending Resume('K') state\n  USBD->ATTR |= USBD_ATTR_PHYEN_Msk;\n  USBD->ATTR |= USBD_ATTR_RWAKEUP_Msk;\n\n  // Per specs: remote wakeup signal bit must be clear within 1-15ms\n  remote_wakeup_delay();\n  USBD->ATTR &=~USBD_ATTR_RWAKEUP_Msk;\n}\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc)\n{\n  (void) rhport;\n\n  USBD_EP_T *ep = ep_entry(p_endpoint_desc->bEndpointAddress, true);\n  TU_ASSERT(ep);\n\n  /* mine the data for the information we need */\n  int const dir = tu_edpt_dir(p_endpoint_desc->bEndpointAddress);\n  int const size = tu_edpt_packet_size(p_endpoint_desc);\n  tusb_xfer_type_t const type = (tusb_xfer_type_t) p_endpoint_desc->bmAttributes.xfer;\n  struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n  /* allocate buffer from USB RAM */\n  ep->BUFSEG = bufseg_addr;\n  bufseg_addr += size;\n  TU_ASSERT(bufseg_addr <= USBD_BUF_SIZE);\n\n  /* construct USB Configuration Register value and then write it */\n  uint32_t cfg = tu_edpt_number(p_endpoint_desc->bEndpointAddress);\n  cfg |= (TUSB_DIR_IN == dir) ? USBD_CFG_EPMODE_IN : USBD_CFG_EPMODE_OUT;\n  if (TUSB_XFER_ISOCHRONOUS == type) {\n    cfg |= USBD_CFG_TYPE_ISO;\n  }\n  ep->CFG = cfg;\n\n  /* make a note of the endpoint size */\n  xfer->max_packet_size = size;\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void) largest_packet_size;\n  return false; // TODO not implemented yet\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep) {\n  (void) rhport;\n  (void) desc_ep;\n  return false; // TODO not implemented yet\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  /* mine the data for the information we need */\n  tusb_dir_t dir = tu_edpt_dir(ep_addr);\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n  /* store away the information we'll needing now and later */\n  xfer->data_ptr = buffer;\n  // xfer->ff       = NULL; // TODO support dcd_edpt_xfer_fifo API\n  xfer->in_remaining_bytes = total_bytes;\n  xfer->total_bytes = total_bytes;\n\n  /* for the first of one or more EP0_IN packets in a message, the first must be DATA1 */\n  if ( (0x80 == ep_addr) && !active_ep0_xfer ) ep->CFG |= USBD_CFG_DSQSYNC_Msk;\n\n  if (TUSB_DIR_IN == dir)\n  {\n    dcd_in_xfer(xfer, ep);\n  }\n  else\n  {\n    xfer->out_bytes_so_far = 0;\n    ep->MXPLD = xfer->max_packet_size;\n  }\n\n  return true;\n}\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  /* mine the data for the information we need */\n  tusb_dir_t dir = tu_edpt_dir(ep_addr);\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n  /* store away the information we'll needing now and later */\n  xfer->data_ptr = NULL;      // Indicates a FIFO shall be used\n  xfer->ff       = ff;\n  xfer->in_remaining_bytes = total_bytes;\n  xfer->total_bytes = total_bytes;\n\n  if (TUSB_DIR_IN == dir)\n  {\n    dcd_in_xfer(xfer, ep);\n  }\n  else\n  {\n    xfer->out_bytes_so_far = 0;\n    ep->MXPLD = xfer->max_packet_size;\n  }\n\n  return true;\n}\n#endif\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  ep->CFGP |= USBD_CFGP_SSTALL_Msk;\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  ep->CFG = (ep->CFG & ~USBD_CFG_DSQSYNC_Msk) | USBD_CFG_CSTALL_Msk;\n}\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  (void) rhport;\n\n  // Mask non-enabled irqs, ex. SOF\n  uint32_t status = USBD->INTSTS & (ENABLED_IRQS | 0xffffff00);\n\n#ifdef SUPPORT_LPM\n  uint32_t state = USBD->ATTR & 0x300f;\n#else\n  uint32_t state = USBD->ATTR & 0xf;\n#endif\n\n  if(status & USBD_INTSTS_VBDETIF_Msk)\n  {\n    if(USBD->VBUSDET & USBD_VBUSDET_VBUSDET_Msk)\n    {\n      /* USB connect */\n      USBD->ATTR |= USBD_ATTR_USBEN_Msk | USBD_ATTR_PHYEN_Msk;\n    }\n    else\n    {\n      /* USB disconnect */\n      USBD->ATTR &= ~USBD_ATTR_USBEN_Msk;\n    }\n  }\n\n  if(status & USBD_INTSTS_BUSIF_Msk)\n  {\n    if(state & USBD_ATTR_USBRST_Msk)\n    {\n      /* USB bus reset */\n      USBD->ATTR |= USBD_ATTR_USBEN_Msk | USBD_ATTR_PHYEN_Msk;\n\n      bus_reset();\n\n      dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n    }\n\n    if(state & USBD_ATTR_SUSPEND_Msk)\n    {\n      /* Enable USB but disable PHY */\n      USBD->ATTR &= ~USBD_ATTR_PHYEN_Msk;\n      dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n    }\n\n    if(state & USBD_ATTR_RESUME_Msk)\n    {\n      /* Enable USB and enable PHY */\n      USBD->ATTR |= USBD_ATTR_USBEN_Msk | USBD_ATTR_PHYEN_Msk;\n      dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n    }\n  }\n\n  if(status & USBD_INTSTS_SETUP_Msk)\n  {\n    /* clear the data ready flag of control endpoints */\n    USBD->EP[PERIPH_EP0].CFGP |= USBD_CFGP_CLRRDY_Msk;\n    USBD->EP[PERIPH_EP1].CFGP |= USBD_CFGP_CLRRDY_Msk;\n\n    /* get SETUP packet from USB buffer */\n    dcd_event_setup_received(0, (uint8_t *)USBD_BUF_BASE, true);\n  }\n\n  if(status & USBD_INTSTS_USBIF_Msk)\n  {\n    if (status & USBD_INTSTS_EPEVT0_Msk) /* PERIPH_EP0 (EP0_IN) event: this is treated separately from the rest */\n    {\n      uint16_t const available_bytes = USBD->EP[PERIPH_EP0].MXPLD;\n\n      active_ep0_xfer = (available_bytes == xfer_table[PERIPH_EP0].max_packet_size);\n\n      dcd_event_xfer_complete(0, 0x80, available_bytes, XFER_RESULT_SUCCESS, true);\n    }\n\n    /* service PERIPH_EP1 through PERIPH_EP7 */\n    enum ep_enum ep_index;\n    uint32_t mask;\n    struct xfer_ctl_t *xfer;\n    USBD_EP_T *ep;\n    for (ep_index = PERIPH_EP1, mask = USBD_INTSTS_EPEVT1_Msk, xfer = &xfer_table[PERIPH_EP1], ep = &USBD->EP[PERIPH_EP1]; ep_index <= PERIPH_EP7; ep_index++, mask <<= 1, xfer++, ep++)\n    {\n      if(status & mask)\n      {\n        USBD->INTSTS = mask;\n\n        uint16_t const available_bytes = ep->MXPLD;\n        uint8_t const ep_addr = decode_ep_addr(ep);\n        bool const out_ep = !(ep_addr & TUSB_DIR_IN_MASK);\n\n        if (out_ep)\n        {\n          /* copy the data from the PC to the previously provided buffer */\n#if 0 // TODO support dcd_edpt_xfer_fifo API\n          if (xfer->ff)\n          {\n            tu_fifo_write_n(xfer->ff, (const void *) (USBD_BUF_BASE + ep->BUFSEG), available_bytes);\n          }\n          else\n#endif\n          {\n            // USB SRAM seems to only support byte access and memcpy could possibly do it by words\n            usb_memcpy(xfer->data_ptr, (uint8_t *)(USBD_BUF_BASE + ep->BUFSEG), available_bytes);\n            xfer->data_ptr += available_bytes;\n          }\n\n          xfer->out_bytes_so_far += available_bytes;\n\n          /* when the transfer is finished, alert TinyUSB; otherwise, accept more data */\n          if ( (xfer->total_bytes == xfer->out_bytes_so_far) || (available_bytes < xfer->max_packet_size) )\n            dcd_event_xfer_complete(0, ep_addr, xfer->out_bytes_so_far, XFER_RESULT_SUCCESS, true);\n          else\n            ep->MXPLD = xfer->max_packet_size;\n        }\n        else\n        {\n          /* update the bookkeeping to reflect the data that has now been sent to the PC */\n          xfer->in_remaining_bytes -= available_bytes;\n          xfer->data_ptr += available_bytes;\n\n          /* if more data to send, send it; otherwise, alert TinyUSB that we've finished */\n          if (xfer->in_remaining_bytes)\n            dcd_in_xfer(xfer, ep);\n          else\n            dcd_event_xfer_complete(0, ep_addr, xfer->total_bytes, XFER_RESULT_SUCCESS, true);\n        }\n      }\n    }\n  }\n\n  if(status & USBD_INTSTS_SOFIF_Msk)\n  {\n    /* Start-Of-Frame event */\n    dcd_event_bus_signal(0, DCD_EVENT_SOF, true);\n  }\n\n  /* acknowledge all interrupts */\n  USBD->INTSTS = status & ENABLED_IRQS;\n}\n\n// Invoked when a control transfer's status stage is complete.\n// May help DCD to prepare for next control transfer, this API is optional.\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request)\n{\n  (void) rhport;\n\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD &&\n      request->bRequest == TUSB_REQ_SET_ADDRESS )\n  {\n    uint8_t const dev_addr = (uint8_t) request->wValue;\n\n    // Setting new address after the whole request is complete\n    USBD->FADDR = dev_addr;\n  }\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  usb_detach();\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n  usb_attach();\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/nuvoton/nuc505/dcd_nuc505.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Peter Lawrence\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/*\n  Theory of operation:\n\n  The NUC505 USBD peripheral has twelve \"EP\"s, where each is simplex, in addition\n  to dedicated support for the control endpoint (EP0).  The non-user endpoints\n  are referred to as \"user\" EPs in this code, and follow the datasheet\n  nomenclature of EPA through EPL.\n*/\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && (CFG_TUSB_MCU == OPT_MCU_NUC505)\n\n#include \"device/dcd.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wredundant-decls\"\n#endif\n\n#include \"NUC505Series.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n/*\n * The DMA functionality of the USBD peripheral does not appear to succeed with\n * transfer lengths that are longer (> 64 bytes) and are not a multiple of 4.\n * Keep disabled for now.\n */\n#define USE_DMA     0\n\n/* rather important info unfortunately not provided by device include files */\n#define USBD_BUF_SIZE          2048 /* how much USB buffer space there is */\n#define USBD_MAX_DMA_LEN     0x1000 /* max bytes that can be DMAed at one time */\n\nenum ep_enum\n{\n  PERIPH_EPA = 0,\n  PERIPH_EPB = 1,\n  PERIPH_EPC = 2,\n  PERIPH_EPD = 3,\n  PERIPH_EPE = 4,\n  PERIPH_EPF = 5,\n  PERIPH_EPG = 6,\n  PERIPH_EPH = 7,\n  PERIPH_EPI = 8,\n  PERIPH_EPJ = 9,\n  PERIPH_EPK = 10,\n  PERIPH_EPL = 11,\n  PERIPH_MAX_EP,\n};\n\nstatic const uint8_t epcfg_eptype_table[] =\n{\n  [TUSB_XFER_CONTROL]     = 0, /* won't happen, since control EPs have dedicated registers */\n  [TUSB_XFER_ISOCHRONOUS] = 3 << USBD_EPCFG_EPTYPE_Pos,\n  [TUSB_XFER_BULK]        = 1 << USBD_EPCFG_EPTYPE_Pos,\n  [TUSB_XFER_INTERRUPT]   = 2 << USBD_EPCFG_EPTYPE_Pos,\n};\n\nstatic const uint8_t eprspctl_eptype_table[] =\n{\n  [TUSB_XFER_CONTROL]     = 0, /* won't happen, since control EPs have dedicated registers */\n  [TUSB_XFER_ISOCHRONOUS] = 2 << USBD_EPRSPCTL_MODE_Pos, /* Fly Mode */\n  [TUSB_XFER_BULK]        = 0 << USBD_EPRSPCTL_MODE_Pos, /* Auto-Validate Mode */\n  [TUSB_XFER_INTERRUPT]   = 1 << USBD_EPRSPCTL_MODE_Pos, /* Manual-Validate Mode */\n};\n\n/* set by dcd_set_address() */\nstatic volatile uint8_t assigned_address;\n\n/* reset by bus_reset(), this is used by dcd_edpt_open() to assign USBD peripheral buffer addresses */\nstatic uint32_t bufseg_addr;\n\n/* RAM table needed to track ongoing transfers performed by dcd_edpt_xfer(), dcd_userEP_in_xfer(), and the ISR */\nstatic struct xfer_ctl_t\n{\n  uint8_t *data_ptr;         /* data_ptr tracks where to next copy data to (for OUT) or from (for IN) */\n  // tu_fifo_t* ff; // TODO support dcd_edpt_xfer_fifo API\n  union {\n    uint16_t in_remaining_bytes; /* for IN endpoints, we track how many bytes are left to transfer */\n    uint16_t out_bytes_so_far;   /* but for OUT endpoints, we track how many bytes we've transferred so far */\n  };\n  uint16_t max_packet_size;  /* needed since device driver only finds out this at runtime */\n  uint16_t total_bytes;      /* quantity needed to pass as argument to dcd_event_xfer_complete() (for IN endpoints) */\n  uint8_t ep_addr;\n  bool dma_requested;\n} xfer_table[PERIPH_MAX_EP];\n\n/* in addition to xfer_table, additional bespoke bookkeeping is maintained for control EP0 IN */\nstatic struct\n{\n  uint8_t *data_ptr;\n  uint16_t in_remaining_bytes;\n  uint16_t total_bytes;\n} ctrl_in_xfer;\n\nstatic volatile struct xfer_ctl_t *current_dma_xfer;\n\n\n/*\n  local helper functions\n*/\n\nstatic void usb_attach(void)\n{\n  USBD->PHYCTL |= USBD_PHYCTL_DPPUEN_Msk;\n}\n\nstatic void usb_detach(void)\n{\n  USBD->PHYCTL &= ~USBD_PHYCTL_DPPUEN_Msk;\n}\n\nstatic void usb_control_send_zlp(void)\n{\n  USBD->CEPINTSTS = USBD_CEPINTSTS_STSDONEIF_Msk;\n  USBD->CEPCTL = 0; /* clear NAKCLR bit */\n  USBD->CEPINTEN = USBD_CEPINTEN_STSDONEIEN_Msk;\n}\n\n/* map 8-bit ep_addr into peripheral endpoint index (PERIPH_EPA...) */\nstatic USBD_EP_T *ep_entry(uint8_t ep_addr, bool add)\n{\n  USBD_EP_T *ep;\n  enum ep_enum ep_index;\n  struct xfer_ctl_t *xfer;\n\n  for (ep_index = PERIPH_EPA, xfer = &xfer_table[PERIPH_EPA], ep = USBD->EP;\n       ep_index < PERIPH_MAX_EP;\n       ep_index++, xfer++, ep++)\n  {\n    if (add)\n    {\n      /* take first peripheral endpoint that is unused */\n      if (0 == (ep->EPCFG & USBD_EPCFG_EPEN_Msk)) return ep;\n    }\n    else\n    {\n      /* find a peripheral endpoint that matches ep_addr */\n      if (xfer->ep_addr == ep_addr) return ep;\n    }\n  }\n\n  return NULL;\n}\n\n/* perform a non-control IN endpoint transfer; this is called by the ISR  */\nstatic void dcd_userEP_in_xfer(struct xfer_ctl_t *xfer, USBD_EP_T *ep)\n{\n  uint16_t const bytes_now = tu_min16(xfer->in_remaining_bytes, xfer->max_packet_size);\n\n  /* precompute what amount of data will be left */\n  xfer->in_remaining_bytes -= bytes_now;\n\n  /*\n  if there will be no more data to send, we replace the BUFEMPTYIF EP interrupt with TXPKIF;\n  that way, we alert TinyUSB as soon as this last packet has been sent\n  */\n  if (0 == xfer->in_remaining_bytes)\n  {\n    ep->EPINTSTS = USBD_EPINTSTS_TXPKIF_Msk;\n    ep->EPINTEN = USBD_EPINTEN_TXPKIEN_Msk;\n  }\n\n  /* provided buffers are thankfully 32-bit aligned, allowing most data to be transferred as 32-bit */\n#if 0 // TODO support dcd_edpt_xfer_fifo API\n  if (xfer->ff) {\n    tu_fifo_read_n_access_mode(xfer->ff, (void *) (&ep->EPDAT_BYTE), bytes_now, true);\n  }\n  else\n#endif\n  {\n    uint16_t countdown = bytes_now;\n    while (countdown > 3)\n    {\n      uint32_t u32;\n      memcpy(&u32, xfer->data_ptr, 4);\n\n      ep->EPDAT = u32;\n      xfer->data_ptr += 4; countdown -= 4;\n    }\n\n    while (countdown--) ep->EPDAT_BYTE = *xfer->data_ptr++;\n  }\n\n  /* for short packets, we must nudge the peripheral to say 'that's all folks' */\n  if (bytes_now != xfer->max_packet_size) ep->EPRSPCTL = USBD_EPRSPCTL_SHORTTXEN_Msk;\n}\n\n/* called by dcd_init() as well as by the ISR during a USB bus reset */\nstatic void bus_reset(void)\n{\n  for (enum ep_enum ep_index = PERIPH_EPA; ep_index < PERIPH_MAX_EP; ep_index++)\n  {\n    USBD->EP[ep_index].EPCFG = 0;\n    xfer_table[ep_index].dma_requested = false;\n  }\n\n  USBD->DMACNT = 0;\n  USBD->DMACTL = USBD_DMACTL_DMARST_Msk;\n  USBD->DMACTL = 0;\n\n  /* allocate the default EP0 endpoints */\n\n  USBD->CEPBUFSTART = 0;\n  USBD->CEPBUFEND = 0 + CFG_TUD_ENDPOINT0_SIZE - 1;\n\n  /* USB RAM beyond what we've allocated above is available to the user */\n  bufseg_addr = CFG_TUD_ENDPOINT0_SIZE;\n\n  /* Reset USB device address */\n  USBD->FADDR = 0;\n\n  current_dma_xfer = NULL;\n}\n\n#if USE_DMA\n/* this must only be called by the ISR; it does its best to share the single DMA engine across all user EPs (IN and OUT) */\nstatic void service_dma(void)\n{\n  if (current_dma_xfer)\n    return;\n\n  enum ep_enum ep_index;\n  struct xfer_ctl_t *xfer;\n  USBD_EP_T *ep;\n\n  for (ep_index = PERIPH_EPA, xfer = &xfer_table[PERIPH_EPA], ep = &USBD->EP[PERIPH_EPA]; ep_index < PERIPH_MAX_EP; ep_index++, xfer++, ep++)\n  {\n    uint16_t const available_bytes = ep->EPDATCNT & USBD_EPDATCNT_DATCNT_Msk;\n\n    if (!xfer->dma_requested || !available_bytes)\n      continue;\n\n    /*\n    instruct DMA to copy the data from the PC to the previously provided buffer\n    when the bus interrupt DMADONEIEN subsequently fires, the transfer will have finished\n    */\n    USBD->DMACTL = xfer->ep_addr & USBD_DMACTL_EPNUM_Msk;\n    USBD->DMAADDR = (uint32_t)xfer->data_ptr;\n    USBD->DMACNT = available_bytes;\n    USBD->BUSINTSTS = USBD_BUSINTSTS_DMADONEIF_Msk;\n    xfer->out_bytes_so_far += available_bytes;\n    current_dma_xfer = xfer;\n    USBD->DMACTL |= USBD_DMACTL_DMAEN_Msk;\n\n    return;\n  }\n}\n#endif\n\n/* centralized location for USBD interrupt enable bit masks */\nstatic const uint32_t enabled_irqs = USBD_GINTEN_USBIEN_Msk | \\\n  USBD_GINTEN_EPAIEN_Msk | USBD_GINTEN_EPBIEN_Msk | USBD_GINTEN_EPCIEN_Msk | USBD_GINTEN_EPDIEN_Msk | USBD_GINTEN_EPEIEN_Msk | USBD_GINTEN_EPFIEN_Msk | \\\n  USBD_GINTEN_EPGIEN_Msk | USBD_GINTEN_EPHIEN_Msk | USBD_GINTEN_EPIIEN_Msk | USBD_GINTEN_EPJIEN_Msk | USBD_GINTEN_EPKIEN_Msk | USBD_GINTEN_EPLIEN_Msk | \\\n  USBD_GINTEN_CEPIEN_Msk;\n\n/*\n  NUC505 TinyUSB API driver implementation\n*/\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  /* configure interrupts in their initial state; BUSINTEN and CEPINTEN will be subsequently and dynamically re-written as needed */\n  USBD->GINTEN = enabled_irqs;\n  USBD->BUSINTEN = USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_VBUSDETIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk | USBD_BUSINTEN_DMADONEIEN_Msk;\n  USBD->CEPINTEN = 0;\n\n  bus_reset();\n\n  usb_attach();\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_EnableIRQ(USBD_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_DisableIRQ(USBD_IRQn);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void) rhport;\n  usb_control_send_zlp(); /* SET_ADDRESS is the one exception where TinyUSB doesn't use dcd_edpt_xfer() to generate a ZLP */\n  assigned_address = dev_addr;\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n  USBD->OPER |= USBD_OPER_RESUMEEN_Msk;\n}\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc)\n{\n  (void) rhport;\n\n  USBD_EP_T *ep = ep_entry(p_endpoint_desc->bEndpointAddress, true);\n  TU_ASSERT(ep);\n\n  /* mine the data for the information we need */\n  int const dir = tu_edpt_dir(p_endpoint_desc->bEndpointAddress);\n  int const size = tu_edpt_packet_size(p_endpoint_desc);\n  tusb_xfer_type_t const type = p_endpoint_desc->bmAttributes.xfer;\n  struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n  /* allocate buffer from USB RAM */\n  ep->EPBUFSTART = bufseg_addr;\n  bufseg_addr += size;\n  ep->EPBUFEND = bufseg_addr - 1;\n  TU_ASSERT(bufseg_addr <= USBD_BUF_SIZE);\n\n  ep->EPMPS = size;\n\n  ep->EPRSPCTL = USB_EP_RSPCTL_FLUSH | eprspctl_eptype_table[type];\n\n  /* construct USB Configuration Register value and then write it */\n  uint32_t cfg = (uint32_t)tu_edpt_number(p_endpoint_desc->bEndpointAddress) << USBD_EPCFG_EPNUM_Pos;\n  if (TUSB_DIR_IN == dir)\n    cfg |= USBD_EPCFG_EPDIR_Msk;\n  cfg |= epcfg_eptype_table[type] | USBD_EPCFG_EPEN_Msk;\n  ep->EPCFG = cfg;\n\n  /* make a note of the endpoint particulars */\n  xfer->max_packet_size = size;\n  xfer->ep_addr = p_endpoint_desc->bEndpointAddress;\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void) largest_packet_size;\n  return false; // TODO not implemented yet\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep) {\n  (void) rhport;\n  (void) desc_ep;\n  return false; // TODO not implemented yet\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  if (0x80 == ep_addr) /* control EP0 IN */\n  {\n    if (total_bytes)\n    {\n      USBD->CEPCTL = USBD_CEPCTL_FLUSH_Msk;\n      ctrl_in_xfer.data_ptr = buffer;\n      ctrl_in_xfer.in_remaining_bytes = total_bytes;\n      ctrl_in_xfer.total_bytes = total_bytes;\n      USBD->CEPINTSTS = USBD_CEPINTSTS_INTKIF_Msk;\n      USBD->CEPINTEN = USBD_CEPINTEN_INTKIEN_Msk;\n    }\n    else\n    {\n      usb_control_send_zlp();\n    }\n  }\n  else if (0x00 == ep_addr) /* control EP0 OUT */\n  {\n    if (total_bytes)\n    {\n      /* if TinyUSB is asking for EP0 OUT data, it is almost certainly already in the buffer */\n      while (total_bytes < USBD->CEPRXCNT);\n      for (int count = 0; count < total_bytes; count++)\n        *buffer++ = USBD->CEPDAT_BYTE;\n\n      dcd_event_xfer_complete(0, ep_addr, total_bytes, XFER_RESULT_SUCCESS, true);\n    }\n  }\n  else\n  {\n    /* mine the data for the information we need */\n    tusb_dir_t dir = tu_edpt_dir(ep_addr);\n    USBD_EP_T *ep = ep_entry(ep_addr, false);\n    TU_ASSERT(ep);\n    struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n    /* store away the information we'll needing now and later */\n    xfer->data_ptr = buffer;\n    // xfer->ff       = NULL; // TODO support dcd_edpt_xfer_fifo API\n    xfer->in_remaining_bytes = total_bytes;\n    xfer->total_bytes = total_bytes;\n\n    if (TUSB_DIR_IN == dir)\n    {\n      ep->EPINTEN = USBD_EPINTEN_BUFEMPTYIEN_Msk;\n    }\n    else\n    {\n      xfer->out_bytes_so_far = 0;\n      ep->EPINTEN = USBD_EPINTEN_RXPKIEN_Msk;\n    }\n  }\n\n  return true;\n}\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  TU_ASSERT(0x80 != ep_addr && 0x00 != ep_addr);  // Must not be used for control stuff\n\n  /* mine the data for the information we need */\n  tusb_dir_t dir = tu_edpt_dir(ep_addr);\n  USBD_EP_T *ep = ep_entry(ep_addr, false);\n  struct xfer_ctl_t *xfer = &xfer_table[ep - USBD->EP];\n\n  /* store away the information we'll needing now and later */\n  xfer->data_ptr = NULL;      // Indicates a FIFO shall be used\n  xfer->ff       = ff;\n  xfer->in_remaining_bytes = total_bytes;\n  xfer->total_bytes = total_bytes;\n\n  if (TUSB_DIR_IN == dir)\n  {\n    ep->EPINTEN = USBD_EPINTEN_BUFEMPTYIEN_Msk;\n  }\n  else\n  {\n    xfer->out_bytes_so_far = 0;\n    ep->EPINTEN = USBD_EPINTEN_RXPKIEN_Msk;\n  }\n\n  return true;\n}\n#endif\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  if (tu_edpt_number(ep_addr))\n  {\n    USBD_EP_T *ep = ep_entry(ep_addr, false);\n    TU_ASSERT(ep, );\n    ep->EPRSPCTL = (ep->EPRSPCTL & 0xf7) | USBD_EPRSPCTL_HALT_Msk;\n  }\n  else\n  {\n    USBD->CEPCTL = USBD_CEPCTL_STALLEN_Msk;\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  if (tu_edpt_number(ep_addr))\n  {\n    USBD_EP_T *ep = ep_entry(ep_addr, false);\n    TU_ASSERT(ep, );\n    ep->EPRSPCTL = USBD_EPRSPCTL_TOGGLE_Msk;\n  }\n}\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  (void) rhport;\n\n  uint32_t status = USBD->GINTSTS;\n\n  /* USB interrupt */\n  if (status & USBD_GINTSTS_USBIF_Msk)\n  {\n    uint32_t bus_state = USBD->BUSINTSTS;\n\n    if (bus_state & USBD_BUSINTSTS_SOFIF_Msk)\n    {\n      /* Start-Of-Frame event */\n      dcd_event_bus_signal(0, DCD_EVENT_SOF, true);\n    }\n\n    if (bus_state & USBD_BUSINTSTS_RSTIF_Msk)\n    {\n      bus_reset();\n\n      USBD->CEPINTEN = USBD_CEPINTEN_SETUPPKIEN_Msk;\n      USBD->BUSINTEN = USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk | USBD_BUSINTEN_SUSPENDIEN_Msk | USBD_BUSINTEN_DMADONEIEN_Msk;\n      USBD->CEPINTSTS = 0x1ffc;\n\n      tusb_speed_t speed = (USBD->OPER & USBD_OPER_CURSPD_Msk) ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL;\n      dcd_event_bus_reset(0, speed, true);\n    }\n\n    if (bus_state & USBD_BUSINTSTS_RESUMEIF_Msk)\n    {\n      USBD->BUSINTEN = USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_SUSPENDIEN_Msk | USBD_BUSINTEN_DMADONEIEN_Msk;\n      dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n    }\n\n    if (bus_state & USBD_BUSINTSTS_SUSPENDIF_Msk)\n    {\n      USBD->BUSINTEN = USBD_BUSINTEN_RSTIEN_Msk | USBD_BUSINTEN_RESUMEIEN_Msk | USBD_BUSINTEN_DMADONEIEN_Msk;\n      dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n    }\n\n    if (bus_state & USBD_BUSINTSTS_HISPDIF_Msk)\n    {\n      USBD->CEPINTEN = USBD_CEPINTEN_SETUPPKIEN_Msk;\n    }\n\n    if (bus_state & USBD_BUSINTSTS_DMADONEIF_Msk)\n    {\n#if USE_DMA\n      if (current_dma_xfer)\n      {\n        current_dma_xfer->dma_requested = false;\n\n        uint16_t available_bytes = USBD->DMACNT & USBD_DMACNT_DMACNT_Msk;\n\n        /* if the most recent DMA finishes the transfer, alert TinyUSB; otherwise, the next RXPKIF/INTKIF endpoint interrupt will prompt the next DMA */\n        if ( (current_dma_xfer->total_bytes == current_dma_xfer->out_bytes_so_far) || (available_bytes < current_dma_xfer->max_packet_size) )\n        {\n          dcd_event_xfer_complete(0, current_dma_xfer->ep_addr, current_dma_xfer->out_bytes_so_far, XFER_RESULT_SUCCESS, true);\n        }\n\n        current_dma_xfer = NULL;\n        service_dma();\n      }\n#endif\n    }\n\n    if (bus_state & USBD_BUSINTSTS_VBUSDETIF_Msk)\n    {\n      if (USBD->PHYCTL & USBD_PHYCTL_VBUSDET_Msk)\n      {\n        /* USB connect */\n        USBD->PHYCTL |= USBD_PHYCTL_PHYEN_Msk | USBD_PHYCTL_DPPUEN_Msk;\n      }\n      else\n      {\n        /* USB disconnect */\n        USBD->PHYCTL &= ~USBD_PHYCTL_DPPUEN_Msk;\n      }\n    }\n\n    USBD->BUSINTSTS = bus_state & (USBD_BUSINTSTS_SOFIF_Msk | USBD_BUSINTSTS_RSTIF_Msk | USBD_BUSINTSTS_RESUMEIF_Msk | USBD_BUSINTSTS_SUSPENDIF_Msk | USBD_BUSINTSTS_HISPDIF_Msk | USBD_BUSINTSTS_DMADONEIF_Msk | USBD_BUSINTSTS_PHYCLKVLDIF_Msk | USBD_BUSINTSTS_VBUSDETIF_Msk);\n  }\n\n  if (status & USBD_GINTSTS_CEPIF_Msk)\n  {\n    uint32_t cep_state = USBD->CEPINTSTS & USBD->CEPINTEN;\n\n    if (cep_state & USBD_CEPINTSTS_SETUPPKIF_Msk)\n    {\n      /* get SETUP packet from USB buffer */\n      uint8_t setup_packet[8];\n      setup_packet[0] = (uint8_t)(USBD->SETUP1_0 >> 0);\n      setup_packet[1] = (uint8_t)(USBD->SETUP1_0 >> 8);\n      setup_packet[2] = (uint8_t)(USBD->SETUP3_2 >> 0);\n      setup_packet[3] = (uint8_t)(USBD->SETUP3_2 >> 8);\n      setup_packet[4] = (uint8_t)(USBD->SETUP5_4 >> 0);\n      setup_packet[5] = (uint8_t)(USBD->SETUP5_4 >> 8);\n      setup_packet[6] = (uint8_t)(USBD->SETUP7_6 >> 0);\n      setup_packet[7] = (uint8_t)(USBD->SETUP7_6 >> 8);\n      dcd_event_setup_received(0, setup_packet, true);\n    }\n    else if (cep_state & USBD_CEPINTSTS_INTKIF_Msk)\n    {\n      USBD->CEPINTSTS = USBD_CEPINTSTS_TXPKIF_Msk;\n\n      if (!(cep_state & USBD_CEPINTSTS_STSDONEIF_Msk))\n      {\n        USBD->CEPINTEN = USBD_CEPINTEN_TXPKIEN_Msk;\n        uint16_t bytes_now = tu_min16(ctrl_in_xfer.in_remaining_bytes, CFG_TUD_ENDPOINT0_SIZE);\n        for (int count = 0; count < bytes_now; count++)\n          USBD->CEPDAT_BYTE = *ctrl_in_xfer.data_ptr++;\n        ctrl_in_xfer.in_remaining_bytes -= bytes_now;\n        USBD_START_CEP_IN(bytes_now);\n      }\n      else\n      {\n        USBD->CEPINTEN = USBD_CEPINTEN_TXPKIEN_Msk | USBD_CEPINTEN_STSDONEIEN_Msk;\n      }\n    }\n    else if (cep_state & USBD_CEPINTSTS_TXPKIF_Msk)\n    {\n      USBD->CEPINTSTS = USBD_CEPINTSTS_STSDONEIF_Msk;\n      USBD_SET_CEP_STATE(USB_CEPCTL_NAKCLR);\n\n      /* alert TinyUSB that the EP0 IN transfer has finished */\n      if ( (0 == ctrl_in_xfer.in_remaining_bytes) || (0 == ctrl_in_xfer.total_bytes) )\n        dcd_event_xfer_complete(0, 0x80, ctrl_in_xfer.total_bytes, XFER_RESULT_SUCCESS, true);\n\n      if (ctrl_in_xfer.in_remaining_bytes)\n      {\n        USBD->CEPINTSTS = USBD_CEPINTSTS_INTKIF_Msk;\n        USBD->CEPINTEN = USBD_CEPINTEN_INTKIEN_Msk;\n      }\n      else\n      {\n        /* TinyUSB does its own fragmentation and ZLP for EP0; a transfer of zero means a ZLP */\n        if (0 == ctrl_in_xfer.total_bytes) USBD->CEPCTL = USBD_CEPCTL_ZEROLEN_Msk;\n\n        USBD->CEPINTSTS = USBD_CEPINTSTS_STSDONEIF_Msk;\n        USBD->CEPINTEN = USBD_CEPINTEN_SETUPPKIEN_Msk | USBD_CEPINTEN_STSDONEIEN_Msk;\n      }\n    }\n    else if (cep_state & USBD_CEPINTSTS_STSDONEIF_Msk)\n    {\n      /* given ACK from host has happened, we can now set the address (if not already done) */\n      if((USBD->FADDR != assigned_address) && (USBD->FADDR == 0))\n      {\n        USBD->FADDR = assigned_address;\n\n        for (enum ep_enum ep_index = PERIPH_EPA; ep_index < PERIPH_MAX_EP; ep_index++)\n        {\n          if (USBD->EP[ep_index].EPCFG & USBD_EPCFG_EPEN_Msk) USBD->EP[ep_index].EPRSPCTL = USBD_EPRSPCTL_TOGGLE_Msk;\n        }\n      }\n\n      USBD->CEPINTEN = USBD_CEPINTEN_SETUPPKIEN_Msk;\n    }\n\n    USBD->CEPINTSTS = cep_state;\n\n    return;\n  }\n\n  if (status & (USBD_GINTSTS_EPAIF_Msk | USBD_GINTSTS_EPBIF_Msk | USBD_GINTSTS_EPCIF_Msk | USBD_GINTSTS_EPDIF_Msk | USBD_GINTSTS_EPEIF_Msk | USBD_GINTSTS_EPFIF_Msk | USBD_GINTSTS_EPGIF_Msk | USBD_GINTSTS_EPHIF_Msk | USBD_GINTSTS_EPIIF_Msk | USBD_GINTSTS_EPJIF_Msk | USBD_GINTSTS_EPKIF_Msk | USBD_GINTSTS_EPLIF_Msk))\n  {\n    /* service PERIPH_EPA through PERIPH_EPL */\n    enum ep_enum ep_index;\n    uint32_t mask;\n    struct xfer_ctl_t *xfer;\n    USBD_EP_T *ep;\n    for (ep_index = PERIPH_EPA, mask = USBD_GINTSTS_EPAIF_Msk, xfer = &xfer_table[PERIPH_EPA], ep = &USBD->EP[PERIPH_EPA]; ep_index < PERIPH_MAX_EP; ep_index++, mask <<= 1, xfer++, ep++)\n    {\n      if(status & mask)\n      {\n        uint8_t const ep_addr = xfer->ep_addr;\n        bool const out_ep = !(ep_addr & TUSB_DIR_IN_MASK);\n        uint32_t ep_state = ep->EPINTSTS & ep->EPINTEN;\n\n        if (out_ep)\n        {\n#if USE_DMA\n          xfer->dma_requested = true;\n          service_dma();\n#else\n          uint16_t const available_bytes = ep->EPDATCNT & USBD_EPDATCNT_DATCNT_Msk;\n          /* copy the data from the PC to the previously provided buffer */\n#if 0 // TODO support dcd_edpt_xfer_fifo API\n          if (xfer->ff) {\n            tu_fifo_write_n_access_mode(xfer->ff, (const void *) &ep->EPDAT_BYTE, tu_min16(available_bytes, xfer->total_bytes - xfer->out_bytes_so_far), true);\n          }\n          else\n#endif\n          {\n            for (int count = 0; (count < available_bytes) && (xfer->out_bytes_so_far < xfer->total_bytes);\n                 count++, xfer->out_bytes_so_far++) {\n              *xfer->data_ptr++ = ep->EPDAT_BYTE;\n            }\n          }\n\n          /* when the transfer is finished, alert TinyUSB; otherwise, continue accepting more data */\n          if ( (xfer->total_bytes == xfer->out_bytes_so_far) || (available_bytes < xfer->max_packet_size) )\n          {\n            dcd_event_xfer_complete(0, ep_addr, xfer->out_bytes_so_far, XFER_RESULT_SUCCESS, true);\n          }\n#endif\n\n        }\n        else if (ep_state & USBD_EPINTSTS_BUFEMPTYIF_Msk)\n        {\n          /* send any remaining data */\n          dcd_userEP_in_xfer(xfer, ep);\n        }\n        else if (ep_state & USBD_EPINTSTS_TXPKIF_Msk)\n        {\n          /* alert TinyUSB that we've finished */\n          dcd_event_xfer_complete(0, ep_addr, xfer->total_bytes, XFER_RESULT_SUCCESS, true);\n          ep->EPINTEN = 0;\n        }\n\n        ep->EPINTSTS = ep_state;\n      }\n    }\n  }\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  usb_detach();\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n  usb_attach();\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/nxp/khci/dcd_khci.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_CHIPIDEA_FS)\n\n#ifdef TUP_USBIP_CHIPIDEA_FS_KINETIS\n  #include \"fsl_device_registers.h\"\n  #define KHCI        USB0\n#else\n  #error \"MCU is not supported\"\n#endif\n\n#include \"device/dcd.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\nenum {\n  TOK_PID_OUT   = 0x1u,\n  TOK_PID_IN    = 0x9u,\n  TOK_PID_SETUP = 0xDu,\n};\n\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint32_t head;\n    struct {\n      union {\n        struct {\n               uint16_t           :  2;\n          __IO uint16_t tok_pid   :  4;\n               uint16_t data      :  1;\n          __IO uint16_t own       :  1;\n               uint16_t           :  8;\n        };\n        struct {\n               uint16_t           :  2;\n               uint16_t bdt_stall :  1;\n               uint16_t dts       :  1;\n               uint16_t ninc      :  1;\n               uint16_t keep      :  1;\n               uint16_t           : 10;\n        };\n      };\n      __IO uint16_t bc : 10;\n           uint16_t    :  6;\n    };\n  };\n  uint8_t *addr;\n}buffer_descriptor_t;\n\nTU_VERIFY_STATIC( sizeof(buffer_descriptor_t) == 8, \"size is not correct\" );\n\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint32_t state;\n    struct {\n      uint32_t max_packet_size :11;\n      uint32_t                 : 5;\n      uint32_t odd             : 1;\n      uint32_t                 :15;\n    };\n  };\n  uint16_t length;\n  uint16_t remaining;\n}endpoint_state_t;\n\nTU_VERIFY_STATIC( sizeof(endpoint_state_t) == 8, \"size is not correct\" );\n\ntypedef struct\n{\n  union {\n    /* [#EP][OUT,IN][EVEN,ODD] */\n    buffer_descriptor_t bdt[16][2][2];\n    uint16_t            bda[512];\n  };\n  TU_ATTR_ALIGNED(4) union {\n    endpoint_state_t endpoint[16][2];\n    endpoint_state_t endpoint_unified[16 * 2];\n  };\n  uint8_t setup_packet[8];\n  uint8_t addr;\n}dcd_data_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\n// BDT(Buffer Descriptor Table) must be 256-byte aligned\nCFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(512) static dcd_data_t _dcd;\n\nTU_VERIFY_STATIC( sizeof(_dcd.bdt) == 512, \"size is not correct\" );\n\nstatic void prepare_next_setup_packet(uint8_t rhport)\n{\n  const unsigned out_odd = _dcd.endpoint[0][0].odd;\n  const unsigned in_odd  = _dcd.endpoint[0][1].odd;\n  TU_ASSERT(0 == _dcd.bdt[0][0][out_odd].own, );\n\n  _dcd.bdt[0][0][out_odd].data     = 0;\n  _dcd.bdt[0][0][out_odd ^ 1].data = 1;\n  _dcd.bdt[0][1][in_odd].data      = 1;\n  _dcd.bdt[0][1][in_odd ^ 1].data  = 0;\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_OUT),\n                _dcd.setup_packet, sizeof(_dcd.setup_packet), false);\n}\n\nstatic void process_stall(uint8_t rhport)\n{\n  for (int i = 0; i < 16; ++i) {\n    unsigned const endpt = KHCI->ENDPOINT[i].ENDPT;\n\n    if (endpt & USB_ENDPT_EPSTALL_MASK) {\n      // prepare next setup if endpoint0\n      if ( i == 0 ) prepare_next_setup_packet(rhport);\n\n      // clear stall bit\n      KHCI->ENDPOINT[i].ENDPT = endpt & ~USB_ENDPT_EPSTALL_MASK;\n    }\n  }\n}\n\nstatic void process_tokdne(uint8_t rhport)\n{\n  const unsigned s = KHCI->STAT;\n  KHCI->ISTAT = USB_ISTAT_TOKDNE_MASK; /* fetch the next token if received */\n\n  uint8_t const epnum = (s >> USB_STAT_ENDP_SHIFT);\n  uint8_t const dir   = (s & USB_STAT_TX_MASK) >> USB_STAT_TX_SHIFT;\n  unsigned const odd  = (s & USB_STAT_ODD_MASK) ? 1 : 0;\n\n  buffer_descriptor_t *bd = (buffer_descriptor_t *)&_dcd.bda[s];\n  endpoint_state_t    *ep = &_dcd.endpoint_unified[s >> 3];\n\n  /* fetch pid before discarded by the next steps */\n  const unsigned pid = bd->tok_pid;\n\n  /* reset values for a next transfer */\n  bd->bdt_stall = 0;\n  bd->dts       = 1;\n  bd->ninc      = 0;\n  bd->keep      = 0;\n  /* update the odd variable to prepare for the next transfer */\n  ep->odd       = odd ^ 1;\n  if (pid == TOK_PID_SETUP) {\n    dcd_event_setup_received(rhport, bd->addr, true);\n    KHCI->CTL &= ~USB_CTL_TXSUSPENDTOKENBUSY_MASK;\n    return;\n  }\n\n  const unsigned bc = bd->bc;\n  const unsigned remaining = ep->remaining - bc;\n  if (remaining && bc == ep->max_packet_size) {\n    /* continue the transferring consecutive data */\n    ep->remaining = remaining;\n    const int next_remaining = remaining - ep->max_packet_size;\n    if (next_remaining > 0) {\n      /* prepare to the after next transfer */\n      bd->addr += ep->max_packet_size * 2;\n      bd->bc    = next_remaining > ep->max_packet_size ? ep->max_packet_size: next_remaining;\n      __DSB();\n      bd->own   = 1; /* the own bit must set after addr */\n    }\n    return;\n  }\n  const unsigned length = ep->length;\n  dcd_event_xfer_complete(rhport,\n                          tu_edpt_addr(epnum, dir),\n                          length - remaining, XFER_RESULT_SUCCESS, true);\n  if (0 == epnum && 0 == length) {\n    /* After completion a ZLP of control transfer,\n     * it prepares for the next steup transfer. */\n    if (_dcd.addr) {\n      /* When the transfer was the SetAddress,\n       * the device address should be updated here. */\n      KHCI->ADDR = _dcd.addr;\n      _dcd.addr  = 0;\n    }\n    prepare_next_setup_packet(rhport);\n  }\n}\n\nstatic void process_bus_reset(uint8_t rhport)\n{\n  KHCI->USBCTRL &= ~USB_USBCTRL_SUSP_MASK;\n  KHCI->CTL     |= USB_CTL_ODDRST_MASK;\n  KHCI->ADDR     = 0;\n  KHCI->INTEN    = USB_INTEN_USBRSTEN_MASK | USB_INTEN_TOKDNEEN_MASK | USB_INTEN_SLEEPEN_MASK |\n                   USB_INTEN_ERROREN_MASK  | USB_INTEN_STALLEN_MASK;\n\n  KHCI->ENDPOINT[0].ENDPT = USB_ENDPT_EPHSHK_MASK | USB_ENDPT_EPRXEN_MASK | USB_ENDPT_EPTXEN_MASK;\n  for (unsigned i = 1; i < 16; ++i) {\n    KHCI->ENDPOINT[i].ENDPT = 0;\n  }\n  buffer_descriptor_t *bd = _dcd.bdt[0][0];\n  for (unsigned i = 0; i < sizeof(_dcd.bdt)/sizeof(*bd); ++i, ++bd) {\n    bd->head = 0;\n  }\n  const endpoint_state_t ep0 = {\n    .max_packet_size = CFG_TUD_ENDPOINT0_SIZE,\n    .odd             = 0,\n    .length          = 0,\n    .remaining       = 0,\n  };\n  _dcd.endpoint[0][0] = ep0;\n  _dcd.endpoint[0][1] = ep0;\n  tu_memclr(_dcd.endpoint[1], sizeof(_dcd.endpoint) - sizeof(_dcd.endpoint[0]));\n  _dcd.addr = 0;\n  prepare_next_setup_packet(rhport);\n  KHCI->CTL &= ~USB_CTL_ODDRST_MASK;\n  dcd_event_bus_reset(rhport, TUSB_SPEED_FULL, true);\n}\n\nstatic void process_bus_sleep(uint8_t rhport)\n{\n  // Enable resume & disable suspend interrupt\n  const unsigned inten = KHCI->INTEN;\n\n  KHCI->INTEN    = (inten & ~USB_INTEN_SLEEPEN_MASK) | USB_INTEN_RESUMEEN_MASK;\n  KHCI->USBTRC0 |= USB_USBTRC0_USBRESMEN_MASK;\n  KHCI->USBCTRL |= USB_USBCTRL_SUSP_MASK;\n\n  dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n}\n\nstatic void process_bus_resume(uint8_t rhport)\n{\n  // Enable suspend & disable resume interrupt\n  const unsigned inten = KHCI->INTEN;\n\n  KHCI->USBCTRL &= ~USB_USBCTRL_SUSP_MASK; // will also clear USB_USBTRC0_USB_RESUME_INT_MASK\n  KHCI->USBTRC0 &= ~USB_USBTRC0_USBRESMEN_MASK;\n  KHCI->INTEN    = (inten & ~USB_INTEN_RESUMEEN_MASK) | USB_INTEN_SLEEPEN_MASK;\n\n  dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n}\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  // save crystal-less setting (if available)\n  #if defined(FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED) && FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED == 1\n  uint32_t clk_recover_irc_en = KHCI->CLK_RECOVER_IRC_EN;\n  uint32_t clk_recover_ctrl = KHCI->CLK_RECOVER_CTRL;\n  #endif\n\n  KHCI->USBTRC0 |= USB_USBTRC0_USBRESET_MASK;\n  while (KHCI->USBTRC0 & USB_USBTRC0_USBRESET_MASK);\n\n  // restore crystal-less setting (if available)\n  #if defined(FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED) && FSL_FEATURE_USB_KHCI_IRC48M_MODULE_CLOCK_ENABLED == 1\n  KHCI->CLK_RECOVER_IRC_EN = clk_recover_irc_en;\n  KHCI->CLK_RECOVER_CTRL  |= clk_recover_ctrl;\n  #endif\n\n  tu_memclr(&_dcd, sizeof(_dcd));\n  KHCI->USBTRC0 |= TU_BIT(6); /* software must set this bit to 1 */\n  KHCI->BDTPAGE1 = (uint8_t)((uintptr_t)_dcd.bdt >>  8);\n  KHCI->BDTPAGE2 = (uint8_t)((uintptr_t)_dcd.bdt >> 16);\n  KHCI->BDTPAGE3 = (uint8_t)((uintptr_t)_dcd.bdt >> 24);\n\n  KHCI->INTEN = USB_INTEN_USBRSTEN_MASK;\n\n  dcd_connect(rhport);\n  NVIC_ClearPendingIRQ(USB0_IRQn);\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_EnableIRQ(USB0_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_DisableIRQ(USB0_IRQn);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  _dcd.addr = dev_addr & 0x7F;\n  /* Response with status first before changing device address */\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n\n  KHCI->CTL |= USB_CTL_RESUME_MASK;\n\n  unsigned cnt = SystemCoreClock / 1000;\n  while (cnt--) __NOP();\n\n  KHCI->CTL &= ~USB_CTL_RESUME_MASK;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n  KHCI->USBCTRL  = 0;\n  KHCI->CONTROL |= USB_CONTROL_DPPULLUPNONOTG_MASK;\n  KHCI->CTL     |= USB_CTL_USBENSOFEN_MASK;\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  KHCI->CTL      = 0;\n  KHCI->CONTROL &= ~USB_CONTROL_DPPULLUPNONOTG_MASK;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\nstatic bool edpt_open(uint8_t rhport, uint8_t ep_addr, uint16_t max_packet_size, tusb_xfer_type_t xfer) {\n  (void)rhport;\n\n  const unsigned       epn = tu_edpt_number(ep_addr);\n  const unsigned       dir = tu_edpt_dir(ep_addr);\n  endpoint_state_t    *ep  = &_dcd.endpoint[epn][dir];\n  const unsigned       odd = ep->odd;\n  buffer_descriptor_t *bd  = _dcd.bdt[epn][dir];\n\n  /* No support for control transfer */\n  TU_ASSERT(epn && (xfer != TUSB_XFER_CONTROL));\n\n  ep->max_packet_size = max_packet_size;\n  unsigned val        = USB_ENDPT_EPCTLDIS_MASK;\n  val |= (xfer != TUSB_XFER_ISOCHRONOUS) ? USB_ENDPT_EPHSHK_MASK : 0;\n  val |= dir ? USB_ENDPT_EPTXEN_MASK : USB_ENDPT_EPRXEN_MASK;\n  KHCI->ENDPOINT[epn].ENDPT |= val;\n\n  if (xfer != TUSB_XFER_ISOCHRONOUS) {\n    bd[odd].dts      = 1;\n    bd[odd].data     = 0;\n    bd[odd ^ 1].dts  = 1;\n    bd[odd ^ 1].data = 1;\n  }\n\n  return true;\n}\n\nbool dcd_edpt_open(uint8_t rhport, const tusb_desc_endpoint_t *ep_desc) {\n  return edpt_open(rhport, ep_desc->bEndpointAddress, tu_edpt_packet_size(ep_desc), ep_desc->bmAttributes.xfer);\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  return edpt_open(rhport, ep_addr, largest_packet_size, TUSB_XFER_ISOCHRONOUS);\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *ep_desc) {\n  const unsigned    epn = tu_edpt_number(ep_desc->bEndpointAddress);\n  const unsigned    dir = tu_edpt_dir(ep_desc->bEndpointAddress);\n  endpoint_state_t *ep  = &_dcd.endpoint[epn][dir];\n\n  dcd_int_disable(rhport);\n  ep->max_packet_size = tu_edpt_packet_size(ep_desc);\n  dcd_int_enable(rhport);\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport)\n{\n  (void) rhport;\n  const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);\n  NVIC_DisableIRQ(USB0_IRQn);\n  for (unsigned i = 1; i < 16; ++i) {\n    KHCI->ENDPOINT[i].ENDPT = 0;\n  }\n  if (ie) NVIC_EnableIRQ(USB0_IRQn);\n  buffer_descriptor_t *bd = _dcd.bdt[1][0];\n  for (unsigned i = 2; i < sizeof(_dcd.bdt)/sizeof(*bd); ++i, ++bd) {\n    bd->head = 0;\n  }\n  endpoint_state_t *ep = &_dcd.endpoint[1][0];\n  for (unsigned i = 2; i < sizeof(_dcd.endpoint)/sizeof(*ep); ++i, ++ep) {\n    /* Clear except the odd */\n    ep->max_packet_size = 0;\n    ep->length          = 0;\n    ep->remaining       = 0;\n  }\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) rhport;\n  (void) is_isr;\n  const unsigned epn      = tu_edpt_number(ep_addr);\n  const unsigned dir      = tu_edpt_dir(ep_addr);\n  endpoint_state_t    *ep = &_dcd.endpoint[epn][dir];\n  buffer_descriptor_t *bd = &_dcd.bdt[epn][dir][ep->odd];\n  TU_ASSERT(0 == bd->own);\n\n  const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);\n  NVIC_DisableIRQ(USB0_IRQn);\n\n  ep->length    = total_bytes;\n  ep->remaining = total_bytes;\n\n  const unsigned mps = ep->max_packet_size;\n  if (total_bytes > mps) {\n    buffer_descriptor_t *next = ep->odd ? bd - 1: bd + 1;\n    /* When total_bytes is greater than the max packet size,\n     * it prepares to the next transfer to avoid NAK in advance. */\n    next->bc   = total_bytes >= 2 * mps ? mps: total_bytes - mps;\n    next->addr = buffer + mps;\n    next->own  = 1;\n  }\n  bd->bc   = total_bytes >= mps ? mps: total_bytes;\n  bd->addr = buffer;\n  __DSB();\n  bd->own  = 1; /* This bit must be set last */\n\n  if (ie) NVIC_EnableIRQ(USB0_IRQn);\n  return true;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  const unsigned epn = tu_edpt_number(ep_addr);\n\n  if (0 == epn) {\n    KHCI->ENDPOINT[epn].ENDPT |=  USB_ENDPT_EPSTALL_MASK;\n  } else {\n    const unsigned dir      = tu_edpt_dir(ep_addr);\n    const unsigned odd      = _dcd.endpoint[epn][dir].odd;\n    buffer_descriptor_t *bd = &_dcd.bdt[epn][dir][odd];\n    TU_ASSERT(0 == bd->own,);\n\n    const unsigned ie       = NVIC_GetEnableIRQ(USB0_IRQn);\n    NVIC_DisableIRQ(USB0_IRQn);\n\n    bd->bdt_stall = 1;\n    __DSB();\n    bd->own       = 1; /* This bit must be set last */\n\n    if (ie) NVIC_EnableIRQ(USB0_IRQn);\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  const unsigned epn      = tu_edpt_number(ep_addr);\n  TU_VERIFY(epn,);\n  const unsigned dir      = tu_edpt_dir(ep_addr);\n  const unsigned odd      = _dcd.endpoint[epn][dir].odd;\n  buffer_descriptor_t *bd = _dcd.bdt[epn][dir];\n  TU_VERIFY(bd[odd].own,);\n\n  const unsigned ie       = NVIC_GetEnableIRQ(USB0_IRQn);\n  NVIC_DisableIRQ(USB0_IRQn);\n\n  bd[odd].own = 0;\n  __DSB();\n\n  // clear stall\n  bd[odd].bdt_stall  = 0;\n\n  // Reset data toggle\n  bd[odd    ].data = 0;\n  bd[odd ^ 1].data = 1;\n\n  // We already cleared this in ISR, but just clear it here to be safe\n  const unsigned endpt = KHCI->ENDPOINT[epn].ENDPT;\n  if (endpt & USB_ENDPT_EPSTALL_MASK) {\n    KHCI->ENDPOINT[epn].ENDPT = endpt & ~USB_ENDPT_EPSTALL_MASK;\n  }\n\n  if (ie) NVIC_EnableIRQ(USB0_IRQn);\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\nvoid dcd_int_handler(uint8_t rhport)\n{\n  uint32_t is  = KHCI->ISTAT;\n  uint32_t msk = KHCI->INTEN;\n\n  // clear non-enabled interrupts\n  KHCI->ISTAT = is & ~msk;\n  is &= msk;\n\n  if (is & USB_ISTAT_ERROR_MASK) {\n    /* TODO: */\n    uint32_t es = KHCI->ERRSTAT;\n    KHCI->ERRSTAT = es;\n    KHCI->ISTAT   = is; /* discard any pending events */\n  }\n\n  if (is & USB_ISTAT_USBRST_MASK) {\n    KHCI->ISTAT = is; /* discard any pending events */\n    process_bus_reset(rhport);\n  }\n\n  if (is & USB_ISTAT_SLEEP_MASK) {\n    // TU_LOG3(\"Suspend: \"); TU_LOG2_HEX(is);\n\n    // Note Host usually has extra delay after bus reset (without SOF), which could falsely\n    // detected as Sleep event. Though usbd has debouncing logic so we are good\n    KHCI->ISTAT = USB_ISTAT_SLEEP_MASK;\n    process_bus_sleep(rhport);\n  }\n\n#if 0 // ISTAT_RESUME never trigger, probably for host mode ?\n  if (is & USB_ISTAT_RESUME_MASK) {\n    // TU_LOG2(\"ISTAT Resume: \"); TU_LOG2_HEX(is);\n    KHCI->ISTAT = USB_ISTAT_RESUME_MASK;\n    process_bus_resume(rhport);\n  }\n#endif\n\n  if (KHCI->USBTRC0 & USB_USBTRC0_USB_RESUME_INT_MASK) {\n     // TU_LOG2(\"USBTRC0 Resume: \"); TU_LOG2_HEX(is); TU_LOG2_HEX(KHCI->USBTRC0);\n    process_bus_resume(rhport);\n  }\n\n  if (is & USB_ISTAT_SOFTOK_MASK) {\n    KHCI->ISTAT = USB_ISTAT_SOFTOK_MASK;\n    dcd_event_sof(rhport, tu_u16(KHCI->FRMNUMH, KHCI->FRMNUML), true);\n  }\n\n  if (is & USB_ISTAT_STALL_MASK) {\n    KHCI->ISTAT = USB_ISTAT_STALL_MASK;\n    process_stall(rhport);\n  }\n\n  if (is & USB_ISTAT_TOKDNE_MASK) {\n    process_tokdne(rhport);\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/nxp/khci/hcd_khci.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Koji Kitayama\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_CHIPIDEA_FS)\n\n#ifdef TUP_USBIP_CHIPIDEA_FS_KINETIS\n  #include \"fsl_device_registers.h\"\n  #define KHCI        USB0\n#else\n  #error \"MCU is not supported\"\n#endif\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\nenum {\n  TOK_PID_OUT   = 0x1u,\n  TOK_PID_IN    = 0x9u,\n  TOK_PID_SETUP = 0xDu,\n  TOK_PID_DATA0 = 0x3u,\n  TOK_PID_DATA1 = 0xbu,\n  TOK_PID_ACK   = 0x2u,\n  TOK_PID_STALL = 0xeu,\n  TOK_PID_NAK   = 0xau,\n  TOK_PID_BUSTO = 0x0u,\n  TOK_PID_ERR   = 0xfu,\n};\n\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint32_t head;\n    struct {\n      union {\n        struct {\n               uint16_t           :  2;\n          __IO uint16_t tok_pid   :  4;\n               uint16_t data      :  1;\n          __IO uint16_t own       :  1;\n               uint16_t           :  8;\n        };\n        struct {\n               uint16_t           :  2;\n               uint16_t bdt_stall :  1;\n               uint16_t dts       :  1;\n               uint16_t ninc      :  1;\n               uint16_t keep      :  1;\n               uint16_t           : 10;\n        };\n      };\n      __IO uint16_t bc : 10;\n           uint16_t    :  6;\n    };\n  };\n  uint8_t *addr;\n}buffer_descriptor_t;\n\nTU_VERIFY_STATIC( sizeof(buffer_descriptor_t) == 8, \"size is not correct\" );\n\ntypedef struct TU_ATTR_PACKED\n{\n  union {\n    uint32_t state;\n    struct {\n      uint32_t pipenum:16;\n      uint32_t odd    : 1;\n      uint32_t        : 0;\n    };\n  };\n  uint8_t *buffer;\n  uint16_t length;\n  uint16_t remaining;\n} endpoint_state_t;\n\ntypedef struct TU_ATTR_PACKED\n{\n  uint8_t  dev_addr;\n  uint8_t  ep_addr;\n  uint16_t max_packet_size;\n  union {\n    uint8_t flags;\n    struct {\n      uint8_t data : 1;\n      uint8_t xfer : 2;\n      uint8_t      : 0;\n    };\n  };\n  uint8_t *buffer;\n  uint16_t length;\n  uint16_t remaining;\n} pipe_state_t;\n\n\ntypedef struct\n{\n  union {\n    /* [OUT,IN][EVEN,ODD] */\n    buffer_descriptor_t bdt[2][2];\n    uint16_t            bda[2*2];\n  };\n  endpoint_state_t endpoint[2];\n  pipe_state_t pipe[CFG_TUH_ENDPOINT_MAX * 2];\n  uint32_t     in_progress; /* Bitmap. Each bit indicates that a transfer of the corresponding pipe is in progress */\n  uint32_t     pending;     /* Bitmap. Each bit indicates that a transfer of the corresponding pipe will be resume the next frame */\n  bool         need_reset;  /* The device has not been reset after connection. */\n} hcd_data_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\n// BDT(Buffer Descriptor Table) must be 256-byte aligned\nCFG_TUH_MEM_SECTION TU_ATTR_ALIGNED(512) static hcd_data_t _hcd;\n//CFG_TUH_MEM_SECTION TU_ATTR_ALIGNED(4) static uint8_t _rx_buf[1024];\n\nstatic int find_pipe(uint8_t dev_addr, uint8_t ep_addr)\n{\n  /* Find the target pipe */\n  int num;\n  for (num = 0; num < CFG_TUH_ENDPOINT_MAX * 2; ++num) {\n    pipe_state_t *p = &_hcd.pipe[num];\n    if ((p->dev_addr == dev_addr) && (p->ep_addr == ep_addr))\n      return num;\n  }\n  return -1;\n}\n\nstatic int prepare_packets(int pipenum)\n{\n  pipe_state_t *pipe      = &_hcd.pipe[pipenum];\n  unsigned const dir_tx   = tu_edpt_dir(pipe->ep_addr) ? 0 : 1;\n  endpoint_state_t *ep    = &_hcd.endpoint[dir_tx];\n  unsigned const odd      = ep->odd;\n  buffer_descriptor_t *bd = _hcd.bdt[dir_tx];\n  TU_ASSERT(0 == bd[odd].own, -1);\n\n  // TU_LOG1(\"  %p dir %d odd %d data %d\\r\\n\", &bd[odd], dir_tx, odd, pipe->data);\n\n  ep->pipenum = pipenum;\n\n  bd[odd    ].data      = pipe->data;\n  bd[odd ^ 1].data      = pipe->data ^ 1;\n  bd[odd ^ 1].own       = 0;\n  /* reset values for a next transfer */\n\n  int num_tokens = 0; /* The number of prepared packets */\n  unsigned const mps = pipe->max_packet_size;\n  unsigned const rem = pipe->remaining;\n  if (rem > mps) {\n    /* When total_bytes is greater than the max packet size,\n     * it prepares to the next transfer to avoid NAK in advance. */\n    bd[odd ^ 1].bc   = rem >= 2 * mps ? mps: rem - mps;\n    bd[odd ^ 1].addr = pipe->buffer + mps;\n    bd[odd ^ 1].own  = 1;\n    if (dir_tx) ++num_tokens;\n  }\n  bd[odd].bc   = rem >= mps ? mps: rem;\n  bd[odd].addr = pipe->buffer;\n  __DSB();\n  bd[odd].own  = 1; /* This bit must be set last */\n  ++num_tokens;\n  return num_tokens;\n}\n\nstatic int select_next_pipenum(int pipenum)\n{\n  unsigned wip  = _hcd.in_progress & ~_hcd.pending;\n  if (!wip) return -1;\n  unsigned msk  = TU_GENMASK(31, pipenum);\n  int      next = __builtin_ctz(wip & msk);\n  if (next) return next;\n  msk  = TU_GENMASK(pipenum, 0);\n  next = __builtin_ctz(wip & msk);\n  return next;\n}\n\n/* When transfer is completed, return true. */\nstatic bool continue_transfer(int pipenum, buffer_descriptor_t *bd)\n{\n  pipe_state_t *pipe = &_hcd.pipe[pipenum];\n  unsigned const bc  = bd->bc;\n  unsigned const rem = pipe->remaining - bc;\n\n  pipe->remaining = rem;\n  if (rem && bc == pipe->max_packet_size) {\n    int const next_rem = rem - pipe->max_packet_size;\n    if (next_rem > 0) {\n      /* Prepare to the after next transfer */\n      bd->addr += pipe->max_packet_size * 2;\n      bd->bc    = next_rem > pipe->max_packet_size ? pipe->max_packet_size: next_rem;\n      __DSB();\n      bd->own   = 1; /* This bit must be set last */\n      while (KHCI->CTL & USB_CTL_TXSUSPENDTOKENBUSY_MASK) ;\n      KHCI->TOKEN = KHCI->TOKEN; /* Queue the same token as the last */\n    } else if (TUSB_DIR_IN == tu_edpt_dir(pipe->ep_addr)) { /* IN */\n      while (KHCI->CTL & USB_CTL_TXSUSPENDTOKENBUSY_MASK) ;\n      KHCI->TOKEN = KHCI->TOKEN;\n    }\n    return true;\n  }\n  pipe->data = bd->data ^ 1;\n  return false;\n}\n\nstatic bool resume_transfer(int pipenum)\n{\n  int num_tokens = prepare_packets(pipenum);\n  TU_ASSERT(0 <= num_tokens);\n\n  const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);\n  NVIC_DisableIRQ(USB0_IRQn);\n  pipe_state_t *pipe = &_hcd.pipe[pipenum];\n\n  unsigned flags = KHCI->ENDPOINT[0].ENDPT & USB_ENDPT_HOSTWOHUB_MASK;\n  flags |= USB_ENDPT_EPRXEN_MASK | USB_ENDPT_EPTXEN_MASK;\n  switch (pipe->xfer) {\n  case TUSB_XFER_CONTROL:\n    flags |= USB_ENDPT_EPHSHK_MASK;\n    break;\n  case TUSB_XFER_ISOCHRONOUS:\n    flags |= USB_ENDPT_EPCTLDIS_MASK | USB_ENDPT_RETRYDIS_MASK;\n    break;\n  default:\n    flags |= USB_ENDPT_EPHSHK_MASK | USB_ENDPT_EPCTLDIS_MASK | USB_ENDPT_RETRYDIS_MASK;\n    break;\n  }\n  // TU_LOG1(\"  resume pipenum %d flags %x\\r\\n\", pipenum, flags);\n\n  KHCI->ENDPOINT[0].ENDPT = flags;\n  KHCI->ADDR  = (KHCI->ADDR & USB_ADDR_LSEN_MASK) | pipe->dev_addr;\n\n  unsigned const token = tu_edpt_number(pipe->ep_addr) |\n    ((tu_edpt_dir(pipe->ep_addr) ? TOK_PID_IN: TOK_PID_OUT) << USB_TOKEN_TOKENPID_SHIFT);\n  do {\n    while (KHCI->CTL & USB_CTL_TXSUSPENDTOKENBUSY_MASK) ;\n    KHCI->TOKEN = token;\n  } while (--num_tokens);\n  if (ie) NVIC_EnableIRQ(USB0_IRQn);\n  return true;\n}\n\nstatic void suspend_transfer(int pipenum, buffer_descriptor_t *bd)\n{\n  pipe_state_t *pipe = &_hcd.pipe[pipenum];\n  pipe->buffer  = bd->addr;\n  pipe->data    = bd->data ^ 1;\n  if ((TUSB_XFER_INTERRUPT == pipe->xfer) ||\n      (TUSB_XFER_BULK == pipe->xfer)) {\n    _hcd.pending |= TU_BIT(pipenum);\n    KHCI->INTEN |= USB_ISTAT_SOFTOK_MASK;\n  }\n}\n\nstatic void process_tokdne(uint8_t rhport)\n{\n  (void)rhport;\n  const unsigned s = KHCI->STAT;\n  KHCI->ISTAT = USB_ISTAT_TOKDNE_MASK; /* fetch the next token if received */\n  uint8_t const dir_in = (s & USB_STAT_TX_MASK) ? TUSB_DIR_OUT: TUSB_DIR_IN;\n  unsigned const odd   = (s & USB_STAT_ODD_MASK) ? 1 : 0;\n\n  buffer_descriptor_t *bd = (buffer_descriptor_t *)&_hcd.bda[s];\n  endpoint_state_t    *ep = &_hcd.endpoint[s >> 3];\n\n  /* fetch status before discarded by the next steps */\n  const unsigned pid = bd->tok_pid;\n\n  /* reset values for a next transfer */\n  bd->bdt_stall = 0;\n  bd->dts       = 1;\n  bd->ninc      = 0;\n  bd->keep      = 0;\n  /* Update the odd variable to prepare for the next transfer */\n  ep->odd       = odd ^ 1;\n\n  int pipenum = ep->pipenum;\n  int next_pipenum;\n  // TU_LOG1(\"TOKDNE %x PID %x pipe %d\\r\\n\", s, pid, pipenum);\n\n  xfer_result_t result;\n  switch (pid) {\n    default:\n      if (continue_transfer(pipenum, bd))\n        return;\n      result = XFER_RESULT_SUCCESS;\n      break;\n    case TOK_PID_NAK:\n      suspend_transfer(pipenum, bd);\n      next_pipenum = select_next_pipenum(pipenum);\n      if (0 <= next_pipenum)\n        resume_transfer(next_pipenum);\n      return;\n    case TOK_PID_STALL:\n      result = XFER_RESULT_STALLED;\n      break;\n    case TOK_PID_ERR: /* mismatch toggle bit */\n    case TOK_PID_BUSTO:\n      result = XFER_RESULT_FAILED;\n      break;\n  }\n  _hcd.in_progress  &= ~TU_BIT(pipenum);\n  pipe_state_t *pipe = &_hcd.pipe[ep->pipenum];\n  hcd_event_xfer_complete(pipe->dev_addr,\n                          tu_edpt_addr(KHCI->TOKEN & USB_TOKEN_TOKENENDPT_MASK, dir_in),\n                          pipe->length - pipe->remaining,\n                          result, true);\n  next_pipenum = select_next_pipenum(pipenum);\n  if (0 <= next_pipenum)\n    resume_transfer(next_pipenum);\n}\n\nstatic void process_attach(uint8_t rhport)\n{\n  unsigned ctl = KHCI->CTL;\n  if (!(ctl & USB_CTL_JSTATE_MASK)) {\n    /* The attached device is a low speed device. */\n    KHCI->ADDR = USB_ADDR_LSEN_MASK;\n    KHCI->ENDPOINT[0].ENDPT = USB_ENDPT_HOSTWOHUB_MASK;\n  }\n  hcd_event_device_attach(rhport, true);\n}\n\nstatic void process_bus_reset(uint8_t rhport)\n{\n  KHCI->ISTAT    = USB_ISTAT_TOKDNE_MASK;\n  KHCI->USBCTRL &= ~USB_USBCTRL_SUSP_MASK;\n  KHCI->CTL     &= ~USB_CTL_USBENSOFEN_MASK;\n  KHCI->ADDR     = 0;\n  KHCI->ENDPOINT[0].ENDPT = 0;\n\n  hcd_event_device_remove(rhport, true);\n\n  _hcd.in_progress = 0;\n  _hcd.pending     = 0;\n  buffer_descriptor_t *bd = &_hcd.bdt[0][0];\n  for (unsigned i = 0; i < 2; ++i, ++bd) {\n    bd->head = 0;\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* Host API\n *------------------------------------------------------------------*/\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n  KHCI->USBTRC0 |= USB_USBTRC0_USBRESET_MASK;\n  while (KHCI->USBTRC0 & USB_USBTRC0_USBRESET_MASK);\n\n  tu_memclr(&_hcd, sizeof(_hcd));\n  KHCI->USBTRC0 |= TU_BIT(6); /* software must set this bit to 1 */\n  KHCI->BDTPAGE1 = (uint8_t)((uintptr_t)_hcd.bdt >>  8);\n  KHCI->BDTPAGE2 = (uint8_t)((uintptr_t)_hcd.bdt >> 16);\n  KHCI->BDTPAGE3 = (uint8_t)((uintptr_t)_hcd.bdt >> 24);\n\n  KHCI->USBCTRL &= ~USB_USBCTRL_SUSP_MASK;\n  KHCI->CTL     |= USB_CTL_ODDRST_MASK;\n  for (unsigned i = 0; i < 16; ++i) {\n    KHCI->ENDPOINT[i].ENDPT = 0;\n  }\n  KHCI->CTL &= ~USB_CTL_ODDRST_MASK;\n\n  KHCI->SOFTHLD = 74; /* for 64-byte packets */\n  // KHCI->SOFTHLD = 144; /* for low speed 8-byte packets */\n  KHCI->CTL     = USB_CTL_HOSTMODEEN_MASK | USB_CTL_SE0_MASK;\n  KHCI->USBCTRL = USB_USBCTRL_PDE_MASK;\n\n  NVIC_ClearPendingIRQ(USB0_IRQn);\n  KHCI->INTEN = USB_INTEN_ATTACHEN_MASK | USB_INTEN_TOKDNEEN_MASK |\n    USB_INTEN_USBRSTEN_MASK | USB_INTEN_ERROREN_MASK | USB_INTEN_STALLEN_MASK;\n  KHCI->ERREN = 0xff;\n\n  return true;\n}\n\nvoid hcd_int_enable(uint8_t rhport)\n{\n  (void)rhport;\n  NVIC_EnableIRQ(USB0_IRQn);\n}\n\nvoid hcd_int_disable(uint8_t rhport)\n{\n  (void)rhport;\n  NVIC_DisableIRQ(USB0_IRQn);\n}\n\nuint32_t hcd_frame_number(uint8_t rhport)\n{\n  (void)rhport;\n  /* The device must be reset at least once after connection\n   * in order to start the frame counter. */\n  if (_hcd.need_reset) hcd_port_reset(rhport);\n  uint32_t frmnum = KHCI->FRMNUML;\n  frmnum |= KHCI->FRMNUMH << 8u;\n   return frmnum;\n}\n\n/*--------------------------------------------------------------------+\n * Port API\n *--------------------------------------------------------------------+ */\nbool hcd_port_connect_status(uint8_t rhport)\n{\n  (void)rhport;\n  if (KHCI->ISTAT & USB_ISTAT_ATTACH_MASK)\n    return true;\n  return false;\n}\n\nvoid hcd_port_reset(uint8_t rhport)\n{\n  (void)rhport;\n  KHCI->CTL &= ~USB_CTL_USBENSOFEN_MASK;\n  KHCI->CTL |= USB_CTL_RESET_MASK;\n  unsigned cnt = SystemCoreClock / 100;\n  while (cnt--) __NOP();\n  KHCI->CTL &= ~USB_CTL_RESET_MASK;\n  KHCI->CTL |= USB_CTL_USBENSOFEN_MASK;\n  _hcd.need_reset = false;\n}\n\nvoid hcd_port_reset_end(uint8_t rhport) {\n  (void) rhport;\n}\n\ntusb_speed_t hcd_port_speed_get(uint8_t rhport)\n{\n  (void)rhport;\n  tusb_speed_t speed = TUSB_SPEED_FULL;\n  const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);\n  NVIC_DisableIRQ(USB0_IRQn);\n  if (KHCI->ADDR & USB_ADDR_LSEN_MASK)\n    speed = TUSB_SPEED_LOW;\n  if (ie) NVIC_EnableIRQ(USB0_IRQn);\n  return speed;\n}\n\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr)\n{\n  (void)rhport;\n  const unsigned ie = NVIC_GetEnableIRQ(USB0_IRQn);\n  NVIC_DisableIRQ(USB0_IRQn);\n  pipe_state_t *p   = &_hcd.pipe[0];\n  pipe_state_t *end = &_hcd.pipe[CFG_TUH_ENDPOINT_MAX * 2];\n  for (;p != end; ++p) {\n    if (p->dev_addr == dev_addr)\n      tu_memclr(p, sizeof(*p));\n  }\n  if (ie) NVIC_EnableIRQ(USB0_IRQn);\n}\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8])\n{\n  (void)rhport;\n  // TU_LOG1(\"SETUP %u\\r\\n\", dev_addr);\n  TU_ASSERT(0 == (_hcd.in_progress & TU_BIT(0)));\n\n  int pipenum = find_pipe(dev_addr, 0);\n  if (pipenum < 0) return false;\n\n  pipe_state_t *pipe = &_hcd.pipe[pipenum];\n  pipe[0].data       = 0;\n  pipe[0].buffer     = (uint8_t*)(uintptr_t)setup_packet;\n  pipe[0].length     = 8;\n  pipe[0].remaining  = 8;\n  pipe[1].data       = 1;\n\n  if (1 != prepare_packets(pipenum))\n    return false;\n\n  _hcd.in_progress |= TU_BIT(pipenum);\n\n  unsigned hostwohub = KHCI->ENDPOINT[0].ENDPT & USB_ENDPT_HOSTWOHUB_MASK;\n  KHCI->ENDPOINT[0].ENDPT = hostwohub |\n    USB_ENDPT_EPHSHK_MASK | USB_ENDPT_EPRXEN_MASK | USB_ENDPT_EPTXEN_MASK;\n  KHCI->ADDR  = (KHCI->ADDR & USB_ADDR_LSEN_MASK) | dev_addr;\n  while (KHCI->CTL & USB_CTL_TXSUSPENDTOKENBUSY_MASK) ;\n  KHCI->TOKEN = (TOK_PID_SETUP << USB_TOKEN_TOKENPID_SHIFT);\n  return true;\n}\n\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const * ep_desc)\n{\n  (void)rhport;\n  uint8_t const ep_addr = ep_desc->bEndpointAddress;\n  // TU_LOG1(\"O %u %x\\r\\n\", dev_addr, ep_addr);\n  /* Find a free pipe */\n  pipe_state_t *p = &_hcd.pipe[0];\n  pipe_state_t *end = &_hcd.pipe[CFG_TUH_ENDPOINT_MAX * 2];\n  if (dev_addr || ep_addr) {\n    p += 2;\n    for (; p < end && (p->dev_addr || p->ep_addr); ++p) ;\n    if (p == end) return false;\n  }\n  p->dev_addr        = dev_addr;\n  p->ep_addr         = ep_addr;\n  p->max_packet_size = ep_desc->wMaxPacketSize;\n  p->xfer            = ep_desc->bmAttributes.xfer;\n  p->data            = 0;\n  if (!ep_addr) {\n    /* Open one more pipe for Control IN transfer */\n    TU_ASSERT(TUSB_XFER_CONTROL == p->xfer);\n    pipe_state_t *q = p + 1;\n    TU_ASSERT(!q->dev_addr && !q->ep_addr);\n    q->dev_addr        = dev_addr;\n    q->ep_addr         = tu_edpt_addr(0, TUSB_DIR_IN);\n    q->max_packet_size = ep_desc->wMaxPacketSize;\n    q->xfer            = ep_desc->bmAttributes.xfer;\n    q->data            = 1;\n  }\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  (void) rhport; (void) daddr; (void) ep_addr;\n  return false; // TODO not implemented yet\n}\n\n/* The address of buffer must be aligned to 4 byte boundary. And it must be at least 4 bytes long.\n * DMA writes data in 4 byte unit */\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t buflen)\n{\n  (void)rhport;\n  // TU_LOG1(\"X %u %x %x %d\\r\\n\", dev_addr, ep_addr, (uintptr_t)buffer, buflen);\n\n  int pipenum = find_pipe(dev_addr, ep_addr);\n  TU_ASSERT(0 <= pipenum);\n\n  TU_ASSERT(0 == (_hcd.in_progress & TU_BIT(pipenum)));\n  unsigned const ie  = NVIC_GetEnableIRQ(USB0_IRQn);\n  NVIC_DisableIRQ(USB0_IRQn);\n  pipe_state_t *pipe = &_hcd.pipe[pipenum];\n  pipe->buffer       = buffer;\n  pipe->length       = buflen;\n  pipe->remaining    = buflen;\n  _hcd.in_progress  |= TU_BIT(pipenum);\n  _hcd.pending      |= TU_BIT(pipenum); /* Send at the next Frame */\n  KHCI->INTEN |= USB_ISTAT_SOFTOK_MASK;\n  if (ie) NVIC_EnableIRQ(USB0_IRQn);\n  return true;\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n  // TODO not implemented yet\n  return false;\n}\n\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  if (!tu_edpt_number(ep_addr)) return true;\n  int num = find_pipe(dev_addr, ep_addr);\n  if (num < 0) return false;\n  pipe_state_t *p = &_hcd.pipe[num];\n  p->data = 0; /* Reset data toggle */\n  return true;\n}\n\n/*--------------------------------------------------------------------+\n * ISR\n *--------------------------------------------------------------------+*/\nvoid hcd_int_handler(uint8_t rhport, bool in_isr)\n{\n  (void) in_isr;\n  uint32_t is  = KHCI->ISTAT;\n  uint32_t msk = KHCI->INTEN;\n\n  // TU_LOG1(\"S %lx\\r\\n\", is);\n\n  /* clear disabled interrupts */\n  KHCI->ISTAT = (is & ~msk & ~USB_ISTAT_TOKDNE_MASK) | USB_ISTAT_SOFTOK_MASK;\n  is &= msk;\n\n  if (is & USB_ISTAT_ERROR_MASK) {\n    unsigned err = KHCI->ERRSTAT;\n    if (err) {\n      TU_LOG1(\" ERR %x\\r\\n\", err);\n      KHCI->ERRSTAT = err;\n    } else {\n      KHCI->INTEN &= ~USB_ISTAT_ERROR_MASK;\n    }\n  }\n\n  if (is & USB_ISTAT_USBRST_MASK) {\n    KHCI->INTEN = (msk & ~USB_INTEN_USBRSTEN_MASK) | USB_INTEN_ATTACHEN_MASK;\n    process_bus_reset(rhport);\n    return;\n  }\n  if (is & USB_ISTAT_ATTACH_MASK) {\n    KHCI->INTEN = (msk & ~USB_INTEN_ATTACHEN_MASK) | USB_INTEN_USBRSTEN_MASK;\n    _hcd.need_reset = true;\n    process_attach(rhport);\n    return;\n  }\n  if (is & USB_ISTAT_STALL_MASK) {\n    KHCI->ISTAT = USB_ISTAT_STALL_MASK;\n  }\n  if (is & USB_ISTAT_SOFTOK_MASK) {\n    msk &= ~USB_ISTAT_SOFTOK_MASK;\n    KHCI->INTEN = msk;\n    if (_hcd.pending) {\n      int pipenum = __builtin_ctz(_hcd.pending);\n      _hcd.pending = 0;\n      if (!(is & USB_ISTAT_TOKDNE_MASK))\n        resume_transfer(pipenum);\n    }\n  }\n  if (is & USB_ISTAT_TOKDNE_MASK) {\n    process_tokdne(rhport);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/nxp/lpc17_40/dcd_lpc17_40.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && \\\n    (CFG_TUSB_MCU == OPT_MCU_LPC175X_6X || CFG_TUSB_MCU == OPT_MCU_LPC177X_8X || CFG_TUSB_MCU == OPT_MCU_LPC40XX)\n\n#include \"device/dcd.h\"\n#include \"dcd_lpc17_40.h\"\n#include \"chip.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n#define DCD_ENDPOINT_MAX 32\n\ntypedef struct TU_ATTR_ALIGNED(4)\n{\n  //------------- Word 0 -------------//\n  uint32_t next;\n\n  //------------- Word 1 -------------//\n  uint16_t atle_mode       : 2; // 00: normal, 01: ATLE (auto length extraction)\n  uint16_t next_valid      : 1;\n  uint16_t                 : 1; ///< reserved\n  uint16_t isochronous     : 1; // is an iso endpoint\n  uint16_t max_packet_size : 11;\n\n  volatile uint16_t buflen; // bytes for non-iso, number of packets for iso endpoint\n\n  //------------- Word 2 -------------//\n  volatile uint32_t buffer;\n\n  //------------- Word 3 -------------//\n  volatile uint16_t retired                : 1; // initialized to zero\n  volatile uint16_t status                 : 4;\n  volatile uint16_t iso_last_packet_valid  : 1;\n  volatile uint16_t atle_lsb_extracted     : 1;\t// used in ATLE mode\n  volatile uint16_t atle_msb_extracted     : 1;\t// used in ATLE mode\n  volatile uint16_t atle_mess_len_position : 6; // used in ATLE mode\n  uint16_t                                 : 2;\n\n  volatile uint16_t present_count;  // For non-iso : The number of bytes transferred by the DMA engine\n                                    // For iso : number of packets\n\n  //------------- Word 4 -------------//\n  //\tuint32_t iso_packet_size_addr;\t\t// iso only, can be omitted for non-iso\n}dma_desc_t;\n\nTU_VERIFY_STATIC( sizeof(dma_desc_t) == 16, \"size is not correct\"); // TODO not support ISO for now\n\ntypedef struct\n{\n  // must be 128 byte aligned\n  volatile dma_desc_t* udca[DCD_ENDPOINT_MAX];\n\n  // TODO DMA does not support control transfer (0-1 are not used, offset to reduce memory)\n  dma_desc_t dd[DCD_ENDPOINT_MAX];\n\n  struct\n  {\n    uint8_t* out_buffer;\n    uint8_t  out_bytes;\n    volatile bool out_received; // indicate if data is already received in endpoint\n\n    uint8_t  in_bytes;\n  } control;\n\n} dcd_data_t;\n\nCFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(128) static dcd_data_t _dcd;\n\n\n//--------------------------------------------------------------------+\n// SIE Command\n//--------------------------------------------------------------------+\nstatic void sie_cmd_code (sie_cmdphase_t phase, uint8_t code_data)\n{\n  LPC_USB->DevIntClr = (DEV_INT_COMMAND_CODE_EMPTY_MASK | DEV_INT_COMMAND_DATA_FULL_MASK);\n  LPC_USB->CmdCode   = (phase << 8) | (code_data << 16);\n\n  uint32_t const wait_flag = (phase == SIE_CMDPHASE_READ) ? DEV_INT_COMMAND_DATA_FULL_MASK : DEV_INT_COMMAND_CODE_EMPTY_MASK;\n  while ((LPC_USB->DevIntSt & wait_flag) == 0) {}\n\n  LPC_USB->DevIntClr = wait_flag;\n}\n\nstatic void sie_write (uint8_t cmd_code, uint8_t data_len, uint8_t data)\n{\n  sie_cmd_code(SIE_CMDPHASE_COMMAND, cmd_code);\n\n  if (data_len)\n  {\n    sie_cmd_code(SIE_CMDPHASE_WRITE, data);\n  }\n}\n\nstatic uint8_t sie_read (uint8_t cmd_code)\n{\n  sie_cmd_code(SIE_CMDPHASE_COMMAND , cmd_code);\n  sie_cmd_code(SIE_CMDPHASE_READ    , cmd_code);\n  return (uint8_t) LPC_USB->CmdData;\n}\n\n//--------------------------------------------------------------------+\n// PIPE HELPER\n//--------------------------------------------------------------------+\nstatic inline uint8_t ep_addr2idx(uint8_t ep_addr)\n{\n  return 2*(ep_addr & 0x0F) + ((ep_addr & TUSB_DIR_IN_MASK) ? 1 : 0);\n}\n\nstatic void set_ep_size(uint8_t ep_id, uint16_t max_packet_size)\n{\n  // follows example in 11.10.4.2\n  LPC_USB->ReEp    |= TU_BIT(ep_id);\n  LPC_USB->EpInd    = ep_id; // select index before setting packet size\n  LPC_USB->MaxPSize = max_packet_size;\n\n  while ((LPC_USB->DevIntSt & DEV_INT_ENDPOINT_REALIZED_MASK) == 0) {}\n  LPC_USB->DevIntClr = DEV_INT_ENDPOINT_REALIZED_MASK;\n}\n\n\n//--------------------------------------------------------------------+\n// CONTROLLER API\n//--------------------------------------------------------------------+\nstatic void bus_reset(void)\n{\n  // step 7 : slave mode set up\n  LPC_USB->EpIntClr     = 0xFFFFFFFF; // clear all pending interrupt\n  LPC_USB->DevIntClr    = 0xFFFFFFFF; // clear all pending interrupt\n  LPC_USB->EpIntEn      = 0x03UL;     // control endpoint cannot use DMA, non-control all use DMA\n  LPC_USB->EpIntPri     = 0x03UL;     // fast for control endpoint\n\n  // step 8 : DMA set up\n  LPC_USB->EpDMADis     = 0xFFFFFFFF; // firstly disable all dma\n  LPC_USB->DMARClr      = 0xFFFFFFFF; // clear all pending interrupt\n  LPC_USB->EoTIntClr    = 0xFFFFFFFF;\n  LPC_USB->NDDRIntClr   = 0xFFFFFFFF;\n  LPC_USB->SysErrIntClr = 0xFFFFFFFF;\n\n  tu_memclr(&_dcd, sizeof(dcd_data_t));\n}\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  //------------- user manual 11.13 usb device controller initialization -------------//\n  // step 6 : set up control endpoint\n  set_ep_size(0, CFG_TUD_ENDPOINT0_SIZE);\n  set_ep_size(1, CFG_TUD_ENDPOINT0_SIZE);\n\n  bus_reset();\n\n  LPC_USB->DevIntEn = (DEV_INT_DEVICE_STATUS_MASK | DEV_INT_ENDPOINT_FAST_MASK | DEV_INT_ENDPOINT_SLOW_MASK | DEV_INT_ERROR_MASK);\n  LPC_USB->UDCAH = (uint32_t) _dcd.udca;\n  LPC_USB->DMAIntEn = (DMA_INT_END_OF_XFER_MASK /*| DMA_INT_NEW_DD_REQUEST_MASK*/ | DMA_INT_ERROR_MASK);\n\n  dcd_connect(rhport);\n\n  // Clear pending IRQ\n  NVIC_ClearPendingIRQ(USB_IRQn);\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_EnableIRQ(USB_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n  NVIC_DisableIRQ(USB_IRQn);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  // Response with status first before changing device address\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n\n  sie_write(SIE_CMDCODE_SET_ADDRESS, 1, 0x80 | dev_addr); // 7th bit is : device_enable\n\n  // Also Set Configure Device to enable non-control endpoint response\n  sie_write(SIE_CMDCODE_CONFIGURE_DEVICE, 1, 1);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n  sie_write(SIE_CMDCODE_DEVICE_STATUS, 1, SIE_DEV_STATUS_CONNECT_STATUS_MASK);\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  sie_write(SIE_CMDCODE_DEVICE_STATUS, 1, 0);\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// CONTROL HELPER\n//--------------------------------------------------------------------+\nstatic inline uint8_t byte2dword(uint8_t bytes)\n{\n  return (bytes + 3) / 4; // length in dwords\n}\n\nstatic void control_ep_write(void const * buffer, uint8_t len)\n{\n  uint32_t const * buf32 = (uint32_t const *) buffer;\n\n  LPC_USB->Ctrl   = USBCTRL_WRITE_ENABLE_MASK; // logical endpoint = 0\n  LPC_USB->TxPLen = (uint32_t) len;\n\n  for (uint8_t count = 0; count < byte2dword(len); count++)\n  {\n    LPC_USB->TxData = *buf32; // NOTE: cortex M3 have no problem with alignment\n    buf32++;\n  }\n\n  LPC_USB->Ctrl = 0;\n\n  // select control IN & validate the endpoint\n  sie_write(SIE_CMDCODE_ENDPOINT_SELECT+1, 0, 0);\n  sie_write(SIE_CMDCODE_BUFFER_VALIDATE  , 0, 0);\n}\n\nstatic uint8_t control_ep_read(void * buffer, uint8_t len)\n{\n  LPC_USB->Ctrl = USBCTRL_READ_ENABLE_MASK; // logical endpoint = 0\n  while ((LPC_USB->RxPLen & USBRXPLEN_PACKET_READY_MASK) == 0) {} // TODO blocking, should have timeout\n\n  len = tu_min8(len, (uint8_t) (LPC_USB->RxPLen & USBRXPLEN_PACKET_LENGTH_MASK) );\n  uint32_t *buf32 = (uint32_t*) buffer;\n\n  for (uint8_t count=0; count < byte2dword(len); count++)\n  {\n    *buf32 = LPC_USB->RxData;\n    buf32++;\n  }\n\n  LPC_USB->Ctrl = 0;\n\n  // select control OUT & clear the endpoint\n  sie_write(SIE_CMDCODE_ENDPOINT_SELECT+0, 0, 0);\n  sie_write(SIE_CMDCODE_BUFFER_CLEAR     , 0, 0);\n\n  return len;\n}\n\n//--------------------------------------------------------------------+\n// DCD Endpoint Port\n//--------------------------------------------------------------------+\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(p_endpoint_desc->bEndpointAddress);\n  uint8_t const ep_id = ep_addr2idx(p_endpoint_desc->bEndpointAddress);\n\n  // Endpoint type is fixed to endpoint number\n  // 1: interrupt, 2: Bulk, 3: Iso and so on\n  switch ( p_endpoint_desc->bmAttributes.xfer )\n  {\n    case TUSB_XFER_INTERRUPT:\n      TU_ASSERT((epnum % 3) == 1);\n      break;\n\n    case TUSB_XFER_BULK:\n      TU_ASSERT((epnum % 3) == 2 || (epnum == 15));\n      break;\n\n    case TUSB_XFER_ISOCHRONOUS:\n      TU_ASSERT((epnum % 3) == 0 && (epnum != 0) && (epnum != 15));\n      break;\n\n    default:\n      break;\n  }\n\n  //------------- Realize Endpoint with Max Packet Size -------------//\n  const uint16_t ep_size = tu_edpt_packet_size(p_endpoint_desc);\n  set_ep_size(ep_id, ep_size);\n\n  //------------- first DD prepare -------------//\n  dma_desc_t* const dd = &_dcd.dd[ep_id];\n  tu_memclr(dd, sizeof(dma_desc_t));\n\n  dd->isochronous = (p_endpoint_desc->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS) ? 1 : 0;\n  dd->max_packet_size = ep_size;\n  dd->retired = 1; // invalid at first\n\n  sie_write(SIE_CMDCODE_ENDPOINT_SET_STATUS + ep_id, 1, 0);    // clear all endpoint status\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  if ( tu_edpt_number(ep_addr) == 0 )\n  {\n    sie_write(SIE_CMDCODE_ENDPOINT_SET_STATUS+0, 1, SIE_SET_ENDPOINT_STALLED_MASK | SIE_SET_ENDPOINT_CONDITION_STALLED_MASK);\n  }else\n  {\n    uint8_t ep_id = ep_addr2idx( ep_addr );\n    sie_write(SIE_CMDCODE_ENDPOINT_SET_STATUS+ep_id, 1, SIE_SET_ENDPOINT_STALLED_MASK);\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  uint8_t ep_id = ep_addr2idx(ep_addr);\n\n  sie_write(SIE_CMDCODE_ENDPOINT_SET_STATUS+ep_id, 1, 0);\n}\n\nstatic bool control_xact(uint8_t rhport, uint8_t dir, uint8_t * buffer, uint8_t len)\n{\n  (void) rhport;\n\n  if ( dir )\n  {\n    _dcd.control.in_bytes = len;\n    control_ep_write(buffer, len);\n  }else\n  {\n    if ( _dcd.control.out_received )\n    {\n      // Already received the DATA OUT packet\n      _dcd.control.out_received = false;\n      _dcd.control.out_buffer = NULL;\n      _dcd.control.out_bytes  = 0;\n\n      uint8_t received = control_ep_read(buffer, len);\n      dcd_event_xfer_complete(0, 0, received, XFER_RESULT_SUCCESS, true);\n    }else\n    {\n      _dcd.control.out_buffer = buffer;\n      _dcd.control.out_bytes  = len;\n    }\n  }\n\n  return true;\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  // Control transfer is not DMA support, and must be done in slave mode\n  if ( tu_edpt_number(ep_addr) == 0 )\n  {\n    return control_xact(rhport, tu_edpt_dir(ep_addr), buffer, (uint8_t) total_bytes);\n  }\n  else\n  {\n    uint8_t ep_id = ep_addr2idx(ep_addr);\n    dma_desc_t* dd = &_dcd.dd[ep_id];\n\n    // Prepare DMA descriptor\n    // Isochronous & max packet size must be preserved, Other fields of dd should be clear\n    uint16_t const ep_size = dd->max_packet_size;\n    uint8_t  is_iso = dd->isochronous;\n\n    tu_memclr(dd, sizeof(dma_desc_t));\n    dd->isochronous = is_iso;\n    dd->max_packet_size = ep_size;\n    dd->buffer = (uint32_t) buffer;\n    dd->buflen = total_bytes;\n\n    _dcd.udca[ep_id] = dd;\n\n    if ( ep_id % 2 )\n    {\n      // Clear EP interrupt before Enable DMA\n      LPC_USB->EpIntEn &= ~TU_BIT(ep_id);\n      LPC_USB->EpDMAEn = TU_BIT(ep_id);\n\n      // endpoint IN need to actively raise DMA request\n      LPC_USB->DMARSet = TU_BIT(ep_id);\n    }else\n    {\n      // Enable DMA\n      LPC_USB->EpDMAEn = TU_BIT(ep_id);\n    }\n\n    return true;\n  }\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\n\n// handle control xfer (slave mode)\nstatic void control_xfer_isr(uint8_t rhport, uint32_t ep_int_status)\n{\n  // Control out complete\n  if ( ep_int_status & TU_BIT(0) )\n  {\n    bool is_setup = sie_read(SIE_CMDCODE_ENDPOINT_SELECT+0) & SIE_SELECT_ENDPOINT_SETUP_RECEIVED_MASK;\n\n    LPC_USB->EpIntClr = TU_BIT(0);\n\n    if (is_setup)\n    {\n      uint8_t setup_packet[8];\n      control_ep_read(setup_packet, 8); // TODO read before clear setup above\n\n      dcd_event_setup_received(rhport, setup_packet, true);\n    }\n    else if ( _dcd.control.out_buffer )\n    {\n      // software queued transfer previously\n      uint8_t received = control_ep_read(_dcd.control.out_buffer, _dcd.control.out_bytes);\n\n      _dcd.control.out_buffer = NULL;\n      _dcd.control.out_bytes = 0;\n\n      dcd_event_xfer_complete(rhport, 0, received, XFER_RESULT_SUCCESS, true);\n    }else\n    {\n      // hardware auto ack packet -> mark as received\n      _dcd.control.out_received = true;\n    }\n  }\n\n  // Control In complete\n  if ( ep_int_status & TU_BIT(1) )\n  {\n    LPC_USB->EpIntClr = TU_BIT(1);\n    dcd_event_xfer_complete(rhport, TUSB_DIR_IN_MASK, _dcd.control.in_bytes, XFER_RESULT_SUCCESS, true);\n  }\n}\n\n// handle bus event signal\nstatic void bus_event_isr(uint8_t rhport)\n{\n  uint8_t const dev_status = sie_read(SIE_CMDCODE_DEVICE_STATUS);\n  if (dev_status & SIE_DEV_STATUS_RESET_MASK)\n  {\n    bus_reset();\n    dcd_event_bus_reset(rhport, TUSB_SPEED_FULL, true);\n  }\n\n  if (dev_status & SIE_DEV_STATUS_CONNECT_CHANGE_MASK)\n  {\n    // device is disconnected, require using VBUS (P1_30)\n    dcd_event_bus_signal(rhport, DCD_EVENT_UNPLUGGED, true);\n  }\n\n  if (dev_status & SIE_DEV_STATUS_SUSPEND_CHANGE_MASK)\n  {\n    if (dev_status & SIE_DEV_STATUS_SUSPEND_MASK)\n    {\n      dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n    }\n    else\n    {\n      dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n    }\n  }\n}\n\n// Helper to complete a DMA descriptor for non-control transfer\nstatic void dd_complete_isr(uint8_t rhport, uint8_t ep_id)\n{\n  dma_desc_t* const dd = &_dcd.dd[ep_id];\n  uint8_t result = (dd->status == DD_STATUS_NORMAL || dd->status == DD_STATUS_DATA_UNDERUN) ? XFER_RESULT_SUCCESS : XFER_RESULT_FAILED;\n  uint8_t const ep_addr = (ep_id / 2) | ((ep_id & 0x01) ? TUSB_DIR_IN_MASK : 0);\n\n  dcd_event_xfer_complete(rhport, ep_addr, dd->present_count, result, true);\n}\n\n// main USB IRQ handler\nvoid dcd_int_handler(uint8_t rhport)\n{\n  uint32_t const dev_int_status = LPC_USB->DevIntSt & LPC_USB->DevIntEn;\n  LPC_USB->DevIntClr = dev_int_status;// Acknowledge handled interrupt\n\n  // Bus event\n  if (dev_int_status & DEV_INT_DEVICE_STATUS_MASK)\n  {\n    bus_event_isr(rhport);\n  }\n\n  // Endpoint interrupt\n  uint32_t const ep_int_status = LPC_USB->EpIntSt & LPC_USB->EpIntEn;\n\n  // Control Endpoint are fast\n  if (dev_int_status & DEV_INT_ENDPOINT_FAST_MASK)\n  {\n    // Note clear USBEpIntClr will also clear the setup received bit --> clear after handle setup packet\n    // Only clear USBEpIntClr 1 endpoint each, and should wait for CDFULL bit set\n    control_xfer_isr(rhport, ep_int_status);\n  }\n\n  // non-control IN are slow\n  if (dev_int_status & DEV_INT_ENDPOINT_SLOW_MASK)\n  {\n    for ( uint8_t ep_id = 3; ep_id < DCD_ENDPOINT_MAX; ep_id += 2 )\n    {\n      if ( tu_bit_test(ep_int_status, ep_id) )\n      {\n        LPC_USB->EpIntClr = TU_BIT(ep_id);\n\n        // Clear Ep interrupt for next DMA\n        LPC_USB->EpIntEn &= ~TU_BIT(ep_id);\n\n        dd_complete_isr(rhport, ep_id);\n      }\n    }\n  }\n\n  // DMA transfer complete (RAM <-> EP) for Non-Control\n  // OUT: USB transfer is fully complete\n  // IN : UBS transfer is still on-going -> enable EpIntEn to know when it is complete\n  uint32_t const dma_int_status = LPC_USB->DMAIntSt & LPC_USB->DMAIntEn;\n  if (dma_int_status & DMA_INT_END_OF_XFER_MASK)\n  {\n    uint32_t const eot = LPC_USB->EoTIntSt;\n    LPC_USB->EoTIntClr = eot; // acknowledge interrupt source\n\n    for ( uint8_t ep_id = 2; ep_id < DCD_ENDPOINT_MAX; ep_id++ )\n    {\n      if ( tu_bit_test(eot, ep_id) )\n      {\n        if ( ep_id & 0x01 )\n        {\n          // IN enable EpInt for end of usb transfer\n          LPC_USB->EpIntEn |= TU_BIT(ep_id);\n        }else\n        {\n          // OUT\n          dd_complete_isr(rhport, ep_id);\n        }\n      }\n    }\n  }\n\n  // Errors\n  if ( (dev_int_status & DEV_INT_ERROR_MASK) || (dma_int_status & DMA_INT_ERROR_MASK) )\n  {\n    uint32_t error_status = sie_read(SIE_CMDCODE_READ_ERROR_STATUS);\n    (void) error_status;\n    TU_BREAKPOINT();\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/nxp/lpc17_40/dcd_lpc17_40.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DCD_LPC17_40_H_\n#define TUSB_DCD_LPC17_40_H_\n\n#include \"common/tusb_common.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Register Interface\n//--------------------------------------------------------------------+\n\n//------------- USB Interrupt USBIntSt -------------//\n//enum {\n//  DCD_USB_REQ_LOW_PRIO_MASK   = TU_BIT(0),\n//  DCD_USB_REQ_HIGH_PRIO_MASK  = TU_BIT(1),\n//  DCD_USB_REQ_DMA_MASK        = TU_BIT(2),\n//  DCD_USB_REQ_NEED_CLOCK_MASK = TU_BIT(8),\n//  DCD_USB_REQ_ENABLE_MASK     = TU_BIT(31)\n//};\n\n//------------- Device Interrupt USBDevInt -------------//\nenum {\n  DEV_INT_FRAME_MASK              = TU_BIT(0),\n  DEV_INT_ENDPOINT_FAST_MASK      = TU_BIT(1),\n  DEV_INT_ENDPOINT_SLOW_MASK      = TU_BIT(2),\n  DEV_INT_DEVICE_STATUS_MASK      = TU_BIT(3),\n  DEV_INT_COMMAND_CODE_EMPTY_MASK = TU_BIT(4),\n  DEV_INT_COMMAND_DATA_FULL_MASK  = TU_BIT(5),\n  DEV_INT_RX_ENDPOINT_PACKET_MASK = TU_BIT(6),\n  DEV_INT_TX_ENDPOINT_PACKET_MASK = TU_BIT(7),\n  DEV_INT_ENDPOINT_REALIZED_MASK  = TU_BIT(8),\n  DEV_INT_ERROR_MASK              = TU_BIT(9)\n};\n\n//------------- DMA Interrupt USBDMAInt-------------//\nenum {\n  DMA_INT_END_OF_XFER_MASK    = TU_BIT(0),\n  DMA_INT_NEW_DD_REQUEST_MASK = TU_BIT(1),\n  DMA_INT_ERROR_MASK          = TU_BIT(2)\n};\n\n//------------- USBCtrl -------------//\nenum {\n  USBCTRL_READ_ENABLE_MASK  = TU_BIT(0),\n  USBCTRL_WRITE_ENABLE_MASK = TU_BIT(1),\n};\n\n//------------- USBRxPLen -------------//\nenum {\n  USBRXPLEN_PACKET_LENGTH_MASK = (TU_BIT(10)-1),\n  USBRXPLEN_DATA_VALID_MASK    = TU_BIT(10),\n  USBRXPLEN_PACKET_READY_MASK  = TU_BIT(11),\n};\n\n//------------- SIE Command Code -------------//\ntypedef enum\n{\n  SIE_CMDPHASE_WRITE   = 1,\n  SIE_CMDPHASE_READ    = 2,\n  SIE_CMDPHASE_COMMAND = 5\n} sie_cmdphase_t;\n\nenum {\n  // device commands\n  SIE_CMDCODE_SET_ADDRESS                     = 0xd0,\n  SIE_CMDCODE_CONFIGURE_DEVICE                = 0xd8,\n  SIE_CMDCODE_SET_MODE                        = 0xf3,\n  SIE_CMDCODE_READ_FRAME_NUMBER               = 0xf5,\n  SIE_CMDCODE_READ_TEST_REGISTER              = 0xfd,\n  SIE_CMDCODE_DEVICE_STATUS                   = 0xfe,\n  SIE_CMDCODE_GET_ERROR                       = 0xff,\n  SIE_CMDCODE_READ_ERROR_STATUS               = 0xfb,\n\n  // endpoint commands\n  SIE_CMDCODE_ENDPOINT_SELECT                 = 0x00, // + endpoint index\n  SIE_CMDCODE_ENDPOINT_SELECT_CLEAR_INTERRUPT = 0x40, // + endpoint index, should use USBEpIntClr instead\n  SIE_CMDCODE_ENDPOINT_SET_STATUS             = 0x40, // + endpoint index\n  SIE_CMDCODE_BUFFER_CLEAR                    = 0xf2,\n  SIE_CMDCODE_BUFFER_VALIDATE                 = 0xfa\n};\n\n//------------- SIE Device Status (get/set from SIE_CMDCODE_DEVICE_STATUS) -------------//\nenum {\n  SIE_DEV_STATUS_CONNECT_STATUS_MASK = TU_BIT(0),\n  SIE_DEV_STATUS_CONNECT_CHANGE_MASK = TU_BIT(1),\n  SIE_DEV_STATUS_SUSPEND_MASK        = TU_BIT(2),\n  SIE_DEV_STATUS_SUSPEND_CHANGE_MASK = TU_BIT(3),\n  SIE_DEV_STATUS_RESET_MASK          = TU_BIT(4)\n};\n\n//------------- SIE Select Endpoint Command -------------//\nenum {\n  SIE_SELECT_ENDPOINT_FULL_EMPTY_MASK         = TU_BIT(0), // 0: empty, 1 full. IN endpoint checks empty, OUT endpoint check full\n  SIE_SELECT_ENDPOINT_STALL_MASK              = TU_BIT(1),\n  SIE_SELECT_ENDPOINT_SETUP_RECEIVED_MASK     = TU_BIT(2), // clear by SIE_CMDCODE_ENDPOINT_SELECT_CLEAR_INTERRUPT\n  SIE_SELECT_ENDPOINT_PACKET_OVERWRITTEN_MASK = TU_BIT(3), // previous packet is overwritten by a SETUP packet\n  SIE_SELECT_ENDPOINT_NAK_MASK                = TU_BIT(4), // last packet response is NAK (auto clear by an ACK)\n  SIE_SELECT_ENDPOINT_BUFFER1_FULL_MASK       = TU_BIT(5),\n  SIE_SELECT_ENDPOINT_BUFFER2_FULL_MASK       = TU_BIT(6)\n};\n\ntypedef enum\n{\n  SIE_SET_ENDPOINT_STALLED_MASK           = TU_BIT(0),\n  SIE_SET_ENDPOINT_DISABLED_MASK          = TU_BIT(5),\n  SIE_SET_ENDPOINT_RATE_FEEDBACK_MASK     = TU_BIT(6),\n  SIE_SET_ENDPOINT_CONDITION_STALLED_MASK = TU_BIT(7),\n}sie_endpoint_set_status_mask_t;\n\n//------------- DMA Descriptor Status -------------//\nenum {\n  DD_STATUS_NOT_SERVICED = 0,\n  DD_STATUS_BEING_SERVICED,\n  DD_STATUS_NORMAL,\n  DD_STATUS_DATA_UNDERUN, // short packet\n  DD_STATUS_DATA_OVERRUN,\n  DD_STATUS_SYSTEM_ERROR\n};\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n/* Since 2012 starting with LPC11uxx, NXP start to use common USB Device Controller with code name LPC IP3511\n * for almost their new MCUs. Currently supported and tested families are\n * - LPC11U68, LPC11U37\n * - LPC1347\n * - LPC51U68\n * - LPC54114\n * - LPC55s69\n */\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_IP3511)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n\n#if TU_CHECK_MCU(OPT_MCU_LPC11UXX, OPT_MCU_LPC13XX, OPT_MCU_LPC15XX)\n  // LPCOpen\n  #ifdef __GNUC__\n  #pragma GCC diagnostic push\n  #pragma GCC diagnostic ignored \"-Wunused-parameter\"\n  #pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n  #endif\n\n  #include \"chip.h\"\n\n  #ifdef __GNUC__\n  #pragma GCC diagnostic pop\n  #endif\n\n#else\n  // SDK\n  #include \"fsl_device_registers.h\"\n  #define INCLUDE_FSL_DEVICE_REGISTERS\n#endif\n\n#include \"device/dcd.h\"\n\n//--------------------------------------------------------------------+\n// IP3511 Registers\n//--------------------------------------------------------------------+\n\ntypedef struct {\n  __IO uint32_t DEVCMDSTAT;    // Device Command/Status register, offset: 0x0\n  __I  uint32_t INFO;          // Info register, offset: 0x4\n  __IO uint32_t EPLISTSTART;   // EP Command/Status List start address, offset: 0x8\n  __IO uint32_t DATABUFSTART;  // Data buffer start address, offset: 0xC\n  __IO uint32_t LPM;           // Link Power Management register, offset: 0x10\n  __IO uint32_t EPSKIP;        // Endpoint skip, offset: 0x14\n  __IO uint32_t EPINUSE;       // Endpoint Buffer in use, offset: 0x18\n  __IO uint32_t EPBUFCFG;      // Endpoint Buffer Configuration register, offset: 0x1C\n  __IO uint32_t INTSTAT;       // interrupt status register, offset: 0x20\n  __IO uint32_t INTEN;         // interrupt enable register, offset: 0x24\n  __IO uint32_t INTSETSTAT;    // set interrupt status register, offset: 0x28\n       uint8_t RESERVED_0[8];\n  __I  uint32_t EPTOGGLE;      // Endpoint toggle register, offset: 0x34\n} dcd_registers_t;\n\n// Max nbytes for each control/bulk/interrupt transfer\nenum {\n  NBYTES_ISO_FS_MAX = 1023, // FS ISO\n  NBYTES_ISO_HS_MAX = 1024, // HS ISO\n  NBYTES_CBI_FS_MAX = 64,   // FS control/bulk/interrupt. TODO some FS can do burst with higher size e.g 1024. Need to test\n  NBYTES_CBI_HS_MAX = 32767 // can be up to all 15-bit, but only tested with 4096\n};\n\nenum {\n  INT_SOF_MASK           = TU_BIT(30),\n  INT_DEVICE_STATUS_MASK = TU_BIT(31)\n};\n\nenum {\n  DEVCMDSTAT_DEVICE_ADDR_MASK    = TU_BIT(7 )-1,\n  DEVCMDSTAT_DEVICE_ENABLE_MASK  = TU_BIT(7 ),\n  DEVCMDSTAT_SETUP_RECEIVED_MASK = TU_BIT(8 ),\n  DEVCMDSTAT_DEVICE_CONNECT_MASK = TU_BIT(16), // reflect the soft-connect only, does not reflect the actual attached state\n  DEVCMDSTAT_DEVICE_SUSPEND_MASK = TU_BIT(17),\n                                               // 23-22 is link speed (only available for HighSpeed port)\n  DEVCMDSTAT_CONNECT_CHANGE_MASK = TU_BIT(24),\n  DEVCMDSTAT_SUSPEND_CHANGE_MASK = TU_BIT(25),\n  DEVCMDSTAT_RESET_CHANGE_MASK   = TU_BIT(26),\n  DEVCMDSTAT_VBUS_DEBOUNCED_MASK = TU_BIT(28),\n};\n\nenum {\n  DEVCMDSTAT_SPEED_SHIFT = 22\n};\n\n//--------------------------------------------------------------------+\n// Endpoint Command/Status List\n//--------------------------------------------------------------------+\n\n// EP Command/Status field definition\nenum {\n  EPCS_TYPE         = TU_BIT(26),\n  EPCS_RF_TV        = TU_BIT(27),\n  EPCS_TOGGLE_RESET = TU_BIT(28),\n  EPCS_STALL        = TU_BIT(29),\n  EPCS_DISABLED     = TU_BIT(30),\n  EPCS_ACTIVE       = TU_BIT(31),\n};\n\n// Endpoint Command/Status\ntypedef union TU_ATTR_PACKED\n{\n  // Full and High speed has different bit layout for buffer_offset and nbytes\n  // TODO FS/HS layout depends on the max speed of controller e.g\n  // lpc55s69 PORT0 is only FS but actually has the same layout as HS on port1\n\n  // Buffer (aligned 64) = DATABUFSTART [31:22]  | buffer_offset [21:6]\n  volatile struct {\n    uint32_t offset      : 16;\n    uint32_t nbytes      : 10;\n    uint32_t TU_RESERVED : 6;\n  } buffer_fs;\n\n  // Buffer (aligned 64) = USB_RAM [31:17] | buffer_offset [16:6]\n  volatile struct {\n    uint32_t offset      : 11 ;\n    uint32_t nbytes      : 15 ;\n    uint32_t TU_RESERVED : 6  ;\n  } buffer_hs;\n\n  volatile struct {\n    uint32_t TU_RESERVED  : 26;\n    uint32_t type         : 1 ;\n    uint32_t rf_tv        : 1 ; // rate feedback or toggle value\n    uint32_t toggle_reset : 1 ;\n    uint32_t stall        : 1 ;\n    uint32_t disable      : 1 ;\n    uint32_t active       : 1 ;\n  } cmd_sts;\n}ep_cmd_sts_t;\n\nTU_VERIFY_STATIC( sizeof(ep_cmd_sts_t) == 4, \"size is not correct\" );\n\n// Software transfer management\ntypedef struct\n{\n  uint16_t total_bytes;\n  uint16_t xferred_bytes;\n\n  uint16_t nbytes;\n\n  // prevent unaligned access on Highspeed port on USB_SRAM\n  uint16_t TU_RESERVED;\n}xfer_dma_t;\n\n// Absolute max of endpoints pairs for all port\n// - 11 13 15 51 54 has 5x2 endpoints\n// - 55 usb0 (FS) has 5x2 endpoints, usb1 (HS) has 6x2 endpoints\n#define MAX_EP_PAIRS  6\n\n// NOTE data will be transferred as soon as dcd get request by dcd_pipe(_queue)_xfer using double buffering.\n// current_td is used to keep track of number of remaining & xferred bytes of the current request.\ntypedef struct\n{\n  // 256 byte aligned, 2 for double buffer (not used)\n  // Each cmd_sts can only transfer up to DMA_NBYTES_MAX bytes each\n  ep_cmd_sts_t ep[2*MAX_EP_PAIRS][2];\n  xfer_dma_t dma[2*MAX_EP_PAIRS];\n\n  TU_ATTR_ALIGNED(64) uint8_t setup_packet[8];\n}dcd_data_t;\n\n// EP list must be 256-byte aligned\n//    Some MCU controller may require this variable to be placed in specific SRAM region.\n//    For example: LPC55s69 port1 Highspeed must be USB_RAM (0x40100000)\n//    Use CFG_TUD_MEM_SECTION to place it accordingly.\nCFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(256) static dcd_data_t _dcd;\n\n// Dummy buffer to fix ZLPs overwriting the buffer (probably an USB/DMA controller bug)\n// TODO find way to save memory\nCFG_TUD_MEM_SECTION TU_ATTR_ALIGNED(64) static uint8_t dummy[8];\n\n//--------------------------------------------------------------------+\n// Multiple Controllers\n//--------------------------------------------------------------------+\n\ntypedef struct\n{\n  dcd_registers_t* regs;   // registers\n  const bool is_highspeed; // max link speed\n  const IRQn_Type irqnum;  // IRQ number\n  const uint8_t ep_pairs;  // Max bi-directional Endpoints\n}dcd_controller_t;\n\n#ifdef INCLUDE_FSL_DEVICE_REGISTERS\n\nstatic const dcd_controller_t _dcd_controller[] = {\n    { .regs = (dcd_registers_t*) USB0_BASE  , .is_highspeed = false, .irqnum = USB0_IRQn, .ep_pairs = FSL_FEATURE_USB_EP_NUM    },\n  #if defined(FSL_FEATURE_SOC_USBHSD_COUNT) && FSL_FEATURE_SOC_USBHSD_COUNT\n    { .regs = (dcd_registers_t*) USBHSD_BASE, .is_highspeed = true, .irqnum = USB1_IRQn, .ep_pairs = FSL_FEATURE_USBHSD_EP_NUM }\n  #endif\n};\n\n#else\n\nstatic const dcd_controller_t _dcd_controller[] = {\n  { .regs = (dcd_registers_t*) LPC_USB0_BASE, .is_highspeed = false, .irqnum = USB0_IRQn, .ep_pairs = 5 },\n};\n\n#endif\n\n#if defined(FSL_FEATURE_SOC_USBHSD_COUNT) && FSL_FEATURE_SOC_USBHSD_COUNT\n  #define IP3511_HAS_HIGHSPEED\n#endif\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t get_buf_offset(void const * buffer) {\n  uint32_t addr = (uint32_t) buffer;\n  TU_ASSERT( (addr & 0x3f) == 0, 0 );\n  return ( (addr >> 6) & 0xFFFFUL ) ;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t ep_addr2id(uint8_t ep_addr) {\n  return 2*(ep_addr & 0x0F) + ((ep_addr & TUSB_DIR_IN_MASK) ? 1 : 0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool ep_is_iso(ep_cmd_sts_t* ep_cs, bool is_highspeed) {\n  return is_highspeed ? (ep_cs[0].cmd_sts.type && !ep_cs[0].cmd_sts.rf_tv) : ep_cs->cmd_sts.type;\n}\n\nTU_ATTR_ALWAYS_INLINE TU_ATTR_UNUSED static inline bool ep_is_bulk(ep_cmd_sts_t* ep_cs) {\n  return (ep_cs[0].cmd_sts.type == 0) && (ep_cs[0].cmd_sts.rf_tv == 0);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline ep_cmd_sts_t* get_ep_cs(uint8_t ep_id) {\n  return _dcd.ep[ep_id];\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool rhport_is_highspeed(uint8_t rhport) {\n  return _dcd_controller[rhport].is_highspeed;\n}\n\n//--------------------------------------------------------------------+\n// CONTROLLER API\n//--------------------------------------------------------------------+\n\nstatic void prepare_setup_packet(uint8_t rhport) {\n  uint16_t const buf_offset = get_buf_offset(_dcd.setup_packet);\n  if ( _dcd_controller[rhport].is_highspeed ) {\n    _dcd.ep[0][1].buffer_hs.offset = buf_offset;\n  } else {\n    _dcd.ep[0][1].buffer_fs.offset = buf_offset;\n  }\n}\n\nstatic void edpt_reset(uint8_t rhport, uint8_t ep_id)\n{\n  (void) rhport;\n  tu_memclr(&_dcd.ep[ep_id], sizeof(_dcd.ep[ep_id]));\n}\n\nstatic void edpt_reset_all(uint8_t rhport)\n{\n  for (uint8_t ep_id = 0; ep_id < 2*_dcd_controller[rhport].ep_pairs; ++ep_id)\n  {\n    edpt_reset(rhport, ep_id);\n  }\n  prepare_setup_packet(rhport);\n}\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  edpt_reset_all(rhport);\n\n  dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;\n\n  dcd_reg->EPLISTSTART  = (uint32_t) _dcd.ep;\n  dcd_reg->DATABUFSTART = tu_align((uint32_t) &_dcd, TU_BIT(22)); // 22-bit alignment\n  dcd_reg->INTSTAT      = dcd_reg->INTSTAT; // clear all pending interrupt\n  dcd_reg->INTEN        = INT_DEVICE_STATUS_MASK;\n  dcd_reg->DEVCMDSTAT  |= DEVCMDSTAT_DEVICE_ENABLE_MASK | DEVCMDSTAT_DEVICE_CONNECT_MASK |\n                           DEVCMDSTAT_RESET_CHANGE_MASK | DEVCMDSTAT_CONNECT_CHANGE_MASK | DEVCMDSTAT_SUSPEND_CHANGE_MASK;\n\n  NVIC_ClearPendingIRQ(_dcd_controller[rhport].irqnum);\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  NVIC_EnableIRQ(_dcd_controller[rhport].irqnum);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  NVIC_DisableIRQ(_dcd_controller[rhport].irqnum);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;\n\n  // Response with status first before changing device address\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n\n  dcd_reg->DEVCMDSTAT &= ~DEVCMDSTAT_DEVICE_ADDR_MASK;\n  dcd_reg->DEVCMDSTAT |= dev_addr;\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;\n  dcd_reg->DEVCMDSTAT |= DEVCMDSTAT_DEVICE_CONNECT_MASK;\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;\n  dcd_reg->DEVCMDSTAT &= ~DEVCMDSTAT_DEVICE_CONNECT_MASK;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// DCD Endpoint Port\n//--------------------------------------------------------------------+\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  // TODO cannot able to STALL Control OUT endpoint !!!!! FIXME try some walk-around\n  uint8_t const ep_id = ep_addr2id(ep_addr);\n  _dcd.ep[ep_id][0].cmd_sts.stall = 1;\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t const ep_id = ep_addr2id(ep_addr);\n\n  _dcd.ep[ep_id][0].cmd_sts.stall        = 0;\n  _dcd.ep[ep_id][0].cmd_sts.toggle_reset = 1;\n  _dcd.ep[ep_id][0].cmd_sts.rf_tv        = 0;\n}\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc)\n{\n  //------------- Prepare Queue Head -------------//\n  uint8_t ep_id = ep_addr2id(p_endpoint_desc->bEndpointAddress);\n  ep_cmd_sts_t* ep_cs = get_ep_cs(ep_id);\n\n  // Check if endpoint is available\n  TU_ASSERT( ep_cs[0].cmd_sts.disable && ep_cs[1].cmd_sts.disable );\n\n  edpt_reset(rhport, ep_id);\n\n  switch (p_endpoint_desc->bmAttributes.xfer) {\n    case TUSB_XFER_ISOCHRONOUS:\n      ep_cs[0].cmd_sts.type = 1;\n      break;\n\n    case TUSB_XFER_INTERRUPT:\n      // What is interrupt endpoint in rate feedback mode ?\n      if ( rhport_is_highspeed(rhport) ) {\n        ep_cs[0].cmd_sts.type = 1;\n        ep_cs[0].cmd_sts.rf_tv = 1;\n      }\n      break;\n\n    case TUSB_XFER_BULK:\n      // nothing to do both type and rf_tv are 0\n      break;\n\n    default: break;\n  }\n\n  // Enable EP interrupt\n  dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;\n  dcd_reg->INTEN |= TU_BIT(ep_id);\n\n  return true;\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  for (uint8_t ep_id = 0; ep_id < 2*_dcd_controller[rhport].ep_pairs; ++ep_id)\n  {\n    _dcd.ep[ep_id][0].cmd_sts.active = _dcd.ep[ep_id][0].cmd_sts.active = 0; // TODO proper way is to EPSKIP then wait ep[][].active then write ep[][].disable (see table 778 in LPC55S69 Use Manual)\n    _dcd.ep[ep_id][0].cmd_sts.disable = _dcd.ep[ep_id][1].cmd_sts.disable = 1;\n  }\n}\n\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t ep_id = ep_addr2id(ep_addr);\n  _dcd.ep[ep_id][0].cmd_sts.active = _dcd.ep[ep_id][0].cmd_sts.active = 0; // TODO proper way is to EPSKIP then wait ep[][].active then write ep[][].disable (see table 778 in LPC55S69 Use Manual)\n  _dcd.ep[ep_id][0].cmd_sts.disable = _dcd.ep[ep_id][1].cmd_sts.disable = 1;\n}\n\n#if 0\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n#endif\n\nstatic void prepare_ep_xfer(uint8_t rhport, uint8_t ep_id, uint16_t buf_offset, uint16_t total_bytes) {\n  uint16_t nbytes;\n  ep_cmd_sts_t* ep_cs = get_ep_cs(ep_id);\n\n  const bool is_iso = ep_is_iso(ep_cs, _dcd_controller[rhport].is_highspeed);\n\n  if ( rhport_is_highspeed(rhport) ) {\n    nbytes = tu_min16(total_bytes, is_iso ? NBYTES_ISO_HS_MAX : NBYTES_CBI_HS_MAX);\n    #if TU_CHECK_MCU(OPT_MCU_LPC54)\n    // LPC54 Errata USB.1: In USB high-speed device mode, the NBytes field does not decrement after BULK OUT transfer.\n    // Suggested Work-around: Program the NByte to the max packet size (512)\n    // Actual Work-around: round up NByte to multiple of 4.\n    // Note: this can cause buffer overflowed and corrupt data if host send more data than total_bytes\n    if ( (ep_id > 1) && (ep_id & 0x01) == 0 && ep_is_bulk(ep_cs) ) {\n      if ( nbytes & 0x03 ) {\n        nbytes = tu_align4(nbytes) + 4;\n      }\n    }\n    #endif\n\n    ep_cs[0].buffer_hs.offset = buf_offset;\n    ep_cs[0].buffer_hs.nbytes = nbytes;\n  }else {\n    nbytes = tu_min16(total_bytes, is_iso ? NBYTES_ISO_FS_MAX : NBYTES_CBI_FS_MAX);\n    ep_cs[0].buffer_fs.offset = buf_offset;\n    ep_cs[0].buffer_fs.nbytes = nbytes;\n  }\n\n  _dcd.dma[ep_id].nbytes = nbytes;\n  ep_cs[0].cmd_sts.active = 1;\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr) {\n  (void) is_isr;\n  uint8_t const ep_id = ep_addr2id(ep_addr);\n\n  if (!buffer || total_bytes == 0) {\n    // Although having no data, ZLPs can cause buffer overwritten to zeroes. Probably due to USB/DMA controller side\n    // effect/bug. Assigned buffer offset to (valid) dummy to prevent overwriting to DATABUFSTART\n    buffer = (uint8_t *) (uint32_t) dummy;\n  }\n\n  tu_memclr(&_dcd.dma[ep_id], sizeof(xfer_dma_t));\n  _dcd.dma[ep_id].total_bytes = total_bytes;\n\n  prepare_ep_xfer(rhport, ep_id, get_buf_offset(buffer), total_bytes);\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// IRQ\n//--------------------------------------------------------------------+\nstatic void bus_reset(uint8_t rhport)\n{\n  tu_memclr(&_dcd, sizeof(dcd_data_t));\n  edpt_reset_all(rhport);\n\n  // disable all endpoints as specified by LPC55S69 UM Table 778\n  for(uint8_t ep_id = 0; ep_id < 2*MAX_EP_PAIRS; ep_id++)\n  {\n    _dcd.ep[ep_id][0].cmd_sts.disable = _dcd.ep[ep_id][1].cmd_sts.disable = 1;\n  }\n\n  dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;\n\n  dcd_reg->EPINUSE      = 0;\n  dcd_reg->EPBUFCFG     = 0;\n  dcd_reg->EPSKIP       = 0xFFFFFFFF;\n\n  dcd_reg->INTSTAT      = dcd_reg->INTSTAT;                               // clear all pending interrupt\n  dcd_reg->DEVCMDSTAT  |= DEVCMDSTAT_SETUP_RECEIVED_MASK;                    // clear setup received interrupt\n  dcd_reg->INTEN        = INT_DEVICE_STATUS_MASK | TU_BIT(0) | TU_BIT(1); // enable device status & control endpoints\n}\n\nstatic void process_xfer_isr(uint8_t rhport, uint32_t int_status) {\n  uint8_t const max_ep = 2*_dcd_controller[rhport].ep_pairs;\n\n  for(uint8_t ep_id = 0; ep_id < max_ep; ep_id++ ) {\n    if ( tu_bit_test(int_status, ep_id) ) {\n      ep_cmd_sts_t * ep_cs = &_dcd.ep[ep_id][0];\n      xfer_dma_t* xfer_dma = &_dcd.dma[ep_id];\n\n      if ( ep_id <= 1 ) {\n        // For control endpoint, we need to manually clear Active bit\n        ep_cs->cmd_sts.active = 0;\n      }\n\n      uint16_t buf_offset;\n      uint16_t buf_nbytes;\n\n      if ( rhport_is_highspeed(rhport) ) {\n        buf_offset = ep_cs->buffer_hs.offset;\n        buf_nbytes = ep_cs->buffer_hs.nbytes;\n\n        #if TU_CHECK_MCU(OPT_MCU_LPC54)\n        // LPC54 Errata USB.2: In USB high-speed device mode, the NBytes field is not correct after BULK IN transfer\n        // There is no work-around. For EP in transfer, the NByte value can be ignored after a packet is transmitted.\n        if ( (ep_id > 1) && (ep_id & 0x01) == 1 && ep_is_bulk(ep_cs) ) {\n          buf_nbytes = 0;\n        }\n        #endif\n      } else {\n        buf_offset = ep_cs->buffer_fs.offset;\n        buf_nbytes = ep_cs->buffer_fs.nbytes;\n      }\n\n      xfer_dma->xferred_bytes += xfer_dma->nbytes - buf_nbytes;\n\n      if ( (buf_nbytes == 0) && (xfer_dma->total_bytes > xfer_dma->xferred_bytes) ) {\n        // There is more data to transfer\n        // buff_offset has been already increased by hw to correct value for next transfer\n        prepare_ep_xfer(rhport, ep_id, buf_offset, xfer_dma->total_bytes - xfer_dma->xferred_bytes);\n      } else {\n        // for detecting ZLP\n        xfer_dma->total_bytes = xfer_dma->xferred_bytes;\n\n        uint8_t const ep_addr = tu_edpt_addr(ep_id / 2, ep_id & 0x01);\n\n        // TODO no way determine if the transfer is failed or not\n        dcd_event_xfer_complete(rhport, ep_addr, xfer_dma->xferred_bytes, XFER_RESULT_SUCCESS, true);\n      }\n    }\n  }\n}\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;\n\n  uint32_t const cmd_stat = dcd_reg->DEVCMDSTAT;\n\n  uint32_t int_status = dcd_reg->INTSTAT;\n\tint_status &= dcd_reg->INTEN;\n  dcd_reg->INTSTAT = int_status; // Acknowledge handled interrupt\n\n  if (int_status == 0) return;\n\n  //------------- Device Status -------------//\n  if ( int_status & INT_DEVICE_STATUS_MASK )\n  {\n    dcd_reg->DEVCMDSTAT |= DEVCMDSTAT_RESET_CHANGE_MASK | DEVCMDSTAT_CONNECT_CHANGE_MASK | DEVCMDSTAT_SUSPEND_CHANGE_MASK;\n\n    if ( cmd_stat & DEVCMDSTAT_RESET_CHANGE_MASK) // bus reset\n    {\n      bus_reset(rhport);\n\n      tusb_speed_t speed = TUSB_SPEED_FULL;\n      if ( _dcd_controller[rhport].is_highspeed ) {\n        // 0 : reserved, 1 : full, 2 : high, 3: super\n        if ( 2 == ((cmd_stat >> DEVCMDSTAT_SPEED_SHIFT) & 0x3UL) ) {\n          speed= TUSB_SPEED_HIGH;\n        }\n      }\n\n      dcd_event_bus_reset(rhport, speed, true);\n    }\n\n    if (cmd_stat & DEVCMDSTAT_CONNECT_CHANGE_MASK)\n    {\n      // device disconnect\n      if (cmd_stat & DEVCMDSTAT_DEVICE_ADDR_MASK)\n      {\n        // debouncing as this can be set when device is powering\n        dcd_event_bus_signal(rhport, DCD_EVENT_UNPLUGGED, true);\n      }\n    }\n\n    if (cmd_stat & DEVCMDSTAT_SUSPEND_CHANGE_MASK)\n    {\n      // suspend signal, bus idle for more than 3ms\n      // Note: Host may delay more than 3 ms before and/or after bus reset before doing enumeration.\n      if (cmd_stat & DEVCMDSTAT_DEVICE_ADDR_MASK)\n      {\n        dcd_event_bus_signal(rhport, (cmd_stat & DEVCMDSTAT_DEVICE_SUSPEND_MASK) ? DCD_EVENT_SUSPEND : DCD_EVENT_RESUME, true);\n      }\n    }\n  }\n\n  // Setup Receive\n  if ( tu_bit_test(int_status, 0) && (cmd_stat & DEVCMDSTAT_SETUP_RECEIVED_MASK) )\n  {\n    // Follow UM flowchart to clear Active & Stall on both Control IN/OUT endpoints\n    _dcd.ep[0][0].cmd_sts.active = _dcd.ep[1][0].cmd_sts.active = 0;\n    _dcd.ep[0][0].cmd_sts.stall = _dcd.ep[1][0].cmd_sts.stall = 0;\n\n    dcd_reg->DEVCMDSTAT |= DEVCMDSTAT_SETUP_RECEIVED_MASK;\n\n    dcd_event_setup_received(rhport, _dcd.setup_packet, true);\n\n    // keep waiting for next setup\n    prepare_setup_packet(rhport);\n\n    // clear bit0\n    int_status = tu_bit_clear(int_status, 0);\n  }\n\n  // Endpoint transfer complete interrupt\n  process_xfer_isr(rhport, int_status);\n}\n#endif\n"
  },
  {
    "path": "src/portable/nxp/lpc_ip3516/hcd_lpc_ip3516.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 HiFiPhile (Zixun LI)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_IP3516)\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"common/tusb_common.h\"\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"hcd_lpc_ip3516.h\"\n\n#if TU_CHECK_MCU(OPT_MCU_LPC55, OPT_MCU_LPC54)\n  #include \"fsl_device_registers.h\"\n#else\n  #error \"Unsupported MCUs\"\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n#if TU_CHECK_MCU(OPT_MCU_LPC54)\n  #define ATLPTD ATL_PTD_BASE_ADDR\n  #define INTPTD INT_PTD_BASE_ADDR\n  #define ISOPTD ISO_PTD_BASE_ADDR\n  #define ATLPTDD ATL_PTD_DONE_MAP\n  #define INTPTDD INT_PTD_DONE_MAP\n  #define ISOPTDD ISO_PTD_DONE_MAP\n  #define ATLPTDS ATL_PTD_SKIP_MAP\n  #define INTPTDS INT_PTD_SKIP_MAP\n  #define ISOPTDS ISO_PTD_SKIP_MAP\n  #define DATAPAYLOAD DATA_PAYLOAD_BASE_ADDR\n  #define LASTPTD LAST_PTD_INUSE\n\n  #define USBHSH_ATLPTD_ATL_BASE_MASK USBHSH_ATL_PTD_BASE_ADDR_ATL_BASE_MASK\n  #define USBHSH_INTPTD_INT_BASE_MASK USBHSH_INT_PTD_BASE_ADDR_INT_BASE_MASK\n  #define USBHSH_ISOPTD_ISO_BASE_MASK USBHSH_ISO_PTD_BASE_ADDR_ISO_BASE_MASK\n\n  #define USBHSH_DATAPAYLOAD_DAT_BASE_MASK USBHSH_DATA_PAYLOAD_BASE_ADDR_DAT_BASE_MASK\n\n  #define USBHSH_LASTPTD_ATL_LAST USBHSH_LAST_PTD_INUSE_ATL_LAST\n  #define USBHSH_LASTPTD_INT_LAST USBHSH_LAST_PTD_INUSE_INT_LAST\n  #define USBHSH_LASTPTD_ISO_LAST USBHSH_LAST_PTD_INUSE_ISO_LAST\n#endif\n\n#define USBHSH_PORTSC1_W1C_MASK (USBHSH_PORTSC1_CSC_MASK | USBHSH_PORTSC1_PEDC_MASK | USBHSH_PORTSC1_OCC_MASK)\n\n#define IP3516_PSPD_LOW   0\n#define IP3516_PSPD_FULL  1\n#define IP3516_PSPD_HIGH  2\n\n//--------------------------------------------------------------------+\n// Proprietary Transfer Descriptor\n//--------------------------------------------------------------------+\n\nCFG_TUH_MEM_SECTION TU_ATTR_ALIGNED(1024) static ip3516_ptd_t _ptd;\n\nstatic struct {\n  uint32_t uframe_number;\n  uint32_t uframe_length;\n  bool attached; // Track attachment state to avoid duplicate events, sometimes high-speed disconnection detector is not reliable\n} _hcd_data;\n\n//--------------------------------------------------------------------+\n// Helper Functions\n//--------------------------------------------------------------------+\n\nstatic inline bool is_ptd_free(const ptd_ctrl1_t ctrl1) {\n  return ctrl1.mps == 0;\n}\n\nstatic inline bool is_xfer_async(tusb_xfer_type_t xfer_type) {\n  return (xfer_type == TUSB_XFER_CONTROL || xfer_type == TUSB_XFER_BULK);\n}\n\nstatic inline void ptd_clear_state(ptd_state_t *state) {\n  ptd_state_t local = {.value = 0};\n  local.ep_type     = state->ep_type;     // preserve ep_type\n  local.token       = state->token;       // preserve token\n  local.data_toggle = state->data_toggle; // preserve data_toggle\n  *state            = local;\n}\n\nstatic inline uint8_t ptd_find_free(tusb_xfer_type_t xfer_type) {\n  uint8_t  max_count;\n  intptr_t ptd_array;\n\n  switch (xfer_type) {\n    case TUSB_XFER_CONTROL:\n    case TUSB_XFER_BULK:\n      max_count = IP3516_ATL_NUM;\n      ptd_array = (intptr_t)&_ptd.atl;\n      break;\n\n    case TUSB_XFER_INTERRUPT:\n      max_count = IP3516_PTL_NUM;\n      ptd_array = (intptr_t)&_ptd.intr;\n      break;\n\n    case TUSB_XFER_ISOCHRONOUS:\n      max_count = IP3516_PTL_NUM;\n      ptd_array = (intptr_t)&_ptd.iso;\n      break;\n\n    default:\n      return TUSB_INDEX_INVALID_8;\n  }\n\n  for (uint8_t i = 0; i < max_count; i++) {\n    // For ATL: stride is sizeof(ip3516_atl_t) = 16 bytes = 4 words\n    // For PTL: stride is sizeof(ip3516_ptl_t) = 32 bytes = 8 words\n    uint8_t      stride = is_xfer_async(xfer_type) ? sizeof(ip3516_atl_t) : sizeof(ip3516_ptl_t);\n    ptd_ctrl1_t *ctrl1  = (ptd_ctrl1_t *)(ptd_array + i * stride);\n\n    if (is_ptd_free(*ctrl1)) {\n      return i;\n    }\n  }\n\n  return TUSB_INDEX_INVALID_8; // No free PTD found\n}\n\n// Close all PTDs associated with a specific device address\nstatic void close_ptds_by_device(uint8_t dev_addr, intptr_t ptd_array, uint8_t max_count, uint8_t stride,\n                                 volatile uint32_t *skip_reg) {\n\n  uint32_t skip_mask = 0;\n\n  for (uint8_t i = 0; i < max_count; i++) {\n    intptr_t     ptd_ptr   = ptd_array + i * stride;\n    ptd_ctrl1_t *ptd_ctrl1 = (ptd_ctrl1_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl1));\n    ptd_ctrl2_t *ptd_ctrl2 = (ptd_ctrl2_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl2));\n\n    if (!is_ptd_free(*ptd_ctrl1) && ptd_ctrl2->dev_addr == dev_addr) {\n      *skip_reg |= (1 << i);\n      skip_mask |= (1 << i);\n    }\n  }\n\n  if (skip_mask) {\n    // Wait 1 uframe for PTDs to be inactive (with timeout)\n    uint32_t start_uframe =\n      (USBHSH->FLADJ_FRINDEX & USBHSH_FLADJ_FRINDEX_FRINDEX_MASK) >> USBHSH_FLADJ_FRINDEX_FRINDEX_SHIFT;\n    uint32_t timeout = 10000;\n    while (((USBHSH->FLADJ_FRINDEX & USBHSH_FLADJ_FRINDEX_FRINDEX_MASK) >> USBHSH_FLADJ_FRINDEX_FRINDEX_SHIFT) ==\n           start_uframe && timeout > 0) {\n      timeout--;\n    }\n\n    // Clear PTDs\n    for (uint8_t i = 0; i < max_count; i++) {\n      if (skip_mask & (1 << i)) {\n        intptr_t ptd_ptr = ptd_array + i * stride;\n        tu_memclr((void *)ptd_ptr, stride);\n      }\n    }\n\n    // Clear skip bits\n    *skip_reg &= ~skip_mask;\n  }\n}\n\n// Check if a PTD matches the given endpoint criteria\nstatic bool ptd_matches(intptr_t ptd_ptr, uint8_t dev_addr, uint8_t ep_num, uint8_t ep_dir) {\n  ptd_ctrl1_t *ptd_ctrl1 = (ptd_ctrl1_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl1));\n  if (is_ptd_free(*ptd_ctrl1)) {\n    return false;\n  }\n\n  ptd_ctrl2_t *ptd_ctrl2 = (ptd_ctrl2_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl2));\n  if (ptd_ctrl2->dev_addr != dev_addr || ptd_ctrl2->ep_num != ep_num) {\n    return false;\n  }\n\n  ptd_state_t *ptd_state  = (ptd_state_t *)(ptd_ptr + offsetof(ip3516_atl_t, state));\n  bool         is_control = (ptd_state->ep_type == TUSB_XFER_CONTROL);\n\n  // For control endpoint, match both IN and OUT directions\n  if (is_control) {\n    return true;\n  }\n\n  if (ep_dir == TUSB_DIR_IN && ptd_state->token == IP3516_PTD_TOKEN_IN) {\n    return true;\n  }\n\n  if (ep_dir == TUSB_DIR_OUT && ptd_state->token == IP3516_PTD_TOKEN_OUT) {\n    return true;\n  }\n\n  return false;\n}\n\n// Find and close a specific PTD\nstatic bool find_and_close_ptd(uint8_t dev_addr, uint8_t ep_num, uint8_t ep_dir, intptr_t ptd_array, uint8_t max_count,\n                               uint8_t stride, volatile uint32_t *skip_reg) {\n  for (uint8_t i = 0; i < max_count; i++) {\n    intptr_t ptd_ptr = ptd_array + i * stride;\n    if (ptd_matches(ptd_ptr, dev_addr, ep_num, ep_dir)) {\n      if (skip_reg) {\n        *skip_reg |= (1 << i);\n\n        // Wait 1 uframe for PTD to be inactive (with timeout)\n        uint32_t start_uframe =\n          (USBHSH->FLADJ_FRINDEX & USBHSH_FLADJ_FRINDEX_FRINDEX_MASK) >> USBHSH_FLADJ_FRINDEX_FRINDEX_SHIFT;\n        uint32_t timeout = 10000;\n        while (((USBHSH->FLADJ_FRINDEX & USBHSH_FLADJ_FRINDEX_FRINDEX_MASK) >> USBHSH_FLADJ_FRINDEX_FRINDEX_SHIFT) ==\n               start_uframe && timeout > 0) {\n          timeout--;\n        }\n\n        // Just clear state\n        ptd_ctrl1_t *ptd_ctrl1 = (ptd_ctrl1_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl1));\n        ptd_state_t *ptd_state = (ptd_state_t *)(ptd_ptr + offsetof(ip3516_atl_t, state));\n        ptd_clear_state(ptd_state);\n        ptd_ctrl1->valid = 0;\n\n        *skip_reg &= ~(1 << i);\n      } else {\n        // Clear PTD\n        tu_memclr((void *)ptd_ptr, stride);\n      }\n      return true;\n    }\n  }\n  return false;\n}\n\n// Find an opened PTD\nstatic intptr_t find_opened_ptd(uint8_t dev_addr, uint8_t ep_addr) {\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = tu_edpt_dir(ep_addr);\n\n  // Search in ATL\n  for (uint8_t i = 0; i < IP3516_ATL_NUM; i++) {\n    intptr_t ptd_ptr = (intptr_t)&_ptd.atl[i];\n    if (ptd_matches(ptd_ptr, dev_addr, ep_num, ep_dir)) {\n      return ptd_ptr;\n    }\n  }\n\n  // Search in INT\n  for (uint8_t i = 0; i < IP3516_PTL_NUM; i++) {\n    intptr_t ptd_ptr = (intptr_t)&_ptd.intr[i];\n    if (ptd_matches(ptd_ptr, dev_addr, ep_num, ep_dir)) {\n      return ptd_ptr;\n    }\n  }\n\n  // Search in ISO\n  for (uint8_t i = 0; i < IP3516_PTL_NUM; i++) {\n    intptr_t ptd_ptr = (intptr_t)&_ptd.iso[i];\n    if (ptd_matches(ptd_ptr, dev_addr, ep_num, ep_dir)) {\n      return ptd_ptr;\n    }\n  }\n\n  return 0;\n}\n\nstatic bool edpt_xfer(uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen, bool is_setup) {\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = tu_edpt_dir(ep_addr);\n\n  intptr_t ptd_ptr = find_opened_ptd(dev_addr, ep_addr);\n  TU_ASSERT(ptd_ptr != 0);\n\n  ptd_ctrl1_t *ptd_ctrl1 = (ptd_ctrl1_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl1));\n  ptd_ctrl2_t *ptd_ctrl2 = (ptd_ctrl2_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl2));\n  ptd_data_t  *ptd_data  = (ptd_data_t *)(ptd_ptr + offsetof(ip3516_atl_t, data));\n  ptd_state_t *ptd_state = (ptd_state_t *)(ptd_ptr + offsetof(ip3516_atl_t, state));\n\n  // Setup data buffer and length\n  ptd_data->data_addr = (uint32_t)(uintptr_t)buffer & IP3516_PTD_DATA_ADDR_MASK;\n  ptd_data->xfer_len  = buflen;\n\n  // Clear previous state\n  ptd_clear_state(ptd_state);\n\n  // Set token for EP0\n  if (ep_num == 0) {\n    if (is_setup) {\n      ptd_state->token       = IP3516_PTD_TOKEN_SETUP;\n      ptd_state->data_toggle = 0;\n    } else {\n      ptd_state->token       = (ep_dir == TUSB_DIR_IN) ? IP3516_PTD_TOKEN_IN : IP3516_PTD_TOKEN_OUT;\n      ptd_state->data_toggle = 1;\n    }\n  }\n\n  // Interrupt split transfer needs to be relaunched manually if NAKed\n  if (ptd_ctrl2->split && ptd_state->ep_type == TUSB_XFER_INTERRUPT) {\n    ptd_ctrl2->reload  = 0x0f;\n    ptd_state->nak_cnt = 0x0f;\n  }\n\n  // Activate PTD\n  ptd_ctrl1->valid  = 1;\n  ptd_state->active = 1;\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n// Initialize controller to host mode\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init) {\n  (void)rh_init;\n  (void)rhport;\n\n  // Reset controller\n  USBHSH->USBCMD |= USBHSH_USBCMD_HCRESET_MASK;\n  while (USBHSH->USBCMD & USBHSH_USBCMD_HCRESET_MASK) {}\n\n  USBHSH->PORTMODE = USBHSH_PORTMODE_SW_CTRL_PDCOM_MASK;\n\n  tu_memclr(&_ptd, sizeof(_ptd));\n  tu_varclr(&_hcd_data);\n\n  // Set base addresses\n  USBHSH->ATLPTD      = (uint32_t)&_ptd.atl & USBHSH_ATLPTD_ATL_BASE_MASK;\n  USBHSH->INTPTD      = (uint32_t)&_ptd.intr & USBHSH_INTPTD_INT_BASE_MASK;\n  USBHSH->ISOPTD      = (uint32_t)&_ptd.iso & USBHSH_ISOPTD_ISO_BASE_MASK;\n  USBHSH->DATAPAYLOAD = (uint32_t)&_ptd & USBHSH_DATAPAYLOAD_DAT_BASE_MASK;\n\n  // Turn on power switch\n  if (USBHSH->HCSPARAMS & USBHSH_HCSPARAMS_PPC_MASK) {\n    USBHSH->PORTSC1 |= USBHSH_PORTSC1_PP_MASK;\n  }\n\n  // Get frame list size\n  uint32_t fls = (USBHSH->USBCMD & USBHSH_USBCMD_FLS_MASK) >> USBHSH_USBCMD_FLS_SHIFT;\n  _hcd_data.uframe_length = 8192 >> fls;\n\n  // Clear pending interrupts\n  USBHSH->USBSTS = 0xFFFFFFFF;\n\n  // Enable interrupts\n  USBHSH->USBINTR = USBHSH_USBINTR_ATL_IRQ_E_MASK | USBHSH_USBINTR_INT_IRQ_E_MASK | USBHSH_USBINTR_ISO_IRQ_E_MASK |\n                    USBHSH_USBINTR_PCDE_MASK | USBHSH_USBINTR_FLRE_MASK;\n\n\n  // Enable all PTDs\n  USBHSH->LASTPTD = USBHSH_LASTPTD_ATL_LAST(IP3516_ATL_NUM - 1) | USBHSH_LASTPTD_INT_LAST(IP3516_PTL_NUM - 1) |\n                    USBHSH_LASTPTD_ISO_LAST(IP3516_PTL_NUM - 1);\n\n  // Enable controller\n  USBHSH->USBCMD = USBHSH_USBCMD_ATL_EN_MASK | USBHSH_USBCMD_INT_EN_MASK | USBHSH_USBCMD_ISO_EN_MASK | USBHSH_USBCMD_RS_MASK;\n\n  return true;\n}\n\n// Enable USB interrupt\nvoid hcd_int_enable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_EnableIRQ(USB1_IRQn);\n}\n\n// Disable USB interrupt\nvoid hcd_int_disable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_DisableIRQ(USB1_IRQn);\n}\n\nbool hcd_deinit(uint8_t rhport) {\n  (void)rhport;\n\n  // Disable interrupts\n  USBHSH->USBINTR = 0;\n  USBHSH->USBSTS = 0xFFFFFFFF;\n\n  // Disable controller\n  USBHSH->USBCMD &= ~(USBHSH_USBCMD_ATL_EN_MASK | USBHSH_USBCMD_INT_EN_MASK | USBHSH_USBCMD_ISO_EN_MASK | USBHSH_USBCMD_RS_MASK);\n\n  // Turn off power switch\n  if (USBHSH->HCSPARAMS & USBHSH_HCSPARAMS_PPC_MASK) {\n    USBHSH->PORTSC1 &= ~USBHSH_PORTSC1_PP_MASK;\n  }\n\n  // Connect PHY to device mode\n  USBHSH->PORTMODE = USBHSH_PORTMODE_SW_CTRL_PDCOM_MASK | USBHSH_PORTMODE_DEV_ENABLE_MASK;\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Port API\n//--------------------------------------------------------------------+\n\n// Reset USB bus on the port. Return immediately, bus reset sequence may not be complete.\n// Some port would require hcd_port_reset_end() to be invoked after 10ms to complete the reset sequence.\nvoid hcd_port_reset(uint8_t rhport) {\n  (void)rhport;\n  uint32_t status = USBHSH->PORTSC1 & ~USBHSH_PORTSC1_W1C_MASK;\n  USBHSH->PORTSC1 = status | USBHSH_PORTSC1_PR_MASK;\n}\n\n// Complete bus reset sequence, may be required by some controllers\nvoid hcd_port_reset_end(uint8_t rhport) {\n  (void)rhport;\n  uint32_t status = USBHSH->PORTSC1 & ~USBHSH_PORTSC1_W1C_MASK;\n  USBHSH->PORTSC1 = status & ~USBHSH_PORTSC1_PR_MASK;\n  while (USBHSH->PORTSC1 & USBHSH_PORTSC1_PR_MASK) {}\n#if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U))\n  uint32_t pspd = (USBHSH->PORTSC1 & USBHSH_PORTSC1_PSPD_MASK) >> USBHSH_PORTSC1_PSPD_SHIFT;\n  if (pspd == IP3516_PSPD_HIGH) {\n    // enable phy disconnection for high speed\n    USBPHY->CTRL |= USBPHY_CTRL_ENHOSTDISCONDETECT_MASK;\n  }\n#endif\n}\n\n// Get the current connect status of roothub port\nbool hcd_port_connect_status(uint8_t rhport) {\n  (void)rhport;\n  return (USBHSH->PORTSC1 & USBHSH_PORTSC1_CCS_MASK) ? true : false;\n}\n\n// Get port link speed\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  (void)rhport;\n  uint32_t pspd = (USBHSH->PORTSC1 & USBHSH_PORTSC1_PSPD_MASK) >> USBHSH_PORTSC1_PSPD_SHIFT;\n  switch (pspd) {\n    case IP3516_PSPD_LOW:\n      return TUSB_SPEED_LOW;\n    case IP3516_PSPD_FULL:\n      return TUSB_SPEED_FULL;\n    case IP3516_PSPD_HIGH:\n      return TUSB_SPEED_HIGH;\n    default:\n      return TUSB_SPEED_INVALID;\n  }\n}\n\n// Get frame number (1ms)\nuint32_t hcd_frame_number(uint8_t rhport) {\n  (void)rhport;\n  uint32_t uframe = (USBHSH->FLADJ_FRINDEX & USBHSH_FLADJ_FRINDEX_FRINDEX_MASK) >> USBHSH_FLADJ_FRINDEX_FRINDEX_SHIFT;\n  uframe &= (_hcd_data.uframe_length - 1);\n  return (uframe + _hcd_data.uframe_number) >> 3;\n}\n\n// HCD closes all opened endpoints belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  (void)rhport;\n\n  close_ptds_by_device(dev_addr, (intptr_t)&_ptd.atl, IP3516_ATL_NUM, sizeof(ip3516_atl_t), &USBHSH->ATLPTDS);\n  close_ptds_by_device(dev_addr, (intptr_t)&_ptd.intr, IP3516_PTL_NUM, sizeof(ip3516_ptl_t), &USBHSH->INTPTDS);\n  close_ptds_by_device(dev_addr, (intptr_t)&_ptd.iso, IP3516_PTL_NUM, sizeof(ip3516_ptl_t), &USBHSH->ISOPTDS);\n}\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\n\nstatic inline intptr_t get_ptd_from_index(tusb_xfer_type_t xfer_type, uint8_t ptd_index) {\n  if (is_xfer_async(xfer_type)) {\n    return (intptr_t)&_ptd.atl[ptd_index];\n  } else {\n    if (xfer_type == TUSB_XFER_INTERRUPT) {\n      return (intptr_t)&_ptd.intr[ptd_index];\n    } else {\n      return (intptr_t)&_ptd.iso[ptd_index];\n    }\n  }\n}\n\n\n// Open an endpoint\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_endpoint_t *ep_desc) {\n  (void)rhport;\n\n  const uint8_t          ep_num    = tu_edpt_number(ep_desc->bEndpointAddress);\n  const tusb_xfer_type_t xfer_type = (tusb_xfer_type_t)ep_desc->bmAttributes.xfer;\n\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(dev_addr, &bus_info);\n\n  // Find a free PTD\n  uint8_t ptd_index = ptd_find_free(xfer_type);\n  TU_ASSERT(ptd_index != TUSB_INDEX_INVALID_8);\n\n  // Configure PTD\n  intptr_t              ptd_ptr = get_ptd_from_index(xfer_type, ptd_index);\n  volatile ptd_ctrl1_t *ctrl1   = (volatile ptd_ctrl1_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl1));\n  volatile ptd_ctrl2_t *ctrl2   = (volatile ptd_ctrl2_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl2));\n  volatile ptd_data_t  *data    = (volatile ptd_data_t *)(ptd_ptr + offsetof(ip3516_atl_t, data));\n  volatile ptd_state_t *state   = (volatile ptd_state_t *)(ptd_ptr + offsetof(ip3516_atl_t, state));\n\n  // Initialize PTD fields\n  ctrl1->mps  = ep_desc->wMaxPacketSize;\n  ctrl1->mult = 1;\n\n  ctrl2->dev_addr = dev_addr;\n  ctrl2->ep_num   = ep_num;\n  ctrl2->speed    = bus_info.speed == TUSB_SPEED_LOW ? 2 : 0;\n  ctrl2->hub_addr = bus_info.hub_addr;\n  ctrl2->hub_port = bus_info.hub_port;\n  ctrl2->split    = (hcd_port_speed_get(rhport) == TUSB_SPEED_HIGH) && (bus_info.speed != TUSB_SPEED_HIGH) ? 1 : 0;\n\n  data->intr = 1;\n\n  state->ep_type = (uint32_t)xfer_type;\n  state->token   = tu_edpt_dir(ep_desc->bEndpointAddress) == TUSB_DIR_IN ? IP3516_PTD_TOKEN_IN : IP3516_PTD_TOKEN_OUT;\n\n  if (!is_xfer_async(xfer_type)) {\n    ip3516_ptl_t *ptd = (ip3516_ptl_t *)ptd_ptr;\n\n    uint32_t uframe_interval;\n    if (bus_info.speed == TUSB_SPEED_HIGH) {\n      uframe_interval = 1 << (ep_desc->bInterval - 1);\n    } else {\n      uframe_interval = ep_desc->bInterval << 3;\n      // round down to nearest power of 2\n      uframe_interval = 1 << tu_log2(uframe_interval);\n    }\n    uframe_interval = tu_min32(uframe_interval, IP3516_MAX_UFRAME);\n\n    // uframe_active is an 8-bit mask, where each bit corresponds to a micro-frame within a 1ms frame.\n    // A '1' indicates the endpoint should be polled in that micro-frame.\n    // For example:\n    // Interval 1 (poll every u-frame) -> mask is 0b11111111 (0xFF)\n    // Interval 2 (poll every 2nd u-frame, e.g., 0, 2, 4, 6) -> mask is 0b10101010 (0xAA)\n    // Interval 4 (poll every 4th u-frame, e.g., 0, 4) -> mask is 0b10001000 (0x88)\n    // Interval 8 (poll every 8th u-frame, e.g., 0) -> mask is 0b10000000 (0x80)\n    switch (uframe_interval) {\n      case 1:\n        ptd->status.uframe_active = 0xFF;\n        break;\n      case 2:\n        ptd->status.uframe_active = 0xAA;\n        break;\n      case 4:\n        ptd->status.uframe_active = 0x11;\n        break;\n      case 8:\n        ptd->status.uframe_active = 0x01;\n        break;\n      default:\n        // For intervals > 8, we poll once per frame (every 8 u-frames) and use ctrl1.uframe to skip frames.\n        ptd->status.uframe_active = 0x01;\n        if (uframe_interval >= 16) {\n          ctrl1->uframe = tu_log2(uframe_interval) - 3;\n        }\n        break;\n    }\n\n    if (ctrl2->split) {\n      // 11.18.1 Best Case Full-Speed Budget\n      //\n      // A microframe of time allows at most 187.5 raw bytes of signaling on a full-speed bus.\n      // The best case full-speed budget assumes that 188 full-speed bytes occur in each microframe.\n      //\n      // A 1 ms frame subdivided into microframes of budget time:\n      //\n      // Microframes            Y_0   Y_1   Y_2   Y_3   Y_4   Y_5   Y_6   Y_7\n      // Max wire time          187.5 187.5 187.5 187.5 187.5 187.5 32\n      // Best case wire budget  188   188   188   188   188   188   29\n      //\n      // 11.18.4  Host Split Transaction Scheduling Requirements\n      //\n      // 1. The host must never schedule a start-split in microframe Y_6.\n      // 2. For isochronous OUT full-speed transactions, for each microframe in which the transaction is\n      // budgeted, the host must schedule a 188 (or the remaining data size) data byte start-split transaction.\n      // For isochronous IN and interrupt IN/OUT full-/low-speed transactions, a single start-split must be\n      // scheduled in the microframe before the transaction is budgeted to start on the full-/low-speed bus.\n      // 3. For isochronous OUT full-speed transactions, the host must never schedule a complete-split. The\n      // TT response to a complete-split for an isochronous OUT is undefined.\n      //    For interrupt IN/OUT full-/low-speed transactions, the host must schedule a complete-split\n      // transaction in each of the two microframes following the first microframe in which the full-/low-\n      // speed transaction is budgeted.  An additional complete-split must also be scheduled in the third\n      // following microframe unless the full-/low-speed transaction was budgeted to start in microframe Y_6\n      //    For isochronous IN full-speed transactions, for each microframe in which the full-speed transaction\n      // is budgeted, a complete-split must be scheduled for each following microframe.\n      // Also, determine the last microframe in which a complete-split is scheduled, call it L.\n      // If L is less than Y_6, schedule additional complete-splits in microframe L+1 and L+2.\n      // If L is equal to Y_6, schedule one complete-split in microframe Y_7.\n      //\n      // TODO: Implement budget check scheduling\n      // Otherwise, it may cause bus contention with other split transfers\n      // Here we simply start interrupt transfers for Y_0 and Y1 and isochronous transfers for Y_2\n      if (xfer_type == TUSB_XFER_ISOCHRONOUS) {\n        const uint8_t    ss_slot = 2; // Start-split slot\n        const uint8_t    slots   = (ep_desc->wMaxPacketSize + 187) / 188;\n        const tusb_dir_t ep_dir  = tu_edpt_dir(ep_desc->bEndpointAddress);\n        if (ep_dir == TUSB_DIR_IN) {\n          if (ep_desc->wMaxPacketSize > 192) {\n            ctrl1->mps = 192;\n          }\n          ptd->status.uframe_active = 1 << ss_slot;\n          for (uint8_t i = 0; i < slots; i++) {\n            ptd->iso_in_0.uframe_complete |= 1 << (2 + ss_slot + i);\n          }\n          // Schedule additional complete-splits if needed\n          uint8_t last_complete = ss_slot + slots + 1;\n          if (last_complete < 6) {\n            ptd->iso_in_0.uframe_complete |= 1 << (ss_slot + last_complete + 1);\n            ptd->iso_in_0.uframe_complete |= 1 << (ss_slot + last_complete + 2);\n          } else if (last_complete == 6) {\n            ptd->iso_in_0.uframe_complete |= 1 << 7;\n          }\n        } else {\n          if (ep_desc->wMaxPacketSize > 188) {\n            ctrl1->mps = 188;\n          }\n          for (uint8_t i = 0; i < slots; i++) {\n            ptd->status.uframe_active |= 1 << (ss_slot + i);\n          }\n        }\n      } else {\n        // Start-split slot, jigging to avoid bus contention: EP odd -> Y_1, EP even -> Y_0\n        const uint8_t ss_slot     = ep_num & 0x01;\n        ptd->status.uframe_active = 1 << ss_slot;\n        // Complete-split slots: next 3 u-frames\n        ptd->iso_in_0.uframe_complete = 0x1c << ss_slot;\n      }\n    }\n  }\n\n  return true;\n}\n\n// Close an opened endpoint\nbool hcd_edpt_close(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void)rhport;\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = tu_edpt_dir(ep_addr);\n\n  // Search in ATL\n  if (find_and_close_ptd(dev_addr, ep_num, ep_dir, (intptr_t)&_ptd.atl, IP3516_ATL_NUM, sizeof(ip3516_atl_t), NULL)) {\n    return true;\n  }\n\n  // Search in INT\n  if (find_and_close_ptd(dev_addr, ep_num, ep_dir, (intptr_t)&_ptd.intr, IP3516_PTL_NUM, sizeof(ip3516_ptl_t), NULL)) {\n    return true;\n  }\n\n  // Search in ISO\n  if (find_and_close_ptd(dev_addr, ep_num, ep_dir, (intptr_t)&_ptd.iso, IP3516_PTL_NUM, sizeof(ip3516_ptl_t), NULL)) {\n    return true;\n  }\n\n  return false;\n}\n\n// Submit a transfer on an endpoint\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen) {\n  (void)rhport;\n\n  return edpt_xfer(dev_addr, ep_addr, buffer, buflen, false);\n}\n\n// Abort a queued transfer. Note: it can only abort transfer that has not been started\n// Return true if a queued transfer is aborted, false if there is no transfer to abort\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void)rhport;\n\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = tu_edpt_dir(ep_addr);\n\n  // Search in ATL\n  if (find_and_close_ptd(dev_addr, ep_num, ep_dir, (intptr_t)&_ptd.atl, IP3516_ATL_NUM, sizeof(ip3516_atl_t),\n                         &USBHSH->ATLPTDS)) {\n    return true;\n  }\n\n  // Search in INT\n  if (find_and_close_ptd(dev_addr, ep_num, ep_dir, (intptr_t)&_ptd.intr, IP3516_PTL_NUM, sizeof(ip3516_ptl_t),\n                         &USBHSH->INTPTDS)) {\n    return true;\n  }\n\n  // Search in ISO\n  if (find_and_close_ptd(dev_addr, ep_num, ep_dir, (intptr_t)&_ptd.iso, IP3516_PTL_NUM, sizeof(ip3516_ptl_t),\n                         &USBHSH->ISOPTDS)) {\n    return true;\n  }\n\n  return false;\n}\n\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, const uint8_t setup_packet[8]) {\n  (void)rhport;\n\n  return edpt_xfer(dev_addr, 0x00, (uint8_t *)(uintptr_t)setup_packet, 8, true);\n}\n\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void)rhport;\n\n  intptr_t ptd_ptr = find_opened_ptd(dev_addr, ep_addr);\n  TU_ASSERT(ptd_ptr != 0);\n\n  ptd_state_t *ptd_state = (ptd_state_t *)(ptd_ptr + offsetof(ip3516_atl_t, state));\n  ptd_clear_state(ptd_state);\n  ptd_state->data_toggle = 0; // reset data toggle to DATA0\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Interrupt Handler\n//--------------------------------------------------------------------+\n\n// Handle port status change event\nstatic inline void handle_port_status_change(uint8_t rhport) {\n  const uint32_t status = USBHSH->PORTSC1;\n\n  if (status & USBHSH_PORTSC1_CSC_MASK) {\n    if (status & USBHSH_PORTSC1_CCS_MASK && !_hcd_data.attached) {\n      _hcd_data.attached = true;\n      hcd_event_device_attach(rhport, true);\n    } else {\n      _hcd_data.attached = false;\n      hcd_event_device_remove(rhport, true);\n  #if ((defined FSL_FEATURE_SOC_USBPHY_COUNT) && (FSL_FEATURE_SOC_USBPHY_COUNT > 0U))\n      // disable phy disconnection for high speed\n      USBPHY->CTRL &= ~USBPHY_CTRL_ENHOSTDISCONDETECT_MASK;\n  #endif\n    }\n  }\n\n  USBHSH->PORTSC1 |= status & USBHSH_PORTSC1_W1C_MASK;\n}\n\n// Handle PTD done interrupt\nstatic inline void handle_ptd_done(uint32_t done_status, intptr_t ptd_array, bool is_async) {\n  uint8_t max_count = is_async ? IP3516_ATL_NUM : IP3516_PTL_NUM;\n  uint8_t stride    = is_async ? sizeof(ip3516_atl_t) : sizeof(ip3516_ptl_t);\n\n  for (uint8_t i = 0; i < max_count; i++) {\n    if (done_status & (1 << i)) {\n      intptr_t     ptd_ptr   = ptd_array + i * stride;\n      ptd_ctrl2_t *ptd_ctrl2 = (ptd_ctrl2_t *)(ptd_ptr + offsetof(ip3516_atl_t, ctrl2));\n      ptd_state_t *ptd_state = (ptd_state_t *)(ptd_ptr + offsetof(ip3516_atl_t, state));\n\n      xfer_result_t result;\n      if (ptd_state->halt) {\n        result = XFER_RESULT_STALLED;\n      } else if (ptd_state->error || ptd_state->babble) {\n        result = XFER_RESULT_FAILED;\n      } else {\n        result = XFER_RESULT_SUCCESS;\n      }\n\n      uint8_t ep_addr = ptd_ctrl2->ep_num | (ptd_state->token == IP3516_PTD_TOKEN_IN ? 0x80 : 0x00);\n\n      hcd_event_xfer_complete(ptd_ctrl2->dev_addr, ep_addr, ptd_state->xferred_len, result, true);\n    }\n  }\n}\n\nvoid hcd_int_handler(uint8_t rhport, bool in_isr) {\n  (void)in_isr;\n\n  uint32_t int_status = USBHSH->USBSTS;\n  USBHSH->USBSTS      = int_status; // clear interrupt status\n\n  // Port Change Detect\n  if (int_status & USBHSH_USBSTS_PCD_MASK) {\n    handle_port_status_change(rhport);\n  }\n\n  // Frame List Rollover\n  if (int_status & USBHSH_USBSTS_FLR_MASK) {\n    _hcd_data.uframe_number += _hcd_data.uframe_length;\n  }\n\n  // ATL done\n  if (int_status & USBHSH_USBSTS_ATL_IRQ_MASK) {\n    uint32_t done_status = USBHSH->ATLPTDD;\n    handle_ptd_done(done_status, (intptr_t)&_ptd.atl, true);\n    USBHSH->ATLPTDD = done_status;\n  }\n\n  // INT done\n  if (int_status & USBHSH_USBSTS_INT_IRQ_MASK) {\n    uint32_t done_status = USBHSH->INTPTDD;\n    handle_ptd_done(done_status, (intptr_t)&_ptd.intr, false);\n    USBHSH->INTPTDD = done_status;\n  }\n\n  // ISO done\n  if (int_status & USBHSH_USBSTS_ISO_IRQ_MASK) {\n    uint32_t done_status = USBHSH->ISOPTDD;\n    handle_ptd_done(done_status, (intptr_t)&_ptd.iso, false);\n    USBHSH->ISOPTDD = done_status;\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/nxp/lpc_ip3516/hcd_lpc_ip3516.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 HiFiPhile (Zixun LI)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_HCD_IP3516_H_\n#define TUSB_HCD_IP3516_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// IP3516 CONFIGURATION & CONSTANTS\n//--------------------------------------------------------------------+\n\n#define IP3516_ATL_NUM 32\n#define IP3516_PTL_NUM 32\n\n#define IP3516_PTD_TOKEN_OUT 0x00U\n#define IP3516_PTD_TOKEN_IN 0x01U\n#define IP3516_PTD_TOKEN_SETUP 0x02U\n\n#define IP3516_PTD_EPTYPE_OUT 0x00U\n#define IP3516_PTD_EPTYPE_IN 0x01U\n#define IP3516_PTD_EPTYPE_SETUP 0x02U\n\n#define IP3516_PTD_MAX_TRANSFER_LENGTH 0x7FFFU\n\n#define IP3516_PTD_DATA_ADDR_MASK 0xFFFFU\n\n#define IP3516_MAX_UFRAME (1UL << 8)\n\n#define IP3516_PERIODIC_TRANSFER_GAP (3U)\n#define IP3516_ISO_MULTIPLE_TRANSFER (8U)\n\n\n//--------------------------------------------------------------------+\n// IP3516 PTD Data Structure\n//--------------------------------------------------------------------+\n\n// Control Word 1\ntypedef union {\n  uint32_t value;\n  struct {\n    uint32_t valid    : 1;\n    uint32_t next_ptd : 5;\n    uint32_t          : 1;\n    uint32_t jump     : 1;\n    uint32_t uframe   : 8;\n    uint32_t mps      : 11;\n    uint32_t          : 1;\n    uint32_t mult     : 2;\n    uint32_t          : 2;\n  };\n} ptd_ctrl1_t;\n\nTU_VERIFY_STATIC(sizeof(ptd_ctrl1_t) == 4, \"size is not correct\");\n\n// Control Word 2\ntypedef union {\n  uint32_t value;\n  struct {\n    uint32_t ep_num   : 4;\n    uint32_t dev_addr : 7;\n    uint32_t split    : 1;\n    uint32_t reload   : 4;\n    uint32_t speed    : 2;\n    uint32_t hub_port : 7;\n    uint32_t hub_addr : 7;\n  };\n} ptd_ctrl2_t;\n\nTU_VERIFY_STATIC(sizeof(ptd_ctrl2_t) == 4, \"size is not correct\");\n\n// Data Word\ntypedef union {\n  uint32_t value;\n  struct {\n    uint32_t xfer_len  : 15;\n    uint32_t intr      : 1;\n    uint32_t data_addr : 16;\n  };\n} ptd_data_t;\n\nTU_VERIFY_STATIC(sizeof(ptd_data_t) == 4, \"size is not correct\");\n\n// State Word\ntypedef union {\n  uint32_t value;\n  struct {\n    uint32_t xferred_len    : 15;\n    uint32_t token          : 2;\n    uint32_t ep_type        : 2;\n    uint32_t nak_cnt        : 4;\n    uint32_t err_cnt        : 2;\n    uint32_t data_toggle    : 1;\n    uint32_t ping           : 1;\n    uint32_t start_complete : 1;\n    uint32_t error          : 1;\n    uint32_t babble         : 1;\n    uint32_t halt           : 1;\n    uint32_t active         : 1;\n  };\n} ptd_state_t;\n\nTU_VERIFY_STATIC(sizeof(ptd_state_t) == 4, \"size is not correct\");\n\n// Status Word\ntypedef union {\n  uint32_t value;\n  struct {\n    uint32_t uframe_active : 8;\n    uint32_t iso_status0   : 3;\n    uint32_t iso_status1   : 3;\n    uint32_t iso_status2   : 3;\n    uint32_t iso_status3   : 3;\n    uint32_t iso_status4   : 3;\n    uint32_t iso_status5   : 3;\n    uint32_t iso_status6   : 3;\n    uint32_t iso_status7   : 3;\n  };\n} ptd_status_t;\n\nTU_VERIFY_STATIC(sizeof(ptd_status_t) == 4, \"size is not correct\");\n\n// ATL (Asynchronous Transfer List) structure\ntypedef volatile struct {\n  ptd_ctrl1_t ctrl1;\n  ptd_ctrl2_t ctrl2;\n  ptd_data_t  data;\n  ptd_state_t state;\n} ip3516_atl_t;\n\nTU_VERIFY_STATIC(sizeof(ip3516_atl_t) == 16, \"size is not correct\");\n\n// PTL (Periodic Transfer List) structure\ntypedef volatile struct {\n  ptd_ctrl1_t  ctrl1;\n  ptd_ctrl2_t  ctrl2;\n  ptd_data_t   data;\n  ptd_state_t  state;\n  ptd_status_t status;\n  union {\n    uint32_t value;\n    struct {\n      uint32_t uframe_complete : 8;\n      uint32_t spl_iso_in_0    : 24;\n    };\n  } iso_in_0;\n  uint32_t iso_in_1;\n  uint32_t iso_in_2;\n} ip3516_ptl_t;\n\nTU_VERIFY_STATIC(sizeof(ip3516_ptl_t) == 32, \"size is not correct\");\n\n// Proprietary Transfer Descriptor\ntypedef struct {\n  ip3516_ptl_t intr[IP3516_PTL_NUM];\n  ip3516_ptl_t iso[IP3516_PTL_NUM];\n  ip3516_atl_t atl[IP3516_ATL_NUM];\n} ip3516_ptd_t;\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* TUSB_HCD_IP3516_H_ */\n"
  },
  {
    "path": "src/portable/ohci/ohci.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_OHCI)\n\n#ifndef TUP_OHCI_RHPORTS\n#error  OHCI is enabled, but TUP_OHCI_RHPORTS is not defined.\n#endif\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"osal/osal.h\"\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"ohci.h\"\n\n#if defined(TUP_USBIP_OHCI_NXP)\n  #include \"ohci_nxp.h\"\n#else\n  #error Unsupported OHCI IP\n#endif\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n\nenum {\n  OHCI_CONTROL_FUNCSTATE_RESET = 0,\n  OHCI_CONTROL_FUNCSTATE_RESUME,\n  OHCI_CONTROL_FUNCSTATE_OPERATIONAL,\n  OHCI_CONTROL_FUNCSTATE_SUSPEND\n};\n\nenum {\n  OHCI_CONTROL_CONTROL_BULK_RATIO           = 3, ///< This specifies the service ratio between Control and Bulk EDs. 0 = 1:1, 3 = 4:1\n  OHCI_CONTROL_LIST_PERIODIC_ENABLE_MASK    = TU_BIT(2),\n  OHCI_CONTROL_LIST_ISOCHRONOUS_ENABLE_MASK = TU_BIT(3),\n  OHCI_CONTROL_LIST_CONTROL_ENABLE_MASK     = TU_BIT(4),\n  OHCI_CONTROL_LIST_BULK_ENABLE_MASK        = TU_BIT(5),\n};\n\nenum {\n  OHCI_FMINTERVAL_FI    = 0x2EDF, // 7.3.1 nominal (reset) value\n  OHCI_FMINTERVAL_FSMPS = (6*(OHCI_FMINTERVAL_FI-210)) / 7, // 5.4 calculated based on maximum overhead + bit stuffing\n};\n\nenum {\n  OHCI_PERIODIC_START = 0x3E67\n};\n\nenum {\n  OHCI_INT_SCHEDULING_OVERUN_MASK    = TU_BIT(0),\n  OHCI_INT_WRITEBACK_DONEHEAD_MASK   = TU_BIT(1),\n  OHCI_INT_SOF_MASK                  = TU_BIT(2),\n  OHCI_INT_RESUME_DETECTED_MASK      = TU_BIT(3),\n  OHCI_INT_UNRECOVERABLE_ERROR_MASK  = TU_BIT(4),\n  OHCI_INT_FRAME_OVERFLOW_MASK       = TU_BIT(5),\n  OHCI_INT_RHPORT_STATUS_CHANGE_MASK = TU_BIT(6),\n\n  OHCI_INT_OWNERSHIP_CHANGE_MASK     = TU_BIT(30),\n  OHCI_INT_MASTER_ENABLE_MASK        = TU_BIT(31),\n};\n\nenum {\n  RHPORT_CURRENT_CONNECT_STATUS_MASK      = TU_BIT(0),\n  RHPORT_PORT_ENABLE_STATUS_MASK          = TU_BIT(1),\n  RHPORT_PORT_SUSPEND_STATUS_MASK         = TU_BIT(2),\n  RHPORT_PORT_OVER_CURRENT_INDICATOR_MASK = TU_BIT(3),\n  RHPORT_PORT_RESET_STATUS_MASK           = TU_BIT(4), ///< write '1' to reset port\n\n  RHPORT_PORT_POWER_STATUS_MASK           = TU_BIT(8),\n  RHPORT_LOW_SPEED_DEVICE_ATTACHED_MASK   = TU_BIT(9),\n\n  RHPORT_CONNECT_STATUS_CHANGE_MASK       = TU_BIT(16),\n  RHPORT_PORT_ENABLE_CHANGE_MASK          = TU_BIT(17),\n  RHPORT_PORT_SUSPEND_CHANGE_MASK         = TU_BIT(18),\n  RHPORT_OVER_CURRENT_CHANGE_MASK         = TU_BIT(19),\n  RHPORT_PORT_RESET_CHANGE_MASK           = TU_BIT(20),\n\n  RHPORT_ALL_CHANGE_MASK = RHPORT_CONNECT_STATUS_CHANGE_MASK | RHPORT_PORT_ENABLE_CHANGE_MASK |\n    RHPORT_PORT_SUSPEND_CHANGE_MASK | RHPORT_OVER_CURRENT_CHANGE_MASK | RHPORT_PORT_RESET_CHANGE_MASK\n};\n\nenum {\n  OHCI_CCODE_NO_ERROR              = 0,\n  OHCI_CCODE_CRC                   = 1,\n  OHCI_CCODE_BIT_STUFFING          = 2,\n  OHCI_CCODE_DATA_TOGGLE_MISMATCH  = 3,\n  OHCI_CCODE_STALL                 = 4,\n  OHCI_CCODE_DEVICE_NOT_RESPONDING = 5,\n  OHCI_CCODE_PID_CHECK_FAILURE     = 6,\n  OHCI_CCODE_UNEXPECTED_PID        = 7,\n  OHCI_CCODE_DATA_OVERRUN          = 8,\n  OHCI_CCODE_DATA_UNDERRUN         = 9,\n  OHCI_CCODE_BUFFER_OVERRUN        = 12,\n  OHCI_CCODE_BUFFER_UNDERRUN       = 13,\n  OHCI_CCODE_NOT_ACCESSED          = 14,\n};\n\nenum {\n  OHCI_INT_ON_COMPLETE_YES = 0,\n  OHCI_INT_ON_COMPLETE_NO  = 0x7 // 0b111\n};\n\nenum {\n  GTD_DT_TOGGLE_CARRY = 0,\n  GTD_DT_DATA0 = TU_BIT(1) | 0,\n  GTD_DT_DATA1 = TU_BIT(1) | 1,\n};\n\nenum {\n  PID_SETUP = 0,\n  PID_OUT,\n  PID_IN,\n};\n\nenum {\n  PID_FROM_TD = 0,\n};\n\n//--------------------------------------------------------------------+\n// Support for explicit D-cache operations\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK bool hcd_dcache_clean(void const* addr, uint32_t data_size) { (void) addr; (void) data_size; return true; }\nTU_ATTR_WEAK bool hcd_dcache_invalidate(void const* addr, uint32_t data_size) { (void) addr; (void) data_size; return true; }\n\n// Optional macro to access ED in uncached way\n#ifndef hcd_dcache_uncached\n#define hcd_dcache_uncached(x) (x)\n#endif\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nCFG_TUH_MEM_SECTION TU_ATTR_ALIGNED(256) static ohci_data_t ohci_data;\n\nstatic ohci_ed_t * const p_ed_head[] = {\n    [TUSB_XFER_CONTROL]     = hcd_dcache_uncached(&ohci_data.control[0].ed),\n    [TUSB_XFER_BULK   ]     = hcd_dcache_uncached(&ohci_data.bulk_head_ed),\n    [TUSB_XFER_INTERRUPT]   = hcd_dcache_uncached(&ohci_data.period_head_ed),\n    [TUSB_XFER_ISOCHRONOUS] = NULL // TODO Isochronous\n};\n\nstatic void ed_list_insert(ohci_ed_t * p_pre, ohci_ed_t * p_ed);\nstatic void ed_list_remove_by_addr(ohci_ed_t * p_head, uint8_t dev_addr);\nstatic gtd_extra_data_t *gtd_get_extra_data(ohci_gtd_t const * const gtd);\nstatic ohci_ed_t* ed_from_addr(uint8_t dev_addr, uint8_t ep_addr);\n\nTU_ATTR_ALWAYS_INLINE static inline ohci_ed_t* ed_control(uint8_t daddr) {\n  return hcd_dcache_uncached(&ohci_data.control[daddr].ed);\n}\n\n//--------------------------------------------------------------------+\n// USBH-HCD API\n//--------------------------------------------------------------------+\n\n// If your system requires separation of virtual and physical memory, implement\n// tusb_app_virt_to_phys and tusb_app_virt_to_phys in your application.\nTU_ATTR_ALWAYS_INLINE static inline void *_phys_addr(void *virtual_address) {\n  return tusb_app_virt_to_phys(virtual_address);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void *_virt_addr(void *physical_address) {\n  return tusb_app_phys_to_virt(physical_address);\n}\n\n// Initialization according to 5.1.1.4\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  ohci_phy_init(rhport);\n\n  //------------- Data Structure init -------------//\n  tu_memclr(&ohci_data, sizeof(ohci_data_t));\n  // assign all interrupt pointers to period head ed\n  for(uint8_t i=0; i<32; i++) {\n    ohci_data.hcca.interrupt_table[i] = (uint32_t) _phys_addr(&ohci_data.period_head_ed);\n  }\n\n  ohci_data.control[0].ed.w0.skip  = 1;\n  ohci_data.bulk_head_ed.w0.skip   = 1;\n  ohci_data.period_head_ed.w0.skip = 1;\n\n  //If OHCI hardware is in SMM mode, gain ownership (Ref OHCI spec 5.1.1.3.3)\n  if (OHCI_REG->control_bit.interrupt_routing == 1) {\n    OHCI_REG->command_status_bit.ownership_change_request = 1;\n    while (OHCI_REG->control_bit.interrupt_routing == 1) {}\n  } else if (OHCI_REG->control_bit.hc_functional_state != OHCI_CONTROL_FUNCSTATE_RESET &&\n             OHCI_REG->control_bit.hc_functional_state != OHCI_CONTROL_FUNCSTATE_OPERATIONAL) {\n    //If OHCI hardware has come from warm-boot, signal resume (Ref OHCI spec 5.1.1.3.4)\n    //Wait 20 ms. (Ref Usb spec 7.1.7.7)\n    OHCI_REG->control_bit.hc_functional_state = OHCI_CONTROL_FUNCSTATE_RESUME;\n    tusb_time_delay_ms_api(20);\n  }\n\n  hcd_dcache_clean(&ohci_data, sizeof(ohci_data));\n\n  // reset controller\n  OHCI_REG->command_status_bit.controller_reset = 1;\n  while( OHCI_REG->command_status_bit.controller_reset ) {} // should not take longer than 10 us\n\n  //------------- init ohci registers -------------//\n  OHCI_REG->control_head_ed = (uint32_t) _phys_addr(&ohci_data.control[0].ed);\n  OHCI_REG->bulk_head_ed    = (uint32_t) _phys_addr(&ohci_data.bulk_head_ed);\n  OHCI_REG->hcca            = (uint32_t) _phys_addr(&ohci_data.hcca);\n\n  OHCI_REG->interrupt_disable = OHCI_REG->interrupt_enable; // disable all interrupts\n  OHCI_REG->interrupt_status  = OHCI_REG->interrupt_status; // clear current set bits\n  OHCI_REG->interrupt_enable  = OHCI_INT_WRITEBACK_DONEHEAD_MASK | OHCI_INT_RESUME_DETECTED_MASK |\n      OHCI_INT_UNRECOVERABLE_ERROR_MASK | OHCI_INT_FRAME_OVERFLOW_MASK | OHCI_INT_RHPORT_STATUS_CHANGE_MASK |\n      OHCI_INT_MASTER_ENABLE_MASK;\n\n  OHCI_REG->control = OHCI_CONTROL_CONTROL_BULK_RATIO | OHCI_CONTROL_LIST_CONTROL_ENABLE_MASK |\n       OHCI_CONTROL_LIST_BULK_ENABLE_MASK | OHCI_CONTROL_LIST_PERIODIC_ENABLE_MASK; // TODO Isochronous\n\n  OHCI_REG->frame_interval = (OHCI_FMINTERVAL_FSMPS << 16) | OHCI_FMINTERVAL_FI;\n  OHCI_REG->frame_interval ^= (1ul << 31); //Must toggle when frame_interval is updated.\n  OHCI_REG->periodic_start = (OHCI_FMINTERVAL_FI * 9) / 10; // Periodic start is 90% of frame interval\n\n  OHCI_REG->control_bit.hc_functional_state = OHCI_CONTROL_FUNCSTATE_OPERATIONAL; // make HC's state to operational state TODO use this to suspend (save power)\n  OHCI_REG->rh_status_bit.local_power_status_change = 1; // set global power for ports\n\n  tusb_time_delay_ms_api(OHCI_REG->rh_descriptorA_bit.power_on_to_good_time * 2); // Wait POTG after power up\n\n  return true;\n}\n\nuint32_t hcd_frame_number(uint8_t rhport)\n{\n  (void) rhport;\n  return (ohci_data.frame_number_hi << 16) | OHCI_REG->frame_number;\n}\n\n//--------------------------------------------------------------------+\n// PORT API\n//--------------------------------------------------------------------+\nvoid hcd_port_reset(uint8_t hostid)\n{\n  OHCI_REG->rhport_status[hostid] = RHPORT_PORT_RESET_STATUS_MASK;\n}\n\nvoid hcd_port_reset_end(uint8_t rhport)\n{\n  (void) rhport;\n}\n\nbool hcd_port_connect_status(uint8_t hostid)\n{\n  return OHCI_REG->rhport_status_bit[hostid].current_connect_status;\n}\n\ntusb_speed_t hcd_port_speed_get(uint8_t hostid)\n{\n  return OHCI_REG->rhport_status_bit[hostid].low_speed_device_attached ? TUSB_SPEED_LOW : TUSB_SPEED_FULL;\n}\n\n// endpoints are tied to an address, which only reclaim after a long delay when enumerating\n// thus there is no need to make sure ED is not in HC's cahed as it will not for sure\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  // TODO OHCI\n  (void) rhport;\n\n  // addr0 serves as static head --> only set skip bit\n  if (dev_addr == 0) {\n    ohci_ed_t* ed = ed_control(0);\n    ed->w0.skip = 1;\n  } else {\n    ed_list_remove_by_addr(p_ed_head[TUSB_XFER_CONTROL], dev_addr); // remove control\n    ed_list_remove_by_addr(p_ed_head[TUSB_XFER_BULK], dev_addr); // remove bulk\n    ed_list_remove_by_addr(p_ed_head[TUSB_XFER_INTERRUPT], dev_addr); // remove interrupt\n    // TODO remove ISO\n  }\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n//--------------------------------------------------------------------+\n// List Helper\n//--------------------------------------------------------------------+\nstatic inline tusb_xfer_type_t ed_get_xfer_type(ohci_ed_word0_t w0) {\n  return (w0.ep_number == 0   ) ? TUSB_XFER_CONTROL     :\n         (w0.is_iso           ) ? TUSB_XFER_ISOCHRONOUS :\n         (w0.is_interrupt_xfer) ? TUSB_XFER_INTERRUPT   : TUSB_XFER_BULK;\n}\n\nstatic void ed_init(ohci_ed_t *p_ed, uint8_t dev_addr, uint16_t ep_size, uint8_t ep_addr, uint8_t xfer_type, uint8_t interval) {\n  (void) interval;\n\n  // address 0 is used as async head, which always on the list --> cannot be cleared\n  if (dev_addr != 0) {\n    p_ed->td_tail = 0;\n    p_ed->td_head.address = 0;\n    p_ed->next = 0;\n  }\n\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(dev_addr, &bus_info);\n\n  ohci_ed_word0_t w0 = {.value = 0};\n  w0.dev_addr          = dev_addr;\n  w0.ep_number         = ep_addr & 0x0F;\n  w0.pid               = (xfer_type == TUSB_XFER_CONTROL) ? PID_FROM_TD : (tu_edpt_dir(ep_addr) ? PID_IN : PID_OUT);\n  w0.speed             = bus_info.speed;\n  w0.is_iso            = (xfer_type == TUSB_XFER_ISOCHRONOUS) ? 1 : 0;\n  w0.max_packet_size   = ep_size;\n\n  w0.used              = 1;\n  w0.is_interrupt_xfer = (xfer_type == TUSB_XFER_INTERRUPT ? 1 : 0);\n  p_ed->w0 = w0;\n}\n\nstatic void gtd_init(ohci_gtd_t *p_td, uint8_t *data_ptr, uint16_t total_bytes) {\n  tu_memclr(p_td, sizeof(ohci_gtd_t));\n\n  p_td->used = 1;\n  gtd_get_extra_data(p_td)->expected_bytes = total_bytes;\n\n  p_td->buffer_rounding = 1; // less than queued length is not a error\n  p_td->delay_interrupt = OHCI_INT_ON_COMPLETE_NO;\n  p_td->condition_code = OHCI_CCODE_NOT_ACCESSED;\n\n  uint8_t *cbp = (uint8_t *) _phys_addr(data_ptr);\n\n  p_td->current_buffer_pointer = cbp;\n  if ( total_bytes ) {\n    p_td->buffer_end = _phys_addr(data_ptr + total_bytes - 1);\n  } else {\n    p_td->buffer_end = cbp;\n  }\n}\n\nstatic ohci_ed_t* ed_from_addr(uint8_t dev_addr, uint8_t ep_addr) {\n  if (tu_edpt_number(ep_addr) == 0) {\n    return ed_control(dev_addr);\n  }\n\n  ohci_ed_t* ed_pool = ohci_data.ed_pool;\n  for (size_t i = 0; i < ED_MAX; i++) {\n    ohci_ed_t* qhd = hcd_dcache_uncached(&ed_pool[i]);\n    if ((qhd->w0.dev_addr == dev_addr) &&\n        ep_addr == tu_edpt_addr(qhd->w0.ep_number, qhd->w0.pid == PID_IN)) {\n      return qhd;\n    }\n  }\n\n  return NULL;\n}\n\nstatic ohci_ed_t* ed_find_free(void) {\n  ohci_ed_t* ed_pool = ohci_data.ed_pool;\n  for (size_t i = 0; i < ED_MAX; i++) {\n    ohci_ed_t* qhd = hcd_dcache_uncached(&ed_pool[i]);\n    if (!qhd->w0.used) {\n      return qhd;\n    }\n  }\n  return NULL;\n}\n\nstatic void ed_list_insert(ohci_ed_t * p_pre, ohci_ed_t * p_ed) {\n  p_ed->next = p_pre->next;\n  p_pre->next = (uint32_t) _phys_addr(p_ed);\n}\n\nstatic void ed_list_remove_by_addr(ohci_ed_t * p_head, uint8_t dev_addr) {\n  ohci_ed_t* p_prev = p_head;\n\n  while (p_prev->next) {\n    ohci_ed_t* ed = (ohci_ed_t*)_virt_addr((void*)p_prev->next);\n\n    if (ed->w0.dev_addr == dev_addr) {\n      // Prevent Host Controller from processing this ED while we remove it\n      ed->w0.skip = 1;\n\n      // unlink ed, will also move up p_prev\n      p_prev->next = ed->next;\n\n      // point the removed ED's next pointer to list head to make sure HC can always safely move away from this ED\n      ed->next = (uint32_t)_phys_addr(p_head);\n      ed->w0.used = 0;\n      ed->w0.skip = 0;\n    } else {\n      p_prev = (ohci_ed_t*)_virt_addr((void*)p_prev->next);\n    }\n  }\n}\n\nstatic ohci_gtd_t* gtd_find_free(void) {\n  for (uint8_t i = 0; i < GTD_MAX; i++) {\n    if (!ohci_data.gtd_pool[i].used) {\n      return &ohci_data.gtd_pool[i];\n    }\n  }\n  return NULL;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const* ep_desc) {\n  (void)rhport;\n\n  // TODO iso support\n  TU_ASSERT(ep_desc->bmAttributes.xfer != TUSB_XFER_ISOCHRONOUS);\n\n  //------------- Prepare Queue Head -------------//\n  ohci_ed_t* p_ed;\n  if (ep_desc->bEndpointAddress == 0) {\n    p_ed = ed_control(dev_addr);\n  } else {\n    p_ed = ed_find_free();\n  }\n  TU_ASSERT(p_ed);\n\n  ed_init(p_ed, dev_addr, tu_edpt_packet_size(ep_desc), ep_desc->bEndpointAddress,\n          ep_desc->bmAttributes.xfer, ep_desc->bInterval);\n\n  // control of dev0 is used as static async head\n  if (dev_addr == 0) {\n    p_ed->w0.skip = 0; // only need to clear skip bit\n    return true;\n  }\n\n  if (tu_edpt_number(ep_desc->bEndpointAddress) != 0) {\n    // Get an empty TD and use it as the end-of-list marker.\n    // This marker TD will be used when a transfer is made on this EP\n    // (and a new, empty TD will be allocated for the next-next transfer).\n    ohci_gtd_t* gtd = gtd_find_free();\n    TU_ASSERT(gtd);\n    p_ed->td_head.address = (uint32_t)_phys_addr(gtd);\n    p_ed->td_tail = (uint32_t)_phys_addr(gtd);\n  }\n\n  ed_list_insert(p_ed_head[ep_desc->bmAttributes.xfer], p_ed);\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  (void) rhport; (void) daddr; (void) ep_addr;\n  return false; // TODO not implemented yet\n}\n\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8]) {\n  (void) rhport;\n\n  ohci_ed_t* ed   = ed_control(dev_addr);\n  ohci_gtd_t *qtd = &ohci_data.control[dev_addr].gtd;\n\n  hcd_dcache_clean(setup_packet, 8);\n\n  gtd_init(qtd, (uint8_t*)(uintptr_t) setup_packet, 8);\n  qtd->index           = dev_addr;\n  qtd->pid             = PID_SETUP;\n  qtd->data_toggle     = GTD_DT_DATA0;\n  qtd->delay_interrupt = OHCI_INT_ON_COMPLETE_YES;\n  hcd_dcache_clean(qtd, sizeof(ohci_gtd_t));\n\n  //------------- Attach TDs list to Control Endpoint -------------//\n  ed->td_head.address = (uint32_t) _phys_addr(qtd);\n\n  OHCI_REG->command_status_bit.control_list_filled = 1;\n\n  return true;\n}\n\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t buflen) {\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  // IN transfer: invalidate buffer, OUT transfer: clean buffer\n  if (dir) {\n    hcd_dcache_invalidate(buffer, buflen);\n  } else {\n    hcd_dcache_clean(buffer, buflen);\n  }\n\n  ohci_ed_t * ed = ed_from_addr(dev_addr, ep_addr);\n  TU_ASSERT(ed);\n  if (epnum == 0) {\n    ohci_gtd_t* gtd = &ohci_data.control[dev_addr].gtd;\n    gtd_init(gtd, buffer, buflen);\n    gtd->index           = dev_addr;\n    gtd->pid = dir ? PID_IN : PID_OUT;\n    gtd->data_toggle = GTD_DT_DATA1; // Both Data and Ack stage start with DATA1\n    gtd->delay_interrupt = OHCI_INT_ON_COMPLETE_YES;\n    hcd_dcache_clean(gtd, sizeof(ohci_gtd_t));\n\n    ed->td_head.address = (uint32_t)_phys_addr(gtd);\n\n    OHCI_REG->command_status_bit.control_list_filled = 1;\n  } else {\n    tusb_xfer_type_t xfer_type = ed_get_xfer_type(ed->w0);\n    ohci_gtd_t* gtd = (ohci_gtd_t*)_virt_addr((void*)ed->td_tail);\n\n    gtd_init(gtd, buffer, buflen);\n    gtd->index = ed-ohci_data.ed_pool;\n    gtd->delay_interrupt = OHCI_INT_ON_COMPLETE_YES;\n\n    // Insert a new, empty TD at the tail, to be used by the next transfer\n    ohci_gtd_t* new_gtd = gtd_find_free();\n    TU_ASSERT(new_gtd);\n\n    gtd->next = (uint32_t)_phys_addr(new_gtd);\n    hcd_dcache_clean(gtd, sizeof(ohci_gtd_t));\n\n    ed->td_tail = (uint32_t)_phys_addr(new_gtd);\n\n    if (TUSB_XFER_BULK == xfer_type) {\n      OHCI_REG->command_status_bit.bulk_list_filled = 1;\n    }\n  }\n\n  return true;\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n  // TODO not implemented yet\n  return false;\n}\n\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  ohci_ed_t * const p_ed = ed_from_addr(dev_addr, ep_addr);\n  TU_ASSERT(p_ed);\n\n  ohci_ed_word2_t td_head = p_ed->td_head;\n  td_head.toggle = 0; // reset data toggle\n  td_head.halted = 0;\n  p_ed->td_head = td_head;\n\n  if (TUSB_XFER_BULK == ed_get_xfer_type(p_ed->w0)) {\n    OHCI_REG->command_status_bit.bulk_list_filled = 1;\n  }\n\n  return true;\n}\n\n\n//--------------------------------------------------------------------+\n// OHCI Interrupt Handler\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline bool is_itd(ohci_td_item_t* item) {\n  (void) item;\n  return false; // ISO not supported yet\n}\n\nstatic ohci_td_item_t* list_reverse(ohci_td_item_t* td_head) {\n  ohci_td_item_t* td_reverse_head = NULL;\n  while(td_head != NULL) {\n    td_head = _virt_addr(td_head);\n    const uint32_t item_size = is_itd(td_head) ? sizeof(ohci_itd_t) : sizeof(ohci_gtd_t);\n    hcd_dcache_invalidate(td_head, item_size);\n    const uint32_t next = td_head->next;\n\n    // make current's item become reverse's first item\n    td_head->next = (uint32_t) td_reverse_head;\n    td_reverse_head  = _phys_addr(td_head);\n\n    td_head = (ohci_td_item_t*) next; // advance to next item\n  }\n\n  return _virt_addr(td_reverse_head);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool gtd_is_control(ohci_gtd_t const * const p_qtd) {\n  return ((uint32_t) p_qtd) < ((uint32_t) ohci_data.gtd_pool); // check ohci_data_t for memory layout\n}\n\nTU_ATTR_ALWAYS_INLINE static inline ohci_ed_t* gtd_get_ed(ohci_gtd_t const* const p_qtd) {\n  ohci_ed_t* ed;\n  if (gtd_is_control(p_qtd)) {\n    ed = &ohci_data.control[p_qtd->index].ed;\n  } else {\n    ed = &ohci_data.ed_pool[p_qtd->index];\n  }\n  return hcd_dcache_uncached(ed);\n}\n\nstatic gtd_extra_data_t *gtd_get_extra_data(ohci_gtd_t const * const gtd) {\n  if (gtd_is_control(gtd)) {\n    uint8_t idx = ((uintptr_t)gtd - (uintptr_t)&ohci_data.control->gtd) / sizeof(ohci_data.control[0]);\n    return &ohci_data.gtd_extra_control[idx];\n  }else {\n    return &ohci_data.gtd_extra[gtd - ohci_data.gtd_pool];\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t gtd_xfer_byte_left(uint32_t buffer_end, uint32_t current_buffer) {\n  // 5.2.9 OHCI sample code\n  // CBP is 0 mean all data is transferred\n  if (current_buffer == 0) {\n    return 0;\n  }\n\n  return (tu_align4k(buffer_end ^ current_buffer) ? 0x1000 : 0) +\n         tu_offset4k(buffer_end) - tu_offset4k(current_buffer) + 1;\n}\n\nstatic void done_queue_isr(uint8_t hostid) {\n  (void)hostid;\n\n  // done head is written in reversed order of completion --> need to reverse the done queue first\n  ohci_td_item_t* td_head = list_reverse((ohci_td_item_t*)tu_align16(ohci_data.hcca.done_head));\n  ohci_data.hcca.done_head = 0;\n\n  while (td_head != NULL) {\n    // TODO check if td_head is iso td\n    //------------- Non ISO transfer -------------//\n    ohci_gtd_t* const qtd = (ohci_gtd_t*) td_head;\n    xfer_result_t const event = (qtd->condition_code == OHCI_CCODE_NO_ERROR) ? XFER_RESULT_SUCCESS :\n                                (qtd->condition_code == OHCI_CCODE_STALL) ? XFER_RESULT_STALLED : XFER_RESULT_FAILED;\n    qtd->used = 0; // free TD\n    if ((qtd->delay_interrupt == OHCI_INT_ON_COMPLETE_YES) || (event != XFER_RESULT_SUCCESS)) {\n      const ohci_ed_t* ed = gtd_get_ed(qtd);\n      const ohci_ed_word0_t ed_w0 = ed->w0;\n      const uint32_t xferred_bytes = gtd_get_extra_data(qtd)->expected_bytes - gtd_xfer_byte_left((uint32_t)qtd->buffer_end, (uint32_t)qtd->current_buffer_pointer);\n      uint8_t dir = (ed_w0.ep_number == 0) ? (qtd->pid == PID_IN) : (ed_w0.pid == PID_IN);\n      const uint8_t ep_addr = tu_edpt_addr(ed_w0.ep_number, dir);\n      hcd_event_xfer_complete(ed_w0.dev_addr, ep_addr, xferred_bytes, event, true);\n    }\n\n    td_head = (ohci_td_item_t*)_virt_addr((void*)td_head->next);\n  }\n}\n\nvoid hcd_int_handler(uint8_t hostid, bool in_isr) {\n  (void)in_isr;\n  uint32_t const int_en = OHCI_REG->interrupt_enable;\n  uint32_t const int_status = OHCI_REG->interrupt_status & int_en;\n\n  if (int_status == 0) {\n    return;\n  }\n\n  // Disable MIE as per OHCI spec 5.3\n  OHCI_REG->interrupt_disable = OHCI_INT_MASTER_ENABLE_MASK;\n\n  // Frame number overflow\n  if (int_status & OHCI_INT_FRAME_OVERFLOW_MASK) {\n    ohci_data.frame_number_hi++;\n  }\n\n  //------------- RootHub status -------------//\n  if (int_status & OHCI_INT_RHPORT_STATUS_CHANGE_MASK) {\n    for (int i = 0; i < TUP_OHCI_RHPORTS; i++) {\n      uint32_t const rhport_status = OHCI_REG->rhport_status[i] & RHPORT_ALL_CHANGE_MASK;\n      if (rhport_status & RHPORT_CONNECT_STATUS_CHANGE_MASK) {\n        // TODO check if remote wake-up\n        if (OHCI_REG->rhport_status_bit[i].current_connect_status) {\n          // TODO reset port immediately, without this controller will got 2-3 (debouncing connection status change)\n          OHCI_REG->rhport_status[i] = RHPORT_PORT_RESET_STATUS_MASK;\n          hcd_event_device_attach(i, true);\n        } else {\n          hcd_event_device_remove(i, true);\n        }\n      }\n\n      if (rhport_status & RHPORT_PORT_SUSPEND_CHANGE_MASK) {\n      }\n\n      OHCI_REG->rhport_status[i] = rhport_status; // acknowledge all interrupt\n    }\n  }\n\n  //------------- Transfer Complete -------------//\n  if (int_status & OHCI_INT_WRITEBACK_DONEHEAD_MASK) {\n    done_queue_isr(hostid);\n  }\n\n  OHCI_REG->interrupt_status = int_status; // Acknowledge handled interrupt\n  OHCI_REG->interrupt_enable = OHCI_INT_MASTER_ENABLE_MASK; // Enable MIE\n}\n//--------------------------------------------------------------------+\n// HELPER\n//--------------------------------------------------------------------+\n\n\n#endif\n"
  },
  {
    "path": "src/portable/ohci/ohci.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_OHCI_H_\n#define TUSB_OHCI_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// OHCI CONFIGURATION & CONSTANTS\n//--------------------------------------------------------------------+\n#define HOST_HCD_XFER_INTERRUPT // TODO interrupt is used widely, should always be enabled\n#define OHCI_PERIODIC_LIST (defined HOST_HCD_XFER_INTERRUPT || defined HOST_HCD_XFER_ISOCHRONOUS)\n\n// TODO merge OHCI with EHCI\nenum {\n  OHCI_MAX_ITD = 4\n};\n\n#define ED_MAX       (CFG_TUH_DEVICE_MAX*CFG_TUH_ENDPOINT_MAX)\n#define GTD_MAX      ED_MAX\n\n// tinyUSB's OHCI implementation caps number of EDs to 8 bits\nTU_VERIFY_STATIC (ED_MAX <= 256, \"Reduce CFG_TUH_DEVICE_MAX or CFG_TUH_ENDPOINT_MAX\");\n\n#define GTD_ALIGN_SIZE TU_MAX(CFG_TUH_MEM_DCACHE_LINE_SIZE, 16)\n#define ED_ALIGN_SIZE  TU_MAX(CFG_TUH_MEM_DCACHE_LINE_SIZE, 16)\n#define ITD_ALIGN_SIZE TU_MAX(CFG_TUH_MEM_DCACHE_LINE_SIZE, 32)\n\n//--------------------------------------------------------------------+\n// OHCI Data Structure\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint32_t interrupt_table[32];\n  volatile uint16_t frame_number;\n  volatile uint16_t frame_pad;\n  volatile uint32_t done_head;\n  uint8_t reserved[116+4];  // TODO try to make use of this area if possible, extra 4 byte to make the whole struct size = 256\n}ohci_hcca_t; // TU_ATTR_ALIGNED(256)\n\nTU_VERIFY_STATIC( sizeof(ohci_hcca_t) == 256, \"size is not correct\" );\n\n// An OHCI host controller is controlled using data structures placed in memory (RAM).\n// It needs to both read and write these data structures (as defined by the OHCI specification),\n// and this can be mentally conceptualized similar to two software threads running on\n// two different CPUs. In order to prevent a _data race_ where data gets corrupted,\n// the CPU and the OHCI host controller need to agree on how the memory should be accessed.\n// In this driver, we do this by transferring logical ownership of transfer descriptors (TDs)\n// between the CPU and the OHCI host controller. Only the device which holds the logical ownership\n// is allowed to read or write the TD. This ownership is not visible anywhere in the code,\n// but it instead must be inferred based on the logical state of the transfer.\n//\n// If dcache-supporting mode is enabled, we need to do additional manual cache operations\n// in order to correctly transfer this logical ownership and prevent data corruption.\n// In order to do this, we also choose to align each OHCI TD so that it doesn't\n// share CPU cache lines with other TDs. This is because manual cache operations\n// can only be performed on cache line granularity. In other words, one cache line is\n// the _smallest_ amount that can be read/written at a time. If there were to be multiple TDs\n// in the same cache line, they would be required to always have the same logical ownership.\n// This ends up being impossible to guarantee, so we choose a design which avoids the situation entirely.\n\n// common link item for gtd and itd for list travel\ntypedef struct TU_ATTR_ALIGNED(16) {\n  uint32_t reserved[2];\n  volatile uint32_t next;\n  uint32_t reserved2;\n}ohci_td_item_t;\n\ntypedef struct TU_ATTR_ALIGNED(GTD_ALIGN_SIZE) {\n  // Word 0\n  uint32_t used                    : 1;\n  uint32_t index                   : 8; // endpoint index the gtd belongs to, or device address in case of control xfer\n  uint32_t                         : 9; // can be used\n  uint32_t buffer_rounding         : 1;\n  uint32_t pid                     : 2;\n  uint32_t delay_interrupt         : 3;\n  volatile uint32_t data_toggle    : 2;\n  volatile uint32_t error_count    : 2;\n  volatile uint32_t condition_code : 4;\n\n  // Word 1\n  uint8_t* volatile current_buffer_pointer;\n\n  // Word 2 : next TD\n  volatile uint32_t next;\n\n  // Word 3\n  uint8_t* buffer_end;\n} ohci_gtd_t;\nTU_VERIFY_STATIC(sizeof(ohci_gtd_t) == GTD_ALIGN_SIZE, \"size is not correct\" );\n\ntypedef union {\n  struct {\n    uint32_t dev_addr          : 7;\n    uint32_t ep_number         : 4;\n    uint32_t pid               : 2;\n    uint32_t speed             : 1;\n    uint32_t skip              : 1;\n    uint32_t is_iso            : 1;\n    uint32_t max_packet_size   : 11;\n    // HCD: make use of 5 reserved bits\n    uint32_t used              : 1;\n    uint32_t is_interrupt_xfer : 1;\n    uint32_t                   : 3;\n  };\n  uint32_t value;\n} ohci_ed_word0_t;\nTU_VERIFY_STATIC(sizeof(ohci_ed_word0_t) == 4, \"size is not correct\" );\n\ntypedef union {\n  uint32_t address;\n  struct {\n    uint32_t halted : 1;\n    uint32_t toggle : 1;\n    uint32_t : 30;\n  };\n} ohci_ed_word2_t;\nTU_VERIFY_STATIC(sizeof(ohci_ed_word2_t) == 4, \"size is not correct\" );\n\ntypedef struct TU_ATTR_ALIGNED(ED_ALIGN_SIZE) {\n  ohci_ed_word0_t w0; // Word 0\n  uint32_t td_tail; // Word 1\n  volatile ohci_ed_word2_t td_head; // Word 2\n  uint32_t next; // Word 3\n} ohci_ed_t;\nTU_VERIFY_STATIC(sizeof(ohci_ed_t) == ED_ALIGN_SIZE, \"size is not correct\" );\n\ntypedef struct TU_ATTR_ALIGNED(ITD_ALIGN_SIZE) {\n  /*---------- Word 1 ----------*/\n  uint32_t starting_frame          : 16;\n  uint32_t                         : 5; // can be used\n  uint32_t delay_interrupt         : 3;\n  uint32_t frame_count             : 3;\n  uint32_t                         : 1; // can be used\n  volatile uint32_t condition_code : 4;\n\n\n  /*---------- Word 2 ----------*/\n  uint32_t buffer_page0; // 12 lsb bits can be used\n\n  /*---------- Word 3 ----------*/\n  volatile uint32_t next;\n\n  /*---------- Word 4 ----------*/\n  uint32_t buffer_end;\n\n  /*---------- Word 5-8 ----------*/\n  volatile uint16_t offset_packetstatus[8];\n} ohci_itd_t;\nTU_VERIFY_STATIC(sizeof(ohci_itd_t) == ITD_ALIGN_SIZE, \"size is not correct\" );\n\ntypedef struct {\n  uint16_t expected_bytes; // up to 8192 bytes so max is 13 bits\n} gtd_extra_data_t;\nTU_VERIFY_STATIC(sizeof(gtd_extra_data_t) == 2, \"size is not correct\" );\n\n// structure with member alignment required from large to small\ntypedef struct TU_ATTR_ALIGNED(256) {\n  ohci_hcca_t hcca;\n\n  ohci_ed_t bulk_head_ed; // static bulk head (dummy)\n  ohci_ed_t period_head_ed; // static periodic list head (dummy)\n\n  // control endpoints has reserved resources\n  struct {\n    ohci_ed_t ed;\n    ohci_gtd_t gtd;\n  } control[CFG_TUH_DEVICE_MAX + CFG_TUH_HUB + 1];\n\n  //  ochi_itd_t itd[OHCI_MAX_ITD]; // itd requires alignment of 32\n  ohci_ed_t ed_pool[ED_MAX];\n  ohci_gtd_t gtd_pool[GTD_MAX];\n\n  // extra data needed by TDs that can't fit in the TD struct\n  gtd_extra_data_t gtd_extra_control[CFG_TUH_DEVICE_MAX + CFG_TUH_HUB + 1];\n  gtd_extra_data_t gtd_extra[GTD_MAX];\n\n  volatile uint16_t frame_number_hi;\n} ohci_data_t;\n\n//--------------------------------------------------------------------+\n// OHCI Operational Register\n//--------------------------------------------------------------------+\n\n\n//--------------------------------------------------------------------+\n// OHCI Data Organization\n//--------------------------------------------------------------------+\ntypedef volatile struct\n{\n  uint32_t revision;                               // 0x00\n\n  union {\n    uint32_t control;                              // 0x04\n    struct {\n      uint32_t control_bulk_service_ratio : 2;\n      uint32_t periodic_list_enable       : 1;\n      uint32_t isochronous_enable         : 1;\n      uint32_t control_list_enable        : 1;\n      uint32_t bulk_list_enable           : 1;\n      uint32_t hc_functional_state        : 2;\n      uint32_t interrupt_routing          : 1;\n      uint32_t remote_wakeup_connected    : 1;\n      uint32_t remote_wakeup_enale        : 1;\n      uint32_t TU_RESERVED                : 21;\n    }control_bit;\n  };\n\n  union {\n    uint32_t command_status;                       // 0x08\n    struct {\n      uint32_t controller_reset         : 1;\n      uint32_t control_list_filled      : 1;\n      uint32_t bulk_list_filled         : 1;\n      uint32_t ownership_change_request : 1;\n      uint32_t                          : 12;\n      uint32_t scheduling_overrun_count : 2;\n    }command_status_bit;\n  };\n\n  uint32_t interrupt_status;                       // 0x0C\n  uint32_t interrupt_enable;                       // 0x10\n  uint32_t interrupt_disable;                      // 0x14\n  uint32_t hcca;                                   // 0x18\n  uint32_t period_current_ed;                      // 0x1C\n  uint32_t control_head_ed;                        // 0x20\n  uint32_t control_current_ed;                     // 0x24\n  uint32_t bulk_head_ed;                           // 0x28\n  uint32_t bulk_current_ed;                        // 0x2C\n  uint32_t done_head;                              // 0x30\n  uint32_t frame_interval;                         // 0x34\n  uint32_t frame_remaining;                        // 0x38\n  uint32_t frame_number;                           // 0x3C\n  uint32_t periodic_start;                         // 0x40\n  uint32_t lowspeed_threshold;                     // 0x44\n\n  union {\n    uint32_t rh_descriptorA;                       // 0x48\n    struct {\n      uint32_t number_downstream_ports     : 8;\n      uint32_t power_switching_mode        : 1;\n      uint32_t no_power_switching          : 1;\n      uint32_t device_type                 : 1;\n      uint32_t overcurrent_protection_mode : 1;\n      uint32_t no_over_current_protection  : 1;\n      uint32_t reserved                    : 11;\n      uint32_t power_on_to_good_time       : 8;\n    } rh_descriptorA_bit;\n  };\n\n  union {\n    uint32_t rh_descriptorB;                       // 0x4C\n    struct {\n      uint32_t device_removable        : 16;\n      uint32_t port_power_control_mask : 16;\n    } rh_descriptorB_bit;\n  };\n\n  union {\n    uint32_t rh_status;                            // 0x50\n    struct {\n      uint32_t local_power_status            : 1;  // read Local Power Status; write: Clear Global Power\n      uint32_t over_current_indicator        : 1;\n      uint32_t                               : 13;\n      uint32_t device_remote_wakeup_enable   : 1;\n      uint32_t local_power_status_change     : 1;\n      uint32_t over_current_indicator_change : 1;\n      uint32_t                               : 13;\n      uint32_t clear_remote_wakeup_enable    : 1;\n    }rh_status_bit;\n  };\n\n  union {\n    uint32_t rhport_status[TUP_OHCI_RHPORTS];      // 0x54\n\n    struct {\n      uint32_t current_connect_status             : 1;\n      uint32_t port_enable_status                 : 1;\n      uint32_t port_suspend_status                : 1;\n      uint32_t port_over_current_indicator        : 1;\n      uint32_t port_reset_status                  : 1;\n      uint32_t                                    : 3;\n      uint32_t port_power_status                  : 1;\n      uint32_t low_speed_device_attached          : 1;\n      uint32_t                                    : 6;\n      uint32_t connect_status_change              : 1;\n      uint32_t port_enable_status_change          : 1;\n      uint32_t port_suspend_status_change         : 1;\n      uint32_t port_over_current_indicator_change : 1;\n      uint32_t port_reset_status_change           : 1;\n      uint32_t TU_RESERVED                        : 11;\n    }rhport_status_bit[TUP_OHCI_RHPORTS];\n  };\n}ohci_registers_t;\n\nTU_VERIFY_STATIC( sizeof(ohci_registers_t) == (0x54 + (4 * TUP_OHCI_RHPORTS)), \"size is not correct\");\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_OHCI_H_ */\n"
  },
  {
    "path": "src/portable/ohci/ohci_nxp.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_OHCI_NXP_H\n#define TUSB_OHCI_NXP_H\n\n#if TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)\n\n#include \"chip.h\"\n#define OHCI_REG   ((ohci_registers_t *) LPC_USB_BASE)\n\nvoid hcd_int_enable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_EnableIRQ(USB_IRQn);\n}\n\nvoid hcd_int_disable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_DisableIRQ(USB_IRQn);\n}\n\nstatic void ohci_phy_init(uint8_t rhport) {\n  (void) rhport;\n}\n\n#else\n\n#include \"fsl_device_registers.h\"\n\n// for LPC55 USB0 controller\n#define OHCI_REG  ((ohci_registers_t *) USBFSH_BASE)\n\nstatic void ohci_phy_init(uint8_t rhport) {\n  (void) rhport;\n}\n\nvoid hcd_int_enable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_EnableIRQ(USB0_IRQn);\n}\n\nvoid hcd_int_disable(uint8_t rhport) {\n  (void)rhport;\n  NVIC_DisableIRQ(USB0_IRQn);\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/raspberrypi/pio_usb/dcd_pio_usb.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && (CFG_TUSB_MCU == OPT_MCU_RP2040) && CFG_TUD_RPI_PIO_USB\n\n#include \"pico.h\"\n#include \"pio_usb.h\"\n#include \"pio_usb_ll.h\"\n\n#include \"device/dcd.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n#define RHPORT_OFFSET     1\n#define RHPORT_PIO(_x)    ((_x)-RHPORT_OFFSET)\n\n//-------------  -------------//\nstatic usb_device_t *usb_device = NULL;\nstatic usb_descriptor_buffers_t desc;\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\n\n// Initialize controller to device mode\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n  static pio_usb_configuration_t config = PIO_USB_DEFAULT_CONFIG;\n  usb_device = pio_usb_device_init(&config, &desc);\n\n  return true;\n}\n\n// Enable device interrupt\nvoid dcd_int_enable (uint8_t rhport)\n{\n  (void) rhport;\n}\n\n// Disable device interrupt\nvoid dcd_int_disable (uint8_t rhport)\n{\n  (void) rhport;\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address (uint8_t rhport, uint8_t dev_addr)\n{\n  // must be called before queuing status\n  pio_usb_device_set_address(dev_addr);\n  dcd_edpt_xfer(rhport, 0x80, NULL, 0, false);\n}\n\n// Wake up host\nvoid dcd_remote_wakeup (uint8_t rhport)\n{\n  (void) rhport;\n}\n\n// Connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n}\n\n// Disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n// Configure endpoint's registers according to descriptor\nbool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_ep)\n{\n  (void) rhport;\n  return pio_usb_device_endpoint_open((uint8_t const*) desc_ep);\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n  endpoint_t *ep = pio_usb_device_get_endpoint_by_address(ep_addr);\n  return pio_usb_ll_transfer_start(ep, buffer, total_bytes);\n}\n\n// Submit a transfer where is managed by FIFO, When complete dcd_event_xfer_complete() is invoked to notify the stack - optional, however, must be listed in usbd.c\n//bool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n//{\n//  (void) rhport;\n//  (void) ep_addr;\n//  (void) ff;\n//  (void) total_bytes;\n//  return false;\n//}\n\n// Stall endpoint\nvoid dcd_edpt_stall (uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  endpoint_t *ep = pio_usb_device_get_endpoint_by_address(ep_addr);\n  ep->has_transfer = false;\n  ep->stalled = true;\n}\n\n// clear stall, data toggle is also reset to DATA0\nvoid dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  endpoint_t *ep = pio_usb_device_get_endpoint_by_address(ep_addr);\n  ep->data_id = 0;\n  ep->stalled = false;\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nstatic void __no_inline_not_in_flash_func(handle_endpoint_irq)(uint8_t tu_rhport, xfer_result_t result, volatile uint32_t* ep_reg)\n{\n  const uint32_t ep_all = *ep_reg;\n\n  for(uint8_t ep_idx = 0; ep_idx < PIO_USB_EP_POOL_CNT; ep_idx++)\n  {\n    uint32_t const mask = (1u << ep_idx);\n\n    if (ep_all & mask)\n    {\n      endpoint_t* ep = PIO_USB_ENDPOINT(ep_idx);\n      dcd_event_xfer_complete(tu_rhport, ep->ep_num, ep->actual_len, result, true);\n    }\n  }\n\n  // clear all\n  (*ep_reg) &= ~ep_all;\n}\n\n// IRQ Handler\nvoid __no_inline_not_in_flash_func(pio_usb_device_irq_handler)(uint8_t root_id)\n{\n  uint8_t const tu_rhport = root_id + 1;\n  root_port_t* rport = PIO_USB_ROOT_PORT(root_id);\n  uint32_t const ints = rport->ints;\n\n  if (ints & PIO_USB_INTS_RESET_END_BITS)\n  {\n    dcd_event_bus_reset(tu_rhport, TUSB_SPEED_FULL, true);\n  }\n\n  if (ints & PIO_USB_INTS_SETUP_REQ_BITS)\n  {\n    dcd_event_setup_received(tu_rhport, rport->setup_packet, true);\n  }\n\n  if ( ints & PIO_USB_INTS_ENDPOINT_COMPLETE_BITS )\n  {\n    handle_endpoint_irq(tu_rhport, XFER_RESULT_SUCCESS, &rport->ep_complete);\n  }\n\n  if ( ints & PIO_USB_INTS_ENDPOINT_STALLED_BITS )\n  {\n    handle_endpoint_irq(tu_rhport, XFER_RESULT_STALLED, &rport->ep_stalled);\n  }\n\n  if ( ints & PIO_USB_INTS_ENDPOINT_ERROR_BITS )\n  {\n    handle_endpoint_irq(tu_rhport, XFER_RESULT_FAILED, &rport->ep_error);\n  }\n\n  // clear all\n  rport->ints &= ~ints;\n}\n#endif\n"
  },
  {
    "path": "src/portable/raspberrypi/pio_usb/hcd_pio_usb.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && (CFG_TUSB_MCU == OPT_MCU_RP2040) && CFG_TUH_RPI_PIO_USB\n\n#include \"pico.h\"\n\n#include \"pio_usb.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\n#endif\n\n#include \"pio_usb_ll.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"osal/osal.h\"\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n\n#define RHPORT_OFFSET     1\n#define RHPORT_PIO(_x)    ((_x)-RHPORT_OFFSET)\n\nstatic pio_usb_configuration_t pio_host_cfg = PIO_USB_DEFAULT_CONFIG;\n\n//--------------------------------------------------------------------+\n// HCD API\n//--------------------------------------------------------------------+\nbool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param) {\n  (void) rhport;\n  TU_VERIFY(cfg_id == TUH_CFGID_RPI_PIO_USB_CONFIGURATION);\n  memcpy(&pio_host_cfg, cfg_param, sizeof(pio_usb_configuration_t));\n  return true;\n}\n\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  // To run USB SOF interrupt in core1, call this init in core1\n  pio_usb_host_init(&pio_host_cfg);\n\n  return true;\n}\n\nvoid hcd_port_reset(uint8_t rhport) {\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  pio_usb_host_port_reset_start(pio_rhport);\n}\n\nvoid hcd_port_reset_end(uint8_t rhport) {\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  pio_usb_host_port_reset_end(pio_rhport);\n}\n\nbool hcd_port_connect_status(uint8_t rhport) {\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n\n  root_port_t *root = PIO_USB_ROOT_PORT(pio_rhport);\n  port_pin_status_t line_state = pio_usb_bus_get_line_state(root);\n\n  return line_state != PORT_PIN_SE0;\n}\n\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  // TODO determine link speed\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  return PIO_USB_ROOT_PORT(pio_rhport)->is_fullspeed ? TUSB_SPEED_FULL : TUSB_SPEED_LOW;\n}\n\n// Close all opened endpoint belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  pio_usb_host_close_device(pio_rhport, dev_addr);\n}\n\nuint32_t hcd_frame_number(uint8_t rhport) {\n  (void) rhport;\n  return pio_usb_host_get_frame_number();\n}\n\nvoid hcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n}\n\nvoid hcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const *desc_ep) {\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(dev_addr, &bus_info);\n  bool const need_pre = (bus_info.hub_addr && bus_info.speed == TUSB_SPEED_LOW);\n\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  return pio_usb_host_endpoint_open(pio_rhport, dev_addr, (uint8_t const *) desc_ep, need_pre);\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  return pio_usb_host_endpoint_close(pio_rhport, daddr, ep_addr);\n}\n\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen) {\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  return pio_usb_host_endpoint_transfer(pio_rhport, dev_addr, ep_addr, buffer, buflen);\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  return pio_usb_host_endpoint_abort_transfer(pio_rhport, dev_addr, ep_addr);\n}\n\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8]) {\n  uint8_t const pio_rhport = RHPORT_PIO(rhport);\n  return pio_usb_host_send_setup(pio_rhport, dev_addr, setup_packet);\n}\n\n//bool hcd_edpt_busy(uint8_t dev_addr, uint8_t ep_addr)\n//{\n//    // EPX is shared, so multiple device addresses and endpoint addresses share that\n//    // so if any transfer is active on epx, we are busy. Interrupt endpoints have their own\n//    // EPX so ep->active will only be busy if there is a pending transfer on that interrupt endpoint\n//    // on that device\n//    pico_trace(\"hcd_edpt_busy dev addr %d ep_addr 0x%x\\r\\n\", dev_addr, ep_addr);\n//    struct hw_endpoint *ep = get_dev_ep(dev_addr, ep_addr);\n//    assert(ep);\n//    bool busy = ep->active;\n//    pico_trace(\"busy == %d\\r\\n\", busy);\n//    return busy;\n//}\n\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n\n  return true;\n}\n\nstatic void __no_inline_not_in_flash_func(handle_endpoint_irq)(root_port_t *rport, xfer_result_t result,\n                                                               volatile uint32_t *ep_reg) {\n  (void) rport;\n  const uint32_t ep_all = *ep_reg;\n\n  for ( uint8_t ep_idx = 0; ep_idx < PIO_USB_EP_POOL_CNT; ep_idx++ ) {\n    uint32_t const mask = (1u << ep_idx);\n\n    if ( ep_all & mask ) {\n      endpoint_t * ep = PIO_USB_ENDPOINT(ep_idx);\n      hcd_event_xfer_complete(ep->dev_addr, ep->ep_num, ep->actual_len, result, true);\n    }\n  }\n\n  // clear all\n  (*ep_reg) &= ~ep_all;\n}\n\n// IRQ Handler\nvoid __no_inline_not_in_flash_func(pio_usb_host_irq_handler)(uint8_t root_id) {\n  uint8_t const tu_rhport = root_id + 1;\n  root_port_t *rport = PIO_USB_ROOT_PORT(root_id);\n  uint32_t const ints = rport->ints;\n\n  if ( ints & PIO_USB_INTS_ENDPOINT_COMPLETE_BITS ) {\n    handle_endpoint_irq(rport, XFER_RESULT_SUCCESS, &rport->ep_complete);\n  }\n\n  if ( ints & PIO_USB_INTS_ENDPOINT_STALLED_BITS ) {\n    handle_endpoint_irq(rport, XFER_RESULT_STALLED, &rport->ep_stalled);\n  }\n\n  if ( ints & PIO_USB_INTS_ENDPOINT_ERROR_BITS ) {\n    handle_endpoint_irq(rport, XFER_RESULT_FAILED, &rport->ep_error);\n  }\n\n  if ( ints & PIO_USB_INTS_CONNECT_BITS ) {\n    hcd_event_device_attach(tu_rhport, true);\n  }\n\n  if ( ints & PIO_USB_INTS_DISCONNECT_BITS ) {\n    hcd_event_device_remove(tu_rhport, true);\n  }\n\n  // clear all\n  rport->ints &= ~ints;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/raspberrypi/rp2040/dcd_rp2040.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && (CFG_TUSB_MCU == OPT_MCU_RP2040) && !CFG_TUD_RPI_PIO_USB\n\n#include \"pico.h\"\n#include \"hardware/sync.h\"\n#include \"rp2040_usb.h\"\n\n#if TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX\n#include \"pico/fix/rp2040_usb_device_enumeration.h\"\n#endif\n\n#include \"device/dcd.h\"\n\n// Current implementation force vbus detection as always present, causing device think it is always plugged into host.\n// Therefore, it cannot detect disconnect event, mistaken it as suspend.\n// Note: won't work if change to 0 (for now)\n  #define FORCE_VBUS_DETECT 1\n\n  #define USB_INTS_ERROR_BITS                                                                 \\\n    (USB_INTS_ERROR_DATA_SEQ_BITS | USB_INTS_ERROR_BIT_STUFF_BITS | USB_INTS_ERROR_CRC_BITS | \\\n     USB_INTS_ERROR_RX_OVERFLOW_BITS | USB_INTS_ERROR_RX_TIMEOUT_BITS)\n\n/*------------------------------------------------------------------*/\n/* Low level controller\n *------------------------------------------------------------------*/\n// HW buffer pointer from USB buffer space (max 3840 bytes)\nstatic uint8_t *hw_buffer_ptr;\n\n// USB_MAX_ENDPOINTS Endpoints, direction TUSB_DIR_OUT for out and TUSB_DIR_IN for in.\nstatic struct hw_endpoint hw_endpoints[USB_MAX_ENDPOINTS][2];\n\n// SOF may be used by remote wakeup as RESUME, this indicates whether SOF is actually used by usbd\nstatic bool _sof_enable = false;\n\nTU_ATTR_ALWAYS_INLINE static inline hw_endpoint_t *hw_endpoint_get(uint8_t epnum, tusb_dir_t dir) {\n  return &hw_endpoints[epnum][dir];\n}\n\nTU_ATTR_ALWAYS_INLINE static inline hw_endpoint_t *hw_endpoint_get_by_addr(uint8_t ep_addr) {\n  const uint8_t    num = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir = tu_edpt_dir(ep_addr);\n  return hw_endpoint_get(num, dir);\n}\n\n// main processing for dcd_edpt_iso_activate\nstatic void hw_endpoint_init(hw_endpoint_t *ep, uint8_t ep_addr, uint16_t wMaxPacketSize, uint8_t transfer_type) {\n  ep->ep_addr        = ep_addr;\n  ep->next_pid       = 0u;\n  ep->wMaxPacketSize = wMaxPacketSize;\n\n  // Clear existing buffer control state\n  io_rw_32 *buf_ctrl_reg = hwbuf_ctrl_reg_device(ep);\n  *buf_ctrl_reg          = 0;\n\n  // allocated hw buffer\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  if (epnum == 0) {\n    // Buffer offset is fixed (also double buffered)\n    ep->hw_data_buf = (uint8_t*) &usb_dpram->ep0_buf_a[0];\n  } else {\n    // round up size to multiple of 64\n    uint16_t size = (uint16_t)tu_round_up(wMaxPacketSize, 64);\n\n    // double buffered Bulk endpoint\n    if (transfer_type == TUSB_XFER_BULK) {\n      size *= 2u;\n\n  #if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n      if (tu_edpt_dir(ep_addr) == TUSB_DIR_IN) {\n        ep->e15_bulk_in = true;\n      }\n  #endif\n    }\n\n    // assign buffer\n    ep->hw_data_buf = hw_buffer_ptr;\n    hw_buffer_ptr += size;\n\n    hard_assert(hw_buffer_ptr < usb_dpram->epx_data + sizeof(usb_dpram->epx_data));\n    pico_info(\"  Allocated %d bytes (0x%p)\\r\\n\", size, ep->hw_data_buf);\n  }\n}\n\nstatic void hw_endpoint_enable(hw_endpoint_t *ep, uint8_t transfer_type) {\n  io_rw_32 *ctrl_reg = hwep_ctrl_reg_device(ep);\n  // Set endpoint control register to enable (EP0 has no endpoint control register)\n  if (ctrl_reg != NULL) {\n    const uint32_t ctrl_value =\n      EP_CTRL_ENABLE_BITS | ((uint32_t)transfer_type << EP_CTRL_BUFFER_TYPE_LSB) | hw_data_offset(ep->hw_data_buf);\n    *ctrl_reg = ctrl_value;\n  }\n}\n\n// Init and enable endpoint\nstatic void hw_endpoint_open(uint8_t ep_addr, uint16_t wMaxPacketSize, uint8_t transfer_type) {\n  const uint8_t    epnum = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir   = tu_edpt_dir(ep_addr);\n  hw_endpoint_t   *ep    = hw_endpoint_get(epnum, dir);\n\n  hw_endpoint_init(ep, ep_addr, wMaxPacketSize, transfer_type);\n  hw_endpoint_enable(ep, transfer_type);\n}\n\nstatic void hw_endpoint_abort_xfer(struct hw_endpoint* ep) {\n  // Abort any pending transfer\n  const uint8_t  dir        = (uint8_t)tu_edpt_dir(ep->ep_addr);\n  const uint8_t  epnum      = tu_edpt_number(ep->ep_addr);\n  const uint32_t abort_mask = TU_BIT((epnum << 1) | (dir ? 0 : 1));\n\n  // Due to Errata RP2040-E2: ABORT flag is only applicable for B2 and later (unusable for B0, B1).\n  // Which means we are not guaranteed to safely abort pending transfer on B0 and B1.\n  if (rp2040_chip_version() >= 2) {\n    usb_hw_set->abort = abort_mask;\n    while ((usb_hw->abort_done & abort_mask) != abort_mask) {}\n  }\n\n  uint32_t buf_ctrl = USB_BUF_CTRL_SEL; // reset to buffer 0\n  if (ep->next_pid) {\n    buf_ctrl |= USB_BUF_CTRL_DATA1_PID;\n  }\n\n  io_rw_32 *buf_ctrl_reg = hwbuf_ctrl_reg_device(ep);\n  hwbuf_ctrl_set(buf_ctrl_reg, buf_ctrl);\n  hw_endpoint_reset_transfer(ep);\n\n  if (rp2040_chip_version() >= 2) {\n    usb_hw_clear->abort_done = abort_mask;\n    usb_hw_clear->abort = abort_mask;\n  }\n}\n\nstatic void __tusb_irq_path_func(handle_hw_buff_status)(void) {\n  uint32_t remaining_buffers = usb_hw->buf_status;\n  pico_trace(\"buf_status = 0x%08lx\\r\\n\", remaining_buffers);\n  uint bit = 1u;\n  for (uint8_t i = 0; remaining_buffers && i < USB_MAX_ENDPOINTS * 2; i++) {\n    if (remaining_buffers & bit) {\n      // clear this in advance\n      usb_hw_clear->buf_status = bit;\n\n      // IN transfer for even i, OUT transfer for odd i\n      const uint8_t    epnum = i >> 1u;\n      const tusb_dir_t dir   = (i & 1u) ? TUSB_DIR_OUT : TUSB_DIR_IN;\n      hw_endpoint_t   *ep    = hw_endpoint_get(epnum, dir);\n\n      const bool done = hw_endpoint_xfer_continue(ep);\n      if (done) {\n        // Notify usbd\n        const uint16_t xferred_len = ep->xferred_len;\n        hw_endpoint_reset_transfer(ep);\n        dcd_event_xfer_complete(0, ep->ep_addr, xferred_len, XFER_RESULT_SUCCESS, true);\n      }\n      remaining_buffers &= ~bit;\n    }\n    bit <<= 1u;\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void reset_ep0(void) {\n  // If we have finished this transfer on EP0 set pid back to 1 for next\n  // setup transfer. Also clear a stall in case\n  for (uint8_t dir = 0; dir < 2; dir++) {\n    struct hw_endpoint *ep = hw_endpoint_get(0, dir);\n    ep->next_pid = 1u;\n    if (ep->active) {\n      hw_endpoint_abort_xfer(ep); // Abort any pending transfer per USB specs\n    }\n  }\n}\n\nstatic void __tusb_irq_path_func(reset_non_control_endpoints)(void) {\n  // Disable all non-control\n  for (uint8_t i = 0; i < USB_MAX_ENDPOINTS - 1; i++) {\n    usb_dpram->ep_ctrl[i].in = 0;\n    usb_dpram->ep_ctrl[i].out = 0;\n  }\n\n  // clear non-control hw endpoints\n  tu_memclr(hw_endpoints[1], sizeof(hw_endpoints) - 2 * sizeof(hw_endpoint_t));\n\n  // reclaim buffer space\n  hw_buffer_ptr = &usb_dpram->epx_data[0];\n}\n\nstatic void __tusb_irq_path_func(dcd_rp2040_irq)(void) {\n  const uint32_t status  = usb_hw->ints;\n  uint32_t handled = 0;\n\n  if (status & USB_INTF_DEV_SOF_BITS) {\n    bool keep_sof_alive = false;\n\n    handled |= USB_INTF_DEV_SOF_BITS;\n\n#if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n    // Errata 15 workaround for Device Bulk-In endpoint\n    e15_last_sof = time_us_32();\n\n    for (uint8_t i = 0; i < USB_MAX_ENDPOINTS; i++) {\n      struct hw_endpoint *ep = hw_endpoint_get(i, TUSB_DIR_IN);\n\n      // Active Bulk IN endpoint requires SOF\n      if (ep->e15_bulk_in && ep->active) {\n        keep_sof_alive = true;\n\n        hw_endpoint_lock_update(ep, 1);\n        if (ep->pending) {\n          ep->pending = 0;\n          hw_endpoint_start_next_buffer(ep);\n        }\n        hw_endpoint_lock_update(ep, -1);\n      }\n    }\n#endif\n\n    // disable SOF interrupt if it is used for RESUME in remote wakeup\n    if (!keep_sof_alive && !_sof_enable) {\n      usb_hw_clear->inte = USB_INTS_DEV_SOF_BITS;\n    }\n\n    dcd_event_sof(0, usb_hw->sof_rd & USB_SOF_RD_BITS, true);\n  }\n\n  // xfer events are handled before setup req. So if a transfer completes immediately\n  // before closing the EP, the events will be delivered in same order.\n  if (status & USB_INTS_BUFF_STATUS_BITS) {\n    handled |= USB_INTS_BUFF_STATUS_BITS;\n    handle_hw_buff_status();\n  }\n\n  if (status & USB_INTS_SETUP_REQ_BITS) {\n    handled |= USB_INTS_SETUP_REQ_BITS;\n    uint8_t const* setup = remove_volatile_cast(uint8_t const*, &usb_dpram->setup_packet);\n\n    // reset pid to both 1 (data and ack)\n    reset_ep0();\n\n    // Pass setup packet to tiny usb\n    dcd_event_setup_received(0, setup, true);\n    usb_hw_clear->sie_status = USB_SIE_STATUS_SETUP_REC_BITS;\n  }\n\n#if FORCE_VBUS_DETECT == 0\n  // Since we force VBUS detect On, device will always think it is connected and\n  // couldn't distinguish between disconnect and suspend\n  if (status & USB_INTS_DEV_CONN_DIS_BITS) {\n    handled |= USB_INTS_DEV_CONN_DIS_BITS;\n\n    if (usb_hw->sie_status & USB_SIE_STATUS_CONNECTED_BITS) {\n      // Connected: nothing to do\n    } else {\n      // Disconnected\n      dcd_event_bus_signal(0, DCD_EVENT_UNPLUGGED, true);\n    }\n\n    usb_hw_clear->sie_status = USB_SIE_STATUS_CONNECTED_BITS;\n  }\n#endif\n\n  // SE0 for 2.5 us or more (will last at least 10ms)\n  if (status & USB_INTS_BUS_RESET_BITS) {\n    pico_trace(\"BUS RESET\\r\\n\");\n\n    handled |= USB_INTS_BUS_RESET_BITS;\n\n    usb_hw->dev_addr_ctrl = 0;\n    reset_non_control_endpoints();\n    dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n    usb_hw_clear->sie_status = USB_SIE_STATUS_BUS_RESET_BITS;\n\n  #if TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX\n    // Only run enumeration workaround if pull up is enabled\n    if (usb_hw->sie_ctrl & USB_SIE_CTRL_PULLUP_EN_BITS) {\n      rp2040_usb_device_enumeration_fix();\n    }\n  #endif\n  }\n\n  /* Note from pico datasheet 4.1.2.6.4 (v1.2)\n   * If you enable the suspend interrupt, it is likely you will see a suspend interrupt when\n   * the device is first connected but the bus is idle. The bus can be idle for a few ms before\n   * the host begins sending start of frame packets. You will also see a suspend interrupt\n   * when the device is disconnected if you do not have a VBUS detect circuit connected. This is\n   * because without VBUS detection, it is impossible to tell the difference between\n   * being disconnected and suspended.\n   */\n  if (status & USB_INTS_DEV_SUSPEND_BITS) {\n    handled |= USB_INTS_DEV_SUSPEND_BITS;\n    dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n    usb_hw_clear->sie_status = USB_SIE_STATUS_SUSPENDED_BITS;\n  }\n\n  if (status & USB_INTS_DEV_RESUME_FROM_HOST_BITS) {\n    handled |= USB_INTS_DEV_RESUME_FROM_HOST_BITS;\n    dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n    usb_hw_clear->sie_status = USB_SIE_STATUS_RESUME_BITS;\n  }\n\n  if (status ^ handled) {\n    panic(\"Unhandled IRQ 0x%x\\n\", (uint) (status ^ handled));\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* Controller API\n *------------------------------------------------------------------*/\n\n// older SDK\n#ifndef PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY\n#define PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY 0xff\n#endif\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  assert(rhport == 0);\n\n  TU_LOG(2, \"Chip Version B%u\\r\\n\", rp2040_chip_version());\n\n  // Reset hardware to default state\n  rp2usb_init();\n\n  #if FORCE_VBUS_DETECT\n  // Force VBUS detect so the device thinks it is plugged into a host\n  usb_hw->pwr = USB_USB_PWR_VBUS_DETECT_BITS | USB_USB_PWR_VBUS_DETECT_OVERRIDE_EN_BITS;\n#endif\n\n  irq_add_shared_handler(USBCTRL_IRQ, dcd_rp2040_irq, PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY);\n\n  // Init control endpoints\n  tu_memclr(hw_endpoints[0], 2 * sizeof(hw_endpoint_t));\n  hw_endpoint_open(0x0, 64, TUSB_XFER_CONTROL);\n  hw_endpoint_open(0x80, 64, TUSB_XFER_CONTROL);\n\n  // Init non-control endpoints\n  reset_non_control_endpoints();\n\n  // Initializes the USB peripheral for device mode and enables it.\n  // Don't need to enable the pull up here. Force VBUS\n  usb_hw->main_ctrl = USB_MAIN_CTRL_CONTROLLER_EN_BITS;\n\n  // Enable individual controller IRQS here. Processor interrupt enable will be used\n  // for the global interrupt enable...\n  // Note: Force VBUS detect cause disconnection not detectable\n  usb_hw->sie_ctrl = USB_SIE_CTRL_EP0_INT_1BUF_BITS;\n  usb_hw->inte = USB_INTS_BUFF_STATUS_BITS | USB_INTS_BUS_RESET_BITS | USB_INTS_SETUP_REQ_BITS |\n                 USB_INTS_DEV_SUSPEND_BITS | USB_INTS_DEV_RESUME_FROM_HOST_BITS |\n                 (FORCE_VBUS_DETECT ? 0 : USB_INTS_DEV_CONN_DIS_BITS);\n\n  dcd_connect(rhport);\n  return true;\n}\n\nbool dcd_deinit(uint8_t rhport) {\n  (void) rhport;\n\n  reset_non_control_endpoints();\n  irq_remove_handler(USBCTRL_IRQ, dcd_rp2040_irq);\n\n  // reset usb hardware into initial state\n  reset_block(RESETS_RESET_USBCTRL_BITS);\n  unreset_block_wait(RESETS_RESET_USBCTRL_BITS);\n\n  return true;\n}\n\nvoid dcd_int_enable(__unused uint8_t rhport) {\n  assert(rhport == 0);\n  irq_set_enabled(USBCTRL_IRQ, true);\n}\n\nvoid dcd_int_disable(__unused uint8_t rhport) {\n  assert(rhport == 0);\n  irq_set_enabled(USBCTRL_IRQ, false);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  (void)dev_addr;\n  // Can't set device address in hardware until status xfer has complete\n  // Send 0len complete response on EP0 IN\n  dcd_edpt_xfer(rhport, 0x80, NULL, 0, false);\n}\n\nvoid dcd_remote_wakeup(__unused uint8_t rhport) {\n  pico_info(\"dcd_remote_wakeup %d\\n\", rhport);\n  assert(rhport == 0);\n\n  // since RESUME interrupt is not triggered if we are the one initiate\n  // briefly enable SOF to notify usbd when bus is ready\n  usb_hw_set->inte = USB_INTS_DEV_SOF_BITS;\n  usb_hw_set->sie_ctrl = USB_SIE_CTRL_RESUME_BITS;\n}\n\n// disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(__unused uint8_t rhport) {\n  (void) rhport;\n  usb_hw_clear->sie_ctrl = USB_SIE_CTRL_PULLUP_EN_BITS;\n}\n\n// connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(__unused uint8_t rhport) {\n  (void) rhport;\n  usb_hw_set->sie_ctrl = USB_SIE_CTRL_PULLUP_EN_BITS;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void) rhport;\n\n  _sof_enable = en;\n\n  if (en) {\n    usb_hw_set->inte = USB_INTS_DEV_SOF_BITS;\n  }\n#if !TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n  else {\n    // Don't clear immediately if the SOF workaround is in use.\n    // The SOF handler will conditionally disable the interrupt.\n    usb_hw_clear->inte = USB_INTS_DEV_SOF_BITS;\n  }\n#endif\n}\n\n/*------------------------------------------------------------------*/\n/* DCD Endpoint port\n *------------------------------------------------------------------*/\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const* request) {\n  (void) rhport;\n\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD &&\n      request->bRequest == TUSB_REQ_SET_ADDRESS) {\n    usb_hw->dev_addr_ctrl = (uint8_t) request->wValue;\n  }\n}\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const* desc_edpt) {\n  (void) rhport;\n  const uint8_t xfer_type = desc_edpt->bmAttributes.xfer;\n  hw_endpoint_open(desc_edpt->bEndpointAddress, tu_edpt_packet_size(desc_edpt), xfer_type);\n  return true;\n}\n\n// New API: Allocate packet buffer used by ISO endpoints\n// Some MCU need manual packet buffer allocation, we allocate the largest size to avoid clustering\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  struct hw_endpoint *ep = hw_endpoint_get_by_addr(ep_addr);\n  hw_endpoint_init(ep, ep_addr, largest_packet_size, TUSB_XFER_ISOCHRONOUS);\n  return true;\n}\n\n// New API: Configure and enable an ISO endpoint according to descriptor\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *ep_desc) {\n  (void)rhport;\n  const uint8_t       epnum = tu_edpt_number(ep_desc->bEndpointAddress);\n  const tusb_dir_t    dir   = tu_edpt_dir(ep_desc->bEndpointAddress);\n  struct hw_endpoint *ep    = hw_endpoint_get(epnum, dir);\n  TU_ASSERT(ep->hw_data_buf != NULL); // must be inited and allocated previously\n\n  if (ep->active) {\n    hw_endpoint_abort_xfer(ep); // abort any pending transfer\n  }\n  ep->wMaxPacketSize = ep_desc->wMaxPacketSize;\n\n  hw_endpoint_enable(ep, TUSB_XFER_ISOCHRONOUS);\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  (void) rhport;\n  // may need to use EP Abort\n  reset_non_control_endpoints();\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes, bool is_isr) {\n  (void)rhport;\n  (void)is_isr;\n  hw_endpoint_t *ep = hw_endpoint_get_by_addr(ep_addr);\n  hw_endpoint_xfer_start(ep, buffer, NULL, total_bytes);\n  return true;\n}\n\n#if CFG_TUD_EDPT_DEDICATED_HWFIFO\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes, bool is_isr) {\n  (void)rhport;\n  (void)is_isr;\n  hw_endpoint_t *ep = hw_endpoint_get_by_addr(ep_addr);\n  hw_endpoint_xfer_start(ep, NULL, ff, total_bytes);\n  return true;\n}\n#endif\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void)rhport;\n  const uint8_t    epnum = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir   = tu_edpt_dir(ep_addr);\n  hw_endpoint_t   *ep    = hw_endpoint_get(epnum, dir);\n\n  if (epnum == 0) {\n    // A stall on EP0 has to be armed so it can be cleared on the next setup packet\n    usb_hw_set->ep_stall_arm = (dir == TUSB_DIR_IN) ? USB_EP_STALL_ARM_EP0_IN_BITS : USB_EP_STALL_ARM_EP0_OUT_BITS;\n  }\n\n  // stall and clear current pending buffer, may need to use EP_ABORT\n  io_rw_32 *buf_ctrl_reg = hwbuf_ctrl_reg_device(ep);\n  hwbuf_ctrl_set(buf_ctrl_reg, USB_BUF_CTRL_STALL);\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  if (tu_edpt_number(ep_addr)) {\n    struct hw_endpoint* ep = hw_endpoint_get_by_addr(ep_addr);\n\n    // clear stall also reset toggle to DATA0, ready for next transfer\n    ep->next_pid = 0;\n    io_rw_32 *buf_ctrl_reg = hwbuf_ctrl_reg_device(ep);\n    hwbuf_ctrl_clear_mask(buf_ctrl_reg, USB_BUF_CTRL_STALL);\n  }\n}\n\nvoid __tusb_irq_path_func(dcd_int_handler)(uint8_t rhport) {\n  (void) rhport;\n  dcd_rp2040_irq();\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/raspberrypi/rp2040/hcd_rp2040.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.\n * Copyright (c) 2021 Ha Thach (tinyusb.org) for Double Buffered\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && (CFG_TUSB_MCU == OPT_MCU_RP2040) && !CFG_TUH_RPI_PIO_USB && !CFG_TUH_MAX3421\n\n#include \"pico.h\"\n#include \"rp2040_usb.h\"\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"osal/osal.h\"\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n\n// port 0 is native USB port, other is counted as software PIO\n#define RHPORT_NATIVE 0\n\n//--------------------------------------------------------------------+\n// Low level rp2040 controller functions\n//--------------------------------------------------------------------+\n\n#ifndef PICO_USB_HOST_INTERRUPT_ENDPOINTS\n#define PICO_USB_HOST_INTERRUPT_ENDPOINTS (USB_MAX_ENDPOINTS - 1)\n#endif\nstatic_assert(PICO_USB_HOST_INTERRUPT_ENDPOINTS <= USB_MAX_ENDPOINTS, \"\");\n\n// Host mode uses one shared endpoint register for non-interrupt endpoint\nstatic struct hw_endpoint ep_pool[1 + PICO_USB_HOST_INTERRUPT_ENDPOINTS];\n#define epx (ep_pool[0])\n\n// Flags we set by default in sie_ctrl (we add other bits on top)\nenum {\n  SIE_CTRL_BASE = USB_SIE_CTRL_SOF_EN_BITS      | USB_SIE_CTRL_KEEP_ALIVE_EN_BITS |\n                  USB_SIE_CTRL_PULLDOWN_EN_BITS | USB_SIE_CTRL_EP0_INT_1BUF_BITS\n};\n\nstatic struct hw_endpoint *get_dev_ep(uint8_t dev_addr, uint8_t ep_addr) {\n  uint8_t num = tu_edpt_number(ep_addr);\n  if (num == 0) {\n    return &epx;\n  }\n\n  for (uint32_t i = 1; i < TU_ARRAY_SIZE(ep_pool); i++) {\n    struct hw_endpoint *ep = &ep_pool[i];\n    if (ep->configured && (ep->dev_addr == dev_addr) && (ep->ep_addr == ep_addr)) {\n      return ep;\n    }\n  }\n\n  return NULL;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t dev_speed(void) {\n  return (usb_hw->sie_status & USB_SIE_STATUS_SPEED_BITS) >> USB_SIE_STATUS_SPEED_LSB;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool need_pre(uint8_t dev_addr) {\n  // If this device is different to the speed of the root device\n  // (i.e. is a low speed device on a full speed hub) then need pre\n  return hcd_port_speed_get(0) != tuh_speed_get(dev_addr);\n}\n\nstatic void __tusb_irq_path_func(hw_xfer_complete)(struct hw_endpoint *ep, xfer_result_t xfer_result) {\n  // Mark transfer as done before we tell the tinyusb stack\n  uint8_t dev_addr = ep->dev_addr;\n  uint8_t ep_addr = ep->ep_addr;\n  uint xferred_len = ep->xferred_len;\n  hw_endpoint_reset_transfer(ep);\n  hcd_event_xfer_complete(dev_addr, ep_addr, xferred_len, xfer_result, true);\n}\n\nstatic void __tusb_irq_path_func(handle_hwbuf_status_bit)(uint bit, struct hw_endpoint *ep) {\n  usb_hw_clear->buf_status = bit;\n  const bool done          = hw_endpoint_xfer_continue(ep);\n  if (done) {\n    hw_xfer_complete(ep, XFER_RESULT_SUCCESS);\n  }\n}\n\nstatic void __tusb_irq_path_func(handle_hwbuf_status)(void) {\n  uint32_t buf_status = usb_hw->buf_status;\n  pico_trace(\"buf_status 0x%08lx\\n\", buf_status);\n\n  // Check EPX first\n  uint32_t bit = 1u;\n  if (buf_status & bit) {\n    buf_status &= ~bit;\n    struct hw_endpoint * ep = &epx;\n    handle_hwbuf_status_bit(bit, ep);\n  }\n\n  // Check \"interrupt\" (asynchronous) endpoints for both IN and OUT\n  for (uint i = 1; i <= USB_HOST_INTERRUPT_ENDPOINTS && buf_status; i++) {\n    // EPX is bit 0 & 1\n    // IEP1 IN  is bit 2\n    // IEP1 OUT is bit 3\n    // IEP2 IN  is bit 4\n    // IEP2 OUT is bit 5\n    // IEP3 IN  is bit 6\n    // IEP3 OUT is bit 7\n    // etc\n    for (uint j = 0; j < 2; j++) {\n      bit = 1 << (i * 2 + j);\n      if (buf_status & bit) {\n        buf_status &= ~bit;\n        handle_hwbuf_status_bit(bit, &ep_pool[i]);\n      }\n    }\n  }\n\n  if (buf_status) {\n    panic(\"Unhandled buffer %d\\n\", buf_status);\n  }\n}\n\nstatic void __tusb_irq_path_func(hw_trans_complete)(void)\n{\n  if (usb_hw->sie_ctrl & USB_SIE_CTRL_SEND_SETUP_BITS)\n  {\n    pico_trace(\"Sent setup packet\\n\");\n    struct hw_endpoint *ep = &epx;\n    assert(ep->active);\n    // Set transferred length to 8 for a setup packet\n    ep->xferred_len = 8;\n    hw_xfer_complete(ep, XFER_RESULT_SUCCESS);\n  }\n  else\n  {\n    // Don't care. Will handle this in buff status\n    return;\n  }\n}\n\nstatic void __tusb_irq_path_func(hcd_rp2040_irq)(void)\n{\n  uint32_t status = usb_hw->ints;\n  uint32_t handled = 0;\n\n  if ( status & USB_INTS_HOST_CONN_DIS_BITS )\n  {\n    handled |= USB_INTS_HOST_CONN_DIS_BITS;\n\n    if ( dev_speed() )\n    {\n      hcd_event_device_attach(RHPORT_NATIVE, true);\n    }\n    else\n    {\n      hcd_event_device_remove(RHPORT_NATIVE, true);\n    }\n\n    // Clear speed change interrupt\n    usb_hw_clear->sie_status = USB_SIE_STATUS_SPEED_BITS;\n  }\n\n  if ( status & USB_INTS_STALL_BITS )\n  {\n    // We have rx'd a stall from the device\n    // NOTE THIS SHOULD HAVE PRIORITY OVER BUFF_STATUS\n    // AND TRANS_COMPLETE as the stall is an alternative response\n    // to one of those events\n    pico_trace(\"Stall REC\\n\");\n    handled |= USB_INTS_STALL_BITS;\n    usb_hw_clear->sie_status = USB_SIE_STATUS_STALL_REC_BITS;\n    hw_xfer_complete(&epx, XFER_RESULT_STALLED);\n  }\n\n  if ( status & USB_INTS_BUFF_STATUS_BITS )\n  {\n    handled |= USB_INTS_BUFF_STATUS_BITS;\n    TU_LOG(2, \"Buffer complete\\r\\n\");\n    handle_hwbuf_status();\n  }\n\n  if ( status & USB_INTS_TRANS_COMPLETE_BITS )\n  {\n    handled |= USB_INTS_TRANS_COMPLETE_BITS;\n    usb_hw_clear->sie_status = USB_SIE_STATUS_TRANS_COMPLETE_BITS;\n    TU_LOG(2, \"Transfer complete\\r\\n\");\n    hw_trans_complete();\n  }\n\n  if ( status & USB_INTS_ERROR_RX_TIMEOUT_BITS )\n  {\n    handled |= USB_INTS_ERROR_RX_TIMEOUT_BITS;\n    usb_hw_clear->sie_status = USB_SIE_STATUS_RX_TIMEOUT_BITS;\n  }\n\n  if ( status & USB_INTS_ERROR_DATA_SEQ_BITS )\n  {\n    usb_hw_clear->sie_status = USB_SIE_STATUS_DATA_SEQ_ERROR_BITS;\n    TU_LOG(3, \"  Seq Error: [0] = 0x%04u  [1] = 0x%04x\\r\\n\", tu_u32_low16(*hwbuf_ctrl_reg_host(&epx)),\n           tu_u32_high16(*hwbuf_ctrl_reg_host(&epx)));\n    panic(\"Data Seq Error \\n\");\n  }\n\n  if ( status ^ handled )\n  {\n    panic(\"Unhandled IRQ 0x%x\\n\", (uint) (status ^ handled));\n  }\n}\n\nvoid __tusb_irq_path_func(hcd_int_handler)(uint8_t rhport, bool in_isr) {\n  (void) rhport;\n  (void) in_isr;\n  hcd_rp2040_irq();\n}\n\nstatic struct hw_endpoint *_next_free_interrupt_ep(void)\n{\n  struct hw_endpoint * ep = NULL;\n  for ( uint i = 1; i < TU_ARRAY_SIZE(ep_pool); i++ )\n  {\n    ep = &ep_pool[i];\n    if ( !ep->configured )\n    {\n      // Will be configured by hw_endpoint_init / hw_endpoint_allocate\n      ep->interrupt_num = (uint8_t) (i - 1);\n      return ep;\n    }\n  }\n  return ep;\n}\n\nstatic hw_endpoint_t *hw_endpoint_allocate(uint8_t transfer_type) {\n  hw_endpoint_t *ep = NULL;\n\n  if (transfer_type == TUSB_XFER_CONTROL) {\n    ep              = &epx;\n    ep->hw_data_buf = &usbh_dpram->epx_data[0];\n  } else {\n    // Note: even though datasheet name these \"Interrupt\" endpoints. These are actually\n    // \"Asynchronous\" endpoints and can be used for other type such as: Bulk  (ISO need confirmation)\n    ep = _next_free_interrupt_ep();\n    pico_info(\"Allocate %s ep %d\\n\", tu_edpt_type_str(transfer_type), ep->interrupt_num);\n    assert(ep);\n    // 0 for epx (double buffered): TODO increase to 1024 for ISO\n    // 2x64 for intep0\n    // 3x64 for intep1\n    // etc\n    ep->hw_data_buf = &usbh_dpram->epx_data[64 * (ep->interrupt_num + 2)];\n  }\n\n  return ep;\n}\n\nstatic void hw_endpoint_init(struct hw_endpoint *ep, uint8_t dev_addr, uint8_t ep_addr, uint16_t wMaxPacketSize,\n                             uint8_t transfer_type, uint8_t bmInterval) {\n  // Already has data buffer, endpoint control, and buffer control allocated at this point\n  assert(ep->hw_data_buf);\n\n  uint8_t const num = tu_edpt_number(ep_addr);\n  tusb_dir_t const dir = tu_edpt_dir(ep_addr);\n\n  ep->ep_addr = ep_addr;\n  ep->dev_addr = dev_addr;\n\n  // Response to a setup packet on EP0 starts with pid of 1\n  ep->next_pid = (num == 0 ? 1u : 0u);\n  ep->wMaxPacketSize = wMaxPacketSize;\n\n  pico_trace(\"hw_endpoint_init dev %d ep %02X xfer %d\\n\", ep->dev_addr, ep->ep_addr, transfer_type);\n  pico_trace(\"dev %d ep %02X setup buffer @ 0x%p\\n\", ep->dev_addr, ep->ep_addr, ep->hw_data_buf);\n  uint dpram_offset = hw_data_offset(ep->hw_data_buf);\n  // Bits 0-5 should be 0\n  assert(!(dpram_offset & 0b111111));\n\n  // Fill in endpoint control register with buffer offset\n  uint32_t ctrl_value = EP_CTRL_ENABLE_BITS | EP_CTRL_INTERRUPT_PER_BUFFER |\n                        ((uint32_t)transfer_type << EP_CTRL_BUFFER_TYPE_LSB) | dpram_offset;\n  if (bmInterval) {\n    ctrl_value |= (uint32_t)((bmInterval - 1) << EP_CTRL_HOST_INTERRUPT_INTERVAL_LSB);\n  }\n\n  io_rw_32 *ctrl_reg = hwep_ctrl_reg_host(ep);\n  *ctrl_reg          = ctrl_value;\n  pico_trace(\"endpoint control (0x%p) <- 0x%lx\\n\", ctrl_reg, ctrl_value);\n  ep->configured = true;\n\n  if (ep != &epx) {\n    // Endpoint has its own addr_endp and interrupt bits to be setup!\n    // This is an interrupt/async endpoint. so need to set up ADDR_ENDP register with:\n    // - device address\n    // - endpoint number / direction\n    // - preamble\n    uint32_t reg = (uint32_t)(dev_addr | (num << USB_ADDR_ENDP1_ENDPOINT_LSB));\n\n    if (dir == TUSB_DIR_OUT) {\n      reg |= USB_ADDR_ENDP1_INTEP_DIR_BITS;\n    }\n\n    if (need_pre(dev_addr)) {\n      reg |= USB_ADDR_ENDP1_INTEP_PREAMBLE_BITS;\n    }\n    usb_hw->int_ep_addr_ctrl[ep->interrupt_num] = reg;\n\n    // Finally, enable interrupt that endpoint\n    usb_hw_set->int_ep_ctrl = 1 << (ep->interrupt_num + 1);\n\n    // If it's an interrupt endpoint we need to set up the buffer control register\n  }\n}\n\n//--------------------------------------------------------------------+\n// HCD API\n//--------------------------------------------------------------------+\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n  pico_trace(\"hcd_init %d\\n\", rhport);\n  assert(rhport == 0);\n\n  // Reset any previous state\n  rp2usb_init();\n\n  // Force VBUS detect to always present, for now we assume vbus is always provided (without using VBUS En)\n  usb_hw->pwr = USB_USB_PWR_VBUS_DETECT_BITS | USB_USB_PWR_VBUS_DETECT_OVERRIDE_EN_BITS;\n\n  // Remove shared irq if it was previously added so as not to fill up shared irq slots\n  irq_remove_handler(USBCTRL_IRQ, hcd_rp2040_irq);\n\n  irq_add_shared_handler(USBCTRL_IRQ, hcd_rp2040_irq, PICO_SHARED_IRQ_HANDLER_HIGHEST_ORDER_PRIORITY);\n\n  // clear epx and interrupt eps\n  memset(&ep_pool, 0, sizeof(ep_pool));\n\n  // Enable in host mode with SOF / Keep alive on\n  usb_hw->main_ctrl = USB_MAIN_CTRL_CONTROLLER_EN_BITS | USB_MAIN_CTRL_HOST_NDEVICE_BITS;\n  usb_hw->sie_ctrl = SIE_CTRL_BASE;\n  usb_hw->inte = USB_INTE_BUFF_STATUS_BITS      |\n                 USB_INTE_HOST_CONN_DIS_BITS    |\n                 USB_INTE_HOST_RESUME_BITS      |\n                 USB_INTE_STALL_BITS            |\n                 USB_INTE_TRANS_COMPLETE_BITS   |\n                 USB_INTE_ERROR_RX_TIMEOUT_BITS |\n                 USB_INTE_ERROR_DATA_SEQ_BITS   ;\n\n  return true;\n}\n\nbool hcd_deinit(uint8_t rhport) {\n  (void) rhport;\n\n  irq_remove_handler(USBCTRL_IRQ, hcd_rp2040_irq);\n  reset_block(RESETS_RESET_USBCTRL_BITS);\n  unreset_block_wait(RESETS_RESET_USBCTRL_BITS);\n\n  return true;\n}\n\nvoid hcd_port_reset(uint8_t rhport)\n{\n  (void) rhport;\n  pico_trace(\"hcd_port_reset\\n\");\n  assert(rhport == 0);\n  // TODO: Nothing to do here yet. Perhaps need to reset some state?\n}\n\nvoid hcd_port_reset_end(uint8_t rhport)\n{\n  (void) rhport;\n}\n\nbool hcd_port_connect_status(uint8_t rhport)\n{\n  (void) rhport;\n  pico_trace(\"hcd_port_connect_status\\n\");\n  assert(rhport == 0);\n  return usb_hw->sie_status & USB_SIE_STATUS_SPEED_BITS;\n}\n\ntusb_speed_t hcd_port_speed_get(uint8_t rhport)\n{\n  (void) rhport;\n  assert(rhport == 0);\n\n  // TODO: Should enumval this register\n  switch ( dev_speed() )\n  {\n    case 1:\n      return TUSB_SPEED_LOW;\n    case 2:\n      return TUSB_SPEED_FULL;\n    default:\n      panic(\"Invalid speed\\n\");\n      // return TUSB_SPEED_INVALID;\n  }\n}\n\n// Close all opened endpoint belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  pico_trace(\"hcd_device_close %d\\n\", dev_addr);\n  (void) rhport;\n\n  // reset epx if it is currently active with unplugged device\n  if (epx.configured && epx.active && epx.dev_addr == dev_addr) {\n    epx.configured = false;\n    *hwep_ctrl_reg_host(&epx)  = 0;\n    *hwbuf_ctrl_reg_host(&epx) = 0;\n    hw_endpoint_reset_transfer(&epx);\n  }\n\n  // dev0 only has ep0\n  if (dev_addr != 0) {\n    for (size_t i = 1; i < TU_ARRAY_SIZE(ep_pool); i++) {\n      hw_endpoint_t *ep = &ep_pool[i];\n      if (ep->dev_addr == dev_addr && ep->configured) {\n        // in case it is an interrupt endpoint, disable it\n        usb_hw_clear->int_ep_ctrl = (1 << (ep->interrupt_num + 1));\n        usb_hw->int_ep_addr_ctrl[ep->interrupt_num] = 0;\n\n        // unconfigure the endpoint\n        ep->configured = false;\n        *hwep_ctrl_reg_host(ep)  = 0;\n        *hwbuf_ctrl_reg_host(ep) = 0;\n        hw_endpoint_reset_transfer(ep);\n      }\n    }\n  }\n}\n\nuint32_t hcd_frame_number(uint8_t rhport) {\n  (void)rhport;\n  return usb_hw->sof_rd;\n}\n\nvoid hcd_int_enable(uint8_t rhport) {\n  (void)rhport;\n  irq_set_enabled(USBCTRL_IRQ, true);\n}\n\nvoid hcd_int_disable(uint8_t rhport) {\n  (void)rhport;\n  // todo we should check this is disabling from the correct core; note currently this is never called\n  irq_set_enabled(USBCTRL_IRQ, false);\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_endpoint_t *ep_desc) {\n  (void)rhport;\n  pico_trace(\"hcd_edpt_open dev_addr %d, ep_addr %d\\n\", dev_addr, ep_desc->bEndpointAddress);\n  hw_endpoint_t *ep = hw_endpoint_allocate(ep_desc->bmAttributes.xfer);\n  TU_ASSERT(ep);\n\n  hw_endpoint_init(ep, dev_addr, ep_desc->bEndpointAddress, tu_edpt_packet_size(ep_desc), ep_desc->bmAttributes.xfer,\n                   ep_desc->bInterval);\n\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  (void) rhport; (void) daddr; (void) ep_addr;\n  return false; // TODO not implemented yet\n}\n\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen) {\n  (void) rhport;\n\n  pico_trace(\"hcd_edpt_xfer dev_addr %d, ep_addr 0x%x, len %d\\n\", dev_addr, ep_addr, buflen);\n\n  const uint8_t    ep_num = tu_edpt_number(ep_addr);\n  tusb_dir_t const ep_dir = tu_edpt_dir(ep_addr);\n\n  // Get appropriate ep. Either EPX or interrupt endpoint\n  struct hw_endpoint *ep = get_dev_ep(dev_addr, ep_addr);\n\n  TU_ASSERT(ep);\n\n  // EP should be inactive\n  assert(!ep->active);\n\n  // Control endpoint can change direction 0x00 <-> 0x80\n  if (ep_addr != ep->ep_addr) {\n    assert(ep_num == 0);\n\n    // Direction has flipped on endpoint control so re init it but with same properties\n    hw_endpoint_init(ep, dev_addr, ep_addr, ep->wMaxPacketSize, TUSB_XFER_CONTROL, 0);\n  }\n\n  // If a normal transfer (non-interrupt) then initiate using\n  // sie ctrl registers. Otherwise, interrupt ep registers should\n  // already be configured\n  if (ep == &epx) {\n    hw_endpoint_xfer_start(ep, buffer, NULL, buflen);\n\n    // That has set up buffer control, endpoint control etc\n    // for host we have to initiate the transfer\n    usb_hw->dev_addr_ctrl = (uint32_t) (dev_addr | (ep_num << USB_ADDR_ENDP_ENDPOINT_LSB));\n\n    uint32_t flags = USB_SIE_CTRL_START_TRANS_BITS | SIE_CTRL_BASE |\n                     (ep_dir ? USB_SIE_CTRL_RECEIVE_DATA_BITS : USB_SIE_CTRL_SEND_DATA_BITS) |\n                     (need_pre(dev_addr) ? USB_SIE_CTRL_PREAMBLE_EN_BITS : 0);\n    // START_TRANS bit on SIE_CTRL seems to exhibit the same behavior as the AVAILABLE bit\n    // described in RP2040 Datasheet, release 2.1, section \"4.1.2.5.1. Concurrent access\".\n    // We write everything except the START_TRANS bit first, then wait some cycles.\n    usb_hw->sie_ctrl = flags & ~USB_SIE_CTRL_START_TRANS_BITS;\n    busy_wait_at_least_cycles(12);\n    usb_hw->sie_ctrl = flags;\n  } else {\n    hw_endpoint_xfer_start(ep, buffer, NULL, buflen);\n  }\n\n  return true;\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n  // TODO not implemented yet\n  return false;\n}\n\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8])\n{\n  (void) rhport;\n\n  // Copy data into setup packet buffer\n  for (uint8_t i = 0; i < 8; i++) {\n    usbh_dpram->setup_packet[i] = setup_packet[i];\n  }\n\n  // Configure EP0 struct with setup info for the trans complete\n  hw_endpoint_t *ep = hw_endpoint_allocate((uint8_t)TUSB_XFER_CONTROL);\n  TU_ASSERT(ep);\n\n  // EPX should be inactive\n  assert(!ep->active);\n\n  // EP0 out\n  hw_endpoint_init(ep, dev_addr, 0x00, ep->wMaxPacketSize, 0, 0);\n  assert(ep->configured);\n\n  ep->remaining_len = 8;\n  ep->active = true;\n\n  // Set device address\n  usb_hw->dev_addr_ctrl = dev_addr;\n\n  // Set pre if we are a low speed device on full speed hub\n  uint32_t const flags = SIE_CTRL_BASE | USB_SIE_CTRL_SEND_SETUP_BITS | USB_SIE_CTRL_START_TRANS_BITS |\n                         (need_pre(dev_addr) ? USB_SIE_CTRL_PREAMBLE_EN_BITS : 0);\n\n  // START_TRANS bit on SIE_CTRL seems to exhibit the same behavior as the AVAILABLE bit\n  // described in RP2040 Datasheet, release 2.1, section \"4.1.2.5.1. Concurrent access\".\n  // We write everything except the START_TRANS bit first, then wait some cycles.\n  usb_hw->sie_ctrl = flags & ~USB_SIE_CTRL_START_TRANS_BITS;\n  busy_wait_at_least_cycles(12);\n  usb_hw->sie_ctrl = flags;\n\n  return true;\n}\n\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n\n  panic(\"hcd_clear_stall\");\n  // return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/raspberrypi/rp2040/rp2040_usb.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.\n * Copyright (c) 2021 Ha Thach (tinyusb.org) for Double Buffered\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUSB_MCU == OPT_MCU_RP2040\n\n#include <stdlib.h>\n#include \"rp2040_usb.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTOTYPE\n//--------------------------------------------------------------------+\nstatic void sync_xfer(hw_endpoint_t *ep);\n\n  #if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\nstatic bool e15_is_critical_frame_period(struct hw_endpoint *ep);\n  #else\n    #define e15_is_critical_frame_period(x) (false)\n  #endif\n\n//--------------------------------------------------------------------+\n// Implementation\n//--------------------------------------------------------------------+\n// Provide own byte by byte memcpy as not all copies are aligned\nstatic void unaligned_memcpy(uint8_t *dst, const uint8_t *src, size_t n) {\n  while (n--) {\n    *dst++ = *src++;\n  }\n}\n\n#if CFG_TUD_EDPT_DEDICATED_HWFIFO\nvoid tu_hwfifo_write(volatile void *hwfifo, const uint8_t *src, uint16_t len, const tu_hwfifo_access_t *access_mode) {\n  (void)access_mode;\n  unaligned_memcpy((uint8_t *)(uintptr_t)hwfifo, src, len);\n}\n\nvoid tu_hwfifo_read(const volatile void *hwfifo, uint8_t *dest, uint16_t len, const tu_hwfifo_access_t *access_mode) {\n  (void)access_mode;\n  unaligned_memcpy(dest, (const uint8_t *)(uintptr_t)hwfifo, len);\n}\n#endif\n\nvoid rp2usb_init(void) {\n  // Reset usb controller\n  reset_block(RESETS_RESET_USBCTRL_BITS);\n  unreset_block_wait(RESETS_RESET_USBCTRL_BITS);\n\n#ifdef __GNUC__\n  // Clear any previous state just in case\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Warray-bounds\"\n#if __GNUC__ > 6\n#pragma GCC diagnostic ignored \"-Wstringop-overflow\"\n#endif\n#endif\n  memset(usb_dpram, 0, sizeof(*usb_dpram));\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n  // Mux the controller to the onboard usb phy\n  usb_hw->muxing = USB_USB_MUXING_TO_PHY_BITS | USB_USB_MUXING_SOFTCON_BITS;\n\n  TU_LOG2_INT(sizeof(hw_endpoint_t));\n}\n\nvoid __tusb_irq_path_func(hw_endpoint_reset_transfer)(struct hw_endpoint* ep) {\n  ep->active = false;\n  ep->remaining_len = 0;\n  ep->xferred_len = 0;\n  ep->user_buf = 0;\n}\n\nvoid __tusb_irq_path_func(hwbuf_ctrl_update)(io_rw_32 *buf_ctrl_reg, uint32_t and_mask, uint32_t or_mask) {\n  const bool is_host = rp2usb_is_host_mode();\n  uint32_t   value    = 0;\n  uint32_t   buf_ctrl = *buf_ctrl_reg;\n\n  if (and_mask) {\n    value = buf_ctrl & and_mask;\n  }\n\n  if (or_mask) {\n    value |= or_mask;\n    if (or_mask & USB_BUF_CTRL_AVAIL) {\n      if (buf_ctrl & USB_BUF_CTRL_AVAIL) {\n        panic(\"buf_ctrl @ 0x%lX already available\", (uintptr_t)buf_ctrl_reg);\n      }\n      *buf_ctrl_reg = value & ~USB_BUF_CTRL_AVAIL;\n\n      // Section 4.1.2.7.1 (rp2040) / 12.7.3.7.1 (rp2350) Concurrent access:  after write to buffer control, we need to\n      // wait at least 1/48 mhz (usb clock), 12 cycles should be good for 48*12Mhz = 576Mhz.\n      // Don't need delay in host mode as host is in charge\n      if (!is_host) {\n        busy_wait_at_least_cycles(12);\n      }\n    }\n  }\n\n  *buf_ctrl_reg = value;\n}\n\n// prepare buffer, move data if tx, return buffer control\nstatic uint32_t __tusb_irq_path_func(prepare_ep_buffer)(struct hw_endpoint *ep, uint8_t buf_id, bool is_rx) {\n  const uint16_t buflen = tu_min16(ep->remaining_len, ep->wMaxPacketSize);\n  ep->remaining_len = (uint16_t) (ep->remaining_len - buflen);\n\n  uint32_t buf_ctrl = buflen | USB_BUF_CTRL_AVAIL;\n\n  // PID\n  buf_ctrl |= ep->next_pid ? USB_BUF_CTRL_DATA1_PID : USB_BUF_CTRL_DATA0_PID;\n  ep->next_pid ^= 1u;\n\n  if (!is_rx) {\n    if (buflen) {\n      // Copy data from user buffer/fifo to hw buffer\n      uint8_t *hw_buf = ep->hw_data_buf + buf_id * 64;\n      #if CFG_TUD_EDPT_DEDICATED_HWFIFO\n      if (ep->is_xfer_fifo) {\n        // not in sram, may mess up timing with E15 workaround\n        tu_hwfifo_write_from_fifo(hw_buf, ep->user_fifo, buflen, NULL);\n      } else\n      #endif\n      {\n        unaligned_memcpy(hw_buf, ep->user_buf, buflen);\n        ep->user_buf += buflen;\n      }\n    }\n\n    // Mark as full\n    buf_ctrl |= USB_BUF_CTRL_FULL;\n  }\n\n  // Is this the last buffer? Only really matters for host mode. Will trigger\n  // the trans complete irq but also stop it polling. We only really care about\n  // trans complete for setup packets being sent\n  if (ep->remaining_len == 0) {\n    buf_ctrl |= USB_BUF_CTRL_LAST;\n  }\n\n  if (buf_id) {\n    buf_ctrl = buf_ctrl << 16;\n  }\n\n  return buf_ctrl;\n}\n\n// Prepare buffer control register value\nvoid __tusb_irq_path_func(hw_endpoint_start_next_buffer)(struct hw_endpoint* ep) {\n  const tusb_dir_t dir = tu_edpt_dir(ep->ep_addr);\n  bool      is_rx;\n  bool      is_host = false;\n  io_rw_32 *ep_ctrl_reg;\n  io_rw_32 *buf_ctrl_reg;\n\n  #if CFG_TUH_ENABLED\n  is_host = rp2usb_is_host_mode();\n  if (is_host) {\n    buf_ctrl_reg = hwbuf_ctrl_reg_host(ep);\n    ep_ctrl_reg  = hwep_ctrl_reg_host(ep);\n    is_rx        = (dir == TUSB_DIR_IN);\n  } else\n  #endif\n  {\n    buf_ctrl_reg = hwbuf_ctrl_reg_device(ep);\n    ep_ctrl_reg  = hwep_ctrl_reg_device(ep);\n    is_rx        = (dir == TUSB_DIR_OUT);\n  }\n\n  // always compute and start with buffer 0\n  uint32_t buf_ctrl = prepare_ep_buffer(ep, 0, is_rx) | USB_BUF_CTRL_SEL;\n\n  // EP0 has no endpoint control register, also usbd only schedule 1 packet at a time (single buffer)\n  if (ep_ctrl_reg != NULL) {\n    uint32_t ep_ctrl = *ep_ctrl_reg;\n\n    // For now: skip double buffered for RX e.g OUT endpoint in Device mode, since host could send < 64 bytes and cause\n    // short packet on buffer0\n    // NOTE: this could happen to Host mode IN endpoint Also, Host mode \"interrupt\" endpoint hardware is only single\n    // buffered,\n    // NOTE2: Currently Host bulk is implemented using \"interrupt\" endpoint\n    const bool force_single = (!is_host && is_rx) || (is_host && tu_edpt_number(ep->ep_addr) != 0);\n\n    if (ep->remaining_len && !force_single) {\n      // Use buffer 1 (double buffered) if there is still data\n      // TODO: Isochronous for buffer1 bit-field is different than CBI (control bulk, interrupt)\n\n      buf_ctrl |= prepare_ep_buffer(ep, 1, is_rx);\n\n      // Set endpoint control double buffered bit if needed\n      ep_ctrl &= ~EP_CTRL_INTERRUPT_PER_BUFFER;\n      ep_ctrl |= EP_CTRL_DOUBLE_BUFFERED_BITS | EP_CTRL_INTERRUPT_PER_DOUBLE_BUFFER;\n    } else {\n      // Single buffered since 1 is enough\n      ep_ctrl &= ~(EP_CTRL_DOUBLE_BUFFERED_BITS | EP_CTRL_INTERRUPT_PER_DOUBLE_BUFFER);\n      ep_ctrl |= EP_CTRL_INTERRUPT_PER_BUFFER;\n    }\n\n    *ep_ctrl_reg = ep_ctrl;\n  }\n\n  TU_LOG(3, \"  Prepare BufCtrl: [0] = 0x%04x  [1] = 0x%04x\\r\\n\", tu_u32_low16(buf_ctrl), tu_u32_high16(buf_ctrl));\n\n  // Finally, write to buffer_control which will trigger the transfer\n  // the next time the controller polls this dpram address\n  hwbuf_ctrl_set(buf_ctrl_reg, buf_ctrl);\n}\n\nvoid hw_endpoint_xfer_start(struct hw_endpoint *ep, uint8_t *buffer, tu_fifo_t *ff, uint16_t total_len) {\n  (void) ff;\n  hw_endpoint_lock_update(ep, 1);\n\n  if (ep->active) {\n    // TODO: Is this acceptable for interrupt packets?\n    TU_LOG(1, \"WARN: starting new transfer on already active ep %02X\\r\\n\", ep->ep_addr);\n    hw_endpoint_reset_transfer(ep);\n  }\n\n  // Fill in info now that we're kicking off the hw\n  ep->remaining_len = total_len;\n  ep->xferred_len = 0;\n  ep->active = true;\n\n#if CFG_TUD_EDPT_DEDICATED_HWFIFO\n  if (ff != NULL) {\n    ep->user_fifo    = ff;\n    ep->is_xfer_fifo = true;\n  } else\n#endif\n  {\n    ep->user_buf     = buffer;\n    ep->is_xfer_fifo = false;\n  }\n\n  #if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n  if (ep->e15_bulk_in) {\n    usb_hw_set->inte = USB_INTS_DEV_SOF_BITS;\n  }\n\n  if (e15_is_critical_frame_period(ep)) {\n    ep->pending = 1; // skip transfer if we are in critical frame period\n  } else\n  #endif\n  {\n    hw_endpoint_start_next_buffer(ep);\n  }\n\n  hw_endpoint_lock_update(ep, -1);\n}\n\n// sync endpoint buffer and return transferred bytes\nstatic uint16_t __tusb_irq_path_func(sync_ep_buffer)(hw_endpoint_t *ep, io_rw_32 *buf_ctrl_reg, uint8_t buf_id,\n                                                     bool is_rx) {\n  uint32_t buf_ctrl = *buf_ctrl_reg;\n  if (buf_id) {\n    buf_ctrl = buf_ctrl >> 16;\n  }\n\n  const uint16_t xferred_bytes = buf_ctrl & USB_BUF_CTRL_LEN_MASK;\n\n  if (!is_rx) {\n    // We are continuing a transfer here. If we are TX, we have successfully\n    // sent some data can increase the length we have sent\n    assert(!(buf_ctrl & USB_BUF_CTRL_FULL));\n  } else {\n    // If we have received some data, so can increase the length\n    // we have received AFTER we have copied it to the user buffer at the appropriate offset\n    assert(buf_ctrl & USB_BUF_CTRL_FULL);\n\n    uint8_t *hw_buf = ep->hw_data_buf + buf_id * 64;\n  #if CFG_TUD_EDPT_DEDICATED_HWFIFO\n    if (ep->is_xfer_fifo) {\n      // not in sram, may mess up timing with E15 workaround\n      tu_hwfifo_read_to_fifo(hw_buf, ep->user_fifo, xferred_bytes, NULL);\n    } else\n  #endif\n    {\n      unaligned_memcpy(ep->user_buf, hw_buf, xferred_bytes);\n      ep->user_buf += xferred_bytes;\n    }\n  }\n  ep->xferred_len += xferred_bytes;\n\n  // Short packet\n  if (xferred_bytes < ep->wMaxPacketSize) {\n    // Reduce total length as this is last packet\n    ep->remaining_len = 0;\n  }\n\n  return xferred_bytes;\n}\n\n// Update hw endpoint struct with info from hardware after a buff status interrupt\nstatic void __tusb_irq_path_func(sync_xfer)(hw_endpoint_t *ep) {\n  // const uint8_t    ep_num  = tu_edpt_number(ep->ep_addr);\n  const tusb_dir_t dir     = tu_edpt_dir(ep->ep_addr);\n\n  io_rw_32 *buf_ctrl_reg;\n  io_rw_32 *ep_ctrl_reg;\n  bool      is_rx;\n\n  #if CFG_TUH_ENABLED\n  const bool is_host = rp2usb_is_host_mode();\n  if (is_host) {\n    buf_ctrl_reg = hwbuf_ctrl_reg_host(ep);\n    ep_ctrl_reg  = hwep_ctrl_reg_host(ep);\n    is_rx        = (dir == TUSB_DIR_IN);\n  } else\n  #endif\n  {\n    buf_ctrl_reg = hwbuf_ctrl_reg_device(ep);\n    ep_ctrl_reg  = hwep_ctrl_reg_device(ep);\n    is_rx        = (dir == TUSB_DIR_OUT);\n  }\n\n  TU_LOG(3, \"  Sync BufCtrl: [0] = 0x%04x  [1] = 0x%04x\\r\\n\", tu_u32_low16(*buf_ctrl_reg),\n         tu_u32_high16(*buf_ctrl_reg));\n  uint16_t buf0_bytes = sync_ep_buffer(ep, buf_ctrl_reg, 0, is_rx); // always sync buffer 0\n\n  // sync buffer 1 if double buffered\n  if (ep_ctrl_reg != NULL && (*ep_ctrl_reg) & EP_CTRL_DOUBLE_BUFFERED_BITS) {\n    if (buf0_bytes == ep->wMaxPacketSize) {\n      // sync buffer 1 if not short packet\n      sync_ep_buffer(ep, buf_ctrl_reg, 1, is_rx);\n    } else {\n      // short packet on buffer 0\n      // TODO couldn't figure out how to handle this case which happen with net_lwip_webserver example\n      // At this time (currently trigger per 2 buffer), the buffer1 is probably filled with data from\n      // the next transfer (not current one). For now we disable double buffered for device OUT\n      // NOTE this could happen to Host IN\n#if 0\n      uint8_t const ep_num = tu_edpt_number(ep->ep_addr);\n      uint8_t const dir =  (uint8_t) tu_edpt_dir(ep->ep_addr);\n      uint8_t const ep_id = 2*ep_num + (dir ? 0 : 1);\n\n      // abort queued transfer on buffer 1\n      usb_hw->abort |= TU_BIT(ep_id);\n\n      while ( !(usb_hw->abort_done & TU_BIT(ep_id)) ) {}\n\n      uint32_t ep_ctrl = *ep->endpoint_control;\n      ep_ctrl &= ~(EP_CTRL_DOUBLE_BUFFERED_BITS | EP_CTRL_INTERRUPT_PER_DOUBLE_BUFFER);\n      ep_ctrl |= EP_CTRL_INTERRUPT_PER_BUFFER;\n\n      io_rw_32 *buf_ctrl_reg = is_host ? hwbuf_ctrl_reg_host(ep) : hwbuf_ctrl_reg_device(ep);\n      hwbuf_ctrl_set(buf_ctrl_reg, 0);\n\n      usb_hw->abort &= ~TU_BIT(ep_id);\n\n      TU_LOG(3, \"----SHORT PACKET buffer0 on EP %02X:\\r\\n\", ep->ep_addr);\n      TU_LOG(3, \"  BufCtrl: [0] = 0x%04x  [1] = 0x%04x\\r\\n\", tu_u32_low16(buf_ctrl), tu_u32_high16(buf_ctrl));\n#endif\n    }\n  }\n}\n\n// Returns true if transfer is complete\nbool __tusb_irq_path_func(hw_endpoint_xfer_continue)(struct hw_endpoint* ep) {\n  hw_endpoint_lock_update(ep, 1);\n\n  // Part way through a transfer\n  if (!ep->active) {\n    panic(\"Can't continue xfer on inactive ep %02X\", ep->ep_addr);\n  }\n\n  sync_xfer(ep); // Update EP struct from hardware state\n\n  // Now we have synced our state with the hardware. Is there more data to transfer?\n  // If we are done then notify tinyusb\n  if (ep->remaining_len == 0) {\n    pico_trace(\"Completed transfer of %d bytes on ep %02X\\r\\n\", ep->xferred_len, ep->ep_addr);\n    // Notify caller we are done so it can notify the tinyusb stack\n    hw_endpoint_lock_update(ep, -1);\n    return true;\n  } else {\n  #if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n    if (e15_is_critical_frame_period(ep)) {\n      ep->pending = 1;\n    } else\n  #endif\n    {\n      hw_endpoint_start_next_buffer(ep);\n    }\n  }\n\n  hw_endpoint_lock_update(ep, -1);\n  // More work to do\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// Errata 15\n//--------------------------------------------------------------------+\n\n#if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n// E15 is fixed with RP2350\n\n/* Don't mark IN buffers as available during the last 200us of a full-speed\n   frame. This avoids a situation seen with the USB2.0 hub on a Raspberry\n   Pi 4 where a late IN token before the next full-speed SOF can cause port\n   babble and a corrupt ACK packet. The nature of the data corruption has a\n   chance to cause device lockup.\n\n   Use the next SOF to mark delayed buffers as available. This reduces\n   available Bulk IN bandwidth by approximately 20%, and requires that the\n   SOF interrupt is enabled while these transfers are ongoing.\n\n   Inherit the top-level enable from the corresponding Pico-SDK flag.\n   Applications that will not use the device in a situation where it could\n   be plugged into a Pi 4 or Pi 400 (for example, when directly connected\n   to a commodity hub or other host) can turn off the flag in the SDK.\n*/\n\nvolatile uint32_t e15_last_sof = 0;\n\n// check if we need to apply Errata 15 workaround : i.e\n// Endpoint is BULK IN and is currently in critical frame period i.e 20% of last usb frame\nstatic bool __tusb_irq_path_func(e15_is_critical_frame_period)(struct hw_endpoint* ep) {\n  if (!ep->e15_bulk_in) {\n    return false;\n  }\n\n  /* Avoid the last 200us (uframe 6.5-7) of a frame, up to the EOF2 point.\n   * The device state machine cannot recover from receiving an incorrect PID\n   * when it is expecting an ACK.\n   */\n  uint32_t delta = time_us_32() - e15_last_sof;\n  if (delta < 800 || delta > 998) {\n    return false;\n  }\n  TU_LOG(3, \"Avoiding sof %lu now %lu last %lu\\r\\n\", (usb_hw->sof_rd + 1) & USB_SOF_RD_BITS, time_us_32(),\n         e15_last_sof);\n  return true;\n}\n\n#endif // TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n#endif\n"
  },
  {
    "path": "src/portable/raspberrypi/rp2040/rp2040_usb.h",
    "content": "#ifndef RP2040_COMMON_H_\n#define RP2040_COMMON_H_\n\n#include \"pico.h\"\n#include \"hardware/structs/usb.h\"\n#include \"hardware/irq.h\"\n#include \"hardware/resets.h\"\n#include \"hardware/timer.h\"\n\n#include \"common/tusb_common.h\"\n#include \"osal/osal.h\"\n#include \"common/tusb_fifo.h\"\n\n#if defined(RP2040_USB_HOST_MODE) && defined(RP2040_USB_DEVICE_MODE)\n  #error TinyUSB device and host mode not supported at the same time\n#endif\n\n// E5 and E15 only apply to RP2040\n#if defined(PICO_RP2040) && PICO_RP2040 == 1\n  // RP2040 E5: USB device fails to exit RESET state on busy USB bus.\n  #if defined(PICO_RP2040_USB_DEVICE_ENUMERATION_FIX) && !defined(TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX)\n    #define TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX PICO_RP2040_USB_DEVICE_ENUMERATION_FIX\n  #endif\n\n  // RP2040 E15: USB Device controller will hang if certain bus errors occur during an IN transfer.\n  #if defined(PICO_RP2040_USB_DEVICE_UFRAME_FIX) && !defined(TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX)\n    #define TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX PICO_RP2040_USB_DEVICE_UFRAME_FIX\n  #endif\n#endif\n\n#ifndef TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX\n  #define TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX 0\n#endif\n\n#ifndef TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n  #define TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX 0\n#endif\n\n#if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n  #undef PICO_RP2040_USB_FAST_IRQ\n  #define PICO_RP2040_USB_FAST_IRQ 1\n#endif\n\n#ifndef PICO_RP2040_USB_FAST_IRQ\n#define PICO_RP2040_USB_FAST_IRQ 0\n#endif\n\n#if PICO_RP2040_USB_FAST_IRQ\n#define __tusb_irq_path_func(x) __no_inline_not_in_flash_func(x)\n#else\n#define __tusb_irq_path_func(x) x\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n#define usb_hw_set    ((usb_hw_t *) hw_set_alias_untyped(usb_hw))\n#define usb_hw_clear  ((usb_hw_t *) hw_clear_alias_untyped(usb_hw))\n\n#define pico_info(...)  TU_LOG(2, __VA_ARGS__)\n#define pico_trace(...) TU_LOG(3, __VA_ARGS__)\n\n// Hardware information per endpoint\ntypedef struct hw_endpoint {\n  uint8_t ep_addr;\n  uint8_t next_pid;\n  bool    active;       // transferring data\n  bool    is_xfer_fifo; // transfer using fifo\n\n#if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\n  bool    e15_bulk_in; // Errata15 device bulk in\n  uint8_t pending;     // Transfer scheduled but not active\n#endif\n\n#if CFG_TUH_ENABLED\n  bool    configured;    // Is this a valid struct\n  uint8_t dev_addr;\n  uint8_t interrupt_num; // for host interrupt endpoints\n#endif\n\n  uint16_t wMaxPacketSize;\n  uint8_t *hw_data_buf; // Buffer pointer in usb dpram\n\n  // transfer info\n  union {\n    uint8_t   *user_buf; // User buffer in main memory\n    tu_fifo_t *user_fifo;\n  };\n  uint16_t remaining_len;\n  uint16_t xferred_len;\n\n} hw_endpoint_t;\n\n#if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX\nextern volatile uint32_t e15_last_sof;\n#endif\n\nvoid rp2usb_init(void);\n\n// if usb hardware is in host mode\nTU_ATTR_ALWAYS_INLINE static inline bool rp2usb_is_host_mode(void) {\n  return (usb_hw->main_ctrl & USB_MAIN_CTRL_HOST_NDEVICE_BITS) ? true : false;\n}\n\nvoid hw_endpoint_xfer_start(struct hw_endpoint *ep, uint8_t *buffer, tu_fifo_t *ff, uint16_t total_len);\nbool hw_endpoint_xfer_continue(struct hw_endpoint *ep);\nvoid hw_endpoint_reset_transfer(struct hw_endpoint *ep);\nvoid hw_endpoint_start_next_buffer(struct hw_endpoint *ep);\n\nTU_ATTR_ALWAYS_INLINE static inline void hw_endpoint_lock_update(__unused struct hw_endpoint * ep, __unused int delta) {\n  // todo add critsec as necessary to prevent issues between worker and IRQ...\n  //  note that this is perhaps as simple as disabling IRQs because it would make\n  //  sense to have worker and IRQ on same core, however I think using critsec is about equivalent.\n}\n\n// #if CFG_TUD_ENABLED\nTU_ATTR_ALWAYS_INLINE static inline io_rw_32 *hwep_ctrl_reg_device(struct hw_endpoint *ep) {\n  uint8_t const epnum = tu_edpt_number(ep->ep_addr);\n  const uint8_t dir   = (uint8_t)tu_edpt_dir(ep->ep_addr);\n  if (epnum == 0) {\n    // EP0 has no endpoint control register because the buffer offsets are fixed and always enabled\n    return NULL;\n  }\n  return (dir == TUSB_DIR_IN) ? &usb_dpram->ep_ctrl[epnum - 1].in : &usb_dpram->ep_ctrl[epnum - 1].out;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline io_rw_32 *hwbuf_ctrl_reg_device(struct hw_endpoint *ep) {\n  const uint8_t epnum = tu_edpt_number(ep->ep_addr);\n  const uint8_t dir   = (uint8_t)tu_edpt_dir(ep->ep_addr);\n  return (dir == TUSB_DIR_IN) ? &usb_dpram->ep_buf_ctrl[epnum].in : &usb_dpram->ep_buf_ctrl[epnum].out;\n}\n// #endif\n\n#if CFG_TUH_ENABLED\nTU_ATTR_ALWAYS_INLINE static inline io_rw_32 *hwep_ctrl_reg_host(struct hw_endpoint *ep) {\n  if (tu_edpt_number(ep->ep_addr) == 0) {\n    return &usbh_dpram->epx_ctrl;\n  }\n  return &usbh_dpram->int_ep_ctrl[ep->interrupt_num].ctrl;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline io_rw_32 *hwbuf_ctrl_reg_host(struct hw_endpoint *ep) {\n  if (tu_edpt_number(ep->ep_addr) == 0) {\n    return &usbh_dpram->epx_buf_ctrl;\n  }\n  return &usbh_dpram->int_ep_buffer_ctrl[ep->interrupt_num].ctrl;\n}\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nvoid hwbuf_ctrl_update(io_rw_32 *buf_ctrl_reg, uint32_t and_mask, uint32_t or_mask);\n\nTU_ATTR_ALWAYS_INLINE static inline void hwbuf_ctrl_set(io_rw_32 *buf_ctrl_reg, uint32_t value) {\n  hwbuf_ctrl_update(buf_ctrl_reg, 0, value);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void hwbuf_ctrl_set_mask(io_rw_32 *buf_ctrl_reg, uint32_t value) {\n  hwbuf_ctrl_update(buf_ctrl_reg, ~value, value);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void hwbuf_ctrl_clear_mask(io_rw_32 *buf_ctrl_reg, uint32_t value) {\n  hwbuf_ctrl_update(buf_ctrl_reg, ~value, 0);\n}\n\nstatic inline uintptr_t hw_data_offset(uint8_t *buf) {\n  // Remove usb base from buffer pointer\n  return (uintptr_t)buf ^ (uintptr_t)usb_dpram;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/renesas/rusb2/dcd_rusb2.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Koji Kitayama\n * Portions copyrighted (c) 2021 Roland Winistoerfer\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_RUSB2)\n\n#include \"device/dcd.h\"\n#include \"rusb2_common.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\nenum {\n  PIPE_COUNT = 10,\n};\n\ntypedef struct {\n  void      *buf;      /* the start address of a transfer data buffer */\n  uint16_t  length;    /* the number of bytes in the buffer */\n  uint16_t  remaining; /* the number of bytes remaining in the buffer */\n\n  uint8_t ep; /* an assigned endpoint address */\n  uint8_t ff; /* `buf` is TU_FUFO or POD */\n} pipe_state_t;\n\ntypedef struct\n{\n  pipe_state_t pipe[PIPE_COUNT];\n  uint8_t ep[2][16];   /* a lookup table for a pipe index from an endpoint address */\n  // Track whether sof has been manually enabled\n  bool sof_enabled;\n} dcd_data_t;\n\nstatic dcd_data_t _dcd;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\n\n\n// Transfer conditions specifiable for each pipe for most MCUs\n// - Pipe 0: Control transfer with 64-byte single buffer\n// - Pipes 1 and 2: Bulk or ISO\n// - Pipes 3 to 5: Bulk\n// - Pipes 6 to 9: Interrupt\n//\n// Note: for small mcu such as\n// - RA2A1: only pipe 4-7 are available, and no support for ISO\nstatic unsigned find_pipe(unsigned xfer_type) {\n  #if defined(BSP_MCU_GROUP_RA2A1)\n  const uint8_t pipe_idx_arr[4][2] = {\n      { 0, 0 }, // Control\n      { 0, 0 }, // Isochronous not supported\n      { 4, 5 }, // Bulk\n      { 6, 7 }, // Interrupt\n  };\n  #else\n  const uint8_t pipe_idx_arr[4][2] = {\n      { 0, 0 }, // Control\n      { 1, 2 }, // Isochronous\n      { 1, 5 }, // Bulk\n      { 6, 9 }, // Interrupt\n  };\n  #endif\n\n  // find backward since only pipe 1, 2 support ISO\n  const uint8_t idx_first = pipe_idx_arr[xfer_type][0];\n  const uint8_t idx_last  = pipe_idx_arr[xfer_type][1];\n\n  for (int i = idx_last; i >= idx_first; i--) {\n    if (0 == _dcd.pipe[i].ep) return i;\n  }\n\n  return 0;\n}\n\nstatic volatile uint16_t* get_pipectr(rusb2_reg_t *rusb, unsigned num) {\n  if (num) {\n    return (volatile uint16_t*)&(rusb->PIPE_CTR[num - 1]);\n  } else {\n    return (volatile uint16_t*)&(rusb->DCPCTR);\n  }\n}\n\nstatic volatile reg_pipetre_t* get_pipetre(rusb2_reg_t *rusb, unsigned num) {\n  volatile reg_pipetre_t* tre = NULL;\n  if ((1 <= num) && (num <= 5)) {\n    tre = (volatile reg_pipetre_t*)&(rusb->PIPE_TR[num - 1].E);\n  }\n  return tre;\n}\n\nstatic volatile uint16_t* ep_addr_to_pipectr(uint8_t rhport, unsigned ep_addr) {\n  rusb2_reg_t *rusb = RUSB2_REG(rhport);\n  const unsigned epn = tu_edpt_number(ep_addr);\n\n  if (epn) {\n    const unsigned dir = tu_edpt_dir(ep_addr);\n    const unsigned num = _dcd.ep[dir][epn];\n    return get_pipectr(rusb, num);\n  } else {\n    return get_pipectr(rusb, 0);\n  }\n}\n\nstatic uint16_t edpt0_max_packet_size(rusb2_reg_t* rusb) {\n  return rusb->DCPMAXP_b.MXPS;\n}\n\nstatic uint16_t edpt_max_packet_size(rusb2_reg_t *rusb, unsigned num) {\n  rusb->PIPESEL = num;\n  return rusb->PIPEMAXP;\n}\n\nstatic inline void pipe_wait_for_ready(rusb2_reg_t * rusb, unsigned num) {\n  while ( rusb->D0FIFOSEL_b.CURPIPE != num ) {}\n  while ( !rusb->D0FIFOCTR_b.FRDY ) {}\n}\n\n//--------------------------------------------------------------------+\n// Pipe Transfer\n//--------------------------------------------------------------------+\nstatic bool pipe0_xfer_in(rusb2_reg_t *rusb) {\n  pipe_state_t  *pipe = &_dcd.pipe[0];\n  const unsigned rem  = pipe->remaining;\n\n  if (!rem) {\n    pipe->buf = NULL;\n    return true;\n  }\n\n  const uint16_t mps = edpt0_max_packet_size(rusb);\n  const uint16_t len = tu_min16(mps, rem);\n  void          *buf = pipe->buf;\n\n  if (len) {\n    // uint16_t           fifo_sel = RUSB2_CFIFOSEL_ISEL_WRITE | FIFOSEL_BIGEND;\n    tu_hwfifo_access_t access_mode;\n    access_mode.param = (uintptr_t)rusb;\n    //\n    if (rusb2_is_highspeed_reg(rusb)) {\n      //   fifo_sel |= RUSB2_FIFOSEL_MBW_32BIT;\n      access_mode.data_stride = 4u;\n    } else {\n      //   fifo_sel |= RUSB2_FIFOSEL_MBW_16BIT;\n      access_mode.data_stride = 2u;\n    }\n    // rusb->CFIFOSEL = fifo_sel;\n    // while (0 == (rusb->CFIFOSEL & RUSB2_CFIFOSEL_ISEL_WRITE)) {}\n\n    if (pipe->ff) {\n      tu_hwfifo_write_from_fifo(&rusb->CFIFO, (tu_fifo_t *)buf, len, &access_mode);\n    } else {\n      tu_hwfifo_write(&rusb->CFIFO, buf, len, &access_mode);\n      pipe->buf = (uint8_t *)buf + len;\n    }\n  }\n\n  if (len < mps) {\n    rusb->CFIFOCTR = RUSB2_CFIFOCTR_BVAL_Msk;\n  }\n\n  pipe->remaining = rem - len;\n  return false;\n}\n\nstatic bool pipe0_xfer_out(rusb2_reg_t *rusb) {\n  pipe_state_t  *pipe = &_dcd.pipe[0];\n  const unsigned rem  = pipe->remaining;\n\n  const uint16_t mps = edpt0_max_packet_size(rusb);\n  const uint16_t vld = rusb->CFIFOCTR_b.DTLN;\n  const uint16_t len = tu_min16(tu_min16(rem, mps), vld);\n  void          *buf = pipe->buf;\n\n  if (len) {\n    tu_hwfifo_access_t access_mode = {.data_stride = (rusb2_is_highspeed_reg(rusb) ? 4u : 2u),\n                                      .param       = (uintptr_t)rusb};\n\n    if (pipe->ff) {\n      tu_hwfifo_read_to_fifo(&rusb->CFIFO, (tu_fifo_t *)buf, len, &access_mode);\n    } else {\n      tu_hwfifo_read(&rusb->CFIFO, buf, len, &access_mode);\n      pipe->buf = (uint8_t *)buf + len;\n    }\n  }\n\n  if (len < mps) {\n    rusb->CFIFOCTR = RUSB2_CFIFOCTR_BCLR_Msk;\n  }\n\n  pipe->remaining = rem - len;\n  if ((len < mps) || (rem == len)) {\n    pipe->buf = NULL;\n    return true;\n  }\n\n  return false;\n}\n\nstatic bool pipe_xfer_in(rusb2_reg_t* rusb, unsigned num)\n{\n  pipe_state_t  *pipe = &_dcd.pipe[num];\n  const unsigned rem  = pipe->remaining;\n\n  if (!rem) {\n    pipe->buf = NULL;\n    return true;\n  }\n\n  const uint16_t fifo_sel     = num | FIFOSEL_BIGEND;\n  const bool     is_highspeed = rusb2_is_highspeed_reg(rusb);\n  if (is_highspeed) {\n    rusb->D0FIFOSEL = fifo_sel | RUSB2_FIFOSEL_MBW_32BIT;\n  } else {\n    rusb->D0FIFOSEL = fifo_sel | RUSB2_FIFOSEL_MBW_16BIT;\n  }\n\n  const uint16_t mps = edpt_max_packet_size(rusb, num);\n  pipe_wait_for_ready(rusb, num);\n  uint16_t len = tu_min16(rem, mps);\n  void    *buf = pipe->buf;\n\n  if (len) {\n    tu_hwfifo_access_t access_mode = {.data_stride = (rusb2_is_highspeed_reg(rusb) ? 4u : 2u),\n                                      .param       = (uintptr_t)rusb};\n    if (pipe->ff) {\n      tu_hwfifo_write_from_fifo(&rusb->D0FIFO, (tu_fifo_t *)buf, len, &access_mode);\n    } else {\n      tu_hwfifo_write(&rusb->D0FIFO, buf, len, &access_mode);\n      pipe->buf = (uint8_t *)buf + len;\n    }\n  }\n\n  if (len < mps) {\n    rusb->D0FIFOCTR = RUSB2_CFIFOCTR_BVAL_Msk;\n  }\n\n  rusb->D0FIFOSEL = 0;\n  while (rusb->D0FIFOSEL_b.CURPIPE) {} /* if CURPIPE bits changes, check written value */\n\n  pipe->remaining = rem - len;\n\n  return false;\n}\n\nstatic bool pipe_xfer_out(rusb2_reg_t* rusb, unsigned num)\n{\n  pipe_state_t  *pipe = &_dcd.pipe[num];\n  const uint16_t rem  = pipe->remaining;\n\n  uint16_t fifo_sel = num | FIFOSEL_BIGEND;\n  if (rusb2_is_highspeed_reg(rusb)) {\n    fifo_sel |= RUSB2_FIFOSEL_MBW_32BIT;\n  } else {\n    fifo_sel |= RUSB2_FIFOSEL_MBW_16BIT;\n  }\n  rusb->D0FIFOSEL = fifo_sel;\n\n  const uint16_t mps = edpt_max_packet_size(rusb, num);\n  pipe_wait_for_ready(rusb, num);\n\n  const uint16_t vld  = rusb->D0FIFOCTR_b.DTLN;\n  const uint16_t len  = tu_min16(tu_min16(rem, mps), vld);\n  void          *buf  = pipe->buf;\n\n  if (len) {\n    tu_hwfifo_access_t access_mode = {.data_stride = (rusb2_is_highspeed_reg(rusb) ? 4u : 2u),\n                                      .param       = (uintptr_t)rusb};\n    if (pipe->ff) {\n      tu_hwfifo_read_to_fifo(&rusb->D0FIFO, (tu_fifo_t *)buf, len, &access_mode);\n    } else {\n      tu_hwfifo_read(&rusb->D0FIFO, buf, len, &access_mode);\n      pipe->buf = (uint8_t *)buf + len;\n    }\n  }\n\n  if (len < mps) {\n    rusb->D0FIFOCTR = RUSB2_CFIFOCTR_BCLR_Msk;\n  }\n\n  rusb->D0FIFOSEL = 0;\n  while (rusb->D0FIFOSEL_b.CURPIPE) {} /* if CURPIPE bits changes, check written value */\n\n  pipe->remaining = rem - len;\n  if ((len < mps) || (rem == len)) {\n    pipe->buf = NULL;\n    return NULL != buf;\n  }\n\n  return false;\n}\n\nstatic void process_setup_packet(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  if (0 == (rusb->INTSTS0 & RUSB2_INTSTS0_VALID_Msk)) return;\n\n  rusb->CFIFOCTR = RUSB2_CFIFOCTR_BCLR_Msk;\n  uint16_t setup_packet[4] = {\n      tu_htole16(rusb->USBREQ),\n      tu_htole16(rusb->USBVAL),\n      tu_htole16(rusb->USBINDX),\n      tu_htole16(rusb->USBLENG)\n  };\n\n  rusb->INTSTS0 = ~((uint16_t) RUSB2_INTSTS0_VALID_Msk);\n  dcd_event_setup_received(rhport, (const uint8_t*)&setup_packet[0], true);\n}\n\nstatic void process_status_completion(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  uint8_t ep_addr;\n  /* Check the data stage direction */\n  if (rusb->CFIFOSEL & RUSB2_CFIFOSEL_ISEL_WRITE) {\n    /* IN transfer. */\n    ep_addr = tu_edpt_addr(0, TUSB_DIR_IN);\n  } else {\n    /* OUT transfer. */\n    ep_addr = tu_edpt_addr(0, TUSB_DIR_OUT);\n  }\n\n  dcd_event_xfer_complete(rhport, ep_addr, 0, XFER_RESULT_SUCCESS, true);\n}\n\nstatic bool process_pipe0_xfer(rusb2_reg_t *rusb, int buffer_type, uint8_t ep_addr, void *buffer,\n                               uint16_t total_bytes) {\n  uint16_t fifo_sel =\n    (rusb2_is_highspeed_reg(rusb) ? RUSB2_FIFOSEL_MBW_32BIT : RUSB2_FIFOSEL_MBW_16BIT) | FIFOSEL_BIGEND;\n\n  /* configure fifo direction and access unit settings */\n  if (ep_addr != 0) {\n    // Control IN\n    fifo_sel |= RUSB2_CFIFOSEL_ISEL_WRITE;\n  }\n  rusb->CFIFOSEL = fifo_sel;\n  while ((rusb->CFIFOSEL & RUSB2_CFIFOSEL_ISEL_WRITE) != (fifo_sel & RUSB2_CFIFOSEL_ISEL_WRITE)) {\n    // wait until ISEL_WRITE take effect\n  }\n\n  pipe_state_t *pipe = &_dcd.pipe[0];\n  pipe->ff           = buffer_type;\n  pipe->length       = total_bytes;\n  pipe->remaining    = total_bytes;\n\n  if (total_bytes) {\n    pipe->buf = buffer;\n    if (ep_addr) {\n      /* IN */\n      TU_ASSERT(rusb->DCPCTR_b.BSTS && (rusb->USBREQ & 0x80));\n      pipe0_xfer_in(rusb);\n    }\n    rusb->DCPCTR = RUSB2_PIPE_CTR_PID_BUF;\n  } else {\n    /* ZLP */\n    pipe->buf = NULL;\n    rusb->DCPCTR = RUSB2_DCPCTR_CCPL_Msk | RUSB2_PIPE_CTR_PID_BUF;\n  }\n\n  return true;\n}\n\nstatic bool process_pipe_xfer(rusb2_reg_t* rusb, int buffer_type, uint8_t ep_addr, void* buffer, uint16_t total_bytes)\n{\n  const unsigned epn = tu_edpt_number(ep_addr);\n  const unsigned dir = tu_edpt_dir(ep_addr);\n  const unsigned num = _dcd.ep[dir][epn];\n\n  TU_ASSERT(num);\n\n  pipe_state_t *pipe  = &_dcd.pipe[num];\n  pipe->ff        = buffer_type;\n  pipe->buf       = buffer;\n  pipe->length    = total_bytes;\n  pipe->remaining = total_bytes;\n\n  if (dir) {\n    /* IN */\n    if (total_bytes) {\n      pipe_xfer_in(rusb, num);\n    } else {\n      /* ZLP */\n      rusb->D0FIFOSEL = num;\n      pipe_wait_for_ready(rusb, num);\n      rusb->D0FIFOCTR = RUSB2_CFIFOCTR_BVAL_Msk;\n      rusb->D0FIFOSEL = 0;\n      /* if CURPIPE bits changes, check written value */\n      while (rusb->D0FIFOSEL_b.CURPIPE) {}\n    }\n  } else {\n    // OUT\n    volatile reg_pipetre_t *pt = get_pipetre(rusb, num);\n\n    if (pt) {\n      const uint16_t     mps = edpt_max_packet_size(rusb, num);\n      volatile uint16_t *ctr = get_pipectr(rusb, num);\n\n      if (*ctr & 0x3) *ctr = RUSB2_PIPE_CTR_PID_NAK;\n\n      pt->TRE   = TU_BIT(8);\n      pt->TRN   = (total_bytes + mps - 1) / mps;\n      pt->TRENB = 1;\n      *ctr = RUSB2_PIPE_CTR_PID_BUF;\n    }\n  }\n\n  //  TU_LOG2(\"X %x %d %d\\r\\n\", ep_addr, total_bytes, buffer_type);\n  return true;\n}\n\nstatic bool process_edpt_xfer(rusb2_reg_t* rusb, int buffer_type, uint8_t ep_addr, void* buffer, uint16_t total_bytes)\n{\n  const unsigned epn = tu_edpt_number(ep_addr);\n  if (0 == epn) {\n    return process_pipe0_xfer(rusb, buffer_type, ep_addr, buffer, total_bytes);\n  } else {\n    return process_pipe_xfer(rusb, buffer_type, ep_addr, buffer, total_bytes);\n  }\n}\n\nstatic void process_pipe0_bemp(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  bool         completed = pipe0_xfer_in(rusb);\n  if (completed) {\n    pipe_state_t *pipe = &_dcd.pipe[0];\n    dcd_event_xfer_complete(rhport, tu_edpt_addr(0, TUSB_DIR_IN),\n                            pipe->length, XFER_RESULT_SUCCESS, true);\n  }\n}\n\nstatic void process_pipe_brdy(uint8_t rhport, unsigned num)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  pipe_state_t  *pipe = &_dcd.pipe[num];\n  const unsigned dir  = tu_edpt_dir(pipe->ep);\n  bool completed;\n\n  if (dir) {\n    /* IN */\n    completed = pipe_xfer_in(rusb, num);\n  } else {\n    // OUT\n    if (num) {\n      completed = pipe_xfer_out(rusb, num);\n    } else {\n      completed = pipe0_xfer_out(rusb);\n    }\n  }\n  if (completed) {\n    dcd_event_xfer_complete(rhport, pipe->ep,\n                            pipe->length - pipe->remaining,\n                            XFER_RESULT_SUCCESS, true);\n    //  TU_LOG1(\"C %d %d\\r\\n\", num, pipe->length - pipe->remaining);\n  }\n}\n\nstatic void process_bus_reset(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n\n  rusb->BEMPENB = 1;\n  rusb->BRDYENB = 1;\n  rusb->CFIFOCTR = RUSB2_CFIFOCTR_BCLR_Msk;\n\n  rusb->D0FIFOSEL = 0;\n  while (rusb->D0FIFOSEL_b.CURPIPE) {} /* if CURPIPE bits changes, check written value */\n\n  rusb->D1FIFOSEL = 0;\n  while (rusb->D1FIFOSEL_b.CURPIPE) {} /* if CURPIPE bits changes, check written value */\n\n  volatile uint16_t *ctr = (volatile uint16_t*)((uintptr_t) (&rusb->PIPE_CTR[0]));\n  volatile uint16_t *tre = (volatile uint16_t*)((uintptr_t) (&rusb->PIPE_TR[0].E));\n\n  for (int i = 1; i <= 5; ++i) {\n    rusb->PIPESEL = i;\n    rusb->PIPECFG = 0;\n    *ctr = RUSB2_PIPE_CTR_ACLRM_Msk;\n    *ctr = 0;\n    ++ctr;\n    *tre = TU_BIT(8);\n    tre += 2;\n  }\n\n  for (int i = 6; i <= 9; ++i) {\n    rusb->PIPESEL = i;\n    rusb->PIPECFG = 0;\n    *ctr = RUSB2_PIPE_CTR_ACLRM_Msk;\n    *ctr = 0;\n    ++ctr;\n  }\n  tu_varclr(&_dcd);\n\n  TU_LOG3(\"Bus reset, RHST = %u\\r\\n\", rusb->DVSTCTR0_b.RHST);\n  tusb_speed_t speed;\n  switch(rusb->DVSTCTR0 & RUSB2_DVSTCTR0_RHST_Msk) {\n    case RUSB2_DVSTCTR0_RHST_LS:\n      speed = TUSB_SPEED_LOW;\n      break;\n\n    case RUSB2_DVSTCTR0_RHST_FS:\n      speed = TUSB_SPEED_FULL;\n      break;\n\n    case RUSB2_DVSTCTR0_RHST_HS:\n      speed = TUSB_SPEED_HIGH;\n      break;\n\n    default:\n      TU_ASSERT(false, );\n  }\n\n  dcd_event_bus_reset(rhport, speed, true);\n}\n\nstatic void process_set_address(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  const uint16_t addr = rusb->USBADDR_b.USBADDR;\n  if (!addr) {\n    return;\n  }\n\n  const tusb_control_request_t setup_packet = {\n#if defined(__CCRX__)\n      .bmRequestType = { 0 },  /* Note: CCRX needs the braces over this struct member */\n  #else\n    .bmRequestType = 0,\n  #endif\n    .bRequest = TUSB_REQ_SET_ADDRESS,\n    .wValue   = addr,\n    .wIndex   = 0,\n    .wLength  = 0,\n  };\n\n  dcd_event_setup_received(rhport, (const uint8_t *) &setup_packet, true);\n}\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\n\n#if 0 // previously present in the rx driver before generalization\nstatic uint32_t disable_interrupt(void)\n{\n  uint32_t pswi;\n#if defined(__CCRX__)\n  pswi = get_psw() & 0x010000;\n  clrpsw_i();\n#else\n  pswi = __builtin_rx_mvfc(0) & 0x010000;\n  __builtin_rx_clrpsw('I');\n#endif\n  return pswi;\n}\n\nstatic void enable_interrupt(uint32_t pswi)\n{\n#if defined(__CCRX__)\n  set_psw(get_psw() | pswi);\n#else\n  __builtin_rx_mvtc(0, __builtin_rx_mvfc(0) | pswi);\n#endif\n}\n#endif\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  rusb2_module_start(rhport, true);\n\n  // We disable SOF for now until needed later on.\n  // Since TinyUSB doesn't use SOF for now, and this interrupt often (1ms interval)\n  _dcd.sof_enabled = false;\n\n#ifdef RUSB2_SUPPORT_HIGHSPEED\n  if ( rusb2_is_highspeed_rhport(rhport) ) {\n    rusb->SYSCFG_b.HSE = 1;\n\n    // leave CLKSEL as default (0x11) 24Mhz\n\n    // Power and reset UTMI Phy\n    uint16_t physet = (rusb->PHYSET | RUSB2_PHYSET_PLLRESET_Msk) & ~RUSB2_PHYSET_DIRPD_Msk;\n    rusb->PHYSET = physet;\n    R_BSP_SoftwareDelay((uint32_t) 1, BSP_DELAY_UNITS_MILLISECONDS);\n    rusb->PHYSET_b.PLLRESET = 0;\n\n    // set UTMI to operating mode and wait for PLL lock confirmation\n    rusb->LPSTS_b.SUSPENDM = 1;\n    while (!rusb->PLLSTA_b.PLLLOCK) {}\n\n    rusb->SYSCFG_b.DRPD = 0;\n    rusb->SYSCFG_b.USBE = 1;\n\n    // Set CPU bus wait time (fine tunne later)\n    // rusb2->BUSWAIT |= 0x0F00U;\n\n    rusb->PHYSET_b.REPSEL = 1;\n  } else\n#endif\n  {\n    rusb->SYSCFG_b.SCKE = 1;\n    while (!rusb->SYSCFG_b.SCKE) {}\n    rusb->SYSCFG_b.DRPD = 0;\n    rusb->SYSCFG_b.DCFM = 0;\n    rusb->SYSCFG_b.USBE = 1;\n\n    // MCU specific PHY init\n    rusb2_phy_init();\n\n    rusb->PHYSLEW = 0x5;\n    rusb->DPUSR0R_FS_b.FIXPHY0 = 0u; /* USB_BASE Transceiver Output fixed */\n  }\n\n  /* Setup default control pipe */\n  rusb->DCPMAXP_b.MXPS = 64;\n\n  rusb->INTSTS0 = 0;\n  rusb->INTENB0 = RUSB2_INTSTS0_VBINT_Msk | RUSB2_INTSTS0_BRDY_Msk | RUSB2_INTSTS0_BEMP_Msk |\n                  RUSB2_INTSTS0_DVST_Msk | RUSB2_INTSTS0_CTRT_Msk | (_dcd.sof_enabled ? RUSB2_INTSTS0_SOFR_Msk : 0) |\n                  RUSB2_INTSTS0_RESM_Msk;\n  rusb->BEMPENB = 1;\n  rusb->BRDYENB = 1;\n\n  // If VBUS (detect) pin is not used, application need to call tud_connect() manually after tud_init()\n  if (rusb->INTSTS0_b.VBSTS) {\n    dcd_connect(rhport);\n  }\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  rusb2_int_enable(rhport);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  rusb2_int_disable(rhport);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  (void) rhport;\n  (void) dev_addr;\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  rusb->DVSTCTR0_b.WKUP = 1;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n\n  if ( rusb2_is_highspeed_rhport(rhport)) {\n    rusb->SYSCFG_b.CNEN = 1;\n  }\n  rusb->SYSCFG_b.DPRPU = 1;\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  rusb->SYSCFG_b.DPRPU = 0;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  _dcd.sof_enabled = en;\n  rusb->INTENB0_b.SOFE = en ? 1: 0;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * ep_desc)\n{\n  (void)rhport;\n\n  rusb2_reg_t * rusb = RUSB2_REG(rhport);\n  const unsigned ep_addr = ep_desc->bEndpointAddress;\n  const unsigned epn     = tu_edpt_number(ep_addr);\n  const unsigned dir     = tu_edpt_dir(ep_addr);\n  const unsigned xfer    = ep_desc->bmAttributes.xfer;\n\n  const unsigned mps = tu_edpt_packet_size(ep_desc);\n\n  if (xfer == TUSB_XFER_ISOCHRONOUS) {\n    // Fullspeed ISO is limit to 256 bytes\n    if ( !rusb2_is_highspeed_rhport(rhport) && mps > 256) {\n      return false;\n    }\n  }\n\n  const unsigned num = find_pipe(xfer);\n  TU_ASSERT(num);\n\n  _dcd.pipe[num].ep = ep_addr;\n  _dcd.ep[dir][epn] = num;\n\n  /* setup pipe */\n  dcd_int_disable(rhport);\n\n  if ( rusb2_is_highspeed_rhport(rhport) ) {\n    // FIXME shouldn't be after pipe selection and config, also the BUFNMB should be changed\n    //       depending on the allocation scheme\n    rusb->PIPEBUF = 0x7C08;\n  }\n\n  rusb->PIPESEL = num;\n  rusb->PIPEMAXP = mps;\n  volatile uint16_t *ctr = get_pipectr(rusb, num);\n  *ctr = RUSB2_PIPE_CTR_ACLRM_Msk | RUSB2_PIPE_CTR_SQCLR_Msk;\n  *ctr = 0;\n  unsigned cfg = (dir << 4) | epn;\n\n  if (xfer == TUSB_XFER_BULK) {\n    cfg |= (RUSB2_PIPECFG_TYPE_BULK | RUSB2_PIPECFG_SHTNAK_Msk | RUSB2_PIPECFG_DBLB_Msk);\n  } else if (xfer == TUSB_XFER_INTERRUPT) {\n    cfg |= RUSB2_PIPECFG_TYPE_INT;\n  } else {\n    cfg |= (RUSB2_PIPECFG_TYPE_ISO | RUSB2_PIPECFG_DBLB_Msk);\n  }\n\n  rusb->PIPECFG = cfg;\n  rusb->BRDYSTS = 0x3FFu ^ TU_BIT(num);\n  rusb->BRDYENB |= TU_BIT(num);\n\n  if (dir || (xfer != TUSB_XFER_BULK)) {\n    *ctr = RUSB2_PIPE_CTR_PID_BUF;\n  }\n\n  // TU_LOG1(\"O %d %x %x\\r\\n\", rusb->PIPESEL, rusb->PIPECFG, rusb->PIPEMAXP);\n  dcd_int_enable(rhport);\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport)\n{\n  unsigned i = TU_ARRAY_SIZE(_dcd.pipe);\n  dcd_int_disable(rhport);\n  while (--i) { /* Close all pipes except 0 */\n    const unsigned ep_addr = _dcd.pipe[i].ep;\n    if (!ep_addr) continue;\n    dcd_edpt_close(rhport, ep_addr);\n  }\n  dcd_int_enable(rhport);\n}\n\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)\n{\n  rusb2_reg_t * rusb = RUSB2_REG(rhport);\n  const unsigned epn = tu_edpt_number(ep_addr);\n  const unsigned dir = tu_edpt_dir(ep_addr);\n  const unsigned num = _dcd.ep[dir][epn];\n\n  rusb->BRDYENB &= ~TU_BIT(num);\n  volatile uint16_t *ctr = get_pipectr(rusb, num);\n  *ctr = 0;\n  rusb->PIPESEL = num;\n  rusb->PIPECFG = 0;\n  _dcd.pipe[num].ep = 0;\n  _dcd.ep[dir][epn] = 0;\n}\n\n#if 0\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n#endif\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n\n  dcd_int_disable(rhport);\n  bool r = process_edpt_xfer(rusb, 0, ep_addr, buffer, total_bytes);\n  dcd_int_enable(rhport);\n\n  return r;\n}\n\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  // USB buffers always work in bytes so to avoid unnecessary divisions we demand item_size = 1\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n\n  dcd_int_disable(rhport);\n  bool r = process_edpt_xfer(rusb, 1, ep_addr, ff, total_bytes);\n  dcd_int_enable(rhport);\n\n  return r;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  volatile uint16_t *ctr = ep_addr_to_pipectr(rhport, ep_addr);\n  if (!ctr) {\n    return;\n  }\n  dcd_int_disable(rhport);\n  const uint32_t pid = *ctr & 0x3;\n  *ctr = pid | RUSB2_PIPE_CTR_PID_STALL;\n  *ctr = RUSB2_PIPE_CTR_PID_STALL;\n  dcd_int_enable(rhport);\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  rusb2_reg_t * rusb = RUSB2_REG(rhport);\n  volatile uint16_t *ctr = ep_addr_to_pipectr(rhport, ep_addr);\n  if (!ctr) {\n    return;\n  }\n\n  dcd_int_disable(rhport);\n  *ctr = RUSB2_PIPE_CTR_SQCLR_Msk;\n\n  if (tu_edpt_dir(ep_addr)) { /* IN */\n    *ctr = RUSB2_PIPE_CTR_PID_BUF;\n  } else {\n    const unsigned num = _dcd.ep[0][tu_edpt_number(ep_addr)];\n    rusb->PIPESEL = num;\n    if (rusb->PIPECFG_b.TYPE != 1) {\n      *ctr = RUSB2_PIPE_CTR_PID_BUF;\n    }\n  }\n  dcd_int_enable(rhport);\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\n\n#if defined(__CCRX__)\nTU_ATTR_ALWAYS_INLINE static inline unsigned __builtin_ctz(unsigned int value) {\n  unsigned int count = 0;\n  while ((value & 1) == 0) {\n    value >>= 1;\n    count++;\n  }\n  return count;\n}\n#endif\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n\n  uint16_t is0 = rusb->INTSTS0;\n\n  /* clear active bits except VALID (don't write 0 to already cleared bits according to the HW manual) */\n  rusb->INTSTS0 = ~((RUSB2_INTSTS0_CTRT_Msk | RUSB2_INTSTS0_DVST_Msk | RUSB2_INTSTS0_SOFR_Msk |\n                     RUSB2_INTSTS0_RESM_Msk | RUSB2_INTSTS0_VBINT_Msk) & is0) | RUSB2_INTSTS0_VALID_Msk;\n\n  // VBUS changes\n  if ( is0 & RUSB2_INTSTS0_VBINT_Msk ) {\n    if ( rusb->INTSTS0_b.VBSTS ) {\n      dcd_connect(rhport);\n    } else {\n      dcd_disconnect(rhport);\n    }\n  }\n\n  // Resumed\n  if ( is0 & RUSB2_INTSTS0_RESM_Msk ) {\n    dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n    if (!_dcd.sof_enabled) {\n      rusb->INTENB0_b.SOFE = 0;\n    }\n  }\n\n  // SOF received\n  if ( (is0 & RUSB2_INTSTS0_SOFR_Msk) && rusb->INTENB0_b.SOFE ) {\n    // USBD will exit suspended mode when SOF event is received\n    const uint32_t frame = rusb->FRMNUM_b.FRNM;\n    dcd_event_sof(rhport, frame, true);\n    if (!_dcd.sof_enabled) {\n      rusb->INTENB0_b.SOFE = 0;\n    }\n  }\n\n  // Device state changes\n  if ( is0 & RUSB2_INTSTS0_DVST_Msk ) {\n    switch (is0 & RUSB2_INTSTS0_DVSQ_Msk) {\n      case RUSB2_INTSTS0_DVSQ_STATE_DEF:\n        process_bus_reset(rhport);\n        break;\n\n      case RUSB2_INTSTS0_DVSQ_STATE_ADDR:\n        process_set_address(rhport);\n        break;\n\n      case RUSB2_INTSTS0_DVSQ_STATE_SUSP0:\n      case RUSB2_INTSTS0_DVSQ_STATE_SUSP1:\n      case RUSB2_INTSTS0_DVSQ_STATE_SUSP2:\n      case RUSB2_INTSTS0_DVSQ_STATE_SUSP3:\n        dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n        if (!_dcd.sof_enabled) {\n          rusb->INTENB0_b.SOFE = 1;\n        }\n\n      default: break;\n    }\n  }\n\n//  if ( is0 & RUSB2_INTSTS0_NRDY_Msk ) {\n//    rusb->NRDYSTS = 0;\n//  }\n\n  // Control transfer stage changes\n  if ( is0 & RUSB2_INTSTS0_CTRT_Msk ) {\n    if ( is0 & RUSB2_INTSTS0_CTSQ_CTRL_RDATA ) {\n      /* A setup packet has been received. */\n      process_setup_packet(rhport);\n    } else if ( 0 == (is0 & RUSB2_INTSTS0_CTSQ_Msk) ) {\n      /* A ZLP has been sent/received. */\n      process_status_completion(rhport);\n    }\n  }\n\n  // Buffer empty\n  if ( is0 & RUSB2_INTSTS0_BEMP_Msk ) {\n    const uint16_t s = rusb->BEMPSTS;\n    rusb->BEMPSTS = 0;\n    if ( s & 1 ) {\n      process_pipe0_bemp(rhport);\n    }\n  }\n\n  // Buffer ready\n  if ( is0 & RUSB2_INTSTS0_BRDY_Msk ) {\n    const unsigned m = rusb->BRDYENB;\n    unsigned s = rusb->BRDYSTS & m;\n    /* clear active bits (don't write 0 to already cleared bits according to the HW manual) */\n    rusb->BRDYSTS = ~s;\n    while (s) {\n      const unsigned num = __builtin_ctz(s);\n      process_pipe_brdy(rhport, num);\n      s &= ~TU_BIT(num);\n    }\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/renesas/rusb2/hcd_rusb2.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Koji Kitayama\n * Portions copyrighted (c) 2021 Roland Winistoerfer\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_RUSB2)\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"rusb2_common.h\"\n\n  #define TU_RUSB2_HCD_DBG 2\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\nenum {\n  PIPE_COUNT = 10,\n};\n\nTU_ATTR_PACKED_BEGIN\nTU_ATTR_BIT_FIELD_ORDER_BEGIN\n\ntypedef union TU_ATTR_PACKED {\n  struct {\n    volatile uint16_t u8: 8;\n    volatile uint16_t   : 0;\n  };\n  volatile uint16_t u16;\n} hw_fifo_t;\n\ntypedef struct TU_ATTR_PACKED {\n  void      *buf;      /* the start address of a transfer data buffer */\n  uint16_t  length;    /* the number of bytes in the buffer */\n  uint16_t  remaining; /* the number of bytes remaining in the buffer */\n  struct {\n    uint32_t ep  : 8;  /* an assigned endpoint address */\n    uint32_t dev : 8;  /* an assigned device address */\n    uint32_t ff  : 1;  /* `buf` is TU_FUFO or POD */\n    uint32_t     : 0;\n  };\n} pipe_state_t;\n\nTU_ATTR_PACKED_END  // End of definition of packed structs (used by the CCRX toolchain)\nTU_ATTR_BIT_FIELD_ORDER_END\n\ntypedef struct {\n  pipe_state_t pipe[PIPE_COUNT];\n  uint8_t      ep[4][2][15]; /* a lookup table for a pipe index from an endpoint address */\n  uint8_t      ctl_mps[5];   /* EP0 max packet size for each device */\n} hcd_data_t;\n\n//--------------------------------------------------------------------+\n// INTERNAL OBJECT & FUNCTION DECLARATION\n//--------------------------------------------------------------------+\nstatic hcd_data_t _hcd;\n\n// TODO merged with DCD\n// Transfer conditions specifiable for each pipe for most MCUs\n// - Pipe 0: Control transfer with 64-byte single buffer\n// - Pipes 1 and 2: Bulk or ISO\n// - Pipes 3 to 5: Bulk\n// - Pipes 6 to 9: Interrupt\n//\n// Note: for small mcu such as\n// - RA2A1: only pipe 4-7 are available, and no support for ISO\nstatic unsigned find_pipe(unsigned xfer_type) {\n  const uint8_t pipe_idx_arr[4][2] = {\n      { 0, 0 }, // Control\n      { 1, 2 }, // Isochronous\n      { 1, 5 }, // Bulk\n      { 6, 9 }, // Interrupt\n  };\n\n  // find backward since only pipe 1, 2 support ISO\n  const uint8_t idx_first = pipe_idx_arr[xfer_type][0];\n  const uint8_t idx_last  = pipe_idx_arr[xfer_type][1];\n\n  for (int i = idx_last; i >= idx_first; i--) {\n    if (0 == _hcd.pipe[i].ep) return i;\n  }\n\n  return 0;\n}\n\nstatic volatile uint16_t* get_pipectr(rusb2_reg_t *rusb, unsigned num)\n{\n  if (num) {\n    return (volatile uint16_t*)&(rusb->PIPE_CTR[num - 1]);\n  } else {\n    return (volatile uint16_t*)&(rusb->DCPCTR);\n  }\n}\n\nstatic volatile reg_pipetre_t* get_pipetre(rusb2_reg_t *rusb, unsigned num)\n{\n  volatile reg_pipetre_t* tre = NULL;\n  if ((1 <= num) && (num <= 5)) {\n    tre = (volatile reg_pipetre_t*)&(rusb->PIPE_TR[num - 1].E);\n  }\n  return tre;\n}\n\nstatic volatile uint16_t* addr_to_pipectr(uint8_t rhport, uint8_t dev_addr, unsigned ep_addr)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  const unsigned epn = tu_edpt_number(ep_addr);\n\n  if (epn) {\n    const unsigned dir_in = tu_edpt_dir(ep_addr);\n    const unsigned num = _hcd.ep[dev_addr][dir_in][epn - 1];\n    return get_pipectr(rusb, num);\n  } else {\n    return get_pipectr(rusb, 0);\n  }\n}\n\nstatic uint16_t edpt0_max_packet_size(rusb2_reg_t* rusb)\n{\n  return rusb->DCPMAXP_b.MXPS;\n}\n\nstatic uint16_t edpt_max_packet_size(rusb2_reg_t *rusb, unsigned num)\n{\n  rusb->PIPESEL = num;\n  return rusb->PIPEMAXP_b.MXPS;\n}\n\nstatic inline void pipe_wait_for_ready(rusb2_reg_t* rusb, unsigned num)\n{\n  while (rusb->D0FIFOSEL_b.CURPIPE != num) ;\n  while (!rusb->D0FIFOCTR_b.FRDY) {}\n}\n\nstatic bool pipe0_xfer_in(rusb2_reg_t* rusb)\n{\n  pipe_state_t *pipe = &_hcd.pipe[0];\n  const unsigned rem = pipe->remaining;\n\n  const unsigned mps = edpt0_max_packet_size(rusb);\n  const unsigned vld = rusb->CFIFOCTR_b.DTLN;\n  const unsigned len = TU_MIN(TU_MIN(rem, mps), vld);\n  void          *buf = pipe->buf;\n  if (len) {\n    tu_hwfifo_access_t access_mode = {.data_stride = (rusb2_is_highspeed_reg(rusb) ? 4u : 2u),\n                                      .param       = (uintptr_t)rusb};\n\n    rusb->DCPCTR = RUSB2_PIPE_CTR_PID_NAK;\n    // pipe_read_packet(buf, (volatile void*)&rusb->CFIFO, len);\n    tu_hwfifo_read(&rusb->CFIFO, buf, len, &access_mode);\n    pipe->buf = (uint8_t*)buf + len;\n  }\n  if (len < mps) {\n    rusb->CFIFOCTR = RUSB2_CFIFOCTR_BCLR_Msk;\n  }\n  pipe->remaining = rem - len;\n  if ((len < mps) || (rem == len)) {\n    pipe->buf = NULL;\n    return true;\n  }\n  rusb->DCPCTR = RUSB2_PIPE_CTR_PID_BUF;\n  return false;\n}\n\nstatic bool pipe0_xfer_out(rusb2_reg_t* rusb)\n{\n  pipe_state_t *pipe = &_hcd.pipe[0];\n  const unsigned rem = pipe->remaining;\n  if (!rem) {\n    pipe->buf = NULL;\n    return true;\n  }\n  const unsigned mps = edpt0_max_packet_size(rusb);\n  const unsigned len = TU_MIN(mps, rem);\n  void          *buf = pipe->buf;\n  if (len) {\n    tu_hwfifo_access_t access_mode = {.data_stride = (rusb2_is_highspeed_reg(rusb) ? 4u : 2u),\n                                      .param       = (uintptr_t)rusb};\n\n    // pipe_write_packet(buf, (volatile void*)&rusb->CFIFO, len);\n    tu_hwfifo_write(&rusb->CFIFO, buf, len, &access_mode);\n    pipe->buf = (uint8_t*)buf + len;\n  }\n  if (len < mps) {\n    rusb->CFIFOCTR = RUSB2_CFIFOCTR_BVAL_Msk;\n  }\n  pipe->remaining = rem - len;\n  return false;\n}\n\nstatic bool pipe_xfer_in(rusb2_reg_t* rusb, unsigned num)\n{\n  pipe_state_t  *pipe = &_hcd.pipe[num];\n  const unsigned rem  = pipe->remaining;\n\n  uint16_t fifo_sel = num | FIFOSEL_BIGEND;\n  if (rusb2_is_highspeed_reg(rusb)) {\n    fifo_sel |= RUSB2_FIFOSEL_MBW_32BIT;\n  } else {\n    fifo_sel |= RUSB2_FIFOSEL_MBW_16BIT;\n  }\n  rusb->D0FIFOSEL = fifo_sel;\n\n  const unsigned mps  = edpt_max_packet_size(rusb, num);\n  pipe_wait_for_ready(rusb, num);\n  const unsigned vld  = rusb->D0FIFOCTR_b.DTLN;\n  const unsigned len  = TU_MIN(TU_MIN(rem, mps), vld);\n  void          *buf  = pipe->buf;\n  if (len) {\n    // pipe_read_packet(buf, (volatile void*)&rusb->D0FIFO, len);\n    tu_hwfifo_access_t access_mode = {.data_stride = (rusb2_is_highspeed_reg(rusb) ? 4u : 2u),\n                                      .param       = (uintptr_t)rusb};\n    tu_hwfifo_read(&rusb->D0FIFO, buf, len, &access_mode);\n    pipe->buf = (uint8_t*)buf + len;\n  }\n  if (len < mps) {\n    rusb->D0FIFOCTR = RUSB2_D0FIFOCTR_BCLR_Msk;\n  }\n  rusb->D0FIFOSEL = 0;\n  while (rusb->D0FIFOSEL_b.CURPIPE) ; /* if CURPIPE bits changes, check written value */\n  pipe->remaining = rem - len;\n  if ((len < mps) || (rem == len)) {\n    pipe->buf = NULL;\n    return NULL != buf;\n  }\n  return false;\n}\n\nstatic bool pipe_xfer_out(rusb2_reg_t* rusb, unsigned num)\n{\n  pipe_state_t  *pipe = &_hcd.pipe[num];\n  const unsigned rem  = pipe->remaining;\n\n  if (!rem) {\n    pipe->buf = NULL;\n    return true;\n  }\n\n  uint16_t fifo_sel = num | FIFOSEL_BIGEND;\n  if (rusb2_is_highspeed_reg(rusb)) {\n    fifo_sel |= RUSB2_FIFOSEL_MBW_32BIT;\n  } else {\n    fifo_sel |= RUSB2_FIFOSEL_MBW_16BIT;\n  }\n  rusb->D0FIFOSEL = fifo_sel;\n\n  const unsigned mps  = edpt_max_packet_size(rusb, num);\n  pipe_wait_for_ready(rusb, num);\n  const unsigned len  = TU_MIN(rem, mps);\n  void          *buf  = pipe->buf;\n  if (len) {\n    // pipe_write_packet(buf, (volatile void*)&rusb->D0FIFO, len);\n    tu_hwfifo_access_t access_mode = {.data_stride = (rusb2_is_highspeed_reg(rusb) ? 4u : 2u),\n                                      .param       = (uintptr_t)rusb};\n    tu_hwfifo_write(&rusb->D0FIFO, buf, len, &access_mode);\n    pipe->buf = (uint8_t*)buf + len;\n  }\n  if (len < mps) {\n    rusb->D0FIFOCTR = RUSB2_D0FIFOCTR_BVAL_Msk;\n  }\n  rusb->D0FIFOSEL = 0;\n  while (rusb->D0FIFOSEL_b.CURPIPE) ; /* if CURPIPE bits changes, check written value */\n  pipe->remaining = rem - len;\n  return false;\n}\n\nstatic bool process_pipe0_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, void* buffer, uint16_t buflen)\n{\n  (void)dev_addr;\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  const unsigned dir_in = tu_edpt_dir(ep_addr);\n\n  uint16_t fifo_sel =\n    (rusb2_is_highspeed_reg(rusb) ? RUSB2_FIFOSEL_MBW_32BIT : RUSB2_FIFOSEL_MBW_16BIT) | FIFOSEL_BIGEND;\n\n  /* configure fifo direction and access unit settings */\n  if (dir_in == TUSB_DIR_OUT) {\n    fifo_sel |= RUSB2_CFIFOSEL_ISEL_WRITE;\n  }\n  rusb->CFIFOSEL = fifo_sel;\n  while ((rusb->CFIFOSEL & RUSB2_CFIFOSEL_ISEL_WRITE) != (fifo_sel & RUSB2_CFIFOSEL_ISEL_WRITE)) {\n    // wait until ISEL_WRITE take effect\n  }\n\n  pipe_state_t *pipe = &_hcd.pipe[0];\n  pipe->ep        = ep_addr;\n  pipe->length    = buflen;\n  pipe->remaining = buflen;\n  if (buflen) {\n    pipe->buf     = buffer;\n    if (!dir_in) { /* OUT */\n      TU_ASSERT(rusb->DCPCTR_b.BSTS && (rusb->USBREQ & 0x80));\n      pipe0_xfer_out(rusb);\n    }\n  } else { /* ZLP */\n    pipe->buf        = NULL;\n    if (!dir_in) { /* OUT */\n      rusb->CFIFOCTR = RUSB2_CFIFOCTR_BVAL_Msk;\n    }\n    if (dir_in == rusb->DCPCFG_b.DIR) {\n      TU_ASSERT(RUSB2_PIPE_CTR_PID_NAK == rusb->DCPCTR_b.PID);\n      rusb->DCPCTR_b.SQSET = 1;\n      rusb->DCPCFG_b.DIR = dir_in ^ 1;\n    }\n  }\n  rusb->DCPCTR = RUSB2_PIPE_CTR_PID_BUF;\n  return true;\n}\n\nstatic bool process_pipe_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, void *buffer, uint16_t buflen)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n\n  const unsigned epn    = tu_edpt_number(ep_addr);\n  const unsigned dir_in = tu_edpt_dir(ep_addr);\n  const unsigned num    = _hcd.ep[dev_addr - 1][dir_in][epn - 1];\n\n  TU_ASSERT(num);\n\n  pipe_state_t *pipe  = &_hcd.pipe[num];\n  pipe->buf       = buffer;\n  pipe->length    = buflen;\n  pipe->remaining = buflen;\n  if (!dir_in) { /* OUT */\n    if (buflen) {\n      pipe_xfer_out(rusb, num);\n    } else { /* ZLP */\n      rusb->D0FIFOSEL = num;\n      pipe_wait_for_ready(rusb, num);\n      rusb->D0FIFOCTR = RUSB2_D0FIFOCTR_BVAL_Msk;\n      rusb->D0FIFOSEL = 0;\n      while (rusb->D0FIFOSEL_b.CURPIPE) {} /* if CURPIPE bits changes, check written value */\n    }\n  } else {\n    volatile uint16_t     *ctr = get_pipectr(rusb, num);\n    volatile reg_pipetre_t *pt = get_pipetre(rusb, num);\n    if (pt) {\n      const unsigned     mps = edpt_max_packet_size(rusb, num);\n      if (*ctr & 0x3) *ctr = RUSB2_PIPE_CTR_PID_NAK;\n      pt->TRE   = TU_BIT(8);\n      pt->TRN   = (buflen + mps - 1) / mps;\n      pt->TRENB = 1;\n    }\n    *ctr = RUSB2_PIPE_CTR_PID_BUF;\n  }\n  return true;\n}\n\nstatic bool process_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, void* buffer, uint16_t buflen)\n{\n  const unsigned epn = tu_edpt_number(ep_addr);\n  if (0 == epn) {\n    return process_pipe0_xfer(rhport, dev_addr, ep_addr, buffer, buflen);\n  } else {\n    return process_pipe_xfer(rhport, dev_addr, ep_addr, buffer, buflen);\n  }\n}\n\nstatic void process_pipe0_bemp(uint8_t rhport)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  bool completed = pipe0_xfer_out(rusb);\n  if (completed) {\n    pipe_state_t *pipe = &_hcd.pipe[0];\n    hcd_event_xfer_complete(pipe->dev,\n                            tu_edpt_addr(0, TUSB_DIR_OUT),\n                            pipe->length - pipe->remaining,\n                            XFER_RESULT_SUCCESS, true);\n  }\n}\n\nstatic void process_pipe_nrdy(uint8_t rhport, unsigned num)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  xfer_result_t result;\n  uint16_t volatile *ctr = get_pipectr(rusb, num);\n  TU_LOG(TU_RUSB2_HCD_DBG, \"NRDY %d %x\\r\\n\", num, *ctr);\n  switch (*ctr & RUSB2_PIPE_CTR_PID_Msk) {\n    default: return;\n    case RUSB2_PIPE_CTR_PID_STALL: result = XFER_RESULT_STALLED; break;\n    case RUSB2_PIPE_CTR_PID_STALL2: result = XFER_RESULT_STALLED; break;\n    case RUSB2_PIPE_CTR_PID_NAK:   result = XFER_RESULT_FAILED;  break;\n  }\n  pipe_state_t *pipe = &_hcd.pipe[num];\n  hcd_event_xfer_complete(pipe->dev, pipe->ep,\n                          pipe->length - pipe->remaining,\n                          result, true);\n}\n\nstatic void process_pipe_brdy(uint8_t rhport, unsigned num)\n{\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  pipe_state_t  *pipe   = &_hcd.pipe[num];\n  const unsigned dir_in = tu_edpt_dir(pipe->ep);\n  bool completed;\n\n  if (dir_in) { /* IN */\n    if (num) {\n      completed = pipe_xfer_in(rusb, num);\n    } else {\n      completed = pipe0_xfer_in(rusb);\n    }\n  } else {\n    completed = pipe_xfer_out(rusb, num);\n  }\n  if (completed) {\n    hcd_event_xfer_complete(pipe->dev, pipe->ep,\n                            pipe->length - pipe->remaining,\n                            XFER_RESULT_SUCCESS, true);\n    TU_LOG(TU_RUSB2_HCD_DBG, \"C %d %d\\r\\n\", num, pipe->length - pipe->remaining);\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* Host API\n *------------------------------------------------------------------*/\n\n#if 0 // previously present in the rx driver before generalization\nstatic uint32_t disable_interrupt(void)\n{\n  uint32_t pswi;\n#if defined(__CCRX__)\n  pswi = get_psw() & 0x010000;\n  clrpsw_i();\n#else\n  pswi = __builtin_rx_mvfc(0) & 0x010000;\n  __builtin_rx_clrpsw('I');\n#endif\n  return pswi;\n}\n\nstatic void enable_interrupt(uint32_t pswi)\n{\n#if defined(__CCRX__)\n  set_psw(get_psw() | pswi);\n#else\n  __builtin_rx_mvtc(0, __builtin_rx_mvfc(0) | pswi);\n#endif\n}\n#endif\n\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  rusb2_module_start(rhport, true);\n\n#ifdef RUSB2_SUPPORT_HIGHSPEED\n  if (rusb2_is_highspeed_rhport(rhport) ) {\n    rusb->SYSCFG_b.HSE = 1;\n    rusb->PHYSET_b.HSEB = 0;\n    rusb->PHYSET_b.DIRPD = 0;\n    R_BSP_SoftwareDelay((uint32_t) 1, BSP_DELAY_UNITS_MILLISECONDS);\n    rusb->PHYSET_b.PLLRESET = 0;\n    rusb->LPSTS_b.SUSPENDM = 1;\n    while ( !rusb->PLLSTA_b.PLLLOCK );\n    rusb->SYSCFG_b.DRPD = 1;\n    rusb->SYSCFG_b.DCFM = 1;\n    rusb->SYSCFG_b.DPRPU = 0;\n    rusb->SYSCFG_b.CNEN = 1;\n    rusb->BUSWAIT |= 0x0F00U;\n    rusb->SOFCFG_b.INTL = 1;\n    rusb->DVSTCTR0_b.VBUSEN = 1;\n    rusb->CFIFOSEL_b.MBW = 1;\n    rusb->D0FIFOSEL_b.MBW = 1;\n    rusb->D1FIFOSEL_b.MBW = 1;\n    rusb->INTSTS0 = 0;\n    for ( volatile int i = 0; i < 30000; ++i );\n    rusb->SYSCFG_b.USBE = 1;\n  } else\n#endif\n  {\n    rusb->SYSCFG_b.SCKE = 1;\n    while ( !rusb->SYSCFG_b.SCKE ) {}\n    rusb->SYSCFG_b.DCFM = 1;         // Host function\n    rusb->SYSCFG_b.DPRPU = 0;        // Disable D+ pull up\n    rusb->SYSCFG_b.DRPD = 1;         // Enable D+/D- pull down\n\n    rusb->DVSTCTR0_b.VBUSEN = 1;\n    for ( volatile int i = 0; i < 30000; ++i ) {} // FIXME do we need to wait here? how long ?\n    //R_BSP_SoftwareDelay(10, BSP_DELAY_UNITS_MILLISECONDS);\n    rusb->SYSCFG_b.USBE = 1;\n\n    // MCU specific PHY init\n    rusb2_phy_init();\n\n    rusb->PHYSLEW = 0x5;\n    rusb->DPUSR0R_FS_b.FIXPHY0 = 0u; /* Transceiver Output fixed */\n  }\n\n  /* Setup default control pipe */\n  rusb->DCPCFG  = RUSB2_PIPECFG_SHTNAK_Msk;\n  rusb->DCPMAXP = 64;\n  rusb->INTENB0 = RUSB2_INTSTS0_BRDY_Msk | RUSB2_INTSTS0_NRDY_Msk | RUSB2_INTSTS0_BEMP_Msk;\n  rusb->INTENB1 = RUSB2_INTSTS1_SACK_Msk | RUSB2_INTSTS1_SIGN_Msk | RUSB2_INTSTS1_ATTCH_Msk | RUSB2_INTSTS1_DTCH_Msk;\n  rusb->BEMPENB = 1;\n  rusb->NRDYENB = 1;\n  rusb->BRDYENB = 1;\n\n  return true;\n}\n\nvoid hcd_int_enable(uint8_t rhport) {\n  rusb2_int_enable(rhport);\n}\n\nvoid hcd_int_disable(uint8_t rhport) {\n  rusb2_int_disable(rhport);\n}\n\nuint32_t hcd_frame_number(uint8_t rhport) {\n  rusb2_reg_t *rusb = RUSB2_REG(rhport);\n  return rusb->FRMNUM_b.FRNM;\n}\n\n/*--------------------------------------------------------------------+\n * Port API\n *--------------------------------------------------------------------+*/\nbool hcd_port_connect_status(uint8_t rhport) {\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  const uint16_t line_state = rusb->SYSSTS0 & RUSB2_SYSSTS0_LNST_Msk;\n  return line_state == RUSB2_SYSSTS0_LNST_FS_J || line_state == RUSB2_SYSSTS0_LNST_FS_K;\n}\n\nvoid hcd_port_reset(uint8_t rhport) {\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  rusb->DVSTCTR0_b.USBRST = 1;\n}\n\nvoid hcd_port_reset_end(uint8_t rhport) {\n  rusb2_reg_t *rusb       = RUSB2_REG(rhport);\n  rusb->DVSTCTR0_b.USBRST = 0;\n}\n\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  switch (rusb->DVSTCTR0_b.RHST) {\n    case RUSB2_DVSTCTR0_RHST_HS: return TUSB_SPEED_HIGH;\n    case RUSB2_DVSTCTR0_RHST_FS: return TUSB_SPEED_FULL;\n    case RUSB2_DVSTCTR0_RHST_LS: return TUSB_SPEED_LOW;\n    default:\n      return TUSB_SPEED_INVALID;\n  }\n}\n\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  uint16_t volatile *ctr;\n\n  TU_ASSERT(dev_addr < 6,); /* USBa can only handle addresses from 0 to 5. */\n  if (!dev_addr) return;\n\n  _hcd.ctl_mps[dev_addr] = 0;\n  uint8_t *ep = &_hcd.ep[dev_addr - 1][0][0];\n\n  for (int i = 0; i < 2 * 15; ++i, ++ep) {\n    unsigned num = *ep;\n    if (!num || (dev_addr != _hcd.pipe[num].dev)) continue;\n\n    ctr = (uint16_t volatile*)&rusb->PIPE_CTR[num - 1];\n    *ctr = 0;\n    rusb->NRDYENB &= ~TU_BIT(num);\n    rusb->BRDYENB &= ~TU_BIT(num);\n    rusb->PIPESEL = num;\n    rusb->PIPECFG = 0;\n    rusb->PIPEMAXP = 0;\n\n    _hcd.pipe[num].ep  = 0;\n    _hcd.pipe[num].dev = 0;\n    *ep                = 0;\n  }\n}\n\n/*--------------------------------------------------------------------+\n * Endpoints API\n *--------------------------------------------------------------------+*/\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8])\n{\n  TU_ASSERT(dev_addr < 6); /* USBa can only handle addresses from 0 to 5. */\n\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  TU_LOG(TU_RUSB2_HCD_DBG, \"S %d %x\\r\\n\", dev_addr, rusb->DCPCTR);\n\n  TU_ASSERT(0 == rusb->DCPCTR_b.SUREQ);\n\n  rusb->DCPCTR = RUSB2_PIPE_CTR_PID_NAK;\n\n  _hcd.pipe[0].buf       = NULL;\n  _hcd.pipe[0].length    = 8;\n  _hcd.pipe[0].remaining = 0;\n  _hcd.pipe[0].dev       = dev_addr;\n\n  while (rusb->DCPCTR_b.PBUSY) ;\n  rusb->DCPMAXP = (dev_addr << 12) | _hcd.ctl_mps[dev_addr];\n\n  /* Set direction in advance for DATA stage */\n  uint8_t const bmRequesttype = setup_packet[0];\n  rusb->DCPCFG_b.DIR = tu_edpt_dir(bmRequesttype) ? 0: 1;\n\n  uint16_t const* p = (uint16_t const*)(uintptr_t)&setup_packet[0];\n  rusb->USBREQ  = tu_htole16(p[0]);\n  rusb->USBVAL  = p[1];\n  rusb->USBINDX = p[2];\n  rusb->USBLENG = p[3];\n\n  rusb->DCPCTR_b.SUREQ = 1;\n  return true;\n}\n\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const *ep_desc)\n{\n  TU_ASSERT(dev_addr < 6); /* USBa can only handle addresses from 0 to 5. */\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n\n  const unsigned ep_addr = ep_desc->bEndpointAddress;\n  const unsigned epn     = tu_edpt_number(ep_addr);\n  const unsigned mps     = tu_edpt_packet_size(ep_desc);\n\n  if (0 == epn) {\n    rusb->DCPCTR = RUSB2_PIPE_CTR_PID_NAK;\n    tuh_bus_info_t bus_info;\n    tuh_bus_info_get(dev_addr, &bus_info);\n    uint16_t volatile *devadd = (uint16_t volatile *)(uintptr_t) &rusb->DEVADD[0];\n    devadd += dev_addr;\n    while (rusb->DCPCTR_b.PBUSY) {}\n    rusb->DCPMAXP = (dev_addr << 12) | mps;\n    *devadd = (TUSB_SPEED_FULL == bus_info.speed) ? RUSB2_DEVADD_USBSPD_FS : RUSB2_DEVADD_USBSPD_LS;\n    _hcd.ctl_mps[dev_addr] = mps;\n    return true;\n  }\n\n  const unsigned dir_in = tu_edpt_dir(ep_addr);\n  const unsigned xfer   = ep_desc->bmAttributes.xfer;\n  if (xfer == TUSB_XFER_ISOCHRONOUS && mps > 256) {\n    /* USBa supports up to 256 bytes */\n    return false;\n  }\n  const unsigned num = find_pipe(xfer);\n  if (!num) return false;\n\n  _hcd.pipe[num].dev = dev_addr;\n  _hcd.pipe[num].ep  = ep_addr;\n  _hcd.ep[dev_addr - 1][dir_in][epn - 1] = num;\n\n  /* setup pipe */\n  hcd_int_disable(rhport);\n\n  rusb->PIPESEL = num;\n  rusb->PIPEMAXP = (dev_addr << 12) | mps;\n  volatile uint16_t *ctr = get_pipectr(rusb, num);\n  *ctr = RUSB2_PIPE_CTR_ACLRM_Msk | RUSB2_PIPE_CTR_SQCLR_Msk;\n  *ctr = 0;\n\n  unsigned cfg = ((1 ^ dir_in) << 4) | epn;\n  if (xfer == TUSB_XFER_BULK) {\n    cfg |= RUSB2_PIPECFG_TYPE_BULK | RUSB2_PIPECFG_SHTNAK_Msk | RUSB2_PIPECFG_DBLB_Msk;\n  } else if (xfer == TUSB_XFER_INTERRUPT) {\n    cfg |= RUSB2_PIPECFG_TYPE_INT;\n  } else {\n    cfg |= RUSB2_PIPECFG_TYPE_ISO | RUSB2_PIPECFG_DBLB_Msk;\n  }\n\n  rusb->PIPECFG = cfg;\n  rusb->BRDYSTS = 0x3FFu ^ TU_BIT(num);\n  rusb->NRDYENB |= TU_BIT(num);\n  rusb->BRDYENB |= TU_BIT(num);\n\n  if (!dir_in) {\n    *ctr = RUSB2_PIPE_CTR_PID_BUF;\n  }\n\n  hcd_int_enable(rhport);\n\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  (void) rhport; (void) daddr; (void) ep_addr;\n  return false; // TODO not implemented yet\n}\n\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen)\n{\n  bool r;\n  hcd_int_disable(rhport);\n  TU_LOG(TU_RUSB2_HCD_DBG, \"X %d %x %u\\r\\n\", dev_addr, ep_addr, buflen);\n  r = process_edpt_xfer(rhport, dev_addr, ep_addr, buffer, buflen);\n  hcd_int_enable(rhport);\n  return r;\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n  // TODO not implemented yet\n  return false;\n}\n\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  uint16_t volatile *ctr = addr_to_pipectr(rhport, dev_addr, ep_addr);\n  TU_ASSERT(ctr);\n\n  const uint32_t pid = *ctr & 0x3;\n  if (pid & 2) {\n    *ctr = pid & 2;\n    *ctr = 0;\n  }\n  *ctr = RUSB2_PIPE_CTR_SQCLR_Msk;\n  unsigned const epn = tu_edpt_number(ep_addr);\n  if (!epn) return true;\n\n  if (!tu_edpt_dir(ep_addr)) { /* OUT */\n    *ctr = RUSB2_PIPE_CTR_PID_BUF;\n  }\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\n#if defined(__CCRX__)\nTU_ATTR_ALWAYS_INLINE static inline unsigned __builtin_ctz(unsigned int value) {\n  unsigned int count = 0;\n  while ((value & 1) == 0) {\n    value >>= 1;\n    count++;\n  }\n  return count;\n}\n#endif\n\nvoid hcd_int_handler(uint8_t rhport, bool in_isr) {\n  (void) in_isr;\n\n  rusb2_reg_t* rusb = RUSB2_REG(rhport);\n  unsigned is0 = rusb->INTSTS0;\n  unsigned is1 = rusb->INTSTS1;\n\n  /* clear active bits except VALID (don't write 0 to already cleared bits according to the HW manual) */\n  rusb->INTSTS1 = ~((RUSB2_INTSTS1_SACK_Msk | RUSB2_INTSTS1_SIGN_Msk | RUSB2_INTSTS1_ATTCH_Msk | RUSB2_INTSTS1_DTCH_Msk) & is1);\n  rusb->INTSTS0 = ~((RUSB2_INTSTS0_BRDY_Msk | RUSB2_INTSTS0_NRDY_Msk | RUSB2_INTSTS0_BEMP_Msk) & is0);\n\n  TU_LOG3(\"IS %04x %04x\\r\\n\", is0, is1);\n  is1 &= rusb->INTENB1;\n  is0 &= rusb->INTENB0;\n\n  if (is1 & RUSB2_INTSTS1_SACK_Msk) {\n    /* Set DATA1 in advance for the next transfer. */\n    rusb->DCPCTR_b.SQSET = 1;\n    hcd_event_xfer_complete(rusb->DCPMAXP_b.DEVSEL, tu_edpt_addr(0, TUSB_DIR_OUT), 8, XFER_RESULT_SUCCESS, true);\n  }\n\n  if (is1 & RUSB2_INTSTS1_SIGN_Msk) {\n    hcd_event_xfer_complete(rusb->DCPMAXP_b.DEVSEL, tu_edpt_addr(0, TUSB_DIR_OUT), 8, XFER_RESULT_FAILED, true);\n  }\n\n  if (is1 & RUSB2_INTSTS1_ATTCH_Msk) {\n    rusb->DVSTCTR0_b.UACT = 1;\n    rusb->INTENB1 = (rusb->INTENB1 & ~RUSB2_INTSTS1_ATTCH_Msk) | RUSB2_INTSTS1_DTCH_Msk;\n    hcd_event_device_attach(rhport, true);\n  }\n\n  if (is1 & RUSB2_INTSTS1_DTCH_Msk) {\n    rusb->DVSTCTR0_b.UACT = 0;\n    if (rusb->DCPCTR_b.SUREQ) {\n      rusb->DCPCTR_b.SUREQCLR = 1;\n    }\n    rusb->INTENB1 = (rusb->INTENB1 & ~RUSB2_INTSTS1_DTCH_Msk) | RUSB2_INTSTS1_ATTCH_Msk;\n    hcd_event_device_remove(rhport, true);\n  }\n\n  if (is0 & RUSB2_INTSTS0_BEMP_Msk) {\n    const unsigned s = rusb->BEMPSTS;\n    rusb->BEMPSTS = 0;\n    if (s & 1) {\n      process_pipe0_bemp(rhport);\n    }\n  }\n\n  if (is0 & RUSB2_INTSTS0_NRDY_Msk) {\n    const unsigned m = rusb->NRDYENB;\n    unsigned s = rusb->NRDYSTS & m;\n    rusb->NRDYSTS = ~s;\n    while (s) {\n      const unsigned num = __builtin_ctz(s);\n      process_pipe_nrdy(rhport, num);\n      s &= ~TU_BIT(num);\n    }\n  }\n  if (is0 & RUSB2_INTSTS0_BRDY_Msk) {\n    const unsigned m = rusb->BRDYENB;\n    unsigned s = rusb->BRDYSTS & m;\n    /* clear active bits (don't write 0 to already cleared bits according to the HW manual) */\n    rusb->BRDYSTS = ~s;\n    while (s) {\n      const unsigned num = __builtin_ctz(s);\n      process_pipe_brdy(rhport, num);\n      s &= ~TU_BIT(num);\n    }\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/renesas/rusb2/rusb2_common.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if defined(TUP_USBIP_RUSB2) && (CFG_TUH_ENABLED || CFG_TUD_ENABLED)\n  #include \"osal/osal.h\"\n  #include \"common/tusb_fifo.h\"\n\n  #include \"rusb2_common.h\"\n\n  #if TU_CHECK_MCU(OPT_MCU_RAXXX)\n    #include \"rusb2_ra.h\"\n\n// USBFS_INT_IRQn and USBHS_USB_INT_RESUME_IRQn are generated by FSP\nrusb2_controller_t rusb2_controller[] = {\n  {.reg_base = R_USB_FS0_BASE, .irqnum = USBFS_INT_IRQn},\n    #ifdef RUSB2_SUPPORT_HIGHSPEED\n  {.reg_base = R_USB_HS0_BASE, .irqnum = USBHS_USB_INT_RESUME_IRQn},\n    #endif\n};\n\n// Application API for setting IRQ number. May throw warnings for missing prototypes.\nvoid tusb_rusb2_set_irqnum(uint8_t rhport, int32_t irqnum);\nvoid tusb_rusb2_set_irqnum(uint8_t rhport, int32_t irqnum) {\n  rusb2_controller[rhport].irqnum = irqnum;\n}\n  #endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nstatic void hwfifo_set_mbw(rusb2_reg_t *rusb, uintptr_t hwfifo, uint16_t mbw) {\n  volatile uint16_t *fifo_sel;\n  if (hwfifo == (uintptr_t)&rusb->CFIFO) {\n    fifo_sel = &rusb->CFIFOSEL;\n  } else if (hwfifo == (uintptr_t)&rusb->D0FIFO) {\n    fifo_sel = &rusb->D0FIFOSEL;\n  } else if (hwfifo == (uintptr_t)&rusb->D1FIFO) {\n    fifo_sel = &rusb->D1FIFOSEL;\n  } else {\n    return;\n  }\n\n  *fifo_sel = (*fifo_sel & ~RUSB2_CFIFOSEL_MBW_Msk) | mbw;\n}\n\n// write to hwfifo from buffer with access mode\nvoid tu_hwfifo_write(volatile void *hwfifo, const uint8_t *src, uint16_t len, const tu_hwfifo_access_t *access_mode) {\n  rusb2_reg_t   *rusb = (rusb2_reg_t *)access_mode->param;\n  const uint8_t *buf8 = (const uint8_t *)src;\n\n  volatile uint16_t *ff16;\n  volatile uint8_t  *ff8;\n  const bool         is_highspeed = rusb2_is_highspeed_reg(rusb);\n  if (is_highspeed) {\n    ff16 = (volatile uint16_t *)((uintptr_t)hwfifo + 2);\n    ff8  = (volatile uint8_t *)((uintptr_t)hwfifo + 3);\n  } else {\n    ff16 = (volatile uint16_t *)hwfifo;\n    ff8  = ((volatile uint8_t *)hwfifo);\n  }\n\n  // 32-bit access for highspeed\n  if (is_highspeed) {\n    volatile uint32_t *ff32 = (volatile uint32_t *)hwfifo;\n    while (len >= 4) {\n      *ff32 = tu_unaligned_read32(buf8);\n      buf8 += 4;\n      len -= 4;\n    }\n\n    if (len >= 2) {\n      // switch to 16-bit access\n      hwfifo_set_mbw(rusb, (uintptr_t)hwfifo, RUSB2_FIFOSEL_MBW_16BIT);\n    }\n  }\n\n  // 16-bit access\n  while (len >= 2) {\n    *ff16 = tu_unaligned_read16(buf8);\n    buf8 += 2;\n    len -= 2;\n  }\n\n  // 8-bit access does not need to change MBW\n  if (len > 0) {\n    *ff8 = *buf8;\n    ++buf8;\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/renesas/rusb2/rusb2_common.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#pragma once\n\n#include \"common/tusb_common.h\"\n#include \"rusb2_type.h\"\n\n#if TU_CHECK_MCU(OPT_MCU_RX63X, OPT_MCU_RX65X, OPT_MCU_RX72N)\n  #include \"rusb2_rx.h\"\n#elif TU_CHECK_MCU(OPT_MCU_RAXXX)\n  #include \"rusb2_ra.h\"\n\n  // Hack for D0FIFO definitions on RA Cortex-M23\n  #if defined(RENESAS_CORTEX_M23)\n    #define D0FIFO      CFIFO\n    #define D0FIFOSEL   CFIFOSEL\n    #define D0FIFOSEL_b CFIFOSEL_b\n    #define D1FIFOSEL   CFIFOSEL\n    #define D1FIFOSEL_b CFIFOSEL_b\n    #define D0FIFOCTR   CFIFOCTR\n    #define D0FIFOCTR_b CFIFOCTR_b\n  #endif\n\n#else\n  #error \"Unsupported MCU\"\n#endif\n\n\n//--------------------------------------------------------------------+\n// Common\n//--------------------------------------------------------------------+\n\nenum {\n  FIFOSEL_BIGEND = (TU_BYTE_ORDER == TU_BIG_ENDIAN ? RUSB2_FIFOSEL_BIGEND : 0)\n};\n"
  },
  {
    "path": "src/portable/renesas/rusb2/rusb2_ra.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Rafael Silva (@perigoso)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _RUSB2_RA_H_\n#define _RUSB2_RA_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#pragma GCC diagnostic ignored \"-Wundef\"\n\n// extra push due to https://github.com/renesas/fsp/pull/278\n#pragma GCC diagnostic push\n#endif\n\n/* renesas fsp api */\n#include \"bsp_api.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n// IAR does not have __builtin_ctz\n#if defined(__ICCARM__)\n  #define __builtin_ctz(x)   __iar_builtin_CLZ(__iar_builtin_RBIT(x))\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\ntypedef struct {\n  uint32_t reg_base;\n  int32_t irqnum;\n}rusb2_controller_t;\n\n#if defined(BSP_MCU_GROUP_RA6M5) || defined(BSP_MCU_GROUP_RA6M3) || (BSP_CFG_MCU_PART_SERIES == 8)\n  #define RUSB2_SUPPORT_HIGHSPEED\n  #define RUSB2_CONTROLLER_COUNT 2\n\n  #define rusb2_is_highspeed_rhport(_p)  (_p == 1)\n  #define rusb2_is_highspeed_reg(_reg)   (_reg == RUSB2_REG(1))\n#else\n  #define RUSB2_CONTROLLER_COUNT 1\n\n  #define rusb2_is_highspeed_rhport(_p)  (false)\n  #define rusb2_is_highspeed_reg(_reg)   (false)\n#endif\n\nextern rusb2_controller_t rusb2_controller[];\n#define RUSB2_REG(_p)      ((rusb2_reg_t*) rusb2_controller[_p].reg_base)\n\n//--------------------------------------------------------------------+\n// RUSB2 API\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline void rusb2_module_start(uint8_t rhport, bool start) {\n  uint32_t const mask = 1U << (11+rhport);\n  if (start) {\n    R_MSTP->MSTPCRB &= ~mask;\n  }else {\n    R_MSTP->MSTPCRB |= mask;\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void rusb2_int_enable(uint8_t rhport) {\n  NVIC_EnableIRQ(rusb2_controller[rhport].irqnum);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void rusb2_int_disable(uint8_t rhport) {\n  NVIC_DisableIRQ(rusb2_controller[rhport].irqnum);\n}\n\n// MCU specific PHY init\nTU_ATTR_ALWAYS_INLINE static inline void rusb2_phy_init(void) {\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _RUSB2_RA_H_ */\n"
  },
  {
    "path": "src/portable/renesas/rusb2/rusb2_rx.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2020 Koji Kitayama\n * Portions copyrighted (c) 2021 Roland Winistoerfer\n * Copyright (c) 2022 Rafael Silva (@perigoso)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _RUSB2_RX_H_\n#define _RUSB2_RX_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"iodefine.h\"\n\n#define RUSB2_REG_BASE (0x000A0000)\n\nTU_ATTR_ALWAYS_INLINE static inline rusb2_reg_t* RUSB2_REG(uint8_t rhport) {\n  (void) rhport;\n  return (rusb2_reg_t *) RUSB2_REG_BASE;\n}\n\n\n#define rusb2_is_highspeed_rhport(_p)  (false)\n#define rusb2_is_highspeed_reg(_reg)   (false)\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n\n// Start/Stop MSTP TODO implement later\nTU_ATTR_ALWAYS_INLINE static inline void rusb2_module_start(uint8_t rhport, bool start) {\n  (void) rhport;\n  (void) start;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void rusb2_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n#if (CFG_TUSB_MCU == OPT_MCU_RX72N)\n  IEN(PERIB, INTB185) = 1;\n#else\n  IEN(USB0, USBI0) = 1;\n#endif\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void rusb2_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n#if (CFG_TUSB_MCU == OPT_MCU_RX72N)\n  IEN(PERIB, INTB185) = 0;\n#else\n  IEN(USB0, USBI0) = 0;\n#endif\n}\n\n// MCU specific PHY init\nTU_ATTR_ALWAYS_INLINE static inline void rusb2_phy_init(void)\n{\n#if (CFG_TUSB_MCU == OPT_MCU_RX72N)\n  IR(PERIB, INTB185) = 0;\n#else\n  IR(USB0, USBI0) = 0;\n#endif\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* _RUSB2_RX_H_ */\n"
  },
  {
    "path": "src/portable/renesas/rusb2/rusb2_type.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Rafael Silva (@perigoso)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_RUSB2_TYPE_H_\n#define TUSB_RUSB2_TYPE_H_\n\n#include <stdint.h>\n#include <stddef.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// CCRX specific attribute to generate a Code that Accesses Variables in the Declared Size\n#ifdef __CCRX__\n  #define _ccrx_evenaccess __evenaccess\n#else\n  #define _ccrx_evenaccess\n#endif\n\n//--------------------------------------------------------------------+\n// Register Definitions\n//--------------------------------------------------------------------+\n/* Start of definition of packed structs (used by the CCRX toolchain) */\nTU_ATTR_PACKED_BEGIN\nTU_ATTR_BIT_FIELD_ORDER_BEGIN\n\n// TODO same as RUSB2_PIPE_TR_t\ntypedef struct TU_ATTR_PACKED _ccrx_evenaccess {\n  union {\n    struct {\n      uint16_t      : 8;\n      uint16_t TRCLR: 1;\n      uint16_t TRENB: 1;\n      uint16_t      : 0;\n    };\n    uint16_t TRE;\n  };\n  uint16_t TRN;\n} reg_pipetre_t;\n\ntypedef struct {\n  union {\n    volatile uint16_t E; /* (@ 0x00000000) Pipe Transaction Counter Enable Register */\n\n    struct TU_ATTR_PACKED {\n      uint16_t                : 8;\n      volatile uint16_t TRCLR : 1; /* [8..8] Transaction Counter Clear */\n      volatile uint16_t TRENB : 1; /* [9..9] Transaction Counter Enable */\n      uint16_t                : 6;\n    } E_b;\n  };\n\n  union {\n    volatile uint16_t N; /* (@ 0x00000002) Pipe Transaction Counter Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t TRNCNT : 16; /* [15..0] Transaction Counter */\n    } N_b;\n  };\n} RUSB2_PIPE_TR_t; /* Size = 4 (0x4) */\n\n\n/* RUSB2 Registers Structure */\ntypedef struct _ccrx_evenaccess {\n  union {\n    volatile uint16_t SYSCFG; /* (@ 0x00000000) System Configuration Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t USBE  : 1; /* [0..0] USB Operation Enable */\n      uint16_t                : 2;\n      volatile uint16_t DMRPU : 1; /* [3..3] D- Line Resistor Control */\n      volatile uint16_t DPRPU : 1; /* [4..4] D+ Line Resistor Control */\n      volatile uint16_t DRPD  : 1; /* [5..5] D+/D- Line Resistor Control */\n      volatile uint16_t DCFM  : 1; /* [6..6] Controller Function Select */\n      volatile uint16_t HSE   : 1; // [7..7] High-Speed Operation Enable\n      volatile uint16_t CNEN  : 1; /* [8..8] CNEN Single End Receiver Enable */\n      uint16_t                : 1;\n      volatile uint16_t SCKE  : 1; /* [10..10] USB Clock Enable */\n      uint16_t                : 5;\n    } SYSCFG_b;\n  };\n\n  union {\n    volatile uint16_t BUSWAIT; /* (@ 0x00000002) CPU Bus Wait Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t BWAIT : 4; /* [3..0] CPU Bus Access Wait Specification BWAIT waits (BWAIT+2 access cycles) */\n      uint16_t                : 12;\n    } BUSWAIT_b;\n  };\n\n  union {\n    volatile const uint16_t SYSSTS0; /* (@ 0x00000004) System Configuration Status Register 0 */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t LNST   : 2; /* [1..0] USB Data Line Status Monitor */\n      volatile const uint16_t IDMON  : 1; /* [2..2] External ID0 Input Pin Monitor */\n      uint16_t                       : 2;\n      volatile const uint16_t SOFEA  : 1; /* [5..5] SOF Active Monitor While Host Controller Function is Selected. */\n      volatile const uint16_t HTACT  : 1; /* [6..6] USB Host Sequencer Status Monitor */\n      uint16_t                       : 7;\n      volatile const uint16_t OVCMON : 2; /* [15..14] External USB0_OVRCURA/ USB0_OVRCURB Input Pin Monitor */\n    } SYSSTS0_b;\n  };\n\n  union {\n    volatile const uint16_t PLLSTA; /* (@ 0x00000006) PLL Status Register */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t PLLLOCK : 1; /* [0..0] PLL Lock Flag */\n      uint16_t                        : 15;\n    } PLLSTA_b;\n  };\n\n  union {\n    volatile uint16_t DVSTCTR0; /* (@ 0x00000008) Device State Control Register 0 */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t RHST : 3; /* [2..0] USB Bus Reset Status */\n      uint16_t                     : 1;\n      volatile uint16_t UACT       : 1; /* [4..4] USB Bus Enable */\n      volatile uint16_t RESUME     : 1; /* [5..5] Resume Output */\n      volatile uint16_t USBRST     : 1; /* [6..6] USB Bus Reset Output */\n      volatile uint16_t RWUPE      : 1; /* [7..7] Wakeup Detection Enable */\n      volatile uint16_t WKUP       : 1; /* [8..8] Wakeup Output */\n      volatile uint16_t VBUSEN     : 1; /* [9..9] USB_VBUSEN Output Pin Control */\n      volatile uint16_t EXICEN     : 1; /* [10..10] USB_EXICEN Output Pin Control */\n      volatile uint16_t HNPBTOA    : 1; /* [11..11] Host Negotiation Protocol (HNP) */\n      uint16_t                     : 4;\n    } DVSTCTR0_b;\n  };\n  volatile const uint16_t RESERVED;\n\n  union {\n    volatile uint16_t TESTMODE; /* (@ 0x0000000C) USB Test Mode Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t UTST : 4; /* [3..0] Test Mode */\n      uint16_t               : 12;\n    } TESTMODE_b;\n  };\n  volatile const uint16_t RESERVED1;\n  volatile const uint32_t RESERVED2;\n\n  union {\n    volatile uint32_t CFIFO; /* (@ 0x00000014) CFIFO Port Register */\n\n    struct TU_ATTR_PACKED {\n      union {\n        volatile uint16_t CFIFOL; /* (@ 0x00000014) CFIFO Port Register L */\n        volatile uint8_t CFIFOLL; /* (@ 0x00000014) CFIFO Port Register LL */\n      };\n\n      union {\n        volatile uint16_t CFIFOH; /* (@ 0x00000016) CFIFO Port Register H */\n\n        struct TU_ATTR_PACKED {\n          volatile const uint8_t RESERVED3;\n          volatile uint8_t CFIFOHH; /* (@ 0x00000017) CFIFO Port Register HH */\n        };\n      };\n    };\n  };\n\n  union {\n    volatile uint32_t D0FIFO; /* (@ 0x00000018) D0FIFO Port Register */\n\n    struct TU_ATTR_PACKED {\n      union {\n        volatile uint16_t D0FIFOL; /* (@ 0x00000018) D0FIFO Port Register L */\n        volatile uint8_t D0FIFOLL; /* (@ 0x00000018) D0FIFO Port Register LL */\n      };\n\n      union {\n        volatile uint16_t D0FIFOH; /* (@ 0x0000001A) D0FIFO Port Register H */\n\n        struct TU_ATTR_PACKED {\n          volatile const uint8_t RESERVED4;\n          volatile uint8_t D0FIFOHH; /* (@ 0x0000001B) D0FIFO Port Register HH */\n        };\n      };\n    };\n  };\n\n  union {\n    volatile uint32_t D1FIFO; /* (@ 0x0000001C) D1FIFO Port Register */\n\n    struct TU_ATTR_PACKED {\n      union {\n        volatile uint16_t D1FIFOL; /* (@ 0x0000001C) D1FIFO Port Register L */\n        volatile uint8_t D1FIFOLL; /* (@ 0x0000001C) D1FIFO Port Register LL */\n      };\n\n      union {\n        volatile uint16_t D1FIFOH; /* (@ 0x0000001E) D1FIFO Port Register H */\n\n        struct TU_ATTR_PACKED {\n          volatile const uint8_t RESERVED5;\n          volatile uint8_t D1FIFOHH; /* (@ 0x0000001F) D1FIFO Port Register HH */\n        };\n      };\n    };\n  };\n\n  union {\n    volatile uint16_t CFIFOSEL; /* (@ 0x00000020) CFIFO Port Select Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t CURPIPE : 4; /* [3..0] CFIFO Port Access Pipe Specification */\n      uint16_t                  : 1;\n      volatile uint16_t ISEL    : 1; /* [5..5] CFIFO Port Access Direction When DCP is Selected */\n      uint16_t                  : 2;\n      volatile uint16_t BIGEND  : 1; /* [8..8] CFIFO Port Endian Control */\n      uint16_t                  : 1;\n      volatile uint16_t MBW     : 2; /* [11..10] CFIFO Port Access Bit Width */\n      uint16_t                  : 2;\n      volatile uint16_t REW     : 1; /* [14..14] Buffer Pointer Rewind */\n      volatile uint16_t RCNT    : 1; /* [15..15] Read Count Mode */\n    } CFIFOSEL_b;\n  };\n\n  union {\n    volatile uint16_t CFIFOCTR; /* (@ 0x00000022) CFIFO Port Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t DTLN : 12; /* [11..0] Receive Data LengthIndicates the length of the receive data. */\n      uint16_t                     : 1;\n      volatile const uint16_t FRDY : 1;  /* [13..13] FIFO Port Ready */\n      volatile uint16_t BCLR       : 1;  /* [14..14] CPU Buffer ClearNote: Only 0 can be read. */\n      volatile uint16_t BVAL       : 1;  /* [15..15] Buffer Memory Valid Flag */\n    } CFIFOCTR_b;\n  };\n  volatile const uint32_t RESERVED6;\n\n  union {\n    volatile uint16_t D0FIFOSEL; /* (@ 0x00000028) D0FIFO Port Select Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t CURPIPE : 4; /* [3..0] FIFO Port Access Pipe Specification */\n      uint16_t                  : 4;\n      volatile uint16_t BIGEND  : 1; /* [8..8] FIFO Port Endian Control */\n      uint16_t                  : 1;\n      volatile uint16_t MBW     : 2; /* [11..10] FIFO Port Access Bit Width */\n      volatile uint16_t DREQE   : 1; /* [12..12] DMA/DTC Transfer Request Enable */\n      volatile uint16_t DCLRM   : 1; /* [13..13] Auto Buffer Memory Clear Mode Accessed after Specified Pipe Data is Read */\n      volatile uint16_t REW     : 1; /* [14..14] Buffer Pointer RewindNote: Only 0 can be read. */\n      volatile uint16_t RCNT    : 1; /* [15..15] Read Count Mode */\n    } D0FIFOSEL_b;\n  };\n\n  union {\n    volatile uint16_t D0FIFOCTR; /* (@ 0x0000002A) D0FIFO Port Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t DTLN : 12; /* [11..0] Receive Data LengthIndicates the length of the receive data. */\n      uint16_t                     : 1;\n      volatile const uint16_t FRDY : 1;  /* [13..13] FIFO Port Ready */\n      volatile uint16_t BCLR       : 1;  /* [14..14] CPU Buffer ClearNote: Only 0 can be read. */\n      volatile uint16_t BVAL       : 1;  /* [15..15] Buffer Memory Valid Flag */\n    } D0FIFOCTR_b;\n  };\n\n  union {\n    volatile uint16_t D1FIFOSEL; /* (@ 0x0000002C) D1FIFO Port Select Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t CURPIPE : 4; /* [3..0] FIFO Port Access Pipe Specification */\n      uint16_t                  : 4;\n      volatile uint16_t BIGEND  : 1; /* [8..8] FIFO Port Endian Control */\n      uint16_t                  : 1;\n      volatile uint16_t MBW     : 2; /* [11..10] FIFO Port Access Bit Width */\n      volatile uint16_t DREQE   : 1; /* [12..12] DMA/DTC Transfer Request Enable */\n      volatile uint16_t DCLRM   : 1; /* [13..13] Auto Buffer Memory Clear Mode Accessed after Specified Pipe Data is Read */\n      volatile uint16_t REW     : 1; /* [14..14] Buffer Pointer Rewind */\n      volatile uint16_t RCNT    : 1; /* [15..15] Read Count Mode */\n    } D1FIFOSEL_b;\n  };\n\n  union {\n    volatile uint16_t D1FIFOCTR; /* (@ 0x0000002E) D1FIFO Port Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t DTLN : 12; /* [11..0] Receive Data LengthIndicates the length of the receive data. */\n      uint16_t                     : 1;\n      volatile const uint16_t FRDY : 1;  /* [13..13] FIFO Port Ready */\n      volatile uint16_t BCLR       : 1;  /* [14..14] CPU Buffer ClearNote: Only 0 can be read. */\n      volatile uint16_t BVAL       : 1;  /* [15..15] Buffer Memory Valid Flag */\n    } D1FIFOCTR_b;\n  };\n\n  union {\n    volatile uint16_t INTENB0; /* (@ 0x00000030) Interrupt Enable Register 0 */\n\n    struct TU_ATTR_PACKED {\n      uint16_t                : 8;\n      volatile uint16_t BRDYE : 1; /* [8..8] Buffer Ready Interrupt Enable */\n      volatile uint16_t NRDYE : 1; /* [9..9] Buffer Not Ready Response Interrupt Enable */\n      volatile uint16_t BEMPE : 1; /* [10..10] Buffer Empty Interrupt Enable */\n      volatile uint16_t CTRE  : 1; /* [11..11] Control Transfer Stage Transition Interrupt Enable */\n      volatile uint16_t DVSE  : 1; /* [12..12] Device State Transition Interrupt Enable */\n      volatile uint16_t SOFE  : 1; /* [13..13] Frame Number Update Interrupt Enable */\n      volatile uint16_t RSME  : 1; /* [14..14] Resume Interrupt Enable */\n      volatile uint16_t VBSE  : 1; /* [15..15] VBUS Interrupt Enable */\n    } INTENB0_b;\n  };\n\n  union {\n    volatile uint16_t INTENB1; /* (@ 0x00000032) Interrupt Enable Register 1 */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PDDETINTE0 : 1; /* [0..0] PDDETINT0 Detection Interrupt Enable */\n      uint16_t                     : 3;\n      volatile uint16_t SACKE      : 1; /* [4..4] Setup Transaction Normal Response Interrupt Enable */\n      volatile uint16_t SIGNE      : 1; /* [5..5] Setup Transaction Error Interrupt Enable */\n      volatile uint16_t EOFERRE    : 1; /* [6..6] EOF Error Detection Interrupt Enable */\n               uint16_t            : 1;\n      volatile uint16_t LPMENDE    : 1; /*!< [8..8] LPM Transaction End Interrupt Enable                               */\n      volatile uint16_t L1RSMENDE  : 1; /*!< [9..9] L1 Resume End Interrupt Enable                                     */\n               uint16_t            : 1;\n      volatile uint16_t ATTCHE     : 1; /* [11..11] Connection Detection Interrupt Enable */\n      volatile uint16_t DTCHE      : 1; /* [12..12] Disconnection Detection Interrupt Enable */\n      uint16_t                     : 1;\n      volatile uint16_t BCHGE      : 1; /* [14..14] USB Bus Change Interrupt Enable */\n      volatile uint16_t OVRCRE     : 1; /* [15..15] Overcurrent Input Change Interrupt Enable */\n    } INTENB1_b;\n  };\n  volatile const uint16_t RESERVED7;\n\n  union {\n    volatile uint16_t BRDYENB; /* (@ 0x00000036) BRDY Interrupt Enable Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PIPE0BRDYE : 1; /* [0..0] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE1BRDYE : 1; /* [1..1] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE2BRDYE : 1; /* [2..2] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE3BRDYE : 1; /* [3..3] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE4BRDYE : 1; /* [4..4] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE5BRDYE : 1; /* [5..5] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE6BRDYE : 1; /* [6..6] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE7BRDYE : 1; /* [7..7] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE8BRDYE : 1; /* [8..8] BRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE9BRDYE : 1; /* [9..9] BRDY Interrupt Enable for PIPE */\n      uint16_t                     : 6;\n    } BRDYENB_b;\n  };\n\n  union {\n    volatile uint16_t NRDYENB; /* (@ 0x00000038) NRDY Interrupt Enable Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PIPE0NRDYE : 1; /* [0..0] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE1NRDYE : 1; /* [1..1] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE2NRDYE : 1; /* [2..2] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE3NRDYE : 1; /* [3..3] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE4NRDYE : 1; /* [4..4] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE5NRDYE : 1; /* [5..5] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE6NRDYE : 1; /* [6..6] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE7NRDYE : 1; /* [7..7] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE8NRDYE : 1; /* [8..8] NRDY Interrupt Enable for PIPE */\n      volatile uint16_t PIPE9NRDYE : 1; /* [9..9] NRDY Interrupt Enable for PIPE */\n      uint16_t                     : 6;\n    } NRDYENB_b;\n  };\n\n  union {\n    volatile uint16_t BEMPENB; /* (@ 0x0000003A) BEMP Interrupt Enable Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PIPE0BEMPE : 1; /* [0..0] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE1BEMPE : 1; /* [1..1] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE2BEMPE : 1; /* [2..2] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE3BEMPE : 1; /* [3..3] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE4BEMPE : 1; /* [4..4] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE5BEMPE : 1; /* [5..5] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE6BEMPE : 1; /* [6..6] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE7BEMPE : 1; /* [7..7] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE8BEMPE : 1; /* [8..8] BEMP Interrupt Enable for PIPE */\n      volatile uint16_t PIPE9BEMPE : 1; /* [9..9] BEMP Interrupt Enable for PIPE */\n      uint16_t                     : 6;\n    } BEMPENB_b;\n  };\n\n  union {\n    volatile uint16_t SOFCFG; /* (@ 0x0000003C) SOF Output Configuration Register */\n\n    struct TU_ATTR_PACKED {\n      uint16_t                        : 4;\n      volatile const uint16_t EDGESTS : 1; /* [4..4] Edge Interrupt Output Status Monitor */\n      volatile uint16_t INTL          : 1; /* [5..5] Interrupt Output Sense Select */\n      volatile uint16_t BRDYM         : 1; /* [6..6] BRDY Interrupt Status Clear Timing */\n      uint16_t                        : 1;\n      volatile uint16_t TRNENSEL      : 1; /* [8..8] Transaction-Enabled Time Select */\n      uint16_t                        : 7;\n    } SOFCFG_b;\n  };\n\n  union {\n    volatile uint16_t PHYSET; /* (@ 0x0000003E) PHY Setting Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t DIRPD    : 1; /* [0..0] Power-Down Control */\n      volatile uint16_t PLLRESET : 1; /* [1..1] PLL Reset Control */\n      uint16_t                   : 1;\n      volatile uint16_t CDPEN    : 1; /* [3..3] Charging Downstream Port Enable */\n      volatile uint16_t CLKSEL   : 2; /* [5..4] Input System Clock Frequency */\n      uint16_t                   : 2;\n      volatile uint16_t REPSEL   : 2; /* [9..8] Terminating Resistance Adjustment Cycle */\n      uint16_t                   : 1;\n      volatile uint16_t REPSTART : 1; /* [11..11] Forcibly Start Terminating Resistance Adjustment */\n      uint16_t                   : 3;\n      volatile uint16_t HSEB     : 1; /* [15..15] CL-Only Mode */\n    } PHYSET_b;\n  };\n\n  union {\n    volatile uint16_t INTSTS0; /* (@ 0x00000040) Interrupt Status Register 0 */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t CTSQ  : 3; /* [2..0] Control Transfer Stage */\n      volatile uint16_t VALID       : 1; /* [3..3] USB Request Reception */\n      volatile const uint16_t DVSQ  : 3; /* [6..4] Device State */\n      volatile const uint16_t VBSTS : 1; /* [7..7] VBUS Input Status */\n      volatile const uint16_t BRDY  : 1; /* [8..8] Buffer Ready Interrupt Status */\n      volatile const uint16_t NRDY  : 1; /* [9..9] Buffer Not Ready Interrupt Status */\n      volatile const uint16_t BEMP  : 1; /* [10..10] Buffer Empty Interrupt Status */\n      volatile uint16_t CTRT        : 1; /* [11..11] Control Transfer Stage Transition Interrupt Status */\n      volatile uint16_t DVST        : 1; /* [12..12] Device State Transition Interrupt Status */\n      volatile uint16_t SOFR        : 1; /* [13..13] Frame Number Refresh Interrupt Status */\n      volatile uint16_t RESM        : 1; /* [14..14] Resume Interrupt Status */\n      volatile uint16_t VBINT       : 1; /* [15..15] VBUS Interrupt Status */\n    } INTSTS0_b;\n  };\n\n  union {\n    volatile uint16_t INTSTS1; /* (@ 0x00000042) Interrupt Status Register 1 */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PDDETINT0 : 1; /* [0..0] PDDET0 Detection Interrupt Status */\n      uint16_t                    : 3;\n      volatile uint16_t SACK      : 1; /* [4..4] Setup Transaction Normal Response Interrupt Status */\n      volatile uint16_t SIGN      : 1; /* [5..5] Setup Transaction Error Interrupt Status */\n      volatile uint16_t EOFERR    : 1; /* [6..6] EOF Error Detection Interrupt Status */\n      uint16_t                    : 1;\n      volatile uint16_t LPMEND    : 1; /* [8..8] LPM Transaction End Interrupt Status */\n      volatile uint16_t L1RSMEND  : 1; /* [9..9] L1 Resume End Interrupt Status */\n      uint16_t                    : 1;\n      volatile uint16_t ATTCH     : 1; /* [11..11] ATTCH Interrupt Status */\n      volatile uint16_t DTCH      : 1; /* [12..12] USB Disconnection Detection Interrupt Status */\n      uint16_t                    : 1;\n      volatile uint16_t BCHG      : 1; /* [14..14] USB Bus Change Interrupt Status */\n      volatile uint16_t OVRCR     : 1; /* [15..15] Overcurrent Input Change Interrupt Status */\n    } INTSTS1_b;\n  };\n  volatile const uint16_t RESERVED8;\n\n  union {\n    volatile uint16_t BRDYSTS; /* (@ 0x00000046) BRDY Interrupt Status Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PIPE0BRDY : 1; /* [0..0] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE1BRDY : 1; /* [1..1] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE2BRDY : 1; /* [2..2] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE3BRDY : 1; /* [3..3] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE4BRDY : 1; /* [4..4] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE5BRDY : 1; /* [5..5] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE6BRDY : 1; /* [6..6] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE7BRDY : 1; /* [7..7] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE8BRDY : 1; /* [8..8] BRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE9BRDY : 1; /* [9..9] BRDY Interrupt Status for PIPE */\n      uint16_t                    : 6;\n    } BRDYSTS_b;\n  };\n\n  union {\n    volatile uint16_t NRDYSTS; /* (@ 0x00000048) NRDY Interrupt Status Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PIPE0NRDY : 1; /* [0..0] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE1NRDY : 1; /* [1..1] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE2NRDY : 1; /* [2..2] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE3NRDY : 1; /* [3..3] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE4NRDY : 1; /* [4..4] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE5NRDY : 1; /* [5..5] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE6NRDY : 1; /* [6..6] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE7NRDY : 1; /* [7..7] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE8NRDY : 1; /* [8..8] NRDY Interrupt Status for PIPE */\n      volatile uint16_t PIPE9NRDY : 1; /* [9..9] NRDY Interrupt Status for PIPE */\n      uint16_t                    : 6;\n    } NRDYSTS_b;\n  };\n\n  union {\n    volatile uint16_t BEMPSTS; /* (@ 0x0000004A) BEMP Interrupt Status Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PIPE0BEMP : 1; /* [0..0] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE1BEMP : 1; /* [1..1] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE2BEMP : 1; /* [2..2] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE3BEMP : 1; /* [3..3] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE4BEMP : 1; /* [4..4] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE5BEMP : 1; /* [5..5] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE6BEMP : 1; /* [6..6] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE7BEMP : 1; /* [7..7] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE8BEMP : 1; /* [8..8] BEMP Interrupt Status for PIPE */\n      volatile uint16_t PIPE9BEMP : 1; /* [9..9] BEMP Interrupt Status for PIPE */\n      uint16_t                    : 6;\n    } BEMPSTS_b;\n  };\n\n  union {\n    volatile uint16_t FRMNUM; /* (@ 0x0000004C) Frame Number Register */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t FRNM : 11; /* [10..0] Frame NumberLatest frame number */\n      uint16_t                     : 3;\n      volatile uint16_t CRCE       : 1; /* [14..14] Receive Data Error */\n      volatile uint16_t OVRN       : 1; /* [15..15] Overrun/Underrun Detection Status */\n    } FRMNUM_b;\n  };\n\n  union {\n    volatile uint16_t UFRMNUM; /* (@ 0x0000004E) uFrame Number Register */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t UFRNM : 3; /* [2..0] MicroframeIndicate the microframe number. */\n      uint16_t                      : 12;\n      volatile uint16_t DVCHG       : 1; /* [15..15] Device State Change */\n    } UFRMNUM_b;\n  };\n\n  union {\n    volatile uint16_t USBADDR; /* (@ 0x00000050) USB Address Register */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t USBADDR : 7; /* [6..0] USB Address In device controller mode */\n      uint16_t                        : 1;\n      volatile uint16_t STSRECOV0     : 3; /* [10..8] Status Recovery */\n      uint16_t                        : 5;\n    } USBADDR_b;\n  };\n  volatile const uint16_t RESERVED9;\n\n  union {\n    volatile uint16_t USBREQ; /* (@ 0x00000054) USB Request Type Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t BMREQUESTTYPE : 8; /* [7..0] Request TypeThese bits store the USB request bmRequestType value. */\n      volatile uint16_t BREQUEST      : 8; /* [15..8] RequestThese bits store the USB request bRequest value. */\n    } USBREQ_b;\n  };\n\n  union {\n    volatile uint16_t USBVAL; /* (@ 0x00000056) USB Request Value Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t WVALUE : 16; /* [15..0] ValueThese bits store the USB request Value value. */\n    } USBVAL_b;\n  };\n\n  union {\n    volatile uint16_t USBINDX; /* (@ 0x00000058) USB Request Index Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t WINDEX : 16; /* [15..0] IndexThese bits store the USB request wIndex value. */\n    } USBINDX_b;\n  };\n\n  union {\n    volatile uint16_t USBLENG; /* (@ 0x0000005A) USB Request Length Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t WLENGTH : 16; /* [15..0] LengthThese bits store the USB request wLength value. */\n    } USBLENG_b;\n  };\n\n  union {\n    volatile uint16_t DCPCFG; /* (@ 0x0000005C) DCP Configuration Register */\n\n    struct TU_ATTR_PACKED {\n      uint16_t                 : 4;\n      volatile uint16_t DIR    : 1; /* [4..4] Transfer Direction */\n      uint16_t                 : 2;\n      volatile uint16_t SHTNAK : 1; /* [7..7] Pipe Disabled at End of Transfer */\n      volatile uint16_t CNTMD  : 1; /* [8..8] Continuous Transfer Mode */\n      uint16_t                 : 7;\n    } DCPCFG_b;\n  };\n\n  union {\n    volatile uint16_t DCPMAXP; /* (@ 0x0000005E) DCP Maximum Packet Size Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t MXPS   : 7; /* [6..0] Maximum Packet Size */\n      uint16_t                 : 5;\n      volatile uint16_t DEVSEL : 4; /* [15..12] Device Select */\n    } DCPMAXP_b;\n  };\n\n  union {\n    volatile uint16_t DCPCTR; /* (@ 0x00000060) DCP Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PID         : 2; /* [1..0] Response PID */\n      volatile uint16_t CCPL        : 1; /* [2..2] Control Transfer End Enable */\n      uint16_t                      : 2;\n      volatile const uint16_t PBUSY : 1; /* [5..5] Pipe Busy */\n      volatile const uint16_t SQMON : 1; /* [6..6] Sequence Toggle Bit Monitor */\n      volatile uint16_t SQSET       : 1; /* [7..7] Sequence Toggle Bit Set */\n      volatile uint16_t SQCLR       : 1; /* [8..8] Sequence Toggle Bit Clear */\n      uint16_t                      : 2;\n      volatile uint16_t SUREQCLR    : 1; /* [11..11] SUREQ Bit Clear */\n      volatile uint16_t CSSTS       : 1; /* [12..12] Split Transaction COMPLETE SPLIT(CSPLIT) Status                  */\n      volatile uint16_t CSCLR       : 1; /* [13..13] Split Transaction CSPLIT Status Clear                            */\n      volatile uint16_t SUREQ       : 1; /* [14..14] Setup Token Transmission */\n      volatile const uint16_t BSTS  : 1; /* [15..15] Buffer Status */\n    } DCPCTR_b;\n  };\n  volatile const uint16_t RESERVED10;\n\n  union {\n    volatile uint16_t PIPESEL; /* (@ 0x00000064) Pipe Window Select Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PIPESEL : 4; /* [3..0] Pipe Window Select */\n      uint16_t                  : 12;\n    } PIPESEL_b;\n  };\n  volatile const uint16_t RESERVED11;\n\n  union {\n    volatile uint16_t PIPECFG;      /* (@ 0x00000068) Pipe Configuration Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t EPNUM  : 4; /* [3..0] Endpoint Number */\n      volatile uint16_t DIR    : 1; /* [4..4] Transfer Direction */\n      uint16_t                 : 2;\n      volatile uint16_t SHTNAK : 1; /* [7..7] Pipe Disabled at End of Transfer */\n      volatile uint16_t CNTMD  : 1; /* [8..8] Continuous Transfer Mode                                           */\n      volatile uint16_t DBLB   : 1; /* [9..9] Double Buffer Mode */\n      volatile uint16_t BFRE   : 1; /* [10..10] BRDY Interrupt Operation Specification */\n      uint16_t                 : 3;\n      volatile uint16_t TYPE   : 2; /* [15..14] Transfer Type */\n    } PIPECFG_b;\n  };\n\n  union {\n    volatile uint16_t PIPEBUF;         /*!< (@ 0x0000006A) Pipe Buffer Register                                       */\n\n    struct {\n      volatile uint16_t BUFNMB  : 8; // [7..0] Buffer NumberThese bits specify the FIFO buffer number of the selected pipe (04h to 87h)\n      uint16_t                  : 2;\n      volatile uint16_t BUFSIZE : 5; /*!< [14..10] Buffer Size 00h: 64 bytes 01h: 128 bytes : 1Fh: 2 Kbytes         */\n      uint16_t                  : 1;\n    } PIPEBUF_b;\n  };\n\n  union {\n    volatile uint16_t PIPEMAXP; /* (@ 0x0000006C) Pipe Maximum Packet Size Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t MXPS   : 11; /* [10..0] Maximum Packet Size */\n      uint16_t                 : 1;\n      volatile uint16_t DEVSEL : 4; /* [15..12] Device Select */\n    } PIPEMAXP_b;\n  };\n\n  union {\n    volatile uint16_t PIPEPERI; /* (@ 0x0000006E) Pipe Cycle Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t IITV : 3; /* [2..0] Interval Error Detection Interval */\n      uint16_t               : 9;\n      volatile uint16_t IFIS : 1; /* [12..12] Isochronous IN Buffer Flush */\n      uint16_t               : 3;\n    } PIPEPERI_b;\n  };\n\n  union {\n    volatile uint16_t PIPE_CTR[9];        /* (@ 0x00000070) Pipe [0..8] Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t PID          : 2; /* [1..0] Response PID */\n      uint16_t                       : 3;\n      volatile const uint16_t PBUSY  : 1; /* [5..5] Pipe Busy */\n      volatile const uint16_t SQMON  : 1; /* [6..6] Sequence Toggle Bit Confirmation */\n      volatile uint16_t SQSET        : 1; /* [7..7] Sequence Toggle Bit Set */\n      volatile uint16_t SQCLR        : 1; /* [8..8] Sequence Toggle Bit Clear */\n      volatile uint16_t ACLRM        : 1; /* [9..9] Auto Buffer Clear Mode */\n      volatile uint16_t ATREPM       : 1; /* [10..10] Auto Response Mode */\n      uint16_t                       : 1;\n      volatile const uint16_t CSSTS  : 1; /* [12..12] CSSTS Status */\n      volatile uint16_t CSCLR        : 1; /* [13..13] CSPLIT Status Clear */\n      volatile const uint16_t INBUFM : 1; /* [14..14] Transmit Buffer Monitor */\n      volatile const uint16_t BSTS   : 1; /* [15..15] Buffer Status */\n    } PIPE_CTR_b[9];\n  };\n  volatile const uint16_t RESERVED13;\n  volatile const uint32_t RESERVED14[3];\n  volatile RUSB2_PIPE_TR_t PIPE_TR[5]; /* (@ 0x00000090) Pipe Transaction Counter Registers */\n  volatile const uint32_t RESERVED15[3];\n\n  union {\n    volatile uint16_t USBBCCTRL0;             /* (@ 0x000000B0) BC Control Register 0 */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t RPDME0           : 1; /* [0..0] D- Pin Pull-Down Control */\n      volatile uint16_t IDPSRCE0         : 1; /* [1..1] D+ Pin IDPSRC Output Control */\n      volatile uint16_t IDMSINKE0        : 1; /* [2..2] D- Pin 0.6 V Input Detection (Comparator and Sink) Control */\n      volatile uint16_t VDPSRCE0         : 1; /* [3..3] D+ Pin VDPSRC (0.6 V) Output Control */\n      volatile uint16_t IDPSINKE0        : 1; /* [4..4] D+ Pin 0.6 V Input Detection (Comparator and Sink) Control */\n      volatile uint16_t VDMSRCE0         : 1; /* [5..5] D- Pin VDMSRC (0.6 V) Output Control */\n      uint16_t                           : 1;\n      volatile uint16_t BATCHGE0         : 1; /* [7..7] BC (Battery Charger) Function Ch0 General Enable Control */\n      volatile const uint16_t CHGDETSTS0 : 1; /* [8..8] D- Pin 0.6 V Input Detection Status */\n      volatile const uint16_t PDDETSTS0  : 1; /* [9..9] D+ Pin 0.6 V Input Detection Status */\n      uint16_t                           : 6;\n    } USBBCCTRL0_b;\n  };\n  volatile const uint16_t RESERVED16;\n  volatile const uint32_t RESERVED17[4];\n\n  union {\n    volatile uint16_t UCKSEL; /* (@ 0x000000C4) USB Clock Selection Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t UCKSELC : 1; /* [0..0] USB Clock Selection */\n      uint16_t                  : 15;\n    } UCKSEL_b;\n  };\n  volatile const uint16_t RESERVED18;\n  volatile const uint32_t RESERVED19;\n\n  union {\n    volatile uint16_t USBMC; /* (@ 0x000000CC) USB Module Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t VDDUSBE : 1; /* [0..0] USB Reference Power Supply Circuit On/Off Control */\n      uint16_t                  : 6;\n      volatile uint16_t VDCEN   : 1; /* [7..7] USB Regulator On/Off Control */\n      uint16_t                  : 8;\n    } USBMC_b;\n  };\n  volatile const uint16_t RESERVED20;\n\n  union {\n    volatile uint16_t DEVADD[10]; /* (@ 0x000000D0) Device Address Configuration Register */\n\n    struct TU_ATTR_PACKED {\n      uint16_t                  : 6;\n      volatile uint16_t USBSPD  : 2; /* [7..6] Transfer Speed of Communication Target Device */\n      volatile uint16_t HUBPORT : 3; /* [10..8] Communication Target Connecting Hub Port */\n      volatile uint16_t UPPHUB  : 4; /* [14..11] Communication Target Connecting Hub Register */\n      uint16_t                  : 1;\n    } DEVADD_b[10];\n  };\n  volatile const uint32_t RESERVED21[3];\n\n  union {\n    volatile uint32_t PHYSLEW; /* (@ 0x000000F0) PHY Cross Point Adjustment Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint32_t SLEWR00 : 1; /* [0..0] Receiver Cross Point Adjustment 00 */\n      volatile uint32_t SLEWR01 : 1; /* [1..1] Receiver Cross Point Adjustment 01 */\n      volatile uint32_t SLEWF00 : 1; /* [2..2] Receiver Cross Point Adjustment 00 */\n      volatile uint32_t SLEWF01 : 1; /* [3..3] Receiver Cross Point Adjustment 01 */\n      uint32_t                  : 28;\n    } PHYSLEW_b;\n  };\n  volatile const uint32_t RESERVED22[3];\n\n  union {\n    volatile uint16_t LPCTRL; /* (@ 0x00000100) Low Power Control Register */\n\n    struct TU_ATTR_PACKED {\n      uint16_t                : 7;\n      volatile uint16_t HWUPM : 1; /* [7..7] Resume Return Mode Setting */\n      uint16_t                : 8;\n    } LPCTRL_b;\n  };\n\n  union {\n    volatile uint16_t LPSTS; /* (@ 0x00000102) Low Power Status Register */\n\n    struct TU_ATTR_PACKED {\n      uint16_t                   : 14;\n      volatile uint16_t SUSPENDM : 1; /* [14..14] UTMI SuspendM Control */\n      uint16_t                   : 1;\n    } LPSTS_b;\n  };\n  volatile const uint32_t RESERVED23[15];\n\n  union {\n    volatile uint16_t BCCTRL; /* (@ 0x00000140) Battery Charging Control Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t IDPSRCE         : 1; /* [0..0] IDPSRC Control */\n      volatile uint16_t IDMSINKE        : 1; /* [1..1] IDMSINK Control */\n      volatile uint16_t VDPSRCE         : 1; /* [2..2] VDPSRC Control */\n      volatile uint16_t IDPSINKE        : 1; /* [3..3] IDPSINK Control */\n      volatile uint16_t VDMSRCE         : 1; /* [4..4] VDMSRC Control */\n      volatile uint16_t DCPMODE         : 1; /* [5..5] DCP Mode Control */\n      uint16_t                          : 2;\n      volatile const uint16_t CHGDETSTS : 1; /* [8..8] CHGDET Status */\n      volatile const uint16_t PDDETSTS  : 1; /* [9..9] PDDET Status */\n      uint16_t                          : 6;\n    } BCCTRL_b;\n  };\n  volatile const uint16_t RESERVED24;\n\n  union {\n    volatile uint16_t PL1CTRL1; /* (@ 0x00000144) Function L1 Control Register 1 */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t L1RESPEN   : 1; /* [0..0] L1 Response Enable */\n      volatile uint16_t L1RESPMD   : 2; /* [2..1] L1 Response Mode */\n      volatile uint16_t L1NEGOMD   : 1; /* [3..3] L1 Response Negotiation Control. */\n      volatile const uint16_t DVSQ : 4; /* [7..4] DVSQ Extension.DVSQ[3] is Mirror of DVSQ[2:0] in INTSTS0. */\n      volatile uint16_t HIRDTHR    : 4; /* [11..8] L1 Response Negotiation Threshold Value */\n      uint16_t                     : 2;\n      volatile uint16_t L1EXTMD    : 1; /* [14..14] PHY Control Mode at L1 Return */\n      uint16_t                     : 1;\n    } PL1CTRL1_b;\n  };\n\n  union {\n    volatile uint16_t PL1CTRL2; /* (@ 0x00000146) Function L1 Control Register 2 */\n\n    struct TU_ATTR_PACKED {\n      uint16_t                  : 8;\n      volatile uint16_t HIRDMON : 4; /* [11..8] HIRD Value Monitor */\n      volatile uint16_t RWEMON  : 1;  /* [12..12] RWE Value Monitor */\n      uint16_t                  : 3;\n    } PL1CTRL2_b;\n  };\n\n  union {\n    volatile uint16_t HL1CTRL1; /* (@ 0x00000148) Host L1 Control Register 1 */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t L1REQ          : 1;       /* [0..0] L1 Transition Request */\n      volatile const uint16_t L1STATUS : 2; /* [2..1] L1 Request Completion Status */\n      uint16_t                         : 13;\n    } HL1CTRL1_b;\n  };\n\n  union {\n    volatile uint16_t HL1CTRL2; /* (@ 0x0000014A) Host L1 Control Register 2 */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t L1ADDR : 4; /* [3..0] LPM Token DeviceAddress */\n      uint16_t                 : 4;\n      volatile uint16_t HIRD   : 4; /* [11..8] LPM Token HIRD */\n      volatile uint16_t L1RWE  : 1; /* [12..12] LPM Token L1 Remote Wake Enable */\n      uint16_t                 : 2;\n      volatile uint16_t BESL   : 1; /* [15..15] BESL & Alternate HIRD */\n    } HL1CTRL2_b;\n  };\n\n  volatile uint32_t RESERVED25_1;\n\n  union {\n    volatile uint16_t PHYTRIM1;          /*!< (@ 0x00000150) PHY Timing Register 1                                      */\n\n    struct {\n      volatile uint16_t DRISE      : 2; /*!< [1..0] FS/LS Rising-Edge Output Waveform Adjustment Function              */\n      volatile uint16_t DFALL      : 2; /*!< [3..2] FS/LS Falling-Edge Output Waveform Adjustment Function             */\n               uint16_t            : 3;\n      volatile uint16_t PCOMPENB   : 1; /*!< [7..7] PVDD Start-up Detection                                            */\n      volatile uint16_t HSIUP      : 4; /*!< [11..8] HS Output Level Setting                                           */\n      volatile uint16_t IMPOFFSET  : 3; /*!< [14..12] terminating resistance offset value setting.Offset value for adjusting the terminating resistance.                           */\n               uint16_t            : 1;\n    } PHYTRIM1_b;\n  };\n\n  union {\n    volatile uint16_t PHYTRIM2;         /*!< (@ 0x00000152) PHY Timing Register 2                                      */\n\n    struct {\n      volatile  uint16_t SQU      : 4; /*!< [3..0] Squelch Detection Level                                            */\n      uint16_t                    : 3;\n      volatile  uint16_t HSRXENMO : 1; /*!< [7..7] HS Receive Enable Control Mode                                     */\n      volatile  uint16_t PDR      : 2; /*!< [9..8] HS Output Adjustment Function                                      */\n      uint16_t                    : 2;\n      volatile  uint16_t DIS      : 3; /*!< [14..12] Disconnect Detection Level                                       */\n      uint16_t                    : 1;\n    } PHYTRIM2_b;\n  };\n  volatile uint32_t RESERVED25_2[3];\n\n  union {\n    volatile const uint32_t DPUSR0R; /* (@ 0x00000160) Deep Standby USB Transceiver Control/Pin Monitor Register */\n\n    struct TU_ATTR_PACKED {\n      uint32_t                         : 20;\n      volatile const uint32_t DOVCAHM  : 1; /* [20..20] OVRCURA InputIndicates OVRCURA input signal on the HS side of USB port. */\n      volatile const uint32_t DOVCBHM  : 1; /* [21..21] OVRCURB InputIndicates OVRCURB input signal on the HS side of USB port. */\n      uint32_t                         : 1;\n      volatile const uint32_t DVBSTSHM : 1; /* [23..23] VBUS InputIndicates VBUS input signal on the HS side of USB port. */\n      uint32_t                         : 8;\n    } DPUSR0R_b;\n  };\n\n  union {\n    volatile uint32_t DPUSR1R; /* (@ 0x00000164) Deep Standby USB Suspend/Resume Interrupt Register */\n\n    struct TU_ATTR_PACKED {\n      uint32_t                        : 4;\n      volatile uint32_t DOVCAHE       : 1; /* [4..4] OVRCURA Interrupt Enable Clear */\n      volatile uint32_t DOVCBHE       : 1; /* [5..5] OVRCURB Interrupt Enable Clear */\n      uint32_t                        : 1;\n      volatile uint32_t DVBSTSHE      : 1; /* [7..7] VBUS Interrupt Enable/Clear */\n      uint32_t                        : 12;\n      volatile const uint32_t DOVCAH  : 1; /* [20..20] Indication of Return from OVRCURA Interrupt Source */\n      volatile const uint32_t DOVCBH  : 1; /* [21..21] Indication of Return from OVRCURB Interrupt Source */\n      uint32_t                        : 1;\n      volatile const uint32_t DVBSTSH : 1; /* [23..23] Indication of Return from VBUS Interrupt Source */\n      uint32_t                        : 8;\n    } DPUSR1R_b;\n  };\n\n  union {\n    volatile uint16_t DPUSR2R; /* (@ 0x00000168) Deep Standby USB Suspend/Resume Interrupt Register */\n\n    struct TU_ATTR_PACKED {\n      volatile const uint16_t DPINT : 1; /* [0..0] Indication of Return from DP Interrupt Source */\n      volatile const uint16_t DMINT : 1; /* [1..1] Indication of Return from DM Interrupt Source */\n      uint16_t                      : 2;\n      volatile const uint16_t DPVAL : 1; /* [4..4] DP InputIndicates DP input signal on the HS side of USB port. */\n      volatile const uint16_t DMVAL : 1; /* [5..5] DM InputIndicates DM input signal on the HS side of USB port. */\n      uint16_t                      : 2;\n      volatile uint16_t DPINTE      : 1; /* [8..8] DP Interrupt Enable Clear */\n      volatile uint16_t DMINTE      : 1; /* [9..9] DM Interrupt Enable Clear */\n      uint16_t                      : 6;\n    } DPUSR2R_b;\n  };\n\n  union {\n    volatile uint16_t DPUSRCR; /* (@ 0x0000016A) Deep Standby USB Suspend/Resume Command Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint16_t FIXPHY   : 1; /* [0..0] USB Transceiver Control Fix */\n      volatile uint16_t FIXPHYPD : 1; /* [1..1] USB Transceiver Control Fix for PLL */\n      uint16_t                   : 14;\n    } DPUSRCR_b;\n  };\n  volatile const uint32_t RESERVED26[165];\n\n  union {\n    volatile uint32_t\n      DPUSR0R_FS; /* (@ 0x00000400) Deep Software Standby USB Transceiver Control/Pin Monitor Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint32_t SRPC0         : 1; /* [0..0] USB Single End Receiver Control */\n      volatile uint32_t RPUE0         : 1; /* [1..1] DP Pull-Up Resistor Control */\n      uint32_t                        : 1;\n      volatile uint32_t DRPD0         : 1; /* [3..3] D+/D- Pull-Down Resistor Control */\n      volatile uint32_t FIXPHY0       : 1; /* [4..4] USB Transceiver Output Fix */\n      uint32_t                        : 11;\n      volatile const uint32_t DP0     : 1; /* [16..16] USB0 D+ InputIndicates the D+ input signal of the USB. */\n      volatile const uint32_t DM0     : 1; /* [17..17] USB D-InputIndicates the D- input signal of the USB. */\n      uint32_t                        : 2;\n      volatile const uint32_t DOVCA0  : 1; /* [20..20] USB OVRCURA InputIndicates the OVRCURA input signal of the USB. */\n      volatile const uint32_t DOVCB0  : 1; /* [21..21] USB OVRCURB InputIndicates the OVRCURB input signal of the USB. */\n      uint32_t                        : 1;\n      volatile const uint32_t DVBSTS0 : 1; /* [23..23] USB VBUS InputIndicates the VBUS input signal of the USB. */\n      uint32_t                        : 8;\n    } DPUSR0R_FS_b;\n  };\n\n  union {\n    volatile uint32_t DPUSR1R_FS; /* (@ 0x00000404) Deep Software Standby USB Suspend/Resume Interrupt Register */\n\n    struct TU_ATTR_PACKED {\n      volatile uint32_t DPINTE0        : 1; /* [0..0] USB DP Interrupt Enable/Clear */\n      volatile uint32_t DMINTE0        : 1; /* [1..1] USB DM Interrupt Enable/Clear */\n      uint32_t                         : 2;\n      volatile uint32_t DOVRCRAE0      : 1; /* [4..4] USB OVRCURA Interrupt Enable/Clear */\n      volatile uint32_t DOVRCRBE0      : 1; /* [5..5] USB OVRCURB Interrupt Enable/Clear */\n      uint32_t                         : 1;\n      volatile uint32_t DVBSE0         : 1; /* [7..7] USB VBUS Interrupt Enable/Clear */\n      uint32_t                         : 8;\n      volatile const uint32_t DPINT0   : 1; /* [16..16] USB DP Interrupt Source Recovery */\n      volatile const uint32_t DMINT0   : 1; /* [17..17] USB DM Interrupt Source Recovery */\n      uint32_t                         : 2;\n      volatile const uint32_t DOVRCRA0 : 1; /* [20..20] USB OVRCURA Interrupt Source Recovery */\n      volatile const uint32_t DOVRCRB0 : 1; /* [21..21] USB OVRCURB Interrupt Source Recovery */\n      uint32_t                         : 1;\n      volatile const uint32_t DVBINT0  : 1; /* [23..23] USB VBUS Interrupt Source Recovery */\n      uint32_t                         : 8;\n    } DPUSR1R_FS_b;\n  };\n} rusb2_reg_t; /* Size = 1032 (0x408) */\n\nTU_ATTR_PACKED_END /* End of definition of packed structs (used by the CCRX toolchain) */\nTU_ATTR_BIT_FIELD_ORDER_END\n\n/*--------------------------------------------------------------------*/\n/* Register Bit Definitions                                           */\n/*--------------------------------------------------------------------*/\n\n// PIPE_TR\n// E\n#define RUSB2_PIPE_TR_E_TRENB_Pos       (9UL)        /* TRENB (Bit 9) */\n#define RUSB2_PIPE_TR_E_TRENB_Msk       (0x200UL)    /* TRENB (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_TR_E_TRCLR_Pos       (8UL)        /* TRCLR (Bit 8) */\n#define RUSB2_PIPE_TR_E_TRCLR_Msk       (0x100UL)    /* TRCLR (Bitfield-Mask: 0x01) */\n\n// N\n#define RUSB2_PIPE_TR_N_TRNCNT_Pos      (0UL)        /* TRNCNT (Bit 0) */\n#define RUSB2_PIPE_TR_N_TRNCNT_Msk      (0xffffUL)   /* TRNCNT (Bitfield-Mask: 0xffff) */\n\n// Core Registers\n\n// SYSCFG\n#define RUSB2_SYSCFG_SCKE_Pos           (10UL)       /* SCKE (Bit 10) */\n#define RUSB2_SYSCFG_SCKE_Msk           (0x400UL)    /* SCKE (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSCFG_CNEN_Pos           (8UL)        /* CNEN (Bit 8) */\n#define RUSB2_SYSCFG_CNEN_Msk           (0x100UL)    /* CNEN (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSCFG_HSE_Pos            (7UL)        /*!< HSE (Bit 7)                                           */\n#define RUSB2_SYSCFG_HSE_Msk            (0x80UL)     /*!< HSE (Bitfield-Mask: 0x01)                             */\n#define RUSB2_SYSCFG_DCFM_Pos           (6UL)        /* DCFM (Bit 6) */\n#define RUSB2_SYSCFG_DCFM_Msk           (0x40UL)     /* DCFM (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSCFG_DRPD_Pos           (5UL)        /* DRPD (Bit 5) */\n#define RUSB2_SYSCFG_DRPD_Msk           (0x20UL)     /* DRPD (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSCFG_DPRPU_Pos          (4UL)        /* DPRPU (Bit 4) */\n#define RUSB2_SYSCFG_DPRPU_Msk          (0x10UL)     /* DPRPU (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSCFG_DMRPU_Pos          (3UL)        /* DMRPU (Bit 3) */\n#define RUSB2_SYSCFG_DMRPU_Msk          (0x8UL)      /* DMRPU (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSCFG_USBE_Pos           (0UL)        /* USBE (Bit 0) */\n#define RUSB2_SYSCFG_USBE_Msk           (0x1UL)      /* USBE (Bitfield-Mask: 0x01) */\n\n// BUSWAIT\n#define RUSB2_BUSWAIT_BWAIT_Pos         (0UL)        /* BWAIT (Bit 0) */\n#define RUSB2_BUSWAIT_BWAIT_Msk         (0xfUL)      /* BWAIT (Bitfield-Mask: 0x0f) */\n\n// SYSSTS0\n#define RUSB2_SYSSTS0_OVCMON_Pos        (14UL)       /* OVCMON (Bit 14) */\n#define RUSB2_SYSSTS0_OVCMON_Msk        (0xc000UL)   /* OVCMON (Bitfield-Mask: 0x03) */\n#define RUSB2_SYSSTS0_HTACT_Pos         (6UL)        /* HTACT (Bit 6) */\n#define RUSB2_SYSSTS0_HTACT_Msk         (0x40UL)     /* HTACT (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSSTS0_SOFEA_Pos         (5UL)        /* SOFEA (Bit 5) */\n#define RUSB2_SYSSTS0_SOFEA_Msk         (0x20UL)     /* SOFEA (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSSTS0_IDMON_Pos         (2UL)        /* IDMON (Bit 2) */\n#define RUSB2_SYSSTS0_IDMON_Msk         (0x4UL)      /* IDMON (Bitfield-Mask: 0x01) */\n#define RUSB2_SYSSTS0_LNST_Pos          (0UL)        /* LNST (Bit 0) */\n#define RUSB2_SYSSTS0_LNST_Msk          (0x3UL)      /* LNST (Bitfield-Mask: 0x03) */\n\n// PLLSTA\n#define RUSB2_PLLSTA_PLLLOCK_Pos        (0UL)        /* PLLLOCK (Bit 0) */\n#define RUSB2_PLLSTA_PLLLOCK_Msk        (0x1UL)      /* PLLLOCK (Bitfield-Mask: 0x01) */\n\n// DVSTCTR0\n#define RUSB2_DVSTCTR0_HNPBTOA_Pos      (11UL)       /* HNPBTOA (Bit 11) */\n#define RUSB2_DVSTCTR0_HNPBTOA_Msk      (0x800UL)    /* HNPBTOA (Bitfield-Mask: 0x01) */\n#define RUSB2_DVSTCTR0_EXICEN_Pos       (10UL)       /* EXICEN (Bit 10) */\n#define RUSB2_DVSTCTR0_EXICEN_Msk       (0x400UL)    /* EXICEN (Bitfield-Mask: 0x01) */\n#define RUSB2_DVSTCTR0_VBUSEN_Pos       (9UL)        /* VBUSEN (Bit 9) */\n#define RUSB2_DVSTCTR0_VBUSEN_Msk       (0x200UL)    /* VBUSEN (Bitfield-Mask: 0x01) */\n#define RUSB2_DVSTCTR0_WKUP_Pos         (8UL)        /* WKUP (Bit 8) */\n#define RUSB2_DVSTCTR0_WKUP_Msk         (0x100UL)    /* WKUP (Bitfield-Mask: 0x01) */\n#define RUSB2_DVSTCTR0_RWUPE_Pos        (7UL)        /* RWUPE (Bit 7) */\n#define RUSB2_DVSTCTR0_RWUPE_Msk        (0x80UL)     /* RWUPE (Bitfield-Mask: 0x01) */\n#define RUSB2_DVSTCTR0_USBRST_Pos       (6UL)        /* USBRST (Bit 6) */\n#define RUSB2_DVSTCTR0_USBRST_Msk       (0x40UL)     /* USBRST (Bitfield-Mask: 0x01) */\n#define RUSB2_DVSTCTR0_RESUME_Pos       (5UL)        /* RESUME (Bit 5) */\n#define RUSB2_DVSTCTR0_RESUME_Msk       (0x20UL)     /* RESUME (Bitfield-Mask: 0x01) */\n#define RUSB2_DVSTCTR0_UACT_Pos         (4UL)        /* UACT (Bit 4) */\n#define RUSB2_DVSTCTR0_UACT_Msk         (0x10UL)     /* UACT (Bitfield-Mask: 0x01) */\n#define RUSB2_DVSTCTR0_RHST_Pos         (0UL)        /* RHST (Bit 0) */\n#define RUSB2_DVSTCTR0_RHST_Msk         (0x7UL)      /* RHST (Bitfield-Mask: 0x07) */\n\n// TESTMODE\n#define RUSB2_TESTMODE_UTST_Pos         (0UL)        /* UTST (Bit 0) */\n#define RUSB2_TESTMODE_UTST_Msk         (0xfUL)      /* UTST (Bitfield-Mask: 0x0f) */\n\n// CFIFOSEL\n#define RUSB2_CFIFOSEL_RCNT_Pos         (15UL)       /* RCNT (Bit 15) */\n#define RUSB2_CFIFOSEL_RCNT_Msk         (0x8000UL)   /* RCNT (Bitfield-Mask: 0x01) */\n#define RUSB2_CFIFOSEL_REW_Pos          (14UL)       /* REW (Bit 14) */\n#define RUSB2_CFIFOSEL_REW_Msk          (0x4000UL)   /* REW (Bitfield-Mask: 0x01) */\n#define RUSB2_CFIFOSEL_MBW_Pos          (10UL)       /* MBW (Bit 10) */\n#define RUSB2_CFIFOSEL_MBW_Msk          (0xc00UL)    /* MBW (Bitfield-Mask: 0x03) */\n#define RUSB2_CFIFOSEL_BIGEND_Pos       (8UL)        /* BIGEND (Bit 8) */\n#define RUSB2_CFIFOSEL_BIGEND_Msk       (0x100UL)    /* BIGEND (Bitfield-Mask: 0x01) */\n#define RUSB2_CFIFOSEL_ISEL_Pos         (5UL)        /* ISEL (Bit 5) */\n#define RUSB2_CFIFOSEL_ISEL_Msk         (0x20UL)     /* ISEL (Bitfield-Mask: 0x01) */\n#define RUSB2_CFIFOSEL_CURPIPE_Pos      (0UL)        /* CURPIPE (Bit 0) */\n#define RUSB2_CFIFOSEL_CURPIPE_Msk      (0xfUL)      /* CURPIPE (Bitfield-Mask: 0x0f) */\n\n// CFIFOCTR\n#define RUSB2_CFIFOCTR_BVAL_Pos         (15UL)       /* BVAL (Bit 15) */\n#define RUSB2_CFIFOCTR_BVAL_Msk         (0x8000UL)   /* BVAL (Bitfield-Mask: 0x01) */\n#define RUSB2_CFIFOCTR_BCLR_Pos         (14UL)       /* BCLR (Bit 14) */\n#define RUSB2_CFIFOCTR_BCLR_Msk         (0x4000UL)   /* BCLR (Bitfield-Mask: 0x01) */\n#define RUSB2_CFIFOCTR_FRDY_Pos         (13UL)       /* FRDY (Bit 13) */\n#define RUSB2_CFIFOCTR_FRDY_Msk         (0x2000UL)   /* FRDY (Bitfield-Mask: 0x01) */\n#define RUSB2_CFIFOCTR_DTLN_Pos         (0UL)        /* DTLN (Bit 0) */\n#define RUSB2_CFIFOCTR_DTLN_Msk         (0xfffUL)    /* DTLN (Bitfield-Mask: 0xfff) */\n\n// D0FIFOSEL\n#define RUSB2_D0FIFOSEL_RCNT_Pos        (15UL)       /* RCNT (Bit 15) */\n#define RUSB2_D0FIFOSEL_RCNT_Msk        (0x8000UL)   /* RCNT (Bitfield-Mask: 0x01) */\n#define RUSB2_D0FIFOSEL_REW_Pos         (14UL)       /* REW (Bit 14) */\n#define RUSB2_D0FIFOSEL_REW_Msk         (0x4000UL)   /* REW (Bitfield-Mask: 0x01) */\n#define RUSB2_D0FIFOSEL_DCLRM_Pos       (13UL)       /* DCLRM (Bit 13) */\n#define RUSB2_D0FIFOSEL_DCLRM_Msk       (0x2000UL)   /* DCLRM (Bitfield-Mask: 0x01) */\n#define RUSB2_D0FIFOSEL_DREQE_Pos       (12UL)       /* DREQE (Bit 12) */\n#define RUSB2_D0FIFOSEL_DREQE_Msk       (0x1000UL)   /* DREQE (Bitfield-Mask: 0x01) */\n#define RUSB2_D0FIFOSEL_MBW_Pos         (10UL)       /* MBW (Bit 10) */\n#define RUSB2_D0FIFOSEL_MBW_Msk         (0xc00UL)    /* MBW (Bitfield-Mask: 0x03) */\n#define RUSB2_D0FIFOSEL_BIGEND_Pos      (8UL)        /* BIGEND (Bit 8) */\n#define RUSB2_D0FIFOSEL_BIGEND_Msk      (0x100UL)    /* BIGEND (Bitfield-Mask: 0x01) */\n#define RUSB2_D0FIFOSEL_CURPIPE_Pos     (0UL)        /* CURPIPE (Bit 0) */\n#define RUSB2_D0FIFOSEL_CURPIPE_Msk     (0xfUL)      /* CURPIPE (Bitfield-Mask: 0x0f) */\n\n// D0FIFOCTR\n#define RUSB2_D0FIFOCTR_BVAL_Pos        (15UL)       /* BVAL (Bit 15) */\n#define RUSB2_D0FIFOCTR_BVAL_Msk        (0x8000UL)   /* BVAL (Bitfield-Mask: 0x01) */\n#define RUSB2_D0FIFOCTR_BCLR_Pos        (14UL)       /* BCLR (Bit 14) */\n#define RUSB2_D0FIFOCTR_BCLR_Msk        (0x4000UL)   /* BCLR (Bitfield-Mask: 0x01) */\n#define RUSB2_D0FIFOCTR_FRDY_Pos        (13UL)       /* FRDY (Bit 13) */\n#define RUSB2_D0FIFOCTR_FRDY_Msk        (0x2000UL)   /* FRDY (Bitfield-Mask: 0x01) */\n#define RUSB2_D0FIFOCTR_DTLN_Pos        (0UL)        /* DTLN (Bit 0) */\n#define RUSB2_D0FIFOCTR_DTLN_Msk        (0xfffUL)    /* DTLN (Bitfield-Mask: 0xfff) */\n\n// D1FIFOSEL\n#define RUSB2_D1FIFOSEL_RCNT_Pos        (15UL)       /* RCNT (Bit 15) */\n#define RUSB2_D1FIFOSEL_RCNT_Msk        (0x8000UL)   /* RCNT (Bitfield-Mask: 0x01) */\n#define RUSB2_D1FIFOSEL_REW_Pos         (14UL)       /* REW (Bit 14) */\n#define RUSB2_D1FIFOSEL_REW_Msk         (0x4000UL)   /* REW (Bitfield-Mask: 0x01) */\n#define RUSB2_D1FIFOSEL_DCLRM_Pos       (13UL)       /* DCLRM (Bit 13) */\n#define RUSB2_D1FIFOSEL_DCLRM_Msk       (0x2000UL)   /* DCLRM (Bitfield-Mask: 0x01) */\n#define RUSB2_D1FIFOSEL_DREQE_Pos       (12UL)       /* DREQE (Bit 12) */\n#define RUSB2_D1FIFOSEL_DREQE_Msk       (0x1000UL)   /* DREQE (Bitfield-Mask: 0x01) */\n#define RUSB2_D1FIFOSEL_MBW_Pos         (10UL)       /* MBW (Bit 10) */\n#define RUSB2_D1FIFOSEL_MBW_Msk         (0xc00UL)    /* MBW (Bitfield-Mask: 0x03) */\n#define RUSB2_D1FIFOSEL_BIGEND_Pos      (8UL)        /* BIGEND (Bit 8) */\n#define RUSB2_D1FIFOSEL_BIGEND_Msk      (0x100UL)    /* BIGEND (Bitfield-Mask: 0x01) */\n#define RUSB2_D1FIFOSEL_CURPIPE_Pos     (0UL)        /* CURPIPE (Bit 0) */\n#define RUSB2_D1FIFOSEL_CURPIPE_Msk     (0xfUL)      /* CURPIPE (Bitfield-Mask: 0x0f) */\n\n// D1FIFOCTR\n#define RUSB2_D1FIFOCTR_BVAL_Pos        (15UL)       /* BVAL (Bit 15) */\n#define RUSB2_D1FIFOCTR_BVAL_Msk        (0x8000UL)   /* BVAL (Bitfield-Mask: 0x01) */\n#define RUSB2_D1FIFOCTR_BCLR_Pos        (14UL)       /* BCLR (Bit 14) */\n#define RUSB2_D1FIFOCTR_BCLR_Msk        (0x4000UL)   /* BCLR (Bitfield-Mask: 0x01) */\n#define RUSB2_D1FIFOCTR_FRDY_Pos        (13UL)       /* FRDY (Bit 13) */\n#define RUSB2_D1FIFOCTR_FRDY_Msk        (0x2000UL)   /* FRDY (Bitfield-Mask: 0x01) */\n#define RUSB2_D1FIFOCTR_DTLN_Pos        (0UL)        /* DTLN (Bit 0) */\n#define RUSB2_D1FIFOCTR_DTLN_Msk        (0xfffUL)    /* DTLN (Bitfield-Mask: 0xfff) */\n\n// INTENB0\n#define RUSB2_INTENB0_VBSE_Pos          (15UL)       /* VBSE (Bit 15) */\n#define RUSB2_INTENB0_VBSE_Msk          (0x8000UL)   /* VBSE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB0_RSME_Pos          (14UL)       /* RSME (Bit 14) */\n#define RUSB2_INTENB0_RSME_Msk          (0x4000UL)   /* RSME (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB0_SOFE_Pos          (13UL)       /* SOFE (Bit 13) */\n#define RUSB2_INTENB0_SOFE_Msk          (0x2000UL)   /* SOFE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB0_DVSE_Pos          (12UL)       /* DVSE (Bit 12) */\n#define RUSB2_INTENB0_DVSE_Msk          (0x1000UL)   /* DVSE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB0_CTRE_Pos          (11UL)       /* CTRE (Bit 11) */\n#define RUSB2_INTENB0_CTRE_Msk          (0x800UL)    /* CTRE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB0_BEMPE_Pos         (10UL)       /* BEMPE (Bit 10) */\n#define RUSB2_INTENB0_BEMPE_Msk         (0x400UL)    /* BEMPE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB0_NRDYE_Pos         (9UL)        /* NRDYE (Bit 9) */\n#define RUSB2_INTENB0_NRDYE_Msk         (0x200UL)    /* NRDYE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB0_BRDYE_Pos         (8UL)        /* BRDYE (Bit 8) */\n#define RUSB2_INTENB0_BRDYE_Msk         (0x100UL)    /* BRDYE (Bitfield-Mask: 0x01) */\n\n// INTENB1\n#define RUSB2_INTENB1_OVRCRE_Pos        (15UL)       /* OVRCRE (Bit 15) */\n#define RUSB2_INTENB1_OVRCRE_Msk        (0x8000UL)   /* OVRCRE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB1_BCHGE_Pos         (14UL)       /* BCHGE (Bit 14) */\n#define RUSB2_INTENB1_BCHGE_Msk         (0x4000UL)   /* BCHGE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB1_DTCHE_Pos         (12UL)       /* DTCHE (Bit 12) */\n#define RUSB2_INTENB1_DTCHE_Msk         (0x1000UL)   /* DTCHE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB1_ATTCHE_Pos        (11UL)       /* ATTCHE (Bit 11) */\n#define RUSB2_INTENB1_ATTCHE_Msk        (0x800UL)    /* ATTCHE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB1_L1RSMENDE_Pos     (9UL)        /*!< L1RSMENDE (Bit 9)                                     */\n#define RUSB2_INTENB1_L1RSMENDE_Msk     (0x200UL)    /*!< L1RSMENDE (Bitfield-Mask: 0x01)                       */\n#define RUSB2_INTENB1_LPMENDE_Pos       (8UL)        /*!< LPMENDE (Bit 8)                                       */\n#define RUSB2_INTENB1_LPMENDE_Msk       (0x100UL)    /*!< LPMENDE (Bitfield-Mask: 0x01)                         */\n#define RUSB2_INTENB1_EOFERRE_Pos       (6UL)        /* EOFERRE (Bit 6) */\n#define RUSB2_INTENB1_EOFERRE_Msk       (0x40UL)     /* EOFERRE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB1_SIGNE_Pos         (5UL)        /* SIGNE (Bit 5) */\n#define RUSB2_INTENB1_SIGNE_Msk         (0x20UL)     /* SIGNE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB1_SACKE_Pos         (4UL)        /* SACKE (Bit 4) */\n#define RUSB2_INTENB1_SACKE_Msk         (0x10UL)     /* SACKE (Bitfield-Mask: 0x01) */\n#define RUSB2_INTENB1_PDDETINTE0_Pos    (0UL)        /* PDDETINTE0 (Bit 0) */\n#define RUSB2_INTENB1_PDDETINTE0_Msk    (0x1UL)      /* PDDETINTE0 (Bitfield-Mask: 0x01) */\n\n// BRDYENB\n#define RUSB2_BRDYENB_PIPEBRDYE_Pos     (0UL)        /* PIPEBRDYE (Bit 0) */\n#define RUSB2_BRDYENB_PIPEBRDYE_Msk     (0x1UL)      /* PIPEBRDYE (Bitfield-Mask: 0x01) */\n\n// NRDYENB\n#define RUSB2_NRDYENB_PIPENRDYE_Pos     (0UL)        /* PIPENRDYE (Bit 0) */\n#define RUSB2_NRDYENB_PIPENRDYE_Msk     (0x1UL)      /* PIPENRDYE (Bitfield-Mask: 0x01) */\n\n// BEMPENB\n#define RUSB2_BEMPENB_PIPEBEMPE_Pos     (0UL)        /* PIPEBEMPE (Bit 0) */\n#define RUSB2_BEMPENB_PIPEBEMPE_Msk     (0x1UL)      /* PIPEBEMPE (Bitfield-Mask: 0x01) */\n\n// SOFCFG\n#define RUSB2_SOFCFG_TRNENSEL_Pos       (8UL)        /* TRNENSEL (Bit 8) */\n#define RUSB2_SOFCFG_TRNENSEL_Msk       (0x100UL)    /* TRNENSEL (Bitfield-Mask: 0x01) */\n#define RUSB2_SOFCFG_BRDYM_Pos          (6UL)        /* BRDYM (Bit 6) */\n#define RUSB2_SOFCFG_BRDYM_Msk          (0x40UL)     /* BRDYM (Bitfield-Mask: 0x01) */\n#define RUSB2_SOFCFG_INTL_Pos           (5UL)        /* INTL (Bit 5) */\n#define RUSB2_SOFCFG_INTL_Msk           (0x20UL)     /* INTL (Bitfield-Mask: 0x01) */\n#define RUSB2_SOFCFG_EDGESTS_Pos        (4UL)        /* EDGESTS (Bit 4) */\n#define RUSB2_SOFCFG_EDGESTS_Msk        (0x10UL)     /* EDGESTS (Bitfield-Mask: 0x01) */\n\n// PHYSET\n#define RUSB2_PHYSET_HSEB_Pos           (15UL)       /* HSEB (Bit 15) */\n#define RUSB2_PHYSET_HSEB_Msk           (0x8000UL)   /* HSEB (Bitfield-Mask: 0x01) */\n#define RUSB2_PHYSET_REPSTART_Pos       (11UL)       /* REPSTART (Bit 11) */\n#define RUSB2_PHYSET_REPSTART_Msk       (0x800UL)    /* REPSTART (Bitfield-Mask: 0x01) */\n#define RUSB2_PHYSET_REPSEL_Pos         (8UL)        /* REPSEL (Bit 8) */\n#define RUSB2_PHYSET_REPSEL_Msk         (0x300UL)    /* REPSEL (Bitfield-Mask: 0x03) */\n#define RUSB2_PHYSET_CLKSEL_Pos         (4UL)        /* CLKSEL (Bit 4) */\n#define RUSB2_PHYSET_CLKSEL_Msk         (0x30UL)     /* CLKSEL (Bitfield-Mask: 0x03) */\n#define RUSB2_PHYSET_CDPEN_Pos          (3UL)        /* CDPEN (Bit 3) */\n#define RUSB2_PHYSET_CDPEN_Msk          (0x8UL)      /* CDPEN (Bitfield-Mask: 0x01) */\n#define RUSB2_PHYSET_PLLRESET_Pos       (1UL)        /* PLLRESET (Bit 1) */\n#define RUSB2_PHYSET_PLLRESET_Msk       (0x2UL)      /* PLLRESET (Bitfield-Mask: 0x01) */\n#define RUSB2_PHYSET_DIRPD_Pos          (0UL)        /* DIRPD (Bit 0) */\n#define RUSB2_PHYSET_DIRPD_Msk          (0x1UL)      /* DIRPD (Bitfield-Mask: 0x01) */\n\n// INTSTS0\n#define RUSB2_INTSTS0_VBINT_Pos         (15UL)       /* VBINT (Bit 15) */\n#define RUSB2_INTSTS0_VBINT_Msk         (0x8000UL)   /* VBINT (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_RESM_Pos          (14UL)       /* RESM (Bit 14) */\n#define RUSB2_INTSTS0_RESM_Msk          (0x4000UL)   /* RESM (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_SOFR_Pos          (13UL)       /* SOFR (Bit 13) */\n#define RUSB2_INTSTS0_SOFR_Msk          (0x2000UL)   /* SOFR (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_DVST_Pos          (12UL)       /* DVST (Bit 12) */\n#define RUSB2_INTSTS0_DVST_Msk          (0x1000UL)   /* DVST (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_CTRT_Pos          (11UL)       /* CTRT (Bit 11) */\n#define RUSB2_INTSTS0_CTRT_Msk          (0x800UL)    /* CTRT (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_BEMP_Pos          (10UL)       /* BEMP (Bit 10) */\n#define RUSB2_INTSTS0_BEMP_Msk          (0x400UL)    /* BEMP (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_NRDY_Pos          (9UL)        /* NRDY (Bit 9) */\n#define RUSB2_INTSTS0_NRDY_Msk          (0x200UL)    /* NRDY (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_BRDY_Pos          (8UL)        /* BRDY (Bit 8) */\n#define RUSB2_INTSTS0_BRDY_Msk          (0x100UL)    /* BRDY (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_VBSTS_Pos         (7UL)        /* VBSTS (Bit 7) */\n#define RUSB2_INTSTS0_VBSTS_Msk         (0x80UL)     /* VBSTS (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_DVSQ_Pos          (4UL)        /* DVSQ (Bit 4) */\n#define RUSB2_INTSTS0_DVSQ_Msk          (0x70UL)     /* DVSQ (Bitfield-Mask: 0x07) */\n#define RUSB2_INTSTS0_VALID_Pos         (3UL)        /* VALID (Bit 3) */\n#define RUSB2_INTSTS0_VALID_Msk         (0x8UL)      /* VALID (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS0_CTSQ_Pos          (0UL)        /* CTSQ (Bit 0) */\n#define RUSB2_INTSTS0_CTSQ_Msk          (0x7UL)      /* CTSQ (Bitfield-Mask: 0x07) */\n\n// INTSTS1\n#define RUSB2_INTSTS1_OVRCR_Pos         (15UL)       /* OVRCR (Bit 15) */\n#define RUSB2_INTSTS1_OVRCR_Msk         (0x8000UL)   /* OVRCR (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_BCHG_Pos          (14UL)       /* BCHG (Bit 14) */\n#define RUSB2_INTSTS1_BCHG_Msk          (0x4000UL)   /* BCHG (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_DTCH_Pos          (12UL)       /* DTCH (Bit 12) */\n#define RUSB2_INTSTS1_DTCH_Msk          (0x1000UL)   /* DTCH (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_ATTCH_Pos         (11UL)       /* ATTCH (Bit 11) */\n#define RUSB2_INTSTS1_ATTCH_Msk         (0x800UL)    /* ATTCH (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_L1RSMEND_Pos      (9UL)        /* L1RSMEND (Bit 9) */\n#define RUSB2_INTSTS1_L1RSMEND_Msk      (0x200UL)    /* L1RSMEND (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_LPMEND_Pos        (8UL)        /* LPMEND (Bit 8) */\n#define RUSB2_INTSTS1_LPMEND_Msk        (0x100UL)    /* LPMEND (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_EOFERR_Pos        (6UL)        /* EOFERR (Bit 6) */\n#define RUSB2_INTSTS1_EOFERR_Msk        (0x40UL)     /* EOFERR (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_SIGN_Pos          (5UL)        /* SIGN (Bit 5) */\n#define RUSB2_INTSTS1_SIGN_Msk          (0x20UL)     /* SIGN (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_SACK_Pos          (4UL)        /* SACK (Bit 4) */\n#define RUSB2_INTSTS1_SACK_Msk          (0x10UL)     /* SACK (Bitfield-Mask: 0x01) */\n#define RUSB2_INTSTS1_PDDETINT0_Pos     (0UL)        /* PDDETINT0 (Bit 0) */\n#define RUSB2_INTSTS1_PDDETINT0_Msk     (0x1UL)      /* PDDETINT0 (Bitfield-Mask: 0x01) */\n\n// BRDYSTS\n#define RUSB2_BRDYSTS_PIPEBRDY_Pos      (0UL)        /* PIPEBRDY (Bit 0) */\n#define RUSB2_BRDYSTS_PIPEBRDY_Msk      (0x1UL)      /* PIPEBRDY (Bitfield-Mask: 0x01) */\n\n// NRDYSTS\n#define RUSB2_NRDYSTS_PIPENRDY_Pos      (0UL)        /* PIPENRDY (Bit 0) */\n#define RUSB2_NRDYSTS_PIPENRDY_Msk      (0x1UL)      /* PIPENRDY (Bitfield-Mask: 0x01) */\n\n// BEMPSTS\n#define RUSB2_BEMPSTS_PIPEBEMP_Pos      (0UL)        /* PIPEBEMP (Bit 0) */\n#define RUSB2_BEMPSTS_PIPEBEMP_Msk      (0x1UL)      /* PIPEBEMP (Bitfield-Mask: 0x01) */\n\n// FRMNUM\n#define RUSB2_FRMNUM_OVRN_Pos           (15UL)       /* OVRN (Bit 15) */\n#define RUSB2_FRMNUM_OVRN_Msk           (0x8000UL)   /* OVRN (Bitfield-Mask: 0x01) */\n#define RUSB2_FRMNUM_CRCE_Pos           (14UL)       /* CRCE (Bit 14) */\n#define RUSB2_FRMNUM_CRCE_Msk           (0x4000UL)   /* CRCE (Bitfield-Mask: 0x01) */\n#define RUSB2_FRMNUM_FRNM_Pos           (0UL)        /* FRNM (Bit 0) */\n#define RUSB2_FRMNUM_FRNM_Msk           (0x7ffUL)    /* FRNM (Bitfield-Mask: 0x7ff) */\n\n// UFRMNUM\n#define RUSB2_UFRMNUM_DVCHG_Pos         (15UL)       /* DVCHG (Bit 15) */\n#define RUSB2_UFRMNUM_DVCHG_Msk         (0x8000UL)   /* DVCHG (Bitfield-Mask: 0x01) */\n#define RUSB2_UFRMNUM_UFRNM_Pos         (0UL)        /* UFRNM (Bit 0) */\n#define RUSB2_UFRMNUM_UFRNM_Msk         (0x7UL)      /* UFRNM (Bitfield-Mask: 0x07) */\n\n// USBADDR\n#define RUSB2_USBADDR_STSRECOV0_Pos     (8UL)        /* STSRECOV0 (Bit 8) */\n#define RUSB2_USBADDR_STSRECOV0_Msk     (0x700UL)    /* STSRECOV0 (Bitfield-Mask: 0x07) */\n#define RUSB2_USBADDR_USBADDR_Pos       (0UL)        /* USBADDR (Bit 0) */\n#define RUSB2_USBADDR_USBADDR_Msk       (0x7fUL)     /* USBADDR (Bitfield-Mask: 0x7f) */\n\n// USBREQ\n#define RUSB2_USBREQ_BREQUEST_Pos       (8UL)        /* BREQUEST (Bit 8) */\n#define RUSB2_USBREQ_BREQUEST_Msk       (0xff00UL)   /* BREQUEST (Bitfield-Mask: 0xff) */\n#define RUSB2_USBREQ_BMREQUESTTYPE_Pos  (0UL)        /* BMREQUESTTYPE (Bit 0) */\n#define RUSB2_USBREQ_BMREQUESTTYPE_Msk  (0xffUL)     /* BMREQUESTTYPE (Bitfield-Mask: 0xff) */\n\n// USBVAL\n#define RUSB2_USBVAL_WVALUE_Pos         (0UL)        /* WVALUE (Bit 0) */\n#define RUSB2_USBVAL_WVALUE_Msk         (0xffffUL)   /* WVALUE (Bitfield-Mask: 0xffff) */\n\n// USBINDX\n#define RUSB2_USBINDX_WINDEX_Pos        (0UL)        /* WINDEX (Bit 0) */\n#define RUSB2_USBINDX_WINDEX_Msk        (0xffffUL)   /* WINDEX (Bitfield-Mask: 0xffff) */\n\n// USBLENG\n#define RUSB2_USBLENG_WLENGTH_Pos       (0UL)        /* WLENGTH (Bit 0) */\n#define RUSB2_USBLENG_WLENGTH_Msk       (0xffffUL)   /* WLENGTH (Bitfield-Mask: 0xffff) */\n\n// DCPCFG\n#define RUSB2_DCPCFG_CNTMD_Pos          (8UL)        /* CNTMD (Bit 8) */\n#define RUSB2_DCPCFG_CNTMD_Msk          (0x100UL)    /* CNTMD (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCFG_SHTNAK_Pos         (7UL)        /* SHTNAK (Bit 7) */\n#define RUSB2_DCPCFG_SHTNAK_Msk         (0x80UL)     /* SHTNAK (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCFG_DIR_Pos            (4UL)        /* DIR (Bit 4) */\n#define RUSB2_DCPCFG_DIR_Msk            (0x10UL)     /* DIR (Bitfield-Mask: 0x01) */\n\n// DCPMAXP\n#define RUSB2_DCPMAXP_DEVSEL_Pos        (12UL)       /* DEVSEL (Bit 12) */\n#define RUSB2_DCPMAXP_DEVSEL_Msk        (0xf000UL)   /* DEVSEL (Bitfield-Mask: 0x0f) */\n#define RUSB2_DCPMAXP_MXPS_Pos          (0UL)        /* MXPS (Bit 0) */\n#define RUSB2_DCPMAXP_MXPS_Msk          (0x7fUL)     /* MXPS (Bitfield-Mask: 0x7f) */\n\n// DCPCTR\n#define RUSB2_DCPCTR_BSTS_Pos           (15UL)       /* BSTS (Bit 15) */\n#define RUSB2_DCPCTR_BSTS_Msk           (0x8000UL)   /* BSTS (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCTR_SUREQ_Pos          (14UL)       /* SUREQ (Bit 14) */\n#define RUSB2_DCPCTR_SUREQ_Msk          (0x4000UL)   /* SUREQ (Bitfield-Mask: 0x01) */\n#define R_USB_HS0_DCPCTR_CSCLR_Pos      (13UL)       /*!< CSCLR (Bit 13)                                        */\n#define RUSB2_DCPCTR_CSCLR_Msk          (0x2000UL)   /*!< CSCLR (Bitfield-Mask: 0x01)                           */\n#define RUSB2_DCPCTR_CSSTS_Pos          (12UL)       /*!< CSSTS (Bit 12)                                        */\n#define RUSB2_DCPCTR_CSSTS_Msk          (0x1000UL)   /*!< CSSTS (Bitfield-Mask: 0x01)                           */\n#define RUSB2_DCPCTR_SUREQCLR_Pos       (11UL)       /* SUREQCLR (Bit 11) */\n#define RUSB2_DCPCTR_SUREQCLR_Msk       (0x800UL)    /* SUREQCLR (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCTR_SQCLR_Pos          (8UL)        /* SQCLR (Bit 8) */\n#define RUSB2_DCPCTR_SQCLR_Msk          (0x100UL)    /* SQCLR (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCTR_SQSET_Pos          (7UL)        /* SQSET (Bit 7) */\n#define RUSB2_DCPCTR_SQSET_Msk          (0x80UL)     /* SQSET (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCTR_SQMON_Pos          (6UL)        /* SQMON (Bit 6) */\n#define RUSB2_DCPCTR_SQMON_Msk          (0x40UL)     /* SQMON (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCTR_PBUSY_Pos          (5UL)        /* PBUSY (Bit 5) */\n#define RUSB2_DCPCTR_PBUSY_Msk          (0x20UL)     /* PBUSY (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCTR_CCPL_Pos           (2UL)        /* CCPL (Bit 2) */\n#define RUSB2_DCPCTR_CCPL_Msk           (0x4UL)      /* CCPL (Bitfield-Mask: 0x01) */\n#define RUSB2_DCPCTR_PID_Pos            (0UL)        /* PID (Bit 0) */\n#define RUSB2_DCPCTR_PID_Msk            (0x3UL)      /* PID (Bitfield-Mask: 0x03) */\n\n// PIPESEL\n#define RUSB2_PIPESEL_PIPESEL_Pos       (0UL)        /* PIPESEL (Bit 0) */\n#define RUSB2_PIPESEL_PIPESEL_Msk       (0xfUL)      /* PIPESEL (Bitfield-Mask: 0x0f) */\n\n// PIPECFG\n#define RUSB2_PIPECFG_TYPE_Pos          (14UL)       /* TYPE (Bit 14) */\n#define RUSB2_PIPECFG_TYPE_Msk          (0xc000UL)   /* TYPE (Bitfield-Mask: 0x03) */\n#define RUSB2_PIPECFG_BFRE_Pos          (10UL)       /* BFRE (Bit 10) */\n#define RUSB2_PIPECFG_BFRE_Msk          (0x400UL)    /* BFRE (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPECFG_DBLB_Pos          (9UL)        /* DBLB (Bit 9) */\n#define RUSB2_PIPECFG_DBLB_Msk          (0x200UL)    /* DBLB (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPECFG_CNTMD_Pos         (8UL)        /*!< CNTMD (Bit 8)                                         */\n#define RUSB2_PIPECFG_CNTMD_Msk         (0x100UL)    /*!< CNTMD (Bitfield-Mask: 0x01)                           */\n#define RUSB2_PIPECFG_SHTNAK_Pos        (7UL)        /* SHTNAK (Bit 7) */\n#define RUSB2_PIPECFG_SHTNAK_Msk        (0x80UL)     /* SHTNAK (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPECFG_DIR_Pos           (4UL)        /* DIR (Bit 4) */\n#define RUSB2_PIPECFG_DIR_Msk           (0x10UL)     /* DIR (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPECFG_EPNUM_Pos         (0UL)        /* EPNUM (Bit 0) */\n#define RUSB2_PIPECFG_EPNUM_Msk         (0xfUL)      /* EPNUM (Bitfield-Mask: 0x0f) */\n\n// PIPEBUF\n#define RUSB2_PIPEBUF_BUFSIZE_Pos       (10UL)       /*!< BUFSIZE (Bit 10)                                      */\n#define RUSB2_PIPEBUF_BUFSIZE_Msk       (0x7c00UL)   /*!< BUFSIZE (Bitfield-Mask: 0x1f)                         */\n#define RUSB2_PIPEBUF_BUFNMB_Pos        (0UL)        /*!< BUFNMB (Bit 0)                                        */\n#define RUSB2_PIPEBUF_BUFNMB_Msk        (0xffUL)     /*!< BUFNMB (Bitfield-Mask: 0xff)                          */\n\n// PIPEMAXP\n#define RUSB2_PIPEMAXP_DEVSEL_Pos       (12UL)       /* DEVSEL (Bit 12) */\n#define RUSB2_PIPEMAXP_DEVSEL_Msk       (0xf000UL)   /* DEVSEL (Bitfield-Mask: 0x0f) */\n#define RUSB2_PIPEMAXP_MXPS_Pos         (0UL)        /* MXPS (Bit 0) */\n#define RUSB2_PIPEMAXP_MXPS_Msk         (0x1ffUL)    /* MXPS (Bitfield-Mask: 0x1ff) */\n\n// PIPEPERI\n#define RUSB2_PIPEPERI_IFIS_Pos         (12UL)       /* IFIS (Bit 12) */\n#define RUSB2_PIPEPERI_IFIS_Msk         (0x1000UL)   /* IFIS (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPEPERI_IITV_Pos         (0UL)        /* IITV (Bit 0) */\n#define RUSB2_PIPEPERI_IITV_Msk         (0x7UL)      /* IITV (Bitfield-Mask: 0x07) */\n\n// PIPE_CTR\n#define RUSB2_PIPE_CTR_BSTS_Pos         (15UL)       /* BSTS (Bit 15) */\n#define RUSB2_PIPE_CTR_BSTS_Msk         (0x8000UL)   /* BSTS (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_INBUFM_Pos       (14UL)       /* INBUFM (Bit 14) */\n#define RUSB2_PIPE_CTR_INBUFM_Msk       (0x4000UL)   /* INBUFM (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_CSCLR_Pos        (13UL)       /* CSCLR (Bit 13) */\n#define RUSB2_PIPE_CTR_CSCLR_Msk        (0x2000UL)   /* CSCLR (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_CSSTS_Pos        (12UL)       /* CSSTS (Bit 12) */\n#define RUSB2_PIPE_CTR_CSSTS_Msk        (0x1000UL)   /* CSSTS (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_ATREPM_Pos       (10UL)       /* ATREPM (Bit 10) */\n#define RUSB2_PIPE_CTR_ATREPM_Msk       (0x400UL)    /* ATREPM (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_ACLRM_Pos        (9UL)        /* ACLRM (Bit 9) */\n#define RUSB2_PIPE_CTR_ACLRM_Msk        (0x200UL)    /* ACLRM (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_SQCLR_Pos        (8UL)        /* SQCLR (Bit 8) */\n#define RUSB2_PIPE_CTR_SQCLR_Msk        (0x100UL)    /* SQCLR (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_SQSET_Pos        (7UL)        /* SQSET (Bit 7) */\n#define RUSB2_PIPE_CTR_SQSET_Msk        (0x80UL)     /* SQSET (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_SQMON_Pos        (6UL)        /* SQMON (Bit 6) */\n#define RUSB2_PIPE_CTR_SQMON_Msk        (0x40UL)     /* SQMON (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_PBUSY_Pos        (5UL)        /* PBUSY (Bit 5) */\n#define RUSB2_PIPE_CTR_PBUSY_Msk        (0x20UL)     /* PBUSY (Bitfield-Mask: 0x01) */\n#define RUSB2_PIPE_CTR_PID_Pos          (0UL)        /* PID (Bit 0) */\n#define RUSB2_PIPE_CTR_PID_Msk          (0x3UL)      /* PID (Bitfield-Mask: 0x03) */\n\n// DEVADD\n#define RUSB2_DEVADD_UPPHUB_Pos         (11UL)       /* UPPHUB (Bit 11) */\n#define RUSB2_DEVADD_UPPHUB_Msk         (0x7800UL)   /* UPPHUB (Bitfield-Mask: 0x0f) */\n#define RUSB2_DEVADD_HUBPORT_Pos        (8UL)        /* HUBPORT (Bit 8) */\n#define RUSB2_DEVADD_HUBPORT_Msk        (0x700UL)    /* HUBPORT (Bitfield-Mask: 0x07) */\n#define RUSB2_DEVADD_USBSPD_Pos         (6UL)        /* USBSPD (Bit 6) */\n#define RUSB2_DEVADD_USBSPD_Msk         (0xc0UL)     /* USBSPD (Bitfield-Mask: 0x03) */\n\n// USBBCCTRL0\n#define RUSB2_USBBCCTRL0_PDDETSTS0_Pos  (9UL)        /* PDDETSTS0 (Bit 9) */\n#define RUSB2_USBBCCTRL0_PDDETSTS0_Msk  (0x200UL)    /* PDDETSTS0 (Bitfield-Mask: 0x01) */\n#define RUSB2_USBBCCTRL0_CHGDETSTS0_Pos (8UL)        /* CHGDETSTS0 (Bit 8) */\n#define RUSB2_USBBCCTRL0_CHGDETSTS0_Msk (0x100UL)    /* CHGDETSTS0 (Bitfield-Mask: 0x01) */\n#define RUSB2_USBBCCTRL0_BATCHGE0_Pos   (7UL)        /* BATCHGE0 (Bit 7) */\n#define RUSB2_USBBCCTRL0_BATCHGE0_Msk   (0x80UL)     /* BATCHGE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_USBBCCTRL0_VDMSRCE0_Pos   (5UL)        /* VDMSRCE0 (Bit 5) */\n#define RUSB2_USBBCCTRL0_VDMSRCE0_Msk   (0x20UL)     /* VDMSRCE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_USBBCCTRL0_IDPSINKE0_Pos  (4UL)        /* IDPSINKE0 (Bit 4) */\n#define RUSB2_USBBCCTRL0_IDPSINKE0_Msk  (0x10UL)     /* IDPSINKE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_USBBCCTRL0_VDPSRCE0_Pos   (3UL)        /* VDPSRCE0 (Bit 3) */\n#define RUSB2_USBBCCTRL0_VDPSRCE0_Msk   (0x8UL)      /* VDPSRCE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_USBBCCTRL0_IDMSINKE0_Pos  (2UL)        /* IDMSINKE0 (Bit 2) */\n#define RUSB2_USBBCCTRL0_IDMSINKE0_Msk  (0x4UL)      /* IDMSINKE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_USBBCCTRL0_IDPSRCE0_Pos   (1UL)        /* IDPSRCE0 (Bit 1) */\n#define RUSB2_USBBCCTRL0_IDPSRCE0_Msk   (0x2UL)      /* IDPSRCE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_USBBCCTRL0_RPDME0_Pos     (0UL)        /* RPDME0 (Bit 0) */\n#define RUSB2_USBBCCTRL0_RPDME0_Msk     (0x1UL)      /* RPDME0 (Bitfield-Mask: 0x01) */\n\n// UCKSEL\n#define RUSB2_UCKSEL_UCKSELC_Pos        (0UL)        /* UCKSELC (Bit 0) */\n#define RUSB2_UCKSEL_UCKSELC_Msk        (0x1UL)      /* UCKSELC (Bitfield-Mask: 0x01) */\n\n// USBMC\n#define RUSB2_USBMC_VDCEN_Pos           (7UL)        /* VDCEN (Bit 7) */\n#define RUSB2_USBMC_VDCEN_Msk           (0x80UL)     /* VDCEN (Bitfield-Mask: 0x01) */\n#define RUSB2_USBMC_VDDUSBE_Pos         (0UL)        /* VDDUSBE (Bit 0) */\n#define RUSB2_USBMC_VDDUSBE_Msk         (0x1UL)      /* VDDUSBE (Bitfield-Mask: 0x01) */\n\n// PHYSLEW\n#define RUSB2_PHYSLEW_SLEWF01_Pos       (3UL)        /* SLEWF01 (Bit 3) */\n#define RUSB2_PHYSLEW_SLEWF01_Msk       (0x8UL)      /* SLEWF01 (Bitfield-Mask: 0x01) */\n#define RUSB2_PHYSLEW_SLEWF00_Pos       (2UL)        /* SLEWF00 (Bit 2) */\n#define RUSB2_PHYSLEW_SLEWF00_Msk       (0x4UL)      /* SLEWF00 (Bitfield-Mask: 0x01) */\n#define RUSB2_PHYSLEW_SLEWR01_Pos       (1UL)        /* SLEWR01 (Bit 1) */\n#define RUSB2_PHYSLEW_SLEWR01_Msk       (0x2UL)      /* SLEWR01 (Bitfield-Mask: 0x01) */\n#define RUSB2_PHYSLEW_SLEWR00_Pos       (0UL)        /* SLEWR00 (Bit 0) */\n#define RUSB2_PHYSLEW_SLEWR00_Msk       (0x1UL)      /* SLEWR00 (Bitfield-Mask: 0x01) */\n\n// LPCTRL\n#define RUSB2_LPCTRL_HWUPM_Pos          (7UL)        /* HWUPM (Bit 7) */\n#define RUSB2_LPCTRL_HWUPM_Msk          (0x80UL)     /* HWUPM (Bitfield-Mask: 0x01) */\n\n// LPSTS\n#define RUSB2_LPSTS_SUSPENDM_Pos        (14UL)       /* SUSPENDM (Bit 14) */\n#define RUSB2_LPSTS_SUSPENDM_Msk        (0x4000UL)   /* SUSPENDM (Bitfield-Mask: 0x01) */\n\n// BCCTRL\n#define RUSB2_BCCTRL_PDDETSTS_Pos       (9UL)        /* PDDETSTS (Bit 9) */\n#define RUSB2_BCCTRL_PDDETSTS_Msk       (0x200UL)    /* PDDETSTS (Bitfield-Mask: 0x01) */\n#define RUSB2_BCCTRL_CHGDETSTS_Pos      (8UL)        /* CHGDETSTS (Bit 8) */\n#define RUSB2_BCCTRL_CHGDETSTS_Msk      (0x100UL)    /* CHGDETSTS (Bitfield-Mask: 0x01) */\n#define RUSB2_BCCTRL_DCPMODE_Pos        (5UL)        /* DCPMODE (Bit 5) */\n#define RUSB2_BCCTRL_DCPMODE_Msk        (0x20UL)     /* DCPMODE (Bitfield-Mask: 0x01) */\n#define RUSB2_BCCTRL_VDMSRCE_Pos        (4UL)        /* VDMSRCE (Bit 4) */\n#define RUSB2_BCCTRL_VDMSRCE_Msk        (0x10UL)     /* VDMSRCE (Bitfield-Mask: 0x01) */\n#define RUSB2_BCCTRL_IDPSINKE_Pos       (3UL)        /* IDPSINKE (Bit 3) */\n#define RUSB2_BCCTRL_IDPSINKE_Msk       (0x8UL)      /* IDPSINKE (Bitfield-Mask: 0x01) */\n#define RUSB2_BCCTRL_VDPSRCE_Pos        (2UL)        /* VDPSRCE (Bit 2) */\n#define RUSB2_BCCTRL_VDPSRCE_Msk        (0x4UL)      /* VDPSRCE (Bitfield-Mask: 0x01) */\n#define RUSB2_BCCTRL_IDMSINKE_Pos       (1UL)        /* IDMSINKE (Bit 1) */\n#define RUSB2_BCCTRL_IDMSINKE_Msk       (0x2UL)      /* IDMSINKE (Bitfield-Mask: 0x01) */\n#define RUSB2_BCCTRL_IDPSRCE_Pos        (0UL)        /* IDPSRCE (Bit 0) */\n#define RUSB2_BCCTRL_IDPSRCE_Msk        (0x1UL)      /* IDPSRCE (Bitfield-Mask: 0x01) */\n\n// PL1CTRL1\n#define RUSB2_PL1CTRL1_L1EXTMD_Pos      (14UL)       /* L1EXTMD (Bit 14) */\n#define RUSB2_PL1CTRL1_L1EXTMD_Msk      (0x4000UL)   /* L1EXTMD (Bitfield-Mask: 0x01) */\n#define RUSB2_PL1CTRL1_HIRDTHR_Pos      (8UL)        /* HIRDTHR (Bit 8) */\n#define RUSB2_PL1CTRL1_HIRDTHR_Msk      (0xf00UL)    /* HIRDTHR (Bitfield-Mask: 0x0f) */\n#define RUSB2_PL1CTRL1_DVSQ_Pos         (4UL)        /* DVSQ (Bit 4) */\n#define RUSB2_PL1CTRL1_DVSQ_Msk         (0xf0UL)     /* DVSQ (Bitfield-Mask: 0x0f) */\n#define RUSB2_PL1CTRL1_L1NEGOMD_Pos     (3UL)        /* L1NEGOMD (Bit 3) */\n#define RUSB2_PL1CTRL1_L1NEGOMD_Msk     (0x8UL)      /* L1NEGOMD (Bitfield-Mask: 0x01) */\n#define RUSB2_PL1CTRL1_L1RESPMD_Pos     (1UL)        /* L1RESPMD (Bit 1) */\n#define RUSB2_PL1CTRL1_L1RESPMD_Msk     (0x6UL)      /* L1RESPMD (Bitfield-Mask: 0x03) */\n#define RUSB2_PL1CTRL1_L1RESPEN_Pos     (0UL)        /* L1RESPEN (Bit 0) */\n#define RUSB2_PL1CTRL1_L1RESPEN_Msk     (0x1UL)      /* L1RESPEN (Bitfield-Mask: 0x01) */\n\n// PL1CTRL2\n#define RUSB2_PL1CTRL2_RWEMON_Pos       (12UL)       /* RWEMON (Bit 12) */\n#define RUSB2_PL1CTRL2_RWEMON_Msk       (0x1000UL)   /* RWEMON (Bitfield-Mask: 0x01) */\n#define RUSB2_PL1CTRL2_HIRDMON_Pos      (8UL)        /* HIRDMON (Bit 8) */\n#define RUSB2_PL1CTRL2_HIRDMON_Msk      (0xf00UL)    /* HIRDMON (Bitfield-Mask: 0x0f) */\n\n// HL1CTRL1\n#define RUSB2_HL1CTRL1_L1STATUS_Pos     (1UL)        /* L1STATUS (Bit 1) */\n#define RUSB2_HL1CTRL1_L1STATUS_Msk     (0x6UL)      /* L1STATUS (Bitfield-Mask: 0x03) */\n#define RUSB2_HL1CTRL1_L1REQ_Pos        (0UL)        /* L1REQ (Bit 0) */\n#define RUSB2_HL1CTRL1_L1REQ_Msk        (0x1UL)      /* L1REQ (Bitfield-Mask: 0x01) */\n\n// HL1CTRL2\n#define RUSB2_HL1CTRL2_BESL_Pos         (15UL)       /* BESL (Bit 15) */\n#define RUSB2_HL1CTRL2_BESL_Msk         (0x8000UL)   /* BESL (Bitfield-Mask: 0x01) */\n#define RUSB2_HL1CTRL2_L1RWE_Pos        (12UL)       /* L1RWE (Bit 12) */\n#define RUSB2_HL1CTRL2_L1RWE_Msk        (0x1000UL)   /* L1RWE (Bitfield-Mask: 0x01) */\n#define RUSB2_HL1CTRL2_HIRD_Pos         (8UL)        /* HIRD (Bit 8) */\n#define RUSB2_HL1CTRL2_HIRD_Msk         (0xf00UL)    /* HIRD (Bitfield-Mask: 0x0f) */\n#define RUSB2_HL1CTRL2_L1ADDR_Pos       (0UL)        /* L1ADDR (Bit 0) */\n#define RUSB2_HL1CTRL2_L1ADDR_Msk       (0xfUL)      /* L1ADDR (Bitfield-Mask: 0x0f) */\n\n// PHYTRIM1\n#define RUSB2_PHYTRIM1_IMPOFFSET_Pos    (12UL)       /*!< IMPOFFSET (Bit 12)                                    */\n#define RUSB2_PHYTRIM1_IMPOFFSET_Msk    (0x7000UL)   /*!< IMPOFFSET (Bitfield-Mask: 0x07)                       */\n#define RUSB2_PHYTRIM1_HSIUP_Pos        (8UL)        /*!< HSIUP (Bit 8)                                         */\n#define RUSB2_PHYTRIM1_HSIUP_Msk        (0xf00UL)    /*!< HSIUP (Bitfield-Mask: 0x0f)                           */\n#define RUSB2_PHYTRIM1_PCOMPENB_Pos     (7UL)        /*!< PCOMPENB (Bit 7)                                      */\n#define RUSB2_PHYTRIM1_PCOMPENB_Msk     (0x80UL)     /*!< PCOMPENB (Bitfield-Mask: 0x01)                        */\n#define RUSB2_PHYTRIM1_DFALL_Pos        (2UL)        /*!< DFALL (Bit 2)                                         */\n#define RUSB2_PHYTRIM1_DFALL_Msk        (0xcUL)      /*!< DFALL (Bitfield-Mask: 0x03)                           */\n#define RUSB2_PHYTRIM1_DRISE_Pos        (0UL)        /*!< DRISE (Bit 0)                                         */\n#define RUSB2_PHYTRIM1_DRISE_Msk        (0x3UL)      /*!< DRISE (Bitfield-Mask: 0x03)                           */\n\n// PHYTRIM2\n#define RUSB2_PHYTRIM2_DIS_Pos          (12UL)       /*!< DIS (Bit 12)                                          */\n#define RUSB2_PHYTRIM2_DIS_Msk          (0x7000UL)   /*!< DIS (Bitfield-Mask: 0x07)                             */\n#define RUSB2_PHYTRIM2_PDR_Pos          (8UL)        /*!< PDR (Bit 8)                                           */\n#define RUSB2_PHYTRIM2_PDR_Msk          (0x300UL)    /*!< PDR (Bitfield-Mask: 0x03)                             */\n#define RUSB2_PHYTRIM2_HSRXENMO_Pos     (7UL)        /*!< HSRXENMO (Bit 7)                                      */\n#define RUSB2_PHYTRIM2_HSRXENMO_Msk     (0x80UL)     /*!< HSRXENMO (Bitfield-Mask: 0x01)                        */\n#define RUSB2_PHYTRIM2_SQU_Pos          (0UL)        /*!< SQU (Bit 0)                                           */\n#define RUSB2_PHYTRIM2_SQU_Msk          (0xfUL)      /*!< SQU (Bitfield-Mask: 0x0f)                             */\n\n// DPUSR0R\n#define RUSB2_DPUSR0R_DVBSTSHM_Pos      (23UL)       /* DVBSTSHM (Bit 23) */\n#define RUSB2_DPUSR0R_DVBSTSHM_Msk      (0x800000UL) /* DVBSTSHM (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_DOVCBHM_Pos       (21UL)       /* DOVCBHM (Bit 21) */\n#define RUSB2_DPUSR0R_DOVCBHM_Msk       (0x200000UL) /* DOVCBHM (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_DOVCAHM_Pos       (20UL)       /* DOVCAHM (Bit 20) */\n#define RUSB2_DPUSR0R_DOVCAHM_Msk       (0x100000UL) /* DOVCAHM (Bitfield-Mask: 0x01) */\n\n// DPUSR1R\n#define RUSB2_DPUSR1R_DVBSTSH_Pos       (23UL)       /* DVBSTSH (Bit 23) */\n#define RUSB2_DPUSR1R_DVBSTSH_Msk       (0x800000UL) /* DVBSTSH (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_DOVCBH_Pos        (21UL)       /* DOVCBH (Bit 21) */\n#define RUSB2_DPUSR1R_DOVCBH_Msk        (0x200000UL) /* DOVCBH (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_DOVCAH_Pos        (20UL)       /* DOVCAH (Bit 20) */\n#define RUSB2_DPUSR1R_DOVCAH_Msk        (0x100000UL) /* DOVCAH (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_DVBSTSHE_Pos      (7UL)        /* DVBSTSHE (Bit 7) */\n#define RUSB2_DPUSR1R_DVBSTSHE_Msk      (0x80UL)     /* DVBSTSHE (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_DOVCBHE_Pos       (5UL)        /* DOVCBHE (Bit 5) */\n#define RUSB2_DPUSR1R_DOVCBHE_Msk       (0x20UL)     /* DOVCBHE (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_DOVCAHE_Pos       (4UL)        /* DOVCAHE (Bit 4) */\n#define RUSB2_DPUSR1R_DOVCAHE_Msk       (0x10UL)     /* DOVCAHE (Bitfield-Mask: 0x01) */\n\n// DPUSR2R\n#define RUSB2_DPUSR2R_DMINTE_Pos        (9UL)        /* DMINTE (Bit 9) */\n#define RUSB2_DPUSR2R_DMINTE_Msk        (0x200UL)    /* DMINTE (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR2R_DPINTE_Pos        (8UL)        /* DPINTE (Bit 8) */\n#define RUSB2_DPUSR2R_DPINTE_Msk        (0x100UL)    /* DPINTE (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR2R_DMVAL_Pos         (5UL)        /* DMVAL (Bit 5) */\n#define RUSB2_DPUSR2R_DMVAL_Msk         (0x20UL)     /* DMVAL (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR2R_DPVAL_Pos         (4UL)        /* DPVAL (Bit 4) */\n#define RUSB2_DPUSR2R_DPVAL_Msk         (0x10UL)     /* DPVAL (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR2R_DMINT_Pos         (1UL)        /* DMINT (Bit 1) */\n#define RUSB2_DPUSR2R_DMINT_Msk         (0x2UL)      /* DMINT (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR2R_DPINT_Pos         (0UL)        /* DPINT (Bit 0) */\n#define RUSB2_DPUSR2R_DPINT_Msk         (0x1UL)      /* DPINT (Bitfield-Mask: 0x01) */\n\n// DPUSRCR\n#define RUSB2_DPUSRCR_FIXPHYPD_Pos      (1UL)        /* FIXPHYPD (Bit 1) */\n#define RUSB2_DPUSRCR_FIXPHYPD_Msk      (0x2UL)      /* FIXPHYPD (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSRCR_FIXPHY_Pos        (0UL)        /* FIXPHY (Bit 0) */\n#define RUSB2_DPUSRCR_FIXPHY_Msk        (0x1UL)      /* FIXPHY (Bitfield-Mask: 0x01) */\n\n// DPUSR0R_FS\n#define RUSB2_DPUSR0R_FS_DVBSTS0_Pos    (23UL)       /* DVBSTS0 (Bit 23) */\n#define RUSB2_DPUSR0R_FS_DVBSTS0_Msk    (0x800000UL) /* DVBSTS0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_FS_DOVCB0_Pos     (21UL)       /* DOVCB0 (Bit 21) */\n#define RUSB2_DPUSR0R_FS_DOVCB0_Msk     (0x200000UL) /* DOVCB0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_FS_DOVCA0_Pos     (20UL)       /* DOVCA0 (Bit 20) */\n#define RUSB2_DPUSR0R_FS_DOVCA0_Msk     (0x100000UL) /* DOVCA0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_FS_DM0_Pos        (17UL)       /* DM0 (Bit 17) */\n#define RUSB2_DPUSR0R_FS_DM0_Msk        (0x20000UL)  /* DM0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_FS_DP0_Pos        (16UL)       /* DP0 (Bit 16) */\n#define RUSB2_DPUSR0R_FS_DP0_Msk        (0x10000UL)  /* DP0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_FS_FIXPHY0_Pos    (4UL)        /* FIXPHY0 (Bit 4) */\n#define RUSB2_DPUSR0R_FS_FIXPHY0_Msk    (0x10UL)     /* FIXPHY0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_FS_DRPD0_Pos      (3UL)        /* DRPD0 (Bit 3) */\n#define RUSB2_DPUSR0R_FS_DRPD0_Msk      (0x8UL)      /* DRPD0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_FS_RPUE0_Pos      (1UL)        /* RPUE0 (Bit 1) */\n#define RUSB2_DPUSR0R_FS_RPUE0_Msk      (0x2UL)      /* RPUE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR0R_FS_SRPC0_Pos      (0UL)        /* SRPC0 (Bit 0) */\n#define RUSB2_DPUSR0R_FS_SRPC0_Msk      (0x1UL)      /* SRPC0 (Bitfield-Mask: 0x01) */\n\n// DPUSR1R_FS\n#define RUSB2_DPUSR1R_FS_DVBINT0_Pos    (23UL)       /* DVBINT0 (Bit 23) */\n#define RUSB2_DPUSR1R_FS_DVBINT0_Msk    (0x800000UL) /* DVBINT0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DOVRCRB0_Pos   (21UL)       /* DOVRCRB0 (Bit 21) */\n#define RUSB2_DPUSR1R_FS_DOVRCRB0_Msk   (0x200000UL) /* DOVRCRB0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DOVRCRA0_Pos   (20UL)       /* DOVRCRA0 (Bit 20) */\n#define RUSB2_DPUSR1R_FS_DOVRCRA0_Msk   (0x100000UL) /* DOVRCRA0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DMINT0_Pos     (17UL)       /* DMINT0 (Bit 17) */\n#define RUSB2_DPUSR1R_FS_DMINT0_Msk     (0x20000UL)  /* DMINT0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DPINT0_Pos     (16UL)       /* DPINT0 (Bit 16) */\n#define RUSB2_DPUSR1R_FS_DPINT0_Msk     (0x10000UL)  /* DPINT0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DVBSE0_Pos     (7UL)        /* DVBSE0 (Bit 7) */\n#define RUSB2_DPUSR1R_FS_DVBSE0_Msk     (0x80UL)     /* DVBSE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DOVRCRBE0_Pos  (5UL)        /* DOVRCRBE0 (Bit 5) */\n#define RUSB2_DPUSR1R_FS_DOVRCRBE0_Msk  (0x20UL)     /* DOVRCRBE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DOVRCRAE0_Pos  (4UL)        /* DOVRCRAE0 (Bit 4) */\n#define RUSB2_DPUSR1R_FS_DOVRCRAE0_Msk  (0x10UL)     /* DOVRCRAE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DMINTE0_Pos    (1UL)        /* DMINTE0 (Bit 1) */\n#define RUSB2_DPUSR1R_FS_DMINTE0_Msk    (0x2UL)      /* DMINTE0 (Bitfield-Mask: 0x01) */\n#define RUSB2_DPUSR1R_FS_DPINTE0_Pos    (0UL)        /* DPINTE0 (Bit 0) */\n#define RUSB2_DPUSR1R_FS_DPINTE0_Msk    (0x1UL)      /* DPINTE0 (Bitfield-Mask: 0x01) */\n\n/*--------------------------------------------------------------------*/\n/* Register Bit Utils                                           */\n/*--------------------------------------------------------------------*/\n#define RUSB2_SYSSTS0_LNST_SE0          (0)\n#define RUSB2_SYSSTS0_LNST_FS_J         (1u << RUSB2_SYSSTS0_LNST_Pos)    /* Full-speed J state */\n#define RUSB2_SYSSTS0_LNST_FS_K         (2u << RUSB2_SYSSTS0_LNST_Pos)    /* Full-speed K state */\n#define RUSB2_SYSSTS0_LNST_LS_SE1       (3u << RUSB2_SYSSTS0_LNST_Pos)    /* Low-speed SE1 state */\n\n#define RUSB2_DVSTCTR0_RHST_LS          (1U << RUSB2_DVSTCTR0_RHST_Pos)   /*  Low-speed connection */\n#define RUSB2_DVSTCTR0_RHST_FS          (2U << RUSB2_DVSTCTR0_RHST_Pos)   /*  Full-speed connection */\n#define RUSB2_DVSTCTR0_RHST_HS          (3U << RUSB2_DVSTCTR0_RHST_Pos)   /*  Full-speed connection */\n\n#define RUSB2_PIPE_CTR_PID_NAK          (0U << RUSB2_PIPE_CTR_PID_Pos)    /* NAK response */\n#define RUSB2_PIPE_CTR_PID_BUF          (1U << RUSB2_PIPE_CTR_PID_Pos)    /* BUF response (depends buffer state) */\n#define RUSB2_PIPE_CTR_PID_STALL        (2U << RUSB2_PIPE_CTR_PID_Pos)    /* STALL response */\n#define RUSB2_PIPE_CTR_PID_STALL2       (3U << RUSB2_PIPE_CTR_PID_Pos)    /* Also STALL response */\n\n#define RUSB2_DEVADD_USBSPD_LS          (1U << RUSB2_DEVADD_USBSPD_Pos)   /* Target Device Low-speed */\n#define RUSB2_DEVADD_USBSPD_FS          (2U << RUSB2_DEVADD_USBSPD_Pos)   /* Target Device Full-speed */\n\n#define RUSB2_CFIFOSEL_ISEL_WRITE       (1U << RUSB2_CFIFOSEL_ISEL_Pos)   /* FIFO write AKA TX*/\n\n#define RUSB2_FIFOSEL_BIGEND            (1U << RUSB2_CFIFOSEL_BIGEND_Pos) /* FIFO Big Endian */\n#define RUSB2_FIFOSEL_MBW_8BIT          (0U << RUSB2_CFIFOSEL_MBW_Pos)    /* 8-bit width */\n#define RUSB2_FIFOSEL_MBW_16BIT         (1U << RUSB2_CFIFOSEL_MBW_Pos)    /* 16-bit width */\n#define RUSB2_FIFOSEL_MBW_32BIT         (2U << RUSB2_CFIFOSEL_MBW_Pos)    /* 32-bit width */\n\n#define RUSB2_INTSTS0_CTSQ_CTRL_RDATA   (1U << RUSB2_INTSTS0_CTSQ_Pos)\n\n#define RUSB2_INTSTS0_DVSQ_STATE_DEF    (1U << RUSB2_INTSTS0_DVSQ_Pos)    /* Default state */\n#define RUSB2_INTSTS0_DVSQ_STATE_ADDR   (2U << RUSB2_INTSTS0_DVSQ_Pos)    /* Address state */\n#define RUSB2_INTSTS0_DVSQ_STATE_SUSP0  (4U << RUSB2_INTSTS0_DVSQ_Pos)    /* Suspend state */\n#define RUSB2_INTSTS0_DVSQ_STATE_SUSP1  (5U << RUSB2_INTSTS0_DVSQ_Pos)    /* Suspend state */\n#define RUSB2_INTSTS0_DVSQ_STATE_SUSP2  (6U << RUSB2_INTSTS0_DVSQ_Pos)    /* Suspend state */\n#define RUSB2_INTSTS0_DVSQ_STATE_SUSP3  (7U << RUSB2_INTSTS0_DVSQ_Pos)    /* Suspend state */\n\n#define RUSB2_PIPECFG_TYPE_BULK         (1U << RUSB2_PIPECFG_TYPE_Pos)\n#define RUSB2_PIPECFG_TYPE_INT          (2U << RUSB2_PIPECFG_TYPE_Pos)\n#define RUSB2_PIPECFG_TYPE_ISO          (3U << RUSB2_PIPECFG_TYPE_Pos)\n\n//--------------------------------------------------------------------+\n// Static Assert\n//--------------------------------------------------------------------+\n\nTU_VERIFY_STATIC(sizeof(RUSB2_PIPE_TR_t) == 4, \"incorrect size\");\nTU_VERIFY_STATIC(sizeof(rusb2_reg_t) == 1032, \"incorrect size\");\n\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, SYSCFG     ) == 0x0000, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, BUSWAIT    ) == 0x0002, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, SYSSTS0    ) == 0x0004, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PLLSTA     ) == 0x0006, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DVSTCTR0   ) == 0x0008, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, TESTMODE   ) == 0x000C, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, CFIFO      ) == 0x0014, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, D0FIFO     ) == 0x0018, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, D1FIFO     ) == 0x001C, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, CFIFOSEL   ) == 0x0020, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, CFIFOCTR   ) == 0x0022, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, D0FIFOSEL  ) == 0x0028, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, D0FIFOCTR  ) == 0x002A, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, D1FIFOSEL  ) == 0x002C, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, D1FIFOCTR  ) == 0x002E, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, INTENB0    ) == 0x0030, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, INTENB1    ) == 0x0032, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, BRDYENB    ) == 0x0036, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, NRDYENB    ) == 0x0038, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, BEMPENB    ) == 0x003A, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, SOFCFG     ) == 0x003C, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PHYSET     ) == 0x003E, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, INTSTS0    ) == 0x0040, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, INTSTS1    ) == 0x0042, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, BRDYSTS    ) == 0x0046, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, NRDYSTS    ) == 0x0048, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, BEMPSTS    ) == 0x004A, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, FRMNUM     ) == 0x004C, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, UFRMNUM    ) == 0x004E, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, USBADDR    ) == 0x0050, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, USBREQ     ) == 0x0054, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, USBVAL     ) == 0x0056, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, USBINDX    ) == 0x0058, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, USBLENG    ) == 0x005A, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DCPCFG     ) == 0x005C, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DCPMAXP    ) == 0x005E, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DCPCTR     ) == 0x0060, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PIPESEL    ) == 0x0064, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PIPECFG    ) == 0x0068, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PIPEBUF    ) == 0x006A, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PIPEMAXP   ) == 0x006C, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PIPEPERI   ) == 0x006E, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PIPE_CTR   ) == 0x0070, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PIPE_TR    ) == 0x0090, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, USBBCCTRL0 ) == 0x00B0, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, UCKSEL     ) == 0x00C4, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, USBMC      ) == 0x00CC, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DEVADD     ) == 0x00D0, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PHYSLEW    ) == 0x00F0, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, LPCTRL     ) == 0x0100, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, LPSTS      ) == 0x0102, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, BCCTRL     ) == 0x0140, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PL1CTRL1   ) == 0x0144, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PL1CTRL2   ) == 0x0146, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, HL1CTRL1   ) == 0x0148, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, HL1CTRL2   ) == 0x014A, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PHYTRIM1   ) == 0x0150, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, PHYTRIM2   ) == 0x0152, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DPUSR0R    ) == 0x0160, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DPUSR1R    ) == 0x0164, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DPUSR2R    ) == 0x0168, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DPUSRCR    ) == 0x016A, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DPUSR0R_FS ) == 0x0400, \"incorrect offset\");\nTU_VERIFY_STATIC(offsetof(rusb2_reg_t, DPUSR1R_FS ) == 0x0404, \"incorrect offset\");\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_RUSB2_TYPE_H_ */\n"
  },
  {
    "path": "src/portable/sony/cxd56/dcd_cxd56.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright 2019 Sony Semiconductor Solutions Corporation\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_CXD56\n\n#include <errno.h>\n#include <nuttx/usb/usbdev.h>\n#include <nuttx/arch.h>\n\n#include \"device/dcd.h\"\n#include \"device/usbd_pvt.h\"\n\n#define CXD56_EPNUM (7)\n#define CXD56_SETUP_QUEUE_DEPTH (4)\n#define CXD56_MAX_DATA_OUT_SIZE (64)\n\nOSAL_QUEUE_DEF(usbd_int_set, _setup_queue_def, CXD56_SETUP_QUEUE_DEPTH, struct usb_ctrlreq_s);\n\nstruct usbdcd_driver_s\n{\n  struct usbdevclass_driver_s usbdevclass_driver;\n  FAR struct usbdev_ep_s *ep[CXD56_EPNUM];\n  FAR struct usbdev_req_s *req[CXD56_EPNUM];\n  osal_queue_t setup_queue;\n  bool setup_processed;\n  FAR uint8_t dataout[CXD56_MAX_DATA_OUT_SIZE];\n  size_t outlen;\n};\n\nstatic struct usbdcd_driver_s usbdcd_driver;\nstatic struct usbdev_s *usbdev;\n\nstatic int  _dcd_bind       (FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev);\nstatic void _dcd_unbind     (FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev);\nstatic int  _dcd_setup      (FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev,\n                             FAR const struct usb_ctrlreq_s *ctrl, FAR uint8_t *dataout, size_t outlen);\nstatic void _dcd_disconnect (FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev);\nstatic void _dcd_suspend    (FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev);\nstatic void _dcd_resume     (FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev);\n\nstatic const struct usbdevclass_driverops_s g_driverops =\n{\n  _dcd_bind,       /* bind */\n  _dcd_unbind,     /* unbind */\n  _dcd_setup,      /* setup */\n  _dcd_disconnect, /* disconnect */\n  _dcd_suspend,    /* suspend */\n  _dcd_resume,     /* resume */\n};\n\nstatic void usbdcd_ep0incomplete(FAR struct usbdev_ep_s *ep, FAR struct usbdev_req_s *req)\n{\n  (void) ep;\n\n  uint8_t ep_addr = (uint32_t)req->priv;\n\n  if (req->result || req->xfrd != req->len)\n  {\n    if (req->len)\n    {\n      dcd_event_xfer_complete(0, ep_addr, req->xfrd, XFER_RESULT_SUCCESS, true);\n    }\n  }\n  else\n  {\n    if (req->xfrd)\n    {\n      dcd_event_xfer_complete(0, ep_addr, req->xfrd, XFER_RESULT_SUCCESS, true);\n    }\n  }\n}\n\nstatic int _dcd_bind(FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev)\n{\n  (void) driver;\n\n  usbdev = dev;\n  usbdcd_driver.ep[0] = dev->ep0;\n\n  #ifdef EP_ALLOCREQ\n  // SDK v2\n  usbdcd_driver.req[0] = EP_ALLOCREQ(usbdcd_driver.ep[0]);\n  if (usbdcd_driver.req[0] != NULL) {\n    usbdcd_driver.req[0]->len = 64;\n    usbdcd_driver.req[0]->buf = EP_ALLOCBUFFER(usbdcd_driver.ep[0], 64);\n    if (!usbdcd_driver.req[0]->buf) {\n      EP_FREEREQ(usbdcd_driver.ep[0], usbdcd_driver.req[0]);\n      usbdcd_driver.req[0] = NULL;\n      return ENOMEM;\n    }\n  }\n  #else\n  // SDK v3\n  usbdcd_driver.req[0] = usbdev_allocreq(usbdcd_driver.ep[0], 64);\n  if (usbdcd_driver.req[0] == NULL) {\n    return ENOMEM;\n  }\n  #endif\n\n  usbdcd_driver.req[0]->callback = usbdcd_ep0incomplete;\n\n  DEV_CONNECT(dev);\n  return 0;\n}\n\nstatic void _dcd_unbind(FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev)\n{\n  (void) driver;\n  (void) dev;\n}\n\nstatic int _dcd_setup(FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev,\n                      FAR const struct usb_ctrlreq_s *ctrl, FAR uint8_t *dataout, size_t outlen)\n{\n  (void) driver;\n  (void) dev;\n\n  if (usbdcd_driver.setup_processed)\n  {\n    usbdcd_driver.setup_processed = false;\n    dcd_event_setup_received(0, (uint8_t const *) ctrl, true);\n  }\n  else\n  {\n    osal_queue_send(usbdcd_driver.setup_queue, ctrl, true);\n  }\n\n  if (outlen > 0 && outlen <= CXD56_MAX_DATA_OUT_SIZE)\n  {\n    memcpy(usbdcd_driver.dataout, dataout, outlen);\n    usbdcd_driver.outlen = outlen;\n  }\n\n  return 0;\n}\n\nstatic void _dcd_disconnect(FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev)\n{\n  (void) driver;\n\n  tusb_speed_t speed;\n\n  switch (dev->speed)\n  {\n    case USB_SPEED_LOW:\n      speed = TUSB_SPEED_LOW;\n      break;\n    case USB_SPEED_FULL:\n      speed = TUSB_SPEED_FULL;\n      break;\n    case USB_SPEED_HIGH:\n      speed = TUSB_SPEED_HIGH;\n      break;\n    default:\n      speed = TUSB_SPEED_HIGH;\n      break;\n  }\n\n  dcd_event_bus_reset(0, speed, true);\n  DEV_CONNECT(dev);\n}\n\nstatic void _dcd_suspend(FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev)\n{\n  (void) driver;\n  (void) dev;\n\n  dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n}\n\nstatic void _dcd_resume(FAR struct usbdevclass_driver_s *driver, FAR struct usbdev_s *dev)\n{\n  (void) driver;\n  (void) dev;\n\n  dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n}\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  usbdcd_driver.usbdevclass_driver.speed = USB_SPEED_HIGH;\n  usbdcd_driver.usbdevclass_driver.ops = &g_driverops;\n  usbdcd_driver.setup_processed = true;\n  usbdcd_driver.setup_queue = osal_queue_create(&_setup_queue_def);\n\n  usbdev_register(&usbdcd_driver.usbdevclass_driver);\n\n  return true;\n}\n\n// Enable device interrupt\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n\n  up_enable_irq(CXD56_IRQ_USB_INT);\n}\n\n// Disable device interrupt\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n\n  up_disable_irq(CXD56_IRQ_USB_INT);\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void) rhport;\n  (void) dev_addr;\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n\n  DEV_WAKEUP(usbdev);\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n  DEV_CONNECT(usbdev);\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  DEV_DISCONNECT(usbdev);\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *p_endpoint_desc)\n{\n  (void) rhport;\n\n  uint8_t epnum = tu_edpt_number(p_endpoint_desc->bEndpointAddress);\n  uint8_t const dir = tu_edpt_dir(p_endpoint_desc->bEndpointAddress);\n  uint8_t xfrtype = 0;\n  uint16_t const ep_mps = tu_edpt_packet_size(p_endpoint_desc);\n\n  struct usb_epdesc_s epdesc;\n\n  if (epnum >= CXD56_EPNUM)\n  {\n    return false;\n  }\n\n  switch (p_endpoint_desc->bmAttributes.xfer)\n  {\n  case 1:\n    xfrtype = USB_EP_ATTR_XFER_ISOC;\n    break;\n  case 2:\n    xfrtype = USB_EP_ATTR_XFER_BULK;\n    break;\n  case 3:\n    xfrtype = USB_EP_ATTR_XFER_INT;\n    break;\n  }\n\n  usbdcd_driver.ep[epnum] = DEV_ALLOCEP(usbdev, epnum, dir == TUSB_DIR_IN, xfrtype);\n  if (usbdcd_driver.ep[epnum] == NULL)\n  {\n    return false;\n  }\n\n  usbdcd_driver.req[epnum] = NULL;\n\n  #ifdef EP_ALLOCREQ\n  // sdk v2\n  usbdcd_driver.req[epnum] = EP_ALLOCREQ(usbdcd_driver.ep[epnum]);\n  if (usbdcd_driver.req[epnum] != NULL) {\n    usbdcd_driver.req[epnum]->len = ep_mps;\n  }\n  #else\n  // sdk v3\n  usbdcd_driver.req[epnum] = usbdev_allocreq(usbdcd_driver.ep[epnum], ep_mps);\n  #endif\n\n  if(usbdcd_driver.req[epnum] == NULL) {\n    return false;\n  }\n\n  usbdcd_driver.req[epnum]->callback = usbdcd_ep0incomplete;\n\n  epdesc.len = p_endpoint_desc->bLength;\n  epdesc.type = p_endpoint_desc->bDescriptorType;\n  epdesc.addr = p_endpoint_desc->bEndpointAddress;\n  epdesc.attr = xfrtype;\n  epdesc.mxpacketsize[0] = LSBYTE(ep_mps);\n  epdesc.mxpacketsize[1] = MSBYTE(ep_mps);\n  epdesc.interval = p_endpoint_desc->bInterval;\n\n  if (EP_CONFIGURE(usbdcd_driver.ep[epnum], &epdesc, false) < 0)\n  {\n    return false;\n  }\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void) largest_packet_size;\n  return false; // TODO not implemented yet\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep) {\n  (void) rhport;\n  (void) desc_ep;\n  return false; // TODO not implemented yet\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  bool ret = true;\n  uint8_t epnum = tu_edpt_number(ep_addr);\n\n  if (epnum >= CXD56_EPNUM)\n  {\n    return false;\n  }\n\n  if (epnum == 0)\n  {\n    if (total_bytes == 0)\n    {\n      usbdcd_driver.setup_processed = true;\n      dcd_event_xfer_complete(0, ep_addr, 0, XFER_RESULT_SUCCESS, false);\n    }\n    else if (ep_addr == 0x00 && total_bytes == usbdcd_driver.outlen)\n    {\n      memcpy(buffer, usbdcd_driver.dataout, usbdcd_driver.outlen);\n      dcd_event_xfer_complete(0, ep_addr, total_bytes, XFER_RESULT_SUCCESS, false);\n      usbdcd_driver.outlen = 0;\n    }\n    else\n    {\n      usbdcd_driver.req[epnum]->len = total_bytes;\n      usbdcd_driver.req[epnum]->priv = (void *)((uint32_t)ep_addr);\n      usbdcd_driver.req[epnum]->flags = total_bytes < usbdcd_driver.ep[epnum]->maxpacket ? USBDEV_REQFLAGS_NULLPKT : 0;\n      usbdcd_driver.req[epnum]->buf = buffer;\n\n      if (EP_SUBMIT(usbdcd_driver.ep[epnum], usbdcd_driver.req[epnum]) < 0)\n      {\n        ret = false;\n      }\n    }\n\n    struct usb_ctrlreq_s ctrl;\n\n    if (usbdcd_driver.setup_processed)\n    {\n      if (osal_queue_receive(usbdcd_driver.setup_queue, &ctrl, 100))\n      {\n        usbdcd_driver.setup_processed = false;\n        dcd_event_setup_received(0, (uint8_t *)&ctrl, false);\n      }\n    }\n  }\n  else\n  {\n    usbdcd_driver.req[epnum]->len = total_bytes;\n    usbdcd_driver.req[epnum]->priv = (void *)((uint32_t)ep_addr);\n    usbdcd_driver.req[epnum]->flags = total_bytes < usbdcd_driver.ep[epnum]->maxpacket ? USBDEV_REQFLAGS_NULLPKT : 0;\n    usbdcd_driver.req[epnum]->buf = buffer;\n\n    if (EP_SUBMIT(usbdcd_driver.ep[epnum], usbdcd_driver.req[epnum]) < 0)\n    {\n      ret = false;\n    }\n  }\n\n  return ret;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t epnum = tu_edpt_number(ep_addr);\n\n  if (epnum >= CXD56_EPNUM)\n  {\n    return;\n  }\n\n  EP_STALL(usbdcd_driver.ep[epnum]);\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t epnum = tu_edpt_number(ep_addr);\n\n  if (epnum >= CXD56_EPNUM)\n  {\n    return;\n  }\n\n  EP_RESUME(usbdcd_driver.ep[epnum]);\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Nathan Conrad\n *\n * Portions:\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2022 Simon Küppers (skuep)\n * Copyright (c) 2022 HiFiPhile\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/**********************************************\n * This driver has been tested with the following MCUs:\n *  - F070, F072, L053, F042F6\n *\n * It also should work with minimal changes for any ST MCU with an \"USB A\"/\"PCD\"/\"HCD\" peripheral. This\n *  covers:\n *\n * F04x, F072, F078, F070x6/B     1024 byte buffer\n * F102, F103                      512 byte buffer; no internal D+ pull-up (maybe many more changes?)\n * F302xB/C, F303xB/C, F373        512 byte buffer; no internal D+ pull-up\n * F302x6/8, F302xD/E2, F303xD/E  1024 byte buffer; no internal D+ pull-up\n * C0                             2048 byte buffer; 32-bit bus; host mode\n * G0                             2048 byte buffer; 32-bit bus; host mode\n * G4                             1024 byte buffer\n * H5                             2048 byte buffer; 32-bit bus; host mode\n * L0x2, L0x3                     1024 byte buffer\n * L1                              512 byte buffer\n * L4x2, L4x3                     1024 byte buffer\n * L5                             1024 byte buffer\n * U0                             1024 byte buffer; 32-bit bus\n * U535, U545                     2048 byte buffer; 32-bit bus; host mode\n * WB35, WB55                     1024 byte buffer\n *\n * To use this driver, you must:\n * - If you are using a device with crystal-less USB, set up the clock recovery system (CRS)\n * - Remap pins to be D+/D- on devices that they are shared (for example: F042Fx)\n *   - This is different to the normal \"alternate function\" GPIO interface, needs to go through SYSCFG->CFGRx register\n * - Enable USB clock; Perhaps use __HAL_RCC_USB_CLK_ENABLE();\n * - (Optionally configure GPIO HAL to tell it the USB driver is using the USB pins)\n * - call tusb_init();\n *\n * Assumptions of the driver:\n * - You are not using CAN (it must share the packet buffer)\n * - APB clock is >= 10 MHz\n * - On some boards, series resistors are required, but not on others.\n * - On some boards, D+ pull up resistor (1.5kohm) is required, but not on others.\n * - You don't have long-running interrupts; some USB packets must be quickly responded to.\n * - You have the ST CMSIS library linked into the project. HAL is not used.\n *\n * Current driver limitations (i.e., a list of features for you to add):\n * - STALL handled, but not tested.\n *   - Does it work? No clue.\n * - All EP BTABLE buffers are created based on max packet size of first EP opened with that address.\n * - Packet buffer memory is copied in the interrupt.\n *   - This is better for performance, but means interrupts are disabled for longer\n *   - DMA may be the best choice, but it could also be pushed to the USBD task.\n * - No double-buffering\n * - No DMA\n * - Minimal error handling\n *   - Perhaps error interrupts should be reported to the stack, or cause a device reset?\n * - Assumes a single USB peripheral; I think that no hardware has multiple so this is fine.\n * - Add a callback for enabling/disabling the D+ PU on devices without an internal PU.\n * - F3 models use three separate interrupts. I think we could only use the LP interrupt for\n *     everything?  However, the interrupts are configurable so the DisableInt and EnableInt\n *     below functions could be adjusting the wrong interrupts (if they had been reconfigured)\n * - LPM is not used correctly, or at all?\n *\n * Notes:\n * - The buffer table is allocated as endpoints are opened. The allocation is only\n *   cleared when the device is reset. This may be bad if the USB device needs\n *   to be reconfigured.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_FSDEV) && !(defined(TUP_USBIP_FSDEV_CH32) && CFG_TUD_WCH_USBIP_FSDEV == 0)\n\n  #include \"device/dcd.h\"\n  #include \"fsdev_common.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n// One of these for every EP IN & OUT, uses a bit of RAM....\ntypedef struct {\n  uint8_t   *buffer;\n  tu_fifo_t *ff;\n  uint16_t   total_len;\n  uint16_t   queued_len;\n  uint16_t   max_packet_size;\n  uint8_t    ep_idx;         // index for USB_EPnR register\n  bool       iso_in_sending; // Workaround for ISO IN EP doesn't have interrupt mask\n} xfer_ctl_t;\n\n// EP allocator\ntypedef struct {\n  uint8_t ep_num;\n  uint8_t ep_type;\n  bool    allocated[2];\n} ep_alloc_t;\n\nstatic xfer_ctl_t xfer_status[CFG_TUD_ENDPPOINT_MAX][2];\nstatic ep_alloc_t ep_alloc_status[FSDEV_EP_COUNT];\nstatic uint8_t    remoteWakeCountdown; // When wake is requested\n\n//--------------------------------------------------------------------+\n// Prototypes\n//--------------------------------------------------------------------+\n\n// into the stack.\nstatic void handle_bus_reset(uint8_t rhport);\nstatic void dcd_transmit_packet(xfer_ctl_t *xfer, uint16_t ep_ix);\nstatic bool edpt_xfer(uint8_t rhport, uint8_t ep_num, tusb_dir_t dir);\n\n// PMA allocation/access\nstatic uint16_t ep_buf_ptr; ///< Points to first free memory location\nstatic uint32_t dcd_pma_alloc(uint16_t len, bool dbuf);\nstatic uint8_t  dcd_ep_alloc(uint8_t ep_addr, uint8_t ep_type);\n\nstatic void edpt0_open(uint8_t rhport);\n\nTU_ATTR_ALWAYS_INLINE static inline void edpt0_prepare_setup(void) {\n  btable_set_rx_bufsize(0, BTABLE_BUF_RX, 8);\n}\n\n//--------------------------------------------------------------------+\n// Inline helper\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline xfer_ctl_t *xfer_ctl_ptr(uint8_t epnum, uint8_t dir) {\n  return &xfer_status[epnum][dir];\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init) {\n  (void)rh_init;\n\n  fsdev_core_reset();\n\n  FSDEV_REG->CNTR = 0; // Enable USB\n\n  #if !defined( CFG_TUSB_FSDEV_32BIT)\n  // BTABLE register does not exist any more on 32-bit bus devices\n  FSDEV_REG->BTABLE = FSDEV_BTABLE_BASE;\n  #endif\n\n  // Enable interrupts for device mode\n  FSDEV_REG->CNTR |=\n    U_CNTR_RESETM | U_CNTR_ESOFM | U_CNTR_CTRM | U_CNTR_SUSPM | U_CNTR_WKUPM | U_CNTR_PMAOVRM;\n\n  handle_bus_reset(rhport);\n\n  // Enable pull-up if supported\n  dcd_connect(rhport);\n\n  return true;\n}\n\nbool dcd_deinit(uint8_t rhport) {\n  (void)rhport;\n\n  fsdev_deinit();\n\n  return true;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void)rhport;\n\n  if (en) {\n    FSDEV_REG->CNTR |= U_CNTR_SOFM;\n  } else {\n    FSDEV_REG->CNTR &= ~U_CNTR_SOFM;\n  }\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  (void)dev_addr;\n\n  // Respond with status\n  dcd_edpt_xfer(rhport, TUSB_DIR_IN_MASK | 0x00, NULL, 0, false);\n\n  // DCD can only set address after status for this request is complete.\n  // do it at dcd_edpt0_status_complete()\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  (void)rhport;\n\n  FSDEV_REG->CNTR |= U_CNTR_RESUME;\n  remoteWakeCountdown = 4u; // required to be 1 to 15 ms, ESOF should trigger every 1ms.\n}\n\nstatic void handle_bus_reset(uint8_t rhport) {\n  FSDEV_REG->DADDR = 0u; // disable USB Function\n\n  for (uint32_t i = 0; i < FSDEV_EP_COUNT; i++) {\n    // Clear EP allocation status\n    ep_alloc_status[i].ep_num       = 0xFF;\n    ep_alloc_status[i].ep_type      = 0xFF;\n    ep_alloc_status[i].allocated[0] = false;\n    ep_alloc_status[i].allocated[1] = false;\n  }\n\n  // Reset PMA allocation\n  ep_buf_ptr = FSDEV_BTABLE_BASE + 8 * FSDEV_EP_COUNT;\n\n  edpt0_open(rhport);              // open control endpoint (both IN & OUT)\n\n  FSDEV_REG->DADDR = U_DADDR_EF; // Enable USB Function\n}\n\n// Handle CTR interrupt for the TX/IN direction\nstatic void handle_ctr_tx(uint32_t ep_id) {\n  uint32_t ep_reg = ep_read(ep_id) | U_EP_CTR_TX | U_EP_CTR_RX;\n\n  const uint8_t ep_num = ep_reg & U_EPADDR_FIELD;\n  xfer_ctl_t   *xfer   = xfer_ctl_ptr(ep_num, TUSB_DIR_IN);\n\n  if (ep_is_iso(ep_reg)) {\n    // Ignore spurious interrupts that we don't schedule\n    // host can send IN token while there is no data to send, since ISO does not have NAK\n    // this will result to zero length packet --> trigger interrupt (which cannot be masked)\n    if (!xfer->iso_in_sending) {\n      return;\n    }\n    xfer->iso_in_sending = false;\n  #if FSDEV_USE_SBUF_ISO == 0\n    uint8_t buf_id = (ep_reg & U_EP_DTOG_TX) ? 0 : 1;\n  #else\n    uint8_t buf_id = BTABLE_BUF_TX;\n  #endif\n    btable_set_count(ep_id, buf_id, 0);\n  }\n\n  if (xfer->total_len != xfer->queued_len) {\n    dcd_transmit_packet(xfer, ep_id);\n  } else {\n    dcd_event_xfer_complete(0, ep_num | TUSB_DIR_IN_MASK, xfer->queued_len, XFER_RESULT_SUCCESS, true);\n  }\n}\n\nstatic void handle_ctr_setup(uint32_t ep_id) {\n  uint16_t rx_count = btable_get_count(ep_id, BTABLE_BUF_RX);\n  uint16_t rx_addr  = btable_get_addr(ep_id, BTABLE_BUF_RX);\n  uint8_t  setup_packet[8] TU_ATTR_ALIGNED(4);\n\n  tu_hwfifo_read(PMA_BUF_AT(rx_addr), setup_packet, rx_count, NULL);\n\n  // Clear CTR RX if another setup packet arrived before this, it will be discarded\n  ep_write_clear_ctr(ep_id, TUSB_DIR_OUT);\n\n  // Setup packet should always be 8 bytes. If not, we probably missed the packet\n  if (rx_count == 8) {\n    dcd_event_setup_received(0, (uint8_t *)setup_packet, true);\n    // Hardware should reset EP0 RX/TX to NAK and both toggle to 1\n  } else {\n    // Missed setup packet !!!\n    TU_BREAKPOINT();\n    edpt0_prepare_setup();\n  }\n}\n\n// Handle CTR interrupt for the RX/OUT direction\nstatic void handle_ctr_rx(uint32_t ep_id) {\n  uint32_t      ep_reg = ep_read(ep_id) | U_EP_CTR_TX | U_EP_CTR_RX;\n  const uint8_t ep_num = ep_reg & U_EPADDR_FIELD;\n  const bool    is_iso = ep_is_iso(ep_reg);\n  xfer_ctl_t   *xfer   = xfer_ctl_ptr(ep_num, TUSB_DIR_OUT);\n\n  uint8_t buf_id;\n  #if FSDEV_USE_SBUF_ISO == 0\n  bool const dbl_buf = is_iso;\n  #else\n  bool const dbl_buf = false;\n  #endif\n  if (dbl_buf) {\n    buf_id = (ep_reg & U_EP_DTOG_RX) ? 0 : 1;\n  } else {\n    buf_id = BTABLE_BUF_RX;\n  }\n  const uint16_t   rx_count = btable_get_count(ep_id, buf_id);\n  uint16_t         pma_addr = (uint16_t)btable_get_addr(ep_id, buf_id);\n  fsdev_pma_buf_t *pma_buf  = PMA_BUF_AT(pma_addr);\n\n  if (xfer->ff) {\n    tu_hwfifo_read_to_fifo(pma_buf, xfer->ff, rx_count, NULL);\n  } else {\n    tu_hwfifo_read(pma_buf, xfer->buffer + xfer->queued_len, rx_count, NULL);\n  }\n  xfer->queued_len += rx_count;\n\n  if ((rx_count < xfer->max_packet_size) || (xfer->queued_len >= xfer->total_len)) {\n    // all bytes received or short packet\n\n    // For ch32v203: reset rx bufsize to mps to prevent race condition to cause PMAOVR (occurs with msc write10)\n    btable_set_rx_bufsize(ep_id, BTABLE_BUF_RX, xfer->max_packet_size);\n\n    dcd_event_xfer_complete(0, ep_num, xfer->queued_len, XFER_RESULT_SUCCESS, true);\n\n    // ch32 seems to unconditionally accept ZLP on EP0 OUT, which can incorrectly use queued_len of previous\n    // transfer. So reset total_len and queued_len to 0.\n    xfer->total_len = xfer->queued_len = 0;\n  } else {\n    // Set endpoint active again for receiving more data. Note that isochronous endpoints stay active always\n    if (!is_iso) {\n      const uint16_t cnt = tu_min16(xfer->total_len - xfer->queued_len, xfer->max_packet_size);\n      btable_set_rx_bufsize(ep_id, BTABLE_BUF_RX, cnt);\n    }\n    ep_reg &= U_EPREG_MASK | EP_STAT_MASK(TUSB_DIR_OUT); // will change RX Status, reserved other toggle bits\n    ep_change_status(&ep_reg, TUSB_DIR_OUT, EP_STAT_VALID);\n    ep_write(ep_id, ep_reg, false);\n  }\n}\n\nvoid dcd_int_handler(uint8_t rhport) {\n  uint32_t int_status = FSDEV_REG->ISTR;\n\n  /* Put SOF flag at the beginning of ISR in case to get least amount of jitter if it is used for timing purposes */\n  if (int_status & U_ISTR_SOF) {\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_SOF;\n    dcd_event_sof(0, FSDEV_REG->FNR & U_FNR_FN, true);\n  }\n\n  if (int_status & U_ISTR_RESET) {\n    // USBRST is start of reset.\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_RESET;\n    handle_bus_reset(rhport);\n    dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n    return; // Don't do the rest of the things here; perhaps they've been cleared?\n  }\n\n  if (int_status & U_ISTR_WKUP) {\n    FSDEV_REG->CNTR &= ~U_CNTR_LPMODE;\n    FSDEV_REG->CNTR &= ~U_CNTR_FSUSP;\n\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_WKUP;\n    dcd_event_bus_signal(0, DCD_EVENT_RESUME, true);\n  }\n\n  if (int_status & U_ISTR_SUSP) {\n    /* Suspend is asserted for both suspend and unplug events. without Vbus monitoring,\n     * these events cannot be differentiated, so we only trigger suspend. */\n\n    /* Force low-power mode in the macrocell */\n    FSDEV_REG->CNTR |= U_CNTR_FSUSP;\n    FSDEV_REG->CNTR |= U_CNTR_LPMODE;\n\n    /* clear of the ISTR bit must be done after setting of CNTR_FSUSP */\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_SUSP;\n    dcd_event_bus_signal(0, DCD_EVENT_SUSPEND, true);\n  }\n\n  if (int_status & U_ISTR_ESOF) {\n    if (remoteWakeCountdown == 1u) {\n      FSDEV_REG->CNTR &= ~U_CNTR_RESUME;\n    }\n    if (remoteWakeCountdown > 0u) {\n      remoteWakeCountdown--;\n    }\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_ESOF;\n  }\n\n  // loop to handle all pending CTR interrupts\n  while (FSDEV_REG->ISTR & U_ISTR_CTR) {\n    // skip DIR bit, and use CTR TX/RX instead, since there is chance we have both TX/RX completed in one interrupt\n    const uint32_t ep_id  = FSDEV_REG->ISTR & U_ISTR_EP_ID;\n    const uint32_t ep_reg = ep_read(ep_id);\n\n    if (ep_reg & U_EP_CTR_RX) {\n  #ifdef  CFG_TUSB_FSDEV_32BIT\n      /* https://www.st.com/resource/en/errata_sheet/es0561-stm32h503cbebkbrb-device-errata-stmicroelectronics.pdf\n       * https://www.st.com/resource/en/errata_sheet/es0587-stm32u535xx-and-stm32u545xx-device-errata-stmicroelectronics.pdf\n       * From H503/U535 errata: Buffer description table update completes after CTR interrupt triggers\n       * Description:\n       * - During OUT transfers, the correct transfer interrupt (CTR) is triggered a little before the last USB SRAM\n       * accesses have completed. If the software responds quickly to the interrupt, the full buffer contents may not be\n       * correct. Workaround:\n       * - Software should ensure that a small delay is included before accessing the SRAM contents. This delay\n       * should be 800 ns in Full Speed mode and 6.4 μs in Low Speed mode\n       * - Since H5 can run up to 250Mhz -> 1 cycle = 4ns. Per errata, we need to wait 200 cycles. Though executing code\n       * also takes time, so we'll wait 60 cycles (count = 20).\n       * - Since Low Speed mode is not supported/popular, we will ignore it for now.\n       *\n       * Note: this errata may also apply to G0, U5, H5 etc.\n       */\n      volatile uint32_t cycle_count = 20; // defined as PCD_RX_PMA_CNT in stm32 hal_driver\n      while (cycle_count > 0U) {\n        cycle_count--;                    // each count take 3 cycles (1 for sub, jump, and compare)\n      }\n  #endif\n\n      if (ep_reg & U_EP_SETUP) {\n        handle_ctr_setup(ep_id); // CTR will be clear after copied setup packet\n      } else {\n        ep_write_clear_ctr(ep_id, TUSB_DIR_OUT);\n        handle_ctr_rx(ep_id);\n      }\n    }\n\n    if (ep_reg & U_EP_CTR_TX) {\n      ep_write_clear_ctr(ep_id, TUSB_DIR_IN);\n      handle_ctr_tx(ep_id);\n    }\n  }\n\n  if (int_status & U_ISTR_PMAOVR) {\n    TU_BREAKPOINT();\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_PMAOVR;\n  }\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n// Invoked when a control transfer's status stage is complete.\n// May help DCD to prepare for next control transfer, this API is optional.\nvoid dcd_edpt0_status_complete(uint8_t rhport, const tusb_control_request_t *request) {\n  (void)rhport;\n\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD && request->bRequest == TUSB_REQ_SET_ADDRESS) {\n    const uint8_t dev_addr = (uint8_t)request->wValue;\n    FSDEV_REG->DADDR       = (U_DADDR_EF | dev_addr);\n  }\n\n  edpt0_prepare_setup();\n}\n\n/***\n * Allocate a section of PMA\n * In case of double buffering, high 16bit is the address of 2nd buffer\n * During failure, TU_ASSERT is used. If this happens, rework/reallocate memory manually.\n */\nstatic uint32_t dcd_pma_alloc(uint16_t len, bool dbuf) {\n  uint8_t  blsize, num_block;\n  uint16_t aligned_len = pma_align_buffer_size(len, &blsize, &num_block);\n  (void)blsize;\n  (void)num_block;\n\n  uint32_t addr = ep_buf_ptr;\n  ep_buf_ptr    = (uint16_t)(ep_buf_ptr + aligned_len); // increment buffer pointer\n\n  if (dbuf) {\n    addr |= ((uint32_t)ep_buf_ptr) << 16;\n    ep_buf_ptr = (uint16_t)(ep_buf_ptr + aligned_len); // increment buffer pointer\n  }\n\n  // Verify packet buffer is not overflowed\n  TU_ASSERT(ep_buf_ptr <= CFG_TUSB_FSDEV_PMA_SIZE, 0xFFFF);\n\n  return addr;\n}\n\n/***\n * Allocate hardware endpoint\n */\nstatic uint8_t dcd_ep_alloc(uint8_t ep_addr, uint8_t ep_type) {\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir   = tu_edpt_dir(ep_addr);\n\n  for (uint8_t i = 0; i < FSDEV_EP_COUNT; i++) {\n    // Check if already allocated\n    if (ep_alloc_status[i].allocated[dir] && ep_alloc_status[i].ep_type == ep_type &&\n        ep_alloc_status[i].ep_num == epnum) {\n      return i;\n    }\n\n  #if FSDEV_USE_SBUF_ISO == 0\n    bool const dbl_buf = ep_type == TUSB_XFER_ISOCHRONOUS;\n  #else\n    bool const dbl_buf = false;\n  #endif\n\n    // If EP of current direction is not allocated\n    // For double-buffered mode both directions needs to be free\n    if (!ep_alloc_status[i].allocated[dir] && (!dbl_buf || !ep_alloc_status[i].allocated[dir ^ 1])) {\n      // Check if EP number is the same\n      if (ep_alloc_status[i].ep_num == 0xFF || ep_alloc_status[i].ep_num == epnum) {\n        // One EP pair has to be the same type\n        if (ep_alloc_status[i].ep_type == 0xFF || ep_alloc_status[i].ep_type == ep_type) {\n          ep_alloc_status[i].ep_num         = epnum;\n          ep_alloc_status[i].ep_type        = ep_type;\n          ep_alloc_status[i].allocated[dir] = true;\n\n          return i;\n        }\n      }\n    }\n  }\n\n  // Allocation failed\n  TU_ASSERT(0);\n}\n\nvoid edpt0_open(uint8_t rhport) {\n  (void)rhport;\n\n  dcd_ep_alloc(0x0, TUSB_XFER_CONTROL);\n  dcd_ep_alloc(0x80, TUSB_XFER_CONTROL);\n\n  xfer_status[0][0].max_packet_size = CFG_TUD_ENDPOINT0_SIZE;\n  xfer_status[0][0].ep_idx          = 0;\n\n  xfer_status[0][1].max_packet_size = CFG_TUD_ENDPOINT0_SIZE;\n  xfer_status[0][1].ep_idx          = 0;\n\n  uint16_t pma_addr0 = dcd_pma_alloc(CFG_TUD_ENDPOINT0_SIZE, false);\n  uint16_t pma_addr1 = dcd_pma_alloc(CFG_TUD_ENDPOINT0_SIZE, false);\n\n  btable_set_addr(0, BTABLE_BUF_RX, pma_addr0);\n  btable_set_addr(0, BTABLE_BUF_TX, pma_addr1);\n\n  uint32_t ep_reg = ep_read(0) & ~U_EPREG_MASK; // only get toggle bits\n  ep_reg |= U_EP_CONTROL;\n  ep_change_status(&ep_reg, TUSB_DIR_IN, EP_STAT_NAK);\n  ep_change_status(&ep_reg, TUSB_DIR_OUT, EP_STAT_NAK);\n  // no need to explicitly set DTOG bits since we aren't masked DTOG bit\n\n  edpt0_prepare_setup(); // prepare for setup packet\n  ep_write(0, ep_reg, false);\n}\n\nbool dcd_edpt_open(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  const uint8_t    ep_addr     = desc_ep->bEndpointAddress;\n  const uint8_t    ep_num      = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir         = tu_edpt_dir(ep_addr);\n  const uint16_t   packet_size = tu_edpt_packet_size(desc_ep);\n  const uint8_t    ep_idx      = dcd_ep_alloc(ep_addr, desc_ep->bmAttributes.xfer);\n  TU_ASSERT(ep_idx < FSDEV_EP_COUNT);\n\n  uint32_t ep_reg = ep_read(ep_idx) & ~U_EPREG_MASK;\n  ep_reg |= tu_edpt_number(ep_addr) | U_EP_CTR_TX | U_EP_CTR_RX;\n\n  // Set type\n  switch (desc_ep->bmAttributes.xfer) {\n    case TUSB_XFER_BULK:\n      ep_reg |= U_EP_BULK;\n      break;\n    case TUSB_XFER_INTERRUPT:\n      ep_reg |= U_EP_INTERRUPT;\n      break;\n\n    default:\n      // Note: ISO endpoint should use alloc / active functions\n      TU_ASSERT(false);\n  }\n\n  /* Create a packet memory buffer area. */\n  uint16_t pma_addr = dcd_pma_alloc(packet_size, false);\n  btable_set_addr(ep_idx, dir == TUSB_DIR_IN ? BTABLE_BUF_TX : BTABLE_BUF_RX, pma_addr);\n\n  xfer_ctl_t *xfer      = xfer_ctl_ptr(ep_num, dir);\n  xfer->max_packet_size = packet_size;\n  xfer->ep_idx          = ep_idx;\n\n  ep_change_status(&ep_reg, dir, EP_STAT_NAK);\n  ep_change_dtog(&ep_reg, dir, 0);\n\n  // reserve other direction toggle bits\n  if (dir == TUSB_DIR_IN) {\n    ep_reg &= ~(U_EPRX_STAT | U_EP_DTOG_RX);\n  } else {\n    ep_reg &= ~(U_EPTX_STAT | U_EP_DTOG_TX);\n  }\n\n  ep_write(ep_idx, ep_reg, true);\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  dcd_int_disable(rhport);\n\n  for (uint32_t i = 1; i < FSDEV_EP_COUNT; i++) {\n    // Reset endpoint\n    ep_write(i, 0, false);\n    // Clear EP allocation status\n    ep_alloc_status[i].ep_num       = 0xFF;\n    ep_alloc_status[i].ep_type      = 0xFF;\n    ep_alloc_status[i].allocated[0] = false;\n    ep_alloc_status[i].allocated[1] = false;\n  }\n\n  dcd_int_enable(rhport);\n\n  // Reset PMA allocation\n  ep_buf_ptr = FSDEV_BTABLE_BASE + 8 * FSDEV_EP_COUNT + 2 * CFG_TUD_ENDPOINT0_SIZE;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t dir    = tu_edpt_dir(ep_addr);\n  const uint8_t ep_idx = dcd_ep_alloc(ep_addr, TUSB_XFER_ISOCHRONOUS);\n\n  #if CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP != 0\n  uint32_t pma_addr  = dcd_pma_alloc(largest_packet_size, true);\n  uint16_t pma_addr2 = pma_addr >> 16;\n  #else\n  uint32_t pma_addr  = dcd_pma_alloc(largest_packet_size, false);\n  uint16_t pma_addr2 = pma_addr;\n  #endif\n\n  #if FSDEV_USE_SBUF_ISO == 0\n  btable_set_addr(ep_idx, 0, pma_addr);\n  btable_set_addr(ep_idx, 1, pma_addr2);\n  #else\n  btable_set_addr(ep_idx, dir == TUSB_DIR_IN ? BTABLE_BUF_TX : BTABLE_BUF_RX, pma_addr);\n  (void)pma_addr2;\n  #endif\n\n  xfer_ctl_t *xfer = xfer_ctl_ptr(ep_num, dir);\n  xfer->ep_idx     = ep_idx;\n\n  return true;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  const uint8_t    ep_addr = desc_ep->bEndpointAddress;\n  const uint8_t    ep_num  = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir     = tu_edpt_dir(ep_addr);\n  xfer_ctl_t      *xfer    = xfer_ctl_ptr(ep_num, dir);\n\n  const uint8_t ep_idx = xfer->ep_idx;\n\n  xfer->max_packet_size = tu_edpt_packet_size(desc_ep);\n\n  uint32_t ep_reg = ep_read(ep_idx) & ~U_EPREG_MASK;\n  ep_reg |= tu_edpt_number(ep_addr) | U_EP_ISOCHRONOUS | U_EP_CTR_TX | U_EP_CTR_RX;\n  #if FSDEV_USE_SBUF_ISO != 0\n  ep_reg |= U_EP_KIND;\n\n  ep_change_status(&ep_reg, dir, EP_STAT_DISABLED);\n  ep_change_dtog(&ep_reg, dir, 0);\n\n  if (dir == TUSB_DIR_IN) {\n    ep_reg &= ~(U_EPRX_STAT | U_EP_DTOG_RX);\n  } else {\n    ep_reg &= ~(U_EPTX_STAT | U_EP_DTOG_TX);\n  }\n  #else\n  ep_change_status(&ep_reg, TUSB_DIR_IN, EP_STAT_DISABLED);\n  ep_change_status(&ep_reg, TUSB_DIR_OUT, EP_STAT_DISABLED);\n  ep_change_dtog(&ep_reg, dir, 0);\n  ep_change_dtog(&ep_reg, (tusb_dir_t)(1 - dir), 1);\n  #endif\n\n  ep_write(ep_idx, ep_reg, true);\n\n  return true;\n}\n\n// Currently, single-buffered, and only 64 bytes at a time (max)\nstatic void dcd_transmit_packet(xfer_ctl_t *xfer, uint16_t ep_ix) {\n  uint16_t len    = tu_min16(xfer->total_len - xfer->queued_len, xfer->max_packet_size);\n  uint32_t ep_reg = ep_read(ep_ix) | U_EP_CTR_TX | U_EP_CTR_RX; // reserve CTR\n\n  const bool is_iso = ep_is_iso(ep_reg);\n\n  uint8_t buf_id;\n  #if FSDEV_USE_SBUF_ISO == 0\n  bool const dbl_buf = is_iso;\n  #else\n  bool const dbl_buf = false;\n  #endif\n  if (dbl_buf) {\n    buf_id = (ep_reg & U_EP_DTOG_TX) ? 1 : 0;\n  } else {\n    buf_id = BTABLE_BUF_TX;\n  }\n  uint16_t         addr_ptr = (uint16_t)btable_get_addr(ep_ix, buf_id);\n  fsdev_pma_buf_t *pma_buf  = PMA_BUF_AT(addr_ptr);\n\n  if (xfer->ff) {\n    tu_hwfifo_write_from_fifo(pma_buf, xfer->ff, len, NULL);\n  } else {\n    tu_hwfifo_write(pma_buf, &(xfer->buffer[xfer->queued_len]), len, NULL);\n  }\n  xfer->queued_len += len;\n\n  btable_set_count(ep_ix, buf_id, len);\n  ep_change_status(&ep_reg, TUSB_DIR_IN, EP_STAT_VALID);\n\n  if (is_iso) {\n    xfer->iso_in_sending = true;\n  }\n  ep_reg &= U_EPREG_MASK | EP_STAT_MASK(TUSB_DIR_IN); // only change TX Status, reserve other toggle bits\n  ep_write(ep_ix, ep_reg, true);\n}\n\nstatic bool edpt_xfer(uint8_t rhport, uint8_t ep_num, tusb_dir_t dir) {\n  (void)rhport;\n\n  xfer_ctl_t   *xfer   = xfer_ctl_ptr(ep_num, dir);\n  const uint8_t ep_idx = xfer->ep_idx;\n\n  if (dir == TUSB_DIR_IN) {\n    dcd_transmit_packet(xfer, ep_idx);\n  } else {\n    uint32_t ep_reg = ep_read(ep_idx) | U_EP_CTR_TX | U_EP_CTR_RX; // reserve CTR\n    ep_reg &= U_EPREG_MASK | EP_STAT_MASK(dir);\n\n    uint16_t cnt = tu_min16(xfer->total_len, xfer->max_packet_size);\n\n  #if FSDEV_USE_SBUF_ISO == 0\n    bool const dbl_buf = ep_is_iso(ep_reg);\n  #else\n    bool const dbl_buf = false;\n  #endif\n    if (dbl_buf) {\n      btable_set_rx_bufsize(ep_idx, 0, cnt);\n      btable_set_rx_bufsize(ep_idx, 1, cnt);\n    } else {\n      btable_set_rx_bufsize(ep_idx, BTABLE_BUF_RX, cnt);\n    }\n\n    ep_change_status(&ep_reg, dir, EP_STAT_VALID);\n    ep_write(ep_idx, ep_reg, true);\n  }\n\n  return true;\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes, bool is_isr) {\n  (void)is_isr;\n  const uint8_t    ep_num = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir    = tu_edpt_dir(ep_addr);\n  xfer_ctl_t      *xfer   = xfer_ctl_ptr(ep_num, dir);\n\n  xfer->buffer     = buffer;\n  xfer->ff         = NULL;\n  xfer->total_len  = total_bytes;\n  xfer->queued_len = 0;\n\n  return edpt_xfer(rhport, ep_num, dir);\n}\n\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff, uint16_t total_bytes, bool is_isr) {\n  (void)is_isr;\n  const uint8_t    ep_num = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir    = tu_edpt_dir(ep_addr);\n  xfer_ctl_t      *xfer   = xfer_ctl_ptr(ep_num, dir);\n\n  xfer->buffer     = NULL;\n  xfer->ff         = ff;\n  xfer->total_len  = total_bytes;\n  xfer->queued_len = 0;\n\n  return edpt_xfer(rhport, ep_num, dir);\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void)rhport;\n  const uint8_t    ep_num = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir    = tu_edpt_dir(ep_addr);\n  xfer_ctl_t      *xfer   = xfer_ctl_ptr(ep_num, dir);\n  const uint8_t    ep_idx = xfer->ep_idx;\n\n  uint32_t ep_reg = ep_read(ep_idx) | U_EP_CTR_TX | U_EP_CTR_RX; // reserve CTR bits\n  ep_reg &= U_EPREG_MASK | EP_STAT_MASK(dir);\n  ep_change_status(&ep_reg, dir, EP_STAT_STALL);\n\n  ep_write(ep_idx, ep_reg, true);\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void)rhport;\n\n  const uint8_t    ep_num = tu_edpt_number(ep_addr);\n  const tusb_dir_t dir    = tu_edpt_dir(ep_addr);\n  xfer_ctl_t      *xfer   = xfer_ctl_ptr(ep_num, dir);\n  const uint8_t    ep_idx = xfer->ep_idx;\n\n  uint32_t ep_reg = ep_read(ep_idx) | U_EP_CTR_TX | U_EP_CTR_RX; // reserve CTR bits\n  ep_reg &= U_EPREG_MASK | EP_STAT_MASK(dir) | EP_DTOG_MASK(dir);\n\n  if (!ep_is_iso(ep_reg)) {\n    ep_change_status(&ep_reg, dir, EP_STAT_NAK);\n  }\n  ep_change_dtog(&ep_reg, dir, 0); // Reset to DATA0\n  ep_write(ep_idx, ep_reg, true);\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  fsdev_int_enable(rhport);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  fsdev_int_disable(rhport);\n}\n\n  #if defined(USB_BCDR_DPPU) || defined(SYSCFG_PMC_USB_PU) || defined(EXTEN_USBD_PU_EN)\nvoid dcd_connect(uint8_t rhport) {\n  fsdev_connect(rhport);\n}\n\nvoid dcd_disconnect(uint8_t rhport) {\n  fsdev_disconnect(rhport);\n}\n  #endif\n\n#endif\n"
  },
  {
    "path": "src/portable/st/stm32_fsdev/fsdev_at32.h",
    "content": "/*\n* The MIT License (MIT)\n *\n * Copyright (c) 2024, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n#ifndef TUSB_FSDEV_AT32_H\n#define TUSB_FSDEV_AT32_H\n\n#include \"common/tusb_compiler.h\"\n\n#if CFG_TUSB_MCU == OPT_MCU_AT32F403A_407\n  #include \"at32f403a_407.h\"\n\n#elif CFG_TUSB_MCU == OPT_MCU_AT32F413\n  #include \"at32f413.h\"\n\n#endif\n\n#define FSDEV_USE_SBUF_ISO 0\n#define FSDEV_REG_BASE  (APB1PERIPH_BASE + 0x00005C00UL)\n#define FSDEV_PMA_BASE  (APB1PERIPH_BASE + 0x00006000UL)\n\n#ifndef CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP\n  #define CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP 0\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n#if (CFG_TUSB_MCU == OPT_MCU_AT32F403A_407) || (CFG_TUSB_MCU == OPT_MCU_AT32F413)\nstatic const IRQn_Type fsdev_irq[] = {\n  USBFS_H_CAN1_TX_IRQn,\n  USBFS_L_CAN1_RX0_IRQn,\n  USBFSWakeUp_IRQn\n};\nenum { FSDEV_IRQ_NUM = TU_ARRAY_SIZE(fsdev_irq) };\n\n#else\n  #error \"Unsupported MCU\"\n#endif\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_int_enable(uint8_t rhport) {\n  (void)rhport;\n  #if (CFG_TUSB_MCU == OPT_MCU_AT32F403A_407) || (CFG_TUSB_MCU == OPT_MCU_AT32F413)\n  // AT32F403A/407 devices allow to remap the USB interrupt vectors from\n  // shared USB/CAN IRQs to separate CAN and USB IRQs.\n  // This dynamically checks if this remap is active to enable the right IRQs.\n  if (CRM->intmap_bit.usbintmap) {\n    NVIC_EnableIRQ(USBFS_MAPH_IRQn);\n    NVIC_EnableIRQ(USBFS_MAPL_IRQn);\n    NVIC_EnableIRQ(USBFSWakeUp_IRQn);\n  } else\n  #endif\n  {\n    for(uint8_t i=0; i < FSDEV_IRQ_NUM; i++) {\n      NVIC_EnableIRQ(fsdev_irq[i]);\n    }\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_int_disable(uint8_t rhport) {\n  (void)rhport;\n  #if (CFG_TUSB_MCU == OPT_MCU_AT32F403A_407) || (CFG_TUSB_MCU == OPT_MCU_AT32F413)\n  // AT32F403A/407 devices allow to remap the USB interrupt vectors from\n  // shared USB/CAN IRQs to separate CAN and USB IRQs.\n  // This dynamically checks if this remap is active to enable the right IRQs.\n  if (CRM->intmap_bit.usbintmap) {\n    NVIC_DisableIRQ(USBFS_MAPH_IRQn);\n    NVIC_DisableIRQ(USBFS_MAPL_IRQn);\n    NVIC_DisableIRQ(USBFSWakeUp_IRQn);\n  } else\n  #endif\n  {\n    for(uint8_t i=0; i < FSDEV_IRQ_NUM; i++) {\n      NVIC_DisableIRQ(fsdev_irq[i]);\n    }\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_disconnect(uint8_t rhport) {\n  (void) rhport;\n  /* disable usb phy */\n  *(volatile uint32_t*)(FSDEV_REG_BASE + 0x40) |= U_CNTR_PDWN;\n  /* D+ 1.5k pull-up disable, USB->cfg_bit.puo = TRUE; */\n  *(volatile uint32_t *)(FSDEV_REG_BASE+0x60) |= (1u<<1);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_connect(uint8_t rhport) {\n  (void) rhport;\n  /* enable usb phy */\n  *(volatile uint32_t*)(FSDEV_REG_BASE + 0x40) &= ~U_CNTR_PDWN;\n  /* Dp 1.5k pull-up enable, USB->cfg_bit.puo = 0; */\n  *(volatile uint32_t *)(FSDEV_REG_BASE+0x60) &= ~(1u<<1);\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/st/stm32_fsdev/fsdev_ch32.h",
    "content": "/*\n* The MIT License (MIT)\n *\n * Copyright (c) 2024, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n/** <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  */\n\n#ifndef TUSB_FSDEV_CH32_H\n#define TUSB_FSDEV_CH32_H\n\n#include \"common/tusb_compiler.h\"\n\n// https://github.com/openwch/ch32v307/pull/90\n// https://github.com/openwch/ch32v20x/pull/12\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#endif\n\n#if CFG_TUSB_MCU == OPT_MCU_CH32F20X\n  #include <ch32f20x.h>\n#elif CFG_TUSB_MCU == OPT_MCU_CH32V20X\n  #include <ch32v20x.h>\n#endif\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#define FSDEV_USE_SBUF_ISO 0\n#define FSDEV_REG_BASE  (APB1PERIPH_BASE + 0x00005C00UL)\n#define FSDEV_PMA_BASE  (APB1PERIPH_BASE + 0x00006000UL)\n\n#ifndef CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP\n  #define CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP 0\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n#if CFG_TUSB_MCU == OPT_MCU_CH32V20X\nstatic const IRQn_Type fsdev_irq[] = {\n  USB_HP_CAN1_TX_IRQn,\n  USB_LP_CAN1_RX0_IRQn,\n  USBWakeUp_IRQn\n};\nenum { FSDEV_IRQ_NUM = TU_ARRAY_SIZE(fsdev_irq) };\n#else\n  #error \"Unsupported MCU\"\n#endif\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_int_enable(uint8_t rhport) {\n  (void)rhport;\n  for(uint8_t i=0; i < FSDEV_IRQ_NUM; i++) {\n    NVIC_EnableIRQ(fsdev_irq[i]);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_int_disable(uint8_t rhport) {\n  (void)rhport;\n  for(uint8_t i=0; i < FSDEV_IRQ_NUM; i++) {\n    NVIC_DisableIRQ(fsdev_irq[i]);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_disconnect(uint8_t rhport) {\n  (void) rhport;\n  EXTEN->EXTEN_CTR &= ~EXTEN_USBD_PU_EN;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_connect(uint8_t rhport) {\n  (void) rhport;\n  EXTEN->EXTEN_CTR |= EXTEN_USBD_PU_EN;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/st/stm32_fsdev/fsdev_common.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Ha Thach (tinyusb.org)\n * Copyright (c) 2025, HiFiPhile (Zixun LI)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if defined(TUP_USBIP_FSDEV) && (CFG_TUH_ENABLED || CFG_TUD_ENABLED)\n\n#include \"fsdev_common.h\"\n\n//--------------------------------------------------------------------+\n// Global\n//--------------------------------------------------------------------+\n\n// Reset the USB Core\nvoid fsdev_core_reset(void) {\n  // Perform USB peripheral reset\n  FSDEV_REG->CNTR = U_CNTR_FRES | U_CNTR_PDWN;\n  for (volatile uint32_t i = 0; i < 200; i++) { // should be a few us\n    asm(\"NOP\");\n  }\n\n  FSDEV_REG->CNTR &= ~U_CNTR_PDWN;\n\n  // Wait startup time, for F042 and F070, this is <= 1 us.\n  for (volatile uint32_t i = 0; i < 200; i++) { // should be a few us\n    asm(\"NOP\");\n  }\n\n  // Clear pending interrupts\n  FSDEV_REG->ISTR = 0;\n}\n\n// De-initialize the USB Core\nvoid fsdev_deinit(void) {\n  // Disable all interrupts and force USB reset\n  FSDEV_REG->CNTR = U_CNTR_FRES;\n\n  // Clear pending interrupts\n  FSDEV_REG->ISTR = 0;\n\n  // Put USB peripheral in power down mode\n  FSDEV_REG->CNTR = U_CNTR_FRES | U_CNTR_PDWN;\n  for (volatile uint32_t i = 0; i < 200; i++) { // should be a few us\n    asm(\"NOP\");\n  }\n}\n\n//--------------------------------------------------------------------+\n// BTable Helper\n//--------------------------------------------------------------------+\n\n// Aligned buffer size according to hardware\nuint16_t pma_align_buffer_size(uint16_t size, uint8_t* blsize, uint8_t* num_block) {\n  /* The STM32 full speed USB peripheral supports only a limited set of\n   * buffer sizes given by the RX buffer entry format in the USB_BTABLE. */\n  uint16_t block_in_bytes;\n  if (size > 62) {\n    block_in_bytes = 32;\n    *blsize = 1;\n    *num_block = tu_div_ceil(size, 32);\n  } else {\n    block_in_bytes = 2;\n    *blsize = 0;\n    *num_block = tu_div_ceil(size, 2);\n  }\n\n  return (*num_block) * block_in_bytes;\n}\n\n// Set RX buffer size\nvoid btable_set_rx_bufsize(uint32_t ep_id, uint8_t buf_id, uint16_t wCount) {\n  uint8_t blsize, num_block;\n  (void) pma_align_buffer_size(wCount, &blsize, &num_block);\n\n  /* Encode into register. When BLSIZE==1, we need to subtract 1 block count */\n  uint16_t bl_nb = (blsize << 15) | ((num_block - blsize) << 10);\n  if (bl_nb == 0) {\n    // zlp but 0 is invalid value, set blsize to 1 (32 bytes)\n    // Note: lower value can cause PMAOVR on setup with ch32v203\n    bl_nb = 1 << 15;\n  }\n\n#ifdef  CFG_TUSB_FSDEV_32BIT\n  uint32_t count_addr = FSDEV_BTABLE->ep32[ep_id][buf_id].count_addr;\n  count_addr = (bl_nb << 16) | (count_addr & 0x0000FFFFu);\n  FSDEV_BTABLE->ep32[ep_id][buf_id].count_addr = count_addr;\n#else\n  FSDEV_BTABLE->ep16[ep_id][buf_id].count = bl_nb;\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/st/stm32_fsdev/fsdev_common.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) N Conrad\n * Copyright (c) 2024, hathach (tinyusb.org)\n * Copyright (c) 2025, HiFiPhile (Zixun LI)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_FSDEV_COMMON_H\n#define TUSB_FSDEV_COMMON_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"common/tusb_common.h\"\n\n#if CFG_TUD_ENABLED\n  #include \"device/dcd.h\"\n#endif\n\n#if CFG_TUH_ENABLED\n  #include \"host/hcd.h\"\n#endif\n\n//--------------------------------------------------------------------+\n// FSDEV Register Bit Definitions\n// Vendor-independent definitions with U_ prefix to avoid conflicts.\n// Based on the common USB FSDEV IP block register layout.\n// Lower 16 bits are shared across all variants (STM32, CH32, AT32).\n// Upper 16 bits (DRD extensions) only exist on 32-bit DRD MCUs.\n//--------------------------------------------------------------------+\n\n// EPnR / CHEPnR - Endpoint/Channel Register\n// DTOG and STAT bits are toggle-on-write-1. CTR bits are clear-on-write-0.\n//\n//   15       14        13    12     11      10     9      8       7        6         5     4      3    2    1    0\n//   CTR_RX   DTOG_RX   STAT_RX[1:0]  SETUP   EP_TYPE[1:0]  KIND    CTR_TX   DTOG_TX   STAT_TX[1:0]  EA[3:0]\n//\n// DRD 32-bit only (C0, G0, H5, U0, U5):\n//   31:27    26       25       24      23     22   21   20   19   18   17   16\n//   Rsvd     ERR_RX   ERR_TX   LSEP    NAK    DEVADDR[6:0]\n#define U_EP_CTR_RX        0x8000u\n#define U_EP_DTOG_RX       0x4000u\n#define U_EPRX_STAT        0x3000u\n#define U_EP_SETUP         0x0800u\n#define U_EP_T_FIELD       0x0600u\n#define U_EP_KIND          0x0100u\n#define U_EP_CTR_TX        0x0080u\n#define U_EP_DTOG_TX       0x0040u\n#define U_EPTX_STAT        0x0030u\n#define U_EPADDR_FIELD     0x000Fu\n\n// DRD 32-bit upper bits\n#define U_EP_ERRRX         0x04000000u\n#define U_EP_ERRTX         0x02000000u\n#define U_EP_LSEP          0x01000000u\n#define U_EP_NAK           0x00800000u\n#define U_EP_DEVADDR       0x007F0000u\n#define U_EP_DEVADDR_Pos   16u\n\n// Endpoint types (EP_TYPE field values)\n#define U_EP_BULK          0x0000u\n#define U_EP_CONTROL       0x0200u\n#define U_EP_ISOCHRONOUS   0x0400u\n#define U_EP_INTERRUPT     0x0600u\n#define U_EP_TYPE_MASK     (U_EP_T_FIELD)\n\n// EP register mask components (non-toggle bits preserved during read-modify-write)\n// Excludes DTOG_RX, STAT_RX, DTOG_TX, STAT_TX (toggle-on-write-1)\n#define U_EPREG_MASK_16    (U_EP_CTR_RX | U_EP_SETUP | U_EP_T_FIELD | U_EP_KIND | U_EP_CTR_TX | U_EPADDR_FIELD)\n#define U_EPREG_MASK_32    (U_EP_ERRRX | U_EP_ERRTX | U_EP_LSEP | U_EP_NAK | U_EP_DEVADDR | U_EPREG_MASK_16)\n\n// EP register mask selection based on bus width\n#ifdef  CFG_TUSB_FSDEV_32BIT\n  #define U_EPREG_MASK     U_EPREG_MASK_32\n#else\n  #define U_EPREG_MASK     U_EPREG_MASK_16\n#endif\n\n#define U_EPKIND_MASK      ((uint32_t)(~U_EP_KIND) & U_EPREG_MASK)\n#define U_EPTX_DTOGMASK    (U_EPTX_STAT | U_EPREG_MASK)\n#define U_EPRX_DTOGMASK    (U_EPRX_STAT | U_EPREG_MASK)\n\n// Bit positions\n#define U_EPTX_STAT_Pos    4u\n#define U_EP_DTOG_TX_Pos   6u\n#define U_EP_CTR_TX_Pos    7u\n\n// Data toggle helpers\n#define U_EPTX_DTOG1       0x0010u\n#define U_EPTX_DTOG2       0x0020u\n#define U_EPRX_DTOG1       0x1000u\n#define U_EPRX_DTOG2       0x2000u\n\n// CNTR - Control Register\n//   15      14        13    12     11     10       9     8      7    6    5    4        3      2       1     0\n//   CTRM    PMAOVRM   ERRM  WKUPM  SUSPM  RESETM   SOFM  ESOFM  Rsvd Rsvd Rsvd RESUME   FSUSP  LPMODE  PDWN  FRES\n//\n// DRD 32-bit only:\n//   31     30:16\n//   HOST   Rsvd\n#define U_CNTR_CTRM       0x8000u\n#define U_CNTR_PMAOVRM    0x4000u\n#define U_CNTR_ERRM       0x2000u\n#define U_CNTR_WKUPM      0x1000u\n#define U_CNTR_SUSPM      0x0800u\n#define U_CNTR_RESETM     0x0400u\n#define U_CNTR_SOFM       0x0200u\n#define U_CNTR_ESOFM      0x0100u\n#define U_CNTR_RESUME     0x0010u\n#define U_CNTR_FSUSP      0x0008u\n#define U_CNTR_LPMODE     0x0004u\n#define U_CNTR_PDWN       0x0002u\n#define U_CNTR_FRES       0x0001u\n\n#define U_CNTR_HOST       0x80000000u   // DRD: enable host mode\n#define U_CNTR_DCON       0x0400u       // DRD host: same bit as RESETM\n\n// ISTR - Interrupt Status Register\n//   15    14      13   12    11    10     9    8      7    6    5    4     3    2    1    0\n//   CTR   PMAOVR  ERR  WKUP  SUSP  RESET  SOF  ESOF   Rsvd Rsvd Rsvd DIR   EP_ID[3:0]\n//\n// DRD 32-bit only:\n//   31   30         29          28:16\n//   Rsvd LS_DCONN   DCON_STAT   Rsvd\n#define U_ISTR_CTR        0x8000u\n#define U_ISTR_PMAOVR     0x4000u\n#define U_ISTR_ERR        0x2000u\n#define U_ISTR_WKUP       0x1000u\n#define U_ISTR_SUSP       0x0800u\n#define U_ISTR_RESET      0x0400u\n#define U_ISTR_SOF        0x0200u\n#define U_ISTR_ESOF       0x0100u\n#define U_ISTR_DIR        0x0010u\n#define U_ISTR_EP_ID      0x000Fu\n\n#define U_ISTR_LS_DCONN   0x40000000u   // DRD: low-speed device connected\n#define U_ISTR_DCON_STAT  0x20000000u   // DRD: device connection status\n#define U_ISTR_DCON       0x0400u       // DRD host: same bit as RESET\n\n// FNR - Frame Number Register (read-only)\n//   15    14    13   12   11   10   9    8    7    6    5    4    3    2    1    0\n//   RXDP  RXDM  LCK[2:0]       FN[10:0]\n#define U_FNR_RXDP        0x8000u\n#define U_FNR_RXDM        0x4000u\n#define U_FNR_FN          0x07FFu\n\n// DADDR - Device Address Register\n//   15:8   7    6    5    4    3    2    1    0\n//   Rsvd   EF   ADD[6:0]\n#define U_DADDR_EF        0x80u\n\n// LPMCSR - LPM Control and Status Register\n// Supported: STM32 F0, L0, L4, G0, G4, C0, H5, U0, WB. Not on: F1, F3, AT32, CH32.\n//   15:8           7    6    5    4    3    2    1        0\n//   Rsvd           BESL[3:0]      Rsvd REMWAKE  Rsvd LPMACK   LMPEN\n#define U_LPMCSR_LMPEN     0x0001u\n#define U_LPMCSR_LPMACK    0x0002u\n#define U_LPMCSR_REMWAKE   0x0008u\n#define U_LPMCSR_BESL      0x00F0u\n\n// BCDR - Battery Charging Detector Register\n// Supported: STM32 F0, L0, L4, G0, G4, C0, H5, U0, WB. Not on: F1, F3, AT32, CH32.\n//   15    14:8   7        6     5     4      3     2     1      0\n//   DPPU  Rsvd   PS2DET   SDET  PDET  DCDET  SDEN  PDEN  DCDEN  BCDEN\n#define U_BCDR_BCDEN       0x0001u\n#define U_BCDR_DCDEN       0x0002u\n#define U_BCDR_PDEN        0x0004u\n#define U_BCDR_SDEN        0x0008u\n#define U_BCDR_DCDET       0x0010u\n#define U_BCDR_PDET        0x0020u\n#define U_BCDR_SDET        0x0040u\n#define U_BCDR_PS2DET      0x0080u\n#define U_BCDR_DPPU        0x8000u\n\n// Channel status (DRD host mode, reuses STAT_TX/STAT_RX bit positions)\n#define U_CH_TX_STTX       0x0030u\n#define U_CH_TX_ACK_SBUF   0x0000u\n#define U_CH_TX_STALL      0x0010u\n#define U_CH_TX_NAK        0x0020u\n\n#define U_CH_RX_STRX       0x3000u\n#define U_CH_RX_ACK_SBUF   0x0000u\n#define U_CH_RX_STALL      0x1000u\n#define U_CH_RX_NAK        0x2000u\n#define U_CH_RX_VALID      0x3000u\n\n//--------------------------------------------------------------------+\n// Registers Typedef\n//--------------------------------------------------------------------+\n// hardware limit endpoint\n#define FSDEV_EP_COUNT 8\n\n// The fsdev_bus_t type can be used for both register and PMA access necessities\n#ifdef CFG_TUSB_FSDEV_32BIT\ntypedef uint32_t fsdev_bus_t;\n#else\ntypedef uint16_t fsdev_bus_t;\n#endif\n\n// volatile 32-bit aligned\n#define _va32 volatile TU_ATTR_ALIGNED(4)\n\ntypedef struct {\n  struct {\n    _va32 fsdev_bus_t reg;\n  } ep[FSDEV_EP_COUNT];\n\n  _va32 uint32_t    RESERVED7[8]; // Reserved\n  _va32 fsdev_bus_t CNTR;         // 40: Control register\n  _va32 fsdev_bus_t ISTR;         // 44: Interrupt status register\n  _va32 fsdev_bus_t FNR;          // 48: Frame number register\n  _va32 fsdev_bus_t DADDR;        // 4C: Device address register\n  _va32 fsdev_bus_t BTABLE;       // 50: Buffer Table address register\n  _va32 fsdev_bus_t LPMCSR;       // 54: LPM Control and Status (not on F1, F3, AT32, CH32)\n  _va32 fsdev_bus_t BCDR;         // 58: Battery Charging Detector (not on F1, F3, AT32, CH32)\n} fsdev_regs_t;\n\nTU_VERIFY_STATIC(offsetof(fsdev_regs_t, CNTR) == 0x40, \"Wrong offset\");\nTU_VERIFY_STATIC(sizeof(fsdev_regs_t) == 0x5C, \"Size is not correct\");\n\n#define FSDEV_REG ((fsdev_regs_t *)FSDEV_REG_BASE)\n\n//--------------------------------------------------------------------+\n// BTable and PMA Access\n//--------------------------------------------------------------------+\n\n// If sharing with CAN, one can set this to be non-zero to give CAN space where it wants it\n// Both of these MUST be a multiple of 2, and are in byte units.\n#ifndef FSDEV_BTABLE_BASE\n  #define FSDEV_BTABLE_BASE 0U\n#endif\nTU_VERIFY_STATIC((FSDEV_BTABLE_BASE & 0x7) == 0, \"BTABLE base must be aligned to 8 bytes\");\n\n#define FSDEV_ADDR_DATA_RATIO (CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE/CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE)\n\n// Need alignment when access address is 32 bit but data is only 16-bit\n#if FSDEV_ADDR_DATA_RATIO == 2\n  #define fsdev_addr_data_align TU_ATTR_ALIGNED(4)\n#else\n  #define fsdev_addr_data_align\n#endif\n\nenum {\n  BTABLE_BUF_TX = 0,\n  BTABLE_BUF_RX = 1\n};\n\n// Buffer Table is located in Packet Memory Area (PMA) and therefore its address access is forced to either\n// 16-bit or 32-bit depending on  CFG_TUSB_FSDEV_32BIT.\n// 0: TX (IN), 1: RX (OUT)\ntypedef union {\n  // data is strictly 16-bit access (address could be 32-bit aligned)\n  struct {\n    volatile fsdev_addr_data_align uint16_t addr;\n    volatile fsdev_addr_data_align uint16_t count;\n  } ep16[FSDEV_EP_COUNT][2];\n\n  // strictly 32-bit access\n  struct {\n    volatile uint32_t count_addr;\n  } ep32[FSDEV_EP_COUNT][2];\n} fsdev_btable_t;\n\nTU_VERIFY_STATIC(sizeof(fsdev_btable_t) == FSDEV_EP_COUNT * 8 * FSDEV_ADDR_DATA_RATIO, \"size is not correct\");\nTU_VERIFY_STATIC(FSDEV_BTABLE_BASE + FSDEV_EP_COUNT * 8 <= CFG_TUSB_FSDEV_PMA_SIZE, \"BTABLE does not fit in PMA RAM\");\n\n#define FSDEV_BTABLE ((volatile fsdev_btable_t *)(FSDEV_PMA_BASE + FSDEV_ADDR_DATA_RATIO * FSDEV_BTABLE_BASE))\n\ntypedef struct {\n  volatile fsdev_addr_data_align fsdev_bus_t value;\n} fsdev_pma_buf_t;\n\n#define PMA_BUF_AT(_addr) ((fsdev_pma_buf_t *)(FSDEV_PMA_BASE + FSDEV_ADDR_DATA_RATIO * (_addr)))\n\n//--------------------------------------------------------------------+\n// Vendor-specific includes\n//--------------------------------------------------------------------+\n#if defined(TUP_USBIP_FSDEV_STM32)\n  #include \"fsdev_stm32.h\"\n#elif defined(TUP_USBIP_FSDEV_CH32)\n  #include \"fsdev_ch32.h\"\n#elif defined(TUP_USBIP_FSDEV_AT32)\n  #include \"fsdev_at32.h\"\n#else\n  #error \"Unknown USB IP\"\n#endif\n\n//--------------------------------------------------------------------+\n// Endpoint Helper\n// - CTR is write 0 to clear\n// - DTOG and STAT are write 1 to toggle\n//--------------------------------------------------------------------+\ntypedef enum {\n  EP_STAT_DISABLED = 0,\n  EP_STAT_STALL    = 1,\n  EP_STAT_NAK      = 2,\n  EP_STAT_VALID    = 3\n} ep_stat_t;\n\n#define EP_STAT_MASK(_dir) (3u << (U_EPTX_STAT_Pos + ((_dir) == TUSB_DIR_IN ? 0 : 8)))\n#define EP_DTOG_MASK(_dir) (1u << (U_EP_DTOG_TX_Pos + ((_dir) == TUSB_DIR_IN ? 0 : 8)))\n\n#define CH_STAT_MASK(_dir) (3u << (U_EPTX_STAT_Pos + ((_dir) == TUSB_DIR_IN ? 8 : 0)))\n#define CH_DTOG_MASK(_dir) (1u << (U_EP_DTOG_TX_Pos + ((_dir) == TUSB_DIR_IN ? 8 : 0)))\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t ep_read(uint32_t ep_id) {\n  return FSDEV_REG->ep[ep_id].reg;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ep_write(uint32_t ep_id, uint32_t value, bool need_exclusive) {\n  if (need_exclusive) {\n    fsdev_int_disable(0);\n  }\n\n  FSDEV_REG->ep[ep_id].reg = (fsdev_bus_t)value;\n\n  if (need_exclusive) {\n    fsdev_int_enable(0);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ep_write_clear_ctr(uint32_t ep_id, tusb_dir_t dir) {\n  uint32_t reg = FSDEV_REG->ep[ep_id].reg;\n  reg |= U_EP_CTR_TX | U_EP_CTR_RX;\n  reg &= U_EPREG_MASK;\n  reg &= ~(1 << (U_EP_CTR_TX_Pos + (dir == TUSB_DIR_IN ? 0 : 8)));\n  ep_write(ep_id, reg, false);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ep_change_status(uint32_t *reg, tusb_dir_t dir, ep_stat_t state) {\n  *reg ^= (state << (U_EPTX_STAT_Pos + (dir == TUSB_DIR_IN ? 0 : 8)));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ep_change_dtog(uint32_t *reg, tusb_dir_t dir, uint8_t state) {\n  *reg ^= (state << (U_EP_DTOG_TX_Pos + (dir == TUSB_DIR_IN ? 0 : 8)));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool ep_is_iso(uint32_t reg) {\n  return (reg & U_EP_TYPE_MASK) == U_EP_ISOCHRONOUS;\n}\n\n//--------------------------------------------------------------------+\n// Channel Helper\n// - Direction is opposite to endpoint direction\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t ch_read(uint32_t ch_id) {\n  return ep_read(ch_id);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ch_write(uint32_t ch_id, uint32_t value, bool need_exclusive) {\n  ep_write(ch_id, value, need_exclusive);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ch_write_clear_ctr(uint32_t ch_id, tusb_dir_t dir) {\n  uint32_t reg = FSDEV_REG->ep[ch_id].reg;\n  reg |= U_EP_CTR_TX | U_EP_CTR_RX;\n  reg &= U_EPREG_MASK;\n  reg &= ~(1 << (U_EP_CTR_TX_Pos + (dir == TUSB_DIR_IN ? 8 : 0)));\n  ep_write(ch_id, reg, false);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ch_change_status(uint32_t *reg, tusb_dir_t dir, ep_stat_t state) {\n  *reg ^= (state << (U_EPTX_STAT_Pos + (dir == TUSB_DIR_IN ? 8 : 0)));\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void ch_change_dtog(uint32_t *reg, tusb_dir_t dir, uint8_t state) {\n  *reg ^= (state << (U_EP_DTOG_TX_Pos + (dir == TUSB_DIR_IN ? 8 : 0)));\n}\n\n//--------------------------------------------------------------------+\n// BTable Helper\n//--------------------------------------------------------------------+\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t btable_get_addr(uint32_t ep_id, uint8_t buf_id) {\n#ifdef  CFG_TUSB_FSDEV_32BIT\n  return FSDEV_BTABLE->ep32[ep_id][buf_id].count_addr & 0x0000FFFFu;\n#else\n  return FSDEV_BTABLE->ep16[ep_id][buf_id].addr;\n#endif\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void btable_set_addr(uint32_t ep_id, uint8_t buf_id, uint16_t addr) {\n#ifdef  CFG_TUSB_FSDEV_32BIT\n  uint32_t count_addr = FSDEV_BTABLE->ep32[ep_id][buf_id].count_addr;\n  count_addr          = (count_addr & 0xFFFF0000u) | (addr & 0x0000FFFCu);\n\n  FSDEV_BTABLE->ep32[ep_id][buf_id].count_addr = count_addr;\n#else\n  FSDEV_BTABLE->ep16[ep_id][buf_id].addr = addr;\n#endif\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t btable_get_count(uint32_t ep_id, uint8_t buf_id) {\n  uint16_t count;\n#ifdef  CFG_TUSB_FSDEV_32BIT\n  count = (FSDEV_BTABLE->ep32[ep_id][buf_id].count_addr >> 16);\n#else\n  count = FSDEV_BTABLE->ep16[ep_id][buf_id].count;\n#endif\n  return count & 0x3FFU;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void btable_set_count(uint32_t ep_id, uint8_t buf_id, uint16_t byte_count) {\n#ifdef  CFG_TUSB_FSDEV_32BIT\n  uint32_t count_addr = FSDEV_BTABLE->ep32[ep_id][buf_id].count_addr;\n  count_addr          = (count_addr & ~0x03FF0000u) | ((byte_count & 0x3FFu) << 16);\n\n  FSDEV_BTABLE->ep32[ep_id][buf_id].count_addr = count_addr;\n#else\n  uint16_t cnt = FSDEV_BTABLE->ep16[ep_id][buf_id].count;\n  cnt          = (cnt & ~0x3FFU) | (byte_count & 0x3FFU);\n\n  FSDEV_BTABLE->ep16[ep_id][buf_id].count = cnt;\n#endif\n}\n\n// Reset the USB Core\nvoid fsdev_core_reset(void);\n\n// De-initialize the USB Core\nvoid fsdev_deinit(void);\n\n// Aligned buffer size according to hardware\nuint16_t pma_align_buffer_size(uint16_t size, uint8_t *blsize, uint8_t *num_block);\n\n// Set RX buffer size\nvoid btable_set_rx_bufsize(uint32_t ep_id, uint8_t buf_id, uint16_t wCount);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* TUSB_FSDEV_COMMON_H */\n"
  },
  {
    "path": "src/portable/st/stm32_fsdev/fsdev_stm32.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright(c) N Conrad\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *   1. Redistributions of source code must retain the above copyright notice,\n *      this list of conditions and the following disclaimer.\n *   2. 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 *   3. Neither the name of STMicroelectronics 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 \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_FSDEV_STM32_H\n#define TUSB_FSDEV_STM32_H\n\n#if CFG_TUSB_MCU == OPT_MCU_STM32C0\n  #include \"stm32c0xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 1\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32F0\n  #include \"stm32f0xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n  // F0x2 models are crystal-less\n  // All have internal D+ pull-up\n  // 070RB:    2 x 16 bits/word memory     LPM Support, BCD Support\n  // PMA dedicated to USB (no sharing with CAN)\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32F1\n  #include \"stm32f1xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n  // NO internal Pull-ups\n  //         *B, and *C:    2 x 16 bits/word\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32F3\n  #include \"stm32f3xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n  // NO internal Pull-ups. PMA dedicated to USB (no sharing with CAN)\n  // xB, and xC: 512 bytes\n  // x6, x8, xD, and xE: 1024 bytes + LPM Support. When CAN clock is enabled, USB can use the first 768 bytes ONLY.\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32G0\n  #include \"stm32g0xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 1\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32G4\n  #include \"stm32g4xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32H5\n  #include \"stm32h5xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 1\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32L0\n  #include \"stm32l0xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32L1\n  #include \"stm32l1xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32L4\n  #include \"stm32l4xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32L5\n  #include \"stm32l5xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n\n  #ifndef USB_PMAADDR\n    #define USB_PMAADDR (USB_BASE + (USB_PMAADDR_NS - USB_BASE_NS))\n  #endif\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32U0\n  #include \"stm32u0xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 1\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32U3\n  #include \"stm32u3xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 1\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32U5\n  #include \"stm32u5xx.h\"\n  #define FSDEV_HAS_SBUF_ISO 1\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32WB\n  #include \"stm32wbxx.h\"\n  #define FSDEV_HAS_SBUF_ISO 0\n\n#else\n  #error You are using an untested or unimplemented STM32 variant. Please update the driver.\n#endif\n\n//--------------------------------------------------------------------+\n// Register and PMA Base Address\n//--------------------------------------------------------------------+\n#ifndef FSDEV_REG_BASE\n#if defined(USB_BASE)\n  #define FSDEV_REG_BASE USB_BASE\n#elif defined(USB_DRD_BASE)\n  #define FSDEV_REG_BASE USB_DRD_BASE\n#elif defined(USB_DRD_FS_BASE)\n  #define FSDEV_REG_BASE USB_DRD_FS_BASE\n#else\n  #error \"FSDEV_REG_BASE not defined\"\n#endif\n#endif\n\n#ifndef FSDEV_PMA_BASE\n#if defined(USB_PMAADDR)\n  #define FSDEV_PMA_BASE USB_PMAADDR\n#elif defined(USB_DRD_PMAADDR)\n  #define FSDEV_PMA_BASE USB_DRD_PMAADDR\n#else\n  #error \"FSDEV_PMA_BASE not defined\"\n#endif\n#endif\n\n#ifndef FSDEV_HAS_SBUF_ISO\n  #error \"FSDEV_HAS_SBUF_ISO not defined\"\n#endif\n\n#ifndef CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP\n  // Default configuration for double-buffered isochronous endpoints:\n  // - Enable double buffering on devices with >1KB Packet Memory Area (PMA)\n  //   to improve isochronous transfer reliability and performance\n  // - Disable on devices with limited PMA to conserve memory space\n  #if CFG_TUSB_FSDEV_PMA_SIZE > 1024u\n    #define CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP 1\n  #else\n    #define CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP 0\n  #endif\n#endif\n\n#if FSDEV_HAS_SBUF_ISO != 0 && CFG_TUD_FSDEV_DOUBLE_BUFFERED_ISO_EP == 0\n  // SBUF_ISO configuration:\n  // - Some STM32 devices have special hardware support for single-buffered isochronous endpoints\n  // - When SBUF_ISO bit is available and double buffering is disabled:\n  //   Enable SBUF_ISO to optimize endpoint register usage (one half of endpoint pair register)\n  #define FSDEV_USE_SBUF_ISO 1\n#else\n  // When either:\n  // - Hardware doesn't support SBUF_ISO feature, or\n  // - Double buffering is enabled for isochronous endpoints\n  // We must use the entire endpoint pair register\n  #define FSDEV_USE_SBUF_ISO 0\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n#if TU_CHECK_MCU(OPT_MCU_STM32L1) && !defined(USBWakeUp_IRQn)\n  #define USBWakeUp_IRQn USB_FS_WKUP_IRQn\n#endif\n\nstatic const IRQn_Type fsdev_irq[] = {\n  #if TU_CHECK_MCU(OPT_MCU_STM32F0, OPT_MCU_STM32L0, OPT_MCU_STM32L4, OPT_MCU_STM32U5)\n    USB_IRQn,\n  #elif TU_CHECK_MCU(OPT_MCU_STM32L5, OPT_MCU_STM32U3)\n    USB_FS_IRQn,\n  #elif TU_CHECK_MCU(OPT_MCU_STM32C0, OPT_MCU_STM32H5, OPT_MCU_STM32U0)\n    USB_DRD_FS_IRQn,\n  #elif CFG_TUSB_MCU == OPT_MCU_STM32G0\n    #ifdef STM32G0B0xx\n    USB_IRQn,\n    #else\n    USB_UCPD1_2_IRQn,\n    #endif\n  #elif CFG_TUSB_MCU == OPT_MCU_STM32F1\n    USB_HP_CAN1_TX_IRQn,\n    USB_LP_CAN1_RX0_IRQn,\n    USBWakeUp_IRQn,\n  #elif CFG_TUSB_MCU == OPT_MCU_STM32F3\n    USB_HP_CAN_TX_IRQn,\n    USB_LP_CAN_RX0_IRQn,\n    USBWakeUp_IRQn,\n  #elif TU_CHECK_MCU(OPT_MCU_STM32G4, OPT_MCU_STM32L1)\n    USB_HP_IRQn,\n    USB_LP_IRQn,\n    USBWakeUp_IRQn,\n  #elif CFG_TUSB_MCU == OPT_MCU_STM32WB\n    USB_HP_IRQn,\n    USB_LP_IRQn,\n  #else\n    #error Unknown arch in USB driver\n  #endif\n};\nenum { FSDEV_IRQ_NUM = TU_ARRAY_SIZE(fsdev_irq) };\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_int_enable(uint8_t rhport) {\n  (void)rhport;\n\n  // forces write to RAM before allowing ISR to execute\n  __DSB(); __ISB();\n\n  #if CFG_TUSB_MCU == OPT_MCU_STM32F3 && defined(SYSCFG_CFGR1_USB_IT_RMP)\n  // Some STM32F302/F303 devices allow to remap the USB interrupt vectors from\n  // shared USB/CAN IRQs to separate CAN and USB IRQs.\n  // This dynamically checks if this remap is active to enable the right IRQs.\n  if (SYSCFG->CFGR1 & SYSCFG_CFGR1_USB_IT_RMP) {\n    NVIC_EnableIRQ(USB_HP_IRQn);\n    NVIC_EnableIRQ(USB_LP_IRQn);\n    NVIC_EnableIRQ(USBWakeUp_RMP_IRQn);\n  } else\n  #endif\n  {\n    for (uint8_t i = 0; i < FSDEV_IRQ_NUM; i++) {\n      NVIC_EnableIRQ(fsdev_irq[i]);\n    }\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_int_disable(uint8_t rhport) {\n  (void)rhport;\n\n  #if CFG_TUSB_MCU == OPT_MCU_STM32F3 && defined(SYSCFG_CFGR1_USB_IT_RMP)\n  // Some STM32F302/F303 devices allow to remap the USB interrupt vectors from\n  // shared USB/CAN IRQs to separate CAN and USB IRQs.\n  // This dynamically checks if this remap is active to enable the right IRQs.\n  if (SYSCFG->CFGR1 & SYSCFG_CFGR1_USB_IT_RMP) {\n    NVIC_DisableIRQ(USB_HP_IRQn);\n    NVIC_DisableIRQ(USB_LP_IRQn);\n    NVIC_DisableIRQ(USBWakeUp_RMP_IRQn);\n  } else\n  #endif\n  {\n    for (uint8_t i = 0; i < FSDEV_IRQ_NUM; i++) {\n      NVIC_DisableIRQ(fsdev_irq[i]);\n    }\n  }\n\n  // CMSIS has a membar after disabling interrupts\n}\n\n//--------------------------------------------------------------------+\n// Connect / Disconnect\n//--------------------------------------------------------------------+\n\n#if defined(USB_BCDR_DPPU)\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_disconnect(uint8_t rhport) {\n  (void)rhport;\n  FSDEV_REG->BCDR &= ~U_BCDR_DPPU;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_connect(uint8_t rhport) {\n  (void)rhport;\n  FSDEV_REG->BCDR |= U_BCDR_DPPU;\n}\n\n#elif defined(SYSCFG_PMC_USB_PU) // works e.g. on STM32L151\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_disconnect(uint8_t rhport) {\n  (void)rhport;\n  SYSCFG->PMC &= ~(SYSCFG_PMC_USB_PU);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void fsdev_connect(uint8_t rhport) {\n  (void)rhport;\n  SYSCFG->PMC |= SYSCFG_PMC_USB_PU;\n}\n#endif\n\n#endif /* TUSB_FSDEV_STM32_H */\n"
  },
  {
    "path": "src/portable/st/stm32_fsdev/hcd_stm32_fsdev.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 HiFiPhile (Zixun LI)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n/**********************************************\n * This driver provides USB Host controller support for STM32 MCUs with \"USB A\"/\"PCD\"/\"HCD\" peripheral.\n * This covers these MCU families:\n *\n * C0           2048 byte buffer; 32-bit bus; host mode\n * G0           2048 byte buffer; 32-bit bus; host mode\n * U3           2048 byte buffer; 32-bit bus; host mode\n * H5           2048 byte buffer; 32-bit bus; host mode\n * U535, U545   2048 byte buffer; 32-bit bus; host mode\n *\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_FSDEV) && defined(TUP_USBIP_FSDEV_DRD)\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"fsdev_common.h\"\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF\n//--------------------------------------------------------------------+\n\n// Debug level for FSDEV\n#define FSDEV_DEBUG 3\n\n// Max number of endpoints application can open, can be larger than FSDEV_EP_COUNT\n#ifndef CFG_TUH_FSDEV_ENDPOINT_MAX\n  #define CFG_TUH_FSDEV_ENDPOINT_MAX 16u\n#endif\n\nTU_VERIFY_STATIC(CFG_TUH_FSDEV_ENDPOINT_MAX <= 255, \"currently only use 8-bit for index\");\n\n#if CFG_TUSB_MCU == OPT_MCU_STM32H5\n  #define CPU_FREQUENCY_MHZ 250U\n#elif CFG_TUSB_MCU == OPT_MCU_STM32U5\n  #define CPU_FREQUENCY_MHZ 160U\n#elif CFG_TUSB_MCU == OPT_MCU_STM32U3\n  #define CPU_FREQUENCY_MHZ 96U\n#elif CFG_TUSB_MCU == OPT_MCU_STM32G0\n  #define CPU_FREQUENCY_MHZ 64U\n#elif CFG_TUSB_MCU == OPT_MCU_STM32C0\n  #define CPU_FREQUENCY_MHZ 48U\n#else\n  #error \"CPU_FREQUENCY_MHZ not defined for this STM32 MCU\"\n#endif\n\nenum {\n  HCD_XFER_ERROR_MAX = 3,\n  HCD_XFER_NAK_MAX = 15,\n  HCD_XFER_NAK_DEFAULT = 3,\n};\n\n// Host driver struct for each opened endpoint\ntypedef struct {\n  uint8_t *buffer;\n  uint16_t buflen;\n  uint16_t queued_len;\n  uint16_t max_packet_size;\n  uint8_t dev_addr;\n  uint8_t ep_addr;\n  uint8_t ep_type;\n  uint8_t interval;\n  struct TU_ATTR_PACKED {\n    uint8_t ls_pre : 1;\n    uint8_t allocated : 1;\n    uint8_t next_setup : 1;\n    uint8_t pid : 1;\n  };\n} hcd_endpoint_t;\n\n// Channel direction state\ntypedef struct {\n  hcd_endpoint_t* edpt;\n  struct TU_ATTR_PACKED {\n    uint8_t allocated : 1;\n    uint8_t retry : 3;\n    uint8_t nak : 4; // Max NAK count in current frame\n  };\n} hcd_channel_dir_t;\n\n// Additional info for each channel when it is active\ntypedef struct {\n  uint8_t dev_addr;\n  uint8_t ep_num;\n  uint8_t ep_type;\n  hcd_channel_dir_t out, in;\n} hcd_channel_t;\n\nstatic struct {\n  hcd_channel_t channel[FSDEV_EP_COUNT];\n  hcd_endpoint_t edpt[CFG_TUH_FSDEV_ENDPOINT_MAX];\n  bool connected;\n} _hcd_data;\n\nstatic tuh_configure_fsdev_t _tuh_cfg = {\n    .max_nak = HCD_XFER_NAK_DEFAULT,\n};\n\n//--------------------------------------------------------------------+\n// Prototypes\n//--------------------------------------------------------------------+\n\nstatic uint8_t endpoint_alloc(void);\nstatic uint8_t endpoint_find(uint8_t dev_addr, uint8_t ep_addr);\nstatic uint32_t hcd_pma_alloc(uint8_t channel, tusb_dir_t dir, uint16_t len);\nstatic uint8_t channel_alloc(uint8_t dev_addr, uint8_t ep_addr, uint8_t ep_type);\nstatic bool edpt_xfer_kickoff(uint8_t ep_id);\nstatic bool channel_xfer_start(uint8_t ch_id, tusb_dir_t dir);\nstatic void edpoint_close(uint8_t ep_id);\nstatic void port_status_handler(uint8_t rhport, bool in_isr);\nstatic void ch_handle_ack(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir);\nstatic void ch_handle_nak(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir);\nstatic void ch_handle_stall(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir);\nstatic void ch_handle_error(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir);\n\n//--------------------------------------------------------------------+\n// Inline Functions\n//--------------------------------------------------------------------+\n\nstatic inline void endpoint_dealloc(hcd_endpoint_t* edpt) {\n  edpt->allocated = 0;\n}\n\nstatic inline void channel_dealloc(hcd_channel_t* ch, tusb_dir_t dir) {\n  if (dir == TUSB_DIR_OUT) {\n    ch->out.allocated = 0;\n  } else {\n    ch->in.allocated = 0;\n  }\n}\n\n// Write channel state in specified direction\nstatic inline void channel_write_status(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir, ep_stat_t state, bool need_exclusive) {\n  ch_reg &= U_EPREG_MASK | CH_STAT_MASK(dir);\n  ch_change_status(&ch_reg, dir, state);\n  ch_write(ch_id, ch_reg, need_exclusive);\n}\n\nstatic inline uint16_t channel_get_rx_count(uint8_t ch_id) {\n  /* https://www.st.com/resource/en/errata_sheet/es0561-stm32h503cbebkbrb-device-errata-stmicroelectronics.pdf\n  * https://www.st.com/resource/en/errata_sheet/es0587-stm32u535xx-and-stm32u545xx-device-errata-stmicroelectronics.pdf\n  * From H503/U535 errata: Buffer description table update completes after CTR interrupt triggers\n  * Description:\n  * - During OUT transfers, the correct transfer interrupt (CTR) is triggered a little before the last USB SRAM accesses\n  * have completed. If the software responds quickly to the interrupt, the full buffer contents may not be correct.\n  * Workaround:\n  * - Software should ensure that a small delay is included before accessing the SRAM contents. This delay\n  * should be 800 ns in Full Speed mode and 6.4 μs in Low Speed mode\n  *\n  * Note: this errata may also apply to G0, U5, H5 etc.\n  *\n  * We choose the delay count based on max CPU frequency (in MHz) to ensure the delay is at least the required time.\n  */\n\n  uint32_t ch_reg = ch_read(ch_id);\n  if (FSDEV_REG->ISTR & U_ISTR_LS_DCONN || ch_reg & U_EP_LSEP) {\n    // Low speed mode: 6.4 us delay -> about 2 cycles per MHz\n    volatile uint32_t cycle_count = CPU_FREQUENCY_MHZ * 2U;\n    while (cycle_count > 0U) {\n      cycle_count--; // each count take 3 cycles (1 for sub, jump, and compare)\n    }\n  } else {\n    // Full speed mode: 800 ns delay -> about 0.25 cycles per MHz\n    volatile uint32_t cycle_count = CPU_FREQUENCY_MHZ / 4U;\n    while (cycle_count > 0U) {\n      cycle_count--; // each count take 3 cycles (1 for sub, jump, and compare)\n    }\n  }\n\n  return btable_get_count(ch_id, BTABLE_BUF_RX);\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n// Optional HCD configuration, called by tuh_configure()\nbool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {\n  (void) rhport;\n  TU_VERIFY(cfg_id == TUH_CFGID_FSDEV && cfg_param != NULL);\n\n  tuh_configure_param_t const* cfg = (tuh_configure_param_t const*) cfg_param;\n  _tuh_cfg.max_nak = tu_min8(cfg->fsdev.max_nak, HCD_XFER_NAK_MAX);\n  return true;\n}\n\n// Initialize controller to host mode\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n\n  fsdev_core_reset();\n\n  FSDEV_REG->CNTR = U_CNTR_HOST; // Enable USB in Host mode\n\n  tu_memclr(&_hcd_data, sizeof(_hcd_data));\n\n  // Clear pending interrupts\n  // Normally no interrupts should be pending here since we just reset the core,\n  // but device mode suspend needs to cleared by WKUP flag\n  FSDEV_REG->ISTR = 0;\n\n  // Enable interrupts for host mode\n  FSDEV_REG->CNTR |= U_CNTR_DCON | U_CNTR_CTRM | U_CNTR_SOFM | U_CNTR_ERRM | U_CNTR_PMAOVRM;\n\n  // Initialize port state\n  _hcd_data.connected = false;\n\n  fsdev_connect(rhport);\n\n  // If DCON_STAT is already set, the controller sometimes misses the initial connection interrupt\n  if (FSDEV_REG->ISTR & U_ISTR_DCON_STAT) {\n    // Wait DP/DM stabilize time\n    volatile uint32_t cycle_count = CPU_FREQUENCY_MHZ / 4U;\n    while (cycle_count > 0U) {\n      cycle_count--;\n    }\n    port_status_handler(rhport, false);\n  }\n\n  return true;\n}\n\nbool hcd_deinit(uint8_t rhport) {\n  (void)rhport;\n\n  fsdev_disconnect(rhport);\n\n  fsdev_deinit();\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Interrupt Helper Functions\n//--------------------------------------------------------------------+\n\nstatic inline void sof_handler(void) {\n  // Reset NAK counters for all active channels\n  for (uint8_t ch_id = 0; ch_id < FSDEV_EP_COUNT; ch_id++) {\n    hcd_channel_t* channel = &_hcd_data.channel[ch_id];\n    if (channel->out.allocated) {\n      channel->out.nak = 0;\n    }\n    if (channel->in.allocated) {\n      channel->in.nak = 0;\n    }\n  }\n}\n\nstatic void port_status_handler(uint8_t rhport, bool in_isr) {\n  uint32_t const fnr_reg = FSDEV_REG->FNR;\n  uint32_t const istr_reg = FSDEV_REG->ISTR;\n  // SE0 detected USB Disconnected state\n  if ((fnr_reg & (U_FNR_RXDP | U_FNR_RXDM)) == 0U) {\n    _hcd_data.connected = false;\n    hcd_event_device_remove(rhport, in_isr);\n    return;\n  }\n\n  if (!_hcd_data.connected) {\n    // J-state or K-state detected & LastState=Disconnected\n    if (((fnr_reg & U_FNR_RXDP) != 0U) || ((istr_reg & U_ISTR_LS_DCONN) != 0U)) {\n      _hcd_data.connected = true;\n      hcd_event_device_attach(rhport, in_isr);\n    }\n  } else {\n    // J-state or K-state detected & lastState=Connected: a Missed disconnection is detected\n    if (((fnr_reg & U_FNR_RXDP) != 0U) || ((istr_reg & U_ISTR_LS_DCONN) != 0U)) {\n      _hcd_data.connected = false;\n      hcd_event_device_remove(rhport, in_isr);\n    }\n  }\n}\n\n// Handle ACK response\nstatic void ch_handle_ack(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir) {\n  uint8_t const ep_num = ch_reg & U_EPADDR_FIELD;\n  uint8_t const daddr = (ch_reg & U_EP_DEVADDR) >> U_EP_DEVADDR_Pos;\n\n  uint8_t ep_id = endpoint_find(daddr, ep_num | (dir == TUSB_DIR_IN ? TUSB_DIR_IN_MASK : 0));\n  if (ep_id == TUSB_INDEX_INVALID_8) {\n    return;\n  }\n\n  hcd_endpoint_t *edpt    = &_hcd_data.edpt[ep_id];\n  hcd_channel_t  *channel = &_hcd_data.channel[ch_id];\n\n  if (dir == TUSB_DIR_OUT) {\n    // OUT/TX direction\n    if (edpt->buflen != edpt->queued_len) {\n      // More data to send\n      uint16_t const len = tu_min16(edpt->buflen - edpt->queued_len, edpt->max_packet_size);\n      uint16_t pma_addr = (uint16_t) btable_get_addr(ch_id, BTABLE_BUF_TX);\n      tu_hwfifo_write(PMA_BUF_AT(pma_addr), &(edpt->buffer[edpt->queued_len]), len, NULL);\n      btable_set_count(ch_id, BTABLE_BUF_TX, len);\n      edpt->queued_len += len;\n      channel_write_status(ch_id, ch_reg, TUSB_DIR_OUT, EP_STAT_VALID, false);\n      channel->out.nak = 0;\n    } else {\n      // Transfer complete\n      channel_dealloc(channel, TUSB_DIR_OUT);\n      edpt->pid = (ch_reg & U_EP_DTOG_TX) ? 1 : 0;\n      hcd_event_xfer_complete(daddr, ep_num, edpt->queued_len, XFER_RESULT_SUCCESS, true);\n    }\n  } else {\n    // IN/RX direction\n    uint16_t const rx_count = channel_get_rx_count(ch_id);\n    uint16_t pma_addr = (uint16_t) btable_get_addr(ch_id, BTABLE_BUF_RX);\n    tu_hwfifo_read(PMA_BUF_AT(pma_addr), edpt->buffer + edpt->queued_len, rx_count, NULL);\n    edpt->queued_len += rx_count;\n\n    if ((rx_count < edpt->max_packet_size) || (edpt->queued_len >= edpt->buflen)) {\n      // Transfer complete (short packet or all bytes received)\n      channel_dealloc(channel, TUSB_DIR_IN);\n      edpt->pid = (ch_reg & U_EP_DTOG_RX) ? 1 : 0;\n      hcd_event_xfer_complete(daddr, ep_num | TUSB_DIR_IN_MASK, edpt->queued_len, XFER_RESULT_SUCCESS, true);\n    } else {\n      // More data expected\n      uint16_t const cnt = tu_min16(edpt->buflen - edpt->queued_len, edpt->max_packet_size);\n      btable_set_rx_bufsize(ch_id, BTABLE_BUF_RX, cnt);\n      channel_write_status(ch_id, ch_reg, TUSB_DIR_IN, EP_STAT_VALID, false);\n      channel->in.nak = 0;\n    }\n  }\n}\n\n// Handle NAK response\nstatic void ch_handle_nak(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir) {\n  uint8_t const ep_num = ch_reg & U_EPADDR_FIELD;\n  uint8_t const daddr = (ch_reg & U_EP_DEVADDR) >> U_EP_DEVADDR_Pos;\n\n  uint8_t ep_id = endpoint_find(daddr, ep_num | (dir == TUSB_DIR_IN ? TUSB_DIR_IN_MASK : 0));\n  if (ep_id == TUSB_INDEX_INVALID_8) return;\n\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n  // Retry non-periodic transfer immediately if NAK count not exceeded\n  // Periodic transfer will be retried by next frame automatically\n  if (edpt->ep_type == TUSB_XFER_CONTROL || edpt->ep_type == TUSB_XFER_BULK) {\n    hcd_channel_dir_t* channel_dir =\n      (dir == TUSB_DIR_OUT) ? &(_hcd_data.channel[ch_id].out) : &(_hcd_data.channel[ch_id].in);\n    if (channel_dir->nak < HCD_XFER_NAK_MAX) {\n      channel_dir->nak++;\n    }\n    if (channel_dir->nak < _tuh_cfg.max_nak || _tuh_cfg.max_nak == 0) {\n      channel_write_status(ch_id, ch_reg, dir, EP_STAT_VALID, false);\n    }\n  }\n}\n\n// Handle STALL response\nstatic void ch_handle_stall(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir) {\n  uint8_t const ep_num = ch_reg & U_EPADDR_FIELD;\n  uint8_t const daddr = (ch_reg & U_EP_DEVADDR) >> U_EP_DEVADDR_Pos;\n\n  uint8_t ep_id = endpoint_find(daddr, ep_num | (dir == TUSB_DIR_IN ? TUSB_DIR_IN_MASK : 0));\n  if (ep_id == TUSB_INDEX_INVALID_8) return;\n\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n  hcd_channel_t* channel = &_hcd_data.channel[ch_id];\n  channel_dealloc(channel, dir);\n\n  channel_write_status(ch_id, ch_reg, dir, EP_STAT_DISABLED, false);\n\n  hcd_event_xfer_complete(daddr, ep_num | (dir == TUSB_DIR_IN ? TUSB_DIR_IN_MASK : 0),\n                         edpt->queued_len, XFER_RESULT_STALLED, true);\n}\n\n// Handle error response\nstatic void ch_handle_error(uint8_t ch_id, uint32_t ch_reg, tusb_dir_t dir) {\n  uint8_t const ep_num = ch_reg & U_EPADDR_FIELD;\n  uint8_t const daddr = (ch_reg & U_EP_DEVADDR) >> U_EP_DEVADDR_Pos;\n\n  uint8_t ep_id = endpoint_find(daddr, ep_num | (dir == TUSB_DIR_IN ? TUSB_DIR_IN_MASK : 0));\n  if (ep_id == TUSB_INDEX_INVALID_8) return;\n\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n  hcd_channel_t* channel = &_hcd_data.channel[ch_id];\n\n  ch_reg &= U_EPREG_MASK | CH_STAT_MASK(dir);\n  ch_reg &= ~(dir == TUSB_DIR_OUT ? U_EP_ERRTX : U_EP_ERRRX);\n\n  hcd_channel_dir_t* channel_dir =\n      (dir == TUSB_DIR_OUT) ? &(_hcd_data.channel[ch_id].out) : &(_hcd_data.channel[ch_id].in);\n  if (channel_dir->retry < HCD_XFER_ERROR_MAX) {\n    // Retry\n    channel_dir->retry++;\n    ch_change_status(&ch_reg, dir, EP_STAT_VALID);\n  } else {\n    // Failed after retries\n    channel_dealloc(channel, dir);\n    ch_change_status(&ch_reg, dir, EP_STAT_DISABLED);\n    hcd_event_xfer_complete(daddr, ep_num | (dir == TUSB_DIR_IN ? TUSB_DIR_IN_MASK : 0),\n                           edpt->queued_len, XFER_RESULT_FAILED, true);\n  }\n  ch_write(ch_id, ch_reg, false);\n}\n\n// Handle CTR interrupt for the TX/OUT direction\nstatic inline void handle_ctr_tx(uint32_t ch_id) {\n  uint32_t ch_reg = ch_read(ch_id) | U_EP_CTR_TX | U_EP_CTR_RX;\n  hcd_channel_t* channel = &_hcd_data.channel[ch_id];\n  TU_VERIFY(channel->out.allocated == 1,);\n\n  if ((ch_reg & U_EP_ERRTX) == 0U) {\n    // No error\n    if ((ch_reg & U_CH_TX_STTX) == U_CH_TX_ACK_SBUF) {\n      ch_handle_ack(ch_id, ch_reg, TUSB_DIR_OUT);\n    } else if ((ch_reg & U_CH_TX_STTX) == U_CH_TX_NAK) {\n      ch_handle_nak(ch_id, ch_reg, TUSB_DIR_OUT);\n    } else if ((ch_reg & U_CH_TX_STTX) == U_CH_TX_STALL) {\n      ch_handle_stall(ch_id, ch_reg, TUSB_DIR_OUT);\n    }\n  } else {\n    ch_handle_error(ch_id, ch_reg, TUSB_DIR_OUT);\n  }\n}\n\n// Handle CTR interrupt for the RX/IN direction\nstatic inline void handle_ctr_rx(uint32_t ch_id) {\n  uint32_t ch_reg = ch_read(ch_id) | U_EP_CTR_TX | U_EP_CTR_RX;\n  hcd_channel_t* channel = &_hcd_data.channel[ch_id];\n  TU_VERIFY(channel->in.allocated == 1,);\n\n  if ((ch_reg & U_EP_ERRRX) == 0U) {\n    // No error\n    if ((ch_reg & U_CH_RX_STRX) == U_CH_RX_ACK_SBUF) {\n      ch_handle_ack(ch_id, ch_reg, TUSB_DIR_IN);\n    } else if ((ch_reg & U_CH_RX_STRX) == U_CH_RX_NAK) {\n      ch_handle_nak(ch_id, ch_reg, TUSB_DIR_IN);\n    } else if ((ch_reg & U_CH_RX_STRX) == U_CH_RX_STALL){\n      ch_handle_stall(ch_id, ch_reg, TUSB_DIR_IN);\n    }\n  } else {\n    ch_handle_error(ch_id, ch_reg, TUSB_DIR_IN);\n  }\n}\n\n// Interrupt Handler\nvoid hcd_int_handler(uint8_t rhport, bool in_isr) {\n  uint32_t int_status = FSDEV_REG->ISTR;\n\n  // Start of Frame\n  if (int_status & U_ISTR_SOF) {\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_SOF;\n    sof_handler();\n  }\n\n  // Port Change Detected (Connection/Disconnection)\n  if (int_status & U_ISTR_DCON) {\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_DCON;\n    port_status_handler(rhport, in_isr);\n  }\n\n  // Handle transfer complete (CTR)\n  while (FSDEV_REG->ISTR & U_ISTR_CTR) {\n    uint32_t const ch_id = FSDEV_REG->ISTR & U_ISTR_EP_ID;\n    uint32_t const ch_reg = ch_read(ch_id);\n\n    if (ch_reg & U_EP_CTR_RX) {\n      ch_write_clear_ctr(ch_id, TUSB_DIR_IN);\n      handle_ctr_rx(ch_id);\n    }\n\n    if (ch_reg & U_EP_CTR_TX) {\n      ch_write_clear_ctr(ch_id, TUSB_DIR_OUT);\n      handle_ctr_tx(ch_id);\n    }\n  }\n\n  if (int_status & U_ISTR_ERR) {\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_ERR;\n    // TODO: Handle error\n  }\n\n  if (int_status & U_ISTR_PMAOVR) {\n    TU_BREAKPOINT();\n    FSDEV_REG->ISTR = (fsdev_bus_t)~U_ISTR_PMAOVR;\n  }\n}\n\n// Enable USB interrupt\nvoid hcd_int_enable(uint8_t rhport) {\n  fsdev_int_enable(rhport);\n}\n\n// Disable USB interrupt\nvoid hcd_int_disable(uint8_t rhport) {\n  fsdev_int_disable(rhport);\n}\n\n// Get frame number (1ms)\nuint32_t hcd_frame_number(uint8_t rhport) {\n  (void) rhport;\n  return FSDEV_REG->FNR & U_FNR_FN;\n}\n\n//--------------------------------------------------------------------+\n// Port API\n//--------------------------------------------------------------------+\n\n// Get the current connect status of roothub port\nbool hcd_port_connect_status(uint8_t rhport) {\n  (void) rhport;\n  return _hcd_data.connected;\n}\n\n// Reset USB bus on the port\nvoid hcd_port_reset(uint8_t rhport) {\n  (void) rhport;\n  FSDEV_REG->CNTR |= U_CNTR_FRES;\n}\n\n// Complete bus reset sequence\nvoid hcd_port_reset_end(uint8_t rhport) {\n  (void) rhport;\n  FSDEV_REG->CNTR &= ~U_CNTR_FRES;\n}\n\n// Get port link speed\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  (void) rhport;\n  if ((FSDEV_REG->ISTR & U_ISTR_LS_DCONN) != 0U) {\n    return TUSB_SPEED_LOW;\n  } else {\n    return TUSB_SPEED_FULL;\n  }\n}\n\n// HCD closes all opened endpoints belonging to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  (void) rhport;\n\n  // Close all endpoints for this device\n  for(uint32_t i = 0; i < CFG_TUH_FSDEV_ENDPOINT_MAX; i++) {\n    hcd_endpoint_t* edpt = &_hcd_data.edpt[i];\n    if (edpt->allocated == 1 && edpt->dev_addr == dev_addr) {\n      edpoint_close(i);\n    }\n  }\n\n}\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\n\n// Open an endpoint\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const *ep_desc) {\n  (void) rhport;\n\n  uint8_t const ep_addr = ep_desc->bEndpointAddress;\n  uint16_t const packet_size = tu_edpt_packet_size(ep_desc);\n  uint8_t const ep_type = ep_desc->bmAttributes.xfer;\n\n  uint8_t const ep_id = endpoint_alloc();\n  TU_ASSERT(ep_id != TUSB_INDEX_INVALID_8);\n\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n  edpt->dev_addr = dev_addr;\n  edpt->ep_addr = ep_addr;\n  edpt->ep_type = ep_type;\n  edpt->max_packet_size = packet_size;\n  edpt->interval = ep_desc->bInterval;\n  edpt->pid = 0;\n  edpt->ls_pre = (hcd_port_speed_get(rhport) == TUSB_SPEED_FULL && tuh_speed_get(dev_addr) == TUSB_SPEED_LOW) ? 1 : 0;\n\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const ep_id = endpoint_find(dev_addr, ep_addr);\n  TU_ASSERT(ep_id != TUSB_INDEX_INVALID_8);\n\n  edpoint_close(ep_id);\n\n  return true;\n}\n\n// Submit a transfer\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen) {\n  (void) rhport;\n\n  TU_LOG(FSDEV_DEBUG, \"hcd_edpt_xfer addr=%u ep=0x%02X len=%u\\r\\n\", dev_addr, ep_addr, buflen);\n\n  uint8_t const ep_id = endpoint_find(dev_addr, ep_addr);\n  TU_ASSERT(ep_id != TUSB_INDEX_INVALID_8);\n\n  hcd_endpoint_t *edpt = &_hcd_data.edpt[ep_id];\n\n  edpt->buffer = buffer;\n  edpt->buflen = buflen;\n  edpt->queued_len = 0;\n\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  if (ep_num == 0) {\n    // update ep_dir since control endpoint can switch direction\n    edpt->ep_addr = ep_addr;\n  }\n\n  return edpt_xfer_kickoff(ep_id);\n}\n\n// Abort a queued transfer\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const ep_id = endpoint_find(dev_addr, ep_addr);\n  TU_ASSERT(ep_id != TUSB_INDEX_INVALID_8);\n  tusb_dir_t const dir = tu_edpt_dir(ep_addr);\n\n  for (uint8_t i = 0; i < FSDEV_EP_COUNT; i++) {\n    hcd_channel_t* channel = &_hcd_data.channel[i];\n    uint8_t const allocated = (dir == TUSB_DIR_OUT) ? channel->out.allocated : channel->in.allocated;\n\n    if (allocated == 1 &&\n        channel->dev_addr == dev_addr &&\n        channel->ep_num == tu_edpt_number(ep_addr)) {\n      channel_dealloc(channel, dir);\n      uint32_t ch_reg = ch_read(i) | U_EP_CTR_TX | U_EP_CTR_RX;\n      channel_write_status(i, ch_reg, dir, EP_STAT_DISABLED, true);\n    }\n  }\n\n  return true;\n}\n\n// Submit a special transfer to send 8-byte Setup Packet\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8]) {\n  (void) rhport;\n\n  uint8_t const ep_id = endpoint_find(dev_addr, 0);\n  TU_ASSERT(ep_id != TUSB_INDEX_INVALID_8);\n\n  hcd_endpoint_t *edpt = &_hcd_data.edpt[ep_id];\n  edpt->next_setup = true;\n  edpt->pid = 0;\n\n  return hcd_edpt_xfer(rhport, dev_addr, 0, (uint8_t*)(uintptr_t) setup_packet, 8);\n}\n\n// Clear stall, data toggle is also reset to DATA0\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const ep_id = endpoint_find(dev_addr, ep_addr);\n  TU_ASSERT(ep_id != TUSB_INDEX_INVALID_8);\n\n  hcd_endpoint_t *edpt = &_hcd_data.edpt[ep_id];\n  edpt->pid = 0;\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Helper Functions\n//--------------------------------------------------------------------+\n\nstatic uint8_t endpoint_alloc(void) {\n  for (uint32_t i = 0; i < CFG_TUH_FSDEV_ENDPOINT_MAX; i++) {\n    hcd_endpoint_t* edpt = &_hcd_data.edpt[i];\n    if (edpt->allocated == 0) {\n      edpt->allocated = 1;\n      return i;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\nstatic uint8_t endpoint_find(uint8_t dev_addr, uint8_t ep_addr) {\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  tusb_dir_t const ep_dir = tu_edpt_dir(ep_addr);\n\n  for (uint32_t i = 0; i < (uint32_t)CFG_TUH_FSDEV_ENDPOINT_MAX; i++) {\n    hcd_endpoint_t* edpt = &_hcd_data.edpt[i];\n    tusb_dir_t const dir = tu_edpt_dir(edpt->ep_addr);\n    uint8_t const num = tu_edpt_number(edpt->ep_addr);\n    // Match both ep_num and ep_dir, or match ep_num 0 (control endpoint)\n    if (edpt->allocated == 1 && edpt->dev_addr == dev_addr && num == ep_num &&\n        (dir == ep_dir || ep_num == 0)) {\n      return i;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\n// close an opened endpoint\nstatic void edpoint_close(uint8_t ep_id) {\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n  endpoint_dealloc(edpt);\n\n  // disable active channel belong to this endpoint\n  for (uint8_t i = 0; i < FSDEV_EP_COUNT; i++) {\n    hcd_channel_t* channel = &_hcd_data.channel[i];\n    uint32_t ch_reg = ch_read(i) | U_EP_CTR_TX | U_EP_CTR_RX;\n    if (channel->out.allocated == 1 && channel->out.edpt == edpt) {\n      channel_dealloc(channel, TUSB_DIR_OUT);\n      channel_write_status(i, ch_reg, TUSB_DIR_OUT, EP_STAT_DISABLED, true);\n    }\n    if (channel->in.allocated == 1 && channel->in.edpt == edpt) {\n      channel_dealloc(channel, TUSB_DIR_IN);\n      channel_write_status(i, ch_reg, TUSB_DIR_IN, EP_STAT_DISABLED, true);\n    }\n  }\n}\n\n// Allocate PMA buffer\nstatic uint32_t hcd_pma_alloc(uint8_t channel, tusb_dir_t dir, uint16_t len) {\n  (void) len;\n  // Simple static allocation as we are unlikely to handle ISO endpoints in host mode\n  // We just give each channel two buffers of max packet size (64 bytes) for IN and OUT\n\n  uint16_t addr = FSDEV_BTABLE_BASE + 8 * FSDEV_EP_COUNT;\n  addr += channel * TUSB_EPSIZE_BULK_FS * 2 + (dir == TUSB_DIR_IN ? TUSB_EPSIZE_BULK_FS : 0);\n\n  TU_ASSERT(addr <= CFG_TUSB_FSDEV_PMA_SIZE, 0xFFFF);\n\n  return addr;\n}\n\n// Allocate hardware channel\nstatic uint8_t channel_alloc(uint8_t dev_addr, uint8_t ep_addr, uint8_t ep_type) {\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  tusb_dir_t const dir = tu_edpt_dir(ep_addr);\n\n  // Find channel allocate for same ep_num but other direction\n  tusb_dir_t const other_dir = (dir == TUSB_DIR_IN) ? TUSB_DIR_OUT : TUSB_DIR_IN;\n  for (uint8_t i = 0; i < FSDEV_EP_COUNT; i++) {\n    uint8_t const allocated_dir = (dir == TUSB_DIR_OUT) ? _hcd_data.channel[i].out.allocated : _hcd_data.channel[i].in.allocated;\n    uint8_t const allocated_other = (other_dir == TUSB_DIR_OUT) ? _hcd_data.channel[i].out.allocated : _hcd_data.channel[i].in.allocated;\n    if (allocated_dir == 0 &&\n        allocated_other == 1 &&\n        _hcd_data.channel[i].dev_addr == dev_addr &&\n        _hcd_data.channel[i].ep_num == ep_num &&\n        _hcd_data.channel[i].ep_type == ep_type) {\n      if (dir == TUSB_DIR_OUT) {\n        _hcd_data.channel[i].out.allocated = 1;\n        _hcd_data.channel[i].out.retry = 0;\n      } else {\n        _hcd_data.channel[i].in.allocated = 1;\n        _hcd_data.channel[i].in.retry = 0;\n      }\n      return i;\n    }\n  }\n\n  // Find free channel\n  for (uint8_t i = 0; i < FSDEV_EP_COUNT; i++) {\n    if (_hcd_data.channel[i].out.allocated == 0 && _hcd_data.channel[i].in.allocated == 0) {\n      _hcd_data.channel[i].dev_addr = dev_addr;\n      _hcd_data.channel[i].ep_num = ep_num;\n      _hcd_data.channel[i].ep_type = ep_type;\n      if (dir == TUSB_DIR_OUT) {\n        _hcd_data.channel[i].out.allocated = 1;\n        _hcd_data.channel[i].out.retry = 0;\n      } else {\n        _hcd_data.channel[i].in.allocated = 1;\n        _hcd_data.channel[i].in.retry = 0;\n      }\n      return i;\n    }\n  }\n\n  // Allocation failed\n  return TUSB_INDEX_INVALID_8;\n}\n\n// kick-off transfer with an endpoint\nstatic bool edpt_xfer_kickoff(uint8_t ep_id) {\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n  uint8_t ch_id = channel_alloc(edpt->dev_addr, edpt->ep_addr, edpt->ep_type);\n  TU_ASSERT(ch_id != TUSB_INDEX_INVALID_8); // all channel are in used\n\n  tusb_dir_t const dir = tu_edpt_dir(edpt->ep_addr);\n  hcd_channel_t* channel = &_hcd_data.channel[ch_id];\n  if (dir == TUSB_DIR_OUT) {\n    channel->out.edpt = edpt;\n  } else {\n    channel->in.edpt = edpt;\n  }\n\n  return channel_xfer_start(ch_id, dir);\n}\n\nstatic bool channel_xfer_start(uint8_t ch_id, tusb_dir_t dir) {\n  hcd_channel_t* channel = &_hcd_data.channel[ch_id];\n  hcd_endpoint_t* edpt = (dir == TUSB_DIR_OUT) ? channel->out.edpt : channel->in.edpt;\n\n  uint32_t ch_reg = ch_read(ch_id) & ~U_EPREG_MASK;\n  ch_reg |= tu_edpt_number(edpt->ep_addr) | edpt->dev_addr << U_EP_DEVADDR_Pos |\n          U_EP_CTR_TX | U_EP_CTR_RX;\n\n  // Set type\n  switch (edpt->ep_type) {\n    case TUSB_XFER_BULK:\n      ch_reg |= U_EP_BULK;\n      break;\n    case TUSB_XFER_INTERRUPT:\n      ch_reg |= U_EP_INTERRUPT;\n      break;\n\n    case TUSB_XFER_CONTROL:\n      ch_reg |= U_EP_CONTROL;\n      break;\n\n    default:\n      // Note: ISO endpoint is unsupported\n      TU_ASSERT(false);\n  }\n\n  /* Create a packet memory buffer area. */\n  uint16_t pma_addr = hcd_pma_alloc(ch_id, dir, edpt->max_packet_size);\n  btable_set_addr(ch_id, dir == TUSB_DIR_OUT ? BTABLE_BUF_TX : BTABLE_BUF_RX, pma_addr);\n\n  if (dir == TUSB_DIR_OUT) {\n    uint16_t const len = tu_min16(edpt->buflen - edpt->queued_len, edpt->max_packet_size);\n    tu_hwfifo_write(PMA_BUF_AT(pma_addr), &(edpt->buffer[edpt->queued_len]), len, NULL);\n    btable_set_count(ch_id, BTABLE_BUF_TX, len);\n\n    edpt->queued_len += len;\n  } else {\n    btable_set_rx_bufsize(ch_id, BTABLE_BUF_RX, edpt->max_packet_size);\n  }\n\n  if (edpt->ls_pre == 1) {\n    ch_reg |= U_EP_LSEP;\n  } else {\n    ch_reg &= ~U_EP_LSEP;\n  }\n\n  // Setup DATA/STATUS phase start with DATA1\n  if (tu_edpt_number(edpt->ep_addr) == 0) {\n    edpt->pid = 1;\n  }\n\n  if (edpt->next_setup) {\n    edpt->next_setup = false;\n    ch_reg |= U_EP_SETUP;\n    edpt->pid = 0;\n  }\n\n  ch_change_status(&ch_reg, dir, EP_STAT_VALID);\n  ch_change_dtog(&ch_reg, dir, edpt->pid);\n  ch_reg &= U_EPREG_MASK | CH_STAT_MASK(dir) | CH_DTOG_MASK(dir);\n  ch_write(ch_id, ch_reg, true);\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/st/typec/typec_stm32.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#include \"tusb_option.h\"\n#include \"typec/tcd.h\"\n\n#if CFG_TUC_ENABLED && defined(TUP_USBIP_TYPEC_STM32)\n\n#include \"common/tusb_common.h\"\n\n#if CFG_TUSB_MCU == OPT_MCU_STM32G4\n  #include \"stm32g4xx.h\"\n  #include \"stm32g4xx_ll_dma.h\" // for UCPD REQID\n#else\n  #error \"Unsupported STM32 family\"\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nenum {\n  IMR_ATTACHED = UCPD_IMR_TXMSGDISCIE | UCPD_IMR_TXMSGSENTIE | UCPD_IMR_TXMSGABTIE | UCPD_IMR_TXUNDIE |\n                 UCPD_IMR_RXHRSTDETIE | UCPD_IMR_RXOVRIE | UCPD_IMR_RXMSGENDIE | UCPD_IMR_RXORDDETIE |\n                 UCPD_IMR_HRSTDISCIE | UCPD_IMR_HRSTSENTIE | UCPD_IMR_FRSEVTIE\n};\n\n#define PHY_SYNC1 0x18u\n#define PHY_SYNC2 0x11u\n#define PHY_SYNC3 0x06u\n#define PHY_RST1  0x07u\n#define PHY_RST2  0x19u\n#define PHY_EOP   0x0Du\n\n#define PHY_ORDERED_SET_SOP          (PHY_SYNC1 | (PHY_SYNC1<<5u) | (PHY_SYNC1<<10u) | (PHY_SYNC2<<15u)) // SOP Ordered set coding\n#define PHY_ORDERED_SET_SOP_P        (PHY_SYNC1 | (PHY_SYNC1<<5u) | (PHY_SYNC3<<10u) | (PHY_SYNC3<<15u)) // SOP' Ordered set coding\n#define PHY_ORDERED_SET_SOP_PP       (PHY_SYNC1 | (PHY_SYNC3<<5u) | (PHY_SYNC1<<10u) | (PHY_SYNC3<<15u)) // SOP'' Ordered set coding\n#define PHY_ORDERED_SET_HARD_RESET   (PHY_RST1  | (PHY_RST1<<5u)  | (PHY_RST1<<10u)  | (PHY_RST2<<15u )) // Hard Reset Ordered set coding\n#define PHY_ORDERED_SET_CABLE_RESET  (PHY_RST1  | (PHY_SYNC1<<5u) | (PHY_RST1<<10u)  | (PHY_SYNC3<<15u)) // Cable Reset Ordered set coding\n#define PHY_ORDERED_SET_SOP_P_DEBUG  (PHY_SYNC1 | (PHY_RST2<<5u)  | (PHY_RST2<<10u)  | (PHY_SYNC3<<15u)) // SOP' Debug Ordered set coding\n#define PHY_ORDERED_SET_SOP_PP_DEBUG (PHY_SYNC1 | (PHY_RST2<<5u)  | (PHY_SYNC3<<10u) | (PHY_SYNC2<<15u)) // SOP'' Debug Ordered set coding\n\n\nstatic uint8_t const* _rx_buf;\nstatic uint8_t const* _tx_pending_buf;\nstatic uint16_t _tx_pending_bytes;\nstatic uint16_t _tx_xferring_bytes;\n\nstatic pd_header_t _good_crc = {\n    .msg_type   = PD_CTRL_GOOD_CRC,\n    .data_role  = 0, // UFP\n    .specs_rev  = PD_REV_20,\n    .power_role = 0, // Sink\n    .msg_id     = 0,\n    .n_data_obj = 0,\n    .extended   = 0\n};\n\n// address of DMA channel rx, tx for each port\n#define CFG_TUC_STM32_DMA  { { DMA1_Channel1_BASE, DMA1_Channel2_BASE } }\n\n//--------------------------------------------------------------------+\n// DMA\n//--------------------------------------------------------------------+\n\nstatic const uint32_t _dma_addr_arr[TUP_TYPEC_RHPORTS_NUM][2] = CFG_TUC_STM32_DMA;\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t dma_get_addr(uint8_t rhport, bool is_rx) {\n  return _dma_addr_arr[rhport][is_rx ? 0 : 1];\n}\n\nstatic void dma_init(uint8_t rhport, bool is_rx) {\n  uint32_t dma_addr = dma_get_addr(rhport, is_rx);\n  DMA_Channel_TypeDef* dma_ch = (DMA_Channel_TypeDef*) dma_addr;\n  uint32_t req_id;\n\n  if (is_rx) {\n    // Peripheral -> Memory, Memory inc, 8-bit, High priority\n    dma_ch->CCR = DMA_CCR_MINC | DMA_CCR_PL_1;\n    dma_ch->CPAR = (uint32_t) &UCPD1->RXDR;\n\n    req_id = LL_DMAMUX_REQ_UCPD1_RX;\n  } else {\n    // Memory -> Peripheral, Memory inc, 8-bit, High priority\n    dma_ch->CCR = DMA_CCR_MINC | DMA_CCR_PL_1 | DMA_CCR_DIR;\n    dma_ch->CPAR = (uint32_t) &UCPD1->TXDR;\n\n    req_id = LL_DMAMUX_REQ_UCPD1_TX;\n  }\n\n  // find and set up mux channel TODO support mcu with multiple DMAMUXs\n  enum {\n    CH_DIFF = DMA1_Channel2_BASE - DMA1_Channel1_BASE\n  };\n  uint32_t mux_ch_num;\n\n  #ifdef DMA2_BASE\n  if (dma_addr > DMA2_BASE) {\n    mux_ch_num = 8 * ((dma_addr - DMA2_Channel1_BASE) / CH_DIFF);\n  } else\n  #endif\n  {\n    mux_ch_num = (dma_addr - DMA1_Channel1_BASE) / CH_DIFF;\n  }\n\n  DMAMUX_Channel_TypeDef* mux_ch = DMAMUX1_Channel0 + mux_ch_num;\n\n  uint32_t mux_ccr = mux_ch->CCR & ~(DMAMUX_CxCR_DMAREQ_ID);\n  mux_ccr |= req_id;\n  mux_ch->CCR = mux_ccr;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dma_start(uint8_t rhport, bool is_rx, void const* buf, uint16_t len) {\n  DMA_Channel_TypeDef* dma_ch = (DMA_Channel_TypeDef*) dma_get_addr(rhport, is_rx);\n\n  dma_ch->CMAR = (uint32_t) buf;\n  dma_ch->CNDTR = len;\n  dma_ch->CCR |= DMA_CCR_EN;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dma_stop(uint8_t rhport, bool is_rx) {\n  DMA_Channel_TypeDef* dma_ch = (DMA_Channel_TypeDef*) dma_get_addr(rhport, is_rx);\n  dma_ch->CCR &= ~DMA_CCR_EN;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool dma_enabled(uint8_t rhport, bool is_rx) {\n  DMA_Channel_TypeDef* dma_ch = (DMA_Channel_TypeDef*) dma_get_addr(rhport, is_rx);\n  return dma_ch->CCR & DMA_CCR_EN;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dma_tx_start(uint8_t rhport, void const* buf, uint16_t len) {\n  UCPD1->TX_ORDSET = PHY_ORDERED_SET_SOP;\n  UCPD1->TX_PAYSZ = len;\n  dma_start(rhport, false, buf, len);\n  UCPD1->CR |= UCPD_CR_TXSEND;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dma_tx_stop(uint8_t rhport) {\n  dma_stop(rhport, false);\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nbool tcd_init(uint8_t rhport, uint32_t port_type) {\n  (void) rhport;\n\n  // Init DMA for RX, TX\n  dma_init(rhport, true);\n  dma_init(rhport, false);\n\n  // Initialization phase: CFG1, detect all SOPs\n  UCPD1->CFG1 = (0x0d << UCPD_CFG1_HBITCLKDIV_Pos) | (0x10 << UCPD_CFG1_IFRGAP_Pos) | (0x07 << UCPD_CFG1_TRANSWIN_Pos) |\n                (0x01 << UCPD_CFG1_PSC_UCPDCLK_Pos) | (0x1f << UCPD_CFG1_RXORDSETEN_Pos);\n  UCPD1->CFG1 |= UCPD_CFG1_UCPDEN;\n\n  // General programming sequence (with UCPD configured then enabled)\n  if (port_type == TUSB_TYPEC_PORT_SNK) {\n    // Set analog mode enable both CC Phy\n    UCPD1->CR = (0x01 << UCPD_CR_ANAMODE_Pos) | (UCPD_CR_CCENABLE_0 | UCPD_CR_CCENABLE_1);\n\n    // Read Voltage State on CC1 & CC2 fore initial state\n    uint32_t v_cc[2];\n    (void) v_cc;\n    v_cc[0] = (UCPD1->SR >> UCPD_SR_TYPEC_VSTATE_CC1_Pos) & 0x03;\n    v_cc[1] = (UCPD1->SR >> UCPD_SR_TYPEC_VSTATE_CC2_Pos) & 0x03;\n    TU_LOG1(\"Initial VState CC1 = %lu, CC2 = %lu\\r\\n\", v_cc[0], v_cc[1]);\n\n    // Enable CC1 & CC2 Interrupt\n    UCPD1->IMR = UCPD_IMR_TYPECEVT1IE | UCPD_IMR_TYPECEVT2IE;\n  }\n\n  // Disable dead battery in PWR's CR3\n  PWR->CR3 |= PWR_CR3_UCPD_DBDIS;\n\n  return true;\n}\n\n// Enable interrupt\nvoid tcd_int_enable (uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(UCPD1_IRQn);\n}\n\n// Disable interrupt\nvoid tcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(UCPD1_IRQn);\n}\n\nbool tcd_msg_receive(uint8_t rhport, uint8_t* buffer, uint16_t total_bytes) {\n  _rx_buf = buffer;\n  dma_start(rhport, true, buffer, total_bytes);\n  return true;\n}\n\nbool tcd_msg_send(uint8_t rhport, uint8_t const* buffer, uint16_t total_bytes) {\n  (void) rhport;\n\n  if (dma_enabled(rhport, false)) {\n    // DMA is busy, probably sending GoodCRC, save as pending TX\n    _tx_pending_buf = buffer;\n    _tx_pending_bytes = total_bytes;\n  }else {\n    // DMA is free, start sending\n    _tx_pending_buf = NULL;\n    _tx_pending_bytes = 0;\n\n    _tx_xferring_bytes = total_bytes;\n    dma_tx_start(rhport, buffer, total_bytes);\n  }\n\n  return true;\n}\n\nvoid tcd_int_handler(uint8_t rhport) {\n  (void) rhport;\n\n  uint32_t sr = UCPD1->SR;\n  sr &= UCPD1->IMR;\n\n  if (sr & (UCPD_SR_TYPECEVT1 | UCPD_SR_TYPECEVT2)) {\n    uint32_t v_cc[2];\n    v_cc[0] = (UCPD1->SR >> UCPD_SR_TYPEC_VSTATE_CC1_Pos) & 0x03;\n    v_cc[1] = (UCPD1->SR >> UCPD_SR_TYPEC_VSTATE_CC2_Pos) & 0x03;\n\n    TU_LOG3(\"VState CC1 = %lu, CC2 = %lu\\r\\n\", v_cc[0], v_cc[1]);\n\n    uint32_t cr = UCPD1->CR;\n\n    // TODO only support SNK for now, required highest voltage for now\n    // Enable PHY on active CC and disable Rd on other CC\n    // FIXME somehow CC2 is vstate is not correct, always 1 even not attached.\n    // on DPOW1 board, it is connected to PA10 (USBPD_DBCC2), we probably miss something.\n    if ((sr & UCPD_SR_TYPECEVT1) && (v_cc[0] == 3)) {\n      TU_LOG3(\"Attach CC1\\r\\n\");\n      cr &= ~(UCPD_CR_PHYCCSEL | UCPD_CR_CCENABLE);\n      cr |= UCPD_CR_PHYRXEN | UCPD_CR_CCENABLE_0;\n    } else if ((sr & UCPD_SR_TYPECEVT2) && (v_cc[1] == 3)) {\n      TU_LOG3(\"Attach CC2\\r\\n\");\n      cr &= ~UCPD_CR_CCENABLE;\n      cr |= (UCPD_CR_PHYCCSEL | UCPD_CR_PHYRXEN | UCPD_CR_CCENABLE_1);\n    } else {\n      TU_LOG3(\"Detach\\r\\n\");\n      cr &= ~UCPD_CR_PHYRXEN;\n      cr |= UCPD_CR_CCENABLE_0 | UCPD_CR_CCENABLE_1;\n    }\n\n    if (cr & UCPD_CR_PHYRXEN) {\n      // Attached\n      UCPD1->IMR |= IMR_ATTACHED;\n      UCPD1->CFG1 |= UCPD_CFG1_RXDMAEN | UCPD_CFG1_TXDMAEN;\n    }else {\n      // Detached\n      UCPD1->CFG1 &= ~(UCPD_CFG1_RXDMAEN | UCPD_CFG1_TXDMAEN);\n      UCPD1->IMR &= ~IMR_ATTACHED;\n    }\n\n    // notify stack\n    tcd_event_cc_changed(rhport, v_cc[0], v_cc[1], true);\n\n    UCPD1->CR = cr;\n\n    // ack\n    UCPD1->ICR = UCPD_ICR_TYPECEVT1CF | UCPD_ICR_TYPECEVT2CF;\n  }\n\n  //------------- RX -------------//\n  if (sr & UCPD_SR_RXORDDET) {\n    // SOP: Start of Packet.\n    TU_LOG3(\"SOP\\r\\n\");\n    // UCPD1->RX_ORDSET & UCPD_RX_ORDSET_RXORDSET_Msk;\n\n    // ack\n    UCPD1->ICR = UCPD_ICR_RXORDDETCF;\n  }\n\n  // Received full message\n  if (sr & UCPD_SR_RXMSGEND) {\n    TU_LOG3(\"RX MSG END\\r\\n\");\n\n    // stop TX\n    dma_stop(rhport, true);\n\n    uint8_t result;\n\n    if (!(sr & UCPD_SR_RXERR)) {\n      // response with good crc\n      // TODO move this to usbc stack\n      if (_rx_buf) {\n        _good_crc.msg_id = ((pd_header_t const *) _rx_buf)->msg_id;\n        dma_tx_start(rhport, &_good_crc, 2);\n      }\n\n      result = XFER_RESULT_SUCCESS;\n    }else {\n      // CRC failed\n      result = XFER_RESULT_FAILED;\n    }\n\n    // notify stack\n    tcd_event_rx_complete(rhport, UCPD1->RX_PAYSZ, result, true);\n\n    // ack\n    UCPD1->ICR = UCPD_ICR_RXMSGENDCF;\n  }\n\n  if (sr & UCPD_SR_RXOVR) {\n    TU_LOG3(\"RXOVR\\r\\n\");\n    // ack\n    UCPD1->ICR = UCPD_ICR_RXOVRCF;\n  }\n\n  //------------- TX -------------//\n  // All tx events: complete and error\n  if (sr & (UCPD_SR_TXMSGSENT | (UCPD_SR_TXMSGDISC | UCPD_SR_TXMSGABT | UCPD_SR_TXUND))) {\n    // force TX stop\n    dma_tx_stop(rhport);\n\n    uint16_t const xferred_bytes = _tx_xferring_bytes - UCPD1->TX_PAYSZ;\n    uint8_t result;\n\n    if ( sr & UCPD_SR_TXMSGSENT ) {\n      TU_LOG3(\"TX MSG SENT\\r\\n\");\n      result = XFER_RESULT_SUCCESS;\n      // ack\n      UCPD1->ICR = UCPD_ICR_TXMSGSENTCF;\n    }else {\n      TU_LOG3(\"TX Error\\r\\n\");\n      result = XFER_RESULT_FAILED;\n      // ack\n      UCPD1->ICR = UCPD_SR_TXMSGDISC | UCPD_SR_TXMSGABT | UCPD_SR_TXUND;\n    }\n\n    // start pending TX if any\n    if (_tx_pending_buf && _tx_pending_bytes ) {\n      // Start the pending TX\n      dma_tx_start(rhport, _tx_pending_buf, _tx_pending_bytes);\n\n      // clear pending\n      _tx_pending_buf = NULL;\n      _tx_pending_bytes = 0;\n    }\n\n    // notify stack\n    tcd_event_tx_complete(rhport, xferred_bytes, result, true);\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/sunxi/dcd_sunxi_musb.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Koji KITAYAMA\n * Copyright (c) 2021 Tian Yunhao (t123yh)\n * Copyright (c) 2021 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include <stdint.h>\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_F1C100S\n\n#include \"osal/osal.h\"\n#include <f1c100s-irq.h>\n#include <device/dcd.h>\n#include \"musb_def.h\"\n\ntypedef uint32_t u32;\ntypedef uint16_t u16;\ntypedef uint8_t u8;\n\n\n#define REQUEST_TYPE_INVALID  (0xFFu)\n\ntypedef struct {\n  uint_fast16_t beg; /* offset of including first element */\n  uint_fast16_t end; /* offset of excluding the last element */\n} free_block_t;\n\ntypedef struct TU_ATTR_PACKED\n{\n  void      *buf;      /* the start address of a transfer data buffer */\n  uint16_t  length;    /* the number of bytes in the buffer */\n  uint16_t  remaining; /* the number of bytes remaining in the buffer */\n} pipe_state_t;\n\ntypedef struct\n{\n  CFG_TUD_MEM_ALIGN tusb_control_request_t setup_packet;\n  uint16_t     remaining_ctrl; /* The number of bytes remaining in data stage of control transfer. */\n  int8_t       status_out;\n  pipe_state_t pipe0;\n  pipe_state_t pipe[2][7];   /* pipe[direction][endpoint number - 1] */\n  uint16_t     pipe_buf_is_fifo[2]; /* Bitmap. Each bit means whether 1:TU_FIFO or 0:POD. */\n} dcd_data_t;\n\n/*------------------------------------------------------------------\n * SUNXI FUNCTION\n *------------------------------------------------------------------*/\n\nstatic void usb_phy_write(int addr, int data, int len)\n{\n\tint j = 0, usbc_bit = 0;\n\tvoid *dest = (void *)USBC_REG_CSR(USBC0_BASE);\n\n\tusbc_bit = 1 << (0 * 2);\n\tfor (j = 0; j < len; j++)\n\t{\n\t\t/* set the bit address to be written */\n\t\tUSBC_ClrBit_Mask_l(dest, 0xff << 8);\n\t\tUSBC_SetBit_Mask_l(dest, (addr + j) << 8);\n\n\t\tUSBC_ClrBit_Mask_l(dest, usbc_bit);\n\t\t/* set data bit */\n\t\tif (data & 0x1)\n\t\t\tUSBC_SetBit_Mask_l(dest, 1 << 7);\n\t\telse\n\t\t\tUSBC_ClrBit_Mask_l(dest, 1 << 7);\n\n\t\tUSBC_SetBit_Mask_l(dest, usbc_bit);\n\n\t\tUSBC_ClrBit_Mask_l(dest, usbc_bit);\n\n\t\tdata >>= 1;\n\t}\n}\n\nstatic void USBC_HardwareReset(void)\n{\n  // Reset phy and controller\n  USBC_REG_set_bit_l(USBPHY_CLK_RST_BIT, USBPHY_CLK_REG);\n\tUSBC_REG_set_bit_l(BUS_RST_USB_BIT, BUS_CLK_RST_REG);\n  tusb_time_delay_ms_api(2);\n\n\tUSBC_REG_set_bit_l(USBPHY_CLK_GAT_BIT, USBPHY_CLK_REG);\n  USBC_REG_set_bit_l(USBPHY_CLK_RST_BIT, USBPHY_CLK_REG);\n\n\tUSBC_REG_set_bit_l(BUS_CLK_USB_BIT, BUS_CLK_GATE0_REG);\n\tUSBC_REG_set_bit_l(BUS_RST_USB_BIT, BUS_CLK_RST_REG);\n}\n\nstatic void USBC_PhyConfig(void)\n{\n\t/* Regulation 45 ohms */\n\tusb_phy_write(0x0c, 0x01, 1);\n\n\t/* adjust PHY's magnitude and rate */\n\tusb_phy_write(0x20, 0x14, 5);\n\n\t/* threshold adjustment disconnect */\n\tusb_phy_write(0x2a, 3, 2);\n\n\treturn;\n}\n\nstatic void USBC_ConfigFIFO_Base(void)\n{\n\tu32 reg_value;\n\n\t/* config usb fifo, 8kb mode */\n\treg_value = USBC_Readl(SUNXI_SRAMC_BASE + 0x04);\n\treg_value &= ~(0x03 << 0);\n\treg_value |= (1 << 0);\n\tUSBC_Writel(reg_value, SUNXI_SRAMC_BASE + 0x04);\n}\n\nstatic unsigned int USBC_WakeUp_ClearChangeDetect(unsigned int reg_val)\n{\n\tunsigned int temp = reg_val;\n    /* vbus, id, dpdm, these bit is set 1 to clear, so we clear these bit when operate other bits */\n\ttemp &= ~(1 << USBC_BP_ISCR_VBUS_CHANGE_DETECT);\n\ttemp &= ~(1 << USBC_BP_ISCR_ID_CHANGE_DETECT);\n\ttemp &= ~(1 << USBC_BP_ISCR_DPDM_CHANGE_DETECT);\n\n\treturn temp;\n}\n\nstatic void USBC_EnableDpDmPullUp(void)\n{\n\tu32 reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));\n\treg_val |= (1 << USBC_BP_ISCR_DPDM_PULLUP_EN);\n\treg_val |= 3<<USBC_BP_ISCR_VBUS_VALID_SRC;\n\treg_val = USBC_WakeUp_ClearChangeDetect(reg_val);\n\tUSBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));\n}\n\nstatic void USBC_ForceIdToHigh(void)\n{\n\t/* first write 00, then write 10 */\n\tu32 reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));\n\treg_val |= (0x03 << USBC_BP_ISCR_FORCE_ID);\n\treg_val = USBC_WakeUp_ClearChangeDetect(reg_val);\n\tUSBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));\n}\n\nstatic void USBC_ForceVbusValidToHigh(void)\n{\n\t/* first write 00, then write 11 */\n\tu32 reg_val = USBC_Readl(USBC_REG_ISCR(USBC0_BASE));\n\treg_val |= (0x03 << USBC_BP_ISCR_FORCE_VBUS_VALID);\n\treg_val = USBC_WakeUp_ClearChangeDetect(reg_val);\n\tUSBC_Writel(reg_val, USBC_REG_ISCR(USBC0_BASE));\n}\n\nstatic void USBC_SelectBus(u32 io_type, u32 ep_type, u32 ep_index)\n{\n\tu32 reg_val = 0;\n\n\treg_val = USBC_Readb(USBC_REG_VEND0(USBC0_BASE));\n\tif (io_type == USBC_IO_TYPE_DMA) {\n\t\tif (ep_type == USBC_EP_TYPE_TX) {\n\t\t\treg_val |= ((ep_index - 0x01) << 1) << USBC_BP_VEND0_DRQ_SEL;  //drq_sel\n\t\t\treg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL;   //io_dma\n\t\t} else {\n\t\t\treg_val |= ((ep_index << 1) - 0x01) << USBC_BP_VEND0_DRQ_SEL;\n\t\t\treg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL;\n\t\t}\n\t} else {\n\t\t//reg_val &= ~(0x1 << USBC_BP_VEND0_DRQ_SEL);  //clear drq_sel, select pio\n\t\treg_val &= 0x00;  // clear drq_sel, select pio\n\t}\n\n\t/* in 1667 1673 and later ic, FIFO_BUS_SEL bit(bit24 of reg0x40 for host/device)\n\t * is fixed to 1, the hw guarantee that it's ok for cpu/inner_dma/outer_dma transfer */\n\n//\treg_val |= 0x1<<USBC_BP_VEND0_BUS_SEL;  //for 1663 set 1: enable dma, set 0: enable fifo\n\n\tUSBC_Writeb(reg_val, USBC_REG_VEND0(USBC0_BASE));\n}\n\nstatic void USBC_SelectActiveEp(u8 ep_index)\n{\n\tUSBC_Writeb(ep_index, USBC_REG_EPIND(USBC0_BASE));\n}\n\nstatic u8 USBC_GetActiveEp(void)\n{\n\treturn USBC_Readb(USBC_REG_EPIND(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_ep0_SendStall(void)\n{\n\tUSBC_REG_set_bit_w(USBC_BP_CSR0_D_SEND_STALL, USBC_REG_CSR0(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_ep0_ClearStall(void)\n{\n\tUSBC_REG_clear_bit_w(USBC_BP_CSR0_D_SEND_STALL, USBC_REG_CSR0(USBC0_BASE));\n\tUSBC_REG_clear_bit_w(USBC_BP_CSR0_D_SENT_STALL, USBC_REG_CSR0(USBC0_BASE));\n}\n\nstatic void USBC_Dev_Ctrl_ClearSetupEnd(void)\n{\n\tUSBC_REG_set_bit_w(USBC_BP_CSR0_D_SERVICED_SETUP_END, USBC_REG_CSR0(USBC0_BASE));\n}\n\nstatic void USBC_Dev_SetAddress(u8 address)\n{\n\tUSBC_Writeb(address, USBC_REG_FADDR(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_Tx_SendStall(void)\n{\n\t//send stall, and fifo is flushed automatically\n\tUSBC_REG_set_bit_w(USBC_BP_TXCSR_D_SEND_STALL, USBC_REG_TXCSR(USBC0_BASE));\n}\nstatic u32 __USBC_Dev_Tx_IsEpStall(void)\n{\n\treturn USBC_REG_test_bit_w(USBC_BP_TXCSR_D_SENT_STALL, USBC_REG_TXCSR(USBC0_BASE));\n}\nstatic void __USBC_Dev_Tx_ClearStall(void)\n{\n\tu32 reg_val = USBC_Readw(USBC_REG_TXCSR(USBC0_BASE));\n\treg_val &= ~((1 << USBC_BP_TXCSR_D_SENT_STALL)|(1 << USBC_BP_TXCSR_D_SEND_STALL)|(1<<USBC_BP_TXCSR_D_UNDER_RUN));\n  reg_val |= (1 << USBC_BP_TXCSR_D_CLEAR_DATA_TOGGLE);\n\tUSBC_Writew(reg_val, USBC_REG_TXCSR(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_Rx_SendStall(void)\n{\n\tUSBC_REG_set_bit_w(USBC_BP_RXCSR_D_SEND_STALL, USBC_REG_RXCSR(USBC0_BASE));\n}\n\nstatic u32 __USBC_Dev_Rx_IsEpStall(void)\n{\n\treturn USBC_REG_test_bit_w(USBC_BP_RXCSR_D_SENT_STALL, USBC_REG_RXCSR(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_Rx_ClearStall(void)\n{\n\tu32 reg_val = USBC_Readw(USBC_REG_RXCSR(USBC0_BASE));\n\treg_val &= ~((1 << USBC_BP_RXCSR_D_SENT_STALL)|(1 << USBC_BP_RXCSR_D_SEND_STALL)|(1<<USBC_BP_RXCSR_D_OVERRUN));\n  reg_val |= (1 << USBC_BP_RXCSR_D_CLEAR_DATA_TOGGLE);\n\tUSBC_Writew(reg_val, USBC_REG_RXCSR(USBC0_BASE));\n}\n\nstatic tusb_speed_t USBC_Dev_QueryTransferMode(void)\n{\n\tif (USBC_REG_test_bit_b(USBC_BP_POWER_D_HIGH_SPEED_FLAG, USBC_REG_PCTL(USBC0_BASE)))\n\t\treturn TUSB_SPEED_HIGH;\n  else\n\t\treturn TUSB_SPEED_FULL;\n}\n\nstatic void __USBC_Dev_ep0_ReadDataHalf(void)\n{\n\tUSBC_Writew(1<<USBC_BP_CSR0_D_SERVICED_RX_PKT_READY, USBC_REG_CSR0(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_ep0_ReadDataComplete(void)\n{\n\tUSBC_Writew((1<<USBC_BP_CSR0_D_SERVICED_RX_PKT_READY) | (1<<USBC_BP_CSR0_D_DATA_END),\n\tUSBC_REG_CSR0(USBC0_BASE));\n}\n\n\nstatic void __USBC_Dev_ep0_WriteDataHalf(void)\n{\n\tUSBC_Writew(1<<USBC_BP_CSR0_D_TX_PKT_READY, USBC_REG_CSR0(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_ep0_WriteDataComplete(void)\n{\n\tUSBC_Writew((1<<USBC_BP_CSR0_D_TX_PKT_READY) | (1<<USBC_BP_CSR0_D_DATA_END),\n\tUSBC_REG_CSR0(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_Tx_WriteDataComplete(void)\n{\n\tUSBC_Writeb((1 << USBC_BP_TXCSR_D_TX_READY), USBC_REG_TXCSR(USBC0_BASE));\n}\n\nstatic void __USBC_Dev_Rx_ReadDataComplete(void)\n{\n\tUSBC_Writeb(0, USBC_REG_RXCSR(USBC0_BASE));\n}\n\nstatic u32 __USBC_Dev_Rx_IsReadDataReady(void)\n{\n\treturn USBC_REG_test_bit_w(USBC_BP_RXCSR_D_RX_PKT_READY, USBC_REG_RXCSR(USBC0_BASE));\n}\n\n/* open a tx ep's interrupt */\nstatic void USBC_INT_EnableTxEp(u8 ep_index)\n{\n\tUSBC_REG_set_bit_w(ep_index, USBC_REG_INTTxE(USBC0_BASE));\n}\n\n/* open a rx ep's interrupt */\nstatic void USBC_INT_EnableRxEp(u8 ep_index)\n{\n\tUSBC_REG_set_bit_w(ep_index, USBC_REG_INTRxE(USBC0_BASE));\n}\n\n/* close a tx ep's interrupt */\nstatic void USBC_INT_DisableTxEp(u8 ep_index)\n{\n\tUSBC_REG_clear_bit_w(ep_index, USBC_REG_INTTxE(USBC0_BASE));\n}\n\n/* close a rx ep's interrupt */\nstatic void USBC_INT_DisableRxEp(u8 ep_index)\n{\n\tUSBC_REG_clear_bit_w(ep_index, USBC_REG_INTRxE(USBC0_BASE));\n}\n\n/*------------------------------------------------------------------\n * INTERNAL FUNCTION DECLARATION\n *------------------------------------------------------------------*/\n\nCFG_TUD_MEM_ALIGN static dcd_data_t _dcd;\n\nstatic inline free_block_t *find_containing_block(free_block_t *beg, free_block_t *end, uint_fast16_t addr)\n{\n  free_block_t *cur = beg;\n  for (; cur < end && ((addr < cur->beg) || (cur->end <= addr)); ++cur) ;\n  return cur;\n}\n\nstatic inline int update_free_block_list(free_block_t *blks, unsigned num, uint_fast16_t addr, uint_fast16_t size)\n{\n  free_block_t *p = find_containing_block(blks, blks + num, addr);\n  TU_ASSERT(p != blks + num, -2);\n  if (p->beg == addr) {\n    /* Shrink block */\n    p->beg = addr + size;\n    if (p->beg != p->end) return 0;\n    /* remove block */\n    free_block_t *end = blks + num;\n    while (p + 1 < end) {\n      *p = *(p + 1);\n      ++p;\n    }\n    return -1;\n  } else {\n    /* Split into 2 blocks */\n    free_block_t tmp = {\n      .beg = addr + size,\n      .end = p->end\n    };\n    p->end = addr;\n    if (p->beg == p->end) {\n      if (tmp.beg != tmp.end) {\n        *p = tmp;\n        return 0;\n      }\n      /* remove block */\n      free_block_t *end = blks + num;\n      while (p + 1 < end) {\n        *p = *(p + 1);\n        ++p;\n      }\n      return -1;\n    }\n    if (tmp.beg == tmp.end) return 0;\n    blks[num] = tmp;\n    return 1;\n  }\n}\n\nstatic inline unsigned free_block_size(free_block_t const *blk)\n{\n  return blk->end - blk->beg;\n}\n\n#if 0\nstatic inline void print_block_list(free_block_t const *blk, unsigned num)\n{\n  TU_LOG1(\"*************\\r\\n\");\n  for (unsigned i = 0; i < num; ++i) {\n    TU_LOG1(\" Blk%u %u %u\\r\\n\", i, blk->beg, blk->end);\n    ++blk;\n  }\n}\n#else\n#define print_block_list(a,b)\n#endif\n\n#if CFG_TUSB_MCU == OPT_MCU_F1C100S\n#define USB_FIFO_SIZE_KB 4\n#else\n#error \"Unsupported MCU\"\n#endif\n\nstatic unsigned find_free_memory(uint_fast16_t size_in_log2_minus3)\n{\n  free_block_t free_blocks[2 * (TUP_DCD_ENDPOINT_MAX - 1)];\n  unsigned num_blocks = 1;\n  /* Backup current EP to restore later */\n  u8 backup_ep = USBC_GetActiveEp();\n\n  /* Initialize free memory block list */\n  free_blocks[0].beg = 64 / 8;\n  free_blocks[0].end = (USB_FIFO_SIZE_KB << 10) / 8; /* 2KiB / 8 bytes */\n  for (int i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {\n    uint_fast16_t addr;\n    int num;\n    USBC_SelectActiveEp(i);\n    addr = USBC_Readw(USBC_REG_TXFIFOAD(USBC0_BASE));\n    if (addr) {\n      unsigned sz  = USBC_Readb(USBC_REG_TXFIFOSZ(USBC0_BASE));\n      unsigned sft = (sz & USB_TXFIFOSZ_SIZE_M) + ((sz & USB_TXFIFOSZ_DPB) ? 1: 0);\n      num = update_free_block_list(free_blocks, num_blocks, addr, 1 << sft);\n      TU_ASSERT(-2 < num, 0);\n      num_blocks += num;\n      print_block_list(free_blocks, num_blocks);\n    }\n    addr = USBC_Readw(USBC_REG_RXFIFOAD(USBC0_BASE));\n    if (addr) {\n      unsigned sz  = USBC_Readb(USBC_REG_RXFIFOSZ(USBC0_BASE));\n      unsigned sft = (sz & USB_RXFIFOSZ_SIZE_M) + ((sz & USB_RXFIFOSZ_DPB) ? 1: 0);\n      num = update_free_block_list(free_blocks, num_blocks, addr, 1 << sft);\n      TU_ASSERT(-2 < num, 0);\n      num_blocks += num;\n      print_block_list(free_blocks, num_blocks);\n    }\n  }\n  print_block_list(free_blocks, num_blocks);\n\n  USBC_SelectActiveEp(backup_ep);\n\n  /* Find the best fit memory block */\n  uint_fast16_t size_in_8byte_unit = 1 << size_in_log2_minus3;\n  free_block_t const *min = NULL;\n  uint_fast16_t    min_sz = 0xFFFFu;\n  free_block_t const *end = &free_blocks[num_blocks];\n  for (free_block_t const *cur = &free_blocks[0]; cur < end; ++cur) {\n    uint_fast16_t sz = free_block_size(cur);\n    if (sz < size_in_8byte_unit) continue;\n    if (size_in_8byte_unit == sz) return cur->beg;\n    if (sz < min_sz) min = cur;\n  }\n  TU_ASSERT(min, 0);\n  return min->beg;\n}\n\nstatic void pipe_write_packet(void *buff, volatile void *fifo, unsigned cnt)\n{\n \tu32 len = 0;\n\tu32 i32 = 0;\n\tu32 i8  = 0;\n\tu8  *buf8  = 0;\n\tu32 *buf32 = 0;\n\n\t//--<1>-- adjust data\n\tbuf32 = buff;\n\tlen   = cnt;\n\n\ti32 = len >> 2;\n\ti8  = len & 0x03;\n\n\t//--<2>-- deal with 4byte part\n\twhile (i32--) {\n\t\tUSBC_Writel(*buf32++, fifo);\n\t}\n\n\t//--<3>-- deal with no 4byte part\n\tbuf8 = (u8 *)buf32;\n\twhile (i8--) {\n\t\tUSBC_Writeb(*buf8++, fifo);\n\t}\n}\n\nstatic void pipe_read_packet(void *buff, volatile void *fifo, unsigned cnt)\n{\n\tu32 len = 0;\n\tu32 i32 = 0;\n\tu32 i8  = 0;\n\tu8  *buf8  = 0;\n\tu32 *buf32 = 0;\n\n\t//--<1>-- adjust data\n\tbuf32 = buff;\n\tlen   = cnt;\n\n\ti32 = len >> 2;\n\ti8  = len & 0x03;\n\n\t//--<2>-- deal with 4byte part\n\twhile (i32--) {\n\t\t*buf32++ = USBC_Readl(fifo);\n\t}\n\n\t//--<3>-- deal with no 4byte part\n\tbuf8 = (u8 *)buf32;\n\twhile (i8--) {\n\t\t*buf8++ = USBC_Readb(fifo);\n\t}\n}\n\nstatic void pipe_read_write_packet_ff(tu_fifo_t *f, volatile void *fifo, unsigned len, unsigned dir)\n{\n  static const struct {\n    void (*tu_fifo_get_info)(tu_fifo_t *f, tu_fifo_buffer_info_t *info);\n    void (*tu_fifo_advance)(tu_fifo_t *f, uint16_t n);\n    void (*pipe_read_write)(void *buf, volatile void *fifo, unsigned len);\n  } ops[] = {\n    /* OUT */ {tu_fifo_get_write_info,tu_fifo_advance_write_pointer,pipe_read_packet},\n    /* IN  */ {tu_fifo_get_read_info, tu_fifo_advance_read_pointer, pipe_write_packet},\n  };\n  tu_fifo_buffer_info_t info;\n  ops[dir].tu_fifo_get_info(f, &info);\n  unsigned total_len = len;\n  len = TU_MIN(total_len, info.linear.len);\n  ops[dir].pipe_read_write(info.linear.ptr, fifo, len);\n  unsigned rem = total_len - len;\n  if (rem) {\n    len = TU_MIN(rem, info.wrapped.len);\n    ops[dir].pipe_read_write(info.wrapped.ptr, fifo, len);\n    rem -= len;\n  }\n  ops[dir].tu_fifo_advance(f, total_len - rem);\n}\n\n/*------------------------------------------------------------------\n * TRANSFER FUNCTION DECLARATION\n *------------------------------------------------------------------*/\n\nstatic void process_setup_packet(uint8_t rhport)\n{\n  uint32_t *p = (uint32_t*)(uintptr_t) &_dcd.setup_packet;\n  p[0]        = USBC_Readl(USBC_REG_EPFIFO0(USBC0_BASE));\n  p[1]        = USBC_Readl(USBC_REG_EPFIFO0(USBC0_BASE));\n\n  _dcd.pipe0.buf       = NULL;\n  _dcd.pipe0.length    = 0;\n  _dcd.pipe0.remaining = 0;\n  dcd_event_setup_received(rhport, (const uint8_t*)(uintptr_t)&_dcd.setup_packet, true);\n\n  const unsigned len    = _dcd.setup_packet.wLength;\n  _dcd.remaining_ctrl   = len;\n  const unsigned dir_in = tu_edpt_dir(_dcd.setup_packet.bmRequestType);\n  /* Clear RX FIFO and reverse the transaction direction */\n  if (len && dir_in) __USBC_Dev_ep0_ReadDataHalf();\n}\n\nstatic bool handle_xfer_in(uint_fast8_t ep_addr)\n{\n  unsigned epnum_minus1 = tu_edpt_number(ep_addr) - 1;\n  pipe_state_t  *pipe = &_dcd.pipe[tu_edpt_dir(ep_addr)][epnum_minus1];\n  const unsigned rem  = pipe->remaining;\n\n  if (!rem) {\n    pipe->buf = NULL;\n    return true;\n  }\n\n  const unsigned mps = USBC_Readw(USBC_REG_TXMAXP(USBC0_BASE));\n  const unsigned len = TU_MIN(mps, rem);\n  uint8_t          *buf = pipe->buf;\n  // TU_LOG1(\"   %p mps %d len %d rem %d\\r\\n\", buf, mps, len, rem);\n  if (len) {\n    volatile void* addr = (volatile void*)(USBC_REG_EPFIFO1(USBC0_BASE) + (epnum_minus1 << 2));\n    if (_dcd.pipe_buf_is_fifo[TUSB_DIR_IN] & TU_BIT(epnum_minus1)) {\n      pipe_read_write_packet_ff((tu_fifo_t *)(uintptr_t) buf, addr, len, TUSB_DIR_IN);\n    } else {\n      pipe_write_packet(buf, addr, len);\n      pipe->buf       = buf + len;\n    }\n    pipe->remaining = rem - len;\n  }\n  __USBC_Dev_Tx_WriteDataComplete();\n  // TU_LOG1(\" TXCSRL%d = %x %d\\r\\n\", epnum_minus1 + 1, regs->TXCSRL, rem - len);\n  return false;\n}\n\nstatic bool handle_xfer_out(uint_fast8_t ep_addr)\n{\n  unsigned epnum_minus1 = tu_edpt_number(ep_addr) - 1;\n  pipe_state_t  *pipe = &_dcd.pipe[tu_edpt_dir(ep_addr)][epnum_minus1];\n  // TU_LOG1(\" RXCSRL%d = %x\\r\\n\", epnum_minus1 + 1, regs->RXCSRL);\n\n  TU_ASSERT(__USBC_Dev_Rx_IsReadDataReady());\n\n  const unsigned mps = USBC_Readw(USBC_REG_RXMAXP(USBC0_BASE));\n  const unsigned rem = pipe->remaining;\n  const unsigned vld = USBC_Readw(USBC_REG_RXCOUNT(USBC0_BASE));\n  const unsigned len = TU_MIN(TU_MIN(rem, mps), vld);\n  uint8_t          *buf = pipe->buf;\n  if (len) {\n    volatile void* addr = (volatile void*)(USBC_REG_EPFIFO1(USBC0_BASE) + (epnum_minus1 << 2));\n    if (_dcd.pipe_buf_is_fifo[TUSB_DIR_OUT] & TU_BIT(epnum_minus1)) {\n      pipe_read_write_packet_ff((tu_fifo_t *)(uintptr_t )buf, addr, len, TUSB_DIR_OUT);\n    } else {\n      pipe_read_packet(buf, addr, len);\n      pipe->buf       = buf + len;\n    }\n    pipe->remaining = rem - len;\n  }\n  if ((len < mps) || (rem == len)) {\n    pipe->buf = NULL;\n    return NULL != buf;\n  }\n  __USBC_Dev_Rx_ReadDataComplete();\n  return false;\n}\n\nstatic bool edpt_n_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)\n{\n  (void)rhport;\n\n  unsigned epnum_minus1 = tu_edpt_number(ep_addr) - 1;\n  unsigned dir_in       = tu_edpt_dir(ep_addr);\n\n  pipe_state_t *pipe = &_dcd.pipe[dir_in][epnum_minus1];\n  pipe->buf          = buffer;\n  pipe->length       = total_bytes;\n  pipe->remaining    = total_bytes;\n\n  USBC_SelectActiveEp(tu_edpt_number(ep_addr));\n\n  if (dir_in) {\n    handle_xfer_in(ep_addr);\n  } else {\n    if (__USBC_Dev_Rx_IsReadDataReady())\n      __USBC_Dev_Rx_ReadDataComplete();\n  }\n  return true;\n}\n\nstatic bool edpt0_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer, uint16_t total_bytes)\n{\n  (void)rhport;\n  TU_ASSERT(total_bytes <= 64); /* Current implementation supports for only up to 64 bytes. */\n\n  const unsigned req = _dcd.setup_packet.bmRequestType;\n  TU_ASSERT(req != REQUEST_TYPE_INVALID || total_bytes == 0);\n\n  USBC_SelectActiveEp(0);\n\n  if (req == REQUEST_TYPE_INVALID || _dcd.status_out) {\n    /* STATUS OUT stage.\n     * MUSB controller automatically handles STATUS OUT packets without\n     * software helps. We do not have to do anything. And STATUS stage\n     * may have already finished and received the next setup packet\n     * without calling this function, so we have no choice but to\n     * invoke the callback function of status packet here. */\n    // TU_LOG1(\" STATUS OUT CSRL0 = %x\\r\\n\", CSRL0);\n    _dcd.status_out = 0;\n    if (req == REQUEST_TYPE_INVALID) {\n      dcd_event_xfer_complete(rhport, ep_addr, total_bytes, XFER_RESULT_SUCCESS, false);\n    } else {\n      /* The next setup packet has already been received, it aborts\n       * invoking callback function to avoid confusing TUSB stack. */\n      TU_LOG1(\"Drop CONTROL_STAGE_ACK\\r\\n\");\n    }\n    return true;\n  }\n  const unsigned dir_in = tu_edpt_dir(ep_addr);\n  if (tu_edpt_dir(req) == dir_in) { /* DATA stage */\n    TU_ASSERT(total_bytes <= _dcd.remaining_ctrl);\n    const unsigned rem = _dcd.remaining_ctrl;\n    const unsigned len = TU_MIN(TU_MIN(rem, 64), total_bytes);\n    if (dir_in) {\n      pipe_write_packet(buffer, (volatile void*) USBC_REG_EPFIFO0(USBC0_BASE), len);\n\n      _dcd.pipe0.buf       = buffer + len;\n      _dcd.pipe0.length    = len;\n      _dcd.pipe0.remaining = 0;\n\n      _dcd.remaining_ctrl  = rem - len;\n      if ((len < 64) || (rem == len)) {\n        _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID; /* Change to STATUS/SETUP stage */\n        _dcd.status_out = 1;\n        /* Flush TX FIFO and reverse the transaction direction. */\n        __USBC_Dev_ep0_WriteDataComplete();\n      } else {\n        __USBC_Dev_ep0_WriteDataHalf();\n      }\n      // TU_LOG1(\" IN CSRL0 = %x\\r\\n\", CSRL0);\n    } else {\n      // TU_LOG1(\" OUT CSRL0 = %x\\r\\n\", CSRL0);\n      _dcd.pipe0.buf       = buffer;\n      _dcd.pipe0.length    = len;\n      _dcd.pipe0.remaining = len;\n      __USBC_Dev_ep0_ReadDataHalf();\n    }\n  } else if (dir_in) {\n    // TU_LOG1(\" STATUS IN CSRL0 = %x\\r\\n\", CSRL0);\n    _dcd.pipe0.buf = NULL;\n    _dcd.pipe0.length    = 0;\n    _dcd.pipe0.remaining = 0;\n    /* Clear RX FIFO and reverse the transaction direction */\n    __USBC_Dev_ep0_ReadDataComplete();\n  }\n  return true;\n}\n\nstatic void process_ep0(uint8_t rhport)\n{\n  USBC_SelectActiveEp(0);\n  uint_fast8_t csrl = USBC_Readw(USBC_REG_CSR0(USBC0_BASE));\n\n  // TU_LOG1(\" EP0 CSRL0 = %x\\r\\n\", csrl);\n\n  if (csrl & USB_CSRL0_STALLED) {\n    /* Returned STALL packet to HOST. */\n    __USBC_Dev_ep0_ClearStall();\n    return;\n  }\n\n  unsigned req = _dcd.setup_packet.bmRequestType;\n  if (csrl & USB_CSRL0_SETEND) {\n    // TU_LOG1(\"   ABORT by the next packets\\r\\n\");\n    USBC_Dev_Ctrl_ClearSetupEnd();\n    if (req != REQUEST_TYPE_INVALID && _dcd.pipe0.buf) {\n      /* DATA stage was aborted by receiving STATUS or SETUP packet. */\n      _dcd.pipe0.buf = NULL;\n      _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;\n      dcd_event_xfer_complete(rhport,\n                              req & TUSB_DIR_IN_MASK,\n                              _dcd.pipe0.length - _dcd.pipe0.remaining,\n                              XFER_RESULT_SUCCESS, true);\n    }\n    req = REQUEST_TYPE_INVALID;\n    if (!(csrl & USB_CSRL0_RXRDY)) return; /* Received SETUP packet */\n  }\n\n  if (csrl & USB_CSRL0_RXRDY) {\n    /* Received SETUP or DATA OUT packet */\n    if (req == REQUEST_TYPE_INVALID) {\n      /* SETUP */\n      TU_ASSERT(sizeof(tusb_control_request_t) == USBC_Readw(USBC_REG_COUNT0(USBC0_BASE)),);\n      process_setup_packet(rhport);\n      return;\n    }\n    if (_dcd.pipe0.buf) {\n      /* DATA OUT */\n      const unsigned vld = USBC_Readw(USBC_REG_COUNT0(USBC0_BASE));\n      const unsigned rem = _dcd.pipe0.remaining;\n      const unsigned len = TU_MIN(TU_MIN(rem, 64), vld);\n      pipe_read_packet(_dcd.pipe0.buf, (volatile void*)USBC_REG_EPFIFO0(USBC0_BASE), len);\n\n      _dcd.pipe0.remaining = rem - len;\n      _dcd.remaining_ctrl -= len;\n\n      _dcd.pipe0.buf = NULL;\n      dcd_event_xfer_complete(rhport,\n                              tu_edpt_addr(0, TUSB_DIR_OUT),\n                              _dcd.pipe0.length - _dcd.pipe0.remaining,\n                              XFER_RESULT_SUCCESS, true);\n    }\n    return;\n  }\n\n  /* When CSRL0 is zero, it means that completion of sending a any length packet\n   * or receiving a zero length packet. */\n  if (req != REQUEST_TYPE_INVALID && !tu_edpt_dir(req)) {\n    /* STATUS IN */\n    if (*(const uint16_t*)(uintptr_t)&_dcd.setup_packet == 0x0500) {\n      /* The address must be changed on completion of the control transfer. */\n\t  USBC_Dev_SetAddress((uint8_t)_dcd.setup_packet.wValue);\n    }\n    _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;\n    dcd_event_xfer_complete(rhport,\n                            tu_edpt_addr(0, TUSB_DIR_IN),\n                            _dcd.pipe0.length - _dcd.pipe0.remaining,\n                            XFER_RESULT_SUCCESS, true);\n    return;\n  }\n  if (_dcd.pipe0.buf) {\n    /* DATA IN */\n    _dcd.pipe0.buf = NULL;\n    dcd_event_xfer_complete(rhport,\n                            tu_edpt_addr(0, TUSB_DIR_IN),\n                            _dcd.pipe0.length - _dcd.pipe0.remaining,\n                            XFER_RESULT_SUCCESS, true);\n  }\n}\n\nstatic void process_edpt_n(uint8_t rhport, uint_fast8_t ep_addr)\n{\n  bool completed;\n  const unsigned dir_in     = tu_edpt_dir(ep_addr);\n  const unsigned epn        = tu_edpt_number(ep_addr);\n\n  USBC_SelectActiveEp(epn);\n\n  if (dir_in) {\n    // TU_LOG1(\" TXCSRL%d = %x\\r\\n\", epn_minus1 + 1, regs->TXCSRL);\n    if (__USBC_Dev_Tx_IsEpStall()) {\n\t  __USBC_Dev_Tx_ClearStall();\n      return;\n    }\n    completed = handle_xfer_in(ep_addr);\n  } else {\n    // TU_LOG1(\" RXCSRL%d = %x\\r\\n\", epn_minus1 + 1, regs->RXCSRL);\n    if (__USBC_Dev_Rx_IsEpStall()) {\n\t    __USBC_Dev_Rx_ClearStall();\n      return;\n    }\n    completed = handle_xfer_out(ep_addr);\n  }\n\n  if (completed) {\n    pipe_state_t *pipe = &_dcd.pipe[dir_in][tu_edpt_number(ep_addr) - 1];\n    dcd_event_xfer_complete(rhport, ep_addr,\n                            pipe->length - pipe->remaining,\n                            XFER_RESULT_SUCCESS, true);\n  }\n}\n\nstatic void process_bus_reset(uint8_t rhport)\n{\n  /* When bmRequestType is REQUEST_TYPE_INVALID(0xFF),\n   * a control transfer state is SETUP or STATUS stage. */\n  _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;\n  _dcd.status_out = 0;\n  /* When pipe0.buf has not NULL, DATA stage works in progress. */\n  _dcd.pipe0.buf = NULL;\n\n  USBC_Writew(1, USBC_REG_INTTxE(USBC0_BASE)); /* Enable only EP0 */\n  USBC_Writew(0, USBC_REG_INTRxE(USBC0_BASE));\n\n  dcd_event_bus_reset(rhport, USBC_Dev_QueryTransferMode(), true);\n}\n\n/*------------------------------------------------------------------\n * Device API\n *------------------------------------------------------------------*/\n\nstatic void usb_isr_handler(void) {\n\tdcd_int_handler(0);\n}\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n\n  dcd_disconnect(rhport);\n  USBC_HardwareReset();\n  USBC_PhyConfig();\n  USBC_ConfigFIFO_Base();\n  USBC_EnableDpDmPullUp();\n  USBC_ForceIdToHigh(); // Force device mode\n  USBC_ForceVbusValidToHigh();\n  USBC_SelectBus(USBC_IO_TYPE_PIO, 0, 0);\n  dcd_edpt_close_all(rhport);\n\n  #if TUD_OPT_HIGH_SPEED\n    USBC_REG_set_bit_b(USBC_BP_POWER_D_HIGH_SPEED_EN, USBC_REG_PCTL(USBC0_BASE));\n  #else\n    USBC_REG_clear_bit_b(USBC_BP_POWER_D_HIGH_SPEED_EN, USBC_REG_PCTL(USBC0_BASE));\n  #endif\n\n  USBC_Writeb((1 << USBC_BP_INTUSBE_EN_SUSPEND)\n    | (1 << USBC_BP_INTUSBE_EN_RESUME)\n    | (1 << USBC_BP_INTUSBE_EN_RESET)\n    | (1 << USBC_BP_INTUSBE_EN_SOF)\n    | (1 << USBC_BP_INTUSBE_EN_DISCONNECT)\n    , USBC_REG_INTUSBE(USBC0_BASE));\n  f1c100s_intc_clear_pend(F1C100S_IRQ_USBOTG);\n  f1c100s_intc_set_isr(F1C100S_IRQ_USBOTG, usb_isr_handler);\n\n  dcd_connect(rhport);\n\n  return true;\n}\n\n// Connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport)\n{\n  (void)rhport;\n  USBC_REG_set_bit_b(USBC_BP_POWER_D_SOFT_CONNECT, USBC_REG_PCTL(USBC0_BASE));\n}\n\n// Disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void)rhport;\n  USBC_REG_clear_bit_b(USBC_BP_POWER_D_SOFT_CONNECT, USBC_REG_PCTL(USBC0_BASE));\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void)rhport;\n  f1c100s_intc_enable_irq(F1C100S_IRQ_USBOTG);\n}\n\nstatic void musb_int_mask(void)\n{\n  f1c100s_intc_mask_irq(F1C100S_IRQ_USBOTG);\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void)rhport;\n  f1c100s_intc_disable_irq(F1C100S_IRQ_USBOTG);\n}\n\nstatic void musb_int_unmask(void)\n{\n  f1c100s_intc_unmask_irq(F1C100S_IRQ_USBOTG);\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  (void)rhport;\n  (void)dev_addr;\n  _dcd.pipe0.buf       = NULL;\n  _dcd.pipe0.length    = 0;\n  _dcd.pipe0.remaining = 0;\n  /* Clear RX FIFO to return ACK. */\n  USBC_SelectActiveEp(0);\n  __USBC_Dev_ep0_ReadDataComplete();\n}\n\n// Wake up host\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void)rhport;\n  USBC_REG_set_bit_b(USBC_BP_POWER_D_RESUME, USBC_REG_PCTL(USBC0_BASE));\n  tusb_time_delay_ms_api(10);\n  USBC_REG_clear_bit_b(USBC_BP_POWER_D_RESUME, USBC_REG_PCTL(USBC0_BASE));\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n#ifndef __ARMCC_VERSION\n#define __clz __builtin_clz\n#endif\n\n// Configure endpoint's registers according to descriptor\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * ep_desc)\n{\n  (void) rhport;\n\n  uint16_t reg_val;\n\n  const unsigned ep_addr = ep_desc->bEndpointAddress;\n  const unsigned epn     = tu_edpt_number(ep_addr);\n  const unsigned dir_in  = tu_edpt_dir(ep_addr);\n  const unsigned xfer    = ep_desc->bmAttributes.xfer;\n  const unsigned mps     = tu_edpt_packet_size(ep_desc);\n\n  TU_ASSERT(epn < TUP_DCD_ENDPOINT_MAX);\n\n  pipe_state_t *pipe = &_dcd.pipe[dir_in][epn - 1];\n  pipe->buf       = NULL;\n  pipe->length    = 0;\n  pipe->remaining = 0;\n\n  musb_int_mask();\n\n  // volatile hw_endpoint_t *regs = edpt_regs(epn - 1);\n  USBC_SelectActiveEp(epn);\n  if (dir_in) {\n    USBC_Writew(mps, USBC_REG_TXMAXP(USBC0_BASE));\n\n    reg_val = (1 << USBC_BP_TXCSR_D_MODE)\n      | (1 << USBC_BP_TXCSR_D_FLUSH_FIFO)\n      | (1 << USBC_BP_TXCSR_D_CLEAR_DATA_TOGGLE);\n    if  (xfer == TUSB_XFER_ISOCHRONOUS)\n      reg_val |= (1 << USBC_BP_TXCSR_D_ISO);\n\t  USBC_Writew(reg_val, USBC_REG_TXCSR(USBC0_BASE));\n\n    USBC_INT_EnableTxEp(epn);\n  } else {\n    USBC_Writew(mps, USBC_REG_RXMAXP(USBC0_BASE));\n\n    reg_val = (1 << USBC_BP_RXCSR_D_FLUSH_FIFO)\n      | (1 << USBC_BP_RXCSR_D_CLEAR_DATA_TOGGLE);\n    if  (xfer == TUSB_XFER_ISOCHRONOUS)\n      reg_val |= (1 << USBC_BP_RXCSR_D_ISO);\n    USBC_Writew(reg_val, USBC_REG_RXCSR(USBC0_BASE));\n\n    USBC_INT_EnableRxEp(epn);\n  }\n\n  /* Setup FIFO */\n  int size_in_log2_minus3 = 28 - TU_MIN(28, __clz((uint32_t)mps));\n  if ((8u << size_in_log2_minus3) < mps) ++size_in_log2_minus3;\n  unsigned addr = find_free_memory(size_in_log2_minus3);\n  TU_ASSERT(addr);\n\n  if (dir_in) {\n    USBC_Writew(addr, USBC_REG_TXFIFOAD(USBC0_BASE));\n    USBC_Writeb(size_in_log2_minus3, USBC_REG_TXFIFOSZ(USBC0_BASE));\n  } else {\n    USBC_Writew(addr, USBC_REG_RXFIFOAD(USBC0_BASE));\n    USBC_Writeb(size_in_log2_minus3, USBC_REG_RXFIFOSZ(USBC0_BASE));\n  }\n\n  musb_int_unmask();\n\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport)\n{\n  (void) rhport;\n  musb_int_mask();\n  USBC_Writew(1, USBC_REG_INTTxE(USBC0_BASE)); /* Enable only EP0 */\n  USBC_Writew(0, USBC_REG_INTRxE(USBC0_BASE));\n  for (unsigned i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {\n    USBC_SelectActiveEp(i);\n    USBC_Writew(0, USBC_REG_TXMAXP(USBC0_BASE));\n\t\tUSBC_Writew((1 << USBC_BP_TXCSR_D_MODE) | (1 << USBC_BP_TXCSR_D_CLEAR_DATA_TOGGLE) | (1 << USBC_BP_TXCSR_D_FLUSH_FIFO),\n      USBC_REG_TXCSR(USBC0_BASE));\n\n    USBC_Writew(0, USBC_REG_RXMAXP(USBC0_BASE));\n\t  USBC_Writew((1 << USBC_BP_RXCSR_D_CLEAR_DATA_TOGGLE) | (1 << USBC_BP_RXCSR_D_FLUSH_FIFO),\n      USBC_REG_RXCSR(USBC0_BASE));\n\n    USBC_Writew(0, USBC_REG_TXFIFOAD(USBC0_BASE));\n    USBC_Writeb(0, USBC_REG_TXFIFOSZ(USBC0_BASE));\n    USBC_Writew(0, USBC_REG_RXFIFOAD(USBC0_BASE));\n    USBC_Writeb(0, USBC_REG_RXFIFOSZ(USBC0_BASE));\n  }\n  musb_int_unmask();\n}\n\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)\n{\n  (void)rhport;\n  unsigned const epn    = tu_edpt_number(ep_addr);\n  unsigned const dir_in = tu_edpt_dir(ep_addr);\n\n  musb_int_mask();\n  USBC_SelectActiveEp(epn);\n  if (dir_in) {\n    USBC_INT_DisableTxEp(epn);\n    USBC_Writew(0, USBC_REG_TXMAXP(USBC0_BASE));\n\t\tUSBC_Writew((1 << USBC_BP_TXCSR_D_MODE) | (1 << USBC_BP_TXCSR_D_CLEAR_DATA_TOGGLE) | (1 << USBC_BP_TXCSR_D_FLUSH_FIFO),\n      USBC_REG_TXCSR(USBC0_BASE));\n\n    USBC_Writew(0, USBC_REG_TXFIFOAD(USBC0_BASE));\n    USBC_Writeb(0, USBC_REG_TXFIFOSZ(USBC0_BASE));\n  } else {\n    USBC_INT_DisableRxEp(epn);\n    USBC_Writew(0, USBC_REG_RXMAXP(USBC0_BASE));\n\t  USBC_Writew((1 << USBC_BP_RXCSR_D_CLEAR_DATA_TOGGLE) | (1 << USBC_BP_RXCSR_D_FLUSH_FIFO),\n      USBC_REG_RXCSR(USBC0_BASE));\n\n    USBC_Writew(0, USBC_REG_RXFIFOAD(USBC0_BASE));\n    USBC_Writeb(0, USBC_REG_RXFIFOSZ(USBC0_BASE));\n  }\n  musb_int_unmask();\n}\n\n  #if 0\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n  #endif\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void)rhport;\n  bool ret;\n  // TU_LOG1(\"X %x %d\\r\\n\", ep_addr, total_bytes);\n  unsigned const epnum = tu_edpt_number(ep_addr);\n  musb_int_mask();\n\n  if (epnum) {\n    _dcd.pipe_buf_is_fifo[tu_edpt_dir(ep_addr)] &= ~TU_BIT(epnum - 1);\n    ret = edpt_n_xfer(rhport, ep_addr, buffer, total_bytes);\n  } else {\n    ret = edpt0_xfer(rhport, ep_addr, buffer, total_bytes);\n  }\n  musb_int_unmask();\n  return ret;\n}\n\n// Submit a transfer where is managed by FIFO, When complete dcd_event_xfer_complete() is invoked to notify the stack - optional, however, must be listed in usbd.c\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void)rhport;\n  bool ret;\n  // TU_LOG1(\"X %x %d\\r\\n\", ep_addr, total_bytes);\n  unsigned const epnum = tu_edpt_number(ep_addr);\n  TU_ASSERT(epnum);\n\n  musb_int_mask();\n  _dcd.pipe_buf_is_fifo[tu_edpt_dir(ep_addr)] |= TU_BIT(epnum - 1);\n  ret = edpt_n_xfer(rhport, ep_addr, (uint8_t*)ff, total_bytes);\n  musb_int_unmask();\n\n  return ret;\n}\n\n// Stall endpoint\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void)rhport;\n  unsigned const epn = tu_edpt_number(ep_addr);\n  musb_int_mask();\n  USBC_SelectActiveEp(epn);\n  if (0 == epn) {\n    if (!ep_addr) { /* Ignore EP80 */\n      _dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;\n      _dcd.pipe0.buf = NULL;\n      __USBC_Dev_ep0_SendStall();\n    }\n  } else {\n    if (tu_edpt_dir(ep_addr)) { /* IN */\n      __USBC_Dev_Tx_SendStall();\n    } else { /* OUT */\n      TU_ASSERT(!__USBC_Dev_Rx_IsReadDataReady(),);\n      __USBC_Dev_Rx_SendStall();\n    }\n  }\n  musb_int_unmask();\n}\n\n// clear stall, data toggle is also reset to DATA0\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void)rhport;\n  unsigned const epn = tu_edpt_number(ep_addr);\n  musb_int_mask();\n  USBC_SelectActiveEp(epn);\n  if (0 != epn) {\n    if (tu_edpt_dir(ep_addr)) { /* IN */\n      __USBC_Dev_Tx_ClearStall();\n    } else { /* OUT */\n      __USBC_Dev_Rx_ClearStall();\n    }\n  }\n  musb_int_unmask();\n}\n\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  uint8_t is;\n  uint16_t txis, rxis;\n\n  is   = USBC_Readb(USBC_REG_INTUSB(USBC0_BASE));   /* read interrupt status */\n  txis = USBC_Readw(USBC_REG_INTTx(USBC0_BASE)); /* read interrupt status */\n  rxis = USBC_Readw(USBC_REG_INTRx(USBC0_BASE)); /* read interrupt status */\n\n  is &= USBC_Readb(USBC_REG_INTUSBE(USBC0_BASE)); /* ignore disabled interrupts */\n  USBC_Writeb(is, USBC_REG_INTUSB(USBC0_BASE)); /* sunxi musb requires a write to interrupt register to clear */\n  if (is & USBC_INTUSB_DISCONNECT) {\n\tdcd_event_bus_signal(rhport, DCD_EVENT_UNPLUGGED, true);\n  }\n  if (is & USBC_INTUSB_SOF) {\n    dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);\n  }\n  if (is & USBC_INTUSB_RESET) {\n    /* ep0 FADDR must be 0 when (re)entering peripheral mode */\n    USBC_SelectActiveEp(0);\n    USBC_Dev_SetAddress(0);\n    process_bus_reset(rhport);\n  }\n  if (is & USBC_INTUSB_RESUME) {\n    dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n  }\n  if (is & USBC_INTUSB_SUSPEND) {\n    dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n  }\n\n  txis &= USBC_Readw(USBC_REG_INTTxE(USBC0_BASE));\n  USBC_Writew(txis, USBC_REG_INTTx(USBC0_BASE));\n  if (txis & USBC_INTTx_FLAG_EP0) {\n    process_ep0(rhport);\n    txis &= ~TU_BIT(0);\n  }\n  while (txis) {\n    unsigned const num = __builtin_ctz(txis);\n    process_edpt_n(rhport, tu_edpt_addr(num, TUSB_DIR_IN));\n    txis &= ~TU_BIT(num);\n  }\n\n  rxis &= USBC_Readw(USBC_REG_INTRxE(USBC0_BASE));\n  USBC_Writew(rxis, USBC_REG_INTRx(USBC0_BASE));\n  while (rxis) {\n    unsigned const num = __builtin_ctz(rxis);\n    process_edpt_n(rhport, tu_edpt_addr(num, TUSB_DIR_OUT));\n    rxis &= ~TU_BIT(num);\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/sunxi/musb_def.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Koji KITAYAMA\n * Copyright (c) 2021 Tian Yunhao (t123yh)\n * Copyright (c) 2021 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_MUSB_DEF\n#define TUSB_MUSB_DEF\n\n\n#define  USBC_Readb(reg)\t                    (*(volatile unsigned char *)(reg))\n#define  USBC_Readw(reg)\t                    (*(volatile unsigned short *)(reg))\n#define  USBC_Readl(reg)\t                    (*(volatile unsigned long *)(reg))\n\n#define  USBC_Writeb(value, reg)                (*(volatile unsigned char *)(reg) = (value))\n#define  USBC_Writew(value, reg)\t            (*(volatile unsigned short *)(reg) = (value))\n#define  USBC_Writel(value, reg)\t            (*(volatile unsigned long *)(reg) = (value))\n\n\n#define USBC_SetBit_Mask_b(reg,mask)\tdo {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned char _r = USBC_Readb(reg);\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   _r  |=  (unsigned char)(mask);\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUSBC_Writeb(_r,reg); \t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}while(0)\n#define USBC_SetBit_Mask_w(reg,mask)\tdo {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned short _r = USBC_Readw(reg);\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   _r  |=  (unsigned short)(mask);\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUSBC_Writew(_r,reg); \t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}while(0)\n#define USBC_SetBit_Mask_l(reg,mask)\tdo {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int _r = USBC_Readl(reg);\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   _r  |=  (unsigned int)(mask);\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUSBC_Writel(_r,reg); \t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}while(0)\n\n\n#define USBC_ClrBit_Mask_b(reg,mask)\tdo {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned char _r = USBC_Readb(reg);\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   _r  &=  (~(unsigned char)(mask));\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUSBC_Writeb(_r,reg); \t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}while(0);\n#define USBC_ClrBit_Mask_w(reg,mask)\tdo {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned short _r = USBC_Readw(reg);\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   _r  &=  (~(unsigned short)(mask));\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUSBC_Writew(_r,reg); \t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}while(0)\n#define USBC_ClrBit_Mask_l(reg,mask)\tdo {\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tunsigned int _r = USBC_Readl(reg);\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t   _r  &=  (~(unsigned int)(mask));\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tUSBC_Writel(_r,reg); \t\t\t\t\t\t\t\t\\\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}while(0)\n#define  USBC_REG_test_bit_b(bp, reg)         \t(USBC_Readb(reg) & (1 << (bp)))\n#define  USBC_REG_test_bit_w(bp, reg)   \t    (USBC_Readw(reg) & (1 << (bp)))\n#define  USBC_REG_test_bit_l(bp, reg)   \t    (USBC_Readl(reg) & (1 << (bp)))\n\n#define  USBC_REG_set_bit_b(bp, reg) \t\t\t(USBC_Writeb((USBC_Readb(reg) | (1 << (bp))) , (reg)))\n#define  USBC_REG_set_bit_w(bp, reg) \t \t\t(USBC_Writew((USBC_Readw(reg) | (1 << (bp))) , (reg)))\n#define  USBC_REG_set_bit_l(bp, reg) \t \t\t(USBC_Writel((USBC_Readl(reg) | (1 << (bp))) , (reg)))\n\n#define  USBC_REG_clear_bit_b(bp, reg)\t \t \t(USBC_Writeb((USBC_Readb(reg) & (~ (1 << (bp)))) , (reg)))\n#define  USBC_REG_clear_bit_w(bp, reg)\t \t \t(USBC_Writew((USBC_Readw(reg) & (~ (1 << (bp)))) , (reg)))\n#define  USBC_REG_clear_bit_l(bp, reg)\t \t \t(USBC_Writel((USBC_Readl(reg) & (~ (1 << (bp)))) , (reg)))\n\n#define SW_UDC_EPNUMS 3\n\n#define SUNXI_SRAMC_BASE 0x01c00000\n//---------------------------------------------------------------\n//   reg base\n//---------------------------------------------------------------\n#define  USBC0_BASE                 0x01c13000\n#define  USBC1_BASE                 0x01c14000\n#define  USBC2_BASE                 0x01c1E000\n\n//Some reg within musb\n#define USBPHY_CLK_REG \t\t0x01c200CC\n#define USBPHY_CLK_RST_BIT 0\n#define USBPHY_CLK_GAT_BIT 1\n\n#define BUS_CLK_RST_REG\t0x01c202c0 //Bus Clock Reset Register Bit24 : USB CLK RST\n#define BUS_RST_USB_BIT\t24\n\n#define BUS_CLK_GATE0_REG\t0x01c20060 //Bus Clock Gating Register Bit24 : USB CLK GATE 0: Mask 1 : Pass\n#define BUS_CLK_USB_BIT\t24\n\n//#define USB_INTR\n\n#define NDMA_CFG_REG\n//-----------------------------------------------------------------------\n//   musb reg offset\n//-----------------------------------------------------------------------\n\n#define  USBC_REG_o_FADDR\t\t    0x0098\n#define  USBC_REG_o_PCTL\t\t    0x0040\n#define  USBC_REG_o_INTTx\t\t    0x0044\n#define  USBC_REG_o_INTRx\t\t    0x0046\n#define  USBC_REG_o_INTTxE\t\t    0x0048\n#define  USBC_REG_o_INTRxE\t\t    0x004A\n#define  USBC_REG_o_INTUSB\t\t    0x004C\n#define  USBC_REG_o_INTUSBE         0x0050\n#define  USBC_REG_o_FRNUM\t\t    0x0054\n#define  USBC_REG_o_EPIND\t\t    0x0042\n#define  USBC_REG_o_TMCTL\t\t    0x007C\n\n#define  USBC_REG_o_TXMAXP\t\t    0x0080\n#define  USBC_REG_o_CSR0\t\t    0x0082\n#define  USBC_REG_o_TXCSR\t\t    0x0082\n#define  USBC_REG_o_RXMAXP\t\t    0x0084\n#define  USBC_REG_o_RXCSR\t\t    0x0086\n#define  USBC_REG_o_COUNT0\t\t    0x0088\n#define  USBC_REG_o_RXCOUNT\t\t    0x0088\n#define  USBC_REG_o_EP0TYPE\t\t    0x008C\n#define  USBC_REG_o_TXTYPE\t\t    0x008C\n#define  USBC_REG_o_NAKLIMIT0\t    0x008D\n#define  USBC_REG_o_TXINTERVAL      0x008D\n#define  USBC_REG_o_RXTYPE\t\t    0x008E\n#define  USBC_REG_o_RXINTERVAL\t    0x008F\n\n//#define  USBC_REG_o_CONFIGDATA\t0x001F   //\n\n#define  USBC_REG_o_EPFIFO0\t\t    0x0000\n#define  USBC_REG_o_EPFIFO1\t\t    0x0004\n#define  USBC_REG_o_EPFIFO2\t\t    0x0008\n#define  USBC_REG_o_EPFIFO3\t\t    0x000C\n#define  USBC_REG_o_EPFIFO4\t\t    0x0010\n#define  USBC_REG_o_EPFIFO5\t\t    0x0014\n#define  USBC_REG_o_EPFIFOx(n)\t    (0x0000 + (n<<2))\n\n#define  USBC_REG_o_DEVCTL\t\t    0x0041\n\n#define  USBC_REG_o_TXFIFOSZ\t    0x0090\n#define  USBC_REG_o_RXFIFOSZ\t    0x0094\n#define  USBC_REG_o_TXFIFOAD\t    0x0092\n#define  USBC_REG_o_RXFIFOAD\t    0x0096\n\n#define  USBC_REG_o_VEND0\t\t    0x0043\n#define  USBC_REG_o_VEND1\t\t    0x007D\n#define  USBC_REG_o_VEND3\t\t    0x007E\n\n//#define  USBC_REG_o_PHYCTL\t\t0x006C\n#define  USBC_REG_o_EPINFO\t\t    0x0078\n#define  USBC_REG_o_RAMINFO\t\t    0x0079\n#define  USBC_REG_o_LINKINFO\t    0x007A\n#define  USBC_REG_o_VPLEN\t\t    0x007B\n#define  USBC_REG_o_HSEOF\t\t    0x007C\n#define  USBC_REG_o_FSEOF\t\t    0x007D\n#define  USBC_REG_o_LSEOF\t\t    0x007E\n\n//new\n#define  USBC_REG_o_FADDR0          0x0098\n#define  USBC_REG_o_HADDR0          0x009A\n#define  USBC_REG_o_HPORT0          0x009B\n#define  USBC_REG_o_TXFADDRx \t\t0x0098\n#define  USBC_REG_o_TXHADDRx\t\t0x009A\n#define  USBC_REG_o_TXHPORTx\t\t0x009B\n#define  USBC_REG_o_RXFADDRx\t\t0x009C\n#define  USBC_REG_o_RXHADDRx\t\t0x009E\n#define  USBC_REG_o_RXHPORTx\t\t0x009F\n\n\n#define  USBC_REG_o_RPCOUNT\t\t\t0x008A\n\n//new\n#define  USBC_REG_o_ISCR            0x0400\n#define  USBC_REG_o_PHYCTL          0x0404\n#define  USBC_REG_o_PHYBIST         0x0408\n#define  USBC_REG_o_PHYTUNE         0x040c\n\n#define  USBC_REG_o_CSR\t\t\t0x0410\n\n#define USBC_REG_o_PMU_IRQ\t 0x0800\n\n//-----------------------------------------------------------------------\n//   registers\n//-----------------------------------------------------------------------\n\n#define  USBC_REG_FADDR(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_FADDR\t\t)\n#define  USBC_REG_PCTL(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_PCTL\t\t\t)\n#define  USBC_REG_INTTx(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_INTTx\t\t)\n#define  USBC_REG_INTRx(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_INTRx\t\t)\n#define  USBC_REG_INTTxE(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_INTTxE     \t)\n#define  USBC_REG_INTRxE(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_INTRxE     \t)\n#define  USBC_REG_INTUSB(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_INTUSB     \t)\n#define  USBC_REG_INTUSBE(usbc_base_addr)           ((usbc_base_addr) + USBC_REG_o_INTUSBE    \t)\n#define  USBC_REG_FRNUM(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_FRNUM      \t)\n#define  USBC_REG_EPIND(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_EPIND      \t)\n#define  USBC_REG_TMCTL(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_TMCTL      \t)\n#define  USBC_REG_TXMAXP(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_TXMAXP     \t)\n\n#define  USBC_REG_CSR0(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_CSR0       \t)\n#define  USBC_REG_TXCSR(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_TXCSR      \t)\n\n#define  USBC_REG_RXMAXP(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_RXMAXP     \t)\n#define  USBC_REG_RXCSR(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_RXCSR      \t)\n\n#define  USBC_REG_COUNT0(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_COUNT0     \t)\n#define  USBC_REG_RXCOUNT(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_RXCOUNT    \t)\n\n#define  USBC_REG_EP0TYPE(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_EP0TYPE\t\t)\n#define  USBC_REG_TXTYPE(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_TXTYPE     \t)\n\n#define  USBC_REG_NAKLIMIT0(usbc_base_addr)\t        ((usbc_base_addr) + USBC_REG_o_NAKLIMIT0  \t)\n#define  USBC_REG_TXINTERVAL(usbc_base_addr)        ((usbc_base_addr) + USBC_REG_o_TXINTERVAL\t)\n\n#define  USBC_REG_RXTYPE(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_RXTYPE\t\t)\n#define  USBC_REG_RXINTERVAL(usbc_base_addr)\t    ((usbc_base_addr) + USBC_REG_o_RXINTERVAL\t)\n//#define  USBC_REG_CONFIGDATA(usbc_base_addr)\t    ((usbc_base_addr) + USBC_REG_o_CONFIGDATA\t)\n#define  USBC_REG_EPFIFO0(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_EPFIFO0\t\t)\n#define  USBC_REG_EPFIFO1(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_EPFIFO1\t\t)\n#define  USBC_REG_EPFIFO2(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_EPFIFO2\t\t)\n#define  USBC_REG_EPFIFO3(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_EPFIFO3\t\t)\n#define  USBC_REG_EPFIFO4(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_EPFIFO4\t\t)\n#define  USBC_REG_EPFIFO5(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_EPFIFO5\t\t)\n#define  USBC_REG_EPFIFOx(usbc_base_addr, n)\t    ((usbc_base_addr) + USBC_REG_o_EPFIFOx(n)\t)\n#define  USBC_REG_DEVCTL(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_DEVCTL\t\t)\n#define  USBC_REG_TXFIFOSZ(usbc_base_addr)\t        ((usbc_base_addr) + USBC_REG_o_TXFIFOSZ\t\t)\n#define  USBC_REG_RXFIFOSZ(usbc_base_addr)\t        ((usbc_base_addr) + USBC_REG_o_RXFIFOSZ\t\t)\n#define  USBC_REG_TXFIFOAD(usbc_base_addr)\t        ((usbc_base_addr) + USBC_REG_o_TXFIFOAD\t\t)\n#define  USBC_REG_RXFIFOAD(usbc_base_addr)\t        ((usbc_base_addr) + USBC_REG_o_RXFIFOAD\t\t)\n#define  USBC_REG_VEND0(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_VEND0\t\t)\n#define  USBC_REG_VEND1(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_VEND1\t\t)\n#define  USBC_REG_EPINFO(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_EPINFO\t\t)\n#define  USBC_REG_RAMINFO(usbc_base_addr)\t\t    ((usbc_base_addr) + USBC_REG_o_RAMINFO\t\t)\n#define  USBC_REG_LINKINFO(usbc_base_addr)\t        ((usbc_base_addr) + USBC_REG_o_LINKINFO\t\t)\n#define  USBC_REG_VPLEN(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_VPLEN\t\t)\n#define  USBC_REG_HSEOF(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_HSEOF\t\t)\n#define  USBC_REG_FSEOF(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_FSEOF\t\t)\n#define  USBC_REG_LSEOF(usbc_base_addr)\t\t        ((usbc_base_addr) + USBC_REG_o_LSEOF\t\t)\n\n#define  USBC_REG_FADDR0(usbc_base_addr)            ((usbc_base_addr) + USBC_REG_o_FADDR0\t\t)\n#define  USBC_REG_HADDR0(usbc_base_addr)            ((usbc_base_addr) + USBC_REG_o_HADDR0\t\t)\n#define  USBC_REG_HPORT0(usbc_base_addr)            ((usbc_base_addr) + USBC_REG_o_HPORT0\t\t)\n\n#define  USBC_REG_TXFADDRx(usbc_base_addr, n)\t\t((usbc_base_addr) + USBC_REG_o_TXFADDRx\t\t)\n#define  USBC_REG_TXHADDRx(usbc_base_addr, n)\t\t((usbc_base_addr) + USBC_REG_o_TXHADDRx\t\t)\n#define  USBC_REG_TXHPORTx(usbc_base_addr, n)\t\t((usbc_base_addr) + USBC_REG_o_TXHPORTx\t\t)\n#define  USBC_REG_RXFADDRx(usbc_base_addr, n)\t\t((usbc_base_addr) + USBC_REG_o_RXFADDRx\t\t)\n#define  USBC_REG_RXHADDRx(usbc_base_addr, n)\t\t((usbc_base_addr) + USBC_REG_o_RXHADDRx\t\t)\n#define  USBC_REG_RXHPORTx(usbc_base_addr, n)\t\t((usbc_base_addr) + USBC_REG_o_RXHPORTx\t\t)\n\n#define  USBC_REG_RPCOUNTx(usbc_base_addr, n)\t    ((usbc_base_addr) + USBC_REG_o_RPCOUNT\t\t)\n\n#define  USBC_REG_ISCR(usbc_base_addr)\t    \t    ((usbc_base_addr) + USBC_REG_o_ISCR\t\t\t)\n#define  USBC_REG_PHYCTL(usbc_base_addr)\t        ((usbc_base_addr) + USBC_REG_o_PHYCTL\t\t)\n#define  USBC_REG_PHYBIST(usbc_base_addr)\t        ((usbc_base_addr) + USBC_REG_o_PHYBIST\t\t)\n#define  USBC_REG_PHYTUNE(usbc_base_addr)           ((usbc_base_addr) + USBC_REG_o_PHYTUNE\t\t)\n#define  USBC_REG_PMU_IRQ(usbc_base_addr)           ((usbc_base_addr) + USBC_REG_o_PMU_IRQ\t\t)\n#define  USBC_REG_CSR(usbc_base_addr)           ((usbc_base_addr) + USBC_REG_o_CSR)\n//-----------------------------------------------------------------------\n//   bit position\n//-----------------------------------------------------------------------\n\n/* USB Power Control for Host only  */\n#define  USBC_BP_POWER_H_HIGH_SPEED_EN\t\t\t5\n#define  USBC_BP_POWER_H_HIGH_SPEED_FLAG\t\t4\n#define  USBC_BP_POWER_H_RESET\t\t\t\t\t3\n#define  USBC_BP_POWER_H_RESUME\t\t\t\t\t2\n#define  USBC_BP_POWER_H_SUSPEND\t\t\t\t1\n#define  USBC_BP_POWER_H_SUEPEND_EN\t\t\t\t0\n\n/* USB Power Control for device only  */\n#define  USBC_BP_POWER_D_ISO_UPDATE_EN\t\t\t7\n#define  USBC_BP_POWER_D_SOFT_CONNECT\t\t\t6\n#define  USBC_BP_POWER_D_HIGH_SPEED_EN\t\t\t5\n#define  USBC_BP_POWER_D_HIGH_SPEED_FLAG\t\t4\n#define  USBC_BP_POWER_D_RESET_FLAG\t\t\t\t3\n#define  USBC_BP_POWER_D_RESUME\t\t\t\t\t2\n#define  USBC_BP_POWER_D_SUSPEND\t\t\t\t1\n#define  USBC_BP_POWER_D_ENABLE_SUSPENDM\t\t0\n\n/* interrupt flags for ep0 and the Tx ep1~4 */\n#define  USBC_BP_INTTx_FLAG_EP5\t\t\t\t    5\n#define  USBC_BP_INTTx_FLAG_EP4\t\t\t\t    4\n#define  USBC_BP_INTTx_FLAG_EP3\t\t\t\t    3\n#define  USBC_BP_INTTx_FLAG_EP2\t\t    \t\t2\n#define  USBC_BP_INTTx_FLAG_EP1  \t\t\t\t1\n#define  USBC_BP_INTTx_FLAG_EP0\t\t\t\t\t0\n\n/* interrupt flags for Rx ep1~4 */\n#define  USBC_BP_INTRx_FLAG_EP5\t\t\t\t    5\n#define  USBC_BP_INTRx_FLAG_EP4\t\t\t\t    4\n#define  USBC_BP_INTRx_FLAG_EP3\t\t\t\t    3\n#define  USBC_BP_INTRx_FLAG_EP2\t\t\t\t    2\n#define  USBC_BP_INTRx_FLAG_EP1\t\t\t\t    1\n\n/* interrupt enable for Tx ep0~4 */\n#define  USBC_BP_INTTxE_EN_EP5\t\t\t\t    5\n#define  USBC_BP_INTTxE_EN_EP4\t\t\t\t    4\n#define  USBC_BP_INTTxE_EN_EP3\t\t\t\t    3\n#define  USBC_BP_INTTxE_EN_EP2\t\t\t\t    2\n#define  USBC_BP_INTTxE_EN_EP1\t\t\t\t    1\n#define  USBC_BP_INTTxE_EN_EP0\t\t\t\t\t0\n\n/* interrupt enable for Rx ep1~4 */\n#define  USBC_BP_INTRxE_EN_EP5\t\t\t\t    5\n#define  USBC_BP_INTRxE_EN_EP4\t\t\t\t    4\n#define  USBC_BP_INTRxE_EN_EP3\t\t\t\t    3\n#define  USBC_BP_INTRxE_EN_EP2\t\t\t    \t2\n#define  USBC_BP_INTRxE_EN_EP1  \t\t    \t1\n\n/* USB interrupt */\n#define  USBC_BP_INTUSB_VBUS_ERROR\t\t\t\t7\n#define  USBC_BP_INTUSB_SESSION_REQ\t\t\t\t6\n#define  USBC_BP_INTUSB_DISCONNECT\t\t\t\t5\n#define  USBC_BP_INTUSB_CONNECT\t\t\t\t\t4\n#define  USBC_BP_INTUSB_SOF\t\t\t\t\t\t3\n#define  USBC_BP_INTUSB_RESET\t\t\t\t\t2\n#define  USBC_BP_INTUSB_RESUME\t\t\t\t\t1\n#define  USBC_BP_INTUSB_SUSPEND\t\t\t\t\t0\n\n/* USB interrupt enable */\n#define  USBC_BP_INTUSBE_EN_VBUS_ERROR\t\t\t7\n#define  USBC_BP_INTUSBE_EN_SESSION_REQ\t\t\t6\n#define  USBC_BP_INTUSBE_EN_DISCONNECT\t\t\t5\n#define  USBC_BP_INTUSBE_EN_CONNECT\t\t\t\t4\n#define  USBC_BP_INTUSBE_EN_SOF\t\t\t\t\t3\n#define  USBC_BP_INTUSBE_EN_RESET\t\t\t\t2\n#define  USBC_BP_INTUSBE_EN_RESUME\t\t\t\t1\n#define  USBC_BP_INTUSBE_EN_SUSPEND\t\t\t\t0\n\n/* Test Mode Control */\n#define  USBC_BP_TMCTL_FORCE_HOST               7\n#define  USBC_BP_TMCTL_FIFO_ACCESS              6\n#define  USBC_BP_TMCTL_FORCE_FS                 5\n#define  USBC_BP_TMCTL_FORCE_HS                 4\n#define  USBC_BP_TMCTL_TEST_PACKET              3\n#define  USBC_BP_TMCTL_TEST_K                   2\n#define  USBC_BP_TMCTL_TEST_J                   1\n#define  USBC_BP_TMCTL_TEST_SE0_NAK             0\n\n/* Tx Max packet */\n#define  USBC_BP_TXMAXP_PACKET_COUNT            11\n#define  USBC_BP_TXMAXP_MAXIMUM_PAYLOAD         0\n\n/* Control and Status Register for ep0 for Host only */\n#define  USBC_BP_CSR0_H_DisPing \t\t\t\t11\n#define  USBC_BP_CSR0_H_FlushFIFO\t\t\t\t8\n#define  USBC_BP_CSR0_H_NAK_Timeout\t\t\t\t7\n#define  USBC_BP_CSR0_H_StatusPkt\t\t\t\t6\n#define  USBC_BP_CSR0_H_ReqPkt\t\t\t\t\t5\n#define  USBC_BP_CSR0_H_Error\t\t\t\t\t4\n#define  USBC_BP_CSR0_H_SetupPkt\t\t\t\t3\n#define  USBC_BP_CSR0_H_RxStall\t\t\t\t\t2\n#define  USBC_BP_CSR0_H_TxPkRdy\t\t\t\t\t1\n#define  USBC_BP_CSR0_H_RxPkRdy\t\t\t\t\t0\n\n/* Control and Status Register for ep0 for device only */\n#define  USBC_BP_CSR0_D_FLUSH_FIFO\t\t\t\t8\n#define  USBC_BP_CSR0_D_SERVICED_SETUP_END\t\t7\n#define  USBC_BP_CSR0_D_SERVICED_RX_PKT_READY   6\n#define  USBC_BP_CSR0_D_SEND_STALL\t\t\t\t5\n#define  USBC_BP_CSR0_D_SETUP_END\t\t\t\t4\n#define  USBC_BP_CSR0_D_DATA_END\t\t\t\t3\n#define  USBC_BP_CSR0_D_SENT_STALL\t\t\t\t2\n#define  USBC_BP_CSR0_D_TX_PKT_READY\t\t\t1\n#define  USBC_BP_CSR0_D_RX_PKT_READY\t\t\t0\n\n/* Tx ep Control and Status Register for Host only */\n#define  USBC_BP_TXCSR_H_AUTOSET\t\t\t\t15\n#define  USBC_BP_TXCSR_H_RESERVED\t\t\t\t14\n#define  USBC_BP_TXCSR_H_MODE\t\t\t\t    13\n#define  USBC_BP_TXCSR_H_DMA_REQ_EN\t\t\t \t12\n#define  USBC_BP_TXCSR_H_FORCE_DATA_TOGGLE\t\t11\n#define  USBC_BP_TXCSR_H_DMA_REQ_MODE\t\t\t10\n#define  USBC_BP_TXCSR_H_NAK_TIMEOUT\t\t\t7\n#define  USBC_BP_TXCSR_H_CLEAR_DATA_TOGGLE\t\t6\n#define  USBC_BP_TXCSR_H_TX_STALL\t\t\t\t5\n#define  USBC_BP_TXCSR_H_FLUSH_FIFO\t\t\t\t3\n#define  USBC_BP_TXCSR_H_ERROR\t\t\t\t\t2\n#define  USBC_BP_TXCSR_H_FIFO_NOT_EMPTY \t\t1\n#define  USBC_BP_TXCSR_H_TX_READY\t\t\t\t0\n\n/* Tx ep Control and Status Register for Device only */\n#define  USBC_BP_TXCSR_D_AUTOSET\t\t\t\t15\n#define  USBC_BP_TXCSR_D_ISO\t\t\t\t\t14\n#define  USBC_BP_TXCSR_D_MODE\t\t\t\t\t13\n#define  USBC_BP_TXCSR_D_DMA_REQ_EN\t\t\t\t12\n#define  USBC_BP_TXCSR_D_FORCE_DATA_TOGGLE\t\t11\n#define  USBC_BP_TXCSR_D_DMA_REQ_MODE\t\t\t10\n#define  USBC_BP_TXCSR_D_INCOMPLETE\t\t\t\t7\n#define  USBC_BP_TXCSR_D_CLEAR_DATA_TOGGLE\t\t6\n#define  USBC_BP_TXCSR_D_SENT_STALL\t\t\t\t5\n#define  USBC_BP_TXCSR_D_SEND_STALL\t\t\t\t4\n#define  USBC_BP_TXCSR_D_FLUSH_FIFO\t\t\t\t3\n#define  USBC_BP_TXCSR_D_UNDER_RUN\t\t\t\t2\n#define  USBC_BP_TXCSR_D_FIFO_NOT_EMPTY \t\t1\n#define  USBC_BP_TXCSR_D_TX_READY\t\t\t\t0\n\n/* Rx Max Packet */\n#define  USBC_BP_RXMAXP_PACKET_COUNT            11\n#define  USBC_BP_RXMAXP_MAXIMUM_PAYLOAD         0\n\n/* Rx ep Control and Status Register for Host only */\n#define  USBC_BP_RXCSR_H_AUTO_CLEAR\t\t\t    15\n#define  USBC_BP_RXCSR_H_AUTO_REQ\t\t\t    14\n#define  USBC_BP_RXCSR_H_DMA_REQ_EN\t\t\t    13\n#define  USBC_BP_RXCSR_H_PID_ERROR\t\t\t    12\n#define  USBC_BP_RXCSR_H_DMA_REQ_MODE\t\t    11\n\n#define  USBC_BP_RXCSR_H_INCOMPLETE\t\t\t    8\n#define  USBC_BP_RXCSR_H_CLEAR_DATA_TOGGLE\t    7\n#define  USBC_BP_RXCSR_H_RX_STALL\t\t\t    6\n#define  USBC_BP_RXCSR_H_REQ_PACKET\t\t\t    5\n#define  USBC_BP_RXCSR_H_FLUSH_FIFO\t\t\t    4\n#define  USBC_BP_RXCSR_H_NAK_TIMEOUT\t\t    3\n#define  USBC_BP_RXCSR_H_ERROR\t\t\t\t    2\n#define  USBC_BP_RXCSR_H_FIFO_FULL\t\t\t    1\n#define  USBC_BP_RXCSR_H_RX_PKT_READY\t\t    0\n\n/* Rx ep Control and Status Register for Device only */\n#define  USBC_BP_RXCSR_D_AUTO_CLEAR\t\t\t    15\n#define  USBC_BP_RXCSR_D_ISO\t\t\t\t    14\n#define  USBC_BP_RXCSR_D_DMA_REQ_EN\t\t\t    13\n#define  USBC_BP_RXCSR_D_DISABLE_NYET\t\t    12\n#define  USBC_BP_RXCSR_D_DMA_REQ_MODE\t\t    11\n\n#define  USBC_BP_RXCSR_D_INCOMPLETE\t\t\t    8\n#define  USBC_BP_RXCSR_D_CLEAR_DATA_TOGGLE\t    7\n#define  USBC_BP_RXCSR_D_SENT_STALL\t\t\t    6\n#define  USBC_BP_RXCSR_D_SEND_STALL\t\t\t    5\n#define  USBC_BP_RXCSR_D_FLUSH_FIFO\t\t\t    4\n#define  USBC_BP_RXCSR_D_DATA_ERROR\t\t\t    3\n#define  USBC_BP_RXCSR_D_OVERRUN\t\t\t    2\n#define  USBC_BP_RXCSR_D_FIFO_FULL\t\t\t    1\n#define  USBC_BP_RXCSR_D_RX_PKT_READY\t\t    0\n\n/* Tx Type Register for host only */\n#define  USBC_BP_TXTYPE_SPEED\t                6              //new\n#define  USBC_BP_TXTYPE_PROROCOL\t            4\n#define  USBC_BP_TXTYPE_TARGET_EP_NUM           0\n\n/* Rx Type Register for host only */\n#define  USBC_BP_RXTYPE_SPEED\t\t            6              //new\n#define  USBC_BP_RXTYPE_PROROCOL\t            4\n#define  USBC_BP_RXTYPE_TARGET_EP_NUM           0\n\n/* Core Configueation */\n#define  USBC_BP_CONFIGDATA_MPRXE               7\n#define  USBC_BP_CONFIGDATA_MPTXE               6\n#define  USBC_BP_CONFIGDATA_BIGENDIAN\t\t    5\n#define  USBC_BP_CONFIGDATA_HBRXE\t\t\t    4\n#define  USBC_BP_CONFIGDATA_HBTXE\t\t\t    3\n#define  USBC_BP_CONFIGDATA_DYNFIFO_SIZING\t    2\n#define  USBC_BP_CONFIGDATA_SOFTCONE\t\t    1\n#define  USBC_BP_CONFIGDATA_UTMI_DATAWIDTH\t    0\n\n/* OTG Device Control */\n#define  USBC_BP_DEVCTL_B_DEVICE\t\t\t    7\n#define  USBC_BP_DEVCTL_FS_DEV\t\t\t\t    6\n#define  USBC_BP_DEVCTL_LS_DEV\t\t\t\t    5\n\n#define  USBC_BP_DEVCTL_VBUS\t\t\t\t    3\n#define  USBC_BP_DEVCTL_HOST_MODE\t\t\t    2\n#define  USBC_BP_DEVCTL_HOST_REQ\t\t\t    1\n#define  USBC_BP_DEVCTL_SESSION\t\t\t\t    0\n\n/* Tx EP FIFO size control */\n#define  USBC_BP_TXFIFOSZ_DPB\t\t\t\t    4\n#define  USBC_BP_TXFIFOSZ_SZ\t\t\t\t    0\n\n/* Rx EP FIFO size control */\n#define  USBC_BP_RXFIFOSZ_DPB\t\t\t\t    4\n#define  USBC_BP_RXFIFOSZ_SZ\t\t\t\t    0\n\n/* vendor0 */\n#define  USBC_BP_VEND0_DRQ_SEL\t\t\t\t    1\n#define  USBC_BP_VEND0_BUS_SEL\t\t\t\t    0\n\n/* hub address */\n#define  USBC_BP_HADDR_MULTI_TT\t\t\t\t\t7\n\n/* Interface Status and Control */\n#define  USBC_BP_ISCR_VBUS_VALID_FROM_DATA\t\t30\n#define  USBC_BP_ISCR_VBUS_VALID_FROM_VBUS\t\t29\n#define  USBC_BP_ISCR_EXT_ID_STATUS\t\t\t\t28\n#define  USBC_BP_ISCR_EXT_DM_STATUS\t\t\t\t27\n#define  USBC_BP_ISCR_EXT_DP_STATUS\t\t\t\t26\n#define  USBC_BP_ISCR_MERGED_VBUS_STATUS\t\t25\n#define  USBC_BP_ISCR_MERGED_ID_STATUS\t\t\t24\n\n#define  USBC_BP_ISCR_ID_PULLUP_EN\t\t\t\t17\n#define  USBC_BP_ISCR_DPDM_PULLUP_EN\t\t\t16\n#define  USBC_BP_ISCR_FORCE_ID\t\t\t\t\t14\n#define  USBC_BP_ISCR_FORCE_VBUS_VALID\t\t\t12\n#define  USBC_BP_ISCR_VBUS_VALID_SRC\t\t\t10\n\n#define  USBC_BP_ISCR_HOSC_EN                 \t7\n#define  USBC_BP_ISCR_VBUS_CHANGE_DETECT      \t6\n#define  USBC_BP_ISCR_ID_CHANGE_DETECT        \t5\n#define  USBC_BP_ISCR_DPDM_CHANGE_DETECT      \t4\n#define  USBC_BP_ISCR_IRQ_ENABLE              \t3\n#define  USBC_BP_ISCR_VBUS_CHANGE_DETECT_EN   \t2\n#define  USBC_BP_ISCR_ID_CHANGE_DETECT_EN     \t1\n#define  USBC_BP_ISCR_DPDM_CHANGE_DETECT_EN   \t0\n\n\n#define SUNXI_EHCI_AHB_ICHR8_EN\t\t(1 << 10)\n#define SUNXI_EHCI_AHB_INCR4_BURST_EN\t(1 << 9)\n#define SUNXI_EHCI_AHB_INCRX_ALIGN_EN\t(1 << 8)\n#define SUNXI_EHCI_ULPI_BYPASS_EN\t(1 << 0)\n//-----------------------------------------------------------------------\n//   �Զ���\n//-----------------------------------------------------------------------\n\n/* usb��Դ���� */\n#define  USBC_MAX_CTL_NUM                   1\n#define  USBC_MAX_EP_NUM                    3   //ep0~2, ep�ĸ���\n#define  USBC_MAX_FIFO_SIZE                 (2 * 1024)\n\n/* usb OTG mode */\n#define  USBC_OTG_HOST                      0\n#define  USBC_OTG_DEVICE                    1\n\n/* usb device type */\n#define  USBC_DEVICE_HSDEV                  0\n#define  USBC_DEVICE_FSDEV                  1\n#define  USBC_DEVICE_LSDEV                  2\n\n/*  usb transfer type  */\n#define  USBC_TS_TYPE_IDLE                  0\n#define  USBC_TS_TYPE_CTRL                  1\n#define  USBC_TS_TYPE_ISO                   2\n#define  USBC_TS_TYPE_INT                   3\n#define  USBC_TS_TYPE_BULK                  4\n\n/*  usb transfer mode  */\n#define  USBC_TS_MODE_UNKOWN                0\n#define  USBC_TS_MODE_LS                    1\n#define  USBC_TS_MODE_FS                    2\n#define  USBC_TS_MODE_HS                    3\n\n/* usb Vbus status */\n#define  USBC_VBUS_STATUS_BELOW_SESSIONEND                 0\n#define  USBC_VBUS_STATUS_ABOVE_SESSIONEND_BELOW_AVALID    1\n#define  USBC_VBUS_STATUS_ABOVE_AVALID_BELOW_VBUSVALID     2\n#define  USBC_VBUS_STATUS_ABOVE_VBUSVALID                  3\n\n/* usb io type */\n#define  USBC_IO_TYPE_PIO    \t\t        0\n#define  USBC_IO_TYPE_DMA    \t\t        1\n\n/* usb ep type */\n#define  USBC_EP_TYPE_IDLE    \t\t        0\n#define  USBC_EP_TYPE_EP0    \t\t        1\n#define  USBC_EP_TYPE_TX     \t\t        2\n#define  USBC_EP_TYPE_RX     \t\t        3\n\n/* usb id type */\n#define  USBC_ID_TYPE_DISABLE      \t        0\n#define  USBC_ID_TYPE_HOST         \t        1\n#define  USBC_ID_TYPE_DEVICE       \t        2\n\n/* usb vbus valid type */\n#define  USBC_VBUS_TYPE_DISABLE    \t        0\n#define  USBC_VBUS_TYPE_LOW       \t        1\n#define  USBC_VBUS_TYPE_HIGH       \t        2\n\n/* usb a valid source */\n#define  USBC_A_VALID_SOURCE_UTMI_AVALID\t0\n#define  USBC_A_VALID_SOURCE_UTMI_VBUS    \t1\n\n/* usb device switch */\n#define  USBC_DEVICE_SWITCH_OFF             0\n#define  USBC_DEVICE_SWITCH_ON              1\n\n/* usb fifo config mode */\n#define  USBC_FIFO_MODE_4K                  0\n#define  USBC_FIFO_MODE_8K                  1\n\n/*\n **************************************************\n *  usb interrupt mask\n *\n **************************************************\n */\n\n/* interrupt flags for ep0 and the Tx ep1~4 */\n#define  USBC_INTTx_FLAG_EP5\t\t\t\t    (1 << USBC_BP_INTTx_FLAG_EP5)\n#define  USBC_INTTx_FLAG_EP4\t\t\t\t    (1 << USBC_BP_INTTx_FLAG_EP4)\n#define  USBC_INTTx_FLAG_EP3\t\t\t\t    (1 << USBC_BP_INTTx_FLAG_EP3)\n#define  USBC_INTTx_FLAG_EP2\t\t    \t\t(1 << USBC_BP_INTTx_FLAG_EP2)\n#define  USBC_INTTx_FLAG_EP1  \t\t\t\t    (1 << USBC_BP_INTTx_FLAG_EP1)\n#define  USBC_INTTx_FLAG_EP0\t\t\t\t\t(1 << USBC_BP_INTTx_FLAG_EP0)\n\n/* interrupt flags for Rx ep1~4 */\n#define  USBC_INTRx_FLAG_EP5\t\t\t\t    (1 << USBC_BP_INTRx_FLAG_EP5)\n#define  USBC_INTRx_FLAG_EP4\t\t\t\t    (1 << USBC_BP_INTRx_FLAG_EP4)\n#define  USBC_INTRx_FLAG_EP3\t\t\t\t    (1 << USBC_BP_INTRx_FLAG_EP3)\n#define  USBC_INTRx_FLAG_EP2\t\t\t\t    (1 << USBC_BP_INTRx_FLAG_EP2)\n#define  USBC_INTRx_FLAG_EP1\t\t\t\t    (1 << USBC_BP_INTRx_FLAG_EP1)\n\n/* USB interrupt */\n#define  USBC_INTUSB_VBUS_ERROR\t\t\t\t    (1 << USBC_BP_INTUSB_VBUS_ERROR)\n#define  USBC_INTUSB_SESSION_REQ\t\t\t\t(1 << USBC_BP_INTUSB_SESSION_REQ)\n#define  USBC_INTUSB_DISCONNECT\t\t\t\t    (1 << USBC_BP_INTUSB_DISCONNECT)\n#define  USBC_INTUSB_CONNECT\t\t\t\t\t(1 << USBC_BP_INTUSB_CONNECT)\n#define  USBC_INTUSB_SOF\t\t\t\t\t\t(1 << USBC_BP_INTUSB_SOF)\n#define  USBC_INTUSB_RESET\t\t\t\t\t    (1 << USBC_BP_INTUSB_RESET)\n#define  USBC_INTUSB_RESUME\t\t\t\t\t    (1 << USBC_BP_INTUSB_RESUME)\n#define  USBC_INTUSB_SUSPEND\t\t\t\t\t(1 << USBC_BP_INTUSB_SUSPEND)\n\n#define USB_CSRL0_NAKTO         0x00000080  // NAK Timeout\n#define USB_CSRL0_SETENDC       0x00000080  // Setup End Clear\n#define USB_CSRL0_STATUS        0x00000040  // STATUS Packet\n#define USB_CSRL0_RXRDYC        0x00000040  // RXRDY Clear\n#define USB_CSRL0_REQPKT        0x00000020  // Request Packet\n#define USB_CSRL0_STALL         0x00000020  // Send Stall\n#define USB_CSRL0_SETEND        0x00000010  // Setup End\n#define USB_CSRL0_ERROR         0x00000010  // Error\n#define USB_CSRL0_DATAEND       0x00000008  // Data End\n#define USB_CSRL0_SETUP         0x00000008  // Setup Packet\n#define USB_CSRL0_STALLED       0x00000004  // Endpoint Stalled\n#define USB_CSRL0_TXRDY         0x00000002  // Transmit Packet Ready\n#define USB_CSRL0_RXRDY         0x00000001  // Receive Packet Ready\n\n#define USB_RXFIFOSZ_DPB        0x00000010  // Double Packet Buffer Support\n#define USB_RXFIFOSZ_SIZE_M     0x0000000F  // Max Packet Size\n\n#define USB_TXFIFOSZ_DPB        0x00000010  // Double Packet Buffer Support\n#define USB_TXFIFOSZ_SIZE_M     0x0000000F  // Max Packet Size\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dcd_dwc2.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 William D. Jones\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n * Copyright (c) 2020 Jan Duempelmann\n * Copyright (c) 2020 Reinhard Panhuber\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_DWC2)\n\n#if !(CFG_TUD_DWC2_SLAVE_ENABLE || CFG_TUD_DWC2_DMA_ENABLE)\n#error DWC2 require either CFG_TUD_DWC2_SLAVE_ENABLE or CFG_TUD_DWC2_DMA_ENABLE to be enabled\n#endif\n\n// Debug level for DWC2\n#define DWC2_DEBUG    2\n\n#include \"device/dcd.h\"\n#include \"device/usbd.h\"\n#include \"device/usbd_pvt.h\"\n#include \"dwc2_common.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM\n//--------------------------------------------------------------------+\ntypedef struct {\n  uint8_t* buffer;\n  tu_fifo_t* ff;\n  uint16_t total_len;\n  uint16_t max_size;\n  uint8_t interval;\n  uint8_t iso_retry; // ISO retry counter\n} xfer_ctl_t;\n\n// This variable is modified from ISR context, so it must be protected by critical section\nstatic xfer_ctl_t xfer_status[DWC2_EP_MAX][2];\n#define XFER_CTL_BASE(_ep, _dir) (&xfer_status[_ep][_dir])\n\ntypedef struct {\n  // EP0 transfers are limited to 1 packet - larger sizes has to be split\n  uint16_t ep0_pending[2];  // Index determines direction as tusb_dir_t type\n  uint16_t dfifo_top;      // top free location in DFIFO in words\n\n  // Number of IN endpoints active\n  uint8_t allocated_epin_count;\n\n  // SOF enabling flag - required for SOF to not get disabled in ISR when SOF was enabled by\n  bool sof_en;\n} dcd_data_t;\n\nstatic dcd_data_t _dcd_data;\n\nCFG_TUD_MEM_SECTION static struct {\n  TUD_EPBUF_DEF(setup_packet, 8);\n} _dcd_usbbuf;\n\nstatic tud_configure_dwc2_t _tud_cfg = CFG_TUD_CONFIGURE_DWC2_DEFAULT;\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t dwc2_ep_count(const dwc2_regs_t* dwc2) {\n  #if TU_CHECK_MCU(OPT_MCU_GD32VF103)\n  (void) dwc2;\n  return DWC2_EP_MAX;\n  #else\n  const dwc2_ghwcfg2_t ghwcfg2 = {.value = dwc2->ghwcfg2};\n  return ghwcfg2.num_dev_ep + 1;\n  #endif\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline bool edpt_is_enabled(dwc2_dep_t* dep) {\n  return (dep->ctl & EPCTL_EPENA) != 0;\n}\n\n  #if CFG_TUD_DWC2_SLAVE_ENABLE\nstatic uint16_t epin_write_tx_fifo(dwc2_regs_t *dwc2, uint8_t epnum);\n  #endif\n\n  //--------------------------------------------------------------------\n  // DMA\n  //--------------------------------------------------------------------\n  #if CFG_TUD_MEM_DCACHE_ENABLE\nbool dcd_dcache_clean(const void* addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return dwc2_dcache_clean(addr, data_size);\n}\n\nbool dcd_dcache_invalidate(const void* addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return dwc2_dcache_invalidate(addr, data_size);\n}\n\nbool dcd_dcache_clean_invalidate(const void* addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return dwc2_dcache_clean_invalidate(addr, data_size);\n}\n#endif\n\nTU_ATTR_ALWAYS_INLINE static inline bool dma_device_enabled(const dwc2_regs_t* dwc2) {\n  (void) dwc2;\n  // Internal DMA only\n  const dwc2_ghwcfg2_t ghwcfg2 = {.value = dwc2->ghwcfg2};\n  return CFG_TUD_DWC2_DMA_ENABLE && ghwcfg2.arch == GHWCFG2_ARCH_INTERNAL_DMA;\n}\n\nstatic void dma_setup_prepare(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  if (dwc2->gsnpsid >= DWC2_CORE_REV_3_00a) {\n    if(edpt_is_enabled(&dwc2->epout[0])) {\n      return;\n    }\n  }\n\n  // Receive only 1 packet\n  dwc2->epout[0].doeptsiz = (1 << DOEPTSIZ_STUPCNT_Pos) | (1 << DOEPTSIZ_PKTCNT_Pos) | (8 << DOEPTSIZ_XFRSIZ_Pos);\n  dwc2->epout[0].doepdma = (uintptr_t) _dcd_usbbuf.setup_packet;\n  dwc2->epout[0].doepctl |= DOEPCTL_EPENA | DOEPCTL_USBAEP;\n}\n\n//--------------------------------------------------------------------+\n// Data FIFO\n//--------------------------------------------------------------------+\n\n\n/* Device Data FIFO scheme\n\n  The FIFO is split up into\n  - EPInfo: for storing DMA metadata, only required when use DMA. Maximum size is called\n    EP_LOC_CNT = ep_fifo_size - ghwcfg3.dfifo_depth. For value less than EP_LOC_CNT, gdfifocfg must be configured before\n    gahbcfg.dmaen is set\n      - Buffer mode: 1 word per endpoint direction\n      - Scatter/Gather DMA: 4 words per endpoint direction\n  - TX FIFO: one fifo for each IN endpoint. Size is dynamic depending on packet size, starting from top with EP0 IN.\n  - Shared RX FIFO: a shared fifo for all OUT endpoints. Typically, can hold up to 2 packets of the largest EP size.\n\n  We allocated TX FIFO from top to bottom (using top pointer), this to allow the RX FIFO to grow dynamically which is\n  possible since the free space is located between the RX and TX FIFOs.\n\n   ---------------- ep_fifo_size\n  |  DxEPIDMAn  |\n  |-------------|-- gdfifocfg.EPINFOBASE (max is ghwcfg3.dfifo_depth)\n  | IN FIFO 0   |       control EP\n  |-------------|\n  | IN FIFO 1   |\n  |-------------|\n  |   . . . .   |\n  |-------------|\n  | IN FIFO n   |\n  |-------------|\n  |    FREE     |\n  |-------------|-- GRXFSIZ (expandable)\n  |  OUT FIFO   |\n  | ( Shared )  |\n  --------------- 0\n\n  According to \"FIFO RAM allocation\" section in RM, FIFO RAM are allocated as follows (each word 32-bits):\n  - Each EP IN needs at least max packet size\n  - All EP OUT shared a unique OUT FIFO which uses (for Slave or Buffer DMA, Scatt/Gather DMA use different formula):\n    - 13 for setup packets + control words (up to 3 setup packets).\n    - 1 for global NAK (not required/used here).\n    - Largest-EPsize/4 + 1. (FS: 64 bytes, HS: 512 bytes). Recommended is  \"2 x (Largest-EPsize/4 + 1)\"\n    - 2 for each used OUT endpoint\n\n    Therefore GRXFSIZ = 13 + 1 + 2 x (Largest-EPsize/4 + 1) + 2 x EPOUTnum\n*/\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t calc_device_grxfsiz(uint16_t largest_ep_size, uint8_t ep_count) {\n  return 13 + 1 + 2 * ((largest_ep_size / 4) + 1) + 2 * ep_count;\n}\n\nstatic bool dfifo_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t packet_size, bool is_bulk) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const dwc2_controller_t* dwc2_controller = &_dwc2_controller[rhport];\n  const uint8_t ep_count = dwc2_controller->ep_count;\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir = tu_edpt_dir(ep_addr);\n\n  TU_ASSERT(epnum < ep_count);\n\n  uint16_t fifo_size = tu_div_ceil(packet_size, 4);\n  if (dir == TUSB_DIR_OUT) {\n    // Calculate required size of RX FIFO\n    const uint16_t new_sz = calc_device_grxfsiz(4 * fifo_size, ep_count);\n\n    // If size_rx needs to be extended check if there is enough free space\n    if (dwc2->grxfsiz < new_sz) {\n      TU_ASSERT(new_sz <= _dcd_data.dfifo_top);\n      dwc2->grxfsiz = new_sz; // Enlarge RX FIFO\n    }\n  } else {\n    // Check IN endpoints concurrently active limit\n    if(0 != dwc2_controller->ep_in_count) {\n      TU_ASSERT(_dcd_data.allocated_epin_count < dwc2_controller->ep_in_count);\n      _dcd_data.allocated_epin_count++;\n    }\n\n    // Enable double buffering if configured, only effective for non-periodic endpoints\n    // Since we queue only 1 control transfer at a time, it's only applicable for bulk IN endpoints\n    if (((_tud_cfg.bm_double_buffered & (1 << epnum)) != 0) && epnum > 0 && is_bulk) {\n      fifo_size *= 2;\n    }\n\n    // Check if free space is available\n    TU_ASSERT(_dcd_data.dfifo_top >= fifo_size + dwc2->grxfsiz);\n    _dcd_data.dfifo_top -= fifo_size;\n    // TU_LOG(DWC2_DEBUG, \"    TX FIFO %u: allocated %u words at offset %u\\r\\n\", epnum, fifo_size, dfifo_top);\n\n    // Both TXFD and TXSA are in unit of 32-bit words.\n    if (epnum == 0) {\n      dwc2->dieptxf0 = ((uint32_t) fifo_size << DIEPTXF0_TX0FD_Pos) | _dcd_data.dfifo_top;\n    } else {\n      // DIEPTXF starts at FIFO #1.\n      dwc2->dieptxf[epnum - 1] = ((uint32_t) fifo_size << DIEPTXF_INEPTXFD_Pos) | _dcd_data.dfifo_top;\n    }\n  }\n\n  return true;\n}\n\nstatic void dfifo_device_init(uint8_t rhport) {\n  const dwc2_controller_t* dwc2_controller = &_dwc2_controller[rhport];\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  dwc2->grxfsiz = calc_device_grxfsiz(CFG_TUD_ENDPOINT0_SIZE, dwc2_controller->ep_count);\n\n  // Scatter/Gather DMA mode is not yet supported. Buffer DMA only need 1 words per endpoint direction\n  const bool is_dma = dma_device_enabled(dwc2);\n  _dcd_data.dfifo_top = dwc2_controller->ep_fifo_size/4;\n  if (is_dma) {\n    _dcd_data.dfifo_top -= 2 * dwc2_controller->ep_count;\n  }\n  dwc2->gdfifocfg = ((uint32_t) _dcd_data.dfifo_top << GDFIFOCFG_EPINFOBASE_SHIFT) | _dcd_data.dfifo_top;\n\n  // Allocate FIFO for EP0 IN\n  (void) dfifo_alloc(rhport, 0x80, CFG_TUD_ENDPOINT0_SIZE, false);\n}\n\n\n//--------------------------------------------------------------------\n// Endpoint\n//--------------------------------------------------------------------\nstatic void edpt_activate(uint8_t rhport, const tusb_desc_endpoint_t* p_endpoint_desc) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const uint8_t epnum = tu_edpt_number(p_endpoint_desc->bEndpointAddress);\n  const uint8_t dir = tu_edpt_dir(p_endpoint_desc->bEndpointAddress);\n\n  xfer_ctl_t* xfer = XFER_CTL_BASE(epnum, dir);\n  xfer->max_size = tu_edpt_packet_size(p_endpoint_desc);\n\n  const dwc2_dsts_t dsts = {.value = dwc2->dsts};\n  if (dsts.enum_speed == DCFG_SPEED_HIGH) {\n    xfer->interval = 1 << (p_endpoint_desc->bInterval - 1);\n  } else {\n    xfer->interval =  p_endpoint_desc->bInterval;\n  }\n\n  // Endpoint control\n  dwc2_depctl_t depctl = {.value = 0};\n  depctl.mps = xfer->max_size;\n  depctl.active = 1;\n  depctl.type = p_endpoint_desc->bmAttributes.xfer;\n  if (p_endpoint_desc->bmAttributes.xfer != TUSB_XFER_ISOCHRONOUS) {\n    depctl.set_data0_iso_even = 1;\n  }\n  if (dir == TUSB_DIR_IN) {\n    depctl.tx_fifo_num = epnum;\n  }\n\n  dwc2_dep_t* dep = &dwc2->ep[dir == TUSB_DIR_IN ? 0 : 1][epnum];\n  dep->ctl = depctl.value;\n  dwc2->daintmsk |= TU_BIT(epnum + DAINT_SHIFT(dir));\n}\n\nstatic void edpt_disable(uint8_t rhport, uint8_t ep_addr, bool stall) {\n  (void) rhport;\n\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const uint8_t epnum = tu_edpt_number(ep_addr);\n  const uint8_t dir = tu_edpt_dir(ep_addr);\n  dwc2_dep_t* dep = &dwc2->ep[dir == TUSB_DIR_IN ? 0 : 1][epnum];\n\n  const uint32_t stall_mask = (stall ? EPCTL_STALL : 0);\n\n  if (dir == TUSB_DIR_IN) {\n    if (!edpt_is_enabled(dep)) {\n      dep->diepctl |= DIEPCTL_SNAK | stall_mask;\n    } else {\n      // Stop transmitting packets and NAK IN xfers.\n      dep->diepctl |= DIEPCTL_SNAK;\n      while ((dep->diepint & DIEPINT_INEPNE) == 0) {}\n\n      // Disable the endpoint.\n      dep->diepctl |= DIEPCTL_EPDIS | stall_mask;\n      while ((dep->diepint & DIEPINT_EPDISD_Msk) == 0) {}\n\n      dep->diepint = DIEPINT_EPDISD;\n    }\n\n    // Flush the FIFO, and wait until we have confirmed it cleared.\n    dfifo_flush_tx(dwc2, epnum);\n  } else {\n    if (!edpt_is_enabled(dep) || epnum == 0) {\n      // non-control not-enabled: stall if set\n      // For EP0 Out, keep it enabled to receive SETUP packets\n      dep->doepctl |= stall_mask;\n    } else {\n      // Asserting GONAK is required to STALL an OUT endpoint.\n      // Simpler to use polling here, we don't use the \"B\"OUTNAKEFF interrupt\n      // anyway, and it can't be cleared by user code. If this while loop never\n      // finishes, we have bigger problems than just the stack.\n      dwc2->dctl |= DCTL_SGONAK;\n      while ((dwc2->gintsts & GINTSTS_BOUTNAKEFF_Msk) == 0) {}\n\n      // Ditto here disable the endpoint.\n      dep->doepctl |= DOEPCTL_EPDIS | stall_mask;\n      while ((dep->doepint & DOEPINT_EPDISD_Msk) == 0) {}\n\n      dep->doepint = DOEPINT_EPDISD;\n\n      // Allow other OUT endpoints to keep receiving.\n      dwc2->dctl |= DCTL_CGONAK;\n    }\n  }\n}\n\n// Since this function returns void, it is not possible to return a boolean success message\n// We must make sure that this function is not called when the EP is disabled\n// Must be called from critical section\nstatic void edpt_schedule_packets(uint8_t rhport, const uint8_t epnum, const uint8_t dir) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  xfer_ctl_t* const xfer = XFER_CTL_BASE(epnum, dir);\n  dwc2_dep_t* dep = &dwc2->ep[dir == TUSB_DIR_IN ? 0 : 1][epnum];\n\n  uint16_t num_packets;\n  uint16_t total_bytes;\n\n  // EP0 is limited to one packet per xfer\n  if (epnum == 0) {\n    total_bytes = tu_min16(_dcd_data.ep0_pending[dir], CFG_TUD_ENDPOINT0_SIZE);\n    _dcd_data.ep0_pending[dir] -= total_bytes;\n    num_packets = 1;\n  } else {\n    total_bytes = xfer->total_len;\n    num_packets = tu_div_ceil(total_bytes, xfer->max_size);\n    if (num_packets == 0) {\n      num_packets = 1; // zero length packet still count as 1\n    }\n  }\n\n  // transfer size: A full OUT transfer (multiple packets, possibly) triggers XFRC.\n  dwc2_ep_tsize_t deptsiz = {.value = 0};\n  deptsiz.xfer_size = total_bytes;\n  deptsiz.packet_count = num_packets;\n  dep->tsiz = deptsiz.value;\n\n  // control\n  dwc2_depctl_t depctl = {.value = dep->ctl};\n  depctl.clear_nak = 1;\n  depctl.enable = 1;\n  if (depctl.type == DEPCTL_EPTYPE_ISOCHRONOUS) {\n    const dwc2_dsts_t dsts = {.value = dwc2->dsts};\n    const uint32_t odd_now = dsts.frame_number & 1u;\n    if (odd_now != 0) {\n      depctl.set_data0_iso_even = 1;\n    } else {\n      depctl.set_data1_iso_odd = 1;\n    }\n  }\n\n  #if CFG_TUD_DWC2_DMA_ENABLE\n  const bool is_dma = dma_device_enabled(dwc2);\n  if(is_dma) {\n    if (dir == TUSB_DIR_IN && total_bytes != 0) {\n      dcd_dcache_clean(xfer->buffer, total_bytes);\n    }\n    dep->diepdma = (uintptr_t) xfer->buffer;\n    dep->diepctl = depctl.value; // enable endpoint\n    // Advance buffer pointer for EP0\n    if (epnum == 0) {\n      xfer->buffer += total_bytes;\n    }\n  } else\n  #endif\n  {\n  #if CFG_TUD_DWC2_SLAVE_ENABLE\n    dep->diepctl = depctl.value; // enable endpoint\n\n    if (dir == TUSB_DIR_IN && total_bytes != 0) {\n      const uint16_t xferred_bytes = epin_write_tx_fifo(dwc2, epnum);\n\n      // Enable TXFE interrupt if there are still data to be sent\n      // EP0 only sends one packet at a time, so no need to check for EP0\n      if ((epnum != 0) && (xfer->total_len - xferred_bytes > 0)) {\n         dwc2->diepempmsk |= (1u << epnum);\n      }\n    }\n  #endif\n  }\n}\n\n//--------------------------------------------------------------------\n// Controller API\n//--------------------------------------------------------------------\n// optional dcd configuration, called by tud_configure()\nbool dcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {\n  (void) rhport;\n  TU_VERIFY(cfg_id == TUD_CFGID_DWC2 && cfg_param != NULL);\n\n  const tud_configure_param_t* const cfg = (const tud_configure_param_t*) cfg_param;\n  _tud_cfg = cfg->dwc2;\n  return true;\n}\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  tu_memclr(&_dcd_data, sizeof(_dcd_data));\n\n  // Core Initialization\n  const bool is_hs_phy = dwc2_core_is_highspeed_phy(dwc2, TUD_OPT_HIGH_SPEED);\n  const bool is_dma = dma_device_enabled(dwc2);\n  TU_ASSERT(dwc2_core_init(rhport, is_hs_phy, is_dma));\n\n  //------------- 7.1 Device Initialization -------------//\n  // Set device max speed\n  uint32_t dcfg = dwc2->dcfg & ~DCFG_DSPD_Msk;\n  if (is_hs_phy) {\n    // dcfg Highspeed's mask is 0\n\n    // XCVRDLY: transceiver delay between xcvr_sel and txvalid during device chirp is required\n    // when using with some PHYs such as USB334x (USB3341, USB3343, USB3346, USB3347)\n    const dwc2_ghwcfg2_t ghwcfg2 = {.value = dwc2->ghwcfg2};\n    if (ghwcfg2.hs_phy_type == GHWCFG2_HSPHY_ULPI) {\n      dcfg |= DCFG_XCVRDLY;\n    }\n  } else {\n    dcfg |= DCFG_DSPD_FS << DCFG_DSPD_Pos;\n  }\n\n  dcfg |= DCFG_NZLSOHSK; // send STALL back and discard if host send non-zlp during control status\n  dwc2->dcfg = dcfg;\n\n  dcd_disconnect(rhport);\n\n  // Force device mode\n  dwc2->gusbcfg = (dwc2->gusbcfg & ~GUSBCFG_FHMOD) | GUSBCFG_FDMOD;\n\n  // OTG Ctrl\n  uint32_t gotgctl = dwc2->gotgctl & ~GOTGCTL_AVALOEN; // Clear A-override\n  if (!_tud_cfg.vbus_sensing) {\n    gotgctl |= GOTGCTL_BVALOEN | GOTGCTL_BVALOVAL;     // force B Valid if not sensing VBus\n  }\n  dwc2->gotgctl = gotgctl;\n\n  #ifdef TUP_USBIP_DWC2_STM32\n  dwc2_stm32_gccfg_cfg(dwc2, _tud_cfg.vbus_sensing, false);\n  #endif\n\n  // Enable required interrupts\n  dwc2->gintmsk |= GINTMSK_OTGINT | GINTMSK_USBRST | GINTMSK_ENUMDNEM | GINTMSK_WUIM;\n\n  uint32_t gahbcfg = dwc2->gahbcfg;\n  gahbcfg |= GAHBCFG_GINT; // Enable global interrupt\n  dwc2->gahbcfg = gahbcfg;\n\n  dcd_connect(rhport);\n  return true;\n}\n\nbool dcd_deinit(uint8_t rhport) {\n  dcd_disconnect(rhport);\n  dwc2_core_deinit(rhport);\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  dwc2_dcd_int_enable(rhport);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  dwc2_dcd_int_disable(rhport);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  dwc2->dcfg = (dwc2->dcfg & ~DCFG_DAD_Msk) | (dev_addr << DCFG_DAD_Pos);\n\n  // Response with status after changing device address\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  (void) rhport;\n\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  // set remote wakeup\n  dwc2->dctl |= DCTL_RWUSIG;\n\n  // enable SOF to detect bus resume\n  dwc2->gintsts = GINTSTS_SOF;\n  dwc2->gintmsk |= GINTMSK_SOFM;\n\n  // Per specs: remote wakeup signal bit must be clear within 1-15ms\n  dwc2_remote_wakeup_delay();\n\n  dwc2->dctl &= ~DCTL_RWUSIG;\n}\n\nvoid dcd_connect(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n#ifdef TUP_USBIP_DWC2_ESP32\n  // On ESP32-P4 HS PHY, do not write to USB_WRAP register which belongs to FS PHY\n  if (rhport == 0) {\n    usb_wrap_otg_conf_reg_t conf = USB_WRAP.otg_conf;\n    conf.pad_pull_override = 0;\n    conf.dp_pullup = 0;\n    conf.dp_pulldown = 0;\n    conf.dm_pullup = 0;\n    conf.dm_pulldown = 0;\n    USB_WRAP.otg_conf = conf;\n  }\n#endif\n\n  dwc2->dctl &= ~DCTL_SDIS;\n}\n\nvoid dcd_disconnect(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n#ifdef TUP_USBIP_DWC2_ESP32\n  // On ESP32-P4 HS PHY, do not write to USB_WRAP register which belongs to FS PHY\n  if (rhport == 0) {\n    usb_wrap_otg_conf_reg_t conf = USB_WRAP.otg_conf;\n    conf.pad_pull_override = 1;\n    conf.dp_pullup = 0;\n    conf.dp_pulldown = 1;\n    conf.dm_pullup = 0;\n    conf.dm_pulldown = 1;\n    USB_WRAP.otg_conf = conf;\n  }\n#endif\n\n  dwc2->dctl |= DCTL_SDIS;\n}\n\n// Be advised: audio, video and possibly other iso-ep classes use dcd_sof_enable() to enable/disable its corresponding ISR on purpose!\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void) rhport;\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  _dcd_data.sof_en = en;\n\n  if (en) {\n    dwc2->gintsts = GINTSTS_SOF;\n    dwc2->gintmsk |= GINTMSK_SOFM;\n  } else {\n    dwc2->gintmsk &= ~GINTMSK_SOFM;\n  }\n}\n\n/*------------------------------------------------------------------*/\n/* DCD Endpoint port\n *------------------------------------------------------------------*/\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const* desc_edpt) {\n  TU_ASSERT(dfifo_alloc(rhport, desc_edpt->bEndpointAddress, tu_edpt_packet_size(desc_edpt),\n                       desc_edpt->bmAttributes.xfer == TUSB_XFER_BULK));\n  edpt_activate(rhport, desc_edpt);\n  return true;\n}\n\n// Close all non-control endpoints, cancel all pending transfers if any.\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  uint8_t const ep_count = _dwc2_controller[rhport].ep_count;\n\n  usbd_spin_lock(false);\n\n  _dcd_data.allocated_epin_count = 0;\n\n  // Disable non-control interrupt\n  dwc2->daintmsk = (1 << DAINTMSK_OEPM_Pos) | (1 << DAINTMSK_IEPM_Pos);\n\n  for (uint8_t n = 1; n < ep_count; n++) {\n    for (uint8_t d = 0; d < 2; d++) {\n      dwc2_dep_t* dep = &dwc2->ep[d][n];\n      if (edpt_is_enabled(dep)) {\n        dep->ctl |= EPCTL_SNAK | EPCTL_EPDIS;\n      }\n      xfer_status[n][1-d].max_size = 0;\n    }\n  }\n\n  dfifo_flush_tx(dwc2, 0x10); // all tx fifo\n  dfifo_flush_rx(dwc2);\n  dfifo_device_init(rhport); // re-init dfifo\n\n  usbd_spin_unlock(false);\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  TU_ASSERT(dfifo_alloc(rhport, ep_addr, largest_packet_size, false));\n  return true;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport,  tusb_desc_endpoint_t const * p_endpoint_desc) {\n  // Disable EP to clear potential incomplete transfers\n  edpt_disable(rhport, p_endpoint_desc->bEndpointAddress, false);\n  edpt_activate(rhport, p_endpoint_desc);\n  return true;\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t* buffer, uint16_t total_bytes, bool is_isr) {\n  (void) is_isr;\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n  xfer_ctl_t* xfer = XFER_CTL_BASE(epnum, dir);\n  bool ret;\n\n  usbd_spin_lock(is_isr);\n\n  if (xfer->max_size == 0) {\n    ret = false;  // Endpoint is closed\n  } else {\n    xfer->buffer = buffer;\n    xfer->ff = NULL;\n    xfer->total_len = total_bytes;\n    xfer->iso_retry = xfer->interval; // Reset ISO retry counter to interval value\n\n    // EP0 can only handle one packet\n    if (epnum == 0) {\n      _dcd_data.ep0_pending[dir] = total_bytes;\n    }\n\n    // Schedule packets to be sent within interrupt\n    edpt_schedule_packets(rhport, epnum, dir);\n    ret = true;\n  }\n\n  usbd_spin_unlock(is_isr);\n\n  return ret;\n}\n\n// The number of bytes has to be given explicitly to allow more flexible control of how many\n// bytes should be written and second to keep the return value free to give back a boolean\n// success message. If total_bytes is too big, the FIFO will copy only what is available\n// into the USB buffer!\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t* ff, uint16_t total_bytes, bool is_isr) {\n  (void) is_isr;\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n  xfer_ctl_t* xfer = XFER_CTL_BASE(epnum, dir);\n  bool ret;\n\n  usbd_spin_lock(is_isr);\n\n  if (xfer->max_size == 0) {\n    ret = false;  // Endpoint is closed\n  } else {\n    xfer->buffer = NULL;\n    xfer->ff = ff;\n    xfer->total_len = total_bytes;\n    xfer->iso_retry = xfer->interval; // Reset ISO retry counter to interval value\n\n    // Schedule packets to be sent within interrupt\n    // TODO xfer fifo may only available for slave mode\n    edpt_schedule_packets(rhport, epnum, dir);\n    ret = true;\n  }\n\n  usbd_spin_unlock(is_isr);\n\n  return ret;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  edpt_disable(rhport, ep_addr, true);\n\n  // For control endpoint, prepare to receive SETUP packet\n  if (tu_edpt_number(ep_addr) == 0) {\n    if (dma_device_enabled(dwc2)) {\n      dma_setup_prepare(rhport);\n    }\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n  dwc2_dep_t* dep = &dwc2->ep[dir == TUSB_DIR_IN ? 0 : 1][epnum];\n\n  // Clear stall and reset data toggle\n  dep->ctl &= ~EPCTL_STALL;;\n  dep->ctl |= EPCTL_SD0PID_SEVNFRM;\n}\n\n//--------------------------------------------------------------------\n// Interrupt Handler\n//--------------------------------------------------------------------\n\n// 7.4.1 Initialization on USB Reset\n// Must be called from critical section\nstatic void handle_bus_reset(uint8_t rhport) {\n  dwc2_regs_t *dwc2 = DWC2_REG(rhport);\n  const uint8_t ep_count =  dwc2_ep_count(dwc2);\n\n  tu_memclr(xfer_status, sizeof(xfer_status));\n\n  _dcd_data.sof_en = false;\n  _dcd_data.allocated_epin_count = 0;\n\n  // 1. NAK for all OUT endpoints\n  for (uint8_t n = 0; n < ep_count; n++) {\n    dwc2->epout[n].doepctl |= DOEPCTL_SNAK;\n  }\n\n  // Disable all IN endpoints\n  for (uint8_t n = 0; n < ep_count; n++) {\n    dwc2_dep_t* dep = &dwc2->epin[n];\n    if (edpt_is_enabled(dep)) {\n      dep->diepctl |= DIEPCTL_SNAK | DIEPCTL_EPDIS;\n    }\n  }\n\n  // 2. Set up interrupt mask for EP0\n  dwc2->daintmsk = TU_BIT(DAINTMSK_OEPM_Pos) | TU_BIT(DAINTMSK_IEPM_Pos);\n  dwc2->doepmsk = DOEPMSK_STUPM | DOEPMSK_XFRCM;\n  dwc2->diepmsk = DIEPMSK_TOM | DIEPMSK_XFRCM;\n\n  // 4. Set up DFIFO\n  dfifo_flush_tx(dwc2, 0x10); // all tx fifo\n  dfifo_flush_rx(dwc2);\n  dfifo_device_init(rhport);\n\n  // 5. Reset device address\n  dwc2_dcfg_t dcfg = {.value = dwc2->dcfg};\n  dcfg.address = 0;\n  dwc2->dcfg = dcfg.value;\n\n  // 6. Configure maximum packet size for EP0\n  uint8_t mps = 0;\n  switch (CFG_TUD_ENDPOINT0_SIZE) {\n    case 8: mps = 3; break;\n    case 16: mps = 2; break;\n    case 32: mps = 1; break;\n    case 64: mps = 0; break;\n    default: mps = 0; break;\n  }\n\n  dwc2->epin[0].ctl &= ~DIEPCTL0_MPSIZ_Msk;\n  dwc2->epout[0].ctl &= ~DOEPCTL0_MPSIZ_Msk;\n  dwc2->epin[0].ctl |= mps << DIEPCTL0_MPSIZ_Pos;\n  dwc2->epout[0].ctl |= mps << DOEPCTL0_MPSIZ_Pos;\n\n  xfer_status[0][TUSB_DIR_OUT].max_size = CFG_TUD_ENDPOINT0_SIZE;\n  xfer_status[0][TUSB_DIR_IN].max_size = CFG_TUD_ENDPOINT0_SIZE;\n\n  if(dma_device_enabled(dwc2)) {\n    dma_setup_prepare(rhport);\n  } else {\n    dwc2->epout[0].doeptsiz |= (3 << DOEPTSIZ_STUPCNT_Pos);\n  }\n\n  dwc2->gintmsk |= GINTMSK_OTGINT | GINTMSK_OEPINT | GINTMSK_IEPINT | GINTMSK_IISOIXFRM;\n}\n\nstatic void handle_enum_done(uint8_t rhport) {\n  dwc2_regs_t *dwc2 = DWC2_REG(rhport);\n  const dwc2_dsts_t dsts = {.value = dwc2->dsts};\n  tusb_speed_t speed;\n  switch (dsts.enum_speed) {\n    case DCFG_SPEED_HIGH:\n      speed = TUSB_SPEED_HIGH;\n    break;\n\n    case DCFG_SPEED_LOW:\n      speed = TUSB_SPEED_LOW;\n    break;\n\n    case DCFG_SPEED_FULL_30_60MHZ:\n    case DCFG_SPEED_FULL_48MHZ:\n    default:\n      speed = TUSB_SPEED_FULL;\n    break;\n  }\n\n  // TODO must update GUSBCFG_TRDT according to link speed\n  dcd_event_bus_reset(rhport, speed, true);\n}\n\n#if 0\nTU_ATTR_ALWAYS_INLINE static inline void print_doepint(uint32_t doepint) {\n  const char* str[] = {\n    \"XFRC\", \"DIS\", \"AHBERR\", \"SETUP_DONE\",\n    \"ORXED\", \"STATUS_RX\", \"SETUP_B2B\", \"RSV7\",\n    \"OPERR\", \"BNA\", \"RSV10\", \"ISODROP\",\n    \"BBLERR\", \"NAK\", \"NYET\", \"SETUP_RX\"\n  };\n\n  for(uint32_t i=0; i<TU_ARRAY_SIZE(str); i++) {\n    if (doepint & TU_BIT(i)) {\n      TU_LOG1(\"%s \", str[i]);\n    }\n  }\n  TU_LOG1(\"\\r\\n\");\n}\n#endif\n\n#if CFG_TUD_DWC2_SLAVE_ENABLE\nstatic uint16_t epin_write_tx_fifo(dwc2_regs_t *dwc2, uint8_t epnum) {\n  dwc2_dep_t *const epin = &dwc2->ep[0][epnum];\n  xfer_ctl_t *const xfer = XFER_CTL_BASE(epnum, TUSB_DIR_IN);\n\n  dwc2_ep_tsize_t tsiz           = {.value = epin->tsiz};\n  const uint16_t  remain_packets = tsiz.packet_count;\n\n  uint16_t total_bytes_written = 0;\n  // Process every single packet (only whole packets can be written to fifo)\n  for (uint16_t i = 0; i < remain_packets; i++) {\n    tsiz.value                  = epin->tsiz;\n    const uint16_t remain_bytes = (uint16_t)tsiz.xfer_size;\n    const uint16_t xact_bytes   = tu_min16(remain_bytes, xfer->max_size);\n\n    // Check if dtxfsts has enough space available\n    if (xact_bytes > ((epin->dtxfsts & DTXFSTS_INEPTFSAV_Msk) << 2)) {\n      break;\n    }\n\n    // Push packet to Tx-FIFO\n    volatile uint32_t *tx_fifo = dwc2->fifo[epnum];\n    if (xfer->ff) {\n      tu_hwfifo_write_from_fifo(tx_fifo, xfer->ff, xact_bytes, NULL);\n      total_bytes_written += xact_bytes;\n    } else {\n      tu_hwfifo_write(tx_fifo, xfer->buffer, xact_bytes, NULL);\n      xfer->buffer += xact_bytes;\n      total_bytes_written += xact_bytes;\n    }\n  }\n  return total_bytes_written;\n}\n\n// Process shared receive FIFO, this interrupt is only used in Slave mode\nstatic void handle_rxflvl_irq(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const volatile uint32_t* rx_fifo = dwc2->fifo[0];\n\n  // Pop control word off FIFO\n  const dwc2_grxstsp_t grxstsp = {.value = dwc2->grxstsp};\n  const uint8_t epnum = grxstsp.ep_ch_num;\n\n  dwc2_dep_t* epout = &dwc2->epout[epnum];\n\n  switch (grxstsp.packet_status) {\n    case GRXSTS_PKTSTS_GLOBAL_OUT_NAK:\n      // Global OUT NAK: do nothing\n      break;\n\n    case GRXSTS_PKTSTS_SETUP_RX: {\n      // Setup packet received\n      uint32_t* setup = (uint32_t*)(uintptr_t) _dcd_usbbuf.setup_packet;\n      // We can receive up to three setup packets in succession, but only the last one is valid.\n      setup[0] = (*rx_fifo);\n      setup[1] = (*rx_fifo);\n      break;\n    }\n\n    case GRXSTS_PKTSTS_SETUP_DONE:\n      // Setup packet done:\n      // After popping this out, dwc2 asserts a DOEPINT_SETUP interrupt which is handled by handle_epout_irq()\n      epout->doeptsiz |= (3 << DOEPTSIZ_STUPCNT_Pos);\n      break;\n\n    case GRXSTS_PKTSTS_RX_DATA: {\n      // Out packet received\n      const uint16_t byte_count = grxstsp.byte_count;\n      xfer_ctl_t* xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT);\n\n      if (byte_count != 0) {\n        // Read packet off RxFIFO\n        if (xfer->ff != NULL) {\n          tu_hwfifo_read_to_fifo(rx_fifo, xfer->ff, byte_count, NULL);\n        } else {\n          tu_hwfifo_read(rx_fifo, xfer->buffer, byte_count, NULL);\n          xfer->buffer += byte_count;\n        }\n      }\n\n      // short packet (including ZLP when byte_count == 0), minus remaining bytes (xfer_size)\n      if (byte_count < xfer->max_size) {\n        const dwc2_ep_tsize_t tsiz = {.value = epout->tsiz};\n        xfer->total_len -= tsiz.xfer_size;\n        if (epnum == 0) {\n          _dcd_data.ep0_pending[TUSB_DIR_OUT] = 0;\n        }\n      }\n      break;\n    }\n\n    case GRXSTS_PKTSTS_RX_COMPLETE:\n      // Out packet done\n      // After this entry is popped from the receive FIFO, dwc2 asserts a Transfer Completed interrupt on\n      // the specified OUT endpoint which will be handled by handle_epout_irq()\n      break;\n\n    default: break; // nothing to do\n  }\n}\n\nstatic void handle_epout_slave(uint8_t rhport, uint8_t epnum, dwc2_doepint_t doepint_bm) {\n  if (doepint_bm.setup_phase_done) {\n    // Cleanup previous pending EP0 IN transfer if any\n    dwc2_dep_t* epin0 = &DWC2_REG(rhport)->epin[0];\n    if (edpt_is_enabled(epin0)) {\n      edpt_disable(rhport, 0x80, false);\n    }\n    dcd_event_setup_received(rhport, _dcd_usbbuf.setup_packet, true);\n    return;\n  }\n\n  // Normal OUT transfer complete\n  if (doepint_bm.xfer_complete) {\n    // only handle data skip if it is setup or status related\n    // Note: even though (xfer_complete + status_phase_rx) is for buffered DMA only, for STM32L47x (dwc2 v3.00a) they\n    // can is set when GRXSTS_PKTSTS_SETUP_RX is popped therefore they can bet set before/together with setup_phase_done\n    if (!doepint_bm.status_phase_rx && !doepint_bm.setup_packet_rx) {\n      xfer_ctl_t* xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT);\n      if ((epnum == 0) && _dcd_data.ep0_pending[TUSB_DIR_OUT]) {\n        // EP0 can only handle one packet, Schedule another packet to be received.\n        edpt_schedule_packets(rhport, epnum, TUSB_DIR_OUT);\n      } else {\n        dcd_event_xfer_complete(rhport, epnum, xfer->total_len, XFER_RESULT_SUCCESS, true);\n      }\n    }\n  }\n}\n\nstatic void handle_epin_slave(uint8_t rhport, uint8_t epnum, dwc2_diepint_t diepint_bm) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  dwc2_dep_t* epin = &dwc2->epin[epnum];\n  xfer_ctl_t* xfer = XFER_CTL_BASE(epnum, TUSB_DIR_IN);\n\n  if (diepint_bm.xfer_complete) {\n    if ((epnum == 0) && (0 != _dcd_data.ep0_pending[TUSB_DIR_IN])) {\n      // EP0 can only handle one packet. Schedule another packet to be transmitted.\n      edpt_schedule_packets(rhport, epnum, TUSB_DIR_IN);\n    } else {\n      dcd_event_xfer_complete(rhport, epnum | TUSB_DIR_IN_MASK, xfer->total_len, XFER_RESULT_SUCCESS, true);\n    }\n  }\n\n  // TX FIFO empty bit is read-only. It will only be cleared by hardware when written bytes is more than\n  // - 64 bytes or\n  // - Half/Empty of TX FIFO size (configured by GAHBCFG.TXFELVL)\n  if (diepint_bm.txfifo_empty && tu_bit_test(dwc2->diepempmsk, epnum)) {\n    epin_write_tx_fifo(dwc2, epnum);\n\n    // Turn off TXFE if all bytes are written.\n    dwc2_ep_tsize_t tsiz = {.value = epin->tsiz};\n    if (tsiz.xfer_size == 0) {\n      dwc2->diepempmsk &= ~(1u << epnum);\n    }\n  }\n}\n#endif\n\n#if CFG_TUD_DWC2_DMA_ENABLE\nstatic void handle_epout_dma(uint8_t rhport, uint8_t epnum, dwc2_doepint_t doepint_bm) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  if (doepint_bm.setup_phase_done) {\n    // Cleanup previous pending EP0 IN transfer if any\n    dwc2_dep_t* epin0 = &DWC2_REG(rhport)->epin[0];\n    if (edpt_is_enabled(epin0)) {\n      edpt_disable(rhport, 0x80, false);\n    }\n    dma_setup_prepare(rhport);\n    dcd_dcache_invalidate(_dcd_usbbuf.setup_packet, 8);\n    dcd_event_setup_received(rhport, _dcd_usbbuf.setup_packet, true);\n    return;\n  }\n\n  // OUT XFER complete\n  if (doepint_bm.xfer_complete) {\n    // only handle data skip if it is setup or status related\n    // Normal OUT transfer complete\n    if (!doepint_bm.status_phase_rx && !doepint_bm.setup_packet_rx) {\n      if ((epnum == 0) && _dcd_data.ep0_pending[TUSB_DIR_OUT]) {\n        // EP0 can only handle one packet Schedule another packet to be received.\n        edpt_schedule_packets(rhport, epnum, TUSB_DIR_OUT);\n      } else {\n        dwc2_dep_t* epout = &dwc2->epout[epnum];\n        xfer_ctl_t* xfer = XFER_CTL_BASE(epnum, TUSB_DIR_OUT);\n\n        // determine actual received bytes\n        const dwc2_ep_tsize_t tsiz = {.value = epout->tsiz};\n        const uint16_t remain = tsiz.xfer_size;\n        xfer->total_len -= remain;\n\n        // this is ZLP, so prepare EP0 for next setup\n        // TODO use status phase rx\n        if(epnum == 0 && xfer->total_len == 0) {\n          dma_setup_prepare(rhport);\n        }\n\n        dcd_dcache_invalidate(xfer->buffer, xfer->total_len);\n        dcd_event_xfer_complete(rhport, epnum, xfer->total_len, XFER_RESULT_SUCCESS, true);\n      }\n    }\n  }\n}\n\nstatic void handle_epin_dma(uint8_t rhport, uint8_t epnum, dwc2_diepint_t diepint_bm) {\n  xfer_ctl_t* xfer = XFER_CTL_BASE(epnum, TUSB_DIR_IN);\n\n  if (diepint_bm.xfer_complete) {\n    if ((epnum == 0) && _dcd_data.ep0_pending[TUSB_DIR_IN]) {\n      // EP0 can only handle one packet. Schedule another packet to be transmitted.\n      edpt_schedule_packets(rhport, epnum, TUSB_DIR_IN);\n    } else {\n      if(epnum == 0) {\n        dma_setup_prepare(rhport);\n      }\n      dcd_event_xfer_complete(rhport, epnum | TUSB_DIR_IN_MASK, xfer->total_len, XFER_RESULT_SUCCESS, true);\n    }\n  }\n}\n#endif\n\nstatic void handle_ep_irq(uint8_t rhport, uint8_t dir) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const bool is_dma = dma_device_enabled(dwc2);\n  const uint8_t ep_count = dwc2_ep_count(dwc2);\n  const uint8_t daint_offset = (dir == TUSB_DIR_IN) ? DAINT_IEPINT_Pos : DAINT_OEPINT_Pos;\n  dwc2_dep_t* ep_base = &dwc2->ep[dir == TUSB_DIR_IN ? 0 : 1][0];\n\n  // DAINT for a given EP clears when DEPINTx is cleared.\n  // EPINT will be cleared when DAINT bits are cleared.\n  for (uint8_t epnum = 0; epnum < ep_count; epnum++) {\n    if (tu_bit_test(dwc2->daint,daint_offset + epnum)) {\n      dwc2_dep_t* epout = &ep_base[epnum];\n      union {\n        uint32_t value;\n        dwc2_diepint_t diepint_bm;\n        dwc2_doepint_t doepint_bm;\n      } intr;\n      intr.value = epout->intr;\n\n      epout->intr = intr.value; // Clear interrupt //-V::2584::{otg_int}\n\n      if (is_dma) {\n        #if CFG_TUD_DWC2_DMA_ENABLE\n        if (dir == TUSB_DIR_IN) {\n          handle_epin_dma(rhport, epnum, intr.diepint_bm);\n        } else {\n          handle_epout_dma(rhport, epnum, intr.doepint_bm);\n        }\n        #endif\n      } else {\n        #if CFG_TUD_DWC2_SLAVE_ENABLE\n        if (dir == TUSB_DIR_IN) {\n          handle_epin_slave(rhport, epnum, intr.diepint_bm);\n        } else {\n          handle_epout_slave(rhport, epnum, intr.doepint_bm);\n        }\n        #endif\n      }\n    }\n  }\n}\n\nstatic void handle_incomplete_iso_in(uint8_t rhport) {\n  dwc2_regs_t      *dwc2    = DWC2_REG(rhport);\n  const dwc2_dsts_t dsts    = {.value = dwc2->dsts};\n  const uint32_t    odd_now = dsts.frame_number & 1u;\n\n  // Loop over all IN endpoints\n  const uint8_t ep_count = dwc2_ep_count(dwc2);\n  for (uint8_t epnum = 0; epnum < ep_count; epnum++) {\n    dwc2_dep_t   *epin   = &dwc2->epin[epnum];\n    dwc2_depctl_t depctl = {.value = epin->diepctl};\n    // Read DSTS and DIEPCTLn for all isochronous endpoints. If the current EP is enabled and the read value of\n    // DSTS.SOFFN is the targeted uframe number for this EP, then this EP has an incomplete transfer.\n    if (depctl.enable && depctl.type == DEPCTL_EPTYPE_ISOCHRONOUS && depctl.dpid_iso_odd == odd_now) {\n      xfer_ctl_t *xfer = XFER_CTL_BASE(epnum, TUSB_DIR_IN);\n      if (xfer->iso_retry > 0) {\n        xfer->iso_retry--;\n        // Restart ISO transfe: re-write TSIZ and CTL\n        dwc2_ep_tsize_t deptsiz = {.value = 0};\n        deptsiz.xfer_size       = xfer->total_len;\n        deptsiz.packet_count    = tu_div_ceil(xfer->total_len, xfer->max_size);\n        epin->tsiz              = deptsiz.value;\n\n        if (odd_now) {\n          depctl.set_data0_iso_even = 1;\n        } else {\n          depctl.set_data1_iso_odd = 1;\n        }\n        epin->diepctl = depctl.value;\n      } else {\n        // too many retries, give up\n        edpt_disable(rhport, epnum | TUSB_DIR_IN_MASK, false);\n        dcd_event_xfer_complete(rhport, epnum | TUSB_DIR_IN_MASK, 0, XFER_RESULT_FAILED, true);\n      }\n    }\n  }\n}\n\n/* Interrupt Hierarchy\n                 DIEPINT  DIEPINT\n                    \\       /\n                     \\     /\n                      DAINT\n                     /     \\\n                    /       \\\n     GINTSTS:    OEPInt    IEPInt | USBReset | EnumDone | USBSusp | WkUpInt | OTGInt | SOF | RXFLVL\n\n  Note: when OTG_MULTI_PROC_INTRPT = 1, Device Each endpoint interrupt deachint/deachmsk/diepeachmsk/doepeachmsk\n  are combined to generate dedicated interrupt line for each endpoint.\n */\nvoid dcd_int_handler(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const uint32_t gintmask = dwc2->gintmsk;\n  const uint32_t gintsts = dwc2->gintsts & gintmask;\n\n  if (gintsts & GINTSTS_USBRST) {\n    // USBRST is start of reset.\n    dwc2->gintsts = GINTSTS_USBRST;\n\n    usbd_spin_lock(true);\n    handle_bus_reset(rhport);\n    usbd_spin_unlock(true);\n  }\n\n  if (gintsts & GINTSTS_ENUMDNE) {\n    // ENUMDNE is the end of reset where speed of the link is detected\n    dwc2->gintsts = GINTSTS_ENUMDNE;\n    // There may be a pending suspend event, so we clear it first\n    dwc2->gintsts = GINTSTS_USBSUSP;\n    dwc2->gintmsk |= GINTMSK_USBSUSPM;\n    handle_enum_done(rhport);\n  }\n\n  if (gintsts & GINTSTS_USBSUSP) {\n    dwc2->gintsts = GINTSTS_USBSUSP;\n    dwc2->gintmsk &= ~GINTMSK_USBSUSPM;\n    dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);\n  }\n\n  if (gintsts & GINTSTS_WKUINT) {\n    dwc2->gintsts = GINTSTS_WKUINT;\n    dwc2->gintmsk |= GINTMSK_USBSUSPM;\n    dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);\n  }\n\n  // TODO check GINTSTS_DISCINT for disconnect detection\n  // if(int_status & GINTSTS_DISCINT)\n\n  if (gintsts & GINTSTS_OTGINT) {\n    // OTG INT bit is read-only\n    const uint32_t otg_int = dwc2->gotgint;\n\n    if (otg_int & GOTGINT_SEDET) {\n      dwc2->gintmsk &= ~GINTMSK_OTGINT;\n      dcd_event_bus_signal(rhport, DCD_EVENT_UNPLUGGED, true);\n    }\n\n    dwc2->gotgint = otg_int;\n  }\n\n  if(gintsts & GINTSTS_SOF) {\n    dwc2->gintsts = GINTSTS_SOF;\n    dwc2->gintmsk |= GINTMSK_USBSUSPM;\n    const uint32_t frame = (dwc2->dsts & DSTS_FNSOF) >> DSTS_FNSOF_Pos;\n\n    // Disable SOF interrupt if SOF was not explicitly enabled since SOF was used for remote wakeup detection\n    if (!_dcd_data.sof_en) {\n      dwc2->gintmsk &= ~GINTMSK_SOFM;\n    }\n\n    dcd_event_sof(rhport, frame, true);\n  }\n\n#if CFG_TUD_DWC2_SLAVE_ENABLE\n  // RxFIFO non-empty interrupt handling.\n  if (gintsts & GINTSTS_RXFLVL) {\n    // RXFLVL bit is read-only\n    dwc2->gintmsk &= ~GINTMSK_RXFLVLM; // disable RXFLVL interrupt while reading\n\n    do {\n      handle_rxflvl_irq(rhport); // read all packets\n    } while(dwc2->gintsts & GINTSTS_RXFLVL);\n\n    dwc2->gintmsk |= GINTMSK_RXFLVLM;\n  }\n#endif\n\n  // OUT endpoint interrupt handling.\n  if (gintsts & GINTSTS_OEPINT) {\n    // OEPINT is read-only, clear using DOEPINTn\n    handle_ep_irq(rhport, TUSB_DIR_OUT);\n  }\n\n  // IN endpoint interrupt handling.\n  if (gintsts & GINTSTS_IEPINT) {\n    // IEPINT bit read-only, clear using DIEPINTn\n    handle_ep_irq(rhport, TUSB_DIR_IN);\n  }\n\n  // Incomplete isochronous IN transfer interrupt handling.\n  if (gintsts & GINTSTS_IISOIXFR) {\n    dwc2->gintsts = GINTSTS_IISOIXFR;\n    handle_incomplete_iso_in(rhport);\n  }\n}\n\n#if CFG_TUD_TEST_MODE\nvoid dcd_enter_test_mode(uint8_t rhport, tusb_feature_test_mode_t test_selector) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  // Enable the test mode\n  dwc2->dctl = (dwc2->dctl & ~DCTL_TCTL_Msk) | (((uint8_t) test_selector) << DCTL_TCTL_Pos);\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_at32.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n\n#ifndef DWC2_AT32_H_\n#define DWC2_AT32_H_\n\n#define DWC2_EP_MAX TUP_DCD_ENDPOINT_MAX\n\n#if CFG_TUSB_MCU == OPT_MCU_AT32F415\n  #include <at32f415.h>\n  #define OTG1_FIFO_SIZE           1280\n  #define OTG1_IRQn                OTGFS1_IRQn\n  #define DWC2_OTG1_REG_BASE       0x50000000UL\n#elif CFG_TUSB_MCU == OPT_MCU_AT32F435_437\n  #include <at32f435_437.h>\n  #define OTG1_FIFO_SIZE           1280\n  #define OTG2_FIFO_SIZE           1280\n  #define OTG1_IRQn                OTGFS1_IRQn\n  #define OTG2_IRQn                OTGFS2_IRQn\n  #define DWC2_OTG1_REG_BASE       0x50000000UL\n  #define DWC2_OTG2_REG_BASE       0x40040000UL\n#elif CFG_TUSB_MCU == OPT_MCU_AT32F423\n  #include <at32f423.h>\n  #define OTG1_FIFO_SIZE           1280\n  #define OTG1_IRQn                OTGFS1_IRQn\n  #define DWC2_OTG1_REG_BASE       0x50000000UL\n#elif CFG_TUSB_MCU == OPT_MCU_AT32F402_405\n  #include <at32f402_405.h>\n  #define OTG1_FIFO_SIZE           1280\n  #define OTG2_FIFO_SIZE           4096\n  #define OTG1_IRQn                OTGFS1_IRQn\n  #define OTG2_IRQn                OTGHS_IRQn\n  #define DWC2_OTG1_REG_BASE       0x50000000UL\n  #define DWC2_OTG2_REG_BASE       0x40040000UL //OTGHS\n#elif CFG_TUSB_MCU == OPT_MCU_AT32F425\n  #include <at32f425.h>\n  #define OTG1_FIFO_SIZE           1280\n  #define OTG1_IRQn                OTGFS1_IRQn\n  #define DWC2_OTG1_REG_BASE       0x50000000UL\n#elif CFG_TUSB_MCU == OPT_MCU_AT32F45X\n  #include <at32f45x.h>\n  #define OTG1_FIFO_SIZE           1280\n  #define OTG1_IRQn                OTGFS1_IRQn\n  #define DWC2_OTG1_REG_BASE       0x50000000UL\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstatic const dwc2_controller_t _dwc2_controller[] = {\n    {.reg_base = DWC2_OTG1_REG_BASE, .irqnum = OTG1_IRQn, .ep_count = DWC2_EP_MAX, .ep_fifo_size = OTG1_FIFO_SIZE},\n#if defined DWC2_OTG2_REG_BASE\n    {.reg_base = DWC2_OTG2_REG_BASE, .irqnum = OTG2_IRQn, .ep_count = DWC2_EP_MAX, .ep_fifo_size = OTG2_FIFO_SIZE}\n#endif\n};\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_int_set(uint8_t rhport, tusb_role_t role, bool enabled) {\n  (void) role;\n  const IRQn_Type irqn = (IRQn_Type) _dwc2_controller[rhport].irqnum;\n  if (enabled) {\n    NVIC_EnableIRQ(irqn);\n  } else {\n    NVIC_DisableIRQ(irqn);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_dcd_int_enable(uint8_t rhport) {\n  NVIC_EnableIRQ(_dwc2_controller[rhport].irqnum);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_dcd_int_disable(uint8_t rhport) {\n  NVIC_DisableIRQ(_dwc2_controller[rhport].irqnum);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_remote_wakeup_delay(void) {\n  // try to delay for 1 ms\n  uint32_t count = system_core_clock / 1000;\n  while (count--) __asm volatile(\"nop\");\n}\n\n// MCU specific PHY init, called BEFORE core reset\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_init(dwc2_regs_t *dwc2, uint8_t hs_phy_type) {\n  (void) dwc2;\n  // Enable on-chip HS PHY\n  if (hs_phy_type == GHWCFG2_HSPHY_UTMI || hs_phy_type == GHWCFG2_HSPHY_UTMI_ULPI) {\n  } else if (hs_phy_type == GHWCFG2_HSPHY_NOT_SUPPORTED) {\n  }\n}\n\n// MCU specific PHY deinit, disable PHY power\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_deinit(dwc2_regs_t *dwc2, uint8_t hs_phy_type) {\n  (void) hs_phy_type;\n  dwc2->stm32_gccfg &= ~(STM32_GCCFG_PWRDWN | STM32_GCCFG_DCDEN | STM32_GCCFG_PDEN);\n}\n\n// MCU specific PHY update, it is called AFTER init() and core reset\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_update(dwc2_regs_t *dwc2, uint8_t hs_phy_type) {\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  dwc2->stm32_gccfg |= STM32_GCCFG_PWRDWN | STM32_GCCFG_DCDEN | STM32_GCCFG_PDEN;\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* DWC2_AT32_H_ */\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_bcm.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DWC2_BCM_H_\n#define TUSB_DWC2_BCM_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"broadcom/defines.h\"\n#include \"broadcom/interrupts.h\"\n#include \"broadcom/caches.h\"\n\n#define DWC2_EP_MAX         8\n\nstatic const dwc2_controller_t _dwc2_controller[] =\n{\n  { .reg_base = USB_OTG_GLOBAL_BASE, .irqnum = USB_IRQn, .ep_count = DWC2_EP_MAX, .ep_fifo_size = 16384 }\n};\n\n#define dcache_clean(_addr, _size)              data_clean(_addr, _size)\n#define dcache_invalidate(_addr, _size)         data_invalidate(_addr, _size)\n#define dcache_clean_invalidate(_addr, _size)   data_clean_and_invalidate(_addr, _size)\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void dwc2_dcd_int_enable(uint8_t rhport)\n{\n  BP_EnableIRQ(_dwc2_controller[rhport].irqnum);\n}\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void dwc2_dcd_int_disable (uint8_t rhport)\n{\n  BP_DisableIRQ(_dwc2_controller[rhport].irqnum);\n}\n\nstatic inline void dwc2_remote_wakeup_delay(void)\n{\n  // try to delay for 1 ms\n  // TODO implement later\n}\n\n// MCU specific PHY init, called BEFORE core reset\nstatic inline void dwc2_phy_init(dwc2_regs_t * dwc2, uint8_t hs_phy_type)\n{\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  // nothing to do\n}\n\n// MCU specific PHY deinit, disable PHY power\nstatic inline void dwc2_phy_deinit(dwc2_regs_t * dwc2, uint8_t hs_phy_type) {\n  (void) dwc2;\n  (void) hs_phy_type;\n  // nothing to do\n}\n\n// MCU specific PHY update, it is called AFTER init() and core reset\nstatic inline void dwc2_phy_update(dwc2_regs_t * dwc2, uint8_t hs_phy_type)\n{\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  // nothing to do\n}\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_common.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024-2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#define DWC2_COMMON_DEBUG   2\n\n#if defined(TUP_USBIP_DWC2) && (CFG_TUH_ENABLED || CFG_TUD_ENABLED)\n#include \"dwc2_common.h\"\n\n//--------------------------------------------------------------------\n//\n//--------------------------------------------------------------------\nstatic void reset_core(dwc2_regs_t* dwc2) {\n  // The software must check that bit 31 in this register is set to 1 (AHB Master is Idle) before starting any operation\n  while (!(dwc2->grstctl & GRSTCTL_AHBIDL)) {\n  }\n\n  const uint32_t gsnpsid = dwc2->gsnpsid; // preload gsnpsid which is not readable while resetting\n  dwc2->grstctl |= GRSTCTL_CSRST; // reset core\n\n  if ((gsnpsid & DWC2_CORE_REV_MASK) < (DWC2_CORE_REV_4_20a & DWC2_CORE_REV_MASK)) {\n    // prior v4.20a: CSRST is self-clearing, and the core clears this bit after all the necessary logic is reset in\n    // the core, which can take several clocks, depending on the current state of the core. Once this bit has been\n    // cleared, the software must wait at least 3 PHY clocks before accessing the PHY domain (synchronization delay).\n    while (dwc2->grstctl & GRSTCTL_CSRST) {}\n  } else {\n    // From v4.20a: CSRST bit is write only. The application must clear this bit after checking the bit 29 of this\n    // register i.e Core Soft Reset Done CSRT_DONE (w1c)\n    while (!(dwc2->grstctl & GRSTCTL_CSRST_DONE)) {}\n    dwc2->grstctl = (dwc2->grstctl & ~GRSTCTL_CSRST) | GRSTCTL_CSRST_DONE;\n  }\n\n  while (!(dwc2->grstctl & GRSTCTL_AHBIDL)) {} // wait for AHB master IDLE\n}\n\n// Dedicated FS PHY is internal with a clock 48Mhz.\nstatic void phy_fs_init(dwc2_regs_t* dwc2) {\n  TU_LOG(DWC2_COMMON_DEBUG, \"Fullspeed PHY init\\r\\n\");\n\n  uint32_t gusbcfg = dwc2->gusbcfg;\n\n  // Select FS PHY\n  gusbcfg |= GUSBCFG_PHYSEL;\n  dwc2->gusbcfg = gusbcfg;\n\n  // MCU specific PHY init before reset\n  dwc2_phy_init(dwc2, GHWCFG2_HSPHY_NOT_SUPPORTED);\n\n  // Reset core after selecting PHY\n  reset_core(dwc2);\n\n  // USB turnaround time is critical for certification where long cables and 5-Hubs are used.\n  // So if you need the AHB to run at less than 30 MHz, and if USB turnaround time is not critical,\n  // these bits can be programmed to a larger value. Default is 5\n  gusbcfg &= ~GUSBCFG_TRDT_Msk;\n  gusbcfg |= 5u << GUSBCFG_TRDT_Pos;\n  dwc2->gusbcfg = gusbcfg;\n\n  // MCU specific PHY update post reset\n  dwc2_phy_update(dwc2, GHWCFG2_HSPHY_NOT_SUPPORTED);\n}\n\n/* dwc2 has 2 highspeed PHYs options\n * - UTMI+ is internal highspeed PHY, can be clocked at 30 Mhz (8-bit) or 60 Mhz (16-bit).\n * - ULPI is external highspeed PHY, clocked at 60Mhz with 8-bit interface.\n *\n * In addition, UTMI+/ULPI can be shared to run at fullspeed mode with 48Mhz\n */\nstatic void phy_hs_init(dwc2_regs_t* dwc2) {\n  uint32_t gusbcfg = dwc2->gusbcfg;\n  const dwc2_ghwcfg2_t ghwcfg2 = {.value = dwc2->ghwcfg2};\n  const dwc2_ghwcfg4_t ghwcfg4 = {.value = dwc2->ghwcfg4};\n\n  uint8_t phy_width;\n  if (CFG_TUSB_MCU != OPT_MCU_AT32F402_405 && // at32f402_405 does not support 16-bit\n      ghwcfg4.phy_data_width) {\n    phy_width = 16; // 16-bit PHY interface if supported\n  } else {\n    phy_width = 8; // 8-bit PHY interface\n  }\n\n  // De-select FS PHY\n  gusbcfg &= ~GUSBCFG_PHYSEL;\n\n  if (ghwcfg2.hs_phy_type == GHWCFG2_HSPHY_ULPI) {\n    TU_LOG(DWC2_COMMON_DEBUG, \"Highspeed ULPI PHY init\\r\\n\");\n\n    // Select ULPI PHY (external)\n    gusbcfg |= GUSBCFG_ULPI_UTMI_SEL;\n\n    // ULPI is always 8-bit interface\n    gusbcfg &= ~GUSBCFG_PHYIF16;\n\n    // ULPI select single data rate\n    gusbcfg &= ~GUSBCFG_DDRSEL;\n\n    // default internal VBUS Indicator and Drive\n    gusbcfg &= ~(GUSBCFG_ULPIEVBUSD | GUSBCFG_ULPIEVBUSI);\n\n    // Disable FS/LS ULPI\n    gusbcfg &= ~(GUSBCFG_ULPIFSLS | GUSBCFG_ULPICSM);\n  } else {\n    TU_LOG(DWC2_COMMON_DEBUG, \"Highspeed UTMI+ PHY init\\r\\n\");\n\n    // Select UTMI+ PHY (internal)\n    gusbcfg &= ~GUSBCFG_ULPI_UTMI_SEL;\n\n    // Set 16-bit interface if supported\n    if (phy_width == 16) {\n      gusbcfg |= GUSBCFG_PHYIF16;\n    } else {\n      gusbcfg &= ~GUSBCFG_PHYIF16;\n    }\n  }\n\n  // Apply config\n  dwc2->gusbcfg = gusbcfg;\n\n  // mcu specific phy init\n  dwc2_phy_init(dwc2, ghwcfg2.hs_phy_type);\n\n  // Reset core after selecting PHY\n  reset_core(dwc2);\n\n  // Set turn-around, must after core reset otherwise it will be clear\n  // - 9 if using 8-bit PHY interface\n  // - 5 if using 16-bit PHY interface\n  gusbcfg &= ~GUSBCFG_TRDT_Msk;\n  gusbcfg |= (phy_width == 16 ? 5u : 9u) << GUSBCFG_TRDT_Pos;\n  dwc2->gusbcfg = gusbcfg;\n\n  // MCU specific PHY update post reset\n  dwc2_phy_update(dwc2, ghwcfg2.hs_phy_type);\n}\n\nstatic bool check_dwc2(dwc2_regs_t* dwc2) {\n#if CFG_TUSB_DEBUG >= DWC2_COMMON_DEBUG\n  // print guid, gsnpsid, ghwcfg1, ghwcfg2, ghwcfg3, ghwcfg4\n  // Run 'python dwc2_info.py' and check dwc2_info.md for bit-field value and comparison with other ports\n  volatile uint32_t const* p = (volatile uint32_t const*) &dwc2->guid;\n  TU_LOG1(\"guid, gsnpsid, ghwcfg1, ghwcfg2, ghwcfg3, ghwcfg4\\r\\n\");\n  for (size_t i = 0; i < 5; i++) {\n    TU_LOG1(\"0x%08\" PRIX32 \", \", p[i]);\n  }\n  TU_LOG1(\"0x%08\" PRIX32 \"\\r\\n\", p[5]);\n#endif\n\n  // For some reason: GD32VF103 gsnpsid and all hwcfg register are always zero (skip it)\n  (void)dwc2;\n#if !TU_CHECK_MCU(OPT_MCU_GD32VF103)\n  enum { GSNPSID_ID_MASK = TU_GENMASK(31, 16) };\n  const uint32_t gsnpsid = dwc2->gsnpsid & GSNPSID_ID_MASK;\n  TU_ASSERT(gsnpsid == DWC2_OTG_ID || gsnpsid == DWC2_FS_IOT_ID || gsnpsid == DWC2_HS_IOT_ID);\n#endif\n\n  return true;\n}\n\n//--------------------------------------------------------------------\n//\n//--------------------------------------------------------------------\nbool dwc2_core_is_highspeed_phy(dwc2_regs_t* dwc2, bool prefer_hs_phy) {\n  const dwc2_ghwcfg2_t ghwcfg2    = {.value = dwc2->ghwcfg2};\n  const bool           has_hs_phy = (ghwcfg2.hs_phy_type != GHWCFG2_HSPHY_NOT_SUPPORTED);\n\n  if (prefer_hs_phy) {\n    return has_hs_phy;\n  } else {\n    const bool has_fs_phy = (ghwcfg2.fs_phy_type != GHWCFG2_FSPHY_NOT_SUPPORTED);\n    // false if has fs phy, otherwise true since hs phy is the only available phy\n    return !has_fs_phy && has_hs_phy;\n  }\n}\n\nbool dwc2_core_init(uint8_t rhport, bool is_hs_phy, bool is_dma) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  // Check Synopsys ID register, failed if controller clock/power is not enabled\n  TU_ASSERT(check_dwc2(dwc2));\n\n  // disable global interrupt\n  dwc2->gahbcfg &= ~GAHBCFG_GINT;\n\n  if (is_hs_phy) {\n    phy_hs_init(dwc2);\n  } else {\n    phy_fs_init(dwc2);\n  }\n\n  /* Set HS/FS Timeout Calibration to 7 (max available value).\n   * The number of PHY clocks that the application programs in\n   * this field is added to the high/full speed interpacket timeout\n   * duration in the core to account for any additional delays\n   * introduced by the PHY. This can be required, because the delay\n   * introduced by the PHY in generating the linestate condition\n   * can vary from one PHY to another. */\n  dwc2->gusbcfg |= (7ul << GUSBCFG_TOCAL_Pos);\n\n  // Enable PHY clock TODO stop/gate clock when suspended mode\n  dwc2->pcgcctl &= ~(PCGCCTL_STOPPCLK | PCGCCTL_GATEHCLK | PCGCCTL_PWRCLMP | PCGCCTL_RSTPDWNMODULE);\n\n  dfifo_flush_tx(dwc2, 0x10); // all tx fifo\n  dfifo_flush_rx(dwc2);\n\n  // Clear pending and disable all interrupts\n  dwc2->gintsts = 0xFFFFFFFFU;\n  dwc2->gotgint = 0xFFFFFFFFU;\n  dwc2->gintmsk = 0;\n\n  TU_LOG(DWC2_COMMON_DEBUG, \"DMA = %u\\r\\n\", is_dma);\n\n  if (is_dma) {\n    // DMA seems to be only settable after a core reset, and not possible to switch on-the-fly\n    dwc2->gahbcfg |= GAHBCFG_DMAEN | GAHBCFG_HBSTLEN_2;\n  } else {\n    dwc2->gintmsk |= GINTSTS_RXFLVL;\n  }\n\n  return true;\n}\n\nvoid dwc2_core_deinit(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  // Disable global interrupt\n  dwc2->gahbcfg &= ~GAHBCFG_GINT;\n\n  // Reset core: this also flushes FIFOs and clears all interrupt registers\n  reset_core(dwc2);\n\n  // Stop PHY clock and gate HCLK for power saving (per databook chapter 14)\n  dwc2->pcgcctl |= PCGCCTL_STOPPCLK | PCGCCTL_GATEHCLK;\n\n  // MCU-specific PHY deinit (disable PHY power)\n  const dwc2_ghwcfg2_t ghwcfg2 = {.value = dwc2->ghwcfg2};\n  const uint8_t hs_phy_type = (dwc2->gusbcfg & GUSBCFG_PHYSEL) ? GHWCFG2_HSPHY_NOT_SUPPORTED : ghwcfg2.hs_phy_type;\n  dwc2_phy_deinit(dwc2, hs_phy_type);\n}\n\n// void dwc2_core_handle_common_irq(uint8_t rhport, bool in_isr) {\n//   (void) in_isr;\n//   dwc2_regs_t * const dwc2 = DWC2_REG(rhport);\n//   const uint32_t int_mask = dwc2->gintmsk;\n//   const uint32_t int_status = dwc2->gintsts & int_mask;\n//\n//   // Device disconnect\n//   if (int_status & GINTSTS_DISCINT) {\n//     dwc2->gintsts = GINTSTS_DISCINT;\n//   }\n//\n// }\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_common.h",
    "content": "/*\n* The MIT License (MIT)\n *\n * Copyright (c) 2024 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DWC2_COMMON_H\n#define TUSB_DWC2_COMMON_H\n\n#include \"common/tusb_common.h\"\n#include \"dwc2_type.h\"\n\n#if CFG_TUD_ENABLED\n#include \"device/dcd.h\"\n#endif\n\n#if CFG_TUH_ENABLED\n#include \"host/hcd.h\"\n#endif\n\n// Following symbols must be defined by port header\n// - _dwc2_controller[]: array of controllers\n// - DWC2_EP_MAX: largest EP counts of all controllers\n// - dwc2_phy_init/dwc2_phy_update: phy init called before and after core reset\n// - dwc2_phy_deinit(dwc2, hs_phy_type): phy deinit to disable PHY power, only deinit the phy used by core\n// - dwc2_dcd_int_enable/dwc2_dcd_int_disable\n// - dwc2_remote_wakeup_delay\n\n#if defined(TUP_USBIP_DWC2_STM32)\n  #include \"dwc2_stm32.h\"\n#elif defined(TUP_USBIP_DWC2_ESP32)\n  #include \"dwc2_esp32.h\"\n#elif TU_CHECK_MCU(OPT_MCU_GD32VF103)\n  #include \"dwc2_gd32.h\"\n#elif TU_CHECK_MCU(OPT_MCU_BCM2711, OPT_MCU_BCM2835, OPT_MCU_BCM2837)\n  #include \"dwc2_bcm.h\"\n#elif TU_CHECK_MCU(OPT_MCU_EFM32GG)\n  #include \"dwc2_efm32.h\"\n#elif TU_CHECK_MCU(OPT_MCU_XMC4000)\n  #include \"dwc2_xmc.h\"\n#elif defined(TUP_USBIP_DWC2_AT32)\n  #include \"dwc2_at32.h\"\n#elif defined(TUP_USBIP_DWC2_NRF)\n  #include \"dwc2_nrf.h\"\n#else\n  #error \"Unsupported MCUs\"\n#endif\n\nenum {\n  DWC2_CONTROLLER_COUNT = TU_ARRAY_SIZE(_dwc2_controller)\n};\n\nenum {\n  OTG_INT_COMMON = 0 // GINTSTS_DISCINT | GINTSTS_CONIDSTSCHNG\n};\n\n//--------------------------------------------------------------------+\n// Core/Controller\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline dwc2_regs_t* DWC2_REG(uint8_t rhport) {\n  if (rhport >= DWC2_CONTROLLER_COUNT) {\n    // user mis-configured, ignore and use first controller\n    rhport = 0;\n  }\n  return (dwc2_regs_t*)_dwc2_controller[rhport].reg_base;\n}\n\n// check if highspeed phy should be used\nbool dwc2_core_is_highspeed_phy(dwc2_regs_t* dwc2, bool prefer_hs_phy);\nbool dwc2_core_init(uint8_t rhport, bool is_hs_phy, bool is_dma);\nvoid dwc2_core_deinit(uint8_t rhport);\nvoid dwc2_core_handle_common_irq(uint8_t rhport, bool in_isr);\n\n//--------------------------------------------------------------------+\n// DFIFO\n//--------------------------------------------------------------------+\nTU_ATTR_ALWAYS_INLINE static inline void dfifo_flush_tx(dwc2_regs_t* dwc2, uint8_t fnum) {\n  // flush TX fifo and wait for it cleared\n  dwc2->grstctl = GRSTCTL_TXFFLSH | (fnum << GRSTCTL_TXFNUM_Pos);\n  while (0 != (dwc2->grstctl & GRSTCTL_TXFFLSH_Msk)) {}\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dfifo_flush_rx(dwc2_regs_t* dwc2) {\n  // flush RX fifo and wait for it cleared\n  dwc2->grstctl = GRSTCTL_RXFFLSH;\n  while (0 != (dwc2->grstctl & GRSTCTL_RXFFLSH_Msk)) {}\n}\n\nvoid dfifo_read_packet(dwc2_regs_t* dwc2, uint8_t* dst, uint16_t len);\nvoid dfifo_write_packet(dwc2_regs_t* dwc2, uint8_t fifo_num, uint8_t const* src, uint16_t len);\n\n//--------------------------------------------------------------------+\n// DMA\n//--------------------------------------------------------------------+\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_efm32.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Rafael Silva (@perigoso)\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _DWC2_EFM32_H_\n#define _DWC2_EFM32_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"em_device.h\"\n\n// EFM32 has custom control register before DWC registers\n#define DWC2_REG_BASE       (USB_BASE + offsetof(USB_TypeDef, GOTGCTL))\n#define DWC2_EP_MAX         7\n\nstatic const dwc2_controller_t _dwc2_controller[] =\n{\n  { .reg_base = DWC2_REG_BASE, .irqnum = USB_IRQn, .ep_count = DWC2_EP_MAX, .ep_fifo_size = 2048 }\n};\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void dwc2_dcd_int_enable(uint8_t rhport)\n{\n  NVIC_EnableIRQ(_dwc2_controller[rhport].irqnum);\n}\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void dwc2_dcd_int_disable (uint8_t rhport)\n{\n  NVIC_DisableIRQ(_dwc2_controller[rhport].irqnum);\n}\n\nstatic inline void dwc2_remote_wakeup_delay(void)\n{\n  // try to delay for 1 ms\n//  uint32_t count = SystemCoreClock / 1000;\n//  while ( count-- ) __NOP();\n}\n\n// MCU specific PHY init, called BEFORE core reset\nstatic inline void dwc2_phy_init(dwc2_regs_t * dwc2, uint8_t hs_phy_type)\n{\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  // Enable PHY\n  USB->ROUTE = USB_ROUTE_PHYPEN;\n}\n\n// MCU specific PHY deinit, disable PHY power\nstatic inline void dwc2_phy_deinit(dwc2_regs_t * dwc2, uint8_t hs_phy_type) {\n  (void) dwc2;\n  (void) hs_phy_type;\n  // Disable PHY pin\n  USB->ROUTE = 0;\n}\n\n// MCU specific PHY update, it is called AFTER init() and core reset\nstatic inline void dwc2_phy_update(dwc2_regs_t * dwc2, uint8_t hs_phy_type)\n{\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  // EFM32 Manual: turn around must be 5 (reset & default value)\n  // dwc2->gusbcfg = (dwc2->gusbcfg & ~GUSBCFG_TRDT_Msk) | (5u << GUSBCFG_TRDT_Pos);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_esp32.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n\n#ifndef TUSB_DWC2_ESP32_H_\n#define TUSB_DWC2_ESP32_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"freertos/FreeRTOS.h\"\n#include \"freertos/task.h\"\n\n#include \"esp_intr_alloc.h\"\n#include \"soc/periph_defs.h\"\n#include \"soc/usb_wrap_struct.h\"\n\n#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3)\n#define DWC2_FS_REG_BASE   0x60080000UL\n#define DWC2_EP_MAX        7\n\nstatic const dwc2_controller_t _dwc2_controller[] = {\n  { .reg_base = DWC2_FS_REG_BASE, .irqnum = ETS_USB_INTR_SOURCE, .ep_count = 7, .ep_in_count = 5, .ep_fifo_size = 1024 }\n};\n\n#elif TU_CHECK_MCU(OPT_MCU_ESP32H4)\n// H4's USB_WRAP register block uses \"wrap_*\" field names. Map them to the\n// names used by TinyUSB's DWC2 port to keep the source unchanged.\n#define otg_conf                wrap_otg_conf\n#define pad_pull_override       wrap_pad_pull_override\n#define dp_pullup               wrap_dp_pullup\n#define dp_pulldown             wrap_dp_pulldown\n#define dm_pullup               wrap_dm_pullup\n#define dm_pulldown             wrap_dm_pulldown\n\n#define DWC2_FS_REG_BASE   0x60040000UL\n#define DWC2_EP_MAX        7\n\nstatic const dwc2_controller_t _dwc2_controller[] = {\n  { .reg_base = DWC2_FS_REG_BASE, .irqnum = ETS_USB_OTG11_INTR_SOURCE, .ep_count = 7, .ep_in_count = 5, .ep_fifo_size = 1024 }\n};\n\n#elif TU_CHECK_MCU(OPT_MCU_ESP32P4)\n#define DWC2_FS_REG_BASE   0x50040000UL\n#define DWC2_HS_REG_BASE   0x50000000UL\n#define DWC2_EP_MAX        16\n\n// On ESP32 for consistency we associate\n// - Port0 to OTG_FS, and Port1 to OTG_HS\nstatic const dwc2_controller_t _dwc2_controller[] = {\n  { .reg_base = DWC2_FS_REG_BASE, .irqnum = ETS_USB_OTG11_CH0_INTR_SOURCE, .ep_count = 7, .ep_in_count = 5, .ep_fifo_size = 1024 },\n  { .reg_base = DWC2_HS_REG_BASE, .irqnum = ETS_USB_OTG_INTR_SOURCE, .ep_count = 16, .ep_in_count = 8, .ep_fifo_size = 4096 }\n};\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nstatic intr_handle_t usb_ih[TU_ARRAY_SIZE(_dwc2_controller)];\n\nstatic void dwc2_int_handler_wrap(void* arg) {\n  const uint8_t rhport = tu_u16_low((uint16_t)(uintptr_t)arg);\n  const tusb_role_t role = (tusb_role_t) tu_u16_high((uint16_t)(uintptr_t)arg);\n#if CFG_TUD_ENABLED\n  if (role == TUSB_ROLE_DEVICE) {\n    dcd_int_handler(rhport);\n  }\n#endif\n#if CFG_TUH_ENABLED && !CFG_TUH_MAX3421\n  if (role == TUSB_ROLE_HOST) {\n    hcd_int_handler(rhport, true);\n  }\n#endif\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_int_set(uint8_t rhport, tusb_role_t role, bool enabled) {\n  if (enabled) {\n    esp_intr_alloc(_dwc2_controller[rhport].irqnum, ESP_INTR_FLAG_LOWMED,\n                   dwc2_int_handler_wrap, (void*)(uintptr_t)tu_u16(role, rhport), &usb_ih[rhport]);\n  } else {\n    esp_intr_free(usb_ih[rhport]);\n  }\n}\n\n#define dwc2_dcd_int_enable(_rhport)  dwc2_int_set(_rhport, TUSB_ROLE_DEVICE, true)\n#define dwc2_dcd_int_disable(_rhport) dwc2_int_set(_rhport, TUSB_ROLE_DEVICE, false)\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_remote_wakeup_delay(void) {\n  vTaskDelay(pdMS_TO_TICKS(1));\n}\n\n// MCU specific PHY init, called BEFORE core reset\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_init(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  (void)dwc2;\n  (void)hs_phy_type;\n  // maybe usb_utmi_hal_init()\n\n}\n\n// MCU specific PHY deinit, disable PHY power\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_deinit(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  (void)dwc2;\n  (void)hs_phy_type;\n  // PHY managed by ESP-IDF\n}\n\n// MCU specific PHY update, it is called AFTER init() and core reset\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_update(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  (void)dwc2;\n  (void)hs_phy_type;\n  // maybe usb_utmi_hal_disable()\n}\n\n//--------------------------------------------------------------------+\n// Data Cache\n//--------------------------------------------------------------------+\n#if CFG_TUD_DWC2_DMA_ENABLE || CFG_TUH_DWC2_DMA_ENABLE\n#if defined(SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE) && SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE\n#include \"esp_cache.h\"\n\n#if CFG_TUD_MEM_DCACHE_LINE_SIZE != CONFIG_CACHE_L1_CACHE_LINE_SIZE || \\\n    CFG_TUH_MEM_DCACHE_LINE_SIZE != CONFIG_CACHE_L1_CACHE_LINE_SIZE\n#error \"CFG_TUD/TUH_MEM_DCACHE_LINE_SIZE must match CONFIG_CACHE_L1_CACHE_LINE_SIZE\"\n#endif\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t round_up_to_cache_line_size(uint32_t size) {\n  if (size & (CONFIG_CACHE_L1_CACHE_LINE_SIZE-1)) {\n    size = (size & ~(CONFIG_CACHE_L1_CACHE_LINE_SIZE-1)) + CONFIG_CACHE_L1_CACHE_LINE_SIZE;\n  }\n  return size;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool dwc2_dcache_clean(const void* addr, uint32_t data_size) {\n  const int flag = ESP_CACHE_MSYNC_FLAG_TYPE_DATA | ESP_CACHE_MSYNC_FLAG_DIR_C2M;\n  data_size = round_up_to_cache_line_size(data_size);\n  return ESP_OK == esp_cache_msync((void*)addr, data_size, flag);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool dwc2_dcache_invalidate(const void* addr, uint32_t data_size) {\n  const int flag = ESP_CACHE_MSYNC_FLAG_TYPE_DATA | ESP_CACHE_MSYNC_FLAG_DIR_M2C;\n  data_size = round_up_to_cache_line_size(data_size);\n  return ESP_OK == esp_cache_msync((void*)addr, data_size, flag);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool dwc2_dcache_clean_invalidate(const void* addr, uint32_t data_size) {\n  const int flag = ESP_CACHE_MSYNC_FLAG_TYPE_DATA | ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_DIR_M2C;\n  data_size = round_up_to_cache_line_size(data_size);\n  return ESP_OK == esp_cache_msync((void*)addr, data_size, flag);\n}\n\n#endif\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_gd32.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n\n#ifndef DWC2_GD32_H_\n#define DWC2_GD32_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#define DWC2_REG_BASE       0x50000000UL\n#define DWC2_EP_MAX         4\n\nstatic const dwc2_controller_t _dwc2_controller[] =\n{\n  { .reg_base = DWC2_REG_BASE, .irqnum = 86, .ep_count = DWC2_EP_MAX, .ep_fifo_size = 1280 }\n};\n\nextern uint32_t SystemCoreClock;\n\n// The GD32VF103 is a RISC-V MCU, which implements the ECLIC Core-Local\n// Interrupt Controller by Nuclei. It is nearly API compatible to the\n// NVIC used by ARM MCUs.\n#define ECLIC_INTERRUPT_ENABLE_BASE 0xD2001001UL\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void __eclic_enable_interrupt (uint32_t irq) {\n  *(volatile uint8_t*)(ECLIC_INTERRUPT_ENABLE_BASE + (irq * 4)) = 1;\n}\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void __eclic_disable_interrupt (uint32_t irq){\n  *(volatile uint8_t*)(ECLIC_INTERRUPT_ENABLE_BASE + (irq * 4)) = 0;\n}\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void dwc2_dcd_int_enable(uint8_t rhport)\n{\n  __eclic_enable_interrupt(_dwc2_controller[rhport].irqnum);\n}\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void dwc2_dcd_int_disable (uint8_t rhport)\n{\n  __eclic_disable_interrupt(_dwc2_controller[rhport].irqnum);\n}\n\nstatic inline void dwc2_remote_wakeup_delay(void)\n{\n  // try to delay for 1 ms\n  uint32_t count = SystemCoreClock / 1000;\n  while ( count-- ) __asm volatile (\"nop\");\n}\n\n// MCU specific PHY init, called BEFORE core reset\nstatic inline void dwc2_phy_init(dwc2_regs_t * dwc2, uint8_t hs_phy_type)\n{\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  // nothing to do\n}\n\n// MCU specific PHY deinit, disable PHY power\nstatic inline void dwc2_phy_deinit(dwc2_regs_t * dwc2, uint8_t hs_phy_type) {\n  (void) dwc2;\n  (void) hs_phy_type;\n  // nothing to do\n}\n\n// MCU specific PHY update, it is called AFTER init() and core reset\nstatic inline void dwc2_phy_update(dwc2_regs_t * dwc2, uint8_t hs_phy_type)\n{\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  // nothing to do\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* DWC2_GD32_H_ */\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_info.md",
    "content": "|                            | AT32 F405 FS   | AT32 F405 HS   | AT32 F415   | BCM2711 (Pi4)   | EFM32GG      | ESP32-S2/S3   | ESP32-P4     | nRF54        | ST F407/429 HS   | ST F207/F407/411/429 FS   | ST L476 FS   | ST F412/76x FS   | ST F76x HS   | ST H743/H750   | ST F723/L4P5 FS   | ST F723 HS   | ST H7RS FS   | ST U5A5/H7RS/N6 HS   | XMC4500      | GD32VF103   |\n|:---------------------------|:---------------|:---------------|:------------|:----------------|:-------------|:--------------|:-------------|:-------------|:-----------------|:--------------------------|:-------------|:-----------------|:-------------|:---------------|:------------------|:-------------|:-------------|:---------------------|:-------------|:------------|\n| GUID                       | 0x00002000     | 0x00000000     | 0x00001000  | 0x2708A000      | 0x00000000   | 0x00000000    | 0x00000000   | 0x00000000   | 0x00001100       | 0x00001200                | 0x00002000   | 0x00002000       | 0x00002100   | 0x00002300     | 0x00003000        | 0x00003100   | 0x00004000   | 0x00005000           | 0x00AEC000   | 0x00001000  |\n| GSNPSID                    | 0x4F54400A     | 0x4F54400A     | 0x4F54400A  | 0x4F54280A      | 0x4F54330A   | 0x4F54400A    | 0x4F54400A   | 0x4F54430A   | 0x4F54281A       | 0x4F54281A                | 0x4F54310A   | 0x4F54320A       | 0x4F54320A   | 0x4F54330A     | 0x4F54330A        | 0x4F54330A   | 0x4F54411A   | 0x4F54411A           | 0x4F54292A   | 0x00000000  |\n| - specs version            | 4.00a          | 4.00a          | 4.00a       | 2.80a           | 3.30a        | 4.00a         | 4.00a        | 4.30a        | 2.81a            | 2.81a                     | 3.10a        | 3.20a            | 3.20a        | 3.30a          | 3.30a             | 3.30a        | 4.11a        | 4.11a                | 2.92a        | 0.00W       |\n| GHWCFG1                    | 0x00000000     | 0x00000000     | 0x00000000  | 0x00000000      | 0x00000000   | 0x00000000    | 0x00000000   | 0xAA555000   | 0x00000000       | 0x00000000                | 0x00000000   | 0x00000000       | 0x00000000   | 0x00000000     | 0x00000000        | 0x00000000   | 0x00000000   | 0x00000000           | 0x00000000   | 0x00000000  |\n| GHWCFG2                    | 0x228FDD00     | 0x229FDDD0     | 0x228DCD00  | 0x228DDD50      | 0x228F5910   | 0x224DD930    | 0x215FFFD0   | 0x228BFC72   | 0x229ED590       | 0x229DCD20                | 0x229ED520   | 0x229ED520       | 0x229FE190   | 0x229FE190     | 0x229ED520        | 0x229FE1D0   | 0x229ED522   | 0x228FE052           | 0x228F5930   | 0x00000000  |\n| - op_mode                  | HNP SRP        | HNP SRP        | HNP SRP     | HNP SRP         | HNP SRP      | HNP SRP       | HNP SRP      | noHNP noSRP  | HNP SRP          | HNP SRP                   | HNP SRP      | HNP SRP          | HNP SRP      | HNP SRP        | HNP SRP           | HNP SRP      | noHNP noSRP  | noHNP noSRP          | HNP SRP      | HNP SRP     |\n| - arch                     | Slave only     | DMA internal   | Slave only  | DMA internal    | DMA internal | DMA internal  | DMA internal | DMA internal | DMA internal     | Slave only                | Slave only   | Slave only       | DMA internal | DMA internal   | Slave only        | DMA internal | Slave only   | DMA internal         | DMA internal | Slave only  |\n| - single_point             | hub            | hub            | hub         | hub             | hub          | n/a           | hub          | n/a          | hub              | n/a                       | n/a          | n/a              | hub          | hub            | n/a               | hub          | n/a          | hub                  | n/a          | hub         |\n| - hs_phy_type              | n/a            | UTMI+/ULPI     | n/a         | UTMI+           | n/a          | n/a           | UTMI+/ULPI   | UTMI+        | ULPI             | n/a                       | n/a          | n/a              | ULPI         | ULPI           | n/a               | UTMI+/ULPI   | n/a          | UTMI+                | n/a          | n/a         |\n| - fs_phy_type              | Dedicated      | Dedicated      | Dedicated   | Dedicated       | Dedicated    | Dedicated     | Shared ULPI  | n/a          | Dedicated        | Dedicated                 | Dedicated    | Dedicated        | Dedicated    | Dedicated      | Dedicated         | Dedicated    | Dedicated    | n/a                  | Dedicated    | n/a         |\n| - num_dev_ep               | 7              | 7              | 3           | 7               | 6            | 6             | 15           | 15           | 5                | 3                         | 5            | 5                | 8            | 8              | 5                 | 8            | 5            | 8                    | 6            | 0           |\n| - num_host_ch              | 15             | 15             | 7           | 7               | 13           | 7             | 15           | 15           | 11               | 7                         | 11           | 11               | 15           | 15             | 11                | 15           | 11           | 15                   | 13           | 0           |\n| - period_channel_support   | 1              | 1              | 1           | 1               | 1            | 1             | 1            | 0            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 1                    | 1            | 0           |\n| - enable_dynamic_fifo      | 1              | 1              | 1           | 1               | 1            | 1             | 1            | 1            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 1                    | 1            | 0           |\n| - mul_proc_intrpt          | 0              | 1              | 0           | 0               | 0            | 0             | 1            | 0            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 0                    | 0            | 0           |\n| - reserved21               | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - nptx_q_depth             | 8              | 8              | 8           | 8               | 8            | 4             | 4            | 8            | 8                | 8                         | 8            | 8                | 8            | 8              | 8                 | 8            | 8            | 8                    | 8            | 2           |\n| - ptx_q_depth              | 8              | 8              | 8           | 8               | 8            | 8             | 4            | 8            | 8                | 8                         | 8            | 8                | 8            | 8              | 8                 | 8            | 8            | 8                    | 8            | 2           |\n| - token_q_depth            | 8              | 8              | 8           | 8               | 8            | 8             | 8            | 8            | 8                | 8                         | 8            | 8                | 8            | 8              | 8                 | 8            | 8            | 8                    | 8            | 0           |\n| - otg_enable_ic_usb        | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| GHWCFG3                    | 0x020004E8     | 0x03F006E8     | 0x020004E8  | 0x0FF000E8      | 0x01F204E8   | 0x00C804B5    | 0x03805EB5   | 0x0BEAC0E8   | 0x03F403E8       | 0x020001E8                | 0x0200D1E8   | 0x0200D1E8       | 0x03EED2E8   | 0x03B8D2E8     | 0x0200D1E8        | 0x03EED2E8   | 0x020081E8   | 0x03B882E8           | 0x027A01E5   | 0x00000000  |\n| - xfer_size_width          | 8              | 8              | 8           | 8               | 8            | 5             | 5            | 8            | 8                | 8                         | 8            | 8                | 8            | 8              | 8                 | 8            | 8            | 8                    | 5            | 0           |\n| - packet_size_width        | 6              | 6              | 6           | 6               | 6            | 3             | 3            | 6            | 6                | 6                         | 6            | 6                | 6            | 6              | 6                 | 6            | 6            | 6                    | 6            | 0           |\n| - otg_enable               | 1              | 1              | 1           | 1               | 1            | 1             | 1            | 1            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 1                    | 1            | 0           |\n| - i2c_enable               | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 0            | 1                | 1                         | 1            | 1                | 0            | 0              | 1                 | 0            | 1            | 0                    | 1            | 0           |\n| - vendor_ctrl_itf          | 0              | 1              | 0           | 0               | 0            | 0             | 1            | 0            | 1                | 0                         | 0            | 0                | 1            | 1              | 0                 | 1            | 0            | 1                    | 0            | 0           |\n| - optional_feature_removed | 1              | 1              | 1           | 0               | 1            | 1             | 1            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - synch_reset              | 0              | 0              | 0           | 0               | 0            | 0             | 1            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - otg_adp_support          | 0              | 0              | 0           | 0               | 0            | 0             | 1            | 0            | 0                | 0                         | 1            | 1                | 1            | 1              | 1                 | 1            | 0            | 0                    | 0            | 0           |\n| - otg_enable_hsic          | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - battery_charger_support  | 0              | 0              | 0           | 0               | 0            | 0             | 1            | 1            | 0                | 0                         | 1            | 1                | 1            | 1              | 1                 | 1            | 0            | 0                    | 0            | 0           |\n| - lpm_mode                 | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 1            | 0                | 0                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 1                    | 0            | 0           |\n| - dfifo_depth              | 512            | 1008           | 512         | 4080            | 498          | 200           | 896          | 3050         | 1012             | 512                       | 512          | 512              | 1006         | 952            | 512               | 1006         | 512          | 952                  | 634          | 0           |\n| GHWCFG4                    | 0x1FF0A020     | 0x1FF0A020     | 0x0000000F  | 0x1FF00020      | 0x1BF08030   | 0xD3F0A030    | 0xDFF1A030   | 0x1E10AA60   | 0x17F00030       | 0x0FF08030                | 0x17F08030   | 0x17F08030       | 0x23F00030   | 0xE3F00030     | 0x17F08030        | 0x23F00030   | 0x1610B230   | 0xE2103E30           | 0xDBF08030   | 0x00000000  |\n| - num_dev_period_in_ep     | 0              | 0              | 15          | 0               | 0            | 0             | 0            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - partial_powerdown        | 0              | 0              | 0           | 0               | 1            | 1             | 1            | 0            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 1                    | 1            | 0           |\n| - ahb_freq_min             | 1              | 1              | 0           | 1               | 1            | 1             | 1            | 1            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 1                    | 1            | 0           |\n| - hibernation              | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 1            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - extended_hibernation     | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - reserved8                | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - enhanced_lpm_support1    | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 1            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 1            | 1                    | 0            | 0           |\n| - service_interval_flow    | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 1                    | 0            | 0           |\n| - ipg_isoc_support         | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 1            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 1                    | 0            | 0           |\n| - acg_support              | 0              | 0              | 0           | 0               | 0            | 0             | 0            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 1            | 1                    | 0            | 0           |\n| - enhanced_lpm_support     | 1              | 1              | 0           | 0               | 0            | 1             | 1            | 1            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 1            | 1                    | 0            | 0           |\n| - phy_data_width           | 8/16 bit       | 8/16 bit       | 8 bit       | 8 bit           | 8/16 bit     | 8/16 bit      | 8/16 bit     | 8/16 bit     | 8 bit            | 8/16 bit                  | 8/16 bit     | 8/16 bit         | 8 bit        | 8 bit          | 8/16 bit          | 8 bit        | 8/16 bit     | 8 bit                | 8/16 bit     | 8 bit       |\n| - ctrl_ep_num              | 0              | 0              | 0           | 0               | 0            | 0             | 1            | 0            | 0                | 0                         | 0            | 0                | 0            | 0              | 0                 | 0            | 0            | 0                    | 0            | 0           |\n| - iddg_filter              | 1              | 1              | 0           | 1               | 1            | 1             | 1            | 1            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 1                    | 1            | 0           |\n| - vbus_valid_filter        | 1              | 1              | 0           | 1               | 1            | 1             | 1            | 0            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 0            | 0                    | 1            | 0           |\n| - a_valid_filter           | 1              | 1              | 0           | 1               | 1            | 1             | 1            | 0            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 0            | 0                    | 1            | 0           |\n| - b_valid_filter           | 1              | 1              | 0           | 1               | 1            | 1             | 1            | 0            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 0            | 0                    | 1            | 0           |\n| - session_end_filter       | 1              | 1              | 0           | 1               | 1            | 1             | 1            | 0            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 0            | 0                    | 1            | 0           |\n| - dedicated_fifos          | 1              | 1              | 0           | 1               | 1            | 1             | 1            | 1            | 1                | 1                         | 1            | 1                | 1            | 1              | 1                 | 1            | 1            | 1                    | 1            | 0           |\n| - num_dev_in_eps           | 7              | 7              | 0           | 7               | 6            | 4             | 7            | 7            | 5                | 3                         | 5            | 5                | 8            | 8              | 5                 | 8            | 5            | 8                    | 6            | 0           |\n| - dma_desc_enable          | 0              | 0              | 0           | 0               | 0            | 1             | 1            | 0            | 0                | 0                         | 0            | 0                | 0            | 1              | 0                 | 0            | 0            | 1                    | 1            | 0           |\n| - dma_desc_dynamic         | 0              | 0              | 0           | 0               | 0            | 1             | 1            | 0            | 0                | 0                         | 0            | 0                | 0            | 1              | 0                 | 0            | 0            | 1                    | 1            | 0           |\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_info.py",
    "content": "#!/usr/bin/env python3\n\nimport ctypes\nimport argparse\nimport pandas as pd\n\n# hex value for register: guid, gsnpsid, ghwcfg1, ghwcfg2, ghwcfg3, ghwcfg4\n# Note: FS is FullSpeed, HS is HighSpeed\ndwc2_reg_list = ['GUID', 'GSNPSID', 'GHWCFG1', 'GHWCFG2', 'GHWCFG3', 'GHWCFG4']\ndwc2_reg_value = {\n    'AT32 F405 FS': [0x00002000, 0x4F54400A, 0x00000000, 0x228FDD00, 0x020004E8, 0x1FF0A020],\n    'AT32 F405 HS': [0x00000000, 0x4F54400A, 0x00000000, 0x229FDDD0, 0x03F006E8, 0x1FF0A020],\n    'AT32 F415': [0x00001000, 0x4F54400A, 0x00000000, 0x228DCD00, 0x020004E8, 0x0F],\n    'BCM2711 (Pi4)': [0x2708A000, 0x4F54280A, 0, 0x228DDD50, 0xFF000E8, 0x1FF00020],\n    'EFM32GG': [0, 0x4F54330A, 0, 0x228F5910, 0x01F204E8, 0x1BF08030],\n    'ESP32-S2/S3': [0, 0x4F54400A, 0, 0x224DD930, 0x0C804B5, 0xD3F0A030],\n    'ESP32-P4': [0, 0x4F54400A, 0, 0x215FFFD0, 0x03805EB5, 0xDFF1A030],\n    'nRF54': [0, 0x4F54430A, 0xAA555000, 0x228BFC72, 0x0BEAC0E8, 0x1E10AA60],\n    # ST sort by GUID\n    'ST F407/429 HS': [0x1100, 0x4F54281A, 0, 0x229ED590, 0x03F403E8, 0x17F00030],\n    'ST F207/F407/411/429 FS': [0x1200, 0x4F54281A, 0, 0x229DCD20, 0x020001E8, 0x0FF08030],\n    'ST L476 FS': [0x2000, 0x4F54310A, 0, 0x229ED520, 0x0200D1E8, 0x17F08030],\n    'ST F412/76x FS': [0x2000, 0x4F54320A, 0, 0x229ED520, 0x0200D1E8, 0x17F08030],\n    'ST F76x HS': [0x2100, 0x4F54320A, 0, 0x229FE190, 0x03EED2E8, 0x23F00030],\n    'ST H743/H750': [0x2300, 0x4F54330A, 0, 0x229FE190, 0x03B8D2E8, 0xE3F00030],\n    'ST F723/L4P5 FS': [0x3000, 0x4F54330A, 0, 0x229ED520, 0x0200D1E8, 0x17F08030],\n    'ST F723 HS': [0x3100, 0x4F54330A, 0, 0x229FE1D0, 0x03EED2E8, 0x23F00030],\n    'ST H7RS FS': [0x4000, 0x4F54411A, 0, 0x229ED522, 0x20081E8, 0x1610B230],\n    'ST U5A5/H7RS/N6 HS': [0x5000, 0x4F54411A, 0, 0x228FE052, 0x03B882E8, 0xE2103E30],\n    'XMC4500': [0xAEC000, 0x4F54292A, 0, 0x228F5930, 0x027A01E5, 0xDBF08030],\n    'GD32VF103': [0x1000, 0, 0, 0, 0, 0],\n}\n\n# Combine dwc2_info with dwc2_reg_list\n# dwc2_info = {\n#     'BCM2711 (Pi4)': {\n#         'GUID': 0x2708A000,\n#         'GSNPSID': 0x4F54280A,\n#         'GHWCFG1': 0,\n#         'GHWCFG2': 0x228DDD50,\n#         'GHWCFG3': 0xFF000E8,\n#         'GHWCFG4': 0x1FF00020\n#     },\ndwc2_info = {key: {field: value for field, value in zip(dwc2_reg_list, values)} for key, values in dwc2_reg_value.items()}\n\n\nclass GHWCFG2(ctypes.LittleEndianStructure):\n    _fields_ = [\n        (\"op_mode\", ctypes.c_uint32, 3),\n        (\"arch\", ctypes.c_uint32, 2),\n        (\"single_point\", ctypes.c_uint32, 1),\n        (\"hs_phy_type\", ctypes.c_uint32, 2),\n        (\"fs_phy_type\", ctypes.c_uint32, 2),\n        (\"num_dev_ep\", ctypes.c_uint32, 4),\n        (\"num_host_ch\", ctypes.c_uint32, 4),\n        (\"period_channel_support\", ctypes.c_uint32, 1),\n        (\"enable_dynamic_fifo\", ctypes.c_uint32, 1),\n        (\"mul_proc_intrpt\", ctypes.c_uint32, 1),\n        (\"reserved21\", ctypes.c_uint32, 1),\n        (\"nptx_q_depth\", ctypes.c_uint32, 2),\n        (\"ptx_q_depth\", ctypes.c_uint32, 2),\n        (\"token_q_depth\", ctypes.c_uint32, 5),\n        (\"otg_enable_ic_usb\", ctypes.c_uint32, 1)\n    ]\n\n\nclass GHWCFG3(ctypes.LittleEndianStructure):\n    _fields_ = [\n        (\"xfer_size_width\", ctypes.c_uint32, 4),\n        (\"packet_size_width\", ctypes.c_uint32, 3),\n        (\"otg_enable\", ctypes.c_uint32, 1),\n        (\"i2c_enable\", ctypes.c_uint32, 1),\n        (\"vendor_ctrl_itf\", ctypes.c_uint32, 1),\n        (\"optional_feature_removed\", ctypes.c_uint32, 1),\n        (\"synch_reset\", ctypes.c_uint32, 1),\n        (\"otg_adp_support\", ctypes.c_uint32, 1),\n        (\"otg_enable_hsic\", ctypes.c_uint32, 1),\n        (\"battery_charger_support\", ctypes.c_uint32, 1),\n        (\"lpm_mode\", ctypes.c_uint32, 1),\n        (\"dfifo_depth\", ctypes.c_uint32, 16)\n    ]\n\n\nclass GHWCFG4(ctypes.LittleEndianStructure):\n    _fields_ = [\n        (\"num_dev_period_in_ep\", ctypes.c_uint32, 4),\n        (\"partial_powerdown\", ctypes.c_uint32, 1),\n        (\"ahb_freq_min\", ctypes.c_uint32, 1),\n        (\"hibernation\", ctypes.c_uint32, 1),\n        (\"extended_hibernation\", ctypes.c_uint32, 1),\n        (\"reserved8\", ctypes.c_uint32, 1),\n        (\"enhanced_lpm_support1\", ctypes.c_uint32, 1),\n        (\"service_interval_flow\", ctypes.c_uint32, 1),\n        (\"ipg_isoc_support\", ctypes.c_uint32, 1),\n        (\"acg_support\", ctypes.c_uint32, 1),\n        (\"enhanced_lpm_support\", ctypes.c_uint32, 1),\n        (\"phy_data_width\", ctypes.c_uint32, 2),\n        (\"ctrl_ep_num\", ctypes.c_uint32, 4),\n        (\"iddg_filter\", ctypes.c_uint32, 1),\n        (\"vbus_valid_filter\", ctypes.c_uint32, 1),\n        (\"a_valid_filter\", ctypes.c_uint32, 1),\n        (\"b_valid_filter\", ctypes.c_uint32, 1),\n        (\"session_end_filter\", ctypes.c_uint32, 1),\n        (\"dedicated_fifos\", ctypes.c_uint32, 1),\n        (\"num_dev_in_eps\", ctypes.c_uint32, 4),\n        (\"dma_desc_enable\", ctypes.c_uint32, 1),\n        (\"dma_desc_dynamic\", ctypes.c_uint32, 1)\n    ]\n\n# mapping for specific fields in GHWCFG2\nGHWCFG2_field = {\n    'op_mode': {\n        0: \"HNP SRP\",\n        1: \"SRP\",\n        2: \"noHNP noSRP\",\n        3: \"SRP Device\",\n        4: \"noOTG Device\",\n        5: \"SRP Host\",\n        6: \"noOTG Host\"\n    },\n    'arch': {\n        0: \"Slave only\",\n        1: \"DMA external\",\n        2: \"DMA internal\"\n    },\n    'single_point': {\n        0: \"hub\",\n        1: \"n/a\"\n    },\n    'hs_phy_type': {\n        0: \"n/a\",\n        1: \"UTMI+\",\n        2: \"ULPI\",\n        3: \"UTMI+/ULPI\"\n    },\n    'fs_phy_type': {\n        0: \"n/a\",\n        1: \"Dedicated\",\n        2: \"Shared UTMI+\",\n        3: \"Shared ULPI\"\n    },\n    'nptx_q_depth': {\n        0: \"2\",\n        1: \"4\",\n        2: \"8\",\n    },\n    'ptx_q_depth': {\n        0: \"2\",\n        1: \"4\",\n        2: \"8\",\n        3: \"16\"\n    },\n}\n\n# mapping for specific fields in GHWCFG4\nGHWCFG4_field = {\n    'phy_data_width': {\n        0: \"8 bit\",\n        1: \"16 bit\",\n        2: \"8/16 bit\",\n        3: \"Reserved\"\n    },\n    }\n\ndef main():\n    \"\"\"Render dwc2_info to Markdown table\"\"\"\n\n    parser = argparse.ArgumentParser()\n    args = parser.parse_args()\n\n    # Create an empty list to hold the dictionaries\n    md_table = []\n\n    # Iterate over the dwc2_info dictionary and extract fields\n    for device, reg_values in dwc2_info.items():\n        md_item = {\"Device\": device}\n        for r_name, r_value in reg_values.items():\n            md_item[r_name] = f\"0x{r_value:08X}\"\n\n            if r_name == 'GSNPSID':\n                # Get dwc2 specs version\n                major = ((r_value >> 8) >> 4) & 0x0F\n                minor = (r_value >> 4) & 0xFF\n                patch = chr((r_value & 0x0F) + ord('a') - 0xA)\n                md_item[f' - specs version'] = f\"{major:X}.{minor:02X}{patch}\"\n            elif r_name in globals():\n                # Get bit-field values which exist as ctypes structures\n                class_hdl = globals()[r_name]\n                ghwcfg = class_hdl.from_buffer_copy(r_value.to_bytes(4, byteorder='little'))\n                for field_name, field_type, _ in class_hdl._fields_:\n                    field_value = getattr(ghwcfg, field_name)\n                    if class_hdl == GHWCFG2 and field_name in GHWCFG2_field:\n                        field_value = GHWCFG2_field[field_name].get(field_value, f\"Unknown ({field_value})\")\n                    if class_hdl == GHWCFG4 and field_name in GHWCFG4_field:\n                        field_value = GHWCFG4_field[field_name].get(field_value, f\"Unknown ({field_value})\")\n\n                    md_item[f' - {field_name}'] = field_value\n\n        md_table.append(md_item)\n\n    # Create a Pandas DataFrame from the list of dictionaries\n    df = pd.DataFrame(md_table).set_index('Device')\n\n    # Transpose the DataFrame to switch rows and columns\n    df = df.T\n    #print(df)\n\n    # Write the Markdown table to a file\n    with open('dwc2_info.md', 'w') as md_file:\n        md_file.write(df.to_markdown())\n        md_file.write('\\n')\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_nrf.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2025 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n#ifndef TUSB_DWC2_NRF_H\n#define TUSB_DWC2_NRF_H\n\n#include \"nrf.h\"\n\n#define DWC2_EP_MAX 16\n\nstatic const dwc2_controller_t _dwc2_controller[] = {\n  { .reg_base = NRF_USBHSCORE0_NS_BASE, .irqnum = USBHS_IRQn, .ep_count = 16, .ep_fifo_size = 12288 },\n};\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_int_set(uint8_t rhport, tusb_role_t role, bool enabled) {\n  (void) rhport;\n  (void) role;\n  (void) enabled;\n}\n\n#define dwc2_dcd_int_enable(_rhport)  dwc2_int_set(_rhport, TUSB_ROLE_DEVICE, true)\n#define dwc2_dcd_int_disable(_rhport) dwc2_int_set(_rhport, TUSB_ROLE_DEVICE, false)\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_remote_wakeup_delay(void) {\n}\n\n// MCU specific PHY init, called BEFORE core reset\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_init(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  (void)dwc2;\n  (void)hs_phy_type;\n}\n\n// MCU specific PHY deinit, disable PHY power\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_deinit(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  (void)dwc2;\n  (void)hs_phy_type;\n}\n\n// MCU specific PHY update, it is called AFTER init() and core reset\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_phy_update(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  (void)dwc2;\n  (void)hs_phy_type;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_stm32.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef DWC2_STM32_H_\n#define DWC2_STM32_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n// EP_MAX       : Max number of bi-directional endpoints including EP0\n// EP_FIFO_SIZE : Size of dedicated USB SRAM\n#if CFG_TUSB_MCU == OPT_MCU_STM32F1\n  #include \"stm32f1xx.h\"\n  #define EP_MAX_FS       4\n  #define EP_FIFO_SIZE_FS 1280\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32F2\n  #include \"stm32f2xx.h\"\n  #define EP_MAX_FS       USB_OTG_FS_MAX_IN_ENDPOINTS\n  #define EP_FIFO_SIZE_FS USB_OTG_FS_TOTAL_FIFO_SIZE\n\n  #define EP_MAX_HS       USB_OTG_HS_MAX_IN_ENDPOINTS\n  #define EP_FIFO_SIZE_HS USB_OTG_HS_TOTAL_FIFO_SIZE\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32F4\n  #include \"stm32f4xx.h\"\n  #define EP_MAX_FS       USB_OTG_FS_MAX_IN_ENDPOINTS\n  #define EP_FIFO_SIZE_FS USB_OTG_FS_TOTAL_FIFO_SIZE\n\n  #define EP_MAX_HS       USB_OTG_HS_MAX_IN_ENDPOINTS\n  #define EP_FIFO_SIZE_HS USB_OTG_HS_TOTAL_FIFO_SIZE\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32H7\n  #include \"stm32h7xx.h\"\n  #define EP_MAX_FS       9\n  #define EP_FIFO_SIZE_FS 4096\n\n  #define EP_MAX_HS       9\n  #define EP_FIFO_SIZE_HS 4096\n\n  // NOTE: H7 with only 1 USB port: H72x / H73x / H7Ax / H7Bx\n  // USB_OTG_FS_PERIPH_BASE and OTG_FS_IRQn not defined\n  #if (! defined USB2_OTG_FS)\n    #define USB_OTG_FS_PERIPH_BASE  USB1_OTG_HS_PERIPH_BASE\n    #define OTG_FS_IRQn             OTG_HS_IRQn\n  #endif\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32H7RS\n  #include \"stm32h7rsxx.h\"\n  #define EP_MAX_FS       6\n  #define EP_FIFO_SIZE_FS 1280\n\n  #define EP_MAX_HS       9\n  #define EP_FIFO_SIZE_HS 4096\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32N6\n  #include \"stm32n6xx.h\"\n  #define EP_MAX_FS       9\n  #define EP_FIFO_SIZE_FS 4096\n\n  #define EP_MAX_HS       9\n  #define EP_FIFO_SIZE_HS 4096\n\n  #define USB_OTG_FS_PERIPH_BASE    USB1_OTG_HS_BASE\n  #define OTG_FS_IRQn               USB1_OTG_HS_IRQn\n\n  #define USB_OTG_HS_PERIPH_BASE    USB2_OTG_HS_BASE\n  #define OTG_HS_IRQn               USB2_OTG_HS_IRQn\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32F7\n  #include \"stm32f7xx.h\"\n  #define EP_MAX_FS       6\n  #define EP_FIFO_SIZE_FS 1280\n\n  #define EP_MAX_HS       9\n  #define EP_FIFO_SIZE_HS 4096\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32L4\n  #include \"stm32l4xx.h\"\n  #define EP_MAX_FS       6\n  #define EP_FIFO_SIZE_FS 1280\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32U5\n  #include \"stm32u5xx.h\"\n  // U59x/5Ax/5Fx/5Gx are highspeed with built-in HS PHY\n  #ifdef USB_OTG_FS\n    #define USB_OTG_FS_PERIPH_BASE    USB_OTG_FS_BASE\n    #define EP_MAX_FS                 6\n    #define EP_FIFO_SIZE_FS           1280\n  #else\n    #define USB_OTG_HS_PERIPH_BASE    USB_OTG_HS_BASE\n    #define EP_MAX_HS                 9\n    #define EP_FIFO_SIZE_HS           4096\n  #endif\n\n#elif CFG_TUSB_MCU == OPT_MCU_STM32WBA\n  #if defined(STM32WBA62xx)\n    #include \"stm32wba62xx.h\"\n  #elif defined(STM32WBA64xx)\n    #include \"stm32wba64xx.h\"\n  #elif defined(STM32WBA65xx)\n    #include \"stm32wba65xx.h\"\n  #else\n    #error \"The selected STM32WBA series chip does not support OTG USB HS\"\n  #endif\n\n  #define USB_OTG_HS_PERIPH_BASE    USB_OTG_HS_BASE_NS\n  #define OTG_HS_IRQn               USB_OTG_HS_IRQn\n  #define EP_MAX_HS                 9\n  #define EP_FIFO_SIZE_HS           4096\n#else\n  #error \"Unsupported MCUs\"\n#endif\n\n// OTG HS always has higher number of endpoints than FS\n#ifdef USB_OTG_HS_PERIPH_BASE\n  #define DWC2_EP_MAX   EP_MAX_HS\n#else\n  #define DWC2_EP_MAX   EP_MAX_FS\n#endif\n\n// On STM32 for consistency we associate\n// - Port0 to OTG_FS, and Port1 to OTG_HS\nstatic const dwc2_controller_t _dwc2_controller[] = {\n    #ifdef USB_OTG_FS_PERIPH_BASE\n    { .reg_base = USB_OTG_FS_PERIPH_BASE, .irqnum = OTG_FS_IRQn, .ep_count = EP_MAX_FS, .ep_fifo_size = EP_FIFO_SIZE_FS },\n    #endif\n\n    #ifdef USB_OTG_HS_PERIPH_BASE\n    { .reg_base = USB_OTG_HS_PERIPH_BASE, .irqnum = OTG_HS_IRQn, .ep_count = EP_MAX_HS, .ep_fifo_size = EP_FIFO_SIZE_HS },\n    #endif\n};\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n// SystemCoreClock is already included by family header\n// extern uint32_t SystemCoreClock;\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_int_set(uint8_t rhport, tusb_role_t role, bool enabled) {\n  (void) role;\n  const IRQn_Type irqn = (IRQn_Type) _dwc2_controller[rhport].irqnum;\n  if (enabled) {\n    NVIC_EnableIRQ(irqn);\n  } else {\n    NVIC_DisableIRQ(irqn);\n  }\n}\n\n#define dwc2_dcd_int_enable(_rhport)  dwc2_int_set(_rhport, TUSB_ROLE_DEVICE, true)\n#define dwc2_dcd_int_disable(_rhport) dwc2_int_set(_rhport, TUSB_ROLE_DEVICE, false)\n\n\nTU_ATTR_ALWAYS_INLINE static inline void dwc2_remote_wakeup_delay(void) {\n  // try to delay for 1 ms\n  uint32_t count = SystemCoreClock / 1000;\n  while (count--) {\n    __NOP();\n  }\n}\n\n// MCU specific PHY init, called BEFORE core reset\n// - dwc2 3.30a (H5) use USB_HS_PHYC\n// - dwc2 4.11a (U5) use femtoPHY\n// - dwc2 x.xxx (WBA) use USB_OTG_HS\nstatic inline void dwc2_phy_init(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  if (hs_phy_type == GHWCFG2_HSPHY_NOT_SUPPORTED) {\n    // Enable on-chip FS PHY\n    dwc2->stm32_gccfg |= STM32_GCCFG_PWRDWN;\n\n    // https://community.st.com/t5/stm32cubemx-mcus/why-stm32h743-usb-fs-doesn-t-work-if-freertos-tickless-idle/m-p/349480#M18867\n    // H7 running on full-speed phy need to disable ULPI clock in sleep mode.\n    // Otherwise, USB won't work when mcu executing WFI/WFE instruction i.e tick-less RTOS.\n    // Note: there may be other family that is affected by this, but only H7 and F7 is tested so far\n    #if defined(USB_OTG_FS_PERIPH_BASE) && defined(RCC_AHB1LPENR_USB2OTGFSULPILPEN)\n    if ( USB_OTG_FS_PERIPH_BASE == (uint32_t) dwc2 ) {\n      RCC->AHB1LPENR &= ~RCC_AHB1LPENR_USB2OTGFSULPILPEN;\n    }\n    #endif\n\n    #if defined(USB_OTG_HS_PERIPH_BASE) && defined(RCC_AHB1LPENR_USB1OTGHSULPILPEN)\n    if ( USB_OTG_HS_PERIPH_BASE == (uint32_t) dwc2 ) {\n      RCC->AHB1LPENR &= ~RCC_AHB1LPENR_USB1OTGHSULPILPEN;\n    }\n    #endif\n\n    #if defined(USB_OTG_HS_PERIPH_BASE) && defined(RCC_AHB1LPENR_OTGHSULPILPEN)\n    if ( USB_OTG_HS_PERIPH_BASE == (uint32_t) dwc2 ) {\n      RCC->AHB1LPENR &= ~RCC_AHB1LPENR_OTGHSULPILPEN;\n    }\n    #endif\n\n  } else {\n#if CFG_TUSB_MCU != OPT_MCU_STM32U5 && CFG_TUSB_MCU != OPT_MCU_STM32WBA\n    // Disable FS PHY, TODO on U5A5 (dwc2 4.11a) 16th bit is 'Host CDP behavior enable'\n    dwc2->stm32_gccfg &= ~STM32_GCCFG_PWRDWN;\n#endif\n    // Enable on-chip HS PHY\n    if (hs_phy_type == GHWCFG2_HSPHY_UTMI || hs_phy_type == GHWCFG2_HSPHY_UTMI_ULPI) {\n      #ifdef USB_HS_PHYC\n      // Enable UTMI HS PHY\n      dwc2->stm32_gccfg |= STM32_GCCFG_PHYHSEN;\n\n      // Enable LDO\n      USB_HS_PHYC->USB_HS_PHYC_LDO |= USB_HS_PHYC_LDO_ENABLE;\n\n      // Wait until LDO ready\n      while ( 0 == (USB_HS_PHYC->USB_HS_PHYC_LDO & USB_HS_PHYC_LDO_STATUS) ) {}\n\n      uint32_t phyc_pll = 0;\n\n      // TODO Try to get HSE_VALUE from registers instead of depending CFLAGS\n      switch ( HSE_VALUE )\n      {\n        case 12000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_12MHZ   ; break;\n        case 12500000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_12_5MHZ ; break;\n        case 16000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_16MHZ   ; break;\n        case 24000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_24MHZ   ; break;\n        case 25000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_25MHZ   ; break;\n        case 32000000: phyc_pll = USB_HS_PHYC_PLL1_PLLSEL_Msk     ; break; // Value not defined in header\n        default:\n          TU_ASSERT(false, );\n      }\n      USB_HS_PHYC->USB_HS_PHYC_PLL = phyc_pll;\n\n      // Control the tuning interface of the High Speed PHY\n      // Use magic value (USB_HS_PHYC_TUNE_VALUE) from ST driver for F7\n      USB_HS_PHYC->USB_HS_PHYC_TUNE |= 0x00000F13U;\n\n      // Enable PLL internal PHY\n      USB_HS_PHYC->USB_HS_PHYC_PLL |= USB_HS_PHYC_PLL_PLLEN;\n\n      // Wait ~2ms until the PLL is ready (there's no RDY bit to query)\n      tusb_time_delay_ms_api(2);\n      #else\n\n      #endif\n    }\n  }\n}\n\n// MCU specific PHY deinit, disable PHY power\nstatic inline void dwc2_phy_deinit(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  if (hs_phy_type == GHWCFG2_HSPHY_NOT_SUPPORTED) {\n    // Disable on-chip FS PHY\n    dwc2->stm32_gccfg &= ~STM32_GCCFG_PWRDWN;\n  } else {\n    // Disable HS PHY\n    #ifdef USB_HS_PHYC\n    dwc2->stm32_gccfg &= ~STM32_GCCFG_PHYHSEN;\n    // Disable PLL and LDO\n    USB_HS_PHYC->USB_HS_PHYC_PLL &= ~USB_HS_PHYC_PLL_PLLEN;\n    USB_HS_PHYC->USB_HS_PHYC_LDO &= ~USB_HS_PHYC_LDO_ENABLE;\n    #endif\n  }\n}\n\n// MCU specific PHY update, it is called AFTER init() and core reset\nstatic inline void dwc2_phy_update(dwc2_regs_t* dwc2, uint8_t hs_phy_type) {\n  // used to set turnaround time for fullspeed, nothing to do in highspeed mode\n  if (hs_phy_type == GHWCFG2_HSPHY_NOT_SUPPORTED) {\n    // Turnaround timeout depends on the AHB clock dictated by STM32 Reference Manual\n    uint32_t turnaround;\n\n    if (SystemCoreClock >= 32000000u) {\n      turnaround = 0x6u;\n    } else if (SystemCoreClock >= 27500000u) {\n      turnaround = 0x7u;\n    } else if (SystemCoreClock >= 24000000u) {\n      turnaround = 0x8u;\n    } else if (SystemCoreClock >= 21800000u) {\n      turnaround = 0x9u;\n    }\n    else if (SystemCoreClock >= 20000000u) {\n      turnaround = 0xAu;\n    }\n    else if (SystemCoreClock >= 18500000u) {\n      turnaround = 0xBu;\n    }\n    else if (SystemCoreClock >= 17200000u) {\n      turnaround = 0xCu;\n    }\n    else if (SystemCoreClock >= 16000000u) {\n      turnaround = 0xDu;\n    }\n    else if (SystemCoreClock >= 15000000u) {\n      turnaround = 0xEu;\n    }\n    else {\n      turnaround = 0xFu;\n    }\n\n    dwc2->gusbcfg = (dwc2->gusbcfg & ~GUSBCFG_TRDT_Msk) | (turnaround << GUSBCFG_TRDT_Pos);\n  }\n}\n\n//------------- GCCFG configuration -------------//\nstatic inline void dwc2_stm32_gccfg_cfg(dwc2_regs_t* dwc2, bool vbus_sensing, bool is_host) {\n  if (is_host) {\n    vbus_sensing = false;\n  }\n\n  uint32_t gccfg = dwc2->stm32_gccfg;\n  if (dwc2->guid < 0x2000) {\n    // use VBUSASEN/VBUSBSEN/NOVBUSSENS bits\n    if (is_host) {\n      gccfg &= ~(STM32_GCCFG_NOVBUSSENS | STM32_GCCFG_VBUSBSEN | STM32_GCCFG_VBUSASEN);\n    } else {\n      if (vbus_sensing) {\n        gccfg &= ~STM32_GCCFG_NOVBUSSENS;\n        gccfg |= STM32_GCCFG_VBUSBSEN;\n      } else {\n        gccfg |= STM32_GCCFG_NOVBUSSENS;\n        gccfg &= ~(STM32_GCCFG_VBUSBSEN | STM32_GCCFG_VBUSASEN);\n      }\n    }\n  } else if (dwc2->guid < 0x5000) {\n    // the later version uses VBDEN with battery charging detection\n    if (vbus_sensing) {\n      gccfg |= STM32_GCCFG_VBDEN;\n    } else {\n      gccfg &= ~STM32_GCCFG_VBDEN;\n    }\n  } else {\n    // from 0x5000 ST seems to use femtoPHY for UTMI+ HS PHY. Which use VBVALEXTOEN and VBVALOVAL for software override\n    // external VBUS sensing\n    // Note: N6 does not support hardware VBUS sensing, so the software override is always active. Therefore, VBDEN and\n    //       VBVALEXTOEN are not available\n#if CFG_TUSB_MCU == OPT_MCU_STM32N6\n    if (is_host) {\n      gccfg |= STM32_GCCFG_PULLDOWNEN;\n      gccfg &= ~(STM32_GCCFG_VBVALOVAL);\n    } else {\n      gccfg &= ~STM32_GCCFG_PULLDOWNEN;\n      gccfg |= STM32_GCCFG_VBVALOVAL;\n    }\n#else\n    if (is_host) {\n      gccfg |= STM32_GCCFG_PULLDOWNEN;\n      gccfg &= ~(STM32_GCCFG_VBDEN | STM32_GCCFG_VBVALEXTOEN | STM32_GCCFG_VBVALOVAL);\n    } else {\n      gccfg &= ~STM32_GCCFG_PULLDOWNEN;\n      if (vbus_sensing) {\n        gccfg |= STM32_GCCFG_VBDEN;\n        gccfg &= ~(STM32_GCCFG_VBVALEXTOEN | STM32_GCCFG_VBVALOVAL);\n      } else {\n        gccfg &= ~STM32_GCCFG_VBDEN;\n        gccfg |= STM32_GCCFG_VBVALEXTOEN | STM32_GCCFG_VBVALOVAL;\n      }\n    }\n#endif\n  }\n\n  dwc2->stm32_gccfg = gccfg;\n}\n\n//------------- DCache -------------//\n#if CFG_TUD_MEM_DCACHE_ENABLE || CFG_TUH_MEM_DCACHE_ENABLE\n\ntypedef struct {\n  uintptr_t start;\n  uintptr_t end;\n} mem_region_t;\n\n// Can be used to define additional uncached regions\n#ifndef CFG_DWC2_MEM_UNCACHED_REGIONS\n#define CFG_DWC2_MEM_UNCACHED_REGIONS\n#endif\n\nstatic mem_region_t uncached_regions[] = {\n  // DTCM (although USB DMA can't transfer to/from DTCM)\n#if CFG_TUSB_MCU == OPT_MCU_STM32H7\n  {.start = 0x20000000, .end = 0x2001FFFF},\n#elif CFG_TUSB_MCU == OPT_MCU_STM32H7RS\n  // DTCM (although USB DMA can't transfer to/from DTCM)\n  {.start = 0x20000000, .end = 0x2002FFFF},\n#elif CFG_TUSB_MCU == OPT_MCU_STM32F7\n  // DTCM\n  {.start = 0x20000000, .end = 0x2000FFFF},\n#elif CFG_TUSB_MCU == OPT_MCU_STM32N6\n  // DTCM NS\n  {.start = 0x20000000, .end = 0x2003FFFF},\n  // DTCM S\n  {.start = 0x30000000, .end = 0x3003FFFF},\n#else\n#error \"Cache maintenance is not supported yet\"\n#endif\n  CFG_DWC2_MEM_UNCACHED_REGIONS\n};\n\nTU_ATTR_ALWAYS_INLINE static inline uint32_t round_up_to_cache_line_size(uint32_t size) {\n  if (size & (CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT-1)) {\n    size = (size & ~(CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT-1)) + CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT;\n  }\n  return size;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool is_cache_mem(uintptr_t addr) {\n  if (0 == (SCB->CCR & SCB_CCR_DC_Msk)) {\n    return false; // D-Cache is disabled\n  }\n  for (unsigned int i = 0; i < TU_ARRAY_SIZE(uncached_regions); i++) {\n    if (uncached_regions[i].start <= addr && addr <= uncached_regions[i].end) { return false; }\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool dwc2_dcache_clean(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (is_cache_mem(addr32)) {\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_CleanDCache_by_Addr((uint32_t *) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool dwc2_dcache_invalidate(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (is_cache_mem(addr32)) {\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_InvalidateDCache_by_Addr((void*) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool dwc2_dcache_clean_invalidate(void const* addr, uint32_t data_size) {\n  const uintptr_t addr32 = (uintptr_t) addr;\n  if (is_cache_mem(addr32)) {\n    data_size = round_up_to_cache_line_size(data_size);\n    SCB_CleanInvalidateDCache_by_Addr((uint32_t *) addr32, (int32_t) data_size);\n  }\n  return true;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_type.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n/** <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.\n  * All rights reserved.</center></h2>\n  *\n  * This software component is licensed by ST under BSD 3-Clause license,\n  * the \"License\"; You may not use this file except in compliance with the\n  * License. You may obtain a copy of the License at:\n  *                        opensource.org/licenses/BSD-3-Clause\n  */\n\n#ifndef TUSB_DWC2_TYPES_H_\n#define TUSB_DWC2_TYPES_H_\n\n#include \"stdint.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n// Controller\ntypedef struct\n{\n  uintptr_t reg_base;\n  uint32_t  irqnum;\n  uint8_t   ep_count;\n  uint8_t   ep_in_count;\n  uint32_t  ep_fifo_size;\n}dwc2_controller_t;\n\n// DWC OTG HW Release versions\n#define DWC2_CORE_REV_2_71a   0x4f54271a\n#define DWC2_CORE_REV_2_72a   0x4f54272a\n#define DWC2_CORE_REV_2_80a   0x4f54280a\n#define DWC2_CORE_REV_2_90a   0x4f54290a\n#define DWC2_CORE_REV_2_91a   0x4f54291a\n#define DWC2_CORE_REV_2_92a   0x4f54292a\n#define DWC2_CORE_REV_2_94a   0x4f54294a\n#define DWC2_CORE_REV_3_00a   0x4f54300a\n#define DWC2_CORE_REV_3_10a   0x4f54310a\n#define DWC2_CORE_REV_4_00a   0x4f54400a\n#define DWC2_CORE_REV_4_11a   0x4f54411a\n#define DWC2_CORE_REV_4_20a   0x4f54420a\n#define DWC2_FS_IOT_REV_1_00a 0x5531100a\n#define DWC2_HS_IOT_REV_1_00a 0x5532100a\n#define DWC2_CORE_REV_MASK    0x0000ffff\n\n// DWC OTG HW Core ID\n#define DWC2_OTG_ID           0x4f540000\n#define DWC2_FS_IOT_ID        0x55310000\n#define DWC2_HS_IOT_ID        0x55320000\n\n#if 0\n// HS PHY\ntypedef struct\n{\n  volatile uint32_t HS_PHYC_PLL;         // 000h This register is used to control the PLL of the HS PHY.\n  volatile uint32_t Reserved04;          // 004h Reserved\n  volatile uint32_t Reserved08;          // 008h Reserved\n  volatile uint32_t HS_PHYC_TUNE;        // 00Ch This register is used to control the tuning interface of the High Speed PHY.\n  volatile uint32_t Reserved10;          // 010h Reserved\n  volatile uint32_t Reserved14;          // 014h Reserved\n  volatile uint32_t HS_PHYC_LDO;         // 018h This register is used to control the regulator (LDO).\n} HS_PHYC_GlobalTypeDef;\n#endif\n\nenum {\n  GOTGCTL_OTG_VERSION_1_3 = 0,\n  GOTGCTL_OTG_VERSION_2_0 = 1,\n};\n\nenum {\n  GUSBCFG_PHYSEL_HIGHSPEED = 0,\n  GUSBCFG_PHYSEL_FULLSPEED = 1,\n};\n\nenum {\n  GUSBCFG_PHYHS_UTMI = 0,\n  GUSBCFG_PHYHS_ULPI = 1,\n};\n\nenum {\n  GHWCFG2_OPMODE_HNP_SRP         = 0,\n  GHWCFG2_OPMODE_SRP             = 1,\n  GHWCFG2_OPMODE_NON_HNP_NON_SRP = 2,\n  GHWCFG2_OPMODE_SRP_DEVICE      = 3,\n  GHWCFFG2_OPMODE_NON_OTG_DEVICE = 4,\n  GHWCFG2_OPMODE_SRP_HOST        = 5,\n  GHWCFG2_OPMODE_NON_OTG_HOST    = 6,\n};\nenum {\n  GHWCFG2_ARCH_SLAVE_ONLY   = 0,\n  GHWCFG2_ARCH_EXTERNAL_DMA = 1,\n  GHWCFG2_ARCH_INTERNAL_DMA = 2,\n};\n\nenum {\n  GHWCFG2_HSPHY_NOT_SUPPORTED = 0,\n  GHWCFG2_HSPHY_UTMI          = 1, // internal PHY (mostly)\n  GHWCFG2_HSPHY_ULPI          = 2, // external PHY (mostly)\n  GHWCFG2_HSPHY_UTMI_ULPI     = 3, // both\n\n};\n\nenum {\n  GHWCFG2_FSPHY_NOT_SUPPORTED = 0,\n  GHWCFG2_FSPHY_DEDICATED     = 1, // have dedicated FS PHY\n  GHWCFG2_FSPHY_UTMI          = 2, // shared with UTMI+\n  GHWCFG2_FSPHY_ULPI          = 3, // shared with ULPI\n};\n\nenum {\n  GHWCFFG4_PHY_DATA_WIDTH_8    = 0,\n  GHWCFFG4_PHY_DATA_WIDTH_16   = 1,\n  GHWCFFG4_PHY_DATA_WIDTH_8_16 = 2, // software selectable\n};\n\nenum {\n  HPRT_SPEED_HIGH = 0,\n  HPRT_SPEED_FULL = 1,\n  HPRT_SPEED_LOW  = 2\n};\n\nenum {\n  GINTSTS_CMODE_DEVICE = 0,\n  GINTSTS_CMODE_HOST   = 1,\n};\n\nenum {\n  HCTSIZ_PID_DATA0 = 0, // 00b\n  HCTSIZ_PID_DATA2 = 1, // 01b\n  HCTSIZ_PID_DATA1 = 2, // 10b\n  HCTSIZ_PID_SETUP = 3, // 11b\n};\nenum {\n  HCTSIZ_PID_MDATA = 3,\n};\n\nenum {\n  GRXSTS_PKTSTS_GLOBAL_OUT_NAK      = 1,\n  GRXSTS_PKTSTS_RX_DATA             = 2,\n  GRXSTS_PKTSTS_RX_COMPLETE         = 3,\n  GRXSTS_PKTSTS_SETUP_DONE          = 4,\n  GRXSTS_PKTSTS_HOST_DATATOGGLE_ERR = 5,\n  GRXSTS_PKTSTS_SETUP_RX            = 6,\n  GRXSTS_PKTSTS_HOST_CHANNEL_HALTED = 7\n};\n\n// Same as TUSB_XFER_*\nenum {\n  HCCHAR_EPTYPE_CONTROL     = 0,\n  HCCHAR_EPTYPE_ISOCHRONOUS = 1,\n  HCCHAR_EPTYPE_BULK        = 2,\n  HCCHAR_EPTYPE_INTERRUPT   = 3\n};\n\nenum {\n  DCFG_SPEED_HIGH          = 0, // Highspeed with 30/60 Mhz\n  DCFG_SPEED_FULL_30_60MHZ = 1, // Fullspeed with UTMI+/ULPI 30/60 Mhz\n  DCFG_SPEED_LOW           = 2, // Lowspeed with FS PHY at 6 Mhz\n  DCFG_SPEED_FULL_48MHZ    = 3, // Fullspeed with dedicated FS PHY at 48 Mhz\n};\n\n// Same as TUSB_XFER_*\nenum {\n  DEPCTL_EPTYPE_CONTROL     = 0,\n  DEPCTL_EPTYPE_ISOCHRONOUS = 1,\n  DEPCTL_EPTYPE_BULK        = 2,\n  DEPCTL_EPTYPE_INTERRUPT   = 3\n};\n\n//--------------------------------------------------------------------\n// Common Register Bitfield\n//--------------------------------------------------------------------\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t ses_req_scs           : 1; //  0 Session request success\n    uint32_t ses_req               : 1; //  1 Session request\n    uint32_t vbval_ov_en           : 1; //  2 VBUS valid override enable\n    uint32_t vbval_ov_val          : 1; //  3 VBUS valid override value\n    uint32_t aval_ov_en            : 1; //  4 A-peripheral session valid override enable\n    uint32_t aval_ov_al            : 1; //  5 A-peripheral session valid override value\n    uint32_t bval_ov_en            : 1; //  6 B-peripheral session valid override enable\n    uint32_t bval_ov_val           : 1; //  7 B-peripheral session valid override value\n    uint32_t hng_scs               : 1; //  8 Host negotiation success\n    uint32_t hnp_rq                : 1; //  9 HNP (host negotiation protocol) request\n    uint32_t host_set_hnp_en       : 1; // 10 Host set HNP enable\n    uint32_t dev_hnp_en            : 1; // 11 Device HNP enabled\n    uint32_t embedded_host_en      : 1; // 12 Embedded host enable\n    uint32_t rsv13_14              : 2; // 13.14 Reserved\n    uint32_t dbnc_filter_bypass    : 1; // 15 Debounce filter bypass\n    uint32_t cid_status            : 1; // 16 Connector ID status\n    uint32_t dbnc_done             : 1; // 17 Debounce done\n    uint32_t ases_valid            : 1; // 18 A-session valid\n    uint32_t bses_valid            : 1; // 19 B-session valid\n    uint32_t otg_ver               : 1; // 20 OTG version 0: v1.3, 1: v2.0\n    uint32_t current_mode          : 1; // 21 Current mode of operation. Only from v3.00a\n    uint32_t mult_val_id_bc        : 5; // 22..26 Multi-valued input pin ID battery charger\n    uint32_t chirp_en              : 1; // 27 Chirp detection enable\n    uint32_t rsv28_30              : 3; // 28.30: Reserved\n    uint32_t test_mode_corr_eusb2  : 1; // 31 Test mode control for eUSB2 PHY\n  };\n} dwc2_gotgctl_t;\nTU_VERIFY_STATIC(sizeof(dwc2_gotgctl_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t rsv0_1                : 2; //  0..1  Reserved\n    uint32_t ses_end_det           : 1; //  2     Session end detected\n    uint32_t rsv3_7                : 5; //  3..7  Reserved\n    uint32_t srs_status_change     : 1; //  8     Session request success status change\n    uint32_t hns_status_change     : 1; //  9     Host negotiation success status change\n    uint32_t rsv10_16              : 7; // 10..16 Reserved\n    uint32_t hng_det               : 1; // 17     Host negotiation detected\n    uint32_t adev_timeout_change   : 1; // 18     A-device timeout change\n    uint32_t dbnc_done             : 1; // 19     Debounce done\n    uint32_t mult_val_lp_change    : 1; // 20     Multi-valued input pin change\n    uint32_t rsv21_31              :11; // 21..31 Reserved\n  };\n} dwc2_gotgint_t;\nTU_VERIFY_STATIC(sizeof(dwc2_gotgint_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t gintmask              :  1; //  0 Global interrupt mask\n    uint32_t hbst_len              :  4; //  1..4 Burst length/type\n    uint32_t dma_en                :  1; //  5 DMA enable\n    uint32_t rsv6                  :  1; //  6 Reserved\n    uint32_t nptxf_empty_lvl       :  1; //  7 Non-periodic Tx FIFO empty level\n    uint32_t ptxf_empty_lvl        :  1; //  8 Periodic Tx FIFO empty level\n    uint32_t rsv9_20               : 12; //  9.20: Reserved\n    uint32_t remote_mem_support    :  1; // 21 Remote memory support\n    uint32_t notify_all_dma_write  :  1; // 22 Notify all DMA writes\n    uint32_t ahb_single            :  1; // 23 AHB single\n    uint32_t inv_desc_endian       :  1; // 24 Inverse descriptor endian\n    uint32_t rsv25_31              :  7; // 25..31 Reserved\n  };\n} dwc2_gahbcfg_t;\nTU_VERIFY_STATIC(sizeof(dwc2_gahbcfg_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t timeout_cal             :  3; /* 0..2 Timeout calibration.\n      The USB standard timeout value for high-speed operation is 736 to 816 (inclusive) bit times. The USB standard\n      timeout value for full- speed operation is 16 to 18 (inclusive) bit times. The application must program this field\n      based on the speed of enumeration. The number of bit times added per PHY clock are as follows:\n      - High-speed: PHY clock One 30-MHz = 16 bit times, One 60-MHz = 8 bit times\n      - Full-speed: PHY clock One 30-MHz = 0.4 bit times, One 60-MHz = 0.2 bit times, One 48-MHz = 0.25 bit times */\n    uint32_t phy_if16                : 1; // 3 PHY interface. 0: 8 bits, 1: 16 bits\n    uint32_t ulpi_utmi_sel           : 1; // 4 ULPI/UTMI select. 0: UTMI+, 1: ULPI\n    uint32_t fs_intf_sel             : 1; // 5 Fullspeed serial interface select. 0: 6-pin, 1: 3-pin\n    uint32_t phy_sel                 : 1; // 6 HS/FS PHY selection. 0: HS UTMI+ or ULPI, 1: FS serial transceiver\n    uint32_t ddr_sel                 : 1; // 7 ULPI DDR select. 0: Single data rate 8-bit, 1: Double data rate 4-bit\n    uint32_t srp_capable             : 1; // 8 SRP-capable\n    uint32_t hnp_capable             : 1; // 9 HNP-capable\n    uint32_t turnaround_time         : 4; // 10..13 Turnaround time. 9: 8-bit UTMI+, 5: 16-bit UTMI+\n    uint32_t rsv14                   : 1; // 14 Reserved\n    uint32_t phy_low_power_clk_sel   : 1; /* 15 PHY low-power clock select either 480-MHz or 48-MHz (low-power) PHY mode.\n      In FS/LS modes, the PHY can usually operate on a 48-MHz clock to save power. This bit is valid only for UTMI+ PHYs.\n      - 0: 480 Mhz internal PLL: the UTMI interface operates at either 60 MHz (8 bit) or 30 MHz (16-bit)\n      - 1 48 Mhz external clock: the UTMI interface operates at 48 MHz in FS mode and at either 48 or 6 MHz in LS mode */\n    uint32_t otg_i2c_sel             : 1; // 16 OTG I2C interface select. 0: UTMI-FS, 1: I2C for OTG signals\n    uint32_t ulpi_fsls               : 1; /* 17 ULPI FS/LS select. 0: ULPI, 1: ULPI FS/LS.\n                                              valid only when the FS serial transceiver is selected on the ULPI PHY. */\n    uint32_t ulpi_auto_resume        : 1; // 18 ULPI Auto-resume\n    uint32_t ulpi_clk_sus_m          : 1; // 19 ULPI Clock SuspendM\n    uint32_t ulpi_ext_vbus_drv       : 1; // 20 ULPI External VBUS Drive\n    uint32_t ulpi_int_vbus_indicator : 1; // 21 ULPI Internal VBUS Indicator\n    uint32_t term_sel_dl_pulse       : 1; // 22 TermSel DLine pulsing\n    uint32_t indicator_complement    : 1; // 23 Indicator complement\n    uint32_t indicator_pass_through  : 1; // 24 Indicator pass through\n    uint32_t ulpi_if_protect_disable : 1; // 25 ULPI interface protect disable\n    uint32_t ic_usb_capable          : 1; // 26 IC_USB Capable\n    uint32_t ic_usb_traf_ctl         : 1; // 27 IC_USB Traffic Control\n    uint32_t tx_end_delay            : 1; // 28 TX end delay\n    uint32_t force_host_mode         : 1; // 29 Force host mode\n    uint32_t force_dev_mode          : 1; // 30 Force device mode\n    uint32_t corrupt_tx_pkt          : 1; // 31 Corrupt Tx packet. 0: normal, 1: debug\n  };\n} dwc2_gusbcfg_t;\nTU_VERIFY_STATIC(sizeof(dwc2_gusbcfg_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t core_soft_rst      : 1; // 0 Core Soft Reset\n    uint32_t piufs_soft_rst     : 1; // 1 PIU FS Dedicated Controller Soft Reset\n    uint32_t frame_counter_rst  : 1; // 2 Frame Counter Reset (host)\n    uint32_t intoken_q_flush    : 1; // 3 IN Token Queue Flush\n    uint32_t rx_fifo_flush      : 1; // 4 RX FIFO Flush\n    uint32_t tx_fifo_flush      : 1; // 5 TX FIFO Flush\n    uint32_t tx_fifo_num        : 5; // 6..10 TX FIFO Number\n    uint32_t rsv11_28           :18; // 11..28 Reserved\n    uint32_t core_soft_rst_done : 1; // 29 Core Soft Reset Done, from v4.20a\n    uint32_t dma_req            : 1; // 30 DMA Request\n    uint32_t ahb_idle           : 1; // 31 AHB Idle\n  };\n} dwc2_grstctl_t;\nTU_VERIFY_STATIC(sizeof(dwc2_grstctl_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t ep_ch_num     : 4; // 0..3 Endpoint/Channel Number\n    uint32_t byte_count    :11; // 4..14 Byte Count\n    uint32_t dpid          : 2; // 15..16 Data PID\n    uint32_t packet_status : 4; // 17..20 Packet Status\n    uint32_t frame_number  : 4; // 21..24 Frame Number\n    uint32_t rsv25_31      : 7; // 25..31 Reserved\n  };\n} dwc2_grxstsp_t;\nTU_VERIFY_STATIC(sizeof(dwc2_grxstsp_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t op_mode                : 3; // 0..2 HNP/SRP Host/Device/OTG mode\n    uint32_t arch                   : 2; // 3..4 Slave/External/Internal DMA\n    uint32_t single_point           : 1; // 5 0: support hub and split | 1: no hub, no split\n    uint32_t hs_phy_type            : 2; // 6..7 0: not supported | 1: UTMI+ | 2: ULPI | 3: UTMI+ and ULPI\n    uint32_t fs_phy_type            : 2; // 8..9 0: not supported | 1: dedicated | 2: UTMI+ | 3: ULPI\n    uint32_t num_dev_ep             : 4; // 10..13 Number of device endpoints (excluding EP0)\n    uint32_t num_host_ch            : 4; // 14..17 Number of host channel (excluding control)\n    uint32_t period_channel_support : 1; // 18 Support Periodic OUT Host Channel\n    uint32_t enable_dynamic_fifo    : 1; // 19 Dynamic FIFO Sizing Enabled\n    uint32_t mul_proc_intrpt        : 1; // 20 Multi-Processor Interrupt enabled (OTG_MULTI_PROC_INTRPT)\n    uint32_t reserved21             : 1; // 21 reserved\n    uint32_t nptx_q_depth           : 2; // 22..23 Non-periodic request queue depth: 0 = 2.  1 = 4, 2 = 8\n    uint32_t ptx_q_depth            : 2; // 24..25 Host periodic request queue depth: 0 = 2.  1 = 4, 2 = 8\n    uint32_t token_q_depth          : 5; // 26..30 Device IN token sequence learning queue depth: 0-30\n    uint32_t otg_enable_ic_usb      : 1; // 31 IC_USB mode specified for mode of operation\n  };\n} dwc2_ghwcfg2_t;\nTU_VERIFY_STATIC(sizeof(dwc2_ghwcfg2_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t xfer_size_width          : 4;  // 0..3 Transfer size counter in bits = 11 + n (max 19 bits)\n    uint32_t packet_size_width        : 3;  // 4..6 Packet size counter in bits = 4 + n (max 10 bits)\n    uint32_t otg_enable               : 1;  // 7 OTG capable\n    uint32_t i2c_enable               : 1;  // 8 I2C interface is available\n    uint32_t vendor_ctrl_itf          : 1;  // 9 Vendor control interface is available\n    uint32_t optional_feature_removed : 1;  // 10 remove User ID, GPIO, SOF toggle & counter to save gate count\n    uint32_t synch_reset              : 1;  // 11 0: async reset | 1: synch reset\n    uint32_t otg_adp_support          : 1;  // 12 ADP logic is present along with HSOTG controller\n    uint32_t otg_enable_hsic          : 1;  // 13 1: HSIC-capable with shared UTMI PHY interface | 0: non-HSIC\n    uint32_t battery_charger_support  : 1;  // s14 upport battery charger\n    uint32_t lpm_mode                 : 1;  // 15 LPM mode\n    uint32_t dfifo_depth              : 16; // DFIFO depth - EP_LOC_CNT in terms of 32-bit words\n  };\n} dwc2_ghwcfg3_t;\nTU_VERIFY_STATIC(sizeof(dwc2_ghwcfg3_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t num_dev_period_in_ep  : 4; // 0..3 Number of Device Periodic IN Endpoints\n    uint32_t partial_powerdown     : 1; // 4 Partial Power Down Enabled\n    uint32_t ahb_freq_min          : 1; // 5 1: minimum of AHB frequency is less than 60 MHz\n    uint32_t hibernation           : 1; // 6 Hibernation feature is enabled\n    uint32_t extended_hibernation  : 1; // 7 Extended Hibernation feature is enabled\n    uint32_t reserved8             : 1; // 8 Reserved\n    uint32_t enhanced_lpm_support1 : 1; // 9 Enhanced LPM Support1\n    uint32_t service_interval_flow : 1; // 10 Service Interval flow is supported\n    uint32_t ipg_isoc_support      : 1; // 11 Interpacket GAP ISO OUT worst-case is supported\n    uint32_t acg_support           : 1; // 12 Active clock gating is supported\n    uint32_t enhanced_lpm_support  : 1; // 13 Enhanced LPM Support\n    uint32_t phy_data_width        : 2; // 14..15 0: 8 bits | 1: 16 bits | 2: 8/16 software selectable\n    uint32_t ctrl_ep_num           : 4; // 16..19 Number of Device control endpoints in addition to EP0\n    uint32_t iddg_filter           : 1; // 20 IDDG Filter Enabled\n    uint32_t vbus_valid_filter     : 1; // 21 VBUS Valid Filter Enabled\n    uint32_t a_valid_filter        : 1; // 22 A Valid Filter Enabled\n    uint32_t b_valid_filter        : 1; // 23 B Valid Filter Enabled\n    uint32_t session_end_filter    : 1; // 24 Session End Filter Enabled\n    uint32_t dedicated_fifos       : 1; // 25 Dedicated tx fifo for device IN Endpoint\n    uint32_t num_dev_in_eps        : 4; // 26..29 Number of Device IN Endpoints including EP0\n    uint32_t dma_desc_enabled      : 1; // scatter/gather DMA configuration enabled\n    uint32_t dma_desc_dynamic      : 1; // Dynamic scatter/gather DMA\n  };\n} dwc2_ghwcfg4_t;\nTU_VERIFY_STATIC(sizeof(dwc2_ghwcfg4_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t fifo_available      : 16; // 0..15 Number of words available in the Tx FIFO\n    uint32_t req_queue_available :  8; // 16..23 Number of spaces available in the NPT transmit request queue for both IN and OU\n                                       // 24..31 is top entry in the request queue that is currently being processed by the MAC\n    uint32_t qtop_terminate      :  1; // 24 Last entry for selected channel\n    uint32_t qtop_type           :  2; // 25..26 Token (0) In/Out (1) ZLP, (2) Ping/cspit, (3) Channel halt command\n    uint32_t qtop_ch_num         :  4; // 27..30 Channel number\n  };\n} dwc2_hnptxsts_t;\nTU_VERIFY_STATIC(sizeof(dwc2_hnptxsts_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t fifo_available      :16; // 0..15 Number of words available in the Tx FIFO\n    uint32_t req_queue_available : 7; // 16..22 Number of spaces available in the PTX transmit request queue\n    uint32_t qtop_terminate      : 1; // 23 Last entry for selected channel\n    uint32_t qtop_last_period    : 1; // 24 Last entry for selected channel is a periodic entry\n    uint32_t qtop_type           : 2; // 25..26 Token (0) In/Out (1) ZLP, (2) Ping/cspit, (3) Channel halt command\n    uint32_t qtop_ch_num         : 4; // 27..30 Channel number\n    uint32_t qtop_odd_frame      : 1; // 31 Send in odd frame\n  };\n} dwc2_hptxsts_t;\nTU_VERIFY_STATIC(sizeof(dwc2_hptxsts_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t conn_status         : 1; // 0 Port connect status\n    uint32_t conn_detected       : 1; // 1 Port connect detected\n    uint32_t enable              : 1; // 2 Port enable status\n    uint32_t enable_change       : 1; // 3 Port enable change\n    uint32_t over_current_active : 1; // 4 Port Over-current active\n    uint32_t over_current_change : 1; // 5 Port Over-current change\n    uint32_t resume              : 1; // 6 Port resume\n    uint32_t suspend             : 1; // 7 Port suspend\n    uint32_t reset               : 1; // 8 Port reset\n    uint32_t rsv9                : 1; // 9 Reserved\n    uint32_t line_status         : 2; // 10..11 Line status\n    uint32_t power               : 1; // 12 Port power\n    uint32_t test_control        : 4; // 13..16 Port Test control\n    uint32_t speed               : 2; // 17..18 Port speed\n    uint32_t rsv19_31            :13; // 19..31 Reserved\n  };\n} dwc2_hprt_t;\nTU_VERIFY_STATIC(sizeof(dwc2_hprt_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t ep_size         : 11; // 0..10 Maximum packet size\n    uint32_t ep_num          :  4; // 11..14 Endpoint number\n    uint32_t ep_dir          :  1; // 15 Endpoint direction\n    uint32_t rsv16           :  1; // 16 Reserved\n    uint32_t low_speed_dev   :  1; // 17 Low-speed device\n    uint32_t ep_type         :  2; // 18..19 Endpoint type\n    uint32_t err_multi_count :  2; // 20..21 Error (splitEn = 1) / Multi (SplitEn = 0)  count\n    uint32_t dev_addr        :  7; // 22..28 Device address\n    uint32_t odd_frame       :  1; // 29 Odd frame\n    uint32_t disable         :  1; // 30 Channel disable\n    uint32_t enable          :  1; // 31 Channel enable\n  };\n} dwc2_channel_char_t;\nTU_VERIFY_STATIC(sizeof(dwc2_channel_char_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t hub_port    :  7; // 0..6 Hub port number\n    uint32_t hub_addr    :  7; // 7..13 Hub address\n    uint32_t xact_pos    :  2; // 14..15 Transaction position\n    uint32_t split_compl :  1; // 16 Split completion\n    uint32_t rsv17_30    : 14; // 17..30 Reserved\n    uint32_t split_en    :  1; // 31 Split enable\n  };\n} dwc2_channel_split_t;\nTU_VERIFY_STATIC(sizeof(dwc2_channel_split_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t xfer_size    : 19; // 0..18 Transfer size in bytes\n    uint32_t packet_count : 10; // 19..28 Number of packets\n    uint32_t pid          :  2; // 29..30 Packet ID\n    uint32_t do_ping      :  1; // 31 Do PING\n  };\n} dwc2_channel_tsize_t;\nTU_VERIFY_STATIC(sizeof(dwc2_channel_tsize_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t num        : 16; // 0..15 Frame number\n    uint32_t remainning : 16; // 16..31 Frame remaining\n  };\n} dwc2_hfnum_t;\nTU_VERIFY_STATIC(sizeof(dwc2_hfnum_t) == 4, \"incorrect size\");\n\n// Host Channel\ntypedef struct {\n  volatile uint32_t hcchar;       // 500 + 20*ch Host Channel Characteristics\n  volatile uint32_t hcsplt;       // 504 + 20*ch Host Channel Split Control\n  volatile uint32_t hcint;        // 508 + 20*ch Host Channel Interrupt\n  volatile uint32_t hcintmsk;     // 50C + 20*ch Host Channel Interrupt Mask\n  volatile uint32_t hctsiz;       // 510 + 20*ch Host Channel Transfer Size\n  volatile uint32_t hcdma;        // 514 + 20*ch Host Channel DMA Address\n            uint32_t reserved518; // 518 + 20*ch\n  volatile uint32_t hcdmab;       // 51C + 20*ch Host Channel DMA Address\n} dwc2_channel_t;\n\n//--------------------------------------------------------------------\n// Device Register Bitfield\n//--------------------------------------------------------------------\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t speed                    : 2; // 0..1 Speed\n    uint32_t nzsts_out_handshake      : 1; // 2 Non-zero-length status OUT handshake\n    uint32_t en_32khz_suspsend        : 1; // 3 Enable 32-kHz SUSPEND mode\n    uint32_t address                  : 7; // 4..10 Device address\n    uint32_t period_frame_interval    : 2; // 11..12 Periodic frame interval\n    uint32_t en_out_nak               : 1; // 13 Enable Device OUT NAK\n    uint32_t xcvr_delay               : 1; // 14 Transceiver delay\n    uint32_t erratic_int_mask         : 1; // 15 Erratic interrupt mask\n    uint32_t rsv16                    : 1; // 16 Reserved\n    uint32_t ipg_iso_support          : 1; // 17 Interpacket gap ISO support\n    uint32_t epin_mismatch_count      : 5; // 18..22 EP IN mismatch count\n    uint32_t dma_desc                 : 1; // 23 Enable scatter/gather DMA descriptor\n    uint32_t period_schedule_interval : 2; // 24..25 Periodic schedule interval for scatter/gather DMA\n    uint32_t resume_valid             : 6; // 26..31 Resume valid period\n  };\n} dwc2_dcfg_t;\nTU_VERIFY_STATIC(sizeof(dwc2_dcfg_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t remote_wakeup_signal   : 1; // 0 Remote wakeup signal\n    uint32_t soft_disconnet         : 1; // 1 Soft disconnect\n    uint32_t gnp_in_nak_status      : 1; // 2 Global non-periodic NAK IN status\n    uint32_t gout_nak_status        : 1; // 3 Global OUT NAK status\n    uint32_t test_control           : 3; // 4..6 Test control\n    uint32_t set_gnp_in_nak         : 1; // 7 Set global non-periodic IN NAK\n    uint32_t clear_gnp_in_nak       : 1; // 8 Clear global non-periodic IN NAK\n    uint32_t set_gout_nak           : 1; // 9 Set global OUT NAK\n    uint32_t clear_gout_nak         : 1; // 10 Clear global OUT NAK\n    uint32_t poweron_prog_done      : 1; // 11 Power-on programming done\n    uint32_t rsv12                  : 1; // 12 Reserved\n    uint32_t global_multi_count     : 2; // 13..14 Global multi-count\n    uint32_t ignore_frame_number    : 1; // 15 Ignore frame number\n    uint32_t nak_on_babble          : 1; // 16 NAK on babble\n    uint32_t en_cont_on_bna         : 1; // 17 Enable continue on BNA\n    uint32_t deep_sleep_besl_reject : 1; // 18 Deep sleep BESL reject\n    uint32_t service_interval       : 1; // 19 Service interval for ISO IN endpoint\n    uint32_t rsv20_31               :12; // 20..31 Reserved\n  };\n} dwc2_dctl_t;\nTU_VERIFY_STATIC(sizeof(dwc2_dctl_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t suspend_status : 1; // 0 Suspend status\n    uint32_t enum_speed     : 2; // 1..2 Enumerated speed\n    uint32_t erratic_err    : 1; // 3 Erratic error\n    uint32_t rsv4_7         : 4; // 4..7 Reserved\n    uint32_t frame_number   :14; // 8..21 Frame/MicroFrame number\n    uint32_t line_status    : 2; // 22..23 Line status\n    uint32_t rsv24_31       : 8; // 24..31 Reserved\n  };\n} dwc2_dsts_t;\nTU_VERIFY_STATIC(sizeof(dwc2_dsts_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t xfer_complete       : 1; // 0 Transfer complete\n    uint32_t disabled            : 1; // 1 Endpoint disabled\n    uint32_t ahb_err             : 1; // 2 AHB error\n    uint32_t timeout             : 1; // 3 Timeout\n    uint32_t in_rx_txfe          : 1; // 4 IN token received when TxFIFO is empty\n    uint32_t in_rx_ep_mismatch   : 1; // 5 IN token received with EP mismatch\n    uint32_t in_ep_nak_effective : 1; // 6 IN endpoint NAK effective\n    uint32_t txfifo_empty        : 1; // 7 TX FIFO empty\n    uint32_t txfifo_underrun     : 1; // 8 Tx FIFO under run\n    uint32_t bna                 : 1; // 9 Buffer not available\n    uint32_t rsv10               : 1; // 10 Reserved\n    uint32_t iso_packet_drop     : 1; // 11 Isochronous OUT packet drop status\n    uint32_t babble_err          : 1; // 12 Babble error\n    uint32_t nak                 : 1; // 13 NAK\n    uint32_t nyet                : 1; // 14 NYET\n    uint32_t rsv14_31            :17; // 15..31 Reserved\n  };\n} dwc2_diepint_t;\nTU_VERIFY_STATIC(sizeof(dwc2_diepint_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t mps                : 11; // 0..10 Maximum packet size, EP0 only use 2 bits\n    uint32_t next_ep            : 4;  // 11..14 Next endpoint number\n    uint32_t active             : 1;  // 15 Active\n    uint32_t dpid_iso_odd       : 1;  // 16 DATA0/DATA1 for bulk/interrupt, odd frame for isochronous\n    uint32_t nak_status         : 1;  // 17 NAK status\n    uint32_t type               : 2;  // 18..19 Endpoint type\n    uint32_t rsv20              : 1;  // 20 Reserved\n    uint32_t stall              : 1;  // 21 Stall\n    uint32_t tx_fifo_num        : 4;  // 22..25 Tx FIFO number (IN)\n    uint32_t clear_nak          : 1;  // 26 Clear NAK\n    uint32_t set_nak            : 1;  // 27 Set NAK\n    uint32_t set_data0_iso_even : 1;  // 28 Set DATA0 if bulk/interrupt, even frame for isochronous\n    uint32_t set_data1_iso_odd  : 1;  // 29 Set DATA1 if bulk/interrupt, odd frame for isochronous\n    uint32_t disable            : 1;  // 30 Disable\n    uint32_t enable             : 1;  // 31 Enable\n  };\n} dwc2_depctl_t;\nTU_VERIFY_STATIC(sizeof(dwc2_depctl_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t xfer_complete      : 1; // 0 Transfer complete\n    uint32_t disabled           : 1; // 1 Endpoint disabled\n    uint32_t ahb_err            : 1; // 2 AHB error\n    uint32_t setup_phase_done   : 1; // 3 Setup phase done\n    uint32_t out_rx_ep_disabled : 1; // 4 OUT token received when endpoint disabled\n    uint32_t status_phase_rx    : 1; // 5 Status phase received\n    uint32_t setup_b2b          : 1; // 6 Setup packet back-to-back\n    uint32_t rsv7               : 1; // 7 Reserved\n    uint32_t out_packet_err     : 1; // 8 OUT packet error\n    uint32_t bna                : 1; // 9 Buffer not available\n    uint32_t rsv10              : 1; // 10 Reserved\n    uint32_t iso_packet_drop    : 1; // 11 Isochronous OUT packet drop status\n    uint32_t babble_err         : 1; // 12 Babble error\n    uint32_t nak                : 1; // 13 NAK\n    uint32_t nyet               : 1; // 14 NYET\n    uint32_t setup_packet_rx    : 1; // 15 Setup packet received (Buffer DMA Mode only)\n    uint32_t rsv16_31           :16; // 16..31 Reserved\n  };\n} dwc2_doepint_t;\nTU_VERIFY_STATIC(sizeof(dwc2_doepint_t) == 4, \"incorrect size\");\n\ntypedef union {\n  uint32_t value;\n  struct TU_ATTR_PACKED {\n    uint32_t xfer_size    : 19; // 0..18 Transfer size in bytes\n    uint32_t packet_count : 10; // 19..28 Number of packets\n    uint32_t mc_pid       :  2; // 29..30 IN: Multi Count, OUT: PID\n  };\n} dwc2_ep_tsize_t;\nTU_VERIFY_STATIC(sizeof(dwc2_ep_tsize_t) == 4, \"incorrect size\");\n\n// Device IN/OUT Endpoint\ntypedef struct {\n  union {\n    volatile uint32_t diepctl;\n    volatile uint32_t doepctl;\n    volatile uint32_t ctl;\n  };\n  uint32_t rsv04;\n  union {\n    volatile uint32_t intr;\n    volatile uint32_t diepint;\n    volatile uint32_t doepint;\n  };\n  uint32_t rsv0c;\n  union {\n    volatile uint32_t dieptsiz;\n    volatile uint32_t doeptsiz;\n    volatile uint32_t tsiz;\n  };\n  union {\n    volatile uint32_t diepdma;\n    volatile uint32_t doepdma;\n  };\n  volatile uint32_t dtxfsts;\n  uint32_t rsv1c;\n} dwc2_dep_t;\n\nTU_VERIFY_STATIC(sizeof(dwc2_dep_t) == 0x20, \"incorrect size\");\n\n//--------------------------------------------------------------------\n// CSR Register Map\n//--------------------------------------------------------------------\ntypedef struct {\n  //------------- Core Global -------------\n  volatile uint32_t gotgctl;            // 000 OTG Control and Status\n  volatile uint32_t gotgint;            // 004 OTG Interrupt\n  volatile uint32_t gahbcfg;            // 008 AHB Configuration\n  volatile uint32_t gusbcfg;            // 00c USB Configuration\n  volatile uint32_t grstctl;            // 010 Reset\n  volatile uint32_t gintsts;            // 014 Interrupt\n  volatile uint32_t gintmsk;            // 018 Interrupt Mask\n  volatile uint32_t grxstsr;            // 01c Receive Status Debug Read\n  volatile uint32_t grxstsp;            // 020 Receive Status Read/Pop\n  volatile uint32_t grxfsiz;            // 024 Receive FIFO Size\n  union {\n    volatile uint32_t dieptxf0;         // 028 EP0 Tx FIFO Size\n    volatile uint32_t gnptxfsiz;        // 028 Non-periodic Transmit FIFO Size\n  };\n  union {\n    volatile uint32_t hnptxsts;         // 02c Non-periodic Transmit FIFO/Queue Status\n    volatile uint32_t gnptxsts;\n  };\n  volatile uint32_t gi2cctl;            // 030 I2C Address\n  volatile uint32_t gpvndctl;           // 034 PHY Vendor Control\n  union {\n    volatile uint32_t ggpio;            // 038 General Purpose IO\n    volatile uint32_t stm32_gccfg;      // 038 STM32 General Core Configuration\n  };\n  volatile uint32_t guid;               // 03C User (Application programmable) ID\n  volatile uint32_t gsnpsid;            // 040 Synopsys ID + Release version\n  volatile uint32_t ghwcfg1;            // 044 User Hardware Configuration1: endpoint dir (2 bit per ep)\n  volatile uint32_t ghwcfg2;            // 048 User Hardware Configuration2\n  volatile uint32_t ghwcfg3;            // 04C User Hardware Configuration3\n  union {\n    volatile uint32_t ghwcfg4;          // 050 User Hardware Configuration4\n    volatile dwc2_ghwcfg4_t ghwcfg4_bm;\n  };\n  volatile uint32_t glpmcfg;            // 054 Core LPM Configuration\n  volatile uint32_t gpwrdn;             // 058 Power Down\n  volatile uint32_t gdfifocfg;          // 05C DFIFO Software Configuration\n  volatile uint32_t gadpctl;            // 060 ADP Timer, Control and Status\n            uint32_t reserved64[39];    // 064..0FF\n  volatile uint32_t hptxfsiz;           // 100 Host Periodic Tx FIFO Size\n  volatile uint32_t dieptxf[15];        // 104..13C Device Periodic Transmit FIFO Size\n            uint32_t reserved140[176];  // 140..3FF\n\n  //------------ Host -------------\n  volatile uint32_t hcfg;               // 400 Host Configuration\n  volatile uint32_t hfir;               // 404 Host Frame Interval\n  volatile uint32_t hfnum;              // 408 Host Frame Number / Frame Remaining\n            uint32_t reserved40c;       // 40C\n  volatile uint32_t hptxsts;            // 410 Host Periodic TX FIFO / Queue Status\n  volatile uint32_t haint;              // 414 Host All Channels Interrupt\n  volatile uint32_t haintmsk;           // 418 Host All Channels Interrupt Mask\n  volatile uint32_t hflbaddr;           // 41C Host Frame List Base Address\n            uint32_t reserved420[8];    // 420..43F\n  volatile uint32_t hprt;               // 440 Host Port Control and Status\n            uint32_t reserved444[47];   // 444..4FF\n\n  //------------- Host Channel --------\n  dwc2_channel_t    channel[16];        // 500..6FF Host Channels 0-15\n            uint32_t reserved700[64];   // 700..7FF\n\n  //------------- Device -----------\n  volatile uint32_t dcfg;               // 800 Device Configuration\n  volatile uint32_t dctl;               // 804 Device Control\n  volatile uint32_t dsts;               // 808 Device Status (RO)\n            uint32_t reserved80c;       // 80C\n  volatile uint32_t diepmsk;            // 810 Device IN Endpoint Interrupt Mask\n  volatile uint32_t doepmsk;            // 814 Device OUT Endpoint Interrupt Mask\n  volatile uint32_t daint;              // 818 Device All Endpoints Interrupt\n  volatile uint32_t daintmsk;           // 81C Device All Endpoints Interrupt Mask\n  volatile uint32_t dtknqr1;            // 820 Device IN token sequence learning queue read1\n  volatile uint32_t dtknqr2;            // 824 Device IN token sequence learning queue read2\n  volatile uint32_t dvbusdis;           // 828 Device VBUS Discharge Time\n  volatile uint32_t dvbuspulse;         // 82C Device VBUS Pulsing Time\n  volatile uint32_t dthrctl;            // 830 Device threshold Control\n  volatile uint32_t diepempmsk;         // 834 Device IN Endpoint FIFO Empty Interrupt Mask\n\n  // Device Each Endpoint (IN/OUT) Interrupt/Mask for generating dedicated EP interrupt line require\n  // OTG_MULTI_PROC_INTRPT=1\n  volatile uint32_t deachint;           // 838 Device Each Endpoint Interrupt\n  volatile uint32_t deachmsk;           // 83C Device Each Endpoint Interrupt mask\n  volatile uint32_t diepeachmsk[16];    // 840..87C Device Each IN Endpoint mask\n  volatile uint32_t doepeachmsk[16];    // 880..8BF Device Each OUT Endpoint mask\n            uint32_t reserved8c0[16];   // 8C0..8FF\n\n  //------------- Device Endpoint -----\n  union {\n    dwc2_dep_t ep[2][16];               // 0: IN, 1 OUT\n    struct {\n      dwc2_dep_t  epin[16];             // 900..AFF  IN Endpoints\n      dwc2_dep_t epout[16];             // B00..CFF  OUT Endpoints\n    };\n  };\n  uint32_t reservedd00[64];             // D00..DFF\n\n  //------------- Power Clock ---------\n  volatile uint32_t pcgcctl;            // E00 Power and Clock Gating Characteristic Control\n  volatile uint32_t pcgcctl1;           // E04 Power and Clock Gating Characteristic Control 1\n            uint32_t reservede08[126];  // E08..FFF\n\n  //------------- FIFOs -------------\n  // Word-accessed only using first pointer since it auto shift\n  volatile uint32_t fifo[16][0x400];    // 1000..FFFF Endpoint FIFO\n} dwc2_regs_t;\n\nTU_VERIFY_STATIC(offsetof(dwc2_regs_t, hcfg   ) == 0x0400, \"incorrect size\");\nTU_VERIFY_STATIC(offsetof(dwc2_regs_t, channel) == 0x0500, \"incorrect size\");\nTU_VERIFY_STATIC(offsetof(dwc2_regs_t, dcfg   ) == 0x0800, \"incorrect size\");\nTU_VERIFY_STATIC(offsetof(dwc2_regs_t, epin   ) == 0x0900, \"incorrect size\");\nTU_VERIFY_STATIC(offsetof(dwc2_regs_t, epout  ) == 0x0B00, \"incorrect size\");\nTU_VERIFY_STATIC(offsetof(dwc2_regs_t, pcgcctl) == 0x0E00, \"incorrect size\");\nTU_VERIFY_STATIC(offsetof(dwc2_regs_t, fifo   ) == 0x1000, \"incorrect size\");\n\n//--------------------------------------------------------------------+\n// Register Bit Definitions\n//--------------------------------------------------------------------+\n\n/********************  Bit definition for GOTGCTL register  ********************/\n#define GOTGCTL_SRQSCS_Pos               (0U)\n#define GOTGCTL_SRQSCS_Msk               (0x1UL << GOTGCTL_SRQSCS_Pos)            // 0x00000001\n#define GOTGCTL_SRQSCS                   GOTGCTL_SRQSCS_Msk                       // Session request success\n#define GOTGCTL_SRQ_Pos                  (1U)\n#define GOTGCTL_SRQ_Msk                  (0x1UL << GOTGCTL_SRQ_Pos)               // 0x00000002\n#define GOTGCTL_SRQ                      GOTGCTL_SRQ_Msk                          // Session request\n#define GOTGCTL_VBVALOEN_Pos             (2U)\n#define GOTGCTL_VBVALOEN_Msk             (0x1UL << GOTGCTL_VBVALOEN_Pos)          // 0x00000004\n#define GOTGCTL_VBVALOEN                 GOTGCTL_VBVALOEN_Msk                     // VBUS valid override enable\n#define GOTGCTL_VBVALOVAL_Pos            (3U)\n#define GOTGCTL_VBVALOVAL_Msk            (0x1UL << GOTGCTL_VBVALOVAL_Pos)         // 0x00000008\n#define GOTGCTL_VBVALOVAL                GOTGCTL_VBVALOVAL_Msk                    // VBUS valid override value\n#define GOTGCTL_AVALOEN_Pos              (4U)\n#define GOTGCTL_AVALOEN_Msk              (0x1UL << GOTGCTL_AVALOEN_Pos)           // 0x00000010\n#define GOTGCTL_AVALOEN                  GOTGCTL_AVALOEN_Msk                      // A-peripheral session valid override enable\n#define GOTGCTL_AVALOVAL_Pos             (5U)\n#define GOTGCTL_AVALOVAL_Msk             (0x1UL << GOTGCTL_AVALOVAL_Pos)          // 0x00000020\n#define GOTGCTL_AVALOVAL                 GOTGCTL_AVALOVAL_Msk                     // A-peripheral session valid override value\n#define GOTGCTL_BVALOEN_Pos              (6U)\n#define GOTGCTL_BVALOEN_Msk              (0x1UL << GOTGCTL_BVALOEN_Pos)           // 0x00000040\n#define GOTGCTL_BVALOEN                  GOTGCTL_BVALOEN_Msk                      // B-peripheral session valid override enable\n#define GOTGCTL_BVALOVAL_Pos             (7U)\n#define GOTGCTL_BVALOVAL_Msk             (0x1UL << GOTGCTL_BVALOVAL_Pos)          // 0x00000080\n#define GOTGCTL_BVALOVAL                 GOTGCTL_BVALOVAL_Msk                     // B-peripheral session valid override value\n#define GOTGCTL_HNGSCS_Pos               (8U)\n#define GOTGCTL_HNGSCS_Msk               (0x1UL << GOTGCTL_HNGSCS_Pos)            // 0x00000100\n#define GOTGCTL_HNGSCS                   GOTGCTL_HNGSCS_Msk                       // Host set HNP enable\n#define GOTGCTL_HNPRQ_Pos                (9U)\n#define GOTGCTL_HNPRQ_Msk                (0x1UL << GOTGCTL_HNPRQ_Pos)             // 0x00000200\n#define GOTGCTL_HNPRQ                    GOTGCTL_HNPRQ_Msk                        // HNP request\n#define GOTGCTL_HSHNPEN_Pos              (10U)\n#define GOTGCTL_HSHNPEN_Msk              (0x1UL << GOTGCTL_HSHNPEN_Pos)           // 0x00000400\n#define GOTGCTL_HSHNPEN                  GOTGCTL_HSHNPEN_Msk                      // Host set HNP enable\n#define GOTGCTL_DHNPEN_Pos               (11U)\n#define GOTGCTL_DHNPEN_Msk               (0x1UL << GOTGCTL_DHNPEN_Pos)            // 0x00000800\n#define GOTGCTL_DHNPEN                   GOTGCTL_DHNPEN_Msk                       // Device HNP enabled\n#define GOTGCTL_EHEN_Pos                 (12U)\n#define GOTGCTL_EHEN_Msk                 (0x1UL << GOTGCTL_EHEN_Pos)              // 0x00001000\n#define GOTGCTL_EHEN                     GOTGCTL_EHEN_Msk                         // Embedded host enable\n#define GOTGCTL_CIDSTS_Pos               (16U)\n#define GOTGCTL_CIDSTS_Msk               (0x1UL << GOTGCTL_CIDSTS_Pos)            // 0x00010000\n#define GOTGCTL_CIDSTS                   GOTGCTL_CIDSTS_Msk                       // Connector ID status\n#define GOTGCTL_DBCT_Pos                 (17U)\n#define GOTGCTL_DBCT_Msk                 (0x1UL << GOTGCTL_DBCT_Pos)              // 0x00020000\n#define GOTGCTL_DBCT                     GOTGCTL_DBCT_Msk                         // Long/short debounce time\n#define GOTGCTL_ASVLD_Pos                (18U)\n#define GOTGCTL_ASVLD_Msk                (0x1UL << GOTGCTL_ASVLD_Pos)             // 0x00040000\n#define GOTGCTL_ASVLD                    GOTGCTL_ASVLD_Msk                        // A-session valid\n#define GOTGCTL_BSESVLD_Pos              (19U)\n#define GOTGCTL_BSESVLD_Msk              (0x1UL << GOTGCTL_BSESVLD_Pos)           // 0x00080000\n#define GOTGCTL_BSESVLD                  GOTGCTL_BSESVLD_Msk                      // B-session valid\n#define GOTGCTL_OTGVER_Pos               (20U)\n#define GOTGCTL_OTGVER_Msk               (0x1UL << GOTGCTL_OTGVER_Pos)            // 0x00100000\n#define GOTGCTL_OTGVER                   GOTGCTL_OTGVER_Msk                       // OTG version\n\n/********************  Bit definition for HCFG register  ********************/\n#define HCFG_FSLS_PHYCLK_SEL_Pos         (0U)\n#define HCFG_FSLS_PHYCLK_SEL_Msk         (0x3UL << HCFG_FSLS_PHYCLK_SEL_Pos)      // 0x00000003\n#define HCFG_FSLS_PHYCLK_SEL             HCFG_FSLS_PHYCLK_SEL_Msk                 // FS/LS PHY clock select\n#define HCFG_FSLS_PHYCLK_SEL_30_60MHZ    (0x0UL << HCFG_FSLS_PHYCLK_SEL_Pos)      // 0x00000000\n#define HCFG_FSLS_PHYCLK_SEL_48MHZ       (0x1UL << HCFG_FSLS_PHYCLK_SEL_Pos)      // 0x00000001\n#define HCFG_FSLS_PHYCLK_SEL_6MHZ        (0x2UL << HCFG_FSLS_PHYCLK_SEL_Pos)      // 0x00000002\n\n#define HCFG_FSLS_ONLY_Pos               (2U)\n#define HCFG_FSLS_ONLY_Msk               (0x1UL << HCFG_FSLS_ONLY_Pos)            // 0x00000004\n#define HCFG_FSLS_ONLY                   HCFG_FSLS_ONLY_Msk                       // FS- and LS-only support\n\n/********************  Bit definition for PCGCR register  ********************/\n#define PCGCR_STPPCLK_Pos                (0U)\n#define PCGCR_STPPCLK_Msk                (0x1UL << PCGCR_STPPCLK_Pos)             // 0x00000001\n#define PCGCR_STPPCLK                    PCGCR_STPPCLK_Msk                        // Stop PHY clock\n#define PCGCR_GATEHCLK_Pos               (1U)\n#define PCGCR_GATEHCLK_Msk               (0x1UL << PCGCR_GATEHCLK_Pos)            // 0x00000002\n#define PCGCR_GATEHCLK                   PCGCR_GATEHCLK_Msk                       // Gate HCLK\n#define PCGCR_PHYSUSP_Pos                (4U)\n#define PCGCR_PHYSUSP_Msk                (0x1UL << PCGCR_PHYSUSP_Pos)             // 0x00000010\n#define PCGCR_PHYSUSP                    PCGCR_PHYSUSP_Msk                        // PHY suspended\n\n/********************  Bit definition for GOTGINT register  ********************/\n#define GOTGINT_SEDET_Pos                (2U)\n#define GOTGINT_SEDET_Msk                (0x1UL << GOTGINT_SEDET_Pos)             // 0x00000004\n#define GOTGINT_SEDET                    GOTGINT_SEDET_Msk                        // Session end detected\n#define GOTGINT_SRSSCHG_Pos              (8U)\n#define GOTGINT_SRSSCHG_Msk              (0x1UL << GOTGINT_SRSSCHG_Pos)           // 0x00000100\n#define GOTGINT_SRSSCHG                  GOTGINT_SRSSCHG_Msk                      // Session request success status change\n#define GOTGINT_HNSSCHG_Pos              (9U)\n#define GOTGINT_HNSSCHG_Msk              (0x1UL << GOTGINT_HNSSCHG_Pos)           // 0x00000200\n#define GOTGINT_HNSSCHG                  GOTGINT_HNSSCHG_Msk                      // Host negotiation success status change\n#define GOTGINT_HNGDET_Pos               (17U)\n#define GOTGINT_HNGDET_Msk               (0x1UL << GOTGINT_HNGDET_Pos)            // 0x00020000\n#define GOTGINT_HNGDET                   GOTGINT_HNGDET_Msk                       // Host negotiation detected\n#define GOTGINT_ADTOCHG_Pos              (18U)\n#define GOTGINT_ADTOCHG_Msk              (0x1UL << GOTGINT_ADTOCHG_Pos)           // 0x00040000\n#define GOTGINT_ADTOCHG                  GOTGINT_ADTOCHG_Msk                      // A-device timeout change\n#define GOTGINT_DBCDNE_Pos               (19U)\n#define GOTGINT_DBCDNE_Msk               (0x1UL << GOTGINT_DBCDNE_Pos)            // 0x00080000\n#define GOTGINT_DBCDNE                   GOTGINT_DBCDNE_Msk                       // Debounce done\n#define GOTGINT_IDCHNG_Pos               (20U)\n#define GOTGINT_IDCHNG_Msk               (0x1UL << GOTGINT_IDCHNG_Pos)            // 0x00100000\n#define GOTGINT_IDCHNG                   GOTGINT_IDCHNG_Msk                       // Change in ID pin input value\n\n/********************  Bit definition for DCFG register  ********************/\n#define DCFG_DSPD_Pos                    (0U)\n#define DCFG_DSPD_Msk                    (0x3UL << DCFG_DSPD_Pos)                 // 0x00000003\n#define DCFG_DSPD_HS                     0    // Highspeed\n#define DCFG_DSPD_FS_HSPHY               1    // Fullspeed on HS PHY\n#define DCFG_DSPD_LS                     2    // Lowspeed\n#define DCFG_DSPD_FS                     3    // Fullspeed on FS PHY\n\n#define DCFG_NZLSOHSK_Pos                (2U)\n#define DCFG_NZLSOHSK_Msk                (0x1UL << DCFG_NZLSOHSK_Pos)             // 0x00000004\n#define DCFG_NZLSOHSK                    DCFG_NZLSOHSK_Msk                        // Nonzero-length status OUT handshake\n\n#define DCFG_DAD_Pos                     (4U)\n#define DCFG_DAD_Msk                     (0x7FUL << DCFG_DAD_Pos)                 // 0x000007F0\n#define DCFG_DAD                         DCFG_DAD_Msk                             // Device address\n#define DCFG_DAD_0                       (0x01UL << DCFG_DAD_Pos)                 // 0x00000010\n#define DCFG_DAD_1                       (0x02UL << DCFG_DAD_Pos)                 // 0x00000020\n#define DCFG_DAD_2                       (0x04UL << DCFG_DAD_Pos)                 // 0x00000040\n#define DCFG_DAD_3                       (0x08UL << DCFG_DAD_Pos)                 // 0x00000080\n#define DCFG_DAD_4                       (0x10UL << DCFG_DAD_Pos)                 // 0x00000100\n#define DCFG_DAD_5                       (0x20UL << DCFG_DAD_Pos)                 // 0x00000200\n#define DCFG_DAD_6                       (0x40UL << DCFG_DAD_Pos)                 // 0x00000400\n\n#define DCFG_PFIVL_Pos                   (11U)\n#define DCFG_PFIVL_Msk                   (0x3UL << DCFG_PFIVL_Pos)                // 0x00001800\n#define DCFG_PFIVL                       DCFG_PFIVL_Msk                           // Periodic (micro)frame interval\n#define DCFG_PFIVL_0                     (0x1UL << DCFG_PFIVL_Pos)                // 0x00000800\n#define DCFG_PFIVL_1                     (0x2UL << DCFG_PFIVL_Pos)                // 0x00001000\n\n#define DCFG_XCVRDLY_Pos                 (14U)\n#define DCFG_XCVRDLY_Msk                 (0x1UL << DCFG_XCVRDLY_Pos)             // 0x00004000\n#define DCFG_XCVRDLY                     DCFG_XCVRDLY_Msk                        // Enables delay between xcvr_sel and txvalid during device chirp\n\n#define DCFG_PERSCHIVL_Pos               (24U)\n#define DCFG_PERSCHIVL_Msk               (0x3UL << DCFG_PERSCHIVL_Pos)            // 0x03000000\n#define DCFG_PERSCHIVL                   DCFG_PERSCHIVL_Msk                       // Periodic scheduling interval\n#define DCFG_PERSCHIVL_0                 (0x1UL << DCFG_PERSCHIVL_Pos)            // 0x01000000\n#define DCFG_PERSCHIVL_1                 (0x2UL << DCFG_PERSCHIVL_Pos)            // 0x02000000\n\n/********************  Bit definition for DCTL register  ********************/\n#define DCTL_RWUSIG_Pos                  (0U)\n#define DCTL_RWUSIG_Msk                  (0x1UL << DCTL_RWUSIG_Pos)               // 0x00000001\n#define DCTL_RWUSIG                      DCTL_RWUSIG_Msk                          // Remote wakeup signaling\n#define DCTL_SDIS_Pos                    (1U)\n#define DCTL_SDIS_Msk                    (0x1UL << DCTL_SDIS_Pos)                 // 0x00000002\n#define DCTL_SDIS                        DCTL_SDIS_Msk                            // Soft disconnect\n#define DCTL_GINSTS_Pos                  (2U)\n#define DCTL_GINSTS_Msk                  (0x1UL << DCTL_GINSTS_Pos)               // 0x00000004\n#define DCTL_GINSTS                      DCTL_GINSTS_Msk                          // Global IN NAK status\n#define DCTL_GONSTS_Pos                  (3U)\n#define DCTL_GONSTS_Msk                  (0x1UL << DCTL_GONSTS_Pos)               // 0x00000008\n#define DCTL_GONSTS                      DCTL_GONSTS_Msk                          // Global OUT NAK status\n\n#define DCTL_TCTL_Pos                    (4U)\n#define DCTL_TCTL_Msk                    (0x7UL << DCTL_TCTL_Pos)                 // 0x00000070\n#define DCTL_TCTL                        DCTL_TCTL_Msk                            // Test control\n#define DCTL_TCTL_0                      (0x1UL << DCTL_TCTL_Pos)                 // 0x00000010\n#define DCTL_TCTL_1                      (0x2UL << DCTL_TCTL_Pos)                 // 0x00000020\n#define DCTL_TCTL_2                      (0x4UL << DCTL_TCTL_Pos)                 // 0x00000040\n#define DCTL_SGINAK_Pos                  (7U)\n#define DCTL_SGINAK_Msk                  (0x1UL << DCTL_SGINAK_Pos)               // 0x00000080\n#define DCTL_SGINAK                      DCTL_SGINAK_Msk                          // Set global IN NAK\n#define DCTL_CGINAK_Pos                  (8U)\n#define DCTL_CGINAK_Msk                  (0x1UL << DCTL_CGINAK_Pos)               // 0x00000100\n#define DCTL_CGINAK                      DCTL_CGINAK_Msk                          // Clear global IN NAK\n#define DCTL_SGONAK_Pos                  (9U)\n#define DCTL_SGONAK_Msk                  (0x1UL << DCTL_SGONAK_Pos)               // 0x00000200\n#define DCTL_SGONAK                      DCTL_SGONAK_Msk                          // Set global OUT NAK\n#define DCTL_CGONAK_Pos                  (10U)\n#define DCTL_CGONAK_Msk                  (0x1UL << DCTL_CGONAK_Pos)               // 0x00000400\n#define DCTL_CGONAK                      DCTL_CGONAK_Msk                          // Clear global OUT NAK\n#define DCTL_POPRGDNE_Pos                (11U)\n#define DCTL_POPRGDNE_Msk                (0x1UL << DCTL_POPRGDNE_Pos)             // 0x00000800\n#define DCTL_POPRGDNE                    DCTL_POPRGDNE_Msk                        // Power-on programming done\n\n/********************  Bit definition for HFIR register  ********************/\n#define HFIR_FRIVL_Pos                   (0U)\n#define HFIR_FRIVL_Msk                   (0xFFFFUL << HFIR_FRIVL_Pos)             // 0x0000FFFF\n#define HFIR_FRIVL                       HFIR_FRIVL_Msk                           // Frame interval\n#define HFIR_RELOAD_CTRL_Pos             (16U)                                    // available since v2.92a\n#define HFIR_RELOAD_CTRL_Msk             (0x1UL << HFIR_RELOAD_CTRL_Pos)\n#define HFIR_RELOAD_CTRL                  HFIR_RELOAD_CTRL_Msk\n\n/********************  Bit definition for HFNUM register  ********************/\n#define HFNUM_FRNUM_Pos                  (0U)\n#define HFNUM_FRNUM_Msk                  (0xFFFFUL << HFNUM_FRNUM_Pos)            // 0x0000FFFF\n#define HFNUM_FRNUM                      HFNUM_FRNUM_Msk                          // Frame number\n#define HFNUM_FTREM_Pos                  (16U)\n#define HFNUM_FTREM_Msk                  (0xFFFFUL << HFNUM_FTREM_Pos)            // 0xFFFF0000\n#define HFNUM_FTREM                      HFNUM_FTREM_Msk                          // Frame time remaining\n\n/********************  Bit definition for DSTS register  ********************/\n#define DSTS_SUSPSTS_Pos                 (0U)\n#define DSTS_SUSPSTS_Msk                 (0x1UL << DSTS_SUSPSTS_Pos)              // 0x00000001\n#define DSTS_SUSPSTS                     DSTS_SUSPSTS_Msk                         // Suspend status\n#define DSTS_ENUMSPD_Pos                 (1U)\n#define DSTS_ENUMSPD_Msk                 (0x3UL << DSTS_ENUMSPD_Pos)              // 0x00000006\n#define DSTS_ENUMSPD                     DSTS_ENUMSPD_Msk                         // Enumerated speed\n#define DSTS_ENUMSPD_HS                  0    // Highspeed\n#define DSTS_ENUMSPD_FS_HSPHY            1    // Fullspeed on HS PHY\n#define DSTS_ENUMSPD_LS                  2    // Lowspeed\n#define DSTS_ENUMSPD_FS                  3    // Fullspeed on FS PHY\n\n\n#define DSTS_EERR_Pos                    (3U)\n#define DSTS_EERR_Msk                    (0x1UL << DSTS_EERR_Pos)                 // 0x00000008\n#define DSTS_EERR                        DSTS_EERR_Msk                            // Erratic error\n#define DSTS_FNSOF_Pos                   (8U)\n#define DSTS_FNSOF_Msk                   (0x3FFFUL << DSTS_FNSOF_Pos)             // 0x003FFF00\n#define DSTS_FNSOF                       DSTS_FNSOF_Msk                           // Frame number of the received SOF\n\n/********************  Bit definition for GAHBCFG register  ********************/\n#define GAHBCFG_GINT_Pos                 (0U)\n#define GAHBCFG_GINT_Msk                 (0x1UL << GAHBCFG_GINT_Pos)              // 0x00000001\n#define GAHBCFG_GINT                     GAHBCFG_GINT_Msk                         // Global interrupt mask\n#define GAHBCFG_HBSTLEN_Pos              (1U)\n#define GAHBCFG_HBSTLEN_Msk              (0xFUL << GAHBCFG_HBSTLEN_Pos)           // 0x0000001E\n#define GAHBCFG_HBSTLEN                  GAHBCFG_HBSTLEN_Msk                      // Burst length/type\n#define GAHBCFG_HBSTLEN_0                (0x0UL << GAHBCFG_HBSTLEN_Pos)           // Single\n#define GAHBCFG_HBSTLEN_1                (0x1UL << GAHBCFG_HBSTLEN_Pos)           // INCR\n#define GAHBCFG_HBSTLEN_2                (0x3UL << GAHBCFG_HBSTLEN_Pos)           // INCR4\n#define GAHBCFG_HBSTLEN_3                (0x5UL << GAHBCFG_HBSTLEN_Pos)           // INCR8\n#define GAHBCFG_HBSTLEN_4                (0x7UL << GAHBCFG_HBSTLEN_Pos)           // INCR16\n#define GAHBCFG_DMAEN_Pos                (5U)\n#define GAHBCFG_DMAEN_Msk                (0x1UL << GAHBCFG_DMAEN_Pos)             // 0x00000020\n#define GAHBCFG_DMAEN                    GAHBCFG_DMAEN_Msk                        // DMA enable\n#define GAHBCFG_TX_FIFO_EPMTY_LVL_Pos    (7U)\n#define GAHBCFG_TX_FIFO_EPMTY_LVL_Msk    (0x1UL << GAHBCFG_TX_FIFO_EPMTY_LVL_Pos) // 0x00000080\n#define GAHBCFG_TX_FIFO_EPMTY_LVL        GAHBCFG_TX_FIFO_EPMTY_LVL_Msk            // TxFIFO empty level\n#define GAHBCFG_PTX_FIFO_EPMTY_LVL_Pos   (8U)\n#define GAHBCFG_PTX_FIFO_EPMTY_LVL_Msk   (0x1UL << GAHBCFG_PTX_FIFO_EPMTY_LVL_Pos) // 0x00000100\n#define GAHBCFG_PTX_FIFO_EPMTY_LVL       GAHBCFG_PTX_FIFO_EPMTY_LVL_Msk            // Periodic TxFIFO empty level\n\n/********************  Bit definition for GUSBCFG register  ********************/\n#define GUSBCFG_TOCAL_Pos                (0U)\n#define GUSBCFG_TOCAL_Msk                (0x7UL << GUSBCFG_TOCAL_Pos)             // 0x00000007\n#define GUSBCFG_TOCAL                    GUSBCFG_TOCAL_Msk                        // HS/FS timeout calibration\n#define GUSBCFG_PHYIF16_Pos              (3U)\n#define GUSBCFG_PHYIF16_Msk              (0x1UL << GUSBCFG_PHYIF16_Pos)           // 0x00000008\n#define GUSBCFG_PHYIF16                  GUSBCFG_PHYIF16_Msk                      // PHY Interface (PHYIf)\n#define GUSBCFG_ULPI_UTMI_SEL_Pos        (4U)\n#define GUSBCFG_ULPI_UTMI_SEL_Msk        (0x1UL << GUSBCFG_ULPI_UTMI_SEL_Pos)     // 0x00000010\n#define GUSBCFG_ULPI_UTMI_SEL            GUSBCFG_ULPI_UTMI_SEL_Msk                // ULPI or UTMI+ Select (ULPI_UTMI_Sel)\n#define GUSBCFG_PHYSEL_Pos               (6U)\n#define GUSBCFG_PHYSEL_Msk               (0x1UL << GUSBCFG_PHYSEL_Pos)            // 0x00000040\n#define GUSBCFG_PHYSEL                   GUSBCFG_PHYSEL_Msk                       // USB 2.0 high-speed ULPI PHY or USB 1.1 full-speed serial transceiver select\n#define GUSBCFG_DDRSEL                   TU_BIT(7)                                // Single Data Rate (SDR) or Double Data Rate (DDR) or ULPI interface.\n#define GUSBCFG_SRPCAP_Pos               (8U)\n#define GUSBCFG_SRPCAP_Msk               (0x1UL << GUSBCFG_SRPCAP_Pos)            // 0x00000100\n#define GUSBCFG_SRPCAP                   GUSBCFG_SRPCAP_Msk                       // SRP-capable\n#define GUSBCFG_HNPCAP_Pos               (9U)\n#define GUSBCFG_HNPCAP_Msk               (0x1UL << GUSBCFG_HNPCAP_Pos)            // 0x00000200\n#define GUSBCFG_HNPCAP                   GUSBCFG_HNPCAP_Msk                       // HNP-capable\n#define GUSBCFG_TRDT_Pos                 (10U)\n#define GUSBCFG_TRDT_Msk                 (0xFUL << GUSBCFG_TRDT_Pos)              // 0x00003C00\n#define GUSBCFG_TRDT                     GUSBCFG_TRDT_Msk                         // USB turnaround time\n#define GUSBCFG_PHYLPCS_Pos              (15U)\n#define GUSBCFG_PHYLPCS_Msk              (0x1UL << GUSBCFG_PHYLPCS_Pos)           // 0x00008000\n#define GUSBCFG_PHYLPCS                  GUSBCFG_PHYLPCS_Msk                      // PHY Low-power clock select\n#define GUSBCFG_ULPIFSLS_Pos             (17U)\n#define GUSBCFG_ULPIFSLS_Msk             (0x1UL << GUSBCFG_ULPIFSLS_Pos)          // 0x00020000\n#define GUSBCFG_ULPIFSLS                 GUSBCFG_ULPIFSLS_Msk                     // ULPI FS/LS select\n#define GUSBCFG_ULPIAR_Pos               (18U)\n#define GUSBCFG_ULPIAR_Msk               (0x1UL << GUSBCFG_ULPIAR_Pos)            // 0x00040000\n#define GUSBCFG_ULPIAR                   GUSBCFG_ULPIAR_Msk                       // ULPI Auto-resume\n#define GUSBCFG_ULPICSM_Pos              (19U)\n#define GUSBCFG_ULPICSM_Msk              (0x1UL << GUSBCFG_ULPICSM_Pos)           // 0x00080000\n#define GUSBCFG_ULPICSM                  GUSBCFG_ULPICSM_Msk                      // ULPI Clock SuspendM\n#define GUSBCFG_ULPIEVBUSD_Pos           (20U)\n#define GUSBCFG_ULPIEVBUSD_Msk           (0x1UL << GUSBCFG_ULPIEVBUSD_Pos)        // 0x00100000\n#define GUSBCFG_ULPIEVBUSD               GUSBCFG_ULPIEVBUSD_Msk                   // ULPI External VBUS Drive\n#define GUSBCFG_ULPIEVBUSI_Pos           (21U)\n#define GUSBCFG_ULPIEVBUSI_Msk           (0x1UL << GUSBCFG_ULPIEVBUSI_Pos)        // 0x00200000\n#define GUSBCFG_ULPIEVBUSI               GUSBCFG_ULPIEVBUSI_Msk                   // ULPI external VBUS indicator\n#define GUSBCFG_TSDPS_Pos                (22U)\n#define GUSBCFG_TSDPS_Msk                (0x1UL << GUSBCFG_TSDPS_Pos)             // 0x00400000\n#define GUSBCFG_TSDPS                    GUSBCFG_TSDPS_Msk                        // TermSel DLine pulsing selection\n#define GUSBCFG_PCCI_Pos                 (23U)\n#define GUSBCFG_PCCI_Msk                 (0x1UL << GUSBCFG_PCCI_Pos)              // 0x00800000\n#define GUSBCFG_PCCI                     GUSBCFG_PCCI_Msk                         // Indicator complement\n#define GUSBCFG_PTCI_Pos                 (24U)\n#define GUSBCFG_PTCI_Msk                 (0x1UL << GUSBCFG_PTCI_Pos)              // 0x01000000\n#define GUSBCFG_PTCI                     GUSBCFG_PTCI_Msk                         // Indicator pass through\n#define GUSBCFG_ULPIIPD_Pos              (25U)\n#define GUSBCFG_ULPIIPD_Msk              (0x1UL << GUSBCFG_ULPIIPD_Pos)           // 0x02000000\n#define GUSBCFG_ULPIIPD                  GUSBCFG_ULPIIPD_Msk                      // ULPI interface protect disable\n#define GUSBCFG_FHMOD_Pos                (29U)\n#define GUSBCFG_FHMOD_Msk                (0x1UL << GUSBCFG_FHMOD_Pos)             // 0x20000000\n#define GUSBCFG_FHMOD                    GUSBCFG_FHMOD_Msk                        // Forced host mode\n#define GUSBCFG_FDMOD_Pos                (30U)\n#define GUSBCFG_FDMOD_Msk                (0x1UL << GUSBCFG_FDMOD_Pos)             // 0x40000000\n#define GUSBCFG_FDMOD                    GUSBCFG_FDMOD_Msk                        // Forced peripheral mode\n#define GUSBCFG_CTXPKT_Pos               (31U)\n#define GUSBCFG_CTXPKT_Msk               (0x1UL << GUSBCFG_CTXPKT_Pos)            // 0x80000000\n#define GUSBCFG_CTXPKT                   GUSBCFG_CTXPKT_Msk                       // Corrupt Tx packet\n\n/********************  Bit definition for GRSTCTL register  ********************/\n#define GRSTCTL_CSRST_Pos                (0U)\n#define GRSTCTL_CSRST_Msk                (0x1UL << GRSTCTL_CSRST_Pos)             // 0x00000001\n#define GRSTCTL_CSRST                    GRSTCTL_CSRST_Msk                        // Core soft reset\n#define GRSTCTL_HSRST_Pos                (1U)\n#define GRSTCTL_HSRST_Msk                (0x1UL << GRSTCTL_HSRST_Pos)             // 0x00000002\n#define GRSTCTL_HSRST                    GRSTCTL_HSRST_Msk                        // HCLK soft reset\n#define GRSTCTL_FCRST_Pos                (2U)\n#define GRSTCTL_FCRST_Msk                (0x1UL << GRSTCTL_FCRST_Pos)             // 0x00000004\n#define GRSTCTL_FCRST                    GRSTCTL_FCRST_Msk                        // Host frame counter reset\n#define GRSTCTL_RXFFLSH_Pos              (4U)\n#define GRSTCTL_RXFFLSH_Msk              (0x1UL << GRSTCTL_RXFFLSH_Pos)           // 0x00000010\n#define GRSTCTL_RXFFLSH                  GRSTCTL_RXFFLSH_Msk                      // RxFIFO flush\n#define GRSTCTL_TXFFLSH_Pos              (5U)\n#define GRSTCTL_TXFFLSH_Msk              (0x1UL << GRSTCTL_TXFFLSH_Pos)           // 0x00000020\n#define GRSTCTL_TXFFLSH                  GRSTCTL_TXFFLSH_Msk                      // TxFIFO flush\n#define GRSTCTL_TXFNUM_Pos               (6U)\n#define GRSTCTL_TXFNUM_Msk               (0x1FUL << GRSTCTL_TXFNUM_Pos)           // 0x000007C0\n#define GRSTCTL_TXFNUM                   GRSTCTL_TXFNUM_Msk                       // TxFIFO number\n#define GRSTCTL_TXFNUM_0                 (0x01UL << GRSTCTL_TXFNUM_Pos)           // 0x00000040\n#define GRSTCTL_TXFNUM_1                 (0x02UL << GRSTCTL_TXFNUM_Pos)           // 0x00000080\n#define GRSTCTL_TXFNUM_2                 (0x04UL << GRSTCTL_TXFNUM_Pos)           // 0x00000100\n#define GRSTCTL_TXFNUM_3                 (0x08UL << GRSTCTL_TXFNUM_Pos)           // 0x00000200\n#define GRSTCTL_TXFNUM_4                 (0x10UL << GRSTCTL_TXFNUM_Pos)           // 0x00000400\n#define GRSTCTL_CSRST_DONE_Pos           (29)\n#define GRSTCTL_CSRST_DONE               (1u << GRSTCTL_CSRST_DONE_Pos)         // Reset Done, only available from v4.20a\n#define GRSTCTL_DMAREQ_Pos               (30U)\n#define GRSTCTL_DMAREQ_Msk               (0x1UL << GRSTCTL_DMAREQ_Pos)            // 0x40000000\n#define GRSTCTL_DMAREQ                   GRSTCTL_DMAREQ_Msk                       // DMA request signal\n#define GRSTCTL_AHBIDL_Pos               (31U)\n#define GRSTCTL_AHBIDL_Msk               (0x1UL << GRSTCTL_AHBIDL_Pos)            // 0x80000000\n#define GRSTCTL_AHBIDL                   GRSTCTL_AHBIDL_Msk                       // AHB master idle\n\n/********************  Bit definition for DIEPMSK register  ********************/\n#define DIEPMSK_XFRCM_Pos                (0U)\n#define DIEPMSK_XFRCM_Msk                (0x1UL << DIEPMSK_XFRCM_Pos)             // 0x00000001\n#define DIEPMSK_XFRCM                    DIEPMSK_XFRCM_Msk                        // Transfer completed interrupt mask\n#define DIEPMSK_EPDM_Pos                 (1U)\n#define DIEPMSK_EPDM_Msk                 (0x1UL << DIEPMSK_EPDM_Pos)              // 0x00000002\n#define DIEPMSK_EPDM                     DIEPMSK_EPDM_Msk                         // Endpoint disabled interrupt mask\n#define DIEPMSK_TOM_Pos                  (3U)\n#define DIEPMSK_TOM_Msk                  (0x1UL << DIEPMSK_TOM_Pos)               // 0x00000008\n#define DIEPMSK_TOM                      DIEPMSK_TOM_Msk                          // Timeout condition mask (nonisochronous endpoints)\n#define DIEPMSK_ITTXFEMSK_Pos            (4U)\n#define DIEPMSK_ITTXFEMSK_Msk            (0x1UL << DIEPMSK_ITTXFEMSK_Pos)         // 0x00000010\n#define DIEPMSK_ITTXFEMSK                DIEPMSK_ITTXFEMSK_Msk                    // IN token received when TxFIFO empty mask\n#define DIEPMSK_INEPNMM_Pos              (5U)\n#define DIEPMSK_INEPNMM_Msk              (0x1UL << DIEPMSK_INEPNMM_Pos)           // 0x00000020\n#define DIEPMSK_INEPNMM                  DIEPMSK_INEPNMM_Msk                      // IN token received with EP mismatch mask\n#define DIEPMSK_INEPNEM_Pos              (6U)\n#define DIEPMSK_INEPNEM_Msk              (0x1UL << DIEPMSK_INEPNEM_Pos)           // 0x00000040\n#define DIEPMSK_INEPNEM                  DIEPMSK_INEPNEM_Msk                      // IN endpoint NAK effective mask\n#define DIEPMSK_TXFURM_Pos               (8U)\n#define DIEPMSK_TXFURM_Msk               (0x1UL << DIEPMSK_TXFURM_Pos)            // 0x00000100\n#define DIEPMSK_TXFURM                   DIEPMSK_TXFURM_Msk                       // FIFO underrun mask\n#define DIEPMSK_BIM_Pos                  (9U)\n#define DIEPMSK_BIM_Msk                  (0x1UL << DIEPMSK_BIM_Pos)               // 0x00000200\n#define DIEPMSK_BIM                      DIEPMSK_BIM_Msk                          // BNA interrupt mask\n\n/********************  Bit definition for HPTXSTS register  ********************/\n#define HPTXSTS_PTXFSAVL_Pos             (0U)\n#define HPTXSTS_PTXFSAVL_Msk             (0xFFFFUL << HPTXSTS_PTXFSAVL_Pos)       // 0x0000FFFF\n#define HPTXSTS_PTXFSAVL                 HPTXSTS_PTXFSAVL_Msk                     // Periodic transmit data FIFO space available\n#define HPTXSTS_PTXQSAV_Pos              (16U)\n#define HPTXSTS_PTXQSAV_Msk              (0xFFUL << HPTXSTS_PTXQSAV_Pos)          // 0x00FF0000\n#define HPTXSTS_PTXQSAV                  HPTXSTS_PTXQSAV_Msk                      // Periodic transmit request queue space available\n#define HPTXSTS_PTXQSAV_0                (0x01UL << HPTXSTS_PTXQSAV_Pos)          // 0x00010000\n#define HPTXSTS_PTXQSAV_1                (0x02UL << HPTXSTS_PTXQSAV_Pos)          // 0x00020000\n#define HPTXSTS_PTXQSAV_2                (0x04UL << HPTXSTS_PTXQSAV_Pos)          // 0x00040000\n#define HPTXSTS_PTXQSAV_3                (0x08UL << HPTXSTS_PTXQSAV_Pos)          // 0x00080000\n#define HPTXSTS_PTXQSAV_4                (0x10UL << HPTXSTS_PTXQSAV_Pos)          // 0x00100000\n#define HPTXSTS_PTXQSAV_5                (0x20UL << HPTXSTS_PTXQSAV_Pos)          // 0x00200000\n#define HPTXSTS_PTXQSAV_6                (0x40UL << HPTXSTS_PTXQSAV_Pos)          // 0x00400000\n#define HPTXSTS_PTXQSAV_7                (0x80UL << HPTXSTS_PTXQSAV_Pos)          // 0x00800000\n\n#define HPTXSTS_PTXQTOP_Pos              (24U)\n#define HPTXSTS_PTXQTOP_Msk              (0xFFUL << HPTXSTS_PTXQTOP_Pos)          // 0xFF000000\n#define HPTXSTS_PTXQTOP                  HPTXSTS_PTXQTOP_Msk                      // Top of the periodic transmit request queue\n#define HPTXSTS_PTXQTOP_0                (0x01UL << HPTXSTS_PTXQTOP_Pos)          // 0x01000000\n#define HPTXSTS_PTXQTOP_1                (0x02UL << HPTXSTS_PTXQTOP_Pos)          // 0x02000000\n#define HPTXSTS_PTXQTOP_2                (0x04UL << HPTXSTS_PTXQTOP_Pos)          // 0x04000000\n#define HPTXSTS_PTXQTOP_3                (0x08UL << HPTXSTS_PTXQTOP_Pos)          // 0x08000000\n#define HPTXSTS_PTXQTOP_4                (0x10UL << HPTXSTS_PTXQTOP_Pos)          // 0x10000000\n#define HPTXSTS_PTXQTOP_5                (0x20UL << HPTXSTS_PTXQTOP_Pos)          // 0x20000000\n#define HPTXSTS_PTXQTOP_6                (0x40UL << HPTXSTS_PTXQTOP_Pos)          // 0x40000000\n#define HPTXSTS_PTXQTOP_7                (0x80UL << HPTXSTS_PTXQTOP_Pos)          // 0x80000000\n\n/********************  Bit definition for HAINT register  ********************/\n#define HAINT_HAINT_Pos                  (0U)\n#define HAINT_HAINT_Msk                  (0xFFFFUL << HAINT_HAINT_Pos)            // 0x0000FFFF\n#define HAINT_HAINT                      HAINT_HAINT_Msk                          // Channel interrupts\n\n/********************  Bit definition for DOEPMSK register  ********************/\n#define DOEPMSK_XFRCM_Pos                (0U)\n#define DOEPMSK_XFRCM_Msk                (0x1UL << DOEPMSK_XFRCM_Pos)             // 0x00000001\n#define DOEPMSK_XFRCM                    DOEPMSK_XFRCM_Msk                        // Transfer completed interrupt mask\n#define DOEPMSK_EPDM_Pos                 (1U)\n#define DOEPMSK_EPDM_Msk                 (0x1UL << DOEPMSK_EPDM_Pos)              // 0x00000002\n#define DOEPMSK_EPDM                     DOEPMSK_EPDM_Msk                         // Endpoint disabled interrupt mask\n#define DOEPMSK_AHBERRM_Pos              (2U)\n#define DOEPMSK_AHBERRM_Msk              (0x1UL << DOEPMSK_AHBERRM_Pos)           // 0x00000004\n#define DOEPMSK_AHBERRM                  DOEPMSK_AHBERRM_Msk                      // OUT transaction AHB Error interrupt mask\n#define DOEPMSK_STUPM_Pos                (3U)\n#define DOEPMSK_STUPM_Msk                (0x1UL << DOEPMSK_STUPM_Pos)             // 0x00000008\n#define DOEPMSK_STUPM                    DOEPMSK_STUPM_Msk                        // SETUP phase done mask\n#define DOEPMSK_OTEPDM_Pos               (4U)\n#define DOEPMSK_OTEPDM_Msk               (0x1UL << DOEPMSK_OTEPDM_Pos)            // 0x00000010\n#define DOEPMSK_OTEPDM                   DOEPMSK_OTEPDM_Msk                       // OUT token received when endpoint disabled mask\n#define DOEPMSK_OTEPSPRM_Pos             (5U)\n#define DOEPMSK_OTEPSPRM_Msk             (0x1UL << DOEPMSK_OTEPSPRM_Pos)          // 0x00000020\n#define DOEPMSK_OTEPSPRM                 DOEPMSK_OTEPSPRM_Msk                     // Status Phase Received mask\n#define DOEPMSK_B2BSTUP_Pos              (6U)\n#define DOEPMSK_B2BSTUP_Msk              (0x1UL << DOEPMSK_B2BSTUP_Pos)           // 0x00000040\n#define DOEPMSK_B2BSTUP                  DOEPMSK_B2BSTUP_Msk                      // Back-to-back SETUP packets received mask\n#define DOEPMSK_OPEM_Pos                 (8U)\n#define DOEPMSK_OPEM_Msk                 (0x1UL << DOEPMSK_OPEM_Pos)              // 0x00000100\n#define DOEPMSK_OPEM                     DOEPMSK_OPEM_Msk                         // OUT packet error mask\n#define DOEPMSK_BOIM_Pos                 (9U)\n#define DOEPMSK_BOIM_Msk                 (0x1UL << DOEPMSK_BOIM_Pos)              // 0x00000200\n#define DOEPMSK_BOIM                     DOEPMSK_BOIM_Msk                         // BNA interrupt mask\n#define DOEPMSK_BERRM_Pos                (12U)\n#define DOEPMSK_BERRM_Msk                (0x1UL << DOEPMSK_BERRM_Pos)             // 0x00001000\n#define DOEPMSK_BERRM                    DOEPMSK_BERRM_Msk                        // Babble error interrupt mask\n#define DOEPMSK_NAKM_Pos                 (13U)\n#define DOEPMSK_NAKM_Msk                 (0x1UL << DOEPMSK_NAKM_Pos)              // 0x00002000\n#define DOEPMSK_NAKM                     DOEPMSK_NAKM_Msk                         // OUT Packet NAK interrupt mask\n#define DOEPMSK_NYETM_Pos                (14U)\n#define DOEPMSK_NYETM_Msk                (0x1UL << DOEPMSK_NYETM_Pos)             // 0x00004000\n#define DOEPMSK_NYETM                    DOEPMSK_NYETM_Msk                        // NYET interrupt mask\n\n/********************  Bit definition for GINTSTS register  ********************/\n#define GINTSTS_CMOD_Pos                 (0U)\n#define GINTSTS_CMOD_Msk                 (0x1UL << GINTSTS_CMOD_Pos)              // 0x00000001\n#define GINTSTS_CMOD                     GINTSTS_CMOD_Msk                         // Current mode of operation\n#define GINTSTS_MMIS_Pos                 (1U)\n#define GINTSTS_MMIS_Msk                 (0x1UL << GINTSTS_MMIS_Pos)              // 0x00000002\n#define GINTSTS_MMIS                     GINTSTS_MMIS_Msk                         // Mode mismatch interrupt\n#define GINTSTS_OTGINT_Pos               (2U)\n#define GINTSTS_OTGINT_Msk               (0x1UL << GINTSTS_OTGINT_Pos)            // 0x00000004\n#define GINTSTS_OTGINT                   GINTSTS_OTGINT_Msk                       // OTG interrupt\n#define GINTSTS_SOF_Pos                  (3U)\n#define GINTSTS_SOF_Msk                  (0x1UL << GINTSTS_SOF_Pos)               // 0x00000008\n#define GINTSTS_SOF                      GINTSTS_SOF_Msk                          // Start of frame\n#define GINTSTS_RXFLVL_Pos               (4U)\n#define GINTSTS_RXFLVL_Msk               (0x1UL << GINTSTS_RXFLVL_Pos)            // 0x00000010\n#define GINTSTS_RXFLVL                   GINTSTS_RXFLVL_Msk                       // RxFIFO nonempty\n#define GINTSTS_NPTX_FIFO_EMPTY_Pos      (5U)\n#define GINTSTS_NPTX_FIFO_EMPTY_Msk      (0x1UL << GINTSTS_NPTX_FIFO_EMPTY_Pos)   // 0x00000020\n#define GINTSTS_NPTX_FIFO_EMPTY          GINTSTS_NPTX_FIFO_EMPTY_Msk              // Nonperiodic TxFIFO empty\n#define GINTSTS_GINAKEFF_Pos             (6U)\n#define GINTSTS_GINAKEFF_Msk             (0x1UL << GINTSTS_GINAKEFF_Pos)          // 0x00000040\n#define GINTSTS_GINAKEFF                 GINTSTS_GINAKEFF_Msk                     // Global IN nonperiodic NAK effective\n#define GINTSTS_BOUTNAKEFF_Pos           (7U)\n#define GINTSTS_BOUTNAKEFF_Msk           (0x1UL << GINTSTS_BOUTNAKEFF_Pos)        // 0x00000080\n#define GINTSTS_BOUTNAKEFF               GINTSTS_BOUTNAKEFF_Msk                   // Global OUT NAK effective\n#define GINTSTS_ESUSP_Pos                (10U)\n#define GINTSTS_ESUSP_Msk                (0x1UL << GINTSTS_ESUSP_Pos)             // 0x00000400\n#define GINTSTS_ESUSP                    GINTSTS_ESUSP_Msk                        // Early suspend\n#define GINTSTS_USBSUSP_Pos              (11U)\n#define GINTSTS_USBSUSP_Msk              (0x1UL << GINTSTS_USBSUSP_Pos)           // 0x00000800\n#define GINTSTS_USBSUSP                  GINTSTS_USBSUSP_Msk                      // USB suspend\n#define GINTSTS_USBRST_Pos               (12U)\n#define GINTSTS_USBRST_Msk               (0x1UL << GINTSTS_USBRST_Pos)            // 0x00001000\n#define GINTSTS_USBRST                   GINTSTS_USBRST_Msk                       // USB reset\n#define GINTSTS_ENUMDNE_Pos              (13U)\n#define GINTSTS_ENUMDNE_Msk              (0x1UL << GINTSTS_ENUMDNE_Pos)           // 0x00002000\n#define GINTSTS_ENUMDNE                  GINTSTS_ENUMDNE_Msk                      // Enumeration done\n#define GINTSTS_ISOODRP_Pos              (14U)\n#define GINTSTS_ISOODRP_Msk              (0x1UL << GINTSTS_ISOODRP_Pos)           // 0x00004000\n#define GINTSTS_ISOODRP                  GINTSTS_ISOODRP_Msk                      // Isochronous OUT packet dropped interrupt\n#define GINTSTS_EOPF_Pos                 (15U)\n#define GINTSTS_EOPF_Msk                 (0x1UL << GINTSTS_EOPF_Pos)              // 0x00008000\n#define GINTSTS_EOPF                     GINTSTS_EOPF_Msk                         // End of periodic frame interrupt\n#define GINTSTS_IEPINT_Pos               (18U)\n#define GINTSTS_IEPINT_Msk               (0x1UL << GINTSTS_IEPINT_Pos)            // 0x00040000\n#define GINTSTS_IEPINT                   GINTSTS_IEPINT_Msk                       // IN endpoint interrupt\n#define GINTSTS_OEPINT_Pos               (19U)\n#define GINTSTS_OEPINT_Msk               (0x1UL << GINTSTS_OEPINT_Pos)            // 0x00080000\n#define GINTSTS_OEPINT                   GINTSTS_OEPINT_Msk                       // OUT endpoint interrupt\n#define GINTSTS_IISOIXFR_Pos             (20U)\n#define GINTSTS_IISOIXFR_Msk             (0x1UL << GINTSTS_IISOIXFR_Pos)          // 0x00100000\n#define GINTSTS_IISOIXFR                 GINTSTS_IISOIXFR_Msk                     // Incomplete isochronous IN transfer\n#define GINTSTS_PXFR_INCOMPISOOUT_Pos    (21U)\n#define GINTSTS_PXFR_INCOMPISOOUT_Msk    (0x1UL << GINTSTS_PXFR_INCOMPISOOUT_Pos) // 0x00200000\n#define GINTSTS_PXFR_INCOMPISOOUT        GINTSTS_PXFR_INCOMPISOOUT_Msk            // Incomplete periodic transfer\n#define GINTSTS_DATAFSUSP_Pos            (22U)\n#define GINTSTS_DATAFSUSP_Msk            (0x1UL << GINTSTS_DATAFSUSP_Pos)         // 0x00400000\n#define GINTSTS_DATAFSUSP                GINTSTS_DATAFSUSP_Msk                    // Data fetch suspended\n#define GINTSTS_RSTDET_Pos               (23U)\n#define GINTSTS_RSTDET_Msk               (0x1UL << GINTSTS_RSTDET_Pos)            // 0x00800000\n#define GINTSTS_RSTDET                   GINTSTS_RSTDET_Msk                       // Reset detected interrupt\n#define GINTSTS_HPRTINT_Pos              (24U)\n#define GINTSTS_HPRTINT_Msk              (0x1UL << GINTSTS_HPRTINT_Pos)           // 0x01000000\n#define GINTSTS_HPRTINT                  GINTSTS_HPRTINT_Msk                      // Host port interrupt\n#define GINTSTS_HCINT_Pos                (25U)\n#define GINTSTS_HCINT_Msk                (0x1UL << GINTSTS_HCINT_Pos)             // 0x02000000\n#define GINTSTS_HCINT                    GINTSTS_HCINT_Msk                        // Host channels interrupt\n#define GINTSTS_PTX_FIFO_EMPTY_Pos       (26U)\n#define GINTSTS_PTX_FIFO_EMPTY_Msk       (0x1UL << GINTSTS_PTX_FIFO_EMPTY_Pos)    // 0x04000000\n#define GINTSTS_PTX_FIFO_EMPTY           GINTSTS_PTX_FIFO_EMPTY_Msk               // Periodic TxFIFO empty\n#define GINTSTS_LPMINT_Pos               (27U)\n#define GINTSTS_LPMINT_Msk               (0x1UL << GINTSTS_LPMINT_Pos)            // 0x08000000\n#define GINTSTS_LPMINT                   GINTSTS_LPMINT_Msk                       // LPM interrupt\n#define GINTSTS_CONIDSTSCHNG_Pos         (28U)\n#define GINTSTS_CONIDSTSCHNG_Msk         (0x1UL << GINTSTS_CONIDSTSCHNG_Pos)      // 0x10000000\n#define GINTSTS_CONIDSTSCHNG             GINTSTS_CONIDSTSCHNG_Msk                 // Connector ID status change\n#define GINTSTS_DISCINT_Pos              (29U)\n#define GINTSTS_DISCINT_Msk              (0x1UL << GINTSTS_DISCINT_Pos)           // 0x20000000\n#define GINTSTS_DISCINT                  GINTSTS_DISCINT_Msk                      // Disconnect detected interrupt\n#define GINTSTS_SRQINT_Pos               (30U)\n#define GINTSTS_SRQINT_Msk               (0x1UL << GINTSTS_SRQINT_Pos)            // 0x40000000\n#define GINTSTS_SRQINT                   GINTSTS_SRQINT_Msk                       // Session request/new session detected interrupt\n#define GINTSTS_WKUINT_Pos               (31U)\n#define GINTSTS_WKUINT_Msk               (0x1UL << GINTSTS_WKUINT_Pos)            // 0x80000000\n#define GINTSTS_WKUINT                   GINTSTS_WKUINT_Msk                       // Resume/remote wakeup detected interrupt\n\n/********************  Bit definition for GINTMSK register  ********************/\n#define GINTMSK_MMISM_Pos                (1U)\n#define GINTMSK_MMISM_Msk                (0x1UL << GINTMSK_MMISM_Pos)             // 0x00000002\n#define GINTMSK_MMISM                    GINTMSK_MMISM_Msk                        // Mode mismatch interrupt mask\n#define GINTMSK_OTGINT_Pos               (2U)\n#define GINTMSK_OTGINT_Msk               (0x1UL << GINTMSK_OTGINT_Pos)            // 0x00000004\n#define GINTMSK_OTGINT                   GINTMSK_OTGINT_Msk                       // OTG interrupt mask\n#define GINTMSK_SOFM_Pos                 (3U)\n#define GINTMSK_SOFM_Msk                 (0x1UL << GINTMSK_SOFM_Pos)              // 0x00000008\n#define GINTMSK_SOFM                     GINTMSK_SOFM_Msk                         // Start of frame mask\n#define GINTMSK_RXFLVLM_Pos              (4U)\n#define GINTMSK_RXFLVLM_Msk              (0x1UL << GINTMSK_RXFLVLM_Pos)           // 0x00000010\n#define GINTMSK_RXFLVLM                  GINTMSK_RXFLVLM_Msk                      // Receive FIFO nonempty mask\n#define GINTMSK_NPTXFEM_Pos              (5U)\n#define GINTMSK_NPTXFEM_Msk              (0x1UL << GINTMSK_NPTXFEM_Pos)           // 0x00000020\n#define GINTMSK_NPTXFEM                  GINTMSK_NPTXFEM_Msk                      // Nonperiodic TxFIFO empty mask\n#define GINTMSK_GINAKEFFM_Pos            (6U)\n#define GINTMSK_GINAKEFFM_Msk            (0x1UL << GINTMSK_GINAKEFFM_Pos)         // 0x00000040\n#define GINTMSK_GINAKEFFM                GINTMSK_GINAKEFFM_Msk                    // Global nonperiodic IN NAK effective mask\n#define GINTMSK_GONAKEFFM_Pos            (7U)\n#define GINTMSK_GONAKEFFM_Msk            (0x1UL << GINTMSK_GONAKEFFM_Pos)         // 0x00000080\n#define GINTMSK_GONAKEFFM                GINTMSK_GONAKEFFM_Msk                    // Global OUT NAK effective mask\n#define GINTMSK_ESUSPM_Pos               (10U)\n#define GINTMSK_ESUSPM_Msk               (0x1UL << GINTMSK_ESUSPM_Pos)            // 0x00000400\n#define GINTMSK_ESUSPM                   GINTMSK_ESUSPM_Msk                       // Early suspend mask\n#define GINTMSK_USBSUSPM_Pos             (11U)\n#define GINTMSK_USBSUSPM_Msk             (0x1UL << GINTMSK_USBSUSPM_Pos)          // 0x00000800\n#define GINTMSK_USBSUSPM                 GINTMSK_USBSUSPM_Msk                     // USB suspend mask\n#define GINTMSK_USBRST_Pos               (12U)\n#define GINTMSK_USBRST_Msk               (0x1UL << GINTMSK_USBRST_Pos)            // 0x00001000\n#define GINTMSK_USBRST                   GINTMSK_USBRST_Msk                       // USB reset mask\n#define GINTMSK_ENUMDNEM_Pos             (13U)\n#define GINTMSK_ENUMDNEM_Msk             (0x1UL << GINTMSK_ENUMDNEM_Pos)          // 0x00002000\n#define GINTMSK_ENUMDNEM                 GINTMSK_ENUMDNEM_Msk                     // Enumeration done mask\n#define GINTMSK_ISOODRPM_Pos             (14U)\n#define GINTMSK_ISOODRPM_Msk             (0x1UL << GINTMSK_ISOODRPM_Pos)          // 0x00004000\n#define GINTMSK_ISOODRPM                 GINTMSK_ISOODRPM_Msk                     // Isochronous OUT packet dropped interrupt mask\n#define GINTMSK_EOPFM_Pos                (15U)\n#define GINTMSK_EOPFM_Msk                (0x1UL << GINTMSK_EOPFM_Pos)             // 0x00008000\n#define GINTMSK_EOPFM                    GINTMSK_EOPFM_Msk                        // End of periodic frame interrupt mask\n#define GINTMSK_EPMISM_Pos               (17U)\n#define GINTMSK_EPMISM_Msk               (0x1UL << GINTMSK_EPMISM_Pos)            // 0x00020000\n#define GINTMSK_EPMISM                   GINTMSK_EPMISM_Msk                       // Endpoint mismatch interrupt mask\n#define GINTMSK_IEPINT_Pos               (18U)\n#define GINTMSK_IEPINT_Msk               (0x1UL << GINTMSK_IEPINT_Pos)            // 0x00040000\n#define GINTMSK_IEPINT                   GINTMSK_IEPINT_Msk                       // IN endpoints interrupt mask\n#define GINTMSK_OEPINT_Pos               (19U)\n#define GINTMSK_OEPINT_Msk               (0x1UL << GINTMSK_OEPINT_Pos)            // 0x00080000\n#define GINTMSK_OEPINT                   GINTMSK_OEPINT_Msk                       // OUT endpoints interrupt mask\n#define GINTMSK_IISOIXFRM_Pos            (20U)\n#define GINTMSK_IISOIXFRM_Msk            (0x1UL << GINTMSK_IISOIXFRM_Pos)         // 0x00100000\n#define GINTMSK_IISOIXFRM                GINTMSK_IISOIXFRM_Msk                    // Incomplete isochronous IN transfer mask\n#define GINTMSK_PXFRM_IISOOXFRM_Pos      (21U)\n#define GINTMSK_PXFRM_IISOOXFRM_Msk      (0x1UL << GINTMSK_PXFRM_IISOOXFRM_Pos)   // 0x00200000\n#define GINTMSK_PXFRM_IISOOXFRM          GINTMSK_PXFRM_IISOOXFRM_Msk              // Incomplete periodic transfer mask\n#define GINTMSK_FSUSPM_Pos               (22U)\n#define GINTMSK_FSUSPM_Msk               (0x1UL << GINTMSK_FSUSPM_Pos)            // 0x00400000\n#define GINTMSK_FSUSPM                   GINTMSK_FSUSPM_Msk                       // Data fetch suspended mask\n#define GINTMSK_RSTDEM_Pos               (23U)\n#define GINTMSK_RSTDEM_Msk               (0x1UL << GINTMSK_RSTDEM_Pos)            // 0x00800000\n#define GINTMSK_RSTDEM                   GINTMSK_RSTDEM_Msk                       // Reset detected interrupt mask\n#define GINTMSK_PRTIM_Pos                (24U)\n#define GINTMSK_PRTIM_Msk                (0x1UL << GINTMSK_PRTIM_Pos)             // 0x01000000\n#define GINTMSK_PRTIM                    GINTMSK_PRTIM_Msk                        // Host port interrupt mask\n#define GINTMSK_HCIM_Pos                 (25U)\n#define GINTMSK_HCIM_Msk                 (0x1UL << GINTMSK_HCIM_Pos)              // 0x02000000\n#define GINTMSK_HCIM                     GINTMSK_HCIM_Msk                         // Host channels interrupt mask\n#define GINTMSK_PTXFEM_Pos               (26U)\n#define GINTMSK_PTXFEM_Msk               (0x1UL << GINTMSK_PTXFEM_Pos)            // 0x04000000\n#define GINTMSK_PTXFEM                   GINTMSK_PTXFEM_Msk                       // Periodic TxFIFO empty mask\n#define GINTMSK_LPMINTM_Pos              (27U)\n#define GINTMSK_LPMINTM_Msk              (0x1UL << GINTMSK_LPMINTM_Pos)           // 0x08000000\n#define GINTMSK_LPMINTM                  GINTMSK_LPMINTM_Msk                      // LPM interrupt Mask\n#define GINTMSK_CONIDSTSCHNGM_Pos        (28U)\n#define GINTMSK_CONIDSTSCHNGM_Msk        (0x1UL << GINTMSK_CONIDSTSCHNGM_Pos)     // 0x10000000\n#define GINTMSK_CONIDSTSCHNGM            GINTMSK_CONIDSTSCHNGM_Msk                // Connector ID status change mask\n#define GINTMSK_DISCINT_Pos              (29U)\n#define GINTMSK_DISCINT_Msk              (0x1UL << GINTMSK_DISCINT_Pos)           // 0x20000000\n#define GINTMSK_DISCINT                  GINTMSK_DISCINT_Msk                      // Disconnect detected interrupt mask\n#define GINTMSK_SRQIM_Pos                (30U)\n#define GINTMSK_SRQIM_Msk                (0x1UL << GINTMSK_SRQIM_Pos)             // 0x40000000\n#define GINTMSK_SRQIM                    GINTMSK_SRQIM_Msk                        // Session request/new session detected interrupt mask\n#define GINTMSK_WUIM_Pos                 (31U)\n#define GINTMSK_WUIM_Msk                 (0x1UL << GINTMSK_WUIM_Pos)              // 0x80000000\n#define GINTMSK_WUIM                     GINTMSK_WUIM_Msk                         // Resume/remote wakeup detected interrupt mask\n\n/********************  Bit definition for DAINT register  ********************/\n#define DAINT_IEPINT_Pos                 (0U)\n#define DAINT_IEPINT_Msk                 (0xFFFFUL << DAINT_IEPINT_Pos)           // 0x0000FFFF\n#define DAINT_IEPINT                     DAINT_IEPINT_Msk                         // IN endpoint interrupt bits\n#define DAINT_OEPINT_Pos                 (16U)\n#define DAINT_OEPINT_Msk                 (0xFFFFUL << DAINT_OEPINT_Pos)           // 0xFFFF0000\n#define DAINT_OEPINT                     DAINT_OEPINT_Msk                         // OUT endpoint interrupt bits\n\n/********************  Bit definition for HAINTMSK register  ********************/\n#define HAINTMSK_HAINTM_Pos              (0U)\n#define HAINTMSK_HAINTM_Msk              (0xFFFFUL << HAINTMSK_HAINTM_Pos)        // 0x0000FFFF\n#define HAINTMSK_HAINTM                  HAINTMSK_HAINTM_Msk                      // Channel interrupt mask\n\n/********************  Bit definition for GRXSTSP register  ********************/\n#define GRXSTSP_EPNUM_Pos                (0U)\n#define GRXSTSP_EPNUM_Msk                (0xFUL << GRXSTSP_EPNUM_Pos)             // 0x0000000F\n#define GRXSTSP_EPNUM                    GRXSTSP_EPNUM_Msk                        // IN EP interrupt mask bits\n#define GRXSTSP_BCNT_Pos                 (4U)\n#define GRXSTSP_BCNT_Msk                 (0x7FFUL << GRXSTSP_BCNT_Pos)            // 0x00007FF0\n#define GRXSTSP_BCNT                     GRXSTSP_BCNT_Msk                         // OUT EP interrupt mask bits\n#define GRXSTSP_DPID_Pos                 (15U)\n#define GRXSTSP_DPID_Msk                 (0x3UL << GRXSTSP_DPID_Pos)              // 0x00018000\n#define GRXSTSP_DPID                     GRXSTSP_DPID_Msk                         // OUT EP interrupt mask bits\n#define GRXSTSP_PKTSTS_Pos               (17U)\n#define GRXSTSP_PKTSTS_Msk               (0xFUL << GRXSTSP_PKTSTS_Pos)            // 0x001E0000\n#define GRXSTSP_PKTSTS                   GRXSTSP_PKTSTS_Msk                       // OUT EP interrupt mask bits\n\n/********************  Bit definition for DAINTMSK register  ********************/\n#define DAINTMSK_IEPM_Pos                (0U)\n#define DAINTMSK_IEPM_Msk                (0xFFFFUL << DAINTMSK_IEPM_Pos)          // 0x0000FFFF\n#define DAINTMSK_IEPM                    DAINTMSK_IEPM_Msk                        // IN EP interrupt mask bits\n#define DAINTMSK_OEPM_Pos                (16U)\n#define DAINTMSK_OEPM_Msk                (0xFFFFUL << DAINTMSK_OEPM_Pos)          // 0xFFFF0000\n#define DAINTMSK_OEPM                    DAINTMSK_OEPM_Msk                        // OUT EP interrupt mask bits\n\n#define DAINT_SHIFT(_dir)                (((_dir) == TUSB_DIR_IN) ? 0 : 16)\n\n#if 0\n/********************  Bit definition for OTG register  ********************/\n#define CHNUM_Pos                        (0U)\n#define CHNUM_Msk                        (0xFUL << CHNUM_Pos)                     // 0x0000000F\n#define CHNUM                            CHNUM_Msk                                // Channel number\n#define CHNUM_0                          (0x1UL << CHNUM_Pos)                     // 0x00000001\n#define CHNUM_1                          (0x2UL << CHNUM_Pos)                     // 0x00000002\n#define CHNUM_2                          (0x4UL << CHNUM_Pos)                     // 0x00000004\n#define CHNUM_3                          (0x8UL << CHNUM_Pos)                     // 0x00000008\n#define BCNT_Pos                         (4U)\n#define BCNT_Msk                         (0x7FFUL << BCNT_Pos)                    // 0x00007FF0\n#define BCNT                             BCNT_Msk                                 // Byte count\n\n#define DPID_Pos                         (15U)\n#define DPID_Msk                         (0x3UL << DPID_Pos)                      // 0x00018000\n#define DPID                             DPID_Msk                                 // Data PID\n#define DPID_0                           (0x1UL << DPID_Pos)                      // 0x00008000\n#define DPID_1                           (0x2UL << DPID_Pos)                      // 0x00010000\n\n#define PKTSTS_Pos                       (17U)\n#define PKTSTS_Msk                       (0xFUL << PKTSTS_Pos)                    // 0x001E0000\n#define PKTSTS                           PKTSTS_Msk                               // Packet status\n#define PKTSTS_0                         (0x1UL << PKTSTS_Pos)                    // 0x00020000\n#define PKTSTS_1                         (0x2UL << PKTSTS_Pos)                    // 0x00040000\n#define PKTSTS_2                         (0x4UL << PKTSTS_Pos)                    // 0x00080000\n#define PKTSTS_3                         (0x8UL << PKTSTS_Pos)                    // 0x00100000\n\n#define EPNUM_Pos                        (0U)\n#define EPNUM_Msk                        (0xFUL << EPNUM_Pos)                     // 0x0000000F\n#define EPNUM                            EPNUM_Msk                                // Endpoint number\n#define EPNUM_0                          (0x1UL << EPNUM_Pos)                     // 0x00000001\n#define EPNUM_1                          (0x2UL << EPNUM_Pos)                     // 0x00000002\n#define EPNUM_2                          (0x4UL << EPNUM_Pos)                     // 0x00000004\n#define EPNUM_3                          (0x8UL << EPNUM_Pos)                     // 0x00000008\n\n#define FRMNUM_Pos                       (21U)\n#define FRMNUM_Msk                       (0xFUL << FRMNUM_Pos)                    // 0x01E00000\n#define FRMNUM                           FRMNUM_Msk                               // Frame number\n#define FRMNUM_0                         (0x1UL << FRMNUM_Pos)                    // 0x00200000\n#define FRMNUM_1                         (0x2UL << FRMNUM_Pos)                    // 0x00400000\n#define FRMNUM_2                         (0x4UL << FRMNUM_Pos)                    // 0x00800000\n#define FRMNUM_3                         (0x8UL << FRMNUM_Pos)                    // 0x01000000\n#endif\n\n/********************  Bit definition for GRXFSIZ register  ********************/\n#define GRXFSIZ_RXFD_Pos                 (0U)\n#define GRXFSIZ_RXFD_Msk                 (0xFFFFUL << GRXFSIZ_RXFD_Pos)           // 0x0000FFFF\n#define GRXFSIZ_RXFD                     GRXFSIZ_RXFD_Msk                         // RxFIFO depth\n\n/********************  Bit definition for DVBUSDIS register  ********************/\n#define DVBUSDIS_VBUSDT_Pos              (0U)\n#define DVBUSDIS_VBUSDT_Msk              (0xFFFFUL << DVBUSDIS_VBUSDT_Pos)        // 0x0000FFFF\n#define DVBUSDIS_VBUSDT                  DVBUSDIS_VBUSDT_Msk                      // Device VBUS discharge time\n\n/********************  Bit definition for OTG register  ********************/\n#define GNPTXFSIZ_NPTXFSA_Pos            (0U)\n#define GNPTXFSIZ_NPTXFSA_Msk            (0xFFFFUL << GNPTXFSIZ_NPTXFSA_Pos)                // 0x0000FFFF\n#define GNPTXFSIZ_NPTXFSA                GNPTXFSIZ_NPTXFSA_Msk                    // Nonperiodic transmit RAM start address\n#define GNPTXFSIZ_NPTXFD_Pos             (16U)\n#define GNPTXFSIZ_NPTXFD_Msk             (0xFFFFUL << GNPTXFSIZ_NPTXFD_Pos)                 // 0xFFFF0000\n#define GNPTXFSIZ_NPTXFD                 GNPTXFSIZ_NPTXFD_Msk                     // Nonperiodic TxFIFO depth\n#define DIEPTXF0_TX0FSA_Pos              (0U)\n#define DIEPTXF0_TX0FSA_Msk              (0xFFFFUL << DIEPTXF0_TX0FSA_Pos)                 // 0x0000FFFF\n#define DIEPTXF0_TX0FSA                  DIEPTXF0_TX0FSA_Msk                      // Endpoint 0 transmit RAM start address\n#define DIEPTXF0_TX0FD_Pos               (16U)\n#define DIEPTXF0_TX0FD_Msk               (0xFFFFUL << DIEPTXF0_TX0FD_Pos)                  // 0xFFFF0000\n#define DIEPTXF0_TX0FD                   DIEPTXF0_TX0FD_Msk                       // Endpoint 0 TxFIFO depth\n\n/********************  Bit definition for DVBUSPULSE register  ********************/\n#define DVBUSPULSE_DVBUSP_Pos            (0U)\n#define DVBUSPULSE_DVBUSP_Msk            (0xFFFUL << DVBUSPULSE_DVBUSP_Pos)       // 0x00000FFF\n#define DVBUSPULSE_DVBUSP                DVBUSPULSE_DVBUSP_Msk                    // Device VBUS pulsing time\n\n/********************  Bit definition for GNPTXSTS register  ********************/\n#define GNPTXSTS_NPTXFSAV_Pos            (0U)\n#define GNPTXSTS_NPTXFSAV_Msk            (0xFFFFUL << GNPTXSTS_NPTXFSAV_Pos)      // 0x0000FFFF\n#define GNPTXSTS_NPTXFSAV                GNPTXSTS_NPTXFSAV_Msk                    // Nonperiodic TxFIFO space available\n\n#define GNPTXSTS_NPTQXSAV_Pos            (16U)\n#define GNPTXSTS_NPTQXSAV_Msk            (0xFFUL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00FF0000\n#define GNPTXSTS_NPTQXSAV                GNPTXSTS_NPTQXSAV_Msk                    // Nonperiodic transmit request queue space available\n#define GNPTXSTS_NPTQXSAV_0              (0x01UL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00010000\n#define GNPTXSTS_NPTQXSAV_1              (0x02UL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00020000\n#define GNPTXSTS_NPTQXSAV_2              (0x04UL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00040000\n#define GNPTXSTS_NPTQXSAV_3              (0x08UL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00080000\n#define GNPTXSTS_NPTQXSAV_4              (0x10UL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00100000\n#define GNPTXSTS_NPTQXSAV_5              (0x20UL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00200000\n#define GNPTXSTS_NPTQXSAV_6              (0x40UL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00400000\n#define GNPTXSTS_NPTQXSAV_7              (0x80UL << GNPTXSTS_NPTQXSAV_Pos)        // 0x00800000\n\n#define GNPTXSTS_NPTXQTOP_Pos            (24U)\n#define GNPTXSTS_NPTXQTOP_Msk            (0x7FUL << GNPTXSTS_NPTXQTOP_Pos)        // 0x7F000000\n#define GNPTXSTS_NPTXQTOP                GNPTXSTS_NPTXQTOP_Msk                    // Top of the nonperiodic transmit request queue\n#define GNPTXSTS_NPTXQTOP_0              (0x01UL << GNPTXSTS_NPTXQTOP_Pos)        // 0x01000000\n#define GNPTXSTS_NPTXQTOP_1              (0x02UL << GNPTXSTS_NPTXQTOP_Pos)        // 0x02000000\n#define GNPTXSTS_NPTXQTOP_2              (0x04UL << GNPTXSTS_NPTXQTOP_Pos)        // 0x04000000\n#define GNPTXSTS_NPTXQTOP_3              (0x08UL << GNPTXSTS_NPTXQTOP_Pos)        // 0x08000000\n#define GNPTXSTS_NPTXQTOP_4              (0x10UL << GNPTXSTS_NPTXQTOP_Pos)        // 0x10000000\n#define GNPTXSTS_NPTXQTOP_5              (0x20UL << GNPTXSTS_NPTXQTOP_Pos)        // 0x20000000\n#define GNPTXSTS_NPTXQTOP_6              (0x40UL << GNPTXSTS_NPTXQTOP_Pos)        // 0x40000000\n\n/********************  Bit definition for DTHRCTL register  ********************/\n#define DTHRCTL_NONISOTHREN_Pos          (0U)\n#define DTHRCTL_NONISOTHREN_Msk          (0x1UL << DTHRCTL_NONISOTHREN_Pos)       // 0x00000001\n#define DTHRCTL_NONISOTHREN              DTHRCTL_NONISOTHREN_Msk                  // Nonisochronous IN endpoints threshold enable\n#define DTHRCTL_ISOTHREN_Pos             (1U)\n#define DTHRCTL_ISOTHREN_Msk             (0x1UL << DTHRCTL_ISOTHREN_Pos)          // 0x00000002\n#define DTHRCTL_ISOTHREN                 DTHRCTL_ISOTHREN_Msk                     // ISO IN endpoint threshold enable\n\n#define DTHRCTL_TXTHRLEN_Pos             (2U)\n#define DTHRCTL_TXTHRLEN_Msk             (0x1FFUL << DTHRCTL_TXTHRLEN_Pos)        // 0x000007FC\n#define DTHRCTL_TXTHRLEN                 DTHRCTL_TXTHRLEN_Msk                     // Transmit threshold length\n#define DTHRCTL_TXTHRLEN_0               (0x001UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000004\n#define DTHRCTL_TXTHRLEN_1               (0x002UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000008\n#define DTHRCTL_TXTHRLEN_2               (0x004UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000010\n#define DTHRCTL_TXTHRLEN_3               (0x008UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000020\n#define DTHRCTL_TXTHRLEN_4               (0x010UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000040\n#define DTHRCTL_TXTHRLEN_5               (0x020UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000080\n#define DTHRCTL_TXTHRLEN_6               (0x040UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000100\n#define DTHRCTL_TXTHRLEN_7               (0x080UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000200\n#define DTHRCTL_TXTHRLEN_8               (0x100UL << DTHRCTL_TXTHRLEN_Pos)        // 0x00000400\n#define DTHRCTL_RXTHREN_Pos              (16U)\n#define DTHRCTL_RXTHREN_Msk              (0x1UL << DTHRCTL_RXTHREN_Pos)           // 0x00010000\n#define DTHRCTL_RXTHREN                  DTHRCTL_RXTHREN_Msk                      // Receive threshold enable\n\n#define DTHRCTL_RXTHRLEN_Pos             (17U)\n#define DTHRCTL_RXTHRLEN_Msk             (0x1FFUL << DTHRCTL_RXTHRLEN_Pos)        // 0x03FE0000\n#define DTHRCTL_RXTHRLEN                 DTHRCTL_RXTHRLEN_Msk                     // Receive threshold length\n#define DTHRCTL_RXTHRLEN_0               (0x001UL << DTHRCTL_RXTHRLEN_Pos)        // 0x00020000\n#define DTHRCTL_RXTHRLEN_1               (0x002UL << DTHRCTL_RXTHRLEN_Pos)        // 0x00040000\n#define DTHRCTL_RXTHRLEN_2               (0x004UL << DTHRCTL_RXTHRLEN_Pos)        // 0x00080000\n#define DTHRCTL_RXTHRLEN_3               (0x008UL << DTHRCTL_RXTHRLEN_Pos)        // 0x00100000\n#define DTHRCTL_RXTHRLEN_4               (0x010UL << DTHRCTL_RXTHRLEN_Pos)        // 0x00200000\n#define DTHRCTL_RXTHRLEN_5               (0x020UL << DTHRCTL_RXTHRLEN_Pos)        // 0x00400000\n#define DTHRCTL_RXTHRLEN_6               (0x040UL << DTHRCTL_RXTHRLEN_Pos)        // 0x00800000\n#define DTHRCTL_RXTHRLEN_7               (0x080UL << DTHRCTL_RXTHRLEN_Pos)        // 0x01000000\n#define DTHRCTL_RXTHRLEN_8               (0x100UL << DTHRCTL_RXTHRLEN_Pos)        // 0x02000000\n#define DTHRCTL_ARPEN_Pos                (27U)\n#define DTHRCTL_ARPEN_Msk                (0x1UL << DTHRCTL_ARPEN_Pos)             // 0x08000000\n#define DTHRCTL_ARPEN                    DTHRCTL_ARPEN_Msk                        // Arbiter parking enable\n\n/********************  Bit definition for DIEPEMPMSK register  ********************/\n#define DIEPEMPMSK_INEPTXFEM_Pos         (0U)\n#define DIEPEMPMSK_INEPTXFEM_Msk         (0xFFFFUL << DIEPEMPMSK_INEPTXFEM_Pos)   // 0x0000FFFF\n#define DIEPEMPMSK_INEPTXFEM             DIEPEMPMSK_INEPTXFEM_Msk                 // IN EP Tx FIFO empty interrupt mask bits\n\n/********************  Bit definition for DEACHINT register  ********************/\n#define DEACHINT_IEP1INT_Pos             (1U)\n#define DEACHINT_IEP1INT_Msk             (0x1UL << DEACHINT_IEP1INT_Pos)          // 0x00000002\n#define DEACHINT_IEP1INT                 DEACHINT_IEP1INT_Msk                     // IN endpoint 1interrupt bit\n#define DEACHINT_OEP1INT_Pos             (17U)\n#define DEACHINT_OEP1INT_Msk             (0x1UL << DEACHINT_OEP1INT_Pos)          // 0x00020000\n#define DEACHINT_OEP1INT                 DEACHINT_OEP1INT_Msk                     // OUT endpoint 1 interrupt bit\n\n/********************  Bit definition for GCCFG register  ********************/\n#define STM32_GCCFG_DCDET_Pos            (0U)\n#define STM32_GCCFG_DCDET_Msk            (0x1UL << STM32_GCCFG_DCDET_Pos)         // 0x00000001\n#define STM32_GCCFG_DCDET                STM32_GCCFG_DCDET_Msk                    // Data contact detection (DCD) status\n\n#define STM32_GCCFG_PDET_Pos             (1U)\n#define STM32_GCCFG_PDET_Msk             (0x1UL << STM32_GCCFG_PDET_Pos)          // 0x00000002\n#define STM32_GCCFG_PDET                 STM32_GCCFG_PDET_Msk                     // Primary detection (PD) status\n\n#define STM32_GCCFG_SDET_Pos             (2U)\n#define STM32_GCCFG_SDET_Msk             (0x1UL << STM32_GCCFG_SDET_Pos)          // 0x00000004\n#define STM32_GCCFG_SDET                 STM32_GCCFG_SDET_Msk                     // Secondary detection (SD) status\n\n#define STM32_GCCFG_PS2DET_Pos           (3U)\n#define STM32_GCCFG_PS2DET_Msk           (0x1UL << STM32_GCCFG_PS2DET_Pos)        // 0x00000008\n#define STM32_GCCFG_PS2DET               STM32_GCCFG_PS2DET_Msk                   // DM pull-up detection status\n\n#define STM32_GCCFG_PWRDWN_Pos           (16U)\n#define STM32_GCCFG_PWRDWN_Msk           (0x1UL << STM32_GCCFG_PWRDWN_Pos)        // 0x00010000\n#define STM32_GCCFG_PWRDWN               STM32_GCCFG_PWRDWN_Msk                   // Power down\n\n#define STM32_GCCFG_BCDEN_Pos            (17U)\n#define STM32_GCCFG_BCDEN_Msk            (0x1UL << STM32_GCCFG_BCDEN_Pos)         // 0x00020000\n#define STM32_GCCFG_BCDEN                STM32_GCCFG_BCDEN_Msk                    // Battery charging detector (BCD) enable\n\n#define STM32_GCCFG_DCDEN_Pos            (18U)\n#define STM32_GCCFG_DCDEN_Msk            (0x1UL << STM32_GCCFG_DCDEN_Pos)         // 0x00040000\n#define STM32_GCCFG_DCDEN                STM32_GCCFG_DCDEN_Msk                    // Data contact detection (DCD) mode enable*/\n\n#define STM32_GCCFG_PDEN_Pos             (19U)\n#define STM32_GCCFG_PDEN_Msk             (0x1UL << STM32_GCCFG_PDEN_Pos)          // 0x00080000\n#define STM32_GCCFG_PDEN                 STM32_GCCFG_PDEN_Msk                     // Primary detection (PD) mode enable*/\n\n#define STM32_GCCFG_SDEN_Pos             (20U)\n#define STM32_GCCFG_SDEN_Msk             (0x1UL << STM32_GCCFG_SDEN_Pos)          // 0x00100000\n#define STM32_GCCFG_SDEN                 STM32_GCCFG_SDEN_Msk                     // Secondary detection (SD) mode enable\n\n#define STM32_GCCFG_VBDEN_Pos            (21U)\n#define STM32_GCCFG_VBDEN_Msk            (0x1UL << STM32_GCCFG_VBDEN_Pos)         // 0x00200000\n#define STM32_GCCFG_VBDEN                STM32_GCCFG_VBDEN_Msk                    // VBUS mode enable\n\n#define STM32_GCCFG_OTGIDEN_Pos          (22U)\n#define STM32_GCCFG_OTGIDEN_Msk          (0x1UL << STM32_GCCFG_OTGIDEN_Pos)       // 0x00400000\n#define STM32_GCCFG_OTGIDEN              STM32_GCCFG_OTGIDEN_Msk                  // OTG Id enable\n\n#define STM32_GCCFG_PHYHSEN_Pos          (23U)\n#define STM32_GCCFG_PHYHSEN_Msk          (0x1UL << STM32_GCCFG_PHYHSEN_Pos)       // 0x00800000\n#define STM32_GCCFG_PHYHSEN              STM32_GCCFG_PHYHSEN_Msk                  // HS PHY enable\n\n// GUID < 0x2000: VBUSASEN, VBUSBSEN, NOVBUSSENS bits\n#define STM32_GCCFG_VBUSASEN_Pos         (18U)\n#define STM32_GCCFG_VBUSASEN_Msk         (0x1UL << STM32_GCCFG_VBUSASEN_Pos)      // 0x00040000\n#define STM32_GCCFG_VBUSASEN             STM32_GCCFG_VBUSASEN_Msk                 // Enable A-device (host) VBUS sensing\n\n#define STM32_GCCFG_VBUSBSEN_Pos         (19U)\n#define STM32_GCCFG_VBUSBSEN_Msk         (0x1UL << STM32_GCCFG_VBUSBSEN_Pos)      // 0x00080000\n#define STM32_GCCFG_VBUSBSEN             STM32_GCCFG_VBUSBSEN_Msk                 // Enable B-device (peripheral) VBUS sensing\n\n#define STM32_GCCFG_NOVBUSSENS_Pos       (21U)\n#define STM32_GCCFG_NOVBUSSENS_Msk       (0x1UL << STM32_GCCFG_NOVBUSSENS_Pos)     // 0x00200000\n#define STM32_GCCFG_NOVBUSSENS           STM32_GCCFG_NOVBUSSENS_Msk                // VBUS sensing disable option\n// GUID < 0x2000: end\n\n// TODO: stm32u5a5 SDEN is 22nd bit, conflict with 20th bit above\n// #define STM32_GCCFG_SDEN_Pos             (22U)\n// #define STM32_GCCFG_SDEN_Msk             (0x1U << STM32_GCCFG_SDEN_Pos)             // 0x00400000\n// #define STM32_GCCFG_SDEN                 STM32_GCCFG_SDEN_Msk                       // Secondary detection (PD) mode enable\n\n// GUID >= 0x5000 use femtoPHY: VBVALOVA, VBVALEXTOEN, PULLDOWNEN\n#define STM32_GCCFG_VBVALOVAL_Pos        (23U)\n#define STM32_GCCFG_VBVALOVAL_Msk        (0x1U << STM32_GCCFG_VBVALOVAL_Pos)        // 0x00800000\n#define STM32_GCCFG_VBVALOVAL            STM32_GCCFG_VBVALOVAL_Msk                  // Value of VBUSVLDEXT0 femtoPHY input\n\n#define STM32_GCCFG_VBVALEXTOEN_Pos      (24U)\n#define STM32_GCCFG_VBVALEXTOEN_Msk      (0x1U << STM32_GCCFG_VBVALEXTOEN_Pos)      // 0x01000000\n#define STM32_GCCFG_VBVALEXTOEN          STM32_GCCFG_VBVALEXTOEN_Msk                // Enables of VBUSVLDEXT0 femtoPHY input override\n\n#define STM32_GCCFG_PULLDOWNEN_Pos       (25U)\n#define STM32_GCCFG_PULLDOWNEN_Msk       (0x1U << STM32_GCCFG_PULLDOWNEN_Pos)       // 0x02000000\n#define STM32_GCCFG_PULLDOWNEN           STM32_GCCFG_PULLDOWNEN_Msk                 // Enables of femtoPHY pulldown resistors, used when ID PAD is disabled\n// GUID >= 0x5000: end\n\n/********************  Bit definition for DEACHINTMSK register  ********************/\n#define DEACHINTMSK_IEP1INTM_Pos         (1U)\n#define DEACHINTMSK_IEP1INTM_Msk         (0x1UL << DEACHINTMSK_IEP1INTM_Pos)      // 0x00000002\n#define DEACHINTMSK_IEP1INTM             DEACHINTMSK_IEP1INTM_Msk                 // IN Endpoint 1 interrupt mask bit\n#define DEACHINTMSK_OEP1INTM_Pos         (17U)\n#define DEACHINTMSK_OEP1INTM_Msk         (0x1UL << DEACHINTMSK_OEP1INTM_Pos)      // 0x00020000\n#define DEACHINTMSK_OEP1INTM             DEACHINTMSK_OEP1INTM_Msk                 // OUT Endpoint 1 interrupt mask bit\n\n/********************  Bit definition for CID register  ********************/\n#define CID_PRODUCT_ID_Pos               (0U)\n#define CID_PRODUCT_ID_Msk               (0xFFFFFFFFUL << CID_PRODUCT_ID_Pos)     // 0xFFFFFFFF\n#define CID_PRODUCT_ID                   CID_PRODUCT_ID_Msk                       // Product ID field\n\n/********************  Bit definition for GLPMCFG register  ********************/\n#define GLPMCFG_LPMEN_Pos                (0U)\n#define GLPMCFG_LPMEN_Msk                (0x1UL << GLPMCFG_LPMEN_Pos)             // 0x00000001\n#define GLPMCFG_LPMEN                    GLPMCFG_LPMEN_Msk                        // LPM support enable\n#define GLPMCFG_LPMACK_Pos               (1U)\n#define GLPMCFG_LPMACK_Msk               (0x1UL << GLPMCFG_LPMACK_Pos)            // 0x00000002\n#define GLPMCFG_LPMACK                   GLPMCFG_LPMACK_Msk                       // LPM Token acknowledge enable\n#define GLPMCFG_BESL_Pos                 (2U)\n#define GLPMCFG_BESL_Msk                 (0xFUL << GLPMCFG_BESL_Pos)              // 0x0000003C\n#define GLPMCFG_BESL                     GLPMCFG_BESL_Msk                         // BESL value received with last ACKed LPM Token\n#define GLPMCFG_REMWAKE_Pos              (6U)\n#define GLPMCFG_REMWAKE_Msk              (0x1UL << GLPMCFG_REMWAKE_Pos)           // 0x00000040\n#define GLPMCFG_REMWAKE                  GLPMCFG_REMWAKE_Msk                      // bRemoteWake value received with last ACKed LPM Token\n#define GLPMCFG_L1SSEN_Pos               (7U)\n#define GLPMCFG_L1SSEN_Msk               (0x1UL << GLPMCFG_L1SSEN_Pos)            // 0x00000080\n#define GLPMCFG_L1SSEN                   GLPMCFG_L1SSEN_Msk                       // L1 shallow sleep enable\n#define GLPMCFG_BESLTHRS_Pos             (8U)\n#define GLPMCFG_BESLTHRS_Msk             (0xFUL << GLPMCFG_BESLTHRS_Pos)          // 0x00000F00\n#define GLPMCFG_BESLTHRS                 GLPMCFG_BESLTHRS_Msk                     // BESL threshold\n#define GLPMCFG_L1DSEN_Pos               (12U)\n#define GLPMCFG_L1DSEN_Msk               (0x1UL << GLPMCFG_L1DSEN_Pos)            // 0x00001000\n#define GLPMCFG_L1DSEN                   GLPMCFG_L1DSEN_Msk                       // L1 deep sleep enable\n#define GLPMCFG_LPMRSP_Pos               (13U)\n#define GLPMCFG_LPMRSP_Msk               (0x3UL << GLPMCFG_LPMRSP_Pos)            // 0x00006000\n#define GLPMCFG_LPMRSP                   GLPMCFG_LPMRSP_Msk                       // LPM response\n#define GLPMCFG_SLPSTS_Pos               (15U)\n#define GLPMCFG_SLPSTS_Msk               (0x1UL << GLPMCFG_SLPSTS_Pos)            // 0x00008000\n#define GLPMCFG_SLPSTS                   GLPMCFG_SLPSTS_Msk                       // Port sleep status\n#define GLPMCFG_L1RSMOK_Pos              (16U)\n#define GLPMCFG_L1RSMOK_Msk              (0x1UL << GLPMCFG_L1RSMOK_Pos)           // 0x00010000\n#define GLPMCFG_L1RSMOK                  GLPMCFG_L1RSMOK_Msk                      // Sleep State Resume OK\n#define GLPMCFG_LPMCHIDX_Pos             (17U)\n#define GLPMCFG_LPMCHIDX_Msk             (0xFUL << GLPMCFG_LPMCHIDX_Pos)          // 0x001E0000\n#define GLPMCFG_LPMCHIDX                 GLPMCFG_LPMCHIDX_Msk                     // LPM Channel Index\n#define GLPMCFG_LPMRCNT_Pos              (21U)\n#define GLPMCFG_LPMRCNT_Msk              (0x7UL << GLPMCFG_LPMRCNT_Pos)           // 0x00E00000\n#define GLPMCFG_LPMRCNT                  GLPMCFG_LPMRCNT_Msk                      // LPM retry count\n#define GLPMCFG_SNDLPM_Pos               (24U)\n#define GLPMCFG_SNDLPM_Msk               (0x1UL << GLPMCFG_SNDLPM_Pos)            // 0x01000000\n#define GLPMCFG_SNDLPM                   GLPMCFG_SNDLPM_Msk                       // Send LPM transaction\n#define GLPMCFG_LPMRCNTSTS_Pos           (25U)\n#define GLPMCFG_LPMRCNTSTS_Msk           (0x7UL << GLPMCFG_LPMRCNTSTS_Pos)        // 0x0E000000\n#define GLPMCFG_LPMRCNTSTS               GLPMCFG_LPMRCNTSTS_Msk                   // LPM retry count status\n#define GLPMCFG_ENBESL_Pos               (28U)\n#define GLPMCFG_ENBESL_Msk               (0x1UL << GLPMCFG_ENBESL_Pos)            // 0x10000000\n#define GLPMCFG_ENBESL                   GLPMCFG_ENBESL_Msk                       // Enable best effort service latency\n\n// GDFIFOCFG\n#define GDFIFOCFG_EPINFOBASE_MASK   (0xffff << 16)\n#define GDFIFOCFG_EPINFOBASE_SHIFT  16\n#define GDFIFOCFG_GDFIFOCFG_MASK    (0xffff << 0)\n#define GDFIFOCFG_GDFIFOCFG_SHIFT   0\n\n/********************  Bit definition for DIEPEACHMSK1 register  ********************/\n#define DIEPEACHMSK1_XFRCM_Pos           (0U)\n#define DIEPEACHMSK1_XFRCM_Msk           (0x1UL << DIEPEACHMSK1_XFRCM_Pos)        // 0x00000001\n#define DIEPEACHMSK1_XFRCM               DIEPEACHMSK1_XFRCM_Msk                   // Transfer completed interrupt mask\n#define DIEPEACHMSK1_EPDM_Pos            (1U)\n#define DIEPEACHMSK1_EPDM_Msk            (0x1UL << DIEPEACHMSK1_EPDM_Pos)         // 0x00000002\n#define DIEPEACHMSK1_EPDM                DIEPEACHMSK1_EPDM_Msk                    // Endpoint disabled interrupt mask\n#define DIEPEACHMSK1_TOM_Pos             (3U)\n#define DIEPEACHMSK1_TOM_Msk             (0x1UL << DIEPEACHMSK1_TOM_Pos)          // 0x00000008\n#define DIEPEACHMSK1_TOM                 DIEPEACHMSK1_TOM_Msk                     // Timeout condition mask (nonisochronous endpoints)\n#define DIEPEACHMSK1_ITTXFEMSK_Pos       (4U)\n#define DIEPEACHMSK1_ITTXFEMSK_Msk       (0x1UL << DIEPEACHMSK1_ITTXFEMSK_Pos)    // 0x00000010\n#define DIEPEACHMSK1_ITTXFEMSK           DIEPEACHMSK1_ITTXFEMSK_Msk               // IN token received when TxFIFO empty mask\n#define DIEPEACHMSK1_INEPNMM_Pos         (5U)\n#define DIEPEACHMSK1_INEPNMM_Msk         (0x1UL << DIEPEACHMSK1_INEPNMM_Pos)      // 0x00000020\n#define DIEPEACHMSK1_INEPNMM             DIEPEACHMSK1_INEPNMM_Msk                 // IN token received with EP mismatch mask\n#define DIEPEACHMSK1_INEPNEM_Pos         (6U)\n#define DIEPEACHMSK1_INEPNEM_Msk         (0x1UL << DIEPEACHMSK1_INEPNEM_Pos)      // 0x00000040\n#define DIEPEACHMSK1_INEPNEM             DIEPEACHMSK1_INEPNEM_Msk                 // IN endpoint NAK effective mask\n#define DIEPEACHMSK1_TXFURM_Pos          (8U)\n#define DIEPEACHMSK1_TXFURM_Msk          (0x1UL << DIEPEACHMSK1_TXFURM_Pos)       // 0x00000100\n#define DIEPEACHMSK1_TXFURM              DIEPEACHMSK1_TXFURM_Msk                  // FIFO underrun mask\n#define DIEPEACHMSK1_BIM_Pos             (9U)\n#define DIEPEACHMSK1_BIM_Msk             (0x1UL << DIEPEACHMSK1_BIM_Pos)          // 0x00000200\n#define DIEPEACHMSK1_BIM                 DIEPEACHMSK1_BIM_Msk                     // BNA interrupt mask\n#define DIEPEACHMSK1_NAKM_Pos            (13U)\n#define DIEPEACHMSK1_NAKM_Msk            (0x1UL << DIEPEACHMSK1_NAKM_Pos)         // 0x00002000\n#define DIEPEACHMSK1_NAKM                DIEPEACHMSK1_NAKM_Msk                    // NAK interrupt mask\n\n/********************  Bit definition for HPRT register  ********************/\n#define HPRT_CONN_STATUS_Pos           (0U)\n#define HPRT_CONN_STATUS_Msk           (0x1UL << HPRT_CONN_STATUS_Pos)         // 0x00000001\n#define HPRT_CONN_STATUS               HPRT_CONN_STATUS_Msk                    // Port connect status\n#define HPRT_CONN_DETECT_Pos           (1U)\n#define HPRT_CONN_DETECT_Msk           (0x1UL << HPRT_CONN_DETECT_Pos)         // 0x00000002\n#define HPRT_CONN_DETECT               HPRT_CONN_DETECT_Msk                    // Port connect detected\n#define HPRT_ENABLE_Pos                (2U)\n#define HPRT_ENABLE_Msk                (0x1UL << HPRT_ENABLE_Pos)              // 0x00000004\n#define HPRT_ENABLE                    HPRT_ENABLE_Msk                         // Port enable\n#define HPRT_ENABLE_CHANGE_Pos         (3U)\n#define HPRT_ENABLE_CHANGE_Msk         (0x1UL << HPRT_ENABLE_CHANGE_Pos)       // 0x00000008\n#define HPRT_ENABLE_CHANGE             HPRT_ENABLE_CHANGE_Msk                  // Port enable/disable change\n#define HPRT_OVER_CURRENT_ACTIVE_Pos   (4U)\n#define HPRT_OVER_CURRENT_ACTIVE_Msk   (0x1UL << HPRT_OVER_CURRENT_ACTIVE_Pos) // 0x00000010\n#define HPRT_OVER_CURRENT_ACTIVE       HPRT_OVER_CURRENT_ACTIVE_Msk            // Port overcurrent active\n#define HPRT_OVER_CURRENT_CHANGE_Pos   (5U)\n#define HPRT_OVER_CURRENT_CHANGE_Msk   (0x1UL << HPRT_OVER_CURRENT_CHANGE_Pos) // 0x00000020\n#define HPRT_OVER_CURRENT_CHANGE       HPRT_OVER_CURRENT_CHANGE_Msk            // Port overcurrent change\n#define HPRT_RESUME_Pos                (6U)\n#define HPRT_RESUME_Msk                (0x1UL << HPRT_RESUME_Pos)              // 0x00000040\n#define HPRT_RESUME                    HPRT_RESUME_Msk                         // Port resume\n#define HPRT_SUSPEND_Pos               (7U)\n#define HPRT_SUSPEND_Msk               (0x1UL << HPRT_SUSPEND_Pos)             // 0x00000080\n#define HPRT_SUSPEND                   HPRT_SUSPEND_Msk                        // Port suspend\n#define HPRT_RESET_Pos                 (8U)\n#define HPRT_RESET_Msk                 (0x1UL << HPRT_RESET_Pos)               // 0x00000100\n#define HPRT_RESET                     HPRT_RESET_Msk                          // Port reset\n#define HPRT_LINE_STATUS_Pos           (10U)\n#define HPRT_LINE_STATUS_Msk           (0x3UL << HPRT_LINE_STATUS_Pos)         // 0x00000C00\n#define HPRT_LINE_STATUS               HPRT_LINE_STATUS_Msk                    // Port line status\n#define HPRT_LINE_STATUS_0             (0x1UL << HPRT_LINE_STATUS_Pos)         // 0x00000400\n#define HPRT_LINE_STATUS_1             (0x2UL << HPRT_LINE_STATUS_Pos)         // 0x00000800\n#define HPRT_POWER_Pos                 (12U)\n#define HPRT_POWER_Msk                 (0x1UL << HPRT_POWER_Pos)               // 0x00001000\n#define HPRT_POWER                     HPRT_POWER_Msk                          // Port power\n#define HPRT_TEST_CONTROL_Pos          (13U)\n#define HPRT_TEST_CONTROL_Msk          (0xFUL << HPRT_TEST_CONTROL_Pos)        // 0x0001E000\n#define HPRT_TEST_CONTROL              HPRT_TEST_CONTROL_Msk                   // Port test control\n#define HPRT_TEST_CONTROL_0            (0x1UL << HPRT_TEST_CONTROL_Pos)        // 0x00002000\n#define HPRT_TEST_CONTROL_1            (0x2UL << HPRT_TEST_CONTROL_Pos)        // 0x00004000\n#define HPRT_TEST_CONTROL_2            (0x4UL << HPRT_TEST_CONTROL_Pos)        // 0x00008000\n#define HPRT_TEST_CONTROL_3            (0x8UL << HPRT_TEST_CONTROL_Pos)        // 0x00010000\n#define HPRT_SPEED_Pos                 (17U)\n#define HPRT_SPEED_Msk                 (0x3UL << HPRT_SPEED_Pos)               // 0x00060000\n#define HPRT_SPEED                     HPRT_SPEED_Msk                          // Port speed\n#define HPRT_SPEED_0                   (0x1UL << HPRT_SPEED_Pos)               // 0x00020000\n#define HPRT_SPEED_1                   (0x2UL << HPRT_SPEED_Pos)               // 0x00040000\n\n/********************  Bit definition for DOEPEACHMSK1 register  ********************/\n#define DOEPEACHMSK1_XFRCM_Pos           (0U)\n#define DOEPEACHMSK1_XFRCM_Msk           (0x1UL << DOEPEACHMSK1_XFRCM_Pos)        // 0x00000001\n#define DOEPEACHMSK1_XFRCM               DOEPEACHMSK1_XFRCM_Msk                   // Transfer completed interrupt mask\n#define DOEPEACHMSK1_EPDM_Pos            (1U)\n#define DOEPEACHMSK1_EPDM_Msk            (0x1UL << DOEPEACHMSK1_EPDM_Pos)         // 0x00000002\n#define DOEPEACHMSK1_EPDM                DOEPEACHMSK1_EPDM_Msk                    // Endpoint disabled interrupt mask\n#define DOEPEACHMSK1_TOM_Pos             (3U)\n#define DOEPEACHMSK1_TOM_Msk             (0x1UL << DOEPEACHMSK1_TOM_Pos)          // 0x00000008\n#define DOEPEACHMSK1_TOM                 DOEPEACHMSK1_TOM_Msk                     // Timeout condition mask\n#define DOEPEACHMSK1_ITTXFEMSK_Pos       (4U)\n#define DOEPEACHMSK1_ITTXFEMSK_Msk       (0x1UL << DOEPEACHMSK1_ITTXFEMSK_Pos)    // 0x00000010\n#define DOEPEACHMSK1_ITTXFEMSK           DOEPEACHMSK1_ITTXFEMSK_Msk               // IN token received when TxFIFO empty mask\n#define DOEPEACHMSK1_INEPNMM_Pos         (5U)\n#define DOEPEACHMSK1_INEPNMM_Msk         (0x1UL << DOEPEACHMSK1_INEPNMM_Pos)      // 0x00000020\n#define DOEPEACHMSK1_INEPNMM             DOEPEACHMSK1_INEPNMM_Msk                 // IN token received with EP mismatch mask\n#define DOEPEACHMSK1_INEPNEM_Pos         (6U)\n#define DOEPEACHMSK1_INEPNEM_Msk         (0x1UL << DOEPEACHMSK1_INEPNEM_Pos)      // 0x00000040\n#define DOEPEACHMSK1_INEPNEM             DOEPEACHMSK1_INEPNEM_Msk                 // IN endpoint NAK effective mask\n#define DOEPEACHMSK1_TXFURM_Pos          (8U)\n#define DOEPEACHMSK1_TXFURM_Msk          (0x1UL << DOEPEACHMSK1_TXFURM_Pos)       // 0x00000100\n#define DOEPEACHMSK1_TXFURM              DOEPEACHMSK1_TXFURM_Msk                  // OUT packet error mask\n#define DOEPEACHMSK1_BIM_Pos             (9U)\n#define DOEPEACHMSK1_BIM_Msk             (0x1UL << DOEPEACHMSK1_BIM_Pos)          // 0x00000200\n#define DOEPEACHMSK1_BIM                 DOEPEACHMSK1_BIM_Msk                     // BNA interrupt mask\n#define DOEPEACHMSK1_BERRM_Pos           (12U)\n#define DOEPEACHMSK1_BERRM_Msk           (0x1UL << DOEPEACHMSK1_BERRM_Pos)        // 0x00001000\n#define DOEPEACHMSK1_BERRM               DOEPEACHMSK1_BERRM_Msk                   // Bubble error interrupt mask\n#define DOEPEACHMSK1_NAKM_Pos            (13U)\n#define DOEPEACHMSK1_NAKM_Msk            (0x1UL << DOEPEACHMSK1_NAKM_Pos)         // 0x00002000\n#define DOEPEACHMSK1_NAKM                DOEPEACHMSK1_NAKM_Msk                    // NAK interrupt mask\n#define DOEPEACHMSK1_NYETM_Pos           (14U)\n#define DOEPEACHMSK1_NYETM_Msk           (0x1UL << DOEPEACHMSK1_NYETM_Pos)        // 0x00004000\n#define DOEPEACHMSK1_NYETM               DOEPEACHMSK1_NYETM_Msk                   // NYET interrupt mask\n\n/********************  Bit definition for HPTXFSIZ register  ********************/\n#define HPTXFSIZ_PTXSA_Pos               (0U)\n#define HPTXFSIZ_PTXSA_Msk               (0xFFFFUL << HPTXFSIZ_PTXSA_Pos)         // 0x0000FFFF\n#define HPTXFSIZ_PTXSA                   HPTXFSIZ_PTXSA_Msk                       // Host periodic TxFIFO start address\n#define HPTXFSIZ_PTXFD_Pos               (16U)\n#define HPTXFSIZ_PTXFD_Msk               (0xFFFFUL << HPTXFSIZ_PTXFD_Pos)         // 0xFFFF0000\n#define HPTXFSIZ_PTXFD                   HPTXFSIZ_PTXFD_Msk                       // Host periodic TxFIFO depth\n\n/********************  Bit definition for DIEPCTL register  ********************/\n#define DIEPCTL0_MPSIZ_Pos               (0U)\n#define DIEPCTL0_MPSIZ_Msk               (0x3UL << DIEPCTL0_MPSIZ_Pos)            // 0x00000003\n#define DIEPCTL0_MPSIZ                   DIEPCTL0_MPSIZ_Msk                       // Maximum packet size(endpoint 0)\n#define DIEPCTL_MPSIZ_Pos                (0U)\n#define DIEPCTL_MPSIZ_Msk                (0x7FFUL << DIEPCTL_MPSIZ_Pos)           // 0x000007FF\n#define DIEPCTL_MPSIZ                    DIEPCTL_MPSIZ_Msk                        // Maximum packet size\n#define DIEPCTL_USBAEP_Pos               (15U)\n#define DIEPCTL_USBAEP_Msk               (0x1UL << DIEPCTL_USBAEP_Pos)            // 0x00008000\n#define DIEPCTL_USBAEP                   DIEPCTL_USBAEP_Msk                       // USB active endpoint\n#define DIEPCTL_EONUM_DPID_Pos           (16U)\n#define DIEPCTL_EONUM_DPID_Msk           (0x1UL << DIEPCTL_EONUM_DPID_Pos)        // 0x00010000\n#define DIEPCTL_EONUM_DPID               DIEPCTL_EONUM_DPID_Msk                   // Even/odd frame\n#define DIEPCTL_NAKSTS_Pos               (17U)\n#define DIEPCTL_NAKSTS_Msk               (0x1UL << DIEPCTL_NAKSTS_Pos)            // 0x00020000\n#define DIEPCTL_NAKSTS                   DIEPCTL_NAKSTS_Msk                       // NAK status\n\n#define DIEPCTL_EPTYP_Pos                (18U)\n#define DIEPCTL_EPTYP_Msk                (0x3UL << DIEPCTL_EPTYP_Pos)             // 0x000C0000\n#define DIEPCTL_EPTYP                    DIEPCTL_EPTYP_Msk                        // Endpoint type\n#define DIEPCTL_EPTYP_0                  (0x1UL << DIEPCTL_EPTYP_Pos)             // 0x00040000\n#define DIEPCTL_EPTYP_1                  (0x2UL << DIEPCTL_EPTYP_Pos)             // 0x00080000\n#define DIEPCTL_STALL_Pos                (21U)\n#define DIEPCTL_STALL_Msk                (0x1UL << DIEPCTL_STALL_Pos)             // 0x00200000\n#define DIEPCTL_STALL                    DIEPCTL_STALL_Msk                        // STALL handshake\n\n#define DIEPCTL_TXFNUM_Pos               (22U)\n#define DIEPCTL_TXFNUM_Msk               (0xFUL << DIEPCTL_TXFNUM_Pos)            // 0x03C00000\n#define DIEPCTL_TXFNUM                   DIEPCTL_TXFNUM_Msk                       // TxFIFO number\n#define DIEPCTL_TXFNUM_0                 (0x1UL << DIEPCTL_TXFNUM_Pos)            // 0x00400000\n#define DIEPCTL_TXFNUM_1                 (0x2UL << DIEPCTL_TXFNUM_Pos)            // 0x00800000\n#define DIEPCTL_TXFNUM_2                 (0x4UL << DIEPCTL_TXFNUM_Pos)            // 0x01000000\n#define DIEPCTL_TXFNUM_3                 (0x8UL << DIEPCTL_TXFNUM_Pos)            // 0x02000000\n#define DIEPCTL_CNAK_Pos                 (26U)\n#define DIEPCTL_CNAK_Msk                 (0x1UL << DIEPCTL_CNAK_Pos)              // 0x04000000\n#define DIEPCTL_CNAK                     DIEPCTL_CNAK_Msk                         // Clear NAK\n#define DIEPCTL_SNAK_Pos                 (27U)\n#define DIEPCTL_SNAK_Msk                 (0x1UL << DIEPCTL_SNAK_Pos)              // 0x08000000\n#define DIEPCTL_SNAK                     DIEPCTL_SNAK_Msk                         // Set NAK\n#define DIEPCTL_SD0PID_SEVNFRM_Pos       (28U)\n#define DIEPCTL_SD0PID_SEVNFRM_Msk       (0x1UL << DIEPCTL_SD0PID_SEVNFRM_Pos)    // 0x10000000\n#define DIEPCTL_SD0PID_SEVNFRM           DIEPCTL_SD0PID_SEVNFRM_Msk               // Set DATA0 PID\n#define DIEPCTL_SODDFRM_Pos              (29U)\n#define DIEPCTL_SODDFRM_Msk              (0x1UL << DIEPCTL_SODDFRM_Pos)           // 0x20000000\n#define DIEPCTL_SODDFRM                  DIEPCTL_SODDFRM_Msk                      // Set odd frame\n#define DIEPCTL_EPDIS_Pos                (30U)\n#define DIEPCTL_EPDIS_Msk                (0x1UL << DIEPCTL_EPDIS_Pos)             // 0x40000000\n#define DIEPCTL_EPDIS                    DIEPCTL_EPDIS_Msk                        // Endpoint disable\n#define DIEPCTL_EPENA_Pos                (31U)\n#define DIEPCTL_EPENA_Msk                (0x1UL << DIEPCTL_EPENA_Pos)             // 0x80000000\n#define DIEPCTL_EPENA                    DIEPCTL_EPENA_Msk                        // Endpoint enable\n\n/********************  Bit definition for HCCHAR register  ********************/\n#define HCCHAR_MPSIZ_Pos                 (0U)\n#define HCCHAR_MPSIZ_Msk                 (0x7FFUL << HCCHAR_MPSIZ_Pos)            // 0x000007FF\n#define HCCHAR_MPSIZ                     HCCHAR_MPSIZ_Msk                         // Maximum packet size\n\n#define HCCHAR_EPNUM_Pos                 (11U)\n#define HCCHAR_EPNUM_Msk                 (0xFUL << HCCHAR_EPNUM_Pos)              // 0x00007800\n#define HCCHAR_EPNUM                     HCCHAR_EPNUM_Msk                         // Endpoint number\n#define HCCHAR_EPNUM_0                   (0x1UL << HCCHAR_EPNUM_Pos)              // 0x00000800\n#define HCCHAR_EPNUM_1                   (0x2UL << HCCHAR_EPNUM_Pos)              // 0x00001000\n#define HCCHAR_EPNUM_2                   (0x4UL << HCCHAR_EPNUM_Pos)              // 0x00002000\n#define HCCHAR_EPNUM_3                   (0x8UL << HCCHAR_EPNUM_Pos)              // 0x00004000\n#define HCCHAR_EPDIR_Pos                 (15U)\n#define HCCHAR_EPDIR_Msk                 (0x1UL << HCCHAR_EPDIR_Pos)              // 0x00008000\n#define HCCHAR_EPDIR                     HCCHAR_EPDIR_Msk                         // Endpoint direction\n#define HCCHAR_LSDEV_Pos                 (17U)\n#define HCCHAR_LSDEV_Msk                 (0x1UL << HCCHAR_LSDEV_Pos)              // 0x00020000\n#define HCCHAR_LSDEV                     HCCHAR_LSDEV_Msk                         // Low-speed device\n\n#define HCCHAR_EPTYP_Pos                 (18U)\n#define HCCHAR_EPTYP_Msk                 (0x3UL << HCCHAR_EPTYP_Pos)              // 0x000C0000\n#define HCCHAR_EPTYP                     HCCHAR_EPTYP_Msk                         // Endpoint type\n#define HCCHAR_EPTYP_0                   (0x1UL << HCCHAR_EPTYP_Pos)              // 0x00040000\n#define HCCHAR_EPTYP_1                   (0x2UL << HCCHAR_EPTYP_Pos)              // 0x00080000\n\n#define HCCHAR_MC_Pos                    (20U)\n#define HCCHAR_MC_Msk                    (0x3UL << HCCHAR_MC_Pos)                 // 0x00300000\n#define HCCHAR_MC                        HCCHAR_MC_Msk                            // Multi Count (MC) / Error Count (EC)\n#define HCCHAR_MC_0                      (0x1UL << HCCHAR_MC_Pos)                 // 0x00100000\n#define HCCHAR_MC_1                      (0x2UL << HCCHAR_MC_Pos)                 // 0x00200000\n\n#define HCCHAR_DAD_Pos                   (22U)\n#define HCCHAR_DAD_Msk                   (0x7FUL << HCCHAR_DAD_Pos)               // 0x1FC00000\n#define HCCHAR_DAD                       HCCHAR_DAD_Msk                           // Device address\n#define HCCHAR_DAD_0                     (0x01UL << HCCHAR_DAD_Pos)               // 0x00400000\n#define HCCHAR_DAD_1                     (0x02UL << HCCHAR_DAD_Pos)               // 0x00800000\n#define HCCHAR_DAD_2                     (0x04UL << HCCHAR_DAD_Pos)               // 0x01000000\n#define HCCHAR_DAD_3                     (0x08UL << HCCHAR_DAD_Pos)               // 0x02000000\n#define HCCHAR_DAD_4                     (0x10UL << HCCHAR_DAD_Pos)               // 0x04000000\n#define HCCHAR_DAD_5                     (0x20UL << HCCHAR_DAD_Pos)               // 0x08000000\n#define HCCHAR_DAD_6                     (0x40UL << HCCHAR_DAD_Pos)               // 0x10000000\n#define HCCHAR_ODDFRM_Pos                (29U)\n#define HCCHAR_ODDFRM_Msk                (0x1UL << HCCHAR_ODDFRM_Pos)             // 0x20000000\n#define HCCHAR_ODDFRM                    HCCHAR_ODDFRM_Msk                        // Odd frame\n#define HCCHAR_CHDIS_Pos                 (30U)\n#define HCCHAR_CHDIS_Msk                 (0x1UL << HCCHAR_CHDIS_Pos)              // 0x40000000\n#define HCCHAR_CHDIS                     HCCHAR_CHDIS_Msk                         // Channel disable\n#define HCCHAR_CHENA_Pos                 (31U)\n#define HCCHAR_CHENA_Msk                 (0x1UL << HCCHAR_CHENA_Pos)              // 0x80000000\n#define HCCHAR_CHENA                     HCCHAR_CHENA_Msk                         // Channel enable\n\n/********************  Bit definition for HCSPLT register  ********************/\n\n#define HCSPLT_PRTADDR_Pos               (0U)\n#define HCSPLT_PRTADDR_Msk               (0x7FUL << HCSPLT_PRTADDR_Pos)           // 0x0000007F\n#define HCSPLT_PRTADDR                   HCSPLT_PRTADDR_Msk                       // Port address\n#define HCSPLT_PRTADDR_0                 (0x01UL << HCSPLT_PRTADDR_Pos)           // 0x00000001\n#define HCSPLT_PRTADDR_1                 (0x02UL << HCSPLT_PRTADDR_Pos)           // 0x00000002\n#define HCSPLT_PRTADDR_2                 (0x04UL << HCSPLT_PRTADDR_Pos)           // 0x00000004\n#define HCSPLT_PRTADDR_3                 (0x08UL << HCSPLT_PRTADDR_Pos)           // 0x00000008\n#define HCSPLT_PRTADDR_4                 (0x10UL << HCSPLT_PRTADDR_Pos)           // 0x00000010\n#define HCSPLT_PRTADDR_5                 (0x20UL << HCSPLT_PRTADDR_Pos)           // 0x00000020\n#define HCSPLT_PRTADDR_6                 (0x40UL << HCSPLT_PRTADDR_Pos)           // 0x00000040\n\n#define HCSPLT_HUBADDR_Pos               (7U)\n#define HCSPLT_HUBADDR_Msk               (0x7FUL << HCSPLT_HUBADDR_Pos)           // 0x00003F80\n#define HCSPLT_HUBADDR                   HCSPLT_HUBADDR_Msk                       // Hub address\n#define HCSPLT_HUBADDR_0                 (0x01UL << HCSPLT_HUBADDR_Pos)           // 0x00000080\n#define HCSPLT_HUBADDR_1                 (0x02UL << HCSPLT_HUBADDR_Pos)           // 0x00000100\n#define HCSPLT_HUBADDR_2                 (0x04UL << HCSPLT_HUBADDR_Pos)           // 0x00000200\n#define HCSPLT_HUBADDR_3                 (0x08UL << HCSPLT_HUBADDR_Pos)           // 0x00000400\n#define HCSPLT_HUBADDR_4                 (0x10UL << HCSPLT_HUBADDR_Pos)           // 0x00000800\n#define HCSPLT_HUBADDR_5                 (0x20UL << HCSPLT_HUBADDR_Pos)           // 0x00001000\n#define HCSPLT_HUBADDR_6                 (0x40UL << HCSPLT_HUBADDR_Pos)           // 0x00002000\n\n#define HCSPLT_XACTPOS_Pos               (14U)\n#define HCSPLT_XACTPOS_Msk               (0x3UL << HCSPLT_XACTPOS_Pos)            // 0x0000C000\n#define HCSPLT_XACTPOS                   HCSPLT_XACTPOS_Msk                       // XACTPOS\n#define HCSPLT_XACTPOS_0                 (0x1UL << HCSPLT_XACTPOS_Pos)            // 0x00004000\n#define HCSPLT_XACTPOS_1                 (0x2UL << HCSPLT_XACTPOS_Pos)            // 0x00008000\n#define HCSPLT_COMPLSPLT_Pos             (16U)\n#define HCSPLT_COMPLSPLT_Msk             (0x1UL << HCSPLT_COMPLSPLT_Pos)          // 0x00010000\n#define HCSPLT_COMPLSPLT                 HCSPLT_COMPLSPLT_Msk                     // Do complete split\n#define HCSPLT_SPLITEN_Pos               (31U)\n#define HCSPLT_SPLITEN_Msk               (0x1UL << HCSPLT_SPLITEN_Pos)            // 0x80000000\n#define HCSPLT_SPLITEN                   HCSPLT_SPLITEN_Msk                       // Split enable\n\n/********************  Bit definition for HCINT register  ********************/\n#define HCINT_XFER_COMPLETE_Pos          (0U)\n#define HCINT_XFER_COMPLETE_Msk          (0x1UL << HCINT_XFER_COMPLETE_Pos)       // 0x00000001\n#define HCINT_XFER_COMPLETE              HCINT_XFER_COMPLETE_Msk                  // Transfer completed\n#define HCINT_HALTED_Pos                 (1U)\n#define HCINT_HALTED_Msk                 (0x1UL << HCINT_HALTED_Pos)              // 0x00000002\n#define HCINT_HALTED                     HCINT_HALTED_Msk                         // Channel halted\n#define HCINT_AHB_ERR_Pos                (2U)\n#define HCINT_AHB_ERR_Msk                (0x1UL << HCINT_AHB_ERR_Pos)              // 0x00000004\n#define HCINT_AHB_ERR                     HCINT_AHB_ERR_Msk                         // AHB error\n#define HCINT_STALL_Pos                  (3U)\n#define HCINT_STALL_Msk                  (0x1UL << HCINT_STALL_Pos)               // 0x00000008\n#define HCINT_STALL                      HCINT_STALL_Msk                          // STALL response received interrupt\n#define HCINT_NAK_Pos                    (4U)\n#define HCINT_NAK_Msk                    (0x1UL << HCINT_NAK_Pos)                 // 0x00000010\n#define HCINT_NAK                        HCINT_NAK_Msk                            // NAK response received interrupt\n#define HCINT_ACK_Pos                    (5U)\n#define HCINT_ACK_Msk                    (0x1UL << HCINT_ACK_Pos)                 // 0x00000020\n#define HCINT_ACK                        HCINT_ACK_Msk                            // ACK response received/transmitted interrupt\n#define HCINT_NYET_Pos                   (6U)\n#define HCINT_NYET_Msk                   (0x1UL << HCINT_NYET_Pos)                // 0x00000040\n#define HCINT_NYET                       HCINT_NYET_Msk                           // Response received interrupt\n#define HCINT_XACT_ERR_Pos               (7U)\n#define HCINT_XACT_ERR_Msk               (0x1UL << HCINT_XACT_ERR_Pos)            // 0x00000080\n#define HCINT_XACT_ERR                   HCINT_XACT_ERR_Msk                       // Transaction error\n#define HCINT_BABBLE_ERR_Pos             (8U)\n#define HCINT_BABBLE_ERR_Msk             (0x1UL << HCINT_BABBLE_ERR_Pos)          // 0x00000100\n#define HCINT_BABBLE_ERR                 HCINT_BABBLE_ERR_Msk                     // Babble error\n#define HCINT_FARME_OVERRUN_Pos          (9U)\n#define HCINT_FARME_OVERRUN_Msk          (0x1UL << HCINT_FARME_OVERRUN_Pos)       // 0x00000200\n#define HCINT_FARME_OVERRUN              HCINT_FARME_OVERRUN_Msk                  // Frame overrun\n#define HCINT_DATATOGGLE_ERR_Pos         (10U)\n#define HCINT_DATATOGGLE_ERR_Msk         (0x1UL << HCINT_DATATOGGLE_ERR_Pos)      // 0x00000400\n#define HCINT_DATATOGGLE_ERR             HCINT_DATATOGGLE_ERR_Msk                 // Data toggle error\n#define HCINT_BUFFER_NA_Pos             (11U)\n#define HCINT_BUFFER_NA_Msk             (0x1UL << HCINT_BUFFER_NA_Pos)          // 0x00000800\n#define HCINT_BUFFER_NA                 HCINT_BUFFER_NA_Msk                     // Buffer not available interrupt\n#define HCINT_XCS_XACT_ERR_Pos           (12U)\n#define HCINT_XCS_XACT_ERR_Msk           (0x1UL << HCINT_XCS_XACT_ERR_Pos)        // 0x00001000\n#define HCINT_XCS_XACT_ERR               HCINT_XCS_XACT_ERR_Msk                   // Excessive transaction error\n#define HCINT_DESC_ROLLOVER_Pos          (13U)\n#define HCINT_DESC_ROLLOVER_Msk          (0x1UL << HCINT_DESC_ROLLOVER_Pos)       // 0x00002000\n#define HCINT_DESC_ROLLOVER              HCINT_DESC_ROLLOVER_Msk                  // Descriptor rollover\n\n/********************  Bit definition for DIEPINT register  ********************/\n#define DIEPINT_XFRC_Pos                 (0U)\n#define DIEPINT_XFRC_Msk                 (0x1UL << DIEPINT_XFRC_Pos)              // 0x00000001\n#define DIEPINT_XFRC                     DIEPINT_XFRC_Msk                         // Transfer completed interrupt\n#define DIEPINT_EPDISD_Pos               (1U)\n#define DIEPINT_EPDISD_Msk               (0x1UL << DIEPINT_EPDISD_Pos)            // 0x00000002\n#define DIEPINT_EPDISD                   DIEPINT_EPDISD_Msk                       // Endpoint disabled interrupt\n#define DIEPINT_AHBERR_Pos               (2U)\n#define DIEPINT_AHBERR_Msk               (0x1UL << DIEPINT_AHBERR_Pos)            // 0x00000004\n#define DIEPINT_AHBERR                   DIEPINT_AHBERR_Msk                       // AHB Error (AHBErr) during an IN transaction\n#define DIEPINT_TOC_Pos                  (3U)\n#define DIEPINT_TOC_Msk                  (0x1UL << DIEPINT_TOC_Pos)               // 0x00000008\n#define DIEPINT_TOC                      DIEPINT_TOC_Msk                          // Timeout condition\n#define DIEPINT_ITTXFE_Pos               (4U)\n#define DIEPINT_ITTXFE_Msk               (0x1UL << DIEPINT_ITTXFE_Pos)            // 0x00000010\n#define DIEPINT_ITTXFE                   DIEPINT_ITTXFE_Msk                       // IN token received when TxFIFO is empty\n#define DIEPINT_INEPNM_Pos               (5U)\n#define DIEPINT_INEPNM_Msk               (0x1UL << DIEPINT_INEPNM_Pos)            // 0x00000020\n#define DIEPINT_INEPNM                   DIEPINT_INEPNM_Msk                       // IN token received with EP mismatch\n#define DIEPINT_INEPNE_Pos               (6U)\n#define DIEPINT_INEPNE_Msk               (0x1UL << DIEPINT_INEPNE_Pos)            // 0x00000040\n#define DIEPINT_INEPNE                   DIEPINT_INEPNE_Msk                       // IN endpoint NAK effective\n#define DIEPINT_TXFE_Pos                 (7U)\n#define DIEPINT_TXFE_Msk                 (0x1UL << DIEPINT_TXFE_Pos)              // 0x00000080\n#define DIEPINT_TXFE                     DIEPINT_TXFE_Msk                         // Transmit FIFO empty\n#define DIEPINT_TXFIFOUDRN_Pos           (8U)\n#define DIEPINT_TXFIFOUDRN_Msk           (0x1UL << DIEPINT_TXFIFOUDRN_Pos)        // 0x00000100\n#define DIEPINT_TXFIFOUDRN               DIEPINT_TXFIFOUDRN_Msk                   // Transmit Fifo Underrun\n#define DIEPINT_BNA_Pos                  (9U)\n#define DIEPINT_BNA_Msk                  (0x1UL << DIEPINT_BNA_Pos)               // 0x00000200\n#define DIEPINT_BNA                      DIEPINT_BNA_Msk                          // Buffer not available interrupt\n#define DIEPINT_PKTDRPSTS_Pos            (11U)\n#define DIEPINT_PKTDRPSTS_Msk            (0x1UL << DIEPINT_PKTDRPSTS_Pos)         // 0x00000800\n#define DIEPINT_PKTDRPSTS                DIEPINT_PKTDRPSTS_Msk                    // Packet dropped status\n#define DIEPINT_BERR_Pos                 (12U)\n#define DIEPINT_BERR_Msk                 (0x1UL << DIEPINT_BERR_Pos)              // 0x00001000\n#define DIEPINT_BERR                     DIEPINT_BERR_Msk                         // Babble error interrupt\n#define DIEPINT_NAK_Pos                  (13U)\n#define DIEPINT_NAK_Msk                  (0x1UL << DIEPINT_NAK_Pos)               // 0x00002000\n#define DIEPINT_NAK                      DIEPINT_NAK_Msk                          // NAK interrupt\n\n/********************  Bit definition for DIEPTSIZ register  ********************/\n\n#define DIEPTSIZ_XFRSIZ_Pos              (0U)\n#define DIEPTSIZ_XFRSIZ_Msk              (0x7FFFFUL << DIEPTSIZ_XFRSIZ_Pos)       // 0x0007FFFF\n#define DIEPTSIZ_XFRSIZ                  DIEPTSIZ_XFRSIZ_Msk                      // Transfer size\n#define DIEPTSIZ_PKTCNT_Pos              (19U)\n#define DIEPTSIZ_PKTCNT_Msk              (0x3FFUL << DIEPTSIZ_PKTCNT_Pos)         // 0x1FF80000\n#define DIEPTSIZ_PKTCNT                  DIEPTSIZ_PKTCNT_Msk                      // Packet count\n#define DIEPTSIZ_MULCNT_Pos              (29U)\n#define DIEPTSIZ_MULCNT_Msk              (0x3UL << DIEPTSIZ_MULCNT_Pos)           // 0x60000000\n#define DIEPTSIZ_MULCNT                  DIEPTSIZ_MULCNT_Msk                      // Packet count\n                                                                                  /********************  Bit definition for HCTSIZ register  ********************/\n#define HCTSIZ_XFRSIZ_Pos                (0U)\n#define HCTSIZ_XFRSIZ_Msk                (0x7FFFFUL << HCTSIZ_XFRSIZ_Pos)         // 0x0007FFFF\n#define HCTSIZ_XFRSIZ                    HCTSIZ_XFRSIZ_Msk                        // Transfer size\n#define HCTSIZ_PKTCNT_Pos                (19U)\n#define HCTSIZ_PKTCNT_Msk                (0x3FFUL << HCTSIZ_PKTCNT_Pos)           // 0x1FF80000\n#define HCTSIZ_PKTCNT                    HCTSIZ_PKTCNT_Msk                        // Packet count\n#define HCTSIZ_DOPING_Pos                (31U)\n#define HCTSIZ_DOPING_Msk                (0x1UL << HCTSIZ_DOPING_Pos)             // 0x80000000\n#define HCTSIZ_DOPING                    HCTSIZ_DOPING_Msk                        // Do PING\n#define HCTSIZ_PID_Pos                   (29U)\n#define HCTSIZ_PID_Msk                   (0x3UL << HCTSIZ_PID_Pos)                // 0x60000000\n#define HCTSIZ_PID                       HCTSIZ_PID_Msk                           // Data PID\n\n/********************  Bit definition for DIEPDMA register  ********************/\n#define DIEPDMA_DMAADDR_Pos              (0U)\n#define DIEPDMA_DMAADDR_Msk              (0xFFFFFFFFUL << DIEPDMA_DMAADDR_Pos)    // 0xFFFFFFFF\n#define DIEPDMA_DMAADDR                  DIEPDMA_DMAADDR_Msk                      // DMA address\n\n/********************  Bit definition for HCDMA register  ********************/\n#define HCDMA_DMAADDR_Pos                (0U)\n#define HCDMA_DMAADDR_Msk                (0xFFFFFFFFUL << HCDMA_DMAADDR_Pos)      // 0xFFFFFFFF\n#define HCDMA_DMAADDR                    HCDMA_DMAADDR_Msk                        // DMA address\n\n                                                                                  /********************  Bit definition for DTXFSTS register  ********************/\n#define DTXFSTS_INEPTFSAV_Pos            (0U)\n#define DTXFSTS_INEPTFSAV_Msk            (0xFFFFUL << DTXFSTS_INEPTFSAV_Pos)      // 0x0000FFFF\n#define DTXFSTS_INEPTFSAV                DTXFSTS_INEPTFSAV_Msk                    // IN endpoint TxFIFO space available\n\n                                                                                  /********************  Bit definition for DIEPTXF register  ********************/\n#define DIEPTXF_INEPTXSA_Pos             (0U)\n#define DIEPTXF_INEPTXSA_Msk             (0xFFFFUL << DIEPTXF_INEPTXSA_Pos)       // 0x0000FFFF\n#define DIEPTXF_INEPTXSA                 DIEPTXF_INEPTXSA_Msk                     // IN endpoint FIFOx transmit RAM start address\n#define DIEPTXF_INEPTXFD_Pos             (16U)\n#define DIEPTXF_INEPTXFD_Msk             (0xFFFFUL << DIEPTXF_INEPTXFD_Pos)       // 0xFFFF0000\n#define DIEPTXF_INEPTXFD                 DIEPTXF_INEPTXFD_Msk                     // IN endpoint TxFIFO depth\n\n\n/********************  Bit definition for Common EPCTL register  ********************/\n#define EPCTL_MPSIZ_Pos                (0U)\n#define EPCTL_MPSIZ_Msk                (0x7FFUL << EPCTL_MPSIZ_Pos)           // 0x000007FF\n#define EPCTL_MPSIZ                    EPCTL_MPSIZ_Msk                        // Maximum packet size          //Bit 1\n#define EPCTL_USBAEP_Pos               (15U)\n#define EPCTL_USBAEP_Msk               (0x1UL << EPCTL_USBAEP_Pos)            // 0x00008000\n#define EPCTL_USBAEP                   EPCTL_USBAEP_Msk                       // USB active endpoint\n#define EPCTL_NAKSTS_Pos               (17U)\n#define EPCTL_NAKSTS_Msk               (0x1UL << EPCTL_NAKSTS_Pos)            // 0x00020000\n#define EPCTL_NAKSTS                   EPCTL_NAKSTS_Msk                       // NAK status\n#define EPCTL_EPTYP_Pos                (18U)\n#define EPCTL_EPTYP_Msk                (0x3UL << EPCTL_EPTYP_Pos)             // 0x000C0000\n#define EPCTL_EPTYP                    EPCTL_EPTYP_Msk                        // Endpoint type\n#define EPCTL_EPTYP_0                  (0x1UL << EPCTL_EPTYP_Pos)             // 0x00040000\n#define EPCTL_EPTYP_1                  (0x2UL << EPCTL_EPTYP_Pos)             // 0x00080000\n#define EPCTL_SNPM                     EPCTL_SNPM_Msk                         // Snoop mode\n#define EPCTL_STALL_Pos                (21U)\n#define EPCTL_STALL_Msk                (0x1UL << EPCTL_STALL_Pos)             // 0x00200000\n#define EPCTL_STALL                    EPCTL_STALL_Msk                        // STALL handshake\n#define EPCTL_CNAK_Pos                 (26U)\n#define EPCTL_CNAK_Msk                 (0x1UL << EPCTL_CNAK_Pos)              // 0x04000000\n#define EPCTL_CNAK                     EPCTL_CNAK_Msk                         // Clear NAK\n#define EPCTL_SNAK_Pos                 (27U)\n#define EPCTL_SNAK_Msk                 (0x1UL << EPCTL_SNAK_Pos)              // 0x08000000\n#define EPCTL_SNAK                     EPCTL_SNAK_Msk                         // Set NAK\n#define EPCTL_SD0PID_SEVNFRM_Pos       (28U)\n#define EPCTL_SD0PID_SEVNFRM_Msk       (0x1UL << EPCTL_SD0PID_SEVNFRM_Pos)    // 0x10000000\n#define EPCTL_SD0PID_SEVNFRM           EPCTL_SD0PID_SEVNFRM_Msk               // Set DATA0 PID\n#define EPCTL_SODDFRM_Pos              (29U)\n#define EPCTL_SODDFRM_Msk              (0x1UL << EPCTL_SODDFRM_Pos)           // 0x20000000\n#define EPCTL_SODDFRM                  EPCTL_SODDFRM_Msk                      // Set odd frame\n#define EPCTL_EPDIS_Pos                (30U)\n#define EPCTL_EPDIS_Msk                (0x1UL << EPCTL_EPDIS_Pos)             // 0x40000000\n#define EPCTL_EPDIS                    EPCTL_EPDIS_Msk                        // Endpoint disable\n#define EPCTL_EPENA_Pos                (31U)\n#define EPCTL_EPENA_Msk                (0x1UL << EPCTL_EPENA_Pos)             // 0x80000000\n#define EPCTL_EPENA                    EPCTL_EPENA_Msk                        // Endpoint enable\n\n/********************  Bit definition for DOEPCTL register  ********************/\n#define DOEPCTL0_MPSIZ_Pos               (0U)\n#define DOEPCTL0_MPSIZ_Msk               (0x3UL << DOEPCTL0_MPSIZ_Pos)            // 0x00000003\n#define DOEPCTL0_MPSIZ                   DOEPCTL0_MPSIZ_Msk                       // Maximum packet size(endpoint 0)\n#define DOEPCTL_MPSIZ_Pos                (0U)\n#define DOEPCTL_MPSIZ_Msk                (0x7FFUL << DOEPCTL_MPSIZ_Pos)           // 0x000007FF\n#define DOEPCTL_MPSIZ                    DOEPCTL_MPSIZ_Msk                        // Maximum packet size          //Bit 1\n#define DOEPCTL_USBAEP_Pos               (15U)\n#define DOEPCTL_USBAEP_Msk               (0x1UL << DOEPCTL_USBAEP_Pos)            // 0x00008000\n#define DOEPCTL_USBAEP                   DOEPCTL_USBAEP_Msk                       // USB active endpoint\n#define DOEPCTL_NAKSTS_Pos               (17U)\n#define DOEPCTL_NAKSTS_Msk               (0x1UL << DOEPCTL_NAKSTS_Pos)            // 0x00020000\n#define DOEPCTL_NAKSTS                   DOEPCTL_NAKSTS_Msk                       // NAK status\n#define DOEPCTL_SD0PID_SEVNFRM_Pos       (28U)\n#define DOEPCTL_SD0PID_SEVNFRM_Msk       (0x1UL << DOEPCTL_SD0PID_SEVNFRM_Pos)    // 0x10000000\n#define DOEPCTL_SD0PID_SEVNFRM           DOEPCTL_SD0PID_SEVNFRM_Msk               // Set DATA0 PID\n#define DOEPCTL_SODDFRM_Pos              (29U)\n#define DOEPCTL_SODDFRM_Msk              (0x1UL << DOEPCTL_SODDFRM_Pos)           // 0x20000000\n#define DOEPCTL_SODDFRM                  DOEPCTL_SODDFRM_Msk                      // Set odd frame\n#define DOEPCTL_EPTYP_Pos                (18U)\n#define DOEPCTL_EPTYP_Msk                (0x3UL << DOEPCTL_EPTYP_Pos)             // 0x000C0000\n#define DOEPCTL_EPTYP                    DOEPCTL_EPTYP_Msk                        // Endpoint type\n#define DOEPCTL_EPTYP_0                  (0x1UL << DOEPCTL_EPTYP_Pos)             // 0x00040000\n#define DOEPCTL_EPTYP_1                  (0x2UL << DOEPCTL_EPTYP_Pos)             // 0x00080000\n#define DOEPCTL_SNPM_Pos                 (20U)\n#define DOEPCTL_SNPM_Msk                 (0x1UL << DOEPCTL_SNPM_Pos)              // 0x00100000\n#define DOEPCTL_SNPM                     DOEPCTL_SNPM_Msk                         // Snoop mode\n#define DOEPCTL_STALL_Pos                (21U)\n#define DOEPCTL_STALL_Msk                (0x1UL << DOEPCTL_STALL_Pos)             // 0x00200000\n#define DOEPCTL_STALL                    DOEPCTL_STALL_Msk                        // STALL handshake\n#define DOEPCTL_CNAK_Pos                 (26U)\n#define DOEPCTL_CNAK_Msk                 (0x1UL << DOEPCTL_CNAK_Pos)              // 0x04000000\n#define DOEPCTL_CNAK                     DOEPCTL_CNAK_Msk                         // Clear NAK\n#define DOEPCTL_SNAK_Pos                 (27U)\n#define DOEPCTL_SNAK_Msk                 (0x1UL << DOEPCTL_SNAK_Pos)              // 0x08000000\n#define DOEPCTL_SNAK                     DOEPCTL_SNAK_Msk                         // Set NAK\n#define DOEPCTL_EPDIS_Pos                (30U)\n#define DOEPCTL_EPDIS_Msk                (0x1UL << DOEPCTL_EPDIS_Pos)             // 0x40000000\n#define DOEPCTL_EPDIS                    DOEPCTL_EPDIS_Msk                        // Endpoint disable\n#define DOEPCTL_EPENA_Pos                (31U)\n#define DOEPCTL_EPENA_Msk                (0x1UL << DOEPCTL_EPENA_Pos)             // 0x80000000\n#define DOEPCTL_EPENA                    DOEPCTL_EPENA_Msk                        // Endpoint enable\n\n/********************  Bit definition for DOEPINT register  ********************/\n#define DOEPINT_XFRC_Pos                 (0U)\n#define DOEPINT_XFRC_Msk                 (0x1UL << DOEPINT_XFRC_Pos)              // 0x00000001\n#define DOEPINT_XFRC                     DOEPINT_XFRC_Msk                         // Transfer completed interrupt\n#define DOEPINT_EPDISD_Pos               (1U)\n#define DOEPINT_EPDISD_Msk               (0x1UL << DOEPINT_EPDISD_Pos)            // 0x00000002\n#define DOEPINT_EPDISD                   DOEPINT_EPDISD_Msk                       // Endpoint disabled interrupt\n#define DOEPINT_AHBERR_Pos               (2U)\n#define DOEPINT_AHBERR_Msk               (0x1UL << DOEPINT_AHBERR_Pos)            // 0x00000004\n#define DOEPINT_AHBERR                   DOEPINT_AHBERR_Msk                       // AHB Error (AHBErr) during an OUT transaction\n\n#define DOEPINT_SETUP_Pos                (3U)\n#define DOEPINT_SETUP_Msk                (0x1UL << DOEPINT_SETUP_Pos)             // 0x00000008\n#define DOEPINT_SETUP                    DOEPINT_SETUP_Msk                        // SETUP phase done\n\n#define DOEPINT_OTEPDIS_Pos              (4U)\n#define DOEPINT_OTEPDIS_Msk              (0x1UL << DOEPINT_OTEPDIS_Pos)           // 0x00000010\n#define DOEPINT_OTEPDIS                  DOEPINT_OTEPDIS_Msk                      // OUT token received when endpoint disabled\n\n#define DOEPINT_STSPHSRX_Pos             (5U)\n#define DOEPINT_STSPHSRX_Msk             (0x1UL << DOEPINT_STSPHSRX_Pos)          // 0x00000020\n#define DOEPINT_STSPHSRX                  DOEPINT_STSPHSRX_Msk                    // Status Phase Received For Control Write\n\n#define DOEPINT_B2BSTUP_Pos              (6U)\n#define DOEPINT_B2BSTUP_Msk              (0x1UL << DOEPINT_B2BSTUP_Pos)           // 0x00000040\n#define DOEPINT_B2BSTUP                  DOEPINT_B2BSTUP_Msk                      // Back-to-back SETUP packets received\n#define DOEPINT_OUTPKTERR_Pos            (8U)\n#define DOEPINT_OUTPKTERR_Msk            (0x1UL << DOEPINT_OUTPKTERR_Pos)         // 0x00000100\n#define DOEPINT_OUTPKTERR                DOEPINT_OUTPKTERR_Msk                    // OUT packet error\n#define DOEPINT_NAK_Pos                  (13U)\n#define DOEPINT_NAK_Msk                  (0x1UL << DOEPINT_NAK_Pos)               // 0x00002000\n#define DOEPINT_NAK                      DOEPINT_NAK_Msk                          // NAK Packet is transmitted by the device\n#define DOEPINT_NYET_Pos                 (14U)\n#define DOEPINT_NYET_Msk                 (0x1UL << DOEPINT_NYET_Pos)              // 0x00004000\n#define DOEPINT_NYET                     DOEPINT_NYET_Msk                         // NYET interrupt\n\n#define DOEPINT_STPKTRX_Pos              (15U)\n#define DOEPINT_STPKTRX_Msk              (0x1UL << DOEPINT_STPKTRX_Pos)           // 0x00008000\n#define DOEPINT_STPKTRX                  DOEPINT_STPKTRX_Msk                      // Setup Packet Received\n\n/********************  Bit definition for DOEPTSIZ register  ********************/\n#define DOEPTSIZ_XFRSIZ_Pos              (0U)\n#define DOEPTSIZ_XFRSIZ_Msk              (0x7FFFFUL << DOEPTSIZ_XFRSIZ_Pos)       // 0x0007FFFF\n#define DOEPTSIZ_XFRSIZ                  DOEPTSIZ_XFRSIZ_Msk                      // Transfer size\n#define DOEPTSIZ_PKTCNT_Pos              (19U)\n#define DOEPTSIZ_PKTCNT_Msk              (0x3FFUL << DOEPTSIZ_PKTCNT_Pos)         // 0x1FF80000\n#define DOEPTSIZ_PKTCNT                  DOEPTSIZ_PKTCNT_Msk                      // Packet count\n\n#define DOEPTSIZ_STUPCNT_Pos             (29U)\n#define DOEPTSIZ_STUPCNT_Msk             (0x3UL << DOEPTSIZ_STUPCNT_Pos)          // 0x60000000\n#define DOEPTSIZ_STUPCNT                 DOEPTSIZ_STUPCNT_Msk                     // SETUP packet count\n#define DOEPTSIZ_STUPCNT_0               (0x1UL << DOEPTSIZ_STUPCNT_Pos)          // 0x20000000\n#define DOEPTSIZ_STUPCNT_1               (0x2UL << DOEPTSIZ_STUPCNT_Pos)          // 0x40000000\n\n/********************  Bit definition for PCGCTL register  ********************/\n#define PCGCCTL_IF_DEV_MODE              TU_BIT(31)\n#define PCGCCTL_P2HD_PRT_SPD_MASK        (0x3ul << 29)\n#define PCGCCTL_P2HD_PRT_SPD_SHIFT       29\n#define PCGCCTL_P2HD_DEV_ENUM_SPD_MASK   (0x3ul << 27)\n#define PCGCCTL_P2HD_DEV_ENUM_SPD_SHIFT  27\n#define PCGCCTL_MAC_DEV_ADDR_MASK        (0x7ful << 20)\n#define PCGCCTL_MAC_DEV_ADDR_SHIFT       20\n#define PCGCCTL_MAX_TERMSEL              TU_BIT(19)\n#define PCGCCTL_MAX_XCVRSELECT_MASK      (0x3ul << 17)\n#define PCGCCTL_MAX_XCVRSELECT_SHIFT     17\n#define PCGCCTL_PORT_POWER               TU_BIT(16)\n#define PCGCCTL_PRT_CLK_SEL_MASK         (0x3ul << 14)\n#define PCGCCTL_PRT_CLK_SEL_SHIFT        14\n#define PCGCCTL_ESS_REG_RESTORED         TU_BIT(13)\n#define PCGCCTL_EXTND_HIBER_SWITCH       TU_BIT(12)\n#define PCGCCTL_EXTND_HIBER_PWRCLMP      TU_BIT(11)\n#define PCGCCTL_ENBL_EXTND_HIBER         TU_BIT(10)\n#define PCGCCTL_RESTOREMODE              TU_BIT(9)\n#define PCGCCTL_RESETAFTSUSP             TU_BIT(8)\n#define PCGCCTL_DEEP_SLEEP               TU_BIT(7)\n#define PCGCCTL_PHY_IN_SLEEP             TU_BIT(6)\n#define PCGCCTL_ENBL_SLEEP_GATING        TU_BIT(5)\n#define PCGCCTL_RSTPDWNMODULE            TU_BIT(3)\n#define PCGCCTL_PWRCLMP                  TU_BIT(2)\n#define PCGCCTL_GATEHCLK                 TU_BIT(1)\n#define PCGCCTL_STOPPCLK                 TU_BIT(0)\n\n#define PCGCTL1_TIMER                   (0x3ul << 1)\n#define PCGCTL1_GATEEN                  TU_BIT(0)\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/dwc2_xmc.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2021 Rafael Silva (@perigoso)\n * Copyright (c) 2021, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef _DWC2_XMC_H_\n#define _DWC2_XMC_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#include \"xmc_device.h\"\n\n#define DWC2_EP_MAX         7\n\nstatic const dwc2_controller_t _dwc2_controller[] =\n{\n  // Note: XMC has some custom control registers before DWC registers\n  { .reg_base = USB0_BASE, .irqnum = USB0_0_IRQn, .ep_count = DWC2_EP_MAX, .ep_fifo_size = 2048 }\n};\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void dwc2_dcd_int_enable(uint8_t rhport)\n{\n  NVIC_EnableIRQ(_dwc2_controller[rhport].irqnum);\n}\n\nTU_ATTR_ALWAYS_INLINE\nstatic inline void dwc2_dcd_int_disable (uint8_t rhport)\n{\n  NVIC_DisableIRQ(_dwc2_controller[rhport].irqnum);\n}\n\nstatic inline void dwc2_remote_wakeup_delay(void)\n{\n  // try to delay for 1 ms\n//  uint32_t count = SystemCoreClock / 1000;\n//  while ( count-- ) __NOP();\n}\n\n// MCU specific PHY init, called BEFORE core reset\nstatic inline void dwc2_phy_init(dwc2_regs_t * dwc2, uint8_t hs_phy_type)\n{\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  // Enable PHY\n  //USB->ROUTE = USB_ROUTE_PHYPEN;\n}\n\n// MCU specific PHY deinit, disable PHY power\nstatic inline void dwc2_phy_deinit(dwc2_regs_t * dwc2, uint8_t hs_phy_type) {\n  (void) dwc2;\n  (void) hs_phy_type;\n  // nothing to do\n}\n\n// MCU specific PHY update, it is called AFTER init() and core reset\nstatic inline void dwc2_phy_update(dwc2_regs_t * dwc2, uint8_t hs_phy_type)\n{\n  (void) dwc2;\n  (void) hs_phy_type;\n\n  // XMC Manual: turn around must be 5 (reset & default value)\n  // dwc2->gusbcfg = (dwc2->gusbcfg & ~GUSBCFG_TRDT_Msk) | (5u << GUSBCFG_TRDT_Pos);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/portable/synopsys/dwc2/hcd_dwc2.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_DWC2) && !CFG_TUH_MAX3421\n\n#if !(CFG_TUH_DWC2_SLAVE_ENABLE || CFG_TUH_DWC2_DMA_ENABLE)\n#error DWC2 require either CFG_TUH_DWC2_SLAVE_ENABLE or CFG_TUH_DWC2_DMA_ENABLE to be enabled\n#endif\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"dwc2_common.h\"\n\n  // Debug level for DWC2\n  #define DWC2_DEBUG 2\n\n  // Max number of endpoints application can open, can be larger than DWC2_CHANNEL_COUNT_MAX\n  #ifndef CFG_TUH_DWC2_ENDPOINT_MAX\n    #define CFG_TUH_DWC2_ENDPOINT_MAX 16u\n  #endif\n\n  #define DWC2_CHANNEL_COUNT_MAX 16u // absolute max channel count\nTU_VERIFY_STATIC(CFG_TUH_DWC2_ENDPOINT_MAX <= 255, \"currently only use 8-bit for index\");\n\nenum {\n  HPRT_W1_MASK = HPRT_CONN_DETECT | HPRT_ENABLE | HPRT_ENABLE_CHANGE | HPRT_OVER_CURRENT_CHANGE | HPRT_SUSPEND\n};\n\nenum {\n  HCD_XFER_ERROR_MAX = 3\n};\n\nenum {\n  HCD_XFER_PERIOD_SPLIT_NYET_MAX = 3\n};\n\n//--------------------------------------------------------------------\n//\n//--------------------------------------------------------------------\n\n// Host driver struct for each opened endpoint\ntypedef struct {\n  union {\n    uint32_t hcchar;\n    dwc2_channel_char_t hcchar_bm;\n  };\n  union {\n    uint32_t hcsplt;\n    dwc2_channel_split_t hcsplt_bm;\n  };\n\n  struct TU_ATTR_PACKED {\n    uint32_t uframe_interval : 18; // micro-frame interval\n    uint32_t speed           : 2;\n    uint32_t next_pid        : 2; // PID for next transfer\n    uint32_t next_do_ping    : 1; // Do PING for next transfer if possible (highspeed OUT)\n    uint32_t closing         : 1; // endpoint is closing\n    // uint32_t : 8;\n  };\n\n  uint32_t uframe_countdown; // micro-frame count down to transfer for periodic, only need 18-bit\n\n  uint8_t* buffer;\n  uint16_t buflen;\n} hcd_endpoint_t;\n\n// Additional info for each channel when it is active\ntypedef struct {\n  volatile bool allocated;\n  uint8_t ep_id;\n  struct TU_ATTR_PACKED {\n    uint8_t err_count : 3;\n    uint8_t period_split_nyet_count : 3;\n    uint8_t halted_nyet : 1;\n    uint8_t closing : 1; // closing channel\n  };\n  uint8_t result;\n\n  uint16_t xferred_bytes;  // bytes that accumulate transferred though USB bus for the whole hcd_edpt_xfer(), which can\n                           // be composed of multiple channel_xfer_start() (retry with NAK/NYET)\n  uint16_t fifo_bytes;     // bytes written/read from/to FIFO (may not be transferred on USB bus).\n} hcd_xfer_t;\n\ntypedef struct {\n  hcd_xfer_t xfer[DWC2_CHANNEL_COUNT_MAX];\n  hcd_endpoint_t edpt[CFG_TUH_DWC2_ENDPOINT_MAX];\n} hcd_data_t;\n\nstatic hcd_data_t _hcd_data;\nstatic tuh_configure_dwc2_t _tuh_cfg = {.use_hs_phy = TUH_OPT_HIGH_SPEED};\n\n//--------------------------------------------------------------------\n//\n//--------------------------------------------------------------------\nTU_ATTR_ALWAYS_INLINE static inline uint8_t dwc2_channel_count(const dwc2_regs_t* dwc2) {\n  const dwc2_ghwcfg2_t ghwcfg2 = {.value = dwc2->ghwcfg2};\n  return tu_min8(ghwcfg2.num_host_ch + 1, DWC2_CHANNEL_COUNT_MAX);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline tusb_speed_t hprt_speed_get(dwc2_regs_t* dwc2) {\n  tusb_speed_t speed;\n  const dwc2_hprt_t hprt = {.value = dwc2->hprt};\n  switch(hprt.speed) {\n    case HPRT_SPEED_HIGH: speed = TUSB_SPEED_HIGH; break;\n    case HPRT_SPEED_FULL: speed = TUSB_SPEED_FULL; break;\n    case HPRT_SPEED_LOW : speed = TUSB_SPEED_LOW ; break;\n    default:\n      speed = TUSB_SPEED_INVALID;\n      TU_BREAKPOINT();\n    break;\n  }\n  return speed;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool dma_host_enabled(const dwc2_regs_t* dwc2) {\n  (void) dwc2;\n  // Internal DMA only\n  const dwc2_ghwcfg2_t ghwcfg2 = {.value = dwc2->ghwcfg2};\n  return CFG_TUH_DWC2_DMA_ENABLE && ghwcfg2.arch == GHWCFG2_ARCH_INTERNAL_DMA;\n}\n\n#if CFG_TUH_MEM_DCACHE_ENABLE\nbool hcd_dcache_clean(const void* addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return dwc2_dcache_clean(addr, data_size);\n}\n\nbool hcd_dcache_invalidate(const void* addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return dwc2_dcache_invalidate(addr, data_size);\n}\n\nbool hcd_dcache_clean_invalidate(const void* addr, uint32_t data_size) {\n  TU_VERIFY(addr && data_size);\n  return dwc2_dcache_clean_invalidate(addr, data_size);\n}\n#endif\n\n// Allocate a channel for new transfer\nTU_ATTR_ALWAYS_INLINE static inline uint8_t channel_alloc(dwc2_regs_t* dwc2) {\n  const uint8_t max_channel = dwc2_channel_count(dwc2);\n  for (uint8_t ch_id = 0; ch_id < max_channel; ch_id++) {\n    hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n    if (!xfer->allocated) {\n      tu_memclr(xfer, sizeof(hcd_xfer_t));\n      xfer->allocated = true;\n      return ch_id;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\n// Check if is periodic (interrupt/isochronous)\nTU_ATTR_ALWAYS_INLINE static inline bool channel_is_periodic(uint32_t hcchar) {\n  const dwc2_channel_char_t hcchar_bm = {.value = hcchar};\n  return hcchar_bm.ep_type == HCCHAR_EPTYPE_INTERRUPT || hcchar_bm.ep_type == HCCHAR_EPTYPE_ISOCHRONOUS;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t req_queue_avail(const dwc2_regs_t* dwc2, bool is_period) {\n  if (is_period) {\n    const dwc2_hptxsts_t hptxsts = {.value = dwc2->hptxsts};\n    return hptxsts.req_queue_available;\n  } else {\n    const dwc2_hnptxsts_t hnptxsts = {.value = dwc2->hnptxsts};\n    return hnptxsts.req_queue_available;\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void channel_dealloc(dwc2_regs_t* dwc2, uint8_t ch_id) {\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  xfer->allocated = false;\n  dwc2->haintmsk &= ~TU_BIT(ch_id);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline bool channel_disable(const dwc2_regs_t* dwc2, dwc2_channel_t* channel) {\n  const bool is_period = channel_is_periodic(channel->hcchar);\n  if (dma_host_enabled(dwc2)) {\n    // In buffer DMA or external DMA mode:\n    // - Channel disable must not be programmed for non-split periodic channels. At the end of the next uframe/frame (in\n    //   the worst case), the controller generates a channel halted and disables the channel automatically.\n    // - For split enabled channels (both non-periodic and periodic), channel disable must not be programmed randomly.\n    //   However, channel disable can be programmed for specific scenarios such as NAK and FrmOvrn.\n    if (is_period && (channel->hcsplt & HCSPLT_SPLITEN)) {\n      return true;\n    }\n  } else {\n    while (0 == req_queue_avail(dwc2, is_period)) {\n      // blocking wait for request queue available\n    }\n  }\n  channel->hcintmsk |= HCINT_HALTED;\n  channel->hcchar |= HCCHAR_CHDIS | HCCHAR_CHENA; // must set both CHDIS and CHENA\n  return true;\n}\n\n// attempt to send IN token to receive data\nTU_ATTR_ALWAYS_INLINE static inline bool channel_send_in_token(const dwc2_regs_t* dwc2, dwc2_channel_t* channel) {\n  while (0 == req_queue_avail(dwc2, channel_is_periodic(channel->hcchar))) {\n    // blocking wait for request queue available\n  }\n  channel->hcchar |= HCCHAR_CHENA;\n  return true;\n}\n\n// Find currently enabled channel. Note: EP0 is bidirectional\nTU_ATTR_ALWAYS_INLINE static inline uint8_t channel_find_enabled(dwc2_regs_t* dwc2, uint8_t dev_addr, uint8_t ep_num, uint8_t ep_dir) {\n  const uint8_t max_channel = dwc2_channel_count(dwc2);\n  for (uint8_t ch_id = 0; ch_id < max_channel; ch_id++) {\n    if (_hcd_data.xfer[ch_id].allocated) {\n      const dwc2_channel_char_t hcchar = {.value = dwc2->channel[ch_id].hcchar};\n      if (hcchar.dev_addr == dev_addr && hcchar.ep_num == ep_num && (ep_num == 0 || hcchar.ep_dir == ep_dir)) {\n        return ch_id;\n      }\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\n\n// Allocate a new endpoint\nTU_ATTR_ALWAYS_INLINE static inline uint8_t edpt_alloc(void) {\n  for (uint32_t i = 0; i < CFG_TUH_DWC2_ENDPOINT_MAX; i++) {\n    hcd_endpoint_t* edpt = &_hcd_data.edpt[i];\n    if (edpt->hcchar_bm.enable == 0) {\n      tu_memclr(edpt, sizeof(hcd_endpoint_t));\n      edpt->hcchar_bm.enable = 1;\n      return i;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline void edpt_dealloc(hcd_endpoint_t *edpt) {\n  edpt->hcchar_bm.enable = 0;\n}\n\n// close an opened endpoint\nstatic void edpt_close(dwc2_regs_t *dwc2, uint8_t ep_id) {\n  hcd_endpoint_t *edpt = &_hcd_data.edpt[ep_id];\n  edpt->closing        = 1; // mark endpoint as closing\n\n  // disable active channel belong to this endpoint\n  for (uint8_t ch_id = 0; ch_id < DWC2_CHANNEL_COUNT_MAX; ch_id++) {\n    hcd_xfer_t *xfer = &_hcd_data.xfer[ch_id];\n    if (xfer->allocated && xfer->ep_id == ep_id) {\n      dwc2_channel_t *channel = &dwc2->channel[ch_id];\n      xfer->closing           = 1;\n      channel_disable(dwc2, channel);\n      return; // only 1 active channel per endpoint\n    }\n  }\n\n  edpt_dealloc(edpt); // no active channel, safe to de-alloc now\n}\n\n// Find an endpoint that is opened previously with hcd_edpt_open()\n// Note: EP0 is bidirectional\nTU_ATTR_ALWAYS_INLINE static inline uint8_t edpt_find_opened(uint8_t dev_addr, uint8_t ep_num, uint8_t ep_dir) {\n  for (uint8_t i = 0; i < (uint8_t)CFG_TUH_DWC2_ENDPOINT_MAX; i++) {\n    const hcd_endpoint_t     *edpt      = &_hcd_data.edpt[i];\n    const dwc2_channel_char_t hcchar_bm = edpt->hcchar_bm;\n    if (hcchar_bm.enable && hcchar_bm.dev_addr == dev_addr && hcchar_bm.ep_num == ep_num &&\n        (ep_num == 0 || hcchar_bm.ep_dir == ep_dir)) {\n      return i;\n    }\n  }\n  return TUSB_INDEX_INVALID_8;\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint16_t cal_packet_count(uint16_t len, uint16_t ep_size) {\n  if (len == 0) {\n    return 1;\n  } else {\n    return tu_div_ceil(len, ep_size);\n  }\n}\n\nTU_ATTR_ALWAYS_INLINE static inline uint8_t cal_next_pid(uint8_t pid, uint8_t packet_count) {\n  if (packet_count & 0x01u) {\n    return pid ^ 0x02u; // toggle DATA0 and DATA1\n  } else {\n    return pid;\n  }\n}\n\n//--------------------------------------------------------------------\n//\n//--------------------------------------------------------------------\n\n/* USB Data FIFO Layout\n\n  The FIFO is split up into\n  - EPInfo: for storing DMA metadata (check dcd_dwc2.c for more details)\n  - 1 RX FIFO: for receiving data\n  - 1 TX FIFO for non-periodic (NPTX)\n  - 1 TX FIFO for periodic (PTX)\n\n  We allocated TX FIFO from top to bottom (using top pointer), this to allow the RX FIFO to grow dynamically which is\n  possible since the free space is located between the RX and TX FIFOs.\n\n   ----------------- ep_fifo_size\n  |    HCDMAn    |\n  |--------------|-- gdfifocfg.EPINFOBASE (max is ghwcfg3.dfifo_depth)\n  | Non-Periodic |\n  |   TX FIFO    |\n  |--------------|--- GNPTXFSIZ.addr (fixed size)\n  |   Periodic   |\n  |   TX FIFO    |\n  |--------------|--- HPTXFSIZ.addr (expandable downward)\n  |    FREE      |\n  |              |\n  |--------------|-- GRXFSIZ (expandable upward)\n  |  RX FIFO     |\n  ---------------- 0\n*/\n\n/* Programming Guide 2.1.2 FIFO RAM allocation\n * RX\n * - Largest-EPsize/4 + 2 (status info). recommended x2 if high bandwidth or multiple ISO are used.\n * - 2 for transfer complete and channel halted status\n * - 1 for each Control/Bulk out endpoint to Handle NAK/NYET (i.e max is number of host channel)\n *\n * TX non-periodic (NPTX)\n * - At least largest-EPsize/4, recommended x2\n *\n * TX periodic (PTX)\n * - At least largest-EPsize*MulCount/4 (MulCount up to 3 for high-bandwidth ISO/interrupt)\n*/\nstatic void dfifo_host_init(uint8_t rhport, bool is_hs_phy) {\n  const dwc2_controller_t* dwc2_controller = &_dwc2_controller[rhport];\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const dwc2_ghwcfg2_t ghwcfg2 = {.value = dwc2->ghwcfg2};\n\n  // Scatter/Gather DMA mode is not yet supported. Buffer DMA only need 1 words per channel\n  const bool is_dma = dma_host_enabled(dwc2);\n  uint16_t dfifo_top = dwc2_controller->ep_fifo_size/4;\n  if (is_dma) {\n    dfifo_top -= ghwcfg2.num_host_ch;\n  }\n\n  // fixed allocation for now, improve later:\n  // - ptx_largest is limited to 256 for FS since most FS core only has 1024 bytes total\n  uint32_t nptx_largest = is_hs_phy ? TUSB_EPSIZE_BULK_HS / 4 : TUSB_EPSIZE_BULK_FS / 4;\n  uint32_t ptx_largest  = is_hs_phy ? TUSB_EPSIZE_ISO_HS_MAX / 4 : 256 / 4;\n\n  uint16_t nptxfsiz = 2 * nptx_largest;\n  uint16_t rxfsiz = 2 * (ptx_largest + 2) + ghwcfg2.num_host_ch;\n  TU_ASSERT(dfifo_top >= (nptxfsiz + rxfsiz),);\n  uint16_t ptxfsiz = dfifo_top - (nptxfsiz + rxfsiz);\n\n  dwc2->gdfifocfg = (dfifo_top << GDFIFOCFG_EPINFOBASE_SHIFT) | dfifo_top;\n\n  dfifo_top -= rxfsiz;\n  dwc2->grxfsiz = rxfsiz;\n\n  dfifo_top -= nptxfsiz;\n  dwc2->gnptxfsiz = tu_u32_from_u16(nptxfsiz, dfifo_top);\n\n  dfifo_top -= ptxfsiz;\n  dwc2->hptxfsiz = tu_u32_from_u16(ptxfsiz, dfifo_top);\n}\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n// optional hcd configuration, called by tuh_configure()\nbool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {\n  (void) rhport;\n  TU_VERIFY(cfg_id == TUH_CFGID_DWC2 && cfg_param != NULL);\n  tuh_configure_param_t const* cfg = (tuh_configure_param_t const*) cfg_param;\n  _tuh_cfg = cfg->dwc2;\n  return true;\n}\n\n// Initialize controller to host mode\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  tu_memclr(&_hcd_data, sizeof(_hcd_data));\n\n  // Core Initialization\n  const bool is_hs_phy = dwc2_core_is_highspeed_phy(dwc2, _tuh_cfg.use_hs_phy);\n  const bool is_dma = dma_host_enabled(dwc2);\n  TU_ASSERT(dwc2_core_init(rhport, is_hs_phy, is_dma));\n\n  //------------- 3.1 Host Initialization -------------//\n  // Enable HFIR reload\n  if (dwc2->gsnpsid >= DWC2_CORE_REV_2_92a) {\n    dwc2->hfir |= HFIR_RELOAD_CTRL;\n  }\n\n  // force host mode and wait for mode switch\n  dwc2->gusbcfg = (dwc2->gusbcfg & ~GUSBCFG_FDMOD) | GUSBCFG_FHMOD;\n  while ((dwc2->gintsts & GINTSTS_CMOD) != GINTSTS_CMODE_HOST) {}\n\n  #ifdef TUP_USBIP_DWC2_STM32\n  dwc2_stm32_gccfg_cfg(dwc2, false, true);\n  #endif\n\n  if (is_hs_phy && (rh_init->speed == TUSB_SPEED_HIGH || rh_init->speed == TUSB_SPEED_AUTO)) {\n    dwc2->hcfg &= ~HCFG_FSLS_ONLY; // max speed\n  } else {\n    dwc2->hcfg |= HCFG_FSLS_ONLY;  // disable high speed mode\n  }\n\n  // configure a fixed-allocated fifo scheme\n  dfifo_host_init(rhport, is_hs_phy);\n\n  dwc2->hprt = HPRT_W1_MASK; // clear all write-1-clear bits\n  dwc2->hprt = HPRT_POWER; // turn on VBUS\n\n  // Enable required interrupts\n  dwc2->gintmsk |= GINTSTS_OTGINT | GINTSTS_HPRTINT | GINTSTS_HCINT | GINTSTS_DISCINT;\n\n  // NPTX can hold at least 2 packet, change interrupt level to half-empty\n  uint32_t gahbcfg = dwc2->gahbcfg & ~GAHBCFG_TX_FIFO_EPMTY_LVL;\n  gahbcfg |= GAHBCFG_GINT;   // Enable global interrupt\n  dwc2->gahbcfg = gahbcfg;\n\n  return true;\n}\n\nbool hcd_deinit(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  // Turn off VBUS\n  dwc2->hprt = HPRT_W1_MASK; // clear w1c bits without side effects\n  // HPRT_POWER is not set -> VBUS off\n\n  dwc2_core_deinit(rhport);\n  return true;\n}\n\n// Enable USB interrupt\nvoid hcd_int_enable (uint8_t rhport) {\n  dwc2_int_set(rhport, TUSB_ROLE_HOST, true);\n}\n\n// Disable USB interrupt\nvoid hcd_int_disable(uint8_t rhport) {\n  dwc2_int_set(rhport, TUSB_ROLE_HOST, false);\n}\n\n// Get frame number (1ms)\nuint32_t hcd_frame_number(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  return dwc2->hfnum & HFNUM_FRNUM_Msk;\n}\n\n//--------------------------------------------------------------------+\n// Port API\n//--------------------------------------------------------------------+\n\n// Get the current connect status of roothub port\nbool hcd_port_connect_status(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  return dwc2->hprt & HPRT_CONN_STATUS;\n}\n\n// Reset USB bus on the port. Return immediately, bus reset sequence may not be complete.\n// Some port would require hcd_port_reset_end() to be invoked after 10ms to complete the reset sequence.\nvoid hcd_port_reset(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  uint32_t hprt = dwc2->hprt & ~HPRT_W1_MASK;\n  hprt |= HPRT_RESET;\n  dwc2->hprt = hprt;\n}\n\n// Complete bus reset sequence, may be required by some controllers\nvoid hcd_port_reset_end(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  uint32_t hprt = dwc2->hprt & ~HPRT_W1_MASK; // skip w1c bits\n  hprt &= ~HPRT_RESET;\n  dwc2->hprt = hprt;\n}\n\n// Get port link speed\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const tusb_speed_t speed = hprt_speed_get(dwc2);\n  return speed;\n}\n\n// HCD closes all opened endpoints belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  for (uint8_t ep_id = 0; ep_id < CFG_TUH_DWC2_ENDPOINT_MAX; ep_id++) {\n    const hcd_endpoint_t *edpt = &_hcd_data.edpt[ep_id];\n    if (edpt->hcchar_bm.enable && edpt->hcchar_bm.dev_addr == dev_addr) {\n      edpt_close(dwc2, ep_id);\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\n\n// Open an endpoint\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, const tusb_desc_endpoint_t* desc_ep) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const tusb_speed_t rh_speed = hprt_speed_get(dwc2);\n\n  tuh_bus_info_t bus_info;\n  tuh_bus_info_get(dev_addr, &bus_info);\n\n  // find a free endpoint\n  const uint8_t ep_id = edpt_alloc();\n  TU_ASSERT(ep_id < CFG_TUH_DWC2_ENDPOINT_MAX);\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n\n  dwc2_channel_char_t* hcchar_bm = &edpt->hcchar_bm;\n  hcchar_bm->ep_size         = tu_edpt_packet_size(desc_ep);\n  hcchar_bm->ep_num          = tu_edpt_number(desc_ep->bEndpointAddress);\n  hcchar_bm->ep_dir          = tu_edpt_dir(desc_ep->bEndpointAddress);\n  hcchar_bm->low_speed_dev   = (bus_info.speed == TUSB_SPEED_LOW) ? 1 : 0;\n  hcchar_bm->ep_type         = desc_ep->bmAttributes.xfer; // ep_type matches TUSB_XFER_*\n  hcchar_bm->err_multi_count = 0;\n  hcchar_bm->dev_addr        = dev_addr;\n  hcchar_bm->odd_frame       = 0;\n  hcchar_bm->disable         = 0;\n  hcchar_bm->enable          = 1;\n\n  dwc2_channel_split_t* hcsplt_bm = &edpt->hcsplt_bm;\n  hcsplt_bm->hub_port        = bus_info.hub_port;\n  hcsplt_bm->hub_addr        = bus_info.hub_addr;\n  hcsplt_bm->xact_pos        = 0;\n  hcsplt_bm->split_compl     = 0;\n  hcsplt_bm->split_en        = (rh_speed == TUSB_SPEED_HIGH && bus_info.speed != TUSB_SPEED_HIGH) ? 1 : 0;\n\n  edpt->speed = bus_info.speed;\n  edpt->next_pid = HCTSIZ_PID_DATA0;\n  switch (desc_ep->bmAttributes.xfer) {\n    case TUSB_XFER_ISOCHRONOUS:\n      edpt->uframe_interval = 1 << (desc_ep->bInterval - 1);\n      if (bus_info.speed == TUSB_SPEED_FULL) {\n        edpt->uframe_interval <<= 3;\n      }\n      break;\n\n    case TUSB_XFER_INTERRUPT:\n      if (bus_info.speed == TUSB_SPEED_HIGH) {\n        edpt->uframe_interval = 1 << (desc_ep->bInterval - 1);\n      } else {\n        edpt->uframe_interval = desc_ep->bInterval << 3;\n      }\n      break;\n\n    default:\n      break;\n  }\n\n  return true;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  dwc2_regs_t  *dwc2   = DWC2_REG(rhport);\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = tu_edpt_dir(ep_addr);\n  const uint8_t ep_id  = edpt_find_opened(daddr, ep_num, ep_dir);\n  TU_ASSERT(ep_id < CFG_TUH_DWC2_ENDPOINT_MAX);\n\n  edpt_close(dwc2, ep_id);\n\n  return true;\n}\n\n// clean up channel after part of transfer is done but the whole urb is not complete\nstatic void channel_xfer_out_wrapup(dwc2_regs_t* dwc2, uint8_t ch_id) {\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  const dwc2_channel_t* channel = &dwc2->channel[ch_id];\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n\n  const dwc2_channel_tsize_t hctsiz = {.value = channel->hctsiz};\n  edpt->next_pid = hctsiz.pid; // save PID\n\n  /* Since hctsiz.xfersize field reflects the number of bytes transferred via the AHB, not the USB)\n   * For IN: we can use hctsiz.xfersize as remaining bytes.\n   * For OUT: Must use the hctsiz.pktcnt field to determine how much data has been transferred. This field reflects the\n   * number of packets that have been transferred via the USB. This is always an integral number of packets if the\n   * transfer was halted before its normal completion.\n   */\n  const uint16_t remain_packets = hctsiz.packet_count;\n  const dwc2_channel_char_t hcchar = {.value = channel->hcchar};\n  const uint16_t total_packets = cal_packet_count(edpt->buflen, hcchar.ep_size);\n  const uint16_t actual_bytes = (total_packets - remain_packets) * hcchar.ep_size;\n\n  xfer->fifo_bytes = 0;\n  xfer->xferred_bytes += actual_bytes;\n  edpt->buffer += actual_bytes;\n  edpt->buflen -= actual_bytes;\n}\n\nstatic bool channel_xfer_start(dwc2_regs_t* dwc2, uint8_t ch_id) {\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n  dwc2_channel_char_t* hcchar_bm = &edpt->hcchar_bm;\n  dwc2_channel_t* channel = &dwc2->channel[ch_id];\n  bool const is_period = channel_is_periodic(edpt->hcchar);\n\n  // clear previous state\n  xfer->fifo_bytes = 0;\n\n  // hchar: restore but don't enable yet\n  if (is_period) {\n    hcchar_bm->odd_frame = 1 - (dwc2->hfnum & 1);   // transfer on next frame\n  }\n  channel->hcchar = (edpt->hcchar & ~HCCHAR_CHENA);\n\n  // hctsiz: zero length packet still count as 1\n  const uint16_t packet_count = cal_packet_count(edpt->buflen, hcchar_bm->ep_size);\n  dwc2_channel_tsize_t hctsiz = {.value = 0};\n  hctsiz.pid = edpt->next_pid; // next PID is set in transfer complete interrupt\n  hctsiz.packet_count = packet_count;\n  hctsiz.xfer_size = edpt->buflen;\n  if (edpt->next_do_ping && edpt->speed == TUSB_SPEED_HIGH &&\n     edpt->next_pid != HCTSIZ_PID_SETUP && hcchar_bm->ep_dir == TUSB_DIR_OUT) {\n    hctsiz.do_ping = 1;\n  }\n  channel->hctsiz = hctsiz.value;\n  edpt->next_do_ping = 0;\n\n  // pre-calculate next PID based on packet count, adjusted in transfer complete interrupt if short packet\n  if (hcchar_bm->ep_num == 0) {\n    edpt->next_pid = HCTSIZ_PID_DATA1; // control data and status stage always start with DATA1\n  } else {\n    edpt->next_pid = cal_next_pid(edpt->next_pid, packet_count);\n  }\n\n  channel->hcsplt = edpt->hcsplt;\n  channel->hcint = 0xFFFFFFFFU; // clear all channel interrupts\n\n  if (dma_host_enabled(dwc2)) {\n    channel->hcintmsk = HCINT_HALTED;\n    dwc2->haintmsk |= TU_BIT(ch_id);\n\n    channel->hcdma = (uint32_t) edpt->buffer;\n\n    if (hcchar_bm->ep_dir == TUSB_DIR_IN) {\n      channel_send_in_token(dwc2, channel);\n    } else {\n      hcd_dcache_clean(edpt->buffer, edpt->buflen);\n      channel->hcchar |= HCCHAR_CHENA;\n    }\n  } else {\n    uint32_t hcintmsk = HCINT_NAK | HCINT_XACT_ERR | HCINT_STALL | HCINT_XFER_COMPLETE | HCINT_DATATOGGLE_ERR;\n    if (hcchar_bm->ep_dir == TUSB_DIR_IN) {\n      hcintmsk |= HCINT_BABBLE_ERR | HCINT_DATATOGGLE_ERR | HCINT_ACK;\n    } else {\n      hcintmsk |= HCINT_NYET;\n      if (edpt->hcsplt_bm.split_en || hctsiz.do_ping) {\n        hcintmsk |= HCINT_ACK;\n      }\n    }\n    channel->hcintmsk = hcintmsk;\n    dwc2->haintmsk |= TU_BIT(ch_id);\n\n    // enable channel for slave mode:\n    // - OUT: it will enable corresponding FIFO channel\n    // - IN : it will write an IN request to the Non-periodic Request Queue, this will have dwc2 trying to send\n    // IN Token. If we got NAK, we have to re-enable the channel again in the interrupt. Due to the way usbh stack only\n    // call hcd_edpt_xfer() once, we will need to manage de-allocate/re-allocate IN channel dynamically.\n    if (hcchar_bm->ep_dir == TUSB_DIR_IN) {\n      channel_send_in_token(dwc2, channel);\n    } else {\n      channel->hcchar |= HCCHAR_CHENA;\n      if (edpt->buflen > 0) {\n        // To prevent conflict with other channel, we will enable periodic/non-periodic FIFO empty interrupt accordingly\n        // And write packet in the interrupt handler\n        dwc2->gintmsk |= (is_period ? GINTSTS_PTX_FIFO_EMPTY : GINTSTS_NPTX_FIFO_EMPTY);\n      }\n    }\n  }\n\n  return true;\n}\n\n// kick-off transfer with an endpoint\nstatic bool edpt_xfer_kickoff(dwc2_regs_t* dwc2, uint8_t ep_id) {\n  uint8_t ch_id = channel_alloc(dwc2);\n  TU_ASSERT(ch_id < 16); // all channel are in used\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  xfer->ep_id = ep_id;\n  xfer->result = XFER_RESULT_INVALID;\n\n  return channel_xfer_start(dwc2, ch_id);\n}\n\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t buflen) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = tu_edpt_dir(ep_addr);\n\n  uint8_t ep_id = edpt_find_opened(dev_addr, ep_num, ep_dir);\n  TU_ASSERT(ep_id < CFG_TUH_DWC2_ENDPOINT_MAX);\n  hcd_endpoint_t *edpt = &_hcd_data.edpt[ep_id];\n  TU_VERIFY(edpt->closing == 0); // skip if endpoint is closing\n\n  edpt->buffer = buffer;\n  edpt->buflen = buflen;\n\n  if (ep_num == 0) {\n    // update ep_dir since control endpoint can switch direction\n    edpt->hcchar_bm.ep_dir = ep_dir;\n  }\n\n  return edpt_xfer_kickoff(dwc2, ep_id);\n}\n\n// Abort a queued transfer. Note: it can only abort transfer that has not been started\n// Return true if a queued transfer is aborted, false if there is no transfer to abort\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = tu_edpt_dir(ep_addr);\n  const uint8_t ep_id = edpt_find_opened(dev_addr, ep_num, ep_dir);\n  TU_VERIFY(ep_id < CFG_TUH_DWC2_ENDPOINT_MAX);\n\n  // hcd_int_disable(rhport);\n\n  // Find enabled channeled and disable it, channel will be de-allocated in the interrupt handler\n  const uint8_t ch_id = channel_find_enabled(dwc2, dev_addr, ep_num, ep_dir);\n  if (ch_id < 16) {\n    dwc2_channel_t* channel = &dwc2->channel[ch_id];\n    channel_disable(dwc2, channel);\n  }\n\n  // hcd_int_enable(rhport);\n\n  return true;\n}\n\n// Submit a special transfer to send 8-byte Setup Packet, when complete hcd_event_xfer_complete() must be invoked\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, const uint8_t setup_packet[8]) {\n  uint8_t ep_id = edpt_find_opened(dev_addr, 0, TUSB_DIR_OUT);\n  TU_ASSERT(ep_id < CFG_TUH_DWC2_ENDPOINT_MAX); // no opened endpoint\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n  edpt->next_pid = HCTSIZ_PID_SETUP;\n\n  return hcd_edpt_xfer(rhport, dev_addr, 0, (uint8_t*)(uintptr_t) setup_packet, 8);\n}\n\n// clear stall, data toggle is also reset to DATA0\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  const uint8_t ep_num = tu_edpt_number(ep_addr);\n  const uint8_t ep_dir = tu_edpt_dir(ep_addr);\n  const uint8_t ep_id = edpt_find_opened(dev_addr, ep_num, ep_dir);\n  TU_VERIFY(ep_id < CFG_TUH_DWC2_ENDPOINT_MAX);\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[ep_id];\n\n  edpt->next_pid = HCTSIZ_PID_DATA0;\n\n  return true;\n}\n\n//--------------------------------------------------------------------\n// HCD Event Handler\n//--------------------------------------------------------------------\n\n// retry an IN transfer, channel must be halted\nstatic void channel_xfer_in_retry(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t hcint) {\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n  dwc2_channel_t* channel = &dwc2->channel[ch_id];\n  dwc2_channel_char_t hcchar = {.value = channel->hcchar};\n\n  if (channel_is_periodic(hcchar.value)){\n    const dwc2_channel_split_t hcsplt = {.value = channel->hcsplt};\n    // retry immediately for periodic split NYET if we haven't reach max retry\n    if (hcsplt.split_en && hcsplt.split_compl && (hcint & HCINT_NYET || xfer->halted_nyet)) {\n      xfer->period_split_nyet_count++;\n      xfer->halted_nyet = 0;\n      if (xfer->period_split_nyet_count < HCD_XFER_PERIOD_SPLIT_NYET_MAX) {\n        hcchar.odd_frame = 1 - (dwc2->hfnum & 1); // transfer on next frame\n        channel->hcchar = hcchar.value;\n        channel_send_in_token(dwc2, channel);\n        return;\n      } else {\n        // too many NYET, de-allocate channel with below code\n        xfer->period_split_nyet_count = 0;\n      }\n    }\n\n    const uint32_t ucount = (hprt_speed_get(dwc2) == TUSB_SPEED_HIGH ? 1 : 8);\n    if (edpt->uframe_interval == ucount) {\n      // retry on next frame if bInterval is 1\n      hcchar.odd_frame = 1 - (dwc2->hfnum & 1);\n      channel->hcchar = hcchar.value;\n      channel_send_in_token(dwc2, channel);\n    } else {\n      // otherwise, de-allocate channel, enable SOF set frame counter for later transfer\n      const dwc2_channel_tsize_t hctsiz = {.value = channel->hctsiz};\n      edpt->next_pid = hctsiz.pid; // save PID\n      edpt->uframe_countdown = edpt->uframe_interval - ucount;\n      // enable SOF interrupt if not already enabled\n      if (0 == (dwc2->gintmsk & GINTMSK_SOFM)) {\n        dwc2->gintsts = GINTSTS_SOF;\n        dwc2->gintmsk |= GINTMSK_SOFM;\n      }\n      // already halted, de-allocate channel (called from DMA isr)\n      channel_dealloc(dwc2, ch_id);\n    }\n  } else {\n    // for control/bulk: retry immediately\n    channel_send_in_token(dwc2, channel);\n  }\n}\n\n#if CFG_TUSB_DEBUG && 0\nTU_ATTR_ALWAYS_INLINE static inline void print_hcint(uint32_t hcint) {\n  const char* str[] = {\n    \"XFRC\", \"HALTED\", \"AHBERR\", \"STALL\",\n    \"NAK\", \"ACK\", \"NYET\", \"XERR\",\n    \"BBLERR\", \"FRMOR\", \"DTERR\", \"BNA\",\n    \"XCSERR\", \"DESC_LST\"\n  };\n\n  for(uint32_t i=0; i<14; i++) {\n    if (hcint & TU_BIT(i)) {\n      TU_LOG1(\"%s \", str[i]);\n    }\n  }\n  TU_LOG1(\"\\r\\n\");\n}\n#endif\n\n#if CFG_TUH_DWC2_SLAVE_ENABLE\nstatic void handle_rxflvl_irq(uint8_t rhport) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n\n  // Pop control word off FIFO\n  const dwc2_grxstsp_t grxstsp = {.value= dwc2->grxstsp};\n  const uint8_t ch_id = grxstsp.ep_ch_num;\n\n  switch (grxstsp.packet_status) {\n    case GRXSTS_PKTSTS_RX_DATA: {\n      // In packet received, pop this entry --> ACK interrupt\n      const uint16_t byte_count = grxstsp.byte_count;\n      hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n      TU_ASSERT(xfer->ep_id < CFG_TUH_DWC2_ENDPOINT_MAX,);\n      hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n\n      if (byte_count > 0) {\n        tu_hwfifo_read(dwc2->fifo[0], edpt->buffer + xfer->xferred_bytes, byte_count, NULL);\n        xfer->xferred_bytes += byte_count;\n        xfer->fifo_bytes = byte_count;\n      }\n      break;\n    }\n\n    case GRXSTS_PKTSTS_RX_COMPLETE:\n      // In transfer complete: After this entry is popped from the rx FIFO, dwc2 asserts a Transfer Completed\n      // interrupt --> handle_channel_irq()\n      break;\n\n    case GRXSTS_PKTSTS_HOST_DATATOGGLE_ERR:\n      // handle in channel interrupt\n      break;\n\n    case GRXSTS_PKTSTS_HOST_CHANNEL_HALTED:\n      // triggered when channel.hcchar_bm.disable is set\n      // TODO handle later\n      break;\n\n    default: break; // ignore other status\n  }\n}\n\n// return true if there is still pending data and need more ISR\nstatic bool handle_txfifo_empty(dwc2_regs_t* dwc2, bool is_periodic) {\n  // Use period txsts for both p/np to get request queue space available (1-bit difference, it is small enough)\n  const dwc2_hptxsts_t txsts = {.value = (is_periodic ? dwc2->hptxsts : dwc2->hnptxsts)};\n\n  const uint8_t max_channel = dwc2_channel_count(dwc2);\n  for (uint8_t ch_id = 0; ch_id < max_channel; ch_id++) {\n    dwc2_channel_t* channel = &dwc2->channel[ch_id];\n    const dwc2_channel_char_t hcchar = {.value = channel->hcchar};\n    // skip writing to FIFO if channel is expecting halted.\n    if (0 == (channel->hcintmsk & HCINT_HALTED) && (hcchar.ep_dir == TUSB_DIR_OUT)) {\n      hcd_xfer_t *xfer = &_hcd_data.xfer[ch_id];\n      TU_ASSERT(xfer->ep_id < CFG_TUH_DWC2_ENDPOINT_MAX);\n      hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n      const dwc2_channel_tsize_t hctsiz = {.value = channel->hctsiz};\n      const uint16_t remain_packets = hctsiz.packet_count;\n      for (uint16_t i = 0; i < remain_packets; i++) {\n        const uint16_t remain_bytes = edpt->buflen - xfer->fifo_bytes;\n        const uint16_t xact_bytes = tu_min16(remain_bytes, hcchar.ep_size);\n\n        // skip if there is not enough space in FIFO and RequestQueue.\n        // Packet's last word written to FIFO will trigger a request queue\n        if ((xact_bytes > (txsts.fifo_available << 2)) || (txsts.req_queue_available == 0)) {\n          return true;\n        }\n\n        tu_hwfifo_write(dwc2->fifo[ch_id], edpt->buffer + xfer->fifo_bytes, xact_bytes, NULL);\n        xfer->fifo_bytes += xact_bytes;\n      }\n    }\n  }\n\n  return false; // no channel has pending data\n}\n\nstatic bool handle_channel_in_slave(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t hcint) {\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  dwc2_channel_t* channel = &dwc2->channel[ch_id];\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n  dwc2_channel_split_t hcsplt = {.value = channel->hcsplt};\n  const dwc2_channel_tsize_t hctsiz = {.value = channel->hctsiz};\n  bool is_done = false;\n\n  // if (hcsplt.split_en) {\n  // if (edpt->hcchar_bm.ep_num == 1) {\n  //   TU_LOG1(\"Frame %u, ch %u: ep %u, hcint 0x%04lX \", dwc2->hfnum_bm.num, ch_id, hcsplt.ep_num, hcint);\n  //   print_hcint(hcint);\n  // }\n\n  if (hcint & HCINT_XFER_COMPLETE) {\n    if (edpt->hcchar_bm.ep_num != 0) {\n      edpt->next_pid = hctsiz.pid; // save pid (already toggled)\n    }\n\n    const uint16_t remain_packets = hctsiz.packet_count;\n    if (hcsplt.split_en && remain_packets && xfer->fifo_bytes == edpt->hcchar_bm.ep_size) {\n      // Split can only complete 1 transaction (up to 1 packet) at a time, schedule more\n      hcsplt.split_compl = 0;\n      channel->hcsplt = hcsplt.value;\n    } else {\n      xfer->result = XFER_RESULT_SUCCESS;\n    }\n\n    channel_disable(dwc2, channel);\n  } else if (hcint & (HCINT_XACT_ERR | HCINT_BABBLE_ERR | HCINT_STALL)) {\n    if (hcint & HCINT_STALL) {\n      xfer->result = XFER_RESULT_STALLED;\n    } else if (hcint & HCINT_BABBLE_ERR) {\n      xfer->result = XFER_RESULT_FAILED;\n    } else if (hcint & HCINT_XACT_ERR) {\n      xfer->err_count++;\n      channel->hcintmsk |= HCINT_ACK;\n    } else {\n      // nothing to do\n    }\n\n    channel_disable(dwc2, channel);\n  } else if (hcint & HCINT_NYET) {\n    // restart complete split\n    hcsplt.split_compl = 1;\n    channel->hcsplt = hcsplt.value;\n    xfer->halted_nyet = 1;\n    channel_disable(dwc2, channel);\n  } else if (hcint & HCINT_NAK) {\n    // NAK received, disable channel to flush all posted request and try again\n    if (hcsplt.split_en == 1u) {\n      hcsplt.split_compl = 0; // restart with start-split\n      channel->hcsplt = hcsplt.value;\n    }\n\n    channel_disable(dwc2, channel);\n  } else if (hcint & HCINT_ACK) {\n    xfer->err_count = 0;\n\n    if (hcsplt.split_en == 1u) {\n      if (hcsplt.split_compl == 0) {\n        // start split is ACK --> do complete split\n        channel->hcintmsk |= HCINT_NYET;\n        hcsplt.split_compl = 1;\n        channel->hcsplt = hcsplt.value;\n        channel_send_in_token(dwc2, channel);\n      } else {\n        // do nothing for complete split with DATA, this will trigger XferComplete and handled there\n      }\n    } else {\n      // ACK with data\n      const uint16_t remain_packets = hctsiz.packet_count;\n      if (remain_packets > 0) {\n        // still more packet to receive, also reset to start split\n        hcsplt.split_compl = 0;\n        channel->hcsplt = hcsplt.value;\n        channel_send_in_token(dwc2, channel);\n      }\n    }\n  } else if (hcint & HCINT_HALTED) {\n    channel->hcintmsk &= ~HCINT_HALTED;\n    if (xfer->result != XFER_RESULT_INVALID) {\n      is_done = true;\n    } else if (xfer->err_count == HCD_XFER_ERROR_MAX) {\n      xfer->result = XFER_RESULT_FAILED;\n      is_done      = true;\n    } else if (xfer->closing == 1) {\n      is_done = true;\n    } else {\n      // got here due to NAK or NYET\n      channel_xfer_in_retry(dwc2, ch_id, hcint);\n    }\n  } else if (hcint & HCINT_DATATOGGLE_ERR) {\n    channel->hcintmsk &= ~HCINT_DATATOGGLE_ERR;\n    xfer->err_count = 0;\n    hcsplt.split_compl = 0; // restart with start-split\n    channel->hcsplt = hcsplt.value;\n    channel_disable(dwc2, channel);\n  } else {\n    // nothing to do\n  }\n  return is_done;\n}\n\nstatic bool handle_channel_out_slave(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t hcint) {\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  dwc2_channel_t* channel = &dwc2->channel[ch_id];\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n  dwc2_channel_split_t hcsplt = {.value = channel->hcsplt};\n  bool is_done = false;\n\n  if (hcint & HCINT_XFER_COMPLETE) {\n    is_done = true;\n    xfer->result = XFER_RESULT_SUCCESS;\n    channel->hcintmsk &= ~HCINT_ACK;\n    if (hcint & HCINT_NYET) {\n      // complete transfer with NYET, do ping next time\n      edpt->next_do_ping = 1;\n    }\n  } else if (hcint & HCINT_STALL) {\n    xfer->result = XFER_RESULT_STALLED;\n    channel_disable(dwc2, channel);\n  } else if (hcint & HCINT_NYET) {\n    xfer->err_count = 0;\n    if (hcsplt.split_en == 1u) {\n      // retry complete split\n      hcsplt.split_compl = 1;\n      channel->hcsplt = hcsplt.value;\n      channel->hcchar |= HCCHAR_CHENA;\n    } else {\n      edpt->next_do_ping = 1;\n      channel_xfer_out_wrapup(dwc2, ch_id);\n      channel_disable(dwc2, channel);\n    }\n  } else if (hcint & (HCINT_NAK | HCINT_XACT_ERR)) {\n    // clean up transfer so far, disable and start again later\n    channel_xfer_out_wrapup(dwc2, ch_id);\n    channel_disable(dwc2, channel);\n    if (hcint & HCINT_XACT_ERR) {\n      xfer->err_count++;\n      channel->hcintmsk |= HCINT_ACK;\n    } else {\n      // NAK disable channel to flush all posted request and try again\n      edpt->next_do_ping = 1;\n      xfer->err_count = 0;\n    }\n  } else if (hcint & HCINT_HALTED) {\n    channel->hcintmsk &= ~HCINT_HALTED;\n    if (xfer->result != XFER_RESULT_INVALID) {\n      is_done = true;\n    } else if (xfer->err_count == HCD_XFER_ERROR_MAX) {\n      xfer->result = XFER_RESULT_FAILED;\n      is_done      = true;\n    } else if (xfer->closing == 1) {\n      is_done = true;\n    } else {\n      // Got here due to NAK or NYET\n      TU_ASSERT(channel_xfer_start(dwc2, ch_id));\n    }\n  } else if (hcint & HCINT_ACK) {\n    xfer->err_count = 0;\n    channel->hcintmsk &= ~HCINT_ACK;\n    if (hcsplt.split_en == 1u) {\n      if (hcsplt.split_compl == 0) {\n        // ACK for start split --> do complete split\n        hcsplt.split_compl = 1;\n        channel->hcsplt = hcsplt.value;\n        channel->hcchar |= HCCHAR_CHENA;\n      }\n    } else {\n      // ACK interrupt is only enabled for Split and PING\n      // ACK for PING, which mean device is ready to receive data\n      channel->hctsiz &= ~HCTSIZ_DOPING; // HC already cleared PING bit, but we clear anyway\n      channel->hcchar |= HCCHAR_CHENA;\n    }\n  } else {\n    // nothing to do\n  }\n\n  if (is_done) {\n    xfer->xferred_bytes += xfer->fifo_bytes;\n    xfer->fifo_bytes = 0;\n  }\n\n  return is_done;\n}\n#endif\n\n#if CFG_TUH_DWC2_DMA_ENABLE\nstatic bool handle_channel_in_dma(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t hcint) {\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  dwc2_channel_t* channel = &dwc2->channel[ch_id];\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n  dwc2_channel_char_t hcchar = {.value = channel->hcchar};\n  dwc2_channel_split_t hcsplt = {.value = channel->hcsplt};\n  const dwc2_channel_tsize_t hctsiz = {.value = channel->hctsiz};\n\n  bool is_done = false;\n\n  // TU_LOG1(\"in  hcint = %02lX\\r\\n\", hcint);\n\n  if (hcint & HCINT_HALTED) {\n    if (hcint & (HCINT_XFER_COMPLETE | HCINT_STALL | HCINT_BABBLE_ERR)) {\n      const uint16_t remain_bytes = (uint16_t) hctsiz.xfer_size;\n      const uint16_t remain_packets = hctsiz.packet_count;\n      const uint16_t actual_len = edpt->buflen - remain_bytes;\n      xfer->xferred_bytes += actual_len;\n\n      is_done = true;\n\n      if (hcint & HCINT_STALL) {\n        xfer->result = XFER_RESULT_STALLED;\n      } else if (hcint & HCINT_BABBLE_ERR) {\n        xfer->result = XFER_RESULT_FAILED;\n      } else if (hcsplt.split_en && remain_packets && actual_len == hcchar.ep_size) {\n        // Split can only complete 1 transaction (up to 1 packet) at a time, schedule more\n        is_done = false;\n        edpt->buffer += actual_len;\n        edpt->buflen -= actual_len;\n\n        hcsplt.split_compl = 0;\n        channel->hcsplt = hcsplt.value;\n        channel_xfer_in_retry(dwc2, ch_id, hcint);\n      } else {\n        xfer->result = XFER_RESULT_SUCCESS;\n      }\n\n      xfer->err_count = 0;\n      channel->hcintmsk &= ~HCINT_ACK;\n    } else if (hcint & HCINT_XACT_ERR) {\n      xfer->err_count++;\n      if (xfer->err_count >=  HCD_XFER_ERROR_MAX) {\n        is_done = true;\n        xfer->result = XFER_RESULT_FAILED;\n      } else {\n        channel->hcintmsk |= HCINT_ACK | HCINT_NAK | HCINT_DATATOGGLE_ERR;\n        hcsplt.split_compl = 0;\n        channel->hcsplt = hcsplt.value;\n        channel_xfer_in_retry(dwc2, ch_id, hcint);\n      }\n    } else if (hcint & HCINT_NYET) {\n      // Must handle nyet before nak or ack. Could get a nyet at the same time as either of those on a BULK/CONTROL\n      // OUT that started with a PING. The nyet takes precedence.\n      if (hcsplt.split_en) {\n        // split not yet mean hub has no data, retry complete split\n        hcsplt.split_compl = 1;\n        channel->hcsplt = hcsplt.value;\n        channel_xfer_in_retry(dwc2, ch_id, hcint);\n      }\n    } else if (hcint & HCINT_ACK) {\n      xfer->err_count = 0;\n      channel->hcintmsk &= ~HCINT_ACK;\n      if (hcsplt.split_en) {\n        // start split is ACK --> do complete split\n        // TODO: for ISO must use xact_pos to plan complete split based on microframe (up to 187.5 bytes/uframe)\n        hcsplt.split_compl = 1;\n        channel->hcsplt = hcsplt.value;\n        if (channel_is_periodic(channel->hcchar)) {\n          hcchar.odd_frame = 1 - (dwc2->hfnum & 1); // transfer on next frame\n          channel->hcchar = hcchar.value;\n        }\n        channel_send_in_token(dwc2, channel);\n      }\n    } else if (hcint & (HCINT_NAK | HCINT_DATATOGGLE_ERR)) {\n      xfer->err_count = 0;\n      channel->hcintmsk &= ~(HCINT_NAK | HCINT_DATATOGGLE_ERR);\n      hcsplt.split_compl = 0; // restart with start-split\n      channel->hcsplt = hcsplt.value;\n      channel_xfer_in_retry(dwc2, ch_id, hcint);\n    } else if (hcint & HCINT_FARME_OVERRUN) {\n      // retry start-split in next binterval\n      channel_xfer_in_retry(dwc2, ch_id, hcint);\n    }\n\n    if (xfer->closing == 1) {\n      is_done = true;\n    }\n  }\n\n  return is_done;\n}\n\nstatic bool handle_channel_out_dma(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t hcint) {\n  hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n  dwc2_channel_t* channel = &dwc2->channel[ch_id];\n  hcd_endpoint_t* edpt = &_hcd_data.edpt[xfer->ep_id];\n  dwc2_channel_split_t hcsplt = {.value = channel->hcsplt};\n\n  bool is_done = false;\n\n  // TU_LOG1(\"out hcint = %02lX\\r\\n\", hcint);\n\n  if (hcint & HCINT_HALTED) {\n    if (hcint & (HCINT_XFER_COMPLETE | HCINT_STALL)) {\n      is_done = true;\n      xfer->err_count = 0;\n      if (hcint & HCINT_XFER_COMPLETE) {\n        xfer->result = XFER_RESULT_SUCCESS;\n        xfer->xferred_bytes += edpt->buflen;\n      } else {\n        xfer->result = XFER_RESULT_STALLED;\n        channel_xfer_out_wrapup(dwc2, ch_id);\n      }\n      channel->hcintmsk &= ~HCINT_ACK;\n    } else if (hcint & HCINT_XACT_ERR) {\n     if (hcint & (HCINT_NAK | HCINT_NYET | HCINT_ACK)) {\n       xfer->err_count = 0;\n       // clean up transfer so far and start again\n       channel_xfer_out_wrapup(dwc2, ch_id);\n       channel_xfer_start(dwc2, ch_id);\n     } else {\n       xfer->err_count++;\n       if (xfer->err_count >= HCD_XFER_ERROR_MAX) {\n         xfer->result = XFER_RESULT_FAILED;\n         is_done = true;\n       } else {\n         // clean up transfer so far and start again\n         channel_xfer_out_wrapup(dwc2, ch_id);\n         channel_xfer_start(dwc2, ch_id);\n       }\n     }\n    } else if (hcint & HCINT_NYET) {\n      if (hcsplt.split_en && hcsplt.split_compl) {\n        // split not yet mean hub has no data, retry complete split\n        hcsplt.split_compl = 1;\n        channel->hcsplt = hcsplt.value;\n        channel->hcchar |= HCCHAR_CHENA;\n      }\n    } else if (hcint & HCINT_ACK) {\n      xfer->err_count = 0;\n      if (hcsplt.split_en && !hcsplt.split_compl) {\n        // start split is ACK --> do complete split\n        hcsplt.split_compl = 1;\n        channel->hcsplt = hcsplt.value;\n        channel->hcchar |= HCCHAR_CHENA;\n      }\n    }\n\n    if (xfer->closing == 1) {\n      is_done = true;\n    }\n  } else if (hcint & HCINT_ACK) {\n    xfer->err_count = 0;\n    channel->hcintmsk &= ~HCINT_ACK;\n  }\n\n  return is_done;\n}\n#endif\n\nstatic void handle_channel_irq(uint8_t rhport, bool in_isr) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const bool is_dma = dma_host_enabled(dwc2);\n  const uint8_t max_channel = dwc2_channel_count(dwc2);\n\n  for (uint8_t ch_id = 0; ch_id < max_channel; ch_id++) {\n    if (tu_bit_test(dwc2->haint, ch_id)) {\n      dwc2_channel_t* channel = &dwc2->channel[ch_id];\n      hcd_xfer_t* xfer = &_hcd_data.xfer[ch_id];\n      TU_ASSERT(xfer->ep_id < CFG_TUH_DWC2_ENDPOINT_MAX,);\n      dwc2_channel_char_t hcchar = {.value = channel->hcchar};\n\n      const uint32_t hcint = channel->hcint;\n      channel->hcint = hcint; // clear interrupt\n\n      bool is_done = false;\n      if (is_dma) {\n        #if CFG_TUH_DWC2_DMA_ENABLE\n        if (hcchar.ep_dir == TUSB_DIR_OUT) {\n          is_done = handle_channel_out_dma(dwc2, ch_id, hcint);\n        } else {\n          is_done = handle_channel_in_dma(dwc2, ch_id, hcint);\n          if (is_done && (channel->hcdma > xfer->xferred_bytes)) {\n            // hcdma is increased by word --> need to align4\n            hcd_dcache_invalidate((void*) tu_align4(channel->hcdma - xfer->xferred_bytes), xfer->xferred_bytes);\n          }\n        }\n        #endif\n      } else {\n        #if CFG_TUH_DWC2_SLAVE_ENABLE\n        if (hcchar.ep_dir == TUSB_DIR_OUT) {\n          is_done = handle_channel_out_slave(dwc2, ch_id, hcint);\n        } else {\n          is_done = handle_channel_in_slave(dwc2, ch_id, hcint);\n        }\n  #endif\n      }\n\n      if (is_done) {\n        if (xfer->closing == 1) {\n          hcd_endpoint_t *edpt = &_hcd_data.edpt[xfer->ep_id];\n          edpt_dealloc(edpt);\n        } else {\n          const uint8_t ep_addr = tu_edpt_addr(hcchar.ep_num, hcchar.ep_dir);\n          hcd_event_xfer_complete(hcchar.dev_addr, ep_addr, xfer->xferred_bytes, (xfer_result_t)xfer->result, in_isr);\n        }\n        channel_dealloc(dwc2, ch_id);\n      }\n    }\n  }\n}\n\n// SOF is enabled for scheduled periodic transfer\nstatic bool handle_sof_irq(uint8_t rhport, bool in_isr) {\n  (void) in_isr;\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  dwc2->gintsts = GINTSTS_SOF; // Clear the SOF interrupt flag\n\n  bool more_isr = false;\n\n  // If highspeed then SOF is 125us, else 1ms\n  const uint32_t ucount = (hprt_speed_get(dwc2) == TUSB_SPEED_HIGH ? 1 : 8);\n\n  for(uint8_t ep_id = 0; ep_id < CFG_TUH_DWC2_ENDPOINT_MAX; ep_id++) {\n    hcd_endpoint_t *edpt = &_hcd_data.edpt[ep_id];\n    if (edpt->closing == 0) {\n      if (edpt->hcchar_bm.enable && channel_is_periodic(edpt->hcchar) && edpt->uframe_countdown > 0) {\n        edpt->uframe_countdown -= tu_min32(ucount, edpt->uframe_countdown);\n        if (edpt->uframe_countdown == 0) {\n          if (!edpt_xfer_kickoff(dwc2, ep_id)) {\n            edpt->uframe_countdown = ucount; // failed to start, try again next frame\n          }\n        }\n\n        more_isr = true;\n      }\n    }\n  }\n\n  return more_isr;\n}\n\n// Config HCFG FS/LS clock and HFIR for SOF interval according to link speed (value is in PHY clock unit)\n// Databook Table 2-2: System Clock Speeds\n// +-----------+------------------+----------+-----------+-------------------+\n// | PHY       | PHY Clock (MHz)  | Width    | HCFG.Sel  | HFIR (clk cycles) |\n// +-----------+------------------+----------+-----------+-------------------+\n// | HS UTMI+  | 30               | 16-bit   | 30_60     | HS:3749 FS:29999  |\n// | HS UTMI+  | 60               |  8-bit   | 30_60     | HS:7499 FS:59999  |\n// | HS ULPI   | 60               |  8-bit   | 30_60     | HS:7499 FS:59999  |\n// | FS (dead.) | 48               | internal | 48        | FS:47999          |\n// | LS via FS | 48 (6 effective) | internal | 6         | LS:47999          |\n// +-----------+------------------+----------+-----------+-------------------+\n// HFIR = (interval_us * phy_clock) - 1, where interval is 125us (HS) or 1000us (FS/LS)\nstatic void port0_enable(dwc2_regs_t* dwc2, tusb_speed_t speed) {\n  uint32_t hcfg = dwc2->hcfg & ~HCFG_FSLS_PHYCLK_SEL;\n\n  const dwc2_gusbcfg_t gusbcfg = {.value = dwc2->gusbcfg};\n  uint32_t             phy_clock;\n\n  if (gusbcfg.phy_sel == GUSBCFG_PHYSEL_FULLSPEED) {\n    phy_clock = 48; // dedicated FS is 48Mhz\n    if (speed == TUSB_SPEED_LOW) {\n      hcfg |= HCFG_FSLS_PHYCLK_SEL_6MHZ;\n    } else {\n      hcfg |= HCFG_FSLS_PHYCLK_SEL_48MHZ;\n    }\n  } else {\n    if (gusbcfg.ulpi_utmi_sel == GUSBCFG_PHYHS_ULPI) {\n      phy_clock = 60; // ULPI 8-bit is 60Mhz\n    } else {\n      // UTMI+ 16-bit is 30Mhz, 8-bit is 60Mhz\n      phy_clock = gusbcfg.phy_if16 ? 30 : 60;\n\n      // Enable UTMI+ low power mode 48Mhz external clock if not highspeed\n      if (speed == TUSB_SPEED_HIGH) {\n        dwc2->gusbcfg &= ~GUSBCFG_PHYLPCS;\n      } else {\n        dwc2->gusbcfg |= GUSBCFG_PHYLPCS;\n        // may need to reset port\n      }\n    }\n    hcfg |= HCFG_FSLS_PHYCLK_SEL_30_60MHZ;\n  }\n\n  dwc2->hcfg = hcfg;\n\n  uint32_t hfir = dwc2->hfir & ~HFIR_FRIVL_Msk;\n  if (speed == TUSB_SPEED_HIGH) {\n    hfir |= 125*phy_clock - 1; // The \"- 1\" is the correct value. The Synopsys databook was corrected in 3.30a\n  } else {\n    hfir |= 1000*phy_clock - 1;\n  }\n\n  dwc2->hfir = hfir;\n}\n\n/* Handle Host Port interrupt, possible source are:\n   - Connection Detection\n   - Enable Change\n   - Over Current Change\n*/\nstatic void handle_hprt_irq(uint8_t rhport, bool in_isr) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const dwc2_hprt_t hprt_bm = {.value = dwc2->hprt};\n  uint32_t hprt = hprt_bm.value & ~HPRT_W1_MASK;\n\n  if (hprt_bm.conn_detected == 1u) {\n    // Port Connect Detect\n    hprt |= HPRT_CONN_DETECT;\n\n    if (hprt_bm.conn_status == 1u) {\n      hcd_event_device_attach(rhport, in_isr);\n    }\n  }\n\n  if (hprt_bm.enable_change == 1u) {\n    // Port enable change\n    hprt |= HPRT_ENABLE_CHANGE;\n\n    if (hprt_bm.enable == 1u) {\n      // Port enable\n      const tusb_speed_t speed = hprt_speed_get(dwc2);\n      port0_enable(dwc2, speed);\n    } else {\n      // TU_ASSERT(false, );\n    }\n  }\n\n  dwc2->hprt = hprt; // clear interrupt\n}\n\n/* Interrupt Hierarchy\n               HCINTn       HPRT\n                 |           |\n               HAINT.CHn     |\n                 |           |\n    GINTSTS :  HCInt     | PrtInt | NPTxFEmp | PTxFEmpp | RXFLVL | SOF\n*/\nvoid hcd_int_handler(uint8_t rhport, bool in_isr) {\n  dwc2_regs_t* dwc2 = DWC2_REG(rhport);\n  const uint32_t gintmsk = dwc2->gintmsk;\n  const uint32_t gintsts = dwc2->gintsts & gintmsk;\n\n  // TU_LOG1_HEX(gintsts);\n\n  if (gintsts & GINTSTS_SOF) {\n    const bool more_sof = handle_sof_irq(rhport, in_isr);\n    if (!more_sof) {\n      dwc2->gintmsk &= ~GINTSTS_SOF;\n    }\n  }\n\n  if (gintsts & GINTSTS_HPRTINT) {\n    // Host port interrupt: source is cleared in HPRT register\n    // TU_LOG1_HEX(dwc2->hprt);\n    handle_hprt_irq(rhport, in_isr);\n  }\n\n  if (gintsts & GINTSTS_HCINT) {\n    // Host Channel interrupt: source is cleared in HCINT register\n    // must be handled after TX FIFO empty\n    handle_channel_irq(rhport, in_isr);\n  }\n\n  if (gintsts & GINTSTS_DISCINT) {\n    // Device disconnected\n    dwc2->gintsts = GINTSTS_DISCINT;\n\n    if (0 == (dwc2->hprt & HPRT_CONN_STATUS)) {\n      hcd_event_device_remove(rhport, in_isr);\n    }\n  }\n\n#if CFG_TUH_DWC2_SLAVE_ENABLE\n  // RxFIFO non-empty interrupt handling\n  if (gintsts & GINTSTS_RXFLVL) {\n    // RXFLVL bit is read-only\n    dwc2->gintmsk &= ~GINTSTS_RXFLVL; // disable RXFLVL interrupt while reading\n\n    do {\n      handle_rxflvl_irq(rhport); // read all packets\n    } while(dwc2->gintsts & GINTSTS_RXFLVL);\n\n    dwc2->gintmsk |= GINTSTS_RXFLVL;\n  }\n\n  if (gintsts & GINTSTS_NPTX_FIFO_EMPTY) {\n    // NPTX FIFO empty interrupt, this is read-only and cleared by hardware when FIFO is written\n    const bool more_nptxfe = handle_txfifo_empty(dwc2, false);\n    if (!more_nptxfe) {\n      // no more pending packet, disable interrupt\n      dwc2->gintmsk &= ~GINTSTS_NPTX_FIFO_EMPTY;\n    }\n  }\n\n  if (gintsts & GINTSTS_PTX_FIFO_EMPTY) {\n    // PTX FIFO empty interrupt, this is read-only and cleared by hardware when FIFO is written\n    const bool more_ptxfe = handle_txfifo_empty(dwc2, true);\n    if (!more_ptxfe) {\n      // no more pending packet, disable interrupt\n      dwc2->gintmsk &= ~GINTSTS_PTX_FIFO_EMPTY;\n    }\n  }\n#endif\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/template/dcd_template.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2018, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && CFG_TUSB_MCU == OPT_MCU_NONE\n\n#include \"device/dcd.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n\n/*------------------------------------------------------------------*/\n/* Device API\n *------------------------------------------------------------------*/\n\n// Initialize controller to device mode\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport; (void) rh_init;\n  return true;\n}\n\n// Enable device interrupt\nvoid dcd_int_enable (uint8_t rhport) {\n  (void) rhport;\n}\n\n// Disable device interrupt\nvoid dcd_int_disable (uint8_t rhport) {\n  (void) rhport;\n}\n\n// Receive Set Address request, mcu port must also include status IN response\nvoid dcd_set_address (uint8_t rhport, uint8_t dev_addr) {\n  (void) rhport;\n  (void) dev_addr;\n}\n\n// Wake up host\nvoid dcd_remote_wakeup (uint8_t rhport) {\n  (void) rhport;\n}\n\n// Connect by enabling internal pull-up resistor on D+/D-\nvoid dcd_connect(uint8_t rhport) {\n  (void) rhport;\n}\n\n// Disconnect by disabling internal pull-up resistor on D+/D-\nvoid dcd_disconnect(uint8_t rhport) {\n  (void) rhport;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void) rhport;\n  (void) en;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n// Configure endpoint's registers according to descriptor\nbool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * ep_desc) {\n  (void) rhport;\n  (void) ep_desc;\n  return false;\n}\n\n// Allocate packet buffer used by ISO endpoints\n// Some MCU need manual packet buffer allocation, we allocate the largest size to avoid clustering\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void) largest_packet_size;\n  return false;\n}\n\n// Configure and enable an ISO endpoint according to descriptor\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep) {\n  (void) rhport;\n  (void) desc_ep;\n  return false;\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport) {\n  (void) rhport;\n}\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to notify the stack\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr) {\n  (void) is_isr;\n  (void) rhport;\n  (void) ep_addr;\n  (void) buffer;\n  (void) total_bytes;\n  return false;\n}\n\n// Submit a transfer where is managed by FIFO, When complete dcd_event_xfer_complete() is invoked to notify the stack - optional, however, must be listed in usbd.c\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr) {\n  (void) is_isr;\n  (void) rhport;\n  (void) ep_addr;\n  (void) ff;\n  (void) total_bytes;\n  return false;\n}\n\n// Stall endpoint\nvoid dcd_edpt_stall (uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n  (void) ep_addr;\n}\n\n// clear stall, data toggle is also reset to DATA0\nvoid dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n  (void) ep_addr;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/template/hcd_template.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && CFG_TUSB_MCU == OPT_MCU_NONE\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n\n//--------------------------------------------------------------------+\n// Controller API\n//--------------------------------------------------------------------+\n\n// optional hcd configuration, called by tuh_configure()\nbool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param) {\n  (void) rhport; (void) cfg_id; (void) cfg_param;\n  return false;\n}\n\n// Initialize controller to host mode\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport; (void) rh_init;\n  return false;\n}\n\n// Interrupt Handler\nvoid hcd_int_handler(uint8_t rhport, bool in_isr) {\n  (void) rhport; (void) in_isr;\n}\n\n// Enable USB interrupt\nvoid hcd_int_enable (uint8_t rhport) {\n  (void) rhport;\n}\n\n// Disable USB interrupt\nvoid hcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n}\n\n// Get frame number (1ms)\nuint32_t hcd_frame_number(uint8_t rhport) {\n  (void) rhport;\n  return 0;\n}\n\n//--------------------------------------------------------------------+\n// Port API\n//--------------------------------------------------------------------+\n\n// Get the current connect status of roothub port\nbool hcd_port_connect_status(uint8_t rhport) {\n  (void) rhport;\n  return false;\n}\n\n// Reset USB bus on the port. Return immediately, bus reset sequence may not be complete.\n// Some port would require hcd_port_reset_end() to be invoked after 10ms to complete the reset sequence.\nvoid hcd_port_reset(uint8_t rhport) {\n  (void) rhport;\n}\n\n// Complete bus reset sequence, may be required by some controllers\nvoid hcd_port_reset_end(uint8_t rhport) {\n  (void) rhport;\n}\n\n// Get port link speed\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  (void) rhport;\n  return TUSB_SPEED_FULL;\n}\n\n// HCD closes all opened endpoints belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  (void) rhport; (void) dev_addr;\n}\n\n//--------------------------------------------------------------------+\n// Endpoints API\n//--------------------------------------------------------------------+\n\n// Open an endpoint\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const * ep_desc) {\n  (void) rhport; (void) dev_addr; (void) ep_desc;\n\n  // NOTE: ep_desc is allocated on the stack when called from usbh_edpt_control_open()\n  // You need to copy the data into a local variable who maintains the state of the endpoint and transfer.\n  // Check _hcd_data in hcd_dwc2.c for example.\n\n  return false;\n}\n\nbool hcd_edpt_close(uint8_t rhport, uint8_t daddr, uint8_t ep_addr) {\n  (void) rhport; (void) daddr; (void) ep_addr;\n  return false; // TODO not implemented yet\n}\n\n// Submit a transfer, when complete hcd_event_xfer_complete() must be invoked\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t buflen) {\n  (void) rhport; (void) dev_addr; (void) ep_addr; (void) buffer; (void) buflen;\n  return false;\n}\n\n// Abort a queued transfer. Note: it can only abort transfer that has not been started\n// Return true if a queued transfer is aborted, false if there is no transfer to abort\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport; (void) dev_addr; (void) ep_addr;\n  return false;\n}\n\n// Submit a special transfer to send 8-byte Setup Packet, when complete hcd_event_xfer_complete() must be invoked\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8]) {\n  (void) rhport; (void) dev_addr; (void) setup_packet;\n  return false;\n}\n\n// clear stall, data toggle is also reset to DATA0\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport; (void) dev_addr; (void) ep_addr;\n  return false;\n}\n\n#endif\n"
  },
  {
    "path": "src/portable/ti/msp430x5xx/dcd_msp430x5xx.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019-2020 William D. Jones\n * Copyright (c) 2019-2020 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && ( CFG_TUSB_MCU == OPT_MCU_MSP430x5xx )\n\n#include \"msp430.h\"\n#include \"device/dcd.h\"\n\n/*------------------------------------------------------------------*/\n/* MACRO TYPEDEF CONSTANT ENUM\n *------------------------------------------------------------------*/\n// usbpllir_mirror and usbmaintl_mirror can be added later if needed.\nstatic volatile uint16_t usbiepie_mirror = 0;\nstatic volatile uint16_t usboepie_mirror = 0;\nstatic volatile uint8_t usbie_mirror = 0;\nstatic volatile uint16_t usbpwrctl_mirror = 0;\nstatic bool in_isr = false;\n\nuint8_t _setup_packet[8];\n\n// Xfer control\ntypedef struct\n{\n  uint8_t * buffer;\n  // tu_fifo_t * ff; // TODO support dcd_edpt_xfer_fifo API\n  uint16_t total_len;\n  uint16_t queued_len;\n  uint16_t max_size;\n  bool short_packet;\n} xfer_ctl_t;\n\nxfer_ctl_t xfer_status[8][2];\n#define XFER_CTL_BASE(_ep, _dir) &xfer_status[_ep][_dir]\n\n// Accessing endpoint regs\ntypedef volatile uint8_t * ep_regs_t;\n\ntypedef enum\n{\n  CNF = 0,\n  BBAX = 1,\n  BCTX = 2,\n  BBAY = 5,\n  BCTY = 6,\n  SIZXY = 7\n} ep_regs_index_t;\n\n#define EP_REGS(epnum, dir) ((ep_regs_t) ((uintptr_t)&USBOEPCNF_1 + 64*dir + 8*(epnum - 1)))\n\nstatic void bus_reset(void)\n{\n  // Hardcoded into the USB core.\n  xfer_status[0][TUSB_DIR_OUT].max_size = 8;\n  xfer_status[0][TUSB_DIR_IN].max_size = 8;\n\n  USBKEYPID = USBKEY;\n\n  // Enable the control EP 0. Also enable Indication Enable- a guard flag\n  // separate from the Interrupt Enable mask.\n  USBOEPCNF_0 |= (UBME | USBIIE);\n  USBIEPCNF_0 |= (UBME | USBIIE);\n\n  // Enable interrupts for this endpoint.\n  USBOEPIE |= BIT0;\n  USBIEPIE |= BIT0;\n\n  // Clear NAK until a setup packet is received.\n  USBOEPCNT_0 &= ~NAK;\n  USBIEPCNT_0 &= ~NAK;\n\n  // Enable responding to packets.\n  USBCTL |= FEN;\n\n  // Dedicated buffers in hardware for SETUP and EP0, no setup needed.\n  // Now safe to respond to SETUP packets.\n  USBIE |= SETUPIE;\n\n  USBKEYPID = 0;\n}\n\n// Controls reset behavior of the USB module on receipt of a bus reset event.\n// - enable: When true, bus reset events will cause a reset the USB module.\nstatic void enable_functional_reset(const bool enable)\n{\n  // Check whether or not the USB configuration registers were\n  // locked prior to this function being called so that, if\n  // necessary, the lock state can be restored on exit.\n  bool unlocked = (USBKEYPID == 0xA528) ? true : false;\n\n  if(!unlocked) USBKEYPID = USBKEY;\n\n  if(enable)\n  {\n    USBCTL |= FRSTE;\n  }\n  else\n  {\n    USBCTL &= ~FRSTE;\n  }\n\n  if(!unlocked) USBKEYPID = 0;\n}\n\n/*------------------------------------------------------------------*/\n/* Controller API\n *------------------------------------------------------------------*/\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport; (void) rh_init;\n\n  USBKEYPID = USBKEY;\n\n  // Enable the module (required to write config regs)!\n  USBCNF |= USB_EN;\n\n  // Reset used interrupts\n  USBOEPIE = 0;\n  USBIEPIE = 0;\n  USBIE = 0;\n  USBOEPIFG = 0;\n  USBIEPIFG = 0;\n  USBIFG = 0;\n  USBPWRCTL &= ~(VUOVLIE | VBONIE | VBOFFIE | VUOVLIFG | VBONIFG | VBOFFIFG);\n  usboepie_mirror = 0;\n  usbiepie_mirror = 0;\n  usbie_mirror = 0;\n  usbpwrctl_mirror = 0;\n\n  USBVECINT = 0;\n\n  if(USBPWRCTL & USBBGVBV) {// Bus power detected?\n    USBPWRCTL |= VBOFFIE;   // Enable bus-power-removed interrupt.\n    USBIE |= RSTRIE;        // Enable reset and wait for it before continuing.\n    USBCNF |= PUR_EN;       // Enable pullup.\n  } else {\n    USBPWRCTL |= VBONIE;    // Enable bus-power-applied interrupt.\n    USBCNF &= ~USB_EN;      // Disable USB module until bus power is detected.\n  }\n\n  USBKEYPID = 0;\n\n  return true;\n}\n\n// There is no \"USB peripheral interrupt disable\" bit on MSP430, so we have\n// to save the relevant registers individually.\n// WARNING: Unlike the ARM/NVIC routines, these functions are _not_ idempotent\n// if you modified the registers saved in between calls so they don't match\n// the mirrors; mirrors will be updated to reflect most recent register\n// contents.\nvoid dcd_int_enable (uint8_t rhport)\n{\n  (void) rhport;\n\n  __bic_SR_register(GIE); // Unlikely to be called in ISR, but let's be safe.\n                          // Also, this cleanly disables all USB interrupts\n                          // atomically from application's POV.\n\n  // This guard is required because tinyusb can enable interrupts without\n  // having disabled them first.\n  if(in_isr)\n  {\n    USBOEPIE = usboepie_mirror;\n    USBIEPIE = usbiepie_mirror;\n    USBIE = usbie_mirror;\n    USBPWRCTL |= usbpwrctl_mirror;\n  }\n\n  in_isr = false;\n  __bis_SR_register(GIE);\n}\n\nvoid dcd_int_disable (uint8_t rhport)\n{\n  (void) rhport;\n\n  __bic_SR_register(GIE);\n  usboepie_mirror = USBOEPIE;\n  usbiepie_mirror = USBIEPIE;\n  usbie_mirror = USBIE;\n  usbpwrctl_mirror = (USBPWRCTL & (VUOVLIE | VBONIE | VBOFFIE));\n  USBOEPIE = 0;\n  USBIEPIE = 0;\n  USBIE = 0;\n  USBPWRCTL &= ~(VUOVLIE | VBONIE | VBOFFIE);\n  in_isr = true;\n  __bis_SR_register(GIE);\n}\n\nvoid dcd_set_address (uint8_t rhport, uint8_t dev_addr)\n{\n  (void) rhport;\n\n  USBFUNADR = dev_addr;\n\n  // Response with status after changing device address\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  dcd_int_disable(rhport);\n\n  USBKEYPID = USBKEY;\n  USBCNF |= PUR_EN; // Enable pullup.\n  USBKEYPID = 0;\n\n  dcd_int_enable(rhport);\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  dcd_int_disable(rhport);\n\n  USBKEYPID = USBKEY;\n  USBCNF &= ~PUR_EN; // Disable pullup.\n  USBKEYPID = 0;\n\n  dcd_int_enable(rhport);\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n/*------------------------------------------------------------------*/\n/* DCD Endpoint port\n *------------------------------------------------------------------*/\n\nbool dcd_edpt_open (uint8_t rhport, tusb_desc_endpoint_t const * desc_edpt)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(desc_edpt->bEndpointAddress);\n  uint8_t const dir   = tu_edpt_dir(desc_edpt->bEndpointAddress);\n\n  // Unsupported endpoint numbers or type (Iso not supported. Control\n  // not supported on nonzero endpoints).\n  if( (epnum > 7) || \\\n      (desc_edpt->bmAttributes.xfer == 0) || \\\n      (desc_edpt->bmAttributes.xfer == 1)) {\n    return false;\n  }\n\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n  xfer->max_size = tu_edpt_packet_size(desc_edpt);\n\n  // Buffer allocation scheme:\n  // For simplicity, only single buffer for now, since tinyusb currently waits\n  // for an xfer to complete before scheduling another one. This means only\n  // the X buffer is used.\n  //\n  // 1904 bytes are available, the max endpoint size supported on msp430 is\n  // 64 bytes. This is enough RAM for all 14 endpoints enabled _with_ double\n  // bufferring (64*14*2 = 1792 bytes). Extra RAM exists for triple and higher\n  // order bufferring, which must be maintained in software.\n  //\n  // For simplicity, each endpoint gets a hardcoded 64 byte chunk (regardless\n  // of actual wMaxPacketSize) whose start address is the following:\n  // addr = 128 * (epnum - 1) + 64 * dir.\n  //\n  // Double buffering equation:\n  // x_addr = 256 * (epnum - 1) + 128 * dir\n  // y_addr = x_addr + 64\n  // Address is right-shifted by 3 to fit into 8 bits.\n\n  uint8_t buf_base = (128 * (epnum - 1) + 64 * dir) >> 3;\n\n  // IN and OUT EP registers have the same structure.\n  ep_regs_t ep_regs = EP_REGS(epnum, dir);\n\n  // FIXME: I was able to get into a situation where OUT EP 3 would stall\n  // while debugging, despite stall code never being called. It appears\n  // these registers don't get cleared on reset, being part of RAM.\n  // Investigate and see if I can duplicate.\n  // Also, DBUF got set on OUT EP 2 while debugging. Only OUT EPs seem to be\n  // affected at this time. USB RAM directly precedes main RAM; perhaps I'm\n  // overwriting registers via buffer overflow w/ my debugging code?\n  ep_regs[SIZXY] = tu_edpt_packet_size(desc_edpt);\n  ep_regs[BCTX] |= NAK;\n  ep_regs[BBAX] = buf_base;\n  ep_regs[CNF] &= ~(TOGGLE | STALL | DBUF); // ISO xfers not supported on\n                           // MSP430, so no need to gate DATA0/1 and frame\n                           // behavior. Clear stall and double buffer bit as\n                           // well- see above comment.\n  ep_regs[CNF] |= (UBME | USBIIE);\n\n  USBKEYPID = USBKEY;\n  if(dir == TUSB_DIR_OUT)\n  {\n    USBOEPIE |= (1 << epnum);\n  }\n  else\n  {\n    USBIEPIE |= (1 << epnum);\n  }\n  USBKEYPID = 0;\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n  xfer->buffer = buffer;\n  // xfer->ff     = NULL; // TODO support dcd_edpt_xfer_fifo API\n  xfer->total_len = total_bytes;\n  xfer->queued_len = 0;\n  xfer->short_packet = false;\n\n  if(epnum == 0)\n  {\n    if(dir == TUSB_DIR_OUT)\n    {\n      // Interrupt will notify us when data was received.\n      USBCTL &= ~DIR;\n      USBOEPCNT_0 &= ~NAK;\n    }\n    else\n    {\n      // Kickstart the IN packet handler by queuing initial data and calling\n      // the ISR to transmit the first packet.\n      // Interrupt only fires on completed xfer.\n      USBCTL |= DIR;\n      USBIEPIFG |= BIT0;\n    }\n  }\n  else\n  {\n    ep_regs_t ep_regs = EP_REGS(epnum, dir);\n\n    if(dir == TUSB_DIR_OUT)\n    {\n      ep_regs[BCTX] &= ~NAK;\n    }\n    else\n    {\n      USBIEPIFG |= (1 << epnum);\n    }\n  }\n\n  return true;\n}\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t * ff, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  xfer_ctl_t * xfer = XFER_CTL_BASE(epnum, dir);\n  xfer->buffer = NULL;\n  xfer->ff     = ff;\n  xfer->total_len = total_bytes;\n  xfer->queued_len = 0;\n  xfer->short_packet = false;\n\n  ep_regs_t ep_regs = EP_REGS(epnum, dir);\n\n  if(dir == TUSB_DIR_OUT)\n  {\n    ep_regs[BCTX] &= ~NAK;\n  }\n  else\n  {\n    USBIEPIFG |= (1 << epnum);\n  }\n\n  return true;\n}\n#endif\n\nvoid dcd_edpt_stall (uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  if(epnum == 0)\n  {\n    if(dir == TUSB_DIR_OUT)\n    {\n      USBOEPCNT_0 |= NAK;\n      USBOEPCNF_0 |= STALL;\n    }\n    else\n    {\n      USBIEPCNT_0 |= NAK;\n      USBIEPCNF_0 |= STALL;\n    }\n  }\n  else\n  {\n    ep_regs_t ep_regs = EP_REGS(epnum, dir);\n    ep_regs[CNF] |= STALL;\n  }\n}\n\nvoid dcd_edpt_clear_stall (uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  uint8_t const epnum = tu_edpt_number(ep_addr);\n  uint8_t const dir   = tu_edpt_dir(ep_addr);\n\n  if(epnum == 0)\n  {\n    if(dir == TUSB_DIR_OUT)\n    {\n      USBOEPCNF_0 &= ~STALL;\n    }\n    else\n    {\n      USBIEPCNF_0 &= ~STALL;\n    }\n  }\n  else\n  {\n    ep_regs_t ep_regs = EP_REGS(epnum, dir);\n    // Required by USB spec to reset DATA toggle bit to DATA0 on interrupt\n    // and bulk endpoints.\n    ep_regs[CNF] &= ~(STALL + TOGGLE);\n  }\n}\n\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const * request)\n{\n  (void) rhport;\n  (void) request;\n\n  // FIXME: Per manual, we should be clearing the NAK bits of EP0 after the\n  // Status Phase of a control xfer is done, in preparation of another possible\n  // SETUP packet. However, from my own testing, SETUP packets _are_ correctly\n  // handled by the USB core without clearing the NAKs.\n  //\n  // Right now, clearing NAKs in this callbacks causes a direction mismatch\n  // between host and device on EP0. Figure out why and come back to this.\n  // USBOEPCNT_0 &= ~NAK;\n  // USBIEPCNT_0 &= ~NAK;\n}\n\n/*------------------------------------------------------------------*/\n\nstatic void receive_packet(uint8_t ep_num)\n{\n  xfer_ctl_t * xfer = XFER_CTL_BASE(ep_num, TUSB_DIR_OUT);\n  ep_regs_t ep_regs = EP_REGS(ep_num, TUSB_DIR_OUT);\n  uint8_t xfer_size;\n\n  if(ep_num == 0)\n  {\n    xfer_size = USBOEPCNT_0 & 0x0F;\n  }\n  else\n  {\n    xfer_size = ep_regs[BCTX] & 0x7F;\n  }\n\n  uint16_t remaining = xfer->total_len - xfer->queued_len;\n  uint16_t to_recv_size;\n\n  if(remaining <= xfer->max_size) {\n    // Avoid buffer overflow.\n    to_recv_size = (xfer_size > remaining) ? remaining : xfer_size;\n  } else {\n    // Room for full packet, choose recv_size based on what the microcontroller\n    // claims.\n    to_recv_size = (xfer_size > xfer->max_size) ? xfer->max_size : xfer_size;\n  }\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\n  if (xfer->ff)\n  {\n    volatile uint8_t * ep_buf = (ep_num == 0) ? &USBOEP0BUF : (&USBSTABUFF + (ep_regs[BBAX] << 3));\n    tu_fifo_write_n(xfer->ff, (const void *) ep_buf, to_recv_size);\n  }\n  else\n#endif\n  {\n    uint8_t * base = (xfer->buffer + xfer->queued_len);\n\n    if(ep_num == 0)\n    {\n      volatile uint8_t * ep0out_buf = &USBOEP0BUF;\n      for(uint16_t i = 0; i < to_recv_size; i++)\n      {\n        base[i] = ep0out_buf[i];\n      }\n    }\n    else\n    {\n      volatile uint8_t * ep_buf = &USBSTABUFF + (ep_regs[BBAX] << 3);\n      for(uint16_t i = 0; i < to_recv_size ; i++)\n      {\n        base[i] = ep_buf[i];\n      }\n    }\n  }\n\n  xfer->queued_len += xfer_size;\n\n  xfer->short_packet = (xfer_size < xfer->max_size);\n  if((xfer->total_len == xfer->queued_len) || xfer->short_packet)\n  {\n    dcd_event_xfer_complete(0, ep_num, xfer->queued_len, XFER_RESULT_SUCCESS, true);\n  }\n  else\n  {\n    // Schedule to receive another packet.\n    if(ep_num == 0)\n    {\n      USBOEPCNT_0 &= ~NAK;\n    }\n    else\n    {\n      ep_regs[BCTX] &= ~NAK;\n    }\n  }\n}\n\nstatic void transmit_packet(uint8_t ep_num)\n{\n  xfer_ctl_t * xfer = XFER_CTL_BASE(ep_num, TUSB_DIR_IN);\n\n  // First, determine whether we should even send a packet or finish\n  // up the xfer.\n  bool zlp = (xfer->total_len == 0); // By necessity, xfer->total_len will\n                                     // equal xfer->queued_len for ZLPs.\n                                     // Of course a ZLP is a short packet.\n  if((!zlp && (xfer->total_len == xfer->queued_len)) || xfer->short_packet)\n  {\n    dcd_event_xfer_complete(0, ep_num | TUSB_DIR_IN_MASK, xfer->queued_len, XFER_RESULT_SUCCESS, true);\n    return;\n  }\n\n  // Then actually commit to transmit a packet.\n  uint8_t * base = (xfer->buffer + xfer->queued_len);\n  uint16_t remaining = xfer->total_len - xfer->queued_len;\n  uint8_t xfer_size = (xfer->max_size < xfer->total_len) ? xfer->max_size : remaining;\n\n  xfer->queued_len += xfer_size;\n  if(xfer_size < xfer->max_size)\n  {\n    // Next \"xfer complete interrupt\", the transfer will end.\n    xfer->short_packet = true;\n  }\n\n  if(ep_num == 0)\n  {\n    volatile uint8_t * ep0in_buf = &USBIEP0BUF;\n    for(uint16_t i = 0; i < xfer_size; i++)\n    {\n      ep0in_buf[i] = base[i];\n    }\n\n    USBIEPCNT_0 = (USBIEPCNT_0 & 0xF0) + xfer_size;\n    USBIEPCNT_0 &= ~NAK;\n  }\n  else\n  {\n    ep_regs_t ep_regs = EP_REGS(ep_num, TUSB_DIR_IN);\n    volatile uint8_t * ep_buf = &USBSTABUFF + (ep_regs[BBAX] << 3);\n\n#if 0 // TODO support dcd_edpt_xfer_fifo API\n    if (xfer->ff)\n    {\n      tu_fifo_read_n(xfer->ff, (void *) ep_buf, xfer_size);\n    }\n    else\n#endif\n    {\n      for(int i = 0; i < xfer_size; i++)\n      {\n        ep_buf[i] = base[i];\n      }\n    }\n\n    ep_regs[BCTX] = (ep_regs[BCTX] & 0x80) + (xfer_size & 0x7F);\n    ep_regs[BCTX] &= ~NAK;\n  }\n}\n\nstatic void handle_setup_packet(void)\n{\n  volatile uint8_t * setup_buf = &USBSUBLK;\n\n  for(int i = 0; i < 8; i++)\n  {\n    _setup_packet[i] = setup_buf[i];\n  }\n\n  // Force NAKs until tinyusb can handle the SETUP packet and prepare for a new xfer.\n  USBIEPCNT_0 |= NAK;\n  USBOEPCNT_0 |= NAK;\n\n  // Clear SETUPIFG to avoid handling in the USBVECINT switch statement.\n  // When handled there the NAKs applied to the endpoints above are\n  // cleared by hardware and the host will receive stale/duplicate data.\n  //\n  // Excerpt from MSP430x5xx and MSP430x6xx Family User's Guide:\n  //\n  // \"...the SETUPIFG is cleared upon reading USBIV. In addition, the NAK on\n  // input endpoint 0 and output endpoint 0 is also cleared.\"\n  USBIEPCNF_0 &= ~UBME; // Errata USB10 workaround.\n  USBOEPCNF_0 &= ~UBME; // Errata USB10 workaround.\n  USBIFG &= ~SETUPIFG;\n  USBIEPCNF_0 |= UBME;  // Errata USB10 workaround.\n  USBOEPCNF_0 |= UBME;  // Errata USB10 workaround.\n  dcd_event_setup_received(0, (uint8_t*) &_setup_packet[0], true);\n}\n\nstatic void handle_bus_power_event(void *param) {\n  (void) param;\n\n  tusb_time_delay_ms_api(5);                 // Bus power settling delay.\n\n  USBKEYPID = USBKEY;\n\n  if(USBPWRCTL & USBBGVBV) {          // Event caused by application of bus power.\n    USBPWRCTL |= VBOFFIE;             // Enable bus-power-removed interrupt.\n    USBPLLDIVB = USBPLLDIVB;          // For some reason the PLL will *NOT* lock unless the divider\n                                      // register is re-written. The assumption here is that this\n                                      // register was already properly configured during board-level\n                                      // initialization.\n    USBPLLCTL |= (UPLLEN | UPFDEN);   // Enable the PLL.\n\n    uint16_t attempts = 0;\n    do {                              // Poll the PLL, checking for a successful lock.\n      USBPLLIR = 0;\n      tusb_time_delay_ms_api(1);\n      attempts++;\n    } while ((attempts < 10) && (USBPLLIR != 0));\n\n    // A successful lock is indicated by all PLL-related interrupt flags being cleared.\n    if(!USBPLLIR) {\n      const tusb_rhport_init_t rhport_init = {\n        .role = TUSB_ROLE_DEVICE,\n        .speed = TUSB_SPEED_FULL\n      };\n      dcd_init(0, &rhport_init);         // Re-initialize the USB module.\n    }\n  } else {                            // Event caused by removal of bus power.\n    USBPWRCTL |= VBONIE;              // Enable bus-power-applied interrupt.\n    USBPLLCTL &= ~(UPLLEN | UPFDEN);  // Disable the PLL.\n    USBCNF = 0;                       // Disable the USB module.\n    dcd_event_bus_signal(0, DCD_EVENT_UNPLUGGED, false);\n  }\n\n  USBKEYPID = 0;\n}\n\nvoid dcd_int_handler(uint8_t rhport)\n{\n  (void) rhport;\n\n  // Setup is special- reading USBVECINT to handle setup packets is done to\n  // stop hardware-generated NAKs on EP0.\n  uint8_t setup_status = USBIFG & SETUPIFG;\n\n  if(setup_status)\n  {\n    enable_functional_reset(true);\n    handle_setup_packet();\n  }\n\n  // Workaround possible bug in MSP430 GCC 9.3.0 where volatile variable\n  // USBVECINT is read from twice when only once is intended. The second\n  // (garbage) read seems to be triggered by certain switch statement\n  // configurations.\n  uint16_t curr_vector;\n  #if __GNUC__ > 9 || (__GNUC__ == 9 && __GNUC_MINOR__ > 2)\n    asm volatile (\"mov %1, %0\"\n                  : \"=r\" (curr_vector)\n                  : \"m\" (USBVECINT));\n  #else\n    curr_vector = USBVECINT;\n  #endif\n\n  switch(curr_vector)\n  {\n    case USBVECINT_NONE:\n      break;\n\n    case USBVECINT_RSTR:\n      enable_functional_reset(false); // Errata USB4 workaround.\n      bus_reset();\n      dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n      break;\n\n    case USBVECINT_PWR_VBUSOn:\n    case USBVECINT_PWR_VBUSOff: {\n      USBKEYPID = USBKEY;\n      // Prevent (possibly) unstable power from generating spurious interrupts.\n      USBPWRCTL &= ~(VBONIE | VBOFFIE);\n      USBKEYPID = 0;\n\n      dcd_event_t event;\n\n      event.rhport = 0;\n      event.event_id = USBD_EVENT_FUNC_CALL;\n      event.func_call.func = handle_bus_power_event;\n\n      dcd_event_handler(&event, true);\n      }\n      break;\n\n    // Clear the (hardware-enforced) NAK on EP 0 after a SETUP packet\n    // is received. At this point, even though the hardware is no longer\n    // forcing NAKs, the EP0 NAK bits should still be set to avoid\n    // sending/receiving data before tinyusb is ready.\n    //\n    // Furthermore, it's possible for the hardware to STALL in the middle of\n    // a control xfer if the EP0 NAK bits aren't set properly.\n    // See: https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/845259\n    // From my testing, if all of the following hold:\n    // * OUT EP0 NAK is cleared.\n    // * IN EP0 NAK is set.\n    // * DIR bit in USBCTL is clear.\n    // and an IN packet is received on EP0, the USB core will STALL. Setting\n    // both EP0 NAKs manually when a SETUP packet is received, as is done\n    // in handle_setup_packet(), avoids meeting STALL conditions.\n    //\n    // TODO: Figure out/explain why the STALL condition can be reached in the\n    // first place. When I first noticed the STALL, the only two places I\n    // touched the NAK bits were in dcd_edpt_xfer() and to _set_ (sic) them in\n    // bus_reset(). SETUP packet handling should've been unaffected.\n    case USBVECINT_SETUP_PACKET_RECEIVED:\n      break;\n\n    case USBVECINT_INPUT_ENDPOINT0:\n      enable_functional_reset(true);\n      transmit_packet(0);\n      break;\n\n    case USBVECINT_OUTPUT_ENDPOINT0:\n      enable_functional_reset(true);\n      receive_packet(0);\n      break;\n\n    case USBVECINT_INPUT_ENDPOINT1:\n    case USBVECINT_INPUT_ENDPOINT2:\n    case USBVECINT_INPUT_ENDPOINT3:\n    case USBVECINT_INPUT_ENDPOINT4:\n    case USBVECINT_INPUT_ENDPOINT5:\n    case USBVECINT_INPUT_ENDPOINT6:\n    case USBVECINT_INPUT_ENDPOINT7:\n    {\n      uint8_t ep = ((curr_vector - USBVECINT_INPUT_ENDPOINT1) >> 1) + 1;\n      transmit_packet(ep);\n    }\n    break;\n\n    case USBVECINT_OUTPUT_ENDPOINT1:\n    case USBVECINT_OUTPUT_ENDPOINT2:\n    case USBVECINT_OUTPUT_ENDPOINT3:\n    case USBVECINT_OUTPUT_ENDPOINT4:\n    case USBVECINT_OUTPUT_ENDPOINT5:\n    case USBVECINT_OUTPUT_ENDPOINT6:\n    case USBVECINT_OUTPUT_ENDPOINT7:\n    {\n      uint8_t ep = ((curr_vector - USBVECINT_OUTPUT_ENDPOINT1) >> 1) + 1;\n      receive_packet(ep);\n    }\n    break;\n\n    default:\n      while(true);\n  }\n\n}\n#endif\n"
  },
  {
    "path": "src/portable/valentyusb/eptri/dcd_eptri.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && (CFG_TUSB_MCU == OPT_MCU_VALENTYUSB_EPTRI)\n\n#ifndef DEBUG\n#define DEBUG 0\n#endif\n\n#ifndef LOG_USB\n#define LOG_USB 0\n#endif\n\n#include \"device/dcd.h\"\n#include \"dcd_eptri.h\"\n#include \"csr.h\"\n#include \"irq.h\"\nvoid fomu_error(uint32_t line);\n\n#if LOG_USB\nstruct usb_log {\n  uint8_t ep_num;\n  uint8_t size;\n  uint8_t data[66];\n};\n__attribute__((used))\nstruct usb_log usb_log[128];\n__attribute__((used))\nuint8_t usb_log_offset;\n\nstruct xfer_log {\n  uint8_t ep_num;\n  uint16_t size;\n};\n__attribute__((used))\nstruct xfer_log xfer_log[64];\n__attribute__((used))\nuint8_t xfer_log_offset;\n\n__attribute__((used))\nstruct xfer_log queue_log[64];\n__attribute__((used))\nuint8_t queue_log_offset;\n#endif\n\n//--------------------------------------------------------------------+\n// SIE Command\n//--------------------------------------------------------------------+\n\n#define EP_SIZE 64\n\nuint16_t volatile rx_buffer_offset[16];\nuint8_t* volatile rx_buffer[16];\nuint16_t volatile rx_buffer_max[16];\n\nvolatile uint8_t tx_ep;\nvolatile bool tx_active;\nvolatile uint16_t tx_buffer_offset[16];\nuint8_t* volatile tx_buffer[16];\nvolatile uint16_t tx_buffer_max[16];\nvolatile uint8_t reset_count;\n\n#if DEBUG\n__attribute__((used)) uint8_t volatile * last_tx_buffer;\n__attribute__((used)) volatile uint8_t last_tx_ep;\nuint8_t setup_packet_bfr[10];\n#endif\n\n//--------------------------------------------------------------------+\n// PIPE HELPER\n//--------------------------------------------------------------------+\n\nstatic bool advance_tx_ep(void) {\n  // Move on to the next transmit buffer in a round-robin manner\n  uint8_t prev_tx_ep = tx_ep;\n  for (tx_ep = (tx_ep + 1) & 0xf; tx_ep != prev_tx_ep; tx_ep = ((tx_ep + 1) & 0xf)) {\n    if (tx_buffer[tx_ep])\n      return true;\n  }\n  if (!tx_buffer[tx_ep])\n    return false;\n  return true;\n}\n\n#if LOG_USB\nvoid xfer_log_append(uint8_t ep_num, uint16_t sz) {\n  xfer_log[xfer_log_offset].ep_num = ep_num;\n  xfer_log[xfer_log_offset].size = sz;\n  xfer_log_offset++;\n  if (xfer_log_offset >= sizeof(xfer_log)/sizeof(*xfer_log))\n    xfer_log_offset = 0;\n}\n\nvoid queue_log_append(uint8_t ep_num, uint16_t sz) {\n  queue_log[queue_log_offset].ep_num = ep_num;\n  queue_log[queue_log_offset].size = sz;\n  queue_log_offset++;\n  if (queue_log_offset >= sizeof(queue_log)/sizeof(*queue_log))\n    queue_log_offset = 0;\n}\n#endif\n\nstatic void tx_more_data(void) {\n  // Send more data\n  uint8_t added_bytes;\n  for (added_bytes = 0; (added_bytes < EP_SIZE) && (tx_buffer_offset[tx_ep] < tx_buffer_max[tx_ep]); added_bytes++) {\n#if LOG_USB\n    usb_log[usb_log_offset].data[added_bytes] = tx_buffer[tx_ep][tx_buffer_offset[tx_ep]];\n#endif\n    usb_in_data_write(tx_buffer[tx_ep][tx_buffer_offset[tx_ep]++]);\n  }\n\n#if LOG_USB\n  usb_log[usb_log_offset].ep_num = tu_edpt_addr(tx_ep, TUSB_DIR_IN);\n  usb_log[usb_log_offset].size = added_bytes;\n  usb_log_offset++;\n  if (usb_log_offset >= sizeof(usb_log)/sizeof(*usb_log))\n    usb_log_offset = 0;\n#endif\n\n  // Updating the epno queues the data\n  usb_in_ctrl_write(tx_ep & 0xf);\n}\n\nstatic void process_tx(void) {\n#if DEBUG\n  // If the system isn't idle, then something is very wrong.\n  uint8_t in_status = usb_in_status_read();\n  if (!(in_status & (1 << CSR_USB_IN_STATUS_IDLE_OFFSET)))\n    fomu_error(__LINE__);\n#endif\n\n  // If the buffer is now empty, search for the next buffer to fill.\n  if (!tx_buffer[tx_ep]) {\n    if (advance_tx_ep())\n      tx_more_data();\n    else\n      tx_active = false;\n    return;\n  }\n\n  if (tx_buffer_offset[tx_ep] >= tx_buffer_max[tx_ep]) {\n#if DEBUG\n    last_tx_buffer = tx_buffer[tx_ep];\n    last_tx_ep = tx_ep;\n#endif\n    tx_buffer[tx_ep] = NULL;\n    uint16_t xferred_bytes = tx_buffer_max[tx_ep];\n    uint8_t xferred_ep = tx_ep;\n\n    if (!advance_tx_ep())\n      tx_active = false;\n#if LOG_USB\n    xfer_log_append(tu_edpt_addr(xferred_ep, TUSB_DIR_IN), xferred_bytes);\n#endif\n    dcd_event_xfer_complete(0, tu_edpt_addr(xferred_ep, TUSB_DIR_IN), xferred_bytes, XFER_RESULT_SUCCESS, true);\n    if (!tx_active)\n      return;\n  }\n\n  tx_more_data();\n  return;\n}\n\nstatic void process_rx(void) {\n  uint8_t out_status = usb_out_status_read();\n#if DEBUG\n  // If the OUT handler is still waiting to send, don't do anything.\n  if (!(out_status & (1 << CSR_USB_OUT_STATUS_HAVE_OFFSET)))\n    fomu_error(__LINE__);\n    // return;\n#endif\n  uint8_t rx_ep = (out_status >> CSR_USB_OUT_STATUS_EPNO_OFFSET) & 0xf;\n\n  // If the destination buffer doesn't exist, don't drain the hardware\n  // fifo.  Note that this can cause deadlocks if the host is waiting\n  // on some other endpoint's data!\n#if DEBUG\n  if (rx_buffer[rx_ep] == NULL) {\n    fomu_error(__LINE__);\n    return;\n  }\n#endif\n\n  // Drain the FIFO into the destination buffer\n  uint32_t total_read = 0;\n  uint32_t current_offset = rx_buffer_offset[rx_ep];\n#if DEBUG\n  uint8_t test_buffer[256];\n  memset(test_buffer, 0, sizeof(test_buffer));\n  if (current_offset > rx_buffer_max[rx_ep])\n    fomu_error(__LINE__);\n#endif\n#if LOG_USB\n  usb_log[usb_log_offset].ep_num = tu_edpt_addr(rx_ep, TUSB_DIR_OUT);\n  usb_log[usb_log_offset].size = 0;\n#endif\n  while (usb_out_status_read() & (1 << CSR_USB_OUT_STATUS_HAVE_OFFSET)) {\n    uint8_t c = usb_out_data_read();\n#if DEBUG\n    test_buffer[total_read] = c;\n#endif\n    total_read++;\n    if (current_offset < rx_buffer_max[rx_ep]) {\n#if LOG_USB\n      usb_log[usb_log_offset].data[usb_log[usb_log_offset].size++] = c;\n#endif\n      if (rx_buffer[rx_ep] != (volatile uint8_t *)0xffffffff)\n        rx_buffer[rx_ep][current_offset++] = c;\n    }\n  }\n#if LOG_USB\n  usb_log_offset++;\n  if (usb_log_offset >= sizeof(usb_log)/sizeof(*usb_log))\n    usb_log_offset = 0;\n#endif\n#if DEBUG\n  if (total_read > 66)\n    fomu_error(__LINE__);\n  if (total_read < 2)\n    total_read = 2;\n    // fomu_error(__LINE__);\n#endif\n\n  // Strip off the CRC16\n  rx_buffer_offset[rx_ep] += (total_read - 2);\n  if (rx_buffer_offset[rx_ep] > rx_buffer_max[rx_ep])\n    rx_buffer_offset[rx_ep] = rx_buffer_max[rx_ep];\n\n  // If there's no more data, complete the transfer to tinyusb\n  if ((rx_buffer_max[rx_ep] == rx_buffer_offset[rx_ep])\n  // ZLP with less than the total amount of data\n  || ((total_read == 2) && ((rx_buffer_offset[rx_ep] & 63) == 0))\n  // Short read, but not a full packet\n  || (((rx_buffer_offset[rx_ep] & 63) != 0) && (total_read < 66))) {\n#if DEBUG\n    if (rx_buffer[rx_ep] == NULL)\n      fomu_error(__LINE__);\n#endif\n\n    // Free up this buffer.\n    rx_buffer[rx_ep] = NULL;\n    uint16_t len = rx_buffer_offset[rx_ep];\n\n#if DEBUG\n    // Validate that all enabled endpoints have buffers,\n    // and no disabled endpoints have buffers.\n    uint16_t ep_en_mask = usb_out_enable_status_read();\n    int i;\n    for (i = 0; i < 16; i++) {\n      if ((!!(ep_en_mask & (1 << i))) ^ (!!(rx_buffer[i]))) {\n        uint8_t new_status = usb_out_status_read();\n        // Another IRQ came in while we were processing, so ignore this endpoint.\n        if ((new_status & 0x20) && ((new_status & 0xf) == i))\n          continue;\n        fomu_error(__LINE__);\n      }\n    }\n#endif\n#if LOG_USB\n    xfer_log_append(tu_edpt_addr(rx_ep, TUSB_DIR_OUT), len);\n#endif\n    dcd_event_xfer_complete(0, tu_edpt_addr(rx_ep, TUSB_DIR_OUT), len, XFER_RESULT_SUCCESS, true);\n  }\n  else {\n    // If there's more data, re-enable data reception on this endpoint\n    usb_out_ctrl_write((1 << CSR_USB_OUT_CTRL_ENABLE_OFFSET) | rx_ep);\n  }\n\n  // Now that the buffer is drained, clear the pending IRQ.\n  usb_out_ev_pending_write(usb_out_ev_pending_read());\n}\n\n//--------------------------------------------------------------------+\n// CONTROLLER API\n//--------------------------------------------------------------------+\n\nstatic void dcd_reset(void)\n{\n  reset_count++;\n  usb_setup_ev_enable_write(0);\n  usb_in_ev_enable_write(0);\n  usb_out_ev_enable_write(0);\n\n  usb_address_write(0);\n\n  // Reset all three FIFO handlers\n  usb_setup_ctrl_write(1 << CSR_USB_SETUP_CTRL_RESET_OFFSET);\n  usb_in_ctrl_write(1 << CSR_USB_IN_CTRL_RESET_OFFSET);\n  usb_out_ctrl_write(1 << CSR_USB_OUT_CTRL_RESET_OFFSET);\n\n  memset((void *)(uintptr_t) rx_buffer, 0, sizeof(rx_buffer));\n  memset((void *)(uintptr_t) rx_buffer_max, 0, sizeof(rx_buffer_max));\n  memset((void *)(uintptr_t) rx_buffer_offset, 0, sizeof(rx_buffer_offset));\n\n  memset((void *)(uintptr_t) tx_buffer, 0, sizeof(tx_buffer));\n  memset((void *)(uintptr_t) tx_buffer_max, 0, sizeof(tx_buffer_max));\n  memset((void *)(uintptr_t) tx_buffer_offset, 0, sizeof(tx_buffer_offset));\n  tx_ep = 0;\n  tx_active = false;\n\n  // Enable all event handlers and clear their contents\n  usb_setup_ev_pending_write(0xff);\n  usb_in_ev_pending_write(0xff);\n  usb_out_ev_pending_write(0xff);\n  usb_in_ev_enable_write(1);\n  usb_out_ev_enable_write(1);\n  usb_setup_ev_enable_write(3);\n\n  dcd_event_bus_reset(0, TUSB_SPEED_FULL, true);\n}\n\n// Initializes the USB peripheral for device mode and enables it.\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  usb_pullup_out_write(0);\n\n  // Enable all event handlers and clear their contents\n  usb_setup_ev_pending_write(usb_setup_ev_pending_read());\n  usb_in_ev_pending_write(usb_in_ev_pending_read());\n  usb_out_ev_pending_write(usb_out_ev_pending_read());\n  usb_in_ev_enable_write(1);\n  usb_out_ev_enable_write(1);\n  usb_setup_ev_enable_write(3);\n\n  // Turn on the external pullup\n  usb_pullup_out_write(1);\n\n  return true;\n}\n\n// Enables or disables the USB device interrupt(s). May be used to\n// prevent concurrency issues when mutating data structures shared\n// between main code and the interrupt handler.\nvoid dcd_int_enable(uint8_t rhport)\n{\n  (void) rhport;\n\tirq_setmask(irq_getmask() | (1 << USB_INTERRUPT));\n}\n\nvoid dcd_int_disable(uint8_t rhport)\n{\n  (void) rhport;\n  irq_setmask(irq_getmask() & ~(1 << USB_INTERRUPT));\n}\n\n// Called when the device is given a new bus address.\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr)\n{\n  // Respond with ACK status first before changing device address\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n\n  // Wait for the response packet to get sent\n  while (tx_active)\n    ;\n\n  // Activate the new address\n  usb_address_write(dev_addr);\n}\n\n// Called to remote wake up host when suspended (e.g hid keyboard)\nvoid dcd_remote_wakeup(uint8_t rhport)\n{\n  (void) rhport;\n}\n\nvoid dcd_connect(uint8_t rhport)\n{\n  (void) rhport;\n  usb_pullup_out_write(1);\n}\n\nvoid dcd_disconnect(uint8_t rhport)\n{\n  (void) rhport;\n  usb_pullup_out_write(0);\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en)\n{\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\n//--------------------------------------------------------------------+\n// DCD Endpoint Port\n//--------------------------------------------------------------------+\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * p_endpoint_desc)\n{\n  (void) rhport;\n  uint8_t ep_num = tu_edpt_number(p_endpoint_desc->bEndpointAddress);\n  uint8_t ep_dir = tu_edpt_dir(p_endpoint_desc->bEndpointAddress);\n\n  if (p_endpoint_desc->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS)\n    return false; // Not supported\n\n  if (ep_dir == TUSB_DIR_OUT) {\n    rx_buffer_offset[ep_num] = 0;\n    rx_buffer_max[ep_num] = 0;\n    rx_buffer[ep_num] = NULL;\n  }\n\n  else if (ep_dir == TUSB_DIR_IN) {\n    tx_buffer_offset[ep_num] = 0;\n    tx_buffer_max[ep_num] = 0;\n    tx_buffer[ep_num] = NULL;\n  }\n\n  return true;\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void)rhport;\n  (void)ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\nvoid dcd_edpt_close_all (uint8_t rhport)\n{\n  (void) rhport;\n  // TODO implement dcd_edpt_close_all()\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n\n  if (tu_edpt_dir(ep_addr) == TUSB_DIR_OUT) {\n    uint8_t enable = 0;\n    if (rx_buffer[ep_addr])\n      enable = 1;\n    usb_out_ctrl_write((1 << CSR_USB_OUT_CTRL_STALL_OFFSET) | (enable << CSR_USB_OUT_CTRL_ENABLE_OFFSET) | tu_edpt_number(ep_addr));\n  }\n  else\n    usb_in_ctrl_write((1 << CSR_USB_IN_CTRL_STALL_OFFSET) | tu_edpt_number(ep_addr));\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)\n{\n  (void) rhport;\n  if (tu_edpt_dir(ep_addr) == TUSB_DIR_OUT) {\n    uint8_t enable = 0;\n    if (rx_buffer[ep_addr])\n      enable = 1;\n    usb_out_ctrl_write((0 << CSR_USB_OUT_CTRL_STALL_OFFSET) | (enable << CSR_USB_OUT_CTRL_ENABLE_OFFSET) | tu_edpt_number(ep_addr));\n  }\n  // IN endpoints will get un-stalled when more data is written.\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr)\n{\n  (void) is_isr;\n  (void)rhport;\n  uint8_t ep_num = tu_edpt_number(ep_addr);\n  uint8_t ep_dir = tu_edpt_dir(ep_addr);\n  TU_ASSERT(ep_num < 16);\n\n  // Give a nonzero buffer when we transmit 0 bytes, so that the\n  // system doesn't think the endpoint is idle.\n  if ((buffer == NULL) && (total_bytes == 0)) {\n    buffer = (uint8_t *)0xffffffff;\n  }\n\n  TU_ASSERT(buffer != NULL);\n\n  if (ep_dir == TUSB_DIR_IN) {\n    // Wait for the tx pipe to free up\n    uint8_t previous_reset_count = reset_count;\n    // Continue until the buffer is empty, the system is idle, and the fifo is empty.\n    while (tx_buffer[ep_num] != NULL)\n      ;\n\n    dcd_int_disable(0);\n#if LOG_USB\n    queue_log_append(ep_addr, total_bytes);\n#endif\n    // If a reset happens while we're waiting, abort the transfer\n    if (previous_reset_count != reset_count)\n      return true;\n\n    TU_ASSERT(tx_buffer[ep_num] == NULL);\n    tx_buffer_offset[ep_num] = 0;\n    tx_buffer_max[ep_num] = total_bytes;\n    tx_buffer[ep_num] = buffer;\n\n    // If the current buffer is NULL, then that means the tx logic is idle.\n    // Update the tx_ep to point to our endpoint number and queue the data.\n    // Otherwise, let it be and it'll get picked up after the next transfer\n    // finishes.\n    if (!tx_active) {\n      tx_ep = ep_num;\n      tx_active = true;\n      tx_more_data();\n    }\n    dcd_int_enable(0);\n  }\n\n  else if (ep_dir == TUSB_DIR_OUT) {\n    while (rx_buffer[ep_num] != NULL)\n      ;\n\n    TU_ASSERT(rx_buffer[ep_num] == NULL);\n    dcd_int_disable(0);\n#if LOG_USB\n    queue_log_append(ep_addr, total_bytes);\n#endif\n    rx_buffer[ep_num] = buffer;\n    rx_buffer_offset[ep_num] = 0;\n    rx_buffer_max[ep_num] = total_bytes;\n\n    // Enable receiving on this particular endpoint\n    usb_out_ctrl_write((1 << CSR_USB_OUT_CTRL_ENABLE_OFFSET) | ep_num);\n#if DEBUG\n    uint16_t ep_en_mask = usb_out_enable_status_read();\n    int i;\n    for (i = 0; i < 16; i++) {\n      if ((!!(ep_en_mask & (1 << i))) ^ (!!(rx_buffer[i]))) {\n        if (rx_buffer[i] && usb_out_ev_pending_read() && (usb_out_status_read() & 0xf) == i)\n          continue;\n        fomu_error(__LINE__);\n      }\n    }\n#endif\n    dcd_int_enable(0);\n  }\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// ISR\n//--------------------------------------------------------------------+\n\nstatic void handle_out(void)\n{\n  // An \"OUT\" transaction just completed so we have new data.\n  // (But only if we can accept the data)\n#if DEBUG\n  if (!usb_out_ev_pending_read())\n    fomu_error(__LINE__);\n  if (!usb_out_ev_enable_read())\n    fomu_error(__LINE__);\n#endif\n  process_rx();\n}\n\nstatic void handle_in(void)\n{\n#if DEBUG\n  if (!usb_in_ev_pending_read())\n    fomu_error(__LINE__);\n  if (!usb_in_ev_enable_read())\n    fomu_error(__LINE__);\n#endif\n  usb_in_ev_pending_write(usb_in_ev_pending_read());\n  process_tx();\n}\n\nstatic void handle_reset(void)\n{\n#if DEBUG\n  uint8_t setup_pending   = usb_setup_ev_pending_read() & usb_setup_ev_enable_read();\n  if (!(setup_pending & 2))\n    fomu_error(__LINE__);\n#endif\n  usb_setup_ev_pending_write(2);\n\n  // This event means a bus reset occurred.  Reset everything, and\n  // abandon any further processing.\n  dcd_reset();\n}\n\nstatic void handle_setup(void)\n{\n#if !DEBUG\n  uint8_t setup_packet_bfr[10];\n#endif\n\n#if DEBUG\n  uint8_t setup_pending   = usb_setup_ev_pending_read() & usb_setup_ev_enable_read();\n  if (!(setup_pending & 1))\n    fomu_error(__LINE__);\n#endif\n\n  // We got a SETUP packet.  Copy it to the setup buffer and clear\n  // the \"pending\" bit.\n  // Setup packets are always 8 bytes, plus two bytes of crc16.\n  uint32_t setup_length = 0;\n\n#if DEBUG\n  if (!(usb_setup_status_read() & (1 << CSR_USB_SETUP_STATUS_HAVE_OFFSET)))\n    fomu_error(__LINE__);\n#endif\n\n  while (usb_setup_status_read() & (1 << CSR_USB_SETUP_STATUS_HAVE_OFFSET)) {\n    uint8_t c = usb_setup_data_read();\n    if (setup_length < sizeof(setup_packet_bfr))\n      setup_packet_bfr[setup_length] = c;\n    setup_length++;\n  }\n\n  // If we have 10 bytes, that's a full SETUP packet plus CRC16.\n  // Otherwise, it was an RX error.\n  if (setup_length == 10) {\n    dcd_event_setup_received(0, setup_packet_bfr, true);\n  }\n#if DEBUG\n  else {\n    fomu_error(__LINE__);\n  }\n#endif\n\n  usb_setup_ev_pending_write(1);\n}\nvoid dcd_int_handler(uint8_t rhport)\n{\n  (void)rhport;\n  uint8_t next_ev;\n  while ((next_ev = usb_next_ev_read())) {\n    switch (next_ev) {\n    case 1 << CSR_USB_NEXT_EV_IN_OFFSET:\n      handle_in();\n      break;\n    case 1 << CSR_USB_NEXT_EV_OUT_OFFSET:\n      handle_out();\n      break;\n    case 1 << CSR_USB_NEXT_EV_SETUP_OFFSET:\n      handle_setup();\n      break;\n    case 1 << CSR_USB_NEXT_EV_RESET_OFFSET:\n      handle_reset();\n      break;\n    }\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/valentyusb/eptri/dcd_eptri.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_DCD_VALENTYUSB_EPTRI_H_\n#define TUSB_DCD_VALENTYUSB_EPTRI_H_\n\n#include \"common/tusb_common.h\"\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_DCD_VALENTYUSB_EPTRI_H_ */\n"
  },
  {
    "path": "src/portable/wch/ch32_usbfs_reg.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Matthew Tran\n * Copyright (c) 2024 hathach\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef USB_CH32_USBFS_REG_H\n#define USB_CH32_USBFS_REG_H\n\n// https://github.com/openwch/ch32v307/pull/90\n// https://github.com/openwch/ch32v20x/pull/12\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#endif\n\n#if CFG_TUSB_MCU == OPT_MCU_CH32F20X\n  #include <ch32f20x.h>\n#elif CFG_TUSB_MCU == OPT_MCU_CH32V103\n  #include <ch32v10x.h>\n  typedef struct\n  {\n    __IO uint8_t  BASE_CTRL;\n    __IO uint8_t  UDEV_CTRL;\n    __IO uint8_t  INT_EN;\n    __IO uint8_t  DEV_ADDR;\n    __IO uint8_t  Reserve0;\n    __IO uint8_t  MIS_ST;\n    __IO uint8_t  INT_FG;\n    __IO uint8_t  INT_ST;\n    __IO uint32_t RX_LEN;\n    __IO uint8_t  UEP4_1_MOD;\n    __IO uint8_t  UEP2_3_MOD;\n    __IO uint8_t  UEP5_6_MOD;\n    __IO uint8_t  UEP7_MOD;\n    __IO uint32_t UEP0_DMA;\n    __IO uint32_t UEP1_DMA;\n    __IO uint32_t UEP2_DMA;\n    __IO uint32_t UEP3_DMA;\n    __IO uint32_t UEP4_DMA;\n    __IO uint32_t UEP5_DMA;\n    __IO uint32_t UEP6_DMA;\n    __IO uint32_t UEP7_DMA;\n    __IO uint16_t UEP0_TX_LEN;\n    __IO uint8_t  UEP0_TX_CTRL;\n    __IO uint8_t  UEP0_RX_CTRL;\n    __IO uint16_t UEP1_TX_LEN;\n    __IO uint8_t  UEP1_TX_CTRL;\n    __IO uint8_t  UEP1_RX_CTRL;\n    __IO uint16_t UEP2_TX_LEN;\n    __IO uint8_t  UEP2_TX_CTRL;\n    __IO uint8_t  UEP2_RX_CTRL;\n    __IO uint16_t UEP3_TX_LEN;\n    __IO uint8_t  UEP3_TX_CTRL;\n    __IO uint8_t  UEP3_RX_CTRL;\n    __IO uint16_t UEP4_TX_LEN;\n    __IO uint8_t  UEP4_TX_CTRL;\n    __IO uint8_t  UEP4_RX_CTRL;\n    __IO uint16_t UEP5_TX_LEN;\n    __IO uint8_t  UEP5_TX_CTRL;\n    __IO uint8_t  UEP5_RX_CTRL;\n    __IO uint16_t UEP6_TX_LEN;\n    __IO uint8_t  UEP6_TX_CTRL;\n    __IO uint8_t  UEP6_RX_CTRL;\n    __IO uint16_t UEP7_TX_LEN;\n    __IO uint8_t  UEP7_TX_CTRL;\n    __IO uint8_t  UEP7_RX_CTRL;\n    __IO uint32_t Reserve1;\n    __IO uint32_t OTG_CR;\n    __IO uint32_t OTG_SR;\n  } USBOTG_FS_TypeDef;\n\n  #define USBOTG_FS ((USBOTG_FS_TypeDef *) 0x40023400)\n#elif CFG_TUSB_MCU == OPT_MCU_CH32V20X\n  #include <ch32v20x.h>\n#elif CFG_TUSB_MCU == OPT_MCU_CH32V307\n  #include <ch32v30x.h>\n  #define USBHD_IRQn OTG_FS_IRQn\n#endif\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n// CTRL\n#define USBFS_CTRL_DMA_EN    (1 << 0)\n#define USBFS_CTRL_CLR_ALL   (1 << 1)\n#define USBFS_CTRL_RESET_SIE (1 << 2)\n#define USBFS_CTRL_INT_BUSY  (1 << 3)\n#define USBFS_CTRL_SYS_CTRL  (1 << 4)\n#define USBFS_CTRL_DEV_PUEN  (1 << 5)\n#define USBFS_CTRL_LOW_SPEED (1 << 6)\n#define USBFS_CTRL_HOST_MODE (1 << 7)\n\n// INT_EN\n#define USBFS_INT_EN_BUS_RST  (1 << 0)\n#define USBFS_INT_EN_DETECT   (1 << 0)\n#define USBFS_INT_EN_TRANSFER (1 << 1)\n#define USBFS_INT_EN_SUSPEND  (1 << 2)\n#define USBFS_INT_EN_HST_SOF  (1 << 3)\n#define USBFS_INT_EN_FIFO_OV  (1 << 4)\n#define USBFS_INT_EN_DEV_NAK  (1 << 6)\n#define USBFS_INT_EN_DEV_SOF  (1 << 7)\n\n// INT_FG\n#define USBFS_INT_FG_BUS_RST  (1 << 0)\n#define USBFS_INT_FG_DETECT   (1 << 0)\n#define USBFS_INT_FG_TRANSFER (1 << 1)\n#define USBFS_INT_FG_SUSPEND  (1 << 2)\n#define USBFS_INT_FG_HST_SOF  (1 << 3)\n#define USBFS_INT_FG_FIFO_OV  (1 << 4)\n#define USBFS_INT_FG_SIE_FREE (1 << 5)\n#define USBFS_INT_FG_TOG_OK   (1 << 6)\n#define USBFS_INT_FG_IS_NAK   (1 << 7)\n\n// INT_ST\n#define USBFS_INT_ST_MASK_UIS_ENDP(x)  (((x) >> 0) & 0x0F)\n#define USBFS_INT_ST_MASK_UIS_TOKEN(x) (((x) >> 4) & 0x03)\n\n// UDEV_CTRL\n#define USBFS_UDEV_CTRL_PORT_EN   (1 << 0)\n#define USBFS_UDEV_CTRL_GP_BIT    (1 << 1)\n#define USBFS_UDEV_CTRL_LOW_SPEED (1 << 2)\n#define USBFS_UDEV_CTRL_DM_PIN    (1 << 4)\n#define USBFS_UDEV_CTRL_DP_PIN    (1 << 5)\n#define USBFS_UDEV_CTRL_PD_DIS    (1 << 7)\n\n// TX_CTRL\n#define USBFS_EP_T_RES_MASK (3 << 0)\n#define USBFS_EP_T_TOG      (1 << 2)\n#define USBFS_EP_T_AUTO_TOG (1 << 3)\n\n#define USBFS_EP_T_RES_ACK   (0 << 0)\n#define USBFS_EP_T_RES_NYET  (1 << 0)\n#define USBFS_EP_T_RES_NAK   (2 << 0)\n#define USBFS_EP_T_RES_STALL (3 << 0)\n\n// RX_CTRL\n#define USBFS_EP_R_RES_MASK (3 << 0)\n#define USBFS_EP_R_TOG      (1 << 2)\n#define USBFS_EP_R_AUTO_TOG (1 << 3)\n\n#define USBFS_EP_R_RES_ACK   (0 << 0)\n#define USBFS_EP_R_RES_NYET  (1 << 0)\n#define USBFS_EP_R_RES_NAK   (2 << 0)\n#define USBFS_EP_R_RES_STALL (3 << 0)\n\n// token PID\n#define PID_OUT   0\n#define PID_SOF   1\n#define PID_IN    2\n#define PID_SETUP 3\n\n#endif // USB_CH32_USBFS_REG_H\n"
  },
  {
    "path": "src/portable/wch/ch32_usbhs_reg.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Matthew Tran\n * Copyright (c) 2024 hathach\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef USB_CH32_USBHS_REG_H\n#define USB_CH32_USBHS_REG_H\n\n// https://github.com/openwch/ch32v307/pull/90\n// https://github.com/openwch/ch32v20x/pull/12\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#endif\n\n#if CFG_TUSB_MCU == OPT_MCU_CH32V307\n  #include <ch32v30x.h>\n#elif CFG_TUSB_MCU == OPT_MCU_CH32F20X\n  #include <ch32f20x.h>\n#endif\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n\n/******************* GLOBAL ******************/\n\n// USB CONTROL\n#define USBHS_CONTROL_OFFSET 0x00\n#define USBHS_DMA_EN         (1 << 0)\n#define USBHS_ALL_CLR        (1 << 1)\n#define USBHS_FORCE_RST      (1 << 2)\n#define USBHS_INT_BUSY_EN    (1 << 3)\n#define USBHS_DEV_PU_EN      (1 << 4)\n#define USBHS_SPEED_MASK     (3 << 5)\n#define USBHS_FULL_SPEED     (0 << 5)\n#define USBHS_HIGH_SPEED     (1 << 5)\n#define USBHS_LOW_SPEED      (2 << 5)\n#define USBHS_HOST_MODE      (1 << 7)\n\n// USB_INT_EN\n#define USBHS_INT_EN_OFFSET 0x02\n#define USBHS_BUS_RST_EN    (1 << 0)\n#define USBHS_DETECT_EN     (1 << 0)\n#define USBHS_TRANSFER_EN   (1 << 1)\n#define USBHS_SUSPEND_EN    (1 << 2)\n#define USBHS_SOF_ACT_EN    (1 << 3)\n#define USBHS_FIFO_OV_EN    (1 << 4)\n#define USBHS_SETUP_ACT_EN  (1 << 5)\n#define USBHS_ISO_ACT_EN    (1 << 6)\n#define USBHS_DEV_NAK_EN    (1 << 7)\n\n// USB DEV AD\n#define USBHS_DEV_AD_OFFSET 0x03\n\n// USB FRAME_NO\n#define USBHS_FRAME_NO_OFFSET 0x04\n#define USBHS_FRAME_NO_NUM_MASK (0x7FF)\n#define USBHS_FRAME_NO_MICROFRAME_SHIFT (11)\n#define USBHS_FRAME_NO_MICROFRAME_MASK  (0x7 << USBHS_FRAME_NO_MICROFRAME_SHIFT)\n\n// USB SUSPEND\n#define USBHS_SUSPEND_OFFSET    0x06\n#define USBHS_DEV_REMOTE_WAKEUP (1 << 2)\n#define USBHS_LINESTATE_MASK    (2 << 4) /* Read Only */\n\n// RESERVED0\n\n// USB SPEED TYPE\n#define USBHS_SPEED_TYPE_OFFSET 0x08\n#define USBHS_SPEED_TYPE_MASK    0x03\n#define USBHS_SPEED_TYPE_FULL    0\n#define USBHS_SPEED_TYPE_HIGH    1\n#define USBHS_SPEED_TYPE_LOW     2\n\n// USB_MIS_ST\n#define USBHS_MIS_ST_OFFSET 0x09\n#define USBHS_SPLIT_CAN     (1 << 0)\n#define USBHS_ATTACH        (1 << 1)\n#define USBHS_SUSPEND       (1 << 2)\n#define USBHS_BUS_RESET     (1 << 3)\n#define USBHS_R_FIFO_RDY    (1 << 4)\n#define USBHS_SIE_FREE      (1 << 5)\n#define USBHS_SOF_ACT       (1 << 6)\n#define USBHS_SOF_PRES      (1 << 7)\n\n// INT_FLAG\n#define USBHS_INT_FLAG_OFFSET 0x0A\n#define USBHS_BUS_RST_FLAG    (1 << 0)\n#define USBHS_DETECT_FLAG     (1 << 0)\n#define USBHS_TRANSFER_FLAG   (1 << 1)\n#define USBHS_SUSPEND_FLAG    (1 << 2)\n#define USBHS_HST_SOF_FLAG    (1 << 3)\n#define USBHS_FIFO_OV_FLAG    (1 << 4)\n#define USBHS_SETUP_FLAG      (1 << 5)\n#define USBHS_ISO_ACT_FLAG    (1 << 6)\n\n// INT_ST\n#define USBHS_INT_ST_OFFSET   0x0B\n#define USBHS_DEV_UIS_IS_NAK  (1 << 7)\n#define USBHS_DEV_UIS_TOG_OK  (1 << 6)\n#define MASK_UIS_TOKEN        (3 << 4)\n#define USBHS_TOKEN_PID_OUT   (0 << 4)\n#define USBHS_TOKEN_PID_SOF   (1 << 4)\n#define USBHS_TOKEN_PID_IN    (2 << 4)\n#define USBHS_TOKEN_PID_SETUP (3 << 4)\n#define MASK_UIS_ENDP         (0x0F)\n#define MASK_UIS_H_RES        (0x0F)\n\n#define USBHS_TOGGLE_OK (0x40)\n#define USBHS_HOST_RES  (0x0f)\n\n//USB_RX_LEN\n#define USBHS_RX_LEN_OFFSET 0x0C\n/******************* DEVICE ******************/\n\n//UEP_CONFIG\n#define USBHS_UEP_CONFIG_OFFSET 0x10\n#define USBHS_EP0_T_EN          (1 << 0)\n#define USBHS_EP0_R_EN          (1 << 16)\n\n#define USBHS_EP1_T_EN (1 << 1)\n#define USBHS_EP1_R_EN (1 << 17)\n\n#define USBHS_EP2_T_EN (1 << 2)\n#define USBHS_EP2_R_EN (1 << 18)\n\n#define USBHS_EP3_T_EN (1 << 3)\n#define USBHS_EP3_R_EN (1 << 19)\n\n#define USBHS_EP4_T_EN (1 << 4)\n#define USBHS_EP4_R_EN (1 << 20)\n\n#define USBHS_EP5_T_EN (1 << 5)\n#define USBHS_EP5_R_EN (1 << 21)\n\n#define USBHS_EP6_T_EN (1 << 6)\n#define USBHS_EP6_R_EN (1 << 22)\n\n#define USBHS_EP7_T_EN (1 << 7)\n#define USBHS_EP7_R_EN (1 << 23)\n\n#define USBHS_EP8_T_EN (1 << 8)\n#define USBHS_EP8_R_EN (1 << 24)\n\n#define USBHS_EP9_T_EN (1 << 9)\n#define USBHS_EP9_R_EN (1 << 25)\n\n#define USBHS_EP10_T_EN (1 << 10)\n#define USBHS_EP10_R_EN (1 << 26)\n\n#define USBHS_EP11_T_EN (1 << 11)\n#define USBHS_EP11_R_EN (1 << 27)\n\n#define USBHS_EP12_T_EN (1 << 12)\n#define USBHS_EP12_R_EN (1 << 28)\n\n#define USBHS_EP13_T_EN (1 << 13)\n#define USBHS_EP13_R_EN (1 << 29)\n\n#define USBHS_EP14_T_EN (1 << 14)\n#define USBHS_EP14_R_EN (1 << 30)\n\n#define USBHS_EP15_T_EN (1 << 15)\n#define USBHS_EP15_R_EN (1 << 31)\n\n//UEP_TYPE\n#define USBHS_UEP_TYPE_OFFSET 0x14\n#define USBHS_EP0_T_TYP       (1 << 0)\n#define USBHS_EP0_R_TYP       (1 << 16)\n\n#define USBHS_EP1_T_TYP (1 << 1)\n#define USBHS_EP1_R_TYP (1 << 17)\n\n#define USBHS_EP2_T_TYP (1 << 2)\n#define USBHS_EP2_R_TYP (1 << 18)\n\n#define USBHS_EP3_T_TYP (1 << 3)\n#define USBHS_EP3_R_TYP (1 << 19)\n\n#define USBHS_EP4_T_TYP (1 << 4)\n#define USBHS_EP4_R_TYP (1 << 20)\n\n#define USBHS_EP5_T_TYP (1 << 5)\n#define USBHS_EP5_R_TYP (1 << 21)\n\n#define USBHS_EP6_T_TYP (1 << 6)\n#define USBHS_EP6_R_TYP (1 << 22)\n\n#define USBHS_EP7_T_TYP (1 << 7)\n#define USBHS_EP7_R_TYP (1 << 23)\n\n#define USBHS_EP8_T_TYP (1 << 8)\n#define USBHS_EP8_R_TYP (1 << 24)\n\n#define USBHS_EP9_T_TYP (1 << 8)\n#define USBHS_EP9_R_TYP (1 << 25)\n\n#define USBHS_EP10_T_TYP (1 << 10)\n#define USBHS_EP10_R_TYP (1 << 26)\n\n#define USBHS_EP11_T_TYP (1 << 11)\n#define USBHS_EP11_R_TYP (1 << 27)\n\n#define USBHS_EP12_T_TYP (1 << 12)\n#define USBHS_EP12_R_TYP (1 << 28)\n\n#define USBHS_EP13_T_TYP (1 << 13)\n#define USBHS_EP13_R_TYP (1 << 29)\n\n#define USBHS_EP14_T_TYP (1 << 14)\n#define USBHS_EP14_R_TYP (1 << 30)\n\n#define USBHS_EP15_T_TYP (1 << 15)\n#define USBHS_EP15_R_TYP (1 << 31)\n\n/* BUF_MOD UEP1~15 */\n#define USBHS_BUF_MOD_OFFSET  0x18\n#define USBHS_EP0_BUF_MOD     (1 << 0)\n#define USBHS_EP0_ISO_BUF_MOD (1 << 16)\n\n#define USBHS_EP1_BUF_MOD     (1 << 1)\n#define USBHS_EP1_ISO_BUF_MOD (1 << 17)\n\n#define USBHS_EP2_BUF_MOD     (1 << 2)\n#define USBHS_EP2_ISO_BUF_MOD (1 << 18)\n\n#define USBHS_EP3_BUF_MOD     (1 << 3)\n#define USBHS_EP3_ISO_BUF_MOD (1 << 19)\n\n#define USBHS_EP4_BUF_MOD     (1 << 4)\n#define USBHS_EP4_ISO_BUF_MOD (1 << 20)\n\n#define USBHS_EP5_BUF_MOD     (1 << 5)\n#define USBHS_EP5_ISO_BUF_MOD (1 << 21)\n\n#define USBHS_EP6_BUF_MOD     (1 << 6)\n#define USBHS_EP6_ISO_BUF_MOD (1 << 22)\n\n#define USBHS_EP7_BUF_MOD     (1 << 7)\n#define USBHS_EP7_ISO_BUF_MOD (1 << 23)\n\n#define USBHS_EP8_BUF_MOD     (1 << 8)\n#define USBHS_EP8_ISO_BUF_MOD (1 << 24)\n\n#define USBHS_EP9_BUF_MOD     (1 << 9)\n#define USBHS_EP9_ISO_BUF_MOD (1 << 25)\n\n#define USBHS_EP10_BUF_MOD     (1 << 10)\n#define USBHS_EP10_ISO_BUF_MOD (1 << 26)\n\n#define USBHS_EP11_BUF_MOD     (1 << 11)\n#define USBHS_EP11_ISO_BUF_MOD (1 << 27)\n\n#define USBHS_EP12_BUF_MOD     (1 << 12)\n#define USBHS_EP12_ISO_BUF_MOD (1 << 28)\n\n#define USBHS_EP13_BUF_MOD     (1 << 13)\n#define USBHS_EP13_ISO_BUF_MOD (1 << 29)\n\n#define USBHS_EP14_BUF_MOD     (1 << 14)\n#define USBHS_EP14_ISO_BUF_MOD (1 << 30)\n\n#define USBHS_EP15_BUF_MOD     (1 << 15)\n#define USBHS_EP15_ISO_BUF_MOD (1 << 31)\n//USBHS_EPn_T_EN  USBHS_EPn_R_EN  USBHS_EPn_BUF_MOD  Description: Arrange from low to high with UEPn_DMA as the starting address\n//      0               0               x            The endpoint is disabled and the UEPn_*_DMA buffers are not used.\n//      1               0               0            The first address of the receive (OUT) buffer is UEPn_RX_DMA\n//      1               0               1            RB_UEPn_RX_TOG[0]=0, use buffer UEPn_RX_DMA RB_UEPn_RX_TOG[0]=1, use buffer UEPn_TX_DMA\n//      0               1               0            The first address of the transmit (IN) buffer is UEPn_TX_DMA.\n//      0               1               1            RB_UEPn_TX_TOG[0]=0, use buffer UEPn_TX_DMA RB_UEPn_TX_TOG[0]=1, use buffer UEPn_RX_DMA\n\n/* USB0_DMA */\n#define USBHS_UEP0_DMA_OFFSET(n) (0x1C) // endpoint 0 DMA buffer address\n\n/* USBX_RX_DMA */\n#define USBHS_UEPx_RX_DMA_OFFSET(n) (0x1C + 4 * (n)) // endpoint x DMA buffer address\n\n#define USBHS_UEPx_TX_DMA_OFFSET(n) (0x58 + 4 * (n)) // endpoint x DMA buffer address\n\n#define USBHS_UEPx_MAX_LEN_OFFSET(n) (0x98 + 4 * (n)) // endpoint x DMA buffer address\n\n#define USBHS_UEPx_T_LEN_OFFSET(n)   (0xD8 + 4 * (n)) // endpoint x DMA buffer address\n#define USBHS_UEPx_TX_CTRL_OFFSET(n) (0xD8 + 4 * (n) + 2) // endpoint x DMA buffer address\n#define USBHS_UEPx_RX_CTRL_OFFSET(n) (0xD8 + 4 * (n) + 3) // endpoint x DMA buffer address\n\n// UEPn_T_LEN\n#define USBHS_EP_T_LEN_MASK (0x7FF)\n\n//UEPn_TX_CTRL\n#define USBHS_EP_T_RES_MASK  (3 << 0)\n#define USBHS_EP_T_RES_ACK   (0 << 0)\n#define USBHS_EP_T_RES_NYET  (1 << 0)\n#define USBHS_EP_T_RES_NAK   (2 << 0)\n#define USBHS_EP_T_RES_STALL (3 << 0)\n\n#define USBHS_EP_T_TOG_MASK (3 << 3)\n#define USBHS_EP_T_TOG_0    (0 << 3)\n#define USBHS_EP_T_TOG_1    (1 << 3)\n#define USBHS_EP_T_TOG_2    (2 << 3)\n#define USBHS_EP_T_TOG_M    (3 << 3)\n\n#define USBHS_EP_T_AUTOTOG (1 << 5)\n\n//UEPn_RX_CTRL\n#define USBHS_EP_R_RES_MASK  (3 << 0)\n#define USBHS_EP_R_RES_ACK   (0 << 0)\n#define USBHS_EP_R_RES_NYET  (1 << 0)\n#define USBHS_EP_R_RES_NAK   (2 << 0)\n#define USBHS_EP_R_RES_STALL (3 << 0)\n\n#define USBHS_EP_R_TOG_MASK (3 << 3)\n#define USBHS_EP_R_TOG_0    (0 << 3)\n#define USBHS_EP_R_TOG_1    (1 << 3)\n#define USBHS_EP_R_TOG_2    (2 << 3)\n#define USBHS_EP_R_TOG_M    (3 << 3)\n\n#define USBHS_EP_R_AUTOTOG (1 << 5)\n\n#define USBHS_TOG_MATCH (1 << 6)\n\n/******************* HOST ******************/\n// USB HOST_CTRL\n#define USBHS_SEND_BUS_RESET   (1 << 0)\n#define USBHS_SEND_BUS_SUSPEND (1 << 1)\n#define USBHS_SEND_BUS_RESUME  (1 << 2)\n#define USBHS_REMOTE_WAKE      (1 << 3)\n#define USBHS_PHY_SUSPENDM     (1 << 4)\n#define USBHS_UH_SOFT_FREE     (1 << 6)\n#define USBHS_SEND_SOF_EN      (1 << 7)\n\n//UH_CONFIG\n#define USBHS_HOST_TX_EN (1 << 3)\n#define USBHS_HOST_RX_EN (1 << 18)\n\n// HOST_EP_TYPE\n#define USBHS_ENDP_TX_ISO (1 << 3)\n#define USBHS_ENDP_RX_ISO (1 << (16 + 2))\n\n// R32_UH_EP_PID\n#define USBHS_HOST_MASK_TOKEN (0x0f)\n#define USBHS_HOST_MASK_ENDP  (0x0f << 4)\n\n//R8_UH_RX_CTRL\n#define USBHS_EP_R_RES_MASK  (3 << 0)\n#define USBHS_EP_R_RES_ACK   (0 << 0)\n#define USBHS_EP_R_RES_NYET  (1 << 0)\n#define USBHS_EP_R_RES_NAK   (2 << 0)\n#define USBHS_EP_R_RES_STALL (3 << 0)\n\n#define USBHS_UH_R_RES_NO   (1 << 2)\n#define USBHS_UH_R_TOG_1    (1 << 3)\n#define USBHS_UH_R_TOG_2    (2 << 3)\n#define USBHS_UH_R_TOG_3    (3 << 3)\n#define USBHS_UH_R_TOG_AUTO (1 << 5)\n#define USBHS_UH_R_DATA_NO  (1 << 6)\n//R8_UH_TX_CTRL\n#define USBHS_UH_T_RES_MASK  (3 << 0)\n#define USBHS_UH_T_RES_ACK   (0 << 0)\n#define USBHS_UH_T_RES_NYET  (1 << 0)\n#define USBHS_UH_T_RES_NAK   (2 << 0)\n#define USBHS_UH_T_RES_STALL (3 << 0)\n\n#define USBHS_UH_T_RES_NO   (1 << 2)\n#define USBHS_UH_T_TOG_1    (1 << 3)\n#define USBHS_UH_T_TOG_2    (2 << 3)\n#define USBHS_UH_T_TOG_3    (3 << 3)\n#define USBHS_UH_T_TOG_AUTO (1 << 5)\n#define USBHS_UH_T_DATA_NO  (1 << 6)\n\n\n#endif\n"
  },
  {
    "path": "src/portable/wch/dcd_ch32_usbfs.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Matthew Tran\n * Copyright (c) 2024 hathach\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_WCH_USBFS) && CFG_TUD_WCH_USBIP_USBFS\n\n#include \"device/dcd.h\"\n#include \"ch32_usbfs_reg.h\"\n\n/* private defines */\n#define EP_MAX (8)\n\n#define EP_DMA(ep)     ((&USBOTG_FS->UEP0_DMA)[ep])\n#define EP_TX_LEN(ep)  ((&USBOTG_FS->UEP0_TX_LEN)[2 * ep])\n#define EP_TX_CTRL(ep) ((&USBOTG_FS->UEP0_TX_CTRL)[4 * ep])\n#define EP_RX_CTRL(ep) ((&USBOTG_FS->UEP0_RX_CTRL)[4 * ep])\n\n/* private data */\nstruct usb_xfer {\n  bool valid;\n  uint8_t* buffer;\n  size_t len;\n  size_t processed_len;\n  size_t max_size;\n};\n\nstatic struct {\n  bool ep0_tog;\n  bool isochronous[EP_MAX];\n  struct usb_xfer xfer[EP_MAX][2];\n  TU_ATTR_ALIGNED(4) uint8_t buffer[EP_MAX][2][64];\n  TU_ATTR_ALIGNED(4) struct {\n    // OUT transfers >64 bytes will overwrite queued IN data!\n    uint8_t out[64];\n    uint8_t in[1023];\n    uint8_t pad;\n  } ep3_buffer;\n} data;\n\n/* private helpers */\nstatic void update_in(uint8_t rhport, uint8_t ep, bool force) {\n  struct usb_xfer* xfer = &data.xfer[ep][TUSB_DIR_IN];\n  if (xfer->valid) {\n    if (force || xfer->len) {\n      size_t len = TU_MIN(xfer->max_size, xfer->len);\n      if (ep == 0) {\n        memcpy(data.buffer[ep][TUSB_DIR_OUT], xfer->buffer, len); // ep0 uses same chunk\n      } else if (ep == 3) {\n        memcpy(data.ep3_buffer.in, xfer->buffer, len);\n      } else {\n        memcpy(data.buffer[ep][TUSB_DIR_IN], xfer->buffer, len);\n      }\n      xfer->buffer += len;\n      xfer->len -= len;\n      xfer->processed_len += len;\n\n      EP_TX_LEN(ep) = len;\n      if (ep == 0) {\n        EP_TX_CTRL(0) = USBFS_EP_T_RES_ACK | (data.ep0_tog ? USBFS_EP_T_TOG : 0);\n        data.ep0_tog = !data.ep0_tog;\n      } else if (data.isochronous[ep]) {\n        EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~(USBFS_EP_T_RES_MASK)) | USBFS_EP_T_RES_NYET;\n      } else {\n        EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~(USBFS_EP_T_RES_MASK)) | USBFS_EP_T_RES_ACK;\n      }\n    } else {\n      xfer->valid = false;\n      EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~(USBFS_EP_T_RES_MASK)) | USBFS_EP_T_RES_NAK;\n      dcd_event_xfer_complete(\n          rhport, ep | TUSB_DIR_IN_MASK, xfer->processed_len,\n          XFER_RESULT_SUCCESS, true);\n    }\n  }\n}\n\nstatic void update_out(uint8_t rhport, uint8_t ep, size_t rx_len) {\n  struct usb_xfer* xfer = &data.xfer[ep][TUSB_DIR_OUT];\n  if (xfer->valid) {\n    size_t len = TU_MIN(xfer->max_size, TU_MIN(xfer->len, rx_len));\n    if (ep == 3) {\n      memcpy(xfer->buffer, data.ep3_buffer.out, len);\n    } else {\n      memcpy(xfer->buffer, data.buffer[ep][TUSB_DIR_OUT], len);\n    }\n    xfer->buffer += len;\n    xfer->len -= len;\n    xfer->processed_len += len;\n\n    if (xfer->len == 0 || len < xfer->max_size) {\n      xfer->valid = false;\n      dcd_event_xfer_complete(rhport, ep, xfer->processed_len, XFER_RESULT_SUCCESS, true);\n    }\n\n    if (ep == 0) {\n      EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;\n    }\n  }\n}\n\n/* public functions */\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rh_init;\n  // init registers\n  USBOTG_FS->BASE_CTRL = USBFS_CTRL_SYS_CTRL | USBFS_CTRL_INT_BUSY | USBFS_CTRL_DMA_EN;\n  USBOTG_FS->UDEV_CTRL = USBFS_UDEV_CTRL_PD_DIS | USBFS_UDEV_CTRL_PORT_EN;\n  USBOTG_FS->DEV_ADDR = 0x00;\n\n  USBOTG_FS->INT_FG = 0xFF;\n  USBOTG_FS->INT_EN = USBFS_INT_EN_BUS_RST | USBFS_INT_EN_TRANSFER | USBFS_INT_EN_SUSPEND;\n\n  // setup endpoint 0\n  EP_DMA(0) = (uint32_t) &data.buffer[0][0];\n  EP_TX_LEN(0) = 0;\n  EP_TX_CTRL(0) = USBFS_EP_T_RES_NAK;\n  EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;\n\n  // enable other endpoints but NAK everything\n  USBOTG_FS->UEP4_1_MOD = 0xCC;\n  USBOTG_FS->UEP2_3_MOD = 0xCC;\n  USBOTG_FS->UEP5_6_MOD = 0xCC;\n  USBOTG_FS->UEP7_MOD = 0x0C;\n\n  for (uint8_t ep = 1; ep < EP_MAX; ep++) {\n    EP_DMA(ep) = (uint32_t) &data.buffer[ep][0];\n    EP_TX_LEN(ep) = 0;\n    EP_TX_CTRL(ep) = USBFS_EP_T_AUTO_TOG | USBFS_EP_T_RES_NAK;\n    EP_RX_CTRL(ep) = USBFS_EP_R_AUTO_TOG | USBFS_EP_R_RES_NAK;\n  }\n  EP_DMA(3) = (uint32_t) &data.ep3_buffer.out[0];\n\n  dcd_connect(rhport);\n\n  return true;\n}\n\nvoid dcd_int_handler(uint8_t rhport) {\n  (void) rhport;\n  uint8_t status = USBOTG_FS->INT_FG;\n  if (status & USBFS_INT_FG_TRANSFER) {\n    uint8_t ep = USBFS_INT_ST_MASK_UIS_ENDP(USBOTG_FS->INT_ST);\n    uint8_t token = USBFS_INT_ST_MASK_UIS_TOKEN(USBOTG_FS->INT_ST);\n\n    switch (token) {\n      case PID_OUT: {\n        uint16_t rx_len = USBOTG_FS->RX_LEN;\n        update_out(rhport, ep, rx_len);\n        break;\n      }\n\n      case PID_IN:\n        update_in(rhport, ep, false);\n        break;\n\n      case PID_SETUP:\n        // setup clears stall\n        EP_TX_CTRL(0) = USBFS_EP_T_RES_NAK;\n        EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;\n\n        data.ep0_tog = true;\n        dcd_event_setup_received(rhport, &data.buffer[0][TUSB_DIR_OUT][0], true);\n        break;\n    }\n\n    USBOTG_FS->INT_FG = USBFS_INT_FG_TRANSFER;\n  } else if (status & USBFS_INT_FG_BUS_RST) {\n    data.ep0_tog = true;\n    data.xfer[0][TUSB_DIR_OUT].max_size = 64;\n    data.xfer[0][TUSB_DIR_IN].max_size = 64;\n\n    //dcd_event_bus_reset(rhport, (USBOTG_FS->BASE_CTRL & USBFS_CTRL_LOW_SPEED) ? TUSB_SPEED_LOW : TUSB_SPEED_FULL, true);\n    dcd_event_bus_reset(rhport, (USBOTG_FS->UDEV_CTRL & USBFS_UDEV_CTRL_LOW_SPEED) ? TUSB_SPEED_LOW : TUSB_SPEED_FULL, true);\n\n    USBOTG_FS->DEV_ADDR = 0x00;\n    EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;\n\n    USBOTG_FS->INT_FG = USBFS_INT_FG_BUS_RST;\n  } else if (status & USBFS_INT_FG_SUSPEND) {\n    dcd_event_t event = {.rhport = rhport, .event_id = DCD_EVENT_SUSPEND};\n    dcd_event_handler(&event, true);\n    USBOTG_FS->INT_FG = USBFS_INT_FG_SUSPEND;\n  }\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(USBHD_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(USBHD_IRQn);\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  (void) dev_addr;\n  dcd_edpt_xfer(rhport, 0x80, NULL, 0, false); // zlp status response\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  (void) rhport;\n  // TODO optional\n}\n\nvoid dcd_connect(uint8_t rhport) {\n  (void) rhport;\n  USBOTG_FS->BASE_CTRL |= USBFS_CTRL_DEV_PUEN;\n}\n\nvoid dcd_disconnect(uint8_t rhport) {\n  (void) rhport;\n  USBOTG_FS->BASE_CTRL &= ~USBFS_CTRL_DEV_PUEN;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void) rhport;\n  (void) en;\n\n  // TODO implement later\n}\n\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const* request) {\n  (void) rhport;\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD &&\n      request->bRequest == TUSB_REQ_SET_ADDRESS) {\n    USBOTG_FS->DEV_ADDR = (uint8_t) request->wValue;\n  }\n  EP_TX_CTRL(0) = USBFS_EP_T_RES_NAK;\n  EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;\n}\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const* desc_ep) {\n  (void) rhport;\n  uint8_t ep = tu_edpt_number(desc_ep->bEndpointAddress);\n  uint8_t dir = tu_edpt_dir(desc_ep->bEndpointAddress);\n  TU_ASSERT(ep < EP_MAX);\n\n  data.isochronous[ep] = desc_ep->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS;\n  data.xfer[ep][dir].max_size = tu_edpt_packet_size(desc_ep);\n\n  if (ep != 0) {\n    if (dir == TUSB_DIR_OUT) {\n      if (data.isochronous[ep]) {\n        EP_RX_CTRL(ep) = USBFS_EP_R_AUTO_TOG | USBFS_EP_R_RES_NYET;\n      } else {\n        EP_RX_CTRL(ep) = USBFS_EP_R_AUTO_TOG | USBFS_EP_R_RES_ACK;\n      }\n    } else {\n      EP_TX_LEN(ep) = 0;\n      EP_TX_CTRL(ep) = USBFS_EP_T_AUTO_TOG | USBFS_EP_T_RES_NAK;\n    }\n  }\n  return true;\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  (void) rhport;\n  // TODO optional\n}\n\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void)largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, const tusb_desc_endpoint_t *desc_ep) {\n  (void)rhport;\n  (void)desc_ep;\n  return false;\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr) {\n  (void) is_isr;\n  (void) rhport;\n  uint8_t ep = tu_edpt_number(ep_addr);\n  uint8_t dir = tu_edpt_dir(ep_addr);\n\n  struct usb_xfer* xfer = &data.xfer[ep][dir];\n  dcd_int_disable(rhport);\n  xfer->valid = true;\n  xfer->buffer = buffer;\n  xfer->len = total_bytes;\n  xfer->processed_len = 0;\n  dcd_int_enable(rhport);\n\n  if (dir == TUSB_DIR_IN) {\n    update_in(rhport, ep, true);\n  }\n  return true;\n}\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n  uint8_t ep = tu_edpt_number(ep_addr);\n  uint8_t dir = tu_edpt_dir(ep_addr);\n  if (ep == 0) {\n    if (dir == TUSB_DIR_OUT) {\n      EP_RX_CTRL(0) = USBFS_EP_R_RES_STALL;\n    } else {\n      EP_TX_LEN(0) = 0;\n      EP_TX_CTRL(0) = USBFS_EP_T_RES_STALL;\n    }\n  } else {\n    if (dir == TUSB_DIR_OUT) {\n      EP_RX_CTRL(ep) = (EP_RX_CTRL(ep) & ~USBFS_EP_R_RES_MASK) | USBFS_EP_R_RES_STALL;\n    } else {\n      EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~USBFS_EP_T_RES_MASK) | USBFS_EP_T_RES_STALL;\n    }\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n  uint8_t ep = tu_edpt_number(ep_addr);\n  uint8_t dir = tu_edpt_dir(ep_addr);\n  if (ep == 0) {\n    if (dir == TUSB_DIR_OUT) {\n      EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;\n    }\n  } else {\n    if (dir == TUSB_DIR_OUT) {\n      EP_RX_CTRL(ep) = (EP_RX_CTRL(ep) & ~(USBFS_EP_R_RES_MASK | USBFS_EP_R_TOG)) | USBFS_EP_R_RES_ACK;\n    } else {\n      EP_TX_CTRL(ep) = (EP_TX_CTRL(ep) & ~(USBFS_EP_T_RES_MASK | USBFS_EP_T_TOG)) | USBFS_EP_T_RES_NAK;\n    }\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/wch/dcd_ch32_usbhs.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Greg Davill\n * Copyright (c) 2023 Denis Krasutski\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUD_ENABLED && defined(TUP_USBIP_WCH_USBHS) && defined(CFG_TUD_WCH_USBIP_USBHS) && \\\n  (CFG_TUD_WCH_USBIP_USBHS == 1)\n  #include \"ch32_usbhs_reg.h\"\n\n  #include \"device/dcd.h\"\n\n  // Max number of bi-directional endpoints including EP0\n  #define EP_MAX 16\n\ntypedef struct {\n  uint8_t* buffer;\n  uint16_t total_len;\n  uint16_t queued_len;\n  uint16_t max_size;\n  bool is_last_packet;\n  bool is_iso;\n} xfer_ctl_t;\n\ntypedef enum {\n  EP_RESPONSE_ACK,\n  EP_RESPONSE_NAK,\n} ep_response_list_t;\n\n#define XFER_CTL_BASE(_ep, _dir) &xfer_status[_ep][_dir]\nstatic xfer_ctl_t xfer_status[EP_MAX][2];\n\n#define EP_TX_LEN(ep)     *(volatile uint16_t *)((volatile uint16_t *)&(USBHSD->UEP0_TX_LEN) + (ep) * 2)\n#define EP_TX_CTRL(ep)    *(volatile uint8_t *)((volatile uint8_t *)&(USBHSD->UEP0_TX_CTRL) + (ep) * 4)\n#define EP_RX_CTRL(ep)    *(volatile uint8_t *)((volatile uint8_t *)&(USBHSD->UEP0_RX_CTRL) + (ep) * 4)\n#define EP_RX_MAX_LEN(ep) *(volatile uint16_t *)((volatile uint16_t *)&(USBHSD->UEP0_MAX_LEN) + (ep) * 2)\n\n#define EP_TX_DMA_ADDR(ep) *(volatile uint32_t *)((volatile uint32_t *)&(USBHSD->UEP1_TX_DMA) + (ep - 1))\n#define EP_RX_DMA_ADDR(ep) *(volatile uint32_t *)((volatile uint32_t *)&(USBHSD->UEP1_RX_DMA) + (ep - 1))\n\n/* Endpoint Buffer */\nTU_ATTR_ALIGNED(4) static uint8_t ep0_buffer[CFG_TUD_ENDPOINT0_SIZE];\n\nstatic void ep_set_response_and_toggle(uint8_t ep_num, tusb_dir_t ep_dir, ep_response_list_t response_type) {\n  if (ep_dir == TUSB_DIR_IN) {\n    uint8_t response = (response_type == EP_RESPONSE_ACK) ? USBHS_EP_T_RES_ACK : USBHS_EP_T_RES_NAK;\n    if (ep_num == 0) {\n      if (response_type == EP_RESPONSE_ACK) {\n        if (EP_TX_LEN(ep_num) == 0) {\n          EP_TX_CTRL(ep_num) |= USBHS_EP_T_TOG_1;\n        } else {\n          EP_TX_CTRL(ep_num) ^= USBHS_EP_T_TOG_1;\n        }\n      }\n    }\n    if (xfer_status[ep_num][TUSB_DIR_IN].is_iso == true) {\n      EP_TX_CTRL(ep_num) = USBHS_EP_T_AUTOTOG;\n    } else {\n      EP_TX_CTRL(ep_num) = (EP_TX_CTRL(ep_num) & ~(USBHS_EP_T_RES_MASK)) | response;\n    }\n  } else {\n    uint8_t response = (response_type == EP_RESPONSE_ACK) ? USBHS_EP_R_RES_ACK : USBHS_EP_R_RES_NAK;\n    if (ep_num == 0) {\n      if (response_type == EP_RESPONSE_ACK) {\n        if (xfer_status[ep_num][TUSB_DIR_OUT].queued_len == 0) {\n          EP_RX_CTRL(ep_num) |= USBHS_EP_R_TOG_1;\n        }\n      } else {\n        EP_RX_CTRL(ep_num) ^= USBHS_EP_R_TOG_1;\n      }\n    }\n    EP_RX_CTRL(ep_num) = (EP_RX_CTRL(ep_num) & ~(USBHS_EP_R_RES_MASK)) | response;\n  }\n}\n\nstatic void xfer_data_packet(uint8_t ep_num, tusb_dir_t ep_dir, xfer_ctl_t* xfer) {\n  if (ep_dir == TUSB_DIR_IN) {\n    uint16_t remaining = xfer->total_len - xfer->queued_len;\n    uint16_t next_tx_size = TU_MIN(remaining, xfer->max_size);\n\n    if (ep_num == 0) {\n      memcpy(ep0_buffer, &xfer->buffer[xfer->queued_len], next_tx_size);\n    } else {\n      EP_TX_DMA_ADDR(ep_num) = (uint32_t) &xfer->buffer[xfer->queued_len];\n    }\n\n    EP_TX_LEN(ep_num) = next_tx_size;\n    xfer->queued_len += next_tx_size;\n    if (xfer->queued_len == xfer->total_len) {\n      xfer->is_last_packet = true;\n    }\n    if (xfer->is_iso == true) {\n      /* Enable EP to generate ISA_ACT interrupt */\n      USBHSD->ENDP_CONFIG |= (USBHS_EP0_T_EN << ep_num);\n    }\n  } else { /* TUSB_DIR_OUT */\n    uint16_t left_to_receive = xfer->total_len - xfer->queued_len;\n    uint16_t max_possible_rx_size = TU_MIN(xfer->max_size, left_to_receive);\n\n    if (max_possible_rx_size == left_to_receive) {\n      xfer->is_last_packet = true;\n    }\n\n    if (ep_num > 0) {\n      EP_RX_DMA_ADDR(ep_num) = (uint32_t) &xfer->buffer[xfer->queued_len];\n      EP_RX_MAX_LEN(ep_num) = max_possible_rx_size;\n    }\n  }\n  ep_set_response_and_toggle(ep_num, ep_dir, USBHS_EP_R_RES_ACK);\n}\n\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  (void) rhport;\n  (void) rh_init;\n\n  memset(&xfer_status, 0, sizeof(xfer_status));\n\n  USBHSD->HOST_CTRL = 0x00;\n  USBHSD->HOST_CTRL = USBHS_PHY_SUSPENDM;\n\n  USBHSD->CONTROL = 0;\n\n#if TUD_OPT_HIGH_SPEED\n  USBHSD->CONTROL = USBHS_DMA_EN | USBHS_INT_BUSY_EN | USBHS_HIGH_SPEED;\n#else\n  #error OPT_MODE_FULL_SPEED not currently supported on CH32\n  USBHSD->CONTROL = USBHS_DMA_EN | USBHS_INT_BUSY_EN | USBHS_FULL_SPEED;\n#endif\n\n  USBHSD->INT_EN = 0;\n  USBHSD->INT_EN = USBHS_SETUP_ACT_EN | USBHS_TRANSFER_EN | USBHS_BUS_RST_EN | USBHS_SUSPEND_EN | USBHS_ISO_ACT_EN;\n\n  USBHSD->ENDP_CONFIG = USBHS_EP0_T_EN | USBHS_EP0_R_EN;\n  USBHSD->ENDP_TYPE = 0x00;\n  USBHSD->BUF_MODE = 0x00;\n\n  for (int ep = 0; ep < EP_MAX; ep++) {\n    EP_TX_LEN(ep) = 0;\n    EP_TX_CTRL(ep) = USBHS_EP_T_AUTOTOG | USBHS_EP_T_RES_NAK;\n    EP_RX_CTRL(ep) = USBHS_EP_R_AUTOTOG | USBHS_EP_R_RES_NAK;\n\n    EP_RX_MAX_LEN(ep) = 0;\n  }\n\n  USBHSD->UEP0_DMA = (uint32_t) ep0_buffer;\n  USBHSD->UEP0_MAX_LEN = CFG_TUD_ENDPOINT0_SIZE;\n  xfer_status[0][TUSB_DIR_OUT].max_size = CFG_TUD_ENDPOINT0_SIZE;\n  xfer_status[0][TUSB_DIR_IN].max_size = CFG_TUD_ENDPOINT0_SIZE;\n\n  USBHSD->DEV_AD = 0;\n  USBHSD->CONTROL |= USBHS_DEV_PU_EN;\n\n  return true;\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(USBHS_IRQn);\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(USBHS_IRQn);\n}\n\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  (void) rhport;\n\n  for (size_t ep = 1; ep < EP_MAX; ep++) {\n    EP_TX_LEN(ep) = 0;\n    EP_TX_CTRL(ep) = USBHS_EP_T_AUTOTOG | USBHS_EP_T_RES_NAK;\n    EP_RX_CTRL(ep) = USBHS_EP_R_AUTOTOG | USBHS_EP_R_RES_NAK;\n\n    EP_RX_MAX_LEN(ep) = 0;\n  }\n\n  USBHSD->ENDP_CONFIG = USBHS_EP0_T_EN | USBHS_EP0_R_EN;\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  (void) dev_addr;\n\n  // Response with zlp status\n  dcd_edpt_xfer(rhport, 0x80, NULL, 0, false);\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  (void) rhport;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  (void) rhport;\n  if (en) {\n    USBHSD->INT_EN |= USBHS_SOF_ACT_EN;\n  } else {\n    USBHSD->INT_EN &= ~(USBHS_SOF_ACT_EN);\n  }\n}\n\nvoid dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const* request) {\n  (void) rhport;\n\n  if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&\n      request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD &&\n      request->bRequest == TUSB_REQ_SET_ADDRESS) {\n    USBHSD->DEV_AD = (uint8_t) request->wValue;\n  }\n\n  EP_TX_CTRL(0) = USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0;\n  EP_RX_CTRL(0) = USBHS_EP_R_RES_NAK | USBHS_EP_R_TOG_0;\n}\n\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const* desc_edpt) {\n  (void) rhport;\n\n  uint8_t const ep_num = tu_edpt_number(desc_edpt->bEndpointAddress);\n  tusb_dir_t const dir = tu_edpt_dir(desc_edpt->bEndpointAddress);\n\n  TU_ASSERT(ep_num < EP_MAX);\n\n  if (ep_num == 0) {\n    return true;\n  }\n\n  xfer_ctl_t* xfer = XFER_CTL_BASE(ep_num, dir);\n  xfer->max_size = tu_edpt_packet_size(desc_edpt);\n\n  xfer->is_iso = (desc_edpt->bmAttributes.xfer == TUSB_XFER_ISOCHRONOUS);\n  if (dir == TUSB_DIR_OUT) {\n    USBHSD->ENDP_CONFIG |= (USBHS_EP0_R_EN << ep_num);\n    EP_RX_CTRL(ep_num) = USBHS_EP_R_AUTOTOG | USBHS_EP_R_RES_NAK;\n    if (xfer->is_iso == true) {\n      USBHSD->ENDP_TYPE |= (USBHS_EP0_R_TYP << ep_num);\n    }\n    EP_RX_MAX_LEN(ep_num) = xfer->max_size;\n  } else {\n    if (xfer->is_iso == true) {\n      USBHSD->ENDP_TYPE |= (USBHS_EP0_T_TYP << ep_num);\n    } else {\n      /* Enable all types except Isochronous to avoid ISO_ACT interrupt generation */\n      USBHSD->ENDP_CONFIG |= (USBHS_EP0_T_EN << ep_num);\n    }\n    EP_TX_LEN(ep_num) = 0;\n    EP_TX_CTRL(ep_num) = USBHS_EP_T_AUTOTOG | USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0;\n  }\n\n  return true;\n}\n\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  tusb_dir_t const dir = tu_edpt_dir(ep_addr);\n\n  if (dir == TUSB_DIR_OUT) {\n    EP_RX_CTRL(ep_num) = USBHS_EP_R_AUTOTOG | USBHS_EP_R_RES_NAK;\n    EP_RX_MAX_LEN(ep_num) = 0;\n    USBHSD->ENDP_TYPE &= ~(USBHS_EP0_R_TYP << ep_num);\n    USBHSD->ENDP_CONFIG &= ~(USBHS_EP0_R_EN << ep_num);\n  } else {  // TUSB_DIR_IN\n    EP_TX_CTRL(ep_num) = USBHS_EP_T_AUTOTOG | USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0;\n    EP_TX_LEN(ep_num) = 0;\n    USBHSD->ENDP_TYPE &= ~(USBHS_EP0_T_TYP << ep_num);\n    USBHSD->ENDP_CONFIG &= ~(USBHS_EP0_T_EN << ep_num);\n  }\n}\n\n  #if 0\nbool dcd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {\n  (void) rhport;\n  (void) ep_addr;\n  (void) largest_packet_size;\n  return false;\n}\n\nbool dcd_edpt_iso_activate(uint8_t rhport, tusb_desc_endpoint_t const * desc_ep) {\n  (void) rhport;\n  (void) desc_ep;\n  return false;\n}\n  #endif\n\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  tusb_dir_t const dir = tu_edpt_dir(ep_addr);\n\n  if (dir == TUSB_DIR_OUT) {\n    EP_RX_CTRL(ep_num) = USBHS_EP_R_RES_STALL;\n  } else {\n    EP_TX_LEN(0) = 0;\n    EP_TX_CTRL(ep_num) = USBHS_EP_T_RES_STALL;\n  }\n}\n\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n  (void) rhport;\n\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  tusb_dir_t const dir = tu_edpt_dir(ep_addr);\n\n  if (dir == TUSB_DIR_OUT) {\n    EP_RX_CTRL(ep_num) = USBHS_EP_R_AUTOTOG | USBHS_EP_R_RES_NAK;\n  } else {\n    EP_TX_CTRL(ep_num) = USBHS_EP_T_AUTOTOG | USBHS_EP_R_RES_NAK;\n  }\n}\n\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes, bool is_isr) {\n  (void) is_isr;\n  (void) rhport;\n  uint8_t const ep_num = tu_edpt_number(ep_addr);\n  tusb_dir_t const dir = tu_edpt_dir(ep_addr);\n\n  xfer_ctl_t* xfer = XFER_CTL_BASE(ep_num, dir);\n  xfer->buffer = buffer;\n  xfer->total_len = total_bytes;\n  xfer->queued_len = 0;\n  xfer->is_last_packet = false;\n\n  xfer_data_packet(ep_num, dir, xfer);\n\n  return true;\n}\n\nvoid dcd_int_handler(uint8_t rhport) {\n  (void) rhport;\n\n  uint8_t int_flag = USBHSD->INT_FG;\n  uint8_t int_status = USBHSD->INT_ST;\n\n  if (int_flag & (USBHS_ISO_ACT_FLAG | USBHS_TRANSFER_FLAG)) {\n    uint8_t const token = int_status & MASK_UIS_TOKEN;\n\n    if (token == USBHS_TOKEN_PID_SOF) {\n      uint32_t frame_count = USBHSD->FRAME_NO & USBHS_FRAME_NO_NUM_MASK;\n      dcd_event_sof(rhport, frame_count, true);\n    }else {\n      uint8_t const ep_num = int_status & MASK_UIS_ENDP;\n      tusb_dir_t const ep_dir = (token == USBHS_TOKEN_PID_IN) ? TUSB_DIR_IN : TUSB_DIR_OUT;\n      uint8_t const ep_addr = tu_edpt_addr(ep_num, ep_dir);\n      xfer_ctl_t* xfer = XFER_CTL_BASE(ep_num, ep_dir);\n\n      if (token == USBHS_TOKEN_PID_OUT) {\n        uint16_t rx_len = USBHSD->RX_LEN;\n\n        if (ep_num == 0) {\n          memcpy(&xfer->buffer[xfer->queued_len], ep0_buffer, rx_len);\n        }\n\n        xfer->queued_len += rx_len;\n        if (rx_len < xfer->max_size) {\n          xfer->is_last_packet = true;\n        }\n      } else if (token == USBHS_TOKEN_PID_IN) {\n        if (xfer->is_iso && xfer->is_last_packet) {\n          /* Disable EP to avoid ISO_ACT interrupt generation */\n          USBHSD->ENDP_CONFIG &= ~(USBHS_EP0_T_EN << ep_num);\n        } else {\n          // Do nothing, no need to update xfer->is_last_packet, it is already updated in xfer_data_packet\n        }\n      }\n\n      if (xfer->is_last_packet == true) {\n        ep_set_response_and_toggle(ep_num, ep_dir, EP_RESPONSE_NAK);\n        dcd_event_xfer_complete(0, ep_addr, xfer->queued_len, XFER_RESULT_SUCCESS, true);\n      } else {\n        /* prepare next part of packet to xref */\n        xfer_data_packet(ep_num, ep_dir, xfer);\n      }\n    }\n\n    USBHSD->INT_FG = (int_flag & (USBHS_ISO_ACT_FLAG | USBHS_TRANSFER_FLAG)); /* Clear flag */\n  } else if (int_flag & USBHS_SETUP_FLAG) {\n    ep_set_response_and_toggle(0, TUSB_DIR_IN, EP_RESPONSE_NAK);\n    ep_set_response_and_toggle(0, TUSB_DIR_OUT, EP_RESPONSE_NAK);\n    dcd_event_setup_received(0, ep0_buffer, true);\n\n    USBHSD->INT_FG = USBHS_SETUP_FLAG; /* Clear flag */\n  } else if (int_flag & USBHS_BUS_RST_FLAG) {\n    // TODO CH32 does not detect actual speed at this time (should be known at end of reset)\n    // This interrupt probably triggered at start of bus reset\n//    tusb_speed_t actual_speed;\n//    switch(USBHSD->SPEED_TYPE & USBHS_SPEED_TYPE_MASK){\n//      case USBHS_SPEED_TYPE_HIGH:\n//        actual_speed = TUSB_SPEED_HIGH;\n//        break;\n//      case USBHS_SPEED_TYPE_FULL:\n//        actual_speed = TUSB_SPEED_FULL;\n//        break;\n//      case USBHS_SPEED_TYPE_LOW:\n//        actual_speed = TUSB_SPEED_LOW;\n//        break;\n//      default:\n//        TU_ASSERT(0,);\n//        break;\n//    }\n//    dcd_event_bus_reset(0, actual_speed, true);\n\n    dcd_event_bus_reset(0, TUSB_SPEED_HIGH, true);\n\n    USBHSD->DEV_AD = 0;\n    EP_RX_CTRL(0) = USBHS_EP_R_RES_ACK | USBHS_EP_R_TOG_0;\n    EP_TX_CTRL(0) = USBHS_EP_T_RES_NAK | USBHS_EP_T_TOG_0;\n\n    USBHSD->INT_FG = USBHS_BUS_RST_FLAG; /* Clear flag */\n  } else if (int_flag & USBHS_SUSPEND_FLAG) {\n    dcd_event_t event = {.rhport = rhport, .event_id = DCD_EVENT_SUSPEND};\n    dcd_event_handler(&event, true);\n\n    USBHSD->INT_FG = USBHS_SUSPEND_FLAG; /* Clear flag */\n  }\n}\n#endif\n"
  },
  {
    "path": "src/portable/wch/hcd_ch32_usbfs.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Mitsumine Suzu (verylowfreq)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED && defined(TUP_USBIP_WCH_USBFS) && defined(CFG_TUH_WCH_USBIP_USBFS) && CFG_TUH_WCH_USBIP_USBFS\n\n#include <stdlib.h>\n\n#include \"host/hcd.h\"\n#include \"host/usbh.h\"\n#include \"host/usbh_pvt.h\"\n\n#include \"bsp/board_api.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"\n#endif\n\n#include \"ch32v20x.h\"\n\n#ifdef __GNUC__\n#pragma GCC diagnostic pop\n#endif\n\n#include \"ch32v20x_usb.h\"\n\n#define USBFS_RX_BUF_LEN 64\n#define USBFS_TX_BUF_LEN 64\nTU_ATTR_ALIGNED(4) static uint8_t USBFS_RX_Buf[USBFS_RX_BUF_LEN];\nTU_ATTR_ALIGNED(4) static uint8_t USBFS_TX_Buf[USBFS_TX_BUF_LEN];\n\n#define USB_XFER_TIMEOUT_MILLIS 100\n// #define USB_INTERRUPT_XFER_TIMEOUT_MILLIS 1\n\n#define PANIC(...)                            \\\n  do {                                        \\\n    printf(\"%s() L%d: \", __func__, __LINE__); \\\n    printf(\"\\r\\n[PANIC] \" __VA_ARGS__);       \\\n    while (true) {}                           \\\n  } while (false)\n\n#define LOG_CH32_USBFSH(...) TU_LOG3(__VA_ARGS__)\n\n// Busywait for delay microseconds/nanoseconds\nTU_ATTR_ALWAYS_INLINE static inline void loopdelay(uint32_t count) {\n  volatile uint32_t c = count / 3;\n  if (c == 0) { return; }\n  // while (c-- != 0);\n  asm volatile(\n    \"1:                     \\n\" // loop label\n    \"    addi  %0, %0, -1   \\n\" // c--\n    \"    bne   %0, zero, 1b \\n\" // if (c != 0) goto loop\n    : \"+r\"(c) // c is input/output operand\n  );\n}\n\n// Endpoint status\ntypedef struct usb_edpt {\n  // Is this a valid struct\n  bool configured;\n\n  uint8_t dev_addr;\n  uint8_t ep_addr;\n  uint8_t max_packet_size;\n\n  uint8_t xfer_type;\n\n  // Data toggle (0 or not 0) for DATA0/1\n  uint8_t data_toggle;\n\n  bool is_nak_pending;\n  uint16_t buflen;\n  uint8_t* buf;\n} usb_edpt_t;\n\nstatic usb_edpt_t usb_edpt_list[CFG_TUH_DEVICE_MAX * 6] = {};\n\ntypedef struct usb_current_xfer_st {\n  bool is_busy;\n  uint8_t dev_addr;\n  uint8_t ep_addr;\n  // Xfer started time in millis for timeout\n  uint32_t start_ms;\n  uint8_t *buffer;\n  uint16_t bufferlen;\n  uint16_t xferred_len;\n  bool nak_pending;\n} usb_current_xfer_t;\n\nstatic volatile usb_current_xfer_t usb_current_xfer_info = {};\n\nstatic usb_edpt_t *get_edpt_record(uint8_t dev_addr, uint8_t ep_addr) {\n  for (size_t i = 0; i < TU_ARRAY_SIZE(usb_edpt_list); i++) {\n    usb_edpt_t *cur = &usb_edpt_list[i];\n    if (cur->configured && cur->dev_addr == dev_addr && cur->ep_addr == ep_addr) {\n      return cur;\n    }\n  }\n  return NULL;\n}\n\nstatic usb_edpt_t *get_empty_record_slot(void) {\n  for (size_t i = 0; i < TU_ARRAY_SIZE(usb_edpt_list); i++) {\n    if (!usb_edpt_list[i].configured) {\n      return &usb_edpt_list[i];\n    }\n  }\n  return NULL;\n}\n\nstatic usb_edpt_t *add_edpt_record(uint8_t dev_addr, uint8_t ep_addr, uint16_t max_packet_size, uint8_t xfer_type) {\n  usb_edpt_t *slot = get_empty_record_slot();\n  TU_ASSERT(slot != NULL, NULL);\n\n  slot->dev_addr = dev_addr;\n  slot->ep_addr = ep_addr;\n  slot->max_packet_size = max_packet_size;\n  slot->xfer_type = xfer_type;\n  slot->data_toggle = 0;\n  slot->is_nak_pending = false;\n  slot->buflen = 0;\n  slot->buf = NULL;\n\n  slot->configured = true;\n\n  return slot;\n}\n\nstatic usb_edpt_t *get_or_add_edpt_record(uint8_t dev_addr, uint8_t ep_addr, uint16_t max_packet_size, uint8_t xfer_type) {\n  usb_edpt_t *ret = get_edpt_record(dev_addr, ep_addr);\n  if (ret != NULL) {\n    return ret;\n  } else {\n    return add_edpt_record(dev_addr, ep_addr, max_packet_size, xfer_type);\n  }\n}\n\nstatic void remove_edpt_record_for_device(uint8_t dev_addr) {\n  for (size_t i = 0; i < TU_ARRAY_SIZE(usb_edpt_list); i++) {\n    if (usb_edpt_list[i].configured && usb_edpt_list[i].dev_addr == dev_addr) {\n      usb_edpt_list[i].configured = false;\n    }\n  }\n}\n\n// static void dump_edpt_record_list() {\n//     for (size_t i = 0; i < TU_ARRAY_SIZE(usb_edpt_list); i++) {\n//         usb_edpt_t* cur = &usb_edpt_list[i];\n//         if (cur->configured) {\n//             printf(\"[%2d] Device 0x%02x Endpoint 0x%02x\\r\\n\", i, cur->dev_addr, cur->ep_addr);\n//         } else {\n//             printf(\"[%2d] not configured\\r\\n\", i);\n//         }\n//     }\n// }\n\nstatic bool interrupt_enabled = false;\n\n/** Enable or disable USBFS Host function */\nstatic void hardware_init_host(bool enabled) {\n  // Reset USBOTG module\n  USBOTG_H_FS->BASE_CTRL = USBFS_UC_RESET_SIE | USBFS_UC_CLR_ALL;\n\n  tusb_time_delay_ms_api(1);\n  USBOTG_H_FS->BASE_CTRL = 0;\n\n  if (!enabled) {\n    // Disable all feature\n    USBOTG_H_FS->BASE_CTRL = 0;\n  } else {\n    // Enable USB Host features\n    // NVIC_DisableIRQ(USBFS_IRQn);\n    hcd_int_disable(0);\n    USBOTG_H_FS->BASE_CTRL = USBFS_UC_HOST_MODE | USBFS_UC_INT_BUSY | USBFS_UC_DMA_EN;\n    USBOTG_H_FS->HOST_EP_MOD = USBFS_UH_EP_TX_EN | USBFS_UH_EP_RX_EN;\n    USBOTG_H_FS->HOST_RX_DMA = (uint32_t) USBFS_RX_Buf;\n    USBOTG_H_FS->HOST_TX_DMA = (uint32_t) USBFS_TX_Buf;\n    // USBOTG_H_FS->INT_EN = USBFS_UIE_TRANSFER | USBFS_UIE_DETECT;\n    USBOTG_H_FS->INT_EN = USBFS_UIE_DETECT;\n  }\n}\n\nstatic bool hardware_start_xfer(uint8_t pid, uint8_t ep_addr, uint8_t data_toggle) {\n  LOG_CH32_USBFSH(\"hardware_start_xfer(pid=%s(0x%02x), ep_addr=0x%02x, toggle=%d)\\r\\n\",\n                  pid == USB_PID_IN ? \"IN\" : pid == USB_PID_OUT ? \"OUT\"\n                                         : pid == USB_PID_SETUP ? \"SETUP\"\n                                                                : \"(other)\",\n                  pid, ep_addr, data_toggle);\n\n  //WORKAROUND: For LowSpeed device, insert small delay\n  bool is_lowspeed_device = tuh_speed_get(usb_current_xfer_info.dev_addr) == TUSB_SPEED_LOW;\n  if (is_lowspeed_device) {\n    //NOTE: worked -> SystemCoreClock / 1000000 * 50, 25\n    //      NOT worked -> 20 and less  (at 144MHz internal clock)\n    loopdelay(SystemCoreClock / 1000000 * 40);\n  }\n\n  uint8_t pid_edpt = (pid << 4) | (tu_edpt_number(ep_addr) & 0x0f);\n  USBOTG_H_FS->HOST_TX_CTRL = (data_toggle != 0) ? USBFS_UH_T_TOG : 0;\n  USBOTG_H_FS->HOST_RX_CTRL = (data_toggle != 0) ? USBFS_UH_R_TOG : 0;\n  USBOTG_H_FS->HOST_EP_PID = pid_edpt;\n  USBOTG_H_FS->INT_EN |= USBFS_UIE_TRANSFER;\n  USBOTG_H_FS->INT_FG = USBFS_UIF_TRANSFER;\n  return true;\n}\n\n\n/** Set device address to communicate */\nstatic void hardware_update_device_address(uint8_t dev_addr) {\n  // Keep the bit of GP_BIT. Other 7bits are actual device address.\n  USBOTG_H_FS->DEV_ADDR = (USBOTG_H_FS->DEV_ADDR & USBFS_UDA_GP_BIT) | (dev_addr & USBFS_USB_ADDR_MASK);\n}\n\n/** Set port speed */\nstatic void hardware_update_port_speed(tusb_speed_t speed) {\n  LOG_CH32_USBFSH(\"hardware_update_port_speed(%s)\\r\\n\", speed == TUSB_SPEED_FULL ? \"Full\" : speed == TUSB_SPEED_LOW ? \"Low\"\n                                                                                                                    : \"(invalid)\");\n  switch (speed) {\n    case TUSB_SPEED_LOW:\n      USBOTG_H_FS->BASE_CTRL |= USBFS_UC_LOW_SPEED;\n      USBOTG_H_FS->HOST_CTRL |= USBFS_UH_LOW_SPEED;\n      USBOTG_H_FS->HOST_SETUP |= USBFS_UH_PRE_PID_EN;\n      return;\n    case TUSB_SPEED_FULL:\n      USBOTG_H_FS->BASE_CTRL &= ~USBFS_UC_LOW_SPEED;\n      USBOTG_H_FS->HOST_CTRL &= ~USBFS_UH_LOW_SPEED;\n      USBOTG_H_FS->HOST_SETUP &= ~USBFS_UH_PRE_PID_EN;\n      return;\n    default:\n      PANIC(\"hardware_update_port_speed(%d)\\r\\n\", speed);\n  }\n}\n\nstatic void hardware_set_port_address_speed(uint8_t dev_addr) {\n  hardware_update_device_address(dev_addr);\n  tusb_speed_t rhport_speed = hcd_port_speed_get(0);\n  tusb_speed_t dev_speed = tuh_speed_get(dev_addr);\n  hardware_update_port_speed(dev_speed);\n  if (rhport_speed == TUSB_SPEED_FULL && dev_speed == TUSB_SPEED_LOW) {\n    USBOTG_H_FS->HOST_CTRL &= ~USBFS_UH_LOW_SPEED;\n  }\n}\n\nstatic bool hardware_device_attached(void) {\n  return USBOTG_H_FS->MIS_ST & USBFS_UMS_DEV_ATTACH;\n}\n\n//--------------------------------------------------------------------+\n// HCD API\n//--------------------------------------------------------------------+\nbool hcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init) {\n  (void) rhport;\n  (void) rh_init;\n  hardware_init_host(true);\n\n  return true;\n}\n\nbool hcd_deinit(uint8_t rhport) {\n  (void) rhport;\n  hardware_init_host(false);\n\n  return true;\n}\n\nstatic bool int_state_for_portreset = false;\n\nvoid hcd_port_reset(uint8_t rhport) {\n  (void) rhport;\n  LOG_CH32_USBFSH(\"hcd_port_reset()\\r\\n\");\n  int_state_for_portreset = interrupt_enabled;\n  // NVIC_DisableIRQ(USBFS_IRQn);\n  hcd_int_disable(rhport);\n  hardware_update_device_address(0x00);\n\n  // USBOTG_H_FS->HOST_SETUP = 0x00;\n\n  USBOTG_H_FS->HOST_CTRL |= USBFS_UH_BUS_RESET;\n\n  return;\n}\n\nvoid hcd_port_reset_end(uint8_t rhport) {\n  (void) rhport;\n  LOG_CH32_USBFSH(\"hcd_port_reset_end()\\r\\n\");\n\n  USBOTG_H_FS->HOST_CTRL &= ~USBFS_UH_BUS_RESET;\n  tusb_time_delay_ms_api(2);\n\n  if ((USBOTG_H_FS->HOST_CTRL & USBFS_UH_PORT_EN) == 0) {\n    if (hcd_port_speed_get(0) == TUSB_SPEED_LOW) {\n      hardware_update_port_speed(TUSB_SPEED_LOW);\n    }\n  }\n\n  USBOTG_H_FS->HOST_CTRL |= USBFS_UH_PORT_EN;\n  USBOTG_H_FS->HOST_SETUP |= USBFS_UH_SOF_EN;\n\n  // Suppress the attached event\n  USBOTG_H_FS->INT_FG |= USBFS_UIF_DETECT;\n\n  if (int_state_for_portreset) {\n    hcd_int_enable(rhport);\n  }\n}\n\nbool hcd_port_connect_status(uint8_t rhport) {\n  (void) rhport;\n\n  return hardware_device_attached();\n}\n\ntusb_speed_t hcd_port_speed_get(uint8_t rhport) {\n  (void) rhport;\n  if (USBOTG_H_FS->MIS_ST & USBFS_UMS_DM_LEVEL) {\n    return TUSB_SPEED_LOW;\n  } else {\n    return TUSB_SPEED_FULL;\n  }\n}\n\n// Close all opened endpoint belong to this device\nvoid hcd_device_close(uint8_t rhport, uint8_t dev_addr) {\n  (void) rhport;\n  LOG_CH32_USBFSH(\"hcd_device_close(%d, 0x%02x)\\r\\n\", rhport, dev_addr);\n  remove_edpt_record_for_device(dev_addr);\n}\n\nuint32_t hcd_frame_number(uint8_t rhport) {\n  (void) rhport;\n\n  return tusb_time_millis_api();\n}\n\nvoid hcd_int_enable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_EnableIRQ(USBFS_IRQn);\n  interrupt_enabled = true;\n}\n\nvoid hcd_int_disable(uint8_t rhport) {\n  (void) rhport;\n  NVIC_DisableIRQ(USBFS_IRQn);\n  interrupt_enabled = false;\n}\n\n\nstatic void xfer_retry(void* _params) {\n  LOG_CH32_USBFSH(\"xfer_retry()\\r\\n\");\n  usb_edpt_t* edpt_info = (usb_edpt_t*)_params;\n  if (usb_current_xfer_info.nak_pending) {\n    usb_current_xfer_info.nak_pending = false;\n    edpt_info->is_nak_pending = false;\n\n    uint8_t dev_addr = edpt_info->dev_addr;\n    uint8_t ep_addr = edpt_info->ep_addr;\n    uint16_t buflen = edpt_info->buflen;\n    uint8_t* buf = edpt_info->buf;\n\n    // Check connectivity\n    usb_edpt_t* edpt_info_current = get_edpt_record(dev_addr, ep_addr);\n    if (edpt_info_current) {\n        hcd_edpt_xfer(0, dev_addr, ep_addr, buf, buflen);\n    }\n  }\n}\n\n\nvoid hcd_int_handler(uint8_t rhport, bool in_isr) {\n  (void) rhport;\n  (void) in_isr;\n\n  if (USBOTG_H_FS->INT_FG & USBFS_UIF_DETECT) {\n    // Clear the flag\n    USBOTG_H_FS->INT_FG = USBFS_UIF_DETECT;\n    // Read the detection state\n    bool attached = hardware_device_attached();\n    LOG_CH32_USBFSH(\"hcd_int_handler() attached = %d\\r\\n\", attached ? 1 : 0);\n    if (attached) {\n      hcd_event_device_attach(rhport, true);\n    } else {\n      hcd_event_device_remove(rhport, true);\n    }\n    return;\n  }\n\n  if (USBOTG_H_FS->INT_FG & USBFS_UIF_TRANSFER) {\n    // Disable transfer interrupt\n    USBOTG_H_FS->INT_EN &= ~USBFS_UIE_TRANSFER;\n    // Clear the flag\n    // USBOTG_H_FS->INT_FG = USBFS_UIF_TRANSFER;\n    // Copy PID and Endpoint\n    uint8_t pid_edpt = USBOTG_H_FS->HOST_EP_PID;\n    uint8_t status = USBOTG_H_FS->INT_ST;\n    uint8_t dev_addr = USBOTG_H_FS->DEV_ADDR & USBFS_USB_ADDR_MASK;\n    // Clear register to stop transfer\n    // USBOTG_H_FS->HOST_EP_PID = 0x00;\n\n    LOG_CH32_USBFSH(\"hcd_int_handler() pid_edpt=0x%02x\\r\\n\", pid_edpt);\n\n    uint8_t request_pid = pid_edpt >> 4;\n    uint8_t response_pid = status & USBFS_UIS_H_RES_MASK;\n    uint8_t ep_addr = pid_edpt & 0x0f;\n    if (request_pid == USB_PID_IN) {\n      ep_addr |= 0x80;\n    }\n\n    usb_edpt_t *edpt_info = get_edpt_record(dev_addr, ep_addr);\n    if (edpt_info == NULL) {\n      PANIC(\"\\r\\nget_edpt_record(0x%02x, 0x%02x) returned NULL in USBHD_IRQHandler\\r\\n\", dev_addr, ep_addr);\n    }\n\n    if (status & USBFS_UIS_TOG_OK) {\n      edpt_info->data_toggle ^= 0x01;\n\n      switch (request_pid) {\n        case USB_PID_SETUP:\n        case USB_PID_OUT: {\n          uint16_t tx_len = USBOTG_H_FS->HOST_TX_LEN;\n          usb_current_xfer_info.bufferlen -= tx_len;\n          usb_current_xfer_info.xferred_len += tx_len;\n          if (usb_current_xfer_info.bufferlen == 0) {\n            LOG_CH32_USBFSH(\"USB_PID_%s completed %d bytes\\r\\n\", request_pid == USB_PID_OUT ? \"OUT\" : \"SETUP\", usb_current_xfer_info.xferred_len);\n            usb_current_xfer_info.is_busy = false;\n            hcd_event_xfer_complete(dev_addr, ep_addr, usb_current_xfer_info.xferred_len, XFER_RESULT_SUCCESS, in_isr);\n            return;\n          } else {\n            LOG_CH32_USBFSH(\"USB_PID_OUT continue...\\r\\n\");\n            usb_current_xfer_info.buffer += tx_len;\n            uint16_t copylen = TU_MIN(edpt_info->max_packet_size, usb_current_xfer_info.bufferlen);\n            memcpy(USBFS_TX_Buf, usb_current_xfer_info.buffer, copylen);\n            hardware_start_xfer(USB_PID_OUT, ep_addr, edpt_info->data_toggle);\n            return;\n          }\n        }\n        case USB_PID_IN: {\n          uint16_t received_len = USBOTG_H_FS->RX_LEN;\n          usb_current_xfer_info.xferred_len += received_len;\n          uint16_t xferred_len = usb_current_xfer_info.xferred_len;\n          LOG_CH32_USBFSH(\"Read %d bytes\\r\\n\", received_len);\n          // if (received_len > 0 && (usb_current_xfer_info.buffer == NULL || usb_current_xfer_info.bufferlen == 0)) {\n          //     PANIC(\"Data received but buffer not set\\r\\n\");\n          // }\n          memcpy(usb_current_xfer_info.buffer, USBFS_RX_Buf, received_len);\n          usb_current_xfer_info.buffer += received_len;\n          if ((received_len < edpt_info->max_packet_size) || (xferred_len == usb_current_xfer_info.bufferlen)) {\n            // USB device sent all data.\n            LOG_CH32_USBFSH(\"USB_PID_IN completed\\r\\n\");\n            usb_current_xfer_info.is_busy = false;\n            hcd_event_xfer_complete(dev_addr, ep_addr, xferred_len, XFER_RESULT_SUCCESS, in_isr);\n            return;\n          } else {\n            // USB device may send more data.\n            LOG_CH32_USBFSH(\"Read more data\\r\\n\");\n            hardware_start_xfer(USB_PID_IN, ep_addr, edpt_info->data_toggle);\n            return;\n          }\n        }\n        default: {\n          LOG_CH32_USBFSH(\"hcd_int_handler() L%d: unexpected response PID: 0x%02x\\r\\n\", __LINE__, response_pid);\n          usb_current_xfer_info.is_busy = false;\n          hcd_event_xfer_complete(dev_addr, ep_addr, 0, XFER_RESULT_FAILED, in_isr);\n          return;\n        }\n      }\n    } else {\n      if (response_pid == USB_PID_STALL) {\n        LOG_CH32_USBFSH(\"STALL response\\r\\n\");\n        hcd_edpt_clear_stall(0, dev_addr, ep_addr);\n        edpt_info->data_toggle = 0;\n        hardware_start_xfer(request_pid, ep_addr, 0);\n        return;\n      } else if (response_pid == USB_PID_NAK) {\n        LOG_CH32_USBFSH(\"NAK reposense\\r\\n\");\n        uint32_t elapsed_time = tusb_time_millis_api() - usb_current_xfer_info.start_ms;\n        (void)elapsed_time;\n        if (edpt_info->xfer_type == TUSB_XFER_INTERRUPT) {\n          usb_current_xfer_info.is_busy = false;\n          hcd_event_xfer_complete(dev_addr, ep_addr, 0, XFER_RESULT_SUCCESS, in_isr);\n\n        } else {\n          usb_current_xfer_info.is_busy = false;\n          usb_current_xfer_info.nak_pending = true;\n\n\n          edpt_info->is_nak_pending = true;\n          edpt_info->buflen = usb_current_xfer_info.bufferlen;\n          edpt_info->buf = usb_current_xfer_info.buffer;\n\n          hcd_event_t event = {\n            .rhport = rhport,\n            .dev_addr = dev_addr,\n            .event_id = USBH_EVENT_FUNC_CALL,\n            .func_call = {\n                .func = xfer_retry,\n                .param = edpt_info\n            }\n          };\n          hcd_event_handler(&event, in_isr);\n        }\n        return;\n      } else if (response_pid == USB_PID_DATA0 || response_pid == USB_PID_DATA1) {\n        LOG_CH32_USBFSH(\"Data toggle mismatched and DATA0/1 (not STALL). RX_LEN=%d\\r\\n\", USBOTG_H_FS->RX_LEN);\n        usb_current_xfer_info.is_busy = false;\n        hcd_event_xfer_complete(dev_addr, ep_addr, 0, XFER_RESULT_FAILED, in_isr);\n        return;\n      } else {\n        LOG_CH32_USBFSH(\"hcd_int_handler() L%d: unexpected response PID: 0x%02x\\r\\n\", __LINE__, response_pid);\n        usb_current_xfer_info.is_busy = false;\n        hcd_event_xfer_complete(dev_addr, ep_addr, 0, XFER_RESULT_FAILED, in_isr);\n        return;\n      }\n    }\n  }\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\nbool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const *ep_desc) {\n  (void) rhport;\n  uint8_t ep_addr = ep_desc->bEndpointAddress;\n  uint8_t ep_num = tu_edpt_number(ep_addr);\n  uint16_t max_packet_size = ep_desc->wMaxPacketSize;\n  uint8_t xfer_type = ep_desc->bmAttributes.xfer;\n  LOG_CH32_USBFSH(\"hcd_edpt_open(rhport=%d, dev_addr=0x%02x, %p) EndpointAdderss=0x%02x,maxPacketSize=%d,xfer_type=%d\\r\\n\", rhport, dev_addr, ep_desc, ep_addr, max_packet_size, xfer_type);\n\n  while (usb_current_xfer_info.is_busy) { }\n\n  if (ep_num == 0x00) {\n    TU_ASSERT(get_or_add_edpt_record(dev_addr, 0x00, max_packet_size, xfer_type) != NULL, false);\n    TU_ASSERT(get_or_add_edpt_record(dev_addr, 0x80, max_packet_size, xfer_type) != NULL, false);\n  } else {\n    TU_ASSERT(get_or_add_edpt_record(dev_addr, ep_addr, max_packet_size, xfer_type) != NULL, false);\n  }\n\n  USBOTG_H_FS->HOST_CTRL |= USBFS_UH_PORT_EN;\n  USBOTG_H_FS->HOST_SETUP |= USBFS_UH_SOF_EN;\n\n  hardware_set_port_address_speed(dev_addr);\n\n  return true;\n}\n\nbool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen) {\n  (void) rhport;\n\n  LOG_CH32_USBFSH(\"hcd_edpt_xfer(%d, 0x%02x, 0x%02x, ...)\\r\\n\", rhport, dev_addr, ep_addr);\n\n  while (usb_current_xfer_info.is_busy) {}\n  usb_current_xfer_info.is_busy = true;\n\n  usb_edpt_t *edpt_info = get_edpt_record(dev_addr, ep_addr);\n  TU_ASSERT(edpt_info != NULL);\n\n  hardware_set_port_address_speed(dev_addr);\n\n  usb_current_xfer_info.dev_addr = dev_addr;\n  usb_current_xfer_info.ep_addr = ep_addr;\n  usb_current_xfer_info.buffer = buffer;\n  usb_current_xfer_info.bufferlen = buflen;\n  usb_current_xfer_info.start_ms = tusb_time_millis_api();\n  usb_current_xfer_info.xferred_len = 0;\n  usb_current_xfer_info.nak_pending = false;\n\n  if (tu_edpt_dir(ep_addr) == TUSB_DIR_IN) {\n    LOG_CH32_USBFSH(\"hcd_edpt_xfer(): READ, dev_addr=0x%02x, ep_addr=0x%02x, len=%d\\r\\n\", dev_addr, ep_addr, buflen);\n    return hardware_start_xfer(USB_PID_IN, ep_addr, edpt_info->data_toggle);\n  } else {\n    LOG_CH32_USBFSH(\"hcd_edpt_xfer(): WRITE, dev_addr=0x%02x, ep_addr=0x%02x, len=%d\\r\\n\", dev_addr, ep_addr, buflen);\n    uint16_t copylen = TU_MIN(edpt_info->max_packet_size, buflen);\n    USBOTG_H_FS->HOST_TX_LEN = copylen;\n    memcpy(USBFS_TX_Buf, buffer, copylen);\n    return hardware_start_xfer(USB_PID_OUT, ep_addr, edpt_info->data_toggle);\n  }\n}\n\nbool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  (void) ep_addr;\n\n  return false;\n}\n\nbool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8]) {\n  (void) rhport;\n\n  while (usb_current_xfer_info.is_busy) {}\n\n  usb_current_xfer_info.is_busy = true;\n\n  LOG_CH32_USBFSH(\"hcd_setup_send(rhport=%d, dev_addr=0x%02x, %p)\\r\\n\", rhport, dev_addr, setup_packet);\n\n  hardware_set_port_address_speed(dev_addr);\n\n  usb_edpt_t *edpt_info_tx = get_edpt_record(dev_addr, 0x00);\n  usb_edpt_t *edpt_info_rx = get_edpt_record(dev_addr, 0x80);\n  TU_ASSERT(edpt_info_tx != NULL, false);\n  TU_ASSERT(edpt_info_rx != NULL, false);\n\n  // Initialize data toggle (SETUP always starts with DATA0)\n  // Data toggle for OUT is toggled in hcd_int_handler()\n  edpt_info_tx->data_toggle = 0;\n  // Data toggle for IN must be set 0x01 manually.\n  edpt_info_rx->data_toggle = 0x01;\n  const uint16_t setup_packet_datalen = 8;\n  memcpy(USBFS_TX_Buf, setup_packet, setup_packet_datalen);\n  USBOTG_H_FS->HOST_TX_LEN = setup_packet_datalen;\n  uint8_t ep_addr = (setup_packet[0] & 0x80) ? 0x80 : 0x00;\n  usb_current_xfer_info.dev_addr = dev_addr;\n  usb_current_xfer_info.ep_addr = ep_addr;\n  usb_current_xfer_info.start_ms = tusb_time_millis_api();\n  usb_current_xfer_info.buffer = USBFS_TX_Buf;\n  usb_current_xfer_info.bufferlen = setup_packet_datalen;\n  usb_current_xfer_info.xferred_len = 0;\n  usb_current_xfer_info.nak_pending = false;\n\n  hardware_start_xfer(USB_PID_SETUP, 0, 0);\n\n  return true;\n}\n\nbool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr) {\n  (void) rhport;\n  (void) dev_addr;\n  LOG_CH32_USBFSH(\"hcd_edpt_clear_stall(rhport=%d, dev_addr=0x%02x, ep_addr=0x%02x)\\r\\n\", rhport, dev_addr, ep_addr);\n  uint8_t edpt_num = tu_edpt_number(ep_addr);\n  uint8_t setup_request_clear_stall[8] = {\n      0x02, 0x01, 0x00, 0x00, edpt_num, 0x00, 0x00, 0x00\n  };\n  memcpy(USBFS_TX_Buf, setup_request_clear_stall, 8);\n  USBOTG_H_FS->HOST_TX_LEN = 8;\n\n  bool prev_int_state = interrupt_enabled;\n  hcd_int_disable(0);\n\n  USBOTG_H_FS->HOST_EP_PID = (USB_PID_SETUP << 4) | 0x00;\n  USBOTG_H_FS->INT_FG |= USBFS_UIF_TRANSFER;\n  while ((USBOTG_H_FS->INT_FG & USBFS_UIF_TRANSFER) == 0) {}\n  USBOTG_H_FS->HOST_EP_PID = 0;\n  uint8_t response_pid = USBOTG_H_FS->INT_ST & USBFS_UIS_H_RES_MASK;\n  (void) response_pid;\n  LOG_CH32_USBFSH(\"hcd_edpt_clear_stall() response pid=0x%02x\\r\\n\", response_pid);\n\n  if (prev_int_state) {\n    hcd_int_enable(0);\n  }\n\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/tinyusb.mk",
    "content": "# C source files\nTINYUSB_SRC_C += \\\n\tsrc/tusb.c \\\n\tsrc/common/tusb_fifo.c \\\n\tsrc/device/usbd.c \\\n\tsrc/device/usbd_control.c \\\n\tsrc/typec/usbc.c \\\n\tsrc/class/audio/audio_device.c \\\n\tsrc/class/cdc/cdc_device.c \\\n\tsrc/class/dfu/dfu_device.c \\\n\tsrc/class/dfu/dfu_rt_device.c \\\n\tsrc/class/hid/hid_device.c \\\n\tsrc/class/midi/midi_device.c \\\n\tsrc/class/msc/msc_device.c \\\n\tsrc/class/mtp/mtp_device.c \\\n\tsrc/class/net/ecm_rndis_device.c \\\n\tsrc/class/net/ncm_device.c \\\n\tsrc/class/printer/printer_device.c \\\n\tsrc/class/usbtmc/usbtmc_device.c \\\n\tsrc/class/video/video_device.c \\\n\tsrc/class/vendor/vendor_device.c \\\n  src/host/usbh.c \\\n  src/host/hub.c \\\n  src/class/cdc/cdc_host.c \\\n  src/class/hid/hid_host.c \\\n  src/class/midi/midi_host.c \\\n  src/class/msc/msc_host.c \\\n  src/class/vendor/vendor_host.c \\\n  src/typec/usbc.c \\\n"
  },
  {
    "path": "src/tusb.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUH_ENABLED || CFG_TUD_ENABLED\n\n#include \"tusb.h\"\n#include \"common/tusb_private.h\"\n\n#if CFG_TUD_ENABLED\n#include \"device/usbd_pvt.h\"\n#endif\n\n#if CFG_TUH_ENABLED\n#include \"host/usbh_pvt.h\"\n#endif\n\n// Suppress IAR warning\n// Warning[Pe111]: statement is unreachable\n#if defined(__ICCARM__)\n#pragma diag_suppress = Pe111\n#endif\n\ntusb_role_t _tusb_rhport_role[TUP_USBIP_CONTROLLER_NUM] = { TUSB_ROLE_INVALID };\n\n//--------------------------------------------------------------------\n// Weak/Default API, can be overwritten by Application\n//--------------------------------------------------------------------\n\n#if CFG_TUSB_OS != OPT_OS_NONE\nTU_ATTR_WEAK uint32_t tusb_time_millis_api(void) {\n  return osal_time_millis();\n}\n\nTU_ATTR_WEAK void tusb_time_delay_ms_api(uint32_t ms) {\n  osal_task_delay(ms);\n}\n\n#else\n// tusb_time_millis_api() must be implemented by user application.\n\nTU_ATTR_WEAK void tusb_time_delay_ms_api(uint32_t ms) {\n  // delay using millis()\n  const uint32_t time_ms = tusb_time_millis_api();\n  while ((tusb_time_millis_api() - time_ms) < ms) {}\n}\n#endif\n\nTU_ATTR_WEAK void *tusb_app_virt_to_phys(void *virt_addr) {\n  return virt_addr;\n}\n\nTU_ATTR_WEAK void* tusb_app_phys_to_virt(void *phys_addr) {\n  return phys_addr;\n}\n\n//--------------------------------------------------------------------+\n// Public API\n//--------------------------------------------------------------------+\nbool tusb_rhport_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  //  backward compatible called with tusb_init(void)\n  #if defined(TUD_OPT_RHPORT) || defined(TUH_OPT_RHPORT)\n  if (rh_init == NULL) {\n    #if CFG_TUD_ENABLED && defined(TUD_OPT_RHPORT)\n    // init device stack CFG_TUSB_RHPORTx_MODE must be defined\n    const tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUD_OPT_HIGH_SPEED ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL\n    };\n    TU_ASSERT ( tud_rhport_init(TUD_OPT_RHPORT, &dev_init) );\n    _tusb_rhport_role[TUD_OPT_RHPORT] = TUSB_ROLE_DEVICE;\n    #endif\n\n    #if CFG_TUH_ENABLED && defined(TUH_OPT_RHPORT)\n    // init host stack CFG_TUSB_RHPORTx_MODE must be defined\n    const tusb_rhport_init_t host_init = {\n      .role = TUSB_ROLE_HOST,\n      .speed = TUH_OPT_HIGH_SPEED ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL\n    };\n    TU_ASSERT( tuh_rhport_init(TUH_OPT_RHPORT, &host_init) );\n    _tusb_rhport_role[TUH_OPT_RHPORT] = TUSB_ROLE_HOST;\n    #endif\n\n    return true;\n  }\n  #endif\n\n  // new API with explicit rhport and role\n  TU_ASSERT(rhport < TUP_USBIP_CONTROLLER_NUM && rh_init->role != TUSB_ROLE_INVALID);\n  _tusb_rhport_role[rhport] = rh_init->role;\n\n  #if CFG_TUD_ENABLED\n  if (rh_init->role == TUSB_ROLE_DEVICE) {\n    TU_ASSERT(tud_rhport_init(rhport, rh_init));\n  }\n  #endif\n\n  #if CFG_TUH_ENABLED\n  if (rh_init->role == TUSB_ROLE_HOST) {\n    TU_ASSERT(tuh_rhport_init(rhport, rh_init));\n  }\n  #endif\n\n  return true;\n}\n\nbool tusb_inited(void) {\n  bool ret = false;\n\n  #if CFG_TUD_ENABLED\n  if (tud_inited()) {\n    ret = true;\n  }\n  #endif\n\n  #if CFG_TUH_ENABLED\n  if (tuh_inited()) {\n    ret = true;\n  }\n  #endif\n\n  return ret;\n}\n\nvoid tusb_int_handler(uint8_t rhport, bool in_isr) {\n  TU_VERIFY(rhport < TUP_USBIP_CONTROLLER_NUM,);\n\n  #if CFG_TUD_ENABLED\n  if (_tusb_rhport_role[rhport] == TUSB_ROLE_DEVICE) {\n    (void) in_isr;\n    dcd_int_handler(rhport);\n  }\n  #endif\n\n  #if CFG_TUH_ENABLED\n  if (_tusb_rhport_role[rhport] == TUSB_ROLE_HOST) {\n    hcd_int_handler(rhport, in_isr);\n  }\n  #endif\n}\n\nbool tusb_deinit(uint8_t rhport) {\n  TU_VERIFY(rhport < TUP_USBIP_CONTROLLER_NUM);\n  bool ret = false;\n\n  #if CFG_TUD_ENABLED\n  if (_tusb_rhport_role[rhport] == TUSB_ROLE_DEVICE) {\n    TU_ASSERT(tud_deinit(rhport));\n    _tusb_rhport_role[rhport] = TUSB_ROLE_INVALID;\n    ret = true;\n  }\n  #endif\n\n  #if CFG_TUH_ENABLED\n  if (_tusb_rhport_role[rhport] == TUSB_ROLE_HOST) {\n    TU_ASSERT(tuh_deinit(rhport));\n    _tusb_rhport_role[rhport] = TUSB_ROLE_INVALID;\n    ret = true;\n  }\n  #endif\n\n  return ret;\n}\n\n//--------------------------------------------------------------------+\n// Descriptor helper\n//--------------------------------------------------------------------+\n\nuint8_t const* tu_desc_find(uint8_t const* desc, uint8_t const* end, uint8_t byte1) {\n  while (desc + 1 < end) {\n    if (desc[1] == byte1) {\n      return desc;\n    }\n    desc += desc[DESC_OFFSET_LEN];\n  }\n  return NULL;\n}\n\nuint8_t const* tu_desc_find2(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2) {\n  while (desc + 2 < end) {\n    if (desc[1] == byte1 && desc[2] == byte2) {\n      return desc;\n    }\n    desc += desc[DESC_OFFSET_LEN];\n  }\n  return NULL;\n}\n\nuint8_t const* tu_desc_find3(uint8_t const* desc, uint8_t const* end, uint8_t byte1, uint8_t byte2, uint8_t byte3) {\n  while (desc + 3 < end) {\n    if (desc[1] == byte1 && desc[2] == byte2 && desc[3] == byte3) {\n      return desc;\n    }\n    desc += desc[DESC_OFFSET_LEN];\n  }\n  return NULL;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint Helper for both Host and Device stack\n//--------------------------------------------------------------------+\n\nbool tu_edpt_claim(tu_edpt_state_t* ep_state, osal_mutex_t mutex) {\n  (void) mutex;\n\n  // pre-check to help reducing mutex lock\n  TU_VERIFY(ep_state->busy == 0);\n  TU_VERIFY(ep_state->claimed == 0);\n  (void) osal_mutex_lock(mutex, OSAL_TIMEOUT_WAIT_FOREVER);\n\n  // can only claim the endpoint if it is not busy and not claimed yet.\n  bool const available = (ep_state->busy == 0) && (ep_state->claimed == 0);\n  if (available) {\n    ep_state->claimed = 1;\n  }\n\n  (void) osal_mutex_unlock(mutex);\n  return available;\n}\n\nbool tu_edpt_release(tu_edpt_state_t* ep_state, osal_mutex_t mutex) {\n  (void) mutex;\n  (void) osal_mutex_lock(mutex, OSAL_TIMEOUT_WAIT_FOREVER);\n\n  // can only release the endpoint if it is claimed and not busy\n  bool const ret = (ep_state->claimed == 1) && (ep_state->busy == 0);\n  if (ret) {\n    ep_state->claimed = 0;\n  }\n\n  (void) osal_mutex_unlock(mutex);\n  return ret;\n}\n\n#if CFG_TUSB_DEBUG\nbool tu_edpt_validate(const tusb_desc_endpoint_t *desc_ep, tusb_speed_t speed) {\n  const uint16_t max_packet_size = tu_edpt_packet_size(desc_ep);\n  TU_LOG2(\"  Open EP %02X with Size = %u\\r\\n\", desc_ep->bEndpointAddress, max_packet_size);\n  TU_ASSERT(max_packet_size > 0);\n\n  switch (desc_ep->bmAttributes.xfer) {\n    case TUSB_XFER_ISOCHRONOUS: {\n      const uint16_t spec_size = (speed == TUSB_SPEED_HIGH ? 1024 : 1023);\n      TU_ASSERT(max_packet_size <= spec_size);\n      break;\n    }\n\n    case TUSB_XFER_BULK:\n      if (speed == TUSB_SPEED_HIGH) {\n        // Bulk highspeed must be EXACTLY 512\n        TU_ASSERT(max_packet_size == 512);\n      } else {\n        // Bulk fullspeed can only be 8, 16, 32, 64\n        TU_ASSERT(max_packet_size == 8 || max_packet_size == 16 || max_packet_size == 32 || max_packet_size == 64);\n      }\n      break;\n\n    case TUSB_XFER_INTERRUPT: {\n      const uint16_t spec_size = (speed == TUSB_SPEED_HIGH ? 1024 : 64);\n      TU_ASSERT(max_packet_size <= spec_size);\n      break;\n    }\n\n    default:\n      return false;\n  }\n\n  return true;\n}\n#endif\n\nbool tu_bind_driver_to_ep_itf(uint8_t driver_id, uint8_t ep2drv[][2], uint8_t itf2drv[], uint8_t itf_max,\n                              const uint8_t *p_desc, uint16_t desc_len) {\n  const uint8_t *desc_end = p_desc + desc_len;\n  while (tu_desc_in_bounds(p_desc, desc_end)) {\n    const uint8_t desc_type = tu_desc_type(p_desc);\n\n    if (desc_type == TUSB_DESC_ENDPOINT) {\n      const uint8_t ep_addr  = ((const tusb_desc_endpoint_t *)p_desc)->bEndpointAddress;\n      const uint8_t ep_num   = tu_edpt_number(ep_addr);\n      const uint8_t ep_dir   = tu_edpt_dir(ep_addr);\n      ep2drv[ep_num][ep_dir] = driver_id;\n    } else if (desc_type == TUSB_DESC_INTERFACE) {\n      const tusb_desc_interface_t *desc_itf = (const tusb_desc_interface_t *)p_desc;\n      if (desc_itf->bAlternateSetting == 0) {\n        TU_ASSERT(desc_itf->bInterfaceNumber < itf_max);\n        itf2drv[desc_itf->bInterfaceNumber] = driver_id;\n      }\n    }\n\n    p_desc = tu_desc_next(p_desc);\n  }\n  return true;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint Stream Helper for both Host and Device stack\n//--------------------------------------------------------------------+\n\nbool tu_edpt_stream_init(tu_edpt_stream_t *s, bool is_host, bool is_tx, bool overwritable, void *ff_buf,\n                         uint16_t ff_bufsize, uint8_t *ep_buf) {\n  (void) is_tx;\n\n  if (ff_buf == NULL || ff_bufsize == 0) {\n    return false;\n  }\n\n  s->is_host = is_host;\n  tu_fifo_config(&s->ff, ff_buf, ff_bufsize, overwritable);\n\n  #if OSAL_MUTEX_REQUIRED\n  if (ff_buf != NULL && ff_bufsize > 0) {\n    osal_mutex_t new_mutex = osal_mutex_create(&s->ff_mutexdef);\n    tu_fifo_config_mutex(&s->ff, is_tx ? new_mutex : NULL, is_tx ? NULL : new_mutex);\n  }\n  #endif\n\n  s->ep_buf = ep_buf;\n\n  return true;\n}\n\nstatic bool stream_claim(tu_edpt_stream_t *s) {\n  TU_VERIFY(s->ep_addr != 0); // must be opened\n  if (s->is_host) {\n    #if CFG_TUH_ENABLED\n    return usbh_edpt_claim(s->hwid, s->ep_addr);\n  #endif\n  } else {\n    #if CFG_TUD_ENABLED\n    return usbd_edpt_claim(s->hwid, s->ep_addr);\n  #endif\n  }\n  return false;\n}\n\nstatic bool stream_xfer(tu_edpt_stream_t *s, uint16_t count) {\n  if (s->is_host) {\n    #if CFG_TUH_ENABLED\n    return usbh_edpt_xfer(s->hwid, s->ep_addr, count ? s->ep_buf : NULL, count);\n  #endif\n  } else {\n    #if CFG_TUD_ENABLED\n    if (s->ep_buf == NULL) {\n      return usbd_edpt_xfer_fifo(s->hwid, s->ep_addr, &s->ff, count, false);\n    } else {\n      return usbd_edpt_xfer(s->hwid, s->ep_addr, count ? s->ep_buf : NULL, count, false);\n    }\n  #endif\n  }\n  return false;\n}\n\nstatic bool stream_release(tu_edpt_stream_t *s) {\n  if (s->is_host) {\n    #if CFG_TUH_ENABLED\n    return usbh_edpt_release(s->hwid, s->ep_addr);\n  #endif\n  } else {\n    #if CFG_TUD_ENABLED\n    return usbd_edpt_release(s->hwid, s->ep_addr);\n  #endif\n  }\n  return false;\n}\n\n//--------------------------------------------------------------------+\n// Stream Write\n//--------------------------------------------------------------------+\nbool tu_edpt_stream_write_zlp_if_needed(tu_edpt_stream_t *s, uint32_t last_xferred_bytes) {\n  // ZLP condition: no pending data, last transferred bytes is multiple of packet size\n  TU_VERIFY(tu_fifo_empty(&s->ff) && last_xferred_bytes > 0 && (0 == (last_xferred_bytes & (s->mps - 1))));\n  TU_VERIFY(stream_claim(s));\n  TU_ASSERT(stream_xfer(s, 0));\n  return true;\n}\n\nuint32_t tu_edpt_stream_write_xfer(tu_edpt_stream_t *s) {\n  const uint16_t ff_count = tu_fifo_count(&s->ff);\n  TU_VERIFY(ff_count > 0, 0); // skip if no data\n  TU_VERIFY(stream_claim(s), 0);\n\n  // Pull data from FIFO -> EP buf\n  uint16_t count;\n  if (s->ep_buf == NULL) {\n    count = tu_fifo_count(&s->ff); // re-get count since fifo can be changed\n  } else {\n    count = tu_fifo_read_n(&s->ff, s->ep_buf, s->xfer_len);\n  }\n\n  if (count > 0) {\n    TU_ASSERT(stream_xfer(s, count), 0);\n    return count;\n  } else {\n    // Release endpoint since we don't make any transfer\n    // Note: data is dropped if terminal is not connected\n    stream_release(s);\n    return 0;\n  }\n}\n\nuint32_t tu_edpt_stream_write(tu_edpt_stream_t *s, const void *buffer, uint32_t bufsize) {\n  TU_VERIFY(bufsize > 0);\n  const uint16_t ret = tu_fifo_write_n(&s->ff, buffer, (uint16_t) bufsize);\n\n  // flush if fifo has more than packet size or\n  // in rare case: fifo depth is configured too small (which never reach packet size)\n  if ((tu_fifo_count(&s->ff) >= s->mps) || (tu_fifo_depth(&s->ff) < s->mps)) {\n    tu_edpt_stream_write_xfer(s);\n  }\n  return ret;\n}\n\nuint32_t tu_edpt_stream_write_available(tu_edpt_stream_t *s) {\n  return (uint32_t)tu_fifo_remaining(&s->ff);\n}\n\n//--------------------------------------------------------------------+\n// Stream Read\n//--------------------------------------------------------------------+\nuint32_t tu_edpt_stream_read_xfer(tu_edpt_stream_t *s) {\n  uint16_t available = tu_fifo_remaining(&s->ff);\n\n  // Prepare for incoming data but only allow what we can store in the ring buffer.\n  // TODO Actually we can still carry out the transfer, keeping count of received bytes\n  // and slowly move it to the FIFO when read().\n  // This pre-check reduces endpoint claiming\n  TU_VERIFY(available >= s->mps);\n  TU_VERIFY(stream_claim(s), 0);\n  available = tu_fifo_remaining(&s->ff); // re-get available since fifo can be changed\n\n  if (available >= s->mps) {\n    // multiple of packet size limit by ep bufsize\n    uint16_t count = (uint16_t) (available & ~(s->mps - 1));\n    count = tu_min16(count, s->xfer_len);\n    TU_ASSERT(stream_xfer(s, count), 0);\n    return count;\n  } else {\n    // Release endpoint since we don't make any transfer\n    stream_release(s);\n    return 0;\n  }\n}\n\nuint32_t tu_edpt_stream_read(tu_edpt_stream_t *s, void *buffer, uint32_t bufsize) {\n  const uint32_t num_read = tu_fifo_read_n(&s->ff, buffer, (uint16_t)bufsize);\n  tu_edpt_stream_read_xfer(s);\n  return num_read;\n}\n\n//--------------------------------------------------------------------+\n// Debug\n//--------------------------------------------------------------------+\n\n#if CFG_TUSB_DEBUG\n#include <ctype.h>\n\n#if CFG_TUSB_DEBUG >= CFG_TUH_LOG_LEVEL || CFG_TUSB_DEBUG >= CFG_TUD_LOG_LEVEL\nchar const* const tu_str_speed[] = {\"Full\", \"Low\", \"High\"};\nchar const* const tu_str_std_request[] = {\n    \"Get Status\",\n    \"Clear Feature\",\n    \"Reserved\",\n    \"Set Feature\",\n    \"Reserved\",\n    \"Set Address\",\n    \"Get Descriptor\",\n    \"Set Descriptor\",\n    \"Get Configuration\",\n    \"Set Configuration\",\n    \"Get Interface\",\n    \"Set Interface\",\n    \"Synch Frame\"\n};\n\nchar const* const tu_str_xfer_result[] = {\n    \"OK\", \"FAILED\", \"STALLED\", \"TIMEOUT\"\n};\n#endif\n\nstatic void dump_str_line(uint8_t const* buf, uint16_t count) {\n  tu_printf(\"  |\");\n  // each line is 16 bytes\n  for (uint16_t i = 0; i < count; i++) {\n    int ch = buf[i];\n    tu_printf(\"%c\", isprint(ch) ? ch : '.');\n  }\n  tu_printf(\"|\\r\\n\");\n}\n\n/* Print out memory contents\n *  - buf   : buffer\n *  - count : number of item\n *  - indent: prefix spaces on every line\n */\nvoid tu_print_mem(void const* buf, uint32_t count, uint8_t indent) {\n  uint8_t const size = 1; // fixed 1 byte for now\n  if (!buf || !count) {\n    tu_printf(\"NULL\\r\\n\");\n    return;\n  }\n\n  uint8_t const* buf8 = (uint8_t const*) buf;\n  char format[] = \"%00X\";\n  format[2] += (uint8_t) (2 * size); // 1 byte = 2 hex digits\n  const uint8_t item_per_line = 16 / size;\n\n  for (unsigned int i = 0; i < count; i++) {\n    unsigned int value = 0;\n\n    if (i % item_per_line == 0) {\n      // Print Ascii\n      if (i != 0) {\n        dump_str_line(buf8 - 16, 16);\n      }\n      for (uint8_t s = 0; s < indent; s++) {\n        tu_printf(\" \");\n      }\n      // print offset or absolute address\n      tu_printf(\"%04X: \", 16 * i / item_per_line);\n    }\n\n    tu_memcpy_s(&value, sizeof(value), buf8, size);\n    buf8 += size;\n\n    tu_printf(\" \");\n    tu_printf(format, value);\n  }\n\n  // fill up last row to 16 for printing ascii\n  const uint32_t remain = count % 16;\n  uint8_t nback = (uint8_t) (remain ? remain : 16);\n  if (remain > 0) {\n    for (uint32_t i = 0; i < 16 - remain; i++) {\n      tu_printf(\" \");\n      for (int j = 0; j < 2 * size; j++) {\n        tu_printf(\" \");\n      }\n    }\n  }\n\n  dump_str_line(buf8 - nback, nback);\n}\n\n#endif\n\n#endif // host or device enabled\n"
  },
  {
    "path": "src/tusb.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_H_\n#define TUSB_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// INCLUDE\n//--------------------------------------------------------------------+\n#include \"common/tusb_common.h\"\n#include \"osal/osal.h\"\n#include \"common/tusb_fifo.h\"\n\n//------------- TypeC -------------//\n#if CFG_TUC_ENABLED\n  #include \"typec/usbc.h\"\n#endif\n\n//------------- HOST -------------//\n#if CFG_TUH_ENABLED\n  #include \"host/usbh.h\"\n\n  #if CFG_TUH_HID\n    #include \"class/hid/hid_host.h\"\n  #endif\n\n  #if CFG_TUH_MSC\n    #include \"class/msc/msc_host.h\"\n  #endif\n\n  #if CFG_TUH_CDC\n    #include \"class/cdc/cdc_host.h\"\n  #endif\n\n  #if CFG_TUH_MIDI\n    #include \"class/midi/midi_host.h\"\n  #endif\n\n  #if CFG_TUH_VENDOR\n    #include \"class/vendor/vendor_host.h\"\n  #endif\n#else\n  #ifndef tuh_int_handler\n  #define tuh_int_handler(...)\n  #endif\n#endif\n\n//------------- DEVICE -------------//\n#if CFG_TUD_ENABLED\n  #include \"device/usbd.h\"\n\n  #if CFG_TUD_HID\n    #include \"class/hid/hid_device.h\"\n  #endif\n\n  #if CFG_TUD_CDC\n    #include \"class/cdc/cdc_device.h\"\n  #endif\n\n  #if CFG_TUD_MSC\n    #include \"class/msc/msc_device.h\"\n  #endif\n\n  #if CFG_TUD_PRINTER\n    #include \"class/printer/printer_device.h\"\n  #endif\n\n  #if CFG_TUD_MTP\n    #include \"class/mtp/mtp_device.h\"\n  #endif\n\n  #if CFG_TUD_AUDIO\n    #include \"class/audio/audio_device.h\"\n  #endif\n\n  #if CFG_TUD_VIDEO\n    #include \"class/video/video_device.h\"\n  #endif\n\n  #if CFG_TUD_MIDI\n    #include \"class/midi/midi_device.h\"\n  #endif\n\n  #if CFG_TUD_VENDOR\n    #include \"class/vendor/vendor_device.h\"\n  #endif\n\n  #if CFG_TUD_USBTMC\n    #include \"class/usbtmc/usbtmc_device.h\"\n  #endif\n\n  #if CFG_TUD_DFU_RUNTIME\n    #include \"class/dfu/dfu_rt_device.h\"\n  #endif\n\n  #if CFG_TUD_DFU\n    #include \"class/dfu/dfu_device.h\"\n  #endif\n\n  #if CFG_TUD_ECM_RNDIS || CFG_TUD_NCM\n    #include \"class/net/net_device.h\"\n  #endif\n\n  #if CFG_TUD_BTH\n    #include \"class/bth/bth_device.h\"\n  #endif\n#else\n  #ifndef tud_int_handler\n  #define tud_int_handler(...)\n  #endif\n#endif\n\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n#if CFG_TUH_ENABLED || CFG_TUD_ENABLED\n\n// Internal helper for backward compatible with tusb_init(void)\nbool tusb_rhport_init(uint8_t rhport, const tusb_rhport_init_t* rh_init);\n\n// Initialize roothub port with device/host role\n// Note: when using with RTOS, this should be called after scheduler/kernel is started.\n//       Since USB IRQ handler does use RTOS queue API.\n// Note2: defined as macro for backward compatible with tusb_init(void), can be changed to function in the future.\n#if defined(TUD_OPT_RHPORT) || defined(TUH_OPT_RHPORT)\n  #define _tusb_init_arg0()        tusb_rhport_init(0, NULL)\n#else\n  #define _tusb_init_arg0()        TU_VERIFY_STATIC(false, \"CFG_TUSB_RHPORT0_MODE/CFG_TUSB_RHPORT1_MODE must be defined\")\n#endif\n\n#define _tusb_init_arg1(_rhport)             _tusb_init_arg0()\n#define _tusb_init_arg2(_rhport, _rh_init)   tusb_rhport_init(_rhport, _rh_init)\n#define tusb_init(...)                       TU_FUNC_OPTIONAL_ARG(_tusb_init, __VA_ARGS__)\n\n// Check if stack is initialized\nbool tusb_inited(void);\n\n// Called to handle usb interrupt/event. tusb_init(rhport, role) must be called before\nvoid tusb_int_handler(uint8_t rhport, bool in_isr);\n\n// Deinit usb stack on roothub port\nbool tusb_deinit(uint8_t rhport);\n\n#else\n\n#define tusb_init(...)  (false)\n#define tusb_int_handler(...)  do {}while(0)\n#define tusb_inited()  (false)\n#define tusb_deinit(...) (false)\n\n#endif\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_H_ */\n"
  },
  {
    "path": "src/tusb_option.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#pragma once\n\n#include \"common/tusb_compiler.h\"\n\n// Version is release as major.minor.revision eg 1.0.0\n#define TUSB_VERSION_MAJOR     0\n#define TUSB_VERSION_MINOR     20\n#define TUSB_VERSION_REVISION  1\n\n#define TUSB_VERSION_NUMBER    (TUSB_VERSION_MAJOR * 10000 + TUSB_VERSION_MINOR * 100 + TUSB_VERSION_REVISION)\n#define TUSB_VERSION_STRING    TU_XSTRING(TUSB_VERSION_MAJOR) \".\" TU_XSTRING(TUSB_VERSION_MINOR) \".\" TU_XSTRING(TUSB_VERSION_REVISION)\n\n//--------------------------------------------------------------------+\n// Supported MCUs\n// CFG_TUSB_MCU must be defined to one of following value\n//--------------------------------------------------------------------+\n\n#define OPT_MCU_NONE                0\n\n// LPC\n#define OPT_MCU_LPC11UXX            1 ///< NXP LPC11Uxx\n#define OPT_MCU_LPC13XX             2 ///< NXP LPC13xx\n#define OPT_MCU_LPC15XX             3 ///< NXP LPC15xx\n#define OPT_MCU_LPC175X_6X          4 ///< NXP LPC175x, LPC176x\n#define OPT_MCU_LPC177X_8X          5 ///< NXP LPC177x, LPC178x\n#define OPT_MCU_LPC18XX             6 ///< NXP LPC18xx\n#define OPT_MCU_LPC40XX             7 ///< NXP LPC40xx\n#define OPT_MCU_LPC43XX             8 ///< NXP LPC43xx\n#define OPT_MCU_LPC51               9 ///< NXP LPC51\n#define OPT_MCU_LPC51UXX            OPT_MCU_LPC51 ///< NXP LPC51\n#define OPT_MCU_LPC54              10 ///< NXP LPC54\n#define OPT_MCU_LPC55              11 ///< NXP LPC55\n// legacy naming\n#define OPT_MCU_LPC54XXX           OPT_MCU_LPC54\n#define OPT_MCU_LPC55XX            OPT_MCU_LPC55\n\n// NRF\n#define OPT_MCU_NRF5X             100 ///< Nordic nRF 52,53 series\n#define OPT_MCU_NRF54             101 ///< Nordic nRF54 series\n\n// SAM\n#define OPT_MCU_SAMD21            200 ///< MicroChip SAMD21\n#define OPT_MCU_SAMD51            201 ///< MicroChip SAMD51\n#define OPT_MCU_SAMG              202 ///< MicroChip SAMDG series\n#define OPT_MCU_SAME5X            203 ///< MicroChip SAM E5x\n#define OPT_MCU_SAMD11            204 ///< MicroChip SAMD11\n#define OPT_MCU_SAML2X            205 ///< MicroChip SAML2x\n#define OPT_MCU_SAML21            OPT_MCU_SAML2X ///< SAML21 backward compatibility\n#define OPT_MCU_SAML22            OPT_MCU_SAML2X ///< SAML22 backward compatibility\n#define OPT_MCU_SAMX7X            207 ///< MicroChip SAME70, S70, V70, V71 family\n\n// STM32\n#define OPT_MCU_STM32F0           300 ///< ST F0\n#define OPT_MCU_STM32F1           301 ///< ST F1\n#define OPT_MCU_STM32F2           302 ///< ST F2\n#define OPT_MCU_STM32F3           303 ///< ST F3\n#define OPT_MCU_STM32F4           304 ///< ST F4\n#define OPT_MCU_STM32F7           305 ///< ST F7\n#define OPT_MCU_STM32H7           306 ///< ST H7\n#define OPT_MCU_STM32L1           308 ///< ST L1\n#define OPT_MCU_STM32L0           307 ///< ST L0\n#define OPT_MCU_STM32L4           309 ///< ST L4\n#define OPT_MCU_STM32G0           310 ///< ST G0\n#define OPT_MCU_STM32G4           311 ///< ST G4\n#define OPT_MCU_STM32WB           312 ///< ST WB\n#define OPT_MCU_STM32U5           313 ///< ST U5\n#define OPT_MCU_STM32L5           314 ///< ST L5\n#define OPT_MCU_STM32H5           315 ///< ST H5\n#define OPT_MCU_STM32U0           316 ///< ST U0\n#define OPT_MCU_STM32H7RS         317 ///< ST F7RS\n#define OPT_MCU_STM32C0           318 ///< ST C0\n#define OPT_MCU_STM32N6           319 ///< ST N6\n#define OPT_MCU_STM32WBA          320 ///< ST WBA\n#define OPT_MCU_STM32U3           321 ///< ST U3\n\n// Sony\n#define OPT_MCU_CXD56             400 ///< SONY CXD56\n\n// TI\n#define OPT_MCU_MSP430x5xx        500 ///< TI MSP430x5xx\n#define OPT_MCU_MSP432E4          510 ///< TI MSP432E4xx\n#define OPT_MCU_TM4C123           511 ///< TI Tiva-C 123x\n#define OPT_MCU_TM4C129           512 ///< TI Tiva-C 129x\n\n// ValentyUSB eptri\n#define OPT_MCU_VALENTYUSB_EPTRI  600 ///< Fomu eptri config\n\n// NXP iMX RT\n#define OPT_MCU_MIMXRT1XXX        700                 ///< NXP iMX RT1xxx Series\n#define OPT_MCU_MIMXRT10XX        OPT_MCU_MIMXRT1XXX  ///< RT10xx\n#define OPT_MCU_MIMXRT11XX        OPT_MCU_MIMXRT1XXX  ///< RT11xx\n\n// Nuvoton\n#define OPT_MCU_NUC121            800\n#define OPT_MCU_NUC126            801\n#define OPT_MCU_NUC120            802\n#define OPT_MCU_NUC505            803\n\n// Espressif\n#define OPT_MCU_ESP32S2           900 ///< Espressif ESP32-S2\n#define OPT_MCU_ESP32S3           901 ///< Espressif ESP32-S3\n#define OPT_MCU_ESP32             902 ///< Espressif ESP32 (for host max3421e)\n#define OPT_MCU_ESP32C3           903 ///< Espressif ESP32-C3\n#define OPT_MCU_ESP32C6           904 ///< Espressif ESP32-C6\n#define OPT_MCU_ESP32C2           905 ///< Espressif ESP32-C2\n#define OPT_MCU_ESP32H2           906 ///< Espressif ESP32-H2\n#define OPT_MCU_ESP32P4           907 ///< Espressif ESP32-P4\n#define OPT_MCU_ESP32C5           908 ///< Espressif ESP32-C5\n#define OPT_MCU_ESP32C61          909 ///< Espressif ESP32-C61\n#define OPT_MCU_ESP32H4           910 ///< Espressif ESP32-H4\n\n// Dialog\n#define OPT_MCU_DA1469X          1000 ///< Dialog Semiconductor DA1469x\n\n// Raspberry Pi\n#define OPT_MCU_RP2040           1100 ///< Raspberry Pi RP2040\n\n// NXP Kinetis\n#define OPT_MCU_KINETIS_KL       1200 ///< NXP KL series\n#define OPT_MCU_KINETIS_K32L     1201 ///< NXP K32L series\n#define OPT_MCU_KINETIS_K32      1201 ///< Alias to K32L\n#define OPT_MCU_KINETIS_K        1202 ///< NXP K series\n\n#define OPT_MCU_MKL25ZXX         1200 ///< Alias to KL (obsolete)\n#define OPT_MCU_K32L2BXX         1201 ///< Alias to K32 (obsolete)\n\n// Silabs\n#define OPT_MCU_EFM32GG          1300 ///< Silabs EFM32GG\n\n// Renesas RX\n#define OPT_MCU_RX63X            1400 ///< Renesas RX63N/631\n#define OPT_MCU_RX65X            1401 ///< Renesas RX65N/RX651\n#define OPT_MCU_RX72N            1402 ///< Renesas RX72N\n#define OPT_MCU_RAXXX            1403 ///< Renesas RA generic\n\n// Mind Motion\n#define OPT_MCU_MM32F327X        1500 ///< Mind Motion MM32F327\n\n// GigaDevice\n#define OPT_MCU_GD32VF103        1600 ///< GigaDevice GD32VF103\n\n// Broadcom\n#define OPT_MCU_BCM2711          1700 ///< Broadcom BCM2711\n#define OPT_MCU_BCM2835          1701 ///< Broadcom BCM2835\n#define OPT_MCU_BCM2837          1702 ///< Broadcom BCM2837\n\n// Infineon\n#define OPT_MCU_XMC4000          1800 ///< Infineon XMC4000\n\n// PIC\n#define OPT_MCU_PIC32MZ          1900 ///< MicroChip PIC32MZ family\n#define OPT_MCU_PIC32MM          1901 ///< MicroChip PIC32MM family\n#define OPT_MCU_PIC32MX          1902 ///< MicroChip PIC32MX family\n#define OPT_MCU_PIC32MK          1903 ///< MicroChip PIC32MK family\n#define OPT_MCU_PIC24            1910 ///< MicroChip PIC24 family\n#define OPT_MCU_DSPIC33          1911 ///< MicroChip DSPIC33 family\n\n// BridgeTek\n#define OPT_MCU_FT90X            2000 ///< BridgeTek FT90x\n#define OPT_MCU_FT93X            2001 ///< BridgeTek FT93x\n\n// Allwinner\n#define OPT_MCU_F1C100S          2100 ///< Allwinner F1C100s family\n\n// WCH\n#define OPT_MCU_CH32V307         2200 ///< WCH CH32V307\n#define OPT_MCU_CH32F20X         2210 ///< WCH CH32F20x\n#define OPT_MCU_CH32V20X         2220 ///< WCH CH32V20X\n#define OPT_MCU_CH32V103         2230 ///< WCH CH32V103\n\n// NXP LPC MCX\n#define OPT_MCU_MCXN9            2300  ///< NXP MCX N9 Series\n#define OPT_MCU_MCXA15           2301  ///< NXP MCX A15 Series\n#define OPT_MCU_RW61X            2302  ///< NXP RW61x Series\n\n// Analog Devices\n#define OPT_MCU_MAX32690         2400  ///< ADI MAX32690\n#define OPT_MCU_MAX32665         2401  ///< ADI MAX32666/5\n#define OPT_MCU_MAX32666         2401  ///< ADI MAX32666/5\n#define OPT_MCU_MAX32650         2402  ///< ADI MAX32650/1/2\n#define OPT_MCU_MAX78002         2403  ///< ADI MAX78002\n\n// ArteryTek\n#define OPT_MCU_AT32F403A_407    2500  ///< ArteryTek AT32F403A_AT32F407\n#define OPT_MCU_AT32F415         2501  ///< ArteryTek AT32F415\n#define OPT_MCU_AT32F435_437     2502  ///< ArteryTek AT32F435_AT32F437\n#define OPT_MCU_AT32F423         2503  ///< ArteryTek AT32F423\n#define OPT_MCU_AT32F402_405     2504  ///< ArteryTek AT32F402_405\n#define OPT_MCU_AT32F425         2505  ///< ArteryTek AT32F425\n#define OPT_MCU_AT32F413         2506  ///< ArteryTek AT32F413\n#define OPT_MCU_AT32F45X         2507  ///< ArteryTek AT32F45x\n\n// HPMicro\n#define OPT_MCU_HPM              2600  ///< HPMicro\n\n// Check if configured MCU is one of listed\n// Apply TU_MCU_IS_EQUAL with || as separator to list of input\n#define TU_MCU_IS_EQUAL(_m)  (CFG_TUSB_MCU == (_m))\n#define TU_CHECK_MCU(...)    (TU_ARGS_APPLY(TU_MCU_IS_EQUAL, ||, __VA_ARGS__))\n\n//--------------------------------------------------------------------+\n// Supported OS\n//--------------------------------------------------------------------+\n\n#define OPT_OS_NONE       1  ///< No RTOS\n#define OPT_OS_FREERTOS   2  ///< FreeRTOS\n#define OPT_OS_MYNEWT     3  ///< Mynewt OS\n#define OPT_OS_CUSTOM     4  ///< Custom OS is implemented by application\n#define OPT_OS_PICO       5  ///< Raspberry Pi Pico SDK\n#define OPT_OS_RTTHREAD   6  ///< RT-Thread\n#define OPT_OS_RTX4       7  ///< Keil RTX 4\n#define OPT_OS_ZEPHYR     8  ///< Zephyr\n#define OPT_OS_THREADX    9  ///< ThreadX\n\n//--------------------------------------------------------------------+\n// Mode and Speed\n//--------------------------------------------------------------------+\n\n// Low byte is operational mode\n#define OPT_MODE_NONE           0x0000 ///< Disabled\n#define OPT_MODE_DEVICE         0x0001 ///< Device Mode\n#define OPT_MODE_HOST           0x0002 ///< Host Mode\n\n// High byte is max operational speed (corresponding to tusb_speed_t)\n#define OPT_MODE_DEFAULT_SPEED  0x0000u ///< Default (max) speed supported by MCU\n#define OPT_MODE_LOW_SPEED      0x0100u ///< Low Speed\n#define OPT_MODE_FULL_SPEED     0x0200u ///< Full Speed\n#define OPT_MODE_HIGH_SPEED     0x0400u ///< High Speed\n#define OPT_MODE_SPEED_MASK     0xff00u\n\n//--------------------------------------------------------------------+\n// Include tusb_config.h\n//--------------------------------------------------------------------+\n\n// Allow to use command line to change the config name/location\n#ifdef CFG_TUSB_CONFIG_FILE\n  #include CFG_TUSB_CONFIG_FILE\n#else\n  #include \"tusb_config.h\"\n#endif\n\n#include \"common/tusb_mcu.h\"\n\n//--------------------------------------------------------------------+\n// USBIP\n//--------------------------------------------------------------------+\n\n//------------- ChipIdea -------------//\n// Enable CI_HS VBUS Charge. Set this to 1 if the USB_VBUS pin is not connected to 5V VBUS (note: 3.3V is\n// insufficient).\n#ifndef CFG_TUD_CI_HS_VBUS_CHARGE\n  #ifndef CFG_TUD_CI_HS_VBUS_CHARGE_DEFAULT\n    #define CFG_TUD_CI_HS_VBUS_CHARGE_DEFAULT 0\n  #endif\n  #define CFG_TUD_CI_HS_VBUS_CHARGE CFG_TUD_CI_HS_VBUS_CHARGE_DEFAULT\n#endif\n\n// CI_HS support FIFO transfer if endpoint buffer is 4k aligned and size is multiple of 4k, also DCACHE is disabled\n#ifndef CFG_TUD_CI_HS_EPBUF_4K_ALIGNED\n  #define CFG_TUD_CI_HS_EPBUF_4K_ALIGNED 0\n#endif\n\n#if CFG_TUD_CI_HS_EPBUF_4K_ALIGNED && !CFG_TUD_MEM_DCACHE_ENABLE\n  #define CFG_TUD_EDPT_DEDICATED_HWFIFO 1\n#endif\n\n//------------- DWC2 -------------//\n// DMA mode for device\n#ifndef CFG_TUD_DWC2_DMA_ENABLE\n  #ifndef CFG_TUD_DWC2_DMA_ENABLE_DEFAULT\n  #define CFG_TUD_DWC2_DMA_ENABLE_DEFAULT 0\n  #endif\n\n  #define CFG_TUD_DWC2_DMA_ENABLE CFG_TUD_DWC2_DMA_ENABLE_DEFAULT\n#endif\n\n// Slave mode for device\n#ifndef CFG_TUD_DWC2_SLAVE_ENABLE\n  #ifndef CFG_TUD_DWC2_SLAVE_ENABLE_DEFAULT\n    #define CFG_TUD_DWC2_SLAVE_ENABLE_DEFAULT !CFG_TUD_DWC2_DMA_ENABLE // disabled if DMA is enabled\n  #endif\n\n  #define CFG_TUD_DWC2_SLAVE_ENABLE CFG_TUD_DWC2_SLAVE_ENABLE_DEFAULT\n#endif\n\n// DMA mode for host\n#ifndef CFG_TUH_DWC2_DMA_ENABLE\n  #ifndef CFG_TUH_DWC2_DMA_ENABLE_DEFAULT\n    #define CFG_TUH_DWC2_DMA_ENABLE_DEFAULT 0\n  #endif\n\n  #define CFG_TUH_DWC2_DMA_ENABLE CFG_TUH_DWC2_DMA_ENABLE_DEFAULT\n#endif\n\n// Slave mode for host\n#ifndef CFG_TUH_DWC2_SLAVE_ENABLE\n  #ifndef CFG_TUH_DWC2_SLAVE_ENABLE_DEFAULT\n    #define CFG_TUH_DWC2_SLAVE_ENABLE_DEFAULT !CFG_TUH_DWC2_DMA_ENABLE // disabled if DMA is enabled\n  #endif\n\n  #define CFG_TUH_DWC2_SLAVE_ENABLE CFG_TUH_DWC2_SLAVE_ENABLE_DEFAULT\n#endif\n\n#if defined(TUP_USBIP_DWC2)\n  #define CFG_TUD_EDPT_DEDICATED_HWFIFO    CFG_TUD_DWC2_SLAVE_ENABLE\n  #define CFG_TUH_EDPT_DEDICATED_HWFIFO    CFG_TUH_DWC2_SLAVE_ENABLE\n\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE 4 // 32bit access\n  #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE 0 // fixed hwfifo address\n#endif\n\n//------------ FSDEV --------------//\n#if defined(TUP_USBIP_FSDEV)\n  #define CFG_TUD_EDPT_DEDICATED_HWFIFO 1\n\n  #if CFG_TUSB_FSDEV_PMA_SIZE == 2048 || TU_CHECK_MCU(OPT_MCU_STM32U0)\n    // 32-bit access scheme\n    #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE 4 // 32-bit data\n    #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE 4 // 32-bit address increase\n    #define CFG_TUSB_FSDEV_32BIT\n  #elif CFG_TUSB_FSDEV_PMA_SIZE == 1024\n    // 2 x 16-bit access scheme\n    #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE 2 // 16-bit data\n    #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE 2 // 16-bit address increase\n  #elif CFG_TUSB_FSDEV_PMA_SIZE == 512\n    // 1 x 16-bit access scheme\n    #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE 2 // 16-bit data\n    #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE 4 // 32-bit address increase\n  #endif\n#endif\n\n//------------ MAX3421 -------------//\n// Enable MAX3421 USB host controller\n#ifndef CFG_TUH_MAX3421\n  #define CFG_TUH_MAX3421 0\n#endif\n\n//------------ MUSB --------------//\n#if defined(TUP_USBIP_MUSB)\n  #define CFG_TUD_EDPT_DEDICATED_HWFIFO              1\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE           4 // 32 bit data\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_ODD_16BIT_ACCESS   // allow odd 16bit access\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_ODD_8BIT_ACCESS    // allow odd 8bit access\n  #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE           0 // fixed hwfifo\n#endif\n\n//------------- Raspberry Pi -------------//\n// Enable PIO-USB software host controller\n#ifndef CFG_TUH_RPI_PIO_USB\n  #define CFG_TUH_RPI_PIO_USB 0\n#endif\n\n#ifndef CFG_TUD_RPI_PIO_USB\n  #define CFG_TUD_RPI_PIO_USB 0\n#endif\n\n#if (CFG_TUSB_MCU == OPT_MCU_RP2040) && !CFG_TUD_RPI_PIO_USB\n  #define CFG_TUD_EDPT_DEDICATED_HWFIFO    0\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE 1\n  #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE 1\n  #define CFG_TUSB_FIFO_HWFIFO_CUSTOM_WRITE\n  #define CFG_TUSB_FIFO_HWFIFO_CUSTOM_READ\n#endif\n\n//------------ RUSB2 --------------//\n#if defined(TUP_USBIP_RUSB2)\n  #define CFG_TUD_EDPT_DEDICATED_HWFIFO     1\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE  (2 | (TUD_OPT_HIGH_SPEED ? 4 : 0)) // 16 bit and 32 bit if highspeed\n  #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE  0\n  #define CFG_TUSB_FIFO_HWFIFO_CUSTOM_WRITE // custom write since rusb2 can change access width 32 -> 16 and can write\n                                            // odd byte with byte access\n#endif\n\n//------- Microchip SAMX7X -------//\n// DMA mode for device\n#ifndef CFG_TUD_SAMX7X_DMA_ENABLE\n  #ifndef CFG_TUD_SAMX7X_DMA_ENABLE_DEFAULT\n  #define CFG_TUD_SAMX7X_DMA_ENABLE_DEFAULT 0\n  #endif\n\n  #define CFG_TUD_SAMX7X_DMA_ENABLE CFG_TUD_SAMX7X_DMA_ENABLE_DEFAULT\n#endif\n\n#if (CFG_TUSB_MCU == OPT_MCU_SAMX7X)\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE 4\n  #define CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE 4\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_ODD_16BIT_ACCESS\n  #define CFG_TUSB_FIFO_HWFIFO_DATA_ODD_8BIT_ACCESS\n  #define CFG_TUD_EDPT_DEDICATED_HWFIFO 1\n#endif\n\n//--------------------------------------------------------------------\n// RootHub Mode detection\n//--------------------------------------------------------------------\n\n//------------- Root hub as Device -------------//\n\n#if defined(CFG_TUSB_RHPORT0_MODE) && ((CFG_TUSB_RHPORT0_MODE) & OPT_MODE_DEVICE)\n  #define TUD_RHPORT_MODE     (CFG_TUSB_RHPORT0_MODE)\n  #define TUD_OPT_RHPORT      0\n#elif defined(CFG_TUSB_RHPORT1_MODE) && ((CFG_TUSB_RHPORT1_MODE) & OPT_MODE_DEVICE)\n  #define TUD_RHPORT_MODE     (CFG_TUSB_RHPORT1_MODE)\n  #define TUD_OPT_RHPORT      1\n#else\n  #define TUD_RHPORT_MODE     OPT_MODE_NONE\n#endif\n\n#ifndef CFG_TUD_ENABLED\n  // fallback to use CFG_TUSB_RHPORTx_MODE\n  #define CFG_TUD_ENABLED     (TUD_RHPORT_MODE & OPT_MODE_DEVICE)\n#endif\n\n#ifndef CFG_TUD_MAX_SPEED\n  // fallback to use CFG_TUSB_RHPORTx_MODE\n  #define CFG_TUD_MAX_SPEED   (TUD_RHPORT_MODE & OPT_MODE_SPEED_MASK)\n#endif\n\n// For backward compatible\n#define TUSB_OPT_DEVICE_ENABLED CFG_TUD_ENABLED\n\n// highspeed support indicator\n#define TUD_OPT_HIGH_SPEED    (CFG_TUD_MAX_SPEED ? (CFG_TUD_MAX_SPEED & OPT_MODE_HIGH_SPEED) : TUP_RHPORT_HIGHSPEED)\n\n//------------- Root hub as Host -------------//\n\n#if defined(CFG_TUSB_RHPORT0_MODE) && ((CFG_TUSB_RHPORT0_MODE) & OPT_MODE_HOST)\n  #define TUH_RHPORT_MODE  (CFG_TUSB_RHPORT0_MODE)\n  #define TUH_OPT_RHPORT   0\n#elif defined(CFG_TUSB_RHPORT1_MODE) && ((CFG_TUSB_RHPORT1_MODE) & OPT_MODE_HOST)\n  #define TUH_RHPORT_MODE  (CFG_TUSB_RHPORT1_MODE)\n  #define TUH_OPT_RHPORT   1\n#else\n  #define TUH_RHPORT_MODE   OPT_MODE_NONE\n#endif\n\n#ifndef CFG_TUH_ENABLED\n  // fallback to use CFG_TUSB_RHPORTx_MODE\n  #define CFG_TUH_ENABLED     (TUH_RHPORT_MODE & OPT_MODE_HOST)\n#endif\n\n#ifndef CFG_TUH_MAX_SPEED\n  // fallback to use CFG_TUSB_RHPORTx_MODE\n  #define CFG_TUH_MAX_SPEED   (TUH_RHPORT_MODE & OPT_MODE_SPEED_MASK)\n#endif\n\n// For backward compatible\n#define TUSB_OPT_HOST_ENABLED   CFG_TUH_ENABLED\n\n// highspeed support indicator\n#define TUH_OPT_HIGH_SPEED    (CFG_TUH_MAX_SPEED ? (CFG_TUH_MAX_SPEED & OPT_MODE_HIGH_SPEED) : TUP_RHPORT_HIGHSPEED)\n\n\n//--------------------------------------------------------------------+\n// TODO move later\n//--------------------------------------------------------------------+\n\n// TUP_MCU_STRICT_ALIGN will overwrite TUP_ARCH_STRICT_ALIGN.\n// In case TUP_MCU_STRICT_ALIGN = 1 and TUP_ARCH_STRICT_ALIGN =0, we will not reply on compiler\n// to generate unaligned access code.\n// LPC_IP3511 Highspeed cannot access unaligned memory on USB_RAM\n#if TUD_OPT_HIGH_SPEED && TU_CHECK_MCU(OPT_MCU_LPC54XXX, OPT_MCU_LPC55XX)\n  #define TUP_MCU_STRICT_ALIGN   1\n#else\n  #define TUP_MCU_STRICT_ALIGN   0\n#endif\n\n//--------------------------------------------------------------------+\n// Common Options (Default)\n//--------------------------------------------------------------------+\n\n// Debug enable to print out error message\n#ifndef CFG_TUSB_DEBUG\n  #define CFG_TUSB_DEBUG 0\n#endif\n\n// Level where CFG_TUSB_DEBUG must be at least for USBH is logged\n#ifndef CFG_TUH_LOG_LEVEL\n  #define CFG_TUH_LOG_LEVEL   2\n#endif\n\n// Level where CFG_TUSB_DEBUG must be at least for USBD is logged\n#ifndef CFG_TUD_LOG_LEVEL\n  #define CFG_TUD_LOG_LEVEL   2\n#endif\n\n// Memory section for placing buffer used for usb transferring. If MEM_SECTION is different for\n// host and device use: CFG_TUD_MEM_SECTION, CFG_TUH_MEM_SECTION instead\n#ifndef CFG_TUSB_MEM_SECTION\n  #define CFG_TUSB_MEM_SECTION\n#endif\n\n// Alignment requirement of buffer used for usb transferring. if MEM_ALIGN is different for\n// host and device controller use: CFG_TUD_MEM_ALIGN, CFG_TUH_MEM_ALIGN instead\n#ifndef CFG_TUSB_MEM_ALIGN\n  #define CFG_TUSB_MEM_ALIGN      TU_ATTR_ALIGNED(4)\n#endif\n\n#ifndef CFG_TUSB_MEM_DCACHE_LINE_SIZE\n  #ifndef CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT\n  #define CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT 1\n  #endif\n\n  #define CFG_TUSB_MEM_DCACHE_LINE_SIZE CFG_TUSB_MEM_DCACHE_LINE_SIZE_DEFAULT\n#endif\n\n// OS selection\n#ifndef CFG_TUSB_OS\n  #define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_OS_HAS_SCHEDULER\n  #define CFG_TUSB_OS_HAS_SCHEDULER (CFG_TUSB_OS != OPT_OS_NONE && CFG_TUSB_OS != OPT_OS_PICO)\n#endif\n\n#ifndef CFG_TUSB_OS_INC_PATH\n  #ifndef CFG_TUSB_OS_INC_PATH_DEFAULT\n  #define CFG_TUSB_OS_INC_PATH_DEFAULT\n  #endif\n\n  #define CFG_TUSB_OS_INC_PATH  CFG_TUSB_OS_INC_PATH_DEFAULT\n#endif\n\n//--------------------------------------------------------------------\n// Device Options (Default)\n//--------------------------------------------------------------------\n\n// Attribute to place data in accessible RAM for device controller (default: CFG_TUSB_MEM_SECTION)\n#ifndef CFG_TUD_MEM_SECTION\n  #define CFG_TUD_MEM_SECTION     CFG_TUSB_MEM_SECTION\n#endif\n\n// Attribute to align memory for device controller (default: CFG_TUSB_MEM_ALIGN)\n#ifndef CFG_TUD_MEM_ALIGN\n  #define CFG_TUD_MEM_ALIGN       CFG_TUSB_MEM_ALIGN\n#endif\n\n#ifndef CFG_TUD_MEM_DCACHE_ENABLE\n  #ifndef CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT\n  #define CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT  0\n  #endif\n\n  #define CFG_TUD_MEM_DCACHE_ENABLE   CFG_TUD_MEM_DCACHE_ENABLE_DEFAULT\n#endif\n\n#ifndef CFG_TUD_MEM_DCACHE_LINE_SIZE\n  #define CFG_TUD_MEM_DCACHE_LINE_SIZE CFG_TUSB_MEM_DCACHE_LINE_SIZE\n#endif\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n  #define CFG_TUD_ENDPOINT0_SIZE  64\n#endif\n\n#ifndef CFG_TUD_ENDPOINT0_BUFSIZE\n  #define CFG_TUD_ENDPOINT0_BUFSIZE  CFG_TUD_ENDPOINT0_SIZE\n#endif\n\n#ifndef CFG_TUD_INTERFACE_MAX\n  #define CFG_TUD_INTERFACE_MAX   16\n#endif\n\n// max events processed in one tud_task_ext() call, 0 for unlimited\n#ifndef CFG_TUD_TASK_EVENTS_PER_RUN\n  #define CFG_TUD_TASK_EVENTS_PER_RUN  16\n#endif\n\n// default to max hardware endpoint, but can be smaller to save RAM\n#ifndef CFG_TUD_ENDPPOINT_MAX\n  #define CFG_TUD_ENDPPOINT_MAX   TUP_DCD_ENDPOINT_MAX\n#endif\n\n#if CFG_TUD_ENDPPOINT_MAX > TUP_DCD_ENDPOINT_MAX\n  #error \"CFG_TUD_ENDPPOINT_MAX must be less than or equal to TUP_DCD_ENDPOINT_MAX\"\n#endif\n\n// USB 2.0 7.1.20: compliance test mode support\n#ifndef CFG_TUD_TEST_MODE\n  #define CFG_TUD_TEST_MODE       0\n#endif\n\n#ifndef CFG_TUD_VBUS_DETECT_HW_DEFAULT\n  #define CFG_TUD_VBUS_DETECT_HW_DEFAULT 0\n#endif\n\n// Enable VBUS Detect hardware, usually via functional GPIO\n#ifndef CFG_TUD_VBUS_DETECT_HW\n  #define CFG_TUD_VBUS_DETECT_HW CFG_TUD_VBUS_DETECT_HW_DEFAULT\n#endif\n\n//------------- Device Class Driver -------------//\n#ifndef CFG_TUD_BTH\n  #define CFG_TUD_BTH 0\n#endif\n\n#if CFG_TUD_BTH && !defined(CFG_TUD_BTH_ISO_ALT_COUNT)\n#error CFG_TUD_BTH_ISO_ALT_COUNT must be defined to tell Bluetooth driver the number of ISO endpoints to use\n#endif\n\n#ifndef CFG_TUD_CDC\n  #define CFG_TUD_CDC             0\n#endif\n\n#ifndef CFG_TUD_MSC\n  #define CFG_TUD_MSC             0\n#endif\n\n#ifndef CFG_TUD_MTP\n  #define CFG_TUD_MTP             0\n#endif\n\n#ifndef CFG_TUD_HID\n  #define CFG_TUD_HID             0\n#endif\n\n#ifndef CFG_TUD_AUDIO\n  #define CFG_TUD_AUDIO           0\n#endif\n\n#ifndef CFG_TUD_VIDEO\n  #define CFG_TUD_VIDEO           0\n#endif\n\n#ifndef CFG_TUD_MIDI\n  #define CFG_TUD_MIDI            0\n#endif\n\n#ifndef CFG_TUD_VENDOR\n  #define CFG_TUD_VENDOR          0\n#endif\n\n#ifndef CFG_TUD_USBTMC\n  #define CFG_TUD_USBTMC          0\n#endif\n\n#ifndef CFG_TUD_DFU_RUNTIME\n  #define CFG_TUD_DFU_RUNTIME     0\n#endif\n\n#ifndef CFG_TUD_DFU\n  #define CFG_TUD_DFU             0\n#endif\n\n#ifndef CFG_TUD_ECM_RNDIS\n  #ifdef CFG_TUD_NET\n    #warning \"CFG_TUD_NET is renamed to CFG_TUD_ECM_RNDIS\"\n    #define CFG_TUD_ECM_RNDIS   CFG_TUD_NET\n  #else\n    #define CFG_TUD_ECM_RNDIS   0\n  #endif\n#endif\n\n#ifndef CFG_TUD_NCM\n  #define CFG_TUD_NCM         0\n#endif\n\n#ifndef CFG_TUD_PRINTER\n  #define CFG_TUD_PRINTER         0\n#endif\n\n#ifndef CFG_TUD_EDPT_DEDICATED_HWFIFO\n  #define CFG_TUD_EDPT_DEDICATED_HWFIFO 0\n#endif\n\n//--------------------------------------------------------------------\n// Host Options (Default)\n//--------------------------------------------------------------------\n#if CFG_TUH_ENABLED\n  #ifndef CFG_TUH_DEVICE_MAX\n    #define CFG_TUH_DEVICE_MAX 1\n  #endif\n\n  #ifndef CFG_TUH_ENUMERATION_BUFSIZE\n    #define CFG_TUH_ENUMERATION_BUFSIZE 256\n  #endif\n#endif // CFG_TUH_ENABLED\n\n// Attribute to place data in accessible RAM for host controller (default: CFG_TUSB_MEM_SECTION)\n#ifndef CFG_TUH_MEM_SECTION\n  #define CFG_TUH_MEM_SECTION   CFG_TUSB_MEM_SECTION\n#endif\n\n// Attribute to align memory for host controller\n#ifndef CFG_TUH_MEM_ALIGN\n  #define CFG_TUH_MEM_ALIGN     CFG_TUSB_MEM_ALIGN\n#endif\n\n#ifndef CFG_TUH_MEM_DCACHE_ENABLE\n  #ifndef CFG_TUH_MEM_DCACHE_ENABLE_DEFAULT\n  #define CFG_TUH_MEM_DCACHE_ENABLE_DEFAULT  0\n  #endif\n\n  #define CFG_TUH_MEM_DCACHE_ENABLE   CFG_TUH_MEM_DCACHE_ENABLE_DEFAULT\n#endif\n\n#ifndef CFG_TUH_MEM_DCACHE_LINE_SIZE\n  #define CFG_TUH_MEM_DCACHE_LINE_SIZE CFG_TUSB_MEM_DCACHE_LINE_SIZE\n#endif\n\n// max events processed in one tuh_task_ext() call, 0 for unlimited\n#ifndef CFG_TUH_TASK_EVENTS_PER_RUN\n  #define CFG_TUH_TASK_EVENTS_PER_RUN  16\n#endif\n\n//------------- CLASS -------------//\n\n#ifndef CFG_TUH_HUB\n  #define CFG_TUH_HUB    0\n#endif\n\n#ifndef CFG_TUH_CDC\n  #define CFG_TUH_CDC    0\n#endif\n\n// FTDI is not part of CDC class, only to re-use CDC driver API\n#ifndef CFG_TUH_CDC_FTDI\n  #define CFG_TUH_CDC_FTDI 0\n#endif\n\n// List of product IDs that can use the FTDI CDC driver. 0x0403 is FTDI's VID\n#ifndef CFG_TUH_CDC_FTDI_VID_PID_LIST\n  #define CFG_TUH_CDC_FTDI_VID_PID_LIST \\\n    {0x0403, 0x6001}, /* Similar device to SIO above */ \\\n    {0x0403, 0x6006}, /* FTDI's alternate PID for above */ \\\n    {0x0403, 0x6010}, /* Dual channel device */ \\\n    {0x0403, 0x6011}, /* Quad channel hi-speed device */ \\\n    {0x0403, 0x6014}, /* Single channel hi-speed device */ \\\n    {0x0403, 0x6015}, /* FT-X series (FT201X, FT230X, FT231X, etc) */ \\\n    {0x0403, 0x6040}, /* Dual channel hi-speed device with PD */ \\\n    {0x0403, 0x6041}, /* Quad channel hi-speed device with PD */ \\\n    {0x0403, 0x6042}, /* Dual channel hi-speed device with PD */ \\\n    {0x0403, 0x6043}, /* Quad channel hi-speed device with PD */ \\\n    {0x0403, 0x6044}, /* Dual channel hi-speed device with PD */ \\\n    {0x0403, 0x6045}, /* Dual channel hi-speed device with PD */ \\\n    {0x0403, 0x6048}, /* Quad channel automotive grade hi-speed device */ \\\n    {0x0403, 0x8372}, /* Product Id SIO application of 8U100AX */ \\\n    {0x0403, 0xFBFA}, /* Product ID for FT232RL */ \\\n    {0x0403, 0xCD18}, /* ??? */\n#endif\n\n// CP210X is not part of CDC class, only to re-use CDC driver API\n#ifndef CFG_TUH_CDC_CP210X\n  #define CFG_TUH_CDC_CP210X 0\n#endif\n\n// List of product IDs that can use the CP210X CDC driver. 0x10C4 is Silicon Labs' VID\n#ifndef CFG_TUH_CDC_CP210X_VID_PID_LIST\n  #define CFG_TUH_CDC_CP210X_VID_PID_LIST \\\n  { 0x10C4, 0xEA60 }, /* Silicon Labs factory default */ \\\n  { 0x10C4, 0xEA61 }, /* Silicon Labs factory default */ \\\n  { 0x10C4, 0xEA70 }  /* Silicon Labs Dual Port factory default */\n#endif\n\n#ifndef CFG_TUH_CDC_CH34X\n  // CH34X is not part of CDC class, only to re-use CDC driver API\n  #define CFG_TUH_CDC_CH34X 0\n#endif\n\n// List of product IDs that can use the CH34X CDC driver\n#ifndef CFG_TUH_CDC_CH34X_VID_PID_LIST\n  #define CFG_TUH_CDC_CH34X_VID_PID_LIST \\\n    { 0x1a86, 0x5523 }, /* ch341 chip */ \\\n    { 0x1a86, 0x7522 }, /* ch340k chip */ \\\n    { 0x1a86, 0x7523 }, /* ch340 chip */ \\\n    { 0x1a86, 0xe523 }, /* ch330 chip */ \\\n    { 0x4348, 0x5523 }, /* ch340 custom chip */ \\\n    { 0x2184, 0x0057 }, /* overtaken from Linux Kernel driver /drivers/usb/serial/ch341.c */ \\\n    { 0x9986, 0x7523 }  /* overtaken from Linux Kernel driver /drivers/usb/serial/ch341.c */\n#endif\n\n#ifndef CFG_TUH_CDC_PL2303\n  // PL2303 is not part of CDC class, only to re-use CDC driver API\n  #define CFG_TUH_CDC_PL2303 0\n#endif\n\n#ifndef CFG_TUH_CDC_PL2303_VID_PID_LIST\n  // List of product IDs that can use the PL2303 CDC driver\n  #define CFG_TUH_CDC_PL2303_VID_PID_LIST \\\n  { 0x067b, 0x2303 }, /* initial 2303 */ \\\n  { 0x067b, 0x2304 }, /* TB */ \\\n  { 0x067b, 0x23a3 }, /* GC */ \\\n  { 0x067b, 0x23b3 }, /* GB */ \\\n  { 0x067b, 0x23c3 }, /* GT */ \\\n  { 0x067b, 0x23d3 }, /* GL */ \\\n  { 0x067b, 0x23e3 }, /* GE */ \\\n  { 0x067b, 0x23f3 }  /* GS */\n#endif\n\n#ifndef CFG_TUH_HID\n  #define CFG_TUH_HID    0\n#endif\n\n#ifndef CFG_TUH_MIDI\n  #define CFG_TUH_MIDI   0\n#endif\n\n#ifndef CFG_TUH_MSC\n  #define CFG_TUH_MSC    0\n#endif\n\n#ifndef CFG_TUH_VENDOR\n  #define CFG_TUH_VENDOR 0\n#endif\n\n#ifndef CFG_TUH_API_EDPT_XFER\n  #define CFG_TUH_API_EDPT_XFER 0\n#endif\n\n#ifndef CFG_TUH_EDPT_DEDICATED_HWFIFO\n  #define CFG_TUH_EDPT_DEDICATED_HWFIFO 0\n#endif\n\n//--------------------------------------------------------------------+\n// TypeC Options (Default)\n//--------------------------------------------------------------------+\n\n#ifndef CFG_TUC_ENABLED\n#define CFG_TUC_ENABLED 0\n\n#define tuc_int_handler(_p)\n#endif\n\n//------------------------------------------------------------------\n// Configuration Validation\n//------------------------------------------------------------------\n#if CFG_TUD_ENDPOINT0_SIZE > 64\n  #error Control Endpoint Max Packet Size cannot be larger than 64\n#endif\n\n// To avoid GCC compiler warnings when -pedantic option is used (strict ISO C)\ntypedef int make_iso_compilers_happy;\n"
  },
  {
    "path": "src/typec/pd_types.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_PD_TYPES_H_\n#define TUSB_PD_TYPES_H_\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stdbool.h>\n#include <stdint.h>\n#include \"common/tusb_compiler.h\"\n\n// Start of all packed definitions for compiler without per-type packed\nTU_ATTR_PACKED_BEGIN\nTU_ATTR_BIT_FIELD_ORDER_BEGIN\n\n//--------------------------------------------------------------------+\n// TYPE-C\n//--------------------------------------------------------------------+\n\ntypedef enum {\n  TUSB_TYPEC_PORT_SRC,\n  TUSB_TYPEC_PORT_SNK,\n  TUSB_TYPEC_PORT_DRP\n} tusb_typec_port_type_t;\n\nenum {\n  PD_CTRL_RESERVED = 0,            // 0b00000: 0\n  PD_CTRL_GOOD_CRC,                // 0b00001: 1\n  PD_CTRL_GO_TO_MIN,               // 0b00010: 2\n  PD_CTRL_ACCEPT,                  // 0b00011: 3\n  PD_CTRL_REJECT,                  // 0b00100: 4\n  PD_CTRL_PING,                    // 0b00101: 5\n  PD_CTRL_PS_READY,                // 0b00110: 6\n  PD_CTRL_GET_SOURCE_CAP,          // 0b00111: 7\n  PD_CTRL_GET_SINK_CAP,            // 0b01000: 8\n  PD_CTRL_DR_SWAP,                 // 0b01001: 9\n  PD_CTRL_PR_SWAP,                 // 0b01010: 10\n  PD_CTRL_VCONN_SWAP,              // 0b01011: 11\n  PD_CTRL_WAIT,                    // 0b01100: 12\n  PD_CTRL_SOFT_RESET,              // 0b01101: 13\n  PD_CTRL_DATA_RESET,              // 0b01110: 14\n  PD_CTRL_DATA_RESET_COMPLETE,     // 0b01111: 15\n  PD_CTRL_NOT_SUPPORTED,           // 0b10000: 16\n  PD_CTRL_GET_SOURCE_CAP_EXTENDED, // 0b10001: 17\n  PD_CTRL_GET_STATUS,              // 0b10010: 18\n  PD_CTRL_FR_SWAP,                 // 0b10011: 19\n  PD_CTRL_GET_PPS_STATUS,          // 0b10100: 20\n  PD_CTRL_GET_COUNTRY_CODES,       // 0b10101: 21\n  PD_CTRL_GET_SINK_CAP_EXTENDED,   // 0b10110: 22\n  PD_CTRL_GET_SOURCE_INFO,         // 0b10111: 23\n  PD_CTRL_REVISION,                // 0b11000: 24\n};\n\nenum {\n  PD_DATA_RESERVED = 0,     // 0b00000: 0\n  PD_DATA_SOURCE_CAP,       // 0b00001: 1\n  PD_DATA_REQUEST,          // 0b00010: 2\n  PD_DATA_BIST,             // 0b00011: 3\n  PD_DATA_SINK_CAP,         // 0b00100: 4\n  PD_DATA_BATTERY_STATUS,   // 0b00101: 5\n  PD_DATA_ALERT,            // 0b00110: 6\n  PD_DATA_GET_COUNTRY_INFO, // 0b00111: 7\n  PD_DATA_ENTER_USB,        // 0b01000: 8\n  PD_DATA_EPR_REQUEST,      // 0b01001: 9\n  PD_DATA_EPR_MODE,         // 0b01010: 10\n  PD_DATA_SRC_INFO,         // 0b01011: 11\n  PD_DATA_REVISION,         // 0b01100: 12\n  PD_DATA_RESERVED_13,      // 0b01101: 13\n  PD_DATA_RESERVED_14,      // 0b01110: 14\n  PD_DATA_VENDOR_DEFINED,   // 0b01111: 15\n};\n\nenum {\n  PD_REV_10\t= 0x0,\n  PD_REV_20\t= 0x1,\n  PD_REV_30\t= 0x2,\n};\n\nenum {\n  PD_DATA_ROLE_UFP\t= 0x0,\n  PD_DATA_ROLE_DFP\t= 0x1,\n};\n\nenum {\n  PD_POWER_ROLE_SINK\t= 0x0,\n  PD_POWER_ROLE_SOURCE\t= 0x1,\n};\n\ntypedef struct TU_ATTR_PACKED {\n  uint16_t msg_type   : 5; // [0:4]\n  uint16_t data_role  : 1; // [5] SOP only: 0 UFP, 1 DFP\n  uint16_t specs_rev  : 2; // [6:7]\n  uint16_t power_role : 1; // [8] SOP only: 0 Sink, 1 Source\n  uint16_t msg_id     : 3; // [9:11]\n  uint16_t n_data_obj : 3; // [12:14]\n  uint16_t extended   : 1; // [15]\n} pd_header_t;\nTU_VERIFY_STATIC(sizeof(pd_header_t) == 2, \"size is not correct\");\n\ntypedef struct TU_ATTR_PACKED {\n  uint16_t data_size     : 9; // [0:8]\n  uint16_t reserved      : 1; // [9]\n  uint16_t request_chunk : 1; // [10]\n  uint16_t chunk_number  : 4; // [11:14]\n  uint16_t chunked       : 1; // [15]\n} pd_header_extended_t;\nTU_VERIFY_STATIC(sizeof(pd_header_extended_t) == 2, \"size is not correct\");\n\n//--------------------------------------------------------------------+\n// Source Capability\n//--------------------------------------------------------------------+\n\n// All table references are from USBPD Specification rev3.1 version 1.8\nenum {\n  PD_PDO_TYPE_FIXED = 0, // Vmin = Vmax\n  PD_PDO_TYPE_BATTERY,\n  PD_PDO_TYPE_VARIABLE, // non-battery\n  PD_PDO_TYPE_APDO, // Augmented Power Data Object\n};\n\n// Fixed Power Data Object (PDO) table 6-9\ntypedef struct TU_ATTR_PACKED {\n  uint32_t current_max_10ma          : 10; // [9..0] Max current in 10mA unit\n  uint32_t voltage_50mv              : 10; // [19..10] Voltage in 50mV unit\n  uint32_t current_peak              :  2; // [21..20] Peak current\n  uint32_t reserved                  :  1; // [22] Reserved\n  uint32_t epr_mode_capable          :  1; // [23] epr_mode_capable\n  uint32_t unchunked_ext_msg_support :  1; // [24] UnChunked Extended Message Supported\n  uint32_t dual_role_data            :  1; // [25] Dual Role Data\n  uint32_t usb_comm_capable          :  1; // [26] USB Communications Capable\n  uint32_t unconstrained_power       :  1; // [27] Unconstrained Power\n  uint32_t usb_suspend_supported     :  1; // [28] USB Suspend Supported\n  uint32_t dual_role_power           :  1; // [29] Dual Role Power\n  uint32_t type                      :  2; // [30] Fixed Supply type = PD_PDO_TYPE_FIXED\n} pd_pdo_fixed_t;\nTU_VERIFY_STATIC(sizeof(pd_pdo_fixed_t) == 4, \"Invalid size\");\n\n// Battery Power Data Object (PDO) table 6-12\ntypedef struct TU_ATTR_PACKED {\n  uint32_t power_max_250mw   : 10; // [9..0] Max allowable power in 250mW unit\n  uint32_t voltage_min_50mv  : 10; // [19..10] Minimum voltage in 50mV unit\n  uint32_t voltage_max_50mv  : 10; // [29..20] Maximum voltage in 50mV unit\n  uint32_t type              :  2; // [31..30] Battery type = PD_PDO_TYPE_BATTERY\n} pd_pdo_battery_t;\nTU_VERIFY_STATIC(sizeof(pd_pdo_battery_t) == 4, \"Invalid size\");\n\n// Variable Power Data Object (PDO) table 6-11\ntypedef struct TU_ATTR_PACKED {\n  uint32_t current_max_10ma  : 10; // [9..0] Max current in 10mA unit\n  uint32_t voltage_min_50mv  : 10; // [19..10] Minimum voltage in 50mV unit\n  uint32_t voltage_max_50mv  : 10; // [29..20] Maximum voltage in 50mV unit\n  uint32_t type              :  2; // [31..30] Variable Supply type = PD_PDO_TYPE_VARIABLE\n} pd_pdo_variable_t;\nTU_VERIFY_STATIC(sizeof(pd_pdo_variable_t) == 4, \"Invalid size\");\n\n// Augmented Power Data Object (PDO) table 6-13\ntypedef struct TU_ATTR_PACKED {\n  uint32_t current_max_50ma  :  7; // [6..0] Max current in 50mA unit\n  uint32_t reserved1         :  1; // [7] Reserved\n  uint32_t voltage_min_100mv :  8; // [15..8] Minimum Voltage in 100mV unit\n  uint32_t reserved2         :  1; // [16] Reserved\n  uint32_t voltage_max_100mv :  8; // [24..17] Maximum Voltage in 100mV unit\n  uint32_t reserved3         :  2; // [26..25] Reserved\n  uint32_t pps_power_limited :  1; // [27] PPS Power Limited\n  uint32_t spr_programmable  :  2; // [29..28] SPR Programmable Power Supply\n  uint32_t type              :  2; // [31..30] Augmented Power Data Object = PD_PDO_TYPE_APDO\n} pd_pdo_apdo_t;\nTU_VERIFY_STATIC(sizeof(pd_pdo_apdo_t) == 4, \"Invalid size\");\n\n//--------------------------------------------------------------------+\n// Request\n//--------------------------------------------------------------------+\n\ntypedef struct TU_ATTR_PACKED {\n  uint32_t current_extremum_10ma     : 10; // [9..0] Max (give back = 0) or Min (give back = 1) current in 10mA unit\n  uint32_t current_operate_10ma      : 10; // [19..10] Operating current in 10mA unit\n  uint32_t reserved                  :  2; // [21..20] Reserved\n  uint32_t epr_mode_capable          :  1; // [22] EPR mode capable\n  uint32_t unchunked_ext_msg_support :  1; // [23] UnChunked Extended Message Supported\n  uint32_t no_usb_suspend            :  1; // [24] No USB Suspend\n  uint32_t usb_comm_capable          :  1; // [25] USB Communications Capable\n  uint32_t capability_mismatch       :  1; // [26] Capability Mismatch\n  uint32_t give_back_flag            :  1; // [27] GiveBack Flag: 0 = Max, 1 = Min\n  uint32_t object_position           :  4; // [31..28] Object Position\n} pd_rdo_fixed_variable_t;\nTU_VERIFY_STATIC(sizeof(pd_rdo_fixed_variable_t) == 4, \"Invalid size\");\n\ntypedef struct TU_ATTR_PACKED {\n  uint32_t power_extremum_250mw      : 10; // [9..0] Max (give back = 0) or Min (give back = 1) operating power in 250mW unit\n  uint32_t power_operate_250mw       : 10; // [19..10] Operating power in 250mW unit\n  uint32_t reserved                  :  2; // [21..20] Reserved\n  uint32_t epr_mode_capable          :  1; // [22] EPR mode capable\n  uint32_t unchunked_ext_msg_support :  1; // [23] UnChunked Extended Message Supported\n  uint32_t no_usb_suspend            :  1; // [24] No USB Suspend\n  uint32_t usb_comm_capable          :  1; // [25] USB Communications Capable\n  uint32_t capability_mismatch       :  1; // [26] Capability Mismatch\n  uint32_t give_back_flag            :  1; // [27] GiveBack Flag: 0 = Max, 1 = Min\n  uint32_t object_position           :  4; // [31..28] Object Position\n} pd_rdo_battery_t;\nTU_VERIFY_STATIC(sizeof(pd_rdo_battery_t) == 4, \"Invalid size\");\n\n\nTU_ATTR_PACKED_END  // End of all packed definitions\nTU_ATTR_BIT_FIELD_ORDER_END\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/typec/tcd.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (thach@tinyusb.org) for Adafruit Industries\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_TCD_H_\n#define TUSB_TCD_H_\n\n#include \"common/tusb_common.h\"\n#include \"pd_types.h\"\n\n#include \"osal/osal.h\"\n#include \"common/tusb_fifo.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nenum {\n  TCD_EVENT_INVALID = 0,\n  TCD_EVENT_CC_CHANGED,\n  TCD_EVENT_RX_COMPLETE,\n  TCD_EVENT_TX_COMPLETE,\n};\n\ntypedef struct TU_ATTR_PACKED {\n  uint8_t rhport;\n  uint8_t event_id;\n\n  union {\n    struct {\n      uint8_t cc_state[2];\n    } cc_changed;\n\n    struct TU_ATTR_PACKED {\n      uint16_t result : 2;\n      uint16_t xferred_bytes : 14;\n    } xfer_complete;\n  };\n\n} tcd_event_t;\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n// Initialize controller\nbool tcd_init(uint8_t rhport, uint32_t port_type);\n\n// Enable interrupt\nvoid tcd_int_enable (uint8_t rhport);\n\n// Disable interrupt\nvoid tcd_int_disable(uint8_t rhport);\n\n// Interrupt Handler\nvoid tcd_int_handler(uint8_t rhport);\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nbool tcd_msg_receive(uint8_t rhport, uint8_t* buffer, uint16_t total_bytes);\nbool tcd_msg_send(uint8_t rhport, uint8_t const* buffer, uint16_t total_bytes);\n\n//--------------------------------------------------------------------+\n// Event API (implemented by stack)\n// Called by TCD to notify stack\n//--------------------------------------------------------------------+\n\nextern void tcd_event_handler(tcd_event_t const * event, bool in_isr);\n\nTU_ATTR_ALWAYS_INLINE static inline\nvoid tcd_event_cc_changed(uint8_t rhport, uint8_t cc1, uint8_t cc2, bool in_isr) {\n  tcd_event_t event = {\n    .rhport   = rhport,\n    .event_id = TCD_EVENT_CC_CHANGED,\n    .cc_changed = {\n        .cc_state = {cc1, cc2 }\n    }\n  };\n\n  tcd_event_handler(&event, in_isr);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline\nvoid tcd_event_rx_complete(uint8_t rhport, uint16_t xferred_bytes, uint8_t result, bool in_isr) {\n  tcd_event_t event = {\n    .rhport   = rhport,\n    .event_id = TCD_EVENT_RX_COMPLETE,\n    .xfer_complete = {\n        .xferred_bytes = xferred_bytes,\n        .result        = result\n    }\n  };\n\n  tcd_event_handler(&event, in_isr);\n}\n\nTU_ATTR_ALWAYS_INLINE static inline\nvoid tcd_event_tx_complete(uint8_t rhport, uint16_t xferred_bytes, uint8_t result, bool in_isr) {\n  tcd_event_t event = {\n      .rhport   = rhport,\n      .event_id = TCD_EVENT_TX_COMPLETE,\n      .xfer_complete = {\n          .xferred_bytes = xferred_bytes,\n          .result        = result\n      }\n  };\n\n  tcd_event_handler(&event, in_isr);\n}\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/typec/usbc.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (thach@tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include \"tusb_option.h\"\n\n#if CFG_TUC_ENABLED\n\n#include \"tcd.h\"\n#include \"usbc.h\"\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\n// Debug level of USBD\n#define USBC_DEBUG   2\n#define TU_LOG_USBC(...)   TU_LOG(USBC_DEBUG, __VA_ARGS__)\n\n// Event queue\n// usbc_int_set() is used as mutex in OS NONE config\nvoid usbc_int_set(bool enabled);\nOSAL_QUEUE_DEF(usbc_int_set, _usbc_qdef, CFG_TUC_TASK_QUEUE_SZ, tcd_event_t);\ntu_static osal_queue_t _usbc_q;\n\n// if stack is initialized\nstatic bool _usbc_inited = false;\n\n// if port is initialized\nstatic bool _port_inited[TUP_TYPEC_RHPORTS_NUM];\n\n// Max possible PD size is 262 bytes\nstatic uint8_t _rx_buf[64] TU_ATTR_ALIGNED(4);\nstatic uint8_t _tx_buf[64] TU_ATTR_ALIGNED(4);\n\nbool usbc_msg_send(uint8_t rhport, pd_header_t const* header, void const* data);\nbool parse_msg_data(uint8_t rhport, pd_header_t const* header, uint8_t const* dobj, uint8_t const* p_end);\nbool parse_msg_control(uint8_t rhport, pd_header_t const* header);\n\n//--------------------------------------------------------------------+\n// Weak stubs: invoked if no strong implementation is available\n//--------------------------------------------------------------------+\nTU_ATTR_WEAK bool tuc_pd_data_received_cb(uint8_t rhport, pd_header_t const* header, uint8_t const* dobj, uint8_t const* p_end) {\n  (void) rhport;\n  (void) header;\n  (void) dobj;\n  (void) p_end;\n  return false;\n}\n\nTU_ATTR_WEAK bool tuc_pd_control_received_cb(uint8_t rhport, pd_header_t const* header) {\n  (void) rhport;\n  (void) header;\n  return false;\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nbool tuc_inited(uint8_t rhport) {\n  return _usbc_inited && _port_inited[rhport];\n}\n\nbool tuc_init(uint8_t rhport, uint32_t port_type) {\n  // Initialize stack\n  if (!_usbc_inited) {\n    tu_memclr(_port_inited, sizeof(_port_inited));\n\n    _usbc_q = osal_queue_create(&_usbc_qdef);\n    TU_ASSERT(_usbc_q != NULL);\n\n    _usbc_inited = true;\n  }\n\n  // skip if port already initialized\n  if ( _port_inited[rhport] ) {\n    return true;\n  }\n\n  TU_LOG_USBC(\"USBC init on port %u\\r\\n\", rhport);\n  TU_LOG_INT(USBC_DEBUG, sizeof(tcd_event_t));\n\n  TU_ASSERT(tcd_init(rhport, port_type));\n  tcd_int_enable(rhport);\n\n  _port_inited[rhport] = true;\n  return true;\n}\n\nvoid tuc_task_ext(uint32_t timeout_ms, bool in_isr) {\n  (void) in_isr; // not implemented yet\n\n  // Skip if stack is not initialized\n  if (!_usbc_inited) return;\n\n  // Loop until there is no more events in the queue\n  while (1) {\n    tcd_event_t event;\n    if (!osal_queue_receive(_usbc_q, &event, timeout_ms)) return;\n\n    switch (event.event_id) {\n      case TCD_EVENT_CC_CHANGED:\n        break;\n\n      case TCD_EVENT_RX_COMPLETE:\n        // TODO process message here in ISR, move to thread later\n        if (event.xfer_complete.result == XFER_RESULT_SUCCESS) {\n          pd_header_t const* header = (pd_header_t const*) _rx_buf;\n\n          if (header->n_data_obj == 0) {\n            parse_msg_control(event.rhport, header);\n\n          }else {\n            uint8_t const* p_end = _rx_buf + event.xfer_complete.xferred_bytes;\n            uint8_t const * dobj = _rx_buf + sizeof(pd_header_t);\n\n            parse_msg_data(event.rhport, header, dobj, p_end);\n          }\n        }\n\n        // prepare for next message\n        tcd_msg_receive(event.rhport, _rx_buf, sizeof(_rx_buf));\n        break;\n\n      case TCD_EVENT_TX_COMPLETE:\n        break;\n\n      default: break;\n    }\n  }\n}\n\nbool parse_msg_data(uint8_t rhport, pd_header_t const* header, uint8_t const* dobj, uint8_t const* p_end) {\n  tuc_pd_data_received_cb(rhport, header, dobj, p_end);\n\n  return true;\n}\n\nbool parse_msg_control(uint8_t rhport, pd_header_t const* header) {\n  tuc_pd_control_received_cb(rhport, header);\n\n  return true;\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nbool usbc_msg_send(uint8_t rhport, pd_header_t const* header, void const* data) {\n  // copy header\n  memcpy(_tx_buf, header, sizeof(pd_header_t));\n\n  // copy data objcet if available\n  uint16_t const n_data_obj = header->n_data_obj;\n  if (n_data_obj > 0) {\n    memcpy(_tx_buf + sizeof(pd_header_t), data, n_data_obj * 4);\n  }\n\n  return tcd_msg_send(rhport, _tx_buf, sizeof(pd_header_t) + n_data_obj * 4);\n}\n\nbool tuc_msg_request(uint8_t rhport, void const* rdo) {\n  pd_header_t const header = {\n      .msg_type = PD_DATA_REQUEST,\n      .data_role = PD_DATA_ROLE_UFP,\n      .specs_rev = PD_REV_30,\n      .power_role = PD_POWER_ROLE_SINK,\n      .msg_id = 0,\n      .n_data_obj = 1,\n      .extended = 0,\n  };\n\n  return usbc_msg_send(rhport, &header, rdo);\n}\n\nvoid tcd_event_handler(tcd_event_t const * event, bool in_isr) {\n  (void) in_isr;\n  switch(event->event_id) {\n    case TCD_EVENT_CC_CHANGED:\n      if (event->cc_changed.cc_state[0] || event->cc_changed.cc_state[1]) {\n        // Attach, start receiving\n        tcd_msg_receive(event->rhport, _rx_buf, sizeof(_rx_buf));\n      }else {\n        // Detach\n      }\n      break;\n\n    default: break;\n  }\n\n  osal_queue_send(_usbc_q, event, in_isr);\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nvoid usbc_int_set(bool enabled) {\n  // Disable all controllers since they shared the same event queue\n  for (uint8_t p = 0; p < TUP_TYPEC_RHPORTS_NUM; p++) {\n    if ( _port_inited[p] ) {\n      if (enabled) {\n        tcd_int_enable(p);\n      }else {\n        tcd_int_disable(p);\n      }\n    }\n  }\n}\n\n#endif\n"
  },
  {
    "path": "src/typec/usbc.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#ifndef TUSB_UTCD_H_\n#define TUSB_UTCD_H_\n\n#include \"common/tusb_common.h\"\n#include \"pd_types.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// TypeC Configuration\n//--------------------------------------------------------------------+\n\n#ifndef CFG_TUC_TASK_QUEUE_SZ\n#define CFG_TUC_TASK_QUEUE_SZ   8\n#endif\n\n//--------------------------------------------------------------------+\n// Application API\n//--------------------------------------------------------------------+\n\n// Init typec stack on a port\nbool tuc_init(uint8_t rhport, uint32_t port_type);\n\n// Check if typec port is initialized\nbool tuc_inited(uint8_t rhport);\n\n// Task function should be called in main/rtos loop, extended version of tud_task()\n// - timeout_ms: millisecond to wait, zero = no wait, 0xFFFFFFFF = wait forever\n// - in_isr: if function is called in ISR\nvoid tuc_task_ext(uint32_t timeout_ms, bool in_isr);\n\n// Task function should be called in main/rtos loop\nTU_ATTR_ALWAYS_INLINE static inline\nvoid tuc_task (void) {\n  tuc_task_ext(UINT32_MAX, false);\n}\n\n#ifndef TUSB_TCD_H_\nextern void tcd_int_handler(uint8_t rhport);\n#endif\n\n// Interrupt handler, name alias to TCD\n#define tuc_int_handler tcd_int_handler\n\n//--------------------------------------------------------------------+\n// Callbacks\n//--------------------------------------------------------------------+\n\nbool tuc_pd_data_received_cb(uint8_t rhport, pd_header_t const* header, uint8_t const* dobj, uint8_t const* p_end);\nbool tuc_pd_control_received_cb(uint8_t rhport, pd_header_t const* header);\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\n\nbool tuc_msg_request(uint8_t rhport, void const* rdo);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "test/fuzz/dcd_fuzz.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n#include \"device/dcd.h\"\n#include \"fuzz/fuzz_private.h\"\n#include <assert.h>\n#include <cstdint>\n#include <limits>\n\n#define UNUSED(x) (void)(x)\n\n//--------------------------------------------------------------------+\n// State tracker\n//--------------------------------------------------------------------+\nstruct State {\n  bool interrupts_enabled;\n  bool sof_enabled;\n  uint8_t address;\n};\n\ntu_static State state = {false, 0, 0};\n\n//--------------------------------------------------------------------+\n// Controller API\n// All no-ops as we are fuzzing.\n//--------------------------------------------------------------------+\nextern \"C\" {\nbool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {\n  UNUSED(rhport);\n  UNUSED(rh_init);\n  return true;\n}\n\nvoid dcd_int_handler(uint8_t rhport) {\n  assert(_fuzz_data_provider.has_value());\n\n  if (!state.interrupts_enabled) {\n    return;\n  }\n\n  // Choose if we want to generate a signal based on the fuzzed data.\n  if (_fuzz_data_provider->ConsumeBool()) {\n    dcd_event_bus_signal(\n        rhport,\n        // Choose a random event based on the fuzz data.\n        (dcd_eventid_t)_fuzz_data_provider->ConsumeIntegralInRange<uint8_t>(\n            DCD_EVENT_INVALID + 1, DCD_EVENT_COUNT - 1),\n        // Identify trigger as either an interrupt or a syncrhonous call\n        // depending on fuzz data.\n        _fuzz_data_provider->ConsumeBool());\n  }\n\n  if (_fuzz_data_provider->ConsumeBool()) {\n    constexpr size_t kSetupFrameLength = 8;\n    std::vector<uint8_t> setup =\n        _fuzz_data_provider->ConsumeBytes<uint8_t>(kSetupFrameLength);\n    // Fuzz consumer may return less than requested. If this is the case\n    // we want to make sure that at least that length is allocated and available\n    // to the signal handler.\n    if (setup.size() != kSetupFrameLength) {\n      setup.resize(kSetupFrameLength);\n    }\n    dcd_event_setup_received(rhport, setup.data(),\n                             // Identify trigger as either an interrupt or a\n                             // syncrhonous call depending on fuzz data.\n                             _fuzz_data_provider->ConsumeBool());\n  }\n}\n\nvoid dcd_int_enable(uint8_t rhport) {\n  state.interrupts_enabled = true;\n  UNUSED(rhport);\n  return;\n}\n\nvoid dcd_int_disable(uint8_t rhport) {\n  state.interrupts_enabled = false;\n  UNUSED(rhport);\n  return;\n}\n\nvoid dcd_set_address(uint8_t rhport, uint8_t dev_addr) {\n  UNUSED(rhport);\n  state.address = dev_addr;\n  // Respond with status.\n  dcd_edpt_xfer(rhport, tu_edpt_addr(0, TUSB_DIR_IN), NULL, 0, false);\n  return;\n}\n\nvoid dcd_remote_wakeup(uint8_t rhport) {\n  UNUSED(rhport);\n  return;\n}\n\nvoid dcd_connect(uint8_t rhport) {\n  UNUSED(rhport);\n  return;\n}\n\nvoid dcd_disconnect(uint8_t rhport) {\n  UNUSED(rhport);\n  return;\n}\n\nvoid dcd_sof_enable(uint8_t rhport, bool en) {\n  state.sof_enabled = en;\n  UNUSED(rhport);\n  return;\n}\n\n//--------------------------------------------------------------------+\n// Endpoint API\n//--------------------------------------------------------------------+\n\n// Configure endpoint's registers according to descriptor\nbool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const *desc_ep) {\n  UNUSED(rhport);\n  UNUSED(desc_ep);\n  return _fuzz_data_provider->ConsumeBool();\n}\n\n// Close all non-control endpoints, cancel all pending transfers if any.\n// Invoked when switching from a non-zero Configuration by SET_CONFIGURE\n// therefore required for multiple configuration support.\nvoid dcd_edpt_close_all(uint8_t rhport) {\n  UNUSED(rhport);\n  return;\n}\n\n// Close an endpoint.\n// Since it is weak, caller must TU_ASSERT this function's existence before\n// calling it.\nvoid dcd_edpt_close(uint8_t rhport, uint8_t ep_addr) {\n  UNUSED(rhport);\n  UNUSED(ep_addr);\n  return;\n}\n\n// Submit a transfer, When complete dcd_event_xfer_complete() is invoked to\n// notify the stack\nbool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t *buffer,\n                   uint16_t total_bytes, bool is_isr) {\n  UNUSED(rhport);\n  UNUSED(buffer);\n  UNUSED(total_bytes);\n  UNUSED(is_isr);\n\n  uint8_t const dir = tu_edpt_dir(ep_addr);\n\n  if (dir == TUSB_DIR_IN) {\n    std::vector<uint8_t> temp =\n        _fuzz_data_provider->ConsumeBytes<uint8_t>(total_bytes);\n    std::copy(temp.begin(), temp.end(), buffer);\n  }\n  // Ignore output data as it's not useful for fuzzing without a more\n  // complex fuzzed backend. But we need to make sure it's not\n  // optimised out.\n  volatile uint8_t *dont_optimise0 = buffer;\n  volatile uint16_t dont_optimise1 = total_bytes;\n  UNUSED(dont_optimise0);\n  UNUSED(dont_optimise1);\n\n\n  return _fuzz_data_provider->ConsumeBool();\n}\n\n/* TODO: implement a fuzzed version of this.\nbool dcd_edpt_xfer_fifo(uint8_t rhport, uint8_t ep_addr, tu_fifo_t *ff,\n                        uint16_t total_bytes) {}\n*/\n\n// Stall endpoint, any queuing transfer should be removed from endpoint\nvoid dcd_edpt_stall(uint8_t rhport, uint8_t ep_addr) {\n\n  UNUSED(rhport);\n  UNUSED(ep_addr);\n  return;\n}\n\n// clear stall, data toggle is also reset to DATA0\n// This API never calls with control endpoints, since it is auto cleared when\n// receiving setup packet\nvoid dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr) {\n\n  UNUSED(rhport);\n  UNUSED(ep_addr);\n  return;\n}\n}\n"
  },
  {
    "path": "test/fuzz/device/cdc/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.5)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(cdc)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c\n  ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n  )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n  ${CMAKE_CURRENT_SOURCE_DIR}/src\n  )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "test/fuzz/device/cdc/Makefile",
    "content": "include ../../make.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(wildcard src/*.c))\nSRC_CXX += $(addprefix $(EXAMPLE_PATH)/, $(wildcard src/*.cc))\n\ninclude ../../rules.mk\n"
  },
  {
    "path": "test/fuzz/device/cdc/src/fuzz.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <cassert>\n#include <fuzzer/FuzzedDataProvider.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"class/cdc/cdc_device.h\"\n#include \"fuzz/fuzz.h\"\n#include \"tusb.h\"\n#include <cstdint>\n#include <string>\n#include <vector>\n\nextern \"C\" {\n\n#define FUZZ_ITERATIONS 500\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\nvoid cdc_task(FuzzedDataProvider *provider);\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {\n  FuzzedDataProvider provider(Data, Size);\n  std::vector<uint8_t> callback_data = provider.ConsumeBytes<uint8_t>(\n      provider.ConsumeIntegralInRange<size_t>(0, Size));\n  fuzz_init(callback_data.data(), callback_data.size());\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  for (int i = 0; i < FUZZ_ITERATIONS; i++) {\n    if (provider.remaining_bytes() == 0) {\n      return 0;\n    }\n    tud_int_handler(provider.ConsumeIntegral<uint8_t>());\n    tud_task(); // tinyusb device task\n    cdc_task(&provider);\n  }\n\n  return 0;\n}\n\n//--------------------------------------------------------------------+\n// USB CDC\n//--------------------------------------------------------------------+\nenum CdcApiFuncs {\n  kCdcNConnected,\n  kCdcNGetLineState,\n  kCdcNGetLineCoding,\n  kCdcNSetWantedChar,\n  kCdcNAvailable,\n  kCdcNRead,\n  kCdcNReadChar,\n  kCdcNReadFlush,\n  kCdcNPeek,\n  kCdcNWrite,\n  kCdcNWriteChar,\n  kCdcNWriteStr,\n  kCdcNWriteFlush,\n  kCdcNWriteAvailable,\n  kCdcNWriteClear,\n  // We don't need to fuzz tud_cdc_<not n>* as they are just wrappers\n  // calling with n==0.\n  kMaxValue,\n};\n\nvoid cdc_task(FuzzedDataProvider *provider) {\n\n  assert(provider != NULL);\n  const int kMaxBufferSize = 4096;\n  switch (provider->ConsumeEnum<CdcApiFuncs>()) {\n  case kCdcNConnected:\n    // TODO: Fuzz interface number\n    (void)tud_cdc_n_connected(0);\n    break;\n  case kCdcNGetLineState:\n    // TODO: Fuzz interface number\n    (void)tud_cdc_n_get_line_state(0);\n    break;\n  case kCdcNGetLineCoding: {\n    cdc_line_coding_t coding;\n    // TODO: Fuzz interface number\n    (void)tud_cdc_n_get_line_coding(0, &coding);\n  } break;\n  case kCdcNSetWantedChar:\n    // TODO: Fuzz interface number\n    (void)tud_cdc_n_set_wanted_char(0, provider->ConsumeIntegral<char>());\n    break;\n  case kCdcNAvailable:\n    // TODO: Fuzz interface number\n    (void)tud_cdc_n_available(0);\n    break;\n  case kCdcNRead: {\n    std::vector<uint8_t> buffer;\n    buffer.resize(provider->ConsumeIntegralInRange<size_t>(0, kMaxBufferSize));\n    // TODO: Fuzz interface number\n    (void)tud_cdc_n_read(0, buffer.data(), buffer.size());\n    break;\n  }\n  case kCdcNReadChar:\n    // TODO: Fuzz interface number\n    tud_cdc_n_read_char(0);\n    break;\n  case kCdcNReadFlush:\n    // TODO: Fuzz interface number\n    tud_cdc_n_read_flush(0);\n    break;\n  case kCdcNPeek: {\n    uint8_t peak = 0;\n    tud_cdc_n_peek(0, &peak);\n    break;\n  }\n  case kCdcNWrite: {\n    std::vector<uint8_t> buffer = provider->ConsumeBytes<uint8_t>(\n        provider->ConsumeIntegralInRange<size_t>(0, kMaxBufferSize));\n\n    // TODO: Fuzz interface number\n    (void)tud_cdc_n_write(0, buffer.data(), buffer.size());\n  } break;\n\ncase kCdcNWriteChar:\n  // TODO: Fuzz interface number\n  (void)tud_cdc_n_write_char(0, provider->ConsumeIntegral<char>());\n  break;\ncase kCdcNWriteStr: {\n  std::string str = provider->ConsumeRandomLengthString(kMaxBufferSize);\n  // TODO: Fuzz interface number\n  (void)tud_cdc_n_write_str(0, str.c_str());\n  break;\n}\ncase kCdcNWriteFlush:\n  // TODO: Fuzz interface number\n  (void)tud_cdc_n_write_flush(0);\n  break;\ncase kCdcNWriteAvailable:\n  // TODO: Fuzz interface number\n  (void)tud_cdc_n_write_available(0);\n  break;\ncase kCdcNWriteClear:\n  // TODO: Fuzz interface number\n  (void)tud_cdc_n_write_clear(0);\n  break;\ncase kMaxValue:\n  // Noop.\n  break;\n}\n}\n}\n"
  },
  {
    "path": "test/fuzz/device/cdc/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN    __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC              1\n#define CFG_TUD_MSC              0\n#define CFG_TUD_HID              0\n#define CFG_TUD_MIDI             0\n#define CFG_TUD_VENDOR           0\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// MSC Buffer size of Device Mass storage\n#define CFG_TUD_MSC_EP_BUFSIZE   512\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "test/fuzz/device/cdc/src/usb_descriptors.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save\n * device driver after the first plug.\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | CDC          [LSB]\n */\n#define PID_MAP(itf, n) ((CFG_TUD_##itf) << (n))\n#define USB_PID                                                                \\\n  (0x4000 | PID_MAP(CDC, 0) | PID_MAP(HID, 2) | PID_MAP(MIDI, 3) |          \\\n   PID_MAP(VENDOR, 4))\n\n#define USB_VID 0xCafe\n#define USB_BCD 0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  static tusb_desc_device_t const desc_device = {\n      .bLength = sizeof(tusb_desc_device_t),\n      .bDescriptorType = TUSB_DESC_DEVICE,\n      .bcdUSB = USB_BCD,\n\n      // Use Interface Association Descriptor (IAD) for CDC\n      // As required by USB Specs IAD's subclass must be common class (2) and\n      // protocol must be IAD (1)\n      .bDeviceClass = TUSB_CLASS_MISC,\n      .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n      .bDeviceProtocol = MISC_PROTOCOL_IAD,\n\n      .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n\n      .idVendor = USB_VID,\n      .idProduct = USB_PID,\n      .bcdDevice = 0x0100,\n\n      .iManufacturer = 0x01,\n      .iProduct = 0x02,\n      .iSerialNumber = 0x03,\n\n      .bNumConfigurations = 0x01};\n\n  return (uint8_t const *)&desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum { ITF_NUM_CDC = 0, ITF_NUM_CDC_DATA, ITF_NUM_TOTAL };\n\n#define EPNUM_CDC_NOTIF 0x81\n#define EPNUM_CDC_OUT 0x02\n#define EPNUM_CDC_IN 0x82\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN)\n\n// full speed configuration\nuint8_t const desc_fs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute,\n    // power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP notification address and size, EP data\n    // address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT,\n                       EPNUM_CDC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and\n// other_speed_configuration\n\n// high speed configuration\nuint8_t const desc_hs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute,\n    // power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP notification address and size, EP data\n    // address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT,\n                       EPNUM_CDC_IN, 512),\n};\n\n// other speed configuration\nuint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change\n// configuration based on speed\ntusb_desc_device_qualifier_t const desc_device_qualifier = {\n    .bLength = sizeof(tusb_desc_device_qualifier_t),\n    .bDescriptorType = TUSB_DESC_DEVICE_QUALIFIER,\n    .bcdUSB = USB_BCD,\n\n    .bDeviceClass = TUSB_CLASS_MISC,\n    .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n    .bNumConfigurations = 0x01,\n    .bReserved = 0x00};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete. device_qualifier descriptor describes\n// information about a high-speed capable device that would change if the device\n// were operating at the other speed. If not highspeed capable stall this\n// request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *)&desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete Configuration descriptor in the other speed\n// e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void)index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration\n                                              : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void)index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration\n                                              : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// array of pointer to string descriptors\nchar const *string_desc_arr[] = {\n    (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409)\n    \"TinyUSB\",                  // 1: Manufacturer\n    \"TinyUSB Device\",           // 2: Product\n    \"123456789012\",             // 3: Serials, should use chip ID\n    \"TinyUSB CDC\",              // 4: CDC Interface\n};\n\nstatic uint16_t _desc_str[32];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void)langid;\n\n  uint8_t chr_count;\n\n  if (index == 0) {\n    memcpy(&_desc_str[1], string_desc_arr[0], 2);\n    chr_count = 1;\n  } else {\n    // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n    // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n    if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])))\n      return NULL;\n\n    const char *str = string_desc_arr[index];\n\n    // Cap at max char\n    chr_count = (uint8_t)strlen(str);\n    if (chr_count > 31)\n      chr_count = 31;\n\n    // Convert ASCII string into UTF-16\n    for (uint8_t i = 0; i < chr_count; i++) {\n      _desc_str[1 + i] = str[i];\n    }\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "test/fuzz/device/msc/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.5)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(msc)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "test/fuzz/device/msc/Makefile",
    "content": "include ../../make.mk\n\nINC += \\\n\tsrc \\\n\n\n# Example source\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(wildcard src/*.c))\nSRC_CXX += $(addprefix $(EXAMPLE_PATH)/, $(wildcard src/*.cc))\n\ninclude ../../rules.mk\n"
  },
  {
    "path": "test/fuzz/device/msc/src/fuzz.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <cassert>\n#include <fuzzer/FuzzedDataProvider.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"class/cdc/cdc_device.h\"\n#include \"fuzz/fuzz.h\"\n#include \"tusb.h\"\n#include <cstdint>\n#include <string>\n#include <vector>\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n#define FUZZ_ITERATIONS 500\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {\n  FuzzedDataProvider provider(Data, Size);\n  std::vector<uint8_t> callback_data = provider.ConsumeBytes<uint8_t>(\n      provider.ConsumeIntegralInRange<size_t>(0, Size));\n  fuzz_init(callback_data.data(), callback_data.size());\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  for (int i = 0; i < FUZZ_ITERATIONS; i++) {\n    if (provider.remaining_bytes() == 0) {\n      return 0;\n    }\n    tud_int_handler(provider.ConsumeIntegral<uint8_t>());\n    tud_task(); // tinyusb device task\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "test/fuzz/device/msc/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN    __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC              0\n#define CFG_TUD_MSC              1\n#define CFG_TUD_HID              0\n#define CFG_TUD_MIDI             0\n#define CFG_TUD_VENDOR           0\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// MSC Buffer size of Device Mass storage\n#define CFG_TUD_MSC_EP_BUFSIZE   512\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "test/fuzz/device/msc/src/usb_descriptors.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save\n * device driver after the first plug.\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | MSC | CDC          [LSB]\n */\n#define PID_MAP(itf, n) ((CFG_TUD_##itf) << (n))\n#define USB_PID                                                                \\\n  (0x4000 | PID_MAP(MSC, 0) | PID_MAP(HID, 1) | PID_MAP(MIDI, 2) |          \\\n   PID_MAP(VENDOR, 3))\n#define USB_VID 0xCafe\n#define USB_BCD 0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  tu_static tusb_desc_device_t const desc_device = {\n      .bLength = sizeof(tusb_desc_device_t),\n      .bDescriptorType = TUSB_DESC_DEVICE,\n      .bcdUSB = USB_BCD,\n\n      // Use Interface Association Descriptor (IAD) for CDC\n      // As required by USB Specs IAD's subclass must be common class (2) and\n      // protocol must be IAD (1)\n      .bDeviceClass = TUSB_CLASS_MISC,\n      .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n      .bDeviceProtocol = MISC_PROTOCOL_IAD,\n\n      .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n\n      .idVendor = USB_VID,\n      .idProduct = USB_PID,\n      .bcdDevice = 0x0100,\n\n      .iManufacturer = 0x01,\n      .iProduct = 0x02,\n      .iSerialNumber = 0x03,\n\n      .bNumConfigurations = 0x01};\n\n  return (uint8_t const *)&desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum { ITF_NUM_MSC = 0, ITF_NUM_TOTAL };\n\n#define EPNUM_MSC_OUT 0x05\n#define EPNUM_MSC_IN 0x85\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_MSC_DESC_LEN)\n\n// full speed configuration\nuint8_t const desc_fs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute,\n    // power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 4, EPNUM_MSC_OUT, EPNUM_MSC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and\n// other_speed_configuration\n\n// high speed configuration\nuint8_t const desc_hs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute,\n    // power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP Out & EP In address, EP size\n    TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 4, EPNUM_MSC_OUT, EPNUM_MSC_IN, 512),\n};\n\n// other speed configuration\nuint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change\n// configuration based on speed\ntusb_desc_device_qualifier_t const desc_device_qualifier = {\n    .bLength = sizeof(tusb_desc_device_qualifier_t),\n    .bDescriptorType = TUSB_DESC_DEVICE_QUALIFIER,\n    .bcdUSB = USB_BCD,\n\n    .bDeviceClass = TUSB_CLASS_MISC,\n    .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n    .bNumConfigurations = 0x01,\n    .bReserved = 0x00};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete. device_qualifier descriptor describes\n// information about a high-speed capable device that would change if the device\n// were operating at the other speed. If not highspeed capable stall this\n// request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *)&desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete Configuration descriptor in the other speed\n// e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void)index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration\n                                              : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void)index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration\n                                              : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// array of pointer to string descriptors\nchar const *string_desc_arr[] = {\n    (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409)\n    \"TinyUSB\",                  // 1: Manufacturer\n    \"TinyUSB Device\",           // 2: Product\n    \"123456789012\",             // 3: Serials, should use chip ID\n    \"TinyUSB MSC\",              // 4: MSC Interface\n\n};\n\ntu_static uint16_t _desc_str[32];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void)langid;\n\n  uint8_t chr_count;\n\n  if (index == 0) {\n    memcpy(&_desc_str[1], string_desc_arr[0], 2);\n    chr_count = 1;\n  } else {\n    // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n    // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n    if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])))\n      return NULL;\n\n    const char *str = string_desc_arr[index];\n\n    // Cap at max char\n    chr_count = (uint8_t)strlen(str);\n    if (chr_count > 31)\n      chr_count = 31;\n\n    // Convert ASCII string into UTF-16\n    for (uint8_t i = 0; i < chr_count; i++) {\n      _desc_str[1 + i] = str[i];\n    }\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "test/fuzz/device/net/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.5)\n\ninclude(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake)\n\nproject(net)\n\n# Checks this example is valid for the family and initializes the project\nfamily_initialize_project(${PROJECT_NAME} ${CMAKE_CURRENT_LIST_DIR})\n\nadd_executable(${PROJECT_NAME})\n\n# Example source\ntarget_sources(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/msc_disk.c\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c\n        )\n\n# Example include\ntarget_include_directories(${PROJECT_NAME} PUBLIC\n        ${CMAKE_CURRENT_SOURCE_DIR}/src\n        )\n\n# Configure compilation flags and libraries for the example without RTOS.\n# See the corresponding function in hw/bsp/FAMILY/family.cmake for details.\nfamily_configure_device_example(${PROJECT_NAME} noos)\n"
  },
  {
    "path": "test/fuzz/device/net/Makefile",
    "content": "include ../../make.mk\n\n# suppress warning caused by lwip\nCFLAGS += \\\n  -Wno-error=null-dereference \\\n  -Wno-error=unused-parameter \\\n  -Wno-error=unused-variable\n\nINC += \\\n  src \\\n  $(TOP)/lib/lwip/src/include \\\n  $(TOP)/lib/lwip/src/include/ipv4 \\\n  $(TOP)/lib/lwip/src/include/lwip/apps \\\n  $(TOP)/lib/networking\n\n# Example source\nSRC_C += $(addprefix $(EXAMPLE_PATH)/, $(wildcard src/*.c))\nSRC_CXX += $(addprefix $(EXAMPLE_PATH)/, $(wildcard src/*.cc))\n\n# lwip sources\nSRC_C += \\\n  lib/lwip/src/core/altcp.c \\\n  lib/lwip/src/core/altcp_alloc.c \\\n  lib/lwip/src/core/altcp_tcp.c \\\n  lib/lwip/src/core/def.c \\\n  lib/lwip/src/core/dns.c \\\n  lib/lwip/src/core/inet_chksum.c \\\n  lib/lwip/src/core/init.c \\\n  lib/lwip/src/core/ip.c \\\n  lib/lwip/src/core/mem.c \\\n  lib/lwip/src/core/memp.c \\\n  lib/lwip/src/core/netif.c \\\n  lib/lwip/src/core/pbuf.c \\\n  lib/lwip/src/core/raw.c \\\n  lib/lwip/src/core/stats.c \\\n  lib/lwip/src/core/sys.c \\\n  lib/lwip/src/core/tcp.c \\\n  lib/lwip/src/core/tcp_in.c \\\n  lib/lwip/src/core/tcp_out.c \\\n  lib/lwip/src/core/timeouts.c \\\n  lib/lwip/src/core/udp.c \\\n  lib/lwip/src/core/ipv4/autoip.c \\\n  lib/lwip/src/core/ipv4/dhcp.c \\\n  lib/lwip/src/core/ipv4/etharp.c \\\n  lib/lwip/src/core/ipv4/icmp.c \\\n  lib/lwip/src/core/ipv4/igmp.c \\\n  lib/lwip/src/core/ipv4/ip4.c \\\n  lib/lwip/src/core/ipv4/ip4_addr.c \\\n  lib/lwip/src/core/ipv4/ip4_frag.c \\\n  lib/lwip/src/core/ipv6/dhcp6.c \\\n  lib/lwip/src/core/ipv6/ethip6.c \\\n  lib/lwip/src/core/ipv6/icmp6.c \\\n  lib/lwip/src/core/ipv6/inet6.c \\\n  lib/lwip/src/core/ipv6/ip6.c \\\n  lib/lwip/src/core/ipv6/ip6_addr.c \\\n  lib/lwip/src/core/ipv6/ip6_frag.c \\\n  lib/lwip/src/core/ipv6/mld6.c \\\n  lib/lwip/src/core/ipv6/nd6.c \\\n  lib/lwip/src/netif/ethernet.c \\\n  lib/lwip/src/netif/slipif.c \\\n  lib/lwip/src/apps/http/httpd.c \\\n  lib/lwip/src/apps/http/fs.c \\\n  lib/networking/dhserver.c \\\n  lib/networking/dnserver.c \\\n  lib/networking/rndis_reports.c\n\ninclude ../../rules.mk\n"
  },
  {
    "path": "test/fuzz/device/net/src/arch/cc.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. 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 * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Adam Dunkels <adam@sics.se>\n *\n */\n#ifndef __CC_H__\n#define __CC_H__\n\n//#include \"cpu.h\"\n\ntypedef int sys_prot_t;\n\n\n\n/* define compiler specific symbols */\n#if defined (__ICCARM__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n#define PACK_STRUCT_USE_INCLUDES\n\n#elif defined (__CC_ARM)\n\n#define PACK_STRUCT_BEGIN __packed\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#elif defined (__GNUC__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT __attribute__ ((__packed__))\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#elif defined (__TASKING__)\n\n#define PACK_STRUCT_BEGIN\n#define PACK_STRUCT_STRUCT\n#define PACK_STRUCT_END\n#define PACK_STRUCT_FIELD(x) x\n\n#endif\n\n#define LWIP_PLATFORM_ASSERT(x) do { if(!(x)) while(1); } while(0)\n\n#endif /* __CC_H__ */\n"
  },
  {
    "path": "test/fuzz/device/net/src/fuzz.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include <cassert>\n#include <fuzzer/FuzzedDataProvider.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"class/cdc/cdc_device.h\"\n#include \"class/net/net_device.h\"\n#include \"fuzz/fuzz.h\"\n#include \"tusb.h\"\n#include <cstdint>\n#include <string>\n#include <vector>\n\nextern \"C\" {\n\n#define FUZZ_ITERATIONS 500\n\n//--------------------------------------------------------------------+\n// MACRO CONSTANT TYPEDEF PROTYPES\n//--------------------------------------------------------------------+\n\nvoid net_task(FuzzedDataProvider *provider);\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {\n  FuzzedDataProvider provider(Data, Size);\n  std::vector<uint8_t> callback_data = provider.ConsumeBytes<uint8_t>(\n      provider.ConsumeIntegralInRange<size_t>(0, Size));\n  fuzz_init(callback_data.data(), callback_data.size());\n  // init device stack on configured roothub port\n  tusb_rhport_init_t dev_init = {\n    .role = TUSB_ROLE_DEVICE,\n    .speed = TUSB_SPEED_AUTO\n  };\n  tusb_init(BOARD_TUD_RHPORT, &dev_init);\n\n  for (int i = 0; i < FUZZ_ITERATIONS; i++) {\n    if (provider.remaining_bytes() == 0) {\n      return 0;\n    }\n    tud_int_handler(provider.ConsumeIntegral<uint8_t>());\n    tud_task(); // tinyusb device task\n    net_task(&provider);\n  }\n\n  return 0;\n}\n\n//--------------------------------------------------------------------+\n// USB CDC\n//--------------------------------------------------------------------+\nenum NetApiFuncs {\n  kNetworkRecvRenew,\n  kNetworkCanXmit,\n  kNetworkXmit,\n  kMaxValue,\n};\n\nvoid net_task(FuzzedDataProvider *provider) {\n\n  assert(provider != NULL);\n  switch (provider->ConsumeEnum<NetApiFuncs>()) {\n\n  case kNetworkRecvRenew:\n    tud_network_recv_renew();\n    break;\n  case kNetworkCanXmit:\n (void)tud_network_can_xmit(provider->ConsumeIntegral<uint16_t>());\n  case kNetworkXmit:\n    // TODO: Actually pass real values here later.\n    tud_network_xmit(NULL, 0);\n\n  case kMaxValue:\n    // Noop.\n    break;\n  }\n}\n}\n"
  },
  {
    "path": "test/fuzz/device/net/src/lwipopts.h",
    "content": "/*\n * Copyright (c) 2001-2003 Swedish Institute of Computer Science.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modification,\n * are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. 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 * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT\n * SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT\n * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING\n * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY\n * OF SUCH DAMAGE.\n *\n * This file is part of the lwIP TCP/IP stack.\n *\n * Author: Simon Goldschmidt\n *\n */\n#ifndef __LWIPOPTS_H__\n#define __LWIPOPTS_H__\n\n/* Prevent having to link sys_arch.c (we don't test the API layers in unit tests) */\n#define NO_SYS                          1\n#define MEM_ALIGNMENT                   4\n#define LWIP_RAW                        0\n#define LWIP_NETCONN                    0\n#define LWIP_SOCKET                     0\n#define LWIP_DHCP                       0\n#define LWIP_ICMP                       1\n#define LWIP_UDP                        1\n#define LWIP_TCP                        1\n#define LWIP_IPV4                       1\n#define LWIP_IPV6                       0\n#define ETH_PAD_SIZE                    0\n#define LWIP_IP_ACCEPT_UDP_PORT(p)      ((p) == PP_NTOHS(67))\n\n#define TCP_MSS                         (1500 /*mtu*/ - 20 /*iphdr*/ - 20 /*tcphhr*/)\n#define TCP_SND_BUF                     (2 * TCP_MSS)\n#define TCP_WND                         (TCP_MSS)\n\n#define ETHARP_SUPPORT_STATIC_ENTRIES   1\n\n#define LWIP_HTTPD_CGI                  0\n#define LWIP_HTTPD_SSI                  0\n#define LWIP_HTTPD_SSI_INCLUDE_TAG      0\n\n#define LWIP_SINGLE_NETIF               1\n\n#define PBUF_POOL_SIZE                  2\n\n#define HTTPD_USE_CUSTOM_FSDATA         0\n\n#define LWIP_MULTICAST_PING             1\n#define LWIP_BROADCAST_PING             1\n#define LWIP_IPV6_MLD                   0\n#define LWIP_IPV6_SEND_ROUTER_SOLICIT   0\n\n#endif /* __LWIPOPTS_H__ */\n"
  },
  {
    "path": "test/fuzz/device/net/src/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------+\n// Board Specific Configuration\n//--------------------------------------------------------------------+\n\n// RHPort number used for device can be defined by board.mk, default to port 0\n#ifndef BOARD_TUD_RHPORT\n#define BOARD_TUD_RHPORT      0\n#endif\n\n// RHPort max operational speed can defined by board.mk\n#ifndef BOARD_TUD_MAX_SPEED\n#define BOARD_TUD_MAX_SPEED   OPT_MODE_DEFAULT_SPEED\n#endif\n\n//--------------------------------------------------------------------\n// Common Configuration\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n#error CFG_TUSB_MCU must be defined\n#endif\n\n#ifndef CFG_TUSB_OS\n#define CFG_TUSB_OS           OPT_OS_NONE\n#endif\n\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG        0\n#endif\n\n// Enable Device stack\n#define CFG_TUD_ENABLED       1\n\n// Default is max speed that hardware controller could support with on-chip PHY\n#define CFG_TUD_MAX_SPEED     BOARD_TUD_MAX_SPEED\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN    __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#ifndef CFG_TUD_ENDPOINT0_SIZE\n#define CFG_TUD_ENDPOINT0_SIZE    64\n#endif\n\n//------------- CLASS -------------//\n#define CFG_TUD_CDC              1\n#define CFG_TUD_MSC              0\n#define CFG_TUD_HID              0\n#define CFG_TUD_MIDI             0\n#define CFG_TUD_VENDOR           0\n\n// Network class has 2 drivers: ECM/RNDIS and NCM.\n// Only one of the drivers can be enabled\n#define CFG_TUD_ECM_RNDIS     1\n#define CFG_TUD_NCM           (1-CFG_TUD_ECM_RNDIS)\n\n// CDC FIFO size of TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_BUFSIZE   (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// CDC Endpoint transfer buffer size, default to max bulk packet size (HS 512, FS 64). Larger is faster.\n// Larger RX_EPSIZE requires CFG_TUD_CDC_RX_NEED_ZLP = 1 and host ZLP support\n#define CFG_TUD_CDC_RX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n#define CFG_TUD_CDC_TX_EPSIZE  (TUD_OPT_HIGH_SPEED ? 512 : 64)\n\n// MSC Buffer size of Device Mass storage\n#define CFG_TUD_MSC_EP_BUFSIZE   512\n\n\n\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "test/fuzz/device/net/src/usb_descriptors.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"tusb.h\"\n\n/* A combination of interfaces must have a unique product id, since PC will save\n * device driver after the first plug.\n * Auto ProductID layout's Bitmap:\n *   [MSB]         HID | CDC          [LSB]\n */\n#define PID_MAP(itf, n) ((CFG_TUD_##itf) << (n))\n#define USB_PID                                                                \\\n  (0x4000 | PID_MAP(CDC, 0) | PID_MAP(HID, 2) | PID_MAP(MIDI, 3) |          \\\n   PID_MAP(VENDOR, 4))\n\n#define USB_VID 0xCafe\n#define USB_BCD 0x0200\n\n//--------------------------------------------------------------------+\n// Device Descriptors\n//--------------------------------------------------------------------+\n\n// Invoked when received GET DEVICE DESCRIPTOR\n// Application return pointer to descriptor\nuint8_t const *tud_descriptor_device_cb(void) {\n  tu_static tusb_desc_device_t const desc_device = {\n      .bLength = sizeof(tusb_desc_device_t),\n      .bDescriptorType = TUSB_DESC_DEVICE,\n      .bcdUSB = USB_BCD,\n\n      // Use Interface Association Descriptor (IAD) for CDC\n      // As required by USB Specs IAD's subclass must be common class (2) and\n      // protocol must be IAD (1)\n      .bDeviceClass = TUSB_CLASS_MISC,\n      .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n      .bDeviceProtocol = MISC_PROTOCOL_IAD,\n\n      .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n\n      .idVendor = USB_VID,\n      .idProduct = USB_PID,\n      .bcdDevice = 0x0100,\n\n      .iManufacturer = 0x01,\n      .iProduct = 0x02,\n      .iSerialNumber = 0x03,\n\n      .bNumConfigurations = 0x01};\n\n  return (uint8_t const *)&desc_device;\n}\n\n//--------------------------------------------------------------------+\n// Configuration Descriptor\n//--------------------------------------------------------------------+\n\nenum { ITF_NUM_CDC = 0, ITF_NUM_CDC_DATA, ITF_NUM_TOTAL };\n\n#define EPNUM_CDC_NOTIF 0x81\n#define EPNUM_CDC_OUT 0x02\n#define EPNUM_CDC_IN 0x82\n\n#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_CDC_DESC_LEN)\n\n// full speed configuration\nuint8_t const desc_fs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute,\n    // power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP notification address and size, EP data\n    // address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT,\n                       EPNUM_CDC_IN, 64),\n};\n\n#if TUD_OPT_HIGH_SPEED\n// Per USB specs: high speed capable device must report device_qualifier and\n// other_speed_configuration\n\n// high speed configuration\nuint8_t const desc_hs_configuration[] = {\n    // Config number, interface count, string index, total length, attribute,\n    // power in mA\n    TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, 0x00, 100),\n\n    // Interface number, string index, EP notification address and size, EP data\n    // address (out, in) and size.\n    TUD_CDC_DESCRIPTOR(ITF_NUM_CDC, 4, EPNUM_CDC_NOTIF, 8, EPNUM_CDC_OUT,\n                       EPNUM_CDC_IN, 512),\n};\n\n// other speed configuration\nuint8_t desc_other_speed_config[CONFIG_TOTAL_LEN];\n\n// device qualifier is mostly similar to device descriptor since we don't change\n// configuration based on speed\ntusb_desc_device_qualifier_t const desc_device_qualifier = {\n    .bLength = sizeof(tusb_desc_device_qualifier_t),\n    .bDescriptorType = TUSB_DESC_DEVICE_QUALIFIER,\n    .bcdUSB = USB_BCD,\n\n    .bDeviceClass = TUSB_CLASS_MISC,\n    .bDeviceSubClass = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0 = CFG_TUD_ENDPOINT0_SIZE,\n    .bNumConfigurations = 0x01,\n    .bReserved = 0x00};\n\n// Invoked when received GET DEVICE QUALIFIER DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete. device_qualifier descriptor describes\n// information about a high-speed capable device that would change if the device\n// were operating at the other speed. If not highspeed capable stall this\n// request.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {\n  return (uint8_t const *)&desc_device_qualifier;\n}\n\n// Invoked when received GET OTHER SEED CONFIGURATION DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete Configuration descriptor in the other speed\n// e.g if high speed then this is for full speed and vice versa\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {\n  (void)index; // for multiple configurations\n\n  // if link speed is high return fullspeed config, and vice versa\n  // Note: the descriptor type is OTHER_SPEED_CONFIG instead of CONFIG\n  memcpy(desc_other_speed_config,\n         (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_fs_configuration\n                                              : desc_hs_configuration,\n         CONFIG_TOTAL_LEN);\n\n  desc_other_speed_config[1] = TUSB_DESC_OTHER_SPEED_CONFIG;\n\n  return desc_other_speed_config;\n}\n\n#endif // highspeed\n\n// Invoked when received GET CONFIGURATION DESCRIPTOR\n// Application return pointer to descriptor\n// Descriptor contents must exist long enough for transfer to complete\nuint8_t const *tud_descriptor_configuration_cb(uint8_t index) {\n  (void)index; // for multiple configurations\n\n#if TUD_OPT_HIGH_SPEED\n  // Although we are highspeed, host may be fullspeed.\n  return (tud_speed_get() == TUSB_SPEED_HIGH) ? desc_hs_configuration\n                                              : desc_fs_configuration;\n#else\n  return desc_fs_configuration;\n#endif\n}\n\n//--------------------------------------------------------------------+\n// String Descriptors\n//--------------------------------------------------------------------+\n\n// array of pointer to string descriptors\nchar const *string_desc_arr[] = {\n    (const char[]){0x09, 0x04}, // 0: is supported language is English (0x0409)\n    \"TinyUSB\",                  // 1: Manufacturer\n    \"TinyUSB Device\",           // 2: Product\n    \"123456789012\",             // 3: Serials, should use chip ID\n    \"TinyUSB CDC\",              // 4: CDC Interface\n};\n\ntu_static uint16_t _desc_str[32];\n\n// Invoked when received GET STRING DESCRIPTOR request\n// Application return pointer to descriptor, whose contents must exist long\n// enough for transfer to complete\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void)langid;\n\n  uint8_t chr_count;\n\n  if (index == 0) {\n    memcpy(&_desc_str[1], string_desc_arr[0], 2);\n    chr_count = 1;\n  } else {\n    // Note: the 0xEE index string is a Microsoft OS 1.0 Descriptors.\n    // https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/microsoft-defined-usb-descriptors\n\n    if (!(index < sizeof(string_desc_arr) / sizeof(string_desc_arr[0])))\n      return NULL;\n\n    const char *str = string_desc_arr[index];\n\n    // Cap at max char\n    chr_count = (uint8_t)strlen(str);\n    if (chr_count > 31)\n      chr_count = 31;\n\n    // Convert ASCII string into UTF-16\n    for (uint8_t i = 0; i < chr_count; i++) {\n      _desc_str[1 + i] = str[i];\n    }\n  }\n\n  // first byte is length (including header), second byte is string type\n  _desc_str[0] = (uint16_t)((TUSB_DESC_STRING << 8) | (2 * chr_count + 2));\n\n  return _desc_str;\n}\n"
  },
  {
    "path": "test/fuzz/dicts/cdc.dict",
    "content": "# List of supported OIDs\nRNDIS_OID_GEN_SUPPORTED_LIST=\"\\x00\\x01\\x01\\x01\"\n# Hardware status\nRNDIS_OID_GEN_HARDWARE_STATUS=\"\\x00\\x01\\x01\\x02\"\n# Media types supported (encoded)\nRNDIS_OID_GEN_MEDIA_SUPPORTED=\"\\x00\\x01\\x01\\x03\"\n# Media types in use (encoded)\nRNDIS_OID_GEN_MEDIA_IN_USE=\"\\x00\\x01\\x01\\x04\"\nRNDIS_OID_GEN_MAXIMUM_LOOKAHEAD=\"\\x00\\x01\\x01\\x05\"\n# Maximum frame size in bytes\nRNDIS_OID_GEN_MAXIMUM_FRAME_SIZE=\"\\x00\\x01\\x01\\x06\"\n# Link speed in units of 100 bps\nRNDIS_OID_GEN_LINK_SPEED=\"\\x00\\x01\\x01\\x07\"\n# Transmit buffer space\nRNDIS_OID_GEN_TRANSMIT_BUFFER_SPACE=\"\\x00\\x01\\x01\\x08\"\n# Receive buffer space\nRNDIS_OID_GEN_RECEIVE_BUFFER_SPACE=\"\\x00\\x01\\x01\\x09\"\n# NDIS version number used by the driver\nRNDIS_OID_GEN_DRIVER_VERSION=\"\\x00\\x01\\x01\\x10\"\n# Maximum total packet length in bytes\nRNDIS_OID_GEN_MAXIMUM_TOTAL_SIZE=\"\\x00\\x01\\x01\\x11\"\n# Optional protocol flags (encoded)\nRNDIS_OID_GEN_PROTOCOL_OPTIONS=\"\\x00\\x01\\x01\\x12\"\n# Optional NIC flags (encoded)\nRNDIS_OID_GEN_MAC_OPTIONS=\"\\x00\\x01\\x01\\x13\"\n# Whether the NIC is connected to the network\nRNDIS_OID_GEN_MEDIA_CONNECT_STATUS=\"\\x00\\x01\\x01\\x14\"\n# The maximum number of send packets the driver can accept per call to its MiniportSendPacketsfunction\nRNDIS_OID_GEN_MAXIMUM_SEND_PACKETS=\"\\x00\\x01\\x01\\x15\"\n# Vendor-assigned version number of the driver\nRNDIS_OID_GEN_VENDOR_DRIVER_VERSION=\"\\x00\\x01\\x01\\x16\"\n# The custom GUIDs (Globally Unique Identifier) supported by the miniport driver\nRNDIS_OID_GEN_SUPPORTED_GUIDS=\"\\x00\\x01\\x01\\x17\"\n# List of network-layer addresses associated with the binding between a transport and the driver\nRNDIS_OID_GEN_NETWORK_LAYER_ADDRESSES=\"\\x00\\x01\\x01\\x18\"\n# Size of packets' additional headers\nRNDIS_OID_GEN_TRANSPORT_HEADER_OFFSET=\"\\x00\\x01\\x01\\x19\"\nRNDIS_OID_GEN_MEDIA_CAPABILITIES=\"\\x00\\x01\\x02\\x01\"\n# Physical media supported by the miniport driver (encoded)\nRNDIS_OID_GEN_PHYSICAL_MEDIUM=\"\\x00\\x01\\x02\\x02\"\n# Permanent station address\nRNDIS_OID_802_3_PERMANENT_ADDRESS=\"\\x01\\x01\\x01\\x01\"\n# Current station address\nRNDIS_OID_802_3_CURRENT_ADDRESS=\"\\x01\\x01\\x01\\x02\"\n# Current multicast address list\nRNDIS_OID_802_3_MULTICAST_LIST=\"\\x01\\x01\\x01\\x03\"\n# Maximum size of multicast address list\nRNDIS_OID_802_3_MAXIMUM_LIST_SIZE=\"\\x01\\x01\\x01\\x04\"\n# Directed packets. Directed packets contain a destination address equal to the station address of the NIC.\nRNDIS_PACKET_TYPE_DIRECTED=\"\\x00\\x00\\x00\\x01\"\n# Multicast address packets sent to addresses in the multicast address list.\nRNDIS_PACKET_TYPE_MULTICAST=\"\\x00\\x00\\x00\\x02\"\n# All multicast address packets, not just the ones enumerated in the multicast address list.\nRNDIS_PACKET_TYPE_ALL_MULTICAST=\"\\x00\\x00\\x00\\x04\"\n# Broadcast packets.\nRNDIS_PACKET_TYPE_BROADCAST=\"\\x00\\x00\\x00\\x08\"\n# All source routing packets. If the protocol driver sets this bit, the NDIS library attempts to act as a source routing bridge.\nRNDIS_PACKET_TYPE_SOURCE_ROUTING=\"\\x00\\x00\\x00\\x10\"\n# Specifies all packets regardless of whether VLAN filtering is enabled or not and whether the VLAN identifier matches or not.\nRNDIS_PACKET_TYPE_PROMISCUOUS=\"\\x00\\x00\\x00\\x20\"\n# SMT packets that an FDDI NIC receives.\nRNDIS_PACKET_TYPE_SMT=\"\\x00\\x00\\x00\\x40\"\n# All packets sent by installed protocols and all packets indicated by the NIC that is identified by a given NdisBindingHandle.\nRNDIS_PACKET_TYPE_ALL_LOCAL=\"\\x00\\x00\\x00\\x80\"\n# Packets sent to the current group address.\nRNDIS_PACKET_TYPE_GROUP=\"\\x00\\x00\\x10\\x00\"\n# All functional address packets, not just the ones in the current functional address.\nRNDIS_PACKET_TYPE_ALL_FUNCTIONAL=\"\\x00\\x00\\x20\\x00\"\n# Functional address packets sent to addresses included in the current functional address.\nRNDIS_PACKET_TYPE_FUNCTIONAL=\"\\x00\\x00\\x40\\x00\"\n# NIC driver frames that a Token Ring NIC receives.\nRNDIS_PACKET_TYPE_MAC_FRAME=\"\\x00\\x00\\x80\\x00\"\nRNDIS_PACKET_TYPE_NO_LOCAL=\"\\x00\\x01\\x00\\x00\"\n"
  },
  {
    "path": "test/fuzz/fuzz.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"fuzzer/FuzzedDataProvider.h\"\n#include <optional>\n\nstd::optional<FuzzedDataProvider> _fuzz_data_provider;\n\nextern \"C\" int fuzz_init(const uint8_t *data, size_t size) {\n  _fuzz_data_provider.emplace(data, size);\n  return 0;\n}\n"
  },
  {
    "path": "test/fuzz/fuzz.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#pragma once\n#include <stdint.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nint fuzz_init(const uint8_t *data, size_t size);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "test/fuzz/fuzz_private.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#pragma once\n#include \"fuzzer/FuzzedDataProvider.h\"\n#include <optional>\n\nextern std::optional<FuzzedDataProvider> _fuzz_data_provider;\n"
  },
  {
    "path": "test/fuzz/make.mk",
    "content": "# ---------------------------------------\n# Common make definition for all examples\n# ---------------------------------------\n\n#-------------- TOP and EXAMPLE_PATH ------------\n\n# Set TOP to be the path to get from the current directory (where make was\n# invoked) to the top of the tree. $(lastword $(MAKEFILE_LIST)) returns\n# the name of this makefile relative to where make was invoked.\nTHIS_MAKEFILE := $(lastword $(MAKEFILE_LIST))\n\n# strip off /tools/top.mk to get for example ../../..\n# and Set TOP to an absolute path\nTOP = $(abspath $(subst make.mk,../..,$(THIS_MAKEFILE)))\n\n# Set EXAMPLE_PATH to the relative path from TOP to the current directory, ie examples/device/cdc_msc_freertos\nEXAMPLE_PATH = $(subst $(TOP)/,,$(abspath .))\n\n# Detect whether shell style is windows or not\n# https://stackoverflow.com/questions/714100/os-detecting-makefile/52062069#52062069\nifeq '$(findstring ;,$(PATH))' ';'\n# PATH contains semicolon - so we're definitely on Windows.\nCMDEXE := 1\n\n# makefile shell commands should use syntax for DOS CMD, not unix sh\n# Unfortunately, SHELL may point to sh or bash, which can't accept DOS syntax.\n# We can't just use sh, because while sh and/or bash shell may be available,\n# many Windows environments won't have utilities like realpath used below, so...\n# Force DOS command shell on Windows.\nSHELL := cmd.exe\nendif\n\n# Build directory\nBUILD := _build\nPROJECT := $(notdir $(CURDIR))\n\n# Handy check parameter function\ncheck_defined = \\\n    $(strip $(foreach 1,$1, \\\n    $(call __check_defined,$1,$(strip $(value 2)))))\n__check_defined = \\\n    $(if $(value $1),, \\\n    $(error Undefined make flag: $1$(if $2, ($2))))\n\n#-------------- Fuzz harness compiler  ------------\n\nCC ?= clang\nCXX ?= clang++\nGDB ?= gdb\nOBJCOPY = objcopy\nSIZE = size\nMKDIR = mkdir\n\nifeq ($(CMDEXE),1)\n  CP = copy\n  RM = del\n  PYTHON = python\nelse\n  SED = sed\n  CP = cp\n  RM = rm\n  PYTHON = python3\nendif\n\n#-------------- Fuzz harness flags ------------\nCOVERAGE_FLAGS ?= -fsanitize-coverage=trace-pc-guard\nSANITIZER_FLAGS ?= -fsanitize=fuzzer \\\n                   -fsanitize=address\n\nCFLAGS += $(COVERAGE_FLAGS) $(SANITIZER_FLAGS)\n\n#-------------- Source files and compiler flags --------------\nINC += $(TOP)/test\n\n# Compiler Flags\nCFLAGS += \\\n  -ggdb \\\n  -fdata-sections \\\n  -ffunction-sections \\\n  -fno-strict-aliasing \\\n  -Wall \\\n  -Wextra \\\n  -Werror \\\n  -Wfatal-errors \\\n  -Wdouble-promotion \\\n  -Wstrict-prototypes \\\n  -Wstrict-overflow \\\n  -Werror-implicit-function-declaration \\\n  -Wfloat-equal \\\n  -Wundef \\\n  -Wshadow \\\n  -Wwrite-strings \\\n  -Wsign-compare \\\n  -Wmissing-format-attribute \\\n  -Wunreachable-code \\\n  -Wcast-align \\\n  -Wcast-qual \\\n  -Wnull-dereference \\\n  -Wuninitialized \\\n  -Wunused \\\n  -Wredundant-decls \\\n  -O1\n\nCFLAGS += \\\n\t-Wno-error=unreachable-code \\\n  -DOPT_MCU_FUZZ=1 \\\n  -DCFG_TUSB_MCU=OPT_MCU_FUZZ \\\n  -D_FUZZ\n\nCXXFLAGS += \\\n  -xc++ \\\n  -Wno-c++11-narrowing \\\n  -fno-implicit-templates\n\n# conversion is too strict for most mcu driver, may be disable sign/int/arith-conversion\n#  -Wconversion\n\n# Debugging/Optimization\nifeq ($(DEBUG), 1)\n  CFLAGS += -Og\nelse\n  CFLAGS += $(CFLAGS_OPTIMIZED)\nendif\n\n# Log level is mapped to TUSB DEBUG option\nifneq ($(LOG),)\n  CFLAGS += -DCFG_TUSB_DEBUG=$(LOG)\nendif\n"
  },
  {
    "path": "test/fuzz/msc_fuzz.cc",
    "content": "#include \"fuzz/fuzz_private.h\"\n#include \"tusb.h\"\n#include <cassert>\n#include <array>\n#include <limits>\n\n#if CFG_TUD_MSC==1\n\n// Whether host does safe eject.\n// tud_msc_get_maxlun_cb returns a uint8_t so the max logical units that are\n// allowed is 255, so we need to keep track of 255 fuzzed logical units.\nstatic std::array<bool, std::numeric_limits<uint8_t>::max()> ejected = {false};\n\nextern \"C\" {\n// Invoked when received SCSI_CMD_INQUIRY\n// Application fill vendor id, product id and revision with string up to 8, 16,\n// 4 characters respectively\nvoid tud_msc_inquiry_cb(uint8_t lun, uint8_t vendor_id[8],\n                        uint8_t product_id[16], uint8_t product_rev[4]) {\n  (void)lun;\n  assert(_fuzz_data_provider.has_value());\n\n  std::string vid = _fuzz_data_provider->ConsumeBytesAsString(8);\n  std::string pid = _fuzz_data_provider->ConsumeBytesAsString(16);\n  std::string rev = _fuzz_data_provider->ConsumeBytesAsString(4);\n\n  memcpy(vendor_id, vid.c_str(), strlen(vid.c_str()));\n  memcpy(product_id, pid.c_str(), strlen(pid.c_str()));\n  memcpy(product_rev, rev.c_str(), strlen(rev.c_str()));\n}\n\n// Invoked when received Test Unit Ready command.\n// return true allowing host to read/write this LUN e.g SD card inserted\nbool tud_msc_test_unit_ready_cb(uint8_t lun) {\n  // RAM disk is ready until ejected\n  if (ejected[lun]) {\n    // Additional Sense 3A-00 is NOT_FOUND\n    tud_msc_set_sense(lun, SCSI_SENSE_NOT_READY, 0x3a, 0x00);\n    return false;\n  }\n\n  return _fuzz_data_provider->ConsumeBool();\n}\n\n// Invoked when received SCSI_CMD_READ_CAPACITY_10 and\n// SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size Application update\n// block count and block size\nvoid tud_msc_capacity_cb(uint8_t lun, uint32_t *block_count,\n                         uint16_t *block_size) {\n  (void)lun;\n  *block_count = _fuzz_data_provider->ConsumeIntegral<uint32_t>();\n  *block_size = _fuzz_data_provider->ConsumeIntegral<uint16_t>();\n}\n\n// Invoked when received Start Stop Unit command\n// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage\n// - Start = 1 : active mode, if load_eject = 1 : load disk storage\nbool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start,\n                           bool load_eject) {\n  (void)power_condition;\n  assert(_fuzz_data_provider.has_value());\n\n  if (load_eject) {\n    if (start) {\n      // load disk storage\n    } else {\n      // unload disk storage\n      ejected[lun] = true;\n    }\n  }\n\n  return _fuzz_data_provider->ConsumeBool();\n}\n\n// Callback invoked when received READ10 command.\n// Copy disk's data to buffer (up to bufsize) and return number of copied bytes.\nint32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset,\n                          void *buffer, uint32_t bufsize) {\n  assert(_fuzz_data_provider.has_value());\n  (void)lun;\n  (void)lba;\n  (void)offset;\n\n  std::vector<uint8_t> consumed_buffer = _fuzz_data_provider->ConsumeBytes<uint8_t>(\n      _fuzz_data_provider->ConsumeIntegralInRange<uint32_t>(0, bufsize));\n  memcpy(buffer, consumed_buffer.data(), consumed_buffer.size());\n\n  // Sometimes return an error code;\n  if (_fuzz_data_provider->ConsumeBool()) {\n    return _fuzz_data_provider->ConsumeIntegralInRange(\n        std::numeric_limits<int32_t>::min(), -1);\n  }\n\n  return consumed_buffer.size();\n}\n\nbool tud_msc_is_writable_cb(uint8_t lun) {\n  assert(_fuzz_data_provider.has_value());\n  (void)lun;\n  return _fuzz_data_provider->ConsumeBool();\n}\n\n// Callback invoked when received WRITE10 command.\n// Process data in buffer to disk's storage and return number of written bytes\nint32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset,\n                           uint8_t *buffer, uint32_t bufsize) {\n  // Ignore these as they are outputs and don't affect the return value.\n  (void)lun;\n  (void)lba;\n  (void)offset;\n  (void)buffer;\n  assert(_fuzz_data_provider.has_value());\n\n  // -ve error codes -> bufsize.\n  return _fuzz_data_provider->ConsumeIntegralInRange<int32_t>(\n      std::numeric_limits<int32_t>::min(), bufsize);\n}\n\n// Callback invoked when received an SCSI command not in built-in list below\n// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE\n// - READ10 and WRITE10 has their own callbacks\nint32_t tud_msc_scsi_cb(uint8_t lun, uint8_t const scsi_cmd[16], void *buffer,\n                        uint16_t bufsize) {\n  (void)buffer;\n  (void)bufsize;\n  assert(_fuzz_data_provider.has_value());\n\n  switch (scsi_cmd[0]) {\n  case SCSI_CMD_TEST_UNIT_READY:\n    break;\n  case SCSI_CMD_INQUIRY:\n    break;\n  case SCSI_CMD_MODE_SELECT_6:\n    break;\n  case SCSI_CMD_MODE_SENSE_6:\n    break;\n  case SCSI_CMD_START_STOP_UNIT:\n    break;\n  case SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL:\n    break;\n  case SCSI_CMD_READ_CAPACITY_10:\n    break;\n  case SCSI_CMD_REQUEST_SENSE:\n    break;\n  case SCSI_CMD_READ_FORMAT_CAPACITY:\n    break;\n  case SCSI_CMD_READ_10:\n    break;\n  case SCSI_CMD_WRITE_10:\n    break;\n  default:\n    // Set Sense = Invalid Command Operation\n    tud_msc_set_sense(lun, SCSI_SENSE_ILLEGAL_REQUEST, 0x20, 0x00);\n    return _fuzz_data_provider->ConsumeIntegralInRange<int32_t>(\n        std::numeric_limits<int32_t>::min(), -1);\n  }\n\n  return 0;\n}\n}\n\n#endif\n"
  },
  {
    "path": "test/fuzz/net_fuzz.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"tusb_config.h\"\n#if defined(CFG_TUD_ECM_RNDIS) || defined(CFG_TUD_NCM)\n\n#include \"class/net/net_device.h\"\n#include \"fuzz_private.h\"\n#include <cassert>\n#include <cstdint>\n#include <vector>\n#include \"lwip/sys.h\"\n\nextern \"C\" {\nbool tud_network_recv_cb(const uint8_t *src, uint16_t size) {\n  assert(_fuzz_data_provider.has_value());\n  (void)src;\n  (void)size;\n  return _fuzz_data_provider->ConsumeBool();\n}\n\n// client must provide this: copy from network stack packet pointer to dst\nuint16_t tud_network_xmit_cb(uint8_t *dst, void *ref, uint16_t arg) {\n  (void)ref;\n  (void)arg;\n\n  assert(_fuzz_data_provider.has_value());\n\n  uint16_t size = _fuzz_data_provider->ConsumeIntegral<uint16_t>();\n  std::vector<uint8_t> temp = _fuzz_data_provider->ConsumeBytes<uint8_t>(size);\n  memcpy(dst, temp.data(), temp.size());\n  return size;\n}\n\n/* lwip has provision for using a mutex, when applicable */\nsys_prot_t sys_arch_protect(void) { return 0; }\nvoid sys_arch_unprotect(sys_prot_t pval) { (void)pval; }\n\n//------------- ECM/RNDIS -------------//\n\n// client must provide this: initialize any network state back to the beginning\nvoid tud_network_init_cb(void) {\n  // NoOp.\n}\n\n// client must provide this: 48-bit MAC address\n// TODO removed later since it is not part of tinyusb stack\nuint8_t tud_network_mac_address[6] = {0};\n\n}   // extern \"C\"\n\n#endif\n"
  },
  {
    "path": "test/fuzz/rules.mk",
    "content": "# ---------------------------------------\n# Common make rules for all examples\n# ---------------------------------------\n\n# Set all as default goal\n.DEFAULT_GOAL := all\n\n# ---------------------------------------\n# Compiler Flags\n# ---------------------------------------\n\nLIBS_GCC ?=  -lm\n\n# libc\nLIBS += $(LIBS_GCC)\n\nifneq ($(BOARD), spresense)\nLIBS += -lc -Wl,-Bstatic -lc++ -Wl,-Bdynamic\nendif\n\n# TinyUSB Stack source\nSRC_C += \\\n\tsrc/tusb.c \\\n\tsrc/common/tusb_fifo.c \\\n\tsrc/device/usbd.c \\\n\tsrc/device/usbd_control.c \\\n\tsrc/class/audio/audio_device.c \\\n\tsrc/class/cdc/cdc_device.c \\\n\tsrc/class/dfu/dfu_device.c \\\n\tsrc/class/dfu/dfu_rt_device.c \\\n\tsrc/class/hid/hid_device.c \\\n\tsrc/class/midi/midi_device.c \\\n\tsrc/class/msc/msc_device.c \\\n\tsrc/class/mtp/mtp_device.c \\\n\tsrc/class/printer/printer_device.c \\\n\tsrc/class/net/ecm_rndis_device.c \\\n\tsrc/class/net/ncm_device.c \\\n\tsrc/class/usbtmc/usbtmc_device.c \\\n\tsrc/class/video/video_device.c \\\n\tsrc/class/vendor/vendor_device.c\n\n\n# Fuzzers are c++\nSRC_CXX += \\\n\ttest/fuzz/dcd_fuzz.cc \\\n\ttest/fuzz/fuzz.cc \\\n\ttest/fuzz/msc_fuzz.cc \\\n\ttest/fuzz/net_fuzz.cc \\\n\ttest/fuzz/usbd_fuzz.cc\n\n# TinyUSB stack include\nINC += $(TOP)/src\n\nCFLAGS += $(addprefix -I,$(INC))\nCXXFLAGS += -std=c++17\n\n# LTO makes it difficult to analyze map file for optimizing size purpose\n# We will run this option in ci\nifeq ($(NO_LTO),1)\nCFLAGS := $(filter-out -flto,$(CFLAGS))\nendif\n\nifneq ($(LD_FILE),)\nLDFLAGS_LD_FILE ?= -Wl,-T,$(TOP)/$(LD_FILE)\nendif\n\nLDFLAGS += $(CFLAGS) $(LDFLAGS_LD_FILE) -fuse-ld=lld -Wl,-Map=$@.map -Wl,--cref -Wl,-gc-sections\nifneq ($(SKIP_NANOLIB), 1)\nendif\n\nASFLAGS += $(CFLAGS)\n\n# Assembly files can be name with upper case .S, convert it to .s\nSRC_S := $(SRC_S:.S=.s)\n\n# Due to GCC LTO bug https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966\n# assembly file should be placed first in linking order\n# '_asm' suffix is added to object of assembly file\nOBJ += $(addprefix $(BUILD)/obj/, $(SRC_S:.s=_asm.o))\nOBJ += $(addprefix $(BUILD)/obj/, $(SRC_C:.c=.o))\nOBJ += $(addprefix $(BUILD)/obj/, $(SRC_CXX:.cc=_cxx.o))\n\n# Verbose mode\nifeq (\"$(V)\",\"1\")\n$(info CFLAGS  $(CFLAGS) ) $(info )\n$(info LDFLAGS $(LDFLAGS)) $(info )\n$(info ASFLAGS $(ASFLAGS)) $(info )\nendif\n\n# ---------------------------------------\n# Rules\n# ---------------------------------------\n\nall: $(BUILD)/$(PROJECT)\n\nOBJ_DIRS = $(sort $(dir $(OBJ)))\n$(OBJ): | $(OBJ_DIRS)\n$(OBJ_DIRS):\nifeq ($(CMDEXE),1)\n\t@$(MKDIR) $(subst /,\\,$@)\nelse\n\t@$(MKDIR) -p $@\nendif\n\n$(BUILD)/$(PROJECT): $(OBJ)\n\t@echo LINK $@\n\t@ $(CXX) -o $@  $(LIB_FUZZING_ENGINE) $^ $(LIBS) $(LDFLAGS)\n\n# We set vpath to point to the top of the tree so that the source files\n# can be located. By following this scheme, it allows a single build rule\n# to be used to compile all .c files.\nvpath %.c . $(TOP)\n$(BUILD)/obj/%.o: %.c\n\t@echo CC $(notdir $@)\n\t@$(CC) $(CFLAGS) -c -MD -o $@ $<\n\n# All cpp srcs\nvpath %.cc . $(TOP)\n$(BUILD)/obj/%_cxx.o: %.cc\n\t@echo CXX $(notdir $@)\n\t@$(CXX) $(CFLAGS) $(CXXFLAGS) -c -MD -o $@ $<\n\n# ASM sources lower case .s\nvpath %.s . $(TOP)\n$(BUILD)/obj/%_asm.o: %.s\n\t@echo AS $(notdir $@)\n\t@$(CC) -x assembler-with-cpp $(ASFLAGS) -c -o $@ $<\n\n# ASM sources upper case .S\nvpath %.S . $(TOP)\n$(BUILD)/obj/%_asm.o: %.S\n\t@echo AS $(notdir $@)\n\t@$(CC) -x assembler-with-cpp $(ASFLAGS) -c -o $@ $<\n\n.PHONY: clean\nclean:\nifeq ($(CMDEXE),1)\n\trd /S /Q $(subst /,\\,$(BUILD))\nelse\n\t$(RM) -rf $(BUILD)\nendif\n# ---------------- GNU Make End -----------------------\n\n# get depenecies\n.PHONY: get-deps\nget-deps:\n\t$(PYTHON) $(TOP)/tools/get_deps.py $(FAMILY)\n\nsize: $(BUILD)/$(PROJECT)\n\t-@echo ''\n\t@$(SIZE) $<\n\t-@echo ''\n\n# linkermap must be install previously at https://github.com/hathach/linkermap\nlinkermap: $(BUILD)/$(PROJECT)\n\t@linkermap -v $<.map\n\n# Print out the value of a make variable.\n# https://stackoverflow.com/questions/16467718/how-to-print-out-a-variable-in-makefile\nprint-%:\n\t@echo $* = $($*)\n"
  },
  {
    "path": "test/fuzz/usbd_fuzz.cc",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2022 Nathaniel Brough\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#include \"fuzz/fuzz_private.h\"\n#include \"tusb.h\"\n// #include \"usb_descriptors.h\"\n\n#ifndef CFG_FUZZ_MAX_STRING_LEN\n#define CFG_FUZZ_MAX_STRING_LEN 1000\n#endif\n\nextern \"C\" {\n\n/* TODO: Implement a fuzzed version of this.\nuint8_t const *tud_descriptor_bos_cb(void) {  }\n*/\n\n/* TODO: Implement a fuzzed version of this.\nuint8_t const *tud_descriptor_device_qualifier_cb(void) {}\n*/\n\n/* TODO: Implement a fuzzed version of this.\nuint8_t const *tud_descriptor_other_speed_configuration_cb(uint8_t index) {}\n*/\n\nvoid tud_mount_cb(void) {\n  // NOOP\n}\n\nvoid tud_umount_cb(void) {\n  // NOOP\n}\n\nvoid tud_suspend_cb(bool remote_wakeup_en) {\n  (void)remote_wakeup_en;\n  // NOOP\n}\n\nvoid tud_resume_cb(void) {\n  // NOOP\n}\n\n/* TODO: Implement a fuzzed version of this.\nbool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage,\n                                tusb_control_request_t const *request) {}\n*/\n\n/* TODO: Implement a fuzzed version of this.\nuint16_t const *tud_descriptor_string_cb(uint8_t index, uint16_t langid) {}\n*/\n}\n"
  },
  {
    "path": "test/hil/hfp.json",
    "content": "{\n    \"boards\": [\n        {\n            \"name\": \"stm32l412nucleo\",\n            \"uid\": \"41003B000E504E5457323020\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"774470029\",\n                \"args\": \"-device STM32L412KB\"\n            }\n        },\n        {\n            \"name\": \"stm32f746disco\",\n            \"uid\": \"210041000C51343237303334\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"770935966\",\n                \"args\": \"-device STM32F746NG\"\n            }\n        },\n        {\n            \"name\": \"lpcxpresso43s67\",\n            \"uid\": \"08F000044528BAAA8D858F58C50700F5\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"728973776\",\n                \"args\": \"-device LPC43S67_M4\"\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "test/hil/hil_ci_set_matrix.py",
    "content": "import argparse\nimport json\nimport os\n\n\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument('config_file', help='Configuration JSON file')\n    args = parser.parse_args()\n\n    config_file = args.config_file\n\n    # if config file is not found, try to find it in the same directory as this script\n    if not os.path.exists(config_file):\n        config_file = os.path.join(os.path.dirname(__file__), config_file)\n    with open(config_file) as f:\n        config = json.load(f)\n\n    matrix = {\n        'arm-gcc': [],\n        'esp-idf': []\n    }\n    for board in config['boards']:\n        name = board['name']\n        flasher = board['flasher']\n        if flasher['name'] == 'esptool':\n            toolchain = 'esp-idf'\n        else:\n            toolchain = 'arm-gcc'\n\n        build_board = f'-b {name}'\n        if 'build' in board:\n            if 'args' in board['build']:\n                build_board += ' ' + ' '.join(f'-D{a}' for a in board['build']['args'])\n            if 'flags_on' in board['build']:\n                for f in board['build']['flags_on']:\n                    if f == '':\n                        matrix[toolchain].append(build_board)\n                    else:\n                        matrix[toolchain].append(f'{build_board} -f1 {f.replace(\" \", \" -f1 \")}')\n            else:\n                matrix[toolchain].append(build_board)\n        else:\n            matrix[toolchain].append(build_board)\n\n    print(json.dumps(matrix))\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "test/hil/hil_test.py",
    "content": "#!/usr/bin/env python3\n#\n# The MIT License (MIT)\n#\n# Copyright (c) 2023 HiFiPhile\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n# THE SOFTWARE.\n\n# udev rules :\n# ACTION==\"add\", SUBSYSTEM==\"tty\", SUBSYSTEMS==\"usb\", MODE=\"0666\", PROGRAM=\"/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'\", SYMLINK+=\"ttyUSB_%c.%s{bInterfaceNumber}\"\n# ACTION==\"add\", SUBSYSTEM==\"block\", SUBSYSTEMS==\"usb\", ENV{ID_FS_USAGE}==\"filesystem\", MODE=\"0666\", PROGRAM=\"/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'\", RUN{program}+=\"/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /media/blkUSB_%c.%s{bInterfaceNumber}\"\n\nimport argparse\nimport os\nimport random\nimport re\nimport sys\nimport time\nimport warnings\n\n# Suppress pkg_resources deprecation warning from fs module\nwarnings.filterwarnings(\"ignore\", message=\"pkg_resources is deprecated\")\n# Suppress pyfatfs unclean unmount warning\nwarnings.filterwarnings(\"ignore\", message=\"Filesystem was not cleanly unmounted\")\n\nimport serial\nimport subprocess\nimport json\nimport glob\nfrom multiprocessing import Pool\nimport fs\nimport hashlib\nimport ctypes\nfrom pymtp import MTP\nimport string\n\nENUM_TIMEOUT = 30\n\nSTATUS_OK = \"\\033[32mOK\\033[0m\"\nSTATUS_FAILED = \"\\033[31mFailed\\033[0m\"\nSTATUS_SKIPPED = \"\\033[33mSkipped\\033[0m\"\n\nverbose = False\ntest_only = []\nbuild_dir = 'cmake-build'\n\nWCH_RISCV_CONTENT = \"\"\"\nadapter driver wlinke\nadapter speed 6000\ntransport select sdi\n\nwlink_set_address 0x00000000\nset _CHIPNAME wch_riscv\nsdi newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x00001\n\nset _TARGETNAME $_CHIPNAME.cpu\n\ntarget create $_TARGETNAME.0 wch_riscv -chain-position $_TARGETNAME\n$_TARGETNAME.0 configure  -work-area-phys 0x20000000 -work-area-size 10000 -work-area-backup 1\nset _FLASHNAME $_CHIPNAME.flash\n\nflash bank $_FLASHNAME wch_riscv 0x00000000 0 0 0 $_TARGETNAME.0\n\necho \"Ready for Remote Connections\"\n\"\"\"\n\nMSC_README_TXT = \\\nb\"This is tinyusb's MassStorage Class demo.\\r\\n\\r\\n\\\nIf you find any bugs or get any questions, feel free to file an\\r\\n\\\nissue at github.com/hathach/tinyusb\"\n\n# -------------------------------------------------------------\n# Path\n# -------------------------------------------------------------\nOPENCOD_ADI_PATH = f'{os.getenv(\"HOME\")}/app/openocd_adi'\nTINYUSB_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))\n\n# get usb serial by id\ndef get_serial_dev(id, vendor_str, product_str, ifnum):\n    if vendor_str and product_str:\n        # known vendor and product\n        vendor_str = vendor_str.replace(' ', '_')\n        product_str = product_str.replace(' ', '_')\n        return f'/dev/serial/by-id/usb-{vendor_str}_{product_str}_{id}-if{ifnum:02d}'\n    else:\n        # just use id: mostly for cp210x/ftdi flasher\n        pattern = f'/dev/serial/by-id/usb-*_{id}-if*'\n        port_list = glob.glob(pattern)\n        return port_list[0]\n\n\n# get usb disk by id\ndef get_disk_dev(id, vendor_str, lun):\n    return f'/dev/disk/by-id/usb-{vendor_str}_Mass_Storage_{id}-0:{lun}'\n\n\ndef get_hid_dev(id, vendor_str, product_str, event):\n    return f'/dev/input/by-id/usb-{vendor_str}_{product_str}_{id}-{event}'\n\n\ndef open_serial_dev(port):\n    timeout = ENUM_TIMEOUT\n    ser = None\n    while timeout > 0:\n        if os.path.exists(port):\n            try:\n                ser = serial.Serial(port, baudrate=115200, timeout=5)\n                break\n            except serial.SerialException:\n                print(f'serial {port} not reaady {timeout} sec')\n                pass\n        time.sleep(0.1)\n        timeout -= 0.1\n\n    assert timeout > 0, f'Cannot open port f{port}' if os.path.exists(port) else f'Port {port} not existed'\n    return ser\n\n\ndef read_disk_file(uid, lun, fname):\n    # open_fs(\"fat://{dev}) require 'pip install pyfatfs'\n    dev = get_disk_dev(uid, 'TinyUSB', lun)\n    timeout = ENUM_TIMEOUT\n    while timeout > 0:\n        if os.path.exists(dev):\n            fat = fs.open_fs(f'fat://{dev}?read_only=true')\n            try:\n                with fat.open(fname, 'rb') as f:\n                    data = f.read()\n            finally:\n                fat.close()\n            assert data, f'Cannot read file {fname} from {dev}'\n            return data\n        time.sleep(1)\n        timeout -= 1\n\n    assert timeout > 0, f'Storage {dev} not existed'\n    return None\n\n\ndef open_mtp_dev(uid):\n    mtp = MTP()\n    # MTP seems to take a while to enumerate\n    timeout = 2 * ENUM_TIMEOUT\n    while timeout > 0:\n        # unmount gio/gvfs MTP mount which blocks libmtp from accessing the device\n        subprocess.run(f\"gio mount -u mtp://TinyUsb_TinyUsb_Device_{uid}/\",\n                       shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n        for raw in mtp.detect_devices():\n            mtp.device = mtp.mtp.LIBMTP_Open_Raw_Device(ctypes.byref(raw))\n            if mtp.device:\n                sn = mtp.get_serialnumber().decode('utf-8')\n                if sn == uid:\n                    return mtp\n                mtp.disconnect()\n        time.sleep(1)\n        timeout -= 1\n    return None\n\n\ndef get_printer_dev(id, vendor_str, product_str, ifnum):\n    \"\"\"Find /dev/usb/lpX by matching USB serial, vendor, product, and interface number via sysfs\"\"\"\n    vendor_str = vendor_str.replace(' ', '_') if vendor_str else ''\n    product_str = product_str.replace(' ', '_') if product_str else ''\n    for lp in glob.glob('/sys/class/usbmisc/lp*'):\n        try:\n            sn = open(f'{lp}/device/../serial').read().strip()\n            if sn == id:\n                return f'/dev/usb/{os.path.basename(lp)}'\n        except (FileNotFoundError, PermissionError, ValueError):\n            pass\n    return None\n\n\ndef open_printer_dev(id, vendor_str, product_str, ifnum):\n    \"\"\"Wait for printer device to enumerate and return its path\"\"\"\n    timeout = ENUM_TIMEOUT\n    while timeout > 0:\n        lp_dev = get_printer_dev(id, vendor_str, product_str, ifnum)\n        if lp_dev and os.path.exists(lp_dev):\n            return lp_dev\n        time.sleep(1)\n        timeout -= 1\n    assert False, f'Printer device not found for {id} if{ifnum:02d}'\n\n\n# -------------------------------------------------------------\n# Flashing firmware\n# -------------------------------------------------------------\ndef run_cmd(cmd, cwd=None):\n    r = subprocess.run(cmd, cwd=cwd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)\n    if r.returncode != 0:\n        title = f'COMMAND FAILED: {cmd}'\n        print()\n        if os.getenv('CI'):\n            print(f\"::group::{title}\")\n            print(r.stdout.decode(\"utf-8\"))\n            print(f\"::endgroup::\")\n        else:\n            print(title)\n            print(r.stdout.decode(\"utf-8\"))\n    elif verbose:\n        print(cmd)\n        print(r.stdout.decode(\"utf-8\"))\n    return r\n\n\ndef flash_jlink(board, firmware):\n    flasher = board['flasher']\n    script = ['halt', 'r', f'loadfile {firmware}.elf', 'r', 'go', 'exit']\n    f_jlink = f'{board[\"name\"]}_{os.path.basename(firmware)}.jlink'\n    with open(f_jlink, 'w') as f:\n        f.writelines(f'{s}\\n' for s in script)\n    ret = run_cmd(f'JLinkExe -USB {flasher[\"uid\"]} {flasher[\"args\"]} -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile {f_jlink}')\n    os.remove(f_jlink)\n    return ret\n\n\ndef reset_jlink(board):\n    flasher = board['flasher']\n    script = ['halt', 'r', 'go', 'exit']\n    f_jlink = f'{board[\"name\"]}_reset.jlink'\n    if not os.path.exists(f_jlink):\n        with open(f_jlink, 'w') as f:\n            f.writelines(f'{s}\\n' for s in script)\n    ret = run_cmd(f'JLinkExe -USB {flasher[\"uid\"]} {flasher[\"args\"]} -if swd -JTAGConf -1,-1 -speed auto -NoGui 1 -ExitOnError 1 -CommandFile {f_jlink}')\n    return ret\n\n\ndef flash_stlink(board, firmware):\n    flasher = board['flasher']\n    return run_cmd(f'STM32_Programmer_CLI --connect port=swd sn={flasher[\"uid\"]} --write {firmware}.elf --go')\n\n\ndef reset_stlink(board):\n    flasher = board['flasher']\n    return run_cmd(f'STM32_Programmer_CLI --connect port=swd sn={flasher[\"uid\"]} --rst --go')\n\ndef flash_stflash(board, firmware):\n    flasher = board['flasher']\n    ret = run_cmd(f'st-flash --serial {flasher[\"uid\"]} write {firmware}.bin 0x8000000')\n    return ret\n\n\ndef reset_stflash(board):\n    flasher = board['flasher']\n    return subprocess.CompletedProcess(args=['dummy'], returncode=0)\n\n\ndef flash_openocd(board, firmware):\n    flasher = board['flasher']\n    ret = run_cmd(f'openocd -c \"tcl_port disabled\" -c \"gdb_port disabled\" -c \"adapter serial {flasher[\"uid\"]}\" '\n                  f'{flasher[\"args\"]} -c \"init; halt; program {firmware}.elf verify; reset; exit\"')\n    return ret\n\n\ndef reset_openocd(board):\n    flasher = board['flasher']\n    ret = run_cmd(f'openocd -c \"tcl_port disabled\" -c \"gdb_port disabled\" -c \"adapter serial {flasher[\"uid\"]}\" '\n                  f'{flasher[\"args\"]} -c \"init; reset run; exit\"')\n    return ret\n\n\ndef flash_openocd_wch(board, firmware):\n    flasher = board['flasher']\n    f_wch = f\"wch-riscv_{board['uid']}.cfg\"\n    if not os.path.exists(f_wch):\n        with open(f_wch, 'w') as file:\n            file.write(WCH_RISCV_CONTENT)\n\n    ret = run_cmd(f'openocd_wch -c \"adapter serial {flasher[\"uid\"]}\" -f {f_wch} '\n                  f'-c \"program {firmware}.elf reset exit\"')\n    return ret\n\n\ndef reset_openocd_wch(board):\n    flasher = board['flasher']\n    f_wch = f\"wch-riscv_{board['uid']}.cfg\"\n    if not os.path.exists(f_wch):\n        with open(f_wch, 'w') as file:\n            file.write(WCH_RISCV_CONTENT)\n\n    ret = run_cmd(f'openocd_wch -c \"adapter serial {flasher[\"uid\"]}\" -f {f_wch} -c \"program reset exit\"')\n    return ret\n\n\ndef flash_openocd_adi(board, firmware):\n    flasher = board['flasher']\n    ret = run_cmd(f'{OPENCOD_ADI_PATH}/src/openocd -c \"adapter serial {flasher[\"uid\"]}\" -s {OPENCOD_ADI_PATH}/tcl '\n                  f'{flasher[\"args\"]} -c \"program {firmware}.elf reset exit\"')\n    return ret\n\n\ndef reset_openocd_adi(board):\n    flasher = board['flasher']\n    ret = run_cmd(f'{OPENCOD_ADI_PATH}/src/openocd -c \"adapter serial {flasher[\"uid\"]}\" -s {OPENCOD_ADI_PATH}/tcl '\n                  f'{flasher[\"args\"]} -c \"program reset exit\"')\n    return ret\n\n\ndef flash_wlink_rs(board, firmware):\n    flasher = board['flasher']\n    # wlink use index for probe selection and lacking usb serial support\n    ret = run_cmd(f'wlink flash {firmware}.elf')\n    return ret\n\n\ndef reset_wlink_rs(board):\n    flasher = board['flasher']\n    # wlink use index for probe selection and lacking usb serial support\n    ret = run_cmd(f'wlink reset')\n    return ret\n\n\ndef flash_esptool(board, firmware):\n    flasher = board['flasher']\n    port = get_serial_dev(flasher[\"uid\"], None, None, 0)\n    fw_dir = os.path.dirname(f'{firmware}.bin')\n    with open(f'{fw_dir}/config.env') as f:\n        idf_target = json.load(f)['IDF_TARGET']\n    with open(f'{fw_dir}/flash_args') as f:\n        flash_args = f.read().strip().replace('\\n', ' ')\n    command = (f'esptool --chip {idf_target} -p {port} {flasher[\"args\"]} '\n               f'--before=default_reset --after=hard_reset write_flash {flash_args}')\n    ret = run_cmd(command, cwd=fw_dir)\n    return ret\n\n\ndef reset_esptool(board):\n    flasher = board['flasher']\n    return subprocess.CompletedProcess(args=['dummy'], returncode=0)\n\n\ndef flash_uniflash(board, firmware):\n    flasher = board['flasher']\n    ret = run_cmd(f'dslite.sh {flasher[\"args\"]} -f {firmware}.hex')\n    return ret\n\n\ndef reset_uniflash(board):\n    flasher = board['flasher']\n    return subprocess.CompletedProcess(args=['dummy'], returncode=0)\n\n\n# -------------------------------------------------------------\n# Tests: dual\n# -------------------------------------------------------------\ndef test_dual_host_info_to_device_cdc(board):\n    uid = board['uid']\n    declared_devs = [f'{d[\"vid_pid\"]}_{d[\"serial\"]}' for d in board['tests']['dev_attached']]\n    port = get_serial_dev(uid, 'TinyUSB', \"TinyUSB_Device\", 0)\n    ser = open_serial_dev(port)\n    ser.timeout = 0.1\n\n    # read until all expected devices are enumerated\n    data = b''\n    timeout = ENUM_TIMEOUT\n    while timeout > 0:\n        new_data = ser.read(ser.in_waiting or 1)\n        if new_data:\n            data += new_data\n        # check if all devices found\n        enum_dev_sn = []\n        for l in data.decode('utf-8', errors='ignore').splitlines():\n            vid_pid_sn = re.search(r'ID ([0-9a-fA-F]+):([0-9a-fA-F]+) SN (\\w+)', l)\n            if vid_pid_sn:\n                enum_dev_sn.append(f'{vid_pid_sn.group(1)}_{vid_pid_sn.group(2)}_{vid_pid_sn.group(3)}')\n        if set(declared_devs).issubset(set(enum_dev_sn)):\n            break\n        time.sleep(0.1)\n        timeout -= 0.1\n    ser.close()\n\n    if len(data) == 0:\n        assert False, 'No data from device'\n    lines = data.decode('utf-8', errors='ignore').splitlines()\n\n    enum_dev_sn = []\n    for l in lines:\n        vid_pid_sn = re.search(r'ID ([0-9a-fA-F]+):([0-9a-fA-F]+) SN (\\w+)', l)\n        if vid_pid_sn:\n            print(f'\\r\\n  {l} ', end='')\n            enum_dev_sn.append(f'{vid_pid_sn.group(1)}_{vid_pid_sn.group(2)}_{vid_pid_sn.group(3)}')\n\n    if set(declared_devs) != set(enum_dev_sn):\n        failed_msg = f'Expected {declared_devs}, Enumerated {enum_dev_sn}'\n        print('\\n'.join(lines))\n        assert False, failed_msg\n    return 0\n\n\n# -------------------------------------------------------------\n# Tests: host\n# -------------------------------------------------------------\ndef test_host_device_info(board):\n    flasher = board['flasher']\n    declared_devs = [f'{d[\"vid_pid\"]}_{d[\"serial\"]}' for d in board['tests']['dev_attached']]\n\n    port = get_serial_dev(flasher[\"uid\"], None, None, 0)\n    ser = open_serial_dev(port)\n    ser.timeout = 0.1\n\n    # reset device since we can miss the first line\n    ret = globals()[f'reset_{flasher[\"name\"].lower()}'](board)\n    assert ret.returncode == 0, 'Failed to reset device'\n\n    # read until all expected devices are enumerated\n    data = b''\n    timeout = ENUM_TIMEOUT\n    while timeout > 0:\n        new_data = ser.read(ser.in_waiting or 1)\n        if new_data:\n            data += new_data\n        # check if all devices found\n        enum_dev_sn = []\n        for l in data.decode('utf-8', errors='ignore').splitlines():\n            vid_pid_sn = re.search(r'ID ([0-9a-fA-F]+):([0-9a-fA-F]+) SN (\\w+)', l)\n            if vid_pid_sn:\n                enum_dev_sn.append(f'{vid_pid_sn.group(1)}_{vid_pid_sn.group(2)}_{vid_pid_sn.group(3)}')\n        if set(declared_devs).issubset(set(enum_dev_sn)):\n            break\n        time.sleep(0.1)\n        timeout -= 0.1\n    ser.close()\n\n    if len(data) == 0:\n        assert False, 'No data from device'\n    lines = data.decode('utf-8', errors='ignore').splitlines()\n\n    enum_dev_sn = []\n    for l in lines:\n        vid_pid_sn = re.search(r'ID ([0-9a-fA-F]+):([0-9a-fA-F]+) SN (\\w+)', l)\n        if vid_pid_sn:\n            print(f'\\r\\n  {l} ', end='')\n            enum_dev_sn.append(f'{vid_pid_sn.group(1)}_{vid_pid_sn.group(2)}_{vid_pid_sn.group(3)}')\n\n    if set(declared_devs) != set(enum_dev_sn):\n        failed_msg = f'Expected {declared_devs}, Enumerated {enum_dev_sn}'\n        print('\\n'.join(lines))\n        assert False, failed_msg\n    return 0\n\n\ndef print_msc_info(lines):\n    \"\"\"Print MSC inquiry and disk size on a single line\"\"\"\n    inquiry = ''\n    disk_size = ''\n    for l in lines:\n        if re.match(r'^[A-Za-z].*\\s+rev\\s+', l):\n            inquiry = l.strip()\n        if 'Disk Size' in l:\n            disk_size = l.strip()\n    if inquiry or disk_size:\n        print(f'\\r\\n  {inquiry} {disk_size} ', end='')\n\n\ndef test_host_cdc_msc_hid(board):\n    flasher = board['flasher']\n    dev_attached = board['tests'].get('dev_attached', [])\n    cdc_devs = [d for d in dev_attached if d.get('is_cdc')]\n    msc_devs = [d for d in dev_attached if d.get('is_msc')]\n    if not cdc_devs and not msc_devs:\n        return\n\n    port = get_serial_dev(flasher[\"uid\"], None, None, 0)\n    ser = open_serial_dev(port)\n    ser.timeout = 0.1\n\n    # reset device to catch mount messages\n    ret = globals()[f'reset_{flasher[\"name\"].lower()}'](board)\n    assert ret.returncode == 0, 'Failed to reset device'\n\n    # Wait for all expected mount messages\n    data = b''\n    timeout = ENUM_TIMEOUT\n    wait_cdc = len(cdc_devs) > 0\n    wait_msc = len(msc_devs) > 0\n    while timeout > 0:\n        new_data = ser.read(ser.in_waiting or 1)\n        if new_data:\n            data += new_data\n            cdc_ok = (not wait_cdc) or (b'CDC Interface is mounted' in data)\n            msc_ok = (not wait_msc) or (b'Disk Size' in data)\n            if cdc_ok and msc_ok:\n                break\n        time.sleep(0.1)\n        timeout -= 0.1\n\n    # Lookup serial chip name from vid_pid\n    vid_pid_name = {\n        '0403_6001': 'FTDI', '0403_6010': 'FTDI', '0403_6011': 'FTDI', '0403_6014': 'FTDI',\n        '10c4_ea60': 'CP210x', '10c4_ea70': 'CP210x',\n        '067b_2303': 'PL2303', '067b_23a3': 'PL2303',\n        '1a86_7523': 'CH340', '1a86_7522': 'CH340',\n        '1a86_55d3': 'CH9102', '1a86_55d4': 'CH9102',\n    }\n\n    lines = data.decode('utf-8', errors='ignore').splitlines()\n\n    # Verify and print CDC mount\n    if cdc_devs:\n        assert b'CDC Interface is mounted' in data, 'CDC device not mounted on host'\n        dev = cdc_devs[0]\n        chip_name = vid_pid_name.get(dev['vid_pid'], dev['vid_pid'])\n        for l in lines:\n            if 'CDC Interface is mounted' in l:\n                print(f'\\r\\n  {chip_name}: {l} ', end='')\n\n    # Verify and print MSC mount (inquiry + disk size)\n    if msc_devs:\n        assert b'MassStorage device is mounted' in data, 'MSC device not mounted on host'\n        assert b'Disk Size' in data, 'MSC Disk Size not reported'\n        print_msc_info(lines)\n\n    # CDC echo test via flasher serial\n    if not cdc_devs:\n        ser.close()\n        return\n\n    time.sleep(2)\n    ser.reset_input_buffer()\n\n    def rand_ascii(length):\n        return \"\".join(random.choices(string.ascii_letters + string.digits, k=length)).encode(\"ascii\")\n\n    sizes = [8, 32, 64, 128]\n    for size in sizes:\n        test_data = rand_ascii(size)\n        ser.reset_input_buffer()\n\n        # Write byte-by-byte with delay to avoid UART overrun\n        for b in test_data:\n            ser.write(bytes([b]))\n            ser.flush()\n            time.sleep(0.001)\n\n        # Read echo back with timeout\n        echo = b''\n        t = 5.0\n        while t > 0 and len(echo) < size:\n            rd = ser.read(max(1, ser.in_waiting))\n            if rd:\n                echo += rd\n            time.sleep(0.05)\n            t -= 0.05\n        assert echo == test_data, (f'CDC echo wrong data ({size} bytes):\\n'\n                                   f'  expected: {test_data}\\n  received: {echo}')\n\n    ser.close()\n\n\ndef test_host_msc_file_explorer(board):\n    flasher = board['flasher']\n    msc_devs = [d for d in board['tests'].get('dev_attached', []) if d.get('is_msc')]\n    if not msc_devs:\n        return\n\n    port = get_serial_dev(flasher[\"uid\"], None, None, 0)\n    ser = open_serial_dev(port)\n    ser.timeout = 0.1\n\n    # reset device to catch mount messages\n    ret = globals()[f'reset_{flasher[\"name\"].lower()}'](board)\n    assert ret.returncode == 0, 'Failed to reset device'\n\n    # Wait for MSC mount (Disk Size message)\n    data = b''\n    timeout = ENUM_TIMEOUT\n    while timeout > 0:\n        new_data = ser.read(ser.in_waiting or 1)\n        if new_data:\n            data += new_data\n            if b'Disk Size' in data:\n                break\n        time.sleep(0.1)\n        timeout -= 0.1\n    assert b'Disk Size' in data, 'MSC device not mounted'\n    lines = data.decode('utf-8', errors='ignore').splitlines()\n    print_msc_info(lines)\n\n    # Send \"cat README.TXT\" and read response\n    time.sleep(1)\n    ser.reset_input_buffer()\n    for ch in 'cat README.TXT\\r':\n        ser.write(ch.encode())\n        ser.flush()\n        time.sleep(0.002)\n\n    # Read response\n    resp = b''\n    t = 10.0\n    while t > 0:\n        rd = ser.read(max(1, ser.in_waiting))\n        if rd:\n            resp += rd\n        # wait for prompt after command output\n        if b'>' in resp and resp.rstrip().endswith(b'>'):\n            break\n        time.sleep(0.05)\n        t -= 0.05\n\n    # Verify response contains README content\n    resp_text = resp.decode('utf-8', errors='ignore')\n    assert MSC_README_TXT.decode() in resp_text, (f'MSC README.TXT not found in response:\\n'\n                                                   f'  received: {resp_text}')\n    print('README.TXT matched ', end='')\n\n    ser.close()\n\n\n# -------------------------------------------------------------\n# Tests: device\n# -------------------------------------------------------------\ndef test_device_board_test(board):\n    # Dummy test\n    pass\n\n\ndef test_device_cdc_dual_ports(board):\n    uid = board['uid']\n    port = [\n        get_serial_dev(uid, 'TinyUSB', \"TinyUSB_Device\", 0),\n        get_serial_dev(uid, 'TinyUSB', \"TinyUSB_Device\", 2)\n    ]\n    ser = [open_serial_dev(p) for p in port]\n\n    def rand_ascii(length):\n        return \"\".join(random.choices(string.ascii_letters + string.digits, k=length)).encode(\"ascii\")\n\n    sizes = [32, 64, 128, 256, 512, random.randint(2000, 5000)]\n\n    def write_and_check(writer, payload):\n        payload_len = len(payload)\n        for s in ser:\n            s.reset_input_buffer()\n        rd0 = b''\n        rd1 = b''\n        offset = 0\n        # Write in chunks of random 1-64 bytes (device has 64-byte buffer)\n        while offset < payload_len:\n            chunk_size = min(random.randint(1, 64), payload_len - offset)\n            ser[writer].write(payload[offset:offset + chunk_size])\n            ser[writer].flush()\n            rd0 += ser[0].read(chunk_size)\n            rd1 += ser[1].read(chunk_size)\n            offset += chunk_size\n        assert rd0 == payload.lower(), f'Port0 wrong data ({payload_len}): expected {payload.lower()}... was {rd0}'\n        assert rd1 == payload.upper(), f'Port1 wrong data ({payload_len}): expected {payload.upper()}... was {rd1}'\n\n    for size in sizes:\n        payload0 = rand_ascii(size)\n        write_and_check(0, payload0)\n\n        payload1 = rand_ascii(size)\n        write_and_check(1, payload1)\n    ser[0].close()\n    ser[1].close()\n\n\ndef test_device_cdc_msc(board):\n    uid = board['uid']\n    # CDC Echo test\n    port = get_serial_dev(uid, 'TinyUSB', \"TinyUSB_Device\", 0)\n    ser = open_serial_dev(port)\n\n    def rand_ascii(length):\n        return \"\".join(random.choices(string.ascii_letters + string.digits, k=length)).encode(\"ascii\")\n\n    sizes = [32, 64, 128, 256, 512, random.randint(2000, 5000)]\n    for size in sizes:\n        test_str = rand_ascii(size)\n        rd_str = b''\n        offset = 0\n        # Write in chunks of random 1-64 bytes (device has 64-byte buffer)\n        while offset < size:\n            chunk_size = min(random.randint(1, 64), size - offset)\n            ser.write(test_str[offset:offset + chunk_size])\n            ser.flush()\n            rd_str += ser.read(chunk_size)\n            offset += chunk_size\n        assert rd_str == test_str, f'CDC wrong data ({size} bytes):\\n  expected: {test_str}\\n  received: {rd_str}'\n    ser.close()\n\n    # MSC Block test\n    data = read_disk_file(uid, 0, 'README.TXT')\n    assert data == MSC_README_TXT, f'MSC wrong data in README.TXT\\n expected: {MSC_README_TXT.decode()}\\n received: {data.decode()}'\n\n\ndef test_device_cdc_msc_freertos(board):\n    test_device_cdc_msc(board)\n\n\ndef test_device_dfu(board):\n    uid = board['uid']\n\n    # Wait device enum\n    timeout = ENUM_TIMEOUT\n    while timeout > 0:\n        ret = run_cmd(f'dfu-util -l')\n        stdout = ret.stdout.decode()\n        if f'serial=\"{uid}\"' in stdout and 'Found DFU: [cafe:4000]' in stdout:\n            break\n        time.sleep(1)\n        timeout = timeout - 1\n\n    assert timeout > 0, 'Device not available'\n\n    f_dfu0 = f'dfu0_{uid}'\n    f_dfu1 = f'dfu1_{uid}'\n\n    # Test upload\n    try:\n        os.remove(f_dfu0)\n        os.remove(f_dfu1)\n    except OSError:\n        pass\n\n    ret = run_cmd(f'dfu-util -S {uid} -a 0 -U {f_dfu0}')\n    assert ret.returncode == 0, 'Upload failed'\n\n    ret = run_cmd(f'dfu-util -S {uid} -a 1 -U {f_dfu1}')\n    assert ret.returncode == 0, 'Upload failed'\n\n    with open(f_dfu0) as f:\n        assert 'Hello world from TinyUSB DFU! - Partition 0' in f.read(), 'Wrong uploaded data'\n\n    with open(f_dfu1) as f:\n        assert 'Hello world from TinyUSB DFU! - Partition 1' in f.read(), 'Wrong uploaded data'\n\n    os.remove(f_dfu0)\n    os.remove(f_dfu1)\n\n\ndef test_device_dfu_runtime(board):\n    uid = board['uid']\n    # Wait device enum\n    timeout = ENUM_TIMEOUT\n    while timeout > 0:\n        ret = run_cmd(f'dfu-util -l')\n        stdout = ret.stdout.decode()\n        if f'serial=\"{uid}\"' in stdout and 'Found Runtime: [cafe:4000]' in stdout:\n            break\n        time.sleep(1)\n        timeout = timeout - 1\n\n    assert timeout > 0, 'Device not available'\n\n\ndef test_device_hid_boot_interface(board):\n    uid = board['uid']\n    kbd = get_hid_dev(uid, 'TinyUSB', 'TinyUSB_Device', 'event-kbd')\n    mouse1 = get_hid_dev(uid, 'TinyUSB', 'TinyUSB_Device', 'if01-event-mouse')\n    mouse2 = get_hid_dev(uid, 'TinyUSB', 'TinyUSB_Device', 'if01-mouse')\n    # Wait device enum\n    timeout = ENUM_TIMEOUT\n    while timeout > 0:\n        if os.path.exists(kbd) and os.path.exists(mouse1) and os.path.exists(mouse2):\n            break\n        time.sleep(1)\n        timeout = timeout - 1\n\n    assert timeout > 0, 'HID device not available'\n\n\ndef test_device_hid_composite_freertos(id):\n    # TODO implement later\n    pass\n\n\ndef test_device_printer_to_cdc(board):\n    import threading\n\n    uid = board['uid']\n\n    # Wait for CDC port and printer device\n    cdc_port = get_serial_dev(uid, 'TinyUSB', \"TinyUSB_Device\", 0)\n    ser = open_serial_dev(cdc_port)\n    lp_dev = open_printer_dev(uid, 'TinyUSB', 'TinyUSB_Device', 2)\n\n    # Test 0: Verify IEEE 1284 Device ID from sysfs\n    expected_id = 'MFG:TinyUSB;MDL:Printer to CDC;CMD:PS;CLS:PRINTER;'\n    lp_name = os.path.basename(lp_dev)\n    sysfs_id_path = f'/sys/class/usbmisc/{lp_name}/device/ieee1284_id'\n    if os.path.exists(sysfs_id_path):\n        with open(sysfs_id_path) as f:\n            ieee1284_id = f.read().strip()\n        if ieee1284_id:\n            assert ieee1284_id == expected_id, (f'IEEE 1284 ID mismatch:\\n'\n                                                f'  expected: {expected_id}\\n  got: {ieee1284_id}')\n\n    def rand_ascii(length):\n        return \"\".join(random.choices(string.ascii_letters + string.digits, k=length)).encode(\"ascii\")\n\n    sizes = [32, 64, 128, 256, 512, random.randint(2000, 5000)]\n\n    # flush any stale data\n    ser.reset_input_buffer()\n\n    # Test 1: Printer -> CDC with multiple sizes, write in random 1-64 byte chunks\n    for size in sizes:\n        test_data = rand_ascii(size)\n        ser.reset_input_buffer()\n        rd = b''\n        offset = 0\n        with open(lp_dev, 'wb') as lp:\n            while offset < size:\n                chunk_size = min(random.randint(1, 64), size - offset)\n                lp.write(test_data[offset:offset + chunk_size])\n                lp.flush()\n                rd += ser.read(chunk_size)\n                offset += chunk_size\n        # read any remaining bytes (fullspeed devices may need extra time)\n        while len(rd) < size:\n            remaining = ser.read(size - len(rd))\n            if not remaining:\n                break\n            rd += remaining\n        assert rd == test_data, (f'Printer->CDC wrong data ({size} bytes):\\n'\n                                 f'  expected: {test_data[:64]}\\n  received: {rd[:64]}')\n\n    # Test 2: CDC -> Printer with multiple sizes, write in random 1-64 byte chunks\n    # Use a thread to read from printer since /dev/usb/lp read blocks\n    ser.reset_input_buffer()\n    time.sleep(0.5)\n    for size in sizes:\n        test_data = rand_ascii(size)\n        rd_result = [b'', None]  # [data, error]\n        reader_ready = threading.Event()\n\n        def lp_reader():\n            try:\n                rd = b''\n                fd = os.open(lp_dev, os.O_RDONLY)\n                reader_ready.set()\n                try:\n                    while len(rd) < size:\n                        chunk = os.read(fd, min(64, size - len(rd)))\n                        if not chunk:\n                            break\n                        rd += chunk\n                finally:\n                    os.close(fd)\n                rd_result[0] = rd\n            except Exception as e:\n                rd_result[1] = e\n                reader_ready.set()\n\n        reader = threading.Thread(target=lp_reader, daemon=True)\n        reader.start()\n        # wait for reader to open lp device before writing\n        reader_ready.wait(timeout=5)\n        time.sleep(0.1)\n\n        # Write to CDC in small chunks with flush to avoid overflowing device FIFO\n        offset = 0\n        while offset < size:\n            chunk_size = min(random.randint(1, 64), size - offset)\n            ser.write(test_data[offset:offset + chunk_size])\n            ser.flush()\n            time.sleep(0.01)\n            offset += chunk_size\n\n        reader.join(timeout=10)\n        assert not reader.is_alive(), f'CDC->Printer timeout ({size} bytes)'\n        assert rd_result[1] is None, f'CDC->Printer read error: {rd_result[1]}'\n        assert rd_result[0] == test_data, (f'CDC->Printer wrong data ({size} bytes):\\n'\n                                           f'  expected: {test_data[:64]}\\n  received: {rd_result[0][:64]}')\n        time.sleep(0.2)\n\n    ser.close()\n\n\ndef test_device_mtp(board):\n    uid = board['uid']\n\n    # --- BEFORE: mute C-level stderr for libmtp vid/pid warnings ---\n    fd = sys.stderr.fileno()\n    _saved = os.dup(fd)\n    _null = os.open(os.devnull, os.O_WRONLY)\n    os.dup2(_null, fd)\n\n    mtp = open_mtp_dev(uid)\n\n    # --- AFTER: restore stderr ---\n    os.dup2(_saved, fd)\n    os.close(_null)\n    os.close(_saved)\n\n    if mtp is None or mtp.device is None:\n        assert False, 'MTP device not found'\n\n    try:\n        assert b\"TinyUSB\" == mtp.get_manufacturer(), 'MTP wrong manufacturer'\n        assert b\"MTP Example\" == mtp.get_modelname(), 'MTP wrong model'\n        assert b'1.0' == mtp.get_deviceversion(), 'MTP wrong version'\n        assert b'TinyUSB MTP' == mtp.get_devicename(), 'MTP wrong device name'\n\n        # read and compare readme.txt and logo.png\n        f1_expect = b'TinyUSB MTP Filesystem example'\n        f2_md5_expect = '40ef23fc2891018d41a05d4a0d5f822f' # md5sum of logo.png\n        f1 = uid.encode(\"utf-8\") + b'_file1'\n        f2 = uid.encode(\"utf-8\") + b'_file2'\n        f3 = uid.encode(\"utf-8\") + b'_file3'\n        mtp.get_file_to_file(1, f1)\n        with open(f1, 'rb') as file:\n            f1_data = file.read()\n            os.remove(f1)\n            assert f1_data == f1_expect, 'MTP file1 wrong data'\n        mtp.get_file_to_file(2, f2)\n        with open(f2, 'rb') as file:\n            f2_data = file.read()\n            os.remove(f2)\n            assert f2_md5_expect == hashlib.md5(f2_data).hexdigest(), 'MTP file2 wrong data'\n        # test send file\n        with open(f3, \"wb\") as file:\n            f3_data = os.urandom(random.randint(1024, 3*1024))\n            file.write(f3_data)\n            file.close()\n            fid = mtp.send_file_from_file(f3, b'file3')\n            f3_readback = f3 + b'_readback'\n            mtp.get_file_to_file(fid, f3_readback)\n            with open(f3_readback, 'rb') as f:\n                f3_rb_data = f.read()\n                os.remove(f3_readback)\n                assert f3_rb_data == f3_data, 'MTP file3 wrong data'\n            os.remove(f3)\n            mtp.delete_object(fid)\n    finally:\n        mtp.disconnect()\n\n\ndef test_device_msc_dual_lun(board):\n    uid = board['uid']\n\n    # Read README from LUN 0\n    data0 = read_disk_file(uid, 0, 'README0.TXT')\n    readme0 = b\"LUN0: \" + MSC_README_TXT\n    assert data0 == readme0, f'MSC LUN0 wrong data in README0.TXT\\n  expected: {readme0}\\n  received: {data0}'\n\n    # Read README from LUN 1\n    data1 = read_disk_file(uid, 1, 'README1.TXT')\n    readme1 = b\"LUN1: \" + MSC_README_TXT\n    assert data1 == readme1, f'MSC LUN1 wrong data in README1.TXT\\n  expected: {readme1}\\n  received: {data1}'\n\n\ndef test_device_midi_test(board):\n    uid = board['uid']\n\n    # Find MIDI device via /dev/snd/by-id using board UID\n    timeout = ENUM_TIMEOUT\n    midi_port = None\n    while timeout > 0:\n        pattern = f'/dev/snd/by-id/usb-*_{uid}-*'\n        devs = glob.glob(pattern)\n        if devs:\n            # by-id entry points to controlCX, derive card number for midiCXD0\n            link = os.path.basename(os.readlink(devs[0]))  # e.g. \"controlC2\"\n            card_num = link.replace('controlC', '')\n            midi_path = f'/dev/snd/midiC{card_num}D0'\n            if os.path.exists(midi_path):\n                midi_port = midi_path\n                break\n        time.sleep(1)\n        timeout -= 1\n    assert midi_port is not None, f'MIDI device not found for {uid}'\n\n    # Read MIDI messages and verify note on/off\n    import select\n    with open(midi_port, 'rb') as f:\n        notes = []\n        # Read for up to 3 seconds to capture a few notes (286ms interval)\n        end_time = time.time() + 3\n        while time.time() < end_time:\n            ready, _, _ = select.select([f], [], [], 0.5)\n            if ready:\n                data = f.read(64)\n                if data:\n                    # Parse MIDI bytes: note_on = 0x90, note_off = 0x80\n                    i = 0\n                    while i + 2 < len(data):\n                        status = data[i]\n                        if (status & 0xF0) == 0x90:  # Note On\n                            notes.append(data[i + 1])\n                            i += 3\n                        elif (status & 0xF0) == 0x80:  # Note Off\n                            i += 3\n                        else:\n                            i += 1\n\n    assert len(notes) >= 2, f'Expected at least 2 MIDI notes, got {len(notes)}'\n    # Verify notes are from the expected sequence\n    note_sequence = [\n        74, 78, 81, 86, 90, 93, 98, 102, 57, 61, 66, 69, 73, 78, 81, 85,\n        88, 92, 97, 100, 97, 92, 88, 85, 81, 78, 74, 69, 66, 62, 57, 62,\n        66, 69, 74, 78, 81, 86, 90, 93, 97, 102, 97, 93, 90, 85, 81, 78,\n        73, 68, 64, 61, 56, 61, 64, 68, 74, 78, 81, 86, 90, 93, 98, 102\n    ]\n    for n in notes:\n        assert n in note_sequence, f'Unexpected MIDI note {n}'\n\n\ndef test_device_hid_generic_inout(board):\n    uid = board['uid']\n    import hid\n\n    # Find HID device by UID (VID=0xCafe)\n    timeout = ENUM_TIMEOUT\n    dev = None\n    while timeout > 0:\n        for d in hid.enumerate(0xCafe):\n            if d['serial_number'] == uid:\n                dev = d\n                break\n        if dev:\n            break\n        time.sleep(1)\n        timeout -= 1\n    assert dev is not None, f'HID device not found for {uid}'\n\n    h = hid.Device(vid=dev['vendor_id'], pid=dev['product_id'], serial=uid)\n\n    # Echo test: send random data and verify echo\n    for size in [8, 32, 63]:\n        # Report ID (0) + payload, padded to 64 bytes\n        payload = bytes([random.randint(1, 255) for _ in range(size)])\n        report = bytes([0]) + payload + bytes(64 - size)\n        h.write(report)\n        echo = h.read(64, timeout=2000)\n        assert echo is not None and len(echo) >= size, (\n            f'HID echo timeout or short read ({size} bytes)')\n        assert bytes(echo[:size]) == payload, (\n            f'HID echo wrong data ({size} bytes):\\n'\n            f'  expected: {payload.hex()}\\n  received: {bytes(echo[:size]).hex()}')\n\n    h.close()\n\n\n# -------------------------------------------------------------\n# Main\n# -------------------------------------------------------------\n# device tests\n# note don't test 2 examples with cdc or 2 msc next to each other\ndevice_tests = [\n    'device/cdc_dual_ports',\n    'device/dfu',\n    'device/cdc_msc',\n    'device/dfu_runtime',\n    'device/cdc_msc_freertos',\n    'device/hid_boot_interface',\n    'device/msc_dual_lun',\n    'device/hid_generic_inout',\n    'device/printer_to_cdc',\n    'device/midi_test',\n    'device/mtp'\n]\n\ndual_tests = [\n    'dual/host_info_to_device_cdc',\n]\n\nhost_test = [\n    'host/cdc_msc_hid',\n    'host/msc_file_explorer',\n    'host/device_info',\n]\n\n\ndef test_example(board, f1, example):\n    \"\"\"\n    Test example firmware\n    :param board: board dict\n    :param f1: flags on\n    :param example: example name\n    :return: 0 if success/skip, 1 if failed\n    \"\"\"\n    name = board['name']\n    err_count = 0\n\n    f1_str = \"\"\n    if f1 != \"\":\n        f1_str = '-f1_' + f1.replace(' ', '_')\n\n    fw_dir = f'{TINYUSB_ROOT}/{build_dir}/cmake-build-{name}{f1_str}/{example}'\n    fw_name = f'{fw_dir}/{os.path.basename(example)}'\n    print(f'{name+f1_str:40} {example:30} ...', end='')\n\n    if not os.path.exists(fw_dir) or not (os.path.exists(f'{fw_name}.elf') or os.path.exists(f'{fw_name}.bin')):\n        print('Skip (no binary)')\n        return 0\n\n    if verbose:\n        print(f'Flashing {fw_name}.elf')\n\n    # flash firmware. It may fail randomly, retry a few times\n    max_rety = 3\n    start_s = time.time()\n    for i in range(max_rety):\n        ret = globals()[f'flash_{board[\"flasher\"][\"name\"].lower()}'](board, fw_name)\n        if ret.returncode == 0:\n            try:\n                globals()[f'test_{example.replace(\"/\", \"_\")}'](board)\n                print('  OK', end='')\n                break\n            except Exception as e:\n                if i == max_rety - 1:\n                    err_count += 1\n                    print(f'{STATUS_FAILED}: {e}')\n                else:\n                    print(f'\\n  Test failed: {e}, retry {i+2}/{max_rety}', end='')\n                    time.sleep(0.5)\n        else:\n            print(f'\\n  Flash failed, retry {i+2}/{max_rety}', end='')\n            time.sleep(0.5)\n\n    if ret.returncode != 0:\n        err_count += 1\n        print(f'  Flash {STATUS_FAILED}', end='')\n\n    print(f'  in {time.time() - start_s:.1f}s')\n\n    return err_count\n\n\ndef test_board(board):\n    name = board['name']\n    flasher = board['flasher']\n\n    # default to all tests\n    test_list = []\n\n    if len(test_only) > 0:\n        test_list = test_only\n    else:\n        if 'tests' in board:\n            board_tests = board['tests']\n            if 'device' in board_tests and board_tests['device'] == True:\n                test_list += list(device_tests)\n            if 'dual' in board_tests and board_tests['dual'] == True:\n                test_list += dual_tests\n            if 'host' in board_tests and board_tests['host'] == True:\n                test_list += host_test\n            if 'only' in board_tests:\n                test_list = board_tests['only']\n            if 'skip' in board_tests:\n                for skip in board_tests['skip']:\n                    if skip in test_list:\n                        test_list.remove(skip)\n                        print(f'{name:25} {skip:30} ... Skip')\n\n    err_count = 0\n    flags_on_list = [\"\"]\n    if 'build' in board and 'flags_on' in board['build']:\n        flags_on_list = board['build']['flags_on']\n\n    for f1 in flags_on_list:\n        for test in test_list:\n            err_count += test_example(board, f1, test)\n\n    # flash board_test last to disable board's usb\n    test_example(board, flags_on_list[0], 'device/board_test')\n\n    return name, err_count\n\n\ndef main():\n    \"\"\"\n    Hardware test on specified boards\n    \"\"\"\n    global verbose\n    global test_only\n    global build_dir\n\n    duration = time.time()\n\n    parser = argparse.ArgumentParser()\n    parser.add_argument('config_file', help='Configuration JSON file')\n    parser.add_argument('-b', '--board', action='append', default=[], help='Boards to test, all if not specified')\n    parser.add_argument('-s', '--skip', action='append', default=[], help='Skip boards from test')\n    parser.add_argument('-t', '--test-only', action='append', default=[], help='Tests to run, all if not specified')\n    parser.add_argument('-B', '--build', default='cmake-build', help='Build folder name (default: cmake-build)')\n    parser.add_argument('-v', '--verbose', action='store_true', help='Verbose output')\n    args = parser.parse_args()\n\n    config_file = args.config_file\n    boards = args.board\n    skip_boards = args.skip\n    verbose = args.verbose\n    test_only = args.test_only\n    build_dir = args.build\n\n    # if config file is not found, try to find it in the same directory as this script\n    if not os.path.exists(config_file):\n        config_file = os.path.join(os.path.dirname(__file__), config_file)\n    with open(config_file) as f:\n        config = json.load(f)\n\n    if len(boards) == 0:\n        config_boards = [e for e in config['boards'] if e['name'] not in skip_boards]\n    else:\n        config_boards = [e for e in config['boards'] if e['name'] in boards]\n\n    err_count = 0\n    with Pool(processes=os.cpu_count()) as pool:\n        mret = pool.map(test_board, config_boards)\n        err_count = sum(e[1] for e in mret)\n        # generate skip list for next re-run if failed\n        skip_fname = f'{config_file}.skip'\n        if err_count > 0:\n            skip_boards += [name for name, err in mret if err == 0]\n            with open(skip_fname, 'w') as f:\n                f.write(' '.join(f'-s {i}' for i in skip_boards))\n        elif os.path.exists(skip_fname):\n            os.remove(skip_fname)\n\n    duration = time.time() - duration\n    print()\n    print(\"-\" * 30)\n    print(f'Total failed: {err_count} in {duration:.1f}s')\n    print(\"-\" * 30)\n    sys.exit(err_count)\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "test/hil/pymtp.py",
    "content": "#!/usr/bin/env python\n#\n# A Ctypes wrapper to LibMTP\n# Developed by: Nick Devito (nick@nick125.com)\n# (c) 2008 Nick Devito\n# Released under the GPLv3 or later.\n#\n\n\"\"\"\n\tPyMTP is a pythonic wrapper around libmtp, making it a bit more\n\tfriendly to use in python\n\n\tExample Usage (or see examples/):\n\t\t>>> import pymtp\n\t\t>>> mtp = pymtp.MTP()\n\t        >>> mtp.connect()\n\t\tPTP: Opening session\n\t        >>> print mtp.get_devicename()\n\t        Device name\n\t        >>> mtp.disconnect()\n\t\tPTP: Closing session\n\t\t>>>\n\"\"\"\n\n__VERSION__ = \"0.0.5\"\n__VERSION_MACRO__ = 5\n__VERSION_MINOR__ = 0\n__VERSION_MAJOR__ = 0\n__VERSION_TUPLE__ = (__VERSION_MAJOR__, __VERSION_MINOR__, __VERSION_MACRO__)\n__AUTHOR__ = \"Nick Devito (nick@nick125.com)\"\n__LICENSE__ = \"GPL-3\"\n__DEBUG__ = 1\n\nimport os\nimport ctypes\nimport ctypes.util\n\n# NOTE: This code *may* work on windows, I don't have a win32 system to test\n# this on.\n_module_path = ctypes.util.find_library(\"mtp\")\n_libmtp = ctypes.CDLL(_module_path)\n\n# ----------\n# Error Definitions\n# ----------\nclass NoDeviceConnected(Exception):\n\t\"\"\"\n\t\tRaised when there isn't a device connected to the USB bus\n\t\"\"\"\n\n\tpass\n\nclass AlreadyConnected(Exception):\n\t\"\"\"\n\t\tRaised when we're already connected to a device and there is\n\t\tan attempt to connect\n\t\"\"\"\n\n\tpass\n\nclass UnsupportedCommand(Exception):\n\t\"\"\"\n\t\tRaised when the connected device does not support the command\n\t\tissued\n\t\"\"\"\n\n\tpass\n\nclass CommandFailed(Exception):\n\t\"\"\"\n\t\tRaised when the connected device returned an error when trying\n\t\tto execute a command\n\t\"\"\"\n\n\tpass\n\nclass NotConnected(Exception):\n\t\"\"\"\n\t\tRaised when a command is called and the device is not connected\n\t\"\"\"\n\n\tpass\n\nclass ObjectNotFound(Exception):\n\t\"\"\"\n\t\tRaised when a command tries to get an object that doesn't exist\n\t\"\"\"\n\n\tpass\n\n# ----------\n# End Error Definitions\n# ----------\n\n# ----------\n# Data Model Definitions\n# ----------\n\nclass LIBMTP_Error(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_Error\n\t\tContains the ctypes structure for LIBMTP_error_t\n\t\"\"\"\n\n\tdef __repr__(self):\n\t\treturn self.errornumber\n\nLIBMTP_Error._fields_ = [(\"errornumber\", ctypes.c_int),\n                         (\"error_text\", ctypes.c_char_p),\n                         (\"next\", ctypes.POINTER(LIBMTP_Error))]\n\nclass LIBMTP_DeviceStorage(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_DeviceStorage\n\t\tContains the ctypes structure for LIBMTP_devicestorage_t\n\t\"\"\"\n\n\tdef __repr__(self):\n\t\treturn self.id\n\nLIBMTP_DeviceStorage._fields_ = [(\"id\", ctypes.c_uint32),\n                                 (\"StorageType\", ctypes.c_uint16),\n                                 (\"FilesystemType\", ctypes.c_uint16),\n                                 (\"AccessCapability\", ctypes.c_uint16),\n                                 (\"MaxCapacity\", ctypes.c_uint64),\n                                 (\"FreeSpaceInBytes\", ctypes.c_uint64),\n                                 (\"FreeSpaceInObjects\", ctypes.c_uint64),\n                                 (\"StorageDescription\", ctypes.c_char_p),\n                                 (\"VolumeIdentifier\", ctypes.c_char_p),\n                                 (\"next\", ctypes.POINTER(LIBMTP_DeviceStorage)),\n                                 (\"prev\", ctypes.POINTER(LIBMTP_DeviceStorage))]\n\nclass LIBMTP_DeviceEntry(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_DeviceEntry\n\t\tContains the ctypes structure for LIBMTP_device_entry_t\n\t\"\"\"\n\n\tdef __repr__(self):\n\t\treturn self.vendor\n\nLIBMTP_DeviceEntry._fields_ = [(\"vendor\", ctypes.c_char_p),\n\t\t\t       (\"vendor_id\", ctypes.c_uint16),\n\t\t\t       (\"product\", ctypes.c_char_p),\n\t\t\t       (\"product_id\", ctypes.c_uint16),\n\t\t\t       (\"device_flags\", ctypes.c_uint32)]\n\nclass LIBMTP_RawDevice(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_RawDevice\n\t\tContains the ctypes structure for LIBMTP_raw_device_t\n\t\"\"\"\n\n\tdef __repr__(self):\n\t\treturn self.device_entry\n\nLIBMTP_RawDevice._fields_ = [(\"device_entry\", LIBMTP_DeviceEntry),\n\t\t\t     (\"bus_location\", ctypes.c_uint32),\n\t\t\t     (\"devnum\", ctypes.c_uint8)]\n\nclass LIBMTP_MTPDevice(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_MTPDevice\n\t\tContains the ctypes structure for LIBMTP_mtpdevice_t\n\t\"\"\"\n\n\tdef __repr__(self):\n\t\treturn self.interface_number\n\nLIBMTP_MTPDevice._fields_ = [(\"interface_number\", ctypes.c_uint8),\n                             (\"params\", ctypes.c_void_p),\n                             (\"usbinfo\", ctypes.c_void_p),\n                             (\"storage\", ctypes.POINTER(LIBMTP_DeviceStorage)),\n                             (\"errorstack\", ctypes.POINTER(LIBMTP_Error)),\n                             (\"maximum_battery_level\", ctypes.c_uint8),\n                             (\"default_music_folder\", ctypes.c_uint32),\n                             (\"default_playlist_folder\", ctypes.c_uint32),\n                             (\"default_picture_folder\", ctypes.c_uint32),\n                             (\"default_video_folder\", ctypes.c_uint32),\n                             (\"default_organizer_folder\", ctypes.c_uint32),\n                             (\"default_zencast_folder\", ctypes.c_uint32),\n                             (\"default_album_folder\", ctypes.c_uint32),\n                             (\"default_text_folder\", ctypes.c_uint32),\n                             (\"cd\", ctypes.c_void_p),\n                             (\"next\", ctypes.POINTER(LIBMTP_MTPDevice))]\n\nclass LIBMTP_File(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_File\n\t\tContains the ctypes structure for LIBMTP_file_t\n\t\"\"\"\n\n\tdef __repr__(self):\n\t\treturn \"%s (%s)\" % (self.filename, self.item_id)\n\nLIBMTP_File._fields_ = [(\"item_id\", ctypes.c_uint32),\n                        (\"parent_id\", ctypes.c_uint32),\n                        (\"storage_id\", ctypes.c_uint32),\n                        (\"filename\", ctypes.c_char_p),\n                        (\"filesize\", ctypes.c_uint64),\n                        (\"modificationdate\", ctypes.c_uint64),\n\t\t\t(\"filetype\", ctypes.c_int), # LIBMTP_filetype_t enum\n\t\t\t(\"next\", ctypes.POINTER(LIBMTP_File))]\n\nclass LIBMTP_Track(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_Track\n\t\tContains the ctypes structure for LIBMTP_track_t\n\t\"\"\"\n\n\tdef __repr__(self):\n\t\treturn \"%s - %s (%s)\" % (self.artist, self.title, self.item_id)\n\nLIBMTP_Track._fields_ = [(\"item_id\", ctypes.c_uint32),\n\t\t\t(\"parent_id\", ctypes.c_uint32),\n                        (\"storage_id\", ctypes.c_uint32),\n\t\t\t(\"title\", ctypes.c_char_p),\n\t\t\t(\"artist\", ctypes.c_char_p),\n\t\t\t(\"composer\", ctypes.c_char_p),\n\t\t\t(\"genre\", ctypes.c_char_p),\n\t\t\t(\"album\", ctypes.c_char_p),\n\t\t\t(\"date\", ctypes.c_char_p),\n\t\t\t(\"filename\", ctypes.c_char_p),\n\t\t\t(\"tracknumber\", ctypes.c_uint16),\n\t\t\t(\"duration\", ctypes.c_uint32),\n\t\t\t(\"samplerate\", ctypes.c_uint32),\n\t\t\t(\"nochannels\", ctypes.c_uint16),\n\t\t\t(\"wavecodec\", ctypes.c_uint32),\n\t\t\t(\"bitrate\", ctypes.c_uint32),\n\t\t\t(\"bitratetype\", ctypes.c_uint16),\n\t\t\t(\"rating\", ctypes.c_uint16),\n\t\t\t(\"usecount\", ctypes.c_uint32),\n\t\t\t(\"filesize\", ctypes.c_uint64),\n                        (\"modificationdate\", ctypes.c_uint64),\n\t\t\t(\"filetype\", ctypes.c_int), # LIBMTP_filetype_t enum\n\t\t\t(\"next\", ctypes.POINTER(LIBMTP_Track))]\n\nclass LIBMTP_Playlist(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_Playlist\n\t\tContains the ctypes structure for LIBMTP_playlist_t\n\t\"\"\"\n\n\tdef __init__(self):\n\t\tself.tracks = ctypes.pointer(ctypes.c_uint32(0))\n\t\tself.no_tracks = ctypes.c_uint32(0)\n\tdef __repr__(self):\n\t\treturn \"%s (%s)\" % (self.name, self.playlist_id)\n\n\tdef __iter__(self):\n\t\t\"\"\"\n\t\t\tThis allows the playlist object to act like a list with\n\t\t\ta generator.\n\t\t\"\"\"\n\t\tfor track in xrange(self.no_tracks):\n\t\t\tyield self.tracks[track]\n\n\tdef __getitem__(self, key):\n\t\t\"\"\"\n\t\t\tThis allows the playlist to return tracks like a list\n\t\t\"\"\"\n\n\t\tif (key > (self.no_tracks - 1)):\n\t\t\traise IndexError\n\n\t\treturn self.tracks[key]\n\n\tdef __setitem__(self, key, value):\n\t\t\"\"\"\n\t\t\tThis allows the user to manipulate the playlist like a\n\t\t\tlist. However, this will only modify existing objects,\n\t\t\tyou can't try to set a key outside of the current size.\n\t\t\"\"\"\n\n\t\tif (key > (self.no_tracks - 1)):\n\t\t\traise IndexError\n\n\t\tself.tracks[key] = value\n\n\tdef __delitem__(self, key):\n\t\t\"\"\"\n\t\t\tThis allows the user to delete an object\n\t\t\tfrom the playlist\n\t\t\"\"\"\n\n\t\tif (key > (self.no_tracks - 1)):\n\t\t\traise IndexError\n\n\t\tfor i in range(key, (self.no_tracks - 1)):\n\t\t\tself.tracks[i] = self.tracks[i + 1]\n\n\t\tself.no_tracks -= 1\n\n\tdef append(self, value):\n\t\t\"\"\"\n\t\t\tThis function appends a track to the end of the tracks\n\t\t\tlist.\n\t\t\"\"\"\n\t\tif (self.tracks == None):\n\t\t\tself.tracks = ctypes.pointer(ctypes.c_uint32(0))\n\n\t\tself.no_tracks += 1\n\t\tself.tracks[(self.no_tracks - 1)] = value\n\n\tdef __len__(self):\n\t\t\"\"\"\n\t\t\tThis returns the number of tracks in the playlist\n\t\t\"\"\"\n\n\t\treturn self.no_tracks\n\nLIBMTP_Playlist._fields_ = [(\"playlist_id\", ctypes.c_uint32),\n                            (\"parent_id\", ctypes.c_uint32),\n                            (\"storage_id\", ctypes.c_uint32),\n                            (\"name\", ctypes.c_char_p),\n                            (\"tracks\", ctypes.POINTER(ctypes.c_uint32)),\n                            (\"no_tracks\", ctypes.c_uint32),\n                            (\"next\", ctypes.POINTER(LIBMTP_Playlist))]\n\nclass LIBMTP_Folder(ctypes.Structure):\n\t\"\"\"\n\t\tLIBMTP_Folder\n\t\tContains the ctypes structure for LIBMTP_folder_t\n\t\"\"\"\n\n\tdef __repr__(self):\n\t\treturn \"%s (%s)\" % (self.name, self.folder_id)\n\nLIBMTP_Folder._fields_ = [(\"folder_id\", ctypes.c_uint32),\n                          (\"parent_id\", ctypes.c_uint32),\n                          (\"storage_id\", ctypes.c_uint32),\n                          (\"name\", ctypes.c_char_p),\n                          (\"sibling\", ctypes.POINTER(LIBMTP_Folder)),\n                          (\"child\", ctypes.POINTER(LIBMTP_Folder))]\n\n# Abstracted from libmtp's LIBMTP_filetype_t. This must be kept in sync.\n#  first checked in 0.2.6.1\n#  last checked in version 1.1.6\nLIBMTP_Filetype = {\n\t\"WAV\":\t\t\tctypes.c_int(0),\n\t\"MP3\":\t\t\tctypes.c_int(1),\n\t\"WMA\":\t\t\tctypes.c_int(2),\n\t\"OGG\":\t\t\tctypes.c_int(3),\n\t\"AUDIBLE\":\t\tctypes.c_int(4),\n\t\"MP4\":\t\t\tctypes.c_int(5),\n\t\"UNDEF_AUDIO\":\t\tctypes.c_int(6),\n\t\"WMV\":\t\t\tctypes.c_int(7),\n\t\"AVI\":\t\t\tctypes.c_int(8),\n\t\"MPEG\":\t\t\tctypes.c_int(9),\n\t\"ASF\":\t\t\tctypes.c_int(10),\n\t\"QT\":\t\t\tctypes.c_int(11),\n\t\"UNDEF_VIDEO\":\t\tctypes.c_int(12),\n\t\"JPEG\":\t\t\tctypes.c_int(13),\n\t\"JFIF\":\t\t\tctypes.c_int(14),\n\t\"TIFF\":\t\t\tctypes.c_int(15),\n\t\"BMP\":\t\t\tctypes.c_int(16),\n\t\"GIF\":\t\t\tctypes.c_int(17),\n\t\"PICT\":\t\t\tctypes.c_int(18),\n\t\"PNG\":\t\t\tctypes.c_int(19),\n\t\"VCALENDAR1\":\t\tctypes.c_int(20),\n\t\"VCALENDAR2\":\t\tctypes.c_int(21),\n\t\"VCARD2\":\t\tctypes.c_int(22),\n\t\"VCARD3\":\t\tctypes.c_int(23),\n\t\"WINDOWSIMAGEFORMAT\":\tctypes.c_int(24),\n\t\"WINEXEC\":\t\tctypes.c_int(25),\n\t\"TEXT\":\t\t\tctypes.c_int(26),\n\t\"HTML\":\t\t\tctypes.c_int(27),\n\t\"FIRMWARE\":\t\tctypes.c_int(28),\n\t\"AAC\":\t\t\tctypes.c_int(29),\n\t\"MEDIACARD\":\t\tctypes.c_int(30),\n\t\"FLAC\":\t\t\tctypes.c_int(31),\n\t\"MP2\":\t\t\tctypes.c_int(32),\n\t\"M4A\":\t\t\tctypes.c_int(33),\n\t\"DOC\":\t\t\tctypes.c_int(34),\n\t\"XML\":\t\t\tctypes.c_int(35),\n\t\"XLS\":\t\t\tctypes.c_int(36),\n\t\"PPT\":\t\t\tctypes.c_int(37),\n\t\"MHT\":\t\t\tctypes.c_int(38),\n\t\"JP2\":\t\t\tctypes.c_int(39),\n\t\"JPX\":\t\t\tctypes.c_int(40),\n\t\"ALBUM\":\t\tctypes.c_int(41),\n\t\"PLAYLIST\":\t\tctypes.c_int(42),\n\t\"UNKNOWN\":\t\tctypes.c_int(43),\n}\n\n# Synced from libmtp 0.2.6.1's libmtp.h. Must be kept in sync.\nLIBMTP_Error_Number = {\n\t\"NONE\":\t\t\tctypes.c_int(0),\n\t\"GENERAL\":\t\tctypes.c_int(1),\n\t\"PTP_LAYER\":\t\tctypes.c_int(2),\n\t\"USB_LAYER\":\t\tctypes.c_int(3),\n\t\"MEMORY_ALLOCATION\":\tctypes.c_int(4),\n\t\"NO_DEVICE_ATTACHED\":\tctypes.c_int(5),\n\t\"STORAGE_FULL\":\t\tctypes.c_int(6),\n\t\"CONNECTING\":\t\tctypes.c_int(7),\n\t\"CANCELLED\":\t\tctypes.c_int(8),\n}\n\n# ----------\n# End Data Model Definitions\n# ----------\n\n# ----------\n# Type Definitions\n# ----------\n_libmtp.LIBMTP_Detect_Raw_Devices.restype = ctypes.c_int # actually LIBMTP_Error_Number enum\n_libmtp.LIBMTP_Get_Friendlyname.restype = ctypes.c_char_p\n_libmtp.LIBMTP_Get_Serialnumber.restype = ctypes.c_char_p\n_libmtp.LIBMTP_Get_Modelname.restype = ctypes.c_char_p\n_libmtp.LIBMTP_Get_Manufacturername.restype = ctypes.c_char_p\n_libmtp.LIBMTP_Get_Deviceversion.restype = ctypes.c_char_p\n_libmtp.LIBMTP_Get_Filelisting_With_Callback.restype = ctypes.POINTER(LIBMTP_File)\n_libmtp.LIBMTP_Get_Tracklisting_With_Callback.restype = ctypes.POINTER(LIBMTP_Track)\n_libmtp.LIBMTP_Get_Filetype_Description.restype = ctypes.c_char_p\n_libmtp.LIBMTP_Get_Filemetadata.restype = ctypes.POINTER(LIBMTP_File)\n_libmtp.LIBMTP_Get_Trackmetadata.restype = ctypes.POINTER(LIBMTP_Track)\n_libmtp.LIBMTP_Get_First_Device.restype = ctypes.POINTER(LIBMTP_MTPDevice)\n_libmtp.LIBMTP_Get_Playlist_List.restype = ctypes.POINTER(LIBMTP_Playlist)\n_libmtp.LIBMTP_Get_Playlist.restype = ctypes.POINTER(LIBMTP_Playlist)\n_libmtp.LIBMTP_Get_Folder_List.restype = ctypes.POINTER(LIBMTP_Folder)\n_libmtp.LIBMTP_Find_Folder.restype = ctypes.POINTER(LIBMTP_Folder)\n_libmtp.LIBMTP_Get_Errorstack.restype = ctypes.POINTER(LIBMTP_Error)\n\n_libmtp.LIBMTP_Open_Raw_Device.restype = ctypes.POINTER(LIBMTP_MTPDevice)\n_libmtp.LIBMTP_Open_Raw_Device.argtypes = [ctypes.POINTER(LIBMTP_RawDevice)]\n\n# This is for callbacks with the type of LIBMTP_progressfunc_t\nProgressfunc = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_uint64, ctypes.c_uint64)\n\n# ----------\n# End Type Definitions\n# ----------\n\nclass MTP:\n\t\"\"\"\n\t\tThe MTP object\n\t\tThis is the main wrapper around libmtp\n\t\"\"\"\n\n\tdef __init__(self):\n\t\t\"\"\"\n\t\t\tInitializes the MTP object\n\n\t\t\t@rtype: None\n\t\t\t@return: None\n\t\t\"\"\"\n\n\t\tself.mtp = _libmtp\n\t\tself.mtp.LIBMTP_Init()\n\t\tself.device = None\n\n\tdef debug_stack(self):\n\t\t\"\"\"\n\t\t\tChecks if __DEBUG__ is set, if so, prints and clears the\n\t\t\terrorstack.\n\n\t\t\t@rtype: None\n\t\t\t@return: None\n\t\t\"\"\"\n\n\t\tif __DEBUG__:\n\t\t\tself.mtp.LIBMTP_Dump_Errorstack()\n\t\t\t#self.mtp.LIBMTP_Clear_Errorstack()\n\n\tdef detect_devices(self):\n\t\t\"\"\"\n\t\t\tDetect if any MTP devices are connected\n\n\t\t\t@rtype: None\n\t\t\t@return: a list of LIBMTP_RawDevice instances for devices found\n\n\t\t\"\"\"\n\n\t\tdevlist = []\n\t\tdevice = LIBMTP_RawDevice()\n\t\tdevices = ctypes.pointer(device)\n\t\tnumdevs = ctypes.c_int(0)\n\t\terr = self.mtp.LIBMTP_Detect_Raw_Devices(ctypes.byref(devices),\n\t\t\t\t\t\t\t ctypes.byref(numdevs))\n\t\tif err == LIBMTP_Error_Number['NO_DEVICE_ATTACHED']:\n\t\t\treturn devlist\n\t\telif err == LIBMTP_Error_Number['STORAGE_FULL']:\n\t\t\t# ignore this, we're just trying to detect here, not do anything else\n\t\t\tpass\n\t\telif err == LIBMTP_Error_Number['CONNECTING']:\n\t\t\traise AlreadyConnected('CONNECTING')\n\t\telif err == LIBMTP_Error_Number['GENERAL']:\n\t\t\traise CommandFailed('GENERAL')\n\t\telif err == LIBMTP_Error_Number['PTP_LAYER']:\n\t\t\traise CommandFailed('PTP_LAYER')\n\t\telif err == LIBMTP_Error_Number['USB_LAYER']:\n\t\t\traise CommandFailed('USB_LAYER')\n\t\telif err == LIBMTP_Error_Number['MEMORY_ALLOCATION']:\n\t\t\traise CommandFailed('MEMORY_ALLOCATION')\n\t\telif err == LIBMTP_Error_Number['CANCELLED']:\n\t\t\traise CommandFailed('CANCELLED')\n\t\tif numdevs.value == 0:\n\t\t\treturn devlist\n\t\tfor i in range(numdevs.value):\n\t\t\tdevlist.append(devices[i])\n\t\treturn devlist\n\n\tdef connect(self):\n\t\t\"\"\"\n\t\t\tInitializes the MTP connection to the device\n\n\t\t\t@rtype: None\n\t\t\t@return: None\n\n\t\t\"\"\"\n\n\t\tif (self.device != None):\n\t\t\traise AlreadyConnected\n\n\t\tself.device = self.mtp.LIBMTP_Get_First_Device()\n\n\t\tif not self.device:\n\t\t\tself.device = None\n\t\t\traise NoDeviceConnected\n\n\tdef disconnect(self):\n\t\t\"\"\"\n\t\t\tDisconnects the MTP device and deletes the self.device object\n\n\t\t\t@rtype: None\n\t\t\t@return: None\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tself.mtp.LIBMTP_Release_Device(self.device)\n\t\tdel self.device\n\t\tself.device = None\n\n\tdef get_devicename(self):\n\t\t\"\"\"\n\t\t\tReturns the connected device's 'friendly name' (or\n\t\t\tknown as the owner name)\n\n\t\t\t@rtype: string\n\t\t\t@return: The connected device's 'friendly name'\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\treturn self.mtp.LIBMTP_Get_Friendlyname(self.device)\n\n\tdef set_devicename(self, name):\n\t\t\"\"\"\n\t\t\tChanges the connected device's 'friendly name' to name\n\n\t\t\t@type name: string\n\t\t\t@param name: The name to change the connected device's\n\t\t\t 'friendly name' to\n\t\t\t@rtype: None\n\t\t\t@return: None\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tret = self.mtp.LIBMTP_Set_Friendlyname(self.device, name)\n\t\tif (ret != 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\tdef get_serialnumber(self):\n\t\t\"\"\"\n\t\t\tReturns the connected device's serial number\n\n\t\t\t@rtype: string\n\t\t\t@return: The connected device's serial number\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\treturn self.mtp.LIBMTP_Get_Serialnumber(self.device)\n\n\tdef get_manufacturer(self):\n\t\t\"\"\"\n\t\t\tReturn the connected device's manufacturer\n\n\t\t\t@rtype: string\n\t\t\t@return: The connected device's manufacturer\n\t\t\"\"\"\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\treturn self.mtp.LIBMTP_Get_Manufacturername(self.device)\n\n\tdef get_batterylevel(self):\n\t\t\"\"\"\n\t\t\tReturns the connected device's maximum and current\n\t\t\tbattery levels\n\n\t\t\t@rtype: tuple\n\t\t\t@return: The connected device's maximum and current\n\t\t\t battery levels ([0] is maximum, [1] is current)\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tmaximum_level = ctypes.c_uint8()\n\t\tcurrent_level = ctypes.c_uint8()\n\n\t\tret = self.mtp.LIBMTP_Get_Batterylevel(self.device, \\\n\t\t  ctypes.byref(maximum_level), ctypes.byref(current_level))\n\n\t\tif (ret != 0):\n\t\t\traise CommandFailed\n\n\t\treturn (maximum_level.value, current_level.value)\n\n\tdef get_modelname(self):\n\t\t\"\"\"\n\t\t\tReturns the connected device's model name (such\n\t\t\tas \"Zen V Plus\")\n\n\t\t\t@rtype: string\n\t\t\t@return: The connected device's model name\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\treturn self.mtp.LIBMTP_Get_Modelname(self.device)\n\n\tdef get_deviceversion(self):\n\t\t\"\"\"\n\t\t\tReturns the connected device's version (such as\n\t\t\tfirmware/hardware version)\n\n\t\t\t@rtype: string\n\t\t\t@return: Returns the connect device's version\n\t\t\t information\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\treturn self.mtp.LIBMTP_Get_Deviceversion(self.device)\n\n\tdef get_filelisting(self, callback=None):\n\t\t\"\"\"\n\t\t\tReturns the connected device's file listing as a tuple,\n\t\t\tcontaining L{LIBMTP_File} objects.\n\n\t\t\t@type callback: function or None\n\t\t\t@param callback: The function provided to libmtp to\n\t\t\t receive callbacks from ptp. Callback must take two\n\t\t\t arguments, total and sent (in bytes)\n\t\t\t@rtype: tuple\n\t\t\t@return: Returns the connect device file listing tuple\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tif (callback != None):\n\t\t\tcallback = Progressfunc(callback)\n\n\t\tfiles = self.mtp.LIBMTP_Get_Filelisting_With_Callback(self.device, callback, None)\n\t\tret = []\n\t\tnext = files\n\n\t\twhile next:\n\t\t\tret.append(next.contents)\n\t\t\tif (next.contents.next == None):\n\t\t\t\tbreak\n\t\t\tnext = next.contents.next\n\n\t\treturn ret\n\n\tdef get_filetype_description(self, filetype):\n\t\t\"\"\"\n\t\t\tReturns the description of the filetype\n\n\t\t\t@type filetype: int\n\t\t\t@param filetype: The MTP filetype integer\n\t\t\t@rtype: string\n\t\t\t@return: The file type information\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\treturn self.mtp.LIBMTP_Get_Filetype_Description(filetype)\n\n\tdef get_file_metadata(self, file_id):\n\t\t\"\"\"\n\t\t\tReturns the file metadata from the connected device\n\n\t\t\tAs per the libmtp documentation, calling this function\n\t\t\trepeatedly is not recommended, as it is slow and creates\n\t\t\ta large amount of USB traffic.\n\n\t\t\t@type file_id: int\n\t\t\t@param file_id: The unique numeric file id\n\t\t\t@rtype: LIBMTP_File\n\t\t\t@return: The file metadata\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tret = self.mtp.LIBMTP_Get_Filemetadata(self.device, file_id)\n\n\t\tif (not hasattr(ret, 'contents')):\n\t\t\traise ObjectNotFound\n\n\t\treturn ret.contents\n\n\tdef get_tracklisting(self, callback=None):\n\t\t\"\"\"\n\t\t\tReturns tracks from the connected device\n\n\t\t\t@type callback: function or None\n\t\t\t@param callback: The function provided to libmtp to\n\t\t\t receive callbacks from ptp. Callback must take two\n\t\t\t arguments, total and sent (in bytes)\n\t\t\t@rtype: tuple\n\t\t\t@return: Returns a tuple full of L{LIBMTP_Track} objects\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tif (callback != None):\n\t\t\tcallback = Progressfunc(callback)\n\n\t\ttracks = self.mtp.LIBMTP_Get_Tracklisting_With_Callback(self.device, callback, None)\n\t\tret = []\n\t\tnext = tracks\n\n\t\twhile next:\n\t\t\tret.append(next.contents)\n\t\t\tif (next.contents.next == None):\n\t\t\t\tbreak\n\t\t\tnext = next.contents.next\n\n\t\treturn ret\n\n\tdef get_track_metadata(self, track_id):\n\t\t\"\"\"\n\t\t\tReturns the track metadata\n\n                        As per the libmtp documentation, calling this function repeatedly is not\n\t\t\trecommended, as it is slow and creates a large amount of USB traffic.\n\n\t\t\t@type track_id: int\n\t\t\t@param track_id: The unique numeric track id\n\t\t\t@rtype: L{LIBMTP_Track}\n\t\t\t@return: The track metadata\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tret = self.mtp.LIBMTP_Get_Trackmetadata(self.device, track_id)\n\n\t\tif (not hasattr(ret, 'contents')):\n\t\t\traise ObjectNotFound\n\n\t\treturn ret.contents\n\n\tdef get_file_to_file(self, file_id, target, callback=None):\n\t\t\"\"\"\n\t\t\tDownloads the file from the connected device and stores it at the\n\t\t\ttarget location\n\n\t\t\t@type file_id: int\n\t\t\t@param file_id: The unique numeric file id\n\t\t\t@type target: str\n\t\t\t@param target: The location to place the file\n\t\t\t@type callback: function or None\n\t\t\t@param callback: The function provided to libmtp to\n\t\t\t receive callbacks from ptp. Callback must take two\n\t\t\t arguments, total and sent (in bytes)\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tif (callback != None):\n\t\t\tcallback = Progressfunc(callback)\n\n\t\tret = self.mtp.LIBMTP_Get_File_To_File(self.device, file_id, target, callback, None)\n\n\t\tif (ret != 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\tdef get_track_to_file(self, track_id, target, callback=None):\n\t\t\"\"\"\n\t\t\tDownloads the track from the connected device and stores it at\n\t\t\tthe target location\n\n\t\t\t@type track_id: int\n\t\t\t@param track_id: The unique numeric track id\n\t\t\t@type target: str\n\t\t\t@param target: The location to place the track\n\t\t\t@type callback: function or None\n\t\t\t@param callback: The function provided to libmtp to\n\t\t\t receive callbacks from ptp. Callback must take two\n\t\t\t arguments, total and sent (in bytes)\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tif (callback != None):\n\t\t\tcallback = Progressfunc(callback)\n\n\t\tret = self.mtp.LIBMTP_Get_Track_To_File(self.device, track_id, target, callback, None)\n\n\t\tif (ret != 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\tdef find_filetype(self, filename):\n\t\t\"\"\"\n\t\t\tAttempts to guess the filetype off the filename. Kind of\n\t\t\tinaccurate and should be trusted with a grain of salt. It\n\t\t\tworks in most situations, though.\n\n\t\t\t@type filename: str\n\t\t\t@param filename: The filename to attempt to guess from\n\t\t\t@rtype: int\n\t\t\t@return: The integer of the Filetype\n\t\t\"\"\"\n\n\t\tfileext = filename.decode('utf-8').lower().split(\".\")[-1]\n\n\t\tif (fileext == \"wav\" or fileext == \"wave\"):\n\t\t\treturn LIBMTP_Filetype[\"WAV\"]\n\t\telif (fileext == \"mp3\"):\n\t\t\treturn LIBMTP_Filetype[\"MP3\"]\n\t\telif (fileext == \"wma\"):\n\t\t\treturn LIBMTP_Filetype[\"WMA\"]\n\t\telif (fileext == \"ogg\"):\n\t\t\treturn LIBMTP_Filetype[\"OGG\"]\n\t\telif (fileext == \"mp4\"):\n\t\t\treturn LIBMTP_Filetype[\"MP4\"]\n\t\telif (fileext == \"wmv\"):\n\t\t\treturn LIBMTP_Filetype[\"WMV\"]\n\t\telif (fileext == \"avi\"):\n\t\t\treturn LIBMTP_Filetype[\"AVI\"]\n\t\telif (fileext == \"mpeg\" or fileext == \"mpg\"):\n\t\t\treturn LIBMTP_Filetype[\"MPEG\"]\n\t\telif (fileext == \"asf\"):\n\t\t\treturn LIBMTP_Filetype[\"ASF\"]\n\t\telif (fileext == \"qt\" or fileext == \"mov\"):\n\t\t\treturn LIBMTP_Filetype[\"QT\"]\n\t\telif (fileext == \"jpeg\" or fileext == \"jpg\"):\n\t\t\treturn LIBMTP_Filetype[\"JPEG\"]\n\t\telif (fileext == \"jfif\"):\n\t\t\treturn LIBMTP_Filetype[\"JFIF\"]\n\t\telif (fileext == \"tif\" or fileext == \"tiff\"):\n\t\t\treturn LIBMTP_Filetype[\"TIFF\"]\n\t\telif (fileext == \"bmp\"):\n\t\t\treturn LIBMTP_Filetype[\"BMP\"]\n\t\telif (fileext == \"gif\"):\n\t\t\treturn LIBMTP_Filetype[\"GIF\"]\n\t\telif (fileext == \"pic\" or fileext == \"pict\"):\n\t\t\treturn LIBMTP_Filetype[\"PICT\"]\n\t\telif (fileext == \"png\"):\n\t\t\treturn LIBMTP_Filetype[\"PNG\"]\n\t\telif (fileext == \"wmf\"):\n\t\t\treturn LIBMTP_Filetype[\"WINDOWSIMAGEFORMAT\"]\n\t\telif (fileext == \"ics\"):\n\t\t\treturn LIBMTP_Filetype[\"VCALENDAR2\"]\n\t\telif (fileext == \"exe\" or fileext == \"com\" or fileext == \"bat\"\\\n\t\t      or fileext == \"dll\" or fileext == \"sys\"):\n\t\t\treturn LIBMTP_Filetype[\"WINEXEC\"]\n\t\telif (fileext == \"aac\"):\n\t\t\treturn LIBMTP_Filetype[\"AAC\"]\n\t\telif (fileext == \"mp2\"):\n\t\t\treturn LIBMTP_Filetype[\"MP2\"]\n\t\telif (fileext == \"flac\"):\n\t\t\treturn LIBMTP_Filetype[\"FLAC\"]\n\t\telif (fileext == \"m4a\"):\n\t\t\treturn LIBMTP_Filetype[\"M4A\"]\n\t\telif (fileext == \"doc\"):\n\t\t\treturn LIBMTP_Filetype[\"DOC\"]\n\t\telif (fileext == \"xml\"):\n\t\t\treturn LIBMTP_Filetype[\"XML\"]\n\t\telif (fileext == \"xls\"):\n\t\t\treturn LIBMTP_Filetype[\"XLS\"]\n\t\telif (fileext == \"ppt\"):\n\t\t\treturn LIBMTP_Filetype[\"PPT\"]\n\t\telif (fileext == \"mht\"):\n\t\t\treturn LIBMTP_Filetype[\"MHT\"]\n\t\telif (fileext == \"jp2\"):\n\t\t\treturn LIBMTP_Filetype[\"JP2\"]\n\t\telif (fileext == \"jpx\"):\n\t\t\treturn LIBMTP_Filetype[\"JPX\"]\n\t\telse:\n\t\t\treturn LIBMTP_Filetype[\"UNKNOWN\"]\n\n\tdef send_file_from_file(self, source, target, callback=None):\n\t\t\"\"\"\n\t\t\tSends a file from the filesystem to the connected device\n\t\t\tand stores it at the target filename inside the parent.\n\n\t\t\tThis will attempt to \"guess\" the filetype with\n\t\t\tfind_filetype()\n\n\t\t\t@type source: str\n\t\t\t@param source: The path on the filesystem where the file resides\n\t\t\t@type target: str\n\t\t\t@param target: The target filename on the device\n\t\t\t@type callback: function or None\n\t\t\t@param callback: The function provided to libmtp to\n\t\t\t receive callbacks from ptp. Callback function must\n\t\t\t take two arguments, sent and total (in bytes)\n\t\t\t@rtype: int\n\t\t\t@return: The object ID of the new file\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tif (os.path.isfile(source) == False):\n\t\t\traise IOError\n\n\t\tif (callback != None):\n\t\t\tcallback = Progressfunc(callback)\n\n\t\tmetadata = LIBMTP_File(filename=target, \\\n\t\t  filetype=self.find_filetype(source), \\\n\t\t  filesize=os.stat(source).st_size)\n\n\t\tret = self.mtp.LIBMTP_Send_File_From_File(self.device, source, \\\n\t\t  ctypes.pointer(metadata), callback, None)\n\n\t\tif (ret != 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\t\treturn metadata.item_id\n\n\tdef send_track_from_file(self, source, target, metadata, callback=None):\n\t\t\"\"\"\n\t\t\tSends a track from the filesystem to the connected\n\t\t\tdevice\n\n\t\t\t@type source: str\n\t\t\t@param source: The path where the track resides\n\t\t\t@type target: str\n\t\t\t@param target: The target filename on the device\n\t\t\t@type metadata: LIBMTP_Track\n\t\t\t@param metadata: The track metadata\n\t\t\t@type callback: function or None\n\t\t\t@param callback: The function provided to libmtp to\n\t\t\t receive callbacks from ptp. Callback function must\n\t\t\t take two arguments, sent and total (in bytes)\n\t\t\t@rtype: int\n\t\t\t@return: The object ID of the new track\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tif (os.path.exists(source) == None):\n\t\t\traise IOError\n\n\t\tif callback:\n\t\t\tcallback = Progressfunc(callback)\n\n\t\tmetadata.filename = target\n\t\tmetadata.filetype = self.find_filetype(source)\n\t\tmetadata.filesize = os.stat(source).st_size\n\n\t\tret = self.mtp.LIBMTP_Send_Track_From_File(self.device, source, \\\n\t\t  ctypes.pointer(metadata), callback, None)\n\n\t\tif (ret != 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\t\treturn metadata.item_id\n\n\tdef get_freespace(self):\n\t\t\"\"\"\n\t\t\tReturns the amount of free space on the connected device\n\t\t\t@rtype: long\n\t\t\t@return: The amount of free storage in bytes\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tself.mtp.LIBMTP_Get_Storage(self.device, 0)\n\t\treturn self.device.contents.storage.contents.FreeSpaceInBytes\n\n\tdef get_totalspace(self):\n\t\t\"\"\"\n\t\t\tReturns the total space on the connected device\n\t\t\t@rtype: long\n\t\t\t@return: The amount of total storage in bytes\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tself.mtp.LIBMTP_Get_Storage(self.device, 0)\n\t\treturn self.device.contents.storage.contents.MaxCapacity\n\n\tdef get_usedspace(self):\n\t\t\"\"\"\n\t\t\tReturns the amount of used space on the connected device\n\n\t\t\t@rtype: long\n\t\t\t@return: The amount of used storage in bytes\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tself.mtp.LIBMTP_Get_Storage(self.device, 0)\n\t\tstorage = self.device.contents.storage.contents\n\t\treturn (storage.MaxCapacity - storage.FreeSpaceInBytes)\n\n\tdef get_usedspace_percent(self):\n\t\t\"\"\"\n\t\t\tReturns the amount of used space as a percentage\n\n\t\t\t@rtype: float\n\t\t\t@return: The percentage of used storage\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tself.mtp.LIBMTP_Get_Storage(self.device, 0)\n\t\tstorage = self.device.contents.storage.contents\n\n\t\t# Why don't we call self.get_totalspace/self.get_usedspace\n\t\t# here? That would require 3 *more* calls to\n\t\t# LIBMTP_Get_Storage\n\t\tusedspace = storage.MaxCapacity - storage.FreeSpaceInBytes\n\t\treturn ((float(usedspace) / float(storage.MaxCapacity)) * 100)\n\n\tdef delete_object(self, object_id):\n\t\t\"\"\"\n\t\t\tDeletes the object off the connected device.\n\n\t\t\t@type object_id: int\n\t\t\t@param object_id: The unique object identifier\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tret = self.mtp.LIBMTP_Delete_Object(self.device, object_id)\n\n\t\tif (ret != 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\tdef get_playlists(self):\n\t\t\"\"\"\n\t\t\tReturns a tuple filled with L{LIBMTP_Playlist} objects\n\t\t\tfrom the connected device.\n\n\t\t\tThe main gotcha of this function is that the tracks\n\t\t\tvariable of LIBMTP_Playlist isn't iterable (without\n\t\t\tsegfaults), so, you have to iterate over the no_tracks\n\t\t\t(through range or xrange) and access it that way (i.e.\n\t\t\ttracks[track_id]). Kind of sucks.\n\n\t\t\t@rtype: tuple\n\t\t\t@return: Tuple filled with LIBMTP_Playlist objects\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tplaylists = self.mtp.LIBMTP_Get_Playlist_List(self.device)\n\t\tret = []\n\t\tnext = playlists\n\n\t\twhile next:\n\t\t\tret.append(next.contents)\n\t\t\tif (next.contents.next == None):\n\t\t\t\tbreak\n\t\t\tnext = next.contents.next\n\n\t\treturn ret\n\n\tdef get_playlist(self, playlist_id):\n\t\t\"\"\"\n\t\t\tReturns a L{LIBMTP_Playlist} object of the requested\n\t\t\tplaylist_id from the connected device\n\n\t\t\t@type playlist_id: int\n\t\t\t@param playlist_id: The unique playlist identifier\n\t\t\t@rtype: LIBMTP_Playlist\n\t\t\t@return: The playlist object\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\ttry:\n\t\t\tret = self.mtp.LIBMTP_Get_Playlist(self.device, playlist_id).contents\n\t\texcept ValueError:\n\t\t\traise ObjectNotFound\n\n\t\treturn ret\n\n\tdef create_new_playlist(self, metadata):\n\t\t\"\"\"\n\t\t\tCreates a new playlist based on the metadata object\n\t\t\tpassed.\n\n\t\t\t@type metadata: LIBMTP_Playlist\n\t\t\t@param metadata: A LIBMTP_Playlist object describing\n\t\t\t the playlist\n\t\t\t@rtype: int\n\t\t\t@return: The object ID of the new playlist\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tret = self.mtp.LIBMTP_Create_New_Playlist(self.device, ctypes.pointer(metadata))\n\n\t\tif (ret != 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\t\treturn metadata.playlist_id\n\n\tdef update_playlist(self, metadata):\n\t\t\"\"\"\n\t\t\tUpdates a playlist based on the supplied metadata.\n\n\t\t\tWhen updating the tracks field in a playlist, this\n\t\t\tfunction will replace the playlist's tracks with\n\t\t\tthe tracks supplied in the metadata object. This\n\t\t\tmeans that the previous tracks in the playlist\n\t\t\twill be overwritten.\n\n\t\t\t@type metadata: LIBMTP_Playlist\n\t\t\t@param metadata: A LIBMTP_Playlist object describing\n\t\t\t the updates to the playlist.\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tret = self.mtp.LIBMTP_Update_Playlist(self.device, ctypes.pointer(metadata))\n\n\t\tif (ret != 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\tdef get_folder_list(self):\n\t\t\"\"\"\n\t\t\tReturns a pythonic dict of the folders on the\n\t\t\tdevice.\n\n\t\t\t@rtype: dict\n\t\t\t@return: A dict of the folders on the device where\n\t\t\t the folder ID is the key.\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tfolders = self.mtp.LIBMTP_Get_Folder_List(self.device)\n\t\tnext = folders\n\t\t# List of folders, key being the folder ID\n\t\tret = {}\n\t\t# Iterate over the folders to grab the first-level parents\n\t\twhile True:\n\t\t\tnext = next.contents\n\t\t\tscanned = True\n\n\t\t\t# Check if this ID exists, if not, add it\n\t\t\t# and trigger a scan of the children\n\t\t\tif not (ret.has_key(next.folder_id)):\n\t\t\t\tret[next.folder_id] = next\n\t\t\t\tscanned = False\n\n\t\t\tif ((scanned == False) and (next.child)):\n\t\t\t\t## Scan the children\n\t\t\t\tnext = next.child\n\n\t\t\telif (next.sibling):\n\t\t\t\t## Scan the siblings\n\t\t\t\tnext = next.sibling\n\n\t\t\telif (next.parent_id != 0):\n\t\t\t\t## If we have no children/siblings to visit,\n\t\t\t\t## and we aren't at the parent, go back to\n\t\t\t\t## the parent.\n\t\t\t \tnext = self.mtp.LIBMTP_Find_Folder(folders, int(next.parent_id))\n\n\t\t\telse:\n\t\t\t\t## We have scanned everything, let's go home.\n\t\t\t\tbreak\n\n\t\treturn ret\n\n\tdef get_parent_folders(self):\n\t\t\"\"\"\n\t\t\tReturns a list of only the parent folders.\n\t\t\t@rtype: list\n\t\t\t@return: Returns a list of the parent folders\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\t\tfolders = self.mtp.LIBMTP_Get_Folder_List(self.device)\n\t\tnext = folders\n\t\t# A temporary holding space, this makes checking folder\n\t\t# IDs easier\n\t\ttmp = {}\n\n\t\twhile True:\n\t\t\tnext = next.contents\n\t\t\t## Check if this folder is in the dict\n\t\t\tif not (tmp.has_key(next.folder_id)):\n\t\t\t\ttmp[next.folder_id] = next\n\n\t\t\t# Check for siblings\n\t\t\tif (next.sibling):\n\t\t\t\t## Scan the sibling\n\t\t\t\tnext = next.sibling\n\t\t\telse:\n\t\t\t\t## We're done here.\n\t\t\t\tbreak\n\n\t\t## convert the dict into a list\n\t\tret = []\n\t\tfor key in tmp:\n\t\t\tret.append(tmp[key])\n\n\t\treturn ret\n\n\tdef create_folder(self, name, parent=0, storage=0):\n\t\t\"\"\"\n\t\t\tThis creates a new folder in the parent. If the parent\n\t\t\tis 0, it will go in the main directory.\n\n\t\t\t@type name: str\n\t\t\t@param name: The name for the folder\n\t\t\t@type parent: int\n\t\t\t@param parent: The parent ID or 0 for main directory\n                        @type storage: int\n                        @param storage: The storage id or 0 to create the new folder\n                                        on the primary storage\n\t\t\t@rtype: int\n\t\t\t@return: Returns the object ID of the new folder\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tret = self.mtp.LIBMTP_Create_Folder(self.device, name, parent, storage)\n\n\t\tif (ret == 0):\n\t\t\tself.debug_stack()\n\t\t\traise CommandFailed\n\n\t\treturn ret\n\n\tdef get_errorstack(self):\n\t\t\"\"\"\n\t\t\tReturns the connected device's errorstack from\n\t\t\tLIBMTP.\n\t\t\t@rtype: L{LIBMTP_Error}\n\t\t\t@return: An array of LIBMTP_Errors.\n\t\t\"\"\"\n\n\t\tif (self.device == None):\n\t\t\traise NotConnected\n\n\t\tret = self.mtp.LIBMTP_Get_Errorstack(self.device)\n\n\t\tif (ret != 0):\n\t\t\traise CommandFailed\n\n\t\treturn ret\n"
  },
  {
    "path": "test/hil/requirements.txt",
    "content": "fs\nhid\npyfatfs\npyserial\n"
  },
  {
    "path": "test/hil/tinyusb.json",
    "content": "{\n    \"boards\": [\n        {\n            \"name\": \"espressif_p4_function_ev\",\n            \"uid\": \"6055F9F98715\",\n            \"build\" : {\n                \"flags_on\": [\"\", \"CFG_TUD_DWC2_DMA_ENABLE CFG_TUH_DWC2_DMA_ENABLE\"]\n            },\n            \"tests\": {\n                \"only\": [\"device/cdc_msc_freertos\", \"device/hid_composite_freertos\", \"host/device_info\"],\n                \"dev_attached\": [{\"vid_pid\": \"1a86_55d4\", \"serial\": \"52D2002427\", \"is_cdc\": true}]\n            },\n            \"flasher\": {\n                \"name\": \"esptool\",\n                \"uid\": \"4ea4f48f6bc3ee11bbb9d00f9e1b1c54\",\n                \"args\": \"-b 1500000\",\n                \"comment\": \"use --force for ESP32-P4 v0.1\"\n            },\n            \"comment\": \"Use TS3USB30 mux to test both device and host\"\n        },\n        {\n            \"name\": \"espressif_s3_devkitm\",\n            \"uid\": \"84F703C084E4\",\n            \"build\" : {\n                \"flags_on\": [\"\", \"CFG_TUD_DWC2_DMA_ENABLE CFG_TUH_DWC2_DMA_ENABLE\"]\n            },\n            \"tests\": {\n                \"only\": [\"device/cdc_msc_freertos\", \"device/hid_composite_freertos\", \"host/device_info\"],\n                \"dev_attached\": [{\"vid_pid\": \"1a86_55d4\", \"serial\": \"52D2005402\", \"is_cdc\": true}]\n            },\n            \"flasher\": {\n                \"name\": \"esptool\",\n                \"uid\": \"3ea619acd1cdeb11a0a0b806e93fd3f1\",\n                \"args\": \"-b 1500000\"\n            },\n            \"comment\": \"Use TS3USB30 mux to test both device and host\"\n        },\n        {\n            \"name\": \"feather_nrf52840_express\",\n            \"uid\": \"1F0479CD0F764471\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"000682804350\",\n                \"args\": \"-device nrf52840_xxaa\"\n            }\n        },\n        {\n            \"name\": \"max32666fthr\",\n            \"uid\": \"0C81464124010B20FF0A08CC2C\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"openocd_adi\",\n                \"uid\": \"E6614C311B597D32\",\n                \"args\": \"-f interface/cmsis-dap.cfg -f target/max32665.cfg\"\n            }\n        },\n        {\n            \"name\": \"metro_m4_express\",\n            \"uid\": \"9995AD485337433231202020FF100A34\",\n            \"build\" : {\n                \"args\": [\"MAX3421_HOST=1\"]\n            },\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": true,\n                \"dev_attached\": [{\"vid_pid\": \"067b_2303\", \"serial\": \"0\", \"is_cdc\": true}],\n                \"comment\": \"pl23x\"\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"123456\",\n                \"args\": \"-device ATSAMD51J19\"\n            }\n        },\n        {\n            \"name\": \"mimxrt1015_evk\",\n            \"uid\": \"DC28F865D2111D228D00B0543A70463C\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"000726284213\",\n                \"args\": \"-device MIMXRT1015DAF5A\"\n            }\n        },\n        {\n            \"name\": \"mimxrt1064_evk\",\n            \"uid\": \"BAE96FB95AFA6DBB8F00005002001200\",\n            \"tests\": {\n                \"device\": true, \"host\": true, \"dual\": true,\n                \"dev_attached\": [{\"vid_pid\": \"10c4_ea60\", \"serial\": \"0001\", \"is_cdc\": true}],\n                \"comment\": \"cp2102\"\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"000725299165\",\n                \"args\": \"-device MIMXRT1064xxx6A\"\n            }\n        },\n        {\n            \"name\": \"lpcxpresso11u37\",\n            \"uid\": \"17121919\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"000724441579\",\n                \"args\": \"-device LPC11U37/401\"\n            }\n        },\n        {\n            \"name\": \"ra4m1_ek\",\n            \"uid\": \"152E163038303131393346E46F26574B\",\n            \"tests\": {\n                \"device\": true,\n                \"host\": false,\n                \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"000831174392\",\n                \"args\": \"-device R7FA4M1AB\"\n            }\n        },\n        {\n            \"name\": \"raspberry_pi_pico\",\n            \"uid\": \"E6614C311B764A37\",\n            \"build\" : {\n                \"flags_on\": [\"CFG_TUH_RPI_PIO_USB\"]\n            },\n            \"tests\": {\n                \"device\": true, \"host\": true, \"dual\": true,\n                \"dev_attached\": [{\"vid_pid\": \"1a86_7523\", \"serial\": \"0\", \"is_cdc\": true}],\n                \"comment\": \"ch34x\"\n            },\n            \"flasher\": {\n                \"name\": \"openocd\",\n                \"uid\": \"E6614103E72C1D2F\",\n                \"args\": \"-f interface/cmsis-dap.cfg -f target/rp2040.cfg -c \\\"adapter speed 5000\\\"\"\n            }\n        },\n        {\n            \"name\": \"raspberry_pi_pico_w\",\n            \"uid\": \"E6614C311B764A37\",\n            \"tests\": {\n                \"device\": false, \"host\": true, \"dual\": false,\n                \"dev_attached\": [{\"vid_pid\": \"1a86_55d4\", \"serial\": \"52D2023934\", \"is_cdc\": true}]\n            },\n            \"flasher\": {\n                \"name\": \"openocd\",\n                \"uid\": \"E6633861A3819D38\",\n                \"args\": \"-f interface/cmsis-dap.cfg -f target/rp2040.cfg -c \\\"adapter speed 5000\\\"\"\n            },\n            \"comment\": \"Test native host\"\n        },\n        {\n            \"name\": \"raspberry_pi_pico2\",\n            \"uid\": \"560AE75E1C7152C9\",\n            \"tests\": {\n                \"device\": false, \"host\": true, \"dual\": false,\n                \"dev_attached\": [{\"vid_pid\": \"1a86_55d4\", \"serial\": \"52D2002694\", \"is_cdc\": true}]\n            },\n            \"flasher\": {\n                \"name\": \"openocd\",\n                \"uid\": \"E6633861A3978538\",\n                \"args\": \"-f interface/cmsis-dap.cfg -f target/rp2350.cfg -c \\\"adapter speed 5000\\\"\"\n            }\n        },\n        {\n            \"name\": \"adafruit_fruit_jam\",\n            \"uid\": \"2B0DC7A45781189E\",\n            \"tests\": {\n                \"device\": true,\n                \"host\": true,\n                \"dual\": true,\n                \"dev_attached\": [\n                    {\"vid_pid\": \"0403_6001\", \"serial\": \"0\", \"is_cdc\": true},\n                    {\"vid_pid\": \"058f_6387\", \"serial\": \"A8BEE062633D\", \"is_msc\": true,\n                        \"msc_disk_size\": 3730, \"msc_inquiry\": \"Generic  Flash Disk       rev 8.07\"}\n                ]\n            },\n            \"flasher\": {\n                \"name\": \"openocd\",\n                \"uid\": \"E6614103E78E8324\",\n                \"args\": \"-f interface/cmsis-dap.cfg -f target/rp2350.cfg -c \\\"adapter speed 5000\\\"\"\n            }\n        },\n        {\n            \"name\": \"stm32f072disco\",\n            \"uid\": \"3A001A001357364230353532\",\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"779541626\",\n                \"args\": \"-device stm32f072rb\"\n            },\n            \"comment\": \"2x16 access scheme with 1KB USB SRAM\"\n        },\n        {\n            \"name\": \"stm32f723disco\",\n            \"uid\": \"460029001951373031313335\",\n            \"build\" : {\n                \"flags_on\": [\"\", \"CFG_TUH_DWC2_DMA_ENABLE\"]\n            },\n            \"tests\": {\n                \"device\": true, \"host\": true, \"dual\": false,\n                \"dev_attached\": [{\"vid_pid\": \"1a86_55d4\", \"serial\": \"52D2003414\", \"is_cdc\": true}]\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"000776606156\",\n                \"args\": \"-device stm32f723ie\"\n            },\n            \"comment\": \"Device port0 FS (slave only), Host port1 HS with DMA\"\n        },\n        {\n            \"name\": \"stm32h743nucleo\",\n            \"uid\": \"110018000951383432343236\",\n            \"build\" : {\n                \"flags_on\": [\"\", \"CFG_TUD_DWC2_DMA_ENABLE\"]\n            },\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"openocd\",\n                \"uid\": \"004C00343137510F39383538\",\n                \"args\": \"-f interface/stlink.cfg -f target/stm32h7x.cfg\"\n            }\n        },\n        {\n            \"name\": \"stm32g0b1nucleo\",\n            \"uid\": \"4D0038000450434E37343120\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"openocd\",\n                \"uid\": \"066FFF495087534867063844\",\n                \"args\": \"-f interface/stlink.cfg -f target/stm32g0x.cfg\"\n            },\n            \"comment\": \"32-bit scheme, 2KB USB SRAM\"\n        }\n    ],\n    \"boards-skip\": [\n        {\n            \"name\": \"stm32f769disco\",\n            \"uid\": \"21002F000F51363531383437\",\n            \"build\" : {\n                \"flags_on\": [\"\", \"CFG_TUD_DWC2_DMA_ENABLE\"]\n            },\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"000778170924\",\n                \"args\": \"-device stm32f769ni\"\n            }\n        },\n        {\n            \"name\": \"nanoch32v203\",\n            \"uid\": \"CDAB277B0FBC03E339E339E3\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"openocd_wch\",\n                \"uid\": \"EBCA8F0670AF\",\n                \"args\": \"\"\n            }\n        },\n        {\n            \"name\": \"stm32f407disco\",\n            \"uid\": \"30001A000647313332353735\",\n            \"tests\": {\n                \"device\": true, \"host\": false, \"dual\": false\n            },\n            \"flasher\": {\n                \"name\": \"jlink\",\n                \"uid\": \"000773661813\",\n                \"args\": \"-device stm32f407vg\"\n            }\n        }\n    ]\n}\n"
  },
  {
    "path": "test/unit-test/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.20)\n\nproject(tinyusb_unit_tests LANGUAGES C)\n\nset(CMAKE_C_STANDARD 99)\nset(CMAKE_C_STANDARD_REQUIRED ON)\nset(CMAKE_C_EXTENSIONS ON)\n\n# Command to invoke Ceedling. Supports multi-word commands such as \"bundle exec ceedling\".\nset(CEEDLING_COMMAND \"ceedling\" CACHE STRING \"Command used to invoke Ceedling (Ruby gem).\")\nseparate_arguments(CEEDLING_COMMAND_LIST NATIVE_COMMAND \"${CEEDLING_COMMAND}\")\nif (CEEDLING_COMMAND_LIST STREQUAL \"\")\n  message(FATAL_ERROR \"CEEDLING_COMMAND is empty; set it to a valid Ceedling invocation.\")\nendif ()\n\nlist(GET CEEDLING_COMMAND_LIST 0 CEEDLING_LAUNCHER)\nfind_program(CEEDLING_LAUNCHER_PATH NAMES ${CEEDLING_LAUNCHER})\nif (NOT CEEDLING_LAUNCHER_PATH)\n  message(FATAL_ERROR \"Could not find '${CEEDLING_LAUNCHER}' on PATH; adjust CEEDLING_COMMAND or PATH.\")\nendif ()\nlist(REMOVE_AT CEEDLING_COMMAND_LIST 0)\nlist(INSERT CEEDLING_COMMAND_LIST 0 ${CEEDLING_LAUNCHER_PATH})\n\nset(CEEDLING_WORKDIR ${CMAKE_CURRENT_LIST_DIR})\nset(CEEDLING_BUILD_DIR ${CEEDLING_WORKDIR}/_build)\n\n# Helper to add a Ceedling-backed test target that compiles into a real CMake executable.\nfunction(add_ceedling_test TARGET_NAME TEST_SOURCE PRODUCT_SOURCES MOCK_SOURCES)\n  set(runner ${CEEDLING_BUILD_DIR}/test/runners/${TARGET_NAME}_runner.c)\n\n  add_custom_target(ceedling_gen_${TARGET_NAME}\n    COMMAND ${CEEDLING_COMMAND_LIST} test:${TARGET_NAME}\n    WORKING_DIRECTORY ${CEEDLING_WORKDIR}\n    BYPRODUCTS ${runner}\n    USES_TERMINAL\n    COMMENT \"Generate Ceedling runner/mocks for ${TARGET_NAME}\"\n    )\n\n  add_executable(${TARGET_NAME}\n    ${TEST_SOURCE}\n    ${runner}\n    ${MOCK_SOURCES}\n    ${CEEDLING_BUILD_DIR}/vendor/unity/src/unity.c\n    ${CEEDLING_BUILD_DIR}/vendor/cmock/src/cmock.c\n    ${PRODUCT_SOURCES}\n    )\n\n  set_source_files_properties(\n    ${runner}\n    ${MOCK_SOURCES}\n    ${CEEDLING_BUILD_DIR}/vendor/unity/src/unity.c\n    ${CEEDLING_BUILD_DIR}/vendor/cmock/src/cmock.c\n    PROPERTIES GENERATED TRUE\n    )\n\n  add_dependencies(${TARGET_NAME} ceedling_gen_${TARGET_NAME})\n\n  target_include_directories(${TARGET_NAME} PRIVATE\n    ${CEEDLING_WORKDIR}/test\n    ${CEEDLING_WORKDIR}/test/support\n    ${CEEDLING_BUILD_DIR}/test/runners\n    ${CEEDLING_BUILD_DIR}/test/mocks/${TARGET_NAME}\n    ${CEEDLING_BUILD_DIR}/vendor/unity/src\n    ${CEEDLING_BUILD_DIR}/vendor/cmock/src\n    ${CEEDLING_WORKDIR}/../../src\n    ${CEEDLING_WORKDIR}/../../src/common\n    ${CEEDLING_WORKDIR}/../../src/device\n    ${CEEDLING_WORKDIR}/../../src/class\n    ${CEEDLING_WORKDIR}/../../src/class/msc\n    ${CEEDLING_WORKDIR}/../../src/host\n    ${CEEDLING_WORKDIR}/../../src/typec\n    ${CEEDLING_WORKDIR}/../../src/osal\n    )\n\n  target_compile_definitions(${TARGET_NAME} PRIVATE _UNITY_TEST_)\n  target_compile_options(${TARGET_NAME} PRIVATE -Wall -Wextra)\n  add_test(NAME ${TARGET_NAME} COMMAND ${TARGET_NAME})\nendfunction()\n\n# Custom targets to keep plain Ceedling entry-points available.\nadd_custom_target(ceedling_all\n  COMMAND ${CEEDLING_COMMAND_LIST} test:all\n  WORKING_DIRECTORY ${CEEDLING_WORKDIR}\n  USES_TERMINAL\n  COMMENT \"Run Ceedling (Unity) unit tests\"\n  )\n\nadd_custom_target(ceedling_clean\n  COMMAND ${CEEDLING_COMMAND_LIST} clean\n  WORKING_DIRECTORY ${CEEDLING_WORKDIR}\n  USES_TERMINAL\n  COMMENT \"Clean Ceedling build outputs\"\n  )\n\nadd_custom_target(ceedling_clobber\n  COMMAND ${CEEDLING_COMMAND_LIST} clobber\n  WORKING_DIRECTORY ${CEEDLING_WORKDIR}\n  USES_TERMINAL\n  COMMENT \"Clobber Ceedling build outputs\"\n  )\n\n# Per-test wiring: mocks are generated under _build/test/mocks/<name>/.\nadd_ceedling_test(\n  test_common_func\n  ${CEEDLING_WORKDIR}/test/test_common_func.c\n  \"\"\n  \"\"\n  )\n\nadd_ceedling_test(\n  test_fifo\n  ${CEEDLING_WORKDIR}/test/test_fifo.c\n  ${CEEDLING_WORKDIR}/../../src/common/tusb_fifo.c\n  \"\"\n  )\n\nadd_ceedling_test(\n  test_usbd\n  ${CEEDLING_WORKDIR}/test/device/usbd/test_usbd.c\n  \"${CEEDLING_WORKDIR}/../../src/tusb.c;${CEEDLING_WORKDIR}/../../src/device/usbd.c;${CEEDLING_WORKDIR}/../../src/device/usbd_control.c;${CEEDLING_WORKDIR}/../../src/common/tusb_fifo.c\"\n  \"${CEEDLING_BUILD_DIR}/test/mocks/test_usbd/mock_dcd.c;${CEEDLING_BUILD_DIR}/test/mocks/test_usbd/mock_msc_device.c\"\n  )\n\nadd_ceedling_test(\n  test_msc_device\n  ${CEEDLING_WORKDIR}/test/device/msc/test_msc_device.c\n  \"${CEEDLING_WORKDIR}/../../src/tusb.c;${CEEDLING_WORKDIR}/../../src/device/usbd.c;${CEEDLING_WORKDIR}/../../src/device/usbd_control.c;${CEEDLING_WORKDIR}/../../src/class/msc/msc_device.c;${CEEDLING_WORKDIR}/../../src/common/tusb_fifo.c\"\n  \"${CEEDLING_BUILD_DIR}/test/mocks/test_msc_device/mock_dcd.c\"\n  )\n\nenable_testing()\n"
  },
  {
    "path": "test/unit-test/ceedling",
    "content": "#!/bin/bash\n\nruby vendor/ceedling/bin/ceedling $*\n"
  },
  {
    "path": "test/unit-test/project.yml",
    "content": "# =========================================================================\n#   Ceedling - Test-Centered Build System for C\n#   ThrowTheSwitch.org\n#   Copyright (c) 2010-25 Mike Karlesky, Mark VanderVoord, & Greg Williams\n#   SPDX-License-Identifier: MIT\n# =========================================================================\n\n---\n:project:\n  # how to use ceedling. If you're not sure, leave this as `gem` and `?`\n  :which_ceedling: gem\n  :ceedling_version: 1.0.0\n  :verbosity: 3\n\n  # optional features. If you don't need them, keep them turned off for performance\n  :use_mocks: TRUE\n  :use_test_preprocessor: :mocks # options are :none, :mocks, :tests, or :all\n  :use_deep_dependencies: :all   # options are :none, :mocks, :tests, or :all\n  :use_backtrace: :simple        # options are :none, :simple, or :gdb\n  :use_decorators: :auto         # decorate Ceedling's output text. options are :auto, :all, or :none\n\n  # tweak the way ceedling handles automatic tasks\n  :build_root: _build\n  :test_file_prefix: test_\n  :default_tasks:\n    - test:all\n\n  # performance options. If your tools start giving mysterious errors, consider\n  # dropping this to 1 to force single-tasking\n  :test_threads: 8\n  :compile_threads: 8\n\n  # enable release build (more details in release_build section below)\n  :release_build: FALSE\n\n# Specify where to find mixins and any that should be enabled automatically\n:mixins:\n  :enabled: []\n  :load_paths: []\n\n# further details to configure the way Ceedling handles test code\n:test_build:\n  :use_assembly: FALSE\n\n:test_runner:\n  # Insert additional #include statements in a generated runner\n  :includes:\n    - osal.h\n\n# further details to configure the way Ceedling handles release code\n:release_build:\n  :output: MyApp.out\n  :use_assembly: FALSE\n  :artifacts: []\n\n# Plugins are optional Ceedling features which can be enabled. Ceedling supports\n# a variety of plugins which may effect the way things are compiled, reported,\n# or may provide new command options. Refer to the readme in each plugin for\n# details on how to use it.\n:plugins:\n  :load_paths: []\n  :enabled:\n    #- beep                           # beeps when finished, so you don't waste time waiting for ceedling\n    - module_generator                # handy for quickly creating source, header, and test templates\n    #- gcov                           # test coverage using gcov. Requires gcc, gcov, and a coverage analyzer like gcovr\n    #- bullseye                       # test coverage using bullseye. Requires bullseye for your platform\n    #- command_hooks                  # write custom actions to be called at different points during the build process\n    #- compile_commands_json_db       # generate a compile_commands.json file\n    #- dependencies                   # automatically fetch 3rd party libraries, etc.\n    #- subprojects                    # managing builds and test for static libraries\n    #- fake_function_framework        # use FFF instead of CMock\n\n    # Report options (You'll want to choose one stdout option, but may choose multiple stored options if desired)\n    #- report_build_warnings_log\n    #- report_tests_gtestlike_stdout\n    #- report_tests_ide_stdout\n    #- report_tests_log_factory\n    - report_tests_pretty_stdout\n    #- report_tests_raw_output_log\n    #- report_tests_teamcity_stdout\n\n# Specify which reports you'd like from the log factory\n:report_tests_log_factory:\n  :reports:\n    - json\n    - junit\n    - cppunit\n    - html\n\n# override the default extensions for your system and toolchain\n:extension:\n  #:header: .h\n  #:source: .c\n  #:assembly: .s\n  #:dependencies: .d\n  #:object: .o\n  :executable: .out\n  #:testpass: .pass\n  #:testfail: .fail\n  #:subprojects: .a\n\n# This is where Ceedling should look for your source and test files.\n# see documentation for the many options for specifying this.\n:paths:\n  :test:\n    - +:test/**\n    - -:test/support\n  :source:\n    - ../../src/**\n  :include:\n    - ../../src/**\n  :support:\n    - test/support\n  :libraries: []\n\n# You can even specify specific files to add or remove from your test\n# and release collections. Usually it's better to use paths and let\n# Ceedling do the work for you!\n:files:\n  :test: []\n  :source: []\n\n# Compilation symbols to be injected into builds\n# See documentation for advanced options:\n#  - Test name matchers for different symbols per test executable build\n#  - Referencing symbols in multiple lists using advanced YAML\n#  - Specifying symbols used during test preprocessing\n:defines:\n  :test:\n    - _UNITY_TEST_\n    - CFG_TUD_EDPT_DEDICATED_HWFIFO=1\n    - CFG_TUSB_FIFO_HWFIFO_DATA_STRIDE=6\n    - CFG_TUSB_FIFO_HWFIFO_ADDR_STRIDE=0\n  :release: []\n\n  # Enable to inject name of a test as a unique compilation symbol into its respective executable build.\n  :use_test_definition: FALSE\n\n# Configure additional command line flags provided to tools used in each build step\n# :flags:\n#   :release:\n#     :compile:         # Add '-Wall' and '--02' to compilation of all files in release target\n#       - -Wall\n#       - --O2\n#   :test:\n#     :compile:\n#       '(_|-)special': # Add '-pedantic' to compilation of all files in all test executables with '_special' or '-special' in their names\n#         - -pedantic\n#       '*':            # Add '-foo' to compilation of all files in all test executables\n#         - -foo\n\n# Configuration Options specific to CMock. See CMock docs for details\n:cmock:\n  # Core configuration\n  :plugins:                        # What plugins should be used by CMock?\n    - :ignore\n    - :ignore_arg\n    - :return_thru_ptr\n    - :callback\n    - :array\n  :verbosity:  2                   # the options being 0 errors only, 1 warnings and errors, 2 normal info, 3 verbose\n  :when_no_prototypes:  :warn      # the options being :ignore, :warn, or :error\n\n  # File configuration\n  :skeleton_path:  ''              # Subdirectory to store stubs when generated (default: '')\n  :mock_prefix:  'mock_'           # Prefix to append to filenames for mocks\n  :mock_suffix:  ''                # Suffix to append to filenames for mocks\n\n  # Parser configuration\n  :strippables:  ['(?:__attribute__\\s*\\([ (]*.*?[ )]*\\)+)']\n  :attributes:\n     - __ramfunc\n     - __irq\n     - __fiq\n     - register\n     - extern\n  :c_calling_conventions:\n     - __stdcall\n     - __cdecl\n     - __fastcall\n  :treat_externs:  :exclude        # the options being :include or :exclud\n  :treat_inlines:  :exclude        # the options being :include or :exclud\n\n  # Type handling configuration\n  #:unity_helper_path: ''          # specify a string of where to find a unity_helper.h file to discover custom type assertions\n  :treat_as:                       # optionally add additional types to map custom types\n    uint8:    HEX8\n    uint16:   HEX16\n    uint32:   UINT32\n    int8:     INT8\n    bool:     UINT8\n  #:treat_as_array:  {}            # hint to cmock that these types are pointers to something\n  #:treat_as_void:  []             # hint to cmock that these types are actually aliases of void\n  :memcmp_if_unknown:  true        # allow cmock to use the memory comparison assertions for unknown types\n  :when_ptr:  :compare_data        # hint to cmock how to handle pointers in general, the options being :compare_ptr, :compare_data, or :smart\n\n  # Mock generation configuration\n  :weak:  ''                       # Symbol to use to declare weak functions\n  :enforce_strict_ordering: true   # Do we want cmock to enforce ordering of all function calls?\n  :fail_on_unexpected_calls: true  # Do we want cmock to fail when it encounters a function call that wasn't expected?\n  :callback_include_count: true    # Do we want cmock to include the number of calls to this callback, when using callbacks?\n  :callback_after_arg_check: false # Do we want cmock to enforce an argument check first when using a callback?\n  #:includes: []                   # You can add additional includes here, or specify the location with the options below\n  #:includes_h_pre_orig_header: []\n  #:includes_h_post_orig_header: []\n  #:includes_c_pre_header:  []\n  #:includes_c_post_header:  []\n  #:array_size_type:  []            # Specify a type or types that should be used for array lengths\n  #:array_size_name:  'size|len'    # Specify a name or names that CMock might automatically recognize as the length of an array\n  :exclude_setjmp_h:  false        # Don't use setjmp when running CMock. Note that this might result in late reporting or out-of-order failures.\n\n# Configuration options specific to Unity.\n:unity:\n  :defines:\n    - UNITY_EXCLUDE_FLOAT\n\n# You can optionally have ceedling create environment variables for you before\n# performing the rest of its tasks.\n:environment: []\n# :environment:\n#   # List enforces order allowing later to reference earlier with inline Ruby substitution\n#   - :var1: value\n#   - :var2: another value\n#   - :path:            # Special PATH handling with platform-specific path separators\n#     - #{ENV['PATH']}  # Environment variables can use inline Ruby substitution\n#     - /another/path/to/include\n\n# LIBRARIES\n# These libraries are automatically injected into the build process. Those specified as\n# common will be used in all types of builds. Otherwise, libraries can be injected in just\n# tests or releases. These options are MERGED with the options in supplemental yaml files.\n:libraries:\n  :placement: :end\n  :flag: \"-l${1}\"\n  :path_flag: \"-L ${1}\"\n  :system: []    # for example, you might list 'm' to grab the math library\n  :test: []\n  :release: []\n\n################################################################\n# PLUGIN CONFIGURATION\n################################################################\n\n# Add -gcov to the plugins list to make sure of the gcov plugin\n# You will need to have gcov and gcovr both installed to make it work.\n# For more information on these options, see docs in plugins/gcov\n:gcov:\n  :summaries: TRUE                # Enable simple coverage summaries to console after tests\n  :report_task: FALSE             # Disabled dedicated report generation task (this enables automatic report generation)\n  :utilities:\n    - gcovr           # Use gcovr to create the specified reports (default).\n    #- ReportGenerator # Use ReportGenerator to create the specified reports.\n  :reports: # Specify one or more reports to generate.\n    # Make an HTML summary report.\n    - HtmlBasic\n    # - HtmlDetailed\n    # - Text\n    # - Cobertura\n    # - SonarQube\n    # - JSON\n    # - HtmlInline\n    # - HtmlInlineAzure\n    # - HtmlInlineAzureDark\n    # - HtmlChart\n    # - MHtml\n    # - Badges\n    # - CsvSummary\n    # - Latex\n    # - LatexSummary\n    # - PngChart\n    # - TeamCitySummary\n    # - lcov\n    # - Xml\n    # - XmlSummary\n  :gcovr:\n    # :html_artifact_filename: TestCoverageReport.html\n    # :html_title: Test Coverage Report\n    :html_medium_threshold: 75\n    :html_high_threshold: 90\n    # :html_absolute_paths: TRUE\n    # :html_encoding: UTF-8\n\n# :module_generator:\n#   :project_root: ./\n#   :source_root: source/\n#   :inc_root: includes/\n#   :test_root: tests/\n#   :naming: :snake #options: :bumpy, :camel, :caps, or :snake\n#   :includes:\n#     :tst: []\n#     :src: []\n#   :boilerplates:\n#     :src: \"\"\n#     :inc: \"\"\n#     :tst: \"\"\n\n# :dependencies:\n#   :libraries:\n#     - :name: WolfSSL\n#       :source_path:   third_party/wolfssl/source\n#       :build_path:    third_party/wolfssl/build\n#       :artifact_path: third_party/wolfssl/install\n#       :fetch:\n#         :method: :zip\n#         :source: \\\\shared_drive\\third_party_libs\\wolfssl\\wolfssl-4.2.0.zip\n#       :environment:\n#         - CFLAGS+=-DWOLFSSL_DTLS_ALLOW_FUTURE\n#       :build:\n#         - \"autoreconf -i\"\n#         - \"./configure --enable-tls13 --enable-singlethreaded\"\n#         - make\n#         - make install\n#       :artifacts:\n#         :static_libraries:\n#           - lib/wolfssl.a\n#         :dynamic_libraries:\n#           - lib/wolfssl.so\n#         :includes:\n#           - include/**\n\n# :subprojects:\n#   :paths:\n#    - :name: libprojectA\n#      :source:\n#        - ./subprojectA/source\n#      :include:\n#        - ./subprojectA/include\n#      :build_root: ./subprojectA/build\n#      :defines: []\n\n# :command_hooks:\n#   :pre_mock_preprocess:\n#   :post_mock_preprocess:\n#   :pre_test_preprocess:\n#   :post_test_preprocess:\n#   :pre_mock_generate:\n#   :post_mock_generate:\n#   :pre_runner_generate:\n#   :post_runner_generate:\n#   :pre_compile_execute:\n#   :post_compile_execute:\n#   :pre_link_execute:\n#   :post_link_execute:\n#   :pre_test_fixture_execute:\n#   :post_test_fixture_execute:\n#   :pre_test:\n#   :post_test:\n#   :pre_release:\n#   :post_release:\n#   :pre_build:\n#   :post_build:\n#   :post_error:\n\n################################################################\n# TOOLCHAIN CONFIGURATION\n################################################################\n\n#:tools:\n# Ceedling defaults to using gcc for compiling, linking, etc.\n# As [:tools] is blank, gcc will be used (so long as it's in your system path)\n# See documentation to configure a given toolchain for use\n#:tools:\n#  :test_compiler:\n#     :executable: gcc\n#     :name: 'gcc compiler'\n#     :arguments:\n#        - -I\"$\": COLLECTION_PATHS_TEST_TOOLCHAIN_INCLUDE               #expands to -I search paths\n#        - -I\"$\": COLLECTION_PATHS_TEST_SUPPORT_SOURCE_INCLUDE_VENDOR   #expands to -I search paths\n#        - -D$: COLLECTION_DEFINES_TEST_AND_VENDOR  #expands to all -D defined symbols\n#        #- -fsanitize=address\n#        - -c ${1}                       #source code input file (Ruby method call param list sub)\n#        - -o ${2}                       #object file output (Ruby method call param list sub)\n#  :test_linker:\n#     :executable: gcc\n#     :name: 'gcc linker'\n#     :arguments:\n#        #- -fsanitize=address\n#        - ${1}               #list of object files to link (Ruby method call param list sub)\n#        - -o ${2}            #executable file output (Ruby method call param list sub)\n#   :test_compiler:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :test_linker:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :test_assembler:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :test_fixture:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :test_includes_preprocessor:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :test_file_preprocessor:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :test_file_preprocessor_directives:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :test_dependencies_generator:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :release_compiler:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :release_linker:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :release_assembler:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n#   :release_dependencies_generator:\n#     :executable:\n#     :arguments: []\n#     :name:\n#     :optional: FALSE\n...\n"
  },
  {
    "path": "test/unit-test/test/device/msc/test_msc_device.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, hathach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n\n#include \"unity.h\"\n\n// Files to test\n#include \"osal/osal.h\"\n#include \"tusb_fifo.h\"\n#include \"tusb.h\"\n#include \"usbd.h\"\nTEST_SOURCE_FILE(\"usbd_control.c\")\nTEST_SOURCE_FILE(\"msc_device.c\")\n\n// Mock File\n#include \"mock_dcd.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\nuint32_t tusb_time_millis_api(void) {\n  return 0;\n}\n\nenum\n{\n  EDPT_CTRL_OUT = 0x00,\n  EDPT_CTRL_IN  = 0x80,\n\n  EDPT_MSC_OUT  = 0x01,\n  EDPT_MSC_IN   = 0x81,\n};\n\nuint8_t const rhport = 0;\n\nenum\n{\n  ITF_NUM_MSC,\n  ITF_NUM_TOTAL\n};\n\n#define CONFIG_TOTAL_LEN    (TUD_CONFIG_DESC_LEN + TUD_MSC_DESC_LEN)\n\nuint8_t const data_desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, ITF_NUM_TOTAL, 0, CONFIG_TOTAL_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n\n  // Interface number, string index, EP Out & EP In address, EP size\n  TUD_MSC_DESCRIPTOR(ITF_NUM_MSC, 0, EDPT_MSC_OUT, EDPT_MSC_IN, TUD_OPT_HIGH_SPEED ? 512 : 64),\n};\n\ntusb_control_request_t const request_set_configuration =\n{\n  .bmRequestType = 0x00,\n  .bRequest      = TUSB_REQ_SET_CONFIGURATION,\n  .wValue        = 1,\n  .wIndex        = 0,\n  .wLength       = 0\n};\n\nuint8_t const* desc_configuration;\n\n\nenum\n{\n  DISK_BLOCK_NUM  = 16, // 8KB is the smallest size that windows allow to mount\n  DISK_BLOCK_SIZE = 512\n};\n\nuint8_t msc_disk[DISK_BLOCK_NUM][DISK_BLOCK_SIZE];\n\n// Invoked when received SCSI_CMD_INQUIRY, v2 with full inquiry response\n// Some inquiry_resp's fields are already filled with default values, application can update them\n// Return length of inquiry response, typically sizeof(scsi_inquiry_resp_t) (36 bytes), can be longer if included vendor data.\nuint32_t tud_msc_inquiry2_cb(uint8_t lun, scsi_inquiry_resp_t* inquiry_resp, uint32_t bufsize) {\n  (void) lun;\n  (void) bufsize;\n  const char vid[] = \"TinyUSB\";\n  const char pid[] = \"Mass Storage\";\n  const char rev[] = \"1.0\";\n\n  memcpy(inquiry_resp->vendor_id, vid, strlen(vid));\n  memcpy(inquiry_resp->product_id, pid, strlen(pid));\n  memcpy(inquiry_resp->product_rev, rev, strlen(rev));\n\n  return sizeof(scsi_inquiry_resp_t); // 36 bytes\n}\n\n// Invoked when received Test Unit Ready command.\n// return true allowing host to read/write this LUN e.g SD card inserted\nbool tud_msc_test_unit_ready_cb(uint8_t lun)\n{\n  (void) lun;\n\n  return true; // RAM disk is always ready\n}\n\n// Invoked when received SCSI_CMD_READ_CAPACITY_10 and SCSI_CMD_READ_FORMAT_CAPACITY to determine the disk size\n// Application update block count and block size\nvoid tud_msc_capacity_cb(uint8_t lun, uint32_t* block_count, uint16_t* block_size)\n{\n  (void) lun;\n\n  *block_count = DISK_BLOCK_NUM;\n  *block_size  = DISK_BLOCK_SIZE;\n}\n\n// Invoked when received Start Stop Unit command\n// - Start = 0 : stopped power mode, if load_eject = 1 : unload disk storage\n// - Start = 1 : active mode, if load_eject = 1 : load disk storage\nbool tud_msc_start_stop_cb(uint8_t lun, uint8_t power_condition, bool start, bool load_eject)\n{\n  (void) lun;\n  (void) power_condition;\n\n  return true;\n}\n\n// Callback invoked when received READ10 command.\n// Copy disk's data to buffer (up to bufsize) and return number of copied bytes.\nint32_t tud_msc_read10_cb(uint8_t lun, uint32_t lba, uint32_t offset, void* buffer, uint32_t bufsize)\n{\n  (void) lun;\n\n  uint8_t const* addr = msc_disk[lba] + offset;\n  memcpy(buffer, addr, bufsize);\n\n  return bufsize;\n}\n\n// Callback invoked when received WRITE10 command.\n// Process data in buffer to disk's storage and return number of written bytes\nint32_t tud_msc_write10_cb(uint8_t lun, uint32_t lba, uint32_t offset, uint8_t* buffer, uint32_t bufsize)\n{\n  (void) lun;\n\n  uint8_t* addr = msc_disk[lba] + offset;\n  memcpy(addr, buffer, bufsize);\n\n  return bufsize;\n}\n\n// Callback invoked when received an SCSI command not in built-in list below\n// - READ_CAPACITY10, READ_FORMAT_CAPACITY, INQUIRY, MODE_SENSE6, REQUEST_SENSE\n// - READ10 and WRITE10 has their own callbacks\nint32_t tud_msc_scsi_cb (uint8_t lun, uint8_t const scsi_cmd[16], void* buffer, uint16_t bufsize)\n{\n  // read10 & write10 has their own callback and MUST not be handled here\n\n  void const* response = NULL;\n  uint16_t resplen = 0;\n\n  return resplen;\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nuint8_t const * tud_descriptor_device_cb(void)\n{\n  return NULL;\n}\n\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index)\n{\n  return desc_configuration;\n}\n\nuint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid)\n{\n  (void) langid;\n\n  return NULL;\n}\n\nvoid setUp(void)\n{\n  dcd_int_disable_Ignore();\n  dcd_int_enable_Ignore();\n\n  if ( !tud_inited() ) {\n    tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO\n    };\n\n    dcd_init_ExpectAndReturn(0, &dev_init, true);\n    tusb_init(0, &dev_init);\n  }\n\n  dcd_event_bus_reset(rhport, TUSB_SPEED_HIGH, false);\n  tud_task();\n}\n\nvoid tearDown(void)\n{\n}\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nvoid test_msc(void)\n{\n  // Read 1 LBA = 0, Block count = 1\n  msc_cbw_t cbw_read10 =\n  {\n    .signature = MSC_CBW_SIGNATURE,\n    .tag = 0xCAFECAFE,\n    .total_bytes = 512,\n    .lun = 0,\n    .dir = TUSB_DIR_IN_MASK,\n    .cmd_len = sizeof(scsi_read10_t)\n  };\n\n  scsi_read10_t cmd_read10 =\n  {\n      .cmd_code    = SCSI_CMD_READ_10,\n      .lba         = tu_htonl(0),\n      .block_count = tu_htons(1)\n  };\n\n  memcpy(cbw_read10.command, &cmd_read10, cbw_read10.cmd_len);\n\n  desc_configuration = data_desc_configuration;\n  uint8_t const* desc_ep = tu_desc_next(tu_desc_next(desc_configuration));\n\n  dcd_event_setup_received(rhport, (uint8_t*) &request_set_configuration, false);\n\n  // open endpoints\n  dcd_edpt_open_ExpectAndReturn(rhport, (tusb_desc_endpoint_t const *) desc_ep, true);\n  dcd_edpt_open_ExpectAndReturn(rhport, (tusb_desc_endpoint_t const *) tu_desc_next(desc_ep), true);\n\n  // Prepare SCSI command\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_MSC_OUT, NULL, sizeof(msc_cbw_t), false, true);\n  dcd_edpt_xfer_IgnoreArg_buffer();\n  dcd_edpt_xfer_ReturnMemThruPtr_buffer( (uint8_t*) &cbw_read10, sizeof(msc_cbw_t));\n\n  // command received\n  dcd_event_xfer_complete(rhport, EDPT_MSC_OUT, sizeof(msc_cbw_t), 0, true);\n\n  // control status\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_IN, NULL, 0, false, true);\n\n  // SCSI Data transfer\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_MSC_IN, NULL, 512, false, true);\n  dcd_edpt_xfer_IgnoreArg_buffer();\n  dcd_event_xfer_complete(rhport, EDPT_MSC_IN, 512, 0, true); // complete\n\n  // SCSI Status\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_MSC_IN, NULL, 13, false, true);\n  dcd_edpt_xfer_IgnoreArg_buffer();\n  dcd_event_xfer_complete(rhport, EDPT_MSC_IN, 13, 0, true);\n\n  // Prepare for next command\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_MSC_OUT, NULL, sizeof(msc_cbw_t), false, true);\n  dcd_edpt_xfer_IgnoreArg_buffer();\n\n  tud_task();\n}\n"
  },
  {
    "path": "test/unit-test/test/device/usbd/test_usbd.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n#include \"unity.h\"\n\n// Files to test\n#include \"osal/osal.h\"\n#include \"tusb_fifo.h\"\n#include \"tusb.h\"\n#include \"usbd.h\"\nTEST_SOURCE_FILE(\"usbd_control.c\")\n\n// Mock File\n#include \"mock_dcd.h\"\n#include \"mock_msc_device.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\nuint32_t tusb_time_millis_api(void) {\n  return 0;\n}\n\nenum\n{\n  EDPT_CTRL_OUT = 0x00,\n  EDPT_CTRL_IN  = 0x80\n};\n\nuint8_t const rhport = 0;\n\ntusb_desc_device_t const data_desc_device =\n{\n    .bLength            = sizeof(tusb_desc_device_t),\n    .bDescriptorType    = TUSB_DESC_DEVICE,\n    .bcdUSB             = 0x0200,\n\n    // Use Interface Association Descriptor (IAD) for CDC\n    // As required by USB Specs IAD's subclass must be common class (2) and protocol must be IAD (1)\n    .bDeviceClass       = TUSB_CLASS_MISC,\n    .bDeviceSubClass    = MISC_SUBCLASS_COMMON,\n    .bDeviceProtocol    = MISC_PROTOCOL_IAD,\n\n    .bMaxPacketSize0    = CFG_TUD_ENDPOINT0_SIZE,\n\n    .idVendor           = 0xCafe,\n    .idProduct          = 0xCafe,\n    .bcdDevice          = 0x0100,\n\n    .iManufacturer      = 0x01,\n    .iProduct           = 0x02,\n    .iSerialNumber      = 0x03,\n\n    .bNumConfigurations = 0x01\n};\n\nuint8_t const data_desc_configuration[] =\n{\n  // Config number, interface count, string index, total length, attribute, power in mA\n  TUD_CONFIG_DESCRIPTOR(1, 0, 0, TUD_CONFIG_DESC_LEN, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n};\n\ntusb_control_request_t const req_get_desc_device =\n{\n  .bmRequestType = 0x80,\n  .bRequest = TUSB_REQ_GET_DESCRIPTOR,\n  .wValue = (TUSB_DESC_DEVICE << 8),\n  .wIndex = 0x0000,\n  .wLength = 64\n};\n\ntusb_control_request_t const req_get_desc_configuration =\n{\n  .bmRequestType = 0x80,\n  .bRequest = TUSB_REQ_GET_DESCRIPTOR,\n  .wValue = (TUSB_DESC_CONFIGURATION << 8),\n  .wIndex = 0x0000,\n  .wLength = 256\n};\n\nuint8_t const* desc_device;\nuint8_t const* desc_configuration;\n\n//--------------------------------------------------------------------+\n//\n//--------------------------------------------------------------------+\nuint8_t const * tud_descriptor_device_cb(void) {\n  return desc_device;\n}\n\nuint8_t const * tud_descriptor_configuration_cb(uint8_t index) {\n  return desc_configuration;\n}\n\nuint16_t const* tud_descriptor_string_cb(uint8_t index, uint16_t langid) {\n  (void) langid;\n\n  return NULL;\n}\n\nvoid setUp(void) {\n  dcd_int_disable_Ignore();\n  dcd_int_enable_Ignore();\n\n  if ( !tud_inited() ) {\n    tusb_rhport_init_t dev_init = {\n      .role = TUSB_ROLE_DEVICE,\n      .speed = TUSB_SPEED_AUTO\n    };\n\n    mscd_init_Expect();\n    dcd_init_ExpectAndReturn(0, &dev_init, true);\n\n    tusb_init(0, &dev_init);\n  }\n}\n\nvoid tearDown(void) {\n}\n\n//--------------------------------------------------------------------+\n// Get Descriptor\n//--------------------------------------------------------------------+\n\n//------------- Device -------------//\nvoid test_usbd_get_device_descriptor(void)\n{\n  desc_device = (uint8_t const *) &data_desc_device;\n  dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false);\n\n  // data\n  dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*)&data_desc_device, sizeof(tusb_desc_device_t), sizeof(tusb_desc_device_t), false, true);\n  dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, sizeof(tusb_desc_device_t), 0, false);\n\n  // status\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_OUT, NULL, 0, false, true);\n  dcd_event_xfer_complete(rhport, EDPT_CTRL_OUT, 0, 0, false);\n  dcd_edpt0_status_complete_ExpectWithArray(rhport, &req_get_desc_device, 1);\n\n  tud_task();\n}\n\nvoid test_usbd_get_device_descriptor_null(void)\n{\n  desc_device = NULL;\n\n  dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_device, false);\n\n  dcd_edpt_stall_Expect(rhport, EDPT_CTRL_OUT);\n  dcd_edpt_stall_Expect(rhport, EDPT_CTRL_IN);\n\n  tud_task();\n}\n\n//------------- Configuration -------------//\n\nvoid test_usbd_get_configuration_descriptor(void)\n{\n  desc_configuration = data_desc_configuration;\n  uint16_t total_len = ((tusb_desc_configuration_t const*) data_desc_configuration)->wTotalLength;\n\n  dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_configuration, false);\n\n  // data\n  dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, 0x80, (uint8_t*) data_desc_configuration, total_len, total_len, false, true);\n  dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, total_len, 0, false);\n\n  // status\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_OUT, NULL, 0, false, true);\n  dcd_event_xfer_complete(rhport, EDPT_CTRL_OUT, 0, 0, false);\n  dcd_edpt0_status_complete_ExpectWithArray(rhport, &req_get_desc_configuration, 1);\n\n  tud_task();\n}\n\nvoid test_usbd_get_configuration_descriptor_null(void)\n{\n  desc_configuration = NULL;\n  dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_configuration, false);\n\n  dcd_edpt_stall_Expect(rhport, EDPT_CTRL_OUT);\n  dcd_edpt_stall_Expect(rhport, EDPT_CTRL_IN);\n\n  tud_task();\n}\n\n//--------------------------------------------------------------------+\n// Control ZLP\n//--------------------------------------------------------------------+\n\nvoid test_usbd_control_in_zlp(void)\n{\n  // 128 byte total len, with EP0 size = 64, and request length = 256\n  // ZLP must be return\n  uint8_t zlp_desc_configuration[CFG_TUD_ENDPOINT0_SIZE*2] =\n  {\n    // Config number, interface count, string index, total length, attribute, power in mA\n    TUD_CONFIG_DESCRIPTOR(1, 0, 0, CFG_TUD_ENDPOINT0_SIZE*2, TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, 100),\n  };\n\n  desc_configuration = zlp_desc_configuration;\n\n  // request, then 1st, 2nd xact + ZLP + status\n  dcd_event_setup_received(rhport, (uint8_t*) &req_get_desc_configuration, false);\n\n  // 1st transaction\n  dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, EDPT_CTRL_IN,\n                                         zlp_desc_configuration, CFG_TUD_ENDPOINT0_SIZE, CFG_TUD_ENDPOINT0_SIZE, false, true);\n  dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, CFG_TUD_ENDPOINT0_SIZE, 0, false);\n\n  // 2nd transaction\n  dcd_edpt_xfer_ExpectWithArrayAndReturn(rhport, EDPT_CTRL_IN,\n                                         zlp_desc_configuration + CFG_TUD_ENDPOINT0_SIZE, CFG_TUD_ENDPOINT0_SIZE, CFG_TUD_ENDPOINT0_SIZE, false, true);\n  dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, CFG_TUD_ENDPOINT0_SIZE, 0, false);\n\n  // Expect Zero length Packet\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_IN, NULL, 0, false, true);\n  dcd_event_xfer_complete(rhport, EDPT_CTRL_IN, 0, 0, false);\n\n  // Status\n  dcd_edpt_xfer_ExpectAndReturn(rhport, EDPT_CTRL_OUT, NULL, 0, false, true);\n  dcd_event_xfer_complete(rhport, EDPT_CTRL_OUT, 0, 0, false);\n  dcd_edpt0_status_complete_ExpectWithArray(rhport, &req_get_desc_configuration, 1);\n\n  tud_task();\n}\n"
  },
  {
    "path": "test/unit-test/test/support/tusb_config.h",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n */\n\n#ifndef TUSB_CONFIG_H_\n#define TUSB_CONFIG_H_\n\n// testing framework\n#include \"unity.h\"\n\n#ifdef __cplusplus\n extern \"C\" {\n#endif\n\n//--------------------------------------------------------------------\n// COMMON CONFIGURATION\n//--------------------------------------------------------------------\n\n// defined by compiler flags for flexibility\n#ifndef CFG_TUSB_MCU\n  //#error CFG_TUSB_MCU must be defined\n  #define CFG_TUSB_MCU  OPT_MCU_NRF5X\n#endif\n\n#ifndef CFG_TUSB_RHPORT0_MODE\n#define CFG_TUSB_RHPORT0_MODE    (OPT_MODE_DEVICE | OPT_MODE_HIGH_SPEED)\n#endif\n\n#define CFG_TUSB_OS              OPT_OS_NONE\n\n// CFG_TUSB_DEBUG is defined by compiler in DEBUG build\n#ifndef CFG_TUSB_DEBUG\n#define CFG_TUSB_DEBUG           1\n#endif\n\n/* USB DMA on some MCUs can only access a specific SRAM region with restriction on alignment.\n * Tinyusb use follows macros to declare transferring memory so that they can be put\n * into those specific section.\n * e.g\n * - CFG_TUSB_MEM SECTION : __attribute__ (( section(\".usb_ram\") ))\n * - CFG_TUSB_MEM_ALIGN   : __attribute__ ((aligned(4)))\n */\n#ifndef CFG_TUSB_MEM_SECTION\n#define CFG_TUSB_MEM_SECTION\n#endif\n\n#ifndef CFG_TUSB_MEM_ALIGN\n#define CFG_TUSB_MEM_ALIGN       __attribute__ ((aligned(4)))\n#endif\n\n//--------------------------------------------------------------------\n// DEVICE CONFIGURATION\n//--------------------------------------------------------------------\n\n#define CFG_TUD_TASK_QUEUE_SZ    100\n#define CFG_TUD_ENDPOINT0_SIZE    64\n\n//------------- CLASS -------------//\n//#define CFG_TUD_CDC              0\n#define CFG_TUD_MSC              1\n//#define CFG_TUD_HID              0\n//#define CFG_TUD_MIDI             0\n//#define CFG_TUD_VENDOR           0\n\n//------------- CDC -------------//\n\n// FIFO size of CDC TX and RX\n#define CFG_TUD_CDC_RX_BUFSIZE   512\n#define CFG_TUD_CDC_TX_BUFSIZE   512\n\n//------------- MSC -------------//\n\n// Buffer size of Device Mass storage\n#define CFG_TUD_MSC_BUFSIZE      512\n\n//------------- HID -------------//\n\n// Should be sufficient to hold ID (if any) + Data\n#define CFG_TUD_HID_EP_BUFSIZE    64\n\n#ifdef __cplusplus\n }\n#endif\n\n#endif /* TUSB_CONFIG_H_ */\n"
  },
  {
    "path": "test/unit-test/test/test_common_func.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2023, Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include <string.h>\n#include \"unity.h\"\n\n#include \"tusb_common.h\"\n\n//--------------------------------------------------------------------+\n// MACRO TYPEDEF CONSTANT ENUM DECLARATION\n//--------------------------------------------------------------------+\n\n\n//------------- IMPLEMENTATION -------------//\n\nvoid setUp(void)\n{\n}\n\nvoid tearDown(void)\n{\n}\n\nvoid test_TU_ARGS_NUM(void)\n{\n  TEST_ASSERT_EQUAL( 0, TU_ARGS_NUM());\n  TEST_ASSERT_EQUAL( 1, TU_ARGS_NUM(a1));\n  TEST_ASSERT_EQUAL( 2, TU_ARGS_NUM(a1, a2));\n  TEST_ASSERT_EQUAL( 3, TU_ARGS_NUM(a1, a2, a3));\n  TEST_ASSERT_EQUAL( 4, TU_ARGS_NUM(a1, a2, a3, a4));\n  TEST_ASSERT_EQUAL( 5, TU_ARGS_NUM(a1, a2, a3, a4, a5));\n  TEST_ASSERT_EQUAL( 6, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6));\n  TEST_ASSERT_EQUAL( 7, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7));\n  TEST_ASSERT_EQUAL( 8, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8));\n  TEST_ASSERT_EQUAL( 9, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9));\n  TEST_ASSERT_EQUAL(10, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10));\n  TEST_ASSERT_EQUAL(11, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11));\n  TEST_ASSERT_EQUAL(12, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12));\n  TEST_ASSERT_EQUAL(13, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13));\n  TEST_ASSERT_EQUAL(14, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14));\n  TEST_ASSERT_EQUAL(15, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15));\n  TEST_ASSERT_EQUAL(16, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16));\n  TEST_ASSERT_EQUAL(17, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17));\n  TEST_ASSERT_EQUAL(18, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18));\n  TEST_ASSERT_EQUAL(19, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19));\n  TEST_ASSERT_EQUAL(20, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20));\n  TEST_ASSERT_EQUAL(21, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21));\n  TEST_ASSERT_EQUAL(22, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22));\n  TEST_ASSERT_EQUAL(23, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23));\n  TEST_ASSERT_EQUAL(24, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24));\n  TEST_ASSERT_EQUAL(25, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25));\n  TEST_ASSERT_EQUAL(26, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26));\n  TEST_ASSERT_EQUAL(27, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27));\n  TEST_ASSERT_EQUAL(28, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28));\n  TEST_ASSERT_EQUAL(29, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29));\n  TEST_ASSERT_EQUAL(30, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30));\n  TEST_ASSERT_EQUAL(31, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31));\n  TEST_ASSERT_EQUAL(32, TU_ARGS_NUM(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32));\n}\n\nvoid test_tu_scatter_read32(void) {\n  // Test data: 0x04030201\n  uint8_t buf1[] = {0x01, 0x02, 0x03, 0x04};\n  uint8_t buf2[] = {0x05, 0x06, 0x07, 0x08};\n\n  // len1=1, len2=0: read 1 byte from buf1\n  TEST_ASSERT_EQUAL_HEX32(0x01, tu_scatter_read32(buf1, 1, buf2, 0));\n\n  // len1=1, len2=1: read 1 byte from buf1, 1 byte from buf2\n  TEST_ASSERT_EQUAL_HEX32(0x0501, tu_scatter_read32(buf1, 1, buf2, 1));\n\n  // len1=1, len2=2: read 1 byte from buf1, 2 bytes from buf2\n  TEST_ASSERT_EQUAL_HEX32(0x060501, tu_scatter_read32(buf1, 1, buf2, 2));\n\n  // len1=1, len2=3: read 1 byte from buf1, 3 bytes from buf2\n  TEST_ASSERT_EQUAL_HEX32(0x07060501, tu_scatter_read32(buf1, 1, buf2, 3));\n\n  // len1=2, len2=0: read 2 bytes from buf1\n  TEST_ASSERT_EQUAL_HEX32(0x0201, tu_scatter_read32(buf1, 2, buf2, 0));\n\n  // len1=2, len2=1: read 2 bytes from buf1, 1 byte from buf2\n  TEST_ASSERT_EQUAL_HEX32(0x050201, tu_scatter_read32(buf1, 2, buf2, 1));\n\n  // len1=2, len2=2: read 2 bytes from buf1, 2 bytes from buf2\n  TEST_ASSERT_EQUAL_HEX32(0x06050201, tu_scatter_read32(buf1, 2, buf2, 2));\n\n  // len1=3, len2=0: read 3 bytes from buf1\n  TEST_ASSERT_EQUAL_HEX32(0x030201, tu_scatter_read32(buf1, 3, buf2, 0));\n\n  // len1=3, len2=1: read 3 bytes from buf1, 1 byte from buf2\n  TEST_ASSERT_EQUAL_HEX32(0x05030201, tu_scatter_read32(buf1, 3, buf2, 1));\n}\n\nvoid test_tu_scatter_write32(void) {\n  uint8_t buf1[4];\n  uint8_t buf2[4];\n\n  // len1=1, len2=0: write 1 byte to buf1\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x01, buf1, 1, buf2, 0);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x00, buf2[0]);\n\n  // len1=1, len2=1: write 1 byte to buf1, 1 byte to buf2\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x0201, buf1, 1, buf2, 1);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x02, buf2[0]);\n\n  // len1=1, len2=2: write 1 byte to buf1, 2 bytes to buf2\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x030201, buf1, 1, buf2, 2);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x02, buf2[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x03, buf2[1]);\n\n  // len1=1, len2=3: write 1 byte to buf1, 3 bytes to buf2\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x04030201, buf1, 1, buf2, 3);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x02, buf2[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x03, buf2[1]);\n  TEST_ASSERT_EQUAL_HEX8(0x04, buf2[2]);\n\n  // len1=2, len2=0: write 2 bytes to buf1\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x0201, buf1, 2, buf2, 0);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x02, buf1[1]);\n\n  // len1=2, len2=1: write 2 bytes to buf1, 1 byte to buf2\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x030201, buf1, 2, buf2, 1);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x02, buf1[1]);\n  TEST_ASSERT_EQUAL_HEX8(0x03, buf2[0]);\n\n  // len1=2, len2=2: write 2 bytes to buf1, 2 bytes to buf2\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x04030201, buf1, 2, buf2, 2);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x02, buf1[1]);\n  TEST_ASSERT_EQUAL_HEX8(0x03, buf2[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x04, buf2[1]);\n\n  // len1=3, len2=0: write 3 bytes to buf1\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x030201, buf1, 3, buf2, 0);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x02, buf1[1]);\n  TEST_ASSERT_EQUAL_HEX8(0x03, buf1[2]);\n\n  // len1=3, len2=1: write 3 bytes to buf1, 1 byte to buf2\n  memset(buf1, 0, sizeof(buf1));\n  memset(buf2, 0, sizeof(buf2));\n  tu_scatter_write32(0x04030201, buf1, 3, buf2, 1);\n  TEST_ASSERT_EQUAL_HEX8(0x01, buf1[0]);\n  TEST_ASSERT_EQUAL_HEX8(0x02, buf1[1]);\n  TEST_ASSERT_EQUAL_HEX8(0x03, buf1[2]);\n  TEST_ASSERT_EQUAL_HEX8(0x04, buf2[0]);\n}\n"
  },
  {
    "path": "test/unit-test/test/test_fifo.c",
    "content": "/*\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 Ha Thach (tinyusb.org)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * This file is part of the TinyUSB stack.\n */\n\n#include <string.h>\n#include \"unity.h\"\n\n#include \"osal/osal.h\"\n#include \"tusb_fifo.h\"\n\n#define FIFO_SIZE 64\nuint8_t   tu_ff_buf[FIFO_SIZE * sizeof(uint8_t)];\ntu_fifo_t tu_ff = TU_FIFO_INIT(tu_ff_buf, FIFO_SIZE, false);\n\ntu_fifo_t            *ff = &tu_ff;\ntu_fifo_buffer_info_t info;\n\nuint8_t test_data[4096];\nuint8_t rd_buf[FIFO_SIZE];\n\nstatic const tu_hwfifo_access_t hwfifo_access_32 = {\n  .data_stride = 4,\n  .param = 0,\n};\n\nstatic const tu_hwfifo_access_t hwfifo_access_16 = {\n  .data_stride = 2,\n  .param = 0,\n};\n\nvoid setUp(void) {\n  tu_fifo_clear(ff);\n  memset(&info, 0, sizeof(tu_fifo_buffer_info_t));\n\n  for (size_t i = 0; i < sizeof(test_data); i++) {\n    test_data[i] = i;\n  }\n  memset(rd_buf, 0, sizeof(rd_buf));\n}\n\nvoid tearDown(void) {\n}\n\n//--------------------------------------------------------------------+\n// Tests\n//--------------------------------------------------------------------+\nvoid test_normal(void) {\n  for (uint8_t i = 0; i < FIFO_SIZE; i++) {\n    tu_fifo_write(ff, &i);\n  }\n\n  for (uint8_t i = 0; i < FIFO_SIZE; i++) {\n    uint8_t c;\n    tu_fifo_read(ff, &c);\n    TEST_ASSERT_EQUAL(i, c);\n  }\n}\n\nvoid test_read_n(void) {\n  uint16_t rd_count;\n\n  // fill up fifo\n  for (uint8_t i = 0; i < FIFO_SIZE; i++) {\n    tu_fifo_write(ff, test_data + i);\n  }\n\n  // case 1: Read index + count < depth\n  // read 0 -> 4\n  rd_count = tu_fifo_read_n(ff, rd_buf, 5);\n  TEST_ASSERT_EQUAL(5, rd_count);\n  TEST_ASSERT_EQUAL_MEMORY(test_data, rd_buf, rd_count); // 0 -> 4\n\n  // case 2: Read index + count > depth\n  // write 10, 11, 12\n  tu_fifo_write(ff, test_data + FIFO_SIZE);\n  tu_fifo_write(ff, test_data + FIFO_SIZE + 1);\n  tu_fifo_write(ff, test_data + FIFO_SIZE + 2);\n\n  rd_count = tu_fifo_read_n(ff, rd_buf, 7);\n  TEST_ASSERT_EQUAL(7, rd_count);\n\n  TEST_ASSERT_EQUAL_MEMORY(test_data + 5, rd_buf, rd_count); // 5 -> 11\n\n  // Should only read until empty\n  TEST_ASSERT_EQUAL(FIFO_SIZE - 5 + 3 - 7, tu_fifo_read_n(ff, rd_buf, 100));\n}\n\nvoid test_write_n(void) {\n  // case 1: wr + count < depth\n  tu_fifo_write_n(ff, test_data, 32); // wr = 32, count = 32\n\n  uint16_t rd_count;\n\n  rd_count = tu_fifo_read_n(ff, rd_buf, 16); // wr = 32, count = 16\n  TEST_ASSERT_EQUAL(16, rd_count);\n  TEST_ASSERT_EQUAL_MEMORY(test_data, rd_buf, rd_count);\n\n  // case 2: wr + count > depth\n  tu_fifo_write_n(ff, test_data + 32, 40); // wr = 72 -> 8, count = 56\n\n  tu_fifo_read_n(ff, rd_buf, 32);          // count = 24\n  TEST_ASSERT_EQUAL_MEMORY(test_data + 16, rd_buf, rd_count);\n\n  TEST_ASSERT_EQUAL(24, tu_fifo_count(ff));\n}\n\nvoid test_write_double_overflowed(void) {\n  tu_fifo_set_overwritable(ff, true);\n\n  uint8_t  rd_buf[FIFO_SIZE] = {0};\n  uint8_t *buf               = test_data;\n\n  // full\n  buf += tu_fifo_write_n(ff, buf, FIFO_SIZE);\n  TEST_ASSERT_EQUAL(FIFO_SIZE, tu_fifo_count(ff));\n\n  // write more, should still full\n  buf += tu_fifo_write_n(ff, buf, FIFO_SIZE - 8);\n  TEST_ASSERT_EQUAL(FIFO_SIZE, tu_fifo_count(ff));\n\n  // double overflowed: in total, write more than > 2*FIFO_SIZE\n  buf += tu_fifo_write_n(ff, buf, 16);\n  TEST_ASSERT_EQUAL(FIFO_SIZE, tu_fifo_count(ff));\n\n  // reading back should give back data from last FIFO_SIZE write\n  tu_fifo_read_n(ff, rd_buf, FIFO_SIZE);\n\n  TEST_ASSERT_EQUAL_MEMORY(buf - 16, rd_buf + FIFO_SIZE - 16, 16);\n\n  // TODO whole buffer should match, but we deliberately not implement it\n  // TEST_ASSERT_EQUAL_MEMORY(buf-FIFO_SIZE, rd_buf, FIFO_SIZE);\n}\n\nstatic uint16_t help_write(uint16_t total, uint16_t n) {\n  tu_fifo_write_n(ff, test_data, n);\n  total = tu_min16(FIFO_SIZE, total + n);\n\n  TEST_ASSERT_EQUAL(total, tu_fifo_count(ff));\n  TEST_ASSERT_EQUAL(FIFO_SIZE - total, tu_fifo_remaining(ff));\n\n  return total;\n}\n\nvoid test_write_overwritable2(void) {\n  tu_fifo_set_overwritable(ff, true);\n\n  // based on actual crash tests detected by fuzzing\n  uint16_t total = 0;\n\n  total = help_write(total, 12);\n  total = help_write(total, 55);\n  total = help_write(total, 73);\n  total = help_write(total, 55);\n  total = help_write(total, 75);\n  total = help_write(total, 84);\n  total = help_write(total, 1);\n  total = help_write(total, 10);\n  total = help_write(total, 12);\n  total = help_write(total, 25);\n  total = help_write(total, 192);\n}\n\nvoid test_peek(void) {\n  uint8_t temp;\n\n  temp = 10;\n  tu_fifo_write(ff, &temp);\n  temp = 20;\n  tu_fifo_write(ff, &temp);\n  temp = 30;\n  tu_fifo_write(ff, &temp);\n\n  temp = 0;\n\n  tu_fifo_peek(ff, &temp);\n  TEST_ASSERT_EQUAL(10, temp);\n\n  tu_fifo_read(ff, &temp);\n  tu_fifo_read(ff, &temp);\n\n  tu_fifo_peek(ff, &temp);\n  TEST_ASSERT_EQUAL(30, temp);\n}\n\nvoid test_get_read_info_when_no_wrap() {\n  uint8_t ch = 1;\n\n  // write 6 items\n  for (uint8_t i = 0; i < 6; i++) {\n    tu_fifo_write(ff, &ch);\n  }\n\n  // read 2 items\n  tu_fifo_read(ff, &ch);\n  tu_fifo_read(ff, &ch);\n\n  tu_fifo_get_read_info(ff, &info);\n\n  TEST_ASSERT_EQUAL(4, info.linear.len);\n  TEST_ASSERT_EQUAL(0, info.wrapped.len);\n\n  TEST_ASSERT_EQUAL_PTR(ff->buffer + 2, info.linear.ptr);\n  TEST_ASSERT_NULL(info.wrapped.ptr);\n}\n\nvoid test_get_read_info_when_wrapped() {\n  uint8_t ch = 1;\n\n  // make fifo full\n  for (uint8_t i = 0; i < FIFO_SIZE; i++) {\n    tu_fifo_write(ff, &ch);\n  }\n\n  // read 6 items\n  for (uint8_t i = 0; i < 6; i++) {\n    tu_fifo_read(ff, &ch);\n  }\n\n  // write 2 items\n  tu_fifo_write(ff, &ch);\n  tu_fifo_write(ff, &ch);\n\n  tu_fifo_get_read_info(ff, &info);\n\n  TEST_ASSERT_EQUAL(FIFO_SIZE - 6, info.linear.len);\n  TEST_ASSERT_EQUAL(2, info.wrapped.len);\n\n  TEST_ASSERT_EQUAL_PTR(ff->buffer + 6, info.linear.ptr);\n  TEST_ASSERT_EQUAL_PTR(ff->buffer, info.wrapped.ptr);\n}\n\nvoid test_get_write_info_when_no_wrap() {\n  uint8_t ch = 1;\n\n  // write 2 items\n  tu_fifo_write(ff, &ch);\n  tu_fifo_write(ff, &ch);\n\n  tu_fifo_get_write_info(ff, &info);\n\n  TEST_ASSERT_EQUAL(FIFO_SIZE - 2, info.linear.len);\n  TEST_ASSERT_EQUAL(0, info.wrapped.len);\n\n  TEST_ASSERT_EQUAL_PTR(ff->buffer + 2, info.linear.ptr);\n  // application should check len instead of ptr.\n  // TEST_ASSERT_NULL(info.wrapped.ptr);\n}\n\nvoid test_get_write_info_when_wrapped() {\n  uint8_t ch = 1;\n\n  // write 6 items\n  for (uint8_t i = 0; i < 6; i++) {\n    tu_fifo_write(ff, &ch);\n  }\n\n  // read 2 items\n  tu_fifo_read(ff, &ch);\n  tu_fifo_read(ff, &ch);\n\n  tu_fifo_get_write_info(ff, &info);\n\n  TEST_ASSERT_EQUAL(FIFO_SIZE - 6, info.linear.len);\n  TEST_ASSERT_EQUAL(2, info.wrapped.len);\n\n  TEST_ASSERT_EQUAL_PTR(ff->buffer + 6, info.linear.ptr);\n  TEST_ASSERT_EQUAL_PTR(ff->buffer, info.wrapped.ptr);\n}\n\nvoid test_empty(void) {\n  uint8_t temp;\n  TEST_ASSERT_TRUE(tu_fifo_empty(ff));\n\n  // read info\n  tu_fifo_get_read_info(ff, &info);\n\n  TEST_ASSERT_EQUAL(0, info.linear.len);\n  TEST_ASSERT_EQUAL(0, info.wrapped.len);\n\n  TEST_ASSERT_NULL(info.linear.ptr);\n  TEST_ASSERT_NULL(info.wrapped.ptr);\n\n  // write info\n  tu_fifo_get_write_info(ff, &info);\n\n  TEST_ASSERT_EQUAL(FIFO_SIZE, info.linear.len);\n  TEST_ASSERT_EQUAL(0, info.wrapped.len);\n\n  TEST_ASSERT_EQUAL_PTR(ff->buffer, info.linear.ptr);\n  // application should check len instead of ptr.\n  // TEST_ASSERT_NULL(info.wrapped.ptr);\n\n  // write 1 then re-check empty\n  tu_fifo_write(ff, &temp);\n  TEST_ASSERT_FALSE(tu_fifo_empty(ff));\n}\n\nvoid test_full(void) {\n  TEST_ASSERT_FALSE(tu_fifo_full(ff));\n\n  for (uint8_t i = 0; i < FIFO_SIZE; i++) {\n    tu_fifo_write(ff, &i);\n  }\n\n  TEST_ASSERT_TRUE(tu_fifo_full(ff));\n\n  // read info\n  tu_fifo_get_read_info(ff, &info);\n\n  TEST_ASSERT_EQUAL(FIFO_SIZE, info.linear.len);\n  TEST_ASSERT_EQUAL(0, info.wrapped.len);\n\n  TEST_ASSERT_EQUAL_PTR(ff->buffer, info.linear.ptr);\n  // skip this, application must check len instead of buffer\n  // TEST_ASSERT_NULL(info.wrapped.ptr);\n\n  // write info\n}\n\nvoid test_rd_idx_wrap(void) {\n  tu_fifo_t ff10;\n  uint8_t   buf[10];\n  uint8_t   dst[10];\n\n  tu_fifo_config(&ff10, buf, 10, 1);\n\n  uint16_t n;\n\n  ff10.wr_idx = 6;\n  ff10.rd_idx = 15;\n\n  n = tu_fifo_read_n(&ff10, dst, 4);\n  TEST_ASSERT_EQUAL(n, 4);\n  TEST_ASSERT_EQUAL(ff10.rd_idx, 0);\n  n = tu_fifo_read_n(&ff10, dst, 4);\n  TEST_ASSERT_EQUAL(n, 4);\n  TEST_ASSERT_EQUAL(ff10.rd_idx, 4);\n  n = tu_fifo_read_n(&ff10, dst, 4);\n  TEST_ASSERT_EQUAL(n, 2);\n  TEST_ASSERT_EQUAL(ff10.rd_idx, 6);\n}\n\nvoid test_advance_write_pointer_cases(void) {\n  tu_fifo_clear(ff);\n\n  tu_fifo_advance_write_pointer(ff, 3);\n  TEST_ASSERT_EQUAL(3, ff->wr_idx);\n  TEST_ASSERT_EQUAL(3, tu_fifo_count(ff));\n\n  // advance to cross depth but stay within 0..2*depth window\n  ff->wr_idx = FIFO_SIZE - 2;            // 62\n  ff->rd_idx = 0;\n  tu_fifo_advance_write_pointer(ff, 10); // 62 + 10 = 72 within window\n  TEST_ASSERT_EQUAL(72, ff->wr_idx);\n  TEST_ASSERT_EQUAL(FIFO_SIZE, tu_fifo_count(ff));\n\n  // advance past the unused index space (beyond 2*depth)\n  ff->wr_idx = (uint16_t)(2 * FIFO_SIZE - 3); // 125\n  ff->rd_idx = 0;\n  tu_fifo_advance_write_pointer(ff, 6);       // forces wrap across unused space\n  TEST_ASSERT_EQUAL(3, ff->wr_idx);\n  TEST_ASSERT_EQUAL(3, tu_fifo_count(ff));\n}\n\nvoid test_advance_read_pointer_cases(void) {\n  tu_fifo_clear(ff);\n\n  ff->wr_idx = 6;\n  tu_fifo_advance_read_pointer(ff, 3);\n  TEST_ASSERT_EQUAL(3, ff->rd_idx);\n  TEST_ASSERT_EQUAL(3, tu_fifo_count(ff));\n\n  ff->wr_idx = FIFO_SIZE + 10;          // 74\n  ff->rd_idx = FIFO_SIZE - 10;          // 54\n  tu_fifo_advance_read_pointer(ff, 20); // move to match write index within window\n  TEST_ASSERT_EQUAL(74, ff->rd_idx);\n  TEST_ASSERT_EQUAL(0, tu_fifo_count(ff));\n\n  ff->wr_idx = 9;\n  ff->rd_idx = (uint16_t)(2 * FIFO_SIZE - 1); // 127\n  tu_fifo_advance_read_pointer(ff, 6);        // crosses unused index space\n  TEST_ASSERT_EQUAL(5, ff->rd_idx);\n  TEST_ASSERT_EQUAL(4, tu_fifo_count(ff));\n}\n\nvoid test_write_n_fixed_addr_rw32_nowrap(void) {\n  tu_fifo_clear(ff);\n\n  volatile uint32_t reg         = 0x11223344;\n  uint8_t           expected[8] = {0x44, 0x33, 0x22, 0x11, 0x44, 0x33, 0x22, 0x11};\n\n  for (uint8_t n = 1; n <= 8; n++) {\n    tu_fifo_clear(ff);\n    uint16_t written = tu_fifo_write_n_access_mode(ff, (const void *)&reg, n, &hwfifo_access_32);\n    TEST_ASSERT_EQUAL(n, written);\n    TEST_ASSERT_EQUAL(n, tu_fifo_count(ff));\n\n    uint8_t out[8] = {0};\n    tu_fifo_read_n(ff, out, n);\n    TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, out, n);\n  }\n}\n\nvoid test_write_n_fixed_addr_rw32_wrapped(void) {\n  tu_fifo_clear(ff);\n\n  volatile uint32_t reg         = 0xA1B2C3D4;\n  uint8_t           expected[8] = {0xD4, 0xC3, 0xB2, 0xA1, 0xD4, 0xC3, 0xB2, 0xA1};\n\n  for (uint8_t n = 1; n <= 8; n++) {\n    tu_fifo_clear(ff);\n    // Position the fifo near the end so writes wrap\n    ff->wr_idx = FIFO_SIZE - 3;\n    ff->rd_idx = FIFO_SIZE - 3;\n\n    uint16_t written = tu_fifo_write_n_access_mode(ff, (const void *)&reg, n, &hwfifo_access_32);\n    TEST_ASSERT_EQUAL(n, written);\n    TEST_ASSERT_EQUAL(n, tu_fifo_count(ff));\n\n    uint8_t out[8] = {0};\n    tu_fifo_read_n(ff, out, n);\n    TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, out, n);\n  }\n}\n\nvoid test_read_n_fixed_addr_rw32_nowrap(void) {\n  uint8_t pattern[8] = {0x10, 0x21, 0x32, 0x43, 0x54, 0x65, 0x76, 0x87};\n  uint32_t reg_expected[8] = {\n      0x00000010, 0x00002110, 0x00322110, 0x43322110, 0x00000054, 0x00006554, 0x00766554, 0x87766554};\n\n  for (uint8_t n = 1; n <= 8; n++) {\n    tu_fifo_clear(ff);\n    tu_fifo_write_n(ff, pattern, 8);\n\n    uint32_t reg      = 0;\n    uint16_t read_cnt = tu_fifo_read_n_access_mode(ff, &reg, n, &hwfifo_access_32);\n    TEST_ASSERT_EQUAL(n, read_cnt);\n    TEST_ASSERT_EQUAL(8 - n, tu_fifo_count(ff));\n\n    TEST_ASSERT_EQUAL_HEX32(reg_expected[n - 1], reg);\n  }\n}\n\nvoid test_read_n_fixed_addr_rw32_wrapped(void) {\n  uint8_t pattern[8] = {0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5, 0x96, 0x87};\n  uint32_t reg_expected[8] = {\n      0x000000F0, 0x0000E1F0, 0x00D2E1F0, 0xC3D2E1F0, 0x000000B4, 0x0000A5B4, 0x0096A5B4, 0x8796A5B4};\n\n  for (uint8_t n = 1; n <= 8; n++) {\n    tu_fifo_clear(ff);\n    ff->rd_idx = FIFO_SIZE - 2;\n    ff->wr_idx = (uint16_t)(ff->rd_idx + n);\n\n    for (uint8_t i = 0; i < n; i++) {\n      uint8_t idx = (uint8_t)((ff->rd_idx + i) % FIFO_SIZE);\n      ff->buffer[idx] = pattern[i];\n    }\n\n    uint32_t reg      = 0;\n    uint16_t read_cnt = tu_fifo_read_n_access_mode(ff, &reg, n, &hwfifo_access_32);\n    TEST_ASSERT_EQUAL(n, read_cnt);\n    TEST_ASSERT_EQUAL(0, tu_fifo_count(ff));\n\n    TEST_ASSERT_EQUAL_HEX32(reg_expected[n - 1], reg);\n  }\n}\n\nvoid test_write_n_fixed_addr_rw16_nowrap(void) {\n  tu_fifo_clear(ff);\n\n  volatile uint16_t reg         = 0x1122;\n  uint8_t           expected[6] = {0x22, 0x11, 0x22, 0x11, 0x22, 0x11};\n\n  for (uint8_t n = 1; n <= 6; n++) {\n    tu_fifo_clear(ff);\n    uint16_t written = tu_fifo_write_n_access_mode(ff, (const void *)&reg, n, &hwfifo_access_16);\n    TEST_ASSERT_EQUAL(n, written);\n    TEST_ASSERT_EQUAL(n, tu_fifo_count(ff));\n\n    uint8_t out[6] = {0};\n    tu_fifo_read_n(ff, out, n);\n    TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, out, n);\n  }\n}\n\nvoid test_write_n_fixed_addr_rw16_wrapped(void) {\n  tu_fifo_clear(ff);\n\n  volatile uint16_t reg         = 0xA1B2;\n  uint8_t           expected[6] = {0xB2, 0xA1, 0xB2, 0xA1, 0xB2, 0xA1};\n\n  for (uint8_t n = 1; n <= 6; n++) {\n    tu_fifo_clear(ff);\n    // Position the fifo near the end so writes wrap\n    ff->wr_idx = FIFO_SIZE - 3;\n    ff->rd_idx = FIFO_SIZE - 3;\n\n    uint16_t written = tu_fifo_write_n_access_mode(ff, (const void *)&reg, n, &hwfifo_access_16);\n    TEST_ASSERT_EQUAL(n, written);\n    TEST_ASSERT_EQUAL(n, tu_fifo_count(ff));\n\n    uint8_t out[6] = {0};\n    tu_fifo_read_n(ff, out, n);\n    TEST_ASSERT_EQUAL_UINT8_ARRAY(expected, out, n);\n  }\n}\n\nvoid test_read_n_fixed_addr_rw16_nowrap(void) {\n  uint8_t pattern[6] = {0x10, 0x21, 0x32, 0x43, 0x54, 0x65};\n  uint16_t reg_expected[6] = {0x0010, 0x2110, 0x0032, 0x4332, 0x0054, 0x6554};\n\n  for (uint8_t n = 1; n <= 6; n++) {\n    tu_fifo_clear(ff);\n    tu_fifo_write_n(ff, pattern, 6);\n\n    uint16_t reg     = 0;\n    uint16_t read_cnt = tu_fifo_read_n_access_mode(ff, &reg, n, &hwfifo_access_16);\n    TEST_ASSERT_EQUAL(n, read_cnt);\n    TEST_ASSERT_EQUAL(6 - n, tu_fifo_count(ff));\n\n    TEST_ASSERT_EQUAL_HEX16(reg_expected[n - 1], reg);\n  }\n}\n\nvoid test_read_n_fixed_addr_rw16_wrapped(void) {\n  uint8_t pattern[6] = {0xF0, 0xE1, 0xD2, 0xC3, 0xB4, 0xA5};\n  uint16_t reg_expected[6] = {0x00F0, 0xE1F0, 0x00D2, 0xC3D2, 0x00B4, 0xA5B4};\n\n  for (uint8_t n = 1; n <= 6; n++) {\n    tu_fifo_clear(ff);\n    ff->rd_idx = FIFO_SIZE - 1;\n    ff->wr_idx = (uint16_t)(ff->rd_idx + n);\n\n    for (uint8_t i = 0; i < n; i++) {\n      uint8_t idx = (uint8_t)((ff->rd_idx + i) % FIFO_SIZE);\n      ff->buffer[idx] = pattern[i];\n    }\n\n    uint16_t reg     = 0;\n    uint16_t read_cnt = tu_fifo_read_n_access_mode(ff, &reg, n, &hwfifo_access_16);\n    TEST_ASSERT_EQUAL(n, read_cnt);\n    TEST_ASSERT_EQUAL(0, tu_fifo_count(ff));\n\n    TEST_ASSERT_EQUAL_HEX16(reg_expected[n - 1], reg);\n  }\n}\n\nvoid test_get_read_info_advanced_cases(void) {\n  tu_fifo_clear(ff);\n\n  ff->wr_idx = 20;\n  ff->rd_idx = 2;\n  tu_fifo_get_read_info(ff, &info);\n  TEST_ASSERT_EQUAL(18, info.linear.len);\n  TEST_ASSERT_EQUAL(0, info.wrapped.len);\n  TEST_ASSERT_EQUAL_PTR(ff->buffer + 2, info.linear.ptr);\n  TEST_ASSERT_NULL(info.wrapped.ptr);\n\n  ff->wr_idx = 68; // ptr = 4\n  ff->rd_idx = 56; // ptr = 56\n  tu_fifo_get_read_info(ff, &info);\n  TEST_ASSERT_EQUAL(8, info.linear.len);\n  TEST_ASSERT_EQUAL(4, info.wrapped.len);\n  TEST_ASSERT_EQUAL_PTR(ff->buffer + 56, info.linear.ptr);\n  TEST_ASSERT_EQUAL_PTR(ff->buffer, info.wrapped.ptr);\n}\n\nvoid test_get_write_info_advanced_cases(void) {\n  tu_fifo_clear(ff);\n\n  ff->wr_idx = 10;\n  ff->rd_idx = 104; // ptr = 40\n  tu_fifo_get_write_info(ff, &info);\n  TEST_ASSERT_EQUAL(30, info.linear.len);\n  TEST_ASSERT_EQUAL(0, info.wrapped.len);\n  TEST_ASSERT_EQUAL_PTR(ff->buffer + 10, info.linear.ptr);\n  TEST_ASSERT_NULL(info.wrapped.ptr);\n\n  ff->wr_idx = 60;\n  ff->rd_idx = 20;\n  tu_fifo_get_write_info(ff, &info);\n  TEST_ASSERT_EQUAL(4, info.linear.len);\n  TEST_ASSERT_EQUAL(20, info.wrapped.len);\n  TEST_ASSERT_EQUAL_PTR(ff->buffer + 60, info.linear.ptr);\n  TEST_ASSERT_EQUAL_PTR(ff->buffer, info.wrapped.ptr);\n}\n\nvoid test_correct_read_pointer_cases(void) {\n  tu_fifo_clear(ff);\n\n  // wr beyond depth: rd should be wr - depth\n  ff->wr_idx = FIFO_SIZE + 6; // 70\n  tu_fifo_correct_read_pointer(ff);\n  TEST_ASSERT_EQUAL(6, ff->rd_idx);\n\n  // wr exactly at depth: rd should wrap to zero\n  ff->wr_idx = FIFO_SIZE;\n  tu_fifo_correct_read_pointer(ff);\n  TEST_ASSERT_EQUAL(0, ff->rd_idx);\n\n  // wr below depth: rd should be wr + depth\n  ff->wr_idx = 10;\n  tu_fifo_correct_read_pointer(ff);\n  TEST_ASSERT_EQUAL(FIFO_SIZE + 10, ff->rd_idx);\n}\n"
  },
  {
    "path": "tools/build.py",
    "content": "#!/usr/bin/env python3\nimport argparse\nimport random\nimport os\nimport sys\nimport time\nimport subprocess\nimport shlex\nfrom pathlib import Path\nfrom multiprocessing import Pool\n\nimport build_utils\n\nSTATUS_OK = \"\\033[32mOK\\033[0m\"\nSTATUS_FAILED = \"\\033[31mFailed\\033[0m\"\nSTATUS_SKIPPED = \"\\033[33mSkipped\\033[0m\"\n\nRET_OK = 0\nRET_FAILED = 1\nRET_SKIPPED = 2\n\nbuild_format = '| {:30} | {:40} | {:16} | {:5} |'\nbuild_separator = '-' * 95\nbuild_status = [STATUS_OK, STATUS_FAILED, STATUS_SKIPPED]\n\nverbose = False\nparallel_jobs = os.cpu_count()\n\n# CI board control lists (used when running under CI)\nci_skip_boards = {\n    'rp2040': [\n        'adafruit_feather_rp2040_usb_host',\n        'adafruit_fruit_jam',\n        'adafruit_metro_rp2350',\n        'feather_rp2040_max3421',\n        'pico_sdk',\n        'raspberry_pi_pico_w',\n    ],\n}\n\nci_preferred_boards = {\n    'samd2x_l2x': ['metro_m0_express'],\n    'samd5x_e5x': ['metro_m4_express'],\n    'stm32h7': ['stm32h743eval']\n}\n\n\n# -----------------------------\n# Helper\n# -----------------------------\ndef run_cmd(cmd):\n    if isinstance(cmd, str):\n        raise TypeError(\"run_cmd expects a list/tuple of args, not a string\")\n    args = cmd\n    cmd_display = \" \".join(args)\n    r = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)\n    title = f'Command Error: {cmd_display}'\n    if r.returncode != 0:\n        # print build output if failed\n        if os.getenv('GITHUB_ACTIONS'):\n            print(f\"::group::{title}\")\n            print(r.stdout.decode(\"utf-8\"))\n            print(f\"::endgroup::\")\n        else:\n            print(title)\n            print(r.stdout.decode(\"utf-8\"))\n    elif verbose:\n        print(cmd_display)\n        print(r.stdout.decode(\"utf-8\"))\n    return r\n\n\ndef find_family(board):\n    bsp_dir = Path(\"hw/bsp\")\n    for family_dir in bsp_dir.iterdir():\n        if family_dir.is_dir():\n            board_dir = family_dir / 'boards' / board\n            if board_dir.exists():\n                return family_dir.name\n    return None\n\n\ndef get_examples(family):\n    all_examples = []\n    for d in os.scandir(\"examples\"):\n        if d.is_dir() and 'cmake' not in d.name and 'build_system' not in d.name:\n            for entry in os.scandir(d.path):\n                if entry.is_dir() and 'cmake' not in entry.name:\n                    if family != 'espressif' or 'freertos' in entry.name:\n                        all_examples.append(d.name + '/' + entry.name)\n\n    if family == 'espressif':\n        all_examples.append('device/board_test')\n        all_examples.append('device/video_capture')\n        all_examples.append('host/device_info')\n    all_examples.sort()\n    return all_examples\n\n\ndef print_build_result(board, build_target, status, duration):\n    if isinstance(duration, (int, float)):\n        duration = \"{:.2f}s\".format(duration)\n    print(build_format.format(board, build_target, build_status[status], duration))\n\n# -----------------------------\n# CMake\n# -----------------------------\ndef cmake_board(board, build_args, build_flags_on, build_targets):\n    ret = [0, 0, 0]\n    start_time = time.monotonic()\n\n    build_dir = f'cmake-build/cmake-build-{board}'\n    build_flags = []\n    if len(build_flags_on) > 0:\n        cli_flags = ' '.join(f'-D{flag}=1' for flag in build_flags_on)\n        build_flags.append(f'-DCFLAGS_CLI={cli_flags}')\n        build_dir += '-f1_' + '_'.join(build_flags_on)\n\n    family = find_family(board)\n    if family == 'espressif':\n        # for espressif, we have to build example individually\n        all_examples = get_examples(family)\n        for example in all_examples:\n            if build_utils.skip_example(example, board):\n                ret[2] += 1\n            else:\n                rcmd = run_cmd([\n                    'idf.py', '-C', f'examples/{example}', '-B', f'{build_dir}/{example}', '-GNinja',\n                    f'-DBOARD={board}', *build_flags, 'build'\n                ])\n                ret[0 if rcmd.returncode == 0 else 1] += 1\n    else:\n        rcmd = run_cmd(['cmake', 'examples', '-B', build_dir, '-GNinja',\n                        f'-DBOARD={board}', '-DCMAKE_BUILD_TYPE=MinSizeRel', '-DLINKERMAP_OPTION=-q -f tinyusb/src',\n                        *build_args, *build_flags])\n        if rcmd.returncode == 0:\n            cmd = [\"cmake\", \"--build\", build_dir, '--parallel', str(parallel_jobs)]\n            for target in build_targets:\n                rcmd = run_cmd(cmd + ['--target', target])\n                if rcmd.returncode != 0:\n                    break\n        ret[0 if rcmd.returncode == 0 else 1] += 1\n\n    print_build_result(board, ','.join(build_targets), 0 if ret[1] == 0 else 1, time.monotonic() - start_time)\n    return ret\n\n\n# -----------------------------\n# Make\n# -----------------------------\ndef make_one_example(example, board, make_option, build_targets):\n    # Check if board is skipped\n    if build_utils.skip_example(example, board):\n        print_build_result(board, example, 2, '-')\n        r = 2\n    else:\n        start_time = time.monotonic()\n        make_cmd = [\"make\", \"-C\", f\"examples/{example}\", f\"BOARD={board}\", '-j', str(parallel_jobs)]\n        if make_option:\n            make_cmd += shlex.split(make_option)\n        r = 0\n        for target in build_targets:\n            build_result = run_cmd(make_cmd + [target])\n            if build_result.returncode != 0:\n                r = 1\n                break\n        print_build_result(board, example, r, time.monotonic() - start_time)\n\n    ret = [0, 0, 0]\n    ret[r] = 1\n    return ret\n\n\ndef make_board(board, build_args, build_targets):\n    print(build_separator)\n    family = find_family(board);\n    all_examples = get_examples(family)\n    start_time = time.monotonic()\n    ret = [0, 0, 0]\n    if family == 'espressif' or family == 'rp2040':\n        # espressif and rp2040 do not support make, use cmake instead\n        final_status = 2\n    else:\n        with Pool(processes=os.cpu_count()) as pool:\n            pool_args = list((map(lambda e, b=board, o=f\"{build_args}\", t=build_targets: [e, b, o, t], all_examples)))\n            r = pool.starmap(make_one_example, pool_args)\n            # sum all element of same index (column sum)\n            ret = list(map(sum, list(zip(*r))))\n        final_status = 0 if ret[1] == 0 else 1\n    print_build_result(board, 'all', final_status, time.monotonic() - start_time)\n    return ret\n\n\n# -----------------------------\n# Build Family\n# -----------------------------\ndef build_boards_list(boards, build_defines, build_system, build_flags_on, build_targets):\n    ret = [0, 0, 0]\n    for b in boards:\n        r = [0, 0, 0]\n        if build_system == 'cmake':\n            build_args = [f'-D{d}' for d in build_defines]\n            r = cmake_board(b, build_args, build_flags_on, build_targets)\n        elif build_system == 'make':\n            build_args = ' '.join(f'{d}' for d in build_defines)\n            r = make_board(b, build_args, build_targets)\n        ret[0] += r[0]\n        ret[1] += r[1]\n        ret[2] += r[2]\n    return ret\n\n\ndef get_family_boards(family, one_random, one_first):\n    \"\"\"Get list of boards for a family.\n\n    Args:\n        family: Family name\n        one_random: If True, return only one random board\n        one_first: If True, return only the first board (alphabetical)\n\n    Returns:\n        List of board names\n    \"\"\"\n    skip_list = []\n    preferred_list = []\n    if os.getenv('GITHUB_ACTIONS') or os.getenv('CIRCLECI'):\n        skip_list = ci_skip_boards.get(family, [])\n        preferred_list = ci_preferred_boards.get(family, [])\n\n    all_boards = []\n    for entry in os.scandir(f\"hw/bsp/{family}/boards\"):\n        if entry.is_dir() and entry.name not in skip_list:\n            all_boards.append(entry.name)\n    if not all_boards:\n        print(f\"No boards found for family '{family}'\")\n        return []\n    all_boards.sort()\n\n    # If only-one flags are set, honor select list first, then pick first or random\n    if one_first or one_random:\n        if preferred_list:\n            return [preferred_list[0]]\n        if one_first:\n            return [all_boards[0]]\n        if one_random:\n            return [random.choice(all_boards)]\n\n    return all_boards\n\n\n# -----------------------------\n# Main\n# -----------------------------\ndef main():\n    global verbose\n    global parallel_jobs\n\n    parser = argparse.ArgumentParser()\n    parser.add_argument('families', nargs='*', default=[], help='Families to build')\n    parser.add_argument('-b', '--board', action='append', default=[], help='Boards to build')\n    parser.add_argument('-t', '--toolchain', default='gcc', help='Toolchain to use, default is gcc')\n    parser.add_argument('-s', '--build-system', default='cmake', help='Build system to use, default is cmake')\n    parser.add_argument('-D', '--define-symbol', action='append', default=[], help='Define to pass to build system')\n    parser.add_argument('-f1', '--build-flags-on', action='append', default=[], help='Build flag to pass to build system')\n    parser.add_argument('--one-random', action='store_true', default=False,\n                        help='Build only one random board of each specified family')\n    parser.add_argument('--one-first', action='store_true', default=False,\n                        help='Build only the first board (alphabetical) of each specified family')\n    parser.add_argument('-j', '--jobs', type=int, default=os.cpu_count(), help='Number of jobs to run in parallel')\n    parser.add_argument('-T', '--target', action='append', default=[],\n                        help='Build target to use, may be specified multiple times (default: all)')\n    parser.add_argument('-v', '--verbose', action='store_true', help='Verbose output')\n    args = parser.parse_args()\n\n    families = args.families\n    boards = args.board\n    toolchain = args.toolchain\n    build_system = args.build_system\n    build_defines = args.define_symbol\n    build_flags_on = args.build_flags_on\n    one_random = args.one_random\n    one_first = args.one_first\n    build_targets = args.target if args.target else ['all']\n    verbose = args.verbose\n    parallel_jobs = args.jobs\n\n    build_defines.append(f'TOOLCHAIN={toolchain}')\n\n    if len(families) == 0 and len(boards) == 0:\n        print(\"Please specify families or board to build\")\n        return 1\n\n    print(build_separator)\n    print(build_format.format('Board', 'Target', '\\033[39mResult\\033[0m', 'Time'))\n    total_time = time.monotonic()\n\n    # get all families\n    all_families = []\n    if 'all' in families:\n        for entry in os.scandir(\"hw/bsp\"):\n            if entry.is_dir() and entry.name != 'espressif' and os.path.isfile(entry.path + \"/family.cmake\"):\n                all_families.append(entry.name)\n    else:\n        all_families = list(families)\n    all_families.sort()\n\n    # get boards from families and append to boards list\n    all_boards = list(boards)\n    for f in all_families:\n        all_boards.extend(get_family_boards(f, one_random, one_first))\n\n    # build all boards\n    result = build_boards_list(all_boards, build_defines, build_system, build_flags_on, build_targets)\n\n    total_time = time.monotonic() - total_time\n    print(build_separator)\n    print(f\"Build Summary: {result[0]} {STATUS_OK}, {result[1]} {STATUS_FAILED} and took {total_time:.2f}s\")\n    print(build_separator)\n\n    return result[1]\n\n\nif __name__ == '__main__':\n    sys.exit(main())\n"
  },
  {
    "path": "tools/build_utils.py",
    "content": "#!/usr/bin/env python3\nimport subprocess\nimport pathlib\nimport re\n\nbuild_format = '| {:29} | {:30} | {:18} | {:7} | {:6} | {:6} |'\n\nSUCCEEDED = \"\\033[32msucceeded\\033[0m\"\nFAILED = \"\\033[31mfailed\\033[0m\"\nSKIPPED = \"\\033[33mskipped\\033[0m\"\n\n\ndef skip_example(example, board):\n    ex_dir = pathlib.Path('examples/') / example\n    bsp = pathlib.Path(\"hw/bsp\")\n\n    # board within family\n    board_dir = list(bsp.glob(\"*/boards/\" + board))\n    if not board_dir:\n        # Skip unknown boards\n        return True\n\n    board_dir = list(board_dir)[0]\n    family_dir = board_dir.parent.parent\n    family = family_dir.name\n\n    # family.mk\n    family_mk = family_dir / \"family.mk\"\n    if not family_mk.exists():\n        family_mk = family_dir / \"family.cmake\"\n    mk_contents = family_mk.read_text()\n\n    # Find the mcu, first in family mk then board mk\n    if \"CFG_TUSB_MCU=OPT_MCU_\" not in mk_contents:\n        board_mk = board_dir / \"board.mk\"\n        if not board_mk.exists():\n            board_mk = board_dir / \"board.cmake\"\n        mk_contents = board_mk.read_text()\n\n    mcu = \"NONE\"\n    if family == \"espressif\":\n        for line in mk_contents.splitlines():\n            match = re.search(r'set\\(IDF_TARGET\\s+\"([^\"]+)\"\\)', line)\n            if match:\n                mcu = match.group(1).upper()\n                break\n    else:\n        for token in mk_contents.split():\n            if \"CFG_TUSB_MCU=OPT_MCU_\" in token:\n                # Strip \" because cmake files has them.\n                token = token.strip(\"\\\"\")\n                _, opt_mcu = token.split(\"=\")\n                mcu = opt_mcu[len(\"OPT_MCU_\"):]\n            if mcu != \"NONE\":\n                break\n\n    # Skip all OPT_MCU_NONE these are WIP port\n    if mcu == \"NONE\":\n        return True\n\n    max3421_enabled = False\n    for line in mk_contents.splitlines():\n        if \"MAX3421_HOST=1\" in line or 'MAX3421_HOST 1' in line:\n            max3421_enabled = True\n            break\n\n    skip_file = ex_dir / \"skip.txt\"\n    only_file = ex_dir / \"only.txt\"\n\n    if skip_file.exists():\n        skips = skip_file.read_text().split()\n        if (\"mcu:\" + mcu in skips or\n            \"board:\" + board in skips or\n            \"family:\" + family in skips):\n            return True\n\n    if only_file.exists():\n        onlys = only_file.read_text().split()\n        if not (\"mcu:\" + mcu in onlys or\n                (\"mcu:MAX3421\" in onlys and max3421_enabled) or\n                \"board:\" + board in onlys or\n                \"family:\" + family in onlys):\n            return True\n\n    return False\n\n\ndef build_size(make_cmd):\n    size_output = subprocess.run(make_cmd + ' size', shell=True, stdout=subprocess.PIPE).stdout.decode(\"utf-8\").splitlines()\n    for i, l in enumerate(size_output):\n        text_title = 'text\t   data\t    bss\t    dec'\n        if text_title in l:\n            size_list = size_output[i+1].split('\\t')\n            flash_size = int(size_list[0])\n            sram_size = int(size_list[1]) + int(size_list[2])\n            return (flash_size, sram_size)\n\n    return (0, 0)\n"
  },
  {
    "path": "tools/codespell/exclude-file.txt",
    "content": ""
  },
  {
    "path": "tools/codespell/ignore-words.txt",
    "content": "attch\nbusses\ndout\nendianess\nfro\nhsi\ninout\nmot\npris\nptd\nser\nsie\nsynopsys\nte\nthre\ntre\n"
  },
  {
    "path": "tools/file2carray.py",
    "content": "#!/usr/bin/env python3\nimport argparse\nimport random\nimport os\nimport sys\nimport time\nimport subprocess\nfrom pathlib import Path\nfrom multiprocessing import Pool\nfrom weakref import finalize\n\n\ndef print_carray(f, payload):\n    while len(payload) > 0:\n        f.write('\\n    ')\n        f.write(', '.join('0x{:02x}'.format(x) for x in payload[0:16]))\n        f.write(',')\n        payload = payload[16:]\n    f.write('\\n')\n\n\ndef main():\n    parser = argparse.ArgumentParser(description='Convert binary files to C array format')\n    parser.add_argument('files', nargs='+', help='Binary files to convert')\n    args = parser.parse_args()\n\n    files = args.files\n    for fin_name in files:\n        if not os.path.isfile(fin_name):\n            print(f\"File {fin_name} does not exist\")\n            continue\n\n        with open(fin_name, 'rb') as fin:\n            contents = fin.read()\n            fout_name = fin_name + '.h'\n            with open(fout_name, 'w') as fout:\n                print(f\"Converting {fin_name} to {fout_name}\")\n                fout.write(f'enum {{ BINDATA_LEN = {len(contents)} }};\\n')\n                fout.write(f'const size_t bindata_len = BINDATA_LEN;\\n')\n                fout.write(f'const uint8_t bindata[] __attribute__((aligned(16))) = {{')\n                print_carray(fout, contents)\n                fout.write('};\\n')\n\n\nif __name__ == '__main__':\n    sys.exit(main())\n"
  },
  {
    "path": "tools/gen_doc.py",
    "content": "#!/usr/bin/env python3\nimport re\nimport pandas as pd\nfrom tabulate import tabulate\nfrom pathlib import Path\nfrom get_deps import deps_all\n\n# TOP is tinyusb root dir\nTOP = Path(__file__).parent.parent.resolve()\n\n\n# -----------------------------------------\n# Dependencies\n# -----------------------------------------\ndef gen_deps_doc():\n    deps_rst = Path(TOP) / \"docs/reference/dependencies.rst\"\n    df = pd.DataFrame.from_dict(deps_all, orient='index', columns=['Repo', 'Commit', 'Required by'])\n    df = df[['Repo', 'Commit', 'Required by']].sort_index()\n    df = df.rename_axis(\"Local Path\")\n\n    outstr = f\"\"\"\\\n************\nDependencies\n************\n\nMCU low-level peripheral drivers and external libraries for building TinyUSB examples\n\n{tabulate(df, headers=\"keys\", tablefmt='rst')}\n\"\"\"\n\n    with deps_rst.open('w') as f:\n        f.write(outstr)\n\n\n# -----------------------------------------\n# Dependencies\n# -----------------------------------------\ndef extract_metadata(file_path):\n    metadata = {}\n    try:\n        with open(file_path, 'r') as file:\n            content = file.read()\n            # Match metadata block\n            match = re.search(r'/\\*\\s*metadata:(.*?)\\*/', content, re.DOTALL)\n            if match:\n                block = match.group(1)\n                # Extract key-value pairs\n                for line in block.splitlines():\n                    key_value = re.match(r'\\s*(\\w+):\\s*(.+)', line)\n                    if key_value:\n                        key, value = key_value.groups()\n                        metadata[key] = value.strip()\n    except FileNotFoundError:\n        pass\n    return metadata\n\n\ndef gen_boards_doc():\n    # 'Manufacturer' : { 'Board' }\n    vendor_data = {}\n    # 'Board' : [ 'Name', 'Family', 'url', 'note' ]\n    all_boards = {}\n    #  extract metadata from family.c\n    for family_dir in sorted((Path(TOP) / \"hw/bsp\").iterdir()):\n        if family_dir.is_dir():\n            family_c = family_dir / \"family.c\"\n            if not family_c.exists():\n                family_c = family_dir / \"boards/family.c\"\n            f_meta = extract_metadata(family_c)\n            if not f_meta:\n                continue\n            manuf = f_meta.get('manufacturer', '')\n            if manuf not in vendor_data:\n                vendor_data[manuf] = {}\n            # extract metadata from board.h\n            for board_dir in sorted((family_dir / \"boards\").iterdir()):\n                if board_dir.is_dir():\n                    b_meta = extract_metadata(board_dir / \"board.h\")\n                    if not b_meta:\n                        continue\n                    b_entry = [\n                        b_meta.get('name', ''),\n                        family_dir.name,\n                        b_meta.get('url', ''),\n                        b_meta.get('note', '')\n                    ]\n                    vendor_data[manuf][board_dir.name] = b_entry\n    boards_rst = Path(TOP) / \"docs/reference/boards.rst\"\n    with boards_rst.open('w') as f:\n        title = f\"\"\"\\\n****************\nSupported Boards\n****************\n\nThe board support code is only used for self-contained examples and testing. It is not used when TinyUSB is part of a larger project.\nIt is responsible for getting the MCU started and the USB peripheral clocked with minimal of on-board devices\n\n-  One LED : for status\n-  One Button : to get input from user\n-  One UART : needed for logging with LOGGER=uart, maybe required for host/dual examples\n\nFollowing boards are supported\"\"\"\n        f.write(title)\n        for manuf, boards in sorted(vendor_data.items()):\n            f.write(f\"\\n\\n{manuf}\\n\")\n            f.write(f\"{'-' * len(manuf)}\\n\\n\")\n            df = pd.DataFrame.from_dict(boards, orient='index', columns=['Name', 'Family', 'URL', 'Note'])\n            df = df.rename_axis(\"Board\")\n            f.write(tabulate(df, headers=\"keys\", tablefmt='rst'))\n\n\n# -----------------------------------------\n# Main\n# -----------------------------------------\nif __name__ == \"__main__\":\n    gen_deps_doc()\n    gen_boards_doc()\n"
  },
  {
    "path": "tools/gen_presets.py",
    "content": "#!/usr/bin/env python3\nimport os\nimport json\nfrom pathlib import Path\n\ndef main():\n    board_list = []\n    board_list_esp = []\n\n    # Find all board.cmake files, exclude espressif\n    for root, dirs, files in os.walk(\"hw/bsp\"):\n        for file in files:\n            if file == \"board.cmake\" and \"espressif\" not in root:\n                board_list.append(os.path.basename(root))\n\n    # Find all espressif boards\n    for root, dirs, files in os.walk(\"hw/bsp/espressif\"):\n        for file in files:\n            if file == \"board.cmake\":\n                board_list_esp.append(os.path.basename(root))\n\n    print('Generating presets for the following boards:')\n    print(board_list)\n\n    # Generate the presets\n    presets = {}\n    presets['version'] = 6\n\n    # Configure presets\n    presets['configurePresets'] = [\n        {\"name\": \"default\",\n         \"hidden\": True,\n         \"description\": r\"Configure preset for the ${presetName} board\",\n         \"generator\": \"Ninja Multi-Config\",\n         \"binaryDir\": r\"${sourceDir}/build/${presetName}\",\n         \"cacheVariables\": {\n             \"CMAKE_DEFAULT_BUILD_TYPE\": \"RelWithDebInfo\",\n             \"BOARD\": r\"${presetName}\"\n         }},\n         {\"name\": \"default single config\",\n         \"hidden\": True,\n         \"description\": r\"Configure preset for the ${presetName} board\",\n         \"generator\": \"Ninja\",\n         \"binaryDir\": r\"${sourceDir}/build/${presetName}\",\n         \"cacheVariables\": {\n             \"BOARD\": r\"${presetName}\"\n         }}]\n\n    # Add non-espressif boards\n    presets['configurePresets'].extend(\n        sorted(\n            [\n                {\n                    'name': board,\n                    'inherits': 'default'\n                }\n                for board in board_list\n            ], key=lambda x: x['name']\n        )\n    )\n\n    # Add espressif boards with single config generator\n    presets['configurePresets'].extend(\n        sorted(\n            [\n                {\n                    'name': board,\n                    'inherits': 'default single config'\n                }\n                for board in board_list_esp\n            ], key=lambda x: x['name']\n        )\n    )\n\n    # Combine all boards\n    board_list.extend(board_list_esp)\n\n    # Build presets\n    # no inheritance since 'name' doesn't support macro expansion\n    presets['buildPresets'] = sorted(\n        [\n            {\n                'name': board,\n                'description': \"Build preset for the \" + board + \" board\",\n                'configurePreset': board\n            }\n            for board in board_list\n        ], key=lambda x: x['name']\n    )\n\n    # Workflow presets\n    presets['workflowPresets'] = sorted(\n        [\n            {\n                \"name\": board,\n                \"steps\": [\n                    {\n                        \"type\": \"configure\",\n                        \"name\": board\n                    },\n                    {\n                        \"type\": \"build\",\n                        \"name\": board\n                    }\n                ]\n            }\n            for board in board_list\n        ], key=lambda x: x['name']\n    )\n\n    path_boardpresets = \"hw/bsp/BoardPresets.json\"\n    with open(path_boardpresets, \"w\") as f:\n        f.write('{}\\n'.format(json.dumps(presets, indent=2)))\n\n    # Generate presets for examples\n    presets = {\n        \"version\": 6,\n        \"include\": [\n        ]\n    }\n\n    example_list = []\n    for root, dirs, files in os.walk(\"examples\"):\n        for file in files:\n            # Filter out ESP-IDF CMakeLists.txt in src folder\n            if file == \"CMakeLists.txt\" and os.path.basename(root) != 'src':\n                presets['include'] = [os.path.relpath(path_boardpresets, root).replace(os.sep, '/')]\n                with open(os.path.join(root, 'CMakePresets.json'), 'w') as f:\n                    f.write('{}\\n'.format(json.dumps(presets, indent=2)))\n                example_list.append(os.path.basename(root))\n\n    print('Generating presets for the following examples:')\n    print(example_list)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "tools/get_deps.py",
    "content": "#!/usr/bin/env python3\nimport argparse\nimport sys\nimport subprocess\nfrom pathlib import Path\nfrom multiprocessing import Pool\n\n# Mandatory Dependencies that is always fetched\n# path, url, commit, family (Alphabet sorted by path)\ndeps_mandatory = {\n    'lib/FreeRTOS-Kernel': ['https://github.com/FreeRTOS/FreeRTOS-Kernel.git',\n                            'cc0e0707c0c748713485b870bb980852b210877f',\n                            'all'],\n    'lib/lwip': ['https://github.com/lwip-tcpip/lwip.git',\n                 '159e31b689577dbf69cf0683bbaffbd71fa5ee10',\n                 'all'],\n    'lib/threadx': ['https://github.com/eclipse-threadx/threadx.git',\n                    '4b6e8100d932a3a67b34c6eb17f84f3bffb9e2ae',\n                    'all'],\n    'tools/linkermap': ['https://github.com/hathach/linkermap.git',\n                        '8e1f440fa15c567aceb5aa0d14f6d18c329cc67f',\n                        'all'],\n    'tools/uf2': ['https://github.com/microsoft/uf2.git',\n                  'c594542b2faa01cc33a2b97c9fbebc38549df80a',\n                  'all'],\n}\n\n# Optional Dependencies per MCU\n# path, url, commit, family (Alphabet sorted by path)\ndeps_optional = {\n    'hw/mcu/allwinner': ['https://github.com/hathach/allwinner_driver.git',\n                         '8e5e89e8e132c0fd90e72d5422e5d3d68232b756',\n                         'fc100s'],\n    'hw/mcu/analog/msdk' : ['https://github.com/analogdevicesinc/msdk.git',\n                             'b20b398d3e5e2007594e54a74ba3d2a2e50ddd75',\n                             'maxim'],\n    'hw/mcu/bridgetek/ft9xx/ft90x-sdk': ['https://github.com/BRTSG-FOSS/ft90x-sdk.git',\n                                         '03f74eac84645178fdde7f2e5ca9acdcb7bd9dcd',\n                                         'ft9xx'],\n    'hw/mcu/broadcom': ['https://github.com/adafruit/broadcom-peripherals.git',\n                        '08370086080759ed54ac1136d62d2ad24c6fa267',\n                        'broadcom_32bit broadcom_64bit'],\n    'hw/mcu/gd/nuclei-sdk': ['https://github.com/Nuclei-Software/nuclei-sdk.git',\n                             '7eb7bfa9ea4fbeacfafe1d5f77d5a0e6ed3922e7',\n                             'gd32vf103'],\n    'hw/mcu/infineon/mtb-xmclib-cat3': ['https://github.com/Infineon/mtb-xmclib-cat3.git',\n                                        'daf5500d03cba23e68c2f241c30af79cd9d63880',\n                                        'xmc4000'],\n    'hw/mcu/microchip': ['https://github.com/hathach/microchip_driver.git',\n                         '9e8b37e307d8404033bb881623a113931e1edf27',\n                         'sam3x samd11 samd21 samd51 samd5x_e5x same5x same7x samd2x_l2x samg'],\n    'hw/mcu/mindmotion/mm32sdk': ['https://github.com/hathach/mm32sdk.git',\n                                  'b93e856211060ae825216c6a1d6aa347ec758843',\n                                  'mm32'],\n    'hw/mcu/nordic/nrfx': ['https://github.com/NordicSemiconductor/nrfx.git',\n                           '11f57e578c7feea13f21c79ea0efab2630ac68c7',\n                           'nrf'],\n    'hw/mcu/nuvoton': ['https://github.com/majbthrd/nuc_driver.git',\n                       '2204191ec76283371419fbcec207da02e1bc22fa',\n                       'nuc100_120 nuc121_125 nuc126 nuc505'],\n    'hw/mcu/nxp/lpcopen': ['https://github.com/hathach/nxp_lpcopen.git',\n                           'b41cf930e65c734d8ec6de04f1d57d46787c76ae',\n                           'lpc11 lpc13 lpc15 lpc17 lpc18 lpc40 lpc43'],\n    'hw/mcu/nxp/mcuxsdk-core': ['https://github.com/nxp-mcuxpresso/mcuxsdk-core',\n                            '0c5c6b16deb211110e06bde896cdff59ab213e16',\n                            'imxrt kinetis_k32l lpc51 lpc55 mcx'],\n    'hw/mcu/nxp/mcux-sdk': ['https://github.com/nxp-mcuxpresso/mcux-sdk',\n                            'a1bdae309a14ec95a4f64a96d3315a4f89c397c6',\n                            'kinetis_k kinetis_kl lpc54 rw61x'],\n    'hw/mcu/nxp/mcux-devices-kinetis': ['https://github.com/nxp-mcuxpresso/mcux-devices-kinetis',\n                            '98a155e666c54f396e528ec3131f27a5d5b71f76',\n                            'kinetis_k32l'],\n    'hw/mcu/nxp/mcux-devices-lpc': ['https://github.com/nxp-mcuxpresso/mcux-devices-lpc',\n                            '8096b783ec09d0d1c8629025a5f9d8e7df26e520',\n                            'lpc51 lpc55'],\n    'hw/mcu/nxp/mcux-devices-mcx': ['https://github.com/nxp-mcuxpresso/mcux-devices-mcx',\n                            'ada1c97c761123ec0c179bb9bb9f744bf9a11475',\n                            'mcx'],\n    'hw/mcu/nxp/mcux-devices-rt': ['https://github.com/nxp-mcuxpresso/mcux-devices-rt',\n                            'dba2b523c9df61f3330bd186242f8210a8e47c45',\n                            'imxrt'],\n    'hw/mcu/raspberry_pi/Pico-PIO-USB': ['https://github.com/sekigon-gonnoc/Pico-PIO-USB.git',\n                                         '675543bcc9baa8170f868ab7ba316d418dbcf41f',\n                                         'rp2040'],\n    'hw/mcu/renesas/fsp': ['https://github.com/renesas/fsp.git',\n                           'edcc97d684b6f716728a60d7a6fea049d9870bd6',\n                           'ra'],\n    'hw/mcu/renesas/rx': ['https://github.com/kkitayam/rx_device.git',\n                          '706b4e0cf485605c32351e2f90f5698267996023',\n                          'rx'],\n    'hw/mcu/silabs/cmsis-dfp-efm32gg12b': ['https://github.com/cmsis-packs/cmsis-dfp-efm32gg12b.git',\n                                           'f1c31b7887669cb230b3ea63f9b56769078960bc',\n                                           'efm32'],\n    'hw/mcu/sony/cxd56/spresense-exported-sdk': ['https://github.com/sonydevworld/spresense-exported-sdk.git',\n                                                 '2ec2a1538362696118dc3fdf56f33dacaf8f4067',\n                                                 'spresense'],\n    'hw/mcu/st/cmsis_device_c0': ['https://github.com/STMicroelectronics/cmsis_device_c0.git',\n                                  '517611273f835ffe95318947647bc1408f69120d',\n                                  'stm32c0'],\n    'hw/mcu/st/cmsis_device_f0': ['https://github.com/STMicroelectronics/cmsis_device_f0.git',\n                                  'cbb5da5d48b4b5f2efacdc2f033be30f9d29889f',\n                                  'stm32f0'],\n    'hw/mcu/st/cmsis_device_f1': ['https://github.com/STMicroelectronics/cmsis_device_f1.git',\n                                  'c8e9a4a4f16b6d2cb2a2083cbe5161025280fb22',\n                                  'stm32f1'],\n    'hw/mcu/st/cmsis_device_f2': ['https://github.com/STMicroelectronics/cmsis_device_f2.git',\n                                  '49321f1e4d2bd3e65687b37f2652a28ea7983674',\n                                  'stm32f2'],\n    'hw/mcu/st/cmsis_device_f3': ['https://github.com/STMicroelectronics/cmsis_device_f3.git',\n                                  '5558e64e3675a1e1fcb1c71f468c7c407c1b1134',\n                                  'stm32f3'],\n    'hw/mcu/st/cmsis_device_f4': ['https://github.com/STMicroelectronics/cmsis_device_f4.git',\n                                  '3c77349ce04c8af401454cc51f85ea9a50e34fc1',\n                                  'stm32f4'],\n    'hw/mcu/st/cmsis_device_f7': ['https://github.com/STMicroelectronics/cmsis_device_f7.git',\n                                  '2352e888e821aa0f4fe549bd5ea81d29c67a3222',\n                                  'stm32f7'],\n    'hw/mcu/st/cmsis_device_g0': ['https://github.com/STMicroelectronics/cmsis_device_g0.git',\n                                  'f484fe852535f913a02ee79787eafa74dd7f9488',\n                                  'stm32g0'],\n    'hw/mcu/st/cmsis_device_g4': ['https://github.com/STMicroelectronics/cmsis_device_g4.git',\n                                  '7c39c32593b03764aaa57531588b8bf7cdd443a5',\n                                  'stm32g4'],\n    'hw/mcu/st/cmsis_device_h7': ['https://github.com/STMicroelectronics/cmsis_device_h7.git',\n                                  '45b818cab6ee2806e3a27c80e330957223424392',\n                                  'stm32h7'],\n    'hw/mcu/st/cmsis_device_h7rs': ['https://github.com/STMicroelectronics/cmsis_device_h7rs.git',\n                                  '57ea11f70ebf1850e1048989d665c9070f0bb863',\n                                  'stm32h7rs'],\n    'hw/mcu/st/cmsis_device_h5': ['https://github.com/STMicroelectronics/cmsis_device_h5.git',\n                                  '5273b8f134ba65f5b8174c4141b711b5c0d295b2',\n                                  'stm32h5'],\n    'hw/mcu/st/cmsis_device_l0': ['https://github.com/STMicroelectronics/cmsis_device_l0.git',\n                                  '7b7ae8cd71437331e1d7824f157d00c7bb4a5044',\n                                  'stm32l0'],\n    'hw/mcu/st/cmsis_device_l1': ['https://github.com/STMicroelectronics/cmsis_device_l1.git',\n                                  'a23ade4ccf14012085fedf862e33a536ab7ed8be',\n                                  'stm32l1'],\n    'hw/mcu/st/cmsis_device_l4': ['https://github.com/STMicroelectronics/cmsis_device_l4.git',\n                                  'a2530753e86dd326a75467d28feb92e2ba7d0df2',\n                                  'stm32l4'],\n    'hw/mcu/st/cmsis_device_l5': ['https://github.com/STMicroelectronics/cmsis_device_l5.git',\n                                  '7d9a51481f0e6c376e62c3c849e6caf652c66482',\n                                  'stm32l5'],\n    'hw/mcu/st/cmsis_device_n6': ['https://github.com/STMicroelectronics/cmsis-device-n6.git',\n                                  '7bcdc944fbf7cf5928d3c1d14054ca13261d33ec',\n                                  'stm32n6'],\n    'hw/mcu/st/cmsis-device-u0': ['https://github.com/STMicroelectronics/cmsis-device-u0.git',\n                                  'e3a627c6a5bc4eb2388e1885a95cc155e1672253',\n                                  'stm32u0'],\n    'hw/mcu/st/cmsis_device_u5': ['https://github.com/STMicroelectronics/cmsis_device_u5.git',\n                                  '6e67187dec98035893692ab2923914cb5f4e0117',\n                                  'stm32u5'],\n    'hw/mcu/st/cmsis_device_wb': ['https://github.com/STMicroelectronics/cmsis_device_wb.git',\n                                  'cda2cb9fc4a5232ab18efece0bb06b0b60910083',\n                                  'stm32wb'],\n    'hw/mcu/st/cmsis-device-wba': ['https://github.com/STMicroelectronics/cmsis-device-wba.git',\n                                   '647d8522e5fd15049e9a1cc30ed19d85e5911eaf',\n                                   'stm32wba'],\n    'hw/mcu/st/stm32-mfxstm32l152': ['https://github.com/STMicroelectronics/stm32-mfxstm32l152.git',\n                                     '7f4389efee9c6a655b55e5df3fceef5586b35f9b',\n                                     'stm32h7'],\n    'hw/mcu/st/stm32-tcpp0203': ['https://github.com/STMicroelectronics/stm32-tcpp0203.git',\n                                 '9918655bff176ac3046ccf378b5c7bbbc6a38d15',\n                                 'stm32h5 stm32h7rs stm32n6'],\n    'hw/mcu/st/stm32c0xx_hal_driver': ['https://github.com/STMicroelectronics/stm32c0xx_hal_driver.git',\n                                       'c283b143bef6bdaacf64240ee6f15eb61dad6125',\n                                       'stm32c0'],\n    'hw/mcu/st/stm32f0xx_hal_driver': ['https://github.com/STMicroelectronics/stm32f0xx_hal_driver.git',\n                                       '94399697cb5eeaf8511b81b7f50dc62f0a5a3f6c',\n                                       'stm32f0'],\n    'hw/mcu/st/stm32f1xx_hal_driver': ['https://github.com/STMicroelectronics/stm32f1xx_hal_driver.git',\n                                       '18074e3e5ecad0b380a5cf5a9131fe4b5ed1b2b7',\n                                       'stm32f1'],\n    'hw/mcu/st/stm32f2xx_hal_driver': ['https://github.com/STMicroelectronics/stm32f2xx_hal_driver.git',\n                                       'ae7b47fe41cf75ccaf65cbf8ee8749b18ba0e0f3',\n                                       'stm32f2'],\n    'hw/mcu/st/stm32f3xx_hal_driver': ['https://github.com/STMicroelectronics/stm32f3xx_hal_driver.git',\n                                       'e098c8c8ce6f426bcee7db3a37c0932ea881eb0b',\n                                       'stm32f3'],\n    'hw/mcu/st/stm32f4xx_hal_driver': ['https://github.com/STMicroelectronics/stm32f4xx_hal_driver.git',\n                                       'b6f0ed3829f3829eb358a2e7417d80bba1a42db7',\n                                       'stm32f4'],\n    'hw/mcu/st/stm32f7xx_hal_driver': ['https://github.com/STMicroelectronics/stm32f7xx_hal_driver.git',\n                                       'e1446fa12ffda80ea1016faf349e45b2047fff12',\n                                       'stm32f7'],\n    'hw/mcu/st/stm32g0xx_hal_driver': ['https://github.com/STMicroelectronics/stm32g0xx_hal_driver.git',\n                                       'a248a9e484d58943b46c68f6c49b4b276778bd59',\n                                       'stm32g0'],\n    'hw/mcu/st/stm32g4xx_hal_driver': ['https://github.com/STMicroelectronics/stm32g4xx_hal_driver.git',\n                                       '10138a41749ea62d53ecab65b2bc2a950acc04d2',\n                                       'stm32g4'],\n    'hw/mcu/st/stm32h7xx_hal_driver': ['https://github.com/STMicroelectronics/stm32h7xx_hal_driver.git',\n                                       'dbfb749f229e1aa89e50b54229ca87766e180d2d',\n                                       'stm32h7'],\n    'hw/mcu/st/stm32h7rsxx_hal_driver': ['https://github.com/STMicroelectronics/stm32h7rsxx-hal-driver.git',\n                                       '9e83b95ae0f70faa067eddce2da617d180937f9b',\n                                       'stm32h7rs'],\n    'hw/mcu/st/stm32h5xx_hal_driver': ['https://github.com/STMicroelectronics/stm32h5xx_hal_driver.git',\n                                       '3c84eaa6000ab620be01afbcfba2735389afe09b',\n                                       'stm32h5'],\n    'hw/mcu/st/stm32l0xx_hal_driver': ['https://github.com/STMicroelectronics/stm32l0xx_hal_driver.git',\n                                       '65da4cd8a10ad859ec8d9cd71f3f6c50735bd473',\n                                       'stm32l0'],\n    'hw/mcu/st/stm32l1xx_hal_driver': ['https://github.com/STMicroelectronics/stm32l1xx_hal_driver.git',\n                                       '54f0b7568ce2acb33d090c70c897ee32229c1d32',\n                                       'stm32l1'],\n    'hw/mcu/st/stm32l4xx_hal_driver': ['https://github.com/STMicroelectronics/stm32l4xx_hal_driver.git',\n                                       '3e039bbf62f54bbd834d578185521cff80596efe',\n                                       'stm32l4'],\n    'hw/mcu/st/stm32l5xx_hal_driver': ['https://github.com/STMicroelectronics/stm32l5xx_hal_driver.git',\n                                       '3340b9a597bcf75cc173345a90a74aa2a4a37510',\n                                       'stm32l5'],\n    'hw/mcu/st/stm32n6xx_hal_driver': ['https://github.com/STMicroelectronics/stm32n6xx-hal-driver.git',\n                                       'bc6c41f8f67d61b47af26695d0bf67762a000666',\n                                       'stm32n6'],\n    'hw/mcu/st/stm32u0xx_hal_driver': ['https://github.com/STMicroelectronics/stm32u0xx-hal-driver.git',\n                                       'cbfb5ac654256445237fd32b3587ac6a238d24f1',\n                                       'stm32u0'],\n    'hw/mcu/st/stm32u5xx_hal_driver': ['https://github.com/STMicroelectronics/stm32u5xx_hal_driver.git',\n                                       '2c5e2568fbdb1900a13ca3b2901fdd302cac3444',\n                                       'stm32u5'],\n    'hw/mcu/st/stm32wbxx_hal_driver': ['https://github.com/STMicroelectronics/stm32wbxx_hal_driver.git',\n                                       'd60dd46996876506f1d2e9abd6b1cc110c8004cd',\n                                       'stm32wb'],\n    'hw/mcu/st/stm32wbaxx_hal_driver': ['https://github.com/STMicroelectronics/stm32wbaxx_hal_driver.git',\n                                       '9442fbb71f855ff2e64fbf662b7726beba511a24',\n                                       'stm32wba'],\n    'hw/mcu/ti': ['https://github.com/hathach/ti_driver.git',\n                  '083944907e7d08fcb1f614b47598ce45935b8da1',\n                  'msp430 msp432e4 tm4c'],\n    'hw/mcu/wch/ch32v103': ['https://github.com/openwch/ch32v103.git',\n                            '7578cae0b21f86dd053a1f781b2fc6ab99d0ec17',\n                            'ch32v10x'],\n    'hw/mcu/wch/ch32v20x': ['https://github.com/openwch/ch32v20x.git',\n                            'c4c38f507e258a4e69b059ccc2dc27dde33cea1b',\n                            'ch32v20x'],\n    'hw/mcu/wch/ch32v307': ['https://github.com/openwch/ch32v307.git',\n                            '184f21b852cb95eed58e86e901837bc9fff68775',\n                            'ch32v30x'],\n    'hw/mcu/wch/ch32f20x': ['https://github.com/openwch/ch32f20x.git',\n                            '77c4095087e5ed2c548ec9058e655d0b8757663b',\n                            'ch32f20x'],\n    'hw/mcu/artery/at32f403a_407': ['https://github.com/ArteryTek/AT32F403A_407_Firmware_Library.git',\n                                    'f2cb360c3d28fada76b374308b8c4c61d37a090b',\n                                    'at32f403a_407'],\n    'hw/mcu/artery/at32f415': ['https://github.com/ArteryTek/AT32F415_Firmware_Library.git',\n                               '716f545aa1290ff144ccf023a8e797b951e1bc8e',\n                               'at32f415'],\n    'hw/mcu/artery/at32f435_437': ['https://github.com/ArteryTek/AT32F435_437_Firmware_Library.git',\n                                   '25439cc6650a8ae0345934e8707a5f38c7ae41f8',\n                                   'at32f435_437'],\n    'hw/mcu/artery/at32f423': ['https://github.com/ArteryTek/AT32F423_Firmware_Library.git',\n                               '2afa7f12852e57a9e8aab3a892c641e1a8635a18',\n                               'at32f423'],\n    'hw/mcu/artery/at32f402_405': ['https://github.com/ArteryTek/AT32F402_405_Firmware_Library.git',\n                                   '4424515c2663e82438654e0947695295df2abdfe',\n                                   'at32f402_405'],\n    'hw/mcu/artery/at32f425': ['https://github.com/ArteryTek/AT32F425_Firmware_Library.git',\n                               '620233e1357d5c1b7e2bde6b9dd5196822b91817',\n                               'at32f425'],\n    'hw/mcu/artery/at32f413': ['https://github.com/ArteryTek/AT32F413_Firmware_Library.git',\n                               'f6fe62dfec9fd40c5b63d92fc5ef2c2b5e77a450',\n                               'at32f413'],\n    'hw/mcu/artery/at32f45x': ['https://github.com/ArteryTek/AT32F45x_Firmware_Library.git',\n                               '3d4a1b38be8ebac292e2350ca53bc4bfa4430233',\n                               'at32f45x'],\n    'hw/mcu/hpmicro/hpm_sdk': ['https://github.com/hpmicro/hpm_sdk',\n                               '8d2af741ecc4aaa82d7ee395dc1ce25d7070c3ff',\n                               'hpmicro'],\n    'lib/CMSIS_5': ['https://github.com/ARM-software/CMSIS_5.git',\n                    '2b7495b8535bdcb306dac29b9ded4cfb679d7e5c',\n                    'kinetis_k kinetis_kl lpc54 rw61x mm32 msp432e4 nrf samd2x_l2x '\n                    'lpc11 lpc13 lpc15 lpc17 lpc18 lpc40 lpc43 '\n                    'stm32c0 stm32f0 stm32f1 stm32f2 stm32f3 stm32f4 stm32f7 stm32g0 stm32g4 stm32h5 '\n                    'stm32h7 stm32h7rs stm32l0 stm32l1 stm32l4 stm32l5 stm32u0 stm32u5 stm32wb stm32wba '\n                    'sam3x samd11 samd21 samd2x_l2x samd51 samd5x_e5x same5x same7x samg '\n                    'tm4c '],\n    'lib/CMSIS_6': ['https://github.com/ARM-software/CMSIS_6.git',\n                    '6f0a58d01aa9bd2feba212097f9afe7acd991d52',\n                    'imxrt kinetis_k32l ra stm32n6 lpc51 lpc55 mcx'],\n    'lib/sct_neopixel': ['https://github.com/gsteiert/sct_neopixel.git',\n                         'e73e04ca63495672d955f9268e003cffe168fcd8',\n                         'lpc55'],\n}\n\n# combined 2 deps\ndeps_all = {**deps_mandatory, **deps_optional}\n\n# TOP is tinyusb root dir\nTOP = Path(__file__).parent.parent.resolve()\n\n\ndef run_cmd(cmd):\n    r = subprocess.run(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)\n    title = f'Command Error: {cmd}'\n    if r.returncode != 0:\n        print(title)\n        print(r.stdout.decode(\"utf-8\"))\n    return r\n\n\ndef get_a_dep(d):\n    if d not in deps_all.keys():\n        print('{} is not found in dependency list')\n        return 1\n    url = deps_all[d][0]\n    commit = deps_all[d][1]\n    families = deps_all[d][2]\n\n    print(f'cloning {d} with {url}')\n\n    p = Path(TOP / d)\n    git_cmd = f\"git -C {p}\"\n\n    # Init git deps if not existed\n    if not p.exists():\n        p.mkdir(parents=True)\n        run_cmd(f\"{git_cmd} init\")\n        run_cmd(f\"{git_cmd} remote add origin {url}\")\n        head = None\n    else:\n        # Check if commit is already fetched\n        result = run_cmd(f\"{git_cmd} rev-parse HEAD\")\n        head = result.stdout.decode(\"utf-8\").splitlines()[0]\n        run_cmd(f\"{git_cmd} reset --hard\")\n\n    if commit != head:\n        run_cmd(f\"{git_cmd} fetch --depth 1 origin {commit}\")\n        run_cmd(f\"{git_cmd} checkout FETCH_HEAD\")\n\n    return 0\n\n\ndef find_family(board):\n    bsp_dir = Path(TOP / \"hw/bsp\")\n    for family_dir in bsp_dir.iterdir():\n        if family_dir.is_dir():\n            board_dir = family_dir / 'boards' / board\n            if board_dir.exists():\n                return family_dir.name\n    return None\n\n\ndef main():\n    parser = argparse.ArgumentParser()\n    parser.add_argument('families', nargs='*', default=[], help='Families to fetch')\n    parser.add_argument('-b', '--board', action='append', default=[], help='Boards to fetch')\n    parser.add_argument('-D', '--define', action='append', default=[], help='Have no effect')\n    parser.add_argument('-f1', '--build-flags-on', action='append', default=[], help='Have no effect')\n    args = parser.parse_args()\n\n    families = args.families\n    boards = args.board\n\n    status = 0\n    deps = []\n\n    if 'all' in families:\n        deps.extend(deps_optional.keys())\n    else:\n        families = list(families)\n        if boards is not None:\n            for b in boards:\n                f = find_family(b)\n                if f is not None:\n                    families.append(f)\n        for f in families:\n            for d in deps_optional:\n                if d not in deps and f in deps_optional[d][2].split():\n                    deps.append(d)\n        if len(deps) == 0:\n            print('WARN: no additional dependencies found for given boards or families')\n\n    deps.extend(deps_mandatory.keys())\n    with Pool() as pool:\n        status = sum(pool.map(get_a_dep, deps))\n    return status\n\n\nif __name__ == \"__main__\":\n    sys.exit(main())\n"
  },
  {
    "path": "tools/iar_gen.py",
    "content": "#!/usr/bin/env python3\n\nimport os\nimport sys\nimport xml.dom.minidom as XML\nimport glob\n\ndef Main():\n    # Read base configuration\n    base = \"\"\n    with open(\"iar_template.ipcf\") as f:\n        base = f.read()\n\n    # Enumerate all device/host examples\n    dir_1 = os.listdir(\"../examples\")\n    for dir_2 in dir_1:\n        if os.path.isdir(\"../examples/{}\".format(dir_2)):\n            print(dir_2)\n            examples = os.listdir(\"../examples/{}\".format(dir_2))\n            for example in examples:\n                if os.path.isdir(\"../examples/{}/{}\".format(dir_2, example)):\n                    print(\"../examples/{}/{}\".format(dir_2, example))\n                    conf = XML.parseString(base)\n                    files = conf.getElementsByTagName(\"files\")[0]\n                    inc   = conf.getElementsByTagName(\"includePath\")[0]\n                    # Add bsp inc\n                    path = conf.createElement('path')\n                    path_txt = conf.createTextNode(\"$TUSB_DIR$/hw\")\n                    path.appendChild(path_txt)\n                    inc.appendChild(path)\n                    # Add board.c/.h\n                    grp = conf.createElement('group')\n                    grp.setAttribute(\"name\", \"bsp\")\n                    path = conf.createElement('path')\n                    path_txt = conf.createTextNode(\"$TUSB_DIR$/hw/bsp/board.c\")\n                    path.appendChild(path_txt)\n                    grp.appendChild(path)\n                    files.appendChild(grp)\n                    # Add example's .c/.h\n                    grp = conf.createElement('group')\n                    grp.setAttribute(\"name\", \"example\")\n                    for file in os.listdir(\"../examples/{}/{}/src\".format(dir_2, example)):\n                        if file.endswith(\".c\") or file.endswith(\".h\"):\n                            path = conf.createElement('path')\n                            path.setAttribute(\"copyTo\", \"$PROJ_DIR$/{}\".format(file))\n                            path_txt = conf.createTextNode(\"$TUSB_DIR$/examples/{0}/{1}/src/{2}\".format(dir_2, example, file))\n                            path.appendChild(path_txt)\n                            grp.appendChild(path)\n                    files.appendChild(grp)\n                    cfg_str = conf.toprettyxml()\n                    cfg_str = '\\n'.join([s for s in cfg_str.splitlines() if s.strip()])\n                    #print(cfg_str)\n                    with open(\"../examples/{0}/{1}/iar_{1}.ipcf\".format(dir_2, example), 'w') as f:\n                        f.write(cfg_str)\n\ndef ListPath(path, blacklist=[]):\n    # Get all .c files\n    files = glob.glob(f'../{path}/**/*.c', recursive=True)\n    files.extend(glob.glob(f'../{path}/**/*.h', recursive=True))\n    # Filter\n    files = [x for x in files if all(y not in x for y in blacklist)]\n    # Get common dir list\n    dirs = []\n    for file in files:\n        dir = os.path.dirname(file)\n        if dir not in dirs:\n            dirs.append(dir)\n    # Print .c grouped by dir\n    for dir in dirs:\n        print('<group name=\"' + dir.replace('../', '').replace('\\\\','/') + '\">')\n        for file in files:\n            if os.path.dirname(file) == dir:\n                print('    <path>$TUSB_DIR$/' + file.replace('../','').replace('\\\\','/')+'</path>')\n        print('</group>')\n\ndef List():\n    ListPath('src', [ 'template.c' ])\n    ListPath('lib/SEGGER_RTT')\n\nif __name__ == \"__main__\":\n    if os.path.dirname(os.getcwd()) != 'tools':\n        os.chdir('tools')\n    if (len(sys.argv) > 1):\n        if (sys.argv[1] == 'l'):\n            List()\n    else:\n        Main()\n"
  },
  {
    "path": "tools/iar_template.ipcf",
    "content": "<?xml version=\"1.0\"?>\n<iarProjectConnection name=\"tinyusb\" oneShot=\"true\">\n\n\t<includePath>\n\t\t<path>$TUSB_DIR$/src</path>\n        <path>$TUSB_DIR$/lib/SEGGER_RTT/RTT</path>\n        <path>$TUSB_DIR$/lib/SEGGER_RTT/Config</path>\n        <path>$PROJ_DIR$</path>\n\t</includePath>\n\t<files>\n        <group name=\"src\">\n            <path>$TUSB_DIR$/src/tusb.c</path>\n            <path>$TUSB_DIR$/src/tusb.h</path>\n            <path>$TUSB_DIR$/src/tusb_option.h</path>\n        </group>\n        <group name=\"src/class/audio\">\n            <path>$TUSB_DIR$/src/class/audio/audio_device.c</path>\n            <path>$TUSB_DIR$/src/class/audio/audio.h</path>\n            <path>$TUSB_DIR$/src/class/audio/audio_device.h</path>\n        </group>\n        <group name=\"src/class/bth\">\n            <path>$TUSB_DIR$/src/class/bth/bth_device.c</path>\n            <path>$TUSB_DIR$/src/class/bth/bth_device.h</path>\n        </group>\n        <group name=\"src/class/cdc\">\n            <path>$TUSB_DIR$/src/class/cdc/cdc_device.c</path>\n            <path>$TUSB_DIR$/src/class/cdc/cdc_host.c</path>\n            <path>$TUSB_DIR$/src/class/cdc/cdc_rndis_host.c</path>\n            <path>$TUSB_DIR$/src/class/cdc/cdc.h</path>\n            <path>$TUSB_DIR$/src/class/cdc/cdc_device.h</path>\n            <path>$TUSB_DIR$/src/class/cdc/cdc_host.h</path>\n            <path>$TUSB_DIR$/src/class/cdc/cdc_rndis.h</path>\n            <path>$TUSB_DIR$/src/class/cdc/cdc_rndis_host.h</path>\n        </group>\n        <group name=\"src/class/dfu\">\n            <path>$TUSB_DIR$/src/class/dfu/dfu_device.c</path>\n            <path>$TUSB_DIR$/src/class/dfu/dfu_rt_device.c</path>\n            <path>$TUSB_DIR$/src/class/dfu/dfu.h</path>\n            <path>$TUSB_DIR$/src/class/dfu/dfu_device.h</path>\n            <path>$TUSB_DIR$/src/class/dfu/dfu_rt_device.h</path>\n        </group>\n        <group name=\"src/class/hid\">\n            <path>$TUSB_DIR$/src/class/hid/hid_device.c</path>\n            <path>$TUSB_DIR$/src/class/hid/hid_host.c</path>\n            <path>$TUSB_DIR$/src/class/hid/hid.h</path>\n            <path>$TUSB_DIR$/src/class/hid/hid_device.h</path>\n            <path>$TUSB_DIR$/src/class/hid/hid_host.h</path>\n        </group>\n        <group name=\"src/class/midi\">\n            <path>$TUSB_DIR$/src/class/midi/midi_device.c</path>\n            <path>$TUSB_DIR$/src/class/midi/midi.h</path>\n            <path>$TUSB_DIR$/src/class/midi/midi_device.h</path>\n        </group>\n        <group name=\"src/class/msc\">\n            <path>$TUSB_DIR$/src/class/msc/msc_device.c</path>\n            <path>$TUSB_DIR$/src/class/msc/msc_host.c</path>\n            <path>$TUSB_DIR$/src/class/msc/msc.h</path>\n            <path>$TUSB_DIR$/src/class/msc/msc_device.h</path>\n            <path>$TUSB_DIR$/src/class/msc/msc_host.h</path>\n        </group>\n        <group name=\"src/class/mtp\">\n            <path>$TUSB_DIR$/src/class/mtp/mtp_device.c</path>\n            <path>$TUSB_DIR$/src/class/mtp/mtp.h</path>\n            <path>$TUSB_DIR$/src/class/mtp/mtp_device.h</path>\n        </group>\n        <group name=\"src/class/net\">\n            <path>$TUSB_DIR$/src/class/net/ecm_rndis_device.c</path>\n            <path>$TUSB_DIR$/src/class/net/ncm_device.c</path>\n            <path>$TUSB_DIR$/src/class/net/ncm.h</path>\n            <path>$TUSB_DIR$/src/class/net/net_device.h</path>\n        </group>\n        <group name=\"src/class/printer\">\n            <path>$TUSB_DIR$/src/class/printer/printer_device.c</path>\n            <path>$TUSB_DIR$/src/class/printer/printer.h</path>\n            <path>$TUSB_DIR$/src/class/printer/printer_device.h</path>\n        </group>\n        <group name=\"src/class/usbtmc\">\n            <path>$TUSB_DIR$/src/class/usbtmc/usbtmc_device.c</path>\n            <path>$TUSB_DIR$/src/class/usbtmc/usbtmc.h</path>\n            <path>$TUSB_DIR$/src/class/usbtmc/usbtmc_device.h</path>\n        </group>\n        <group name=\"src/class/vendor\">\n            <path>$TUSB_DIR$/src/class/vendor/vendor_device.c</path>\n            <path>$TUSB_DIR$/src/class/vendor/vendor_host.c</path>\n            <path>$TUSB_DIR$/src/class/vendor/vendor_device.h</path>\n            <path>$TUSB_DIR$/src/class/vendor/vendor_host.h</path>\n        </group>\n        <group name=\"src/class/video\">\n            <path>$TUSB_DIR$/src/class/video/video_device.c</path>\n            <path>$TUSB_DIR$/src/class/video/video.h</path>\n            <path>$TUSB_DIR$/src/class/video/video_device.h</path>\n        </group>\n        <group name=\"src/common\">\n            <path>$TUSB_DIR$/src/common/tusb_fifo.c</path>\n            <path>$TUSB_DIR$/src/common/tusb_common.h</path>\n            <path>$TUSB_DIR$/src/common/tusb_compiler.h</path>\n            <path>$TUSB_DIR$/src/common/tusb_debug.h</path>\n            <path>$TUSB_DIR$/src/common/tusb_fifo.h</path>\n            <path>$TUSB_DIR$/src/common/tusb_mcu.h</path>\n            <path>$TUSB_DIR$/src/common/tusb_private.h</path>\n            <path>$TUSB_DIR$/src/common/tusb_types.h</path>\n            <path>$TUSB_DIR$/src/common/tusb_verify.h</path>\n        </group>\n        <group name=\"src/device\">\n            <path>$TUSB_DIR$/src/device/usbd.c</path>\n            <path>$TUSB_DIR$/src/device/usbd_control.c</path>\n            <path>$TUSB_DIR$/src/device/dcd.h</path>\n            <path>$TUSB_DIR$/src/device/usbd.h</path>\n            <path>$TUSB_DIR$/src/device/usbd_pvt.h</path>\n        </group>\n        <group name=\"src/host\">\n            <path>$TUSB_DIR$/src/host/hub.c</path>\n            <path>$TUSB_DIR$/src/host/usbh.c</path>\n            <path>$TUSB_DIR$/src/host/hcd.h</path>\n            <path>$TUSB_DIR$/src/host/hub.h</path>\n            <path>$TUSB_DIR$/src/host/usbh.h</path>\n            <path>$TUSB_DIR$/src/host/usbh_pvt.h</path>\n        </group>\n        <group name=\"src/portable/analog/max3421\">\n            <path>$TUSB_DIR$/src/portable/analog/max3421/hcd_max3421.c</path>\n        </group>\n        <group name=\"src/portable/bridgetek/ft9xx\">\n            <path>$TUSB_DIR$/src/portable/bridgetek/ft9xx/dcd_ft9xx.c</path>\n        </group>\n        <group name=\"src/portable/chipidea/ci_fs\">\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_fs/dcd_ci_fs.c</path>\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_fs/ci_fs_kinetis.h</path>\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_fs/ci_fs_mcx.h</path>\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_fs/ci_fs_type.h</path>\n        </group>\n        <group name=\"src/portable/chipidea/ci_hs\">\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_hs/dcd_ci_hs.c</path>\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_hs/hcd_ci_hs.c</path>\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_hs/ci_hs_imxrt.h</path>\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_hs/ci_hs_lpc18_43.h</path>\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_hs/ci_hs_mcx.h</path>\n            <path>$TUSB_DIR$/src/portable/chipidea/ci_hs/ci_hs_type.h</path>\n        </group>\n        <group name=\"src/portable/dialog/da146xx\">\n            <path>$TUSB_DIR$/src/portable/dialog/da146xx/dcd_da146xx.c</path>\n        </group>\n        <group name=\"src/portable/ehci\">\n            <path>$TUSB_DIR$/src/portable/ehci/ehci.c</path>\n            <path>$TUSB_DIR$/src/portable/ehci/ehci.h</path>\n            <path>$TUSB_DIR$/src/portable/ehci/ehci_api.h</path>\n        </group>\n        <group name=\"src/portable/mentor/musb\">\n            <path>$TUSB_DIR$/src/portable/mentor/musb/dcd_musb.c</path>\n            <path>$TUSB_DIR$/src/portable/mentor/musb/hcd_musb.c</path>\n            <path>$TUSB_DIR$/src/portable/mentor/musb/musb_msp432e.h</path>\n            <path>$TUSB_DIR$/src/portable/mentor/musb/musb_tm4c.h</path>\n            <path>$TUSB_DIR$/src/portable/mentor/musb/musb_type.h</path>\n        </group>\n        <group name=\"src/portable/microchip/pic\">\n            <path>$TUSB_DIR$/src/portable/microchip/pic/dcd_pic.c</path>\n        </group>\n        <group name=\"src/portable/microchip/pic32mz\">\n            <path>$TUSB_DIR$/src/portable/microchip/pic32mz/dcd_pic32mz.c</path>\n            <path>$TUSB_DIR$/src/portable/microchip/pic32mz/usbhs_registers.h</path>\n        </group>\n        <group name=\"src/portable/microchip/samd\">\n            <path>$TUSB_DIR$/src/portable/microchip/samd/dcd_samd.c</path>\n        </group>\n        <group name=\"src/portable/microchip/samg\">\n            <path>$TUSB_DIR$/src/portable/microchip/samg/dcd_samg.c</path>\n        </group>\n        <group name=\"src/portable/microchip/samx7x\">\n            <path>$TUSB_DIR$/src/portable/microchip/samx7x/dcd_samx7x.c</path>\n            <path>$TUSB_DIR$/src/portable/microchip/samx7x/common_usb_regs.h</path>\n        </group>\n        <group name=\"src/portable/mindmotion/mm32\">\n            <path>$TUSB_DIR$/src/portable/mindmotion/mm32/dcd_mm32f327x_otg.c</path>\n        </group>\n        <group name=\"src/portable/nordic/nrf5x\">\n            <path>$TUSB_DIR$/src/portable/nordic/nrf5x/dcd_nrf5x.c</path>\n        </group>\n        <group name=\"src/portable/nuvoton/nuc120\">\n            <path>$TUSB_DIR$/src/portable/nuvoton/nuc120/dcd_nuc120.c</path>\n        </group>\n        <group name=\"src/portable/nuvoton/nuc121\">\n            <path>$TUSB_DIR$/src/portable/nuvoton/nuc121/dcd_nuc121.c</path>\n        </group>\n        <group name=\"src/portable/nuvoton/nuc505\">\n            <path>$TUSB_DIR$/src/portable/nuvoton/nuc505/dcd_nuc505.c</path>\n        </group>\n        <group name=\"src/portable/nxp/khci\">\n            <path>$TUSB_DIR$/src/portable/nxp/khci/dcd_khci.c</path>\n            <path>$TUSB_DIR$/src/portable/nxp/khci/hcd_khci.c</path>\n        </group>\n        <group name=\"src/portable/nxp/lpc17_40\">\n            <path>$TUSB_DIR$/src/portable/nxp/lpc17_40/dcd_lpc17_40.c</path>\n            <path>$TUSB_DIR$/src/portable/nxp/lpc17_40/hcd_lpc17_40.c</path>\n            <path>$TUSB_DIR$/src/portable/nxp/lpc17_40/dcd_lpc17_40.h</path>\n        </group>\n        <group name=\"src/portable/nxp/lpc_ip3511\">\n            <path>$TUSB_DIR$/src/portable/nxp/lpc_ip3511/dcd_lpc_ip3511.c</path>\n        </group>\n        <group name=\"src/portable/ohci\">\n            <path>$TUSB_DIR$/src/portable/ohci/ohci.c</path>\n            <path>$TUSB_DIR$/src/portable/ohci/ohci.h</path>\n        </group>\n        <group name=\"src/portable/raspberrypi/pio_usb\">\n            <path>$TUSB_DIR$/src/portable/raspberrypi/pio_usb/dcd_pio_usb.c</path>\n            <path>$TUSB_DIR$/src/portable/raspberrypi/pio_usb/hcd_pio_usb.c</path>\n        </group>\n        <group name=\"src/portable/raspberrypi/rp2040\">\n            <path>$TUSB_DIR$/src/portable/raspberrypi/rp2040/dcd_rp2040.c</path>\n            <path>$TUSB_DIR$/src/portable/raspberrypi/rp2040/hcd_rp2040.c</path>\n            <path>$TUSB_DIR$/src/portable/raspberrypi/rp2040/rp2040_usb.c</path>\n            <path>$TUSB_DIR$/src/portable/raspberrypi/rp2040/rp2040_usb.h</path>\n        </group>\n        <group name=\"src/portable/renesas/rusb2\">\n            <path>$TUSB_DIR$/src/portable/renesas/rusb2/dcd_rusb2.c</path>\n            <path>$TUSB_DIR$/src/portable/renesas/rusb2/hcd_rusb2.c</path>\n            <path>$TUSB_DIR$/src/portable/renesas/rusb2/rusb2_common.c</path>\n            <path>$TUSB_DIR$/src/portable/renesas/rusb2/rusb2_ra.h</path>\n            <path>$TUSB_DIR$/src/portable/renesas/rusb2/rusb2_rx.h</path>\n            <path>$TUSB_DIR$/src/portable/renesas/rusb2/rusb2_type.h</path>\n        </group>\n        <group name=\"src/portable/sony/cxd56\">\n            <path>$TUSB_DIR$/src/portable/sony/cxd56/dcd_cxd56.c</path>\n        </group>\n        <group name=\"src/portable/st/stm32_fsdev\">\n            <path>$TUSB_DIR$/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c</path>\n            <path>$TUSB_DIR$/src/portable/st/stm32_fsdev/hcd_stm32_fsdev.c</path>\n            <path>$TUSB_DIR$/src/portable/st/stm32_fsdev/fsdev_common.c</path>\n            <path>$TUSB_DIR$/src/portable/st/stm32_fsdev/fsdev_common.h</path>\n        </group>\n        <group name=\"src/portable/st/typec\">\n            <path>$TUSB_DIR$/src/portable/st/typec/typec_stm32.c</path>\n        </group>\n        <group name=\"src/portable/sunxi\">\n            <path>$TUSB_DIR$/src/portable/sunxi/dcd_sunxi_musb.c</path>\n            <path>$TUSB_DIR$/src/portable/sunxi/musb_def.h</path>\n        </group>\n        <group name=\"src/portable/synopsys/dwc2\">\n            <path>$TUSB_DIR$/src/portable/synopsys/dwc2/dcd_dwc2.c</path>\n            <path>$TUSB_DIR$/src/portable/synopsys/dwc2/dwc2_bcm.h</path>\n            <path>$TUSB_DIR$/src/portable/synopsys/dwc2/dwc2_efm32.h</path>\n            <path>$TUSB_DIR$/src/portable/synopsys/dwc2/dwc2_esp32.h</path>\n            <path>$TUSB_DIR$/src/portable/synopsys/dwc2/dwc2_gd32.h</path>\n            <path>$TUSB_DIR$/src/portable/synopsys/dwc2/dwc2_stm32.h</path>\n            <path>$TUSB_DIR$/src/portable/synopsys/dwc2/dwc2_type.h</path>\n            <path>$TUSB_DIR$/src/portable/synopsys/dwc2/dwc2_xmc.h</path>\n        </group>\n        <group name=\"src/portable/ti/msp430x5xx\">\n            <path>$TUSB_DIR$/src/portable/ti/msp430x5xx/dcd_msp430x5xx.c</path>\n        </group>\n        <group name=\"src/portable/valentyusb/eptri\">\n            <path>$TUSB_DIR$/src/portable/valentyusb/eptri/dcd_eptri.c</path>\n            <path>$TUSB_DIR$/src/portable/valentyusb/eptri/dcd_eptri.h</path>\n        </group>\n        <group name=\"src/portable/wch\">\n            <path>$TUSB_DIR$/src/portable/wch/dcd_ch32_usbfs.c</path>\n            <path>$TUSB_DIR$/src/portable/wch/dcd_ch32_usbhs.c</path>\n            <path>$TUSB_DIR$/src/portable/wch/ch32_usbhs_reg.h</path>\n        </group>\n        <group name=\"src/typec\">\n            <path>$TUSB_DIR$/src/typec/usbc.c</path>\n            <path>$TUSB_DIR$/src/typec/pd_types.h</path>\n            <path>$TUSB_DIR$/src/typec/tcd.h</path>\n            <path>$TUSB_DIR$/src/typec/usbc.h</path>\n        </group>\n        <group name=\"src/class/cdc/serial\">\n            <path>$TUSB_DIR$/src/class/cdc/serial/ch34x.h</path>\n            <path>$TUSB_DIR$/src/class/cdc/serial/cp210x.h</path>\n            <path>$TUSB_DIR$/src/class/cdc/serial/ftdi_sio.h</path>\n        </group>\n        <group name=\"src/osal\">\n            <path>$TUSB_DIR$/src/osal/osal.h</path>\n            <path>$TUSB_DIR$/src/osal/osal_freertos.h</path>\n            <path>$TUSB_DIR$/src/osal/osal_mynewt.h</path>\n            <path>$TUSB_DIR$/src/osal/osal_none.h</path>\n            <path>$TUSB_DIR$/src/osal/osal_pico.h</path>\n            <path>$TUSB_DIR$/src/osal/osal_rtthread.h</path>\n            <path>$TUSB_DIR$/src/osal/osal_rtx4.h</path>\n        </group>\n        <group name=\"lib/SEGGER_RTT/RTT\">\n            <path>$TUSB_DIR$/lib/SEGGER_RTT/RTT/SEGGER_RTT.c</path>\n            <path>$TUSB_DIR$/lib/SEGGER_RTT/RTT/SEGGER_RTT_printf.c</path>\n            <path>$TUSB_DIR$/lib/SEGGER_RTT/RTT/SEGGER_RTT.h</path>\n        </group>\n        <group name=\"lib/SEGGER_RTT/Config\">\n            <path>$TUSB_DIR$/lib/SEGGER_RTT/Config/SEGGER_RTT_Conf.h</path>\n        </group>\n    </files>\n\n</iarProjectConnection>\n"
  },
  {
    "path": "tools/make_release.py",
    "content": "#!/usr/bin/env python3\nimport re\nimport gen_doc\nimport gen_presets\n\nversion = '0.20.0'\n\nprint('version {}'.format(version))\nver_id = version.split('.')\n\n###################\n# src/tusb_option.h\n###################\nf_option_h = 'src/tusb_option.h'\nwith open(f_option_h) as f:\n    fdata = f.read()\n    fdata = re.sub(r'(#define TUSB_VERSION_MAJOR *) \\d+', r\"\\1 {}\".format(ver_id[0]), fdata)\n    fdata = re.sub(r'(#define TUSB_VERSION_MINOR *) \\d+', r\"\\1 {}\".format(ver_id[1]), fdata)\n    fdata = re.sub(r'(#define TUSB_VERSION_REVISION *) \\d+', r\"\\1 {}\".format(ver_id[2]), fdata)\n\n# Write the file out again\nwith open(f_option_h, 'w') as f:\n    f.write(fdata)\n\n###################\n# repository.yml\n###################\nf_repository_yml = 'repository.yml'\nwith open(f_repository_yml) as f:\n    fdata = f.read()\n\nif fdata.find(version) < 0:\n    fdata = re.sub(r'(\"0-latest\"): \"\\d+\\.\\d+\\.\\d+\"', r'\"{}\": \"{}\"\\r\\n    \\1: \"{}\"'.format(version, version, version), fdata)\n    with open(f_repository_yml, 'w') as f:\n        f.write(fdata)\n\n###################\n# library.json\n###################\nf_library_json = 'library.json'\nwith open(f_library_json) as f:\n    fdata = f.read()\n    fdata = re.sub(r'( {4}\"version\":) \"\\d+\\.\\d+\\.\\d+\"', rf'\\1 \"{version}\"', fdata)\n\nwith open(f_library_json, 'w') as f:\n    f.write(fdata)\n\n###################\n# sonar-project.properties\n###################\nf_sonar_properties = 'sonar-project.properties'\nwith open(f_sonar_properties) as f:\n    fdata = f.read()\nfdata = re.sub(r'(sonar\\.projectVersion=)\\d+\\.\\d+\\.\\d+', r'\\g<1>{}'.format(version), fdata)\n\nwith open(f_sonar_properties, 'w') as f:\n    f.write(fdata)\n\n# gen docs\ngen_doc.gen_deps_doc()\ngen_doc.gen_boards_doc()\n\n# gen presets\ngen_presets.main()\n\n##################(ver#\n# docs/info/changelog.rst\n###################\nprint(\"Update docs/info/changelog.rst\")\n"
  },
  {
    "path": "tools/metrics.py",
    "content": "#!/usr/bin/env python3\n\"\"\"Calculate average sizes from bloaty CSV or TinyUSB metrics JSON outputs.\"\"\"\n\nimport argparse\nimport csv\nimport glob\nimport io\nimport json\nimport os\nimport sys\nfrom collections import defaultdict\n\n\ndef expand_files(file_patterns):\n    \"\"\"Expand file patterns (globs) to list of files.\n\n    Args:\n        file_patterns: List of file paths or glob patterns\n\n    Returns:\n        List of expanded file paths\n    \"\"\"\n    expanded = []\n    for pattern in file_patterns:\n        if '*' in pattern or '?' in pattern:\n            expanded.extend(glob.glob(pattern))\n        else:\n            expanded.append(pattern)\n    return expanded\n\n\ndef parse_bloaty_csv(csv_text, filters=None):\n    \"\"\"Parse bloaty CSV text and return normalized JSON data structure.\"\"\"\n\n    filters = filters or []\n    reader = csv.DictReader(io.StringIO(csv_text))\n    size_by_unit = defaultdict(int)\n    symbols_by_unit: dict[str, defaultdict[str, int]] = defaultdict(lambda: defaultdict(int))\n    sections_by_unit: dict[str, defaultdict[str, int]] = defaultdict(lambda: defaultdict(int))\n\n    for row in reader:\n        compile_unit = row.get(\"compileunits\") or row.get(\"compileunit\") or row.get(\"path\")\n        if compile_unit is None:\n            continue\n\n        if str(compile_unit).upper() == \"TOTAL\":\n            continue\n\n        if filters and not any(filt in compile_unit for filt in filters):\n            continue\n\n        try:\n            vmsize = int(row.get(\"vmsize\", 0))\n        except ValueError:\n            continue\n\n        size_by_unit[compile_unit] += vmsize\n        symbol_name = row.get(\"symbols\", \"\")\n        if symbol_name:\n            symbols_by_unit[compile_unit][symbol_name] += vmsize\n        section_name = row.get(\"sections\") or row.get(\"section\")\n        if section_name and vmsize:\n            sections_by_unit[compile_unit][section_name] += vmsize\n\n    files = []\n    for unit_path, total_size in size_by_unit.items():\n        symbols = [\n            {\"name\": sym, \"size\": sz}\n            for sym, sz in sorted(symbols_by_unit[unit_path].items(), key=lambda x: x[1], reverse=True)\n        ]\n        sections = {sec: sz for sec, sz in sections_by_unit[unit_path].items() if sz}\n        files.append(\n            {\n                \"file\": os.path.basename(unit_path) or unit_path,\n                \"path\": unit_path,\n                \"size\": total_size,\n                \"symbols\": symbols,\n                \"sections\": sections,\n            }\n        )\n\n    total_all = sum(size_by_unit.values())\n    return {\"files\": files, \"TOTAL\": total_all}\n\n\ndef combine_files(input_files, filters=None):\n    \"\"\"Combine multiple metrics inputs (bloaty CSV or metrics JSON) into a single data set.\"\"\"\n\n    filters = filters or []\n    all_json_data = {\"file_list\": [], \"data\": []}\n\n    for fin in input_files:\n        if not os.path.exists(fin):\n            print(f\"Warning: {fin} not found, skipping\", file=sys.stderr)\n            continue\n\n        try:\n            if fin.endswith(\".json\"):\n                with open(fin, \"r\", encoding=\"utf-8\") as f:\n                    json_data = json.load(f)\n                if filters:\n                    json_data[\"files\"] = [\n                        f\n                        for f in json_data.get(\"files\", [])\n                        if f.get(\"path\") and any(filt in f[\"path\"] for filt in filters)\n                    ]\n            elif fin.endswith(\".csv\"):\n                with open(fin, \"r\", encoding=\"utf-8\") as f:\n                    csv_text = f.read()\n                json_data = parse_bloaty_csv(csv_text, filters)\n            else:\n                if fin.endswith(\".elf\"):\n                    print(f\"Warning: {fin} is an ELF; please run bloaty with --csv output first. Skipping.\",\n                          file=sys.stderr)\n                else:\n                    print(f\"Warning: {fin} is not a supported CSV or JSON metrics input. Skipping.\",\n                          file=sys.stderr)\n                continue\n\n            # Drop any fake TOTAL entries that slipped in as files\n            json_data[\"files\"] = [\n                f for f in json_data.get(\"files\", [])\n                if str(f.get(\"file\", \"\")).upper() != \"TOTAL\"\n            ]\n\n            all_json_data[\"file_list\"].append(fin)\n            all_json_data[\"data\"].append(json_data)\n        except Exception as e:  # pragma: no cover - defensive\n            print(f\"Warning: Failed to analyze {fin}: {e}\", file=sys.stderr)\n            continue\n\n    return all_json_data\n\n\ndef compute_avg(all_json_data):\n    \"\"\"Compute average sizes from combined json_data.\n\n    Args:\n        all_json_data: Dictionary with file_list and data from combine_files()\n\n    Returns:\n        json_average: Dictionary with averaged size data\n    \"\"\"\n    if not all_json_data[\"data\"]:\n        return None\n\n    # Merge files with the same 'file' value and compute averages\n    file_accumulator = {}  # key: file name, value: {\"sizes\": [sizes], \"symbols\": {name: [sizes]}, \"sections\": {name: [sizes]}}\n\n    for json_data in all_json_data[\"data\"]:\n        for f in json_data.get(\"files\", []):\n            fname = f[\"file\"]\n            if fname not in file_accumulator:\n                file_accumulator[fname] = {\n                    \"sizes\": [],\n                    \"path\": f.get(\"path\"),\n                    \"symbols\": defaultdict(list),\n                    \"sections\": defaultdict(list),\n                }\n            size_val = f.get(\"size\", 0)\n            file_accumulator[fname][\"sizes\"].append(size_val)\n            for sym in f.get(\"symbols\", []):\n                name = sym.get(\"name\")\n                if name is None:\n                    continue\n                file_accumulator[fname][\"symbols\"][name].append(sym.get(\"size\", 0))\n            sections_map = f.get(\"sections\") or {}\n            for sname, ssize in sections_map.items():\n                file_accumulator[fname][\"sections\"][sname].append(ssize)\n\n    # Build json_average with averaged values\n    files_average = []\n    for fname, data in file_accumulator.items():\n        avg_size = round(sum(data[\"sizes\"]) / len(data[\"sizes\"])) if data[\"sizes\"] else 0\n        symbols_avg = []\n        for sym_name, sizes in data[\"symbols\"].items():\n            if not sizes:\n                continue\n            symbols_avg.append({\"name\": sym_name, \"size\": round(sum(sizes) / len(sizes))})\n        symbols_avg.sort(key=lambda x: x[\"size\"], reverse=True)\n        sections_avg = {\n            sec_name: round(sum(sizes) / len(sizes))\n            for sec_name, sizes in data[\"sections\"].items()\n            if sizes\n        }\n        files_average.append(\n            {\n                \"file\": fname,\n                \"path\": data[\"path\"],\n                \"size\": avg_size,\n                \"symbols\": symbols_avg,\n                \"sections\": sections_avg,\n            }\n        )\n\n    total_size = sum(f[\"size\"] for f in files_average) or 1\n\n    for f in files_average:\n        f[\"percent\"] = (f[\"size\"] / total_size) * 100 if total_size else 0\n        for sym in f[\"symbols\"]:\n            sym[\"percent\"] = (sym[\"size\"] / f[\"size\"]) * 100 if f[\"size\"] else 0\n\n    json_average = {\n        \"file_list\": all_json_data[\"file_list\"],\n        \"files\": files_average,\n    }\n\n    return json_average\n\n\ndef compare_files(base_file, new_file, filters=None):\n    \"\"\"Compare two CSV or JSON inputs and generate difference report.\"\"\"\n    filters = filters or []\n\n    base_avg = compute_avg(combine_files([base_file], filters))\n    new_avg = compute_avg(combine_files([new_file], filters))\n\n    if not base_avg or not new_avg:\n        return None\n\n    base_files = {f[\"file\"]: f for f in base_avg[\"files\"]}\n    new_files = {f[\"file\"]: f for f in new_avg[\"files\"]}\n    all_file_names = set(base_files.keys()) | set(new_files.keys())\n\n    comparison_files = []\n    for fname in sorted(all_file_names):\n        b = base_files.get(fname, {})\n        n = new_files.get(fname, {})\n        b_size = b.get(\"size\", 0)\n        n_size = n.get(\"size\", 0)\n        base_sections = b.get(\"sections\") or {}\n        new_sections = n.get(\"sections\") or {}\n\n        # Symbol diffs\n        b_syms = {s[\"name\"]: s for s in b.get(\"symbols\", [])}\n        n_syms = {s[\"name\"]: s for s in n.get(\"symbols\", [])}\n        all_syms = set(b_syms.keys()) | set(n_syms.keys())\n        symbols = []\n        for sym in all_syms:\n            sb = b_syms.get(sym, {}).get(\"size\", 0)\n            sn = n_syms.get(sym, {}).get(\"size\", 0)\n            symbols.append({\"name\": sym, \"base\": sb, \"new\": sn, \"diff\": sn - sb})\n        symbols.sort(key=lambda x: abs(x[\"diff\"]), reverse=True)\n\n        comparison_files.append({\n            \"file\": fname,\n            \"size\": {\"base\": b_size, \"new\": n_size, \"diff\": n_size - b_size},\n            \"symbols\": symbols,\n            \"sections\": {\n                name: {\n                    \"base\": base_sections.get(name, 0),\n                    \"new\": new_sections.get(name, 0),\n                    \"diff\": new_sections.get(name, 0) - base_sections.get(name, 0),\n                }\n                for name in sorted(set(base_sections) | set(new_sections))\n            },\n        })\n\n    base_total = sum(f[\"size\"] for f in base_avg[\"files\"])\n    new_total = sum(f[\"size\"] for f in new_avg[\"files\"])\n    total = {\n        \"base\": base_total,\n        \"new\": new_total,\n        \"diff\": new_total - base_total,\n    }\n\n    return {\n        \"base_file\": base_file,\n        \"new_file\": new_file,\n        \"total\": total,\n        \"files\": comparison_files,\n    }\n\n\ndef get_sort_key(sort_order):\n    \"\"\"Get sort key function based on sort order.\n\n    Args:\n        sort_order: One of 'size-', 'size+', 'name-', 'name+'\n\n    Returns:\n        Tuple of (key_func, reverse)\n    \"\"\"\n\n    def _size_val(entry):\n        return entry.get('size', 0)\n\n    if sort_order == 'size-':\n        return _size_val, True\n    elif sort_order == 'size+':\n        return _size_val, False\n    elif sort_order == 'name-':\n        return lambda x: x.get('file', ''), True\n    else:  # name+\n        return lambda x: x.get('file', ''), False\n\n\ndef format_diff(base, new, diff):\n    \"\"\"Format a diff value with percentage.\"\"\"\n    if diff == 0:\n        return f\"{new}\"\n    if base == 0 or new == 0:\n        return f\"{base} ➙ {new}\"\n    pct = (diff / base) * 100\n    sign = \"+\" if diff > 0 else \"\"\n    return f\"{base} ➙ {new} ({sign}{diff}, {sign}{pct:.1f}%)\"\n\n\ndef write_json_output(json_data, path):\n    \"\"\"Write JSON output with indentation.\"\"\"\n\n    with open(path, \"w\", encoding=\"utf-8\") as outf:\n        json.dump(json_data, outf, indent=2)\n\n\ndef render_combine_table(json_data, sort_order='name+'):\n    \"\"\"Render averaged sizes as markdown table lines (no title).\"\"\"\n    files = json_data.get(\"files\", [])\n    if not files:\n        return [\"No entries.\"]\n\n    key_func, reverse = get_sort_key(sort_order)\n    files_sorted = sorted(files, key=key_func, reverse=reverse)\n\n    total_size = json_data.get(\"TOTAL\") or sum(f.get(\"size\", 0) for f in files_sorted)\n\n    pct_strings = [\n        f\"{(f.get('percent') if f.get('percent') is not None else (f.get('size', 0) / total_size * 100 if total_size else 0)):.1f}%\"\n        for f in files_sorted]\n    pct_width = 6\n    size_width = max(len(\"size\"), *(len(str(f.get(\"size\", 0))) for f in files_sorted), len(str(total_size)))\n    file_width = max(len(\"File\"), *(len(f.get(\"file\", \"\")) for f in files_sorted), len(\"TOTAL\"))\n\n    # Build section totals on the fly from file data\n    sections_global = defaultdict(int)\n    for f in files_sorted:\n        for name, size in (f.get(\"sections\") or {}).items():\n            sections_global[name] += size\n    # Display sections in reverse alphabetical order for stable column layout\n    section_names = sorted(sections_global.keys(), reverse=True)\n    section_widths = {}\n    for name in section_names:\n        max_val = max((f.get(\"sections\", {}).get(name, 0) for f in files_sorted), default=0)\n        section_widths[name] = max(len(name), len(str(max_val)), 1)\n\n    if not section_names:\n        header = f\"| {'File':<{file_width}} | {'size':>{size_width}} | {'%':>{pct_width}} |\"\n        separator = f\"| :{'-' * (file_width - 1)} | {'-' * (size_width - 1)}: | {'-' * (pct_width - 1)}: |\"\n    else:\n        header_parts = [f\"| {'File':<{file_width}} |\"]\n        sep_parts = [f\"| :{'-' * (file_width - 1)} |\"]\n        for name in section_names:\n            header_parts.append(f\" {name:>{section_widths[name]}} |\")\n            sep_parts.append(f\" {'-' * (section_widths[name] - 1)}: |\")\n        header_parts.append(f\" {'size':>{size_width}} | {'%':>{pct_width}} |\")\n        sep_parts.append(f\" {'-' * (size_width - 1)}: | {'-' * (pct_width - 1)}: |\")\n        header = \"\".join(header_parts)\n        separator = \"\".join(sep_parts)\n\n    lines = [header, separator]\n\n    for f, pct_str in zip(files_sorted, pct_strings):\n        size_val = f.get(\"size\", 0)\n        parts = [f\"| {f.get('file', ''):<{file_width}} |\"]\n        if section_names:\n            sections_map = f.get(\"sections\") or {}\n            for name in section_names:\n                parts.append(f\" {sections_map.get(name, 0):>{section_widths[name]}} |\")\n        parts.append(f\" {size_val:>{size_width}} | {pct_str:>{pct_width}} |\")\n        lines.append(\"\".join(parts))\n\n    total_parts = [f\"| {'TOTAL':<{file_width}} |\"]\n    if section_names:\n        for name in section_names:\n            total_parts.append(f\" {sections_global.get(name, 0):>{section_widths[name]}} |\")\n    total_parts.append(f\" {total_size:>{size_width}} | {'100.0%':>{pct_width}} |\")\n    lines.append(\"\".join(total_parts))\n    return lines\n\n\ndef write_combine_markdown(json_data, path, sort_order='name+', title=\"TinyUSB Average Code Size Metrics\"):\n    \"\"\"Write averaged size data to a markdown file.\"\"\"\n\n    md_lines = [f\"# {title}\", \"\"]\n    md_lines.extend(render_combine_table(json_data, sort_order))\n    md_lines.append(\"\")\n\n    if json_data.get(\"file_list\"):\n        md_lines.extend([\"<details>\", \"<summary>Input files</summary>\", \"\"])\n        md_lines.extend([f\"- {mf}\" for mf in json_data[\"file_list\"]])\n        md_lines.extend([\"\", \"</details>\", \"\"])\n\n    with open(path, \"w\", encoding=\"utf-8\") as f:\n        f.write(\"\\n\".join(md_lines))\n\n\ndef write_compare_markdown(comparison, path, sort_order='size'):\n    \"\"\"Write comparison data to markdown file.\"\"\"\n    md_lines = [\n        \"# Size Difference Report\",\n        \"\",\n        \"Because TinyUSB code size varies by port and configuration, the metrics below represent the averaged totals across all example builds.\",\n        \"\",\n        \"Note: If there is no change, only one value is shown.\",\n        \"\",\n    ]\n\n    significant, minor, unchanged = _split_by_significance(comparison[\"files\"], sort_order)\n\n    def render(title, rows, collapsed=False):\n        if collapsed:\n            md_lines.append(f\"<details><summary>{title}</summary>\")\n            md_lines.append(\"\")\n        else:\n            md_lines.append(f\"## {title}\")\n\n        md_lines.extend(render_compare_table(_build_rows(rows, sort_order), include_sum=True))\n        md_lines.append(\"\")\n\n        if collapsed:\n            md_lines.append(\"</details>\")\n            md_lines.append(\"\")\n\n    render(\"Changes >1% in size\", significant)\n    render(\"Changes <1% in size\", minor)\n    render(\"No changes\", unchanged, collapsed=True)\n\n    with open(path, \"w\", encoding=\"utf-8\") as f:\n        f.write(\"\\n\".join(md_lines))\n\n\ndef print_compare_summary(comparison, sort_order='name+'):\n    \"\"\"Print diff report to stdout in table form.\"\"\"\n\n    files = comparison[\"files\"]\n\n    rows = _build_rows(files, sort_order)\n    lines = render_compare_table(rows, include_sum=True)\n    for line in lines:\n        print(line)\n\n\ndef _build_rows(files, sort_order):\n    \"\"\"Sort files and prepare printable fields.\"\"\"\n\n    def sort_key(file_row):\n        if sort_order == 'size-':\n            return abs(file_row[\"size\"][\"diff\"])\n        if sort_order in ('size', 'size+'):\n            return abs(file_row[\"size\"][\"diff\"])\n        if sort_order == 'name-':\n            return file_row['file']\n        return file_row['file']\n\n    reverse = sort_order in ('size-', 'name-')\n    files_sorted = sorted(files, key=sort_key, reverse=reverse)\n\n    rows = []\n    for f in files_sorted:\n        sd = f[\"size\"]\n        diff_val = sd['new'] - sd['base']\n        if sd['base'] == 0:\n            pct_str = \"n/a\"\n        else:\n            pct_val = (diff_val / sd['base']) * 100\n            pct_str = f\"{pct_val:+.1f}%\"\n        rows.append({\n            \"file\": f['file'],\n            \"base\": sd['base'],\n            \"new\": sd['new'],\n            \"diff\": diff_val,\n            \"pct\": pct_str,\n            \"sections\": f.get(\"sections\", {}),\n        })\n    return rows\n\n\ndef _split_by_significance(files, sort_order):\n    \"\"\"Split files into >1% changes, <1% changes, and no changes.\"\"\"\n\n    def is_significant(file_row):\n        base = file_row[\"size\"][\"base\"]\n        diff = abs(file_row[\"size\"][\"diff\"])\n        if base == 0:\n            return diff != 0\n        return (diff / base) * 100 > 1.0\n\n    rows_sorted = sorted(\n        files,\n        key=lambda f: abs(f[\"size\"][\"diff\"]) if sort_order.startswith(\"size\") else f[\"file\"],\n        reverse=sort_order in ('size-', 'name-'),\n    )\n\n    significant = []\n    minor = []\n    unchanged = []\n    for f in rows_sorted:\n        if f[\"size\"][\"diff\"] == 0:\n            unchanged.append(f)\n        else:\n            (significant if is_significant(f) else minor).append(f)\n\n    return significant, minor, unchanged\n\n\ndef render_compare_table(rows, include_sum):\n    \"\"\"Return markdown table lines for given rows.\"\"\"\n    if not rows:\n        return [\"No entries.\", \"\"]\n\n    # collect section columns (reverse alpha)\n    section_names = sorted(\n        {name for r in rows for name in (r.get(\"sections\") or {})},\n        reverse=True,\n    )\n\n    def fmt_abs(val_old, val_new):\n        diff = val_new - val_old\n        if diff == 0:\n            return f\"{val_new}\"\n        sign = \"+\" if diff > 0 else \"\"\n        return f\"{val_old} ➙ {val_new} ({sign}{diff})\"\n\n    sum_base = sum(r[\"base\"] for r in rows)\n    sum_new = sum(r[\"new\"] for r in rows)\n    total_diff = sum_new - sum_base\n    total_pct = \"n/a\" if sum_base == 0 else f\"{(total_diff / sum_base) * 100:+.1f}%\"\n\n    file_width = max(len(\"file\"), *(len(r[\"file\"]) for r in rows), len(\"TOTAL\"))\n    size_width = max(\n        len(\"size\"),\n        *(len(fmt_abs(r[\"base\"], r[\"new\"])) for r in rows),\n        len(fmt_abs(sum_base, sum_new)),\n    )\n    pct_width = max(len(\"% diff\"), *(len(r[\"pct\"]) for r in rows), len(total_pct))\n    section_widths = {}\n    for name in section_names:\n        max_val_len = 0\n        for r in rows:\n            sec_entry = (r.get(\"sections\") or {}).get(name, {\"base\": 0, \"new\": 0})\n            max_val_len = max(max_val_len, len(fmt_abs(sec_entry.get(\"base\", 0), sec_entry.get(\"new\", 0))))\n        section_widths[name] = max(len(name), max_val_len, 1)\n\n    header_parts = [f\"| {'file':<{file_width}} |\"]\n    sep_parts = [f\"| :{'-' * (file_width - 1)} |\"]\n    for name in section_names:\n        header_parts.append(f\" {name:>{section_widths[name]}} |\")\n        sep_parts.append(f\" {'-' * (section_widths[name] - 1)}: |\")\n    header_parts.append(f\" {'size':>{size_width}} | {'% diff':>{pct_width}} |\")\n    sep_parts.append(f\" {'-' * (size_width - 1)}: | {'-' * (pct_width - 1)}: |\")\n    header = \"\".join(header_parts)\n    separator = \"\".join(sep_parts)\n\n    lines = [header, separator]\n\n    for r in rows:\n        parts = [f\"| {r['file']:<{file_width}} |\"]\n        sections_map = r.get(\"sections\") or {}\n        for name in section_names:\n            sec_entry = sections_map.get(name, {\"base\": 0, \"new\": 0})\n            parts.append(f\" {fmt_abs(sec_entry.get('base', 0), sec_entry.get('new', 0)):>{section_widths[name]}} |\")\n        parts.append(f\" {fmt_abs(r['base'], r['new']):>{size_width}} | {r['pct']:>{pct_width}} |\")\n        lines.append(\"\".join(parts))\n\n    if include_sum:\n        total_parts = [f\"| {'TOTAL':<{file_width}} |\"]\n        for name in section_names:\n            total_base = sum((r.get(\"sections\") or {}).get(name, {}).get(\"base\", 0) for r in rows)\n            total_new = sum((r.get(\"sections\") or {}).get(name, {}).get(\"new\", 0) for r in rows)\n            total_parts.append(f\" {fmt_abs(total_base, total_new):>{section_widths[name]}} |\")\n        total_parts.append(f\" {fmt_abs(sum_base, sum_new):>{size_width}} | {total_pct:>{pct_width}} |\")\n        lines.append(\"\".join(total_parts))\n    return lines\n\n\ndef cmd_combine(args):\n    \"\"\"Handle combine subcommand.\"\"\"\n    input_files = expand_files(args.files)\n    all_json_data = combine_files(input_files, args.filters)\n    json_average = compute_avg(all_json_data)\n\n    if json_average is None:\n        print(\"No valid map files found\", file=sys.stderr)\n        sys.exit(1)\n\n    if not args.quiet:\n        for line in render_combine_table(json_average, sort_order=args.sort):\n            print(line)\n    if args.json_out:\n        write_json_output(json_average, args.out + '.json')\n    if args.markdown_out:\n        write_combine_markdown(json_average, args.out + '.md', sort_order=args.sort,\n                               title=\"TinyUSB Average Code Size Metrics\")\n\n\ndef cmd_compare(args):\n    \"\"\"Handle compare subcommand.\"\"\"\n    comparison = compare_files(args.base, args.new, args.filters)\n\n    if comparison is None:\n        print(\"Failed to compare files\", file=sys.stderr)\n        sys.exit(1)\n\n    if not args.quiet:\n        print_compare_summary(comparison, args.sort)\n    if args.markdown_out:\n        write_compare_markdown(comparison, args.out + '.md', args.sort)\n        if not args.quiet:\n            print(f\"Comparison written to {args.out}.md\")\n\n\ndef main(argv=None):\n    parser = argparse.ArgumentParser(description='Code size metrics tool')\n    subparsers = parser.add_subparsers(dest='command', required=True, help='Available commands')\n\n    # Combine subcommand\n    combine_parser = subparsers.add_parser('combine', help='Combine and average bloaty CSV outputs or metrics JSON files')\n    combine_parser.add_argument('files', nargs='+',\n                                help='Path to bloaty CSV output or TinyUSB metrics JSON file(s) (including linkermap-generated) or glob pattern(s)')\n    combine_parser.add_argument('-f', '--filter', dest='filters', action='append', default=[],\n                                help='Only include compile units whose path contains this substring (can be repeated)')\n    combine_parser.add_argument('-o', '--out', dest='out', default='metrics',\n                                help='Output path basename for JSON and Markdown files (default: metrics)')\n    combine_parser.add_argument('-j', '--json', dest='json_out', action='store_true',\n                                help='Write JSON output file')\n    combine_parser.add_argument('-m', '--markdown', dest='markdown_out', action='store_true',\n                                help='Write Markdown output file')\n    combine_parser.add_argument('-q', '--quiet', dest='quiet', action='store_true',\n                                help='Suppress summary output')\n    combine_parser.add_argument('-S', '--sort', dest='sort', default='size-',\n                                choices=['size', 'size-', 'size+', 'name', 'name-', 'name+'],\n                                help='Sort order: size/size- (descending), size+ (ascending), name/name+ (ascending), name- (descending). Default: size-')\n\n    # Compare subcommand\n    compare_parser = subparsers.add_parser('compare', help='Compare two metrics inputs (bloaty CSV or metrics JSON)')\n    compare_parser.add_argument('base', help='Base CSV/metrics JSON file')\n    compare_parser.add_argument('new', help='New CSV/metrics JSON file')\n    compare_parser.add_argument('-f', '--filter', dest='filters', action='append', default=[],\n                                help='Only include compile units whose path contains this substring (can be repeated)')\n    compare_parser.add_argument('-o', '--out', dest='out', default='metrics_compare',\n                                help='Output path basename for Markdown/JSON files (default: metrics_compare)')\n    compare_parser.add_argument('-m', '--markdown', dest='markdown_out', action='store_true',\n                                help='Write Markdown output file')\n    compare_parser.add_argument('-S', '--sort', dest='sort', default='name+',\n                                choices=['size', 'size-', 'size+', 'name', 'name-', 'name+'],\n                                help='Sort order: size/size- (descending), size+ (ascending), name/name+ (ascending), name- (descending). Default: name+')\n    compare_parser.add_argument('-q', '--quiet', dest='quiet', action='store_true',\n                                help='Suppress stdout summary output')\n\n    args = parser.parse_args(argv)\n\n    if args.command == 'combine':\n        cmd_combine(args)\n    elif args.command == 'compare':\n        cmd_compare(args)\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "tools/mksunxi.py",
    "content": "#!/usr/bin/env python3\nimport sys\nimport struct\n\ndef align(num, alignment):\n    if num % alignment != 0:\n        num += (alignment - num % alignment)\n    return num\n\n\ndef process_file(input, output):\n    with open(input, 'rb') as fin:\n        content = bytearray(fin.read())\n\n    align_value = 512\n    padded_length = align(len(content), align_value)\n    # pad file to actual length\n    content += b'\\x00' * (padded_length - len(content))\n\n    struct_format = '<L8sLL'\n    (instruction, magic, checksum, length) = struct.unpack_from(struct_format, content)\n\n    if magic != b'eGON.BT0':\n        print(\"Magic is invalid:\", magic)\n        return 2\n\n    checksum = 0x5F0A6C39\n    length = align(length, align_value)\n\n    struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)\n\n    checksum = 0\n    for i in range(0, length, 4):\n        (n, ) = struct.unpack_from('<L', content, i)\n        checksum += n\n        checksum %= 4294967296\n\n    struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length)\n\n    with open(output, 'wb') as fout:\n        fout.write(content)\n    return 0\n\nif __name__ == \"__main__\":\n    if len(sys.argv) != 3:\n        print(\"Usage: mksunxi.py input.bin output.bin\")\n        exit(1)\n    exit(process_file(sys.argv[1], sys.argv[2]))\n"
  },
  {
    "path": "tools/pcapng_to_corpus.py",
    "content": "#!/usr/bin/env python3\nimport argparse\nimport pcapng\nimport zipfile\nimport hashlib\n\ndef extract_packets(pcap_file):\n    \"\"\"Reads a wireshark packet capture and extracts the binary packets\"\"\"\n    packets = []\n    with open(pcap_file, 'rb') as fp:\n        scanner = pcapng.FileScanner(fp)\n        for block in scanner:\n            if isinstance(block, pcapng.blocks.EnhancedPacket):\n                packets.append(block.packet_data)\n    return packets\n\ndef build_corpus_zip(zip_file_output, packets):\n    \"\"\"Builds a zip file with a file per packet\n\n    The structure of this zip corpus is a simple content addressable storage\n    i.e. seed_file_name == sha256_digest(packet).\n    \"\"\"\n    with zipfile.ZipFile(zip_file_output, 'a') as out:\n        for packet in packets:\n            hash = hashlib.sha256(packet).hexdigest()\n            if hash not in out.namelist():\n                out.writestr(hash, packet)\n\n\ndef main(pcap_file, output_zip_file):\n    packets = extract_packets(pcap_file)\n    build_corpus_zip(output_zip_file, packets)\n\nif __name__ == \"__main__\":\n    parser = argparse.ArgumentParser(\n        prog = \"pcapng_to_corpus.py\",\n        description=\"\"\"Converts a wireshark capture to a zip of binary packet\n                    files suitable for an oss-fuzz corpus. In the case the\n                    zip corpus already exists, this script will modify\n                    the zip file in place adding seed entries.\"\"\")\n    parser.add_argument('pcapng_capture_file')\n    parser.add_argument('oss_fuzz_corpus_zip')\n    args = parser.parse_args()\n    main(args.pcapng_capture_file, args.oss_fuzz_corpus_zip)\n"
  },
  {
    "path": "tools/usb_drivers/tinyusb_win_usbser.inf",
    "content": ";************************************************************\n; Windows USB CDC ACM Setup File\n; Copyright (c) 2000 Microsoft Corporation\n\n\n[Version]\nSignature=\"$Windows NT$\"\nClass=Ports\nClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}\nProvider=%MFGNAME%\nLayoutFile=layout.inf\nCatalogFile=%MFGFILENAME%.cat\nDriverVer=11/15/2007,5.1.2600.0\nDriverPackageDisplayName=%DESCRIPTION%\n\n[Manufacturer]\n%MFGNAME%=DeviceList, NTamd64\n\n[DestinationDirs]\nDefaultDestDir=12\n\n\n;------------------------------------------------------------------------------\n;  Windows 2000/XP/Vista-32bit Sections\n;------------------------------------------------------------------------------\n\n[DriverInstall.nt]\ninclude=mdmcpq.inf\nCopyFiles=DriverCopyFiles.nt\nAddReg=DriverInstall.nt.AddReg\n\n[DriverCopyFiles.nt]\nusbser.sys,,,0x20\n\n[DriverInstall.nt.AddReg]\nHKR,,DevLoader,,*ntkern\nHKR,,NTMPDriver,,%DRIVERFILENAME%.sys\nHKR,,EnumPropPages32,,\"MsPorts.dll,SerialPortPropPageProvider\"\n\n[DriverInstall.nt.Services]\nAddService=usbser, 0x00000002, DriverService.nt\n\n[DriverService.nt]\nDisplayName=%SERVICE%\nServiceType=1\nStartType=3\nErrorControl=1\nServiceBinary=%12%\\%DRIVERFILENAME%.sys\n\n;------------------------------------------------------------------------------\n;  Vista-64bit Sections\n;------------------------------------------------------------------------------\n\n[DriverInstall.NTamd64]\ninclude=mdmcpq.inf\nCopyFiles=DriverCopyFiles.NTamd64\nAddReg=DriverInstall.NTamd64.AddReg\n\n[DriverCopyFiles.NTamd64]\n%DRIVERFILENAME%.sys,,,0x20\n\n[DriverInstall.NTamd64.AddReg]\nHKR,,DevLoader,,*ntkern\nHKR,,NTMPDriver,,%DRIVERFILENAME%.sys\nHKR,,EnumPropPages32,,\"MsPorts.dll,SerialPortPropPageProvider\"\n\n[DriverInstall.NTamd64.Services]\nAddService=usbser, 0x00000002, DriverService.NTamd64\n\n[DriverService.NTamd64]\nDisplayName=%SERVICE%\nServiceType=1\nStartType=3\nErrorControl=1\nServiceBinary=%12%\\%DRIVERFILENAME%.sys\n\n\n;------------------------------------------------------------------------------\n;  Vendor and Product ID Definitions\n;------------------------------------------------------------------------------\n; When developing your USB device, the VID and PID used in the PC side\n; application program and the firmware on the microcontroller must match.\n; Modify the below line to use your VID and PID.  Use the format as shown below.\n; Note: One INF file can be used for multiple devices with different VID and PIDs.\n; For each supported device, append \",USB\\VID_xxxx&PID_yyyy\" to the end of the line.\n;------------------------------------------------------------------------------\n[SourceDisksFiles]\n[SourceDisksNames]\n[DeviceList]\n\n%DESCRIPTION%=DriverInstall, USB\\VID_CAFE&PID_4001&MI_00, USB\\VID_CAFE&PID_4003&MI_00, USB\\VID_CAFE&PID_4005&MI_00, USB\\VID_CAFE&PID_4007&MI_00, USB\\VID_CAFE&PID_4009&MI_00, USB\\VID_CAFE&PID_400b&MI_00, USB\\VID_CAFE&PID_400d&MI_00, USB\\VID_CAFE&PID_400f&MI_00, USB\\VID_CAFE&PID_4011&MI_00, USB\\VID_CAFE&PID_4013&MI_00, USB\\VID_CAFE&PID_4015&MI_00, USB\\VID_CAFE&PID_4017&MI_00, USB\\VID_CAFE&PID_4019&MI_00, USB\\VID_CAFE&PID_401b&MI_00, USB\\VID_CAFE&PID_401d&MI_00, USB\\VID_CAFE&PID_401f&MI_00, USB\\VID_CAFE&PID_4021&MI_00, USB\\VID_CAFE&PID_4023&MI_00, USB\\VID_CAFE&PID_4025&MI_00, USB\\VID_CAFE&PID_4027&MI_00, USB\\VID_CAFE&PID_4029&MI_00, USB\\VID_CAFE&PID_402b&MI_00, USB\\VID_CAFE&PID_402d&MI_00, USB\\VID_CAFE&PID_402f&MI_00, USB\\VID_CAFE&PID_4031&MI_00, USB\\VID_CAFE&PID_4033&MI_00, USB\\VID_CAFE&PID_4035&MI_00, USB\\VID_CAFE&PID_4037&MI_00, USB\\VID_CAFE&PID_4039&MI_00, USB\\VID_CAFE&PID_403b&MI_00, USB\\VID_CAFE&PID_403d&MI_00, USB\\VID_CAFE&PID_403f&MI_00\n\n\n[DeviceList.NTamd64]\n%DESCRIPTION%=DriverInstall, USB\\VID_CAFE&PID_4001&MI_00, USB\\VID_CAFE&PID_4003&MI_00, USB\\VID_CAFE&PID_4005&MI_00, USB\\VID_CAFE&PID_4007&MI_00, USB\\VID_CAFE&PID_4009&MI_00, USB\\VID_CAFE&PID_400b&MI_00, USB\\VID_CAFE&PID_400d&MI_00, USB\\VID_CAFE&PID_400f&MI_00, USB\\VID_CAFE&PID_4011&MI_00, USB\\VID_CAFE&PID_4013&MI_00, USB\\VID_CAFE&PID_4015&MI_00, USB\\VID_CAFE&PID_4017&MI_00, USB\\VID_CAFE&PID_4019&MI_00, USB\\VID_CAFE&PID_401b&MI_00, USB\\VID_CAFE&PID_401d&MI_00, USB\\VID_CAFE&PID_401f&MI_00, USB\\VID_CAFE&PID_4021&MI_00, USB\\VID_CAFE&PID_4023&MI_00, USB\\VID_CAFE&PID_4025&MI_00, USB\\VID_CAFE&PID_4027&MI_00, USB\\VID_CAFE&PID_4029&MI_00, USB\\VID_CAFE&PID_402b&MI_00, USB\\VID_CAFE&PID_402d&MI_00, USB\\VID_CAFE&PID_402f&MI_00, USB\\VID_CAFE&PID_4031&MI_00, USB\\VID_CAFE&PID_4033&MI_00, USB\\VID_CAFE&PID_4035&MI_00, USB\\VID_CAFE&PID_4037&MI_00, USB\\VID_CAFE&PID_4039&MI_00, USB\\VID_CAFE&PID_403b&MI_00, USB\\VID_CAFE&PID_403d&MI_00, USB\\VID_CAFE&PID_403f&MI_00\n\n;------------------------------------------------------------------------------\n;  String Definitions\n;------------------------------------------------------------------------------\n;Modify these strings to customize your device\n;------------------------------------------------------------------------------\n[Strings]\nMFGFILENAME=\"tinyusb_usbser\"\nDRIVERFILENAME =\"usbser\"\nMFGNAME=\"tinyusb.org\"\nINSTDISK=\"tinyusb CDC Driver\"\nDESCRIPTION=\"tinyusb Serial\"\nSERVICE=\"USB RS-232 Emulation Driver\"\n"
  },
  {
    "path": "version.yml",
    "content": "# Newt uses this file to determine the version of a checked out repo.\n# This should always be 0.0.0 in the master branch.\nrepo.version: 0.0.0\n"
  }
]